diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 0000000000..cdda6b42a8 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,742 @@ +{ + "projectName": "snipe-it", + "projectOwner": "snipe", + "files": [ + "README.md" + ], + "imageSize": 110, + "commit": true, + "contributors": [ + { + "login": "snipe", + "name": "snipe", + "avatar_url": "https://avatars3.githubusercontent.com/u/197404?v=3", + "profile": "http://www.snipe.net", + "contributions": [ + "code", + "infra", + "doc", + "test", + "bug", + "design", + "review" + ] + }, + { + "login": "uberbrady", + "name": "Brady Wetherington", + "avatar_url": "https://avatars0.githubusercontent.com/u/36335?v=3", + "profile": "http://www.uberbrady.com", + "contributions": [ + "code", + "doc", + "infra", + "review" + ] + }, + { + "login": "dmeltzer", + "name": "Daniel Meltzer", + "avatar_url": "https://avatars0.githubusercontent.com/u/3803132?v=3", + "profile": "https://github.com/dmeltzer", + "contributions": [ + "code", + "test", + "doc" + ] + }, + { + "login": "mtucker6784", + "name": "Michael T", + "avatar_url": "https://avatars0.githubusercontent.com/u/1609106?v=3", + "profile": "http://www.tuckertechonline.com", + "contributions": [ + "code" + ] + }, + { + "login": "madd15", + "name": "madd15", + "avatar_url": "https://avatars2.githubusercontent.com/u/3274937?v=3", + "profile": "https://github.com/madd15", + "contributions": [ + "doc", + "question" + ] + }, + { + "login": "vsposato", + "name": "Vincent Sposato", + "avatar_url": "https://avatars2.githubusercontent.com/u/894126?v=3", + "profile": "https://github.com/vsposato", + "contributions": [ + "code" + ] + }, + { + "login": "vjandrea", + "name": "Andrea Bergamasco", + "avatar_url": "https://avatars0.githubusercontent.com/u/1639757?v=3", + "profile": "https://github.com/vjandrea", + "contributions": [ + "code" + ] + }, + { + "login": "kpawelski", + "name": "Karol", + "avatar_url": "https://avatars0.githubusercontent.com/u/10640152?v=3", + "profile": "https://github.com/kpawelski", + "contributions": [ + "translation", + "code" + ] + }, + { + "login": "morph027", + "name": "morph027", + "avatar_url": "https://avatars3.githubusercontent.com/u/600106?v=3", + "profile": "http://blog.morph027.de/", + "contributions": [ + "code" + ] + }, + { + "login": "fvleminckx", + "name": "fvleminckx", + "avatar_url": "https://avatars3.githubusercontent.com/u/22935755?v=3", + "profile": "https://github.com/fvleminckx", + "contributions": [ + "infra" + ] + }, + { + "login": "itsupportcmsukorg", + "name": "itsupportcmsukorg", + "avatar_url": "https://avatars2.githubusercontent.com/u/15633547?v=3", + "profile": "https://github.com/itsupportcmsukorg", + "contributions": [ + "code", + "bug" + ] + }, + { + "login": "base-zero", + "name": "Frank", + "avatar_url": "https://avatars3.githubusercontent.com/u/12373799?v=3", + "profile": "https://override.io", + "contributions": [ + "code" + ] + }, + { + "login": "ghost", + "name": "Deleted user", + "avatar_url": "https://avatars0.githubusercontent.com/u/10137?v=3", + "profile": "https://github.com/ghost", + "contributions": [ + "translation" + ] + }, + { + "login": "tiagom62", + "name": "tiagom62", + "avatar_url": "https://avatars1.githubusercontent.com/u/10802313?v=3", + "profile": "https://github.com/tiagom62", + "contributions": [ + "code", + "infra" + ] + }, + { + "login": "rystaf", + "name": "Ryan Stafford", + "avatar_url": "https://avatars3.githubusercontent.com/u/2389047?v=3", + "profile": "https://github.com/rystaf", + "contributions": [ + "code" + ] + }, + { + "login": "ehanlon", + "name": "Eammon Hanlon", + "avatar_url": "https://avatars2.githubusercontent.com/u/10345935?v=3", + "profile": "https://github.com/ehanlon", + "contributions": [ + "code" + ] + }, + { + "login": "zjean", + "name": "zjean", + "avatar_url": "https://avatars0.githubusercontent.com/u/441924?v=3", + "profile": "https://github.com/zjean", + "contributions": [ + "code" + ] + }, + { + "login": "FREImedia", + "name": "Matthias Frei", + "avatar_url": "https://avatars0.githubusercontent.com/u/12660103?v=3", + "profile": "http://www.frei.media", + "contributions": [ + "code" + ] + }, + { + "login": "opsydev", + "name": "opsydev", + "avatar_url": "https://avatars0.githubusercontent.com/u/3767518?v=3", + "profile": "https://github.com/opsydev", + "contributions": [ + "code" + ] + }, + { + "login": "ddreier", + "name": "Daniel Dreier", + "avatar_url": "https://avatars1.githubusercontent.com/u/82290?v=3", + "profile": "http://www.ddreier.com", + "contributions": [ + "code" + ] + }, + { + "login": "rassie", + "name": "Nikolai Prokoschenko", + "avatar_url": "https://avatars0.githubusercontent.com/u/23448?v=3", + "profile": "http://rassie.org", + "contributions": [ + "code" + ] + }, + { + "login": "YetAnotherCodeMonkey", + "name": "Drew", + "avatar_url": "https://avatars0.githubusercontent.com/u/13452757?v=3", + "profile": "https://github.com/YetAnotherCodeMonkey", + "contributions": [ + "code" + ] + }, + { + "login": "merid14", + "name": "Walter", + "avatar_url": "https://avatars0.githubusercontent.com/u/1342320?v=3", + "profile": "https://github.com/merid14", + "contributions": [ + "code" + ] + }, + { + "login": "balous", + "name": "Petr Baloun", + "avatar_url": "https://avatars3.githubusercontent.com/u/11254614?v=3", + "profile": "https://github.com/balous", + "contributions": [ + "code" + ] + }, + { + "login": "reidblomquist", + "name": "reidblomquist", + "avatar_url": "https://avatars0.githubusercontent.com/u/6117660?v=3", + "profile": "https://github.com/reidblomquist", + "contributions": [ + "doc" + ] + }, + { + "login": "mathieuk", + "name": "Mathieu Kooiman", + "avatar_url": "https://avatars0.githubusercontent.com/u/539914?v=3", + "profile": "https://github.com/mathieuk", + "contributions": [ + "code" + ] + }, + { + "login": "csayre", + "name": "csayre", + "avatar_url": "https://avatars3.githubusercontent.com/u/6606421?v=3", + "profile": "https://github.com/csayre", + "contributions": [ + "doc" + ] + }, + { + "login": "adamdunson", + "name": "Adam Dunson", + "avatar_url": "https://avatars1.githubusercontent.com/u/768488?v=3", + "profile": "https://github.com/adamdunson", + "contributions": [ + "code" + ] + }, + { + "login": "thehereward", + "name": "Hereward", + "avatar_url": "https://avatars0.githubusercontent.com/u/5547470?v=3", + "profile": "https://github.com/thehereward", + "contributions": [ + "code" + ] + }, + { + "login": "swoopdk", + "name": "swoopdk", + "avatar_url": "https://avatars0.githubusercontent.com/u/5802977?v=3", + "profile": "https://github.com/swoopdk", + "contributions": [ + "code" + ] + }, + { + "login": "Ahimta", + "name": "Abdullah Alansari", + "avatar_url": "https://avatars1.githubusercontent.com/u/3470403?v=3", + "profile": "https://linkedin.com/in/ahimta", + "contributions": [ + "code" + ] + }, + { + "login": "MicaelRodrigues", + "name": "Micael Rodrigues", + "avatar_url": "https://avatars0.githubusercontent.com/u/796443?v=3", + "profile": "https://github.com/MicaelRodrigues", + "contributions": [ + "code" + ] + }, + { + "login": "patgmac", + "name": "Patrick Gallagher", + "avatar_url": "https://avatars0.githubusercontent.com/u/614564?v=3", + "profile": "http://macadmincorner.com", + "contributions": [ + "doc" + ] + }, + { + "login": "Miliamber", + "name": "Miliamber", + "avatar_url": "https://avatars3.githubusercontent.com/u/7165922?v=3", + "profile": "https://github.com/Miliamber", + "contributions": [ + "code" + ] + }, + { + "login": "hawk554", + "name": "hawk554", + "avatar_url": "https://avatars3.githubusercontent.com/u/861766?v=3", + "profile": "https://github.com/hawk554", + "contributions": [ + "code" + ] + }, + { + "login": "jbirdkerr", + "name": "Justin Kerr", + "avatar_url": "https://avatars1.githubusercontent.com/u/1695622?v=3", + "profile": "http://jbirdkerr.net", + "contributions": [ + "code" + ] + }, + { + "login": "irasnyd", + "name": "Ira W. Snyder", + "avatar_url": "https://avatars3.githubusercontent.com/u/11426176?v=3", + "profile": "http://www.irasnyder.com/devel/", + "contributions": [ + "doc" + ] + }, + { + "login": "aalaily", + "name": "Aladin Alaily", + "avatar_url": "https://avatars2.githubusercontent.com/u/2475759?v=3", + "profile": "https://github.com/aalaily", + "contributions": [ + "code" + ] + }, + { + "login": "kobie-chasehansen", + "name": "Chase Hansen", + "avatar_url": "https://avatars0.githubusercontent.com/u/10247644?v=3", + "profile": "https://github.com/kobie-chasehansen", + "contributions": [ + "code", + "question", + "bug" + ] + }, + { + "login": "IDM-Helpdesk", + "name": "IDM Helpdesk", + "avatar_url": "https://avatars2.githubusercontent.com/u/13545400?v=3", + "profile": "https://github.com/IDM-Helpdesk", + "contributions": [ + "code" + ] + }, + { + "login": "balticer", + "name": "Kai", + "avatar_url": "https://avatars2.githubusercontent.com/u/614439?v=3", + "profile": "http://balticer.de", + "contributions": [ + "code" + ] + }, + { + "login": "mdaniels5757", + "name": "Michael Daniels", + "avatar_url": "https://avatars1.githubusercontent.com/u/8762511?v=3", + "profile": "http://www.michaeldaniels.me", + "contributions": [ + "code" + ] + }, + { + "login": "tomcastleman", + "name": "Tom Castleman", + "avatar_url": "https://avatars3.githubusercontent.com/u/1532660?v=3", + "profile": "http://tomcastleman.me", + "contributions": [ + "code" + ] + }, + { + "login": "DanielNemanic", + "name": "Daniel Nemanic", + "avatar_url": "https://avatars3.githubusercontent.com/u/10723243?v=3", + "profile": "https://github.com/DanielNemanic", + "contributions": [ + "code" + ] + }, + { + "login": "southwolf", + "name": "SouthWolf", + "avatar_url": "https://avatars0.githubusercontent.com/u/150648?v=3", + "profile": "https://github.com/southwolf", + "contributions": [ + "code" + ] + }, + { + "login": "ivarne", + "name": "Ivar Nesje", + "avatar_url": "https://avatars2.githubusercontent.com/u/131616?v=3", + "profile": "https://github.com/ivarne", + "contributions": [ + "code" + ] + }, + { + "login": "j0k3r", + "name": "Jérémy Benoist", + "avatar_url": "https://avatars1.githubusercontent.com/u/62333?v=3", + "profile": "http://www.j0k3r.net", + "contributions": [ + "doc" + ] + }, + { + "login": "cleathley", + "name": "Chris Leathley", + "avatar_url": "https://avatars2.githubusercontent.com/u/724344?v=3", + "profile": "https://github.com/cleathley", + "contributions": [ + "infra" + ] + }, + { + "login": "splaer", + "name": "splaer", + "avatar_url": "https://avatars0.githubusercontent.com/u/972498?v=3", + "profile": "https://github.com/splaer", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "svpernova09", + "name": "Joe Ferguson", + "avatar_url": "https://avatars1.githubusercontent.com/u/967362?v=3", + "profile": "http://www.joeferguson.me", + "contributions": [ + "code" + ] + }, + { + "login": "diwanicki", + "name": "diwanicki", + "avatar_url": "https://avatars3.githubusercontent.com/u/6108682?v=3", + "profile": "https://github.com/diwanicki", + "contributions": [ + "code", + "doc" + ] + }, + { + "login": "pakkua80", + "name": "Lee Thoong Ching", + "avatar_url": "https://avatars3.githubusercontent.com/u/2527115?v=3", + "profile": "https://github.com/pakkua80", + "contributions": [ + "doc", + "code" + ] + }, + { + "login": "mrshu", + "name": "Marek Šuppa", + "avatar_url": "https://avatars1.githubusercontent.com/u/461491?v=3", + "profile": "http://shu.io", + "contributions": [ + "code" + ] + }, + { + "login": "mizar1616", + "name": "Juan J. Martinez", + "avatar_url": "https://avatars1.githubusercontent.com/u/8693762?v=3", + "profile": "https://github.com/mizar1616", + "contributions": [ + "translation" + ] + }, + { + "login": "rrdial", + "name": "R Ryan Dial", + "avatar_url": "https://avatars1.githubusercontent.com/u/1458388?v=3", + "profile": "https://github.com/rrdial", + "contributions": [ + "translation" + ] + }, + { + "login": "burlito", + "name": "Andrej Manduch", + "avatar_url": "https://avatars2.githubusercontent.com/u/2871745?v=3", + "profile": "https://github.com/burlito", + "contributions": [ + "doc" + ] + }, + { + "login": "technogenus", + "name": "Jay Richards", + "avatar_url": "https://avatars0.githubusercontent.com/u/8341172?v=3", + "profile": "http://www.cordeos.com", + "contributions": [ + "code" + ] + }, + { + "login": "leostat", + "name": "Alexander Innes", + "avatar_url": "https://avatars2.githubusercontent.com/u/7295127?v=3", + "profile": "https://necurity.co.uk", + "contributions": [ + "code" + ] + }, + { + "login": "buzzedword", + "name": "Danny Garcia", + "avatar_url": "https://avatars2.githubusercontent.com/u/334485?v=3", + "profile": "https://buzzedword.codes", + "contributions": [ + "code" + ] + }, + { + "login": "archpoint", + "name": "archpoint", + "avatar_url": "https://avatars2.githubusercontent.com/u/366855?v=3", + "profile": "https://github.com/archpoint", + "contributions": [ + "code" + ] + }, + { + "login": "jakemcgraw", + "name": "Jake McGraw", + "avatar_url": "https://avatars1.githubusercontent.com/u/67991?v=3", + "profile": "http://www.jakemcgraw.com", + "contributions": [ + "code" + ] + }, + { + "login": "FleischKarussel", + "name": "FleischKarussel", + "avatar_url": "https://avatars1.githubusercontent.com/u/1714374?v=3", + "profile": "https://github.com/FleischKarussel", + "contributions": [ + "doc" + ] + }, + { + "login": "feeva", + "name": "Dylan Yi", + "avatar_url": "https://avatars3.githubusercontent.com/u/319644?v=3", + "profile": "https://github.com/feeva", + "contributions": [ + "code" + ] + }, + { + "login": "flashingcursor", + "name": "Gil Rutkowski", + "avatar_url": "https://avatars2.githubusercontent.com/u/857740?v=3", + "profile": "http://FlashingCursor.com", + "contributions": [ + "code" + ] + }, + { + "login": "desmondmorris", + "name": "Desmond Morris", + "avatar_url": "https://avatars3.githubusercontent.com/u/129360?v=3", + "profile": "http://www.desmondmorris.com", + "contributions": [ + "code" + ] + }, + { + "login": "peelman", + "name": "Nick Peelman", + "avatar_url": "https://avatars2.githubusercontent.com/u/52936?v=3", + "profile": "http://peelman.us", + "contributions": [ + "code" + ] + }, + { + "login": "abrahamvegh", + "name": "Abraham Vegh", + "avatar_url": "https://avatars0.githubusercontent.com/u/53161?v=3", + "profile": "https://abrahamvegh.com", + "contributions": [ + "code" + ] + }, + { + "login": "rashivkp", + "name": "Mohamed Rashid", + "avatar_url": "https://avatars0.githubusercontent.com/u/2818680?v=3", + "profile": "https://github.com/rashivkp", + "contributions": [ + "doc" + ] + }, + { + "login": "HinchK", + "name": "Kasey", + "avatar_url": "https://avatars3.githubusercontent.com/u/1509456?v=3", + "profile": "http://hinchk.github.io", + "contributions": [ + "code" + ] + }, + { + "login": "BrettFagerlund", + "name": "Brett", + "avatar_url": "https://avatars2.githubusercontent.com/u/10522541?v=3", + "profile": "https://github.com/BrettFagerlund", + "contributions": [ + "test" + ] + }, + { + "login": "jasonspriggs", + "name": "Jason Spriggs", + "avatar_url": "https://avatars2.githubusercontent.com/u/16108587?v=3", + "profile": "http://jasonspriggs.com", + "contributions": [ + "code" + ] + }, + { + "login": "n8felton", + "name": "Nate Felton", + "avatar_url": "https://avatars2.githubusercontent.com/u/1134568?v=3", + "profile": "http://n8felton.wordpress.com", + "contributions": [ + "code" + ] + }, + { + "login": "manassesferreira", + "name": "Manasses Ferreira", + "avatar_url": "https://avatars2.githubusercontent.com/u/14036694?v=3", + "profile": "http://homepages.dcc.ufmg.br/~manassesferreira", + "contributions": [ + "code" + ] + }, + { + "login": "steveelwood", + "name": "Steve", + "avatar_url": "https://avatars0.githubusercontent.com/u/15913949?v=3", + "profile": "https://github.com/steveelwood", + "contributions": [ + "test" + ] + }, + { + "login": "matc", + "name": "matc", + "avatar_url": "https://avatars1.githubusercontent.com/u/3361683?v=3", + "profile": "http://twitter.com/matc", + "contributions": [ + "test" + ] + }, + { + "login": "VanillaNinjaD", + "name": "Cole R. Davis", + "avatar_url": "https://avatars3.githubusercontent.com/u/7405702?v=3", + "profile": "http://www.davisracingteam.com", + "contributions": [ + "test" + ] + }, + { + "login": "gibsonjoshua55", + "name": "gibsonjoshua55", + "avatar_url": "https://avatars2.githubusercontent.com/u/10167681?v=3", + "profile": "https://github.com/gibsonjoshua55", + "contributions": [ + "code" + ] + }, + { + "login": "zwerch", + "name": "Robin Temme", + "avatar_url": "https://avatars2.githubusercontent.com/u/2809241?v=4", + "profile": "https://github.com/zwerch", + "contributions": [ + "code" + ] + }, + { + "login": "imanghafoori1", + "name": "Iman", + "avatar_url": "https://avatars0.githubusercontent.com/u/6961695?v=4", + "profile": "https://github.com/imanghafoori1", + "contributions": [ + "code" + ] + } + ] +} diff --git a/.env.example b/.env.example index aa1ac2d294..cd22ea38ea 100644 --- a/.env.example +++ b/.env.example @@ -93,3 +93,4 @@ APP_LOCKED=false FILESYSTEM_DISK=local APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1 ALLOW_IFRAMING=false +APP_CIPHER=AES-256-CBC diff --git a/.env.testing b/.env.testing index 1c2b1b9634..f84dd82e9f 100644 --- a/.env.testing +++ b/.env.testing @@ -3,7 +3,7 @@ # -------------------------------------------- APP_ENV=testing APP_DEBUG=true -APP_KEY=ChangeMe +APP_KEY=base64:glJpcM7BYwWiBggp3SQ/+NlRkqsBQMaGEOjemXqJzOU= APP_URL=http://localhost:8000 APP_TIMEZONE='US/Pacific' APP_LOCALE=en @@ -21,7 +21,7 @@ DB_PASSWORD=null # -------------------------------------------- # REQUIRED: OUTGOING MAIL SERVER SETTINGS # -------------------------------------------- -MAIL_DRIVER=smtp +MAIL_DRIVER=log MAIL_HOST=email-smtp.us-west-2.amazonaws.com MAIL_PORT=587 MAIL_USERNAME=YOURUSERNAME @@ -69,3 +69,4 @@ SECURE_COOKIES=false # OPTIONAL: APP LOG FORMAT # -------------------------------------------- APP_LOG=single +APP_LOG_LEVEL=debug diff --git a/.env.testing-ci b/.env.testing-ci index fd05383610..b12a99d442 100644 --- a/.env.testing-ci +++ b/.env.testing-ci @@ -15,13 +15,13 @@ FILESYSTEM_DISK=local DB_CONNECTION=mysql DB_HOST=localhost DB_DATABASE=snipeit_unit -DB_USERNAME=travis +DB_USERNAME=root DB_PASSWORD=null # -------------------------------------------- # REQUIRED: OUTGOING MAIL SERVER SETTINGS # -------------------------------------------- -MAIL_DRIVER=smtp +MAIL_DRIVER=log MAIL_HOST=email-smtp.us-west-2.amazonaws.com MAIL_PORT=587 MAIL_USERNAME=YOURUSERNAME diff --git a/.env.tests b/.env.tests index 6349562fbf..665a0fffbb 100644 --- a/.env.tests +++ b/.env.tests @@ -1,9 +1,22 @@ -APP_ENV=local +APP_ENV=testing APP_DEBUG=true APP_URL=http://snipe-it.localapp -DB_CONNECTION=mysql +DB_CONNECTION=sqlite_testing +DB_DEFAULT=sqlite_testing DB_HOST=localhost DB_DATABASE=snipeittests DB_USERNAME=snipeit DB_PASSWORD=snipe APP_KEY=base64:tu9NRh/a6+dCXBDGvg0Gv/0TcABnFsbT4AKxrr8mwQo= + + +# -------------------------------------------- +# OPTIONAL: LOGIN THROTTLING +# (LOGIN_LOCKOUT_DURATIONin minutes) +# -------------------------------------------- +LOGIN_MAX_ATTEMPTS=1000000 +LOGIN_LOCKOUT_DURATION=100000000 + +MAIL_DRIVER=log +MAIL_FROM_ADDR=you@example.com +MAIL_FROM_NAME=Snipe-IT diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..80713cc14c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,22 @@ +# Code ownership for pull request reviews, per +# the feature detailed here: + +# https://github.com/blog/2392-introducing-code-owners +# https://help.github.com/articles/about-codeowners/ + +# These owners will be the default owners for everything in the repo. +* @snipe + +# Order is important. The last matching pattern has the most precedence. +# So if a pull request only touches javascript files, only these owners +# will be requested to review. + +# For example: +# *.js @octocat @github/js + + +app/Importer/* @dmeltzer +app/Http/Controllers/CustomFields* @uberbrady +app/Http/Controllers/Api/CustomFields* @uberbrady +resources/views/custom_fields/* @uberbrady +docker/* @uberbrady diff --git a/.gitignore b/.gitignore index 8f42d38a75..61e7405ae3 100755 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ tests/_support/_generated/* /npm-debug.log /storage/oauth-private.key /storage/oauth-public.key + +*.cache diff --git a/.travis.yml b/.travis.yml index d783b2712c..d28293171e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,9 @@ sudo: false # see http://about.travis-ci.org/docs/user/languages/php/ for more hints language: php +services: + - mysql + # list any PHP version you want to test against php: - 5.6 @@ -14,18 +17,22 @@ php: # execute any number of scripts before the test run, custom env's are available as variables before_script: - phantomjs --webdriver=4444 & - - sleep 10 - - mysql -e "create database IF NOT EXISTS snipeit_unit;" -utravis + - sleep 4 + - mysql -e 'CREATE DATABASE snipeit_unit;' + - mysql -e 'CREATE USER "travis'@'localhost";' + - mysql -e 'GRANT ALL PRIVILEGES ON * . * TO "travis'@'localhost";' + - mysql -e 'FLUSH PRIVILEGES;' - composer self-update - composer install -n --prefer-source - - cp .env.testing-ci .env - chmod -R 777 storage - - php artisan migrate --database=mysql --force + - php artisan migrate --env=testing-ci --database=mysql --force - ./vendor/bin/codecept build - - php artisan key:generate - - php artisan db:seed --database=mysql --force - - php artisan snipeit:create-admin --first_name=Alison --last_name=Foobar --email=me@example.com --username=snipe --password=password - - php artisan serve --port=8000 --host=localhost & + - php artisan --env=testing-ci key:generate + - php artisan --env=testing-ci snipeit:travisci-install + - php artisan --env=testing-ci db:seed --database=mysql --force + - php artisan --env=testing-ci snipeit:create-admin --first_name=Alison --last_name=Foobar --email=me@example.com --username=snipe --password=password + - php artisan --env=testing-ci passport:install + - php artisan serve --env=testing-ci --port=8000 --host=localhost & - sleep 5 - pip install --user codecov - sleep 5 @@ -34,16 +41,21 @@ before_script: # omitting "script:" will default to phpunit # use the $DB env variable to determine the phpunit.xml to use -# script: ./vendor/bin/codecept run --env testing-ci - broken :( -script: ./vendor/bin/codecept run unit --env testing-ci +# script: ./vendor/bin/codecept run --env testing-ci +script: + - ./vendor/bin/codecept run unit --env testing-ci +# - ./vendor/bin/codecept run acceptance --env=testing-ci + - ./vendor/bin/codecept run functional --env=functional-travis #script: ./vendor/bin/codecept run + - ./vendor/bin/codecept run api --env=testing-ci after_success: - codecov after_failure: - - cat tests/_output/AccessoriesCept.fail.html + - cat tests/_output/*.fail.html - curl http://localhost:8000/login + - cat storage/logs/laravel.log # configure notifications (email, IRC, campfire etc) notifications: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..f1ef3672c6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +### Contributing + +Please see the documentation on [contributing and developing for Snipe-IT](https://snipe-it.readme.io/docs/contributing). + + +Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. diff --git a/Dockerfile b/Dockerfile index 27295b1786..62a1e4fcbb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,7 @@ php7.0-gd \ php7.0-xml \ php7.0-mbstring \ php7.0-zip \ +php7.0-bcmath \ patch \ curl \ vim \ @@ -23,6 +24,7 @@ mysql-client \ RUN phpenmod mcrypt RUN phpenmod gd +RUN phpenmod bcmath RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.0/apache2/php.ini RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.0/cli/php.ini diff --git a/README.md b/README.md index f0d3c1dadf..7799b434dc 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ [![Build Status](https://travis-ci.org/snipe/snipe-it.svg?branch=develop)](https://travis-ci.org/snipe/snipe-it) [![Stories in Ready](https://badge.waffle.io/snipe/snipe-it.png?label=ready+for+dev&title=Ready+for+development)](http://waffle.io/snipe/snipe-it) [![Maintenance](https://img.shields.io/maintenance/yes/2017.svg)]() [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.png)](https://crowdin.com/project/snipe-it) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeyhead.svg?style=social)](https://twitter.com/snipeyhead) [![Zenhub](https://raw.githubusercontent.com/ZenHubIO/support/master/zenhub-badge.png)](https://zenhub.io) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade) +[![All Contributors](https://img.shields.io/badge/all_contributors-79-orange.svg?style=flat-square)](#contributors) ## Snipe-IT - Open Source Asset Management System This is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc. -It is built on [Laravel 5.2](http://laravel.com). +It is built on [Laravel 5.4](http://laravel.com). Snipe-IT is actively developed and we're [releasing quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).) @@ -26,7 +27,9 @@ For help using Snipe-IT, check out the [user's manual](https://snipe-it.readme.i ----- ### Bug Reports & Feature Requests -Feel free to check out the [GitHub Issues for this project](https://github.com/snipe/snipe-it/issues) to open a bug report or see what open issues you can help with. Please search through existing issues (open and closed) to see if your question hasn't already been answered before opening a new issue. +Feel free to check out the [GitHub Issues for this project](https://github.com/snipe/snipe-it/issues) to open a bug report or see what open issues you can help with. Please search through existing issues (open *and* closed) to see if your question has already been answered before opening a new issue. + +**PLEASE see the [Getting Help Guidelines](https://snipe-it.readme.io/docs/getting-help) and [Common Issues](https://snipe-it.readme.io/docs/common-issues) before opening a ticket, and be sure to complete all of the questions in the Github Issue template to help us to help you as quickly as possible.** ----- @@ -47,6 +50,30 @@ Please see the [translations documentation](https://snipe-it.readme.io/docs/tran ----- +### Contributors + +Thanks goes to all of these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)) who have helped Snipe-IT get this far: + + +| [
snipe](http://www.snipe.net)
[💻](https://github.com/snipe/snipe-it/commits?author=snipe "Code") [🚇](#infra-snipe "Infrastructure (Hosting, Build-Tools, etc)") [📖](https://github.com/snipe/snipe-it/commits?author=snipe "Documentation") [⚠️](https://github.com/snipe/snipe-it/commits?author=snipe "Tests") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Asnipe "Bug reports") [🎨](#design-snipe "Design") [👀](#review-snipe "Reviewed Pull Requests") | [
Brady Wetherington](http://www.uberbrady.com)
[💻](https://github.com/snipe/snipe-it/commits?author=uberbrady "Code") [📖](https://github.com/snipe/snipe-it/commits?author=uberbrady "Documentation") [🚇](#infra-uberbrady "Infrastructure (Hosting, Build-Tools, etc)") [👀](#review-uberbrady "Reviewed Pull Requests") | [
Daniel Meltzer](https://github.com/dmeltzer)
[💻](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Code") [⚠️](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Tests") [📖](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Documentation") | [
Michael T](http://www.tuckertechonline.com)
[💻](https://github.com/snipe/snipe-it/commits?author=mtucker6784 "Code") | [
madd15](https://github.com/madd15)
[📖](https://github.com/snipe/snipe-it/commits?author=madd15 "Documentation") [💬](#question-madd15 "Answering Questions") | [
Vincent Sposato](https://github.com/vsposato)
[💻](https://github.com/snipe/snipe-it/commits?author=vsposato "Code") | [
Andrea Bergamasco](https://github.com/vjandrea)
[💻](https://github.com/snipe/snipe-it/commits?author=vjandrea "Code") | +| :---: | :---: | :---: | :---: | :---: | :---: | :---: | +| [
Karol](https://github.com/kpawelski)
[🌍](#translation-kpawelski "Translation") [💻](https://github.com/snipe/snipe-it/commits?author=kpawelski "Code") | [
morph027](http://blog.morph027.de/)
[💻](https://github.com/snipe/snipe-it/commits?author=morph027 "Code") | [
fvleminckx](https://github.com/fvleminckx)
[🚇](#infra-fvleminckx "Infrastructure (Hosting, Build-Tools, etc)") | [
itsupportcmsukorg](https://github.com/itsupportcmsukorg)
[💻](https://github.com/snipe/snipe-it/commits?author=itsupportcmsukorg "Code") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Aitsupportcmsukorg "Bug reports") | [
Frank](https://override.io)
[💻](https://github.com/snipe/snipe-it/commits?author=base-zero "Code") | [
Deleted user](https://github.com/ghost)
[🌍](#translation-ghost "Translation") | [
tiagom62](https://github.com/tiagom62)
[💻](https://github.com/snipe/snipe-it/commits?author=tiagom62 "Code") [🚇](#infra-tiagom62 "Infrastructure (Hosting, Build-Tools, etc)") | +| [
Ryan Stafford](https://github.com/rystaf)
[💻](https://github.com/snipe/snipe-it/commits?author=rystaf "Code") | [
Eammon Hanlon](https://github.com/ehanlon)
[💻](https://github.com/snipe/snipe-it/commits?author=ehanlon "Code") | [
zjean](https://github.com/zjean)
[💻](https://github.com/snipe/snipe-it/commits?author=zjean "Code") | [
Matthias Frei](http://www.frei.media)
[💻](https://github.com/snipe/snipe-it/commits?author=FREImedia "Code") | [
opsydev](https://github.com/opsydev)
[💻](https://github.com/snipe/snipe-it/commits?author=opsydev "Code") | [
Daniel Dreier](http://www.ddreier.com)
[💻](https://github.com/snipe/snipe-it/commits?author=ddreier "Code") | [
Nikolai Prokoschenko](http://rassie.org)
[💻](https://github.com/snipe/snipe-it/commits?author=rassie "Code") | +| [
Drew](https://github.com/YetAnotherCodeMonkey)
[💻](https://github.com/snipe/snipe-it/commits?author=YetAnotherCodeMonkey "Code") | [
Walter](https://github.com/merid14)
[💻](https://github.com/snipe/snipe-it/commits?author=merid14 "Code") | [
Petr Baloun](https://github.com/balous)
[💻](https://github.com/snipe/snipe-it/commits?author=balous "Code") | [
reidblomquist](https://github.com/reidblomquist)
[📖](https://github.com/snipe/snipe-it/commits?author=reidblomquist "Documentation") | [
Mathieu Kooiman](https://github.com/mathieuk)
[💻](https://github.com/snipe/snipe-it/commits?author=mathieuk "Code") | [
csayre](https://github.com/csayre)
[📖](https://github.com/snipe/snipe-it/commits?author=csayre "Documentation") | [
Adam Dunson](https://github.com/adamdunson)
[💻](https://github.com/snipe/snipe-it/commits?author=adamdunson "Code") | +| [
Hereward](https://github.com/thehereward)
[💻](https://github.com/snipe/snipe-it/commits?author=thehereward "Code") | [
swoopdk](https://github.com/swoopdk)
[💻](https://github.com/snipe/snipe-it/commits?author=swoopdk "Code") | [
Abdullah Alansari](https://linkedin.com/in/ahimta)
[💻](https://github.com/snipe/snipe-it/commits?author=Ahimta "Code") | [
Micael Rodrigues](https://github.com/MicaelRodrigues)
[💻](https://github.com/snipe/snipe-it/commits?author=MicaelRodrigues "Code") | [
Patrick Gallagher](http://macadmincorner.com)
[📖](https://github.com/snipe/snipe-it/commits?author=patgmac "Documentation") | [
Miliamber](https://github.com/Miliamber)
[💻](https://github.com/snipe/snipe-it/commits?author=Miliamber "Code") | [
hawk554](https://github.com/hawk554)
[💻](https://github.com/snipe/snipe-it/commits?author=hawk554 "Code") | +| [
Justin Kerr](http://jbirdkerr.net)
[💻](https://github.com/snipe/snipe-it/commits?author=jbirdkerr "Code") | [
Ira W. Snyder](http://www.irasnyder.com/devel/)
[📖](https://github.com/snipe/snipe-it/commits?author=irasnyd "Documentation") | [
Aladin Alaily](https://github.com/aalaily)
[💻](https://github.com/snipe/snipe-it/commits?author=aalaily "Code") | [
Chase Hansen](https://github.com/kobie-chasehansen)
[💻](https://github.com/snipe/snipe-it/commits?author=kobie-chasehansen "Code") [💬](#question-kobie-chasehansen "Answering Questions") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Akobie-chasehansen "Bug reports") | [
IDM Helpdesk](https://github.com/IDM-Helpdesk)
[💻](https://github.com/snipe/snipe-it/commits?author=IDM-Helpdesk "Code") | [
Kai](http://balticer.de)
[💻](https://github.com/snipe/snipe-it/commits?author=balticer "Code") | [
Michael Daniels](http://www.michaeldaniels.me)
[💻](https://github.com/snipe/snipe-it/commits?author=mdaniels5757 "Code") | +| [
Tom Castleman](http://tomcastleman.me)
[💻](https://github.com/snipe/snipe-it/commits?author=tomcastleman "Code") | [
Daniel Nemanic](https://github.com/DanielNemanic)
[💻](https://github.com/snipe/snipe-it/commits?author=DanielNemanic "Code") | [
SouthWolf](https://github.com/southwolf)
[💻](https://github.com/snipe/snipe-it/commits?author=southwolf "Code") | [
Ivar Nesje](https://github.com/ivarne)
[💻](https://github.com/snipe/snipe-it/commits?author=ivarne "Code") | [
Jérémy Benoist](http://www.j0k3r.net)
[📖](https://github.com/snipe/snipe-it/commits?author=j0k3r "Documentation") | [
Chris Leathley](https://github.com/cleathley)
[🚇](#infra-cleathley "Infrastructure (Hosting, Build-Tools, etc)") | [
splaer](https://github.com/splaer)
[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Asplaer "Bug reports") [💻](https://github.com/snipe/snipe-it/commits?author=splaer "Code") | +| [
Joe Ferguson](http://www.joeferguson.me)
[💻](https://github.com/snipe/snipe-it/commits?author=svpernova09 "Code") | [
diwanicki](https://github.com/diwanicki)
[💻](https://github.com/snipe/snipe-it/commits?author=diwanicki "Code") [📖](https://github.com/snipe/snipe-it/commits?author=diwanicki "Documentation") | [
Lee Thoong Ching](https://github.com/pakkua80)
[📖](https://github.com/snipe/snipe-it/commits?author=pakkua80 "Documentation") [💻](https://github.com/snipe/snipe-it/commits?author=pakkua80 "Code") | [
Marek Šuppa](http://shu.io)
[💻](https://github.com/snipe/snipe-it/commits?author=mrshu "Code") | [
Juan J. Martinez](https://github.com/mizar1616)
[🌍](#translation-mizar1616 "Translation") | [
R Ryan Dial](https://github.com/rrdial)
[🌍](#translation-rrdial "Translation") | [
Andrej Manduch](https://github.com/burlito)
[📖](https://github.com/snipe/snipe-it/commits?author=burlito "Documentation") | +| [
Jay Richards](http://www.cordeos.com)
[💻](https://github.com/snipe/snipe-it/commits?author=technogenus "Code") | [
Alexander Innes](https://necurity.co.uk)
[💻](https://github.com/snipe/snipe-it/commits?author=leostat "Code") | [
Danny Garcia](https://buzzedword.codes)
[💻](https://github.com/snipe/snipe-it/commits?author=buzzedword "Code") | [
archpoint](https://github.com/archpoint)
[💻](https://github.com/snipe/snipe-it/commits?author=archpoint "Code") | [
Jake McGraw](http://www.jakemcgraw.com)
[💻](https://github.com/snipe/snipe-it/commits?author=jakemcgraw "Code") | [
FleischKarussel](https://github.com/FleischKarussel)
[📖](https://github.com/snipe/snipe-it/commits?author=FleischKarussel "Documentation") | [
Dylan Yi](https://github.com/feeva)
[💻](https://github.com/snipe/snipe-it/commits?author=feeva "Code") | +| [
Gil Rutkowski](http://FlashingCursor.com)
[💻](https://github.com/snipe/snipe-it/commits?author=flashingcursor "Code") | [
Desmond Morris](http://www.desmondmorris.com)
[💻](https://github.com/snipe/snipe-it/commits?author=desmondmorris "Code") | [
Nick Peelman](http://peelman.us)
[💻](https://github.com/snipe/snipe-it/commits?author=peelman "Code") | [
Abraham Vegh](https://abrahamvegh.com)
[💻](https://github.com/snipe/snipe-it/commits?author=abrahamvegh "Code") | [
Mohamed Rashid](https://github.com/rashivkp)
[📖](https://github.com/snipe/snipe-it/commits?author=rashivkp "Documentation") | [
Kasey](http://hinchk.github.io)
[💻](https://github.com/snipe/snipe-it/commits?author=HinchK "Code") | [
Brett](https://github.com/BrettFagerlund)
[⚠️](https://github.com/snipe/snipe-it/commits?author=BrettFagerlund "Tests") | +| [
Jason Spriggs](http://jasonspriggs.com)
[💻](https://github.com/snipe/snipe-it/commits?author=jasonspriggs "Code") | [
Nate Felton](http://n8felton.wordpress.com)
[💻](https://github.com/snipe/snipe-it/commits?author=n8felton "Code") | [
Manasses Ferreira](http://homepages.dcc.ufmg.br/~manassesferreira)
[💻](https://github.com/snipe/snipe-it/commits?author=manassesferreira "Code") | [
Steve](https://github.com/steveelwood)
[⚠️](https://github.com/snipe/snipe-it/commits?author=steveelwood "Tests") | [
matc](http://twitter.com/matc)
[⚠️](https://github.com/snipe/snipe-it/commits?author=matc "Tests") | [
Cole R. Davis](http://www.davisracingteam.com)
[⚠️](https://github.com/snipe/snipe-it/commits?author=VanillaNinjaD "Tests") | [
gibsonjoshua55](https://github.com/gibsonjoshua55)
[💻](https://github.com/snipe/snipe-it/commits?author=gibsonjoshua55 "Code") | +| [
Robin Temme](https://github.com/zwerch)
[💻](https://github.com/snipe/snipe-it/commits?author=zwerch "Code") | [
Iman](https://github.com/imanghafoori1)
[💻](https://github.com/snipe/snipe-it/commits?author=imanghafoori1 "Code") | + + +This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome! + +----- + ### Contributing Please see the documentation on [contributing and developing for Snipe-IT](https://snipe-it.readme.io/docs/contributing). @@ -54,6 +81,8 @@ Please see the documentation on [contributing and developing for Snipe-IT](https Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. +----- + ### Security To report a security vulnerability, please email security@snipeitapp.com instead of using the issue tracker. diff --git a/app/Console/Commands/AssetImportCommand.php b/app/Console/Commands/AssetImportCommand.php deleted file mode 100644 index 851a3c216f..0000000000 --- a/app/Console/Commands/AssetImportCommand.php +++ /dev/null @@ -1,463 +0,0 @@ -argument('filename'); - - - if (!$this->option('testrun')=='true') { - $this->comment('======= Importing Assets from '.$filename.' ========='); - } else { - $this->comment('====== TEST ONLY Asset Import for '.$filename.' ===='); - $this->comment('============== NO DATA WILL BE WRITTEN =============='); - } - - if (! ini_get("auto_detect_line_endings")) { - ini_set("auto_detect_line_endings", '1'); - } - - $csv = Reader::createFromPath($this->argument('filename')); - $csv->setNewline("\r\n"); - $csv->setOffset(1); - $duplicates = ''; - - // Loop through the records - $nbInsert = $csv->each(function ($row) use ($duplicates) { - $status_id = 1; - - // Let's just map some of these entries to more user friendly words - - // User's name - if (array_key_exists('0', $row)) { - $user_name = trim($row[0]); - } else { - $user_name = ''; - } - - // User's email - if (array_key_exists('1', $row)) { - $user_email = trim($row[1]); - } else { - $user_email = ''; - } - - // User's email - if (array_key_exists('2', $row)) { - $user_username = trim($row[2]); - } else { - $user_username = ''; - } - - // Asset Name - if (array_key_exists('3', $row)) { - $user_asset_asset_name = trim($row[3]); - } else { - $user_asset_asset_name = ''; - } - - // Asset Category - if (array_key_exists('4', $row)) { - $user_asset_category = trim($row[4]); - } else { - $user_asset_category = ''; - } - - // Asset Name - if (array_key_exists('5', $row)) { - $user_asset_name = trim($row[5]); - } else { - $user_asset_name = ''; - } - - // Asset Manufacturer - if (array_key_exists('6', $row)) { - $user_asset_mfgr = trim($row[6]); - } else { - $user_asset_mfgr = ''; - } - - // Asset model number - if (array_key_exists('7', $row)) { - $user_asset_modelno = trim($row[7]); - } else { - $user_asset_modelno = ''; - } - - // Asset serial number - if (array_key_exists('8', $row)) { - $user_asset_serial = trim($row[8]); - } else { - $user_asset_serial = ''; - } - - // Asset tag - if (array_key_exists('9', $row)) { - $user_asset_tag = trim($row[9]); - } else { - $user_asset_tag = ''; - } - - // Asset location - if (array_key_exists('10', $row)) { - $user_asset_location = trim($row[10]); - } else { - $user_asset_location = ''; - } - - // Asset notes - if (array_key_exists('11', $row)) { - $user_asset_notes = trim($row[11]); - } else { - $user_asset_notes = ''; - } - - // Asset purchase date - if (array_key_exists('12', $row)) { - if ($row[12]!='') { - $user_asset_purchase_date = date("Y-m-d 00:00:01", strtotime($row[12])); - } else { - $user_asset_purchase_date = ''; - } - } else { - $user_asset_purchase_date = ''; - } - - // Asset purchase cost - if (array_key_exists('13', $row)) { - if ($row[13]!='') { - $user_asset_purchase_cost = trim($row[13]); - } else { - $user_asset_purchase_cost = ''; - } - } else { - $user_asset_purchase_cost = ''; - } - - // Asset Company Name - if (array_key_exists('14', $row)) { - if ($row[14]!='') { - $user_asset_company_name = trim($row[14]); - } else { - $user_asset_company_name= ''; - } - } else { - $user_asset_company_name = ''; - } - - - // A number was given instead of a name - if (is_numeric($user_name)) { - $this->comment('User '.$user_name.' is not a name - assume this user already exists'); - $user_username = ''; - $first_name = ''; - $last_name = ''; - - // No name was given - } elseif ($user_name=='') { - $this->comment('No user data provided - skipping user creation, just adding asset'); - $first_name = ''; - $last_name = ''; - //$user_username = ''; - - } else { - $user_email_array = User::generateFormattedNameFromFullName($this->option('email_format'), $user_name); - $first_name = $user_email_array['first_name']; - $last_name = $user_email_array['last_name']; - - if ($user_email=='') { - $user_email = $user_email_array['username'].'@'.config('app.domain'); - } - - if ($user_username=='') { - if ($this->option('username_format')=='email') { - $user_username = $user_email; - } else { - $user_name_array = User::generateFormattedNameFromFullName($this->option('username_format'), $user_name); - $user_username = $user_name_array['username']; - } - - } - - } - - $this->comment('Full Name: '.$user_name); - $this->comment('First Name: '.$first_name); - $this->comment('Last Name: '.$last_name); - $this->comment('Username: '.$user_username); - $this->comment('Email: '.$user_email); - $this->comment('Category Name: '.$user_asset_category); - $this->comment('Item: '.$user_asset_name); - $this->comment('Manufacturer ID: '.$user_asset_mfgr); - $this->comment('Model No: '.$user_asset_modelno); - $this->comment('Serial No: '.$user_asset_serial); - $this->comment('Asset Tag: '.$user_asset_tag); - $this->comment('Location: '.$user_asset_location); - $this->comment('Purchase Date: '.$user_asset_purchase_date); - $this->comment('Purchase Cost: '.$user_asset_purchase_cost); - $this->comment('Notes: '.$user_asset_notes); - $this->comment('Company Name: '.$user_asset_company_name); - - $this->comment('------------- Action Summary ----------------'); - - if ($user_username!='') { - if ($user = User::MatchEmailOrUsername($user_username, $user_email) - ->whereNotNull('username')->first()) { - $this->comment('User '.$user_username.' already exists'); - } else { - $user = new \App\Models\User; - $password = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); - - $user->first_name = $first_name; - $user->last_name = $last_name; - $user->username = $user_username; - $user->email = $user_email; - $user->permissions = '{user":1}'; - $user->password = bcrypt($password); - $user->activated = 1; - if ($user->save()) { - $this->comment('User '.$first_name.' created'); - } else { - $this->error('ERROR CREATING User '.$first_name.' '.$last_name); - $this->error($user->getErrors()); - } - - } - } else { - $user = new User; - } - - // Check for the location match and create it if it doesn't exist - if ($location = Location::where('name', e($user_asset_location))->first()) { - $this->comment('Location '.$user_asset_location.' already exists'); - } else { - - $location = new Location(); - - if ($user_asset_location!='') { - $location->name = e($user_asset_location); - $location->address = ''; - $location->city = ''; - $location->state = ''; - $location->country = ''; - $location->user_id = 1; - - if (!$this->option('testrun')=='true') { - - if ($location->save()) { - $this->comment('Location '.$user_asset_location.' was created'); - } else { - $this->error('Something went wrong! Location '.$user_asset_location.' was NOT created'); - $this->error($location->getErrors()); - } - - } else { - $this->comment('Location '.$user_asset_location.' was (not) created - test run only'); - } - } else { - $this->comment('No location given, so none created.'); - } - - } - - if (e($user_asset_category)=='') { - $category_name = 'Unnamed Category'; - } else { - $category_name = e($user_asset_category); - } - - // Check for the category match and create it if it doesn't exist - if ($category = Category::where('name', e($category_name))->where('category_type', 'asset')->first()) { - $this->comment('Category '.$category_name.' already exists'); - - } else { - $category = new Category(); - $category->name = e($category_name); - $category->category_type = 'asset'; - $category->user_id = 1; - - if ($category->save()) { - $this->comment('Category '.$user_asset_category.' was created'); - } else { - $this->error('Something went wrong! Category '.$user_asset_category.' was NOT created'); - $this->error($category->getErrors()); - } - - } - - // Check for the manufacturer match and create it if it doesn't exist - if ($manufacturer = Manufacturer::where('name', e($user_asset_mfgr))->first()) { - $this->comment('Manufacturer '.$user_asset_mfgr.' already exists'); - } else { - $manufacturer = new Manufacturer(); - $manufacturer->name = e($user_asset_mfgr); - $manufacturer->user_id = 1; - - if ($manufacturer->save()) { - $this->comment('Manufacturer '.$user_asset_mfgr.' was created'); - } else { - $this->error('Something went wrong! Manufacturer '.$user_asset_mfgr.' was NOT created: '. $manufacturer->getErrors()->first()); - } - - } - - // Check for the asset model match and create it if it doesn't exist - if ($asset_model = AssetModel::where('name', e($user_asset_name))->where('modelno', e($user_asset_modelno))->where('category_id', $category->id)->where('manufacturer_id', $manufacturer->id)->first()) { - $this->comment('The Asset Model '.$user_asset_name.' with model number '.$user_asset_modelno.' already exists'); - } else { - $asset_model = new AssetModel(); - $asset_model->name = e($user_asset_name); - $asset_model->manufacturer_id = $manufacturer->id; - $asset_model->modelno = e($user_asset_modelno); - $asset_model->category_id = $category->id; - $asset_model->user_id = 1; - - if ($asset_model->save()) { - $this->comment('Asset Model '.$user_asset_name.' with model number '.$user_asset_modelno.' was created'); - } else { - $this->error('Something went wrong! Asset Model '.$user_asset_name.' was NOT created: '.$asset_model->getErrors()->first()); - } - - } - - // Check for the asset company match and create it if it doesn't exist - if ($user_asset_company_name!='') { - if ($company = Company::where('name', e($user_asset_company_name))->first()) { - $this->comment('Company '.$user_asset_company_name.' already exists'); - } else { - $company = new Company(); - $company->name = e($user_asset_company_name); - - if ($company->save()) { - $this->comment('Company '.$user_asset_company_name.' was created'); - } else { - $this->error('Something went wrong! Company '.$user_asset_company_name.' was NOT created: '.$company->getErrors()->first()); - } - } - - } else { - $company = new Company(); - } - - // Check for the asset match and create it if it doesn't exist - if ($asset = Asset::where('asset_tag', e($user_asset_tag))->first()) { - $this->comment('The Asset with asset tag '.$user_asset_tag.' already exists'); - } else { - $asset = new Asset(); - $asset->name = e($user_asset_asset_name); - if ($user_asset_purchase_date!='') { - $asset->purchase_date = $user_asset_purchase_date; - } else { - $asset->purchase_date = null; - } - if ($user_asset_purchase_cost!='') { - $asset->purchase_cost = ParseFloat(e($user_asset_purchase_cost)); - } else { - $asset->purchase_cost = 0.00; - } - $asset->serial = e($user_asset_serial); - $asset->asset_tag = e($user_asset_tag); - $asset->model_id = $asset_model->id; - $asset->assigned_to = $user->id; - $asset->rtd_location_id = $location->id; - $asset->user_id = 1; - $asset->status_id = $status_id; - $asset->company_id = $company->id; - if ($user_asset_purchase_date!='') { - $asset->purchase_date = $user_asset_purchase_date; - } else { - $asset->purchase_date = null; - } - $asset->notes = e($user_asset_notes); - - if ($asset->save()) { - $this->comment('Asset '.$user_asset_name.' with serial number '.$user_asset_serial.' was created'); - } else { - $this->error('Something went wrong! Asset '.$user_asset_name.' was NOT created: '.$asset->getErrors()->first()); - } - - } - - - - $this->comment('====================================='); - - return true; - - }); - - - } - - /** - * Get the console command arguments. - * - * @return array - */ - protected function getArguments() - { - return array( - array('filename', InputArgument::REQUIRED, 'File for the CSV import.'), - ); - } - - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return array( - array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null), - array('username_format', null, InputOption::VALUE_REQUIRED, 'The format of the username that should be generated. Options are firstname.lastname, firstname, filastname, email', null), - array('testrun', null, InputOption::VALUE_REQUIRED, 'Test the output without writing to the database or not.', null), - ); - } -} diff --git a/app/Console/Commands/FixDoubleEscape.php b/app/Console/Commands/FixDoubleEscape.php new file mode 100644 index 0000000000..648e209950 --- /dev/null +++ b/app/Console/Commands/FixDoubleEscape.php @@ -0,0 +1,85 @@ + ['name'], + '\App\Models\License' => ['name'], + '\App\Models\Consumable' => ['name'], + '\App\Models\Accessory' => ['name'], + '\App\Models\Component' => ['name'], + '\App\Models\Company' => ['name'], + '\App\Models\Manufacturer' => ['name'], + '\App\Models\Supplier' => ['name'], + '\App\Models\Statuslabel' => ['name'], + '\App\Models\Depreciation' => ['name'], + '\App\Models\AssetModel' => ['name'], + '\App\Models\Group' => ['name'], + '\App\Models\Department' => ['name'], + '\App\Models\Location' => ['name'], + '\App\Models\User' => ['first_name', 'last_name'], + ]; + + $count = array(); + + + + foreach ($tables as $classname => $fields) { + $count[$classname] = array(); + $count[$classname]['classname'] = 0; + + foreach($fields as $field) { + + $count[$classname]['classname']++; + $count[$classname][$field] = 0; + + foreach($classname::where("$field",'LIKE','%&%')->get() as $row) { + $this->info('Updating '.$field.' for '.$classname); + $row->{$field} = html_entity_decode($row->{$field}); + $row->save(); + $count[$classname][$field]++; + + } + } + } + + $this->info('Update complete'); + + } +} diff --git a/app/Console/Commands/LdapSync.php b/app/Console/Commands/LdapSync.php old mode 100644 new mode 100755 index e7f2e4f7f7..48b7697356 --- a/app/Console/Commands/LdapSync.php +++ b/app/Console/Commands/LdapSync.php @@ -69,22 +69,55 @@ class LdapSync extends Command $results = Ldap::findLdapUsers(); + $ldap_ou_locations = Location::whereNotNull('ldap_ou')->get(); + + if (sizeof($ldap_ou_locations) > 0) { + LOG::debug('Some locations have special OUs set. Locations will be automatically set for users in those OUs.'); + } + + $results = Ldap::findLdapUsers(); + for ($i = 0; $i < $results["count"]; $i++) { + $results[$i]["ldap_location_override"] = false; + $results[$i]["location_id"] = 0; + } + if ($this->option('location')!='') { - $location = Location::where('name','=',$this->option('location'))->first(); + $location = Location::where('name', '=', $this->option('location'))->first(); LOG::debug('Location name '.$this->option('location').' passed'); LOG::debug('Importing to '.$location->name.' ('.$location->id.')'); } elseif ($this->option('location_id')!='') { - $location = Location::where('id','=',$this->option('location_id'))->first(); + $location = Location::where('id', '=', $this->option('location_id'))->first(); LOG::debug('Location ID '.$this->option('location_id').' passed'); LOG::debug('Importing to '.$location->name.' ('.$location->id.')'); } else { - $location = new Location; - } + $location = NULL; + } if (!isset($location)) { - LOG::debug('That location is invalid, so no location will be assigned.'); + LOG::debug('That location is invalid or a location was not provided, so no location will be assigned by default.'); } + // Grab subsets based on location-specific DNs, and overwrite location for these users. + foreach ($ldap_ou_locations as $ldap_loc) { + $location_users = Ldap::findLdapUsers($ldap_loc->ldap_ou); + $usernames = array(); + for ($i = 0; $i < $location_users["count"]; $i++) { + $location_users[$i]["ldap_location_override"] = true; + $location_users[$i]["location_id"] = $ldap_loc->id; + $usernames[] = $location_users[$i][$ldap_result_username][0]; + } + + // Delete located users from the general group. + foreach ($results as $key => $generic_entry) { + if (in_array($generic_entry[$ldap_result_username][0], $usernames)) { + unset($results[$key]); + } + } + + $global_count = $results['count']; + $results = array_merge($location_users, $results); + $results['count'] = $global_count; + } $tmp_pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); $pass = bcrypt($tmp_pass); @@ -99,6 +132,9 @@ class LdapSync extends Command $item["lastname"] = isset($results[$i][$ldap_result_last_name][0]) ? $results[$i][$ldap_result_last_name][0] : ""; $item["firstname"] = isset($results[$i][$ldap_result_first_name][0]) ? $results[$i][$ldap_result_first_name][0] : ""; $item["email"] = isset($results[$i][$ldap_result_email][0]) ? $results[$i][$ldap_result_email][0] : "" ; + $item["ldap_location_override"] = isset($results[$i]["ldap_location_override"]) ? $results[$i]["ldap_location_override"]:""; + $item["location_id"] = isset($results[$i]["location_id"]) ? $results[$i]["location_id"]:""; + // User exists $item["createorupdate"] = 'updated'; @@ -118,7 +154,9 @@ class LdapSync extends Command $user->employee_num = e($item["employee_number"]); $user->activated = 1; - if ($location) { + if ($item['ldap_location_override'] == true) { + $user->location_id = $item['location_id']; + } else if ($location) { $user->location_id = e($location->id); } @@ -146,7 +184,7 @@ class LdapSync extends Command if ($this->option('summary')) { for ($x = 0; $x < count($summary); $x++) { if ($summary[$x]['status']=='error') { - $this->error('ERROR: '.$summary[$x]['firstname'].' '.$summary[$x]['lastname'].' (username: '.$summary[$x]['username'].' was not imported: '.$summary[$x]['note'] ); + $this->error('ERROR: '.$summary[$x]['firstname'].' '.$summary[$x]['lastname'].' (username: '.$summary[$x]['username'].' was not imported: '.$summary[$x]['note']); } else { $this->info('User '.$summary[$x]['firstname'].' '.$summary[$x]['lastname'].' (username: '.$summary[$x]['username'].' was '.strtoupper($summary[$x]['createorupdate']).'.'); } @@ -159,6 +197,4 @@ class LdapSync extends Command } - - } diff --git a/app/Console/Commands/LicenseImportCommand.php b/app/Console/Commands/LicenseImportCommand.php deleted file mode 100644 index ffa55ff007..0000000000 --- a/app/Console/Commands/LicenseImportCommand.php +++ /dev/null @@ -1,383 +0,0 @@ -argument('filename'); - - - if (!$this->option('testrun')=='true') { - $this->comment('======= Importing Licenses from '.$filename.' ========='); - } else { - $this->comment('====== TEST ONLY License Import for '.$filename.' ===='); - $this->comment('============== NO DATA WILL BE WRITTEN =============='); - } - - if (! ini_get("auto_detect_line_endings")) { - ini_set("auto_detect_line_endings", '1'); - } - - $csv = Reader::createFromPath($this->argument('filename')); - $csv->setNewline("\r\n"); - $csv->setOffset(1); - $duplicates = ''; - - // Loop through the records - $nbInsert = $csv->each(function ($row) use ($duplicates) { - $status_id = 1; - - // Let's just map some of these entries to more user friendly words - - if (array_key_exists('0', $row)) { - $user_name = trim($row[0]); - } else { - $user_name = ''; - } - - if (array_key_exists('1', $row)) { - $user_email = trim($row[1]); - } else { - $user_email = ''; - } - - if (array_key_exists('2', $row)) { - $user_username = trim($row[2]); - } else { - $user_username = ''; - } - - if (array_key_exists('3', $row)) { - $user_license_name = trim($row[3]); - } else { - $user_license_name = ''; - } - - if (array_key_exists('4', $row)) { - $user_license_serial = trim($row[4]); - } else { - $user_license_serial = ''; - } - - if (array_key_exists('5', $row)) { - $user_licensed_to_name = trim($row[5]); - } else { - $user_licensed_to_name = ''; - } - - if (array_key_exists('6', $row)) { - $user_licensed_to_email = trim($row[6]); - } else { - $user_licensed_to_email = ''; - } - - if (array_key_exists('7', $row)) { - $user_license_seats = trim($row[7]); - } else { - $user_license_seats = ''; - } - - if (array_key_exists('8', $row)) { - $user_license_reassignable = trim($row[8]); - if ($user_license_reassignable!='') { - if ((strtolower($user_license_reassignable)=='yes') || (strtolower($user_license_reassignable)=='true') || ($user_license_reassignable=='1')) { - $user_license_reassignable = 1; - } - } else { - $user_license_reassignable = 0; - } - } else { - $user_license_reassignable = 0; - } - - if (array_key_exists('9', $row)) { - $user_license_supplier = trim($row[9]); - } else { - $user_license_supplier = ''; - } - - if (array_key_exists('10', $row)) { - $user_license_maintained = trim($row[10]); - - if ($user_license_maintained!='') { - if ((strtolower($user_license_maintained)=='yes') || (strtolower($user_license_maintained)=='true') || ($user_license_maintained=='1')) { - $user_license_maintained = 1; - } - } else { - $user_license_maintained = 0; - } - - - } else { - $user_license_maintained = ''; - } - - if (array_key_exists('11', $row)) { - $user_license_notes = trim($row[11]); - } else { - $user_license_notes = ''; - } - - if (array_key_exists('12', $row)) { - if ($row[12]!='') { - $user_license_purchase_date = date("Y-m-d 00:00:01", strtotime($row[12])); - } else { - $user_license_purchase_date = ''; - } - } else { - $user_license_purchase_date = 0; - } - - // A number was given instead of a name - if (is_numeric($user_name)) { - $this->comment('User '.$user_name.' is not a name - assume this user already exists'); - $user_username = ''; - // No name was given - - } elseif ($user_name=='') { - $this->comment('No user data provided - skipping user creation, just adding license'); - $first_name = ''; - $last_name = ''; - $user_username = ''; - - } else { - - $name = explode(" ", $user_name); - $first_name = $name[0]; - $email_last_name = ''; - $email_prefix = $first_name; - - if (!array_key_exists(1, $name)) { - $last_name=''; - $email_last_name = $last_name; - $email_prefix = $first_name; - } else { - $last_name = str_replace($first_name, '', $user_name); - - if ($this->option('email_format')=='filastname') { - $email_last_name.=str_replace(' ', '', $last_name); - $email_prefix = $first_name[0].$email_last_name; - - } elseif ($this->option('email_format')=='firstname.lastname') { - $email_last_name.=str_replace(' ', '', $last_name); - $email_prefix = $first_name.'.'.$email_last_name; - - } elseif ($this->option('email_format')=='firstname') { - $email_last_name.=str_replace(' ', '', $last_name); - $email_prefix = $first_name; - } - - - } - - - $user_username = $email_prefix; - - // Generate an email based on their name if no email address is given - if ($user_email=='') { - if ($first_name=='Unknown') { - $status_id = 7; - } - $email = strtolower($email_prefix).'@'.$this->option('domain'); - $user_email = str_replace("'", '', $email); - } - } - - $this->comment('Full Name: '.$user_name); - $this->comment('First Name: '.$first_name); - $this->comment('Last Name: '.$last_name); - $this->comment('Username: '.$user_username); - $this->comment('Email: '.$user_email); - $this->comment('License Name: '.$user_license_name); - $this->comment('Serial No: '.$user_license_serial); - $this->comment('Licensed To Name: '.$user_licensed_to_name); - $this->comment('Licensed To Email: '.$user_licensed_to_email); - $this->comment('Seats: '.$user_license_seats); - $this->comment('Reassignable: '.$user_license_reassignable); - $this->comment('Supplier: '.$user_license_supplier); - $this->comment('Maintained: '.$user_license_maintained); - $this->comment('Notes: '.$user_license_notes); - $this->comment('Purchase Date: '.$user_license_purchase_date); - - $this->comment('------------- Action Summary ----------------'); - - if ($user_username!='') { - if ($user = User::where('username', $user_username)->whereNotNull('username')->first()) { - $this->comment('User '.$user_username.' already exists'); - } else { - - $user = new \App\Models\User; - $password = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); - - $user->first_name = $first_name; - $user->last_name = $last_name; - $user->username = $user_username; - $user->email = $user_email; - $user->permissions = '{user":1}'; - $user->password = bcrypt($password); - $user->activated = 1; - if ($user->save()) { - $this->comment('User '.$first_name.' created'); - } else { - $this->error('ERROR CREATING User '.$first_name.' '.$last_name); - $this->error($user->getErrors()); - } - - $this->comment('User '.$first_name.' created'); - } - } else { - $user = new User; - $user->user_id = null; - } - - - // Check for the supplier match and create it if it doesn't exist - if ($supplier = Supplier::where('name', $user_license_supplier)->first()) { - $this->comment('Supplier '.$user_license_supplier.' already exists'); - } else { - $supplier = new Supplier(); - $supplier->name = e($user_license_supplier); - $supplier->user_id = 1; - - if ($supplier->save()) { - $this->comment('Supplier '.$user_license_supplier.' was created'); - } else { - $this->comment('Something went wrong! Supplier '.$user_license_supplier.' was NOT created'); - } - - } - - - // Add the license - $license = new License(); - $license->name = e($user_license_name); - if ($user_license_purchase_date!='') { - $license->purchase_date = $user_license_purchase_date; - } else { - $license->purchase_date = null; - } - $license->serial = e($user_license_serial); - $license->seats = e($user_license_seats); - $license->supplier_id = $supplier->id; - $license->user_id = 1; - if ($user_license_purchase_date!='') { - $license->purchase_date = $user_license_purchase_date; - } else { - $license->purchase_date = null; - } - $license->license_name = $user_licensed_to_name; - $license->license_email = $user_licensed_to_email; - $license->notes = e($user_license_notes); - - if ($license->save()) { - $this->comment('License '.$user_license_name.' with serial number '.$user_license_serial.' was created'); - - - $license_seat_created = 0; - - for ($x = 0; $x < $user_license_seats; $x++) { - // Create the license seat entries - $license_seat = new LicenseSeat(); - $license_seat->license_id = $license->id; - - // Only assign the first seat to the user - if ($x==0) { - $license_seat->assigned_to = $user->id; - } else { - $license_seat->assigned_to = null; - } - - if ($license_seat->save()) { - $license_seat_created++; - } - } - - if ($license_seat_created > 0) { - $this->comment($license_seat_created.' seats were created'); - } else { - $this->comment('Something went wrong! NO seats for '.$user_license_name.' were created'); - } - - - - } else { - $this->comment('Something went wrong! License '.$user_license_name.' was NOT created'); - } - - - $this->comment('====================================='); - - return true; - - }); - - - } - - /** - * Get the console command arguments. - * - * @return array - */ - protected function getArguments() - { - return array( - array('filename', InputArgument::REQUIRED, 'File for the CSV import.'), - ); - } - - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return array( - array('domain', null, InputOption::VALUE_REQUIRED, 'Email domain for generated email addresses.', null), - array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null), - array('testrun', null, InputOption::VALUE_REQUIRED, 'Test the output without writing to the database or not.', null), - ); - } -} diff --git a/app/Console/Commands/ObjectImportCommand.php b/app/Console/Commands/ObjectImportCommand.php index c777a35809..07dfd5aeaf 100644 --- a/app/Console/Commands/ObjectImportCommand.php +++ b/app/Console/Commands/ObjectImportCommand.php @@ -2,6 +2,10 @@ namespace App\Console\Commands; use App\Helpers\Helper; +use App\Importer\AccessoryImporter; +use App\Importer\AssetImporter; +use App\Importer\ConsumableImporter; +use App\Importer\Importer; use App\Models\Accessory; use App\Models\Asset; use App\Models\AssetModel; @@ -55,7 +59,7 @@ class ObjectImportCommand extends Command { parent::__construct(); } - + private $bar; /** * Execute the console command. * @@ -64,200 +68,61 @@ class ObjectImportCommand extends Command public function fire() { $filename = $this->argument('filename'); + $class = title_case($this->option('item-type')); + $classString = "App\\Importer\\{$class}Importer"; + $importer = new $classString($filename); + $importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback']) + ->setUserId($this->option('user_id')) + ->setUpdating($this->option('update')) + ->setUsernameFormat($this->option('username_format')); - $tmp_password = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); - $password = bcrypt($tmp_password); - - $this->updating = $this->option('update'); - if (!$this->option('web-importer')) { - $logFile = $this->option('logfile'); - \Log::useFiles($logFile); - if ($this->option('testrun')) { - $this->comment('====== TEST ONLY Asset Import for '.$filename.' ===='); - $this->comment('============== NO DATA WILL BE WRITTEN =============='); - } else { - - $this->comment('======= Importing Assets from '.$filename.' ========='); - } + $logFile = $this->option('logfile'); + \Log::useFiles($logFile); + if ($this->option('testrun')) { + $this->comment('====== TEST ONLY Item Import for '.$filename.' ===='); + $this->comment('============== NO DATA WILL BE WRITTEN =============='); + } else { + $this->comment('======= Importing Items from '.$filename.' ========='); } + $importer->import(); - if (! ini_get("auto_detect_line_endings")) { - ini_set("auto_detect_line_endings", '1'); - } + $this->bar = null; - $csv = Reader::createFromPath($this->argument('filename')); - $csv->setNewline("\r\n"); - $results = $csv->fetchAssoc(); - $newarray = null; - - foreach ($results as $index => $arraytoNormalize) { - $internalnewarray = array_change_key_case($arraytoNormalize); - $newarray[$index] = $internalnewarray; - } - - - - $this->locations = Location::All(['name', 'id']); - $this->categories = Category::All(['name', 'category_type', 'id']); - $this->manufacturers = Manufacturer::All(['name', 'id']); - $this->asset_models = AssetModel::All(['name','model_number','category_id','manufacturer_id', 'id']); - $this->companies = Company::All(['name', 'id']); - $this->status_labels = Statuslabel::All(['name', 'id']); - $this->suppliers = Supplier::All(['name', 'id']); - switch (strtolower($this->option('item-type'))) { - case "asset": - $this->assets = Asset::all(); - break; - case "accessory": - $this->accessories = Accessory::All(); - break; - case "consumable": - $this->consumables = Consumable::All(); - break; - } - $this->customfields = CustomField::All(['name']); - $bar = null; - - if (!$this->option('web-importer')) { - $bar = $this->output->createProgressBar(count($newarray)); - } - // Loop through the records - DB::transaction(function () use (&$newarray, $bar, $password) { - Model::unguard(); - $item_type = strtolower($this->option('item-type')); - - - - foreach ($newarray as $row) { - - // Let's just map some of these entries to more user friendly words - - // Fetch general items here, fetch item type specific items in respective methods - /** @var Asset, License, Accessory, or Consumable $item_type */ - - $item_category = $this->array_smart_fetch($row, "category"); - $item_company_name = $this->array_smart_fetch($row, "company"); - $item_location = $this->array_smart_fetch($row, "location"); - $item_manufacturer = $this->array_smart_fetch($row, "manufacturer"); - $item_status_name = $this->array_smart_fetch($row, "status"); - - $item["item_name"] = $this->array_smart_fetch($row, "item name"); - if ($this->array_smart_fetch($row, "purchase date")!='') { - $item["purchase_date"] = date("Y-m-d 00:00:01", strtotime($this->array_smart_fetch($row, "purchase date"))); - } else { - $item["purchase_date"] = null; - } - - $item["purchase_cost"] = $this->array_smart_fetch($row, "purchase cost"); - $item["order_number"] = $this->array_smart_fetch($row, "order number"); - $item["notes"] = $this->array_smart_fetch($row, "notes"); - $item["quantity"] = $this->array_smart_fetch($row, "quantity"); - $item["requestable"] = $this->array_smart_fetch($row, "requestable"); - $item["asset_tag"] = $this->array_smart_fetch($row, "asset tag"); - - - $this->current_assetId = $item["item_name"]; - if ($item["asset_tag"] != '') { - $this->current_assetId = $item["asset_tag"]; - } - $this->log('Category: ' . $item_category); - $this->log('Location: ' . $item_location); - $this->log('Manufacturer: ' . $item_manufacturer); - $this->log('Purchase Date: ' . $item["purchase_date"]); - $this->log('Purchase Cost: ' . $item["purchase_cost"]); - $this->log('Company Name: ' . $item_company_name); - $this->log('Status: ' . $item_status_name); - - - $item["user"] = $this->createOrFetchUser($row, $password); - - if (!($this->updating && empty($item_location))) { - $item["location"] = $this->createOrFetchLocation($item_location); - } - if (!($this->updating && empty($item_category))) { - $item["category"] = $this->createOrFetchCategory($item_category, $item_type); - } - if (!($this->updating && empty($item_manufacturer))) { - $item["manufacturer"] = $this->createOrFetchManufacturer($item_manufacturer); - } - if (!($this->updating && empty($item_company_name))) { - $item["company"] = $this->createOrFetchCompany($item_company_name); - } - - if (!($this->updating && empty($item_status_name))) { - $item["status_label"] = $this->createOrFetchStatusLabel($item_status_name); - } - - switch ($item_type) { - case "asset": - // ----------------------------- - // CUSTOM FIELDS - // ----------------------------- - // Loop through custom fields in the database and see if we have any matches in the CSV - foreach ($this->customfields as $customfield) { - if ($item['custom_fields'][$customfield->db_column_name()] = $this->array_smart_custom_field_fetch($row, $customfield)) { - $this->log('Custom Field '. $customfield->name.': '.$this->array_smart_custom_field_fetch($row, $customfield)); - } - - } - - $this->createAssetIfNotExists($row, $item); - break; - case "accessory": - $this->createAccessoryIfNotExists($item); - break; - case 'consumable': - $this->createConsumableIfNotExists($item); - break; - } - - if (!$this->option('web-importer')) { - $bar->advance(); - } - $this->log('------------- Action Summary ----------------'); - - } - }); - if (!$this->option('web-importer')) { - $bar->finish(); - } - - - $this->log('====================================='); - if (!$this->option('web-importer')) { - if (!empty($this->errors)) { - $this->comment("The following Errors were encountered."); - foreach ($this->errors as $asset => $error) { - $this->comment('Error: Item: ' . $asset . 'failed validation: ' . json_encode($error)); - } - } else { - $this->comment("All Items imported successfully!"); + if (!empty($this->errors)) { + $this->comment("The following Errors were encountered."); + foreach ($this->errors as $asset => $error) { + $this->comment('Error: Item: ' . $asset . ' failed validation: ' . json_encode($error)); } } else { - if (empty($this->errors)) { - return 0; - } else { - $this->comment(json_encode($this->errors)); //Send a big string to the - return 1; - } + $this->comment("All Items imported successfully!"); } - $this->comment(""); + $this->comment(""); - return 2; + return; + } + + public function errorCallback($item, $field, $errorString) + { + $this->errors[$item->name][$field] = $errorString; + } + public function progress($count) + { + if (!$this->bar) { + $this->bar = $this->output->createProgressBar($count); + } + static $index =0; + $index++; + if ($index < $count) { + $this->bar->advance(); + } else { + $this->bar->finish(); + } } // Tracks the current item for error messages - private $current_assetId; private $updating; // An array of errors encountered while parsing private $errors; - public function jsonError($field, $errorString) - { - $this->errors[$this->current_assetId][$field] = $errorString; - if ($this->option('verbose')) { - parent::error($field . $errorString); - } - } /** * Log a message to file, configurable by the --log-file parameter. @@ -268,11 +133,8 @@ class ObjectImportCommand extends Command * @param string $string * @param string $level */ - private function log($string, $level = 'info') + public function log($string, $level = 'info') { - if ($this->option('web-importer')) { - return; - } if ($level === 'warning') { \Log::warning($string); $this->comment($string); @@ -283,792 +145,6 @@ class ObjectImportCommand extends Command } } } - - /** - * Check to see if the given key exists in the array, and trim excess white space before returning it - * - * @author Daniel Melzter - * @since 3.0 - * @param $array array - * @param $key string - * @param $default string - * @return string - */ - public function array_smart_fetch(array $array, $key, $default = '') - { - return array_key_exists(trim($key), $array) ? e(Encoding::fixUTF8(trim($array[ $key ]))) : $default; - } - - - /** - * Figure out the fieldname of the custom field - * - * @author A. Gianotto - * @since 3.0 - * @param $array array - * @return string - */ - public function array_smart_custom_field_fetch(array $array, $key) - { - $index_name = strtolower($key->name); - return array_key_exists($index_name, $array) ? e(trim($array[$index_name])) : ''; - } - - - - private $asset_models; - /** - * Select the asset model if it exists, otherwise create it. - * - * @author Daniel Melzter - * @since 3.0 - * @param array - * @param $category Category - * @param $manufacturer Manufacturer - * @return Model - * @internal param $asset_modelno string - */ - public function createOrFetchAssetModel(array $row, $category, $manufacturer) - { - - $asset_model_name = $this->array_smart_fetch($row, "model name"); - $asset_modelno = $this->array_smart_fetch($row, "model number"); - if ((empty($asset_model_name)) && (!empty($asset_modelno))) { - $asset_model_name = $asset_modelno; - } elseif ((empty($asset_model_name)) && (empty($asset_modelno))) { - $asset_model_name ='Unknown'; - } - if (empty($asset_modelno)) { - $asset_modelno=''; - } - $this->log('Model Name: ' . $asset_model_name); - $this->log('Model No: ' . $asset_modelno); - - $asset_model = null; - $editingModel = false; - foreach ($this->asset_models as $tempmodel) { - if (strcasecmp($tempmodel->name, $asset_model_name) == 0 - && $tempmodel->model_number == $asset_modelno) { - $this->log('A matching model ' . $asset_model_name . ' already exists'); - if (!$this->option('update')) { - return $tempmodel; - } - $this->log('Updating matching model with new values'); - $editingModel = true; - $asset_model = $tempmodel; - } - } - if (is_null($asset_model)) { - $this->log("No Matching Model, Creating a new one"); - $asset_model = new AssetModel(); - } - if (($editingModel && (!$asset_model_name === "Unknown")) || (!$editingModel)) { - $asset_model->name = $asset_model_name; - } - isset($manufacturer) && $manufacturer->exists && $asset_model->manufacturer_id = $manufacturer->id; - isset($asset_modelno) && $asset_model->model_number = $asset_modelno; - if (isset($category) && $category->exists) { - $asset_model->category_id = $category->id; - } - $asset_model->user_id = $this->option('user_id'); - - if (!$editingModel) { - $this->asset_models->add($asset_model); - } - if (!$this->option('testrun')) { - if ($asset_model->save()) { - $this->log('Asset Model ' . $asset_model_name . ' with model number ' . $asset_modelno . ' was created'); - return $asset_model; - } else { - $this->jsonError('Asset Model "' . $asset_model_name . '"', $asset_model->getErrors()); - $this->log('Asset Model "' . $asset_model_name . '"', $asset_model->getErrors()); - return $asset_model; - } - } else { - $this->asset_models->add($asset_model); - return $asset_model; - } - - } - - private $categories; - - /** - * Finds a category with the same name and item type in the database, otherwise creates it - * - * @author Daniel Melzter - * @since 3.0 - * @param $asset_category string - * @param $item_type string - * @return Category - */ - public function createOrFetchCategory($asset_category, $item_type) - { - if (empty($asset_category)) { - $asset_category = 'Unnamed Category'; - } - - foreach ($this->categories as $tempcategory) { - if ((strcasecmp($tempcategory->name, $asset_category) == 0) && $tempcategory->category_type === $item_type) { - $this->log('Category ' . $asset_category . ' already exists'); - return $tempcategory; - } - } - - $category = new Category(); - - $category->name = $asset_category; - $category->category_type = $item_type; - $category->user_id = $this->option('user_id'); - - - if (!$this->option('testrun')) { - if ($category->save()) { - $this->categories->add($category); - $this->log('Category ' . $asset_category . ' was created'); - return $category; - } else { - $this->jsonError('Category "'. $asset_category. '"', $category->getErrors()); - return $category; - } - } else { - $this->categories->add($category); - return $category; - } - - } - - private $companies; - - /** - * Fetch an existing company, or create new if it doesn't exist - * - * @author Daniel Melzter - * @since 3.0 - * @param $asset_company_name string - * @return Company - */ - public function createOrFetchCompany($asset_company_name) - { - foreach ($this->companies as $tempcompany) { - if (strcasecmp($tempcompany->name, $asset_company_name) == 0) { - $this->log('A matching Company ' . $asset_company_name . ' already exists'); - return $tempcompany; - } - } - - $company = new Company(); - $company->name = $asset_company_name; - - if (!$this->option('testrun')) { - if ($company->save()) { - $this->companies->add($company); - $this->log('Company ' . $asset_company_name . ' was created'); - return $company; - } else { - $this->log('Company', $company->getErrors()); - } - } else { - $this->companies->add($company); - return $company; - } - } - private $status_labels; - /** - * Fetch the existing status label or create new if it doesn't exist. - * - * @author Daniel Melzter - * @since 3.0 - * @param string $asset_statuslabel_name - * @return Company - */ - public function createOrFetchStatusLabel($asset_statuslabel_name) - { - if (empty($asset_statuslabel_name)) { - return; - } - foreach ($this->status_labels as $tempstatus) { - if (strcasecmp($tempstatus->name, $asset_statuslabel_name) == 0) { - $this->log('A matching Status ' . $asset_statuslabel_name . ' already exists'); - return $tempstatus; - } - } - $status = new Statuslabel(); - $status->name = $asset_statuslabel_name; - - $status->deployable = 1; - $status->pending = 0; - $status->archived = 0; - - - if (!$this->option('testrun')) { - if ($status->save()) { - $this->status_labels->add($status); - $this->log('Status ' . $asset_statuslabel_name . ' was created'); - return $status; - } else { - $this->jsonError('Status "'. $asset_statuslabel_name . '"', $status->getErrors()); - return $status; - } - } else { - $this->status_labels->add($status); - return $status; - } - } - - private $manufacturers; - - /** - * Finds a manufacturer with matching name, otherwise create it. - * - * @author Daniel Melzter - * @since 3.0 - * @param $item_manufacturer string - * @return Manufacturer - */ - - public function createOrFetchManufacturer($item_manufacturer) - { - - if (empty($item_manufacturer)) { - $item_manufacturer='Unknown'; - } - - foreach ($this->manufacturers as $tempmanufacturer) { - if (strcasecmp($tempmanufacturer->name, $item_manufacturer) == 0) { - $this->log('Manufacturer ' . $item_manufacturer . ' already exists') ; - return $tempmanufacturer; - } - } - - //Otherwise create a manufacturer. - - $manufacturer = new Manufacturer(); - $manufacturer->name = $item_manufacturer; - $manufacturer->user_id = $this->option('user_id'); - - if (!$this->option('testrun')) { - if ($manufacturer->save()) { - $this->manufacturers->add($manufacturer); - $this->log('Manufacturer ' . $manufacturer->name . ' was created'); - return $manufacturer; - } else { - $this->jsonError('Manufacturer "'. $manufacturer->name . '"', $manufacturer->getErrors()); - return $manufacturer; - } - - } else { - $this->manufacturers->add($manufacturer); - return $manufacturer; - } - } - - /** - * @var - */ - private $locations; - /** - * Checks the DB to see if a location with the same name exists, otherwise create it - * - * @author Daniel Melzter - * @since 3.0 - * @param $asset_location string - * @return Location - */ - public function createOrFetchLocation($asset_location) - { - foreach ($this->locations as $templocation) { - if (strcasecmp($templocation->name, $asset_location) == 0) { - $this->log('Location ' . $asset_location . ' already exists'); - return $templocation; - } - } - // No matching locations in the collection, create a new one. - $location = new Location(); - - if (!empty($asset_location)) { - $location->name = $asset_location; - $location->address = ''; - $location->city = ''; - $location->state = ''; - $location->country = ''; - $location->user_id = $this->option('user_id'); - - if (!$this->option('testrun')) { - if ($location->save()) { - $this->locations->add($location); - $this->log('Location ' . $asset_location . ' was created'); - return $location; - } else { - $this->log('Location', $location->getErrors()) ; - return $location; - } - } else { - $this->locations->add($location); - return $location; - } - } else { - $this->log('No location given, so none created.'); - return $location; - } - - } - - private $suppliers; - - /** - * Fetch an existing supplier or create new if it doesn't exist - * - * @author Daniel Melzter - * @since 3.0 - * @param $row array - * @return Supplier - */ - public function createOrFetchSupplier($item_supplier) - { - if (empty($item_supplier)) { - $item_supplier='Unknown'; - } - foreach ($this->suppliers as $tempsupplier) { - if (strcasecmp($tempsupplier->name, $item_supplier) == 0) { - $this->log('A matching Supplier ' . $item_supplier . ' already exists'); - return $tempsupplier; - } - } - - $supplier = new Supplier(); - $supplier->name = $item_supplier; - $supplier->user_id = $this->option('user_id'); - - if (!$this->option('testrun')) { - if ($supplier->save()) { - $this->suppliers->add($supplier); - $this->log('Supplier ' . $item_supplier . ' was created'); - return $supplier; - } else { - $this->log('Supplier', $supplier->getErrors()); - return $supplier; - } - } else { - $this->suppliers->add($supplier); - return $supplier; - } - } - - /** - * Finds the user matching given data, or creates a new one if there is no match - * - * @author Daniel Melzter - * @since 3.0 - * @param $row array - * @return User Model w/ matching name - * @internal param string $user_username Username extracted from CSV - * @internal param string $user_email Email extracted from CSV - * @internal param string $first_name - * @internal param string $last_name - */ - public function createOrFetchUser($row, $password = null) - { - $user_name = $this->array_smart_fetch($row, "name"); - $user_email = $this->array_smart_fetch($row, "email"); - $user_username = $this->array_smart_fetch($row, "username"); - - // A number was given instead of a name - if (is_numeric($user_name)) { - $this->log('User '.$user_name.' is not a name - assume this user already exists'); - $user_username = ''; - $first_name = ''; - $last_name = ''; - - // No name was given - } elseif (empty($user_name)) { - $this->log('No user data provided - skipping user creation, just adding asset'); - $first_name = ''; - $last_name = ''; - //$user_username = ''; - } else { - $user_email_array = User::generateFormattedNameFromFullName(Setting::getSettings()->email_format, $user_name); - $first_name = $user_email_array['first_name']; - $last_name = $user_email_array['last_name']; - - if ($user_email=='') { - if (Setting::getSettings()->email_domain) { - $user_email = str_slug($user_email_array['username']).'@'.Setting::getSettings()->email_domain; - } else { - $user_email = ''; - } - - } - - if ($user_username=='') { - if ($this->option('username_format')=='email') { - $user_username = $user_email; - } else { - $user_name_array = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $user_name); - $user_username = $user_name_array['username']; - } - - } - - } - $this->log("--- User Data ---"); - $this->log('Full Name: ' . $user_name); - $this->log('First Name: ' . $first_name); - $this->log('Last Name: ' . $last_name); - $this->log('Username: ' . $user_username); - $this->log('Email: ' . $user_email); - $this->log('--- End User Data ---'); - - if ($this->option('testrun')) { - return new User; - } - - if (!empty($user_username)) { - if ($user = User::MatchEmailOrUsername($user_username, $user_email) - ->whereNotNull('username')->first()) { - - $this->log('User '.$user_username.' already exists'); - } elseif (( $first_name != '') && ($last_name != '') && ($user_username != '')) { - $user = new \App\Models\User; - $user->first_name = $first_name; - $user->last_name = $last_name; - $user->username = $user_username; - $user->email = $user_email; - $user->activated = 1; - $user->password = $password; - - if ($user->save()) { - $this->log('User '.$first_name.' created'); - } else { - $this->jsonError('User "' . $first_name . '"', $user->getErrors()); - } - - } else { - $user = new User; - } - } else { - $user = new User; - } - return $user; - } - - private $assets; - - /** - * Create the asset if it doesn't exist. - * - * @author Daniel Melzter - * @since 3.0 - * @param array $row - * @param array $item - */ - public function createAssetIfNotExists(array $row, array $item) - { - $asset = null; - $editingAsset = false; - foreach ($this->assets as $tempasset) { - if (strcasecmp($tempasset->asset_tag, $item['asset_tag']) == 0) { - $this->log('A matching Asset ' . $item['asset_tag'] . ' already exists'); - if (!$this->option('update')) { - $this->log("Skipping item."); - return; - } - $this->log('Updating matching asset with new values'); - $editingAsset = true; - $asset = $tempasset; - } - } - if (is_null($asset)) { - $this->log("No Matching Asset, Creating a new one"); - $asset = new Asset; - } - $asset_serial = $this->array_smart_fetch($row, "serial number"); - $asset_image = $this->array_smart_fetch($row, "image"); - $asset_warranty_months = intval($this->array_smart_fetch($row, "warranty months")); - if (empty($asset_warranty_months)) { - $asset_warranty_months = null; - } - // Check for the asset model match and create it if it doesn't exist - if (!($editingAsset && empty($this->array_smart_fetch($row, 'model name')))) { - // Ignore the asset_model - isset($item["category"]) || $item["category"] = new Category(); - isset($item["manufacturer"]) || $item["manufacturer"] = new Manufacturer(); - $asset_model = $this->createOrFetchAssetModel($row, $item["category"], $item["manufacturer"]); - } - $item_supplier = $this->array_smart_fetch($row, "supplier"); - // If we're editing, only update if value isn't empty - if (!($editingAsset && empty($item_supplier))) { - $supplier = $this->createOrFetchSupplier($item_supplier); - } - - $this->log('Serial No: '.$asset_serial); - $this->log('Asset Tag: '.$item['asset_tag']); - $this->log('Notes: '.$item["notes"]); - $this->log('Warranty Months: ' . $asset_warranty_months); - - - - if (isset($item["status_label"])) { - $status_id = $item["status_label"]->id; - } else if (!$editingAsset) { - // Assume if we are editing, we already have a status and can ignore. - // FIXME: We're already grabbing the list of statuses, we should probably not hardcode here - $this->log("No status field found, defaulting to id 1."); - $status_id = $this->status_labels->first()->id; - } - - if (!$editingAsset) { - $asset->asset_tag = $item['asset_tag']; // This doesn't need to be guarded for empty because it's the key we use to identify the asset. - } - if (!empty($item['item_name'])) { - $asset->name = $item["item_name"]; - } - if (!empty($item["purchase_date"])) { - $asset->purchase_date = $item["purchase_date"]; - } - - if (array_key_exists('custom_fields', $item)) { - foreach ($item['custom_fields'] as $custom_field => $val) { - $asset->{$custom_field} = $val; - } - } - - if (!empty($item["purchase_cost"])) { - //TODO How to generalize this for not USD? - $purchase_cost = substr($item["purchase_cost"], 0, 1) === '$' ? substr($item["purchase_cost"], 1) : $item["purchase_cost"]; - // $asset->purchase_cost = number_format($purchase_cost, 2, '.', ''); - $asset->purchase_cost = Helper::ParseFloat($purchase_cost); - $this->log("Asset cost parsed: " . $asset->purchase_cost); - } else { - $asset->purchase_cost = 0.00; - } - if (!empty($asset_serial)) { - $asset->serial = $asset_serial; - } - if (!empty($asset_warranty_months)) { - $asset->warranty_months = $asset_warranty_months; - } - - if (isset($asset_model)) { - $asset->model_id = $asset_model->id; - } - - if ($item["user"]) { - $asset->assigned_to = $item["user"]->id; - } - - if (isset($item["location"])) { - $asset->rtd_location_id = $item["location"]->id; - } - - $asset->user_id = $this->option('user_id'); - if (isset($status_id)) { - $asset->status_id = $status_id; - } - if (isset($item["company"])) { - $asset->company_id = $item["company"]->id; - } - if ($item["order_number"]) { - $asset->order_number = $item["order_number"]; - } - if (isset($supplier)) { - $asset->supplier_id = $supplier->id; - } - if ($item["notes"]) { - $asset->notes = $item["notes"]; - } - if (!empty($asset_image)) { - $asset->image = $asset_image; - } - if (!$editingAsset) { - $this->assets->add($asset); - } - if (!$this->option('testrun')) { - - if ($asset->save()) { - $asset->logCreate('Imported using csv importer'); - $this->log('Asset ' . $item["item_name"] . ' with serial number ' . $asset_serial . ' was created'); - } else { - $this->jsonError('Asset', $asset->getErrors()); - } - - } else { - return; - } - } - - private $accessories; - - /** - * Create an accessory if a duplicate does not exist - * - * @author Daniel Melzter - * @since 3.0 - * @param $item array - */ - public function createAccessoryIfNotExists(array $item) - { - $accessory = null; - $editingAccessory = false; - $this->log("Creating Accessory"); - foreach ($this->accessories as $tempaccessory) { - if (strcasecmp($tempaccessory->name, $item["item_name"]) == 0) { - $this->log('A matching Accessory ' . $item["item_name"] . ' already exists. '); - if (!$this->option('update')) { - $this->log("Skipping accessory."); - return; - } - $this->log('Updating matching accessory with new values'); - $editingAccessory = true; - $accessory = $tempaccessory; - } - } - if (is_null($accessory)) { - $this->log("No Matching Accessory, Creating a new one"); - $accessory = new Accessory(); - } - - if (!$editingAccessory) { - $accessory->name = $item["item_name"]; - } - - if (!empty($item["purchase_date"])) { - $accessory->purchase_date = $item["purchase_date"]; - } else { - $accessory->purchase_date = null; - } - if (!empty($item["purchase_cost"])) { - $accessory->purchase_cost = Helper::ParseFloat($item["purchase_cost"]); - } - - if (isset($item["location"])) { - $accessory->location_id = $item["location"]->id; - } - $accessory->user_id = $this->option('user_id'); - if (isset($item["company"])) { - $accessory->company_id = $item["company"]->id; - } - if (!empty($item["order_number"])) { - $accessory->order_number = $item["order_number"]; - } - if (isset($item["category"])) { - $accessory->category_id = $item["category"]->id; - } - - //TODO: Implement -// $accessory->notes = e($item_notes); - if (!empty($item["requestable"])) { - $accessory->requestable = filter_var($item["requestable"], FILTER_VALIDATE_BOOLEAN); - } - - //Must have at least zero of the item if we import it. - if (!empty($item["quantity"])) { - if ($item["quantity"] > -1) { - $accessory->qty = $item["quantity"]; - } else { - $accessory->qty = 1; - } - } - - if (!$this->option('testrun')) { - if ($accessory->save()) { - $accessory->logCreate('Imported using CSV Importer'); - $this->log('Accessory ' . $item["item_name"] . ' was created'); - // $this->comment('Accessory ' . $item["item_name"] . ' was created'); - - } else { - $this->jsonError('Accessory', $accessory->getErrors()) ; - } - } else { - $this->log('TEST RUN - Accessory ' . $item["item_name"] . ' not created'); - } - } - - private $consumables; - - /** - * Create a consumable if a duplicate does not exist - * - * @author Daniel Melzter - * @since 3.0 - * @param $item array - */ - public function createConsumableIfNotExists(array $item) - { - $consumable = null; - $editingConsumable = false; - $this->log("Creating Consumable"); - foreach ($this->consumables as $tempconsumable) { - if (strcasecmp($tempconsumable->name, $item["item_name"]) == 0) { - $this->log("A matching consumable " . $item["item_name"] . " already exists"); - if (!$this->option('update')) { - $this->log("Skipping consumable."); - return; - } - $this->log('Updating matching consumable with new values'); - $editingConsumable = true; - $consumable = $tempconsumable; - } - } - - if (is_null($consumable)) { - $this->log("No matching consumable, creating one"); - $consumable = new Consumable(); - } - if (!$editingConsumable) { - $consumable->name = $item["item_name"]; - } - if (!empty($item["purchase_date"])) { - $consumable->purchase_date = $item["purchase_date"]; - } else { - $consumable->purchase_date = null; - } - - if (!empty($item["purchase_cost"])) { - $consumable->purchase_cost = Helper::ParseFloat($item["purchase_cost"]); - } - if (isset($item["location"])) { - $consumable->location_id = $item["location"]->id; - } - $consumable->user_id = $this->option('user_id'); - if (isset($item["company"])) { - $consumable->company_id = $item["company"]->id; - } - if (!empty($item["order_number"])) { - $consumable->order_number = $item["order_number"]; - } - if (isset($item["category"])) { - $consumable->category_id = $item["category"]->id; - } - // TODO:Implement - //$consumable->notes= e($item_notes); - if (!empty($item["requestable"])) { - $consumable->requestable = filter_var($item["requestable"], FILTER_VALIDATE_BOOLEAN); - } - - if (!empty($item["quantity"])) { - if ($item["quantity"] > -1) { - $consumable->qty = $item["quantity"]; - } else { - $consumable->qty = 1; - } - } - - if (!$this->option("testrun")) { - // dd($consumable); - if ($consumable->save()) { - $consumable->logCreate('Imported using CSV Importer'); - $this->log("Consumable " . $item["item_name"] . ' was created'); - // $this->comment("Consumable " . $item["item_name"] . ' was created'); - - } else { - $this->jsonError('Consumable', $consumable->getErrors()); - } - } else { - $this->log('TEST RUN - Consumable ' . $item['item_name'] . ' not created'); - } - } - /** * Get the console command arguments. * @@ -1096,9 +172,8 @@ class ObjectImportCommand extends Command return array( array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null), array('username_format', null, InputOption::VALUE_REQUIRED, 'The format of the username that should be generated. Options are firstname.lastname, firstname, filastname, email', null), - array('testrun', null, InputOption::VALUE_NONE, 'If set, will parse and output data without adding to database', null), array('logfile', null, InputOption::VALUE_REQUIRED, 'The path to log output to. storage/logs/importer.log by default', storage_path('logs/importer.log') ), - array('item-type', null, InputOption::VALUE_REQUIRED, 'Item Type To import. Valid Options are Asset, Consumable, Or Accessory', 'Asset'), + array('item-type', null, InputOption::VALUE_REQUIRED, 'Item Type To import. Valid Options are Asset, Consumable, Accessory, License, or User', 'Asset'), array('web-importer', null, InputOption::VALUE_NONE, 'Internal: packages output for use with the web importer'), array('user_id', null, InputOption::VALUE_REQUIRED, 'ID of user creating items', 1), array('update', null, InputOption::VALUE_NONE, 'If a matching item is found, update item information'), diff --git a/app/Console/Commands/PaveIt.php b/app/Console/Commands/PaveIt.php index 185f6b4ef6..35b6b03a9b 100644 --- a/app/Console/Commands/PaveIt.php +++ b/app/Console/Commands/PaveIt.php @@ -2,9 +2,6 @@ namespace App\Console\Commands; -use Illuminate\Console\Command; -use DB; - use App\Models\Accessory; use App\Models\Asset; use App\Models\AssetModel; @@ -12,14 +9,18 @@ use App\Models\Category; use App\Models\Company; use App\Models\Component; use App\Models\Consumable; +use App\Models\Department; use App\Models\Depreciation; use App\Models\Group; +use App\Models\Import; use App\Models\License; use App\Models\LicenseSeat; use App\Models\Location; use App\Models\Manufacturer; use App\Models\Statuslabel; use App\Models\Supplier; +use DB; +use Illuminate\Console\Command; class PaveIt extends Command { @@ -63,6 +64,7 @@ class PaveIt extends Command Company::getQuery()->delete(); Component::getQuery()->delete(); Consumable::getQuery()->delete(); + Department::getQuery()->delete(); Depreciation::getQuery()->delete(); License::getQuery()->delete(); LicenseSeat::getQuery()->delete(); @@ -72,6 +74,7 @@ class PaveIt extends Command Statuslabel::getQuery()->delete(); Supplier::getQuery()->delete(); Group::getQuery()->delete(); + Import::getQuery()->delete(); DB::statement('delete from accessories_users'); DB::statement('delete from asset_logs'); @@ -107,6 +110,7 @@ class PaveIt extends Command \DB::statement('drop table IF EXISTS custom_fields'); \DB::statement('drop table IF EXISTS custom_fieldsets'); \DB::statement('drop table IF EXISTS depreciations'); + \DB::statement('drop table IF EXISTS departments'); \DB::statement('drop table IF EXISTS groups'); \DB::statement('drop table IF EXISTS history'); \DB::statement('drop table IF EXISTS components'); @@ -117,6 +121,11 @@ class PaveIt extends Command \DB::statement('drop table IF EXISTS manufacturers'); \DB::statement('drop table IF EXISTS models'); \DB::statement('drop table IF EXISTS migrations'); + \DB::statement('drop table IF EXISTS oauth_access_tokens'); + \DB::statement('drop table IF EXISTS oauth_auth_codes'); + \DB::statement('drop table IF EXISTS oauth_clients'); + \DB::statement('drop table IF EXISTS oauth_personal_access_clients'); + \DB::statement('drop table IF EXISTS oauth_refresh_tokens'); \DB::statement('drop table IF EXISTS password_resets'); \DB::statement('drop table IF EXISTS requested_assets'); \DB::statement('drop table IF EXISTS requests'); @@ -126,6 +135,7 @@ class PaveIt extends Command \DB::statement('drop table IF EXISTS throttle'); \DB::statement('drop table IF EXISTS users_groups'); \DB::statement('drop table IF EXISTS users'); + \DB::statement('drop table IF EXISTS imports'); } } } diff --git a/app/Console/Commands/Purge.php b/app/Console/Commands/Purge.php index 8abe6048c9..d5f7cab503 100644 --- a/app/Console/Commands/Purge.php +++ b/app/Console/Commands/Purge.php @@ -65,7 +65,7 @@ class Purge extends Command $asset_maintenances = 0; foreach ($assets as $asset) { - $this->info('- Asset "'.$asset->showAssetName().'" deleted.'); + $this->info('- Asset "'.$asset->present()->name().'" deleted.'); $asset_assoc += $asset->assetlog()->count(); $asset->assetlog()->forceDelete(); $asset_maintenances += $asset->assetmaintenances()->count(); diff --git a/app/Console/Commands/RecryptFromMcrypt.php b/app/Console/Commands/RecryptFromMcrypt.php new file mode 100644 index 0000000000..7437708207 --- /dev/null +++ b/app/Console/Commands/RecryptFromMcrypt.php @@ -0,0 +1,164 @@ +error('ERROR: You do not have a LEGACY_APP_KEY set in your .env file. Please locate your old APP_KEY and ADD a line to your .env file like: LEGACY_APP_KEY=YOUR_OLD_APP_KEY'); + return false; + } + + + // Do some basic legacy app key length checks + if (strlen($legacy_key) == 32) { + $legacy_length_check = true; + } elseif (array_key_exists('1', $key_parts) && (strlen($key_parts[1])==44)) { + $legacy_length_check = true; + } else { + $legacy_length_check = false; + } + + + + // Check that the app key is 32 characters + if ($legacy_length_check === true) { + $this->comment('INFO: Your LEGACY_APP_KEY looks correct. Okay to continue.'); + } else { + $this->error('ERROR: Your LEGACY_APP_KEY is not the correct length (32 characters or base64 followed by 44 characters for later versions). Please locate your old APP_KEY and use that as your LEGACY_APP_KEY in your .env file to continue.'); + return false; + } + + $this->error('================================!!!! WARNING !!!!================================'); + $this->error('================================!!!! WARNING !!!!================================'); + $this->comment("This tool will attempt to decrypt your old Snipe-IT (mcrypt, now deprecated) encrypted data and re-encrypt it using OpenSSL. \n\nYou should only continue if you have backed up any and all old APP_KEYs and have backed up your data."); + + if ($this->confirm("Are you SURE you wish to continue?")) { + + $backup_file = 'backups/env-backups/'.'app_key-'.date('Y-m-d-gis'); + + try { + Storage::disk('local')->put($backup_file, 'APP_KEY: '.config('app.key')); + Storage::disk('local')->append($backup_file, 'LEGACY_APP_KEY: '.$legacy_key); + } catch (\Exception $e) { + $this->info('WARNING: Could not backup app keys'); + } + + + $mcrypter = new McryptEncrypter($legacy_key); + $settings = Setting::getSettings(); + + if ($settings->ldap_password=='') { + $this->comment('INFO: No LDAP password found. Skipping... '); + } + + $custom_fields = CustomField::where('field_encrypted','=', 1)->get(); + $this->comment('INFO: Retrieving encrypted custom fields...'); + + $query = Asset::withTrashed(); + + foreach ($custom_fields as $custom_field) { + $this->comment('FIELD TO RECRYPT: '.$custom_field->name .' ('.$custom_field->db_column.')'); + $query->orWhereNotNull($custom_field->db_column); + } + + + // Get all assets with a value in any of the fields that were encrypted + $assets = $query->get(); + + $bar = $this->output->createProgressBar(count($assets)); + + foreach ($custom_fields as $encrypted_field) { + + // Try to decrypt the payload using the legacy app key + try { + $decrypted_field = $mcrypter->decrypt($encrypted_field); + $this->comment($decrypted_field); + } catch (\Exception $e) { + $errors[] = ' - ERROR: Could not decrypt field ['.$encrypted_field->name.']: '.$e->getMessage(); + } + $bar->advance(); + } + + + foreach ($assets as $asset) { + foreach ($custom_fields as $encrypted_field) { + + // Make sure the value isn't null + if ($asset->{$encrypted_field}!='') { + // Try to decrypt the payload using the legacy app key + try { + $decrypted_field = $mcrypter->decrypt($asset->{$encrypted_field}); + $asset->{$encrypted_field} = \Crypt::encrypt($decrypted_field); + $this->comment($decrypted_field); + } catch (\Exception $e) { + $errors[] = ' - ERROR: Could not decrypt field ['.$encrypted_field->name.']: '.$e->getMessage(); + } + } + + } + $asset->save(); + $bar->advance(); + } + + + + $bar->finish(); + + if (count($errors) > 0) { + $this->comment("\n\n"); + $this->error("The decrypter encountered some errors: \n"); + foreach ($errors as $error) { + $this->error($error); + } + } + } + + } +} diff --git a/app/Console/Commands/SendExpectedCheckinAlerts.php b/app/Console/Commands/SendExpectedCheckinAlerts.php new file mode 100644 index 0000000000..15594bee08 --- /dev/null +++ b/app/Console/Commands/SendExpectedCheckinAlerts.php @@ -0,0 +1,64 @@ +addDays(7); + $assets = Asset::with('assignedTo')->whereNotNull('expected_checkin')->where('expected_checkin', '<=', $whenNotify)->get(); + + $this->info($whenNotify.' is deadline'); + $this->info($assets->count().' assets'); + + foreach ($assets as $asset) { + if ($asset->assignedTo && $asset->checkoutOutToUser()) { + $asset->assignedTo->notify((new ExpectedCheckinNotification($asset))); + //$this->info($asset); + } + } + + + + + + } +} diff --git a/app/Console/Commands/SendExpirationAlerts.php b/app/Console/Commands/SendExpirationAlerts.php index d25a3cb799..f8dfc8f0a4 100644 --- a/app/Console/Commands/SendExpirationAlerts.php +++ b/app/Console/Commands/SendExpirationAlerts.php @@ -55,7 +55,7 @@ class SendExpirationAlerts extends Command foreach ($expiring_assets as $asset) { - $expires = $asset->warrantee_expires(); + $expires = $asset->present()->warrantee_expires(); $difference = round(abs(strtotime($expires) - strtotime($now))/86400); if ($difference > 30) { @@ -64,11 +64,11 @@ class SendExpirationAlerts extends Command $asset_data['email_content'] .= ''; } $asset_data['email_content'] .= ''; - $asset_data['email_content'] .= $asset->showAssetName().''.e($asset->asset_tag).''; - $asset_data['email_content'] .= ''.e($asset->warrantee_expires()).''; + $asset_data['email_content'] .= $asset->present()->name().''.e($asset->asset_tag).''; + $asset_data['email_content'] .= ''.e($asset->present()->warrantee_expires()).''; $asset_data['email_content'] .= ''.$difference.' '.trans('mail.days').''; $asset_data['email_content'] .= ''.($asset->supplier ? e($asset->supplier->name) : '').''; - $asset_data['email_content'] .= ''.($asset->assigneduser ? e($asset->assigneduser->fullName()) : '').''; + $asset_data['email_content'] .= ''.($asset->assignedTo ? e($asset->assignedTo->present()->name()) : '').''; $asset_data['email_content'] .= ''; } @@ -89,7 +89,7 @@ class SendExpirationAlerts extends Command } else { $license_data['email_content'] .= ''; } - $license_data['email_content'] .= ''; + $license_data['email_content'] .= ''; $license_data['email_content'] .= $license->name.''; $license_data['email_content'] .= ''.$license->expiration_date.''; $license_data['email_content'] .= ''.$difference.' days'; diff --git a/app/Console/Commands/Versioning.php b/app/Console/Commands/Versioning.php index 91f1d93d3e..c540ff0a24 100644 --- a/app/Console/Commands/Versioning.php +++ b/app/Console/Commands/Versioning.php @@ -42,7 +42,7 @@ class Versioning extends Command { $versionFile = 'config/version.php'; - $hash_version = str_replace("\n",'',shell_exec('git describe --tags')); + $hash_version = str_replace("\n", '', shell_exec('git describe --tags')); $version = explode('-', $hash_version); @@ -52,18 +52,19 @@ class Versioning extends Command 'build_version' => $version[1], 'hash_version' => $version[2], 'full_hash' => $hash_version), - true); + true + ); // Construct our file content - $content = <<line('Setting version: '. config('version.app_version').' build '.config('version.build_version').' ('.config('version.hash_version').')'); + \File::put($versionFile, $content); + $this->line('Setting version: '. config('version.app_version').' build '.config('version.build_version').' ('.config('version.hash_version').')'); } /** diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 3e04cb550b..d6de607fb8 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -17,13 +17,15 @@ class Kernel extends ConsoleKernel Commands\CreateAdmin::class, Commands\SendExpirationAlerts::class, Commands\SendInventoryAlerts::class, - Commands\LicenseImportCommand::class, + Commands\SendExpectedCheckinAlerts::class, Commands\ObjectImportCommand::class, Commands\Versioning::class, Commands\SystemBackup::class, Commands\DisableLDAP::class, Commands\Purge::class, Commands\LdapSync::class, + Commands\FixDoubleEscape::class, + Commands\RecryptFromMcrypt::class ]; /** @@ -37,7 +39,13 @@ class Kernel extends ConsoleKernel $schedule->command('snipeit:inventory-alerts')->daily(); $schedule->command('snipeit:expiring-alerts')->daily(); + $schedule->command('snipeit:expected-checkins')->daily(); $schedule->command('snipeit:backup')->weekly(); $schedule->command('backup:clean')->daily(); } + + protected function commands() + { + require base_path('routes/console.php'); + } } diff --git a/app/Exceptions/CheckoutNotAllowed.php b/app/Exceptions/CheckoutNotAllowed.php new file mode 100644 index 0000000000..74c65efb1f --- /dev/null +++ b/app/Exceptions/CheckoutNotAllowed.php @@ -0,0 +1,12 @@ +back()->with('error', trans('general.token_expired')); + return redirect()->back()->with('error', trans('general.token_expired')); } - if ($this->isHttpException($e)) { - $statusCode = $e->getStatusCode(); + // Handle Ajax requests that fail because the model doesn't exist + if ($request->ajax() || $request->wantsJson()) { - switch ($statusCode) { + if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { + $className = last(explode('\\', $e->getModel())); + return response()->json(Helper::formatStandardApiResponse('error', null, $className . ' not found'), 200); + } - case '404': - return response()->view('layouts/basic', [ - 'content' => view('errors/404') - ]); - } + if ($e instanceof \Illuminate\Validation\ValidationException) { + return response()->json(Helper::formatStandardApiResponse('error', $e->response['messages'], $e->getMessage(), 400)); + } + + if ($this->isHttpException($e)) { + + $statusCode = $e->getStatusCode(); + + switch ($e->getStatusCode()) { + case '404': + return response()->json(Helper::formatStandardApiResponse('error', null, $statusCode . ' endpoint not found'), 404); + case '405': + return response()->json(Helper::formatStandardApiResponse('error', null, 'Method not allowed'), 405); + default: + return response()->json(Helper::formatStandardApiResponse('error', null, $statusCode), 405); + + } + } + // Try to parse 500 Errors in a bit nicer way when debug is enabled. + if (config('app.debug')) { + return response()->json(Helper::formatStandardApiResponse('error', null, "An Error has occured! " . $e->getMessage()), 500); + } + + } + + + if ($this->isHttpException($e) && (isset($statusCode)) && ($statusCode == '404' )) { + return response()->view('layouts/basic', [ + 'content' => view('errors/404') + ],$statusCode); } return parent::render($request, $e); + + } + + /** + * Convert an authentication exception into an unauthenticated response. + * + * @param \Illuminate\Http\Request $request + * @param \Illuminate\Auth\AuthenticationException $exception + * @return \Illuminate\Http\Response + */ + protected function unauthenticated($request, AuthenticationException $exception) + { + if ($request->expectsJson()) { + return response()->json(['error' => 'Unauthorized.'], 401); + } + + return redirect()->guest('login'); } } diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 430727b8fa..1e0a2b7ede 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -4,6 +4,7 @@ namespace App\Helpers; use DB; use App\Models\Statuslabel; use App\Models\Location; +use App\Models\Department; use App\Models\AssetModel; use App\Models\Company; use App\Models\User; @@ -17,6 +18,7 @@ use App\Models\Component; use App\Models\Accessory; use App\Models\Consumable; use App\Models\Asset; +use App\Models\Setting; use Crypt; use Illuminate\Contracts\Encryption\DecryptException; @@ -31,7 +33,8 @@ class Helper * @since [v2.0] * @return String */ - public static function parseEscapedMarkedown($str) { + public static function parseEscapedMarkedown($str) + { $Parsedown = new \Parsedown(); if ($str) { @@ -123,6 +126,8 @@ class Helper $LocaleInfo = localeconv(); $floatString = str_replace(",", "", $floatString); $floatString = str_replace($LocaleInfo["decimal_point"], ".", $floatString); + // Strip Currency symbol + $floatString = str_replace($LocaleInfo['currency_symbol'], '', $floatString); return floatval($floatString); } @@ -139,7 +144,7 @@ class Helper $models = AssetModel::with('manufacturer')->get(); $model_array[''] = trans('general.select_model'); foreach ($models as $model) { - $model_array[$model->id] = $model->displayModelName(); + $model_array[$model->id] = $model->present()->modelName(); } return $model_array; } @@ -153,9 +158,10 @@ class Helper */ public static function companyList() { - $company_list = array('0' => trans('general.select_company')) + DB::table('companies') + $company_list = array('' => trans('general.select_company')) + DB::table('companies') ->orderBy('name', 'asc') - ->pluck('name', 'id'); + ->pluck('name', 'id') + ->toArray(); return $company_list; } @@ -172,12 +178,32 @@ class Helper $categories = Category::orderBy('name', 'asc') ->whereNull('deleted_at') ->orderBy('name', 'asc'); - if(!empty($category_type)) + if (!empty($category_type)) { $categories = $categories->where('category_type', '=', $category_type); + } $category_list = array('' => trans('general.select_category')) + $categories->pluck('name', 'id')->toArray(); return $category_list; } + + /** + * Get the list of categories in an array to make a dropdown menu + * + * @author [A. Gianotto] [] + * @since [v2.5] + * @return Array + */ + public static function departmentList() + { + $departments = Department::orderBy('name', 'asc') + ->whereNull('deleted_at') + ->orderBy('name', 'asc'); + + return array('' => trans('general.select_department')) + $departments->pluck('name', 'id')->toArray(); + + } + + /** * Get the list of suppliers in an array to make a dropdown menu * @@ -203,7 +229,7 @@ class Helper */ public static function statusLabelList() { - $statuslabel_list = array('' => trans('general.select_statuslabel')) + Statuslabel::orderBy('name', 'asc') + $statuslabel_list = array('' => trans('general.select_statuslabel')) + Statuslabel::orderBy('deployable', 'desc') ->pluck('name', 'id')->toArray(); return $statuslabel_list; } @@ -248,7 +274,12 @@ class Helper */ public static function statusTypeList() { - $statuslabel_types = array('' => trans('admin/hardware/form.select_statustype')) + array('undeployable' => trans('admin/hardware/general.undeployable')) + array('pending' => trans('admin/hardware/general.pending')) + array('archived' => trans('admin/hardware/general.archived')) + array('deployable' => trans('admin/hardware/general.deployable')); + $statuslabel_types = + array('' => trans('admin/hardware/form.select_statustype')) + + array('deployable' => trans('admin/hardware/general.deployable')) + + array('pending' => trans('admin/hardware/general.pending')) + + array('undeployable' => trans('admin/hardware/general.undeployable')) + + array('archived' => trans('admin/hardware/general.archived')); return $statuslabel_types; } @@ -265,7 +296,7 @@ class Helper User::where('deleted_at', '=', null) ->orderBy('last_name', 'asc') ->orderBy('first_name', 'asc')->get() - ->lists('complete_name', 'id')->toArray(); + ->pluck('complete_name', 'id')->toArray(); return $manager_list; } @@ -308,10 +339,10 @@ class Helper { $users_list = array( '' => trans('general.select_user')) + Company::scopeCompanyables(User::where('deleted_at', '=', null)) - ->where('show_in_list','=',1) + ->where('show_in_list', '=', 1) ->orderBy('last_name', 'asc') ->orderBy('first_name', 'asc')->get() - ->lists('complete_name', 'id')->toArray(); + ->pluck('complete_name', 'id')->toArray(); return $users_list; } @@ -336,11 +367,11 @@ class Helper * * @author [A. Gianotto] [] * @since [v2.5] - * @return Array + * @return array */ public static function detailedAssetList() { - $assets = array('' => trans('general.select_asset')) + Company::scopeCompanyables(Asset::with('assignedUser', 'model'), 'assets.company_id')->get()->lists('detailed_name', 'id')->toArray(); + $assets = array('' => trans('general.select_asset')) + Company::scopeCompanyables(Asset::with('assignedTo', 'model'), 'assets.company_id')->get()->pluck('detailed_name', 'id')->toArray(); return $assets; } @@ -367,8 +398,8 @@ class Helper */ public static function predefined_formats() { - $keys=array_keys(CustomField::$PredefinedFormats); - $stuff=array_combine($keys, $keys); + $keys = array_keys(CustomField::$PredefinedFormats); + $stuff = array_combine($keys, $keys); return $stuff+["" => trans('admin/custom_fields/general.custom_format')]; } @@ -553,7 +584,7 @@ class Helper if ($permission[$x]['display'] === true) { if ($selected_arr) { - if (array_key_exists($permission_name,$selected_arr)) { + if (array_key_exists($permission_name, $selected_arr)) { $permissions_arr[$permission_name] = $selected_arr[$permission_name]; } else { $permissions_arr[$permission_name] = '0'; @@ -584,7 +615,8 @@ class Helper * @since [v3.0] * @return boolean */ - public static function checkIfRequired($class, $field) { + public static function checkIfRequired($class, $field) + { $rules = $class::rules(); foreach ($rules as $rule_name => $rule) { if ($rule_name == $field) { @@ -611,28 +643,10 @@ class Helper */ public static function array_smart_fetch(array $array, $key, $default = '') { - array_change_key_case($array, CASE_LOWER); + array_change_key_case($array, CASE_LOWER); return array_key_exists(strtolower($key), array_change_key_case($array)) ? e(trim($array[ $key ])) : $default; } - /** - * Check to see if the given key exists in the array, and trim excess white space before returning it - * - * @author A. Gianotto - * @since 3.2 - * @param $array array - * @return string - */ - public static function getLastDateFromHistoryArray(array $array) - { - foreach ($array as $key => $value) { -// echo '
';
-//            echo 'last:'.$key;
-//            print_r($array);
-//            echo '
'; - } - } - /** * Gracefully handle decrypting the legacy data (encrypted via mcrypt) and use the new @@ -646,7 +660,8 @@ class Helper * @param String $string * @return string */ - public static function gracefulDecrypt(CustomField $field, $string) { + public static function gracefulDecrypt(CustomField $field, $string) + { if ($field->isFieldDecryptable($string)) { @@ -663,26 +678,52 @@ class Helper } - /** - * Strip HTML out of returned JSON. This is pretty gross, and I'd like to find a better way - * to handle this, but the REST API will solve some of these problems anyway. - * - * This is not currently used, but will be. - * - * @author A. Gianotto - * @since 3.4 - * @param $array array - * @return Array - */ - public static function stripTagsFromJSON(Array $array) { - foreach ($array as $key => $value) { - $clean_value = strip_tags($value); - $clean_array[$key] = $clean_value; + + public static function formatStandardApiResponse($status, $payload = null, $messages = null) { + + $array['status'] = $status; + $array['messages'] = $messages; + if (($messages) && (count($messages) > 0)) { + $array['messages'] = $messages; } - return $clean_array; + ($payload) ? $array['payload'] = $payload : $array['payload'] = null; + return $array; + } + + + /* + Possible solution for unicode fieldnames + */ + public static function make_slug($string) { + return preg_replace('/\s+/u', '_', trim($string)); + } + + + public static function getFormattedDateObject($date, $type = 'datetime', $array = true) { + + if ($date=='') { + return null; + } + + $settings = Setting::getSettings(); + $tmp_date = new \Carbon($date); + + if ($type == 'datetime') { + $dt['datetime'] = $tmp_date->format('Y-m-d H:i:s'); + $dt['formatted'] = $tmp_date->format($settings->date_display_format .' '. $settings->time_display_format); + } else { + $dt['date'] = $tmp_date->format('Y-m-d'); + $dt['formatted'] = $tmp_date->format($settings->date_display_format); + } + + if ($array == 'true') { + return $dt; + } + return $dt['formatted']; } + } diff --git a/app/Http/Controllers/AccessoriesController.php b/app/Http/Controllers/AccessoriesController.php index 6bf5c8f62c..6658997cf7 100755 --- a/app/Http/Controllers/AccessoriesController.php +++ b/app/Http/Controllers/AccessoriesController.php @@ -3,9 +3,7 @@ namespace App\Http\Controllers; use App\Helpers\Helper; use App\Models\Accessory; -use App\Models\Actionlog; use App\Models\Company; -use App\Models\Setting; use App\Models\User; use Auth; use Carbon\Carbon; @@ -16,7 +14,7 @@ use Input; use Lang; use Mail; use Redirect; -use Request; +use Illuminate\Http\Request; use Slack; use Str; use View; @@ -38,9 +36,10 @@ class AccessoriesController extends Controller * @since [v1.0] * @return View */ - public function getIndex(Request $request) + public function index(Request $request) { - return View::make('accessories/index'); + $this->authorize('index', Accessory::class); + return view('accessories/index'); } @@ -50,10 +49,11 @@ class AccessoriesController extends Controller * @author [A. Gianotto] [] * @return View */ - public function getCreate(Request $request) + public function create(Request $request) { + $this->authorize('create', Accessory::class); // Show the page - return View::make('accessories/edit') + return view('accessories/edit') ->with('item', new Accessory) ->with('category_list', Helper::categoryList('accessory')) ->with('company_list', Helper::companyList()) @@ -68,45 +68,31 @@ class AccessoriesController extends Controller * @author [A. Gianotto] [] * @return Redirect */ - public function postCreate(Request $request) + public function store(Request $request) { - + $this->authorize(Accessory::class); // create a new model instance $accessory = new Accessory(); // Update the accessory data - $accessory->name = e(Input::get('name')); - $accessory->category_id = e(Input::get('category_id')); - $accessory->location_id = e(Input::get('location_id')); - $accessory->min_amt = e(Input::get('min_amt')); - $accessory->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $accessory->order_number = e(Input::get('order_number')); - $accessory->manufacturer_id = e(Input::get('manufacturer_id')); - $accessory->model_number = e(Input::get('model_number')); - - if (e(Input::get('purchase_date')) == '') { - $accessory->purchase_date = null; - } else { - $accessory->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('purchase_cost')) == '0.00') { - $accessory->purchase_cost = null; - } else { - $accessory->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - $accessory->qty = e(Input::get('qty')); + $accessory->name = request('name'); + $accessory->category_id = request('category_id'); + $accessory->location_id = request('location_id'); + $accessory->min_amt = request('min_amt'); + $accessory->company_id = Company::getIdForCurrentUser(request('company_id')); + $accessory->order_number = request('order_number'); + $accessory->manufacturer_id = request('manufacturer_id'); + $accessory->model_number = request('model_number'); + $accessory->purchase_date = request('purchase_date'); + $accessory->purchase_cost = Helper::ParseFloat(request('purchase_cost')); + $accessory->qty = request('qty'); $accessory->user_id = Auth::user()->id; // Was the accessory created? if ($accessory->save()) { - $accessory->logCreate(); // Redirect to the new accessory page - return redirect()->to("admin/accessories")->with('success', trans('admin/accessories/message.create.success')); + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.create.success')); } - - return redirect()->back()->withInput()->withErrors($accessory->getErrors()); } @@ -117,17 +103,16 @@ class AccessoriesController extends Controller * @param int $accessoryId * @return View */ - public function getEdit(Request $request, $accessoryId = null) + public function edit(Request $request, $accessoryId = null) { // Check if the accessory exists if (is_null($item = Accessory::find($accessoryId))) { - // Redirect to the blogs management page - return redirect()->to('admin/accessories')->with('error', trans('admin/accessories/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($item)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); } - return View::make('accessories/edit', compact('item')) + $this->authorize($item); + + return view('accessories/edit', compact('item')) ->with('category_list', Helper::categoryList('accessory')) ->with('company_list', Helper::companyList()) ->with('location_list', Helper::locationsList()) @@ -142,63 +127,32 @@ class AccessoriesController extends Controller * @param int $accessoryId * @return Redirect */ - public function postEdit(Request $request, $accessoryId = null) + public function update(Request $request, $accessoryId = null) { - // Check if the accessory exists if (is_null($accessory = Accessory::find($accessoryId))) { - // Redirect to the accessory index page - return redirect()->to('admin/accessories')->with('error', trans('admin/accessories/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($accessory)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); } - // Update the accessory data - $accessory->name = e(Input::get('name')); + $this->authorize($accessory); - if (e(Input::get('location_id')) == '') { - $accessory->location_id = null; - } else { - $accessory->location_id = e(Input::get('location_id')); - } - $accessory->min_amt = e(Input::get('min_amt')); - $accessory->category_id = e(Input::get('category_id')); - $accessory->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $accessory->manufacturer_id = e(Input::get('manufacturer_id')); - $accessory->order_number = e(Input::get('order_number')); - $accessory->model_number = e(Input::get('model_number')); - - if (e(Input::get('purchase_date')) == '') { - $accessory->purchase_date = null; - } else { - $accessory->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('purchase_cost')) == '0.00') { - $accessory->purchase_cost = null; - } else { - $accessory->purchase_cost = e(Input::get('purchase_cost')); - } - - $accessory->qty = e(Input::get('qty')); + // Update the accessory data + $accessory->name = request('name'); + $accessory->location_id = request('location_id'); + $accessory->min_amt = request('min_amt'); + $accessory->category_id = request('category_id'); + $accessory->company_id = Company::getIdForCurrentUser(request('company_id')); + $accessory->manufacturer_id = request('manufacturer_id'); + $accessory->order_number = request('order_number'); + $accessory->model_number = request('model_number'); + $accessory->purchase_date = request('purchase_date'); + $accessory->purchase_cost = request('purchase_cost'); + $accessory->qty = request('qty'); // Was the accessory updated? if ($accessory->save()) { - - $logaction = new Actionlog(); - $logaction->item_type = Accessory::class; - $logaction->item_id = $accessory->id; - $logaction->created_at = date("Y-m-d H:i:s"); - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('update'); - - - // Redirect to the updated accessory page - return redirect()->to("admin/accessories")->with('success', trans('admin/accessories/message.update.success')); + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.update.success')); } - - return redirect()->back()->withInput()->withErrors($accessory->getErrors()); - } /** @@ -208,33 +162,20 @@ class AccessoriesController extends Controller * @param int $accessoryId * @return Redirect */ - public function getDelete(Request $request, $accessoryId) + public function destroy(Request $request, $accessoryId) { - // Check if the blog post exists if (is_null($accessory = Accessory::find($accessoryId))) { - // Redirect to the blogs management page - return redirect()->to('admin/accessories')->with('error', trans('admin/accessories/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($accessory)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); } + $this->authorize($accessory); + if ($accessory->hasUsers() > 0) { - return redirect()->to('admin/accessories')->with('error', trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers()))); - } else { - $accessory->delete(); - - $logaction = new Actionlog(); - $logaction->item_type = Accessory::class; - $logaction->item_id = $accessory->id; - $logaction->created_at = date("Y-m-d H:i:s"); - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('deleted'); - - // Redirect to the locations management page - return redirect()->to('admin/accessories')->with('success', trans('admin/accessories/message.delete.success')); - + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers()))); } + $accessory->delete(); + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.delete.success')); } @@ -244,31 +185,23 @@ class AccessoriesController extends Controller * the content for the accessory detail view, which is generated in getDataView. * * @author [A. Gianotto] [] - * @param int $accessoryId + * @param int $accessoryID * @see AccessoriesController::getDataView() method that generates the JSON response * @since [v1.0] * @return View */ - public function getView(Request $request, $accessoryID = null) + public function show(Request $request, $accessoryID = null) { $accessory = Accessory::find($accessoryID); - + $this->authorize('view', $accessory); if (isset($accessory->id)) { - - if (!Company::isCurrentUserHasAccess($accessory)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); - } else { - return View::make('accessories/view', compact('accessory')); - } - } else { - // Prepare the error message - $error = trans('admin/accessories/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('accessories')->with('error', $error); + return view('accessories/view', compact('accessory')); } + // Prepare the error message + $error = trans('admin/accessories/message.does_not_exist', compact('id')); - + // Redirect to the user management page + return redirect()->route('accessories')->with('error', $error); } /** @@ -283,15 +216,13 @@ class AccessoriesController extends Controller // Check if the accessory exists if (is_null($accessory = Accessory::find($accessoryId))) { // Redirect to the accessory management page with error - return redirect()->to('accessories')->with('error', trans('admin/accessories/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($accessory)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); } - // Get the dropdown of users and then pass it to the checkout view - $users_list = Helper::usersList(); + $this->authorize('checkout', $accessory); - return View::make('accessories/checkout', compact('accessory'))->with('users_list', $users_list); + // Get the dropdown of users and then pass it to the checkout view + return view('accessories/checkout', compact('accessory'))->with('users_list', Helper::usersList()); } @@ -310,64 +241,28 @@ class AccessoriesController extends Controller // Check if the accessory exists if (is_null($accessory = Accessory::find($accessoryId))) { // Redirect to the accessory management page with error - return redirect()->to('accessories')->with('error', trans('admin/accessories/message.user_not_found')); - } elseif (!Company::isCurrentUserHasAccess($accessory)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.user_not_found')); } + $this->authorize('checkout', $accessory); + if (!$user = User::find(Input::get('assigned_to'))) { - return redirect()->to('admin/accessories')->with('error', trans('admin/accessories/message.not_found')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); } // Update the accessory data - $accessory->assigned_to = e(Input::get('assigned_to')); + $accessory->assigned_to = e(Input::get('assigned_to')); - $accessory->users()->attach($accessory->id, array( - 'accessory_id' => $accessory->id, - 'created_at' => Carbon::now(), - 'user_id' => Auth::user()->id, - 'assigned_to' => e(Input::get('assigned_to')))); + $accessory->users()->attach($accessory->id, [ + 'accessory_id' => $accessory->id, + 'created_at' => Carbon::now(), + 'user_id' => Auth::id(), + 'assigned_to' => $request->get('assigned_to') + ]); - $logaction = $accessory->logCheckout(e(Input::get('note'))); + $logaction = $accessory->logCheckout(e(Input::get('note')), $user); - - - $admin_user = Auth::user(); - $settings = Setting::getSettings(); - - if ($settings->slack_endpoint) { - - - $slack_settings = [ - 'username' => $settings->botname, - 'channel' => $settings->slack_channel, - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked Out:', - 'value' => 'Accessory <'.config('app.url').'/admin/accessories/'.$accessory->id.'/view'.'|'.$accessory->name.'> checked out to <'.config('app.url').'/admin/users/'.$user->id.'/view|'.$user->fullName().'> by <'.config('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.' - ], - [ - 'title' => 'Note:', - 'value' => e(Input::get('note')) - ], - ] - ])->send('Accessory Checked Out'); - } catch (Exception $e) { - - } - - } - - - $accessory_user = DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first(); + DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first(); $data['log_id'] = $logaction->id; $data['eula'] = $accessory->getEula(); @@ -378,8 +273,7 @@ class AccessoriesController extends Controller $data['expected_checkin'] = ''; $data['note'] = $logaction->note; $data['require_acceptance'] = $accessory->requireAcceptance(); - - + // TODO: Port this to new mail notifications if (($accessory->requireAcceptance()=='1') || ($accessory->getEula())) { Mail::send('emails.accept-accessory', $data, function ($m) use ($user) { @@ -390,104 +284,62 @@ class AccessoriesController extends Controller } // Redirect to the new accessory page - return redirect()->to("admin/accessories")->with('success', trans('admin/accessories/message.checkout.success')); - - - + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.checkout.success')); } - /** - * Check the accessory back into inventory - * - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return View - **/ + /** + * Check the accessory back into inventory + * + * @author [A. Gianotto] [] + * @param Request $request + * @param integer $accessoryUserId + * @param string $backto + * @return View + * @internal param int $accessoryId + */ public function getCheckin(Request $request, $accessoryUserId = null, $backto = null) { // Check if the accessory exists if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { // Redirect to the accessory management page with error - return redirect()->to('admin/accessories')->with('error', trans('admin/accessories/message.not_found')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); } $accessory = Accessory::find($accessory_user->accessory_id); - - if (!Company::isCurrentUserHasAccess($accessory)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); - } else { - return View::make('accessories/checkin', compact('accessory'))->with('backto', $backto); - } + $this->authorize('checkin', $accessory); + return view('accessories/checkin', compact('accessory'))->with('backto', $backto); } - /** - * Check in the item so that it can be checked out again to someone else - * - * @uses Accessory::checkin_email() to determine if an email can and should be sent - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return Redirect - **/ + /** + * Check in the item so that it can be checked out again to someone else + * + * @uses Accessory::checkin_email() to determine if an email can and should be sent + * @author [A. Gianotto] [] + * @param Request $request + * @param integer $accessoryUserId + * @param string $backto + * @return Redirect + * @internal param int $accessoryId + */ public function postCheckin(Request $request, $accessoryUserId = null, $backto = null) { // Check if the accessory exists if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { // Redirect to the accessory management page with error - return redirect()->to('admin/accessories')->with('error', trans('admin/accessories/message.not_found')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); } - $accessory = Accessory::find($accessory_user->accessory_id); - if (!Company::isCurrentUserHasAccess($accessory)) { - return redirect()->to('admin/accessories')->with('error', trans('general.insufficient_permissions')); - } + $this->authorize('checkin', $accessory); $return_to = e($accessory_user->assigned_to); $logaction = $accessory->logCheckin(User::find($return_to), e(Input::get('note'))); - $admin_user = Auth::user(); - - // Was the accessory updated? + // Was the accessory updated? if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) { - - $settings = Setting::getSettings(); - - if ($settings->slack_endpoint) { - - - $slack_settings = [ - 'username' => e($settings->botname), - 'channel' => e($settings->slack_channel), - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked In:', - 'value' => class_basename(strtoupper($logaction->item_type)).' <'.config('app.url').'/admin/accessories/'.e($accessory->id).'/view'.'|'.e($accessory->name).'> checked in by <'.config('app.url').'/admin/users/'.e($admin_user->id).'/view'.'|'.e($admin_user->fullName()).'>.' - ], - [ - 'title' => 'Note:', - 'value' => e($logaction->note) - ], - - ] - ])->send('Accessory Checked In'); - - } catch (Exception $e) { - - } - - } - if (!is_null($accessory_user->assigned_to)) { $user = User::find($accessory_user->assigned_to); } @@ -509,45 +361,45 @@ class AccessoriesController extends Controller } if ($backto=='user') { - return redirect()->to("admin/users/".$return_to.'/view')->with('success', trans('admin/accessories/message.checkin.success')); - } else { - return redirect()->to("admin/accessories/".$accessory->id."/view")->with('success', trans('admin/accessories/message.checkin.success')); + return redirect()->route("users.show", $return_to)->with('success', trans('admin/accessories/message.checkin.success')); } + return redirect()->route("accessories.show", $accessory->id)->with('success', trans('admin/accessories/message.checkin.success')); } - // Redirect to the accessory management page with error - return redirect()->to("admin/accessories")->with('error', trans('admin/accessories/message.checkin.error')); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.checkin.error')); } /** - * Generates the JSON response for accessories listing view. - * - * Example: - * { - * "actions": "(links to available actions)", - * "category": "(link to category)", - * "companyName": "My Company", - * "location": "My Location", - * "min_amt": 2, - * "name": "(link to accessory), - * "numRemaining": 6, - * "order_number": null, - * "purchase_cost": "0.00", - * "purchase_date": null, - * "qty": 7 - * }, - * - * The names of the fields in the returns JSON correspond directly to the the - * names of the fields in the bootstrap-tables in the view. - * - * For debugging, see at /api/accessories/list - * - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return string JSON containing accessories and their associated atrributes. - **/ + * Generates the JSON response for accessories listing view. + * + * Example: + * { + * "actions": "(links to available actions)", + * "category": "(link to category)", + * "company": "My Company", + * "location": "My Location", + * "min_amt": 2, + * "name": "(link to accessory), + * "numRemaining": 6, + * "order_number": null, + * "purchase_cost": "0.00", + * "purchase_date": null, + * "qty": 7 + * }, + * + * The names of the fields in the returns JSON correspond directly to the the + * names of the fields in the bootstrap-tables in the view. + * + * For debugging, see at /api/accessories/list + * + * @author [A. Gianotto] [] + * @param Request $request + * @return string JSON containing accessories and their associated atrributes. + * @internal param int $accessoryId + */ public function getDatatable(Request $request) { + $this->authorize('index', Accessory::class); $accessories = Company::scopeCompanyables( Accessory::select('accessories.*') ->whereNull('accessories.deleted_at') @@ -556,21 +408,10 @@ class AccessoriesController extends Controller if (Input::has('search')) { $accessories = $accessories->TextSearch(e(Input::get('search'))); } + $offset = request('offset', 0); + $limit = request('limit', 50); - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - - $allowed_columns = ['name','min_amt','order_number','purchase_date','purchase_cost','companyName','category','model_number']; + $allowed_columns = ['name','min_amt','order_number','purchase_date','purchase_cost','company','category','model_number', 'manufacturer', 'location']; $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array(Input::get('sort'), $allowed_columns) ? e(Input::get('sort')) : 'created_at'; @@ -578,9 +419,15 @@ class AccessoriesController extends Controller case 'category': $accessories = $accessories->OrderCategory($order); break; - case 'companyName': + case 'company': $accessories = $accessories->OrderCompany($order); break; + case 'location': + $accessories = $accessories->OrderLocation($order); + break; + case 'manufacturer': + $accessories = $accessories->OrderManufacturer($order); + break; default: $accessories = $accessories->orderBy($sort, $order); break; @@ -592,39 +439,7 @@ class AccessoriesController extends Controller $rows = array(); foreach ($accessories as $accessory) { - - $actions = ''; - if (Gate::allows('accessories.checkout')) { - $actions .= 'numRemaining() > 0) ? '' : ' disabled') . '>' . trans('general.checkout') . ''; - } - if (Gate::allows('accessories.edit')) { - $actions .= ''; - } - if (Gate::allows('accessories.delete')) { - $actions .= ''; - } - $actions .= ''; - $company = $accessory->company; - - $rows[] = array( - 'name' => ''. $accessory->name.'', - 'category' => ($accessory->category) ? (string)link_to('admin/settings/categories/'.$accessory->category->id.'/view', $accessory->category->name) : '', - 'model_number' => e($accessory->model_number), - 'qty' => e($accessory->qty), - 'order_number' => e($accessory->order_number), - 'min_amt' => e($accessory->min_amt), - 'location' => ($accessory->location) ? e($accessory->location->name): '', - 'purchase_date' => e($accessory->purchase_date), - 'purchase_cost' => Helper::formatCurrencyOutput($accessory->purchase_cost), - 'numRemaining' => $accessory->numRemaining(), - 'actions' => $actions, - 'companyName' => is_null($company) ? '' : e($company->name), - 'manufacturer' => $accessory->manufacturer ? (string) link_to('/admin/settings/manufacturers/'.$accessory->manufacturer_id.'/view', $accessory->manufacturer->name) : '' - - ); + $rows[] = $accessory->present()->forDataTable(); } $data = array('total'=>$accessCount, 'rows'=>$rows); @@ -673,15 +488,14 @@ class AccessoriesController extends Controller foreach ($accessory_users as $user) { $actions = ''; - if (Gate::allows('accessories.checkin')) { - $actions .= 'Checkin'; + if (Gate::allows('checkin', $accessory)) { + $actions .= Helper::generateDatatableButton('checkin', route('checkin/accessory', $user->pivot->id)); } - if (Gate::allows('users.view')) { - $name = (string) link_to('/admin/users/'.$user->id.'/view', e($user->fullName())); + if (Gate::allows('view', $user)) { + $name = (string) link_to_route('users.show', e($user->present()->fullName()), [$user->id]); } else { - $name = e($user->fullName()); + $name = e($user->present()->fullName()); } $rows[] = array( diff --git a/app/Http/Controllers/ActionlogController.php b/app/Http/Controllers/ActionlogController.php index 397c670f38..f0d4faad2f 100644 --- a/app/Http/Controllers/ActionlogController.php +++ b/app/Http/Controllers/ActionlogController.php @@ -9,7 +9,7 @@ class ActionlogController extends Controller { public function displaySig($filename) { - + $this->authorize('view', \App\Models\Asset::class); $file = config('app.private_uploads') . '/signatures/' . $filename; $filetype = Helper::checkUploadIsImage($file); $contents = file_get_contents($file); diff --git a/app/Http/Controllers/Api/AccessoriesController.php b/app/Http/Controllers/Api/AccessoriesController.php new file mode 100644 index 0000000000..b1ca7041c1 --- /dev/null +++ b/app/Http/Controllers/Api/AccessoriesController.php @@ -0,0 +1,182 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Accessory::class); + $allowed_columns = ['id','name','model_number','eol','notes','created_at','min_amt','company_id']; + + $accessories = Accessory::whereNull('accessories.deleted_at')->with('category', 'company', 'manufacturer', 'users', 'location'); + + if ($request->has('search')) { + $accessories = $accessories->TextSearch($request->input('search')); + } + + if ($request->has('company_id')) { + $accessories->where('company_id','=',$request->input('company_id')); + } + + if ($request->has('manufacturer_id')) { + $accessories->where('manufacturer_id','=',$request->input('manufacturer_id')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + + switch ($sort) { + case 'category': + $accessories = $accessories->OrderCategory($order); + break; + case 'company': + $accessories = $accessories->OrderCompany($order); + break; + default: + $accessories = $accessories->orderBy($sort, $order); + break; + } + + $accessories->orderBy($sort, $order); + + $total = $accessories->count(); + $accessories = $accessories->skip($offset)->take($limit)->get(); + return (new AccessoriesTransformer)->transformAccessories($accessories, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Accessory::class); + $accessory = new Accessory; + $accessory->fill($request->all()); + + if ($accessory->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $accessory, trans('admin/accessories/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $accessory->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Accessory::class); + $accessory = Accessory::findOrFail($id); + $accessory_users = $accessory->users; + + return (new AccessoriesTransformer)->transformAccessory($accessory); + } + + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function accessory_detail($id) + { + $this->authorize('view', Accessory::class); + $accessory = Accessory::findOrFail($id); + return (new AccessoriesTransformer)->transformAccessory($accessory); + } + + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function checkedout($id) + { + $this->authorize('view', Accessory::class); + $accessory = Accessory::findOrFail($id)->with('users')->first(); + $accessories_users = $accessory->users; + $total = $accessories_users->count(); + return (new AccessoriesTransformer)->transformCheckedoutAccessories($accessories_users, $total); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Accessory::class); + $accessory = Accessory::findOrFail($id); + $accessory->fill($request->all()); + + if ($accessory->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $accessory, trans('admin/accessories/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $accessory->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Accessory::class); + $accessory = Accessory::findOrFail($id); + $this->authorize($accessory); + + if ($accessory->hasUsers() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers())))); + } + + $accessory->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.delete.success'))); + + } +} diff --git a/app/Http/Controllers/Api/AssetMaintenancesController.php b/app/Http/Controllers/Api/AssetMaintenancesController.php new file mode 100644 index 0000000000..db0d58bfa5 --- /dev/null +++ b/app/Http/Controllers/Api/AssetMaintenancesController.php @@ -0,0 +1,227 @@ + + * @version v1.0 + * @since [v1.8] + * @return String JSON + */ + public function index(Request $request) + { + $maintenances = AssetMaintenance::with('asset', 'supplier', 'asset.company', 'admin'); + + if (Input::has('search')) { + $maintenances = $maintenances->TextSearch(e($request->input('search'))); + } + + $offset = request('offset', 0); + $limit = request('limit', 50); + + $allowed_columns = ['id','title','asset_maintenance_time','asset_maintenance_type','cost','start_date','completion_date','notes','user_id']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; + + switch ($sort) { + case 'user_id': + $maintenances = $maintenances->OrderAdmin($order); + break; + default: + $maintenances = $maintenances->orderBy($sort, $order); + break; + } + + + $maintenances = $maintenances->skip($offset)->take($limit)->get(); + + + return (new AssetMaintenancesTransformer())->transformAssetMaintenances($maintenances, $maintenances->count()); + + + } + + + /** + * Validates and stores the new asset maintenance + * + * @see AssetMaintenancesController::getCreate() method for the form + * @author Vincent Sposato + * @version v1.0 + * @since [v1.8] + * @return String JSON + */ + public function store(Request $request) + { + // create a new model instance + $assetMaintenance = new AssetMaintenance(); + $assetMaintenance->supplier_id = $request->input('supplier_id'); + $assetMaintenance->is_warranty = $request->input('is_warranty'); + $assetMaintenance->cost = e($request->input('cost')); + $assetMaintenance->notes = e($request->input('notes')); + $asset = Asset::find(e($request->input('asset_id'))); + + if (!Company::isCurrentUserHasAccess($asset)) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot add a maintenance for that asset')); + } + + // Save the asset maintenance data + $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); + $assetMaintenance->user_id = Auth::id(); + + if (( $assetMaintenance->completion_date !== null ) + && ( $assetMaintenance->start_date !== "" ) + && ( $assetMaintenance->start_date !== "0000-00-00" ) + ) { + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); + $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); + } + + // Was the asset maintenance created? + if ($assetMaintenance->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $assetMaintenance, trans('admin/asset_maintenances/message.create.success'))); + + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $assetMaintenance->getErrors())); + + } + + + /** + * Validates and stores an update to an asset maintenance + * + * @author A. Gianotto + * @param int $assetMaintenanceId + * @param int $request + * @version v1.0 + * @since [v4.0] + * @return String JSON + */ + public function update(Request $request, $assetMaintenanceId = null) + { + // Check if the asset maintenance exists + $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId); + + if (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot edit a maintenance for that asset')); + } + + $assetMaintenance->supplier_id = e($request->input('supplier_id')); + $assetMaintenance->is_warranty = e($request->input('is_warranty')); + $assetMaintenance->cost = Helper::ParseFloat(e($request->input('cost'))); + $assetMaintenance->notes = e($request->input('notes')); + + $asset = Asset::find(request('asset_id')); + + if (!Company::isCurrentUserHasAccess($asset)) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot edit a maintenance for that asset')); + } + + // Save the asset maintenance data + $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); + + if (( $assetMaintenance->completion_date == null ) + ) { + if (( $assetMaintenance->asset_maintenance_time !== 0 ) + || ( !is_null($assetMaintenance->asset_maintenance_time) ) + ) { + $assetMaintenance->asset_maintenance_time = null; + } + } + + if (( $assetMaintenance->completion_date !== null ) + && ( $assetMaintenance->start_date !== "" ) + && ( $assetMaintenance->start_date !== "0000-00-00" ) + ) { + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); + $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); + } + + // Was the asset maintenance created? + if ($assetMaintenance->save()) { + + return response()->json(Helper::formatStandardApiResponse('success', $assetMaintenance, trans('admin/asset_maintenances/message.edit.success'))); + + } + return response()->json(Helper::formatStandardApiResponse('error', null, $assetMaintenance->getErrors())); + } + + /** + * Delete an asset maintenance + * + * @author A. Gianotto + * @param int $assetMaintenanceId + * @version v1.0 + * @since [v4.0] + * @return String JSON + */ + public function destroy($assetMaintenanceId) + { + // Check if the asset maintenance exists + $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId); + + if (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot delete a maintenance for that asset')); + } + + $assetMaintenance->delete(); + + return response()->json(Helper::formatStandardApiResponse('success', $assetMaintenance, trans('admin/asset_maintenances/message.delete.success'))); + + + } + + /** + * View an asset maintenance + * + * @author A. Gianotto + * @param int $assetMaintenanceId + * @version v1.0 + * @since [v4.0] + * @return String JSON + */ + public function show($assetMaintenanceId) + { + $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId); + if (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot view a maintenance for that asset')); + } + return (new AssetMaintenancesTransformer())->transformAssetMaintenance($assetMaintenance); + + } +} diff --git a/app/Http/Controllers/Api/AssetModelsController.php b/app/Http/Controllers/Api/AssetModelsController.php new file mode 100644 index 0000000000..7ef076710c --- /dev/null +++ b/app/Http/Controllers/Api/AssetModelsController.php @@ -0,0 +1,161 @@ +] + */ +class AssetModelsController extends Controller +{ + /** + * Display a listing of the resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', AssetModel::class); + $allowed_columns = ['id','image','name','model_number','eol','notes','created_at','manufacturer']; + + $assetmodels = AssetModel::select(['models.id','models.image','models.name','model_number','eol','models.notes','models.created_at','category_id','manufacturer_id','depreciation_id','fieldset_id']) + ->with('category','depreciation', 'manufacturer','fieldset') + ->withCount('assets'); + + if ($request->has('search')) { + $assetmodels->TextSearch($request->input('search')); + } + + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'models.created_at'; + + switch ($sort) { + case 'manufacturer': + $assetmodels->OrderManufacturer($order); + break; + default: + $assetmodels->orderBy($sort, $order); + break; + } + + + $total = $assetmodels->count(); + $assetmodels = $assetmodels->skip($offset)->take($limit)->get(); + return (new AssetModelsTransformer)->transformAssetModels($assetmodels, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', AssetModel::class); + $assetmodel = new AssetModel; + $assetmodel->fill($request->all()); + + if ($assetmodel->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $assetmodel, trans('admin/models/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $assetmodel->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', AssetModel::class); + $assetmodel = AssetModel::withCount('assets')->findOrFail($id); + return (new AssetModelsTransformer)->transformAssetModel($assetmodel); + } + + /** + * Display the specified resource's assets + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function assets($id) + { + $this->authorize('view', AssetModel::class); + $assets = Asset::where('model_id','=',$id)->get(); + return (new AssetsTransformer)->transformAssets($assets, $assets->count()); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', AssetModel::class); + $assetmodel = AssetModel::findOrFail($id); + $assetmodel->fill($request->all()); + $assetmodel->fieldset_id = $request->get("custom_fieldset_id"); + + if ($assetmodel->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $assetmodel, trans('admin/assetmodels/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $assetmodel->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', AssetModel::class); + $assetmodel = AssetModel::findOrFail($id); + $this->authorize('delete', $assetmodel); + + if ($assetmodel->assets()->count() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.assoc_users'))); + } + + $assetmodel->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/assetmodels/message.delete.success'))); + + } +} diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php new file mode 100644 index 0000000000..a19e308c83 --- /dev/null +++ b/app/Http/Controllers/Api/AssetsController.php @@ -0,0 +1,545 @@ +] + */ +class AssetsController extends Controller +{ + + /** + * Returns JSON listing of all assets + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v4.0] + * @return JsonResponse + */ + public function index(Request $request) + { + $this->authorize('index', Asset::class); + + $allowed_columns = [ + 'id', + 'name', + 'asset_tag', + 'serial', + 'model_number', + 'last_checkout', + 'notes', + 'expected_checkin', + 'order_number', + 'image', + 'assigned_to', + 'created_at', + 'updated_at', + 'purchase_date', + 'purchase_cost' + ]; + + $filter = array(); + if ($request->has('filter')) { + $filter = json_decode($request->input('filter')); + } + + + $all_custom_fields = CustomField::all(); //used as a 'cache' of custom fields throughout this page load + foreach ($all_custom_fields as $field) { + $allowed_columns[]=$field->db_column_name(); + } + + $assets = Company::scopeCompanyables(Asset::select('assets.*'))->with( + 'assetloc', 'assetstatus', 'defaultLoc', 'assetlog', 'company', + 'model.category', 'model.manufacturer', 'model.fieldset','supplier'); + // If we should search on everything + if (($request->has('search')) && (count($filter) == 0)) { + $assets->TextSearch($request->input('search')); + // otherwise loop through the filters and search strictly on them + } else { + if (count($filter) > 0) { + $assets->ByFilter($filter); + } + } + + // These are used by the API to query against specific ID numbers + if ($request->has('status_id')) { + $assets->where('status_id', '=', $request->input('status_id')); + } + + if ($request->has('model_id')) { + $assets->InModelList([$request->input('model_id')]); + } + + if ($request->has('category_id')) { + $assets->InCategory($request->input('category_id')); + } + + if ($request->has('location_id')) { + $assets->ByLocationId($request->input('location_id')); + } + + if ($request->has('supplier_id')) { + $assets->where('assets.supplier_id', '=', $request->input('supplier_id')); + } + + if ($request->has('company_id')) { + $assets->where('assets.company_id', '=', $request->input('company_id')); + } + + if ($request->has('manufacturer_id')) { + $assets->ByManufacturer($request->input('manufacturer_id')); + } + + $request->has('order_number') ? $assets = $assets->where('order_number', '=', e($request->get('order_number'))) : ''; + + $offset = request('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + + + // This is used by the sidenav, mostly + switch ($request->input('status')) { + case 'Deleted': + $assets->withTrashed()->Deleted(); + break; + case 'Pending': + $assets->Pending(); + break; + case 'RTD': + $assets->RTD(); + break; + case 'Undeployable': + $assets->Undeployable(); + break; + case 'Archived': + $assets->Archived(); + break; + case 'Requestable': + $assets->RequestableAssets(); + break; + case 'Deployed': + $assets->Deployed(); + break; + } + + + + // This handles all of the pivot sorting (versus the assets.* fields in the allowed_columns array) + $column_sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'assets.created_at'; + + switch ($request->input('sort')) { + case 'model': + $assets->OrderModels($order); + break; + case 'model_number': + $assets->OrderModelNumber($order); + break; + case 'category': + $assets->OrderCategory($order); + break; + case 'manufacturer': + $assets->OrderManufacturer($order); + break; + case 'company': + $assets->OrderCompany($order); + break; + case 'location': + $assets->OrderLocation($order); + break; + case 'status_label': + $assets->OrderStatus($order); + break; + case 'supplier': + $assets->OrderSupplier($order); + break; + case 'assigned_to': + $assets->OrderAssigned($order); + break; + default: + $assets->orderBy($column_sort, $order); + break; + } + + $total = $assets->count(); + $assets = $assets->skip($offset)->take($limit)->get(); + return (new AssetsTransformer)->transformAssets($assets, $total); + } + + + /** + * Returns JSON with information about an asset for detail view. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v4.0] + * @return JsonResponse + */ + public function show($id) + { + if ($asset = Asset::withTrashed()->find($id)) { + $this->authorize('view', $asset); + return (new AssetsTransformer)->transformAsset($asset); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); + } + + + /** + * Accepts a POST request to create a new asset + * + * @author [A. Gianotto] [] + * @param Request $request + * @since [v4.0] + * @return JsonResponse + */ + public function store(AssetRequest $request) + { + + $this->authorize('create', Asset::class); + + $asset = new Asset(); + $asset->model()->associate(AssetModel::find((int) $request->get('model_id'))); + + $asset->name = $request->get('name'); + $asset->serial = $request->get('serial'); + $asset->company_id = Company::getIdForCurrentUser($request->get('company_id')); + $asset->model_id = $request->get('model_id'); + $asset->order_number = $request->get('order_number'); + $asset->notes = $request->get('notes'); + $asset->asset_tag = $request->get('asset_tag'); + $asset->user_id = Auth::id(); + $asset->archived = '0'; + $asset->physical = '1'; + $asset->depreciate = '0'; + $asset->status_id = $request->get('status_id', 0); + $asset->warranty_months = $request->get('warranty_months', null); + $asset->purchase_cost = Helper::ParseFloat($request->get('purchase_cost')); + $asset->purchase_date = $request->get('purchase_date', null); + $asset->assigned_to = $request->get('assigned_to', null); + $asset->supplier_id = $request->get('supplier_id', 0); + $asset->requestable = $request->get('requestable', 0); + $asset->rtd_location_id = $request->get('rtd_location_id', null); + + // Update custom fields in the database. + // Validation for these fields is handled through the AssetRequest form request + $model = AssetModel::find($request->get('model_id')); + if ($model->fieldset) { + foreach ($model->fieldset->fields as $field) { + $asset->{$field->convertUnicodeDbSlug()} = e($request->input($field->convertUnicodeDbSlug())); + } + } + + if ($asset->save()) { + $asset->logCreate(); + if ($request->get('assigned_user')) { + $target = User::find(request('assigned_user')); + } elseif ($request->get('assigned_asset')) { + $target = Asset::find(request('assigned_asset')); + } elseif ($request->get('assigned_location')) { + $target = Location::find(request('assigned_location')); + } + if (isset($target)) { + $asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e($request->get('name'))); + } + return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.create.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200); + } + + + /** + * Accepts a POST request to update an asset + * + * @author [A. Gianotto] [] + * @param Request $request + * @since [v4.0] + * @return JsonResponse + */ + public function update(Request $request, $id) + { + $this->authorize('create', Asset::class); + + if ($asset = Asset::find($id)) { + ($request->has('model_id')) ? + $asset->model()->associate(AssetModel::find($request->get('model_id'))) : ''; + ($request->has('name')) ? + $asset->name = $request->get('name') : ''; + ($request->has('serial')) ? + $asset->serial = $request->get('serial') : ''; + ($request->has('model_id')) ? + $asset->model_id = $request->get('model_id') : ''; + ($request->has('order_number')) ? + $asset->order_number = $request->get('order_number') : ''; + ($request->has('notes')) ? + $asset->notes = $request->get('notes') : ''; + ($request->has('asset_tag')) ? + $asset->asset_tag = $request->get('asset_tag') : ''; + ($request->has('archived')) ? + $asset->archived = $request->get('archived') : ''; + ($request->has('status_id')) ? + $asset->status_id = $request->get('status_id') : ''; + ($request->has('warranty_months')) ? + $asset->warranty_months = $request->get('warranty_months') : ''; + ($request->has('purchase_cost')) ? + $asset->purchase_cost = Helper::ParseFloat($request->get('purchase_cost')) : ''; + ($request->has('purchase_date')) ? + $asset->purchase_date = $request->get('purchase_date') : ''; + ($request->has('assigned_to')) ? + $asset->assigned_to = $request->get('assigned_to') : ''; + ($request->has('supplier_id')) ? + $asset->supplier_id = $request->get('supplier_id') : ''; + ($request->has('requestable')) ? + $asset->requestable = $request->get('requestable') : ''; + ($request->has('rtd_location_id')) ? + $asset->rtd_location_id = $request->get('rtd_location_id') : ''; + ($request->has('company_id')) ? + $asset->company_id = Company::getIdForCurrentUser($request->get('company_id')) : ''; + + if ($request->has('model_id')) { + if (($model = AssetModel::find($request->get('model_id'))) && (isset($model->fieldset))) { + foreach ($model->fieldset->fields as $field) { + if ($request->has($field->convertUnicodeDbSlug())) { + $asset->{$field->convertUnicodeDbSlug()} = e($request->input($field->convertUnicodeDbSlug())); + } + } + } + } + + if ($asset->save()) { + + if ($request->get('assigned_user')) { + $target = User::find(request('assigned_user')); + } elseif ($request->get('assigned_asset')) { + $target = Asset::find(request('assigned_asset')); + } elseif ($request->get('assigned_location')) { + $target = Location::find(request('assigned_location')); + } + + if (isset($target)) { + $asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset update', e($request->get('name'))); + } + + return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.update.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200); + } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); + } + + + /** + * Delete a given asset (mark as deleted). + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v4.0] + * @return JsonResponse + */ + public function destroy($id) + { + $this->authorize('delete', Asset::class); + + if ($asset = Asset::find($id)) { + + $this->authorize('delete', $asset); + + DB::table('assets') + ->where('id', $asset->id) + ->update(array('assigned_to' => null)); + + $asset->delete(); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.delete.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); + } + + + + /** + * Checkout an asset + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v4.0] + * @return JsonResponse + */ + public function checkout(Request $request, $asset_id) + { + $this->authorize('checkout', Asset::class); + $asset = Asset::findOrFail($asset_id); + + if (!$asset->availableForCheckout()) { + return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkout.not_available'))); + } + + $this->authorize('checkout', $asset); + + if ($request->has('user_id')) { + $target = User::find($request->input('user_id')); + } elseif ($request->has('asset_id')) { + $target = Asset::find($request->input('asset_id')); + } elseif ($request->has('location_id')) { + $target = Location::find($request->input('location_id')); + } + + if (!isset($target)) { + return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], 'No valid checkout target specified for asset '.e($asset->asset_tag).'.')); + } + + $checkout_at = request('checkout_at', date("Y-m-d H:i:s")); + $expected_checkin = request('expected_checkin', null); + $note = request('note', null); + $asset_name = request('name', null); + + + if ($asset->checkOut($target, Auth::user(), $checkout_at, $expected_checkin, $note, $asset_name)) { + return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkout.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkout.error')))->withErrors($asset->getErrors()); + } + + + /** + * Checkin an asset + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v4.0] + * @return JsonResponse + */ + public function checkin($asset_id) + { + $this->authorize('checkin', Asset::class); + $asset = Asset::findOrFail($asset_id); + $this->authorize('checkin', $asset); + + + $user = $asset->assignedUser; + if (is_null($target = $asset->assignedTo)) { + return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.already_checked_in'))); + } + + $asset->expected_checkin = null; + $asset->last_checkout = null; + $asset->assigned_to = null; + $asset->assignedTo()->disassociate($asset); + $asset->accepted = null; + $asset->name = e(Input::get('name')); + + if (Input::has('status_id')) { + $asset->status_id = e(Input::get('status_id')); + } + + // Was the asset updated? + if ($asset->save()) { + $logaction = $asset->logCheckin($target, e(request('note'))); + + $data['log_id'] = $logaction->id; + $data['first_name'] = get_class($target) == User::class ? $target->first_name : ''; + $data['item_name'] = $asset->present()->name(); + $data['checkin_date'] = $logaction->created_at; + $data['item_tag'] = $asset->asset_tag; + $data['item_serial'] = $asset->serial; + $data['note'] = $logaction->note; + + if ((($asset->checkin_email()=='1')) && (isset($user)) && (!config('app.lock_passwords'))) { + Mail::send('emails.checkin-asset', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name')); + $m->subject(trans('mail.Confirm_Asset_Checkin')); + }); + } + + return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.error'))); + } + + + /** + * Mark an asset as audited + * + * @author [A. Gianotto] [] + * @param int $id + * @since [v4.0] + * @return JsonResponse + */ + public function audit(Request $request) { + + + $this->authorize('audit', Asset::class); + $rules = array( + 'asset_tag' => 'required', + 'location_id' => 'exists:locations,id|nullable|numeric', + 'next_audit_date' => 'date|nullable' + ); + + $validator = Validator::make($request->all(), $rules); + if ($validator->fails()) { + return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all())); + } + + $asset = Asset::where('asset_tag','=', $request->input('asset_tag'))->first(); + + + if ($asset) { + $asset->next_audit_date = $request->input('next_audit_date'); + if ($asset->save()) { + $log = $asset->logAudit(request('note'),request('location_id')); + return response()->json(Helper::formatStandardApiResponse('success', [ + 'asset_tag'=> e($asset->asset_tag), + 'note'=> e($request->input('note')), + 'next_audit_date' => Helper::getFormattedDateObject($log->calcNextAuditDate()) + ], trans('admin/hardware/message.audit.success'))); + } + } + + return response()->json(Helper::formatStandardApiResponse('error', ['asset_tag'=> e($request->input('asset_tag'))], 'Asset with tag '.$request->input('asset_tag').' not found')); + + + + + + } +} diff --git a/app/Http/Controllers/Api/CategoriesController.php b/app/Http/Controllers/Api/CategoriesController.php new file mode 100644 index 0000000000..944f049f6f --- /dev/null +++ b/app/Http/Controllers/Api/CategoriesController.php @@ -0,0 +1,131 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Category::class); + $allowed_columns = ['id', 'name','category_type','use_default_eula','require_acceptance','checkin_email']; + + $categories = Category::select(['id', 'created_at', 'updated_at', 'name','category_type','use_default_eula','require_acceptance','checkin_email']) + ->withCount('assets', 'accessories', 'consumables', 'components'); + + if ($request->has('search')) { + $categories = $categories->TextSearch($request->input('search')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $categories->orderBy($sort, $order); + + $total = $categories->count(); + $categories = $categories->skip($offset)->take($limit)->get(); + return (new CategoriesTransformer)->transformCategories($categories, $total); + + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Category::class); + $category = new Category; + $category->fill($request->all()); + + if ($category->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $category, trans('admin/categories/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $category->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Category::class); + $category = Category::findOrFail($id); + return (new CategoriesTransformer)->transformCategory($category); + + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Category::class); + $category = Category::findOrFail($id); + $category->fill($request->all()); + + if ($category->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $category, trans('admin/categories/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $category->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Category::class); + $category = Category::findOrFail($id); + + if ($category->has_models() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'model']))); + } elseif ($category->accessories()->count() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'accessory']))); + } elseif ($category->consumables()->count() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'consumable']))); + } elseif ($category->components()->count() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'component']))); + } + $category->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/categories/message.delete.success'))); + + } +} diff --git a/app/Http/Controllers/Api/CompaniesController.php b/app/Http/Controllers/Api/CompaniesController.php new file mode 100644 index 0000000000..f2a5d36ed9 --- /dev/null +++ b/app/Http/Controllers/Api/CompaniesController.php @@ -0,0 +1,144 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Company::class); + + $allowed_columns = ['id','name']; + + $companies = Company::withCount('assets','licenses','accessories','consumables','components','users') + ->withCount('users')->withCount('users')->withCount('assets') + ->withCount('licenses')->withCount('accessories') + ->withCount('consumables')->withCount('components'); + + if ($request->has('search')) { + $companies->TextSearch($request->input('search')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $companies->orderBy($sort, $order); + + $total = $companies->count(); + $companies = $companies->skip($offset)->take($limit)->get(); + return (new CompaniesTransformer)->transformCompanies($companies, $total); + + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Company::class); + $company = new Company; + $company->fill($request->all()); + + if ($company->save()) { + return response()->json(Helper::formatStandardApiResponse('success', (new CompaniesTransformer)->transformCompany($company), trans('admin/companies/message.create.success'))); + } + return response() + ->json(Helper::formatStandardApiResponse('error', null, $company->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Company::class); + $company = Company::findOrFail($id); + return (new CompaniesTransformer)->transformCompany($company); + + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Company::class); + $company = Company::findOrFail($id); + $company->fill($request->all()); + + if ($company->save()) { + return response() + ->json(Helper::formatStandardApiResponse('success', (new CompaniesTransformer)->transformCompany($company), trans('admin/companies/message.update.success'))); + } + + return response() + ->json(Helper::formatStandardApiResponse('error', null, $company->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Company::class); + $company = Company::findOrFail($id); + $this->authorize('delete', $company); + + try { + $company->delete(); + return response() + ->json(Helper::formatStandardApiResponse('success', null, trans('admin/companies/message.delete.success'))); + } catch (\Illuminate\Database\QueryException $exception) { + /* + * NOTE: This happens when there's a foreign key constraint violation + * For example when rows in other tables are referencing this company + */ + if ($exception->getCode() == 23000) { + return response() + ->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users'))); + + } else { + throw $exception; + } + } + + } +} diff --git a/app/Http/Controllers/Api/ComponentsController.php b/app/Http/Controllers/Api/ComponentsController.php new file mode 100644 index 0000000000..1ffb3d4e0e --- /dev/null +++ b/app/Http/Controllers/Api/ComponentsController.php @@ -0,0 +1,163 @@ +] + * @since [v4.0] + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Component::class); + $components = Company::scopeCompanyables(Component::select('components.*')->whereNull('components.deleted_at') + ->with('company', 'location', 'category')); + + if ($request->has('search')) { + $components = $components->TextSearch($request->input('search')); + } + + $offset = request('offset', 0); + $limit = request('limit', 50); + + $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','company','category','qty','location']; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + + switch ($sort) { + case 'category': + $components = $components->OrderCategory($order); + break; + case 'location': + $components = $components->OrderLocation($order); + break; + case 'company': + $components = $components->OrderCompany($order); + break; + default: + $components = $components->orderBy($sort, $order); + break; + } + + $total = $components->count(); + $components = $components->skip($offset)->take($limit)->get(); + return (new ComponentsTransformer)->transformComponents($components, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Component::class); + $component = new Component; + $component->fill($request->all()); + + if ($component->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $component, trans('admin/components/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $component->getErrors())); + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Component::class); + $component = Component::find($id); + + if ($component) { + return (new ComponentsTransformer)->transformComponent($component); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/components/message.does_not_exist'))); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Component::class); + $component = Component::findOrFail($id); + $component->fill($request->all()); + + if ($component->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $component, trans('admin/components/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $component->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Component::class); + $component = Component::findOrFail($id); + $this->authorize('delete', $component); + $component->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.delete.success'))); + } + + /** + * Display all assets attached to a component + * + * @author [A. Bergamasco] [@vjandrea] + * @since [v4.0] + * @param Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function getAssets(Request $request, $id) + { + $this->authorize('index', Asset::class); + + $component = Component::findOrFail($id); + $assets = $component->assets(); + + $offset = request('offset', 0); + $limit = $request->input('limit', 50); + $total = $assets->count(); + $assets = $assets->skip($offset)->take($limit)->get(); + return (new ComponentsAssetsTransformer)->transformAssets($assets, $total); + } +} diff --git a/app/Http/Controllers/Api/ConsumablesController.php b/app/Http/Controllers/Api/ConsumablesController.php new file mode 100644 index 0000000000..793de92140 --- /dev/null +++ b/app/Http/Controllers/Api/ConsumablesController.php @@ -0,0 +1,194 @@ +] + * @since [v4.0] + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('index', Consumable::class); + $consumables = Company::scopeCompanyables( + Consumable::select('consumables.*') + ->whereNull('consumables.deleted_at') + ->with('company', 'location', 'category', 'users', 'manufacturer') + ); + + if ($request->has('search')) { + $consumables = $consumables->TextSearch(e($request->input('search'))); + } + + if ($request->has('company_id')) { + $consumables->where('company_id','=',$request->input('company_id')); + } + + if ($request->has('manufacturer_id')) { + $consumables->where('manufacturer_id','=',$request->input('manufacturer_id')); + } + + + $offset = request('offset', 0); + $limit = request('limit', 50); + $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','company','category','model_number', 'item_no', 'manufacturer','location','qty']; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + + + switch ($sort) { + case 'category': + $consumables = $consumables->OrderCategory($order); + break; + case 'location': + $consumables = $consumables->OrderLocation($order); + break; + case 'manufacturer': + $consumables = $consumables->OrderManufacturer($order); + break; + case 'company': + $consumables = $consumables->OrderCompany($order); + break; + default: + $consumables = $consumables->orderBy($sort, $order); + break; + } + + + + $total = $consumables->count(); + $consumables = $consumables->skip($offset)->take($limit)->get(); + return (new ConsumablesTransformer)->transformConsumables($consumables, $total); + + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Consumable::class); + $consumable = new Consumable; + $consumable->fill($request->all()); + + if ($consumable->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $consumable, trans('admin/consumables/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $consumable->getErrors())); + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Consumable::class); + $consumable = Consumable::findOrFail($id); + return (new ConsumablesTransformer)->transformConsumable($consumable); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Consumable::class); + $consumable = Consumable::findOrFail($id); + $consumable->fill($request->all()); + + if ($consumable->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $consumable, trans('admin/consumables/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $consumable->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Consumable::class); + $consumable = Consumable::findOrFail($id); + $this->authorize('delete', $consumable); + $consumable->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/consumables/message.delete.success'))); + } + + /** + * Returns a JSON response containing details on the users associated with this consumable. + * + * @author [A. Gianotto] [] + * @see ConsumablesController::getView() method that returns the form. + * @since [v1.0] + * @param int $consumableId + * @return array + */ + public function getDataView($consumableId) + { + //$consumable = Consumable::find($consumableID); + $consumable = Consumable::with(array('consumableAssignments'=> + function ($query) { + $query->orderBy('created_at', 'DESC'); + }, + 'consumableAssignments.admin'=> function ($query) { + }, + 'consumableAssignments.user'=> function ($query) { + }, + ))->find($consumableId); + + // $consumable->load('consumableAssignments.admin','consumableAssignments.user'); + + if (!Company::isCurrentUserHasAccess($consumable)) { + return ['total' => 0, 'rows' => []]; + } + $this->authorize('view', Component::class); + $rows = array(); + + foreach ($consumable->consumableAssignments as $consumable_assignment) { + $rows[] = [ + 'name' => $consumable_assignment->user->present()->nameUrl(), + 'created_at' => ($consumable_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $consumable_assignment->created_at->format('Y-m-d H:i:s'), + 'admin' => ($consumable_assignment->admin) ? $consumable_assignment->admin->present()->nameUrl() : '', + ]; + } + + $consumableCount = $consumable->users->count(); + $data = array('total' => $consumableCount, 'rows' => $rows); + return $data; + } +} diff --git a/app/Http/Controllers/Api/CustomFieldsController.php b/app/Http/Controllers/Api/CustomFieldsController.php new file mode 100644 index 0000000000..38976d2840 --- /dev/null +++ b/app/Http/Controllers/Api/CustomFieldsController.php @@ -0,0 +1,71 @@ +] + * @param int $id + * @since [v3.0] + * @return Array + */ + + public function index() + { + $this->authorize('index', CustomFields::class); + $fields = CustomField::get(); + + $total = count($fields); + return (new CustomFieldsTransformer)->transformCustomFields($fields, $total); + } + public function postReorder(Request $request, $id) + { + $fieldset = CustomFieldset::find($id); + $fields = array(); + $order_array = array(); + + $items = $request->input('item'); + + foreach ($items as $order => $field_id) { + $order_array[$field_id] = $order; + } + + foreach ($fieldset->fields as $field) { + $fields[$field->id] = ['required' => $field->pivot->required, 'order' => $order_array[$field->id]]; + } + + return $fieldset->fields()->sync($fields); + + } + + + /** + * Delete a custom field. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return Redirect + */ + public function destroy($field_id) + { + $field = CustomField::find($field_id); + + if ($field->fieldset->count() >0) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'Field is in use.')); + } else { + $field->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.field.delete.success'))); + + } + } + +} diff --git a/app/Http/Controllers/Api/CustomFieldsetsController.php b/app/Http/Controllers/Api/CustomFieldsetsController.php new file mode 100644 index 0000000000..3b82d0e5eb --- /dev/null +++ b/app/Http/Controllers/Api/CustomFieldsetsController.php @@ -0,0 +1,147 @@ +] + * @author [Josh Gibson] + */ + +class CustomFieldsetsController extends Controller +{ + + /** + * Shows the given fieldset and its fields + * @author [A. Gianotto] [] + * @author [Josh Gibson] + * @param int $id + * @since [v1.8] + * @return View + */ + public function index() + { + $this->authorize('index', CustomFieldset::class); + $fieldsets = CustomFieldset::withCount(['fields', 'models'])->get(); + + $total = count($fieldsets); + return (new CustomFieldsetsTransformer)->transformCustomFieldsets($fieldsets, $total); + + } + + /** + * Shows the given fieldset and its fields + * @author [A. Gianotto] [] + * @author [Josh Gibson] + * @param int $id + * @since [v1.8] + * @return View + */ + public function show($id) + { + $this->authorize('show', CustomFieldset::class); + if ($fieldset = CustomFieldset::find($id)) { + return (new CustomFieldsetsTransformer)->transformCustomFieldset($fieldset); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/custom_fields/message.fieldset.does_not_exist')), 200); + + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', CustomFieldset::class); + $fieldset = CustomFieldset::findOrFail($id); + $fieldset->fill($request->all()); + + if ($fieldset->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $fieldset->getErrors())); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', CustomFieldset::class); + $fieldset = new CustomFieldset; + $fieldset->fill($request->all()); + + if ($fieldset->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $fieldset->getErrors())); + + } + + + /** + * Delete a custom fieldset. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return Redirect + */ + public function destroy($id) + { + $this->authorize('delete', CustomFieldset::class); + $fieldset = CustomFieldset::findOrFail($id); + + $modelsCount = $fieldset->models->count(); + $fieldsCount = $fieldset->fields->count(); + + if (($modelsCount > 0) || ($fieldsCount > 0) ){ + return response()->json(Helper::formatStandardApiResponse('error', null, 'Fieldset is in use.')); + } + + if ($fieldset->delete()) { + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.fieldset.delete.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, 'Unspecified error')); + + + + } + +} diff --git a/app/Http/Controllers/Api/DepartmentsController.php b/app/Http/Controllers/Api/DepartmentsController.php new file mode 100644 index 0000000000..8119c735ef --- /dev/null +++ b/app/Http/Controllers/Api/DepartmentsController.php @@ -0,0 +1,113 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Department::class); + $allowed_columns = ['id','name']; + + $departments = Department::select([ + 'id', + 'name', + 'location_id', + 'company_id', + 'manager_id', + 'created_at', + 'updated_at' + ])->with('users')->with('location')->with('manager')->with('company')->withCount('users'); + + if ($request->has('search')) { + $departments = $departments->TextSearch($request->input('search')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $departments->orderBy($sort, $order); + + $total = $departments->count(); + $departments = $departments->skip($offset)->take($limit)->get(); + return (new DepartmentsTransformer)->transformDepartments($departments, $total); + + } + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Department::class); + $department = new Department; + $department->fill($request->all()); + $department->user_id = Auth::user()->id; + $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); + + if ($department->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $department, trans('admin/departments/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $department->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Department::class); + $department = Department::findOrFail($id); + return (new DepartmentsTransformer)->transformDepartment($department); + } + + + + /** + * Validates and deletes selected location. + * + * @author [A. Gianotto] [] + * @param int $locationId + * @since [v1.0] + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($id) + { + $department = Department::findOrFail($id); + + if ($department->users->count() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/departments/message.assoc_users'))); + } + + $department->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/departments/message.delete.success'))); + + } + +} diff --git a/app/Http/Controllers/Api/DepreciationsController.php b/app/Http/Controllers/Api/DepreciationsController.php new file mode 100644 index 0000000000..f8643f9d9c --- /dev/null +++ b/app/Http/Controllers/Api/DepreciationsController.php @@ -0,0 +1,127 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Depreciation::class); + $allowed_columns = ['id','name','created_at']; + + $depreciations = Depreciation::select('id','name','months','user_id','created_at','updated_at'); + + if ($request->has('search')) { + $depreciations = $depreciations->TextSearch($request->input('search')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $depreciations->orderBy($sort, $order); + + $total = $depreciations->count(); + $depreciations = $depreciations->skip($offset)->take($limit)->get(); + return (new DepreciationsTransformer)->transformDepreciations($depreciations, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Depreciation::class); + $depreciation = new Depreciation; + $depreciation->fill($request->all()); + + if ($depreciation->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $depreciation, trans('admin/depreciations/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $depreciation->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Depreciation::class); + $depreciation = Depreciation::findOrFail($id); + return (new DepreciationsTransformer)->transformDepreciation($depreciation); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Depreciation::class); + $depreciation = Depreciation::findOrFail($id); + $depreciation->fill($request->all()); + + if ($depreciation->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $depreciation, trans('admin/depreciations/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $depreciation->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Depreciation::class); + $depreciation = Depreciation::findOrFail($id); + $this->authorize('delete', $depreciation); + + if ($depreciation->has_models() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', trans('admin/depreciations/message.assoc_users'))); + } + + $depreciation->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/depreciations/message.delete.success'))); + + } + + + +} diff --git a/app/Http/Controllers/Api/GroupsController.php b/app/Http/Controllers/Api/GroupsController.php new file mode 100644 index 0000000000..a821b57cef --- /dev/null +++ b/app/Http/Controllers/Api/GroupsController.php @@ -0,0 +1,121 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Group::class); + $allowed_columns = ['id','name','created_at']; + + $groups = Group::select('id','name','permissions','created_at','updated_at')->withCount('users'); + + if ($request->has('search')) { + $groups = $groups->TextSearch($request->input('search')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $groups->orderBy($sort, $order); + + $total = $groups->count(); + $groups = $groups->skip($offset)->take($limit)->get(); + return (new GroupsTransformer)->transformGroups($groups, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Group::class); + $group = new Group; + $group->fill($request->all()); + + if ($group->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $group, trans('admin/groups/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $group->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Group::class); + $group = Group::findOrFail($id); + return $group; + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Group::class); + $group = Group::findOrFail($id); + $group->fill($request->all()); + + if ($group->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $group, trans('admin/groups/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $group->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Group::class); + $group = Group::findOrFail($id); + $this->authorize('delete', $group); + $group->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/groups/message.delete.success'))); + + } + + +} diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php new file mode 100644 index 0000000000..e9d15198b2 --- /dev/null +++ b/app/Http/Controllers/Api/ImportController.php @@ -0,0 +1,147 @@ +get(); + return (new ImportsTransformer)->transformImports($imports); + + } + + /** + * Process and store a CSV upload file. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store() + { + // + if (!Company::isCurrentUserAuthorized()) { + return redirect()->route('hardware.index')->with('error', trans('general.insufficient_permissions')); + } elseif (!config('app.lock_passwords')) { + $files = Input::file('files'); + $path = config('app.private_uploads').'/imports'; + $results = []; + $import = new Import; + foreach ($files as $file) { + if (!in_array($file->getMimeType(), array( + 'application/vnd.ms-excel', + 'text/csv', + 'text/plain', + 'text/comma-separated-values', + 'text/tsv'))) { + $results['error']='File type must be CSV'; + return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 500); + } + + $date = date('Y-m-d-his'); + $fixed_filename = str_slug($file->getClientOriginalName()); + try { + $file->move($path, $date.'-'.$fixed_filename); + } catch (FileException $exception) { + $results['error']=trans('admin/hardware/message.upload.error'); + if (config('app.debug')) { + $results['error'].= ' ' . $exception->getMessage(); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 500); + } + $file_name = date('Y-m-d-his').'-'.$fixed_filename; + $import->file_path = $file_name; + $import->filesize = filesize($path.'/'.$file_name); + //TODO: is there a lighter way to do this? + $reader = Reader::createFromPath("{$path}/{$file_name}"); + $import->header_row = $reader->fetchOne(0); + // Grab the first row to display via ajax as the user picks fields + $import->first_row = $reader->fetchOne(1); + $import->save(); + $results[] = $import; + } + $results = (new ImportsTransformer)->transformImports($results); + return [ + 'files' => $results, + ]; + } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.feature_disabled')), 500); + } + /** + * Processes the specified Import. + * + * @param \App\Import $import + * @return \Illuminate\Http\Response + */ + public function process(ItemImportRequest $request, $import_id) + { + $this->authorize('create', Asset::class); + $errors = $request->import(Import::find($import_id)); + $redirectTo = "hardware.index"; + switch ($request->get('import-type')) { + case "asset": + $redirectTo = "hardware.index"; + break; + case "accessory": + $redirectTo = "accessories.index"; + break; + case "consumable": + $redirectTo = "consumables.index"; + break; + case "component": + $redirectTo = "components.index"; + break; + case "license": + $redirectTo = "licenses.index"; + break; + case "user": + $redirectTo = "users.index"; + break; + } + + if ($errors) { //Failure + return response()->json(Helper::formatStandardApiResponse('import-errors', null, $errors), 500); + } + //Flash message before the redirect + Session::flash('success', trans('admin/hardware/message.import.success')); + return response()->json(Helper::formatStandardApiResponse('success', null, ['redirect_url' => route($redirectTo)])); + + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Import $import + * @return \Illuminate\Http\Response + */ + public function destroy($import_id) + { + $this->authorize('create', Asset::class); + $import = Import::find($import_id); + try { + unlink(config('app.private_uploads').'/imports/'.$import->file_path); + $import->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.import.file_delete_success'))); + } catch (\Exception $e) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.import.file_delete_error')), 500); + } + } +} diff --git a/app/Http/Controllers/Api/LicensesController.php b/app/Http/Controllers/Api/LicensesController.php new file mode 100644 index 0000000000..ff58362f6c --- /dev/null +++ b/app/Http/Controllers/Api/LicensesController.php @@ -0,0 +1,164 @@ +] + * @since [v4.0] + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', License::class); + $licenses = Company::scopeCompanyables(License::with('company', 'licenseSeatsRelation', 'manufacturer', 'supplier')); + + if ($request->has('search')) { + $licenses = $licenses->TextSearch($request->input('search')); + } + + if ($request->has('company_id')) { + $licenses->where('company_id','=',$request->input('company_id')); + } + + if ($request->has('name')) { + $licenses->where('licenses.name','=',$request->input('name')); + } + + if ($request->has('product_key')) { + $licenses->where('licenses.serial','=',$request->input('product_key')); + } + + if ($request->has('order_number')) { + $licenses->where('order_number','=',$request->input('order_number')); + } + + if ($request->has('purchase_order')) { + $licenses->where('purchase_order','=',$request->input('purchase_order')); + } + + if ($request->has('license_name')) { + $licenses->where('license_name','=',$request->input('license_name')); + } + + if ($request->has('license_email')) { + $licenses->where('license_email','=',$request->input('license_email')); + } + + if ($request->has('manufacturer_id')) { + $licenses->where('manufacturer_id','=',$request->input('manufacturer_id')); + } + + if ($request->has('supplier_id')) { + $licenses->where('supplier_id','=',$request->input('supplier_id')); + } + + if ($request->has('depreciation_id')) { + $licenses->where('depreciation_id','=',$request->input('depreciation_id')); + } + + if ($request->has('supplier_id')) { + $licenses->where('supplier_id','=',$request->input('supplier_id')); + } + + $offset = request('offset', 0); + $limit = request('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + + + switch ($request->input('sort')) { + case 'manufacturer': + $licenses = $licenses->OrderManufacturer($order); + break; + case 'supplier': + $licenses = $licenses->OrderSupplier($order); + break; + case 'company': + $licenses = $licenses->OrderCompany($order); + break; + default: + $allowed_columns = ['id','name','purchase_cost','expiration_date','purchase_order','order_number','notes','purchase_date','serial','company','license_name','license_email']; + $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; + $licenses = $licenses->orderBy($sort, $order); + break; + } + + + $total = $licenses->count(); + $licenses = $licenses->skip($offset)->take($limit)->get(); + return (new LicensesTransformer)->transformLicenses($licenses, $total); + + } + + + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $license = License::find($id); + if (isset($license->id)) { + $license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset'); + $this->authorize('view', $license); + return (new LicensesTransformer)->transformLicense($license); + } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/licenses/message.does_not_exist')), 200); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/Api/LocationsController.php b/app/Http/Controllers/Api/LocationsController.php new file mode 100644 index 0000000000..78ed868ff9 --- /dev/null +++ b/app/Http/Controllers/Api/LocationsController.php @@ -0,0 +1,135 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Location::class); + $allowed_columns = ['id','name','address','address2','city','state','country','zip','created_at', + 'updated_at','parent_id', 'manager_id']; + + $locations = Location::select([ + 'locations.id', + 'locations.name', + 'locations.address', + 'locations.address2', + 'locations.city', + 'locations.state', + 'locations.zip', + 'locations.country', + 'locations.parent_id', + 'locations.manager_id', + 'locations.created_at', + 'locations.updated_at', + 'locations.currency' + ])->withCount('assets')->withCount('users'); + + if ($request->has('search')) { + $locations = $locations->TextSearch($request->input('search')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $locations->orderBy($sort, $order); + + $total = $locations->count(); + $locations = $locations->skip($offset)->take($limit)->get(); + return (new LocationsTransformer)->transformLocations($locations, $total); + + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Location::class); + $location = new Location; + $location->fill($request->all()); + + if ($location->save()) { + return response()->json(Helper::formatStandardApiResponse('success', (new LocationsTransformer)->transformLocation($location), trans('admin/locations/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $location->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Location::class); + $location = Location::findOrFail($id); + return (new LocationsTransformer)->transformLocation($location); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Location::class); + $location = Location::findOrFail($id); + $location->fill($request->all()); + + if ($location->save()) { + return response()->json(Helper::formatStandardApiResponse('success', (new LocationsTransformer)->transformLocation($location), trans('admin/locations/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $location->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Location::class); + $location = Location::findOrFail($id); + $this->authorize('delete', $location); + $location->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/locations/message.delete.success'))); + + } +} diff --git a/app/Http/Controllers/Api/ManufacturersController.php b/app/Http/Controllers/Api/ManufacturersController.php new file mode 100644 index 0000000000..3840bc3634 --- /dev/null +++ b/app/Http/Controllers/Api/ManufacturersController.php @@ -0,0 +1,123 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Manufacturer::class); + $allowed_columns = ['id','name','url','support_url','support_email','support_phone','created_at','updated_at']; + + $manufacturers = Manufacturer::select( + array('id','name','url','support_url','support_email','support_phone','created_at','updated_at') + )->withCount('assets')->withCount('licenses')->withCount('consumables')->withCount('accessories'); + + + if ($request->has('search')) { + $manufacturers = $manufacturers->TextSearch($request->input('search')); + } + + $offset = request('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $manufacturers->orderBy($sort, $order); + + $total = $manufacturers->count(); + $manufacturers = $manufacturers->skip($offset)->take($limit)->get(); + return (new ManufacturersTransformer)->transformManufacturers($manufacturers, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Manufacturer::class); + $manufacturer = new Manufacturer; + $manufacturer->fill($request->all()); + + if ($manufacturer->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $manufacturer, trans('admin/manufacturers/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $manufacturer->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Manufacturer::class); + $manufacturer = Manufacturer::findOrFail($id); + return (new ManufacturersTransformer)->transformManufacturer($manufacturer); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Manufacturer::class); + $manufacturer = Manufacturer::findOrFail($id); + $manufacturer->fill($request->all()); + + if ($manufacturer->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $manufacturer, trans('admin/manufacturers/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $manufacturer->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Manufacturer::class); + $manufacturer = Manufacturer::findOrFail($id); + $this->authorize('delete', $manufacturer); + $manufacturer->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/manufacturers/message.delete.success'))); + + } +} diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php new file mode 100644 index 0000000000..3731122507 --- /dev/null +++ b/app/Http/Controllers/Api/ReportsController.php @@ -0,0 +1,60 @@ +] + * @since [v4.0] + * @return View + */ + public function index(Request $request) + { + + $actionlogs = Actionlog::with('item', 'user', 'target','location'); + + if ($request->has('search')) { + $actionlogs = $actionlogs->TextSearch(e($request->input('search'))); + } + + if (($request->has('target_type')) && ($request->has('target_id'))) { + $actionlogs = $actionlogs->where('target_id','=',$request->input('target_id')) + ->where('target_type','=',"App\\Models\\".ucwords($request->input('target_type'))); + + } + + if (($request->has('item_type')) && ($request->has('item_id'))) { + $actionlogs = $actionlogs->where('item_id','=',$request->input('item_id')) + ->where('item_type','=',"App\\Models\\".ucwords($request->input('item_type'))); + } + + if ($request->has('action_type')) { + $actionlogs = $actionlogs->where('action_type','=',$request->input('action_type'))->orderBy('created_at', 'desc'); + } + + $allowed_columns = [ + 'id', + 'created_at' + ]; + + $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $offset = request('offset', 0); + $limit = request('limit', 50); + $total = $actionlogs->count(); + $actionlogs = $actionlogs->orderBy($sort, $order); + $actionlogs = $actionlogs->skip($offset)->take($limit)->get(); + return (new ActionlogsTransformer)->transformActionlogs($actionlogs, $total); + + + + } +} diff --git a/app/Http/Controllers/Api/SettingsController.php b/app/Http/Controllers/Api/SettingsController.php new file mode 100644 index 0000000000..00bb8bf406 --- /dev/null +++ b/app/Http/Controllers/Api/SettingsController.php @@ -0,0 +1,101 @@ +] + * @since [v4.0] + * + * @return \Illuminate\Http\Response + */ + public function index() + { + // + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } + + public function getLdapTest() + { + \Log::debug('Preparing to test LDAP connection'); + + try { + $connection = Ldap::connectToLdap(); + try { + \Log::debug('attempting to bind to LDAP for LDAP test'); + Ldap::bindAdminToLdap($connection); + return response()->json(['message' => 'It worked!'], 200); + } catch (\Exception $e) { + \Log::debug('Bind failed'); + return response()->json(['message' => $e->getMessage()], 400); + //return response()->json(['message' => $e->getMessage()], 500); + } + } catch (\Exception $e) { + \Log::debug('Connection failed'); + return response()->json(['message' => $e->getMessage()], 600); + } + + + } + +} diff --git a/app/Http/Controllers/Api/StatuslabelsController.php b/app/Http/Controllers/Api/StatuslabelsController.php new file mode 100644 index 0000000000..aac2d37d81 --- /dev/null +++ b/app/Http/Controllers/Api/StatuslabelsController.php @@ -0,0 +1,239 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Statuslabel::class); + $allowed_columns = ['id','name','created_at']; + + $statuslabels = Statuslabel::withCount('assets'); + + if ($request->has('search')) { + $statuslabels = $statuslabels->TextSearch($request->input('search')); + } + + $offset = $request->input('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $statuslabels->orderBy($sort, $order); + + $total = $statuslabels->count(); + $statuslabels = $statuslabels->skip($offset)->take($limit)->get(); + return (new StatuslabelsTransformer)->transformStatuslabels($statuslabels, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Statuslabel::class); + $request->except('deployable', 'pending','archived'); + + if (!$request->has('type')) { + return response()->json(Helper::formatStandardApiResponse('error', null, ["type" => ["Status label type is required."]])); + } + + $statuslabel = new Statuslabel; + $statuslabel->fill($request->all()); + + $statusType = Statuslabel::getStatuslabelTypesForDB($request->input('type')); + $statuslabel->deployable = $statusType['deployable']; + $statuslabel->pending = $statusType['pending']; + $statuslabel->archived = $statusType['archived']; + + if ($statuslabel->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $statuslabel, trans('admin/statuslabels/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $statuslabel->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Statuslabel::class); + $statuslabel = Statuslabel::findOrFail($id); + return (new StatuslabelsTransformer)->transformStatuslabel($statuslabel); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Statuslabel::class); + $statuslabel = Statuslabel::findOrFail($id); + + $request->except('deployable', 'pending','archived'); + + if (!$request->has('type')) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'Status label type is required.')); + } + + $statuslabel->fill($request->all()); + + $statusType = Statuslabel::getStatuslabelTypesForDB($request->input('type')); + $statuslabel->deployable = $statusType['deployable']; + $statuslabel->pending = $statusType['pending']; + $statuslabel->archived = $statusType['archived']; + + if ($statuslabel->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $statuslabel, trans('admin/statuslabels/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $statuslabel->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Statuslabel::class); + $statuslabel = Statuslabel::findOrFail($id); + $this->authorize('delete', $statuslabel); + $statuslabel->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/statuslabels/message.delete.success'))); + + } + + + + /** + * Show a count of assets by status label for pie chart + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return \Illuminate\Http\Response + */ + + public function getAssetCountByStatuslabel() + { + + $statusLabels = Statuslabel::with('assets')->get(); + $labels=[]; + $points=[]; + $colors=[]; + foreach ($statusLabels as $statusLabel) { + if ($statusLabel->assets()->count() > 0) { + $labels[]=$statusLabel->name; + $points[]=$statusLabel->assets()->whereNull('assigned_to')->count(); + if ($statusLabel->color!='') { + $colors[]=$statusLabel->color; + } + } + } + $labels[]='Deployed'; + $points[]=Asset::whereNotNull('assigned_to')->count(); + + $colors_array = array_merge($colors, Helper::chartColors()); + + $result= [ + "labels" => $labels, + "datasets" => [ [ + "data" => $points, + "backgroundColor" => $colors_array, + "hoverBackgroundColor" => $colors_array + ]] + ]; + return $result; + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function assets(Request $request, $id) + { + $this->authorize('view', Statuslabel::class); + $this->authorize('index', Asset::class); + $assets = Asset::where('status_id','=',$id); + + $allowed_columns = [ + 'id', + 'name' + ]; + + $offset = request('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $assets->orderBy($sort, $order); + + $total = $assets->count(); + $assets = $assets->skip($offset)->take($limit)->get(); + + + return (new AssetsTransformer)->transformAssets($assets, $total); + } + + + /** + * Returns a boolean response based on whether the status label + * is one that is deployable. + * + * This is used by the hardware create/edit view to determine whether + * we should provide a dropdown of users for them to check the asset out to. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return Bool + */ + public function checkIfDeployable($id) { + $statuslabel = Statuslabel::findOrFail($id); + if ($statuslabel->getStatuslabelType()=='deployable') { + return '1'; + } + + return '0'; + } +} diff --git a/app/Http/Controllers/Api/SuppliersController.php b/app/Http/Controllers/Api/SuppliersController.php new file mode 100644 index 0000000000..22f35f47de --- /dev/null +++ b/app/Http/Controllers/Api/SuppliersController.php @@ -0,0 +1,122 @@ +] + * @since [v4.0] + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', Supplier::class); + $allowed_columns = ['id','name','address','phone','contact','fax','email']; + + $suppliers = Supplier::select( + array('id','name','address','address2','city','state','country','fax', 'phone','email','contact','created_at','updated_at','deleted_at') + )->withCount('assets')->withCount('licenses')->whereNull('deleted_at'); + + + if ($request->has('search')) { + $suppliers = $suppliers->TextSearch($request->input('search')); + } + + $offset = request('offset', 0); + $limit = $request->input('limit', 50); + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $suppliers->orderBy($sort, $order); + + $total = $suppliers->count(); + $suppliers = $suppliers->skip($offset)->take($limit)->get(); + return (new SuppliersTransformer)->transformSuppliers($suppliers, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Supplier::class); + $supplier = new Supplier; + $supplier->fill($request->all()); + + if ($supplier->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $supplier, trans('admin/suppliers/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $supplier->getErrors())); + + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', Supplier::class); + $supplier = Supplier::findOrFail($id); + return (new SuppliersTransformer)->transformSupplier($supplier); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', Supplier::class); + $supplier = Supplier::findOrFail($id); + $supplier->fill($request->all()); + + if ($supplier->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $supplier, trans('admin/suppliers/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $supplier->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', Supplier::class); + $supplier = Supplier::findOrFail($id); + $this->authorize('delete', $supplier); + $supplier->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/suppliers/message.delete.success'))); + + } +} diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php new file mode 100644 index 0000000000..65338723c8 --- /dev/null +++ b/app/Http/Controllers/Api/UsersController.php @@ -0,0 +1,207 @@ +] + * @since [v4.0] + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $this->authorize('view', User::class); + + $users = User::select([ + 'users.id', + 'users.employee_num', + 'users.two_factor_enrolled', + 'users.jobtitle', + 'users.email', + 'users.username', + 'users.location_id', + 'users.manager_id', + 'users.first_name', + 'users.last_name', + 'users.created_at', + 'users.notes', + 'users.company_id', + 'users.last_login', + 'users.deleted_at', + 'users.department_id', + 'users.activated' + ])->with('manager', 'groups', 'userloc', 'company', 'department','throttle','assets','licenses','accessories','consumables') + ->withCount('assets','licenses','accessories','consumables'); + $users = Company::scopeCompanyables($users); + + + if ($request->has('search')) { + $users = $users->TextSearch($request->input('search')); + } + + + if (($request->has('deleted')) && ($request->input('deleted')=='true')) { + $users = $users->GetDeleted(); + } + + + if ($request->has('company_id')) { + $users = $users->where('company_id', '=', $request->input('company_id')); + } + + if ($request->has('location_id')) { + $users = $users->where('location_id', '=', $request->input('location_id')); + } + + if ($request->has('department_id')) { + $users = $users->where('department_id','=',$request->input('department_id')); + } + + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $offset = request('offset', 0); + $limit = request('limit', 50); + + switch ($request->input('sort')) { + case 'manager': + $users = $users->OrderManager($order); + break; + case 'location': + $users = $users->OrderLocation($order); + break; + case 'department': + $users = $users->OrderDepartment($order); + break; + default: + $allowed_columns = + [ + 'last_name','first_name','email','jobtitle','username','employee_num', + 'assets','accessories', 'consumables','licenses','groups','activated','created_at', + 'two_factor_enrolled','two_factor_optin','last_login' + ]; + + $sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'first_name'; + $users = $users->orderBy($sort, $order); + break; + } + $total = $users->count(); + $users = $users->skip($offset)->take($limit)->get(); + return (new UsersTransformer)->transformUsers($users, $total); + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(SaveUserRequest $request) + { + $this->authorize('view', User::class); + $user = new User; + $user->fill($request->all()); + $user->password = bcrypt($request->input('password')); + + if ($user->save()) { + return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $user->getErrors())); + } + + /** + * Display the specified resource. + * + * @author [A. Gianotto] [] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + $this->authorize('view', User::class); + $user = User::findOrFail($id); + return (new UsersTransformer)->transformUser($user); + } + + + /** + * Update the specified resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(SaveUserRequest $request, $id) + { + $this->authorize('edit', User::class); + $user = User::findOrFail($id); + $user->fill($request->all()); + + if ($request->has('password')) { + $user->password = bcrypt($request->input('password')); + } + + + if ($user->save()) { + return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.success.update'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $user->getErrors())); + } + + /** + * Remove the specified resource from storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $this->authorize('delete', User::class); + $user = User::findOrFail($id); + $this->authorize('delete', $user); + + + if ($user->assets()->count() > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete_has_assets'))); + } + + if ($user->delete()) { + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.delete'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete'))); + } + + /** + * Return JSON containing a list of assets assigned to a user. + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @param $userId + * @return string JSON + */ + public function assets($id) + { + $this->authorize('view', User::class); + $assets = Asset::where('assigned_to', '=', $id)->with('model')->get(); + return response()->json($assets); + } +} diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php index 326b2b89b3..8ac1539553 100644 --- a/app/Http/Controllers/AssetMaintenancesController.php +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -9,11 +9,9 @@ use Input; use Lang; use Log; use Mail; -use Redirect; use Response; use Slack; use Str; -use App\Models\Supplier; use TCPDF; use Validator; use View; @@ -22,6 +20,7 @@ use App\Models\Asset; use App\Helpers\Helper; use Auth; use Gate; +use Illuminate\Http\Request; /** * This controller handles all actions related to Asset Maintenance for @@ -43,7 +42,7 @@ class AssetMaintenancesController extends Controller */ private static function getInsufficientPermissionsRedirect() { - return redirect()->route('asset_maintenances') + return redirect()->route('maintenances.index') ->with('error', trans('general.insufficient_permissions')); } @@ -58,10 +57,9 @@ class AssetMaintenancesController extends Controller * @since [v1.8] * @return View */ - public function getIndex() + public function index() { - - return View::make('asset_maintenances/index'); + return view('asset_maintenances/index'); } @@ -74,34 +72,20 @@ class AssetMaintenancesController extends Controller * @since [v1.8] * @return String JSON */ - public function getDatatable() + public function getDatatable(Request $request) { - $maintenances = AssetMaintenance::with('asset', 'supplier', 'asset.company','admin'); + $maintenances = AssetMaintenance::with('asset', 'supplier', 'asset.company', 'admin'); if (Input::has('search')) { - $maintenances = $maintenances->TextSearch(e(Input::get('search'))); + $maintenances = $maintenances->TextSearch(e($request->input('search'))); } - - - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - + $offset = request('offset', 0); + $limit = request('limit', 50); $allowed_columns = ['id','title','asset_maintenance_time','asset_maintenance_type','cost','start_date','completion_date','notes','user_id']; $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? e(Input::get('sort')) : 'created_at'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; switch ($sort) { case 'user_id': @@ -120,10 +104,15 @@ class AssetMaintenancesController extends Controller foreach ($maintenances as $maintenance) { $actions = ''; - if (Gate::allows('assets.edit')) { - $actions .= ''; + if (Gate::allows('update', Asset::class)) { + $actions .= Helper::generateDatatableButton('edit', route('maintenances.edit', $maintenance->id)); + $actions .= Helper::generateDatatableButton( + 'delete', + route('maintenances.destroy', $maintenance->id), + $enabled = true, + trans('admin/asset_maintenances/message.delete.confirm'), + $maintenance->title + ); } if (($maintenance->cost) && (isset($maintenance->asset)) && ($maintenance->asset->assetloc) && ($maintenance->asset->assetloc->currency!='')) { @@ -131,21 +120,21 @@ class AssetMaintenancesController extends Controller } else { $maintenance_cost = $settings->default_currency.$maintenance->cost; } - + $rows[] = array( 'id' => $maintenance->id, - 'asset_name' => ($maintenance->asset) ? (string)link_to('/hardware/'.$maintenance->asset->id.'/view', $maintenance->asset->showAssetName()) : 'Deleted Asset' , + 'asset_name' => ($maintenance->asset) ? (string)link_to_route('maintenances.show', $maintenance->asset->present()->Name(), ['maintenance' => $maintenance->asset->id]) : 'Deleted Asset' , 'title' => $maintenance->title, 'notes' => $maintenance->notes, - 'supplier' => ($maintenance->supplier) ? (string)link_to('/admin/settings/suppliers/'.$maintenance->supplier->id.'/view', $maintenance->supplier->name) : 'Deleted Supplier', + 'supplier' => ($maintenance->supplier) ? (string)link_to_route('suppliers.show', $maintenance->supplier->name, ['maintenance'=>$maintenance->supplier->id]) : 'Deleted Supplier', 'cost' => $maintenance_cost, 'asset_maintenance_type' => e($maintenance->asset_maintenance_type), 'start_date' => $maintenance->start_date, 'asset_maintenance_time' => $maintenance->asset_maintenance_time, 'completion_date' => $maintenance->completion_date, - 'user_id' => ($maintenance->admin) ? (string)link_to('/admin/users/'.$maintenance->admin->id.'/view', $maintenance->admin->fullName()) : '', + 'user_id' => ($maintenance->admin) ? (string)link_to_route('users.show', $maintenance->admin->present()->fullName(), ['user'=>$maintenance->admin->id]) : '', 'actions' => $actions, - 'companyName' => ($maintenance->asset && $maintenance->asset->company) ? $maintenance->asset->company->name : '' + 'company' => ($maintenance->asset->company) ? $maintenance->asset->company->name : '' ); } @@ -155,32 +144,26 @@ class AssetMaintenancesController extends Controller } /** - * Returns a form view to create a new asset maintenance. - * - * @see AssetMaintenancesController::postCreate() method that stores the data - * @author Vincent Sposato - * @version v1.0 - * @since [v1.8] - * @return mixed - */ - public function getCreate($assetId = null) + * Returns a form view to create a new asset maintenance. + * + * @see AssetMaintenancesController::postCreate() method that stores the data + * @author Vincent Sposato + * @version v1.0 + * @since [v1.8] + * @return mixed + */ + public function create() { // Prepare Asset Maintenance Type List $assetMaintenanceType = [ '' => 'Select an asset maintenance type', ] + AssetMaintenance::getImprovementOptions(); // Mark the selected asset, if it came in - $selectedAsset = $assetId; - - $assets = Helper::detailedAssetList(); - - $supplier_list = Helper::suppliersList(); - // Render the view - return View::make('asset_maintenances/edit') - ->with('asset_list', $assets) - ->with('selectedAsset', $selectedAsset) - ->with('supplier_list', $supplier_list) + return view('asset_maintenances/edit') + ->with('asset_list', Helper::detailedAssetList()) + ->with('selectedAsset', request('asset_id')) + ->with('supplier_list', Helper::suppliersList()) ->with('assetMaintenanceType', $assetMaintenanceType) ->with('item', new AssetMaintenance); } @@ -194,62 +177,29 @@ class AssetMaintenancesController extends Controller * @since [v1.8] * @return mixed */ - public function postCreate() + public function store(Request $request) { - - // get the POST data - $new = Input::all(); - // create a new model instance $assetMaintenance = new AssetMaintenance(); - - - if (e(Input::get('supplier_id')) == '') { - $assetMaintenance->supplier_id = null; - } else { - $assetMaintenance->supplier_id = e(Input::get('supplier_id')); - } - - if (e(Input::get('is_warranty')) == '') { - $assetMaintenance->is_warranty = 0; - } else { - $assetMaintenance->is_warranty = e(Input::get('is_warranty')); - } - - if (e(Input::get('cost')) == '') { - $assetMaintenance->cost = ''; - } else { - $assetMaintenance->cost = Helper::ParseFloat(e(Input::get('cost'))); - } - - if (e(Input::get('notes')) == '') { - $assetMaintenance->notes = null; - } else { - $assetMaintenance->notes = e(Input::get('notes')); - } - - $asset = Asset::find(e(Input::get('asset_id'))); + $assetMaintenance->supplier_id = $request->input('supplier_id'); + $assetMaintenance->is_warranty = $request->input('is_warranty'); + $assetMaintenance->cost = e($request->input('cost')); + $assetMaintenance->notes = e($request->input('notes')); + $asset = Asset::find(e($request->input('asset_id'))); if (!Company::isCurrentUserHasAccess($asset)) { return static::getInsufficientPermissionsRedirect(); } // Save the asset maintenance data - $assetMaintenance->asset_id = e(Input::get('asset_id')); - $assetMaintenance->asset_maintenance_type = e(Input::get('asset_maintenance_type')); - $assetMaintenance->title = e(Input::get('title')); - $assetMaintenance->start_date = e(Input::get('start_date')); - $assetMaintenance->completion_date = e(Input::get('completion_date')); - $assetMaintenance->user_id = Auth::user()->id; + $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); + $assetMaintenance->user_id = Auth::id(); - if (( $assetMaintenance->completion_date == "" ) - || ( $assetMaintenance->completion_date == "0000-00-00" ) - ) { - $assetMaintenance->completion_date = null; - } - - if (( $assetMaintenance->completion_date !== "" ) - && ( $assetMaintenance->completion_date !== "0000-00-00" ) + if (( $assetMaintenance->completion_date !== null ) && ( $assetMaintenance->start_date !== "" ) && ( $assetMaintenance->start_date !== "0000-00-00" ) ) { @@ -260,17 +210,13 @@ class AssetMaintenancesController extends Controller // Was the asset maintenance created? if ($assetMaintenance->save()) { - // Redirect to the new asset maintenance page - return redirect()->to("admin/asset_maintenances") + return redirect()->route('maintenances.index') ->with('success', trans('admin/asset_maintenances/message.create.success')); } return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors()); - - - } /** @@ -283,12 +229,12 @@ class AssetMaintenancesController extends Controller * @since [v1.8] * @return mixed */ - public function getEdit($assetMaintenanceId = null) + public function edit($assetMaintenanceId = null) { // Check if the asset maintenance exists if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { // Redirect to the improvement management page - return redirect()->to('admin/asset_maintenances') + return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); @@ -311,88 +257,59 @@ class AssetMaintenancesController extends Controller '' => 'Select an improvement type', ] + AssetMaintenance::getImprovementOptions(); - $assets = Company::scopeCompanyables(Asset::with('model','assignedUser')->get(), 'assets.company_id')->lists('detailed_name', 'id'); // Get Supplier List - $supplier_list = Helper::suppliersList(); - // Render the view - return View::make('asset_maintenances/edit') - ->with('asset_list', $assets) + return view('asset_maintenances/edit') + ->with('asset_list', Helper::detailedAssetList()) ->with('selectedAsset', null) - ->with('supplier_list', $supplier_list) + ->with('supplier_list', Helper::suppliersList()) ->with('assetMaintenanceType', $assetMaintenanceType) ->with('item', $assetMaintenance); } /** - * Validates and stores an update to an asset maintenance - * - * @see AssetMaintenancesController::postEdit() method that stores the data - * @author Vincent Sposato - * @param int $assetMaintenanceId - * @version v1.0 - * @since [v1.8] - * @return mixed - */ - public function postEdit($assetMaintenanceId = null) + * Validates and stores an update to an asset maintenance + * + * @see AssetMaintenancesController::postEdit() method that stores the data + * @author Vincent Sposato + * @param Request $request + * @param int $assetMaintenanceId + * @return mixed + * @version v1.0 + * @since [v1.8] + */ + public function update(Request $request, $assetMaintenanceId = null) { - - // get the POST data - $new = Input::all(); - // Check if the asset maintenance exists if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { // Redirect to the asset maintenance management page - return redirect()->to('admin/asset_maintenances') + return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); } + $assetMaintenance->supplier_id = e($request->input('supplier_id')); + $assetMaintenance->is_warranty = e($request->input('is_warranty')); + $assetMaintenance->cost = Helper::ParseFloat(e($request->input('cost'))); + $assetMaintenance->notes = e($request->input('notes')); - - if (e(Input::get('supplier_id')) == '') { - $assetMaintenance->supplier_id = null; - } else { - $assetMaintenance->supplier_id = e(Input::get('supplier_id')); - } - - if (e(Input::get('is_warranty')) == '') { - $assetMaintenance->is_warranty = 0; - } else { - $assetMaintenance->is_warranty = e(Input::get('is_warranty')); - } - - if (e(Input::get('cost')) == '') { - $assetMaintenance->cost = ''; - } else { - $assetMaintenance->cost = Helper::ParseFloat(e(Input::get('cost'))); - } - - if (e(Input::get('notes')) == '') { - $assetMaintenance->notes = null; - } else { - $assetMaintenance->notes = e(Input::get('notes')); - } - - $asset = Asset::find(e(Input::get('asset_id'))); + $asset = Asset::find(request('asset_id')); if (!Company::isCurrentUserHasAccess($asset)) { return static::getInsufficientPermissionsRedirect(); } // Save the asset maintenance data - $assetMaintenance->asset_id = e(Input::get('asset_id')); - $assetMaintenance->asset_maintenance_type = e(Input::get('asset_maintenance_type')); - $assetMaintenance->title = e(Input::get('title')); - $assetMaintenance->start_date = e(Input::get('start_date')); - $assetMaintenance->completion_date = e(Input::get('completion_date')); + $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); - if (( $assetMaintenance->completion_date == "" ) - || ( $assetMaintenance->completion_date == "0000-00-00" ) + if (( $assetMaintenance->completion_date == null ) ) { - $assetMaintenance->completion_date = null; if (( $assetMaintenance->asset_maintenance_time !== 0 ) || ( !is_null($assetMaintenance->asset_maintenance_time) ) ) { @@ -400,8 +317,7 @@ class AssetMaintenancesController extends Controller } } - if (( $assetMaintenance->completion_date !== "" ) - && ( $assetMaintenance->completion_date !== "0000-00-00" ) + if (( $assetMaintenance->completion_date !== null ) && ( $assetMaintenance->start_date !== "" ) && ( $assetMaintenance->start_date !== "0000-00-00" ) ) { @@ -414,12 +330,10 @@ class AssetMaintenancesController extends Controller if ($assetMaintenance->save()) { // Redirect to the new asset maintenance page - return redirect()->to("admin/asset_maintenances") - ->with('success', trans('admin/asset_maintenances/message.create.success')); + return redirect()->route('maintenances.index') + ->with('success', trans('admin/asset_maintenances/message.edit.success')); } - return redirect()->back() ->withInput()->withErrors($assetMaintenance->getErrors()); - - + return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors()); } /** @@ -431,12 +345,12 @@ class AssetMaintenancesController extends Controller * @since [v1.8] * @return mixed */ - public function getDelete($assetMaintenanceId) + public function destroy($assetMaintenanceId) { // Check if the asset maintenance exists if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { // Redirect to the asset maintenance management page - return redirect()->to('admin/asset_maintenances') + return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); @@ -446,7 +360,7 @@ class AssetMaintenancesController extends Controller $assetMaintenance->delete(); // Redirect to the asset_maintenance management page - return redirect()->to('admin/asset_maintenances') + return redirect()->route('maintenances.index') ->with('success', trans('admin/asset_maintenances/message.delete.success')); } @@ -459,17 +373,17 @@ class AssetMaintenancesController extends Controller * @since [v1.8] * @return View */ - public function getView($assetMaintenanceId) + public function show($assetMaintenanceId) { // Check if the asset maintenance exists if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { // Redirect to the asset maintenance management page - return redirect()->to('admin/asset_maintenances') + return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); } - return View::make('asset_maintenances/view')->with('assetMaintenance', $assetMaintenance); + return view('asset_maintenances/view')->with('assetMaintenance', $assetMaintenance); } } diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index e4cec1fcc0..1d66b55fca 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -1,6 +1,7 @@ with('category_list', $category_list) - ->with('depreciation_list', $depreciation_list) - ->with('manufacturer_list', $manufacturer_list) + return view('models/edit') + ->with('category_list', Helper::categoryList('asset')) + ->with('depreciation_list', Helper::depreciationList()) + ->with('manufacturer_list', Helper::manufacturerList()) ->with('item', new AssetModel); } @@ -70,39 +68,27 @@ class AssetModelsController extends Controller * @since [v1.0] * @return Redirect */ - public function postCreate() + public function store(Request $request) { // Create a new asset model $model = new AssetModel; - - if (e(Input::get('depreciation_id')) == '') { - $model->depreciation_id = 0; - } else { - $model->depreciation_id = e(Input::get('depreciation_id')); - } - - if (e(Input::get('eol')) == '') { - $model->eol = 0; - } else { - $model->eol = e(Input::get('eol')); - } - // Save the model data - $model->name = e(Input::get('name')); - $model->model_number = e(Input::get('model_number')); - $model->manufacturer_id = e(Input::get('manufacturer_id')); - $model->category_id = e(Input::get('category_id')); - $model->notes = e(Input::get('notes')); - $model->user_id = Auth::user()->id; + $model->eol = $request->input('eol'); + $model->depreciation_id = $request->input('depreciation_id'); + $model->name = $request->input('name'); + $model->model_number = $request->input('model_number'); + $model->manufacturer_id = $request->input('manufacturer_id'); + $model->category_id = $request->input('category_id'); + $model->notes = $request->input('notes'); + $model->user_id = Auth::guard('api')->user(); $model->requestable = Input::has('requestable'); - if (Input::get('custom_fieldset')!='') { - $model->fieldset_id = e(Input::get('custom_fieldset')); + if ($request->input('custom_fieldset')!='') { + $model->fieldset_id = e($request->input('custom_fieldset')); } - if (Input::file('image')) { $image = Input::file('image'); $file_name = str_random(25).".".$image->getClientOriginalExtension(); @@ -117,22 +103,21 @@ class AssetModelsController extends Controller // Was it created? if ($model->save()) { // Redirect to the new model page - return redirect()->to("hardware/models")->with('success', trans('admin/models/message.create.success')); + return redirect()->route("models.index")->with('success', trans('admin/models/message.create.success')); } - - return redirect()->back()->withInput()->withErrors($model->getErrors()); - + return redirect()->back()->withInput()->withErrors($model->getErrors()); } /** - * Validates and stores new Asset Model data created from the - * modal form on the Asset Creation view. - * - * @author [A. Gianotto] [] - * @since [v2.0] - * @return String JSON - */ - public function store() + * Validates and stores new Asset Model data created from the + * modal form on the Asset Creation view. + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @param Request $request + * @return String JSON + */ + public function apiStore(Request $request) { //COPYPASTA!!!! FIXME $model = new AssetModel; @@ -140,18 +125,18 @@ class AssetModelsController extends Controller $settings=Input::all(); $settings['eol']= null; - $model->name=e(Input::get('name')); - $model->manufacturer_id = e(Input::get('manufacturer_id')); - $model->category_id = e(Input::get('category_id')); - $model->model_number = e(Input::get('model_number')); - $model->user_id = Auth::user()->id; - $model->notes = e(Input::get('notes')); + $model->name=$request->input('name'); + $model->manufacturer_id = $request->input('manufacturer_id'); + $model->category_id = $request->input('category_id'); + $model->model_number = $request->input('model_number'); + $model->user_id = Auth::id(); + $model->notes = $request->input('notes'); $model->eol= null; - if (Input::get('fieldset_id')=='') { + if ($request->input('fieldset_id')=='') { $model->fieldset_id = null; } else { - $model->fieldset_id = e(Input::get('fieldset_id')); + $model->fieldset_id = e($request->input('fieldset_id')); } if ($model->save()) { @@ -170,22 +155,18 @@ class AssetModelsController extends Controller * @param int $modelId * @return View */ - public function getEdit($modelId = null) + public function edit($modelId = null) { // Check if the model exists if (is_null($item = AssetModel::find($modelId))) { // Redirect to the model management page - return redirect()->to('assets/models')->with('error', trans('admin/models/message.does_not_exist')); + return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); } - $depreciation_list = Helper::depreciationList(); - $manufacturer_list = Helper::manufacturerList(); - $category_list = Helper::categoryList('asset'); - $view = View::make('models/edit', compact('item')); - $view->with('category_list', $category_list); - $view->with('depreciation_list', $depreciation_list); - $view->with('manufacturer_list', $manufacturer_list); + $view->with('category_list', Helper::categoryList('asset')); + $view->with('depreciation_list', Helper::depreciationList()); + $view->with('manufacturer_list', Helper::manufacturerList()); return $view; } @@ -199,39 +180,28 @@ class AssetModelsController extends Controller * @param int $modelId * @return Redirect */ - public function postEdit($modelId = null) + public function update(Request $request, $modelId = null) { // Check if the model exists if (is_null($model = AssetModel::find($modelId))) { // Redirect to the models management page - return redirect()->to('admin/models')->with('error', trans('admin/models/message.does_not_exist')); + return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); } - - if (e(Input::get('depreciation_id')) == '') { - $model->depreciation_id = 0; - } else { - $model->depreciation_id = e(Input::get('depreciation_id')); - } - - if (e(Input::get('eol')) == '') { - $model->eol = null; - } else { - $model->eol = e(Input::get('eol')); - } - // Update the model data - $model->name = e(Input::get('name')); - $model->model_number = e(Input::get('model_number')); - $model->manufacturer_id = e(Input::get('manufacturer_id')); - $model->category_id = e(Input::get('category_id')); - $model->notes = e(Input::get('notes')); + $model->depreciation_id = $request->input('depreciation_id'); + $model->eol = $request->input('eol'); + $model->name = $request->input('name'); + $model->model_number = $request->input('model_number'); + $model->manufacturer_id = $request->input('manufacturer_id'); + $model->category_id = $request->input('category_id'); + $model->notes = $request->input('notes'); $model->requestable = Input::has('requestable'); - if (Input::get('custom_fieldset')=='') { + if ($request->input('custom_fieldset')=='') { $model->fieldset_id = null; } else { - $model->fieldset_id = e(Input::get('custom_fieldset')); + $model->fieldset_id = $request->input('custom_fieldset'); } if (Input::file('image')) { @@ -245,22 +215,14 @@ class AssetModelsController extends Controller $model->image = $file_name; } - if (Input::get('image_delete') == 1 && Input::file('image') == "") { + if ($request->input('image_delete') == 1 && Input::file('image') == "") { $model->image = null; } - // Was it created? if ($model->save()) { - // Redirect to the new model page - return redirect()->to("hardware/models")->with('success', trans('admin/models/message.update.success')); - } else { - return redirect()->back()->withInput()->withErrors($model->getErrors()); + return redirect()->route("models.index")->with('success', trans('admin/models/message.update.success')); } - - - // Redirect to the model create page - return redirect()->to("hardware/models/$modelId/edit")->with('error', trans('admin/models/message.update.error')); - + return redirect()->back()->withInput()->withErrors($model->getErrors()); } /** @@ -272,25 +234,22 @@ class AssetModelsController extends Controller * @param int $modelId * @return Redirect */ - public function getDelete($modelId) + public function destroy($modelId) { // Check if the model exists if (is_null($model = AssetModel::find($modelId))) { - // Redirect to the blogs management page - return redirect()->to('hardware/models')->with('error', trans('admin/models/message.not_found')); + return redirect()->route('models.index')->with('error', trans('admin/models/message.not_found')); } - if ($model->assets->count() > 0) { + if ($model->assets()->count() > 0) { // Throw an error that this model is associated with assets - return redirect()->to('hardware/models')->with('error', trans('admin/models/message.assoc_users')); - - } else { - // Delete the model - $model->delete(); - - // Redirect to the models management page - return redirect()->to('hardware/models')->with('success', trans('admin/models/message.delete.success')); + return redirect()->route('models.index')->with('error', trans('admin/models/message.assoc_users')); } + // Delete the model + $model->delete(); + + // Redirect to the models management page + return redirect()->route('models.index')->with('success', trans('admin/models/message.delete.success')); } @@ -317,11 +276,10 @@ class AssetModelsController extends Controller $success = trans('admin/models/message.restore.success'); // Redirect back - return redirect()->back()->with('success', $success); + return redirect()->route('models.index')->with('success', $success); - } else { - return redirect()->back()->with('error', trans('admin/models/message.not_found')); } + return redirect()->back()->with('error', trans('admin/models/message.not_found')); } @@ -334,21 +292,18 @@ class AssetModelsController extends Controller * @param int $modelId * @return View */ - public function getView($modelId = null) + public function show($modelId = null) { $model = AssetModel::withTrashed()->find($modelId); if (isset($model->id)) { - return View::make('models/view', compact('model')); - } else { - // Prepare the error message - $error = trans('admin/models/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('models')->with('error', $error); + return view('models/view', compact('model')); } + // Prepare the error message + $error = trans('admin/models/message.does_not_exist', compact('id')); - + // Redirect to the user management page + return redirect()->route('models.index')->with('error', $error); } /** @@ -363,21 +318,17 @@ class AssetModelsController extends Controller { // Check if the model exists if (is_null($model_to_clone = AssetModel::find($modelId))) { - // Redirect to the model management page - return redirect()->to('assets/models')->with('error', trans('admin/models/message.does_not_exist')); + return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); } $model = clone $model_to_clone; $model->id = null; // Show the page - $depreciation_list = Helper::depreciationList(); - $manufacturer_list = Helper::manufacturerList(); - $category_list = Helper::categoryList('asset'); $view = View::make('models/edit'); - $view->with('category_list', $category_list); - $view->with('depreciation_list', $depreciation_list); - $view->with('manufacturer_list', $manufacturer_list); + $view->with('category_list', Helper::categoryList('asset')); + $view->with('depreciation_list', Helper::depreciationList()); + $view->with('manufacturer_list', Helper::manufacturerList()); $view->with('item', $model); $view->with('clone_model', $model_to_clone); return $view; @@ -396,121 +347,35 @@ class AssetModelsController extends Controller public function getCustomFields($modelId) { $model = AssetModel::find($modelId); - return View::make("models.custom_fields_form")->with("model", $model); + return view("models.custom_fields_form")->with("model", $model); } /** - * Get the JSON response to populate the data tables on the - * Asset Model listing page. - * - * @author [A. Gianotto] [] - * @since [v2.0] - * @param string $status - * @return String JSON - */ - - public function getDatatable($status = null) - { - $models = AssetModel::with('category', 'assets', 'depreciation', 'manufacturer'); - - switch ($status) { - case 'Deleted': - $models->withTrashed()->Deleted(); - break; - } - - - if (Input::has('search')) { - $models = $models->TextSearch(Input::get('search')); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - - $allowed_columns = ['id','name','model_number']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? e(Input::get('sort')) : 'created_at'; - - $models = $models->orderBy($sort, $order); - - $modelCount = $models->count(); - $models = $models->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($models as $model) { - if ($model->deleted_at == '') { - $actions = '
'; - } else { - $actions = ''; - } - - $rows[] = array( - 'id' => $model->id, - 'manufacturer' => (string)link_to('/admin/settings/manufacturers/'.$model->manufacturer->id.'/view', $model->manufacturer->name), - 'name' => (string)link_to('/hardware/models/'.$model->id.'/view', $model->name), - 'image' => ($model->image!='') ? '' : '', - 'modelnumber' => $model->model_number, - 'numassets' => $model->assets->count(), - 'depreciation' => (($model->depreciation) && ($model->depreciation->id > 0)) ? $model->depreciation->name.' ('.$model->depreciation->months.')' : trans('general.no_depreciation'), - 'category' => ($model->category) ? (string)link_to('admin/settings/categories/'.$model->category->id.'/view', $model->category->name) : '', - 'eol' => ($model->eol) ? $model->eol.' '.trans('general.months') : '', - 'note' => $model->getNote(), - 'fieldset' => ($model->fieldset) ? (string)link_to('admin/custom_fields/'.$model->fieldset->id, $model->fieldset->name) : '', - 'actions' => $actions - ); - } - - $data = array('total' => $modelCount, 'rows' => $rows); - - return $data; - } - - - /** - * Get the asset information to present to the model view detail page - * - * @author [A. Gianotto] [] - * @since [v2.0] - * @param int $modelId - * @return String JSON - */ - public function getDataView($modelID) + * Get the asset information to present to the model view detail page + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @param Request $request + * @param $modelID + * @return String JSON + * @internal param int $modelId + */ + public function getDataView(Request $request, $modelID) { $assets = Asset::where('model_id', '=', $modelID)->with('company', 'assetstatus'); if (Input::has('search')) { - $assets = $assets->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; + $assets = $assets->TextSearch(e($request->input('search'))); } + $offset = request('offset', 0); + $limit = request('limit', 50); $allowed_columns = ['name', 'serial','asset_tag']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? e(Input::get('sort')) : 'created_at'; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; $assets = $assets->orderBy($sort, $order); @@ -519,33 +384,83 @@ class AssetModelsController extends Controller $rows = array(); - + $all_custom_fields = CustomField::all(); foreach ($assets as $asset) { - $actions = ''; - if ($asset->assetstatus) { - if ($asset->assetstatus->deployable != 0) { - if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) { - $actions = ''.trans('general.checkin').''; - } else { - $actions = ''.trans('general.checkout').''; - } - } - } - - $rows[] = array( - 'id' => $asset->id, - 'name' => (string)link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()), - 'asset_tag' => (string)link_to('hardware/'.$asset->id.'/view', $asset->asset_tag), - 'serial' => $asset->serial, - 'assigned_to' => ($asset->assigned_to) ? (string)link_to('/admin/users/'.$asset->assigned_to.'/view', $asset->assigneduser->fullName()) : '', - 'actions' => $actions, - 'companyName' => Company::getName($asset) - ); + $rows[] = $asset->present()->forDataTable($all_custom_fields); } $data = array('total' => $assetsCount, 'rows' => $rows); return $data; } + + + /** + * Returns a view that allows the user to bulk edit model attrbutes + * + * @author [A. Gianotto] [] + * @since [v1.7] + * @return \Illuminate\Contracts\View\View + */ + public function postBulkEdit(Request $request) + { + $models_raw_array = Input::get('ids'); + $models = AssetModel::whereIn('id', $models_raw_array)->get(); + $nochange = ['NC' => 'No Change']; + $fieldset_list = $nochange + Helper::customFieldsetList(); + $depreciation_list = $nochange + Helper::depreciationList(); + $category_list = $nochange + Helper::categoryList('asset'); + $manufacturer_list = $nochange + Helper::manufacturerList(); + + + return view('models/bulk-edit', compact('models')) + ->with('manufacturer_list', $manufacturer_list) + ->with('category_list', $category_list) + ->with('fieldset_list', $fieldset_list) + ->with('depreciation_list', $depreciation_list); + + } + + + + /** + * Returns a view that allows the user to bulk edit model attrbutes + * + * @author [A. Gianotto] [] + * @since [v1.7] + * @return \Illuminate\Contracts\View\View + */ + public function postBulkEditSave(Request $request) + { + + $models_raw_array = Input::get('ids'); + $update_array = array(); + + if (($request->has('manufacturer_id') && ($request->input('manufacturer_id')!='NC'))) { + $update_array['manufacturer_id'] = $request->input('manufacturer_id'); + } + if (($request->has('category_id') && ($request->input('category_id')!='NC'))) { + $update_array['category_id'] = $request->input('category_id'); + } + if ($request->input('fieldset_id')!='NC') { + $update_array['fieldset_id'] = $request->input('fieldset_id'); + } + if ($request->input('depreciation_id')!='NC') { + $update_array['depreciation_id'] = $request->input('depreciation_id'); + } + + + + if (count($update_array) > 0) { + AssetModel::whereIn('id', $models_raw_array)->update($update_array); + return redirect()->route('models.index') + ->with('success', trans('admin/models/message.bulkedit.success')); + } + + return redirect()->route('models.index') + ->with('warning', trans('admin/models/message.bulkedit.error')); + + } + } diff --git a/app/Http/Controllers/AssetsController.php b/app/Http/Controllers/AssetsController.php index 827f0af061..6e2163e5cb 100755 --- a/app/Http/Controllers/AssetsController.php +++ b/app/Http/Controllers/AssetsController.php @@ -2,32 +2,31 @@ namespace App\Http\Controllers; use App\Helpers\Helper; -use App\Http\Requests\AssetRequest; -use App\Http\Requests\AssetFileRequest; use App\Http\Requests\AssetCheckinRequest; use App\Http\Requests\AssetCheckoutRequest; +use App\Http\Requests\AssetFileRequest; +use App\Http\Requests\AssetRequest; +use App\Http\Requests\ItemImportRequest; use App\Models\Actionlog; use App\Models\Asset; -use App\Models\AssetMaintenance; use App\Models\AssetModel; use App\Models\Company; use App\Models\CustomField; -use App\Models\Depreciation; +use App\Models\Import; use App\Models\Location; -use App\Models\Manufacturer; //for embedded-create use App\Models\Setting; -use App\Models\Statuslabel; -use App\Models\Supplier; use App\Models\User; -use Validator; use Artisan; use Auth; +use Carbon\Carbon; use Config; -use League\Csv\Reader; use DB; +use Gate; +use Illuminate\Http\Request; use Image; use Input; use Lang; +use League\Csv\Reader; use Log; use Mail; use Paginator; @@ -35,13 +34,10 @@ use Redirect; use Response; use Slack; use Str; -use Illuminate\Http\Request; -use Symfony\Component\Console\Output\BufferedOutput; -use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\File\Exception\FileException; use TCPDF; +use Validator; use View; -use Carbon\Carbon; -use Gate; /** * This class controls all actions related to assets for @@ -71,9 +67,15 @@ class AssetsController extends Controller * @since [v1.0] * @return View */ - public function getIndex() + public function index(Request $request) { - return View::make('hardware/index'); + $this->authorize('index', Asset::class); + if ($request->has('company_id')) { + $company = Company::find($request->input('company_id')); + } else { + $company = null; + } + return view('hardware/index')->with('company',$company); } /** @@ -85,53 +87,46 @@ class AssetsController extends Controller */ public function getAssetByTag() { - if (Input::get('topsearch')=="true") { - $topsearch = true; - } else { - $topsearch = false; + $topsearch = (Input::get('topsearch')=="true"); + + if (!$asset = Asset::where('asset_tag', '=', Input::get('assetTag'))->first()) { + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } - if ($asset = Asset::where('asset_tag', '=', Input::get('assetTag'))->first()) { - return redirect()->route('view/hardware', $asset->id)->with('topsearch', $topsearch); - } - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); + $this->authorize('view', $asset); + return redirect()->route('hardware.show', $asset->id)->with('topsearch', $topsearch); } /** - * Returns a view that presents a form to create a new asset. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return View - */ - public function getCreate($model_id = null) + * Returns a view that presents a form to create a new asset. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param Request $request + * @return View + * @internal param int $model_id + */ + public function create(Request $request) { - // Grab the dropdown lists - $model_list = Helper::modelList(); - $statuslabel_list = Helper::statusLabelList(); - $location_list = Helper::locationsList(); - $manufacturer_list = Helper::manufacturerList(); - $category_list = Helper::categoryList('asset'); - $supplier_list = Helper::suppliersList(); - $company_list = Helper::companyList(); - $assigned_to = Helper::usersList(); - $statuslabel_types = Helper::statusTypeList(); + $this->authorize('create', Asset::class); + $view = View::make('hardware/edit') + ->with('supplier_list', Helper::suppliersList()) + ->with('company_list', Helper::companyList()) + ->with('model_list', Helper::modelList()) + ->with('statuslabel_list', Helper::statusLabelList()) + ->with('location_list', Helper::locationsList()) + ->with('item', new Asset) + ->with('manufacturer', Helper::manufacturerList()) //handled in modal now? + ->with('category', Helper::categoryList('asset')) //handled in modal now? + ->with('statuslabel_types', Helper::statusTypeList()) //handled in modal now? + ->with('users_list', Helper::usersList()) + ->with('assets_list', Helper::assetsList()) + ->with('locations_list', Helper::locationsList()); - $view = View::make('hardware/edit'); - $view->with('supplier_list', $supplier_list); - $view->with('company_list', $company_list); - $view->with('model_list', $model_list); - $view->with('statuslabel_list', $statuslabel_list); - $view->with('assigned_to', $assigned_to); - $view->with('location_list', $location_list); - $view->with('item', new Asset); - $view->with('manufacturer', $manufacturer_list); - $view->with('category', $category_list); - $view->with('statuslabel_types', $statuslabel_types); - - if (!is_null($model_id)) { - $selected_model = AssetModel::find($model_id); + if ($request->has('model_id')) { + $selected_model = AssetModel::find($request->input('model_id')); $view->with('selected_model', $selected_model); + } else { } return $view; @@ -144,78 +139,36 @@ class AssetsController extends Controller * @since [v1.0] * @return Redirect */ - public function postCreate(AssetRequest $request) + public function store(AssetRequest $request) { + $this->authorize(Asset::class); // create a new model instance $asset = new Asset(); $asset->model()->associate(AssetModel::find(e(Input::get('model_id')))); - $checkModel = config('app.url').'/api/models/'.e(Input::get('model_id')).'/check'; - - $asset->name = e(Input::get('name')); - $asset->serial = e(Input::get('serial')); - $asset->company_id = Company::getIdForCurrentUser(e(Input::get('company_id'))); - $asset->model_id = e(Input::get('model_id')); - $asset->order_number = e(Input::get('order_number')); - $asset->notes = e(Input::get('notes')); - $asset->asset_tag = e(Input::get('asset_tag')); - $asset->user_id = Auth::user()->id; - $asset->archived = '0'; - $asset->physical = '1'; - $asset->depreciate = '0'; - if (e(Input::get('status_id')) == '') { - $asset->status_id = null; - } else { - $asset->status_id = e(Input::get('status_id')); - } - - if (e(Input::get('warranty_months')) == '') { - $asset->warranty_months = null; - } else { - $asset->warranty_months = e(Input::get('warranty_months')); - } - - if (e(Input::get('purchase_cost')) == '') { - $asset->purchase_cost = null; - } else { - $asset->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - if (e(Input::get('purchase_date')) == '') { - $asset->purchase_date = null; - } else { - $asset->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('assigned_to')) == '') { - $asset->assigned_to = null; - } else { - $asset->assigned_to = e(Input::get('assigned_to')); - } - - if (e(Input::get('supplier_id')) == '') { - $asset->supplier_id = 0; - } else { - $asset->supplier_id = e(Input::get('supplier_id')); - } - - if (e(Input::get('requestable')) == '') { - $asset->requestable = 0; - } else { - $asset->requestable = e(Input::get('requestable')); - } - - if (e(Input::get('rtd_location_id')) == '') { - $asset->rtd_location_id = null; - } else { - $asset->rtd_location_id = e(Input::get('rtd_location_id')); - } + $asset->name = Input::get('name'); + $asset->serial = Input::get('serial'); + $asset->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $asset->model_id = Input::get('model_id'); + $asset->order_number = Input::get('order_number'); + $asset->notes = Input::get('notes'); + $asset->asset_tag = Input::get('asset_tag'); + $asset->user_id = Auth::id(); + $asset->archived = '0'; + $asset->physical = '1'; + $asset->depreciate = '0'; + $asset->status_id = request('status_id', 0); + $asset->warranty_months = request('warranty_months', null); + $asset->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); + $asset->purchase_date = request('purchase_date', null); + $asset->assigned_to = request('assigned_to', null); + $asset->supplier_id = request('supplier_id', 0); + $asset->requestable = request('requestable', 0); + $asset->rtd_location_id = request('rtd_location_id', null); // Create the image (if one was chosen.) if (Input::has('image')) { - - $image = Input::get('image'); // After modification, the image is prefixed by mime info like the following: @@ -251,27 +204,46 @@ class AssetsController extends Controller } + // Update custom fields in the database. - // Validation for these fields is handlded through the AssetRequest form request + // Validation for these fields is handled through the AssetRequest form request // FIXME: No idea why this is returning a Builder error on db_column_name. // Need to investigate and fix. Using static method for now. $model = AssetModel::find($request->get('model_id')); + + + if ($model->fieldset) { foreach ($model->fieldset->fields as $field) { - $asset->{\App\Models\CustomField::name_to_db_name($field->name)} = e($request->input(\App\Models\CustomField::name_to_db_name($field->name))); + + if ($field->field_encrypted=='1') { + if (Gate::allows('admin')) { + $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug())); + } + + } else { + $asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug()); + } + } } // Was the asset created? if ($asset->save()) { $asset->logCreate(); - if (Input::get('assigned_to')!='') { - $user = User::find(e(Input::get('assigned_to'))); - $asset->checkOutToUser($user, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e(Input::get('name'))); + if(request('assigned_user')) { + $target = User::find(request('assigned_user')); + } elseif(request('assigned_asset')) { + $target = Asset::find(request('assigned_asset')); + } elseif(request('assigned_location')) { + $target = Location::find(request('assigned_location')); + } + if (isset($target)) { + $asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e(Input::get('name'))); } // Redirect to the asset listing page \Session::flash('success', trans('admin/hardware/message.create.success')); - return response()->json(['redirect_url' => route('hardware')]); + return response()->json(['redirect_url' => route('hardware.index')]); } \Input::flash(); \Session::flash('errors', $asset->getErrors()); @@ -286,38 +258,25 @@ class AssetsController extends Controller * @since [v1.0] * @return View */ - public function getEdit($assetId = null) + public function edit($assetId = null) { - - // Check if the asset exists if (!$item = Asset::find($assetId)) { - // Redirect to the asset management page - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($item)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + // Redirect to the asset management page with error + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } + //Handles company checks and permissions. + $this->authorize($item); - // Grab the dropdown lists - $model_list = Helper::modelList(); - $statuslabel_list = Helper::statusLabelList(); - $location_list = Helper::locationsList(); - $manufacturer_list = Helper::manufacturerList(); - $category_list = Helper::categoryList('asset'); - $supplier_list = Helper::suppliersList(); - $company_list = Helper::companyList(); - $assigned_to = Helper::usersList(); - $statuslabel_types =Helper::statusTypeList(); - - return View::make('hardware/edit', compact('item')) - ->with('model_list', $model_list) - ->with('supplier_list', $supplier_list) - ->with('company_list', $company_list) - ->with('location_list', $location_list) - ->with('statuslabel_list', $statuslabel_list) - ->with('assigned_to', $assigned_to) - ->with('manufacturer', $manufacturer_list) - ->with('statuslabel_types', $statuslabel_types) - ->with('category', $category_list); + return view('hardware/edit', compact('item')) + ->with('model_list', Helper::modelList()) + ->with('supplier_list', Helper::suppliersList()) + ->with('company_list', Helper::companyList()) + ->with('locations_list', Helper::locationsList()) + ->with('statuslabel_list', Helper::statusLabelList()) + ->with('assigned_to', Helper::usersList()) + ->with('manufacturer', Helper::manufacturerList()) + ->with('statuslabel_types', Helper::statusTypeList()) + ->with('category', Helper::categoryList('asset')); } @@ -330,55 +289,25 @@ class AssetsController extends Controller * @return Redirect */ - public function postEdit(AssetRequest $request, $assetId = null) + public function update(AssetRequest $request, $assetId = null) { // Check if the asset exists if (!$asset = Asset::find($assetId)) { // Redirect to the asset management page with error - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } + $this->authorize($asset); - if ($request->has('status_id')) { - $asset->status_id = e($request->input('status_id')); - } else { - $asset->status_id = null; - } - - if ($request->has('warranty_months')) { - $asset->warranty_months = e($request->input('warranty_months')); - } else { - $asset->warranty_months = null; - } - - if ($request->has('purchase_cost')) { - $asset->purchase_cost = Helper::ParseFloat(e($request->input('purchase_cost'))); - } else { - $asset->purchase_cost = null; - } - - if ($request->has('purchase_date')) { - $asset->purchase_date = e($request->input('purchase_date')); - } else { - $asset->purchase_date = null; - } - - if ($request->has('supplier_id')) { - $asset->supplier_id = e($request->input('supplier_id')); - } else { - $asset->supplier_id = null; - } + $asset->status_id = $request->input('status_id', null); + $asset->warranty_months = $request->input('warranty_months', null); + $asset->purchase_cost = Helper::ParseFloat($request->input('purchase_cost', null)); + $asset->purchase_date = $request->input('purchase_date', null); + $asset->supplier_id = $request->input('supplier_id', null); // If the box isn't checked, it's not in the request at all. $asset->requestable = $request->has('requestable'); - - if ($request->has('rtd_location_id')) { - $asset->rtd_location_id = e($request->input('rtd_location_id')); - } else { - $asset->rtd_location_id = null; - } + $asset->rtd_location_id = $request->input('rtd_location_id', null); if ($request->has('image_delete')) { unlink(public_path().'/uploads/assets/'.$asset->image); @@ -387,13 +316,13 @@ class AssetsController extends Controller // Update the asset data - $asset->name = e($request->input('name')); - $asset->serial = e($request->input('serial')); - $asset->company_id = Company::getIdForCurrentUser(e($request->input('company_id'))); - $asset->model_id = e($request->input('model_id')); - $asset->order_number = e($request->input('order_number')); - $asset->asset_tag = e($request->input('asset_tag')); - $asset->notes = e($request->input('notes')); + $asset->name = $request->input('name'); + $asset->serial = $request->input('serial'); + $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $asset->model_id = $request->input('model_id'); + $asset->order_number = $request->input('order_number'); + $asset->asset_tag = $request->input('asset_tag'); + $asset->notes = $request->input('notes'); $asset->physical = '1'; // Update the image @@ -436,38 +365,21 @@ class AssetsController extends Controller $model = AssetModel::find($request->get('model_id')); if ($model->fieldset) { foreach ($model->fieldset->fields as $field) { - - if ($field->field_encrypted=='1') { if (Gate::allows('admin')) { - $asset->{\App\Models\CustomField::name_to_db_name($field->name)} = \Crypt::encrypt(e($request->input(\App\Models\CustomField::name_to_db_name($field->name)))); + $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt(e($request->input($field->convertUnicodeDbSlug()))); } } else { - $asset->{\App\Models\CustomField::name_to_db_name($field->name)} = e($request->input(\App\Models\CustomField::name_to_db_name($field->name))); + $asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug()); } - - } } if ($asset->save()) { // Redirect to the new asset page - - $logaction = new Actionlog(); - $logaction->item_type = Asset::class; - $logaction->item_id = $asset->id; - $logaction->created_at = date("Y-m-d H:i:s"); - if (Input::has('rtd_location_id')) { - $logaction->location_id = e(Input::get('rtd_location_id')); - } - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('update'); - - - - \Session::flash('success', trans('admin/hardware/message.update.success')); + \Session::flash('success', trans('admin/hardware/message.update.success')); return response()->json(['redirect_url' => route("view/hardware", $assetId)]); } \Input::flash(); @@ -484,21 +396,20 @@ class AssetsController extends Controller * @since [v1.0] * @return Redirect */ - public function getDelete($assetId) + public function destroy($assetId) { // Check if the asset exists if (is_null($asset = Asset::find($assetId))) { // Redirect to the asset management page with error - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } + $this->authorize('delete', $asset); + DB::table('assets') ->where('id', $asset->id) ->update(array('assigned_to' => null)); - $asset->delete(); $logaction = new Actionlog(); @@ -509,11 +420,7 @@ class AssetsController extends Controller $log = $logaction->logaction('deleted'); // Redirect to the asset management page - return redirect()->to('hardware')->with('success', trans('admin/hardware/message.delete.success')); - - - - + return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success')); } /** @@ -530,57 +437,62 @@ class AssetsController extends Controller // Check if the asset exists if (is_null($asset = Asset::find(e($assetId)))) { // Redirect to the asset management page with error - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } - // Get the dropdown of users and then pass it to the checkout view - $users_list = Helper::usersList(); + $this->authorize('checkout', $asset); - return View::make('hardware/checkout', compact('asset'))->with('users_list', $users_list); + // Get the dropdown of users and then pass it to the checkout view + return view('hardware/checkout', compact('asset')) + ->with('users_list', Helper::usersList()) + ->with('assets_list', Helper::assetsList()) + ->with('locations_list', Helper::locationsList()); } /** - * Validate and process the form data to check out an asset to a user. - * - * @author [A. Gianotto] [] - * @param int $assetId - * @since [v1.0] - * @return Redirect - */ + * Validate and process the form data to check out an asset to a user. + * + * @author [A. Gianotto] [] + * @param AssetCheckoutRequest $request + * @param int $assetId + * @return Redirect + * @since [v1.0] + */ public function postCheckout(AssetCheckoutRequest $request, $assetId) { - // Check if the asset exists if (!$asset = Asset::find($assetId)) { - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } elseif (!$asset->availableForCheckout()) { - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.checkout.not_available')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available')); } + $this->authorize('checkout', $asset); - $user = User::find(e(Input::get('assigned_to'))); + if(request('assigned_user')) { + $target = User::find(request('assigned_user')); + } elseif(request('assigned_asset')) { + $target = Asset::find(request('assigned_asset')); + } elseif(request('assigned_location')) { + $target = Location::find(request('assigned_location')); + } + // $user = User::find(Input::get('assigned_to')); $admin = Auth::user(); if ((Input::has('checkout_at')) && (Input::get('checkout_at')!= date("Y-m-d"))) { - $checkout_at = e(Input::get('checkout_at')); + $checkout_at = Input::get('checkout_at'); } else { $checkout_at = date("Y-m-d H:i:s"); } if (Input::has('expected_checkin')) { - $expected_checkin = e(Input::get('expected_checkin')); + $expected_checkin = Input::get('expected_checkin'); } else { $expected_checkin = ''; } - - - if ($asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), e(Input::get('name')))) { - // Redirect to the new asset page - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.checkout.success')); + if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), Input::get('name'))) { +// Redirect to the new asset page + return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkout.success')); } // Redirect to the asset management page with error @@ -602,108 +514,67 @@ class AssetsController extends Controller // Check if the asset exists if (is_null($asset = Asset::find($assetId))) { // Redirect to the asset management page with error - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } - $statusLabel_list = Helper::statusLabelList(); - return View::make('hardware/checkin', compact('asset'))->with('statusLabel_list', $statusLabel_list)->with('backto', $backto); + + $this->authorize('checkin', $asset); + return view('hardware/checkin', compact('asset'))->with('statusLabel_list', Helper::statusLabelList())->with('backto', $backto); + } /** - * Validate and process the form data to check an asset back into inventory. - * - * @author [A. Gianotto] [] - * @param int $assetId - * @since [v1.0] - * @return Redirect - */ + * Validate and process the form data to check an asset back into inventory. + * + * @author [A. Gianotto] [] + * @param AssetCheckinRequest $request + * @param int $assetId + * @param null $backto + * @return Redirect + * @since [v1.0] + */ public function postCheckin(AssetCheckinRequest $request, $assetId = null, $backto = null) { // Check if the asset exists if (is_null($asset = Asset::find($assetId))) { // Redirect to the asset management page with error - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } + $this->authorize('checkin', $asset); + $admin = Auth::user(); - - if (!is_null($asset->assigned_to)) { - $user = User::find($asset->assigned_to); - } else { - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.checkin.already_checked_in')); + if($asset->assignedType() == Asset::USER) { + $user = $asset->assignedTo; + } + if (is_null($target = $asset->assignedTo)) { + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.already_checked_in')); } - // This is just used for the redirect - $return_to = $asset->assigned_to; $asset->expected_checkin = null; $asset->last_checkout = null; $asset->assigned_to = null; + $asset->assignedTo()->disassociate($asset); + $asset->assigned_type = null; $asset->accepted = null; $asset->name = e(Input::get('name')); - if (Input::has('status_id')) { $asset->status_id = e(Input::get('status_id')); } // Was the asset updated? if ($asset->save()) { - - if ($request->input('checkin_at') == Carbon::now()->format('Y-m-d')) { - $checkin_at = Carbon::now(); - } else { - $checkin_at = $request->input('checkin_at').' 00:00:00'; - } - //$checkin_at = e(Input::get('checkin_at')); - $logaction = $asset->createLogRecord('checkin', $asset, $admin, $user, null, e(Input::get('note')), $checkin_at); - - - $settings = Setting::getSettings(); - - if ($settings->slack_endpoint) { - - $slack_settings = [ - 'username' => $settings->botname, - 'channel' => $settings->slack_channel, - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked In:', - 'value' => class_basename(strtoupper($logaction->item_type)).' asset <'.config('app.url').'/hardware/'.$asset->id.'/view'.'|'.e($asset->showAssetName()).'> checked in by <'.config('app.url').'/admin/users/'.Auth::user()->id.'/view'.'|'.e(Auth::user()->fullName()).'>.' - ], - [ - 'title' => 'Note:', - 'value' => e($logaction->note) - ], - - ] - ])->send('Asset Checked In'); - - } catch (Exception $e) { - - } - - } + $logaction = $asset->logCheckin($target, e(request('note'))); $data['log_id'] = $logaction->id; - $data['first_name'] = $user->first_name; - $data['item_name'] = $asset->showAssetName(); + $data['first_name'] = get_class($target) == User::class ? $target->first_name : ''; + $data['item_name'] = $asset->present()->name(); $data['checkin_date'] = $logaction->created_at; $data['item_tag'] = $asset->asset_tag; $data['item_serial'] = $asset->serial; $data['note'] = $logaction->note; - if ((($asset->checkin_email()=='1')) && ($user) && (!config('app.lock_passwords'))) { + if ((($asset->checkin_email()=='1')) && (isset($user)) && (!empty($user->email)) && (!config('app.lock_passwords'))) { Mail::send('emails.checkin-asset', $data, function ($m) use ($user) { $m->to($user->email, $user->first_name . ' ' . $user->last_name); $m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name')); @@ -712,15 +583,13 @@ class AssetsController extends Controller } if ($backto=='user') { - return redirect()->to("admin/users/".$return_to.'/view')->with('success', trans('admin/hardware/message.checkin.success')); - } else { - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.checkin.success')); + return redirect()->to("admin/users/".$user->id.'/view')->with('success', trans('admin/hardware/message.checkin.success')); } - + return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkin.success')); } // Redirect to the asset management page with error - return redirect()->to("hardware")->with('error', trans('admin/hardware/message.checkin.error')); + return redirect()->route("hardware.index")->with('error', trans('admin/hardware/message.checkin.error')); } @@ -732,46 +601,38 @@ class AssetsController extends Controller * @since [v1.0] * @return View */ - public function getView($assetId = null) + public function show($assetId = null) { + $asset = Asset::withTrashed()->find($assetId); + $this->authorize('view', $asset); $settings = Setting::getSettings(); + $audit_log = Actionlog::where('action_type','=','audit')->where('item_id','=',$assetId)->where('item_type','=',Asset::class)->orderBy('created_at','DESC')->first(); - if (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } elseif ($asset->userloc) { - $use_currency = $asset->userloc->currency; - } elseif ($asset->assetloc) { - $use_currency = $asset->assetloc->currency; - } else { - $default_currency = Setting::first()->default_currency; - if ($settings->default_currency!='') { - $use_currency = $settings->default_currency; + if (isset($asset)) { + + if (!is_null($asset->assetloc)) { + $use_currency = $asset->assetloc->currency; } else { - $use_currency = trans('general.currency'); + + if ($settings->default_currency!='') { + $use_currency = $settings->default_currency; + } else { + $use_currency = trans('general.currency'); + } } - } - - if (isset($asset->id)) { - - - $qr_code = (object) array( 'display' => $settings->qr_code == '1', 'url' => route('qr_code/hardware', $asset->id) ); - return View::make('hardware/view', compact('asset', 'qr_code', 'settings'))->with('use_currency', $use_currency); - } else { - // Prepare the error message - $error = trans('admin/hardware/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('hardware')->with('error', $error); + return view('hardware/view', compact('asset', 'qr_code', 'settings')) + ->with('use_currency', $use_currency)->with('audit_log',$audit_log); } + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist', compact('id'))); } /** @@ -798,11 +659,10 @@ class AssetsController extends Controller return response()->file($qr_file, $header); } else { $barcode = new \Com\Tecnick\Barcode\Barcode(); - $barcode_obj = $barcode->getBarcodeObj($settings->barcode_type, route('view/hardware', $asset->id), $size['height'], $size['width'], 'black', array(-2, -2, -2, -2)); + $barcode_obj = $barcode->getBarcodeObj($settings->barcode_type, route('hardware.show', $asset->id), $size['height'], $size['width'], 'black', array(-2, -2, -2, -2)); file_put_contents($qr_file, $barcode_obj->getPngData()); return response($barcode_obj->getPngData())->header('Content-type', 'image/png'); } - } } @@ -819,12 +679,10 @@ class AssetsController extends Controller */ public function getBarCode($assetId = null) { - $settings = Setting::getSettings(); $asset = Asset::find($assetId); $barcode_file = public_path().'/uploads/barcodes/'.str_slug($settings->alt_barcode).'-'.str_slug($asset->asset_tag).'.png'; - if (isset($asset->id,$asset->asset_tag)) { if (file_exists($barcode_file)) { @@ -840,183 +698,6 @@ class AssetsController extends Controller } - - /** - * Get the Asset import upload page. - * - * @author [A. Gianotto] [] - * @since [v2.0] - * @return View - */ - public function getImportUpload() - { - - $path = config('app.private_uploads').'/imports/assets'; - $files = array(); - - if (!Company::isCurrentUserAuthorized()) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } - - // Check if the uploads directory exists. If not, try to create it. - if (!file_exists($path)) { - mkdir($path, 0755, true); - } - if ($handle = opendir($path)) { - - /* This is the correct way to loop over the directory. */ - while (false !== ($entry = readdir($handle))) { - clearstatcache(); - if (substr(strrchr($entry, '.'), 1)=='csv') { - $files[] = array( - 'filename' => $entry, - 'filesize' => Setting::fileSizeConvert(filesize($path.'/'.$entry)), - 'modified' => filemtime($path.'/'.$entry) - ); - } - - } - closedir($handle); - $files = array_reverse($files); - } - - return View::make('hardware/import')->with('files', $files); - } - - - - /** - * Upload the import file via AJAX - * - * @author [A. Gianotto] [] - * @since [v2.0] - * @return View - */ - public function postAPIImportUpload(AssetFileRequest $request) - { - - if (!Company::isCurrentUserAuthorized()) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - - } elseif (!config('app.lock_passwords')) { - - $files = Input::file('files'); - $path = config('app.private_uploads').'/imports/assets'; - $results = array(); - - foreach ($files as $file) { - - if (!in_array($file->getMimeType(), array( - 'application/vnd.ms-excel', - 'text/csv', - 'text/plain', - 'text/comma-separated-values', - 'text/tsv'))) { - $results['error']='File type must be CSV'; - return $results; - } - - $date = date('Y-m-d-his'); - $fixed_filename = str_replace(' ', '-', $file->getClientOriginalName()); - try { - $file->move($path, $date.'-'.$fixed_filename); - } catch (\Symfony\Component\HttpFoundation\File\Exception\FileException $exception) { - $results['error']=trans('admin/hardware/message.upload.error'); - if (config('app.debug')) { - $results['error'].= ' ' . $exception->getMessage(); - } - return $results; - } - $name = date('Y-m-d-his').'-'.$fixed_filename; - $filesize = Setting::fileSizeConvert(filesize($path.'/'.$name)); - $results[] = compact('name', 'filesize'); - } - - return array( - 'files' => $results - ); - - - - - } else { - $results['error']=trans('general.feature_disabled'); - return $results; - } - - - - } - - public function getDeleteImportFile($filename) - { - if (!Company::isCurrentUserAuthorized()) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } - - if (unlink(config('app.private_uploads').'/imports/assets/'.$filename)) { - return redirect()->back()->with('success', trans('admin/hardware/message.import.file_delete_success')); - } - return redirect()->back()->with('error', trans('admin/hardware/message.import.file_delete_error')); - } - - - /** - * Process the uploaded file - * - * @author [A. Gianotto] [] - * @param string $filename - * @since [v2.0] - * @return Redirect - */ - public function postProcessImportFile() - { - // php artisan asset-import:csv path/to/your/file.csv --domain=yourdomain.com --email_format=firstname.lastname - $filename = Input::get('filename'); - $itemType = Input::get('import-type'); - $updateItems = Input::get('import-update'); - - if (!Company::isCurrentUserAuthorized()) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } - $importOptions = ['filename'=> config('app.private_uploads').'/imports/assets/'.$filename, - '--email_format'=>'firstname.lastname', - '--username_format'=>'firstname.lastname', - '--web-importer' => true, - '--user_id' => Auth::user()->id, - '--item-type' => $itemType, - ]; - if ($updateItems) { - $importOptions['--update'] = true; - } - - $return = Artisan::call('snipeit:import', $importOptions); - $display_output = Artisan::output(); - $file = config('app.private_uploads').'/imports/assets/'.str_replace('.csv', '', $filename).'-output-'.date("Y-m-d-his").'.txt'; - file_put_contents($file, $display_output); - // We use hardware instead of asset in the url - $redirectTo = "hardware"; - switch($itemType) { - case "asset": - $redirectTo = "hardware"; - break; - case "accessory": - $redirectTo = "accessories"; - break; - case "consumable": - $redirectTo = "consumables"; - break; - } - - if ($return === 0) { //Success - return redirect()->to(route($redirectTo))->with('success', trans('admin/hardware/message.import.success')); - } elseif ($return === 1) { // Failure - return redirect()->back()->with('import_errors', json_decode($display_output))->with('error', trans('admin/hardware/message.import.error')); - } - dd("Shouldn't be here"); - - } - /** * Returns a view that presents a form to clone an asset. * @@ -1030,21 +711,10 @@ class AssetsController extends Controller // Check if the asset exists if (is_null($asset_to_clone = Asset::find($assetId))) { // Redirect to the asset management page - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($asset_to_clone)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } - // Grab the dropdown lists - $model_list = Helper::modelList(); - $statuslabel_list = Helper::statusLabelList(); - $location_list = Helper::locationsList(); - $manufacturer_list = Helper::manufacturerList(); - $category_list = Helper::categoryList('asset'); - $supplier_list = Helper::suppliersList(); - $assigned_to =Helper::usersList(); - $statuslabel_types = Helper::statusTypeList(); - $company_list = Helper::companyList(); + $this->authorize('create', $asset_to_clone); $asset = clone $asset_to_clone; $asset->id = null; @@ -1052,21 +722,21 @@ class AssetsController extends Controller $asset->serial = ''; $asset->assigned_to = ''; - return View::make('hardware/edit') - ->with('supplier_list', $supplier_list) - ->with('model_list', $model_list) - ->with('statuslabel_list', $statuslabel_list) - ->with('statuslabel_types', $statuslabel_types) - ->with('assigned_to', $assigned_to) + return view('hardware/edit') + ->with('supplier_list', Helper::suppliersList()) + ->with('model_list', Helper::modelList()) + ->with('statuslabel_list', Helper::statusLabelList()) + ->with('statuslabel_types', Helper::statusTypeList()) + ->with('assigned_to', Helper::usersList()) ->with('item', $asset) - ->with('location_list', $location_list) - ->with('manufacturer', $manufacturer_list) - ->with('category', $category_list) - ->with('company_list', $company_list); - + ->with('locations_list', Helper::locationsList()) + ->with('manufacturer', Helper::manufacturerList()) + ->with('category', Helper::categoryList('asset')) + ->with('users_list', Helper::usersList()) + ->with('assets_list', Helper::assetsList()) + ->with('company_list', Helper::companyList()); } - /** * Return history import view * @@ -1076,8 +746,8 @@ class AssetsController extends Controller */ public function getImportHistory() { - - return View::make('hardware/history'); + $this->authorize('checkout', Asset::class); + return view('hardware/history'); } /** @@ -1097,8 +767,6 @@ class AssetsController extends Controller ini_set("auto_detect_line_endings", '1'); } - $assets = Asset::all(['asset_tag']); - $csv = Reader::createFromPath(Input::file('user_import_csv')); $csv->setNewline("\r\n"); //get the first row, usually the CSV header @@ -1111,7 +779,7 @@ class AssetsController extends Controller $status['success'] = array(); - foreach($results as $row) { + foreach ($results as $row) { if (is_array($row)) { @@ -1128,37 +796,37 @@ class AssetsController extends Controller $item[$asset_tag][$batch_counter]['name'] = Helper::array_smart_fetch($row, "name"); $item[$asset_tag][$batch_counter]['email'] = Helper::array_smart_fetch($row, "email"); - if ($asset = Asset::where('asset_tag','=',$asset_tag)->first()) { + if ($asset = Asset::where('asset_tag', '=', $asset_tag)->first()) { $item[$asset_tag][$batch_counter]['asset_id'] = $asset->id; - $base_username = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format,$item[$asset_tag][$batch_counter]['name']); - $user = User::where('username','=',$base_username['username']); + $base_username = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $item[$asset_tag][$batch_counter]['name']); + $user = User::where('username', '=', $base_username['username']); $user_query = ' on username '.$base_username['username']; if ($request->input('match_firstnamelastname')=='1') { - $firstnamedotlastname = User::generateFormattedNameFromFullName('firstname.lastname',$item[$asset_tag][$batch_counter]['name']); + $firstnamedotlastname = User::generateFormattedNameFromFullName('firstname.lastname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $firstnamedotlastname['username']; - $user->orWhere('username','=',$firstnamedotlastname['username']); + $user->orWhere('username', '=', $firstnamedotlastname['username']); $user_query .= ', or on username '.$firstnamedotlastname['username']; } if ($request->input('match_flastname')=='1') { - $flastname = User::generateFormattedNameFromFullName('filastname',$item[$asset_tag][$batch_counter]['name']); + $flastname = User::generateFormattedNameFromFullName('filastname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $flastname['username']; - $user->orWhere('username','=',$flastname['username']); + $user->orWhere('username', '=', $flastname['username']); $user_query .= ', or on username '.$flastname['username']; } if ($request->input('match_firstname')=='1') { - $firstname = User::generateFormattedNameFromFullName('firstname',$item[$asset_tag][$batch_counter]['name']); + $firstname = User::generateFormattedNameFromFullName('firstname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $firstname['username']; - $user->orWhere('username','=',$firstname['username']); + $user->orWhere('username', '=', $firstname['username']); $user_query .= ', or on username '.$firstname['username']; } if ($request->input('match_email')=='1') { if ($item[$asset_tag][$batch_counter]['email']=='') { $item[$asset_tag][$batch_counter]['username'][] = $user_email = User::generateEmailFromFullName($item[$asset_tag][$batch_counter]['name']); - $user->orWhere('username','=',$user_email); + $user->orWhere('username', '=', $user_email); $user_query .= ', or on username '.$user_email; } } @@ -1172,13 +840,12 @@ class AssetsController extends Controller 'item_id' => $asset->id, 'item_type' => Asset::class, 'user_id' => Auth::user()->id, - 'note' => 'Checkout imported by '.Auth::user()->fullName().' from history importer', + 'note' => 'Checkout imported by '.Auth::user()->present()->fullName().' from history importer', 'target_id' => $item[$asset_tag][$batch_counter]['user_id'], 'target_type' => User::class, 'created_at' => $item[$asset_tag][$batch_counter]['checkout_date'], 'action_type' => 'checkout', - ) - ); + )); $asset->assigned_to = $user->id; @@ -1197,23 +864,19 @@ class AssetsController extends Controller $item[$asset_tag][$batch_counter]['asset_id'] = null; $status['error'][]['asset'][$asset_tag]['msg'] = 'Asset does not exist so no match was attempted.'; } - - - - } } // Loop through and backfill the checkins foreach ($item as $key => $asset_batch) { $total_in_batch = count($asset_batch); - for($x = 0; $x < $total_in_batch; $x++) { + for ($x = 0; $x < $total_in_batch; $x++) { $next = $x + 1; // Only do this if a matching user was found - if ((array_key_exists('checkedout_to',$asset_batch[$x])) && ($asset_batch[$x]['checkedout_to']!='')) { + if ((array_key_exists('checkedout_to', $asset_batch[$x])) && ($asset_batch[$x]['checkedout_to']!='')) { - if (($total_in_batch > 1) && ($x < $total_in_batch) && (array_key_exists($next,$asset_batch))) { + if (($total_in_batch > 1) && ($x < $total_in_batch) && (array_key_exists($next, $asset_batch))) { $checkin_date = Carbon::parse($asset_batch[$next]['checkout_date'])->subDay(1)->format('Y-m-d H:i:s'); $asset_batch[$x]['real_checkin'] = $checkin_date; @@ -1221,24 +884,18 @@ class AssetsController extends Controller 'item_id' => $asset_batch[$x]['asset_id'], 'item_type' => Asset::class, 'user_id' => Auth::user()->id, - 'note' => 'Checkin imported by ' . Auth::user()->fullName() . ' from history importer', + 'note' => 'Checkin imported by ' . Auth::user()->present()->fullName() . ' from history importer', 'target_id' => null, 'created_at' => $checkin_date, 'action_type' => 'checkin' - ) - ); + )); } } - - } } - - - return View::make('hardware/history')->with('status',$status); + return view('hardware/history')->with('status', $status); } - /** * Retore a deleted asset. * @@ -1249,59 +906,45 @@ class AssetsController extends Controller */ public function getRestore($assetId = null) { - - // Get user information + // Get asset information $asset = Asset::withTrashed()->find($assetId); - - if (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } elseif (isset($asset->id)) { - + $this->authorize('delete', $asset); + if (isset($asset->id)) { // Restore the asset Asset::withTrashed()->where('id', $assetId)->restore(); - return redirect()->route('hardware')->with('success', trans('admin/hardware/message.restore.success')); - - } else { - return redirect()->to('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); + return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.restore.success')); } - + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } /** - * Upload a file to the server. - * - * @author [A. Gianotto] [] - * @param int $assetId - * @since [v1.0] - * @return Redirect - */ + * Upload a file to the server. + * + * @author [A. Gianotto] [] + * @param AssetFileRequest $request + * @param int $assetId + * @return Redirect + * @since [v1.0] + */ public function postUpload(AssetFileRequest $request, $assetId = null) { if (!$asset = Asset::find($assetId)) { - return redirect()->route('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } + $this->authorize('update', $asset); $destinationPath = config('app.private_uploads').'/assets'; - - - if (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } - if (Input::hasFile('assetfile')) { - foreach (Input::file('assetfile') as $file) { $extension = $file->getClientOriginalExtension(); $filename = 'hardware-'.$asset->id.'-'.str_random(8); $filename .= '-'.str_slug($file->getClientOriginalName()).'.'.$extension; $upload_success = $file->move($destinationPath, $filename); - //Log the deletion of seats to the log $asset->logUpload($filename, e(Input::get('notes'))); - } } else { return redirect()->back()->with('error', trans('admin/hardware/message.upload.nofiles')); @@ -1309,12 +952,8 @@ class AssetsController extends Controller if ($upload_success) { return redirect()->back()->with('success', trans('admin/hardware/message.upload.success')); - } else { - return redirect()->back()->with('error', trans('admin/hardware/message.upload.error')); } - - - + return redirect()->back()->with('error', trans('admin/hardware/message.upload.error')); } /** @@ -1326,18 +965,15 @@ class AssetsController extends Controller * @since [v1.0] * @return View */ - public function getDeleteFile($assetId = null, $fileId = null) + public function deleteFile($assetId = null, $fileId = null) { $asset = Asset::find($assetId); + $this->authorize('update', $asset); $destinationPath = config('app.private_uploads').'/imports/assets'; // the asset is valid if (isset($asset->id)) { - - - if (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } + $this->authorize('update', $asset); $log = Actionlog::find($fileId); $full_filename = $destinationPath.'/'.$log->filename; @@ -1347,17 +983,14 @@ class AssetsController extends Controller $log->delete(); return redirect()->back()->with('success', trans('admin/hardware/message.deletefile.success')); - } else { - // Prepare the error message - $error = trans('admin/hardware/message.does_not_exist', compact('id')); - - // Redirect to the hardware management page - return redirect()->route('hardware')->with('error', $error); } + // Prepare the error message + $error = trans('admin/hardware/message.does_not_exist', compact('id')); + + // Redirect to the hardware management page + return redirect()->route('hardware.index')->with('error', $error); } - - /** * Check for permissions and display the file. * @@ -1369,572 +1002,290 @@ class AssetsController extends Controller */ public function displayFile($assetId = null, $fileId = null) { - $asset = Asset::find($assetId); - // the asset is valid if (isset($asset->id)) { - - - if (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } + $this->authorize('view', $asset); $log = Actionlog::find($fileId); $file = $log->get_src('assets'); - $filetype = Helper::checkUploadIsImage($file); if ($filetype) { $contents = file_get_contents($file); return Response::make($contents)->header('Content-Type', $filetype); - } else { - return Response::download($file); } - - } else { - // Prepare the error message - $error = trans('admin/hardware/message.does_not_exist', compact('id')); - - // Redirect to the hardware management page - return redirect()->route('hardware')->with('error', $error); + return Response::download($file); } + // Prepare the error message + $error = trans('admin/hardware/message.does_not_exist', compact('id')); + + // Redirect to the hardware management page + return redirect()->route('hardware.index')->with('error', $error); } - - - /** - * Display the bulk edit page. - * - * @author [A. Gianotto] [] - * @param int $assetId - * @since [v2.0] - * @return View - */ - public function postBulkEdit($assets = null) + * Display the bulk edit page. + * + * @author [A. Gianotto] [] + * @return View + * @internal param int $assetId + * @since [v2.0] + */ + public function postBulkEdit(Request $request) { + $this->authorize('update', Asset::class); - if (!Company::isCurrentUserAuthorized()) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } elseif (!Input::has('edit_asset')) { - return redirect()->back()->with('error', 'No assets selected'); - - } else { - $asset_raw_array = Input::get('edit_asset'); - foreach ($asset_raw_array as $asset_id => $value) { - $asset_ids[] = $asset_id; - - } + if (!$request->has('ids')) { + return redirect()->back()->with('error', 'No assets selected'); } - if (Input::has('bulk_actions')) { + $asset_raw_array = $request->input('ids'); + foreach ($asset_raw_array as $asset_id => $value) { + $asset_ids[] = $asset_id; + } - // Create labels - if (Input::get('bulk_actions')=='labels') { + if ($request->has('bulk_actions')) { + if ($request->input('bulk_actions')=='labels') { - $settings = Setting::getSettings(); + $count = 0; + return view('hardware/labels') + ->with('assets', Asset::find($asset_ids)) + ->with('settings', Setting::getSettings()) + ->with('count', $count) + ->with('settings', + Setting::getSettings() + ); - $assets = Asset::find($asset_ids); - $count = 0; - - return View::make('hardware/labels')->with('assets', $assets)->with('settings', $settings)->with('count', $count)->with('settings', $settings); - - - - } elseif (Input::get('bulk_actions')=='delete') { - - - $assets = Asset::with('assigneduser', 'assetloc')->find($asset_ids); - return View::make('hardware/bulk-delete')->with('assets', $assets); + } elseif ($request->input('bulk_actions')=='delete') { + $assets = Asset::with('assignedTo', 'assetloc')->find($asset_ids); + $assets->each(function($asset) { + $this->authorize('delete',$asset); + }); + return view('hardware/bulk-delete')->with('assets', $assets); // Bulk edit - } elseif (Input::get('bulk_actions')=='edit') { - - $assets = Input::get('edit_asset'); - $supplier_list = Helper::suppliersList(); - $statuslabel_list = Helper::statusLabelList(); - $location_list = Helper::locationsList(); - $models_list = Helper::modelList(); - $companies_list = array('' => '') + array('clear' => trans('general.remove_company')) + Helper::companyList(); - - return View::make('hardware/bulk') - ->with('assets', $assets) - ->with('supplier_list', $supplier_list) - ->with('statuslabel_list', $statuslabel_list) - ->with('location_list', $location_list) - ->with('models_list', $models_list) - ->with('companies_list', $companies_list); - - + } elseif ($request->input('bulk_actions')=='edit') { + return view('hardware/bulk') + ->with('assets', request('ids')) + ->with('supplier_list', Helper::suppliersList()) + ->with('statuslabel_list', Helper::statusLabelList()) + ->with('location_list', Helper::locationsList()) + ->with('models_list', Helper::modelList()) + ->with( + 'companies_list', + array('' => '') + array('clear' => trans('general.remove_company')) + Helper::companyList() + ); } - - } else { - return redirect()->back()->with('error', 'No action selected'); } - - - + return redirect()->back()->with('error', 'No action selected'); } - - /** - * Save bulk edits - * - * @author [A. Gianotto] [] - * @param array $assets - * @since [v2.0] - * @return Redirect - */ - public function postBulkSave($assets = null) + * Save bulk edits + * + * @author [A. Gianotto] [] + * @return Redirect + * @internal param array $assets + * @since [v2.0] + */ + public function postBulkSave() { - - if (!Company::isCurrentUserAuthorized()) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - - } elseif (Input::has('bulk_edit')) { - - $assets = Input::get('bulk_edit'); - - if ((Input::has('purchase_date')) || (Input::has('purchase_cost')) || (Input::has('supplier_id')) || (Input::has('order_number')) || (Input::has('warranty_months')) || (Input::has('rtd_location_id')) || (Input::has('requestable')) || (Input::has('company_id')) || (Input::has('status_id')) || (Input::has('model_id'))) { - + $this->authorize('update', Asset::class); + if (Input::has('ids')) { + $assets = Input::get('ids'); + if ((Input::has('purchase_date')) + || (Input::has('purchase_cost')) + || (Input::has('supplier_id')) + || (Input::has('order_number')) + || (Input::has('warranty_months')) + || (Input::has('rtd_location_id')) + || (Input::has('requestable')) + || (Input::has('company_id')) + || (Input::has('status_id')) + || (Input::has('model_id')) + ) { foreach ($assets as $key => $value) { - $update_array = array(); if (Input::has('purchase_date')) { $update_array['purchase_date'] = e(Input::get('purchase_date')); } - if (Input::has('purchase_cost')) { $update_array['purchase_cost'] = Helper::ParseFloat(e(Input::get('purchase_cost'))); } - if (Input::has('supplier_id')) { $update_array['supplier_id'] = e(Input::get('supplier_id')); } - if (Input::has('model_id')) { $update_array['model_id'] = e(Input::get('model_id')); } - if (Input::has('company_id')) { if (Input::get('company_id')=="clear") { $update_array['company_id'] = null; } else { $update_array['company_id'] = e(Input::get('company_id')); } - } - if (Input::has('order_number')) { $update_array['order_number'] = e(Input::get('order_number')); } - if (Input::has('warranty_months')) { $update_array['warranty_months'] = e(Input::get('warranty_months')); } - if (Input::has('rtd_location_id')) { $update_array['rtd_location_id'] = e(Input::get('rtd_location_id')); } - if (Input::has('status_id')) { $update_array['status_id'] = e(Input::get('status_id')); } - if (Input::has('requestable')) { $update_array['requestable'] = e(Input::get('requestable')); } - - if (DB::table('assets') + DB::table('assets') ->where('id', $key) - ->update($update_array)) { - - $logaction = new Actionlog(); - $logaction->item_type = Asset::class; - $logaction->item_id = $key; - $logaction->created_at = date("Y-m-d H:i:s"); - - if (Input::has('rtd_location_id')) { - $logaction->location_id = e(Input::get('rtd_location_id')); - } - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('update'); - - } + ->update($update_array); } // endforeach - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.update.success')); - // no values given, nothing to update - } else { - return redirect()->to("hardware")->with('info', trans('admin/hardware/message.update.nothing_updated')); - } - - + return redirect()->to("hardware")->with('info', trans('admin/hardware/message.update.nothing_updated')); } // endif - return redirect()->to("hardware"); - } /** - * Save bulk deleted. - * - * @author [A. Gianotto] [] - * @param array $assets - * @since [v2.0] - * @return View - */ - public function postBulkDelete($assets = null) + * Save bulk deleted. + * + * @author [A. Gianotto] [] + * @return View + * @internal param array $assets + * @since [v2.0] + */ + public function postBulkDelete() { - - if (!Company::isCurrentUserAuthorized()) { - return redirect()->to('hardware')->with('error', trans('general.insufficient_permissions')); - } elseif (Input::has('bulk_edit')) { - //$assets = Input::get('bulk_edit'); - $assets = Asset::find(Input::get('bulk_edit')); - //print_r($assets); - - + $this->authorize('delete', Asset::class); + + + if (Input::has('ids')) { + $assets = Asset::find(Input::get('ids')); foreach ($assets as $asset) { - //echo '
  • '.$asset; $update_array['deleted_at'] = date('Y-m-d H:i:s'); $update_array['assigned_to'] = null; - if (DB::table('assets') + DB::table('assets') ->where('id', $asset->id) - ->update($update_array)) { - - $logaction = new Actionlog(); - $logaction->item_type = Asset::class; - $logaction->item_id = $asset->id; - $logaction->created_at = date("Y-m-d H:i:s"); - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('deleted'); - - } + ->update($update_array); } // endforeach - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.delete.success')); - + return redirect()->to("hardware")->with('success', trans('admin/hardware/message.delete.success')); // no values given, nothing to update - } else { - return redirect()->to("hardware")->with('info', trans('admin/hardware/message.delete.nothing_updated')); - } - - // Something weird happened here - default to hardware - return redirect()->to("hardware"); - + return redirect()->to("hardware")->with('info', trans('admin/hardware/message.delete.nothing_updated')); } - - /** - * Generates the JSON used to display the asset listing. - * - * @author [A. Gianotto] [] - * @param string $status - * @since [v2.0] - * @return String JSON - */ - public function getDatatable(Request $request, $status = null) + public function getBulkCheckout() { - - - $assets = Company::scopeCompanyables(Asset::select('assets.*'))->with('model', 'assigneduser', 'assigneduser.userloc', 'assetstatus', 'defaultLoc', 'assetlog', 'model', 'model.category', 'model.manufacturer', 'model.fieldset', 'assetstatus', 'assetloc', 'company') - ->Hardware(); - - if ($request->has('search')) { - $assets = $assets->TextSearch(e($request->get('search'))); - } - - if ($request->has('offset')) { - $offset = e($request->get('offset')); - } else { - $offset = 0; - } - - if ($request->has('limit')) { - $limit = e($request->get('limit')); - } else { - $limit = 50; - } - - if ($request->has('order_number')) { - $assets->where('order_number', '=', e($request->get('order_number'))); - } - - switch ($status) { - case 'Deleted': - $assets->withTrashed()->Deleted(); - break; - case 'Pending': - $assets->Pending(); - break; - case 'RTD': - $assets->RTD(); - break; - case 'Undeployable': - $assets->Undeployable(); - break; - case 'Archived': - $assets->Archived(); - break; - case 'Requestable': - $assets->RequestableAssets(); - break; - case 'Deployed': - $assets->Deployed(); - break; - } - - if ($request->has('status_id')) { - $assets->where('status_id','=', e($request->get('status_id'))); - } - - - - $allowed_columns = [ - 'id', - 'name', - 'asset_tag', - 'serial', - 'model', - 'model_number', - 'last_checkout', - 'category', - 'manufacturer', - 'notes', - 'expected_checkin', - 'order_number', - 'companyName', - 'location', - 'image', - 'status_label', - 'assigned_to', - 'created_at', - 'purchase_date', - 'purchase_cost' - ]; - - $all_custom_fields = CustomField::all(); //used as a 'cache' of custom fields throughout this page load - - foreach ($all_custom_fields as $field) { - $allowed_columns[]=$field->db_column_name(); - } - - $order = $request->get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'asset_tag'; - - switch ($sort) { - case 'model': - $assets = $assets->OrderModels($order); - break; - case 'model_number': - $assets = $assets->OrderModelNumber($order); - break; - case 'category': - $assets = $assets->OrderCategory($order); - break; - case 'manufacturer': - $assets = $assets->OrderManufacturer($order); - break; - case 'companyName': - $assets = $assets->OrderCompany($order); - break; - case 'location': - $assets = $assets->OrderLocation($order); - break; - case 'status_label': - $assets = $assets->OrderStatus($order); - break; - case 'assigned_to': - $assets = $assets->OrderAssigned($order); - break; - default: - $assets = $assets->orderBy($sort, $order); - break; - } - - $assetCount = $assets->count(); - $assets = $assets->skip($offset)->take($limit)->get(); - - - $rows = array(); - foreach ($assets as $asset) { - $inout = ''; - $actions = '
    '; - if ($asset->deleted_at=='') { - if (Gate::allows('assets.create')) { - $actions .= ' '; - } - if (Gate::allows('assets.edit')) { - $actions .= ' '; - } - if (Gate::allows('assets.delete')) { - $actions .= ''; - } - } elseif ($asset->model->deleted_at=='') { - $actions .= ''; - } - - $actions .= '
    '; - - if (($asset->availableForCheckout())) - { - if (Gate::allows('assets.checkout')) { - $inout = '' . trans('general.checkout') . ''; - } - - } else { - if (($asset->assigned_to!='') && (Gate::allows('assets.checkin'))) { - $inout = '' . trans('general.checkin') . ''; - } - } - - $purchase_cost = Helper::formatCurrencyOutput($asset->purchase_cost); - - $row = array( - 'checkbox' =>'
    ', - 'id' => $asset->id, - 'image' => (($asset->image) && ($asset->image!='')) ? '' : ((($asset->model) && ($asset->model->image!='')) ? '' : ''), - 'name' => ''.e($asset->name).'', - 'asset_tag' => ''.e($asset->asset_tag).'', - 'serial' => e($asset->serial), - 'model' => ($asset->model) ? (string)link_to('/hardware/models/'.$asset->model->id.'/view', e($asset->model->name)) : 'No model', - 'model_number' => ($asset->model && $asset->model->model_number) ? (string)$asset->model->model_number : '', - 'status_label' => ($asset->assigneduser) ? 'Deployed' : ((e($asset->assetstatus)) ? e($asset->assetstatus->name) : ''), - 'assigned_to' => ($asset->assigneduser) ? (string)link_to(config('app.url').'/admin/users/'.$asset->assigned_to.'/view', e($asset->assigneduser->fullName())) : '', - 'location' => (($asset->assigneduser) && ($asset->assigneduser->userloc!='')) ? (string)link_to('admin/settings/locations/'.$asset->assigneduser->userloc->id.'/view', e($asset->assigneduser->userloc->name)) : (($asset->defaultLoc!='') ? (string)link_to('admin/settings/locations/'.$asset->defaultLoc->id.'/view', e($asset->defaultLoc->name)) : ''), - 'category' => (($asset->model) && ($asset->model->category)) ?(string)link_to('/admin/settings/categories/'.$asset->model->category->id.'/view', e($asset->model->category->name)) : '', - 'manufacturer' => (($asset->model) && ($asset->model->manufacturer)) ? (string)link_to('/admin/settings/manufacturers/'.$asset->model->manufacturer->id.'/view', e($asset->model->manufacturer->name)) : '', - 'eol' => ($asset->eol_date()) ? $asset->eol_date() : '', - 'purchase_cost' => $purchase_cost, - 'purchase_date' => ($asset->purchase_date) ? $asset->purchase_date : '', - 'notes' => e($asset->notes), - 'order_number' => ($asset->order_number!='') ? ''.e($asset->order_number).'' : '', - 'last_checkout' => ($asset->last_checkout!='') ? e($asset->last_checkout) : '', - 'expected_checkin' => ($asset->expected_checkin!='') ? e($asset->expected_checkin) : '', - 'created_at' => ($asset->created_at!='') ? e($asset->created_at->format('F j, Y h:iA')) : '', - 'change' => ($inout) ? $inout : '', - 'actions' => ($actions) ? $actions : '', - 'companyName' => is_null($asset->company) ? '' : e($asset->company->name) - ); - foreach ($all_custom_fields as $field) { - $column_name = $field->db_column_name(); - - if ($field->isFieldDecryptable($asset->{$column_name})) { - - if (Gate::allows('admin')) { - if (($field->format=='URL') && ($asset->{$column_name}!='')) { - $row[$column_name] = ''.Helper::gracefulDecrypt($field, $asset->{$column_name}).''; - } else { - $row[$column_name] = Helper::gracefulDecrypt($field, $asset->{$column_name}); - } - - } else { - $row[$field->db_column_name()] = strtoupper(trans('admin/custom_fields/general.encrypted')); - } - } else { - if (($field->format=='URL') && ($asset->{$field->db_column_name()}!='')) { - $row[$field->db_column_name()] = ''.$asset->{$field->db_column_name()}.''; - } else { - $row[$field->db_column_name()] = e($asset->{$field->db_column_name()}); - } - } - - } - - if (($request->has('report')) && ($request->get('report')=='true')) { - $rows[]= Helper::stripTagsFromJSON($row); - } else { - $rows[]= $row; - } - - } - - $data = array('total'=>$assetCount, 'rows'=>$rows); - - return $data; + $this->authorize('checkout', Asset::class); + // Filter out assets that are not deployable. + $assets_list = Company::scopeCompanyables(Asset::RTD()->get(), 'assets.company_id')->pluck('detailed_name', 'id')->toArray(); + return view('hardware/bulk-checkout') + ->with('users_list', Helper::usersList()) + ->with('assets_list', $assets_list); } - public function getBulkCheckout() - { - // Get the dropdown of users and then pass it to the checkout view - $users_list = Helper::usersList(); - // Filter out assets that are not deployable. - $assets = Asset::RTD()->get(); + public function postBulkCheckout(Request $request) + { + $this->validate($request, [ + "assigned_to" => 'required' + ]); - $assets_list = Company::scopeCompanyables($assets, 'assets.company_id')->lists('detailed_name', 'id')->toArray(); + $user = User::find(e(Input::get('assigned_to'))); + $admin = Auth::user(); - return View::make('hardware/bulk-checkout')->with('users_list', $users_list)->with('assets_list', $assets_list); - } + $asset_ids = array_filter(Input::get('selected_assets')); - public function postBulkCheckout(Request $request) - { + if ((Input::has('checkout_at')) && (Input::get('checkout_at')!= date("Y-m-d"))) { + $checkout_at = e(Input::get('checkout_at')); + } else { + $checkout_at = date("Y-m-d H:i:s"); + } - $this->validate($request, [ - "assigned_to" => 'required' - ]); + if (Input::has('expected_checkin')) { + $expected_checkin = e(Input::get('expected_checkin')); + } else { + $expected_checkin = ''; + } - $user = User::find(e(Input::get('assigned_to'))); - $admin = Auth::user(); + $errors = []; + DB::transaction(function () use ($user, $admin, $checkout_at, $expected_checkin, $errors, $asset_ids) { + + foreach ($asset_ids as $asset_id) { + $asset = Asset::find($asset_id); + $this->authorize('checkout', $asset); + $error = $asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), null); - $asset_ids = array_filter(Input::get('selected_assets')); + if ($error) { + array_merge_recursive($errors, $asset->getErrors()->toArray()); + } + } + }); - if ((Input::has('checkout_at')) && (Input::get('checkout_at')!= date("Y-m-d"))) { - $checkout_at = e(Input::get('checkout_at')); - } else { - $checkout_at = date("Y-m-d H:i:s"); - } + if (!$errors) { + // Redirect to the new asset page + return redirect()->to("hardware")->with('success', trans('admin/hardware/message.checkout.success')); + } + // Redirect to the asset management page with error + return redirect()->to("hardware/bulk-checkout")->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors); + } - if (Input::has('expected_checkin')) { - $expected_checkin = e(Input::get('expected_checkin')); - } else { - $expected_checkin = ''; - } - $has_errors = false; - $errors = []; - DB::transaction(function() use ($user, $admin, $checkout_at, $expected_checkin, $errors, $asset_ids) - { - foreach($asset_ids as $asset_id) - { - $asset = Asset::find($asset_id); + public function quickScan(Request $request) + { + $this->authorize('audit', Asset::class); + $dt = Carbon::now()->addMonths(12)->toDateString(); + return view('hardware/quickscan')->with('next_audit_date', $dt)->with('locations_list', Helper::locationsList()); + } - $error = $asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), null); - if($error) - { - $has_errors = true; - array_merge_recursive($errors, $asset->getErrors()->toArray()); - } - } - }); - if (!$errors) { - // Redirect to the new asset page - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.checkout.success')); - } + public function audit(Request $request, $id) + { + $this->authorize('audit', Asset::class); + $dt = Carbon::now()->addMonths(12)->toDateString(); + $asset = Asset::findOrFail($id); + return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list', Helper::locationsList()); + } + + public function auditStore(Request $request, $id) + { + $this->authorize('audit', Asset::class); + + $rules = array( + 'location_id' => 'exists:locations,id|nullable|numeric', + 'next_audit_date' => 'date|nullable' + ); + + $validator = \Validator::make($request->all(), $rules); + if ($validator->fails()) { + return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all())); + } + + $asset = Asset::findOrFail($id); + $asset->next_audit_date = $request->input('next_audit_date'); + + if ($asset->save()) { + $asset->logAudit(request('note'),request('location_id')); + return redirect()->to("hardware")->with('success', trans('admin/hardware/message.audit.success')); + } + } - // Redirect to the asset management page with error - return redirect()->to("hardware/bulk-checkout")->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors); - } } diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000000..0282bbeb5d --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,72 @@ +middleware('guest'); + } + + /** + * Get the e-mail subject line to be used for the reset link email. + * Overriding method "getEmailSubject()" from trait "use ResetsPasswords" + * @return string + */ + public function getEmailSubject() + { + return property_exists($this, 'subject') ? $this->subject : \Lang::get('mail.reset_link'); + } + + /** + * Send a reset link to the given user. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function sendResetLinkEmail(Request $request) + { + $this->validate($request, ['email' => 'required|email']); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $response = $this->broker()->sendResetLink( + $request->only('email') + ); + + if ($response === \Password::RESET_LINK_SENT) { + return redirect()->route('login')->with('status', trans($response)); + } + + // If an error was returned by the password broker, we will get this message + // translated so we can notify a user of the problem. We'll redirect back + // to where the users came from so they can attempt this process again. + return back()->withErrors( + ['email' => trans($response)] + ); + } +} diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/LoginController.php similarity index 71% rename from app/Http/Controllers/Auth/AuthController.php rename to app/Http/Controllers/Auth/LoginController.php index bd9fc475cb..884606716a 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -5,7 +5,6 @@ namespace App\Http\Controllers\Auth; use Validator; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ThrottlesLogins; -use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; use App\Models\Setting; use App\Models\Ldap; use App\Models\User; @@ -18,20 +17,17 @@ use Log; use View; use PragmaRX\Google2FA\Google2FA; - - /** * This controller handles authentication for the user, including local * database users and LDAP users. * - * @todo Move LDAP methods into user model for better separation of concerns. * @author [A. Gianotto] [] * @version v1.0 */ -class AuthController extends Controller +class LoginController extends Controller { - use AuthenticatesAndRegistersUsers, ThrottlesLogins; + use ThrottlesLogins; // This tells the auth controller to use username instead of email address protected $username = 'username'; @@ -59,7 +55,7 @@ class AuthController extends Controller if (Auth::check()) { return redirect()->intended('dashboard'); } - return View::make('auth.login'); + return view('auth.login'); } @@ -67,7 +63,7 @@ class AuthController extends Controller { LOG::debug("Binding user to LDAP."); $ldap_user = Ldap::findAndBindUserLdap($request->input('username'), $request->input('password')); - if(!$ldap_user) { + if (!$ldap_user) { LOG::debug("LDAP user ".$request->input('username')." not found in LDAP or could not bind"); throw new \Exception("Could not find user in LDAP directory"); } else { @@ -75,7 +71,7 @@ class AuthController extends Controller } // Check if the user already exists in the database and was imported via LDAP - $user = User::where('username', '=', Input::get('username'))->whereNull('deleted_at')->where('ldap_import','=',1)->first(); + $user = User::where('username', '=', Input::get('username'))->whereNull('deleted_at')->where('ldap_import', '=', 1)->first(); LOG::debug("Local auth lookup complete"); // The user does not exist in the database. Try to get them from LDAP. @@ -123,16 +119,11 @@ class AuthController extends Controller return redirect()->back()->withInput()->withErrors($validator); } - // If the class is using the ThrottlesLogins trait, we can automatically throttle - // the login attempts for this application. We'll key this by the username and - // the IP address of the client making these requests into this application. - $throttles = $this->isUsingThrottlesLoginsTrait(); $this->maxLoginAttempts = config('auth.throttle.max_attempts'); $this->lockoutTime = config('auth.throttle.lockout_duration'); - if ($throttles && $lockedOut = $this->hasTooManyLoginAttempts($request)) { + if ($lockedOut = $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); - return $this->sendLockoutResponse($request); } @@ -142,8 +133,8 @@ class AuthController extends Controller if (Setting::getSettings()->ldap_enabled=='1') { LOG::debug("LDAP is enabled."); try { - $user = $this->login_via_ldap($request); - Auth::login($user, true); + $user = $this->login_via_ldap($request); + Auth::login($user, true); // If the user was unable to login via LDAP, log the error and let them fall through to // local authentication. @@ -153,32 +144,30 @@ class AuthController extends Controller } // If the user wasn't authenticated via LDAP, skip to local auth - if(!$user) { - LOG::debug("Authenticating user against database."); + if (!$user) { + LOG::debug("Authenticating user against database."); // Try to log the user in - if (!Auth::attempt(Input::only('username', 'password'), Input::get('remember-me', 0))) { + if (!Auth::attempt(Input::only('username', 'password'), Input::get('remember-me', 0))) { - if ($throttles && ! $lockedOut) { - $this->incrementLoginAttempts($request); - } + if (!$lockedOut) { + $this->incrementLoginAttempts($request); + } + + LOG::debug("Local authentication failed."); + return redirect()->back()->withInput()->with('error', trans('auth/message.account_not_found')); + } else { - LOG::debug("Local authentication failed."); - return redirect()->back()->withInput()->with('error', trans('auth/message.account_not_found')); - } else { - if ($throttles) { $this->clearLoginAttempts($request); - } - } + } } - // Get the page we were before - $redirect = \Session::get('loginRedirect', 'home'); - - // Unset the page we were before from the session - \Session::forget('loginRedirect'); - + if ($user = Auth::user()) { + $user->last_login = \Carbon::now(); + \Log::debug('Last login:'.$user->last_login); + $user->save(); + } // Redirect to the users page - return redirect()->to($redirect)->with('success', trans('auth/message.signin.success')); + return redirect()->intended()->with('success', trans('auth/message.signin.success')); } @@ -209,7 +198,7 @@ class AuthController extends Controller $user->two_factor_secret ); - return View::make('auth.two_factor_enroll')->with('google2fa_url',$google2fa_url); + return view('auth.two_factor_enroll')->with('google2fa_url', $google2fa_url); } @@ -219,8 +208,9 @@ class AuthController extends Controller * * @return Redirect */ - public function getTwoFactorAuth() { - return View::make('auth.two_factor'); + public function getTwoFactorAuth() + { + return view('auth.two_factor'); } /** @@ -228,7 +218,8 @@ class AuthController extends Controller * * @return Redirect */ - public function postTwoFactorAuth(Request $request) { + public function postTwoFactorAuth(Request $request) + { if (!Auth::check()) { return redirect()->route('login')->with('error', 'You must be logged in.'); @@ -279,18 +270,54 @@ class AuthController extends Controller ]); } - /** - * Get the login lockout error message. - * - * @param int $seconds - * @return string - */ - protected function getLockoutErrorMessage($seconds) + + public function username() { - return \Lang::has('auth/message.throttle') - ? \Lang::get('auth/message.throttle', ['seconds' => $seconds]) - : 'Too many login attempts. Please try again in '.$seconds.' seconds.'; + return 'username'; + } + + /** + * Redirect the user after determining they are locked out. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + protected function sendLockoutResponse(Request $request) + { + $seconds = $this->limiter()->availableIn( + $this->throttleKey($request) + ); + + $minutes = round($seconds / 60); + + $message = \Lang::get('auth/message.throttle', ['minutes' => $minutes]); + + return redirect()->back() + ->withInput($request->only($this->username(), 'remember')) + ->withErrors([$this->username() => $message]); } + /** + * Override the lockout time and duration + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + protected function hasTooManyLoginAttempts(Request $request) + { + $lockoutTime = config('auth.throttle.lockout_duration'); + $maxLoginAttempts = config('auth.throttle.max_attempts'); + + return $this->limiter()->tooManyAttempts( + $this->throttleKey($request), + $maxLoginAttempts, + $lockoutTime + ); + } + + public function legacyAuthRedirect() { + return redirect()->route('login'); + } + } diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php deleted file mode 100644 index 34edb5501a..0000000000 --- a/app/Http/Controllers/Auth/PasswordController.php +++ /dev/null @@ -1,60 +0,0 @@ -] - * @version v1.0 - */ -class PasswordController extends Controller -{ - /* - |-------------------------------------------------------------------------- - | Password Reset Controller - |-------------------------------------------------------------------------- - | - | This controller is responsible for handling password reset requests - | and uses a simple trait to include this behavior. You're free to - | explore this trait and override any methods you wish to tweak. - | - */ - - use ResetsPasswords; - - /** - * Create a new password controller instance. - * - * @return void - */ - public function __construct() - { - $this->middleware('guest'); - } - - /** - * Get the e-mail subject line to be used for the reset link email. - * Overriding method "getEmailSubject()" from trait "use ResetsPasswords" - * @return string - */ - public function getEmailSubject(){ - return property_exists($this, 'subject') ? $this->subject : \Lang::get('mail.reset_link'); - } - - /** - * Get the response for after the reset link has been successfully sent. - * - * @param string $response - * @return \Symfony\Component\HttpFoundation\Response - */ - protected function getSendResetLinkEmailSuccessResponse($response) - { - return redirect()->route('login')->with('status', trans($response)); - } -} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000000..cf726eecdf --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,39 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index 5bf1bb99ba..99504d3c69 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Helpers\Helper; use App\Models\Category as Category; use App\Models\Company; +use App\Models\CustomField; use App\Models\Setting; use Auth; use DB; @@ -32,12 +33,12 @@ class CategoriesController extends Controller * @author [A. Gianotto] [] * @see CategoriesController::getDatatable() method that generates the JSON response * @since [v1.0] - * @return View - */ - public function getIndex() + * @return \Illuminate\Contracts\View\View + */ + public function index() { // Show the page - return View::make('categories/index'); + return view('categories/index'); } @@ -45,16 +46,16 @@ class CategoriesController extends Controller * Returns a form view to create a new category. * * @author [A. Gianotto] [] - * @see CategoriesController::postCreate() method that stores the data + * @see CategoriesController::store() method that stores the data * @since [v1.0] - * @return View - */ - public function getCreate() + * @return \Illuminate\Contracts\View\View + */ + public function create() { // Show the page $category_types= Helper::categoryTypeList(); - return View::make('categories/edit')->with('item', new Category) - ->with('category_types', $category_types); + return view('categories/edit')->with('item', new Category) + ->with('category_types', $category_types); } @@ -62,39 +63,28 @@ class CategoriesController extends Controller * Validates and stores the new category data. * * @author [A. Gianotto] [] - * @see CategoriesController::getCreate() method that makes the form. + * @see CategoriesController::create() method that makes the form. * @since [v1.0] - * @return Redirect - */ - public function postCreate() + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) { - // create a new model instance $category = new Category(); - // Update the category data - $category->name = e(Input::get('name')); - $category->category_type = e(Input::get('category_type')); - $category->eula_text = e(Input::get('eula_text')); - $category->use_default_eula = e(Input::get('use_default_eula', '0')); - $category->require_acceptance = e(Input::get('require_acceptance', '0')); - $category->checkin_email = e(Input::get('checkin_email', '0')); - $category->user_id = Auth::user()->id; + $category->name = $request->input('name'); + $category->category_type = $request->input('category_type'); + $category->eula_text = $request->input('eula_text'); + $category->use_default_eula = $request->input('use_default_eula', '0'); + $category->require_acceptance = $request->input('require_acceptance', '0'); + $category->checkin_email = $request->input('checkin_email', '0'); + $category->user_id = Auth::id(); if ($category->save()) { - // Redirect to the new category page - return redirect()->to("admin/settings/categories")->with('success', trans('admin/categories/message.create.success')); - } else { - - // The given data did not pass validation - return redirect()->back()->withInput()->withErrors($category->getErrors()); - + return redirect()->route('categories.index')->with('success', trans('admin/categories/message.create.success')); } - // Redirect to the category create page - return redirect()->to('admin/settings/categories/create')->with('error', trans('admin/categories/message.create.error')); - - + return redirect()->back()->withInput()->withErrors($category->getErrors()); } /** @@ -104,67 +94,56 @@ class CategoriesController extends Controller * @see CategoriesController::postEdit() method saves the data * @param int $categoryId * @since [v1.0] - * @return View - */ - public function getEdit($categoryId = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($categoryId = null) { // Check if the category exists if (is_null($item = Category::find($categoryId))) { // Redirect to the blogs management page return redirect()->to('admin/settings/categories')->with('error', trans('admin/categories/message.does_not_exist')); } - - // Show the page - //$category_options = array('' => 'Top Level') + Category::lists('name', 'id'); - - $category_options = array('' => 'Top Level') + DB::table('categories')->where('id', '!=', $categoryId)->lists('name', 'id'); $category_types= Helper::categoryTypeList(); - return View::make('categories/edit', compact('item')) - ->with('category_options', $category_options) + return view('categories/edit', compact('item')) ->with('category_types', $category_types); } /** - * Validates and stores the updated category data. - * - * @author [A. Gianotto] [] - * @see CategoriesController::getEdit() method that makes the form. - * @param int $categoryId - * @since [v1.0] - * @return Redirect - */ - public function postEdit(Request $request, $categoryId = null) + * Validates and stores the updated category data. + * + * @author [A. Gianotto] [] + * @see CategoriesController::getEdit() method that makes the form. + * @param Request $request + * @param int $categoryId + * @return \Illuminate\Http\RedirectResponse + * @since [v1.0] + */ + public function update(Request $request, $categoryId = null) { // Check if the blog post exists if (is_null($category = Category::find($categoryId))) { - // Redirect to the blogs management page + // Redirect to the categories management page return redirect()->to('admin/categories')->with('error', trans('admin/categories/message.does_not_exist')); } // Update the category data - $category->name = e($request->input('name')); + $category->name = $request->input('name'); // If the item count is > 0, we disable the category type in the edit. Disabled items // don't POST, so if the category_type is blank we just set it to the default. - $category->category_type = e($request->input('category_type', $category->category_type)); - $category->eula_text = e($request->input('eula_text')); - $category->use_default_eula = e($request->input('use_default_eula', '0')); - $category->require_acceptance = e($request->input('require_acceptance', '0')); - $category->checkin_email = e($request->input('checkin_email', '0')); + $category->category_type = $request->input('category_type', $category->category_type); + $category->eula_text = $request->input('eula_text'); + $category->use_default_eula = $request->input('use_default_eula', '0'); + $category->require_acceptance = $request->input('require_acceptance', '0'); + $category->checkin_email = $request->input('checkin_email', '0'); if ($category->save()) { - // Redirect to the new category page - return redirect()->to("admin/settings/categories")->with('success', trans('admin/categories/message.update.success')); - } // attempt validation - else { - // The given data did not pass validation - return redirect()->back()->withInput()->withErrors($category->getErrors()); + // Redirect to the new category page + return redirect()->route('categories.index')->with('success', trans('admin/categories/message.update.success')); } - - // Redirect to the category management page - return redirect()->back()->with('error', trans('admin/categories/message.update.error')); - + // The given data did not pass validation + return redirect()->back()->withInput()->withErrors($category->getErrors()); } /** @@ -173,41 +152,31 @@ class CategoriesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $categoryId - * @return Redirect - */ - public function getDelete($categoryId) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($categoryId) { // Check if the category exists if (is_null($category = Category::find($categoryId))) { - // Redirect to the blogs management page return redirect()->to('admin/settings/categories')->with('error', trans('admin/categories/message.not_found')); } - if ($category->has_models() > 0) { return redirect()->to('admin/settings/categories')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'model'])); - } elseif ($category->accessories()->count() > 0) { return redirect()->to('admin/settings/categories')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'accessory'])); - } elseif ($category->consumables()->count() > 0) { return redirect()->to('admin/settings/categories')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'consumable'])); - } elseif ($category->components()->count() > 0) { return redirect()->to('admin/settings/categories')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'component'])); - } else { - - $category->delete(); - - // Redirect to the locations management page - return redirect()->to('admin/settings/categories')->with('success', trans('admin/categories/message.delete.success')); } - + $category->delete(); + // Redirect to the locations management page + return redirect()->to(route('categories.index'))->with('success', trans('admin/categories/message.delete.success')); } - /** * Returns a view that invokes the ajax tables which actually contains * the content for the categories detail view, which is generated in getDataView. @@ -216,319 +185,32 @@ class CategoriesController extends Controller * @see CategoriesController::getDataView() method that generates the JSON response * @param int $categoryId * @since [v1.8] - * @return View - */ - public function getView($categoryId = null) + * @return \Illuminate\Contracts\View\View + */ + public function show($id) { - $category = Category::find($categoryId); + if ($category = Category::find($id)) { - if (isset($category->id)) { - return View::make('categories/view', compact('category')); - } else { - // Prepare the error message - $error = trans('admin/categories/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('categories')->with('error', $error); - } - - - } - - /** - * Returns a JSON response with the data to populate the bootstrap table on the - * cateory listing page. - * - * @todo Refactor this nastiness. Assets do not behave the same as accessories, etc. - * @author [A. Gianotto] [] - * @see CategoriesController::getIndex() method that generates the view - * @since [v1.8] - * @return String JSON - */ - public function getDatatable() - { - // Grab all the categories - $categories = Category::with('assets', 'accessories', 'consumables', 'components'); - - if (Input::has('search')) { - $categories = $categories->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - - $allowed_columns = ['id','name','category_type']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? e(Input::get('sort')) : 'created_at'; - - $categories = $categories->orderBy($sort, $order); - - $catCount = $categories->count(); - $categories = $categories->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($categories as $category) { - - $actions = ''; - $actions .=''; - $actions .=''; - $rows[] = array( - 'id' => $category->id, - 'name' => (string)link_to('/admin/settings/categories/'.$category->id.'/view', $category->name) , - 'category_type' => ucwords($category->category_type), - 'count' => $category->itemCount(), - 'acceptance' => ($category->require_acceptance=='1') ? '' : '', - 'eula' => ($category->getEula()) ? '' : '', - 'actions' => $actions - ); - } - - $data = array('total' => $catCount, 'rows' => $rows); - - return $data; - } - - public function getDataViewAssets($categoryID) - { - - $category = Category::find($categoryID); - $category = $category->load('assets.company', 'assets.model', 'assets.assetstatus', 'assets.assigneduser'); - $category_assets = $category->assets(); - if (Input::has('search')) { - $category_assets = $category_assets->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - - $allowed_columns = ['id','name','serial','asset_tag']; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - $count = $category_assets->count(); - $category_assets = $category_assets->skip($offset)->take($limit)->get(); - $rows = array(); - foreach ($category_assets as $asset) { - - $actions = ''; - $inout=''; - - if ($asset->deleted_at=='') { - $actions = '
    '; - } elseif ($asset->deleted_at!='') { - $actions = ''; - } - - if ($asset->availableForCheckout()) { - if (Gate::allows('assets.checkout')) { - $inout = ''.trans('general.checkout').''; - } + if ($category->category_type=='asset') { + $category_type = 'hardware'; + $category_type_route = 'assets'; + } elseif ($category->category_type=='accessory') { + $category_type = 'accessories'; + $category_type_route = 'accessories'; } else { - if (Gate::allows('assets.checkin')) { - $inout = ''.trans('general.checkin').''; - } + $category_type = $category->category_type; + $category_type_route = $category->category_type.'s'; } - - $rows[] = array( - 'id' => $asset->id, - 'name' => (string)link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()), - 'model' => ($asset->model) ? (string)link_to('hardware/models/'.$asset->model->id.'/view', $asset->model->name) : '', - 'asset_tag' => $asset->asset_tag, - 'serial' => $asset->serial, - 'assigned_to' => ($asset->assigneduser) ? (string)link_to('/admin/users/'.$asset->assigneduser->id.'/view', $asset->assigneduser->fullName()): '', - 'change' => $inout, - 'actions' => $actions, - 'companyName' => is_null($asset->company) ? '' : e($asset->company->name) - ); + return view('categories/view', compact('category')) + ->with('category_type',$category_type) + ->with('category_type_route',$category_type_route); } - $data = array('total' => $count, 'rows' => $rows); - return $data; + // Prepare the error message + $error = trans('admin/categories/message.does_not_exist', compact('id')); + // Redirect to the user management page + return redirect()->route('categories.index')->with('error', $error); } - - public function getDataViewAccessories($categoryID) - { - - $category = Category::with('accessories.company')->find($categoryID); - $category_assets = $category->accessories; - - if (Input::has('search')) { - $category_assets = $category_assets->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - - $allowed_columns = ['id','name','serial','asset_tag']; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - $count = $category_assets->count(); - - $rows = array(); - - foreach ($category_assets as $asset) { - - $actions = ''; - $inout=''; - - if ($asset->deleted_at=='') { - $actions = '
    '; - } - - - - $rows[] = array( - 'id' => $asset->id, - 'name' => (string)link_to_route('view/accessory', $asset->name, [$asset->id]), - 'actions' => $actions, - 'companyName' => Company::getName($asset), - ); - } - - $data = array('total' => $count, 'rows' => $rows); - return $data; - } - - - public function getDataViewConsumables($categoryID) - { - - $category = Category::with('accessories.company')->find($categoryID); - $category_assets = $category->consumables; - - if (Input::has('search')) { - $category_assets = $category_assets->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - - $allowed_columns = ['id','name','serial','asset_tag']; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - $count = $category_assets->count(); - - $rows = array(); - - foreach ($category_assets as $asset) { - - $actions = ''; - $inout=''; - - if ($asset->deleted_at=='') { - $actions = '
    '; - } - - - - $rows[] = array( - 'id' => $asset->id, - 'name' => (string) link_to_route('view/consumable', $asset->name, [$asset->id]), - 'actions' => $actions, - 'companyName' => Company::getName($asset), - ); - } - - $data = array('total' => $count, 'rows' => $rows); - return $data; - } - - public function getDataViewComponent($categoryID) - { - - $category = Category::with('accessories.company')->find($categoryID); - $category_assets = $category->components; - - if (Input::has('search')) { - $category_assets = $category_assets->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - - $allowed_columns = ['id','name','serial','asset_tag']; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - $count = $category_assets->count(); - - $rows = array(); - - foreach ($category_assets as $asset) { - - $actions = ''; - $inout=''; - - if ($asset->deleted_at=='') { - $actions = '
    '; - } - - - - $rows[] = array( - 'id' => $asset->id, - 'name' => (string)link_to_route('view/accessory', $asset->name, [$asset->id]), - 'actions' => $actions, - 'companyName' => Company::getName($asset), - ); - } - - $data = array('total' => $count, 'rows' => $rows); - return $data; - } } diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index 093ba8415c..8ef76a9333 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -6,6 +6,7 @@ use Input; use Lang; use Redirect; use View; +use Illuminate\Http\Request; /** * This controller handles all actions related to Companies for @@ -22,11 +23,11 @@ final class CompaniesController extends Controller * * @author [Abdullah Alansari] [] * @since [v1.8] - * @return View - */ - public function getIndex() + * @return \Illuminate\Contracts\View\View + */ + public function index() { - return View::make('companies/index')->with('companies', Company::all()); + return view('companies/index')->with('companies', Company::all()); } /** @@ -34,33 +35,31 @@ final class CompaniesController extends Controller * * @author [Abdullah Alansari] [] * @since [v1.8] - * @return View - */ - public function getCreate() + * @return \Illuminate\Contracts\View\View + */ + public function create() { - return View::make('companies/edit')->with('item', new Company); + return view('companies/edit')->with('item', new Company); } /** - * Save data from new company form. - * - * @author [Abdullah Alansari] [] - * @since [v1.8] - * @return Redirect - */ - public function postCreate() + * Save data from new company form. + * + * @author [Abdullah Alansari] [] + * @since [v1.8] + * @param Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) { $company = new Company; - - $company->name = e(Input::get('name')); + $company->name = $request->input('name'); if ($company->save()) { - return redirect()->to('admin/settings/companies') + return redirect()->route('companies.index') ->with('success', trans('admin/companies/message.create.success')); - } else { - return redirect()->back()->withInput()->withErrors($company->getErrors()); } - + return redirect()->back()->withInput()->withErrors($company->getErrors()); } @@ -70,44 +69,40 @@ final class CompaniesController extends Controller * @author [Abdullah Alansari] [] * @since [v1.8] * @param int $companyId - * @return View - */ - public function getEdit($companyId) + * @return \Illuminate\Contracts\View\View + */ + public function edit($companyId) { if (is_null($item = Company::find($companyId))) { - return redirect()->to('admin/settings/companies') + return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.does_not_exist')); - } else { - return View::make('companies/edit')->with('item', $item); } + return view('companies/edit')->with('item', $item); } /** - * Save data from edit company form. - * - * @author [Abdullah Alansari] [] - * @since [v1.8] - * @param int $companyId - * @return Redirect - */ - public function postEdit($companyId) + * Save data from edit company form. + * + * @author [Abdullah Alansari] [] + * @since [v1.8] + * @param Request $request + * @param int $companyId + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $companyId) { if (is_null($company = Company::find($companyId))) { - return redirect()->to('admin/settings/companies')->with('error', trans('admin/companies/message.does_not_exist')); - } else { - - - $company->name = e(Input::get('name')); - - if ($company->save()) { - return redirect()->to('admin/settings/companies') - ->with('success', trans('admin/companies/message.update.success')); - } else { - return redirect()->to("admin/settings/companies/$companyId/edit") - ->with('error', trans('admin/companies/message.update.error')); - } - + return redirect()->route('companies.index')->with('error', trans('admin/companies/message.does_not_exist')); } + + $company->name = $request->input('name'); + + if ($company->save()) { + return redirect()->route('companies.index') + ->with('success', trans('admin/companies/message.update.success')); + } + return redirect()->route('companies.edit', ['company' => $companyId]) + ->with('error', trans('admin/companies/message.update.error')); } /** @@ -116,17 +111,17 @@ final class CompaniesController extends Controller * @author [Abdullah Alansari] [] * @since [v1.8] * @param int $companyId - * @return Redirect - */ - public function postDelete($companyId) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($companyId) { if (is_null($company = Company::find($companyId))) { - return redirect()->to('admin/settings/companies') + return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.not_found')); } else { try { $company->delete(); - return redirect()->to('admin/settings/companies') + return redirect()->route('companies.index') ->with('success', trans('admin/companies/message.delete.success')); } catch (\Illuminate\Database\QueryException $exception) { /* @@ -134,7 +129,7 @@ final class CompaniesController extends Controller * For example when rows in other tables are referencing this company */ if ($exception->getCode() == 23000) { - return redirect()->to('admin/settings/companies') + return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.assoc_users')); } else { throw $exception; @@ -142,4 +137,16 @@ final class CompaniesController extends Controller } } } + + public function show($id) { + $this->authorize('view', Company::class); + + if (is_null($company = Company::find($id))) { + return redirect()->route('companies.index') + ->with('error', trans('admin/companies/message.not_found')); + } else { + return view('companies/view')->with('company',$company); + } + + } } diff --git a/app/Http/Controllers/ComponentsController.php b/app/Http/Controllers/ComponentsController.php index 1bba51ca67..ca09711fd8 100644 --- a/app/Http/Controllers/ComponentsController.php +++ b/app/Http/Controllers/ComponentsController.php @@ -2,9 +2,9 @@ namespace App\Http\Controllers; use App\Helpers\Helper; -use App\Models\Actionlog; use App\Models\Company; use App\Models\Component; +use App\Models\CustomField; use App\Models\Setting; use App\Models\User; use App\Models\Asset; @@ -37,11 +37,12 @@ class ComponentsController extends Controller * @author [A. Gianotto] [] * @see ComponentsController::getDatatable() method that generates the JSON response * @since [v3.0] - * @return View + * @return \Illuminate\Contracts\View\View */ - public function getIndex() + public function index() { - return View::make('components/index'); + $this->authorize('view', Component::class); + return view('components/index'); } @@ -51,20 +52,17 @@ class ComponentsController extends Controller * @author [A. Gianotto] [] * @see ComponentsController::postCreate() method that stores the data * @since [v3.0] - * @return View + * @return \Illuminate\Contracts\View\View */ - public function getCreate() + public function create() { + $this->authorize('create', Component::class); // Show the page - $category_list = Helper::categoryList('component'); - $company_list = Helper::companyList(); - $location_list = Helper::locationsList(); - - return View::make('components/edit') + return view('components/edit') ->with('item', new Component) - ->with('category_list', $category_list) - ->with('company_list', $company_list) - ->with('location_list', $location_list); + ->with('category_list', Helper::categoryList('component')) + ->with('company_list', Helper::companyList()) + ->with('location_list', Helper::locationsList()); } @@ -74,48 +72,28 @@ class ComponentsController extends Controller * @author [A. Gianotto] [] * @see ComponentsController::getCreate() method that generates the view * @since [v3.0] - * @return Redirect - */ - public function postCreate() + * @return \Illuminate\Http\RedirectResponse + */ + public function store() { - - // create a new model instance + $this->authorize('create', Component::class); $component = new Component(); - - // Update the component data - $component->name = e(Input::get('name')); - $component->category_id = e(Input::get('category_id')); - $component->location_id = e(Input::get('location_id')); + $component->name = Input::get('name'); + $component->category_id = Input::get('category_id'); + $component->location_id = Input::get('location_id'); $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $component->order_number = e(Input::get('order_number')); - $component->min_amt = e(Input::get('min_amt')); - $component->serial = e(Input::get('serial')); + $component->order_number = Input::get('order_number'); + $component->min_amt = Input::get('min_amt'); + $component->serial = Input::get('serial'); + $component->purchase_date = Input::get('purchase_date'); + $component->purchase_cost = request('purchase_cost'); + $component->qty = Input::get('qty'); + $component->user_id = Auth::id(); - if (e(Input::get('purchase_date')) == '') { - $component->purchase_date = null; - } else { - $component->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('purchase_cost')) == '0.00') { - $component->purchase_cost = null; - } else { - $component->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - $component->qty = e(Input::get('qty')); - $component->user_id = Auth::user()->id; - - // Was the component created? if ($component->save()) { - $component->logCreate(); - // Redirect to the new component page - return redirect()->to("admin/components")->with('success', trans('admin/components/message.create.success')); + return redirect()->route('components.index')->with('success', trans('admin/components/message.create.success')); } - return redirect()->back()->withInput()->withErrors($component->getErrors()); - - } /** @@ -125,26 +103,20 @@ class ComponentsController extends Controller * @see ComponentsController::postEdit() method that stores the data. * @since [v3.0] * @param int $componentId - * @return View - */ - public function getEdit($componentId = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($componentId = null) { - // Check if the component exists if (is_null($item = Component::find($componentId))) { - // Redirect to the blogs management page - return redirect()->to('admin/components')->with('error', trans('admin/components/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($item)) { - return redirect()->to('admin/components')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); } - $category_list = Helper::categoryList('component'); - $company_list = Helper::companyList(); - $location_list = Helper::locationsList(); + $this->authorize('update', $item); - return View::make('components/edit', compact('item')) - ->with('category_list', $category_list) - ->with('company_list', $company_list) - ->with('location_list', $location_list); + return view('components/edit', compact('item')) + ->with('category_list', Helper::categoryList('component')) + ->with('company_list', Helper::companyList()) + ->with('location_list', Helper::locationsList()); } @@ -155,53 +127,33 @@ class ComponentsController extends Controller * @see ComponentsController::getEdit() method presents the form. * @param int $componentId * @since [v3.0] - * @return Redirect - */ - public function postEdit($componentId = null) + * @return \Illuminate\Http\RedirectResponse + */ + public function update($componentId = null) { - // Check if the blog post exists if (is_null($component = Component::find($componentId))) { - // Redirect to the blogs management page - return redirect()->to('admin/components')->with('error', trans('admin/components/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($component)) { - return redirect()->to('admin/components')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); } + $this->authorize('update', $component); + // Update the component data - $component->name = e(Input::get('name')); - $component->category_id = e(Input::get('category_id')); - $component->location_id = e(Input::get('location_id')); + $component->name = Input::get('name'); + $component->category_id = Input::get('category_id'); + $component->location_id = Input::get('location_id'); $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $component->order_number = e(Input::get('order_number')); - $component->min_amt = e(Input::get('min_amt')); - $component->serial = e(Input::get('serial')); + $component->order_number = Input::get('order_number'); + $component->min_amt = Input::get('min_amt'); + $component->serial = Input::get('serial'); + $component->purchase_date = Input::get('purchase_date'); + $component->purchase_cost = request('purchase_cost'); + $component->qty = Input::get('qty'); - if (e(Input::get('purchase_date')) == '') { - $component->purchase_date = null; - } else { - $component->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('purchase_cost')) == '0.00') { - $component->purchase_cost = null; - } else { - $component->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - $component->qty = e(Input::get('qty')); - - // Was the component created? if ($component->save()) { - // Redirect to the new component page - return redirect()->to("admin/components")->with('success', trans('admin/components/message.update.success')); + return redirect()->route('components.index')->with('success', trans('admin/components/message.update.success')); } - return redirect()->back()->withInput()->withErrors($component->getErrors()); - - - - } /** @@ -210,32 +162,28 @@ class ComponentsController extends Controller * @author [A. Gianotto] [] * @since [v3.0] * @param int $componentId - * @return Redirect - */ - public function getDelete($componentId) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($componentId) { - // Check if the blog post exists if (is_null($component = Component::find($componentId))) { - // Redirect to the blogs management page - return redirect()->to('admin/components')->with('error', trans('admin/components/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($component)) { - return redirect()->to('admin/components')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } - $component->delete(); - - // Redirect to the locations management page - return redirect()->to('admin/components')->with('success', trans('admin/components/message.delete.success')); - + $this->authorize('delete', $component); + $component->delete(); + return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success')); } public function postBulk($componentId = null) { + //$this->authorize('checkout', $component) echo 'Stubbed - not yet complete'; } public function postBulkSave($componentId = null) { + //$this->authorize('edit', Component::class); echo 'Stubbed - not yet complete'; } @@ -247,29 +195,20 @@ class ComponentsController extends Controller * @see ComponentsController::getDataView() method that generates the JSON response * @since [v3.0] * @param int $componentId - * @return View - */ - public function getView($componentId = null) + * @return \Illuminate\Contracts\View\View + */ + public function show($componentId = null) { $component = Component::find($componentId); if (isset($component->id)) { - - - if (!Company::isCurrentUserHasAccess($component)) { - return redirect()->to('admin/components')->with('error', trans('general.insufficient_permissions')); - } else { - return View::make('components/view', compact('component')); - } - } else { - // Prepare the error message - $error = trans('admin/components/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('components')->with('error', $error); + $this->authorize('view', $component); + return view('components/view', compact('component')); } - - + // Prepare the error message + $error = trans('admin/components/message.does_not_exist', compact('id')); + // Redirect to the user management page + return redirect()->route('components.index')->with('error', $error); } /** @@ -279,50 +218,41 @@ class ComponentsController extends Controller * @see ComponentsController::postCheckout() method that stores the data. * @since [v3.0] * @param int $componentId - * @return View - */ + * @return \Illuminate\Contracts\View\View + */ public function getCheckout($componentId) { // Check if the component exists if (is_null($component = Component::find($componentId))) { // Redirect to the component management page with error - return redirect()->to('components')->with('error', trans('admin/components/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($component)) { - return redirect()->to('admin/components')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } - - // Get the dropdown of assets and then pass it to the checkout view - $assets_list = Helper::detailedAssetList(); - - return View::make('components/checkout', compact('component'))->with('assets_list', $assets_list); - + $this->authorize('checkout', $component); + return view('components/checkout', compact('component'))->with('assets_list', Helper::detailedAssetList()); } /** - * Validate and store checkout data. - * - * @author [A. Gianotto] [] - * @see ComponentsController::getCheckout() method that returns the form. - * @since [v3.0] - * @param int $componentId - * @return Redirect - */ + * Validate and store checkout data. + * + * @author [A. Gianotto] [] + * @see ComponentsController::getCheckout() method that returns the form. + * @since [v3.0] + * @param Request $request + * @param int $componentId + * @return \Illuminate\Http\RedirectResponse + */ public function postCheckout(Request $request, $componentId) { - - - // Check if the component exists if (is_null($component = Component::find($componentId))) { // Redirect to the component management page with error - return redirect()->to('components')->with('error', trans('admin/components/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($component)) { - return redirect()->to('admin/components')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } + $this->authorize('checkout', $component); $max_to_checkout = $component->numRemaining(); - $validator = Validator::make($request->all(),[ + $validator = Validator::make($request->all(), [ "asset_id" => "required", "assigned_qty" => "required|numeric|between:1,$max_to_checkout" ]); @@ -339,159 +269,25 @@ class ComponentsController extends Controller // Check if the user exists if (is_null($asset = Asset::find($asset_id))) { // Redirect to the component management page with error - return redirect()->to('admin/components')->with('error', trans('admin/components/message.asset_does_not_exist')); + return redirect()->route('components.index')->with('error', trans('admin/components/message.asset_does_not_exist')); } - + // Update the component data $component->asset_id = $asset_id; - $component->assets()->attach($component->id, array( - 'component_id' => $component->id, - 'user_id' => $admin_user->id, - 'created_at' => date('Y-m-d H:i:s'), - 'assigned_qty' => e(Input::get('assigned_qty')), - 'asset_id' => $asset_id)); - - $logaction = $component->logCheckout(e(Input::get('note')), $asset_id); - - $settings = Setting::getSettings(); - - if ($settings->slack_endpoint) { - - $slack_settings = [ - 'username' => $settings->botname, - 'channel' => $settings->slack_channel, - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked Out:', - 'value' => class_basename(strtoupper($logaction->item_type)).' <'.config('app.url').'/admin/components/'.$component->id.'/view'.'|'.$component->name.'> checked out to <'.config('app.url').'/hardware/'.$asset->id.'/view|'.$asset->showAssetName().'> by <'.config('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.' - ], - [ - 'title' => 'Note:', - 'value' => e($logaction->note) - ], - ] - ])->send('Component Checked Out'); - - } catch (Exception $e) { - - } - } - - // Redirect to the new component page - return redirect()->to("admin/components")->with('success', trans('admin/components/message.checkout.success')); - - + $component->assets()->attach($component->id, [ + 'component_id' => $component->id, + 'user_id' => $admin_user->id, + 'created_at' => date('Y-m-d H:i:s'), + 'assigned_qty' => Input::get('assigned_qty'), + 'asset_id' => $asset_id + ]); + $component->logCheckout(e(Input::get('note')), $asset); + return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success')); } - /** - * Generates the JSON response for accessories listing view. - * - * For debugging, see at /api/accessories/list - * - * @author [A. Gianotto] [] - * @since [v3.0] - * @return string JSON - **/ - public function getDatatable() - { - $components = Company::scopeCompanyables(Component::select('components.*')->whereNull('components.deleted_at') - ->with('company', 'location', 'category')); - - if (Input::has('search')) { - $components = $components->TextSearch(Input::get('search')); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','companyName','category','total_qty']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - - switch ($sort) { - case 'category': - $components = $components->OrderCategory($order); - break; - case 'location': - $components = $components->OrderLocation($order); - break; - case 'companyName': - $components = $components->OrderCompany($order); - break; - default: - $components = $components->orderBy($sort, $order); - break; - } - - $consumCount = $components->count(); - $components = $components->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($components as $component) { - $actions = ''; - if (Gate::allows('components.checkout')) { - $actions .= 'numRemaining() > 0) ? '' : ' disabled') . '>' . trans('general.checkout') . ''; - } - - if (Gate::allows('components.edit')) { - $actions .= ''; - } - - if (Gate::allows('components.delete')) { - $actions .= ''; - } - - $actions .=''; - $company = $component->company; - - $rows[] = array( - 'checkbox' =>'
    ', - 'id' => $component->id, - 'name' => (string)link_to('admin/components/'.$component->id.'/view', e($component->name)), - 'serial_number' => $component->serial, - 'location' => ($component->location) ? e($component->location->name) : '', - 'qty' => e($component->qty), - 'min_amt' => e($component->min_amt), - 'category' => ($component->category) ? e($component->category->name) : 'Missing category', - 'order_number' => e($component->order_number), - 'purchase_date' => e($component->purchase_date), - 'purchase_cost' => Helper::formatCurrencyOutput($component->purchase_cost), - 'numRemaining' => $component->numRemaining(), - 'actions' => $actions, - 'companyName' => is_null($company) ? '' : e($company->name), - ); - } - - $data = array('total' => $consumCount, 'rows' => $rows); - - return $data; - - } - /** * Return JSON data to populate the components view, * @@ -503,22 +299,20 @@ class ComponentsController extends Controller */ public function getDataView($componentId) { - //$component = Component::find($componentID); - $component = Component::with('assets')->find($componentId); - + if (is_null($component = Component::with('assets')->find($componentId))) { + // Redirect to the component management page with error + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); + } if (!Company::isCurrentUserHasAccess($component)) { return ['total' => 0, 'rows' => []]; } + $this->authorize('view', $component); $rows = array(); - + $all_custom_fields = CustomField::all(); // Cached for table; foreach ($component->assets as $component_assignment) { - $rows[] = array( - 'name' => (string)link_to('/hardware/'.$component_assignment->id.'/view', e($component_assignment->showAssetName())), - 'qty' => e($component_assignment->pivot->assigned_qty), - 'created_at' => ($component_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $component_assignment->created_at->format('Y-m-d H:i:s'), - ); + $rows[] = $component_assignment->present()->forDataTable($all_custom_fields); } $componentCount = $component->assets->count(); diff --git a/app/Http/Controllers/ConsumablesController.php b/app/Http/Controllers/ConsumablesController.php index adaa6cb701..c7c920897b 100644 --- a/app/Http/Controllers/ConsumablesController.php +++ b/app/Http/Controllers/ConsumablesController.php @@ -3,11 +3,11 @@ namespace App\Http\Controllers; use App\Helpers\Helper; -use App\Models\Actionlog; use App\Models\Company; use App\Models\Consumable; use App\Models\Setting; use App\Models\User; +use App\Notifications\CheckoutNotification; use Auth; use Config; use DB; @@ -34,11 +34,12 @@ class ConsumablesController extends Controller * @author [A. Gianotto] [] * @see ConsumablesController::getDatatable() method that generates the JSON response * @since [v1.0] - * @return View - */ - public function getIndex() + * @return \Illuminate\Contracts\View\View + */ + public function index() { - return View::make('consumables/index'); + $this->authorize('index', Consumable::class); + return view('consumables/index'); } @@ -48,22 +49,18 @@ class ConsumablesController extends Controller * @author [A. Gianotto] [] * @see ConsumablesController::postCreate() method that stores the form data * @since [v1.0] - * @return View - */ - public function getCreate() + * @return \Illuminate\Contracts\View\View + */ + public function create() { + $this->authorize('create', Consumable::class); // Show the page - $category_list = Helper::categoryList('consumable'); - $company_list = Helper::companyList(); - $location_list = Helper::locationsList(); - $manufacturer_list = Helper::manufacturerList(); - - return View::make('consumables/edit') + return view('consumables/edit') ->with('item', new Consumable) - ->with('category_list', $category_list) - ->with('company_list', $company_list) - ->with('location_list', $location_list) - ->with('manufacturer_list', $manufacturer_list); + ->with('category_list', Helper::categoryList('consumable')) + ->with('company_list', Helper::companyList()) + ->with('location_list', Helper::locationsList()) + ->with('manufacturer_list', Helper::manufacturerList()); } @@ -73,46 +70,32 @@ class ConsumablesController extends Controller * @author [A. Gianotto] [] * @see ConsumablesController::getCreate() method that returns the form view * @since [v1.0] - * @return Redirect - */ - public function postCreate() + * @return \Illuminate\Http\RedirectResponse + */ + public function store() { + $this->authorize('create', Consumable::class); $consumable = new Consumable(); - $consumable->name = e(Input::get('name')); - $consumable->category_id = e(Input::get('category_id')); - $consumable->location_id = e(Input::get('location_id')); + $consumable->name = Input::get('name'); + $consumable->category_id = Input::get('category_id'); + $consumable->location_id = Input::get('location_id'); $consumable->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $consumable->order_number = e(Input::get('order_number')); - $consumable->min_amt = e(Input::get('min_amt')); - $consumable->manufacturer_id = e(Input::get('manufacturer_id')); - $consumable->model_number = e(Input::get('model_number')); - $consumable->item_no = e(Input::get('item_no')); + $consumable->order_number = Input::get('order_number'); + $consumable->min_amt = Input::get('min_amt'); + $consumable->manufacturer_id = Input::get('manufacturer_id'); + $consumable->model_number = Input::get('model_number'); + $consumable->item_no = Input::get('item_no'); + $consumable->purchase_date = Input::get('purchase_date'); + $consumable->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); + $consumable->qty = Input::get('qty'); + $consumable->user_id = Auth::id(); - if (e(Input::get('purchase_date')) == '') { - $consumable->purchase_date = null; - } else { - $consumable->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('purchase_cost')) == '0.00') { - $consumable->purchase_cost = null; - } else { - $consumable->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - $consumable->qty = e(Input::get('qty')); - $consumable->user_id = Auth::user()->id; - - // Was the consumable created? if ($consumable->save()) { - $consumable->logCreate(); - // Redirect to the new consumable page - return redirect()->to("admin/consumables")->with('success', trans('admin/consumables/message.create.success')); + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.create.success')); } return redirect()->back()->withInput()->withErrors($consumable->getErrors()); - } /** @@ -122,28 +105,21 @@ class ConsumablesController extends Controller * @param int $consumableId * @see ConsumablesController::postEdit() method that stores the form data. * @since [v1.0] - * @return View - */ - public function getEdit($consumableId = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($consumableId = null) { - // Check if the consumable exists if (is_null($item = Consumable::find($consumableId))) { - // Redirect to the blogs management page - return redirect()->to('admin/consumables')->with('error', trans('admin/consumables/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($item)) { - return redirect()->to('admin/consumables')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); } - $category_list = Helper::categoryList('consumable'); - $company_list = Helper::companyList(); - $location_list = Helper::locationsList(); - $manufacturer_list = Helper::manufacturerList(); + $this->authorize($item); - return View::make('consumables/edit', compact('item')) - ->with('category_list', $category_list) - ->with('company_list', $company_list) - ->with('location_list', $location_list) - ->with('manufacturer_list', $manufacturer_list); + return view('consumables/edit', compact('item')) + ->with('category_list', Helper::categoryList('consumable')) + ->with('company_list', Helper::companyList()) + ->with('location_list', Helper::locationsList()) + ->with('manufacturer_list', Helper::manufacturerList()); } @@ -154,55 +130,33 @@ class ConsumablesController extends Controller * @param int $consumableId * @see ConsumablesController::getEdit() method that stores the form data. * @since [v1.0] - * @return Redirect - */ - public function postEdit($consumableId = null) + * @return \Illuminate\Http\RedirectResponse + */ + public function update($consumableId = null) { if (is_null($consumable = Consumable::find($consumableId))) { - return redirect()->to('admin/consumables')->with('error', trans('admin/consumables/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($consumable)) { - return redirect()->to('admin/consumables')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); } - $consumable->name = e(Input::get('name')); - $consumable->category_id = e(Input::get('category_id')); - $consumable->location_id = e(Input::get('location_id')); + $this->authorize($consumable); + + $consumable->name = Input::get('name'); + $consumable->category_id = Input::get('category_id'); + $consumable->location_id = Input::get('location_id'); $consumable->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $consumable->order_number = e(Input::get('order_number')); - $consumable->min_amt = e(Input::get('min_amt')); - $consumable->manufacturer_id = e(Input::get('manufacturer_id')); - $consumable->model_number = e(Input::get('model_number')); - $consumable->item_no = e(Input::get('item_no')); - - if (e(Input::get('purchase_date')) == '') { - $consumable->purchase_date = null; - } else { - $consumable->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('purchase_cost')) == '0.00') { - $consumable->purchase_cost = null; - } else { - $consumable->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - $consumable->qty = Helper::ParseFloat(e(Input::get('qty'))); + $consumable->order_number = Input::get('order_number'); + $consumable->min_amt = Input::get('min_amt'); + $consumable->manufacturer_id = Input::get('manufacturer_id'); + $consumable->model_number = Input::get('model_number'); + $consumable->item_no = Input::get('item_no'); + $consumable->purchase_date = Input::get('purchase_date'); + $consumable->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); + $consumable->qty = Helper::ParseFloat(Input::get('qty')); if ($consumable->save()) { - - $logaction = new Actionlog(); - $logaction->item_type = Consumable::class; - $logaction->item_id = $consumable->id; - $logaction->created_at = date("Y-m-d H:i:s"); - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('update'); - - - return redirect()->to("admin/consumables")->with('success', trans('admin/consumables/message.update.success')); + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.update.success')); } - return redirect()->back()->withInput()->withErrors($consumable->getErrors()); - } /** @@ -211,34 +165,19 @@ class ConsumablesController extends Controller * @author [A. Gianotto] [] * @param int $consumableId * @since [v1.0] - * @return Redirect - */ - public function getDelete($consumableId) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($consumableId) { - // Check if the blog post exists if (is_null($consumable = Consumable::find($consumableId))) { - // Redirect to the blogs management page - return redirect()->to('admin/consumables')->with('error', trans('admin/consumables/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($consumable)) { - return redirect()->to('admin/consumables')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.not_found')); } - - $consumable->delete(); - - $logaction = new Actionlog(); - $logaction->item_type = Consumable::class; - $logaction->item_id = $consumable->id; - $logaction->created_at = date("Y-m-d H:i:s"); - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('deleted'); - - // Redirect to the locations management page - return redirect()->to('admin/consumables')->with('success', trans('admin/consumables/message.delete.success')); - + $this->authorize($consumable); + $consumable->delete(); + // Redirect to the locations management page + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.delete.success')); } - - /** * Return a view to display component information. * @@ -246,29 +185,16 @@ class ConsumablesController extends Controller * @see ConsumablesController::getDataView() method that generates the JSON response * @since [v1.0] * @param int $consumableId - * @return View - */ - public function getView($consumableId = null) + * @return \Illuminate\Contracts\View\View + */ + public function show($consumableId = null) { $consumable = Consumable::find($consumableId); - + $this->authorize($consumable); if (isset($consumable->id)) { - - - if (!Company::isCurrentUserHasAccess($consumable)) { - return redirect()->to('admin/consumables')->with('error', trans('general.insufficient_permissions')); - } else { - return View::make('consumables/view', compact('consumable')); - } - } else { - // Prepare the error message - $error = trans('admin/consumables/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('consumables')->with('error', $error); + return view('consumables/view', compact('consumable')); } - - + return redirect()->route('consumables')->with('error', trans('admin/consumables/message.does_not_exist', compact('id'))); } /** @@ -278,23 +204,15 @@ class ConsumablesController extends Controller * @see ConsumablesController::postCheckout() method that stores the data. * @since [v1.0] * @param int $consumableId - * @return View - */ + * @return \Illuminate\Contracts\View\View + */ public function getCheckout($consumableId) { - // Check if the consumable exists if (is_null($consumable = Consumable::find($consumableId))) { - // Redirect to the consumable management page with error - return redirect()->to('consumables')->with('error', trans('admin/consumables/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($consumable)) { - return redirect()->to('admin/consumables')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.not_found')); } - - // Get the dropdown of users and then pass it to the checkout view - $users_list = Helper::usersList(); - - return View::make('consumables/checkout', compact('consumable'))->with('users_list', $users_list); - + $this->authorize('checkout', $consumable); + return view('consumables/checkout', compact('consumable'))->with('users_list', Helper::usersList()); } /** @@ -304,71 +222,35 @@ class ConsumablesController extends Controller * @see ConsumablesController::getCheckout() method that returns the form. * @since [v1.0] * @param int $consumableId - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function postCheckout($consumableId) { - // Check if the consumable exists if (is_null($consumable = Consumable::find($consumableId))) { - // Redirect to the consumable management page with error - return redirect()->to('consumables')->with('error', trans('admin/consumables/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($consumable)) { - return redirect()->to('admin/consumables')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.not_found')); } + $this->authorize('checkout', $consumable); + $admin_user = Auth::user(); $assigned_to = e(Input::get('assigned_to')); - // Check if the user exists + // Check if the user exists if (is_null($user = User::find($assigned_to))) { // Redirect to the consumable management page with error - return redirect()->to('admin/consumables')->with('error', trans('admin/consumables/message.user_does_not_exist')); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.user_does_not_exist')); } - // Update the consumable data + // Update the consumable data $consumable->assigned_to = e(Input::get('assigned_to')); - $consumable->users()->attach($consumable->id, array( - 'consumable_id' => $consumable->id, - 'user_id' => $admin_user->id, - 'assigned_to' => e(Input::get('assigned_to')))); - - $logaction = $consumable->logCheckout(e(Input::get('note'))); - - $settings = Setting::getSettings(); - - if ($settings->slack_endpoint) { - - $slack_settings = [ - 'username' => $settings->botname, - 'channel' => $settings->slack_channel, - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked Out:', - 'value' => 'Consumable <'.config('app.url').'/admin/consumables/'.$consumable->id.'/view'.'|'.$consumable->name.'> checked out to <'.config('app.url').'/admin/users/'.$user->id.'/view|'.$user->fullName().'> by <'.config('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.' - ], - [ - 'title' => 'Note:', - 'value' => e($logaction->note) - ], - ] - ])->send('Consumable Checked Out'); - - } catch (Exception $e) { - - } - } - - $consumable_user = DB::table('consumables_users')->where('assigned_to', '=', $consumable->assigned_to)->where('consumable_id', '=', $consumable->id)->first(); + $consumable->users()->attach($consumable->id, [ + 'consumable_id' => $consumable->id, + 'user_id' => $admin_user->id, + 'assigned_to' => e(Input::get('assigned_to')) + ]); + $logaction = $consumable->logCheckout(e(Input::get('note')), $user); $data['log_id'] = $logaction->id; $data['eula'] = $consumable->getEula(); $data['first_name'] = $user->first_name; @@ -377,7 +259,6 @@ class ConsumablesController extends Controller $data['note'] = $logaction->note; $data['require_acceptance'] = $consumable->requireAcceptance(); - if (($consumable->requireAcceptance()=='1') || ($consumable->getEula())) { Mail::send('emails.accept-asset', $data, function ($m) use ($user) { @@ -388,158 +269,8 @@ class ConsumablesController extends Controller } // Redirect to the new consumable page - return redirect()->to("admin/consumables")->with('success', trans('admin/consumables/message.checkout.success')); - - + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.checkout.success')); } - - /** - * Returns the JSON response containing the the consumables data. - * - * @author [A. Gianotto] [] - * @see ConsumablesController::getIndex() method that returns the view that consumes the JSON. - * @since [v1.0] - * @param int $consumableId - * @return View - */ - public function getDatatable() - { - $consumables = Company::scopeCompanyables( - Consumable::select('consumables.*') - ->whereNull('consumables.deleted_at') - ->with('company', 'location', 'category', 'users', 'manufacturer') - ); - - if (Input::has('search')) { - $consumables = $consumables->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','companyName','category','model_number', 'item_no', 'manufacturer']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - - switch ($sort) { - case 'category': - $consumables = $consumables->OrderCategory($order); - break; - case 'location': - $consumables = $consumables->OrderLocation($order); - break; - case 'manufacturer': - $consumables = $consumables->OrderManufacturer($order); - break; - case 'companyName': - $consumables = $consumables->OrderCompany($order); - break; - default: - $consumables = $consumables->orderBy($sort, $order); - break; - } - - $consumCount = $consumables->count(); - $consumables = $consumables->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($consumables as $consumable) { - $actions = ''; - if (Gate::allows('consumables.checkout')) { - $actions .= 'numRemaining() > 0) ? '' : ' disabled') . '>' . trans('general.checkout') . ''; - } - - if (Gate::allows('consumables.edit')) { - $actions .= ''; - } - if (Gate::allows('consumables.delete')) { - $actions .= ''; - } - - $actions .=''; - - $company = $consumable->company; - - $rows[] = array( - 'id' => $consumable->id, - 'name' => (string)link_to('admin/consumables/'.$consumable->id.'/view', e($consumable->name)), - 'location' => ($consumable->location) ? e($consumable->location->name) : '', - 'min_amt' => e($consumable->min_amt), - 'qty' => e($consumable->qty), - 'manufacturer' => ($consumable->manufacturer) ? (string) link_to('/admin/settings/manufacturers/'.$consumable->manufacturer_id.'/view', $consumable->manufacturer->name): '', - 'model_number' => e($consumable->model_number), - 'item_no' => e($consumable->item_no), - 'category' => ($consumable->category) ? (string) link_to('/admin/settings/categories/'.$consumable->category_id.'/view', $consumable->category->name) : 'Missing category', - 'order_number' => e($consumable->order_number), - 'purchase_date' => e($consumable->purchase_date), - 'purchase_cost' => Helper::formatCurrencyOutput($consumable->purchase_cost), - 'numRemaining' => $consumable->numRemaining(), - 'actions' => $actions, - 'companyName' => is_null($company) ? '' : e($company->name), - ); - } - - $data = array('total' => $consumCount, 'rows' => $rows); - - return $data; - - } - - /** - * Returns a JSON response containing details on the users associated with this consumable. - * - * @author [A. Gianotto] [] - * @see ConsumablesController::getView() method that returns the form. - * @since [v1.0] - * @param int $consumableId - * @return View - */ - public function getDataView($consumableId) - { - //$consumable = Consumable::find($consumableID); - $consumable = Consumable::with(array('consumableAssigments'=> - function ($query) { - $query->orderBy('created_at', 'DESC'); - }, - 'consumableAssigments.admin'=> function ($query) { - }, - 'consumableAssigments.user'=> function ($query) { - }, - ))->find($consumableId); - - // $consumable->load('consumableAssigments.admin','consumableAssigments.user'); - - if (!Company::isCurrentUserHasAccess($consumable)) { - return ['total' => 0, 'rows' => []]; - } - - $rows = array(); - - foreach ($consumable->consumableAssigments as $consumable_assignment) { - $rows[] = array( - 'name' => (string)link_to('/admin/users/'.$consumable_assignment->user->id.'/view', e($consumable_assignment->user->fullName())), - 'created_at' => ($consumable_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $consumable_assignment->created_at->format('Y-m-d H:i:s'), - 'admin' => ($consumable_assignment->admin) ? e($consumable_assignment->admin->fullName()) : '', - ); - } - - $consumableCount = $consumable->users->count(); - $data = array('total' => $consumableCount, 'rows' => $rows); - return $data; - } } diff --git a/app/Http/Controllers/CustomFieldsController.php b/app/Http/Controllers/CustomFieldsController.php index 19099beccf..bb2f4fa0cd 100644 --- a/app/Http/Controllers/CustomFieldsController.php +++ b/app/Http/Controllers/CustomFieldsController.php @@ -11,6 +11,7 @@ use App\Models\AssetModel; use Lang; use Auth; use Illuminate\Http\Request; +use App\Helpers\Helper; use Log; /** @@ -35,77 +36,15 @@ class CustomFieldsController extends Controller */ public function index() { - // - $fieldsets=CustomFieldset::with("fields", "models")->get(); - //$fieldsets=CustomFieldset::all(); - $fields=CustomField::with("fieldset")->get(); - //$fields=CustomField::all(); - return View::make("custom_fields.index")->with("custom_fieldsets", $fieldsets)->with("custom_fields", $fields); + + $fieldsets = CustomFieldset::with("fields", "models")->get(); + $fields = CustomField::with("fieldset")->get(); + return view("custom_fields.index")->with("custom_fieldsets", $fieldsets)->with("custom_fields", $fields); } - /** - * Returns a view with a form for creating a new custom fieldset. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return View - */ - public function create() - { - // - return View::make("custom_fields.create"); - } - /** - * Validates and stores a new custom fieldset. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return Redirect - */ - public function store(Request $request) - { - // - $cfset = new CustomFieldset( - [ - "name" => e($request->get("name")), - "user_id" => Auth::user()->id] - ); - - $validator=Validator::make(Input::all(), $cfset->rules); - if ($validator->passes()) { - $cfset->save(); - return redirect()->route("admin.custom_fields.show", [$cfset->id])->with('success', trans('admin/custom_fields/message.fieldset.create.success')); - } else { - return redirect()->back()->withInput()->withErrors($validator); - } - } - - /** - * Associate the custom field with a custom fieldset. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return View - */ - public function associate($id) - { - - $set = CustomFieldset::find($id); - - foreach ($set->fields as $field) { - if ($field->id == Input::get('field_id')) { - return redirect()->route("admin.custom_fields.show", [$id])->withInput()->withErrors(['field_id' => trans('admin/custom_fields/message.field.already_added')]); - } - } - - $results=$set->fields()->attach(Input::get('field_id'), ["required" => (Input::get('required') == "on"),"order" => Input::get('order')]); - - return redirect()->route("admin.custom_fields.show", [$id])->with("success", trans('admin/custom_fields/message.field.create.assoc_success')); - } - /** * Returns a view with a form to create a new custom field. @@ -115,9 +54,10 @@ class CustomFieldsController extends Controller * @since [v1.8] * @return View */ - public function createField() + public function create() { - return View::make("custom_fields.create_field"); + + return view("custom_fields.fields.edit")->with('field', new CustomField()); } @@ -129,13 +69,14 @@ class CustomFieldsController extends Controller * @since [v1.8] * @return Redirect */ - public function storeField(Request $request) + public function store(Request $request) { $field = new CustomField([ - "name" => e($request->get("name")), - "element" => e($request->get("element")), - "field_values" => e($request->get("field_values")), - "field_encrypted" => e($request->get("field_encrypted", 0)), + "name" => $request->get("name"), + "element" => $request->get("element"), + "help_text" => $request->get("help_text"), + "field_values" => $request->get("field_values"), + "field_encrypted" => $request->get("field_encrypted", 0), "user_id" => Auth::user()->id ]); @@ -148,12 +89,12 @@ class CustomFieldsController extends Controller } + $validator = Validator::make(Input::all(), $field->rules); - $validator=Validator::make(Input::all(), $field->rules); if ($validator->passes()) { $results = $field->save(); if ($results) { - return redirect()->route("admin.custom_fields.index")->with("success", trans('admin/custom_fields/message.field.create.success')); + return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.create.success')); } else { dd($field); return redirect()->back()->withInput()->with('error', trans('admin/custom_fields/message.field.create.error')); @@ -176,7 +117,7 @@ class CustomFieldsController extends Controller $field = CustomField::find($field_id); if ($field->fieldset()->detach($fieldset_id)) { - return redirect()->route("admin.custom_fields.index")->with("success", trans('admin/custom_fields/message.field.delete.success')); + return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id])->with("success", trans('admin/custom_fields/message.field.delete.success')); } return redirect()->back()->withErrors(['message' => "Field is in-use"]); @@ -189,7 +130,7 @@ class CustomFieldsController extends Controller * @since [v1.8] * @return Redirect */ - public function deleteField($field_id) + public function destroy($field_id) { $field = CustomField::find($field_id); @@ -197,115 +138,63 @@ class CustomFieldsController extends Controller return redirect()->back()->withErrors(['message' => "Field is in-use"]); } else { $field->delete(); - return redirect()->route("admin.custom_fields.index")->with("success", trans('admin/custom_fields/message.field.delete.success')); + return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.delete.success')); } } - /** - * Validates and stores a new custom field. - * - * @author [Brady Wetherington] [] - * @param int $id - * @since [v1.8] - * @return View - */ - public function show($id) - { - $cfset = CustomFieldset::with('fields')->where('id','=',$id)->orderBy('id','ASC')->first(); - $custom_fields_list = ["" => "Add New Field to Fieldset"] + CustomField::lists("name", "id")->toArray(); - - $maxid = 0; - foreach ($cfset->fields() as $field) { - if ($field->pivot->order > $maxid) { - $maxid=$field->pivot->order; - } - if (isset($custom_fields_list[$field->id])) { - unset($custom_fields_list[$field->id]); - } - } - - return View::make("custom_fields.show")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list); - } /** - * What the actual fuck, Brady? + * Return a view to edit a custom field * - * @todo Uhh, build this? - * @author [Brady Wetherington] [] + * @author [A. Gianotto] [] * @param int $id - * @since [v1.8] - * @return Fuckall + * @since [v4.0] + * @return View */ public function edit($id) { - // + $field = CustomField::find($id); + return view("custom_fields.fields.edit")->with('field', $field); } /** - * GET IN THE SEA BRADY. + * Store the updated field * - * @todo Uhh, build this too? - * @author [Brady Wetherington] [] - * @param int $id - * @since [v1.8] - * @return Fuckall - */ - public function update($id) - { - // - } - - - /** - * Validates a custom fieldset and then deletes if it has no models associated. + * @todo Allow encrypting/decrypting if encryption status changes * - * @author [Brady Wetherington] [] + * @author [A. Gianotto] [] * @param int $id - * @since [v1.8] - * @return View + * @since [v4.0] + * @return Redirect */ - public function destroy($id) + public function update(Request $request, $id) { - // - $fieldset = CustomFieldset::find($id); + $field = CustomField::find($id); - $models = AssetModel::where("fieldset_id", "=", $id); - if ($models->count() == 0) { - $fieldset->delete(); - return redirect()->route("admin.custom_fields.index")->with("success", trans('admin/custom_fields/message.fieldset.delete.success')); + $field->name = e($request->get("name")); + $field->element = e($request->get("element")); + $field->field_values = e($request->get("field_values")); + $field->field_encrypted = e($request->get("field_encrypted", 0)); + $field->user_id = Auth::user()->id; + $field->help_text = $request->get("help_text"); + + if (!in_array(Input::get('format'), array_keys(CustomField::$PredefinedFormats))) { + $field->format = e($request->get("custom_format")); } else { - return redirect()->route("admin.custom_fields.index")->with("error", trans('admin/custom_fields/message.fieldset.delete.in_use')); + $field->format = e($request->get("format")); } + + $validator = Validator::make(Input::all(), $field->rules); + + if ($field->save()) { + return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.update.success')); + } + + return redirect()->back()->withInput()->withErrors($validator); } - /** - * Reorder the custom fields within a fieldset - * - * @author [Brady Wetherington] [] - * @param int $id - * @since [v3.0] - * @return Array - */ - public function postReorder(Request $request, $id) - { - $fieldset = CustomFieldset::find($id); - $fields = array(); - $order_array = array(); - $items = $request->input('item'); - - foreach ($items as $order => $field_id) { - $order_array[$field_id] = $order; - } - - foreach ($fieldset->fields as $field) { - $fields[$field->id] = ['required' => $field->pivot->required, 'order' => $order_array[$field->id]]; - } - - return $fieldset->fields()->sync($fields); - - } } diff --git a/app/Http/Controllers/CustomFieldsetsController.php b/app/Http/Controllers/CustomFieldsetsController.php new file mode 100644 index 0000000000..9ff80e5e1e --- /dev/null +++ b/app/Http/Controllers/CustomFieldsetsController.php @@ -0,0 +1,171 @@ +] + */ + +class CustomFieldsetsController extends Controller +{ + + /** + * Validates and stores a new custom field. + * + * @author [Brady Wetherington] [] + * @param int $id + * @since [v1.8] + * @return View + */ + public function show($id) + { + $cfset = CustomFieldset::with('fields')->where('id', '=', $id)->orderBy('id', 'ASC')->first(); + $custom_fields_list = ["" => "Add New Field to Fieldset"] + CustomField::pluck("name", "id")->toArray(); + + $maxid = 0; + foreach ($cfset->fields() as $field) { + if ($field->pivot->order > $maxid) { + $maxid=$field->pivot->order; + } + if (isset($custom_fields_list[$field->id])) { + unset($custom_fields_list[$field->id]); + } + } + + return view("custom_fields.fieldsets.view")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list); + } + + + /** + * Returns a view with a form for creating a new custom fieldset. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return View + */ + public function create() + { + return view("custom_fields.fieldsets.edit"); + } + + + /** + * Validates and stores a new custom fieldset. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return Redirect + */ + public function store(Request $request) + { + $cfset = new CustomFieldset( + [ + "name" => e($request->get("name")), + "user_id" => Auth::user()->id] + ); + + $validator = Validator::make(Input::all(), $cfset->rules); + if ($validator->passes()) { + $cfset->save(); + return redirect()->route("fieldsets.show", [$cfset->id])->with('success', trans('admin/custom_fields/message.fieldset.create.success')); + } else { + return redirect()->back()->withInput()->withErrors($validator); + } + } + + + + + /** + * What the actual fuck, Brady? + * + * @todo Uhh, build this? + * @author [Brady Wetherington] [] + * @param int $id + * @since [v1.8] + * @return Fuckall + */ + public function edit($id) + { + // + } + + + /** + * GET IN THE SEA BRADY. + * + * @todo Uhh, build this too? + * @author [Brady Wetherington] [] + * @param int $id + * @since [v1.8] + * @return Fuckall + */ + public function update($id) + { + // + } + + + /** + * Validates a custom fieldset and then deletes if it has no models associated. + * + * @author [Brady Wetherington] [] + * @param int $id + * @since [v1.8] + * @return View + */ + public function destroy($id) + { + // + $fieldset = CustomFieldset::find($id); + + $models = AssetModel::where("fieldset_id", "=", $id); + if ($models->count() == 0) { + $fieldset->delete(); + return redirect()->route("fields.show")->with("success", trans('admin/custom_fields/message.fieldset.delete.success')); + } else { + return redirect()->route("fields.show")->with("error", trans('admin/custom_fields/message.fieldset.delete.in_use')); + } + } + + + /** + * Associate the custom field with a custom fieldset. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return View + */ + public function associate($id) + { + + $set = CustomFieldset::find($id); + + foreach ($set->fields as $field) { + if ($field->id == Input::get('field_id')) { + return redirect()->route("fieldsets.show", [$id])->withInput()->withErrors(['field_id' => trans('admin/custom_fields/message.field.already_added')]); + } + } + + $results=$set->fields()->attach(Input::get('field_id'), ["required" => (Input::get('required') == "on"),"order" => Input::get('order')]); + + return redirect()->route("fieldsets.show", [$id])->with("success", trans('admin/custom_fields/message.field.create.assoc_success')); + } +} diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index b2859b70b4..fcf63bf5f4 100755 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -30,53 +30,20 @@ class DashboardController extends Controller // Show the page if (Auth::user()->hasAccess('admin')) { - $asset_stats['total'] = Asset::Hardware()->count(); + $asset_stats=null; - $asset_stats['rtd']['total'] = Asset::Hardware()->RTD()->count(); + $counts['asset'] = \App\Models\Asset::count(); + $counts['accessory'] = \App\Models\Accessory::count(); + $counts['license'] = \App\Models\License::assetcount(); + $counts['consumable'] = \App\Models\Consumable::count(); + $counts['grand_total'] = $counts['asset'] + $counts['accessory'] + $counts['license'] + $counts['consumable']; - if ($asset_stats['rtd']['total'] > 0) { - $asset_stats['rtd']['percent'] = round(($asset_stats['rtd']['total']/$asset_stats['total']) * 100); - } else { - $asset_stats['rtd']['percent'] = 0; + if ((!file_exists(storage_path().'/oauth-private.key')) || (!file_exists(storage_path().'/oauth-public.key'))) { + \Artisan::call('passport:install'); + \Artisan::call('migrate', ['--force' => true]); } - - $asset_stats['pending']['total'] = Asset::Hardware()->Pending()->count(); - - if ($asset_stats['pending']['total'] > 0) { - $asset_stats['pending']['percent'] = round(($asset_stats['pending']['total']/$asset_stats['total']) * 100); - } else { - $asset_stats['pending']['percent'] = 0; - } - - - $asset_stats['deployed']['total'] = Asset::Hardware()->Deployed()->count(); - - if ($asset_stats['deployed']['total'] > 0) { - $asset_stats['deployed']['percent'] = round(($asset_stats['deployed']['total']/$asset_stats['total']) * 100); - } else { - $asset_stats['deployed']['percent'] = 0; - } - - - $asset_stats['undeployable']['total'] = Asset::Hardware()->Undeployable()->count(); - - if ($asset_stats['undeployable']['total'] > 0) { - $asset_stats['undeployable']['percent'] = round(($asset_stats['undeployable']['total']/$asset_stats['total']) * 100); - } else { - $asset_stats['undeployable']['percent'] = 0; - } - - $asset_stats['archived']['total'] = Asset::Hardware()->Archived()->count(); - - if ($asset_stats['archived']['total'] > 0) { - $asset_stats['archived']['percent'] = round(($asset_stats['archived']['total']/$asset_stats['total']) * 100); - } else { - $asset_stats['archived']['percent'] = 0; - } - - - return View::make('dashboard')->with('asset_stats', $asset_stats); + return view('dashboard')->with('asset_stats', $asset_stats)->with('counts', $counts); } else { // Redirect to the profile page return redirect()->intended('account/view-assets'); diff --git a/app/Http/Controllers/DepartmentsController.php b/app/Http/Controllers/DepartmentsController.php new file mode 100644 index 0000000000..d5050e8286 --- /dev/null +++ b/app/Http/Controllers/DepartmentsController.php @@ -0,0 +1,164 @@ +middleware('auth'); + parent::__construct(); + } + + /** + * Returns a view that invokes the ajax tables which actually contains + * the content for the assets listing, which is generated in getDatatable. + * + * @author [A. Gianotto] [] + * @see AssetController::getDatatable() method that generates the JSON response + * @since [v4.0] + * @return View + */ + public function index(Request $request) + { + $this->authorize('index', Department::class); + if ($request->has('company_id')) { + $company = Company::find($request->input('company_id')); + } else { + $company = null; + } + return view('departments/index')->with('company',$company); + + } + + + /** + * Store a newly created resource in storage. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', Department::class); + $department = new Department; + $department->fill($request->all()); + $department->user_id = Auth::user()->id; + $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); + + + if ($department->save()) { + return redirect()->route("departments.index")->with('success', trans('admin/departments/message.create.success')); + } + return redirect()->back()->withInput()->withErrors($department->getErrors()); + + } + + /** + * Returns a view that invokes the ajax tables which actually contains + * the content for the department detail page. + * + * @author [A. Gianotto] [] + * @param int $id + * @since [v4.0] + * @return \Illuminate\Contracts\View\View + */ + public function show($id) + { + $department = Department::find($id); + + if (isset($department->id)) { + return view('departments/view', compact('department')); + } + return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist', compact('id'))); + } + + + /** + * Returns a form view used to create a new department. + * + * @author [A. Gianotto] [] + * @see DepartmentsController::postCreate() method that validates and stores the data + * @since [v4.0] + * @return \Illuminate\Contracts\View\View + */ + public function create() + { + return view('departments/edit')->with('item', new Department) + ->with('manager_list', Helper::managerList()) + ->with('location_list', Helper::locationsList()) + ->with('company_list', Helper::companyList()); + } + + + /** + * Validates and deletes selected department. + * + * @author [A. Gianotto] [] + * @param int $locationId + * @since [v4.0] + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($id) + { + if (is_null($department = Department::find($id))) { + return redirect()->to(route('departments.index'))->with('error', trans('admin/departments/message.not_found')); + } + + if ($department->users->count() > 0) { + return redirect()->to(route('departments.index'))->with('error', trans('admin/departments/message.assoc_users')); + } + + $department->delete(); + return redirect()->back()->with('success', trans('admin/departments/message.delete.success')); + + } + + /** + * Makes a form view to edit location information. + * + * @author [A. Gianotto] [] + * @see LocationsController::postCreate() method that validates and stores + * @param int $locationId + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + */ + public function edit($id = null) + { + if (is_null($item = Department::find($id))) { + return redirect()->back()->with('error', trans('admin/locations/message.does_not_exist')); + } + return view('departments/edit', compact('item')) + ->with('manager_list', Helper::managerList()) + ->with('location_list', Helper::locationsList()) + ->with('company_list', Helper::companyList()); + } + + + public function update(Request $request, $id) { + + $this->authorize('create', Department::class); + if (is_null($department = Department::find($id))) { + return redirect()->to('admin/settings/departments')->with('error', trans('admin/departments/message.does_not_exist')); + } + + + $department->fill($request->all()); + $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); + + if ($department->save()) { + return redirect()->route("departments.index")->with('success', trans('admin/departments/message.update.success')); + } + + return redirect()->back()->withInput()->withErrors($department->getErrors()); + } + + +} diff --git a/app/Http/Controllers/DepreciationsController.php b/app/Http/Controllers/DepreciationsController.php index f3fba5495e..e4af313148 100755 --- a/app/Http/Controllers/DepreciationsController.php +++ b/app/Http/Controllers/DepreciationsController.php @@ -1,7 +1,7 @@ with('item', new Depreciation); + return view('depreciations/edit')->with('item', new Depreciation); } /** - * Validates and stores the new depreciation data. - * - * @author [A. Gianotto] [name = $request->input('name'); + $depreciation->months = $request->input('months'); + $depreciation->user_id = Auth::id(); - // Depreciation data - $depreciation->name = e(Input::get('name')); - $depreciation->months = e(Input::get('months')); - $depreciation->user_id = Auth::user()->id; - - // Was the asset created? + // Was the asset created? if ($depreciation->save()) { // Redirect to the new depreciation page - return redirect()->to("admin/settings/depreciations")->with('success', trans('admin/depreciations/message.create.success')); + return redirect()->route('depreciations.index')->with('success', trans('admin/depreciations/message.create.success')); } - return redirect()->back()->withInput()->withErrors($depreciation->getErrors()); - } /** @@ -89,138 +84,76 @@ class DepreciationsController extends Controller * @see DepreciationsController::postEdit() * @param int $depreciationId * @since [v1.0] - * @return View - */ - public function getEdit($depreciationId = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($depreciationId = null) { // Check if the depreciation exists if (is_null($item = Depreciation::find($depreciationId))) { // Redirect to the blogs management page - return redirect()->to('admin/settings/depreciations')->with('error', trans('admin/depreciations/message.does_not_exist')); + return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist')); } - return View::make('depreciations/edit', compact('item')); + return view('depreciations/edit', compact('item')); } /** - * Validates and stores the updated depreciation data. - * - * @author [A. Gianotto] [to('admin/settings/depreciations')->with('error', trans('admin/depreciations/message.does_not_exist')); + return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist')); } // Depreciation data - $depreciation->name = e(Input::get('name')); - $depreciation->months = e(Input::get('months')); + $depreciation->name = $request->input('name'); + $depreciation->months = $request->input('months'); // Was the asset created? if ($depreciation->save()) { // Redirect to the depreciation page - return redirect()->to("admin/settings/depreciations/")->with('success', trans('admin/depreciations/message.update.success')); + return redirect()->route("depreciations.index")->with('success', trans('admin/depreciations/message.update.success')); } - return redirect()->back()->withInput()->withErrors($depreciation->getErrors()); - - } /** - * Validates and deletes a selected depreciation. - * - * This is a hard-delete. We do not currently soft-delete depreciations. - * - * @author [A. Gianotto] [to('admin/settings/depreciations')->with('error', trans('admin/depreciations/message.not_found')); + return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.not_found')); } if ($depreciation->has_models() > 0) { - // Redirect to the asset management page - return redirect()->to('admin/settings/depreciations')->with('error', trans('admin/depreciations/message.assoc_users')); - } else { - - $depreciation->delete(); - - // Redirect to the depreciations management page - return redirect()->to('admin/settings/depreciations')->with('success', trans('admin/depreciations/message.delete.success')); + return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.assoc_users')); } + $depreciation->delete(); + // Redirect to the depreciations management page + return redirect()->route('depreciations.index')->with('success', trans('admin/depreciations/message.delete.success')); } - /** - * Generates the JSON used to display the depreciation listing. - * - * @see DepreciationsController::getIndex() - * @author [A. Gianotto] [] - * @param string $status - * @since [v1.2] - * @return String JSON - */ - public function getDatatable() - { - $depreciations = Depreciation::select(array('id','name','months')); - - if (Input::has('search')) { - $depreciations = $depreciations->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $allowed_columns = ['id','name','months']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - - $depreciations->orderBy($sort, $order); - - $depreciationsCount = $depreciations->count(); - $depreciations = $depreciations->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($depreciations as $depreciation) { - $actions = ''; - - $rows[] = array( - 'id' => $depreciation->id, - 'name' => e($depreciation->name), - 'months' => e($depreciation->months), - 'actions' => $actions - ); - } - - $data = array('total' => $depreciationsCount, 'rows' => $rows); - - return $data; - - } } diff --git a/app/Http/Controllers/GroupsController.php b/app/Http/Controllers/GroupsController.php index 39ed99b3d8..c2519fcc6c 100755 --- a/app/Http/Controllers/GroupsController.php +++ b/app/Http/Controllers/GroupsController.php @@ -26,12 +26,12 @@ class GroupsController extends Controller * @author [A. Gianotto] [with('group', $group); + return view('groups/edit', compact('permissions', 'selectedPermissions', 'groupPermissions'))->with('group', $group); } /** @@ -60,9 +60,9 @@ class GroupsController extends Controller * @author [A. Gianotto] [permissions = json_encode(Input::get('permission')); if ($group->save()) { - return redirect()->to("admin/groups")->with('success', trans('admin/groups/message.success.create')); + return redirect()->route("groups.index")->with('success', trans('admin/groups/message.success.create')); } - - return redirect()->back()->withInput()->withErrors($group->getErrors()); - - + return redirect(route('groups.create'))->withInput()->withErrors($group->getErrors()); } /** @@ -85,15 +82,15 @@ class GroupsController extends Controller * @see GroupsController::postEdit() * @param int $id * @since [v1.0] - * @return View - */ - public function getEdit($id = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($id = null) { $group = Group::find($id); $permissions = config('permissions'); $groupPermissions = $group->decodePermissions(); $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); - return View::make('groups/edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); + return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); } /** @@ -103,28 +100,24 @@ class GroupsController extends Controller * @see GroupsController::getEdit() * @param int $id * @since [v1.0] - * @return Redirect - */ - public function postEdit($id = null) + * @return \Illuminate\Http\RedirectResponse + */ + public function update($id = null) { $permissions = config('permissions'); if (!$group = Group::find($id)) { return redirect()->route('groups')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); - } $group->name = e(Input::get('name')); $group->permissions = json_encode(Input::get('permission')); - - if (config('app.lock_passwords')) { - return redirect()->route('update/group', $id)->withInput()->with('error', 'Denied! Editing groups is not allowed in the demo.'); + if (!config('app.lock_passwords')) { + if ($group->save()) { + return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.update')); + } + return redirect()->back()->withInput()->withErrors($group->getErrors()); } - if ($group->save()) { - return redirect()->to("admin/groups")->with('success', trans('admin/groups/message.success.update')); - } - return redirect()->back()->withInput()->withErrors($group->getErrors()); - - + return redirect()->route('groups.index')->with('error', trans('general.feature_disabled')); } /** @@ -134,103 +127,19 @@ class GroupsController extends Controller * @see GroupsController::getEdit() * @param int $id * @since [v1.0] - * @return Redirect - */ - public function getDelete($id = null) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($id = null) { if (!config('app.lock_passwords')) { - try { - // Get group information - $group = Group::find($id); - $group->delete(); - - // Redirect to the group management page - return redirect()->route('groups')->with('success', trans('admin/groups/message.success.delete')); - } catch (GroupNotFoundException $e) { - // Redirect to the group management page + if (!$group = Group::find($id)) { return redirect()->route('groups')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); } - } else { - return redirect()->route('groups')->with('error', trans('general.feature_disabled')); + $group->delete(); + // Redirect to the group management page + return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.delete')); } + return redirect()->route('groups.index')->with('error', trans('general.feature_disabled')); } - - /** - * Generates the JSON used to display the User Group listing. - * - * @author [A. Gianotto] [] - * @since [v2.0] - * @return String JSON - */ - public function getDatatable() - { - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - if (Input::get('sort')=='name') { - $sort = 'first_name'; - } else { - $sort = e(Input::get('sort')); - } - - // Grab all the groups - $groups = Group::with('users')->orderBy('name', 'ASC'); - //$users = Company::scopeCompanyables($users); - - if (Input::has('search')) { - $groups = $users->TextSearch(e(Input::get('search'))); - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - - $allowed_columns = - [ - 'name','created_at' - ]; - - $sort = in_array($sort, $allowed_columns) ? $sort : 'name'; - $groups = $groups->orderBy($sort, $order); - - $groupsCount = $groups->count(); - $groups = $groups->skip($offset)->take($limit)->get(); - $rows = array(); - - foreach ($groups as $group) { - $group_names = ''; - $inout = ''; - $actions = ''; - - $actions .= ' '; - - if (!config('app.lock_passwords')) { - $actions .= ' '; - } else { - $actions .= ' '; - } - - $actions .= ''; - - $rows[] = array( - 'id' => $group->id, - 'name' => $group->name, - 'users' => $group->users->count(), - 'created_at' => $group->created_at->format('Y-m-d'), - 'actions' => ($actions) ? $actions : '', - ); - } - - $data = array('total'=>$groupsCount, 'rows'=>$rows); - return $data; - } } diff --git a/app/Http/Controllers/ImportsController.php b/app/Http/Controllers/ImportsController.php new file mode 100644 index 0000000000..705e9c9dcf --- /dev/null +++ b/app/Http/Controllers/ImportsController.php @@ -0,0 +1,18 @@ +authorize('create', Asset::class); + $imports = Import::latest()->get(); + $imports = (new ImportsTransformer)->transformImports($imports); + return view('importer/import')->with('imports', $imports); + } +} diff --git a/app/Http/Controllers/LicensesController.php b/app/Http/Controllers/LicensesController.php index 4e5bb67926..2f14a72829 100755 --- a/app/Http/Controllers/LicensesController.php +++ b/app/Http/Controllers/LicensesController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; use Assets; +use Illuminate\Support\Facades\Session; use Input; use Lang; use App\Models\License; @@ -9,21 +10,17 @@ use App\Models\Asset; use App\Models\User; use App\Models\Actionlog; use DB; -use Redirect; use App\Models\LicenseSeat; -use App\Models\Depreciation; use App\Models\Company; -use App\Models\Setting; -use App\Models\Supplier; use Validator; use View; use Response; use Slack; use Config; -use Session; use App\Helpers\Helper; use Auth; use Gate; +use Illuminate\Http\Request; /** * This controller handles all actions related to Licenses for @@ -41,12 +38,12 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @see LicensesController::getDatatable() method that generates the JSON response * @since [v1.0] - * @return View - */ - public function getIndex() + * @return \Illuminate\Contracts\View\View + */ + public function index() { - // Show the page - return View::make('licenses/index'); + $this->authorize('view', License::class); + return view('licenses/index'); } @@ -56,14 +53,18 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @see AccessoriesController::getDatatable() method that generates the JSON response * @since [v1.0] - * @return View - */ - public function getCreate() + * @return \Illuminate\Contracts\View\View + */ + public function create() { + $this->authorize('create', License::class); + $maintained_list = [ + '' => 'Maintained', + '1' => 'Yes', + '0' => 'No' + ]; - $maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No'); - - return View::make('licenses/edit') + return view('licenses/edit') //->with('license_options',$license_options) ->with('depreciation_list', Helper::depreciationList()) ->with('supplier_list', Helper::suppliersList()) @@ -76,107 +77,46 @@ class LicensesController extends Controller /** - * Validates and stores the license form data submitted from the new - * license form. - * - * @author [A. Gianotto] [] - * @see LicensesController::getCreate() method that provides the form view - * @since [v1.0] - * @return Redirect - */ - public function postCreate() + * Validates and stores the license form data submitted from the new + * license form. + * + * @author [A. Gianotto] [] + * @see LicensesController::getCreate() method that provides the form view + * @since [v1.0] + * @param Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) { - + $this->authorize('create', License::class); // create a new model instance $license = new License(); - - if (e(Input::get('purchase_cost')) == '') { - $license->purchase_cost = null; - } else { - $license->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - if (e(Input::get('supplier_id')) == '') { - $license->supplier_id = null; - } else { - $license->supplier_id = e(Input::get('supplier_id')); - } - - if (e(Input::get('maintained')) == '') { - $license->maintained = 0; - } else { - $license->maintained = e(Input::get('maintained')); - } - - if (e(Input::get('reassignable')) == '') { - $license->reassignable = 0; - } else { - $license->reassignable = e(Input::get('reassignable')); - } - - if (e(Input::get('purchase_order')) == '') { - $license->purchase_order = ''; - } else { - $license->purchase_order = e(Input::get('purchase_order')); - } - - if (empty(e(Input::get('manufacturer_id')))) { - $license->manufacturer_id = null; - } else { - $license->manufacturer_id = e(Input::get('manufacturer_id')); - } - // Save the license data - $license->name = e(Input::get('name')); - $license->serial = e(Input::get('serial')); - $license->license_email = e(Input::get('license_email')); - $license->license_name = e(Input::get('license_name')); - $license->notes = e(Input::get('notes')); - $license->order_number = e(Input::get('order_number')); - $license->seats = e(Input::get('seats')); - $license->purchase_date = e(Input::get('purchase_date')); - $license->purchase_order = e(Input::get('purchase_order')); - $license->depreciation_id = e(Input::get('depreciation_id')); - $license->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $license->expiration_date = e(Input::get('expiration_date')); - $license->termination_date = e(Input::get('termination_date')); - $license->user_id = Auth::user()->id; + $license->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $license->depreciation_id = $request->input('depreciation_id'); + $license->expiration_date = $request->input('expiration_date'); + $license->license_email = $request->input('license_email'); + $license->license_name = $request->input('license_name'); + $license->maintained = $request->input('maintained', 0); + $license->manufacturer_id = $request->input('manufacturer_id'); + $license->name = $request->input('name'); + $license->notes = $request->input('notes'); + $license->order_number = $request->input('order_number'); + $license->purchase_cost = $request->input('purchase_cost'); + $license->purchase_date = $request->input('purchase_date'); + $license->purchase_order = $request->input('purchase_order'); + $license->purchase_order = $request->input('purchase_order'); + $license->reassignable = $request->input('reassignable', 0); + $license->seats = $request->input('seats'); + $license->serial = $request->input('serial'); + $license->supplier_id = $request->input('supplier_id'); + $license->termination_date = $request->input('termination_date'); + $license->user_id = Auth::id(); - if (($license->purchase_date == "") || ($license->purchase_date == "0000-00-00")) { - $license->purchase_date = null; - } - - if (($license->expiration_date == "") || ($license->expiration_date == "0000-00-00")) { - $license->expiration_date = null; - } - - if (($license->purchase_cost == "") || ($license->purchase_cost == "0.00")) { - $license->purchase_cost = null; - } - - // Was the license created? if ($license->save()) { - $license->logCreate(); - $insertedId = $license->id; - // Save the license seat data - DB::transaction(function () use (&$insertedId, &$license) { - for ($x=0; $x<$license->seats; $x++) { - $license_seat = new LicenseSeat(); - $license_seat->license_id = $insertedId; - $license_seat->user_id = Auth::user()->id; - $license_seat->assigned_to = null; - $license_seat->notes = null; - $license_seat->save(); - } - }); - - - // Redirect to the new license page - return redirect()->to("admin/licenses")->with('success', trans('admin/licenses/message.create.success')); + return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.create.success')); } - return redirect()->back()->withInput()->withErrors($license->getErrors()); - } /** @@ -186,32 +126,23 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $licenseId - * @return View - */ - public function getEdit($licenseId = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($licenseId = null) { - // Check if the license exists if (is_null($item = License::find($licenseId))) { - // Redirect to the blogs management page - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($item)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); } - if ($item->purchase_date == "0000-00-00") { - $item->purchase_date = null; - } + $this->authorize('update', $item); - if ($item->purchase_cost == "0.00") { - $item->purchase_cost = null; - } + $maintained_list = [ + '' => 'Maintained', + '1' => 'Yes', + '0' => 'No' + ]; - // Show the page - $license_options = array('' => 'Top Level') + DB::table('assets')->where('id', '!=', $licenseId)->pluck('name', 'id'); - $maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No'); - - return View::make('licenses/edit', compact('item')) - ->with('license_options', $license_options) + return view('licenses/edit', compact('item')) ->with('depreciation_list', Helper::depreciationList()) ->with('supplier_list', Helper::suppliersList()) ->with('company_list', Helper::companyList()) @@ -221,160 +152,47 @@ class LicensesController extends Controller /** - * Validates and stores the license form data submitted from the edit - * license form. - * - * @author [A. Gianotto] [] - * @see LicensesController::getEdit() method that provides the form view - * @since [v1.0] - * @param int $licenseId - * @return Redirect - */ - public function postEdit($licenseId = null) + * Validates and stores the license form data submitted from the edit + * license form. + * + * @author [A. Gianotto] [] + * @see LicensesController::getEdit() method that provides the form view + * @since [v1.0] + * @param Request $request + * @param int $licenseId + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $licenseId = null) { - // Check if the license exists if (is_null($license = License::find($licenseId))) { - // Redirect to the blogs management page - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); } - // Update the license data - $license->name = e(Input::get('name')); - $license->serial = e(Input::get('serial')); - $license->license_email = e(Input::get('license_email')); - $license->license_name = e(Input::get('license_name')); - $license->notes = e(Input::get('notes')); - $license->order_number = e(Input::get('order_number')); - $license->depreciation_id = e(Input::get('depreciation_id')); - $license->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $license->purchase_order = e(Input::get('purchase_order')); - $license->maintained = e(Input::get('maintained')); - $license->reassignable = e(Input::get('reassignable')); + $this->authorize('update', $license); - if (empty(e(Input::get('manufacturer_id')))) { - $license->manufacturer_id = null; - } else { - $license->manufacturer_id = e(Input::get('manufacturer_id')); - } + $license->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $license->depreciation_id = $request->input('depreciation_id'); + $license->expiration_date = $request->input('expiration_date'); + $license->license_email = $request->input('license_email'); + $license->license_name = $request->input('license_name'); + $license->maintained = $request->input('maintained',0); + $license->name = $request->input('name'); + $license->notes = $request->input('notes'); + $license->order_number = $request->input('order_number'); + $license->purchase_cost = $request->input('purchase_cost'); + $license->purchase_date = $request->input('purchase_date'); + $license->purchase_order = $request->input('purchase_order'); + $license->reassignable = $request->input('reassignable', 0); + $license->serial = $request->input('serial'); + $license->termination_date = $request->input('termination_date'); + $license->seats = e($request->input('seats')); + $license->manufacturer_id = $request->input('manufacturer_id'); - - if (e(Input::get('supplier_id')) == '') { - $license->supplier_id = null; - } else { - $license->supplier_id = e(Input::get('supplier_id')); - } - - // Update the asset data - if (e(Input::get('purchase_date')) == '') { - $license->purchase_date = null; - } else { - $license->purchase_date = e(Input::get('purchase_date')); - } - - if (e(Input::get('expiration_date')) == '') { - $license->expiration_date = null; - } else { - $license->expiration_date = e(Input::get('expiration_date')); - } - - if (e(Input::get('termination_date')) == '') { - $license->termination_date = null; - } else { - $license->termination_date = e(Input::get('termination_date')); - } - - if (e(Input::get('purchase_cost')) == '') { - $license->purchase_cost = null; - } else { - $license->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); - } - - if (e(Input::get('maintained')) == '') { - $license->maintained = 0; - } else { - $license->maintained = e(Input::get('maintained')); - } - - if (e(Input::get('reassignable')) == '') { - $license->reassignable = 0; - } else { - $license->reassignable = e(Input::get('reassignable')); - } - - if (e(Input::get('purchase_order')) == '') { - $license->purchase_order = ''; - } else { - $license->purchase_order = e(Input::get('purchase_order')); - } - - //Are we changing the total number of seats? - if ($license->seats != e(Input::get('seats'))) { - //Determine how many seats we are dealing with - $difference = e(Input::get('seats')) - $license->licenseseats()->count(); - - if ($difference < 0) { - //Filter out any license which have a user attached; - $seats = $license->licenseseats->filter(function ($seat) { - return is_null($seat->user); - }); - - - //If the remaining collection is as large or larger than the number of seats we want to delete - if ($seats->count() >= abs($difference)) { - for ($i=1; $i <= abs($difference); $i++) { - //Delete the appropriate number of seats - $seats->pop()->delete(); - } - - //Log the deletion of seats to the log - $logaction = new Actionlog(); - $logaction->item_type = License::class; - $logaction->item_id = $license->id; - $logaction->user_id = Auth::user()->id; - $logaction->note = '-'.abs($difference)." seats"; - $logaction->target_id = null; - $log = $logaction->logaction('delete seats'); - - } else { - // Redirect to the license edit page - return redirect()->to("admin/licenses/$licenseId/edit")->with('error', trans('admin/licenses/message.assoc_users')); - } - } else { - - for ($i=1; $i <= $difference; $i++) { - //Create a seat for this license - $license_seat = new LicenseSeat(); - $license_seat->license_id = $license->id; - $license_seat->user_id = Auth::user()->id; - $license_seat->assigned_to = null; - $license_seat->notes = null; - $license_seat->save(); - } - - //Log the addition of license to the log. - $logaction = new Actionlog(); - $logaction->item_type = License::class; - $logaction->item_id = $license->id; - $logaction->user_id = Auth::user()->id; - $logaction->note = '+'.abs($difference)." seats"; - $logaction->target_id = null; - $log = $logaction->logaction('add seats'); - } - $license->seats = e(Input::get('seats')); - } - - // Was the asset created? if ($license->save()) { - // Redirect to the new license page - return redirect()->to("admin/licenses/$licenseId/view")->with('success', trans('admin/licenses/message.update.success')); + return redirect()->route('licenses.show', ['license' => $licenseId])->with('success', trans('admin/licenses/message.update.success')); } - - - // Redirect to the license edit page - return redirect()->to("admin/licenses/$licenseId/edit")->with('error', trans('admin/licenses/message.update.error')); - + // If we can't adjust the number of seats, the error is flashed to the session by the event handler in License.php + return redirect()->back()->withInput()->withErrors($license->getErrors()); } /** @@ -384,52 +202,37 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $licenseId - * @return Redirect - */ - public function getDelete($licenseId) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($licenseId) { // Check if the license exists if (is_null($license = License::find($licenseId))) { // Redirect to the license management page - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } - if ($license->assigned_seats_count > 0) { - - // Redirect to the license management page - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.assoc_users')); - - } else { + $this->authorize('delete', $license); + if ($license->assigned_seats_count == 0) { // Delete the license and the associated license seats DB::table('license_seats') - ->where('id', $license->id) - ->update(array('assigned_to' => null,'asset_id' => null)); + ->where('id', $license->id) + ->update(array('assigned_to' => null,'asset_id' => null)); - $licenseseats = $license->licenseseats(); - $licenseseats->delete(); + $licenseSeats = $license->licenseseats(); + $licenseSeats->delete(); $license->delete(); - $logaction = new Actionlog(); - $logaction->item_type = License::class; - $logaction->item_id = $license->id; - $logaction->created_at = date("Y-m-d H:i:s"); - $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('deleted'); - - - - // Redirect to the licenses management page - return redirect()->to('admin/licenses')->with('success', trans('admin/licenses/message.delete.success')); + return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.delete.success')); + // Redirect to the license management page } - + // There are still licenses in use. + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.assoc_users')); } - /** * Provides the form view for checking out a license to a user. * Here we pass the license seat ID instead of the license ID, @@ -439,57 +242,46 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $seatId - * @return View - */ + * @return \Illuminate\Contracts\View\View + */ public function getCheckout($seatId) { // Check if the license seat exists - if (is_null($licenseseat = LicenseSeat::find($seatId))) { + if (is_null($licenseSeat = LicenseSeat::find($seatId))) { // Redirect to the asset management page with error - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($licenseseat->license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } - // Get the dropdown of users and then pass it to the checkout view - $users_list = Helper::usersList(); - - $assets = Helper::detailedAssetList(); - return View::make('licenses/checkout', compact('licenseseat')) - ->with('users_list', $users_list) - ->with('asset_list', $assets); - + $this->authorize('checkout', $licenseSeat); + return view('licenses/checkout', compact('licenseSeat')) + ->with('users_list', Helper::usersList()) + ->with('asset_list', Helper::detailedAssetList()); } - /** - * Validates and stores the license checkout action. - * - * @todo Switch to using a FormRequest for validation here. - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $seatId - * @return Redirect - */ - public function postCheckout($seatId) + * Validates and stores the license checkout action. + * + * @todo Switch to using a FormRequest for validation here. + * @author [A. Gianotto] [] + * @since [v1.0] + * @param Request $request + * @param int $seatId + * @return \Illuminate\Http\RedirectResponse + */ + public function postCheckout(Request $request, $seatId) { + $licenseSeat = LicenseSeat::find($seatId); + $assigned_to = e($request->input('assigned_to')); + $asset_id = e($request->input('asset_id')); - $licenseseat = LicenseSeat::find($seatId); - $assigned_to = e(Input::get('assigned_to')); - $asset_id = e(Input::get('asset_id')); - $user = Auth::user(); - - if (!Company::isCurrentUserHasAccess($licenseseat->license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); - } + $this->authorize('checkout', $licenseSeat); // Declare the rules for the form validation - $rules = array( - + $rules = [ 'note' => 'string', 'asset_id' => 'required_without:assigned_to', - ); + ]; // Create a new validator instance from our validation rules $validator = Validator::make(Input::all(), $rules); @@ -499,113 +291,58 @@ class LicensesController extends Controller // Ooops.. something went wrong return redirect()->back()->withInput()->withErrors($validator); } - + $target = null; if ($assigned_to!='') { // Check if the user exists - if (is_null($is_assigned_to = User::find($assigned_to))) { + if (is_null($target = User::find($assigned_to))) { // Redirect to the asset management page with error - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.user_does_not_exist')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.user_does_not_exist')); } } if ($asset_id!='') { - - if (is_null($asset = Asset::find($asset_id))) { + if (is_null($target = Asset::find($asset_id))) { // Redirect to the asset management page with error - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.asset_does_not_exist')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.asset_does_not_exist')); } - - if (($asset->assigned_to!='') && (($asset->assigned_to!=$assigned_to)) && ($assigned_to!='')) { - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.owner_doesnt_match_asset')); + if (($target->assigned_to!='') && (($target->assigned_to!=$assigned_to)) && ($target!='')) { + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.owner_doesnt_match_asset')); } - } - - // Check if the asset exists - if (is_null($licenseseat)) { + if (is_null($licenseSeat)) { // Redirect to the asset management page with error - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.not_found')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } - if (Input::get('asset_id') == '') { - $licenseseat->asset_id = null; + if ($request->input('asset_id') == '') { + $licenseSeat->asset_id = null; } else { - $licenseseat->asset_id = e(Input::get('asset_id')); + $licenseSeat->asset_id = $request->input('asset_id'); } // Update the asset data - if (e(Input::get('assigned_to')) == '') { - $licenseseat->assigned_to = null; - + if ($request->input('assigned_to') == '') { + $licenseSeat->assigned_to = null; } else { - $licenseseat->assigned_to = e(Input::get('assigned_to')); + $licenseSeat->assigned_to = $request->input('assigned_to'); } // Was the asset updated? - if ($licenseseat->save()) { + if ($licenseSeat->save()) { + $licenseSeat->logCheckout($request->input('note'), $target); - $licenseseat->logCheckout(e(Input::get('note'))); - - $data['license_id'] =$licenseseat->license_id; - $data['note'] = e(Input::get('note')); - - $license = License::find($licenseseat->license_id); - $settings = Setting::getSettings(); - - - // Update the asset data - if (e(Input::get('assigned_to')) == '') { - $slack_msg = 'License <'.config('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked out to <'.config('app.url').'/hardware/'.$asset->id.'/view|'.$asset->showAssetName().'> by <'.config('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.'; - } else { - $slack_msg = 'License <'.config('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked out to <'.config('app.url').'/admin/users/'.$user->id.'/view|'.$is_assigned_to->fullName().'> by <'.config('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.'; - } - - - - if ($settings->slack_endpoint) { - - - $slack_settings = [ - 'username' => $settings->botname, - 'channel' => $settings->slack_channel, - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked Out:', - 'value' => $slack_msg - ], - [ - 'title' => 'Note:', - 'value' => e(Input::get('note')) - ], - - - - ] - ])->send('License Checked Out'); - - } catch (Exception $e) { - - } - - } + $data['license_id'] =$licenseSeat->license_id; + $data['note'] = $request->input('note'); // Redirect to the new asset page - return redirect()->to("admin/licenses")->with('success', trans('admin/licenses/message.checkout.success')); + return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.checkout.success')); } // Redirect to the asset management page with error - return redirect()->to('admin/licenses/$assetId/checkout')->with('error', trans('admin/licenses/message.create.error'))->with('license', new License); + return redirect()->to("admin/licenses/{$asset_id}/checkout")->with('error', trans('admin/licenses/message.create.error'))->with('license', new License); } @@ -615,24 +352,21 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $seatId - * @param string $backto - * @return View - */ - public function getCheckin($seatId = null, $backto = null) + * @param string $backTo + * @return \Illuminate\Contracts\View\View + */ + public function getCheckin($seatId = null, $backTo = null) { // Check if the asset exists if (is_null($licenseseat = LicenseSeat::find($seatId))) { // Redirect to the asset management page with error - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($licenseseat->license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } - return View::make('licenses/checkin', compact('licenseseat'))->with('backto', $backto); - + $this->authorize('checkin', $licenseseat); + return view('licenses/checkin', compact('licenseseat'))->with('backto', $backTo); } - /** * Validates and stores the license checkin action. * @@ -640,22 +374,20 @@ class LicensesController extends Controller * @see LicensesController::getCheckin() method that provides the form view * @since [v1.0] * @param int $seatId - * @param string $backto - * @return Redirect - */ - public function postCheckin($seatId = null, $backto = null) + * @param string $backTo + * @return \Illuminate\Http\RedirectResponse + */ + public function postCheckin($seatId = null, $backTo = null) { // Check if the asset exists - if (is_null($licenseseat = LicenseSeat::find($seatId))) { + if (is_null($licenseSeat = LicenseSeat::find($seatId))) { // Redirect to the asset management page with error - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.not_found')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } - $license = License::find($licenseseat->license_id); + $license = License::find($licenseSeat->license_id); - if (!Company::isCurrentUserHasAccess($license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); - } + $this->authorize('checkin', $licenseSeat); if (!$license->reassignable) { // Not allowed to checkin @@ -677,67 +409,25 @@ class LicensesController extends Controller // Ooops.. something went wrong return redirect()->back()->withInput()->withErrors($validator); } - $return_to = User::find($licenseseat->assigned_to); + $return_to = User::find($licenseSeat->assigned_to); if (!$return_to) { - $return_to = Asset::find($licenseseat->asset_id); + $return_to = Asset::find($licenseSeat->asset_id); } // Update the asset data - $licenseseat->assigned_to = null; - $licenseseat->asset_id = null; - - $user = Auth::user(); + $licenseSeat->assigned_to = null; + $licenseSeat->asset_id = null; // Was the asset updated? - if ($licenseseat->save()) { - $licenseseat->logCheckin($return_to, e(Input::get('note'))); - - $settings = Setting::getSettings(); - - if ($settings->slack_endpoint) { - - - $slack_settings = [ - 'username' => $settings->botname, - 'channel' => $settings->slack_channel, - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked In:', - 'value' => 'License: <'.config('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked in by <'.config('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.' - ], - [ - 'title' => 'Note:', - 'value' => e(Input::get('note')) - ], - - ] - ])->send('License Checked In'); - - } catch (Exception $e) { - - } - + if ($licenseSeat->save()) { + $licenseSeat->logCheckin($return_to, e(request('note'))); + if ($backTo=='user') { + return redirect()->route("users.show", $return_to->id)->with('success', trans('admin/licenses/message.checkin.success')); } - - - - if ($backto=='user') { - return redirect()->to("admin/users/".$return_to->id.'/view')->with('success', trans('admin/licenses/message.checkin.success')); - } else { - return redirect()->to("admin/licenses/".$licenseseat->license_id."/view")->with('success', trans('admin/licenses/message.checkin.success')); - } - + return redirect()->route("licenses.show", $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success')); } // Redirect to the license page with error - return redirect()->to("admin/licenses")->with('error', trans('admin/licenses/message.checkin.error')); + return redirect()->route("licenses.index")->with('error', trans('admin/licenses/message.checkin.error')); } /** @@ -746,61 +436,49 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $licenseId - * @return View - */ - public function getView($licenseId = null) + * @return \Illuminate\Contracts\View\View + */ + public function show($licenseId = null) { - $license = License::withTrashed()->find($licenseId); + $license = License::find($licenseId); $license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset'); if (isset($license->id)) { - - if (!Company::isCurrentUserHasAccess($license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); - } - return View::make('licenses/view', compact('license')); - - } else { - // Prepare the error message - $error = trans('admin/licenses/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('licenses')->with('error', $error); + $license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset'); + $this->authorize('view', $license); + return view('licenses/view', compact('license')); } + $error = trans('admin/licenses/message.does_not_exist', compact('id')); + return redirect()->route('licenses.index')->with('error', $error); } public function getClone($licenseId = null) { - // Check if the license exists if (is_null($license_to_clone = License::find($licenseId))) { - // Redirect to the blogs management page - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($license_to_clone)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); } - // Show the page - $license_options = array('0' => 'Top Level') + License::pluck('name', 'id')->toArray(); - $maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No'); - $company_list = Helper::companyList(); + $this->authorize('create', License::class); + + $maintained_list = [ + '' => 'Maintained', + '1' => 'Yes', + '0' => 'No' + ]; //clone the orig $license = clone $license_to_clone; $license->id = null; $license->serial = null; // Show the page - $depreciation_list = Helper::depreciationList(); - $supplier_list = Helper::suppliersList(); - return View::make('licenses/edit') - ->with('license_options', $license_options) - ->with('depreciation_list', $depreciation_list) - ->with('supplier_list', $supplier_list) + return view('licenses/edit') + ->with('depreciation_list', Helper::depreciationList()) + ->with('supplier_list', Helper::suppliersList()) ->with('item', $license) ->with('maintained_list', $maintained_list) - ->with('company_list', $company_list) + ->with('company_list', Helper::companyList()) ->with('manufacturer_list', Helper::manufacturerList()); - } @@ -811,21 +489,16 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $licenseId - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function postUpload($licenseId = null) { $license = License::find($licenseId); - // the license is valid $destinationPath = config('app.private_uploads').'/licenses'; if (isset($license->id)) { - - - if (!Company::isCurrentUserHasAccess($license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); - } + $this->authorize('update', $license); if (Input::hasFile('licensefile')) { @@ -836,40 +509,28 @@ class LicensesController extends Controller ); $validator = Validator::make(array('licensefile'=> $file), $rules); - if ($validator->passes()) { - - $extension = $file->getClientOriginalExtension(); - $filename = 'license-'.$license->id.'-'.str_random(8); - $filename .= '-'.str_slug($file->getClientOriginalName()).'.'.$extension; - $upload_success = $file->move($destinationPath, $filename); - - //Log the upload to the log - $license->logUpload($filename, e(Input::get('notes'))); - } else { + if ($validator->fails()) { return redirect()->back()->with('error', trans('admin/licenses/message.upload.invalidfiles')); } + $extension = $file->getClientOriginalExtension(); + $filename = 'license-'.$license->id.'-'.str_random(8); + $filename .= '-'.str_slug($file->getClientOriginalName()).'.'.$extension; + $upload_success = $file->move($destinationPath, $filename); - + //Log the upload to the log + $license->logUpload($filename, e($request->input('notes'))); } if ($upload_success) { return redirect()->back()->with('success', trans('admin/licenses/message.upload.success')); - } else { - return redirect()->back()->with('success', trans('admin/licenses/message.upload.error')); } - - } else { - return redirect()->back()->with('error', trans('admin/licenses/message.upload.nofiles')); + return redirect()->back()->with('error', trans('admin/licenses/message.upload.error')); } - - - } else { - // Prepare the error message - $error = trans('admin/licenses/message.does_not_exist', compact('id')); - - // Redirect to the licence management page - return redirect()->route('licenses')->with('error', $error); + return redirect()->back()->with('error', trans('admin/licenses/message.upload.nofiles')); } + // Prepare the error message + $error = trans('admin/licenses/message.does_not_exist', compact('id')); + return redirect()->route('licenses.index')->with('error', $error); } @@ -880,8 +541,8 @@ class LicensesController extends Controller * @since [v1.0] * @param int $licenseId * @param int $fileId - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function getDeleteFile($licenseId = null, $fileId = null) { $license = License::find($licenseId); @@ -889,12 +550,7 @@ class LicensesController extends Controller // the license is valid if (isset($license->id)) { - - - if (!Company::isCurrentUserHasAccess($license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); - } - + $this->authorize('edit', $license); $log = Actionlog::find($fileId); $full_filename = $destinationPath.'/'.$log->filename; if (file_exists($full_filename)) { @@ -902,14 +558,12 @@ class LicensesController extends Controller } $log->delete(); return redirect()->back()->with('success', trans('admin/licenses/message.deletefile.success')); - - } else { - // Prepare the error message - $error = trans('admin/licenses/message.does_not_exist', compact('id')); - - // Redirect to the licence management page - return redirect()->route('licenses')->with('error', $error); } + // Prepare the error message + $error = trans('admin/licenses/message.does_not_exist', compact('id')); + + // Redirect to the licence management page + return redirect()->route('licenses.index')->with('error', $error); } @@ -921,8 +575,8 @@ class LicensesController extends Controller * @since [v1.4] * @param int $licenseId * @param int $fileId - * @return Redirect - */ + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ public function displayFile($licenseId = null, $fileId = null) { @@ -930,21 +584,15 @@ class LicensesController extends Controller // the license is valid if (isset($license->id)) { - - if (!Company::isCurrentUserHasAccess($license)) { - return redirect()->to('admin/licenses')->with('error', trans('general.insufficient_permissions')); - } - - $log = Actionlog::find($fileId); - $file = $log->get_src('licenses'); - return Response::download($file); - } else { - // Prepare the error message - $error = trans('admin/licenses/message.does_not_exist', compact('id')); - - // Redirect to the licence management page - return redirect()->route('licenses')->with('error', $error); + $this->authorize('view', $license); + $log = Actionlog::find($fileId); + $file = $log->get_src('licenses'); + return Response::download($file); } + // Prepare the error message + $error = trans('admin/licenses/message.does_not_exist', compact('id')); + // Redirect to the licence management page + return redirect()->route('licenses.index')->with('error', $error); } @@ -956,17 +604,20 @@ class LicensesController extends Controller * @since [v1.0] * @return String JSON */ - public function getDatatable() + public function getDatatable(Request $request) { + $this->authorize('view', License::class); $licenses = Company::scopeCompanyables(License::with('company', 'licenseSeatsRelation', 'manufacturer')); if (Input::has('search')) { - $licenses = $licenses->TextSearch(Input::get('search')); + $licenses = $licenses->TextSearch($request->input('search')); } + $offset = request('offset', 0); + $limit = request('limit', 50); $allowed_columns = ['id','name','purchase_cost','expiration_date','purchase_order','order_number','notes','purchase_date','serial','manufacturer','company']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? e(Input::get('sort')) : 'created_at'; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; switch ($sort) { case 'manufacturer': @@ -980,53 +631,13 @@ class LicensesController extends Controller break; } - $licenseCount = $licenses->count(); - $licenses = $licenses->skip(Input::get('offset'))->take(Input::get('limit'))->get(); + $licenses = $licenses->skip($offset)->take($limit)->get(); $rows = array(); foreach ($licenses as $license) { - $actions = ''; - - if (Gate::allows('licenses.checkout')) { - $actions .= '' . trans('general.checkout') . ' '; - } - - if (Gate::allows('licenses.create')) { - $actions .= ''; - } - if (Gate::allows('licenses.edit')) { - $actions .= ''; - } - if (Gate::allows('licenses.delete')) { - $actions .= ''; - } - $actions .=''; - - $rows[] = array( - 'id' => $license->id, - 'name' => (string) link_to('/admin/licenses/'.$license->id.'/view', $license->name), - 'serial' => (string) link_to('/admin/licenses/'.$license->id.'/view', mb_strimwidth($license->serial, 0, 50, "...")), - 'totalSeats' => $license->licenseSeatsCount, - 'remaining' => $license->remaincount(), - 'license_name' => e($license->license_name), - 'license_email' => e($license->license_email), - 'purchase_date' => ($license->purchase_date) ? $license->purchase_date : '', - 'expiration_date' => ($license->expiration_date) ? $license->expiration_date : '', - 'purchase_cost' => Helper::formatCurrencyOutput($license->purchase_cost), - 'purchase_order' => ($license->purchase_order) ? e($license->purchase_order) : '', - 'order_number' => ($license->order_number) ? e($license->order_number) : '', - 'notes' => ($license->notes) ? e($license->notes) : '', - 'actions' => $actions, - 'company' => is_null($license->company) ? '' : e($license->company->name), - 'manufacturer' => $license->manufacturer ? (string) link_to('/admin/settings/manufacturers/'.$license->manufacturer_id.'/view', $license->manufacturer->name) : '' - ); + $rows[] = $license->present()->forDataTable(); } $data = array('total' => $licenseCount, 'rows' => $rows); @@ -1045,16 +656,15 @@ class LicensesController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $licenseId - * @return View - */ + * @return \Illuminate\Http\RedirectResponse + */ public function getFreeLicense($licenseId) { - // Check if the asset exists + $this->authorize('checkout', License::class); if (is_null($license = License::find($licenseId))) { - // Redirect to the asset management page with error - return redirect()->to('admin/licenses')->with('error', trans('admin/licenses/message.not_found')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } $seatId = $license->freeSeat($licenseId); - return redirect()->to('admin/licenses/'.$seatId.'/checkout'); + return redirect()->route('licenses.checkout', $seatId); } } diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index cee02f7a8a..e542a8eb6c 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -1,9 +1,11 @@ ] * @see LocationsController::getDatatable() method that generates the JSON response * @since [v1.0] - * @return View - */ - public function getIndex() + * @return \Illuminate\Contracts\View\View + */ + public function index() { // Grab all the locations $locations = Location::orderBy('created_at', 'DESC')->with('parent', 'assets', 'assignedassets')->get(); // Show the page - return View::make('locations/index', compact('locations')); + return view('locations/index', compact('locations')); } @@ -49,9 +51,9 @@ class LocationsController extends Controller * @author [A. Gianotto] [] * @see LocationsController::postCreate() method that validates and stores the data * @since [v1.0] - * @return View - */ - public function getCreate() + * @return \Illuminate\Contracts\View\View + */ + public function create() { $locations = Location::orderBy('name', 'ASC')->get(); @@ -59,9 +61,10 @@ class LocationsController extends Controller $location_options = Location::flattenLocationsArray($location_options_array); $location_options = array('' => 'Top Level') + $location_options; - return View::make('locations/edit') - ->with('location_options', $location_options) - ->with('item', new Location); + return view('locations/edit') + ->with('location_options', $location_options) + ->with('item', new Location) + ->with('manager_list', Helper::managerList()); } @@ -72,38 +75,27 @@ class LocationsController extends Controller * @author [A. Gianotto] [] * @see LocationsController::getCreate() method that makes the form * @since [v1.0] - * @return Redirect - */ - public function postCreate() + * @return \Illuminate\Http\RedirectResponse + */ + public function store() { - - // create a new location instance $location = new Location(); - - - // Save the location data - $location->name = e(Input::get('name')); - if (Input::get('parent_id')=='') { - $location->parent_id = null; - } else { - $location->parent_id = e(Input::get('parent_id')); - } - $location->currency = e(Input::get('currency', '$')); - $location->address = e(Input::get('address')); - $location->address2 = e(Input::get('address2')); - $location->city = e(Input::get('city')); - $location->state = e(Input::get('state')); - $location->country = e(Input::get('country')); - $location->zip = e(Input::get('zip')); - $location->user_id = Auth::user()->id; + $location->name = Input::get('name'); + $location->parent_id = Input::get('parent_id', null); + $location->currency = Input::get('currency', '$'); + $location->address = Input::get('address'); + $location->address2 = Input::get('address2'); + $location->city = Input::get('city'); + $location->state = Input::get('state'); + $location->country = Input::get('country'); + $location->zip = Input::get('zip'); + $location->manager_id = Input::get('manager_id'); + $location->user_id = Auth::id(); if ($location->save()) { - // Redirect to the new location page - return redirect()->to("admin/settings/locations")->with('success', trans('admin/locations/message.create.success')); + return redirect()->route("locations.index")->with('success', trans('admin/locations/message.create.success')); } - return redirect()->back()->withInput()->withErrors($location->getErrors()); - } /** @@ -115,35 +107,30 @@ class LocationsController extends Controller * @since [v1.0] * @return String JSON */ - public function store() + public function apiStore() { - $new['currency']=Setting::first()->default_currency; // create a new location instance $location = new Location(); // Save the location data - $location->name = e(Input::get('name')); + $location->name = Input::get('name'); $location->currency = Setting::first()->default_currency; //e(Input::get('currency')); $location->address = ''; //e(Input::get('address')); // $location->address2 = e(Input::get('address2')); - $location->city = e(Input::get('city')); + $location->city = Input::get('city'); $location->state = '';//e(Input::get('state')); - $location->country = e(Input::get('country')); + $location->country = Input::get('country'); // $location->zip = e(Input::get('zip')); - $location->user_id = Auth::user()->id; + $location->user_id = Auth::id(); // Was the location created? if ($location->save()) { return JsonResponse::create($location); - } - // failure - $errors = $location->errors(); return JsonResponse::create(["error" => "Failed validation: ".print_r($location->getErrors(), true)], 500); - } @@ -154,9 +141,9 @@ class LocationsController extends Controller * @see LocationsController::postCreate() method that validates and stores * @param int $locationId * @since [v1.0] - * @return View - */ - public function getEdit($locationId = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($locationId = null) { // Check if the location exists if (is_null($item = Location::find($locationId))) { @@ -169,7 +156,10 @@ class LocationsController extends Controller $location_options = Location::flattenLocationsArray($location_options_array); $location_options = array('' => 'Top Level') + $location_options; - return View::make('locations/edit', compact('item'))->with('location_options', $location_options); + + return view('locations/edit', compact('item')) + ->with('location_options', $location_options) + ->with('manager_list', Helper::managerList()); } @@ -180,40 +170,35 @@ class LocationsController extends Controller * @see LocationsController::getEdit() method that makes the form view * @param int $locationId * @since [v1.0] - * @return Redirect - */ - public function postEdit($locationId = null) + * @return \Illuminate\Http\RedirectResponse + */ + public function update($locationId = null) { // Check if the location exists if (is_null($location = Location::find($locationId))) { - // Redirect to the blogs management page return redirect()->to('admin/settings/locations')->with('error', trans('admin/locations/message.does_not_exist')); } // Update the location data - $location->name = e(Input::get('name')); - if (Input::get('parent_id')=='') { - $location->parent_id = null; - } else { - $location->parent_id = e(Input::get('parent_id', '')); - } - $location->currency = e(Input::get('currency', '$')); - $location->address = e(Input::get('address')); - $location->address2 = e(Input::get('address2')); - $location->city = e(Input::get('city')); - $location->state = e(Input::get('state')); - $location->country = e(Input::get('country')); - $location->zip = e(Input::get('zip')); + $location->name = Input::get('name'); + $location->parent_id = Input::get('parent_id', null); + $location->currency = Input::get('currency', '$'); + $location->address = Input::get('address'); + $location->address2 = Input::get('address2'); + $location->city = Input::get('city'); + $location->state = Input::get('state'); + $location->country = Input::get('country'); + $location->zip = Input::get('zip'); + $location->ldap_ou = Input::get('ldap_ou'); + $location->manager_id = Input::get('manager_id'); - // Was the asset created? + // Was the location updated? if ($location->save()) { // Redirect to the saved location page - return redirect()->to("admin/settings/locations/")->with('success', trans('admin/locations/message.update.success')); + return redirect()->route("locations.index")->with('success', trans('admin/locations/message.update.success')); } - // Redirect to the location management page return redirect()->back()->withInput()->withInput()->withErrors($location->getErrors()); - } /** @@ -222,32 +207,29 @@ class LocationsController extends Controller * @author [A. Gianotto] [] * @param int $locationId * @since [v1.0] - * @return Redirect - */ - public function getDelete($locationId) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($locationId) { // Check if the location exists if (is_null($location = Location::find($locationId))) { // Redirect to the blogs management page - return redirect()->to('admin/settings/locations')->with('error', trans('admin/locations/message.not_found')); + return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.not_found')); } if ($location->users->count() > 0) { - return redirect()->to('admin/settings/locations')->with('error', trans('admin/locations/message.assoc_users')); + return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_users')); } elseif ($location->childLocations->count() > 0) { - return redirect()->to('admin/settings/locations')->with('error', trans('admin/locations/message.assoc_child_loc')); + return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_child_loc')); } elseif ($location->assets->count() > 0) { - return redirect()->to('admin/settings/locations')->with('error', trans('admin/locations/message.assoc_assets')); + return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); } elseif ($location->assignedassets->count() > 0) { - return redirect()->to('admin/settings/locations')->with('error', trans('admin/locations/message.assoc_assets')); + return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); } else { $location->delete(); - return redirect()->to('admin/settings/locations')->with('success', trans('admin/locations/message.delete.success')); + return redirect()->to(route('locations.index'))->with('success', trans('admin/locations/message.delete.success')); } - - - } @@ -256,178 +238,22 @@ class LocationsController extends Controller * the content for the locations detail page. * * @author [A. Gianotto] [] - * @see LocationsController::getDataViewUsers() method that returns JSON for location users - * @see LocationsController::getDataViewAssets() method that returns JSON for location assets * @param int $locationId * @since [v1.0] - * @return View - */ - public function getView($locationId = null) + * @return \Illuminate\Contracts\View\View + */ + public function show($locationId = null) { $location = Location::find($locationId); if (isset($location->id)) { - return View::make('locations/view', compact('location')); - } else { - // Prepare the error message - $error = trans('admin/locations/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('locations')->with('error', $error); + return view('locations/view', compact('location')); } + // Prepare the error message + $error = trans('admin/locations/message.does_not_exist', compact('id')); - + // Redirect to the user management page + return redirect()->route('locations.index')->with('error', $error); } - - /** - * Returns the JSON response to populate the bootstrap tables on the locationa view. - * - * @author [A. Gianotto] [] - * @see LocationsController::getIndex() method that returns JSON for location index - * @since [v1.0] - * @return View - */ - public function getDatatable() - { - $locations = Location::select(array('locations.id','locations.name','locations.address','locations.address2','locations.city','locations.state','locations.zip','locations.country','locations.parent_id','locations.currency'))->with('assets'); - - - if (Input::has('search')) { - $locations = $locations->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - - - - switch (Input::get('sort')) { - case 'parent': - $locations = $locations->OrderParent($order); - break; - default: - $allowed_columns = ['id','name','address','city','state','country','currency','zip']; - - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - $locations = $locations->orderBy($sort, $order); - break; - } - - - $locationsCount = $locations->count(); - $locations = $locations->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($locations as $location) { - $actions = ''; - - $rows[] = array( - 'id' => $location->id, - 'name' => (string)link_to('admin/settings/locations/'.$location->id.'/view', e($location->name)), - 'parent' => ($location->parent) ? e($location->parent->name) : '', - // 'assets' => ($location->assets->count() + $location->assignedassets->count()), - 'assets_default' => $location->assignedassets->count(), - 'assets_checkedout' => $location->assets->count(), - 'address' => ($location->address) ? e($location->address): '', - 'city' => e($location->city), - 'state' => e($location->state), - 'zip' => e($location->zip), - 'country' => e($location->country), - 'currency' => e($location->currency), - 'actions' => $actions - ); - } - - $data = array('total' => $locationsCount, 'rows' => $rows); - - return $data; - - } - - - /** - * Returns a JSON response that contains the users association with the - * selected location, to be used by the location detail view. - * - * @author [A. Gianotto] [] - * @see LocationsController::getView() method that creates the display view - * @param int $locationId - * @since [v1.8] - * @return View - */ - public function getDataViewUsers($locationID) - { - $location = Location::find($locationID); - $users = User::where('location_id', '=', $location->id); - - if (Input::has('search')) { - $users = $users->TextSearch(e(Input::get('search'))); - } - - $users = $users->get(); - $rows = array(); - - foreach ($users as $user) { - $rows[] = array( - 'name' => (string)link_to('/admin/users/'.$user->id.'/view', e($user->fullName())) - ); - } - - $data = array('total' => $users->count(), 'rows' => $rows); - - return $data; - } - - - /** - * Returns a JSON response that contains the assets association with the - * selected location, to be used by the location detail view. - * - * @todo This is broken for accessories and consumables. - * @todo This is a very naive implementation. Should clean this up with query scopes. - * @author [A. Gianotto] [] - * @see LocationsController::getView() method that creates the display view - * @param int $locationID - * @since [v1.8] - * @return View - */ - public function getDataViewAssets($locationID) - { - $location = Location::find($locationID)->load('assignedassets.model'); - $assets = Asset::AssetsByLocation($location); - - if (Input::has('search')) { - $assets = $assets->TextSearch(e(Input::get('search'))); - } - - $assets = $assets->get(); - - $rows = array(); - - foreach ($assets as $asset) { - $rows[] = array( - 'name' => (string)link_to(config('app.url').'/hardware/'.$asset->id.'/view', e($asset->showAssetName())), - 'asset_tag' => e($asset->asset_tag), - 'serial' => e($asset->serial), - 'model' => e($asset->model->name), - ); - } - - $data = array('total' => $assets->count(), 'rows' => $rows); - return $data; - - } } diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index eba506f52a..b846bc0016 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -1,16 +1,18 @@ ] - * @see ManufacturersController::getDatatable() method that generates the JSON response + * @see Api\ManufacturersController::index() method that generates the JSON response * @since [v1.0] - * @return View - */ - public function getIndex() + * @return \Illuminate\Contracts\View\View + */ + public function index() { - // Show the page - return View::make('manufacturers/index', compact('manufacturers')); + return view('manufacturers/index', compact('manufacturers')); } @@ -40,89 +41,93 @@ class ManufacturersController extends Controller * Returns a view that displays a form to create a new manufacturer. * * @author [A. Gianotto] [] - * @see ManufacturersController::postCreate() + * @see ManufacturersController::store() * @since [v1.0] - * @return View - */ - public function getCreate() + * @return \Illuminate\Contracts\View\View + */ + public function create() { - return View::make('manufacturers/edit')->with('item', new Manufacturer); + return view('manufacturers/edit')->with('item', new Manufacturer); } /** - * Validates and stores the data for a new manufacturer. - * - * @author [A. Gianotto] [] - * @see ManufacturersController::postCreate() - * @since [v1.0] - * @return Redirect - */ - public function postCreate() + * Validates and stores the data for a new manufacturer. + * + * @author [A. Gianotto] [] + * @see ManufacturersController::create() + * @since [v1.0] + * @param Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) { + $manufacturer = new Manufacturer; - $manufacturer->name = e(Input::get('name')); + $manufacturer->name = $request->input('name'); $manufacturer->user_id = Auth::user()->id; + $manufacturer->url = $request->input('url'); + $manufacturer->support_url = $request->input('support_url'); + $manufacturer->support_phone = $request->input('support_phone'); + $manufacturer->support_email = $request->input('support_email'); + + if ($manufacturer->save()) { - return redirect()->to("admin/settings/manufacturers")->with('success', trans('admin/manufacturers/message.create.success')); + return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.create.success')); } - return redirect()->back()->withInput()->withErrors($manufacturer->getErrors()); - } /** * Returns a view that displays a form to edit a manufacturer. * * @author [A. Gianotto] [] - * @see ManufacturersController::postEdit() + * @see ManufacturersController::update() * @param int $manufacturerId * @since [v1.0] - * @return View - */ - public function getEdit($manufacturerId = null) + * @return \Illuminate\Contracts\View\View + */ + public function edit($id = null) { // Check if the manufacturer exists - if (is_null($item = Manufacturer::find($manufacturerId))) { - // Redirect to the manufacturer page - return redirect()->to('admin/settings/manufacturers')->with('error', trans('admin/manufacturers/message.does_not_exist')); + if (is_null($item = Manufacturer::find($id))) { + return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist')); } - // Show the page - return View::make('manufacturers/edit', compact('item')); + return view('manufacturers/edit', compact('item')); } /** - * Validates and stores the updated manufacturer data. - * - * @author [A. Gianotto] [] - * @see ManufacturersController::getEdit() - * @param int $manufacturerId - * @since [v1.0] - * @return View - */ - public function postEdit($manufacturerId = null) + * Validates and stores the updated manufacturer data. + * + * @author [A. Gianotto] [] + * @see ManufacturersController::getEdit() + * @param Request $request + * @param int $manufacturerId + * @return \Illuminate\Http\RedirectResponse + * @since [v1.0] + */ + public function update(Request $request, $manufacturerId = null) { // Check if the manufacturer exists if (is_null($manufacturer = Manufacturer::find($manufacturerId))) { // Redirect to the manufacturer page - return redirect()->to('admin/settings/manufacturers')->with('error', trans('admin/manufacturers/message.does_not_exist')); + return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist')); } // Save the data - $manufacturer->name = e(Input::get('name')); + $manufacturer->name = $request->input('name'); + $manufacturer->url = $request->input('url'); + $manufacturer->support_url = $request->input('support_url'); + $manufacturer->support_phone = $request->input('support_phone'); + $manufacturer->support_email = $request->input('support_email'); - // Was it created? if ($manufacturer->save()) { - // Redirect to the new manufacturer page - return redirect()->to("admin/settings/manufacturers")->with('success', trans('admin/manufacturers/message.update.success')); + return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.update.success')); } - return redirect()->back()->withInput()->withErrors($manufacturer->getErrors()); - - } /** @@ -131,33 +136,26 @@ class ManufacturersController extends Controller * @author [A. Gianotto] [] * @param int $manufacturerId * @since [v1.0] - * @return View - */ - public function getDelete($manufacturerId) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($manufacturerId) { // Check if the manufacturer exists if (is_null($manufacturer = Manufacturer::find($manufacturerId))) { // Redirect to the manufacturers page - return redirect()->to('admin/settings/manufacturers')->with('error', trans('admin/manufacturers/message.not_found')); + return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.not_found')); } if ($manufacturer->has_models() > 0) { - // Redirect to the asset management page - return redirect()->to('admin/settings/manufacturers')->with('error', trans('admin/manufacturers/message.assoc_users')); - } else { - - // Delete the manufacturer - $manufacturer->delete(); - - // Redirect to the manufacturers management page - return redirect()->to('admin/settings/manufacturers')->with('success', trans('admin/manufacturers/message.delete.success')); + return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.assoc_users')); } - + // Delete the manufacturer + $manufacturer->delete(); + // Redirect to the manufacturers management page + return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.delete.success')); } - - /** * Returns a view that invokes the ajax tables which actually contains * the content for the manufacturers detail listing, which is generated in getDatatable. @@ -167,189 +165,88 @@ class ManufacturersController extends Controller * @see ManufacturersController::getDataView() * @param int $manufacturerId * @since [v1.0] - * @return View - */ - public function getView($manufacturerId = null) + * @return \Illuminate\Contracts\View\View + */ + public function show($manufacturerId = null) { $manufacturer = Manufacturer::find($manufacturerId); if (isset($manufacturer->id)) { - return View::make('manufacturers/view', compact('manufacturer')); - } else { - // Prepare the error message - $error = trans('admin/manufacturers/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('manufacturers')->with('error', $error); + return view('manufacturers/view', compact('manufacturer')); } - - + // Prepare the error message + $error = trans('admin/manufacturers/message.does_not_exist', compact('id')); + // Redirect to the user management page + return redirect()->route('manufacturers')->with('error', $error); } + /** - * Generates the JSON used to display the manufacturer listings. - * - * @author [A. Gianotto] [] - * @see ManufacturersController::getIndex() - * @since [v1.0] - * @return String JSON - */ - public function getDatatable() - { - $manufacturers = Manufacturer::select(array('id','name'))->with('assets') - ->whereNull('deleted_at'); - - if (Input::has('search')) { - $manufacturers = $manufacturers->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $allowed_columns = ['id','name']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - - $manufacturers->orderBy($sort, $order); - - $manufacturersCount = $manufacturers->count(); - $manufacturers = $manufacturers->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($manufacturers as $manufacturer) { - $actions = ''; - - $rows[] = array( - 'id' => $manufacturer->id, - 'name' => (string)link_to('admin/settings/manufacturers/'.$manufacturer->id.'/view', e($manufacturer->name)), - 'assets' => $manufacturer->assets->count(), - 'actions' => $actions - ); - } - - $data = array('total' => $manufacturersCount, 'rows' => $rows); - - return $data; - - } - - - /** - * Generates the JSON used to display the manufacturer detail. - * This JSON returns data on all of the assets with the specified - * manufacturer ID number. - * - * @author [A. Gianotto] [] - * @see ManufacturersController::getView() - * @param int $manufacturerId - * @since [v1.0] - * @return String JSON - */ - public function getDataView($manufacturerId, $itemtype = null) + * Generates the JSON used to display the manufacturer detail. + * This JSON returns data on all of the assets with the specified + * manufacturer ID number. + * + * @author [A. Gianotto] [] + * @see ManufacturersController::getView() + * @param int $manufacturerId + * @param string $itemType + * @param Request $request + * @return String JSON* @since [v1.0] + */ + public function getDataView($manufacturerId, $itemType = null, Request $request) { $manufacturer = Manufacturer::find($manufacturerId); - switch ($itemtype) { + switch ($itemType) { case "assets": - return $this->getDataAssetsView($manufacturer); + return $this->getDataAssetsView($manufacturer, $request); case "licenses": - return $this->getDataLicensesView($manufacturer); + return $this->getDataLicensesView($manufacturer, $request); case "accessories": - return $this->getDataAccessoriesView($manufacturer); + return $this->getDataAccessoriesView($manufacturer, $request); case "consumables": - return $this->getDataConsumablesView($manufacturer); + return $this->getDataConsumablesView($manufacturer, $request); } - throw new Exception("We shouldn't be here"); + return "We shouldn't be here"; } - protected function getDataAssetsView(Manufacturer $manufacturer) + protected function getDataAssetsView(Manufacturer $manufacturer, Request $request) { - $manufacturer = $manufacturer->load('assets.model', 'assets.assigneduser', 'assets.assetstatus', 'assets.company'); - $manufacturer_assets = $manufacturer->assets; + $manufacturer = $manufacturer->load('assets.model', 'assets.assignedTo', 'assets.assetstatus', 'assets.company'); + $manufacturer_assets = $manufacturer->assets(); - if (Input::has('search')) { - $manufacturer_assets = $manufacturer_assets->TextSearch(e(Input::get('search'))); + if ($request->has('search')) { + $manufacturer_assets = $manufacturer_assets->TextSearch(e($request->input('search'))); } - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } + $offset = request('offset', 0); + $limit = request('limit', 50); - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $allowed_columns = ['id','name','serial','asset_tag']; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; $count = $manufacturer_assets->count(); - + $manufacturer_assets = $manufacturer_assets->skip($offset)->take($limit)->get(); $rows = array(); - + $all_custom_fields = CustomField::all(); // cached; foreach ($manufacturer_assets as $asset) { - - $actions = ''; - if ($asset->deleted_at=='') { - $actions = '
    '; - } elseif ($asset->deleted_at!='') { - $actions = ''; - } - - if ($asset->availableForCheckout()) { - if (Gate::allows('assets.checkout')) { - $inout = ''.trans('general.checkout').''; - } - } else { - if (Gate::allows('assets.checkin')) { - $inout = ''.trans('general.checkin').''; - } - } - - $rows[] = array( - 'id' => $asset->id, - 'name' => (string)link_to('/hardware/'.$asset->id.'/view', e($asset->showAssetName())), - 'model' => e($asset->model->name), - 'asset_tag' => e($asset->asset_tag), - 'serial' => e($asset->serial), - 'assigned_to' => ($asset->assigneduser) ? (string)link_to('/admin/users/'.$asset->assigneduser->id.'/view', e($asset->assigneduser->fullName())): '', - 'actions' => $actions, - // 'companyName' => e(Company::getName($asset)), - 'companyName' => is_null($asset->company) ? '' : $asset->company->name - ); - - if (isset($inout)) { - $row['change'] = $inout; - } + $rows[] = $asset->present()->forDataTable($all_custom_fields); } $data = array('total' => $count, 'rows' => $rows); return $data; } - protected function getDataLicensesView(Manufacturer $manufacturer) + protected function getDataLicensesView(Manufacturer $manufacturer, Request $request) { $manufacturer = $manufacturer->load('licenses.company', 'licenses.manufacturer', 'licenses.licenseSeatsRelation'); $licenses = $manufacturer->licenses; - if (Input::has('search')) { - $licenses = $licenses->TextSearch(Input::get('search')); + if ($request->has('search')) { + $licenses = $licenses->TextSearch($request->input('search')); } $licenseCount = $licenses->count(); @@ -357,46 +254,7 @@ class ManufacturersController extends Controller $rows = array(); foreach ($licenses as $license) { - $actions = ''; - - if (Gate::allows('licenses.checkout')) { - $actions .= '' . trans('general.checkout') . ' '; - } - - if (Gate::allows('licenses.create')) { - $actions .= ''; - } - if (Gate::allows('licenses.edit')) { - $actions .= ''; - } - if (Gate::allows('licenses.delete')) { - $actions .= ''; - } - $actions .=''; - - $rows[] = array( - 'id' => $license->id, - 'name' => (string) link_to('/admin/licenses/'.$license->id.'/view', $license->name), - 'serial' => (string) link_to('/admin/licenses/'.$license->id.'/view', mb_strimwidth($license->serial, 0, 50, "...")), - 'totalSeats' => $license->licenseSeatCount, - 'remaining' => $license->remaincount(), - 'license_name' => e($license->license_name), - 'license_email' => e($license->license_email), - 'purchase_date' => ($license->purchase_date) ? $license->purchase_date : '', - 'expiration_date' => ($license->expiration_date) ? $license->expiration_date : '', - 'purchase_cost' => ($license->purchase_cost) ? number_format($license->purchase_cost, 2) : '', - 'purchase_order' => ($license->purchase_order) ? e($license->purchase_order) : '', - 'order_number' => ($license->order_number) ? e($license->order_number) : '', - 'notes' => ($license->notes) ? e($license->notes) : '', - 'actions' => $actions, - 'companyName' => is_null($license->company) ? '' : e($license->company->name), - 'manufacturer' => $license->manufacturer ? (string) link_to('/admin/settings/manufacturers/'.$license->manufacturer_id.'/view', $license->manufacturer->name) : '' - ); + $rows[] = $license->present()->forDataTable(); } $data = array('total' => $licenseCount, 'rows' => $rows); @@ -404,7 +262,7 @@ class ManufacturersController extends Controller return $data; } - public function getDataAccessoriesView(Manufacturer $manufacturer) + public function getDataAccessoriesView(Manufacturer $manufacturer, Request $request) { $manufacturer = $manufacturer->load( 'accessories.location', @@ -412,56 +270,22 @@ class ManufacturersController extends Controller 'accessories.category', 'accessories.manufacturer', 'accessories.users' - ); - $accessories = $manufacturer->accessories; + ); + $accessories = $manufacturer->accessories(); - if (Input::has('search')) { - $accessories = $accessories->TextSearch(e(Input::get('search'))); + if ($request->has('search')) { + $accessories = $accessories->TextSearch(e($request->input('search'))); } - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } + $offset = request('offset', 0); + $limit = request('limit', 50); $accessCount = $accessories->count(); - + $accessories = $accessories->skip($offset)->take($limit)->get(); $rows = array(); foreach ($accessories as $accessory) { - - $actions = ''; - if (Gate::allows('accessories.checkout')) { - $actions .= 'numRemaining() > 0) ? '' : ' disabled') . '>' . trans('general.checkout') . ''; - } - if (Gate::allows('accessories.edit')) { - $actions .= ''; - } - if (Gate::allows('accessories.delete')) { - $actions .= ''; - } - $actions .= ''; - $company = $accessory->company; - - $rows[] = array( - 'name' => ''. $accessory->name.'', - 'category' => ($accessory->category) ? (string)link_to('admin/settings/categories/'.$accessory->category->id.'/view', $accessory->category->name) : '', - 'qty' => e($accessory->qty), - 'order_number' => e($accessory->order_number), - 'min_amt' => e($accessory->min_amt), - 'location' => ($accessory->location) ? e($accessory->location->name): '', - 'purchase_date' => e($accessory->purchase_date), - 'purchase_cost' => number_format($accessory->purchase_cost, 2), - 'numRemaining' => $accessory->numRemaining(), - 'actions' => $actions, - 'companyName' => is_null($company) ? '' : e($company->name), - 'manufacturer' => $accessory->manufacturer ? (string) link_to('/admin/settings/manufacturers/'.$accessory->manufacturer_id.'/view', $accessory->manufacturer->name) : '' - - ); + $rows[] = $accessory->present()->forDataTable(); } $data = array('total'=>$accessCount, 'rows'=>$rows); @@ -469,7 +293,7 @@ class ManufacturersController extends Controller return $data; } - public function getDataConsumablesView($manufacturer) + public function getDataConsumablesView($manufacturer, Request $request) { $manufacturer = $manufacturer->load( 'consumables.location', @@ -478,59 +302,22 @@ class ManufacturersController extends Controller 'consumables.manufacturer', 'consumables.users' ); - $consumables = $manufacturer->consumables; + $consumables = $manufacturer->consumables(); - if (Input::has('search')) { - $consumables = $consumables->TextSearch(e(Input::get('search'))); + if ($request->has('search')) { + $consumables = $consumables->TextSearch(e($request->input('search'))); } - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } + $offset = request('offset', 0); + $limit = request('limit', 50); + $consumCount = $consumables->count(); - + $consumables = $consumables->skip($offset)->take($limit)->get(); $rows = array(); foreach ($consumables as $consumable) { - $actions = ''; - if (Gate::allows('consumables.checkout')) { - $actions .= 'numRemaining() > 0) ? '' : ' disabled') . '>' . trans('general.checkout') . ''; - } - - if (Gate::allows('consumables.edit')) { - $actions .= ''; - } - if (Gate::allows('consumables.delete')) { - $actions .= ''; - } - - $actions .=''; - - $company = $consumable->company; - - $rows[] = array( - 'id' => $consumable->id, - 'name' => (string)link_to('admin/consumables/'.$consumable->id.'/view', e($consumable->name)), - 'location' => ($consumable->location) ? e($consumable->location->name) : '', - 'min_amt' => e($consumable->min_amt), - 'qty' => e($consumable->qty), - 'manufacturer' => ($consumable->manufacturer) ? (string) link_to('/admin/settings/manufacturers/'.$consumable->manufacturer_id.'/view', $consumable->manufacturer->name): '', - 'model_number' => e($consumable->model_number), - 'item_no' => e($consumable->item_no), - 'category' => ($consumable->category) ? (string) link_to('/admin/settings/categories/'.$consumable->category_id.'/view', $consumable->category->name) : 'Missing category', - 'order_number' => e($consumable->order_number), - 'purchase_date' => e($consumable->purchase_date), - 'purchase_cost' => ($consumable->purchase_cost!='') ? number_format($consumable->purchase_cost, 2): '' , - 'numRemaining' => $consumable->numRemaining(), - 'actions' => $actions, - 'companyName' => is_null($company) ? '' : e($company->name), - ); + $rows[] = $consumable->present()->forDataTable(); } $data = array('total' => $consumCount, 'rows' => $rows); diff --git a/app/Http/Controllers/ModalController.php b/app/Http/Controllers/ModalController.php new file mode 100644 index 0000000000..7ae8c61427 --- /dev/null +++ b/app/Http/Controllers/ModalController.php @@ -0,0 +1,32 @@ +with('manufacturer', Helper::manufacturerList()) + ->with('category', Helper::categoryList('asset')); + } + + function statuslabel() { + return view('modals.statuslabel')->with('statuslabel_types', Helper::statusTypeList()); + } + + function supplier() { + return view('modals.supplier'); + } + + function user() { + return view('modals.user'); + } +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index b94f336879..4554b0fea3 100755 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -4,12 +4,13 @@ namespace App\Http\Controllers; use Image; use Input; use Redirect; -use App\Models\Location; use View; use Auth; use App\Helpers\Helper; use App\Models\Setting; use Gate; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Hash; /** * This controller handles all actions related to User Profiles for @@ -24,14 +25,13 @@ class ProfileController extends Controller * * @author [A. Gianotto] [] * @since [v1.0] - * @return View - */ + * @return \Illuminate\Contracts\View\View + */ public function getIndex() { - // Get the user information $user = Auth::user(); $location_list = Helper::locationsList(); - return View::make('account/profile', compact('user'))->with('location_list', $location_list); + return view('account/profile', compact('user'))->with('location_list', $location_list); } /** @@ -39,25 +39,21 @@ class ProfileController extends Controller * * @author [A. Gianotto] [] * @since [v1.0] - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function postIndex() { - // Grab the user $user = Auth::user(); - - // Update the user information - $user->first_name = e(Input::get('first_name')); - $user->last_name = e(Input::get('last_name')); - $user->website = e(Input::get('website')); - $user->location_id = e(Input::get('location_id')); - $user->gravatar = e(Input::get('gravatar')); - $user->locale = e(Input::get('locale')); - + $user->first_name = Input::get('first_name'); + $user->last_name = Input::get('last_name'); + $user->website = Input::get('website'); + $user->location_id = Input::get('location_id'); + $user->gravatar = Input::get('gravatar'); + $user->locale = Input::get('locale'); if ((Gate::allows('self.two_factor')) && ((Setting::getSettings()->two_factor_enabled=='1') && (!config('app.lock_passwords')))) { - $user->two_factor_optin = e(Input::get('two_factor_optin', '0')); + $user->two_factor_optin = Input::get('two_factor_optin', '0'); } if (Input::file('avatar')) { @@ -77,4 +73,75 @@ class ProfileController extends Controller } return redirect()->back()->withInput()->withErrors($user->getErrors()); } + + + /** + * Returns a page with the API token generation interface. + * + * We created a controller method for this because closures aren't allowed + * in the routes file if you want to be able to cache the routes. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function api() { + return view('account/api'); + } + + /** + * User change email page. + * + * @return View + */ + public function password() + { + $user = Auth::user(); + return view('account/change-password', compact('user')); + } + + /** + * Users change password form processing page. + * + * @return Redirect + */ + public function passwordSave(Request $request) + { + + if (config('app.lock_passwords')) { + return redirect()->route('account.password.index')->with('error', Lang::get('admin/users/table.lock_passwords')); + } + + $user = Auth::user(); + if ($user->ldap_import=='1') { + return redirect()->route('account.password.index')->with('error', Lang::get('admin/users/message.error.password_ldap')); + } + + $rules = array( + 'current_password' => 'required', + 'password' => Setting::passwordComplexityRulesSaving('store'), + 'password_confirm' => 'required|same:password', + ); + + $validator = \Validator::make($request->all(), $rules); + $validator->after(function($validator) use ($request, $user) { + + if (!Hash::check($request->input('current_password'), $user->password)) { + $validator->errors()->add('current_password', trans('validation.hashed_pass')); + } + + }); + + if (!$validator->fails()) { + $user->password = Hash::make($request->input('password')); + $user->save(); + return redirect()->route('account.password.index')->with('success', 'Password updated!'); + + } + return redirect()->back()->withInput()->withErrors($validator); + + + } + + } diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 0cc3cdac50..c61ae36a1a 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -6,21 +6,14 @@ use App\Models\Accessory; use App\Models\Actionlog; use App\Models\Asset; use App\Models\AssetMaintenance; -use App\Models\AssetModel; -use App\Models\Company; use App\Models\CustomField; use App\Models\License; -use App\Models\Location; use App\Models\Setting; -use App\Models\User; use Carbon\Carbon; -use Illuminate\Support\Facades\Lang; -use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\View; use Input; use League\Csv\Reader; -use Redirect; use Symfony\Component\HttpFoundation\StreamedResponse; /** @@ -42,8 +35,7 @@ class ReportsController extends Controller public function getAccessoryReport() { $accessories = Accessory::orderBy('created_at', 'DESC')->with('company')->get(); - - return View::make('reports/accessories', compact('accessories')); + return view('reports/accessories', compact('accessories')); } /** @@ -98,7 +90,7 @@ class ReportsController extends Controller public function getAssetsReport() { $settings = \App\Models\Setting::first(); - return View::make('reports/asset', compact('assets'))->with('settings', $settings); + return view('reports/asset', compact('assets'))->with('settings', $settings); } @@ -117,11 +109,11 @@ class ReportsController extends Controller $customfields = CustomField::get(); - $response = new StreamedResponse(function() use ($customfields) { + $response = new StreamedResponse(function () use ($customfields) { // Open output stream $handle = fopen('php://output', 'w'); - Asset::with('assigneduser', 'assetloc','defaultLoc','assigneduser.userloc','model','supplier','assetstatus','model.manufacturer')->orderBy('created_at', 'DESC')->chunk(500, function($assets) use($handle, $customfields) { + Asset::with('assignedTo', 'assetLoc','defaultLoc','assignedTo','model','supplier','assetstatus','model.manufacturer')->orderBy('created_at', 'DESC')->chunk(500, function($assets) use($handle, $customfields) { $headers=[ trans('general.company'), trans('admin/hardware/table.asset_tag'), @@ -140,7 +132,7 @@ class ReportsController extends Controller trans('admin/hardware/table.location'), trans('general.notes'), ]; - foreach($customfields as $field) { + foreach ($customfields as $field) { $headers[]=$field->name; } fputcsv($handle, $headers); @@ -160,13 +152,12 @@ class ReportsController extends Controller ($asset->purchase_cost > 0) ? Helper::formatCurrencyOutput($asset->purchase_cost) : '', ($asset->order_number) ? e($asset->order_number) : '', ($asset->supplier) ? e($asset->supplier->name) : '', - ($asset->assigneduser) ? e($asset->assigneduser->fullName()) : '', + ($asset->assignedTo) ? e($asset->assignedTo->present()->name()) : '', ($asset->last_checkout!='') ? e($asset->last_checkout) : '', - ($asset->assigneduser && $asset->assigneduser->userloc!='') ? - e($asset->assigneduser->userloc->name) : ( ($asset->defaultLoc!='') ? e($asset->defaultLoc->name) : ''), + e($asset->assetLoc->present()->name()), ($asset->notes) ? e($asset->notes) : '', ]; - foreach($customfields as $field) { + foreach ($customfields as $field) { $values[]=$asset->{$field->db_column_name()}; } fputcsv($handle, $values); @@ -195,10 +186,10 @@ class ReportsController extends Controller { // Grab all the assets - $assets = Asset::with('model', 'assigneduser', 'assetstatus', 'defaultLoc', 'assetlog', 'company') + $assets = Asset::with( 'assignedTo', 'assetstatus', 'defaultLoc', 'assetloc', 'assetlog', 'company', 'model.category', 'model.depreciation') ->orderBy('created_at', 'DESC')->get(); - return View::make('reports/depreciation', compact('assets')); + return view('reports/depreciation', compact('assets')); } /** @@ -213,7 +204,7 @@ class ReportsController extends Controller { // Grab all the assets - $assets = Asset::with('model', 'assigneduser', 'assetstatus', 'defaultLoc', 'assetlog') + $assets = Asset::with('model', 'assignedTo', 'assetstatus', 'defaultLoc', 'assetlog') ->orderBy('created_at', 'DESC')->get(); $csv = \League\Csv\Writer::createFromFileObject(new \SplTempFileObject()); @@ -244,15 +235,13 @@ class ReportsController extends Controller $row[] = e($asset->name); $row[] = e($asset->serial); - if ($asset->assigned_to > 0) { - $user = User::find($asset->assigned_to); - $row[] = e($user->fullName()); + if ($target = $asset->assignedTo) { + $row[] = e($target->present()->name()); } else { $row[] = ''; // Empty string if unassigned } - if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id > 0 )) { - $location = Location::find($asset->assigneduser->location_id); + if (( $asset->assigned_to > 0 ) && ( $location = $asset->assetLoc )) { if ($location->city) { $row[] = e($location->city) . ', ' . e($location->state); } elseif ($location->name) { @@ -282,6 +271,20 @@ class ReportsController extends Controller } + + /** + * Displays audit report. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function audit() + { + return view('reports/audit'); + } + + /** * Displays activity report. * @@ -291,137 +294,10 @@ class ReportsController extends Controller */ public function getActivityReport() { - $log_actions = Actionlog::orderBy('created_at', 'DESC') - ->with('item') - ->orderBy('created_at', 'DESC') - ->get(); - return View::make('reports/activity', compact('log_actions')); + return view('reports/activity'); } - /** - * Returns Activity Report JSON. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return View - */ - public function getActivityReportDataTable() - { - $activitylogs = Company::scopeCompanyables(Actionlog::with('item', 'user', 'target'))->orderBy('created_at', 'DESC'); - - if (Input::has('search')) { - $activitylogs = $activitylogs->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - - $allowed_columns = ['created_at']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? e(Input::get('sort')) : 'created_at'; - - - $activityCount = $activitylogs->count(); - $activitylogs = $activitylogs->offset($offset)->limit($limit)->get(); - - $rows = array(); - foreach ($activitylogs as $activity) { - - if ($activity->itemType() == "asset") { - $activity_icons = ''; - } elseif ($activity->itemType() == "accessory") { - $activity_icons = ''; - } elseif ($activity->itemType()=="consumable") { - $activity_icons = ''; - } elseif ($activity->itemType()=="license"){ - $activity_icons = ''; - } elseif ($activity->itemType()=="component") { - $activity_icons = ''; - } else { - $activity_icons = ''; - } - - if (($activity->item) && ($activity->itemType()=="asset")) { - $activity_item = ''.e($activity->item->asset_tag).' - '. e($activity->item->showAssetName()).''; - $item_type = 'asset'; - } elseif ($activity->item) { - - if ($activity->item->deleted_at!='') { - $activity_item = ''. e($activity->item->name).''; - } else { - $activity_item = '' . e($activity->item->name) . ''; - } - - $item_type = $activity->itemType(); - - } else { - $activity_item = "unknown (deleted)"; - $item_type = "null"; - } - - - if (($activity->user) && ($activity->action_type=="uploaded") && ($activity->itemType()=="user")) { - $activity_target = ''.$activity->user->fullName().''; - } elseif ($activity->target_type === "App\Models\Asset") { - if($activity->target) { - $activity_target = ''.$activity->target->showAssetName().''; - } else { - $activity_target = ""; - } - } elseif ( $activity->target_type === "App\Models\User") { - if($activity->target) { - $activity_target = ''.$activity->target->fullName().''; - } else { - $activity_target = ''; - } - } elseif (($activity->action_type=='accepted') || ($activity->action_type=='declined')) { - $activity_target = '' . e($activity->item->assigneduser->fullName()) . ''; - - } elseif ($activity->action_type=='requested') { - if ($activity->user) { - $activity_target = ''.$activity->user->fullName().''; - } else { - $activity_target = ''; - } - } else { - if($activity->target) { - $activity_target = $activity->target->id; - } else { - $activity_target = ""; - } - } - - - $rows[] = array( - 'icon' => $activity_icons, - 'created_at' => date("M d, Y g:iA", strtotime($activity->created_at)), - 'action_type' => strtolower(trans('general.'.str_replace(' ','_',$activity->action_type))), - 'admin' => $activity->user ? (string) link_to('/admin/users/'.$activity->user_id.'/view', $activity->user->fullName()) : '', - 'target' => $activity_target, - 'item' => $activity_item, - 'item_type' => $item_type, - 'note' => e($activity->note), - - ); - } - - $data = array('total'=>$activityCount, 'rows'=>$rows); - - return $data; - - } /** * Displays license report @@ -437,7 +313,7 @@ class ReportsController extends Controller ->with('company') ->get(); - return View::make('reports/licenses', compact('licenses')); + return view('reports/licenses', compact('licenses')); } /** @@ -501,7 +377,7 @@ class ReportsController extends Controller public function getCustomReport() { $customfields = CustomField::get(); - return View::make('reports/custom')->with('customfields', $customfields); + return view('reports/custom')->with('customfields', $customfields); } /** @@ -514,7 +390,7 @@ class ReportsController extends Controller */ public function postCustom() { - $assets = Asset::orderBy('created_at', 'DESC')->with('company','assigneduser', 'assetloc','defaultLoc','assigneduser.userloc','model','supplier','assetstatus','model.manufacturer')->get(); + $assets = Asset::orderBy('created_at', 'DESC')->with('company', 'assignedTo', 'assetloc', 'defaultLoc', 'model', 'supplier', 'assetstatus', 'model.manufacturer')->get(); $customfields = CustomField::get(); $rows = [ ]; @@ -639,7 +515,7 @@ class ReportsController extends Controller $row[] = '"' . Helper::formatCurrencyOutput($asset->purchase_cost) . '"'; } if (e(Input::get('eol')) == '1') { - $row[] = '"' .($asset->eol_date()) ? $asset->eol_date() : ''. '"'; + $row[] = '"' .($asset->present()->eol_date()) ? $asset->present()->eol_date() : ''. '"'; } if (e(Input::get('order')) == '1') { if ($asset->order_number) { @@ -657,44 +533,36 @@ class ReportsController extends Controller } if (e(Input::get('location')) == '1') { - $show_loc = ''; - - - if (($asset->assigned_to > 0) && ($asset->assigneduser) && ($asset->assigneduser->location)) { - $show_loc .= '"' .e($asset->assigneduser->location->name). '"'; - } elseif ($asset->rtd_location_id!='') { - $location = Location::find($asset->rtd_location_id); - if ($location) { - $show_loc .= '"' .e($location->name). '"'; - } else { - $show_loc .= 'Default location '.$asset->rtd_location_id.' is invalid'; - } + if($asset->assetLoc) { + $show_loc = $asset->assetLoc->present()->name(); + } else { + $show_loc = 'Default location '.$asset->rtd_location_id.' is invalid'; } - $row[] = $show_loc; - } if (e(Input::get('assigned_to')) == '1') { - if ($asset->assigneduser) { - $row[] = '"' .e($asset->assigneduser->fullName()). '"'; + if ($asset->assignedTo) { + $row[] = '"' .e($asset->assignedTo->present()->name()). '"'; } else { $row[] = ''; // Empty string if unassigned } } if (e(Input::get('username')) == '1') { - if ($asset->assigneduser) { - $row[] = '"' .e($asset->assigneduser->username). '"'; + // Only works if we're checked out to a user, not anything else. + if ($asset->checkedOutToUser()) { + $row[] = '"' .e($asset->assignedTo->username). '"'; } else { $row[] = ''; // Empty string if unassigned } } if (e(Input::get('employee_num')) == '1') { - if ($asset->assigneduser) { - $row[] = '"' .e($asset->assigneduser->employee_num). '"'; + // Only works if we're checked out to a user, not anything else. + if ($asset->checkedOutToUser()) { + $row[] = '"' .e($asset->assignedTo->employee_num). '"'; } else { $row[] = ''; // Empty string if unassigned } @@ -714,7 +582,7 @@ class ReportsController extends Controller if (e(Input::get('warranty')) == '1') { if ($asset->warranty_months) { $row[] = $asset->warranty_months; - $row[] = $asset->warrantee_expires(); + $row[] = $asset->present()->warrantee_expires(); } else { $row[] = ''; $row[] = ''; @@ -766,7 +634,7 @@ class ReportsController extends Controller ->with('error', trans('admin/reports/message.error')); } } - + /** * getImprovementsReport @@ -782,7 +650,7 @@ class ReportsController extends Controller ->orderBy('created_at', 'DESC') ->get(); - return View::make('reports/asset_maintenances', compact('assetMaintenances')); + return view('reports/asset_maintenances', compact('assetMaintenances')); } @@ -857,7 +725,7 @@ class ReportsController extends Controller { $assetsForReport = Asset::notYetAccepted()->with('company')->get(); - return View::make('reports/unaccepted_assets', compact('assetsForReport')); + return view('reports/unaccepted_assets', compact('assetsForReport')); } /** @@ -891,9 +759,9 @@ class ReportsController extends Controller $row = [ ]; $row[] = str_replace(',', '', e($assetItem->assetlog->model->category->name)); $row[] = str_replace(',', '', e($assetItem->assetlog->model->name)); - $row[] = str_replace(',', '', e($assetItem->assetlog->showAssetName())); + $row[] = str_replace(',', '', e($assetItem->assetlog->present()->name())); $row[] = str_replace(',', '', e($assetItem->assetlog->asset_tag)); - $row[] = str_replace(',', '', e($assetItem->assetlog->assigneduser->fullName())); + $row[] = str_replace(',', '', e($assetItem->assetlog->assignedTo->present()->name())); $rows[] = implode($row, ','); } diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 8d58d3a4e6..c82b8bf2e2 100755 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use Input; use Lang; +use Illuminate\Http\Request; use App\Models\Setting; use App\Models\Ldap; use Redirect; @@ -18,6 +19,8 @@ use Mail; use Auth; use App\Models\User; use App\Http\Requests\SetupUserRequest; +use App\Http\Requests\ImageUploadRequest; +use App\Http\Requests\SettingsLdapRequest; /** * This controller handles all actions related to Settings for @@ -55,23 +58,32 @@ class SettingsController extends Controller $host = $_SERVER['SERVER_NAME']; if (($protocol === 'http://' && $_SERVER['SERVER_PORT'] != '80') || ($protocol === 'https://' && $_SERVER['SERVER_PORT'] != '443')) { - $host .= ':' . $_SERVER['SERVER_PORT']; + $host .= ':' . $_SERVER['SERVER_PORT']; } $pageURL = $protocol . $host . $_SERVER['REQUEST_URI']; - $start_settings['url_valid'] = (config('app.url').'/setup' === $pageURL); + $start_settings['url_valid'] = (url('/').'/setup' === $pageURL); - $start_settings['url_config'] = config('app.url'); + $start_settings['url_config'] = url('/'); $start_settings['real_url'] = $pageURL; + + // Curl the .env file to make sure it's not accessible via a browser + $ch = curl_init($protocol . $host.'/.env'); + curl_setopt($ch, CURLOPT_HEADER, true); // we want headers + curl_setopt($ch, CURLOPT_NOBODY, true); // we don't need body + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + $output = curl_exec($ch); + $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); - $exposed_env = @file_get_contents($protocol . $host.'/.env'); - - if ($exposed_env) { - $start_settings['env_exposed'] = true; - } else { + if ($httpcode == 404 || $httpcode == 403) { $start_settings['env_exposed'] = false; + } else { + $start_settings['env_exposed'] = true; } + if (\App::Environment('production') && (config('app.debug')==true)) { $start_settings['debug_exposed'] = true; } else { @@ -118,7 +130,7 @@ class SettingsController extends Controller $start_settings['gd'] = extension_loaded('gd'); - return View::make('setup/index') + return view('setup/index') ->with('step', 1) ->with('start_settings', $start_settings) ->with('section', 'Pre-Flight Check'); @@ -173,12 +185,14 @@ class SettingsController extends Controller $settings->site_name = e(Input::get('site_name')); $settings->alert_email = e(Input::get('email')); $settings->alerts_enabled = 1; + $settings->pwd_secure_min = 10; $settings->brand = 1; $settings->locale = 'en'; $settings->default_currency = 'USD'; $settings->user_id = 1; $settings->email_domain = e(Input::get('email_domain')); $settings->email_format = e(Input::get('email_format')); + $settings->next_auto_tag_base = 1; if ((!$user->isValid()) || (!$settings->isValid())) { @@ -213,7 +227,7 @@ class SettingsController extends Controller */ public function getSetupUser() { - return View::make('setup/user') + return view('setup/user') ->with('step', 3) ->with('section', 'Create a User'); } @@ -228,7 +242,7 @@ class SettingsController extends Controller public function getSetupDone() { - return View::make('setup/done') + return view('setup/done') ->with('step', 4) ->with('section', 'Done!'); } @@ -247,7 +261,14 @@ class SettingsController extends Controller Artisan::call('migrate', ['--force' => true]); $output = Artisan::output(); - return View::make('setup/migrate') + + if ((!file_exists(storage_path().'/oauth-private.key')) || (!file_exists(storage_path().'/oauth-public.key'))) { + Artisan::call('passport:install'); + Artisan::call('migrate', ['--force' => true]); + } + + + return view('setup/migrate') ->with('output', $output) ->with('step', 2) ->with('section', 'Create Database Tables'); @@ -262,15 +283,15 @@ class SettingsController extends Controller * @since [v1.0] * @return View */ - public function getIndex() + public function index() { $settings = Setting::all(); - return View::make('settings/index', compact('settings')); + return view('settings/index', compact('settings')); } /** - * Return a form to allow a super admin to update settings. + * Return the admin settings page * * @author [A. Gianotto] [] * @since [v1.0] @@ -279,95 +300,471 @@ class SettingsController extends Controller public function getEdit() { $setting = Setting::first(); - $is_gd_installed = extension_loaded('gd'); - - return View::make('settings/edit', compact('setting'))->with('is_gd_installed', $is_gd_installed); + return view('settings/general', compact('setting')); } /** - * Validate and process settings edit form. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return Redirect - */ - public function postEdit() + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getSettings() + { + $setting = Setting::first(); + return view('settings/general', compact('setting')); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postSettings(Request $request) { - // Check if the asset exists if (is_null($setting = Setting::first())) { - // Redirect to the asset management page with error return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } - if (Input::get('clear_logo')=='1') { - $setting->logo = null; - } elseif (Input::file('logo_img')) { - if (!config('app.lock_passwords')) { - $image = Input::file('logo_img'); - $file_name = "logo.".$image->getClientOriginalExtension(); - $path = public_path('uploads/'.$file_name); - Image::make($image->getRealPath())->resize(null, 40, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $setting->logo = $file_name; - } - } - - - if (!config('app.lock_passwords')) { - $setting->site_name = e(Input::get('site_name')); - $setting->brand = e(Input::get('brand')); - $setting->custom_css = e(Input::get('custom_css')); - - if (Input::get('two_factor_enabled')=='') { - $setting->two_factor_enabled = null; - } else { - $setting->two_factor_enabled = e(Input::get('two_factor_enabled')); - } - - } + $setting->full_multiple_companies_support = $request->input('full_multiple_companies_support', '0'); + $setting->load_remote = $request->input('load_remote', '0'); + $setting->email_domain = $request->input('email_domain'); + $setting->email_format = $request->input('email_format'); + $setting->username_format = $request->input('username_format'); + $setting->require_accept_signature = $request->input('require_accept_signature'); + $setting->login_note = $request->input('login_note'); + $setting->default_eula_text = $request->input('default_eula_text'); + $setting->thumbnail_max_h = $request->input('thumbnail_max_h'); if (Input::get('per_page')!='') { - $setting->per_page = e(Input::get('per_page')); + $setting->per_page = $request->input('per_page'); } else { $setting->per_page = 200; } - $setting->locale = e(Input::get('locale', 'en')); - $setting->qr_code = e(Input::get('qr_code', '0')); - $setting->full_multiple_companies_support = e(Input::get('full_multiple_companies_support', '0')); - $setting->alt_barcode = e(Input::get('alt_barcode')); - $setting->alt_barcode_enabled = e(Input::get('alt_barcode_enabled', '0')); - $setting->barcode_type = e(Input::get('barcode_type')); - $setting->load_remote = e(Input::get('load_remote', '0')); - $setting->default_currency = e(Input::get('default_currency', '$')); - $setting->qr_text = e(Input::get('qr_text')); - $setting->auto_increment_prefix = e(Input::get('auto_increment_prefix')); - $setting->auto_increment_assets = e(Input::get('auto_increment_assets', '0')); - $setting->zerofill_count = e(Input::get('zerofill_count')); - $setting->alert_interval = e(Input::get('alert_interval')); - $setting->alert_threshold = e(Input::get('alert_threshold')); - $setting->email_domain = e(Input::get('email_domain')); - $setting->email_format = e(Input::get('email_format')); - $setting->username_format = e(Input::get('username_format')); - $setting->require_accept_signature = e(Input::get('require_accept_signature')); + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } - $setting->labels_per_page = e(Input::get('labels_per_page')); - $setting->labels_width = e(Input::get('labels_width')); - $setting->labels_height = e(Input::get('labels_height')); - $setting->labels_pmargin_left = e(Input::get('labels_pmargin_left')); - $setting->labels_pmargin_right = e(Input::get('labels_pmargin_right')); - $setting->labels_pmargin_top = e(Input::get('labels_pmargin_top')); - $setting->labels_pmargin_bottom = e(Input::get('labels_pmargin_bottom')); - $setting->labels_display_bgutter = e(Input::get('labels_display_bgutter')); - $setting->labels_display_sgutter = e(Input::get('labels_display_sgutter')); - $setting->labels_fontsize = e(Input::get('labels_fontsize')); - $setting->labels_pagewidth = e(Input::get('labels_pagewidth')); - $setting->labels_pageheight = e(Input::get('labels_pageheight')); + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getBranding() + { + $setting = Setting::first(); + return view('settings.branding', compact('setting')); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postBranding(ImageUploadRequest $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + $setting->brand = $request->input('brand', '1'); + $setting->header_color = $request->input('header_color'); + + + // Only allow the site name and CSS to be changed if lock_passwords is false + // Because public demos make people act like dicks + if (!config('app.lock_passwords')) { + $setting->site_name = $request->input('site_name'); + $setting->custom_css = $request->input('custom_css'); + } + + + // If the user wants to clear the logo, reset the brand type + if ($request->input('clear_logo')=='1') { + $setting->logo = null; + $setting->brand = 1; + + // If they are uploading an image, validate it and upload it + } elseif ($request->hasFile('image')) { + + if (!config('app.lock_passwords')) { + $image = $request->file('image'); + $file_name = "logo.".$image->getClientOriginalExtension(); + $path = public_path('uploads'); + if ($image->getClientOriginalExtension()!='svg') { + Image::make($image->getRealPath())->resize(null, 40, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path.'/'.$file_name); + } else { + $image->move($path, $file_name); + } + $setting->logo = $file_name; + } + } + + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getSecurity() + { + $setting = Setting::first(); + return view('settings.security', compact('setting')); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postSecurity(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + + if (!config('app.lock_passwords')) { + + if ($request->input('two_factor_enabled')=='') { + $setting->two_factor_enabled = null; + } else { + $setting->two_factor_enabled = $request->input('two_factor_enabled'); + } + + } + + $setting->pwd_secure_uncommon = (int) $request->input('pwd_secure_uncommon'); + $setting->pwd_secure_min = (int) $request->input('pwd_secure_min'); + $setting->pwd_secure_complexity = ''; + + if ($request->has('pwd_secure_complexity')) { + $setting->pwd_secure_complexity = implode('|', $request->input('pwd_secure_complexity')); + } + + + + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getLocalization() + { + $setting = Setting::first(); + return view('settings.localization', compact('setting')); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postLocalization(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + $setting->locale = $request->input('locale', 'en'); + $setting->default_currency = $request->input('default_currency', '$'); + $setting->date_display_format = $request->input('date_display_format'); + $setting->time_display_format = $request->input('time_display_format'); + + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getAlerts() + { + $setting = Setting::first(); + return view('settings.alerts', compact('setting')); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postAlerts(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + $alert_email = rtrim($request->input('alert_email'), ','); + $alert_email = trim($alert_email); + + $setting->alert_email = $alert_email; + $setting->alerts_enabled = $request->input('alerts_enabled', '0'); + $setting->alert_interval = $request->input('alert_interval'); + $setting->alert_threshold = $request->input('alert_threshold'); + $setting->audit_interval = $request->input('audit_interval'); + $setting->audit_warning_days = $request->input('audit_warning_days'); + + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getSlack() + { + $setting = Setting::first(); + return view('settings.slack', compact('setting')); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postSlack(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + $setting->slack_endpoint = $request->input('slack_endpoint'); + $setting->slack_channel = $request->input('slack_channel'); + $setting->slack_botname = $request->input('slack_botname'); + + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getAssetTags() + { + $setting = Setting::first(); + return view('settings.asset_tags', compact('setting')); + } + + + /** + * Saves settings from form + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postAssetTags(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + $setting->auto_increment_prefix = $request->input('auto_increment_prefix'); + $setting->auto_increment_assets = $request->input('auto_increment_assets', '0'); + $setting->zerofill_count = $request->input('zerofill_count'); + $setting->next_auto_tag_base = $request->input('next_auto_tag_base'); + + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getBarcodes() + { + $setting = Setting::first(); + $is_gd_installed = extension_loaded('gd'); + + return view('settings.barcodes', compact('setting'))->with('is_gd_installed',$is_gd_installed); + } + + + /** + * Saves settings from form + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function postBarcodes(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + $setting->qr_code = $request->input('qr_code', '0'); + $setting->alt_barcode = $request->input('alt_barcode'); + $setting->alt_barcode_enabled = $request->input('alt_barcode_enabled', '0'); + $setting->barcode_type = $request->input('barcode_type'); + $setting->qr_text = $request->input('qr_text'); + + + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function getPhpInfo() + { + if (config('app.debug')=== true) { + return view('settings.phpinfo'); + } + return redirect()->route('settings.index') + ->with('error', 'PHP syetem debugging information is only available when debug is enabled in your .env file.'); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function getLabels() + { + $setting = Setting::first(); + return view('settings.labels', compact('setting')); + } + + + /** + * Saves settings from form + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function postLabels(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + $setting->labels_per_page = $request->input('labels_per_page'); + $setting->labels_width = $request->input('labels_width'); + $setting->labels_height = $request->input('labels_height'); + $setting->labels_pmargin_left = $request->input('labels_pmargin_left'); + $setting->labels_pmargin_right = $request->input('labels_pmargin_right'); + $setting->labels_pmargin_top = $request->input('labels_pmargin_top'); + $setting->labels_pmargin_bottom = $request->input('labels_pmargin_bottom'); + $setting->labels_display_bgutter = $request->input('labels_display_bgutter'); + $setting->labels_display_sgutter = $request->input('labels_display_sgutter'); + $setting->labels_fontsize = $request->input('labels_fontsize'); + $setting->labels_pagewidth = $request->input('labels_pagewidth'); + $setting->labels_pageheight = $request->input('labels_pageheight'); + if (Input::has('labels_display_name')) { @@ -388,68 +785,76 @@ class SettingsController extends Controller $setting->labels_display_tag = 0; } - $alert_email = rtrim(Input::get('alert_email'), ','); - $alert_email = trim($alert_email); - - $setting->alert_email = e($alert_email); - $setting->alerts_enabled = e(Input::get('alerts_enabled', '0')); - $setting->header_color = e(Input::get('header_color')); - $setting->default_eula_text = e(Input::get('default_eula_text')); - $setting->slack_endpoint = e(Input::get('slack_endpoint')); - $setting->slack_channel = e(Input::get('slack_channel')); - $setting->slack_botname = e(Input::get('slack_botname')); - $setting->ldap_enabled = e(Input::get('ldap_enabled', '0')); - $setting->ldap_server = e(Input::get('ldap_server')); - $setting->ldap_server_cert_ignore = e(Input::get('ldap_server_cert_ignore', false)); - $setting->ldap_uname = e(Input::get('ldap_uname')); - if (Input::has('ldap_pword')) { - $setting->ldap_pword = Crypt::encrypt(Input::get('ldap_pword')); + if ($setting->save()) { + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); } - $setting->ldap_basedn = e(Input::get('ldap_basedn')); - $setting->ldap_filter = Input::get('ldap_filter'); - $setting->ldap_username_field = Input::get('ldap_username_field'); - $setting->ldap_lname_field = e(Input::get('ldap_lname_field')); - $setting->ldap_fname_field = e(Input::get('ldap_fname_field')); - $setting->ldap_auth_filter_query = Input::get('ldap_auth_filter_query'); - $setting->ldap_version = e(Input::get('ldap_version')); - $setting->ldap_active_flag = e(Input::get('ldap_active_flag')); - $setting->ldap_emp_num = e(Input::get('ldap_emp_num')); - $setting->ldap_email = e(Input::get('ldap_email')); - $setting->ad_domain = e(Input::get('ad_domain')); - $setting->is_ad = e(Input::get('is_ad', '0')); - $setting->ldap_tls = e(Input::get('ldap_tls', '0')); - $setting->ldap_pw_sync = e(Input::get('ldap_pw_sync', '0')); + return redirect()->back()->withInput()->withErrors($setting->getErrors()); + + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function getLdapSettings() + { + $setting = Setting::first(); + return view('settings.ldap', compact('setting')); + } + + + /** + * Saves settings from form + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function postLdapSettings(Request $request) + { + + if (is_null($setting = Setting::first())) { + return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); + } + + $setting->ldap_enabled = $request->input('ldap_enabled', '0'); + $setting->ldap_server = $request->input('ldap_server'); + $setting->ldap_server_cert_ignore = $request->input('ldap_server_cert_ignore', false); + $setting->ldap_uname = $request->input('ldap_uname'); + if (Input::has('ldap_pword')) { + $setting->ldap_pword = Crypt::encrypt($request->input('ldap_pword')); + } + $setting->ldap_basedn = $request->input('ldap_basedn'); + $setting->ldap_filter = $request->input('ldap_filter'); + $setting->ldap_username_field = $request->input('ldap_username_field'); + $setting->ldap_lname_field = $request->input('ldap_lname_field'); + $setting->ldap_fname_field = $request->input('ldap_fname_field'); + $setting->ldap_auth_filter_query = $request->input('ldap_auth_filter_query'); + $setting->ldap_version = $request->input('ldap_version'); + $setting->ldap_active_flag = $request->input('ldap_active_flag'); + $setting->ldap_emp_num = $request->input('ldap_emp_num'); + $setting->ldap_email = $request->input('ldap_email'); + $setting->ad_domain = $request->input('ad_domain'); + $setting->is_ad = $request->input('is_ad', '0'); + $setting->ldap_tls = $request->input('ldap_tls', '0'); + $setting->ldap_pw_sync = $request->input('ldap_pw_sync', '0'); if ($setting->save()) { - return redirect()->to("admin/settings/app")->with('success', trans('admin/settings/message.update.success')); - } else { - return redirect()->back()->withInput()->withErrors($setting->getErrors()); + return redirect()->route('settings.index') + ->with('success', trans('admin/settings/message.update.success')); } - - - // Redirect to the setting management page - return redirect()->to("admin/settings/app/edit")->with('error', trans('admin/settings/message.update.error')); + return redirect()->back()->withInput()->withErrors($setting->getErrors()); } - public function getLdapTest() { - - try { - $connection = Ldap::connectToLdap(); - try { - Ldap::bindAdminToLdap($connection); - return response()->json(['message' => 'It worked!'], 200); - } catch (\Exception $e) { - return response()->json(['message' => $e->getMessage()], 500); - } - return response()->json(['message' => 'It worked!'], 200); - } catch (\Exception $e) { - return response()->json(['message' => $e->getMessage()], 500); - } - } /** @@ -485,7 +890,7 @@ class SettingsController extends Controller } - return View::make('settings/backups', compact('path', 'files')); + return view('settings/backups', compact('path', 'files')); } @@ -501,10 +906,9 @@ class SettingsController extends Controller { if (!config('app.lock_passwords')) { Artisan::call('backup:run'); - return redirect()->to("admin/settings/backups")->with('success', trans('admin/settings/message.backup.generated')); + return redirect()->route('settings.backups.index')->with('success', trans('admin/settings/message.backup.generated')); } else { - - return redirect()->to("admin/settings/backups")->with('error', trans('general.feature_disabled')); + return redirect()->to("settings.backups.index")->with('error', trans('general.feature_disabled')); } @@ -528,11 +932,11 @@ class SettingsController extends Controller } else { // Redirect to the backup page - return redirect()->route('settings/backups')->with('error', trans('admin/settings/message.backup.file_not_found')); + return redirect()->route('settings.backups.index')->with('error', trans('admin/settings/message.backup.file_not_found')); } } else { // Redirect to the backup page - return redirect()->route('settings/backups')->with('error', trans('general.feature_disabled')); + return redirect()->route('settings.backups.index')->with('error', trans('general.feature_disabled')); } @@ -554,17 +958,29 @@ class SettingsController extends Controller $file = $path.'/'.$filename; if (file_exists($file)) { unlink($file); - return redirect()->route('settings/backups')->with('success', trans('admin/settings/message.backup.file_deleted')); + return redirect()->route('settings.backups.index')->with('success', trans('admin/settings/message.backup.file_deleted')); } else { - return redirect()->route('settings/backups')->with('error', trans('admin/settings/message.backup.file_not_found')); + return redirect()->route('settings.backups.index')->with('error', trans('admin/settings/message.backup.file_not_found')); } } else { - return redirect()->route('settings/backups')->with('error', trans('general.feature_disabled')); + return redirect()->route('settings.backups.index')->with('error', trans('general.feature_disabled')); } } + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function getPurge() + { + return view('settings.purge-form'); + } + /** * Purges soft-deletes * @@ -578,7 +994,7 @@ class SettingsController extends Controller if (Input::get('confirm_purge')=='DELETE') { Artisan::call('snipeit:purge', ['--force'=>'true','--no-interaction'=>true]); $output = Artisan::output(); - return View::make('settings/purge') + return view('settings/purge') ->with('output', $output)->with('success', trans('admin/settings/message.purge.success')); } else { return redirect()->back()->with('error', trans('admin/settings/message.purge.validation_failed')); @@ -588,4 +1004,18 @@ class SettingsController extends Controller return redirect()->back()->with('error', trans('general.feature_disabled')); } } + + /** + * Returns a page with the API token generation interface. + * + * We created a controller method for this because closures aren't allowed + * in the routes file if you want to be able to cache the routes. + * + * @author [A. Gianotto] [] + * @since [v4.0] + * @return View + */ + public function api() { + return view('settings.api'); + } } diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index 08a3df65fe..dc46f283b0 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -27,123 +27,93 @@ class StatuslabelsController extends Controller /** * Show a list of all the statuslabels. * - * @return View + * @return \Illuminate\Contracts\View\View */ - public function getIndex() + public function index() { - // Show the page - return View::make('statuslabels/index', compact('statuslabels')); + return view('statuslabels/index', compact('statuslabels')); } - - /** - * Show a count of assets by status label - * - * @return View - */ - - public function getAssetCountByStatuslabel() + public function show($id) { - $colors = []; - - $statuslabels = Statuslabel::with('assets')->get(); - $labels=[]; - $points=[]; - $colors=[]; - foreach ($statuslabels as $statuslabel) { - if ($statuslabel->assets->count() > 0) { - $labels[]=$statuslabel->name; - $points[]=$statuslabel->assets()->whereNull('assigned_to')->count(); - if ($statuslabel->color!='') { - $colors[]=$statuslabel->color; - } - } - + $statuslabel = Statuslabel::find($id); + if (isset($statuslabel->id)) { + return view('statuslabels/view', compact('statuslabel')); } - $labels[]='Deployed'; - $points[]=Asset::whereNotNull('assigned_to')->count(); - $colors_array = array_merge($colors, Helper::chartColors()); - - $result= [ - "labels" => $labels, - "datasets" => [ [ - "data" => $points, - "backgroundColor" => $colors_array, - "hoverBackgroundColor" => $colors_array - ]] - ]; - return $result; + return redirect()->route('statuslabels.index')->with('error', trans('admin/locations/message.does_not_exist', compact('id'))); } + /** * Statuslabel create. * - * @return View + * @return \Illuminate\Contracts\View\View */ - public function getCreate() + public function create() { // Show the page $item = new Statuslabel; $use_statuslabel_type = $item->getStatuslabelType(); $statuslabel_types = Helper::statusTypeList(); - return View::make('statuslabels/edit', compact('statuslabel_types', 'item'))->with('use_statuslabel_type', $use_statuslabel_type); + return view('statuslabels/edit', compact('statuslabel_types', 'item'))->with('use_statuslabel_type', $use_statuslabel_type); } /** * Statuslabel create form processing. * - * @return Redirect + * @param Request $request + * @return \Illuminate\Http\RedirectResponse */ - public function postCreate(Request $request) + public function store(Request $request) { // create a new model instance - $statuslabel = new Statuslabel(); + $statusLabel = new Statuslabel(); if (!$request->has('statuslabel_types')) { return redirect()->back()->withInput()->withErrors(['statuslabel_types' => trans('validation.statuslabel_type')]); } - $statustype = Statuslabel::getStatuslabelTypesForDB($request->input('statuslabel_types')); + $statusType = Statuslabel::getStatuslabelTypesForDB($request->input('statuslabel_types')); // Save the Statuslabel data - $statuslabel->name = e(Input::get('name')); - $statuslabel->user_id = Auth::user()->id; - $statuslabel->notes = e(Input::get('notes')); - $statuslabel->deployable = $statustype['deployable']; - $statuslabel->pending = $statustype['pending']; - $statuslabel->archived = $statustype['archived']; - $statuslabel->color = e(Input::get('color')); - $statuslabel->show_in_nav = e(Input::get('show_in_nav'),0); + $statusLabel->name = Input::get('name'); + $statusLabel->user_id = Auth::id(); + $statusLabel->notes = Input::get('notes'); + $statusLabel->deployable = $statusType['deployable']; + $statusLabel->pending = $statusType['pending']; + $statusLabel->archived = $statusType['archived']; + $statusLabel->color = Input::get('color'); + $statusLabel->show_in_nav = Input::get('show_in_nav', 0); // Was the asset created? - if ($statuslabel->save()) { + if ($statusLabel->save()) { // Redirect to the new Statuslabel page - return redirect()->to("admin/settings/statuslabels")->with('success', trans('admin/statuslabels/message.create.success')); + return redirect()->route('statuslabels.index')->with('success', trans('admin/statuslabels/message.create.success')); } - - return redirect()->back()->withInput()->withErrors($statuslabel->getErrors()); - + return redirect()->back()->withInput()->withErrors($statusLabel->getErrors()); } - public function store(Request $request) + /** + * @param Request $request + * @return JsonResponse + */ + public function apiStore(Request $request) { - $statuslabel = new Statuslabel(); if (!$request->has('statuslabel_types')) { return JsonResponse::create(["error" => trans('validation.statuslabel_type')], 500); } - $statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('statuslabel_types')); - $statuslabel->name = e(Input::get('name')); - $statuslabel->user_id = Auth::user()->id; + $statuslabel->name = Input::get('name'); + $statuslabel->user_id = Auth::id(); $statuslabel->notes = ''; $statuslabel->deployable = $statustype['deployable']; $statuslabel->pending = $statustype['pending']; @@ -164,21 +134,21 @@ class StatuslabelsController extends Controller * Statuslabel update. * * @param int $statuslabelId - * @return View + * @return \Illuminate\Contracts\View\View */ - public function getEdit($statuslabelId = null) + public function edit($statuslabelId = null) { // Check if the Statuslabel exists if (is_null($item = Statuslabel::find($statuslabelId))) { // Redirect to the blogs management page - return redirect()->to('admin/settings/statuslabels')->with('error', trans('admin/statuslabels/message.does_not_exist')); + return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); } $use_statuslabel_type = $item->getStatuslabelType(); $statuslabel_types = array('' => trans('admin/hardware/form.select_statustype')) + array('undeployable' => trans('admin/hardware/general.undeployable')) + array('pending' => trans('admin/hardware/general.pending')) + array('archived' => trans('admin/hardware/general.archived')) + array('deployable' => trans('admin/hardware/general.deployable')); - return View::make('statuslabels/edit', compact('item', 'statuslabel_types'))->with('use_statuslabel_type', $use_statuslabel_type); + return view('statuslabels/edit', compact('item', 'statuslabel_types'))->with('use_statuslabel_type', $use_statuslabel_type); } @@ -186,14 +156,14 @@ class StatuslabelsController extends Controller * Statuslabel update form processing page. * * @param int $statuslabelId - * @return Redirect + * @return \Illuminate\Http\RedirectResponse */ - public function postEdit(Request $request, $statuslabelId = null) + public function update(Request $request, $statuslabelId = null) { // Check if the Statuslabel exists if (is_null($statuslabel = Statuslabel::find($statuslabelId))) { // Redirect to the blogs management page - return redirect()->to('admin/settings/statuslabels')->with('error', trans('admin/statuslabels/message.does_not_exist')); + return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); } if (!$request->has('statuslabel_types')) { @@ -202,128 +172,46 @@ class StatuslabelsController extends Controller // Update the Statuslabel data - $statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('statuslabel_types')); - $statuslabel->name = e(Input::get('name')); - $statuslabel->notes = e(Input::get('notes')); + $statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('statuslabel_types')); + $statuslabel->name = Input::get('name'); + $statuslabel->notes = Input::get('notes'); $statuslabel->deployable = $statustype['deployable']; $statuslabel->pending = $statustype['pending']; $statuslabel->archived = $statustype['archived']; - $statuslabel->color = e(Input::get('color')); - $statuslabel->show_in_nav = e(Input::get('show_in_nav'),0); + $statuslabel->color = Input::get('color'); + $statuslabel->show_in_nav = Input::get('show_in_nav', 0); // Was the asset created? if ($statuslabel->save()) { // Redirect to the saved Statuslabel page - return redirect()->to("admin/settings/statuslabels/")->with('success', trans('admin/statuslabels/message.update.success')); - } else { - return redirect()->back()->withInput()->withErrors($statuslabel->getErrors()); + return redirect()->route("statuslabels.index")->with('success', trans('admin/statuslabels/message.update.success')); } - - - // Redirect to the Statuslabel management page - return redirect()->to("admin/settings/statuslabels/$statuslabelId/edit")->with('error', trans('admin/statuslabels/message.update.error')); - + return redirect()->back()->withInput()->withErrors($statuslabel->getErrors()); } /** * Delete the given Statuslabel. * * @param int $statuslabelId - * @return Redirect + * @return \Illuminate\Http\RedirectResponse */ - public function getDelete($statuslabelId) + public function destroy($statuslabelId) { // Check if the Statuslabel exists if (is_null($statuslabel = Statuslabel::find($statuslabelId))) { // Redirect to the blogs management page - return redirect()->to('admin/settings/statuslabels')->with('error', trans('admin/statuslabels/message.not_found')); + return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.not_found')); } - if ($statuslabel->has_assets() > 0) { - - // Redirect to the asset management page - return redirect()->to('admin/settings/statuslabels')->with('error', trans('admin/statuslabels/message.assoc_assets')); - } else { - + if ($statuslabel->has_assets() == 0) { $statuslabel->delete(); - // Redirect to the statuslabels management page - return redirect()->to('admin/settings/statuslabels')->with('success', trans('admin/statuslabels/message.delete.success')); + return redirect()->route('statuslabels.index')->with('success', trans('admin/statuslabels/message.delete.success')); } - - - + // Redirect to the asset management page + return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.assoc_assets')); } - - public function getDatatable() - { - $statuslabels = Statuslabel::select(array('id','name','deployable','pending','archived','color','show_in_nav')) - ->whereNull('deleted_at'); - - if (Input::has('search')) { - $statuslabels = $statuslabels->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $allowed_columns = ['id','name']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - - $statuslabels->orderBy($sort, $order); - - $statuslabelsCount = $statuslabels->count(); - $statuslabels = $statuslabels->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($statuslabels as $statuslabel) { - - if ($statuslabel->deployable == 1) { - $label_type = trans('admin/statuslabels/table.deployable'); - } elseif ($statuslabel->pending == 1) { - $label_type = trans('admin/statuslabels/table.pending'); - } elseif ($statuslabel->archived == 1) { - $label_type = trans('admin/statuslabels/table.archived'); - } else { - $label_type = trans('admin/statuslabels/table.undeployable'); - } - - $actions = ''; - - if ($statuslabel->color!='') { - $color = '
    '.e($statuslabel->color); - } else { - $color = ''; - } - - - $rows[] = array( - 'id' => e($statuslabel->id), - 'type' => e($label_type), - 'name' => e($statuslabel->name), - 'color' => $color, - 'show_in_nav' => ($statuslabel->show_in_nav=='1') ? trans('general.yes') : trans('general.no'), - 'actions' => $actions - ); - } - - $data = array('total' => $statuslabelsCount, 'rows' => $rows); - - return $data; - - } } diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index d6114c2b05..dab7ba874b 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -1,6 +1,7 @@ get(); // Show the page - return View::make('suppliers/index', compact('suppliers')); + return view('suppliers/index', compact('suppliers')); } /** * Supplier create. * - * @return View + * @return \Illuminate\Contracts\View\View */ - public function getCreate() + public function create() { - return View::make('suppliers/edit')->with('item', new Supplier); + return view('suppliers/edit')->with('item', new Supplier); } /** * Supplier create form processing. * - * @return Redirect + * @param Request $request + * @return \Illuminate\Http\RedirectResponse */ - public function postCreate() + public function store(Request $request) { - - // get the POST data - $new = Input::all(); - // Create a new supplier $supplier = new Supplier; // Save the location data - $supplier->name = e(Input::get('name')); - $supplier->address = e(Input::get('address')); - $supplier->address2 = e(Input::get('address2')); - $supplier->city = e(Input::get('city')); - $supplier->state = e(Input::get('state')); - $supplier->country = e(Input::get('country')); - $supplier->zip = e(Input::get('zip')); - $supplier->contact = e(Input::get('contact')); - $supplier->phone = e(Input::get('phone')); - $supplier->fax = e(Input::get('fax')); - $supplier->email = e(Input::get('email')); - $supplier->notes = e(Input::get('notes')); - $supplier->url = $supplier->addhttp(e(Input::get('url'))); - $supplier->user_id = Auth::user()->id; - - - + $supplier->name = request('name'); + $supplier->address = request('address'); + $supplier->address2 = request('address2'); + $supplier->city = request('city'); + $supplier->state = request('state'); + $supplier->country = request('country'); + $supplier->zip = request('zip'); + $supplier->contact = request('contact'); + $supplier->phone = request('phone'); + $supplier->fax = request('fax'); + $supplier->email = request('email'); + $supplier->notes = request('notes'); + $supplier->url = $supplier->addhttp(request('url')); + $supplier->user_id = Auth::id(); if (Input::file('image')) { - $image = Input::file('image'); + $image = $request->file('image'); $file_name = str_random(25).".".$image->getClientOriginalExtension(); $path = public_path('uploads/suppliers/'.$file_name); Image::make($image->getRealPath())->resize(300, null, function ($constraint) { @@ -95,43 +90,43 @@ class SuppliersController extends Controller // Was it created? if ($supplier->save()) { // Redirect to the new supplier page - return redirect()->to("admin/settings/suppliers")->with('success', trans('admin/suppliers/message.create.success')); + return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success')); } - - return redirect()->back()->withInput()->withErrors($supplier->getErrors()); - } - public function store(Request $request) + /** + * @param Request $request + * @return JsonResponse + */ + public function apiStore(Request $request) { $supplier = new Supplier; - $supplier->name = e($request->input('name')); - $supplier->user_id = Auth::user()->id; + $supplier->name = $request->input('name'); + $supplier->user_id = Auth::id(); if ($supplier->save()) { return JsonResponse::create($supplier); } return JsonResponse::create(["error" => "Failed validation: ".print_r($supplier->getErrors(), true)], 500); - return JsonResponse::create(["error" => "Couldn't save Supplier"]); } /** * Supplier update. * * @param int $supplierId - * @return View + * @return \Illuminate\Contracts\View\View */ - public function getEdit($supplierId = null) + public function edit($supplierId = null) { // Check if the supplier exists if (is_null($item = Supplier::find($supplierId))) { // Redirect to the supplier page - return redirect()->to('admin/settings/suppliers')->with('error', trans('admin/suppliers/message.does_not_exist')); + return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist')); } // Show the page - return View::make('suppliers/edit', compact('item')); + return view('suppliers/edit', compact('item')); } @@ -139,33 +134,33 @@ class SuppliersController extends Controller * Supplier update form processing page. * * @param int $supplierId - * @return Redirect + * @return \Illuminate\Http\RedirectResponse */ - public function postEdit($supplierId = null) + public function update($supplierId = null, Request $request) { // Check if the supplier exists if (is_null($supplier = Supplier::find($supplierId))) { // Redirect to the supplier page - return redirect()->to('admin/settings/suppliers')->with('error', trans('admin/suppliers/message.does_not_exist')); + return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist')); } // Save the data - $supplier->name = e(Input::get('name')); - $supplier->address = e(Input::get('address')); - $supplier->address2 = e(Input::get('address2')); - $supplier->city = e(Input::get('city')); - $supplier->state = e(Input::get('state')); - $supplier->country = e(Input::get('country')); - $supplier->zip = e(Input::get('zip')); - $supplier->contact = e(Input::get('contact')); - $supplier->phone = e(Input::get('phone')); - $supplier->fax = e(Input::get('fax')); - $supplier->email = e(Input::get('email')); - $supplier->url = $supplier->addhttp(e(Input::get('url'))); - $supplier->notes = e(Input::get('notes')); + $supplier->name = request('name'); + $supplier->address = request('address'); + $supplier->address2 = request('address2'); + $supplier->city = request('city'); + $supplier->state = request('state'); + $supplier->country = request('country'); + $supplier->zip = request('zip'); + $supplier->contact = request('contact'); + $supplier->phone = request('phone'); + $supplier->fax = request('fax'); + $supplier->email = request('email'); + $supplier->url = $supplier->addhttp(request('url')); + $supplier->notes = request('notes'); if (Input::file('image')) { - $image = Input::file('image'); + $image = $request->file('image'); $file_name = str_random(25).".".$image->getClientOriginalExtension(); $path = public_path('uploads/suppliers/'.$file_name); Image::make($image->getRealPath())->resize(300, null, function ($constraint) { @@ -175,12 +170,12 @@ class SuppliersController extends Controller $supplier->image = $file_name; } - if (Input::get('image_delete') == 1 && Input::file('image') == "") { + if (request('image_delete') == 1 && $request->file('image') == "") { $supplier->image = null; } if ($supplier->save()) { - return redirect()->to("admin/settings/suppliers")->with('success', trans('admin/suppliers/message.update.success')); + return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.update.success')); } return redirect()->back()->withInput()->withErrors($supplier->getErrors()); @@ -191,107 +186,49 @@ class SuppliersController extends Controller * Delete the given supplier. * * @param int $supplierId - * @return Redirect + * @return \Illuminate\Http\RedirectResponse */ - public function getDelete($supplierId) + public function destroy($supplierId) { // Check if the supplier exists if (is_null($supplier = Supplier::find($supplierId))) { // Redirect to the suppliers page - return redirect()->to('admin/settings/suppliers')->with('error', trans('admin/suppliers/message.not_found')); + return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.not_found')); } - if ($supplier->num_assets() > 0) { - - // Redirect to the asset management page - return redirect()->to('admin/settings/suppliers')->with('error', trans('admin/suppliers/message.assoc_users')); - } else { - + if ($supplier->num_assets() == 0) { // Delete the supplier $supplier->delete(); - // Redirect to the suppliers management page - return redirect()->to('admin/settings/suppliers')->with('success', trans('admin/suppliers/message.delete.success')); + return redirect()->route('suppliers.index')->with( + 'success', + trans('admin/suppliers/message.delete.success') + ); } - + // Redirect to the asset management page + return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.assoc_users')); } /** - * Get the asset information to present to the supplier view page - * - * @param int $assetId - * @return View - **/ - public function getView($supplierId = null) + * Get the asset information to present to the supplier view page + * + * @param null $supplierId + * @return \Illuminate\Contracts\View\View + * @internal param int $assetId + */ + public function show($supplierId = null) { $supplier = Supplier::find($supplierId); if (isset($supplier->id)) { - return View::make('suppliers/view', compact('supplier')); - } else { - // Prepare the error message - $error = trans('admin/suppliers/message.does_not_exist', compact('id')); - - // Redirect to the user management page - return redirect()->route('suppliers')->with('error', $error); + return view('suppliers/view', compact('supplier')); } + // Prepare the error message + $error = trans('admin/suppliers/message.does_not_exist', compact('id')); - + // Redirect to the user management page + return redirect()->route('suppliers')->with('error', $error); } - public function getDatatable() - { - $suppliers = Supplier::with('assets', 'licenses')->select(array('id','name','address','address2','city','state','country','fax', 'phone','email','contact')) - ->whereNull('deleted_at'); - - if (Input::has('search')) { - $suppliers = $suppliers->TextSearch(e(Input::get('search'))); - } - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - $allowed_columns = ['id','name','address','phone','contact','fax','email']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - - $suppliers->orderBy($sort, $order); - - $suppliersCount = $suppliers->count(); - $suppliers = $suppliers->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($suppliers as $supplier) { - $actions = ''; - - $rows[] = array( - 'id' => $supplier->id, - 'name' => (string)link_to('admin/settings/suppliers/'.$supplier->id.'/view', e($supplier->name)), - 'contact' => e($supplier->contact), - 'address' => e($supplier->address).' '.e($supplier->address2).' '.e($supplier->city).' '.e($supplier->state).' '.e($supplier->country), - 'phone' => e($supplier->phone), - 'fax' => e($supplier->fax), - 'email' => ($supplier->email!='') ? ''.e($supplier->email).'' : '', - 'assets' => $supplier->assets->count(), - 'licenses' => $supplier->licenses->count(), - 'actions' => $actions - ); - } - - $data = array('total' => $suppliersCount, 'rows' => $rows); - - return $data; - - } } diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index a5a59ff9a0..62360ff51c 100755 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -10,10 +10,9 @@ use App\Models\Asset; use App\Models\Group; use App\Models\Company; use App\Models\Location; +use App\Models\License; use App\Models\Setting; -use App\Models\Statuslabel; use App\Http\Requests\SaveUserRequest; -use App\Http\Requests\UpdateUserRequest; use Symfony\Component\HttpFoundation\StreamedResponse; use App\Models\User; use App\Models\Ldap; @@ -22,7 +21,6 @@ use Config; use Crypt; use DB; use HTML; -use Illuminate\Support\Facades\Log; use Input; use Lang; use League\Csv\Reader; @@ -55,11 +53,12 @@ class UsersController extends Controller * @author [A. Gianotto] [] * @see UsersController::getDatatable() method that generates the JSON response * @since [v1.0] - * @return View - */ - public function getIndex() + * @return \Illuminate\Contracts\View\View + */ + public function index() { - return View::make('users/index'); + $this->authorize('index', User::class); + return view('users/index'); } /** @@ -67,11 +66,11 @@ class UsersController extends Controller * * @author [A. Gianotto] [] * @since [v1.0] - * @return View - */ - public function getCreate() + * @return \Illuminate\Contracts\View\View + */ + public function create() { - + $this->authorize('create', User::class); $groups = Group::pluck('name', 'id'); if (Input::old('groups')) { @@ -84,14 +83,11 @@ class UsersController extends Controller $userPermissions = Helper::selectedPermissionsArray($permissions, Input::old('permissions', array())); $permissions = $this->filterDisplayable($permissions); - $location_list = Helper::locationsList(); - $manager_list = Helper::managerList(); - $company_list = Helper::companyList(); - - return View::make('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) - ->with('location_list', $location_list) - ->with('manager_list', $manager_list) - ->with('company_list', $company_list) + return view('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) + ->with('location_list', Helper::locationsList()) + ->with('manager_list', Helper::managerList()) + ->with('company_list', Helper::companyList()) + ->with('department_list', Helper::departmentList()) ->with('user', new User); } @@ -100,11 +96,11 @@ class UsersController extends Controller * * @author [A. Gianotto] [] * @since [v1.0] - * @return Redirect - */ - public function postCreate(SaveUserRequest $request) + * @return \Illuminate\Http\RedirectResponse + */ + public function store(SaveUserRequest $request) { - + $this->authorize('create', User::class); $user = new User; //Username, email, and password need to be handled specially because the need to respect config values on an edit. $user->email = $data['email'] = e($request->input('email')); @@ -114,17 +110,18 @@ class UsersController extends Controller $data['password'] = $request->input('password'); } // Update the user - $user->first_name = e($request->input('first_name')); - $user->last_name = e($request->input('last_name')); - $user->locale = e($request->input('locale')); - $user->employee_num = e($request->input('employee_num')); - $user->activated = e($request->input('activated', $user->activated)); - $user->jobtitle = e($request->input('jobtitle')); - $user->phone = e($request->input('phone')); - $user->location_id = e($request->input('location_id')); - $user->company_id = e(Company::getIdForUser($request->input('company_id'))); - $user->manager_id = e($request->input('manager_id')); - $user->notes = e($request->input('notes')); + $user->first_name = $request->input('first_name'); + $user->last_name = $request->input('last_name'); + $user->locale = $request->input('locale'); + $user->employee_num = $request->input('employee_num'); + $user->activated = $request->input('activated', $user->activated); + $user->jobtitle = $request->input('jobtitle'); + $user->phone = $request->input('phone'); + $user->location_id = $request->input('location_id', null); + $user->department_id = $request->input('department_id', null); + $user->company_id = Company::getIdForUser($request->input('company_id', null)); + $user->manager_id = $request->input('manager_id', null); + $user->notes = $request->input('notes'); // Strip out the superuser permission if the user isn't a superadmin $permissions_array = $request->input('permission'); @@ -132,24 +129,8 @@ class UsersController extends Controller if (!Auth::user()->isSuperUser()) { unset($permissions_array['superuser']); } - $user->permissions = json_encode($permissions_array); - - - if ($user->manager_id == "") { - $user->manager_id = null; - } - - if ($user->location_id == "") { - $user->location_id = null; - } - - if ($user->company_id == "") { - $user->company_id = null; - } - - if ($user->save()) { if ($request->has('groups')) { @@ -172,13 +153,9 @@ class UsersController extends Controller $m->subject(trans('mail.welcome', ['name' => $user->first_name])); }); } - return redirect::route('users')->with('success', trans('admin/users/message.success.create')); + return redirect::route('users.index')->with('success', trans('admin/users/message.success.create')); } - return redirect()->back()->withInput()->withErrors($user->getErrors()); - - - } /** @@ -189,35 +166,34 @@ class UsersController extends Controller * @since [v1.8] * @return string JSON */ - public function store() + public function apiStore(SaveUserRequest $request) { + $this->authorize('create', User::class); $user = new User; $inputs = Input::except('csrf_token', 'password_confirm', 'groups', 'email_user'); $inputs['activated'] = true; - $user->first_name = e(Input::get('first_name')); - $user->last_name = e(Input::get('last_name')); - $user->username = e(Input::get('username')); - $user->email = e(Input::get('email')); - if (Input::has('password')) { - $user->password = bcrypt(Input::get('password')); + $user->first_name = $request->input('first_name'); + $user->last_name = $request->input('last_name'); + $user->username = $request->input('username'); + $user->email = $request->input('email'); + $user->department_id = $request->input('department_id', null); + if ($request->has('password')) { + $user->password = bcrypt($request->input('password')); } - $user->activated = true; - - - // Was the user created? + // Was the user created? if ($user->save()) { if (Input::get('email_user') == 1) { // Send the credentials through email $data = array(); - $data['email'] = e(Input::get('email')); - $data['first_name'] = e(Input::get('first_name')); - $data['last_name'] = e(Input::get('last_name')); - $data['password'] = e(Input::get('password')); + $data['email'] = $request->input('email'); + $data['first_name'] = $request->input('first_name'); + $data['last_name'] = $request->input('last_name'); + $data['password'] = $request->input('password'); Mail::send('emails.send-login', $data, function ($m) use ($user) { $m->to($user->email, $user->first_name . ' ' . $user->last_name); @@ -228,43 +204,38 @@ class UsersController extends Controller return JsonResponse::create($user); - } else { - return JsonResponse::create(["error" => "Failed validation: " . print_r($user->getErrors(), true)], 500); } - - - + return JsonResponse::create(["error" => "Failed validation: " . print_r($user->getErrors(), true)], 500); } /** - * Returns a view that displays the edit user form - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $id - * @return View - */ + * Returns a view that displays the edit user form + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param $permissions + * @return View + * @internal param int $id + */ - private function filterDisplayable($permissions) { + private function filterDisplayable($permissions) + { $output = null; - foreach($permissions as $key=>$permission) { - $output[$key] = array_filter($permission, function($p) { + foreach ($permissions as $key => $permission) { + $output[$key] = array_filter($permission, function ($p) { return $p['display'] === true; }); - } + } return $output; } - public function getEdit($id = null) + public function edit($id) { try { - // Get the user information - $user = User::find($id); - $permissions = config('permissions'); - if (!Company::isCurrentUserHasAccess($user)) { - return redirect()->route('users')->with('error', trans('general.insufficient_permissions')); - } + $user = User::find($id); + $this->authorize('update', $user); + $permissions = config('permissions'); $groups = Group::pluck('name', 'id'); @@ -272,33 +243,31 @@ class UsersController extends Controller $user->permissions = $user->decodePermissions(); $userPermissions = Helper::selectedPermissionsArray($permissions, $user->permissions); $permissions = $this->filterDisplayable($permissions); - $location_list = Helper::locationsList(); - $company_list = Helper::companyList(); - $manager_list = Helper::managerList(); + } catch (UserNotFoundException $e) { - // Prepare the error message - $error = trans('admin/users/message.user_not_found', compact('id')); - // Redirect to the user management page - return redirect()->route('users')->with('error', $error); + $error = trans('admin/users/message.user_not_found', compact('id')); + return redirect()->route('users.index')->with('error', $error); } // Show the page - return View::make('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions')) - ->with('location_list', $location_list) - ->with('company_list', $company_list) - ->with('manager_list', $manager_list); + return view('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions')) + ->with('location_list', Helper::locationsList()) + ->with('department_list', Helper::departmentList()) + ->with('company_list', Helper::companyList()) + ->with('manager_list', Helper::managerList()); } /** - * Validate and save edited user data from edit form. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $id - * @return Redirect - */ - public function postEdit(UpdateUserRequest $request, $id = null) + * Validate and save edited user data from edit form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param UpdateUserRequest $request + * @param int $id + * @return \Illuminate\Http\RedirectResponse + */ + public function update(SaveUserRequest $request, $id = null) { // We need to reverse the UI specific logic for our // permissions here before we update the user. @@ -306,34 +275,25 @@ class UsersController extends Controller app('request')->request->set('permissions', $permissions); // Only update the email address if locking is set to false if (config('app.lock_passwords')) { - return redirect()->route('users')->with('error', 'Denied! You cannot update user information on the demo.'); + return redirect()->route('users.index')->with('error', 'Denied! You cannot update user information on the demo.'); } try { $user = User::find($id); - + $this->authorize('update', $user); // Figure out of this user was an admin before this edit $orig_permissions_array = $user->decodePermissions(); - + $orig_superuser = '0'; if (is_array($orig_permissions_array)) { if (array_key_exists('superuser', $orig_permissions_array)) { $orig_superuser = $orig_permissions_array['superuser']; - } else { - $orig_superuser = '0'; } - } else { - $orig_superuser = '0'; } - - if (!Company::isCurrentUserHasAccess($user)) { - return redirect()->route('users')->with('error', trans('general.insufficient_permissions')); - } - } catch (UserNotFoundException $e) { $error = trans('admin/users/message.user_not_found', compact('id')); - return redirect()->route('users')->with('error', $error); + return redirect()->route('users.index')->with('error', $error); } @@ -346,29 +306,33 @@ class UsersController extends Controller } } + + if ($request->has('username')) { + $user->username = $request->input('username'); + } + $user->email = $request->input('email'); + + + // Update the user + $user->first_name = $request->input('first_name'); + $user->last_name = $request->input('last_name'); + $user->two_factor_optin = $request->input('two_factor_optin') ?: 0; + $user->locale = $request->input('locale'); + $user->employee_num = $request->input('employee_num'); + $user->activated = $request->input('activated', $user->activated); + $user->jobtitle = $request->input('jobtitle'); + $user->phone = $request->input('phone'); + $user->location_id = $request->input('location_id', null); + $user->company_id = Company::getIdForUser($request->input('company_id', null)); + $user->manager_id = $request->input('manager_id', null); + $user->notes = $request->input('notes'); + $user->department_id = $request->input('department_id', null); + + // Do we want to update the user password? if ($request->has('password')) { $user->password = bcrypt($request->input('password')); } - if ( $request->has('username')) { - $user->username = e($request->input('username')); - } - $user->email = e($request->input('email')); - - - // Update the user - $user->first_name = e($request->input('first_name')); - $user->last_name = e($request->input('last_name')); - $user->two_factor_optin = e($request->input('two_factor_optin')); - $user->locale = e($request->input('locale')); - $user->employee_num = e($request->input('employee_num')); - $user->activated = e($request->input('activated', $user->activated)); - $user->jobtitle = e($request->input('jobtitle')); - $user->phone = e($request->input('phone')); - $user->location_id = e($request->input('location_id')); - $user->company_id = e(Company::getIdForUser($request->input('company_id'))); - $user->manager_id = e($request->input('manager_id')); - $user->notes = e($request->input('notes')); // Strip out the superuser permission if the user isn't a superadmin $permissions_array = $request->input('permission'); @@ -376,37 +340,18 @@ class UsersController extends Controller if (!Auth::user()->isSuperUser()) { unset($permissions_array['superuser']); $permissions_array['superuser'] = $orig_superuser; - } - + } $user->permissions = json_encode($permissions_array); - if ($user->manager_id == "") { - $user->manager_id = null; - } - - if ($user->location_id == "") { - $user->location_id = null; - } - - if ($user->company_id == "") { - $user->company_id = null; - } - - - // Was the user updated? + // Was the user updated? if ($user->save()) { - - // Prepare the success message $success = trans('admin/users/message.success.update'); - // Redirect to the user page - return redirect()->route('users')->with('success', $success); + return redirect()->route('users.index')->with('success', $success); } - - return redirect()->back()->withInput()->withErrors($user->getErrors()); - + return redirect()->back()->withInput()->withErrors($user->getErrors()); } /** @@ -415,50 +360,50 @@ class UsersController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $id - * @return Redirect - */ - public function getDelete($id = null) + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($id = null) { try { // Get user information $user = User::find($id); + // Authorize takes care of many of our logic checks now. + $this->authorize('delete', User::class); // Check if we are not trying to delete ourselves if ($user->id === Auth::user()->id) { // Redirect to the user management page - return redirect()->route('users')->with('error', trans('admin/users/message.error.delete')); + return redirect()->route('users.index')->with('error', 'This user still has ' . $user->assets()->count() . ' assets associated with them.'); } - // Do we have permission to delete this user? - if ((Gate::denies('users.delete') || (config('app.lock_passwords')))) { - return redirect()->route('users')->with('error', 'Insufficient permissions!'); - } - - if (count($user->assets) > 0) { - + if ($user->licenses()->count() > 0) { // Redirect to the user management page - return redirect()->route('users')->with('error', 'This user still has ' . count($user->assets) . ' assets associated with them.'); + return redirect()->route('users.index')->with('error', 'This user still has ' . $user->assets()->count() . ' assets associated with them.'); } - if (count($user->licenses) > 0) { - + if ($user->accessories()->count() > 0) { // Redirect to the user management page - return redirect()->route('users')->with('error', 'This user still has ' . count($user->licenses) . ' licenses associated with them.'); + return redirect()->route('users.index')->with('error', 'This user still has ' . $user->accessories()->count() . ' accessories associated with them.'); } - if (count($user->accessories) > 0) { - + if ($user->managedLocations()->count() > 0) { // Redirect to the user management page - return redirect()->route('users')->with('error', 'This user still has ' . count($user->accessories) . ' accessories associated with them.'); + return redirect()->route('users.index')->with('error', 'This user still has ' . $user->managedLocations()->count() . ' locations that they manage.'); } // Delete the user $user->delete(); - $success = trans('admin/users/message.success.delete'); - return redirect()->route('users')->with('success', $success); + // Prepare the success message + $success = trans('admin/users/message.success.delete'); + + // Redirect to the user management page + return redirect()->route('users.index')->with('success', $success); } catch (UserNotFoundException $e) { - return redirect()->route('users')->with('error', trans('admin/users/message.user_not_found', compact('id'))); + // Prepare the error message + $error = trans('admin/users/message.user_not_found', compact('id')); + // Redirect to the user management page + return redirect()->route('users.index')->with('error', $error); } } @@ -467,44 +412,122 @@ class UsersController extends Controller * * @author [A. Gianotto] [] * @since [v1.7] - * @return View - */ - public function postBulkEdit() + * @return \Illuminate\Contracts\View\View + */ + public function postBulkEdit(Request $request) { - - if ((!Input::has('edit_user')) || (count(Input::has('edit_user')) == 0)) { + $this->authorize('update', User::class); + if ((!Input::has('ids')) || (count(Input::has('ids')) == 0)) { return redirect()->back()->with('error', 'No users selected'); } else { + $statuslabel_list = Helper::statusLabelList(); - $user_raw_array = array_keys(Input::get('edit_user')); + $user_raw_array = array_keys(Input::get('ids')); $licenses = DB::table('license_seats')->whereIn('assigned_to', $user_raw_array)->get(); - //print_r($licenses); - $users = User::whereIn('id', $user_raw_array)->with('groups', 'assets', 'licenses', 'accessories')->get(); - // $users = Company::scopeCompanyables($users)->get(); + if ($request->input('bulk_actions')=='edit') { - return View::make('users/confirm-bulk-delete', compact('users', 'statuslabel_list')); + return view('users/bulk-edit', compact('users')) + ->with('location_list', Helper::locationsList()) + ->with('company_list', Helper::companyList()) + ->with('manager_list', Helper::managerList()) + ->with('manager_list', Helper::managerList()) + ->with('department_list', Helper::departmentList()) + ->with('groups', Group::pluck('name', 'id')); + } + + return view('users/confirm-bulk-delete', compact('users', 'statuslabel_list')); } } + + /** + * Save bulk-edited users + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return \Illuminate\Http\RedirectResponse + */ + public function postBulkEditSave(Request $request) + { + $this->authorize('update', User::class); + if ((!Input::has('ids')) || (count(Input::has('ids')) == 0)) { + return redirect()->back()->with('error', 'No users selected'); + } else { + + $user_raw_array = Input::get('ids'); + $update_array = array(); + $manager_conflict = false; + + $users = User::whereIn('id', $user_raw_array)->where('id','!=',Auth::user()->id)->get(); + + if ($request->has('location_id')) { + $update_array['location_id'] = $request->input('location_id'); + } + if ($request->has('department_id')) { + $update_array['department_id'] = $request->input('department_id'); + } + if ($request->has('company_id')) { + $update_array['company_id'] = $request->input('company_id'); + } + + if ($request->has('manager_id')) { + + // Do not allow a manager update if the selected manager is one of the users being + // edited. + if (!array_key_exists($request->input('manager_id'), $user_raw_array)) { + $update_array['manager_id'] = $request->input('manager_id'); + + } else { + $manager_conflict = true; + } + + } + if ($request->has('activated')) { + $update_array['activated'] = $request->input('activated'); + } + + if (count($update_array) > 0) { + User::whereIn('id', $user_raw_array)->where('id','!=',Auth::user()->id)->update($update_array); + } + + // Only sync groups if groups were selected + if ($request->has('groups')) { + foreach ($users as $user) { + $user->groups()->sync($request->input('groups')); + } + } + + } + if ($manager_conflict) { + return redirect()->route('users.index') + ->with('warning', trans('admin/users/message.bulk_manager_warn')); + } + return redirect()->route('users.index') + ->with('success', trans('admin/users/message.success.update_bulk')); + + + } + /** * Soft-delete bulk users * * @author [A. Gianotto] [] * @since [v1.0] - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function postBulkSave() { + $this->authorize('update', User::class); - if ((!Input::has('edit_user')) || (count(Input::has('edit_user')) == 0)) { + if ((!Input::has('ids')) || (count(Input::has('ids')) == 0)) { return redirect()->back()->with('error', 'No users selected'); } elseif ((!Input::has('status_id')) || (count(Input::has('status_id')) == 0)) { - return redirect()->route('users')->with('error', 'No status selected'); + return redirect()->route('users.index')->with('error', 'No status selected'); } else { - $user_raw_array = Input::get('edit_user'); + $user_raw_array = Input::get('ids'); $asset_array = array(); if (($key = array_search(Auth::user()->id, $user_raw_array)) !== false) { @@ -521,56 +544,50 @@ class UsersController extends Controller $license_array = array(); $accessory_array = array(); - - foreach ($assets as $asset) { $asset_array[] = $asset->id; // Update the asset log - $logaction = new Actionlog(); - $logaction->item_id = $asset->id; - $logaction->item_type = Asset::class; - $logaction->target_id = $asset->assigned_to; - $logaction->target_type = User::class; - $logaction->user_id = Auth::user()->id; - $logaction->note = 'Bulk checkin asset and delete user'; - $logaction->logaction('checkin from'); + $logAction = new Actionlog(); + $logAction->item_id = $asset->id; + $logAction->item_type = Asset::class; + $logAction->target_id = $asset->assigned_to; + $logAction->target_type = User::class; + $logAction->user_id = Auth::user()->id; + $logAction->note = 'Bulk checkin asset and delete user'; + $logAction->logaction('checkin from'); - Asset::whereIn('id', $asset_array)->update( - array( + Asset::whereIn('id', $asset_array)->update([ 'status_id' => e(Input::get('status_id')), 'assigned_to' => null, - ) - ); + ]); } foreach ($accessories as $accessory) { $accessory_array[] = $accessory->accessory_id; // Update the asset log - $logaction = new Actionlog(); - $logaction->item_id = $accessory->id; - $logaction->item_type = Accessory::class; - $logaction->target_id = $accessory->assigned_to; - $logaction->target_type = User::class; - $logaction->user_id = Auth::user()->id; - $logaction->note = 'Bulk checkin accessory and delete user'; - $logaction->logaction('checkin from'); - - + $logAction = new Actionlog(); + $logAction->item_id = $accessory->id; + $logAction->item_type = Accessory::class; + $logAction->target_id = $accessory->assigned_to; + $logAction->target_type = User::class; + $logAction->user_id = Auth::user()->id; + $logAction->note = 'Bulk checkin accessory and delete user'; + $logAction->logaction('checkin from'); } foreach ($licenses as $license) { $license_array[] = $license->id; // Update the asset log - $logaction = new Actionlog(); - $logaction->item_id = $license->id; - $logaction->item_type = License::class; - $logaction->target_id = $license->assigned_to; - $logaction->target_type = User::class; - $logaction->user_id = Auth::user()->id; - $logaction->note = 'Bulk checkin license and delete user'; - $logaction->logaction('checkin from'); + $logAction = new Actionlog(); + $logAction->item_id = $license->id; + $logAction->item_type = License::class; + $logAction->target_id = $license->assigned_to; + $logAction->target_type = User::class; + $logAction->user_id = Auth::user()->id; + $logAction->note = 'Bulk checkin license and delete user'; + $logAction->logaction('checkin from'); } LicenseSeat::whereIn('id', $license_array)->update(['assigned_to' => null]); @@ -580,14 +597,9 @@ class UsersController extends Controller $user->delete(); } - - - - return redirect()->route('users')->with('success', 'Your selected users have been deleted and their assets have been updated.'); - } else { - return redirect()->route('users')->with('error', 'Bulk delete is not enabled in this installation'); + return redirect()->route('users.index')->with('success', 'Your selected users have been deleted and their assets have been updated.'); } - + return redirect()->route('users.index')->with('error', 'Bulk delete is not enabled in this installation'); } } @@ -597,28 +609,21 @@ class UsersController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $id - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function getRestore($id = null) { - + $this->authorize('edit', User::class); // Get user information if (!$user = User::onlyTrashed()->find($id)) { - return redirect()->route('users')->with('error', trans('admin/users/messages.user_not_found')); + return redirect()->route('users.index')->with('error', trans('admin/users/messages.user_not_found')); } - if (!Company::isCurrentUserHasAccess($user)) { - return redirect()->route('users')->with('error', trans('general.insufficient_permissions')); - } else { - - // Restore the user - if (User::withTrashed()->where('id', $id)->restore()) { - return redirect()->route('users')->with('success', trans('admin/users/message.success.restored')); - } else { - return redirect()->route('users')->with('error', 'User could not be restored.'); - } - + // Restore the user + if (User::withTrashed()->where('id', $id)->restore()) { + return redirect()->route('users.index')->with('success', trans('admin/users/message.success.restored')); } + return redirect()->route('users.index')->with('error', 'User could not be restored.'); } @@ -628,28 +633,21 @@ class UsersController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $userId - * @return View - */ - public function getView($userId = null) + * @return \Illuminate\Contracts\View\View + */ + public function show($userId = null) { - - $user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId); + if(!$user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId)) { + $error = trans('admin/users/message.user_not_found', compact('id')); + // Redirect to the user management page + return redirect()->route('users.index')->with('error', $error); + } $userlog = $user->userlog->load('item'); if (isset($user->id)) { - - if (!Company::isCurrentUserHasAccess($user)) { - return redirect()->route('users')->with('error', trans('general.insufficient_permissions')); - } else { - return View::make('users/view', compact('user', 'userlog')); - } - } else { - // Prepare the error message - $error = trans('admin/users/message.user_not_found', compact('id')); - - // Redirect to the user management page - return redirect()->route('users')->with('error', $error); + $this->authorize('view', $user); + return view('users/view', compact('user', 'userlog')); } } @@ -665,34 +663,32 @@ class UsersController extends Controller { try { // Get user information - //$user = User::find($id); + $user = User::find($id); + $this->authorize('edit', $user); // Check if we are not trying to unsuspend ourselves if ($user->id === Auth::user()->id) { // Prepare the error message $error = trans('admin/users/message.error.unsuspend'); - // Redirect to the user management page - return redirect()->route('users')->with('error', $error); + return redirect()->route('users.index')->with('error', $error); } // Do we have permission to unsuspend this user? if ($user->isSuperUser() && !Auth::user()->isSuperUser()) { // Redirect to the user management page - return redirect()->route('users')->with('error', 'Insufficient permissions!'); + return redirect()->route('users.index')->with('error', 'Insufficient permissions!'); } // Prepare the success message $success = trans('admin/users/message.success.unsuspend'); - // Redirect to the user management page - return redirect()->route('users')->with('success', $success); + return redirect()->route('users.index')->with('success', $success); } catch (UserNotFoundException $e) { // Prepare the error message $error = trans('admin/users/message.user_not_found', compact('id')); - // Redirect to the user management page - return redirect()->route('users')->with('error', $error); + return redirect()->route('users.index')->with('error', $error); } } @@ -704,10 +700,11 @@ class UsersController extends Controller * @author [A. Gianotto] [] * @since [v1.0] * @param int $id - * @return Redirect - */ + * @return \Illuminate\Contracts\View\View + */ public function getClone($id = null) { + $this->authorize('create', User::class); // We need to reverse the UI specific logic for our // permissions here before we update the user. $permissions = Input::get('permissions', array()); @@ -726,37 +723,28 @@ class UsersController extends Controller $user->id = null; // Get this user groups - $userGroups = $user_to_clone->groups()->lists('name', 'id'); - - // Get a list of all the available groups - $groups = Group::pluck('name', 'id'); - + $userGroups = $user_to_clone->groups()->pluck('name', 'id'); // Get all the available permissions $permissions = config('permissions'); $clonedPermissions = $user_to_clone->decodePermissions(); $userPermissions =Helper::selectedPermissionsArray($permissions, $clonedPermissions); - //$this->encodeAllPermissions($permissions); - - $location_list = Helper::locationsList(); - $company_list = Helper::companyList(); - $manager_list = Helper::managerList(); // Show the page - return View::make('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) - ->with('location_list', $location_list) - ->with('company_list', $company_list) - ->with('manager_list', $manager_list) + return view('users/edit', compact('permissions', 'userPermissions')) + ->with('location_list', Helper::locationsList()) + ->with('company_list', Helper::companyList()) + ->with('manager_list', Helper::managerList()) + ->with('department_list', Helper::departmentList()) ->with('user', $user) - ->with('groups', $groups) + ->with('groups', Group::pluck('name', 'id')) ->with('userGroups', $userGroups) ->with('clone_user', $user_to_clone); } catch (UserNotFoundException $e) { // Prepare the error message $error = trans('admin/users/message.user_not_found', compact('id')); - // Redirect to the user management page - return redirect()->route('users')->with('error', $error); + return redirect()->route('users.index')->with('error', $error); } } @@ -765,22 +753,18 @@ class UsersController extends Controller * * @author [A. Gianotto] [] * @since [v1.0] - * @return View - */ + * @return \Illuminate\Contracts\View\View + */ public function getImport() { - // Get all the available groups - //$groups = Sentry::getGroupProvider()->findAll(); + $this->authorize('update', User::class); // Selected groups $selectedGroups = Input::old('groups', array()); // Get all the available permissions $permissions = config('permissions'); - //$this->encodeAllPermissions($permissions); - // Selected permissions $selectedPermissions = Input::old('permissions', array('superuser' => -1)); - //$this->encodePermissions($selectedPermissions); // Show the page - return View::make('users/import', compact('groups', 'selectedGroups', 'permissions', 'selectedPermissions')); + return view('users/import', compact('selectedGroups', 'permissions', 'selectedPermissions')); } /** @@ -788,11 +772,11 @@ class UsersController extends Controller * * @author [A. Gianotto] [] * @since [v1.0] - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function postImport() { - + $this->authorize('update', User::class); if (!ini_get("auto_detect_line_endings")) { ini_set("auto_detect_line_endings", '1'); } @@ -878,176 +862,27 @@ class UsersController extends Controller return true; } }); - - - return redirect()->route('users')->with('duplicates', $duplicates)->with('success', 'Success'); + return redirect()->route('users.index')->with('duplicates', $duplicates)->with('success', 'Success'); } - /** - * Return JSON response with a list of user details for the getIndex() view. - * - * @author [A. Gianotto] [] - * @since [v1.6] - * @see UsersController::getIndex() method that consumed this JSON response - * @return string JSON - */ - public function getDatatable(Request $request, $status = null) - { - - if (Input::has('offset')) { - $offset = e(Input::get('offset')); - } else { - $offset = 0; - } - - if (Input::has('limit')) { - $limit = e(Input::get('limit')); - } else { - $limit = 50; - } - - if (Input::get('sort')=='name') { - $sort = 'first_name'; - } else { - $sort = e(Input::get('sort')); - } - - $users = User::select(array('users.id','users.employee_num','users.two_factor_enrolled','users.jobtitle','users.email','users.username','users.location_id','users.manager_id','users.first_name','users.last_name','users.created_at','users.notes','users.company_id', 'users.deleted_at','users.activated')) - ->with('assets', 'accessories', 'consumables', 'licenses', 'manager', 'groups', 'userloc', 'company','throttle'); - $users = Company::scopeCompanyables($users); - - switch ($status) { - case 'deleted': - $users = $users->withTrashed()->Deleted(); - break; - } - - if (Input::has('search')) { - $users = $users->TextSearch(Input::get('search')); - } - - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - - switch (Input::get('sort')) { - case 'manager': - $users = $users->OrderManager($order); - break; - case 'location': - $users = $users->OrderLocation($order); - break; - default: - $allowed_columns = - [ - 'last_name','first_name','email','jobtitle','username','employee_num', - 'assets','accessories', 'consumables','licenses','groups','activated','created_at', - 'two_factor_enrolled','two_factor_optin' - ]; - - $sort = in_array($sort, $allowed_columns) ? $sort : 'first_name'; - $users = $users->orderBy($sort, $order); - break; - } - - $userCount = $users->count(); - $users = $users->skip($offset)->take($limit)->get(); - $rows = array(); - - foreach ($users as $user) { - $group_names = ''; - $inout = ''; - $actions = ''; - - foreach ($user->groups as $group) { - $group_names .= '' . $group->name . ' '; - } - - - if (!is_null($user->deleted_at)) { - if (Gate::allows('users.delete')) { - $actions .= ' '; - } - } else { - - if (Gate::allows('users.delete')) { - if ($user->accountStatus() == 'suspended') { - $actions .= ' '; - } - } - if (Gate::allows('users.edit')) { - $actions .= ' '; - - $actions .= ''; - } - if (Gate::allows('users.delete')) { - if ((Auth::user()->id !== $user->id) && (!config('app.lock_passwords'))) { - $actions .= ' '; - } else { - $actions .= ' '; - } - } else { - $actions.=''; - } - } - - $actions .= ''; - - $rows[] = array( - 'id' => $user->id, - 'checkbox' => ($status!='deleted') ? '' : '', - 'name' => ''.e($user->fullName()).'', - 'jobtitle' => e($user->jobtitle), - 'email' => ($user->email!='') ? - '' - .'' - .'' : '', - 'username' => e($user->username), - 'location' => ($user->userloc) ? e($user->userloc->name) : '', - 'manager' => ($user->manager) ? '' . e($user->manager->fullName()) . '' : '', - 'assets' => $user->assets->count(), - 'employee_num' => e($user->employee_num), - 'licenses' => $user->licenses->count(), - 'accessories' => $user->accessories->count(), - 'consumables' => $user->consumables->count(), - 'groups' => $group_names, - 'notes' => e($user->notes), - 'two_factor_enrolled' => ($user->two_factor_enrolled=='1') ? '' : '', - 'two_factor_optin' => (($user->two_factor_optin=='1') || (Setting::getSettings()->two_factor_enabled=='2') ) ? '' : '', - 'created_at' => ($user->created_at!='') ? e($user->created_at->format('F j, Y h:iA')) : '', - 'activated' => ($user->activated=='1') ? '' : '', - 'actions' => ($actions) ? $actions : '', - 'companyName' => is_null($user->company) ? '' : e($user->company->name) - ); - } - - $data = array('total'=>$userCount, 'rows'=>$rows); - return $data; - } /** - * Return JSON response with a list of user details for the getIndex() view. - * - * @author [A. Gianotto] [] - * @since [v1.6] - * @param int $userId - * @return string JSON - */ + * Return JSON response with a list of user details for the getIndex() view. + * + * @author [A. Gianotto] [] + * @since [v1.6] + * @param AssetFileRequest $request + * @param int $userId + * @return string JSON + */ public function postUpload(AssetFileRequest $request, $userId = null) { - $user = User::find($userId); $destinationPath = config('app.private_uploads') . '/users'; if (isset($user->id)) { - - if (!Company::isCurrentUserHasAccess($user)) { - return redirect()->route('users')->with('error', trans('general.insufficient_permissions')); - } + $this->authorize('update', $user); foreach (Input::file('file') as $file) { @@ -1056,24 +891,23 @@ class UsersController extends Controller $filename .= '-' . str_slug($file->getClientOriginalName()) . '.' . $extension; $upload_success = $file->move($destinationPath, $filename); - //Log the deletion of seats to the log - $logaction = new Actionlog(); - $logaction->item_id = $user->id; - $logaction->item_type = User::class; - $logaction->user_id = Auth::user()->id; - $logaction->note = e(Input::get('notes')); - $logaction->target_id = null; - $logaction->created_at = date("Y-m-d H:i:s"); - $logaction->filename = $filename; - $logaction->action_type = 'uploaded'; - $logaction->save(); + //Log the uploaded file to the log + $logAction = new Actionlog(); + $logAction->item_id = $user->id; + $logAction->item_type = User::class; + $logAction->user_id = Auth::user()->id; + $logAction->note = e(Input::get('notes')); + $logAction->target_id = null; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->filename = $filename; + $logAction->action_type = 'uploaded'; + $logAction->save(); } - return JsonResponse::create($logaction); + return JsonResponse::create($logAction); - } else { - return JsonResponse::create(["error" => "Failed validation: ".print_r($logaction->getErrors(), true)], 500); } + return JsonResponse::create(["error" => "Failed validation: ".print_r($logAction->getErrors(), true)], 500); } @@ -1084,33 +918,28 @@ class UsersController extends Controller * @since [v1.6] * @param int $userId * @param int $fileId - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function getDeleteFile($userId = null, $fileId = null) { $user = User::find($userId); $destinationPath = config('app.private_uploads').'/users'; if (isset($user->id)) { - - if (!Company::isCurrentUserHasAccess($user)) { - return redirect()->route('users')->with('error', trans('general.insufficient_permissions')); - } else { - $log = Actionlog::find($fileId); - $full_filename = $destinationPath . '/' . $log->filename; - if (file_exists($full_filename)) { - unlink($destinationPath . '/' . $log->filename); - } - $log->delete(); - return redirect()->back()->with('success', trans('admin/users/message.deletefile.success')); + $this->authorize('update', $user); + $log = Actionlog::find($fileId); + $full_filename = $destinationPath . '/' . $log->filename; + if (file_exists($full_filename)) { + unlink($destinationPath . '/' . $log->filename); } - } else { - // Prepare the error message - $error = trans('admin/users/message.does_not_exist', compact('id')); - - // Redirect to the licence management page - return redirect()->route('users')->with('error', $error); + $log->delete(); + return redirect()->back()->with('success', trans('admin/users/message.deletefile.success')); } + // Prepare the error message + $error = trans('admin/users/message.does_not_exist', compact('id')); + // Redirect to the licence management page + return redirect()->route('users.index')->with('error', $error); + } /** @@ -1124,25 +953,21 @@ class UsersController extends Controller */ public function displayFile($userId = null, $fileId = null) { - $user = User::find($userId); // the license is valid if (isset($user->id)) { - if (!Company::isCurrentUserHasAccess($user)) { - return redirect()->route('users')->with('error', trans('general.insufficient_permissions')); - } else { - $log = Actionlog::find($fileId); - $file = $log->get_src('users'); - return Response::download($file); - } - } else { - // Prepare the error message - $error = trans('admin/users/message.does_not_exist', compact('id')); + $this->authorize('view', $user); - // Redirect to the licence management page - return redirect()->route('users')->with('error', $error); + $log = Actionlog::find($fileId); + $file = $log->get_src('users'); + return Response::download($file); } + // Prepare the error message + $error = trans('admin/users/message.does_not_exist', compact('id')); + + // Redirect to the licence management page + return redirect()->route('users.index')->with('error', $error); } /** @@ -1150,29 +975,25 @@ class UsersController extends Controller * * @author Aladin Alaily * @since [v1.8] - * @return View - */ + * @return \Illuminate\Contracts\View\View + */ public function getLDAP() { - - $location_list = Helper::locationsList(); - + $this->authorize('update', User::class); try { $ldapconn = Ldap::connectToLdap(); } catch (\Exception $e) { - return redirect()->route('users')->with('error',$e->getMessage()); + return redirect()->route('users.index')->with('error', $e->getMessage()); } - try { Ldap::bindAdminToLdap($ldapconn); } catch (\Exception $e) { - return redirect()->route('users')->with('error',$e->getMessage()); + return redirect()->route('users.index')->with('error', $e->getMessage()); } - return View::make('users/ldap') - ->with('location_list', $location_list); - + return view('users/ldap') + ->with('location_list', Helper::locationsList()); } @@ -1199,10 +1020,11 @@ class UsersController extends Controller * * @author Aladin Alaily * @since [v1.8] - * @return Redirect - */ + * @return \Illuminate\Http\RedirectResponse + */ public function postLDAP(Request $request) { + $this->authorize('update', User::class); ini_set('max_execution_time', 600); //600 seconds = 10 minutes ini_set('memory_limit', '500M'); @@ -1217,23 +1039,52 @@ class UsersController extends Controller try { $ldapconn = Ldap::connectToLdap(); } catch (\Exception $e) { - return redirect()->back()->withInput()->with('error',$e->getMessage()); + return redirect()->back()->withInput()->with('error', $e->getMessage()); } try { Ldap::bindAdminToLdap($ldapconn); } catch (\Exception $e) { - return redirect()->back()->withInput()->with('error',$e->getMessage()); + return redirect()->back()->withInput()->with('error', $e->getMessage()); } $summary = array(); + $ldap_ou_locations = Location::whereNotNull('ldap_ou')->get(); + $results = Ldap::findLdapUsers(); + // Inject location information fields + for ($i = 0; $i < $results["count"]; $i++) { + $results[$i]["ldap_location_override"] = false; + $results[$i]["location_id"] = 0; + } + + // Grab subsets based on location-specific DNs, and overwrite location for these users. + foreach ($ldap_ou_locations as $ldap_loc) { + $location_users = Ldap::findLdapUsers($ldap_loc->ldap_ou); + $usernames = array(); + for ($i = 0; $i < $location_users["count"]; $i++) { + $location_users[$i]["ldap_location_override"] = true; + $location_users[$i]["location_id"] = $ldap_loc->id; + $usernames[] = $location_users[$i][$ldap_result_username][0]; + } + + // Delete located users from the general group. + foreach ($results as $key => $generic_entry) { + if (in_array($generic_entry[$ldap_result_username][0], $location_users)) { + unset($results[$key]); + } + } + + $global_count = $results['count']; + $results = array_merge($location_users, $results); + $results['count'] = $global_count; + } + $tmp_pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); $pass = bcrypt($tmp_pass); - for ($i = 0; $i < $results["count"]; $i++) { if (empty($ldap_result_active_flag) || $results[$i][$ldap_result_active_flag][0] == "TRUE") { @@ -1243,14 +1094,18 @@ class UsersController extends Controller $item["lastname"] = isset($results[$i][$ldap_result_last_name][0]) ? $results[$i][$ldap_result_last_name][0] : ""; $item["firstname"] = isset($results[$i][$ldap_result_first_name][0]) ? $results[$i][$ldap_result_first_name][0] : ""; $item["email"] = isset($results[$i][$ldap_result_email][0]) ? $results[$i][$ldap_result_email][0] : "" ; + $item["ldap_location_override"] = isset($results[$i]["ldap_location_override"]) ? $results[$i]["ldap_location_override"]:""; + $item["location_id"] = isset($results[$i]["location_id"]) ? $results[$i]["location_id"]:""; + if( array_key_exists('useraccountcontrol', $results[$i]) ) { - $enabled_accounts = [ + $enabled_accounts = [ '512', '544', '66048', '66080', '262656', '262688', '328192', '328224' ]; $item['activated'] = ( in_array($results[$i]['useraccountcontrol'][0], $enabled_accounts) ) ? 1 : 0; } else { $item['activated'] = 0; } + // User exists $item["createorupdate"] = 'updated'; if (!$user = User::where('username', $item["username"])->first()) { @@ -1259,16 +1114,17 @@ class UsersController extends Controller $item["createorupdate"] = 'created'; } - // Create the user if they don't exist. - - - $user->first_name = e($item["firstname"]); - $user->last_name = e($item["lastname"]); - $user->username = e($item["username"]); - $user->email = e($item["email"]); + // Create the user if they don't exist. + $user->first_name = $item["firstname"]; + $user->last_name = $item["lastname"]; + $user->username = $item["username"]; + $user->email = $item["email"]; $user->employee_num = e($item["employee_number"]); $user->activated = $item['activated']; - if ($request->input('location_id')!='') { + + if ($item['ldap_location_override'] == true) { + $user->location_id = $item['location_id']; + } else if ($request->input('location_id')!='') { $user->location_id = e($request->input('location_id')); } $user->notes = 'Imported from LDAP'; @@ -1286,44 +1142,27 @@ class UsersController extends Controller $item["note"] = $errors; $item["status"]='error'; } - array_push($summary, $item); } - } - - - return redirect()->route('ldap/user')->with('success', "LDAP Import successful.")->with('summary', $summary); } - - /** - * Return JSON containing a list of assets assigned to a user. - * - * @author [A. Gianotto] [] - * @since [v3.0] - * @return string JSON - */ - public function getAssetList($userId) - { - $assets = Asset::where('assigned_to', '=', $userId)->with('model')->get(); - return response()->json($assets); - } + /** * Exports users to CSV * * @author [A. Gianotto] [] * @since [v3.5] - * @return \Illuminate\Http\Response + * @return StreamedResponse */ public function getExportUserCsv() { + $this->authorize('view', User::class); \Debugbar::disable(); - - $response = new StreamedResponse(function() { + $response = new StreamedResponse(function () { // Open output stream $handle = fopen('php://output', 'w'); @@ -1348,7 +1187,7 @@ class UsersController extends Controller trans('admin/users/table.activated'), trans('general.created_at') ]; - + fputcsv($handle, $headers); foreach ($users as $user) { @@ -1364,11 +1203,11 @@ class UsersController extends Controller ($user->company) ? $user->company->name : '', $user->jobtitle, $user->employee_num, - $user->fullName(), + $user->present()->fullName(), $user->username, $user->email, - ($user->manager) ? $user->manager->fullName() : '', - ($user->location) ? $user->location->name : '', + ($user->manager) ? $user->manager->present()->fullName() : '', + ($user->userloc) ? $user->userloc->name : '', $user->assets->count(), $user->licenses->count(), $user->accessories->count(), @@ -1395,7 +1234,6 @@ class UsersController extends Controller } - public function postTwoFactorReset(Request $request) { if (Gate::denies('users.edit')) { @@ -1411,8 +1249,5 @@ class UsersController extends Controller } catch (\Exception $e) { return response()->json(['message' => trans('admin/settings/general.two_factor_reset_error')], 500); } - } - - } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index acbe21b929..5a7ac1eb9c 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -41,7 +41,6 @@ class ViewAssetsController extends Controller { $user = User::with( - 'assets', 'assets.model', 'consumables', 'accessories', @@ -54,7 +53,7 @@ class ViewAssetsController extends Controller $userlog = $user->userlog->load('item', 'user', 'target'); if (isset($user->id)) { - return View::make('account/view-assets', compact('user', 'userlog')); + return view('account/view-assets', compact('user', 'userlog')); } else { // Prepare the error message $error = trans('admin/users/message.user_not_found', compact('id')); @@ -69,16 +68,16 @@ class ViewAssetsController extends Controller public function getRequestableIndex() { - $assets = Asset::with('model', 'defaultLoc', 'assetloc', 'assigneduser')->Hardware()->RequestableAssets()->get(); - $models = AssetModel::with('category')->RequestableModels()->get(); + $assets = Asset::with('model', 'defaultLoc', 'assetloc', 'assignedTo', 'requests')->Hardware()->RequestableAssets()->get(); + $models = AssetModel::with('category', 'requests', 'assets')->RequestableModels()->get(); - return View::make('account/requestable-assets', compact('user', 'assets', 'models')); + return view('account/requestable-assets', compact('user', 'assets', 'models')); } public function getRequestedIndex() { $requestedItems = CheckoutRequest::with('user', 'requestedItem')->get(); - return View::make('admin/requested-assets', compact('requestedItems')); + return view('admin/requested-assets', compact('requestedItems')); } @@ -103,16 +102,16 @@ class ViewAssetsController extends Controller $logaction->target_id = $data['user_id'] = Auth::user()->id; $logaction->target_type = User::class; - $data['requested_by'] = $user->fullName(); + $data['requested_by'] = $user->present()->fullName(); $data['item_name'] = $item->name; $data['item_type'] = $itemType; if ($fullItemType == Asset::class) { - $data['item_url'] = route('view/hardware', $item->id); - $slackMessage = ' Asset <'.config('app.url').'/hardware/'.$item->id.'/view'.'|'.$item->showAssetName().'> requested by <'.config('app.url').'/users/'.$item->user_id.'/view'.'|'.$user->fullName().'>.'; + $data['item_url'] = route('hardware.show', $item->id); + $slackMessage = ' Asset <'.url('/').'/hardware/'.$item->id.'/view'.'|'.$item->present()->name().'> requested by <'.url('/').'/users/'.$item->user_id.'/view'.'|'.$user->present()->fullName().'>.'; } else { $data['item_url'] = route("view/${itemType}", $item->id); - $slackMessage = $quantity. ' ' . class_basename(strtoupper($logaction->item_type)).' <'.$data['item_url'].'|'.$item->name.'> requested by <'.config('app.url').'/user/'.$item->id.'/view'.'|'.$user->fullName().'>.'; + $slackMessage = $quantity. ' ' . class_basename(strtoupper($logaction->item_type)).' <'.$data['item_url'].'|'.$item->name.'> requested by <'.url('/').'/user/'.$item->id.'/view'.'|'.$user->present()->fullName().'>.'; } $settings = Setting::getSettings(); @@ -226,8 +225,8 @@ class ViewAssetsController extends Controller $logaction->target_type = User::class; $log = $logaction->logaction('requested'); - $data['requested_by'] = $user->fullName(); - $data['asset_name'] = $asset->showAssetName(); + $data['requested_by'] = $user->present()->fullName(); + $data['asset_name'] = $asset->present()->name(); $settings = Setting::getSettings(); @@ -259,7 +258,7 @@ class ViewAssetsController extends Controller 'fields' => [ [ 'title' => 'REQUESTED:', - 'value' => class_basename(strtoupper($logaction->item_type)).' asset <'.config('app.url').'/hardware/'.$asset->id.'/view'.'|'.$asset->showAssetName().'> requested by <'.config('app.url').'/hardware/'.$asset->id.'/view'.'|'.Auth::user()->fullName().'>.' + 'value' => class_basename(strtoupper($logaction->item_type)).' asset <'.url('/').'/hardware/'.$asset->id.'/view'.'|'.$asset->present()->name().'> requested by <'.url('/').'/hardware/'.$asset->id.'/view'.'|'.Auth::user()->present()->fullName().'>.' ] ] @@ -281,7 +280,7 @@ class ViewAssetsController extends Controller { $checkoutrequests = CheckoutRequest::all(); - return View::make('account/requested-items', compact($checkoutrequests)); + return view('account/requested-items', compact($checkoutrequests)); } @@ -315,7 +314,7 @@ class ViewAssetsController extends Controller } elseif (!Company::isCurrentUserHasAccess($item)) { return redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')); } else { - return View::make('account/accept-asset', compact('item'))->with('findlog', $findlog)->with('item',$item); + return view('account/accept-asset', compact('item'))->with('findlog', $findlog)->with('item', $item); } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 898cdd319a..d6d3b3399b 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -14,7 +14,7 @@ class Kernel extends HttpKernel * @var array */ protected $middleware = [ - \MisterPhilip\MaintenanceMode\Http\Middleware\CheckForMaintenanceMode::class, + \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\FrameGuard::class, @@ -37,10 +37,12 @@ class Kernel extends HttpKernel \App\Http\Middleware\VerifyCsrfToken::class, \App\Http\Middleware\CheckLocale::class, \App\Http\Middleware\CheckForTwoFactor::class, + \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, ], 'api' => [ 'throttle:60,1', + 'auth:api', ], ]; @@ -52,9 +54,10 @@ class Kernel extends HttpKernel * @var array */ protected $routeMiddleware = [ - 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'authorize' => \App\Http\Middleware\CheckPermissions::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; diff --git a/app/Http/Middleware/CheckForDebug.php b/app/Http/Middleware/CheckForDebug.php index 2486f20120..ff78fd31ba 100644 --- a/app/Http/Middleware/CheckForDebug.php +++ b/app/Http/Middleware/CheckForDebug.php @@ -19,7 +19,7 @@ class CheckForDebug view()->share('debug_in_production', false); if (((Auth::check() && (Auth::user()->isSuperUser()))) && (app()->environment()=='production') && (config('app.warn_debug')===true) && (config('app.debug')===true)) { - view()->share('debug_in_production', true); + view()->share('debug_in_production', true); } return $next($request); diff --git a/app/Http/Middleware/CheckForSetup.php b/app/Http/Middleware/CheckForSetup.php index 4865d05f41..a07a72baf3 100644 --- a/app/Http/Middleware/CheckForSetup.php +++ b/app/Http/Middleware/CheckForSetup.php @@ -22,14 +22,14 @@ class CheckForSetup if (Setting::setupCompleted()) { if ($request->is('setup*')) { - return redirect(config('app.url')); + return redirect(url('/')); } else { return $next($request); } } else { if (!($request->is('setup*')) && !($request->is('.env'))) { - return redirect(config('app.url').'/setup')->with('Request', $request); + return redirect(url('/').'/setup')->with('Request', $request); } return $next($request); diff --git a/app/Http/Requests/AssetCheckoutRequest.php b/app/Http/Requests/AssetCheckoutRequest.php index 9b3e98c2d6..7c341b3028 100644 --- a/app/Http/Requests/AssetCheckoutRequest.php +++ b/app/Http/Requests/AssetCheckoutRequest.php @@ -24,7 +24,9 @@ class AssetCheckoutRequest extends Request public function rules() { return [ - "assigned_to" => 'required', + "assigned_user" => 'required_without_all:assigned_asset,assigned_location', + "assigned_asset" => 'required_without_all:assigned_user,assigned_location', + "assigned_location" => 'required_without_all:assigned_user,assigned_asset', ]; } } diff --git a/app/Http/Requests/AssetRequest.php b/app/Http/Requests/AssetRequest.php index a4bdcb816f..7b29b51e7c 100644 --- a/app/Http/Requests/AssetRequest.php +++ b/app/Http/Requests/AssetRequest.php @@ -26,19 +26,21 @@ class AssetRequest extends Request public function rules() { $rules = [ - 'name' => 'min:2|max:255', - 'model_id' => 'required|integer', - 'status_id' => 'required|integer', - 'company_id' => 'integer', - 'warranty_months' => 'integer|min:0|max:240', - 'physical' => 'integer', - 'checkout_date' => 'date', - 'checkin_date' => 'date', - 'supplier_id' => 'integer', - 'status' => 'integer', - 'asset_tag' => 'required', - 'purchase_cost' => 'numeric', - + 'name' => 'max:255|nullable', + 'model_id' => 'required|integer|exists:models,id', + 'status_id' => 'required|integer|exists:status_labels,id', + 'company_id' => 'integer|nullable', + 'warranty_months' => 'numeric|nullable', + 'physical' => 'integer|nullable', + 'checkout_date' => 'date', + 'checkin_date' => 'date', + 'supplier_id' => 'integer|nullable', + 'status' => 'integer|nullable', + 'asset_tag' => 'required', + 'purchase_cost' => 'numeric|nullable', + "assigned_user" => 'sometimes:required_without_all:assigned_asset,assigned_location', + "assigned_asset" => 'sometimes:required_without_all:assigned_user,assigned_location', + "assigned_location" => 'sometimes:required_without_all:assigned_user,assigned_asset', ]; $model = AssetModel::find($this->request->get('model_id')); diff --git a/app/Http/Requests/UpdateUserRequest.php b/app/Http/Requests/ImageUploadRequest.php similarity index 62% rename from app/Http/Requests/UpdateUserRequest.php rename to app/Http/Requests/ImageUploadRequest.php index b778de8e6c..2b8bad20f4 100644 --- a/app/Http/Requests/UpdateUserRequest.php +++ b/app/Http/Requests/ImageUploadRequest.php @@ -4,7 +4,7 @@ namespace App\Http\Requests; use App\Http\Requests\Request; -class UpdateUserRequest extends Request +class ImageUploadRequest extends Request { /** * Determine if the user is authorized to make this request. @@ -24,9 +24,12 @@ class UpdateUserRequest extends Request public function rules() { return [ - 'first_name' => 'required|string|min:1', - 'email' => 'email', - 'password_confirm' => 'sometimes|required_with:password', + 'image' => 'mimes:png,gif,jpg,jpeg,svg|max:2000' ]; } + + public function response(array $errors) + { + return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); + } } diff --git a/app/Http/Requests/ItemImportRequest.php b/app/Http/Requests/ItemImportRequest.php new file mode 100644 index 0000000000..f0616bdeef --- /dev/null +++ b/app/Http/Requests/ItemImportRequest.php @@ -0,0 +1,77 @@ +file_path; + $import->import_type = $this->input('import-type'); + $class = title_case($import->import_type); + $classString = "App\\Importer\\{$class}Importer"; + $importer = new $classString($filename); + $import->field_map = request('column-mappings'); + $import->save(); + $fieldMappings=[]; + if ($import->field_map) { + // We submit as csv field: column, but the importer is happier if we flip it here. + $fieldMappings = array_change_key_case(array_flip($import->field_map), CASE_LOWER); + // dd($fieldMappings); + } + $importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback']) + ->setUserId(Auth::id()) + ->setUpdating($this->has('import-update')) + ->setUsernameFormat('firstname.lastname') + ->setFieldMappings($fieldMappings); + // $logFile = storage_path('logs/importer.log'); + // \Log::useFiles($logFile); + $importer->import(); + return $this->errors; + } + + public function log($string) + { + // \Log::Info($string); + } + + public function progress($count) + { + // Open for future + return; + } + public function errorCallback($item, $field, $errorString) + { + $this->errors[$item->name][$field] = $errorString; + } + + private $errors; +} diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php index 618c9f30f9..7ab4fc16b2 100644 --- a/app/Http/Requests/Request.php +++ b/app/Http/Requests/Request.php @@ -1,6 +1,7 @@ rules; } - // public function response(array $errors) - // { - // $this->session->flash('errorMessages', $errors); - // return $this->redirector->back()->withErrors($errors)->withInput(); - // } + public function response(array $errors) + { + if ($this->ajax() || $this->wantsJson()) + { + return Helper::formatStandardApiResponse('error', null, $errors); + } + + return $this->redirector->to($this->getRedirectUrl()) + ->withInput($this->except($this->dontFlash)) + ->withErrors($errors, $this->errorBag); + } } diff --git a/app/Http/Requests/SaveUserRequest.php b/app/Http/Requests/SaveUserRequest.php index 76a36985b9..32a8a3d80a 100644 --- a/app/Http/Requests/SaveUserRequest.php +++ b/app/Http/Requests/SaveUserRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests; use App\Http\Requests\Request; +use App\Models\Setting; class SaveUserRequest extends Request { @@ -23,12 +24,38 @@ class SaveUserRequest extends Request */ public function rules() { - return [ - 'first_name' => 'required|string|min:1', - 'email' => 'email', - 'password' => 'required|min:6', - 'password_confirm' => 'sometimes|required_with:password', - 'username' => 'required|string|min:2|unique:users,username,NULL,deleted_at', - ]; + + $rules = []; + + switch($this->method()) + { + + // Brand new asset + case 'POST': + { + $rules['first_name'] = 'required|string|min:1'; + $rules['username'] = 'required_unless:ldap_import,1|string|min:1'; + $rules['password'] = Setting::passwordComplexityRulesSaving('store'); + } + + // Save all fields + case 'PUT': + $rules['first_name'] = 'required|string|min:1'; + $rules['username'] = 'required_unless:ldap_import,1|string|min:1'; + $rules['password'] = Setting::passwordComplexityRulesSaving('update'); + + // Save only what's passed + case 'PATCH': + { + $rules['password'] = Setting::passwordComplexityRulesSaving('update'); + } + + default:break; + } + + $rules['password_confirm'] = 'sometimes|required_with:password'; + + return $rules; + } } diff --git a/app/Http/Requests/SettingsLdapRequest.php b/app/Http/Requests/SettingsLdapRequest.php new file mode 100644 index 0000000000..443404ac15 --- /dev/null +++ b/app/Http/Requests/SettingsLdapRequest.php @@ -0,0 +1,50 @@ + 'sometimes|required_if:ldap_enabled,1|url|nullable', + "ldap_uname" => 'sometimes|required_if:ldap_enabled,1|nullable', + "ldap_basedn" => 'sometimes|required_if:ldap_enabled,1|nullable', + "ldap_filter" => 'sometimes|required_if:ldap_enabled,1|nullable', + "ldap_username_field" => 'sometimes|required_if:ldap_enabled,1|nullable', + "ldap_fname_field" => 'sometimes|required_if:ldap_enabled,1|nullable', + "ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1|nullable', + "ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1|nullable', + "ldap_version" => 'sometimes|required_if:ldap_enabled,1|nullable', + ]; + + return $rules; + + } + + public function response(array $errors) + { + $this->session()->flash('errors', Session::get('errors', new \Illuminate\Support\ViewErrorBag) + ->put('default', new \Illuminate\Support\MessageBag($errors))); + \Input::flash(); + return parent::response($errors); + } +} diff --git a/app/Http/Transformers/AccessoriesTransformer.php b/app/Http/Transformers/AccessoriesTransformer.php new file mode 100644 index 0000000000..575e8be943 --- /dev/null +++ b/app/Http/Transformers/AccessoriesTransformer.php @@ -0,0 +1,74 @@ +transformDatatables($array, $total); + } + + public function transformAccessory (Accessory $accessory) + { + $array = [ + 'id' => $accessory->id, + 'name' => e($accessory->name), + 'company' => ($accessory->company) ? ['id' => $accessory->company->id,'name'=> e($accessory->company->name)] : null, + 'manufacturer' => ($accessory->manufacturer) ? ['id' => $accessory->manufacturer->id,'name'=> e($accessory->manufacturer->name)] : null, + 'model_number' => ($accessory->model_number) ? e($accessory->model_number) : null, + 'category' => ($accessory->category) ? ['id' => $accessory->category->id,'name'=> e($accessory->category->name)] : null, + 'location' => ($accessory->location) ? ['id' => $accessory->location->id,'name'=> e($accessory->location->name)] : null, + 'notes' => ($accessory->notes) ? e($accessory->notes) : null, + 'qty' => ($accessory->qty) ? (int) $accessory->qty : null, + 'purchase_date' => ($accessory->purchase_date) ? Helper::getFormattedDateObject($accessory->purchase_date, 'date') : null, + 'purchase_cost' => ($accessory->purchase_cost) ? e($accessory->purchase_cost) : null, + 'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null, + 'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, + 'remaining_qty' => $accessory->numRemaining(), + 'created_at' => Helper::getFormattedDateObject($accessory->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($accessory->updated_at, 'datetime'), + + ]; + + $permissions_array['available_actions'] = [ + 'checkout' => Gate::allows('checkout', Accessory::class) ? true : false, + 'checkin' => false, + 'update' => Gate::allows('update', Accessory::class) ? true : false, + 'delete' => Gate::allows('delete', Accessory::class) ? true : false, + ]; + + $permissions_array['user_can_checkout'] = false; + + if ($accessory->numRemaining() > 0) { + $permissions_array['user_can_checkout'] = true; + } + + $array += $permissions_array; + + return $array; + } + + + public function transformCheckedoutAccessories (Collection $accessories_users, $total) + { + + $array = array(); + foreach ($accessories_users as $user) { + $array[] = (new UsersTransformer)->transformUser($user); + } + return (new DatatablesTransformer)->transformDatatables($array, $total); + } + + + +} diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php new file mode 100644 index 0000000000..6b81ce33c1 --- /dev/null +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -0,0 +1,78 @@ +transformDatatables($array, $total); + } + + public function transformActionlog (Actionlog $actionlog, $settings = null) + { + $array = [ + 'id' => (int) $actionlog->id, + 'icon' => $actionlog->present()->icon(), + 'image' => (method_exists($actionlog->item, 'getImageUrl')) ? $actionlog->item->getImageUrl() : null, + 'item' => ($actionlog->item) ? [ + 'id' => (int) $actionlog->item->id, + 'name' => e($actionlog->item->getDisplayNameAttribute()), + 'type' => e($actionlog->itemType()), + ] : null, + 'location' => ($actionlog->location) ? [ + 'id' => (int) $actionlog->location->id, + 'name' => e($actionlog->location->name) + ] : null, + 'created_at' => Helper::getFormattedDateObject($actionlog->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($actionlog->updated_at, 'datetime'), + 'next_audit_date' => ($actionlog->itemType()=='asset') ? Helper::getFormattedDateObject($actionlog->calcNextAuditDate(), 'date'): null, + 'days_to_next_audit' => $actionlog->daysUntilNextAudit($settings->audit_interval, $actionlog->item), + 'action_type' => $actionlog->present()->actionType(), + 'admin' => ($actionlog->user) ? [ + 'id' => (int) $actionlog->user->id, + 'name' => e($actionlog->user->getFullNameAttribute()), + 'first_name'=> e($actionlog->user->first_name), + 'last_name'=> e($actionlog->user->last_name) + ] : null, + 'target' => ($actionlog->target) ? [ + 'id' => (int) $actionlog->target->id, + 'name' => ($actionlog->targetType()=='user') ? e($actionlog->target->getFullNameAttribute()) : e($actionlog->target->getDisplayNameAttribute()), + 'type' => e($actionlog->targetType()), + ] : null, + + 'note' => e($actionlog->note), + + + ]; + + + + return $array; + } + + + public function transformCheckedoutActionlog (Collection $accessories_users, $total) + { + + $array = array(); + foreach ($accessories_users as $user) { + $array[] = (new UsersTransformer)->transformUser($user); + } + return (new DatatablesTransformer)->transformDatatables($array, $total); + } + + + +} diff --git a/app/Http/Transformers/AssetMaintenancesTransformer.php b/app/Http/Transformers/AssetMaintenancesTransformer.php new file mode 100644 index 0000000000..875d882e82 --- /dev/null +++ b/app/Http/Transformers/AssetMaintenancesTransformer.php @@ -0,0 +1,54 @@ +transformDatatables($array, $total); + } + + public function transformAssetMaintenance (AssetMaintenance $assetmaintenance) + { + $array = [ + 'id' => (int) $assetmaintenance->id, + 'asset_name' => ($assetmaintenance->asset) ? ['id' => $assetmaintenance->asset->id,'name'=> e($assetmaintenance->asset->name)] : null, + 'title' => ($assetmaintenance->title) ? e($assetmaintenance->title) : null, + 'notes' => ($assetmaintenance->notes) ? e($assetmaintenance->notes) : null, + 'supplier' => ($assetmaintenance->supplier) ? ['id' => $assetmaintenance->supplier->id,'name'=> e($assetmaintenance->supplier->name)] : null, + 'cost' => Helper::formatCurrencyOutput($assetmaintenance->cost), + 'asset_maintenance_type' => e($assetmaintenance->asset_maintenance_type), + 'start_date' => Helper::getFormattedDateObject($assetmaintenance->start_date, 'datetime'), + 'asset_maintenance_time' => $assetmaintenance->asset_maintenance_time, + 'completion_date' => Helper::getFormattedDateObject($assetmaintenance->completion_date, 'datetime'), + 'user_id' => ($assetmaintenance->admin) ? ['id' => $assetmaintenance->admin->id,'name'=> e($assetmaintenance->admin->getFullNameAttribute())] : null, + 'created_at' => Helper::getFormattedDateObject($assetmaintenance->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($assetmaintenance->updated_at, 'datetime'), + + ]; + + $permissions_array['available_actions'] = [ + 'update' => (bool) Gate::allows('update', Asset::class), + 'delete' => (bool) Gate::allows('delete', Asset::class), + ]; + + $array += $permissions_array; + + return $array; + } + + + + + +} diff --git a/app/Http/Transformers/AssetModelsTransformer.php b/app/Http/Transformers/AssetModelsTransformer.php new file mode 100644 index 0000000000..2b06e6c0be --- /dev/null +++ b/app/Http/Transformers/AssetModelsTransformer.php @@ -0,0 +1,69 @@ +transformDatatables($array, $total); + } + + public function transformAssetModel (AssetModel $assetmodel) + { + + $array = [ + 'id' => (int) $assetmodel->id, + 'name' => e($assetmodel->name), + 'manufacturer' => ($assetmodel->manufacturer) ? [ + 'id' => (int) $assetmodel->manufacturer->id, + 'name'=> e($assetmodel->manufacturer->name) + ] : null, + 'image' => ($assetmodel->image!='') ? url('/').'/uploads/models/'.e($assetmodel->image) : null, + 'model_number' => e($assetmodel->model_number), + 'depreciation' => ($assetmodel->depreciation) ? [ + 'id' => (int) $assetmodel->depreciation->id, + 'name'=> e($assetmodel->depreciation->name) + ] : null, + 'assets_count' => $assetmodel->assets_count, + 'category' => ($assetmodel->category) ? [ + 'id' => (int) $assetmodel->category->id, + 'name'=> e($assetmodel->category->name) + ] : null, + 'fieldset' => ($assetmodel->fieldset) ? [ + 'id' => (int) $assetmodel->fieldset->id, + 'name'=> e($assetmodel->fieldset->name) + ] : null, + 'eol' => ($assetmodel->eol > 0) ? $assetmodel->eol .' months': 'None', + 'notes' => e($assetmodel->notes), + 'created_at' => Helper::getFormattedDateObject($assetmodel->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($assetmodel->updated_at, 'datetime'), + + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', AssetModel::class) ? true : false, + 'delete' => Gate::allows('delete', AssetModel::class) ? true : false, + 'clone' => Gate::allows('create', AssetModel::class) ? true : false, + ]; + + $array += $permissions_array; + return $array; + } + + + public function transformAssetModelsDatatable($assetmodels) { + return (new DatatablesTransformer)->transformDatatables($assetmodels); + } + + +} diff --git a/app/Http/Transformers/AssetsTransformer.php b/app/Http/Transformers/AssetsTransformer.php new file mode 100644 index 0000000000..492e86a95b --- /dev/null +++ b/app/Http/Transformers/AssetsTransformer.php @@ -0,0 +1,146 @@ +transformDatatables($array, $total); + } + + + public function transformAsset(Asset $asset) + { + $array = [ + 'id' => (int) $asset->id, + 'name' => e($asset->name), + 'asset_tag' => e($asset->asset_tag), + 'serial' => e($asset->serial), + 'model' => ($asset->model) ? [ + 'id' => (int) $asset->model->id, + 'name'=> e($asset->model->name) + ] : null, + 'model_number' => ($asset->model) ? e($asset->model->model_number) : null, + 'status_label' => ($asset->assetstatus) ? [ + 'id' => (int) $asset->assetstatus->id, + 'name'=> e($asset->assetstatus->name) + ] : null, + 'category' => ($asset->model->category) ? [ + 'id' => (int) $asset->model->category->id, + 'name'=> e($asset->model->category->name) + ] : null, + 'manufacturer' => ($asset->model->manufacturer) ? [ + 'id' => (int) $asset->model->manufacturer->id, + 'name'=> e($asset->model->manufacturer->name) + ] : null, + 'supplier' => ($asset->supplier) ? [ + 'id' => (int) $asset->supplier->id, + 'name'=> e($asset->supplier->name) + ] : null, + 'notes' => e($asset->notes), + 'order_number' => e($asset->order_number), + 'company' => ($asset->company) ? [ + 'id' => (int) $asset->company->id, + 'name'=> e($asset->company->name) + ] : null, + 'location' => ($asset->assetLoc) ? [ + 'id' => (int) $asset->assetLoc->id, + 'name'=> e($asset->assetLoc->name) + ] : null, + 'rtd_location' => ($asset->defaultLoc) ? [ + 'id' => (int) $asset->defaultLoc->id, + 'name'=> e($asset->defaultLoc->name) + ] : null, + 'image' => ($asset->getImageUrl()) ? $asset->getImageUrl() : null, + 'assigned_to' => $this->transformAssignedTo($asset), + 'warranty' => ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null, + 'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null, + 'created_at' => Helper::getFormattedDateObject($asset->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($asset->updated_at, 'datetime'), + 'purchase_date' => Helper::getFormattedDateObject($asset->purchase_date, 'date'), + 'last_checkout' => Helper::getFormattedDateObject($asset->last_checkout, 'datetime'), + 'expected_checkin' => Helper::getFormattedDateObject($asset->expected_checkin, 'date'), + 'purchase_cost' => Helper::formatCurrencyOutput($asset->purchase_cost), + 'user_can_checkout' => (bool) $asset->availableForCheckout(), + ]; + + + if ($asset->model->fieldset) { + $fields_array = array(); + foreach ($asset->model->fieldset->fields as $field) { + + if ($field->isFieldDecryptable($asset->{$field->convertUnicodeDbSlug()})) { + $decrypted = \App\Helpers\Helper::gracefulDecrypt($field,$asset->{$field->convertUnicodeDbSlug()}); + $value = (Gate::allows('superadmin')) ? $decrypted : strtoupper(trans('admin/custom_fields/general.encrypted')); + + // $fields_array = [$field->convertUnicodeDbSlug() => $value]; + + + $fields_array[$field->name] = [ + 'field' => $field->convertUnicodeDbSlug(), + 'value' => $value + ]; + + } else { + $fields_array[$field->name] = [ + 'field' => $field->convertUnicodeDbSlug(), + 'value' => $asset->{$field->convertUnicodeDbSlug()} + ]; + //$fields_array = [$field->convertUnicodeDbSlug() => $asset->{$field->convertUnicodeDbSlug()}]; + + + } + //array += $fields_array; + $array['custom_fields'] = $fields_array; + } + } else { + $array['custom_fields'] = array(); + } + + $permissions_array['available_actions'] = [ + 'checkout' => (bool) Gate::allows('checkout', Asset::class), + 'checkin' => (bool) Gate::allows('checkin', Asset::class), + 'clone' => Gate::allows('create', Asset::class) ? true : false, + 'update' => (bool) Gate::allows('update', Asset::class), + 'delete' => (bool) Gate::allows('delete', Asset::class), + ]; + + $array += $permissions_array; + return $array; + } + + public function transformAssetsDatatable($assets) + { + return (new DatatablesTransformer)->transformDatatables($assets); + } + + public function transformAssignedTo($asset) + { + if ($asset->checkedOutToUser()) { + return $asset->assignedTo ? [ + 'id' => (int) $asset->assignedTo->id, + 'username' => e($asset->assignedTo->username), + 'name' => e($asset->assignedTo->getFullNameAttribute()), + 'first_name'=> e($asset->assignedTo->first_name), + 'last_name'=> e($asset->assignedTo->last_name), + 'employee_number' => e($asset->assignedTo->employee_num), + 'type' => 'user' + ] : null; + } + return $asset->assignedTo ? [ + 'id' => $asset->assignedTo->id, + 'name' => $asset->assignedTo->display_name, + 'type' => $asset->assignedType() + ] : null; + } +} diff --git a/app/Http/Transformers/CategoriesTransformer.php b/app/Http/Transformers/CategoriesTransformer.php new file mode 100644 index 0000000000..bcfa0aec26 --- /dev/null +++ b/app/Http/Transformers/CategoriesTransformer.php @@ -0,0 +1,55 @@ +transformDatatables($array, $total); + } + + public function transformCategory (Category $category = null) + { + if ($category) { + + $array = [ + 'id' => (int) $category->id, + 'name' => e($category->name), + 'type' => e($category->category_type), + 'use_default_eula' => ($category->use_default_eula =='1') ? true : false, + 'checkin_email' => ($category->checkin_email =='1') ? true : false, + 'require_acceptance' => ($category->require_acceptance =='1') ? true : false, + 'assets_count' => $category->assets_count, + 'accessories_count' => $category->accessories_count, + 'consumables_count' => $category->consumables_count, + 'components_count' => $category->components_count, + 'created_at' => Helper::getFormattedDateObject($category->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($category->updated_at, 'datetime'), + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Category::class) ? true : false, + 'delete' => Gate::allows('delete', Category::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + } + + + +} diff --git a/app/Http/Transformers/CompaniesTransformer.php b/app/Http/Transformers/CompaniesTransformer.php new file mode 100644 index 0000000000..fb94535976 --- /dev/null +++ b/app/Http/Transformers/CompaniesTransformer.php @@ -0,0 +1,53 @@ +transformDatatables($array, $total); + } + + public function transformCompany (Company $company = null) + { + if ($company) { + + $array = [ + 'id' => (int) $company->id, + 'name' => e($company->name), + "created_at" => Helper::getFormattedDateObject($company->created_at, 'datetime'), + "updated_at" => Helper::getFormattedDateObject($company->updated_at, 'datetime'), + "assets_count" => (int) $company->assets_count, + "licenses_count" => (int) $company->licenses_count, + "accessories_count" => (int) $company->accessories_count, + "consumables_count" => (int) $company->consumables_count, + "components_count" => (int) $company->components_count, + "users_count" => (int) $company->users_count + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Company::class) ? true : false, + 'delete' => Gate::allows('delete', Company::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + } + + + +} diff --git a/app/Http/Transformers/ComponentsAssetsTransformer.php b/app/Http/Transformers/ComponentsAssetsTransformer.php new file mode 100644 index 0000000000..f8a169ca32 --- /dev/null +++ b/app/Http/Transformers/ComponentsAssetsTransformer.php @@ -0,0 +1,56 @@ +transformDatatables($array, $total); + } + + + public function transformAsset (Asset $asset) + { + $array = [ + 'id' => $asset->id, + 'name' => e($asset->name), + 'created_at' => $asset->created_at->format('Y-m-d'), + 'qty' => $asset->components()->count(), + 'user_can_checkout' => $asset->availableForCheckout(), + ]; + + $permissions_array['available_actions'] = [ + 'checkout' => Gate::allows('checkout', Asset::class) ? true : false, + 'checkin' => Gate::allows('checkin', Asset::class) ? true : false, + 'update' => Gate::allows('update', Asset::class) ? true : false, + 'delete' => Gate::allows('delete', Asset::class) ? true : false, + ]; + + + + $array += $permissions_array; + + if ($asset->model->fieldset) { + foreach ($asset->model->fieldset->fields as $field) { + $fields_array = [$field->name => $asset->{$field->convertUnicodeDbSlug()}]; + $array += $fields_array; + } + } + + return $array; + } + + public function transformAssetsDatatable ($assets) { + return (new DatatablesTransformer)->transformDatatables($assets); + } +} diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php new file mode 100644 index 0000000000..ef27dd782b --- /dev/null +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -0,0 +1,69 @@ +transformDatatables($array, $total); + } + + public function transformComponent(Component $component) + { + $array = [ + 'id' => (int) $component->id, + 'name' => e($component->name), + 'serial_number' => e($component->serial), + 'location' => ($component->location) ? [ + 'id' => (int) $component->location->id, + 'name' => e($component->location->name) + ] : null, + 'qty' => ($component->qty!='') ? (int) $component->qty : null, + 'min_amt' => ($component->min_amt!='') ? (int) $component->min_amt : null, + 'category' => ($component->category) ? [ + 'id' => (int) $component->category->id, + 'name' => e($component->category->name) + ] : null, + 'order_number' => e($component->order_number), + 'purchase_date' => Helper::getFormattedDateObject($component->purchase_date, 'date'), + 'purchase_cost' => Helper::formatCurrencyOutput($component->purchase_cost), + 'remaining' => (int) $component->numRemaining(), + 'company' => ($component->company) ? [ + 'id' => (int) $component->company->id, + 'name' => e($component->company->name) + ] : null, + 'created_at' => Helper::getFormattedDateObject($component->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($component->updated_at, 'datetime'), + 'user_can_checkout' => ($component->numRemaining() > 0) ? 1 : 0, + ]; + + $permissions_array['available_actions'] = [ + 'checkout' => (bool) Gate::allows('checkout', Component::class), + 'checkin' => (bool) Gate::allows('checkin', Component::class), + 'update' => (bool) Gate::allows('update', Component::class), + 'delete' => (bool) Gate::allows('delete', Component::class), + ]; + $array += $permissions_array; + + return $array; + } + + + public function transformCheckedoutComponents(Collection $components_users, $total) + { + $array = array(); + foreach ($components_users as $user) { + $array[] = (new UsersTransformer)->transformUser($user); + } + return (new DatatablesTransformer)->transformDatatables($array, $total); + } +} diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php new file mode 100644 index 0000000000..44bfe73818 --- /dev/null +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -0,0 +1,71 @@ +transformDatatables($array, $total); + } + + public function transformConsumable (Consumable $consumable) + { + $array = [ + 'id' => (int) $consumable->id, + 'category' => ($consumable->category) ? ['id' => $consumable->category->id, 'name' => e($consumable->category->name)] : null, + 'company' => ($consumable->company) ? ['id' => (int) $consumable->company->id, 'name' => e($consumable->company->name)] : null, + 'item_no' => e($consumable->item_no), + 'location' => ($consumable->location) ? ['id' => (int) $consumable->location->id, 'name' => e($consumable->location->name)] : null, + 'manufacturer' => ($consumable->manufacturer) ? ['id' => (int) $consumable->manufacturer->id, 'name' => e($consumable->manufacturer->name)] : null, + 'min_amt' => (int) $consumable->min_amt, + 'model_number' => e($consumable->model_number), + 'name' => e($consumable->name), + 'remaining' => $consumable->numRemaining(), + 'order_number' => e($consumable->order_number), + 'purchase_cost' => Helper::formatCurrencyOutput($consumable->purchase_cost), + 'purchase_date' => Helper::getFormattedDateObject($consumable->purchase_date, 'date'), + 'qty' => (int) $consumable->qty, + 'created_at' => Helper::getFormattedDateObject($consumable->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($consumable->updated_at, 'datetime'), + ]; + + $permissions_array['user_can_checkout'] = false; + + if ($consumable->numRemaining() > 0) { + $permissions_array['user_can_checkout'] = true; + } + + $permissions_array['available_actions'] = [ + 'checkout' => Gate::allows('checkout', Consumable::class) ? true : false, + 'checkin' => Gate::allows('checkin', Consumable::class) ? true : false, + 'update' => Gate::allows('update', Consumable::class) ? true : false, + 'delete' => Gate::allows('delete', Consumable::class) ? true : false, + ]; + $array += $permissions_array; + return $array; + } + + + public function transformCheckedoutConsumables (Collection $consumables_users, $total) + { + + $array = array(); + foreach ($consumables_users as $user) { + $array[] = (new UsersTransformer)->transformUser($user); + } + return (new DatatablesTransformer)->transformDatatables($array, $total); + } + + + +} diff --git a/app/Http/Transformers/CustomFieldsTransformer.php b/app/Http/Transformers/CustomFieldsTransformer.php new file mode 100644 index 0000000000..4d41ce2323 --- /dev/null +++ b/app/Http/Transformers/CustomFieldsTransformer.php @@ -0,0 +1,36 @@ +transformDatatables($array, $total); + } + + public function transformCustomField (CustomField $field) + { + + $array = [ + 'name' => e($field->name), + 'db_column_name' => e($field->db_column_name()), + 'format' => e($field->format), + 'required' => $field->pivot ? $field->pivot->required : false, + 'created_at' => Helper::getFormattedDateObject($field->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($field->updated_at, 'datetime'), + ]; + return $array; + } + + +} diff --git a/app/Http/Transformers/CustomFieldsetsTransformer.php b/app/Http/Transformers/CustomFieldsetsTransformer.php new file mode 100644 index 0000000000..040931b5e7 --- /dev/null +++ b/app/Http/Transformers/CustomFieldsetsTransformer.php @@ -0,0 +1,47 @@ +transformDatatables($array, $total); + } + + public function transformCustomFieldset (CustomFieldset $fieldset) + { + $fields = $fieldset->fields; + $models = $fieldset->models; + $modelsArray = array(); + + foreach ($models as $model) + { + $modelsArray[] = [ + 'id' => $model->id, + 'name' => e($model->name) + ]; + } + + $array = [ + 'id' => (int) $fieldset->id, + 'name' => e($fieldset->name), + 'fields' => (new CustomFieldsTransformer)->transformCustomFields($fields, $fieldset->fields_count), + 'models' => (new DatatablesTransformer)->transformDatatables($modelsArray, $fieldset->models_count), + 'created_at' => Helper::getFormattedDateObject($fieldset->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($fieldset->updated_at, 'datetime'), + ]; + return $array; + } +} diff --git a/app/Http/Transformers/DatatablesTransformer.php b/app/Http/Transformers/DatatablesTransformer.php new file mode 100644 index 0000000000..a9a8a5e4f6 --- /dev/null +++ b/app/Http/Transformers/DatatablesTransformer.php @@ -0,0 +1,16 @@ +transformDatatables($array, $total); + } + + public function transformDepartment (Department $department = null) + { + if ($department) { + + $array = [ + 'id' => (int) $department->id, + 'name' => e($department->name), + 'company' => ($department->company) ? [ + 'id' => (int) $department->company->id, + 'name'=> e($department->company->name) + ] : null, + 'manager' => ($department->manager) ? [ + 'id' => (int) $department->manager->id, + 'name' => e($department->manager->getFullNameAttribute()), + 'first_name'=> e($department->manager->first_name), + 'last_name'=> e($department->manager->last_name) + ] : null, + 'location' => ($department->location) ? [ + 'id' => (int) $department->location->id, + 'name' => e($department->location->name) + ] : null, + 'users_count' => e($department->users_count), + 'created_at' => Helper::getFormattedDateObject($department->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($department->updated_at, 'datetime'), + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Department::class) ? true : false, + 'delete' => Gate::allows('delete', Department::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + } + + + +} diff --git a/app/Http/Transformers/DepreciationsTransformer.php b/app/Http/Transformers/DepreciationsTransformer.php new file mode 100644 index 0000000000..70304005c9 --- /dev/null +++ b/app/Http/Transformers/DepreciationsTransformer.php @@ -0,0 +1,43 @@ +transformDatatables($array); + } + + public function transformDepreciation (Depreciation $depreciation) + { + $array = [ + 'id' => (int) $depreciation->id, + 'name' => e($depreciation->name), + 'months' => $depreciation->months . ' '. trans('general.months'), + 'created_at' => Helper::getFormattedDateObject($depreciation->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($depreciation->updated_at, 'datetime'), + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Depreciation::class) ? true : false, + 'delete' => Gate::allows('delete', Depreciation::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + +} diff --git a/app/Http/Transformers/GroupsTransformer.php b/app/Http/Transformers/GroupsTransformer.php new file mode 100644 index 0000000000..a40a23bf02 --- /dev/null +++ b/app/Http/Transformers/GroupsTransformer.php @@ -0,0 +1,44 @@ +transformDatatables($array); + } + + public function transformGroup (Group $group) + { + $array = [ + 'id' => (int) $group->id, + 'name' => e($group->name), + 'permissions' => $group->permissions, + 'users_count' => (int) $group->users_count, + 'created_at' => Helper::getFormattedDateObject($group->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($group->updated_at, 'datetime'), + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('superadmin') ? true : false, + 'delete' => Gate::allows('superadmin') ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + +} diff --git a/app/Http/Transformers/ImportsTransformer.php b/app/Http/Transformers/ImportsTransformer.php new file mode 100644 index 0000000000..53b59d462f --- /dev/null +++ b/app/Http/Transformers/ImportsTransformer.php @@ -0,0 +1,42 @@ + (int) $import->id, + 'file_path' => e($import->file_path), + 'filesize' => Setting::fileSizeConvert($import->filesize), + 'name' => e($import->name), + 'import_type' => e($import->import_type), + 'created_at' => $import->created_at->diffForHumans(), + 'header_row' => $import->header_row, + 'first_row' => $import->first_row, + 'field_map' => $import->field_map, + + ]; + + return $array; + } + + public function transformImportsDatatable($imports) + { + return (new DatatablesTransformer)->transformDatatables($imports); + } +} diff --git a/app/Http/Transformers/LicensesTransformer.php b/app/Http/Transformers/LicensesTransformer.php new file mode 100644 index 0000000000..8dad4b160e --- /dev/null +++ b/app/Http/Transformers/LicensesTransformer.php @@ -0,0 +1,67 @@ +transformDatatables($array, $total); + } + + public function transformLicense (License $license) + { + $array = [ + 'id' => (int) $license->id, + 'name' => e($license->name), + 'company' => ($license->company) ? ['id' => (int) $license->company->id,'name'=> e($license->company->name)] : null, + 'manufacturer' => ($license->manufacturer) ? ['id' => (int) $license->manufacturer->id,'name'=> e($license->manufacturer->name)] : null, + 'product_key' => e($license->serial), + 'order_number' => e($license->order_number), + 'purchase_order' => e($license->purchase_order), + 'purchase_date' => Helper::getFormattedDateObject($license->purchase_date, 'date'), + 'purchase_cost' => e($license->purchase_cost), + 'depreciation' => ($license->depreciation) ? ['id' => (int) $license->depreciation->id,'name'=> e($license->depreciation->name)] : null, + 'notes' => e($license->notes), + 'expiration_date' => Helper::getFormattedDateObject($license->expiration_date, 'date'), + 'total_seats' => (int) $license->total_seats, + 'remaining_qty' => $license->remaincount(), + 'min_qty' => $license->remaincount(), + 'license_name' => e($license->license_name), + 'license_email' => e($license->license_email), + 'maintained' => ($license->maintained == 1) ? true : false, + 'supplier' => ($license->supplier) ? ['id' => (int) $license->supplier->id,'name'=> e($license->supplier->name)] : null, + 'created_at' => Helper::getFormattedDateObject($license->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($license->updated_at, 'datetime'), + 'user_can_checkout' => (bool) ($license->remaincount() > 0), + ]; + + $permissions_array['available_actions'] = [ + 'checkout' => Gate::allows('checkout', License::class) ? true : false, + 'checkin' => Gate::allows('checkin', License::class) ? true : false, + 'clone' => Gate::allows('create', License::class) ? true : false, + 'update' => Gate::allows('update', License::class) ? true : false, + 'delete' => Gate::allows('delete', License::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + public function transformAssetsDatatable($licenses) { + return (new DatatablesTransformer)->transformDatatables($licenses); + } + + + +} diff --git a/app/Http/Transformers/LocationsTransformer.php b/app/Http/Transformers/LocationsTransformer.php new file mode 100644 index 0000000000..1366391d3c --- /dev/null +++ b/app/Http/Transformers/LocationsTransformer.php @@ -0,0 +1,69 @@ +transformDatatables($array, $total); + } + + public function transformLocation(Location $location = null) + { + if ($location) { + + $children_arr = []; + foreach($location->childLocations as $child) { + $children_arr[] = [ + 'id' => (int) $child->id, + 'name' => $child->name + ]; + } + + $array = [ + 'id' => (int) $location->id, + 'name' => e($location->name), + 'address' => e($location->address), + 'city' => e($location->city), + 'state' => e($location->state), + 'assets_checkedout' => $location->assets()->count(), + 'assets_default' => $location->assignedassets()->count(), + 'country' => e($location->country), + 'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'), + 'parent' => ($location->parent) ? [ + 'id' => (int) $location->parent->id, + 'name'=> e($location->parent->name) + ] : null, + 'manager' => ($location->manager) ? (new UsersTransformer)->transformUser($location->manager) : null, + + + 'children' => $children_arr, + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Location::class) ? true : false, + 'delete' => Gate::allows('delete', Location::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + } + + + +} diff --git a/app/Http/Transformers/ManufacturersTransformer.php b/app/Http/Transformers/ManufacturersTransformer.php new file mode 100644 index 0000000000..a1911a4468 --- /dev/null +++ b/app/Http/Transformers/ManufacturersTransformer.php @@ -0,0 +1,55 @@ +transformDatatables($array, $total); + } + + public function transformManufacturer (Manufacturer $manufacturer = null) + { + if ($manufacturer) { + + $array = [ + 'id' => (int) $manufacturer->id, + 'name' => e($manufacturer->name), + 'url' => e($manufacturer->url), + 'support_url' => e($manufacturer->support_url), + 'support_phone' => e($manufacturer->support_phone), + 'support_email' => e($manufacturer->support_email), + 'assets_count' => (int) $manufacturer->assets_count, + 'licenses_count' => (int) $manufacturer->licenses_count, + 'consumables_count' => (int) $manufacturer->consumables_count, + 'accessories_count' => (int) $manufacturer->accessories_count, + 'created_at' => Helper::getFormattedDateObject($manufacturer->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($manufacturer->updated_at, 'datetime'), + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Manufacturer::class) ? true : false, + 'delete' => Gate::allows('delete', Manufacturer::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + } + + + +} diff --git a/app/Http/Transformers/StatuslabelsTransformer.php b/app/Http/Transformers/StatuslabelsTransformer.php new file mode 100644 index 0000000000..7eb3be4f4d --- /dev/null +++ b/app/Http/Transformers/StatuslabelsTransformer.php @@ -0,0 +1,45 @@ +transformDatatables($array); + } + + public function transformStatuslabel (Statuslabel $statuslabel) + { + $array = [ + 'id' => (int) $statuslabel->id, + 'name' => e($statuslabel->name), + 'type' => $statuslabel->getStatuslabelType(), + 'color' => ($statuslabel->color) ? e($statuslabel->color) : null, + 'show_in_nav' => ($statuslabel->show_in_nav=='1') ? true : false, + 'notes' => e($statuslabel->notes), + 'created_at' => Helper::getFormattedDateObject($statuslabel->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($statuslabel->updated_at, 'datetime'), + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Statuslabel::class) ? true : false, + 'delete' => Gate::allows('delete', Statuslabel::class) ? true : false, + ]; + $array += $permissions_array; + + return $array; + } + + + +} diff --git a/app/Http/Transformers/SuppliersTransformer.php b/app/Http/Transformers/SuppliersTransformer.php new file mode 100644 index 0000000000..f588ae0468 --- /dev/null +++ b/app/Http/Transformers/SuppliersTransformer.php @@ -0,0 +1,62 @@ +transformDatatables($array, $total); + } + + public function transformSupplier (Supplier $supplier = null) + { + if ($supplier) { + + $array = [ + 'id' => (int) $supplier->id, + 'name' => e($supplier->name), + 'address' => ($supplier->address) ? e($supplier->address) : null, + 'address2' => ($supplier->address2) ? e($supplier->address2) : null, + 'city' => ($supplier->city) ? e($supplier->city) : null, + 'state' => ($supplier->state) ? e($supplier->state) : null, + 'country' => ($supplier->country) ? e($supplier->country) : null, + 'zip' => ($supplier->zip) ? e($supplier->zip) : null, + 'fax' => ($supplier->fax) ? e($supplier->fax) : null, + 'phone' => ($supplier->phone) ? e($supplier->phone) : null, + 'email' => ($supplier->email) ? e($supplier->email) : null, + 'contact' => ($supplier->contact) ? e($supplier->contact) : null, + 'assets_count' => (int) $supplier->assets_count, + 'licenses_count' => (int) $supplier->licenses_count, + 'image' => ($supplier->image) ? e($supplier->image) : null, + 'notes' => ($supplier->notes) ? e($supplier->notes) : null, + 'created_at' => Helper::getFormattedDateObject($supplier->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($supplier->updated_at, 'datetime'), + + ]; + + $permissions_array['available_actions'] = [ + 'update' => Gate::allows('update', Supplier::class) ? true : false, + 'delete' => Gate::allows('delete', Supplier::class) ? true : false, + ]; + + $array += $permissions_array; + + return $array; + } + + + } + + + +} diff --git a/app/Http/Transformers/UsersTransformer.php b/app/Http/Transformers/UsersTransformer.php new file mode 100644 index 0000000000..810372bfbf --- /dev/null +++ b/app/Http/Transformers/UsersTransformer.php @@ -0,0 +1,96 @@ +transformDatatables($array, $total); + } + + public function transformUser (User $user) + { + $array = [ + 'id' => (int) $user->id, + 'name' => e($user->first_name).' '.($user->last_name), + 'firstname' => e($user->first_name), + 'lastname' => e($user->last_name), + 'username' => e($user->username), + 'employee_num' => e($user->employee_num), + 'manager' => ($user->manager) ? [ + 'id' => (int) $user->manager->id, + 'name'=> e($user->manager->username) + ] : null, + 'jobtitle' => ($user->jobtitle) ? e($user->jobtitle) : null, + 'email' => e($user->email), + 'department' => ($user->department) ? [ + 'id' => (int) $user->department->id, + 'name'=> e($user->department->name) + ] : null, + 'location' => ($user->userloc) ? [ + 'id' => (int) $user->userloc->id, + 'name'=> e($user->userloc->name) + ] : null, + 'permissions' => $user->decodePermissions(), + 'activated' => ($user->activated =='1') ? true : false, + 'two_factor_activated' => ($user->two_factor_active()) ? true : false, + 'assets_count' => (int) $user->assets_count, + 'licenses_count' => (int) $user->licenses_count, + 'accessories_count' => (int) $user->accessories_count, + 'consumables_count' => (int) $user->consumables_count, + 'company' => ($user->company) ? ['id' => (int) $user->company->id,'name'=> e($user->company->name)] : null, + 'created_at' => Helper::getFormattedDateObject($user->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($user->updated_at, 'datetime'), + 'last_login' => Helper::getFormattedDateObject($user->last_login, 'datetime'), + ]; + + $permissions_array['available_actions'] = [ + 'update' => (Gate::allows('update', User::class) && ($user->deleted_at=='')) ? true : false, + 'delete' => (Gate::allows('delete', User::class) && ($user->deleted_at=='')) ? true : false, + 'clone' => (Gate::allows('create', User::class) && ($user->deleted_at=='')) , + 'restore' => (Gate::allows('create', User::class) && ($user->deleted_at!='')) ? true : false, + ]; + + $array += $permissions_array; + + + $numGroups = count($user->groups); + if($numGroups > 0) + { + $groups["total"] = $numGroups; + foreach($user->groups as $group) + { + $groups["rows"][] = [ + 'id' => (int) $group->id, + 'name' => e($group->name) + ]; + } + $array["groups"] = $groups; + } + else { + $array["groups"] = null; + } + + return $array; + } + + public function transformUsersDatatable($users) { + return (new DatatablesTransformer)->transformDatatables($users); + } + + + + + +} diff --git a/app/Http/routes.php b/app/Http/routes.php deleted file mode 100755 index 2fdbcb309e..0000000000 --- a/app/Http/routes.php +++ /dev/null @@ -1,1094 +0,0 @@ - 'api', 'middleware' => 'auth' ], function () { - - /*---Hardware API---*/ - Route::group([ 'prefix' => 'hardware','middleware' => ['web','auth','authorize:assets.view']], function () { - - Route::get('list/{status?}', [ 'as' => 'api.hardware.list', 'uses' => 'AssetsController@getDatatable' ]); - - Route::post('import', 'AssetsController@postAPIImportUpload'); - }); - - /*---Status Label API---*/ - Route::group([ 'prefix' => 'statuslabels' ,'middleware' => ['web','auth','authorize:admin']], function () { - - Route::resource('/', 'StatuslabelsController'); - Route::get('{statuslabelId}/deployable', function ($statuslabelId) { - - $statuslabel = Statuslabel::find($statuslabelId); - if (( $statuslabel->deployable == '1' ) && ( $statuslabel->pending != '1' ) - && ( $statuslabel->archived != '1' ) - ) { - return '1'; - } else { - return '0'; - } - - }); - - Route::get('list', [ 'as' => 'api.statuslabels.list', 'uses' => 'StatuslabelsController@getDatatable' ]); - Route::get('assets', [ 'as' => 'api.statuslabels.assets', 'uses' => 'StatuslabelsController@getAssetCountByStatuslabel' ]); - - }); - - /*---Accessories API---*/ - Route::group([ 'prefix' => 'accessories' ], function () { - - Route::get('list', [ 'as' => 'api.accessories.list', 'uses' => 'AccessoriesController@getDatatable' ]); - Route::get( - '{accessoryID}/view', - [ 'as' => 'api.accessories.view', 'uses' => 'AccessoriesController@getDataView' ] - ); - }); - - /*---Consumables API---*/ - Route::group(array('prefix'=>'consumables'), function () { - Route::get('list', array('as'=>'api.consumables.list', 'uses'=>'ConsumablesController@getDatatable')); - Route::get('{consumableID}/view', array('as'=>'api.consumables.view', 'uses'=>'ConsumablesController@getDataView')); - }); - - /*---Components API---*/ - Route::group(array('prefix'=>'components'), function () { - Route::get('list', array('as'=>'api.components.list', 'uses'=>'ComponentsController@getDatatable')); - Route::get('{componentID}/view', array('as'=>'api.components.view', 'uses'=>'ComponentsController@getDataView')); - }); - - /*---Locations API---*/ - Route::group(array('prefix'=>'locations'), function () { - Route::get('list', array('as'=>'api.locations.list', 'uses'=>'LocationsController@getDatatable')); - Route::get('{locationID}/view', array('as'=>'api.locations.view', 'uses'=>'LocationsController@getDataView')); - Route::get('{locationID}/users', array('as'=>'api.locations.viewusers', 'uses'=>'LocationsController@getDataViewUsers')); - Route::get('{locationID}/assets', array('as'=>'api.locations.viewassets', 'uses'=>'LocationsController@getDataViewAssets')); - }); - - /*---Depreciations API---*/ - Route::group(array('prefix'=>'depreciations'), function () { - Route::get('list', array('as'=>'api.depreciations.list', 'uses'=>'DepreciationsController@getDatatable')); - Route::get('{$depreciationID}/view', array('as'=>'api.depreciations.view', 'uses'=>'DepreciationsController@getDataView')); - }); - - /*---Manufacturers API---*/ - Route::group(array('prefix'=>'manufacturers'), function () { - Route::get('list', array('as'=>'api.manufacturers.list', 'uses'=>'ManufacturersController@getDatatable')); - Route::get('{manufacturerID}/view/{itemtype}', array('as'=>'api.manufacturers.view', 'uses'=>'ManufacturersController@getDataView')); - }); - - /*---Suppliers API---*/ - Route::group(array('prefix'=>'suppliers'), function () { - Route::get('list', array('as'=>'api.suppliers.list', 'uses'=>'SuppliersController@getDatatable')); - }); - - /*---Users API---*/ - Route::group([ 'prefix' => 'users' ], function () { - Route::post('/', [ 'as' => 'api.users.store', 'uses' => 'UsersController@store' ]); - Route::post('two_factor_reset', [ 'as' => 'api.users.two_factor_reset', 'uses' => 'UsersController@postTwoFactorReset' ]); - Route::get('list/{status?}', [ 'as' => 'api.users.list', 'uses' => 'UsersController@getDatatable' ]); - Route::get('{userId}/assets', [ 'as' => 'api.users.assetlist', 'uses' => 'UsersController@getAssetList' ]); - Route::post('{userId}/upload', [ 'as' => 'upload/user', 'uses' => 'UsersController@postUpload' ]); - }); - - /*---Groups API---*/ - Route::group([ 'prefix' => 'groups' ], function () { - Route::get('list', [ 'as' => 'api.groups.list', 'uses' => 'GroupsController@getDatatable' ]); - }); - - /*---Licenses API---*/ - Route::group([ 'prefix' => 'licenses' ], function () { - - Route::get('list', [ 'as' => 'api.licenses.list', 'uses' => 'LicensesController@getDatatable' ]); - }); - - /*---Locations API---*/ - Route::group([ 'prefix' => 'locations' ], function () { - - Route::resource('/', 'LocationsController'); - Route::get('{locationID}/check', function ($locationID) { - - $location = Location::find($locationID); - - return $location; - }); - }); - - /*---Improvements API---*/ - Route::group([ 'prefix' => 'asset_maintenances' ], function () { - - Route::get( - 'list', - [ 'as' => 'api.asset_maintenances.list', 'uses' => 'AssetMaintenancesController@getDatatable' ] - ); - }); - - /*---Models API---*/ - Route::group([ 'prefix' => 'models' ], function () { - - Route::resource('/', 'AssetModelsController'); - Route::get('list/{status?}', [ 'as' => 'api.models.list', 'uses' => 'AssetModelsController@getDatatable' ]); - Route::get('{modelID}/view', [ 'as' => 'api.models.view', 'uses' => 'AssetModelsController@getDataView' ]); - }); - - /*--- Categories API---*/ - Route::group([ 'prefix' => 'categories' ], function () { - - Route::get('list', [ 'as' => 'api.categories.list', 'uses' => 'CategoriesController@getDatatable' ]); - Route::get( - '{categoryID}/asset/view', - [ 'as' => 'api.categories.asset.view', 'uses' => 'CategoriesController@getDataViewAssets' ] - ); - Route::get( - '{categoryID}/accessory/view', - [ 'as' => 'api.categories.accessory.view', 'uses' => 'CategoriesController@getDataViewAccessories' ] - ); - Route::get( - '{categoryID}/consumable/view', - [ 'as' => 'api.categories.consumable.view', 'uses' => 'CategoriesController@getDataViewConsumables' ] - ); - Route::get( - '{categoryID}/component/view', - [ 'as' => 'api.categories.component.view', 'uses' => 'CategoriesController@getDataViewComponent' ] - ); - }); - - /*-- Suppliers API (mostly for creating new ones in-line while creating an asset) --*/ - Route::group([ 'prefix' => 'suppliers' ], function () { - - Route::resource('/', 'SuppliersController'); - }); - - /*-- Custom fields API --*/ - Route::group([ 'prefix' => 'custom_fields' ], function () { - Route::post( - '{fieldsetID}/order', - [ 'as' => 'api.customfields.order', 'uses' => 'CustomFieldsController@postReorder' ] - ); - }); - -}); - -/* -|-------------------------------------------------------------------------- -| Asset Routes -|-------------------------------------------------------------------------- -| -| Register all the asset routes. -| -*/ - -Route::group( - [ 'prefix' => 'hardware', - 'middleware' => ['web', - 'auth']], - function () { - - Route::get('history', [ - 'as' => 'asset.import-history', - 'middleware' => 'authorize:assets.checkout', - 'uses' => 'AssetsController@getImportHistory' - ]); - - Route::post('history', [ - 'as' => 'asset.process-import-history', - 'middleware' => 'authorize:assets.checkout', - 'uses' => 'AssetsController@postImportHistory' - ]); - - - Route::get('create/{model?}', [ - 'as' => 'create/hardware', - 'middleware' => 'authorize:assets.create', - 'uses' => 'AssetsController@getCreate' - ]); - - Route::post('create', [ - 'as' => 'savenew/hardware', - 'middleware' => 'authorize:assets.create', - 'uses' => 'AssetsController@postCreate' - ]); - - Route::get('{assetId}/edit', [ - 'as' => 'update/hardware', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetsController@getEdit' - ]); - Route::get('/bytag', [ - 'as' => 'findbytag/hardware', - 'middleware' => 'authorize:assets.view', - 'uses' => 'AssetsController@getAssetByTag' - ]); - - Route::get('{assetId}/clone', [ - 'as' => 'clone/hardware', - 'middleware' => 'authorize:assets.create', - 'uses' => 'AssetsController@getClone' - ]); - - Route::post('{assetId}/clone', 'AssetsController@postCreate'); - Route::get('{assetId}/delete', [ - 'as' => 'delete/hardware', - 'middleware' => 'authorize:assets.delete', - 'uses' => 'AssetsController@getDelete' - ]); - Route::get('{assetId}/checkout', [ - 'as' => 'checkout/hardware', - 'middleware' => 'authorize:assets.checkout', - 'uses' => 'AssetsController@getCheckout' - ]); - Route::post('{assetId}/checkout', [ - 'as' => 'checkout/hardware', - 'middleware' => 'authorize:assets.checkout', - 'uses' => 'AssetsController@postCheckout' - ]); - Route::get('{assetId}/checkin/{backto?}', [ - 'as' => 'checkin/hardware', - 'middleware' => 'authorize:assets.checkin', - 'uses' => 'AssetsController@getCheckin' - ]); - - Route::post('{assetId}/checkin/{backto?}', [ - 'as' => 'checkin/hardware', - 'middleware' => 'authorize:assets.checkin', - 'uses' => 'AssetsController@postCheckin' - ]); - Route::get('{assetId}/view', [ - 'as' => 'view/hardware', - 'middleware' => ['authorize:assets.view'], - 'uses' => 'AssetsController@getView' - ]); - Route::get('{assetId}/qr-view', [ 'as' => 'qr-view/hardware', 'uses' => 'AssetsController@getView' ]); - Route::get('{assetId}/qr_code', [ 'as' => 'qr_code/hardware', 'uses' => 'AssetsController@getQrCode' ]); - Route::get('{assetId}/barcode', [ 'as' => 'barcode/hardware', 'uses' => 'AssetsController@getBarCode' ]); - Route::get('{assetId}/restore', [ - 'as' => 'restore/hardware', - 'middleware' => 'authorize:assets.delete', - 'uses' => 'AssetsController@getRestore' - ]); - Route::post('{assetId}/upload', [ - 'as' => 'upload/asset', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetsController@postUpload' - ]); - - Route::get('{assetId}/deletefile/{fileId}', [ - 'as' => 'delete/assetfile', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetsController@getDeleteFile' - ]); - - Route::get('{assetId}/showfile/{fileId}', [ - 'as' => 'show/assetfile', - 'middleware' => 'authorize:assets.view', - 'uses' => 'AssetsController@displayFile' - ]); - - Route::get('import/delete-import/{filename}', [ - 'as' => 'assets/import/delete-file', - 'middleware' => 'authorize:assets.create', - 'uses' => 'AssetsController@getDeleteImportFile' - ]); - - Route::post( 'import/process/', [ 'as' => 'assets/import/process-file', - 'middleware' => 'authorize:assets.create', - 'uses' => 'AssetsController@postProcessImportFile' - ]); - Route::get( 'import/delete/{filename}', [ 'as' => 'assets/import/delete-file', - 'middleware' => 'authorize:assets.create', // TODO What permissions should this require? - 'uses' => 'AssetsController@getDeleteImportFile' - ]); - - Route::get('import',[ - 'as' => 'assets/import', - 'middleware' => 'authorize:assets.create', - 'uses' => 'AssetsController@getImportUpload' - ]); - - - Route::post('{assetId}/edit',[ - 'as' => 'assets/import', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetsController@postEdit' - ]); - - Route::post( - 'bulkedit', - [ - 'as' => 'hardware/bulkedit', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetsController@postBulkEdit' - ] - ); - Route::post( - 'bulkdelete', - [ - 'as' => 'hardware/bulkdelete', - 'middleware' => 'authorize:assets.delete', - 'uses' => 'AssetsController@postBulkDelete' - ] - ); - Route::post( - 'bulksave', - [ - 'as' => 'hardware/bulksave', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetsController@postBulkSave' - ] - ); - - # Bulk checkout / checkin - Route::get( 'bulkcheckout', [ - 'as' => 'hardware/bulkcheckout', - 'middleware' => 'authorize:assets.checkout', - 'uses' => 'AssetsController@getBulkCheckout' - ]); - Route::post( 'bulkcheckout', [ - 'as' => 'hardware/bulkcheckout', - 'middleware' => 'authorize:assets.checkout', - 'uses' => 'AssetsController@postBulkCheckout' - ]); - - # Asset Model Management - Route::group([ 'prefix' => 'models', 'middleware' => ['auth'] ], function () { - - Route::get('create', [ 'as' => 'create/model', 'uses' => 'AssetModelsController@getCreate', 'middleware' => ['authorize:superuser'] ]); - Route::post('create', 'AssetModelsController@postCreate'); - Route::get('{modelId}/edit', [ 'as' => 'update/model', 'uses' => 'AssetModelsController@getEdit' , 'middleware' => ['authorize:superuser']]); - Route::post('{modelId}/edit', [ 'uses' => 'AssetModelsController@postEdit', 'middleware' => ['authorize:superuser']]); - Route::get('{modelId}/clone', [ 'as' => 'clone/model', 'uses' => 'AssetModelsController@getClone' ]); - Route::post('{modelId}/clone', 'AssetModelsController@postCreate'); - Route::get('{modelId}/delete', [ 'as' => 'delete/model', 'uses' => 'AssetModelsController@getDelete', 'middleware' => ['authorize:superuser'] ]); - Route::get('{modelId}/view', [ 'as' => 'view/model', 'uses' => 'AssetModelsController@getView' ]); - Route::get('{modelID}/restore', [ 'as' => 'restore/model', 'uses' => 'AssetModelsController@getRestore', 'middleware' => ['authorize:superuser'] ]); - Route::get('{modelId}/custom_fields', ['as' => 'custom_fields/model','uses' => 'AssetModelsController@getCustomFields']); - Route::get('/', [ 'as' => 'models', 'uses' => 'AssetModelsController@getIndex' ,'middleware' => ['authorize:superuser'] ]); - }); - - Route::get('/', [ - 'as' => 'hardware', - 'middleware' => 'authorize:assets.view', - 'uses' => 'AssetsController@getIndex' - ]); - - } -); - -/* -|-------------------------------------------------------------------------- -| Log Routes -|-------------------------------------------------------------------------- -| -| Register all the admin routes. -| -*/ - -Route::group(['middleware' => 'auth'], function () { - - Route::get( - 'display-sig/{filename}', - [ - 'as' => 'log.signature.view', - 'middleware' => 'authorize:assets.view', - 'uses' => 'ActionlogController@displaySig' ] - ); - - -}); - - - -/* -|-------------------------------------------------------------------------- -| Admin Routes -|-------------------------------------------------------------------------- -| -| Register all the admin routes. -| -*/ - -Route::group([ 'prefix' => 'admin','middleware' => ['web','auth']], function () { - - Route::get('requests', - // foreach( CheckoutRequest::with('user')->get() as $requestedItem) { - // echo $requestedItem->user->username . ' requested ' . $requestedItem->requestedItem->name; - [ - 'as' => 'requests', - 'middleware' => 'authorize:admin', - 'uses' => 'ViewAssetsController@getRequestedIndex' - ]); - # Licenses - Route::group([ 'prefix' => 'licenses', 'middleware'=>'authorize:licenses.view' ], function () { - - Route::get('create', [ 'as' => 'create/licenses', 'middleware' => 'authorize:licenses.create','uses' => 'LicensesController@getCreate' ]); - Route::post('create', [ 'as' => 'create/licenses', 'middleware' => 'authorize:licenses.create','uses' => 'LicensesController@postCreate' ]); - Route::get('{licenseId}/edit', [ 'as' => 'update/license', 'middleware' => 'authorize:licenses.edit', 'uses' => 'LicensesController@getEdit' ]); - Route::post('{licenseId}/edit', [ 'as' => 'update/license', 'middleware' => 'authorize:licenses.edit', 'uses' => 'LicensesController@postEdit' ]); - Route::get('{licenseId}/clone', [ 'as' => 'clone/license', 'middleware' => 'authorize:licenses.create', 'uses' => 'LicensesController@getClone' ]); - Route::post('{licenseId}/clone', [ 'as' => 'clone/license', 'middleware' => 'authorize:licenses.create', 'uses' => 'LicensesController@postCreate' ]); - Route::get('{licenseId}/delete', [ 'as' => 'delete/license', 'middleware' => 'authorize:licenses.delete', 'uses' => 'LicensesController@getDelete' ]); - Route::get('{licenseId}/freecheckout', [ - 'as' => 'freecheckout/license', - 'middleware' => 'authorize:licenses.checkout', - 'uses' => 'LicensesController@getFreeLicense' - ]); - Route::get( - '{licenseId}/checkout', - [ 'as' => 'checkout/license', 'middleware' => 'authorize:licenses.checkout','uses' => 'LicensesController@getCheckout' ] - ); - Route::post( - '{licenseId}/checkout', - [ 'as' => 'checkout/license', 'middleware' => 'authorize:licenses.checkout','uses' => 'LicensesController@postCheckout' ] - ); - Route::get('{licenseId}/checkin/{backto?}', [ - 'as' => 'checkin/license', - 'middleware' => 'authorize:licenses.checkin', - 'uses' => 'LicensesController@getCheckin' - ]); - - Route::post('{licenseId}/checkin/{backto?}', [ - 'as' => 'checkin/license', - 'middleware' => 'authorize:licenses.checkin', - 'uses' => 'LicensesController@postCheckin' - ]); - - Route::get('{licenseId}/view', [ - 'as' => 'view/license', - 'middleware' => 'authorize:licenses.view', - 'uses' => 'LicensesController@getView' - ]); - - Route::post( - '{licenseId}/upload', - [ 'as' => 'upload/license', 'middleware' => 'authorize:licenses.edit','uses' => 'LicensesController@postUpload' ] - ); - Route::get( - '{licenseId}/deletefile/{fileId}', - [ 'as' => 'delete/licensefile', 'middleware' => 'authorize:licenses.edit', 'uses' => 'LicensesController@getDeleteFile' ] - ); - Route::get( - '{licenseId}/showfile/{fileId}', - [ 'as' => 'show/licensefile', 'middleware' => 'authorize:licenses.view','uses' => 'LicensesController@displayFile' ] - ); - Route::get('/', [ 'as' => 'licenses', 'middleware' => 'authorize:licenses.view','uses' => 'LicensesController@getIndex' ]); - }); - - # Asset Maintenances - Route::group([ 'prefix' => 'asset_maintenances', 'middleware'=>'authorize:assets.view' ], function () { - - Route::get('create/{assetId?}', - [ 'as' => 'create/asset_maintenances', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetMaintenancesController@getCreate' - ]); - - Route::post('create/{assetId?}', - [ 'as' => 'create/asset_maintenances.save', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetMaintenancesController@postCreate' - ]); - - Route::get('{assetMaintenanceId}/edit', - [ 'as' => 'update/asset_maintenance', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetMaintenancesController@getEdit' - ]); - - Route::post('{assetMaintenanceId}/edit', - [ 'as' => 'update/asset_maintenance.save', - 'middleware' => 'authorize:assets.edit', - 'uses' => 'AssetMaintenancesController@postEdit' - ]); - - Route::get( - '{assetMaintenanceId}/delete', - [ 'as' => 'delete/asset_maintenance', 'uses' => 'AssetMaintenancesController@getDelete' ] - ); - Route::get( - '{assetMaintenanceId}/view', - [ 'as' => 'view/asset_maintenance', 'uses' => 'AssetMaintenancesController@getView' ] - ); - - Route::get('/', [ 'as' => 'asset_maintenances', 'uses' => 'AssetMaintenancesController@getIndex' ]); - }); - - # Accessories - Route::group([ 'prefix' => 'accessories', 'middleware'=>'authorize:accessories.view' ], function () { - - Route::get('create', [ 'as' => 'create/accessory', 'middleware' => 'authorize:accessories.create','uses' => 'AccessoriesController@getCreate' ]); - Route::post('create', 'AccessoriesController@postCreate'); - Route::get( - '{accessoryID}/edit', - [ 'as' => 'update/accessory', 'middleware' => 'authorize:accessories.edit','uses' => 'AccessoriesController@getEdit' ] - ); - Route::post('{accessoryID}/edit', 'AccessoriesController@postEdit'); - Route::get( - '{accessoryID}/delete', - [ 'as' => 'delete/accessory', 'middleware' => 'authorize:accessories.delete','uses' => 'AccessoriesController@getDelete' ] - ); - Route::get('{accessoryID}/view', [ 'as' => 'view/accessory', 'middleware' => 'authorize:accessories.view','uses' => 'AccessoriesController@getView' ]); - Route::get( - '{accessoryID}/checkout', - [ 'as' => 'checkout/accessory', 'middleware' => 'authorize:accessories.checkout','uses' => 'AccessoriesController@getCheckout' ] - ); - Route::post( - '{accessoryID}/checkout', - [ 'as' => 'checkout/accessory', 'middleware' => 'authorize:accessories.checkout','uses' => 'AccessoriesController@postCheckout' ] - ); - - Route::get( - '{accessoryID}/checkin/{backto?}', - [ 'as' => 'checkin/accessory', 'middleware' => 'authorize:accessories.checkin','uses' => 'AccessoriesController@getCheckin' ] - ); - Route::post( - '{accessoryID}/checkin/{backto?}', - [ 'as' => 'checkin/accessory', 'middleware' => 'authorize:accessories.checkin','uses' => 'AccessoriesController@postCheckin' ] - ); - - Route::get('/', [ 'as' => 'accessories', 'middleware'=>'authorize:accessories.view', 'uses' => 'AccessoriesController@getIndex' ]); - }); - - # Consumables - Route::group([ 'prefix' => 'consumables', 'middleware'=>'authorize:consumables.view' ], function () { - - Route::get('create', [ 'as' => 'create/consumable','middleware'=>'authorize:consumables.create', 'uses' => 'ConsumablesController@getCreate' ]); - Route::post('create', [ 'as' => 'create/consumable','middleware'=>'authorize:consumables.create', 'uses' => 'ConsumablesController@postCreate' ]); - Route::get( - '{consumableID}/edit', - [ 'as' => 'update/consumable', 'middleware'=>'authorize:consumables.edit', 'uses' => 'ConsumablesController@getEdit' ] - ); - Route::post( - '{consumableID}/edit', - [ 'as' => 'update/consumable', 'middleware'=>'authorize:consumables.edit', 'uses' => 'ConsumablesController@postEdit' ] - ); - Route::get( - '{consumableID}/delete', - [ 'as' => 'delete/consumable', 'middleware'=>'authorize:consumables.delete','uses' => 'ConsumablesController@getDelete' ] - ); - Route::get( - '{consumableID}/view', - [ 'as' => 'view/consumable', 'middleware'=>'authorize:consumables.view','uses' => 'ConsumablesController@getView' ] - ); - Route::get( - '{consumableID}/checkout', - [ 'as' => 'checkout/consumable', 'middleware'=>'authorize:consumables.checkout','uses' => 'ConsumablesController@getCheckout' ] - ); - Route::post( - '{consumableID}/checkout', - [ 'as' => 'checkout/consumable', 'middleware'=>'authorize:consumables.checkout','uses' => 'ConsumablesController@postCheckout' ] - ); - Route::get('/', [ 'as' => 'consumables', 'middleware'=>'authorize:consumables.view','uses' => 'ConsumablesController@getIndex' ]); - }); - - # Components - Route::group([ 'prefix' => 'components', 'middleware'=>'authorize:components.view' ], function () { - - Route::get('create', [ 'as' => 'create/component', 'middleware'=>'authorize:components.create','uses' => 'ComponentsController@getCreate' ]); - Route::post('create', [ 'as' => 'create/component', 'middleware'=>'authorize:components.create','uses' => 'ComponentsController@postCreate' ]); - Route::get( - '{componentID}/edit', - [ 'as' => 'update/component', 'middleware'=>'authorize:components.edit','uses' => 'ComponentsController@getEdit' ] - ); - Route::post( - '{componentID}/edit', - [ 'as' => 'update/component', 'middleware'=>'authorize:components.edit','uses' => 'ComponentsController@postEdit' ] - ); - Route::get( - '{componentID}/delete', - [ 'as' => 'delete/component', 'middleware'=>'authorize:components.delete','uses' => 'ComponentsController@getDelete' ] - ); - Route::get( - '{componentID}/view', - [ 'as' => 'view/component', 'middleware'=>'authorize:components.view','uses' => 'ComponentsController@getView' ] - ); - Route::get( - '{componentID}/checkout', - [ 'as' => 'checkout/component', 'middleware'=>'authorize:components.checkout','uses' => 'ComponentsController@getCheckout' ] - ); - Route::post( - '{componentID}/checkout', - [ 'as' => 'checkout/component', 'middleware'=>'authorize:components.checkout','uses' => 'ComponentsController@postCheckout' ] - ); - Route::post('bulk', [ 'as' => 'component/bulk-form', 'middleware'=>'authorize:components.checkout','uses' => 'ComponentsController@postBulk' ]); - Route::post('bulksave', [ 'as' => 'component/bulk-save', 'middleware'=>'authorize:components.edit','uses' => 'ComponentsController@postBulkSave' ]); - Route::get('/', [ 'as' => 'components', 'middleware'=>'authorize:components.view','uses' => 'ComponentsController@getIndex' ]); - }); - - # Admin Settings Routes (for categories, maufactureres, etc) - Route::group([ 'prefix' => 'settings', 'middleware'=>'authorize:superuser'], function () { - - - - # Settings - Route::group([ 'prefix' => 'app' ], function () { - - Route::post('purge', ['as' => 'purge', 'uses' => 'SettingsController@postPurge']); - Route::get('edit', [ 'as' => 'edit/settings', 'uses' => 'SettingsController@getEdit' ]); - Route::post('edit', 'SettingsController@postEdit'); - - Route::get('ldaptest', [ - 'as' => 'settings/ldaptest', - 'uses' => 'SettingsController@getLdapTest' - ]); - - Route::get('/', [ 'as' => 'app', 'uses' => 'SettingsController@getIndex' ]); - }); - - - - # Settings - Route::group([ 'prefix' => 'backups', 'middleware' => 'auth' ], function () { - - - Route::get('download/{filename}', [ - 'as' => 'settings/download-file', - 'uses' => 'SettingsController@downloadFile' ]); - - Route::get('delete/{filename}', [ - 'as' => 'settings/delete-file', - 'uses' => 'SettingsController@deleteFile' ]); - - Route::post('/', [ - 'as' => 'settings/backups', - 'uses' => 'SettingsController@postBackups' - ]); - - - Route::get('/', [ 'as' => 'settings/backups', 'uses' => 'SettingsController@getBackups' ]); - }); - - # Companies - Route::group([ 'prefix' => 'companies' ], function () { - - Route::get('{companyId}/edit', ['as' => 'update/company', 'uses' => 'CompaniesController@getEdit']); - Route::get('create', ['as' => 'create/company', 'uses' => 'CompaniesController@getCreate']); - Route::get('/', ['as' => 'companies', 'uses' => 'CompaniesController@getIndex']); - - Route::post('{companyId}/delete', ['as' => 'delete/company', 'uses' => 'CompaniesController@postDelete']); - Route::post('{companyId}/edit', 'CompaniesController@postEdit'); - Route::post('create', 'CompaniesController@postCreate'); - }); - - - - # Manufacturers - Route::group([ 'prefix' => 'manufacturers' ], function () { - - Route::get('/', [ 'as' => 'manufacturers', 'uses' => 'ManufacturersController@getIndex' ]); - Route::get( - 'create', - [ 'as' => 'create/manufacturer', 'uses' => 'ManufacturersController@getCreate' ] - ); - Route::post('create', 'ManufacturersController@postCreate'); - Route::get( - '{manufacturerId}/edit', - [ 'as' => 'update/manufacturer', 'uses' => 'ManufacturersController@getEdit' ] - ); - Route::post('{manufacturerId}/edit', 'ManufacturersController@postEdit'); - Route::get( - '{manufacturerId}/delete', - [ 'as' => 'delete/manufacturer', 'uses' => 'ManufacturersController@getDelete' ] - ); - Route::get( - '{manufacturerId}/view', - [ 'as' => 'view/manufacturer', 'uses' => 'ManufacturersController@getView' ] - ); - }); - - # Suppliers - Route::group([ 'prefix' => 'suppliers' ], function () { - - Route::get('/', [ 'as' => 'suppliers', 'uses' => 'SuppliersController@getIndex' ]); - Route::get('create', [ 'as' => 'create/supplier', 'uses' => 'SuppliersController@getCreate' ]); - Route::post('create', 'SuppliersController@postCreate'); - Route::get( - '{supplierId}/edit', - [ 'as' => 'update/supplier', 'uses' => 'SuppliersController@getEdit' ] - ); - Route::post('{supplierId}/edit', 'SuppliersController@postEdit'); - Route::get( - '{supplierId}/delete', - [ 'as' => 'delete/supplier', 'uses' => 'SuppliersController@getDelete' ] - ); - Route::get('{supplierId}/view', [ 'as' => 'view/supplier', 'uses' => 'SuppliersController@getView' ]); - }); - - # Categories - Route::group([ 'prefix' => 'categories' ], function () { - - Route::get('create', [ 'as' => 'create/category', 'uses' => 'CategoriesController@getCreate' ]); - Route::post('create', 'CategoriesController@postCreate'); - Route::get( - '{categoryId}/edit', - [ 'as' => 'update/category', 'uses' => 'CategoriesController@getEdit' ] - ); - Route::post('{categoryId}/edit', 'CategoriesController@postEdit'); - Route::get( - '{categoryId}/delete', - [ 'as' => 'delete/category', 'uses' => 'CategoriesController@getDelete' ] - ); - Route::get( - '{categoryId}/view', - [ 'as' => 'view/category', 'uses' => 'CategoriesController@getView' ] - ); - Route::get('/', [ 'as' => 'categories', 'uses' => 'CategoriesController@getIndex' ]); - }); - - # Depreciations - Route::group([ 'prefix' => 'depreciations' ], function () { - - Route::get('/', [ 'as' => 'depreciations', 'uses' => 'DepreciationsController@getIndex' ]); - Route::get( - 'create', - [ 'as' => 'create/depreciations', 'uses' => 'DepreciationsController@getCreate' ] - ); - Route::post('create', 'DepreciationsController@postCreate'); - Route::get( - '{depreciationId}/edit', - [ 'as' => 'update/depreciations', 'uses' => 'DepreciationsController@getEdit' ] - ); - Route::post('{depreciationId}/edit', 'DepreciationsController@postEdit'); - Route::get( - '{depreciationId}/delete', - [ 'as' => 'delete/depreciations', 'uses' => 'DepreciationsController@getDelete' ] - ); - }); - - # Locations - Route::group([ 'prefix' => 'locations' ], function () { - - Route::get('/', [ 'as' => 'locations', 'uses' => 'LocationsController@getIndex' ]); - Route::get('create', [ 'as' => 'create/location', 'uses' => 'LocationsController@getCreate' ]); - Route::post('create', 'LocationsController@postCreate'); - Route::get( - '{locationId}/edit', - [ 'as' => 'update/location', 'uses' => 'LocationsController@getEdit' ] - ); - Route::post('{locationId}/edit', 'LocationsController@postEdit'); - Route::get('{locationId}/view', [ 'as' => 'view/location', 'uses' => 'LocationsController@getView' ]); - Route::get( - '{locationId}/delete', - [ 'as' => 'delete/location', 'uses' => 'LocationsController@getDelete' ] - ); - }); - - # Status Labels - Route::group([ 'prefix' => 'statuslabels' ], function () { - - Route::get('/', [ 'as' => 'statuslabels', 'uses' => 'StatuslabelsController@getIndex' ]); - Route::get('create', [ 'as' => 'create/statuslabel', 'uses' => 'StatuslabelsController@getCreate' ]); - Route::post('create', 'StatuslabelsController@postCreate'); - Route::get( - '{statuslabelId}/edit', - [ 'as' => 'update/statuslabel', 'uses' => 'StatuslabelsController@getEdit' ] - ); - Route::post('{statuslabelId}/edit', 'StatuslabelsController@postEdit'); - Route::get( - '{statuslabelId}/delete', - [ 'as' => 'delete/statuslabel', 'uses' => 'StatuslabelsController@getDelete' ] - ); - }); - - }); - - # Custom fields support - Route::get('custom_fields/create-field', ['uses' =>'CustomFieldsController@createField','as' => 'admin.custom_fields.create-field']); - Route::post('custom_fields/create-field', ['uses' => 'CustomFieldsController@storeField','as' => 'admin.custom_fields.store-field']); - Route::post('custom_fields/{id}/associate', ['uses' => 'CustomFieldsController@associate','as' => 'admin.custom_fields.associate']); - Route::get('custom_fields/{field_id}/{fieldset_id}/disassociate', ['uses' => 'CustomFieldsController@deleteFieldFromFieldset','as' => 'admin.custom_fields.disassociate']); - Route::match(['DELETE'], 'custom_fields/delete-field/{id}', ['uses' => 'CustomFieldsController@deleteField','as' => 'admin.custom_fields.delete-field']); - Route::resource('custom_fields', 'CustomFieldsController'); - - # User Management - Route::group([ 'prefix' => 'users', 'middleware' => ['web','auth','authorize:users.view']], function () { - - Route::get('ldap', ['as' => 'ldap/user', 'uses' => 'UsersController@getLDAP', 'middleware' => ['authorize:users.edit'] ]); - Route::post('ldap', 'UsersController@postLDAP'); - - Route::get('create', [ 'as' => 'create/user', 'uses' => 'UsersController@getCreate', 'middleware' => ['authorize:users.edit'] ]); - Route::post('create', [ 'uses' => 'UsersController@postCreate', 'middleware' => ['authorize:users.edit'] ]); - Route::get('import', [ 'as' => 'import/user', 'uses' => 'UsersController@getImport', 'middleware' => ['authorize:users.edit'] ]); - Route::post('import', [ 'uses' => 'UsersController@postImport', 'middleware' => ['authorize:users.edit'] ]); - Route::get('export', [ 'uses' => 'UsersController@getExportUserCsv', 'middleware' => ['authorize:users.view'] ]); - Route::get('{userId}/edit', [ 'as' => 'update/user', 'uses' => 'UsersController@getEdit', 'middleware' => ['authorize:users.edit'] ]); - Route::post('{userId}/edit', [ 'uses' => 'UsersController@postEdit', 'middleware' => ['authorize:users.edit'] ]); - Route::get('{userId}/clone', [ 'as' => 'clone/user', 'uses' => 'UsersController@getClone', 'middleware' => ['authorize:users.edit'] ]); - Route::post('{userId}/clone', [ 'uses' => 'UsersController@postCreate', 'middleware' => ['authorize:users.edit'] ]); - Route::get('{userId}/delete', [ 'as' => 'delete/user', 'uses' => 'UsersController@getDelete', 'middleware' => ['authorize:users.delete'] ]); - Route::get('{userId}/restore', [ 'as' => 'restore/user', 'uses' => 'UsersController@getRestore', 'middleware' => ['authorize:users.edit'] ]); - Route::get('{userId}/view', [ 'as' => 'view/user', 'uses' => 'UsersController@getView' , 'middleware' => ['authorize:users.view'] ]); - Route::get('{userId}/unsuspend', [ 'as' => 'unsuspend/user', 'uses' => 'UsersController@getUnsuspend', 'middleware' => ['authorize:users.edit'] ]); - Route::get( - '{userId}/deletefile/{fileId}', - [ 'as' => 'delete/userfile', 'uses' => 'UsersController@getDeleteFile' ] - ); - Route::get( - '{userId}/showfile/{fileId}', - [ 'as' => 'show/userfile', 'uses' => 'UsersController@displayFile' ] - ); - - Route::post( - 'bulkedit', - [ - 'as' => 'users/bulkedit', - 'uses' => 'UsersController@postBulkEdit', - 'middleware' => ['authorize:users.edit'], - ] - ); - Route::post( - 'bulksave', - [ - 'as' => 'users/bulksave', - 'uses' => 'UsersController@postBulkSave', - 'middleware' => ['authorize:users.edit'], - ] - ); - - Route::get('/', [ 'as' => 'users', 'uses' => 'UsersController@getIndex' ]); - - }); - - # Group Management - Route::group([ 'prefix' => 'groups', 'middleware' => ['web','auth','authorize:superadmin'] ], function () { - - Route::get('/', [ 'as' => 'groups', 'uses' => 'GroupsController@getIndex' ]); - Route::get('create', [ 'as' => 'create/group', 'uses' => 'GroupsController@getCreate' ]); - Route::post('create', 'GroupsController@postCreate'); - Route::get('{groupId}/edit', [ 'as' => 'update/group', 'uses' => 'GroupsController@getEdit' ]); - Route::post('{groupId}/edit', 'GroupsController@postEdit'); - Route::get('{groupId}/delete', [ 'as' => 'delete/group', 'uses' => 'GroupsController@getDelete' ]); - Route::get('{groupId}/restore', [ 'as' => 'restore/group', 'uses' => 'GroupsController@getRestore' ]); - Route::get('{groupId}/view', [ 'as' => 'view/group', 'uses' => 'GroupsController@getView' ]); - }); - - # Dashboard - Route::get('/', [ 'as' => 'admin', 'uses' => 'DashboardController@getIndex' ]); - -}); - -/* -|-------------------------------------------------------------------------- -| Account Routes -|-------------------------------------------------------------------------- -| -| -| -*/ -Route::group([ 'prefix' => 'account', 'middleware' => ['web', 'auth']], function () { - - # Profile - Route::get('profile', [ 'as' => 'profile', 'uses' => 'ProfileController@getIndex' ]); - Route::post('profile', 'ProfileController@postIndex'); - - # View Assets - Route::get('view-assets', [ 'as' => 'view-assets', 'uses' => 'ViewAssetsController@getIndex' ]); - - # Accept Asset - Route::get( - 'accept-asset/{logID}', - [ 'as' => 'account/accept-assets', 'uses' => 'ViewAssetsController@getAcceptAsset' ] - ); - Route::post( - 'accept-asset/{logID}', - [ 'as' => 'account/asset-accepted', 'uses' => 'ViewAssetsController@postAcceptAsset' ] - ); - - # Profile - Route::get( - 'requestable-assets', - [ 'as' => 'requestable-assets', 'uses' => 'ViewAssetsController@getRequestableIndex' ] - ); - Route::get( - 'request-asset/{assetId}', - [ 'as' => 'account/request-asset', 'uses' => 'ViewAssetsController@getRequestAsset' ] - ); - - Route::post( - 'request/{itemType}/{itemId}', - [ 'as' => 'account/request-item', 'uses' => 'ViewAssetsController@getRequestItem'] - ); - - # Account Dashboard - Route::get('/', [ 'as' => 'account', 'uses' => 'ViewAssetsController@getIndex' ]); - -}); - - -Route::group(['middleware' => ['web','auth','authorize:reports.view']], function () { - - Route::get( - 'reports/depreciation', - [ 'as' => 'reports/depreciation', 'uses' => 'ReportsController@getDeprecationReport' ] - ); - Route::get( - 'reports/export/depreciation', - [ 'as' => 'reports/export/depreciation', 'uses' => 'ReportsController@exportDeprecationReport' ] - ); - Route::get( - 'reports/asset_maintenances', - [ 'as' => 'reports/asset_maintenances', 'uses' => 'ReportsController@getAssetMaintenancesReport' ] - ); - Route::get( - 'reports/export/asset_maintenances', - [ - 'as' => 'reports/export/asset_maintenances', - 'uses' => 'ReportsController@exportAssetMaintenancesReport' - ] - ); - Route::get( - 'reports/licenses', - [ 'as' => 'reports/licenses', 'uses' => 'ReportsController@getLicenseReport' ] - ); - Route::get( - 'reports/export/licenses', - [ 'as' => 'reports/export/licenses', 'uses' => 'ReportsController@exportLicenseReport' ] - ); - Route::get('reports/assets', [ 'as' => 'reports/assets', 'uses' => 'ReportsController@getAssetsReport' ]); - Route::get( - 'reports/export/assets', - [ 'as' => 'reports/export/assets', 'uses' => 'ReportsController@exportAssetReport' ] - ); - Route::get('reports/accessories', [ 'as' => 'reports/accessories', 'uses' => 'ReportsController@getAccessoryReport' ]); - Route::get( - 'reports/export/accessories', - [ 'as' => 'reports/export/accessories', 'uses' => 'ReportsController@exportAccessoryReport' ] - ); - Route::get('reports/custom', [ 'as' => 'reports/custom', 'uses' => 'ReportsController@getCustomReport' ]); - Route::post('reports/custom', 'ReportsController@postCustom'); - - Route::get( - 'reports/activity', - [ 'as' => 'reports/activity', 'uses' => 'ReportsController@getActivityReport' ] - ); - - Route::get( - 'reports/activity/json', - [ 'as' => 'api.activity.list', 'uses' => 'ReportsController@getActivityReportDataTable' ] - ); - - Route::get( - 'reports/unaccepted_assets', - [ 'as' => 'reports/unaccepted_assets', 'uses' => 'ReportsController@getAssetAcceptanceReport' ] - ); - Route::get( - 'reports/export/unaccepted_assets', - [ 'as' => 'reports/export/unaccepted_assets', 'uses' => 'ReportsController@exportAssetAcceptanceReport' ] - ); -}); - - -/* -|-------------------------------------------------------------------------- -| Setup Routes -|-------------------------------------------------------------------------- -| -| -| -*/ -Route::group([ 'prefix' => 'setup', 'middleware' => 'web'], function () { - Route::get( - 'user', - [ - 'as' => 'setup.user', - 'uses' => 'SettingsController@getSetupUser' ] - ); - - Route::post( - 'user', - [ - 'as' => 'setup.user.save', - 'uses' => 'SettingsController@postSaveFirstAdmin' ] - ); - - - Route::get( - 'migrate', - [ - 'as' => 'setup.migrate', - 'uses' => 'SettingsController@getSetupMigrate' ] - ); - - Route::get( - 'done', - [ - 'as' => 'setup.done', - 'uses' => 'SettingsController@getSetupDone' ] - ); - - Route::get( - 'mailtest', - [ - 'as' => 'setup.mailtest', - 'uses' => 'SettingsController@ajaxTestEmail' ] - ); - - - Route::get( - '/', - [ - 'as' => 'setup', - 'uses' => 'SettingsController@getSetupIndex' ] - ); - -}); - -Route::get( - 'two-factor-enroll', - [ - 'as' => 'two-factor-enroll', - 'middleware' => ['web'], - 'uses' => 'Auth\AuthController@getTwoFactorEnroll' ] -); - -Route::get( - 'two-factor', - [ - 'as' => 'two-factor', - 'middleware' => ['web'], - 'uses' => 'Auth\AuthController@getTwoFactorAuth' ] -); - -Route::post( - 'two-factor', - [ - 'as' => 'two-factor', - 'middleware' => ['web'], - 'uses' => 'Auth\AuthController@postTwoFactorAuth' ] -); - -Route::get( - '/', - [ - 'as' => 'home', - 'middleware' => ['web', 'auth'], - 'uses' => 'DashboardController@getIndex' ] -); - - - -Route::group(['middleware' => 'web'], function () { - Route::auth(); - Route::get( - 'login', - [ - 'as' => 'login', - 'middleware' => ['web'], - 'uses' => 'Auth\AuthController@showLoginForm' ] - ); - Route::get( - 'logout', - [ - 'as' => 'logout', - 'uses' => 'Auth\AuthController@logout' ] - ); - -}); - -Route::get('home', function () { - return redirect('/'); -}); diff --git a/app/Importer/AccessoryImporter.php b/app/Importer/AccessoryImporter.php new file mode 100644 index 0000000000..30b7be5e22 --- /dev/null +++ b/app/Importer/AccessoryImporter.php @@ -0,0 +1,51 @@ +createAccessoryIfNotExists(); + } + + /** + * Create an accessory if a duplicate does not exist + * + * @author Daniel Melzter + * @since 3.0 + */ + public function createAccessoryIfNotExists() + { + $accessory = Accessory::where('name', $this->item['name'])->first(); + if ($accessory) { + if (!$this->updating) { + $this->log('A matching Accessory ' . $this->item["name"] . ' already exists. '); + return; + } + + $this->log('Updating Accessory'); + $accessory->update($this->sanitizeItemForUpdating($accessory)); + $accessory->save(); + return; + } + $this->log("No Matching Accessory, Creating a new one"); + $accessory = new Accessory(); + $accessory->fill($this->sanitizeItemForStoring($accessory)); + if ($accessory->save()) { + $accessory->logCreate('Imported using CSV Importer'); + $this->log('Accessory ' . $this->item["name"] . ' was created'); + return; + } + $this->logError($accessory, 'Accessory'); + } +} diff --git a/app/Importer/AssetImporter.php b/app/Importer/AssetImporter.php new file mode 100644 index 0000000000..08772e4abb --- /dev/null +++ b/app/Importer/AssetImporter.php @@ -0,0 +1,97 @@ +defaultStatusLabelId = Statuslabel::first()->id; + } + + protected function handle($row) + { + // ItemImporter handles the general fetching. + parent::handle($row); + + foreach ($this->customFields as $customField) { + $customFieldValue = $this->array_smart_custom_field_fetch($row, $customField); + if ($customFieldValue) { + $this->item['custom_fields'][$customField->db_column_name()] = $customFieldValue; + $this->log('Custom Field '. $customField->name.': '.$customFieldValue); + } + } + + $this->createAssetIfNotExists($row); + } + + /** + * Create the asset if it does not exist. + * + * @author Daniel Melzter + * @since 3.0 + * @param array $row + * @return Asset|mixed|null + */ + public function createAssetIfNotExists(array $row) + { + $editingAsset = false; + $asset_tag = $this->findCsvMatch($row, "asset_tag"); + $asset = Asset::where(['asset_tag'=> $asset_tag])->first(); + if ($asset) { + if (!$this->updating) { + $this->log('A matching Asset ' . $asset_tag . ' already exists'); + return; + } + + $this->log("Updating Asset"); + $editingAsset = true; + } else { + $this->log("No Matching Asset, Creating a new one"); + $asset = new Asset; + } + + $this->item['image'] = $this->findCsvMatch($row, "image"); + $this->item['warranty_months'] = intval($this->findCsvMatch($row, "warranty")); + $this->item['model_id'] = $this->createOrFetchAssetModel($row); + + // If no status ID is found + if (!array_key_exists('status_id', $this->item) && !$editingAsset) { + $this->log("No status field found, defaulting to first status."); + $this->item['status_id'] = $this->defaultStatusLabelId; + } + + $this->item['asset_tag'] = $asset_tag; + // By default we're set this to location_id in the item. + $item = $this->sanitizeItemForStoring($asset, $editingAsset); + if (isset($this->item["location_id"])) { + $item['rtd_location_id'] = $this->item['location_id']; + unset($item['location_id']); + } + if ($editingAsset) { + $asset->update($item); + } else { + $asset->fill($item); + } + if (array_key_exists('custom_fields', $this->item)) { + foreach ($this->item['custom_fields'] as $custom_field => $val) { + $asset->{$custom_field} = $val; + } + } + if ($asset->save()) { + $asset->logCreate('Imported using csv importer'); + $this->log('Asset ' . $this->item["name"] . ' with serial number ' . $this->item['serial'] . ' was created'); + return; + } + $this->logError($asset, 'Asset "' . $this->item['name'].'"'); + } +} diff --git a/app/Importer/ComponentImporter.php b/app/Importer/ComponentImporter.php new file mode 100644 index 0000000000..c7dd9d2a02 --- /dev/null +++ b/app/Importer/ComponentImporter.php @@ -0,0 +1,69 @@ +createComponentIfNotExists(); + } + + /** + * Create a component if a duplicate does not exist + * + * @author Daniel Melzter + * @since 3.0 + */ + public function createComponentIfNotExists() + { + $component = null; + $editingComponent = false; + $this->log("Creating Component"); + $component = Component::where('name', $this->item['name']); + + if ($component) { + $editingComponent = true; + $this->log('A matching Component ' . $this->item["name"] . ' already exists. '); + if (!$this->updating) { + $this->log("Skipping Component"); + return; + } + $this->log("Updating Component"); + $component = $this->components[$componentId]; + $component->update($this->sanitizeItemFor($component)); + $component->save(); + return; + } + $this->log("No matching component, creating one"); + $component = new Component; + $component->fill($$this->sanitizeItemForStoring($component)); + + if ($component->save()) { + $component->logCreate('Imported using CSV Importer'); + $this->log("Component " . $this->item["name"] . ' was created'); + + // If we have an asset tag, checkout to that asset. + if (isset($this->item['asset_tag']) && ($asset = Asset::where('asset_tag', $this->item['asset_tag'])->first())) { + $component->assets()->attach($component->id, [ + 'component_id' => $component->id, + 'user_id' => $this->user_id, + 'created_at' => date('Y-m-d H:i:s'), + 'assigned_qty' => 1, // Only assign the first one to the asset + 'asset_id' => $asset->id + ]); + } + return; + } + $this->logError($component, 'Component'); + } +} diff --git a/app/Importer/ConsumableImporter.php b/app/Importer/ConsumableImporter.php new file mode 100644 index 0000000000..c54b935539 --- /dev/null +++ b/app/Importer/ConsumableImporter.php @@ -0,0 +1,51 @@ +createConsumableIfNotExists(); + } + + /** + * Create a consumable if a duplicate does not exist + * + * @author Daniel Melzter + * @since 3.0 + */ + public function createConsumableIfNotExists() + { + $consumable = Consumable::where('name', $this->item['name'])->first(); + if ($consumable) { + if (!$this->updating) { + $this->log('A matching Consumable ' . $this->item["name"] . ' already exists. '); + return; + } + $this->log('Updating Consumable'); + $consumable->update($this->sanitizeItemForUpdating($consumable)); + $consumable->save(); + return; + } + $this->log("No matching consumable, creating one"); + $consumable = new Consumable(); + $consumable->fill($this->sanitizeItemForStoring($consumable)); + if ($consumable->save()) { + $consumable->logCreate('Imported using CSV Importer'); + $this->log("Consumable " . $this->item["name"] . ' was created'); + return; + } + $this->logError($consumable, 'Consumable'); + return; + } +} diff --git a/app/Importer/Importer.php b/app/Importer/Importer.php new file mode 100644 index 0000000000..27d12ddf2c --- /dev/null +++ b/app/Importer/Importer.php @@ -0,0 +1,369 @@ +csv names + * @var array + */ + private $defaultFieldMap = [ + 'asset_tag' => 'asset tag', + 'category' => 'category', + 'company' => 'company', + 'item_name' => 'item name', + 'image' => 'image', + 'expiration_date' => 'expiration date', + 'location' => 'location', + 'notes' => 'notes', + 'license_email' => 'licensed to email', + 'license_name' => "licensed to name", + 'maintained' => 'maintained', + 'manufacturer' => 'manufacturer', + 'asset_model' => "model name", + 'model_number' => 'model number', + 'order_number' => 'order number', + 'purchase_cost' => 'purchase cost', + 'purchase_date' => 'purchase date', + 'purchase_order' => 'purchase order', + 'qty' => 'quantity', + 'reassignable' => 'reassignable', + 'requestable' => 'requestable', + 'seats' => 'seats', + 'serial_number' => 'serial number', + 'status' => 'status', + 'supplier' => 'supplier', + 'termination_date' => 'termination date', + 'warranty_months' => 'warranty', + 'name' => 'name', + 'email' => 'email', + 'username' => 'username' + ]; + /** + * Map of item fields->csv names + * @var array + */ + protected $fieldMap = []; + /** + * @var callable + */ + protected $logCallback; + protected $tempPassword; + /** + * @var callable + */ + protected $progressCallback; + /** + * @var null + */ + protected $usernameFormat; + /** + * @var callable + */ + protected $errorCallback; + + /** + * ObjectImporter constructor. + * @param string $file + */ + public function __construct($file) + { + $this->fieldMap = $this->defaultFieldMap; + // By default the importer passes a url to the file. + // However, for testing we also support passing a string directly + if (is_file($file)) { + $this->csv = Reader::createFromPath($file); + } else { + $this->csv = Reader::createFromString($file); + } + $this->csv->setNewLine('\r\n'); + if (! ini_get("auto_detect_line_endings")) { + ini_set("auto_detect_line_endings", '1'); + } + $this->tempPassword = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); + } + // Cached Values for import lookups + protected $customFields; + + public function import() + { + $headerRow = $this->csv->fetchOne(); + $results = $this->normalizeInputArray($this->csv->fetchAssoc()); + + // Stolen From https://adamwathan.me/2016/07/14/customizing-keys-when-mapping-collections/ + // This 'inverts' the fields such that we have a collection of fields indexed by name. + $cFs = CustomField::All(); + $this->customFields = $cFs->reduce(function ($nameLookup, $field) { + $nameLookup[$field['name']] = $field; + return $nameLookup; + }); + + DB::transaction(function () use (&$results) { + Model::unguard(); + $resultsCount = sizeof($results); + foreach ($results as $row) { + $this->handle($row); + if ($this->progressCallback) { + call_user_func($this->progressCallback, $resultsCount); + } + + $this->log('------------- Action Summary ----------------'); + } + }); + } + + abstract protected function handle($row); + + /** + * Check to see if the given key exists in the array, and trim excess white space before returning it + * + * @author Daniel Melzter + * @since 3.0 + * @param $array array + * @param $key string + * @param $default string + * @return string + */ + public function findCsvMatch(array $array, $key, $default = null) + { + + $val = $default; + + $key = $this->lookupCustomKey($key); + + $this->log("Custom Key: ${key}"); + if (array_key_exists($key, $array)) { + $val = e(Encoding::toUTF8(trim($array[ $key ]))); + } + // $this->log("${key}: ${val}"); + return $val; + } + + /** + * Looks up A custom key in the custom field map + * + * @author Daniel Melzter + * @since 4.0 + * @param $key string + * @return string|null + */ + public function lookupCustomKey($key) + { + if (array_key_exists($key, $this->fieldMap)) { + $this->log("Found a match in our custom map: {$key} is " . $this->fieldMap[$key]); + return $this->fieldMap[$key]; + } + // Otherwise no custom key, return original. + return $key; + } + + /** + * @param $results + * @return array + */ + public function normalizeInputArray($results) + { + $newArray = []; + foreach ($results as $index => $arrayToNormalize) { + $newArray[$index] = array_change_key_case($arrayToNormalize); + } + return $newArray; + } + /** + * Figure out the fieldname of the custom field + * + * @author A. Gianotto + * @since 3.0 + * @param $array array + * @return string + */ + public function array_smart_custom_field_fetch(array $array, $key) + { + $index_name = strtolower($key->name); + return array_key_exists($index_name, $array) ? e(trim($array[$index_name])) : false; + } + + protected function log($string) + { + if ($this->logCallback) { + call_user_func($this->logCallback, $string); + } + } + + protected function logError($item, $field) + { + if ($this->errorCallback) { + call_user_func($this->errorCallback, $item, $field, $item->getErrors()); + } + } + + /** + * Finds the user matching given data, or creates a new one if there is no match + * + * @author Daniel Melzter + * @since 3.0 + * @param $row array + * @return User Model w/ matching name + * @internal param string $user_username Username extracted from CSV + * @internal param string $user_email Email extracted from CSV + * @internal param string $first_name + * @internal param string $last_name + */ + protected function createOrFetchUser($row) + { + $user_name = $this->findCsvMatch($row, "name"); + $user_email = $this->findCsvMatch($row, "email"); + $user_username = $this->findCsvMatch($row, "username"); + $first_name = ''; + $last_name = ''; + // A number was given instead of a name + if (is_numeric($user_name)) { + $this->log('User '.$user_name.' is not a name - assume this user already exists'); + $user_username = ''; + // No name was given + } elseif (empty($user_name)) { + + $this->log('No user data provided - skipping user creation, just adding asset'); + //$user_username = ''; + } else { + $user_email_array = User::generateFormattedNameFromFullName(Setting::getSettings()->email_format, $user_name); + $first_name = $user_email_array['first_name']; + $last_name = $user_email_array['last_name']; + + if ($user_email=='') { + if (Setting::getSettings()->email_domain) { + $user_email = str_slug($user_email_array['username']).'@'.Setting::getSettings()->email_domain; + } + } + + if ($user_username=='') { + if ($this->usernameFormat =='email') { + $user_username = $user_email; + } else { + $user_name_array = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $user_name); + $user_username = $user_name_array['username']; + } + } + } + $user = new User; + + if (!empty($user_username)) { + + if ($user = User::MatchEmailOrUsername($user_username, $user_email) + ->whereNotNull('username')->first()) { + $this->log('User '.$user_username.' already exists'); + } elseif (( $first_name != '') && ($last_name != '') && ($user_username != '')) { + $user = new User; + $user->first_name = $first_name; + $user->last_name = $last_name; + $user->username = $user_username; + $user->email = $user_email; + $user->activated = 1; + $user->password = $this->tempPassword; + + if ($user->save()) { + $this->log('User '.$first_name.' created'); + } else { + $this->logError($user, 'User "' . $first_name . '"'); + } + } + } + return $user; + } + + /** + * Sets the Id of User performing import. + * + * @param mixed $user_id the user id + * + * @return self + */ + public function setUserId($user_id) + { + $this->user_id = $user_id; + + return $this; + } + + /** + * Sets the Are we updating items in the import. + * + * @param bool $updating the updating + * + * @return self + */ + public function setUpdating($updating) + { + $this->updating = $updating; + + return $this; + } + + /** + * Defines mappings of csv fields + * + * @param bool $updating the updating + * + * @return self + */ + public function setFieldMappings($fields) + { + // Some initial sanitization. + $fields = array_map('strtolower', $fields); + $this->fieldMap = array_merge($this->defaultFieldMap, $fields); + + // $this->log($this->fieldMap); + return $this; + } + + /** + * Sets the callbacks for the import + * + * @param callable $logCallback Function to call when we have data to log + * @param callable $progressCallback Function to call to display progress + * @param callable $errorCallback Function to call when we have errors + * + * @return self + */ + public function setCallbacks(callable $logCallback, callable $progressCallback, callable $errorCallback) + { + $this->logCallback = $logCallback; + $this->progressCallback = $progressCallback; + $this->errorCallback = $errorCallback; + + return $this; + } + /** + * Sets the value of usernameFormat. + * + * @param string $usernameFormat the username format + * + * @return self + */ + public function setUsernameFormat($usernameFormat) + { + $this->usernameFormat = $usernameFormat; + + return $this; + } +} diff --git a/app/Importer/ItemImporter.php b/app/Importer/ItemImporter.php new file mode 100644 index 0000000000..4cc85545fb --- /dev/null +++ b/app/Importer/ItemImporter.php @@ -0,0 +1,399 @@ +findCsvMatch($row, "category"); + if ($this->shouldUpdateField($item_category)) { + $this->item["category_id"] = $this->createOrFetchCategory($item_category); + } + + $item_company_name = $this->findCsvMatch($row, "company"); + if ($this->shouldUpdateField($item_company_name)) { + $this->item["company_id"] = $this->createOrFetchCompany($item_company_name); + } + + $item_location = $this->findCsvMatch($row, "location"); + if ($this->shouldUpdateField($item_location)) { + $this->item["location_id"] = $this->createOrFetchLocation($item_location); + } + + $item_manufacturer = $this->findCsvMatch($row, "manufacturer"); + if ($this->shouldUpdateField($item_manufacturer)) { + $this->item["manufacturer_id"] = $this->createOrFetchManufacturer($item_manufacturer); + } + + $item_status_name = $this->findCsvMatch($row, "status"); + if ($this->shouldUpdateField($item_status_name)) { + $this->item["status_id"] = $this->createOrFetchStatusLabel($item_status_name); + } + + $item_supplier = $this->findCsvMatch($row, "supplier"); + if ($this->shouldUpdateField($item_supplier)) { + $this->item['supplier_id'] = $this->createOrFetchSupplier($item_supplier); + } + $this->item["name"] = $this->findCsvMatch($row, "item_name"); + $this->item["notes"] = $this->findCsvMatch($row, "notes"); + $this->item["order_number"] = $this->findCsvMatch($row, "order_number"); + $this->item["purchase_cost"] = $this->findCsvMatch($row, "purchase_cost"); + + $this->item["purchase_date"] = null; + if ($this->findCsvMatch($row, "purchase_date")!='') { + $this->item["purchase_date"] = date("Y-m-d 00:00:01", strtotime($this->findCsvMatch($row, "purchase_date"))); + } + $this->item["qty"] = $this->findCsvMatch($row, "quantity"); + $this->item["requestable"] = $this->findCsvMatch($row, "requestable"); + $this->item["user_id"] = $this->user_id; + $this->item['serial'] = $this->findCsvMatch($row, "serial_number"); + // NO need to call this method if we're running the user import. + // TODO: Merge these methods. + if(get_class($this) !== UserImporter::class) { + if ($this->item["user"] = $this->createOrFetchUser($row)) { + $this->item['assigned_to'] = $this->item['user']->id; + $this->item['assigned_type'] = User::class; + } + } + } + + /** + * Cleanup the $item array before storing. + * We need to remove any values that are not part of the fillable fields. + * Also, if updating, we remove any fields from the array that are empty. + * + * @author Daniel Melzter + * @since 4.0 + * @param $model SnipeModel Model that's being updated. + * @param $updating boolean Should we remove blank values? + * @return array + */ + + protected function sanitizeItemForStoring($model, $updating = false) + { + // Create a collection for all manipulations to come. + $item = collect($this->item); + // First Filter the item down to the model's fillable fields + $item = $item->only($model->getFillable()); + // Then iterate through the item and, if we are updating, remove any blank values. + if ($updating) { + $item = $item->reject(function ($value) { + return empty($value); + }); + } + + return $item->toArray(); + } + + /** + * Convenience function for updating that strips the empty values. + * @param $model SnipeModel Model that's being updated. + * @return array + */ + protected function sanitizeItemForUpdating($model) + { + return $this->sanitizeItemForStoring($model, true); + } + + /** + * Determines if a field needs updating + * Follows the following rules: + * If we are not updating, we should update the field + * If We are updating, we only update the field if it's not empty. + * + * @author Daniel Melzter + * @since 4.0 + * @param $field string + * @return boolean + */ + private function shouldUpdateField($field) + { + if (empty($field)) { + return false; + } + return !($this->updating && empty($field)); + } + /** + * Select the asset model if it exists, otherwise create it. + * + * @author Daniel Melzter + * @since 3.0 + * @param array + * @param $category Category + * @param $manufacturer Manufacturer + * @return int Id of asset model created/found + * @internal param $asset_modelno string + */ + public function createOrFetchAssetModel(array $row) + { + + $asset_model_name = $this->findCsvMatch($row, "asset_model"); + $asset_modelNumber = $this->findCsvMatch($row, "model_number"); + // TODO: At the moment, this means we can't update the model number if the model name stays the same. + if (!$this->shouldUpdateField($asset_model_name)) { + return; + } + if ((empty($asset_model_name)) && (!empty($asset_modelNumber))) { + $asset_model_name = $asset_modelNumber; + } elseif ((empty($asset_model_name)) && (empty($asset_modelNumber))) { + $asset_model_name ='Unknown'; + } + $editingModel = $this->updating; + $asset_model = AssetModel::where(['name' => $asset_model_name, 'model_number' => $asset_modelNumber])->first(); + + if ($asset_model) { + if (!$this->updating) { + $this->log("A matching model already exists, returning it."); + return $asset_model->id; + } + $this->log("Matching Model found, updating it."); + $item = $this->sanitizeItemForStoring($asset_model, $editingModel); + $item['name'] = $asset_model_name; + $item['model_number'] = $asset_modelNumber; + $asset_model->update($item); + $asset_model->save(); + $this->log("Asset Model Updated"); + return $asset_model->id; + } + $this->log("No Matching Model, Creating a new one"); + + $asset_model = new AssetModel(); + $item = $this->sanitizeItemForStoring($asset_model, $editingModel); + $item['name'] = $asset_model_name; + $item['model_number'] = $asset_modelNumber; + + $asset_model->fill($item); + $item = null; + + if ($asset_model->save()) { + $this->log('Asset Model ' . $asset_model_name . ' with model number ' . $asset_modelNumber . ' was created'); + return $asset_model->id; + } + $this->logError($asset_model, 'Asset Model "' . $asset_model_name . '"'); + return null; + } + + /** + * Finds a category with the same name and item type in the database, otherwise creates it + * + * @author Daniel Melzter + * @since 3.0 + * @param $asset_category string + * @return int Id of category created/found + * @internal param string $item_type + */ + public function createOrFetchCategory($asset_category) + { + // Magic to transform "AssetImporter" to "asset" or similar. + $classname = class_basename(get_class($this)); + $item_type = strtolower(substr($classname, 0, strpos($classname, 'Importer'))); + + if (empty($asset_category)) { + $asset_category = 'Unnamed Category'; + } + $category = Category::where(['name' => $asset_category, 'category_type' => $item_type])->first(); + + if ($category) { + $this->log("A matching category: " . $asset_category . " already exists"); + return $category->id; + } + + $category = new Category(); + $category->name = $asset_category; + $category->category_type = $item_type; + $category->user_id = $this->user_id; + + if ($category->save()) { + $this->log('Category ' . $asset_category . ' was created'); + return $category->id; + } + + $this->logError($category, 'Category "'. $asset_category. '"'); + return null; + } + + /** + * Fetch an existing company, or create new if it doesn't exist + * + * @author Daniel Melzter + * @since 3.0 + * @param $asset_company_name string + * @return int id of company created/found + */ + public function createOrFetchCompany($asset_company_name) + { + $company = Company::where(['name' => $asset_company_name])->first(); + if ($company) { + $this->log('A matching Company ' . $asset_company_name . ' already exists'); + return $company->id; + } + $company = new Company(); + $company->name = $asset_company_name; + + if ($company->save()) { + $this->log('Company ' . $asset_company_name . ' was created'); + return $company->id; + } + $this->logError($company, 'Company'); + return null; + } + + /** + * Fetch the existing status label or create new if it doesn't exist. + * + * @author Daniel Melzter + * @since 3.0 + * @param string $asset_statuslabel_name + * @return Statuslabel|null + */ + public function createOrFetchStatusLabel($asset_statuslabel_name) + { + + if (empty($asset_statuslabel_name)) { + return null; + } + $status = Statuslabel::where(['name' => $asset_statuslabel_name])->first(); + + if ($status) { + $this->log('A matching Status ' . $asset_statuslabel_name . ' already exists'); + return $status->id; + } + $this->log("Creating a new status"); + $status = new Statuslabel(); + $status->name = $asset_statuslabel_name; + + $status->deployable = 1; + $status->pending = 0; + $status->archived = 0; + + if ($status->save()) { + $this->log('Status ' . $asset_statuslabel_name . ' was created'); + return $status->id; + } + + $this->logError($status, 'Status "'. $asset_statuslabel_name . '"'); + return null; + } + + /** + * Finds a manufacturer with matching name, otherwise create it. + * + * @author Daniel Melzter + * @since 3.0 + * @param $item_manufacturer string + * @return Manufacturer + */ + + public function createOrFetchManufacturer($item_manufacturer) + { + + if (empty($item_manufacturer)) { + $item_manufacturer='Unknown'; + } + $manufacturer = Manufacturer::where(['name'=> $item_manufacturer])->first(); + + if ($manufacturer) { + $this->log('Manufacturer ' . $item_manufacturer . ' already exists') ; + return $manufacturer->id; + } + + //Otherwise create a manufacturer. + $manufacturer = new Manufacturer(); + $manufacturer->name = $item_manufacturer; + $manufacturer->user_id = $this->user_id; + + if ($manufacturer->save()) { + $this->log('Manufacturer ' . $manufacturer->name . ' was created'); + return $manufacturer->id; + } + $this->logError($manufacturer, 'Manufacturer "'. $manufacturer->name . '"'); + return null; + } + + /** + * Checks the DB to see if a location with the same name exists, otherwise create it + * + * @author Daniel Melzter + * @since 3.0 + * @param $asset_location string + * @return Location|null + */ + public function createOrFetchLocation($asset_location) + { + if (empty($asset_location)) { + $this->log('No location given, so none created.'); + return null; + } + $location = Location::where(['name' => $asset_location])->first(); + + if ($location) { + $this->log('Location ' . $asset_location . ' already exists'); + return $location->id; + } + // No matching locations in the collection, create a new one. + $location = new Location(); + $location->name = $asset_location; + $location->address = ''; + $location->city = ''; + $location->state = ''; + $location->country = ''; + $location->user_id = $this->user_id; + + if ($location->save()) { + $this->log('Location ' . $asset_location . ' was created'); + return $location->id; + } + $this->logError($location, 'Location'); + return null; + } + + /** + * Fetch an existing supplier or create new if it doesn't exist + * + * @author Daniel Melzter + * @since 3.0 + * @param $row array + * @return Supplier + */ + public function createOrFetchSupplier($item_supplier) + { + if (empty($item_supplier)) { + $item_supplier='Unknown'; + } + + $supplier = Supplier::where(['name' => $item_supplier ])->first(); + + if ($supplier) { + $this->log('Supplier ' . $item_supplier . ' already exists'); + return $supplier->id; + } + + $supplier = new Supplier(); + $supplier->name = $item_supplier; + $supplier->user_id = $this->user_id; + + if ($supplier->save()) { + $this->log('Supplier ' . $item_supplier . ' was created'); + return $supplier->id; + } + $this->logError($supplier, 'Supplier'); + return null; + } +} diff --git a/app/Importer/LicenseImporter.php b/app/Importer/LicenseImporter.php new file mode 100644 index 0000000000..207e346a52 --- /dev/null +++ b/app/Importer/LicenseImporter.php @@ -0,0 +1,88 @@ +createLicenseIfNotExists($row); + } + + /** + * Create the license if it does not exist. + * + * @author Daniel Melzter + * @since 4.0 + * @param array $row + * @return License|mixed|null + */ + public function createLicenseIfNotExists(array $row) + { + $editingLicense = false; + $license = License::where('name', $this->item['name'])->first(); + if ($license) { + if (!$this->updating) { + $this->log('A matching License ' . $this->item['name'] . ' already exists'); + return; + } + + $this->log("Updating License"); + $editingLicense = true; + } else { + $this->log("No Matching License, Creating a new one"); + $license = new License; + } + $asset_tag = $this->item['asset_tag'] = $this->findCsvMatch($row, 'asset_tag'); // used for checkout out to an asset. + $this->item['expiration_date'] = $this->findCsvMatch($row, 'expiration_date'); + $this->item['license_email'] = $this->findCsvMatch($row, "license_email"); + $this->item['license_name'] = $this->findCsvMatch($row, "license_name"); + $this->item['maintained'] = $this->findCsvMatch($row, 'maintained'); + $this->item['purchase_order'] = $this->findCsvMatch($row, 'purchase_order'); + $this->item['reassignable'] = $this->findCsvMatch($row, 'reassignable'); + $this->item['seats'] = $this->findCsvMatch($row, 'seats'); + $this->item['termination_date'] = $this->findCsvMatch($row, 'termination_date'); + + if ($editingLicense) { + $license->update($this->sanitizeItemForUpdating($license)); + } else { + $license->fill($this->sanitizeItemForStoring($license)); + } + if ($license->save()) { + $license->logCreate('Imported using csv importer'); + $this->log('License ' . $this->item["name"] . ' with serial number ' . $this->item['serial'] . ' was created'); + + // Lets try to checkout seats if the fields exist and we have seats. + if ($license->seats > 0) { + $user = $this->item['user']; + $asset = Asset::where('asset_tag', $asset_tag)->first(); + $targetLicense = $license->licenseSeats()->first(); + if ($user) { + $targetLicense->assigned_to = $user->id; + if ($asset) { + $targetLicense->asset_id = $asset->id; + } + $targetLicense->save(); + } elseif ($asset) { + $targetLicense->asset_id = $asset->id; + $targetLicense->save(); + } + } + return; + } + $this->logError($license, 'License "' . $this->item['name'].'"'); + } +} diff --git a/app/Importer/UserImporter.php b/app/Importer/UserImporter.php new file mode 100644 index 0000000000..1b0d086f62 --- /dev/null +++ b/app/Importer/UserImporter.php @@ -0,0 +1,67 @@ +users = User::all(); + } + + protected function handle($row) + { + parent::handle($row); + $this->createUserIfNotExists($row); + } + + /** + * Create a user if a duplicate does not exist. + * @todo Investigate how this should interact with Importer::createOrFetchUser + * + * @author Daniel Melzter + * @since 4.0 + */ + public function createUserIfNotExists(array $row) + { + // User Specific Bits + $this->item['username'] = $this->findCsvMatch($row, 'username'); + $this->item['first_name'] = $this->findCsvMatch($row, 'first_name'); + $this->item['last_name'] = $this->findCsvMatch($row, 'last_name'); + $this->item['email'] = $this->findCsvMatch($row, 'user_email'); + $this->item['phone'] = $this->findCsvMatch($row, 'phone_number'); + $this->item['jobtitle'] = $this->findCsvMatch($row, 'jobtitle'); + $this->item['employee_num'] = $this->findCsvMatch($row, 'employee_num'); + $this->item['password'] = $this->tempPassword; + $user = User::where('username', $this->item['username'])->first(); + if ($user) { + if (!$this->updating) { + $this->log('A matching User ' . $this->item["name"] . ' already exists. '); + return; + } + $this->log('Updating User'); + // $user = $this->users[$userId]; + $user->update($this->sanitizeItemForUpdating($user)); + $user->save(); + return; + } + $this->log("No matching user, creating one"); + $user = new User(); + $user->fill($this->sanitizeItemForStoring($user)); + + if ($user->save()) { + // $user->logCreate('Imported using CSV Importer'); + $this->log("User " . $this->item["name"] . ' was created'); + $user = null; + $this->item = null; + return; + } + $this->logError($user, 'User'); + return; + } +} diff --git a/app/Importer/import_mappings.md b/app/Importer/import_mappings.md new file mode 100644 index 0000000000..f2fff2c2f4 --- /dev/null +++ b/app/Importer/import_mappings.md @@ -0,0 +1,33 @@ +| CSV | Item | Applicable Types | +|---------------------|------------------|-------------------------------------------| +| asset tag | asset_tag | Asset | +| category | category | All | +| company | company | All | +| item name | item_name | All | +| image | image | asset | +| expiration date | expiration_date | License | +| location | location | All | +| notes | notes | All | +| licensed to email | license_email | License | +| licensed to name | license_name | License | +| maintained | maintained | License | +| manufacturer | manufacturer | All | +| model name | asset_model | Asset | +| model number | model_number | Asset | +| order number | order_number | All ? | +| purchase cost | purchase_cost | All ? | +| purchase date | purchase_date | All ? | +| purchase order | purchase_order | License | +| quantity | qty | Accessory, Consumable, Component, License | +| reassignable | reassignable | License | +| requestable | requestable | Asset, Accessory? | +| seats | seats | License | +| serial number | serial | asset, license | +| status | status | asset ? All | +| supplier | supplier | Asset ? All | +| termination date | termination_date | License | +| warranty months | warranty_months | asset | +| User Related Fields | assigned_to | Asset | +| name | | | +| email | | | +| username | | | \ No newline at end of file diff --git a/app/LegacyEncrypter/BaseEncrypter.php b/app/LegacyEncrypter/BaseEncrypter.php new file mode 100644 index 0000000000..adc1e451d4 --- /dev/null +++ b/app/LegacyEncrypter/BaseEncrypter.php @@ -0,0 +1,81 @@ +key); + } + + /** + * Get the JSON array from the given payload. + * + * @param string $payload + * @return array + * + * @throws \Illuminate\Contracts\Encryption\DecryptException + */ + protected function getJsonPayload($payload) + { + $payload = json_decode(base64_decode($payload), true); + + // If the payload is not valid JSON or does not have the proper keys set we will + // assume it is invalid and bail out of the routine since we will not be able + // to decrypt the given value. We'll also check the MAC for this encryption. + if (! $payload || $this->invalidPayload($payload)) { + throw new DecryptException('The payload is invalid.'); + } + + if (! $this->validMac($payload)) { + throw new DecryptException('The MAC is invalid.'); + } + + return $payload; + } + + /** + * Verify that the encryption payload is valid. + * + * @param array|mixed $data + * @return bool + */ + protected function invalidPayload($data) + { + return ! is_array($data) || ! isset($data['iv']) || ! isset($data['value']) || ! isset($data['mac']); + } + + /** + * Determine if the MAC for the given payload is valid. + * + * @param array $payload + * @return bool + * + * @throws \RuntimeException + */ + protected function validMac(array $payload) + { + $bytes = random_bytes(16); + + $calcMac = hash_hmac('sha256', $this->hash($payload['iv'], $payload['value']), $bytes, true); + + return hash_equals(hash_hmac('sha256', $payload['mac'], $bytes, true), $calcMac); + } +} diff --git a/app/LegacyEncrypter/McryptEncrypter.php b/app/LegacyEncrypter/McryptEncrypter.php new file mode 100644 index 0000000000..90e92bf4ef --- /dev/null +++ b/app/LegacyEncrypter/McryptEncrypter.php @@ -0,0 +1,214 @@ +key = $key; + $this->cipher = $cipher; + $this->block = mcrypt_get_iv_size($this->cipher, MCRYPT_MODE_CBC); + } else { + throw new RuntimeException('The only supported ciphers are MCRYPT_RIJNDAEL_128 and MCRYPT_RIJNDAEL_256.'); + } + } + + /** + * Determine if the given key and cipher combination is valid. + * + * @param string $key + * @param string $cipher + * @return bool + */ + public static function supported($key, $cipher) + { + return defined('MCRYPT_RIJNDAEL_128') && + ($cipher === MCRYPT_RIJNDAEL_128 || $cipher === MCRYPT_RIJNDAEL_256); + } + + /** + * Encrypt the given value. + * + * @param string $value + * @return string + * + * @throws \Illuminate\Contracts\Encryption\EncryptException + */ + public function encrypt($value, $serialize = true) + { + $iv = mcrypt_create_iv($this->getIvSize(), $this->getRandomizer()); + + $value = base64_encode($this->padAndMcrypt($value, $iv)); + + // Once we have the encrypted value we will go ahead base64_encode the input + // vector and create the MAC for the encrypted value so we can verify its + // authenticity. Then, we'll JSON encode the data in a "payload" array. + $mac = $this->hash($iv = base64_encode($iv), $value); + + $json = json_encode(compact('iv', 'value', 'mac')); + + if (! is_string($json)) { + throw new EncryptException('Could not encrypt the data.'); + } + + return base64_encode($json); + } + + /** + * Pad and use mcrypt on the given value and input vector. + * + * @param string $value + * @param string $iv + * @return string + */ + protected function padAndMcrypt($value, $iv) + { + $value = $this->addPadding(serialize($value)); + + return mcrypt_encrypt($this->cipher, $this->key, $value, MCRYPT_MODE_CBC, $iv); + } + + /** + * Decrypt the given value. + * + * @param string $payload + * @return string + */ + public function decrypt($payload, $unserialize = true) + { + $payload = $this->getJsonPayload($payload); + + // We'll go ahead and remove the PKCS7 padding from the encrypted value before + // we decrypt it. Once we have the de-padded value, we will grab the vector + // and decrypt the data, passing back the unserialized from of the value. + $value = base64_decode($payload['value']); + + $iv = base64_decode($payload['iv']); + + return unserialize($this->stripPadding($this->mcryptDecrypt($value, $iv))); + } + + /** + * Run the mcrypt decryption routine for the value. + * + * @param string $value + * @param string $iv + * @return string + * + * @throws \Illuminate\Contracts\Encryption\DecryptException + */ + protected function mcryptDecrypt($value, $iv) + { + try { + return mcrypt_decrypt($this->cipher, $this->key, $value, MCRYPT_MODE_CBC, $iv); + } catch (Exception $e) { + throw new DecryptException($e->getMessage()); + } + } + + /** + * Add PKCS7 padding to a given value. + * + * @param string $value + * @return string + */ + protected function addPadding($value) + { + $pad = $this->block - (strlen($value) % $this->block); + + return $value.str_repeat(chr($pad), $pad); + } + + /** + * Remove the padding from the given value. + * + * @param string $value + * @return string + */ + protected function stripPadding($value) + { + $pad = ord($value[($len = strlen($value)) - 1]); + + return $this->paddingIsValid($pad, $value) ? substr($value, 0, $len - $pad) : $value; + } + + /** + * Determine if the given padding for a value is valid. + * + * @param string $pad + * @param string $value + * @return bool + */ + protected function paddingIsValid($pad, $value) + { + $beforePad = strlen($value) - $pad; + + return substr($value, $beforePad) == str_repeat(substr($value, -1), $pad); + } + + /** + * Get the IV size for the cipher. + * + * @return int + */ + protected function getIvSize() + { + return mcrypt_get_iv_size($this->cipher, MCRYPT_MODE_CBC); + } + + /** + * Get the random data source available for the OS. + * + * @return int + */ + protected function getRandomizer() + { + if (defined('MCRYPT_DEV_URANDOM')) { + return MCRYPT_DEV_URANDOM; + } + + if (defined('MCRYPT_DEV_RANDOM')) { + return MCRYPT_DEV_RANDOM; + } + + mt_srand(); + + return MCRYPT_RAND; + } +} diff --git a/app/Models/Accessory.php b/app/Models/Accessory.php index 8a4c5106ad..d32a6e115d 100755 --- a/app/Models/Accessory.php +++ b/app/Models/Accessory.php @@ -1,9 +1,7 @@ 'boolean' + ]; /** * Accessory validation rules @@ -27,10 +29,10 @@ class Accessory extends SnipeModel public $rules = array( 'name' => 'required|min:3|max:255', 'qty' => 'required|integer|min:1', - 'category_id' => 'required|integer', - 'company_id' => 'integer', - 'min_amt' => 'integer|min:0', - 'purchase_cost' => 'numeric', + 'category_id' => 'required|integer|exists:categories,id', + 'company_id' => 'integer|nullable', + 'min_amt' => 'integer|min:0|nullable', + 'purchase_cost' => 'numeric|nullable', ); @@ -49,7 +51,28 @@ class Accessory extends SnipeModel * * @var array */ - protected $fillable = ['name','qty','category_id']; + protected $fillable = [ + 'category_id', + 'company_id', + 'location_id', + 'name', + 'order_number', + 'purchase_cost', + 'purchase_date', + 'model_number', + 'manufacturer_id', + 'qty', + 'requestable' + ]; + + public function setRequestableAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['requestable'] = filter_var($value, FILTER_VALIDATE_BOOLEAN); + return; + } public function company() { @@ -109,10 +132,8 @@ class Accessory extends SnipeModel return $Parsedown->text(e($this->category->eula_text)); } elseif ((Setting::getSettings()->default_eula_text) && ($this->category->use_default_eula=='1')) { return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); - } else { - return null; } - + return null; } public function numRemaining() @@ -126,10 +147,10 @@ class Accessory extends SnipeModel /** * Query builder scope to search on text * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $search Search term * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeTextSearch($query, $search) { @@ -144,11 +165,6 @@ class Accessory extends SnipeModel $query->whereHas('company', function ($query) use ($search) { $query->where('companies.name', 'LIKE', '%'.$search.'%'); }); - })->orWhere(function ($query) use ($search) { - $query->whereHas('assetlog', function ($query) use ($search) { - $query->where('action_type', '=', 'checkout') - ->where('created_at', 'LIKE', '%'.$search.'%'); - }); })->orWhere(function ($query) use ($search) { $query->whereHas('location', function ($query) use ($search) { $query->where('locations.name', 'LIKE', '%'.$search.'%'); @@ -165,39 +181,55 @@ class Accessory extends SnipeModel /** * Query builder scope to order on company * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderCompany($query, $order) { - return $query->leftJoin('companies', 'accessories.company_id', '=', 'companies.id')->orderBy('companies.name', $order); + return $query->leftJoin('companies', 'accessories.company_id', '=', 'companies.id') + ->orderBy('companies.name', $order); } /** - * Query builder scope to order on company + * Query builder scope to order on category * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderCategory($query, $order) { - return $query->leftJoin('categories', 'accessories.category_id', '=', 'categories.id')->orderBy('categories.name', $order); + return $query->leftJoin('categories', 'accessories.category_id', '=', 'categories.id') + ->orderBy('categories.name', $order); } /** - * Query builder scope to order on company + * Query builder scope to order on location * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderLocation($query, $order) { - return $query->leftJoin('locations', 'consumables.location_id', '=', 'locations.id')->orderBy('locations.name', $order); + return $query->leftJoin('locations', 'accessories.location_id', '=', 'locations.id') + ->orderBy('locations.name', $order); + } + + /** + * Query builder scope to order on manufacturer + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderManufacturer($query, $order) + { + return $query->leftJoin('manufacturers', 'accessories.manufacturer_id', '=', 'manufacturers.id')->orderBy('manufacturers.name', $order); } } diff --git a/app/Models/Actionlog.php b/app/Models/Actionlog.php index db3556c97f..36603b4bad 100755 --- a/app/Models/Actionlog.php +++ b/app/Models/Actionlog.php @@ -1,10 +1,11 @@ isSuperUser()) { if ($actionlog->target) { $actionlog->company_id = $actionlog->target->company_id; - } else if ($actionlog->item) { + } elseif ($actionlog->item) { $actionlog->company_id = $actionlog->item->company_id; } - } else if (Auth::user() && Auth::user()->company) { + } elseif (Auth::user() && Auth::user()->company) { $actionlog->company_id = Auth::user()->company_id; } }); @@ -45,19 +47,50 @@ class Actionlog extends Model return $this->morphTo('item')->withTrashed(); } - public function company() { - return $this->hasMany('\App\Models\Company', 'id','company_id'); + public function company() + { + return $this->hasMany('\App\Models\Company', 'id', 'company_id'); } public function itemType() { - if($this->item_type == AssetModel::class) { + if ($this->item_type == AssetModel::class) { return "model"; } return camel_case(class_basename($this->item_type)); } + public function targetType() + { + if ($this->target_type == User::class) { + return "user"; + } + return camel_case(class_basename($this->target_type)); + } + + public function parseItemRoute() + { + if ($this->itemType() == "asset") { + $itemroute = 'assets'; + } elseif ($this->itemType() == "accessory") { + $itemroute = 'accessories'; + } elseif ($this->itemType()=="consumable") { + $itemroute = 'consumables'; + } elseif ($this->itemType()=="license") { + $itemroute = 'licenses'; + } elseif ($this->itemType()=="component") { + $itemroute = 'components'; + } else { + $itemroute = ''; + } + + return $itemroute; + } + + + + public function uploads() { return $this->morphTo('item') @@ -78,7 +111,7 @@ class Actionlog extends Model public function target() { - return $this->morphTo('target'); + return $this->morphTo('target')->withTrashed(); } public function childlogs() @@ -91,6 +124,10 @@ class Actionlog extends Model return $this->belongsTo('\App\Models\ActionLog', 'thread_id'); } + public function location() { + return $this->belongsTo('\App\Models\Location', 'location_id' )->withTrashed(); + } + /** * Check if the file exists, and if it does, force a download **/ @@ -117,6 +154,33 @@ class Actionlog extends Model } } + public function daysUntilNextAudit($monthInterval = 12, $asset = null) { + + $now = Carbon::now(); + $last_audit_date = $this->created_at; + $next_audit = $last_audit_date->addMonth($monthInterval); + $next_audit_days = $now->diffInDays($next_audit); + + // Override the default setting for interval if the asset has its own next audit date + if (($asset) && ($asset->next_audit_date)) { + $override_default_next = \Carbon::parse($asset->next_audit_date); + $next_audit_days = $override_default_next->diffInDays($now); + } + + return $next_audit_days; + } + + public function calcNextAuditDate($monthInterval = 12, $asset = null) { + + $last_audit_date = Carbon::parse($this->created_at); + // If there is an asset-specific next date already given, + if (($asset) && ($asset->next_audit_date)) { + return \Carbon::parse($asset->next_audit_date); + } + + return \Carbon::parse($last_audit_date)->addMonths($monthInterval)->toDateString(); + } + /** * getListingOfActionLogsChronologicalOrder * diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 4b352a8565..51ba984948 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1,22 +1,17 @@ 'min:2|max:255', - 'model_id' => 'required|integer', - 'status_id' => 'required|integer', - 'company_id' => 'integer', - 'warranty_months' => 'integer|min:0|max:240', - 'physical' => 'integer', - 'checkout_date' => 'date|max:10|min:10', - 'checkin_date' => 'date|max:10|min:10', - 'supplier_id' => 'integer', - 'asset_tag' => 'required|min:1|max:255|unique_undeleted', - 'status' => 'integer', - 'purchase_cost' => 'numeric', + protected $dates = [ + 'created_at', + 'updated_at', + 'deleted_at', + 'purchase_date', + 'last_checkout', + 'expected_checkin' ]; + use ValidatingTrait, UniqueUndeletedTrait; + + protected $rules = [ + 'name' => 'max:255|nullable', + 'model_id' => 'required|integer|exists:models,id', + 'status_id' => 'required|integer|exists:status_labels,id', + 'company_id' => 'integer|nullable', + 'warranty_months' => 'numeric|nullable', + 'physical' => 'numeric|max:1|nullable', + 'checkout_date' => 'date|max:10|min:10|nullable', + 'checkin_date' => 'date|max:10|min:10|nullable', + 'supplier_id' => 'numeric|nullable', + 'asset_tag' => 'required|min:1|max:255|unique_undeleted', + 'status' => 'integer', + 'purchase_cost' => 'numeric|nullable', + 'next_audit_date' => 'date|nullable', + ]; + /** * The attributes that are mass assignable. * * @var array */ - protected $fillable = ['name','model_id','status_id','asset_tag']; + protected $fillable = [ + 'asset_tag', + 'assigned_to', + 'assigned_type', + 'company_id', + 'image', + 'model_id', + 'name', + 'notes', + 'purchase_cost', + 'purchase_date', + 'rtd_location_id', + 'serial', + 'status_id', + 'supplier_id', + 'warranty_months', + ]; + public function getDisplayNameAttribute() + { + return $this->present()->name(); + } + + /** + * Returns the warranty expiration date as Carbon object + * @return \Carbon|null + */ + public function getWarrantyExpiresAttribute() + { + if (isset($this->attributes['warranty_months']) && isset($this->attributes['purchase_date'])) { + if (is_string($this->attributes['purchase_date']) || is_string($this->attributes['purchase_date'])) { + $purchase_date = \Carbon\Carbon::parse($this->attributes['purchase_date']); + } else { + $purchase_date = \Carbon\Carbon::instance($this->attributes['purchase_date']); + } + $purchase_date->setTime(0, 0, 0); + return $purchase_date->addMonths((int) $this->attributes['warranty_months']); + } + + return null; + } public function company() { @@ -79,19 +126,27 @@ class Asset extends Depreciable public function availableForCheckout() { - return ( + return ( empty($this->assigned_to) && $this->assetstatus->deployable == 1 && empty($this->deleted_at) ); } - /** - * Checkout asset - */ - public function checkOutToUser($user, $admin, $checkout_at = null, $expected_checkin = null, $note = null, $name = null) + /** + * Checkout asset + * @param User $user + * @param User $admin + * @param Carbon $checkout_at + * @param null $expected_checkin + * @param string $note + * @param null $name + * @return bool + */ + //FIXME: The admin parameter is never used. Can probably be removed. + public function checkOut($target, $admin = null, $checkout_at = null, $expected_checkin = null, $note = null, $name = null) { - if (!$user) { + if (!$target) { return false; } @@ -101,104 +156,31 @@ class Asset extends Depreciable $this->last_checkout = $checkout_at; - $this->assigneduser()->associate($user); + $this->assignedTo()->associate($target); - if($name != null) - { + + if ($name != null) { $this->name = $name; } - $settings = Setting::getSettings(); - if ($this->requireAcceptance()) { + if(get_class($target) != User::class) { + throw new CheckoutNotAllowed; + } $this->accepted="pending"; } - - if ($this->save()) { - - // $action, $admin, $user, $expected_checkin = null, $note = null, $checkout_at = null - $log = $this->createLogRecord('checkout', $this, $admin, $user, $expected_checkin, $note, $checkout_at); - - if ((($this->requireAcceptance()=='1') || ($this->getEula())) && ($user->email!='')) { - $this->checkOutNotifyMail($log->id, $user, $checkout_at, $expected_checkin, $note); - } - - if ($settings->slack_endpoint) { - $this->checkOutNotifySlack($settings, $admin, $note); - } + $this->logCheckout($note, $target); return true; - } return false; - } - public function checkOutNotifyMail($log_id, $user, $checkout_at, $expected_checkin, $note) - { - $data['log_id'] = $log_id; - $data['eula'] = $this->getEula(); - $data['first_name'] = $user->first_name; - $data['item_name'] = $this->showAssetName(); - $data['checkout_date'] = $checkout_at; - $data['expected_checkin'] = $expected_checkin; - $data['item_tag'] = $this->asset_tag; - $data['note'] = $note; - $data['item_serial'] = $this->serial; - $data['require_acceptance'] = $this->requireAcceptance(); - - if ((($this->requireAcceptance()=='1') || ($this->getEula())) && (!config('app.lock_passwords'))) { - - \Mail::send('emails.accept-asset', $data, function ($m) use ($user) { - $m->to($user->email, $user->first_name . ' ' . $user->last_name); - $m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name')); - $m->subject(trans('mail.Confirm_asset_delivery')); - }); - } - - } - - public function checkOutNotifySlack($settings, $admin, $note = null) - { - - if ($settings->slack_endpoint) { - - $slack_settings = [ - 'username' => $settings->botname, - 'channel' => $settings->slack_channel, - 'link_names' => true - ]; - - $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); - - try { - $client->attach([ - 'color' => 'good', - 'fields' => [ - [ - 'title' => 'Checked Out:', - 'value' => 'HARDWARE asset <'.config('app.url').'/hardware/'.$this->id.'/view'.'|'.$this->showAssetName().'> checked out to <'.config('app.url').'/admin/users/'.$this->assigned_to.'/view|'.$this->assigneduser->fullName().'> by <'.config('app.url').'/admin/users/'.Auth::user()->id.'/view'.'|'.$admin->fullName().'>.' - ], - [ - 'title' => 'Note:', - 'value' => e($note) - ], - ] - ])->send('Asset Checked Out'); - - } catch (Exception $e) { - LOG::error($e); - } - } - - } - - public function getDetailedNameAttribute() { - if ($this->assignedUser) { - $user_name = $this->assignedUser->fullName(); + if ($this->assignedTo) { + $user_name = $this->assignedTo->present()->name(); } else { $user_name = "Unassigned"; } @@ -210,38 +192,6 @@ class Asset extends Depreciable } - public function createLogRecord($action, $asset, $admin, $user, $expected_checkin = null, $note = null, $checkout_at = null) - { - - $logaction = new Actionlog(); - $logaction->item_type = Asset::class; - $logaction->item_id = $this->id; - $logaction->target_type = User::class; - // On Checkin, this is the user that previously had the asset. - $logaction->target_id = $user->id; - $logaction->note = $note; - $logaction->user_id = $admin->id; - if ($checkout_at!='') { - $logaction->created_at = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s', strtotime($checkout_at))); - } else { - $logaction->created_at = \Carbon\Carbon::now(); - } - - if ($action=="checkout") { - if ($user) { - $logaction->location_id = $user->location_id; - } - } else { - // Update the asset data to null, since it's being checked in - $logaction->location_id = null; - } - $logaction->user()->associate($admin); - $log = $logaction->logaction($action); - - return $logaction; - } - - /** * Set depreciation relationship */ @@ -271,7 +221,6 @@ class Asset extends Depreciable */ public function uploads() { - return $this->hasMany('\App\Models\Actionlog', 'item_id') ->where('item_type', '=', Asset::class) ->where('action_type', '=', 'uploaded') @@ -279,24 +228,53 @@ class Asset extends Depreciable ->orderBy('created_at', 'desc'); } - public function assigneduser() + /** + * Even though we allow allow for checkout to things beyond users + * this method is an easy way of seeing if we are checked out to a user. + * @return mixed + */ + public function checkedOutToUser() { - return $this->belongsTo('\App\Models\User', 'assigned_to') - ->withTrashed(); + return $this->assignedType() === self::USER; + } + + public function assignedTo() + { + return $this->morphTo('assigned', 'assigned_type', 'assigned_to'); + } + + public function assignedAssets() + { + return $this->morphMany('App\Models\Asset', 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); } /** * Get the asset's location based on the assigned user **/ - public function assetloc() + public function assetLoc() { - if ($this->assigneduser) { - return $this->assigneduser->userloc(); - } else { - return $this->belongsTo('\App\Models\Location', 'rtd_location_id'); + if (!empty($this->assignedType())) { + // dd($this->assignedType()); + if ($this->assignedType() == self::ASSET) { + return $this->assignedto->assetloc(); // Recurse until we have a final location + } + if ($this->assignedType() == self::LOCATION) { + return $this->assignedTo(); + } + if ($this->assignedType() == self::USER) { + return $this->assignedTo->userLoc(); + } + if (!$this->assignedTo) { + return $this->defaultLoc(); + } } + return $this->defaultLoc(); } + public function assignedType() + { + return strtolower(class_basename($this->assigned_type)); + } /** * Get the asset's location based on default RTD location **/ @@ -305,6 +283,18 @@ class Asset extends Depreciable return $this->belongsTo('\App\Models\Location', 'rtd_location_id'); } + + public function getImageUrl() + { + if ($this->image && !empty($this->image)) { + return url('/').'/uploads/assets/'.$this->image; + } elseif ($this->model && !empty($this->model->image)) { + return url('/').'/uploads/models/'.$this->model->image; + } + return false; + } + + /** * Get action logs for this asset */ @@ -327,7 +317,6 @@ class Asset extends Depreciable */ public function assetmaintenances() { - return $this->hasMany('\App\Models\AssetMaintenance', 'asset_id') ->orderBy('created_at', 'desc'); } @@ -345,7 +334,6 @@ class Asset extends Depreciable */ public static function assetcount() { - return Company::scopeCompanyables(Asset::where('physical', '=', '1')) ->whereNull('deleted_at', 'and') ->count(); @@ -356,11 +344,9 @@ class Asset extends Depreciable */ public static function availassetcount() { - return Asset::RTD() ->whereNull('deleted_at') ->count(); - } /** @@ -368,11 +354,9 @@ class Asset extends Depreciable */ public static function getRequestable() { - return Asset::Requestable() ->whereNull('deleted_at') ->count(); - } /** @@ -383,35 +367,6 @@ class Asset extends Depreciable return $this->belongsTo('\App\Models\Statuslabel', 'status_id'); } - /** - * Get name for EULA - **/ - public function showAssetName() - { - - if ($this->name == '') { - if ($this->model) { - return $this->model->name.' ('.$this->asset_tag.')'; - } - return $this->asset_tag; - } else { - return $this->name; - } - } - - public function getDisplayNameAttribute() - { - return $this->showAssetName(); - } - - public function warrantee_expires() - { - $date = date_create($this->purchase_date); - date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months')); - return date_format($date, 'Y-m-d'); - } - - public function model() { return $this->belongsTo('\App\Models\AssetModel', 'model_id')->withTrashed(); @@ -419,7 +374,6 @@ class Asset extends Depreciable public static function getExpiringWarrantee($days = 30) { - return Asset::where('archived', '=', '0') ->whereNotNull('warranty_months') ->whereNotNull('purchase_date') @@ -449,41 +403,16 @@ class Asset extends Depreciable return $this->belongsTo('\App\Models\Supplier', 'supplier_id'); } - public function months_until_eol() - { - $today = date("Y-m-d"); - $d1 = new DateTime($today); - $d2 = new DateTime($this->eol_date()); - - if ($this->eol_date() > $today) { - $interval = $d2->diff($d1); - } else { - $interval = null; - } - - return $interval; - } - - public function eol_date() - { - - if (( $this->purchase_date ) && ( $this->model )) { - $date = date_create($this->purchase_date); - date_add($date, date_interval_create_from_date_string($this->model->eol . ' months')); - return date_format($date, 'Y-m-d'); - } - - } /** * Get auto-increment */ public static function autoincrement_asset() { - $settings = \App\Models\Setting::getSettings(); + if ($settings->auto_increment_assets == '1') { $temp_asset_tag = \DB::table('assets') ->where('physical', '=', '1') @@ -493,22 +422,51 @@ class Asset extends Depreciable $asset_tag = preg_replace('/^0*/', '', $asset_tag_digits); if ($settings->zerofill_count > 0) { - return $settings->auto_increment_prefix.Asset::zerofill(($asset_tag + 1),$settings->zerofill_count); + return $settings->auto_increment_prefix.Asset::zerofill($settings->next_auto_tag_base, $settings->zerofill_count); } - return $settings->auto_increment_prefix.($asset_tag + 1); + return $settings->auto_increment_prefix.$settings->next_auto_tag_base; } else { return false; } } + /* + * Get the next base number for the auto-incrementer. We'll add the zerofill and + * prefixes on the fly as we generate the number + * + */ + public static function nextAutoIncrement($assets) + { - public static function zerofill ($num, $zerofill = 3) + $max = 1; + + foreach ($assets as $asset) { + $results = preg_match ( "/\d+$/" , $asset['asset_tag'], $matches); + + if ($results) + { + $number = $matches[0]; + + if ($number > $max) + { + $max = $number; + } + } + } + return $max + 1; + + } + + + + + public static function zerofill($num, $zerofill = 3) { return str_pad($num, $zerofill, '0', STR_PAD_LEFT); } -public function checkin_email() + public function checkin_email() { return $this->model->category->checkin_email; } @@ -520,7 +478,6 @@ public function checkin_email() public function getEula() { - $Parsedown = new \Parsedown(); if ($this->model->category->eula_text) { @@ -530,7 +487,6 @@ public function checkin_email() } else { return null; } - } @@ -543,30 +499,27 @@ public function checkin_email() /** * Query builder scope for hardware * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeHardware($query) { - return $query->where('physical', '=', '1'); } /** * Query builder scope for pending assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopePending($query) { - return $query->whereHas('assetstatus', function ($query) { - $query->where('deployable', '=', 0) ->where('pending', '=', 1) ->where('archived', '=', 0); @@ -575,22 +528,28 @@ public function checkin_email() /** - * Query builder scope for pending assets + * Query builder scope for searching location * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeAssetsByLocation($query, $location) { return $query->where(function ($query) use ($location) { - - $query->whereHas('assigneduser', function ($query) use ($location) { - - $query->where('users.location_id', '=', $location->id); + $query->whereHas('assignedTo', function ($query) use ($location) { + $query->where([ + ['users.location_id', '=', $location->id], + ['assets.assigned_type', '=', User::class] + ])->orWhere([ + ['locations.id', '=', $location->id], + ['assets.assigned_type', '=', Location::class] + ])->orWhere([ + ['assets.rtd_location_id', '=', $location->id], + ['assets.assigned_type', '=', Asset::class] + ]); })->orWhere(function ($query) use ($location) { - $query->where('assets.rtd_location_id', '=', $location->id); $query->whereNull('assets.assigned_to'); }); @@ -601,17 +560,15 @@ public function checkin_email() /** * Query builder scope for RTD assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeRTD($query) { - return $query->whereNULL('assigned_to') ->whereHas('assetstatus', function ($query) { - $query->where('deployable', '=', 1) ->where('pending', '=', 0) ->where('archived', '=', 0); @@ -621,16 +578,14 @@ public function checkin_email() /** * Query builder scope for Undeployable assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeUndeployable($query) { - return $query->whereHas('assetstatus', function ($query) { - $query->where('deployable', '=', 0) ->where('pending', '=', 0) ->where('archived', '=', 0); @@ -640,16 +595,14 @@ public function checkin_email() /** * Query builder scope for non-Archived assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeNotArchived($query) { - return $query->whereHas('assetstatus', function ($query) { - $query->where('archived', '=', 0); }); } @@ -657,16 +610,14 @@ public function checkin_email() /** * Query builder scope for Archived assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeArchived($query) { - return $query->whereHas('assetstatus', function ($query) { - $query->where('deployable', '=', 0) ->where('pending', '=', 0) ->where('archived', '=', 1); @@ -676,31 +627,28 @@ public function checkin_email() /** * Query builder scope for Deployed assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeDeployed($query) { - return $query->where('assigned_to', '>', '0'); } /** * Query builder scope for Requestable assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeRequestableAssets($query) { - return Company::scopeCompanyables($query->where('requestable', '=', 1)) ->whereHas('assetstatus', function ($query) { - $query->where('deployable', '=', 1) ->where('pending', '=', 0) ->where('archived', '=', 0); @@ -711,9 +659,9 @@ public function checkin_email() /** * Query builder scope for Deleted assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeDeleted($query) @@ -740,9 +688,9 @@ public function checkin_email() /** * Query builder scope to get not-yet-accepted assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeNotYetAccepted($query) { @@ -752,9 +700,9 @@ public function checkin_email() /** * Query builder scope to get rejected assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeRejected($query) { @@ -765,9 +713,9 @@ public function checkin_email() /** * Query builder scope to get accepted assets * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeAccepted($query) { @@ -778,17 +726,16 @@ public function checkin_email() /** * Query builder scope to search on text for complex Bootstrap Tables API * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $search Search term * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeTextSearch($query, $search) { $search = explode(' OR ', $search); return $query->where(function ($query) use ($search) { - foreach ($search as $search) { $query->whereHas('model', function ($query) use ($search) { $query->whereHas('category', function ($query) use ($search) { @@ -804,10 +751,15 @@ public function checkin_email() $query->where('manufacturers.name', 'LIKE', '%'.$search.'%'); }); }); + })->orWhere(function ($query) use ($search) { $query->whereHas('assetstatus', function ($query) use ($search) { $query->where('status_labels.name', 'LIKE', '%'.$search.'%'); }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('supplier', function ($query) use ($search) { + $query->where('suppliers.name', 'LIKE', '%'.$search.'%'); + }); })->orWhere(function ($query) use ($search) { $query->whereHas('company', function ($query) use ($search) { $query->where('companies.name', 'LIKE', '%'.$search.'%'); @@ -816,18 +768,26 @@ public function checkin_email() $query->whereHas('defaultLoc', function ($query) use ($search) { $query->where('locations.name', 'LIKE', '%'.$search.'%'); }); - })->orWhere(function ($query) use ($search) { - $query->whereHas('assigneduser', function ($query) use ($search) { - $query->where(function ($query) use ($search) { - $query->where('users.first_name', 'LIKE', '%'.$search.'%') - ->orWhere('users.last_name', 'LIKE', '%'.$search.'%') - ->orWhere(function ($query) use ($search) { - $query->whereHas('userloc', function ($query) use ($search) { - $query->where('locations.name', 'LIKE', '%'.$search.'%'); - }); - }); - }); - }); + //FIXME: This needs attention to work with checkout to not-users. + // })->orWhere(function ($query) use ($search) { + // $query->whereHas('assignedTo', function ($query) use ($search) { + // $query->where(function ($query) use ($search) { + // $query->where('assets.assigned_type', '=', User::class) + // ->join('users', 'users.id', '=', 'assets.assigned_to') + // ->where(function($query) use ($search) { + // $query->where('users.first_name', 'LIKE', '%'.$search.'%') + // ->orWhere('users.last_name', 'LIKE', '%'.$search.'%'); + // }); + // })->orWhere(function ($query) use ($search) { + // $query->where('assets.assigned_type', '=', Location::class) + // ->join('locations', 'locations.id', '=', 'assets.assigned_to') + // ->where('locations.name', 'LIKE', '%'.$search.'%'); + // })->orWhere(function ($query) use ($search) { + // $query->where('assets.assigned_type', '=', Asset::class) + // ->join('assets as assigned_asset', 'assigned_assets.id', '=', 'assets.assigned_to') + // ->where('assigned_assets.name', 'LIKE', '%'.$search.'%'); + // }); + // }); })->orWhere('assets.name', 'LIKE', '%'.$search.'%') ->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%') ->orWhere('assets.serial', 'LIKE', '%'.$search.'%') @@ -840,13 +800,134 @@ public function checkin_email() }); } + + + /** + * Query builder scope to search on text filters for complex Bootstrap Tables API + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $filter JSON array of search keys and terms + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeByFilter($query, $filter) + { + return $query->where(function ($query) use ($filter) { + foreach ($filter as $key => $search_val) { + if ($key =='asset_tag') { + $query->where('assets.asset_tag', 'LIKE', '%'.$search_val.'%'); + } + + if ($key =='name') { + $query->where('assets.name', 'LIKE', '%'.$search_val.'%'); + } + + if ($key =='product_key') { + $query->where('assets.serial', 'LIKE', '%'.$search_val.'%'); + } + + if ($key =='purchase_date') { + $query->where('assets.purchase_date', 'LIKE', '%'.$search_val.'%'); + } + + if ($key =='purchase_cost') { + $query->where('assets.purchase_cost', 'LIKE', '%'.$search_val.'%'); + } + + if ($key =='notes') { + $query->where('assets.notes', 'LIKE', '%'.$search_val.'%'); + } + + if ($key =='order_number') { + $query->where('assets.order_number', 'LIKE', '%'.$search_val.'%'); + } + + if ($key =='status_label') { + $query->whereHas('assetstatus', function ($query) use ($search_val) { + $query->where('status_labels.name', 'LIKE', '%' . $search_val . '%'); + }); + } + + if ($key =='location') { + $query->whereHas('defaultLoc', function ($query) use ($search_val) { + $query->where('locations.name', 'LIKE', '%' . $search_val . '%'); + }); + } + + if ($key =='checkedout_to') { + $query->whereHas('assigneduser', function ($query) use ($search) { + $query->where(function ($query) use ($search) { + $query->where('users.first_name', 'LIKE', '%' . $search . '%') + ->orWhere('users.last_name', 'LIKE', '%' . $search . '%'); + }); + }); + } + + + if ($key =='manufacturer') { + $query->whereHas('model', function ($query) use ($search_val) { + $query->whereHas('manufacturer', function ($query) use ($search_val) { + $query->where(function ($query) use ($search_val) { + $query->where('manufacturers.name', 'LIKE', '%'.$search_val.'%'); + }); + }); + }); + } + + if ($key =='category') { + $query->whereHas('model', function ($query) use ($search) { + $query->whereHas('category', function ($query) use ($search) { + $query->where(function ($query) use ($search_val) { + $query->where('categories.name', 'LIKE', '%' . $search_val . '%') + ->orWhere('models.name', 'LIKE', '%' . $search_val . '%') + ->orWhere('models.model_number', 'LIKE', '%' . $search_val . '%'); + }); + }); + }); + } + + if ($key =='model') { + $query->where(function ($query) use ($search_val) { + $query->whereHas('model', function ($query) use ($search_val) { + $query->where('models.name', 'LIKE', '%' . $search_val . '%'); + }); + }); + } + + if ($key =='model_number') { + $query->where(function ($query) use ($search_val) { + $query->whereHas('model', function ($query) use ($search_val) { + $query->where('models.model_number', 'LIKE', '%' . $search_val . '%'); + }); + }); + } + + + if ($key =='company') { + $query->where(function ($query) use ($search_val) { + $query->whereHas('company', function ($query) use ($search_val) { + $query->where('companies.name', 'LIKE', '%' . $search_val . '%'); + }); + }); + } + } + + foreach (CustomField::all() as $field) { + if (array_key_exists($field->db_column_name(), $filter)) { + $query->orWhere($field->db_column_name(), 'LIKE', "%$search_val%"); + } + } + }); + } + + /** * Query builder scope to order on model * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderModels($query, $order) { @@ -856,10 +937,10 @@ public function checkin_email() /** * Query builder scope to order on model number * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderModelNumber($query, $order) { @@ -870,10 +951,10 @@ public function checkin_email() /** * Query builder scope to order on assigned user * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderAssigned($query, $order) { @@ -883,37 +964,68 @@ public function checkin_email() /** * Query builder scope to order on status * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderStatus($query, $order) { return $query->join('status_labels', 'assets.status_id', '=', 'status_labels.id')->orderBy('status_labels.name', $order); } - /** + /** * Query builder scope to order on company * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderCompany($query, $order) { return $query->leftJoin('companies', 'assets.company_id', '=', 'companies.id')->orderBy('companies.name', $order); } - /** - * Query builder scope to order on category - * - * @param Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return Illuminate\Database\Query\Builder Modified query builder - */ + + /** + * Query builder scope to return results of a category + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeInCategory($query, $category_id) + { + return $query->join('models', 'assets.model_id', '=', 'models.id') + ->join('categories', 'models.category_id', '=', 'categories.id')->where('models.category_id', '=', $category_id); + } + + /** + * Query builder scope to return results of a manufacturer + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeByManufacturer($query, $manufacturer_id) + { + return $query->join('models', 'assets.model_id', '=', 'models.id') + ->join('manufacturers', 'models.manufacturer_id', '=', 'manufacturers.id')->where('models.manufacturer_id', '=', $manufacturer_id); + } + + + + /** + * Query builder scope to order on category + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderCategory($query, $order) { return $query->join('models', 'assets.model_id', '=', 'models.id') @@ -925,10 +1037,10 @@ public function checkin_email() /** * Query builder scope to order on manufacturer * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderManufacturer($query, $order) { @@ -937,18 +1049,57 @@ public function checkin_email() ->orderBy('manufacturers.name', $order); } - /** + /** * Query builder scope to order on location * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $order Order * - * @return Illuminate\Database\Query\Builder Modified query builder - * TODO: Extend this method out for checked out assets as well. Right now it - * only checks the location name related to rtd_location_id + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeOrderLocation($query, $order) { return $query->join('locations', 'locations.id', '=', 'assets.rtd_location_id')->orderBy('locations.name', $order); } + + + /** + * Query builder scope to order on supplier name + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderSupplier($query, $order) + { + return $query->leftJoin('suppliers', 'assets.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order); + } + + /** + * Query builder scope to search on location ID + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeByLocationId($query, $search) + { + return $query->where(function ($query) use ($search) { + $query->whereHas('defaultLoc', function ($query) use ($search) { + $query->where('locations.id', '=', $search); + }); + }); + // FIXME: This needs porting to checkout to non-user. + // ->orWhere(function ($query) use ($search) { + // $query->whereHas('assigneduser', function ($query) use ($search) { + // $query->whereHas('userloc', function ($query) use ($search) { + // $query->where('locations.id', '=', $search); + // }); + // }); + // }); + } + + } diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php index 323b235c39..6ef858384d 100644 --- a/app/Models/AssetMaintenance.php +++ b/app/Models/AssetMaintenance.php @@ -1,6 +1,7 @@ 'required|integer', @@ -28,10 +28,10 @@ class AssetMaintenance extends Model implements ICompanyableChild 'asset_maintenance_type' => 'required', 'title' => 'required|max:100', 'is_warranty' => 'boolean', - 'start_date' => 'required|date_format:Y-m-d', - 'completion_date' => 'date_format:Y-m-d', - 'notes' => 'string', - 'cost' => 'numeric' + 'start_date' => 'required|date_format:"Y-m-d"', + 'completion_date' => 'date_format:"Y-m-d"', + 'notes' => 'string|nullable', + 'cost' => 'numeric|nullable' ]; public function getCompanyableParents() @@ -56,6 +56,48 @@ class AssetMaintenance extends Model implements ICompanyableChild ]; } + public function setIsWarrantyAttribute($value) + { + if ($value == '') { + $value = 0; + } + $this->attributes['is_warranty'] = $value; + } + + /** + * @param $value + */ + public function setCostAttribute($value) + { + $value = Helper::ParseFloat($value); + if ($value == '0.0') { + $value = null; + } + $this->attributes['cost'] = $value; + } + + /** + * @param $value + */ + public function setNotesAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['notes'] = $value; + } + + /** + * @param $value + */ + public function setCompletionDateAttribute($value) + { + if ($value == '' || $value == "0000-00-00") { + $value = null; + } + $this->attributes['completion_date'] = $value; + } + /** * asset * Get asset for this improvement diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php index 7462b18455..52884c0bd3 100755 --- a/app/Models/AssetModel.php +++ b/app/Models/AssetModel.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Models\Requestable; use App\Models\SnipeModel; +use App\Presenters\Presentable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Watson\Validating\ValidatingTrait; @@ -16,18 +17,19 @@ use Watson\Validating\ValidatingTrait; class AssetModel extends SnipeModel { use SoftDeletes; - use Requestable; + protected $presenter = 'App\Presenters\AssetModelPresenter'; + use Requestable, Presentable; protected $dates = ['deleted_at']; protected $table = 'models'; + protected $hidden = ['user_id','deleted_at']; // Declare the rules for the model validation protected $rules = array( 'name' => 'required|min:1|max:255', - 'model_number' => 'min:1|max:255', - 'category_id' => 'required|integer', - 'manufacturer_id' => 'required|integer', - 'eol' => 'integer:min:0|max:240', - 'user_id' => 'integer', + 'model_number' => 'max:255|nullable', + 'category_id' => 'required|integer|exists:categories,id', + 'manufacturer_id' => 'required|integer|exists:manufacturers,id', + 'eol' => 'integer:min:0|max:240|nullable', ); /** @@ -40,14 +42,20 @@ class AssetModel extends SnipeModel protected $injectUniqueIdentifier = true; use ValidatingTrait; + public function setEolAttribute($value) + { + if ($value == '') { + $value = 0; + } + + $this->attributes['eol'] = $value; + } /** * The attributes that are mass assignable. * * @var array */ - protected $fillable = ['name','manufacturer_id','category_id','eol']; - - + protected $fillable = ['name','manufacturer_id','category_id','eol', 'user_id', 'fieldset_id', 'model_number', 'notes']; public function assets() { @@ -79,26 +87,6 @@ class AssetModel extends SnipeModel return $this->belongsTo('\App\Models\CustomFieldset', 'fieldset_id'); } - public function getNote() - { - - $Parsedown = new \Parsedown(); - - if ($this->note) { - return $Parsedown->text(e($this->note)); - } - - } - - public function displayModelName() - { - $name = $this->manufacturer->name.' '.$this->name; - if ($this->model_number) { - $name .=" / ".$this->model_number; - } - return $name; - } - /** * ----------------------------------------------- * BEGIN QUERY SCOPES @@ -180,4 +168,19 @@ class AssetModel extends SnipeModel }); } + + /** + * Query builder scope to order on manufacturer + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderManufacturer($query, $order) + { + return $query->leftJoin('manufacturers', 'models.manufacturer_id', '=', 'manufacturers.id')->orderBy('manufacturers.name', $order); + } + + } diff --git a/app/Models/Category.php b/app/Models/Category.php index 52ffe2a273..6e61be4cd8 100755 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Http\Traits\UniqueUndeletedTrait; use App\Models\SnipeModel; +use App\Presenters\Presentable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Watson\Validating\ValidatingTrait; @@ -17,18 +18,22 @@ use Watson\Validating\ValidatingTrait; */ class Category extends SnipeModel { - + protected $presenter = 'App\Presenters\CategoryPresenter'; + use Presentable; use SoftDeletes; protected $dates = ['deleted_at']; protected $table = 'categories'; + protected $hidden = ['user_id','deleted_at']; /** * Category validation rules */ public $rules = array( - 'user_id' => 'numeric', + 'user_id' => 'numeric|nullable', 'name' => 'required|min:1|max:255|unique_undeleted', - 'category_type' => 'required', + 'require_acceptance' => 'boolean', + 'use_default_eula' => 'boolean', + 'category_type' => 'required|in:asset,accessory,consumable,component', ); /** @@ -48,7 +53,7 @@ class Category extends SnipeModel * * @var array */ - protected $fillable = ['name','category_type']; + protected $fillable = ['name','category_type', 'user_id', 'use_default_eula','checkin_email','require_acceptance']; public function has_models() @@ -75,13 +80,13 @@ class Category extends SnipeModel { switch ($this->category_type) { case 'asset': - return $this->assets->count(); + return $this->assets()->count(); case 'accessory': - return $this->accessories->count(); + return $this->accessories()->count(); case 'component': - return $this->components->count(); + return $this->components()->count(); case 'consumable': - return $this->consumables->count(); + return $this->consumables()->count(); } return '0'; } diff --git a/app/Models/CheckoutRequest.php b/app/Models/CheckoutRequest.php index a3e5fb6139..39d046a9f8 100644 --- a/app/Models/CheckoutRequest.php +++ b/app/Models/CheckoutRequest.php @@ -39,10 +39,8 @@ class CheckoutRequest extends Model { if ($this->itemType() == "asset") { $asset = $this->itemRequested(); - if ($asset->assigneduser && $asset->assetloc) { + if ($asset->assignedTo) { return $asset->assetloc; - } elseif ($asset->defaultLoc) { - return $asset->defaultLoc; } } return $this->itemRequested()->location; @@ -51,7 +49,7 @@ class CheckoutRequest extends Model public function name() { if ($this->itemType() == "asset") { - return $this->itemRequested()->showAssetName(); + return $this->itemRequested()->present()->name(); } return $this->itemRequested()->name; diff --git a/app/Models/Company.php b/app/Models/Company.php index a2609de6c6..fe621ff4fe 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -2,6 +2,7 @@ namespace App\Models; use App\Models\SnipeModel; +use App\Presenters\Presentable; use Auth; use DB; use Illuminate\Database\Eloquent\Model; @@ -21,6 +22,8 @@ final class Company extends SnipeModel 'name' => 'required|min:1|max:255|unique:companies,name' ]; + protected $presenter = 'App\Presenters\CompanyPresenter'; + use Presentable; /** * Whether the model should inject it's identifier to the unique @@ -63,12 +66,6 @@ final class Company extends SnipeModel return $query->where($column, '=', $company_id); } - public static function getSelectList() - { - $select_company = trans('general.select_company'); - return ['0' => $select_company] + DB::table('companies')->orderBy('name', 'ASC')->lists('name', 'id'); - } - public static function getIdFromInput($unescaped_input) { $escaped_input = e($unescaped_input); @@ -116,7 +113,6 @@ final class Company extends SnipeModel public static function isCurrentUserAuthorized() { - return ((!static::isFullMultipleCompanySupportEnabled()) || (Auth::user()->isSuperUser())); } @@ -168,37 +164,32 @@ final class Company extends SnipeModel } } - public static function getName($companyable) + public function users() { - $company = $companyable->company; - - if (is_null($company)) { - return ''; - } else { - return e($company->name); - } - } - - public function users() { return $this->hasMany(User::class); } - public function assets() { + public function assets() + { return $this->hasMany(Asset::class); } - public function licenses() { + public function licenses() + { return $this->hasMany(License::class); } - public function accessories() { + public function accessories() + { return $this->hasMany(Accessory::class); } - public function consumables() { + public function consumables() + { return $this->hasMany(Consumable::class); } - public function components() { + public function components() + { return $this->hasMany(Component::class); } } diff --git a/app/Models/Component.php b/app/Models/Component.php index e278f43002..9dcce2f9aa 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -1,15 +1,7 @@ 'required|min:3|max:255', 'qty' => 'required|integer|min:1', 'category_id' => 'required|integer', - 'company_id' => 'integer', - 'purchase_date' => 'date', - 'purchase_cost' => 'numeric', + 'company_id' => 'integer|nullable', + 'purchase_date' => 'date|nullable', + 'purchase_cost' => 'numeric|nullable', ); /** @@ -55,7 +46,15 @@ class Component extends SnipeModel * * @var array */ - protected $fillable = ['name','company_id','category_id']; + protected $fillable = [ + 'category_id', + 'company_id', + 'location_id', + 'name', + 'purchase_cost', + 'purchase_date', + 'qty', + ]; public function location() { diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php index e65e89cb96..c6f632f52f 100644 --- a/app/Models/Consumable.php +++ b/app/Models/Consumable.php @@ -1,26 +1,22 @@ 'boolean' + ]; /** @@ -30,9 +26,9 @@ class Consumable extends SnipeModel 'name' => 'required|min:3|max:255', 'qty' => 'required|integer|min:0', 'category_id' => 'required|integer', - 'company_id' => 'integer', - 'min_amt' => 'integer|min:1', - 'purchase_cost' => 'numeric', + 'company_id' => 'integer|nullable', + 'min_amt' => 'integer|min:1|nullable', + 'purchase_cost' => 'numeric|nullable', ); /** @@ -50,15 +46,34 @@ class Consumable extends SnipeModel * * @var array */ - protected $fillable = ['name','qty','company_id','category_id']; + protected $fillable = [ + 'category_id', + 'company_id', + 'location_id', + 'manufacturer_id', + 'name', + 'order_number', + 'purchase_cost', + 'purchase_date', + 'qty', + 'requestable' + ]; + public function setRequestableAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['requestable'] = filter_var($value, FILTER_VALIDATE_BOOLEAN); + return; + } public function admin() { return $this->belongsTo('\App\Models\User', 'user_id'); } - public function consumableAssigments() + public function consumableAssignments() { return $this->hasMany('\App\Models\ConsumableAssignment'); } diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php index 6fcf74a29b..749e74ce59 100644 --- a/app/Models/CustomField.php +++ b/app/Models/CustomField.php @@ -3,14 +3,16 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use Schema; +use Watson\Validating\ValidatingTrait; +use App\Http\Traits\UniqueUndeletedTrait; +use ForceUTF8\Encoding; +use EasySlugger\Utf8Slugger; +use Patchwork\Utf8; class CustomField extends Model { + use ValidatingTrait, UniqueUndeletedTrait; public $guarded=["id"]; - - /** - - */ public static $PredefinedFormats=[ "ANY" => "", "ALPHA" => "alpha", @@ -22,7 +24,7 @@ class CustomField extends Model "IP" => "ip", ]; - public $rules=[ + public $rules = [ "name" => "required|unique:custom_fields" ]; @@ -30,47 +32,53 @@ class CustomField extends Model public static function name_to_db_name($name) { - return "_snipeit_".preg_replace("/[^a-zA-Z0-9]/", "_", strtolower($name)); + return "_snipeit_" . preg_replace("/[^a-zA-Z0-9]/", "_", strtolower($name)); } public static function boot() { - self::creating(function ($custom_field) { + self::created(function ($custom_field) { - if (Schema::hasColumn(CustomField::$table_name,$custom_field->db_column_name())) { - //field already exists when making a new custom field; fail. + + // column exists - nothing to do here + if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) { return false; } Schema::table(CustomField::$table_name, function ($table) use ($custom_field) { - $table->text($custom_field->db_column_name())->nullable(); + $table->text($custom_field->convertUnicodeDbSlug())->nullable(); }); + $custom_field->db_column = $custom_field->convertUnicodeDbSlug(); + $custom_field->save(); }); + self::updating(function ($custom_field) { + + // Column already exists. Nothing to update. if ($custom_field->isDirty("name")) { - if (Schema::hasColumn(CustomField::$table_name,$custom_field->db_column_name())) { - //field already exists when renaming a custom field - return false; + if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) { + return true; } + return Schema::table(CustomField::$table_name, function ($table) use ($custom_field) { - $table->renameColumn(self::name_to_db_name($custom_field->getOriginal("name")),$custom_field->db_column_name()); + $table->renameColumn($custom_field->convertUnicodeDbSlug($custom_field->getOriginal("name")), $custom_field->convertUnicodeDbSlug()); }); } return true; }); self::deleting(function ($custom_field) { - return Schema::table(CustomField::$table_name,function ($table) use ($custom_field) { - $table->dropColumn(self::name_to_db_name($custom_field->getOriginal("name"))); + return Schema::table(CustomField::$table_name, function ($table) use ($custom_field) { + $table->dropColumn($custom_field->convertUnicodeDbSlug()); }); }); } public function fieldset() { - return $this->belongsToMany('\App\Models\CustomFieldset'); //?!?!?!?!?!? + return $this->belongsToMany('\App\Models\CustomFieldset'); } public function user() @@ -78,12 +86,6 @@ class CustomField extends Model return $this->belongsTo('\App\Models\User'); } - //public function - - //need helper to go from regex->English - //need helper to go from English->regex - - //need helper for save() stuff - basically to alter table for the fields in question public function check_format($value) { @@ -92,10 +94,10 @@ class CustomField extends Model public function db_column_name() { - return self::name_to_db_name($this->name); + return $this->db_column; } - //mutators for 'format' attribute + // mutators for 'format' attribute public function getFormatAttribute($value) { foreach (self::$PredefinedFormats as $name => $pattern) { @@ -106,6 +108,13 @@ class CustomField extends Model return $value; } + /** + * Format a value string as an array for select boxes and checkboxes. + * + * @author [A. Gianotto] [] + * @since [v3.4] + * @return Array + */ public function setFormatAttribute($value) { if (isset(self::$PredefinedFormats[$value])) { @@ -122,7 +131,8 @@ class CustomField extends Model * @since [v3.4] * @return Array */ - public function formatFieldValuesAsArray() { + public function formatFieldValuesAsArray() + { $arr = preg_split("/\\r\\n|\\r|\\n/", $this->field_values); $result[''] = 'Select '.strtolower($this->format); @@ -130,20 +140,20 @@ class CustomField extends Model for ($x = 0; $x < count($arr); $x++) { $arr_parts = explode('|', $arr[$x]); if ($arr_parts[0]!='') { - if (key_exists('1',$arr_parts)) { + if (key_exists('1', $arr_parts)) { $result[$arr_parts[0]] = $arr_parts[1]; } else { $result[$arr_parts[0]] = $arr_parts[0]; } } - } return $result; } - public function isFieldDecryptable($string) { + public function isFieldDecryptable($string) + { if (($this->field_encrypted=='1') && ($string!='')) { return true; } @@ -151,6 +161,17 @@ class CustomField extends Model } + public function convertUnicodeDbSlug($original = null) + { + $name = $original ? $original : $this->name; + $id = $this->id ? $this->id : 'xx'; + if (!function_exists('transliterator_transliterate')) { + $long_slug = '_snipeit_' . str_slug(\Patchwork\Utf8::utf8_encode(trim($name)), '_'); + } else { + $long_slug = '_snipeit_' . Utf8Slugger::slugify($name, '_'); + } + return substr($long_slug, 0, 50) . '_' . $id; + } } diff --git a/app/Models/CustomFieldset.php b/app/Models/CustomFieldset.php index 5b185cadde..c89d3dd312 100644 --- a/app/Models/CustomFieldset.php +++ b/app/Models/CustomFieldset.php @@ -3,6 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use Gate; +use Watson\Validating\ValidatingTrait; class CustomFieldset extends Model { @@ -12,6 +13,17 @@ class CustomFieldset extends Model "name" => "required|unique:custom_fieldsets" ]; + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + public function fields() { return $this->belongsToMany('\App\Models\CustomField')->withPivot(["required","order"])->orderBy("pivot_order"); @@ -34,9 +46,7 @@ class CustomFieldset extends Model $rule = []; if (($field->field_encrypted!='1') || - (($field->field_encrypted =='1') && (Gate::allows('admin')) )) - { - + (($field->field_encrypted =='1') && (Gate::allows('admin')) )) { if ($field->pivot->required) { $rule[]="required"; } @@ -47,5 +57,4 @@ class CustomFieldset extends Model } return $rules; } - } diff --git a/app/Models/Department.php b/app/Models/Department.php new file mode 100644 index 0000000000..87783c182a --- /dev/null +++ b/app/Models/Department.php @@ -0,0 +1,97 @@ + 'required|max:255', + 'user_id' => 'required', + 'location_id' => 'numeric|nullable', + 'company_id' => 'numeric|nullable', + 'manager_id' => 'numeric|nullable', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'user_id', + 'name', + 'location_id', + 'company_id', + 'manager_id', + 'notes', + ]; + + + public function company() + { + return $this->belongsTo('\App\Models\Company', 'company_id'); + } + + /** + * Even though we allow allow for checkout to things beyond users + * this method is an easy way of seeing if we are checked out to a user. + * @return mixed + */ + public function users() + { + return $this->hasMany('\App\Models\User', 'department_id'); + } + + + /** + * Return the manager in charge of the dept + * @return mixed + */ + public function manager() + { + return $this->belongsTo('\App\Models\User', 'manager_id'); + } + + + public function location() + { + return $this->belongsTo('\App\Models\Location', 'location_id'); + } + + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextsearch($query, $search) + { + return $query->where('name', 'LIKE', "%$search%") + ->orWhere('notes', 'LIKE', "%$search%"); + + } + + +} diff --git a/app/Models/Depreciation.php b/app/Models/Depreciation.php index 4f48998c1d..c9b90e4da4 100755 --- a/app/Models/Depreciation.php +++ b/app/Models/Depreciation.php @@ -1,16 +1,17 @@ 'required|min:3|max:255|unique:depreciations,name', - 'months' => 'required|max:3200|integer', + 'months' => 'required|max:3600|integer', ); /** @@ -45,10 +46,10 @@ class Depreciation extends SnipeModel /** * Query builder scope to search on text * - * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param \Illuminate\Database\Query\Builder $query Query builder instance * @param text $search Search term * - * @return Illuminate\Database\Query\Builder Modified query builder + * @return \Illuminate\Database\Query\Builder Modified query builder */ public function scopeTextSearch($query, $search) { diff --git a/app/Models/Import.php b/app/Models/Import.php new file mode 100644 index 0000000000..dbc444ed09 --- /dev/null +++ b/app/Models/Import.php @@ -0,0 +1,14 @@ + 'array', + 'first_row' => 'array', + 'field_map' => 'json' + ]; +} diff --git a/app/Models/Ldap.php b/app/Models/Ldap.php index fe5ee173ed..0a68e15407 100644 --- a/app/Models/Ldap.php +++ b/app/Models/Ldap.php @@ -8,7 +8,6 @@ use Exception; use Input; use Log; - class Ldap extends Model { @@ -36,8 +35,8 @@ class Ldap extends Model } // If the user specifies where CA Certs are, make sure to use them - if(env("LDAPTLS_CACERT")) { - putenv("LDAPTLS_CACERT=".env("LDAPTLS_CACERT")); + if (env("LDAPTLS_CACERT")) { + putenv("LDAPTLS_CACERT=".env("LDAPTLS_CACERT")); } $connection = @ldap_connect($ldap_host); @@ -49,6 +48,7 @@ class Ldap extends Model // Needed for AD ldap_set_option($connection, LDAP_OPT_REFERRALS, 0); ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, $ldap_version); + ldap_set_option($connection, LDAP_OPT_NETWORK_TIMEOUT, 20); if ($ldap_use_tls=='1') { ldap_start_tls($connection); @@ -78,13 +78,10 @@ class Ldap extends Model $ldap_username_field = $settings->ldap_username_field; $baseDn = $settings->ldap_basedn; - if ($settings->is_ad =='1') - { - - // Check if they are using the userprincipalname for the username field. + if ($settings->is_ad =='1') { + // Check if they are using the userprincipalname for the username field. // If they are, we can skip building the UPN to authenticate against AD - if ($ldap_username_field=='userprincipalname') - { + if ($ldap_username_field=='userprincipalname') { $userDn = $username; } else { // In case they haven't added an AD domain @@ -114,7 +111,7 @@ class Ldap extends Model return false; } - if (!$user = array_change_key_case(ldap_get_attributes($connection, $entry), CASE_LOWER)) { + if (!$user = ldap_get_attributes($connection, $entry)) { return false; } @@ -236,17 +233,21 @@ class Ldap extends Model * @author [A. Gianotto] [] * @since [v3.0] * @param $ldapatttibutes + * @param $base_dn * @return array|bool */ - static function findLdapUsers() { + static function findLdapUsers($base_dn = null) + { $ldapconn = Ldap::connectToLdap(); $ldap_bind = Ldap::bindAdminToLdap($ldapconn); - $base_dn = Setting::getSettings()->ldap_basedn; + // Default to global base DN if nothing else is provided. + if (is_null($base_dn)) { + $base_dn = Setting::getSettings()->ldap_basedn; + } $filter = Setting::getSettings()->ldap_filter; // Set up LDAP pagination for very large databases - // @author Richard Hofman $page_size = 500; $cookie = ''; $result_set = array(); @@ -291,8 +292,4 @@ class Ldap extends Model } - - - - } diff --git a/app/Models/License.php b/app/Models/License.php index 886e7c05fd..ca2c9c7281 100755 --- a/app/Models/License.php +++ b/app/Models/License.php @@ -1,17 +1,24 @@ 'required|string|min:3|max:255', - 'seats' => 'required|min:1|max:10000|integer', + 'seats' => 'required|min:1|max:1000000|integer', 'license_email' => 'email|min:0|max:120', 'license_name' => 'string|min:0|max:100', 'note' => 'string', 'notes' => 'string|min:0', - 'company_id' => 'integer', + 'company_id' => 'integer|nullable', ); + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'serial', + 'purchase_date', + 'purchase_cost', + 'order_number', + 'seats', + 'notes', + 'user_id', + 'depreciation_id', + 'license_name', //actually licensed_to + 'license_email', + 'supplier_id', + 'expiration_date', + 'purchase_order', + 'termination_date', + 'maintained', + 'reassignable', + 'company_id', + 'manufacturer_id' + ]; + + public static function boot() + { + parent::boot(); + // We need to listen for created for the initial setup so that we have a license ID. + static::created(function ($license) { + $newSeatCount = $license->getAttributes()['seats']; + return static::adjustSeatCount($license, $oldSeatCount = 0, $newSeatCount); + }); + // However, we listen for updating to be able to prevent the edit if we cannot delete enough seats. + static::updating(function ($license) { + $newSeatCount = $license->getAttributes()['seats']; + $oldSeatCount = isset($license->getOriginal()['seats']) ? $license->getOriginal()['seats'] : 0; + // dd($oldSeatCount.' '.$newSeatCount); + return static::adjustSeatCount($license, $oldSeatCount, $newSeatCount); + }); + } + + public static function adjustSeatCount($license, $oldSeats, $newSeats) + { + // If the seats haven't changed, continue on happily. + if ($oldSeats==$newSeats) { + return true; + } + // On Create, we just make one for each of the seats. + $change = abs($oldSeats - $newSeats); + if ($oldSeats > $newSeats) { + $license->load('licenseseats.user'); + // dd("Here"); + // Need to delete seats... lets see if if we have enough. + $seatsAvailableForDelete = $license->licenseseats->reject(function ($seat) { + return (!! $seat->assigned_to) || (!! $seat->asset_id); + }); + + if ($change > $seatsAvailableForDelete->count()) { + Session::flash('error', trans('admin/licenses/message.assoc_users')); + return false; + } + for ($i=1; $i <= $change; $i++) { + $seatsAvailableForDelete->pop()->delete(); + } + // Log Deletion of seats. + $logAction = new Actionlog; + $logAction->item_type = License::class; + $logAction->item_id = $license->id; + $logAction->user_id = Auth::id() ?: 1; // We don't have an id while running the importer from CLI. + $logAction->note = "deleted ${change} seats"; + $logAction->target_id = null; + $logAction->logaction('delete seats'); + return true; + } + // Else we're adding seats. + DB::transaction(function () use ($license, $oldSeats, $newSeats) { + for ($i = $oldSeats; $i < $newSeats; $i++) { + $license->licenseSeatsRelation()->save(new LicenseSeat, ['user_id' => Auth::id()]); + } + }); + // On initail create, we shouldn't log the addition of seats. + if ($license->id) { + //Log the addition of license to the log. + $logAction = new Actionlog(); + $logAction->item_type = License::class; + $logAction->item_id = $license->id; + $logAction->user_id = Auth::id() ?: 1; // Importer. + $logAction->note = "added ${change} seats"; + $logAction->target_id = null; + $logAction->logaction('add seats'); + } + return true; + } + + public function setMaintainedAttribute($value) + { + $this->attributes['maintained'] = filter_var($value, FILTER_VALIDATE_BOOLEAN); + } + public function setReassignableAttribute($value) + { + $this->attributes['reassignable'] = filter_var($value, FILTER_VALIDATE_BOOLEAN); + } + + public function setExpirationDateAttribute($value) + { + + if ($value == '' || $value == '0000-00-00') { + $value = null; + } else { + $value = (new Carbon($value))->toDateString(); + } + $this->attributes['expiration_date'] = $value; + } + + public function setTerminationDateAttribute($value) + { + if ($value == '' || $value == '0000-00-00') { + $value = null; + } else { + $value = (new Carbon($value))->toDateString(); + } + $this->attributes['termination_date'] = $value; + } + public function company() { return $this->belongsTo('\App\Models\Company', 'company_id'); @@ -243,8 +377,8 @@ class License extends Depreciable ->orWhereHas('manufacturer', function ($query) use ($search) { $query->where(function ($query) use ($search) { $query->where('manufacturers.name', 'LIKE', '%'.$search.'%'); - }); - }) + }); + }) ->orWhereHas('company', function ($query) use ($search) { $query->where(function ($query) use ($search) { $query->where('companies.name', 'LIKE', '%'.$search.'%'); @@ -267,6 +401,20 @@ class License extends Depreciable ->orderBy('manufacturers.name', $order); } + /** + * Query builder scope to order on supplier + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderSupplier($query, $order) + { + return $query->leftJoin('suppliers', 'licenses.supplier_id', '=', 'suppliers.id')->select('licenses.*') + ->orderBy('suppliers.name', $order); + } + /** * Query builder scope to order on company * diff --git a/app/Models/Location.php b/app/Models/Location.php index e503fa0d79..bb0e80e53a 100755 --- a/app/Models/Location.php +++ b/app/Models/Location.php @@ -5,23 +5,26 @@ use App\Http\Traits\UniqueUndeletedTrait; use App\Models\Asset; use App\Models\SnipeModel; use App\Models\User; +use App\Presenters\Presentable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Watson\Validating\ValidatingTrait; class Location extends SnipeModel { + protected $presenter = 'App\Presenters\LocationPresenter'; + use Presentable; use SoftDeletes; protected $dates = ['deleted_at']; protected $table = 'locations'; protected $rules = array( - 'name' => 'required|min:3|max:255|unique_undeleted', - 'city' => 'min:3|max:255', - 'state' => 'min:0|max:32', - 'country' => 'min:2|max:2', - 'address' => 'min:5|max:80', - 'address2' => 'min:2|max:80', - 'zip' => 'min:3|max:10', + 'name' => 'required|min:2|max:255|unique_undeleted', + 'city' => 'min:3|max:255|nullable', + 'country' => 'min:2|max:2|nullable', + 'address' => 'max:80|nullable', + 'address2' => 'max:80|nullable', + 'zip' => 'min:3|max:10|nullable', + // 'manager_id' => 'exists:users' ); /** @@ -41,7 +44,8 @@ class Location extends SnipeModel * * @var array */ - protected $fillable = ['name']; + protected $fillable = ['name','parent_id','address','address2','city','state', 'country','zip','ldap_ou']; + protected $hidden = ['user_id']; public function users() { @@ -53,14 +57,19 @@ class Location extends SnipeModel return $this->hasManyThrough('\App\Models\Asset', '\App\Models\User', 'location_id', 'assigned_to', 'id'); } - public function assignedassets() + public function locationAssets() { - return $this->hasMany('\App\Models\Asset', 'rtd_location_id'); + return $this->hasMany('\App\Models\Asset', 'rtd_location_id')->orHas('assignedAssets'); } public function parent() { - return $this->belongsTo('\App\Models\Location', 'parent_id'); + return $this->belongsTo('\App\Models\Location', 'parent_id','id'); + } + + public function manager() + { + return $this->belongsTo('\App\Models\User', 'manager_id'); } public function childLocations() @@ -68,6 +77,12 @@ class Location extends SnipeModel return $this->hasMany('\App\Models\Location', 'parent_id'); } + public function assignedAssets() + { + return $this->morphMany('App\Models\Asset', 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); + // return $this->hasMany('\App\Models\Asset', 'assigned_to')->withTrashed(); + } + public static function getLocationHierarchy($locations, $parent_id = null) { diff --git a/app/Models/Loggable.php b/app/Models/Loggable.php index cba9b125dd..da9899ec02 100644 --- a/app/Models/Loggable.php +++ b/app/Models/Loggable.php @@ -6,6 +6,9 @@ use App\Models\Actionlog; use App\Models\Asset; use App\Models\CheckoutRequest; use App\Models\User; +use App\Notifications\CheckinNotification; +use App\Notifications\AuditNotification; +use App\Notifications\CheckoutNotification; use Illuminate\Support\Facades\Auth; trait Loggable @@ -27,11 +30,56 @@ trait Loggable * @since [v3.4] * @return \App\Models\Actionlog */ - public function logCheckout($note, $target = null /*target is overridable for components*/) + public function logCheckout($note, $target /* What are we checking out to? */) { $log = new Actionlog; + $log = $this->determineLogItemType($log); + $log->user_id = Auth::user()->id; - // We need to special case licenses because of license_seat vs license. So much for clean polymorphism :) + if (!isset($target)) { + throw new Exception('All checkout logs require a target'); + return; + } + $log->target_type = get_class($target); + $log->target_id = $target->id; + + $class = get_class($target); + if ($class == Location::class) { + // We can checkout to a location + $log->location_id = $target->id; + } else if ($class== Asset::class) { + $log->location_id = $target->rtd_location_id; + } else { + $log->location_id = $target->location_id; + } + $log->note = $note; + $log->logaction('checkout'); + + $params = [ + 'item' => $this, + 'target' => $target, + 'admin' => $log->user, + 'note' => $note, + 'log_id' => $log->id + ]; + + if ($settings = Setting::getSettings()) { + $settings->notify(new CheckoutNotification($params)); + } + + if (method_exists($target, 'notify')) { + $target->notify(new CheckoutNotification($params)); + } + + return $log; + } + + /** + * Helper method to determine the log item type + */ + private function determineLogItemType($log) + { + // We need to special case licenses because of license_seat vs license. So much for clean polymorphism : if (static::class == LicenseSeat::class) { $log->item_type = License::class; $log->item_id = $this->license_id; @@ -40,24 +88,8 @@ trait Loggable $log->item_id = $this->id; } - $log->user_id = Auth::user()->id; - - if (!is_null($this->asset_id) || isset($target)) { - $log->target_type = Asset::class; - $log->target_id = $this->asset_id; - } else if (!is_null($this->assigned_to)) { - $log->target_type = User::class; - $log->target_id = $this->assigned_to; - } - - $item = call_user_func(array($log->target_type, 'find'), $log->target_id); - $log->location_id = $item->location_id; - $log->note = $note; - $log->logaction('checkout'); - return $log; } - /** * @author Daniel Meltzer user_id = Auth::user()->id; $log->logaction('checkin from'); + $params = [ + 'item' => $log->item, + 'admin' => $log->user, + 'note' => $note + ]; + Setting::getSettings()->notify(new CheckinNotification($params)); + return $log; } + + /** + * @author A. Gianotto + * @since [v4.0] + * @return \App\Models\Actionlog + */ + public function logAudit($note, $location_id) + { + $log = new Actionlog; + $location = Location::find($location_id); + if (static::class == LicenseSeat::class) { + $log->item_type = License::class; + $log->item_id = $this->license_id; + } else { + $log->item_type = static::class; + $log->item_id = $this->id; + } + $log->location_id = ($location_id) ? $location_id : null; + $log->note = $note; + $log->user_id = Auth::user()->id; + $log->logaction('audit'); + + $params = [ + 'item' => $log->item, + 'admin' => $log->user, + 'location' => ($location) ? $location->name : '', + 'note' => $note + ]; + Setting::getSettings()->notify(new AuditNotification($params)); + + return $log; + } + + + /** * @author Daniel Meltzer user_id = Auth::user()->id; $log->note = $note; $log->target_id = null; - $log->created_at = date("Y-m-d h:i:s"); + $log->created_at = date("Y-m-d H:i:s"); $log->filename = $filename; $log->logaction('uploaded'); diff --git a/app/Models/Manufacturer.php b/app/Models/Manufacturer.php index 232d2a61d7..189dae51b5 100755 --- a/app/Models/Manufacturer.php +++ b/app/Models/Manufacturer.php @@ -1,13 +1,14 @@ 'required|min:2|max:255|unique:manufacturers,name,NULL,deleted_at', - 'user_id' => 'integer', + 'url' => 'url|nullable', + 'support_url' => 'url|nullable', + 'support_email' => 'email|nullable' ); + protected $hidden = ['user_id','deleted_at']; + + + /** * Whether the model should inject it's identifier to the unique * validation rules before attempting validation. If this property @@ -33,7 +40,7 @@ class Manufacturer extends SnipeModel * * @var array */ - protected $fillable = ['name']; + protected $fillable = ['name','url','support_url','support_phone','support_email']; diff --git a/app/Models/Requestable.php b/app/Models/Requestable.php index 3781cbadeb..878c3b69a8 100644 --- a/app/Models/Requestable.php +++ b/app/Models/Requestable.php @@ -19,9 +19,9 @@ trait Requestable public function isRequestedBy(User $user) { - return $this->requests() - ->where('user_id', $user->id) - ->exists(); + $requests = $this->requests->where('user_id', $user->id); + + return $requests->count() > 0; } public function scopeRequestedBy($query, User $user) diff --git a/app/Models/Setting.php b/app/Models/Setting.php index b57e62a15c..1404c4e1f5 100755 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -2,45 +2,42 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Notifications\Notifiable; use Watson\Validating\ValidatingTrait; use Schema; class Setting extends Model { + use Notifiable; protected $injectUniqueIdentifier = true; use ValidatingTrait; protected $rules = [ "brand" => 'required|min:1|numeric', - "qr_text" => 'min:1|max:31', + "qr_text" => 'max:31|nullable', "logo_img" => 'mimes:jpeg,bmp,png,gif', - "custom_css" => 'string', - "alert_email" => 'email_array', - "slack_endpoint" => 'url', + "alert_email" => 'email_array|nullable', "default_currency" => 'required', "locale" => 'required', - "slack_channel" => 'regex:/(? 'string', + "slack_endpoint" => 'url|required_with:slack_channel|nullable', + "slack_channel" => 'regex:/(? 'string|nullable', 'labels_per_page' => 'numeric', 'labels_width' => 'numeric', 'labels_height' => 'numeric', - 'labels_pmargin_left' => 'numeric', - 'labels_pmargin_right' => 'numeric', - 'labels_pmargin_top' => 'numeric', - 'labels_pmargin_bottom' => 'numeric', - 'labels_display_bgutter' => 'numeric', - 'labels_display_sgutter' => 'numeric', + 'labels_pmargin_left' => 'numeric|nullable', + 'labels_pmargin_right' => 'numeric|nullable', + 'labels_pmargin_top' => 'numeric|nullable', + 'labels_pmargin_bottom' => 'numeric|nullable', + 'labels_display_bgutter' => 'numeric|nullable', + 'labels_display_sgutter' => 'numeric|nullable', 'labels_fontsize' => 'numeric|min:5', - 'labels_pagewidth' => 'numeric', - 'labels_pageheight' => 'numeric', - "ldap_server" => 'sometimes|required_if:ldap_enabled,1|url', - "ldap_uname" => 'sometimes|required_if:ldap_enabled,1', - "ldap_basedn" => 'sometimes|required_if:ldap_enabled,1', - "ldap_filter" => 'sometimes|required_if:ldap_enabled,1', - "ldap_username_field" => 'sometimes|required_if:ldap_enabled,1', - "ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1', - "ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1', - "ldap_version" => 'sometimes|required_if:ldap_enabled,1', + 'labels_pagewidth' => 'numeric|nullable', + 'labels_pageheight' => 'numeric|nullable', + "thumbnail_max_h" => 'numeric|max:500|min:25', + "pwd_secure_min" => "numeric|required|min:5", + "audit_warning_days" => "numeric|nullable", + "audit_interval" => "numeric|nullable", ]; protected $fillable = ['site_name','email_domain','email_format','username_format']; @@ -49,11 +46,11 @@ class Setting extends Model { static $static_cache = null; - if (!$static_cache) { - if (Schema::hasTable('settings')) { - $static_cache = Setting::first(); - } + if (!$static_cache) { + if (Schema::hasTable('settings')) { + $static_cache = Setting::first(); } + } return $static_cache; @@ -61,23 +58,15 @@ class Setting extends Model public static function setupCompleted() { - + $users_table_exists = Schema::hasTable('users'); $settings_table_exists = Schema::hasTable('settings'); - + if ($users_table_exists && $settings_table_exists) { $usercount = User::withTrashed()->count(); - - if ($usercount > 0) { - return true; - } - return false; - } else { - return false; + $settingsCount = Setting::count(); + return ($usercount > 0 && $settingsCount > 0); } - return false; - - } @@ -151,4 +140,42 @@ class Setting extends Model } return $result; } + + /** + * The url for slack notifications. + * Used by Notifiable trait. + * @return mixed + */ + public function routeNotificationForSlack() + { + // At this point the endpoint is the same for everything. + // In the future this may want to be adapted for individual notifications. + return $this->slack_endpoint; + } + + public static function passwordComplexityRulesSaving($action = 'update') + { + $security_rules = ''; + $settings = Setting::getSettings(); + + // Check if they have uncommon password enforcement selected in settings + if ($settings->pwd_secure_uncommon == 1) { + $security_rules .= '|dumbpwd'; + } + + // Check for any secure password complexity rules that may have been selected + if ($settings->pwd_secure_complexity!='') { + $security_rules .= '|'.$settings->pwd_secure_complexity; + } + + if ($action == 'update') { + return 'nullable|min:'.$settings->pwd_secure_min.$security_rules; + } + + return 'required|min:'.$settings->pwd_secure_min.$security_rules; + + } + + + } diff --git a/app/Models/SnipeModel.php b/app/Models/SnipeModel.php index 4b049804c7..43cf0cfc92 100644 --- a/app/Models/SnipeModel.php +++ b/app/Models/SnipeModel.php @@ -2,10 +2,81 @@ namespace App\Models; +use App\Helpers\Helper; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; class SnipeModel extends Model { + // Setters that are appropriate across multiple models. + public function setPurchaseDateAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['purchase_date'] = $value; + return; + } + + /** + * @param $value + */ + public function setPurchaseCostAttribute($value) + { + $value = Helper::ParseFloat($value); + if ($value == '0.0') { + $value = null; + } + $this->attributes['purchase_cost'] = $value; + return; + } + + public function setLocationIdAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['location_id'] = $value; + return; + } + + public function setCategoryIdAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['category_id'] = $value; + // dd($this->attributes); + return; + } + + public function setSupplierIdAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['supplier_id'] = $value; + return; + } + + public function setDepreciationIdAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['depreciation_id'] = $value; + return; + } + + public function setManufacturerIdAttribute($value) + { + if ($value == '') { + $value = null; + } + $this->attributes['manufacturer_id'] = $value; + return; + } + // public function getDisplayNameAttribute() { diff --git a/app/Models/Statuslabel.php b/app/Models/Statuslabel.php index 20c67558d0..ca50355521 100755 --- a/app/Models/Statuslabel.php +++ b/app/Models/Statuslabel.php @@ -16,6 +16,7 @@ class Statuslabel extends SnipeModel protected $injectUniqueIdentifier = true; protected $dates = ['deleted_at']; protected $table = 'status_labels'; + protected $hidden = ['user_id','deleted_at']; protected $rules = array( @@ -63,6 +64,7 @@ class Statuslabel extends SnipeModel } } + public static function getStatuslabelTypesForDB($type) { if ($type == 'pending') { diff --git a/app/Models/Supplier.php b/app/Models/Supplier.php index 439fb4273c..4e48acd359 100755 --- a/app/Models/Supplier.php +++ b/app/Models/Supplier.php @@ -20,8 +20,8 @@ class Supplier extends SnipeModel 'city' => 'min:3|max:255', 'state' => 'min:0|max:32', 'country' => 'min:0|max:2', - 'fax' => 'min:7|max:20', - 'phone' => 'min:7|max:20', + 'fax' => 'min:7|max:35', + 'phone' => 'min:7|max:35', 'contact' => 'min:0|max:100', 'notes' => 'min:0|max:255', 'email' => 'email|min:5|max:150', @@ -45,7 +45,7 @@ class Supplier extends SnipeModel * * @var array */ - protected $fillable = ['name']; + protected $fillable = ['name','address','address2','city','state','country','zip','phone','fax','email','contact','url','notes']; // Eager load counts. diff --git a/app/Models/User.php b/app/Models/User.php index 76571e5b4e..cbe0a2b60c 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -1,30 +1,46 @@ 'boolean', + ]; /** * Model validation rules @@ -34,19 +50,18 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon protected $rules = [ 'first_name' => 'required|string|min:1', - 'username' => 'required|string|min:2|unique_undeleted', - 'email' => 'email', + 'username' => 'required|string|min:1|unique_undeleted', + 'email' => 'email|nullable', 'password' => 'required|min:6', + 'locale' => 'max:10|nullable' ]; public function hasAccess($section) { - if ($this->isSuperUser()) { return true; } - $user_groups = $this->groups; @@ -60,7 +75,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon if (($user_permissions!='') && ((array_key_exists($section, $user_permissions)) && ($user_permissions[$section]=='1'))) { return true; } - // If the user is explicitly denied, return false if (($user_permissions=='') || array_key_exists($section, $user_permissions) && ($user_permissions[$section]=='-1')) { return false; @@ -104,25 +118,14 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon return $this->belongsTo('\App\Models\Company', 'company_id'); } - public function isActivated() + public function department() { - if ($this->activated == 1) { - return true; - } else { - return false; - } + return $this->belongsTo('\App\Models\Department', 'department_id'); } - - /** - * Returns the user full name, it simply concatenates - * the user first and last name. - * - * @return string - */ - public function fullName() + public function isActivated() { - return "{$this->first_name} {$this->last_name}"; + return $this->activated ==1; } public function getFullNameAttribute() @@ -135,33 +138,15 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon return $this->last_name . ", " . $this->first_name . " (" . $this->username . ")"; } - /** - * Returns the user Gravatar image url. - * - * @return string - */ - public function gravatar() - { - if ($this->avatar) { - return config('app.url').'/uploads/avatars/'.$this->avatar; - } - - if ((Setting::getSettings()->load_remote=='1') && ($this->email!='')) { - $gravatar = md5(strtolower(trim($this->email))); - return "//gravatar.com/avatar/".$gravatar; - } - - return false; - - } /** * Get assets assigned to this user */ public function assets() { - return $this->hasMany('\App\Models\Asset', 'assigned_to')->withTrashed(); + return $this->morphMany('App\Models\Asset', 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); + // return $this->hasMany('\App\Models\Asset', 'assigned_to')->withTrashed(); } /** @@ -220,6 +205,14 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon return $this->belongsTo('\App\Models\User', 'manager_id')->withTrashed(); } + /** + * Get any locations the user manages. + **/ + public function managedLocations() + { + return $this->hasMany('\App\Models\Location', 'manager_id')->withTrashed(); + } + /** * Get user groups */ @@ -309,7 +302,8 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon ->orWhere('username', '=', $user_email); } - public static function generateEmailFromFullName($name) { + public static function generateEmailFromFullName($name) + { $username = User::generateFormattedNameFromFullName(Setting::getSettings()->email_format, $name); return $username['username'].'@'.Setting::getSettings()->email_domain; } @@ -331,7 +325,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon // There is a last name given } else { - $last_name = str_replace($first_name, '', $users_name); + $last_name = str_replace($first_name . ' ', '', $users_name); if ($format=='filastname') { $email_last_name.=str_replace(' ', '', $last_name); @@ -359,6 +353,25 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon } + /** + * Check whether two-factor authorization is required and the user has activated it + * + * @author [A. Gianotto] [] + * @since [v4.0] + * + * @return bool + */ + public function two_factor_active () { + + if (Setting::getSettings()->two_factor_enabled !='0') { + if (($this->two_factor_optin =='1') && ($this->two_factor_enrolled)) { + return true; + } + } + return false; + + } + public function decodePermissions() { @@ -389,6 +402,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon $query->where('locations.name', 'LIKE', '%'.$search.'%'); }); }) + ->orWhere(function ($query) use ($search) { + $query->whereHas('department', function ($query) use ($search) { + $query->where('departments.name', 'LIKE', '%'.$search.'%'); + }); + }) ->orWhere(function ($query) use ($search) { $query->whereHas('groups', function ($query) use ($search) { $query->where('groups.name', 'LIKE', '%'.$search.'%'); @@ -444,4 +462,18 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon { return $query->leftJoin('locations', 'users.location_id', '=', 'locations.id')->orderBy('locations.name', $order); } + + + /** + * Query builder scope to order on department + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderDepartment($query, $order) + { + return $query->leftJoin('departments', 'users.department_id', '=', 'departments.id')->orderBy('departments.name', $order); + } } diff --git a/app/Notifications/AuditNotification.php b/app/Notifications/AuditNotification.php new file mode 100644 index 0000000000..20d3b4a090 --- /dev/null +++ b/app/Notifications/AuditNotification.php @@ -0,0 +1,88 @@ +params = $params; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + $notifyBy = []; + if (Setting::getSettings()->slack_endpoint) { + $notifyBy[] = 'slack'; + } + + return $notifyBy; + } + + public function toSlack($notifiable) + { + + return (new SlackMessage) + ->success() + ->content(class_basename(get_class($this->params['item'])) . " Audited") + ->attachment(function ($attachment) use ($notifiable) { + $item = $this->params['item']; + $admin_user = $this->params['admin']; + $fields = [ + 'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>' + ]; + array_key_exists('note', $this->params) && $fields['Notes'] = $this->params['note']; + array_key_exists('location', $this->params) && $fields['Location'] = $this->params['location']; + + $attachment->title($item->present()->name, $item->present()->viewUrl()) + ->fields($fields); + }); + } + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Notifications/CheckinNotification.php b/app/Notifications/CheckinNotification.php new file mode 100644 index 0000000000..3ecb029a81 --- /dev/null +++ b/app/Notifications/CheckinNotification.php @@ -0,0 +1,95 @@ +params = $params; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + $notifyBy = []; + if (Setting::getSettings()->slack_endpoint) { + $notifyBy[] = 'slack'; + } + $item = $this->params['item']; + if ((method_exists($item, 'requireAcceptance') && ($item->requireAcceptance()=='1')) + || (method_exists($item, 'getEula') && ($item->getEula())) + ) { + $notifyBy[] = 'mail'; + } + return $notifyBy; + } + + public function toSlack($notifiable) + { + return (new SlackMessage) + ->success() + ->content(class_basename(get_class($this->params['item'])) . " Checked In") + ->attachment(function ($attachment) use ($notifiable) { + $item = $this->params['item']; + $admin_user = $this->params['admin']; + $fields = [ + 'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>', + ]; + array_key_exists('note', $this->params) && $fields['Notes'] = $this->params['note']; + + $attachment->title($item->name, $item->present()->viewUrl()) + ->fields($fields); + }); + } + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\sMessages\MailMessage + */ + public function toMail($notifiable) + { + return (new MailMessage) + ->line('The introduction to the notification.') + ->action('Notification Action', 'https://laravel.com') + ->line('Thank you for using our application!'); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Notifications/CheckoutNotification.php b/app/Notifications/CheckoutNotification.php new file mode 100644 index 0000000000..071769f8b9 --- /dev/null +++ b/app/Notifications/CheckoutNotification.php @@ -0,0 +1,122 @@ +params = $params; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + $notifyBy = []; + if (Setting::getSettings()->slack_endpoint) { + $notifyBy[] = 'slack'; + } + $item = $this->params['item']; + + $notifyBy[]='mail'; + // if ((method_exists($item, 'requireAcceptance') && ($item->requireAcceptance()=='1')) + // || (method_exists($item, 'getEula') && ($item->getEula())) + // ) { + // $notifyBy[] = 'mail'; + // } + return $notifyBy; + } + + public function toSlack($notifiable) + { + + return (new SlackMessage) + ->success() + ->content(class_basename(get_class($this->params['item'])) . " Checked Out") + ->attachment(function ($attachment) use ($notifiable) { + $item = $this->params['item']; + $admin_user = $this->params['admin']; + $target = $this->params['target']; + $fields = [ + 'To' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>', + 'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>' + ]; + array_key_exists('note', $this->params) && $fields['Notes'] = $this->params['note']; + + $attachment->title($item->name, $item->present()->viewUrl()) + ->fields($fields); + }); + } + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + //TODO: Expand for non assets. + $item = $this->params['item']; + $admin_user = $this->params['admin']; + $target = $this->params['target']; + $data = [ + 'eula' => method_exists($item, 'getEula') ? $item->getEula() : '', + 'first_name' => $target->present()->fullName(), + 'item_name' => $item->present()->name(), + 'checkout_date' => $item->last_checkout, + 'expected_checkin' => $item->expected_checkin, + 'item_tag' => $item->asset_tag, + 'note' => $this->params['note'], + 'item_serial' => $item->serial, + 'require_acceptance' => $item->requireAcceptance(), + 'log_id' => $this->params['log_id'], + ]; + return (new MailMessage) + ->view('emails.accept-asset', $data) + ->subject(trans('mail.Confirm_asset_delivery')); + // \Mail::send('emails.accept-asset', $data, function ($m) use ($target) { + // $m->to($target->email, $target->first_name . ' ' . $target->last_name); + // $m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name')); + // $m->subject(trans('mail.Confirm_asset_delivery')); + // }); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Notifications/ExpectedCheckinNotification.php b/app/Notifications/ExpectedCheckinNotification.php new file mode 100644 index 0000000000..d1562832a2 --- /dev/null +++ b/app/Notifications/ExpectedCheckinNotification.php @@ -0,0 +1,86 @@ +params = $params; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + $notifyBy = []; + $item = $this->params['item']; + + $notifyBy[]='mail'; + return $notifyBy; + } + + public function toSlack($notifiable) + { + + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $asset + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($params) + { + $formatted_due = Carbon::parse($this->params->expected_checkin)->format('D, M j, Y'); + return (new MailMessage) + ->error() + ->subject('Reminder: '.$this->params->present()->name().' checkin deadline approaching') + ->line('Hi, '.$this->params->assignedto->first_name) + ->greeting('An asset checked out to you is due to be checked back in on '.$formatted_due.'.') + ->line('Asset: '.$this->params->present()->name()) + ->line('Serial: '.$this->params->serial) + ->line('Asset Tag: '.$this->params->asset_tag) + ->action('View Your Assets', route('view-assets')); + + + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Observers/AccessoryObserver.php b/app/Observers/AccessoryObserver.php new file mode 100644 index 0000000000..f84f12d116 --- /dev/null +++ b/app/Observers/AccessoryObserver.php @@ -0,0 +1,63 @@ +item_type = Accessory::class; + $logAction->item_id = $accessory->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('update'); + } + + + /** + * Listen to the Accessory created event when + * a new accessory is created. + * + * @param Accessory $accessory + * @return void + */ + public function created(Accessory $accessory) + { + $logAction = new Actionlog(); + $logAction->item_type = Accessory::class; + $logAction->item_id = $accessory->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('create'); + + } + + /** + * Listen to the Accessory deleting event. + * + * @param Accessory $accessory + * @return void + */ + public function deleting(Accessory $accessory) + { + $logAction = new Actionlog(); + $logAction->item_type = Accessory::class; + $logAction->item_id = $accessory->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('delete'); + } +} diff --git a/app/Observers/AssetObserver.php b/app/Observers/AssetObserver.php new file mode 100644 index 0000000000..3066057d1c --- /dev/null +++ b/app/Observers/AssetObserver.php @@ -0,0 +1,76 @@ +getOriginal()['assigned_to'])) && ($asset->getAttributes()['assigned_to'] == $asset->getOriginal()['assigned_to']) + && ($asset->getAttributes()['next_audit_date'] == $asset->getOriginal()['next_audit_date']) + && ($asset->getAttributes()['last_checkout'] == $asset->getOriginal()['last_checkout']) + && ($asset->getAttributes()['status_id'] == $asset->getOriginal()['status_id'])) + { + $logAction = new Actionlog(); + $logAction->item_type = Asset::class; + $logAction->item_id = $asset->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('update'); + } + + } + + + /** + * Listen to the Asset created event, and increment + * the next_auto_tag_base value in the settings table when i + * a new asset is created. + * + * @param Asset $asset + * @return void + */ + public function created(Asset $asset) + { + if ($settings = Setting::first()) { + $settings->increment('next_auto_tag_base'); + } + + $logAction = new Actionlog(); + $logAction->item_type = Asset::class; + $logAction->item_id = $asset->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('create'); + + } + + /** + * Listen to the Asset deleting event. + * + * @param Asset $asset + * @return void + */ + public function deleting(Asset $asset) + { + $logAction = new Actionlog(); + $logAction->item_type = Asset::class; + $logAction->item_id = $asset->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('delete'); + } +} diff --git a/app/Observers/ComponentObserver.php b/app/Observers/ComponentObserver.php new file mode 100644 index 0000000000..054520fc8e --- /dev/null +++ b/app/Observers/ComponentObserver.php @@ -0,0 +1,63 @@ +item_type = Component::class; + $logAction->item_id = $component->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('update'); + } + + + /** + * Listen to the Component created event when + * a new component is created. + * + * @param Component $component + * @return void + */ + public function created(Component $component) + { + $logAction = new Actionlog(); + $logAction->item_type = Component::class; + $logAction->item_id = $component->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('create'); + + } + + /** + * Listen to the Component deleting event. + * + * @param Component $component + * @return void + */ + public function deleting(Component $component) + { + $logAction = new Actionlog(); + $logAction->item_type = Component::class; + $logAction->item_id = $component->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('delete'); + } +} diff --git a/app/Observers/ConsumableObserver.php b/app/Observers/ConsumableObserver.php new file mode 100644 index 0000000000..4b41df0782 --- /dev/null +++ b/app/Observers/ConsumableObserver.php @@ -0,0 +1,64 @@ +item_type = Consumable::class; + $logAction->item_id = $consumable->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('update'); + } + + + /** + * Listen to the Consumable created event when + * a new consumable is created. + * + * @param Consumable $consumable + * @return void + */ + public function created(Consumable $consumable) + { + + $logAction = new Actionlog(); + $logAction->item_type = Consumable::class; + $logAction->item_id = $consumable->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('create'); + + } + + /** + * Listen to the Consumable deleting event. + * + * @param Consumable $consumable + * @return void + */ + public function deleting(Consumable $consumable) + { + $logAction = new Actionlog(); + $logAction->item_type = Consumable::class; + $logAction->item_id = $consumable->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('delete'); + } +} diff --git a/app/Observers/LicenseObserver.php b/app/Observers/LicenseObserver.php new file mode 100644 index 0000000000..19c85ae923 --- /dev/null +++ b/app/Observers/LicenseObserver.php @@ -0,0 +1,64 @@ +item_type = License::class; + $logAction->item_id = $license->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('update'); + } + + + /** + * Listen to the License created event when + * a new license is created. + * + * @param License $license + * @return void + */ + public function created(License $license) + { + + $logAction = new Actionlog(); + $logAction->item_type = License::class; + $logAction->item_id = $license->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('create'); + + } + + /** + * Listen to the License deleting event. + * + * @param License $license + * @return void + */ + public function deleting(License $license) + { + $logAction = new Actionlog(); + $logAction->item_type = License::class; + $logAction->item_id = $license->id; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->user_id = Auth::id(); + $logAction->logaction('delete'); + } +} diff --git a/app/Policies/AccessoryPolicy.php b/app/Policies/AccessoryPolicy.php new file mode 100644 index 0000000000..8405f14686 --- /dev/null +++ b/app/Policies/AccessoryPolicy.php @@ -0,0 +1,119 @@ +hasAccess('admin')) { + return true; + } + } + + public function index(User $user) + { + // dd('here'); + return $user->hasAccess('accessories.view'); + } + /** + * Determine whether the user can view the accessory. + * + * @param \App\User $user + * @param \App\Accessory $accessory + * @return mixed + */ + public function view(User $user, Accessory $accessory = null) + { + // + return $user->hasAccess('accessories.view'); + } + + /** + * Determine whether the user can create accessories. + * + * @param \App\User $user + * @return mixed + */ + public function create(User $user) + { + // + return $user->hasAccess('accessories.create'); + } + + /** + * Determine whether the user can update the accessory. + * + * @param \App\User $user + * @param \App\Accessory $accessory + * @return mixed + */ + public function update(User $user, Accessory $accessory = null) + { + // + return $user->hasAccess('accessories.edit'); + } + + /** + * Determine whether the user can delete the accessory. + * + * @param \App\User $user + * @param \App\Accessory $accessory + * @return mixed + */ + public function delete(User $user, Accessory $accessory = null) + { + // + return $user->hasAccess('accessories.delete'); + } + + /** + * Determine whether the user can checkout the accessory. + * + * @param \App\User $user + * @param \App\Accessory $accessory + * @return mixed + */ + public function checkout(User $user, Accessory $accessory = null) + { + return $user->hasAccess('accessories.checkout'); + } + + /** + * Determine whether the user can checkin the accessory. + * + * @param \App\User $user + * @param \App\Accessory $accessory + * @return mixed + */ + public function checkin(User $user, Accessory $accessory = null) + { + return $user->hasAccess('accessories.checkin'); + } + + /** + * Determine whether the user can manage the accessory. + * + * @param \App\User $user + * @param \App\Accessory $accessory + * @return mixed + */ + public function manage(User $user, Accessory $accessory = null) + { + return $user->hasAccess('accessories.checkin') + || $user->hasAccess('accessories.edit') + || $user->hasAccess('accessories.checkout'); + } +} diff --git a/app/Policies/AssetPolicy.php b/app/Policies/AssetPolicy.php new file mode 100644 index 0000000000..3b7574d099 --- /dev/null +++ b/app/Policies/AssetPolicy.php @@ -0,0 +1,80 @@ +hasAccess('admin')) { + return true; + } + } + public function index(User $user) + { + return $user->hasAccess('assets.view'); + } + public function view(User $user, Asset $asset) + { + return $user->hasAccess('assets.view'); + } + + public function viewRequestable(User $user, Asset $asset = null) + { + return $user->hasAccess('assets.view.requestable'); + } + + public function create(User $user) + { + return $user->hasAccess('assets.create'); + } + + public function checkout(User $user, Asset $asset = null) + { + return $user->hasAccess('assets.checkout'); + } + + public function checkin(User $user, Asset $asset = null) + { + return $user->hasAccess('assets.checkin'); + } + + public function delete(User $user, Asset $asset = null) + { + return $user->hasAccess('assets.delete'); + } + public function manage(User $user, Asset $asset = null) + { + return $user->hasAccess('assets.checkin') + || $user->hasAccess('assets.edit') + || $user->hasAccess('assets.delete') + || $user->hasAccess('assets.checkout'); + } + + public function update(User $user, Asset $asset = null) + { + return $user->hasAccess('assets.edit'); + } +} diff --git a/app/Policies/ComponentPolicy.php b/app/Policies/ComponentPolicy.php new file mode 100644 index 0000000000..5b138d0a5c --- /dev/null +++ b/app/Policies/ComponentPolicy.php @@ -0,0 +1,114 @@ +hasAccess('admin')) { + return true; + } + } + /** + * Determine whether the user can view the component. + * + * @param \App\User $user + * @param \App\Component $component + * @return mixed + */ + public function view(User $user, Component $component = null) + { + // + return $user->hasAccess('components.view'); + } + + /** + * Determine whether the user can create components. + * + * @param \App\User $user + * @return mixed + */ + public function create(User $user) + { + // + return $user->hasAccess('components.create'); + } + + /** + * Determine whether the user can update the component. + * + * @param \App\User $user + * @param \App\Component $component + * @return mixed + */ + public function update(User $user, Component $component = null) + { + // + return $user->hasAccess('components.edit'); + } + + /** + * Determine whether the user can delete the component. + * + * @param \App\User $user + * @param \App\Component $component + * @return mixed + */ + public function delete(User $user, Component $component = null) + { + // + return $user->hasAccess('components.delete'); + } + + /** + * Determine whether the user can checkout the component. + * + * @param \App\User $user + * @param \App\Accessory $component + * @return mixed + */ + public function checkout(User $user, Component $component = null) + { + return $user->hasAccess('components.checkout'); + } + + /** + * Determine whether the user can checkin the component. + * + * @param \App\User $user + * @param \App\Component $component + * @return mixed + */ + public function checkin(User $user, Component $component = null) + { + return $user->hasAccess('components.checkin'); + } + + /** + * Determine whether the user can manage the component. + * + * @param \App\User $user + * @param \App\Component $component + * @return mixed + */ + public function manage(User $user, Component $component = null) + { + return $user->hasAccess('components.checkin') + || $user->hasAccess('components.edit') + || $user->hasAccess('components.checkout'); + } +} diff --git a/app/Policies/ConsumablePolicy.php b/app/Policies/ConsumablePolicy.php new file mode 100644 index 0000000000..d6f6408452 --- /dev/null +++ b/app/Policies/ConsumablePolicy.php @@ -0,0 +1,119 @@ +hasAccess('admin')) { + return true; + } + } + /** + * Determine whether the user can view the consumable. + * + * @param \App\User $user + * @param \App\Consumable $consumable + * @return mixed + */ + public function view(User $user, Consumable $consumable = null) + { + // + return $user->hasAccess('consumables.view'); + } + + /** + * Determine whether the user can create consumables. + * + * @param \App\User $user + * @return mixed + */ + public function create(User $user) + { + // + return $user->hasAccess('consumables.create'); + } + + /** + * Determine whether the user can update the consumable. + * + * @param \App\User $user + * @param \App\Consumable $consumable + * @return mixed + */ + public function update(User $user, Consumable $consumable = null) + { + // + return $user->hasAccess('consumables.edit'); + } + + /** + * Determine whether the user can delete the consumable. + * + * @param \App\User $user + * @param \App\Consumable $consumable + * @return mixed + */ + public function delete(User $user, Consumable $consumable = null) + { + // + return $user->hasAccess('consumables.delete'); + } + + /** + * Determine whether the user can checkout the consumable. + * + * @param \App\User $user + * @param \App\Accessory $consumable + * @return mixed + */ + public function checkout(User $user, Consumable $consumable = null) + { + return $user->hasAccess('consumables.checkout'); + } + + /** + * Determine whether the user can checkin the consumable. + * + * @param \App\User $user + * @param \App\Consumable $consumable + * @return mixed + */ + public function checkin(User $user, Consumable $consumable = null) + { + return $user->hasAccess('consumables.checkin'); + } + + public function index(User $user) + { + return $user->hasAccess('consumables.view'); + } + + /** + * Determine whether the user can manage the consumable. + * + * @param \App\User $user + * @param \App\Consumable $consumable + * @return mixed + */ + public function manage(User $user, Consumable $consumable = null) + { + return $user->hasAccess('consumables.checkin') + || $user->hasAccess('consumables.edit') + || $user->hasAccess('consumables.checkout'); + } +} diff --git a/app/Policies/LicensePolicy.php b/app/Policies/LicensePolicy.php new file mode 100644 index 0000000000..b6c7d95760 --- /dev/null +++ b/app/Policies/LicensePolicy.php @@ -0,0 +1,127 @@ +hasAccess('admin')) { + return true; + } + } + /** + * Determine whether the user can view the license. + * + * @param \App\User $user + * @param \App\License $license + * @return mixed + */ + public function view(User $user, License $license = null) + { + // + return $user->hasAccess('licenses.view'); + } + + /** + * Determine whether the user can create licenses. + * + * @param \App\User $user + * @return mixed + */ + public function create(User $user) + { + // + return $user->hasAccess('licenses.create'); + } + + /** + * Determine whether the user can update the license. + * + * @param \App\User $user + * @param \App\License $license + * @return mixed + */ + public function update(User $user, License $license = null) + { + // + return $user->hasAccess('licenses.edit'); + } + + /** + * Determine whether the user can delete the license. + * + * @param \App\User $user + * @param \App\License $license + * @return mixed + */ + public function delete(User $user, License $license = null) + { + // + return $user->hasAccess('licenses.delete'); + } + + /** + * Determine whether the user can checkout the license. + * + * @param \App\User $user + * @param \App\Accessory $license + * @return mixed + */ + public function checkout(User $user, LicenseSeat $license = null) + { + return $user->hasAccess('licenses.checkout'); + } + + /** + * Determine whether the user can checkin the license. + * + * @param \App\User $user + * @param \App\License $license + * @return mixed + */ + public function checkin(User $user, LicenseSeat $license = null) + { + return $user->hasAccess('licenses.checkin'); + } + /** + * Determine whether the user can view license keys + * + * @param \App\User $user + * @param \App\License $license + * @return mixed + */ + public function viewKeys(User $user, License $license = null) + { + return $user->hasAccess('licenses.keys'); + } + + /** + * Determine whether the user can manage the license. + * + * @param \App\User $user + * @param \App\License $license + * @return mixed + */ + public function manage(User $user, License $license = null) + { + return $user->hasAccess('licenses.checkin') + || $user->hasAccess('licenses.edit') + || $user->hasAccess('licenses.delete') + || $user->hasAccess('licenses.checkout'); + } +} diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php new file mode 100644 index 0000000000..33630cc0d4 --- /dev/null +++ b/app/Policies/UserPolicy.php @@ -0,0 +1,88 @@ +hasAccess('admin')) { + return true; + } + } + /** + * Determine whether the user can view the targetUser. + * + * @param \App\Models\User $user + * @param \App\Models\Consumable $targetUser + * @return mixed + */ + public function view(User $user, User $targetUser = null) + { + // + return $user->hasAccess('users.view'); + } + + /** + * Determine whether the user can create users. + * + * @param \App\Models\User $user + * @return mixed + */ + public function create(User $user) + { + return $user->hasAccess('users.create'); + } + + /** + * Determine whether the user can update the targetUser. + * + * @param \App\Models\User $user + * @param \App\Models\User $targetUser + * @return mixed + */ + public function update(User $user, User $targetUser = null) + { + return $user->hasAccess('users.edit'); + } + + /** + * Determine whether the user can delete the targetUser. + * + * @param \App\Models\User $user + * @param \App\Models\User $targetUser + * @return mixed + */ + public function delete(User $user, User $targetUser = null) + { + if ($targetUser) { + //We can't delete ourselves. + if ($user->id == $targetUser->id) { + return false; + } + + if ((!Auth::user()->isSuperUser()) || (config('app.lock_passwords'))) { + return false; + } + } + return $user->hasAccess('users.delete'); + } + + public function index(User $user) + { + return $user->hasAccess('users.view'); + } +} diff --git a/app/Presenters/AccessoryPresenter.php b/app/Presenters/AccessoryPresenter.php new file mode 100644 index 0000000000..6a8821a2fb --- /dev/null +++ b/app/Presenters/AccessoryPresenter.php @@ -0,0 +1,197 @@ + "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], [ + "field" => "company", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/companies/table.title'), + "visible" => false, + "formatter" => "companiesLinkObjFormatter" + ], [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('general.name'), + "formatter" => "accessoriesLinkFormatter" + ], [ + "field" => "category", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/accessories/general.accessory_category'), + "formatter" => "categoriesLinkObjFormatter" + ], [ + "field" => "model_number", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/models/table.modelnumber'), + "formatter" => "accessoriesLinkFormatter" + ], [ + "field" => "manufacturer", + "searchable" => true, + "sortable" => true, + "title" => trans('general.manufacturer'), + "formatter" => "manufacturersLinkObjFormatter", + ], [ + "field" => "location", + "searchable" => true, + "sortable" => true, + "title" => trans('general.location'), + "formatter" => "locationsLinkObjFormatter", + ], [ + "field" => "qty", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/accessories/general.total'), + ], [ + "field" => "min_qty", + "searchable" => false, + "sortable" => true, + "title" => trans('general.min_amt'), + ], [ + "field" => "remaining_qty", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/accessories/general.remaining'), + ], [ + "field" => "purchase_date", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.purchase_date'), + "formatter" => "dateDisplayFormatter" + ], [ + "field" => "purchase_cost", + "searchable" => true, + "sortable" => true, + "title" => trans('general.purchase_cost'), + ], [ + "field" => "order_number", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.order_number'), + ],[ + "field" => "change", + "searchable" => false, + "sortable" => false, + "visible" => true, + "title" => trans('general.change'), + "formatter" => "accessoriesInOutFormatter", + ], [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "formatter" => "accessoriesActionsFormatter", + ] + ]; + + return json_encode($layout); + } + + /** + * JSON representation of Accessory for datatable. + * @return array + */ + public function forDataTable() + { + + $actions = ''; + if (Gate::allows('checkout', $this->model)) { + $actions .= Helper::generateDatatableButton( + 'checkout', + route('checkout/accessory', $this->id), + $this->numRemaining() > 0 + ); + } + if (Gate::allows('update', $this->model)) { + $actions .= Helper::generateDatatableButton('edit', route('accessories.edit', $this->id)); + } + if (Gate::allows('delete', $this->model)) { + $actions .= Helper::generateDatatableButton( + 'delete', + route('accessories.destroy', $this->id), + true, /*enabled*/ + trans('admin/accessories/message.delete.confirm'), + $this->name + ); + } + $actions .= ''; + + $results = []; + $results['name'] = $this->nameUrl(); + $results['category'] = ''; + if ($this->model->category) { + $results['category'] = $this->model->category->present()->nameUrl(); + } + $results['model_number'] = $this->model_number; + $results['qty'] = $this->qty; + $results['order_number'] = $this->order_number; + $results['min_amt'] = $this->min_amt; + $results['location'] = $this->model->location ? $this->model->location->present()->nameUrl() : ''; + $results['purchase_date'] = $this->purchase_date; + $results['purchase_cost'] = Helper::formatCurrencyOutput($this->purchase_cost); + $results['numRemaining'] = $this->numRemaining(); + $results['companyName'] = $this->model->company ? $this->model->company->present()->nameUrl() : ''; + $results['manufacturer'] = $this->model->manufacturer ? $this->model->manufacturer->present()->nameUrl() : ''; + $results['actions'] = $actions; + + return $results; + } + + /** + * Pregenerated link to this accessories view page. + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('accessories.show', $this->name, $this->id); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('accessories.show', $this->id); + } + + public function name() + { + return $this->model->name; + } +} diff --git a/app/Presenters/ActionlogPresenter.php b/app/Presenters/ActionlogPresenter.php new file mode 100644 index 0000000000..dc9629953c --- /dev/null +++ b/app/Presenters/ActionlogPresenter.php @@ -0,0 +1,95 @@ +model->user) { + if(empty($user->deleted_at)) { + return $user->present()->nameUrl(); + } + // The user was deleted + return ''.$user->getFullNameAttribute()." (deleted)"; + } + return ''; + } + + public function item() + { + if($this->action_type=='uploaded') { + return (string) link_to_route('show/userfile', $this->model->filename, [$this->model->item->id, $this->model->id]); + } + if ($item = $this->model->item) { + if (empty($item->deleted_at)) { + return $this->model->item->present()->nameUrl(); + } + // The item was deleted + return ''.$item->name.' (deleted)'; + } + return ''; + } + + + public function icon() + { + $itemicon = 'fa fa-paperclip'; + + if ($this->itemType() == "asset") { + $itemicon = 'fa fa-barcode'; + } elseif ($this->itemType() == "accessory") { + $itemicon = 'fa fa-keyboard-o'; + } elseif ($this->itemType()=="consumable") { + $itemicon = 'fa fa-tint'; + } elseif ($this->itemType()=="license") { + $itemicon = 'fa fa-floppy-o'; + } elseif ($this->itemType()=="component") { + $itemicon = 'fa fa-hdd-o'; + } + + return $itemicon; + } + + + public function actionType() { + return strtolower(trans('general.'.str_replace(' ', '_', $this->action_type))); + } + + + + public function target() + { + $target = null; + // Target is messy. + // On an upload, the target is the item we are uploading to, stored as the "item" in the log. + if ($this->action_type=='uploaded') { + $target = $this->model->item; + } elseif (($this->action_type=='accepted') || ($this->action_type=='declined')) { + // If we are logging an accept/reject, the target is not stored directly, + // so we access it through who the item is assigned to. + // FIXME: On a reject it's not assigned to anyone. + $target = $this->model->item->assignedTo; + } elseif ($this->action_type=='requested') { + if ($this->model->user) { + $target = $this->model->user; + } + } elseif ($this->model->target) { + // Otherwise, we'll just take the target of the log. + $target = $this->model->target; + } + + if($target) { + if (empty($target->deleted_at)) { + return $target->present()->nameUrl(); + } + return ''.$target->present()->name().''; + } + return ''; + } +} diff --git a/app/Presenters/AssetModelPresenter.php b/app/Presenters/AssetModelPresenter.php new file mode 100644 index 0000000000..7011a72039 --- /dev/null +++ b/app/Presenters/AssetModelPresenter.php @@ -0,0 +1,84 @@ +model->note) { + return $Parsedown->text($this->model->note); + } + + } + + public function eolText() + { + if ($this->eol) { + return $this->eol.' '.trans('general.months'); + } + return ''; + } + + /** + * Pretty name for this model + * @return string + */ + public function modelName() + { + $name = $this->model->manufacturer->name.' '.$this->name; + if ($this->model_number) { + $name .=" / ".$this->model_number; + } + return $name; + } + + /** + * Standard url for use to view page. + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('models.show', $this->name, $this->id); + } + + /** + * Generate img tag to this models image. + * @return string + */ + public function imageUrl() + { + if (!empty($this->image)) { + return ''; + } + return ''; + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('models.show', $this->id); + } +} diff --git a/app/Presenters/AssetPresenter.php b/app/Presenters/AssetPresenter.php new file mode 100644 index 0000000000..87d4469b50 --- /dev/null +++ b/app/Presenters/AssetPresenter.php @@ -0,0 +1,360 @@ + "checkbox", + "checkbox" => true + ], [ + "field" => "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], [ + "field" => "company", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.company'), + "visible" => false, + "formatter" => 'assetCompanyObjFilterFormatter' + ], [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/form.name'), + "visible" => true, + "formatter" => "hardwareLinkFormatter" + ], [ + "field" => "image", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/hardware/table.image'), + "visible" => true, + "formatter" => "imageFormatter" + ], [ + "field" => "asset_tag", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/table.asset_tag'), + "visible" => true, + "formatter" => "hardwareLinkFormatter" + ], [ + "field" => "serial", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/form.serial'), + "visible" => true, + "formatter" => "hardwareLinkFormatter" + ], [ + "field" => "model", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/form.model'), + "visible" => true, + "formatter" => "modelsLinkObjFormatter" + ], [ + "field" => "model_number", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/models/table.modelnumber'), + "visible" => false + ], [ + "field" => "category", + "searchable" => true, + "sortable" => true, + "title" => trans('general.category'), + "visible" => true, + "formatter" => "categoriesLinkObjFormatter" + ], [ + "field" => "status_label", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/table.status'), + "visible" => true, + "formatter" => "statuslabelsLinkObjFormatter" + ], [ + "field" => "assigned_to", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/form.checkedout_to'), + "visible" => true, + "formatter" => "polymorphicItemFormatter" + ], [ + "field" => "employee_number", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/users/table.employee_num'), + "visible" => false, + "formatter" => "employeeNumFormatter" + ],[ + "field" => "location", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/table.location'), + "visible" => true, + "formatter" => "locationsLinkObjFormatter" + ], [ + "field" => "manufacturer", + "searchable" => true, + "sortable" => true, + "title" => trans('general.manufacturer'), + "visible" => false, + "formatter" => "manufacturersLinkObjFormatter" + ],[ + "field" => "supplier", + "searchable" => true, + "sortable" => true, + "title" => trans('general.supplier'), + "visible" => false, + "formatter" => "suppliersLinkObjFormatter" + ], [ + "field" => "purchase_date", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.purchase_date'), + "formatter" => "dateDisplayFormatter" + ], [ + "field" => "purchase_cost", + "searchable" => true, + "sortable" => true, + "title" => trans('general.purchase_cost'), + ], [ + "field" => "order_number", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.order_number'), + 'formatter' => "orderNumberObjFilterFormatter" + ], [ + "field" => "notes", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.notes'), + ], [ + "field" => "created_at", + "searchable" => false, + "sortable" => true, + "visible" => false, + "title" => trans('general.created_at'), + "formatter" => "dateDisplayFormatter" + ], [ + "field" => "updated_at", + "searchable" => false, + "sortable" => true, + "visible" => false, + "title" => trans('general.updated_at'), + "formatter" => "dateDisplayFormatter" + ], [ + "field" => "last_checkout", + "searchable" => false, + "sortable" => true, + "visible" => false, + "title" => trans('admin/hardware/table.checkout_date'), + "formatter" => "dateDisplayFormatter" + ], [ + "field" => "expected_checkin", + "searchable" => false, + "sortable" => true, + "visible" => false, + "title" => trans('admin/hardware/form.expected_checkin'), + "formatter" => "dateDisplayFormatter" + ], + ]; + + // This looks complicated, but we have to confirm that the custom fields exist in custom fieldsets + // *and* those fieldsets are associated with models, otherwise we'll trigger + // javascript errors on the bootstrap tables side of things, since we're asking for properties + // on fields that will never be passed through the REST API since they're not associated with + // models. We only pass the fieldsets that pertain to each asset (via their model) so that we + // don't junk up the REST API with tons of custom fields that don't apply + + $fields = CustomField::whereHas('fieldset', function ($query) { + $query->whereHas('models'); + })->get(); + + foreach ($fields as $field) { + $layout[] = [ + "field" => 'custom_fields.'.$field->convertUnicodeDbSlug(), + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => ($field->field_encrypted=='1') ?' '.e($field->name) : e($field->name), + "formatter" => "customFieldsFormatter" + ]; + + } + + $layout[] = [ + "field" => "checkincheckout", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => 'Checkin/Checkout', + "visible" => true, + "formatter" => "hardwareInOutFormatter", + ]; + + $layout[] = [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "formatter" => "hardwareActionsFormatter", + ]; + + return json_encode($layout); + } + + + + /** + * Generate html link to this items name. + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('hardware.show', e($this->name), $this->id); + } + + public function modelUrl() + { + if ($this->model->model) { + return $this->model->model->present()->nameUrl(); + } + return ''; + } + + /** + * Generate img tag to this items image. + * @return mixed|string + */ + public function imageUrl() + { + $imagePath = ''; + if ($this->image && !empty($this->image)) { + $imagePath = $this->image; + } elseif ($this->model && !empty($this->model->image)) { + $imagePath = $this->model->image; + } + $url = config('app.url'); + if (!empty($imagePath)) { + $imagePath = ""; + } + return $imagePath; + } + + /** + * Get Displayable Name + * @return string + **/ + public function name() + { + if (empty($this->name)) { + if (isset($this->model)) { + return $this->model->name.' ('.$this->asset_tag.')'; + } + return $this->asset_tag; + } else { + return $this->name.' ('.$this->asset_tag.')'; + } + } + + /** + * Helper for notification polymorphism. + * @return mixed + */ + public function fullName() + { + return $this->name(); + } + /** + * Returns the date this item hits EOL. + * @return false|string + */ + public function eol_date() + { + + if (( $this->purchase_date ) && ( $this->model )) { + $date = date_create($this->purchase_date); + date_add($date, date_interval_create_from_date_string($this->model->model->eol . ' months')); + return date_format($date, 'Y-m-d'); + } + + } + + /** + * How many months until this asset hits EOL. + * @return null + */ + public function months_until_eol() + { + + $today = date("Y-m-d"); + $d1 = new DateTime($today); + $d2 = new DateTime($this->eol_date()); + + if ($this->eol_date() > $today) { + $interval = $d2->diff($d1); + } else { + $interval = null; + } + + return $interval; + } + + public function statusText() + { + if ($this->model->assignedTo) { + return trans('general.deployed'); + } + return $this->model->assetstatus->name; + } + /** + * Date the warantee expires. + * @return false|string + */ + public function warrantee_expires() + { + $date = date_create($this->purchase_date); + date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months')); + return date_format($date, 'Y-m-d'); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('hardware.show', $this->id); + } + + public function glyph() + { + return ''; + } +} + diff --git a/app/Presenters/CategoryPresenter.php b/app/Presenters/CategoryPresenter.php new file mode 100644 index 0000000000..7dbcb4d541 --- /dev/null +++ b/app/Presenters/CategoryPresenter.php @@ -0,0 +1,111 @@ + "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('general.name'), + "visible" => true, + "formatter" => 'categoriesLinkFormatter', + ],[ + "field" => "type", + "searchable" => true, + "sortable" => true, + "title" => trans('general.type'), + "visible" => true + ], [ + "field" => "assets_count", + "searchable" => false, + "sortable" => false, + "title" => trans('general.assets'), + "visible" => true + ], [ + "field" => "accessories_count", + "searchable" => false, + "sortable" => false, + "title" => trans('general.accessories'), + "visible" => true + ], [ + "field" => "consumables_count", + "searchable" => false, + "sortable" => false, + "title" => trans('general.consumables'), + "visible" => true + ], [ + "field" => "components_count", + "searchable" => false, + "sortable" => false, + "title" => trans('general.components'), + "visible" => true + ], [ + "field" => "use_default_eula", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/categories/table.eula_text'), + "visible" => false, + "formatter" => 'trueFalseFormatter', + ], [ + "field" => "require_acceptance", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/categories/table.require_acceptance'), + "visible" => true, + "formatter" => 'trueFalseFormatter', + ], [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "visible" => true, + "formatter" => "categoriesActionsFormatter", + ] + ]; + + return json_encode($layout); + } + + + /** + * Link to this categories name + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('categories.show', $this->name, $this->id); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('categories.show', $this->id); + } +} diff --git a/app/Presenters/CompanyPresenter.php b/app/Presenters/CompanyPresenter.php new file mode 100644 index 0000000000..caf1690dd6 --- /dev/null +++ b/app/Presenters/CompanyPresenter.php @@ -0,0 +1,115 @@ + "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ],[ + "field" => "name", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/companies/table.name'), + "visible" => true, + "formatter" => 'companiesLinkFormatter', + ],[ + "field" => "users_count", + "searchable" => false, + "sortable" => false, + "title" => '', + "visible" => true, + + ],[ + "field" => "assets_count", + "searchable" => false, + "sortable" => false, + "title" => '', + "visible" => true, + + ],[ + "field" => "licenses_count", + "searchable" => false, + "sortable" => false, + "visible" => true, + "title" => ' ', + ],[ + "field" => "accessories_count", + "searchable" => false, + "sortable" => false, + "visible" => true, + "title" => ' ', + ],[ + "field" => "consumables_count", + "searchable" => false, + "sortable" => false, + "visible" => true, + "title" => ' ', + ],[ + "field" => "components_count", + "searchable" => false, + "sortable" => false, + "visible" => true, + "title" => ' ', + ],[ + "field" => "updated_at", + "searchable" => false, + "sortable" => false, + "visible" => false, + "title" => trans('general.updated_at'), + ],[ + "field" => "created_at", + "searchable" => false, + "sortable" => false, + "visible" => false, + "title" => trans('general.created_at'), + ],[ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "visible" => true, + "formatter" => "companiesActionsFormatter", + ] + ]; + + return json_encode($layout); + } + + + /** + * Link to this companies name + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('companies.show', $this->name, $this->id); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('companies.show', $this->id); + } +} diff --git a/app/Presenters/ComponentPresenter.php b/app/Presenters/ComponentPresenter.php new file mode 100644 index 0000000000..533b05b812 --- /dev/null +++ b/app/Presenters/ComponentPresenter.php @@ -0,0 +1,124 @@ + "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], + [ + "field" => "company", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.company'), + "visible" => false, + "formatter" => 'companiesLinkObjFormatter', + ], + [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('general.name'), + "visible" => true, + "formatter" => 'componentsLinkFormatter', + ], [ + "field" => "category", + "searchable" => true, + "sortable" => true, + "title" => trans('general.category'), + "formatter" => "categoriesLinkObjFormatter" + ], [ + "field" => "qty", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/components/general.total'), + "visible" => true, + ], [ + "field" => "remaining", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/components/general.remaining'), + "visible" => true, + ], [ + "field" => "min_amt", + "searchable" => false, + "sortable" => false, + "title" => trans('general.min_amt'), + "visible" => true, + ], [ + "field" => "order_number", + "searchable" => true, + "sortable" => true, + "title" => trans('general.order_number'), + "visible" => true, + ],[ + "field" => "purchase_date", + "searchable" => true, + "sortable" => true, + "title" => trans('general.purchase_date'), + "visible" => true, + "formatter" => "dateDisplayFormatter", + ],[ + "field" => "purchase_cost", + "searchable" => true, + "sortable" => true, + "title" => trans('general.purchase_cost'), + "visible" => true, + ], + ]; + + $layout[] = [ + "field" => "checkincheckout", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => 'Checkin/Checkout', + "visible" => true, + "formatter" => "componentsInOutFormatter", + ]; + + $layout[] = [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "formatter" => "componentsActionsFormatter", + ]; + + + return json_encode($layout); + } + + /** + * Generate html link to this items name. + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('consumables.show', e($this->name), $this->id); + } + + +} diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php new file mode 100644 index 0000000000..88e13ff58d --- /dev/null +++ b/app/Presenters/ConsumablePresenter.php @@ -0,0 +1,132 @@ + "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], + [ + "field" => "company", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.company'), + "visible" => false, + "formatter" => 'companiesLinkObjFormatter', + ], + [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('general.name'), + "visible" => true, + "formatter" => 'consumablesLinkFormatter', + ], [ + "field" => "category", + "searchable" => true, + "sortable" => true, + "title" => trans('general.category'), + "formatter" => "categoriesLinkObjFormatter" + ],[ + "field" => "item_no", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/consumables/general.item_no') + ], [ + "field" => "qty", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/components/general.total'), + "visible" => true, + ], [ + "field" => "remaining", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/components/general.remaining'), + "visible" => true, + ], [ + "field" => "min_amt", + "searchable" => false, + "sortable" => false, + "title" => trans('general.min_amt'), + "visible" => true, + ], [ + "field" => "order_number", + "searchable" => true, + "sortable" => true, + "title" => trans('general.order_number'), + "visible" => true, + ],[ + "field" => "purchase_date", + "searchable" => true, + "sortable" => true, + "title" => trans('general.purchase_date'), + "visible" => true, + "formatter" => "dateDisplayFormatter", + ],[ + "field" => "purchase_cost", + "searchable" => true, + "sortable" => true, + "title" => trans('general.purchase_cost'), + "visible" => true, + ],[ + "field" => "change", + "searchable" => false, + "sortable" => false, + "visible" => true, + "title" => trans('general.change'), + "formatter" => "consumablesInOutFormatter", + ], [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "visible" => true, + "formatter" => "consumablesActionsFormatter", + ] + ]; + + return json_encode($layout); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('consumables.show', $this->id); + } + + /** + * Generate html link to this items name. + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('consumables.show', e($this->name), $this->id); + } + + +} diff --git a/app/Presenters/DepreciationPresenter.php b/app/Presenters/DepreciationPresenter.php new file mode 100644 index 0000000000..c6b17c6348 --- /dev/null +++ b/app/Presenters/DepreciationPresenter.php @@ -0,0 +1,14 @@ + "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], [ + "field" => "company", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/companies/table.title'), + "visible" => false, + "formatter" => "companiesLinkObjFormatter" + ], [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/licenses/table.title'), + "formatter" => "licensesLinkFormatter" + ], [ + "field" => "product_key", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/licenses/form.license_key'), + "formatter" => "licensesLinkFormatter" + ], [ + "field" => "expiration_date", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/licenses/form.expiration'), + 'formatter' => 'dateDisplayFormatter' + ], [ + "field" => "license_email", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/licenses/form.to_email') + ], [ + "field" => "license_name", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/licenses/form.to_name'), + ], [ + "field" => "supplier", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.supplier'), + "visible" => false, + "formatter" => "suppliersLinkObjFormatter" + ], [ + "field" => "manufacturer", + "searchable" => true, + "sortable" => true, + "title" => trans('general.manufacturer'), + "formatter" => "manufacturersLinkObjFormatter", + ], [ + "field" => "total_seats", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/accessories/general.total'), + ], [ + "field" => "remaining_qty", + "searchable" => false, + "sortable" => false, + "title" => trans('admin/accessories/general.remaining'), + ], [ + "field" => "purchase_date", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.purchase_date'), + 'formatter' => 'dateDisplayFormatter' + ], [ + "field" => "purchase_cost", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.purchase_cost'), + ], [ + "field" => "purchase_order", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('admin/licenses/form.purchase_order'), + ], [ + "field" => "order_number", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.order_number'), + ] + ]; + + $layout[] = [ + "field" => "checkincheckout", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => 'Checkin/Checkout', + "visible" => true, + "formatter" => "licensesInOutFormatter", + ]; + + $layout[] = [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "formatter" => "licensesActionsFormatter", + ]; + + + return json_encode($layout); + } + + + /** + * Link to this licenses Name + * @return string + */ + public function nameUrl() + { + return (string)link_to_route('licenses.show', $this->name, $this->id); + } + + /** + * Link to this licenses serial + * @return string + */ + public function serialUrl() + { + return (string) link_to('/licenses/'.$this->id, mb_strimwidth($this->serial, 0, 50, "...")); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('licenses.show', $this->id); + } +} diff --git a/app/Presenters/LocationPresenter.php b/app/Presenters/LocationPresenter.php new file mode 100644 index 0000000000..8325382fc4 --- /dev/null +++ b/app/Presenters/LocationPresenter.php @@ -0,0 +1,49 @@ +name, $this->id); + } + + /** + * Getter for Polymorphism. + * @return mixed + */ + public function name() + { + return $this->model->name; + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('locations.show', $this->id); + } + + public function glyph() + { + return ''; + } + + public function fullName() { + return $this->name; + } +} diff --git a/app/Presenters/ManufacturerPresenter.php b/app/Presenters/ManufacturerPresenter.php new file mode 100644 index 0000000000..60c94d005a --- /dev/null +++ b/app/Presenters/ManufacturerPresenter.php @@ -0,0 +1,156 @@ + "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], + [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/manufacturers/table.name'), + "visible" => true, + "formatter" => "manufacturersLinkFormatter" + ], + [ + "field" => "url", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/manufacturers/table.url'), + "visible" => true, + "formatter" => "linkFormatter" + ], + + [ + "field" => "support_url", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/manufacturers/table.support_url'), + "visible" => true, + "formatter" => "linkFormatter" + ], + + [ + "field" => "support_phone", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/manufacturers/table.support_phone'), + "visible" => true + ], + + [ + "field" => "support_email", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/manufacturers/table.support_email'), + "visible" => true, + "formatter" => "emailFormatter" + ], + + [ + "field" => "assets_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "licenses_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "consumables_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "accessories_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "created_at", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.created_at'), + "visible" => false, + 'formatter' => 'dateDisplayFormatter' + ], + + [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "visible" => true, + "formatter" => "manufacturersActionsFormatter", + ] + ]; + + return json_encode($layout); + } + + + + /** + * Link to this manufacturers name + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('manufacturers.show', $this->name, $this->id); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('manufacturers.show', $this->id); + } +} diff --git a/app/Presenters/Presentable.php b/app/Presenters/Presentable.php new file mode 100644 index 0000000000..19e9526599 --- /dev/null +++ b/app/Presenters/Presentable.php @@ -0,0 +1,24 @@ +presenter || !class_exists($this->presenter)) { + throw new \Exception('Presenter class does not exist'); + } + + if (!isset($this->presenterInterface)) { + $this->presenterInterface = new $this->presenter($this); + } + + return $this->presenterInterface; + + } +} diff --git a/app/Presenters/Presenter.php b/app/Presenters/Presenter.php new file mode 100644 index 0000000000..c47c2547d9 --- /dev/null +++ b/app/Presenters/Presenter.php @@ -0,0 +1,86 @@ +model = $model; + } + + // Convenience functions for datatables stuff + public function categoryUrl() + { + $model = $this->model; + // Category of Asset belongs to model. + if ($model->model) { + $model = $this->model->model; + } + + if ($model->category) { + return $model->category->present()->nameUrl(); + } + return ''; + } + + public function locationUrl() + { + if ($this->model->location) { + return $this->model->location->present()->nameUrl(); + } + return ''; + } + + public function companyUrl() + { + if ($this->model->company) { + return $this->model->company->present()->nameUrl(); + } + return ''; + } + public function manufacturerUrl() + { + $model = $this->model; + // Category of Asset belongs to model. + if ($model->model) { + $model = $this->model->model; + } + + if ($model->manufacturer) { + return $model->manufacturer->present()->nameUrl(); + } + return ''; + } + + public function name() + { + return $this->model->name; + } + + public function __get($property) + { + if (method_exists($this, $property)) { + return $this->{$property}(); + } + + return e($this->model->{$property}); + } + + public function __call($method, $args) + { + return $this->model->$method($args); + } +} diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php new file mode 100644 index 0000000000..9460ea23d6 --- /dev/null +++ b/app/Presenters/UserPresenter.php @@ -0,0 +1,299 @@ + "checkbox", + "checkbox" => true + ], + [ + "field" => "id", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.id'), + "visible" => false + ], + [ + "field" => "company", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/companies/table.title'), + "visible" => false, + "formatter" => "companiesLinkObjFormatter" + ], + [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/users/table.name'), + "visible" => true, + "formatter" => "usersLinkFormatter" + ], + [ + "field" => "jobtitle", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/users/table.title'), + "visible" => true, + "formatter" => "usersLinkFormatter" + ], + [ + "field" => "email", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/users/table.email'), + "visible" => true, + "formatter" => "emailFormatter" + ], + [ + "field" => "username", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/users/table.username'), + "visible" => true, + "formatter" => "usersLinkFormatter" + ], + [ + "field" => "employee_num", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/users/table.employee_num'), + "visible" => false + ], + [ + "field" => "department", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.department'), + "visible" => true, + "formatter" => "departmentsLinkObjFormatter" + ], + [ + "field" => "location", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('admin/users/table.location'), + "visible" => true, + "formatter" => "locationsLinkObjFormatter" + ], + [ + "field" => "manager", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/users/table.manager'), + "visible" => true, + "formatter" => "usersLinkObjFormatter" + ], + [ + "field" => "assets_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "licenses_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "consumables_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "accessories_count", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => ' ' + .'', + "visible" => true, + ], + [ + "field" => "notes", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.notes'), + "visible" => true, + ], + [ + "field" => "groups", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => trans('general.groups'), + "visible" => true, + 'formatter' => 'groupsFormatter' + ], + [ + "field" => "two_factor_enrolled", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => trans('admin/users/general.two_factor_enrolled'), + "visible" => false, + 'formatter' => 'trueFalseFormatter' + ], + [ + "field" => "two_factor_active", + "searchable" => false, + "sortable" => false, + "switchable" => true, + "title" => trans('admin/users/general.two_factor_active'), + "visible" => false, + 'formatter' => 'trueFalseFormatter' + ], + [ + "field" => "activated", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.activated'), + "visible" => true, + 'formatter' => 'trueFalseFormatter' + ], + [ + "field" => "created_at", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.created_at'), + "visible" => false, + 'formatter' => 'dateDisplayFormatter' + ], + [ + "field" => "last_login", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.last_login'), + "visible" => false, + 'formatter' => 'dateDisplayFormatter' + ], + [ + "field" => "actions", + "searchable" => false, + "sortable" => false, + "switchable" => false, + "title" => trans('table.actions'), + "visible" => true, + "formatter" => "usersActionsFormatter", + ] + ]; + + return json_encode($layout); + } + + + public function emailLink() + { + if ($this->email) { + return ''.$this->email.'' + .''; + } + return ''; + } + /** + * Returns the user full name, it simply concatenates + * the user first and last name. + * + * @return string + */ + public function fullName() + { + return "{$this->first_name} {$this->last_name}"; + } + + /** + * Standard accessor. + * @TODO Remove presenter::fullName() entirely? + * @return string + */ + public function name() + { + return $this->fullName(); + } + /** + * Returns the user Gravatar image url. + * + * @return string + */ + public function gravatar() + { + + if ($this->avatar) { + return config('app.url').'/uploads/avatars/'.$this->avatar; + } + + if ((Setting::getSettings()->load_remote=='1') && ($this->email!='')) { + $gravatar = md5(strtolower(trim($this->email))); + return "//gravatar.com/avatar/".$gravatar; + } + + return false; + + } + + /** + * Formatted url for use in tables. + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('users.show', $this->fullName(), $this->id); + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('users.show', $this->id); + } + + public function glyph() + { + return ''; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 4fc1d62477..21f08ffcae 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -5,6 +5,17 @@ use Validator; use Illuminate\Support\ServiceProvider; use DB; use Log; +use Illuminate\Support\Facades\Schema; +use App\Observers\AssetObserver; +use App\Observers\LicenseObserver; +use App\Observers\AccessoryObserver; +use App\Observers\ConsumableObserver; +use App\Observers\ComponentObserver; +use App\Models\Asset; +use App\Models\License; +use App\Models\Accessory; +use App\Models\Consumable; +use App\Models\Component; /** @@ -25,14 +36,19 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - + Schema::defaultStringLength(191); + Asset::observe(AssetObserver::class); + Accessory::observe(AccessoryObserver::class); + Component::observe(ComponentObserver::class); + Consumable::observe(ConsumableObserver::class); + License::observe(LicenseObserver::class); + // Email array validator - Validator::extend('email_array', function($attribute, $value, $parameters, $validator) { - $value = str_replace(' ','',$value); + Validator::extend('email_array', function ($attribute, $value, $parameters, $validator) { + $value = str_replace(' ', '', $value); $array = explode(',', $value); - foreach($array as $email) //loop over values - { + foreach ($array as $email) { //loop over values $email_to_validate['alert_email'][]=$email; } @@ -41,35 +57,33 @@ class AppServiceProvider extends ServiceProvider 'alert_email.*'=>trans('validation.email_array') ); - $validator = Validator::make($email_to_validate,$rules,$messages); + $validator = Validator::make($email_to_validate, $rules, $messages); - if ($validator->passes()) { - return true; - } else { - return false; - } + return $validator->passes(); }); // Unique only if undeleted // This works around the use case where multiple deleted items have the same unique attribute. // (I think this is a bug in Laravel's validator?) - Validator::extend('unique_undeleted', function($attribute, $value, $parameters, $validator) { + Validator::extend('unique_undeleted', function ($attribute, $value, $parameters, $validator) { - $count = DB::table($parameters[0])->select('id')->where($attribute,'=',$value)->whereNull('deleted_at')->where('id','!=',$parameters[1])->count(); - - if ($count < 1) { - return true; - } else { - return false; + if (count($parameters)) { + $count = DB::table($parameters[0])->select('id')->where($attribute, '=', $value)->whereNull('deleted_at')->where('id', '!=', $parameters[1])->count(); + return $count < 1; } }); - // Share common variables with all views. + // Share common setting variables with all views. view()->composer('*', function ($view) { $view->with('snipeSettings', \App\Models\Setting::getSettings()); }); + + // Set the monetary locale to the configured locale to make helper::parseFloat work. + setlocale(LC_MONETARY, config('app.locale')); + setlocale(LC_NUMERIC, config('app.locale')); + } /** @@ -91,7 +105,7 @@ class AppServiceProvider extends ServiceProvider } } - foreach($monolog->getHandlers() as $handler) { + foreach ($monolog->getHandlers() as $handler) { $handler->setLevel($log_level); } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index c4945442dc..de9f618be2 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,8 +2,22 @@ namespace App\Providers; -use Illuminate\Contracts\Auth\Access\Gate as GateContract; +use App\Models\Accessory; +use Carbon\Carbon; +use App\Models\Asset; +use App\Models\Component; +use App\Models\Consumable; +use App\Models\License; +use App\Models\User; +use App\Policies\AccessoryPolicy; +use App\Policies\AssetPolicy; +use App\Policies\ComponentPolicy; +use App\Policies\ConsumablePolicy; +use App\Policies\LicensePolicy; +use App\Policies\UserPolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; +use Illuminate\Support\Facades\Gate; +use Laravel\Passport\Passport; class AuthServiceProvider extends ServiceProvider { @@ -13,25 +27,41 @@ class AuthServiceProvider extends ServiceProvider * @var array */ protected $policies = [ + Asset::class => AssetPolicy::class, + Accessory::class => AccessoryPolicy::class, + Component::class => ComponentPolicy::class, + Consumable::class => ConsumablePolicy::class, + License::class => LicensePolicy::class, + User::class => UserPolicy::class, ]; /** - * Register any application authentication / authorization services. + * Register any authentication / authorization services. * - * @param \Illuminate\Contracts\Auth\Access\Gate $gate * @return void */ - public function boot(GateContract $gate) + public function boot() { - $this->registerPolicies($gate); + + $this->commands([ + \Laravel\Passport\Console\InstallCommand::class, + \Laravel\Passport\Console\ClientCommand::class, + \Laravel\Passport\Console\KeysCommand::class, + ]); + + + $this->registerPolicies(); + Passport::routes(); + Passport::tokensExpireIn(Carbon::now()->addYears(20)); + Passport::refreshTokensExpireIn(Carbon::now()->addYears(20)); // -------------------------------- // BEFORE ANYTHING ELSE // -------------------------------- - // If this condition is true, ANYTHING else below will be asssumed + // If this condition is true, ANYTHING else below will be assumed // to be true. This can cause weird blade behavior. - $gate->before(function ($user) { + Gate::before(function ($user) { if ($user->isSuperUser()) { return true; } @@ -41,7 +71,7 @@ class AuthServiceProvider extends ServiceProvider // GENERAL GATES // These control general sections of the admin // -------------------------------- - $gate->define('admin', function ($user) { + Gate::define('admin', function ($user) { if ($user->hasAccess('admin')) { return true; } @@ -51,292 +81,19 @@ class AuthServiceProvider extends ServiceProvider # ----------------------------------------- # Reports # ----------------------------------------- - $gate->define('reports.view', function ($user) { + Gate::define('reports.view', function ($user) { if ($user->hasAccess('reports.view')) { return true; } }); - - # ----------------------------------------- - # Assets - # ----------------------------------------- - $gate->define('assets.view', function ($user) { - if (($user->hasAccess('assets.view')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('assets.view.requestable', function ($user) { - if (($user->hasAccess('assets.view.requestable')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('assets.create', function ($user) { - if (($user->hasAccess('assets.create')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('assets.checkout', function ($user) { - if (($user->hasAccess('assets.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('assets.checkin', function ($user) { - if (($user->hasAccess('assets.checkin')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('assets.edit', function ($user) { - if (($user->hasAccess('assets.edit')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - // Checks for some level of management - $gate->define('assets.manage', function ($user) { - if (($user->hasAccess('assets.checkin')) || ($user->hasAccess('assets.edit')) || ($user->hasAccess('assets.delete')) || ($user->hasAccess('assets.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - - # ----------------------------------------- - # Accessories - # ----------------------------------------- - $gate->define('accessories.view', function ($user) { - if (($user->hasAccess('accessories.view')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('accessories.create', function ($user) { - if (($user->hasAccess('accessories.create')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('accessories.edit', function ($user) { - if (($user->hasAccess('accessories.edit')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('accessories.delete', function ($user) { - if (($user->hasAccess('accessories.delete')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('accessories.checkout', function ($user) { - if (($user->hasAccess('accessories.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('accessories.checkin', function ($user) { - if (($user->hasAccess('accessories.checkin')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - // Checks for some level of management - $gate->define('accessories.manage', function ($user) { - if (($user->hasAccess('accessories.checkin')) || ($user->hasAccess('accessories.edit')) || ($user->hasAccess('accessories.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - # ----------------------------------------- - # Consumables - # ----------------------------------------- - $gate->define('consumables.view', function ($user) { - if (($user->hasAccess('consumables.view')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('consumables.create', function ($user) { - if (($user->hasAccess('consumables.create')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('consumables.edit', function ($user) { - if (($user->hasAccess('consumables.edit')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('consumables.delete', function ($user) { - if (($user->hasAccess('consumables.delete')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('consumables.checkout', function ($user) { - if (($user->hasAccess('consumables.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('consumables.checkin', function ($user) { - if (($user->hasAccess('consumables.checkin')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - // Checks for some level of management - $gate->define('consumables.manage', function ($user) { - if (($user->hasAccess('consumables.checkin')) || ($user->hasAccess('consumables.edit')) || ($user->hasAccess('consumables.delete')) || ($user->hasAccess('consumables.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - - - # ----------------------------------------- - # Users - # ----------------------------------------- - - $gate->define('users.view', function ($user) { - if (($user->hasAccess('users.view')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('users.create', function ($user) { - if (($user->hasAccess('users.create')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('users.edit', function ($user) { - if (($user->hasAccess('users.edit')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('users.delete', function ($user) { - if (($user->hasAccess('users.delete')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - - # ----------------------------------------- - # Components - # ----------------------------------------- - $gate->define('components.view', function ($user) { - if (($user->hasAccess('components.view')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('components.create', function ($user) { - if (($user->hasAccess('components.create')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('components.edit', function ($user) { - if (($user->hasAccess('components.edit')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('components.delete', function ($user) { - if (($user->hasAccess('components.delete')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('components.checkout', function ($user) { - if (($user->hasAccess('components.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('components.checkout', function ($user) { - if (($user->hasAccess('components.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - // Checks for some level of management - $gate->define('components.manage', function ($user) { - if (($user->hasAccess('components.edit')) || ($user->hasAccess('components.delete')) || ($user->hasAccess('components.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - - # ----------------------------------------- - # Licenses - # ----------------------------------------- - $gate->define('licenses.view', function ($user) { - if (($user->hasAccess('licenses.view')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('licenses.create', function ($user) { - if (($user->hasAccess('licenses.create')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('licenses.edit', function ($user) { - if (($user->hasAccess('licenses.edit')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('licenses.delete', function ($user) { - if (($user->hasAccess('licenses.delete')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('licenses.checkout', function ($user) { - if (($user->hasAccess('licenses.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('licenses.checkin', function ($user) { - if (($user->hasAccess('licenses.checkin')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - $gate->define('licenses.keys', function ($user) { - if (($user->hasAccess('licenses.keys')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - // Checks for some level of management - $gate->define('licenses.manage', function ($user) { - if (($user->hasAccess('licenses.checkin')) || ($user->hasAccess('licenses.edit')) || ($user->hasAccess('licenses.delete')) || ($user->hasAccess('licenses.checkout')) || ($user->hasAccess('admin'))) { - return true; - } - }); - - # ----------------------------------------- # Self # ----------------------------------------- - $gate->define('self.two_factor', function ($user) { + Gate::define('self.two_factor', function ($user) { if (($user->hasAccess('self.two_factor')) || ($user->hasAccess('admin'))) { return true; } }); - - } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 58ce962498..a182657e65 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,7 +2,7 @@ namespace App\Providers; -use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; +use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider @@ -19,14 +19,13 @@ class EventServiceProvider extends ServiceProvider ]; /** - * Register any other events for your application. + * Register any events for your application. * - * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ - public function boot(DispatcherContract $events) + public function boot() { - parent::boot($events); + parent::boot(); // } diff --git a/app/Providers/MacroServiceProvider.php b/app/Providers/MacroServiceProvider.php index 2b14800f0a..e77619d852 100644 --- a/app/Providers/MacroServiceProvider.php +++ b/app/Providers/MacroServiceProvider.php @@ -2,7 +2,8 @@ use Illuminate\Support\ServiceProvider; -class MacroServiceProvider extends ServiceProvider { +class MacroServiceProvider extends ServiceProvider +{ /** * Bootstrap the application services. @@ -12,9 +13,9 @@ class MacroServiceProvider extends ServiceProvider { public function boot() { // require base_path() . '/resources/macros/community_types.php'; - foreach(glob(base_path('resources/macros/*.php')) as $filename) { - require_once($filename); - } + foreach (glob(base_path('resources/macros/*.php')) as $filename) { + require_once($filename); + } } @@ -27,5 +28,4 @@ class MacroServiceProvider extends ServiceProvider { { // } - } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index d50b1c0f8d..94f5ca0bf3 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -2,13 +2,13 @@ namespace App\Providers; -use Illuminate\Routing\Router; +use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class RouteServiceProvider extends ServiceProvider { /** - * This namespace is applied to the controller routes in your routes file. + * This namespace is applied to your controller routes. * * In addition, it is set as the URL generator's root namespace. * @@ -19,26 +19,69 @@ class RouteServiceProvider extends ServiceProvider /** * Define your route model bindings, pattern filters, etc. * - * @param \Illuminate\Routing\Router $router * @return void */ - public function boot(Router $router) + public function boot() { // - parent::boot($router); + parent::boot(); } /** * Define the routes for the application. * - * @param \Illuminate\Routing\Router $router * @return void */ - public function map(Router $router) + public function map() { - $router->group(['namespace' => $this->namespace], function ($router) { - require app_path('Http/routes.php'); + $this->mapApiRoutes(); + + $this->mapWebRoutes(); + + // + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::group([ + 'middleware' => 'web', + 'namespace' => $this->namespace, + ], function ($router) { + require base_path('routes/web/hardware.php'); + require base_path('routes/web/models.php'); + require base_path('routes/web/accessories.php'); + require base_path('routes/web/licenses.php'); + require base_path('routes/web/consumables.php'); + require base_path('routes/web/fields.php'); + require base_path('routes/web/components.php'); + require base_path('routes/web/users.php'); + require base_path('routes/web.php'); + }); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::group([ + 'middleware' => 'auth:api', + 'namespace' => $this->namespace, + 'prefix' => 'api', + ], function ($router) { + require base_path('routes/api.php'); }); } } diff --git a/bower.json b/bower.json new file mode 100644 index 0000000000..08dbac10f8 --- /dev/null +++ b/bower.json @@ -0,0 +1,34 @@ +{ + "name": "bower.json", + "description": "Bower file for Snipe-IT", + "main": "", + "authors": [ + "snipe " + ], + "license": "MIT", + "homepage": "https://github.com/snipe/snipe-it", + "private": true, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "bootstrap-sass": "bootstrap-sass-official#^3.3.7", + "jquery-ui": "^1.12.1", + "jquery-slimscroll": "slimscroll#^1.3.8", + "bootstrap-less": "^3.3.4", + "select2": "^4.0.3", + "bootstrap-colorpicker": "^2.4.0", + "bootstrap-table": "^1.11.0", + "bootstrap-datepicker": "^1.6.4", + "iCheck": "jquery-icheck#^1.0.2", + "ekko-lightbox": "^5.0.0", + "jquery.iframe-transport": "^1.0.1", + "fastclick": "^1.0.6", + "blueimp-file-upload": "fileupload#^9.14.2", + "font-awesome": "fontawesome#^4.7.0" + } +} diff --git a/bower_components/blueimp-canvas-to-blob/.bower.json b/bower_components/blueimp-canvas-to-blob/.bower.json new file mode 100644 index 0000000000..d73c7db161 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/.bower.json @@ -0,0 +1,14 @@ +{ + "name": "blueimp-canvas-to-blob", + "homepage": "https://github.com/blueimp/JavaScript-Canvas-to-Blob", + "version": "3.6.0", + "_release": "3.6.0", + "_resolution": { + "type": "version", + "tag": "v3.6.0", + "commit": "4835e7a42d0e0e687d8bffca934bb0648bfae61b" + }, + "_source": "https://github.com/blueimp/JavaScript-Canvas-to-Blob.git", + "_target": ">=2.1.1", + "_originalSource": "blueimp-canvas-to-blob" +} \ No newline at end of file diff --git a/bower_components/blueimp-canvas-to-blob/.gitignore b/bower_components/blueimp-canvas-to-blob/.gitignore new file mode 100644 index 0000000000..9daa8247da --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +node_modules diff --git a/bower_components/blueimp-canvas-to-blob/.npmignore b/bower_components/blueimp-canvas-to-blob/.npmignore new file mode 100644 index 0000000000..a508bcb5d2 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/.npmignore @@ -0,0 +1,3 @@ +* +!js/*.js +!js/*.js.map diff --git a/bower_components/blueimp-canvas-to-blob/.travis.yml b/bower_components/blueimp-canvas-to-blob/.travis.yml new file mode 100644 index 0000000000..7a56d2a537 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "stable" diff --git a/bower_components/blueimp-canvas-to-blob/README.md b/bower_components/blueimp-canvas-to-blob/README.md new file mode 100644 index 0000000000..b6af2c2c2c --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/README.md @@ -0,0 +1,84 @@ +# JavaScript Canvas to Blob + +## Description +Canvas to Blob is a polyfill for the standard JavaScript +[canvas.toBlob](http://www.w3.org/TR/html5/scripting-1.html#dom-canvas-toblob) +method. + +It can be used to create +[Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) +objects from an HTML +[canvas](https://developer.mozilla.org/en-US/docs/HTML/Canvas) element. + +## Usage +Include the (minified) JavaScript Canvas to Blob script in your HTML markup: + +```html + +``` + +Then use the *canvas.toBlob()* method in the same way as the native +implementation: + +```js +var canvas = document.createElement('canvas'); +/* ... your canvas manipulations ... */ +if (canvas.toBlob) { + canvas.toBlob( + function (blob) { + // Do something with the blob object, + // e.g. creating a multipart form for file uploads: + var formData = new FormData(); + formData.append('file', blob, fileName); + /* ... */ + }, + 'image/jpeg' + ); +} +``` + +## Requirements +The JavaScript Canvas to Blob function has zero dependencies. + +However, Canvas to Blob is a very suitable complement to the +[JavaScript Load Image](https://github.com/blueimp/JavaScript-Load-Image) +function. + +## API +In addition to the **canvas.toBlob** polyfill, the JavaScript Canvas to Blob +script provides one additional function called **dataURLtoBlob**, which is added +to the global window object, unless the library is loaded via a module loader +like RequireJS, Browserify or webpack: + +```js +// 80x60px GIF image (color black, base64 data): +var b64Data = 'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' + + 'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' + + 'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7', + imageUrl = 'data:image/gif;base64,' + b64Data, + blob = window.dataURLtoBlob && window.dataURLtoBlob(imageUrl); +``` + +## Browsers +The following browsers support either the native or the polyfill +*canvas.toBlob()* method: + +### Desktop browsers + +* Google Chrome (see [Chromium issue #67587](https://code.google.com/p/chromium/issues/detail?id=67587)) +* Apple Safari 6.0+ (see [Mozilla issue #648610](https://bugzilla.mozilla.org/show_bug.cgi?id=648610)) +* Mozilla Firefox 4.0+ +* Microsoft Internet Explorer 10.0+ + +### Mobile browsers + +* Apple Safari Mobile on iOS 6.0+ +* Google Chrome on iOS 6.0+ +* Google Chrome on Android 4.0+ + +## Test +[JavaScript Canvas to Blob Test](https://blueimp.github.io/JavaScript-Canvas-to-Blob/test/) + +## License +The JavaScript Canvas to Blob script is released under the +[MIT license](http://www.opensource.org/licenses/MIT). diff --git a/bower_components/blueimp-canvas-to-blob/js/canvas-to-blob.js b/bower_components/blueimp-canvas-to-blob/js/canvas-to-blob.js new file mode 100644 index 0000000000..32913667b1 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/js/canvas-to-blob.js @@ -0,0 +1,111 @@ +/* + * JavaScript Canvas to Blob + * https://github.com/blueimp/JavaScript-Canvas-to-Blob + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + * + * Based on stackoverflow user Stoive's code snippet: + * http://stackoverflow.com/q/4998908 + */ + +/* global atob, Blob, define */ + +;(function (window) { + 'use strict' + + var CanvasPrototype = window.HTMLCanvasElement && + window.HTMLCanvasElement.prototype + var hasBlobConstructor = window.Blob && (function () { + try { + return Boolean(new Blob()) + } catch (e) { + return false + } + }()) + var hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && + (function () { + try { + return new Blob([new Uint8Array(100)]).size === 100 + } catch (e) { + return false + } + }()) + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || + window.MozBlobBuilder || window.MSBlobBuilder + var dataURIPattern = /^data:((.*?)(;charset=.*?)?)(;base64)?,/ + var dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob && + window.ArrayBuffer && window.Uint8Array && + function (dataURI) { + var matches, + mediaType, + isBase64, + dataString, + byteString, + arrayBuffer, + intArray, + i, + bb + // Parse the dataURI components as per RFC 2397 + matches = dataURI.match(dataURIPattern) + if (!matches) { + throw new Error('invalid data URI') + } + // Default to text/plain;charset=US-ASCII + mediaType = matches[2] + ? matches[1] + : 'text/plain' + (matches[3] || ';charset=US-ASCII') + isBase64 = !!matches[4] + dataString = dataURI.slice(matches[0].length) + if (isBase64) { + // Convert base64 to raw binary data held in a string: + byteString = atob(dataString) + } else { + // Convert base64/URLEncoded data component to raw binary: + byteString = decodeURIComponent(dataString) + } + // Write the bytes of the string to an ArrayBuffer: + arrayBuffer = new ArrayBuffer(byteString.length) + intArray = new Uint8Array(arrayBuffer) + for (i = 0; i < byteString.length; i += 1) { + intArray[i] = byteString.charCodeAt(i) + } + // Write the ArrayBuffer (or ArrayBufferView) to a blob: + if (hasBlobConstructor) { + return new Blob( + [hasArrayBufferViewSupport ? intArray : arrayBuffer], + {type: mediaType} + ) + } + bb = new BlobBuilder() + bb.append(arrayBuffer) + return bb.getBlob(mediaType) + } + if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) { + if (CanvasPrototype.mozGetAsFile) { + CanvasPrototype.toBlob = function (callback, type, quality) { + if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) { + callback(dataURLtoBlob(this.toDataURL(type, quality))) + } else { + callback(this.mozGetAsFile('blob', type)) + } + } + } else if (CanvasPrototype.toDataURL && dataURLtoBlob) { + CanvasPrototype.toBlob = function (callback, type, quality) { + callback(dataURLtoBlob(this.toDataURL(type, quality))) + } + } + } + if (typeof define === 'function' && define.amd) { + define(function () { + return dataURLtoBlob + }) + } else if (typeof module === 'object' && module.exports) { + module.exports = dataURLtoBlob + } else { + window.dataURLtoBlob = dataURLtoBlob + } +}(window)) diff --git a/bower_components/blueimp-canvas-to-blob/js/canvas-to-blob.min.js b/bower_components/blueimp-canvas-to-blob/js/canvas-to-blob.min.js new file mode 100644 index 0000000000..1c82bba850 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/js/canvas-to-blob.min.js @@ -0,0 +1,2 @@ +!function(t){"use strict";var e=t.HTMLCanvasElement&&t.HTMLCanvasElement.prototype,o=t.Blob&&function(){try{return Boolean(new Blob)}catch(t){return!1}}(),n=o&&t.Uint8Array&&function(){try{return 100===new Blob([new Uint8Array(100)]).size}catch(t){return!1}}(),r=t.BlobBuilder||t.WebKitBlobBuilder||t.MozBlobBuilder||t.MSBlobBuilder,a=/^data:((.*?)(;charset=.*?)?)(;base64)?,/,i=(o||r)&&t.atob&&t.ArrayBuffer&&t.Uint8Array&&function(t){var e,i,l,u,b,c,d,B,f;if(e=t.match(a),!e)throw new Error("invalid data URI");for(i=e[2]?e[1]:"text/plain"+(e[3]||";charset=US-ASCII"),l=!!e[4],u=t.slice(e[0].length),b=l?atob(u):decodeURIComponent(u),c=new ArrayBuffer(b.length),d=new Uint8Array(c),B=0;B + + + + + +JavaScript Canvas to Blob Test + + + + +
    + + + + + + + + + diff --git a/bower_components/blueimp-canvas-to-blob/test/test.js b/bower_components/blueimp-canvas-to-blob/test/test.js new file mode 100644 index 0000000000..9a81db0e8d --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/test/test.js @@ -0,0 +1,92 @@ +/* + * JavaScript Canvas to Blob Test + * https://github.com/blueimp/JavaScript-Canvas-to-Blob + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global describe, it, Blob */ + +;(function (expect) { + 'use strict' + + // 80x60px GIF image (color black, base64 data): + var b64Data = 'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' + + 'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' + + 'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7' + var imageUrl = 'data:image/gif;base64,' + b64Data + var blob = window.dataURLtoBlob && window.dataURLtoBlob(imageUrl) + + describe('canvas.toBlob', function () { + it('Converts a canvas element to a blob and passes it to the callback function', function (done) { + window.loadImage(blob, function (canvas) { + canvas.toBlob( + function (newBlob) { + expect(newBlob).to.be.a.instanceOf(Blob) + done() + } + ) + }, {canvas: true}) + }) + + it('Converts a canvas element to a PNG blob', function (done) { + window.loadImage(blob, function (canvas) { + canvas.toBlob( + function (newBlob) { + expect(newBlob.type).to.equal('image/png') + done() + }, + 'image/png' + ) + }, {canvas: true}) + }) + + it('Converts a canvas element to a JPG blob', function (done) { + window.loadImage(blob, function (canvas) { + canvas.toBlob( + function (newBlob) { + expect(newBlob.type).to.equal('image/jpeg') + done() + }, + 'image/jpeg' + ) + }, {canvas: true}) + }) + + it('Keeps the aspect ratio of the canvas image', function (done) { + window.loadImage(blob, function (canvas) { + canvas.toBlob( + function (newBlob) { + window.loadImage(newBlob, function (img) { + expect(img.width).to.equal(canvas.width) + expect(img.height).to.equal(canvas.height) + done() + }) + } + ) + }, {canvas: true}) + }) + + it('Keeps the image data of the canvas image', function (done) { + window.loadImage(blob, function (canvas) { + canvas.toBlob( + function (newBlob) { + window.loadImage(newBlob, function (newCanvas) { + var canvasData = canvas.getContext('2d') + .getImageData(0, 0, canvas.width, canvas.height) + var newCanvasData = newCanvas.getContext('2d') + .getImageData(0, 0, newCanvas.width, newCanvas.height) + expect(canvasData.width).to.equal(newCanvasData.width) + expect(canvasData.height).to.equal(newCanvasData.height) + done() + }, {canvas: true}) + } + ) + }, {canvas: true}) + }) + }) +}(this.chai.expect)) diff --git a/bower_components/blueimp-canvas-to-blob/test/vendor/chai.js b/bower_components/blueimp-canvas-to-blob/test/vendor/chai.js new file mode 100644 index 0000000000..bbe4c4a290 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/test/vendor/chai.js @@ -0,0 +1,6142 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.chai = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + * MIT Licensed + */ + +var used = [] + , exports = module.exports = {}; + +/*! + * Chai version + */ + +exports.version = '3.5.0'; + +/*! + * Assertion Error + */ + +exports.AssertionError = require('assertion-error'); + +/*! + * Utils for plugins (not exported) + */ + +var util = require('./chai/utils'); + +/** + * # .use(function) + * + * Provides a way to extend the internals of Chai + * + * @param {Function} + * @returns {this} for chaining + * @api public + */ + +exports.use = function (fn) { + if (!~used.indexOf(fn)) { + fn(this, util); + used.push(fn); + } + + return this; +}; + +/*! + * Utility Functions + */ + +exports.util = util; + +/*! + * Configuration + */ + +var config = require('./chai/config'); +exports.config = config; + +/*! + * Primary `Assertion` prototype + */ + +var assertion = require('./chai/assertion'); +exports.use(assertion); + +/*! + * Core Assertions + */ + +var core = require('./chai/core/assertions'); +exports.use(core); + +/*! + * Expect interface + */ + +var expect = require('./chai/interface/expect'); +exports.use(expect); + +/*! + * Should interface + */ + +var should = require('./chai/interface/should'); +exports.use(should); + +/*! + * Assert interface + */ + +var assert = require('./chai/interface/assert'); +exports.use(assert); + +},{"./chai/assertion":3,"./chai/config":4,"./chai/core/assertions":5,"./chai/interface/assert":6,"./chai/interface/expect":7,"./chai/interface/should":8,"./chai/utils":22,"assertion-error":30}],3:[function(require,module,exports){ +/*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +var config = require('./config'); + +module.exports = function (_chai, util) { + /*! + * Module dependencies. + */ + + var AssertionError = _chai.AssertionError + , flag = util.flag; + + /*! + * Module export. + */ + + _chai.Assertion = Assertion; + + /*! + * Assertion Constructor + * + * Creates object for chaining. + * + * @api private + */ + + function Assertion (obj, msg, stack) { + flag(this, 'ssfi', stack || arguments.callee); + flag(this, 'object', obj); + flag(this, 'message', msg); + } + + Object.defineProperty(Assertion, 'includeStack', { + get: function() { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + return config.includeStack; + }, + set: function(value) { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + config.includeStack = value; + } + }); + + Object.defineProperty(Assertion, 'showDiff', { + get: function() { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + return config.showDiff; + }, + set: function(value) { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + config.showDiff = value; + } + }); + + Assertion.addProperty = function (name, fn) { + util.addProperty(this.prototype, name, fn); + }; + + Assertion.addMethod = function (name, fn) { + util.addMethod(this.prototype, name, fn); + }; + + Assertion.addChainableMethod = function (name, fn, chainingBehavior) { + util.addChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + Assertion.overwriteProperty = function (name, fn) { + util.overwriteProperty(this.prototype, name, fn); + }; + + Assertion.overwriteMethod = function (name, fn) { + util.overwriteMethod(this.prototype, name, fn); + }; + + Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { + util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + /** + * ### .assert(expression, message, negateMessage, expected, actual, showDiff) + * + * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. + * + * @name assert + * @param {Philosophical} expression to be tested + * @param {String|Function} message or function that returns message to display if expression fails + * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails + * @param {Mixed} expected value (remember to check for negation) + * @param {Mixed} actual (optional) will default to `this.obj` + * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails + * @api private + */ + + Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { + var ok = util.test(this, arguments); + if (true !== showDiff) showDiff = false; + if (true !== config.showDiff) showDiff = false; + + if (!ok) { + var msg = util.getMessage(this, arguments) + , actual = util.getActual(this, arguments); + throw new AssertionError(msg, { + actual: actual + , expected: expected + , showDiff: showDiff + }, (config.includeStack) ? this.assert : flag(this, 'ssfi')); + } + }; + + /*! + * ### ._obj + * + * Quick reference to stored `actual` value for plugin developers. + * + * @api private + */ + + Object.defineProperty(Assertion.prototype, '_obj', + { get: function () { + return flag(this, 'object'); + } + , set: function (val) { + flag(this, 'object', val); + } + }); +}; + +},{"./config":4}],4:[function(require,module,exports){ +module.exports = { + + /** + * ### config.includeStack + * + * User configurable property, influences whether stack trace + * is included in Assertion error message. Default of false + * suppresses stack trace in the error message. + * + * chai.config.includeStack = true; // enable stack on error + * + * @param {Boolean} + * @api public + */ + + includeStack: false, + + /** + * ### config.showDiff + * + * User configurable property, influences whether or not + * the `showDiff` flag should be included in the thrown + * AssertionErrors. `false` will always be `false`; `true` + * will be true when the assertion has requested a diff + * be shown. + * + * @param {Boolean} + * @api public + */ + + showDiff: true, + + /** + * ### config.truncateThreshold + * + * User configurable property, sets length threshold for actual and + * expected values in assertion errors. If this threshold is exceeded, for + * example for large data structures, the value is replaced with something + * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`. + * + * Set it to zero if you want to disable truncating altogether. + * + * This is especially userful when doing assertions on arrays: having this + * set to a reasonable large value makes the failure messages readily + * inspectable. + * + * chai.config.truncateThreshold = 0; // disable truncating + * + * @param {Number} + * @api public + */ + + truncateThreshold: 40 + +}; + +},{}],5:[function(require,module,exports){ +/*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, _) { + var Assertion = chai.Assertion + , toString = Object.prototype.toString + , flag = _.flag; + + /** + * ### Language Chains + * + * The following are provided as chainable getters to + * improve the readability of your assertions. They + * do not provide testing capabilities unless they + * have been overwritten by a plugin. + * + * **Chains** + * + * - to + * - be + * - been + * - is + * - that + * - which + * - and + * - has + * - have + * - with + * - at + * - of + * - same + * + * @name language chains + * @namespace BDD + * @api public + */ + + [ 'to', 'be', 'been' + , 'is', 'and', 'has', 'have' + , 'with', 'that', 'which', 'at' + , 'of', 'same' ].forEach(function (chain) { + Assertion.addProperty(chain, function () { + return this; + }); + }); + + /** + * ### .not + * + * Negates any of assertions following in the chain. + * + * expect(foo).to.not.equal('bar'); + * expect(goodFn).to.not.throw(Error); + * expect({ foo: 'baz' }).to.have.property('foo') + * .and.not.equal('bar'); + * + * @name not + * @namespace BDD + * @api public + */ + + Assertion.addProperty('not', function () { + flag(this, 'negate', true); + }); + + /** + * ### .deep + * + * Sets the `deep` flag, later used by the `equal` and + * `property` assertions. + * + * expect(foo).to.deep.equal({ bar: 'baz' }); + * expect({ foo: { bar: { baz: 'quux' } } }) + * .to.have.deep.property('foo.bar.baz', 'quux'); + * + * `.deep.property` special characters can be escaped + * by adding two slashes before the `.` or `[]`. + * + * var deepCss = { '.link': { '[target]': 42 }}; + * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42); + * + * @name deep + * @namespace BDD + * @api public + */ + + Assertion.addProperty('deep', function () { + flag(this, 'deep', true); + }); + + /** + * ### .any + * + * Sets the `any` flag, (opposite of the `all` flag) + * later used in the `keys` assertion. + * + * expect(foo).to.have.any.keys('bar', 'baz'); + * + * @name any + * @namespace BDD + * @api public + */ + + Assertion.addProperty('any', function () { + flag(this, 'any', true); + flag(this, 'all', false) + }); + + + /** + * ### .all + * + * Sets the `all` flag (opposite of the `any` flag) + * later used by the `keys` assertion. + * + * expect(foo).to.have.all.keys('bar', 'baz'); + * + * @name all + * @namespace BDD + * @api public + */ + + Assertion.addProperty('all', function () { + flag(this, 'all', true); + flag(this, 'any', false); + }); + + /** + * ### .a(type) + * + * The `a` and `an` assertions are aliases that can be + * used either as language chains or to assert a value's + * type. + * + * // typeof + * expect('test').to.be.a('string'); + * expect({ foo: 'bar' }).to.be.an('object'); + * expect(null).to.be.a('null'); + * expect(undefined).to.be.an('undefined'); + * expect(new Error).to.be.an('error'); + * expect(new Promise).to.be.a('promise'); + * expect(new Float32Array()).to.be.a('float32array'); + * expect(Symbol()).to.be.a('symbol'); + * + * // es6 overrides + * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo'); + * + * // language chain + * expect(foo).to.be.an.instanceof(Foo); + * + * @name a + * @alias an + * @param {String} type + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function an (type, msg) { + if (msg) flag(this, 'message', msg); + type = type.toLowerCase(); + var obj = flag(this, 'object') + , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a '; + + this.assert( + type === _.type(obj) + , 'expected #{this} to be ' + article + type + , 'expected #{this} not to be ' + article + type + ); + } + + Assertion.addChainableMethod('an', an); + Assertion.addChainableMethod('a', an); + + /** + * ### .include(value) + * + * The `include` and `contain` assertions can be used as either property + * based language chains or as methods to assert the inclusion of an object + * in an array or a substring in a string. When used as language chains, + * they toggle the `contains` flag for the `keys` assertion. + * + * expect([1,2,3]).to.include(2); + * expect('foobar').to.contain('foo'); + * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo'); + * + * @name include + * @alias contain + * @alias includes + * @alias contains + * @param {Object|String|Number} obj + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function includeChainingBehavior () { + flag(this, 'contains', true); + } + + function include (val, msg) { + _.expectTypes(this, ['array', 'object', 'string']); + + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var expected = false; + + if (_.type(obj) === 'array' && _.type(val) === 'object') { + for (var i in obj) { + if (_.eql(obj[i], val)) { + expected = true; + break; + } + } + } else if (_.type(val) === 'object') { + if (!flag(this, 'negate')) { + for (var k in val) new Assertion(obj).property(k, val[k]); + return; + } + var subset = {}; + for (var k in val) subset[k] = obj[k]; + expected = _.eql(subset, val); + } else { + expected = (obj != undefined) && ~obj.indexOf(val); + } + this.assert( + expected + , 'expected #{this} to include ' + _.inspect(val) + , 'expected #{this} to not include ' + _.inspect(val)); + } + + Assertion.addChainableMethod('include', include, includeChainingBehavior); + Assertion.addChainableMethod('contain', include, includeChainingBehavior); + Assertion.addChainableMethod('contains', include, includeChainingBehavior); + Assertion.addChainableMethod('includes', include, includeChainingBehavior); + + /** + * ### .ok + * + * Asserts that the target is truthy. + * + * expect('everything').to.be.ok; + * expect(1).to.be.ok; + * expect(false).to.not.be.ok; + * expect(undefined).to.not.be.ok; + * expect(null).to.not.be.ok; + * + * @name ok + * @namespace BDD + * @api public + */ + + Assertion.addProperty('ok', function () { + this.assert( + flag(this, 'object') + , 'expected #{this} to be truthy' + , 'expected #{this} to be falsy'); + }); + + /** + * ### .true + * + * Asserts that the target is `true`. + * + * expect(true).to.be.true; + * expect(1).to.not.be.true; + * + * @name true + * @namespace BDD + * @api public + */ + + Assertion.addProperty('true', function () { + this.assert( + true === flag(this, 'object') + , 'expected #{this} to be true' + , 'expected #{this} to be false' + , this.negate ? false : true + ); + }); + + /** + * ### .false + * + * Asserts that the target is `false`. + * + * expect(false).to.be.false; + * expect(0).to.not.be.false; + * + * @name false + * @namespace BDD + * @api public + */ + + Assertion.addProperty('false', function () { + this.assert( + false === flag(this, 'object') + , 'expected #{this} to be false' + , 'expected #{this} to be true' + , this.negate ? true : false + ); + }); + + /** + * ### .null + * + * Asserts that the target is `null`. + * + * expect(null).to.be.null; + * expect(undefined).to.not.be.null; + * + * @name null + * @namespace BDD + * @api public + */ + + Assertion.addProperty('null', function () { + this.assert( + null === flag(this, 'object') + , 'expected #{this} to be null' + , 'expected #{this} not to be null' + ); + }); + + /** + * ### .undefined + * + * Asserts that the target is `undefined`. + * + * expect(undefined).to.be.undefined; + * expect(null).to.not.be.undefined; + * + * @name undefined + * @namespace BDD + * @api public + */ + + Assertion.addProperty('undefined', function () { + this.assert( + undefined === flag(this, 'object') + , 'expected #{this} to be undefined' + , 'expected #{this} not to be undefined' + ); + }); + + /** + * ### .NaN + * Asserts that the target is `NaN`. + * + * expect('foo').to.be.NaN; + * expect(4).not.to.be.NaN; + * + * @name NaN + * @namespace BDD + * @api public + */ + + Assertion.addProperty('NaN', function () { + this.assert( + isNaN(flag(this, 'object')) + , 'expected #{this} to be NaN' + , 'expected #{this} not to be NaN' + ); + }); + + /** + * ### .exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi' + * , bar = null + * , baz; + * + * expect(foo).to.exist; + * expect(bar).to.not.exist; + * expect(baz).to.not.exist; + * + * @name exist + * @namespace BDD + * @api public + */ + + Assertion.addProperty('exist', function () { + this.assert( + null != flag(this, 'object') + , 'expected #{this} to exist' + , 'expected #{this} to not exist' + ); + }); + + + /** + * ### .empty + * + * Asserts that the target's length is `0`. For arrays and strings, it checks + * the `length` property. For objects, it gets the count of + * enumerable keys. + * + * expect([]).to.be.empty; + * expect('').to.be.empty; + * expect({}).to.be.empty; + * + * @name empty + * @namespace BDD + * @api public + */ + + Assertion.addProperty('empty', function () { + var obj = flag(this, 'object') + , expected = obj; + + if (Array.isArray(obj) || 'string' === typeof object) { + expected = obj.length; + } else if (typeof obj === 'object') { + expected = Object.keys(obj).length; + } + + this.assert( + !expected + , 'expected #{this} to be empty' + , 'expected #{this} not to be empty' + ); + }); + + /** + * ### .arguments + * + * Asserts that the target is an arguments object. + * + * function test () { + * expect(arguments).to.be.arguments; + * } + * + * @name arguments + * @alias Arguments + * @namespace BDD + * @api public + */ + + function checkArguments () { + var obj = flag(this, 'object') + , type = Object.prototype.toString.call(obj); + this.assert( + '[object Arguments]' === type + , 'expected #{this} to be arguments but got ' + type + , 'expected #{this} to not be arguments' + ); + } + + Assertion.addProperty('arguments', checkArguments); + Assertion.addProperty('Arguments', checkArguments); + + /** + * ### .equal(value) + * + * Asserts that the target is strictly equal (`===`) to `value`. + * Alternately, if the `deep` flag is set, asserts that + * the target is deeply equal to `value`. + * + * expect('hello').to.equal('hello'); + * expect(42).to.equal(42); + * expect(1).to.not.equal(true); + * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' }); + * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' }); + * + * @name equal + * @alias equals + * @alias eq + * @alias deep.equal + * @param {Mixed} value + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertEqual (val, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'deep')) { + return this.eql(val); + } else { + this.assert( + val === obj + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{exp}' + , val + , this._obj + , true + ); + } + } + + Assertion.addMethod('equal', assertEqual); + Assertion.addMethod('equals', assertEqual); + Assertion.addMethod('eq', assertEqual); + + /** + * ### .eql(value) + * + * Asserts that the target is deeply equal to `value`. + * + * expect({ foo: 'bar' }).to.eql({ foo: 'bar' }); + * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]); + * + * @name eql + * @alias eqls + * @param {Mixed} value + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertEql(obj, msg) { + if (msg) flag(this, 'message', msg); + this.assert( + _.eql(obj, flag(this, 'object')) + , 'expected #{this} to deeply equal #{exp}' + , 'expected #{this} to not deeply equal #{exp}' + , obj + , this._obj + , true + ); + } + + Assertion.addMethod('eql', assertEql); + Assertion.addMethod('eqls', assertEql); + + /** + * ### .above(value) + * + * Asserts that the target is greater than `value`. + * + * expect(10).to.be.above(5); + * + * Can also be used in conjunction with `length` to + * assert a minimum length. The benefit being a + * more informative error message than if the length + * was supplied directly. + * + * expect('foo').to.have.length.above(2); + * expect([ 1, 2, 3 ]).to.have.length.above(2); + * + * @name above + * @alias gt + * @alias greaterThan + * @param {Number} value + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertAbove (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'doLength')) { + new Assertion(obj, msg).to.have.property('length'); + var len = obj.length; + this.assert( + len > n + , 'expected #{this} to have a length above #{exp} but got #{act}' + , 'expected #{this} to not have a length above #{exp}' + , n + , len + ); + } else { + this.assert( + obj > n + , 'expected #{this} to be above ' + n + , 'expected #{this} to be at most ' + n + ); + } + } + + Assertion.addMethod('above', assertAbove); + Assertion.addMethod('gt', assertAbove); + Assertion.addMethod('greaterThan', assertAbove); + + /** + * ### .least(value) + * + * Asserts that the target is greater than or equal to `value`. + * + * expect(10).to.be.at.least(10); + * + * Can also be used in conjunction with `length` to + * assert a minimum length. The benefit being a + * more informative error message than if the length + * was supplied directly. + * + * expect('foo').to.have.length.of.at.least(2); + * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3); + * + * @name least + * @alias gte + * @param {Number} value + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertLeast (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'doLength')) { + new Assertion(obj, msg).to.have.property('length'); + var len = obj.length; + this.assert( + len >= n + , 'expected #{this} to have a length at least #{exp} but got #{act}' + , 'expected #{this} to have a length below #{exp}' + , n + , len + ); + } else { + this.assert( + obj >= n + , 'expected #{this} to be at least ' + n + , 'expected #{this} to be below ' + n + ); + } + } + + Assertion.addMethod('least', assertLeast); + Assertion.addMethod('gte', assertLeast); + + /** + * ### .below(value) + * + * Asserts that the target is less than `value`. + * + * expect(5).to.be.below(10); + * + * Can also be used in conjunction with `length` to + * assert a maximum length. The benefit being a + * more informative error message than if the length + * was supplied directly. + * + * expect('foo').to.have.length.below(4); + * expect([ 1, 2, 3 ]).to.have.length.below(4); + * + * @name below + * @alias lt + * @alias lessThan + * @param {Number} value + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertBelow (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'doLength')) { + new Assertion(obj, msg).to.have.property('length'); + var len = obj.length; + this.assert( + len < n + , 'expected #{this} to have a length below #{exp} but got #{act}' + , 'expected #{this} to not have a length below #{exp}' + , n + , len + ); + } else { + this.assert( + obj < n + , 'expected #{this} to be below ' + n + , 'expected #{this} to be at least ' + n + ); + } + } + + Assertion.addMethod('below', assertBelow); + Assertion.addMethod('lt', assertBelow); + Assertion.addMethod('lessThan', assertBelow); + + /** + * ### .most(value) + * + * Asserts that the target is less than or equal to `value`. + * + * expect(5).to.be.at.most(5); + * + * Can also be used in conjunction with `length` to + * assert a maximum length. The benefit being a + * more informative error message than if the length + * was supplied directly. + * + * expect('foo').to.have.length.of.at.most(4); + * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3); + * + * @name most + * @alias lte + * @param {Number} value + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertMost (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'doLength')) { + new Assertion(obj, msg).to.have.property('length'); + var len = obj.length; + this.assert( + len <= n + , 'expected #{this} to have a length at most #{exp} but got #{act}' + , 'expected #{this} to have a length above #{exp}' + , n + , len + ); + } else { + this.assert( + obj <= n + , 'expected #{this} to be at most ' + n + , 'expected #{this} to be above ' + n + ); + } + } + + Assertion.addMethod('most', assertMost); + Assertion.addMethod('lte', assertMost); + + /** + * ### .within(start, finish) + * + * Asserts that the target is within a range. + * + * expect(7).to.be.within(5,10); + * + * Can also be used in conjunction with `length` to + * assert a length range. The benefit being a + * more informative error message than if the length + * was supplied directly. + * + * expect('foo').to.have.length.within(2,4); + * expect([ 1, 2, 3 ]).to.have.length.within(2,4); + * + * @name within + * @param {Number} start lowerbound inclusive + * @param {Number} finish upperbound inclusive + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('within', function (start, finish, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , range = start + '..' + finish; + if (flag(this, 'doLength')) { + new Assertion(obj, msg).to.have.property('length'); + var len = obj.length; + this.assert( + len >= start && len <= finish + , 'expected #{this} to have a length within ' + range + , 'expected #{this} to not have a length within ' + range + ); + } else { + this.assert( + obj >= start && obj <= finish + , 'expected #{this} to be within ' + range + , 'expected #{this} to not be within ' + range + ); + } + }); + + /** + * ### .instanceof(constructor) + * + * Asserts that the target is an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , Chai = new Tea('chai'); + * + * expect(Chai).to.be.an.instanceof(Tea); + * expect([ 1, 2, 3 ]).to.be.instanceof(Array); + * + * @name instanceof + * @param {Constructor} constructor + * @param {String} message _optional_ + * @alias instanceOf + * @namespace BDD + * @api public + */ + + function assertInstanceOf (constructor, msg) { + if (msg) flag(this, 'message', msg); + var name = _.getName(constructor); + this.assert( + flag(this, 'object') instanceof constructor + , 'expected #{this} to be an instance of ' + name + , 'expected #{this} to not be an instance of ' + name + ); + }; + + Assertion.addMethod('instanceof', assertInstanceOf); + Assertion.addMethod('instanceOf', assertInstanceOf); + + /** + * ### .property(name, [value]) + * + * Asserts that the target has a property `name`, optionally asserting that + * the value of that property is strictly equal to `value`. + * If the `deep` flag is set, you can use dot- and bracket-notation for deep + * references into objects and arrays. + * + * // simple referencing + * var obj = { foo: 'bar' }; + * expect(obj).to.have.property('foo'); + * expect(obj).to.have.property('foo', 'bar'); + * + * // deep referencing + * var deepObj = { + * green: { tea: 'matcha' } + * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ] + * }; + * + * expect(deepObj).to.have.deep.property('green.tea', 'matcha'); + * expect(deepObj).to.have.deep.property('teas[1]', 'matcha'); + * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha'); + * + * You can also use an array as the starting point of a `deep.property` + * assertion, or traverse nested arrays. + * + * var arr = [ + * [ 'chai', 'matcha', 'konacha' ] + * , [ { tea: 'chai' } + * , { tea: 'matcha' } + * , { tea: 'konacha' } ] + * ]; + * + * expect(arr).to.have.deep.property('[0][1]', 'matcha'); + * expect(arr).to.have.deep.property('[1][2].tea', 'konacha'); + * + * Furthermore, `property` changes the subject of the assertion + * to be the value of that property from the original object. This + * permits for further chainable assertions on that property. + * + * expect(obj).to.have.property('foo') + * .that.is.a('string'); + * expect(deepObj).to.have.property('green') + * .that.is.an('object') + * .that.deep.equals({ tea: 'matcha' }); + * expect(deepObj).to.have.property('teas') + * .that.is.an('array') + * .with.deep.property('[2]') + * .that.deep.equals({ tea: 'konacha' }); + * + * Note that dots and bracket in `name` must be backslash-escaped when + * the `deep` flag is set, while they must NOT be escaped when the `deep` + * flag is not set. + * + * // simple referencing + * var css = { '.link[target]': 42 }; + * expect(css).to.have.property('.link[target]', 42); + * + * // deep referencing + * var deepCss = { '.link': { '[target]': 42 }}; + * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42); + * + * @name property + * @alias deep.property + * @param {String} name + * @param {Mixed} value (optional) + * @param {String} message _optional_ + * @returns value of property for chaining + * @namespace BDD + * @api public + */ + + Assertion.addMethod('property', function (name, val, msg) { + if (msg) flag(this, 'message', msg); + + var isDeep = !!flag(this, 'deep') + , descriptor = isDeep ? 'deep property ' : 'property ' + , negate = flag(this, 'negate') + , obj = flag(this, 'object') + , pathInfo = isDeep ? _.getPathInfo(name, obj) : null + , hasProperty = isDeep + ? pathInfo.exists + : _.hasProperty(name, obj) + , value = isDeep + ? pathInfo.value + : obj[name]; + + if (negate && arguments.length > 1) { + if (undefined === value) { + msg = (msg != null) ? msg + ': ' : ''; + throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name)); + } + } else { + this.assert( + hasProperty + , 'expected #{this} to have a ' + descriptor + _.inspect(name) + , 'expected #{this} to not have ' + descriptor + _.inspect(name)); + } + + if (arguments.length > 1) { + this.assert( + val === value + , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}' + , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}' + , val + , value + ); + } + + flag(this, 'object', value); + }); + + + /** + * ### .ownProperty(name) + * + * Asserts that the target has an own property `name`. + * + * expect('test').to.have.ownProperty('length'); + * + * @name ownProperty + * @alias haveOwnProperty + * @param {String} name + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertOwnProperty (name, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + this.assert( + obj.hasOwnProperty(name) + , 'expected #{this} to have own property ' + _.inspect(name) + , 'expected #{this} to not have own property ' + _.inspect(name) + ); + } + + Assertion.addMethod('ownProperty', assertOwnProperty); + Assertion.addMethod('haveOwnProperty', assertOwnProperty); + + /** + * ### .ownPropertyDescriptor(name[, descriptor[, message]]) + * + * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`. + * + * expect('test').to.have.ownPropertyDescriptor('length'); + * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 }); + * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 }); + * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false); + * expect('test').ownPropertyDescriptor('length').to.have.keys('value'); + * + * @name ownPropertyDescriptor + * @alias haveOwnPropertyDescriptor + * @param {String} name + * @param {Object} descriptor _optional_ + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertOwnPropertyDescriptor (name, descriptor, msg) { + if (typeof descriptor === 'string') { + msg = descriptor; + descriptor = null; + } + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name); + if (actualDescriptor && descriptor) { + this.assert( + _.eql(descriptor, actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor) + , descriptor + , actualDescriptor + , true + ); + } else { + this.assert( + actualDescriptor + , 'expected #{this} to have an own property descriptor for ' + _.inspect(name) + , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name) + ); + } + flag(this, 'object', actualDescriptor); + } + + Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor); + Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor); + + /** + * ### .length + * + * Sets the `doLength` flag later used as a chain precursor to a value + * comparison for the `length` property. + * + * expect('foo').to.have.length.above(2); + * expect([ 1, 2, 3 ]).to.have.length.above(2); + * expect('foo').to.have.length.below(4); + * expect([ 1, 2, 3 ]).to.have.length.below(4); + * expect('foo').to.have.length.within(2,4); + * expect([ 1, 2, 3 ]).to.have.length.within(2,4); + * + * *Deprecation notice:* Using `length` as an assertion will be deprecated + * in version 2.4.0 and removed in 3.0.0. Code using the old style of + * asserting for `length` property value using `length(value)` should be + * switched to use `lengthOf(value)` instead. + * + * @name length + * @namespace BDD + * @api public + */ + + /** + * ### .lengthOf(value[, message]) + * + * Asserts that the target's `length` property has + * the expected value. + * + * expect([ 1, 2, 3]).to.have.lengthOf(3); + * expect('foobar').to.have.lengthOf(6); + * + * @name lengthOf + * @param {Number} length + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertLengthChain () { + flag(this, 'doLength', true); + } + + function assertLength (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + new Assertion(obj, msg).to.have.property('length'); + var len = obj.length; + + this.assert( + len == n + , 'expected #{this} to have a length of #{exp} but got #{act}' + , 'expected #{this} to not have a length of #{act}' + , n + , len + ); + } + + Assertion.addChainableMethod('length', assertLength, assertLengthChain); + Assertion.addMethod('lengthOf', assertLength); + + /** + * ### .match(regexp) + * + * Asserts that the target matches a regular expression. + * + * expect('foobar').to.match(/^foo/); + * + * @name match + * @alias matches + * @param {RegExp} RegularExpression + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + function assertMatch(re, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + this.assert( + re.exec(obj) + , 'expected #{this} to match ' + re + , 'expected #{this} not to match ' + re + ); + } + + Assertion.addMethod('match', assertMatch); + Assertion.addMethod('matches', assertMatch); + + /** + * ### .string(string) + * + * Asserts that the string target contains another string. + * + * expect('foobar').to.have.string('bar'); + * + * @name string + * @param {String} string + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('string', function (str, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + new Assertion(obj, msg).is.a('string'); + + this.assert( + ~obj.indexOf(str) + , 'expected #{this} to contain ' + _.inspect(str) + , 'expected #{this} to not contain ' + _.inspect(str) + ); + }); + + + /** + * ### .keys(key1, [key2], [...]) + * + * Asserts that the target contains any or all of the passed-in keys. + * Use in combination with `any`, `all`, `contains`, or `have` will affect + * what will pass. + * + * When used in conjunction with `any`, at least one key that is passed + * in must exist in the target object. This is regardless whether or not + * the `have` or `contain` qualifiers are used. Note, either `any` or `all` + * should be used in the assertion. If neither are used, the assertion is + * defaulted to `all`. + * + * When both `all` and `contain` are used, the target object must have at + * least all of the passed-in keys but may have more keys not listed. + * + * When both `all` and `have` are used, the target object must both contain + * all of the passed-in keys AND the number of keys in the target object must + * match the number of keys passed in (in other words, a target object must + * have all and only all of the passed-in keys). + * + * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz'); + * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo'); + * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz'); + * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']); + * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6}); + * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']); + * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7}); + * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']); + * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6}); + * + * + * @name keys + * @alias key + * @param {...String|Array|Object} keys + * @namespace BDD + * @api public + */ + + function assertKeys (keys) { + var obj = flag(this, 'object') + , str + , ok = true + , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments'; + + switch (_.type(keys)) { + case "array": + if (arguments.length > 1) throw (new Error(mixedArgsMsg)); + break; + case "object": + if (arguments.length > 1) throw (new Error(mixedArgsMsg)); + keys = Object.keys(keys); + break; + default: + keys = Array.prototype.slice.call(arguments); + } + + if (!keys.length) throw new Error('keys required'); + + var actual = Object.keys(obj) + , expected = keys + , len = keys.length + , any = flag(this, 'any') + , all = flag(this, 'all'); + + if (!any && !all) { + all = true; + } + + // Has any + if (any) { + var intersection = expected.filter(function(key) { + return ~actual.indexOf(key); + }); + ok = intersection.length > 0; + } + + // Has all + if (all) { + ok = keys.every(function(key){ + return ~actual.indexOf(key); + }); + if (!flag(this, 'negate') && !flag(this, 'contains')) { + ok = ok && keys.length == actual.length; + } + } + + // Key string + if (len > 1) { + keys = keys.map(function(key){ + return _.inspect(key); + }); + var last = keys.pop(); + if (all) { + str = keys.join(', ') + ', and ' + last; + } + if (any) { + str = keys.join(', ') + ', or ' + last; + } + } else { + str = _.inspect(keys[0]); + } + + // Form + str = (len > 1 ? 'keys ' : 'key ') + str; + + // Have / include + str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; + + // Assertion + this.assert( + ok + , 'expected #{this} to ' + str + , 'expected #{this} to not ' + str + , expected.slice(0).sort() + , actual.sort() + , true + ); + } + + Assertion.addMethod('keys', assertKeys); + Assertion.addMethod('key', assertKeys); + + /** + * ### .throw(constructor) + * + * Asserts that the function target will throw a specific error, or specific type of error + * (as determined using `instanceof`), optionally with a RegExp or string inclusion test + * for the error's message. + * + * var err = new ReferenceError('This is a bad function.'); + * var fn = function () { throw err; } + * expect(fn).to.throw(ReferenceError); + * expect(fn).to.throw(Error); + * expect(fn).to.throw(/bad function/); + * expect(fn).to.not.throw('good function'); + * expect(fn).to.throw(ReferenceError, /bad function/); + * expect(fn).to.throw(err); + * + * Please note that when a throw expectation is negated, it will check each + * parameter independently, starting with error constructor type. The appropriate way + * to check for the existence of a type of error but for a message that does not match + * is to use `and`. + * + * expect(fn).to.throw(ReferenceError) + * .and.not.throw(/good function/); + * + * @name throw + * @alias throws + * @alias Throw + * @param {ErrorConstructor} constructor + * @param {String|RegExp} expected error message + * @param {String} message _optional_ + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @returns error for chaining (null if no error) + * @namespace BDD + * @api public + */ + + function assertThrows (constructor, errMsg, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + new Assertion(obj, msg).is.a('function'); + + var thrown = false + , desiredError = null + , name = null + , thrownError = null; + + if (arguments.length === 0) { + errMsg = null; + constructor = null; + } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) { + errMsg = constructor; + constructor = null; + } else if (constructor && constructor instanceof Error) { + desiredError = constructor; + constructor = null; + errMsg = null; + } else if (typeof constructor === 'function') { + name = constructor.prototype.name; + if (!name || (name === 'Error' && constructor !== Error)) { + name = constructor.name || (new constructor()).name; + } + } else { + constructor = null; + } + + try { + obj(); + } catch (err) { + // first, check desired error + if (desiredError) { + this.assert( + err === desiredError + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + , (desiredError instanceof Error ? desiredError.toString() : desiredError) + , (err instanceof Error ? err.toString() : err) + ); + + flag(this, 'object', err); + return this; + } + + // next, check constructor + if (constructor) { + this.assert( + err instanceof constructor + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp} but #{act} was thrown' + , name + , (err instanceof Error ? err.toString() : err) + ); + + if (!errMsg) { + flag(this, 'object', err); + return this; + } + } + + // next, check message + var message = 'error' === _.type(err) && "message" in err + ? err.message + : '' + err; + + if ((message != null) && errMsg && errMsg instanceof RegExp) { + this.assert( + errMsg.exec(message) + , 'expected #{this} to throw error matching #{exp} but got #{act}' + , 'expected #{this} to throw error not matching #{exp}' + , errMsg + , message + ); + + flag(this, 'object', err); + return this; + } else if ((message != null) && errMsg && 'string' === typeof errMsg) { + this.assert( + ~message.indexOf(errMsg) + , 'expected #{this} to throw error including #{exp} but got #{act}' + , 'expected #{this} to throw error not including #{act}' + , errMsg + , message + ); + + flag(this, 'object', err); + return this; + } else { + thrown = true; + thrownError = err; + } + } + + var actuallyGot = '' + , expectedThrown = name !== null + ? name + : desiredError + ? '#{exp}' //_.inspect(desiredError) + : 'an error'; + + if (thrown) { + actuallyGot = ' but #{act} was thrown' + } + + this.assert( + thrown === true + , 'expected #{this} to throw ' + expectedThrown + actuallyGot + , 'expected #{this} to not throw ' + expectedThrown + actuallyGot + , (desiredError instanceof Error ? desiredError.toString() : desiredError) + , (thrownError instanceof Error ? thrownError.toString() : thrownError) + ); + + flag(this, 'object', thrownError); + }; + + Assertion.addMethod('throw', assertThrows); + Assertion.addMethod('throws', assertThrows); + Assertion.addMethod('Throw', assertThrows); + + /** + * ### .respondTo(method) + * + * Asserts that the object or class target will respond to a method. + * + * Klass.prototype.bar = function(){}; + * expect(Klass).to.respondTo('bar'); + * expect(obj).to.respondTo('bar'); + * + * To check if a constructor will respond to a static function, + * set the `itself` flag. + * + * Klass.baz = function(){}; + * expect(Klass).itself.to.respondTo('baz'); + * + * @name respondTo + * @alias respondsTo + * @param {String} method + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function respondTo (method, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , itself = flag(this, 'itself') + , context = ('function' === _.type(obj) && !itself) + ? obj.prototype[method] + : obj[method]; + + this.assert( + 'function' === typeof context + , 'expected #{this} to respond to ' + _.inspect(method) + , 'expected #{this} to not respond to ' + _.inspect(method) + ); + } + + Assertion.addMethod('respondTo', respondTo); + Assertion.addMethod('respondsTo', respondTo); + + /** + * ### .itself + * + * Sets the `itself` flag, later used by the `respondTo` assertion. + * + * function Foo() {} + * Foo.bar = function() {} + * Foo.prototype.baz = function() {} + * + * expect(Foo).itself.to.respondTo('bar'); + * expect(Foo).itself.not.to.respondTo('baz'); + * + * @name itself + * @namespace BDD + * @api public + */ + + Assertion.addProperty('itself', function () { + flag(this, 'itself', true); + }); + + /** + * ### .satisfy(method) + * + * Asserts that the target passes a given truth test. + * + * expect(1).to.satisfy(function(num) { return num > 0; }); + * + * @name satisfy + * @alias satisfies + * @param {Function} matcher + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function satisfy (matcher, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var result = matcher(obj); + this.assert( + result + , 'expected #{this} to satisfy ' + _.objDisplay(matcher) + , 'expected #{this} to not satisfy' + _.objDisplay(matcher) + , this.negate ? false : true + , result + ); + } + + Assertion.addMethod('satisfy', satisfy); + Assertion.addMethod('satisfies', satisfy); + + /** + * ### .closeTo(expected, delta) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * expect(1.5).to.be.closeTo(1, 0.5); + * + * @name closeTo + * @alias approximately + * @param {Number} expected + * @param {Number} delta + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function closeTo(expected, delta, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + + new Assertion(obj, msg).is.a('number'); + if (_.type(expected) !== 'number' || _.type(delta) !== 'number') { + throw new Error('the arguments to closeTo or approximately must be numbers'); + } + + this.assert( + Math.abs(obj - expected) <= delta + , 'expected #{this} to be close to ' + expected + ' +/- ' + delta + , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta + ); + } + + Assertion.addMethod('closeTo', closeTo); + Assertion.addMethod('approximately', closeTo); + + function isSubsetOf(subset, superset, cmp) { + return subset.every(function(elem) { + if (!cmp) return superset.indexOf(elem) !== -1; + + return superset.some(function(elem2) { + return cmp(elem, elem2); + }); + }) + } + + /** + * ### .members(set) + * + * Asserts that the target is a superset of `set`, + * or that the target and `set` have the same strictly-equal (===) members. + * Alternately, if the `deep` flag is set, set members are compared for deep + * equality. + * + * expect([1, 2, 3]).to.include.members([3, 2]); + * expect([1, 2, 3]).to.not.include.members([3, 2, 8]); + * + * expect([4, 2]).to.have.members([2, 4]); + * expect([5, 2]).to.not.have.members([5, 2, 1]); + * + * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]); + * + * @name members + * @param {Array} set + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('members', function (subset, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + + new Assertion(obj).to.be.an('array'); + new Assertion(subset).to.be.an('array'); + + var cmp = flag(this, 'deep') ? _.eql : undefined; + + if (flag(this, 'contains')) { + return this.assert( + isSubsetOf(subset, obj, cmp) + , 'expected #{this} to be a superset of #{act}' + , 'expected #{this} to not be a superset of #{act}' + , obj + , subset + ); + } + + this.assert( + isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp) + , 'expected #{this} to have the same members as #{act}' + , 'expected #{this} to not have the same members as #{act}' + , obj + , subset + ); + }); + + /** + * ### .oneOf(list) + * + * Assert that a value appears somewhere in the top level of array `list`. + * + * expect('a').to.be.oneOf(['a', 'b', 'c']); + * expect(9).to.not.be.oneOf(['z']); + * expect([3]).to.not.be.oneOf([1, 2, [3]]); + * + * var three = [3]; + * // for object-types, contents are not compared + * expect(three).to.not.be.oneOf([1, 2, [3]]); + * // comparing references works + * expect(three).to.be.oneOf([1, 2, three]); + * + * @name oneOf + * @param {Array<*>} list + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function oneOf (list, msg) { + if (msg) flag(this, 'message', msg); + var expected = flag(this, 'object'); + new Assertion(list).to.be.an('array'); + + this.assert( + list.indexOf(expected) > -1 + , 'expected #{this} to be one of #{exp}' + , 'expected #{this} to not be one of #{exp}' + , list + , expected + ); + } + + Assertion.addMethod('oneOf', oneOf); + + + /** + * ### .change(function) + * + * Asserts that a function changes an object property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 3 }; + * var noChangeFn = function() { return 'foo' + 'bar'; } + * expect(fn).to.change(obj, 'val'); + * expect(noChangeFn).to.not.change(obj, 'val') + * + * @name change + * @alias changes + * @alias Change + * @param {String} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertChanges (object, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object'); + new Assertion(object, msg).to.have.property(prop); + new Assertion(fn).is.a('function'); + + var initial = object[prop]; + fn(); + + this.assert( + initial !== object[prop] + , 'expected .' + prop + ' to change' + , 'expected .' + prop + ' to not change' + ); + } + + Assertion.addChainableMethod('change', assertChanges); + Assertion.addChainableMethod('changes', assertChanges); + + /** + * ### .increase(function) + * + * Asserts that a function increases an object property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * expect(fn).to.increase(obj, 'val'); + * + * @name increase + * @alias increases + * @alias Increase + * @param {String} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertIncreases (object, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object'); + new Assertion(object, msg).to.have.property(prop); + new Assertion(fn).is.a('function'); + + var initial = object[prop]; + fn(); + + this.assert( + object[prop] - initial > 0 + , 'expected .' + prop + ' to increase' + , 'expected .' + prop + ' to not increase' + ); + } + + Assertion.addChainableMethod('increase', assertIncreases); + Assertion.addChainableMethod('increases', assertIncreases); + + /** + * ### .decrease(function) + * + * Asserts that a function decreases an object property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * expect(fn).to.decrease(obj, 'val'); + * + * @name decrease + * @alias decreases + * @alias Decrease + * @param {String} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace BDD + * @api public + */ + + function assertDecreases (object, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object'); + new Assertion(object, msg).to.have.property(prop); + new Assertion(fn).is.a('function'); + + var initial = object[prop]; + fn(); + + this.assert( + object[prop] - initial < 0 + , 'expected .' + prop + ' to decrease' + , 'expected .' + prop + ' to not decrease' + ); + } + + Assertion.addChainableMethod('decrease', assertDecreases); + Assertion.addChainableMethod('decreases', assertDecreases); + + /** + * ### .extensible + * + * Asserts that the target is extensible (can have new properties added to + * it). + * + * var nonExtensibleObject = Object.preventExtensions({}); + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * expect({}).to.be.extensible; + * expect(nonExtensibleObject).to.not.be.extensible; + * expect(sealedObject).to.not.be.extensible; + * expect(frozenObject).to.not.be.extensible; + * + * @name extensible + * @namespace BDD + * @api public + */ + + Assertion.addProperty('extensible', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible + // The following provides ES6 behavior when a TypeError is thrown under ES5. + + var isExtensible; + + try { + isExtensible = Object.isExtensible(obj); + } catch (err) { + if (err instanceof TypeError) isExtensible = false; + else throw err; + } + + this.assert( + isExtensible + , 'expected #{this} to be extensible' + , 'expected #{this} to not be extensible' + ); + }); + + /** + * ### .sealed + * + * Asserts that the target is sealed (cannot have new properties added to it + * and its existing properties cannot be removed). + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * expect(sealedObject).to.be.sealed; + * expect(frozenObject).to.be.sealed; + * expect({}).to.not.be.sealed; + * + * @name sealed + * @namespace BDD + * @api public + */ + + Assertion.addProperty('sealed', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed + // The following provides ES6 behavior when a TypeError is thrown under ES5. + + var isSealed; + + try { + isSealed = Object.isSealed(obj); + } catch (err) { + if (err instanceof TypeError) isSealed = true; + else throw err; + } + + this.assert( + isSealed + , 'expected #{this} to be sealed' + , 'expected #{this} to not be sealed' + ); + }); + + /** + * ### .frozen + * + * Asserts that the target is frozen (cannot have new properties added to it + * and its existing properties cannot be modified). + * + * var frozenObject = Object.freeze({}); + * + * expect(frozenObject).to.be.frozen; + * expect({}).to.not.be.frozen; + * + * @name frozen + * @namespace BDD + * @api public + */ + + Assertion.addProperty('frozen', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen + // The following provides ES6 behavior when a TypeError is thrown under ES5. + + var isFrozen; + + try { + isFrozen = Object.isFrozen(obj); + } catch (err) { + if (err instanceof TypeError) isFrozen = true; + else throw err; + } + + this.assert( + isFrozen + , 'expected #{this} to be frozen' + , 'expected #{this} to not be frozen' + ); + }); +}; + +},{}],6:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + + +module.exports = function (chai, util) { + + /*! + * Chai dependencies. + */ + + var Assertion = chai.Assertion + , flag = util.flag; + + /*! + * Module export. + */ + + /** + * ### assert(expression, message) + * + * Write your own test expressions. + * + * assert('foo' !== 'bar', 'foo is not bar'); + * assert(Array.isArray([]), 'empty arrays are arrays'); + * + * @param {Mixed} expression to test for truthiness + * @param {String} message to display on error + * @name assert + * @namespace Assert + * @api public + */ + + var assert = chai.assert = function (express, errmsg) { + var test = new Assertion(null, null, chai.assert); + test.assert( + express + , errmsg + , '[ negation message unavailable ]' + ); + }; + + /** + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. Node.js `assert` module-compatible. + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace Assert + * @api public + */ + + assert.fail = function (actual, expected, message, operator) { + message = message || 'assert.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, assert.fail); + }; + + /** + * ### .isOk(object, [message]) + * + * Asserts that `object` is truthy. + * + * assert.isOk('everything', 'everything is ok'); + * assert.isOk(false, 'this will fail'); + * + * @name isOk + * @alias ok + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isOk = function (val, msg) { + new Assertion(val, msg).is.ok; + }; + + /** + * ### .isNotOk(object, [message]) + * + * Asserts that `object` is falsy. + * + * assert.isNotOk('everything', 'this will fail'); + * assert.isNotOk(false, 'this will pass'); + * + * @name isNotOk + * @alias notOk + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotOk = function (val, msg) { + new Assertion(val, msg).is.not.ok; + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * assert.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.equal = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.equal); + + test.assert( + exp == flag(test, 'object') + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{act}' + , exp + , act + ); + }; + + /** + * ### .notEqual(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * assert.notEqual(3, 4, 'these numbers are not equal'); + * + * @name notEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notEqual = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.notEqual); + + test.assert( + exp != flag(test, 'object') + , 'expected #{this} to not equal #{exp}' + , 'expected #{this} to equal #{act}' + , exp + , act + ); + }; + + /** + * ### .strictEqual(actual, expected, [message]) + * + * Asserts strict equality (`===`) of `actual` and `expected`. + * + * assert.strictEqual(true, true, 'these booleans are strictly equal'); + * + * @name strictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.strictEqual = function (act, exp, msg) { + new Assertion(act, msg).to.equal(exp); + }; + + /** + * ### .notStrictEqual(actual, expected, [message]) + * + * Asserts strict inequality (`!==`) of `actual` and `expected`. + * + * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); + * + * @name notStrictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notStrictEqual = function (act, exp, msg) { + new Assertion(act, msg).to.not.equal(exp); + }; + + /** + * ### .deepEqual(actual, expected, [message]) + * + * Asserts that `actual` is deeply equal to `expected`. + * + * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); + * + * @name deepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepEqual = function (act, exp, msg) { + new Assertion(act, msg).to.eql(exp); + }; + + /** + * ### .notDeepEqual(actual, expected, [message]) + * + * Assert that `actual` is not deeply equal to `expected`. + * + * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); + * + * @name notDeepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepEqual = function (act, exp, msg) { + new Assertion(act, msg).to.not.eql(exp); + }; + + /** + * ### .isAbove(valueToCheck, valueToBeAbove, [message]) + * + * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove` + * + * assert.isAbove(5, 2, '5 is strictly greater than 2'); + * + * @name isAbove + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAbove + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAbove = function (val, abv, msg) { + new Assertion(val, msg).to.be.above(abv); + }; + + /** + * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message]) + * + * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast` + * + * assert.isAtLeast(5, 2, '5 is greater or equal to 2'); + * assert.isAtLeast(3, 3, '3 is greater or equal to 3'); + * + * @name isAtLeast + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtLeast + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtLeast = function (val, atlst, msg) { + new Assertion(val, msg).to.be.least(atlst); + }; + + /** + * ### .isBelow(valueToCheck, valueToBeBelow, [message]) + * + * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow` + * + * assert.isBelow(3, 6, '3 is strictly less than 6'); + * + * @name isBelow + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeBelow + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBelow = function (val, blw, msg) { + new Assertion(val, msg).to.be.below(blw); + }; + + /** + * ### .isAtMost(valueToCheck, valueToBeAtMost, [message]) + * + * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost` + * + * assert.isAtMost(3, 6, '3 is less than or equal to 6'); + * assert.isAtMost(4, 4, '4 is less than or equal to 4'); + * + * @name isAtMost + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtMost + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtMost = function (val, atmst, msg) { + new Assertion(val, msg).to.be.most(atmst); + }; + + /** + * ### .isTrue(value, [message]) + * + * Asserts that `value` is true. + * + * var teaServed = true; + * assert.isTrue(teaServed, 'the tea has been served'); + * + * @name isTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isTrue = function (val, msg) { + new Assertion(val, msg).is['true']; + }; + + /** + * ### .isNotTrue(value, [message]) + * + * Asserts that `value` is not true. + * + * var tea = 'tasty chai'; + * assert.isNotTrue(tea, 'great, time for tea!'); + * + * @name isNotTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotTrue = function (val, msg) { + new Assertion(val, msg).to.not.equal(true); + }; + + /** + * ### .isFalse(value, [message]) + * + * Asserts that `value` is false. + * + * var teaServed = false; + * assert.isFalse(teaServed, 'no tea yet? hmm...'); + * + * @name isFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFalse = function (val, msg) { + new Assertion(val, msg).is['false']; + }; + + /** + * ### .isNotFalse(value, [message]) + * + * Asserts that `value` is not false. + * + * var tea = 'tasty chai'; + * assert.isNotFalse(tea, 'great, time for tea!'); + * + * @name isNotFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFalse = function (val, msg) { + new Assertion(val, msg).to.not.equal(false); + }; + + /** + * ### .isNull(value, [message]) + * + * Asserts that `value` is null. + * + * assert.isNull(err, 'there was no error'); + * + * @name isNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNull = function (val, msg) { + new Assertion(val, msg).to.equal(null); + }; + + /** + * ### .isNotNull(value, [message]) + * + * Asserts that `value` is not null. + * + * var tea = 'tasty chai'; + * assert.isNotNull(tea, 'great, time for tea!'); + * + * @name isNotNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNull = function (val, msg) { + new Assertion(val, msg).to.not.equal(null); + }; + + /** + * ### .isNaN + * Asserts that value is NaN + * + * assert.isNaN('foo', 'foo is NaN'); + * + * @name isNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNaN = function (val, msg) { + new Assertion(val, msg).to.be.NaN; + }; + + /** + * ### .isNotNaN + * Asserts that value is not NaN + * + * assert.isNotNaN(4, '4 is not NaN'); + * + * @name isNotNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + assert.isNotNaN = function (val, msg) { + new Assertion(val, msg).not.to.be.NaN; + }; + + /** + * ### .isUndefined(value, [message]) + * + * Asserts that `value` is `undefined`. + * + * var tea; + * assert.isUndefined(tea, 'no tea defined'); + * + * @name isUndefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isUndefined = function (val, msg) { + new Assertion(val, msg).to.equal(undefined); + }; + + /** + * ### .isDefined(value, [message]) + * + * Asserts that `value` is not `undefined`. + * + * var tea = 'cup of chai'; + * assert.isDefined(tea, 'tea has been defined'); + * + * @name isDefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isDefined = function (val, msg) { + new Assertion(val, msg).to.not.equal(undefined); + }; + + /** + * ### .isFunction(value, [message]) + * + * Asserts that `value` is a function. + * + * function serveTea() { return 'cup of tea'; }; + * assert.isFunction(serveTea, 'great, we can have tea now'); + * + * @name isFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFunction = function (val, msg) { + new Assertion(val, msg).to.be.a('function'); + }; + + /** + * ### .isNotFunction(value, [message]) + * + * Asserts that `value` is _not_ a function. + * + * var serveTea = [ 'heat', 'pour', 'sip' ]; + * assert.isNotFunction(serveTea, 'great, we have listed the steps'); + * + * @name isNotFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFunction = function (val, msg) { + new Assertion(val, msg).to.not.be.a('function'); + }; + + /** + * ### .isObject(value, [message]) + * + * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`). + * _The assertion does not match subclassed objects._ + * + * var selection = { name: 'Chai', serve: 'with spices' }; + * assert.isObject(selection, 'tea selection is an object'); + * + * @name isObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isObject = function (val, msg) { + new Assertion(val, msg).to.be.a('object'); + }; + + /** + * ### .isNotObject(value, [message]) + * + * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`). + * + * var selection = 'chai' + * assert.isNotObject(selection, 'tea selection is not an object'); + * assert.isNotObject(null, 'null is not an object'); + * + * @name isNotObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotObject = function (val, msg) { + new Assertion(val, msg).to.not.be.a('object'); + }; + + /** + * ### .isArray(value, [message]) + * + * Asserts that `value` is an array. + * + * var menu = [ 'green', 'chai', 'oolong' ]; + * assert.isArray(menu, 'what kind of tea do we want?'); + * + * @name isArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isArray = function (val, msg) { + new Assertion(val, msg).to.be.an('array'); + }; + + /** + * ### .isNotArray(value, [message]) + * + * Asserts that `value` is _not_ an array. + * + * var menu = 'green|chai|oolong'; + * assert.isNotArray(menu, 'what kind of tea do we want?'); + * + * @name isNotArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotArray = function (val, msg) { + new Assertion(val, msg).to.not.be.an('array'); + }; + + /** + * ### .isString(value, [message]) + * + * Asserts that `value` is a string. + * + * var teaOrder = 'chai'; + * assert.isString(teaOrder, 'order placed'); + * + * @name isString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isString = function (val, msg) { + new Assertion(val, msg).to.be.a('string'); + }; + + /** + * ### .isNotString(value, [message]) + * + * Asserts that `value` is _not_ a string. + * + * var teaOrder = 4; + * assert.isNotString(teaOrder, 'order placed'); + * + * @name isNotString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotString = function (val, msg) { + new Assertion(val, msg).to.not.be.a('string'); + }; + + /** + * ### .isNumber(value, [message]) + * + * Asserts that `value` is a number. + * + * var cups = 2; + * assert.isNumber(cups, 'how many cups'); + * + * @name isNumber + * @param {Number} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNumber = function (val, msg) { + new Assertion(val, msg).to.be.a('number'); + }; + + /** + * ### .isNotNumber(value, [message]) + * + * Asserts that `value` is _not_ a number. + * + * var cups = '2 cups please'; + * assert.isNotNumber(cups, 'how many cups'); + * + * @name isNotNumber + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNumber = function (val, msg) { + new Assertion(val, msg).to.not.be.a('number'); + }; + + /** + * ### .isBoolean(value, [message]) + * + * Asserts that `value` is a boolean. + * + * var teaReady = true + * , teaServed = false; + * + * assert.isBoolean(teaReady, 'is the tea ready'); + * assert.isBoolean(teaServed, 'has tea been served'); + * + * @name isBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBoolean = function (val, msg) { + new Assertion(val, msg).to.be.a('boolean'); + }; + + /** + * ### .isNotBoolean(value, [message]) + * + * Asserts that `value` is _not_ a boolean. + * + * var teaReady = 'yep' + * , teaServed = 'nope'; + * + * assert.isNotBoolean(teaReady, 'is the tea ready'); + * assert.isNotBoolean(teaServed, 'has tea been served'); + * + * @name isNotBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotBoolean = function (val, msg) { + new Assertion(val, msg).to.not.be.a('boolean'); + }; + + /** + * ### .typeOf(value, name, [message]) + * + * Asserts that `value`'s type is `name`, as determined by + * `Object.prototype.toString`. + * + * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); + * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); + * assert.typeOf('tea', 'string', 'we have a string'); + * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); + * assert.typeOf(null, 'null', 'we have a null'); + * assert.typeOf(undefined, 'undefined', 'we have an undefined'); + * + * @name typeOf + * @param {Mixed} value + * @param {String} name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.typeOf = function (val, type, msg) { + new Assertion(val, msg).to.be.a(type); + }; + + /** + * ### .notTypeOf(value, name, [message]) + * + * Asserts that `value`'s type is _not_ `name`, as determined by + * `Object.prototype.toString`. + * + * assert.notTypeOf('tea', 'number', 'strings are not numbers'); + * + * @name notTypeOf + * @param {Mixed} value + * @param {String} typeof name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notTypeOf = function (val, type, msg) { + new Assertion(val, msg).to.not.be.a(type); + }; + + /** + * ### .instanceOf(object, constructor, [message]) + * + * Asserts that `value` is an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new Tea('chai'); + * + * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); + * + * @name instanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.instanceOf = function (val, type, msg) { + new Assertion(val, msg).to.be.instanceOf(type); + }; + + /** + * ### .notInstanceOf(object, constructor, [message]) + * + * Asserts `value` is not an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new String('chai'); + * + * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); + * + * @name notInstanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInstanceOf = function (val, type, msg) { + new Assertion(val, msg).to.not.be.instanceOf(type); + }; + + /** + * ### .include(haystack, needle, [message]) + * + * Asserts that `haystack` includes `needle`. Works + * for strings and arrays. + * + * assert.include('foobar', 'bar', 'foobar contains string "bar"'); + * assert.include([ 1, 2, 3 ], 3, 'array contains value'); + * + * @name include + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.include = function (exp, inc, msg) { + new Assertion(exp, msg, assert.include).include(inc); + }; + + /** + * ### .notInclude(haystack, needle, [message]) + * + * Asserts that `haystack` does not include `needle`. Works + * for strings and arrays. + * + * assert.notInclude('foobar', 'baz', 'string not include substring'); + * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value'); + * + * @name notInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notInclude).not.include(inc); + }; + + /** + * ### .match(value, regexp, [message]) + * + * Asserts that `value` matches the regular expression `regexp`. + * + * assert.match('foobar', /^foo/, 'regexp matches'); + * + * @name match + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.match = function (exp, re, msg) { + new Assertion(exp, msg).to.match(re); + }; + + /** + * ### .notMatch(value, regexp, [message]) + * + * Asserts that `value` does not match the regular expression `regexp`. + * + * assert.notMatch('foobar', /^foo/, 'regexp does not match'); + * + * @name notMatch + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notMatch = function (exp, re, msg) { + new Assertion(exp, msg).to.not.match(re); + }; + + /** + * ### .property(object, property, [message]) + * + * Asserts that `object` has a property named by `property`. + * + * assert.property({ tea: { green: 'matcha' }}, 'tea'); + * + * @name property + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.property = function (obj, prop, msg) { + new Assertion(obj, msg).to.have.property(prop); + }; + + /** + * ### .notProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a property named by `property`. + * + * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); + * + * @name notProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notProperty = function (obj, prop, msg) { + new Assertion(obj, msg).to.not.have.property(prop); + }; + + /** + * ### .deepProperty(object, property, [message]) + * + * Asserts that `object` has a property named by `property`, which can be a + * string using dot- and bracket-notation for deep reference. + * + * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green'); + * + * @name deepProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepProperty = function (obj, prop, msg) { + new Assertion(obj, msg).to.have.deep.property(prop); + }; + + /** + * ### .notDeepProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a property named by `property`, which + * can be a string using dot- and bracket-notation for deep reference. + * + * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); + * + * @name notDeepProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepProperty = function (obj, prop, msg) { + new Assertion(obj, msg).to.not.have.deep.property(prop); + }; + + /** + * ### .propertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with value given + * by `value`. + * + * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); + * + * @name propertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.propertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg).to.have.property(prop, val); + }; + + /** + * ### .propertyNotVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property`, but with a value + * different from that given by `value`. + * + * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad'); + * + * @name propertyNotVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.propertyNotVal = function (obj, prop, val, msg) { + new Assertion(obj, msg).to.not.have.property(prop, val); + }; + + /** + * ### .deepPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with value given + * by `value`. `property` can use dot- and bracket-notation for deep + * reference. + * + * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); + * + * @name deepPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg).to.have.deep.property(prop, val); + }; + + /** + * ### .deepPropertyNotVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property`, but with a value + * different from that given by `value`. `property` can use dot- and + * bracket-notation for deep reference. + * + * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); + * + * @name deepPropertyNotVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepPropertyNotVal = function (obj, prop, val, msg) { + new Assertion(obj, msg).to.not.have.deep.property(prop, val); + }; + + /** + * ### .lengthOf(object, length, [message]) + * + * Asserts that `object` has a `length` property with the expected value. + * + * assert.lengthOf([1,2,3], 3, 'array has length of 3'); + * assert.lengthOf('foobar', 6, 'string has length of 6'); + * + * @name lengthOf + * @param {Mixed} object + * @param {Number} length + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.lengthOf = function (exp, len, msg) { + new Assertion(exp, msg).to.have.length(len); + }; + + /** + * ### .throws(function, [constructor/string/regexp], [string/regexp], [message]) + * + * Asserts that `function` will throw an error that is an instance of + * `constructor`, or alternately that it will throw an error with message + * matching `regexp`. + * + * assert.throws(fn, 'function throws a reference error'); + * assert.throws(fn, /function throws a reference error/); + * assert.throws(fn, ReferenceError); + * assert.throws(fn, ReferenceError, 'function throws a reference error'); + * assert.throws(fn, ReferenceError, /function throws a reference error/); + * + * @name throws + * @alias throw + * @alias Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.throws = function (fn, errt, errs, msg) { + if ('string' === typeof errt || errt instanceof RegExp) { + errs = errt; + errt = null; + } + + var assertErr = new Assertion(fn, msg).to.throw(errt, errs); + return flag(assertErr, 'object'); + }; + + /** + * ### .doesNotThrow(function, [constructor/regexp], [message]) + * + * Asserts that `function` will _not_ throw an error that is an instance of + * `constructor`, or alternately that it will not throw an error with message + * matching `regexp`. + * + * assert.doesNotThrow(fn, Error, 'function does not throw'); + * + * @name doesNotThrow + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.doesNotThrow = function (fn, type, msg) { + if ('string' === typeof type) { + msg = type; + type = null; + } + + new Assertion(fn, msg).to.not.Throw(type); + }; + + /** + * ### .operator(val1, operator, val2, [message]) + * + * Compares two values using `operator`. + * + * assert.operator(1, '<', 2, 'everything is ok'); + * assert.operator(1, '>', 2, 'this will fail'); + * + * @name operator + * @param {Mixed} val1 + * @param {String} operator + * @param {Mixed} val2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.operator = function (val, operator, val2, msg) { + var ok; + switch(operator) { + case '==': + ok = val == val2; + break; + case '===': + ok = val === val2; + break; + case '>': + ok = val > val2; + break; + case '>=': + ok = val >= val2; + break; + case '<': + ok = val < val2; + break; + case '<=': + ok = val <= val2; + break; + case '!=': + ok = val != val2; + break; + case '!==': + ok = val !== val2; + break; + default: + throw new Error('Invalid operator "' + operator + '"'); + } + var test = new Assertion(ok, msg); + test.assert( + true === flag(test, 'object') + , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) + , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); + }; + + /** + * ### .closeTo(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); + * + * @name closeTo + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.closeTo = function (act, exp, delta, msg) { + new Assertion(act, msg).to.be.closeTo(exp, delta); + }; + + /** + * ### .approximately(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.approximately(1.5, 1, 0.5, 'numbers are close'); + * + * @name approximately + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.approximately = function (act, exp, delta, msg) { + new Assertion(act, msg).to.be.approximately(exp, delta); + }; + + /** + * ### .sameMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members. + * Order is not taken into account. + * + * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); + * + * @name sameMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameMembers = function (set1, set2, msg) { + new Assertion(set1, msg).to.have.same.members(set2); + } + + /** + * ### .sameDeepMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members - using a deep equality checking. + * Order is not taken into account. + * + * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a: 2} ], 'same deep members'); + * + * @name sameDeepMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameDeepMembers = function (set1, set2, msg) { + new Assertion(set1, msg).to.have.same.deep.members(set2); + } + + /** + * ### .includeMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset`. + * Order is not taken into account. + * + * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members'); + * + * @name includeMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeMembers = function (superset, subset, msg) { + new Assertion(superset, msg).to.include.members(subset); + } + + /** + * ### .includeDeepMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` - using deep equality checking. + * Order is not taken into account. + * Duplicates are ignored. + * + * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members'); + * + * @name includeDeepMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeDeepMembers = function (superset, subset, msg) { + new Assertion(superset, msg).to.include.deep.members(subset); + } + + /** + * ### .oneOf(inList, list, [message]) + * + * Asserts that non-object, non-array value `inList` appears in the flat array `list`. + * + * assert.oneOf(1, [ 2, 1 ], 'Not found in list'); + * + * @name oneOf + * @param {*} inList + * @param {Array<*>} list + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.oneOf = function (inList, list, msg) { + new Assertion(inList, msg).to.be.oneOf(list); + } + + /** + * ### .changes(function, object, property) + * + * Asserts that a function changes the value of a property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 22 }; + * assert.changes(fn, obj, 'val'); + * + * @name changes + * @param {Function} modifier function + * @param {Object} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changes = function (fn, obj, prop) { + new Assertion(fn).to.change(obj, prop); + } + + /** + * ### .doesNotChange(function, object, property) + * + * Asserts that a function does not changes the value of a property + * + * var obj = { val: 10 }; + * var fn = function() { console.log('foo'); }; + * assert.doesNotChange(fn, obj, 'val'); + * + * @name doesNotChange + * @param {Function} modifier function + * @param {Object} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotChange = function (fn, obj, prop) { + new Assertion(fn).to.not.change(obj, prop); + } + + /** + * ### .increases(function, object, property) + * + * Asserts that a function increases an object property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 13 }; + * assert.increases(fn, obj, 'val'); + * + * @name increases + * @param {Function} modifier function + * @param {Object} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increases = function (fn, obj, prop) { + new Assertion(fn).to.increase(obj, prop); + } + + /** + * ### .doesNotIncrease(function, object, property) + * + * Asserts that a function does not increase object property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 8 }; + * assert.doesNotIncrease(fn, obj, 'val'); + * + * @name doesNotIncrease + * @param {Function} modifier function + * @param {Object} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotIncrease = function (fn, obj, prop) { + new Assertion(fn).to.not.increase(obj, prop); + } + + /** + * ### .decreases(function, object, property) + * + * Asserts that a function decreases an object property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.decreases(fn, obj, 'val'); + * + * @name decreases + * @param {Function} modifier function + * @param {Object} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreases = function (fn, obj, prop) { + new Assertion(fn).to.decrease(obj, prop); + } + + /** + * ### .doesNotDecrease(function, object, property) + * + * Asserts that a function does not decreases an object property + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * assert.doesNotDecrease(fn, obj, 'val'); + * + * @name doesNotDecrease + * @param {Function} modifier function + * @param {Object} object + * @param {String} property name + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotDecrease = function (fn, obj, prop) { + new Assertion(fn).to.not.decrease(obj, prop); + } + + /*! + * ### .ifError(object) + * + * Asserts if value is not a false value, and throws if it is a true value. + * This is added to allow for chai to be a drop-in replacement for Node's + * assert class. + * + * var err = new Error('I am a custom error'); + * assert.ifError(err); // Rethrows err! + * + * @name ifError + * @param {Object} object + * @namespace Assert + * @api public + */ + + assert.ifError = function (val) { + if (val) { + throw(val); + } + }; + + /** + * ### .isExtensible(object) + * + * Asserts that `object` is extensible (can have new properties added to it). + * + * assert.isExtensible({}); + * + * @name isExtensible + * @alias extensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isExtensible = function (obj, msg) { + new Assertion(obj, msg).to.be.extensible; + }; + + /** + * ### .isNotExtensible(object) + * + * Asserts that `object` is _not_ extensible. + * + * var nonExtensibleObject = Object.preventExtensions({}); + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freese({}); + * + * assert.isNotExtensible(nonExtensibleObject); + * assert.isNotExtensible(sealedObject); + * assert.isNotExtensible(frozenObject); + * + * @name isNotExtensible + * @alias notExtensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotExtensible = function (obj, msg) { + new Assertion(obj, msg).to.not.be.extensible; + }; + + /** + * ### .isSealed(object) + * + * Asserts that `object` is sealed (cannot have new properties added to it + * and its existing properties cannot be removed). + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.seal({}); + * + * assert.isSealed(sealedObject); + * assert.isSealed(frozenObject); + * + * @name isSealed + * @alias sealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isSealed = function (obj, msg) { + new Assertion(obj, msg).to.be.sealed; + }; + + /** + * ### .isNotSealed(object) + * + * Asserts that `object` is _not_ sealed. + * + * assert.isNotSealed({}); + * + * @name isNotSealed + * @alias notSealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotSealed = function (obj, msg) { + new Assertion(obj, msg).to.not.be.sealed; + }; + + /** + * ### .isFrozen(object) + * + * Asserts that `object` is frozen (cannot have new properties added to it + * and its existing properties cannot be modified). + * + * var frozenObject = Object.freeze({}); + * assert.frozen(frozenObject); + * + * @name isFrozen + * @alias frozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isFrozen = function (obj, msg) { + new Assertion(obj, msg).to.be.frozen; + }; + + /** + * ### .isNotFrozen(object) + * + * Asserts that `object` is _not_ frozen. + * + * assert.isNotFrozen({}); + * + * @name isNotFrozen + * @alias notFrozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotFrozen = function (obj, msg) { + new Assertion(obj, msg).to.not.be.frozen; + }; + + /*! + * Aliases. + */ + + (function alias(name, as){ + assert[as] = assert[name]; + return alias; + }) + ('isOk', 'ok') + ('isNotOk', 'notOk') + ('throws', 'throw') + ('throws', 'Throw') + ('isExtensible', 'extensible') + ('isNotExtensible', 'notExtensible') + ('isSealed', 'sealed') + ('isNotSealed', 'notSealed') + ('isFrozen', 'frozen') + ('isNotFrozen', 'notFrozen'); +}; + +},{}],7:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + chai.expect = function (val, message) { + return new chai.Assertion(val, message); + }; + + /** + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace Expect + * @api public + */ + + chai.expect.fail = function (actual, expected, message, operator) { + message = message || 'expect.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, chai.expect.fail); + }; +}; + +},{}],8:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + var Assertion = chai.Assertion; + + function loadShould () { + // explicitly define this method as function as to have it's name to include as `ssfi` + function shouldGetter() { + if (this instanceof String || this instanceof Number || this instanceof Boolean ) { + return new Assertion(this.valueOf(), null, shouldGetter); + } + return new Assertion(this, null, shouldGetter); + } + function shouldSetter(value) { + // See https://github.com/chaijs/chai/issues/86: this makes + // `whatever.should = someValue` actually set `someValue`, which is + // especially useful for `global.should = require('chai').should()`. + // + // Note that we have to use [[DefineProperty]] instead of [[Put]] + // since otherwise we would trigger this very setter! + Object.defineProperty(this, 'should', { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } + // modify Object.prototype to have `should` + Object.defineProperty(Object.prototype, 'should', { + set: shouldSetter + , get: shouldGetter + , configurable: true + }); + + var should = {}; + + /** + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace Should + * @api public + */ + + should.fail = function (actual, expected, message, operator) { + message = message || 'should.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, should.fail); + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * should.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.equal(val2); + }; + + /** + * ### .throw(function, [constructor/string/regexp], [string/regexp], [message]) + * + * Asserts that `function` will throw an error that is an instance of + * `constructor`, or alternately that it will throw an error with message + * matching `regexp`. + * + * should.throw(fn, 'function throws a reference error'); + * should.throw(fn, /function throws a reference error/); + * should.throw(fn, ReferenceError); + * should.throw(fn, ReferenceError, 'function throws a reference error'); + * should.throw(fn, ReferenceError, /function throws a reference error/); + * + * @name throw + * @alias Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.Throw(errt, errs); + }; + + /** + * ### .exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi'; + * + * should.exist(foo, 'foo exists'); + * + * @name exist + * @namespace Should + * @api public + */ + + should.exist = function (val, msg) { + new Assertion(val, msg).to.exist; + } + + // negation + should.not = {} + + /** + * ### .not.equal(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * should.not.equal(3, 4, 'these numbers are not equal'); + * + * @name not.equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.not.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.not.equal(val2); + }; + + /** + * ### .throw(function, [constructor/regexp], [message]) + * + * Asserts that `function` will _not_ throw an error that is an instance of + * `constructor`, or alternately that it will not throw an error with message + * matching `regexp`. + * + * should.not.throw(fn, Error, 'function does not throw'); + * + * @name not.throw + * @alias not.Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.not.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.not.Throw(errt, errs); + }; + + /** + * ### .not.exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var bar = null; + * + * should.not.exist(bar, 'bar does not exist'); + * + * @name not.exist + * @namespace Should + * @api public + */ + + should.not.exist = function (val, msg) { + new Assertion(val, msg).to.not.exist; + } + + should['throw'] = should['Throw']; + should.not['throw'] = should.not['Throw']; + + return should; + }; + + chai.should = loadShould; + chai.Should = loadShould; +}; + +},{}],9:[function(require,module,exports){ +/*! + * Chai - addChainingMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var transferFlags = require('./transferFlags'); +var flag = require('./flag'); +var config = require('../config'); + +/*! + * Module variables + */ + +// Check whether `__proto__` is supported +var hasProtoSupport = '__proto__' in Object; + +// Without `__proto__` support, this module will need to add properties to a function. +// However, some Function.prototype methods cannot be overwritten, +// and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69). +var excludeNames = /^(?:length|name|arguments|caller)$/; + +// Cache `Function` properties +var call = Function.prototype.call, + apply = Function.prototype.apply; + +/** + * ### addChainableMethod (ctx, name, method, chainingBehavior) + * + * Adds a method to an object, such that the method can also be chained. + * + * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); + * + * The result can then be used as both a method assertion, executing both `method` and + * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. + * + * expect(fooStr).to.be.foo('bar'); + * expect(fooStr).to.be.foo.equal('foo'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for `name`, when called + * @param {Function} chainingBehavior function to be called every time the property is accessed + * @namespace Utils + * @name addChainableMethod + * @api public + */ + +module.exports = function (ctx, name, method, chainingBehavior) { + if (typeof chainingBehavior !== 'function') { + chainingBehavior = function () { }; + } + + var chainableBehavior = { + method: method + , chainingBehavior: chainingBehavior + }; + + // save the methods so we can overwrite them later, if we need to. + if (!ctx.__methods) { + ctx.__methods = {}; + } + ctx.__methods[name] = chainableBehavior; + + Object.defineProperty(ctx, name, + { get: function () { + chainableBehavior.chainingBehavior.call(this); + + var assert = function assert() { + var old_ssfi = flag(this, 'ssfi'); + if (old_ssfi && config.includeStack === false) + flag(this, 'ssfi', assert); + var result = chainableBehavior.method.apply(this, arguments); + return result === undefined ? this : result; + }; + + // Use `__proto__` if available + if (hasProtoSupport) { + // Inherit all properties from the object by replacing the `Function` prototype + var prototype = assert.__proto__ = Object.create(this); + // Restore the `call` and `apply` methods from `Function` + prototype.call = call; + prototype.apply = apply; + } + // Otherwise, redefine all properties (slow!) + else { + var asserterNames = Object.getOwnPropertyNames(ctx); + asserterNames.forEach(function (asserterName) { + if (!excludeNames.test(asserterName)) { + var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); + Object.defineProperty(assert, asserterName, pd); + } + }); + } + + transferFlags(this, assert); + return assert; + } + , configurable: true + }); +}; + +},{"../config":4,"./flag":13,"./transferFlags":29}],10:[function(require,module,exports){ +/*! + * Chai - addMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var config = require('../config'); + +/** + * ### .addMethod (ctx, name, method) + * + * Adds a method to the prototype of an object. + * + * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(fooStr).to.be.foo('bar'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for name + * @namespace Utils + * @name addMethod + * @api public + */ +var flag = require('./flag'); + +module.exports = function (ctx, name, method) { + ctx[name] = function () { + var old_ssfi = flag(this, 'ssfi'); + if (old_ssfi && config.includeStack === false) + flag(this, 'ssfi', ctx[name]); + var result = method.apply(this, arguments); + return result === undefined ? this : result; + }; +}; + +},{"../config":4,"./flag":13}],11:[function(require,module,exports){ +/*! + * Chai - addProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var config = require('../config'); +var flag = require('./flag'); + +/** + * ### addProperty (ctx, name, getter) + * + * Adds a property to the prototype of an object. + * + * utils.addProperty(chai.Assertion.prototype, 'foo', function () { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.instanceof(Foo); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.foo; + * + * @param {Object} ctx object to which the property is added + * @param {String} name of property to add + * @param {Function} getter function to be used for name + * @namespace Utils + * @name addProperty + * @api public + */ + +module.exports = function (ctx, name, getter) { + Object.defineProperty(ctx, name, + { get: function addProperty() { + var old_ssfi = flag(this, 'ssfi'); + if (old_ssfi && config.includeStack === false) + flag(this, 'ssfi', addProperty); + + var result = getter.call(this); + return result === undefined ? this : result; + } + , configurable: true + }); +}; + +},{"../config":4,"./flag":13}],12:[function(require,module,exports){ +/*! + * Chai - expectTypes utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### expectTypes(obj, types) + * + * Ensures that the object being tested against is of a valid type. + * + * utils.expectTypes(this, ['array', 'object', 'string']); + * + * @param {Mixed} obj constructed Assertion + * @param {Array} type A list of allowed types for this assertion + * @namespace Utils + * @name expectTypes + * @api public + */ + +var AssertionError = require('assertion-error'); +var flag = require('./flag'); +var type = require('type-detect'); + +module.exports = function (obj, types) { + var obj = flag(obj, 'object'); + types = types.map(function (t) { return t.toLowerCase(); }); + types.sort(); + + // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum' + var str = types.map(function (t, index) { + var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a'; + var or = types.length > 1 && index === types.length - 1 ? 'or ' : ''; + return or + art + ' ' + t; + }).join(', '); + + if (!types.some(function (expected) { return type(obj) === expected; })) { + throw new AssertionError( + 'object tested must be ' + str + ', but ' + type(obj) + ' given' + ); + } +}; + +},{"./flag":13,"assertion-error":30,"type-detect":35}],13:[function(require,module,exports){ +/*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### flag(object, key, [value]) + * + * Get or set a flag value on an object. If a + * value is provided it will be set, else it will + * return the currently set value or `undefined` if + * the value is not set. + * + * utils.flag(this, 'foo', 'bar'); // setter + * utils.flag(this, 'foo'); // getter, returns `bar` + * + * @param {Object} object constructed Assertion + * @param {String} key + * @param {Mixed} value (optional) + * @namespace Utils + * @name flag + * @api private + */ + +module.exports = function (obj, key, value) { + var flags = obj.__flags || (obj.__flags = Object.create(null)); + if (arguments.length === 3) { + flags[key] = value; + } else { + return flags[key]; + } +}; + +},{}],14:[function(require,module,exports){ +/*! + * Chai - getActual utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * # getActual(object, [actual]) + * + * Returns the `actual` value for an Assertion + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getActual + */ + +module.exports = function (obj, args) { + return args.length > 4 ? args[4] : obj._obj; +}; + +},{}],15:[function(require,module,exports){ +/*! + * Chai - getEnumerableProperties utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .getEnumerableProperties(object) + * + * This allows the retrieval of enumerable property names of an object, + * inherited or not. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getEnumerableProperties + * @api public + */ + +module.exports = function getEnumerableProperties(object) { + var result = []; + for (var name in object) { + result.push(name); + } + return result; +}; + +},{}],16:[function(require,module,exports){ +/*! + * Chai - message composition utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependancies + */ + +var flag = require('./flag') + , getActual = require('./getActual') + , inspect = require('./inspect') + , objDisplay = require('./objDisplay'); + +/** + * ### .getMessage(object, message, negateMessage) + * + * Construct the error message based on flags + * and template tags. Template tags will return + * a stringified inspection of the object referenced. + * + * Message template tags: + * - `#{this}` current asserted object + * - `#{act}` actual value + * - `#{exp}` expected value + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getMessage + * @api public + */ + +module.exports = function (obj, args) { + var negate = flag(obj, 'negate') + , val = flag(obj, 'object') + , expected = args[3] + , actual = getActual(obj, args) + , msg = negate ? args[2] : args[1] + , flagMsg = flag(obj, 'message'); + + if(typeof msg === "function") msg = msg(); + msg = msg || ''; + msg = msg + .replace(/#\{this\}/g, function () { return objDisplay(val); }) + .replace(/#\{act\}/g, function () { return objDisplay(actual); }) + .replace(/#\{exp\}/g, function () { return objDisplay(expected); }); + + return flagMsg ? flagMsg + ': ' + msg : msg; +}; + +},{"./flag":13,"./getActual":14,"./inspect":23,"./objDisplay":24}],17:[function(require,module,exports){ +/*! + * Chai - getName utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * # getName(func) + * + * Gets the name of a function, in a cross-browser way. + * + * @param {Function} a function (usually a constructor) + * @namespace Utils + * @name getName + */ + +module.exports = function (func) { + if (func.name) return func.name; + + var match = /^\s?function ([^(]*)\(/.exec(func); + return match && match[1] ? match[1] : ""; +}; + +},{}],18:[function(require,module,exports){ +/*! + * Chai - getPathInfo utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var hasProperty = require('./hasProperty'); + +/** + * ### .getPathInfo(path, object) + * + * This allows the retrieval of property info in an + * object given a string path. + * + * The path info consists of an object with the + * following properties: + * + * * parent - The parent object of the property referenced by `path` + * * name - The name of the final property, a number if it was an array indexer + * * value - The value of the property, if it exists, otherwise `undefined` + * * exists - Whether the property exists or not + * + * @param {String} path + * @param {Object} object + * @returns {Object} info + * @namespace Utils + * @name getPathInfo + * @api public + */ + +module.exports = function getPathInfo(path, obj) { + var parsed = parsePath(path), + last = parsed[parsed.length - 1]; + + var info = { + parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) : obj, + name: last.p || last.i, + value: _getPathValue(parsed, obj) + }; + info.exists = hasProperty(info.name, info.parent); + + return info; +}; + + +/*! + * ## parsePath(path) + * + * Helper function used to parse string object + * paths. Use in conjunction with `_getPathValue`. + * + * var parsed = parsePath('myobject.property.subprop'); + * + * ### Paths: + * + * * Can be as near infinitely deep and nested + * * Arrays are also valid using the formal `myobject.document[3].property`. + * * Literal dots and brackets (not delimiter) must be backslash-escaped. + * + * @param {String} path + * @returns {Object} parsed + * @api private + */ + +function parsePath (path) { + var str = path.replace(/([^\\])\[/g, '$1.[') + , parts = str.match(/(\\\.|[^.]+?)+/g); + return parts.map(function (value) { + var re = /^\[(\d+)\]$/ + , mArr = re.exec(value); + if (mArr) return { i: parseFloat(mArr[1]) }; + else return { p: value.replace(/\\([.\[\]])/g, '$1') }; + }); +} + + +/*! + * ## _getPathValue(parsed, obj) + * + * Helper companion function for `.parsePath` that returns + * the value located at the parsed address. + * + * var value = getPathValue(parsed, obj); + * + * @param {Object} parsed definition from `parsePath`. + * @param {Object} object to search against + * @param {Number} object to search against + * @returns {Object|Undefined} value + * @api private + */ + +function _getPathValue (parsed, obj, index) { + var tmp = obj + , res; + + index = (index === undefined ? parsed.length : index); + + for (var i = 0, l = index; i < l; i++) { + var part = parsed[i]; + if (tmp) { + if ('undefined' !== typeof part.p) + tmp = tmp[part.p]; + else if ('undefined' !== typeof part.i) + tmp = tmp[part.i]; + if (i == (l - 1)) res = tmp; + } else { + res = undefined; + } + } + return res; +} + +},{"./hasProperty":21}],19:[function(require,module,exports){ +/*! + * Chai - getPathValue utility + * Copyright(c) 2012-2014 Jake Luer + * @see https://github.com/logicalparadox/filtr + * MIT Licensed + */ + +var getPathInfo = require('./getPathInfo'); + +/** + * ### .getPathValue(path, object) + * + * This allows the retrieval of values in an + * object given a string path. + * + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * } + * + * The following would be the results. + * + * getPathValue('prop1.str', obj); // Hello + * getPathValue('prop1.att[2]', obj); // b + * getPathValue('prop2.arr[0].nested', obj); // Universe + * + * @param {String} path + * @param {Object} object + * @returns {Object} value or `undefined` + * @namespace Utils + * @name getPathValue + * @api public + */ +module.exports = function(path, obj) { + var info = getPathInfo(path, obj); + return info.value; +}; + +},{"./getPathInfo":18}],20:[function(require,module,exports){ +/*! + * Chai - getProperties utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .getProperties(object) + * + * This allows the retrieval of property names of an object, enumerable or not, + * inherited or not. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getProperties + * @api public + */ + +module.exports = function getProperties(object) { + var result = Object.getOwnPropertyNames(object); + + function addProperty(property) { + if (result.indexOf(property) === -1) { + result.push(property); + } + } + + var proto = Object.getPrototypeOf(object); + while (proto !== null) { + Object.getOwnPropertyNames(proto).forEach(addProperty); + proto = Object.getPrototypeOf(proto); + } + + return result; +}; + +},{}],21:[function(require,module,exports){ +/*! + * Chai - hasProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var type = require('type-detect'); + +/** + * ### .hasProperty(object, name) + * + * This allows checking whether an object has + * named property or numeric array index. + * + * Basically does the same thing as the `in` + * operator but works properly with natives + * and null/undefined values. + * + * var obj = { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * + * The following would be the results. + * + * hasProperty('str', obj); // true + * hasProperty('constructor', obj); // true + * hasProperty('bar', obj); // false + * + * hasProperty('length', obj.str); // true + * hasProperty(1, obj.str); // true + * hasProperty(5, obj.str); // false + * + * hasProperty('length', obj.arr); // true + * hasProperty(2, obj.arr); // true + * hasProperty(3, obj.arr); // false + * + * @param {Objuect} object + * @param {String|Number} name + * @returns {Boolean} whether it exists + * @namespace Utils + * @name getPathInfo + * @api public + */ + +var literals = { + 'number': Number + , 'string': String +}; + +module.exports = function hasProperty(name, obj) { + var ot = type(obj); + + // Bad Object, obviously no props at all + if(ot === 'null' || ot === 'undefined') + return false; + + // The `in` operator does not work with certain literals + // box these before the check + if(literals[ot] && typeof obj !== 'object') + obj = new literals[ot](obj); + + return name in obj; +}; + +},{"type-detect":35}],22:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011 Jake Luer + * MIT Licensed + */ + +/*! + * Main exports + */ + +var exports = module.exports = {}; + +/*! + * test utility + */ + +exports.test = require('./test'); + +/*! + * type utility + */ + +exports.type = require('type-detect'); + +/*! + * expectTypes utility + */ +exports.expectTypes = require('./expectTypes'); + +/*! + * message utility + */ + +exports.getMessage = require('./getMessage'); + +/*! + * actual utility + */ + +exports.getActual = require('./getActual'); + +/*! + * Inspect util + */ + +exports.inspect = require('./inspect'); + +/*! + * Object Display util + */ + +exports.objDisplay = require('./objDisplay'); + +/*! + * Flag utility + */ + +exports.flag = require('./flag'); + +/*! + * Flag transferring utility + */ + +exports.transferFlags = require('./transferFlags'); + +/*! + * Deep equal utility + */ + +exports.eql = require('deep-eql'); + +/*! + * Deep path value + */ + +exports.getPathValue = require('./getPathValue'); + +/*! + * Deep path info + */ + +exports.getPathInfo = require('./getPathInfo'); + +/*! + * Check if a property exists + */ + +exports.hasProperty = require('./hasProperty'); + +/*! + * Function name + */ + +exports.getName = require('./getName'); + +/*! + * add Property + */ + +exports.addProperty = require('./addProperty'); + +/*! + * add Method + */ + +exports.addMethod = require('./addMethod'); + +/*! + * overwrite Property + */ + +exports.overwriteProperty = require('./overwriteProperty'); + +/*! + * overwrite Method + */ + +exports.overwriteMethod = require('./overwriteMethod'); + +/*! + * Add a chainable method + */ + +exports.addChainableMethod = require('./addChainableMethod'); + +/*! + * Overwrite chainable method + */ + +exports.overwriteChainableMethod = require('./overwriteChainableMethod'); + +},{"./addChainableMethod":9,"./addMethod":10,"./addProperty":11,"./expectTypes":12,"./flag":13,"./getActual":14,"./getMessage":16,"./getName":17,"./getPathInfo":18,"./getPathValue":19,"./hasProperty":21,"./inspect":23,"./objDisplay":24,"./overwriteChainableMethod":25,"./overwriteMethod":26,"./overwriteProperty":27,"./test":28,"./transferFlags":29,"deep-eql":31,"type-detect":35}],23:[function(require,module,exports){ +// This is (almost) directly from Node.js utils +// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js + +var getName = require('./getName'); +var getProperties = require('./getProperties'); +var getEnumerableProperties = require('./getEnumerableProperties'); + +module.exports = inspect; + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Boolean} showHidden Flag that shows hidden (not enumerable) + * properties of objects. + * @param {Number} depth Depth in which to descend in object. Default is 2. + * @param {Boolean} colors Flag to turn on ANSI escape codes to color the + * output. Default is false (no coloring). + * @namespace Utils + * @name inspect + */ +function inspect(obj, showHidden, depth, colors) { + var ctx = { + showHidden: showHidden, + seen: [], + stylize: function (str) { return str; } + }; + return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth)); +} + +// Returns true if object is a DOM element. +var isDOMElement = function (object) { + if (typeof HTMLElement === 'object') { + return object instanceof HTMLElement; + } else { + return object && + typeof object === 'object' && + object.nodeType === 1 && + typeof object.nodeName === 'string'; + } +}; + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (value && typeof value.inspect === 'function' && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes); + if (typeof ret !== 'string') { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // If this is a DOM element, try to get the outer HTML. + if (isDOMElement(value)) { + if ('outerHTML' in value) { + return value.outerHTML; + // This value does not have an outerHTML attribute, + // it could still be an XML element + } else { + // Attempt to serialize it + try { + if (document.xmlVersion) { + var xmlSerializer = new XMLSerializer(); + return xmlSerializer.serializeToString(value); + } else { + // Firefox 11- do not support outerHTML + // It does, however, support innerHTML + // Use the following to render the element + var ns = "http://www.w3.org/1999/xhtml"; + var container = document.createElementNS(ns, '_'); + + container.appendChild(value.cloneNode(false)); + html = container.innerHTML + .replace('><', '>' + value.innerHTML + '<'); + container.innerHTML = ''; + return html; + } + } catch (err) { + // This could be a non-native DOM implementation, + // continue with the normal flow: + // printing the element as if it is an object. + } + } + } + + // Look up the keys of the object. + var visibleKeys = getEnumerableProperties(value); + var keys = ctx.showHidden ? getProperties(value) : visibleKeys; + + // Some type of object without properties can be shortcutted. + // In IE, errors have a single `stack` property, or if they are vanilla `Error`, + // a `stack` plus `description` property; ignore those for consistency. + if (keys.length === 0 || (isError(value) && ( + (keys.length === 1 && keys[0] === 'stack') || + (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack') + ))) { + if (typeof value === 'function') { + var name = getName(value); + var nameSuffix = name ? ': ' + name : ''; + return ctx.stylize('[Function' + nameSuffix + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toUTCString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (typeof value === 'function') { + var name = getName(value); + var nameSuffix = name ? ': ' + name : ''; + base = ' [Function' + nameSuffix + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + return formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + switch (typeof value) { + case 'undefined': + return ctx.stylize('undefined', 'undefined'); + + case 'string': + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + + case 'number': + if (value === 0 && (1/value) === -Infinity) { + return ctx.stylize('-0', 'number'); + } + return ctx.stylize('' + value, 'number'); + + case 'boolean': + return ctx.stylize('' + value, 'boolean'); + } + // For some reason typeof null is "object", so special case here. + if (value === null) { + return ctx.stylize('null', 'null'); + } +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (Object.prototype.hasOwnProperty.call(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str; + if (value.__lookupGetter__) { + if (value.__lookupGetter__(key)) { + if (value.__lookupSetter__(key)) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (value.__lookupSetter__(key)) { + str = ctx.stylize('[Setter]', 'special'); + } + } + } + if (visibleKeys.indexOf(key) < 0) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(value[key]) < 0) { + if (recurseTimes === null) { + str = formatValue(ctx, value[key], null); + } else { + str = formatValue(ctx, value[key], recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (typeof name === 'undefined') { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + +function isArray(ar) { + return Array.isArray(ar) || + (typeof ar === 'object' && objectToString(ar) === '[object Array]'); +} + +function isRegExp(re) { + return typeof re === 'object' && objectToString(re) === '[object RegExp]'; +} + +function isDate(d) { + return typeof d === 'object' && objectToString(d) === '[object Date]'; +} + +function isError(e) { + return typeof e === 'object' && objectToString(e) === '[object Error]'; +} + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +},{"./getEnumerableProperties":15,"./getName":17,"./getProperties":20}],24:[function(require,module,exports){ +/*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependancies + */ + +var inspect = require('./inspect'); +var config = require('../config'); + +/** + * ### .objDisplay (object) + * + * Determines if an object or an array matches + * criteria to be inspected in-line for error + * messages or should be truncated. + * + * @param {Mixed} javascript object to inspect + * @name objDisplay + * @namespace Utils + * @api public + */ + +module.exports = function (obj) { + var str = inspect(obj) + , type = Object.prototype.toString.call(obj); + + if (config.truncateThreshold && str.length >= config.truncateThreshold) { + if (type === '[object Function]') { + return !obj.name || obj.name === '' + ? '[Function]' + : '[Function: ' + obj.name + ']'; + } else if (type === '[object Array]') { + return '[ Array(' + obj.length + ') ]'; + } else if (type === '[object Object]') { + var keys = Object.keys(obj) + , kstr = keys.length > 2 + ? keys.splice(0, 2).join(', ') + ', ...' + : keys.join(', '); + return '{ Object (' + kstr + ') }'; + } else { + return str; + } + } else { + return str; + } +}; + +},{"../config":4,"./inspect":23}],25:[function(require,module,exports){ +/*! + * Chai - overwriteChainableMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### overwriteChainableMethod (ctx, name, method, chainingBehavior) + * + * Overwites an already existing chainable method + * and provides access to the previous function or + * property. Must return functions to be used for + * name. + * + * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length', + * function (_super) { + * } + * , function (_super) { + * } + * ); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteChainableMethod('foo', fn, fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.have.length(3); + * expect(myFoo).to.have.length.above(3); + * + * @param {Object} ctx object whose method / property is to be overwritten + * @param {String} name of method / property to overwrite + * @param {Function} method function that returns a function to be used for name + * @param {Function} chainingBehavior function that returns a function to be used for property + * @namespace Utils + * @name overwriteChainableMethod + * @api public + */ + +module.exports = function (ctx, name, method, chainingBehavior) { + var chainableBehavior = ctx.__methods[name]; + + var _chainingBehavior = chainableBehavior.chainingBehavior; + chainableBehavior.chainingBehavior = function () { + var result = chainingBehavior(_chainingBehavior).call(this); + return result === undefined ? this : result; + }; + + var _method = chainableBehavior.method; + chainableBehavior.method = function () { + var result = method(_method).apply(this, arguments); + return result === undefined ? this : result; + }; +}; + +},{}],26:[function(require,module,exports){ +/*! + * Chai - overwriteMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### overwriteMethod (ctx, name, fn) + * + * Overwites an already existing method and provides + * access to previous function. Must return function + * to be used for name. + * + * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { + * return function (str) { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.value).to.equal(str); + * } else { + * _super.apply(this, arguments); + * } + * } + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.equal('bar'); + * + * @param {Object} ctx object whose method is to be overwritten + * @param {String} name of method to overwrite + * @param {Function} method function that returns a function to be used for name + * @namespace Utils + * @name overwriteMethod + * @api public + */ + +module.exports = function (ctx, name, method) { + var _method = ctx[name] + , _super = function () { return this; }; + + if (_method && 'function' === typeof _method) + _super = _method; + + ctx[name] = function () { + var result = method(_super).apply(this, arguments); + return result === undefined ? this : result; + } +}; + +},{}],27:[function(require,module,exports){ +/*! + * Chai - overwriteProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### overwriteProperty (ctx, name, fn) + * + * Overwites an already existing property getter and provides + * access to previous value. Must return function to use as getter. + * + * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { + * return function () { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.name).to.equal('bar'); + * } else { + * _super.call(this); + * } + * } + * }); + * + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.ok; + * + * @param {Object} ctx object whose property is to be overwritten + * @param {String} name of property to overwrite + * @param {Function} getter function that returns a getter function to be used for name + * @namespace Utils + * @name overwriteProperty + * @api public + */ + +module.exports = function (ctx, name, getter) { + var _get = Object.getOwnPropertyDescriptor(ctx, name) + , _super = function () {}; + + if (_get && 'function' === typeof _get.get) + _super = _get.get + + Object.defineProperty(ctx, name, + { get: function () { + var result = getter(_super).call(this); + return result === undefined ? this : result; + } + , configurable: true + }); +}; + +},{}],28:[function(require,module,exports){ +/*! + * Chai - test utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependancies + */ + +var flag = require('./flag'); + +/** + * # test(object, expression) + * + * Test and object for expression. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name test + */ + +module.exports = function (obj, args) { + var negate = flag(obj, 'negate') + , expr = args[0]; + return negate ? !expr : expr; +}; + +},{"./flag":13}],29:[function(require,module,exports){ +/*! + * Chai - transferFlags utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### transferFlags(assertion, object, includeAll = true) + * + * Transfer all the flags for `assertion` to `object`. If + * `includeAll` is set to `false`, then the base Chai + * assertion flags (namely `object`, `ssfi`, and `message`) + * will not be transferred. + * + * + * var newAssertion = new Assertion(); + * utils.transferFlags(assertion, newAssertion); + * + * var anotherAsseriton = new Assertion(myObj); + * utils.transferFlags(assertion, anotherAssertion, false); + * + * @param {Assertion} assertion the assertion to transfer the flags from + * @param {Object} object the object to transfer the flags to; usually a new assertion + * @param {Boolean} includeAll + * @namespace Utils + * @name transferFlags + * @api private + */ + +module.exports = function (assertion, object, includeAll) { + var flags = assertion.__flags || (assertion.__flags = Object.create(null)); + + if (!object.__flags) { + object.__flags = Object.create(null); + } + + includeAll = arguments.length === 3 ? includeAll : true; + + for (var flag in flags) { + if (includeAll || + (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) { + object.__flags[flag] = flags[flag]; + } + } +}; + +},{}],30:[function(require,module,exports){ +/*! + * assertion-error + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +/*! + * Return a function that will copy properties from + * one object to another excluding any originally + * listed. Returned function will create a new `{}`. + * + * @param {String} excluded properties ... + * @return {Function} + */ + +function exclude () { + var excludes = [].slice.call(arguments); + + function excludeProps (res, obj) { + Object.keys(obj).forEach(function (key) { + if (!~excludes.indexOf(key)) res[key] = obj[key]; + }); + } + + return function extendExclude () { + var args = [].slice.call(arguments) + , i = 0 + , res = {}; + + for (; i < args.length; i++) { + excludeProps(res, args[i]); + } + + return res; + }; +}; + +/*! + * Primary Exports + */ + +module.exports = AssertionError; + +/** + * ### AssertionError + * + * An extension of the JavaScript `Error` constructor for + * assertion and validation scenarios. + * + * @param {String} message + * @param {Object} properties to include (optional) + * @param {callee} start stack function (optional) + */ + +function AssertionError (message, _props, ssf) { + var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') + , props = extend(_props || {}); + + // default values + this.message = message || 'Unspecified AssertionError'; + this.showDiff = false; + + // copy from properties + for (var key in props) { + this[key] = props[key]; + } + + // capture stack trace + ssf = ssf || arguments.callee; + if (ssf && Error.captureStackTrace) { + Error.captureStackTrace(this, ssf); + } else { + this.stack = new Error().stack; + } +} + +/*! + * Inherit from Error.prototype + */ + +AssertionError.prototype = Object.create(Error.prototype); + +/*! + * Statically set name + */ + +AssertionError.prototype.name = 'AssertionError'; + +/*! + * Ensure correct constructor + */ + +AssertionError.prototype.constructor = AssertionError; + +/** + * Allow errors to be converted to JSON for static transfer. + * + * @param {Boolean} include stack (default: `true`) + * @return {Object} object that can be `JSON.stringify` + */ + +AssertionError.prototype.toJSON = function (stack) { + var extend = exclude('constructor', 'toJSON', 'stack') + , props = extend({ name: this.name }, this); + + // include stack if exists and not turned off + if (false !== stack && this.stack) { + props.stack = this.stack; + } + + return props; +}; + +},{}],31:[function(require,module,exports){ +module.exports = require('./lib/eql'); + +},{"./lib/eql":32}],32:[function(require,module,exports){ +/*! + * deep-eql + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var type = require('type-detect'); + +/*! + * Buffer.isBuffer browser shim + */ + +var Buffer; +try { Buffer = require('buffer').Buffer; } +catch(ex) { + Buffer = {}; + Buffer.isBuffer = function() { return false; } +} + +/*! + * Primary Export + */ + +module.exports = deepEqual; + +/** + * Assert super-strict (egal) equality between + * two objects of any type. + * + * @param {Mixed} a + * @param {Mixed} b + * @param {Array} memoised (optional) + * @return {Boolean} equal match + */ + +function deepEqual(a, b, m) { + if (sameValue(a, b)) { + return true; + } else if ('date' === type(a)) { + return dateEqual(a, b); + } else if ('regexp' === type(a)) { + return regexpEqual(a, b); + } else if (Buffer.isBuffer(a)) { + return bufferEqual(a, b); + } else if ('arguments' === type(a)) { + return argumentsEqual(a, b, m); + } else if (!typeEqual(a, b)) { + return false; + } else if (('object' !== type(a) && 'object' !== type(b)) + && ('array' !== type(a) && 'array' !== type(b))) { + return sameValue(a, b); + } else { + return objectEqual(a, b, m); + } +} + +/*! + * Strict (egal) equality test. Ensures that NaN always + * equals NaN and `-0` does not equal `+0`. + * + * @param {Mixed} a + * @param {Mixed} b + * @return {Boolean} equal match + */ + +function sameValue(a, b) { + if (a === b) return a !== 0 || 1 / a === 1 / b; + return a !== a && b !== b; +} + +/*! + * Compare the types of two given objects and + * return if they are equal. Note that an Array + * has a type of `array` (not `object`) and arguments + * have a type of `arguments` (not `array`/`object`). + * + * @param {Mixed} a + * @param {Mixed} b + * @return {Boolean} result + */ + +function typeEqual(a, b) { + return type(a) === type(b); +} + +/*! + * Compare two Date objects by asserting that + * the time values are equal using `saveValue`. + * + * @param {Date} a + * @param {Date} b + * @return {Boolean} result + */ + +function dateEqual(a, b) { + if ('date' !== type(b)) return false; + return sameValue(a.getTime(), b.getTime()); +} + +/*! + * Compare two regular expressions by converting them + * to string and checking for `sameValue`. + * + * @param {RegExp} a + * @param {RegExp} b + * @return {Boolean} result + */ + +function regexpEqual(a, b) { + if ('regexp' !== type(b)) return false; + return sameValue(a.toString(), b.toString()); +} + +/*! + * Assert deep equality of two `arguments` objects. + * Unfortunately, these must be sliced to arrays + * prior to test to ensure no bad behavior. + * + * @param {Arguments} a + * @param {Arguments} b + * @param {Array} memoize (optional) + * @return {Boolean} result + */ + +function argumentsEqual(a, b, m) { + if ('arguments' !== type(b)) return false; + a = [].slice.call(a); + b = [].slice.call(b); + return deepEqual(a, b, m); +} + +/*! + * Get enumerable properties of a given object. + * + * @param {Object} a + * @return {Array} property names + */ + +function enumerable(a) { + var res = []; + for (var key in a) res.push(key); + return res; +} + +/*! + * Simple equality for flat iterable objects + * such as Arrays or Node.js buffers. + * + * @param {Iterable} a + * @param {Iterable} b + * @return {Boolean} result + */ + +function iterableEqual(a, b) { + if (a.length !== b.length) return false; + + var i = 0; + var match = true; + + for (; i < a.length; i++) { + if (a[i] !== b[i]) { + match = false; + break; + } + } + + return match; +} + +/*! + * Extension to `iterableEqual` specifically + * for Node.js Buffers. + * + * @param {Buffer} a + * @param {Mixed} b + * @return {Boolean} result + */ + +function bufferEqual(a, b) { + if (!Buffer.isBuffer(b)) return false; + return iterableEqual(a, b); +} + +/*! + * Block for `objectEqual` ensuring non-existing + * values don't get in. + * + * @param {Mixed} object + * @return {Boolean} result + */ + +function isValue(a) { + return a !== null && a !== undefined; +} + +/*! + * Recursively check the equality of two objects. + * Once basic sameness has been established it will + * defer to `deepEqual` for each enumerable key + * in the object. + * + * @param {Mixed} a + * @param {Mixed} b + * @return {Boolean} result + */ + +function objectEqual(a, b, m) { + if (!isValue(a) || !isValue(b)) { + return false; + } + + if (a.prototype !== b.prototype) { + return false; + } + + var i; + if (m) { + for (i = 0; i < m.length; i++) { + if ((m[i][0] === a && m[i][1] === b) + || (m[i][0] === b && m[i][1] === a)) { + return true; + } + } + } else { + m = []; + } + + try { + var ka = enumerable(a); + var kb = enumerable(b); + } catch (ex) { + return false; + } + + ka.sort(); + kb.sort(); + + if (!iterableEqual(ka, kb)) { + return false; + } + + m.push([ a, b ]); + + var key; + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!deepEqual(a[key], b[key], m)) { + return false; + } + } + + return true; +} + +},{"buffer":undefined,"type-detect":33}],33:[function(require,module,exports){ +module.exports = require('./lib/type'); + +},{"./lib/type":34}],34:[function(require,module,exports){ +/*! + * type-detect + * Copyright(c) 2013 jake luer + * MIT Licensed + */ + +/*! + * Primary Exports + */ + +var exports = module.exports = getType; + +/*! + * Detectable javascript natives + */ + +var natives = { + '[object Array]': 'array' + , '[object RegExp]': 'regexp' + , '[object Function]': 'function' + , '[object Arguments]': 'arguments' + , '[object Date]': 'date' +}; + +/** + * ### typeOf (obj) + * + * Use several different techniques to determine + * the type of object being tested. + * + * + * @param {Mixed} object + * @return {String} object type + * @api public + */ + +function getType (obj) { + var str = Object.prototype.toString.call(obj); + if (natives[str]) return natives[str]; + if (obj === null) return 'null'; + if (obj === undefined) return 'undefined'; + if (obj === Object(obj)) return 'object'; + return typeof obj; +} + +exports.Library = Library; + +/** + * ### Library + * + * Create a repository for custom type detection. + * + * ```js + * var lib = new type.Library; + * ``` + * + */ + +function Library () { + this.tests = {}; +} + +/** + * #### .of (obj) + * + * Expose replacement `typeof` detection to the library. + * + * ```js + * if ('string' === lib.of('hello world')) { + * // ... + * } + * ``` + * + * @param {Mixed} object to test + * @return {String} type + */ + +Library.prototype.of = getType; + +/** + * #### .define (type, test) + * + * Add a test to for the `.test()` assertion. + * + * Can be defined as a regular expression: + * + * ```js + * lib.define('int', /^[0-9]+$/); + * ``` + * + * ... or as a function: + * + * ```js + * lib.define('bln', function (obj) { + * if ('boolean' === lib.of(obj)) return true; + * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ]; + * if ('string' === lib.of(obj)) obj = obj.toLowerCase(); + * return !! ~blns.indexOf(obj); + * }); + * ``` + * + * @param {String} type + * @param {RegExp|Function} test + * @api public + */ + +Library.prototype.define = function (type, test) { + if (arguments.length === 1) return this.tests[type]; + this.tests[type] = test; + return this; +}; + +/** + * #### .test (obj, test) + * + * Assert that an object is of type. Will first + * check natives, and if that does not pass it will + * use the user defined custom tests. + * + * ```js + * assert(lib.test('1', 'int')); + * assert(lib.test('yes', 'bln')); + * ``` + * + * @param {Mixed} object + * @param {String} type + * @return {Boolean} result + * @api public + */ + +Library.prototype.test = function (obj, type) { + if (type === getType(obj)) return true; + var test = this.tests[type]; + + if (test && 'regexp' === getType(test)) { + return test.test(obj); + } else if (test && 'function' === getType(test)) { + return test(obj); + } else { + throw new ReferenceError('Type test "' + type + '" not defined or invalid.'); + } +}; + +},{}],35:[function(require,module,exports){ +arguments[4][33][0].apply(exports,arguments) +},{"./lib/type":36,"dup":33}],36:[function(require,module,exports){ +/*! + * type-detect + * Copyright(c) 2013 jake luer + * MIT Licensed + */ + +/*! + * Primary Exports + */ + +var exports = module.exports = getType; + +/** + * ### typeOf (obj) + * + * Use several different techniques to determine + * the type of object being tested. + * + * + * @param {Mixed} object + * @return {String} object type + * @api public + */ +var objectTypeRegexp = /^\[object (.*)\]$/; + +function getType(obj) { + var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLowerCase(); + // Let "new String('')" return 'object' + if (typeof Promise === 'function' && obj instanceof Promise) return 'promise'; + // PhantomJS has type "DOMWindow" for null + if (obj === null) return 'null'; + // PhantomJS has type "DOMWindow" for undefined + if (obj === undefined) return 'undefined'; + return type; +} + +exports.Library = Library; + +/** + * ### Library + * + * Create a repository for custom type detection. + * + * ```js + * var lib = new type.Library; + * ``` + * + */ + +function Library() { + if (!(this instanceof Library)) return new Library(); + this.tests = {}; +} + +/** + * #### .of (obj) + * + * Expose replacement `typeof` detection to the library. + * + * ```js + * if ('string' === lib.of('hello world')) { + * // ... + * } + * ``` + * + * @param {Mixed} object to test + * @return {String} type + */ + +Library.prototype.of = getType; + +/** + * #### .define (type, test) + * + * Add a test to for the `.test()` assertion. + * + * Can be defined as a regular expression: + * + * ```js + * lib.define('int', /^[0-9]+$/); + * ``` + * + * ... or as a function: + * + * ```js + * lib.define('bln', function (obj) { + * if ('boolean' === lib.of(obj)) return true; + * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ]; + * if ('string' === lib.of(obj)) obj = obj.toLowerCase(); + * return !! ~blns.indexOf(obj); + * }); + * ``` + * + * @param {String} type + * @param {RegExp|Function} test + * @api public + */ + +Library.prototype.define = function(type, test) { + if (arguments.length === 1) return this.tests[type]; + this.tests[type] = test; + return this; +}; + +/** + * #### .test (obj, test) + * + * Assert that an object is of type. Will first + * check natives, and if that does not pass it will + * use the user defined custom tests. + * + * ```js + * assert(lib.test('1', 'int')); + * assert(lib.test('yes', 'bln')); + * ``` + * + * @param {Mixed} object + * @param {String} type + * @return {Boolean} result + * @api public + */ + +Library.prototype.test = function(obj, type) { + if (type === getType(obj)) return true; + var test = this.tests[type]; + + if (test && 'regexp' === getType(test)) { + return test.test(obj); + } else if (test && 'function' === getType(test)) { + return test(obj); + } else { + throw new ReferenceError('Type test "' + type + '" not defined or invalid.'); + } +}; + +},{}]},{},[1])(1) +}); diff --git a/bower_components/blueimp-canvas-to-blob/test/vendor/load-image.js b/bower_components/blueimp-canvas-to-blob/test/vendor/load-image.js new file mode 100644 index 0000000000..e7fe73c960 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/test/vendor/load-image.js @@ -0,0 +1,364 @@ +/* + * JavaScript Load Image + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, URL, webkitURL, FileReader */ + +;(function ($) { + 'use strict' + + // Loads an image for a given File object. + // Invokes the callback with an img or optional canvas + // element (if supported by the browser) as parameter: + function loadImage (file, callback, options) { + var img = document.createElement('img') + var url + img.onerror = function (event) { + return loadImage.onerror(img, event, file, callback, options) + } + img.onload = function (event) { + return loadImage.onload(img, event, file, callback, options) + } + if (loadImage.isInstanceOf('Blob', file) || + // Files are also Blob instances, but some browsers + // (Firefox 3.6) support the File API but not Blobs: + loadImage.isInstanceOf('File', file)) { + url = img._objectURL = loadImage.createObjectURL(file) + } else if (typeof file === 'string') { + url = file + if (options && options.crossOrigin) { + img.crossOrigin = options.crossOrigin + } + } else { + return false + } + if (url) { + img.src = url + return img + } + return loadImage.readFile(file, function (e) { + var target = e.target + if (target && target.result) { + img.src = target.result + } else if (callback) { + callback(e) + } + }) + } + // The check for URL.revokeObjectURL fixes an issue with Opera 12, + // which provides URL.createObjectURL but doesn't properly implement it: + var urlAPI = (window.createObjectURL && window) || + (window.URL && URL.revokeObjectURL && URL) || + (window.webkitURL && webkitURL) + + function revokeHelper (img, options) { + if (img._objectURL && !(options && options.noRevoke)) { + loadImage.revokeObjectURL(img._objectURL) + delete img._objectURL + } + } + + loadImage.isInstanceOf = function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']' + } + + loadImage.transform = function (img, options, callback, file, data) { + callback(loadImage.scale(img, options, data), data) + } + + loadImage.onerror = function (img, event, file, callback, options) { + revokeHelper(img, options) + if (callback) { + callback.call(img, event) + } + } + + loadImage.onload = function (img, event, file, callback, options) { + revokeHelper(img, options) + if (callback) { + loadImage.transform(img, options, callback, file, {}) + } + } + + // Transform image coordinates, allows to override e.g. + // the canvas orientation based on the orientation option, + // gets canvas, options passed as arguments: + loadImage.transformCoordinates = function () { + return + } + + // Returns transformed options, allows to override e.g. + // maxWidth, maxHeight and crop options based on the aspectRatio. + // gets img, options passed as arguments: + loadImage.getTransformedOptions = function (img, options) { + var aspectRatio = options.aspectRatio + var newOptions + var i + var width + var height + if (!aspectRatio) { + return options + } + newOptions = {} + for (i in options) { + if (options.hasOwnProperty(i)) { + newOptions[i] = options[i] + } + } + newOptions.crop = true + width = img.naturalWidth || img.width + height = img.naturalHeight || img.height + if (width / height > aspectRatio) { + newOptions.maxWidth = height * aspectRatio + newOptions.maxHeight = height + } else { + newOptions.maxWidth = width + newOptions.maxHeight = width / aspectRatio + } + return newOptions + } + + // Canvas render method, allows to implement a different rendering algorithm: + loadImage.renderImageToCanvas = function ( + canvas, + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + destX, + destY, + destWidth, + destHeight + ) { + canvas.getContext('2d').drawImage( + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + destX, + destY, + destWidth, + destHeight + ) + return canvas + } + + // Determines if the target image should be a canvas element: + loadImage.hasCanvasOption = function (options) { + return options.canvas || options.crop || !!options.aspectRatio + } + + // Scales and/or crops the given image (img or canvas HTML element) + // using the given options. + // Returns a canvas object if the browser supports canvas + // and the hasCanvasOption method returns true or a canvas + // object is passed as image, else the scaled image: + loadImage.scale = function (img, options, data) { + options = options || {} + var canvas = document.createElement('canvas') + var useCanvas = img.getContext || + (loadImage.hasCanvasOption(options) && canvas.getContext) + var width = img.naturalWidth || img.width + var height = img.naturalHeight || img.height + var destWidth = width + var destHeight = height + var maxWidth + var maxHeight + var minWidth + var minHeight + var sourceWidth + var sourceHeight + var sourceX + var sourceY + var pixelRatio + var downsamplingRatio + var tmp + function scaleUp () { + var scale = Math.max( + (minWidth || destWidth) / destWidth, + (minHeight || destHeight) / destHeight + ) + if (scale > 1) { + destWidth *= scale + destHeight *= scale + } + } + function scaleDown () { + var scale = Math.min( + (maxWidth || destWidth) / destWidth, + (maxHeight || destHeight) / destHeight + ) + if (scale < 1) { + destWidth *= scale + destHeight *= scale + } + } + if (useCanvas) { + options = loadImage.getTransformedOptions(img, options, data) + sourceX = options.left || 0 + sourceY = options.top || 0 + if (options.sourceWidth) { + sourceWidth = options.sourceWidth + if (options.right !== undefined && options.left === undefined) { + sourceX = width - sourceWidth - options.right + } + } else { + sourceWidth = width - sourceX - (options.right || 0) + } + if (options.sourceHeight) { + sourceHeight = options.sourceHeight + if (options.bottom !== undefined && options.top === undefined) { + sourceY = height - sourceHeight - options.bottom + } + } else { + sourceHeight = height - sourceY - (options.bottom || 0) + } + destWidth = sourceWidth + destHeight = sourceHeight + } + maxWidth = options.maxWidth + maxHeight = options.maxHeight + minWidth = options.minWidth + minHeight = options.minHeight + if (useCanvas && maxWidth && maxHeight && options.crop) { + destWidth = maxWidth + destHeight = maxHeight + tmp = sourceWidth / sourceHeight - maxWidth / maxHeight + if (tmp < 0) { + sourceHeight = maxHeight * sourceWidth / maxWidth + if (options.top === undefined && options.bottom === undefined) { + sourceY = (height - sourceHeight) / 2 + } + } else if (tmp > 0) { + sourceWidth = maxWidth * sourceHeight / maxHeight + if (options.left === undefined && options.right === undefined) { + sourceX = (width - sourceWidth) / 2 + } + } + } else { + if (options.contain || options.cover) { + minWidth = maxWidth = maxWidth || minWidth + minHeight = maxHeight = maxHeight || minHeight + } + if (options.cover) { + scaleDown() + scaleUp() + } else { + scaleUp() + scaleDown() + } + } + if (useCanvas) { + pixelRatio = options.pixelRatio + if (pixelRatio > 1) { + canvas.style.width = destWidth + 'px' + canvas.style.height = destHeight + 'px' + destWidth *= pixelRatio + destHeight *= pixelRatio + canvas.getContext('2d').scale(pixelRatio, pixelRatio) + } + downsamplingRatio = options.downsamplingRatio + if (downsamplingRatio > 0 && downsamplingRatio < 1 && + destWidth < sourceWidth && destHeight < sourceHeight) { + while (sourceWidth * downsamplingRatio > destWidth) { + canvas.width = sourceWidth * downsamplingRatio + canvas.height = sourceHeight * downsamplingRatio + loadImage.renderImageToCanvas( + canvas, + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + 0, + 0, + canvas.width, + canvas.height + ) + sourceWidth = canvas.width + sourceHeight = canvas.height + img = document.createElement('canvas') + img.width = sourceWidth + img.height = sourceHeight + loadImage.renderImageToCanvas( + img, + canvas, + 0, + 0, + sourceWidth, + sourceHeight, + 0, + 0, + sourceWidth, + sourceHeight + ) + } + } + canvas.width = destWidth + canvas.height = destHeight + loadImage.transformCoordinates( + canvas, + options + ) + return loadImage.renderImageToCanvas( + canvas, + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + 0, + 0, + destWidth, + destHeight + ) + } + img.width = destWidth + img.height = destHeight + return img + } + + loadImage.createObjectURL = function (file) { + return urlAPI ? urlAPI.createObjectURL(file) : false + } + + loadImage.revokeObjectURL = function (url) { + return urlAPI ? urlAPI.revokeObjectURL(url) : false + } + + // Loads a given File object via FileReader interface, + // invokes the callback with the event object (load or error). + // The result can be read via event.target.result: + loadImage.readFile = function (file, callback, method) { + if (window.FileReader) { + var fileReader = new FileReader() + fileReader.onload = fileReader.onerror = callback + method = method || 'readAsDataURL' + if (fileReader[method]) { + fileReader[method](file) + return fileReader + } + } + return false + } + + if (typeof define === 'function' && define.amd) { + define(function () { + return loadImage + }) + } else if (typeof module === 'object' && module.exports) { + module.exports = loadImage + } else { + $.loadImage = loadImage + } +}(window)) diff --git a/bower_components/blueimp-canvas-to-blob/test/vendor/mocha.css b/bower_components/blueimp-canvas-to-blob/test/vendor/mocha.css new file mode 100644 index 0000000000..ec96b003c9 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/test/vendor/mocha.css @@ -0,0 +1,326 @@ +@charset "utf-8"; + +body { + margin:0; +} + +#mocha { + font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + margin: 60px 50px; +} + +#mocha ul, +#mocha li { + margin: 0; + padding: 0; +} + +#mocha ul { + list-style: none; +} + +#mocha h1, +#mocha h2 { + margin: 0; +} + +#mocha h1 { + margin-top: 15px; + font-size: 1em; + font-weight: 200; +} + +#mocha h1 a { + text-decoration: none; + color: inherit; +} + +#mocha h1 a:hover { + text-decoration: underline; +} + +#mocha .suite .suite h1 { + margin-top: 0; + font-size: .8em; +} + +#mocha .hidden { + display: none; +} + +#mocha h2 { + font-size: 12px; + font-weight: normal; + cursor: pointer; +} + +#mocha .suite { + margin-left: 15px; +} + +#mocha .test { + margin-left: 15px; + overflow: hidden; +} + +#mocha .test.pending:hover h2::after { + content: '(pending)'; + font-family: arial, sans-serif; +} + +#mocha .test.pass.medium .duration { + background: #c09853; +} + +#mocha .test.pass.slow .duration { + background: #b94a48; +} + +#mocha .test.pass::before { + content: '✓'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #00d6b2; +} + +#mocha .test.pass .duration { + font-size: 9px; + margin-left: 5px; + padding: 2px 5px; + color: #fff; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +#mocha .test.pass.fast .duration { + display: none; +} + +#mocha .test.pending { + color: #0b97c4; +} + +#mocha .test.pending::before { + content: '◦'; + color: #0b97c4; +} + +#mocha .test.fail { + color: #c00; +} + +#mocha .test.fail pre { + color: black; +} + +#mocha .test.fail::before { + content: '✖'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #c00; +} + +#mocha .test pre.error { + color: #c00; + max-height: 300px; + overflow: auto; +} + +#mocha .test .html-error { + overflow: auto; + color: black; + line-height: 1.5; + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); + max-width: calc(100% - 42px); /*(2)*/ + max-height: 300px; + word-wrap: break-word; + border-bottom-color: #ddd; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-box-shadow: 0 1px 3px #eee; + box-shadow: 0 1px 3px #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#mocha .test .html-error pre.error { + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: 0; + -moz-box-shadow: 0; + box-shadow: 0; + padding: 0; + margin: 0; + margin-top: 18px; + max-height: none; +} + +/** + * (1): approximate for browsers not supporting calc + * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) + * ^^ seriously + */ +#mocha .test pre { + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); + max-width: calc(100% - 42px); /*(2)*/ + word-wrap: break-word; + border-bottom-color: #ddd; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-box-shadow: 0 1px 3px #eee; + box-shadow: 0 1px 3px #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#mocha .test h2 { + position: relative; +} + +#mocha .test a.replay { + position: absolute; + top: 3px; + right: 0; + text-decoration: none; + vertical-align: middle; + display: block; + width: 15px; + height: 15px; + line-height: 15px; + text-align: center; + background: #eee; + font-size: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + -webkit-transition:opacity 200ms; + -moz-transition:opacity 200ms; + -o-transition:opacity 200ms; + transition: opacity 200ms; + opacity: 0.3; + color: #888; +} + +#mocha .test:hover a.replay { + opacity: 1; +} + +#mocha-report.pass .test.fail { + display: none; +} + +#mocha-report.fail .test.pass { + display: none; +} + +#mocha-report.pending .test.pass, +#mocha-report.pending .test.fail { + display: none; +} +#mocha-report.pending .test.pass.pending { + display: block; +} + +#mocha-error { + color: #c00; + font-size: 1.5em; + font-weight: 100; + letter-spacing: 1px; +} + +#mocha-stats { + position: fixed; + top: 15px; + right: 10px; + font-size: 12px; + margin: 0; + color: #888; + z-index: 1; +} + +#mocha-stats .progress { + float: right; + padding-top: 0; + + /** + * Set safe initial values, so mochas .progress does not inherit these + * properties from Bootstrap .progress (which causes .progress height to + * equal line height set in Bootstrap). + */ + height: auto; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background-color: initial; +} + +#mocha-stats em { + color: black; +} + +#mocha-stats a { + text-decoration: none; + color: inherit; +} + +#mocha-stats a:hover { + border-bottom: 1px solid #eee; +} + +#mocha-stats li { + display: inline-block; + margin: 0 5px; + list-style: none; + padding-top: 11px; +} + +#mocha-stats canvas { + width: 40px; + height: 40px; +} + +#mocha code .comment { color: #ddd; } +#mocha code .init { color: #2f6fad; } +#mocha code .string { color: #5890ad; } +#mocha code .keyword { color: #8a6343; } +#mocha code .number { color: #2f6fad; } + +@media screen and (max-device-width: 480px) { + #mocha { + margin: 60px 0px; + } + + #mocha #stats { + position: absolute; + } +} diff --git a/bower_components/blueimp-canvas-to-blob/test/vendor/mocha.js b/bower_components/blueimp-canvas-to-blob/test/vendor/mocha.js new file mode 100644 index 0000000000..a1ec48fb93 --- /dev/null +++ b/bower_components/blueimp-canvas-to-blob/test/vendor/mocha.js @@ -0,0 +1,15466 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { + suites.shift(); + } + return common.suite.create({ + title: title, + file: file, + fn: false + }); + }; + + /** + * Exclusive Suite. + */ + + context.suite.only = function(title) { + if (suites.length > 1) { + suites.shift(); + } + return common.suite.only({ + title: title, + file: file, + fn: false + }); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function(title, fn) { + var test = new Test(title, fn); + test.file = file; + suites[0].addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn) { + return common.test.only(mocha, context.test(title, fn)); + }; + + context.test.skip = common.test.skip; + context.test.retries = common.test.retries; + }); +}; + +},{"../test":36,"./common":9}],13:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var Test = require('../test'); + +/** + * TDD-style interface: + * + * suite('Array', function() { + * suite('#indexOf()', function() { + * suiteSetup(function() { + * + * }); + * + * test('should return -1 when not present', function() { + * + * }); + * + * test('should return the index when present', function() { + * + * }); + * + * suiteTeardown(function() { + * + * }); + * }); + * }); + * + * @param {Suite} suite Root suite. + */ +module.exports = function(suite) { + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha) { + var common = require('./common')(suites, context, mocha); + + context.setup = common.beforeEach; + context.teardown = common.afterEach; + context.suiteSetup = common.before; + context.suiteTeardown = common.after; + context.run = mocha.options.delay && common.runWithSuite(suite); + + /** + * Describe a "suite" with the given `title` and callback `fn` containing + * nested suites and/or tests. + */ + context.suite = function(title, fn) { + return common.suite.create({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Pending suite. + */ + context.suite.skip = function(title, fn) { + return common.suite.skip({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Exclusive test-case. + */ + context.suite.only = function(title, fn) { + return common.suite.only({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. + */ + context.test = function(title, fn) { + var suite = suites[0]; + if (suite.isPending()) { + fn = null; + } + var test = new Test(title, fn); + test.file = file; + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn) { + return common.test.only(mocha, context.test(title, fn)); + }; + + context.test.skip = common.test.skip; + context.test.retries = common.test.retries; + }); +}; + +},{"../test":36,"./common":9}],14:[function(require,module,exports){ +(function (process,global,__dirname){ +/*! + * mocha + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var escapeRe = require('escape-string-regexp'); +var path = require('path'); +var reporters = require('./reporters'); +var utils = require('./utils'); + +/** + * Expose `Mocha`. + */ + +exports = module.exports = Mocha; + +/** + * To require local UIs and reporters when running in node. + */ + +if (!process.browser) { + var cwd = process.cwd(); + module.paths.push(cwd, path.join(cwd, 'node_modules')); +} + +/** + * Expose internals. + */ + +exports.utils = utils; +exports.interfaces = require('./interfaces'); +exports.reporters = reporters; +exports.Runnable = require('./runnable'); +exports.Context = require('./context'); +exports.Runner = require('./runner'); +exports.Suite = require('./suite'); +exports.Hook = require('./hook'); +exports.Test = require('./test'); + +/** + * Return image `name` path. + * + * @api private + * @param {string} name + * @return {string} + */ +function image(name) { + return path.join(__dirname, '../images', name + '.png'); +} + +/** + * Set up mocha with `options`. + * + * Options: + * + * - `ui` name "bdd", "tdd", "exports" etc + * - `reporter` reporter instance, defaults to `mocha.reporters.spec` + * - `globals` array of accepted globals + * - `timeout` timeout in milliseconds + * - `retries` number of times to retry failed tests + * - `bail` bail on the first test failure + * - `slow` milliseconds to wait before considering a test slow + * - `ignoreLeaks` ignore global leaks + * - `fullTrace` display the full stack-trace on failing + * - `grep` string or regexp to filter tests with + * + * @param {Object} options + * @api public + */ +function Mocha(options) { + options = options || {}; + this.files = []; + this.options = options; + if (options.grep) { + this.grep(new RegExp(options.grep)); + } + if (options.fgrep) { + this.fgrep(options.fgrep); + } + this.suite = new exports.Suite('', new exports.Context()); + this.ui(options.ui); + this.bail(options.bail); + this.reporter(options.reporter, options.reporterOptions); + if (typeof options.timeout !== 'undefined' && options.timeout !== null) { + this.timeout(options.timeout); + } + if (typeof options.retries !== 'undefined' && options.retries !== null) { + this.retries(options.retries); + } + this.useColors(options.useColors); + if (options.enableTimeouts !== null) { + this.enableTimeouts(options.enableTimeouts); + } + if (options.slow) { + this.slow(options.slow); + } +} + +/** + * Enable or disable bailing on the first failure. + * + * @api public + * @param {boolean} [bail] + */ +Mocha.prototype.bail = function(bail) { + if (!arguments.length) { + bail = true; + } + this.suite.bail(bail); + return this; +}; + +/** + * Add test `file`. + * + * @api public + * @param {string} file + */ +Mocha.prototype.addFile = function(file) { + this.files.push(file); + return this; +}; + +/** + * Set reporter to `reporter`, defaults to "spec". + * + * @param {String|Function} reporter name or constructor + * @param {Object} reporterOptions optional options + * @api public + * @param {string|Function} reporter name or constructor + * @param {Object} reporterOptions optional options + */ +Mocha.prototype.reporter = function(reporter, reporterOptions) { + if (typeof reporter === 'function') { + this._reporter = reporter; + } else { + reporter = reporter || 'spec'; + var _reporter; + // Try to load a built-in reporter. + if (reporters[reporter]) { + _reporter = reporters[reporter]; + } + // Try to load reporters from process.cwd() and node_modules + if (!_reporter) { + try { + _reporter = require(reporter); + } catch (err) { + err.message.indexOf('Cannot find module') !== -1 + ? console.warn('"' + reporter + '" reporter not found') + : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); + } + } + if (!_reporter && reporter === 'teamcity') { + console.warn('The Teamcity reporter was moved to a package named ' + + 'mocha-teamcity-reporter ' + + '(https://npmjs.org/package/mocha-teamcity-reporter).'); + } + if (!_reporter) { + throw new Error('invalid reporter "' + reporter + '"'); + } + this._reporter = _reporter; + } + this.options.reporterOptions = reporterOptions; + return this; +}; + +/** + * Set test UI `name`, defaults to "bdd". + * + * @api public + * @param {string} bdd + */ +Mocha.prototype.ui = function(name) { + name = name || 'bdd'; + this._ui = exports.interfaces[name]; + if (!this._ui) { + try { + this._ui = require(name); + } catch (err) { + throw new Error('invalid interface "' + name + '"'); + } + } + this._ui = this._ui(this.suite); + + this.suite.on('pre-require', function(context) { + exports.afterEach = context.afterEach || context.teardown; + exports.after = context.after || context.suiteTeardown; + exports.beforeEach = context.beforeEach || context.setup; + exports.before = context.before || context.suiteSetup; + exports.describe = context.describe || context.suite; + exports.it = context.it || context.test; + exports.setup = context.setup || context.beforeEach; + exports.suiteSetup = context.suiteSetup || context.before; + exports.suiteTeardown = context.suiteTeardown || context.after; + exports.suite = context.suite || context.describe; + exports.teardown = context.teardown || context.afterEach; + exports.test = context.test || context.it; + exports.run = context.run; + }); + + return this; +}; + +/** + * Load registered files. + * + * @api private + */ +Mocha.prototype.loadFiles = function(fn) { + var self = this; + var suite = this.suite; + this.files.forEach(function(file) { + file = path.resolve(file); + suite.emit('pre-require', global, file, self); + suite.emit('require', require(file), file, self); + suite.emit('post-require', global, file, self); + }); + fn && fn(); +}; + +/** + * Enable growl support. + * + * @api private + */ +Mocha.prototype._growl = function(runner, reporter) { + var notify = require('growl'); + + runner.on('end', function() { + var stats = reporter.stats; + if (stats.failures) { + var msg = stats.failures + ' of ' + runner.total + ' tests failed'; + notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); + } else { + notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { + name: 'mocha', + title: 'Passed', + image: image('ok') + }); + } + }); +}; + +/** + * Escape string and add it to grep as a regexp. + * + * @api public + * @param str + * @returns {Mocha} + */ +Mocha.prototype.fgrep = function(str) { + return this.grep(new RegExp(escapeRe(str))); +}; + +/** + * Add regexp to grep, if `re` is a string it is escaped. + * + * @param {RegExp|String} re + * @return {Mocha} + * @api public + * @param {RegExp|string} re + * @return {Mocha} + */ +Mocha.prototype.grep = function(re) { + if (utils.isString(re)) { + // extract args if it's regex-like, i.e: [string, pattern, flag] + var arg = re.match(/^\/(.*)\/(g|i|)$|.*/); + this.options.grep = new RegExp(arg[1] || arg[0], arg[2]); + } else { + this.options.grep = re; + } + return this; +}; +/** + * Invert `.grep()` matches. + * + * @return {Mocha} + * @api public + */ +Mocha.prototype.invert = function() { + this.options.invert = true; + return this; +}; + +/** + * Ignore global leaks. + * + * @param {Boolean} ignore + * @return {Mocha} + * @api public + * @param {boolean} ignore + * @return {Mocha} + */ +Mocha.prototype.ignoreLeaks = function(ignore) { + this.options.ignoreLeaks = Boolean(ignore); + return this; +}; + +/** + * Enable global leak checking. + * + * @return {Mocha} + * @api public + */ +Mocha.prototype.checkLeaks = function() { + this.options.ignoreLeaks = false; + return this; +}; + +/** + * Display long stack-trace on failing + * + * @return {Mocha} + * @api public + */ +Mocha.prototype.fullTrace = function() { + this.options.fullStackTrace = true; + return this; +}; + +/** + * Enable growl support. + * + * @return {Mocha} + * @api public + */ +Mocha.prototype.growl = function() { + this.options.growl = true; + return this; +}; + +/** + * Ignore `globals` array or string. + * + * @param {Array|String} globals + * @return {Mocha} + * @api public + * @param {Array|string} globals + * @return {Mocha} + */ +Mocha.prototype.globals = function(globals) { + this.options.globals = (this.options.globals || []).concat(globals); + return this; +}; + +/** + * Emit color output. + * + * @param {Boolean} colors + * @return {Mocha} + * @api public + * @param {boolean} colors + * @return {Mocha} + */ +Mocha.prototype.useColors = function(colors) { + if (colors !== undefined) { + this.options.useColors = colors; + } + return this; +}; + +/** + * Use inline diffs rather than +/-. + * + * @param {Boolean} inlineDiffs + * @return {Mocha} + * @api public + * @param {boolean} inlineDiffs + * @return {Mocha} + */ +Mocha.prototype.useInlineDiffs = function(inlineDiffs) { + this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs; + return this; +}; + +/** + * Set the timeout in milliseconds. + * + * @param {Number} timeout + * @return {Mocha} + * @api public + * @param {number} timeout + * @return {Mocha} + */ +Mocha.prototype.timeout = function(timeout) { + this.suite.timeout(timeout); + return this; +}; + +/** + * Set the number of times to retry failed tests. + * + * @param {Number} retry times + * @return {Mocha} + * @api public + */ +Mocha.prototype.retries = function(n) { + this.suite.retries(n); + return this; +}; + +/** + * Set slowness threshold in milliseconds. + * + * @param {Number} slow + * @return {Mocha} + * @api public + * @param {number} slow + * @return {Mocha} + */ +Mocha.prototype.slow = function(slow) { + this.suite.slow(slow); + return this; +}; + +/** + * Enable timeouts. + * + * @param {Boolean} enabled + * @return {Mocha} + * @api public + * @param {boolean} enabled + * @return {Mocha} + */ +Mocha.prototype.enableTimeouts = function(enabled) { + this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true); + return this; +}; + +/** + * Makes all tests async (accepting a callback) + * + * @return {Mocha} + * @api public + */ +Mocha.prototype.asyncOnly = function() { + this.options.asyncOnly = true; + return this; +}; + +/** + * Disable syntax highlighting (in browser). + * + * @api public + */ +Mocha.prototype.noHighlighting = function() { + this.options.noHighlighting = true; + return this; +}; + +/** + * Enable uncaught errors to propagate (in browser). + * + * @return {Mocha} + * @api public + */ +Mocha.prototype.allowUncaught = function() { + this.options.allowUncaught = true; + return this; +}; + +/** + * Delay root suite execution. + * @returns {Mocha} + */ +Mocha.prototype.delay = function delay() { + this.options.delay = true; + return this; +}; + +/** + * Run tests and invoke `fn()` when complete. + * + * @api public + * @param {Function} fn + * @return {Runner} + */ +Mocha.prototype.run = function(fn) { + if (this.files.length) { + this.loadFiles(); + } + var suite = this.suite; + var options = this.options; + options.files = this.files; + var runner = new exports.Runner(suite, options.delay); + var reporter = new this._reporter(runner, options); + runner.ignoreLeaks = options.ignoreLeaks !== false; + runner.fullStackTrace = options.fullStackTrace; + runner.hasOnly = options.hasOnly; + runner.asyncOnly = options.asyncOnly; + runner.allowUncaught = options.allowUncaught; + if (options.grep) { + runner.grep(options.grep, options.invert); + } + if (options.globals) { + runner.globals(options.globals); + } + if (options.growl) { + this._growl(runner, reporter); + } + if (options.useColors !== undefined) { + exports.reporters.Base.useColors = options.useColors; + } + exports.reporters.Base.inlineDiffs = options.useInlineDiffs; + + function done(failures) { + if (reporter.done) { + reporter.done(failures, fn); + } else { + fn && fn(failures); + } + } + + return runner.run(done); +}; + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":67,"escape-string-regexp":47,"growl":49,"path":42}],15:[function(require,module,exports){ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @api public + * @param {string|number} val + * @param {Object} options + * @return {string|number} + */ +module.exports = function(val, options) { + options = options || {}; + if (typeof val === 'string') { + return parse(val); + } + // https://github.com/mochajs/mocha/pull/1035 + return options['long'] ? longFormat(val) : shortFormat(val); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @api private + * @param {string} str + * @return {number} + */ +function parse(str) { + var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 's': + return n * s; + case 'ms': + return n; + default: + // No default case + } +} + +/** + * Short format for `ms`. + * + * @api private + * @param {number} ms + * @return {string} + */ +function shortFormat(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @api private + * @param {number} ms + * @return {string} + */ +function longFormat(ms) { + return plural(ms, d, 'day') + || plural(ms, h, 'hour') + || plural(ms, m, 'minute') + || plural(ms, s, 'second') + || ms + ' ms'; +} + +/** + * Pluralization helper. + * + * @api private + * @param {number} ms + * @param {number} n + * @param {string} name + */ +function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } + return Math.ceil(ms / n) + ' ' + name + 's'; +} + +},{}],16:[function(require,module,exports){ + +/** + * Expose `Pending`. + */ + +module.exports = Pending; + +/** + * Initialize a new `Pending` error with the given message. + * + * @param {string} message + */ +function Pending(message) { + this.message = message; +} + +},{}],17:[function(require,module,exports){ +(function (process,global){ +/** + * Module dependencies. + */ + +var tty = require('tty'); +var diff = require('diff'); +var ms = require('../ms'); +var utils = require('../utils'); +var supportsColor = process.browser ? null : require('supports-color'); + +/** + * Expose `Base`. + */ + +exports = module.exports = Base; + +/** + * Save timer references to avoid Sinon interfering. + * See: https://github.com/mochajs/mocha/issues/237 + */ + +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ + +/** + * Check if both stdio streams are associated with a tty. + */ + +var isatty = tty.isatty(1) && tty.isatty(2); + +/** + * Enable coloring by default, except in the browser interface. + */ + +exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined)); + +/** + * Inline diffs instead of +/- + */ + +exports.inlineDiffs = false; + +/** + * Default color map. + */ + +exports.colors = { + pass: 90, + fail: 31, + 'bright pass': 92, + 'bright fail': 91, + 'bright yellow': 93, + pending: 36, + suite: 0, + 'error title': 0, + 'error message': 31, + 'error stack': 90, + checkmark: 32, + fast: 90, + medium: 33, + slow: 31, + green: 32, + light: 90, + 'diff gutter': 90, + 'diff added': 32, + 'diff removed': 31 +}; + +/** + * Default symbol map. + */ + +exports.symbols = { + ok: '✓', + err: '✖', + dot: '․', + comma: ',', + bang: '!' +}; + +// With node.js on Windows: use symbols available in terminal default fonts +if (process.platform === 'win32') { + exports.symbols.ok = '\u221A'; + exports.symbols.err = '\u00D7'; + exports.symbols.dot = '.'; +} + +/** + * Color `str` with the given `type`, + * allowing colors to be disabled, + * as well as user-defined color + * schemes. + * + * @param {string} type + * @param {string} str + * @return {string} + * @api private + */ +var color = exports.color = function(type, str) { + if (!exports.useColors) { + return String(str); + } + return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; +}; + +/** + * Expose term window size, with some defaults for when stderr is not a tty. + */ + +exports.window = { + width: 75 +}; + +if (isatty) { + exports.window.width = process.stdout.getWindowSize + ? process.stdout.getWindowSize(1)[0] + : tty.getWindowSize()[1]; +} + +/** + * Expose some basic cursor interactions that are common among reporters. + */ + +exports.cursor = { + hide: function() { + isatty && process.stdout.write('\u001b[?25l'); + }, + + show: function() { + isatty && process.stdout.write('\u001b[?25h'); + }, + + deleteLine: function() { + isatty && process.stdout.write('\u001b[2K'); + }, + + beginningOfLine: function() { + isatty && process.stdout.write('\u001b[0G'); + }, + + CR: function() { + if (isatty) { + exports.cursor.deleteLine(); + exports.cursor.beginningOfLine(); + } else { + process.stdout.write('\r'); + } + } +}; + +/** + * Outut the given `failures` as a list. + * + * @param {Array} failures + * @api public + */ + +exports.list = function(failures) { + console.log(); + failures.forEach(function(test, i) { + // format + var fmt = color('error title', ' %s) %s:\n') + + color('error message', ' %s') + + color('error stack', '\n%s\n'); + + // msg + var msg; + var err = test.err; + var message; + if (err.message && typeof err.message.toString === 'function') { + message = err.message + ''; + } else if (typeof err.inspect === 'function') { + message = err.inspect() + ''; + } else { + message = ''; + } + var stack = err.stack || message; + var index = message ? stack.indexOf(message) : -1; + var actual = err.actual; + var expected = err.expected; + var escape = true; + + if (index === -1) { + msg = message; + } else { + index += message.length; + msg = stack.slice(0, index); + // remove msg from stack + stack = stack.slice(index + 1); + } + + // uncaught + if (err.uncaught) { + msg = 'Uncaught ' + msg; + } + // explicitly show diff + if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { + escape = false; + if (!(utils.isString(actual) && utils.isString(expected))) { + err.actual = actual = utils.stringify(actual); + err.expected = expected = utils.stringify(expected); + } + + fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); + var match = message.match(/^([^:]+): expected/); + msg = '\n ' + color('error message', match ? match[1] : msg); + + if (exports.inlineDiffs) { + msg += inlineDiff(err, escape); + } else { + msg += unifiedDiff(err, escape); + } + } + + // indent stack trace + stack = stack.replace(/^/gm, ' '); + + console.log(fmt, (i + 1), test.fullTitle(), msg, stack); + }); +}; + +/** + * Initialize a new `Base` reporter. + * + * All other reporters generally + * inherit from this reporter, providing + * stats such as test duration, number + * of tests passed / failed etc. + * + * @param {Runner} runner + * @api public + */ + +function Base(runner) { + var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }; + var failures = this.failures = []; + + if (!runner) { + return; + } + this.runner = runner; + + runner.stats = stats; + + runner.on('start', function() { + stats.start = new Date(); + }); + + runner.on('suite', function(suite) { + stats.suites = stats.suites || 0; + suite.root || stats.suites++; + }); + + runner.on('test end', function() { + stats.tests = stats.tests || 0; + stats.tests++; + }); + + runner.on('pass', function(test) { + stats.passes = stats.passes || 0; + + if (test.duration > test.slow()) { + test.speed = 'slow'; + } else if (test.duration > test.slow() / 2) { + test.speed = 'medium'; + } else { + test.speed = 'fast'; + } + + stats.passes++; + }); + + runner.on('fail', function(test, err) { + stats.failures = stats.failures || 0; + stats.failures++; + test.err = err; + failures.push(test); + }); + + runner.on('end', function() { + stats.end = new Date(); + stats.duration = new Date() - stats.start; + }); + + runner.on('pending', function() { + stats.pending++; + }); +} + +/** + * Output common epilogue used by many of + * the bundled reporters. + * + * @api public + */ +Base.prototype.epilogue = function() { + var stats = this.stats; + var fmt; + + console.log(); + + // passes + fmt = color('bright pass', ' ') + + color('green', ' %d passing') + + color('light', ' (%s)'); + + console.log(fmt, + stats.passes || 0, + ms(stats.duration)); + + // pending + if (stats.pending) { + fmt = color('pending', ' ') + + color('pending', ' %d pending'); + + console.log(fmt, stats.pending); + } + + // failures + if (stats.failures) { + fmt = color('fail', ' %d failing'); + + console.log(fmt, stats.failures); + + Base.list(this.failures); + console.log(); + } + + console.log(); +}; + +/** + * Pad the given `str` to `len`. + * + * @api private + * @param {string} str + * @param {string} len + * @return {string} + */ +function pad(str, len) { + str = String(str); + return Array(len - str.length + 1).join(' ') + str; +} + +/** + * Returns an inline diff between 2 strings with coloured ANSI output + * + * @api private + * @param {Error} err with actual/expected + * @param {boolean} escape + * @return {string} Diff + */ +function inlineDiff(err, escape) { + var msg = errorDiff(err, 'WordsWithSpace', escape); + + // linenos + var lines = msg.split('\n'); + if (lines.length > 4) { + var width = String(lines.length).length; + msg = lines.map(function(str, i) { + return pad(++i, width) + ' |' + ' ' + str; + }).join('\n'); + } + + // legend + msg = '\n' + + color('diff removed', 'actual') + + ' ' + + color('diff added', 'expected') + + '\n\n' + + msg + + '\n'; + + // indent + msg = msg.replace(/^/gm, ' '); + return msg; +} + +/** + * Returns a unified diff between two strings. + * + * @api private + * @param {Error} err with actual/expected + * @param {boolean} escape + * @return {string} The diff. + */ +function unifiedDiff(err, escape) { + var indent = ' '; + function cleanUp(line) { + if (escape) { + line = escapeInvisibles(line); + } + if (line[0] === '+') { + return indent + colorLines('diff added', line); + } + if (line[0] === '-') { + return indent + colorLines('diff removed', line); + } + if (line.match(/\@\@/)) { + return null; + } + if (line.match(/\\ No newline/)) { + return null; + } + return indent + line; + } + function notBlank(line) { + return typeof line !== 'undefined' && line !== null; + } + var msg = diff.createPatch('string', err.actual, err.expected); + var lines = msg.split('\n').splice(4); + return '\n ' + + colorLines('diff added', '+ expected') + ' ' + + colorLines('diff removed', '- actual') + + '\n\n' + + lines.map(cleanUp).filter(notBlank).join('\n'); +} + +/** + * Return a character diff for `err`. + * + * @api private + * @param {Error} err + * @param {string} type + * @param {boolean} escape + * @return {string} + */ +function errorDiff(err, type, escape) { + var actual = escape ? escapeInvisibles(err.actual) : err.actual; + var expected = escape ? escapeInvisibles(err.expected) : err.expected; + return diff['diff' + type](actual, expected).map(function(str) { + if (str.added) { + return colorLines('diff added', str.value); + } + if (str.removed) { + return colorLines('diff removed', str.value); + } + return str.value; + }).join(''); +} + +/** + * Returns a string with all invisible characters in plain text + * + * @api private + * @param {string} line + * @return {string} + */ +function escapeInvisibles(line) { + return line.replace(/\t/g, '') + .replace(/\r/g, '') + .replace(/\n/g, '\n'); +} + +/** + * Color lines for `str`, using the color `name`. + * + * @api private + * @param {string} name + * @param {string} str + * @return {string} + */ +function colorLines(name, str) { + return str.split('\n').map(function(str) { + return color(name, str); + }).join('\n'); +} + +/** + * Object#toString reference. + */ +var objToString = Object.prototype.toString; + +/** + * Check that a / b have the same type. + * + * @api private + * @param {Object} a + * @param {Object} b + * @return {boolean} + */ +function sameType(a, b) { + return objToString.call(a) === objToString.call(b); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../ms":15,"../utils":38,"_process":67,"diff":46,"supports-color":42,"tty":5}],18:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var utils = require('../utils'); + +/** + * Expose `Doc`. + */ + +exports = module.exports = Doc; + +/** + * Initialize a new `Doc` reporter. + * + * @param {Runner} runner + * @api public + */ +function Doc(runner) { + Base.call(this, runner); + + var indents = 2; + + function indent() { + return Array(indents).join(' '); + } + + runner.on('suite', function(suite) { + if (suite.root) { + return; + } + ++indents; + console.log('%s
    ', indent()); + ++indents; + console.log('%s

    %s

    ', indent(), utils.escape(suite.title)); + console.log('%s
    ', indent()); + }); + + runner.on('suite end', function(suite) { + if (suite.root) { + return; + } + console.log('%s
    ', indent()); + --indents; + console.log('%s
    ', indent()); + --indents; + }); + + runner.on('pass', function(test) { + console.log('%s
    %s
    ', indent(), utils.escape(test.title)); + var code = utils.escape(utils.clean(test.body)); + console.log('%s
    %s
    ', indent(), code); + }); + + runner.on('fail', function(test, err) { + console.log('%s
    %s
    ', indent(), utils.escape(test.title)); + var code = utils.escape(utils.clean(test.body)); + console.log('%s
    %s
    ', indent(), code); + console.log('%s
    %s
    ', indent(), utils.escape(err)); + }); +} + +},{"../utils":38,"./base":17}],19:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var inherits = require('../utils').inherits; +var color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = Dot; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @api public + * @param {Runner} runner + */ +function Dot(runner) { + Base.call(this, runner); + + var self = this; + var width = Base.window.width * .75 | 0; + var n = -1; + + runner.on('start', function() { + process.stdout.write('\n'); + }); + + runner.on('pending', function() { + if (++n % width === 0) { + process.stdout.write('\n '); + } + process.stdout.write(color('pending', Base.symbols.comma)); + }); + + runner.on('pass', function(test) { + if (++n % width === 0) { + process.stdout.write('\n '); + } + if (test.speed === 'slow') { + process.stdout.write(color('bright yellow', Base.symbols.dot)); + } else { + process.stdout.write(color(test.speed, Base.symbols.dot)); + } + }); + + runner.on('fail', function() { + if (++n % width === 0) { + process.stdout.write('\n '); + } + process.stdout.write(color('fail', Base.symbols.bang)); + }); + + runner.on('end', function() { + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(Dot, Base); + +}).call(this,require('_process')) +},{"../utils":38,"./base":17,"_process":67}],20:[function(require,module,exports){ +(function (global){ +/* eslint-env browser */ + +/** + * Module dependencies. + */ + +var Base = require('./base'); +var utils = require('../utils'); +var Progress = require('../browser/progress'); +var escapeRe = require('escape-string-regexp'); +var escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ + +/** + * Expose `HTML`. + */ + +exports = module.exports = HTML; + +/** + * Stats template. + */ + +var statsTemplate = ''; + +/** + * Initialize a new `HTML` reporter. + * + * @api public + * @param {Runner} runner + */ +function HTML(runner) { + Base.call(this, runner); + + var self = this; + var stats = this.stats; + var stat = fragment(statsTemplate); + var items = stat.getElementsByTagName('li'); + var passes = items[1].getElementsByTagName('em')[0]; + var passesLink = items[1].getElementsByTagName('a')[0]; + var failures = items[2].getElementsByTagName('em')[0]; + var failuresLink = items[2].getElementsByTagName('a')[0]; + var duration = items[3].getElementsByTagName('em')[0]; + var canvas = stat.getElementsByTagName('canvas')[0]; + var report = fragment('
      '); + var stack = [report]; + var progress; + var ctx; + var root = document.getElementById('mocha'); + + if (canvas.getContext) { + var ratio = window.devicePixelRatio || 1; + canvas.style.width = canvas.width; + canvas.style.height = canvas.height; + canvas.width *= ratio; + canvas.height *= ratio; + ctx = canvas.getContext('2d'); + ctx.scale(ratio, ratio); + progress = new Progress(); + } + + if (!root) { + return error('#mocha div missing, add it to your document'); + } + + // pass toggle + on(passesLink, 'click', function(evt) { + evt.preventDefault(); + unhide(); + var name = (/pass/).test(report.className) ? '' : ' pass'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) { + hideSuitesWithout('test pass'); + } + }); + + // failure toggle + on(failuresLink, 'click', function(evt) { + evt.preventDefault(); + unhide(); + var name = (/fail/).test(report.className) ? '' : ' fail'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) { + hideSuitesWithout('test fail'); + } + }); + + root.appendChild(stat); + root.appendChild(report); + + if (progress) { + progress.size(40); + } + + runner.on('suite', function(suite) { + if (suite.root) { + return; + } + + // suite + var url = self.suiteURL(suite); + var el = fragment('
    • %s

    • ', url, escape(suite.title)); + + // container + stack[0].appendChild(el); + stack.unshift(document.createElement('ul')); + el.appendChild(stack[0]); + }); + + runner.on('suite end', function(suite) { + if (suite.root) { + updateStats(); + return; + } + stack.shift(); + }); + + runner.on('pass', function(test) { + var url = self.testURL(test); + var markup = '
    • %e%ems ' + + '

    • '; + var el = fragment(markup, test.speed, test.title, test.duration, url); + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on('fail', function(test) { + var el = fragment('
    • %e

    • ', + test.title, self.testURL(test)); + var stackString; // Note: Includes leading newline + var message = test.err.toString(); + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if (message === '[object Error]') { + message = test.err.message; + } + + if (test.err.stack) { + var indexOfMessage = test.err.stack.indexOf(test.err.message); + if (indexOfMessage === -1) { + stackString = test.err.stack; + } else { + stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); + } + } else if (test.err.sourceURL && test.err.line !== undefined) { + // Safari doesn't give you a stack. Let's at least provide a source line. + stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; + } + + stackString = stackString || ''; + + if (test.err.htmlMessage && stackString) { + el.appendChild(fragment('
      %s\n
      %e
      ', + test.err.htmlMessage, stackString)); + } else if (test.err.htmlMessage) { + el.appendChild(fragment('
      %s
      ', test.err.htmlMessage)); + } else { + el.appendChild(fragment('
      %e%e
      ', message, stackString)); + } + + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on('pending', function(test) { + var el = fragment('
    • %e

    • ', test.title); + appendToStack(el); + updateStats(); + }); + + function appendToStack(el) { + // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. + if (stack[0]) { + stack[0].appendChild(el); + } + } + + function updateStats() { + // TODO: add to stats + var percent = stats.tests / runner.total * 100 | 0; + if (progress) { + progress.update(percent).draw(ctx); + } + + // update stats + var ms = new Date() - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + } +} + +/** + * Makes a URL, preserving querystring ("search") parameters. + * + * @param {string} s + * @return {string} A new URL. + */ +function makeUrl(s) { + var search = window.location.search; + + // Remove previous grep query parameter if present + if (search) { + search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); + } + + return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s)); +} + +/** + * Provide suite URL. + * + * @param {Object} [suite] + */ +HTML.prototype.suiteURL = function(suite) { + return makeUrl(suite.fullTitle()); +}; + +/** + * Provide test URL. + * + * @param {Object} [test] + */ +HTML.prototype.testURL = function(test) { + return makeUrl(test.fullTitle()); +}; + +/** + * Adds code toggle functionality for the provided test's list element. + * + * @param {HTMLLIElement} el + * @param {string} contents + */ +HTML.prototype.addCodeToggle = function(el, contents) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function() { + pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; + }); + + var pre = fragment('
      %e
      ', utils.clean(contents)); + el.appendChild(pre); + pre.style.display = 'none'; +}; + +/** + * Display error `msg`. + * + * @param {string} msg + */ +function error(msg) { + document.body.appendChild(fragment('
      %s
      ', msg)); +} + +/** + * Return a DOM fragment from `html`. + * + * @param {string} html + */ +function fragment(html) { + var args = arguments; + var div = document.createElement('div'); + var i = 1; + + div.innerHTML = html.replace(/%([se])/g, function(_, type) { + switch (type) { + case 's': return String(args[i++]); + case 'e': return escape(args[i++]); + // no default + } + }); + + return div.firstChild; +} + +/** + * Check for suites that do not have elements + * with `classname`, and hide them. + * + * @param {text} classname + */ +function hideSuitesWithout(classname) { + var suites = document.getElementsByClassName('suite'); + for (var i = 0; i < suites.length; i++) { + var els = suites[i].getElementsByClassName(classname); + if (!els.length) { + suites[i].className += ' hidden'; + } + } +} + +/** + * Unhide .hidden suites. + */ +function unhide() { + var els = document.getElementsByClassName('suite hidden'); + for (var i = 0; i < els.length; ++i) { + els[i].className = els[i].className.replace('suite hidden', 'suite'); + } +} + +/** + * Set an element's text contents. + * + * @param {HTMLElement} el + * @param {string} contents + */ +function text(el, contents) { + if (el.textContent) { + el.textContent = contents; + } else { + el.innerText = contents; + } +} + +/** + * Listen on `event` with callback `fn`. + */ +function on(el, event, fn) { + if (el.addEventListener) { + el.addEventListener(event, fn, false); + } else { + el.attachEvent('on' + event, fn); + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../browser/progress":4,"../utils":38,"./base":17,"escape-string-regexp":47}],21:[function(require,module,exports){ +// Alias exports to a their normalized format Mocha#reporter to prevent a need +// for dynamic (try/catch) requires, which Browserify doesn't handle. +exports.Base = exports.base = require('./base'); +exports.Dot = exports.dot = require('./dot'); +exports.Doc = exports.doc = require('./doc'); +exports.TAP = exports.tap = require('./tap'); +exports.JSON = exports.json = require('./json'); +exports.HTML = exports.html = require('./html'); +exports.List = exports.list = require('./list'); +exports.Min = exports.min = require('./min'); +exports.Spec = exports.spec = require('./spec'); +exports.Nyan = exports.nyan = require('./nyan'); +exports.XUnit = exports.xunit = require('./xunit'); +exports.Markdown = exports.markdown = require('./markdown'); +exports.Progress = exports.progress = require('./progress'); +exports.Landing = exports.landing = require('./landing'); +exports.JSONStream = exports['json-stream'] = require('./json-stream'); + +},{"./base":17,"./doc":18,"./dot":19,"./html":20,"./json":23,"./json-stream":22,"./landing":24,"./list":25,"./markdown":26,"./min":27,"./nyan":28,"./progress":29,"./spec":30,"./tap":31,"./xunit":32}],22:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var JSON = require('json3'); + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @api public + * @param {Runner} runner + */ +function List(runner) { + Base.call(this, runner); + + var self = this; + var total = runner.total; + + runner.on('start', function() { + console.log(JSON.stringify(['start', { total: total }])); + }); + + runner.on('pass', function(test) { + console.log(JSON.stringify(['pass', clean(test)])); + }); + + runner.on('fail', function(test, err) { + test = clean(test); + test.err = err.message; + test.stack = err.stack || null; + console.log(JSON.stringify(['fail', test])); + }); + + runner.on('end', function() { + process.stdout.write(JSON.stringify(['end', self.stats])); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @api private + * @param {Object} test + * @return {Object} + */ +function clean(test) { + return { + title: test.title, + fullTitle: test.fullTitle(), + duration: test.duration, + currentRetry: test.currentRetry() + }; +} + +}).call(this,require('_process')) +},{"./base":17,"_process":67,"json3":54}],23:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `JSON`. + */ + +exports = module.exports = JSONReporter; + +/** + * Initialize a new `JSON` reporter. + * + * @api public + * @param {Runner} runner + */ +function JSONReporter(runner) { + Base.call(this, runner); + + var self = this; + var tests = []; + var pending = []; + var failures = []; + var passes = []; + + runner.on('test end', function(test) { + tests.push(test); + }); + + runner.on('pass', function(test) { + passes.push(test); + }); + + runner.on('fail', function(test) { + failures.push(test); + }); + + runner.on('pending', function(test) { + pending.push(test); + }); + + runner.on('end', function() { + var obj = { + stats: self.stats, + tests: tests.map(clean), + pending: pending.map(clean), + failures: failures.map(clean), + passes: passes.map(clean) + }; + + runner.testResults = obj; + + process.stdout.write(JSON.stringify(obj, null, 2)); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @api private + * @param {Object} test + * @return {Object} + */ +function clean(test) { + return { + title: test.title, + fullTitle: test.fullTitle(), + duration: test.duration, + currentRetry: test.currentRetry(), + err: errorJSON(test.err || {}) + }; +} + +/** + * Transform `error` into a JSON object. + * + * @api private + * @param {Error} err + * @return {Object} + */ +function errorJSON(err) { + var res = {}; + Object.getOwnPropertyNames(err).forEach(function(key) { + res[key] = err[key]; + }, err); + return res; +} + +}).call(this,require('_process')) +},{"./base":17,"_process":67}],24:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var inherits = require('../utils').inherits; +var cursor = Base.cursor; +var color = Base.color; + +/** + * Expose `Landing`. + */ + +exports = module.exports = Landing; + +/** + * Airplane color. + */ + +Base.colors.plane = 0; + +/** + * Airplane crash color. + */ + +Base.colors['plane crash'] = 31; + +/** + * Runway color. + */ + +Base.colors.runway = 90; + +/** + * Initialize a new `Landing` reporter. + * + * @api public + * @param {Runner} runner + */ +function Landing(runner) { + Base.call(this, runner); + + var self = this; + var width = Base.window.width * .75 | 0; + var total = runner.total; + var stream = process.stdout; + var plane = color('plane', '✈'); + var crashed = -1; + var n = 0; + + function runway() { + var buf = Array(width).join('-'); + return ' ' + color('runway', buf); + } + + runner.on('start', function() { + stream.write('\n\n\n '); + cursor.hide(); + }); + + runner.on('test end', function(test) { + // check if the plane crashed + var col = crashed === -1 ? width * ++n / total | 0 : crashed; + + // show the crash + if (test.state === 'failed') { + plane = color('plane crash', '✈'); + crashed = col; + } + + // render landing strip + stream.write('\u001b[' + (width + 1) + 'D\u001b[2A'); + stream.write(runway()); + stream.write('\n '); + stream.write(color('runway', Array(col).join('⋅'))); + stream.write(plane); + stream.write(color('runway', Array(width - col).join('⋅') + '\n')); + stream.write(runway()); + stream.write('\u001b[0m'); + }); + + runner.on('end', function() { + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(Landing, Base); + +}).call(this,require('_process')) +},{"../utils":38,"./base":17,"_process":67}],25:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var inherits = require('../utils').inherits; +var color = Base.color; +var cursor = Base.cursor; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @api public + * @param {Runner} runner + */ +function List(runner) { + Base.call(this, runner); + + var self = this; + var n = 0; + + runner.on('start', function() { + console.log(); + }); + + runner.on('test', function(test) { + process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); + }); + + runner.on('pending', function(test) { + var fmt = color('checkmark', ' -') + + color('pending', ' %s'); + console.log(fmt, test.fullTitle()); + }); + + runner.on('pass', function(test) { + var fmt = color('checkmark', ' ' + Base.symbols.dot) + + color('pass', ' %s: ') + + color(test.speed, '%dms'); + cursor.CR(); + console.log(fmt, test.fullTitle(), test.duration); + }); + + runner.on('fail', function(test) { + cursor.CR(); + console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(List, Base); + +}).call(this,require('_process')) +},{"../utils":38,"./base":17,"_process":67}],26:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var utils = require('../utils'); + +/** + * Constants + */ + +var SUITE_PREFIX = '$'; + +/** + * Expose `Markdown`. + */ + +exports = module.exports = Markdown; + +/** + * Initialize a new `Markdown` reporter. + * + * @api public + * @param {Runner} runner + */ +function Markdown(runner) { + Base.call(this, runner); + + var level = 0; + var buf = ''; + + function title(str) { + return Array(level).join('#') + ' ' + str; + } + + function mapTOC(suite, obj) { + var ret = obj; + var key = SUITE_PREFIX + suite.title; + + obj = obj[key] = obj[key] || { suite: suite }; + suite.suites.forEach(function(suite) { + mapTOC(suite, obj); + }); + + return ret; + } + + function stringifyTOC(obj, level) { + ++level; + var buf = ''; + var link; + for (var key in obj) { + if (key === 'suite') { + continue; + } + if (key !== SUITE_PREFIX) { + link = ' - [' + key.substring(1) + ']'; + link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; + buf += Array(level).join(' ') + link; + } + buf += stringifyTOC(obj[key], level); + } + return buf; + } + + function generateTOC(suite) { + var obj = mapTOC(suite, {}); + return stringifyTOC(obj, 0); + } + + generateTOC(runner.suite); + + runner.on('suite', function(suite) { + ++level; + var slug = utils.slug(suite.fullTitle()); + buf += '' + '\n'; + buf += title(suite.title) + '\n'; + }); + + runner.on('suite end', function() { + --level; + }); + + runner.on('pass', function(test) { + var code = utils.clean(test.body); + buf += test.title + '.\n'; + buf += '\n```js\n'; + buf += code + '\n'; + buf += '```\n\n'; + }); + + runner.on('end', function() { + process.stdout.write('# TOC\n'); + process.stdout.write(generateTOC(runner.suite)); + process.stdout.write(buf); + }); +} + +}).call(this,require('_process')) +},{"../utils":38,"./base":17,"_process":67}],27:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var inherits = require('../utils').inherits; + +/** + * Expose `Min`. + */ + +exports = module.exports = Min; + +/** + * Initialize a new `Min` minimal test reporter (best used with --watch). + * + * @api public + * @param {Runner} runner + */ +function Min(runner) { + Base.call(this, runner); + + runner.on('start', function() { + // clear screen + process.stdout.write('\u001b[2J'); + // set cursor position + process.stdout.write('\u001b[1;3H'); + }); + + runner.on('end', this.epilogue.bind(this)); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(Min, Base); + +}).call(this,require('_process')) +},{"../utils":38,"./base":17,"_process":67}],28:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var inherits = require('../utils').inherits; + +/** + * Expose `Dot`. + */ + +exports = module.exports = NyanCat; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function NyanCat(runner) { + Base.call(this, runner); + + var self = this; + var width = Base.window.width * .75 | 0; + var nyanCatWidth = this.nyanCatWidth = 11; + + this.colorIndex = 0; + this.numberOfLines = 4; + this.rainbowColors = self.generateColors(); + this.scoreboardWidth = 5; + this.tick = 0; + this.trajectories = [[], [], [], []]; + this.trajectoryWidthMax = (width - nyanCatWidth); + + runner.on('start', function() { + Base.cursor.hide(); + self.draw(); + }); + + runner.on('pending', function() { + self.draw(); + }); + + runner.on('pass', function() { + self.draw(); + }); + + runner.on('fail', function() { + self.draw(); + }); + + runner.on('end', function() { + Base.cursor.show(); + for (var i = 0; i < self.numberOfLines; i++) { + write('\n'); + } + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(NyanCat, Base); + +/** + * Draw the nyan cat + * + * @api private + */ + +NyanCat.prototype.draw = function() { + this.appendRainbow(); + this.drawScoreboard(); + this.drawRainbow(); + this.drawNyanCat(); + this.tick = !this.tick; +}; + +/** + * Draw the "scoreboard" showing the number + * of passes, failures and pending tests. + * + * @api private + */ + +NyanCat.prototype.drawScoreboard = function() { + var stats = this.stats; + + function draw(type, n) { + write(' '); + write(Base.color(type, n)); + write('\n'); + } + + draw('green', stats.passes); + draw('fail', stats.failures); + draw('pending', stats.pending); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Append the rainbow. + * + * @api private + */ + +NyanCat.prototype.appendRainbow = function() { + var segment = this.tick ? '_' : '-'; + var rainbowified = this.rainbowify(segment); + + for (var index = 0; index < this.numberOfLines; index++) { + var trajectory = this.trajectories[index]; + if (trajectory.length >= this.trajectoryWidthMax) { + trajectory.shift(); + } + trajectory.push(rainbowified); + } +}; + +/** + * Draw the rainbow. + * + * @api private + */ + +NyanCat.prototype.drawRainbow = function() { + var self = this; + + this.trajectories.forEach(function(line) { + write('\u001b[' + self.scoreboardWidth + 'C'); + write(line.join('')); + write('\n'); + }); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw the nyan cat + * + * @api private + */ +NyanCat.prototype.drawNyanCat = function() { + var self = this; + var startWidth = this.scoreboardWidth + this.trajectories[0].length; + var dist = '\u001b[' + startWidth + 'C'; + var padding = ''; + + write(dist); + write('_,------,'); + write('\n'); + + write(dist); + padding = self.tick ? ' ' : ' '; + write('_|' + padding + '/\\_/\\ '); + write('\n'); + + write(dist); + padding = self.tick ? '_' : '__'; + var tail = self.tick ? '~' : '^'; + write(tail + '|' + padding + this.face() + ' '); + write('\n'); + + write(dist); + padding = self.tick ? ' ' : ' '; + write(padding + '"" "" '); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw nyan cat face. + * + * @api private + * @return {string} + */ + +NyanCat.prototype.face = function() { + var stats = this.stats; + if (stats.failures) { + return '( x .x)'; + } else if (stats.pending) { + return '( o .o)'; + } else if (stats.passes) { + return '( ^ .^)'; + } + return '( - .-)'; +}; + +/** + * Move cursor up `n`. + * + * @api private + * @param {number} n + */ + +NyanCat.prototype.cursorUp = function(n) { + write('\u001b[' + n + 'A'); +}; + +/** + * Move cursor down `n`. + * + * @api private + * @param {number} n + */ + +NyanCat.prototype.cursorDown = function(n) { + write('\u001b[' + n + 'B'); +}; + +/** + * Generate rainbow colors. + * + * @api private + * @return {Array} + */ +NyanCat.prototype.generateColors = function() { + var colors = []; + + for (var i = 0; i < (6 * 7); i++) { + var pi3 = Math.floor(Math.PI / 3); + var n = (i * (1.0 / 6)); + var r = Math.floor(3 * Math.sin(n) + 3); + var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); + var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); + colors.push(36 * r + 6 * g + b + 16); + } + + return colors; +}; + +/** + * Apply rainbow to the given `str`. + * + * @api private + * @param {string} str + * @return {string} + */ +NyanCat.prototype.rainbowify = function(str) { + if (!Base.useColors) { + return str; + } + var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; + this.colorIndex += 1; + return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; +}; + +/** + * Stdout helper. + * + * @param {string} string A message to write to stdout. + */ +function write(string) { + process.stdout.write(string); +} + +}).call(this,require('_process')) +},{"../utils":38,"./base":17,"_process":67}],29:[function(require,module,exports){ +(function (process){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var inherits = require('../utils').inherits; +var color = Base.color; +var cursor = Base.cursor; + +/** + * Expose `Progress`. + */ + +exports = module.exports = Progress; + +/** + * General progress bar color. + */ + +Base.colors.progress = 90; + +/** + * Initialize a new `Progress` bar test reporter. + * + * @api public + * @param {Runner} runner + * @param {Object} options + */ +function Progress(runner, options) { + Base.call(this, runner); + + var self = this; + var width = Base.window.width * .50 | 0; + var total = runner.total; + var complete = 0; + var lastN = -1; + + // default chars + options = options || {}; + options.open = options.open || '['; + options.complete = options.complete || '▬'; + options.incomplete = options.incomplete || Base.symbols.dot; + options.close = options.close || ']'; + options.verbose = false; + + // tests started + runner.on('start', function() { + console.log(); + cursor.hide(); + }); + + // tests complete + runner.on('test end', function() { + complete++; + + var percent = complete / total; + var n = width * percent | 0; + var i = width - n; + + if (n === lastN && !options.verbose) { + // Don't re-render the line if it hasn't changed + return; + } + lastN = n; + + cursor.CR(); + process.stdout.write('\u001b[J'); + process.stdout.write(color('progress', ' ' + options.open)); + process.stdout.write(Array(n).join(options.complete)); + process.stdout.write(Array(i).join(options.incomplete)); + process.stdout.write(color('progress', options.close)); + if (options.verbose) { + process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + } + }); + + // tests are complete, output some stats + // and the failures if any + runner.on('end', function() { + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(Progress, Base); + +}).call(this,require('_process')) +},{"../utils":38,"./base":17,"_process":67}],30:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var inherits = require('../utils').inherits; +var color = Base.color; + +/** + * Expose `Spec`. + */ + +exports = module.exports = Spec; + +/** + * Initialize a new `Spec` test reporter. + * + * @api public + * @param {Runner} runner + */ +function Spec(runner) { + Base.call(this, runner); + + var self = this; + var indents = 0; + var n = 0; + + function indent() { + return Array(indents).join(' '); + } + + runner.on('start', function() { + console.log(); + }); + + runner.on('suite', function(suite) { + ++indents; + console.log(color('suite', '%s%s'), indent(), suite.title); + }); + + runner.on('suite end', function() { + --indents; + if (indents === 1) { + console.log(); + } + }); + + runner.on('pending', function(test) { + var fmt = indent() + color('pending', ' - %s'); + console.log(fmt, test.title); + }); + + runner.on('pass', function(test) { + var fmt; + if (test.speed === 'fast') { + fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s'); + console.log(fmt, test.title); + } else { + fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s') + + color(test.speed, ' (%dms)'); + console.log(fmt, test.title, test.duration); + } + }); + + runner.on('fail', function(test) { + console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(Spec, Base); + +},{"../utils":38,"./base":17}],31:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `TAP`. + */ + +exports = module.exports = TAP; + +/** + * Initialize a new `TAP` reporter. + * + * @api public + * @param {Runner} runner + */ +function TAP(runner) { + Base.call(this, runner); + + var n = 1; + var passes = 0; + var failures = 0; + + runner.on('start', function() { + var total = runner.grepTotal(runner.suite); + console.log('%d..%d', 1, total); + }); + + runner.on('test end', function() { + ++n; + }); + + runner.on('pending', function(test) { + console.log('ok %d %s # SKIP -', n, title(test)); + }); + + runner.on('pass', function(test) { + passes++; + console.log('ok %d %s', n, title(test)); + }); + + runner.on('fail', function(test, err) { + failures++; + console.log('not ok %d %s', n, title(test)); + if (err.stack) { + console.log(err.stack.replace(/^/gm, ' ')); + } + }); + + runner.on('end', function() { + console.log('# tests ' + (passes + failures)); + console.log('# pass ' + passes); + console.log('# fail ' + failures); + }); +} + +/** + * Return a TAP-safe title of `test` + * + * @api private + * @param {Object} test + * @return {String} + */ +function title(test) { + return test.fullTitle().replace(/#/g, ''); +} + +},{"./base":17}],32:[function(require,module,exports){ +(function (process,global){ +/** + * Module dependencies. + */ + +var Base = require('./base'); +var utils = require('../utils'); +var inherits = utils.inherits; +var fs = require('fs'); +var escape = utils.escape; +var mkdirp = require('mkdirp'); +var path = require('path'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ + +/** + * Expose `XUnit`. + */ + +exports = module.exports = XUnit; + +/** + * Initialize a new `XUnit` reporter. + * + * @api public + * @param {Runner} runner + */ +function XUnit(runner, options) { + Base.call(this, runner); + + var stats = this.stats; + var tests = []; + var self = this; + + if (options.reporterOptions && options.reporterOptions.output) { + if (!fs.createWriteStream) { + throw new Error('file output not supported in browser'); + } + mkdirp.sync(path.dirname(options.reporterOptions.output)); + self.fileStream = fs.createWriteStream(options.reporterOptions.output); + } + + runner.on('pending', function(test) { + tests.push(test); + }); + + runner.on('pass', function(test) { + tests.push(test); + }); + + runner.on('fail', function(test) { + tests.push(test); + }); + + runner.on('end', function() { + self.write(tag('testsuite', { + name: 'Mocha Tests', + tests: stats.tests, + failures: stats.failures, + errors: stats.failures, + skipped: stats.tests - stats.failures - stats.passes, + timestamp: (new Date()).toUTCString(), + time: (stats.duration / 1000) || 0 + }, false)); + + tests.forEach(function(t) { + self.test(t); + }); + + self.write(''); + }); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(XUnit, Base); + +/** + * Override done to close the stream (if it's a file). + * + * @param failures + * @param {Function} fn + */ +XUnit.prototype.done = function(failures, fn) { + if (this.fileStream) { + this.fileStream.end(function() { + fn(failures); + }); + } else { + fn(failures); + } +}; + +/** + * Write out the given line. + * + * @param {string} line + */ +XUnit.prototype.write = function(line) { + if (this.fileStream) { + this.fileStream.write(line + '\n'); + } else if (typeof process === 'object' && process.stdout) { + process.stdout.write(line + '\n'); + } else { + console.log(line); + } +}; + +/** + * Output tag for the given `test.` + * + * @param {Test} test + */ +XUnit.prototype.test = function(test) { + var attrs = { + classname: test.parent.fullTitle(), + name: test.title, + time: (test.duration / 1000) || 0 + }; + + if (test.state === 'failed') { + var err = test.err; + this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack)))); + } else if (test.isPending()) { + this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + this.write(tag('testcase', attrs, true)); + } +}; + +/** + * HTML tag helper. + * + * @param name + * @param attrs + * @param close + * @param content + * @return {string} + */ +function tag(name, attrs, close, content) { + var end = close ? '/>' : '>'; + var pairs = []; + var tag; + + for (var key in attrs) { + if (Object.prototype.hasOwnProperty.call(attrs, key)) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) { + tag += content + ' Math.pow(2, 31)) { + this._enableTimeouts = false; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug('timeout %d', ms); + this._timeout = ms; + if (this.timer) { + this.resetTimeout(); + } + return this; +}; + +/** + * Set & get slow `ms`. + * + * @api private + * @param {number|string} ms + * @return {Runnable|number} ms or Runnable instance. + */ +Runnable.prototype.slow = function(ms) { + if (typeof ms === 'undefined') { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug('timeout %d', ms); + this._slow = ms; + return this; +}; + +/** + * Set and get whether timeout is `enabled`. + * + * @api private + * @param {boolean} enabled + * @return {Runnable|boolean} enabled or Runnable instance. + */ +Runnable.prototype.enableTimeouts = function(enabled) { + if (!arguments.length) { + return this._enableTimeouts; + } + debug('enableTimeouts %s', enabled); + this._enableTimeouts = enabled; + return this; +}; + +/** + * Halt and mark as pending. + * + * @api public + */ +Runnable.prototype.skip = function() { + throw new Pending('sync skip'); +}; + +/** + * Check if this runnable or its parent suite is marked as pending. + * + * @api private + */ +Runnable.prototype.isPending = function() { + return this.pending || (this.parent && this.parent.isPending()); +}; + +/** + * Set number of retries. + * + * @api private + */ +Runnable.prototype.retries = function(n) { + if (!arguments.length) { + return this._retries; + } + this._retries = n; +}; + +/** + * Get current retry + * + * @api private + */ +Runnable.prototype.currentRetry = function(n) { + if (!arguments.length) { + return this._currentRetry; + } + this._currentRetry = n; +}; + +/** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @api public + * @return {string} + */ +Runnable.prototype.fullTitle = function() { + return this.parent.fullTitle() + ' ' + this.title; +}; + +/** + * Clear the timeout. + * + * @api private + */ +Runnable.prototype.clearTimeout = function() { + clearTimeout(this.timer); +}; + +/** + * Inspect the runnable void of private properties. + * + * @api private + * @return {string} + */ +Runnable.prototype.inspect = function() { + return JSON.stringify(this, function(key, val) { + if (key[0] === '_') { + return; + } + if (key === 'parent') { + return '#'; + } + if (key === 'ctx') { + return '#'; + } + return val; + }, 2); +}; + +/** + * Reset the timeout. + * + * @api private + */ +Runnable.prototype.resetTimeout = function() { + var self = this; + var ms = this.timeout() || 1e9; + + if (!this._enableTimeouts) { + return; + } + this.clearTimeout(); + this.timer = setTimeout(function() { + if (!self._enableTimeouts) { + return; + } + self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.')); + self.timedOut = true; + }, ms); +}; + +/** + * Whitelist a list of globals for this test run. + * + * @api private + * @param {string[]} globals + */ +Runnable.prototype.globals = function(globals) { + if (!arguments.length) { + return this._allowedGlobals; + } + this._allowedGlobals = globals; +}; + +/** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @api private + */ +Runnable.prototype.run = function(fn) { + var self = this; + var start = new Date(); + var ctx = this.ctx; + var finished; + var emitted; + + // Sometimes the ctx exists, but it is not runnable + if (ctx && ctx.runnable) { + ctx.runnable(this); + } + + // called multiple times + function multiple(err) { + if (emitted) { + return; + } + emitted = true; + self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate')); + } + + // finished + function done(err) { + var ms = self.timeout(); + if (self.timedOut) { + return; + } + if (finished) { + return multiple(err || self._trace); + } + + self.clearTimeout(); + self.duration = new Date() - start; + finished = true; + if (!err && self.duration > ms && self._enableTimeouts) { + err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'); + } + fn(err); + } + + // for .resetTimeout() + this.callback = done; + + // explicit async with `done` argument + if (this.async) { + this.resetTimeout(); + + // allows skip() to be used in an explicit async context + this.skip = function asyncSkip() { + done(new Pending('async skip call')); + // halt execution. the Runnable will be marked pending + // by the previous call, and the uncaught handler will ignore + // the failure. + throw new Pending('async skip; aborting execution'); + }; + + if (this.allowUncaught) { + return callFnAsync(this.fn); + } + try { + callFnAsync(this.fn); + } catch (err) { + done(utils.getError(err)); + } + return; + } + + if (this.allowUncaught) { + callFn(this.fn); + done(); + return; + } + + // sync or promise-returning + try { + if (this.isPending()) { + done(); + } else { + callFn(this.fn); + } + } catch (err) { + done(utils.getError(err)); + } + + function callFn(fn) { + var result = fn.call(ctx); + if (result && typeof result.then === 'function') { + self.resetTimeout(); + result + .then(function() { + done(); + // Return null so libraries like bluebird do not warn about + // subsequently constructed Promises. + return null; + }, + function(reason) { + done(reason || new Error('Promise rejected with no or falsy reason')); + }); + } else { + if (self.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()` or returning a promise')); + } + + done(); + } + } + + function callFnAsync(fn) { + var result = fn.call(ctx, function(err) { + if (err instanceof Error || toString.call(err) === '[object Error]') { + return done(err); + } + if (err) { + if (Object.prototype.toString.call(err) === '[object Object]') { + return done(new Error('done() invoked with non-Error: ' + + JSON.stringify(err))); + } + return done(new Error('done() invoked with non-Error: ' + err)); + } + if (result && utils.isPromise(result)) { + return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.')); + } + + done(); + }); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":54,"lodash.create":60}],34:[function(require,module,exports){ +(function (process,global){ +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter; +var Pending = require('./pending'); +var utils = require('./utils'); +var inherits = utils.inherits; +var debug = require('debug')('mocha:runner'); +var Runnable = require('./runnable'); +var filter = utils.filter; +var indexOf = utils.indexOf; +var some = utils.some; +var keys = utils.keys; +var stackFilter = utils.stackTraceFilter(); +var stringify = utils.stringify; +var type = utils.type; +var undefinedError = utils.undefinedError; +var isArray = utils.isArray; + +/** + * Non-enumerable globals. + */ + +var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date', + 'setImmediate', + 'clearImmediate' +]; + +/** + * Expose `Runner`. + */ + +module.exports = Runner; + +/** + * Initialize a `Runner` for the given `suite`. + * + * Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * - `pending` (test) test pending + * + * @api public + * @param {Suite} suite Root suite + * @param {boolean} [delay] Whether or not to delay execution of root suite + * until ready. + */ +function Runner(suite, delay) { + var self = this; + this._globals = []; + this._abort = false; + this._delay = delay; + this.suite = suite; + this.started = false; + this.total = suite.total(); + this.failures = 0; + this.on('test end', function(test) { + self.checkGlobals(test); + }); + this.on('hook end', function(hook) { + self.checkGlobals(hook); + }); + this._defaultGrep = /.*/; + this.grep(this._defaultGrep); + this.globals(this.globalProps().concat(extraGlobals())); +} + +/** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @api private + */ +Runner.immediately = global.setImmediate || process.nextTick; + +/** + * Inherit from `EventEmitter.prototype`. + */ +inherits(Runner, EventEmitter); + +/** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining + * @api public + * @param {RegExp} re + * @param {boolean} invert + * @return {Runner} Runner instance. + */ +Runner.prototype.grep = function(re, invert) { + debug('grep %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; +}; + +/** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @param {Suite} suite + * @return {Number} + * @api public + * @param {Suite} suite + * @return {number} + */ +Runner.prototype.grepTotal = function(suite) { + var self = this; + var total = 0; + + suite.eachTest(function(test) { + var match = self._grep.test(test.fullTitle()); + if (self._invert) { + match = !match; + } + if (match) { + total++; + } + }); + + return total; +}; + +/** + * Return a list of global properties. + * + * @return {Array} + * @api private + */ +Runner.prototype.globalProps = function() { + var props = keys(global); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~indexOf(props, globals[i])) { + continue; + } + props.push(globals[i]); + } + + return props; +}; + +/** + * Allow the given `arr` of globals. + * + * @param {Array} arr + * @return {Runner} for chaining + * @api public + * @param {Array} arr + * @return {Runner} Runner instance. + */ +Runner.prototype.globals = function(arr) { + if (!arguments.length) { + return this._globals; + } + debug('globals %j', arr); + this._globals = this._globals.concat(arr); + return this; +}; + +/** + * Check for global variable leaks. + * + * @api private + */ +Runner.prototype.checkGlobals = function(test) { + if (this.ignoreLeaks) { + return; + } + var ok = this._globals; + + var globals = this.globalProps(); + var leaks; + + if (test) { + ok = ok.concat(test._allowedGlobals || []); + } + + if (this.prevGlobalsLength === globals.length) { + return; + } + this.prevGlobalsLength = globals.length; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length > 1) { + this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); + } else if (leaks.length) { + this.fail(test, new Error('global leak detected: ' + leaks[0])); + } +}; + +/** + * Fail the given `test`. + * + * @api private + * @param {Test} test + * @param {Error} err + */ +Runner.prototype.fail = function(test, err) { + if (test.isPending()) { + return; + } + + ++this.failures; + test.state = 'failed'; + + if (!(err instanceof Error || err && typeof err.message === 'string')) { + err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); + } + + err.stack = (this.fullStackTrace || !err.stack) + ? err.stack + : stackFilter(err.stack); + + this.emit('fail', test, err); +}; + +/** + * Fail the given `hook` with `err`. + * + * Hook failures work in the following pattern: + * - If bail, then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter + * execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * + * @api private + * @param {Hook} hook + * @param {Error} err + */ +Runner.prototype.failHook = function(hook, err) { + if (hook.ctx && hook.ctx.currentTest) { + hook.originalTitle = hook.originalTitle || hook.title; + hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"'; + } + + this.fail(hook, err); + if (this.suite.bail()) { + this.emit('end'); + } +}; + +/** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @api private + * @param {string} name + * @param {Function} fn + */ + +Runner.prototype.hook = function(name, fn) { + var suite = this.suite; + var hooks = suite['_' + name]; + var self = this; + + function next(i) { + var hook = hooks[i]; + if (!hook) { + return fn(); + } + self.currentRunnable = hook; + + hook.ctx.currentTest = self.test; + + self.emit('hook', hook); + + if (!hook.listeners('error').length) { + hook.on('error', function(err) { + self.failHook(hook, err); + }); + } + + hook.run(function(err) { + var testError = hook.error(); + if (testError) { + self.fail(self.test, testError); + } + if (err) { + if (err instanceof Pending) { + if (name === 'beforeEach' || name === 'afterEach') { + self.test.pending = true; + } else { + utils.forEach(suite.tests, function(test) { + test.pending = true; + }); + // a pending hook won't be executed twice. + hook.pending = true; + } + } else { + self.failHook(hook, err); + + // stop executing hooks, notify callee of hook err + return fn(err); + } + } + self.emit('hook end', hook); + delete hook.ctx.currentTest; + next(++i); + }); + } + + Runner.immediately(function() { + next(0); + }); +}; + +/** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err, errSuite)`. + * + * @api private + * @param {string} name + * @param {Array} suites + * @param {Function} fn + */ +Runner.prototype.hooks = function(name, suites, fn) { + var self = this; + var orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function(err) { + if (err) { + var errSuite = self.suite; + self.suite = orig; + return fn(err, errSuite); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); +}; + +/** + * Run hooks from the top level down. + * + * @param {String} name + * @param {Function} fn + * @api private + */ +Runner.prototype.hookUp = function(name, fn) { + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); +}; + +/** + * Run hooks from the bottom up. + * + * @param {String} name + * @param {Function} fn + * @api private + */ +Runner.prototype.hookDown = function(name, fn) { + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); +}; + +/** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @api private + */ +Runner.prototype.parents = function() { + var suite = this.suite; + var suites = []; + while (suite.parent) { + suite = suite.parent; + suites.push(suite); + } + return suites; +}; + +/** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @api private + */ +Runner.prototype.runTest = function(fn) { + var self = this; + var test = this.test; + + if (!test) { + return; + } + if (this.asyncOnly) { + test.asyncOnly = true; + } + + if (this.allowUncaught) { + test.allowUncaught = true; + return test.run(fn); + } + try { + test.on('error', function(err) { + self.fail(test, err); + }); + test.run(fn); + } catch (err) { + fn(err); + } +}; + +/** + * Run tests in the given `suite` and invoke the callback `fn()` when complete. + * + * @api private + * @param {Suite} suite + * @param {Function} fn + */ +Runner.prototype.runTests = function(suite, fn) { + var self = this; + var tests = suite.tests.slice(); + var test; + + function hookErr(_, errSuite, after) { + // before/after Each hook for errSuite failed: + var orig = self.suite; + + // for failed 'after each' hook start from errSuite parent, + // otherwise start from errSuite itself + self.suite = after ? errSuite.parent : errSuite; + + if (self.suite) { + // call hookUp afterEach + self.hookUp('afterEach', function(err2, errSuite2) { + self.suite = orig; + // some hooks may fail even now + if (err2) { + return hookErr(err2, errSuite2, true); + } + // report error suite + fn(errSuite); + }); + } else { + // there is no need calling other 'after each' hooks + self.suite = orig; + fn(errSuite); + } + } + + function next(err, errSuite) { + // if we bail after first err + if (self.failures && suite._bail) { + return fn(); + } + + if (self._abort) { + return fn(); + } + + if (err) { + return hookErr(err, errSuite, true); + } + + // next test + test = tests.shift(); + + // all done + if (!test) { + return fn(); + } + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) { + match = !match; + } + if (!match) { + // Run immediately only if we have defined a grep. When we + // define a grep — It can cause maximum callstack error if + // the grep is doing a large recursive loop by neglecting + // all tests. The run immediately function also comes with + // a performance cost. So we don't want to run immediately + // if we run the whole test suite, because running the whole + // test suite don't do any immediate recursive loops. Thus, + // allowing a JS runtime to breathe. + if (self._grep !== self._defaultGrep) { + Runner.immediately(next); + } else { + next(); + } + return; + } + + if (test.isPending()) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + + // execute test and hook(s) + self.emit('test', self.test = test); + self.hookDown('beforeEach', function(err, errSuite) { + if (test.isPending()) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + if (err) { + return hookErr(err, errSuite, false); + } + self.currentRunnable = self.test; + self.runTest(function(err) { + test = self.test; + if (err) { + var retry = test.currentRetry(); + if (err instanceof Pending) { + test.pending = true; + self.emit('pending', test); + } else if (retry < test.retries()) { + var clonedTest = test.clone(); + clonedTest.currentRetry(retry + 1); + tests.unshift(clonedTest); + + // Early return + hook trigger so that it doesn't + // increment the count wrong + return self.hookUp('afterEach', next); + } else { + self.fail(test, err); + } + self.emit('test end', test); + + if (err instanceof Pending) { + return next(); + } + + return self.hookUp('afterEach', next); + } + + test.state = 'passed'; + self.emit('pass', test); + self.emit('test end', test); + self.hookUp('afterEach', next); + }); + }); + } + + this.next = next; + this.hookErr = hookErr; + next(); +}; + +/** + * Run the given `suite` and invoke the callback `fn()` when complete. + * + * @api private + * @param {Suite} suite + * @param {Function} fn + */ +Runner.prototype.runSuite = function(suite, fn) { + var i = 0; + var self = this; + var total = this.grepTotal(suite); + var afterAllHookCalled = false; + + debug('run suite %s', suite.fullTitle()); + + if (!total || (self.failures && suite._bail)) { + return fn(); + } + + this.emit('suite', this.suite = suite); + + function next(errSuite) { + if (errSuite) { + // current suite failed on a hook from errSuite + if (errSuite === suite) { + // if errSuite is current suite + // continue to the next sibling suite + return done(); + } + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); + } + + if (self._abort) { + return done(); + } + + var curr = suite.suites[i++]; + if (!curr) { + return done(); + } + + // Avoid grep neglecting large number of tests causing a + // huge recursive loop and thus a maximum call stack error. + // See comment in `this.runTests()` for more information. + if (self._grep !== self._defaultGrep) { + Runner.immediately(function() { + self.runSuite(curr, next); + }); + } else { + self.runSuite(curr, next); + } + } + + function done(errSuite) { + self.suite = suite; + self.nextSuite = next; + + if (afterAllHookCalled) { + fn(errSuite); + } else { + // mark that the afterAll block has been called once + // and so can be skipped if there is an error in it. + afterAllHookCalled = true; + + // remove reference to test + delete self.test; + + self.hook('afterAll', function() { + self.emit('suite end', suite); + fn(errSuite); + }); + } + } + + this.nextSuite = next; + + this.hook('beforeAll', function(err) { + if (err) { + return done(); + } + self.runTests(suite, next); + }); +}; + +/** + * Handle uncaught exceptions. + * + * @param {Error} err + * @api private + */ +Runner.prototype.uncaught = function(err) { + if (err) { + debug('uncaught exception %s', err !== function() { + return this; + }.call(err) ? err : (err.message || err)); + } else { + debug('uncaught undefined exception'); + err = undefinedError(); + } + err.uncaught = true; + + var runnable = this.currentRunnable; + + if (!runnable) { + runnable = new Runnable('Uncaught error outside test suite'); + runnable.parent = this.suite; + + if (this.started) { + this.fail(runnable, err); + } else { + // Can't recover from this failure + this.emit('start'); + this.fail(runnable, err); + this.emit('end'); + } + + return; + } + + runnable.clearTimeout(); + + // Ignore errors if complete or pending + if (runnable.state || runnable.isPending()) { + return; + } + this.fail(runnable, err); + + // recover from test + if (runnable.type === 'test') { + this.emit('test end', runnable); + this.hookUp('afterEach', this.next); + return; + } + + // recover from hooks + if (runnable.type === 'hook') { + var errSuite = this.suite; + // if hook failure is in afterEach block + if (runnable.fullTitle().indexOf('after each') > -1) { + return this.hookErr(err, errSuite, true); + } + // if hook failure is in beforeEach block + if (runnable.fullTitle().indexOf('before each') > -1) { + return this.hookErr(err, errSuite, false); + } + // if hook failure is in after or before blocks + return this.nextSuite(errSuite); + } + + // bail + this.emit('end'); +}; + +/** + * Cleans up the references to all the deferred functions + * (before/after/beforeEach/afterEach) and tests of a Suite. + * These must be deleted otherwise a memory leak can happen, + * as those functions may reference variables from closures, + * thus those variables can never be garbage collected as long + * as the deferred functions exist. + * + * @param {Suite} suite + */ +function cleanSuiteReferences(suite) { + function cleanArrReferences(arr) { + for (var i = 0; i < arr.length; i++) { + delete arr[i].fn; + } + } + + if (isArray(suite._beforeAll)) { + cleanArrReferences(suite._beforeAll); + } + + if (isArray(suite._beforeEach)) { + cleanArrReferences(suite._beforeEach); + } + + if (isArray(suite._afterAll)) { + cleanArrReferences(suite._afterAll); + } + + if (isArray(suite._afterEach)) { + cleanArrReferences(suite._afterEach); + } + + for (var i = 0; i < suite.tests.length; i++) { + delete suite.tests[i].fn; + } +} + +/** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @param {Function} fn + * @return {Runner} for chaining + * @api public + * @param {Function} fn + * @return {Runner} Runner instance. + */ +Runner.prototype.run = function(fn) { + var self = this; + var rootSuite = this.suite; + + // If there is an `only` filter + if (this.hasOnly) { + filterOnly(rootSuite); + } + + fn = fn || function() {}; + + function uncaught(err) { + self.uncaught(err); + } + + function start() { + self.started = true; + self.emit('start'); + self.runSuite(rootSuite, function() { + debug('finished running'); + self.emit('end'); + }); + } + + debug('start'); + + // references cleanup to avoid memory leaks + this.on('suite end', cleanSuiteReferences); + + // callback + this.on('end', function() { + debug('end'); + process.removeListener('uncaughtException', uncaught); + fn(self.failures); + }); + + // uncaught exception + process.on('uncaughtException', uncaught); + + if (this._delay) { + // for reporters, I guess. + // might be nice to debounce some dots while we wait. + this.emit('waiting', rootSuite); + rootSuite.once('run', start); + } else { + start(); + } + + return this; +}; + +/** + * Cleanly abort execution. + * + * @api public + * @return {Runner} Runner instance. + */ +Runner.prototype.abort = function() { + debug('aborting'); + this._abort = true; + + return this; +}; + +/** + * Filter suites based on `isOnly` logic. + * + * @param {Array} suite + * @returns {Boolean} + * @api private + */ +function filterOnly(suite) { + if (suite._onlyTests.length) { + // If the suite contains `only` tests, run those and ignore any nested suites. + suite.tests = suite._onlyTests; + suite.suites = []; + } else { + // Otherwise, do not run any of the tests in this suite. + suite.tests = []; + utils.forEach(suite._onlySuites, function(onlySuite) { + // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. + // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. + if (hasOnly(onlySuite)) { + filterOnly(onlySuite); + } + }); + // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. + suite.suites = filter(suite.suites, function(childSuite) { + return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite); + }); + } + // Keep the suite only if there is something to run + return suite.tests.length || suite.suites.length; +} + +/** + * Determines whether a suite has an `only` test or suite as a descendant. + * + * @param {Array} suite + * @returns {Boolean} + * @api private + */ +function hasOnly(suite) { + return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly); +} + +/** + * Filter leaks with the given globals flagged as `ok`. + * + * @api private + * @param {Array} ok + * @param {Array} globals + * @return {Array} + */ +function filterLeaks(ok, globals) { + return filter(globals, function(key) { + // Firefox and Chrome exposes iframes as index inside the window object + if (/^\d+/.test(key)) { + return false; + } + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method + // not init at first it is assigned in some seconds + if (global.navigator && (/^getInterface/).test(key)) { + return false; + } + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (global.navigator && (/^\d+/).test(key)) { + return false; + } + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) { + return false; + } + + var matched = filter(ok, function(ok) { + if (~ok.indexOf('*')) { + return key.indexOf(ok.split('*')[0]) === 0; + } + return key === ok; + }); + return !matched.length && (!global.navigator || key !== 'onerror'); + }); +} + +/** + * Array of globals dependent on the environment. + * + * @return {Array} + * @api private + */ +function extraGlobals() { + if (typeof process === 'object' && typeof process.version === 'string') { + var parts = process.version.split('.'); + var nodeVersion = utils.reduce(parts, function(a, v) { + return a << 8 | v; + }); + + // 'errno' was renamed to process._errno in v0.9.11. + + if (nodeVersion < 0x00090B) { + return ['errno']; + } + } + + return []; +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./pending":16,"./runnable":33,"./utils":38,"_process":67,"debug":2,"events":3}],35:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter; +var Hook = require('./hook'); +var utils = require('./utils'); +var inherits = utils.inherits; +var debug = require('debug')('mocha:suite'); +var milliseconds = require('./ms'); + +/** + * Expose `Suite`. + */ + +exports = module.exports = Suite; + +/** + * Create a new `Suite` with the given `title` and parent `Suite`. When a suite + * with the same title is already present, that suite is returned to provide + * nicer reporter and more flexible meta-testing. + * + * @api public + * @param {Suite} parent + * @param {string} title + * @return {Suite} + */ +exports.create = function(parent, title) { + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; +}; + +/** + * Initialize a new `Suite` with the given `title` and `ctx`. + * + * @api private + * @param {string} title + * @param {Context} parentContext + */ +function Suite(title, parentContext) { + if (!utils.isString(title)) { + throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.'); + } + this.title = title; + function Context() {} + Context.prototype = parentContext; + this.ctx = new Context(); + this.suites = []; + this.tests = []; + this.pending = false; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this.root = !title; + this._timeout = 2000; + this._enableTimeouts = true; + this._slow = 75; + this._bail = false; + this._retries = -1; + this._onlyTests = []; + this._onlySuites = []; + this.delayed = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ +inherits(Suite, EventEmitter); + +/** + * Return a clone of this `Suite`. + * + * @api private + * @return {Suite} + */ +Suite.prototype.clone = function() { + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.timeout(this.timeout()); + suite.retries(this.retries()); + suite.enableTimeouts(this.enableTimeouts()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; +}; + +/** + * Set timeout `ms` or short-hand such as "2s". + * + * @api private + * @param {number|string} ms + * @return {Suite|number} for chaining + */ +Suite.prototype.timeout = function(ms) { + if (!arguments.length) { + return this._timeout; + } + if (ms.toString() === '0') { + this._enableTimeouts = false; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; +}; + +/** + * Set number of times to retry a failed test. + * + * @api private + * @param {number|string} n + * @return {Suite|number} for chaining + */ +Suite.prototype.retries = function(n) { + if (!arguments.length) { + return this._retries; + } + debug('retries %d', n); + this._retries = parseInt(n, 10) || 0; + return this; +}; + +/** + * Set timeout to `enabled`. + * + * @api private + * @param {boolean} enabled + * @return {Suite|boolean} self or enabled + */ +Suite.prototype.enableTimeouts = function(enabled) { + if (!arguments.length) { + return this._enableTimeouts; + } + debug('enableTimeouts %s', enabled); + this._enableTimeouts = enabled; + return this; +}; + +/** + * Set slow `ms` or short-hand such as "2s". + * + * @api private + * @param {number|string} ms + * @return {Suite|number} for chaining + */ +Suite.prototype.slow = function(ms) { + if (!arguments.length) { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug('slow %d', ms); + this._slow = ms; + return this; +}; + +/** + * Sets whether to bail after first error. + * + * @api private + * @param {boolean} bail + * @return {Suite|number} for chaining + */ +Suite.prototype.bail = function(bail) { + if (!arguments.length) { + return this._bail; + } + debug('bail %s', bail); + this._bail = bail; + return this; +}; + +/** + * Check if this suite or its parent suite is marked as pending. + * + * @api private + */ +Suite.prototype.isPending = function() { + return this.pending || (this.parent && this.parent.isPending()); +}; + +/** + * Run `fn(test[, done])` before running tests. + * + * @api private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ +Suite.prototype.beforeAll = function(title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"before all" hook' + (title ? ': ' + title : ''); + + var hook = new Hook(title, fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.retries(this.retries()); + hook.enableTimeouts(this.enableTimeouts()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeAll.push(hook); + this.emit('beforeAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after running tests. + * + * @api private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ +Suite.prototype.afterAll = function(title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"after all" hook' + (title ? ': ' + title : ''); + + var hook = new Hook(title, fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.retries(this.retries()); + hook.enableTimeouts(this.enableTimeouts()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterAll.push(hook); + this.emit('afterAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` before each test case. + * + * @api private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ +Suite.prototype.beforeEach = function(title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"before each" hook' + (title ? ': ' + title : ''); + + var hook = new Hook(title, fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.retries(this.retries()); + hook.enableTimeouts(this.enableTimeouts()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeEach.push(hook); + this.emit('beforeEach', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after each test case. + * + * @api private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ +Suite.prototype.afterEach = function(title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"after each" hook' + (title ? ': ' + title : ''); + + var hook = new Hook(title, fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.retries(this.retries()); + hook.enableTimeouts(this.enableTimeouts()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterEach.push(hook); + this.emit('afterEach', hook); + return this; +}; + +/** + * Add a test `suite`. + * + * @api private + * @param {Suite} suite + * @return {Suite} for chaining + */ +Suite.prototype.addSuite = function(suite) { + suite.parent = this; + suite.timeout(this.timeout()); + suite.retries(this.retries()); + suite.enableTimeouts(this.enableTimeouts()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit('suite', suite); + return this; +}; + +/** + * Add a `test` to this suite. + * + * @api private + * @param {Test} test + * @return {Suite} for chaining + */ +Suite.prototype.addTest = function(test) { + test.parent = this; + test.timeout(this.timeout()); + test.retries(this.retries()); + test.enableTimeouts(this.enableTimeouts()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @api public + * @return {string} + */ +Suite.prototype.fullTitle = function() { + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) { + return full + ' ' + this.title; + } + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @api public + * @return {number} + */ +Suite.prototype.total = function() { + return utils.reduce(this.suites, function(sum, suite) { + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find all tests. Applies a + * function in the format `fn(test)`. + * + * @api private + * @param {Function} fn + * @return {Suite} + */ +Suite.prototype.eachTest = function(fn) { + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite) { + suite.eachTest(fn); + }); + return this; +}; + +/** + * This will run the root suite if we happen to be running in delayed mode. + */ +Suite.prototype.run = function run() { + if (this.root) { + this.emit('run'); + } +}; + +},{"./hook":7,"./ms":15,"./utils":38,"debug":2,"events":3}],36:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); +var create = require('lodash.create'); +var isString = require('./utils').isString; + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @api private + * @param {String} title + * @param {Function} fn + */ +function Test(title, fn) { + if (!isString(title)) { + throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.'); + } + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ +Test.prototype = create(Runnable.prototype, { + constructor: Test +}); + +Test.prototype.clone = function() { + var test = new Test(this.title, this.fn); + test.timeout(this.timeout()); + test.slow(this.slow()); + test.enableTimeouts(this.enableTimeouts()); + test.retries(this.retries()); + test.currentRetry(this.currentRetry()); + test.globals(this.globals()); + test.parent = this.parent; + test.file = this.file; + test.ctx = this.ctx; + return test; +}; + +},{"./runnable":33,"./utils":38,"lodash.create":60}],37:[function(require,module,exports){ +'use strict'; + +/** + * Pad a `number` with a ten's place zero. + * + * @param {number} number + * @return {string} + */ +function pad(number) { + var n = number.toString(); + return n.length === 1 ? '0' + n : n; +} + +/** + * Turn a `date` into an ISO string. + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + * + * @param {Date} date + * @return {string} + */ +function toISOString(date) { + return date.getUTCFullYear() + + '-' + pad(date.getUTCMonth() + 1) + + '-' + pad(date.getUTCDate()) + + 'T' + pad(date.getUTCHours()) + + ':' + pad(date.getUTCMinutes()) + + ':' + pad(date.getUTCSeconds()) + + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) + + 'Z'; +} + +/* + * Exports. + */ + +module.exports = toISOString; + +},{}],38:[function(require,module,exports){ +(function (process,Buffer){ +/* eslint-env browser */ + +/** + * Module dependencies. + */ + +var JSON = require('json3'); +var basename = require('path').basename; +var debug = require('debug')('mocha:watch'); +var exists = require('fs').existsSync || require('path').existsSync; +var glob = require('glob'); +var path = require('path'); +var join = path.join; +var readdirSync = require('fs').readdirSync; +var statSync = require('fs').statSync; +var watchFile = require('fs').watchFile; +var toISOString = require('./to-iso-string'); + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +exports.inherits = require('util').inherits; + +/** + * Escape special characters in the given string of html. + * + * @api private + * @param {string} html + * @return {string} + */ +exports.escape = function(html) { + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @param {Object} scope + */ +exports.forEach = function(arr, fn, scope) { + for (var i = 0, l = arr.length; i < l; i++) { + fn.call(scope, arr[i], i); + } +}; + +/** + * Test if the given obj is type of string. + * + * @api private + * @param {Object} obj + * @return {boolean} + */ +exports.isString = function(obj) { + return typeof obj === 'string'; +}; + +/** + * Array#map (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @param {Object} scope + * @return {Array} + */ +exports.map = function(arr, fn, scope) { + var result = []; + for (var i = 0, l = arr.length; i < l; i++) { + result.push(fn.call(scope, arr[i], i, arr)); + } + return result; +}; + +/** + * Array#indexOf (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Object} obj to find index of + * @param {number} start + * @return {number} + */ +var indexOf = exports.indexOf = function(arr, obj, start) { + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) { + return i; + } + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @param {Object} val Initial value. + * @return {*} + */ +var reduce = exports.reduce = function(arr, fn, val) { + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @return {Array} + */ +exports.filter = function(arr, fn) { + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) { + ret.push(val); + } + } + + return ret; +}; + +/** + * Array#some (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @return {Array} + */ +exports.some = function(arr, fn) { + for (var i = 0, l = arr.length; i < l; i++) { + if (fn(arr[i])) { + return true; + } + } + return false; +}; + +/** + * Object.keys (<=IE8) + * + * @api private + * @param {Object} obj + * @return {Array} keys + */ +exports.keys = typeof Object.keys === 'function' ? Object.keys : function(obj) { + var keys = []; + var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @api private + * @param {Array} files + * @param {Function} fn + */ +exports.watch = function(files, fn) { + var options = { interval: 100 }; + files.forEach(function(file) { + debug('file %s', file); + watchFile(file, options, function(curr, prev) { + if (prev.mtime < curr.mtime) { + fn(file); + } + }); + }); +}; + +/** + * Array.isArray (<=IE8) + * + * @api private + * @param {Object} obj + * @return {Boolean} + */ +var isArray = typeof Array.isArray === 'function' ? Array.isArray : function(obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; +}; + +exports.isArray = isArray; + +/** + * Buffer.prototype.toJSON polyfill. + * + * @type {Function} + */ +if (typeof Buffer !== 'undefined' && Buffer.prototype) { + Buffer.prototype.toJSON = Buffer.prototype.toJSON || function() { + return Array.prototype.slice.call(this, 0); + }; +} + +/** + * Ignored files. + * + * @api private + * @param {string} path + * @return {boolean} + */ +function ignored(path) { + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @api private + * @param {string} dir + * @param {string[]} [ext=['.js']] + * @param {Array} [ret=[]] + * @return {Array} + */ +exports.files = function(dir, ext, ret) { + ret = ret || []; + ext = ext || ['js']; + + var re = new RegExp('\\.(' + ext.join('|') + ')$'); + + readdirSync(dir) + .filter(ignored) + .forEach(function(path) { + path = join(dir, path); + if (statSync(path).isDirectory()) { + exports.files(path, ext, ret); + } else if (path.match(re)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @api private + * @param {string} str + * @return {string} + */ +exports.slug = function(str) { + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, and re-indent for pre whitespace. + * + * @param {string} str + * @return {string} + */ +exports.clean = function(str) { + str = str + .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '') + // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content + .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3'); + + var spaces = str.match(/^\n?( *)/)[1].length; + var tabs = str.match(/^\n?(\t*)/)[1].length; + var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Trim the given `str`. + * + * @api private + * @param {string} str + * @return {string} + */ +exports.trim = function(str) { + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @api private + * @param {string} qs + * @return {Object} + */ +exports.parseQuery = function(qs) { + return reduce(qs.replace('?', '').split('&'), function(obj, pair) { + var i = pair.indexOf('='); + var key = pair.slice(0, i); + var val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @api private + * @param {string} js + * @return {string} + */ +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew[ \t]+(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1'); +} + +/** + * Highlight the contents of tag `name`. + * + * @api private + * @param {string} name + */ +exports.highlightTags = function(name) { + var code = document.getElementById('mocha').getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; + +/** + * If a value could have properties, and has none, this function is called, + * which returns a string representation of the empty value. + * + * Functions w/ no properties return `'[Function]'` + * Arrays w/ length === 0 return `'[]'` + * Objects w/ no properties return `'{}'` + * All else: return result of `value.toString()` + * + * @api private + * @param {*} value The value to inspect. + * @param {string} typeHint The type of the value + * @returns {string} + */ +function emptyRepresentation(value, typeHint) { + switch (typeHint) { + case 'function': + return '[Function]'; + case 'object': + return '{}'; + case 'array': + return '[]'; + default: + return value.toString(); + } +} + +/** + * Takes some variable and asks `Object.prototype.toString()` what it thinks it + * is. + * + * @api private + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString + * @param {*} value The value to test. + * @returns {string} Computed type + * @example + * type({}) // 'object' + * type([]) // 'array' + * type(1) // 'number' + * type(false) // 'boolean' + * type(Infinity) // 'number' + * type(null) // 'null' + * type(new Date()) // 'date' + * type(/foo/) // 'regexp' + * type('type') // 'string' + * type(global) // 'global' + * type(new String('foo') // 'object' + */ +var type = exports.type = function type(value) { + if (value === undefined) { + return 'undefined'; + } else if (value === null) { + return 'null'; + } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + return 'buffer'; + } + return Object.prototype.toString.call(value) + .replace(/^\[.+\s(.+?)\]$/, '$1') + .toLowerCase(); +}; + +/** + * Stringify `value`. Different behavior depending on type of value: + * + * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. + * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. + * - If `value` is an *empty* object, function, or array, return result of function + * {@link emptyRepresentation}. + * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of + * JSON.stringify(). + * + * @api private + * @see exports.type + * @param {*} value + * @return {string} + */ +exports.stringify = function(value) { + var typeHint = type(value); + + if (!~indexOf(['object', 'array', 'function'], typeHint)) { + if (typeHint === 'buffer') { + var json = value.toJSON(); + // Based on the toJSON result + return jsonStringify(json.data && json.type ? json.data : json, 2) + .replace(/,(\n|$)/g, '$1'); + } + + // IE7/IE8 has a bizarre String constructor; needs to be coerced + // into an array and back to obj. + if (typeHint === 'string' && typeof value === 'object') { + value = reduce(value.split(''), function(acc, char, idx) { + acc[idx] = char; + return acc; + }, {}); + typeHint = 'object'; + } else { + return jsonStringify(value); + } + } + + for (var prop in value) { + if (Object.prototype.hasOwnProperty.call(value, prop)) { + return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1'); + } + } + + return emptyRepresentation(value, typeHint); +}; + +/** + * like JSON.stringify but more sense. + * + * @api private + * @param {Object} object + * @param {number=} spaces + * @param {number=} depth + * @returns {*} + */ +function jsonStringify(object, spaces, depth) { + if (typeof spaces === 'undefined') { + // primitive types + return _stringify(object); + } + + depth = depth || 1; + var space = spaces * depth; + var str = isArray(object) ? '[' : '{'; + var end = isArray(object) ? ']' : '}'; + var length = typeof object.length === 'number' ? object.length : exports.keys(object).length; + // `.repeat()` polyfill + function repeat(s, n) { + return new Array(n).join(s); + } + + function _stringify(val) { + switch (type(val)) { + case 'null': + case 'undefined': + val = '[' + val + ']'; + break; + case 'array': + case 'object': + val = jsonStringify(val, spaces, depth + 1); + break; + case 'boolean': + case 'regexp': + case 'symbol': + case 'number': + val = val === 0 && (1 / val) === -Infinity // `-0` + ? '-0' + : val.toString(); + break; + case 'date': + var sDate; + if (isNaN(val.getTime())) { // Invalid date + sDate = val.toString(); + } else { + sDate = val.toISOString ? val.toISOString() : toISOString(val); + } + val = '[Date: ' + sDate + ']'; + break; + case 'buffer': + var json = val.toJSON(); + // Based on the toJSON result + json = json.data && json.type ? json.data : json; + val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; + break; + default: + val = (val === '[Function]' || val === '[Circular]') + ? val + : JSON.stringify(val); // string + } + return val; + } + + for (var i in object) { + if (!Object.prototype.hasOwnProperty.call(object, i)) { + continue; // not my business + } + --length; + str += '\n ' + repeat(' ', space) + + (isArray(object) ? '' : '"' + i + '": ') // key + + _stringify(object[i]) // value + + (length ? ',' : ''); // comma + } + + return str + // [], {} + + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end); +} + +/** + * Test if a value is a buffer. + * + * @api private + * @param {*} value The value to test. + * @return {boolean} True if `value` is a buffer, otherwise false + */ +exports.isBuffer = function(value) { + return typeof Buffer !== 'undefined' && Buffer.isBuffer(value); +}; + +/** + * Return a new Thing that has the keys in sorted order. Recursive. + * + * If the Thing... + * - has already been seen, return string `'[Circular]'` + * - is `undefined`, return string `'[undefined]'` + * - is `null`, return value `null` + * - is some other primitive, return the value + * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method + * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. + * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()` + * + * @api private + * @see {@link exports.stringify} + * @param {*} value Thing to inspect. May or may not have properties. + * @param {Array} [stack=[]] Stack of seen values + * @param {string} [typeHint] Type hint + * @return {(Object|Array|Function|string|undefined)} + */ +exports.canonicalize = function canonicalize(value, stack, typeHint) { + var canonicalizedObj; + /* eslint-disable no-unused-vars */ + var prop; + /* eslint-enable no-unused-vars */ + typeHint = typeHint || type(value); + function withStack(value, fn) { + stack.push(value); + fn(); + stack.pop(); + } + + stack = stack || []; + + if (indexOf(stack, value) !== -1) { + return '[Circular]'; + } + + switch (typeHint) { + case 'undefined': + case 'buffer': + case 'null': + canonicalizedObj = value; + break; + case 'array': + withStack(value, function() { + canonicalizedObj = exports.map(value, function(item) { + return exports.canonicalize(item, stack); + }); + }); + break; + case 'function': + /* eslint-disable guard-for-in */ + for (prop in value) { + canonicalizedObj = {}; + break; + } + /* eslint-enable guard-for-in */ + if (!canonicalizedObj) { + canonicalizedObj = emptyRepresentation(value, typeHint); + break; + } + /* falls through */ + case 'object': + canonicalizedObj = canonicalizedObj || {}; + withStack(value, function() { + exports.forEach(exports.keys(value).sort(), function(key) { + canonicalizedObj[key] = exports.canonicalize(value[key], stack); + }); + }); + break; + case 'date': + case 'number': + case 'regexp': + case 'boolean': + case 'symbol': + canonicalizedObj = value; + break; + default: + canonicalizedObj = value + ''; + } + + return canonicalizedObj; +}; + +/** + * Lookup file names at the given `path`. + * + * @api public + * @param {string} path Base path to start searching from. + * @param {string[]} extensions File extensions to look for. + * @param {boolean} recursive Whether or not to recurse into subdirectories. + * @return {string[]} An array of paths. + */ +exports.lookupFiles = function lookupFiles(path, extensions, recursive) { + var files = []; + var re = new RegExp('\\.(' + extensions.join('|') + ')$'); + + if (!exists(path)) { + if (exists(path + '.js')) { + path += '.js'; + } else { + files = glob.sync(path); + if (!files.length) { + throw new Error("cannot resolve path (or pattern) '" + path + "'"); + } + return files; + } + } + + try { + var stat = statSync(path); + if (stat.isFile()) { + return path; + } + } catch (err) { + // ignore error + return; + } + + readdirSync(path).forEach(function(file) { + file = join(path, file); + try { + var stat = statSync(file); + if (stat.isDirectory()) { + if (recursive) { + files = files.concat(lookupFiles(file, extensions, recursive)); + } + return; + } + } catch (err) { + // ignore error + return; + } + if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') { + return; + } + files.push(file); + }); + + return files; +}; + +/** + * Generate an undefined error with a message warning the user. + * + * @return {Error} + */ + +exports.undefinedError = function() { + return new Error('Caught undefined error, did you throw without specifying what?'); +}; + +/** + * Generate an undefined error if `err` is not defined. + * + * @param {Error} err + * @return {Error} + */ + +exports.getError = function(err) { + return err || exports.undefinedError(); +}; + +/** + * @summary + * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) + * @description + * When invoking this function you get a filter function that get the Error.stack as an input, + * and return a prettify output. + * (i.e: strip Mocha and internal node functions from stack trace). + * @returns {Function} + */ +exports.stackTraceFilter = function() { + // TODO: Replace with `process.browser` + var is = typeof document === 'undefined' ? { node: true } : { browser: true }; + var slash = path.sep; + var cwd; + if (is.node) { + cwd = process.cwd() + slash; + } else { + cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); + slash = '/'; + } + + function isMochaInternal(line) { + return (~line.indexOf('node_modules' + slash + 'mocha' + slash)) + || (~line.indexOf('node_modules' + slash + 'mocha.js')) + || (~line.indexOf('bower_components' + slash + 'mocha.js')) + || (~line.indexOf(slash + 'mocha.js')); + } + + function isNodeInternal(line) { + return (~line.indexOf('(timers.js:')) + || (~line.indexOf('(events.js:')) + || (~line.indexOf('(node.js:')) + || (~line.indexOf('(module.js:')) + || (~line.indexOf('GeneratorFunctionPrototype.next (native)')) + || false; + } + + return function(stack) { + stack = stack.split('\n'); + + stack = reduce(stack, function(list, line) { + if (isMochaInternal(line)) { + return list; + } + + if (is.node && isNodeInternal(line)) { + return list; + } + + // Clean up cwd(absolute) + if (/\(?.+:\d+:\d+\)?$/.test(line)) { + line = line.replace(cwd, ''); + } + + list.push(line); + return list; + }, []); + + return stack.join('\n'); + }; +}; + +/** + * Crude, but effective. + * @api + * @param {*} value + * @returns {boolean} Whether or not `value` is a Promise + */ +exports.isPromise = function isPromise(value) { + return typeof value === 'object' && typeof value.then === 'function'; +}; + +}).call(this,require('_process'),require("buffer").Buffer) +},{"./to-iso-string":37,"_process":67,"buffer":44,"debug":2,"fs":42,"glob":42,"json3":54,"path":42,"util":84}],39:[function(require,module,exports){ +'use strict' + +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +function init () { + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i + } + + revLookup['-'.charCodeAt(0)] = 62 + revLookup['_'.charCodeAt(0)] = 63 +} + +init() + +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} + +},{}],40:[function(require,module,exports){ + +},{}],41:[function(require,module,exports){ +(function (process){ +var WritableStream = require('stream').Writable +var inherits = require('util').inherits + +module.exports = BrowserStdout + + +inherits(BrowserStdout, WritableStream) + +function BrowserStdout(opts) { + if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) + + opts = opts || {} + WritableStream.call(this, opts) + this.label = (opts.label !== undefined) ? opts.label : 'stdout' +} + +BrowserStdout.prototype._write = function(chunks, encoding, cb) { + var output = chunks.toString ? chunks.toString() : chunks + if (this.label === false) { + console.log(output) + } else { + console.log(this.label+':', output) + } + process.nextTick(cb) +} + +}).call(this,require('_process')) +},{"_process":67,"stream":79,"util":84}],42:[function(require,module,exports){ +arguments[4][40][0].apply(exports,arguments) +},{"dup":40}],43:[function(require,module,exports){ +(function (global){ +'use strict'; + +var buffer = require('buffer'); +var Buffer = buffer.Buffer; +var SlowBuffer = buffer.SlowBuffer; +var MAX_LEN = buffer.kMaxLength || 2147483647; +exports.alloc = function alloc(size, fill, encoding) { + if (typeof Buffer.alloc === 'function') { + return Buffer.alloc(size, fill, encoding); + } + if (typeof encoding === 'number') { + throw new TypeError('encoding must not be number'); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + var enc = encoding; + var _fill = fill; + if (_fill === undefined) { + enc = undefined; + _fill = 0; + } + var buf = new Buffer(size); + if (typeof _fill === 'string') { + var fillBuf = new Buffer(_fill, enc); + var flen = fillBuf.length; + var i = -1; + while (++i < size) { + buf[i] = fillBuf[i % flen]; + } + } else { + buf.fill(_fill); + } + return buf; +} +exports.allocUnsafe = function allocUnsafe(size) { + if (typeof Buffer.allocUnsafe === 'function') { + return Buffer.allocUnsafe(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + return new Buffer(size); +} +exports.from = function from(value, encodingOrOffset, length) { + if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { + return Buffer.from(value, encodingOrOffset, length); + } + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number'); + } + if (typeof value === 'string') { + return new Buffer(value, encodingOrOffset); + } + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + var offset = encodingOrOffset; + if (arguments.length === 1) { + return new Buffer(value); + } + if (typeof offset === 'undefined') { + offset = 0; + } + var len = length; + if (typeof len === 'undefined') { + len = value.byteLength - offset; + } + if (offset >= value.byteLength) { + throw new RangeError('\'offset\' is out of bounds'); + } + if (len > value.byteLength - offset) { + throw new RangeError('\'length\' is out of bounds'); + } + return new Buffer(value.slice(offset, offset + len)); + } + if (Buffer.isBuffer(value)) { + var out = new Buffer(value.length); + value.copy(out, 0, 0, value.length); + return out; + } + if (value) { + if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { + return new Buffer(value); + } + if (value.type === 'Buffer' && Array.isArray(value.data)) { + return new Buffer(value.data); + } + } + + throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); +} +exports.allocUnsafeSlow = function allocUnsafeSlow(size) { + if (typeof Buffer.allocUnsafeSlow === 'function') { + return Buffer.allocUnsafeSlow(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size >= MAX_LEN) { + throw new RangeError('size is too large'); + } + return new SlowBuffer(size); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"buffer":44}],44:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('isarray') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +/* + * Export kMaxLength after typed array support is determined. + */ +exports.kMaxLength = kMaxLength() + +function typedArraySupport () { + try { + var arr = new Uint8Array(1) + arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} + return arr.foo() === 42 && // typed array instances can be augmented + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer(length) + } + that.length = length + } + + return that +} + +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { + return new Buffer(arg, encodingOrOffset, length) + } + + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) + } + return allocUnsafe(this, arg) + } + return from(this, arg, encodingOrOffset, length) +} + +Buffer.poolSize = 8192 // not used by this implementation + +// TODO: Legacy, not needed anymore. Remove in next major version. +Buffer._augment = function (arr) { + arr.__proto__ = Buffer.prototype + return arr +} + +function from (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer(that, value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(that, value, encodingOrOffset) + } + + return fromObject(that, value) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(null, value, encodingOrOffset, length) +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array + if (typeof Symbol !== 'undefined' && Symbol.species && + Buffer[Symbol.species] === Buffer) { + // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true + }) + } +} + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } +} + +function alloc (that, size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(that, size).fill(fill, encoding) + : createBuffer(that, size).fill(fill) + } + return createBuffer(that, size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(null, size, fill, encoding) +} + +function allocUnsafe (that, size) { + assertSize(size) + that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0 + } + } + return that +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(null, size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(null, size) +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength(string, encoding) | 0 + that = createBuffer(that, length) + + var actual = that.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual) + } + + return that +} + +function fromArrayLike (that, array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + that = createBuffer(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array, byteOffset, length) { + array.byteLength // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array) + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset) + } else { + array = new Uint8Array(array, byteOffset, length) + } + + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike(that, array) + } + return that +} + +function fromObject (that, obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + that = createBuffer(that, len) + + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len) + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan(obj.length)) { + return createBuffer(that, 0) + } + return fromArrayLike(that, obj) + } + + if (obj.type === 'Buffer' && isArray(obj.data)) { + return fromArrayLike(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') +} + +function checked (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string + } + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect +// Buffer instances. +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!Buffer.isBuffer(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (Buffer.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = this.subarray(start, end) + newBuf.__proto__ = Buffer.prototype + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; ++i) { + newBuf[i] = this[i + start] + } + } + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if (code < 256) { + val = code + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : utf8ToBytes(new Buffer(val, encoding).toString()) + var len = bytes.length + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +function isnan (val) { + return val !== val // eslint-disable-line no-self-compare +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":39,"ieee754":50,"isarray":53}],45:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":52}],46:[function(require,module,exports){ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +(function(global, undefined) { + var objectPrototypeToString = Object.prototype.toString; + + /*istanbul ignore next*/ + function map(arr, mapper, that) { + if (Array.prototype.map) { + return Array.prototype.map.call(arr, mapper, that); + } + + var other = new Array(arr.length); + + for (var i = 0, n = arr.length; i < n; i++) { + other[i] = mapper.call(that, arr[i], i, arr); + } + return other; + } + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. + function canonicalize(obj, stack, replacementStack) { + stack = stack || []; + replacementStack = replacementStack || []; + + var i; + + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + + var canonicalizedObj; + + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else if (typeof obj === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + var sortedKeys = [], + key; + for (key in obj) { + sortedKeys.push(key); + } + sortedKeys.sort(); + for (i = 0; i < sortedKeys.length; i += 1) { + key = sortedKeys[i]; + canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + return canonicalizedObj; + } + + function buildValues(components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = map(value, function(value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); + + component.value = value.join(''); + } else { + component.value = newString.slice(newPos, newPos + component.count).join(''); + } + newPos += component.count; + + // Common case + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = oldString.slice(oldPos, oldPos + component.count).join(''); + oldPos += component.count; + + // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } + } + } + + return components; + } + + function Diff(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + } + Diff.prototype = { + diff: function(oldString, newString, callback) { + var self = this; + + function done(value) { + if (callback) { + setTimeout(function() { callback(undefined, value); }, 0); + return true; + } else { + return value; + } + } + + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return done([{ value: newString }]); + } + if (!newString) { + return done([{ value: oldString, removed: true }]); + } + if (!oldString) { + return done([{ value: newString, added: true }]); + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0, i.e. the content starts with the same values + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{value: newString.join('')}]); + } + + // Main worker method. checks all permutations of a given edit length for acceptance. + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath; + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); + + // If we have hit the end of both strings, then we are done + if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } + + // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + if (callback) { + (function exec() { + setTimeout(function() { + // This should not happen, but we want to be safe. + /*istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } + + if (!execEditLength()) { + exec(); + } + }, 0); + }()); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + } + }, + + pushComponent: function(components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; + } else { + components.push({count: 1, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, + + commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({count: commonCount}); + } + + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); + }, + tokenize: function(value) { + return value.split(''); + } + }; + + var CharDiff = new Diff(); + + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new Diff(); + + var TrimmedLineDiff = new Diff(); + TrimmedLineDiff.ignoreTrim = true; + + LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { + var retLines = [], + lines = value.split(/^/m); + for (var i = 0; i < lines.length; i++) { + var line = lines[i], + lastLine = lines[i - 1], + lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; + + // Merge lines that may contain windows new lines + if (line === '\n' && lastLineLastChar === '\r') { + retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; + } else { + if (this.ignoreTrim) { + line = line.trim(); + // add a newline unless this is the last line. + if (i < lines.length - 1) { + line += '\n'; + } + } + retLines.push(line); + } + } + + return retLines; + }; + + var PatchDiff = new Diff(); + PatchDiff.tokenize = function(value) { + var ret = [], + linesAndNewlines = value.split(/(\n|\r\n)/); + + // Ignore the final empty token that occurs if the string ends with a new line + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } + + // Merge the content and line separators into single tokens + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + + if (i % 2) { + ret[ret.length - 1] += line; + } else { + ret.push(line); + } + } + return ret; + }; + + var SentenceDiff = new Diff(); + SentenceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); + }; + + var JsonDiff = new Diff(); + // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + JsonDiff.useLongestToken = true; + JsonDiff.tokenize = LineDiff.tokenize; + JsonDiff.equals = function(left, right) { + return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); + }; + + var JsDiff = { + Diff: Diff, + + diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, + diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, + diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, + diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, + diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, + + diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, + + diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, + diffJson: function(oldObj, newObj, callback) { + return JsonDiff.diff( + typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), + typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), + callback + ); + }, + + createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + if (oldFileName == newFileName) { + ret.push('Index: ' + oldFileName); + } + ret.push('==================================================================='); + ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + + var diff = PatchDiff.diff(oldStr, newStr); + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + + // Formats a given set of lines for printing as context lines in a patch + function contextLines(lines) { + return map(lines, function(entry) { return ' ' + entry; }); + } + + // Outputs the no newline at end of file warning if needed + function eofNL(curRange, i, current) { + var last = diff[diff.length - 2], + isLast = i === diff.length - 2, + isLastOfType = i === diff.length - 3 && current.added !== last.added; + + // Figure out if this is the last line for the given file and missing NL + if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + + // Output our changes + curRange.push.apply(curRange, map(lines, function(entry) { + return (current.added ? '+' : '-') + entry; + })); + eofNL(curRange, i, current); + + // Track the updated file position + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length - 2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) + + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); + }, + + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'), + hunks = [], + i = 0, + remEOFNL = false, + addEOFNL = false; + + // Skip to the first change hunk + while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { + i++; + } + + // Parse the unified diff + for (; i < diffstr.length; i++) { + if (diffstr[i][0] === '@') { + var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + hunks.unshift({ + start: chnukHeader[3], + oldlength: +chnukHeader[2], + removed: [], + newlength: chnukHeader[4], + added: [] + }); + } else if (diffstr[i][0] === '+') { + hunks[0].added.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '-') { + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === ' ') { + hunks[0].added.push(diffstr[i].substr(1)); + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '\\') { + if (diffstr[i - 1][0] === '+') { + remEOFNL = true; + } else if (diffstr[i - 1][0] === '-') { + addEOFNL = true; + } + } + } + + // Apply the diff to the input + var lines = oldStr.split('\n'); + for (i = hunks.length - 1; i >= 0; i--) { + var hunk = hunks[i]; + // Sanity check the input string. Bail if we don't match. + for (var j = 0; j < hunk.oldlength; j++) { + if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { + return false; + } + } + Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); + } + + // Handle EOFNL insertion/removal + if (remEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + } + } else if (addEOFNL) { + lines.push(''); + } + return lines.join('\n'); + }, + + convertChangesToXML: function(changes) { + var ret = []; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes) { + var ret = [], + change, + operation; + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } + + ret.push([operation, change.value]); + } + return ret; + }, + + canonicalize: canonicalize + }; + + /*istanbul ignore next */ + /*global module */ + if (typeof module !== 'undefined' && module.exports) { + module.exports = JsDiff; + } else if (false) { + /*global define */ + define([], function() { return JsDiff; }); + } else if (typeof global.JsDiff === 'undefined') { + global.JsDiff = JsDiff; + } +}(this)); + +},{}],47:[function(require,module,exports){ +'use strict'; + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + + return str.replace(matchOperatorsRe, '\\$&'); +}; + +},{}],48:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); + } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; + + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; + +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],49:[function(require,module,exports){ +(function (process){ +// Growl - Copyright TJ Holowaychuk (MIT Licensed) + +/** + * Module dependencies. + */ + +var exec = require('child_process').exec + , fs = require('fs') + , path = require('path') + , exists = fs.existsSync || path.existsSync + , os = require('os') + , quote = JSON.stringify + , cmd; + +function which(name) { + var paths = process.env.PATH.split(':'); + var loc; + + for (var i = 0, len = paths.length; i < len; ++i) { + loc = path.join(paths[i], name); + if (exists(loc)) return loc; + } +} + +switch(os.type()) { + case 'Darwin': + if (which('terminal-notifier')) { + cmd = { + type: "Darwin-NotificationCenter" + , pkg: "terminal-notifier" + , msg: '-message' + , title: '-title' + , subtitle: '-subtitle' + , icon: '-appIcon' + , sound: '-sound' + , url: '-open' + , priority: { + cmd: '-execute' + , range: [] + } + }; + } else { + cmd = { + type: "Darwin-Growl" + , pkg: "growlnotify" + , msg: '-m' + , sticky: '--sticky' + , priority: { + cmd: '--priority' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + , "Very Low" + , "Moderate" + , "Normal" + , "High" + , "Emergency" + ] + } + }; + } + break; + case 'Linux': + if (which('growl')) { + cmd = { + type: "Linux-Growl" + , pkg: "growl" + , msg: '-m' + , title: '-title' + , subtitle: '-subtitle' + , host: { + cmd: '-H' + , hostname: '192.168.33.1' + } + }; + } else { + cmd = { + type: "Linux" + , pkg: "notify-send" + , msg: '' + , sticky: '-t 0' + , icon: '-i' + , priority: { + cmd: '-u' + , range: [ + "low" + , "normal" + , "critical" + ] + } + }; + } + break; + case 'Windows_NT': + cmd = { + type: "Windows" + , pkg: "growlnotify" + , msg: '' + , sticky: '/s:true' + , title: '/t:' + , icon: '/i:' + , url: '/cu:' + , priority: { + cmd: '/p:' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + ] + } + }; + break; +} + +/** + * Expose `growl`. + */ + +exports = module.exports = growl; + +/** + * Node-growl version. + */ + +exports.version = '1.4.1' + +/** + * Send growl notification _msg_ with _options_. + * + * Options: + * + * - title Notification title + * - sticky Make the notification stick (defaults to false) + * - priority Specify an int or named key (default is 0) + * - name Application name (defaults to growlnotify) + * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x + * - image + * - path to an icon sets --iconpath + * - path to an image sets --image + * - capitalized word sets --appIcon + * - filename uses extname as --icon + * - otherwise treated as --icon + * + * Examples: + * + * growl('New email') + * growl('5 new emails', { title: 'Thunderbird' }) + * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' }) + * growl('Email sent', function(){ + * // ... notification sent + * }) + * + * @param {string} msg + * @param {object} options + * @param {function} fn + * @api public + */ + +function growl(msg, options, fn) { + var image + , args + , options = options || {} + , fn = fn || function(){}; + + if (options.exec) { + cmd = { + type: "Custom" + , pkg: options.exec + , range: [] + }; + } + + // noop + if (!cmd) return fn(new Error('growl not supported on this platform')); + args = [cmd.pkg]; + + // image + if (image = options.image) { + switch(cmd.type) { + case 'Darwin-Growl': + var flag, ext = path.extname(image).substr(1) + flag = flag || ext == 'icns' && 'iconpath' + flag = flag || /^[A-Z]/.test(image) && 'appIcon' + flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' + flag = flag || ext && (image = ext) && 'icon' + flag = flag || 'icon' + args.push('--' + flag, quote(image)) + break; + case 'Darwin-NotificationCenter': + args.push(cmd.icon, quote(image)); + break; + case 'Linux': + args.push(cmd.icon, quote(image)); + // libnotify defaults to sticky, set a hint for transient notifications + if (!options.sticky) args.push('--hint=int:transient:1'); + break; + case 'Windows': + args.push(cmd.icon + quote(image)); + break; + } + } + + // sticky + if (options.sticky) args.push(cmd.sticky); + + // priority + if (options.priority) { + var priority = options.priority + ''; + var checkindexOf = cmd.priority.range.indexOf(priority); + if (~cmd.priority.range.indexOf(priority)) { + args.push(cmd.priority, options.priority); + } + } + + //sound + if(options.sound && cmd.type === 'Darwin-NotificationCenter'){ + args.push(cmd.sound, options.sound) + } + + // name + if (options.name && cmd.type === "Darwin-Growl") { + args.push('--name', options.name); + } + + switch(cmd.type) { + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(quote(options.title)); + break; + case 'Darwin-NotificationCenter': + args.push(cmd.msg); + var stringifiedMsg = quote(msg); + var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n'); + args.push(escapedMsg); + if (options.title) { + args.push(cmd.title); + args.push(quote(options.title)); + } + if (options.subtitle) { + args.push(cmd.subtitle); + args.push(quote(options.subtitle)); + } + if (options.url) { + args.push(cmd.url); + args.push(quote(options.url)); + } + break; + case 'Linux-Growl': + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(quote(options.title)); + if (cmd.host) { + args.push(cmd.host.cmd, cmd.host.hostname) + } + break; + case 'Linux': + if (options.title) { + args.push(quote(options.title)); + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + } else { + args.push(quote(msg).replace(/\\n/g, '\n')); + } + break; + case 'Windows': + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(cmd.title + quote(options.title)); + if (options.url) args.push(cmd.url + quote(options.url)); + break; + case 'Custom': + args[0] = (function(origCommand) { + var message = options.title + ? options.title + ': ' + msg + : msg; + var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message)); + if (command === origCommand) args.push(quote(message)); + return command; + })(args[0]); + break; + } + + // execute + exec(args.join(' '), fn); +}; + +}).call(this,require('_process')) +},{"_process":67,"child_process":42,"fs":42,"os":65,"path":42}],50:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],51:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],52:[function(require,module,exports){ +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + +},{}],53:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + +},{}],54:[function(require,module,exports){ +(function (global){ +/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */ +;(function () { + // Detect the `define` function exposed by asynchronous module loaders. The + // strict `define` check is necessary for compatibility with `r.js`. + var isLoader = false; + + // A set of types used to distinguish objects from primitives. + var objectTypes = { + "function": true, + "object": true + }; + + // Detect the `exports` object exposed by CommonJS implementations. + var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; + + // Use the `global` object exposed by Node (including Browserify via + // `insert-module-globals`), Narwhal, and Ringo as the default context, + // and the `window` object in browsers. Rhino exports a `global` function + // instead. + var root = objectTypes[typeof window] && window || this, + freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == "object" && global; + + if (freeGlobal && (freeGlobal["global"] === freeGlobal || freeGlobal["window"] === freeGlobal || freeGlobal["self"] === freeGlobal)) { + root = freeGlobal; + } + + // Public: Initializes JSON 3 using the given `context` object, attaching the + // `stringify` and `parse` functions to the specified `exports` object. + function runInContext(context, exports) { + context || (context = root["Object"]()); + exports || (exports = root["Object"]()); + + // Native constructor aliases. + var Number = context["Number"] || root["Number"], + String = context["String"] || root["String"], + Object = context["Object"] || root["Object"], + Date = context["Date"] || root["Date"], + SyntaxError = context["SyntaxError"] || root["SyntaxError"], + TypeError = context["TypeError"] || root["TypeError"], + Math = context["Math"] || root["Math"], + nativeJSON = context["JSON"] || root["JSON"]; + + // Delegate to the native `stringify` and `parse` implementations. + if (typeof nativeJSON == "object" && nativeJSON) { + exports.stringify = nativeJSON.stringify; + exports.parse = nativeJSON.parse; + } + + // Convenience aliases. + var objectProto = Object.prototype, + getClass = objectProto.toString, + isProperty, forEach, undef; + + // Test the `Date#getUTC*` methods. Based on work by @Yaffle. + var isExtended = new Date(-3509827334573292); + try { + // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical + // results for certain dates in Opera >= 10.53. + isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 && + // Safari < 2.0.2 stores the internal millisecond time value correctly, + // but clips the values returned by the date methods to the range of + // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]). + isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708; + } catch (exception) {} + + // Internal: Determines whether the native `JSON.stringify` and `parse` + // implementations are spec-compliant. Based on work by Ken Snyder. + function has(name) { + if (has[name] !== undef) { + // Return cached feature test result. + return has[name]; + } + var isSupported; + if (name == "bug-string-char-index") { + // IE <= 7 doesn't support accessing string characters using square + // bracket notation. IE 8 only supports this for primitives. + isSupported = "a"[0] != "a"; + } else if (name == "json") { + // Indicates whether both `JSON.stringify` and `JSON.parse` are + // supported. + isSupported = has("json-stringify") && has("json-parse"); + } else { + var value, serialized = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}'; + // Test `JSON.stringify`. + if (name == "json-stringify") { + var stringify = exports.stringify, stringifySupported = typeof stringify == "function" && isExtended; + if (stringifySupported) { + // A test function object with a custom `toJSON` method. + (value = function () { + return 1; + }).toJSON = value; + try { + stringifySupported = + // Firefox 3.1b1 and b2 serialize string, number, and boolean + // primitives as object literals. + stringify(0) === "0" && + // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object + // literals. + stringify(new Number()) === "0" && + stringify(new String()) == '""' && + // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or + // does not define a canonical JSON representation (this applies to + // objects with `toJSON` properties as well, *unless* they are nested + // within an object or array). + stringify(getClass) === undef && + // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and + // FF 3.1b3 pass this test. + stringify(undef) === undef && + // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s, + // respectively, if the value is omitted entirely. + stringify() === undef && + // FF 3.1b1, 2 throw an error if the given value is not a number, + // string, array, object, Boolean, or `null` literal. This applies to + // objects with custom `toJSON` methods as well, unless they are nested + // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON` + // methods entirely. + stringify(value) === "1" && + stringify([value]) == "[1]" && + // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of + // `"[null]"`. + stringify([undef]) == "[null]" && + // YUI 3.0.0b1 fails to serialize `null` literals. + stringify(null) == "null" && + // FF 3.1b1, 2 halts serialization if an array contains a function: + // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3 + // elides non-JSON values from objects and arrays, unless they + // define custom `toJSON` methods. + stringify([undef, getClass, null]) == "[null,null,null]" && + // Simple serialization test. FF 3.1b1 uses Unicode escape sequences + // where character escape codes are expected (e.g., `\b` => `\u0008`). + stringify({ "a": [value, true, false, null, "\x00\b\n\f\r\t"] }) == serialized && + // FF 3.1b1 and b2 ignore the `filter` and `width` arguments. + stringify(null, value) === "1" && + stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" && + // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly + // serialize extended years. + stringify(new Date(-8.64e15)) == '"-271821-04-20T00:00:00.000Z"' && + // The milliseconds are optional in ES 5, but required in 5.1. + stringify(new Date(8.64e15)) == '"+275760-09-13T00:00:00.000Z"' && + // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative + // four-digit years instead of six-digit years. Credits: @Yaffle. + stringify(new Date(-621987552e5)) == '"-000001-01-01T00:00:00.000Z"' && + // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond + // values less than 1000. Credits: @Yaffle. + stringify(new Date(-1)) == '"1969-12-31T23:59:59.999Z"'; + } catch (exception) { + stringifySupported = false; + } + } + isSupported = stringifySupported; + } + // Test `JSON.parse`. + if (name == "json-parse") { + var parse = exports.parse; + if (typeof parse == "function") { + try { + // FF 3.1b1, b2 will throw an exception if a bare literal is provided. + // Conforming implementations should also coerce the initial argument to + // a string prior to parsing. + if (parse("0") === 0 && !parse(false)) { + // Simple parsing test. + value = parse(serialized); + var parseSupported = value["a"].length == 5 && value["a"][0] === 1; + if (parseSupported) { + try { + // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings. + parseSupported = !parse('"\t"'); + } catch (exception) {} + if (parseSupported) { + try { + // FF 4.0 and 4.0.1 allow leading `+` signs and leading + // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow + // certain octal literals. + parseSupported = parse("01") !== 1; + } catch (exception) {} + } + if (parseSupported) { + try { + // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal + // points. These environments, along with FF 3.1b1 and 2, + // also allow trailing commas in JSON objects and arrays. + parseSupported = parse("1.") !== 1; + } catch (exception) {} + } + } + } + } catch (exception) { + parseSupported = false; + } + } + isSupported = parseSupported; + } + } + return has[name] = !!isSupported; + } + + if (!has("json")) { + // Common `[[Class]]` name aliases. + var functionClass = "[object Function]", + dateClass = "[object Date]", + numberClass = "[object Number]", + stringClass = "[object String]", + arrayClass = "[object Array]", + booleanClass = "[object Boolean]"; + + // Detect incomplete support for accessing string characters by index. + var charIndexBuggy = has("bug-string-char-index"); + + // Define additional utility methods if the `Date` methods are buggy. + if (!isExtended) { + var floor = Math.floor; + // A mapping between the months of the year and the number of days between + // January 1st and the first of the respective month. + var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; + // Internal: Calculates the number of days between the Unix epoch and the + // first day of the given month. + var getDay = function (year, month) { + return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400); + }; + } + + // Internal: Determines if a property is a direct property of the given + // object. Delegates to the native `Object#hasOwnProperty` method. + if (!(isProperty = objectProto.hasOwnProperty)) { + isProperty = function (property) { + var members = {}, constructor; + if ((members.__proto__ = null, members.__proto__ = { + // The *proto* property cannot be set multiple times in recent + // versions of Firefox and SeaMonkey. + "toString": 1 + }, members).toString != getClass) { + // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but + // supports the mutable *proto* property. + isProperty = function (property) { + // Capture and break the object's prototype chain (see section 8.6.2 + // of the ES 5.1 spec). The parenthesized expression prevents an + // unsafe transformation by the Closure Compiler. + var original = this.__proto__, result = property in (this.__proto__ = null, this); + // Restore the original prototype chain. + this.__proto__ = original; + return result; + }; + } else { + // Capture a reference to the top-level `Object` constructor. + constructor = members.constructor; + // Use the `constructor` property to simulate `Object#hasOwnProperty` in + // other environments. + isProperty = function (property) { + var parent = (this.constructor || constructor).prototype; + return property in this && !(property in parent && this[property] === parent[property]); + }; + } + members = null; + return isProperty.call(this, property); + }; + } + + // Internal: Normalizes the `for...in` iteration algorithm across + // environments. Each enumerated key is yielded to a `callback` function. + forEach = function (object, callback) { + var size = 0, Properties, members, property; + + // Tests for bugs in the current environment's `for...in` algorithm. The + // `valueOf` property inherits the non-enumerable flag from + // `Object.prototype` in older versions of IE, Netscape, and Mozilla. + (Properties = function () { + this.valueOf = 0; + }).prototype.valueOf = 0; + + // Iterate over a new instance of the `Properties` class. + members = new Properties(); + for (property in members) { + // Ignore all properties inherited from `Object.prototype`. + if (isProperty.call(members, property)) { + size++; + } + } + Properties = members = null; + + // Normalize the iteration algorithm. + if (!size) { + // A list of non-enumerable properties inherited from `Object.prototype`. + members = ["valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor"]; + // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable + // properties. + forEach = function (object, callback) { + var isFunction = getClass.call(object) == functionClass, property, length; + var hasProperty = !isFunction && typeof object.constructor != "function" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty; + for (property in object) { + // Gecko <= 1.0 enumerates the `prototype` property of functions under + // certain conditions; IE does not. + if (!(isFunction && property == "prototype") && hasProperty.call(object, property)) { + callback(property); + } + } + // Manually invoke the callback for each non-enumerable property. + for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property)); + }; + } else if (size == 2) { + // Safari <= 2.0.4 enumerates shadowed properties twice. + forEach = function (object, callback) { + // Create a set of iterated properties. + var members = {}, isFunction = getClass.call(object) == functionClass, property; + for (property in object) { + // Store each property name to prevent double enumeration. The + // `prototype` property of functions is not enumerated due to cross- + // environment inconsistencies. + if (!(isFunction && property == "prototype") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) { + callback(property); + } + } + }; + } else { + // No bugs detected; use the standard `for...in` algorithm. + forEach = function (object, callback) { + var isFunction = getClass.call(object) == functionClass, property, isConstructor; + for (property in object) { + if (!(isFunction && property == "prototype") && isProperty.call(object, property) && !(isConstructor = property === "constructor")) { + callback(property); + } + } + // Manually invoke the callback for the `constructor` property due to + // cross-environment inconsistencies. + if (isConstructor || isProperty.call(object, (property = "constructor"))) { + callback(property); + } + }; + } + return forEach(object, callback); + }; + + // Public: Serializes a JavaScript `value` as a JSON string. The optional + // `filter` argument may specify either a function that alters how object and + // array members are serialized, or an array of strings and numbers that + // indicates which properties should be serialized. The optional `width` + // argument may be either a string or number that specifies the indentation + // level of the output. + if (!has("json-stringify")) { + // Internal: A map of control characters and their escaped equivalents. + var Escapes = { + 92: "\\\\", + 34: '\\"', + 8: "\\b", + 12: "\\f", + 10: "\\n", + 13: "\\r", + 9: "\\t" + }; + + // Internal: Converts `value` into a zero-padded string such that its + // length is at least equal to `width`. The `width` must be <= 6. + var leadingZeroes = "000000"; + var toPaddedString = function (width, value) { + // The `|| 0` expression is necessary to work around a bug in + // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`. + return (leadingZeroes + (value || 0)).slice(-width); + }; + + // Internal: Double-quotes a string `value`, replacing all ASCII control + // characters (characters with code unit values between 0 and 31) with + // their escaped equivalents. This is an implementation of the + // `Quote(value)` operation defined in ES 5.1 section 15.12.3. + var unicodePrefix = "\\u00"; + var quote = function (value) { + var result = '"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10; + var symbols = useCharIndex && (charIndexBuggy ? value.split("") : value); + for (; index < length; index++) { + var charCode = value.charCodeAt(index); + // If the character is a control character, append its Unicode or + // shorthand escape sequence; otherwise, append the character as-is. + switch (charCode) { + case 8: case 9: case 10: case 12: case 13: case 34: case 92: + result += Escapes[charCode]; + break; + default: + if (charCode < 32) { + result += unicodePrefix + toPaddedString(2, charCode.toString(16)); + break; + } + result += useCharIndex ? symbols[index] : value.charAt(index); + } + } + return result + '"'; + }; + + // Internal: Recursively serializes an object. Implements the + // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations. + var serialize = function (property, object, callback, properties, whitespace, indentation, stack) { + var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result; + try { + // Necessary for host object support. + value = object[property]; + } catch (exception) {} + if (typeof value == "object" && value) { + className = getClass.call(value); + if (className == dateClass && !isProperty.call(value, "toJSON")) { + if (value > -1 / 0 && value < 1 / 0) { + // Dates are serialized according to the `Date#toJSON` method + // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15 + // for the ISO 8601 date time string format. + if (getDay) { + // Manually compute the year, month, date, hours, minutes, + // seconds, and milliseconds if the `getUTC*` methods are + // buggy. Adapted from @Yaffle's `date-shim` project. + date = floor(value / 864e5); + for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++); + for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++); + date = 1 + date - getDay(year, month); + // The `time` value specifies the time within the day (see ES + // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used + // to compute `A modulo B`, as the `%` operator does not + // correspond to the `modulo` operation for negative numbers. + time = (value % 864e5 + 864e5) % 864e5; + // The hours, minutes, seconds, and milliseconds are obtained by + // decomposing the time within the day. See section 15.9.1.10. + hours = floor(time / 36e5) % 24; + minutes = floor(time / 6e4) % 60; + seconds = floor(time / 1e3) % 60; + milliseconds = time % 1e3; + } else { + year = value.getUTCFullYear(); + month = value.getUTCMonth(); + date = value.getUTCDate(); + hours = value.getUTCHours(); + minutes = value.getUTCMinutes(); + seconds = value.getUTCSeconds(); + milliseconds = value.getUTCMilliseconds(); + } + // Serialize extended years correctly. + value = (year <= 0 || year >= 1e4 ? (year < 0 ? "-" : "+") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) + + "-" + toPaddedString(2, month + 1) + "-" + toPaddedString(2, date) + + // Months, dates, hours, minutes, and seconds should have two + // digits; milliseconds should have three. + "T" + toPaddedString(2, hours) + ":" + toPaddedString(2, minutes) + ":" + toPaddedString(2, seconds) + + // Milliseconds are optional in ES 5.0, but required in 5.1. + "." + toPaddedString(3, milliseconds) + "Z"; + } else { + value = null; + } + } else if (typeof value.toJSON == "function" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, "toJSON"))) { + // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the + // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3 + // ignores all `toJSON` methods on these objects unless they are + // defined directly on an instance. + value = value.toJSON(property); + } + } + if (callback) { + // If a replacement function was provided, call it to obtain the value + // for serialization. + value = callback.call(object, property, value); + } + if (value === null) { + return "null"; + } + className = getClass.call(value); + if (className == booleanClass) { + // Booleans are represented literally. + return "" + value; + } else if (className == numberClass) { + // JSON numbers must be finite. `Infinity` and `NaN` are serialized as + // `"null"`. + return value > -1 / 0 && value < 1 / 0 ? "" + value : "null"; + } else if (className == stringClass) { + // Strings are double-quoted and escaped. + return quote("" + value); + } + // Recursively serialize objects and arrays. + if (typeof value == "object") { + // Check for cyclic structures. This is a linear search; performance + // is inversely proportional to the number of unique nested objects. + for (length = stack.length; length--;) { + if (stack[length] === value) { + // Cyclic structures cannot be serialized by `JSON.stringify`. + throw TypeError(); + } + } + // Add the object to the stack of traversed objects. + stack.push(value); + results = []; + // Save the current indentation level and indent one additional level. + prefix = indentation; + indentation += whitespace; + if (className == arrayClass) { + // Recursively serialize array elements. + for (index = 0, length = value.length; index < length; index++) { + element = serialize(index, value, callback, properties, whitespace, indentation, stack); + results.push(element === undef ? "null" : element); + } + result = results.length ? (whitespace ? "[\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "]" : ("[" + results.join(",") + "]")) : "[]"; + } else { + // Recursively serialize object members. Members are selected from + // either a user-specified list of property names, or the object + // itself. + forEach(properties || value, function (property) { + var element = serialize(property, value, callback, properties, whitespace, indentation, stack); + if (element !== undef) { + // According to ES 5.1 section 15.12.3: "If `gap` {whitespace} + // is not the empty string, let `member` {quote(property) + ":"} + // be the concatenation of `member` and the `space` character." + // The "`space` character" refers to the literal space + // character, not the `space` {width} argument provided to + // `JSON.stringify`. + results.push(quote(property) + ":" + (whitespace ? " " : "") + element); + } + }); + result = results.length ? (whitespace ? "{\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "}" : ("{" + results.join(",") + "}")) : "{}"; + } + // Remove the object from the traversed object stack. + stack.pop(); + return result; + } + }; + + // Public: `JSON.stringify`. See ES 5.1 section 15.12.3. + exports.stringify = function (source, filter, width) { + var whitespace, callback, properties, className; + if (objectTypes[typeof filter] && filter) { + if ((className = getClass.call(filter)) == functionClass) { + callback = filter; + } else if (className == arrayClass) { + // Convert the property names array into a makeshift set. + properties = {}; + for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1)); + } + } + if (width) { + if ((className = getClass.call(width)) == numberClass) { + // Convert the `width` to an integer and create a string containing + // `width` number of space characters. + if ((width -= width % 1) > 0) { + for (whitespace = "", width > 10 && (width = 10); whitespace.length < width; whitespace += " "); + } + } else if (className == stringClass) { + whitespace = width.length <= 10 ? width : width.slice(0, 10); + } + } + // Opera <= 7.54u2 discards the values associated with empty string keys + // (`""`) only if they are used directly within an object member list + // (e.g., `!("" in { "": 1})`). + return serialize("", (value = {}, value[""] = source, value), callback, properties, whitespace, "", []); + }; + } + + // Public: Parses a JSON source string. + if (!has("json-parse")) { + var fromCharCode = String.fromCharCode; + + // Internal: A map of escaped control characters and their unescaped + // equivalents. + var Unescapes = { + 92: "\\", + 34: '"', + 47: "/", + 98: "\b", + 116: "\t", + 110: "\n", + 102: "\f", + 114: "\r" + }; + + // Internal: Stores the parser state. + var Index, Source; + + // Internal: Resets the parser state and throws a `SyntaxError`. + var abort = function () { + Index = Source = null; + throw SyntaxError(); + }; + + // Internal: Returns the next token, or `"$"` if the parser has reached + // the end of the source string. A token may be a string, number, `null` + // literal, or Boolean literal. + var lex = function () { + var source = Source, length = source.length, value, begin, position, isSigned, charCode; + while (Index < length) { + charCode = source.charCodeAt(Index); + switch (charCode) { + case 9: case 10: case 13: case 32: + // Skip whitespace tokens, including tabs, carriage returns, line + // feeds, and space characters. + Index++; + break; + case 123: case 125: case 91: case 93: case 58: case 44: + // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at + // the current position. + value = charIndexBuggy ? source.charAt(Index) : source[Index]; + Index++; + return value; + case 34: + // `"` delimits a JSON string; advance to the next character and + // begin parsing the string. String tokens are prefixed with the + // sentinel `@` character to distinguish them from punctuators and + // end-of-string tokens. + for (value = "@", Index++; Index < length;) { + charCode = source.charCodeAt(Index); + if (charCode < 32) { + // Unescaped ASCII control characters (those with a code unit + // less than the space character) are not permitted. + abort(); + } else if (charCode == 92) { + // A reverse solidus (`\`) marks the beginning of an escaped + // control character (including `"`, `\`, and `/`) or Unicode + // escape sequence. + charCode = source.charCodeAt(++Index); + switch (charCode) { + case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114: + // Revive escaped control characters. + value += Unescapes[charCode]; + Index++; + break; + case 117: + // `\u` marks the beginning of a Unicode escape sequence. + // Advance to the first character and validate the + // four-digit code point. + begin = ++Index; + for (position = Index + 4; Index < position; Index++) { + charCode = source.charCodeAt(Index); + // A valid sequence comprises four hexdigits (case- + // insensitive) that form a single hexadecimal value. + if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) { + // Invalid Unicode escape sequence. + abort(); + } + } + // Revive the escaped character. + value += fromCharCode("0x" + source.slice(begin, Index)); + break; + default: + // Invalid escape sequence. + abort(); + } + } else { + if (charCode == 34) { + // An unescaped double-quote character marks the end of the + // string. + break; + } + charCode = source.charCodeAt(Index); + begin = Index; + // Optimize for the common case where a string is valid. + while (charCode >= 32 && charCode != 92 && charCode != 34) { + charCode = source.charCodeAt(++Index); + } + // Append the string as-is. + value += source.slice(begin, Index); + } + } + if (source.charCodeAt(Index) == 34) { + // Advance to the next character and return the revived string. + Index++; + return value; + } + // Unterminated string. + abort(); + default: + // Parse numbers and literals. + begin = Index; + // Advance past the negative sign, if one is specified. + if (charCode == 45) { + isSigned = true; + charCode = source.charCodeAt(++Index); + } + // Parse an integer or floating-point value. + if (charCode >= 48 && charCode <= 57) { + // Leading zeroes are interpreted as octal literals. + if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) { + // Illegal octal literal. + abort(); + } + isSigned = false; + // Parse the integer component. + for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++); + // Floats cannot contain a leading decimal point; however, this + // case is already accounted for by the parser. + if (source.charCodeAt(Index) == 46) { + position = ++Index; + // Parse the decimal component. + for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); + if (position == Index) { + // Illegal trailing decimal. + abort(); + } + Index = position; + } + // Parse exponents. The `e` denoting the exponent is + // case-insensitive. + charCode = source.charCodeAt(Index); + if (charCode == 101 || charCode == 69) { + charCode = source.charCodeAt(++Index); + // Skip past the sign following the exponent, if one is + // specified. + if (charCode == 43 || charCode == 45) { + Index++; + } + // Parse the exponential component. + for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); + if (position == Index) { + // Illegal empty exponent. + abort(); + } + Index = position; + } + // Coerce the parsed value to a JavaScript number. + return +source.slice(begin, Index); + } + // A negative sign may only precede numbers. + if (isSigned) { + abort(); + } + // `true`, `false`, and `null` literals. + if (source.slice(Index, Index + 4) == "true") { + Index += 4; + return true; + } else if (source.slice(Index, Index + 5) == "false") { + Index += 5; + return false; + } else if (source.slice(Index, Index + 4) == "null") { + Index += 4; + return null; + } + // Unrecognized token. + abort(); + } + } + // Return the sentinel `$` character if the parser has reached the end + // of the source string. + return "$"; + }; + + // Internal: Parses a JSON `value` token. + var get = function (value) { + var results, hasMembers; + if (value == "$") { + // Unexpected end of input. + abort(); + } + if (typeof value == "string") { + if ((charIndexBuggy ? value.charAt(0) : value[0]) == "@") { + // Remove the sentinel `@` character. + return value.slice(1); + } + // Parse object and array literals. + if (value == "[") { + // Parses a JSON array, returning a new JavaScript array. + results = []; + for (;; hasMembers || (hasMembers = true)) { + value = lex(); + // A closing square bracket marks the end of the array literal. + if (value == "]") { + break; + } + // If the array literal contains elements, the current token + // should be a comma separating the previous element from the + // next. + if (hasMembers) { + if (value == ",") { + value = lex(); + if (value == "]") { + // Unexpected trailing `,` in array literal. + abort(); + } + } else { + // A `,` must separate each array element. + abort(); + } + } + // Elisions and leading commas are not permitted. + if (value == ",") { + abort(); + } + results.push(get(value)); + } + return results; + } else if (value == "{") { + // Parses a JSON object, returning a new JavaScript object. + results = {}; + for (;; hasMembers || (hasMembers = true)) { + value = lex(); + // A closing curly brace marks the end of the object literal. + if (value == "}") { + break; + } + // If the object literal contains members, the current token + // should be a comma separator. + if (hasMembers) { + if (value == ",") { + value = lex(); + if (value == "}") { + // Unexpected trailing `,` in object literal. + abort(); + } + } else { + // A `,` must separate each object member. + abort(); + } + } + // Leading commas are not permitted, object property names must be + // double-quoted strings, and a `:` must separate each property + // name and value. + if (value == "," || typeof value != "string" || (charIndexBuggy ? value.charAt(0) : value[0]) != "@" || lex() != ":") { + abort(); + } + results[value.slice(1)] = get(lex()); + } + return results; + } + // Unexpected token encountered. + abort(); + } + return value; + }; + + // Internal: Updates a traversed object member. + var update = function (source, property, callback) { + var element = walk(source, property, callback); + if (element === undef) { + delete source[property]; + } else { + source[property] = element; + } + }; + + // Internal: Recursively traverses a parsed JSON object, invoking the + // `callback` function for each value. This is an implementation of the + // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2. + var walk = function (source, property, callback) { + var value = source[property], length; + if (typeof value == "object" && value) { + // `forEach` can't be used to traverse an array in Opera <= 8.54 + // because its `Object#hasOwnProperty` implementation returns `false` + // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`). + if (getClass.call(value) == arrayClass) { + for (length = value.length; length--;) { + update(value, length, callback); + } + } else { + forEach(value, function (property) { + update(value, property, callback); + }); + } + } + return callback.call(source, property, value); + }; + + // Public: `JSON.parse`. See ES 5.1 section 15.12.2. + exports.parse = function (source, callback) { + var result, value; + Index = 0; + Source = "" + source; + result = get(lex()); + // If a JSON string contains multiple tokens, it is invalid. + if (lex() != "$") { + abort(); + } + // Reset the parser state. + Index = Source = null; + return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[""] = result, value), "", callback) : result; + }; + } + } + + exports["runInContext"] = runInContext; + return exports; + } + + if (freeExports && !isLoader) { + // Export for CommonJS environments. + runInContext(root, freeExports); + } else { + // Export for web browsers and JavaScript engines. + var nativeJSON = root.JSON, + previousJSON = root["JSON3"], + isRestored = false; + + var JSON3 = runInContext(root, (root["JSON3"] = { + // Public: Restores the original value of the global `JSON` object and + // returns a reference to the `JSON3` object. + "noConflict": function () { + if (!isRestored) { + isRestored = true; + root.JSON = nativeJSON; + root["JSON3"] = previousJSON; + nativeJSON = previousJSON = null; + } + return JSON3; + } + })); + + root.JSON = { + "parse": JSON3.parse, + "stringify": JSON3.stringify + }; + } + + // Export for asynchronous module loaders. + if (isLoader) { + define(function () { + return JSON3; + }); + } +}).call(this); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],55:[function(require,module,exports){ +/** + * lodash 3.2.0 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var baseCopy = require('lodash._basecopy'), + keys = require('lodash.keys'); + +/** + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); +} + +module.exports = baseAssign; + +},{"lodash._basecopy":56,"lodash.keys":63}],56:[function(require,module,exports){ +/** + * lodash 3.0.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. + */ +function baseCopy(source, props, object) { + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; + } + return object; +} + +module.exports = baseCopy; + +},{}],57:[function(require,module,exports){ +/** + * lodash 3.0.3 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; + } + return result || {}; + }; +}()); + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +module.exports = baseCreate; + +},{}],58:[function(require,module,exports){ +/** + * lodash 3.9.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = getNative; + +},{}],59:[function(require,module,exports){ +/** + * lodash 3.0.9 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; + +/** + * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} + +/** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +module.exports = isIterateeCall; + +},{}],60:[function(require,module,exports){ +/** + * lodash 3.1.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var baseAssign = require('lodash._baseassign'), + baseCreate = require('lodash._basecreate'), + isIterateeCall = require('lodash._isiterateecall'); + +/** + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ +function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; + } + return properties ? baseAssign(result, properties) : result; +} + +module.exports = create; + +},{"lodash._baseassign":55,"lodash._basecreate":57,"lodash._isiterateecall":59}],61:[function(require,module,exports){ +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && + (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); +} + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +module.exports = isArguments; + +},{}],62:[function(require,module,exports){ +/** + * lodash 3.0.4 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** `Object#toString` result references. */ +var arrayTag = '[object Array]', + funcTag = '[object Function]'; + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; +}; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = isArray; + +},{}],63:[function(require,module,exports){ +/** + * lodash 3.1.2 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var getNative = require('lodash._getnative'), + isArguments = require('lodash.isarguments'), + isArray = require('lodash.isarray'); + +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; + + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; +}; + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +module.exports = keys; + +},{"lodash._getnative":58,"lodash.isarguments":61,"lodash.isarray":62}],64:[function(require,module,exports){ +(function (process){ +var path = require('path'); +var fs = require('fs'); +var _0777 = parseInt('0777', 8); + +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + +function mkdirP (p, opts, f, made) { + if (typeof opts === 'function') { + f = opts; + opts = {}; + } + else if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; + + var cb = f || function () {}; + p = path.resolve(p); + + xfs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + mkdirP(path.dirname(p), opts, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, opts, cb, made); + }); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + xfs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); +} + +mkdirP.sync = function sync (p, opts, made) { + if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; + + p = path.resolve(p); + + try { + xfs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = xfs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } + + return made; +}; + +}).call(this,require('_process')) +},{"_process":67,"fs":42,"path":42}],65:[function(require,module,exports){ +exports.endianness = function () { return 'LE' }; + +exports.hostname = function () { + if (typeof location !== 'undefined') { + return location.hostname + } + else return ''; +}; + +exports.loadavg = function () { return [] }; + +exports.uptime = function () { return 0 }; + +exports.freemem = function () { + return Number.MAX_VALUE; +}; + +exports.totalmem = function () { + return Number.MAX_VALUE; +}; + +exports.cpus = function () { return [] }; + +exports.type = function () { return 'Browser' }; + +exports.release = function () { + if (typeof navigator !== 'undefined') { + return navigator.appVersion; + } + return ''; +}; + +exports.networkInterfaces += exports.getNetworkInterfaces += function () { return {} }; + +exports.arch = function () { return 'javascript' }; + +exports.platform = function () { return 'browser' }; + +exports.tmpdir = exports.tmpDir = function () { + return '/tmp'; +}; + +exports.EOL = '\n'; + +},{}],66:[function(require,module,exports){ +(function (process){ +'use strict'; + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + +}).call(this,require('_process')) +},{"_process":67}],67:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],68:[function(require,module,exports){ +module.exports = require("./lib/_stream_duplex.js") + +},{"./lib/_stream_duplex.js":69}],69:[function(require,module,exports){ +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + processNextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} +},{"./_stream_readable":71,"./_stream_writable":73,"core-util-is":45,"inherits":51,"process-nextick-args":66}],70:[function(require,module,exports){ +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":72,"core-util-is":45,"inherits":51}],71:[function(require,module,exports){ +(function (process){ +'use strict'; + +module.exports = Readable; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + +/**/ +var isArray = require('isarray'); +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ + +var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var StringDecoder; + +util.inherits(Readable, Stream); + +function prependListener(emitter, event, fn) { + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + } +} + +var Duplex; +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +var Duplex; +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options && typeof options.read === 'function') this._read = options.read; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = bufferShim.from(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var _e = new Error('stream.unshift() after end event'); + stream.emit('error', _e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } + + if (!addToFront) state.reading = false; + + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + processNextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + processNextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + processNextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = bufferShim.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + processNextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} +}).call(this,require('_process')) +},{"./_stream_duplex":69,"./internal/streams/BufferList":74,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":66,"string_decoder/":80,"util":40}],72:[function(require,module,exports){ +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) stream.push(data); + + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); + }); +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('Not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +function done(stream, er) { + if (er) return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} +},{"./_stream_duplex":69,"core-util-is":45,"inherits":51}],73:[function(require,module,exports){ +(function (process){ +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +module.exports = Writable; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ + +var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ + +util.inherits(Writable, Stream); + +function nop() {} + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +var Duplex; +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + } catch (_) {} +})(); + +var Duplex; +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + processNextTick(cb, er); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + processNextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = bufferShim.from(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + + if (Buffer.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) processNextTick(cb, er);else cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) processNextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; +} +}).call(this,require('_process')) +},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":66,"util-deprecate":81}],74:[function(require,module,exports){ +'use strict'; + +var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ + +module.exports = BufferList; + +function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; +} + +BufferList.prototype.push = function (v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; +}; + +BufferList.prototype.unshift = function (v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; +}; + +BufferList.prototype.shift = function () { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; +}; + +BufferList.prototype.clear = function () { + this.head = this.tail = null; + this.length = 0; +}; + +BufferList.prototype.join = function (s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; +}; + +BufferList.prototype.concat = function (n) { + if (this.length === 0) return bufferShim.alloc(0); + if (this.length === 1) return this.head.data; + var ret = bufferShim.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + p.data.copy(ret, i); + i += p.data.length; + p = p.next; + } + return ret; +}; +},{"buffer":44,"buffer-shims":43}],75:[function(require,module,exports){ +module.exports = require("./lib/_stream_passthrough.js") + +},{"./lib/_stream_passthrough.js":70}],76:[function(require,module,exports){ +(function (process){ +var Stream = (function (){ + try { + return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); + +if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; +} + +}).call(this,require('_process')) +},{"./lib/_stream_duplex.js":69,"./lib/_stream_passthrough.js":70,"./lib/_stream_readable.js":71,"./lib/_stream_transform.js":72,"./lib/_stream_writable.js":73,"_process":67}],77:[function(require,module,exports){ +module.exports = require("./lib/_stream_transform.js") + +},{"./lib/_stream_transform.js":72}],78:[function(require,module,exports){ +module.exports = require("./lib/_stream_writable.js") + +},{"./lib/_stream_writable.js":73}],79:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":48,"inherits":51,"readable-stream/duplex.js":68,"readable-stream/passthrough.js":75,"readable-stream/readable.js":76,"readable-stream/transform.js":77,"readable-stream/writable.js":78}],80:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Buffer = require('buffer').Buffer; + +var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + } + + +function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. +var StringDecoder = exports.StringDecoder = function(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; +}; + + +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; +}; + +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; + +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} + +},{"buffer":44}],81:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],82:[function(require,module,exports){ +arguments[4][51][0].apply(exports,arguments) +},{"dup":51}],83:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],84:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":83,"_process":67,"inherits":82}]},{},[1]); diff --git a/bower_components/blueimp-file-upload/.bower.json b/bower_components/blueimp-file-upload/.bower.json new file mode 100644 index 0000000000..4acba2af58 --- /dev/null +++ b/bower_components/blueimp-file-upload/.bower.json @@ -0,0 +1,74 @@ +{ + "name": "blueimp-file-upload", + "version": "9.14.2", + "title": "jQuery File Upload", + "description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images.", + "keywords": [ + "jquery", + "file", + "upload", + "widget", + "multiple", + "selection", + "drag", + "drop", + "progress", + "preview", + "cross-domain", + "cross-site", + "chunk", + "resume", + "gae", + "go", + "python", + "php", + "bootstrap" + ], + "homepage": "https://github.com/blueimp/jQuery-File-Upload", + "author": { + "name": "Sebastian Tschan", + "url": "https://blueimp.net" + }, + "maintainers": [ + { + "name": "Sebastian Tschan", + "url": "https://blueimp.net" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/blueimp/jQuery-File-Upload.git" + }, + "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues", + "license": "MIT", + "dependencies": { + "jquery": ">=1.6", + "blueimp-tmpl": ">=2.5.4", + "blueimp-load-image": ">=1.13.0", + "blueimp-canvas-to-blob": ">=2.1.1" + }, + "main": [ + "js/jquery.fileupload.js" + ], + "ignore": [ + "/*.*", + "/cors", + "css/demo-ie8.css", + "css/demo.css", + "css/style.css", + "js/app.js", + "js/main.js", + "server", + "test" + ], + "_release": "9.14.2", + "_resolution": { + "type": "version", + "tag": "v9.14.2", + "commit": "a1a13f59ad8e024445abb3deb0b454ffcf8a7801" + }, + "_source": "https://github.com/blueimp/jQuery-File-Upload.git", + "_target": "^9.14.2", + "_originalSource": "fileupload", + "_direct": true +} \ No newline at end of file diff --git a/bower_components/blueimp-file-upload/bower.json b/bower_components/blueimp-file-upload/bower.json new file mode 100644 index 0000000000..97b83eb634 --- /dev/null +++ b/bower_components/blueimp-file-upload/bower.json @@ -0,0 +1,64 @@ +{ + "name": "blueimp-file-upload", + "version": "9.14.2", + "title": "jQuery File Upload", + "description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images.", + "keywords": [ + "jquery", + "file", + "upload", + "widget", + "multiple", + "selection", + "drag", + "drop", + "progress", + "preview", + "cross-domain", + "cross-site", + "chunk", + "resume", + "gae", + "go", + "python", + "php", + "bootstrap" + ], + "homepage": "https://github.com/blueimp/jQuery-File-Upload", + "author": { + "name": "Sebastian Tschan", + "url": "https://blueimp.net" + }, + "maintainers": [ + { + "name": "Sebastian Tschan", + "url": "https://blueimp.net" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/blueimp/jQuery-File-Upload.git" + }, + "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues", + "license": "MIT", + "dependencies": { + "jquery": ">=1.6", + "blueimp-tmpl": ">=2.5.4", + "blueimp-load-image": ">=1.13.0", + "blueimp-canvas-to-blob": ">=2.1.1" + }, + "main": [ + "js/jquery.fileupload.js" + ], + "ignore": [ + "/*.*", + "/cors", + "css/demo-ie8.css", + "css/demo.css", + "css/style.css", + "js/app.js", + "js/main.js", + "server", + "test" + ] +} diff --git a/bower_components/blueimp-file-upload/css/jquery.fileupload-noscript.css b/bower_components/blueimp-file-upload/css/jquery.fileupload-noscript.css new file mode 100644 index 0000000000..1a75cbcc7d --- /dev/null +++ b/bower_components/blueimp-file-upload/css/jquery.fileupload-noscript.css @@ -0,0 +1,22 @@ +@charset "UTF-8"; +/* + * jQuery File Upload Plugin NoScript CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.fileinput-button input { + position: static; + opacity: 1; + filter: none; + font-size: inherit !important; + direction: inherit; +} +.fileinput-button span { + display: none; +} diff --git a/bower_components/blueimp-file-upload/css/jquery.fileupload-ui-noscript.css b/bower_components/blueimp-file-upload/css/jquery.fileupload-ui-noscript.css new file mode 100644 index 0000000000..6ad2ad62e8 --- /dev/null +++ b/bower_components/blueimp-file-upload/css/jquery.fileupload-ui-noscript.css @@ -0,0 +1,17 @@ +@charset "UTF-8"; +/* + * jQuery File Upload UI Plugin NoScript CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.fileinput-button i, +.fileupload-buttonbar .delete, +.fileupload-buttonbar .toggle { + display: none; +} diff --git a/bower_components/blueimp-file-upload/css/jquery.fileupload-ui.css b/bower_components/blueimp-file-upload/css/jquery.fileupload-ui.css new file mode 100644 index 0000000000..95cca15799 --- /dev/null +++ b/bower_components/blueimp-file-upload/css/jquery.fileupload-ui.css @@ -0,0 +1,57 @@ +@charset "UTF-8"; +/* + * jQuery File Upload UI Plugin CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.fileupload-buttonbar .btn, +.fileupload-buttonbar .toggle { + margin-bottom: 5px; +} +.progress-animated .progress-bar, +.progress-animated .bar { + background: url("../img/progressbar.gif") !important; + filter: none; +} +.fileupload-process { + float: right; + display: none; +} +.fileupload-processing .fileupload-process, +.files .processing .preview { + display: block; + width: 32px; + height: 32px; + background: url("../img/loading.gif") center no-repeat; + background-size: contain; +} +.files audio, +.files video { + max-width: 300px; +} + +@media (max-width: 767px) { + .fileupload-buttonbar .toggle, + .files .toggle, + .files .btn span { + display: none; + } + .files .name { + width: 80px; + word-wrap: break-word; + } + .files audio, + .files video { + max-width: 80px; + } + .files img, + .files canvas { + max-width: 100%; + } +} diff --git a/bower_components/blueimp-file-upload/css/jquery.fileupload.css b/bower_components/blueimp-file-upload/css/jquery.fileupload.css new file mode 100644 index 0000000000..f714c4d761 --- /dev/null +++ b/bower_components/blueimp-file-upload/css/jquery.fileupload.css @@ -0,0 +1,37 @@ +@charset "UTF-8"; +/* + * jQuery File Upload Plugin CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.fileinput-button { + position: relative; + overflow: hidden; + display: inline-block; +} +.fileinput-button input { + position: absolute; + top: 0; + right: 0; + margin: 0; + opacity: 0; + -ms-filter: 'alpha(opacity=0)'; + font-size: 200px !important; + direction: ltr; + cursor: pointer; +} + +/* Fixes for IE < 8 */ +@media screen\9 { + .fileinput-button input { + filter: alpha(opacity=0); + font-size: 100%; + height: 100%; + } +} diff --git a/bower_components/blueimp-file-upload/img/loading.gif b/bower_components/blueimp-file-upload/img/loading.gif new file mode 100644 index 0000000000..90f28cbdbb Binary files /dev/null and b/bower_components/blueimp-file-upload/img/loading.gif differ diff --git a/bower_components/blueimp-file-upload/img/progressbar.gif b/bower_components/blueimp-file-upload/img/progressbar.gif new file mode 100644 index 0000000000..fbcce6bc9a Binary files /dev/null and b/bower_components/blueimp-file-upload/img/progressbar.gif differ diff --git a/bower_components/blueimp-file-upload/js/cors/jquery.postmessage-transport.js b/bower_components/blueimp-file-upload/js/cors/jquery.postmessage-transport.js new file mode 100644 index 0000000000..120c9c0be8 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/cors/jquery.postmessage-transport.js @@ -0,0 +1,126 @@ +/* + * jQuery postMessage Transport Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + var counter = 0, + names = [ + 'accepts', + 'cache', + 'contents', + 'contentType', + 'crossDomain', + 'data', + 'dataType', + 'headers', + 'ifModified', + 'mimeType', + 'password', + 'processData', + 'timeout', + 'traditional', + 'type', + 'url', + 'username' + ], + convert = function (p) { + return p; + }; + + $.ajaxSetup({ + converters: { + 'postmessage text': convert, + 'postmessage json': convert, + 'postmessage html': convert + } + }); + + $.ajaxTransport('postmessage', function (options) { + if (options.postMessage && window.postMessage) { + var iframe, + loc = $('').prop('href', options.postMessage)[0], + target = loc.protocol + '//' + loc.host, + xhrUpload = options.xhr().upload; + // IE always includes the port for the host property of a link + // element, but not in the location.host or origin property for the + // default http port 80 and https port 443, so we strip it: + if (/^(http:\/\/.+:80)|(https:\/\/.+:443)$/.test(target)) { + target = target.replace(/:(80|443)$/, ''); + } + return { + send: function (_, completeCallback) { + counter += 1; + var message = { + id: 'postmessage-transport-' + counter + }, + eventName = 'message.' + message.id; + iframe = $( + '' + ).bind('load', function () { + $.each(names, function (i, name) { + message[name] = options[name]; + }); + message.dataType = message.dataType.replace('postmessage ', ''); + $(window).bind(eventName, function (e) { + e = e.originalEvent; + var data = e.data, + ev; + if (e.origin === target && data.id === message.id) { + if (data.type === 'progress') { + ev = document.createEvent('Event'); + ev.initEvent(data.type, false, true); + $.extend(ev, data); + xhrUpload.dispatchEvent(ev); + } else { + completeCallback( + data.status, + data.statusText, + {postmessage: data.result}, + data.headers + ); + iframe.remove(); + $(window).unbind(eventName); + } + } + }); + iframe[0].contentWindow.postMessage( + message, + target + ); + }).appendTo(document.body); + }, + abort: function () { + if (iframe) { + iframe.remove(); + } + } + }; + } + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/cors/jquery.xdr-transport.js b/bower_components/blueimp-file-upload/js/cors/jquery.xdr-transport.js new file mode 100644 index 0000000000..d7a9d76b4f --- /dev/null +++ b/bower_components/blueimp-file-upload/js/cors/jquery.xdr-transport.js @@ -0,0 +1,89 @@ +/* + * jQuery XDomainRequest Transport Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + * + * Based on Julian Aubourg's ajaxHooks xdr.js: + * https://github.com/jaubourg/ajaxHooks/ + */ + +/* global define, require, window, XDomainRequest */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + if (window.XDomainRequest && !$.support.cors) { + $.ajaxTransport(function (s) { + if (s.crossDomain && s.async) { + if (s.timeout) { + s.xdrTimeout = s.timeout; + delete s.timeout; + } + var xdr; + return { + send: function (headers, completeCallback) { + var addParamChar = /\?/.test(s.url) ? '&' : '?'; + function callback(status, statusText, responses, responseHeaders) { + xdr.onload = xdr.onerror = xdr.ontimeout = $.noop; + xdr = null; + completeCallback(status, statusText, responses, responseHeaders); + } + xdr = new XDomainRequest(); + // XDomainRequest only supports GET and POST: + if (s.type === 'DELETE') { + s.url = s.url + addParamChar + '_method=DELETE'; + s.type = 'POST'; + } else if (s.type === 'PUT') { + s.url = s.url + addParamChar + '_method=PUT'; + s.type = 'POST'; + } else if (s.type === 'PATCH') { + s.url = s.url + addParamChar + '_method=PATCH'; + s.type = 'POST'; + } + xdr.open(s.type, s.url); + xdr.onload = function () { + callback( + 200, + 'OK', + {text: xdr.responseText}, + 'Content-Type: ' + xdr.contentType + ); + }; + xdr.onerror = function () { + callback(404, 'Not Found'); + }; + if (s.xdrTimeout) { + xdr.ontimeout = function () { + callback(0, 'timeout'); + }; + xdr.timeout = s.xdrTimeout; + } + xdr.send((s.hasContent && s.data) || null); + }, + abort: function () { + if (xdr) { + xdr.onerror = $.noop(); + xdr.abort(); + } + } + }; + } + }); + } +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-angular.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-angular.js new file mode 100644 index 0000000000..b271bb8c33 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-angular.js @@ -0,0 +1,435 @@ +/* + * jQuery File Upload AngularJS Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, angular, require */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'angular', + './jquery.fileupload-image', + './jquery.fileupload-audio', + './jquery.fileupload-video', + './jquery.fileupload-validate' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('angular'), + require('./jquery.fileupload-image'), + require('./jquery.fileupload-audio'), + require('./jquery.fileupload-video'), + require('./jquery.fileupload-validate') + ); + } else { + factory(); + } +}(function () { + 'use strict'; + + angular.module('blueimp.fileupload', []) + + // The fileUpload service provides configuration options + // for the fileUpload directive and default handlers for + // File Upload events: + .provider('fileUpload', function () { + var scopeEvalAsync = function (expression) { + var scope = angular.element(this) + .fileupload('option', 'scope'); + // Schedule a new $digest cycle if not already inside of one + // and evaluate the given expression: + scope.$evalAsync(expression); + }, + addFileMethods = function (scope, data) { + var files = data.files, + file = files[0]; + angular.forEach(files, function (file, index) { + file._index = index; + file.$state = function () { + return data.state(); + }; + file.$processing = function () { + return data.processing(); + }; + file.$progress = function () { + return data.progress(); + }; + file.$response = function () { + return data.response(); + }; + }); + file.$submit = function () { + if (!file.error) { + return data.submit(); + } + }; + file.$cancel = function () { + return data.abort(); + }; + }, + $config; + $config = this.defaults = { + handleResponse: function (e, data) { + var files = data.result && data.result.files; + if (files) { + data.scope.replace(data.files, files); + } else if (data.errorThrown || + data.textStatus === 'error') { + data.files[0].error = data.errorThrown || + data.textStatus; + } + }, + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var scope = data.scope, + filesCopy = []; + angular.forEach(data.files, function (file) { + filesCopy.push(file); + }); + scope.$parent.$applyAsync(function () { + addFileMethods(scope, data); + var method = scope.option('prependFiles') ? + 'unshift' : 'push'; + Array.prototype[method].apply(scope.queue, data.files); + }); + data.process(function () { + return scope.process(data); + }).always(function () { + scope.$parent.$applyAsync(function () { + addFileMethods(scope, data); + scope.replace(filesCopy, data.files); + }); + }).then(function () { + if ((scope.option('autoUpload') || + data.autoUpload) && + data.autoUpload !== false) { + data.submit(); + } + }); + }, + done: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = this; + data.scope.$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + fail: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = this, + scope = data.scope; + if (data.errorThrown === 'abort') { + scope.clear(data.files); + return; + } + scope.$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + stop: scopeEvalAsync, + processstart: scopeEvalAsync, + processstop: scopeEvalAsync, + getNumberOfFiles: function () { + var scope = this.scope; + return scope.queue.length - scope.processing(); + }, + dataType: 'json', + autoUpload: false + }; + this.$get = [ + function () { + return { + defaults: $config + }; + } + ]; + }) + + // Format byte numbers to readable presentations: + .provider('formatFileSizeFilter', function () { + var $config = { + // Byte units following the IEC format + // http://en.wikipedia.org/wiki/Kilobyte + units: [ + {size: 1000000000, suffix: ' GB'}, + {size: 1000000, suffix: ' MB'}, + {size: 1000, suffix: ' KB'} + ] + }; + this.defaults = $config; + this.$get = function () { + return function (bytes) { + if (!angular.isNumber(bytes)) { + return ''; + } + var unit = true, + i = 0, + prefix, + suffix; + while (unit) { + unit = $config.units[i]; + prefix = unit.prefix || ''; + suffix = unit.suffix || ''; + if (i === $config.units.length - 1 || bytes >= unit.size) { + return prefix + (bytes / unit.size).toFixed(2) + suffix; + } + i += 1; + } + }; + }; + }) + + // The FileUploadController initializes the fileupload widget and + // provides scope methods to control the File Upload functionality: + .controller('FileUploadController', [ + '$scope', '$element', '$attrs', '$window', 'fileUpload', + function ($scope, $element, $attrs, $window, fileUpload) { + var uploadMethods = { + progress: function () { + return $element.fileupload('progress'); + }, + active: function () { + return $element.fileupload('active'); + }, + option: function (option, data) { + if (arguments.length === 1) { + return $element.fileupload('option', option); + } + $element.fileupload('option', option, data); + }, + add: function (data) { + return $element.fileupload('add', data); + }, + send: function (data) { + return $element.fileupload('send', data); + }, + process: function (data) { + return $element.fileupload('process', data); + }, + processing: function (data) { + return $element.fileupload('processing', data); + } + }; + $scope.disabled = !$window.jQuery.support.fileInput; + $scope.queue = $scope.queue || []; + $scope.clear = function (files) { + var queue = this.queue, + i = queue.length, + file = files, + length = 1; + if (angular.isArray(files)) { + file = files[0]; + length = files.length; + } + while (i) { + i -= 1; + if (queue[i] === file) { + return queue.splice(i, length); + } + } + }; + $scope.replace = function (oldFiles, newFiles) { + var queue = this.queue, + file = oldFiles[0], + i, + j; + for (i = 0; i < queue.length; i += 1) { + if (queue[i] === file) { + for (j = 0; j < newFiles.length; j += 1) { + queue[i + j] = newFiles[j]; + } + return; + } + } + }; + $scope.applyOnQueue = function (method) { + var list = this.queue.slice(0), + i, + file; + for (i = 0; i < list.length; i += 1) { + file = list[i]; + if (file[method]) { + file[method](); + } + } + }; + $scope.submit = function () { + this.applyOnQueue('$submit'); + }; + $scope.cancel = function () { + this.applyOnQueue('$cancel'); + }; + // Add upload methods to the scope: + angular.extend($scope, uploadMethods); + // The fileupload widget will initialize with + // the options provided via "data-"-parameters, + // as well as those given via options object: + $element.fileupload(angular.extend( + {scope: $scope}, + fileUpload.defaults + )).on('fileuploadadd', function (e, data) { + data.scope = $scope; + }).on('fileuploadfail', function (e, data) { + if (data.errorThrown === 'abort') { + return; + } + if (data.dataType && + data.dataType.indexOf('json') === data.dataType.length - 4) { + try { + data.result = angular.fromJson(data.jqXHR.responseText); + } catch (ignore) {} + } + }).on([ + 'fileuploadadd', + 'fileuploadsubmit', + 'fileuploadsend', + 'fileuploaddone', + 'fileuploadfail', + 'fileuploadalways', + 'fileuploadprogress', + 'fileuploadprogressall', + 'fileuploadstart', + 'fileuploadstop', + 'fileuploadchange', + 'fileuploadpaste', + 'fileuploaddrop', + 'fileuploaddragover', + 'fileuploadchunksend', + 'fileuploadchunkdone', + 'fileuploadchunkfail', + 'fileuploadchunkalways', + 'fileuploadprocessstart', + 'fileuploadprocess', + 'fileuploadprocessdone', + 'fileuploadprocessfail', + 'fileuploadprocessalways', + 'fileuploadprocessstop' + ].join(' '), function (e, data) { + $scope.$parent.$applyAsync(function () { + if ($scope.$emit(e.type, data).defaultPrevented) { + e.preventDefault(); + } + }); + }).on('remove', function () { + // Remove upload methods from the scope, + // when the widget is removed: + var method; + for (method in uploadMethods) { + if (uploadMethods.hasOwnProperty(method)) { + delete $scope[method]; + } + } + }); + // Observe option changes: + $scope.$watch( + $attrs.fileUpload, + function (newOptions) { + if (newOptions) { + $element.fileupload('option', newOptions); + } + } + ); + } + ]) + + // Provide File Upload progress feedback: + .controller('FileUploadProgressController', [ + '$scope', '$attrs', '$parse', + function ($scope, $attrs, $parse) { + var fn = $parse($attrs.fileUploadProgress), + update = function () { + var progress = fn($scope); + if (!progress || !progress.total) { + return; + } + $scope.num = Math.floor( + progress.loaded / progress.total * 100 + ); + }; + update(); + $scope.$watch( + $attrs.fileUploadProgress + '.loaded', + function (newValue, oldValue) { + if (newValue !== oldValue) { + update(); + } + } + ); + } + ]) + + // Display File Upload previews: + .controller('FileUploadPreviewController', [ + '$scope', '$element', '$attrs', + function ($scope, $element, $attrs) { + $scope.$watch( + $attrs.fileUploadPreview + '.preview', + function (preview) { + $element.empty(); + if (preview) { + $element.append(preview); + } + } + ); + } + ]) + + .directive('fileUpload', function () { + return { + controller: 'FileUploadController', + scope: true + }; + }) + + .directive('fileUploadProgress', function () { + return { + controller: 'FileUploadProgressController', + scope: true + }; + }) + + .directive('fileUploadPreview', function () { + return { + controller: 'FileUploadPreviewController' + }; + }) + + // Enhance the HTML5 download attribute to + // allow drag&drop of files to the desktop: + .directive('download', function () { + return function (scope, elm) { + elm.on('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [ + 'application/octet-stream', + elm.prop('download'), + elm.prop('href') + ].join(':') + ); + } catch (ignore) {} + }); + }; + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-audio.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-audio.js new file mode 100644 index 0000000000..0ea741f23f --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-audio.js @@ -0,0 +1,113 @@ +/* + * jQuery File Upload Audio Preview Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadAudio', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + disabled: '@disableAudioPreview' + }, + { + action: 'setAudio', + name: '@audioPreviewName', + disabled: '@disableAudioPreview' + } + ); + + // The File Upload Audio Preview plugin extends the fileupload widget + // with audio preview functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of audio files to load, + // matched against the file type: + loadAudioFileTypes: /^audio\/.*$/ + }, + + _audioElement: document.createElement('audio'), + + processActions: { + + // Loads the audio file given via data.files and data.index + // as audio element if the browser supports playing it. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadAudio: function (data, options) { + if (options.disabled) { + return data; + } + var file = data.files[data.index], + url, + audio; + if (this._audioElement.canPlayType && + this._audioElement.canPlayType(file.type) && + ($.type(options.maxFileSize) !== 'number' || + file.size <= options.maxFileSize) && + (!options.fileTypes || + options.fileTypes.test(file.type))) { + url = loadImage.createObjectURL(file); + if (url) { + audio = this._audioElement.cloneNode(false); + audio.src = url; + audio.controls = true; + data.audio = audio; + return data; + } + } + return data; + }, + + // Sets the audio element as a property of the file object: + setAudio: function (data, options) { + if (data.audio && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.audio; + } + return data; + } + + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-image.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-image.js new file mode 100644 index 0000000000..439bda1be5 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-image.js @@ -0,0 +1,324 @@ +/* + * jQuery File Upload Image Preview & Resize Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, Blob */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + 'load-image-meta', + 'load-image-exif', + 'canvas-to-blob', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('blueimp-load-image/js/load-image-meta'), + require('blueimp-load-image/js/load-image-exif'), + require('blueimp-canvas-to-blob'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadImageMetaData', + disableImageHead: '@', + disableExif: '@', + disableExifThumbnail: '@', + disableExifSub: '@', + disableExifGps: '@', + disabled: '@disableImageMetaDataLoad' + }, + { + action: 'loadImage', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + noRevoke: '@', + disabled: '@disableImageLoad' + }, + { + action: 'resizeImage', + // Use "image" as prefix for the "@" options: + prefix: 'image', + maxWidth: '@', + maxHeight: '@', + minWidth: '@', + minHeight: '@', + crop: '@', + orientation: '@', + forceResize: '@', + disabled: '@disableImageResize' + }, + { + action: 'saveImage', + quality: '@imageQuality', + type: '@imageType', + disabled: '@disableImageResize' + }, + { + action: 'saveImageMetaData', + disabled: '@disableImageMetaDataSave' + }, + { + action: 'resizeImage', + // Use "preview" as prefix for the "@" options: + prefix: 'preview', + maxWidth: '@', + maxHeight: '@', + minWidth: '@', + minHeight: '@', + crop: '@', + orientation: '@', + thumbnail: '@', + canvas: '@', + disabled: '@disableImagePreview' + }, + { + action: 'setImage', + name: '@imagePreviewName', + disabled: '@disableImagePreview' + }, + { + action: 'deleteImageReferences', + disabled: '@disableImageReferencesDeletion' + } + ); + + // The File Upload Resize plugin extends the fileupload widget + // with image resize functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of images to load: + // matched against the file type: + loadImageFileTypes: /^image\/(gif|jpeg|png|svg\+xml)$/, + // The maximum file size of images to load: + loadImageMaxFileSize: 10000000, // 10MB + // The maximum width of resized images: + imageMaxWidth: 1920, + // The maximum height of resized images: + imageMaxHeight: 1080, + // Defines the image orientation (1-8) or takes the orientation + // value from Exif data if set to true: + imageOrientation: false, + // Define if resized images should be cropped or only scaled: + imageCrop: false, + // Disable the resize image functionality by default: + disableImageResize: true, + // The maximum width of the preview images: + previewMaxWidth: 80, + // The maximum height of the preview images: + previewMaxHeight: 80, + // Defines the preview orientation (1-8) or takes the orientation + // value from Exif data if set to true: + previewOrientation: true, + // Create the preview using the Exif data thumbnail: + previewThumbnail: true, + // Define if preview images should be cropped or only scaled: + previewCrop: false, + // Define if preview images should be resized as canvas elements: + previewCanvas: true + }, + + processActions: { + + // Loads the image given via data.files and data.index + // as img element, if the browser supports the File API. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadImage: function (data, options) { + if (options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (($.type(options.maxFileSize) === 'number' && + file.size > options.maxFileSize) || + (options.fileTypes && + !options.fileTypes.test(file.type)) || + !loadImage( + file, + function (img) { + if (img.src) { + data.img = img; + } + dfd.resolveWith(that, [data]); + }, + options + )) { + return data; + } + return dfd.promise(); + }, + + // Resizes the image given as data.canvas or data.img + // and updates data.canvas or data.img with the resized image. + // Also stores the resized image as preview property. + // Accepts the options maxWidth, maxHeight, minWidth, + // minHeight, canvas and crop: + resizeImage: function (data, options) { + if (options.disabled || !(data.canvas || data.img)) { + return data; + } + options = $.extend({canvas: true}, options); + var that = this, + dfd = $.Deferred(), + img = (options.canvas && data.canvas) || data.img, + resolve = function (newImg) { + if (newImg && (newImg.width !== img.width || + newImg.height !== img.height || + options.forceResize)) { + data[newImg.getContext ? 'canvas' : 'img'] = newImg; + } + data.preview = newImg; + dfd.resolveWith(that, [data]); + }, + thumbnail; + if (data.exif) { + if (options.orientation === true) { + options.orientation = data.exif.get('Orientation'); + } + if (options.thumbnail) { + thumbnail = data.exif.get('Thumbnail'); + if (thumbnail) { + loadImage(thumbnail, resolve, options); + return dfd.promise(); + } + } + // Prevent orienting the same image twice: + if (data.orientation) { + delete options.orientation; + } else { + data.orientation = options.orientation; + } + } + if (img) { + resolve(loadImage.scale(img, options)); + return dfd.promise(); + } + return data; + }, + + // Saves the processed image given as data.canvas + // inplace at data.index of data.files: + saveImage: function (data, options) { + if (!data.canvas || options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (data.canvas.toBlob) { + data.canvas.toBlob( + function (blob) { + if (!blob.name) { + if (file.type === blob.type) { + blob.name = file.name; + } else if (file.name) { + blob.name = file.name.replace( + /\.\w+$/, + '.' + blob.type.substr(6) + ); + } + } + // Don't restore invalid meta data: + if (file.type !== blob.type) { + delete data.imageHead; + } + // Store the created blob at the position + // of the original file in the files list: + data.files[data.index] = blob; + dfd.resolveWith(that, [data]); + }, + options.type || file.type, + options.quality + ); + } else { + return data; + } + return dfd.promise(); + }, + + loadImageMetaData: function (data, options) { + if (options.disabled) { + return data; + } + var that = this, + dfd = $.Deferred(); + loadImage.parseMetaData(data.files[data.index], function (result) { + $.extend(data, result); + dfd.resolveWith(that, [data]); + }, options); + return dfd.promise(); + }, + + saveImageMetaData: function (data, options) { + if (!(data.imageHead && data.canvas && + data.canvas.toBlob && !options.disabled)) { + return data; + } + var file = data.files[data.index], + blob = new Blob([ + data.imageHead, + // Resized images always have a head size of 20 bytes, + // including the JPEG marker and a minimal JFIF header: + this._blobSlice.call(file, 20) + ], {type: file.type}); + blob.name = file.name; + data.files[data.index] = blob; + return data; + }, + + // Sets the resized version of the image as a property of the + // file object, must be called after "saveImage": + setImage: function (data, options) { + if (data.preview && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.preview; + } + return data; + }, + + deleteImageReferences: function (data, options) { + if (!options.disabled) { + delete data.img; + delete data.canvas; + delete data.preview; + delete data.imageHead; + } + return data; + } + + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-jquery-ui.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-jquery-ui.js new file mode 100755 index 0000000000..2ceaabff52 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-jquery-ui.js @@ -0,0 +1,161 @@ +/* + * jQuery File Upload jQuery UI Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload-ui' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload-ui') + ); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + processdone: function (e, data) { + data.context.find('.start').button('enable'); + }, + progress: function (e, data) { + if (data.context) { + data.context.find('.progress').progressbar( + 'option', + 'value', + parseInt(data.loaded / data.total * 100, 10) + ); + } + }, + progressall: function (e, data) { + var $this = $(this); + $this.find('.fileupload-progress') + .find('.progress').progressbar( + 'option', + 'value', + parseInt(data.loaded / data.total * 100, 10) + ).end() + .find('.progress-extended').each(function () { + $(this).html( + ($this.data('blueimp-fileupload') || + $this.data('fileupload')) + ._renderExtendedProgress(data) + ); + }); + } + }, + + _renderUpload: function (func, files) { + var node = this._super(func, files), + showIconText = $(window).width() > 480; + node.find('.progress').empty().progressbar(); + node.find('.start').button({ + icons: {primary: 'ui-icon-circle-arrow-e'}, + text: showIconText + }); + node.find('.cancel').button({ + icons: {primary: 'ui-icon-cancel'}, + text: showIconText + }); + if (node.hasClass('fade')) { + node.hide(); + } + return node; + }, + + _renderDownload: function (func, files) { + var node = this._super(func, files), + showIconText = $(window).width() > 480; + node.find('.delete').button({ + icons: {primary: 'ui-icon-trash'}, + text: showIconText + }); + if (node.hasClass('fade')) { + node.hide(); + } + return node; + }, + + _startHandler: function (e) { + $(e.currentTarget).button('disable'); + this._super(e); + }, + + _transition: function (node) { + var deferred = $.Deferred(); + if (node.hasClass('fade')) { + node.fadeToggle( + this.options.transitionDuration, + this.options.transitionEasing, + function () { + deferred.resolveWith(node); + } + ); + } else { + deferred.resolveWith(node); + } + return deferred; + }, + + _create: function () { + this._super(); + this.element + .find('.fileupload-buttonbar') + .find('.fileinput-button').each(function () { + var input = $(this).find('input:file').detach(); + $(this) + .button({icons: {primary: 'ui-icon-plusthick'}}) + .append(input); + }) + .end().find('.start') + .button({icons: {primary: 'ui-icon-circle-arrow-e'}}) + .end().find('.cancel') + .button({icons: {primary: 'ui-icon-cancel'}}) + .end().find('.delete') + .button({icons: {primary: 'ui-icon-trash'}}) + .end().find('.progress').progressbar(); + }, + + _destroy: function () { + this.element + .find('.fileupload-buttonbar') + .find('.fileinput-button').each(function () { + var input = $(this).find('input:file').detach(); + $(this) + .button('destroy') + .append(input); + }) + .end().find('.start') + .button('destroy') + .end().find('.cancel') + .button('destroy') + .end().find('.delete') + .button('destroy') + .end().find('.progress').progressbar('destroy'); + this._super(); + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-process.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-process.js new file mode 100644 index 0000000000..2c9ea65083 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-process.js @@ -0,0 +1,178 @@ +/* + * jQuery File Upload Processing Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload') + ); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + var originalAdd = $.blueimp.fileupload.prototype.options.add; + + // The File Upload Processing plugin extends the fileupload widget + // with file processing functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The list of processing actions: + processQueue: [ + /* + { + action: 'log', + type: 'debug' + } + */ + ], + add: function (e, data) { + var $this = $(this); + data.process(function () { + return $this.fileupload('process', data); + }); + originalAdd.call(this, e, data); + } + }, + + processActions: { + /* + log: function (data, options) { + console[options.type]( + 'Processing "' + data.files[data.index].name + '"' + ); + } + */ + }, + + _processFile: function (data, originalData) { + var that = this, + dfd = $.Deferred().resolveWith(that, [data]), + chain = dfd.promise(); + this._trigger('process', null, data); + $.each(data.processQueue, function (i, settings) { + var func = function (data) { + if (originalData.errorThrown) { + return $.Deferred() + .rejectWith(that, [originalData]).promise(); + } + return that.processActions[settings.action].call( + that, + data, + settings + ); + }; + chain = chain.then(func, settings.always && func); + }); + chain + .done(function () { + that._trigger('processdone', null, data); + that._trigger('processalways', null, data); + }) + .fail(function () { + that._trigger('processfail', null, data); + that._trigger('processalways', null, data); + }); + return chain; + }, + + // Replaces the settings of each processQueue item that + // are strings starting with an "@", using the remaining + // substring as key for the option map, + // e.g. "@autoUpload" is replaced with options.autoUpload: + _transformProcessQueue: function (options) { + var processQueue = []; + $.each(options.processQueue, function () { + var settings = {}, + action = this.action, + prefix = this.prefix === true ? action : this.prefix; + $.each(this, function (key, value) { + if ($.type(value) === 'string' && + value.charAt(0) === '@') { + settings[key] = options[ + value.slice(1) || (prefix ? prefix + + key.charAt(0).toUpperCase() + key.slice(1) : key) + ]; + } else { + settings[key] = value; + } + + }); + processQueue.push(settings); + }); + options.processQueue = processQueue; + }, + + // Returns the number of files currently in the processsing queue: + processing: function () { + return this._processing; + }, + + // Processes the files given as files property of the data parameter, + // returns a Promise object that allows to bind callbacks: + process: function (data) { + var that = this, + options = $.extend({}, this.options, data); + if (options.processQueue && options.processQueue.length) { + this._transformProcessQueue(options); + if (this._processing === 0) { + this._trigger('processstart'); + } + $.each(data.files, function (index) { + var opts = index ? $.extend({}, options) : options, + func = function () { + if (data.errorThrown) { + return $.Deferred() + .rejectWith(that, [data]).promise(); + } + return that._processFile(opts, data); + }; + opts.index = index; + that._processing += 1; + that._processingQueue = that._processingQueue.then(func, func) + .always(function () { + that._processing -= 1; + if (that._processing === 0) { + that._trigger('processstop'); + } + }); + }); + } + return this._processingQueue; + }, + + _create: function () { + this._super(); + this._processing = 0; + this._processingQueue = $.Deferred().resolveWith(this) + .promise(); + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-ui.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-ui.js new file mode 100644 index 0000000000..b380870a3a --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-ui.js @@ -0,0 +1,713 @@ +/* + * jQuery File Upload User Interface Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'blueimp-tmpl', + './jquery.fileupload-image', + './jquery.fileupload-audio', + './jquery.fileupload-video', + './jquery.fileupload-validate' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-tmpl'), + require('./jquery.fileupload-image'), + require('./jquery.fileupload-video'), + require('./jquery.fileupload-validate') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.tmpl + ); + } +}(function ($, tmpl) { + 'use strict'; + + $.blueimp.fileupload.prototype._specialOptions.push( + 'filesContainer', + 'uploadTemplateId', + 'downloadTemplateId' + ); + + // The UI version extends the file upload widget + // and adds complete user interface interaction: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // By default, files added to the widget are uploaded as soon + // as the user clicks on the start buttons. To enable automatic + // uploads, set the following option to true: + autoUpload: false, + // The ID of the upload template: + uploadTemplateId: 'template-upload', + // The ID of the download template: + downloadTemplateId: 'template-download', + // The container for the list of files. If undefined, it is set to + // an element with class "files" inside of the widget element: + filesContainer: undefined, + // By default, files are appended to the files container. + // Set the following option to true, to prepend files instead: + prependFiles: false, + // The expected data type of the upload response, sets the dataType + // option of the $.ajax upload requests: + dataType: 'json', + + // Error and info messages: + messages: { + unknownError: 'Unknown error' + }, + + // Function returning the current number of files, + // used by the maxNumberOfFiles validation: + getNumberOfFiles: function () { + return this.filesContainer.children() + .not('.processing').length; + }, + + // Callback to retrieve the list of files from the server response: + getFilesFromResponse: function (data) { + if (data.result && $.isArray(data.result.files)) { + return data.result.files; + } + return []; + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop or add API call). + // See the basic file upload widget for more information: + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var $this = $(this), + that = $this.data('blueimp-fileupload') || + $this.data('fileupload'), + options = that.options; + data.context = that._renderUpload(data.files) + .data('data', data) + .addClass('processing'); + options.filesContainer[ + options.prependFiles ? 'prepend' : 'append' + ](data.context); + that._forceReflow(data.context); + that._transition(data.context); + data.process(function () { + return $this.fileupload('process', data); + }).always(function () { + data.context.each(function (index) { + $(this).find('.size').text( + that._formatFileSize(data.files[index].size) + ); + }).removeClass('processing'); + that._renderPreviews(data); + }).done(function () { + data.context.find('.start').prop('disabled', false); + if ((that._trigger('added', e, data) !== false) && + (options.autoUpload || data.autoUpload) && + data.autoUpload !== false) { + data.submit(); + } + }).fail(function () { + if (data.files.error) { + data.context.each(function (index) { + var error = data.files[index].error; + if (error) { + $(this).find('.error').text(error); + } + }); + } + }); + }, + // Callback for the start of each file upload request: + send: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + if (data.context && data.dataType && + data.dataType.substr(0, 6) === 'iframe') { + // Iframe Transport does not support progress events. + // In lack of an indeterminate progress bar, we set + // the progress to 100%, showing the full animated bar: + data.context + .find('.progress').addClass( + !$.support.transition && 'progress-animated' + ) + .attr('aria-valuenow', 100) + .children().first().css( + 'width', + '100%' + ); + } + return that._trigger('sent', e, data); + }, + // Callback for successful uploads: + done: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + getFilesFromResponse = data.getFilesFromResponse || + that.options.getFilesFromResponse, + files = getFilesFromResponse(data), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + var file = files[index] || + {error: 'Empty file upload result'}; + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + }); + } else { + template = that._renderDownload(files)[ + that.options.prependFiles ? 'prependTo' : 'appendTo' + ](that.options.filesContainer); + that._forceReflow(template); + deferred = that._addFinishedDeferreds(); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }, + // Callback for failed (abort or error) uploads: + fail: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + if (data.errorThrown !== 'abort') { + var file = data.files[index]; + file.error = file.error || data.errorThrown || + data.i18n('unknownError'); + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + } else { + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + $(this).remove(); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }); + } else if (data.errorThrown !== 'abort') { + data.context = that._renderUpload(data.files)[ + that.options.prependFiles ? 'prependTo' : 'appendTo' + ](that.options.filesContainer) + .data('data', data); + that._forceReflow(data.context); + deferred = that._addFinishedDeferreds(); + that._transition(data.context).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } else { + that._trigger('failed', e, data); + that._trigger('finished', e, data); + that._addFinishedDeferreds().resolve(); + } + }, + // Callback for upload progress events: + progress: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var progress = Math.floor(data.loaded / data.total * 100); + if (data.context) { + data.context.each(function () { + $(this).find('.progress') + .attr('aria-valuenow', progress) + .children().first().css( + 'width', + progress + '%' + ); + }); + } + }, + // Callback for global upload progress events: + progressall: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var $this = $(this), + progress = Math.floor(data.loaded / data.total * 100), + globalProgressNode = $this.find('.fileupload-progress'), + extendedProgressNode = globalProgressNode + .find('.progress-extended'); + if (extendedProgressNode.length) { + extendedProgressNode.html( + ($this.data('blueimp-fileupload') || $this.data('fileupload')) + ._renderExtendedProgress(data) + ); + } + globalProgressNode + .find('.progress') + .attr('aria-valuenow', progress) + .children().first().css( + 'width', + progress + '%' + ); + }, + // Callback for uploads start, equivalent to the global ajaxStart event: + start: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + that._resetFinishedDeferreds(); + that._transition($(this).find('.fileupload-progress')).done( + function () { + that._trigger('started', e); + } + ); + }, + // Callback for uploads stop, equivalent to the global ajaxStop event: + stop: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + deferred = that._addFinishedDeferreds(); + $.when.apply($, that._getFinishedDeferreds()) + .done(function () { + that._trigger('stopped', e); + }); + that._transition($(this).find('.fileupload-progress')).done( + function () { + $(this).find('.progress') + .attr('aria-valuenow', '0') + .children().first().css('width', '0%'); + $(this).find('.progress-extended').html(' '); + deferred.resolve(); + } + ); + }, + processstart: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + $(this).addClass('fileupload-processing'); + }, + processstop: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + $(this).removeClass('fileupload-processing'); + }, + // Callback for file deletion: + destroy: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + removeNode = function () { + that._transition(data.context).done( + function () { + $(this).remove(); + that._trigger('destroyed', e, data); + } + ); + }; + if (data.url) { + data.dataType = data.dataType || that.options.dataType; + $.ajax(data).done(removeNode).fail(function () { + that._trigger('destroyfailed', e, data); + }); + } else { + removeNode(); + } + } + }, + + _resetFinishedDeferreds: function () { + this._finishedUploads = []; + }, + + _addFinishedDeferreds: function (deferred) { + if (!deferred) { + deferred = $.Deferred(); + } + this._finishedUploads.push(deferred); + return deferred; + }, + + _getFinishedDeferreds: function () { + return this._finishedUploads; + }, + + // Link handler, that allows to download files + // by drag & drop of the links to the desktop: + _enableDragToDesktop: function () { + var link = $(this), + url = link.prop('href'), + name = link.prop('download'), + type = 'application/octet-stream'; + link.bind('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [type, name, url].join(':') + ); + } catch (ignore) {} + }); + }, + + _formatFileSize: function (bytes) { + if (typeof bytes !== 'number') { + return ''; + } + if (bytes >= 1000000000) { + return (bytes / 1000000000).toFixed(2) + ' GB'; + } + if (bytes >= 1000000) { + return (bytes / 1000000).toFixed(2) + ' MB'; + } + return (bytes / 1000).toFixed(2) + ' KB'; + }, + + _formatBitrate: function (bits) { + if (typeof bits !== 'number') { + return ''; + } + if (bits >= 1000000000) { + return (bits / 1000000000).toFixed(2) + ' Gbit/s'; + } + if (bits >= 1000000) { + return (bits / 1000000).toFixed(2) + ' Mbit/s'; + } + if (bits >= 1000) { + return (bits / 1000).toFixed(2) + ' kbit/s'; + } + return bits.toFixed(2) + ' bit/s'; + }, + + _formatTime: function (seconds) { + var date = new Date(seconds * 1000), + days = Math.floor(seconds / 86400); + days = days ? days + 'd ' : ''; + return days + + ('0' + date.getUTCHours()).slice(-2) + ':' + + ('0' + date.getUTCMinutes()).slice(-2) + ':' + + ('0' + date.getUTCSeconds()).slice(-2); + }, + + _formatPercentage: function (floatValue) { + return (floatValue * 100).toFixed(2) + ' %'; + }, + + _renderExtendedProgress: function (data) { + return this._formatBitrate(data.bitrate) + ' | ' + + this._formatTime( + (data.total - data.loaded) * 8 / data.bitrate + ) + ' | ' + + this._formatPercentage( + data.loaded / data.total + ) + ' | ' + + this._formatFileSize(data.loaded) + ' / ' + + this._formatFileSize(data.total); + }, + + _renderTemplate: function (func, files) { + if (!func) { + return $(); + } + var result = func({ + files: files, + formatFileSize: this._formatFileSize, + options: this.options + }); + if (result instanceof $) { + return result; + } + return $(this.options.templatesContainer).html(result).children(); + }, + + _renderPreviews: function (data) { + data.context.find('.preview').each(function (index, elm) { + $(elm).append(data.files[index].preview); + }); + }, + + _renderUpload: function (files) { + return this._renderTemplate( + this.options.uploadTemplate, + files + ); + }, + + _renderDownload: function (files) { + return this._renderTemplate( + this.options.downloadTemplate, + files + ).find('a[download]').each(this._enableDragToDesktop).end(); + }, + + _startHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget), + template = button.closest('.template-upload'), + data = template.data('data'); + button.prop('disabled', true); + if (data && data.submit) { + data.submit(); + } + }, + + _cancelHandler: function (e) { + e.preventDefault(); + var template = $(e.currentTarget) + .closest('.template-upload,.template-download'), + data = template.data('data') || {}; + data.context = data.context || template; + if (data.abort) { + data.abort(); + } else { + data.errorThrown = 'abort'; + this._trigger('fail', e, data); + } + }, + + _deleteHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget); + this._trigger('destroy', e, $.extend({ + context: button.closest('.template-download'), + type: 'DELETE' + }, button.data())); + }, + + _forceReflow: function (node) { + return $.support.transition && node.length && + node[0].offsetWidth; + }, + + _transition: function (node) { + var dfd = $.Deferred(); + if ($.support.transition && node.hasClass('fade') && node.is(':visible')) { + node.bind( + $.support.transition.end, + function (e) { + // Make sure we don't respond to other transitions events + // in the container element, e.g. from button elements: + if (e.target === node[0]) { + node.unbind($.support.transition.end); + dfd.resolveWith(node); + } + } + ).toggleClass('in'); + } else { + node.toggleClass('in'); + dfd.resolveWith(node); + } + return dfd; + }, + + _initButtonBarEventHandlers: function () { + var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'), + filesList = this.options.filesContainer; + this._on(fileUploadButtonBar.find('.start'), { + click: function (e) { + e.preventDefault(); + filesList.find('.start').click(); + } + }); + this._on(fileUploadButtonBar.find('.cancel'), { + click: function (e) { + e.preventDefault(); + filesList.find('.cancel').click(); + } + }); + this._on(fileUploadButtonBar.find('.delete'), { + click: function (e) { + e.preventDefault(); + filesList.find('.toggle:checked') + .closest('.template-download') + .find('.delete').click(); + fileUploadButtonBar.find('.toggle') + .prop('checked', false); + } + }); + this._on(fileUploadButtonBar.find('.toggle'), { + change: function (e) { + filesList.find('.toggle').prop( + 'checked', + $(e.currentTarget).is(':checked') + ); + } + }); + }, + + _destroyButtonBarEventHandlers: function () { + this._off( + this.element.find('.fileupload-buttonbar') + .find('.start, .cancel, .delete'), + 'click' + ); + this._off( + this.element.find('.fileupload-buttonbar .toggle'), + 'change.' + ); + }, + + _initEventHandlers: function () { + this._super(); + this._on(this.options.filesContainer, { + 'click .start': this._startHandler, + 'click .cancel': this._cancelHandler, + 'click .delete': this._deleteHandler + }); + this._initButtonBarEventHandlers(); + }, + + _destroyEventHandlers: function () { + this._destroyButtonBarEventHandlers(); + this._off(this.options.filesContainer, 'click'); + this._super(); + }, + + _enableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', false) + .parent().removeClass('disabled'); + }, + + _disableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', true) + .parent().addClass('disabled'); + }, + + _initTemplates: function () { + var options = this.options; + options.templatesContainer = this.document[0].createElement( + options.filesContainer.prop('nodeName') + ); + if (tmpl) { + if (options.uploadTemplateId) { + options.uploadTemplate = tmpl(options.uploadTemplateId); + } + if (options.downloadTemplateId) { + options.downloadTemplate = tmpl(options.downloadTemplateId); + } + } + }, + + _initFilesContainer: function () { + var options = this.options; + if (options.filesContainer === undefined) { + options.filesContainer = this.element.find('.files'); + } else if (!(options.filesContainer instanceof $)) { + options.filesContainer = $(options.filesContainer); + } + }, + + _initSpecialOptions: function () { + this._super(); + this._initFilesContainer(); + this._initTemplates(); + }, + + _create: function () { + this._super(); + this._resetFinishedDeferreds(); + if (!$.support.fileInput) { + this._disableFileInputButton(); + } + }, + + enable: function () { + var wasDisabled = false; + if (this.options.disabled) { + wasDisabled = true; + } + this._super(); + if (wasDisabled) { + this.element.find('input, button').prop('disabled', false); + this._enableFileInputButton(); + } + }, + + disable: function () { + if (!this.options.disabled) { + this.element.find('input, button').prop('disabled', true); + this._disableFileInputButton(); + } + this._super(); + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-validate.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-validate.js new file mode 100644 index 0000000000..0151f057fc --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-validate.js @@ -0,0 +1,125 @@ +/* + * jQuery File Upload Validation Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + // Append to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.push( + { + action: 'validate', + // Always trigger this action, + // even if the previous action was rejected: + always: true, + // Options taken from the global options map: + acceptFileTypes: '@', + maxFileSize: '@', + minFileSize: '@', + maxNumberOfFiles: '@', + disabled: '@disableValidation' + } + ); + + // The File Upload Validation plugin extends the fileupload widget + // with file validation functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + /* + // The regular expression for allowed file types, matches + // against either file type or file name: + acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, + // The maximum allowed file size in bytes: + maxFileSize: 10000000, // 10 MB + // The minimum allowed file size in bytes: + minFileSize: undefined, // No minimal file size + // The limit of files to be uploaded: + maxNumberOfFiles: 10, + */ + + // Function returning the current number of files, + // has to be overriden for maxNumberOfFiles validation: + getNumberOfFiles: $.noop, + + // Error and info messages: + messages: { + maxNumberOfFiles: 'Maximum number of files exceeded', + acceptFileTypes: 'File type not allowed', + maxFileSize: 'File is too large', + minFileSize: 'File is too small' + } + }, + + processActions: { + + validate: function (data, options) { + if (options.disabled) { + return data; + } + var dfd = $.Deferred(), + settings = this.options, + file = data.files[data.index], + fileSize; + if (options.minFileSize || options.maxFileSize) { + fileSize = file.size; + } + if ($.type(options.maxNumberOfFiles) === 'number' && + (settings.getNumberOfFiles() || 0) + data.files.length > + options.maxNumberOfFiles) { + file.error = settings.i18n('maxNumberOfFiles'); + } else if (options.acceptFileTypes && + !(options.acceptFileTypes.test(file.type) || + options.acceptFileTypes.test(file.name))) { + file.error = settings.i18n('acceptFileTypes'); + } else if (fileSize > options.maxFileSize) { + file.error = settings.i18n('maxFileSize'); + } else if ($.type(fileSize) === 'number' && + fileSize < options.minFileSize) { + file.error = settings.i18n('minFileSize'); + } else { + delete file.error; + } + if (file.error || data.files.error) { + data.files.error = true; + dfd.rejectWith(this, [data]); + } else { + dfd.resolveWith(this, [data]); + } + return dfd.promise(); + } + + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload-video.js b/bower_components/blueimp-file-upload/js/jquery.fileupload-video.js new file mode 100644 index 0000000000..f6f9161c93 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload-video.js @@ -0,0 +1,113 @@ +/* + * jQuery File Upload Video Preview Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadVideo', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + disabled: '@disableVideoPreview' + }, + { + action: 'setVideo', + name: '@videoPreviewName', + disabled: '@disableVideoPreview' + } + ); + + // The File Upload Video Preview plugin extends the fileupload widget + // with video preview functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of video files to load, + // matched against the file type: + loadVideoFileTypes: /^video\/.*$/ + }, + + _videoElement: document.createElement('video'), + + processActions: { + + // Loads the video file given via data.files and data.index + // as video element if the browser supports playing it. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadVideo: function (data, options) { + if (options.disabled) { + return data; + } + var file = data.files[data.index], + url, + video; + if (this._videoElement.canPlayType && + this._videoElement.canPlayType(file.type) && + ($.type(options.maxFileSize) !== 'number' || + file.size <= options.maxFileSize) && + (!options.fileTypes || + options.fileTypes.test(file.type))) { + url = loadImage.createObjectURL(file); + if (url) { + video = this._videoElement.cloneNode(false); + video.src = url; + video.controls = true; + data.video = video; + return data; + } + } + return data; + }, + + // Sets the video element as a property of the file object: + setVideo: function (data, options) { + if (data.video && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.video; + } + return data; + } + + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.fileupload.js b/bower_components/blueimp-file-upload/js/jquery.fileupload.js new file mode 100644 index 0000000000..285c7bc651 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.fileupload.js @@ -0,0 +1,1482 @@ +/* + * jQuery File Upload Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document, location, Blob, FormData */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'jquery-ui/ui/widget' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./vendor/jquery.ui.widget') + ); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Detect file input support, based on + // http://viljamis.com/blog/2012/file-upload-support-on-mobile/ + $.support.fileInput = !(new RegExp( + // Handle devices which give false positives for the feature detection: + '(Android (1\\.[0156]|2\\.[01]))' + + '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' + + '|(w(eb)?OSBrowser)|(webOS)' + + '|(Kindle/(1\\.0|2\\.[05]|3\\.0))' + ).test(window.navigator.userAgent) || + // Feature detection for all other devices: + $('').prop('disabled')); + + // The FileReader API is not actually used, but works as feature detection, + // as some Safari versions (5?) support XHR file uploads via the FormData API, + // but not non-multipart XHR file uploads. + // window.XMLHttpRequestUpload is not available on IE10, so we check for + // window.ProgressEvent instead to detect XHR2 file upload capability: + $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader); + $.support.xhrFormDataFileUpload = !!window.FormData; + + // Detect support for Blob slicing (required for chunked uploads): + $.support.blobSlice = window.Blob && (Blob.prototype.slice || + Blob.prototype.webkitSlice || Blob.prototype.mozSlice); + + // Helper function to create drag handlers for dragover/dragenter/dragleave: + function getDragHandler(type) { + var isDragOver = type === 'dragover'; + return function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var dataTransfer = e.dataTransfer; + if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 && + this._trigger( + type, + $.Event(type, {delegatedEvent: e}) + ) !== false) { + e.preventDefault(); + if (isDragOver) { + dataTransfer.dropEffect = 'copy'; + } + } + }; + } + + // The fileupload widget listens for change events on file input fields defined + // via fileInput setting and paste or drop events of the given dropZone. + // In addition to the default jQuery Widget methods, the fileupload widget + // exposes the "add" and "send" methods, to add or directly send files using + // the fileupload API. + // By default, files added via file input selection, paste, drag & drop or + // "add" method are uploaded immediately, but it is possible to override + // the "add" callback option to queue file uploads. + $.widget('blueimp.fileupload', { + + options: { + // The drop target element(s), by the default the complete document. + // Set to null to disable drag & drop support: + dropZone: $(document), + // The paste target element(s), by the default undefined. + // Set to a DOM node or jQuery object to enable file pasting: + pasteZone: undefined, + // The file input field(s), that are listened to for change events. + // If undefined, it is set to the file input fields inside + // of the widget element on plugin initialization. + // Set to null to disable the change listener. + fileInput: undefined, + // By default, the file input field is replaced with a clone after + // each input field change event. This is required for iframe transport + // queues and allows change events to be fired for the same file + // selection, but can be disabled by setting the following option to false: + replaceFileInput: true, + // The parameter name for the file form data (the request argument name). + // If undefined or empty, the name property of the file input field is + // used, or "files[]" if the file input name property is also empty, + // can be a string or an array of strings: + paramName: undefined, + // By default, each file of a selection is uploaded using an individual + // request for XHR type uploads. Set to false to upload file + // selections in one request each: + singleFileUploads: true, + // To limit the number of files uploaded with one XHR request, + // set the following option to an integer greater than 0: + limitMultiFileUploads: undefined, + // The following option limits the number of files uploaded with one + // XHR request to keep the request size under or equal to the defined + // limit in bytes: + limitMultiFileUploadSize: undefined, + // Multipart file uploads add a number of bytes to each uploaded file, + // therefore the following option adds an overhead for each file used + // in the limitMultiFileUploadSize configuration: + limitMultiFileUploadSizeOverhead: 512, + // Set the following option to true to issue all file upload requests + // in a sequential order: + sequentialUploads: false, + // To limit the number of concurrent uploads, + // set the following option to an integer greater than 0: + limitConcurrentUploads: undefined, + // Set the following option to true to force iframe transport uploads: + forceIframeTransport: false, + // Set the following option to the location of a redirect url on the + // origin server, for cross-domain iframe transport uploads: + redirect: undefined, + // The parameter name for the redirect url, sent as part of the form + // data and set to 'redirect' if this option is empty: + redirectParamName: undefined, + // Set the following option to the location of a postMessage window, + // to enable postMessage transport uploads: + postMessage: undefined, + // By default, XHR file uploads are sent as multipart/form-data. + // The iframe transport is always using multipart/form-data. + // Set to false to enable non-multipart XHR uploads: + multipart: true, + // To upload large files in smaller chunks, set the following option + // to a preferred maximum chunk size. If set to 0, null or undefined, + // or the browser does not support the required Blob API, files will + // be uploaded as a whole. + maxChunkSize: undefined, + // When a non-multipart upload or a chunked multipart upload has been + // aborted, this option can be used to resume the upload by setting + // it to the size of the already uploaded bytes. This option is most + // useful when modifying the options object inside of the "add" or + // "send" callbacks, as the options are cloned for each file upload. + uploadedBytes: undefined, + // By default, failed (abort or error) file uploads are removed from the + // global progress calculation. Set the following option to false to + // prevent recalculating the global progress data: + recalculateProgress: true, + // Interval in milliseconds to calculate and trigger progress events: + progressInterval: 100, + // Interval in milliseconds to calculate progress bitrate: + bitrateInterval: 500, + // By default, uploads are started automatically when adding files: + autoUpload: true, + + // Error and info messages: + messages: { + uploadedBytes: 'Uploaded bytes exceed file size' + }, + + // Translation function, gets the message key to be translated + // and an object with context specific data as arguments: + i18n: function (message, context) { + message = this.messages[message] || message.toString(); + if (context) { + $.each(context, function (key, value) { + message = message.replace('{' + key + '}', value); + }); + } + return message; + }, + + // Additional form data to be sent along with the file uploads can be set + // using this option, which accepts an array of objects with name and + // value properties, a function returning such an array, a FormData + // object (for XHR file uploads), or a simple object. + // The form of the first fileInput is given as parameter to the function: + formData: function (form) { + return form.serializeArray(); + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop, paste or add API call). + // If the singleFileUploads option is enabled, this callback will be + // called once for each file in the selection for XHR file uploads, else + // once for each file selection. + // + // The upload starts when the submit method is invoked on the data parameter. + // The data object contains a files property holding the added files + // and allows you to override plugin options as well as define ajax settings. + // + // Listeners for this callback can also be bound the following way: + // .bind('fileuploadadd', func); + // + // data.submit() returns a Promise object and allows to attach additional + // handlers using jQuery's Deferred callbacks: + // data.submit().done(func).fail(func).always(func); + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + if (data.autoUpload || (data.autoUpload !== false && + $(this).fileupload('option', 'autoUpload'))) { + data.process().done(function () { + data.submit(); + }); + } + }, + + // Other callbacks: + + // Callback for the submit event of each file upload: + // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + + // Callback for the start of each file upload request: + // send: function (e, data) {}, // .bind('fileuploadsend', func); + + // Callback for successful uploads: + // done: function (e, data) {}, // .bind('fileuploaddone', func); + + // Callback for failed (abort or error) uploads: + // fail: function (e, data) {}, // .bind('fileuploadfail', func); + + // Callback for completed (success, abort or error) requests: + // always: function (e, data) {}, // .bind('fileuploadalways', func); + + // Callback for upload progress events: + // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + + // Callback for global upload progress events: + // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + + // Callback for uploads start, equivalent to the global ajaxStart event: + // start: function (e) {}, // .bind('fileuploadstart', func); + + // Callback for uploads stop, equivalent to the global ajaxStop event: + // stop: function (e) {}, // .bind('fileuploadstop', func); + + // Callback for change events of the fileInput(s): + // change: function (e, data) {}, // .bind('fileuploadchange', func); + + // Callback for paste events to the pasteZone(s): + // paste: function (e, data) {}, // .bind('fileuploadpaste', func); + + // Callback for drop events of the dropZone(s): + // drop: function (e, data) {}, // .bind('fileuploaddrop', func); + + // Callback for dragover events of the dropZone(s): + // dragover: function (e) {}, // .bind('fileuploaddragover', func); + + // Callback for the start of each chunk upload request: + // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func); + + // Callback for successful chunk uploads: + // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func); + + // Callback for failed (abort or error) chunk uploads: + // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func); + + // Callback for completed (success, abort or error) chunk upload requests: + // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func); + + // The plugin options are used as settings object for the ajax calls. + // The following are jQuery ajax settings required for the file uploads: + processData: false, + contentType: false, + cache: false, + timeout: 0 + }, + + // A list of options that require reinitializing event listeners and/or + // special initialization code: + _specialOptions: [ + 'fileInput', + 'dropZone', + 'pasteZone', + 'multipart', + 'forceIframeTransport' + ], + + _blobSlice: $.support.blobSlice && function () { + var slice = this.slice || this.webkitSlice || this.mozSlice; + return slice.apply(this, arguments); + }, + + _BitrateTimer: function () { + this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime()); + this.loaded = 0; + this.bitrate = 0; + this.getBitrate = function (now, loaded, interval) { + var timeDiff = now - this.timestamp; + if (!this.bitrate || !interval || timeDiff > interval) { + this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; + this.loaded = loaded; + this.timestamp = now; + } + return this.bitrate; + }; + }, + + _isXHRUpload: function (options) { + return !options.forceIframeTransport && + ((!options.multipart && $.support.xhrFileUpload) || + $.support.xhrFormDataFileUpload); + }, + + _getFormData: function (options) { + var formData; + if ($.type(options.formData) === 'function') { + return options.formData(options.form); + } + if ($.isArray(options.formData)) { + return options.formData; + } + if ($.type(options.formData) === 'object') { + formData = []; + $.each(options.formData, function (name, value) { + formData.push({name: name, value: value}); + }); + return formData; + } + return []; + }, + + _getTotal: function (files) { + var total = 0; + $.each(files, function (index, file) { + total += file.size || 1; + }); + return total; + }, + + _initProgressObject: function (obj) { + var progress = { + loaded: 0, + total: 0, + bitrate: 0 + }; + if (obj._progress) { + $.extend(obj._progress, progress); + } else { + obj._progress = progress; + } + }, + + _initResponseObject: function (obj) { + var prop; + if (obj._response) { + for (prop in obj._response) { + if (obj._response.hasOwnProperty(prop)) { + delete obj._response[prop]; + } + } + } else { + obj._response = {}; + } + }, + + _onProgress: function (e, data) { + if (e.lengthComputable) { + var now = ((Date.now) ? Date.now() : (new Date()).getTime()), + loaded; + if (data._time && data.progressInterval && + (now - data._time < data.progressInterval) && + e.loaded !== e.total) { + return; + } + data._time = now; + loaded = Math.floor( + e.loaded / e.total * (data.chunkSize || data._progress.total) + ) + (data.uploadedBytes || 0); + // Add the difference from the previously loaded state + // to the global loaded counter: + this._progress.loaded += (loaded - data._progress.loaded); + this._progress.bitrate = this._bitrateTimer.getBitrate( + now, + this._progress.loaded, + data.bitrateInterval + ); + data._progress.loaded = data.loaded = loaded; + data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate( + now, + loaded, + data.bitrateInterval + ); + // Trigger a custom progress event with a total data property set + // to the file size(s) of the current upload and a loaded data + // property calculated accordingly: + this._trigger( + 'progress', + $.Event('progress', {delegatedEvent: e}), + data + ); + // Trigger a global progress event for all current file uploads, + // including ajax calls queued for sequential file uploads: + this._trigger( + 'progressall', + $.Event('progressall', {delegatedEvent: e}), + this._progress + ); + } + }, + + _initProgressListener: function (options) { + var that = this, + xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + // Accesss to the native XHR object is required to add event listeners + // for the upload progress event: + if (xhr.upload) { + $(xhr.upload).bind('progress', function (e) { + var oe = e.originalEvent; + // Make sure the progress event properties get copied over: + e.lengthComputable = oe.lengthComputable; + e.loaded = oe.loaded; + e.total = oe.total; + that._onProgress(e, options); + }); + options.xhr = function () { + return xhr; + }; + } + }, + + _isInstanceOf: function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + }, + + _initXHRData: function (options) { + var that = this, + formData, + file = options.files[0], + // Ignore non-multipart setting if not supported: + multipart = options.multipart || !$.support.xhrFileUpload, + paramName = $.type(options.paramName) === 'array' ? + options.paramName[0] : options.paramName; + options.headers = $.extend({}, options.headers); + if (options.contentRange) { + options.headers['Content-Range'] = options.contentRange; + } + if (!multipart || options.blob || !this._isInstanceOf('File', file)) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.name) + '"'; + } + if (!multipart) { + options.contentType = file.type || 'application/octet-stream'; + options.data = options.blob || file; + } else if ($.support.xhrFormDataFileUpload) { + if (options.postMessage) { + // window.postMessage does not allow sending FormData + // objects, so we just add the File/Blob objects to + // the formData array and let the postMessage window + // create the FormData object out of this array: + formData = this._getFormData(options); + if (options.blob) { + formData.push({ + name: paramName, + value: options.blob + }); + } else { + $.each(options.files, function (index, file) { + formData.push({ + name: ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + value: file + }); + }); + } + } else { + if (that._isInstanceOf('FormData', options.formData)) { + formData = options.formData; + } else { + formData = new FormData(); + $.each(this._getFormData(options), function (index, field) { + formData.append(field.name, field.value); + }); + } + if (options.blob) { + formData.append(paramName, options.blob, file.name); + } else { + $.each(options.files, function (index, file) { + // This check allows the tests to run with + // dummy objects: + if (that._isInstanceOf('File', file) || + that._isInstanceOf('Blob', file)) { + formData.append( + ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + file, + file.uploadName || file.name + ); + } + }); + } + } + options.data = formData; + } + // Blob reference is not needed anymore, free memory: + options.blob = null; + }, + + _initIframeSettings: function (options) { + var targetHost = $('').prop('href', options.url).prop('host'); + // Setting the dataType to iframe enables the iframe transport: + options.dataType = 'iframe ' + (options.dataType || ''); + // The iframe transport accepts a serialized array as form data: + options.formData = this._getFormData(options); + // Add redirect url to form data on cross-domain uploads: + if (options.redirect && targetHost && targetHost !== location.host) { + options.formData.push({ + name: options.redirectParamName || 'redirect', + value: options.redirect + }); + } + }, + + _initDataSettings: function (options) { + if (this._isXHRUpload(options)) { + if (!this._chunkedUpload(options, true)) { + if (!options.data) { + this._initXHRData(options); + } + this._initProgressListener(options); + } + if (options.postMessage) { + // Setting the dataType to postmessage enables the + // postMessage transport: + options.dataType = 'postmessage ' + (options.dataType || ''); + } + } else { + this._initIframeSettings(options); + } + }, + + _getParamName: function (options) { + var fileInput = $(options.fileInput), + paramName = options.paramName; + if (!paramName) { + paramName = []; + fileInput.each(function () { + var input = $(this), + name = input.prop('name') || 'files[]', + i = (input.prop('files') || [1]).length; + while (i) { + paramName.push(name); + i -= 1; + } + }); + if (!paramName.length) { + paramName = [fileInput.prop('name') || 'files[]']; + } + } else if (!$.isArray(paramName)) { + paramName = [paramName]; + } + return paramName; + }, + + _initFormSettings: function (options) { + // Retrieve missing options from the input field and the + // associated form, if available: + if (!options.form || !options.form.length) { + options.form = $(options.fileInput.prop('form')); + // If the given file input doesn't have an associated form, + // use the default widget file input's form: + if (!options.form.length) { + options.form = $(this.options.fileInput.prop('form')); + } + } + options.paramName = this._getParamName(options); + if (!options.url) { + options.url = options.form.prop('action') || location.href; + } + // The HTTP request method must be "POST" or "PUT": + options.type = (options.type || + ($.type(options.form.prop('method')) === 'string' && + options.form.prop('method')) || '' + ).toUpperCase(); + if (options.type !== 'POST' && options.type !== 'PUT' && + options.type !== 'PATCH') { + options.type = 'POST'; + } + if (!options.formAcceptCharset) { + options.formAcceptCharset = options.form.attr('accept-charset'); + } + }, + + _getAJAXSettings: function (data) { + var options = $.extend({}, this.options, data); + this._initFormSettings(options); + this._initDataSettings(options); + return options; + }, + + // jQuery 1.6 doesn't provide .state(), + // while jQuery 1.8+ removed .isRejected() and .isResolved(): + _getDeferredState: function (deferred) { + if (deferred.state) { + return deferred.state(); + } + if (deferred.isResolved()) { + return 'resolved'; + } + if (deferred.isRejected()) { + return 'rejected'; + } + return 'pending'; + }, + + // Maps jqXHR callbacks to the equivalent + // methods of the given Promise object: + _enhancePromise: function (promise) { + promise.success = promise.done; + promise.error = promise.fail; + promise.complete = promise.always; + return promise; + }, + + // Creates and returns a Promise object enhanced with + // the jqXHR methods abort, success, error and complete: + _getXHRPromise: function (resolveOrReject, context, args) { + var dfd = $.Deferred(), + promise = dfd.promise(); + context = context || this.options.context || promise; + if (resolveOrReject === true) { + dfd.resolveWith(context, args); + } else if (resolveOrReject === false) { + dfd.rejectWith(context, args); + } + promise.abort = dfd.promise; + return this._enhancePromise(promise); + }, + + // Adds convenience methods to the data callback argument: + _addConvenienceMethods: function (e, data) { + var that = this, + getPromise = function (args) { + return $.Deferred().resolveWith(that, args).promise(); + }; + data.process = function (resolveFunc, rejectFunc) { + if (resolveFunc || rejectFunc) { + data._processQueue = this._processQueue = + (this._processQueue || getPromise([this])).then( + function () { + if (data.errorThrown) { + return $.Deferred() + .rejectWith(that, [data]).promise(); + } + return getPromise(arguments); + } + ).then(resolveFunc, rejectFunc); + } + return this._processQueue || getPromise([this]); + }; + data.submit = function () { + if (this.state() !== 'pending') { + data.jqXHR = this.jqXHR = + (that._trigger( + 'submit', + $.Event('submit', {delegatedEvent: e}), + this + ) !== false) && that._onSend(e, this); + } + return this.jqXHR || that._getXHRPromise(); + }; + data.abort = function () { + if (this.jqXHR) { + return this.jqXHR.abort(); + } + this.errorThrown = 'abort'; + that._trigger('fail', null, this); + return that._getXHRPromise(false); + }; + data.state = function () { + if (this.jqXHR) { + return that._getDeferredState(this.jqXHR); + } + if (this._processQueue) { + return that._getDeferredState(this._processQueue); + } + }; + data.processing = function () { + return !this.jqXHR && this._processQueue && that + ._getDeferredState(this._processQueue) === 'pending'; + }; + data.progress = function () { + return this._progress; + }; + data.response = function () { + return this._response; + }; + }, + + // Parses the Range header from the server response + // and returns the uploaded bytes: + _getUploadedBytes: function (jqXHR) { + var range = jqXHR.getResponseHeader('Range'), + parts = range && range.split('-'), + upperBytesPos = parts && parts.length > 1 && + parseInt(parts[1], 10); + return upperBytesPos && upperBytesPos + 1; + }, + + // Uploads a file in multiple, sequential requests + // by splitting the file up in multiple blob chunks. + // If the second parameter is true, only tests if the file + // should be uploaded in chunks, but does not invoke any + // upload requests: + _chunkedUpload: function (options, testOnly) { + options.uploadedBytes = options.uploadedBytes || 0; + var that = this, + file = options.files[0], + fs = file.size, + ub = options.uploadedBytes, + mcs = options.maxChunkSize || fs, + slice = this._blobSlice, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + upload; + if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) || + options.data) { + return false; + } + if (testOnly) { + return true; + } + if (ub >= fs) { + file.error = options.i18n('uploadedBytes'); + return this._getXHRPromise( + false, + options.context, + [null, 'error', file.error] + ); + } + // The chunk upload method: + upload = function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options), + currentLoaded = o._progress.loaded; + o.blob = slice.call( + file, + ub, + ub + mcs, + file.type + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Expose the chunk bytes position range: + o.contentRange = 'bytes ' + ub + '-' + + (ub + o.chunkSize - 1) + '/' + fs; + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) || + that._getXHRPromise(false, o.context)) + .done(function (result, textStatus, jqXHR) { + ub = that._getUploadedBytes(jqXHR) || + (ub + o.chunkSize); + // Create a progress event if no final progress event + // with loaded equaling total has been triggered + // for this chunk: + if (currentLoaded + o.chunkSize - o._progress.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: ub - o.uploadedBytes, + total: ub - o.uploadedBytes + }), o); + } + options.uploadedBytes = o.uploadedBytes = ub; + o.result = result; + o.textStatus = textStatus; + o.jqXHR = jqXHR; + that._trigger('chunkdone', null, o); + that._trigger('chunkalways', null, o); + if (ub < fs) { + // File upload not yet complete, + // continue with the next chunk: + upload(); + } else { + dfd.resolveWith( + o.context, + [result, textStatus, jqXHR] + ); + } + }) + .fail(function (jqXHR, textStatus, errorThrown) { + o.jqXHR = jqXHR; + o.textStatus = textStatus; + o.errorThrown = errorThrown; + that._trigger('chunkfail', null, o); + that._trigger('chunkalways', null, o); + dfd.rejectWith( + o.context, + [jqXHR, textStatus, errorThrown] + ); + }); + }; + this._enhancePromise(promise); + promise.abort = function () { + return jqXHR.abort(); + }; + upload(); + return promise; + }, + + _beforeSend: function (e, data) { + if (this._active === 0) { + // the start callback is triggered when an upload starts + // and no other uploads are currently running, + // equivalent to the global ajaxStart event: + this._trigger('start'); + // Set timer for global bitrate progress calculation: + this._bitrateTimer = new this._BitrateTimer(); + // Reset the global progress values: + this._progress.loaded = this._progress.total = 0; + this._progress.bitrate = 0; + } + // Make sure the container objects for the .response() and + // .progress() methods on the data object are available + // and reset to their initial state: + this._initResponseObject(data); + this._initProgressObject(data); + data._progress.loaded = data.loaded = data.uploadedBytes || 0; + data._progress.total = data.total = this._getTotal(data.files) || 1; + data._progress.bitrate = data.bitrate = 0; + this._active += 1; + // Initialize the global progress values: + this._progress.loaded += data.loaded; + this._progress.total += data.total; + }, + + _onDone: function (result, textStatus, jqXHR, options) { + var total = options._progress.total, + response = options._response; + if (options._progress.loaded < total) { + // Create a progress event if no final progress event + // with loaded equaling total has been triggered: + this._onProgress($.Event('progress', { + lengthComputable: true, + loaded: total, + total: total + }), options); + } + response.result = options.result = result; + response.textStatus = options.textStatus = textStatus; + response.jqXHR = options.jqXHR = jqXHR; + this._trigger('done', null, options); + }, + + _onFail: function (jqXHR, textStatus, errorThrown, options) { + var response = options._response; + if (options.recalculateProgress) { + // Remove the failed (error or abort) file upload from + // the global progress calculation: + this._progress.loaded -= options._progress.loaded; + this._progress.total -= options._progress.total; + } + response.jqXHR = options.jqXHR = jqXHR; + response.textStatus = options.textStatus = textStatus; + response.errorThrown = options.errorThrown = errorThrown; + this._trigger('fail', null, options); + }, + + _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { + // jqXHRorResult, textStatus and jqXHRorError are added to the + // options object via done and fail callbacks + this._trigger('always', null, options); + }, + + _onSend: function (e, data) { + if (!data.submit) { + this._addConvenienceMethods(e, data); + } + var that = this, + jqXHR, + aborted, + slot, + pipe, + options = that._getAJAXSettings(data), + send = function () { + that._sending += 1; + // Set timer for bitrate progress calculation: + options._bitrateTimer = new that._BitrateTimer(); + jqXHR = jqXHR || ( + ((aborted || that._trigger( + 'send', + $.Event('send', {delegatedEvent: e}), + options + ) === false) && + that._getXHRPromise(false, options.context, aborted)) || + that._chunkedUpload(options) || $.ajax(options) + ).done(function (result, textStatus, jqXHR) { + that._onDone(result, textStatus, jqXHR, options); + }).fail(function (jqXHR, textStatus, errorThrown) { + that._onFail(jqXHR, textStatus, errorThrown, options); + }).always(function (jqXHRorResult, textStatus, jqXHRorError) { + that._onAlways( + jqXHRorResult, + textStatus, + jqXHRorError, + options + ); + that._sending -= 1; + that._active -= 1; + if (options.limitConcurrentUploads && + options.limitConcurrentUploads > that._sending) { + // Start the next queued upload, + // that has not been aborted: + var nextSlot = that._slots.shift(); + while (nextSlot) { + if (that._getDeferredState(nextSlot) === 'pending') { + nextSlot.resolve(); + break; + } + nextSlot = that._slots.shift(); + } + } + if (that._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + that._trigger('stop'); + } + }); + return jqXHR; + }; + this._beforeSend(e, options); + if (this.options.sequentialUploads || + (this.options.limitConcurrentUploads && + this.options.limitConcurrentUploads <= this._sending)) { + if (this.options.limitConcurrentUploads > 1) { + slot = $.Deferred(); + this._slots.push(slot); + pipe = slot.then(send); + } else { + this._sequence = this._sequence.then(send, send); + pipe = this._sequence; + } + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe.abort = function () { + aborted = [undefined, 'abort', 'abort']; + if (!jqXHR) { + if (slot) { + slot.rejectWith(options.context, aborted); + } + return send(); + } + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + } + return send(); + }, + + _onAdd: function (e, data) { + var that = this, + result = true, + options = $.extend({}, this.options, data), + files = data.files, + filesLength = files.length, + limit = options.limitMultiFileUploads, + limitSize = options.limitMultiFileUploadSize, + overhead = options.limitMultiFileUploadSizeOverhead, + batchSize = 0, + paramName = this._getParamName(options), + paramNameSet, + paramNameSlice, + fileSet, + i, + j = 0; + if (!filesLength) { + return false; + } + if (limitSize && files[0].size === undefined) { + limitSize = undefined; + } + if (!(options.singleFileUploads || limit || limitSize) || + !this._isXHRUpload(options)) { + fileSet = [files]; + paramNameSet = [paramName]; + } else if (!(options.singleFileUploads || limitSize) && limit) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i += limit) { + fileSet.push(files.slice(i, i + limit)); + paramNameSlice = paramName.slice(i, i + limit); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + } + } else if (!options.singleFileUploads && limitSize) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i = i + 1) { + batchSize += files[i].size + overhead; + if (i + 1 === filesLength || + ((batchSize + files[i + 1].size + overhead) > limitSize) || + (limit && i + 1 - j >= limit)) { + fileSet.push(files.slice(j, i + 1)); + paramNameSlice = paramName.slice(j, i + 1); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + j = i + 1; + batchSize = 0; + } + } + } else { + paramNameSet = paramName; + } + data.originalFiles = files; + $.each(fileSet || files, function (index, element) { + var newData = $.extend({}, data); + newData.files = fileSet ? element : [element]; + newData.paramName = paramNameSet[index]; + that._initResponseObject(newData); + that._initProgressObject(newData); + that._addConvenienceMethods(e, newData); + result = that._trigger( + 'add', + $.Event('add', {delegatedEvent: e}), + newData + ); + return result; + }); + return result; + }, + + _replaceFileInput: function (data) { + var input = data.fileInput, + inputClone = input.clone(true), + restoreFocus = input.is(document.activeElement); + // Add a reference for the new cloned file input to the data argument: + data.fileInputClone = inputClone; + $('
      ').append(inputClone)[0].reset(); + // Detaching allows to insert the fileInput on another form + // without loosing the file input value: + input.after(inputClone).detach(); + // If the fileInput had focus before it was detached, + // restore focus to the inputClone. + if (restoreFocus) { + inputClone.focus(); + } + // Avoid memory leaks with the detached file input: + $.cleanData(input.unbind('remove')); + // Replace the original file input element in the fileInput + // elements set with the clone, which has been copied including + // event handlers: + this.options.fileInput = this.options.fileInput.map(function (i, el) { + if (el === input[0]) { + return inputClone[0]; + } + return el; + }); + // If the widget has been initialized on the file input itself, + // override this.element with the file input clone: + if (input[0] === this.element[0]) { + this.element = inputClone; + } + }, + + _handleFileTreeEntry: function (entry, path) { + var that = this, + dfd = $.Deferred(), + entries = [], + dirReader, + errorHandler = function (e) { + if (e && !e.entry) { + e.entry = entry; + } + // Since $.when returns immediately if one + // Deferred is rejected, we use resolve instead. + // This allows valid files and invalid items + // to be returned together in one set: + dfd.resolve([e]); + }, + successHandler = function (entries) { + that._handleFileTreeEntries( + entries, + path + entry.name + '/' + ).done(function (files) { + dfd.resolve(files); + }).fail(errorHandler); + }, + readEntries = function () { + dirReader.readEntries(function (results) { + if (!results.length) { + successHandler(entries); + } else { + entries = entries.concat(results); + readEntries(); + } + }, errorHandler); + }; + path = path || ''; + if (entry.isFile) { + if (entry._file) { + // Workaround for Chrome bug #149735 + entry._file.relativePath = path; + dfd.resolve(entry._file); + } else { + entry.file(function (file) { + file.relativePath = path; + dfd.resolve(file); + }, errorHandler); + } + } else if (entry.isDirectory) { + dirReader = entry.createReader(); + readEntries(); + } else { + // Return an empy list for file system items + // other than files or directories: + dfd.resolve([]); + } + return dfd.promise(); + }, + + _handleFileTreeEntries: function (entries, path) { + var that = this; + return $.when.apply( + $, + $.map(entries, function (entry) { + return that._handleFileTreeEntry(entry, path); + }) + ).then(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _getDroppedFiles: function (dataTransfer) { + dataTransfer = dataTransfer || {}; + var items = dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry || + items[0].getAsEntry)) { + return this._handleFileTreeEntries( + $.map(items, function (item) { + var entry; + if (item.webkitGetAsEntry) { + entry = item.webkitGetAsEntry(); + if (entry) { + // Workaround for Chrome bug #149735: + entry._file = item.getAsFile(); + } + return entry; + } + return item.getAsEntry(); + }) + ); + } + return $.Deferred().resolve( + $.makeArray(dataTransfer.files) + ).promise(); + }, + + _getSingleFileInputFiles: function (fileInput) { + fileInput = $(fileInput); + var entries = fileInput.prop('webkitEntries') || + fileInput.prop('entries'), + files, + value; + if (entries && entries.length) { + return this._handleFileTreeEntries(entries); + } + files = $.makeArray(fileInput.prop('files')); + if (!files.length) { + value = fileInput.prop('value'); + if (!value) { + return $.Deferred().resolve([]).promise(); + } + // If the files property is not available, the browser does not + // support the File API and we add a pseudo File object with + // the input value as name with path information removed: + files = [{name: value.replace(/^.*\\/, '')}]; + } else if (files[0].name === undefined && files[0].fileName) { + // File normalization for Safari 4 and Firefox 3: + $.each(files, function (index, file) { + file.name = file.fileName; + file.size = file.fileSize; + }); + } + return $.Deferred().resolve(files).promise(); + }, + + _getFileInputFiles: function (fileInput) { + if (!(fileInput instanceof $) || fileInput.length === 1) { + return this._getSingleFileInputFiles(fileInput); + } + return $.when.apply( + $, + $.map(fileInput, this._getSingleFileInputFiles) + ).then(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _onChange: function (e) { + var that = this, + data = { + fileInput: $(e.target), + form: $(e.target.form) + }; + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + if (that.options.replaceFileInput) { + that._replaceFileInput(data); + } + if (that._trigger( + 'change', + $.Event('change', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + }, + + _onPaste: function (e) { + var items = e.originalEvent && e.originalEvent.clipboardData && + e.originalEvent.clipboardData.items, + data = {files: []}; + if (items && items.length) { + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (this._trigger( + 'paste', + $.Event('paste', {delegatedEvent: e}), + data + ) !== false) { + this._onAdd(e, data); + } + } + }, + + _onDrop: function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var that = this, + dataTransfer = e.dataTransfer, + data = {}; + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { + e.preventDefault(); + this._getDroppedFiles(dataTransfer).always(function (files) { + data.files = files; + if (that._trigger( + 'drop', + $.Event('drop', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + } + }, + + _onDragOver: getDragHandler('dragover'), + + _onDragEnter: getDragHandler('dragenter'), + + _onDragLeave: getDragHandler('dragleave'), + + _initEventHandlers: function () { + if (this._isXHRUpload(this.options)) { + this._on(this.options.dropZone, { + dragover: this._onDragOver, + drop: this._onDrop, + // event.preventDefault() on dragenter is required for IE10+: + dragenter: this._onDragEnter, + // dragleave is not required, but added for completeness: + dragleave: this._onDragLeave + }); + this._on(this.options.pasteZone, { + paste: this._onPaste + }); + } + if ($.support.fileInput) { + this._on(this.options.fileInput, { + change: this._onChange + }); + } + }, + + _destroyEventHandlers: function () { + this._off(this.options.dropZone, 'dragenter dragleave dragover drop'); + this._off(this.options.pasteZone, 'paste'); + this._off(this.options.fileInput, 'change'); + }, + + _destroy: function () { + this._destroyEventHandlers(); + }, + + _setOption: function (key, value) { + var reinit = $.inArray(key, this._specialOptions) !== -1; + if (reinit) { + this._destroyEventHandlers(); + } + this._super(key, value); + if (reinit) { + this._initSpecialOptions(); + this._initEventHandlers(); + } + }, + + _initSpecialOptions: function () { + var options = this.options; + if (options.fileInput === undefined) { + options.fileInput = this.element.is('input[type="file"]') ? + this.element : this.element.find('input[type="file"]'); + } else if (!(options.fileInput instanceof $)) { + options.fileInput = $(options.fileInput); + } + if (!(options.dropZone instanceof $)) { + options.dropZone = $(options.dropZone); + } + if (!(options.pasteZone instanceof $)) { + options.pasteZone = $(options.pasteZone); + } + }, + + _getRegExp: function (str) { + var parts = str.split('/'), + modifiers = parts.pop(); + parts.shift(); + return new RegExp(parts.join('/'), modifiers); + }, + + _isRegExpOption: function (key, value) { + return key !== 'url' && $.type(value) === 'string' && + /^\/.*\/[igm]{0,3}$/.test(value); + }, + + _initDataAttributes: function () { + var that = this, + options = this.options, + data = this.element.data(); + // Initialize options set via HTML5 data-attributes: + $.each( + this.element[0].attributes, + function (index, attr) { + var key = attr.name.toLowerCase(), + value; + if (/^data-/.test(key)) { + // Convert hyphen-ated key to camelCase: + key = key.slice(5).replace(/-[a-z]/g, function (str) { + return str.charAt(1).toUpperCase(); + }); + value = data[key]; + if (that._isRegExpOption(key, value)) { + value = that._getRegExp(value); + } + options[key] = value; + } + } + ); + }, + + _create: function () { + this._initDataAttributes(); + this._initSpecialOptions(); + this._slots = []; + this._sequence = this._getXHRPromise(true); + this._sending = this._active = 0; + this._initProgressObject(this); + this._initEventHandlers(); + }, + + // This method is exposed to the widget API and allows to query + // the number of active uploads: + active: function () { + return this._active; + }, + + // This method is exposed to the widget API and allows to query + // the widget upload progress. + // It returns an object with loaded, total and bitrate properties + // for the running uploads: + progress: function () { + return this._progress; + }, + + // This method is exposed to the widget API and allows adding files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('add', {files: filesList}); + add: function (data) { + var that = this; + if (!data || this.options.disabled) { + return; + } + if (data.fileInput && !data.files) { + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + that._onAdd(null, data); + }); + } else { + data.files = $.makeArray(data.files); + this._onAdd(null, data); + } + }, + + // This method is exposed to the widget API and allows sending files + // using the fileupload API. The data parameter accepts an object which + // must have a files or fileInput property and can contain additional options: + // .fileupload('send', {files: filesList}); + // The method returns a Promise object for the file upload call. + send: function (data) { + if (data && !this.options.disabled) { + if (data.fileInput && !data.files) { + var that = this, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + aborted; + promise.abort = function () { + aborted = true; + if (jqXHR) { + return jqXHR.abort(); + } + dfd.reject(null, 'abort', 'abort'); + return promise; + }; + this._getFileInputFiles(data.fileInput).always( + function (files) { + if (aborted) { + return; + } + if (!files.length) { + dfd.reject(); + return; + } + data.files = files; + jqXHR = that._onSend(null, data); + jqXHR.then( + function (result, textStatus, jqXHR) { + dfd.resolve(result, textStatus, jqXHR); + }, + function (jqXHR, textStatus, errorThrown) { + dfd.reject(jqXHR, textStatus, errorThrown); + } + ); + } + ); + return this._enhancePromise(promise); + } + data.files = $.makeArray(data.files); + if (data.files.length) { + return this._onSend(null, data); + } + } + return this._getXHRPromise(false, data && data.context); + } + + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/jquery.iframe-transport.js b/bower_components/blueimp-file-upload/js/jquery.iframe-transport.js new file mode 100644 index 0000000000..b7922e61fc --- /dev/null +++ b/bower_components/blueimp-file-upload/js/jquery.iframe-transport.js @@ -0,0 +1,217 @@ +/* + * jQuery Iframe Transport Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Helper variable to create unique names for the transport iframes: + var counter = 0; + + // The iframe transport accepts four additional options: + // options.fileInput: a jQuery collection of file input fields + // options.paramName: the parameter name for the file form data, + // overrides the name property of the file input field(s), + // can be a string or an array of strings. + // options.formData: an array of objects with name and value properties, + // equivalent to the return data of .serializeArray(), e.g.: + // [{name: 'a', value: 1}, {name: 'b', value: 2}] + // options.initialIframeSrc: the URL of the initial iframe src, + // by default set to "javascript:false;" + $.ajaxTransport('iframe', function (options) { + if (options.async) { + // javascript:false as initial iframe src + // prevents warning popups on HTTPS in IE6: + /*jshint scripturl: true */ + var initialIframeSrc = options.initialIframeSrc || 'javascript:false;', + /*jshint scripturl: false */ + form, + iframe, + addParamChar; + return { + send: function (_, completeCallback) { + form = $('
      '); + form.attr('accept-charset', options.formAcceptCharset); + addParamChar = /\?/.test(options.url) ? '&' : '?'; + // XDomainRequest only supports GET and POST: + if (options.type === 'DELETE') { + options.url = options.url + addParamChar + '_method=DELETE'; + options.type = 'POST'; + } else if (options.type === 'PUT') { + options.url = options.url + addParamChar + '_method=PUT'; + options.type = 'POST'; + } else if (options.type === 'PATCH') { + options.url = options.url + addParamChar + '_method=PATCH'; + options.type = 'POST'; + } + // IE versions below IE8 cannot set the name property of + // elements that have already been added to the DOM, + // so we set the name along with the iframe HTML markup: + counter += 1; + iframe = $( + '' + ).bind('load', function () { + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('') + .appendTo(form); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + // Remove the HTML5 form attribute from the input(s): + options.fileInput.removeAttr('form'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + // Restore the original name and form properties: + $(input) + .prop('name', clone.prop('name')) + .attr('form', clone.attr('form')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', initialIframeSrc); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return iframe && $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return iframe && $.parseJSON($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); + }, + 'iframe script': function (iframe) { + return iframe && $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/bower_components/blueimp-file-upload/js/vendor/jquery.ui.widget.js b/bower_components/blueimp-file-upload/js/vendor/jquery.ui.widget.js new file mode 100644 index 0000000000..e08df3fd02 --- /dev/null +++ b/bower_components/blueimp-file-upload/js/vendor/jquery.ui.widget.js @@ -0,0 +1,572 @@ +/*! jQuery UI - v1.11.4+CommonJS - 2015-08-28 +* http://jqueryui.com +* Includes: widget.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + + } else if ( typeof exports === "object" ) { + + // Node/CommonJS + factory( require( "jquery" ) ); + + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { +/*! + * jQuery UI Widget 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + + +var widget_uuid = 0, + widget_slice = Array.prototype.slice; + +$.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +})( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widget_slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = widget_slice.call( arguments, 1 ), + returnValue = this; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( options === "instance" ) { + returnValue = instance; + return false; + } + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat(args) ); + } + + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
      ", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widget_uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled", !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + } + + return this; + }, + + enable: function() { + return this._setOptions({ disabled: false }); + }, + disable: function() { + return this._setOptions({ disabled: true }); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +var widget = $.widget; + + + +})); diff --git a/bower_components/blueimp-load-image/.bower.json b/bower_components/blueimp-load-image/.bower.json new file mode 100644 index 0000000000..6714e241a9 --- /dev/null +++ b/bower_components/blueimp-load-image/.bower.json @@ -0,0 +1,14 @@ +{ + "name": "blueimp-load-image", + "homepage": "https://github.com/blueimp/JavaScript-Load-Image", + "version": "2.10.0", + "_release": "2.10.0", + "_resolution": { + "type": "version", + "tag": "v2.10.0", + "commit": "4781b0430e4141ca14f48379d990777a4d268e24" + }, + "_source": "https://github.com/blueimp/JavaScript-Load-Image.git", + "_target": ">=1.13.0", + "_originalSource": "blueimp-load-image" +} \ No newline at end of file diff --git a/bower_components/blueimp-load-image/.gitignore b/bower_components/blueimp-load-image/.gitignore new file mode 100644 index 0000000000..9daa8247da --- /dev/null +++ b/bower_components/blueimp-load-image/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +node_modules diff --git a/bower_components/blueimp-load-image/.npmignore b/bower_components/blueimp-load-image/.npmignore new file mode 100644 index 0000000000..a508bcb5d2 --- /dev/null +++ b/bower_components/blueimp-load-image/.npmignore @@ -0,0 +1,3 @@ +* +!js/*.js +!js/*.js.map diff --git a/bower_components/blueimp-load-image/.travis.yml b/bower_components/blueimp-load-image/.travis.yml new file mode 100644 index 0000000000..7a56d2a537 --- /dev/null +++ b/bower_components/blueimp-load-image/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "stable" diff --git a/bower_components/blueimp-load-image/README.md b/bower_components/blueimp-load-image/README.md new file mode 100644 index 0000000000..93627be1f2 --- /dev/null +++ b/bower_components/blueimp-load-image/README.md @@ -0,0 +1,321 @@ +# JavaScript Load Image + +> A JavaScript library to load and transform image files. + +## Table of contents + +- [Demo](#demo) +- [Description](#description) +- [Setup](#setup) +- [Usage](#usage) +- [Image loading](#image-loading) +- [Image scaling](#image-scaling) +- [Requirements](#requirements) +- [API](#api) +- [Options](#options) +- [Meta data parsing](#meta-data-parsing) +- [Exif parser](#exif-parser) +- [License](#license) +- [Credits](#credits) + +## Demo +[JavaScript Load Image Demo](https://blueimp.github.io/JavaScript-Load-Image/) + +## Description +JavaScript Load Image is a library to load images provided as File or Blob +objects or via URL. +It returns an optionally scaled and/or cropped HTML img or canvas element via an +asynchronous callback. +It also provides a method to parse image meta data to extract Exif tags and +thumbnails and to restore the complete image header after resizing. + +## Setup +Include the (combined and minified) JavaScript Load Image script in your HTML +markup: + +```html + +``` + +Or alternatively, choose which components you want to include: + +```html + + + + + +``` + +## Usage + +### Image loading +In your application code, use the **loadImage()** function like this: + +```js +document.getElementById('file-input').onchange = function (e) { + loadImage( + e.target.files[0], + function (img) { + document.body.appendChild(img); + }, + {maxWidth: 600} // Options + ); +}; +``` + +### Image scaling +It is also possible to use the image scaling functionality with an existing +image: + +```js +var scaledImage = loadImage.scale( + img, // img or canvas element + {maxWidth: 600} +); +``` + +## Requirements +The JavaScript Load Image library has zero dependencies. + +However, JavaScript Load Image is a very suitable complement to the +[Canvas to Blob](https://github.com/blueimp/JavaScript-Canvas-to-Blob) library. + +## API +The **loadImage()** function accepts a +[File](https://developer.mozilla.org/en/DOM/File) or +[Blob](https://developer.mozilla.org/en/DOM/Blob) object or a simple image URL +(e.g. `'https://example.org/image.png'`) as first argument. + +If a [File](https://developer.mozilla.org/en/DOM/File) or +[Blob](https://developer.mozilla.org/en/DOM/Blob) is passed as parameter, it +returns a HTML **img** element if the browser supports the +[URL](https://developer.mozilla.org/en/DOM/window.URL) API or a +[FileReader](https://developer.mozilla.org/en/DOM/FileReader) object if +supported, or **false**. +It always returns a HTML +[img](https://developer.mozilla.org/en/docs/HTML/Element/Img) element when +passing an image URL: + +```js +document.getElementById('file-input').onchange = function (e) { + var loadingImage = loadImage( + e.target.files[0], + function (img) { + document.body.appendChild(img); + }, + {maxWidth: 600} + ); + if (!loadingImage) { + // Alternative code ... + } +}; +``` + +The **img** element or +[FileReader](https://developer.mozilla.org/en/DOM/FileReader) object returned by +the **loadImage()** function allows to abort the loading process by setting the +**onload** and **onerror** event handlers to null: + +```js +document.getElementById('file-input').onchange = function (e) { + var loadingImage = loadImage( + e.target.files[0], + function (img) { + document.body.appendChild(img); + }, + {maxWidth: 600} + ); + loadingImage.onload = loadingImage.onerror = null; +}; +``` + +The second argument must be a **callback** function, which is called when the +image has been loaded or an error occurred while loading the image. The callback +function is passed one argument, which is either a HTML **img** element, a +[canvas](https://developer.mozilla.org/en/HTML/Canvas) element, or an +[Event](https://developer.mozilla.org/en/DOM/event) object of type **error**: + +```js +var imageUrl = "https://example.org/image.png"; +loadImage( + imageUrl, + function (img) { + if(img.type === "error") { + console.log("Error loading image " + imageUrl); + } else { + document.body.appendChild(img); + } + }, + {maxWidth: 600} +); +``` + +## Options +The optional third argument to **loadImage()** is a map of options: + +* **maxWidth**: Defines the maximum width of the img/canvas element. +* **maxHeight**: Defines the maximum height of the img/canvas element. +* **minWidth**: Defines the minimum width of the img/canvas element. +* **minHeight**: Defines the minimum height of the img/canvas element. +* **sourceWidth**: The width of the sub-rectangle of the source image to draw +into the destination canvas. +Defaults to the source image width and requires `canvas: true`. +* **sourceHeight**: The height of the sub-rectangle of the source image to draw +into the destination canvas. +Defaults to the source image height and requires `canvas: true`. +* **top**: The top margin of the sub-rectangle of the source image. +Defaults to `0` and requires `canvas: true`. +* **right**: The right margin of the sub-rectangle of the source image. +Defaults to `0` and requires `canvas: true`. +* **bottom**: The bottom margin of the sub-rectangle of the source image. +Defaults to `0` and requires `canvas: true`. +* **left**: The left margin of the sub-rectangle of the source image. +Defaults to `0` and requires `canvas: true`. +* **contain**: Scales the image up/down to contain it in the max dimensions if +set to `true`. +This emulates the CSS feature +[background-image: contain](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Scaling_background_images#contain). +* **cover**: Scales the image up/down to cover the max dimensions with the image +dimensions if set to `true`. +This emulates the CSS feature +[background-image: cover](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Scaling_background_images#cover). +* **aspectRatio**: Crops the image to the given aspect ratio (e.g. `16/9`). +Setting the `aspectRatio` also enables the `crop` option. +* **pixelRatio**: Defines the ratio of the canvas pixels to the physical image +pixels on the screen. +Should be set to `window.devicePixelRatio` unless the scaled image is not +rendered on screen. +Defaults to `1` and requires `canvas: true`. +* **downsamplingRatio**: Defines the ratio in which the image is downsampled. +By default, images are downsampled in one step. With a ratio of `0.5`, each step +scales the image to half the size, before reaching the target dimensions. +Requires `canvas: true`. +* **crop**: Crops the image to the maxWidth/maxHeight constraints if set to +`true`. +Enabling the `crop` option also enables the `canvas` option. +* **orientation**: Transform the canvas according to the specified Exif +orientation, which can be an `integer` in the range of `1` to `8` or the boolean +value `true`. +When set to `true`, it will set the orientation value based on the EXIF data of +the image, which will be parsed automatically if the exif library is available. +Setting the `orientation` also enables the `canvas` option. +Setting `orientation` to `true` alsoe enables the `meta` option. +* **meta**: Automatically parses the image meta data if set to `true`. +The meta data is passed to the callback as second argument. +* **canvas**: Returns the image as +[canvas](https://developer.mozilla.org/en/HTML/Canvas) element if set to `true`. +* **crossOrigin**: Sets the crossOrigin property on the img element for loading +[CORS enabled images](https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image). +* **noRevoke**: By default, the +[created object URL](https://developer.mozilla.org/en/DOM/window.URL.createObjectURL) +is revoked after the image has been loaded, except when this option is set to +`true`. + +They can be used the following way: + +```js +loadImage( + fileOrBlobOrUrl, + function (img) { + document.body.appendChild(img); + }, + { + maxWidth: 600, + maxHeight: 300, + minWidth: 100, + minHeight: 50, + canvas: true + } +); +``` + +All settings are optional. By default, the image is returned as HTML **img** +element without any image size restrictions. + +## Meta data parsing +If the Load Image Meta extension is included, it is also possible to parse image +meta data. +The extension provides the method **loadImage.parseMetaData**, which can be used +the following way: + +```js +loadImage.parseMetaData( + fileOrBlob, + function (data) { + if (!data.imageHead) { + return; + } + // Combine data.imageHead with the image body of a resized file + // to create scaled images with the original image meta data, e.g.: + var blob = new Blob([ + data.imageHead, + // Resized images always have a head size of 20 bytes, + // including the JPEG marker and a minimal JFIF header: + loadImage.blobSlice.call(resizedImage, 20) + ], {type: resizedImage.type}); + }, + { + maxMetaDataSize: 262144, + disableImageHead: false + } +); +``` + +The third argument is an options object which defines the maximum number of +bytes to parse for the image meta data, allows to disable the imageHead creation +and is also passed along to segment parsers registered via loadImage extensions, +e.g. the Exif parser. + +**Note:** +Blob objects of resized images can be created via +[canvas.toBlob()](https://github.com/blueimp/JavaScript-Canvas-to-Blob). + +### Exif parser +If you include the Load Image Exif Parser extension, the argument passed to the +callback for **parseMetaData** will contain the additional property **exif** if +Exif data could be found in the given image. +The **exif** object stores the parsed Exif tags: + +```js +var orientation = data.exif[0x0112]; +``` + +It also provides an **exif.get()** method to retrieve the tag value via the +tag's mapped name: + +```js +var orientation = data.exif.get('Orientation'); +``` + +By default, the only available mapped names are **Orientation** and +**Thumbnail**. +If you also include the Load Image Exif Map library, additional tag mappings +become available, as well as two additional methods, **exif.getText()** and +**exif.getAll()**: + +```js +var flashText = data.exif.getText('Flash'); // e.g.: 'Flash fired, auto mode', + +// A map of all parsed tags with their mapped names as keys and their text values: +var allTags = data.exif.getAll(); +``` + +The Exif parser also adds additional options for the parseMetaData method, to +disable certain aspects of the parser: + +* **disableExif**: Disables Exif parsing. +* **disableExifThumbnail**: Disables parsing of the Exif Thumbnail. +* **disableExifSub**: Disables parsing of the Exif Sub IFD. +* **disableExifGps**: Disables parsing of the Exif GPS Info IFD. + +## License +The JavaScript Load Image script is released under the +[MIT license](http://www.opensource.org/licenses/MIT). + +## Credits + +* Image meta data handling implementation based on the help and contribution of +Achim Stöhr. +* Exif tags mapping based on Jacob Seidelin's +[exif-js](https://github.com/jseidelin/exif-js). diff --git a/bower_components/blueimp-load-image/css/demo.css b/bower_components/blueimp-load-image/css/demo.css new file mode 100644 index 0000000000..e040b74feb --- /dev/null +++ b/bower_components/blueimp-load-image/css/demo.css @@ -0,0 +1,74 @@ +/* + * JavaScript Load Image Demo CSS + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +body { + max-width: 750px; + margin: 0 auto; + padding: 1em; + font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, sans-serif; + font-size: 1em; + line-height: 1.4em; + background: #222; + color: #fff; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a { + color: orange; + text-decoration: none; +} +img { + border: 0; + vertical-align: middle; +} +h1 { + line-height: 1em; +} +table { + width: 100%; + word-wrap: break-word; + table-layout: fixed; + border-collapse: collapse; +} +tr { + background: #fff; + color: #222; +} +tr:nth-child(odd) { + background: #eee; + color: #222; +} +td { + padding: 10px; +} +.result, +.thumbnail { + padding: 20px; + background: #fff; + color: #222; + text-align: center; +} +.jcrop-holder { + margin: 0 auto; +} + +@media (min-width: 481px) { + .navigation { + list-style: none; + padding: 0; + } + .navigation li { + display: inline-block; + } + .navigation li:not(:first-child):before { + content: '| '; + } +} diff --git a/bower_components/blueimp-load-image/css/vendor/Jcrop.gif b/bower_components/blueimp-load-image/css/vendor/Jcrop.gif new file mode 100755 index 0000000000..72ea7ccb53 Binary files /dev/null and b/bower_components/blueimp-load-image/css/vendor/Jcrop.gif differ diff --git a/bower_components/blueimp-load-image/css/vendor/jquery.Jcrop.css b/bower_components/blueimp-load-image/css/vendor/jquery.Jcrop.css new file mode 100755 index 0000000000..95f8b9cfc2 --- /dev/null +++ b/bower_components/blueimp-load-image/css/vendor/jquery.Jcrop.css @@ -0,0 +1,165 @@ +/* jquery.Jcrop.css v0.9.12 - MIT License */ +/* + The outer-most container in a typical Jcrop instance + If you are having difficulty with formatting related to styles + on a parent element, place any fixes here or in a like selector + + You can also style this element if you want to add a border, etc + A better method for styling can be seen below with .jcrop-light + (Add a class to the holder and style elements for that extended class) +*/ +.jcrop-holder { + direction: ltr; + text-align: left; +} +/* Selection Border */ +.jcrop-vline, +.jcrop-hline { + background: #ffffff url("Jcrop.gif"); + font-size: 0; + position: absolute; +} +.jcrop-vline { + height: 100%; + width: 1px !important; +} +.jcrop-vline.right { + right: 0; +} +.jcrop-hline { + height: 1px !important; + width: 100%; +} +.jcrop-hline.bottom { + bottom: 0; +} +/* Invisible click targets */ +.jcrop-tracker { + height: 100%; + width: 100%; + /* "turn off" link highlight */ + -webkit-tap-highlight-color: transparent; + /* disable callout, image save panel */ + -webkit-touch-callout: none; + /* disable cut copy paste */ + -webkit-user-select: none; +} +/* Selection Handles */ +.jcrop-handle { + background-color: #333333; + border: 1px #eeeeee solid; + width: 7px; + height: 7px; + font-size: 1px; +} +.jcrop-handle.ord-n { + left: 50%; + margin-left: -4px; + margin-top: -4px; + top: 0; +} +.jcrop-handle.ord-s { + bottom: 0; + left: 50%; + margin-bottom: -4px; + margin-left: -4px; +} +.jcrop-handle.ord-e { + margin-right: -4px; + margin-top: -4px; + right: 0; + top: 50%; +} +.jcrop-handle.ord-w { + left: 0; + margin-left: -4px; + margin-top: -4px; + top: 50%; +} +.jcrop-handle.ord-nw { + left: 0; + margin-left: -4px; + margin-top: -4px; + top: 0; +} +.jcrop-handle.ord-ne { + margin-right: -4px; + margin-top: -4px; + right: 0; + top: 0; +} +.jcrop-handle.ord-se { + bottom: 0; + margin-bottom: -4px; + margin-right: -4px; + right: 0; +} +.jcrop-handle.ord-sw { + bottom: 0; + left: 0; + margin-bottom: -4px; + margin-left: -4px; +} +/* Dragbars */ +.jcrop-dragbar.ord-n, +.jcrop-dragbar.ord-s { + height: 7px; + width: 100%; +} +.jcrop-dragbar.ord-e, +.jcrop-dragbar.ord-w { + height: 100%; + width: 7px; +} +.jcrop-dragbar.ord-n { + margin-top: -4px; +} +.jcrop-dragbar.ord-s { + bottom: 0; + margin-bottom: -4px; +} +.jcrop-dragbar.ord-e { + margin-right: -4px; + right: 0; +} +.jcrop-dragbar.ord-w { + margin-left: -4px; +} +/* The "jcrop-light" class/extension */ +.jcrop-light .jcrop-vline, +.jcrop-light .jcrop-hline { + background: #ffffff; + filter: alpha(opacity=70) !important; + opacity: .70!important; +} +.jcrop-light .jcrop-handle { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + background-color: #000000; + border-color: #ffffff; + border-radius: 3px; +} +/* The "jcrop-dark" class/extension */ +.jcrop-dark .jcrop-vline, +.jcrop-dark .jcrop-hline { + background: #000000; + filter: alpha(opacity=70) !important; + opacity: 0.7 !important; +} +.jcrop-dark .jcrop-handle { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + background-color: #ffffff; + border-color: #000000; + border-radius: 3px; +} +/* Simple macro to turn off the antlines */ +.solid-line .jcrop-vline, +.solid-line .jcrop-hline { + background: #ffffff; +} +/* Fix for twitter bootstrap et al. */ +.jcrop-holder img, +img.jcrop-preview { + max-width: none; +} diff --git a/bower_components/blueimp-load-image/index.html b/bower_components/blueimp-load-image/index.html new file mode 100644 index 0000000000..f017adeb73 --- /dev/null +++ b/bower_components/blueimp-load-image/index.html @@ -0,0 +1,69 @@ + + + + + + +JavaScript Load Image + + + + + + + +

      JavaScript Load Image Demo

      +

      JavaScript Load Image is a library to load images provided as File or Blob objects or via URL.
      +It returns an optionally scaled and/or cropped HTML img or canvas element.
      +It also provides a method to parse image meta data to extract Exif tags and thumbnails and to restore the complete image header after resizing.

      + +
      +

      Select an image file

      +

      +

      Or drag & drop an image file onto this webpage.

      +
      +

      Result

      + +
      +

      This demo works only in browsers with support for the URL or FileReader API.

      +
      +
      + +
      + + + + + + + + + + + diff --git a/bower_components/blueimp-load-image/js/demo/demo.js b/bower_components/blueimp-load-image/js/demo/demo.js new file mode 100644 index 0000000000..ca1c6900c4 --- /dev/null +++ b/bower_components/blueimp-load-image/js/demo/demo.js @@ -0,0 +1,162 @@ +/* + * JavaScript Load Image Demo JS + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global loadImage, HTMLCanvasElement, $ */ + +$(function () { + 'use strict' + + var result = $('#result') + var exifNode = $('#exif') + var thumbNode = $('#thumbnail') + var actionsNode = $('#actions') + var currentFile + var coordinates + + function displayExifData (exif) { + var thumbnail = exif.get('Thumbnail') + var tags = exif.getAll() + var table = exifNode.find('table').empty() + var row = $('') + var cell = $('') + var prop + if (thumbnail) { + thumbNode.empty() + loadImage(thumbnail, function (img) { + thumbNode.append(img).show() + }, {orientation: exif.get('Orientation')}) + } + for (prop in tags) { + if (tags.hasOwnProperty(prop)) { + table.append( + row.clone() + .append(cell.clone().text(prop)) + .append(cell.clone().text(tags[prop])) + ) + } + } + exifNode.show() + } + + function updateResults (img, data) { + var content + if (!(img.src || img instanceof HTMLCanvasElement)) { + content = $('Loading image file failed') + } else { + content = $('').append(img) + .attr('download', currentFile.name) + .attr('href', img.src || img.toDataURL()) + } + result.children().replaceWith(content) + if (img.getContext) { + actionsNode.show() + } + if (data && data.exif) { + displayExifData(data.exif) + } + } + + function displayImage (file, options) { + currentFile = file + if (!loadImage( + file, + updateResults, + options + )) { + result.children().replaceWith( + $('' + + 'Your browser does not support the URL or FileReader API.' + + '') + ) + } + } + + function dropChangeHandler (e) { + e.preventDefault() + e = e.originalEvent + var target = e.dataTransfer || e.target + var file = target && target.files && target.files[0] + var options = { + maxWidth: result.width(), + canvas: true, + pixelRatio: window.devicePixelRatio, + downsamplingRatio: 0.5, + orientation: true + } + if (!file) { + return + } + exifNode.hide() + thumbNode.hide() + displayImage(file, options) + } + + // Hide URL/FileReader API requirement message in capable browsers: + if (window.createObjectURL || window.URL || window.webkitURL || + window.FileReader) { + result.children().hide() + } + + $(document) + .on('dragover', function (e) { + e.preventDefault() + e = e.originalEvent + e.dataTransfer.dropEffect = 'copy' + }) + .on('drop', dropChangeHandler) + + $('#file-input') + .on('change', dropChangeHandler) + + $('#edit') + .on('click', function (event) { + event.preventDefault() + var imgNode = result.find('img, canvas') + var img = imgNode[0] + var pixelRatio = window.devicePixelRatio || 1 + imgNode.Jcrop({ + setSelect: [ + 40, + 40, + (img.width / pixelRatio) - 40, + (img.height / pixelRatio) - 40 + ], + onSelect: function (coords) { + coordinates = coords + }, + onRelease: function () { + coordinates = null + } + }).parent().on('click', function (event) { + event.preventDefault() + }) + }) + + $('#crop') + .on('click', function (event) { + event.preventDefault() + var img = result.find('img, canvas')[0] + var pixelRatio = window.devicePixelRatio || 1 + if (img && coordinates) { + updateResults(loadImage.scale(img, { + left: coordinates.x * pixelRatio, + top: coordinates.y * pixelRatio, + sourceWidth: coordinates.w * pixelRatio, + sourceHeight: coordinates.h * pixelRatio, + minWidth: result.width(), + maxWidth: result.width(), + pixelRatio: pixelRatio, + downsamplingRatio: 0.5 + })) + coordinates = null + } + }) +}) diff --git a/bower_components/blueimp-load-image/js/index.js b/bower_components/blueimp-load-image/js/index.js new file mode 100644 index 0000000000..fda1dc734a --- /dev/null +++ b/bower_components/blueimp-load-image/js/index.js @@ -0,0 +1,6 @@ +module.exports = require('./load-image') + +require('./load-image-meta') +require('./load-image-exif') +require('./load-image-exif-map') +require('./load-image-orientation') diff --git a/bower_components/blueimp-load-image/js/load-image-exif-map.js b/bower_components/blueimp-load-image/js/load-image-exif-map.js new file mode 100644 index 0000000000..3a97c0bec5 --- /dev/null +++ b/bower_components/blueimp-load-image/js/load-image-exif-map.js @@ -0,0 +1,387 @@ +/* + * JavaScript Load Image Exif Map + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Exif tags mapping based on + * https://github.com/jseidelin/exif-js + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['./load-image', './load-image-exif'], factory) + } else if (typeof module === 'object' && module.exports) { + factory(require('./load-image'), require('./load-image-exif')) + } else { + // Browser globals: + factory(window.loadImage) + } +}(function (loadImage) { + 'use strict' + + loadImage.ExifMap.prototype.tags = { + // ================= + // TIFF tags (IFD0): + // ================= + 0x0100: 'ImageWidth', + 0x0101: 'ImageHeight', + 0x8769: 'ExifIFDPointer', + 0x8825: 'GPSInfoIFDPointer', + 0xA005: 'InteroperabilityIFDPointer', + 0x0102: 'BitsPerSample', + 0x0103: 'Compression', + 0x0106: 'PhotometricInterpretation', + 0x0112: 'Orientation', + 0x0115: 'SamplesPerPixel', + 0x011C: 'PlanarConfiguration', + 0x0212: 'YCbCrSubSampling', + 0x0213: 'YCbCrPositioning', + 0x011A: 'XResolution', + 0x011B: 'YResolution', + 0x0128: 'ResolutionUnit', + 0x0111: 'StripOffsets', + 0x0116: 'RowsPerStrip', + 0x0117: 'StripByteCounts', + 0x0201: 'JPEGInterchangeFormat', + 0x0202: 'JPEGInterchangeFormatLength', + 0x012D: 'TransferFunction', + 0x013E: 'WhitePoint', + 0x013F: 'PrimaryChromaticities', + 0x0211: 'YCbCrCoefficients', + 0x0214: 'ReferenceBlackWhite', + 0x0132: 'DateTime', + 0x010E: 'ImageDescription', + 0x010F: 'Make', + 0x0110: 'Model', + 0x0131: 'Software', + 0x013B: 'Artist', + 0x8298: 'Copyright', + // ================== + // Exif Sub IFD tags: + // ================== + 0x9000: 'ExifVersion', // EXIF version + 0xA000: 'FlashpixVersion', // Flashpix format version + 0xA001: 'ColorSpace', // Color space information tag + 0xA002: 'PixelXDimension', // Valid width of meaningful image + 0xA003: 'PixelYDimension', // Valid height of meaningful image + 0xA500: 'Gamma', + 0x9101: 'ComponentsConfiguration', // Information about channels + 0x9102: 'CompressedBitsPerPixel', // Compressed bits per pixel + 0x927C: 'MakerNote', // Any desired information written by the manufacturer + 0x9286: 'UserComment', // Comments by user + 0xA004: 'RelatedSoundFile', // Name of related sound file + 0x9003: 'DateTimeOriginal', // Date and time when the original image was generated + 0x9004: 'DateTimeDigitized', // Date and time when the image was stored digitally + 0x9290: 'SubSecTime', // Fractions of seconds for DateTime + 0x9291: 'SubSecTimeOriginal', // Fractions of seconds for DateTimeOriginal + 0x9292: 'SubSecTimeDigitized', // Fractions of seconds for DateTimeDigitized + 0x829A: 'ExposureTime', // Exposure time (in seconds) + 0x829D: 'FNumber', + 0x8822: 'ExposureProgram', // Exposure program + 0x8824: 'SpectralSensitivity', // Spectral sensitivity + 0x8827: 'PhotographicSensitivity', // EXIF 2.3, ISOSpeedRatings in EXIF 2.2 + 0x8828: 'OECF', // Optoelectric conversion factor + 0x8830: 'SensitivityType', + 0x8831: 'StandardOutputSensitivity', + 0x8832: 'RecommendedExposureIndex', + 0x8833: 'ISOSpeed', + 0x8834: 'ISOSpeedLatitudeyyy', + 0x8835: 'ISOSpeedLatitudezzz', + 0x9201: 'ShutterSpeedValue', // Shutter speed + 0x9202: 'ApertureValue', // Lens aperture + 0x9203: 'BrightnessValue', // Value of brightness + 0x9204: 'ExposureBias', // Exposure bias + 0x9205: 'MaxApertureValue', // Smallest F number of lens + 0x9206: 'SubjectDistance', // Distance to subject in meters + 0x9207: 'MeteringMode', // Metering mode + 0x9208: 'LightSource', // Kind of light source + 0x9209: 'Flash', // Flash status + 0x9214: 'SubjectArea', // Location and area of main subject + 0x920A: 'FocalLength', // Focal length of the lens in mm + 0xA20B: 'FlashEnergy', // Strobe energy in BCPS + 0xA20C: 'SpatialFrequencyResponse', + 0xA20E: 'FocalPlaneXResolution', // Number of pixels in width direction per FPRUnit + 0xA20F: 'FocalPlaneYResolution', // Number of pixels in height direction per FPRUnit + 0xA210: 'FocalPlaneResolutionUnit', // Unit for measuring the focal plane resolution + 0xA214: 'SubjectLocation', // Location of subject in image + 0xA215: 'ExposureIndex', // Exposure index selected on camera + 0xA217: 'SensingMethod', // Image sensor type + 0xA300: 'FileSource', // Image source (3 == DSC) + 0xA301: 'SceneType', // Scene type (1 == directly photographed) + 0xA302: 'CFAPattern', // Color filter array geometric pattern + 0xA401: 'CustomRendered', // Special processing + 0xA402: 'ExposureMode', // Exposure mode + 0xA403: 'WhiteBalance', // 1 = auto white balance, 2 = manual + 0xA404: 'DigitalZoomRatio', // Digital zoom ratio + 0xA405: 'FocalLengthIn35mmFilm', + 0xA406: 'SceneCaptureType', // Type of scene + 0xA407: 'GainControl', // Degree of overall image gain adjustment + 0xA408: 'Contrast', // Direction of contrast processing applied by camera + 0xA409: 'Saturation', // Direction of saturation processing applied by camera + 0xA40A: 'Sharpness', // Direction of sharpness processing applied by camera + 0xA40B: 'DeviceSettingDescription', + 0xA40C: 'SubjectDistanceRange', // Distance to subject + 0xA420: 'ImageUniqueID', // Identifier assigned uniquely to each image + 0xA430: 'CameraOwnerName', + 0xA431: 'BodySerialNumber', + 0xA432: 'LensSpecification', + 0xA433: 'LensMake', + 0xA434: 'LensModel', + 0xA435: 'LensSerialNumber', + // ============== + // GPS Info tags: + // ============== + 0x0000: 'GPSVersionID', + 0x0001: 'GPSLatitudeRef', + 0x0002: 'GPSLatitude', + 0x0003: 'GPSLongitudeRef', + 0x0004: 'GPSLongitude', + 0x0005: 'GPSAltitudeRef', + 0x0006: 'GPSAltitude', + 0x0007: 'GPSTimeStamp', + 0x0008: 'GPSSatellites', + 0x0009: 'GPSStatus', + 0x000A: 'GPSMeasureMode', + 0x000B: 'GPSDOP', + 0x000C: 'GPSSpeedRef', + 0x000D: 'GPSSpeed', + 0x000E: 'GPSTrackRef', + 0x000F: 'GPSTrack', + 0x0010: 'GPSImgDirectionRef', + 0x0011: 'GPSImgDirection', + 0x0012: 'GPSMapDatum', + 0x0013: 'GPSDestLatitudeRef', + 0x0014: 'GPSDestLatitude', + 0x0015: 'GPSDestLongitudeRef', + 0x0016: 'GPSDestLongitude', + 0x0017: 'GPSDestBearingRef', + 0x0018: 'GPSDestBearing', + 0x0019: 'GPSDestDistanceRef', + 0x001A: 'GPSDestDistance', + 0x001B: 'GPSProcessingMethod', + 0x001C: 'GPSAreaInformation', + 0x001D: 'GPSDateStamp', + 0x001E: 'GPSDifferential', + 0x001F: 'GPSHPositioningError' + } + + loadImage.ExifMap.prototype.stringValues = { + ExposureProgram: { + 0: 'Undefined', + 1: 'Manual', + 2: 'Normal program', + 3: 'Aperture priority', + 4: 'Shutter priority', + 5: 'Creative program', + 6: 'Action program', + 7: 'Portrait mode', + 8: 'Landscape mode' + }, + MeteringMode: { + 0: 'Unknown', + 1: 'Average', + 2: 'CenterWeightedAverage', + 3: 'Spot', + 4: 'MultiSpot', + 5: 'Pattern', + 6: 'Partial', + 255: 'Other' + }, + LightSource: { + 0: 'Unknown', + 1: 'Daylight', + 2: 'Fluorescent', + 3: 'Tungsten (incandescent light)', + 4: 'Flash', + 9: 'Fine weather', + 10: 'Cloudy weather', + 11: 'Shade', + 12: 'Daylight fluorescent (D 5700 - 7100K)', + 13: 'Day white fluorescent (N 4600 - 5400K)', + 14: 'Cool white fluorescent (W 3900 - 4500K)', + 15: 'White fluorescent (WW 3200 - 3700K)', + 17: 'Standard light A', + 18: 'Standard light B', + 19: 'Standard light C', + 20: 'D55', + 21: 'D65', + 22: 'D75', + 23: 'D50', + 24: 'ISO studio tungsten', + 255: 'Other' + }, + Flash: { + 0x0000: 'Flash did not fire', + 0x0001: 'Flash fired', + 0x0005: 'Strobe return light not detected', + 0x0007: 'Strobe return light detected', + 0x0009: 'Flash fired, compulsory flash mode', + 0x000D: 'Flash fired, compulsory flash mode, return light not detected', + 0x000F: 'Flash fired, compulsory flash mode, return light detected', + 0x0010: 'Flash did not fire, compulsory flash mode', + 0x0018: 'Flash did not fire, auto mode', + 0x0019: 'Flash fired, auto mode', + 0x001D: 'Flash fired, auto mode, return light not detected', + 0x001F: 'Flash fired, auto mode, return light detected', + 0x0020: 'No flash function', + 0x0041: 'Flash fired, red-eye reduction mode', + 0x0045: 'Flash fired, red-eye reduction mode, return light not detected', + 0x0047: 'Flash fired, red-eye reduction mode, return light detected', + 0x0049: 'Flash fired, compulsory flash mode, red-eye reduction mode', + 0x004D: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected', + 0x004F: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected', + 0x0059: 'Flash fired, auto mode, red-eye reduction mode', + 0x005D: 'Flash fired, auto mode, return light not detected, red-eye reduction mode', + 0x005F: 'Flash fired, auto mode, return light detected, red-eye reduction mode' + }, + SensingMethod: { + 1: 'Undefined', + 2: 'One-chip color area sensor', + 3: 'Two-chip color area sensor', + 4: 'Three-chip color area sensor', + 5: 'Color sequential area sensor', + 7: 'Trilinear sensor', + 8: 'Color sequential linear sensor' + }, + SceneCaptureType: { + 0: 'Standard', + 1: 'Landscape', + 2: 'Portrait', + 3: 'Night scene' + }, + SceneType: { + 1: 'Directly photographed' + }, + CustomRendered: { + 0: 'Normal process', + 1: 'Custom process' + }, + WhiteBalance: { + 0: 'Auto white balance', + 1: 'Manual white balance' + }, + GainControl: { + 0: 'None', + 1: 'Low gain up', + 2: 'High gain up', + 3: 'Low gain down', + 4: 'High gain down' + }, + Contrast: { + 0: 'Normal', + 1: 'Soft', + 2: 'Hard' + }, + Saturation: { + 0: 'Normal', + 1: 'Low saturation', + 2: 'High saturation' + }, + Sharpness: { + 0: 'Normal', + 1: 'Soft', + 2: 'Hard' + }, + SubjectDistanceRange: { + 0: 'Unknown', + 1: 'Macro', + 2: 'Close view', + 3: 'Distant view' + }, + FileSource: { + 3: 'DSC' + }, + ComponentsConfiguration: { + 0: '', + 1: 'Y', + 2: 'Cb', + 3: 'Cr', + 4: 'R', + 5: 'G', + 6: 'B' + }, + Orientation: { + 1: 'top-left', + 2: 'top-right', + 3: 'bottom-right', + 4: 'bottom-left', + 5: 'left-top', + 6: 'right-top', + 7: 'right-bottom', + 8: 'left-bottom' + } + } + + loadImage.ExifMap.prototype.getText = function (id) { + var value = this.get(id) + switch (id) { + case 'LightSource': + case 'Flash': + case 'MeteringMode': + case 'ExposureProgram': + case 'SensingMethod': + case 'SceneCaptureType': + case 'SceneType': + case 'CustomRendered': + case 'WhiteBalance': + case 'GainControl': + case 'Contrast': + case 'Saturation': + case 'Sharpness': + case 'SubjectDistanceRange': + case 'FileSource': + case 'Orientation': + return this.stringValues[id][value] + case 'ExifVersion': + case 'FlashpixVersion': + if (!value) return + return String.fromCharCode(value[0], value[1], value[2], value[3]) + case 'ComponentsConfiguration': + if (!value) return + return this.stringValues[id][value[0]] + + this.stringValues[id][value[1]] + + this.stringValues[id][value[2]] + + this.stringValues[id][value[3]] + case 'GPSVersionID': + if (!value) return + return value[0] + '.' + value[1] + '.' + value[2] + '.' + value[3] + } + return String(value) + } + + ;(function (exifMapPrototype) { + var tags = exifMapPrototype.tags + var map = exifMapPrototype.map + var prop + // Map the tag names to tags: + for (prop in tags) { + if (tags.hasOwnProperty(prop)) { + map[tags[prop]] = prop + } + } + }(loadImage.ExifMap.prototype)) + + loadImage.ExifMap.prototype.getAll = function () { + var map = {} + var prop + var id + for (prop in this) { + if (this.hasOwnProperty(prop)) { + id = this.tags[prop] + if (id) { + map[id] = this.getText(id) + } + } + } + return map + } +})) diff --git a/bower_components/blueimp-load-image/js/load-image-exif.js b/bower_components/blueimp-load-image/js/load-image-exif.js new file mode 100644 index 0000000000..bb7fe3798c --- /dev/null +++ b/bower_components/blueimp-load-image/js/load-image-exif.js @@ -0,0 +1,300 @@ +/* + * JavaScript Load Image Exif Parser + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['./load-image', './load-image-meta'], factory) + } else if (typeof module === 'object' && module.exports) { + factory(require('./load-image'), require('./load-image-meta')) + } else { + // Browser globals: + factory(window.loadImage) + } +}(function (loadImage) { + 'use strict' + + loadImage.ExifMap = function () { + return this + } + + loadImage.ExifMap.prototype.map = { + 'Orientation': 0x0112 + } + + loadImage.ExifMap.prototype.get = function (id) { + return this[id] || this[this.map[id]] + } + + loadImage.getExifThumbnail = function (dataView, offset, length) { + var hexData, + i, + b + if (!length || offset + length > dataView.byteLength) { + console.log('Invalid Exif data: Invalid thumbnail data.') + return + } + hexData = [] + for (i = 0; i < length; i += 1) { + b = dataView.getUint8(offset + i) + hexData.push((b < 16 ? '0' : '') + b.toString(16)) + } + return 'data:image/jpeg,%' + hexData.join('%') + } + + loadImage.exifTagTypes = { + // byte, 8-bit unsigned int: + 1: { + getValue: function (dataView, dataOffset) { + return dataView.getUint8(dataOffset) + }, + size: 1 + }, + // ascii, 8-bit byte: + 2: { + getValue: function (dataView, dataOffset) { + return String.fromCharCode(dataView.getUint8(dataOffset)) + }, + size: 1, + ascii: true + }, + // short, 16 bit int: + 3: { + getValue: function (dataView, dataOffset, littleEndian) { + return dataView.getUint16(dataOffset, littleEndian) + }, + size: 2 + }, + // long, 32 bit int: + 4: { + getValue: function (dataView, dataOffset, littleEndian) { + return dataView.getUint32(dataOffset, littleEndian) + }, + size: 4 + }, + // rational = two long values, first is numerator, second is denominator: + 5: { + getValue: function (dataView, dataOffset, littleEndian) { + return dataView.getUint32(dataOffset, littleEndian) / + dataView.getUint32(dataOffset + 4, littleEndian) + }, + size: 8 + }, + // slong, 32 bit signed int: + 9: { + getValue: function (dataView, dataOffset, littleEndian) { + return dataView.getInt32(dataOffset, littleEndian) + }, + size: 4 + }, + // srational, two slongs, first is numerator, second is denominator: + 10: { + getValue: function (dataView, dataOffset, littleEndian) { + return dataView.getInt32(dataOffset, littleEndian) / + dataView.getInt32(dataOffset + 4, littleEndian) + }, + size: 8 + } + } + // undefined, 8-bit byte, value depending on field: + loadImage.exifTagTypes[7] = loadImage.exifTagTypes[1] + + loadImage.getExifValue = function (dataView, tiffOffset, offset, type, length, littleEndian) { + var tagType = loadImage.exifTagTypes[type] + var tagSize + var dataOffset + var values + var i + var str + var c + if (!tagType) { + console.log('Invalid Exif data: Invalid tag type.') + return + } + tagSize = tagType.size * length + // Determine if the value is contained in the dataOffset bytes, + // or if the value at the dataOffset is a pointer to the actual data: + dataOffset = tagSize > 4 + ? tiffOffset + dataView.getUint32(offset + 8, littleEndian) + : (offset + 8) + if (dataOffset + tagSize > dataView.byteLength) { + console.log('Invalid Exif data: Invalid data offset.') + return + } + if (length === 1) { + return tagType.getValue(dataView, dataOffset, littleEndian) + } + values = [] + for (i = 0; i < length; i += 1) { + values[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian) + } + if (tagType.ascii) { + str = '' + // Concatenate the chars: + for (i = 0; i < values.length; i += 1) { + c = values[i] + // Ignore the terminating NULL byte(s): + if (c === '\u0000') { + break + } + str += c + } + return str + } + return values + } + + loadImage.parseExifTag = function (dataView, tiffOffset, offset, littleEndian, data) { + var tag = dataView.getUint16(offset, littleEndian) + data.exif[tag] = loadImage.getExifValue( + dataView, + tiffOffset, + offset, + dataView.getUint16(offset + 2, littleEndian), // tag type + dataView.getUint32(offset + 4, littleEndian), // tag length + littleEndian + ) + } + + loadImage.parseExifTags = function (dataView, tiffOffset, dirOffset, littleEndian, data) { + var tagsNumber, + dirEndOffset, + i + if (dirOffset + 6 > dataView.byteLength) { + console.log('Invalid Exif data: Invalid directory offset.') + return + } + tagsNumber = dataView.getUint16(dirOffset, littleEndian) + dirEndOffset = dirOffset + 2 + 12 * tagsNumber + if (dirEndOffset + 4 > dataView.byteLength) { + console.log('Invalid Exif data: Invalid directory size.') + return + } + for (i = 0; i < tagsNumber; i += 1) { + this.parseExifTag( + dataView, + tiffOffset, + dirOffset + 2 + 12 * i, // tag offset + littleEndian, + data + ) + } + // Return the offset to the next directory: + return dataView.getUint32(dirEndOffset, littleEndian) + } + + loadImage.parseExifData = function (dataView, offset, length, data, options) { + if (options.disableExif) { + return + } + var tiffOffset = offset + 10 + var littleEndian + var dirOffset + var thumbnailData + // Check for the ASCII code for "Exif" (0x45786966): + if (dataView.getUint32(offset + 4) !== 0x45786966) { + // No Exif data, might be XMP data instead + return + } + if (tiffOffset + 8 > dataView.byteLength) { + console.log('Invalid Exif data: Invalid segment size.') + return + } + // Check for the two null bytes: + if (dataView.getUint16(offset + 8) !== 0x0000) { + console.log('Invalid Exif data: Missing byte alignment offset.') + return + } + // Check the byte alignment: + switch (dataView.getUint16(tiffOffset)) { + case 0x4949: + littleEndian = true + break + case 0x4D4D: + littleEndian = false + break + default: + console.log('Invalid Exif data: Invalid byte alignment marker.') + return + } + // Check for the TIFF tag marker (0x002A): + if (dataView.getUint16(tiffOffset + 2, littleEndian) !== 0x002A) { + console.log('Invalid Exif data: Missing TIFF marker.') + return + } + // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal: + dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian) + // Create the exif object to store the tags: + data.exif = new loadImage.ExifMap() + // Parse the tags of the main image directory and retrieve the + // offset to the next directory, usually the thumbnail directory: + dirOffset = loadImage.parseExifTags( + dataView, + tiffOffset, + tiffOffset + dirOffset, + littleEndian, + data + ) + if (dirOffset && !options.disableExifThumbnail) { + thumbnailData = {exif: {}} + dirOffset = loadImage.parseExifTags( + dataView, + tiffOffset, + tiffOffset + dirOffset, + littleEndian, + thumbnailData + ) + // Check for JPEG Thumbnail offset: + if (thumbnailData.exif[0x0201]) { + data.exif.Thumbnail = loadImage.getExifThumbnail( + dataView, + tiffOffset + thumbnailData.exif[0x0201], + thumbnailData.exif[0x0202] // Thumbnail data length + ) + } + } + // Check for Exif Sub IFD Pointer: + if (data.exif[0x8769] && !options.disableExifSub) { + loadImage.parseExifTags( + dataView, + tiffOffset, + tiffOffset + data.exif[0x8769], // directory offset + littleEndian, + data + ) + } + // Check for GPS Info IFD Pointer: + if (data.exif[0x8825] && !options.disableExifGps) { + loadImage.parseExifTags( + dataView, + tiffOffset, + tiffOffset + data.exif[0x8825], // directory offset + littleEndian, + data + ) + } + } + + // Registers the Exif parser for the APP1 JPEG meta data segment: + loadImage.metaDataParsers.jpeg[0xffe1].push(loadImage.parseExifData) + + // Adds the following properties to the parseMetaData callback data: + // * exif: The exif tags, parsed by the parseExifData method + + // Adds the following options to the parseMetaData method: + // * disableExif: Disables Exif parsing. + // * disableExifThumbnail: Disables parsing of the Exif Thumbnail. + // * disableExifSub: Disables parsing of the Exif Sub IFD. + // * disableExifGps: Disables parsing of the Exif GPS Info IFD. +})) diff --git a/bower_components/blueimp-load-image/js/load-image-meta.js b/bower_components/blueimp-load-image/js/load-image-meta.js new file mode 100644 index 0000000000..0f668c1a64 --- /dev/null +++ b/bower_components/blueimp-load-image/js/load-image-meta.js @@ -0,0 +1,159 @@ +/* + * JavaScript Load Image Meta + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Image meta data handling implementation + * based on the help and contribution of + * Achim Stöhr. + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, Blob */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['./load-image'], factory) + } else if (typeof module === 'object' && module.exports) { + factory(require('./load-image')) + } else { + // Browser globals: + factory(window.loadImage) + } +}(function (loadImage) { + 'use strict' + + var hasblobSlice = window.Blob && (Blob.prototype.slice || + Blob.prototype.webkitSlice || Blob.prototype.mozSlice) + + loadImage.blobSlice = hasblobSlice && function () { + var slice = this.slice || this.webkitSlice || this.mozSlice + return slice.apply(this, arguments) + } + + loadImage.metaDataParsers = { + jpeg: { + 0xffe1: [] // APP1 marker + } + } + + // Parses image meta data and calls the callback with an object argument + // with the following properties: + // * imageHead: The complete image head as ArrayBuffer (Uint8Array for IE10) + // The options arguments accepts an object and supports the following properties: + // * maxMetaDataSize: Defines the maximum number of bytes to parse. + // * disableImageHead: Disables creating the imageHead property. + loadImage.parseMetaData = function (file, callback, options, data) { + options = options || {} + data = data || {} + var that = this + // 256 KiB should contain all EXIF/ICC/IPTC segments: + var maxMetaDataSize = options.maxMetaDataSize || 262144 + var noMetaData = !(window.DataView && file && file.size >= 12 && + file.type === 'image/jpeg' && loadImage.blobSlice) + if (noMetaData || !loadImage.readFile( + loadImage.blobSlice.call(file, 0, maxMetaDataSize), + function (e) { + if (e.target.error) { + // FileReader error + console.log(e.target.error) + callback(data) + return + } + // Note on endianness: + // Since the marker and length bytes in JPEG files are always + // stored in big endian order, we can leave the endian parameter + // of the DataView methods undefined, defaulting to big endian. + var buffer = e.target.result + var dataView = new DataView(buffer) + var offset = 2 + var maxOffset = dataView.byteLength - 4 + var headLength = offset + var markerBytes + var markerLength + var parsers + var i + // Check for the JPEG marker (0xffd8): + if (dataView.getUint16(0) === 0xffd8) { + while (offset < maxOffset) { + markerBytes = dataView.getUint16(offset) + // Search for APPn (0xffeN) and COM (0xfffe) markers, + // which contain application-specific meta-data like + // Exif, ICC and IPTC data and text comments: + if ((markerBytes >= 0xffe0 && markerBytes <= 0xffef) || + markerBytes === 0xfffe) { + // The marker bytes (2) are always followed by + // the length bytes (2), indicating the length of the + // marker segment, which includes the length bytes, + // but not the marker bytes, so we add 2: + markerLength = dataView.getUint16(offset + 2) + 2 + if (offset + markerLength > dataView.byteLength) { + console.log('Invalid meta data: Invalid segment size.') + break + } + parsers = loadImage.metaDataParsers.jpeg[markerBytes] + if (parsers) { + for (i = 0; i < parsers.length; i += 1) { + parsers[i].call( + that, + dataView, + offset, + markerLength, + data, + options + ) + } + } + offset += markerLength + headLength = offset + } else { + // Not an APPn or COM marker, probably safe to + // assume that this is the end of the meta data + break + } + } + // Meta length must be longer than JPEG marker (2) + // plus APPn marker (2), followed by length bytes (2): + if (!options.disableImageHead && headLength > 6) { + if (buffer.slice) { + data.imageHead = buffer.slice(0, headLength) + } else { + // Workaround for IE10, which does not yet + // support ArrayBuffer.slice: + data.imageHead = new Uint8Array(buffer) + .subarray(0, headLength) + } + } + } else { + console.log('Invalid JPEG file: Missing JPEG marker.') + } + callback(data) + }, + 'readAsArrayBuffer' + )) { + callback(data) + } + } + + // Determines if meta data should be loaded automatically: + loadImage.hasMetaOption = function (options) { + return options.meta + } + + var originalTransform = loadImage.transform + loadImage.transform = function (img, options, callback, file, data) { + if (loadImage.hasMetaOption(options || {})) { + loadImage.parseMetaData(file, function (data) { + originalTransform.call(loadImage, img, options, callback, file, data) + }, options, data) + } else { + originalTransform.apply(loadImage, arguments) + } + } +})) diff --git a/bower_components/blueimp-load-image/js/load-image-orientation.js b/bower_components/blueimp-load-image/js/load-image-orientation.js new file mode 100644 index 0000000000..b40c499ee5 --- /dev/null +++ b/bower_components/blueimp-load-image/js/load-image-orientation.js @@ -0,0 +1,181 @@ +/* + * JavaScript Load Image Orientation + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['./load-image'], factory) + } else if (typeof module === 'object' && module.exports) { + factory(require('./load-image')) + } else { + // Browser globals: + factory(window.loadImage) + } +}(function (loadImage) { + 'use strict' + + var originalHasCanvasOption = loadImage.hasCanvasOption + var originalHasMetaOption = loadImage.hasMetaOption + var originalTransformCoordinates = loadImage.transformCoordinates + var originalGetTransformedOptions = loadImage.getTransformedOptions + + // Determines if the target image should be a canvas element: + loadImage.hasCanvasOption = function (options) { + return !!options.orientation || + originalHasCanvasOption.call(loadImage, options) + } + + // Determines if meta data should be loaded automatically: + loadImage.hasMetaOption = function (options) { + return options.orientation === true || + originalHasMetaOption.call(loadImage, options) + } + + // Transform image orientation based on + // the given EXIF orientation option: + loadImage.transformCoordinates = function (canvas, options) { + originalTransformCoordinates.call(loadImage, canvas, options) + var ctx = canvas.getContext('2d') + var width = canvas.width + var height = canvas.height + var styleWidth = canvas.style.width + var styleHeight = canvas.style.height + var orientation = options.orientation + if (!orientation || orientation > 8) { + return + } + if (orientation > 4) { + canvas.width = height + canvas.height = width + canvas.style.width = styleHeight + canvas.style.height = styleWidth + } + switch (orientation) { + case 2: + // horizontal flip + ctx.translate(width, 0) + ctx.scale(-1, 1) + break + case 3: + // 180° rotate left + ctx.translate(width, height) + ctx.rotate(Math.PI) + break + case 4: + // vertical flip + ctx.translate(0, height) + ctx.scale(1, -1) + break + case 5: + // vertical flip + 90 rotate right + ctx.rotate(0.5 * Math.PI) + ctx.scale(1, -1) + break + case 6: + // 90° rotate right + ctx.rotate(0.5 * Math.PI) + ctx.translate(0, -height) + break + case 7: + // horizontal flip + 90 rotate right + ctx.rotate(0.5 * Math.PI) + ctx.translate(width, -height) + ctx.scale(-1, 1) + break + case 8: + // 90° rotate left + ctx.rotate(-0.5 * Math.PI) + ctx.translate(-width, 0) + break + } + } + + // Transforms coordinate and dimension options + // based on the given orientation option: + loadImage.getTransformedOptions = function (img, opts, data) { + var options = originalGetTransformedOptions.call(loadImage, img, opts) + var orientation = options.orientation + var newOptions + var i + if (orientation === true && data && data.exif) { + orientation = data.exif.get('Orientation') + } + if (!orientation || orientation > 8 || orientation === 1) { + return options + } + newOptions = {} + for (i in options) { + if (options.hasOwnProperty(i)) { + newOptions[i] = options[i] + } + } + newOptions.orientation = orientation + switch (orientation) { + case 2: + // horizontal flip + newOptions.left = options.right + newOptions.right = options.left + break + case 3: + // 180° rotate left + newOptions.left = options.right + newOptions.top = options.bottom + newOptions.right = options.left + newOptions.bottom = options.top + break + case 4: + // vertical flip + newOptions.top = options.bottom + newOptions.bottom = options.top + break + case 5: + // vertical flip + 90 rotate right + newOptions.left = options.top + newOptions.top = options.left + newOptions.right = options.bottom + newOptions.bottom = options.right + break + case 6: + // 90° rotate right + newOptions.left = options.top + newOptions.top = options.right + newOptions.right = options.bottom + newOptions.bottom = options.left + break + case 7: + // horizontal flip + 90 rotate right + newOptions.left = options.bottom + newOptions.top = options.right + newOptions.right = options.top + newOptions.bottom = options.left + break + case 8: + // 90° rotate left + newOptions.left = options.bottom + newOptions.top = options.left + newOptions.right = options.top + newOptions.bottom = options.right + break + } + if (newOptions.orientation > 4) { + newOptions.maxWidth = options.maxHeight + newOptions.maxHeight = options.maxWidth + newOptions.minWidth = options.minHeight + newOptions.minHeight = options.minWidth + newOptions.sourceWidth = options.sourceHeight + newOptions.sourceHeight = options.sourceWidth + } + return newOptions + } +})) diff --git a/bower_components/blueimp-load-image/js/load-image.all.min.js b/bower_components/blueimp-load-image/js/load-image.all.min.js new file mode 100644 index 0000000000..b694ca7382 --- /dev/null +++ b/bower_components/blueimp-load-image/js/load-image.all.min.js @@ -0,0 +1,2 @@ +!function(e){"use strict";function t(e,i,a){var o,r=document.createElement("img");if(r.onerror=function(o){return t.onerror(r,o,e,i,a)},r.onload=function(o){return t.onload(r,o,e,i,a)},t.isInstanceOf("Blob",e)||t.isInstanceOf("File",e))o=r._objectURL=t.createObjectURL(e);else{if("string"!=typeof e)return!1;o=e,a&&a.crossOrigin&&(r.crossOrigin=a.crossOrigin)}return o?(r.src=o,r):t.readFile(e,function(e){var t=e.target;t&&t.result?r.src=t.result:i&&i(e)})}function i(e,i){!e._objectURL||i&&i.noRevoke||(t.revokeObjectURL(e._objectURL),delete e._objectURL)}var a=window.createObjectURL&&window||window.URL&&URL.revokeObjectURL&&URL||window.webkitURL&&webkitURL;t.isInstanceOf=function(e,t){return Object.prototype.toString.call(t)==="[object "+e+"]"},t.transform=function(e,i,a,o,r){a(t.scale(e,i,r),r)},t.onerror=function(e,t,a,o,r){i(e,r),o&&o.call(e,t)},t.onload=function(e,a,o,r,n){i(e,n),r&&t.transform(e,n,r,o,{})},t.transformCoordinates=function(){},t.getTransformedOptions=function(e,t){var i,a,o,r,n=t.aspectRatio;if(!n)return t;i={};for(a in t)t.hasOwnProperty(a)&&(i[a]=t[a]);return i.crop=!0,o=e.naturalWidth||e.width,r=e.naturalHeight||e.height,o/r>n?(i.maxWidth=r*n,i.maxHeight=r):(i.maxWidth=o,i.maxHeight=o/n),i},t.renderImageToCanvas=function(e,t,i,a,o,r,n,s,l,d){return e.getContext("2d").drawImage(t,i,a,o,r,n,s,l,d),e},t.hasCanvasOption=function(e){return e.canvas||e.crop||!!e.aspectRatio},t.scale=function(e,i,a){function o(){var e=Math.max((l||v)/v,(d||P)/P);e>1&&(v*=e,P*=e)}function r(){var e=Math.min((n||v)/v,(s||P)/P);e<1&&(v*=e,P*=e)}i=i||{};var n,s,l,d,u,c,f,g,h,m,p,S=document.createElement("canvas"),b=e.getContext||t.hasCanvasOption(i)&&S.getContext,x=e.naturalWidth||e.width,y=e.naturalHeight||e.height,v=x,P=y;if(b&&(i=t.getTransformedOptions(e,i,a),f=i.left||0,g=i.top||0,i.sourceWidth?(u=i.sourceWidth,void 0!==i.right&&void 0===i.left&&(f=x-u-i.right)):u=x-f-(i.right||0),i.sourceHeight?(c=i.sourceHeight,void 0!==i.bottom&&void 0===i.top&&(g=y-c-i.bottom)):c=y-g-(i.bottom||0),v=u,P=c),n=i.maxWidth,s=i.maxHeight,l=i.minWidth,d=i.minHeight,b&&n&&s&&i.crop?(v=n,P=s,p=u/c-n/s,p<0?(c=s*u/n,void 0===i.top&&void 0===i.bottom&&(g=(y-c)/2)):p>0&&(u=n*c/s,void 0===i.left&&void 0===i.right&&(f=(x-u)/2))):((i.contain||i.cover)&&(l=n=n||l,d=s=s||d),i.cover?(r(),o()):(o(),r())),b){if(h=i.pixelRatio,h>1&&(S.style.width=v+"px",S.style.height=P+"px",v*=h,P*=h,S.getContext("2d").scale(h,h)),m=i.downsamplingRatio,m>0&&m<1&&vv;)S.width=u*m,S.height=c*m,t.renderImageToCanvas(S,e,f,g,u,c,0,0,S.width,S.height),u=S.width,c=S.height,e=document.createElement("canvas"),e.width=u,e.height=c,t.renderImageToCanvas(e,S,0,0,u,c,0,0,u,c);return S.width=v,S.height=P,t.transformCoordinates(S,i),t.renderImageToCanvas(S,e,f,g,u,c,0,0,v,P)}return e.width=v,e.height=P,e},t.createObjectURL=function(e){return!!a&&a.createObjectURL(e)},t.revokeObjectURL=function(e){return!!a&&a.revokeObjectURL(e)},t.readFile=function(e,t,i){if(window.FileReader){var a=new FileReader;if(a.onload=a.onerror=t,i=i||"readAsDataURL",a[i])return a[i](e),a}return!1},"function"==typeof define&&define.amd?define(function(){return t}):"object"==typeof module&&module.exports?module.exports=t:e.loadImage=t}(window),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image"],e):e("object"==typeof module&&module.exports?require("./load-image"):window.loadImage)}(function(e){"use strict";var t=window.Blob&&(Blob.prototype.slice||Blob.prototype.webkitSlice||Blob.prototype.mozSlice);e.blobSlice=t&&function(){var e=this.slice||this.webkitSlice||this.mozSlice;return e.apply(this,arguments)},e.metaDataParsers={jpeg:{65505:[]}},e.parseMetaData=function(t,i,a,o){a=a||{},o=o||{};var r=this,n=a.maxMetaDataSize||262144,s=!(window.DataView&&t&&t.size>=12&&"image/jpeg"===t.type&&e.blobSlice);!s&&e.readFile(e.blobSlice.call(t,0,n),function(t){if(t.target.error)return console.log(t.target.error),void i(o);var n,s,l,d,u=t.target.result,c=new DataView(u),f=2,g=c.byteLength-4,h=f;if(65496===c.getUint16(0)){for(;f=65504&&n<=65519||65534===n);){if(s=c.getUint16(f+2)+2,f+s>c.byteLength){console.log("Invalid meta data: Invalid segment size.");break}if(l=e.metaDataParsers.jpeg[n])for(d=0;d6&&(u.slice?o.imageHead=u.slice(0,h):o.imageHead=new Uint8Array(u).subarray(0,h))}else console.log("Invalid JPEG file: Missing JPEG marker.");i(o)},"readAsArrayBuffer")||i(o)},e.hasMetaOption=function(e){return e.meta};var i=e.transform;e.transform=function(t,a,o,r,n){e.hasMetaOption(a||{})?e.parseMetaData(r,function(n){i.call(e,t,a,o,r,n)},a,n):i.apply(e,arguments)}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-meta"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-meta")):e(window.loadImage)}(function(e){"use strict";e.ExifMap=function(){return this},e.ExifMap.prototype.map={Orientation:274},e.ExifMap.prototype.get=function(e){return this[e]||this[this.map[e]]},e.getExifThumbnail=function(e,t,i){var a,o,r;if(!i||t+i>e.byteLength)return void console.log("Invalid Exif data: Invalid thumbnail data.");for(a=[],o=0;o4?i+t.getUint32(a+8,n):a+8,l+s>t.byteLength)return void console.log("Invalid Exif data: Invalid data offset.");if(1===r)return g.getValue(t,l,n);for(d=[],u=0;ue.byteLength)return void console.log("Invalid Exif data: Invalid directory offset.");if(r=e.getUint16(i,a),n=i+2+12*r,n+4>e.byteLength)return void console.log("Invalid Exif data: Invalid directory size.");for(s=0;st.byteLength)return void console.log("Invalid Exif data: Invalid segment size.");if(0!==t.getUint16(i+8))return void console.log("Invalid Exif data: Missing byte alignment offset.");switch(t.getUint16(d)){case 18761:n=!0;break;case 19789:n=!1;break;default:return void console.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==t.getUint16(d+2,n))return void console.log("Invalid Exif data: Missing TIFF marker.");s=t.getUint32(d+4,n),o.exif=new e.ExifMap,s=e.parseExifTags(t,d,d+s,n,o),s&&!r.disableExifThumbnail&&(l={exif:{}},s=e.parseExifTags(t,d,d+s,n,l),l.exif[513]&&(o.exif.Thumbnail=e.getExifThumbnail(t,d+l.exif[513],l.exif[514]))),o.exif[34665]&&!r.disableExifSub&&e.parseExifTags(t,d,d+o.exif[34665],n,o),o.exif[34853]&&!r.disableExifGps&&e.parseExifTags(t,d,d+o.exif[34853],n,o)}}},e.metaDataParsers.jpeg[65505].push(e.parseExifData)}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-exif"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-exif")):e(window.loadImage)}(function(e){"use strict";e.ExifMap.prototype.tags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",272:"Model",305:"Software",315:"Artist",33432:"Copyright",36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",42240:"Gamma",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubSecTime",37521:"SubSecTimeOriginal",37522:"SubSecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"PhotographicSensitivity",34856:"OECF",34864:"SensitivityType",34865:"StandardOutputSensitivity",34866:"RecommendedExposureIndex",34867:"ISOSpeed",34868:"ISOSpeedLatitudeyyy",34869:"ISOSpeedLatitudezzz",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRatio",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",42016:"ImageUniqueID",42032:"CameraOwnerName",42033:"BodySerialNumber",42034:"LensSpecification",42035:"LensMake",42036:"LensModel",42037:"LensSerialNumber",0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential",31:"GPSHPositioningError"},e.ExifMap.prototype.stringValues={ExposureProgram:{0:"Undefined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},SensingMethod:{1:"Undefined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{0:"Normal process",1:"Custom process"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},GainControl:{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{0:"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},ComponentsConfiguration:{0:"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"},Orientation:{1:"top-left",2:"top-right",3:"bottom-right",4:"bottom-left",5:"left-top",6:"right-top",7:"right-bottom",8:"left-bottom"}},e.ExifMap.prototype.getText=function(e){var t=this.get(e);switch(e){case"LightSource":case"Flash":case"MeteringMode":case"ExposureProgram":case"SensingMethod":case"SceneCaptureType":case"SceneType":case"CustomRendered":case"WhiteBalance":case"GainControl":case"Contrast":case"Saturation":case"Sharpness":case"SubjectDistanceRange":case"FileSource":case"Orientation":return this.stringValues[e][t];case"ExifVersion":case"FlashpixVersion":if(!t)return;return String.fromCharCode(t[0],t[1],t[2],t[3]);case"ComponentsConfiguration":if(!t)return;return this.stringValues[e][t[0]]+this.stringValues[e][t[1]]+this.stringValues[e][t[2]]+this.stringValues[e][t[3]];case"GPSVersionID":if(!t)return;return t[0]+"."+t[1]+"."+t[2]+"."+t[3]}return String(t)},function(e){var t,i=e.tags,a=e.map;for(t in i)i.hasOwnProperty(t)&&(a[i[t]]=t)}(e.ExifMap.prototype),e.ExifMap.prototype.getAll=function(){var e,t,i={};for(e in this)this.hasOwnProperty(e)&&(t=this.tags[e],t&&(i[t]=this.getText(t)));return i}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image"],e):e("object"==typeof module&&module.exports?require("./load-image"):window.loadImage)}(function(e){"use strict";var t=e.hasCanvasOption,i=e.hasMetaOption,a=e.transformCoordinates,o=e.getTransformedOptions;e.hasCanvasOption=function(i){return!!i.orientation||t.call(e,i)},e.hasMetaOption=function(t){return t.orientation===!0||i.call(e,t)},e.transformCoordinates=function(t,i){a.call(e,t,i);var o=t.getContext("2d"),r=t.width,n=t.height,s=t.style.width,l=t.style.height,d=i.orientation;if(d&&!(d>8))switch(d>4&&(t.width=n,t.height=r,t.style.width=l,t.style.height=s),d){case 2:o.translate(r,0),o.scale(-1,1);break;case 3:o.translate(r,n),o.rotate(Math.PI);break;case 4:o.translate(0,n),o.scale(1,-1);break;case 5:o.rotate(.5*Math.PI),o.scale(1,-1);break;case 6:o.rotate(.5*Math.PI),o.translate(0,-n);break;case 7:o.rotate(.5*Math.PI),o.translate(r,-n),o.scale(-1,1);break;case 8:o.rotate(-.5*Math.PI),o.translate(-r,0)}},e.getTransformedOptions=function(t,i,a){var r,n,s=o.call(e,t,i),l=s.orientation;if(l===!0&&a&&a.exif&&(l=a.exif.get("Orientation")),!l||l>8||1===l)return s;r={};for(n in s)s.hasOwnProperty(n)&&(r[n]=s[n]);switch(r.orientation=l,l){case 2:r.left=s.right,r.right=s.left;break;case 3:r.left=s.right,r.top=s.bottom,r.right=s.left,r.bottom=s.top;break;case 4:r.top=s.bottom,r.bottom=s.top;break;case 5:r.left=s.top,r.top=s.left,r.right=s.bottom,r.bottom=s.right;break;case 6:r.left=s.top,r.top=s.right,r.right=s.bottom,r.bottom=s.left;break;case 7:r.left=s.bottom,r.top=s.right,r.right=s.top,r.bottom=s.left;break;case 8:r.left=s.bottom,r.top=s.left,r.right=s.top,r.bottom=s.right}return r.orientation>4&&(r.maxWidth=s.maxHeight,r.maxHeight=s.maxWidth,r.minWidth=s.minHeight,r.minHeight=s.minWidth,r.sourceWidth=s.sourceHeight,r.sourceHeight=s.sourceWidth),r}}); +//# sourceMappingURL=load-image.all.min.js.map \ No newline at end of file diff --git a/bower_components/blueimp-load-image/js/load-image.all.min.js.map b/bower_components/blueimp-load-image/js/load-image.all.min.js.map new file mode 100644 index 0000000000..090cb5909b --- /dev/null +++ b/bower_components/blueimp-load-image/js/load-image.all.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["load-image.js","load-image-meta.js","load-image-exif.js","load-image-exif-map.js","load-image-orientation.js"],"names":["$","loadImage","file","callback","options","url","img","document","createElement","onerror","event","onload","isInstanceOf","_objectURL","createObjectURL","crossOrigin","src","readFile","e","target","result","revokeHelper","noRevoke","revokeObjectURL","urlAPI","window","URL","webkitURL","type","obj","Object","prototype","toString","call","transform","data","scale","transformCoordinates","getTransformedOptions","newOptions","i","width","height","aspectRatio","hasOwnProperty","crop","naturalWidth","naturalHeight","maxWidth","maxHeight","renderImageToCanvas","canvas","sourceX","sourceY","sourceWidth","sourceHeight","destX","destY","destWidth","destHeight","getContext","drawImage","hasCanvasOption","scaleUp","Math","max","minWidth","minHeight","scaleDown","min","pixelRatio","downsamplingRatio","tmp","useCanvas","left","top","undefined","right","bottom","contain","cover","style","method","FileReader","fileReader","define","amd","module","exports","factory","require","hasblobSlice","Blob","slice","webkitSlice","mozSlice","blobSlice","this","apply","arguments","metaDataParsers","jpeg","65505","parseMetaData","that","maxMetaDataSize","noMetaData","DataView","size","error","console","log","markerBytes","markerLength","parsers","buffer","dataView","offset","maxOffset","byteLength","headLength","getUint16","length","disableImageHead","imageHead","Uint8Array","subarray","hasMetaOption","meta","originalTransform","ExifMap","map","Orientation","get","id","getExifThumbnail","hexData","b","getUint8","push","join","exifTagTypes","1","getValue","dataOffset","2","String","fromCharCode","ascii","3","littleEndian","4","getUint32","5","9","getInt32","10","getExifValue","tiffOffset","tagSize","values","str","c","tagType","parseExifTag","tag","exif","parseExifTags","dirOffset","tagsNumber","dirEndOffset","parseExifData","disableExif","thumbnailData","disableExifThumbnail","Thumbnail","disableExifSub","disableExifGps","tags","256","257","34665","34853","40965","258","259","262","274","277","284","530","531","282","283","296","273","278","279","513","514","301","318","319","529","532","306","270","271","272","305","315","33432","36864","40960","40961","40962","40963","42240","37121","37122","37500","37510","40964","36867","36868","37520","37521","37522","33434","33437","34850","34852","34855","34856","34864","34865","34866","34867","34868","34869","37377","37378","37379","37380","37381","37382","37383","37384","37385","37396","37386","41483","41484","41486","41487","41488","41492","41493","41495","41728","41729","41730","41985","41986","41987","41988","41989","41990","41991","41992","41993","41994","41995","41996","42016","42032","42033","42034","42035","42036","42037","0","6","7","8","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","stringValues","ExposureProgram","MeteringMode","255","LightSource","Flash","32","65","69","71","73","77","79","89","93","95","SensingMethod","SceneCaptureType","SceneType","CustomRendered","WhiteBalance","GainControl","Contrast","Saturation","Sharpness","SubjectDistanceRange","FileSource","ComponentsConfiguration","getText","value","exifMapPrototype","prop","getAll","originalHasCanvasOption","originalHasMetaOption","originalTransformCoordinates","originalGetTransformedOptions","orientation","ctx","styleWidth","styleHeight","translate","rotate","PI","opts"],"mappings":"CAaE,SAAUA,GACV,YAKA,SAASC,GAAWC,EAAMC,EAAUC,GAClC,GACIC,GADAC,EAAMC,SAASC,cAAc,MAQjC,IANAF,EAAIG,QAAU,SAAUC,GACtB,MAAOT,GAAUQ,QAAQH,EAAKI,EAAOR,EAAMC,EAAUC,IAEvDE,EAAIK,OAAS,SAAUD,GACrB,MAAOT,GAAUU,OAAOL,EAAKI,EAAOR,EAAMC,EAAUC,IAElDH,EAAUW,aAAa,OAAQV,IAGjCD,EAAUW,aAAa,OAAQV,GAC/BG,EAAMC,EAAIO,WAAaZ,EAAUa,gBAAgBZ,OAC5C,CAAA,GAAoB,gBAATA,GAMhB,OAAO,CALPG,GAAMH,EACFE,GAAWA,EAAQW,cACrBT,EAAIS,YAAcX,EAAQW,aAK9B,MAAIV,IACFC,EAAIU,IAAMX,EACHC,GAEFL,EAAUgB,SAASf,EAAM,SAAUgB,GACxC,GAAIC,GAASD,EAAEC,MACXA,IAAUA,EAAOC,OACnBd,EAAIU,IAAMG,EAAOC,OACRjB,GACTA,EAASe,KAUf,QAASG,GAAcf,EAAKF,IACtBE,EAAIO,YAAgBT,GAAWA,EAAQkB,WACzCrB,EAAUsB,gBAAgBjB,EAAIO,kBACvBP,GAAIO,YAPf,GAAIW,GAAUC,OAAOX,iBAAmBW,QACzBA,OAAOC,KAAOA,IAAIH,iBAAmBG,KACrCD,OAAOE,WAAaA,SASnC1B,GAAUW,aAAe,SAAUgB,EAAMC,GAEvC,MAAOC,QAAOC,UAAUC,SAASC,KAAKJ,KAAS,WAAaD,EAAO,KAGrE3B,EAAUiC,UAAY,SAAU5B,EAAKF,EAASD,EAAUD,EAAMiC,GAC5DhC,EAASF,EAAUmC,MAAM9B,EAAKF,EAAS+B,GAAOA,IAGhDlC,EAAUQ,QAAU,SAAUH,EAAKI,EAAOR,EAAMC,EAAUC,GACxDiB,EAAaf,EAAKF,GACdD,GACFA,EAAS8B,KAAK3B,EAAKI,IAIvBT,EAAUU,OAAS,SAAUL,EAAKI,EAAOR,EAAMC,EAAUC,GACvDiB,EAAaf,EAAKF,GACdD,GACFF,EAAUiC,UAAU5B,EAAKF,EAASD,EAAUD,OAOhDD,EAAUoC,qBAAuB,aAOjCpC,EAAUqC,sBAAwB,SAAUhC,EAAKF,GAC/C,GACImC,GACAC,EACAC,EACAC,EAJAC,EAAcvC,EAAQuC,WAK1B,KAAKA,EACH,MAAOvC,EAETmC,KACA,KAAKC,IAAKpC,GACJA,EAAQwC,eAAeJ,KACzBD,EAAWC,GAAKpC,EAAQoC,GAa5B,OAVAD,GAAWM,MAAO,EAClBJ,EAAQnC,EAAIwC,cAAgBxC,EAAImC,MAChCC,EAASpC,EAAIyC,eAAiBzC,EAAIoC,OAC9BD,EAAQC,EAASC,GACnBJ,EAAWS,SAAWN,EAASC,EAC/BJ,EAAWU,UAAYP,IAEvBH,EAAWS,SAAWP,EACtBF,EAAWU,UAAYR,EAAQE,GAE1BJ,GAITtC,EAAUiD,oBAAsB,SAC9BC,EACA7C,EACA8C,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAaA,MAXAR,GAAOS,WAAW,MAAMC,UACtBvD,EACA8C,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEKR,GAITlD,EAAU6D,gBAAkB,SAAU1D,GACpC,MAAOA,GAAQ+C,QAAU/C,EAAQyC,QAAUzC,EAAQuC,aAQrD1C,EAAUmC,MAAQ,SAAU9B,EAAKF,EAAS+B,GAoBxC,QAAS4B,KACP,GAAI3B,GAAQ4B,KAAKC,KACdC,GAAYR,GAAaA,GACzBS,GAAaR,GAAcA,EAE1BvB,GAAQ,IACVsB,GAAatB,EACbuB,GAAcvB,GAGlB,QAASgC,KACP,GAAIhC,GAAQ4B,KAAKK,KACdrB,GAAYU,GAAaA,GACzBT,GAAaU,GAAcA,EAE1BvB,GAAQ,IACVsB,GAAatB,EACbuB,GAAcvB,GApClBhC,EAAUA,KACV,IAOI4C,GACAC,EACAiB,EACAC,EACAb,EACAC,EACAH,EACAC,EACAiB,EACAC,EACAC,EAjBArB,EAAS5C,SAASC,cAAc,UAChCiE,EAAYnE,EAAIsD,YACH3D,EAAU6D,gBAAgB1D,IAAY+C,EAAOS,WAC1DnB,EAAQnC,EAAIwC,cAAgBxC,EAAImC,MAChCC,EAASpC,EAAIyC,eAAiBzC,EAAIoC,OAClCgB,EAAYjB,EACZkB,EAAajB,CAuFjB,IAvDI+B,IACFrE,EAAUH,EAAUqC,sBAAsBhC,EAAKF,EAAS+B,GACxDiB,EAAUhD,EAAQsE,MAAQ,EAC1BrB,EAAUjD,EAAQuE,KAAO,EACrBvE,EAAQkD,aACVA,EAAclD,EAAQkD,YACAsB,SAAlBxE,EAAQyE,OAAwCD,SAAjBxE,EAAQsE,OACzCtB,EAAUX,EAAQa,EAAclD,EAAQyE,QAG1CvB,EAAcb,EAAQW,GAAWhD,EAAQyE,OAAS,GAEhDzE,EAAQmD,cACVA,EAAenD,EAAQmD,aACAqB,SAAnBxE,EAAQ0E,QAAwCF,SAAhBxE,EAAQuE,MAC1CtB,EAAUX,EAASa,EAAenD,EAAQ0E,SAG5CvB,EAAeb,EAASW,GAAWjD,EAAQ0E,QAAU,GAEvDpB,EAAYJ,EACZK,EAAaJ,GAEfP,EAAW5C,EAAQ4C,SACnBC,EAAY7C,EAAQ6C,UACpBiB,EAAW9D,EAAQ8D,SACnBC,EAAY/D,EAAQ+D,UAChBM,GAAazB,GAAYC,GAAa7C,EAAQyC,MAChDa,EAAYV,EACZW,EAAaV,EACbuB,EAAMlB,EAAcC,EAAeP,EAAWC,EAC1CuB,EAAM,GACRjB,EAAeN,EAAYK,EAAcN,EACrB4B,SAAhBxE,EAAQuE,KAAwCC,SAAnBxE,EAAQ0E,SACvCzB,GAAWX,EAASa,GAAgB,IAE7BiB,EAAM,IACflB,EAAcN,EAAWO,EAAeN,EACnB2B,SAAjBxE,EAAQsE,MAAwCE,SAAlBxE,EAAQyE,QACxCzB,GAAWX,EAAQa,GAAe,OAIlClD,EAAQ2E,SAAW3E,EAAQ4E,SAC7Bd,EAAWlB,EAAWA,GAAYkB,EAClCC,EAAYlB,EAAYA,GAAakB,GAEnC/D,EAAQ4E,OACVZ,IACAL,MAEAA,IACAK,MAGAK,EAAW,CAUb,GATAH,EAAalE,EAAQkE,WACjBA,EAAa,IACfnB,EAAO8B,MAAMxC,MAAQiB,EAAY,KACjCP,EAAO8B,MAAMvC,OAASiB,EAAa,KACnCD,GAAaY,EACbX,GAAcW,EACdnB,EAAOS,WAAW,MAAMxB,MAAMkC,EAAYA,IAE5CC,EAAoBnE,EAAQmE,kBACxBA,EAAoB,GAAKA,EAAoB,GAC3Cb,EAAYJ,GAAeK,EAAaJ,EAC5C,KAAOD,EAAciB,EAAoBb,GACvCP,EAAOV,MAAQa,EAAciB,EAC7BpB,EAAOT,OAASa,EAAegB,EAC/BtE,EAAUiD,oBACRC,EACA7C,EACA8C,EACAC,EACAC,EACAC,EACA,EACA,EACAJ,EAAOV,MACPU,EAAOT,QAETY,EAAcH,EAAOV,MACrBc,EAAeJ,EAAOT,OACtBpC,EAAMC,SAASC,cAAc,UAC7BF,EAAImC,MAAQa,EACZhD,EAAIoC,OAASa,EACbtD,EAAUiD,oBACR5C,EACA6C,EACA,EACA,EACAG,EACAC,EACA,EACA,EACAD,EACAC,EAUN,OANAJ,GAAOV,MAAQiB,EACfP,EAAOT,OAASiB,EAChB1D,EAAUoC,qBACRc,EACA/C,GAEKH,EAAUiD,oBACfC,EACA7C,EACA8C,EACAC,EACAC,EACAC,EACA,EACA,EACAG,EACAC,GAKJ,MAFArD,GAAImC,MAAQiB,EACZpD,EAAIoC,OAASiB,EACNrD,GAGTL,EAAUa,gBAAkB,SAAUZ,GACpC,QAAOsB,GAASA,EAAOV,gBAAgBZ,IAGzCD,EAAUsB,gBAAkB,SAAUlB,GACpC,QAAOmB,GAASA,EAAOD,gBAAgBlB,IAMzCJ,EAAUgB,SAAW,SAAUf,EAAMC,EAAU+E,GAC7C,GAAIzD,OAAO0D,WAAY,CACrB,GAAIC,GAAa,GAAID,WAGrB,IAFAC,EAAWzE,OAASyE,EAAW3E,QAAUN,EACzC+E,EAASA,GAAU,gBACfE,EAAWF,GAEb,MADAE,GAAWF,GAAQhF,GACZkF,EAGX,OAAO,GAGa,kBAAXC,SAAyBA,OAAOC,IACzCD,OAAO,WACL,MAAOpF,KAEkB,gBAAXsF,SAAuBA,OAAOC,QAC9CD,OAAOC,QAAUvF,EAEjBD,EAAEC,UAAYA,GAEhBwB,QC1VA,SAAUgE,GACV,YACsB,mBAAXJ,SAAyBA,OAAOC,IAEzCD,QAAQ,gBAAiBI,GAEzBA,EAD2B,gBAAXF,SAAuBA,OAAOC,QACtCE,QAAQ,gBAGRjE,OAAOxB,YAEjB,SAAUA,GACV,YAEA,IAAI0F,GAAelE,OAAOmE,OAASA,KAAK7D,UAAU8D,OAClDD,KAAK7D,UAAU+D,aAAeF,KAAK7D,UAAUgE,SAE7C9F,GAAU+F,UAAYL,GAAgB,WACpC,GAAIE,GAAQI,KAAKJ,OAASI,KAAKH,aAAeG,KAAKF,QACnD,OAAOF,GAAMK,MAAMD,KAAME,YAG3BlG,EAAUmG,iBACRC,MACEC,WAUJrG,EAAUsG,cAAgB,SAAUrG,EAAMC,EAAUC,EAAS+B,GAC3D/B,EAAUA,MACV+B,EAAOA,KACP,IAAIqE,GAAOP,KAEPQ,EAAkBrG,EAAQqG,iBAAmB,OAC7CC,IAAejF,OAAOkF,UAAYzG,GAAQA,EAAK0G,MAAQ,IAC3B,eAAd1G,EAAK0B,MAAyB3B,EAAU+F,YACtDU,GAAezG,EAAUgB,SACzBhB,EAAU+F,UAAU/D,KAAK/B,EAAM,EAAGuG,GAClC,SAAUvF,GACR,GAAIA,EAAEC,OAAO0F,MAIX,MAFAC,SAAQC,IAAI7F,EAAEC,OAAO0F,WACrB1G,GAASgC,EAOX,IAKI6E,GACAC,EACAC,EACA1E,EARA2E,EAASjG,EAAEC,OAAOC,OAClBgG,EAAW,GAAIT,UAASQ,GACxBE,EAAS,EACTC,EAAYF,EAASG,WAAa,EAClCC,EAAaH,CAMjB,IAA8B,QAA1BD,EAASK,UAAU,GAAe,CACpC,KAAOJ,EAASC,IACdN,EAAcI,EAASK,UAAUJ,GAI5BL,GAAe,OAAUA,GAAe,OAC3B,QAAhBA,IANuB,CAYvB,GADAC,EAAeG,EAASK,UAAUJ,EAAS,GAAK,EAC5CA,EAASJ,EAAeG,EAASG,WAAY,CAC/CT,QAAQC,IAAI,2CACZ,OAGF,GADAG,EAAUjH,EAAUmG,gBAAgBC,KAAKW,GAEvC,IAAKxE,EAAI,EAAGA,EAAI0E,EAAQQ,OAAQlF,GAAK,EACnC0E,EAAQ1E,GAAGP,KACTuE,EACAY,EACAC,EACAJ,EACA9E,EACA/B,EAINiH,IAAUJ,EACVO,EAAaH,GASZjH,EAAQuH,kBAAoBH,EAAa,IACxCL,EAAOtB,MACT1D,EAAKyF,UAAYT,EAAOtB,MAAM,EAAG2B,GAIjCrF,EAAKyF,UAAY,GAAIC,YAAWV,GAC7BW,SAAS,EAAGN,QAInBV,SAAQC,IAAI,0CAEd5G,GAASgC,IAEX,sBAEFhC,EAASgC,IAKblC,EAAU8H,cAAgB,SAAU3H,GAClC,MAAOA,GAAQ4H,KAGjB,IAAIC,GAAoBhI,EAAUiC,SAClCjC,GAAUiC,UAAY,SAAU5B,EAAKF,EAASD,EAAUD,EAAMiC,GACxDlC,EAAU8H,cAAc3H,OAC1BH,EAAUsG,cAAcrG,EAAM,SAAUiC,GACtC8F,EAAkBhG,KAAKhC,EAAWK,EAAKF,EAASD,EAAUD,EAAMiC,IAC/D/B,EAAS+B,GAEZ8F,EAAkB/B,MAAMjG,EAAWkG,cC9IvC,SAAUV,GACV,YACsB,mBAAXJ,SAAyBA,OAAOC,IAEzCD,QAAQ,eAAgB,qBAAsBI,GACnB,gBAAXF,SAAuBA,OAAOC,QAC9CC,EAAQC,QAAQ,gBAAiBA,QAAQ,sBAGzCD,EAAQhE,OAAOxB,YAEjB,SAAUA,GACV,YAEAA,GAAUiI,QAAU,WAClB,MAAOjC,OAGThG,EAAUiI,QAAQnG,UAAUoG,KAC1BC,YAAe,KAGjBnI,EAAUiI,QAAQnG,UAAUsG,IAAM,SAAUC,GAC1C,MAAOrC,MAAKqC,IAAOrC,KAAKA,KAAKkC,IAAIG,KAGnCrI,EAAUsI,iBAAmB,SAAUnB,EAAUC,EAAQK,GACvD,GAAIc,GACFhG,EACAiG,CACF,KAAKf,GAAUL,EAASK,EAASN,EAASG,WAExC,WADAT,SAAQC,IAAI,6CAId,KADAyB,KACKhG,EAAI,EAAGA,EAAIkF,EAAQlF,GAAK,EAC3BiG,EAAIrB,EAASsB,SAASrB,EAAS7E,GAC/BgG,EAAQG,MAAMF,EAAI,GAAK,IAAM,IAAMA,EAAEzG,SAAS,IAEhD,OAAO,oBAAsBwG,EAAQI,KAAK,MAG5C3I,EAAU4I,cAERC,GACEC,SAAU,SAAU3B,EAAU4B,GAC5B,MAAO5B,GAASsB,SAASM,IAE3BpC,KAAM,GAGRqC,GACEF,SAAU,SAAU3B,EAAU4B,GAC5B,MAAOE,QAAOC,aAAa/B,EAASsB,SAASM,KAE/CpC,KAAM,EACNwC,OAAO,GAGTC,GACEN,SAAU,SAAU3B,EAAU4B,EAAYM,GACxC,MAAOlC,GAASK,UAAUuB,EAAYM,IAExC1C,KAAM,GAGR2C,GACER,SAAU,SAAU3B,EAAU4B,EAAYM,GACxC,MAAOlC,GAASoC,UAAUR,EAAYM,IAExC1C,KAAM,GAGR6C,GACEV,SAAU,SAAU3B,EAAU4B,EAAYM,GACxC,MAAOlC,GAASoC,UAAUR,EAAYM,GACtClC,EAASoC,UAAUR,EAAa,EAAGM,IAErC1C,KAAM,GAGR8C,GACEX,SAAU,SAAU3B,EAAU4B,EAAYM,GACxC,MAAOlC,GAASuC,SAASX,EAAYM,IAEvC1C,KAAM,GAGRgD,IACEb,SAAU,SAAU3B,EAAU4B,EAAYM,GACxC,MAAOlC,GAASuC,SAASX,EAAYM,GACrClC,EAASuC,SAASX,EAAa,EAAGM,IAEpC1C,KAAM,IAIV3G,EAAU4I,aAAa,GAAK5I,EAAU4I,aAAa,GAEnD5I,EAAU4J,aAAe,SAAUzC,EAAU0C,EAAYzC,EAAQzF,EAAM8F,EAAQ4B,GAC7E,GACIS,GACAf,EACAgB,EACAxH,EACAyH,EACAC,EANAC,EAAUlK,EAAU4I,aAAajH,EAOrC,KAAKuI,EAEH,WADArD,SAAQC,IAAI,uCASd,IANAgD,EAAUI,EAAQvD,KAAOc,EAGzBsB,EAAae,EAAU,EACnBD,EAAa1C,EAASoC,UAAUnC,EAAS,EAAGiC,GAC3CjC,EAAS,EACV2B,EAAae,EAAU3C,EAASG,WAElC,WADAT,SAAQC,IAAI,0CAGd,IAAe,IAAXW,EACF,MAAOyC,GAAQpB,SAAS3B,EAAU4B,EAAYM,EAGhD,KADAU,KACKxH,EAAI,EAAGA,EAAIkF,EAAQlF,GAAK,EAC3BwH,EAAOxH,GAAK2H,EAAQpB,SAAS3B,EAAU4B,EAAaxG,EAAI2H,EAAQvD,KAAM0C,EAExE,IAAIa,EAAQf,MAAO,CAGjB,IAFAa,EAAM,GAEDzH,EAAI,EAAGA,EAAIwH,EAAOtC,SACrBwC,EAAIF,EAAOxH,GAED,OAAN0H,GAHyB1H,GAAK,EAMlCyH,GAAOC,CAET,OAAOD,GAET,MAAOD,IAGT/J,EAAUmK,aAAe,SAAUhD,EAAU0C,EAAYzC,EAAQiC,EAAcnH,GAC7E,GAAIkI,GAAMjD,EAASK,UAAUJ,EAAQiC,EACrCnH,GAAKmI,KAAKD,GAAOpK,EAAU4J,aACzBzC,EACA0C,EACAzC,EACAD,EAASK,UAAUJ,EAAS,EAAGiC,GAC/BlC,EAASoC,UAAUnC,EAAS,EAAGiC,GAC/BA,IAIJrJ,EAAUsK,cAAgB,SAAUnD,EAAU0C,EAAYU,EAAWlB,EAAcnH,GACjF,GAAIsI,GACFC,EACAlI,CACF,IAAIgI,EAAY,EAAIpD,EAASG,WAE3B,WADAT,SAAQC,IAAI,+CAKd,IAFA0D,EAAarD,EAASK,UAAU+C,EAAWlB,GAC3CoB,EAAeF,EAAY,EAAI,GAAKC,EAChCC,EAAe,EAAItD,EAASG,WAE9B,WADAT,SAAQC,IAAI,6CAGd,KAAKvE,EAAI,EAAGA,EAAIiI,EAAYjI,GAAK,EAC/ByD,KAAKmE,aACHhD,EACA0C,EACAU,EAAY,EAAI,GAAKhI,EACrB8G,EACAnH,EAIJ,OAAOiF,GAASoC,UAAUkB,EAAcpB,IAG1CrJ,EAAU0K,cAAgB,SAAUvD,EAAUC,EAAQK,EAAQvF,EAAM/B,GAClE,IAAIA,EAAQwK,YAAZ,CAGA,GACItB,GACAkB,EACAK,EAHAf,EAAazC,EAAS,EAK1B,IAAuC,aAAnCD,EAASoC,UAAUnC,EAAS,GAAhC,CAIA,GAAIyC,EAAa,EAAI1C,EAASG,WAE5B,WADAT,SAAQC,IAAI,2CAId,IAAuC,IAAnCK,EAASK,UAAUJ,EAAS,GAE9B,WADAP,SAAQC,IAAI,oDAId,QAAQK,EAASK,UAAUqC,IACzB,IAAK,OACHR,GAAe,CACf,MACF,KAAK,OACHA,GAAe,CACf,MACF,SAEE,WADAxC,SAAQC,IAAI,qDAIhB,GAAyD,KAArDK,EAASK,UAAUqC,EAAa,EAAGR,GAErC,WADAxC,SAAQC,IAAI,0CAIdyD,GAAYpD,EAASoC,UAAUM,EAAa,EAAGR,GAE/CnH,EAAKmI,KAAO,GAAIrK,GAAUiI,QAG1BsC,EAAYvK,EAAUsK,cACpBnD,EACA0C,EACAA,EAAaU,EACblB,EACAnH,GAEEqI,IAAcpK,EAAQ0K,uBACxBD,GAAiBP,SACjBE,EAAYvK,EAAUsK,cACpBnD,EACA0C,EACAA,EAAaU,EACblB,EACAuB,GAGEA,EAAcP,KAAK,OACrBnI,EAAKmI,KAAKS,UAAY9K,EAAUsI,iBAC9BnB,EACA0C,EAAae,EAAcP,KAAK,KAChCO,EAAcP,KAAK,QAKrBnI,EAAKmI,KAAK,SAAYlK,EAAQ4K,gBAChC/K,EAAUsK,cACRnD,EACA0C,EACAA,EAAa3H,EAAKmI,KAAK,OACvBhB,EACAnH,GAIAA,EAAKmI,KAAK,SAAYlK,EAAQ6K,gBAChChL,EAAUsK,cACRnD,EACA0C,EACAA,EAAa3H,EAAKmI,KAAK,OACvBhB,EACAnH,MAMNlC,EAAUmG,gBAAgBC,KAAK,OAAQsC,KAAK1I,EAAU0K,iBCjRtD,SAAUlF,GACV,YACsB,mBAAXJ,SAAyBA,OAAOC,IAEzCD,QAAQ,eAAgB,qBAAsBI,GACnB,gBAAXF,SAAuBA,OAAOC,QAC9CC,EAAQC,QAAQ,gBAAiBA,QAAQ,sBAGzCD,EAAQhE,OAAOxB,YAEjB,SAAUA,GACV,YAEAA,GAAUiI,QAAQnG,UAAUmJ,MAI1BC,IAAQ,aACRC,IAAQ,cACRC,MAAQ,iBACRC,MAAQ,oBACRC,MAAQ,6BACRC,IAAQ,gBACRC,IAAQ,cACRC,IAAQ,4BACRC,IAAQ,cACRC,IAAQ,kBACRC,IAAQ,sBACRC,IAAQ,mBACRC,IAAQ,mBACRC,IAAQ,cACRC,IAAQ,cACRC,IAAQ,iBACRC,IAAQ,eACRC,IAAQ,eACRC,IAAQ,kBACRC,IAAQ,wBACRC,IAAQ,8BACRC,IAAQ,mBACRC,IAAQ,aACRC,IAAQ,wBACRC,IAAQ,oBACRC,IAAQ,sBACRC,IAAQ,WACRC,IAAQ,mBACRC,IAAQ,OACRC,IAAQ,QACRC,IAAQ,WACRC,IAAQ,SACRC,MAAQ,YAIRC,MAAQ,cACRC,MAAQ,kBACRC,MAAQ,aACRC,MAAQ,kBACRC,MAAQ,kBACRC,MAAQ,QACRC,MAAQ,0BACRC,MAAQ,yBACRC,MAAQ,YACRC,MAAQ,cACRC,MAAQ,mBACRC,MAAQ,mBACRC,MAAQ,oBACRC,MAAQ,aACRC,MAAQ,qBACRC,MAAQ,sBACRC,MAAQ,eACRC,MAAQ,UACRC,MAAQ,kBACRC,MAAQ,sBACRC,MAAQ,0BACRC,MAAQ,OACRC,MAAQ,kBACRC,MAAQ,4BACRC,MAAQ,2BACRC,MAAQ,WACRC,MAAQ,sBACRC,MAAQ,sBACRC,MAAQ,oBACRC,MAAQ,gBACRC,MAAQ,kBACRC,MAAQ,eACRC,MAAQ,mBACRC,MAAQ,kBACRC,MAAQ,eACRC,MAAQ,cACRC,MAAQ,QACRC,MAAQ,cACRC,MAAQ,cACRC,MAAQ,cACRC,MAAQ,2BACRC,MAAQ,wBACRC,MAAQ,wBACRC,MAAQ,2BACRC,MAAQ,kBACRC,MAAQ,gBACRC,MAAQ,gBACRC,MAAQ,aACRC,MAAQ,YACRC,MAAQ,aACRC,MAAQ,iBACRC,MAAQ,eACRC,MAAQ,eACRC,MAAQ,mBACRC,MAAQ,wBACRC,MAAQ,mBACRC,MAAQ,cACRC,MAAQ,WACRC,MAAQ,aACRC,MAAQ,YACRC,MAAQ,2BACRC,MAAQ,uBACRC,MAAQ,gBACRC,MAAQ,kBACRC,MAAQ,mBACRC,MAAQ,oBACRC,MAAQ,WACRC,MAAQ,YACRC,MAAQ,mBAIRC,EAAQ,eACR3I,EAAQ,iBACRG,EAAQ,cACRI,EAAQ,kBACRE,EAAQ,eACRE,EAAQ,iBACRiI,EAAQ,cACRC,EAAQ,eACRC,EAAQ,gBACRlI,EAAQ,YACRE,GAAQ,iBACRiI,GAAQ,SACRC,GAAQ,cACRC,GAAQ,WACRC,GAAQ,cACRC,GAAQ,WACRC,GAAQ,qBACRC,GAAQ,kBACRC,GAAQ,cACRC,GAAQ,qBACRC,GAAQ,kBACRC,GAAQ,sBACRC,GAAQ,mBACRC,GAAQ,oBACRC,GAAQ,iBACRC,GAAQ,qBACRC,GAAQ,kBACRC,GAAQ,sBACRC,GAAQ,qBACRC,GAAQ,eACRC,GAAQ,kBACRC,GAAQ,wBAGVhT,EAAUiI,QAAQnG,UAAUmR,cAC1BC,iBACE1B,EAAG,YACH3I,EAAG,SACHG,EAAG,iBACHI,EAAG,oBACHE,EAAG,mBACHE,EAAG,mBACHiI,EAAG,iBACHC,EAAG,gBACHC,EAAG,kBAELwB,cACE3B,EAAG,UACH3I,EAAG,UACHG,EAAG,wBACHI,EAAG,OACHE,EAAG,YACHE,EAAG,UACHiI,EAAG,UACH2B,IAAK,SAEPC,aACE7B,EAAG,UACH3I,EAAG,WACHG,EAAG,cACHI,EAAG,gCACHE,EAAG,QACHG,EAAG,eACHE,GAAI,iBACJiI,GAAI,QACJC,GAAI,wCACJC,GAAI,yCACJC,GAAI,0CACJC,GAAI,sCACJE,GAAI,mBACJC,GAAI,mBACJC,GAAI,mBACJC,GAAI,MACJC,GAAI,MACJC,GAAI,MACJC,GAAI,MACJC,GAAI,sBACJW,IAAK,SAEPE,OACE9B,EAAQ,qBACR3I,EAAQ,cACRW,EAAQ,mCACRkI,EAAQ,+BACRjI,EAAQ,qCACRqI,GAAQ,gEACRE,GAAQ,4DACRC,GAAQ,4CACRQ,GAAQ,gCACRC,GAAQ,yBACRI,GAAQ,oDACRE,GAAQ,gDACRO,GAAQ,oBACRC,GAAQ,sCACRC,GAAQ,iEACRC,GAAQ,6DACRC,GAAQ,6DACRC,GAAQ,wFACRC,GAAQ,oFACRC,GAAQ,iDACRC,GAAQ,4EACRC,GAAQ,yEAEVC,eACEpL,EAAG,YACHG,EAAG,6BACHI,EAAG,6BACHE,EAAG,+BACHE,EAAG,+BACHkI,EAAG,mBACHC,EAAG,kCAELuC,kBACE1C,EAAG,WACH3I,EAAG,YACHG,EAAG,WACHI,EAAG,eAEL+K,WACEtL,EAAG,yBAELuL,gBACE5C,EAAG,iBACH3I,EAAG,kBAELwL,cACE7C,EAAG,qBACH3I,EAAG,wBAELyL,aACE9C,EAAG,OACH3I,EAAG,cACHG,EAAG,eACHI,EAAG,gBACHE,EAAG,kBAELiL,UACE/C,EAAG,SACH3I,EAAG,OACHG,EAAG,QAELwL,YACEhD,EAAG,SACH3I,EAAG,iBACHG,EAAG,mBAELyL,WACEjD,EAAG,SACH3I,EAAG,OACHG,EAAG,QAEL0L,sBACElD,EAAG,UACH3I,EAAG,QACHG,EAAG,aACHI,EAAG,gBAELuL,YACEvL,EAAG,OAELwL,yBACEpD,EAAG,GACH3I,EAAG,IACHG,EAAG,KACHI,EAAG,KACHE,EAAG,IACHE,EAAG,IACHiI,EAAG,KAELtJ,aACEU,EAAG,WACHG,EAAG,YACHI,EAAG,eACHE,EAAG,cACHE,EAAG,WACHiI,EAAG,YACHC,EAAG,eACHC,EAAG,gBAIP3R,EAAUiI,QAAQnG,UAAU+S,QAAU,SAAUxM,GAC9C,GAAIyM,GAAQ9O,KAAKoC,IAAIC,EACrB,QAAQA,GACN,IAAK,cACL,IAAK,QACL,IAAK,eACL,IAAK,kBACL,IAAK,gBACL,IAAK,mBACL,IAAK,YACL,IAAK,iBACL,IAAK,eACL,IAAK,cACL,IAAK,WACL,IAAK,aACL,IAAK,YACL,IAAK,uBACL,IAAK,aACL,IAAK,cACH,MAAOrC,MAAKiN,aAAa5K,GAAIyM,EAC/B,KAAK,cACL,IAAK,kBACH,IAAKA,EAAO,MACZ,OAAO7L,QAAOC,aAAa4L,EAAM,GAAIA,EAAM,GAAIA,EAAM,GAAIA,EAAM,GACjE,KAAK,0BACH,IAAKA,EAAO,MACZ,OAAO9O,MAAKiN,aAAa5K,GAAIyM,EAAM,IACnC9O,KAAKiN,aAAa5K,GAAIyM,EAAM,IAC5B9O,KAAKiN,aAAa5K,GAAIyM,EAAM,IAC5B9O,KAAKiN,aAAa5K,GAAIyM,EAAM,GAC9B,KAAK,eACH,IAAKA,EAAO,MACZ,OAAOA,GAAM,GAAK,IAAMA,EAAM,GAAK,IAAMA,EAAM,GAAK,IAAMA,EAAM,GAEpE,MAAO7L,QAAO6L,IAGd,SAAUC,GACV,GAEIC,GAFA/J,EAAO8J,EAAiB9J,KACxB/C,EAAM6M,EAAiB7M,GAG3B,KAAK8M,IAAQ/J,GACPA,EAAKtI,eAAeqS,KACtB9M,EAAI+C,EAAK+J,IAASA,IAGtBhV,EAAUiI,QAAQnG,WAEpB9B,EAAUiI,QAAQnG,UAAUmT,OAAS,WACnC,GACID,GACA3M,EAFAH,IAGJ,KAAK8M,IAAQhP,MACPA,KAAKrD,eAAeqS,KACtB3M,EAAKrC,KAAKiF,KAAK+J,GACX3M,IACFH,EAAIG,GAAMrC,KAAK6O,QAAQxM,IAI7B,OAAOH,MCnXT,SAAU1C,GACV,YACsB,mBAAXJ,SAAyBA,OAAOC,IAEzCD,QAAQ,gBAAiBI,GAEzBA,EAD2B,gBAAXF,SAAuBA,OAAOC,QACtCE,QAAQ,gBAGRjE,OAAOxB,YAEjB,SAAUA,GACV,YAEA,IAAIkV,GAA0BlV,EAAU6D,gBACpCsR,EAAwBnV,EAAU8H,cAClCsN,EAA+BpV,EAAUoC,qBACzCiT,EAAgCrV,EAAUqC,qBAG9CrC,GAAU6D,gBAAkB,SAAU1D,GACpC,QAASA,EAAQmV,aACfJ,EAAwBlT,KAAKhC,EAAWG,IAI5CH,EAAU8H,cAAgB,SAAU3H,GAClC,MAAOA,GAAQmV,eAAgB,GAC7BH,EAAsBnT,KAAKhC,EAAWG,IAK1CH,EAAUoC,qBAAuB,SAAUc,EAAQ/C,GACjDiV,EAA6BpT,KAAKhC,EAAWkD,EAAQ/C,EACrD,IAAIoV,GAAMrS,EAAOS,WAAW,MACxBnB,EAAQU,EAAOV,MACfC,EAASS,EAAOT,OAChB+S,EAAatS,EAAO8B,MAAMxC,MAC1BiT,EAAcvS,EAAO8B,MAAMvC,OAC3B6S,EAAcnV,EAAQmV,WAC1B,IAAKA,KAAeA,EAAc,GASlC,OANIA,EAAc,IAChBpS,EAAOV,MAAQC,EACfS,EAAOT,OAASD,EAChBU,EAAO8B,MAAMxC,MAAQiT,EACrBvS,EAAO8B,MAAMvC,OAAS+S,GAEhBF,GACN,IAAK,GAEHC,EAAIG,UAAUlT,EAAO,GACrB+S,EAAIpT,OAAM,EAAI,EACd,MACF,KAAK,GAEHoT,EAAIG,UAAUlT,EAAOC,GACrB8S,EAAII,OAAO5R,KAAK6R,GAChB,MACF,KAAK,GAEHL,EAAIG,UAAU,EAAGjT,GACjB8S,EAAIpT,MAAM,GAAG,EACb,MACF,KAAK,GAEHoT,EAAII,OAAO,GAAM5R,KAAK6R,IACtBL,EAAIpT,MAAM,GAAG,EACb,MACF,KAAK,GAEHoT,EAAII,OAAO,GAAM5R,KAAK6R,IACtBL,EAAIG,UAAU,GAAIjT,EAClB,MACF,KAAK,GAEH8S,EAAII,OAAO,GAAM5R,KAAK6R,IACtBL,EAAIG,UAAUlT,GAAQC,GACtB8S,EAAIpT,OAAM,EAAI,EACd,MACF,KAAK,GAEHoT,EAAII,QAAO,GAAO5R,KAAK6R,IACvBL,EAAIG,WAAWlT,EAAO,KAO5BxC,EAAUqC,sBAAwB,SAAUhC,EAAKwV,EAAM3T,GACrD,GAEII,GACAC,EAHApC,EAAUkV,EAA8BrT,KAAKhC,EAAWK,EAAKwV,GAC7DP,EAAcnV,EAAQmV,WAM1B,IAHIA,KAAgB,GAAQpT,GAAQA,EAAKmI,OACvCiL,EAAcpT,EAAKmI,KAAKjC,IAAI,iBAEzBkN,GAAeA,EAAc,GAAqB,IAAhBA,EACrC,MAAOnV,EAETmC,KACA,KAAKC,IAAKpC,GACJA,EAAQwC,eAAeJ,KACzBD,EAAWC,GAAKpC,EAAQoC,GAI5B,QADAD,EAAWgT,YAAcA,EACjBA,GACN,IAAK,GAEHhT,EAAWmC,KAAOtE,EAAQyE,MAC1BtC,EAAWsC,MAAQzE,EAAQsE,IAC3B,MACF,KAAK,GAEHnC,EAAWmC,KAAOtE,EAAQyE,MAC1BtC,EAAWoC,IAAMvE,EAAQ0E,OACzBvC,EAAWsC,MAAQzE,EAAQsE,KAC3BnC,EAAWuC,OAAS1E,EAAQuE,GAC5B,MACF,KAAK,GAEHpC,EAAWoC,IAAMvE,EAAQ0E,OACzBvC,EAAWuC,OAAS1E,EAAQuE,GAC5B,MACF,KAAK,GAEHpC,EAAWmC,KAAOtE,EAAQuE,IAC1BpC,EAAWoC,IAAMvE,EAAQsE,KACzBnC,EAAWsC,MAAQzE,EAAQ0E,OAC3BvC,EAAWuC,OAAS1E,EAAQyE,KAC5B,MACF,KAAK,GAEHtC,EAAWmC,KAAOtE,EAAQuE,IAC1BpC,EAAWoC,IAAMvE,EAAQyE,MACzBtC,EAAWsC,MAAQzE,EAAQ0E,OAC3BvC,EAAWuC,OAAS1E,EAAQsE,IAC5B,MACF,KAAK,GAEHnC,EAAWmC,KAAOtE,EAAQ0E,OAC1BvC,EAAWoC,IAAMvE,EAAQyE,MACzBtC,EAAWsC,MAAQzE,EAAQuE,IAC3BpC,EAAWuC,OAAS1E,EAAQsE,IAC5B,MACF,KAAK,GAEHnC,EAAWmC,KAAOtE,EAAQ0E,OAC1BvC,EAAWoC,IAAMvE,EAAQsE,KACzBnC,EAAWsC,MAAQzE,EAAQuE,IAC3BpC,EAAWuC,OAAS1E,EAAQyE,MAWhC,MARItC,GAAWgT,YAAc,IAC3BhT,EAAWS,SAAW5C,EAAQ6C,UAC9BV,EAAWU,UAAY7C,EAAQ4C,SAC/BT,EAAW2B,SAAW9D,EAAQ+D,UAC9B5B,EAAW4B,UAAY/D,EAAQ8D,SAC/B3B,EAAWe,YAAclD,EAAQmD,aACjChB,EAAWgB,aAAenD,EAAQkD,aAE7Bf","file":"load-image.all.min.js"} \ No newline at end of file diff --git a/bower_components/blueimp-load-image/js/load-image.js b/bower_components/blueimp-load-image/js/load-image.js new file mode 100644 index 0000000000..e7fe73c960 --- /dev/null +++ b/bower_components/blueimp-load-image/js/load-image.js @@ -0,0 +1,364 @@ +/* + * JavaScript Load Image + * https://github.com/blueimp/JavaScript-Load-Image + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, URL, webkitURL, FileReader */ + +;(function ($) { + 'use strict' + + // Loads an image for a given File object. + // Invokes the callback with an img or optional canvas + // element (if supported by the browser) as parameter: + function loadImage (file, callback, options) { + var img = document.createElement('img') + var url + img.onerror = function (event) { + return loadImage.onerror(img, event, file, callback, options) + } + img.onload = function (event) { + return loadImage.onload(img, event, file, callback, options) + } + if (loadImage.isInstanceOf('Blob', file) || + // Files are also Blob instances, but some browsers + // (Firefox 3.6) support the File API but not Blobs: + loadImage.isInstanceOf('File', file)) { + url = img._objectURL = loadImage.createObjectURL(file) + } else if (typeof file === 'string') { + url = file + if (options && options.crossOrigin) { + img.crossOrigin = options.crossOrigin + } + } else { + return false + } + if (url) { + img.src = url + return img + } + return loadImage.readFile(file, function (e) { + var target = e.target + if (target && target.result) { + img.src = target.result + } else if (callback) { + callback(e) + } + }) + } + // The check for URL.revokeObjectURL fixes an issue with Opera 12, + // which provides URL.createObjectURL but doesn't properly implement it: + var urlAPI = (window.createObjectURL && window) || + (window.URL && URL.revokeObjectURL && URL) || + (window.webkitURL && webkitURL) + + function revokeHelper (img, options) { + if (img._objectURL && !(options && options.noRevoke)) { + loadImage.revokeObjectURL(img._objectURL) + delete img._objectURL + } + } + + loadImage.isInstanceOf = function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']' + } + + loadImage.transform = function (img, options, callback, file, data) { + callback(loadImage.scale(img, options, data), data) + } + + loadImage.onerror = function (img, event, file, callback, options) { + revokeHelper(img, options) + if (callback) { + callback.call(img, event) + } + } + + loadImage.onload = function (img, event, file, callback, options) { + revokeHelper(img, options) + if (callback) { + loadImage.transform(img, options, callback, file, {}) + } + } + + // Transform image coordinates, allows to override e.g. + // the canvas orientation based on the orientation option, + // gets canvas, options passed as arguments: + loadImage.transformCoordinates = function () { + return + } + + // Returns transformed options, allows to override e.g. + // maxWidth, maxHeight and crop options based on the aspectRatio. + // gets img, options passed as arguments: + loadImage.getTransformedOptions = function (img, options) { + var aspectRatio = options.aspectRatio + var newOptions + var i + var width + var height + if (!aspectRatio) { + return options + } + newOptions = {} + for (i in options) { + if (options.hasOwnProperty(i)) { + newOptions[i] = options[i] + } + } + newOptions.crop = true + width = img.naturalWidth || img.width + height = img.naturalHeight || img.height + if (width / height > aspectRatio) { + newOptions.maxWidth = height * aspectRatio + newOptions.maxHeight = height + } else { + newOptions.maxWidth = width + newOptions.maxHeight = width / aspectRatio + } + return newOptions + } + + // Canvas render method, allows to implement a different rendering algorithm: + loadImage.renderImageToCanvas = function ( + canvas, + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + destX, + destY, + destWidth, + destHeight + ) { + canvas.getContext('2d').drawImage( + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + destX, + destY, + destWidth, + destHeight + ) + return canvas + } + + // Determines if the target image should be a canvas element: + loadImage.hasCanvasOption = function (options) { + return options.canvas || options.crop || !!options.aspectRatio + } + + // Scales and/or crops the given image (img or canvas HTML element) + // using the given options. + // Returns a canvas object if the browser supports canvas + // and the hasCanvasOption method returns true or a canvas + // object is passed as image, else the scaled image: + loadImage.scale = function (img, options, data) { + options = options || {} + var canvas = document.createElement('canvas') + var useCanvas = img.getContext || + (loadImage.hasCanvasOption(options) && canvas.getContext) + var width = img.naturalWidth || img.width + var height = img.naturalHeight || img.height + var destWidth = width + var destHeight = height + var maxWidth + var maxHeight + var minWidth + var minHeight + var sourceWidth + var sourceHeight + var sourceX + var sourceY + var pixelRatio + var downsamplingRatio + var tmp + function scaleUp () { + var scale = Math.max( + (minWidth || destWidth) / destWidth, + (minHeight || destHeight) / destHeight + ) + if (scale > 1) { + destWidth *= scale + destHeight *= scale + } + } + function scaleDown () { + var scale = Math.min( + (maxWidth || destWidth) / destWidth, + (maxHeight || destHeight) / destHeight + ) + if (scale < 1) { + destWidth *= scale + destHeight *= scale + } + } + if (useCanvas) { + options = loadImage.getTransformedOptions(img, options, data) + sourceX = options.left || 0 + sourceY = options.top || 0 + if (options.sourceWidth) { + sourceWidth = options.sourceWidth + if (options.right !== undefined && options.left === undefined) { + sourceX = width - sourceWidth - options.right + } + } else { + sourceWidth = width - sourceX - (options.right || 0) + } + if (options.sourceHeight) { + sourceHeight = options.sourceHeight + if (options.bottom !== undefined && options.top === undefined) { + sourceY = height - sourceHeight - options.bottom + } + } else { + sourceHeight = height - sourceY - (options.bottom || 0) + } + destWidth = sourceWidth + destHeight = sourceHeight + } + maxWidth = options.maxWidth + maxHeight = options.maxHeight + minWidth = options.minWidth + minHeight = options.minHeight + if (useCanvas && maxWidth && maxHeight && options.crop) { + destWidth = maxWidth + destHeight = maxHeight + tmp = sourceWidth / sourceHeight - maxWidth / maxHeight + if (tmp < 0) { + sourceHeight = maxHeight * sourceWidth / maxWidth + if (options.top === undefined && options.bottom === undefined) { + sourceY = (height - sourceHeight) / 2 + } + } else if (tmp > 0) { + sourceWidth = maxWidth * sourceHeight / maxHeight + if (options.left === undefined && options.right === undefined) { + sourceX = (width - sourceWidth) / 2 + } + } + } else { + if (options.contain || options.cover) { + minWidth = maxWidth = maxWidth || minWidth + minHeight = maxHeight = maxHeight || minHeight + } + if (options.cover) { + scaleDown() + scaleUp() + } else { + scaleUp() + scaleDown() + } + } + if (useCanvas) { + pixelRatio = options.pixelRatio + if (pixelRatio > 1) { + canvas.style.width = destWidth + 'px' + canvas.style.height = destHeight + 'px' + destWidth *= pixelRatio + destHeight *= pixelRatio + canvas.getContext('2d').scale(pixelRatio, pixelRatio) + } + downsamplingRatio = options.downsamplingRatio + if (downsamplingRatio > 0 && downsamplingRatio < 1 && + destWidth < sourceWidth && destHeight < sourceHeight) { + while (sourceWidth * downsamplingRatio > destWidth) { + canvas.width = sourceWidth * downsamplingRatio + canvas.height = sourceHeight * downsamplingRatio + loadImage.renderImageToCanvas( + canvas, + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + 0, + 0, + canvas.width, + canvas.height + ) + sourceWidth = canvas.width + sourceHeight = canvas.height + img = document.createElement('canvas') + img.width = sourceWidth + img.height = sourceHeight + loadImage.renderImageToCanvas( + img, + canvas, + 0, + 0, + sourceWidth, + sourceHeight, + 0, + 0, + sourceWidth, + sourceHeight + ) + } + } + canvas.width = destWidth + canvas.height = destHeight + loadImage.transformCoordinates( + canvas, + options + ) + return loadImage.renderImageToCanvas( + canvas, + img, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + 0, + 0, + destWidth, + destHeight + ) + } + img.width = destWidth + img.height = destHeight + return img + } + + loadImage.createObjectURL = function (file) { + return urlAPI ? urlAPI.createObjectURL(file) : false + } + + loadImage.revokeObjectURL = function (url) { + return urlAPI ? urlAPI.revokeObjectURL(url) : false + } + + // Loads a given File object via FileReader interface, + // invokes the callback with the event object (load or error). + // The result can be read via event.target.result: + loadImage.readFile = function (file, callback, method) { + if (window.FileReader) { + var fileReader = new FileReader() + fileReader.onload = fileReader.onerror = callback + method = method || 'readAsDataURL' + if (fileReader[method]) { + fileReader[method](file) + return fileReader + } + } + return false + } + + if (typeof define === 'function' && define.amd) { + define(function () { + return loadImage + }) + } else if (typeof module === 'object' && module.exports) { + module.exports = loadImage + } else { + $.loadImage = loadImage + } +}(window)) diff --git a/bower_components/blueimp-load-image/js/vendor/jquery.Jcrop.js b/bower_components/blueimp-load-image/js/vendor/jquery.Jcrop.js new file mode 100755 index 0000000000..3e32f04bd9 --- /dev/null +++ b/bower_components/blueimp-load-image/js/vendor/jquery.Jcrop.js @@ -0,0 +1,1694 @@ +/** + * jquery.Jcrop.js v0.9.12 + * jQuery Image Cropping Plugin - released under MIT License + * Author: Kelly Hallman + * http://github.com/tapmodo/Jcrop + * Copyright (c) 2008-2013 Tapmodo Interactive LLC {{{ + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * }}} + */ + +(function ($) { + + $.Jcrop = function (obj, opt) { + var options = $.extend({}, $.Jcrop.defaults), + docOffset, + _ua = navigator.userAgent.toLowerCase(), + is_msie = /msie/.test(_ua), + ie6mode = /msie [1-6]\./.test(_ua); + + // Internal Methods {{{ + function px(n) { + return Math.round(n) + 'px'; + } + function cssClass(cl) { + return options.baseClass + '-' + cl; + } + function supportsColorFade() { + return $.fx.step.hasOwnProperty('backgroundColor'); + } + function getPos(obj) //{{{ + { + var pos = $(obj).offset(); + return [pos.left, pos.top]; + } + //}}} + function mouseAbs(e) //{{{ + { + return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])]; + } + //}}} + function setOptions(opt) //{{{ + { + if (typeof(opt) !== 'object') opt = {}; + options = $.extend(options, opt); + + $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) { + if (typeof(options[e]) !== 'function') options[e] = function () {}; + }); + } + //}}} + function startDragMode(mode, pos, touch) //{{{ + { + docOffset = getPos($img); + Tracker.setCursor(mode === 'move' ? mode : mode + '-resize'); + + if (mode === 'move') { + return Tracker.activateHandlers(createMover(pos), doneSelect, touch); + } + + var fc = Coords.getFixed(); + var opp = oppLockCorner(mode); + var opc = Coords.getCorner(oppLockCorner(opp)); + + Coords.setPressed(Coords.getCorner(opp)); + Coords.setCurrent(opc); + + Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect, touch); + } + //}}} + function dragmodeHandler(mode, f) //{{{ + { + return function (pos) { + if (!options.aspectRatio) { + switch (mode) { + case 'e': + pos[1] = f.y2; + break; + case 'w': + pos[1] = f.y2; + break; + case 'n': + pos[0] = f.x2; + break; + case 's': + pos[0] = f.x2; + break; + } + } else { + switch (mode) { + case 'e': + pos[1] = f.y + 1; + break; + case 'w': + pos[1] = f.y + 1; + break; + case 'n': + pos[0] = f.x + 1; + break; + case 's': + pos[0] = f.x + 1; + break; + } + } + Coords.setCurrent(pos); + Selection.update(); + }; + } + //}}} + function createMover(pos) //{{{ + { + var lloc = pos; + KeyManager.watchKeys(); + + return function (pos) { + Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); + lloc = pos; + + Selection.update(); + }; + } + //}}} + function oppLockCorner(ord) //{{{ + { + switch (ord) { + case 'n': + return 'sw'; + case 's': + return 'nw'; + case 'e': + return 'nw'; + case 'w': + return 'ne'; + case 'ne': + return 'sw'; + case 'nw': + return 'se'; + case 'se': + return 'nw'; + case 'sw': + return 'ne'; + } + } + //}}} + function createDragger(ord) //{{{ + { + return function (e) { + if (options.disabled) { + return false; + } + if ((ord === 'move') && !options.allowMove) { + return false; + } + + // Fix position of crop area when dragged the very first time. + // Necessary when crop image is in a hidden element when page is loaded. + docOffset = getPos($img); + + btndown = true; + startDragMode(ord, mouseAbs(e)); + e.stopPropagation(); + e.preventDefault(); + return false; + }; + } + //}}} + function presize($obj, w, h) //{{{ + { + var nw = $obj.width(), + nh = $obj.height(); + if ((nw > w) && w > 0) { + nw = w; + nh = (w / $obj.width()) * $obj.height(); + } + if ((nh > h) && h > 0) { + nh = h; + nw = (h / $obj.height()) * $obj.width(); + } + xscale = $obj.width() / nw; + yscale = $obj.height() / nh; + $obj.width(nw).height(nh); + } + //}}} + function unscale(c) //{{{ + { + return { + x: c.x * xscale, + y: c.y * yscale, + x2: c.x2 * xscale, + y2: c.y2 * yscale, + w: c.w * xscale, + h: c.h * yscale + }; + } + //}}} + function doneSelect(pos) //{{{ + { + var c = Coords.getFixed(); + if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) { + Selection.enableHandles(); + Selection.done(); + } else { + Selection.release(); + } + Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); + } + //}}} + function newSelection(e) //{{{ + { + if (options.disabled) { + return false; + } + if (!options.allowSelect) { + return false; + } + btndown = true; + docOffset = getPos($img); + Selection.disableHandles(); + Tracker.setCursor('crosshair'); + var pos = mouseAbs(e); + Coords.setPressed(pos); + Selection.update(); + Tracker.activateHandlers(selectDrag, doneSelect, e.type.substring(0,5)==='touch'); + KeyManager.watchKeys(); + + e.stopPropagation(); + e.preventDefault(); + return false; + } + //}}} + function selectDrag(pos) //{{{ + { + Coords.setCurrent(pos); + Selection.update(); + } + //}}} + function newTracker() //{{{ + { + var trk = $('
      ').addClass(cssClass('tracker')); + if (is_msie) { + trk.css({ + opacity: 0, + backgroundColor: 'white' + }); + } + return trk; + } + //}}} + + // }}} + // Initialization {{{ + // Sanitize some options {{{ + if (typeof(obj) !== 'object') { + obj = $(obj)[0]; + } + if (typeof(opt) !== 'object') { + opt = {}; + } + // }}} + setOptions(opt); + // Initialize some jQuery objects {{{ + // The values are SET on the image(s) for the interface + // If the original image has any of these set, they will be reset + // However, if you destroy() the Jcrop instance the original image's + // character in the DOM will be as you left it. + var img_css = { + border: 'none', + visibility: 'visible', + margin: 0, + padding: 0, + position: 'absolute', + top: 0, + left: 0 + }; + + var $origimg = $(obj), + img_mode = true; + + if (obj.tagName == 'IMG') { + // Fix size of crop image. + // Necessary when crop image is within a hidden element when page is loaded. + if ($origimg[0].width != 0 && $origimg[0].height != 0) { + // Obtain dimensions from contained img element. + $origimg.width($origimg[0].width); + $origimg.height($origimg[0].height); + } else { + // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0). + var tempImage = new Image(); + tempImage.src = $origimg[0].src; + $origimg.width(tempImage.width); + $origimg.height(tempImage.height); + } + + var $img = $origimg.clone().removeAttr('id').css(img_css).show(); + + $img.width($origimg.width()); + $img.height($origimg.height()); + $origimg.after($img).hide(); + + } else { + $img = $origimg.css(img_css).show(); + img_mode = false; + if (options.shade === null) { options.shade = true; } + } + + presize($img, options.boxWidth, options.boxHeight); + + var boundx = $img.width(), + boundy = $img.height(), + + + $div = $('
      ').width(boundx).height(boundy).addClass(cssClass('holder')).css({ + position: 'relative', + backgroundColor: options.bgColor + }).insertAfter($origimg).append($img); + + if (options.addClass) { + $div.addClass(options.addClass); + } + + var $img2 = $('
      '), + + $img_holder = $('
      ') + .width('100%').height('100%').css({ + zIndex: 310, + position: 'absolute', + overflow: 'hidden' + }), + + $hdl_holder = $('
      ') + .width('100%').height('100%').css('zIndex', 320), + + $sel = $('
      ') + .css({ + position: 'absolute', + zIndex: 600 + }).dblclick(function(){ + var c = Coords.getFixed(); + options.onDblClick.call(api,c); + }).insertBefore($img).append($img_holder, $hdl_holder); + + if (img_mode) { + + $img2 = $('') + .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy), + + $img_holder.append($img2); + + } + + if (ie6mode) { + $sel.css({ + overflowY: 'hidden' + }); + } + + var bound = options.boundary; + var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({ + position: 'absolute', + top: px(-bound), + left: px(-bound), + zIndex: 290 + }).mousedown(newSelection); + + /* }}} */ + // Set more variables {{{ + var bgcolor = options.bgColor, + bgopacity = options.bgOpacity, + xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true, + btndown, animating, shift_down; + + docOffset = getPos($img); + // }}} + // }}} + // Internal Modules {{{ + // Touch Module {{{ + var Touch = (function () { + // Touch support detection function adapted (under MIT License) + // from code by Jeffrey Sambells - http://github.com/iamamused/ + function hasTouchSupport() { + var support = {}, events = ['touchstart', 'touchmove', 'touchend'], + el = document.createElement('div'), i; + + try { + for(i=0; i x1 + ox) { + ox -= ox + x1; + } + if (0 > y1 + oy) { + oy -= oy + y1; + } + + if (boundy < y2 + oy) { + oy += boundy - (y2 + oy); + } + if (boundx < x2 + ox) { + ox += boundx - (x2 + ox); + } + + x1 += ox; + x2 += ox; + y1 += oy; + y2 += oy; + } + //}}} + function getCorner(ord) //{{{ + { + var c = getFixed(); + switch (ord) { + case 'ne': + return [c.x2, c.y]; + case 'nw': + return [c.x, c.y]; + case 'se': + return [c.x2, c.y2]; + case 'sw': + return [c.x, c.y2]; + } + } + //}}} + function getFixed() //{{{ + { + if (!options.aspectRatio) { + return getRect(); + } + // This function could use some optimization I think... + var aspect = options.aspectRatio, + min_x = options.minSize[0] / xscale, + + + //min_y = options.minSize[1]/yscale, + max_x = options.maxSize[0] / xscale, + max_y = options.maxSize[1] / yscale, + rw = x2 - x1, + rh = y2 - y1, + rwa = Math.abs(rw), + rha = Math.abs(rh), + real_ratio = rwa / rha, + xx, yy, w, h; + + if (max_x === 0) { + max_x = boundx * 10; + } + if (max_y === 0) { + max_y = boundy * 10; + } + if (real_ratio < aspect) { + yy = y2; + w = rha * aspect; + xx = rw < 0 ? x1 - w : w + x1; + + if (xx < 0) { + xx = 0; + h = Math.abs((xx - x1) / aspect); + yy = rh < 0 ? y1 - h : h + y1; + } else if (xx > boundx) { + xx = boundx; + h = Math.abs((xx - x1) / aspect); + yy = rh < 0 ? y1 - h : h + y1; + } + } else { + xx = x2; + h = rwa / aspect; + yy = rh < 0 ? y1 - h : y1 + h; + if (yy < 0) { + yy = 0; + w = Math.abs((yy - y1) * aspect); + xx = rw < 0 ? x1 - w : w + x1; + } else if (yy > boundy) { + yy = boundy; + w = Math.abs(yy - y1) * aspect; + xx = rw < 0 ? x1 - w : w + x1; + } + } + + // Magic %-) + if (xx > x1) { // right side + if (xx - x1 < min_x) { + xx = x1 + min_x; + } else if (xx - x1 > max_x) { + xx = x1 + max_x; + } + if (yy > y1) { + yy = y1 + (xx - x1) / aspect; + } else { + yy = y1 - (xx - x1) / aspect; + } + } else if (xx < x1) { // left side + if (x1 - xx < min_x) { + xx = x1 - min_x; + } else if (x1 - xx > max_x) { + xx = x1 - max_x; + } + if (yy > y1) { + yy = y1 + (x1 - xx) / aspect; + } else { + yy = y1 - (x1 - xx) / aspect; + } + } + + if (xx < 0) { + x1 -= xx; + xx = 0; + } else if (xx > boundx) { + x1 -= xx - boundx; + xx = boundx; + } + + if (yy < 0) { + y1 -= yy; + yy = 0; + } else if (yy > boundy) { + y1 -= yy - boundy; + yy = boundy; + } + + return makeObj(flipCoords(x1, y1, xx, yy)); + } + //}}} + function rebound(p) //{{{ + { + if (p[0] < 0) p[0] = 0; + if (p[1] < 0) p[1] = 0; + + if (p[0] > boundx) p[0] = boundx; + if (p[1] > boundy) p[1] = boundy; + + return [Math.round(p[0]), Math.round(p[1])]; + } + //}}} + function flipCoords(x1, y1, x2, y2) //{{{ + { + var xa = x1, + xb = x2, + ya = y1, + yb = y2; + if (x2 < x1) { + xa = x2; + xb = x1; + } + if (y2 < y1) { + ya = y2; + yb = y1; + } + return [xa, ya, xb, yb]; + } + //}}} + function getRect() //{{{ + { + var xsize = x2 - x1, + ysize = y2 - y1, + delta; + + if (xlimit && (Math.abs(xsize) > xlimit)) { + x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); + } + if (ylimit && (Math.abs(ysize) > ylimit)) { + y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); + } + + if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) { + y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale); + } + if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) { + x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale); + } + + if (x1 < 0) { + x2 -= x1; + x1 -= x1; + } + if (y1 < 0) { + y2 -= y1; + y1 -= y1; + } + if (x2 < 0) { + x1 -= x2; + x2 -= x2; + } + if (y2 < 0) { + y1 -= y2; + y2 -= y2; + } + if (x2 > boundx) { + delta = x2 - boundx; + x1 -= delta; + x2 -= delta; + } + if (y2 > boundy) { + delta = y2 - boundy; + y1 -= delta; + y2 -= delta; + } + if (x1 > boundx) { + delta = x1 - boundy; + y2 -= delta; + y1 -= delta; + } + if (y1 > boundy) { + delta = y1 - boundy; + y2 -= delta; + y1 -= delta; + } + + return makeObj(flipCoords(x1, y1, x2, y2)); + } + //}}} + function makeObj(a) //{{{ + { + return { + x: a[0], + y: a[1], + x2: a[2], + y2: a[3], + w: a[2] - a[0], + h: a[3] - a[1] + }; + } + //}}} + + return { + flipCoords: flipCoords, + setPressed: setPressed, + setCurrent: setCurrent, + getOffset: getOffset, + moveOffset: moveOffset, + getCorner: getCorner, + getFixed: getFixed + }; + }()); + + //}}} + // Shade Module {{{ + var Shade = (function() { + var enabled = false, + holder = $('
      ').css({ + position: 'absolute', + zIndex: 240, + opacity: 0 + }), + shades = { + top: createShade(), + left: createShade().height(boundy), + right: createShade().height(boundy), + bottom: createShade() + }; + + function resizeShades(w,h) { + shades.left.css({ height: px(h) }); + shades.right.css({ height: px(h) }); + } + function updateAuto() + { + return updateShade(Coords.getFixed()); + } + function updateShade(c) + { + shades.top.css({ + left: px(c.x), + width: px(c.w), + height: px(c.y) + }); + shades.bottom.css({ + top: px(c.y2), + left: px(c.x), + width: px(c.w), + height: px(boundy-c.y2) + }); + shades.right.css({ + left: px(c.x2), + width: px(boundx-c.x2) + }); + shades.left.css({ + width: px(c.x) + }); + } + function createShade() { + return $('
      ').css({ + position: 'absolute', + backgroundColor: options.shadeColor||options.bgColor + }).appendTo(holder); + } + function enableShade() { + if (!enabled) { + enabled = true; + holder.insertBefore($img); + updateAuto(); + Selection.setBgOpacity(1,0,1); + $img2.hide(); + + setBgColor(options.shadeColor||options.bgColor,1); + if (Selection.isAwake()) + { + setOpacity(options.bgOpacity,1); + } + else setOpacity(1,1); + } + } + function setBgColor(color,now) { + colorChangeMacro(getShades(),color,now); + } + function disableShade() { + if (enabled) { + holder.remove(); + $img2.show(); + enabled = false; + if (Selection.isAwake()) { + Selection.setBgOpacity(options.bgOpacity,1,1); + } else { + Selection.setBgOpacity(1,1,1); + Selection.disableHandles(); + } + colorChangeMacro($div,0,1); + } + } + function setOpacity(opacity,now) { + if (enabled) { + if (options.bgFade && !now) { + holder.animate({ + opacity: 1-opacity + },{ + queue: false, + duration: options.fadeTime + }); + } + else holder.css({opacity:1-opacity}); + } + } + function refreshAll() { + options.shade ? enableShade() : disableShade(); + if (Selection.isAwake()) setOpacity(options.bgOpacity); + } + function getShades() { + return holder.children(); + } + + return { + update: updateAuto, + updateRaw: updateShade, + getShades: getShades, + setBgColor: setBgColor, + enable: enableShade, + disable: disableShade, + resize: resizeShades, + refresh: refreshAll, + opacity: setOpacity + }; + }()); + // }}} + // Selection Module {{{ + var Selection = (function () { + var awake, + hdep = 370, + borders = {}, + handle = {}, + dragbar = {}, + seehandles = false; + + // Private Methods + function insertBorder(type) //{{{ + { + var jq = $('
      ').css({ + position: 'absolute', + opacity: options.borderOpacity + }).addClass(cssClass(type)); + $img_holder.append(jq); + return jq; + } + //}}} + function dragDiv(ord, zi) //{{{ + { + var jq = $('
      ').mousedown(createDragger(ord)).css({ + cursor: ord + '-resize', + position: 'absolute', + zIndex: zi + }).addClass('ord-'+ord); + + if (Touch.support) { + jq.bind('touchstart.jcrop', Touch.createDragger(ord)); + } + + $hdl_holder.append(jq); + return jq; + } + //}}} + function insertHandle(ord) //{{{ + { + var hs = options.handleSize, + + div = dragDiv(ord, hdep++).css({ + opacity: options.handleOpacity + }).addClass(cssClass('handle')); + + if (hs) { div.width(hs).height(hs); } + + return div; + } + //}}} + function insertDragbar(ord) //{{{ + { + return dragDiv(ord, hdep++).addClass('jcrop-dragbar'); + } + //}}} + function createDragbars(li) //{{{ + { + var i; + for (i = 0; i < li.length; i++) { + dragbar[li[i]] = insertDragbar(li[i]); + } + } + //}}} + function createBorders(li) //{{{ + { + var cl,i; + for (i = 0; i < li.length; i++) { + switch(li[i]){ + case'n': cl='hline'; break; + case's': cl='hline bottom'; break; + case'e': cl='vline right'; break; + case'w': cl='vline'; break; + } + borders[li[i]] = insertBorder(cl); + } + } + //}}} + function createHandles(li) //{{{ + { + var i; + for (i = 0; i < li.length; i++) { + handle[li[i]] = insertHandle(li[i]); + } + } + //}}} + function moveto(x, y) //{{{ + { + if (!options.shade) { + $img2.css({ + top: px(-y), + left: px(-x) + }); + } + $sel.css({ + top: px(y), + left: px(x) + }); + } + //}}} + function resize(w, h) //{{{ + { + $sel.width(Math.round(w)).height(Math.round(h)); + } + //}}} + function refresh() //{{{ + { + var c = Coords.getFixed(); + + Coords.setPressed([c.x, c.y]); + Coords.setCurrent([c.x2, c.y2]); + + updateVisible(); + } + //}}} + + // Internal Methods + function updateVisible(select) //{{{ + { + if (awake) { + return update(select); + } + } + //}}} + function update(select) //{{{ + { + var c = Coords.getFixed(); + + resize(c.w, c.h); + moveto(c.x, c.y); + if (options.shade) Shade.updateRaw(c); + + awake || show(); + + if (select) { + options.onSelect.call(api, unscale(c)); + } else { + options.onChange.call(api, unscale(c)); + } + } + //}}} + function setBgOpacity(opacity,force,now) //{{{ + { + if (!awake && !force) return; + if (options.bgFade && !now) { + $img.animate({ + opacity: opacity + },{ + queue: false, + duration: options.fadeTime + }); + } else { + $img.css('opacity', opacity); + } + } + //}}} + function show() //{{{ + { + $sel.show(); + + if (options.shade) Shade.opacity(bgopacity); + else setBgOpacity(bgopacity,true); + + awake = true; + } + //}}} + function release() //{{{ + { + disableHandles(); + $sel.hide(); + + if (options.shade) Shade.opacity(1); + else setBgOpacity(1); + + awake = false; + options.onRelease.call(api); + } + //}}} + function showHandles() //{{{ + { + if (seehandles) { + $hdl_holder.show(); + } + } + //}}} + function enableHandles() //{{{ + { + seehandles = true; + if (options.allowResize) { + $hdl_holder.show(); + return true; + } + } + //}}} + function disableHandles() //{{{ + { + seehandles = false; + $hdl_holder.hide(); + } + //}}} + function animMode(v) //{{{ + { + if (v) { + animating = true; + disableHandles(); + } else { + animating = false; + enableHandles(); + } + } + //}}} + function done() //{{{ + { + animMode(false); + refresh(); + } + //}}} + // Insert draggable elements {{{ + // Insert border divs for outline + + if (options.dragEdges && $.isArray(options.createDragbars)) + createDragbars(options.createDragbars); + + if ($.isArray(options.createHandles)) + createHandles(options.createHandles); + + if (options.drawBorders && $.isArray(options.createBorders)) + createBorders(options.createBorders); + + //}}} + + // This is a hack for iOS5 to support drag/move touch functionality + $(document).bind('touchstart.jcrop-ios',function(e) { + if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation(); + }); + + var $track = newTracker().mousedown(createDragger('move')).css({ + cursor: 'move', + position: 'absolute', + zIndex: 360 + }); + + if (Touch.support) { + $track.bind('touchstart.jcrop', Touch.createDragger('move')); + } + + $img_holder.append($track); + disableHandles(); + + return { + updateVisible: updateVisible, + update: update, + release: release, + refresh: refresh, + isAwake: function () { + return awake; + }, + setCursor: function (cursor) { + $track.css('cursor', cursor); + }, + enableHandles: enableHandles, + enableOnly: function () { + seehandles = true; + }, + showHandles: showHandles, + disableHandles: disableHandles, + animMode: animMode, + setBgOpacity: setBgOpacity, + done: done + }; + }()); + + //}}} + // Tracker Module {{{ + var Tracker = (function () { + var onMove = function () {}, + onDone = function () {}, + trackDoc = options.trackDocument; + + function toFront(touch) //{{{ + { + $trk.css({ + zIndex: 450 + }); + + if (touch) + $(document) + .bind('touchmove.jcrop', trackTouchMove) + .bind('touchend.jcrop', trackTouchEnd); + + else if (trackDoc) + $(document) + .bind('mousemove.jcrop',trackMove) + .bind('mouseup.jcrop',trackUp); + } + //}}} + function toBack() //{{{ + { + $trk.css({ + zIndex: 290 + }); + $(document).unbind('.jcrop'); + } + //}}} + function trackMove(e) //{{{ + { + onMove(mouseAbs(e)); + return false; + } + //}}} + function trackUp(e) //{{{ + { + e.preventDefault(); + e.stopPropagation(); + + if (btndown) { + btndown = false; + + onDone(mouseAbs(e)); + + if (Selection.isAwake()) { + options.onSelect.call(api, unscale(Coords.getFixed())); + } + + toBack(); + onMove = function () {}; + onDone = function () {}; + } + + return false; + } + //}}} + function activateHandlers(move, done, touch) //{{{ + { + btndown = true; + onMove = move; + onDone = done; + toFront(touch); + return false; + } + //}}} + function trackTouchMove(e) //{{{ + { + onMove(mouseAbs(Touch.cfilter(e))); + return false; + } + //}}} + function trackTouchEnd(e) //{{{ + { + return trackUp(Touch.cfilter(e)); + } + //}}} + function setCursor(t) //{{{ + { + $trk.css('cursor', t); + } + //}}} + + if (!trackDoc) { + $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp); + } + + $img.before($trk); + return { + activateHandlers: activateHandlers, + setCursor: setCursor + }; + }()); + //}}} + // KeyManager Module {{{ + var KeyManager = (function () { + var $keymgr = $('').css({ + position: 'fixed', + left: '-120px', + width: '12px' + }).addClass('jcrop-keymgr'), + + $keywrap = $('
      ').css({ + position: 'absolute', + overflow: 'hidden' + }).append($keymgr); + + function watchKeys() //{{{ + { + if (options.keySupport) { + $keymgr.show(); + $keymgr.focus(); + } + } + //}}} + function onBlur(e) //{{{ + { + $keymgr.hide(); + } + //}}} + function doNudge(e, x, y) //{{{ + { + if (options.allowMove) { + Coords.moveOffset([x, y]); + Selection.updateVisible(true); + } + e.preventDefault(); + e.stopPropagation(); + } + //}}} + function parseKey(e) //{{{ + { + if (e.ctrlKey || e.metaKey) { + return true; + } + shift_down = e.shiftKey ? true : false; + var nudge = shift_down ? 10 : 1; + + switch (e.keyCode) { + case 37: + doNudge(e, -nudge, 0); + break; + case 39: + doNudge(e, nudge, 0); + break; + case 38: + doNudge(e, 0, -nudge); + break; + case 40: + doNudge(e, 0, nudge); + break; + case 27: + if (options.allowSelect) Selection.release(); + break; + case 9: + return true; + } + + return false; + } + //}}} + + if (options.keySupport) { + $keymgr.keydown(parseKey).blur(onBlur); + if (ie6mode || !options.fixedSupport) { + $keymgr.css({ + position: 'absolute', + left: '-20px' + }); + $keywrap.append($keymgr).insertBefore($img); + } else { + $keymgr.insertBefore($img); + } + } + + + return { + watchKeys: watchKeys + }; + }()); + //}}} + // }}} + // API methods {{{ + function setClass(cname) //{{{ + { + $div.removeClass().addClass(cssClass('holder')).addClass(cname); + } + //}}} + function animateTo(a, callback) //{{{ + { + var x1 = a[0] / xscale, + y1 = a[1] / yscale, + x2 = a[2] / xscale, + y2 = a[3] / yscale; + + if (animating) { + return; + } + + var animto = Coords.flipCoords(x1, y1, x2, y2), + c = Coords.getFixed(), + initcr = [c.x, c.y, c.x2, c.y2], + animat = initcr, + interv = options.animationDelay, + ix1 = animto[0] - initcr[0], + iy1 = animto[1] - initcr[1], + ix2 = animto[2] - initcr[2], + iy2 = animto[3] - initcr[3], + pcent = 0, + velocity = options.swingSpeed; + + x1 = animat[0]; + y1 = animat[1]; + x2 = animat[2]; + y2 = animat[3]; + + Selection.animMode(true); + var anim_timer; + + function queueAnimator() { + window.setTimeout(animator, interv); + } + var animator = (function () { + return function () { + pcent += (100 - pcent) / velocity; + + animat[0] = Math.round(x1 + ((pcent / 100) * ix1)); + animat[1] = Math.round(y1 + ((pcent / 100) * iy1)); + animat[2] = Math.round(x2 + ((pcent / 100) * ix2)); + animat[3] = Math.round(y2 + ((pcent / 100) * iy2)); + + if (pcent >= 99.8) { + pcent = 100; + } + if (pcent < 100) { + setSelectRaw(animat); + queueAnimator(); + } else { + Selection.done(); + Selection.animMode(false); + if (typeof(callback) === 'function') { + callback.call(api); + } + } + }; + }()); + queueAnimator(); + } + //}}} + function setSelect(rect) //{{{ + { + setSelectRaw([rect[0] / xscale, rect[1] / yscale, rect[2] / xscale, rect[3] / yscale]); + options.onSelect.call(api, unscale(Coords.getFixed())); + Selection.enableHandles(); + } + //}}} + function setSelectRaw(l) //{{{ + { + Coords.setPressed([l[0], l[1]]); + Coords.setCurrent([l[2], l[3]]); + Selection.update(); + } + //}}} + function tellSelect() //{{{ + { + return unscale(Coords.getFixed()); + } + //}}} + function tellScaled() //{{{ + { + return Coords.getFixed(); + } + //}}} + function setOptionsNew(opt) //{{{ + { + setOptions(opt); + interfaceUpdate(); + } + //}}} + function disableCrop() //{{{ + { + options.disabled = true; + Selection.disableHandles(); + Selection.setCursor('default'); + Tracker.setCursor('default'); + } + //}}} + function enableCrop() //{{{ + { + options.disabled = false; + interfaceUpdate(); + } + //}}} + function cancelCrop() //{{{ + { + Selection.done(); + Tracker.activateHandlers(null, null); + } + //}}} + function destroy() //{{{ + { + $div.remove(); + $origimg.show(); + $origimg.css('visibility','visible'); + $(obj).removeData('Jcrop'); + } + //}}} + function setImage(src, callback) //{{{ + { + Selection.release(); + disableCrop(); + var img = new Image(); + img.onload = function () { + var iw = img.width; + var ih = img.height; + var bw = options.boxWidth; + var bh = options.boxHeight; + $img.width(iw).height(ih); + $img.attr('src', src); + $img2.attr('src', src); + presize($img, bw, bh); + boundx = $img.width(); + boundy = $img.height(); + $img2.width(boundx).height(boundy); + $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2)); + $div.width(boundx).height(boundy); + Shade.resize(boundx,boundy); + enableCrop(); + + if (typeof(callback) === 'function') { + callback.call(api); + } + }; + img.src = src; + } + //}}} + function colorChangeMacro($obj,color,now) { + var mycolor = color || options.bgColor; + if (options.bgFade && supportsColorFade() && options.fadeTime && !now) { + $obj.animate({ + backgroundColor: mycolor + }, { + queue: false, + duration: options.fadeTime + }); + } else { + $obj.css('backgroundColor', mycolor); + } + } + function interfaceUpdate(alt) //{{{ + // This method tweaks the interface based on options object. + // Called when options are changed and at end of initialization. + { + if (options.allowResize) { + if (alt) { + Selection.enableOnly(); + } else { + Selection.enableHandles(); + } + } else { + Selection.disableHandles(); + } + + Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); + Selection.setCursor(options.allowMove ? 'move' : 'default'); + + if (options.hasOwnProperty('trueSize')) { + xscale = options.trueSize[0] / boundx; + yscale = options.trueSize[1] / boundy; + } + + if (options.hasOwnProperty('setSelect')) { + setSelect(options.setSelect); + Selection.done(); + delete(options.setSelect); + } + + Shade.refresh(); + + if (options.bgColor != bgcolor) { + colorChangeMacro( + options.shade? Shade.getShades(): $div, + options.shade? + (options.shadeColor || options.bgColor): + options.bgColor + ); + bgcolor = options.bgColor; + } + + if (bgopacity != options.bgOpacity) { + bgopacity = options.bgOpacity; + if (options.shade) Shade.refresh(); + else Selection.setBgOpacity(bgopacity); + } + + xlimit = options.maxSize[0] || 0; + ylimit = options.maxSize[1] || 0; + xmin = options.minSize[0] || 0; + ymin = options.minSize[1] || 0; + + if (options.hasOwnProperty('outerImage')) { + $img.attr('src', options.outerImage); + delete(options.outerImage); + } + + Selection.refresh(); + } + //}}} + //}}} + + if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection); + + $hdl_holder.hide(); + interfaceUpdate(true); + + var api = { + setImage: setImage, + animateTo: animateTo, + setSelect: setSelect, + setOptions: setOptionsNew, + tellSelect: tellSelect, + tellScaled: tellScaled, + setClass: setClass, + + disable: disableCrop, + enable: enableCrop, + cancel: cancelCrop, + release: Selection.release, + destroy: destroy, + + focus: KeyManager.watchKeys, + + getBounds: function () { + return [boundx * xscale, boundy * yscale]; + }, + getWidgetSize: function () { + return [boundx, boundy]; + }, + getScaleFactor: function () { + return [xscale, yscale]; + }, + getOptions: function() { + // careful: internal values are returned + return options; + }, + + ui: { + holder: $div, + selection: $sel + } + }; + + if (is_msie) $div.bind('selectstart', function () { return false; }); + + $origimg.data('Jcrop', api); + return api; + }; + $.fn.Jcrop = function (options, callback) //{{{ + { + var api; + // Iterate over each object, attach Jcrop + this.each(function () { + // If we've already attached to this object + if ($(this).data('Jcrop')) { + // The API can be requested this way (undocumented) + if (options === 'api') return $(this).data('Jcrop'); + // Otherwise, we just reset the options... + else $(this).data('Jcrop').setOptions(options); + } + // If we haven't been attached, preload and attach + else { + if (this.tagName == 'IMG') + $.Jcrop.Loader(this,function(){ + $(this).css({display:'block',visibility:'hidden'}); + api = $.Jcrop(this, options); + if ($.isFunction(callback)) callback.call(api); + }); + else { + $(this).css({display:'block',visibility:'hidden'}); + api = $.Jcrop(this, options); + if ($.isFunction(callback)) callback.call(api); + } + } + }); + + // Return "this" so the object is chainable (jQuery-style) + return this; + }; + //}}} + // $.Jcrop.Loader - basic image loader {{{ + + $.Jcrop.Loader = function(imgobj,success,error){ + var $img = $(imgobj), img = $img[0]; + + function completeCheck(){ + if (img.complete) { + $img.unbind('.jcloader'); + if ($.isFunction(success)) success.call(img); + } + else window.setTimeout(completeCheck,50); + } + + $img + .bind('load.jcloader',completeCheck) + .bind('error.jcloader',function(e){ + $img.unbind('.jcloader'); + if ($.isFunction(error)) error.call(img); + }); + + if (img.complete && $.isFunction(success)){ + $img.unbind('.jcloader'); + success.call(img); + } + }; + + //}}} + // Global Defaults {{{ + $.Jcrop.defaults = { + + // Basic Settings + allowSelect: true, + allowMove: true, + allowResize: true, + + trackDocument: true, + + // Styling Options + baseClass: 'jcrop', + addClass: null, + bgColor: 'black', + bgOpacity: 0.6, + bgFade: false, + borderOpacity: 0.4, + handleOpacity: 0.5, + handleSize: null, + + aspectRatio: 0, + keySupport: true, + createHandles: ['n','s','e','w','nw','ne','se','sw'], + createDragbars: ['n','s','e','w'], + createBorders: ['n','s','e','w'], + drawBorders: true, + dragEdges: true, + fixedSupport: true, + touchSupport: null, + + shade: null, + + boxWidth: 0, + boxHeight: 0, + boundary: 2, + fadeTime: 400, + animationDelay: 20, + swingSpeed: 3, + + minSelect: [0, 0], + maxSize: [0, 0], + minSize: [0, 0], + + // Callbacks / Event Handlers + onChange: function () {}, + onSelect: function () {}, + onDblClick: function () {}, + onRelease: function () {} + }; + + // }}} +}(jQuery)); diff --git a/bower_components/blueimp-load-image/js/vendor/jquery.js b/bower_components/blueimp-load-image/js/vendor/jquery.js new file mode 100644 index 0000000000..6feb11086f --- /dev/null +++ b/bower_components/blueimp-load-image/js/vendor/jquery.js @@ -0,0 +1,10351 @@ +/*! + * jQuery JavaScript Library v1.11.3 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-28T16:19Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper window is present, + // execute the factory and get jQuery + // For environments that do not inherently posses a window with a document + // (such as Node.js), expose a jQuery-making factory as module.exports + // This accentuates the need for the creation of a real window + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +// + +var deletedIds = []; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.11.3", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( support.ownLast ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !(--remaining) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = i !== "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery(function() { + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +}); + + + + +(function() { + var div = document.createElement( "div" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( elem ) { + var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute("classid") === noData; +}; + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; +}; +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // Setup + div.innerHTML = "
      a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + div.innerHTML = ""; + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
      ", "
      " ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
      " ], + tr: [ 2, "", "
      " ], + col: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
      ", "
      " ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!support.noCloneEvent || !support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
      " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "'); + this._resize(width, height); + this._config.onContentLoaded.call(this); + if (this._$modalArrows) //hide the arrows when showing video + this._$modalArrows.css('display', 'none'); + this._toggleLoading(false); + return this; + } + }, { + key: '_showVideoIframe', + value: function _showVideoIframe(url, width, height, $containerForElement) { + // should be used for videos only. for remote content use loadRemoteContent (data-type=url) + height = height || width; // default to square + $containerForElement.html('
      '); + this._resize(width, height); + this._config.onContentLoaded.call(this); + if (this._$modalArrows) this._$modalArrows.css('display', 'none'); //hide the arrows when showing video + this._toggleLoading(false); + return this; + } + }, { + key: '_showHtml5Video', + value: function _showHtml5Video(url, $containerForElement) { + // should be used for videos only. for remote content use loadRemoteContent (data-type=url) + var width = this._$element.data('width') || 560; + var height = this._$element.data('height') || width / (560 / 315); + $containerForElement.html('
      '); + this._resize(width, height); + this._config.onContentLoaded.call(this); + if (this._$modalArrows) this._$modalArrows.css('display', 'none'); //hide the arrows when showing video + this._toggleLoading(false); + return this; + } + }, { + key: '_loadRemoteContent', + value: function _loadRemoteContent(url, $containerForElement) { + var _this3 = this; + + var width = this._$element.data('width') || 560; + var height = this._$element.data('height') || 560; + + var disableExternalCheck = this._$element.data('disableExternalCheck') || false; + this._toggleLoading(false); + + // external urls are loading into an iframe + // local ajax can be loaded into the container itself + if (!disableExternalCheck && !this._isExternal(url)) { + $containerForElement.load(url, $.proxy(function () { + return _this3._$element.trigger('loaded.bs.modal');l; + })); + } else { + $containerForElement.html(''); + this._config.onContentLoaded.call(this); + } + + if (this._$modalArrows) //hide the arrows when remote content + this._$modalArrows.css('display', 'none'); + + this._resize(width, height); + return this; + } + }, { + key: '_isExternal', + value: function _isExternal(url) { + var match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/); + if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) return true; + + if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(':(' + ({ + "http:": 80, + "https:": 443 + })[location.protocol] + ')?$'), "") !== location.host) return true; + + return false; + } + }, { + key: '_error', + value: function _error(message) { + console.error(message); + this._containerToUse().html(message); + this._resize(300, 300); + return this; + } + }, { + key: '_preloadImageByIndex', + value: function _preloadImageByIndex(startIndex, numberOfTimes) { + + if (!this._$galleryItems) return; + + var next = $(this._$galleryItems.get(startIndex), false); + if (typeof next == 'undefined') return; + + var src = next.attr('data-remote') || next.attr('href'); + if (next.attr('data-type') === 'image' || this._isImage(src)) this._preloadImage(src, false); + + if (numberOfTimes > 0) return this._preloadImageByIndex(startIndex + 1, numberOfTimes - 1); + } + }, { + key: '_preloadImage', + value: function _preloadImage(src, $containerForImage) { + var _this4 = this; + + $containerForImage = $containerForImage || false; + + var img = new Image(); + if ($containerForImage) { + (function () { + + // if loading takes > 200ms show a loader + var loadingTimeout = setTimeout(function () { + $containerForImage.append(_this4._config.loadingMessage); + }, 200); + + img.onload = function () { + if (loadingTimeout) clearTimeout(loadingTimeout); + loadingTimeout = null; + var image = $(''); + image.attr('src', img.src); + image.addClass('img-fluid'); + $containerForImage.html(image); + if (_this4._$modalArrows) _this4._$modalArrows.css('display', ''); // remove display to default to css property + + _this4._resize(img.width, img.height); + _this4._toggleLoading(false); + return _this4._config.onContentLoaded.call(_this4); + }; + img.onerror = function () { + _this4._toggleLoading(false); + return _this4._error(_this4._config.strings.fail + (' ' + src)); + }; + })(); + } + + img.src = src; + return img; + } + }, { + key: '_resize', + value: function _resize(width, height) { + + height = height || width; + this._wantedWidth = width; + this._wantedHeight = height; + + // if width > the available space, scale down the expected width and height + var widthBorderAndPadding = this._padding.left + this._padding.right + this._border.left + this._border.right; + var maxWidth = Math.min(width + widthBorderAndPadding, this._config.doc.body.clientWidth); + if (width + widthBorderAndPadding > maxWidth) { + height = (maxWidth - widthBorderAndPadding) / width * height; + width = maxWidth; + } else width = width + widthBorderAndPadding; + + var headerHeight = 0, + footerHeight = 0; + + // as the resize is performed the modal is show, the calculate might fail + // if so, default to the default sizes + if (this._footerIsShown) footerHeight = this._$modalFooter.outerHeight(true) || 55; + + if (this._titleIsShown) headerHeight = this._$modalHeader.outerHeight(true) || 67; + + var borderPadding = this._padding.top + this._padding.bottom + this._border.bottom + this._border.top; + + //calculated each time as resizing the window can cause them to change due to Bootstraps fluid margins + var margins = parseFloat(this._$modalDialog.css('margin-top')) + parseFloat(this._$modalDialog.css('margin-bottom')); + + var maxHeight = Math.min(height, $(window).height() - borderPadding - margins - headerHeight - footerHeight); + if (height > maxHeight) { + // if height > the available height, scale down the width + var factor = Math.min(maxHeight / height, 1); + width = Math.ceil(factor * width); + } + + this._$lightboxContainer.css('height', maxHeight); + this._$modalDialog.css('width', 'auto').css('maxWidth', width); + + this._$modal.modal('_handleUpdate'); + return this; + } + }], [{ + key: '_jQueryInterface', + value: function _jQueryInterface(config) { + var _this5 = this; + + config = config || {}; + return this.each(function () { + var $this = $(_this5); + var _config = $.extend({}, Lightbox.Default, $this.data(), typeof config === 'object' && config); + + new Lightbox(_this5, _config); + }); + } + }]); + + return Lightbox; + })(); + + $.fn[NAME] = Lightbox._jQueryInterface; + $.fn[NAME].Constructor = Lightbox; + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Lightbox._jQueryInterface; + }; + + return Lightbox; +})(jQuery); +//# sourceMappingURL=ekko-lightbox.js.map + +}(jQuery); diff --git a/bower_components/ekko-lightbox/dist/ekko-lightbox.js.map b/bower_components/ekko-lightbox/dist/ekko-lightbox.js.map new file mode 100644 index 0000000000..c42db921a2 --- /dev/null +++ b/bower_components/ekko-lightbox/dist/ekko-lightbox.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../ekko-lightbox.js"],"names":[],"mappings":";;;;;;AAAA,IAAM,QAAQ,GAAG,CAAC,UAAC,CAAC,EAAK;;AAExB,KAAM,IAAI,GAAG,cAAc,CAAA;AAC3B,KAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;;AAErC,KAAM,OAAO,GAAG;AACf,OAAK,EAAE,EAAE;AACT,QAAM,EAAE,EAAE;AACV,YAAU,EAAE,IAAI;AAChB,MAAI,EAAE,IAAI;AACV,iBAAe,EAAE,KAAK;AACtB,gBAAc,EAAE,2EAA2E;AAC3F,WAAS,EAAE,uBAAuB;AAClC,YAAU,EAAE,uBAAuB;AACnC,SAAO,EAAE;AACR,QAAK,EAAE,OAAO;AACd,OAAI,EAAE,uBAAuB;AAC7B,OAAI,EAAE,qEAAqE;GAC3E;AACD,KAAG,EAAE,QAAQ;AACb,QAAM,EAAA,kBAAG,EAAE;AACX,SAAO,EAAA,mBAAG,EAAE;AACZ,QAAM,EAAA,kBAAG,EAAE;AACX,UAAQ,EAAA,oBAAG,EAAE;AACb,YAAU,EAAA,sBAAG,EAAE;AACf,iBAAe,EAAA,2BAAG,EAAE;EACpB,CAAA;;KAEK,QAAQ;eAAR,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;QA4BK,eAAG;AACpB,WAAO,OAAO,CAAA;IACd;;;AAEU,WAhCN,QAAQ,CAgCD,QAAQ,EAAE,MAAM,EAAE;;;yBAhCzB,QAAQ;;AAiCZ,OAAI,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAC5C,OAAI,CAAC,aAAa,GAAG,IAAI,CAAA;AACzB,OAAI,CAAC,aAAa,GAAG,CAAC,CAAA;AACtB,OAAI,CAAC,YAAY,GAAG,IAAI,CAAA;AACxB,OAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;AACpB,OAAI,CAAC,OAAO,GAAG,IAAI,CAAA;AACnB,OAAI,CAAC,aAAa,GAAG,KAAK,CAAA;AAC1B,OAAI,CAAC,cAAc,GAAG,KAAK,CAAA;AAC3B,OAAI,CAAC,YAAY,GAAG,CAAC,CAAA;AACrB,OAAI,CAAC,aAAa,GAAG,CAAC,CAAA;AACtB,OAAI,CAAC,QAAQ,qBAAmB,IAAI,CAAC,KAAK,CAAC,AAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAI,CAAC,CAAC,AAAE,CAAC;AACzE,OAAI,CAAC,SAAS,GAAG,QAAQ,YAAY,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;;AAEpE,OAAI,MAAM,kCAA+B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,EAAE,GAAG,uBAAuB,CAAA,8EAAyE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,mFAA6E,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAA,gBAAa,CAAC;AACtV,OAAI,MAAM,kCAA+B,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,uBAAuB,CAAA,UAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAA,WAAQ,CAAC;AACvI,OAAI,IAAI,GAAG,oKAAoK,CAAA;AAC/K,OAAI,MAAM,6EAA2E,MAAM,GAAG,IAAI,GAAG,MAAM,iBAAc,CAAA;AACzH,IAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,eAAa,IAAI,CAAC,QAAQ,wGAAmG,MAAM,YAAS,CAAA;;AAE3K,OAAI,CAAC,OAAO,GAAG,CAAC,OAAK,IAAI,CAAC,QAAQ,EAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACvD,OAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAA;AAC/D,OAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAA;AACjE,OAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAA;AAC3D,OAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAA;AAC/D,OAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAA;;AAE/D,OAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAA;AACpF,OAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAA;AACnF,OAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAA;;AAElF,OAAI,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;AACvC,OAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;;AAExC,OAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAClD,OAAI,IAAI,CAAC,YAAY,EAAE;AACtB,QAAI,CAAC,cAAc,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,sBAAoB,IAAI,CAAC,YAAY,QAAK,CAAA;AACrF,QAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAC9D,KAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,sBAAsB,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;;;AAG3E,QAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9D,SAAI,CAAC,mBAAmB,CAAC,MAAM,yDAAuD,IAAI,CAAC,OAAO,CAAC,SAAS,wBAAmB,IAAI,CAAC,OAAO,CAAC,UAAU,gBAAa,CAAA;AACnK,SAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAA;AAC3F,SAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,UAAA,KAAK,EAAI;AAC9D,WAAK,CAAC,cAAc,EAAE,CAAA;AACtB,aAAO,MAAK,YAAY,EAAE,CAAA;MAC1B,CAAC,CAAA;AACF,SAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,UAAA,KAAK,EAAI;AAC7D,WAAK,CAAC,cAAc,EAAE,CAAA;AACtB,aAAO,MAAK,aAAa,EAAE,CAAA;MAC3B,CAAC,CAAA;KACF;IACD;;AAED,OAAI,CAAC,OAAO,CACX,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACnD,EAAE,CAAC,gBAAgB,EAAE,YAAM;AAC3B,UAAK,cAAc,CAAC,IAAI,CAAC,CAAA;AACzB,UAAK,OAAO,EAAE,CAAA;AACd,WAAO,MAAK,OAAO,CAAC,OAAO,CAAC,IAAI,OAAM,CAAA;IACtC,CAAC,CACD,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACnD,EAAE,CAAC,iBAAiB,EAAE,YAAM;AAC5B,QAAI,MAAK,YAAY,EAAE;AACtB,MAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;AACvC,MAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;KACpC;AACD,UAAK,OAAO,CAAC,MAAM,EAAE,CAAA;AACrB,WAAO,MAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAM,CAAA;IACvC,CAAC,CACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;;AAEpB,IAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,qBAAqB,EAAE,YAAM;AACzC,UAAK,OAAO,CAAC,MAAK,YAAY,EAAE,MAAK,aAAa,CAAC,CAAA;IACnD,CAAC,CAAA;GACF;;eA5GI,QAAQ;;UA8GN,mBAAG;AACT,WAAO,IAAI,CAAC,SAAS,CAAC;IACtB;;;UAEI,iBAAG;AACP,WAAO,IAAI,CAAC,OAAO,CAAC;IACpB;;;UAES,oBAAC,KAAK,EAAE;;AAEjB,QAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAC,CAAC,EACpD,OAAO,IAAI,CAAA;;AAEZ,QAAI,CAAC,aAAa,GAAG,KAAK,CAAA;;AAE1B,QAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;AAC/D,QAAI,CAAC,OAAO,EAAE,CAAC;IACf;;;UAEW,wBAAG;;AAEd,QAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EACnC,OAAM;;AAEP,QAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAA;AAEnD,SAAI,CAAC,aAAa,EAAE,CAAA;;AAErB,QAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;AAC9D,WAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC1C;;;UAEY,yBAAG;;AAEf,QAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EACnC,OAAM;;AAEP,QAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EACxD,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;AAEtB,SAAI,CAAC,aAAa,EAAE,CAAA;;AAErB,QAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;AAC/D,WAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC1C;;;UAEI,iBAAG;AACP,WAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC;;;;;UAGkB,6BAAC,KAAK,EAAE;AAC1B,SAAK,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;AAC9B,QAAI,KAAK,CAAC,OAAO,KAAK,EAAE,EACvB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAA;AAC5B,QAAI,KAAK,CAAC,OAAO,KAAK,EAAE,EACvB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAA;IAC3B;;;;;UAGgB,2BAAC,GAAG,EAAE,IAAI,EAAE;;AAE5B,QAAI,GAAG,IAAI,IAAI,KAAK,CAAC;;AAErB,QAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC7B,IAAI,GAAG,OAAO,CAAC;AAChB,QAAG,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAClC,IAAI,GAAG,SAAS,CAAC;AAClB,QAAG,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAChC,IAAI,GAAG,OAAO,CAAC;AAChB,QAAG,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EACpC,IAAI,GAAG,WAAW,CAAC;;AAEpB,QAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EACvF,IAAI,GAAG,KAAK,CAAC;;AAEd,WAAO,IAAI,CAAC;IACZ;;;UAEO,kBAAC,MAAM,EAAE;AAChB,WAAO,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAA;IACtG;;;UAEc,2BAAG;;;;AAEjB,QAAI,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAA;AACnC,QAAI,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAA;;AAErC,QAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACzC,WAAM,GAAG,IAAI,CAAC,iBAAiB,CAAA;AAC/B,aAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAA;KACjC;;AAED,YAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AAC1B,cAAU,CAAC,YAAM;AAChB,SAAG,CAAC,OAAK,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EACxC,OAAK,iBAAiB,CAAC,KAAK,EAAE,CAAA;AAC/B,SAAG,CAAC,OAAK,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EACxC,OAAK,iBAAiB,CAAC,KAAK,EAAE,CAAA;KAC/B,EAAE,GAAG,CAAC,CAAA;;AAEP,UAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACrB,WAAO,MAAM,CAAA;IACb;;;UAEM,mBAAG;;AAET,QAAI,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;AACnC,QAAI,CAAC,qBAAqB,EAAE,CAAA;;AAE5B,QAAI,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACrF,QAAI,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAA;;AAElG,QAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EACrF,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;;AAE9C,YAAO,WAAW;AACjB,UAAK,OAAO;AACX,UAAI,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AACzC,UAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;AAChD,YAAM;AAAA,AACP,UAAK,SAAS;AACb,UAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAC9C,YAAM;AAAA,AACP,UAAK,OAAO;AACX,UAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9D,YAAM;AAAA,AACP,UAAK,WAAW;AACf,UAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;AACtE,YAAM;AAAA,AACP,UAAK,OAAO;AACX,UAAI,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAC5C,YAAM;AAAA,AACP;;AACC,UAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAC/C,YAAM;AAAA,KACP;;AAED,WAAO,IAAI,CAAC;IACZ;;;UAEY,uBAAC,MAAM,EAAE;AACrB,QAAG,CAAC,MAAM,EACT,OAAO,KAAK,CAAC;AACd,QAAI,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAA;AAC7F,WAAO,AAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,GAAI,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IACjE;;;UAEU,qBAAC,MAAM,EAAE;AACnB,WAAO,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAA;IAC7D;;;UAEc,yBAAC,MAAM,EAAE;AACvB,WAAO,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAA;IACjE;;;;;UAGa,wBAAC,IAAI,EAAE;AACpB,QAAI,GAAG,IAAI,IAAI,KAAK,CAAA;AACpB,QAAG,IAAI,EAAE;AACR,SAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACzC,SAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AAC9B,MAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;KACxD,MACI;AACJ,SAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAC1C,SAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC3B,MAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,MAAM,EAAE,CAAA;KAC3D;AACD,WAAO,IAAI,CAAC;IACZ;;;UAEgB,6BAAG;AACnB,WAAO;AACN,QAAG,EAAE,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC;AAClD,UAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC;AACtD,WAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC;AACxD,SAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC;KACpD,CAAA;IACD;;;UAEgB,6BAAG;AACnB,WAAO;AACN,QAAG,EAAE,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;AAC7C,UAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC;AACjD,WAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;AACnD,SAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;KAC/C,CAAA;IACD;;;UAEmB,8BAAC,SAAS,EAAE;AAC/B,WAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,GACrD,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,GAChD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9C;;;UAEoB,iCAAG;AACvB,QAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;AAC9C,QAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;;AAEjD,QAAI,CAAC,aAAa,GAAG,KAAK,CAAA;AAC1B,QAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;AAC1C,SAAI,CAAC,aAAa,GAAG,IAAI,CAAA;AACzB,SAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAA;KAClF,MAEA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;;AAE1C,QAAI,CAAC,cAAc,GAAG,KAAK,CAAA;AAC3B,QAAI,OAAO,EAAE;AACZ,SAAI,CAAC,cAAc,GAAG,IAAI,CAAA;AAC1B,SAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;KACnD,MAEA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;;AAE1C,WAAO,IAAI,CAAC;IACZ;;;UAEgB,2BAAC,MAAM,EAAE,oBAAoB,EAAE;AAC/C,QAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;AACnC,QAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;AAC7E,QAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAA;AAC/C,QAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAK,KAAK,IAAK,GAAG,GAAC,GAAG,CAAA,AAAE,CAAA;AAClE,WAAO,IAAI,CAAC,gBAAgB,8BACA,EAAE,mCAA8B,KAAK,EAChE,KAAK,EACL,MAAM,EACN,oBAAoB,CACpB,CAAC;IACF;;;UAEc,yBAAC,EAAE,EAAE,oBAAoB,EAAE;AACzC,QAAI,KAAK,GAAG,GAAG,CAAA;AACf,QAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAK,KAAK,IAAK,GAAG,GAAC,GAAG,CAAA,AAAE,CAAA;AAClE,WAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAA;IACrF;;;UAEkB,6BAAC,EAAE,EAAE,oBAAoB,EAAE;;AAE7C,QAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAA;AAC/C,QAAI,MAAM,GAAG,KAAK,GAAG,EAAE,CAAC;AACxB,MAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAC3C,wBAAoB,CAAC,IAAI,qBAAmB,KAAK,kBAAa,MAAM,eAAU,EAAE,uDAAoD,CAAC;AACrI,QAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5B,QAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,QAAI,IAAI,CAAC,aAAa;AACrB,SAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC3C,QAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,WAAO,IAAI,CAAC;IACZ;;;UAEe,0BAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE;;AAC1D,UAAM,GAAG,MAAM,IAAI,KAAK,CAAC;AACzB,wBAAoB,CAAC,IAAI,0EAAwE,KAAK,kBAAa,MAAM,eAAU,GAAG,qFAAkF,CAAC;AACzN,QAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5B,QAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,QAAI,IAAI,CAAC,aAAa,EACrB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC3C,QAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,WAAO,IAAI,CAAC;IACZ;;;UAEc,yBAAC,GAAG,EAAE,oBAAoB,EAAE;;AAC1C,QAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAA;AAC/C,QAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAK,KAAK,IAAK,GAAG,GAAC,GAAG,CAAA,AAAE,CAAA;AAClE,wBAAoB,CAAC,IAAI,yEAAuE,KAAK,kBAAa,MAAM,eAAU,GAAG,qFAAkF,CAAC;AACxN,QAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5B,QAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,QAAI,IAAI,CAAC,aAAa,EACrB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC3C,QAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,WAAO,IAAI,CAAC;IACZ;;;UAEiB,4BAAC,GAAG,EAAE,oBAAoB,EAAE;;;AAC7C,QAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;AAChD,QAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;;AAElD,QAAI,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC;AAChF,QAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;;;;AAI3B,QAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;AACpD,yBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,YAAM;AAC5C,aAAO,OAAK,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;MAClD,CAAC,CAAC,CAAC;KAEJ,MAAM;AACN,yBAAoB,CAAC,IAAI,mBAAiB,GAAG,iDAA8C,CAAC;AAC5F,SAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACxC;;AAED,QAAI,IAAI,CAAC,aAAa;AACrB,SAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;;AAE1C,QAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5B,WAAO,IAAI,CAAC;IACZ;;;UAEU,qBAAC,GAAG,EAAE;AAChB,QAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;AACpF,QAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,QAAQ,EACtG,OAAO,IAAI,CAAC;;AAEb,QAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,QAAM,CAAA;AAC1F,YAAO,EAAE,EAAE;AACX,aAAQ,EAAE,GAAG;MACb,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAM,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,IAAI,EACjD,OAAO,IAAI,CAAC;;AAEb,WAAO,KAAK,CAAC;IACb;;;UAEK,gBAAE,OAAO,EAAG;AACjB,WAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACvB,QAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACrC,QAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACvB,WAAO,IAAI,CAAC;IACZ;;;UAEmB,8BAAC,UAAU,EAAE,aAAa,EAAE;;AAE/C,QAAG,CAAC,IAAI,CAAC,cAAc,EACtB,OAAO;;AAER,QAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAA;AACxD,QAAG,OAAO,IAAI,IAAI,WAAW,EAC5B,OAAM;;AAEP,QAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACvD,QAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC3D,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;;AAE/B,QAAG,aAAa,GAAG,CAAC,EACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC,UAAU,GAAG,CAAC,EAAE,aAAa,GAAC,CAAC,CAAC,CAAC;IACnE;;;UAEY,uBAAE,GAAG,EAAE,kBAAkB,EAAE;;;AAEvC,sBAAkB,GAAG,kBAAkB,IAAI,KAAK,CAAA;;AAEhD,QAAI,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;AACtB,QAAI,kBAAkB,EAAE;;;;AAGvB,UAAI,cAAc,GAAG,UAAU,CAAC,YAAM;AACrC,yBAAkB,CAAC,MAAM,CAAC,OAAK,OAAO,CAAC,cAAc,CAAC,CAAA;OACtD,EAAE,GAAG,CAAC,CAAA;;AAEP,SAAG,CAAC,MAAM,GAAG,YAAM;AAClB,WAAG,cAAc,EAChB,YAAY,CAAC,cAAc,CAAC,CAAA;AAC7B,qBAAc,GAAG,IAAI,CAAC;AACtB,WAAI,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AACzB,YAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3B,YAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC5B,yBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,WAAI,OAAK,aAAa,EACrB,OAAK,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;;AAEtC,cAAK,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AACpC,cAAK,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,cAAO,OAAK,OAAO,CAAC,eAAe,CAAC,IAAI,QAAM,CAAC;OAC/C,CAAC;AACF,SAAG,CAAC,OAAO,GAAG,YAAM;AACnB,cAAK,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,cAAO,OAAK,MAAM,CAAC,OAAK,OAAO,CAAC,OAAO,CAAC,IAAI,WAAM,GAAG,CAAE,CAAC,CAAC;OACzD,CAAC;;KACF;;AAED,OAAG,CAAC,GAAG,GAAG,GAAG,CAAC;AACd,WAAO,GAAG,CAAC;IACX;;;UAEM,iBAAE,KAAK,EAAE,MAAM,EAAG;;AAExB,UAAM,GAAG,MAAM,IAAI,KAAK,CAAA;AACxB,QAAI,CAAC,YAAY,GAAG,KAAK,CAAA;AACzB,QAAI,CAAC,aAAa,GAAG,MAAM,CAAA;;;AAG3B,QAAI,qBAAqB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;AAC7G,QAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AACzF,QAAG,AAAC,KAAK,GAAG,qBAAqB,GAAI,QAAQ,EAAE;AAC9C,WAAM,GAAG,AAAC,CAAC,QAAQ,GAAG,qBAAqB,CAAA,GAAK,KAAK,GAAI,MAAM,CAAA;AAC/D,UAAK,GAAG,QAAQ,CAAA;KAChB,MACA,KAAK,GAAI,KAAK,GAAG,qBAAqB,AAAC,CAAA;;AAExC,QAAI,YAAY,GAAG,CAAC;QACnB,YAAY,GAAG,CAAC,CAAA;;;;AAIjB,QAAI,IAAI,CAAC,cAAc,EACtB,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;;AAE1D,QAAI,IAAI,CAAC,aAAa,EACrB,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;;AAE1D,QAAI,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;;;AAGrG,QAAI,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;;AAErH,QAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,aAAa,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC;AAC7G,QAAG,MAAM,GAAG,SAAS,EAAE;;AAEtB,SAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7C,UAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;KAClC;;AAED,QAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AACjD,QAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAE,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;;AAEhE,QAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACpC,WAAO,IAAI,CAAC;IACZ;;;UAEsB,0BAAC,MAAM,EAAE;;;AAC/B,UAAM,GAAG,MAAM,IAAI,EAAE,CAAA;AACrB,WAAO,IAAI,CAAC,IAAI,CAAC,YAAM;AACtB,SAAI,KAAK,GAAG,CAAC,QAAM,CAAA;AACnB,SAAI,OAAO,GAAG,CAAC,CAAC,MAAM,CACrB,EAAE,EACF,QAAQ,CAAC,OAAO,EAChB,KAAK,CAAC,IAAI,EAAE,EACZ,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CACpC,CAAA;;AAED,SAAI,QAAQ,SAAO,OAAO,CAAC,CAAA;KAC3B,CAAC,CAAA;IACF;;;SAjiBI,QAAQ;;;AAsiBd,EAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAe,QAAQ,CAAC,gBAAgB,CAAA;AAClD,EAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAA;AACjC,EAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,GAAI,YAAM;AAC9B,GAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAA;AAC/B,SAAO,QAAQ,CAAC,gBAAgB,CAAA;EAChC,CAAA;;AAED,QAAO,QAAQ,CAAA;CAEf,CAAA,CAAE,MAAM,CAAC,CAAA","file":"ekko-lightbox.js","sourcesContent":["const Lightbox = (($) => {\n\n\tconst NAME = 'ekkoLightbox'\n\tconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\n\tconst Default = {\n\t\ttitle: '',\n\t\tfooter: '',\n\t\tshowArrows: true, //display the left / right arrows or not\n\t\ttype: null, //force the lightbox into image / youtube mode. if null, or not image|youtube|vimeo; detect it\n\t\talwaysShowClose: false, //always show the close button, even if there is no title\n\t\tloadingMessage: '
      ', // http://tobiasahlin.com/spinkit/\n\t\tleftArrow: '',\n\t\trightArrow: '',\n\t\tstrings: {\n\t\t\tclose: 'Close',\n\t\t\tfail: 'Failed to load image:',\n\t\t\ttype: 'Could not detect remote target type. Force the type using data-type',\n\t\t},\n\t\tdoc: document, // if in an iframe can specify top.document\n\t\tonShow() {},\n\t\tonShown() {},\n\t\tonHide() {},\n\t\tonHidden() {},\n\t\tonNavigate() {},\n\t\tonContentLoaded() {}\n\t}\n\n\tclass Lightbox {\n\n\t\t/**\n\t\t \n\t Class properties:\n\t\t \n\t\t _$element: null -> the element currently being displayed\n\t\t _$modal: The bootstrap modal generated\n\t\t _$modalDialog: The .modal-dialog\n\t\t _$modalContent: The .modal-content\n\t\t _$modalBody: The .modal-body\n\t\t _$modalHeader: The .modal-header\n\t\t _$modalFooter: The .modal-footer\n\t\t _$lightboxContainerOne: Container of the first lightbox element\n\t\t _$lightboxContainerTwo: Container of the second lightbox element\n\t\t _$lightboxBody: First element in the container\n\t\t _$modalArrows: The overlayed arrows container\n\n\t\t _$galleryItems: Other 's available for this gallery\n\t\t _galleryName: Name of the current data('gallery') showing\n\t\t _galleryIndex: The current index of the _$galleryItems being shown\n\n\t\t _config: {} the options for the modal\n\t\t _modalId: unique id for the current lightbox\n\t\t _padding / _border: CSS properties for the modal container; these are used to calculate the available space for the content\n\n\t\t */\n\n\t\tstatic get Default() {\n\t\t\treturn Default\n\t\t}\n\n\t\tconstructor($element, config) {\n\t\t\tthis._config = $.extend({}, Default, config)\n\t\t\tthis._$modalArrows = null\n\t\t\tthis._galleryIndex = 0\n\t\t\tthis._galleryName = null\n\t\t\tthis._padding = null\n\t\t\tthis._border = null\n\t\t\tthis._titleIsShown = false\n\t\t\tthis._footerIsShown = false\n\t\t\tthis._wantedWidth = 0\n\t\t\tthis._wantedHeight = 0\n\t\t\tthis._modalId = `ekkoLightbox-${Math.floor((Math.random() * 1000) + 1)}`;\n\t\t\tthis._$element = $element instanceof jQuery ? $element : $($element)\n\n\t\t\tlet header = `

      ${this._config.title || \" \"}

      `;\n\t\t\tlet footer = `
      ${this._config.footer || \" \"}
      `;\n\t\t\tlet body = '
      '\n\t\t\tlet dialog = `
      ${header}${body}${footer}
      `\n\t\t\t$(this._config.doc.body).append(`
      ${dialog}
      `)\n\n\t\t\tthis._$modal = $(`#${this._modalId}`, this._config.doc)\n\t\t\tthis._$modalDialog = this._$modal.find('.modal-dialog').first()\n\t\t\tthis._$modalContent = this._$modal.find('.modal-content').first()\n\t\t\tthis._$modalBody = this._$modal.find('.modal-body').first()\n\t\t\tthis._$modalHeader = this._$modal.find('.modal-header').first()\n\t\t\tthis._$modalFooter = this._$modal.find('.modal-footer').first()\n\n\t\t\tthis._$lightboxContainer = this._$modalBody.find('.ekko-lightbox-container').first()\n\t\t\tthis._$lightboxBodyOne = this._$lightboxContainer.find('> div:first-child').first()\n\t\t\tthis._$lightboxBodyTwo = this._$lightboxContainer.find('> div:last-child').first()\n\n\t\t\tthis._border = this._calculateBorders()\n\t\t\tthis._padding = this._calculatePadding()\n\n\t\t\tthis._galleryName = this._$element.data('gallery')\n\t\t\tif (this._galleryName) {\n\t\t\t\tthis._$galleryItems = $(document.body).find(`*[data-gallery=\"${this._galleryName}\"]`)\n\t\t\t\tthis._galleryIndex = this._$galleryItems.index(this._$element)\n\t\t\t\t$(document).on('keydown.ekkoLightbox', this._navigationalBinder.bind(this))\n\n\t\t\t\t// add the directional arrows to the modal\n\t\t\t\tif (this._config.showArrows && this._$galleryItems.length > 1) {\n\t\t\t\t\tthis._$lightboxContainer.append(`
      `)\n\t\t\t\t\tthis._$modalArrows = this._$lightboxContainer.find('div.ekko-lightbox-nav-overlay').first()\n\t\t\t\t\tthis._$lightboxContainer.on('click', 'a:first-child', event => {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\treturn this.navigateLeft()\n\t\t\t\t\t})\n\t\t\t\t\tthis._$lightboxContainer.on('click', 'a:last-child', event => {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\treturn this.navigateRight()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._$modal\n\t\t\t.on('show.bs.modal', this._config.onShow.bind(this))\n\t\t\t.on('shown.bs.modal', () => {\n\t\t\t\tthis._toggleLoading(true)\n\t\t\t\tthis._handle()\n\t\t\t\treturn this._config.onShown.call(this)\n\t\t\t})\n\t\t\t.on('hide.bs.modal', this._config.onHide.bind(this))\n\t\t\t.on('hidden.bs.modal', () => {\n\t\t\t\tif (this._galleryName) {\n\t\t\t\t\t$(document).off('keydown.ekkoLightbox')\n\t\t\t\t\t$(window).off('resize.ekkoLightbox')\n\t\t\t\t}\n\t\t\t\tthis._$modal.remove()\n\t\t\t\treturn this._config.onHidden.call(this)\n\t\t\t})\n\t\t\t.modal(this._config)\n\n\t\t\t$(window).on('resize.ekkoLightbox', () => {\n\t\t\t\tthis._resize(this._wantedWidth, this._wantedHeight)\n\t\t\t})\n\t\t}\n\n\t\telement() {\n\t\t\treturn this._$element;\n\t\t}\n\n\t\tmodal() {\n\t\t\treturn this._$modal;\n\t\t}\n\n\t\tnavigateTo(index) {\n\n\t\t\tif (index < 0 || index > this._$galleryItems.length-1)\n\t\t\t\treturn this\n\n\t\t\tthis._galleryIndex = index\n\n\t\t\tthis._$element = $(this._$galleryItems.get(this._galleryIndex))\n\t\t\tthis._handle();\n\t\t}\n\n\t\tnavigateLeft() {\n\n\t\t\tif (this._$galleryItems.length === 1)\n\t\t\t\treturn\n\n\t\t\tif (this._galleryIndex === 0)\n\t\t\t\tthis._galleryIndex = this._$galleryItems.length - 1\n\t\t\telse //circular\n\t\t\t\tthis._galleryIndex--\n\n\t\t\tthis._config.onNavigate.call(this, 'left', this._galleryIndex)\n\t\t\treturn this.navigateTo(this._galleryIndex)\n\t\t}\n\n\t\tnavigateRight() {\n\n\t\t\tif (this._$galleryItems.length === 1)\n\t\t\t\treturn\n\n\t\t\tif (this._galleryIndex === this._$galleryItems.length - 1)\n\t\t\t\tthis._galleryIndex = 0\n\t\t\telse //circular\n\t\t\t\tthis._galleryIndex++\n\n\t\t\tthis._config.onNavigate.call(this, 'right', this._galleryIndex)\n\t\t\treturn this.navigateTo(this._galleryIndex)\n\t\t}\n\n\t\tclose() {\n\t\t\treturn this._$modal.modal('hide');\n\t\t}\n\n\t\t// helper private methods\n\t\t_navigationalBinder(event) {\n\t\t\tevent = event || window.event;\n\t\t\tif (event.keyCode === 39)\n\t\t\t\treturn this.navigateRight()\n\t\t\tif (event.keyCode === 37)\n\t\t\t\treturn this.navigateLeft()\n\t\t}\n\n\t\t// type detection private methods\n\t\t_detectRemoteType(src, type) {\n\n\t\t\ttype = type || false;\n\n\t\t\tif(!type && this._isImage(src))\n\t\t\t\ttype = 'image';\n\t\t\tif(!type && this._getYoutubeId(src))\n\t\t\t\ttype = 'youtube';\n\t\t\tif(!type && this._getVimeoId(src))\n\t\t\t\ttype = 'vimeo';\n\t\t\tif(!type && this._getInstagramId(src))\n\t\t\t\ttype = 'instagram';\n\n\t\t\tif(!type || ['image', 'youtube', 'vimeo', 'instagram', 'video', 'url'].indexOf(type) < 0)\n\t\t\t\ttype = 'url';\n\n\t\t\treturn type;\n\t\t}\n\n\t\t_isImage(string) {\n\t\t\treturn string && string.match(/(^data:image\\/.*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\\?|#).*)?$)/i)\n\t\t}\n\n\t\t_containerToUse() {\n\t\t\t// if currently showing an image, fade it out and remove\n\t\t\tlet $toUse = this._$lightboxBodyTwo\n\t\t\tlet $current = this._$lightboxBodyOne\n\n\t\t\tif(this._$lightboxBodyTwo.hasClass('in')) {\n\t\t\t\t$toUse = this._$lightboxBodyOne\n\t\t\t\t$current = this._$lightboxBodyTwo\n\t\t\t}\n\n\t\t\t$current.removeClass('in')\n\t\t\tsetTimeout(() => {\n\t\t\t\tif(!this._$lightboxBodyTwo.hasClass('in'))\n\t\t\t\t\tthis._$lightboxBodyTwo.empty()\n\t\t\t\tif(!this._$lightboxBodyOne.hasClass('in'))\n\t\t\t\t\tthis._$lightboxBodyOne.empty()\n\t\t\t}, 500)\n\n\t\t\t$toUse.addClass('in')\n\t\t\treturn $toUse\n\t\t}\n\n\t\t_handle() {\n\n\t\t\tlet $toUse = this._containerToUse()\n\t\t\tthis._updateTitleAndFooter()\n\n\t\t\tlet currentRemote = this._$element.attr('data-remote') || this._$element.attr('href')\n\t\t\tlet currentType = this._detectRemoteType(currentRemote, this._$element.attr('data-type') || false)\n\n\t\t\tif(['image', 'youtube', 'vimeo', 'instagram', 'video', 'url'].indexOf(currentType) < 0)\n\t\t\t\treturn this._error(this._config.strings.type)\n\n\t\t\tswitch(currentType) {\n\t\t\t\tcase 'image':\n\t\t\t\t\tthis._preloadImage(currentRemote, $toUse)\n\t\t\t\t\tthis._preloadImageByIndex(this._galleryIndex, 3)\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'youtube':\n\t\t\t\t\tthis._showYoutubeVideo(currentRemote, $toUse);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'vimeo':\n\t\t\t\t\tthis._showVimeoVideo(this._getVimeoId(currentRemote), $toUse);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'instagram':\n\t\t\t\t\tthis._showInstagramVideo(this._getInstagramId(currentRemote), $toUse);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'video':\n\t\t\t\t\tthis._showHtml5Video(currentRemote, $toUse);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: // url\n\t\t\t\t\tthis._loadRemoteContent(currentRemote, $toUse);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\t_getYoutubeId(string) {\n\t\t\tif(!string)\n\t\t\t\treturn false;\n\t\t\tlet matches = string.match(/^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=)([^#\\&\\?]*).*/)\n\t\t\treturn (matches && matches[2].length === 11) ? matches[2] : false\n\t\t}\n\n\t\t_getVimeoId(string) {\n\t\t\treturn string && string.indexOf('vimeo') > 0 ? string : false\n\t\t}\n\n\t\t_getInstagramId(string) {\n\t\t\treturn string && string.indexOf('instagram') > 0 ? string : false\n\t\t}\n\n\t\t// layout private methods\n\t\t_toggleLoading(show) {\n\t\t\tshow = show || false\n\t\t\tif(show) {\n\t\t\t\tthis._$modalDialog.css('display', 'none')\n\t\t\t\tthis._$modal.removeClass('in')\n\t\t\t\t$('.modal-backdrop').append(this._config.loadingMessage)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._$modalDialog.css('display', 'block')\n\t\t\t\tthis._$modal.addClass('in')\n\t\t\t\t$('.modal-backdrop').find('.ekko-lightbox-loader').remove()\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t_calculateBorders() {\n\t\t\treturn {\n\t\t\t\ttop: this._totalCssByAttribute('border-top-width'),\n\t\t\t\tright: this._totalCssByAttribute('border-right-width'),\n\t\t\t\tbottom: this._totalCssByAttribute('border-bottom-width'),\n\t\t\t\tleft: this._totalCssByAttribute('border-left-width'),\n\t\t\t}\n\t\t}\n\t\t\n\t\t_calculatePadding() {\n\t\t\treturn {\n\t\t\t\ttop: this._totalCssByAttribute('padding-top'),\n\t\t\t\tright: this._totalCssByAttribute('padding-right'),\n\t\t\t\tbottom: this._totalCssByAttribute('padding-bottom'),\n\t\t\t\tleft: this._totalCssByAttribute('padding-left'),\n\t\t\t}\n\t\t}\n\n\t\t_totalCssByAttribute(attribute) {\n\t\t\treturn parseInt(this._$modalDialog.css(attribute), 10) +\n\t\t\t\tparseInt(this._$modalContent.css(attribute), 10) +\n\t\t\t\tparseInt(this._$modalBody.css(attribute), 10)\n\t\t}\n\n\t\t_updateTitleAndFooter() {\n\t\t\tlet title = this._$element.data('title') || \"\"\n\t\t\tlet caption = this._$element.data('footer') || \"\"\n\n\t\t\tthis._titleIsShown = false\n\t\t\tif (title || this._config.alwaysShowClose) {\n\t\t\t\tthis._titleIsShown = true\n\t\t\t\tthis._$modalHeader.css('display', '').find('.modal-title').html(title || \" \")\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis._$modalHeader.css('display', 'none')\n\n\t\t\tthis._footerIsShown = false\n\t\t\tif (caption) {\n\t\t\t\tthis._footerIsShown = true\n\t\t\t\tthis._$modalFooter.css('display', '').html(caption)\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis._$modalFooter.css('display', 'none')\n\n\t\t\treturn this;\n\t\t}\n\n\t\t_showYoutubeVideo(remote, $containerForElement) {\n\t\t\tlet id = this._getYoutubeId(remote)\n\t\t\tlet query = remote.indexOf('&') > 0 ? remote.substr(remote.indexOf('&')) : ''\n\t\t\tlet width = this._$element.data('width') || 560\n\t\t\tlet height = this._$element.data('height') || width / ( 560/315 )\n\t\t\treturn this._showVideoIframe(\n\t\t\t\t`//www.youtube.com/embed/${id}?badge=0&autoplay=1&html5=1${query}`,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t$containerForElement\n\t\t\t);\n\t\t}\n\n\t\t_showVimeoVideo(id, $containerForElement) {\n\t\t\tlet width = 500\n\t\t\tlet height = this._$element.data('height') || width / ( 560/315 )\n\t\t\treturn this._showVideoIframe(id + '?autoplay=1', width, height, $containerForElement)\n\t\t}\n\n\t\t_showInstagramVideo(id, $containerForElement) {\n\t\t\t// instagram load their content into iframe's so this can be put straight into the element\n\t\t\tlet width = this._$element.data('width') || 612\n\t\t\tlet height = width + 80;\n\t\t\tid = id.substr(-1) !== '/' ? id + '/' : id; // ensure id has trailing slash\n\t\t\t$containerForElement.html(``);\n\t\t\tthis._resize(width, height);\n\t\t\tthis._config.onContentLoaded.call(this);\n\t\t\tif (this._$modalArrows) //hide the arrows when showing video\n\t\t\t\tthis._$modalArrows.css('display', 'none');\n\t\t\tthis._toggleLoading(false);\n\t\t\treturn this;\n\t\t}\n\n\t\t_showVideoIframe(url, width, height, $containerForElement) { // should be used for videos only. for remote content use loadRemoteContent (data-type=url)\n\t\t\theight = height || width; // default to square\n\t\t\t$containerForElement.html(`
      `);\n\t\t\tthis._resize(width, height);\n\t\t\tthis._config.onContentLoaded.call(this);\n\t\t\tif (this._$modalArrows)\n\t\t\t\tthis._$modalArrows.css('display', 'none'); //hide the arrows when showing video\n\t\t\tthis._toggleLoading(false);\n\t\t\treturn this;\n\t\t}\n\n\t\t_showHtml5Video(url, $containerForElement) { // should be used for videos only. for remote content use loadRemoteContent (data-type=url)\n\t\t\tlet width = this._$element.data('width') || 560\n\t\t\tlet height = this._$element.data('height') || width / ( 560/315 )\n\t\t\t$containerForElement.html(`
      `);\n\t\t\tthis._resize(width, height);\n\t\t\tthis._config.onContentLoaded.call(this);\n\t\t\tif (this._$modalArrows)\n\t\t\t\tthis._$modalArrows.css('display', 'none'); //hide the arrows when showing video\n\t\t\tthis._toggleLoading(false);\n\t\t\treturn this;\n\t\t}\n\n\t\t_loadRemoteContent(url, $containerForElement) {\n\t\t\tlet width = this._$element.data('width') || 560;\n\t\t\tlet height = this._$element.data('height') || 560;\n\n\t\t\tlet disableExternalCheck = this._$element.data('disableExternalCheck') || false;\n\t\t\tthis._toggleLoading(false);\n\n\t\t\t// external urls are loading into an iframe\n\t\t\t// local ajax can be loaded into the container itself\n\t\t\tif (!disableExternalCheck && !this._isExternal(url)) {\n\t\t\t\t$containerForElement.load(url, $.proxy(() => {\n\t\t\t\t\treturn this._$element.trigger('loaded.bs.modal');l\n\t\t\t\t}));\n\n\t\t\t} else {\n\t\t\t\t$containerForElement.html(``);\n\t\t\t\tthis._config.onContentLoaded.call(this);\n\t\t\t}\n\n\t\t\tif (this._$modalArrows) //hide the arrows when remote content\n\t\t\t\tthis._$modalArrows.css('display', 'none')\n\n\t\t\tthis._resize(width, height);\n\t\t\treturn this;\n\t\t}\n\n\t\t_isExternal(url) {\n\t\t\tlet match = url.match(/^([^:\\/?#]+:)?(?:\\/\\/([^\\/?#]*))?([^?#]+)?(\\?[^#]*)?(#.*)?/);\n\t\t\tif (typeof match[1] === \"string\" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol)\n\t\t\t\treturn true;\n\n\t\t\tif (typeof match[2] === \"string\" && match[2].length > 0 && match[2].replace(new RegExp(`:(${{\n\t\t\t\t\t\"http:\": 80,\n\t\t\t\t\t\"https:\": 443\n\t\t\t\t}[location.protocol]})?$`), \"\") !== location.host)\n\t\t\t\treturn true;\n\n\t\t\treturn false;\n\t\t}\n\n\t\t_error( message ) {\n\t\t\tconsole.error(message);\n\t\t\tthis._containerToUse().html(message);\n\t\t\tthis._resize(300, 300);\n\t\t\treturn this;\n\t\t}\n\n\t\t_preloadImageByIndex(startIndex, numberOfTimes) {\n\n\t\t\tif(!this._$galleryItems)\n\t\t\t\treturn;\n\n\t\t\tlet next = $(this._$galleryItems.get(startIndex), false)\n\t\t\tif(typeof next == 'undefined')\n\t\t\t\treturn\n\n\t\t\tlet src = next.attr('data-remote') || next.attr('href')\n\t\t\tif (next.attr('data-type') === 'image' || this._isImage(src))\n\t\t\t\tthis._preloadImage(src, false)\n\n\t\t\tif(numberOfTimes > 0)\n\t\t\t\treturn this._preloadImageByIndex(startIndex + 1, numberOfTimes-1);\n\t\t}\n\n\t\t_preloadImage( src, $containerForImage) {\n\n\t\t\t$containerForImage = $containerForImage || false\n\n\t\t\tlet img = new Image();\n\t\t\tif ($containerForImage) {\n\n\t\t\t\t// if loading takes > 200ms show a loader\n\t\t\t\tlet loadingTimeout = setTimeout(() => {\n\t\t\t\t\t$containerForImage.append(this._config.loadingMessage)\n\t\t\t\t}, 200)\n\n\t\t\t\timg.onload = () => {\n\t\t\t\t\tif(loadingTimeout)\n\t\t\t\t\t\tclearTimeout(loadingTimeout)\n\t\t\t\t\tloadingTimeout = null;\n\t\t\t\t\tlet image = $('');\n\t\t\t\t\timage.attr('src', img.src);\n\t\t\t\t\timage.addClass('img-fluid');\n\t\t\t\t\t$containerForImage.html(image);\n\t\t\t\t\tif (this._$modalArrows)\n\t\t\t\t\t\tthis._$modalArrows.css('display', '') // remove display to default to css property\n\n\t\t\t\t\tthis._resize(img.width, img.height);\n\t\t\t\t\tthis._toggleLoading(false);\n\t\t\t\t\treturn this._config.onContentLoaded.call(this);\n\t\t\t\t};\n\t\t\t\timg.onerror = () => {\n\t\t\t\t\tthis._toggleLoading(false);\n\t\t\t\t\treturn this._error(this._config.strings.fail+` ${src}`);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\timg.src = src;\n\t\t\treturn img;\n\t\t}\n\n\t\t_resize( width, height ) {\n\n\t\t\theight = height || width\n\t\t\tthis._wantedWidth = width\n\t\t\tthis._wantedHeight = height\n\n\t\t\t// if width > the available space, scale down the expected width and height\n\t\t\tlet widthBorderAndPadding = this._padding.left + this._padding.right + this._border.left + this._border.right\n\t\t\tlet maxWidth = Math.min(width + widthBorderAndPadding, this._config.doc.body.clientWidth)\n\t\t\tif((width + widthBorderAndPadding) > maxWidth) {\n\t\t\t\theight = ((maxWidth - widthBorderAndPadding) / width) * height\n\t\t\t\twidth = maxWidth\n\t\t\t} else\n\t\t\t\twidth = (width + widthBorderAndPadding)\n\n\t\t\tlet headerHeight = 0,\n\t\t\t\tfooterHeight = 0\n\n\t\t\t// as the resize is performed the modal is show, the calculate might fail\n\t\t\t// if so, default to the default sizes\n\t\t\tif (this._footerIsShown)\n\t\t\t\tfooterHeight = this._$modalFooter.outerHeight(true) || 55\n\n\t\t\tif (this._titleIsShown)\n\t\t\t\theaderHeight = this._$modalHeader.outerHeight(true) || 67\n\n\t\t\tlet borderPadding = this._padding.top + this._padding.bottom + this._border.bottom + this._border.top\n\n\t\t\t//calculated each time as resizing the window can cause them to change due to Bootstraps fluid margins\n\t\t\tlet margins = parseFloat(this._$modalDialog.css('margin-top')) + parseFloat(this._$modalDialog.css('margin-bottom'));\n\n\t\t\tlet maxHeight = Math.min(height, $(window).height() - borderPadding - margins - headerHeight - footerHeight);\n\t\t\tif(height > maxHeight) {\n\t\t\t\t// if height > the available height, scale down the width\n\t\t\t\tlet factor = Math.min(maxHeight / height, 1);\n\t\t\t\twidth = Math.ceil(factor * width);\n\t\t\t}\n\n\t\t\tthis._$lightboxContainer.css('height', maxHeight)\n\t\t\tthis._$modalDialog.css('width', 'auto') .css('maxWidth', width);\n\n\t\t\tthis._$modal.modal('_handleUpdate');\n\t\t\treturn this;\n\t\t}\n\n\t\tstatic _jQueryInterface(config) {\n\t\t\tconfig = config || {}\n\t\t\treturn this.each(() => {\n\t\t\t\tlet $this = $(this)\n\t\t\t\tlet _config = $.extend(\n\t\t\t\t\t{},\n\t\t\t\t\tLightbox.Default,\n\t\t\t\t\t$this.data(),\n\t\t\t\t\ttypeof config === 'object' && config\n\t\t\t\t)\n\n\t\t\t\tnew Lightbox(this, _config)\n\t\t\t})\n\t\t}\n\t}\n\n\n\n\t$.fn[NAME] = Lightbox._jQueryInterface\n\t$.fn[NAME].Constructor = Lightbox\n\t$.fn[NAME].noConflict = () => {\n\t\t$.fn[NAME] = JQUERY_NO_CONFLICT\n\t\treturn Lightbox._jQueryInterface\n\t}\n\n\treturn Lightbox\n\n})(jQuery)\n\nexport default Lightbox"]} \ No newline at end of file diff --git a/bower_components/ekko-lightbox/dist/ekko-lightbox.min.css b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.css new file mode 100644 index 0000000000..98e91ebda1 --- /dev/null +++ b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.css @@ -0,0 +1,2 @@ +.ekko-lightbox-nav-overlay a:focus,.ekko-lightbox-nav-overlay a>:focus{outline:0}.ekko-lightbox-container{position:relative}.ekko-lightbox-container>div.ekko-lightbox-item{position:absolute;top:0;left:0;width:100%;transition:opacity .5s ease-in-out;opacity:1}.ekko-lightbox-nav-overlay{z-index:1;position:absolute;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex}.ekko-lightbox-nav-overlay a{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;opacity:0;transition:opacity .5s;color:#fff;font-size:30px;z-index:1}.ekko-lightbox-nav-overlay a>*{-ms-flex-positive:1;flex-grow:1}.ekko-lightbox-nav-overlay a span{padding:0 30px}.ekko-lightbox-nav-overlay a:last-child span{text-align:right}.ekko-lightbox-nav-overlay a:hover{text-decoration:none}.ekko-lightbox a:hover{opacity:1;text-decoration:none}.ekko-lightbox .modal-footer{text-align:left}.ekko-lightbox-loader{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.ekko-lightbox-loader>div{width:40px;height:40px;position:relative;text-align:center}.ekko-lightbox-loader>div>div{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;animation:a 2s infinite ease-in-out}.ekko-lightbox-loader>div>div:last-child{animation-delay:-1s}@keyframes a{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}} +/*# sourceMappingURL=ekko-lightbox.min.css.map */ \ No newline at end of file diff --git a/bower_components/ekko-lightbox/dist/ekko-lightbox.min.css.map b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.css.map new file mode 100644 index 0000000000..17f09be59c --- /dev/null +++ b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["dist/ekko-lightbox.css"],"names":[],"mappings":"AAkDA,uEACE,SAAS,CAnDX,yBACE,iBAAU,CAEZ,gDACE,kBACA,MACA,OACA,WACA,mCACA,SAAS,CAEX,2BACE,UACA,kBACA,MACA,OACA,WACA,YACA,oBACA,YAAS,CAEX,6BACE,WACI,OACJ,oBACA,aACA,sBACI,mBACJ,UACA,uBACA,WACA,eACA,SAAS,CAEX,+BACE,oBACI,WAAW,CAKjB,kCACE,cAAW,CAEb,6CACE,gBAAY,CAEd,mCACE,oBAAiB,CAKnB,uBACE,UACA,oBAAiB,CAEnB,6BACE,eAAY,CAEd,sBACE,kBACA,MACA,OACA,SACA,QACA,WACA,oBACA,aAEA,0BACI,sBAEJ,qBACI,uBAEJ,sBACI,kBAAa,CAEnB,0BACE,WACA,YACA,kBACA,iBAAY,CAEd,8BACE,WACA,YACA,kBACA,sBACA,WACA,kBACA,MACA,OACA,mCAAiC,CAEnC,yCACE,mBAAiB,CAEnB,aACE,MAEE,mBACA,0BAAmB,CAErB,IACE,mBACA,0BAAmB,CAAA,CAAA","file":"ekko-lightbox.min.css"} \ No newline at end of file diff --git a/bower_components/ekko-lightbox/dist/ekko-lightbox.min.js b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.js new file mode 100644 index 0000000000..08ba49af91 --- /dev/null +++ b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.js @@ -0,0 +1,2 @@ ++function(a){"use strict";function b(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var c=function(){function a(a,b){for(var c=0;c
      ',leftArrow:"",rightArrow:"",strings:{close:"Close",fail:"Failed to load image:",type:"Could not detect remote target type. Force the type using data-type"},doc:document,onShow:function(){},onShown:function(){},onHide:function(){},onHidden:function(){},onNavigate:function(){},onContentLoaded:function(){}},g=function(){function d(c,e){var g=this;b(this,d),this._config=a.extend({},f,e),this._$modalArrows=null,this._galleryIndex=0,this._galleryName=null,this._padding=null,this._border=null,this._titleIsShown=!1,this._footerIsShown=!1,this._wantedWidth=0,this._wantedHeight=0,this._modalId="ekkoLightbox-"+Math.floor(1e3*Math.random()+1),this._$element=c instanceof jQuery?c:a(c);var h='",i='",j='',k='";a(this._config.doc.body).append('"),this._$modal=a("#"+this._modalId,this._config.doc),this._$modalDialog=this._$modal.find(".modal-dialog").first(),this._$modalContent=this._$modal.find(".modal-content").first(),this._$modalBody=this._$modal.find(".modal-body").first(),this._$modalHeader=this._$modal.find(".modal-header").first(),this._$modalFooter=this._$modal.find(".modal-footer").first(),this._$lightboxContainer=this._$modalBody.find(".ekko-lightbox-container").first(),this._$lightboxBodyOne=this._$lightboxContainer.find("> div:first-child").first(),this._$lightboxBodyTwo=this._$lightboxContainer.find("> div:last-child").first(),this._border=this._calculateBorders(),this._padding=this._calculatePadding(),this._galleryName=this._$element.data("gallery"),this._galleryName&&(this._$galleryItems=a(document.body).find('*[data-gallery="'+this._galleryName+'"]'),this._galleryIndex=this._$galleryItems.index(this._$element),a(document).on("keydown.ekkoLightbox",this._navigationalBinder.bind(this)),this._config.showArrows&&this._$galleryItems.length>1&&(this._$lightboxContainer.append('"),this._$modalArrows=this._$lightboxContainer.find("div.ekko-lightbox-nav-overlay").first(),this._$lightboxContainer.on("click","a:first-child",function(a){return a.preventDefault(),g.navigateLeft()}),this._$lightboxContainer.on("click","a:last-child",function(a){return a.preventDefault(),g.navigateRight()}))),this._$modal.on("show.bs.modal",this._config.onShow.bind(this)).on("shown.bs.modal",function(){return g._toggleLoading(!0),g._handle(),g._config.onShown.call(g)}).on("hide.bs.modal",this._config.onHide.bind(this)).on("hidden.bs.modal",function(){return g._galleryName&&(a(document).off("keydown.ekkoLightbox"),a(window).off("resize.ekkoLightbox")),g._$modal.remove(),g._config.onHidden.call(g)}).modal(this._config),a(window).on("resize.ekkoLightbox",function(){g._resize(g._wantedWidth,g._wantedHeight)})}return c(d,null,[{key:"Default",get:function(){return f}}]),c(d,[{key:"element",value:function(){return this._$element}},{key:"modal",value:function(){return this._$modal}},{key:"navigateTo",value:function(b){return b<0||b>this._$galleryItems.length-1?this:(this._galleryIndex=b,this._$element=a(this._$galleryItems.get(this._galleryIndex)),void this._handle())}},{key:"navigateLeft",value:function(){if(1!==this._$galleryItems.length)return 0===this._galleryIndex?this._galleryIndex=this._$galleryItems.length-1:this._galleryIndex--,this._config.onNavigate.call(this,"left",this._galleryIndex),this.navigateTo(this._galleryIndex)}},{key:"navigateRight",value:function(){if(1!==this._$galleryItems.length)return this._galleryIndex===this._$galleryItems.length-1?this._galleryIndex=0:this._galleryIndex++,this._config.onNavigate.call(this,"right",this._galleryIndex),this.navigateTo(this._galleryIndex)}},{key:"close",value:function(){return this._$modal.modal("hide")}},{key:"_navigationalBinder",value:function(a){return a=a||window.event,39===a.keyCode?this.navigateRight():37===a.keyCode?this.navigateLeft():void 0}},{key:"_detectRemoteType",value:function(a,b){return b=b||!1,!b&&this._isImage(a)&&(b="image"),!b&&this._getYoutubeId(a)&&(b="youtube"),!b&&this._getVimeoId(a)&&(b="vimeo"),!b&&this._getInstagramId(a)&&(b="instagram"),(!b||["image","youtube","vimeo","instagram","video","url"].indexOf(b)<0)&&(b="url"),b}},{key:"_isImage",value:function(a){return a&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)}},{key:"_containerToUse",value:function(){var a=this,b=this._$lightboxBodyTwo,c=this._$lightboxBodyOne;return this._$lightboxBodyTwo.hasClass("in")&&(b=this._$lightboxBodyOne,c=this._$lightboxBodyTwo),c.removeClass("in"),setTimeout(function(){a._$lightboxBodyTwo.hasClass("in")||a._$lightboxBodyTwo.empty(),a._$lightboxBodyOne.hasClass("in")||a._$lightboxBodyOne.empty()},500),b.addClass("in"),b}},{key:"_handle",value:function(){var a=this._containerToUse();this._updateTitleAndFooter();var b=this._$element.attr("data-remote")||this._$element.attr("href"),c=this._detectRemoteType(b,this._$element.attr("data-type")||!1);if(["image","youtube","vimeo","instagram","video","url"].indexOf(c)<0)return this._error(this._config.strings.type);switch(c){case"image":this._preloadImage(b,a),this._preloadImageByIndex(this._galleryIndex,3);break;case"youtube":this._showYoutubeVideo(b,a);break;case"vimeo":this._showVimeoVideo(this._getVimeoId(b),a);break;case"instagram":this._showInstagramVideo(this._getInstagramId(b),a);break;case"video":this._showHtml5Video(b,a);break;default:this._loadRemoteContent(b,a)}return this}},{key:"_getYoutubeId",value:function(a){if(!a)return!1;var b=a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);return!(!b||11!==b[2].length)&&b[2]}},{key:"_getVimeoId",value:function(a){return!!(a&&a.indexOf("vimeo")>0)&&a}},{key:"_getInstagramId",value:function(a){return!!(a&&a.indexOf("instagram")>0)&&a}},{key:"_toggleLoading",value:function(b){return b=b||!1,b?(this._$modalDialog.css("display","none"),this._$modal.removeClass("in"),a(".modal-backdrop").append(this._config.loadingMessage)):(this._$modalDialog.css("display","block"),this._$modal.addClass("in"),a(".modal-backdrop").find(".ekko-lightbox-loader").remove()),this}},{key:"_calculateBorders",value:function(){return{top:this._totalCssByAttribute("border-top-width"),right:this._totalCssByAttribute("border-right-width"),bottom:this._totalCssByAttribute("border-bottom-width"),left:this._totalCssByAttribute("border-left-width")}}},{key:"_calculatePadding",value:function(){return{top:this._totalCssByAttribute("padding-top"),right:this._totalCssByAttribute("padding-right"),bottom:this._totalCssByAttribute("padding-bottom"),left:this._totalCssByAttribute("padding-left")}}},{key:"_totalCssByAttribute",value:function(a){return parseInt(this._$modalDialog.css(a),10)+parseInt(this._$modalContent.css(a),10)+parseInt(this._$modalBody.css(a),10)}},{key:"_updateTitleAndFooter",value:function(){var a=this._$element.data("title")||"",b=this._$element.data("footer")||"";return this._titleIsShown=!1,a||this._config.alwaysShowClose?(this._titleIsShown=!0,this._$modalHeader.css("display","").find(".modal-title").html(a||" ")):this._$modalHeader.css("display","none"),this._footerIsShown=!1,b?(this._footerIsShown=!0,this._$modalFooter.css("display","").html(b)):this._$modalFooter.css("display","none"),this}},{key:"_showYoutubeVideo",value:function(a,b){var c=this._getYoutubeId(a),d=a.indexOf("&")>0?a.substr(a.indexOf("&")):"",e=this._$element.data("width")||560,f=this._$element.data("height")||e/(560/315);return this._showVideoIframe("//www.youtube.com/embed/"+c+"?badge=0&autoplay=1&html5=1"+d,e,f,b)}},{key:"_showVimeoVideo",value:function(a,b){var c=500,d=this._$element.data("height")||c/(560/315);return this._showVideoIframe(a+"?autoplay=1",c,d,b)}},{key:"_showInstagramVideo",value:function(a,b){var c=this._$element.data("width")||612,d=c+80;return a="/"!==a.substr(-1)?a+"/":a,b.html(''),this._resize(c,d),this._config.onContentLoaded.call(this),this._$modalArrows&&this._$modalArrows.css("display","none"),this._toggleLoading(!1),this}},{key:"_showVideoIframe",value:function(a,b,c,d){return c=c||b,d.html('
      '),this._resize(b,c),this._config.onContentLoaded.call(this),this._$modalArrows&&this._$modalArrows.css("display","none"),this._toggleLoading(!1),this}},{key:"_showHtml5Video",value:function(a,b){var c=this._$element.data("width")||560,d=this._$element.data("height")||c/(560/315);return b.html('
      '),this._resize(c,d),this._config.onContentLoaded.call(this),this._$modalArrows&&this._$modalArrows.css("display","none"),this._toggleLoading(!1),this}},{key:"_loadRemoteContent",value:function(b,c){var d=this,e=this._$element.data("width")||560,f=this._$element.data("height")||560,g=this._$element.data("disableExternalCheck")||!1;return this._toggleLoading(!1),g||this._isExternal(b)?(c.html(''),this._config.onContentLoaded.call(this)):c.load(b,a.proxy(function(){return d._$element.trigger("loaded.bs.modal")})),this._$modalArrows&&this._$modalArrows.css("display","none"),this._resize(e,f),this}},{key:"_isExternal",value:function(a){var b=a.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);return"string"==typeof b[1]&&b[1].length>0&&b[1].toLowerCase()!==location.protocol||"string"==typeof b[2]&&b[2].length>0&&b[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"),"")!==location.host}},{key:"_error",value:function(a){return console.error(a),this._containerToUse().html(a),this._resize(300,300),this}},{key:"_preloadImageByIndex",value:function(b,c){if(this._$galleryItems){var d=a(this._$galleryItems.get(b),!1);if("undefined"!=typeof d){var e=d.attr("data-remote")||d.attr("href");return("image"===d.attr("data-type")||this._isImage(e))&&this._preloadImage(e,!1),c>0?this._preloadImageByIndex(b+1,c-1):void 0}}}},{key:"_preloadImage",value:function(b,c){var d=this;c=c||!1;var e=new Image;return c&&!function(){var f=setTimeout(function(){c.append(d._config.loadingMessage)},200);e.onload=function(){f&&clearTimeout(f),f=null;var b=a("");return b.attr("src",e.src),b.addClass("img-fluid"),c.html(b),d._$modalArrows&&d._$modalArrows.css("display",""),d._resize(e.width,e.height),d._toggleLoading(!1),d._config.onContentLoaded.call(d)},e.onerror=function(){return d._toggleLoading(!1),d._error(d._config.strings.fail+(" "+b))}}(),e.src=b,e}},{key:"_resize",value:function(b,c){c=c||b,this._wantedWidth=b,this._wantedHeight=c;var d=this._padding.left+this._padding.right+this._border.left+this._border.right,e=Math.min(b+d,this._config.doc.body.clientWidth);b+d>e?(c=(e-d)/b*c,b=e):b+=d;var f=0,g=0;this._footerIsShown&&(g=this._$modalFooter.outerHeight(!0)||55),this._titleIsShown&&(f=this._$modalHeader.outerHeight(!0)||67);var h=this._padding.top+this._padding.bottom+this._border.bottom+this._border.top,i=parseFloat(this._$modalDialog.css("margin-top"))+parseFloat(this._$modalDialog.css("margin-bottom")),j=Math.min(c,a(window).height()-h-i-f-g);if(c>j){var k=Math.min(j/c,1);b=Math.ceil(k*b)}return this._$lightboxContainer.css("height",j),this._$modalDialog.css("width","auto").css("maxWidth",b),this._$modal.modal("_handleUpdate"),this}}],[{key:"_jQueryInterface",value:function(b){var c=this;return b=b||{},this.each(function(){var e=a(c),f=a.extend({},d.Default,e.data(),"object"==typeof b&&b);new d(c,f)})}}]),d}();return a.fn[d]=g._jQueryInterface,a.fn[d].Constructor=g,a.fn[d].noConflict=function(){return a.fn[d]=e,g._jQueryInterface},g})(jQuery)}(jQuery); +//# sourceMappingURL=ekko-lightbox.min.js.map \ No newline at end of file diff --git a/bower_components/ekko-lightbox/dist/ekko-lightbox.min.js.map b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.js.map new file mode 100644 index 0000000000..05ea1bccc8 --- /dev/null +++ b/bower_components/ekko-lightbox/dist/ekko-lightbox.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["ekko-lightbox.js"],"names":["$","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","NAME","JQUERY_NO_CONFLICT","fn","Default","title","footer","showArrows","type","alwaysShowClose","loadingMessage","leftArrow","rightArrow","strings","close","fail","doc","document","onShow","onShown","onHide","onHidden","onNavigate","onContentLoaded","Lightbox","$element","config","_this","this","_config","extend","_$modalArrows","_galleryIndex","_galleryName","_padding","_border","_titleIsShown","_footerIsShown","_wantedWidth","_wantedHeight","_modalId","Math","floor","random","_$element","jQuery","header","body","dialog","append","_$modal","_$modalDialog","find","first","_$modalContent","_$modalBody","_$modalHeader","_$modalFooter","_$lightboxContainer","_$lightboxBodyOne","_$lightboxBodyTwo","_calculateBorders","_calculatePadding","data","_$galleryItems","index","on","_navigationalBinder","bind","event","preventDefault","navigateLeft","navigateRight","_toggleLoading","_handle","call","off","window","remove","modal","_resize","get","value","navigateTo","keyCode","src","_isImage","_getYoutubeId","_getVimeoId","_getInstagramId","indexOf","string","match","_this2","$toUse","$current","hasClass","removeClass","setTimeout","empty","addClass","_containerToUse","_updateTitleAndFooter","currentRemote","attr","currentType","_detectRemoteType","_error","_preloadImage","_preloadImageByIndex","_showYoutubeVideo","_showVimeoVideo","_showInstagramVideo","_showHtml5Video","_loadRemoteContent","matches","show","css","top","_totalCssByAttribute","right","bottom","left","attribute","parseInt","caption","html","remote","$containerForElement","id","query","substr","width","height","_showVideoIframe","url","_this3","disableExternalCheck","_isExternal","load","proxy","trigger","toLowerCase","location","protocol","replace","RegExp","http:","https:","host","message","console","error","startIndex","numberOfTimes","next","$containerForImage","_this4","img","Image","loadingTimeout","onload","clearTimeout","image","onerror","widthBorderAndPadding","maxWidth","min","clientWidth","headerHeight","footerHeight","outerHeight","borderPadding","margins","parseFloat","maxHeight","factor","ceil","_this5","each","$this","_jQueryInterface","noConflict"],"mappings":"CAMC,SAAUA,GAEX,YAIA,SAASC,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAFhH,GAAIC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMC,OAAOC,eAAeT,EAAQI,EAAWM,IAAKN,IAAiB,MAAO,UAAUR,EAAae,EAAYC,GAAiJ,MAA9HD,IAAYZ,EAAiBH,EAAYiB,UAAWF,GAAiBC,GAAab,EAAiBH,EAAagB,GAAqBhB,OAIlhB,SAAWH,GAEzB,GAAIqB,GAAO,eACPC,EAAqBtB,EAAEuB,GAAGF,GAE1BG,GACHC,MAAO,GACPC,OAAQ,GACRC,YAAY,EACZC,KAAM,KACNC,iBAAiB,EACjBC,eAAgB,4EAChBC,UAAW,wBACXC,WAAY,wBACZC,SACCC,MAAO,QACPC,KAAM,wBACNP,KAAM,uEAEPQ,IAAKC,SACLC,OAAQ,aACRC,QAAS,aACTC,OAAQ,aACRC,SAAU,aACVC,WAAY,aACZC,gBAAiB,cAGdC,EAAW,WAgCd,QAASA,GAASC,EAAUC,GAC3B,GAAIC,GAAQC,IAEZ/C,GAAgB+C,KAAMJ,GAEtBI,KAAKC,QAAUjD,EAAEkD,UAAW1B,EAASsB,GACrCE,KAAKG,cAAgB,KACrBH,KAAKI,cAAgB,EACrBJ,KAAKK,aAAe,KACpBL,KAAKM,SAAW,KAChBN,KAAKO,QAAU,KACfP,KAAKQ,eAAgB,EACrBR,KAAKS,gBAAiB,EACtBT,KAAKU,aAAe,EACpBV,KAAKW,cAAgB,EACrBX,KAAKY,SAAW,gBAAkBC,KAAKC,MAAsB,IAAhBD,KAAKE,SAAkB,GACpEf,KAAKgB,UAAYnB,YAAoBoB,QAASpB,EAAW7C,EAAE6C,EAE3D,IAAIqB,GAAS,6BAA+BlB,KAAKC,QAAQxB,OAASuB,KAAKC,QAAQpB,gBAAkB,GAAK,yBAA2B,yEAA2EmB,KAAKC,QAAQhB,QAAQC,MAAQ,8EAAgFc,KAAKC,QAAQxB,OAAS,UAAY,cACvVC,EAAS,6BAA+BsB,KAAKC,QAAQvB,OAAS,GAAK,yBAA2B,KAAOsB,KAAKC,QAAQvB,QAAU,UAAY,SACxIyC,EAAO,qKACPC,EAAS,wEAA0EF,EAASC,EAAOzC,EAAS,cAChH1B,GAAEgD,KAAKC,QAAQb,IAAI+B,MAAME,OAAO,YAAcrB,KAAKY,SAAW,mGAAqGQ,EAAS,UAE5KpB,KAAKsB,QAAUtE,EAAE,IAAMgD,KAAKY,SAAUZ,KAAKC,QAAQb,KACnDY,KAAKuB,cAAgBvB,KAAKsB,QAAQE,KAAK,iBAAiBC,QACxDzB,KAAK0B,eAAiB1B,KAAKsB,QAAQE,KAAK,kBAAkBC,QAC1DzB,KAAK2B,YAAc3B,KAAKsB,QAAQE,KAAK,eAAeC,QACpDzB,KAAK4B,cAAgB5B,KAAKsB,QAAQE,KAAK,iBAAiBC,QACxDzB,KAAK6B,cAAgB7B,KAAKsB,QAAQE,KAAK,iBAAiBC,QAExDzB,KAAK8B,oBAAsB9B,KAAK2B,YAAYH,KAAK,4BAA4BC,QAC7EzB,KAAK+B,kBAAoB/B,KAAK8B,oBAAoBN,KAAK,qBAAqBC,QAC5EzB,KAAKgC,kBAAoBhC,KAAK8B,oBAAoBN,KAAK,oBAAoBC,QAE3EzB,KAAKO,QAAUP,KAAKiC,oBACpBjC,KAAKM,SAAWN,KAAKkC,oBAErBlC,KAAKK,aAAeL,KAAKgB,UAAUmB,KAAK,WACpCnC,KAAKK,eACRL,KAAKoC,eAAiBpF,EAAEqC,SAAS8B,MAAMK,KAAK,mBAAqBxB,KAAKK,aAAe,MACrFL,KAAKI,cAAgBJ,KAAKoC,eAAeC,MAAMrC,KAAKgB,WACpDhE,EAAEqC,UAAUiD,GAAG,uBAAwBtC,KAAKuC,oBAAoBC,KAAKxC,OAGjEA,KAAKC,QAAQtB,YAAcqB,KAAKoC,eAAe1E,OAAS,IAC3DsC,KAAK8B,oBAAoBT,OAAO,sDAAwDrB,KAAKC,QAAQlB,UAAY,mBAAqBiB,KAAKC,QAAQjB,WAAa,cAChKgB,KAAKG,cAAgBH,KAAK8B,oBAAoBN,KAAK,iCAAiCC,QACpFzB,KAAK8B,oBAAoBQ,GAAG,QAAS,gBAAiB,SAAUG,GAE/D,MADAA,GAAMC,iBACC3C,EAAM4C,iBAEd3C,KAAK8B,oBAAoBQ,GAAG,QAAS,eAAgB,SAAUG,GAE9D,MADAA,GAAMC,iBACC3C,EAAM6C,oBAKhB5C,KAAKsB,QAAQgB,GAAG,gBAAiBtC,KAAKC,QAAQX,OAAOkD,KAAKxC,OAAOsC,GAAG,iBAAkB,WAGrF,MAFAvC,GAAM8C,gBAAe,GACrB9C,EAAM+C,UACC/C,EAAME,QAAQV,QAAQwD,KAAKhD,KAChCuC,GAAG,gBAAiBtC,KAAKC,QAAQT,OAAOgD,KAAKxC,OAAOsC,GAAG,kBAAmB,WAM5E,MALIvC,GAAMM,eACTrD,EAAEqC,UAAU2D,IAAI,wBAChBhG,EAAEiG,QAAQD,IAAI,wBAEfjD,EAAMuB,QAAQ4B,SACPnD,EAAME,QAAQR,SAASsD,KAAKhD,KACjCoD,MAAMnD,KAAKC,SAEdjD,EAAEiG,QAAQX,GAAG,sBAAuB,WACnCvC,EAAMqD,QAAQrD,EAAMW,aAAcX,EAAMY,iBAwb1C,MAhiBAtD,GAAauC,EAAU,OACtB3B,IAAK,UAyBLoF,IAAK,WACJ,MAAO7E,OAiFTnB,EAAauC,IACZ3B,IAAK,UACLqF,MAAO,WACN,MAAOtD,MAAKgB,aAGb/C,IAAK,QACLqF,MAAO,WACN,MAAOtD,MAAKsB,WAGbrD,IAAK,aACLqF,MAAO,SAAoBjB,GAE1B,MAAIA,GAAQ,GAAKA,EAAQrC,KAAKoC,eAAe1E,OAAS,EAAUsC,MAEhEA,KAAKI,cAAgBiC,EAErBrC,KAAKgB,UAAYhE,EAAEgD,KAAKoC,eAAeiB,IAAIrD,KAAKI,oBAChDJ,MAAK8C,cAGN7E,IAAK,eACLqF,MAAO,WAEN,GAAmC,IAA/BtD,KAAKoC,eAAe1E,OAMxB,MAJ2B,KAAvBsC,KAAKI,cAAqBJ,KAAKI,cAAgBJ,KAAKoC,eAAe1E,OAAS,EAC/EsC,KAAKI,gBAENJ,KAAKC,QAAQP,WAAWqD,KAAK/C,KAAM,OAAQA,KAAKI,eACzCJ,KAAKuD,WAAWvD,KAAKI,kBAG7BnC,IAAK,gBACLqF,MAAO,WAEN,GAAmC,IAA/BtD,KAAKoC,eAAe1E,OAMxB,MAJIsC,MAAKI,gBAAkBJ,KAAKoC,eAAe1E,OAAS,EAAGsC,KAAKI,cAAgB,EAC/EJ,KAAKI,gBAENJ,KAAKC,QAAQP,WAAWqD,KAAK/C,KAAM,QAASA,KAAKI,eAC1CJ,KAAKuD,WAAWvD,KAAKI,kBAG7BnC,IAAK,QACLqF,MAAO,WACN,MAAOtD,MAAKsB,QAAQ6B,MAAM,WAK3BlF,IAAK,sBACLqF,MAAO,SAA6Bb,GAEnC,MADAA,GAAQA,GAASQ,OAAOR,MACF,KAAlBA,EAAMe,QAAuBxD,KAAK4C,gBAChB,KAAlBH,EAAMe,QAAuBxD,KAAK2C,eAAtC,UAKD1E,IAAK,oBACLqF,MAAO,SAA2BG,EAAK7E,GAWtC,MATAA,GAAOA,IAAQ,GAEVA,GAAQoB,KAAK0D,SAASD,KAAM7E,EAAO,UACnCA,GAAQoB,KAAK2D,cAAcF,KAAM7E,EAAO,YACxCA,GAAQoB,KAAK4D,YAAYH,KAAM7E,EAAO,UACtCA,GAAQoB,KAAK6D,gBAAgBJ,KAAM7E,EAAO,eAE1CA,IAAS,QAAS,UAAW,QAAS,YAAa,QAAS,OAAOkF,QAAQlF,GAAQ,KAAGA,EAAO,OAE3FA,KAGRX,IAAK,WACLqF,MAAO,SAAkBS,GACxB,MAAOA,IAAUA,EAAOC,MAAM,4EAG/B/F,IAAK,kBACLqF,MAAO,WACN,GAAIW,GAASjE,KAGTkE,EAASlE,KAAKgC,kBACdmC,EAAWnE,KAAK+B,iBAcpB,OAZI/B,MAAKgC,kBAAkBoC,SAAS,QACnCF,EAASlE,KAAK+B,kBACdoC,EAAWnE,KAAKgC,mBAGjBmC,EAASE,YAAY,MACrBC,WAAW,WACLL,EAAOjC,kBAAkBoC,SAAS,OAAOH,EAAOjC,kBAAkBuC,QAClEN,EAAOlC,kBAAkBqC,SAAS,OAAOH,EAAOlC,kBAAkBwC,SACrE,KAEHL,EAAOM,SAAS,MACTN,KAGRjG,IAAK,UACLqF,MAAO,WAEN,GAAIY,GAASlE,KAAKyE,iBAClBzE,MAAK0E,uBAEL,IAAIC,GAAgB3E,KAAKgB,UAAU4D,KAAK,gBAAkB5E,KAAKgB,UAAU4D,KAAK,QAC1EC,EAAc7E,KAAK8E,kBAAkBH,EAAe3E,KAAKgB,UAAU4D,KAAK,eAAgB,EAE5F,KAAK,QAAS,UAAW,QAAS,YAAa,QAAS,OAAOd,QAAQe,GAAe,EAAG,MAAO7E,MAAK+E,OAAO/E,KAAKC,QAAQhB,QAAQL,KAEjI,QAAQiG,GACP,IAAK,QACJ7E,KAAKgF,cAAcL,EAAeT,GAClClE,KAAKiF,qBAAqBjF,KAAKI,cAAe,EAC9C,MACD,KAAK,UACJJ,KAAKkF,kBAAkBP,EAAeT,EACtC,MACD,KAAK,QACJlE,KAAKmF,gBAAgBnF,KAAK4D,YAAYe,GAAgBT,EACtD,MACD,KAAK,YACJlE,KAAKoF,oBAAoBpF,KAAK6D,gBAAgBc,GAAgBT,EAC9D,MACD,KAAK,QACJlE,KAAKqF,gBAAgBV,EAAeT,EACpC,MACD,SAEClE,KAAKsF,mBAAmBX,EAAeT,GAIzC,MAAOlE,SAGR/B,IAAK,gBACLqF,MAAO,SAAuBS,GAC7B,IAAKA,EAAQ,OAAO,CACpB,IAAIwB,GAAUxB,EAAOC,MAAM,kEAC3B,UAAOuB,GAAiC,KAAtBA,EAAQ,GAAG7H,SAAgB6H,EAAQ,MAGtDtH,IAAK,cACLqF,MAAO,SAAqBS,GAC3B,SAAOA,GAAUA,EAAOD,QAAQ,SAAW,IAAIC,KAGhD9F,IAAK,kBACLqF,MAAO,SAAyBS,GAC/B,SAAOA,GAAUA,EAAOD,QAAQ,aAAe,IAAIC,KAKpD9F,IAAK,iBACLqF,MAAO,SAAwBkC,GAW9B,MAVAA,GAAOA,IAAQ,EACXA,GACHxF,KAAKuB,cAAckE,IAAI,UAAW,QAClCzF,KAAKsB,QAAQ+C,YAAY,MACzBrH,EAAE,mBAAmBqE,OAAOrB,KAAKC,QAAQnB,kBAEzCkB,KAAKuB,cAAckE,IAAI,UAAW,SAClCzF,KAAKsB,QAAQkD,SAAS,MACtBxH,EAAE,mBAAmBwE,KAAK,yBAAyB0B,UAE7ClD,QAGR/B,IAAK,oBACLqF,MAAO,WACN,OACCoC,IAAK1F,KAAK2F,qBAAqB,oBAC/BC,MAAO5F,KAAK2F,qBAAqB,sBACjCE,OAAQ7F,KAAK2F,qBAAqB,uBAClCG,KAAM9F,KAAK2F,qBAAqB,yBAIlC1H,IAAK,oBACLqF,MAAO,WACN,OACCoC,IAAK1F,KAAK2F,qBAAqB,eAC/BC,MAAO5F,KAAK2F,qBAAqB,iBACjCE,OAAQ7F,KAAK2F,qBAAqB,kBAClCG,KAAM9F,KAAK2F,qBAAqB,oBAIlC1H,IAAK,uBACLqF,MAAO,SAA8ByC,GACpC,MAAOC,UAAShG,KAAKuB,cAAckE,IAAIM,GAAY,IAAMC,SAAShG,KAAK0B,eAAe+D,IAAIM,GAAY,IAAMC,SAAShG,KAAK2B,YAAY8D,IAAIM,GAAY,OAGvJ9H,IAAK,wBACLqF,MAAO,WACN,GAAI7E,GAAQuB,KAAKgB,UAAUmB,KAAK,UAAY,GACxC8D,EAAUjG,KAAKgB,UAAUmB,KAAK,WAAa,EAc/C,OAZAnC,MAAKQ,eAAgB,EACjB/B,GAASuB,KAAKC,QAAQpB,iBACzBmB,KAAKQ,eAAgB,EACrBR,KAAK4B,cAAc6D,IAAI,UAAW,IAAIjE,KAAK,gBAAgB0E,KAAKzH,GAAS,WACnEuB,KAAK4B,cAAc6D,IAAI,UAAW,QAEzCzF,KAAKS,gBAAiB,EAClBwF,GACHjG,KAAKS,gBAAiB,EACtBT,KAAK6B,cAAc4D,IAAI,UAAW,IAAIS,KAAKD,IACrCjG,KAAK6B,cAAc4D,IAAI,UAAW,QAElCzF,QAGR/B,IAAK,oBACLqF,MAAO,SAA2B6C,EAAQC,GACzC,GAAIC,GAAKrG,KAAK2D,cAAcwC,GACxBG,EAAQH,EAAOrC,QAAQ,KAAO,EAAIqC,EAAOI,OAAOJ,EAAOrC,QAAQ,MAAQ,GACvE0C,EAAQxG,KAAKgB,UAAUmB,KAAK,UAAY,IACxCsE,EAASzG,KAAKgB,UAAUmB,KAAK,WAAaqE,GAAS,IAAM,IAC7D,OAAOxG,MAAK0G,iBAAiB,2BAA6BL,EAAK,8BAAgCC,EAAOE,EAAOC,EAAQL,MAGtHnI,IAAK,kBACLqF,MAAO,SAAyB+C,EAAID,GACnC,GAAII,GAAQ,IACRC,EAASzG,KAAKgB,UAAUmB,KAAK,WAAaqE,GAAS,IAAM,IAC7D,OAAOxG,MAAK0G,iBAAiBL,EAAK,cAAeG,EAAOC,EAAQL,MAGjEnI,IAAK,sBACLqF,MAAO,SAA6B+C,EAAID,GAEvC,GAAII,GAAQxG,KAAKgB,UAAUmB,KAAK,UAAY,IACxCsE,EAASD,EAAQ,EAQrB,OAPAH,GAAuB,MAAlBA,EAAGE,WAAqBF,EAAK,IAAMA,EACxCD,EAAqBF,KAAK,kBAAoBM,EAAQ,aAAeC,EAAS,UAAYJ,EAAK,qDAC/FrG,KAAKoD,QAAQoD,EAAOC,GACpBzG,KAAKC,QAAQN,gBAAgBoD,KAAK/C,MAC9BA,KAAKG,eACRH,KAAKG,cAAcsF,IAAI,UAAW,QACnCzF,KAAK6C,gBAAe,GACb7C,QAGR/B,IAAK,mBACLqF,MAAO,SAA0BqD,EAAKH,EAAOC,EAAQL,GAQpD,MANAK,GAASA,GAAUD,EACnBJ,EAAqBF,KAAK,uEAAyEM,EAAQ,aAAeC,EAAS,UAAYE,EAAM,mFACrJ3G,KAAKoD,QAAQoD,EAAOC,GACpBzG,KAAKC,QAAQN,gBAAgBoD,KAAK/C,MAC9BA,KAAKG,eAAeH,KAAKG,cAAcsF,IAAI,UAAW,QAC1DzF,KAAK6C,gBAAe,GACb7C,QAGR/B,IAAK,kBACLqF,MAAO,SAAyBqD,EAAKP,GAEpC,GAAII,GAAQxG,KAAKgB,UAAUmB,KAAK,UAAY,IACxCsE,EAASzG,KAAKgB,UAAUmB,KAAK,WAAaqE,GAAS,IAAM,IAM7D,OALAJ,GAAqBF,KAAK,sEAAwEM,EAAQ,aAAeC,EAAS,UAAYE,EAAM,mFACpJ3G,KAAKoD,QAAQoD,EAAOC,GACpBzG,KAAKC,QAAQN,gBAAgBoD,KAAK/C,MAC9BA,KAAKG,eAAeH,KAAKG,cAAcsF,IAAI,UAAW,QAC1DzF,KAAK6C,gBAAe,GACb7C,QAGR/B,IAAK,qBACLqF,MAAO,SAA4BqD,EAAKP,GACvC,GAAIQ,GAAS5G,KAETwG,EAAQxG,KAAKgB,UAAUmB,KAAK,UAAY,IACxCsE,EAASzG,KAAKgB,UAAUmB,KAAK,WAAa,IAE1C0E,EAAuB7G,KAAKgB,UAAUmB,KAAK,0BAA2B,CAkB1E,OAjBAnC,MAAK6C,gBAAe,GAIfgE,GAAyB7G,KAAK8G,YAAYH,IAK9CP,EAAqBF,KAAK,gBAAkBS,EAAM,+CAClD3G,KAAKC,QAAQN,gBAAgBoD,KAAK/C,OALlCoG,EAAqBW,KAAKJ,EAAK3J,EAAEgK,MAAM,WACtC,MAAOJ,GAAO5F,UAAUiG,QAAQ,sBAO9BjH,KAAKG,eACRH,KAAKG,cAAcsF,IAAI,UAAW,QAEnCzF,KAAKoD,QAAQoD,EAAOC,GACbzG,QAGR/B,IAAK,cACLqF,MAAO,SAAqBqD,GAC3B,GAAI3C,GAAQ2C,EAAI3C,MAAM,6DACtB,OAAwB,gBAAbA,GAAM,IAAmBA,EAAM,GAAGtG,OAAS,GAAKsG,EAAM,GAAGkD,gBAAkBC,SAASC,UAEvE,gBAAbpD,GAAM,IAAmBA,EAAM,GAAGtG,OAAS,GAAKsG,EAAM,GAAGqD,QAAQ,GAAIC,QAAO,MACtFC,QAAS,GACTC,SAAU,KACRL,SAASC,UAAY,OAAQ,MAAQD,SAASM,QAKlDxJ,IAAK,SACLqF,MAAO,SAAgBoE,GAItB,MAHAC,SAAQC,MAAMF,GACd1H,KAAKyE,kBAAkByB,KAAKwB,GAC5B1H,KAAKoD,QAAQ,IAAK,KACXpD,QAGR/B,IAAK,uBACLqF,MAAO,SAA8BuE,EAAYC,GAEhD,GAAK9H,KAAKoC,eAAV,CAEA,GAAI2F,GAAO/K,EAAEgD,KAAKoC,eAAeiB,IAAIwE,IAAa,EAClD,IAAmB,mBAARE,GAAX,CAEA,GAAItE,GAAMsE,EAAKnD,KAAK,gBAAkBmD,EAAKnD,KAAK,OAGhD,QAF+B,UAA3BmD,EAAKnD,KAAK,cAA4B5E,KAAK0D,SAASD,KAAMzD,KAAKgF,cAAcvB,GAAK,GAElFqE,EAAgB,EAAU9H,KAAKiF,qBAAqB4C,EAAa,EAAGC,EAAgB,GAAxF,YAGD7J,IAAK,gBACLqF,MAAO,SAAuBG,EAAKuE,GAClC,GAAIC,GAASjI,IAEbgI,GAAqBA,IAAsB,CAE3C,IAAIE,GAAM,GAAIC,MA8Bd,OA7BIH,KACH,WAGC,GAAII,GAAiB9D,WAAW,WAC/B0D,EAAmB3G,OAAO4G,EAAOhI,QAAQnB,iBACvC,IAEHoJ,GAAIG,OAAS,WACRD,GAAgBE,aAAaF,GACjCA,EAAiB,IACjB,IAAIG,GAAQvL,EAAE,UAQd,OAPAuL,GAAM3D,KAAK,MAAOsD,EAAIzE,KACtB8E,EAAM/D,SAAS,aACfwD,EAAmB9B,KAAKqC,GACpBN,EAAO9H,eAAe8H,EAAO9H,cAAcsF,IAAI,UAAW,IAE9DwC,EAAO7E,QAAQ8E,EAAI1B,MAAO0B,EAAIzB,QAC9BwB,EAAOpF,gBAAe,GACfoF,EAAOhI,QAAQN,gBAAgBoD,KAAKkF,IAE5CC,EAAIM,QAAU,WAEb,MADAP,GAAOpF,gBAAe,GACfoF,EAAOlD,OAAOkD,EAAOhI,QAAQhB,QAAQE,MAAQ,KAAOsE,QAK9DyE,EAAIzE,IAAMA,EACHyE,KAGRjK,IAAK,UACLqF,MAAO,SAAiBkD,EAAOC,GAE9BA,EAASA,GAAUD,EACnBxG,KAAKU,aAAe8F,EACpBxG,KAAKW,cAAgB8F,CAGrB,IAAIgC,GAAwBzI,KAAKM,SAASwF,KAAO9F,KAAKM,SAASsF,MAAQ5F,KAAKO,QAAQuF,KAAO9F,KAAKO,QAAQqF,MACpG8C,EAAW7H,KAAK8H,IAAInC,EAAQiC,EAAuBzI,KAAKC,QAAQb,IAAI+B,KAAKyH,YACzEpC,GAAQiC,EAAwBC,GACnCjC,GAAUiC,EAAWD,GAAyBjC,EAAQC,EACtDD,EAAQkC,GACFlC,GAAgBiC,CAEvB,IAAII,GAAe,EACfC,EAAe,CAIf9I,MAAKS,iBAAgBqI,EAAe9I,KAAK6B,cAAckH,aAAY,IAAS,IAE5E/I,KAAKQ,gBAAeqI,EAAe7I,KAAK4B,cAAcmH,aAAY,IAAS,GAE/E,IAAIC,GAAgBhJ,KAAKM,SAASoF,IAAM1F,KAAKM,SAASuF,OAAS7F,KAAKO,QAAQsF,OAAS7F,KAAKO,QAAQmF,IAG9FuD,EAAUC,WAAWlJ,KAAKuB,cAAckE,IAAI,eAAiByD,WAAWlJ,KAAKuB,cAAckE,IAAI,kBAE/F0D,EAAYtI,KAAK8H,IAAIlC,EAAQzJ,EAAEiG,QAAQwD,SAAWuC,EAAgBC,EAAUJ,EAAeC,EAC/F,IAAIrC,EAAS0C,EAAW,CAEvB,GAAIC,GAASvI,KAAK8H,IAAIQ,EAAY1C,EAAQ,EAC1CD,GAAQ3F,KAAKwI,KAAKD,EAAS5C,GAO5B,MAJAxG,MAAK8B,oBAAoB2D,IAAI,SAAU0D,GACvCnJ,KAAKuB,cAAckE,IAAI,QAAS,QAAQA,IAAI,WAAYe,GAExDxG,KAAKsB,QAAQ6B,MAAM,iBACZnD,UAGR/B,IAAK,mBACLqF,MAAO,SAA0BxD,GAChC,GAAIwJ,GAAStJ,IAGb,OADAF,GAASA,MACFE,KAAKuJ,KAAK,WAChB,GAAIC,GAAQxM,EAAEsM,GACVrJ,EAAUjD,EAAEkD,UAAWN,EAASpB,QAASgL,EAAMrH,OAA0B,gBAAXrC,IAAuBA,EAEzF,IAAIF,GAAS0J,EAAQrJ,SAKjBL,IAUR,OAPA5C,GAAEuB,GAAGF,GAAQuB,EAAS6J,iBACtBzM,EAAEuB,GAAGF,GAAMlB,YAAcyC,EACzB5C,EAAEuB,GAAGF,GAAMqL,WAAa,WAEvB,MADA1M,GAAEuB,GAAGF,GAAQC,EACNsB,EAAS6J,kBAGV7J,IACLqB,SAGDA","file":"ekko-lightbox.min.js"} \ No newline at end of file diff --git a/bower_components/ekko-lightbox/ekko-lightbox.js b/bower_components/ekko-lightbox/ekko-lightbox.js new file mode 100644 index 0000000000..c193c64bc2 --- /dev/null +++ b/bower_components/ekko-lightbox/ekko-lightbox.js @@ -0,0 +1,590 @@ +const Lightbox = (($) => { + + const NAME = 'ekkoLightbox' + const JQUERY_NO_CONFLICT = $.fn[NAME] + + const Default = { + title: '', + footer: '', + showArrows: true, //display the left / right arrows or not + type: null, //force the lightbox into image / youtube mode. if null, or not image|youtube|vimeo; detect it + alwaysShowClose: false, //always show the close button, even if there is no title + loadingMessage: '
      ', // http://tobiasahlin.com/spinkit/ + leftArrow: '', + rightArrow: '', + strings: { + close: 'Close', + fail: 'Failed to load image:', + type: 'Could not detect remote target type. Force the type using data-type', + }, + doc: document, // if in an iframe can specify top.document + onShow() {}, + onShown() {}, + onHide() {}, + onHidden() {}, + onNavigate() {}, + onContentLoaded() {} + } + + class Lightbox { + + /** + + Class properties: + + _$element: null -> the element currently being displayed + _$modal: The bootstrap modal generated + _$modalDialog: The .modal-dialog + _$modalContent: The .modal-content + _$modalBody: The .modal-body + _$modalHeader: The .modal-header + _$modalFooter: The .modal-footer + _$lightboxContainerOne: Container of the first lightbox element + _$lightboxContainerTwo: Container of the second lightbox element + _$lightboxBody: First element in the container + _$modalArrows: The overlayed arrows container + + _$galleryItems: Other 's available for this gallery + _galleryName: Name of the current data('gallery') showing + _galleryIndex: The current index of the _$galleryItems being shown + + _config: {} the options for the modal + _modalId: unique id for the current lightbox + _padding / _border: CSS properties for the modal container; these are used to calculate the available space for the content + + */ + + static get Default() { + return Default + } + + constructor($element, config) { + this._config = $.extend({}, Default, config) + this._$modalArrows = null + this._galleryIndex = 0 + this._galleryName = null + this._padding = null + this._border = null + this._titleIsShown = false + this._footerIsShown = false + this._wantedWidth = 0 + this._wantedHeight = 0 + this._modalId = `ekkoLightbox-${Math.floor((Math.random() * 1000) + 1)}`; + this._$element = $element instanceof jQuery ? $element : $($element) + + let header = ``; + let footer = ``; + let body = '' + let dialog = `` + $(this._config.doc.body).append(``) + + this._$modal = $(`#${this._modalId}`, this._config.doc) + this._$modalDialog = this._$modal.find('.modal-dialog').first() + this._$modalContent = this._$modal.find('.modal-content').first() + this._$modalBody = this._$modal.find('.modal-body').first() + this._$modalHeader = this._$modal.find('.modal-header').first() + this._$modalFooter = this._$modal.find('.modal-footer').first() + + this._$lightboxContainer = this._$modalBody.find('.ekko-lightbox-container').first() + this._$lightboxBodyOne = this._$lightboxContainer.find('> div:first-child').first() + this._$lightboxBodyTwo = this._$lightboxContainer.find('> div:last-child').first() + + this._border = this._calculateBorders() + this._padding = this._calculatePadding() + + this._galleryName = this._$element.data('gallery') + if (this._galleryName) { + this._$galleryItems = $(document.body).find(`*[data-gallery="${this._galleryName}"]`) + this._galleryIndex = this._$galleryItems.index(this._$element) + $(document).on('keydown.ekkoLightbox', this._navigationalBinder.bind(this)) + + // add the directional arrows to the modal + if (this._config.showArrows && this._$galleryItems.length > 1) { + this._$lightboxContainer.append(``) + this._$modalArrows = this._$lightboxContainer.find('div.ekko-lightbox-nav-overlay').first() + this._$lightboxContainer.on('click', 'a:first-child', event => { + event.preventDefault() + return this.navigateLeft() + }) + this._$lightboxContainer.on('click', 'a:last-child', event => { + event.preventDefault() + return this.navigateRight() + }) + } + } + + this._$modal + .on('show.bs.modal', this._config.onShow.bind(this)) + .on('shown.bs.modal', () => { + this._toggleLoading(true) + this._handle() + return this._config.onShown.call(this) + }) + .on('hide.bs.modal', this._config.onHide.bind(this)) + .on('hidden.bs.modal', () => { + if (this._galleryName) { + $(document).off('keydown.ekkoLightbox') + $(window).off('resize.ekkoLightbox') + } + this._$modal.remove() + return this._config.onHidden.call(this) + }) + .modal(this._config) + + $(window).on('resize.ekkoLightbox', () => { + this._resize(this._wantedWidth, this._wantedHeight) + }) + } + + element() { + return this._$element; + } + + modal() { + return this._$modal; + } + + navigateTo(index) { + + if (index < 0 || index > this._$galleryItems.length-1) + return this + + this._galleryIndex = index + + this._$element = $(this._$galleryItems.get(this._galleryIndex)) + this._handle(); + } + + navigateLeft() { + + if (this._$galleryItems.length === 1) + return + + if (this._galleryIndex === 0) + this._galleryIndex = this._$galleryItems.length - 1 + else //circular + this._galleryIndex-- + + this._config.onNavigate.call(this, 'left', this._galleryIndex) + return this.navigateTo(this._galleryIndex) + } + + navigateRight() { + + if (this._$galleryItems.length === 1) + return + + if (this._galleryIndex === this._$galleryItems.length - 1) + this._galleryIndex = 0 + else //circular + this._galleryIndex++ + + this._config.onNavigate.call(this, 'right', this._galleryIndex) + return this.navigateTo(this._galleryIndex) + } + + close() { + return this._$modal.modal('hide'); + } + + // helper private methods + _navigationalBinder(event) { + event = event || window.event; + if (event.keyCode === 39) + return this.navigateRight() + if (event.keyCode === 37) + return this.navigateLeft() + } + + // type detection private methods + _detectRemoteType(src, type) { + + type = type || false; + + if(!type && this._isImage(src)) + type = 'image'; + if(!type && this._getYoutubeId(src)) + type = 'youtube'; + if(!type && this._getVimeoId(src)) + type = 'vimeo'; + if(!type && this._getInstagramId(src)) + type = 'instagram'; + + if(!type || ['image', 'youtube', 'vimeo', 'instagram', 'video', 'url'].indexOf(type) < 0) + type = 'url'; + + return type; + } + + _isImage(string) { + return string && string.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i) + } + + _containerToUse() { + // if currently showing an image, fade it out and remove + let $toUse = this._$lightboxBodyTwo + let $current = this._$lightboxBodyOne + + if(this._$lightboxBodyTwo.hasClass('in')) { + $toUse = this._$lightboxBodyOne + $current = this._$lightboxBodyTwo + } + + $current.removeClass('in') + setTimeout(() => { + if(!this._$lightboxBodyTwo.hasClass('in')) + this._$lightboxBodyTwo.empty() + if(!this._$lightboxBodyOne.hasClass('in')) + this._$lightboxBodyOne.empty() + }, 500) + + $toUse.addClass('in') + return $toUse + } + + _handle() { + + let $toUse = this._containerToUse() + this._updateTitleAndFooter() + + let currentRemote = this._$element.attr('data-remote') || this._$element.attr('href') + let currentType = this._detectRemoteType(currentRemote, this._$element.attr('data-type') || false) + + if(['image', 'youtube', 'vimeo', 'instagram', 'video', 'url'].indexOf(currentType) < 0) + return this._error(this._config.strings.type) + + switch(currentType) { + case 'image': + this._preloadImage(currentRemote, $toUse) + this._preloadImageByIndex(this._galleryIndex, 3) + break; + case 'youtube': + this._showYoutubeVideo(currentRemote, $toUse); + break; + case 'vimeo': + this._showVimeoVideo(this._getVimeoId(currentRemote), $toUse); + break; + case 'instagram': + this._showInstagramVideo(this._getInstagramId(currentRemote), $toUse); + break; + case 'video': + this._showHtml5Video(currentRemote, $toUse); + break; + default: // url + this._loadRemoteContent(currentRemote, $toUse); + break; + } + + return this; + } + + _getYoutubeId(string) { + if(!string) + return false; + let matches = string.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/) + return (matches && matches[2].length === 11) ? matches[2] : false + } + + _getVimeoId(string) { + return string && string.indexOf('vimeo') > 0 ? string : false + } + + _getInstagramId(string) { + return string && string.indexOf('instagram') > 0 ? string : false + } + + // layout private methods + _toggleLoading(show) { + show = show || false + if(show) { + this._$modalDialog.css('display', 'none') + this._$modal.removeClass('in') + $('.modal-backdrop').append(this._config.loadingMessage) + } + else { + this._$modalDialog.css('display', 'block') + this._$modal.addClass('in') + $('.modal-backdrop').find('.ekko-lightbox-loader').remove() + } + return this; + } + + _calculateBorders() { + return { + top: this._totalCssByAttribute('border-top-width'), + right: this._totalCssByAttribute('border-right-width'), + bottom: this._totalCssByAttribute('border-bottom-width'), + left: this._totalCssByAttribute('border-left-width'), + } + } + + _calculatePadding() { + return { + top: this._totalCssByAttribute('padding-top'), + right: this._totalCssByAttribute('padding-right'), + bottom: this._totalCssByAttribute('padding-bottom'), + left: this._totalCssByAttribute('padding-left'), + } + } + + _totalCssByAttribute(attribute) { + return parseInt(this._$modalDialog.css(attribute), 10) + + parseInt(this._$modalContent.css(attribute), 10) + + parseInt(this._$modalBody.css(attribute), 10) + } + + _updateTitleAndFooter() { + let title = this._$element.data('title') || "" + let caption = this._$element.data('footer') || "" + + this._titleIsShown = false + if (title || this._config.alwaysShowClose) { + this._titleIsShown = true + this._$modalHeader.css('display', '').find('.modal-title').html(title || " ") + } + else + this._$modalHeader.css('display', 'none') + + this._footerIsShown = false + if (caption) { + this._footerIsShown = true + this._$modalFooter.css('display', '').html(caption) + } + else + this._$modalFooter.css('display', 'none') + + return this; + } + + _showYoutubeVideo(remote, $containerForElement) { + let id = this._getYoutubeId(remote) + let query = remote.indexOf('&') > 0 ? remote.substr(remote.indexOf('&')) : '' + let width = this._$element.data('width') || 560 + let height = this._$element.data('height') || width / ( 560/315 ) + return this._showVideoIframe( + `//www.youtube.com/embed/${id}?badge=0&autoplay=1&html5=1${query}`, + width, + height, + $containerForElement + ); + } + + _showVimeoVideo(id, $containerForElement) { + let width = 500 + let height = this._$element.data('height') || width / ( 560/315 ) + return this._showVideoIframe(id + '?autoplay=1', width, height, $containerForElement) + } + + _showInstagramVideo(id, $containerForElement) { + // instagram load their content into iframe's so this can be put straight into the element + let width = this._$element.data('width') || 612 + let height = width + 80; + id = id.substr(-1) !== '/' ? id + '/' : id; // ensure id has trailing slash + $containerForElement.html(``); + this._resize(width, height); + this._config.onContentLoaded.call(this); + if (this._$modalArrows) //hide the arrows when showing video + this._$modalArrows.css('display', 'none'); + this._toggleLoading(false); + return this; + } + + _showVideoIframe(url, width, height, $containerForElement) { // should be used for videos only. for remote content use loadRemoteContent (data-type=url) + height = height || width; // default to square + $containerForElement.html(`
      `); + this._resize(width, height); + this._config.onContentLoaded.call(this); + if (this._$modalArrows) + this._$modalArrows.css('display', 'none'); //hide the arrows when showing video + this._toggleLoading(false); + return this; + } + + _showHtml5Video(url, $containerForElement) { // should be used for videos only. for remote content use loadRemoteContent (data-type=url) + let width = this._$element.data('width') || 560 + let height = this._$element.data('height') || width / ( 560/315 ) + $containerForElement.html(`
      `); + this._resize(width, height); + this._config.onContentLoaded.call(this); + if (this._$modalArrows) + this._$modalArrows.css('display', 'none'); //hide the arrows when showing video + this._toggleLoading(false); + return this; + } + + _loadRemoteContent(url, $containerForElement) { + let width = this._$element.data('width') || 560; + let height = this._$element.data('height') || 560; + + let disableExternalCheck = this._$element.data('disableExternalCheck') || false; + this._toggleLoading(false); + + // external urls are loading into an iframe + // local ajax can be loaded into the container itself + if (!disableExternalCheck && !this._isExternal(url)) { + $containerForElement.load(url, $.proxy(() => { + return this._$element.trigger('loaded.bs.modal');l + })); + + } else { + $containerForElement.html(``); + this._config.onContentLoaded.call(this); + } + + if (this._$modalArrows) //hide the arrows when remote content + this._$modalArrows.css('display', 'none') + + this._resize(width, height); + return this; + } + + _isExternal(url) { + let match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/); + if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) + return true; + + if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(`:(${{ + "http:": 80, + "https:": 443 + }[location.protocol]})?$`), "") !== location.host) + return true; + + return false; + } + + _error( message ) { + console.error(message); + this._containerToUse().html(message); + this._resize(300, 300); + return this; + } + + _preloadImageByIndex(startIndex, numberOfTimes) { + + if(!this._$galleryItems) + return; + + let next = $(this._$galleryItems.get(startIndex), false) + if(typeof next == 'undefined') + return + + let src = next.attr('data-remote') || next.attr('href') + if (next.attr('data-type') === 'image' || this._isImage(src)) + this._preloadImage(src, false) + + if(numberOfTimes > 0) + return this._preloadImageByIndex(startIndex + 1, numberOfTimes-1); + } + + _preloadImage( src, $containerForImage) { + + $containerForImage = $containerForImage || false + + let img = new Image(); + if ($containerForImage) { + + // if loading takes > 200ms show a loader + let loadingTimeout = setTimeout(() => { + $containerForImage.append(this._config.loadingMessage) + }, 200) + + img.onload = () => { + if(loadingTimeout) + clearTimeout(loadingTimeout) + loadingTimeout = null; + let image = $(''); + image.attr('src', img.src); + image.addClass('img-fluid'); + $containerForImage.html(image); + if (this._$modalArrows) + this._$modalArrows.css('display', '') // remove display to default to css property + + this._resize(img.width, img.height); + this._toggleLoading(false); + return this._config.onContentLoaded.call(this); + }; + img.onerror = () => { + this._toggleLoading(false); + return this._error(this._config.strings.fail+` ${src}`); + }; + } + + img.src = src; + return img; + } + + _resize( width, height ) { + + height = height || width + this._wantedWidth = width + this._wantedHeight = height + + // if width > the available space, scale down the expected width and height + let widthBorderAndPadding = this._padding.left + this._padding.right + this._border.left + this._border.right + let maxWidth = Math.min(width + widthBorderAndPadding, this._config.doc.body.clientWidth) + if((width + widthBorderAndPadding) > maxWidth) { + height = ((maxWidth - widthBorderAndPadding) / width) * height + width = maxWidth + } else + width = (width + widthBorderAndPadding) + + let headerHeight = 0, + footerHeight = 0 + + // as the resize is performed the modal is show, the calculate might fail + // if so, default to the default sizes + if (this._footerIsShown) + footerHeight = this._$modalFooter.outerHeight(true) || 55 + + if (this._titleIsShown) + headerHeight = this._$modalHeader.outerHeight(true) || 67 + + let borderPadding = this._padding.top + this._padding.bottom + this._border.bottom + this._border.top + + //calculated each time as resizing the window can cause them to change due to Bootstraps fluid margins + let margins = parseFloat(this._$modalDialog.css('margin-top')) + parseFloat(this._$modalDialog.css('margin-bottom')); + + let maxHeight = Math.min(height, $(window).height() - borderPadding - margins - headerHeight - footerHeight); + if(height > maxHeight) { + // if height > the available height, scale down the width + let factor = Math.min(maxHeight / height, 1); + width = Math.ceil(factor * width); + } + + this._$lightboxContainer.css('height', maxHeight) + this._$modalDialog.css('width', 'auto') .css('maxWidth', width); + + this._$modal.modal('_handleUpdate'); + return this; + } + + static _jQueryInterface(config) { + config = config || {} + return this.each(() => { + let $this = $(this) + let _config = $.extend( + {}, + Lightbox.Default, + $this.data(), + typeof config === 'object' && config + ) + + new Lightbox(this, _config) + }) + } + } + + + + $.fn[NAME] = Lightbox._jQueryInterface + $.fn[NAME].Constructor = Lightbox + $.fn[NAME].noConflict = () => { + $.fn[NAME] = JQUERY_NO_CONFLICT + return Lightbox._jQueryInterface + } + + return Lightbox + +})(jQuery) + +export default Lightbox \ No newline at end of file diff --git a/bower_components/ekko-lightbox/ekko-lightbox.less b/bower_components/ekko-lightbox/ekko-lightbox.less new file mode 100644 index 0000000000..80fac57640 --- /dev/null +++ b/bower_components/ekko-lightbox/ekko-lightbox.less @@ -0,0 +1,130 @@ +.ekko-lightbox { + &-container { + position:relative; + > div.ekko-lightbox-item { + position:absolute; + top:0; + left:0; + bottom:0; + right:0; + width:100%; + } + } + + iframe { + width: 100%; + height: 100%; + } + + &-nav-overlay { + z-index:100; + position: absolute; + top:0; + left:0; + width:100%; + height:100%; + display: flex; + + a { + flex: 1; + display:flex; + align-items: center; + + opacity: 0; + transition: opacity 0.5s; + color:#fff; + font-size:30px; + z-index:100; + + > * { + flex-grow:1; + &:focus { + outline: none; + } + } + span { + padding:0 30px; + } + &:last-child span { + text-align: right; + } + &:hover { + text-decoration: none; + } + &:focus { + outline: none; + } + } + } + + a:hover { + opacity: 1; + text-decoration: none; + } + .modal-dialog { + display:none; + } + .modal-footer { + text-align: left; + } + + // http://tobiasahlin.com/spinkit/ + &-loader { + position:absolute; + top:0; + left:0; + bottom:0; + right:0; + width:100%; + + display: flex; /* establish flex container */ + flex-direction: column; /* make main axis vertical */ + justify-content: center; /* center items vertically, in this case */ + align-items: center; + + > div { + width: 40px; + height: 40px; + + position: relative; + text-align: center; + + > div { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #fff; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + + animation: sk-bounce 2.0s infinite ease-in-out; + &:last-child { + animation-delay: -1.0s; + } + } + } + } + + .modal-dialog &-loader { + > div > div { + background-color:#333; + } + } + + @-webkit-keyframes sk-bounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } + } + + @keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } + } +} \ No newline at end of file diff --git a/bower_components/ekko-lightbox/package.json b/bower_components/ekko-lightbox/package.json new file mode 100644 index 0000000000..213bd2f3b5 --- /dev/null +++ b/bower_components/ekko-lightbox/package.json @@ -0,0 +1,46 @@ +{ + "name": "ekko-lightbox", + "description": "A lightbox gallery plugin for Bootstrap based on the modal plugin", + "version": "5.0.0", + "keywords": [ + "lightbox", + "gallery", + "bootstrap", + "jquery", + "modal" + ], + "homepage": "https://github.com/ashleydw/lightbox", + "author": "ashleydw ", + "main": "dist/ekko-lightbox.min.js", + "style": "dist/ekko-lightbox.css", + "less": "ekko-lightbox.less", + "repository": { + "type": "git", + "url": "https://github.com/ashleydw/lightbox.git" + }, + "bugs": { + "url": "https://github.com/ashleydw/lightbox/issues" + }, + "license": "MIT", + "devDependencies": { + "autoprefixer": "^6.4.0", + "babel-preset-es2015": "^6.13.2", + "cssnano": "^3.7.4", + "grunt": "^0.4.5", + "grunt-babel": "^5.0.0", + "grunt-contrib-less": "^1.4.0", + "grunt-contrib-uglify": "^0.11.0", + "grunt-contrib-watch": "^0.6.1", + "grunt-postcss": "^0.8.0", + "grunt-stamp": "^0.3.0" + }, + "npmName": "ekko-lightbox", + "npmFileMap": [ + { + "basePath": "/dist/", + "files": [ + "*" + ] + } + ] +} diff --git a/bower_components/fastclick/.bower.json b/bower_components/fastclick/.bower.json new file mode 100644 index 0000000000..d20384f435 --- /dev/null +++ b/bower_components/fastclick/.bower.json @@ -0,0 +1,24 @@ +{ + "name": "fastclick", + "main": "lib/fastclick.js", + "ignore": [ + "**/.*", + "component.json", + "package.json", + "Makefile", + "tests", + "examples" + ], + "homepage": "https://github.com/ftlabs/fastclick", + "version": "1.0.6", + "_release": "1.0.6", + "_resolution": { + "type": "version", + "tag": "v1.0.6", + "commit": "2ac7258407619398005ca720596f0d36ce66a6c8" + }, + "_source": "https://github.com/ftlabs/fastclick.git", + "_target": "^1.0.6", + "_originalSource": "fastclick", + "_direct": true +} \ No newline at end of file diff --git a/bower_components/fastclick/LICENSE b/bower_components/fastclick/LICENSE new file mode 100644 index 0000000000..459a20dbcc --- /dev/null +++ b/bower_components/fastclick/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 The Financial Times Ltd. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/bower_components/fastclick/README.md b/bower_components/fastclick/README.md new file mode 100644 index 0000000000..074895dc45 --- /dev/null +++ b/bower_components/fastclick/README.md @@ -0,0 +1,140 @@ +# FastClick # + +FastClick is a simple, easy-to-use library for eliminating the 300ms delay between a physical tap and the firing of a `click` event on mobile browsers. The aim is to make your application feel less laggy and more responsive while avoiding any interference with your current logic. + +FastClick is developed by [FT Labs](http://labs.ft.com/), part of the Financial Times. + +[Explication en français](http://maxime.sh/2013/02/supprimer-le-lag-des-clics-sur-mobile-avec-fastclick/). + +[日本語で説明](https://developer.mozilla.org/ja/docs/Mozilla/Firefox_OS/Apps/Tips_and_techniques#Make_events_immediate)。 + +## Why does the delay exist? ## + +According to [Google](https://developers.google.com/mobile/articles/fast_buttons): + +> ...mobile browsers will wait approximately 300ms from the time that you tap the button to fire the click event. The reason for this is that the browser is waiting to see if you are actually performing a double tap. + +## Compatibility ## + +The library has been deployed as part of the [FT Web App](http://app.ft.com/) and is tried and tested on the following mobile browsers: + +* Mobile Safari on iOS 3 and upwards +* Chrome on iOS 5 and upwards +* Chrome on Android (ICS) +* Opera Mobile 11.5 and upwards +* Android Browser since Android 2 +* PlayBook OS 1 and upwards + +## When it isn't needed ## + +FastClick doesn't attach any listeners on desktop browsers. + +Chrome 32+ on Android with `width=device-width` in the [viewport meta tag](https://developer.mozilla.org/en-US/docs/Mobile/Viewport_meta_tag) doesn't have a 300ms delay, therefore listeners aren't attached. + +```html + +``` + +Same goes for Chrome on Android (all versions) with `user-scalable=no` in the viewport meta tag. But be aware that `user-scalable=no` also disables pinch zooming, which may be an accessibility concern. + +For IE11+, you can use `touch-action: manipulation;` to disable double-tap-to-zoom on certain elements (like links and buttons). For IE10 use `-ms-touch-action: manipulation`. + +## Usage ## + +Include fastclick.js in your JavaScript bundle or add it to your HTML page like this: + +```html + +``` + +The script must be loaded prior to instantiating FastClick on any element of the page. + +To instantiate FastClick on the `body`, which is the recommended method of use: + +```js +if ('addEventListener' in document) { + document.addEventListener('DOMContentLoaded', function() { + FastClick.attach(document.body); + }, false); +} +``` + +Or, if you're using jQuery: + +```js +$(function() { + FastClick.attach(document.body); +}); +``` + +If you're using Browserify or another CommonJS-style module system, the `FastClick.attach` function will be returned when you call `require('fastclick')`. As a result, the easiest way to use FastClick with these loaders is as follows: + +```js +var attachFastClick = require('fastclick'); +attachFastClick(document.body); +``` + +### Minified ### + +Run `make` to build a minified version of FastClick using the Closure Compiler REST API. The minified file is saved to `build/fastclick.min.js` or you can [download a pre-minified version](http://build.origami.ft.com/bundles/js?modules=fastclick). + +Note: the pre-minified version is built using [our build service](http://origami.ft.com/docs/developer-guide/build-service/) which exposes the `FastClick` object through `Origami.fastclick` and will have the Browserify/CommonJS API (see above). + +```js +var attachFastClick = Origami.fastclick; +attachFastClick(document.body); +``` + +### AMD ### + +FastClick has AMD (Asynchronous Module Definition) support. This allows it to be lazy-loaded with an AMD loader, such as [RequireJS](http://requirejs.org/). Note that when using the AMD style require, the full `FastClick` object will be returned, _not_ `FastClick.attach` + +```js +var FastClick = require('fastclick'); +FastClick.attach(document.body, options); +``` + +### Package managers ### + +You can install FastClick using [Component](https://github.com/component/component), [npm](https://npmjs.org/package/fastclick) or [Bower](http://bower.io/). + +For Ruby, there's a third-party gem called [fastclick-rails](http://rubygems.org/gems/fastclick-rails). For .NET there's a [NuGet package](http://nuget.org/packages/FastClick). + +## Advanced ## + +### Ignore certain elements with `needsclick` ### + +Sometimes you need FastClick to ignore certain elements. You can do this easily by adding the `needsclick` class. +```html +Ignored by FastClick +``` + +#### Use case 1: non-synthetic click required #### + +Internally, FastClick uses `document.createEvent` to fire a synthetic `click` event as soon as `touchend` is fired by the browser. It then suppresses the additional `click` event created by the browser after that. In some cases, the non-synthetic `click` event created by the browser is required, as described in the [triggering focus example](http://ftlabs.github.com/fastclick/examples/focus.html). + +This is where the `needsclick` class comes in. Add the class to any element that requires a non-synthetic click. + +#### Use case 2: Twitter Bootstrap 2.2.2 dropdowns #### + +Another example of when to use the `needsclick` class is with dropdowns in Twitter Bootstrap 2.2.2. Bootstrap add its own `touchstart` listener for dropdowns, so you want to tell FastClick to ignore those. If you don't, touch devices will automatically close the dropdown as soon as it is clicked, because both FastClick and Bootstrap execute the synthetic click, one opens the dropdown, the second closes it immediately after. + +```html +Dropdown +``` + +## Examples ## + +FastClick is designed to cope with many different browser oddities. Here are some examples to illustrate this: + +* [basic use](http://ftlabs.github.com/fastclick/examples/layer.html) showing the increase in perceived responsiveness +* [triggering focus](http://ftlabs.github.com/fastclick/examples/focus.html) on an input element from a `click` handler +* [input element](http://ftlabs.github.com/fastclick/examples/input.html) which never receives clicks but gets fast focus + +## Tests ## + +There are no automated tests. The files in `tests/` are manual reduced test cases. We've had a think about how best to test these cases, but they tend to be very browser/device specific and sometimes subjective which means it's not so trivial to test. + +## Credits and collaboration ## + +FastClick is maintained by [Rowan Beentje](http://twitter.com/rowanbeentje), [Matthew Caruana Galizia](http://twitter.com/mcaruanagalizia) and [Matthew Andrews](http://twitter.com/andrewsmatt) at [FT Labs](http://labs.ft.com). All open source code released by FT Labs is licenced under the MIT licence. We welcome comments, feedback and suggestions. Please feel free to raise an issue or pull request. diff --git a/bower_components/fastclick/bower.json b/bower_components/fastclick/bower.json new file mode 100644 index 0000000000..18e1abd47f --- /dev/null +++ b/bower_components/fastclick/bower.json @@ -0,0 +1,12 @@ +{ + "name": "fastclick", + "main": "lib/fastclick.js", + "ignore": [ + "**/.*", + "component.json", + "package.json", + "Makefile", + "tests", + "examples" + ] +} diff --git a/public/assets/js/plugins/fastclick/fastclick.js b/bower_components/fastclick/lib/fastclick.js old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/fastclick/fastclick.js rename to bower_components/fastclick/lib/fastclick.js diff --git a/bower_components/font-awesome/.bower.json b/bower_components/font-awesome/.bower.json new file mode 100644 index 0000000000..14de73d6af --- /dev/null +++ b/bower_components/font-awesome/.bower.json @@ -0,0 +1,37 @@ +{ + "name": "font-awesome", + "description": "Font Awesome", + "keywords": [], + "homepage": "http://fontawesome.io", + "dependencies": {}, + "devDependencies": {}, + "license": [ + "OFL-1.1", + "MIT", + "CC-BY-3.0" + ], + "main": [ + "less/font-awesome.less", + "scss/font-awesome.scss" + ], + "ignore": [ + "*/.*", + "*.json", + "src", + "*.yml", + "Gemfile", + "Gemfile.lock", + "*.md" + ], + "version": "4.7.0", + "_release": "4.7.0", + "_resolution": { + "type": "version", + "tag": "v4.7.0", + "commit": "a3fe90fa5f6fac55d197f9cbd18e3f57dafb716c" + }, + "_source": "https://github.com/FortAwesome/Font-Awesome.git", + "_target": "^4.7.0", + "_originalSource": "fontawesome", + "_direct": true +} \ No newline at end of file diff --git a/bower_components/font-awesome/.gitignore b/bower_components/font-awesome/.gitignore new file mode 100644 index 0000000000..39c4f20b70 --- /dev/null +++ b/bower_components/font-awesome/.gitignore @@ -0,0 +1,33 @@ +*.pyc +*.egg-info +*.db +*.db.old +*.swp +*.db-journal + +.coverage +.DS_Store +.installed.cfg +_gh_pages/* + +.idea/* +.svn/* +src/website/static/* +src/website/media/* + +bin +cfcache +develop-eggs +dist +downloads +eggs +parts +tmp +.sass-cache +node_modules + +src/website/settingslocal.py +stunnel.log + +.ruby-version +.bundle diff --git a/bower_components/font-awesome/.npmignore b/bower_components/font-awesome/.npmignore new file mode 100644 index 0000000000..54a691f815 --- /dev/null +++ b/bower_components/font-awesome/.npmignore @@ -0,0 +1,42 @@ +*.pyc +*.egg-info +*.db +*.db.old +*.swp +*.db-journal + +.coverage +.DS_Store +.installed.cfg +_gh_pages/* + +.idea/* +.svn/* +src/website/static/* +src/website/media/* + +bin +cfcache +develop-eggs +dist +downloads +eggs +parts +tmp +.sass-cache +node_modules + +src/website/settingslocal.py +stunnel.log + +.ruby-version + +# don't need these in the npm package. +src/ +_config.yml +bower.json +component.json +composer.json +CONTRIBUTING.md +Gemfile +Gemfile.lock diff --git a/bower_components/font-awesome/HELP-US-OUT.txt b/bower_components/font-awesome/HELP-US-OUT.txt new file mode 100644 index 0000000000..83d083dd77 --- /dev/null +++ b/bower_components/font-awesome/HELP-US-OUT.txt @@ -0,0 +1,7 @@ +I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, +Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, +comprehensive icon sets or copy and paste your own. + +Please. Check it out. + +-Dave Gandy diff --git a/bower_components/font-awesome/bower.json b/bower_components/font-awesome/bower.json new file mode 100644 index 0000000000..9e2112659b --- /dev/null +++ b/bower_components/font-awesome/bower.json @@ -0,0 +1,22 @@ +{ + "name": "font-awesome", + "description": "Font Awesome", + "keywords": [], + "homepage": "http://fontawesome.io", + "dependencies": {}, + "devDependencies": {}, + "license": ["OFL-1.1", "MIT", "CC-BY-3.0"], + "main": [ + "less/font-awesome.less", + "scss/font-awesome.scss" + ], + "ignore": [ + "*/.*", + "*.json", + "src", + "*.yml", + "Gemfile", + "Gemfile.lock", + "*.md" + ] +} diff --git a/bower_components/font-awesome/css/font-awesome.css b/bower_components/font-awesome/css/font-awesome.css new file mode 100644 index 0000000000..cc3bbfc042 --- /dev/null +++ b/bower_components/font-awesome/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 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('../../assets/fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../../assets/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../../assets/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../../assets/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../../assets/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../../assets/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + 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.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.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-remove:before, +.fa-close:before, +.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-photo:before, +.fa-image:before, +.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, +.fa-bar-chart: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-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.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-navicon:before, +.fa-reorder:before, +.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-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc: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-mail-reply-all:before, +.fa-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, +.fa-gratipay: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"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/bower_components/font-awesome/css/font-awesome.css.map b/bower_components/font-awesome/css/font-awesome.css.map new file mode 100644 index 0000000000..60763a8640 --- /dev/null +++ b/bower_components/font-awesome/css/font-awesome.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";;;;;;;AAGA,UAUC;EATC,WAAW,EAAE,aAAa;EAC1B,GAAG,EAAE,+CAAgE;EACrE,GAAG,EAAE,ySAAmG;EAKxG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;ACTpB,GAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,uCAAwD;EAC9D,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EAClC,SAAS,EAAE,eAAe;;;ACN5B,MAAsB;EACpB,SAAS,EAAE,SAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;ACVtC,MAAsB;EACpB,KAAK,EAAE,SAAW;EAClB,UAAU,EAAE,MAAM;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECKU,SAAS;EDJ9B,eAAe,EAAE,IAAI;EACrB,WAAK;IAAE,QAAQ,EAAE,QAAQ;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,UAAa;EACnB,KAAK,ECFgB,SAAS;EDG9B,GAAG,EAAE,SAAU;EACf,UAAU,EAAE,MAAM;EAClB,YAAuB;IACrB,IAAI,EAAE,UAA0B;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;AAGrB,WAAY;EAAE,KAAK,EAAE,KAAK;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;AAGtB,aAAY;EAAE,YAAY,EAAE,IAAI;AAChC,cAAa;EAAE,WAAW,EAAE,IAAI;;ACXlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AC5BrC,aAA8B;ECY5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;ADdrC,cAA8B;ECW5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADbrC,cAA8B;ECU5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADXrC,mBAAmC;ECejC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADjBzC,iBAAmC;ECcjC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADZzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;AAC5C,WAA2B;EAAE,KAAK,ELVZ,IAAI;;;;AMN1B,gBAAgC;EAAE,OAAO,ENoQ1B,GAAO;;AMnQtB,gBAAgC;EAAE,OAAO,EN0W1B,GAAO;;AMzWtB,iBAAiC;EAAE,OAAO,ENmb1B,GAAO;;AMlbvB,qBAAqC;EAAE,OAAO,ENmL1B,GAAO;;AMlL3B,gBAAgC;EAAE,OAAO,ENkR1B,GAAO;;AMjRtB,eAA+B;EAAE,OAAO,ENke1B,GAAO;;AMjerB,iBAAiC;EAAE,OAAO,ENse1B,GAAO;;AMrevB,eAA+B;EAAE,OAAO,EN+iB1B,GAAO;;AM9iBrB,eAA+B;EAAE,OAAO,ENyN1B,GAAO;;AMxNrB,mBAAmC;EAAE,OAAO,ENggB1B,GAAO;;AM/fzB,aAA6B;EAAE,OAAO,EN8f1B,GAAO;;AM7fnB,kBAAkC;EAAE,OAAO,EN+f1B,GAAO;;AM9fxB,gBAAgC;EAAE,OAAO,ENoG1B,GAAO;;AMnGtB;;gBAEgC;EAAE,OAAO,ENkgB1B,GAAO;;AMjgBtB,sBAAsC;EAAE,OAAO,ENua1B,GAAO;;AMta5B,uBAAuC;EAAE,OAAO,ENqa1B,GAAO;;AMpa7B,oBAAoC;EAAE,OAAO,EN+X1B,GAAO;;AM9X1B,iBAAiC;EAAE,OAAO,ENsb1B,GAAO;;AMrbvB;cAC8B;EAAE,OAAO,ENwH1B,GAAO;;AMvHpB,kBAAkC;EAAE,OAAO,ENygB1B,GAAO;;AMxgBxB,eAA+B;EAAE,OAAO,ENmQ1B,GAAO;;AMlQrB,iBAAiC;EAAE,OAAO,EN6L1B,GAAO;;AM5LvB,kBAAkC;EAAE,OAAO,EN0G1B,GAAO;;AMzGxB,eAA+B;EAAE,OAAO,EN+Y1B,GAAO;;AM9YrB,mBAAmC;EAAE,OAAO,ENiJ1B,GAAO;;AMhJzB,8BAA8C;EAAE,OAAO,ENI1B,GAAO;;AMHpC,4BAA4C;EAAE,OAAO,ENM1B,GAAO;;AMLlC,gBAAgC;EAAE,OAAO,ENkQ1B,GAAO;;AMjQtB,wBAAwC;EAAE,OAAO,EN4W1B,GAAO;;AM3W9B;iBACiC;EAAE,OAAO,ENmY1B,GAAO;;AMlYvB,kBAAkC;EAAE,OAAO,EN8X1B,GAAO;;AM7XxB,mBAAmC;EAAE,OAAO,ENiS1B,GAAO;;AMhSzB,eAA+B;EAAE,OAAO,ENoS1B,GAAO;;AMnSrB,eAA+B;EAAE,OAAO,ENgM1B,GAAO;;AM/LrB,qBAAqC;EAAE,OAAO,EN+O1B,GAAO;;AM9O3B,qBAAqC;EAAE,OAAO,EN8hB1B,GAAO;;AM7hB3B,sBAAsC;EAAE,OAAO,EN4hB1B,GAAO;;AM3hB5B,oBAAoC;EAAE,OAAO,EN6hB1B,GAAO;;AM5hB1B,iBAAiC;EAAE,OAAO,EN2W1B,GAAO;;AM1WvB,kBAAkC;EAAE,OAAO,ENW1B,GAAO;;AMVxB,cAA8B;EAAE,OAAO,ENod1B,GAAO;;AMndpB,eAA+B;EAAE,OAAO,ENod1B,GAAO;;AMndrB,eAA+B;EAAE,OAAO,EN2B1B,GAAO;;AM1BrB,mBAAmC;EAAE,OAAO,EN2B1B,GAAO;;AM1BzB,gBAAgC;EAAE,OAAO,ENkW1B,GAAO;;AMjWtB,iBAAiC;EAAE,OAAO,ENwC1B,GAAO;;AMvCvB,eAA+B;EAAE,OAAO,EN8L1B,GAAO;;AM7LrB,eAA+B;EAAE,OAAO,ENmB1B,GAAO;;AMlBrB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB,sBAAsC;EAAE,OAAO,ENid1B,GAAO;;AMhd5B,qBAAqC;EAAE,OAAO,ENid1B,GAAO;;AMhd3B,qBAAqC;EAAE,OAAO,EN1C1B,GAAO;;AM2C3B,uBAAuC;EAAE,OAAO,EN7C1B,GAAO;;AM8C7B,sBAAsC;EAAE,OAAO,EN3C1B,GAAO;;AM4C5B,wBAAwC;EAAE,OAAO,EN9C1B,GAAO;;AM+C9B,eAA+B;EAAE,OAAO,ENwQ1B,GAAO;;AMvQrB;kBACkC;EAAE,OAAO,ENmT1B,GAAO;;AMlTxB,iBAAiC;EAAE,OAAO,ENmO1B,GAAO;;AMlOvB,uBAAuC;EAAE,OAAO,ENigB1B,GAAO;;AMhgB7B;;oBAEoC;EAAE,OAAO,EN+T1B,GAAO;;AM9T1B,iBAAiC;EAAE,OAAO,ENwT1B,GAAO;;AMvTvB,qBAAqC;EAAE,OAAO,EN+Q1B,GAAO;;AM9Q3B,iBAAiC;EAAE,OAAO,EN5D1B,GAAO;;AM6DvB,eAA+B;EAAE,OAAO,EN8c1B,GAAO;;AM7crB;0BAC0C;EAAE,OAAO,ENqT1B,GAAO;;AMpThC,yBAAyC;EAAE,OAAO,ENuX1B,GAAO;;AMtX/B,yBAAyC;EAAE,OAAO,EN0C1B,GAAO;;AMzC/B,iBAAiC;EAAE,OAAO,ENjC1B,GAAO;;AMkCvB,wBAAwC;EAAE,OAAO,ENma1B,GAAO;;AMla9B,wBAAwC;EAAE,OAAO,EN4H1B,GAAO;;AM3H9B,mBAAmC;EAAE,OAAO,EN7B1B,GAAO;;AM8BzB,eAA+B;EAAE,OAAO,EN0T1B,GAAO;;AMzTrB,gBAAgC;EAAE,OAAO,ENwS1B,GAAO;;AMvStB,eAA+B;EAAE,OAAO,ENia1B,GAAO;;AMharB,kBAAkC;EAAE,OAAO,ENgK1B,GAAO;;AM/JxB,uBAAuC;EAAE,OAAO,ENuH1B,GAAO;;AMtH7B,uBAAuC;EAAE,OAAO,EN4Z1B,GAAO;;AM3Z7B,gBAAgC;EAAE,OAAO,EN4F1B,GAAO;;AM3FtB,uBAAuC;EAAE,OAAO,ENoC1B,GAAO;;AMnC7B,wBAAwC;EAAE,OAAO,ENoC1B,GAAO;;AMnC9B,sBAAsC;EAAE,OAAO,ENsT1B,GAAO;;AMrT5B,uBAAuC;EAAE,OAAO,ENyQ1B,GAAO;;AMxQ7B,uBAAuC;EAAE,OAAO,ENwb1B,GAAO;;AMvb7B,uBAAuC;EAAE,OAAO,ENsB1B,GAAO;;AMrB7B,0BAA0C;EAAE,OAAO,EN2T1B,GAAO;;AM1ThC,sBAAsC;EAAE,OAAO,ENsM1B,GAAO;;AMrM5B,qBAAqC;EAAE,OAAO,EN6D1B,GAAO;;AM5D3B,yBAAyC;EAAE,OAAO,ENob1B,GAAO;;AMnb/B,yBAAyC;EAAE,OAAO,ENkB1B,GAAO;;AMjB/B,cAA8B;EAAE,OAAO,EN/C1B,GAAO;;AMgDpB,qBAAqC;EAAE,OAAO,EN3D1B,GAAO;;AM4D3B,sBAAsC;EAAE,OAAO,EN3D1B,GAAO;;AM4D5B,mBAAmC;EAAE,OAAO,EN3D1B,GAAO;;AM4DzB,qBAAqC;EAAE,OAAO,EN/D1B,GAAO;;AMgE3B;gBACgC;EAAE,OAAO,ENqV1B,GAAO;;AMpVtB,iBAAiC;EAAE,OAAO,ENuF1B,GAAO;;AMtFvB,mBAAmC;EAAE,OAAO,EN4C1B,GAAO;;AM3CzB,eAA+B;EAAE,OAAO,ENmS1B,GAAO;;AMlSrB,gBAAgC;EAAE,OAAO,ENsP1B,GAAO;;AMrPtB,mBAAmC;EAAE,OAAO,EN9D1B,GAAO;;AM+DzB,6BAA6C;EAAE,OAAO,ENgF1B,GAAO;;AM/EnC,eAA+B;EAAE,OAAO,EN+I1B,GAAO;;AM9IrB,eAA+B;EAAE,OAAO,ENoM1B,GAAO;;AMnMrB,eAA+B;EAAE,OAAO,ENmH1B,GAAO;;AMlHrB,cAA8B;EAAE,OAAO,ENiF1B,GAAO;;AMhFpB,oBAAoC;EAAE,OAAO,ENiF1B,GAAO;;AMhF1B;+BAC+C;EAAE,OAAO,EN0E1B,GAAO;;AMzErC,gBAAgC;EAAE,OAAO,ENmR1B,GAAO;;AMlRtB,mBAAmC;EAAE,OAAO,EN/B1B,GAAO;;AMgCzB,iBAAiC;EAAE,OAAO,ENoS1B,GAAO;;AMnSvB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,iBAAiC;EAAE,OAAO,ENqN1B,GAAO;;AMpNvB,qBAAqC;EAAE,OAAO,ENE1B,GAAO;;AMD3B,uBAAuC;EAAE,OAAO,ENF1B,GAAO;;AMG7B,kBAAkC;EAAE,OAAO,EN2S1B,GAAO;;AM1SxB,wBAAwC;EAAE,OAAO,ENyU1B,GAAO;;AMxU9B,iBAAiC;EAAE,OAAO,EN8G1B,GAAO;;AM7GvB,sBAAsC;EAAE,OAAO,EN+G1B,GAAO;;AM9G5B,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,mBAAmC;EAAE,OAAO,ENrF1B,GAAO;;AMsFzB;oBACoC;EAAE,OAAO,EN/E1B,GAAO;;AMgF1B,yBAAyC;EAAE,OAAO,ENua1B,GAAO;;AMta/B,0BAA0C;EAAE,OAAO,ENmE1B,GAAO;;AMlEhC,uBAAuC;EAAE,OAAO,EN5C1B,GAAO;;AM6C7B,cAA8B;EAAE,OAAO,ENqK1B,GAAO;;AMpKpB;eAC+B;EAAE,OAAO,ENK1B,GAAO;;AMJrB,mBAAmC;EAAE,OAAO,ENQ1B,GAAO;;AMPzB,sBAAsC;EAAE,OAAO,ENmY1B,GAAO;;AMlY5B,wBAAwC;EAAE,OAAO,ENiY1B,GAAO;;AMhY9B,oBAAoC;EAAE,OAAO,EN2V1B,GAAO;;AM1V1B,kBAAkC;EAAE,OAAO,ENyI1B,GAAO;;AMxIxB,mBAAmC;EAAE,OAAO,ENyT1B,GAAO;;AMxTzB,0BAA0C;EAAE,OAAO,ENiL1B,GAAO;;AMhLhC,qBAAqC;EAAE,OAAO,EN0X1B,GAAO;;AMzX3B,wBAAwC;EAAE,OAAO,EN8C1B,GAAO;;AM7C9B,kBAAkC;EAAE,OAAO,ENoT1B,GAAO;;AMnTxB,iBAAiC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YvB,wBAAwC;EAAE,OAAO,EN6G1B,GAAO;;AM5G9B,iBAAiC;EAAE,OAAO,EN8Z1B,GAAO;;AM7ZvB,kBAAkC;EAAE,OAAO,EN+J1B,GAAO;;AM9JxB,gBAAgC;EAAE,OAAO,ENsO1B,GAAO;;AMrOtB,mBAAmC;EAAE,OAAO,EN2U1B,GAAO;;AM1UzB,qBAAqC;EAAE,OAAO,EN/E1B,GAAO;;AMgF3B,uBAAuC;EAAE,OAAO,ENoO1B,GAAO;;AMnO7B,kBAAkC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YxB;mBACmC;EAAE,OAAO,ENuC1B,GAAO;;AMtCzB,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,iBAAiC;EAAE,OAAO,ENiZ1B,GAAO;;AMhZvB,sBAAsC;EAAE,OAAO,ENR1B,GAAO;;AMS5B,cAA8B;EAAE,OAAO,EN4Q1B,GAAO;;AM3QpB,gBAAgC;EAAE,OAAO,ENgH1B,GAAO;;AM/GtB,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,eAA+B;EAAE,OAAO,ENzG1B,GAAO;;AM0GrB,sBAAsC;EAAE,OAAO,ENzD1B,GAAO;;AM0D5B,uBAAuC;EAAE,OAAO,EN0G1B,GAAO;;AMzG7B,sBAAsC;EAAE,OAAO,ENwG1B,GAAO;;AMvG5B,oBAAoC;EAAE,OAAO,ENyG1B,GAAO;;AMxG1B,sBAAsC;EAAE,OAAO,ENqG1B,GAAO;;AMpG5B,4BAA4C;EAAE,OAAO,EN5I1B,GAAO;;AM6IlC,6BAA6C;EAAE,OAAO,ENxI1B,GAAO;;AMyInC,0BAA0C;EAAE,OAAO,ENxI1B,GAAO;;AMyIhC,4BAA4C;EAAE,OAAO,ENhJ1B,GAAO;;AMiJlC,gBAAgC;EAAE,OAAO,ENsF1B,GAAO;;AMrFtB,iBAAiC;EAAE,OAAO,ENia1B,GAAO;;AMhavB,gBAAgC;EAAE,OAAO,ENiV1B,GAAO;;AMhVtB,iBAAiC;EAAE,OAAO,ENgD1B,GAAO;;AM/CvB,oBAAoC;EAAE,OAAO,ENvG1B,GAAO;;AMwG1B,qBAAqC;EAAE,OAAO,ENzI1B,GAAO;;AM0I3B;gBACgC;EAAE,OAAO,ENqY1B,GAAO;;AMpYtB;eAC+B;EAAE,OAAO,ENuI1B,GAAO;;AMtIrB,gBAAgC;EAAE,OAAO,ENpD1B,GAAO;;AMqDtB,gBAAgC;EAAE,OAAO,EN+C1B,GAAO;;AM9CtB;mBACmC;EAAE,OAAO,ENwP1B,GAAO;;AMvPzB;kBACkC;EAAE,OAAO,ENkC1B,GAAO;;AMjCxB,oBAAoC;EAAE,OAAO,ENsL1B,GAAO;;AMrL1B;mBACmC;EAAE,OAAO,EN0C1B,GAAO;;AMzCzB,iBAAiC;EAAE,OAAO,ENiS1B,GAAO;;AMhSvB;;eAE+B;EAAE,OAAO,EN9I1B,GAAO;;AM+IrB,kBAAkC;EAAE,OAAO,ENgI1B,GAAO;;AM/HxB,kBAAkC;EAAE,OAAO,EN8H1B,GAAO;;AM7HxB,wBAAwC;EAAE,OAAO,EN4S1B,GAAO;;AM3S9B,oBAAoC;EAAE,OAAO,ENoW1B,GAAO;;AMnW1B,gBAAgC;EAAE,OAAO,ENmT1B,GAAO;;AMlTtB,gBAAgC;EAAE,OAAO,ENkI1B,GAAO;;AMjItB,gBAAgC;EAAE,OAAO,ENuV1B,GAAO;;AMtVtB,oBAAoC;EAAE,OAAO,ENwL1B,GAAO;;AMvL1B,2BAA2C;EAAE,OAAO,ENyL1B,GAAO;;AMxLjC,6BAA6C;EAAE,OAAO,ENyD1B,GAAO;;AMxDnC,sBAAsC;EAAE,OAAO,ENuD1B,GAAO;;AMtD5B,gBAAgC;EAAE,OAAO,ENsJ1B,GAAO;;AMrJtB,qBAAqC;EAAE,OAAO,ENtH1B,GAAO;;AMuH3B,mBAAmC;EAAE,OAAO,ENhH1B,GAAO;;AMiHzB,qBAAqC;EAAE,OAAO,ENvH1B,GAAO;;AMwH3B,sBAAsC;EAAE,OAAO,ENvH1B,GAAO;;AMwH5B,kBAAkC;EAAE,OAAO,ENvE1B,GAAO;;AMwExB;eAC+B;EAAE,OAAO,EN2P1B,GAAO;;AM1PrB;oBACoC;EAAE,OAAO,EN+P1B,GAAO;;AM9P1B;mBACmC;EAAE,OAAO,EN4P1B,GAAO;;AM3PzB,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,mBAAmC;EAAE,OAAO,ENkG1B,GAAO;;AMjGzB;eAC+B;EAAE,OAAO,EN8U1B,GAAO;;AM7UrB;gBACgC;EAAE,OAAO,ENqB1B,GAAO;;AMpBtB;qBACqC;EAAE,OAAO,EN2R1B,GAAO;;AM1R3B,oBAAoC;EAAE,OAAO,ENpF1B,GAAO;;AMqF1B,qBAAqC;EAAE,OAAO,ENnF1B,GAAO;;AMoF3B;eAC+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,kBAAkC;EAAE,OAAO,ENkO1B,GAAO;;AMjOxB,mBAAmC;EAAE,OAAO,ENkU1B,GAAO;;AMjUzB;oBACoC;EAAE,OAAO,EN1G1B,GAAO;;AM2G1B,sBAAsC;EAAE,OAAO,ENgF1B,GAAO;;AM/E5B,mBAAmC;EAAE,OAAO,ENnD1B,GAAO;;AMoDzB,yBAAyC;EAAE,OAAO,ENzG1B,GAAO;;AM0G/B,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,kBAAkC;EAAE,OAAO,ENsU1B,GAAO;;AMrUxB,sBAAsC;EAAE,OAAO,EN+P1B,GAAO;;AM9P5B,mBAAmC;EAAE,OAAO,ENsQ1B,GAAO;;AMrQzB,iBAAiC;EAAE,OAAO,ENvL1B,GAAO;;AMwLvB,iBAAiC;EAAE,OAAO,ENzG1B,GAAO;;AM0GvB,kBAAkC;EAAE,OAAO,ENtF1B,GAAO;;AMuFxB,sBAAsC;EAAE,OAAO,EN3B1B,GAAO;;AM4B5B,qBAAqC;EAAE,OAAO,ENxK1B,GAAO;;AMyK3B,qBAAqC;EAAE,OAAO,ENkC1B,GAAO;;AMjC3B,oBAAoC;EAAE,OAAO,EN3O1B,GAAO;;AM4O1B,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,sBAAsC;EAAE,OAAO,EN/C1B,GAAO;;AMgD5B,eAA+B;EAAE,OAAO,ENpM1B,GAAO;;AMqMrB,mBAAmC;EAAE,OAAO,ENe1B,GAAO;;AMdzB,sBAAsC;EAAE,OAAO,ENgJ1B,GAAO;;AM/I5B,4BAA4C;EAAE,OAAO,EN5O1B,GAAO;;AM6OlC,6BAA6C;EAAE,OAAO,EN5O1B,GAAO;;AM6OnC,0BAA0C;EAAE,OAAO,EN5O1B,GAAO;;AM6OhC,4BAA4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC,qBAAqC;EAAE,OAAO,EN5O1B,GAAO;;AM6O3B,sBAAsC;EAAE,OAAO,EN5O1B,GAAO;;AM6O5B,mBAAmC;EAAE,OAAO,EN5O1B,GAAO;;AM6OzB,qBAAqC;EAAE,OAAO,ENhP1B,GAAO;;AMiP3B,kBAAkC;EAAE,OAAO,ENlG1B,GAAO;;AMmGxB,iBAAiC;EAAE,OAAO,ENuC1B,GAAO;;AMtCvB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB;iBACiC;EAAE,OAAO,ENyF1B,GAAO;;AMxFvB,mBAAmC;EAAE,OAAO,EN9I1B,GAAO;;AM+IzB,qBAAqC;EAAE,OAAO,EN0I1B,GAAO;;AMzI3B,sBAAsC;EAAE,OAAO,EN0I1B,GAAO;;AMzI5B,kBAAkC;EAAE,OAAO,ENgN1B,GAAO;;AM/MxB,iBAAiC;EAAE,OAAO,ENnJ1B,GAAO;;AMoJvB;gBACgC;EAAE,OAAO,ENkJ1B,GAAO;;AMjJtB,qBAAqC;EAAE,OAAO,ENnB1B,GAAO;;AMoB3B,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,wBAAwC;EAAE,OAAO,ENvC1B,GAAO;;AMwC9B,kBAAkC;EAAE,OAAO,EN0L1B,GAAO;;AMzLxB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,gBAAgC;EAAE,OAAO,ENoE1B,GAAO;;AMnEtB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,iBAAiC;EAAE,OAAO,ENrD1B,GAAO;;AMsDvB,yBAAyC;EAAE,OAAO,ENvD1B,GAAO;;AMwD/B,mBAAmC;EAAE,OAAO,ENuO1B,GAAO;;AMtOzB,eAA+B;EAAE,OAAO,ENtJ1B,GAAO;;AMuJrB;oBACoC;EAAE,OAAO,ENqI1B,GAAO;;AMpI1B;;sBAEsC;EAAE,OAAO,ENuM1B,GAAO;;AMtM5B,yBAAyC;EAAE,OAAO,ENkC1B,GAAO;;AMjC/B,eAA+B;EAAE,OAAO,EN5I1B,GAAO;;AM6IrB,oBAAoC;EAAE,OAAO,EN7J1B,GAAO;;AM8J1B;uBACuC;EAAE,OAAO,EN1L1B,GAAO;;AM2L7B,mBAAmC;EAAE,OAAO,EN4G1B,GAAO;;AM3GzB,eAA+B;EAAE,OAAO,ENT1B,GAAO;;AMUrB,sBAAsC;EAAE,OAAO,ENhH1B,GAAO;;AMiH5B,sBAAsC;EAAE,OAAO,EN8M1B,GAAO;;AM7M5B,oBAAoC;EAAE,OAAO,ENyM1B,GAAO;;AMxM1B,iBAAiC;EAAE,OAAO,ENvH1B,GAAO;;AMwHvB,uBAAuC;EAAE,OAAO,ENmG1B,GAAO;;AMlG7B,qBAAqC;EAAE,OAAO,EN8C1B,GAAO;;AM7C3B,2BAA2C;EAAE,OAAO,EN8C1B,GAAO;;AM7CjC,iBAAiC;EAAE,OAAO,ENgJ1B,GAAO;;AM/IvB,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,4BAA4C;EAAE,OAAO,ENjF1B,GAAO;;AMkFlC,iBAAiC;EAAE,OAAO,ENoH1B,GAAO;;AMnHvB,iBAAiC;EAAE,OAAO,ENkC1B,GAAO;;AMjCvB,8BAA8C;EAAE,OAAO,ENlM1B,GAAO;;AMmMpC,+BAA+C;EAAE,OAAO,ENlM1B,GAAO;;AMmMrC,4BAA4C;EAAE,OAAO,ENlM1B,GAAO;;AMmMlC,8BAA8C;EAAE,OAAO,ENtM1B,GAAO;;AMuMpC,gBAAgC;EAAE,OAAO,EN/B1B,GAAO;;AMgCtB,eAA+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,iBAAiC;EAAE,OAAO,EN9S1B,GAAO;;AM+SvB,qBAAqC;EAAE,OAAO,ENmP1B,GAAO;;AMlP3B,mBAAmC;EAAE,OAAO,EN9O1B,GAAO;;AM+OzB,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN4G1B,GAAO;;AM3G3B,sBAAsC;EAAE,OAAO,ENsE1B,GAAO;;AMrE5B,iBAAiC;EAAE,OAAO,EN2M1B,GAAO;;AM1MvB,uBAAuC;EAAE,OAAO,EN6B1B,GAAO;;AM5B7B,yBAAyC;EAAE,OAAO,EN6B1B,GAAO;;AM5B/B,mBAAmC;EAAE,OAAO,ENhB1B,GAAO;;AMiBzB,qBAAqC;EAAE,OAAO,ENlB1B,GAAO;;AMmB3B,uBAAuC;EAAE,OAAO,ENvN1B,GAAO;;AMwN7B,wBAAwC;EAAE,OAAO,ENiD1B,GAAO;;AMhD9B,+BAA+C;EAAE,OAAO,EN3I1B,GAAO;;AM4IrC,uBAAuC;EAAE,OAAO,ENkH1B,GAAO;;AMjH7B,kBAAkC;EAAE,OAAO,EN1L1B,GAAO;;AM2LxB;8BAC8C;EAAE,OAAO,ENjP1B,GAAO;;AMkPpC;4BAC4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC;+BAC+C;EAAE,OAAO,ENnP1B,GAAO;;AMoPrC;cAC8B;EAAE,OAAO,EN7J1B,GAAO;;AM8JpB,cAA8B;EAAE,OAAO,EN/F1B,GAAO;;AMgGpB;cAC8B;EAAE,OAAO,EN4N1B,GAAO;;AM3NpB;cAC8B;EAAE,OAAO,ENvD1B,GAAO;;AMwDpB;;;cAG8B;EAAE,OAAO,ENrD1B,GAAO;;AMsDpB;;cAE8B;EAAE,OAAO,EN8E1B,GAAO;;AM7EpB;cAC8B;EAAE,OAAO,ENtD1B,GAAO;;AMuDpB;cAC8B;EAAE,OAAO,ENzR1B,GAAO;;AM0RpB,eAA+B;EAAE,OAAO,ENzJ1B,GAAO;;AM0JrB,oBAAoC;EAAE,OAAO,EN7I1B,GAAO;;AM8I1B,yBAAyC;EAAE,OAAO,EN2G1B,GAAO;;AM1G/B,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,2BAA2C;EAAE,OAAO,EN2G1B,GAAO;;AM1GjC,2BAA2C;EAAE,OAAO,EN8G1B,GAAO;;AM7GjC,4BAA4C;EAAE,OAAO,EN8G1B,GAAO;;AM7GlC,oBAAoC;EAAE,OAAO,ENgK1B,GAAO;;AM/J1B,sBAAsC;EAAE,OAAO,EN4J1B,GAAO;;AM3J5B,yBAAyC;EAAE,OAAO,ENwO1B,GAAO;;AMvO/B,kBAAkC;EAAE,OAAO,ENqO1B,GAAO;;AMpOxB,eAA+B;EAAE,OAAO,EN+N1B,GAAO;;AM9NrB,sBAAsC;EAAE,OAAO,EN+N1B,GAAO;;AM9N5B,uBAAuC;EAAE,OAAO,ENmO1B,GAAO;;AMlO7B,kBAAkC;EAAE,OAAO,ENxM1B,GAAO;;AMyMxB,yBAAyC;EAAE,OAAO,EN+G1B,GAAO;;AM9G/B,oBAAoC;EAAE,OAAO,ENnF1B,GAAO;;AMoF1B,iBAAiC;EAAE,OAAO,EN/I1B,GAAO;;AMgJvB,cAA8B;EAAE,OAAO,ENhX1B,GAAO;;AMiXpB,oBAAoC;EAAE,OAAO,ENxT1B,GAAO;;AMyT1B,2BAA2C;EAAE,OAAO,ENxT1B,GAAO;;AMyTjC,iBAAiC;EAAE,OAAO,ENyK1B,GAAO;;AMxKvB,wBAAwC;EAAE,OAAO,ENyK1B,GAAO;;AMxK9B,0BAA0C;EAAE,OAAO,ENtD1B,GAAO;;AMuDhC,wBAAwC;EAAE,OAAO,ENpD1B,GAAO;;AMqD9B,0BAA0C;EAAE,OAAO,ENvD1B,GAAO;;AMwDhC,2BAA2C;EAAE,OAAO,ENvD1B,GAAO;;AMwDjC,gBAAgC;EAAE,OAAO,ENxW1B,GAAO;;AMyWtB,kBAAkC;EAAE,OAAO,EN0M1B,GAAO;;AMzMxB,kBAAkC;EAAE,OAAO,ENpX1B,GAAO;;AMqXxB,gBAAgC;EAAE,OAAO,ENpE1B,GAAO;;AMqEtB,mBAAmC;EAAE,OAAO,EN1N1B,GAAO;;AM2NzB,gBAAgC;EAAE,OAAO,ENqE1B,GAAO;;AMpEtB,qBAAqC;EAAE,OAAO,ENtJ1B,GAAO;;AMuJ3B,iBAAiC;EAAE,OAAO,ENuJ1B,GAAO;;AMtJvB,iBAAiC;EAAE,OAAO,EN/L1B,GAAO;;AMgMvB,eAA+B;EAAE,OAAO,EN1D1B,GAAO;;AM2DrB;mBACmC;EAAE,OAAO,ENnI1B,GAAO;;AMoIzB,gBAAgC;EAAE,OAAO,EN2G1B,GAAO;;AM1GtB,iBAAiC;EAAE,OAAO,ENxC1B,GAAO;;AMyCvB,kBAAkC;EAAE,OAAO,ENrX1B,GAAO;;AMsXxB,cAA8B;EAAE,OAAO,ENpU1B,GAAO;;AMqUpB,aAA6B;EAAE,OAAO,ENgL1B,GAAO;;AM/KnB,gBAAgC;EAAE,OAAO,ENqL1B,GAAO;;AMpLtB,iBAAiC;EAAE,OAAO,ENa1B,GAAO;;AMZvB,oBAAoC;EAAE,OAAO,ENrC1B,GAAO;;AMsC1B,yBAAyC;EAAE,OAAO,EN8E1B,GAAO;;AM7E/B,+BAA+C;EAAE,OAAO,ENtX1B,GAAO;;AMuXrC,8BAA8C;EAAE,OAAO,ENxX1B,GAAO;;AMyXpC;8BAC8C;EAAE,OAAO,EN3T1B,GAAO;;AM4TpC,uBAAuC;EAAE,OAAO,ENjP1B,GAAO;;AMkP7B,qBAAqC;EAAE,OAAO,EN+K1B,GAAO;;AM9K3B,uBAAuC;EAAE,OAAO,ENmK1B,GAAO;;AMlK7B;cAC8B;EAAE,OAAO,ENoI1B,GAAO;;AMnIpB,wBAAwC;EAAE,OAAO,ENjB1B,GAAO;;AMkB9B,wBAAwC;EAAE,OAAO,EN6D1B,GAAO;;AM5D9B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,0BAA0C;EAAE,OAAO,EN7O1B,GAAO;;AM8OhC,oBAAoC;EAAE,OAAO,EN2K1B,GAAO;;AM1K1B,iBAAiC;EAAE,OAAO,ENvD1B,GAAO;;AMwDvB;;qBAEqC;EAAE,OAAO,ENsI1B,GAAO;;AMrI3B;yBACyC;EAAE,OAAO,ENjK1B,GAAO;;AMkK/B,gBAAgC;EAAE,OAAO,ENwK1B,GAAO;;AMvKtB,iBAAiC;EAAE,OAAO,ENvK1B,GAAO;;AMwKvB,iBAAiC;EAAE,OAAO,ENhB1B,GAAO;;AMiBvB,wBAAwC;EAAE,OAAO,ENhB1B,GAAO;;AMiB9B,6BAA6C;EAAE,OAAO,ENsE1B,GAAO;;AMrEnC,sBAAsC;EAAE,OAAO,ENoE1B,GAAO;;AMnE5B,oBAAoC;EAAE,OAAO,EN7Q1B,GAAO;;AM8Q1B,eAA+B;EAAE,OAAO,EN1Q1B,GAAO;;AM2QrB,qBAAqC;EAAE,OAAO,ENjD1B,GAAO;;AMkD3B,yBAAyC;EAAE,OAAO,ENjD1B,GAAO;;AMkD/B,iBAAiC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQvB,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,mBAAmC;EAAE,OAAO,ENzI1B,GAAO;;AM0IzB,cAA8B;EAAE,OAAO,EN9O1B,GAAO;;AM+OpB,mBAAmC;EAAE,OAAO,EN3W1B,GAAO;;AM4WzB,gBAAgC;EAAE,OAAO,EN9T1B,GAAO;;AM+TtB,cAA8B;EAAE,OAAO,ENnE1B,GAAO;;AMoEpB,gBAAgC;EAAE,OAAO,ENoC1B,GAAO;;AMnCtB,eAA+B;EAAE,OAAO,ENjS1B,GAAO;;AMkSrB,gBAAgC;EAAE,OAAO,ENjS1B,GAAO;;AMkStB,kBAAkC;EAAE,OAAO,ENtY1B,GAAO;;AMuYxB,yBAAyC;EAAE,OAAO,ENtY1B,GAAO;;AMuY/B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,uBAAuC;EAAE,OAAO,EN2C1B,GAAO;;AM1C7B,kBAAkC;EAAE,OAAO,ENvC1B,GAAO;;AMwCxB;cAC8B;EAAE,OAAO,EN3W1B,GAAO;;AM4WpB;eAC+B;EAAE,OAAO,EN2D1B,GAAO;;AM1DrB,eAA+B;EAAE,OAAO,ENuF1B,GAAO;;AMtFrB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,qBAAqC;EAAE,OAAO,ENpS1B,GAAO;;AMqS3B,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,mBAAmC;EAAE,OAAO,EN1S1B,GAAO;;AM2SzB,qBAAqC;EAAE,OAAO,ENxP1B,GAAO;;AMyP3B,sBAAsC;EAAE,OAAO,ENjP1B,GAAO;;AMkP5B,uBAAuC;EAAE,OAAO,EN9P1B,GAAO;;AM+P7B,4BAA4C;EAAE,OAAO,ENxP1B,GAAO;;AMyPlC;;uBAEuC;EAAE,OAAO,ENjQ1B,GAAO;;AMkQ7B;yBACyC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQ/B;uBACuC;EAAE,OAAO,ENxQ1B,GAAO;;AMyQ7B;uBACuC;EAAE,OAAO,EN7P1B,GAAO;;AM8P7B,sBAAsC;EAAE,OAAO,EN1Q1B,GAAO;;AM2Q5B,eAA+B;EAAE,OAAO,ENsG1B,GAAO;;AMrGrB,kBAAkC;EAAE,OAAO,ENlV1B,GAAO;;AMmVxB,mBAAmC;EAAE,OAAO,ENnL1B,GAAO;;AMoLzB;;;;oBAIoC;EAAE,OAAO,ENxK1B,GAAO;;AMyK1B,yBAAyC;EAAE,OAAO,ENpW1B,GAAO;;AMqW/B;gBACgC;EAAE,OAAO,EN1E1B,GAAO;;AM2EtB;iBACiC;EAAE,OAAO,ENpT1B,GAAO;;AMqTvB,qBAAqC;EAAE,OAAO,EN1O1B,GAAO;;AM2O3B,cAA8B;EAAE,OAAO,EN5O1B,GAAO;;AM6OpB,sBAAsC;EAAE,OAAO,EN7N1B,GAAO;;AM8N5B,wBAAwC;EAAE,OAAO,ENwB1B,GAAO;;AMvB9B,aAA6B;EAAE,OAAO,ENzF1B,GAAO;;AM0FnB;iBACiC;EAAE,OAAO,EN2F1B,GAAO;;AM1FvB;sBACsC;EAAE,OAAO,EN9H1B,GAAO;;AM+H5B;wBACwC;EAAE,OAAO,EN/H1B,GAAO;;AMgI9B,kBAAkC;EAAE,OAAO,EN3N1B,GAAO;;AM4NxB;sBACsC;EAAE,OAAO,ENrX1B,GAAO;;AMsX5B,iBAAiC;EAAE,OAAO,ENnO1B,GAAO;;AMoOvB,oBAAoC;EAAE,OAAO,ENlI1B,GAAO;;AMmI1B,kBAAkC;EAAE,OAAO,EN1C1B,GAAO;;AM2CxB,oBAAoC;EAAE,OAAO,EN7D1B,GAAO;;AM8D1B,2BAA2C;EAAE,OAAO,EN7D1B,GAAO;;AM8DjC,eAA+B;EAAE,OAAO,ENpb1B,GAAO;;AMqbrB;mBACmC;EAAE,OAAO,ENzQ1B,GAAO;;AM0QzB,cAA8B;EAAE,OAAO,ENsC1B,GAAO;;AMrCpB,qBAAqC;EAAE,OAAO,EN/b1B,GAAO;;AMgc3B,eAA+B;EAAE,OAAO,ENrH1B,GAAO;;AMsHrB,qBAAqC;EAAE,OAAO,ENlD1B,GAAO;;AMmD3B,iBAAiC;EAAE,OAAO,ENsC1B,GAAO;;AMrCvB,eAA+B;EAAE,OAAO,ENiF1B,GAAO;;AMhFrB,sBAAsC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ5B,eAA+B;EAAE,OAAO,ENuE1B,GAAO;;AMtErB,qBAAqC;EAAE,OAAO,ENjb1B,GAAO;;AMkb3B,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,wBAAwC;EAAE,OAAO,ENhQ1B,GAAO;;AMiQ9B,kBAAkC;EAAE,OAAO,EN9Z1B,GAAO;;AM+ZxB,wBAAwC;EAAE,OAAO,ENla1B,GAAO;;AMma9B,sBAAsC;EAAE,OAAO,ENpa1B,GAAO;;AMqa5B,kBAAkC;EAAE,OAAO,ENta1B,GAAO;;AMuaxB,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,qBAAqC;EAAE,OAAO,ENld1B,GAAO;;AMmd3B,uBAAuC;EAAE,OAAO,ENld1B,GAAO;;AMmd7B,gBAAgC;EAAE,OAAO,ENY1B,GAAO;;AMXtB,oBAAoC;EAAE,OAAO,EN3X1B,GAAO;;AM4X1B,aAA6B;EAAE,OAAO,ENre1B,GAAO;;AMsenB,qBAAqC;EAAE,OAAO,ENjV1B,GAAO;;AMkV3B,sBAAsC;EAAE,OAAO,ENpK1B,GAAO;;AMqK5B,wBAAwC;EAAE,OAAO,ENrd1B,GAAO;;AMsd9B,qBAAqC;EAAE,OAAO,EN3f1B,GAAO;;AM4f3B,oBAAoC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ1B,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,iBAAiC;EAAE,OAAO,EN1O1B,GAAO;;AM2OvB,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,qBAAqC;EAAE,OAAO,ENN1B,GAAO;;AMO3B,oBAAoC;EAAE,OAAO,ENN1B,GAAO;;AMO1B,kBAAkC;EAAE,OAAO,EN/d1B,GAAO;;AMgexB,cAA8B;EAAE,OAAO,EN7c1B,GAAO;;AM8cpB,kBAAkC;EAAE,OAAO,EN1P1B,GAAO;;AM2PxB,oBAAoC;EAAE,OAAO,ENhhB1B,GAAO;;AMihB1B,aAA6B;EAAE,OAAO,EN7b1B,GAAO;;AM8bnB;;cAE8B;EAAE,OAAO,ENxQ1B,GAAO;;AMyQpB,mBAAmC;EAAE,OAAO,EN7M1B,GAAO;;AM8MzB,qBAAqC;EAAE,OAAO,ENpd1B,GAAO;;AMqd3B,yBAAyC;EAAE,OAAO,ENnZ1B,GAAO;;AMoZ/B,mBAAmC;EAAE,OAAO,ENxY1B,GAAO;;AMyYzB,mBAAmC;EAAE,OAAO,EN1T1B,GAAO;;AM2TzB,kBAAkC;EAAE,OAAO,ENxP1B,GAAO;;AMyPxB,iBAAiC;EAAE,OAAO,ENrH1B,GAAO;;AMsHvB,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,sBAAsC;EAAE,OAAO,ENrG1B,GAAO;;AMsG5B,mBAAmC;EAAE,OAAO,ENpG1B,GAAO;;AMqGzB,oBAAoC;EAAE,OAAO,EN5c1B,GAAO;;AM6c1B,0BAA0C;EAAE,OAAO,EN9c1B,GAAO;;AM+chC,kBAAkC;EAAE,OAAO,EN3Y1B,GAAO;;AM4YxB,eAA+B;EAAE,OAAO,ENhH1B,GAAO;;AMiHrB,sBAAsC;EAAE,OAAO,ENI1B,GAAO;;AMH5B,qBAAqC;EAAE,OAAO,EN5M1B,GAAO;;AM6M3B,sBAAsC;EAAE,OAAO,ENpE1B,GAAO;;AMqE5B,oBAAoC;EAAE,OAAO,ENhS1B,GAAO;;AMiS1B,gBAAgC;EAAE,OAAO,ENG1B,GAAO;;AMFtB,eAA+B;EAAE,OAAO,ENtO1B,GAAO;;AMuOrB,kBAAkC;EAAE,OAAO,EN7N1B,GAAO;;AM8NxB,sBAAsC;EAAE,OAAO,ENhC1B,GAAO;;AMiC5B,0BAA0C;EAAE,OAAO,ENhC1B,GAAO;;AMiChC,uBAAuC;EAAE,OAAO,END1B,GAAO;;AME7B,sBAAsC;EAAE,OAAO,EN1O1B,GAAO;;AM2O5B,qBAAqC;EAAE,OAAO,ENF1B,GAAO;;AMG3B,sBAAsC;EAAE,OAAO,EN3O1B,GAAO;;AM4O5B,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,wBAAwC;EAAE,OAAO,EN5O1B,GAAO;;AM6O9B,iBAAiC;EAAE,OAAO,ENvN1B,GAAO;;AMwNvB,4BAA4C;EAAE,OAAO,EN9X1B,GAAO;;AM+XlC,sBAAsC;EAAE,OAAO,ENhM1B,GAAO;;AMiM5B,mBAAmC;EAAE,OAAO,ENI1B,GAAO;;AMHzB,iBAAiC;EAAE,OAAO,EN7I1B,GAAO;;AM8IvB,oBAAoC;EAAE,OAAO,ENjB1B,GAAO;;AMkB1B,qBAAqC;EAAE,OAAO,ENhB1B,GAAO;;AMiB3B;cAC8B;EAAE,OAAO,ENphB1B,GAAO;;AMqhBpB,kBAAkC;EAAE,OAAO,ENd1B,GAAO;;AMexB,gBAAgC;EAAE,OAAO,ENnD1B,GAAO;;AMoDtB,iBAAiC;EAAE,OAAO,ENvF1B,GAAO;;AMwFvB,iBAAiC;EAAE,OAAO,ENrP1B,GAAO", +"sources": ["../scss/_path.scss","../scss/_core.scss","../scss/_larger.scss","../scss/_fixed-width.scss","../scss/_list.scss","../scss/_variables.scss","../scss/_bordered-pulled.scss","../scss/_animated.scss","../scss/_rotated-flipped.scss","../scss/_mixins.scss","../scss/_stacked.scss","../scss/_icons.scss"], +"names": [], +"file": "font-awesome.css" +} diff --git a/bower_components/font-awesome/css/font-awesome.min.css b/bower_components/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000000..540440ce89 --- /dev/null +++ b/bower_components/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.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.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.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:#fff}.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-remove:before,.fa-close:before,.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-photo:before,.fa-image:before,.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,.fa-bar-chart: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-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.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-navicon:before,.fa-reorder:before,.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-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc: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-mail-reply-all:before,.fa-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,.fa-gratipay: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"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/bower_components/font-awesome/fonts/FontAwesome.otf b/bower_components/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000000..401ec0f36e Binary files /dev/null and b/bower_components/font-awesome/fonts/FontAwesome.otf differ diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.eot b/bower_components/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/bower_components/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.svg b/bower_components/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/bower_components/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.ttf b/bower_components/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/bower_components/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.woff b/bower_components/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/bower_components/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.woff2 b/bower_components/font-awesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/bower_components/font-awesome/fonts/fontawesome-webfont.woff2 differ diff --git a/bower_components/font-awesome/less/animated.less b/bower_components/font-awesome/less/animated.less new file mode 100644 index 0000000000..66ad52a5ba --- /dev/null +++ b/bower_components/font-awesome/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/bower_components/font-awesome/less/bordered-pulled.less b/bower_components/font-awesome/less/bordered-pulled.less new file mode 100644 index 0000000000..f1c8ad75f5 --- /dev/null +++ b/bower_components/font-awesome/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/bower_components/font-awesome/less/core.less b/bower_components/font-awesome/less/core.less new file mode 100644 index 0000000000..c577ac84a6 --- /dev/null +++ b/bower_components/font-awesome/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/bower_components/font-awesome/less/fixed-width.less b/bower_components/font-awesome/less/fixed-width.less new file mode 100644 index 0000000000..110289f2f4 --- /dev/null +++ b/bower_components/font-awesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/bower_components/font-awesome/less/font-awesome.less b/bower_components/font-awesome/less/font-awesome.less new file mode 100644 index 0000000000..c3677def31 --- /dev/null +++ b/bower_components/font-awesome/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/bower_components/font-awesome/less/icons.less b/bower_components/font-awesome/less/icons.less new file mode 100644 index 0000000000..159d600425 --- /dev/null +++ b/bower_components/font-awesome/less/icons.less @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } +.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } +.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } +.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } +.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } +.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } +.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } +.@{fa-css-prefix}-vcard:before, +.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } +.@{fa-css-prefix}-vcard-o:before, +.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } +.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } +.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } +.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } +.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } +.@{fa-css-prefix}-drivers-license:before, +.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } +.@{fa-css-prefix}-drivers-license-o:before, +.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } +.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } +.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } +.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } +.@{fa-css-prefix}-thermometer-4:before, +.@{fa-css-prefix}-thermometer:before, +.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } +.@{fa-css-prefix}-thermometer-3:before, +.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } +.@{fa-css-prefix}-thermometer-2:before, +.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } +.@{fa-css-prefix}-thermometer-1:before, +.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } +.@{fa-css-prefix}-thermometer-0:before, +.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } +.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } +.@{fa-css-prefix}-bathtub:before, +.@{fa-css-prefix}-s15:before, +.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } +.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } +.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } +.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } +.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } +.@{fa-css-prefix}-times-rectangle:before, +.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } +.@{fa-css-prefix}-times-rectangle-o:before, +.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } +.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } +.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } +.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } +.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } +.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } +.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } +.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } +.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } +.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } +.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } +.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/bower_components/font-awesome/less/larger.less b/bower_components/font-awesome/less/larger.less new file mode 100644 index 0000000000..c9d646770e --- /dev/null +++ b/bower_components/font-awesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/bower_components/font-awesome/less/list.less b/bower_components/font-awesome/less/list.less new file mode 100644 index 0000000000..0b440382f6 --- /dev/null +++ b/bower_components/font-awesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/bower_components/font-awesome/less/mixins.less b/bower_components/font-awesome/less/mixins.less new file mode 100644 index 0000000000..beef231d0e --- /dev/null +++ b/bower_components/font-awesome/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/bower_components/font-awesome/less/path.less b/bower_components/font-awesome/less/path.less new file mode 100644 index 0000000000..835be41f81 --- /dev/null +++ b/bower_components/font-awesome/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/bower_components/font-awesome/less/rotated-flipped.less b/bower_components/font-awesome/less/rotated-flipped.less new file mode 100644 index 0000000000..f6ba81475b --- /dev/null +++ b/bower_components/font-awesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/bower_components/font-awesome/less/screen-reader.less b/bower_components/font-awesome/less/screen-reader.less new file mode 100644 index 0000000000..11c188196d --- /dev/null +++ b/bower_components/font-awesome/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/bower_components/font-awesome/less/stacked.less b/bower_components/font-awesome/less/stacked.less new file mode 100644 index 0000000000..fc53fb0e7a --- /dev/null +++ b/bower_components/font-awesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/bower_components/font-awesome/less/variables.less b/bower_components/font-awesome/less/variables.less new file mode 100644 index 0000000000..7ddbbc0115 --- /dev/null +++ b/bower_components/font-awesome/less/variables.less @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.7.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-address-book: "\f2b9"; +@fa-var-address-book-o: "\f2ba"; +@fa-var-address-card: "\f2bb"; +@fa-var-address-card-o: "\f2bc"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bandcamp: "\f2d5"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-bath: "\f2cd"; +@fa-var-bathtub: "\f2cd"; +@fa-var-battery: "\f240"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-drivers-license: "\f2c2"; +@fa-var-drivers-license-o: "\f2c3"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eercast: "\f2da"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-open: "\f2b6"; +@fa-var-envelope-open-o: "\f2b7"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-etsy: "\f2d7"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-free-code-camp: "\f2c5"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-grav: "\f2d6"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-handshake-o: "\f2b5"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-id-badge: "\f2c1"; +@fa-var-id-card: "\f2c2"; +@fa-var-id-card-o: "\f2c3"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-imdb: "\f2d8"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linode: "\f2b8"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meetup: "\f2e0"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microchip: "\f2db"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-podcast: "\f2ce"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quora: "\f2c4"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-ravelry: "\f2d9"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-s15: "\f2cd"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-shower: "\f2cc"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-snowflake-o: "\f2dc"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superpowers: "\f2dd"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-telegram: "\f2c6"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thermometer: "\f2c7"; +@fa-var-thermometer-0: "\f2cb"; +@fa-var-thermometer-1: "\f2ca"; +@fa-var-thermometer-2: "\f2c9"; +@fa-var-thermometer-3: "\f2c8"; +@fa-var-thermometer-4: "\f2c7"; +@fa-var-thermometer-empty: "\f2cb"; +@fa-var-thermometer-full: "\f2c7"; +@fa-var-thermometer-half: "\f2c9"; +@fa-var-thermometer-quarter: "\f2ca"; +@fa-var-thermometer-three-quarters: "\f2c8"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-times-rectangle: "\f2d3"; +@fa-var-times-rectangle-o: "\f2d4"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-circle: "\f2bd"; +@fa-var-user-circle-o: "\f2be"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-o: "\f2c0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-vcard: "\f2bb"; +@fa-var-vcard-o: "\f2bc"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-window-close: "\f2d3"; +@fa-var-window-close-o: "\f2d4"; +@fa-var-window-maximize: "\f2d0"; +@fa-var-window-minimize: "\f2d1"; +@fa-var-window-restore: "\f2d2"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpexplorer: "\f2de"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/bower_components/font-awesome/scss/_animated.scss b/bower_components/font-awesome/scss/_animated.scss new file mode 100644 index 0000000000..8a020dbfff --- /dev/null +++ b/bower_components/font-awesome/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/bower_components/font-awesome/scss/_bordered-pulled.scss b/bower_components/font-awesome/scss/_bordered-pulled.scss new file mode 100644 index 0000000000..d4b85a02f2 --- /dev/null +++ b/bower_components/font-awesome/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/bower_components/font-awesome/scss/_core.scss b/bower_components/font-awesome/scss/_core.scss new file mode 100644 index 0000000000..7425ef85fc --- /dev/null +++ b/bower_components/font-awesome/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/bower_components/font-awesome/scss/_fixed-width.scss b/bower_components/font-awesome/scss/_fixed-width.scss new file mode 100644 index 0000000000..b221c98133 --- /dev/null +++ b/bower_components/font-awesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/bower_components/font-awesome/scss/_icons.scss b/bower_components/font-awesome/scss/_icons.scss new file mode 100644 index 0000000000..e63e702c4d --- /dev/null +++ b/bower_components/font-awesome/scss/_icons.scss @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } +.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } +.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } +.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } +.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } +.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } +.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } +.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } +.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } +.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } +.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } +.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } +.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } +.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } +.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } +.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } +.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } +.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } +.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } +.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } +.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } +.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } +.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } +.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } +.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } +.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } +.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } +.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } +.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } +.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/bower_components/font-awesome/scss/_larger.scss b/bower_components/font-awesome/scss/_larger.scss new file mode 100644 index 0000000000..41e9a8184a --- /dev/null +++ b/bower_components/font-awesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/bower_components/font-awesome/scss/_list.scss b/bower_components/font-awesome/scss/_list.scss new file mode 100644 index 0000000000..7d1e4d54d6 --- /dev/null +++ b/bower_components/font-awesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/bower_components/font-awesome/scss/_mixins.scss b/bower_components/font-awesome/scss/_mixins.scss new file mode 100644 index 0000000000..c3bbd5745d --- /dev/null +++ b/bower_components/font-awesome/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/bower_components/font-awesome/scss/_path.scss b/bower_components/font-awesome/scss/_path.scss new file mode 100644 index 0000000000..bb457c23a8 --- /dev/null +++ b/bower_components/font-awesome/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/bower_components/font-awesome/scss/_rotated-flipped.scss b/bower_components/font-awesome/scss/_rotated-flipped.scss new file mode 100644 index 0000000000..a3558fd09c --- /dev/null +++ b/bower_components/font-awesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/bower_components/font-awesome/scss/_screen-reader.scss b/bower_components/font-awesome/scss/_screen-reader.scss new file mode 100644 index 0000000000..637426f0da --- /dev/null +++ b/bower_components/font-awesome/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/bower_components/font-awesome/scss/_stacked.scss b/bower_components/font-awesome/scss/_stacked.scss new file mode 100644 index 0000000000..aef7403660 --- /dev/null +++ b/bower_components/font-awesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/bower_components/font-awesome/scss/_variables.scss b/bower_components/font-awesome/scss/_variables.scss new file mode 100644 index 0000000000..498fc4a087 --- /dev/null +++ b/bower_components/font-awesome/scss/_variables.scss @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.7.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-address-book: "\f2b9"; +$fa-var-address-book-o: "\f2ba"; +$fa-var-address-card: "\f2bb"; +$fa-var-address-card-o: "\f2bc"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bandcamp: "\f2d5"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-bath: "\f2cd"; +$fa-var-bathtub: "\f2cd"; +$fa-var-battery: "\f240"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-drivers-license: "\f2c2"; +$fa-var-drivers-license-o: "\f2c3"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eercast: "\f2da"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-open: "\f2b6"; +$fa-var-envelope-open-o: "\f2b7"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-etsy: "\f2d7"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-free-code-camp: "\f2c5"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-grav: "\f2d6"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-handshake-o: "\f2b5"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-id-badge: "\f2c1"; +$fa-var-id-card: "\f2c2"; +$fa-var-id-card-o: "\f2c3"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-imdb: "\f2d8"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linode: "\f2b8"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meetup: "\f2e0"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microchip: "\f2db"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-podcast: "\f2ce"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quora: "\f2c4"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-ravelry: "\f2d9"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-s15: "\f2cd"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-shower: "\f2cc"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-snowflake-o: "\f2dc"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superpowers: "\f2dd"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-telegram: "\f2c6"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thermometer: "\f2c7"; +$fa-var-thermometer-0: "\f2cb"; +$fa-var-thermometer-1: "\f2ca"; +$fa-var-thermometer-2: "\f2c9"; +$fa-var-thermometer-3: "\f2c8"; +$fa-var-thermometer-4: "\f2c7"; +$fa-var-thermometer-empty: "\f2cb"; +$fa-var-thermometer-full: "\f2c7"; +$fa-var-thermometer-half: "\f2c9"; +$fa-var-thermometer-quarter: "\f2ca"; +$fa-var-thermometer-three-quarters: "\f2c8"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-times-rectangle: "\f2d3"; +$fa-var-times-rectangle-o: "\f2d4"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-circle: "\f2bd"; +$fa-var-user-circle-o: "\f2be"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-o: "\f2c0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-vcard: "\f2bb"; +$fa-var-vcard-o: "\f2bc"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-window-close: "\f2d3"; +$fa-var-window-close-o: "\f2d4"; +$fa-var-window-maximize: "\f2d0"; +$fa-var-window-minimize: "\f2d1"; +$fa-var-window-restore: "\f2d2"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpexplorer: "\f2de"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/bower_components/font-awesome/scss/font-awesome.scss b/bower_components/font-awesome/scss/font-awesome.scss new file mode 100644 index 0000000000..f1c83aaa5d --- /dev/null +++ b/bower_components/font-awesome/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/bower_components/iCheck/.bower.json b/bower_components/iCheck/.bower.json new file mode 100644 index 0000000000..b24bd226d1 --- /dev/null +++ b/bower_components/iCheck/.bower.json @@ -0,0 +1,52 @@ +{ + "name": "iCheck", + "version": "1.0.2", + "description": "Highly customizable checkboxes and radio buttons (jQuery & Zepto)", + "keywords": [ + "icheck", + "checkbox", + "radio", + "input", + "field", + "form", + "custom", + "replacement", + "accessibility", + "skins", + "ui", + "checked", + "disabled", + "indeterminate" + ], + "main": [ + "./icheck.min.js" + ], + "dependencies": { + "jquery": ">=1.7" + }, + "ignore": [ + ".gitignore", + "CHANGELOG.md", + "README.md", + "demo/" + ], + "license": "MIT", + "authors": [ + { + "name": "Damir Sultanov", + "email": "info@fronteed.com", + "homepage": "http://fronteed.com/" + } + ], + "homepage": "http://fronteed.com/iCheck/", + "_release": "1.0.2", + "_resolution": { + "type": "version", + "tag": "1.0.2", + "commit": "8a6eb37bd7dab1e843c1b630c91c6398ff409d05" + }, + "_source": "https://github.com/fronteed/iCheck.git", + "_target": "^1.0.2", + "_originalSource": "jquery-icheck", + "_direct": true +} \ No newline at end of file diff --git a/bower_components/iCheck/bower.json b/bower_components/iCheck/bower.json new file mode 100644 index 0000000000..a2b8288c9c --- /dev/null +++ b/bower_components/iCheck/bower.json @@ -0,0 +1,42 @@ +{ + "name": "iCheck", + "version": "1.0.2", + "description": "Highly customizable checkboxes and radio buttons (jQuery & Zepto)", + "keywords": [ + "icheck", + "checkbox", + "radio", + "input", + "field", + "form", + "custom", + "replacement", + "accessibility", + "skins", + "ui", + "checked", + "disabled", + "indeterminate" + ], + "main": [ + "./icheck.min.js" + ], + "dependencies": { + "jquery": ">=1.7" + }, + "ignore": [ + ".gitignore", + "CHANGELOG.md", + "README.md", + "demo/" + ], + "license": "MIT", + "authors": [ + { + "name": "Damir Sultanov", + "email": "info@fronteed.com", + "homepage": "http://fronteed.com/" + } + ], + "homepage": "http://fronteed.com/iCheck/" +} diff --git a/bower_components/iCheck/icheck.jquery.json b/bower_components/iCheck/icheck.jquery.json new file mode 100644 index 0000000000..e7018a6453 --- /dev/null +++ b/bower_components/iCheck/icheck.jquery.json @@ -0,0 +1,48 @@ +{ + "name": "icheck", + "version": "1.0.2", + "title": "iCheck", + "author": { + "name": "Damir Sultanov", + "email": "info@fronteed.com", + "homepage": "http://fronteed.com/" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://en.wikipedia.org/wiki/MIT_License" + } + ], + "dependencies": { + "jquery": ">=1.7" + }, + "description": "Highly customizable checkboxes and radio buttons (jQuery and Zepto). Features: identical inputs across different browsers and devices (both desktop and mobile), touch devices support (iOS, Android, BlackBerry, Windows Phone, Amazon Kindle), keyboard accessible inputs (Tab, Spacebar, Arrow up/down and other shortcuts), screenreader accessible inputs — (ARIA attributes for VoiceOver and others), customization freedom (use any HTML and CSS to style inputs or try 6 Retina-ready skins), lightweight size (1 kb gzipped). Provides 32 options to customize checkboxes and radio buttons, 11 callbacks to handle changes, 9 methods to make changes programmatically. Saves changes to original inputs, works carefully with any selectors.", + "keywords": [ + "checkbox", + "radio", + "input", + "field", + "form", + "desktop", + "mobile", + "custom", + "replacement", + "accessibility", + "skins", + "ui", + "checked", + "disabled", + "indeterminate", + "css3", + "html5", + "tiny", + "lightweight", + "jquery", + "zepto" + ], + "homepage": "http://fronteed.com/iCheck/", + "docs": "https://github.com/fronteed/iCheck", + "demo": "http://fronteed.com/iCheck/", + "download": "http://fronteed.com/iCheck/", + "bugs": "https://github.com/fronteed/iCheck/issues/" +} diff --git a/bower_components/iCheck/icheck.js b/bower_components/iCheck/icheck.js new file mode 100644 index 0000000000..51c3e80bd3 --- /dev/null +++ b/bower_components/iCheck/icheck.js @@ -0,0 +1,509 @@ +/*! + * iCheck v1.0.2, http://git.io/arlzeA + * =================================== + * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization + * + * (c) 2013 Damir Sultanov, http://fronteed.com + * MIT Licensed + */ + +(function($) { + + // Cached vars + var _iCheck = 'iCheck', + _iCheckHelper = _iCheck + '-helper', + _checkbox = 'checkbox', + _radio = 'radio', + _checked = 'checked', + _unchecked = 'un' + _checked, + _disabled = 'disabled',a + _determinate = 'determinate', + _indeterminate = 'in' + _determinate, + _update = 'update', + _type = 'type', + _click = 'click', + _touch = 'touchbegin.i touchend.i', + _add = 'addClass', + _remove = 'removeClass', + _callback = 'trigger', + _label = 'label', + _cursor = 'cursor', + _mobile = /ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent); + + // Plugin init + $.fn[_iCheck] = function(options, fire) { + + // Walker + var handle = 'input[type="' + _checkbox + '"], input[type="' + _radio + '"]', + stack = $(), + walker = function(object) { + object.each(function() { + var self = $(this); + + if (self.is(handle)) { + stack = stack.add(self); + } else { + stack = stack.add(self.find(handle)); + } + }); + }; + + // Check if we should operate with some method + if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) { + + // Normalize method's name + options = options.toLowerCase(); + + // Find checkboxes and radio buttons + walker(this); + + return stack.each(function() { + var self = $(this); + + if (options == 'destroy') { + tidy(self, 'ifDestroyed'); + } else { + operate(self, true, options); + } + + // Fire method's callback + if ($.isFunction(fire)) { + fire(); + } + }); + + // Customization + } else if (typeof options == 'object' || !options) { + + // Check if any options were passed + var settings = $.extend({ + checkedClass: _checked, + disabledClass: _disabled, + indeterminateClass: _indeterminate, + labelHover: true + }, options), + + selector = settings.handle, + hoverClass = settings.hoverClass || 'hover', + focusClass = settings.focusClass || 'focus', + activeClass = settings.activeClass || 'active', + labelHover = !!settings.labelHover, + labelHoverClass = settings.labelHoverClass || 'hover', + + // Setup clickable area + area = ('' + settings.increaseArea).replace('%', '') | 0; + + // Selector limit + if (selector == _checkbox || selector == _radio) { + handle = 'input[type="' + selector + '"]'; + } + + // Clickable area limit + if (area < -50) { + area = -50; + } + + // Walk around the selector + walker(this); + + return stack.each(function() { + var self = $(this); + + // If already customized + tidy(self); + + var node = this, + id = node.id, + + // Layer styles + offset = -area + '%', + size = 100 + (area * 2) + '%', + layer = { + position: 'absolute', + top: offset, + left: offset, + display: 'block', + width: size, + height: size, + margin: 0, + padding: 0, + background: '#fff', + border: 0, + opacity: 0 + }, + + // Choose how to hide input + hide = _mobile ? { + position: 'absolute', + visibility: 'hidden' + } : area ? layer : { + position: 'absolute', + opacity: 0 + }, + + // Get proper class + className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio, + + // Find assigned labels + label = $(_label + '[for="' + id + '"]').add(self.closest(_label)), + + // Check ARIA option + aria = !!settings.aria, + + // Set ARIA placeholder + ariaID = _iCheck + '-' + Math.random().toString(36).substr(2,6), + + // Parent & helper + parent = '
      ')[_callback]('ifCreated').parent().append(settings.insert); + + // Layer addition + helper = $('').css(layer).appendTo(parent); + + // Finalize customization + self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide); + !!settings.inheritClass && parent[_add](node.className || ''); + !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id); + parent.css('position') == 'static' && parent.css('position', 'relative'); + operate(self, true, _update); + + // Label events + if (label.length) { + label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function(event) { + var type = event[_type], + item = $(this); + + // Do nothing if input is disabled + if (!node[_disabled]) { + + // Click + if (type == _click) { + if ($(event.target).is('a')) { + return; + } + operate(self, false, true); + + // Hover state + } else if (labelHover) { + + // mouseout|touchend + if (/ut|nd/.test(type)) { + parent[_remove](hoverClass); + item[_remove](labelHoverClass); + } else { + parent[_add](hoverClass); + item[_add](labelHoverClass); + } + } + + if (_mobile) { + event.stopPropagation(); + } else { + return false; + } + } + }); + } + + // Input events + self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function(event) { + var type = event[_type], + key = event.keyCode; + + // Click + if (type == _click) { + return false; + + // Keydown + } else if (type == 'keydown' && key == 32) { + if (!(node[_type] == _radio && node[_checked])) { + if (node[_checked]) { + off(self, _checked); + } else { + on(self, _checked); + } + } + + return false; + + // Keyup + } else if (type == 'keyup' && node[_type] == _radio) { + !node[_checked] && on(self, _checked); + + // Focus/blur + } else if (/us|ur/.test(type)) { + parent[type == 'blur' ? _remove : _add](focusClass); + } + }); + + // Helper events + helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function(event) { + var type = event[_type], + + // mousedown|mouseup + toggle = /wn|up/.test(type) ? activeClass : hoverClass; + + // Do nothing if input is disabled + if (!node[_disabled]) { + + // Click + if (type == _click) { + operate(self, false, true); + + // Active and hover states + } else { + + // State is on + if (/wn|er|in/.test(type)) { + + // mousedown|mouseover|touchbegin + parent[_add](toggle); + + // State is off + } else { + parent[_remove](toggle + ' ' + activeClass); + } + + // Label hover + if (label.length && labelHover && toggle == hoverClass) { + + // mouseout|touchend + label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass); + } + } + + if (_mobile) { + event.stopPropagation(); + } else { + return false; + } + } + }); + }); + } else { + return this; + } + }; + + // Do something with inputs + function operate(input, direct, method) { + var node = input[0], + state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked, + active = method == _update ? { + checked: node[_checked], + disabled: node[_disabled], + indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false' + } : node[state]; + + // Check, disable or indeterminate + if (/^(ch|di|in)/.test(method) && !active) { + on(input, state); + + // Uncheck, enable or determinate + } else if (/^(un|en|de)/.test(method) && active) { + off(input, state); + + // Update + } else if (method == _update) { + + // Handle states + for (var each in active) { + if (active[each]) { + on(input, each, true); + } else { + off(input, each, true); + } + } + + } else if (!direct || method == 'toggle') { + + // Helper or label was clicked + if (!direct) { + input[_callback]('ifClicked'); + } + + // Toggle checked state + if (active) { + if (node[_type] !== _radio) { + off(input, state); + } + } else { + on(input, state); + } + } + } + + // Add checked, disabled or indeterminate state + function on(input, state, keep) { + var node = input[0], + parent = input.parent(), + checked = state == _checked, + indeterminate = state == _indeterminate, + disabled = state == _disabled, + callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', + regular = option(input, callback + capitalize(node[_type])), + specific = option(input, state + capitalize(node[_type])); + + // Prevent unnecessary actions + if (node[state] !== true) { + + // Toggle assigned radio buttons + if (!keep && state == _checked && node[_type] == _radio && node.name) { + var form = input.closest('form'), + inputs = 'input[name="' + node.name + '"]'; + + inputs = form.length ? form.find(inputs) : $(inputs); + + inputs.each(function() { + if (this !== node && $(this).data(_iCheck)) { + off($(this), state); + } + }); + } + + // Indeterminate state + if (indeterminate) { + + // Add indeterminate state + node[state] = true; + + // Remove checked state + if (node[_checked]) { + off(input, _checked, 'force'); + } + + // Checked or disabled state + } else { + + // Add checked or disabled state + if (!keep) { + node[state] = true; + } + + // Remove indeterminate state + if (checked && node[_indeterminate]) { + off(input, _indeterminate, false); + } + } + + // Trigger callbacks + callbacks(input, checked, state, keep); + } + + // Add proper cursor + if (node[_disabled] && !!option(input, _cursor, true)) { + parent.find('.' + _iCheckHelper).css(_cursor, 'default'); + } + + // Add state class + parent[_add](specific || option(input, state) || ''); + + // Set ARIA attribute + if (!!parent.attr('role') && !indeterminate) { + parent.attr('aria-' + (disabled ? _disabled : _checked), 'true'); + } + + // Remove regular state class + parent[_remove](regular || option(input, callback) || ''); + } + + // Remove checked, disabled or indeterminate state + function off(input, state, keep) { + var node = input[0], + parent = input.parent(), + checked = state == _checked, + indeterminate = state == _indeterminate, + disabled = state == _disabled, + callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', + regular = option(input, callback + capitalize(node[_type])), + specific = option(input, state + capitalize(node[_type])); + + // Prevent unnecessary actions + if (node[state] !== false) { + + // Toggle state + if (indeterminate || !keep || keep == 'force') { + node[state] = false; + } + + // Trigger callbacks + callbacks(input, checked, callback, keep); + } + + // Add proper cursor + if (!node[_disabled] && !!option(input, _cursor, true)) { + parent.find('.' + _iCheckHelper).css(_cursor, 'pointer'); + } + + // Remove state class + parent[_remove](specific || option(input, state) || ''); + + // Set ARIA attribute + if (!!parent.attr('role') && !indeterminate) { + parent.attr('aria-' + (disabled ? _disabled : _checked), 'false'); + } + + // Add regular state class + parent[_add](regular || option(input, callback) || ''); + } + + // Remove all traces + function tidy(input, callback) { + if (input.data(_iCheck)) { + + // Remove everything except input + input.parent().html(input.attr('style', input.data(_iCheck).s || '')); + + // Callback + if (callback) { + input[_callback](callback); + } + + // Unbind events + input.off('.i').unwrap(); + $(_label + '[for="' + input[0].id + '"]').add(input.closest(_label)).off('.i'); + } + } + + // Get some option + function option(input, state, regular) { + if (input.data(_iCheck)) { + return input.data(_iCheck).o[state + (regular ? '' : 'Class')]; + } + } + + // Capitalize some string + function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); + } + + // Executable handlers + function callbacks(input, checked, callback, keep) { + if (!keep) { + if (checked) { + input[_callback]('ifToggled'); + } + + input[_callback]('ifChanged')[_callback]('if' + capitalize(callback)); + } + } +})(window.jQuery || window.Zepto); diff --git a/bower_components/iCheck/icheck.min.js b/bower_components/iCheck/icheck.min.js new file mode 100644 index 0000000000..7cdb17e0d5 --- /dev/null +++ b/bower_components/iCheck/icheck.min.js @@ -0,0 +1,11 @@ +/*! iCheck v1.0.2 by Damir Sultanov, http://git.io/arlzeA, MIT Licensed */ +(function(f){function A(a,b,d){var c=a[0],g=/er/.test(d)?_indeterminate:/bl/.test(d)?n:k,e=d==_update?{checked:c[k],disabled:c[n],indeterminate:"true"==a.attr(_indeterminate)||"false"==a.attr(_determinate)}:c[g];if(/^(ch|di|in)/.test(d)&&!e)x(a,g);else if(/^(un|en|de)/.test(d)&&e)q(a,g);else if(d==_update)for(var f in e)e[f]?x(a,f,!0):q(a,f,!0);else if(!b||"toggle"==d){if(!b)a[_callback]("ifClicked");e?c[_type]!==r&&q(a,g):x(a,g)}}function x(a,b,d){var c=a[0],g=a.parent(),e=b==k,u=b==_indeterminate, +v=b==n,s=u?_determinate:e?y:"enabled",F=l(a,s+t(c[_type])),B=l(a,b+t(c[_type]));if(!0!==c[b]){if(!d&&b==k&&c[_type]==r&&c.name){var w=a.closest("form"),p='input[name="'+c.name+'"]',p=w.length?w.find(p):f(p);p.each(function(){this!==c&&f(this).data(m)&&q(f(this),b)})}u?(c[b]=!0,c[k]&&q(a,k,"force")):(d||(c[b]=!0),e&&c[_indeterminate]&&q(a,_indeterminate,!1));D(a,e,b,d)}c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"default");g[_add](B||l(a,b)||"");g.attr("role")&&!u&&g.attr("aria-"+(v?n:k),"true"); +g[_remove](F||l(a,s)||"")}function q(a,b,d){var c=a[0],g=a.parent(),e=b==k,f=b==_indeterminate,m=b==n,s=f?_determinate:e?y:"enabled",q=l(a,s+t(c[_type])),r=l(a,b+t(c[_type]));if(!1!==c[b]){if(f||!d||"force"==d)c[b]=!1;D(a,e,s,d)}!c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"pointer");g[_remove](r||l(a,b)||"");g.attr("role")&&!f&&g.attr("aria-"+(m?n:k),"false");g[_add](q||l(a,s)||"")}function E(a,b){if(a.data(m)){a.parent().html(a.attr("style",a.data(m).s||""));if(b)a[_callback](b);a.off(".i").unwrap(); +f(_label+'[for="'+a[0].id+'"]').add(a.closest(_label)).off(".i")}}function l(a,b,f){if(a.data(m))return a.data(m).o[b+(f?"":"Class")]}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function D(a,b,f,c){if(!c){if(b)a[_callback]("ifToggled");a[_callback]("ifChanged")[_callback]("if"+t(f))}}var m="iCheck",C=m+"-helper",r="radio",k="checked",y="un"+k,n="disabled";_determinate="determinate";_indeterminate="in"+_determinate;_update="update";_type="type";_click="click";_touch="touchbegin.i touchend.i"; +_add="addClass";_remove="removeClass";_callback="trigger";_label="label";_cursor="cursor";_mobile=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);f.fn[m]=function(a,b){var d='input[type="checkbox"], input[type="'+r+'"]',c=f(),g=function(a){a.each(function(){var a=f(this);c=a.is(d)?c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),g(this),c.each(function(){var c= +f(this);"destroy"==a?E(c,"ifDestroyed"):A(c,!0,a);f.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var e=f.extend({checkedClass:k,disabledClass:n,indeterminateClass:_indeterminate,labelHover:!0},a),l=e.handle,v=e.hoverClass||"hover",s=e.focusClass||"focus",t=e.activeClass||"active",B=!!e.labelHover,w=e.labelHoverClass||"hover",p=(""+e.increaseArea).replace("%","")|0;if("checkbox"==l||l==r)d='input[type="'+l+'"]';-50>p&&(p=-50);g(this);return c.each(function(){var a=f(this);E(a);var c=this, +b=c.id,g=-p+"%",d=100+2*p+"%",d={position:"absolute",top:g,left:g,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},g=_mobile?{position:"absolute",visibility:"hidden"}:p?d:{position:"absolute",opacity:0},l="checkbox"==c[_type]?e.checkboxClass||"icheckbox":e.radioClass||"i"+r,z=f(_label+'[for="'+b+'"]').add(a.closest(_label)),u=!!e.aria,y=m+"-"+Math.random().toString(36).substr(2,6),h='
      ")[_callback]("ifCreated").parent().append(e.insert);d=f('').css(d).appendTo(h);a.data(m,{o:e,s:a.attr("style")}).css(g);e.inheritClass&&h[_add](c.className||"");e.inheritID&&b&&h.attr("id",m+"-"+b);"static"==h.css("position")&&h.css("position","relative");A(a,!0,_update);if(z.length)z.on(_click+".i mouseover.i mouseout.i "+_touch,function(b){var d=b[_type],e=f(this);if(!c[n]){if(d==_click){if(f(b.target).is("a"))return; +A(a,!1,!0)}else B&&(/ut|nd/.test(d)?(h[_remove](v),e[_remove](w)):(h[_add](v),e[_add](w)));if(_mobile)b.stopPropagation();else return!1}});a.on(_click+".i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[_type];b=b.keyCode;if(d==_click)return!1;if("keydown"==d&&32==b)return c[_type]==r&&c[k]||(c[k]?q(a,k):x(a,k)),!1;if("keyup"==d&&c[_type]==r)!c[k]&&x(a,k);else if(/us|ur/.test(d))h["blur"==d?_remove:_add](s)});d.on(_click+" mousedown mouseup mouseover mouseout "+_touch,function(b){var d= +b[_type],e=/wn|up/.test(d)?t:v;if(!c[n]){if(d==_click)A(a,!1,!0);else{if(/wn|er|in/.test(d))h[_add](e);else h[_remove](e+" "+t);if(z.length&&B&&e==v)z[/ut|nd/.test(d)?_remove:_add](w)}if(_mobile)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto); diff --git a/public/assets/js/plugins/iCheck/all.css b/bower_components/iCheck/skins/all.css old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/all.css rename to bower_components/iCheck/skins/all.css diff --git a/bower_components/iCheck/skins/flat/_all.css b/bower_components/iCheck/skins/flat/_all.css new file mode 100644 index 0000000000..e9d0ceb92e --- /dev/null +++ b/bower_components/iCheck/skins/flat/_all.css @@ -0,0 +1,530 @@ +/* iCheck plugin Flat skin +----------------------------------- */ +.icheckbox_flat, +.iradio_flat { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(flat.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat { + background-position: 0 0; +} + .icheckbox_flat.checked { + background-position: -22px 0; + } + .icheckbox_flat.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat { + background-position: -88px 0; +} + .iradio_flat.checked { + background-position: -110px 0; + } + .iradio_flat.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat, + .iradio_flat { + background-image: url(flat@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* red */ +.icheckbox_flat-red, +.iradio_flat-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-red { + background-position: 0 0; +} + .icheckbox_flat-red.checked { + background-position: -22px 0; + } + .icheckbox_flat-red.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-red.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-red { + background-position: -88px 0; +} + .iradio_flat-red.checked { + background-position: -110px 0; + } + .iradio_flat-red.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-red.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-red, + .iradio_flat-red { + background-image: url(red@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* green */ +.icheckbox_flat-green, +.iradio_flat-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-green { + background-position: 0 0; +} + .icheckbox_flat-green.checked { + background-position: -22px 0; + } + .icheckbox_flat-green.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-green.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-green { + background-position: -88px 0; +} + .iradio_flat-green.checked { + background-position: -110px 0; + } + .iradio_flat-green.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-green.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-green, + .iradio_flat-green { + background-image: url(green@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* blue */ +.icheckbox_flat-blue, +.iradio_flat-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-blue { + background-position: 0 0; +} + .icheckbox_flat-blue.checked { + background-position: -22px 0; + } + .icheckbox_flat-blue.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-blue.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-blue { + background-position: -88px 0; +} + .iradio_flat-blue.checked { + background-position: -110px 0; + } + .iradio_flat-blue.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-blue.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-blue, + .iradio_flat-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* aero */ +.icheckbox_flat-aero, +.iradio_flat-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-aero { + background-position: 0 0; +} + .icheckbox_flat-aero.checked { + background-position: -22px 0; + } + .icheckbox_flat-aero.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-aero.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-aero { + background-position: -88px 0; +} + .iradio_flat-aero.checked { + background-position: -110px 0; + } + .iradio_flat-aero.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-aero.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-aero, + .iradio_flat-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* grey */ +.icheckbox_flat-grey, +.iradio_flat-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-grey { + background-position: 0 0; +} + .icheckbox_flat-grey.checked { + background-position: -22px 0; + } + .icheckbox_flat-grey.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-grey.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-grey { + background-position: -88px 0; +} + .iradio_flat-grey.checked { + background-position: -110px 0; + } + .iradio_flat-grey.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-grey.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-grey, + .iradio_flat-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* orange */ +.icheckbox_flat-orange, +.iradio_flat-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-orange { + background-position: 0 0; +} + .icheckbox_flat-orange.checked { + background-position: -22px 0; + } + .icheckbox_flat-orange.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-orange.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-orange { + background-position: -88px 0; +} + .iradio_flat-orange.checked { + background-position: -110px 0; + } + .iradio_flat-orange.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-orange.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-orange, + .iradio_flat-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* yellow */ +.icheckbox_flat-yellow, +.iradio_flat-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-yellow { + background-position: 0 0; +} + .icheckbox_flat-yellow.checked { + background-position: -22px 0; + } + .icheckbox_flat-yellow.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-yellow.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-yellow { + background-position: -88px 0; +} + .iradio_flat-yellow.checked { + background-position: -110px 0; + } + .iradio_flat-yellow.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-yellow.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-yellow, + .iradio_flat-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* pink */ +.icheckbox_flat-pink, +.iradio_flat-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-pink { + background-position: 0 0; +} + .icheckbox_flat-pink.checked { + background-position: -22px 0; + } + .icheckbox_flat-pink.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-pink.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-pink { + background-position: -88px 0; +} + .iradio_flat-pink.checked { + background-position: -110px 0; + } + .iradio_flat-pink.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-pink.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-pink, + .iradio_flat-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* purple */ +.icheckbox_flat-purple, +.iradio_flat-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-purple { + background-position: 0 0; +} + .icheckbox_flat-purple.checked { + background-position: -22px 0; + } + .icheckbox_flat-purple.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-purple.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-purple { + background-position: -88px 0; +} + .iradio_flat-purple.checked { + background-position: -110px 0; + } + .iradio_flat-purple.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-purple.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-purple, + .iradio_flat-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/flat/aero.css b/bower_components/iCheck/skins/flat/aero.css new file mode 100644 index 0000000000..71cbca97ec --- /dev/null +++ b/bower_components/iCheck/skins/flat/aero.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, aero +----------------------------------- */ +.icheckbox_flat-aero, +.iradio_flat-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-aero { + background-position: 0 0; +} + .icheckbox_flat-aero.checked { + background-position: -22px 0; + } + .icheckbox_flat-aero.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-aero.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-aero { + background-position: -88px 0; +} + .iradio_flat-aero.checked { + background-position: -110px 0; + } + .iradio_flat-aero.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-aero.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-aero, + .iradio_flat-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/aero.png b/bower_components/iCheck/skins/flat/aero.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/aero.png rename to bower_components/iCheck/skins/flat/aero.png diff --git a/public/assets/js/plugins/iCheck/flat/aero@2x.png b/bower_components/iCheck/skins/flat/aero@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/aero@2x.png rename to bower_components/iCheck/skins/flat/aero@2x.png diff --git a/bower_components/iCheck/skins/flat/blue.css b/bower_components/iCheck/skins/flat/blue.css new file mode 100644 index 0000000000..56a7830297 --- /dev/null +++ b/bower_components/iCheck/skins/flat/blue.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, blue +----------------------------------- */ +.icheckbox_flat-blue, +.iradio_flat-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-blue { + background-position: 0 0; +} + .icheckbox_flat-blue.checked { + background-position: -22px 0; + } + .icheckbox_flat-blue.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-blue.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-blue { + background-position: -88px 0; +} + .iradio_flat-blue.checked { + background-position: -110px 0; + } + .iradio_flat-blue.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-blue.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-blue, + .iradio_flat-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/blue.png b/bower_components/iCheck/skins/flat/blue.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/blue.png rename to bower_components/iCheck/skins/flat/blue.png diff --git a/public/assets/js/plugins/iCheck/flat/blue@2x.png b/bower_components/iCheck/skins/flat/blue@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/blue@2x.png rename to bower_components/iCheck/skins/flat/blue@2x.png diff --git a/bower_components/iCheck/skins/flat/flat.css b/bower_components/iCheck/skins/flat/flat.css new file mode 100644 index 0000000000..0f39690b23 --- /dev/null +++ b/bower_components/iCheck/skins/flat/flat.css @@ -0,0 +1,53 @@ +/* iCheck plugin flat skin, black +----------------------------------- */ +.icheckbox_flat, +.iradio_flat { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(flat.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat { + background-position: 0 0; +} + .icheckbox_flat.checked { + background-position: -22px 0; + } + .icheckbox_flat.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat { + background-position: -88px 0; +} + .iradio_flat.checked { + background-position: -110px 0; + } + .iradio_flat.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat, + .iradio_flat { + background-image: url(flat@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/flat.png b/bower_components/iCheck/skins/flat/flat.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/flat.png rename to bower_components/iCheck/skins/flat/flat.png diff --git a/public/assets/js/plugins/iCheck/flat/flat@2x.png b/bower_components/iCheck/skins/flat/flat@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/flat@2x.png rename to bower_components/iCheck/skins/flat/flat@2x.png diff --git a/bower_components/iCheck/skins/flat/green.css b/bower_components/iCheck/skins/flat/green.css new file mode 100644 index 0000000000..b80e04d513 --- /dev/null +++ b/bower_components/iCheck/skins/flat/green.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, green +----------------------------------- */ +.icheckbox_flat-green, +.iradio_flat-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-green { + background-position: 0 0; +} + .icheckbox_flat-green.checked { + background-position: -22px 0; + } + .icheckbox_flat-green.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-green.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-green { + background-position: -88px 0; +} + .iradio_flat-green.checked { + background-position: -110px 0; + } + .iradio_flat-green.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-green.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-green, + .iradio_flat-green { + background-image: url(green@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/green.png b/bower_components/iCheck/skins/flat/green.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/green.png rename to bower_components/iCheck/skins/flat/green.png diff --git a/public/assets/js/plugins/iCheck/flat/green@2x.png b/bower_components/iCheck/skins/flat/green@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/green@2x.png rename to bower_components/iCheck/skins/flat/green@2x.png diff --git a/bower_components/iCheck/skins/flat/grey.css b/bower_components/iCheck/skins/flat/grey.css new file mode 100644 index 0000000000..96e62e832b --- /dev/null +++ b/bower_components/iCheck/skins/flat/grey.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, grey +----------------------------------- */ +.icheckbox_flat-grey, +.iradio_flat-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-grey { + background-position: 0 0; +} + .icheckbox_flat-grey.checked { + background-position: -22px 0; + } + .icheckbox_flat-grey.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-grey.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-grey { + background-position: -88px 0; +} + .iradio_flat-grey.checked { + background-position: -110px 0; + } + .iradio_flat-grey.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-grey.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-grey, + .iradio_flat-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/grey.png b/bower_components/iCheck/skins/flat/grey.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/grey.png rename to bower_components/iCheck/skins/flat/grey.png diff --git a/public/assets/js/plugins/iCheck/flat/grey@2x.png b/bower_components/iCheck/skins/flat/grey@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/grey@2x.png rename to bower_components/iCheck/skins/flat/grey@2x.png diff --git a/bower_components/iCheck/skins/flat/orange.css b/bower_components/iCheck/skins/flat/orange.css new file mode 100644 index 0000000000..f9c873ffc8 --- /dev/null +++ b/bower_components/iCheck/skins/flat/orange.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, orange +----------------------------------- */ +.icheckbox_flat-orange, +.iradio_flat-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-orange { + background-position: 0 0; +} + .icheckbox_flat-orange.checked { + background-position: -22px 0; + } + .icheckbox_flat-orange.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-orange.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-orange { + background-position: -88px 0; +} + .iradio_flat-orange.checked { + background-position: -110px 0; + } + .iradio_flat-orange.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-orange.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-orange, + .iradio_flat-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/orange.png b/bower_components/iCheck/skins/flat/orange.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/orange.png rename to bower_components/iCheck/skins/flat/orange.png diff --git a/public/assets/js/plugins/iCheck/flat/orange@2x.png b/bower_components/iCheck/skins/flat/orange@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/orange@2x.png rename to bower_components/iCheck/skins/flat/orange@2x.png diff --git a/bower_components/iCheck/skins/flat/pink.css b/bower_components/iCheck/skins/flat/pink.css new file mode 100644 index 0000000000..179f980ddd --- /dev/null +++ b/bower_components/iCheck/skins/flat/pink.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, pink +----------------------------------- */ +.icheckbox_flat-pink, +.iradio_flat-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-pink { + background-position: 0 0; +} + .icheckbox_flat-pink.checked { + background-position: -22px 0; + } + .icheckbox_flat-pink.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-pink.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-pink { + background-position: -88px 0; +} + .iradio_flat-pink.checked { + background-position: -110px 0; + } + .iradio_flat-pink.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-pink.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-pink, + .iradio_flat-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/pink.png b/bower_components/iCheck/skins/flat/pink.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/pink.png rename to bower_components/iCheck/skins/flat/pink.png diff --git a/public/assets/js/plugins/iCheck/flat/pink@2x.png b/bower_components/iCheck/skins/flat/pink@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/pink@2x.png rename to bower_components/iCheck/skins/flat/pink@2x.png diff --git a/bower_components/iCheck/skins/flat/purple.css b/bower_components/iCheck/skins/flat/purple.css new file mode 100644 index 0000000000..dfedafc29a --- /dev/null +++ b/bower_components/iCheck/skins/flat/purple.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, purple +----------------------------------- */ +.icheckbox_flat-purple, +.iradio_flat-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-purple { + background-position: 0 0; +} + .icheckbox_flat-purple.checked { + background-position: -22px 0; + } + .icheckbox_flat-purple.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-purple.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-purple { + background-position: -88px 0; +} + .iradio_flat-purple.checked { + background-position: -110px 0; + } + .iradio_flat-purple.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-purple.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-purple, + .iradio_flat-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/purple.png b/bower_components/iCheck/skins/flat/purple.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/purple.png rename to bower_components/iCheck/skins/flat/purple.png diff --git a/public/assets/js/plugins/iCheck/flat/purple@2x.png b/bower_components/iCheck/skins/flat/purple@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/purple@2x.png rename to bower_components/iCheck/skins/flat/purple@2x.png diff --git a/bower_components/iCheck/skins/flat/red.css b/bower_components/iCheck/skins/flat/red.css new file mode 100644 index 0000000000..83ec91e924 --- /dev/null +++ b/bower_components/iCheck/skins/flat/red.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, red +----------------------------------- */ +.icheckbox_flat-red, +.iradio_flat-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-red { + background-position: 0 0; +} + .icheckbox_flat-red.checked { + background-position: -22px 0; + } + .icheckbox_flat-red.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-red.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-red { + background-position: -88px 0; +} + .iradio_flat-red.checked { + background-position: -110px 0; + } + .iradio_flat-red.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-red.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-red, + .iradio_flat-red { + background-image: url(red@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/red.png b/bower_components/iCheck/skins/flat/red.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/red.png rename to bower_components/iCheck/skins/flat/red.png diff --git a/public/assets/js/plugins/iCheck/flat/red@2x.png b/bower_components/iCheck/skins/flat/red@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/red@2x.png rename to bower_components/iCheck/skins/flat/red@2x.png diff --git a/bower_components/iCheck/skins/flat/yellow.css b/bower_components/iCheck/skins/flat/yellow.css new file mode 100644 index 0000000000..7bb6039351 --- /dev/null +++ b/bower_components/iCheck/skins/flat/yellow.css @@ -0,0 +1,53 @@ +/* iCheck plugin Flat skin, yellow +----------------------------------- */ +.icheckbox_flat-yellow, +.iradio_flat-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-yellow { + background-position: 0 0; +} + .icheckbox_flat-yellow.checked { + background-position: -22px 0; + } + .icheckbox_flat-yellow.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-yellow.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-yellow { + background-position: -88px 0; +} + .iradio_flat-yellow.checked { + background-position: -110px 0; + } + .iradio_flat-yellow.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-yellow.checked.disabled { + background-position: -154px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_flat-yellow, + .iradio_flat-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/flat/yellow.png b/bower_components/iCheck/skins/flat/yellow.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/yellow.png rename to bower_components/iCheck/skins/flat/yellow.png diff --git a/public/assets/js/plugins/iCheck/flat/yellow@2x.png b/bower_components/iCheck/skins/flat/yellow@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/flat/yellow@2x.png rename to bower_components/iCheck/skins/flat/yellow@2x.png diff --git a/bower_components/iCheck/skins/futurico/futurico.css b/bower_components/iCheck/skins/futurico/futurico.css new file mode 100644 index 0000000000..a34a7548d3 --- /dev/null +++ b/bower_components/iCheck/skins/futurico/futurico.css @@ -0,0 +1,53 @@ +/* iCheck plugin Futurico skin +----------------------------------- */ +.icheckbox_futurico, +.iradio_futurico { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 16px; + height: 17px; + background: url(futurico.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_futurico { + background-position: 0 0; +} + .icheckbox_futurico.checked { + background-position: -18px 0; + } + .icheckbox_futurico.disabled { + background-position: -36px 0; + cursor: default; + } + .icheckbox_futurico.checked.disabled { + background-position: -54px 0; + } + +.iradio_futurico { + background-position: -72px 0; +} + .iradio_futurico.checked { + background-position: -90px 0; + } + .iradio_futurico.disabled { + background-position: -108px 0; + cursor: default; + } + .iradio_futurico.checked.disabled { + background-position: -126px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_futurico, + .iradio_futurico { + background-image: url(futurico@2x.png); + -webkit-background-size: 144px 19px; + background-size: 144px 19px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/futurico/futurico.png b/bower_components/iCheck/skins/futurico/futurico.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/futurico/futurico.png rename to bower_components/iCheck/skins/futurico/futurico.png diff --git a/public/assets/js/plugins/iCheck/futurico/futurico@2x.png b/bower_components/iCheck/skins/futurico/futurico@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/futurico/futurico@2x.png rename to bower_components/iCheck/skins/futurico/futurico@2x.png diff --git a/bower_components/iCheck/skins/line/_all.css b/bower_components/iCheck/skins/line/_all.css new file mode 100644 index 0000000000..8a20ed2cad --- /dev/null +++ b/bower_components/iCheck/skins/line/_all.css @@ -0,0 +1,710 @@ +/* iCheck plugin Line skin +----------------------------------- */ +.icheckbox_line, +.iradio_line { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #000; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line.hover, + .icheckbox_line.checked.hover, + .iradio_line.hover { + background: #444; + } + .icheckbox_line.checked, + .iradio_line.checked { + background: #000; + } + .icheckbox_line.checked .icheck_line-icon, + .iradio_line.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line.disabled, + .iradio_line.disabled { + background: #ccc; + cursor: default; + } + .icheckbox_line.disabled .icheck_line-icon, + .iradio_line.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line.checked.disabled, + .iradio_line.checked.disabled { + background: #ccc; + } + .icheckbox_line.checked.disabled .icheck_line-icon, + .iradio_line.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* red */ +.icheckbox_line-red, +.iradio_line-red { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #e56c69; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-red.hover, + .icheckbox_line-red.checked.hover, + .iradio_line-red.hover { + background: #E98582; + } + .icheckbox_line-red.checked, + .iradio_line-red.checked { + background: #e56c69; + } + .icheckbox_line-red.checked .icheck_line-icon, + .iradio_line-red.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-red.disabled, + .iradio_line-red.disabled { + background: #F7D3D2; + cursor: default; + } + .icheckbox_line-red.disabled .icheck_line-icon, + .iradio_line-red.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-red.checked.disabled, + .iradio_line-red.checked.disabled { + background: #F7D3D2; + } + .icheckbox_line-red.checked.disabled .icheck_line-icon, + .iradio_line-red.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* green */ +.icheckbox_line-green, +.iradio_line-green { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #1b7e5a; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-green.hover, + .icheckbox_line-green.checked.hover, + .iradio_line-green.hover { + background: #24AA7A; + } + .icheckbox_line-green.checked, + .iradio_line-green.checked { + background: #1b7e5a; + } + .icheckbox_line-green.checked .icheck_line-icon, + .iradio_line-green.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-green.disabled, + .iradio_line-green.disabled { + background: #89E6C4; + cursor: default; + } + .icheckbox_line-green.disabled .icheck_line-icon, + .iradio_line-green.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-green.checked.disabled, + .iradio_line-green.checked.disabled { + background: #89E6C4; + } + .icheckbox_line-green.checked.disabled .icheck_line-icon, + .iradio_line-green.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* blue */ +.icheckbox_line-blue, +.iradio_line-blue { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #2489c5; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-blue.hover, + .icheckbox_line-blue.checked.hover, + .iradio_line-blue.hover { + background: #3DA0DB; + } + .icheckbox_line-blue.checked, + .iradio_line-blue.checked { + background: #2489c5; + } + .icheckbox_line-blue.checked .icheck_line-icon, + .iradio_line-blue.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-blue.disabled, + .iradio_line-blue.disabled { + background: #ADD7F0; + cursor: default; + } + .icheckbox_line-blue.disabled .icheck_line-icon, + .iradio_line-blue.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-blue.checked.disabled, + .iradio_line-blue.checked.disabled { + background: #ADD7F0; + } + .icheckbox_line-blue.checked.disabled .icheck_line-icon, + .iradio_line-blue.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* aero */ +.icheckbox_line-aero, +.iradio_line-aero { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #9cc2cb; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-aero.hover, + .icheckbox_line-aero.checked.hover, + .iradio_line-aero.hover { + background: #B5D1D8; + } + .icheckbox_line-aero.checked, + .iradio_line-aero.checked { + background: #9cc2cb; + } + .icheckbox_line-aero.checked .icheck_line-icon, + .iradio_line-aero.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-aero.disabled, + .iradio_line-aero.disabled { + background: #D2E4E8; + cursor: default; + } + .icheckbox_line-aero.disabled .icheck_line-icon, + .iradio_line-aero.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-aero.checked.disabled, + .iradio_line-aero.checked.disabled { + background: #D2E4E8; + } + .icheckbox_line-aero.checked.disabled .icheck_line-icon, + .iradio_line-aero.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* grey */ +.icheckbox_line-grey, +.iradio_line-grey { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #73716e; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-grey.hover, + .icheckbox_line-grey.checked.hover, + .iradio_line-grey.hover { + background: #8B8986; + } + .icheckbox_line-grey.checked, + .iradio_line-grey.checked { + background: #73716e; + } + .icheckbox_line-grey.checked .icheck_line-icon, + .iradio_line-grey.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-grey.disabled, + .iradio_line-grey.disabled { + background: #D5D4D3; + cursor: default; + } + .icheckbox_line-grey.disabled .icheck_line-icon, + .iradio_line-grey.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-grey.checked.disabled, + .iradio_line-grey.checked.disabled { + background: #D5D4D3; + } + .icheckbox_line-grey.checked.disabled .icheck_line-icon, + .iradio_line-grey.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* orange */ +.icheckbox_line-orange, +.iradio_line-orange { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #f70; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-orange.hover, + .icheckbox_line-orange.checked.hover, + .iradio_line-orange.hover { + background: #FF9233; + } + .icheckbox_line-orange.checked, + .iradio_line-orange.checked { + background: #f70; + } + .icheckbox_line-orange.checked .icheck_line-icon, + .iradio_line-orange.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-orange.disabled, + .iradio_line-orange.disabled { + background: #FFD6B3; + cursor: default; + } + .icheckbox_line-orange.disabled .icheck_line-icon, + .iradio_line-orange.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-orange.checked.disabled, + .iradio_line-orange.checked.disabled { + background: #FFD6B3; + } + .icheckbox_line-orange.checked.disabled .icheck_line-icon, + .iradio_line-orange.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* yellow */ +.icheckbox_line-yellow, +.iradio_line-yellow { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #FFC414; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-yellow.hover, + .icheckbox_line-yellow.checked.hover, + .iradio_line-yellow.hover { + background: #FFD34F; + } + .icheckbox_line-yellow.checked, + .iradio_line-yellow.checked { + background: #FFC414; + } + .icheckbox_line-yellow.checked .icheck_line-icon, + .iradio_line-yellow.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-yellow.disabled, + .iradio_line-yellow.disabled { + background: #FFE495; + cursor: default; + } + .icheckbox_line-yellow.disabled .icheck_line-icon, + .iradio_line-yellow.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-yellow.checked.disabled, + .iradio_line-yellow.checked.disabled { + background: #FFE495; + } + .icheckbox_line-yellow.checked.disabled .icheck_line-icon, + .iradio_line-yellow.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* pink */ +.icheckbox_line-pink, +.iradio_line-pink { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #a77a94; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-pink.hover, + .icheckbox_line-pink.checked.hover, + .iradio_line-pink.hover { + background: #B995A9; + } + .icheckbox_line-pink.checked, + .iradio_line-pink.checked { + background: #a77a94; + } + .icheckbox_line-pink.checked .icheck_line-icon, + .iradio_line-pink.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-pink.disabled, + .iradio_line-pink.disabled { + background: #E0D0DA; + cursor: default; + } + .icheckbox_line-pink.disabled .icheck_line-icon, + .iradio_line-pink.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-pink.checked.disabled, + .iradio_line-pink.checked.disabled { + background: #E0D0DA; + } + .icheckbox_line-pink.checked.disabled .icheck_line-icon, + .iradio_line-pink.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* purple */ +.icheckbox_line-purple, +.iradio_line-purple { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #6a5a8c; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-purple.hover, + .icheckbox_line-purple.checked.hover, + .iradio_line-purple.hover { + background: #8677A7; + } + .icheckbox_line-purple.checked, + .iradio_line-purple.checked { + background: #6a5a8c; + } + .icheckbox_line-purple.checked .icheck_line-icon, + .iradio_line-purple.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-purple.disabled, + .iradio_line-purple.disabled { + background: #D2CCDE; + cursor: default; + } + .icheckbox_line-purple.disabled .icheck_line-icon, + .iradio_line-purple.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-purple.checked.disabled, + .iradio_line-purple.checked.disabled { + background: #D2CCDE; + } + .icheckbox_line-purple.checked.disabled .icheck_line-icon, + .iradio_line-purple.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/aero.css b/bower_components/iCheck/skins/line/aero.css new file mode 100644 index 0000000000..8227223001 --- /dev/null +++ b/bower_components/iCheck/skins/line/aero.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, aero +----------------------------------- */ +.icheckbox_line-aero, +.iradio_line-aero { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #9cc2cb; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-aero.hover, + .icheckbox_line-aero.checked.hover, + .iradio_line-aero.hover { + background: #B5D1D8; + } + .icheckbox_line-aero.checked, + .iradio_line-aero.checked { + background: #9cc2cb; + } + .icheckbox_line-aero.checked .icheck_line-icon, + .iradio_line-aero.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-aero.disabled, + .iradio_line-aero.disabled { + background: #D2E4E8; + cursor: default; + } + .icheckbox_line-aero.disabled .icheck_line-icon, + .iradio_line-aero.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-aero.checked.disabled, + .iradio_line-aero.checked.disabled { + background: #D2E4E8; + } + .icheckbox_line-aero.checked.disabled .icheck_line-icon, + .iradio_line-aero.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/blue.css b/bower_components/iCheck/skins/line/blue.css new file mode 100644 index 0000000000..b3f98196f7 --- /dev/null +++ b/bower_components/iCheck/skins/line/blue.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, blue +----------------------------------- */ +.icheckbox_line-blue, +.iradio_line-blue { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #2489c5; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-blue.hover, + .icheckbox_line-blue.checked.hover, + .iradio_line-blue.hover { + background: #3DA0DB; + } + .icheckbox_line-blue.checked, + .iradio_line-blue.checked { + background: #2489c5; + } + .icheckbox_line-blue.checked .icheck_line-icon, + .iradio_line-blue.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-blue.disabled, + .iradio_line-blue.disabled { + background: #ADD7F0; + cursor: default; + } + .icheckbox_line-blue.disabled .icheck_line-icon, + .iradio_line-blue.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-blue.checked.disabled, + .iradio_line-blue.checked.disabled { + background: #ADD7F0; + } + .icheckbox_line-blue.checked.disabled .icheck_line-icon, + .iradio_line-blue.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/green.css b/bower_components/iCheck/skins/line/green.css new file mode 100644 index 0000000000..82b426319c --- /dev/null +++ b/bower_components/iCheck/skins/line/green.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, green +----------------------------------- */ +.icheckbox_line-green, +.iradio_line-green { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #1b7e5a; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-green.hover, + .icheckbox_line-green.checked.hover, + .iradio_line-green.hover { + background: #24AA7A; + } + .icheckbox_line-green.checked, + .iradio_line-green.checked { + background: #1b7e5a; + } + .icheckbox_line-green.checked .icheck_line-icon, + .iradio_line-green.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-green.disabled, + .iradio_line-green.disabled { + background: #89E6C4; + cursor: default; + } + .icheckbox_line-green.disabled .icheck_line-icon, + .iradio_line-green.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-green.checked.disabled, + .iradio_line-green.checked.disabled { + background: #89E6C4; + } + .icheckbox_line-green.checked.disabled .icheck_line-icon, + .iradio_line-green.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/grey.css b/bower_components/iCheck/skins/line/grey.css new file mode 100644 index 0000000000..96a5d261a9 --- /dev/null +++ b/bower_components/iCheck/skins/line/grey.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, grey +----------------------------------- */ +.icheckbox_line-grey, +.iradio_line-grey { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #73716e; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-grey.hover, + .icheckbox_line-grey.checked.hover, + .iradio_line-grey.hover { + background: #8B8986; + } + .icheckbox_line-grey.checked, + .iradio_line-grey.checked { + background: #73716e; + } + .icheckbox_line-grey.checked .icheck_line-icon, + .iradio_line-grey.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-grey.disabled, + .iradio_line-grey.disabled { + background: #D5D4D3; + cursor: default; + } + .icheckbox_line-grey.disabled .icheck_line-icon, + .iradio_line-grey.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-grey.checked.disabled, + .iradio_line-grey.checked.disabled { + background: #D5D4D3; + } + .icheckbox_line-grey.checked.disabled .icheck_line-icon, + .iradio_line-grey.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/line.css b/bower_components/iCheck/skins/line/line.css new file mode 100644 index 0000000000..a24398aeea --- /dev/null +++ b/bower_components/iCheck/skins/line/line.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, black +----------------------------------- */ +.icheckbox_line, +.iradio_line { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #000; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line.hover, + .icheckbox_line.checked.hover, + .iradio_line.hover { + background: #444; + } + .icheckbox_line.checked, + .iradio_line.checked { + background: #000; + } + .icheckbox_line.checked .icheck_line-icon, + .iradio_line.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line.disabled, + .iradio_line.disabled { + background: #ccc; + cursor: default; + } + .icheckbox_line.disabled .icheck_line-icon, + .iradio_line.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line.checked.disabled, + .iradio_line.checked.disabled { + background: #ccc; + } + .icheckbox_line.checked.disabled .icheck_line-icon, + .iradio_line.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/line/line.png b/bower_components/iCheck/skins/line/line.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/line/line.png rename to bower_components/iCheck/skins/line/line.png diff --git a/public/assets/js/plugins/iCheck/line/line@2x.png b/bower_components/iCheck/skins/line/line@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/line/line@2x.png rename to bower_components/iCheck/skins/line/line@2x.png diff --git a/bower_components/iCheck/skins/line/orange.css b/bower_components/iCheck/skins/line/orange.css new file mode 100644 index 0000000000..5f051b40fa --- /dev/null +++ b/bower_components/iCheck/skins/line/orange.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, orange +----------------------------------- */ +.icheckbox_line-orange, +.iradio_line-orange { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #f70; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-orange.hover, + .icheckbox_line-orange.checked.hover, + .iradio_line-orange.hover { + background: #FF9233; + } + .icheckbox_line-orange.checked, + .iradio_line-orange.checked { + background: #f70; + } + .icheckbox_line-orange.checked .icheck_line-icon, + .iradio_line-orange.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-orange.disabled, + .iradio_line-orange.disabled { + background: #FFD6B3; + cursor: default; + } + .icheckbox_line-orange.disabled .icheck_line-icon, + .iradio_line-orange.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-orange.checked.disabled, + .iradio_line-orange.checked.disabled { + background: #FFD6B3; + } + .icheckbox_line-orange.checked.disabled .icheck_line-icon, + .iradio_line-orange.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/pink.css b/bower_components/iCheck/skins/line/pink.css new file mode 100644 index 0000000000..b98bbc3da6 --- /dev/null +++ b/bower_components/iCheck/skins/line/pink.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, pink +----------------------------------- */ +.icheckbox_line-pink, +.iradio_line-pink { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #a77a94; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-pink.hover, + .icheckbox_line-pink.checked.hover, + .iradio_line-pink.hover { + background: #B995A9; + } + .icheckbox_line-pink.checked, + .iradio_line-pink.checked { + background: #a77a94; + } + .icheckbox_line-pink.checked .icheck_line-icon, + .iradio_line-pink.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-pink.disabled, + .iradio_line-pink.disabled { + background: #E0D0DA; + cursor: default; + } + .icheckbox_line-pink.disabled .icheck_line-icon, + .iradio_line-pink.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-pink.checked.disabled, + .iradio_line-pink.checked.disabled { + background: #E0D0DA; + } + .icheckbox_line-pink.checked.disabled .icheck_line-icon, + .iradio_line-pink.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/purple.css b/bower_components/iCheck/skins/line/purple.css new file mode 100644 index 0000000000..61f4a2f9b1 --- /dev/null +++ b/bower_components/iCheck/skins/line/purple.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, purple +----------------------------------- */ +.icheckbox_line-purple, +.iradio_line-purple { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #6a5a8c; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-purple.hover, + .icheckbox_line-purple.checked.hover, + .iradio_line-purple.hover { + background: #8677A7; + } + .icheckbox_line-purple.checked, + .iradio_line-purple.checked { + background: #6a5a8c; + } + .icheckbox_line-purple.checked .icheck_line-icon, + .iradio_line-purple.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-purple.disabled, + .iradio_line-purple.disabled { + background: #D2CCDE; + cursor: default; + } + .icheckbox_line-purple.disabled .icheck_line-icon, + .iradio_line-purple.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-purple.checked.disabled, + .iradio_line-purple.checked.disabled { + background: #D2CCDE; + } + .icheckbox_line-purple.checked.disabled .icheck_line-icon, + .iradio_line-purple.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/red.css b/bower_components/iCheck/skins/line/red.css new file mode 100644 index 0000000000..d86c946ba9 --- /dev/null +++ b/bower_components/iCheck/skins/line/red.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, red +----------------------------------- */ +.icheckbox_line-red, +.iradio_line-red { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #e56c69; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-red.hover, + .icheckbox_line-red.checked.hover, + .iradio_line-red.hover { + background: #E98582; + } + .icheckbox_line-red.checked, + .iradio_line-red.checked { + background: #e56c69; + } + .icheckbox_line-red.checked .icheck_line-icon, + .iradio_line-red.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-red.disabled, + .iradio_line-red.disabled { + background: #F7D3D2; + cursor: default; + } + .icheckbox_line-red.disabled .icheck_line-icon, + .iradio_line-red.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-red.checked.disabled, + .iradio_line-red.checked.disabled { + background: #F7D3D2; + } + .icheckbox_line-red.checked.disabled .icheck_line-icon, + .iradio_line-red.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/line/yellow.css b/bower_components/iCheck/skins/line/yellow.css new file mode 100644 index 0000000000..b34148a645 --- /dev/null +++ b/bower_components/iCheck/skins/line/yellow.css @@ -0,0 +1,71 @@ +/* iCheck plugin Line skin, yellow +----------------------------------- */ +.icheckbox_line-yellow, +.iradio_line-yellow { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #FFC414; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-yellow.hover, + .icheckbox_line-yellow.checked.hover, + .iradio_line-yellow.hover { + background: #FFD34F; + } + .icheckbox_line-yellow.checked, + .iradio_line-yellow.checked { + background: #FFC414; + } + .icheckbox_line-yellow.checked .icheck_line-icon, + .iradio_line-yellow.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-yellow.disabled, + .iradio_line-yellow.disabled { + background: #FFE495; + cursor: default; + } + .icheckbox_line-yellow.disabled .icheck_line-icon, + .iradio_line-yellow.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-yellow.checked.disabled, + .iradio_line-yellow.checked.disabled { + background: #FFE495; + } + .icheckbox_line-yellow.checked.disabled .icheck_line-icon, + .iradio_line-yellow.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/minimal/_all.css b/bower_components/iCheck/skins/minimal/_all.css new file mode 100644 index 0000000000..8cf8aca9bd --- /dev/null +++ b/bower_components/iCheck/skins/minimal/_all.css @@ -0,0 +1,590 @@ +/* iCheck plugin Minimal skin +----------------------------------- */ +.icheckbox_minimal, +.iradio_minimal { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(minimal.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal { + background-position: 0 0; +} + .icheckbox_minimal.hover { + background-position: -20px 0; + } + .icheckbox_minimal.checked { + background-position: -40px 0; + } + .icheckbox_minimal.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal { + background-position: -100px 0; +} + .iradio_minimal.hover { + background-position: -120px 0; + } + .iradio_minimal.checked { + background-position: -140px 0; + } + .iradio_minimal.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal, + .iradio_minimal { + background-image: url(minimal@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* red */ +.icheckbox_minimal-red, +.iradio_minimal-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-red { + background-position: 0 0; +} + .icheckbox_minimal-red.hover { + background-position: -20px 0; + } + .icheckbox_minimal-red.checked { + background-position: -40px 0; + } + .icheckbox_minimal-red.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-red.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-red { + background-position: -100px 0; +} + .iradio_minimal-red.hover { + background-position: -120px 0; + } + .iradio_minimal-red.checked { + background-position: -140px 0; + } + .iradio_minimal-red.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-red.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-red, + .iradio_minimal-red { + background-image: url(red@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* green */ +.icheckbox_minimal-green, +.iradio_minimal-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-green { + background-position: 0 0; +} + .icheckbox_minimal-green.hover { + background-position: -20px 0; + } + .icheckbox_minimal-green.checked { + background-position: -40px 0; + } + .icheckbox_minimal-green.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-green.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-green { + background-position: -100px 0; +} + .iradio_minimal-green.hover { + background-position: -120px 0; + } + .iradio_minimal-green.checked { + background-position: -140px 0; + } + .iradio_minimal-green.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-green.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-green, + .iradio_minimal-green { + background-image: url(green@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* blue */ +.icheckbox_minimal-blue, +.iradio_minimal-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-blue { + background-position: 0 0; +} + .icheckbox_minimal-blue.hover { + background-position: -20px 0; + } + .icheckbox_minimal-blue.checked { + background-position: -40px 0; + } + .icheckbox_minimal-blue.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-blue.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-blue { + background-position: -100px 0; +} + .iradio_minimal-blue.hover { + background-position: -120px 0; + } + .iradio_minimal-blue.checked { + background-position: -140px 0; + } + .iradio_minimal-blue.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-blue.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-blue, + .iradio_minimal-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* aero */ +.icheckbox_minimal-aero, +.iradio_minimal-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-aero { + background-position: 0 0; +} + .icheckbox_minimal-aero.hover { + background-position: -20px 0; + } + .icheckbox_minimal-aero.checked { + background-position: -40px 0; + } + .icheckbox_minimal-aero.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-aero.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-aero { + background-position: -100px 0; +} + .iradio_minimal-aero.hover { + background-position: -120px 0; + } + .iradio_minimal-aero.checked { + background-position: -140px 0; + } + .iradio_minimal-aero.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-aero.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-aero, + .iradio_minimal-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* grey */ +.icheckbox_minimal-grey, +.iradio_minimal-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-grey { + background-position: 0 0; +} + .icheckbox_minimal-grey.hover { + background-position: -20px 0; + } + .icheckbox_minimal-grey.checked { + background-position: -40px 0; + } + .icheckbox_minimal-grey.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-grey.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-grey { + background-position: -100px 0; +} + .iradio_minimal-grey.hover { + background-position: -120px 0; + } + .iradio_minimal-grey.checked { + background-position: -140px 0; + } + .iradio_minimal-grey.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-grey.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-grey, + .iradio_minimal-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* orange */ +.icheckbox_minimal-orange, +.iradio_minimal-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-orange { + background-position: 0 0; +} + .icheckbox_minimal-orange.hover { + background-position: -20px 0; + } + .icheckbox_minimal-orange.checked { + background-position: -40px 0; + } + .icheckbox_minimal-orange.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-orange.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-orange { + background-position: -100px 0; +} + .iradio_minimal-orange.hover { + background-position: -120px 0; + } + .iradio_minimal-orange.checked { + background-position: -140px 0; + } + .iradio_minimal-orange.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-orange.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-orange, + .iradio_minimal-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* yellow */ +.icheckbox_minimal-yellow, +.iradio_minimal-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-yellow { + background-position: 0 0; +} + .icheckbox_minimal-yellow.hover { + background-position: -20px 0; + } + .icheckbox_minimal-yellow.checked { + background-position: -40px 0; + } + .icheckbox_minimal-yellow.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-yellow.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-yellow { + background-position: -100px 0; +} + .iradio_minimal-yellow.hover { + background-position: -120px 0; + } + .iradio_minimal-yellow.checked { + background-position: -140px 0; + } + .iradio_minimal-yellow.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-yellow.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-yellow, + .iradio_minimal-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* pink */ +.icheckbox_minimal-pink, +.iradio_minimal-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-pink { + background-position: 0 0; +} + .icheckbox_minimal-pink.hover { + background-position: -20px 0; + } + .icheckbox_minimal-pink.checked { + background-position: -40px 0; + } + .icheckbox_minimal-pink.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-pink.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-pink { + background-position: -100px 0; +} + .iradio_minimal-pink.hover { + background-position: -120px 0; + } + .iradio_minimal-pink.checked { + background-position: -140px 0; + } + .iradio_minimal-pink.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-pink.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-pink, + .iradio_minimal-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* purple */ +.icheckbox_minimal-purple, +.iradio_minimal-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-purple { + background-position: 0 0; +} + .icheckbox_minimal-purple.hover { + background-position: -20px 0; + } + .icheckbox_minimal-purple.checked { + background-position: -40px 0; + } + .icheckbox_minimal-purple.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-purple.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-purple { + background-position: -100px 0; +} + .iradio_minimal-purple.hover { + background-position: -120px 0; + } + .iradio_minimal-purple.checked { + background-position: -140px 0; + } + .iradio_minimal-purple.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-purple.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-purple, + .iradio_minimal-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/minimal/aero.css b/bower_components/iCheck/skins/minimal/aero.css new file mode 100644 index 0000000000..0a7a945382 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/aero.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, aero +----------------------------------- */ +.icheckbox_minimal-aero, +.iradio_minimal-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-aero { + background-position: 0 0; +} + .icheckbox_minimal-aero.hover { + background-position: -20px 0; + } + .icheckbox_minimal-aero.checked { + background-position: -40px 0; + } + .icheckbox_minimal-aero.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-aero.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-aero { + background-position: -100px 0; +} + .iradio_minimal-aero.hover { + background-position: -120px 0; + } + .iradio_minimal-aero.checked { + background-position: -140px 0; + } + .iradio_minimal-aero.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-aero.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-aero, + .iradio_minimal-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/aero.png b/bower_components/iCheck/skins/minimal/aero.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/aero.png rename to bower_components/iCheck/skins/minimal/aero.png diff --git a/public/assets/js/plugins/iCheck/minimal/aero@2x.png b/bower_components/iCheck/skins/minimal/aero@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/aero@2x.png rename to bower_components/iCheck/skins/minimal/aero@2x.png diff --git a/bower_components/iCheck/skins/minimal/blue.css b/bower_components/iCheck/skins/minimal/blue.css new file mode 100644 index 0000000000..c290097518 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/blue.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, blue +----------------------------------- */ +.icheckbox_minimal-blue, +.iradio_minimal-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-blue { + background-position: 0 0; +} + .icheckbox_minimal-blue.hover { + background-position: -20px 0; + } + .icheckbox_minimal-blue.checked { + background-position: -40px 0; + } + .icheckbox_minimal-blue.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-blue.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-blue { + background-position: -100px 0; +} + .iradio_minimal-blue.hover { + background-position: -120px 0; + } + .iradio_minimal-blue.checked { + background-position: -140px 0; + } + .iradio_minimal-blue.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-blue.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-blue, + .iradio_minimal-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/blue.png b/bower_components/iCheck/skins/minimal/blue.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/blue.png rename to bower_components/iCheck/skins/minimal/blue.png diff --git a/public/assets/js/plugins/iCheck/minimal/blue@2x.png b/bower_components/iCheck/skins/minimal/blue@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/blue@2x.png rename to bower_components/iCheck/skins/minimal/blue@2x.png diff --git a/bower_components/iCheck/skins/minimal/green.css b/bower_components/iCheck/skins/minimal/green.css new file mode 100644 index 0000000000..aa685f3665 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/green.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, green +----------------------------------- */ +.icheckbox_minimal-green, +.iradio_minimal-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-green { + background-position: 0 0; +} + .icheckbox_minimal-green.hover { + background-position: -20px 0; + } + .icheckbox_minimal-green.checked { + background-position: -40px 0; + } + .icheckbox_minimal-green.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-green.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-green { + background-position: -100px 0; +} + .iradio_minimal-green.hover { + background-position: -120px 0; + } + .iradio_minimal-green.checked { + background-position: -140px 0; + } + .iradio_minimal-green.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-green.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-green, + .iradio_minimal-green { + background-image: url(green@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/green.png b/bower_components/iCheck/skins/minimal/green.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/green.png rename to bower_components/iCheck/skins/minimal/green.png diff --git a/public/assets/js/plugins/iCheck/minimal/green@2x.png b/bower_components/iCheck/skins/minimal/green@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/green@2x.png rename to bower_components/iCheck/skins/minimal/green@2x.png diff --git a/bower_components/iCheck/skins/minimal/grey.css b/bower_components/iCheck/skins/minimal/grey.css new file mode 100644 index 0000000000..f242697737 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/grey.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, grey +----------------------------------- */ +.icheckbox_minimal-grey, +.iradio_minimal-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-grey { + background-position: 0 0; +} + .icheckbox_minimal-grey.hover { + background-position: -20px 0; + } + .icheckbox_minimal-grey.checked { + background-position: -40px 0; + } + .icheckbox_minimal-grey.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-grey.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-grey { + background-position: -100px 0; +} + .iradio_minimal-grey.hover { + background-position: -120px 0; + } + .iradio_minimal-grey.checked { + background-position: -140px 0; + } + .iradio_minimal-grey.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-grey.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-grey, + .iradio_minimal-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/grey.png b/bower_components/iCheck/skins/minimal/grey.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/grey.png rename to bower_components/iCheck/skins/minimal/grey.png diff --git a/public/assets/js/plugins/iCheck/minimal/grey@2x.png b/bower_components/iCheck/skins/minimal/grey@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/grey@2x.png rename to bower_components/iCheck/skins/minimal/grey@2x.png diff --git a/bower_components/iCheck/skins/minimal/minimal.css b/bower_components/iCheck/skins/minimal/minimal.css new file mode 100644 index 0000000000..c2c6620fc0 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/minimal.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, black +----------------------------------- */ +.icheckbox_minimal, +.iradio_minimal { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(minimal.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal { + background-position: 0 0; +} + .icheckbox_minimal.hover { + background-position: -20px 0; + } + .icheckbox_minimal.checked { + background-position: -40px 0; + } + .icheckbox_minimal.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal { + background-position: -100px 0; +} + .iradio_minimal.hover { + background-position: -120px 0; + } + .iradio_minimal.checked { + background-position: -140px 0; + } + .iradio_minimal.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal, + .iradio_minimal { + background-image: url(minimal@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/minimal.png b/bower_components/iCheck/skins/minimal/minimal.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/minimal.png rename to bower_components/iCheck/skins/minimal/minimal.png diff --git a/public/assets/js/plugins/iCheck/minimal/minimal@2x.png b/bower_components/iCheck/skins/minimal/minimal@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/minimal@2x.png rename to bower_components/iCheck/skins/minimal/minimal@2x.png diff --git a/bower_components/iCheck/skins/minimal/orange.css b/bower_components/iCheck/skins/minimal/orange.css new file mode 100644 index 0000000000..ba1b9c34a3 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/orange.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, orange +----------------------------------- */ +.icheckbox_minimal-orange, +.iradio_minimal-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-orange { + background-position: 0 0; +} + .icheckbox_minimal-orange.hover { + background-position: -20px 0; + } + .icheckbox_minimal-orange.checked { + background-position: -40px 0; + } + .icheckbox_minimal-orange.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-orange.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-orange { + background-position: -100px 0; +} + .iradio_minimal-orange.hover { + background-position: -120px 0; + } + .iradio_minimal-orange.checked { + background-position: -140px 0; + } + .iradio_minimal-orange.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-orange.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-orange, + .iradio_minimal-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/orange.png b/bower_components/iCheck/skins/minimal/orange.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/orange.png rename to bower_components/iCheck/skins/minimal/orange.png diff --git a/public/assets/js/plugins/iCheck/minimal/orange@2x.png b/bower_components/iCheck/skins/minimal/orange@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/orange@2x.png rename to bower_components/iCheck/skins/minimal/orange@2x.png diff --git a/bower_components/iCheck/skins/minimal/pink.css b/bower_components/iCheck/skins/minimal/pink.css new file mode 100644 index 0000000000..77c5741862 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/pink.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, pink +----------------------------------- */ +.icheckbox_minimal-pink, +.iradio_minimal-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-pink { + background-position: 0 0; +} + .icheckbox_minimal-pink.hover { + background-position: -20px 0; + } + .icheckbox_minimal-pink.checked { + background-position: -40px 0; + } + .icheckbox_minimal-pink.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-pink.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-pink { + background-position: -100px 0; +} + .iradio_minimal-pink.hover { + background-position: -120px 0; + } + .iradio_minimal-pink.checked { + background-position: -140px 0; + } + .iradio_minimal-pink.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-pink.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-pink, + .iradio_minimal-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/pink.png b/bower_components/iCheck/skins/minimal/pink.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/pink.png rename to bower_components/iCheck/skins/minimal/pink.png diff --git a/public/assets/js/plugins/iCheck/minimal/pink@2x.png b/bower_components/iCheck/skins/minimal/pink@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/pink@2x.png rename to bower_components/iCheck/skins/minimal/pink@2x.png diff --git a/bower_components/iCheck/skins/minimal/purple.css b/bower_components/iCheck/skins/minimal/purple.css new file mode 100644 index 0000000000..d509f04346 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/purple.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, purple +----------------------------------- */ +.icheckbox_minimal-purple, +.iradio_minimal-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-purple { + background-position: 0 0; +} + .icheckbox_minimal-purple.hover { + background-position: -20px 0; + } + .icheckbox_minimal-purple.checked { + background-position: -40px 0; + } + .icheckbox_minimal-purple.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-purple.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-purple { + background-position: -100px 0; +} + .iradio_minimal-purple.hover { + background-position: -120px 0; + } + .iradio_minimal-purple.checked { + background-position: -140px 0; + } + .iradio_minimal-purple.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-purple.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-purple, + .iradio_minimal-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/purple.png b/bower_components/iCheck/skins/minimal/purple.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/purple.png rename to bower_components/iCheck/skins/minimal/purple.png diff --git a/public/assets/js/plugins/iCheck/minimal/purple@2x.png b/bower_components/iCheck/skins/minimal/purple@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/purple@2x.png rename to bower_components/iCheck/skins/minimal/purple@2x.png diff --git a/bower_components/iCheck/skins/minimal/red.css b/bower_components/iCheck/skins/minimal/red.css new file mode 100644 index 0000000000..2280e5b0db --- /dev/null +++ b/bower_components/iCheck/skins/minimal/red.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, red +----------------------------------- */ +.icheckbox_minimal-red, +.iradio_minimal-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-red { + background-position: 0 0; +} + .icheckbox_minimal-red.hover { + background-position: -20px 0; + } + .icheckbox_minimal-red.checked { + background-position: -40px 0; + } + .icheckbox_minimal-red.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-red.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-red { + background-position: -100px 0; +} + .iradio_minimal-red.hover { + background-position: -120px 0; + } + .iradio_minimal-red.checked { + background-position: -140px 0; + } + .iradio_minimal-red.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-red.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-red, + .iradio_minimal-red { + background-image: url(red@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/red.png b/bower_components/iCheck/skins/minimal/red.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/red.png rename to bower_components/iCheck/skins/minimal/red.png diff --git a/public/assets/js/plugins/iCheck/minimal/red@2x.png b/bower_components/iCheck/skins/minimal/red@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/red@2x.png rename to bower_components/iCheck/skins/minimal/red@2x.png diff --git a/bower_components/iCheck/skins/minimal/yellow.css b/bower_components/iCheck/skins/minimal/yellow.css new file mode 100644 index 0000000000..730bb4c471 --- /dev/null +++ b/bower_components/iCheck/skins/minimal/yellow.css @@ -0,0 +1,59 @@ +/* iCheck plugin Minimal skin, yellow +----------------------------------- */ +.icheckbox_minimal-yellow, +.iradio_minimal-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-yellow { + background-position: 0 0; +} + .icheckbox_minimal-yellow.hover { + background-position: -20px 0; + } + .icheckbox_minimal-yellow.checked { + background-position: -40px 0; + } + .icheckbox_minimal-yellow.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-yellow.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-yellow { + background-position: -100px 0; +} + .iradio_minimal-yellow.hover { + background-position: -120px 0; + } + .iradio_minimal-yellow.checked { + background-position: -140px 0; + } + .iradio_minimal-yellow.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-yellow.checked.disabled { + background-position: -180px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_minimal-yellow, + .iradio_minimal-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/minimal/yellow.png b/bower_components/iCheck/skins/minimal/yellow.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/yellow.png rename to bower_components/iCheck/skins/minimal/yellow.png diff --git a/public/assets/js/plugins/iCheck/minimal/yellow@2x.png b/bower_components/iCheck/skins/minimal/yellow@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/minimal/yellow@2x.png rename to bower_components/iCheck/skins/minimal/yellow@2x.png diff --git a/bower_components/iCheck/skins/polaris/polaris.css b/bower_components/iCheck/skins/polaris/polaris.css new file mode 100644 index 0000000000..2a4d519ca1 --- /dev/null +++ b/bower_components/iCheck/skins/polaris/polaris.css @@ -0,0 +1,59 @@ +/* iCheck plugin Polaris skin +----------------------------------- */ +.icheckbox_polaris, +.iradio_polaris { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 29px; + height: 29px; + background: url(polaris.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_polaris { + background-position: 0 0; +} + .icheckbox_polaris.hover { + background-position: -31px 0; + } + .icheckbox_polaris.checked { + background-position: -62px 0; + } + .icheckbox_polaris.disabled { + background-position: -93px 0; + cursor: default; + } + .icheckbox_polaris.checked.disabled { + background-position: -124px 0; + } + +.iradio_polaris { + background-position: -155px 0; +} + .iradio_polaris.hover { + background-position: -186px 0; + } + .iradio_polaris.checked { + background-position: -217px 0; + } + .iradio_polaris.disabled { + background-position: -248px 0; + cursor: default; + } + .iradio_polaris.checked.disabled { + background-position: -279px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_polaris, + .iradio_polaris { + background-image: url(polaris@2x.png); + -webkit-background-size: 310px 31px; + background-size: 310px 31px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/polaris/polaris.png b/bower_components/iCheck/skins/polaris/polaris.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/polaris/polaris.png rename to bower_components/iCheck/skins/polaris/polaris.png diff --git a/public/assets/js/plugins/iCheck/polaris/polaris@2x.png b/bower_components/iCheck/skins/polaris/polaris@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/polaris/polaris@2x.png rename to bower_components/iCheck/skins/polaris/polaris@2x.png diff --git a/bower_components/iCheck/skins/square/_all.css b/bower_components/iCheck/skins/square/_all.css new file mode 100644 index 0000000000..90c3a69e4e --- /dev/null +++ b/bower_components/iCheck/skins/square/_all.css @@ -0,0 +1,590 @@ +/* iCheck plugin Square skin +----------------------------------- */ +.icheckbox_square, +.iradio_square { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(square.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square { + background-position: 0 0; +} + .icheckbox_square.hover { + background-position: -24px 0; + } + .icheckbox_square.checked { + background-position: -48px 0; + } + .icheckbox_square.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square.checked.disabled { + background-position: -96px 0; + } + +.iradio_square { + background-position: -120px 0; +} + .iradio_square.hover { + background-position: -144px 0; + } + .iradio_square.checked { + background-position: -168px 0; + } + .iradio_square.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square, + .iradio_square { + background-image: url(square@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* red */ +.icheckbox_square-red, +.iradio_square-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-red { + background-position: 0 0; +} + .icheckbox_square-red.hover { + background-position: -24px 0; + } + .icheckbox_square-red.checked { + background-position: -48px 0; + } + .icheckbox_square-red.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-red.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-red { + background-position: -120px 0; +} + .iradio_square-red.hover { + background-position: -144px 0; + } + .iradio_square-red.checked { + background-position: -168px 0; + } + .iradio_square-red.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-red.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-red, + .iradio_square-red { + background-image: url(red@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* green */ +.icheckbox_square-green, +.iradio_square-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-green { + background-position: 0 0; +} + .icheckbox_square-green.hover { + background-position: -24px 0; + } + .icheckbox_square-green.checked { + background-position: -48px 0; + } + .icheckbox_square-green.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-green.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-green { + background-position: -120px 0; +} + .iradio_square-green.hover { + background-position: -144px 0; + } + .iradio_square-green.checked { + background-position: -168px 0; + } + .iradio_square-green.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-green.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-green, + .iradio_square-green { + background-image: url(green@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* blue */ +.icheckbox_square-blue, +.iradio_square-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-blue { + background-position: 0 0; +} + .icheckbox_square-blue.hover { + background-position: -24px 0; + } + .icheckbox_square-blue.checked { + background-position: -48px 0; + } + .icheckbox_square-blue.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-blue.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-blue { + background-position: -120px 0; +} + .iradio_square-blue.hover { + background-position: -144px 0; + } + .iradio_square-blue.checked { + background-position: -168px 0; + } + .iradio_square-blue.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-blue.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-blue, + .iradio_square-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* aero */ +.icheckbox_square-aero, +.iradio_square-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-aero { + background-position: 0 0; +} + .icheckbox_square-aero.hover { + background-position: -24px 0; + } + .icheckbox_square-aero.checked { + background-position: -48px 0; + } + .icheckbox_square-aero.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-aero.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-aero { + background-position: -120px 0; +} + .iradio_square-aero.hover { + background-position: -144px 0; + } + .iradio_square-aero.checked { + background-position: -168px 0; + } + .iradio_square-aero.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-aero.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-aero, + .iradio_square-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* grey */ +.icheckbox_square-grey, +.iradio_square-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-grey { + background-position: 0 0; +} + .icheckbox_square-grey.hover { + background-position: -24px 0; + } + .icheckbox_square-grey.checked { + background-position: -48px 0; + } + .icheckbox_square-grey.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-grey.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-grey { + background-position: -120px 0; +} + .iradio_square-grey.hover { + background-position: -144px 0; + } + .iradio_square-grey.checked { + background-position: -168px 0; + } + .iradio_square-grey.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-grey.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-grey, + .iradio_square-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* orange */ +.icheckbox_square-orange, +.iradio_square-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-orange { + background-position: 0 0; +} + .icheckbox_square-orange.hover { + background-position: -24px 0; + } + .icheckbox_square-orange.checked { + background-position: -48px 0; + } + .icheckbox_square-orange.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-orange.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-orange { + background-position: -120px 0; +} + .iradio_square-orange.hover { + background-position: -144px 0; + } + .iradio_square-orange.checked { + background-position: -168px 0; + } + .iradio_square-orange.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-orange.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-orange, + .iradio_square-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* yellow */ +.icheckbox_square-yellow, +.iradio_square-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-yellow { + background-position: 0 0; +} + .icheckbox_square-yellow.hover { + background-position: -24px 0; + } + .icheckbox_square-yellow.checked { + background-position: -48px 0; + } + .icheckbox_square-yellow.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-yellow.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-yellow { + background-position: -120px 0; +} + .iradio_square-yellow.hover { + background-position: -144px 0; + } + .iradio_square-yellow.checked { + background-position: -168px 0; + } + .iradio_square-yellow.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-yellow.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-yellow, + .iradio_square-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* pink */ +.icheckbox_square-pink, +.iradio_square-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-pink { + background-position: 0 0; +} + .icheckbox_square-pink.hover { + background-position: -24px 0; + } + .icheckbox_square-pink.checked { + background-position: -48px 0; + } + .icheckbox_square-pink.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-pink.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-pink { + background-position: -120px 0; +} + .iradio_square-pink.hover { + background-position: -144px 0; + } + .iradio_square-pink.checked { + background-position: -168px 0; + } + .iradio_square-pink.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-pink.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-pink, + .iradio_square-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* purple */ +.icheckbox_square-purple, +.iradio_square-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-purple { + background-position: 0 0; +} + .icheckbox_square-purple.hover { + background-position: -24px 0; + } + .icheckbox_square-purple.checked { + background-position: -48px 0; + } + .icheckbox_square-purple.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-purple.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-purple { + background-position: -120px 0; +} + .iradio_square-purple.hover { + background-position: -144px 0; + } + .iradio_square-purple.checked { + background-position: -168px 0; + } + .iradio_square-purple.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-purple.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-purple, + .iradio_square-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/bower_components/iCheck/skins/square/aero.css b/bower_components/iCheck/skins/square/aero.css new file mode 100644 index 0000000000..e31b3abb1b --- /dev/null +++ b/bower_components/iCheck/skins/square/aero.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, aero +----------------------------------- */ +.icheckbox_square-aero, +.iradio_square-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-aero { + background-position: 0 0; +} + .icheckbox_square-aero.hover { + background-position: -24px 0; + } + .icheckbox_square-aero.checked { + background-position: -48px 0; + } + .icheckbox_square-aero.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-aero.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-aero { + background-position: -120px 0; +} + .iradio_square-aero.hover { + background-position: -144px 0; + } + .iradio_square-aero.checked { + background-position: -168px 0; + } + .iradio_square-aero.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-aero.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-aero, + .iradio_square-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/aero.png b/bower_components/iCheck/skins/square/aero.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/aero.png rename to bower_components/iCheck/skins/square/aero.png diff --git a/public/assets/js/plugins/iCheck/square/aero@2x.png b/bower_components/iCheck/skins/square/aero@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/aero@2x.png rename to bower_components/iCheck/skins/square/aero@2x.png diff --git a/bower_components/iCheck/skins/square/blue.css b/bower_components/iCheck/skins/square/blue.css new file mode 100644 index 0000000000..f8db2ab6a6 --- /dev/null +++ b/bower_components/iCheck/skins/square/blue.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, blue +----------------------------------- */ +.icheckbox_square-blue, +.iradio_square-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-blue { + background-position: 0 0; +} + .icheckbox_square-blue.hover { + background-position: -24px 0; + } + .icheckbox_square-blue.checked { + background-position: -48px 0; + } + .icheckbox_square-blue.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-blue.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-blue { + background-position: -120px 0; +} + .iradio_square-blue.hover { + background-position: -144px 0; + } + .iradio_square-blue.checked { + background-position: -168px 0; + } + .iradio_square-blue.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-blue.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-blue, + .iradio_square-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/blue.png b/bower_components/iCheck/skins/square/blue.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/blue.png rename to bower_components/iCheck/skins/square/blue.png diff --git a/public/assets/js/plugins/iCheck/square/blue@2x.png b/bower_components/iCheck/skins/square/blue@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/blue@2x.png rename to bower_components/iCheck/skins/square/blue@2x.png diff --git a/bower_components/iCheck/skins/square/green.css b/bower_components/iCheck/skins/square/green.css new file mode 100644 index 0000000000..23f149bdc3 --- /dev/null +++ b/bower_components/iCheck/skins/square/green.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, green +----------------------------------- */ +.icheckbox_square-green, +.iradio_square-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-green { + background-position: 0 0; +} + .icheckbox_square-green.hover { + background-position: -24px 0; + } + .icheckbox_square-green.checked { + background-position: -48px 0; + } + .icheckbox_square-green.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-green.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-green { + background-position: -120px 0; +} + .iradio_square-green.hover { + background-position: -144px 0; + } + .iradio_square-green.checked { + background-position: -168px 0; + } + .iradio_square-green.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-green.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-green, + .iradio_square-green { + background-image: url(green@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/green.png b/bower_components/iCheck/skins/square/green.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/green.png rename to bower_components/iCheck/skins/square/green.png diff --git a/public/assets/js/plugins/iCheck/square/green@2x.png b/bower_components/iCheck/skins/square/green@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/green@2x.png rename to bower_components/iCheck/skins/square/green@2x.png diff --git a/bower_components/iCheck/skins/square/grey.css b/bower_components/iCheck/skins/square/grey.css new file mode 100644 index 0000000000..909db1ab74 --- /dev/null +++ b/bower_components/iCheck/skins/square/grey.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, grey +----------------------------------- */ +.icheckbox_square-grey, +.iradio_square-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-grey { + background-position: 0 0; +} + .icheckbox_square-grey.hover { + background-position: -24px 0; + } + .icheckbox_square-grey.checked { + background-position: -48px 0; + } + .icheckbox_square-grey.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-grey.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-grey { + background-position: -120px 0; +} + .iradio_square-grey.hover { + background-position: -144px 0; + } + .iradio_square-grey.checked { + background-position: -168px 0; + } + .iradio_square-grey.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-grey.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-grey, + .iradio_square-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/grey.png b/bower_components/iCheck/skins/square/grey.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/grey.png rename to bower_components/iCheck/skins/square/grey.png diff --git a/public/assets/js/plugins/iCheck/square/grey@2x.png b/bower_components/iCheck/skins/square/grey@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/grey@2x.png rename to bower_components/iCheck/skins/square/grey@2x.png diff --git a/bower_components/iCheck/skins/square/orange.css b/bower_components/iCheck/skins/square/orange.css new file mode 100644 index 0000000000..c6e5892d68 --- /dev/null +++ b/bower_components/iCheck/skins/square/orange.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, orange +----------------------------------- */ +.icheckbox_square-orange, +.iradio_square-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-orange { + background-position: 0 0; +} + .icheckbox_square-orange.hover { + background-position: -24px 0; + } + .icheckbox_square-orange.checked { + background-position: -48px 0; + } + .icheckbox_square-orange.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-orange.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-orange { + background-position: -120px 0; +} + .iradio_square-orange.hover { + background-position: -144px 0; + } + .iradio_square-orange.checked { + background-position: -168px 0; + } + .iradio_square-orange.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-orange.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-orange, + .iradio_square-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/orange.png b/bower_components/iCheck/skins/square/orange.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/orange.png rename to bower_components/iCheck/skins/square/orange.png diff --git a/public/assets/js/plugins/iCheck/square/orange@2x.png b/bower_components/iCheck/skins/square/orange@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/orange@2x.png rename to bower_components/iCheck/skins/square/orange@2x.png diff --git a/bower_components/iCheck/skins/square/pink.css b/bower_components/iCheck/skins/square/pink.css new file mode 100644 index 0000000000..bdab9c7916 --- /dev/null +++ b/bower_components/iCheck/skins/square/pink.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, pink +----------------------------------- */ +.icheckbox_square-pink, +.iradio_square-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-pink { + background-position: 0 0; +} + .icheckbox_square-pink.hover { + background-position: -24px 0; + } + .icheckbox_square-pink.checked { + background-position: -48px 0; + } + .icheckbox_square-pink.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-pink.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-pink { + background-position: -120px 0; +} + .iradio_square-pink.hover { + background-position: -144px 0; + } + .iradio_square-pink.checked { + background-position: -168px 0; + } + .iradio_square-pink.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-pink.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-pink, + .iradio_square-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/pink.png b/bower_components/iCheck/skins/square/pink.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/pink.png rename to bower_components/iCheck/skins/square/pink.png diff --git a/public/assets/js/plugins/iCheck/square/pink@2x.png b/bower_components/iCheck/skins/square/pink@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/pink@2x.png rename to bower_components/iCheck/skins/square/pink@2x.png diff --git a/bower_components/iCheck/skins/square/purple.css b/bower_components/iCheck/skins/square/purple.css new file mode 100644 index 0000000000..4c291b412e --- /dev/null +++ b/bower_components/iCheck/skins/square/purple.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, purple +----------------------------------- */ +.icheckbox_square-purple, +.iradio_square-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-purple { + background-position: 0 0; +} + .icheckbox_square-purple.hover { + background-position: -24px 0; + } + .icheckbox_square-purple.checked { + background-position: -48px 0; + } + .icheckbox_square-purple.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-purple.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-purple { + background-position: -120px 0; +} + .iradio_square-purple.hover { + background-position: -144px 0; + } + .iradio_square-purple.checked { + background-position: -168px 0; + } + .iradio_square-purple.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-purple.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-purple, + .iradio_square-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/purple.png b/bower_components/iCheck/skins/square/purple.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/purple.png rename to bower_components/iCheck/skins/square/purple.png diff --git a/public/assets/js/plugins/iCheck/square/purple@2x.png b/bower_components/iCheck/skins/square/purple@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/purple@2x.png rename to bower_components/iCheck/skins/square/purple@2x.png diff --git a/bower_components/iCheck/skins/square/red.css b/bower_components/iCheck/skins/square/red.css new file mode 100644 index 0000000000..7341bc62f2 --- /dev/null +++ b/bower_components/iCheck/skins/square/red.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, red +----------------------------------- */ +.icheckbox_square-red, +.iradio_square-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-red { + background-position: 0 0; +} + .icheckbox_square-red.hover { + background-position: -24px 0; + } + .icheckbox_square-red.checked { + background-position: -48px 0; + } + .icheckbox_square-red.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-red.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-red { + background-position: -120px 0; +} + .iradio_square-red.hover { + background-position: -144px 0; + } + .iradio_square-red.checked { + background-position: -168px 0; + } + .iradio_square-red.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-red.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-red, + .iradio_square-red { + background-image: url(red@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/red.png b/bower_components/iCheck/skins/square/red.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/red.png rename to bower_components/iCheck/skins/square/red.png diff --git a/public/assets/js/plugins/iCheck/square/red@2x.png b/bower_components/iCheck/skins/square/red@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/red@2x.png rename to bower_components/iCheck/skins/square/red@2x.png diff --git a/bower_components/iCheck/skins/square/square.css b/bower_components/iCheck/skins/square/square.css new file mode 100644 index 0000000000..fb628f9135 --- /dev/null +++ b/bower_components/iCheck/skins/square/square.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, black +----------------------------------- */ +.icheckbox_square, +.iradio_square { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(square.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square { + background-position: 0 0; +} + .icheckbox_square.hover { + background-position: -24px 0; + } + .icheckbox_square.checked { + background-position: -48px 0; + } + .icheckbox_square.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square.checked.disabled { + background-position: -96px 0; + } + +.iradio_square { + background-position: -120px 0; +} + .iradio_square.hover { + background-position: -144px 0; + } + .iradio_square.checked { + background-position: -168px 0; + } + .iradio_square.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square, + .iradio_square { + background-image: url(square@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/square.png b/bower_components/iCheck/skins/square/square.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/square.png rename to bower_components/iCheck/skins/square/square.png diff --git a/public/assets/js/plugins/iCheck/square/square@2x.png b/bower_components/iCheck/skins/square/square@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/square@2x.png rename to bower_components/iCheck/skins/square/square@2x.png diff --git a/bower_components/iCheck/skins/square/yellow.css b/bower_components/iCheck/skins/square/yellow.css new file mode 100644 index 0000000000..23b11231e4 --- /dev/null +++ b/bower_components/iCheck/skins/square/yellow.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, yellow +----------------------------------- */ +.icheckbox_square-yellow, +.iradio_square-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-yellow { + background-position: 0 0; +} + .icheckbox_square-yellow.hover { + background-position: -24px 0; + } + .icheckbox_square-yellow.checked { + background-position: -48px 0; + } + .icheckbox_square-yellow.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-yellow.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-yellow { + background-position: -120px 0; +} + .iradio_square-yellow.hover { + background-position: -144px 0; + } + .iradio_square-yellow.checked { + background-position: -168px 0; + } + .iradio_square-yellow.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-yellow.checked.disabled { + background-position: -216px 0; + } + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-yellow, + .iradio_square-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/public/assets/js/plugins/iCheck/square/yellow.png b/bower_components/iCheck/skins/square/yellow.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/yellow.png rename to bower_components/iCheck/skins/square/yellow.png diff --git a/public/assets/js/plugins/iCheck/square/yellow@2x.png b/bower_components/iCheck/skins/square/yellow@2x.png old mode 100755 new mode 100644 similarity index 100% rename from public/assets/js/plugins/iCheck/square/yellow@2x.png rename to bower_components/iCheck/skins/square/yellow@2x.png diff --git a/bower_components/jquery-slimscroll/.bower.json b/bower_components/jquery-slimscroll/.bower.json new file mode 100644 index 0000000000..94e33a043f --- /dev/null +++ b/bower_components/jquery-slimscroll/.bower.json @@ -0,0 +1,59 @@ +{ + "name": "jquery-slimscroll", + "version": "1.3.8", + "description": "slimScroll is a small jQuery plugin that transforms any div into a scrollable area. slimScroll doesn't occupy any visual space as it only appears on a user initiated mouse-over.", + "keywords": [ + "scrollbar", + "scroll", + "slimscroll", + "scrollable", + "scrolling", + "scroller", + "ui", + "jquery-plugin", + "ecosystem:jquery" + ], + "homepage": "http://rocha.la/jQuery-slimScroll/", + "authors": [ + { + "name": "Piotr Rochala", + "homepage": "http://rocha.la/" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/rochal/jQuery-slimScroll.git" + }, + "main": [ + "jquery.slimscroll.js", + "jquery.slimscroll.min.js" + ], + "licenses": [ + { + "type": "MIT", + "url": "http://www.opensource.org/licenses/mit-license.php" + }, + { + "type": "GPL", + "url": "http://www.opensource.org/licenses/gpl-license.php" + } + ], + "moduleType": [], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "_release": "1.3.8", + "_resolution": { + "type": "version", + "tag": "v1.3.8", + "commit": "cf39d364e777ef95574c30c42d3b85cb2bf325d3" + }, + "_source": "https://github.com/rochal/jQuery-slimScroll.git", + "_target": "^1.3.8", + "_originalSource": "slimscroll", + "_direct": true +} \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/README.md b/bower_components/jquery-slimscroll/README.md new file mode 100644 index 0000000000..bc9034769e --- /dev/null +++ b/bower_components/jquery-slimscroll/README.md @@ -0,0 +1,8 @@ +# What is slimScroll? + +slimScroll is a small jQuery plugin that transforms any div into a scrollable area with a nice scrollbar - similar to the one Facebook and Google started using in their products recently. slimScroll doesn't occupy any visual space as it only appears on a user initiated mouse-over. User can drag the scrollbar or use mouse-wheel to change the scroll value. + +Demo and deocumentation available here: [jQuery slimScroll docs](http://rocha.la/jQuery-slimScroll) + +Copyright (c) 2011 Piotr Rochala (http://rocha.la) +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/bower.json b/bower_components/jquery-slimscroll/bower.json new file mode 100644 index 0000000000..831eb3245e --- /dev/null +++ b/bower_components/jquery-slimscroll/bower.json @@ -0,0 +1,46 @@ +{ + "name": "jquery-slimscroll", + "version": "1.3.8", + "description": "slimScroll is a small jQuery plugin that transforms any div into a scrollable area. slimScroll doesn't occupy any visual space as it only appears on a user initiated mouse-over.", + "keywords": [ + "scrollbar", + "scroll", + "slimscroll", + "scrollable", + "scrolling", + "scroller", + "ui", + "jquery-plugin", + "ecosystem:jquery" + ], + "homepage": "http://rocha.la/jQuery-slimScroll/", + "authors": [ + { "name": "Piotr Rochala", "homepage": "http://rocha.la/" } + ], + "repository": { + "type": "git", + "url": "https://github.com/rochal/jQuery-slimScroll.git" + }, + "main": [ + "jquery.slimscroll.js", + "jquery.slimscroll.min.js" + ], + "licenses" : [ + { + "type": "MIT", + "url": "http://www.opensource.org/licenses/mit-license.php" + }, + { + "type": "GPL", + "url": "http://www.opensource.org/licenses/gpl-license.php" + } + ], + "moduleType": [], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/bower_components/jquery-slimscroll/examples/allow-page-scroll.html b/bower_components/jquery-slimscroll/examples/allow-page-scroll.html new file mode 100644 index 0000000000..b594de3217 --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/allow-page-scroll.html @@ -0,0 +1,94 @@ + + + +jquery.slimscroll - allow page scroll + + + + + + + + +Fork me on GitHub +
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      + +
      +  $('#testDiv').slimScroll();
      +
      + +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Hello!Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      + +
      +  $('#testDiv2').slimScroll({
      +      allowPageScroll: true
      +  });
      +
      + +
      ...adding height...
      +
      + + + + + + + \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/examples/chaining.html b/bower_components/jquery-slimscroll/examples/chaining.html new file mode 100644 index 0000000000..fead426c3a --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/chaining.html @@ -0,0 +1,80 @@ + + + +jquery.slimscroll - chaining + + + + + + + + +Fork me on GitHub +
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      + +
      +$('#testDiv').slimscroll({
      +  height: '250px'
      +}).parent().css({
      +  background: '#237FAD',
      +  border: '2px dashed #184055'
      +});
      +
      + + +
      + + + + + + + \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/examples/disable-fade-out.html b/bower_components/jquery-slimscroll/examples/disable-fade-out.html new file mode 100644 index 0000000000..7c8e6fa42a --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/disable-fade-out.html @@ -0,0 +1,94 @@ + + + +jquery.slimscroll - disable fade out + + + + + + + + + +Fork me on GitHub +
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      + +
      +$('#testDiv').slimscroll();
      +
      + +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      + +
      +$('#testDiv2').slimscroll({
      +  disableFadeOut: true
      +});
      +
      + +
      + + + + + + + \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/examples/dynamic-content.html b/bower_components/jquery-slimscroll/examples/dynamic-content.html new file mode 100644 index 0000000000..1ac5e5612c --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/dynamic-content.html @@ -0,0 +1,81 @@ + + + +jquery.slimscroll - dynamic content + + + + + + + + + +Fork me on GitHub +
      + + +
      +
      + +
      +  // update content every second
      +  setInterval(function(){
      +    var el = $('<div></div>').html('#' + $('#testDiv').children().length)
      +            .css({ padding: '3px', border: '1px solid #ccc', margin: '5px' });
      +    $('#testDiv').append(el);
      +
      +    // update slimscroll every time content changes
      +    $('#testDiv').slimscroll();
      +  }, 1000);
      +
      +  $('#testDiv').slimscroll({
      +    alwaysVisible: true,
      +    height: 150
      +  });
      +  
      + + + +
      + + + + + + + \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/examples/height-width.html b/bower_components/jquery-slimscroll/examples/height-width.html new file mode 100644 index 0000000000..4b006b0bcb --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/height-width.html @@ -0,0 +1,125 @@ + + + +jquery.slimscroll - height / width + + + + + + + + + +Fork me on GitHub +
      +
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      +
      + +
      +$('#testDiv').slimscroll({
      +  height: 'auto'
      +});
      +
      + +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      + +
      +$('#testDiv2').slimscroll({
      +  height: '100px',
      +  width: '300px'
      +});
      +
      + +
      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.

      +

      Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

      +

      Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.

      +

      Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.

      +

      Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.

      +
      + +
      +$('#testDiv3').slimscroll();
      +
      + +
      + + + + + + + \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/examples/index.html b/bower_components/jquery-slimscroll/examples/index.html new file mode 100644 index 0000000000..890dd716e1 --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/index.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.css b/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.css new file mode 100644 index 0000000000..400fd74284 --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.css @@ -0,0 +1,52 @@ +/* Pretty printing styles. Used with prettify.js. */ + +/* SPAN elements with the classes below are added by prettyprint. */ +.pln { color: #000 } /* plain text */ + +@media screen { + .str { color: #080 } /* string content */ + .kwd { color: #008 } /* a keyword */ + .com { color: #800 } /* a comment */ + .typ { color: #606 } /* a type name */ + .lit { color: #066 } /* a literal value */ + /* punctuation, lisp open bracket, lisp close bracket */ + .pun, .opn, .clo { color: #660 } + .tag { color: #008 } /* a markup tag name */ + .atn { color: #606 } /* a markup attribute name */ + .atv { color: #080 } /* a markup attribute value */ + .dec, .var { color: #606 } /* a declaration; a variable name */ + .fun { color: red } /* a function name */ +} + +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { color: #060 } + .kwd { color: #006; font-weight: bold } + .com { color: #600; font-style: italic } + .typ { color: #404; font-weight: bold } + .lit { color: #044 } + .pun, .opn, .clo { color: #440 } + .tag { color: #006; font-weight: bold } + .atn { color: #404 } + .atv { color: #060 } +} + +/* Put a border around prettyprinted code snippets. */ +pre.prettyprint { padding: 2px; border: 1px solid #888 } + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L5, +li.L6, +li.L7, +li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { background: #eee } diff --git a/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.js b/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.js new file mode 100644 index 0000000000..037c26da4a --- /dev/null +++ b/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.js @@ -0,0 +1,1477 @@ +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview + * some functions for browser-side pretty printing of code contained in html. + * + *

      + * For a fairly comprehensive set of languages see the + * README + * file that came with this source. At a minimum, the lexer should work on a + * number of languages including C and friends, Java, Python, Bash, SQL, HTML, + * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk + * and a subset of Perl, but, because of commenting conventions, doesn't work on + * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. + *

      + * Usage:

        + *
      1. include this source file in an html page via + * {@code } + *
      2. define style rules. See the example page for examples. + *
      3. mark the {@code
        } and {@code } tags in your source with
        + *    {@code class=prettyprint.}
        + *    You can also use the (html deprecated) {@code } tag, but the pretty
        + *    printer needs to do more substantial DOM manipulations to support that, so
        + *    some css styles may not be preserved.
        + * </ol>
        + * That's it.  I wanted to keep the API as simple as possible, so there's no
        + * need to specify which language the code is in, but if you wish, you can add
        + * another class to the {@code <pre>} or {@code <code>} element to specify the
        + * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
        + * starts with "lang-" followed by a file extension, specifies the file type.
        + * See the "lang-*.js" files in this directory for code that implements
        + * per-language file handlers.
        + * <p>
        + * Change log:<br>
        + * cbeust, 2006/08/22
        + * <blockquote>
        + *   Java annotations (start with "@") are now captured as literals ("lit")
        + * </blockquote>
        + * @requires console
        + */
        +
        +// JSLint declarations
        +/*global console, document, navigator, setTimeout, window */
        +
        +/**
        + * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
        + * UI events.
        + * If set to {@code false}, {@code prettyPrint()} is synchronous.
        + */
        +window['PR_SHOULD_USE_CONTINUATION'] = true;
        +
        +(function () {
        +  // Keyword lists for various languages.
        +  // We use things that coerce to strings to make them compact when minified
        +  // and to defeat aggressive optimizers that fold large string constants.
        +  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
        +  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
        +      "double,enum,extern,float,goto,int,long,register,short,signed,sizeof," +
        +      "static,struct,switch,typedef,union,unsigned,void,volatile"];
        +  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
        +      "new,operator,private,protected,public,this,throw,true,try,typeof"];
        +  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
        +      "concept,concept_map,const_cast,constexpr,decltype," +
        +      "dynamic_cast,explicit,export,friend,inline,late_check," +
        +      "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
        +      "template,typeid,typename,using,virtual,where"];
        +  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
        +      "abstract,boolean,byte,extends,final,finally,implements,import," +
        +      "instanceof,null,native,package,strictfp,super,synchronized,throws," +
        +      "transient"];
        +  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
        +      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
        +      "fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock," +
        +      "object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed," +
        +      "stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];
        +  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
        +      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
        +      "true,try,unless,until,when,while,yes";
        +  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
        +      "debugger,eval,export,function,get,null,set,undefined,var,with," +
        +      "Infinity,NaN"];
        +  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
        +      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
        +      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
        +  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
        +      "elif,except,exec,finally,from,global,import,in,is,lambda," +
        +      "nonlocal,not,or,pass,print,raise,try,with,yield," +
        +      "False,True,None"];
        +  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
        +      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
        +      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
        +      "BEGIN,END"];
        +  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
        +      "function,in,local,set,then,until"];
        +  var ALL_KEYWORDS = [
        +      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
        +      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
        +  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;
        +
        +  // token style names.  correspond to css classes
        +  /**
        +   * token style for a string literal
        +   * @const
        +   */
        +  var PR_STRING = 'str';
        +  /**
        +   * token style for a keyword
        +   * @const
        +   */
        +  var PR_KEYWORD = 'kwd';
        +  /**
        +   * token style for a comment
        +   * @const
        +   */
        +  var PR_COMMENT = 'com';
        +  /**
        +   * token style for a type
        +   * @const
        +   */
        +  var PR_TYPE = 'typ';
        +  /**
        +   * token style for a literal value.  e.g. 1, null, true.
        +   * @const
        +   */
        +  var PR_LITERAL = 'lit';
        +  /**
        +   * token style for a punctuation string.
        +   * @const
        +   */
        +  var PR_PUNCTUATION = 'pun';
        +  /**
        +   * token style for a punctuation string.
        +   * @const
        +   */
        +  var PR_PLAIN = 'pln';
        +
        +  /**
        +   * token style for an sgml tag.
        +   * @const
        +   */
        +  var PR_TAG = 'tag';
        +  /**
        +   * token style for a markup declaration such as a DOCTYPE.
        +   * @const
        +   */
        +  var PR_DECLARATION = 'dec';
        +  /**
        +   * token style for embedded source.
        +   * @const
        +   */
        +  var PR_SOURCE = 'src';
        +  /**
        +   * token style for an sgml attribute name.
        +   * @const
        +   */
        +  var PR_ATTRIB_NAME = 'atn';
        +  /**
        +   * token style for an sgml attribute value.
        +   * @const
        +   */
        +  var PR_ATTRIB_VALUE = 'atv';
        +
        +  /**
        +   * A class that indicates a section of markup that is not code, e.g. to allow
        +   * embedding of line numbers within code listings.
        +   * @const
        +   */
        +  var PR_NOCODE = 'nocode';
        +
        +
        +
        +/**
        + * A set of tokens that can precede a regular expression literal in
        + * javascript
        + * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
        + * has the full list, but I've removed ones that might be problematic when
        + * seen in languages that don't support regular expression literals.
        + *
        + * <p>Specifically, I've removed any keywords that can't precede a regexp
        + * literal in a syntactically legal javascript program, and I've removed the
        + * "in" keyword since it's not a keyword in many languages, and might be used
        + * as a count of inches.
        + *
        + * <p>The link a above does not accurately describe EcmaScript rules since
        + * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
        + * very well in practice.
        + *
        + * @private
        + * @const
        + */
        +var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
        +
        +// CAVEAT: this does not properly handle the case where a regular
        +// expression immediately follows another since a regular expression may
        +// have flags for case-sensitivity and the like.  Having regexp tokens
        +// adjacent is not valid in any language I'm aware of, so I'm punting.
        +// TODO: maybe style special characters inside a regexp as punctuation.
        +
        +
        +  /**
        +   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
        +   * matches the union of the sets of strings matched by the input RegExp.
        +   * Since it matches globally, if the input strings have a start-of-input
        +   * anchor (/^.../), it is ignored for the purposes of unioning.
        +   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
        +   * @return {RegExp} a global regex.
        +   */
        +  function combinePrefixPatterns(regexs) {
        +    var capturedGroupIndex = 0;
        +  
        +    var needToFoldCase = false;
        +    var ignoreCase = false;
        +    for (var i = 0, n = regexs.length; i < n; ++i) {
        +      var regex = regexs[i];
        +      if (regex.ignoreCase) {
        +        ignoreCase = true;
        +      } else if (/[a-z]/i.test(regex.source.replace(
        +                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
        +        needToFoldCase = true;
        +        ignoreCase = false;
        +        break;
        +      }
        +    }
        +  
        +    var escapeCharToCodeUnit = {
        +      'b': 8,
        +      't': 9,
        +      'n': 0xa,
        +      'v': 0xb,
        +      'f': 0xc,
        +      'r': 0xd
        +    };
        +  
        +    function decodeEscape(charsetPart) {
        +      var cc0 = charsetPart.charCodeAt(0);
        +      if (cc0 !== 92 /* \\ */) {
        +        return cc0;
        +      }
        +      var c1 = charsetPart.charAt(1);
        +      cc0 = escapeCharToCodeUnit[c1];
        +      if (cc0) {
        +        return cc0;
        +      } else if ('0' <= c1 && c1 <= '7') {
        +        return parseInt(charsetPart.substring(1), 8);
        +      } else if (c1 === 'u' || c1 === 'x') {
        +        return parseInt(charsetPart.substring(2), 16);
        +      } else {
        +        return charsetPart.charCodeAt(1);
        +      }
        +    }
        +  
        +    function encodeEscape(charCode) {
        +      if (charCode < 0x20) {
        +        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
        +      }
        +      var ch = String.fromCharCode(charCode);
        +      if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
        +        ch = '\\' + ch;
        +      }
        +      return ch;
        +    }
        +  
        +    function caseFoldCharset(charSet) {
        +      var charsetParts = charSet.substring(1, charSet.length - 1).match(
        +          new RegExp(
        +              '\\\\u[0-9A-Fa-f]{4}'
        +              + '|\\\\x[0-9A-Fa-f]{2}'
        +              + '|\\\\[0-3][0-7]{0,2}'
        +              + '|\\\\[0-7]{1,2}'
        +              + '|\\\\[\\s\\S]'
        +              + '|-'
        +              + '|[^-\\\\]',
        +              'g'));
        +      var groups = [];
        +      var ranges = [];
        +      var inverse = charsetParts[0] === '^';
        +      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
        +        var p = charsetParts[i];
        +        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
        +          groups.push(p);
        +        } else {
        +          var start = decodeEscape(p);
        +          var end;
        +          if (i + 2 < n && '-' === charsetParts[i + 1]) {
        +            end = decodeEscape(charsetParts[i + 2]);
        +            i += 2;
        +          } else {
        +            end = start;
        +          }
        +          ranges.push([start, end]);
        +          // If the range might intersect letters, then expand it.
        +          // This case handling is too simplistic.
        +          // It does not deal with non-latin case folding.
        +          // It works for latin source code identifiers though.
        +          if (!(end < 65 || start > 122)) {
        +            if (!(end < 65 || start > 90)) {
        +              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
        +            }
        +            if (!(end < 97 || start > 122)) {
        +              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
        +            }
        +          }
        +        }
        +      }
        +  
        +      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
        +      // -> [[1, 12], [14, 14], [16, 17]]
        +      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
        +      var consolidatedRanges = [];
        +      var lastRange = [NaN, NaN];
        +      for (var i = 0; i < ranges.length; ++i) {
        +        var range = ranges[i];
        +        if (range[0] <= lastRange[1] + 1) {
        +          lastRange[1] = Math.max(lastRange[1], range[1]);
        +        } else {
        +          consolidatedRanges.push(lastRange = range);
        +        }
        +      }
        +  
        +      var out = ['['];
        +      if (inverse) { out.push('^'); }
        +      out.push.apply(out, groups);
        +      for (var i = 0; i < consolidatedRanges.length; ++i) {
        +        var range = consolidatedRanges[i];
        +        out.push(encodeEscape(range[0]));
        +        if (range[1] > range[0]) {
        +          if (range[1] + 1 > range[0]) { out.push('-'); }
        +          out.push(encodeEscape(range[1]));
        +        }
        +      }
        +      out.push(']');
        +      return out.join('');
        +    }
        +  
        +    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
        +      // Split into character sets, escape sequences, punctuation strings
        +      // like ('(', '(?:', ')', '^'), and runs of characters that do not
        +      // include any of the above.
        +      var parts = regex.source.match(
        +          new RegExp(
        +              '(?:'
        +              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
        +              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
        +              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
        +              + '|\\\\[0-9]+'  // a back-reference or octal escape
        +              + '|\\\\[^ux0-9]'  // other escape sequence
        +              + '|\\(\\?[:!=]'  // start of a non-capturing group
        +              + '|[\\(\\)\\^]'  // start/emd of a group, or line start
        +              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
        +              + ')',
        +              'g'));
        +      var n = parts.length;
        +  
        +      // Maps captured group numbers to the number they will occupy in
        +      // the output or to -1 if that has not been determined, or to
        +      // undefined if they need not be capturing in the output.
        +      var capturedGroups = [];
        +  
        +      // Walk over and identify back references to build the capturedGroups
        +      // mapping.
        +      for (var i = 0, groupIndex = 0; i < n; ++i) {
        +        var p = parts[i];
        +        if (p === '(') {
        +          // groups are 1-indexed, so max group index is count of '('
        +          ++groupIndex;
        +        } else if ('\\' === p.charAt(0)) {
        +          var decimalValue = +p.substring(1);
        +          if (decimalValue && decimalValue <= groupIndex) {
        +            capturedGroups[decimalValue] = -1;
        +          }
        +        }
        +      }
        +  
        +      // Renumber groups and reduce capturing groups to non-capturing groups
        +      // where possible.
        +      for (var i = 1; i < capturedGroups.length; ++i) {
        +        if (-1 === capturedGroups[i]) {
        +          capturedGroups[i] = ++capturedGroupIndex;
        +        }
        +      }
        +      for (var i = 0, groupIndex = 0; i < n; ++i) {
        +        var p = parts[i];
        +        if (p === '(') {
        +          ++groupIndex;
        +          if (capturedGroups[groupIndex] === undefined) {
        +            parts[i] = '(?:';
        +          }
        +        } else if ('\\' === p.charAt(0)) {
        +          var decimalValue = +p.substring(1);
        +          if (decimalValue && decimalValue <= groupIndex) {
        +            parts[i] = '\\' + capturedGroups[groupIndex];
        +          }
        +        }
        +      }
        +  
        +      // Remove any prefix anchors so that the output will match anywhere.
        +      // ^^ really does mean an anchored match though.
        +      for (var i = 0, groupIndex = 0; i < n; ++i) {
        +        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
        +      }
        +  
        +      // Expand letters to groups to handle mixing of case-sensitive and
        +      // case-insensitive patterns if necessary.
        +      if (regex.ignoreCase && needToFoldCase) {
        +        for (var i = 0; i < n; ++i) {
        +          var p = parts[i];
        +          var ch0 = p.charAt(0);
        +          if (p.length >= 2 && ch0 === '[') {
        +            parts[i] = caseFoldCharset(p);
        +          } else if (ch0 !== '\\') {
        +            // TODO: handle letters in numeric escapes.
        +            parts[i] = p.replace(
        +                /[a-zA-Z]/g,
        +                function (ch) {
        +                  var cc = ch.charCodeAt(0);
        +                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
        +                });
        +          }
        +        }
        +      }
        +  
        +      return parts.join('');
        +    }
        +  
        +    var rewritten = [];
        +    for (var i = 0, n = regexs.length; i < n; ++i) {
        +      var regex = regexs[i];
        +      if (regex.global || regex.multiline) { throw new Error('' + regex); }
        +      rewritten.push(
        +          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
        +    }
        +  
        +    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
        +  }
        +
        +
        +  /**
        +   * Split markup into a string of source code and an array mapping ranges in
        +   * that string to the text nodes in which they appear.
        +   *
        +   * <p>
        +   * The HTML DOM structure:</p>
        +   * <pre>
        +   * (Element   "p"
        +   *   (Element "b"
        +   *     (Text  "print "))       ; #1
        +   *   (Text    "'Hello '")      ; #2
        +   *   (Element "br")            ; #3
        +   *   (Text    "  + 'World';")) ; #4
        +   * </pre>
        +   * <p>
        +   * corresponds to the HTML
        +   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
        +   *
        +   * <p>
        +   * It will produce the output:</p>
        +   * <pre>
        +   * {
        +   *   sourceCode: "print 'Hello '\n  + 'World';",
        +   *   //                 1         2
        +   *   //       012345678901234 5678901234567
        +   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
        +   * }
        +   * </pre>
        +   * <p>
        +   * where #1 is a reference to the {@code "print "} text node above, and so
        +   * on for the other text nodes.
        +   * </p>
        +   *
        +   * <p>
        +   * The {@code} spans array is an array of pairs.  Even elements are the start
        +   * indices of substrings, and odd elements are the text nodes (or BR elements)
        +   * that contain the text for those substrings.
        +   * Substrings continue until the next index or the end of the source.
        +   * </p>
        +   *
        +   * @param {Node} node an HTML DOM subtree containing source-code.
        +   * @return {Object} source code and the text nodes in which they occur.
        +   */
        +  function extractSourceSpans(node) {
        +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
        +  
        +    var chunks = [];
        +    var length = 0;
        +    var spans = [];
        +    var k = 0;
        +  
        +    var whitespace;
        +    if (node.currentStyle) {
        +      whitespace = node.currentStyle.whiteSpace;
        +    } else if (window.getComputedStyle) {
        +      whitespace = document.defaultView.getComputedStyle(node, null)
        +          .getPropertyValue('white-space');
        +    }
        +    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
        +  
        +    function walk(node) {
        +      switch (node.nodeType) {
        +        case 1:  // Element
        +          if (nocode.test(node.className)) { return; }
        +          for (var child = node.firstChild; child; child = child.nextSibling) {
        +            walk(child);
        +          }
        +          var nodeName = node.nodeName;
        +          if ('BR' === nodeName || 'LI' === nodeName) {
        +            chunks[k] = '\n';
        +            spans[k << 1] = length++;
        +            spans[(k++ << 1) | 1] = node;
        +          }
        +          break;
        +        case 3: case 4:  // Text
        +          var text = node.nodeValue;
        +          if (text.length) {
        +            if (!isPreformatted) {
        +              text = text.replace(/[ \t\r\n]+/g, ' ');
        +            } else {
        +              text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
        +            }
        +            // TODO: handle tabs here?
        +            chunks[k] = text;
        +            spans[k << 1] = length;
        +            length += text.length;
        +            spans[(k++ << 1) | 1] = node;
        +          }
        +          break;
        +      }
        +    }
        +  
        +    walk(node);
        +  
        +    return {
        +      sourceCode: chunks.join('').replace(/\n$/, ''),
        +      spans: spans
        +    };
        +  }
        +
        +
        +  /**
        +   * Apply the given language handler to sourceCode and add the resulting
        +   * decorations to out.
        +   * @param {number} basePos the index of sourceCode within the chunk of source
        +   *    whose decorations are already present on out.
        +   */
        +  function appendDecorations(basePos, sourceCode, langHandler, out) {
        +    if (!sourceCode) { return; }
        +    var job = {
        +      sourceCode: sourceCode,
        +      basePos: basePos
        +    };
        +    langHandler(job);
        +    out.push.apply(out, job.decorations);
        +  }
        +
        +  var notWs = /\S/;
        +
        +  /**
        +   * Given an element, if it contains only one child element and any text nodes
        +   * it contains contain only space characters, return the sole child element.
        +   * Otherwise returns undefined.
        +   * <p>
        +   * This is meant to return the CODE element in {@code <pre><code ...>} when
        +   * there is a single child element that contains all the non-space textual
        +   * content, but not to return anything where there are multiple child elements
        +   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
        +   * is textual content.
        +   */
        +  function childContentWrapper(element) {
        +    var wrapper = undefined;
        +    for (var c = element.firstChild; c; c = c.nextSibling) {
        +      var type = c.nodeType;
        +      wrapper = (type === 1)  // Element Node
        +          ? (wrapper ? element : c)
        +          : (type === 3)  // Text Node
        +          ? (notWs.test(c.nodeValue) ? element : wrapper)
        +          : wrapper;
        +    }
        +    return wrapper === element ? undefined : wrapper;
        +  }
        +
        +  /** Given triples of [style, pattern, context] returns a lexing function,
        +    * The lexing function interprets the patterns to find token boundaries and
        +    * returns a decoration list of the form
        +    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
        +    * where index_n is an index into the sourceCode, and style_n is a style
        +    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
        +    * all characters in sourceCode[index_n-1:index_n].
        +    *
        +    * The stylePatterns is a list whose elements have the form
        +    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
        +    *
        +    * Style is a style constant like PR_PLAIN, or can be a string of the
        +    * form 'lang-FOO', where FOO is a language extension describing the
        +    * language of the portion of the token in $1 after pattern executes.
        +    * E.g., if style is 'lang-lisp', and group 1 contains the text
        +    * '(hello (world))', then that portion of the token will be passed to the
        +    * registered lisp handler for formatting.
        +    * The text before and after group 1 will be restyled using this decorator
        +    * so decorators should take care that this doesn't result in infinite
        +    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
        +    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
        +    * '<script>foo()<\/script>', which would cause the current decorator to
        +    * be called with '<script>' which would not match the same rule since
        +    * group 1 must not be empty, so it would be instead styled as PR_TAG by
        +    * the generic tag rule.  The handler registered for the 'js' extension would
        +    * then be called with 'foo()', and finally, the current decorator would
        +    * be called with '<\/script>' which would not match the original rule and
        +    * so the generic tag rule would identify it as a tag.
        +    *
        +    * Pattern must only match prefixes, and if it matches a prefix, then that
        +    * match is considered a token with the same style.
        +    *
        +    * Context is applied to the last non-whitespace, non-comment token
        +    * recognized.
        +    *
        +    * Shortcut is an optional string of characters, any of which, if the first
        +    * character, gurantee that this pattern and only this pattern matches.
        +    *
        +    * @param {Array} shortcutStylePatterns patterns that always start with
        +    *   a known character.  Must have a shortcut string.
        +    * @param {Array} fallthroughStylePatterns patterns that will be tried in
        +    *   order if the shortcut ones fail.  May have shortcuts.
        +    *
        +    * @return {function (Object)} a
        +    *   function that takes source code and returns a list of decorations.
        +    */
        +  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
        +    var shortcuts = {};
        +    var tokenizer;
        +    (function () {
        +      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
        +      var allRegexs = [];
        +      var regexKeys = {};
        +      for (var i = 0, n = allPatterns.length; i < n; ++i) {
        +        var patternParts = allPatterns[i];
        +        var shortcutChars = patternParts[3];
        +        if (shortcutChars) {
        +          for (var c = shortcutChars.length; --c >= 0;) {
        +            shortcuts[shortcutChars.charAt(c)] = patternParts;
        +          }
        +        }
        +        var regex = patternParts[1];
        +        var k = '' + regex;
        +        if (!regexKeys.hasOwnProperty(k)) {
        +          allRegexs.push(regex);
        +          regexKeys[k] = null;
        +        }
        +      }
        +      allRegexs.push(/[\0-\uffff]/);
        +      tokenizer = combinePrefixPatterns(allRegexs);
        +    })();
        +
        +    var nPatterns = fallthroughStylePatterns.length;
        +
        +    /**
        +     * Lexes job.sourceCode and produces an output array job.decorations of
        +     * style classes preceded by the position at which they start in
        +     * job.sourceCode in order.
        +     *
        +     * @param {Object} job an object like <pre>{
        +     *    sourceCode: {string} sourceText plain text,
        +     *    basePos: {int} position of job.sourceCode in the larger chunk of
        +     *        sourceCode.
        +     * }</pre>
        +     */
        +    var decorate = function (job) {
        +      var sourceCode = job.sourceCode, basePos = job.basePos;
        +      /** Even entries are positions in source in ascending order.  Odd enties
        +        * are style markers (e.g., PR_COMMENT) that run from that position until
        +        * the end.
        +        * @type {Array.<number|string>}
        +        */
        +      var decorations = [basePos, PR_PLAIN];
        +      var pos = 0;  // index into sourceCode
        +      var tokens = sourceCode.match(tokenizer) || [];
        +      var styleCache = {};
        +
        +      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
        +        var token = tokens[ti];
        +        var style = styleCache[token];
        +        var match = void 0;
        +
        +        var isEmbedded;
        +        if (typeof style === 'string') {
        +          isEmbedded = false;
        +        } else {
        +          var patternParts = shortcuts[token.charAt(0)];
        +          if (patternParts) {
        +            match = token.match(patternParts[1]);
        +            style = patternParts[0];
        +          } else {
        +            for (var i = 0; i < nPatterns; ++i) {
        +              patternParts = fallthroughStylePatterns[i];
        +              match = token.match(patternParts[1]);
        +              if (match) {
        +                style = patternParts[0];
        +                break;
        +              }
        +            }
        +
        +            if (!match) {  // make sure that we make progress
        +              style = PR_PLAIN;
        +            }
        +          }
        +
        +          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
        +          if (isEmbedded && !(match && typeof match[1] === 'string')) {
        +            isEmbedded = false;
        +            style = PR_SOURCE;
        +          }
        +
        +          if (!isEmbedded) { styleCache[token] = style; }
        +        }
        +
        +        var tokenStart = pos;
        +        pos += token.length;
        +
        +        if (!isEmbedded) {
        +          decorations.push(basePos + tokenStart, style);
        +        } else {  // Treat group 1 as an embedded block of source code.
        +          var embeddedSource = match[1];
        +          var embeddedSourceStart = token.indexOf(embeddedSource);
        +          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
        +          if (match[2]) {
        +            // If embeddedSource can be blank, then it would match at the
        +            // beginning which would cause us to infinitely recurse on the
        +            // entire token, so we catch the right context in match[2].
        +            embeddedSourceEnd = token.length - match[2].length;
        +            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
        +          }
        +          var lang = style.substring(5);
        +          // Decorate the left of the embedded source
        +          appendDecorations(
        +              basePos + tokenStart,
        +              token.substring(0, embeddedSourceStart),
        +              decorate, decorations);
        +          // Decorate the embedded source
        +          appendDecorations(
        +              basePos + tokenStart + embeddedSourceStart,
        +              embeddedSource,
        +              langHandlerForExtension(lang, embeddedSource),
        +              decorations);
        +          // Decorate the right of the embedded section
        +          appendDecorations(
        +              basePos + tokenStart + embeddedSourceEnd,
        +              token.substring(embeddedSourceEnd),
        +              decorate, decorations);
        +        }
        +      }
        +      job.decorations = decorations;
        +    };
        +    return decorate;
        +  }
        +
        +  /** returns a function that produces a list of decorations from source text.
        +    *
        +    * This code treats ", ', and ` as string delimiters, and \ as a string
        +    * escape.  It does not recognize perl's qq() style strings.
        +    * It has no special handling for double delimiter escapes as in basic, or
        +    * the tripled delimiters used in python, but should work on those regardless
        +    * although in those cases a single string literal may be broken up into
        +    * multiple adjacent string literals.
        +    *
        +    * It recognizes C, C++, and shell style comments.
        +    *
        +    * @param {Object} options a set of optional parameters.
        +    * @return {function (Object)} a function that examines the source code
        +    *     in the input job and builds the decoration list.
        +    */
        +  function sourceDecorator(options) {
        +    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
        +    if (options['tripleQuotedStrings']) {
        +      // '''multi-line-string''', 'single-line-string', and double-quoted
        +      shortcutStylePatterns.push(
        +          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
        +           null, '\'"']);
        +    } else if (options['multiLineStrings']) {
        +      // 'multi-line-string', "multi-line-string"
        +      shortcutStylePatterns.push(
        +          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
        +           null, '\'"`']);
        +    } else {
        +      // 'single-line-string', "single-line-string"
        +      shortcutStylePatterns.push(
        +          [PR_STRING,
        +           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
        +           null, '"\'']);
        +    }
        +    if (options['verbatimStrings']) {
        +      // verbatim-string-literal production from the C# grammar.  See issue 93.
        +      fallthroughStylePatterns.push(
        +          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
        +    }
        +    var hc = options['hashComments'];
        +    if (hc) {
        +      if (options['cStyleComments']) {
        +        if (hc > 1) {  // multiline hash comments
        +          shortcutStylePatterns.push(
        +              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
        +        } else {
        +          // Stop C preprocessor declarations at an unclosed open comment
        +          shortcutStylePatterns.push(
        +              [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
        +               null, '#']);
        +        }
        +        fallthroughStylePatterns.push(
        +            [PR_STRING,
        +             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
        +             null]);
        +      } else {
        +        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
        +      }
        +    }
        +    if (options['cStyleComments']) {
        +      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
        +      fallthroughStylePatterns.push(
        +          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
        +    }
        +    if (options['regexLiterals']) {
        +      /**
        +       * @const
        +       */
        +      var REGEX_LITERAL = (
        +          // A regular expression literal starts with a slash that is
        +          // not followed by * or / so that it is not confused with
        +          // comments.
        +          '/(?=[^/*])'
        +          // and then contains any number of raw characters,
        +          + '(?:[^/\\x5B\\x5C]'
        +          // escape sequences (\x5C),
        +          +    '|\\x5C[\\s\\S]'
        +          // or non-nesting character sets (\x5B\x5D);
        +          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
        +          // finally closed by a /.
        +          + '/');
        +      fallthroughStylePatterns.push(
        +          ['lang-regex',
        +           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
        +           ]);
        +    }
        +
        +    var types = options['types'];
        +    if (types) {
        +      fallthroughStylePatterns.push([PR_TYPE, types]);
        +    }
        +
        +    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
        +    if (keywords.length) {
        +      fallthroughStylePatterns.push(
        +          [PR_KEYWORD,
        +           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
        +           null]);
        +    }
        +
        +    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
        +    fallthroughStylePatterns.push(
        +        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
        +        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
        +        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
        +        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
        +        [PR_LITERAL,
        +         new RegExp(
        +             '^(?:'
        +             // A hex number
        +             + '0x[a-f0-9]+'
        +             // or an octal or decimal number,
        +             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
        +             // possibly in scientific notation
        +             + '(?:e[+\\-]?\\d+)?'
        +             + ')'
        +             // with an optional modifier like UL for unsigned long
        +             + '[a-z]*', 'i'),
        +         null, '0123456789'],
        +        // Don't treat escaped quotes in bash as starting strings.  See issue 144.
        +        [PR_PLAIN,       /^\\[\s\S]?/, null],
        +        [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]);
        +
        +    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
        +  }
        +
        +  var decorateSource = sourceDecorator({
        +        'keywords': ALL_KEYWORDS,
        +        'hashComments': true,
        +        'cStyleComments': true,
        +        'multiLineStrings': true,
        +        'regexLiterals': true
        +      });
        +
        +  /**
        +   * Given a DOM subtree, wraps it in a list, and puts each line into its own
        +   * list item.
        +   *
        +   * @param {Node} node modified in place.  Its content is pulled into an
        +   *     HTMLOListElement, and each line is moved into a separate list item.
        +   *     This requires cloning elements, so the input might not have unique
        +   *     IDs after numbering.
        +   */
        +  function numberLines(node, opt_startLineNum) {
        +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
        +    var lineBreak = /\r\n?|\n/;
        +  
        +    var document = node.ownerDocument;
        +  
        +    var whitespace;
        +    if (node.currentStyle) {
        +      whitespace = node.currentStyle.whiteSpace;
        +    } else if (window.getComputedStyle) {
        +      whitespace = document.defaultView.getComputedStyle(node, null)
        +          .getPropertyValue('white-space');
        +    }
        +    // If it's preformatted, then we need to split lines on line breaks
        +    // in addition to <BR>s.
        +    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
        +  
        +    var li = document.createElement('LI');
        +    while (node.firstChild) {
        +      li.appendChild(node.firstChild);
        +    }
        +    // An array of lines.  We split below, so this is initialized to one
        +    // un-split line.
        +    var listItems = [li];
        +  
        +    function walk(node) {
        +      switch (node.nodeType) {
        +        case 1:  // Element
        +          if (nocode.test(node.className)) { break; }
        +          if ('BR' === node.nodeName) {
        +            breakAfter(node);
        +            // Discard the <BR> since it is now flush against a </LI>.
        +            if (node.parentNode) {
        +              node.parentNode.removeChild(node);
        +            }
        +          } else {
        +            for (var child = node.firstChild; child; child = child.nextSibling) {
        +              walk(child);
        +            }
        +          }
        +          break;
        +        case 3: case 4:  // Text
        +          if (isPreformatted) {
        +            var text = node.nodeValue;
        +            var match = text.match(lineBreak);
        +            if (match) {
        +              var firstLine = text.substring(0, match.index);
        +              node.nodeValue = firstLine;
        +              var tail = text.substring(match.index + match[0].length);
        +              if (tail) {
        +                var parent = node.parentNode;
        +                parent.insertBefore(
        +                    document.createTextNode(tail), node.nextSibling);
        +              }
        +              breakAfter(node);
        +              if (!firstLine) {
        +                // Don't leave blank text nodes in the DOM.
        +                node.parentNode.removeChild(node);
        +              }
        +            }
        +          }
        +          break;
        +      }
        +    }
        +  
        +    // Split a line after the given node.
        +    function breakAfter(lineEndNode) {
        +      // If there's nothing to the right, then we can skip ending the line
        +      // here, and move root-wards since splitting just before an end-tag
        +      // would require us to create a bunch of empty copies.
        +      while (!lineEndNode.nextSibling) {
        +        lineEndNode = lineEndNode.parentNode;
        +        if (!lineEndNode) { return; }
        +      }
        +  
        +      function breakLeftOf(limit, copy) {
        +        // Clone shallowly if this node needs to be on both sides of the break.
        +        var rightSide = copy ? limit.cloneNode(false) : limit;
        +        var parent = limit.parentNode;
        +        if (parent) {
        +          // We clone the parent chain.
        +          // This helps us resurrect important styling elements that cross lines.
        +          // E.g. in <i>Foo<br>Bar</i>
        +          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
        +          var parentClone = breakLeftOf(parent, 1);
        +          // Move the clone and everything to the right of the original
        +          // onto the cloned parent.
        +          var next = limit.nextSibling;
        +          parentClone.appendChild(rightSide);
        +          for (var sibling = next; sibling; sibling = next) {
        +            next = sibling.nextSibling;
        +            parentClone.appendChild(sibling);
        +          }
        +        }
        +        return rightSide;
        +      }
        +  
        +      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
        +  
        +      // Walk the parent chain until we reach an unattached LI.
        +      for (var parent;
        +           // Check nodeType since IE invents document fragments.
        +           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
        +        copiedListItem = parent;
        +      }
        +      // Put it on the list of lines for later processing.
        +      listItems.push(copiedListItem);
        +    }
        +  
        +    // Split lines while there are lines left to split.
        +    for (var i = 0;  // Number of lines that have been split so far.
        +         i < listItems.length;  // length updated by breakAfter calls.
        +         ++i) {
        +      walk(listItems[i]);
        +    }
        +  
        +    // Make sure numeric indices show correctly.
        +    if (opt_startLineNum === (opt_startLineNum|0)) {
        +      listItems[0].setAttribute('value', opt_startLineNum);
        +    }
        +  
        +    var ol = document.createElement('OL');
        +    ol.className = 'linenums';
        +    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
        +    for (var i = 0, n = listItems.length; i < n; ++i) {
        +      li = listItems[i];
        +      // Stick a class on the LIs so that stylesheets can
        +      // color odd/even rows, or any other row pattern that
        +      // is co-prime with 10.
        +      li.className = 'L' + ((i + offset) % 10);
        +      if (!li.firstChild) {
        +        li.appendChild(document.createTextNode('\xA0'));
        +      }
        +      ol.appendChild(li);
        +    }
        +  
        +    node.appendChild(ol);
        +  }
        +
        +  /**
        +   * Breaks {@code job.sourceCode} around style boundaries in
        +   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
        +   * @param {Object} job like <pre>{
        +   *    sourceCode: {string} source as plain text,
        +   *    spans: {Array.<number|Node>} alternating span start indices into source
        +   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
        +   *       span.
        +   *    decorations: {Array.<number|string} an array of style classes preceded
        +   *       by the position at which they start in job.sourceCode in order
        +   * }</pre>
        +   * @private
        +   */
        +  function recombineTagsAndDecorations(job) {
        +    var isIE = /\bMSIE\b/.test(navigator.userAgent);
        +    var newlineRe = /\n/g;
        +  
        +    var source = job.sourceCode;
        +    var sourceLength = source.length;
        +    // Index into source after the last code-unit recombined.
        +    var sourceIndex = 0;
        +  
        +    var spans = job.spans;
        +    var nSpans = spans.length;
        +    // Index into spans after the last span which ends at or before sourceIndex.
        +    var spanIndex = 0;
        +  
        +    var decorations = job.decorations;
        +    var nDecorations = decorations.length;
        +    // Index into decorations after the last decoration which ends at or before
        +    // sourceIndex.
        +    var decorationIndex = 0;
        +  
        +    // Remove all zero-length decorations.
        +    decorations[nDecorations] = sourceLength;
        +    var decPos, i;
        +    for (i = decPos = 0; i < nDecorations;) {
        +      if (decorations[i] !== decorations[i + 2]) {
        +        decorations[decPos++] = decorations[i++];
        +        decorations[decPos++] = decorations[i++];
        +      } else {
        +        i += 2;
        +      }
        +    }
        +    nDecorations = decPos;
        +  
        +    // Simplify decorations.
        +    for (i = decPos = 0; i < nDecorations;) {
        +      var startPos = decorations[i];
        +      // Conflate all adjacent decorations that use the same style.
        +      var startDec = decorations[i + 1];
        +      var end = i + 2;
        +      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
        +        end += 2;
        +      }
        +      decorations[decPos++] = startPos;
        +      decorations[decPos++] = startDec;
        +      i = end;
        +    }
        +  
        +    nDecorations = decorations.length = decPos;
        +  
        +    var decoration = null;
        +    while (spanIndex < nSpans) {
        +      var spanStart = spans[spanIndex];
        +      var spanEnd = spans[spanIndex + 2] || sourceLength;
        +  
        +      var decStart = decorations[decorationIndex];
        +      var decEnd = decorations[decorationIndex + 2] || sourceLength;
        +  
        +      var end = Math.min(spanEnd, decEnd);
        +  
        +      var textNode = spans[spanIndex + 1];
        +      var styledText;
        +      if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
        +          // Don't introduce spans around empty text nodes.
        +          && (styledText = source.substring(sourceIndex, end))) {
        +        // This may seem bizarre, and it is.  Emitting LF on IE causes the
        +        // code to display with spaces instead of line breaks.
        +        // Emitting Windows standard issue linebreaks (CRLF) causes a blank
        +        // space to appear at the beginning of every line but the first.
        +        // Emitting an old Mac OS 9 line separator makes everything spiffy.
        +        if (isIE) { styledText = styledText.replace(newlineRe, '\r'); }
        +        textNode.nodeValue = styledText;
        +        var document = textNode.ownerDocument;
        +        var span = document.createElement('SPAN');
        +        span.className = decorations[decorationIndex + 1];
        +        var parentNode = textNode.parentNode;
        +        parentNode.replaceChild(span, textNode);
        +        span.appendChild(textNode);
        +        if (sourceIndex < spanEnd) {  // Split off a text node.
        +          spans[spanIndex + 1] = textNode
        +              // TODO: Possibly optimize by using '' if there's no flicker.
        +              = document.createTextNode(source.substring(end, spanEnd));
        +          parentNode.insertBefore(textNode, span.nextSibling);
        +        }
        +      }
        +  
        +      sourceIndex = end;
        +  
        +      if (sourceIndex >= spanEnd) {
        +        spanIndex += 2;
        +      }
        +      if (sourceIndex >= decEnd) {
        +        decorationIndex += 2;
        +      }
        +    }
        +  }
        +
        +
        +  /** Maps language-specific file extensions to handlers. */
        +  var langHandlerRegistry = {};
        +  /** Register a language handler for the given file extensions.
        +    * @param {function (Object)} handler a function from source code to a list
        +    *      of decorations.  Takes a single argument job which describes the
        +    *      state of the computation.   The single parameter has the form
        +    *      {@code {
        +    *        sourceCode: {string} as plain text.
        +    *        decorations: {Array.<number|string>} an array of style classes
        +    *                     preceded by the position at which they start in
        +    *                     job.sourceCode in order.
        +    *                     The language handler should assigned this field.
        +    *        basePos: {int} the position of source in the larger source chunk.
        +    *                 All positions in the output decorations array are relative
        +    *                 to the larger source chunk.
        +    *      } }
        +    * @param {Array.<string>} fileExtensions
        +    */
        +  function registerLangHandler(handler, fileExtensions) {
        +    for (var i = fileExtensions.length; --i >= 0;) {
        +      var ext = fileExtensions[i];
        +      if (!langHandlerRegistry.hasOwnProperty(ext)) {
        +        langHandlerRegistry[ext] = handler;
        +      } else if (window['console']) {
        +        console['warn']('cannot override language handler %s', ext);
        +      }
        +    }
        +  }
        +  function langHandlerForExtension(extension, source) {
        +    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
        +      // Treat it as markup if the first non whitespace character is a < and
        +      // the last non-whitespace character is a >.
        +      extension = /^\s*</.test(source)
        +          ? 'default-markup'
        +          : 'default-code';
        +    }
        +    return langHandlerRegistry[extension];
        +  }
        +  registerLangHandler(decorateSource, ['default-code']);
        +  registerLangHandler(
        +      createSimpleLexer(
        +          [],
        +          [
        +           [PR_PLAIN,       /^[^<?]+/],
        +           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
        +           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
        +           // Unescaped content in an unknown language
        +           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
        +           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
        +           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
        +           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
        +           // Unescaped content in javascript.  (Or possibly vbscript).
        +           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
        +           // Contains unescaped stylesheet content
        +           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
        +           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
        +          ]),
        +      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
        +  registerLangHandler(
        +      createSimpleLexer(
        +          [
        +           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
        +           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
        +           ],
        +          [
        +           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
        +           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
        +           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
        +           [PR_PUNCTUATION,  /^[=<>\/]+/],
        +           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
        +           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
        +           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
        +           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
        +           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
        +           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
        +           ]),
        +      ['in.tag']);
        +  registerLangHandler(
        +      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': CPP_KEYWORDS,
        +          'hashComments': true,
        +          'cStyleComments': true,
        +          'types': C_TYPES
        +        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': 'null,true,false'
        +        }), ['json']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': CSHARP_KEYWORDS,
        +          'hashComments': true,
        +          'cStyleComments': true,
        +          'verbatimStrings': true,
        +          'types': C_TYPES
        +        }), ['cs']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': JAVA_KEYWORDS,
        +          'cStyleComments': true
        +        }), ['java']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': SH_KEYWORDS,
        +          'hashComments': true,
        +          'multiLineStrings': true
        +        }), ['bsh', 'csh', 'sh']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': PYTHON_KEYWORDS,
        +          'hashComments': true,
        +          'multiLineStrings': true,
        +          'tripleQuotedStrings': true
        +        }), ['cv', 'py']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': PERL_KEYWORDS,
        +          'hashComments': true,
        +          'multiLineStrings': true,
        +          'regexLiterals': true
        +        }), ['perl', 'pl', 'pm']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': RUBY_KEYWORDS,
        +          'hashComments': true,
        +          'multiLineStrings': true,
        +          'regexLiterals': true
        +        }), ['rb']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': JSCRIPT_KEYWORDS,
        +          'cStyleComments': true,
        +          'regexLiterals': true
        +        }), ['js']);
        +  registerLangHandler(sourceDecorator({
        +          'keywords': COFFEE_KEYWORDS,
        +          'hashComments': 3,  // ### style block comments
        +          'cStyleComments': true,
        +          'multilineStrings': true,
        +          'tripleQuotedStrings': true,
        +          'regexLiterals': true
        +        }), ['coffee']);
        +  registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
        +
        +  function applyDecorator(job) {
        +    var opt_langExtension = job.langExtension;
        +
        +    try {
        +      // Extract tags, and convert the source code to plain text.
        +      var sourceAndSpans = extractSourceSpans(job.sourceNode);
        +      /** Plain text. @type {string} */
        +      var source = sourceAndSpans.sourceCode;
        +      job.sourceCode = source;
        +      job.spans = sourceAndSpans.spans;
        +      job.basePos = 0;
        +
        +      // Apply the appropriate language handler
        +      langHandlerForExtension(opt_langExtension, source)(job);
        +
        +      // Integrate the decorations and tags back into the source code,
        +      // modifying the sourceNode in place.
        +      recombineTagsAndDecorations(job);
        +    } catch (e) {
        +      if ('console' in window) {
        +        console['log'](e && e['stack'] ? e['stack'] : e);
        +      }
        +    }
        +  }
        +
        +  /**
        +   * @param sourceCodeHtml {string} The HTML to pretty print.
        +   * @param opt_langExtension {string} The language name to use.
        +   *     Typically, a filename extension like 'cpp' or 'java'.
        +   * @param opt_numberLines {number|boolean} True to number lines,
        +   *     or the 1-indexed number of the first line in sourceCodeHtml.
        +   */
        +  function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
        +    var container = document.createElement('PRE');
        +    // This could cause images to load and onload listeners to fire.
        +    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
        +    // We assume that the inner HTML is from a trusted source.
        +    container.innerHTML = sourceCodeHtml;
        +    if (opt_numberLines) {
        +      numberLines(container, opt_numberLines);
        +    }
        +
        +    var job = {
        +      langExtension: opt_langExtension,
        +      numberLines: opt_numberLines,
        +      sourceNode: container
        +    };
        +    applyDecorator(job);
        +    return container.innerHTML;
        +  }
        +
        +  function prettyPrint(opt_whenDone) {
        +    function byTagName(tn) { return document.getElementsByTagName(tn); }
        +    // fetch a list of nodes to rewrite
        +    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
        +    var elements = [];
        +    for (var i = 0; i < codeSegments.length; ++i) {
        +      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
        +        elements.push(codeSegments[i][j]);
        +      }
        +    }
        +    codeSegments = null;
        +
        +    var clock = Date;
        +    if (!clock['now']) {
        +      clock = { 'now': function () { return +(new Date); } };
        +    }
        +
        +    // The loop is broken into a series of continuations to make sure that we
        +    // don't make the browser unresponsive when rewriting a large page.
        +    var k = 0;
        +    var prettyPrintingJob;
        +
        +    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
        +    var prettyPrintRe = /\bprettyprint\b/;
        +
        +    function doWork() {
        +      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
        +                     clock['now']() + 250 /* ms */ :
        +                     Infinity);
        +      for (; k < elements.length && clock['now']() < endTime; k++) {
        +        var cs = elements[k];
        +        var className = cs.className;
        +        if (className.indexOf('prettyprint') >= 0) {
        +          // If the classes includes a language extensions, use it.
        +          // Language extensions can be specified like
        +          //     <pre class="prettyprint lang-cpp">
        +          // the language extension "cpp" is used to find a language handler as
        +          // passed to PR.registerLangHandler.
        +          // HTML5 recommends that a language be specified using "language-"
        +          // as the prefix instead.  Google Code Prettify supports both.
        +          // http://dev.w3.org/html5/spec-author-view/the-code-element.html
        +          var langExtension = className.match(langExtensionRe);
        +          // Support <pre class="prettyprint"><code class="language-c">
        +          var wrapper;
        +          if (!langExtension && (wrapper = childContentWrapper(cs))
        +              && "CODE" === wrapper.tagName) {
        +            langExtension = wrapper.className.match(langExtensionRe);
        +          }
        +
        +          if (langExtension) {
        +            langExtension = langExtension[1];
        +          }
        +
        +          // make sure this is not nested in an already prettified element
        +          var nested = false;
        +          for (var p = cs.parentNode; p; p = p.parentNode) {
        +            if ((p.tagName === 'pre' || p.tagName === 'code' ||
        +                 p.tagName === 'xmp') &&
        +                p.className && p.className.indexOf('prettyprint') >= 0) {
        +              nested = true;
        +              break;
        +            }
        +          }
        +          if (!nested) {
        +            // Look for a class like linenums or linenums:<n> where <n> is the
        +            // 1-indexed number of the first line.
        +            var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
        +            lineNums = lineNums
        +                  ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
        +                  : false;
        +            if (lineNums) { numberLines(cs, lineNums); }
        +
        +            // do the pretty printing
        +            prettyPrintingJob = {
        +              langExtension: langExtension,
        +              sourceNode: cs,
        +              numberLines: lineNums
        +            };
        +            applyDecorator(prettyPrintingJob);
        +          }
        +        }
        +      }
        +      if (k < elements.length) {
        +        // finish up in a continuation
        +        setTimeout(doWork, 250);
        +      } else if (opt_whenDone) {
        +        opt_whenDone();
        +      }
        +    }
        +
        +    doWork();
        +  }
        +
        +   /**
        +    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
        +    * {@code class=prettyprint} and prettify them.
        +    *
        +    * @param {Function?} opt_whenDone if specified, called when the last entry
        +    *     has been finished.
        +    */
        +  window['prettyPrintOne'] = prettyPrintOne;
        +   /**
        +    * Pretty print a chunk of code.
        +    *
        +    * @param {string} sourceCodeHtml code as html
        +    * @return {string} code as html, but prettier
        +    */
        +  window['prettyPrint'] = prettyPrint;
        +   /**
        +    * Contains functions for creating and registering new language handlers.
        +    * @type {Object}
        +    */
        +  window['PR'] = {
        +        'createSimpleLexer': createSimpleLexer,
        +        'registerLangHandler': registerLangHandler,
        +        'sourceDecorator': sourceDecorator,
        +        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
        +        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
        +        'PR_COMMENT': PR_COMMENT,
        +        'PR_DECLARATION': PR_DECLARATION,
        +        'PR_KEYWORD': PR_KEYWORD,
        +        'PR_LITERAL': PR_LITERAL,
        +        'PR_NOCODE': PR_NOCODE,
        +        'PR_PLAIN': PR_PLAIN,
        +        'PR_PUNCTUATION': PR_PUNCTUATION,
        +        'PR_SOURCE': PR_SOURCE,
        +        'PR_STRING': PR_STRING,
        +        'PR_TAG': PR_TAG,
        +        'PR_TYPE': PR_TYPE
        +      };
        +})();
        diff --git a/bower_components/jquery-slimscroll/examples/mouse-wheel.html b/bower_components/jquery-slimscroll/examples/mouse-wheel.html
        new file mode 100644
        index 0000000000..434c80c39d
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/mouse-wheel.html
        @@ -0,0 +1,99 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - mouse wheel</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +  <div id="testDiv">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv').slimScroll({
        +      wheelStep: 20
        +  });
        +</pre>
        +
        +  <div id="testDiv2">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv2').slimScroll({
        +      wheelStep: 100
        +  });
        +</pre>
        +
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +
        +      $('#testDiv').slimScroll({
        +          wheelStep: 20
        +      });
        +
        +      $('#testDiv2').slimScroll({
        +          wheelStep: 100
        +      });
        +
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/multiple-elements.html b/bower_components/jquery-slimscroll/examples/multiple-elements.html
        new file mode 100644
        index 0000000000..8923825b58
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/multiple-elements.html
        @@ -0,0 +1,120 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - multiple elements</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +<div style="height:80px;float:left;">
        +  <div class="area">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +</div>
        +<div style="height:400px;float:left;">
        +  <div class="area">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +</div>
        +<div style="height:300px;float:left;">
        +  <div class="area">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +</div>
        +
        +<div style="clear:both"></div>
        +<pre class="prettyprint">
        +  $('.area').slimscroll({
        +    width: '200px',
        +  }).parent().css({
        +    'float': 'left',
        +    'margin-right': '30px'
        +  });
        +</pre>
        +
        +<div style="clear:both"></div>
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +
        +      $('.area').slimscroll({
        +        width: '200px',
        +        height: 'auto'
        +      }).parent().css({
        +        'float': 'left',
        +        'margin-right': '30px'
        +      });
        +
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/navigation.html b/bower_components/jquery-slimscroll/examples/navigation.html
        new file mode 100644
        index 0000000000..2df6272e57
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/navigation.html
        @@ -0,0 +1,30 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - navigation</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<div id="nav">
        +  <h1>jQuery slimScroll</h1>
        +  <h2>Facebook-style jQuery Scrollbar</h1>
        +  <hr />
        +  <ul>
        +    <li><a target="main" href="height-width.html">Height / Width options</a></li>
        +    <li><a target="main" href="scrollbar.html">Scrollbar options</a></li>
        +    <li><a target="main" href="rail.html">Rail options</a></li>
        +    <li><a target="main" href="start-position.html">Start position</a></li>
        +    <li><a target="main" href="chaining.html">Chaining</a></li>
        +    <li><a target="main" href="multiple-elements.html">Mulitple bindings</a></li>
        +    <li><a target="main" href="programmatic-scrolling.html">Programmatic Scrolling</a></li>
        +    <li><a target="main" href="scroll-events.html">Scroll Events</a></li>
        +    <li><a target="main" href="allow-page-scroll.html">allowPageScroll option</a></li>
        +    <li><a target="main" href="disable-fade-out.html">disableFadeOut option</a></li>
        +    <li><a target="main" href="mouse-wheel.html">wheelStep option</a></li>
        +    <li><a target="main" href="nested.html">nested elements</a></li>
        +    <li><a target="main" href="dynamic-content.html">dynamic content</a></li>
        +  </ul>
        +</div>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/nested.html b/bower_components/jquery-slimscroll/examples/nested.html
        new file mode 100644
        index 0000000000..92bd599d7d
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/nested.html
        @@ -0,0 +1,82 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - nested elements</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +  <div id="testDiv">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +      <div id="testDivNested">
        +        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +        <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +        <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +        <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +        <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +      </div>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv').slimscroll({
        +    height: '500px'
        +  });
        +  $('#testDivNested').slimscroll({
        +    width: '300px',
        +    height: '200px'
        +  });
        +</pre>
        +
        +
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +
        +      $('#testDiv').slimscroll({
        +        height: '500px'
        +      });
        +      $('#testDivNested').slimscroll({
        +        width: '300px',
        +        height: '200px'
        +      }).parent().css({
        +        'float': 'left',
        +        'margin': '0 10px 10px 0'
        +      });
        +
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/programmatic-scrolling.html b/bower_components/jquery-slimscroll/examples/programmatic-scrolling.html
        new file mode 100644
        index 0000000000..163e753061
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/programmatic-scrolling.html
        @@ -0,0 +1,138 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - programmatic scrolling</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +  <div id="testDiv">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +  <input type="button" id="scrollDown" value="scroll down by 50 px" />
        +  <input type="button" id="scrollUp" value="scroll up by 50 px" />
        +
        +
        +<pre class="prettyprint">
        +$('#testDiv').slimscroll({
        +  height: '250px'
        +});
        +
        +$('#scrollDown').click(function(){
        +  $('#testDiv').slimScroll({ scrollBy: '50px' });
        +});
        +
        +$('#scrollUp').click(function(){
        +  $('#testDiv').slimScroll({ scrollBy: '-50px' });
        +});
        +</pre>
        +
        +  <div id="testDiv2">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +  <input type="button" id="scrollDownTo" value="Scroll to 300px from the top" />
        +  <input type="button" id="scrollUpTo" value="Scroll to 20px from the top" />
        +
        +
        +<pre class="prettyprint">
        +$('#testDiv2').slimscroll({
        +  height: '250px'
        +});
        +
        +$('#scrollDownTo').click(function(){
        +  $('#testDiv2').slimScroll({ scrollTo: '300px' });
        +});
        +
        +$('#scrollUpTo').click(function(){
        +  $('#testDiv2').slimScroll({ scrollTo: '20px' });
        +});
        +</pre>
        +
        +
        +
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +      $('#testDiv').slimscroll({
        +        height: '250px'
        +      });
        +
        +      $('#scrollDown').click(function(){
        +        $('#testDiv').slimScroll({ scrollBy: '50px' });
        +      });
        +
        +      $('#scrollUp').click(function(){
        +        $('#testDiv').slimScroll({ scrollBy: '-50px' });
        +      });
        +
        +      $('#testDiv2').slimscroll({
        +        height: '250px'
        +      });
        +
        +      $('#scrollDownTo').click(function(){
        +        $('#testDiv2').slimScroll({ scrollTo: '300px' });
        +      });
        +
        +      $('#scrollUpTo').click(function(){
        +        $('#testDiv2').slimScroll({ scrollTo: '20px' });
        +      });
        +
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/rail.html b/bower_components/jquery-slimscroll/examples/rail.html
        new file mode 100644
        index 0000000000..4f77f34946
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/rail.html
        @@ -0,0 +1,190 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - rail options</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +  <div id="testDiv">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv').slimScroll({
        +      alwaysVisible: true,
        +      railVisible: true
        +  });
        +</pre>
        +
        +  <div id="testDiv2">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv2').slimScroll({
        +      railVisible: true,
        +      railColor: '#f00'
        +  });
        +</pre>
        +
        +  <div id="testDiv3">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv3').slimScroll({
        +      railVisible: true,
        +      railOpacity: 0.8
        +  });
        +</pre>
        +
        +  <div id="testDiv4">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv4').slimscroll({
        +    railVisible: true,
        +    railBorderRadius: 0
        +  });
        +</pre>
        +
        +  <div id="testDiv5">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv5').slimscroll({
        +    railDraggable: false
        +  });
        +</pre>
        +
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +
        +      $('#testDiv').slimScroll({
        +          alwaysVisible: true,
        +          railVisible: true
        +      });
        +
        +      $('#testDiv2').slimScroll({
        +          railVisible: true,
        +          railColor: '#f00'
        +      });
        +
        +      $('#testDiv3').slimScroll({
        +          railVisible: true,
        +          railOpacity: 0.8
        +      });
        +
        +      $('#testDiv4').slimscroll({
        +        railVisible: true,
        +        railBorderRadius: 0
        +      });
        +
        +      $('#testDiv5').slimscroll({
        +        railDraggable: false
        +      });
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/scroll-events.html b/bower_components/jquery-slimscroll/examples/scroll-events.html
        new file mode 100644
        index 0000000000..9eabbdc953
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/scroll-events.html
        @@ -0,0 +1,88 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - top/bottom events</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +  <div id="testDiv">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +  </div>
        +  <div style="padding:2px;border:1px dashed #333;margin:2px;" id="testDivOut"></div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv').slimscroll({
        +    alwaysVisible: true
        +  }).bind('slimscroll', function(e, pos) {
        +    $('#testDivOut').append("Reached " + pos + ", ");
        +  });
        +</pre>
        +
        +  <div id="testDiv2">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +  </div>
        +  <div style="padding:2px;border:1px dashed #333;margin:2px;" id="testDivOut2"></div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv2').slimscroll().bind('slimscrolling', function(e, pos) {
        +    $('#testDivOut2').append("Scroll value: " + pos + "px");
        +  });
        +</pre>
        +
        +
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +
        +      $('#testDiv').slimscroll({
        +        alwaysVisible: true
        +      }).bind('slimscroll', function(e, pos) {
        +        $('#testDivOut').append("Reached " + pos + ", ");
        +      });
        +
        +      $('#testDiv2').slimscroll().bind('slimscrolling', function(e, pos) {
        +        $('#testDivOut2').append("Scroll: " + pos + "px, ");
        +      });
        +
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/scrollbar.html b/bower_components/jquery-slimscroll/examples/scrollbar.html
        new file mode 100644
        index 0000000000..9f13b03d4f
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/scrollbar.html
        @@ -0,0 +1,189 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - scrollbar options</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +  <div id="testDiv">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv').slimscroll({
        +    size: '15px'
        +  });
        +</pre>
        +
        +  <div id="testDiv2">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv2').slimScroll({
        +      position: 'left'
        +  });
        +</pre>
        +
        +  <div id="testDiv3">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv3').slimScroll({
        +      color: '#00f'
        +  });
        +</pre>
        +
        +
        +
        +  <div id="testDiv4">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv4').slimScroll({
        +      alwaysVisible: true
        +  });
        +</pre>
        +
        +
        +
        +  <div id="testDiv5">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv5').slimScroll({
        +      distance: '20px',
        +      opacity: 1
        +  });
        +</pre>
        +
        +
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +      $('#testDiv').slimscroll({
        +        size: '15px'
        +      });
        +
        +      $('#testDiv2').slimScroll({
        +          position: 'left'
        +      });
        +
        +      $('#testDiv3').slimScroll({
        +          color: '#00f'
        +      });
        +
        +      $('#testDiv4').slimScroll({
        +          alwaysVisible: true
        +      });
        +
        +      $('#testDiv5').slimScroll({
        +          distance: '20px',
        +          opacity: 1
        +      });
        +
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/start-position.html b/bower_components/jquery-slimscroll/examples/start-position.html
        new file mode 100644
        index 0000000000..8afdda6c53
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/start-position.html
        @@ -0,0 +1,100 @@
        +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        +<html>
        +<head>
        +<title>jquery.slimscroll - start position</title>
        +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        +
        +<link href="libs/prettify/prettify.css" type="text/css" rel="stylesheet" />
        +<script type="text/javascript" src="libs/prettify/prettify.js"></script>
        +<script type="text/javascript" src="../jquery.slimscroll.js"></script>
        +<link href="style.css" type="text/css" rel="stylesheet" />
        +</head>
        +<body>
        +<a id="git-fork" href="https://github.com/rochal/jQuery-slimScroll"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
        +
        +<div class="examples">
        +  <div id="testDiv">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv').slimScroll({
        +      start: 'bottom'
        +  });
        +</pre>
        +
        +  <div id="testDiv2">
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p><span class="helloDiv" style="background:green;font-weigh:bold;">Hello!</span>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
        +    <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        +    <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
        +    <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        +    <p>Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.</p>
        +  </div>
        +
        +<pre class="prettyprint">
        +  $('#testDiv2').slimScroll({
        +      start: $('.helloDiv')
        +  });
        +</pre>
        +
        +
        +</div>
        +
        +<script type="text/javascript">
        +    $(function(){
        +
        +      $('#testDiv').slimScroll({
        +          start: 'bottom'
        +      });
        +
        +      $('#testDiv2').slimScroll({
        +          start: $('.helloDiv')
        +      });
        +
        +    });
        +</script>
        +
        +
        +<script type="text/javascript">
        +
        +  //enable syntax highlighter
        +  prettyPrint();
        +
        +  var _gaq = _gaq || [];
        +  _gaq.push(['_setAccount', 'UA-3112455-22']);
        +  _gaq.push(['_setDomainName', 'none']);
        +  _gaq.push(['_trackPageview']);
        +
        +  (function() {
        +    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        +    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        +    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        +  })();
        +</script>
        +</body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/examples/style.css b/bower_components/jquery-slimscroll/examples/style.css
        new file mode 100644
        index 0000000000..b676c81360
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/examples/style.css
        @@ -0,0 +1,13 @@
        +body { font-family:Verdana,sans-serif; font-size:12px; color:#000; background:#111; }
        +h1 { font-size:20px; margin:0 }
        +h2 { font-size:10px; margin:0 }
        +p { margin:5px 0; font-size:12px; }
        +pre.prettyprint { padding:15px; border:1px solid #eee; border-radius:5px; background:#eee; border-bottom:3px solid; }
        +.examples { border-radius:20px; background:#fff; padding:15px;
        +  margin:0 150px 0 0; border-collapse: collapse; border:1px solid #000; }
        +.slimScrollDiv { border:1px solid #eee; }
        +#nav { position:fixed; top:0; left:0; background:#fff; padding:15px; border-radius:20px; width:200px; }
        +#nav ul { list-style-type:square; list-style-position:inside; margin:20px 0 0 0; padding:0; }
        +#nav a { text-decoration:none; color:#000; }
        +#nav a:hover { text-decoration: underline }
        +#git-fork img { position:fixed; top:0; right:0; border:0; z-index:999; }
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/jquery.slimscroll.js b/bower_components/jquery-slimscroll/jquery.slimscroll.js
        new file mode 100644
        index 0000000000..90caed348a
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/jquery.slimscroll.js
        @@ -0,0 +1,474 @@
        +/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
        + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
        + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
        + *
        + * Version: 1.3.8
        + *
        + */
        +(function($) {
        +
        +  $.fn.extend({
        +    slimScroll: function(options) {
        +
        +      var defaults = {
        +
        +        // width in pixels of the visible scroll area
        +        width : 'auto',
        +
        +        // height in pixels of the visible scroll area
        +        height : '250px',
        +
        +        // width in pixels of the scrollbar and rail
        +        size : '7px',
        +
        +        // scrollbar color, accepts any hex/color value
        +        color: '#000',
        +
        +        // scrollbar position - left/right
        +        position : 'right',
        +
        +        // distance in pixels between the side edge and the scrollbar
        +        distance : '1px',
        +
        +        // default scroll position on load - top / bottom / $('selector')
        +        start : 'top',
        +
        +        // sets scrollbar opacity
        +        opacity : .4,
        +
        +        // enables always-on mode for the scrollbar
        +        alwaysVisible : false,
        +
        +        // check if we should hide the scrollbar when user is hovering over
        +        disableFadeOut : false,
        +
        +        // sets visibility of the rail
        +        railVisible : false,
        +
        +        // sets rail color
        +        railColor : '#333',
        +
        +        // sets rail opacity
        +        railOpacity : .2,
        +
        +        // whether  we should use jQuery UI Draggable to enable bar dragging
        +        railDraggable : true,
        +
        +        // defautlt CSS class of the slimscroll rail
        +        railClass : 'slimScrollRail',
        +
        +        // defautlt CSS class of the slimscroll bar
        +        barClass : 'slimScrollBar',
        +
        +        // defautlt CSS class of the slimscroll wrapper
        +        wrapperClass : 'slimScrollDiv',
        +
        +        // check if mousewheel should scroll the window if we reach top/bottom
        +        allowPageScroll : false,
        +
        +        // scroll amount applied to each mouse wheel step
        +        wheelStep : 20,
        +
        +        // scroll amount applied when user is using gestures
        +        touchScrollStep : 200,
        +
        +        // sets border radius
        +        borderRadius: '7px',
        +
        +        // sets border radius of the rail
        +        railBorderRadius : '7px'
        +      };
        +
        +      var o = $.extend(defaults, options);
        +
        +      // do it for every element that matches selector
        +      this.each(function(){
        +
        +      var isOverPanel, isOverBar, isDragg, queueHide, touchDif,
        +        barHeight, percentScroll, lastScroll,
        +        divS = '<div></div>',
        +        minBarHeight = 30,
        +        releaseScroll = false;
        +
        +        // used in event handlers and for better minification
        +        var me = $(this);
        +
        +        // ensure we are not binding it again
        +        if (me.parent().hasClass(o.wrapperClass))
        +        {
        +            // start from last bar position
        +            var offset = me.scrollTop();
        +
        +            // find bar and rail
        +            bar = me.siblings('.' + o.barClass);
        +            rail = me.siblings('.' + o.railClass);
        +
        +            getBarHeight();
        +
        +            // check if we should scroll existing instance
        +            if ($.isPlainObject(options))
        +            {
        +              // Pass height: auto to an existing slimscroll object to force a resize after contents have changed
        +              if ( 'height' in options && options.height == 'auto' ) {
        +                me.parent().css('height', 'auto');
        +                me.css('height', 'auto');
        +                var height = me.parent().parent().height();
        +                me.parent().css('height', height);
        +                me.css('height', height);
        +              } else if ('height' in options) {
        +                var h = options.height;
        +                me.parent().css('height', h);
        +                me.css('height', h);
        +              }
        +
        +              if ('scrollTo' in options)
        +              {
        +                // jump to a static point
        +                offset = parseInt(o.scrollTo);
        +              }
        +              else if ('scrollBy' in options)
        +              {
        +                // jump by value pixels
        +                offset += parseInt(o.scrollBy);
        +              }
        +              else if ('destroy' in options)
        +              {
        +                // remove slimscroll elements
        +                bar.remove();
        +                rail.remove();
        +                me.unwrap();
        +                return;
        +              }
        +
        +              // scroll content by the given offset
        +              scrollContent(offset, false, true);
        +            }
        +
        +            return;
        +        }
        +        else if ($.isPlainObject(options))
        +        {
        +            if ('destroy' in options)
        +            {
        +            	return;
        +            }
        +        }
        +
        +        // optionally set height to the parent's height
        +        o.height = (o.height == 'auto') ? me.parent().height() : o.height;
        +
        +        // wrap content
        +        var wrapper = $(divS)
        +          .addClass(o.wrapperClass)
        +          .css({
        +            position: 'relative',
        +            overflow: 'hidden',
        +            width: o.width,
        +            height: o.height
        +          });
        +
        +        // update style for the div
        +        me.css({
        +          overflow: 'hidden',
        +          width: o.width,
        +          height: o.height
        +        });
        +
        +        // create scrollbar rail
        +        var rail = $(divS)
        +          .addClass(o.railClass)
        +          .css({
        +            width: o.size,
        +            height: '100%',
        +            position: 'absolute',
        +            top: 0,
        +            display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',
        +            'border-radius': o.railBorderRadius,
        +            background: o.railColor,
        +            opacity: o.railOpacity,
        +            zIndex: 90
        +          });
        +
        +        // create scrollbar
        +        var bar = $(divS)
        +          .addClass(o.barClass)
        +          .css({
        +            background: o.color,
        +            width: o.size,
        +            position: 'absolute',
        +            top: 0,
        +            opacity: o.opacity,
        +            display: o.alwaysVisible ? 'block' : 'none',
        +            'border-radius' : o.borderRadius,
        +            BorderRadius: o.borderRadius,
        +            MozBorderRadius: o.borderRadius,
        +            WebkitBorderRadius: o.borderRadius,
        +            zIndex: 99
        +          });
        +
        +        // set position
        +        var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };
        +        rail.css(posCss);
        +        bar.css(posCss);
        +
        +        // wrap it
        +        me.wrap(wrapper);
        +
        +        // append to parent div
        +        me.parent().append(bar);
        +        me.parent().append(rail);
        +
        +        // make it draggable and no longer dependent on the jqueryUI
        +        if (o.railDraggable){
        +          bar.bind("mousedown", function(e) {
        +            var $doc = $(document);
        +            isDragg = true;
        +            t = parseFloat(bar.css('top'));
        +            pageY = e.pageY;
        +
        +            $doc.bind("mousemove.slimscroll", function(e){
        +              currTop = t + e.pageY - pageY;
        +              bar.css('top', currTop);
        +              scrollContent(0, bar.position().top, false);// scroll content
        +            });
        +
        +            $doc.bind("mouseup.slimscroll", function(e) {
        +              isDragg = false;hideBar();
        +              $doc.unbind('.slimscroll');
        +            });
        +            return false;
        +          }).bind("selectstart.slimscroll", function(e){
        +            e.stopPropagation();
        +            e.preventDefault();
        +            return false;
        +          });
        +        }
        +
        +        // on rail over
        +        rail.hover(function(){
        +          showBar();
        +        }, function(){
        +          hideBar();
        +        });
        +
        +        // on bar over
        +        bar.hover(function(){
        +          isOverBar = true;
        +        }, function(){
        +          isOverBar = false;
        +        });
        +
        +        // show on parent mouseover
        +        me.hover(function(){
        +          isOverPanel = true;
        +          showBar();
        +          hideBar();
        +        }, function(){
        +          isOverPanel = false;
        +          hideBar();
        +        });
        +
        +        // support for mobile
        +        me.bind('touchstart', function(e,b){
        +          if (e.originalEvent.touches.length)
        +          {
        +            // record where touch started
        +            touchDif = e.originalEvent.touches[0].pageY;
        +          }
        +        });
        +
        +        me.bind('touchmove', function(e){
        +          // prevent scrolling the page if necessary
        +          if(!releaseScroll)
        +          {
        +  		      e.originalEvent.preventDefault();
        +		      }
        +          if (e.originalEvent.touches.length)
        +          {
        +            // see how far user swiped
        +            var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;
        +            // scroll content
        +            scrollContent(diff, true);
        +            touchDif = e.originalEvent.touches[0].pageY;
        +          }
        +        });
        +
        +        // set up initial height
        +        getBarHeight();
        +
        +        // check start position
        +        if (o.start === 'bottom')
        +        {
        +          // scroll content to bottom
        +          bar.css({ top: me.outerHeight() - bar.outerHeight() });
        +          scrollContent(0, true);
        +        }
        +        else if (o.start !== 'top')
        +        {
        +          // assume jQuery selector
        +          scrollContent($(o.start).position().top, null, true);
        +
        +          // make sure bar stays hidden
        +          if (!o.alwaysVisible) { bar.hide(); }
        +        }
        +
        +        // attach scroll events
        +        attachWheel(this);
        +
        +        function _onWheel(e)
        +        {
        +          // use mouse wheel only when mouse is over
        +          if (!isOverPanel) { return; }
        +
        +          var e = e || window.event;
        +
        +          var delta = 0;
        +          if (e.wheelDelta) { delta = -e.wheelDelta/120; }
        +          if (e.detail) { delta = e.detail / 3; }
        +
        +          var target = e.target || e.srcTarget || e.srcElement;
        +          if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {
        +            // scroll content
        +            scrollContent(delta, true);
        +          }
        +
        +          // stop window scroll
        +          if (e.preventDefault && !releaseScroll) { e.preventDefault(); }
        +          if (!releaseScroll) { e.returnValue = false; }
        +        }
        +
        +        function scrollContent(y, isWheel, isJump)
        +        {
        +          releaseScroll = false;
        +          var delta = y;
        +          var maxTop = me.outerHeight() - bar.outerHeight();
        +
        +          if (isWheel)
        +          {
        +            // move bar with mouse wheel
        +            delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();
        +
        +            // move bar, make sure it doesn't go out
        +            delta = Math.min(Math.max(delta, 0), maxTop);
        +
        +            // if scrolling down, make sure a fractional change to the
        +            // scroll position isn't rounded away when the scrollbar's CSS is set
        +            // this flooring of delta would happened automatically when
        +            // bar.css is set below, but we floor here for clarity
        +            delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);
        +
        +            // scroll the scrollbar
        +            bar.css({ top: delta + 'px' });
        +          }
        +
        +          // calculate actual scroll amount
        +          percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());
        +          delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
        +
        +          if (isJump)
        +          {
        +            delta = y;
        +            var offsetTop = delta / me[0].scrollHeight * me.outerHeight();
        +            offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);
        +            bar.css({ top: offsetTop + 'px' });
        +          }
        +
        +          // scroll content
        +          me.scrollTop(delta);
        +
        +          // fire scrolling event
        +          me.trigger('slimscrolling', ~~delta);
        +
        +          // ensure bar is visible
        +          showBar();
        +
        +          // trigger hide when scroll is stopped
        +          hideBar();
        +        }
        +
        +        function attachWheel(target)
        +        {
        +          if (window.addEventListener)
        +          {
        +            target.addEventListener('DOMMouseScroll', _onWheel, false );
        +            target.addEventListener('mousewheel', _onWheel, false );
        +          }
        +          else
        +          {
        +            document.attachEvent("onmousewheel", _onWheel)
        +          }
        +        }
        +
        +        function getBarHeight()
        +        {
        +          // calculate scrollbar height and make sure it is not too small
        +          barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
        +          bar.css({ height: barHeight + 'px' });
        +
        +          // hide scrollbar if content is not long enough
        +          var display = barHeight == me.outerHeight() ? 'none' : 'block';
        +          bar.css({ display: display });
        +        }
        +
        +        function showBar()
        +        {
        +          // recalculate bar height
        +          getBarHeight();
        +          clearTimeout(queueHide);
        +
        +          // when bar reached top or bottom
        +          if (percentScroll == ~~percentScroll)
        +          {
        +            //release wheel
        +            releaseScroll = o.allowPageScroll;
        +
        +            // publish approporiate event
        +            if (lastScroll != percentScroll)
        +            {
        +                var msg = (~~percentScroll == 0) ? 'top' : 'bottom';
        +                me.trigger('slimscroll', msg);
        +            }
        +          }
        +          else
        +          {
        +            releaseScroll = false;
        +          }
        +          lastScroll = percentScroll;
        +
        +          // show only when required
        +          if(barHeight >= me.outerHeight()) {
        +            //allow window scroll
        +            releaseScroll = true;
        +            return;
        +          }
        +          bar.stop(true,true).fadeIn('fast');
        +          if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }
        +        }
        +
        +        function hideBar()
        +        {
        +          // only hide when options allow it
        +          if (!o.alwaysVisible)
        +          {
        +            queueHide = setTimeout(function(){
        +              if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
        +              {
        +                bar.fadeOut('slow');
        +                rail.fadeOut('slow');
        +              }
        +            }, 1000);
        +          }
        +        }
        +
        +      });
        +
        +      // maintain chainability
        +      return this;
        +    }
        +  });
        +
        +  $.fn.extend({
        +    slimscroll: $.fn.slimScroll
        +  });
        +
        +})(jQuery);
        diff --git a/bower_components/jquery-slimscroll/jquery.slimscroll.min.js b/bower_components/jquery-slimscroll/jquery.slimscroll.min.js
        new file mode 100644
        index 0000000000..7531ab35f4
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/jquery.slimscroll.min.js
        @@ -0,0 +1,16 @@
        +/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
        + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
        + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
        + *
        + * Version: 1.3.8
        + *
        + */
        +(function(e){e.fn.extend({slimScroll:function(f){var a=e.extend({width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},f);this.each(function(){function v(d){if(r){d=d||window.event;
        +var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&n(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function n(d,g,e){k=!1;var f=b.outerHeight()-c.outerHeight();g&&(g=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),g=Math.min(Math.max(g,0),f),g=0<d?Math.ceil(g):Math.floor(g),c.css({top:g+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());g=
        +l*(b[0].scrollHeight-b.outerHeight());e&&(g=d,d=g/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),f),c.css({top:d+"px"}));b.scrollTop(g);b.trigger("slimscrolling",~~g);w();p()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+"px"});var a=u==b.outerHeight()?"none":"block";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0,
        +!0).fadeIn("fast"),a.railVisible&&m.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut("slow"),m.fadeOut("slow"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var q=b.scrollTop(),c=b.siblings("."+a.barClass),m=b.siblings("."+a.railClass);x();if(e.isPlainObject(f)){if("height"in f&&"auto"==f.height){b.parent().css("height","auto");b.css("height","auto");var h=b.parent().parent().height();b.parent().css("height",
        +h);b.css("height",h)}else"height"in f&&(h=f.height,b.parent().css("height",h),b.css("height",h));if("scrollTo"in f)q=parseInt(a.scrollTo);else if("scrollBy"in f)q+=parseInt(a.scrollBy);else if("destroy"in f){c.remove();m.remove();b.unwrap();return}n(q,!1,!0)}}else if(!(e.isPlainObject(f)&&"destroy"in f)){a.height="auto"==a.height?b.parent().height():a.height;q=e("<div></div>").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",
        +width:a.width,height:a.height});var m=e("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,
        +WebkitBorderRadius:a.borderRadius,zIndex:99}),h="right"==a.position?{right:a.distance}:{left:a.distance};m.css(h);c.css(h);b.wrap(q);b.parent().append(c);b.parent().append(m);a.railDraggable&&c.bind("mousedown",function(a){var b=e(document);z=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);n(0,c.position().top,!1)});b.bind("mouseup.slimscroll",function(a){z=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",
        +function(a){a.stopPropagation();a.preventDefault();return!1});m.hover(function(){w()},function(){p()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();p()},function(){r=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(n((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)});
        +x();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),n(0,!0)):"top"!==a.start&&(n(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);
        \ No newline at end of file
        diff --git a/bower_components/jquery-slimscroll/package.json b/bower_components/jquery-slimscroll/package.json
        new file mode 100644
        index 0000000000..147e92deff
        --- /dev/null
        +++ b/bower_components/jquery-slimscroll/package.json
        @@ -0,0 +1,32 @@
        +{
        +  "name"        : "jquery-slimscroll",
        +  "main"        : "jquery.slimscroll.js",
        +  "version"     : "1.3.8",
        +  "title"       : "jQuery slimScroll scrollbar",
        +  "description" : "slimScroll is a small jQuery plugin that transforms any div into a scrollable area. slimScroll doesn't occupy any visual space as it only appears on a user initiated mouse-over.",
        +  "keywords"    : ["scrollbar", "scroll", "slimscroll", "scrollable", "scrolling", "scroller", "ui", "jquery-plugin", "ecosystem:jquery"],
        +  "homepage"    : "http://rocha.la/jQuery-slimScroll/",
        +  "repository": {
        +    "type": "git",
        +    "url": "https://github.com/rochal/jQuery-slimScroll.git"
        +  },
        +  "author" : {
        +    "name"  : "Piotr Rochala",
        +    "url"   : "http://rocha.la/"
        +  },
        +
        +  "dependencies" : {
        +    "jquery" : ">= 1.7"
        +  },
        +
        +  "licenses" : [
        +    {
        +      "type": "MIT",
        +      "url": "http://www.opensource.org/licenses/mit-license.php"
        +    },
        +    {
        +      "type": "GPL",
        +      "url": "http://www.opensource.org/licenses/gpl-license.php"
        +    }
        +  ]
        +}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/.bower.json b/bower_components/jquery-ui/.bower.json
        new file mode 100644
        index 0000000000..d74dd89dbb
        --- /dev/null
        +++ b/bower_components/jquery-ui/.bower.json
        @@ -0,0 +1,23 @@
        +{
        +  "name": "jquery-ui",
        +  "version": "1.12.1",
        +  "main": [
        +    "jquery-ui.js"
        +  ],
        +  "ignore": [],
        +  "license": "MIT",
        +  "dependencies": {
        +    "jquery": ">=1.6"
        +  },
        +  "homepage": "https://github.com/components/jqueryui",
        +  "_release": "1.12.1",
        +  "_resolution": {
        +    "type": "version",
        +    "tag": "1.12.1",
        +    "commit": "44ecf3794cc56b65954cc19737234a3119d036cc"
        +  },
        +  "_source": "https://github.com/components/jqueryui.git",
        +  "_target": "^1.12.1",
        +  "_originalSource": "jquery-ui",
        +  "_direct": true
        +}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/.gitignore b/bower_components/jquery-ui/.gitignore
        new file mode 100644
        index 0000000000..cfcaf7a64a
        --- /dev/null
        +++ b/bower_components/jquery-ui/.gitignore
        @@ -0,0 +1,4 @@
        +components
        +composer.lock
        +vendor
        +.DS_Store
        diff --git a/bower_components/jquery-ui/README.md b/bower_components/jquery-ui/README.md
        new file mode 100644
        index 0000000000..749a76ec3d
        --- /dev/null
        +++ b/bower_components/jquery-ui/README.md
        @@ -0,0 +1,12 @@
        +jQuery UI
        +=========
        +
        +Shim [repository](https://github.com/components/jqueryui) for the [jQuery UI](https://jqueryui.com).
        +
        +Package Managers
        +----------------
        +
        +* [Bower](http://bower.io/): `jquery-ui`
        +* [Component](https://github.com/component/component): `components/jquery-ui`
        +* [Composer](http://packagist.org/packages/components/jquery): `components/jqueryui`
        +* [npm](https://www.npmjs.com/): `components-jqueryui`
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/bower.json b/bower_components/jquery-ui/bower.json
        new file mode 100644
        index 0000000000..965aba7b03
        --- /dev/null
        +++ b/bower_components/jquery-ui/bower.json
        @@ -0,0 +1,13 @@
        +{
        +  "name": "jquery-ui",
        +  "version": "1.12.1",
        +  "main": [
        +    "jquery-ui.js"
        +  ],
        +  "ignore": [
        +  ],
        +  "license": "MIT",
        +  "dependencies": {
        +    "jquery": ">=1.6"
        +  }
        +}
        diff --git a/bower_components/jquery-ui/component.json b/bower_components/jquery-ui/component.json
        new file mode 100644
        index 0000000000..25188ae755
        --- /dev/null
        +++ b/bower_components/jquery-ui/component.json
        @@ -0,0 +1,13 @@
        +{
        +  "name": "jquery-ui",
        +  "repo": "components/jqueryui",
        +  "version": "1.12.1",
        +  "license": "MIT",
        +  "scripts": [
        +    "jquery-ui.js"
        +  ],
        +  "main": "jquery-ui.js",
        +  "dependencies": {
        +    "components/jquery": "*"
        +  }
        +}
        diff --git a/bower_components/jquery-ui/composer.json b/bower_components/jquery-ui/composer.json
        new file mode 100644
        index 0000000000..cea9ab6582
        --- /dev/null
        +++ b/bower_components/jquery-ui/composer.json
        @@ -0,0 +1,69 @@
        +{
        +    "name": "components/jqueryui",
        +    "type": "component",
        +    "description": "jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.",
        +    "license": "MIT",
        +    "require": {
        +        "components/jquery": ">=1.6"
        +    },
        +    "authors": [
        +        {
        +            "name": "jQuery UI Team",
        +            "homepage": "http://jqueryui.com/about"
        +        },
        +        {
        +            "name": "Scott Gonzalez",
        +            "email": "scott.gonzalez@gmail.com",
        +            "homepage": "http://scottgonzalez.com"
        +        },
        +        {
        +            "name": "Joern Zaefferer",
        +            "email": "joern.zaefferer@gmail.com",
        +            "homepage": "http://bassistance.de"
        +        },
        +        {
        +            "name": "Kris Borchers",
        +            "email": "kris.borchers@gmail.com",
        +            "homepage": "http://krisborchers.com"
        +        },
        +        {
        +            "name": "Corey Frang",
        +            "email": "gnarf37@gmail.com",
        +            "homepage": "http://gnarf.net"
        +        },
        +        {
        +            "name": "Mike Sherov",
        +            "email": "mike.sherov@gmail.com",
        +            "homepage": "http://mike.sherov.com"
        +        },
        +        {
        +            "name": "TJ VanToll",
        +            "email": "tj.vantoll@gmail.com",
        +            "homepage": "http://tjvantoll.com"
        +        },
        +        {
        +            "name": "Felix Nagel",
        +            "email": "info@felixnagel.com",
        +            "homepage": "http://www.felixnagel.com"
        +        }
        +    ],
        +    "extra": {
        +        "component": {
        +            "name": "jquery-ui",
        +            "scripts": [
        +                "jquery-ui.js"
        +            ],
        +            "files": [
        +                "ui/**",
        +                "themes/**",
        +                "jquery-ui.min.js"
        +            ],
        +            "shim": {
        +                "deps": [
        +                    "jquery"
        +                ],
        +                "exports": "jQuery"
        +            }
        +        }
        +    }
        +}
        diff --git a/bower_components/jquery-ui/jquery-ui.js b/bower_components/jquery-ui/jquery-ui.js
        new file mode 100644
        index 0000000000..0213552372
        --- /dev/null
        +++ b/bower_components/jquery-ui/jquery-ui.js
        @@ -0,0 +1,18706 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +(function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define([ "jquery" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}(function( $ ) {
        +
        +$.ui = $.ui || {};
        +
        +var version = $.ui.version = "1.12.1";
        +
        +
        +/*!
        + * jQuery UI Widget 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Widget
        +//>>group: Core
        +//>>description: Provides a factory for creating stateful widgets with a common API.
        +//>>docs: http://api.jqueryui.com/jQuery.widget/
        +//>>demos: http://jqueryui.com/widget/
        +
        +
        +
        +var widgetUuid = 0;
        +var widgetSlice = Array.prototype.slice;
        +
        +$.cleanData = ( function( orig ) {
        +	return function( elems ) {
        +		var events, elem, i;
        +		for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
        +			try {
        +
        +				// Only trigger remove when necessary to save time
        +				events = $._data( elem, "events" );
        +				if ( events && events.remove ) {
        +					$( elem ).triggerHandler( "remove" );
        +				}
        +
        +			// Http://bugs.jquery.com/ticket/8235
        +			} catch ( e ) {}
        +		}
        +		orig( elems );
        +	};
        +} )( $.cleanData );
        +
        +$.widget = function( name, base, prototype ) {
        +	var existingConstructor, constructor, basePrototype;
        +
        +	// ProxiedPrototype allows the provided prototype to remain unmodified
        +	// so that it can be used as a mixin for multiple widgets (#8876)
        +	var proxiedPrototype = {};
        +
        +	var namespace = name.split( "." )[ 0 ];
        +	name = name.split( "." )[ 1 ];
        +	var fullName = namespace + "-" + name;
        +
        +	if ( !prototype ) {
        +		prototype = base;
        +		base = $.Widget;
        +	}
        +
        +	if ( $.isArray( prototype ) ) {
        +		prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
        +	}
        +
        +	// Create selector for plugin
        +	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
        +		return !!$.data( elem, fullName );
        +	};
        +
        +	$[ namespace ] = $[ namespace ] || {};
        +	existingConstructor = $[ namespace ][ name ];
        +	constructor = $[ namespace ][ name ] = function( options, element ) {
        +
        +		// Allow instantiation without "new" keyword
        +		if ( !this._createWidget ) {
        +			return new constructor( options, element );
        +		}
        +
        +		// Allow instantiation without initializing for simple inheritance
        +		// must use "new" keyword (the code above always passes args)
        +		if ( arguments.length ) {
        +			this._createWidget( options, element );
        +		}
        +	};
        +
        +	// Extend with the existing constructor to carry over any static properties
        +	$.extend( constructor, existingConstructor, {
        +		version: prototype.version,
        +
        +		// Copy the object used to create the prototype in case we need to
        +		// redefine the widget later
        +		_proto: $.extend( {}, prototype ),
        +
        +		// Track widgets that inherit from this widget in case this widget is
        +		// redefined after a widget inherits from it
        +		_childConstructors: []
        +	} );
        +
        +	basePrototype = new base();
        +
        +	// We need to make the options hash a property directly on the new instance
        +	// otherwise we'll modify the options hash on the prototype that we're
        +	// inheriting from
        +	basePrototype.options = $.widget.extend( {}, basePrototype.options );
        +	$.each( prototype, function( prop, value ) {
        +		if ( !$.isFunction( value ) ) {
        +			proxiedPrototype[ prop ] = value;
        +			return;
        +		}
        +		proxiedPrototype[ prop ] = ( function() {
        +			function _super() {
        +				return base.prototype[ prop ].apply( this, arguments );
        +			}
        +
        +			function _superApply( args ) {
        +				return base.prototype[ prop ].apply( this, args );
        +			}
        +
        +			return function() {
        +				var __super = this._super;
        +				var __superApply = this._superApply;
        +				var returnValue;
        +
        +				this._super = _super;
        +				this._superApply = _superApply;
        +
        +				returnValue = value.apply( this, arguments );
        +
        +				this._super = __super;
        +				this._superApply = __superApply;
        +
        +				return returnValue;
        +			};
        +		} )();
        +	} );
        +	constructor.prototype = $.widget.extend( basePrototype, {
        +
        +		// TODO: remove support for widgetEventPrefix
        +		// always use the name + a colon as the prefix, e.g., draggable:start
        +		// don't prefix for widgets that aren't DOM-based
        +		widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
        +	}, proxiedPrototype, {
        +		constructor: constructor,
        +		namespace: namespace,
        +		widgetName: name,
        +		widgetFullName: fullName
        +	} );
        +
        +	// If this widget is being redefined then we need to find all widgets that
        +	// are inheriting from it and redefine all of them so that they inherit from
        +	// the new version of this widget. We're essentially trying to replace one
        +	// level in the prototype chain.
        +	if ( existingConstructor ) {
        +		$.each( existingConstructor._childConstructors, function( i, child ) {
        +			var childPrototype = child.prototype;
        +
        +			// Redefine the child widget using the same prototype that was
        +			// originally used, but inherit from the new version of the base
        +			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
        +				child._proto );
        +		} );
        +
        +		// Remove the list of existing child constructors from the old constructor
        +		// so the old child constructors can be garbage collected
        +		delete existingConstructor._childConstructors;
        +	} else {
        +		base._childConstructors.push( constructor );
        +	}
        +
        +	$.widget.bridge( name, constructor );
        +
        +	return constructor;
        +};
        +
        +$.widget.extend = function( target ) {
        +	var input = widgetSlice.call( arguments, 1 );
        +	var inputIndex = 0;
        +	var inputLength = input.length;
        +	var key;
        +	var value;
        +
        +	for ( ; inputIndex < inputLength; inputIndex++ ) {
        +		for ( key in input[ inputIndex ] ) {
        +			value = input[ inputIndex ][ key ];
        +			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
        +
        +				// Clone objects
        +				if ( $.isPlainObject( value ) ) {
        +					target[ key ] = $.isPlainObject( target[ key ] ) ?
        +						$.widget.extend( {}, target[ key ], value ) :
        +
        +						// Don't extend strings, arrays, etc. with objects
        +						$.widget.extend( {}, value );
        +
        +				// Copy everything else by reference
        +				} else {
        +					target[ key ] = value;
        +				}
        +			}
        +		}
        +	}
        +	return target;
        +};
        +
        +$.widget.bridge = function( name, object ) {
        +	var fullName = object.prototype.widgetFullName || name;
        +	$.fn[ name ] = function( options ) {
        +		var isMethodCall = typeof options === "string";
        +		var args = widgetSlice.call( arguments, 1 );
        +		var returnValue = this;
        +
        +		if ( isMethodCall ) {
        +
        +			// If this is an empty collection, we need to have the instance method
        +			// return undefined instead of the jQuery instance
        +			if ( !this.length && options === "instance" ) {
        +				returnValue = undefined;
        +			} else {
        +				this.each( function() {
        +					var methodValue;
        +					var instance = $.data( this, fullName );
        +
        +					if ( options === "instance" ) {
        +						returnValue = instance;
        +						return false;
        +					}
        +
        +					if ( !instance ) {
        +						return $.error( "cannot call methods on " + name +
        +							" prior to initialization; " +
        +							"attempted to call method '" + options + "'" );
        +					}
        +
        +					if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
        +						return $.error( "no such method '" + options + "' for " + name +
        +							" widget instance" );
        +					}
        +
        +					methodValue = instance[ options ].apply( instance, args );
        +
        +					if ( methodValue !== instance && methodValue !== undefined ) {
        +						returnValue = methodValue && methodValue.jquery ?
        +							returnValue.pushStack( methodValue.get() ) :
        +							methodValue;
        +						return false;
        +					}
        +				} );
        +			}
        +		} else {
        +
        +			// Allow multiple hashes to be passed on init
        +			if ( args.length ) {
        +				options = $.widget.extend.apply( null, [ options ].concat( args ) );
        +			}
        +
        +			this.each( function() {
        +				var instance = $.data( this, fullName );
        +				if ( instance ) {
        +					instance.option( options || {} );
        +					if ( instance._init ) {
        +						instance._init();
        +					}
        +				} else {
        +					$.data( this, fullName, new object( options, this ) );
        +				}
        +			} );
        +		}
        +
        +		return returnValue;
        +	};
        +};
        +
        +$.Widget = function( /* options, element */ ) {};
        +$.Widget._childConstructors = [];
        +
        +$.Widget.prototype = {
        +	widgetName: "widget",
        +	widgetEventPrefix: "",
        +	defaultElement: "<div>",
        +
        +	options: {
        +		classes: {},
        +		disabled: false,
        +
        +		// Callbacks
        +		create: null
        +	},
        +
        +	_createWidget: function( options, element ) {
        +		element = $( element || this.defaultElement || this )[ 0 ];
        +		this.element = $( element );
        +		this.uuid = widgetUuid++;
        +		this.eventNamespace = "." + this.widgetName + this.uuid;
        +
        +		this.bindings = $();
        +		this.hoverable = $();
        +		this.focusable = $();
        +		this.classesElementLookup = {};
        +
        +		if ( element !== this ) {
        +			$.data( element, this.widgetFullName, this );
        +			this._on( true, this.element, {
        +				remove: function( event ) {
        +					if ( event.target === element ) {
        +						this.destroy();
        +					}
        +				}
        +			} );
        +			this.document = $( element.style ?
        +
        +				// Element within the document
        +				element.ownerDocument :
        +
        +				// Element is window or document
        +				element.document || element );
        +			this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
        +		}
        +
        +		this.options = $.widget.extend( {},
        +			this.options,
        +			this._getCreateOptions(),
        +			options );
        +
        +		this._create();
        +
        +		if ( this.options.disabled ) {
        +			this._setOptionDisabled( this.options.disabled );
        +		}
        +
        +		this._trigger( "create", null, this._getCreateEventData() );
        +		this._init();
        +	},
        +
        +	_getCreateOptions: function() {
        +		return {};
        +	},
        +
        +	_getCreateEventData: $.noop,
        +
        +	_create: $.noop,
        +
        +	_init: $.noop,
        +
        +	destroy: function() {
        +		var that = this;
        +
        +		this._destroy();
        +		$.each( this.classesElementLookup, function( key, value ) {
        +			that._removeClass( value, key );
        +		} );
        +
        +		// We can probably remove the unbind calls in 2.0
        +		// all event bindings should go through this._on()
        +		this.element
        +			.off( this.eventNamespace )
        +			.removeData( this.widgetFullName );
        +		this.widget()
        +			.off( this.eventNamespace )
        +			.removeAttr( "aria-disabled" );
        +
        +		// Clean up events and states
        +		this.bindings.off( this.eventNamespace );
        +	},
        +
        +	_destroy: $.noop,
        +
        +	widget: function() {
        +		return this.element;
        +	},
        +
        +	option: function( key, value ) {
        +		var options = key;
        +		var parts;
        +		var curOption;
        +		var i;
        +
        +		if ( arguments.length === 0 ) {
        +
        +			// Don't return a reference to the internal hash
        +			return $.widget.extend( {}, this.options );
        +		}
        +
        +		if ( typeof key === "string" ) {
        +
        +			// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
        +			options = {};
        +			parts = key.split( "." );
        +			key = parts.shift();
        +			if ( parts.length ) {
        +				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
        +				for ( i = 0; i < parts.length - 1; i++ ) {
        +					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
        +					curOption = curOption[ parts[ i ] ];
        +				}
        +				key = parts.pop();
        +				if ( arguments.length === 1 ) {
        +					return curOption[ key ] === undefined ? null : curOption[ key ];
        +				}
        +				curOption[ key ] = value;
        +			} else {
        +				if ( arguments.length === 1 ) {
        +					return this.options[ key ] === undefined ? null : this.options[ key ];
        +				}
        +				options[ key ] = value;
        +			}
        +		}
        +
        +		this._setOptions( options );
        +
        +		return this;
        +	},
        +
        +	_setOptions: function( options ) {
        +		var key;
        +
        +		for ( key in options ) {
        +			this._setOption( key, options[ key ] );
        +		}
        +
        +		return this;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "classes" ) {
        +			this._setOptionClasses( value );
        +		}
        +
        +		this.options[ key ] = value;
        +
        +		if ( key === "disabled" ) {
        +			this._setOptionDisabled( value );
        +		}
        +
        +		return this;
        +	},
        +
        +	_setOptionClasses: function( value ) {
        +		var classKey, elements, currentElements;
        +
        +		for ( classKey in value ) {
        +			currentElements = this.classesElementLookup[ classKey ];
        +			if ( value[ classKey ] === this.options.classes[ classKey ] ||
        +					!currentElements ||
        +					!currentElements.length ) {
        +				continue;
        +			}
        +
        +			// We are doing this to create a new jQuery object because the _removeClass() call
        +			// on the next line is going to destroy the reference to the current elements being
        +			// tracked. We need to save a copy of this collection so that we can add the new classes
        +			// below.
        +			elements = $( currentElements.get() );
        +			this._removeClass( currentElements, classKey );
        +
        +			// We don't use _addClass() here, because that uses this.options.classes
        +			// for generating the string of classes. We want to use the value passed in from
        +			// _setOption(), this is the new value of the classes option which was passed to
        +			// _setOption(). We pass this value directly to _classes().
        +			elements.addClass( this._classes( {
        +				element: elements,
        +				keys: classKey,
        +				classes: value,
        +				add: true
        +			} ) );
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
        +
        +		// If the widget is becoming disabled, then nothing is interactive
        +		if ( value ) {
        +			this._removeClass( this.hoverable, null, "ui-state-hover" );
        +			this._removeClass( this.focusable, null, "ui-state-focus" );
        +		}
        +	},
        +
        +	enable: function() {
        +		return this._setOptions( { disabled: false } );
        +	},
        +
        +	disable: function() {
        +		return this._setOptions( { disabled: true } );
        +	},
        +
        +	_classes: function( options ) {
        +		var full = [];
        +		var that = this;
        +
        +		options = $.extend( {
        +			element: this.element,
        +			classes: this.options.classes || {}
        +		}, options );
        +
        +		function processClassString( classes, checkOption ) {
        +			var current, i;
        +			for ( i = 0; i < classes.length; i++ ) {
        +				current = that.classesElementLookup[ classes[ i ] ] || $();
        +				if ( options.add ) {
        +					current = $( $.unique( current.get().concat( options.element.get() ) ) );
        +				} else {
        +					current = $( current.not( options.element ).get() );
        +				}
        +				that.classesElementLookup[ classes[ i ] ] = current;
        +				full.push( classes[ i ] );
        +				if ( checkOption && options.classes[ classes[ i ] ] ) {
        +					full.push( options.classes[ classes[ i ] ] );
        +				}
        +			}
        +		}
        +
        +		this._on( options.element, {
        +			"remove": "_untrackClassesElement"
        +		} );
        +
        +		if ( options.keys ) {
        +			processClassString( options.keys.match( /\S+/g ) || [], true );
        +		}
        +		if ( options.extra ) {
        +			processClassString( options.extra.match( /\S+/g ) || [] );
        +		}
        +
        +		return full.join( " " );
        +	},
        +
        +	_untrackClassesElement: function( event ) {
        +		var that = this;
        +		$.each( that.classesElementLookup, function( key, value ) {
        +			if ( $.inArray( event.target, value ) !== -1 ) {
        +				that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
        +			}
        +		} );
        +	},
        +
        +	_removeClass: function( element, keys, extra ) {
        +		return this._toggleClass( element, keys, extra, false );
        +	},
        +
        +	_addClass: function( element, keys, extra ) {
        +		return this._toggleClass( element, keys, extra, true );
        +	},
        +
        +	_toggleClass: function( element, keys, extra, add ) {
        +		add = ( typeof add === "boolean" ) ? add : extra;
        +		var shift = ( typeof element === "string" || element === null ),
        +			options = {
        +				extra: shift ? keys : extra,
        +				keys: shift ? element : keys,
        +				element: shift ? this.element : element,
        +				add: add
        +			};
        +		options.element.toggleClass( this._classes( options ), add );
        +		return this;
        +	},
        +
        +	_on: function( suppressDisabledCheck, element, handlers ) {
        +		var delegateElement;
        +		var instance = this;
        +
        +		// No suppressDisabledCheck flag, shuffle arguments
        +		if ( typeof suppressDisabledCheck !== "boolean" ) {
        +			handlers = element;
        +			element = suppressDisabledCheck;
        +			suppressDisabledCheck = false;
        +		}
        +
        +		// No element argument, shuffle and use this.element
        +		if ( !handlers ) {
        +			handlers = element;
        +			element = this.element;
        +			delegateElement = this.widget();
        +		} else {
        +			element = delegateElement = $( element );
        +			this.bindings = this.bindings.add( element );
        +		}
        +
        +		$.each( handlers, function( event, handler ) {
        +			function handlerProxy() {
        +
        +				// Allow widgets to customize the disabled handling
        +				// - disabled as an array instead of boolean
        +				// - disabled class as method for disabling individual parts
        +				if ( !suppressDisabledCheck &&
        +						( instance.options.disabled === true ||
        +						$( this ).hasClass( "ui-state-disabled" ) ) ) {
        +					return;
        +				}
        +				return ( typeof handler === "string" ? instance[ handler ] : handler )
        +					.apply( instance, arguments );
        +			}
        +
        +			// Copy the guid so direct unbinding works
        +			if ( typeof handler !== "string" ) {
        +				handlerProxy.guid = handler.guid =
        +					handler.guid || handlerProxy.guid || $.guid++;
        +			}
        +
        +			var match = event.match( /^([\w:-]*)\s*(.*)$/ );
        +			var eventName = match[ 1 ] + instance.eventNamespace;
        +			var selector = match[ 2 ];
        +
        +			if ( selector ) {
        +				delegateElement.on( eventName, selector, handlerProxy );
        +			} else {
        +				element.on( eventName, handlerProxy );
        +			}
        +		} );
        +	},
        +
        +	_off: function( element, eventName ) {
        +		eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
        +			this.eventNamespace;
        +		element.off( eventName ).off( eventName );
        +
        +		// Clear the stack to avoid memory leaks (#10056)
        +		this.bindings = $( this.bindings.not( element ).get() );
        +		this.focusable = $( this.focusable.not( element ).get() );
        +		this.hoverable = $( this.hoverable.not( element ).get() );
        +	},
        +
        +	_delay: function( handler, delay ) {
        +		function handlerProxy() {
        +			return ( typeof handler === "string" ? instance[ handler ] : handler )
        +				.apply( instance, arguments );
        +		}
        +		var instance = this;
        +		return setTimeout( handlerProxy, delay || 0 );
        +	},
        +
        +	_hoverable: function( element ) {
        +		this.hoverable = this.hoverable.add( element );
        +		this._on( element, {
        +			mouseenter: function( event ) {
        +				this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
        +			},
        +			mouseleave: function( event ) {
        +				this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
        +			}
        +		} );
        +	},
        +
        +	_focusable: function( element ) {
        +		this.focusable = this.focusable.add( element );
        +		this._on( element, {
        +			focusin: function( event ) {
        +				this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
        +			},
        +			focusout: function( event ) {
        +				this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
        +			}
        +		} );
        +	},
        +
        +	_trigger: function( type, event, data ) {
        +		var prop, orig;
        +		var callback = this.options[ type ];
        +
        +		data = data || {};
        +		event = $.Event( event );
        +		event.type = ( type === this.widgetEventPrefix ?
        +			type :
        +			this.widgetEventPrefix + type ).toLowerCase();
        +
        +		// The original event may come from any element
        +		// so we need to reset the target on the new event
        +		event.target = this.element[ 0 ];
        +
        +		// Copy original event properties over to the new event
        +		orig = event.originalEvent;
        +		if ( orig ) {
        +			for ( prop in orig ) {
        +				if ( !( prop in event ) ) {
        +					event[ prop ] = orig[ prop ];
        +				}
        +			}
        +		}
        +
        +		this.element.trigger( event, data );
        +		return !( $.isFunction( callback ) &&
        +			callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
        +			event.isDefaultPrevented() );
        +	}
        +};
        +
        +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
        +	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
        +		if ( typeof options === "string" ) {
        +			options = { effect: options };
        +		}
        +
        +		var hasOptions;
        +		var effectName = !options ?
        +			method :
        +			options === true || typeof options === "number" ?
        +				defaultEffect :
        +				options.effect || defaultEffect;
        +
        +		options = options || {};
        +		if ( typeof options === "number" ) {
        +			options = { duration: options };
        +		}
        +
        +		hasOptions = !$.isEmptyObject( options );
        +		options.complete = callback;
        +
        +		if ( options.delay ) {
        +			element.delay( options.delay );
        +		}
        +
        +		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
        +			element[ method ]( options );
        +		} else if ( effectName !== method && element[ effectName ] ) {
        +			element[ effectName ]( options.duration, options.easing, callback );
        +		} else {
        +			element.queue( function( next ) {
        +				$( this )[ method ]();
        +				if ( callback ) {
        +					callback.call( element[ 0 ] );
        +				}
        +				next();
        +			} );
        +		}
        +	};
        +} );
        +
        +var widget = $.widget;
        +
        +
        +/*!
        + * jQuery UI Position 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/position/
        + */
        +
        +//>>label: Position
        +//>>group: Core
        +//>>description: Positions elements relative to other elements.
        +//>>docs: http://api.jqueryui.com/position/
        +//>>demos: http://jqueryui.com/position/
        +
        +
        +( function() {
        +var cachedScrollbarWidth,
        +	max = Math.max,
        +	abs = Math.abs,
        +	rhorizontal = /left|center|right/,
        +	rvertical = /top|center|bottom/,
        +	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
        +	rposition = /^\w+/,
        +	rpercent = /%$/,
        +	_position = $.fn.position;
        +
        +function getOffsets( offsets, width, height ) {
        +	return [
        +		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
        +		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
        +	];
        +}
        +
        +function parseCss( element, property ) {
        +	return parseInt( $.css( element, property ), 10 ) || 0;
        +}
        +
        +function getDimensions( elem ) {
        +	var raw = elem[ 0 ];
        +	if ( raw.nodeType === 9 ) {
        +		return {
        +			width: elem.width(),
        +			height: elem.height(),
        +			offset: { top: 0, left: 0 }
        +		};
        +	}
        +	if ( $.isWindow( raw ) ) {
        +		return {
        +			width: elem.width(),
        +			height: elem.height(),
        +			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
        +		};
        +	}
        +	if ( raw.preventDefault ) {
        +		return {
        +			width: 0,
        +			height: 0,
        +			offset: { top: raw.pageY, left: raw.pageX }
        +		};
        +	}
        +	return {
        +		width: elem.outerWidth(),
        +		height: elem.outerHeight(),
        +		offset: elem.offset()
        +	};
        +}
        +
        +$.position = {
        +	scrollbarWidth: function() {
        +		if ( cachedScrollbarWidth !== undefined ) {
        +			return cachedScrollbarWidth;
        +		}
        +		var w1, w2,
        +			div = $( "<div " +
        +				"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
        +				"<div style='height:100px;width:auto;'></div></div>" ),
        +			innerDiv = div.children()[ 0 ];
        +
        +		$( "body" ).append( div );
        +		w1 = innerDiv.offsetWidth;
        +		div.css( "overflow", "scroll" );
        +
        +		w2 = innerDiv.offsetWidth;
        +
        +		if ( w1 === w2 ) {
        +			w2 = div[ 0 ].clientWidth;
        +		}
        +
        +		div.remove();
        +
        +		return ( cachedScrollbarWidth = w1 - w2 );
        +	},
        +	getScrollInfo: function( within ) {
        +		var overflowX = within.isWindow || within.isDocument ? "" :
        +				within.element.css( "overflow-x" ),
        +			overflowY = within.isWindow || within.isDocument ? "" :
        +				within.element.css( "overflow-y" ),
        +			hasOverflowX = overflowX === "scroll" ||
        +				( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
        +			hasOverflowY = overflowY === "scroll" ||
        +				( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
        +		return {
        +			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
        +			height: hasOverflowX ? $.position.scrollbarWidth() : 0
        +		};
        +	},
        +	getWithinInfo: function( element ) {
        +		var withinElement = $( element || window ),
        +			isWindow = $.isWindow( withinElement[ 0 ] ),
        +			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
        +			hasOffset = !isWindow && !isDocument;
        +		return {
        +			element: withinElement,
        +			isWindow: isWindow,
        +			isDocument: isDocument,
        +			offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
        +			scrollLeft: withinElement.scrollLeft(),
        +			scrollTop: withinElement.scrollTop(),
        +			width: withinElement.outerWidth(),
        +			height: withinElement.outerHeight()
        +		};
        +	}
        +};
        +
        +$.fn.position = function( options ) {
        +	if ( !options || !options.of ) {
        +		return _position.apply( this, arguments );
        +	}
        +
        +	// Make a copy, we don't want to modify arguments
        +	options = $.extend( {}, options );
        +
        +	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
        +		target = $( options.of ),
        +		within = $.position.getWithinInfo( options.within ),
        +		scrollInfo = $.position.getScrollInfo( within ),
        +		collision = ( options.collision || "flip" ).split( " " ),
        +		offsets = {};
        +
        +	dimensions = getDimensions( target );
        +	if ( target[ 0 ].preventDefault ) {
        +
        +		// Force left top to allow flipping
        +		options.at = "left top";
        +	}
        +	targetWidth = dimensions.width;
        +	targetHeight = dimensions.height;
        +	targetOffset = dimensions.offset;
        +
        +	// Clone to reuse original targetOffset later
        +	basePosition = $.extend( {}, targetOffset );
        +
        +	// Force my and at to have valid horizontal and vertical positions
        +	// if a value is missing or invalid, it will be converted to center
        +	$.each( [ "my", "at" ], function() {
        +		var pos = ( options[ this ] || "" ).split( " " ),
        +			horizontalOffset,
        +			verticalOffset;
        +
        +		if ( pos.length === 1 ) {
        +			pos = rhorizontal.test( pos[ 0 ] ) ?
        +				pos.concat( [ "center" ] ) :
        +				rvertical.test( pos[ 0 ] ) ?
        +					[ "center" ].concat( pos ) :
        +					[ "center", "center" ];
        +		}
        +		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
        +		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
        +
        +		// Calculate offsets
        +		horizontalOffset = roffset.exec( pos[ 0 ] );
        +		verticalOffset = roffset.exec( pos[ 1 ] );
        +		offsets[ this ] = [
        +			horizontalOffset ? horizontalOffset[ 0 ] : 0,
        +			verticalOffset ? verticalOffset[ 0 ] : 0
        +		];
        +
        +		// Reduce to just the positions without the offsets
        +		options[ this ] = [
        +			rposition.exec( pos[ 0 ] )[ 0 ],
        +			rposition.exec( pos[ 1 ] )[ 0 ]
        +		];
        +	} );
        +
        +	// Normalize collision option
        +	if ( collision.length === 1 ) {
        +		collision[ 1 ] = collision[ 0 ];
        +	}
        +
        +	if ( options.at[ 0 ] === "right" ) {
        +		basePosition.left += targetWidth;
        +	} else if ( options.at[ 0 ] === "center" ) {
        +		basePosition.left += targetWidth / 2;
        +	}
        +
        +	if ( options.at[ 1 ] === "bottom" ) {
        +		basePosition.top += targetHeight;
        +	} else if ( options.at[ 1 ] === "center" ) {
        +		basePosition.top += targetHeight / 2;
        +	}
        +
        +	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
        +	basePosition.left += atOffset[ 0 ];
        +	basePosition.top += atOffset[ 1 ];
        +
        +	return this.each( function() {
        +		var collisionPosition, using,
        +			elem = $( this ),
        +			elemWidth = elem.outerWidth(),
        +			elemHeight = elem.outerHeight(),
        +			marginLeft = parseCss( this, "marginLeft" ),
        +			marginTop = parseCss( this, "marginTop" ),
        +			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
        +				scrollInfo.width,
        +			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
        +				scrollInfo.height,
        +			position = $.extend( {}, basePosition ),
        +			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
        +
        +		if ( options.my[ 0 ] === "right" ) {
        +			position.left -= elemWidth;
        +		} else if ( options.my[ 0 ] === "center" ) {
        +			position.left -= elemWidth / 2;
        +		}
        +
        +		if ( options.my[ 1 ] === "bottom" ) {
        +			position.top -= elemHeight;
        +		} else if ( options.my[ 1 ] === "center" ) {
        +			position.top -= elemHeight / 2;
        +		}
        +
        +		position.left += myOffset[ 0 ];
        +		position.top += myOffset[ 1 ];
        +
        +		collisionPosition = {
        +			marginLeft: marginLeft,
        +			marginTop: marginTop
        +		};
        +
        +		$.each( [ "left", "top" ], function( i, dir ) {
        +			if ( $.ui.position[ collision[ i ] ] ) {
        +				$.ui.position[ collision[ i ] ][ dir ]( position, {
        +					targetWidth: targetWidth,
        +					targetHeight: targetHeight,
        +					elemWidth: elemWidth,
        +					elemHeight: elemHeight,
        +					collisionPosition: collisionPosition,
        +					collisionWidth: collisionWidth,
        +					collisionHeight: collisionHeight,
        +					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
        +					my: options.my,
        +					at: options.at,
        +					within: within,
        +					elem: elem
        +				} );
        +			}
        +		} );
        +
        +		if ( options.using ) {
        +
        +			// Adds feedback as second argument to using callback, if present
        +			using = function( props ) {
        +				var left = targetOffset.left - position.left,
        +					right = left + targetWidth - elemWidth,
        +					top = targetOffset.top - position.top,
        +					bottom = top + targetHeight - elemHeight,
        +					feedback = {
        +						target: {
        +							element: target,
        +							left: targetOffset.left,
        +							top: targetOffset.top,
        +							width: targetWidth,
        +							height: targetHeight
        +						},
        +						element: {
        +							element: elem,
        +							left: position.left,
        +							top: position.top,
        +							width: elemWidth,
        +							height: elemHeight
        +						},
        +						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
        +						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
        +					};
        +				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
        +					feedback.horizontal = "center";
        +				}
        +				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
        +					feedback.vertical = "middle";
        +				}
        +				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
        +					feedback.important = "horizontal";
        +				} else {
        +					feedback.important = "vertical";
        +				}
        +				options.using.call( this, props, feedback );
        +			};
        +		}
        +
        +		elem.offset( $.extend( position, { using: using } ) );
        +	} );
        +};
        +
        +$.ui.position = {
        +	fit: {
        +		left: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
        +				outerWidth = within.width,
        +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        +				overLeft = withinOffset - collisionPosLeft,
        +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
        +				newOverRight;
        +
        +			// Element is wider than within
        +			if ( data.collisionWidth > outerWidth ) {
        +
        +				// Element is initially over the left side of within
        +				if ( overLeft > 0 && overRight <= 0 ) {
        +					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
        +						withinOffset;
        +					position.left += overLeft - newOverRight;
        +
        +				// Element is initially over right side of within
        +				} else if ( overRight > 0 && overLeft <= 0 ) {
        +					position.left = withinOffset;
        +
        +				// Element is initially over both left and right sides of within
        +				} else {
        +					if ( overLeft > overRight ) {
        +						position.left = withinOffset + outerWidth - data.collisionWidth;
        +					} else {
        +						position.left = withinOffset;
        +					}
        +				}
        +
        +			// Too far left -> align with left edge
        +			} else if ( overLeft > 0 ) {
        +				position.left += overLeft;
        +
        +			// Too far right -> align with right edge
        +			} else if ( overRight > 0 ) {
        +				position.left -= overRight;
        +
        +			// Adjust based on position and margin
        +			} else {
        +				position.left = max( position.left - collisionPosLeft, position.left );
        +			}
        +		},
        +		top: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
        +				outerHeight = data.within.height,
        +				collisionPosTop = position.top - data.collisionPosition.marginTop,
        +				overTop = withinOffset - collisionPosTop,
        +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
        +				newOverBottom;
        +
        +			// Element is taller than within
        +			if ( data.collisionHeight > outerHeight ) {
        +
        +				// Element is initially over the top of within
        +				if ( overTop > 0 && overBottom <= 0 ) {
        +					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
        +						withinOffset;
        +					position.top += overTop - newOverBottom;
        +
        +				// Element is initially over bottom of within
        +				} else if ( overBottom > 0 && overTop <= 0 ) {
        +					position.top = withinOffset;
        +
        +				// Element is initially over both top and bottom of within
        +				} else {
        +					if ( overTop > overBottom ) {
        +						position.top = withinOffset + outerHeight - data.collisionHeight;
        +					} else {
        +						position.top = withinOffset;
        +					}
        +				}
        +
        +			// Too far up -> align with top
        +			} else if ( overTop > 0 ) {
        +				position.top += overTop;
        +
        +			// Too far down -> align with bottom edge
        +			} else if ( overBottom > 0 ) {
        +				position.top -= overBottom;
        +
        +			// Adjust based on position and margin
        +			} else {
        +				position.top = max( position.top - collisionPosTop, position.top );
        +			}
        +		}
        +	},
        +	flip: {
        +		left: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.offset.left + within.scrollLeft,
        +				outerWidth = within.width,
        +				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
        +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        +				overLeft = collisionPosLeft - offsetLeft,
        +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
        +				myOffset = data.my[ 0 ] === "left" ?
        +					-data.elemWidth :
        +					data.my[ 0 ] === "right" ?
        +						data.elemWidth :
        +						0,
        +				atOffset = data.at[ 0 ] === "left" ?
        +					data.targetWidth :
        +					data.at[ 0 ] === "right" ?
        +						-data.targetWidth :
        +						0,
        +				offset = -2 * data.offset[ 0 ],
        +				newOverRight,
        +				newOverLeft;
        +
        +			if ( overLeft < 0 ) {
        +				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
        +					outerWidth - withinOffset;
        +				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
        +					position.left += myOffset + atOffset + offset;
        +				}
        +			} else if ( overRight > 0 ) {
        +				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
        +					atOffset + offset - offsetLeft;
        +				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
        +					position.left += myOffset + atOffset + offset;
        +				}
        +			}
        +		},
        +		top: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.offset.top + within.scrollTop,
        +				outerHeight = within.height,
        +				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
        +				collisionPosTop = position.top - data.collisionPosition.marginTop,
        +				overTop = collisionPosTop - offsetTop,
        +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
        +				top = data.my[ 1 ] === "top",
        +				myOffset = top ?
        +					-data.elemHeight :
        +					data.my[ 1 ] === "bottom" ?
        +						data.elemHeight :
        +						0,
        +				atOffset = data.at[ 1 ] === "top" ?
        +					data.targetHeight :
        +					data.at[ 1 ] === "bottom" ?
        +						-data.targetHeight :
        +						0,
        +				offset = -2 * data.offset[ 1 ],
        +				newOverTop,
        +				newOverBottom;
        +			if ( overTop < 0 ) {
        +				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
        +					outerHeight - withinOffset;
        +				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
        +					position.top += myOffset + atOffset + offset;
        +				}
        +			} else if ( overBottom > 0 ) {
        +				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
        +					offset - offsetTop;
        +				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
        +					position.top += myOffset + atOffset + offset;
        +				}
        +			}
        +		}
        +	},
        +	flipfit: {
        +		left: function() {
        +			$.ui.position.flip.left.apply( this, arguments );
        +			$.ui.position.fit.left.apply( this, arguments );
        +		},
        +		top: function() {
        +			$.ui.position.flip.top.apply( this, arguments );
        +			$.ui.position.fit.top.apply( this, arguments );
        +		}
        +	}
        +};
        +
        +} )();
        +
        +var position = $.ui.position;
        +
        +
        +/*!
        + * jQuery UI :data 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: :data Selector
        +//>>group: Core
        +//>>description: Selects elements which have data stored under the specified key.
        +//>>docs: http://api.jqueryui.com/data-selector/
        +
        +
        +var data = $.extend( $.expr[ ":" ], {
        +	data: $.expr.createPseudo ?
        +		$.expr.createPseudo( function( dataName ) {
        +			return function( elem ) {
        +				return !!$.data( elem, dataName );
        +			};
        +		} ) :
        +
        +		// Support: jQuery <1.8
        +		function( elem, i, match ) {
        +			return !!$.data( elem, match[ 3 ] );
        +		}
        +} );
        +
        +/*!
        + * jQuery UI Disable Selection 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: disableSelection
        +//>>group: Core
        +//>>description: Disable selection of text content within the set of matched elements.
        +//>>docs: http://api.jqueryui.com/disableSelection/
        +
        +// This file is deprecated
        +
        +
        +var disableSelection = $.fn.extend( {
        +	disableSelection: ( function() {
        +		var eventType = "onselectstart" in document.createElement( "div" ) ?
        +			"selectstart" :
        +			"mousedown";
        +
        +		return function() {
        +			return this.on( eventType + ".ui-disableSelection", function( event ) {
        +				event.preventDefault();
        +			} );
        +		};
        +	} )(),
        +
        +	enableSelection: function() {
        +		return this.off( ".ui-disableSelection" );
        +	}
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Effects Core
        +//>>group: Effects
        +// jscs:disable maximumLineLength
        +//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/category/effects-core/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var dataSpace = "ui-effects-",
        +	dataSpaceStyle = "ui-effects-style",
        +	dataSpaceAnimated = "ui-effects-animated",
        +
        +	// Create a local jQuery because jQuery Color relies on it and the
        +	// global may not exist with AMD and a custom build (#10199)
        +	jQuery = $;
        +
        +$.effects = {
        +	effect: {}
        +};
        +
        +/*!
        + * jQuery Color Animations v2.1.2
        + * https://github.com/jquery/jquery-color
        + *
        + * Copyright 2014 jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * Date: Wed Jan 16 08:47:09 2013 -0600
        + */
        +( function( jQuery, undefined ) {
        +
        +	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
        +		"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
        +
        +	// Plusequals test for += 100 -= 100
        +	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
        +
        +	// A set of RE's that can match strings and generate color tuples.
        +	stringParsers = [ {
        +			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        +			parse: function( execResult ) {
        +				return [
        +					execResult[ 1 ],
        +					execResult[ 2 ],
        +					execResult[ 3 ],
        +					execResult[ 4 ]
        +				];
        +			}
        +		}, {
        +			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        +			parse: function( execResult ) {
        +				return [
        +					execResult[ 1 ] * 2.55,
        +					execResult[ 2 ] * 2.55,
        +					execResult[ 3 ] * 2.55,
        +					execResult[ 4 ]
        +				];
        +			}
        +		}, {
        +
        +			// This regex ignores A-F because it's compared against an already lowercased string
        +			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
        +			parse: function( execResult ) {
        +				return [
        +					parseInt( execResult[ 1 ], 16 ),
        +					parseInt( execResult[ 2 ], 16 ),
        +					parseInt( execResult[ 3 ], 16 )
        +				];
        +			}
        +		}, {
        +
        +			// This regex ignores A-F because it's compared against an already lowercased string
        +			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
        +			parse: function( execResult ) {
        +				return [
        +					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
        +					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
        +					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
        +				];
        +			}
        +		}, {
        +			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        +			space: "hsla",
        +			parse: function( execResult ) {
        +				return [
        +					execResult[ 1 ],
        +					execResult[ 2 ] / 100,
        +					execResult[ 3 ] / 100,
        +					execResult[ 4 ]
        +				];
        +			}
        +		} ],
        +
        +	// JQuery.Color( )
        +	color = jQuery.Color = function( color, green, blue, alpha ) {
        +		return new jQuery.Color.fn.parse( color, green, blue, alpha );
        +	},
        +	spaces = {
        +		rgba: {
        +			props: {
        +				red: {
        +					idx: 0,
        +					type: "byte"
        +				},
        +				green: {
        +					idx: 1,
        +					type: "byte"
        +				},
        +				blue: {
        +					idx: 2,
        +					type: "byte"
        +				}
        +			}
        +		},
        +
        +		hsla: {
        +			props: {
        +				hue: {
        +					idx: 0,
        +					type: "degrees"
        +				},
        +				saturation: {
        +					idx: 1,
        +					type: "percent"
        +				},
        +				lightness: {
        +					idx: 2,
        +					type: "percent"
        +				}
        +			}
        +		}
        +	},
        +	propTypes = {
        +		"byte": {
        +			floor: true,
        +			max: 255
        +		},
        +		"percent": {
        +			max: 1
        +		},
        +		"degrees": {
        +			mod: 360,
        +			floor: true
        +		}
        +	},
        +	support = color.support = {},
        +
        +	// Element for support tests
        +	supportElem = jQuery( "<p>" )[ 0 ],
        +
        +	// Colors = jQuery.Color.names
        +	colors,
        +
        +	// Local aliases of functions called often
        +	each = jQuery.each;
        +
        +// Determine rgba support immediately
        +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
        +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
        +
        +// Define cache name and alpha properties
        +// for rgba and hsla spaces
        +each( spaces, function( spaceName, space ) {
        +	space.cache = "_" + spaceName;
        +	space.props.alpha = {
        +		idx: 3,
        +		type: "percent",
        +		def: 1
        +	};
        +} );
        +
        +function clamp( value, prop, allowEmpty ) {
        +	var type = propTypes[ prop.type ] || {};
        +
        +	if ( value == null ) {
        +		return ( allowEmpty || !prop.def ) ? null : prop.def;
        +	}
        +
        +	// ~~ is an short way of doing floor for positive numbers
        +	value = type.floor ? ~~value : parseFloat( value );
        +
        +	// IE will pass in empty strings as value for alpha,
        +	// which will hit this case
        +	if ( isNaN( value ) ) {
        +		return prop.def;
        +	}
        +
        +	if ( type.mod ) {
        +
        +		// We add mod before modding to make sure that negatives values
        +		// get converted properly: -10 -> 350
        +		return ( value + type.mod ) % type.mod;
        +	}
        +
        +	// For now all property types without mod have min and max
        +	return 0 > value ? 0 : type.max < value ? type.max : value;
        +}
        +
        +function stringParse( string ) {
        +	var inst = color(),
        +		rgba = inst._rgba = [];
        +
        +	string = string.toLowerCase();
        +
        +	each( stringParsers, function( i, parser ) {
        +		var parsed,
        +			match = parser.re.exec( string ),
        +			values = match && parser.parse( match ),
        +			spaceName = parser.space || "rgba";
        +
        +		if ( values ) {
        +			parsed = inst[ spaceName ]( values );
        +
        +			// If this was an rgba parse the assignment might happen twice
        +			// oh well....
        +			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
        +			rgba = inst._rgba = parsed._rgba;
        +
        +			// Exit each( stringParsers ) here because we matched
        +			return false;
        +		}
        +	} );
        +
        +	// Found a stringParser that handled it
        +	if ( rgba.length ) {
        +
        +		// If this came from a parsed string, force "transparent" when alpha is 0
        +		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
        +		if ( rgba.join() === "0,0,0,0" ) {
        +			jQuery.extend( rgba, colors.transparent );
        +		}
        +		return inst;
        +	}
        +
        +	// Named colors
        +	return colors[ string ];
        +}
        +
        +color.fn = jQuery.extend( color.prototype, {
        +	parse: function( red, green, blue, alpha ) {
        +		if ( red === undefined ) {
        +			this._rgba = [ null, null, null, null ];
        +			return this;
        +		}
        +		if ( red.jquery || red.nodeType ) {
        +			red = jQuery( red ).css( green );
        +			green = undefined;
        +		}
        +
        +		var inst = this,
        +			type = jQuery.type( red ),
        +			rgba = this._rgba = [];
        +
        +		// More than 1 argument specified - assume ( red, green, blue, alpha )
        +		if ( green !== undefined ) {
        +			red = [ red, green, blue, alpha ];
        +			type = "array";
        +		}
        +
        +		if ( type === "string" ) {
        +			return this.parse( stringParse( red ) || colors._default );
        +		}
        +
        +		if ( type === "array" ) {
        +			each( spaces.rgba.props, function( key, prop ) {
        +				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
        +			} );
        +			return this;
        +		}
        +
        +		if ( type === "object" ) {
        +			if ( red instanceof color ) {
        +				each( spaces, function( spaceName, space ) {
        +					if ( red[ space.cache ] ) {
        +						inst[ space.cache ] = red[ space.cache ].slice();
        +					}
        +				} );
        +			} else {
        +				each( spaces, function( spaceName, space ) {
        +					var cache = space.cache;
        +					each( space.props, function( key, prop ) {
        +
        +						// If the cache doesn't exist, and we know how to convert
        +						if ( !inst[ cache ] && space.to ) {
        +
        +							// If the value was null, we don't need to copy it
        +							// if the key was alpha, we don't need to copy it either
        +							if ( key === "alpha" || red[ key ] == null ) {
        +								return;
        +							}
        +							inst[ cache ] = space.to( inst._rgba );
        +						}
        +
        +						// This is the only case where we allow nulls for ALL properties.
        +						// call clamp with alwaysAllowEmpty
        +						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
        +					} );
        +
        +					// Everything defined but alpha?
        +					if ( inst[ cache ] &&
        +							jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
        +
        +						// Use the default of 1
        +						inst[ cache ][ 3 ] = 1;
        +						if ( space.from ) {
        +							inst._rgba = space.from( inst[ cache ] );
        +						}
        +					}
        +				} );
        +			}
        +			return this;
        +		}
        +	},
        +	is: function( compare ) {
        +		var is = color( compare ),
        +			same = true,
        +			inst = this;
        +
        +		each( spaces, function( _, space ) {
        +			var localCache,
        +				isCache = is[ space.cache ];
        +			if ( isCache ) {
        +				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
        +				each( space.props, function( _, prop ) {
        +					if ( isCache[ prop.idx ] != null ) {
        +						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
        +						return same;
        +					}
        +				} );
        +			}
        +			return same;
        +		} );
        +		return same;
        +	},
        +	_space: function() {
        +		var used = [],
        +			inst = this;
        +		each( spaces, function( spaceName, space ) {
        +			if ( inst[ space.cache ] ) {
        +				used.push( spaceName );
        +			}
        +		} );
        +		return used.pop();
        +	},
        +	transition: function( other, distance ) {
        +		var end = color( other ),
        +			spaceName = end._space(),
        +			space = spaces[ spaceName ],
        +			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
        +			start = startColor[ space.cache ] || space.to( startColor._rgba ),
        +			result = start.slice();
        +
        +		end = end[ space.cache ];
        +		each( space.props, function( key, prop ) {
        +			var index = prop.idx,
        +				startValue = start[ index ],
        +				endValue = end[ index ],
        +				type = propTypes[ prop.type ] || {};
        +
        +			// If null, don't override start value
        +			if ( endValue === null ) {
        +				return;
        +			}
        +
        +			// If null - use end
        +			if ( startValue === null ) {
        +				result[ index ] = endValue;
        +			} else {
        +				if ( type.mod ) {
        +					if ( endValue - startValue > type.mod / 2 ) {
        +						startValue += type.mod;
        +					} else if ( startValue - endValue > type.mod / 2 ) {
        +						startValue -= type.mod;
        +					}
        +				}
        +				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
        +			}
        +		} );
        +		return this[ spaceName ]( result );
        +	},
        +	blend: function( opaque ) {
        +
        +		// If we are already opaque - return ourself
        +		if ( this._rgba[ 3 ] === 1 ) {
        +			return this;
        +		}
        +
        +		var rgb = this._rgba.slice(),
        +			a = rgb.pop(),
        +			blend = color( opaque )._rgba;
        +
        +		return color( jQuery.map( rgb, function( v, i ) {
        +			return ( 1 - a ) * blend[ i ] + a * v;
        +		} ) );
        +	},
        +	toRgbaString: function() {
        +		var prefix = "rgba(",
        +			rgba = jQuery.map( this._rgba, function( v, i ) {
        +				return v == null ? ( i > 2 ? 1 : 0 ) : v;
        +			} );
        +
        +		if ( rgba[ 3 ] === 1 ) {
        +			rgba.pop();
        +			prefix = "rgb(";
        +		}
        +
        +		return prefix + rgba.join() + ")";
        +	},
        +	toHslaString: function() {
        +		var prefix = "hsla(",
        +			hsla = jQuery.map( this.hsla(), function( v, i ) {
        +				if ( v == null ) {
        +					v = i > 2 ? 1 : 0;
        +				}
        +
        +				// Catch 1 and 2
        +				if ( i && i < 3 ) {
        +					v = Math.round( v * 100 ) + "%";
        +				}
        +				return v;
        +			} );
        +
        +		if ( hsla[ 3 ] === 1 ) {
        +			hsla.pop();
        +			prefix = "hsl(";
        +		}
        +		return prefix + hsla.join() + ")";
        +	},
        +	toHexString: function( includeAlpha ) {
        +		var rgba = this._rgba.slice(),
        +			alpha = rgba.pop();
        +
        +		if ( includeAlpha ) {
        +			rgba.push( ~~( alpha * 255 ) );
        +		}
        +
        +		return "#" + jQuery.map( rgba, function( v ) {
        +
        +			// Default to 0 when nulls exist
        +			v = ( v || 0 ).toString( 16 );
        +			return v.length === 1 ? "0" + v : v;
        +		} ).join( "" );
        +	},
        +	toString: function() {
        +		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
        +	}
        +} );
        +color.fn.parse.prototype = color.fn;
        +
        +// Hsla conversions adapted from:
        +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
        +
        +function hue2rgb( p, q, h ) {
        +	h = ( h + 1 ) % 1;
        +	if ( h * 6 < 1 ) {
        +		return p + ( q - p ) * h * 6;
        +	}
        +	if ( h * 2 < 1 ) {
        +		return q;
        +	}
        +	if ( h * 3 < 2 ) {
        +		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
        +	}
        +	return p;
        +}
        +
        +spaces.hsla.to = function( rgba ) {
        +	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
        +		return [ null, null, null, rgba[ 3 ] ];
        +	}
        +	var r = rgba[ 0 ] / 255,
        +		g = rgba[ 1 ] / 255,
        +		b = rgba[ 2 ] / 255,
        +		a = rgba[ 3 ],
        +		max = Math.max( r, g, b ),
        +		min = Math.min( r, g, b ),
        +		diff = max - min,
        +		add = max + min,
        +		l = add * 0.5,
        +		h, s;
        +
        +	if ( min === max ) {
        +		h = 0;
        +	} else if ( r === max ) {
        +		h = ( 60 * ( g - b ) / diff ) + 360;
        +	} else if ( g === max ) {
        +		h = ( 60 * ( b - r ) / diff ) + 120;
        +	} else {
        +		h = ( 60 * ( r - g ) / diff ) + 240;
        +	}
        +
        +	// Chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
        +	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
        +	if ( diff === 0 ) {
        +		s = 0;
        +	} else if ( l <= 0.5 ) {
        +		s = diff / add;
        +	} else {
        +		s = diff / ( 2 - add );
        +	}
        +	return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
        +};
        +
        +spaces.hsla.from = function( hsla ) {
        +	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
        +		return [ null, null, null, hsla[ 3 ] ];
        +	}
        +	var h = hsla[ 0 ] / 360,
        +		s = hsla[ 1 ],
        +		l = hsla[ 2 ],
        +		a = hsla[ 3 ],
        +		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
        +		p = 2 * l - q;
        +
        +	return [
        +		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
        +		Math.round( hue2rgb( p, q, h ) * 255 ),
        +		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
        +		a
        +	];
        +};
        +
        +each( spaces, function( spaceName, space ) {
        +	var props = space.props,
        +		cache = space.cache,
        +		to = space.to,
        +		from = space.from;
        +
        +	// Makes rgba() and hsla()
        +	color.fn[ spaceName ] = function( value ) {
        +
        +		// Generate a cache for this space if it doesn't exist
        +		if ( to && !this[ cache ] ) {
        +			this[ cache ] = to( this._rgba );
        +		}
        +		if ( value === undefined ) {
        +			return this[ cache ].slice();
        +		}
        +
        +		var ret,
        +			type = jQuery.type( value ),
        +			arr = ( type === "array" || type === "object" ) ? value : arguments,
        +			local = this[ cache ].slice();
        +
        +		each( props, function( key, prop ) {
        +			var val = arr[ type === "object" ? key : prop.idx ];
        +			if ( val == null ) {
        +				val = local[ prop.idx ];
        +			}
        +			local[ prop.idx ] = clamp( val, prop );
        +		} );
        +
        +		if ( from ) {
        +			ret = color( from( local ) );
        +			ret[ cache ] = local;
        +			return ret;
        +		} else {
        +			return color( local );
        +		}
        +	};
        +
        +	// Makes red() green() blue() alpha() hue() saturation() lightness()
        +	each( props, function( key, prop ) {
        +
        +		// Alpha is included in more than one space
        +		if ( color.fn[ key ] ) {
        +			return;
        +		}
        +		color.fn[ key ] = function( value ) {
        +			var vtype = jQuery.type( value ),
        +				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
        +				local = this[ fn ](),
        +				cur = local[ prop.idx ],
        +				match;
        +
        +			if ( vtype === "undefined" ) {
        +				return cur;
        +			}
        +
        +			if ( vtype === "function" ) {
        +				value = value.call( this, cur );
        +				vtype = jQuery.type( value );
        +			}
        +			if ( value == null && prop.empty ) {
        +				return this;
        +			}
        +			if ( vtype === "string" ) {
        +				match = rplusequals.exec( value );
        +				if ( match ) {
        +					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
        +				}
        +			}
        +			local[ prop.idx ] = value;
        +			return this[ fn ]( local );
        +		};
        +	} );
        +} );
        +
        +// Add cssHook and .fx.step function for each named hook.
        +// accept a space separated string of properties
        +color.hook = function( hook ) {
        +	var hooks = hook.split( " " );
        +	each( hooks, function( i, hook ) {
        +		jQuery.cssHooks[ hook ] = {
        +			set: function( elem, value ) {
        +				var parsed, curElem,
        +					backgroundColor = "";
        +
        +				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" ||
        +						( parsed = stringParse( value ) ) ) ) {
        +					value = color( parsed || value );
        +					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
        +						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
        +						while (
        +							( backgroundColor === "" || backgroundColor === "transparent" ) &&
        +							curElem && curElem.style
        +						) {
        +							try {
        +								backgroundColor = jQuery.css( curElem, "backgroundColor" );
        +								curElem = curElem.parentNode;
        +							} catch ( e ) {
        +							}
        +						}
        +
        +						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
        +							backgroundColor :
        +							"_default" );
        +					}
        +
        +					value = value.toRgbaString();
        +				}
        +				try {
        +					elem.style[ hook ] = value;
        +				} catch ( e ) {
        +
        +					// Wrapped to prevent IE from throwing errors on "invalid" values like
        +					// 'auto' or 'inherit'
        +				}
        +			}
        +		};
        +		jQuery.fx.step[ hook ] = function( fx ) {
        +			if ( !fx.colorInit ) {
        +				fx.start = color( fx.elem, hook );
        +				fx.end = color( fx.end );
        +				fx.colorInit = true;
        +			}
        +			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
        +		};
        +	} );
        +
        +};
        +
        +color.hook( stepHooks );
        +
        +jQuery.cssHooks.borderColor = {
        +	expand: function( value ) {
        +		var expanded = {};
        +
        +		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
        +			expanded[ "border" + part + "Color" ] = value;
        +		} );
        +		return expanded;
        +	}
        +};
        +
        +// Basic color names only.
        +// Usage of any of the other color names requires adding yourself or including
        +// jquery.color.svg-names.js.
        +colors = jQuery.Color.names = {
        +
        +	// 4.1. Basic color keywords
        +	aqua: "#00ffff",
        +	black: "#000000",
        +	blue: "#0000ff",
        +	fuchsia: "#ff00ff",
        +	gray: "#808080",
        +	green: "#008000",
        +	lime: "#00ff00",
        +	maroon: "#800000",
        +	navy: "#000080",
        +	olive: "#808000",
        +	purple: "#800080",
        +	red: "#ff0000",
        +	silver: "#c0c0c0",
        +	teal: "#008080",
        +	white: "#ffffff",
        +	yellow: "#ffff00",
        +
        +	// 4.2.3. "transparent" color keyword
        +	transparent: [ null, null, null, 0 ],
        +
        +	_default: "#ffffff"
        +};
        +
        +} )( jQuery );
        +
        +/******************************************************************************/
        +/****************************** CLASS ANIMATIONS ******************************/
        +/******************************************************************************/
        +( function() {
        +
        +var classAnimationActions = [ "add", "remove", "toggle" ],
        +	shorthandStyles = {
        +		border: 1,
        +		borderBottom: 1,
        +		borderColor: 1,
        +		borderLeft: 1,
        +		borderRight: 1,
        +		borderTop: 1,
        +		borderWidth: 1,
        +		margin: 1,
        +		padding: 1
        +	};
        +
        +$.each(
        +	[ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
        +	function( _, prop ) {
        +		$.fx.step[ prop ] = function( fx ) {
        +			if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
        +				jQuery.style( fx.elem, prop, fx.end );
        +				fx.setAttr = true;
        +			}
        +		};
        +	}
        +);
        +
        +function getElementStyles( elem ) {
        +	var key, len,
        +		style = elem.ownerDocument.defaultView ?
        +			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
        +			elem.currentStyle,
        +		styles = {};
        +
        +	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
        +		len = style.length;
        +		while ( len-- ) {
        +			key = style[ len ];
        +			if ( typeof style[ key ] === "string" ) {
        +				styles[ $.camelCase( key ) ] = style[ key ];
        +			}
        +		}
        +
        +	// Support: Opera, IE <9
        +	} else {
        +		for ( key in style ) {
        +			if ( typeof style[ key ] === "string" ) {
        +				styles[ key ] = style[ key ];
        +			}
        +		}
        +	}
        +
        +	return styles;
        +}
        +
        +function styleDifference( oldStyle, newStyle ) {
        +	var diff = {},
        +		name, value;
        +
        +	for ( name in newStyle ) {
        +		value = newStyle[ name ];
        +		if ( oldStyle[ name ] !== value ) {
        +			if ( !shorthandStyles[ name ] ) {
        +				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
        +					diff[ name ] = value;
        +				}
        +			}
        +		}
        +	}
        +
        +	return diff;
        +}
        +
        +// Support: jQuery <1.8
        +if ( !$.fn.addBack ) {
        +	$.fn.addBack = function( selector ) {
        +		return this.add( selector == null ?
        +			this.prevObject : this.prevObject.filter( selector )
        +		);
        +	};
        +}
        +
        +$.effects.animateClass = function( value, duration, easing, callback ) {
        +	var o = $.speed( duration, easing, callback );
        +
        +	return this.queue( function() {
        +		var animated = $( this ),
        +			baseClass = animated.attr( "class" ) || "",
        +			applyClassChange,
        +			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
        +
        +		// Map the animated objects to store the original styles.
        +		allAnimations = allAnimations.map( function() {
        +			var el = $( this );
        +			return {
        +				el: el,
        +				start: getElementStyles( this )
        +			};
        +		} );
        +
        +		// Apply class change
        +		applyClassChange = function() {
        +			$.each( classAnimationActions, function( i, action ) {
        +				if ( value[ action ] ) {
        +					animated[ action + "Class" ]( value[ action ] );
        +				}
        +			} );
        +		};
        +		applyClassChange();
        +
        +		// Map all animated objects again - calculate new styles and diff
        +		allAnimations = allAnimations.map( function() {
        +			this.end = getElementStyles( this.el[ 0 ] );
        +			this.diff = styleDifference( this.start, this.end );
        +			return this;
        +		} );
        +
        +		// Apply original class
        +		animated.attr( "class", baseClass );
        +
        +		// Map all animated objects again - this time collecting a promise
        +		allAnimations = allAnimations.map( function() {
        +			var styleInfo = this,
        +				dfd = $.Deferred(),
        +				opts = $.extend( {}, o, {
        +					queue: false,
        +					complete: function() {
        +						dfd.resolve( styleInfo );
        +					}
        +				} );
        +
        +			this.el.animate( this.diff, opts );
        +			return dfd.promise();
        +		} );
        +
        +		// Once all animations have completed:
        +		$.when.apply( $, allAnimations.get() ).done( function() {
        +
        +			// Set the final class
        +			applyClassChange();
        +
        +			// For each animated element,
        +			// clear all css properties that were animated
        +			$.each( arguments, function() {
        +				var el = this.el;
        +				$.each( this.diff, function( key ) {
        +					el.css( key, "" );
        +				} );
        +			} );
        +
        +			// This is guarnteed to be there if you use jQuery.speed()
        +			// it also handles dequeuing the next anim...
        +			o.complete.call( animated[ 0 ] );
        +		} );
        +	} );
        +};
        +
        +$.fn.extend( {
        +	addClass: ( function( orig ) {
        +		return function( classNames, speed, easing, callback ) {
        +			return speed ?
        +				$.effects.animateClass.call( this,
        +					{ add: classNames }, speed, easing, callback ) :
        +				orig.apply( this, arguments );
        +		};
        +	} )( $.fn.addClass ),
        +
        +	removeClass: ( function( orig ) {
        +		return function( classNames, speed, easing, callback ) {
        +			return arguments.length > 1 ?
        +				$.effects.animateClass.call( this,
        +					{ remove: classNames }, speed, easing, callback ) :
        +				orig.apply( this, arguments );
        +		};
        +	} )( $.fn.removeClass ),
        +
        +	toggleClass: ( function( orig ) {
        +		return function( classNames, force, speed, easing, callback ) {
        +			if ( typeof force === "boolean" || force === undefined ) {
        +				if ( !speed ) {
        +
        +					// Without speed parameter
        +					return orig.apply( this, arguments );
        +				} else {
        +					return $.effects.animateClass.call( this,
        +						( force ? { add: classNames } : { remove: classNames } ),
        +						speed, easing, callback );
        +				}
        +			} else {
        +
        +				// Without force parameter
        +				return $.effects.animateClass.call( this,
        +					{ toggle: classNames }, force, speed, easing );
        +			}
        +		};
        +	} )( $.fn.toggleClass ),
        +
        +	switchClass: function( remove, add, speed, easing, callback ) {
        +		return $.effects.animateClass.call( this, {
        +			add: add,
        +			remove: remove
        +		}, speed, easing, callback );
        +	}
        +} );
        +
        +} )();
        +
        +/******************************************************************************/
        +/*********************************** EFFECTS **********************************/
        +/******************************************************************************/
        +
        +( function() {
        +
        +if ( $.expr && $.expr.filters && $.expr.filters.animated ) {
        +	$.expr.filters.animated = ( function( orig ) {
        +		return function( elem ) {
        +			return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
        +		};
        +	} )( $.expr.filters.animated );
        +}
        +
        +if ( $.uiBackCompat !== false ) {
        +	$.extend( $.effects, {
        +
        +		// Saves a set of properties in a data storage
        +		save: function( element, set ) {
        +			var i = 0, length = set.length;
        +			for ( ; i < length; i++ ) {
        +				if ( set[ i ] !== null ) {
        +					element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
        +				}
        +			}
        +		},
        +
        +		// Restores a set of previously saved properties from a data storage
        +		restore: function( element, set ) {
        +			var val, i = 0, length = set.length;
        +			for ( ; i < length; i++ ) {
        +				if ( set[ i ] !== null ) {
        +					val = element.data( dataSpace + set[ i ] );
        +					element.css( set[ i ], val );
        +				}
        +			}
        +		},
        +
        +		setMode: function( el, mode ) {
        +			if ( mode === "toggle" ) {
        +				mode = el.is( ":hidden" ) ? "show" : "hide";
        +			}
        +			return mode;
        +		},
        +
        +		// Wraps the element around a wrapper that copies position properties
        +		createWrapper: function( element ) {
        +
        +			// If the element is already wrapped, return it
        +			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
        +				return element.parent();
        +			}
        +
        +			// Wrap the element
        +			var props = {
        +					width: element.outerWidth( true ),
        +					height: element.outerHeight( true ),
        +					"float": element.css( "float" )
        +				},
        +				wrapper = $( "<div></div>" )
        +					.addClass( "ui-effects-wrapper" )
        +					.css( {
        +						fontSize: "100%",
        +						background: "transparent",
        +						border: "none",
        +						margin: 0,
        +						padding: 0
        +					} ),
        +
        +				// Store the size in case width/height are defined in % - Fixes #5245
        +				size = {
        +					width: element.width(),
        +					height: element.height()
        +				},
        +				active = document.activeElement;
        +
        +			// Support: Firefox
        +			// Firefox incorrectly exposes anonymous content
        +			// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
        +			try {
        +				active.id;
        +			} catch ( e ) {
        +				active = document.body;
        +			}
        +
        +			element.wrap( wrapper );
        +
        +			// Fixes #7595 - Elements lose focus when wrapped.
        +			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        +				$( active ).trigger( "focus" );
        +			}
        +
        +			// Hotfix for jQuery 1.4 since some change in wrap() seems to actually
        +			// lose the reference to the wrapped element
        +			wrapper = element.parent();
        +
        +			// Transfer positioning properties to the wrapper
        +			if ( element.css( "position" ) === "static" ) {
        +				wrapper.css( { position: "relative" } );
        +				element.css( { position: "relative" } );
        +			} else {
        +				$.extend( props, {
        +					position: element.css( "position" ),
        +					zIndex: element.css( "z-index" )
        +				} );
        +				$.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
        +					props[ pos ] = element.css( pos );
        +					if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
        +						props[ pos ] = "auto";
        +					}
        +				} );
        +				element.css( {
        +					position: "relative",
        +					top: 0,
        +					left: 0,
        +					right: "auto",
        +					bottom: "auto"
        +				} );
        +			}
        +			element.css( size );
        +
        +			return wrapper.css( props ).show();
        +		},
        +
        +		removeWrapper: function( element ) {
        +			var active = document.activeElement;
        +
        +			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
        +				element.parent().replaceWith( element );
        +
        +				// Fixes #7595 - Elements lose focus when wrapped.
        +				if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        +					$( active ).trigger( "focus" );
        +				}
        +			}
        +
        +			return element;
        +		}
        +	} );
        +}
        +
        +$.extend( $.effects, {
        +	version: "1.12.1",
        +
        +	define: function( name, mode, effect ) {
        +		if ( !effect ) {
        +			effect = mode;
        +			mode = "effect";
        +		}
        +
        +		$.effects.effect[ name ] = effect;
        +		$.effects.effect[ name ].mode = mode;
        +
        +		return effect;
        +	},
        +
        +	scaledDimensions: function( element, percent, direction ) {
        +		if ( percent === 0 ) {
        +			return {
        +				height: 0,
        +				width: 0,
        +				outerHeight: 0,
        +				outerWidth: 0
        +			};
        +		}
        +
        +		var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
        +			y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
        +
        +		return {
        +			height: element.height() * y,
        +			width: element.width() * x,
        +			outerHeight: element.outerHeight() * y,
        +			outerWidth: element.outerWidth() * x
        +		};
        +
        +	},
        +
        +	clipToBox: function( animation ) {
        +		return {
        +			width: animation.clip.right - animation.clip.left,
        +			height: animation.clip.bottom - animation.clip.top,
        +			left: animation.clip.left,
        +			top: animation.clip.top
        +		};
        +	},
        +
        +	// Injects recently queued functions to be first in line (after "inprogress")
        +	unshift: function( element, queueLength, count ) {
        +		var queue = element.queue();
        +
        +		if ( queueLength > 1 ) {
        +			queue.splice.apply( queue,
        +				[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
        +		}
        +		element.dequeue();
        +	},
        +
        +	saveStyle: function( element ) {
        +		element.data( dataSpaceStyle, element[ 0 ].style.cssText );
        +	},
        +
        +	restoreStyle: function( element ) {
        +		element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
        +		element.removeData( dataSpaceStyle );
        +	},
        +
        +	mode: function( element, mode ) {
        +		var hidden = element.is( ":hidden" );
        +
        +		if ( mode === "toggle" ) {
        +			mode = hidden ? "show" : "hide";
        +		}
        +		if ( hidden ? mode === "hide" : mode === "show" ) {
        +			mode = "none";
        +		}
        +		return mode;
        +	},
        +
        +	// Translates a [top,left] array into a baseline value
        +	getBaseline: function( origin, original ) {
        +		var y, x;
        +
        +		switch ( origin[ 0 ] ) {
        +		case "top":
        +			y = 0;
        +			break;
        +		case "middle":
        +			y = 0.5;
        +			break;
        +		case "bottom":
        +			y = 1;
        +			break;
        +		default:
        +			y = origin[ 0 ] / original.height;
        +		}
        +
        +		switch ( origin[ 1 ] ) {
        +		case "left":
        +			x = 0;
        +			break;
        +		case "center":
        +			x = 0.5;
        +			break;
        +		case "right":
        +			x = 1;
        +			break;
        +		default:
        +			x = origin[ 1 ] / original.width;
        +		}
        +
        +		return {
        +			x: x,
        +			y: y
        +		};
        +	},
        +
        +	// Creates a placeholder element so that the original element can be made absolute
        +	createPlaceholder: function( element ) {
        +		var placeholder,
        +			cssPosition = element.css( "position" ),
        +			position = element.position();
        +
        +		// Lock in margins first to account for form elements, which
        +		// will change margin if you explicitly set height
        +		// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
        +		// Support: Safari
        +		element.css( {
        +			marginTop: element.css( "marginTop" ),
        +			marginBottom: element.css( "marginBottom" ),
        +			marginLeft: element.css( "marginLeft" ),
        +			marginRight: element.css( "marginRight" )
        +		} )
        +		.outerWidth( element.outerWidth() )
        +		.outerHeight( element.outerHeight() );
        +
        +		if ( /^(static|relative)/.test( cssPosition ) ) {
        +			cssPosition = "absolute";
        +
        +			placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
        +
        +				// Convert inline to inline block to account for inline elements
        +				// that turn to inline block based on content (like img)
        +				display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
        +					"inline-block" :
        +					"block",
        +				visibility: "hidden",
        +
        +				// Margins need to be set to account for margin collapse
        +				marginTop: element.css( "marginTop" ),
        +				marginBottom: element.css( "marginBottom" ),
        +				marginLeft: element.css( "marginLeft" ),
        +				marginRight: element.css( "marginRight" ),
        +				"float": element.css( "float" )
        +			} )
        +			.outerWidth( element.outerWidth() )
        +			.outerHeight( element.outerHeight() )
        +			.addClass( "ui-effects-placeholder" );
        +
        +			element.data( dataSpace + "placeholder", placeholder );
        +		}
        +
        +		element.css( {
        +			position: cssPosition,
        +			left: position.left,
        +			top: position.top
        +		} );
        +
        +		return placeholder;
        +	},
        +
        +	removePlaceholder: function( element ) {
        +		var dataKey = dataSpace + "placeholder",
        +				placeholder = element.data( dataKey );
        +
        +		if ( placeholder ) {
        +			placeholder.remove();
        +			element.removeData( dataKey );
        +		}
        +	},
        +
        +	// Removes a placeholder if it exists and restores
        +	// properties that were modified during placeholder creation
        +	cleanUp: function( element ) {
        +		$.effects.restoreStyle( element );
        +		$.effects.removePlaceholder( element );
        +	},
        +
        +	setTransition: function( element, list, factor, value ) {
        +		value = value || {};
        +		$.each( list, function( i, x ) {
        +			var unit = element.cssUnit( x );
        +			if ( unit[ 0 ] > 0 ) {
        +				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
        +			}
        +		} );
        +		return value;
        +	}
        +} );
        +
        +// Return an effect options object for the given parameters:
        +function _normalizeArguments( effect, options, speed, callback ) {
        +
        +	// Allow passing all options as the first parameter
        +	if ( $.isPlainObject( effect ) ) {
        +		options = effect;
        +		effect = effect.effect;
        +	}
        +
        +	// Convert to an object
        +	effect = { effect: effect };
        +
        +	// Catch (effect, null, ...)
        +	if ( options == null ) {
        +		options = {};
        +	}
        +
        +	// Catch (effect, callback)
        +	if ( $.isFunction( options ) ) {
        +		callback = options;
        +		speed = null;
        +		options = {};
        +	}
        +
        +	// Catch (effect, speed, ?)
        +	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
        +		callback = speed;
        +		speed = options;
        +		options = {};
        +	}
        +
        +	// Catch (effect, options, callback)
        +	if ( $.isFunction( speed ) ) {
        +		callback = speed;
        +		speed = null;
        +	}
        +
        +	// Add options to effect
        +	if ( options ) {
        +		$.extend( effect, options );
        +	}
        +
        +	speed = speed || options.duration;
        +	effect.duration = $.fx.off ? 0 :
        +		typeof speed === "number" ? speed :
        +		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
        +		$.fx.speeds._default;
        +
        +	effect.complete = callback || options.complete;
        +
        +	return effect;
        +}
        +
        +function standardAnimationOption( option ) {
        +
        +	// Valid standard speeds (nothing, number, named speed)
        +	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
        +		return true;
        +	}
        +
        +	// Invalid strings - treat as "normal" speed
        +	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
        +		return true;
        +	}
        +
        +	// Complete callback
        +	if ( $.isFunction( option ) ) {
        +		return true;
        +	}
        +
        +	// Options hash (but not naming an effect)
        +	if ( typeof option === "object" && !option.effect ) {
        +		return true;
        +	}
        +
        +	// Didn't match any standard API
        +	return false;
        +}
        +
        +$.fn.extend( {
        +	effect: function( /* effect, options, speed, callback */ ) {
        +		var args = _normalizeArguments.apply( this, arguments ),
        +			effectMethod = $.effects.effect[ args.effect ],
        +			defaultMode = effectMethod.mode,
        +			queue = args.queue,
        +			queueName = queue || "fx",
        +			complete = args.complete,
        +			mode = args.mode,
        +			modes = [],
        +			prefilter = function( next ) {
        +				var el = $( this ),
        +					normalizedMode = $.effects.mode( el, mode ) || defaultMode;
        +
        +				// Sentinel for duck-punching the :animated psuedo-selector
        +				el.data( dataSpaceAnimated, true );
        +
        +				// Save effect mode for later use,
        +				// we can't just call $.effects.mode again later,
        +				// as the .show() below destroys the initial state
        +				modes.push( normalizedMode );
        +
        +				// See $.uiBackCompat inside of run() for removal of defaultMode in 1.13
        +				if ( defaultMode && ( normalizedMode === "show" ||
        +						( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
        +					el.show();
        +				}
        +
        +				if ( !defaultMode || normalizedMode !== "none" ) {
        +					$.effects.saveStyle( el );
        +				}
        +
        +				if ( $.isFunction( next ) ) {
        +					next();
        +				}
        +			};
        +
        +		if ( $.fx.off || !effectMethod ) {
        +
        +			// Delegate to the original method (e.g., .show()) if possible
        +			if ( mode ) {
        +				return this[ mode ]( args.duration, complete );
        +			} else {
        +				return this.each( function() {
        +					if ( complete ) {
        +						complete.call( this );
        +					}
        +				} );
        +			}
        +		}
        +
        +		function run( next ) {
        +			var elem = $( this );
        +
        +			function cleanup() {
        +				elem.removeData( dataSpaceAnimated );
        +
        +				$.effects.cleanUp( elem );
        +
        +				if ( args.mode === "hide" ) {
        +					elem.hide();
        +				}
        +
        +				done();
        +			}
        +
        +			function done() {
        +				if ( $.isFunction( complete ) ) {
        +					complete.call( elem[ 0 ] );
        +				}
        +
        +				if ( $.isFunction( next ) ) {
        +					next();
        +				}
        +			}
        +
        +			// Override mode option on a per element basis,
        +			// as toggle can be either show or hide depending on element state
        +			args.mode = modes.shift();
        +
        +			if ( $.uiBackCompat !== false && !defaultMode ) {
        +				if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
        +
        +					// Call the core method to track "olddisplay" properly
        +					elem[ mode ]();
        +					done();
        +				} else {
        +					effectMethod.call( elem[ 0 ], args, done );
        +				}
        +			} else {
        +				if ( args.mode === "none" ) {
        +
        +					// Call the core method to track "olddisplay" properly
        +					elem[ mode ]();
        +					done();
        +				} else {
        +					effectMethod.call( elem[ 0 ], args, cleanup );
        +				}
        +			}
        +		}
        +
        +		// Run prefilter on all elements first to ensure that
        +		// any showing or hiding happens before placeholder creation,
        +		// which ensures that any layout changes are correctly captured.
        +		return queue === false ?
        +			this.each( prefilter ).each( run ) :
        +			this.queue( queueName, prefilter ).queue( queueName, run );
        +	},
        +
        +	show: ( function( orig ) {
        +		return function( option ) {
        +			if ( standardAnimationOption( option ) ) {
        +				return orig.apply( this, arguments );
        +			} else {
        +				var args = _normalizeArguments.apply( this, arguments );
        +				args.mode = "show";
        +				return this.effect.call( this, args );
        +			}
        +		};
        +	} )( $.fn.show ),
        +
        +	hide: ( function( orig ) {
        +		return function( option ) {
        +			if ( standardAnimationOption( option ) ) {
        +				return orig.apply( this, arguments );
        +			} else {
        +				var args = _normalizeArguments.apply( this, arguments );
        +				args.mode = "hide";
        +				return this.effect.call( this, args );
        +			}
        +		};
        +	} )( $.fn.hide ),
        +
        +	toggle: ( function( orig ) {
        +		return function( option ) {
        +			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
        +				return orig.apply( this, arguments );
        +			} else {
        +				var args = _normalizeArguments.apply( this, arguments );
        +				args.mode = "toggle";
        +				return this.effect.call( this, args );
        +			}
        +		};
        +	} )( $.fn.toggle ),
        +
        +	cssUnit: function( key ) {
        +		var style = this.css( key ),
        +			val = [];
        +
        +		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
        +			if ( style.indexOf( unit ) > 0 ) {
        +				val = [ parseFloat( style ), unit ];
        +			}
        +		} );
        +		return val;
        +	},
        +
        +	cssClip: function( clipObj ) {
        +		if ( clipObj ) {
        +			return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
        +				clipObj.bottom + "px " + clipObj.left + "px)" );
        +		}
        +		return parseClip( this.css( "clip" ), this );
        +	},
        +
        +	transfer: function( options, done ) {
        +		var element = $( this ),
        +			target = $( options.to ),
        +			targetFixed = target.css( "position" ) === "fixed",
        +			body = $( "body" ),
        +			fixTop = targetFixed ? body.scrollTop() : 0,
        +			fixLeft = targetFixed ? body.scrollLeft() : 0,
        +			endPosition = target.offset(),
        +			animation = {
        +				top: endPosition.top - fixTop,
        +				left: endPosition.left - fixLeft,
        +				height: target.innerHeight(),
        +				width: target.innerWidth()
        +			},
        +			startPosition = element.offset(),
        +			transfer = $( "<div class='ui-effects-transfer'></div>" )
        +				.appendTo( "body" )
        +				.addClass( options.className )
        +				.css( {
        +					top: startPosition.top - fixTop,
        +					left: startPosition.left - fixLeft,
        +					height: element.innerHeight(),
        +					width: element.innerWidth(),
        +					position: targetFixed ? "fixed" : "absolute"
        +				} )
        +				.animate( animation, options.duration, options.easing, function() {
        +					transfer.remove();
        +					if ( $.isFunction( done ) ) {
        +						done();
        +					}
        +				} );
        +	}
        +} );
        +
        +function parseClip( str, element ) {
        +		var outerWidth = element.outerWidth(),
        +			outerHeight = element.outerHeight(),
        +			clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
        +			values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
        +
        +		return {
        +			top: parseFloat( values[ 1 ] ) || 0,
        +			right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
        +			bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
        +			left: parseFloat( values[ 4 ] ) || 0
        +		};
        +}
        +
        +$.fx.step.clip = function( fx ) {
        +	if ( !fx.clipInit ) {
        +		fx.start = $( fx.elem ).cssClip();
        +		if ( typeof fx.end === "string" ) {
        +			fx.end = parseClip( fx.end, fx.elem );
        +		}
        +		fx.clipInit = true;
        +	}
        +
        +	$( fx.elem ).cssClip( {
        +		top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
        +		right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
        +		bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
        +		left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
        +	} );
        +};
        +
        +} )();
        +
        +/******************************************************************************/
        +/*********************************** EASING ***********************************/
        +/******************************************************************************/
        +
        +( function() {
        +
        +// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
        +
        +var baseEasings = {};
        +
        +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
        +	baseEasings[ name ] = function( p ) {
        +		return Math.pow( p, i + 2 );
        +	};
        +} );
        +
        +$.extend( baseEasings, {
        +	Sine: function( p ) {
        +		return 1 - Math.cos( p * Math.PI / 2 );
        +	},
        +	Circ: function( p ) {
        +		return 1 - Math.sqrt( 1 - p * p );
        +	},
        +	Elastic: function( p ) {
        +		return p === 0 || p === 1 ? p :
        +			-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
        +	},
        +	Back: function( p ) {
        +		return p * p * ( 3 * p - 2 );
        +	},
        +	Bounce: function( p ) {
        +		var pow2,
        +			bounce = 4;
        +
        +		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
        +		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
        +	}
        +} );
        +
        +$.each( baseEasings, function( name, easeIn ) {
        +	$.easing[ "easeIn" + name ] = easeIn;
        +	$.easing[ "easeOut" + name ] = function( p ) {
        +		return 1 - easeIn( 1 - p );
        +	};
        +	$.easing[ "easeInOut" + name ] = function( p ) {
        +		return p < 0.5 ?
        +			easeIn( p * 2 ) / 2 :
        +			1 - easeIn( p * -2 + 2 ) / 2;
        +	};
        +} );
        +
        +} )();
        +
        +var effect = $.effects;
        +
        +
        +/*!
        + * jQuery UI Effects Blind 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Blind Effect
        +//>>group: Effects
        +//>>description: Blinds the element.
        +//>>docs: http://api.jqueryui.com/blind-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) {
        +	var map = {
        +			up: [ "bottom", "top" ],
        +			vertical: [ "bottom", "top" ],
        +			down: [ "top", "bottom" ],
        +			left: [ "right", "left" ],
        +			horizontal: [ "right", "left" ],
        +			right: [ "left", "right" ]
        +		},
        +		element = $( this ),
        +		direction = options.direction || "up",
        +		start = element.cssClip(),
        +		animate = { clip: $.extend( {}, start ) },
        +		placeholder = $.effects.createPlaceholder( element );
        +
        +	animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
        +
        +	if ( options.mode === "show" ) {
        +		element.cssClip( animate.clip );
        +		if ( placeholder ) {
        +			placeholder.css( $.effects.clipToBox( animate ) );
        +		}
        +
        +		animate.clip = start;
        +	}
        +
        +	if ( placeholder ) {
        +		placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
        +	}
        +
        +	element.animate( animate, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Bounce 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Bounce Effect
        +//>>group: Effects
        +//>>description: Bounces an element horizontally or vertically n times.
        +//>>docs: http://api.jqueryui.com/bounce-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) {
        +	var upAnim, downAnim, refValue,
        +		element = $( this ),
        +
        +		// Defaults:
        +		mode = options.mode,
        +		hide = mode === "hide",
        +		show = mode === "show",
        +		direction = options.direction || "up",
        +		distance = options.distance,
        +		times = options.times || 5,
        +
        +		// Number of internal animations
        +		anims = times * 2 + ( show || hide ? 1 : 0 ),
        +		speed = options.duration / anims,
        +		easing = options.easing,
        +
        +		// Utility:
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		motion = ( direction === "up" || direction === "left" ),
        +		i = 0,
        +
        +		queuelen = element.queue().length;
        +
        +	$.effects.createPlaceholder( element );
        +
        +	refValue = element.css( ref );
        +
        +	// Default distance for the BIGGEST bounce is the outer Distance / 3
        +	if ( !distance ) {
        +		distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
        +	}
        +
        +	if ( show ) {
        +		downAnim = { opacity: 1 };
        +		downAnim[ ref ] = refValue;
        +
        +		// If we are showing, force opacity 0 and set the initial position
        +		// then do the "first" animation
        +		element
        +			.css( "opacity", 0 )
        +			.css( ref, motion ? -distance * 2 : distance * 2 )
        +			.animate( downAnim, speed, easing );
        +	}
        +
        +	// Start at the smallest distance if we are hiding
        +	if ( hide ) {
        +		distance = distance / Math.pow( 2, times - 1 );
        +	}
        +
        +	downAnim = {};
        +	downAnim[ ref ] = refValue;
        +
        +	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
        +	for ( ; i < times; i++ ) {
        +		upAnim = {};
        +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        +
        +		element
        +			.animate( upAnim, speed, easing )
        +			.animate( downAnim, speed, easing );
        +
        +		distance = hide ? distance * 2 : distance / 2;
        +	}
        +
        +	// Last Bounce when Hiding
        +	if ( hide ) {
        +		upAnim = { opacity: 0 };
        +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        +
        +		element.animate( upAnim, speed, easing );
        +	}
        +
        +	element.queue( done );
        +
        +	$.effects.unshift( element, queuelen, anims + 1 );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Clip 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Clip Effect
        +//>>group: Effects
        +//>>description: Clips the element on and off like an old TV.
        +//>>docs: http://api.jqueryui.com/clip-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) {
        +	var start,
        +		animate = {},
        +		element = $( this ),
        +		direction = options.direction || "vertical",
        +		both = direction === "both",
        +		horizontal = both || direction === "horizontal",
        +		vertical = both || direction === "vertical";
        +
        +	start = element.cssClip();
        +	animate.clip = {
        +		top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
        +		right: horizontal ? ( start.right - start.left ) / 2 : start.right,
        +		bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
        +		left: horizontal ? ( start.right - start.left ) / 2 : start.left
        +	};
        +
        +	$.effects.createPlaceholder( element );
        +
        +	if ( options.mode === "show" ) {
        +		element.cssClip( animate.clip );
        +		animate.clip = start;
        +	}
        +
        +	element.animate( animate, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Drop 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Drop Effect
        +//>>group: Effects
        +//>>description: Moves an element in one direction and hides it at the same time.
        +//>>docs: http://api.jqueryui.com/drop-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) {
        +
        +	var distance,
        +		element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +		direction = options.direction || "left",
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
        +		oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
        +		animation = {
        +			opacity: 0
        +		};
        +
        +	$.effects.createPlaceholder( element );
        +
        +	distance = options.distance ||
        +		element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
        +
        +	animation[ ref ] = motion + distance;
        +
        +	if ( show ) {
        +		element.css( animation );
        +
        +		animation[ ref ] = oppositeMotion + distance;
        +		animation.opacity = 1;
        +	}
        +
        +	// Animate
        +	element.animate( animation, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Explode 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Explode Effect
        +//>>group: Effects
        +// jscs:disable maximumLineLength
        +//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/explode-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) {
        +
        +	var i, j, left, top, mx, my,
        +		rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
        +		cells = rows,
        +		element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +
        +		// Show and then visibility:hidden the element before calculating offset
        +		offset = element.show().css( "visibility", "hidden" ).offset(),
        +
        +		// Width and height of a piece
        +		width = Math.ceil( element.outerWidth() / cells ),
        +		height = Math.ceil( element.outerHeight() / rows ),
        +		pieces = [];
        +
        +	// Children animate complete:
        +	function childComplete() {
        +		pieces.push( this );
        +		if ( pieces.length === rows * cells ) {
        +			animComplete();
        +		}
        +	}
        +
        +	// Clone the element for each row and cell.
        +	for ( i = 0; i < rows; i++ ) { // ===>
        +		top = offset.top + i * height;
        +		my = i - ( rows - 1 ) / 2;
        +
        +		for ( j = 0; j < cells; j++ ) { // |||
        +			left = offset.left + j * width;
        +			mx = j - ( cells - 1 ) / 2;
        +
        +			// Create a clone of the now hidden main element that will be absolute positioned
        +			// within a wrapper div off the -left and -top equal to size of our pieces
        +			element
        +				.clone()
        +				.appendTo( "body" )
        +				.wrap( "<div></div>" )
        +				.css( {
        +					position: "absolute",
        +					visibility: "visible",
        +					left: -j * width,
        +					top: -i * height
        +				} )
        +
        +				// Select the wrapper - make it overflow: hidden and absolute positioned based on
        +				// where the original was located +left and +top equal to the size of pieces
        +				.parent()
        +					.addClass( "ui-effects-explode" )
        +					.css( {
        +						position: "absolute",
        +						overflow: "hidden",
        +						width: width,
        +						height: height,
        +						left: left + ( show ? mx * width : 0 ),
        +						top: top + ( show ? my * height : 0 ),
        +						opacity: show ? 0 : 1
        +					} )
        +					.animate( {
        +						left: left + ( show ? 0 : mx * width ),
        +						top: top + ( show ? 0 : my * height ),
        +						opacity: show ? 1 : 0
        +					}, options.duration || 500, options.easing, childComplete );
        +		}
        +	}
        +
        +	function animComplete() {
        +		element.css( {
        +			visibility: "visible"
        +		} );
        +		$( pieces ).remove();
        +		done();
        +	}
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Fade 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Fade Effect
        +//>>group: Effects
        +//>>description: Fades the element.
        +//>>docs: http://api.jqueryui.com/fade-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) {
        +	var show = options.mode === "show";
        +
        +	$( this )
        +		.css( "opacity", show ? 0 : 1 )
        +		.animate( {
        +			opacity: show ? 1 : 0
        +		}, {
        +			queue: false,
        +			duration: options.duration,
        +			easing: options.easing,
        +			complete: done
        +		} );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Fold 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Fold Effect
        +//>>group: Effects
        +//>>description: Folds an element first horizontally and then vertically.
        +//>>docs: http://api.jqueryui.com/fold-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) {
        +
        +	// Create element
        +	var element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +		hide = mode === "hide",
        +		size = options.size || 15,
        +		percent = /([0-9]+)%/.exec( size ),
        +		horizFirst = !!options.horizFirst,
        +		ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
        +		duration = options.duration / 2,
        +
        +		placeholder = $.effects.createPlaceholder( element ),
        +
        +		start = element.cssClip(),
        +		animation1 = { clip: $.extend( {}, start ) },
        +		animation2 = { clip: $.extend( {}, start ) },
        +
        +		distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
        +
        +		queuelen = element.queue().length;
        +
        +	if ( percent ) {
        +		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
        +	}
        +	animation1.clip[ ref[ 0 ] ] = size;
        +	animation2.clip[ ref[ 0 ] ] = size;
        +	animation2.clip[ ref[ 1 ] ] = 0;
        +
        +	if ( show ) {
        +		element.cssClip( animation2.clip );
        +		if ( placeholder ) {
        +			placeholder.css( $.effects.clipToBox( animation2 ) );
        +		}
        +
        +		animation2.clip = start;
        +	}
        +
        +	// Animate
        +	element
        +		.queue( function( next ) {
        +			if ( placeholder ) {
        +				placeholder
        +					.animate( $.effects.clipToBox( animation1 ), duration, options.easing )
        +					.animate( $.effects.clipToBox( animation2 ), duration, options.easing );
        +			}
        +
        +			next();
        +		} )
        +		.animate( animation1, duration, options.easing )
        +		.animate( animation2, duration, options.easing )
        +		.queue( done );
        +
        +	$.effects.unshift( element, queuelen, 4 );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Highlight 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Highlight Effect
        +//>>group: Effects
        +//>>description: Highlights the background of an element in a defined color for a custom duration.
        +//>>docs: http://api.jqueryui.com/highlight-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) {
        +	var element = $( this ),
        +		animation = {
        +			backgroundColor: element.css( "backgroundColor" )
        +		};
        +
        +	if ( options.mode === "hide" ) {
        +		animation.opacity = 0;
        +	}
        +
        +	$.effects.saveStyle( element );
        +
        +	element
        +		.css( {
        +			backgroundImage: "none",
        +			backgroundColor: options.color || "#ffff99"
        +		} )
        +		.animate( animation, {
        +			queue: false,
        +			duration: options.duration,
        +			easing: options.easing,
        +			complete: done
        +		} );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Size 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Size Effect
        +//>>group: Effects
        +//>>description: Resize an element to a specified width and height.
        +//>>docs: http://api.jqueryui.com/size-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectSize = $.effects.define( "size", function( options, done ) {
        +
        +	// Create element
        +	var baseline, factor, temp,
        +		element = $( this ),
        +
        +		// Copy for children
        +		cProps = [ "fontSize" ],
        +		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
        +		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
        +
        +		// Set options
        +		mode = options.mode,
        +		restore = mode !== "effect",
        +		scale = options.scale || "both",
        +		origin = options.origin || [ "middle", "center" ],
        +		position = element.css( "position" ),
        +		pos = element.position(),
        +		original = $.effects.scaledDimensions( element ),
        +		from = options.from || original,
        +		to = options.to || $.effects.scaledDimensions( element, 0 );
        +
        +	$.effects.createPlaceholder( element );
        +
        +	if ( mode === "show" ) {
        +		temp = from;
        +		from = to;
        +		to = temp;
        +	}
        +
        +	// Set scaling factor
        +	factor = {
        +		from: {
        +			y: from.height / original.height,
        +			x: from.width / original.width
        +		},
        +		to: {
        +			y: to.height / original.height,
        +			x: to.width / original.width
        +		}
        +	};
        +
        +	// Scale the css box
        +	if ( scale === "box" || scale === "both" ) {
        +
        +		// Vertical props scaling
        +		if ( factor.from.y !== factor.to.y ) {
        +			from = $.effects.setTransition( element, vProps, factor.from.y, from );
        +			to = $.effects.setTransition( element, vProps, factor.to.y, to );
        +		}
        +
        +		// Horizontal props scaling
        +		if ( factor.from.x !== factor.to.x ) {
        +			from = $.effects.setTransition( element, hProps, factor.from.x, from );
        +			to = $.effects.setTransition( element, hProps, factor.to.x, to );
        +		}
        +	}
        +
        +	// Scale the content
        +	if ( scale === "content" || scale === "both" ) {
        +
        +		// Vertical props scaling
        +		if ( factor.from.y !== factor.to.y ) {
        +			from = $.effects.setTransition( element, cProps, factor.from.y, from );
        +			to = $.effects.setTransition( element, cProps, factor.to.y, to );
        +		}
        +	}
        +
        +	// Adjust the position properties based on the provided origin points
        +	if ( origin ) {
        +		baseline = $.effects.getBaseline( origin, original );
        +		from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
        +		from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
        +		to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
        +		to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
        +	}
        +	element.css( from );
        +
        +	// Animate the children if desired
        +	if ( scale === "content" || scale === "both" ) {
        +
        +		vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
        +		hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
        +
        +		// Only animate children with width attributes specified
        +		// TODO: is this right? should we include anything with css width specified as well
        +		element.find( "*[width]" ).each( function() {
        +			var child = $( this ),
        +				childOriginal = $.effects.scaledDimensions( child ),
        +				childFrom = {
        +					height: childOriginal.height * factor.from.y,
        +					width: childOriginal.width * factor.from.x,
        +					outerHeight: childOriginal.outerHeight * factor.from.y,
        +					outerWidth: childOriginal.outerWidth * factor.from.x
        +				},
        +				childTo = {
        +					height: childOriginal.height * factor.to.y,
        +					width: childOriginal.width * factor.to.x,
        +					outerHeight: childOriginal.height * factor.to.y,
        +					outerWidth: childOriginal.width * factor.to.x
        +				};
        +
        +			// Vertical props scaling
        +			if ( factor.from.y !== factor.to.y ) {
        +				childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
        +				childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
        +			}
        +
        +			// Horizontal props scaling
        +			if ( factor.from.x !== factor.to.x ) {
        +				childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
        +				childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
        +			}
        +
        +			if ( restore ) {
        +				$.effects.saveStyle( child );
        +			}
        +
        +			// Animate children
        +			child.css( childFrom );
        +			child.animate( childTo, options.duration, options.easing, function() {
        +
        +				// Restore children
        +				if ( restore ) {
        +					$.effects.restoreStyle( child );
        +				}
        +			} );
        +		} );
        +	}
        +
        +	// Animate
        +	element.animate( to, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: function() {
        +
        +			var offset = element.offset();
        +
        +			if ( to.opacity === 0 ) {
        +				element.css( "opacity", from.opacity );
        +			}
        +
        +			if ( !restore ) {
        +				element
        +					.css( "position", position === "static" ? "relative" : position )
        +					.offset( offset );
        +
        +				// Need to save style here so that automatic style restoration
        +				// doesn't restore to the original styles from before the animation.
        +				$.effects.saveStyle( element );
        +			}
        +
        +			done();
        +		}
        +	} );
        +
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Scale 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Scale Effect
        +//>>group: Effects
        +//>>description: Grows or shrinks an element and its content.
        +//>>docs: http://api.jqueryui.com/scale-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
        +
        +	// Create element
        +	var el = $( this ),
        +		mode = options.mode,
        +		percent = parseInt( options.percent, 10 ) ||
        +			( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
        +
        +		newOptions = $.extend( true, {
        +			from: $.effects.scaledDimensions( el ),
        +			to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
        +			origin: options.origin || [ "middle", "center" ]
        +		}, options );
        +
        +	// Fade option to support puff
        +	if ( options.fade ) {
        +		newOptions.from.opacity = 1;
        +		newOptions.to.opacity = 0;
        +	}
        +
        +	$.effects.effect.size.call( this, newOptions, done );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Puff 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Puff Effect
        +//>>group: Effects
        +//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
        +//>>docs: http://api.jqueryui.com/puff-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) {
        +	var newOptions = $.extend( true, {}, options, {
        +		fade: true,
        +		percent: parseInt( options.percent, 10 ) || 150
        +	} );
        +
        +	$.effects.effect.scale.call( this, newOptions, done );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Pulsate 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Pulsate Effect
        +//>>group: Effects
        +//>>description: Pulsates an element n times by changing the opacity to zero and back.
        +//>>docs: http://api.jqueryui.com/pulsate-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) {
        +	var element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +		hide = mode === "hide",
        +		showhide = show || hide,
        +
        +		// Showing or hiding leaves off the "last" animation
        +		anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
        +		duration = options.duration / anims,
        +		animateTo = 0,
        +		i = 1,
        +		queuelen = element.queue().length;
        +
        +	if ( show || !element.is( ":visible" ) ) {
        +		element.css( "opacity", 0 ).show();
        +		animateTo = 1;
        +	}
        +
        +	// Anims - 1 opacity "toggles"
        +	for ( ; i < anims; i++ ) {
        +		element.animate( { opacity: animateTo }, duration, options.easing );
        +		animateTo = 1 - animateTo;
        +	}
        +
        +	element.animate( { opacity: animateTo }, duration, options.easing );
        +
        +	element.queue( done );
        +
        +	$.effects.unshift( element, queuelen, anims + 1 );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Shake 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Shake Effect
        +//>>group: Effects
        +//>>description: Shakes an element horizontally or vertically n times.
        +//>>docs: http://api.jqueryui.com/shake-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
        +
        +	var i = 1,
        +		element = $( this ),
        +		direction = options.direction || "left",
        +		distance = options.distance || 20,
        +		times = options.times || 3,
        +		anims = times * 2 + 1,
        +		speed = Math.round( options.duration / anims ),
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		positiveMotion = ( direction === "up" || direction === "left" ),
        +		animation = {},
        +		animation1 = {},
        +		animation2 = {},
        +
        +		queuelen = element.queue().length;
        +
        +	$.effects.createPlaceholder( element );
        +
        +	// Animation
        +	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
        +	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
        +	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
        +
        +	// Animate
        +	element.animate( animation, speed, options.easing );
        +
        +	// Shakes
        +	for ( ; i < times; i++ ) {
        +		element
        +			.animate( animation1, speed, options.easing )
        +			.animate( animation2, speed, options.easing );
        +	}
        +
        +	element
        +		.animate( animation1, speed, options.easing )
        +		.animate( animation, speed / 2, options.easing )
        +		.queue( done );
        +
        +	$.effects.unshift( element, queuelen, anims + 1 );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Slide 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Slide Effect
        +//>>group: Effects
        +//>>description: Slides an element in and out of the viewport.
        +//>>docs: http://api.jqueryui.com/slide-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) {
        +	var startClip, startRef,
        +		element = $( this ),
        +		map = {
        +			up: [ "bottom", "top" ],
        +			down: [ "top", "bottom" ],
        +			left: [ "right", "left" ],
        +			right: [ "left", "right" ]
        +		},
        +		mode = options.mode,
        +		direction = options.direction || "left",
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		positiveMotion = ( direction === "up" || direction === "left" ),
        +		distance = options.distance ||
        +			element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
        +		animation = {};
        +
        +	$.effects.createPlaceholder( element );
        +
        +	startClip = element.cssClip();
        +	startRef = element.position()[ ref ];
        +
        +	// Define hide animation
        +	animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
        +	animation.clip = element.cssClip();
        +	animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
        +
        +	// Reverse the animation if we're showing
        +	if ( mode === "show" ) {
        +		element.cssClip( animation.clip );
        +		element.css( ref, animation[ ref ] );
        +		animation.clip = startClip;
        +		animation[ ref ] = startRef;
        +	}
        +
        +	// Actually animate
        +	element.animate( animation, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +} );
        +
        +
        +/*!
        + * jQuery UI Effects Transfer 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Transfer Effect
        +//>>group: Effects
        +//>>description: Displays a transfer effect from one element to another.
        +//>>docs: http://api.jqueryui.com/transfer-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +
        +
        +var effect;
        +if ( $.uiBackCompat !== false ) {
        +	effect = $.effects.define( "transfer", function( options, done ) {
        +		$( this ).transfer( options, done );
        +	} );
        +}
        +var effectsEffectTransfer = effect;
        +
        +
        +/*!
        + * jQuery UI Focusable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: :focusable Selector
        +//>>group: Core
        +//>>description: Selects elements which can be focused.
        +//>>docs: http://api.jqueryui.com/focusable-selector/
        +
        +
        +
        +// Selectors
        +$.ui.focusable = function( element, hasTabindex ) {
        +	var map, mapName, img, focusableIfVisible, fieldset,
        +		nodeName = element.nodeName.toLowerCase();
        +
        +	if ( "area" === nodeName ) {
        +		map = element.parentNode;
        +		mapName = map.name;
        +		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
        +			return false;
        +		}
        +		img = $( "img[usemap='#" + mapName + "']" );
        +		return img.length > 0 && img.is( ":visible" );
        +	}
        +
        +	if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
        +		focusableIfVisible = !element.disabled;
        +
        +		if ( focusableIfVisible ) {
        +
        +			// Form controls within a disabled fieldset are disabled.
        +			// However, controls within the fieldset's legend do not get disabled.
        +			// Since controls generally aren't placed inside legends, we skip
        +			// this portion of the check.
        +			fieldset = $( element ).closest( "fieldset" )[ 0 ];
        +			if ( fieldset ) {
        +				focusableIfVisible = !fieldset.disabled;
        +			}
        +		}
        +	} else if ( "a" === nodeName ) {
        +		focusableIfVisible = element.href || hasTabindex;
        +	} else {
        +		focusableIfVisible = hasTabindex;
        +	}
        +
        +	return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
        +};
        +
        +// Support: IE 8 only
        +// IE 8 doesn't resolve inherit to visible/hidden for computed values
        +function visible( element ) {
        +	var visibility = element.css( "visibility" );
        +	while ( visibility === "inherit" ) {
        +		element = element.parent();
        +		visibility = element.css( "visibility" );
        +	}
        +	return visibility !== "hidden";
        +}
        +
        +$.extend( $.expr[ ":" ], {
        +	focusable: function( element ) {
        +		return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
        +	}
        +} );
        +
        +var focusable = $.ui.focusable;
        +
        +
        +
        +
        +// Support: IE8 Only
        +// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
        +// with a string, so we need to find the proper form.
        +var form = $.fn.form = function() {
        +	return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
        +};
        +
        +
        +/*!
        + * jQuery UI Form Reset Mixin 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Form Reset Mixin
        +//>>group: Core
        +//>>description: Refresh input widgets when their form is reset
        +//>>docs: http://api.jqueryui.com/form-reset-mixin/
        +
        +
        +
        +var formResetMixin = $.ui.formResetMixin = {
        +	_formResetHandler: function() {
        +		var form = $( this );
        +
        +		// Wait for the form reset to actually happen before refreshing
        +		setTimeout( function() {
        +			var instances = form.data( "ui-form-reset-instances" );
        +			$.each( instances, function() {
        +				this.refresh();
        +			} );
        +		} );
        +	},
        +
        +	_bindFormResetHandler: function() {
        +		this.form = this.element.form();
        +		if ( !this.form.length ) {
        +			return;
        +		}
        +
        +		var instances = this.form.data( "ui-form-reset-instances" ) || [];
        +		if ( !instances.length ) {
        +
        +			// We don't use _on() here because we use a single event handler per form
        +			this.form.on( "reset.ui-form-reset", this._formResetHandler );
        +		}
        +		instances.push( this );
        +		this.form.data( "ui-form-reset-instances", instances );
        +	},
        +
        +	_unbindFormResetHandler: function() {
        +		if ( !this.form.length ) {
        +			return;
        +		}
        +
        +		var instances = this.form.data( "ui-form-reset-instances" );
        +		instances.splice( $.inArray( this, instances ), 1 );
        +		if ( instances.length ) {
        +			this.form.data( "ui-form-reset-instances", instances );
        +		} else {
        +			this.form
        +				.removeData( "ui-form-reset-instances" )
        +				.off( "reset.ui-form-reset" );
        +		}
        +	}
        +};
        +
        +
        +/*!
        + * jQuery UI Support for jQuery core 1.7.x 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + */
        +
        +//>>label: jQuery 1.7 Support
        +//>>group: Core
        +//>>description: Support version 1.7.x of jQuery core
        +
        +
        +
        +// Support: jQuery 1.7 only
        +// Not a great way to check versions, but since we only support 1.7+ and only
        +// need to detect <1.8, this is a simple check that should suffice. Checking
        +// for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0
        +// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting
        +// 1.7 anymore). See #11197 for why we're not using feature detection.
        +if ( $.fn.jquery.substring( 0, 3 ) === "1.7" ) {
        +
        +	// Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight()
        +	// Unlike jQuery Core 1.8+, these only support numeric values to set the
        +	// dimensions in pixels
        +	$.each( [ "Width", "Height" ], function( i, name ) {
        +		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
        +			type = name.toLowerCase(),
        +			orig = {
        +				innerWidth: $.fn.innerWidth,
        +				innerHeight: $.fn.innerHeight,
        +				outerWidth: $.fn.outerWidth,
        +				outerHeight: $.fn.outerHeight
        +			};
        +
        +		function reduce( elem, size, border, margin ) {
        +			$.each( side, function() {
        +				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
        +				if ( border ) {
        +					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
        +				}
        +				if ( margin ) {
        +					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
        +				}
        +			} );
        +			return size;
        +		}
        +
        +		$.fn[ "inner" + name ] = function( size ) {
        +			if ( size === undefined ) {
        +				return orig[ "inner" + name ].call( this );
        +			}
        +
        +			return this.each( function() {
        +				$( this ).css( type, reduce( this, size ) + "px" );
        +			} );
        +		};
        +
        +		$.fn[ "outer" + name ] = function( size, margin ) {
        +			if ( typeof size !== "number" ) {
        +				return orig[ "outer" + name ].call( this, size );
        +			}
        +
        +			return this.each( function() {
        +				$( this ).css( type, reduce( this, size, true, margin ) + "px" );
        +			} );
        +		};
        +	} );
        +
        +	$.fn.addBack = function( selector ) {
        +		return this.add( selector == null ?
        +			this.prevObject : this.prevObject.filter( selector )
        +		);
        +	};
        +}
        +
        +;
        +/*!
        + * jQuery UI Keycode 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Keycode
        +//>>group: Core
        +//>>description: Provide keycodes as keynames
        +//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
        +
        +
        +var keycode = $.ui.keyCode = {
        +	BACKSPACE: 8,
        +	COMMA: 188,
        +	DELETE: 46,
        +	DOWN: 40,
        +	END: 35,
        +	ENTER: 13,
        +	ESCAPE: 27,
        +	HOME: 36,
        +	LEFT: 37,
        +	PAGE_DOWN: 34,
        +	PAGE_UP: 33,
        +	PERIOD: 190,
        +	RIGHT: 39,
        +	SPACE: 32,
        +	TAB: 9,
        +	UP: 38
        +};
        +
        +
        +
        +
        +// Internal use only
        +var escapeSelector = $.ui.escapeSelector = ( function() {
        +	var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
        +	return function( selector ) {
        +		return selector.replace( selectorEscape, "\\$1" );
        +	};
        +} )();
        +
        +
        +/*!
        + * jQuery UI Labels 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: labels
        +//>>group: Core
        +//>>description: Find all the labels associated with a given input
        +//>>docs: http://api.jqueryui.com/labels/
        +
        +
        +
        +var labels = $.fn.labels = function() {
        +	var ancestor, selector, id, labels, ancestors;
        +
        +	// Check control.labels first
        +	if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
        +		return this.pushStack( this[ 0 ].labels );
        +	}
        +
        +	// Support: IE <= 11, FF <= 37, Android <= 2.3 only
        +	// Above browsers do not support control.labels. Everything below is to support them
        +	// as well as document fragments. control.labels does not work on document fragments
        +	labels = this.eq( 0 ).parents( "label" );
        +
        +	// Look for the label based on the id
        +	id = this.attr( "id" );
        +	if ( id ) {
        +
        +		// We don't search against the document in case the element
        +		// is disconnected from the DOM
        +		ancestor = this.eq( 0 ).parents().last();
        +
        +		// Get a full set of top level ancestors
        +		ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
        +
        +		// Create a selector for the label based on the id
        +		selector = "label[for='" + $.ui.escapeSelector( id ) + "']";
        +
        +		labels = labels.add( ancestors.find( selector ).addBack( selector ) );
        +
        +	}
        +
        +	// Return whatever we have found for labels
        +	return this.pushStack( labels );
        +};
        +
        +
        +/*!
        + * jQuery UI Scroll Parent 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: scrollParent
        +//>>group: Core
        +//>>description: Get the closest ancestor element that is scrollable.
        +//>>docs: http://api.jqueryui.com/scrollParent/
        +
        +
        +
        +var scrollParent = $.fn.scrollParent = function( includeHidden ) {
        +	var position = this.css( "position" ),
        +		excludeStaticParent = position === "absolute",
        +		overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
        +		scrollParent = this.parents().filter( function() {
        +			var parent = $( this );
        +			if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
        +				return false;
        +			}
        +			return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
        +				parent.css( "overflow-x" ) );
        +		} ).eq( 0 );
        +
        +	return position === "fixed" || !scrollParent.length ?
        +		$( this[ 0 ].ownerDocument || document ) :
        +		scrollParent;
        +};
        +
        +
        +/*!
        + * jQuery UI Tabbable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: :tabbable Selector
        +//>>group: Core
        +//>>description: Selects elements which can be tabbed to.
        +//>>docs: http://api.jqueryui.com/tabbable-selector/
        +
        +
        +
        +var tabbable = $.extend( $.expr[ ":" ], {
        +	tabbable: function( element ) {
        +		var tabIndex = $.attr( element, "tabindex" ),
        +			hasTabindex = tabIndex != null;
        +		return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
        +	}
        +} );
        +
        +
        +/*!
        + * jQuery UI Unique ID 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: uniqueId
        +//>>group: Core
        +//>>description: Functions to generate and remove uniqueId's
        +//>>docs: http://api.jqueryui.com/uniqueId/
        +
        +
        +
        +var uniqueId = $.fn.extend( {
        +	uniqueId: ( function() {
        +		var uuid = 0;
        +
        +		return function() {
        +			return this.each( function() {
        +				if ( !this.id ) {
        +					this.id = "ui-id-" + ( ++uuid );
        +				}
        +			} );
        +		};
        +	} )(),
        +
        +	removeUniqueId: function() {
        +		return this.each( function() {
        +			if ( /^ui-id-\d+$/.test( this.id ) ) {
        +				$( this ).removeAttr( "id" );
        +			}
        +		} );
        +	}
        +} );
        +
        +
        +/*!
        + * jQuery UI Accordion 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Accordion
        +//>>group: Widgets
        +// jscs:disable maximumLineLength
        +//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/accordion/
        +//>>demos: http://jqueryui.com/accordion/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/accordion.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +var widgetsAccordion = $.widget( "ui.accordion", {
        +	version: "1.12.1",
        +	options: {
        +		active: 0,
        +		animate: {},
        +		classes: {
        +			"ui-accordion-header": "ui-corner-top",
        +			"ui-accordion-header-collapsed": "ui-corner-all",
        +			"ui-accordion-content": "ui-corner-bottom"
        +		},
        +		collapsible: false,
        +		event: "click",
        +		header: "> li > :first-child, > :not(li):even",
        +		heightStyle: "auto",
        +		icons: {
        +			activeHeader: "ui-icon-triangle-1-s",
        +			header: "ui-icon-triangle-1-e"
        +		},
        +
        +		// Callbacks
        +		activate: null,
        +		beforeActivate: null
        +	},
        +
        +	hideProps: {
        +		borderTopWidth: "hide",
        +		borderBottomWidth: "hide",
        +		paddingTop: "hide",
        +		paddingBottom: "hide",
        +		height: "hide"
        +	},
        +
        +	showProps: {
        +		borderTopWidth: "show",
        +		borderBottomWidth: "show",
        +		paddingTop: "show",
        +		paddingBottom: "show",
        +		height: "show"
        +	},
        +
        +	_create: function() {
        +		var options = this.options;
        +
        +		this.prevShow = this.prevHide = $();
        +		this._addClass( "ui-accordion", "ui-widget ui-helper-reset" );
        +		this.element.attr( "role", "tablist" );
        +
        +		// Don't allow collapsible: false and active: false / null
        +		if ( !options.collapsible && ( options.active === false || options.active == null ) ) {
        +			options.active = 0;
        +		}
        +
        +		this._processPanels();
        +
        +		// handle negative values
        +		if ( options.active < 0 ) {
        +			options.active += this.headers.length;
        +		}
        +		this._refresh();
        +	},
        +
        +	_getCreateEventData: function() {
        +		return {
        +			header: this.active,
        +			panel: !this.active.length ? $() : this.active.next()
        +		};
        +	},
        +
        +	_createIcons: function() {
        +		var icon, children,
        +			icons = this.options.icons;
        +
        +		if ( icons ) {
        +			icon = $( "<span>" );
        +			this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header );
        +			icon.prependTo( this.headers );
        +			children = this.active.children( ".ui-accordion-header-icon" );
        +			this._removeClass( children, icons.header )
        +				._addClass( children, null, icons.activeHeader )
        +				._addClass( this.headers, "ui-accordion-icons" );
        +		}
        +	},
        +
        +	_destroyIcons: function() {
        +		this._removeClass( this.headers, "ui-accordion-icons" );
        +		this.headers.children( ".ui-accordion-header-icon" ).remove();
        +	},
        +
        +	_destroy: function() {
        +		var contents;
        +
        +		// Clean up main element
        +		this.element.removeAttr( "role" );
        +
        +		// Clean up headers
        +		this.headers
        +			.removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" )
        +			.removeUniqueId();
        +
        +		this._destroyIcons();
        +
        +		// Clean up content panels
        +		contents = this.headers.next()
        +			.css( "display", "" )
        +			.removeAttr( "role aria-hidden aria-labelledby" )
        +			.removeUniqueId();
        +
        +		if ( this.options.heightStyle !== "content" ) {
        +			contents.css( "height", "" );
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "active" ) {
        +
        +			// _activate() will handle invalid values and update this.options
        +			this._activate( value );
        +			return;
        +		}
        +
        +		if ( key === "event" ) {
        +			if ( this.options.event ) {
        +				this._off( this.headers, this.options.event );
        +			}
        +			this._setupEvents( value );
        +		}
        +
        +		this._super( key, value );
        +
        +		// Setting collapsible: false while collapsed; open first panel
        +		if ( key === "collapsible" && !value && this.options.active === false ) {
        +			this._activate( 0 );
        +		}
        +
        +		if ( key === "icons" ) {
        +			this._destroyIcons();
        +			if ( value ) {
        +				this._createIcons();
        +			}
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.element.attr( "aria-disabled", value );
        +
        +		// Support: IE8 Only
        +		// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
        +		// so we need to add the disabled class to the headers and panels
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +		this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled",
        +			!!value );
        +	},
        +
        +	_keydown: function( event ) {
        +		if ( event.altKey || event.ctrlKey ) {
        +			return;
        +		}
        +
        +		var keyCode = $.ui.keyCode,
        +			length = this.headers.length,
        +			currentIndex = this.headers.index( event.target ),
        +			toFocus = false;
        +
        +		switch ( event.keyCode ) {
        +		case keyCode.RIGHT:
        +		case keyCode.DOWN:
        +			toFocus = this.headers[ ( currentIndex + 1 ) % length ];
        +			break;
        +		case keyCode.LEFT:
        +		case keyCode.UP:
        +			toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
        +			break;
        +		case keyCode.SPACE:
        +		case keyCode.ENTER:
        +			this._eventHandler( event );
        +			break;
        +		case keyCode.HOME:
        +			toFocus = this.headers[ 0 ];
        +			break;
        +		case keyCode.END:
        +			toFocus = this.headers[ length - 1 ];
        +			break;
        +		}
        +
        +		if ( toFocus ) {
        +			$( event.target ).attr( "tabIndex", -1 );
        +			$( toFocus ).attr( "tabIndex", 0 );
        +			$( toFocus ).trigger( "focus" );
        +			event.preventDefault();
        +		}
        +	},
        +
        +	_panelKeyDown: function( event ) {
        +		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
        +			$( event.currentTarget ).prev().trigger( "focus" );
        +		}
        +	},
        +
        +	refresh: function() {
        +		var options = this.options;
        +		this._processPanels();
        +
        +		// Was collapsed or no panel
        +		if ( ( options.active === false && options.collapsible === true ) ||
        +				!this.headers.length ) {
        +			options.active = false;
        +			this.active = $();
        +
        +		// active false only when collapsible is true
        +		} else if ( options.active === false ) {
        +			this._activate( 0 );
        +
        +		// was active, but active panel is gone
        +		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        +
        +			// all remaining panel are disabled
        +			if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) {
        +				options.active = false;
        +				this.active = $();
        +
        +			// activate previous panel
        +			} else {
        +				this._activate( Math.max( 0, options.active - 1 ) );
        +			}
        +
        +		// was active, active panel still exists
        +		} else {
        +
        +			// make sure active index is correct
        +			options.active = this.headers.index( this.active );
        +		}
        +
        +		this._destroyIcons();
        +
        +		this._refresh();
        +	},
        +
        +	_processPanels: function() {
        +		var prevHeaders = this.headers,
        +			prevPanels = this.panels;
        +
        +		this.headers = this.element.find( this.options.header );
        +		this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed",
        +			"ui-state-default" );
        +
        +		this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide();
        +		this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" );
        +
        +		// Avoid memory leaks (#10056)
        +		if ( prevPanels ) {
        +			this._off( prevHeaders.not( this.headers ) );
        +			this._off( prevPanels.not( this.panels ) );
        +		}
        +	},
        +
        +	_refresh: function() {
        +		var maxHeight,
        +			options = this.options,
        +			heightStyle = options.heightStyle,
        +			parent = this.element.parent();
        +
        +		this.active = this._findActive( options.active );
        +		this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" )
        +			._removeClass( this.active, "ui-accordion-header-collapsed" );
        +		this._addClass( this.active.next(), "ui-accordion-content-active" );
        +		this.active.next().show();
        +
        +		this.headers
        +			.attr( "role", "tab" )
        +			.each( function() {
        +				var header = $( this ),
        +					headerId = header.uniqueId().attr( "id" ),
        +					panel = header.next(),
        +					panelId = panel.uniqueId().attr( "id" );
        +				header.attr( "aria-controls", panelId );
        +				panel.attr( "aria-labelledby", headerId );
        +			} )
        +			.next()
        +				.attr( "role", "tabpanel" );
        +
        +		this.headers
        +			.not( this.active )
        +				.attr( {
        +					"aria-selected": "false",
        +					"aria-expanded": "false",
        +					tabIndex: -1
        +				} )
        +				.next()
        +					.attr( {
        +						"aria-hidden": "true"
        +					} )
        +					.hide();
        +
        +		// Make sure at least one header is in the tab order
        +		if ( !this.active.length ) {
        +			this.headers.eq( 0 ).attr( "tabIndex", 0 );
        +		} else {
        +			this.active.attr( {
        +				"aria-selected": "true",
        +				"aria-expanded": "true",
        +				tabIndex: 0
        +			} )
        +				.next()
        +					.attr( {
        +						"aria-hidden": "false"
        +					} );
        +		}
        +
        +		this._createIcons();
        +
        +		this._setupEvents( options.event );
        +
        +		if ( heightStyle === "fill" ) {
        +			maxHeight = parent.height();
        +			this.element.siblings( ":visible" ).each( function() {
        +				var elem = $( this ),
        +					position = elem.css( "position" );
        +
        +				if ( position === "absolute" || position === "fixed" ) {
        +					return;
        +				}
        +				maxHeight -= elem.outerHeight( true );
        +			} );
        +
        +			this.headers.each( function() {
        +				maxHeight -= $( this ).outerHeight( true );
        +			} );
        +
        +			this.headers.next()
        +				.each( function() {
        +					$( this ).height( Math.max( 0, maxHeight -
        +						$( this ).innerHeight() + $( this ).height() ) );
        +				} )
        +				.css( "overflow", "auto" );
        +		} else if ( heightStyle === "auto" ) {
        +			maxHeight = 0;
        +			this.headers.next()
        +				.each( function() {
        +					var isVisible = $( this ).is( ":visible" );
        +					if ( !isVisible ) {
        +						$( this ).show();
        +					}
        +					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
        +					if ( !isVisible ) {
        +						$( this ).hide();
        +					}
        +				} )
        +				.height( maxHeight );
        +		}
        +	},
        +
        +	_activate: function( index ) {
        +		var active = this._findActive( index )[ 0 ];
        +
        +		// Trying to activate the already active panel
        +		if ( active === this.active[ 0 ] ) {
        +			return;
        +		}
        +
        +		// Trying to collapse, simulate a click on the currently active header
        +		active = active || this.active[ 0 ];
        +
        +		this._eventHandler( {
        +			target: active,
        +			currentTarget: active,
        +			preventDefault: $.noop
        +		} );
        +	},
        +
        +	_findActive: function( selector ) {
        +		return typeof selector === "number" ? this.headers.eq( selector ) : $();
        +	},
        +
        +	_setupEvents: function( event ) {
        +		var events = {
        +			keydown: "_keydown"
        +		};
        +		if ( event ) {
        +			$.each( event.split( " " ), function( index, eventName ) {
        +				events[ eventName ] = "_eventHandler";
        +			} );
        +		}
        +
        +		this._off( this.headers.add( this.headers.next() ) );
        +		this._on( this.headers, events );
        +		this._on( this.headers.next(), { keydown: "_panelKeyDown" } );
        +		this._hoverable( this.headers );
        +		this._focusable( this.headers );
        +	},
        +
        +	_eventHandler: function( event ) {
        +		var activeChildren, clickedChildren,
        +			options = this.options,
        +			active = this.active,
        +			clicked = $( event.currentTarget ),
        +			clickedIsActive = clicked[ 0 ] === active[ 0 ],
        +			collapsing = clickedIsActive && options.collapsible,
        +			toShow = collapsing ? $() : clicked.next(),
        +			toHide = active.next(),
        +			eventData = {
        +				oldHeader: active,
        +				oldPanel: toHide,
        +				newHeader: collapsing ? $() : clicked,
        +				newPanel: toShow
        +			};
        +
        +		event.preventDefault();
        +
        +		if (
        +
        +				// click on active header, but not collapsible
        +				( clickedIsActive && !options.collapsible ) ||
        +
        +				// allow canceling activation
        +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        +			return;
        +		}
        +
        +		options.active = collapsing ? false : this.headers.index( clicked );
        +
        +		// When the call to ._toggle() comes after the class changes
        +		// it causes a very odd bug in IE 8 (see #6720)
        +		this.active = clickedIsActive ? $() : clicked;
        +		this._toggle( eventData );
        +
        +		// Switch classes
        +		// corner classes on the previously active header stay after the animation
        +		this._removeClass( active, "ui-accordion-header-active", "ui-state-active" );
        +		if ( options.icons ) {
        +			activeChildren = active.children( ".ui-accordion-header-icon" );
        +			this._removeClass( activeChildren, null, options.icons.activeHeader )
        +				._addClass( activeChildren, null, options.icons.header );
        +		}
        +
        +		if ( !clickedIsActive ) {
        +			this._removeClass( clicked, "ui-accordion-header-collapsed" )
        +				._addClass( clicked, "ui-accordion-header-active", "ui-state-active" );
        +			if ( options.icons ) {
        +				clickedChildren = clicked.children( ".ui-accordion-header-icon" );
        +				this._removeClass( clickedChildren, null, options.icons.header )
        +					._addClass( clickedChildren, null, options.icons.activeHeader );
        +			}
        +
        +			this._addClass( clicked.next(), "ui-accordion-content-active" );
        +		}
        +	},
        +
        +	_toggle: function( data ) {
        +		var toShow = data.newPanel,
        +			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
        +
        +		// Handle activating a panel during the animation for another activation
        +		this.prevShow.add( this.prevHide ).stop( true, true );
        +		this.prevShow = toShow;
        +		this.prevHide = toHide;
        +
        +		if ( this.options.animate ) {
        +			this._animate( toShow, toHide, data );
        +		} else {
        +			toHide.hide();
        +			toShow.show();
        +			this._toggleComplete( data );
        +		}
        +
        +		toHide.attr( {
        +			"aria-hidden": "true"
        +		} );
        +		toHide.prev().attr( {
        +			"aria-selected": "false",
        +			"aria-expanded": "false"
        +		} );
        +
        +		// if we're switching panels, remove the old header from the tab order
        +		// if we're opening from collapsed state, remove the previous header from the tab order
        +		// if we're collapsing, then keep the collapsing header in the tab order
        +		if ( toShow.length && toHide.length ) {
        +			toHide.prev().attr( {
        +				"tabIndex": -1,
        +				"aria-expanded": "false"
        +			} );
        +		} else if ( toShow.length ) {
        +			this.headers.filter( function() {
        +				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
        +			} )
        +				.attr( "tabIndex", -1 );
        +		}
        +
        +		toShow
        +			.attr( "aria-hidden", "false" )
        +			.prev()
        +				.attr( {
        +					"aria-selected": "true",
        +					"aria-expanded": "true",
        +					tabIndex: 0
        +				} );
        +	},
        +
        +	_animate: function( toShow, toHide, data ) {
        +		var total, easing, duration,
        +			that = this,
        +			adjust = 0,
        +			boxSizing = toShow.css( "box-sizing" ),
        +			down = toShow.length &&
        +				( !toHide.length || ( toShow.index() < toHide.index() ) ),
        +			animate = this.options.animate || {},
        +			options = down && animate.down || animate,
        +			complete = function() {
        +				that._toggleComplete( data );
        +			};
        +
        +		if ( typeof options === "number" ) {
        +			duration = options;
        +		}
        +		if ( typeof options === "string" ) {
        +			easing = options;
        +		}
        +
        +		// fall back from options to animation in case of partial down settings
        +		easing = easing || options.easing || animate.easing;
        +		duration = duration || options.duration || animate.duration;
        +
        +		if ( !toHide.length ) {
        +			return toShow.animate( this.showProps, duration, easing, complete );
        +		}
        +		if ( !toShow.length ) {
        +			return toHide.animate( this.hideProps, duration, easing, complete );
        +		}
        +
        +		total = toShow.show().outerHeight();
        +		toHide.animate( this.hideProps, {
        +			duration: duration,
        +			easing: easing,
        +			step: function( now, fx ) {
        +				fx.now = Math.round( now );
        +			}
        +		} );
        +		toShow
        +			.hide()
        +			.animate( this.showProps, {
        +				duration: duration,
        +				easing: easing,
        +				complete: complete,
        +				step: function( now, fx ) {
        +					fx.now = Math.round( now );
        +					if ( fx.prop !== "height" ) {
        +						if ( boxSizing === "content-box" ) {
        +							adjust += fx.now;
        +						}
        +					} else if ( that.options.heightStyle !== "content" ) {
        +						fx.now = Math.round( total - toHide.outerHeight() - adjust );
        +						adjust = 0;
        +					}
        +				}
        +			} );
        +	},
        +
        +	_toggleComplete: function( data ) {
        +		var toHide = data.oldPanel,
        +			prev = toHide.prev();
        +
        +		this._removeClass( toHide, "ui-accordion-content-active" );
        +		this._removeClass( prev, "ui-accordion-header-active" )
        +			._addClass( prev, "ui-accordion-header-collapsed" );
        +
        +		// Work around for rendering bug in IE (#5421)
        +		if ( toHide.length ) {
        +			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
        +		}
        +		this._trigger( "activate", null, data );
        +	}
        +} );
        +
        +
        +
        +var safeActiveElement = $.ui.safeActiveElement = function( document ) {
        +	var activeElement;
        +
        +	// Support: IE 9 only
        +	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
        +	try {
        +		activeElement = document.activeElement;
        +	} catch ( error ) {
        +		activeElement = document.body;
        +	}
        +
        +	// Support: IE 9 - 11 only
        +	// IE may return null instead of an element
        +	// Interestingly, this only seems to occur when NOT in an iframe
        +	if ( !activeElement ) {
        +		activeElement = document.body;
        +	}
        +
        +	// Support: IE 11 only
        +	// IE11 returns a seemingly empty object in some cases when accessing
        +	// document.activeElement from an <iframe>
        +	if ( !activeElement.nodeName ) {
        +		activeElement = document.body;
        +	}
        +
        +	return activeElement;
        +};
        +
        +
        +/*!
        + * jQuery UI Menu 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Menu
        +//>>group: Widgets
        +//>>description: Creates nestable menus.
        +//>>docs: http://api.jqueryui.com/menu/
        +//>>demos: http://jqueryui.com/menu/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/menu.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +var widgetsMenu = $.widget( "ui.menu", {
        +	version: "1.12.1",
        +	defaultElement: "<ul>",
        +	delay: 300,
        +	options: {
        +		icons: {
        +			submenu: "ui-icon-caret-1-e"
        +		},
        +		items: "> *",
        +		menus: "ul",
        +		position: {
        +			my: "left top",
        +			at: "right top"
        +		},
        +		role: "menu",
        +
        +		// Callbacks
        +		blur: null,
        +		focus: null,
        +		select: null
        +	},
        +
        +	_create: function() {
        +		this.activeMenu = this.element;
        +
        +		// Flag used to prevent firing of the click handler
        +		// as the event bubbles up through nested menus
        +		this.mouseHandled = false;
        +		this.element
        +			.uniqueId()
        +			.attr( {
        +				role: this.options.role,
        +				tabIndex: 0
        +			} );
        +
        +		this._addClass( "ui-menu", "ui-widget ui-widget-content" );
        +		this._on( {
        +
        +			// Prevent focus from sticking to links inside menu after clicking
        +			// them (focus should always stay on UL during navigation).
        +			"mousedown .ui-menu-item": function( event ) {
        +				event.preventDefault();
        +			},
        +			"click .ui-menu-item": function( event ) {
        +				var target = $( event.target );
        +				var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
        +				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
        +					this.select( event );
        +
        +					// Only set the mouseHandled flag if the event will bubble, see #9469.
        +					if ( !event.isPropagationStopped() ) {
        +						this.mouseHandled = true;
        +					}
        +
        +					// Open submenu on click
        +					if ( target.has( ".ui-menu" ).length ) {
        +						this.expand( event );
        +					} else if ( !this.element.is( ":focus" ) &&
        +							active.closest( ".ui-menu" ).length ) {
        +
        +						// Redirect focus to the menu
        +						this.element.trigger( "focus", [ true ] );
        +
        +						// If the active item is on the top level, let it stay active.
        +						// Otherwise, blur the active item since it is no longer visible.
        +						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
        +							clearTimeout( this.timer );
        +						}
        +					}
        +				}
        +			},
        +			"mouseenter .ui-menu-item": function( event ) {
        +
        +				// Ignore mouse events while typeahead is active, see #10458.
        +				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
        +				// is over an item in the menu
        +				if ( this.previousFilter ) {
        +					return;
        +				}
        +
        +				var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
        +					target = $( event.currentTarget );
        +
        +				// Ignore bubbled events on parent items, see #11641
        +				if ( actualTarget[ 0 ] !== target[ 0 ] ) {
        +					return;
        +				}
        +
        +				// Remove ui-state-active class from siblings of the newly focused menu item
        +				// to avoid a jump caused by adjacent elements both having a class with a border
        +				this._removeClass( target.siblings().children( ".ui-state-active" ),
        +					null, "ui-state-active" );
        +				this.focus( event, target );
        +			},
        +			mouseleave: "collapseAll",
        +			"mouseleave .ui-menu": "collapseAll",
        +			focus: function( event, keepActiveItem ) {
        +
        +				// If there's already an active item, keep it active
        +				// If not, activate the first item
        +				var item = this.active || this.element.find( this.options.items ).eq( 0 );
        +
        +				if ( !keepActiveItem ) {
        +					this.focus( event, item );
        +				}
        +			},
        +			blur: function( event ) {
        +				this._delay( function() {
        +					var notContained = !$.contains(
        +						this.element[ 0 ],
        +						$.ui.safeActiveElement( this.document[ 0 ] )
        +					);
        +					if ( notContained ) {
        +						this.collapseAll( event );
        +					}
        +				} );
        +			},
        +			keydown: "_keydown"
        +		} );
        +
        +		this.refresh();
        +
        +		// Clicks outside of a menu collapse any open menus
        +		this._on( this.document, {
        +			click: function( event ) {
        +				if ( this._closeOnDocumentClick( event ) ) {
        +					this.collapseAll( event );
        +				}
        +
        +				// Reset the mouseHandled flag
        +				this.mouseHandled = false;
        +			}
        +		} );
        +	},
        +
        +	_destroy: function() {
        +		var items = this.element.find( ".ui-menu-item" )
        +				.removeAttr( "role aria-disabled" ),
        +			submenus = items.children( ".ui-menu-item-wrapper" )
        +				.removeUniqueId()
        +				.removeAttr( "tabIndex role aria-haspopup" );
        +
        +		// Destroy (sub)menus
        +		this.element
        +			.removeAttr( "aria-activedescendant" )
        +			.find( ".ui-menu" ).addBack()
        +				.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
        +					"tabIndex" )
        +				.removeUniqueId()
        +				.show();
        +
        +		submenus.children().each( function() {
        +			var elem = $( this );
        +			if ( elem.data( "ui-menu-submenu-caret" ) ) {
        +				elem.remove();
        +			}
        +		} );
        +	},
        +
        +	_keydown: function( event ) {
        +		var match, prev, character, skip,
        +			preventDefault = true;
        +
        +		switch ( event.keyCode ) {
        +		case $.ui.keyCode.PAGE_UP:
        +			this.previousPage( event );
        +			break;
        +		case $.ui.keyCode.PAGE_DOWN:
        +			this.nextPage( event );
        +			break;
        +		case $.ui.keyCode.HOME:
        +			this._move( "first", "first", event );
        +			break;
        +		case $.ui.keyCode.END:
        +			this._move( "last", "last", event );
        +			break;
        +		case $.ui.keyCode.UP:
        +			this.previous( event );
        +			break;
        +		case $.ui.keyCode.DOWN:
        +			this.next( event );
        +			break;
        +		case $.ui.keyCode.LEFT:
        +			this.collapse( event );
        +			break;
        +		case $.ui.keyCode.RIGHT:
        +			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
        +				this.expand( event );
        +			}
        +			break;
        +		case $.ui.keyCode.ENTER:
        +		case $.ui.keyCode.SPACE:
        +			this._activate( event );
        +			break;
        +		case $.ui.keyCode.ESCAPE:
        +			this.collapse( event );
        +			break;
        +		default:
        +			preventDefault = false;
        +			prev = this.previousFilter || "";
        +			skip = false;
        +
        +			// Support number pad values
        +			character = event.keyCode >= 96 && event.keyCode <= 105 ?
        +				( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
        +
        +			clearTimeout( this.filterTimer );
        +
        +			if ( character === prev ) {
        +				skip = true;
        +			} else {
        +				character = prev + character;
        +			}
        +
        +			match = this._filterMenuItems( character );
        +			match = skip && match.index( this.active.next() ) !== -1 ?
        +				this.active.nextAll( ".ui-menu-item" ) :
        +				match;
        +
        +			// If no matches on the current filter, reset to the last character pressed
        +			// to move down the menu to the first item that starts with that character
        +			if ( !match.length ) {
        +				character = String.fromCharCode( event.keyCode );
        +				match = this._filterMenuItems( character );
        +			}
        +
        +			if ( match.length ) {
        +				this.focus( event, match );
        +				this.previousFilter = character;
        +				this.filterTimer = this._delay( function() {
        +					delete this.previousFilter;
        +				}, 1000 );
        +			} else {
        +				delete this.previousFilter;
        +			}
        +		}
        +
        +		if ( preventDefault ) {
        +			event.preventDefault();
        +		}
        +	},
        +
        +	_activate: function( event ) {
        +		if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
        +			if ( this.active.children( "[aria-haspopup='true']" ).length ) {
        +				this.expand( event );
        +			} else {
        +				this.select( event );
        +			}
        +		}
        +	},
        +
        +	refresh: function() {
        +		var menus, items, newSubmenus, newItems, newWrappers,
        +			that = this,
        +			icon = this.options.icons.submenu,
        +			submenus = this.element.find( this.options.menus );
        +
        +		this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
        +
        +		// Initialize nested menus
        +		newSubmenus = submenus.filter( ":not(.ui-menu)" )
        +			.hide()
        +			.attr( {
        +				role: this.options.role,
        +				"aria-hidden": "true",
        +				"aria-expanded": "false"
        +			} )
        +			.each( function() {
        +				var menu = $( this ),
        +					item = menu.prev(),
        +					submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
        +
        +				that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
        +				item
        +					.attr( "aria-haspopup", "true" )
        +					.prepend( submenuCaret );
        +				menu.attr( "aria-labelledby", item.attr( "id" ) );
        +			} );
        +
        +		this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
        +
        +		menus = submenus.add( this.element );
        +		items = menus.find( this.options.items );
        +
        +		// Initialize menu-items containing spaces and/or dashes only as dividers
        +		items.not( ".ui-menu-item" ).each( function() {
        +			var item = $( this );
        +			if ( that._isDivider( item ) ) {
        +				that._addClass( item, "ui-menu-divider", "ui-widget-content" );
        +			}
        +		} );
        +
        +		// Don't refresh list items that are already adapted
        +		newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
        +		newWrappers = newItems.children()
        +			.not( ".ui-menu" )
        +				.uniqueId()
        +				.attr( {
        +					tabIndex: -1,
        +					role: this._itemRole()
        +				} );
        +		this._addClass( newItems, "ui-menu-item" )
        +			._addClass( newWrappers, "ui-menu-item-wrapper" );
        +
        +		// Add aria-disabled attribute to any disabled menu item
        +		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
        +
        +		// If the active item has been removed, blur the menu
        +		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        +			this.blur();
        +		}
        +	},
        +
        +	_itemRole: function() {
        +		return {
        +			menu: "menuitem",
        +			listbox: "option"
        +		}[ this.options.role ];
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "icons" ) {
        +			var icons = this.element.find( ".ui-menu-icon" );
        +			this._removeClass( icons, null, this.options.icons.submenu )
        +				._addClass( icons, null, value.submenu );
        +		}
        +		this._super( key, value );
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.element.attr( "aria-disabled", String( value ) );
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +	},
        +
        +	focus: function( event, item ) {
        +		var nested, focused, activeParent;
        +		this.blur( event, event && event.type === "focus" );
        +
        +		this._scrollIntoView( item );
        +
        +		this.active = item.first();
        +
        +		focused = this.active.children( ".ui-menu-item-wrapper" );
        +		this._addClass( focused, null, "ui-state-active" );
        +
        +		// Only update aria-activedescendant if there's a role
        +		// otherwise we assume focus is managed elsewhere
        +		if ( this.options.role ) {
        +			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
        +		}
        +
        +		// Highlight active parent menu item, if any
        +		activeParent = this.active
        +			.parent()
        +				.closest( ".ui-menu-item" )
        +					.children( ".ui-menu-item-wrapper" );
        +		this._addClass( activeParent, null, "ui-state-active" );
        +
        +		if ( event && event.type === "keydown" ) {
        +			this._close();
        +		} else {
        +			this.timer = this._delay( function() {
        +				this._close();
        +			}, this.delay );
        +		}
        +
        +		nested = item.children( ".ui-menu" );
        +		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
        +			this._startOpening( nested );
        +		}
        +		this.activeMenu = item.parent();
        +
        +		this._trigger( "focus", event, { item: item } );
        +	},
        +
        +	_scrollIntoView: function( item ) {
        +		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
        +		if ( this._hasScroll() ) {
        +			borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
        +			paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
        +			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
        +			scroll = this.activeMenu.scrollTop();
        +			elementHeight = this.activeMenu.height();
        +			itemHeight = item.outerHeight();
        +
        +			if ( offset < 0 ) {
        +				this.activeMenu.scrollTop( scroll + offset );
        +			} else if ( offset + itemHeight > elementHeight ) {
        +				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
        +			}
        +		}
        +	},
        +
        +	blur: function( event, fromFocus ) {
        +		if ( !fromFocus ) {
        +			clearTimeout( this.timer );
        +		}
        +
        +		if ( !this.active ) {
        +			return;
        +		}
        +
        +		this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
        +			null, "ui-state-active" );
        +
        +		this._trigger( "blur", event, { item: this.active } );
        +		this.active = null;
        +	},
        +
        +	_startOpening: function( submenu ) {
        +		clearTimeout( this.timer );
        +
        +		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
        +		// shift in the submenu position when mousing over the caret icon
        +		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
        +			return;
        +		}
        +
        +		this.timer = this._delay( function() {
        +			this._close();
        +			this._open( submenu );
        +		}, this.delay );
        +	},
        +
        +	_open: function( submenu ) {
        +		var position = $.extend( {
        +			of: this.active
        +		}, this.options.position );
        +
        +		clearTimeout( this.timer );
        +		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
        +			.hide()
        +			.attr( "aria-hidden", "true" );
        +
        +		submenu
        +			.show()
        +			.removeAttr( "aria-hidden" )
        +			.attr( "aria-expanded", "true" )
        +			.position( position );
        +	},
        +
        +	collapseAll: function( event, all ) {
        +		clearTimeout( this.timer );
        +		this.timer = this._delay( function() {
        +
        +			// If we were passed an event, look for the submenu that contains the event
        +			var currentMenu = all ? this.element :
        +				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
        +
        +			// If we found no valid submenu ancestor, use the main menu to close all
        +			// sub menus anyway
        +			if ( !currentMenu.length ) {
        +				currentMenu = this.element;
        +			}
        +
        +			this._close( currentMenu );
        +
        +			this.blur( event );
        +
        +			// Work around active item staying active after menu is blurred
        +			this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
        +
        +			this.activeMenu = currentMenu;
        +		}, this.delay );
        +	},
        +
        +	// With no arguments, closes the currently active menu - if nothing is active
        +	// it closes all menus.  If passed an argument, it will search for menus BELOW
        +	_close: function( startMenu ) {
        +		if ( !startMenu ) {
        +			startMenu = this.active ? this.active.parent() : this.element;
        +		}
        +
        +		startMenu.find( ".ui-menu" )
        +			.hide()
        +			.attr( "aria-hidden", "true" )
        +			.attr( "aria-expanded", "false" );
        +	},
        +
        +	_closeOnDocumentClick: function( event ) {
        +		return !$( event.target ).closest( ".ui-menu" ).length;
        +	},
        +
        +	_isDivider: function( item ) {
        +
        +		// Match hyphen, em dash, en dash
        +		return !/[^\-\u2014\u2013\s]/.test( item.text() );
        +	},
        +
        +	collapse: function( event ) {
        +		var newItem = this.active &&
        +			this.active.parent().closest( ".ui-menu-item", this.element );
        +		if ( newItem && newItem.length ) {
        +			this._close();
        +			this.focus( event, newItem );
        +		}
        +	},
        +
        +	expand: function( event ) {
        +		var newItem = this.active &&
        +			this.active
        +				.children( ".ui-menu " )
        +					.find( this.options.items )
        +						.first();
        +
        +		if ( newItem && newItem.length ) {
        +			this._open( newItem.parent() );
        +
        +			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
        +			this._delay( function() {
        +				this.focus( event, newItem );
        +			} );
        +		}
        +	},
        +
        +	next: function( event ) {
        +		this._move( "next", "first", event );
        +	},
        +
        +	previous: function( event ) {
        +		this._move( "prev", "last", event );
        +	},
        +
        +	isFirstItem: function() {
        +		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
        +	},
        +
        +	isLastItem: function() {
        +		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
        +	},
        +
        +	_move: function( direction, filter, event ) {
        +		var next;
        +		if ( this.active ) {
        +			if ( direction === "first" || direction === "last" ) {
        +				next = this.active
        +					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
        +					.eq( -1 );
        +			} else {
        +				next = this.active
        +					[ direction + "All" ]( ".ui-menu-item" )
        +					.eq( 0 );
        +			}
        +		}
        +		if ( !next || !next.length || !this.active ) {
        +			next = this.activeMenu.find( this.options.items )[ filter ]();
        +		}
        +
        +		this.focus( event, next );
        +	},
        +
        +	nextPage: function( event ) {
        +		var item, base, height;
        +
        +		if ( !this.active ) {
        +			this.next( event );
        +			return;
        +		}
        +		if ( this.isLastItem() ) {
        +			return;
        +		}
        +		if ( this._hasScroll() ) {
        +			base = this.active.offset().top;
        +			height = this.element.height();
        +			this.active.nextAll( ".ui-menu-item" ).each( function() {
        +				item = $( this );
        +				return item.offset().top - base - height < 0;
        +			} );
        +
        +			this.focus( event, item );
        +		} else {
        +			this.focus( event, this.activeMenu.find( this.options.items )
        +				[ !this.active ? "first" : "last" ]() );
        +		}
        +	},
        +
        +	previousPage: function( event ) {
        +		var item, base, height;
        +		if ( !this.active ) {
        +			this.next( event );
        +			return;
        +		}
        +		if ( this.isFirstItem() ) {
        +			return;
        +		}
        +		if ( this._hasScroll() ) {
        +			base = this.active.offset().top;
        +			height = this.element.height();
        +			this.active.prevAll( ".ui-menu-item" ).each( function() {
        +				item = $( this );
        +				return item.offset().top - base + height > 0;
        +			} );
        +
        +			this.focus( event, item );
        +		} else {
        +			this.focus( event, this.activeMenu.find( this.options.items ).first() );
        +		}
        +	},
        +
        +	_hasScroll: function() {
        +		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
        +	},
        +
        +	select: function( event ) {
        +
        +		// TODO: It should never be possible to not have an active item at this
        +		// point, but the tests don't trigger mouseenter before click.
        +		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
        +		var ui = { item: this.active };
        +		if ( !this.active.has( ".ui-menu" ).length ) {
        +			this.collapseAll( event, true );
        +		}
        +		this._trigger( "select", event, ui );
        +	},
        +
        +	_filterMenuItems: function( character ) {
        +		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
        +			regex = new RegExp( "^" + escapedCharacter, "i" );
        +
        +		return this.activeMenu
        +			.find( this.options.items )
        +
        +				// Only match on items, not dividers or other content (#10571)
        +				.filter( ".ui-menu-item" )
        +					.filter( function() {
        +						return regex.test(
        +							$.trim( $( this ).children( ".ui-menu-item-wrapper" ).text() ) );
        +					} );
        +	}
        +} );
        +
        +
        +/*!
        + * jQuery UI Autocomplete 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Autocomplete
        +//>>group: Widgets
        +//>>description: Lists suggested words as the user is typing.
        +//>>docs: http://api.jqueryui.com/autocomplete/
        +//>>demos: http://jqueryui.com/autocomplete/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/autocomplete.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.widget( "ui.autocomplete", {
        +	version: "1.12.1",
        +	defaultElement: "<input>",
        +	options: {
        +		appendTo: null,
        +		autoFocus: false,
        +		delay: 300,
        +		minLength: 1,
        +		position: {
        +			my: "left top",
        +			at: "left bottom",
        +			collision: "none"
        +		},
        +		source: null,
        +
        +		// Callbacks
        +		change: null,
        +		close: null,
        +		focus: null,
        +		open: null,
        +		response: null,
        +		search: null,
        +		select: null
        +	},
        +
        +	requestIndex: 0,
        +	pending: 0,
        +
        +	_create: function() {
        +
        +		// Some browsers only repeat keydown events, not keypress events,
        +		// so we use the suppressKeyPress flag to determine if we've already
        +		// handled the keydown event. #7269
        +		// Unfortunately the code for & in keypress is the same as the up arrow,
        +		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
        +		// events when we know the keydown event was used to modify the
        +		// search term. #7799
        +		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
        +			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
        +			isTextarea = nodeName === "textarea",
        +			isInput = nodeName === "input";
        +
        +		// Textareas are always multi-line
        +		// Inputs are always single-line, even if inside a contentEditable element
        +		// IE also treats inputs as contentEditable
        +		// All other element types are determined by whether or not they're contentEditable
        +		this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
        +
        +		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
        +		this.isNewMenu = true;
        +
        +		this._addClass( "ui-autocomplete-input" );
        +		this.element.attr( "autocomplete", "off" );
        +
        +		this._on( this.element, {
        +			keydown: function( event ) {
        +				if ( this.element.prop( "readOnly" ) ) {
        +					suppressKeyPress = true;
        +					suppressInput = true;
        +					suppressKeyPressRepeat = true;
        +					return;
        +				}
        +
        +				suppressKeyPress = false;
        +				suppressInput = false;
        +				suppressKeyPressRepeat = false;
        +				var keyCode = $.ui.keyCode;
        +				switch ( event.keyCode ) {
        +				case keyCode.PAGE_UP:
        +					suppressKeyPress = true;
        +					this._move( "previousPage", event );
        +					break;
        +				case keyCode.PAGE_DOWN:
        +					suppressKeyPress = true;
        +					this._move( "nextPage", event );
        +					break;
        +				case keyCode.UP:
        +					suppressKeyPress = true;
        +					this._keyEvent( "previous", event );
        +					break;
        +				case keyCode.DOWN:
        +					suppressKeyPress = true;
        +					this._keyEvent( "next", event );
        +					break;
        +				case keyCode.ENTER:
        +
        +					// when menu is open and has focus
        +					if ( this.menu.active ) {
        +
        +						// #6055 - Opera still allows the keypress to occur
        +						// which causes forms to submit
        +						suppressKeyPress = true;
        +						event.preventDefault();
        +						this.menu.select( event );
        +					}
        +					break;
        +				case keyCode.TAB:
        +					if ( this.menu.active ) {
        +						this.menu.select( event );
        +					}
        +					break;
        +				case keyCode.ESCAPE:
        +					if ( this.menu.element.is( ":visible" ) ) {
        +						if ( !this.isMultiLine ) {
        +							this._value( this.term );
        +						}
        +						this.close( event );
        +
        +						// Different browsers have different default behavior for escape
        +						// Single press can mean undo or clear
        +						// Double press in IE means clear the whole form
        +						event.preventDefault();
        +					}
        +					break;
        +				default:
        +					suppressKeyPressRepeat = true;
        +
        +					// search timeout should be triggered before the input value is changed
        +					this._searchTimeout( event );
        +					break;
        +				}
        +			},
        +			keypress: function( event ) {
        +				if ( suppressKeyPress ) {
        +					suppressKeyPress = false;
        +					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        +						event.preventDefault();
        +					}
        +					return;
        +				}
        +				if ( suppressKeyPressRepeat ) {
        +					return;
        +				}
        +
        +				// Replicate some key handlers to allow them to repeat in Firefox and Opera
        +				var keyCode = $.ui.keyCode;
        +				switch ( event.keyCode ) {
        +				case keyCode.PAGE_UP:
        +					this._move( "previousPage", event );
        +					break;
        +				case keyCode.PAGE_DOWN:
        +					this._move( "nextPage", event );
        +					break;
        +				case keyCode.UP:
        +					this._keyEvent( "previous", event );
        +					break;
        +				case keyCode.DOWN:
        +					this._keyEvent( "next", event );
        +					break;
        +				}
        +			},
        +			input: function( event ) {
        +				if ( suppressInput ) {
        +					suppressInput = false;
        +					event.preventDefault();
        +					return;
        +				}
        +				this._searchTimeout( event );
        +			},
        +			focus: function() {
        +				this.selectedItem = null;
        +				this.previous = this._value();
        +			},
        +			blur: function( event ) {
        +				if ( this.cancelBlur ) {
        +					delete this.cancelBlur;
        +					return;
        +				}
        +
        +				clearTimeout( this.searching );
        +				this.close( event );
        +				this._change( event );
        +			}
        +		} );
        +
        +		this._initSource();
        +		this.menu = $( "<ul>" )
        +			.appendTo( this._appendTo() )
        +			.menu( {
        +
        +				// disable ARIA support, the live region takes care of that
        +				role: null
        +			} )
        +			.hide()
        +			.menu( "instance" );
        +
        +		this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
        +		this._on( this.menu.element, {
        +			mousedown: function( event ) {
        +
        +				// prevent moving focus out of the text field
        +				event.preventDefault();
        +
        +				// IE doesn't prevent moving focus even with event.preventDefault()
        +				// so we set a flag to know when we should ignore the blur event
        +				this.cancelBlur = true;
        +				this._delay( function() {
        +					delete this.cancelBlur;
        +
        +					// Support: IE 8 only
        +					// Right clicking a menu item or selecting text from the menu items will
        +					// result in focus moving out of the input. However, we've already received
        +					// and ignored the blur event because of the cancelBlur flag set above. So
        +					// we restore focus to ensure that the menu closes properly based on the user's
        +					// next actions.
        +					if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
        +						this.element.trigger( "focus" );
        +					}
        +				} );
        +			},
        +			menufocus: function( event, ui ) {
        +				var label, item;
        +
        +				// support: Firefox
        +				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
        +				if ( this.isNewMenu ) {
        +					this.isNewMenu = false;
        +					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
        +						this.menu.blur();
        +
        +						this.document.one( "mousemove", function() {
        +							$( event.target ).trigger( event.originalEvent );
        +						} );
        +
        +						return;
        +					}
        +				}
        +
        +				item = ui.item.data( "ui-autocomplete-item" );
        +				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
        +
        +					// use value to match what will end up in the input, if it was a key event
        +					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
        +						this._value( item.value );
        +					}
        +				}
        +
        +				// Announce the value in the liveRegion
        +				label = ui.item.attr( "aria-label" ) || item.value;
        +				if ( label && $.trim( label ).length ) {
        +					this.liveRegion.children().hide();
        +					$( "<div>" ).text( label ).appendTo( this.liveRegion );
        +				}
        +			},
        +			menuselect: function( event, ui ) {
        +				var item = ui.item.data( "ui-autocomplete-item" ),
        +					previous = this.previous;
        +
        +				// Only trigger when focus was lost (click on menu)
        +				if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
        +					this.element.trigger( "focus" );
        +					this.previous = previous;
        +
        +					// #6109 - IE triggers two focus events and the second
        +					// is asynchronous, so we need to reset the previous
        +					// term synchronously and asynchronously :-(
        +					this._delay( function() {
        +						this.previous = previous;
        +						this.selectedItem = item;
        +					} );
        +				}
        +
        +				if ( false !== this._trigger( "select", event, { item: item } ) ) {
        +					this._value( item.value );
        +				}
        +
        +				// reset the term after the select event
        +				// this allows custom select handling to work properly
        +				this.term = this._value();
        +
        +				this.close( event );
        +				this.selectedItem = item;
        +			}
        +		} );
        +
        +		this.liveRegion = $( "<div>", {
        +			role: "status",
        +			"aria-live": "assertive",
        +			"aria-relevant": "additions"
        +		} )
        +			.appendTo( this.document[ 0 ].body );
        +
        +		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
        +
        +		// Turning off autocomplete prevents the browser from remembering the
        +		// value when navigating through history, so we re-enable autocomplete
        +		// if the page is unloaded before the widget is destroyed. #7790
        +		this._on( this.window, {
        +			beforeunload: function() {
        +				this.element.removeAttr( "autocomplete" );
        +			}
        +		} );
        +	},
        +
        +	_destroy: function() {
        +		clearTimeout( this.searching );
        +		this.element.removeAttr( "autocomplete" );
        +		this.menu.element.remove();
        +		this.liveRegion.remove();
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +		if ( key === "source" ) {
        +			this._initSource();
        +		}
        +		if ( key === "appendTo" ) {
        +			this.menu.element.appendTo( this._appendTo() );
        +		}
        +		if ( key === "disabled" && value && this.xhr ) {
        +			this.xhr.abort();
        +		}
        +	},
        +
        +	_isEventTargetInWidget: function( event ) {
        +		var menuElement = this.menu.element[ 0 ];
        +
        +		return event.target === this.element[ 0 ] ||
        +			event.target === menuElement ||
        +			$.contains( menuElement, event.target );
        +	},
        +
        +	_closeOnClickOutside: function( event ) {
        +		if ( !this._isEventTargetInWidget( event ) ) {
        +			this.close();
        +		}
        +	},
        +
        +	_appendTo: function() {
        +		var element = this.options.appendTo;
        +
        +		if ( element ) {
        +			element = element.jquery || element.nodeType ?
        +				$( element ) :
        +				this.document.find( element ).eq( 0 );
        +		}
        +
        +		if ( !element || !element[ 0 ] ) {
        +			element = this.element.closest( ".ui-front, dialog" );
        +		}
        +
        +		if ( !element.length ) {
        +			element = this.document[ 0 ].body;
        +		}
        +
        +		return element;
        +	},
        +
        +	_initSource: function() {
        +		var array, url,
        +			that = this;
        +		if ( $.isArray( this.options.source ) ) {
        +			array = this.options.source;
        +			this.source = function( request, response ) {
        +				response( $.ui.autocomplete.filter( array, request.term ) );
        +			};
        +		} else if ( typeof this.options.source === "string" ) {
        +			url = this.options.source;
        +			this.source = function( request, response ) {
        +				if ( that.xhr ) {
        +					that.xhr.abort();
        +				}
        +				that.xhr = $.ajax( {
        +					url: url,
        +					data: request,
        +					dataType: "json",
        +					success: function( data ) {
        +						response( data );
        +					},
        +					error: function() {
        +						response( [] );
        +					}
        +				} );
        +			};
        +		} else {
        +			this.source = this.options.source;
        +		}
        +	},
        +
        +	_searchTimeout: function( event ) {
        +		clearTimeout( this.searching );
        +		this.searching = this._delay( function() {
        +
        +			// Search if the value has changed, or if the user retypes the same value (see #7434)
        +			var equalValues = this.term === this._value(),
        +				menuVisible = this.menu.element.is( ":visible" ),
        +				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
        +
        +			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
        +				this.selectedItem = null;
        +				this.search( null, event );
        +			}
        +		}, this.options.delay );
        +	},
        +
        +	search: function( value, event ) {
        +		value = value != null ? value : this._value();
        +
        +		// Always save the actual value, not the one passed as an argument
        +		this.term = this._value();
        +
        +		if ( value.length < this.options.minLength ) {
        +			return this.close( event );
        +		}
        +
        +		if ( this._trigger( "search", event ) === false ) {
        +			return;
        +		}
        +
        +		return this._search( value );
        +	},
        +
        +	_search: function( value ) {
        +		this.pending++;
        +		this._addClass( "ui-autocomplete-loading" );
        +		this.cancelSearch = false;
        +
        +		this.source( { term: value }, this._response() );
        +	},
        +
        +	_response: function() {
        +		var index = ++this.requestIndex;
        +
        +		return $.proxy( function( content ) {
        +			if ( index === this.requestIndex ) {
        +				this.__response( content );
        +			}
        +
        +			this.pending--;
        +			if ( !this.pending ) {
        +				this._removeClass( "ui-autocomplete-loading" );
        +			}
        +		}, this );
        +	},
        +
        +	__response: function( content ) {
        +		if ( content ) {
        +			content = this._normalize( content );
        +		}
        +		this._trigger( "response", null, { content: content } );
        +		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
        +			this._suggest( content );
        +			this._trigger( "open" );
        +		} else {
        +
        +			// use ._close() instead of .close() so we don't cancel future searches
        +			this._close();
        +		}
        +	},
        +
        +	close: function( event ) {
        +		this.cancelSearch = true;
        +		this._close( event );
        +	},
        +
        +	_close: function( event ) {
        +
        +		// Remove the handler that closes the menu on outside clicks
        +		this._off( this.document, "mousedown" );
        +
        +		if ( this.menu.element.is( ":visible" ) ) {
        +			this.menu.element.hide();
        +			this.menu.blur();
        +			this.isNewMenu = true;
        +			this._trigger( "close", event );
        +		}
        +	},
        +
        +	_change: function( event ) {
        +		if ( this.previous !== this._value() ) {
        +			this._trigger( "change", event, { item: this.selectedItem } );
        +		}
        +	},
        +
        +	_normalize: function( items ) {
        +
        +		// assume all items have the right format when the first item is complete
        +		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
        +			return items;
        +		}
        +		return $.map( items, function( item ) {
        +			if ( typeof item === "string" ) {
        +				return {
        +					label: item,
        +					value: item
        +				};
        +			}
        +			return $.extend( {}, item, {
        +				label: item.label || item.value,
        +				value: item.value || item.label
        +			} );
        +		} );
        +	},
        +
        +	_suggest: function( items ) {
        +		var ul = this.menu.element.empty();
        +		this._renderMenu( ul, items );
        +		this.isNewMenu = true;
        +		this.menu.refresh();
        +
        +		// Size and position menu
        +		ul.show();
        +		this._resizeMenu();
        +		ul.position( $.extend( {
        +			of: this.element
        +		}, this.options.position ) );
        +
        +		if ( this.options.autoFocus ) {
        +			this.menu.next();
        +		}
        +
        +		// Listen for interactions outside of the widget (#6642)
        +		this._on( this.document, {
        +			mousedown: "_closeOnClickOutside"
        +		} );
        +	},
        +
        +	_resizeMenu: function() {
        +		var ul = this.menu.element;
        +		ul.outerWidth( Math.max(
        +
        +			// Firefox wraps long text (possibly a rounding bug)
        +			// so we add 1px to avoid the wrapping (#7513)
        +			ul.width( "" ).outerWidth() + 1,
        +			this.element.outerWidth()
        +		) );
        +	},
        +
        +	_renderMenu: function( ul, items ) {
        +		var that = this;
        +		$.each( items, function( index, item ) {
        +			that._renderItemData( ul, item );
        +		} );
        +	},
        +
        +	_renderItemData: function( ul, item ) {
        +		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
        +	},
        +
        +	_renderItem: function( ul, item ) {
        +		return $( "<li>" )
        +			.append( $( "<div>" ).text( item.label ) )
        +			.appendTo( ul );
        +	},
        +
        +	_move: function( direction, event ) {
        +		if ( !this.menu.element.is( ":visible" ) ) {
        +			this.search( null, event );
        +			return;
        +		}
        +		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
        +				this.menu.isLastItem() && /^next/.test( direction ) ) {
        +
        +			if ( !this.isMultiLine ) {
        +				this._value( this.term );
        +			}
        +
        +			this.menu.blur();
        +			return;
        +		}
        +		this.menu[ direction ]( event );
        +	},
        +
        +	widget: function() {
        +		return this.menu.element;
        +	},
        +
        +	_value: function() {
        +		return this.valueMethod.apply( this.element, arguments );
        +	},
        +
        +	_keyEvent: function( keyEvent, event ) {
        +		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        +			this._move( keyEvent, event );
        +
        +			// Prevents moving cursor to beginning/end of the text field in some browsers
        +			event.preventDefault();
        +		}
        +	},
        +
        +	// Support: Chrome <=50
        +	// We should be able to just use this.element.prop( "isContentEditable" )
        +	// but hidden elements always report false in Chrome.
        +	// https://code.google.com/p/chromium/issues/detail?id=313082
        +	_isContentEditable: function( element ) {
        +		if ( !element.length ) {
        +			return false;
        +		}
        +
        +		var editable = element.prop( "contentEditable" );
        +
        +		if ( editable === "inherit" ) {
        +		  return this._isContentEditable( element.parent() );
        +		}
        +
        +		return editable === "true";
        +	}
        +} );
        +
        +$.extend( $.ui.autocomplete, {
        +	escapeRegex: function( value ) {
        +		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
        +	},
        +	filter: function( array, term ) {
        +		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
        +		return $.grep( array, function( value ) {
        +			return matcher.test( value.label || value.value || value );
        +		} );
        +	}
        +} );
        +
        +// Live region extension, adding a `messages` option
        +// NOTE: This is an experimental API. We are still investigating
        +// a full solution for string manipulation and internationalization.
        +$.widget( "ui.autocomplete", $.ui.autocomplete, {
        +	options: {
        +		messages: {
        +			noResults: "No search results.",
        +			results: function( amount ) {
        +				return amount + ( amount > 1 ? " results are" : " result is" ) +
        +					" available, use up and down arrow keys to navigate.";
        +			}
        +		}
        +	},
        +
        +	__response: function( content ) {
        +		var message;
        +		this._superApply( arguments );
        +		if ( this.options.disabled || this.cancelSearch ) {
        +			return;
        +		}
        +		if ( content && content.length ) {
        +			message = this.options.messages.results( content.length );
        +		} else {
        +			message = this.options.messages.noResults;
        +		}
        +		this.liveRegion.children().hide();
        +		$( "<div>" ).text( message ).appendTo( this.liveRegion );
        +	}
        +} );
        +
        +var widgetsAutocomplete = $.ui.autocomplete;
        +
        +
        +/*!
        + * jQuery UI Controlgroup 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Controlgroup
        +//>>group: Widgets
        +//>>description: Visually groups form control widgets
        +//>>docs: http://api.jqueryui.com/controlgroup/
        +//>>demos: http://jqueryui.com/controlgroup/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/controlgroup.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
        +
        +var widgetsControlgroup = $.widget( "ui.controlgroup", {
        +	version: "1.12.1",
        +	defaultElement: "<div>",
        +	options: {
        +		direction: "horizontal",
        +		disabled: null,
        +		onlyVisible: true,
        +		items: {
        +			"button": "input[type=button], input[type=submit], input[type=reset], button, a",
        +			"controlgroupLabel": ".ui-controlgroup-label",
        +			"checkboxradio": "input[type='checkbox'], input[type='radio']",
        +			"selectmenu": "select",
        +			"spinner": ".ui-spinner-input"
        +		}
        +	},
        +
        +	_create: function() {
        +		this._enhance();
        +	},
        +
        +	// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
        +	_enhance: function() {
        +		this.element.attr( "role", "toolbar" );
        +		this.refresh();
        +	},
        +
        +	_destroy: function() {
        +		this._callChildMethod( "destroy" );
        +		this.childWidgets.removeData( "ui-controlgroup-data" );
        +		this.element.removeAttr( "role" );
        +		if ( this.options.items.controlgroupLabel ) {
        +			this.element
        +				.find( this.options.items.controlgroupLabel )
        +				.find( ".ui-controlgroup-label-contents" )
        +				.contents().unwrap();
        +		}
        +	},
        +
        +	_initWidgets: function() {
        +		var that = this,
        +			childWidgets = [];
        +
        +		// First we iterate over each of the items options
        +		$.each( this.options.items, function( widget, selector ) {
        +			var labels;
        +			var options = {};
        +
        +			// Make sure the widget has a selector set
        +			if ( !selector ) {
        +				return;
        +			}
        +
        +			if ( widget === "controlgroupLabel" ) {
        +				labels = that.element.find( selector );
        +				labels.each( function() {
        +					var element = $( this );
        +
        +					if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
        +						return;
        +					}
        +					element.contents()
        +						.wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
        +				} );
        +				that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
        +				childWidgets = childWidgets.concat( labels.get() );
        +				return;
        +			}
        +
        +			// Make sure the widget actually exists
        +			if ( !$.fn[ widget ] ) {
        +				return;
        +			}
        +
        +			// We assume everything is in the middle to start because we can't determine
        +			// first / last elements until all enhancments are done.
        +			if ( that[ "_" + widget + "Options" ] ) {
        +				options = that[ "_" + widget + "Options" ]( "middle" );
        +			} else {
        +				options = { classes: {} };
        +			}
        +
        +			// Find instances of this widget inside controlgroup and init them
        +			that.element
        +				.find( selector )
        +				.each( function() {
        +					var element = $( this );
        +					var instance = element[ widget ]( "instance" );
        +
        +					// We need to clone the default options for this type of widget to avoid
        +					// polluting the variable options which has a wider scope than a single widget.
        +					var instanceOptions = $.widget.extend( {}, options );
        +
        +					// If the button is the child of a spinner ignore it
        +					// TODO: Find a more generic solution
        +					if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
        +						return;
        +					}
        +
        +					// Create the widget if it doesn't exist
        +					if ( !instance ) {
        +						instance = element[ widget ]()[ widget ]( "instance" );
        +					}
        +					if ( instance ) {
        +						instanceOptions.classes =
        +							that._resolveClassesValues( instanceOptions.classes, instance );
        +					}
        +					element[ widget ]( instanceOptions );
        +
        +					// Store an instance of the controlgroup to be able to reference
        +					// from the outermost element for changing options and refresh
        +					var widgetElement = element[ widget ]( "widget" );
        +					$.data( widgetElement[ 0 ], "ui-controlgroup-data",
        +						instance ? instance : element[ widget ]( "instance" ) );
        +
        +					childWidgets.push( widgetElement[ 0 ] );
        +				} );
        +		} );
        +
        +		this.childWidgets = $( $.unique( childWidgets ) );
        +		this._addClass( this.childWidgets, "ui-controlgroup-item" );
        +	},
        +
        +	_callChildMethod: function( method ) {
        +		this.childWidgets.each( function() {
        +			var element = $( this ),
        +				data = element.data( "ui-controlgroup-data" );
        +			if ( data && data[ method ] ) {
        +				data[ method ]();
        +			}
        +		} );
        +	},
        +
        +	_updateCornerClass: function( element, position ) {
        +		var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
        +		var add = this._buildSimpleOptions( position, "label" ).classes.label;
        +
        +		this._removeClass( element, null, remove );
        +		this._addClass( element, null, add );
        +	},
        +
        +	_buildSimpleOptions: function( position, key ) {
        +		var direction = this.options.direction === "vertical";
        +		var result = {
        +			classes: {}
        +		};
        +		result.classes[ key ] = {
        +			"middle": "",
        +			"first": "ui-corner-" + ( direction ? "top" : "left" ),
        +			"last": "ui-corner-" + ( direction ? "bottom" : "right" ),
        +			"only": "ui-corner-all"
        +		}[ position ];
        +
        +		return result;
        +	},
        +
        +	_spinnerOptions: function( position ) {
        +		var options = this._buildSimpleOptions( position, "ui-spinner" );
        +
        +		options.classes[ "ui-spinner-up" ] = "";
        +		options.classes[ "ui-spinner-down" ] = "";
        +
        +		return options;
        +	},
        +
        +	_buttonOptions: function( position ) {
        +		return this._buildSimpleOptions( position, "ui-button" );
        +	},
        +
        +	_checkboxradioOptions: function( position ) {
        +		return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
        +	},
        +
        +	_selectmenuOptions: function( position ) {
        +		var direction = this.options.direction === "vertical";
        +		return {
        +			width: direction ? "auto" : false,
        +			classes: {
        +				middle: {
        +					"ui-selectmenu-button-open": "",
        +					"ui-selectmenu-button-closed": ""
        +				},
        +				first: {
        +					"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
        +					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
        +				},
        +				last: {
        +					"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
        +					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
        +				},
        +				only: {
        +					"ui-selectmenu-button-open": "ui-corner-top",
        +					"ui-selectmenu-button-closed": "ui-corner-all"
        +				}
        +
        +			}[ position ]
        +		};
        +	},
        +
        +	_resolveClassesValues: function( classes, instance ) {
        +		var result = {};
        +		$.each( classes, function( key ) {
        +			var current = instance.options.classes[ key ] || "";
        +			current = $.trim( current.replace( controlgroupCornerRegex, "" ) );
        +			result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
        +		} );
        +		return result;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "direction" ) {
        +			this._removeClass( "ui-controlgroup-" + this.options.direction );
        +		}
        +
        +		this._super( key, value );
        +		if ( key === "disabled" ) {
        +			this._callChildMethod( value ? "disable" : "enable" );
        +			return;
        +		}
        +
        +		this.refresh();
        +	},
        +
        +	refresh: function() {
        +		var children,
        +			that = this;
        +
        +		this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
        +
        +		if ( this.options.direction === "horizontal" ) {
        +			this._addClass( null, "ui-helper-clearfix" );
        +		}
        +		this._initWidgets();
        +
        +		children = this.childWidgets;
        +
        +		// We filter here because we need to track all childWidgets not just the visible ones
        +		if ( this.options.onlyVisible ) {
        +			children = children.filter( ":visible" );
        +		}
        +
        +		if ( children.length ) {
        +
        +			// We do this last because we need to make sure all enhancment is done
        +			// before determining first and last
        +			$.each( [ "first", "last" ], function( index, value ) {
        +				var instance = children[ value ]().data( "ui-controlgroup-data" );
        +
        +				if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
        +					var options = that[ "_" + instance.widgetName + "Options" ](
        +						children.length === 1 ? "only" : value
        +					);
        +					options.classes = that._resolveClassesValues( options.classes, instance );
        +					instance.element[ instance.widgetName ]( options );
        +				} else {
        +					that._updateCornerClass( children[ value ](), value );
        +				}
        +			} );
        +
        +			// Finally call the refresh method on each of the child widgets.
        +			this._callChildMethod( "refresh" );
        +		}
        +	}
        +} );
        +
        +/*!
        + * jQuery UI Checkboxradio 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Checkboxradio
        +//>>group: Widgets
        +//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
        +//>>docs: http://api.jqueryui.com/checkboxradio/
        +//>>demos: http://jqueryui.com/checkboxradio/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/button.css
        +//>>css.structure: ../../themes/base/checkboxradio.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
        +	version: "1.12.1",
        +	options: {
        +		disabled: null,
        +		label: null,
        +		icon: true,
        +		classes: {
        +			"ui-checkboxradio-label": "ui-corner-all",
        +			"ui-checkboxradio-icon": "ui-corner-all"
        +		}
        +	},
        +
        +	_getCreateOptions: function() {
        +		var disabled, labels;
        +		var that = this;
        +		var options = this._super() || {};
        +
        +		// We read the type here, because it makes more sense to throw a element type error first,
        +		// rather then the error for lack of a label. Often if its the wrong type, it
        +		// won't have a label (e.g. calling on a div, btn, etc)
        +		this._readType();
        +
        +		labels = this.element.labels();
        +
        +		// If there are multiple labels, use the last one
        +		this.label = $( labels[ labels.length - 1 ] );
        +		if ( !this.label.length ) {
        +			$.error( "No label found for checkboxradio widget" );
        +		}
        +
        +		this.originalLabel = "";
        +
        +		// We need to get the label text but this may also need to make sure it does not contain the
        +		// input itself.
        +		this.label.contents().not( this.element[ 0 ] ).each( function() {
        +
        +			// The label contents could be text, html, or a mix. We concat each element to get a
        +			// string representation of the label, without the input as part of it.
        +			that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
        +		} );
        +
        +		// Set the label option if we found label text
        +		if ( this.originalLabel ) {
        +			options.label = this.originalLabel;
        +		}
        +
        +		disabled = this.element[ 0 ].disabled;
        +		if ( disabled != null ) {
        +			options.disabled = disabled;
        +		}
        +		return options;
        +	},
        +
        +	_create: function() {
        +		var checked = this.element[ 0 ].checked;
        +
        +		this._bindFormResetHandler();
        +
        +		if ( this.options.disabled == null ) {
        +			this.options.disabled = this.element[ 0 ].disabled;
        +		}
        +
        +		this._setOption( "disabled", this.options.disabled );
        +		this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
        +		this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
        +
        +		if ( this.type === "radio" ) {
        +			this._addClass( this.label, "ui-checkboxradio-radio-label" );
        +		}
        +
        +		if ( this.options.label && this.options.label !== this.originalLabel ) {
        +			this._updateLabel();
        +		} else if ( this.originalLabel ) {
        +			this.options.label = this.originalLabel;
        +		}
        +
        +		this._enhance();
        +
        +		if ( checked ) {
        +			this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
        +			if ( this.icon ) {
        +				this._addClass( this.icon, null, "ui-state-hover" );
        +			}
        +		}
        +
        +		this._on( {
        +			change: "_toggleClasses",
        +			focus: function() {
        +				this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
        +			},
        +			blur: function() {
        +				this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
        +			}
        +		} );
        +	},
        +
        +	_readType: function() {
        +		var nodeName = this.element[ 0 ].nodeName.toLowerCase();
        +		this.type = this.element[ 0 ].type;
        +		if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
        +			$.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
        +				" and element.type=" + this.type );
        +		}
        +	},
        +
        +	// Support jQuery Mobile enhanced option
        +	_enhance: function() {
        +		this._updateIcon( this.element[ 0 ].checked );
        +	},
        +
        +	widget: function() {
        +		return this.label;
        +	},
        +
        +	_getRadioGroup: function() {
        +		var group;
        +		var name = this.element[ 0 ].name;
        +		var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";
        +
        +		if ( !name ) {
        +			return $( [] );
        +		}
        +
        +		if ( this.form.length ) {
        +			group = $( this.form[ 0 ].elements ).filter( nameSelector );
        +		} else {
        +
        +			// Not inside a form, check all inputs that also are not inside a form
        +			group = $( nameSelector ).filter( function() {
        +				return $( this ).form().length === 0;
        +			} );
        +		}
        +
        +		return group.not( this.element );
        +	},
        +
        +	_toggleClasses: function() {
        +		var checked = this.element[ 0 ].checked;
        +		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
        +
        +		if ( this.options.icon && this.type === "checkbox" ) {
        +			this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
        +				._toggleClass( this.icon, null, "ui-icon-blank", !checked );
        +		}
        +
        +		if ( this.type === "radio" ) {
        +			this._getRadioGroup()
        +				.each( function() {
        +					var instance = $( this ).checkboxradio( "instance" );
        +
        +					if ( instance ) {
        +						instance._removeClass( instance.label,
        +							"ui-checkboxradio-checked", "ui-state-active" );
        +					}
        +				} );
        +		}
        +	},
        +
        +	_destroy: function() {
        +		this._unbindFormResetHandler();
        +
        +		if ( this.icon ) {
        +			this.icon.remove();
        +			this.iconSpace.remove();
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +
        +		// We don't allow the value to be set to nothing
        +		if ( key === "label" && !value ) {
        +			return;
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "disabled" ) {
        +			this._toggleClass( this.label, null, "ui-state-disabled", value );
        +			this.element[ 0 ].disabled = value;
        +
        +			// Don't refresh when setting disabled
        +			return;
        +		}
        +		this.refresh();
        +	},
        +
        +	_updateIcon: function( checked ) {
        +		var toAdd = "ui-icon ui-icon-background ";
        +
        +		if ( this.options.icon ) {
        +			if ( !this.icon ) {
        +				this.icon = $( "<span>" );
        +				this.iconSpace = $( "<span> </span>" );
        +				this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
        +			}
        +
        +			if ( this.type === "checkbox" ) {
        +				toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
        +				this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
        +			} else {
        +				toAdd += "ui-icon-blank";
        +			}
        +			this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
        +			if ( !checked ) {
        +				this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
        +			}
        +			this.icon.prependTo( this.label ).after( this.iconSpace );
        +		} else if ( this.icon !== undefined ) {
        +			this.icon.remove();
        +			this.iconSpace.remove();
        +			delete this.icon;
        +		}
        +	},
        +
        +	_updateLabel: function() {
        +
        +		// Remove the contents of the label ( minus the icon, icon space, and input )
        +		var contents = this.label.contents().not( this.element[ 0 ] );
        +		if ( this.icon ) {
        +			contents = contents.not( this.icon[ 0 ] );
        +		}
        +		if ( this.iconSpace ) {
        +			contents = contents.not( this.iconSpace[ 0 ] );
        +		}
        +		contents.remove();
        +
        +		this.label.append( this.options.label );
        +	},
        +
        +	refresh: function() {
        +		var checked = this.element[ 0 ].checked,
        +			isDisabled = this.element[ 0 ].disabled;
        +
        +		this._updateIcon( checked );
        +		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
        +		if ( this.options.label !== null ) {
        +			this._updateLabel();
        +		}
        +
        +		if ( isDisabled !== this.options.disabled ) {
        +			this._setOptions( { "disabled": isDisabled } );
        +		}
        +	}
        +
        +} ] );
        +
        +var widgetsCheckboxradio = $.ui.checkboxradio;
        +
        +
        +/*!
        + * jQuery UI Button 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Button
        +//>>group: Widgets
        +//>>description: Enhances a form with themeable buttons.
        +//>>docs: http://api.jqueryui.com/button/
        +//>>demos: http://jqueryui.com/button/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/button.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.widget( "ui.button", {
        +	version: "1.12.1",
        +	defaultElement: "<button>",
        +	options: {
        +		classes: {
        +			"ui-button": "ui-corner-all"
        +		},
        +		disabled: null,
        +		icon: null,
        +		iconPosition: "beginning",
        +		label: null,
        +		showLabel: true
        +	},
        +
        +	_getCreateOptions: function() {
        +		var disabled,
        +
        +			// This is to support cases like in jQuery Mobile where the base widget does have
        +			// an implementation of _getCreateOptions
        +			options = this._super() || {};
        +
        +		this.isInput = this.element.is( "input" );
        +
        +		disabled = this.element[ 0 ].disabled;
        +		if ( disabled != null ) {
        +			options.disabled = disabled;
        +		}
        +
        +		this.originalLabel = this.isInput ? this.element.val() : this.element.html();
        +		if ( this.originalLabel ) {
        +			options.label = this.originalLabel;
        +		}
        +
        +		return options;
        +	},
        +
        +	_create: function() {
        +		if ( !this.option.showLabel & !this.options.icon ) {
        +			this.options.showLabel = true;
        +		}
        +
        +		// We have to check the option again here even though we did in _getCreateOptions,
        +		// because null may have been passed on init which would override what was set in
        +		// _getCreateOptions
        +		if ( this.options.disabled == null ) {
        +			this.options.disabled = this.element[ 0 ].disabled || false;
        +		}
        +
        +		this.hasTitle = !!this.element.attr( "title" );
        +
        +		// Check to see if the label needs to be set or if its already correct
        +		if ( this.options.label && this.options.label !== this.originalLabel ) {
        +			if ( this.isInput ) {
        +				this.element.val( this.options.label );
        +			} else {
        +				this.element.html( this.options.label );
        +			}
        +		}
        +		this._addClass( "ui-button", "ui-widget" );
        +		this._setOption( "disabled", this.options.disabled );
        +		this._enhance();
        +
        +		if ( this.element.is( "a" ) ) {
        +			this._on( {
        +				"keyup": function( event ) {
        +					if ( event.keyCode === $.ui.keyCode.SPACE ) {
        +						event.preventDefault();
        +
        +						// Support: PhantomJS <= 1.9, IE 8 Only
        +						// If a native click is available use it so we actually cause navigation
        +						// otherwise just trigger a click event
        +						if ( this.element[ 0 ].click ) {
        +							this.element[ 0 ].click();
        +						} else {
        +							this.element.trigger( "click" );
        +						}
        +					}
        +				}
        +			} );
        +		}
        +	},
        +
        +	_enhance: function() {
        +		if ( !this.element.is( "button" ) ) {
        +			this.element.attr( "role", "button" );
        +		}
        +
        +		if ( this.options.icon ) {
        +			this._updateIcon( "icon", this.options.icon );
        +			this._updateTooltip();
        +		}
        +	},
        +
        +	_updateTooltip: function() {
        +		this.title = this.element.attr( "title" );
        +
        +		if ( !this.options.showLabel && !this.title ) {
        +			this.element.attr( "title", this.options.label );
        +		}
        +	},
        +
        +	_updateIcon: function( option, value ) {
        +		var icon = option !== "iconPosition",
        +			position = icon ? this.options.iconPosition : value,
        +			displayBlock = position === "top" || position === "bottom";
        +
        +		// Create icon
        +		if ( !this.icon ) {
        +			this.icon = $( "<span>" );
        +
        +			this._addClass( this.icon, "ui-button-icon", "ui-icon" );
        +
        +			if ( !this.options.showLabel ) {
        +				this._addClass( "ui-button-icon-only" );
        +			}
        +		} else if ( icon ) {
        +
        +			// If we are updating the icon remove the old icon class
        +			this._removeClass( this.icon, null, this.options.icon );
        +		}
        +
        +		// If we are updating the icon add the new icon class
        +		if ( icon ) {
        +			this._addClass( this.icon, null, value );
        +		}
        +
        +		this._attachIcon( position );
        +
        +		// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
        +		// the iconSpace if there is one.
        +		if ( displayBlock ) {
        +			this._addClass( this.icon, null, "ui-widget-icon-block" );
        +			if ( this.iconSpace ) {
        +				this.iconSpace.remove();
        +			}
        +		} else {
        +
        +			// Position is beginning or end so remove the ui-widget-icon-block class and add the
        +			// space if it does not exist
        +			if ( !this.iconSpace ) {
        +				this.iconSpace = $( "<span> </span>" );
        +				this._addClass( this.iconSpace, "ui-button-icon-space" );
        +			}
        +			this._removeClass( this.icon, null, "ui-wiget-icon-block" );
        +			this._attachIconSpace( position );
        +		}
        +	},
        +
        +	_destroy: function() {
        +		this.element.removeAttr( "role" );
        +
        +		if ( this.icon ) {
        +			this.icon.remove();
        +		}
        +		if ( this.iconSpace ) {
        +			this.iconSpace.remove();
        +		}
        +		if ( !this.hasTitle ) {
        +			this.element.removeAttr( "title" );
        +		}
        +	},
        +
        +	_attachIconSpace: function( iconPosition ) {
        +		this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
        +	},
        +
        +	_attachIcon: function( iconPosition ) {
        +		this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
        +	},
        +
        +	_setOptions: function( options ) {
        +		var newShowLabel = options.showLabel === undefined ?
        +				this.options.showLabel :
        +				options.showLabel,
        +			newIcon = options.icon === undefined ? this.options.icon : options.icon;
        +
        +		if ( !newShowLabel && !newIcon ) {
        +			options.showLabel = true;
        +		}
        +		this._super( options );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "icon" ) {
        +			if ( value ) {
        +				this._updateIcon( key, value );
        +			} else if ( this.icon ) {
        +				this.icon.remove();
        +				if ( this.iconSpace ) {
        +					this.iconSpace.remove();
        +				}
        +			}
        +		}
        +
        +		if ( key === "iconPosition" ) {
        +			this._updateIcon( key, value );
        +		}
        +
        +		// Make sure we can't end up with a button that has neither text nor icon
        +		if ( key === "showLabel" ) {
        +				this._toggleClass( "ui-button-icon-only", null, !value );
        +				this._updateTooltip();
        +		}
        +
        +		if ( key === "label" ) {
        +			if ( this.isInput ) {
        +				this.element.val( value );
        +			} else {
        +
        +				// If there is an icon, append it, else nothing then append the value
        +				// this avoids removal of the icon when setting label text
        +				this.element.html( value );
        +				if ( this.icon ) {
        +					this._attachIcon( this.options.iconPosition );
        +					this._attachIconSpace( this.options.iconPosition );
        +				}
        +			}
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "disabled" ) {
        +			this._toggleClass( null, "ui-state-disabled", value );
        +			this.element[ 0 ].disabled = value;
        +			if ( value ) {
        +				this.element.blur();
        +			}
        +		}
        +	},
        +
        +	refresh: function() {
        +
        +		// Make sure to only check disabled if its an element that supports this otherwise
        +		// check for the disabled class to determine state
        +		var isDisabled = this.element.is( "input, button" ) ?
        +			this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
        +
        +		if ( isDisabled !== this.options.disabled ) {
        +			this._setOptions( { disabled: isDisabled } );
        +		}
        +
        +		this._updateTooltip();
        +	}
        +} );
        +
        +// DEPRECATED
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Text and Icons options
        +	$.widget( "ui.button", $.ui.button, {
        +		options: {
        +			text: true,
        +			icons: {
        +				primary: null,
        +				secondary: null
        +			}
        +		},
        +
        +		_create: function() {
        +			if ( this.options.showLabel && !this.options.text ) {
        +				this.options.showLabel = this.options.text;
        +			}
        +			if ( !this.options.showLabel && this.options.text ) {
        +				this.options.text = this.options.showLabel;
        +			}
        +			if ( !this.options.icon && ( this.options.icons.primary ||
        +					this.options.icons.secondary ) ) {
        +				if ( this.options.icons.primary ) {
        +					this.options.icon = this.options.icons.primary;
        +				} else {
        +					this.options.icon = this.options.icons.secondary;
        +					this.options.iconPosition = "end";
        +				}
        +			} else if ( this.options.icon ) {
        +				this.options.icons.primary = this.options.icon;
        +			}
        +			this._super();
        +		},
        +
        +		_setOption: function( key, value ) {
        +			if ( key === "text" ) {
        +				this._super( "showLabel", value );
        +				return;
        +			}
        +			if ( key === "showLabel" ) {
        +				this.options.text = value;
        +			}
        +			if ( key === "icon" ) {
        +				this.options.icons.primary = value;
        +			}
        +			if ( key === "icons" ) {
        +				if ( value.primary ) {
        +					this._super( "icon", value.primary );
        +					this._super( "iconPosition", "beginning" );
        +				} else if ( value.secondary ) {
        +					this._super( "icon", value.secondary );
        +					this._super( "iconPosition", "end" );
        +				}
        +			}
        +			this._superApply( arguments );
        +		}
        +	} );
        +
        +	$.fn.button = ( function( orig ) {
        +		return function() {
        +			if ( !this.length || ( this.length && this[ 0 ].tagName !== "INPUT" ) ||
        +					( this.length && this[ 0 ].tagName === "INPUT" && (
        +						this.attr( "type" ) !== "checkbox" && this.attr( "type" ) !== "radio"
        +					) ) ) {
        +				return orig.apply( this, arguments );
        +			}
        +			if ( !$.ui.checkboxradio ) {
        +				$.error( "Checkboxradio widget missing" );
        +			}
        +			if ( arguments.length === 0 ) {
        +				return this.checkboxradio( {
        +					"icon": false
        +				} );
        +			}
        +			return this.checkboxradio.apply( this, arguments );
        +		};
        +	} )( $.fn.button );
        +
        +	$.fn.buttonset = function() {
        +		if ( !$.ui.controlgroup ) {
        +			$.error( "Controlgroup widget missing" );
        +		}
        +		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
        +			return this.controlgroup.apply( this,
        +				[ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
        +		}
        +		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
        +			return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
        +		}
        +		if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
        +			arguments[ 0 ].items = {
        +				button: arguments[ 0 ].items
        +			};
        +		}
        +		return this.controlgroup.apply( this, arguments );
        +	};
        +}
        +
        +var widgetsButton = $.ui.button;
        +
        +
        +// jscs:disable maximumLineLength
        +/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
        +/*!
        + * jQuery UI Datepicker 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Datepicker
        +//>>group: Widgets
        +//>>description: Displays a calendar from an input or inline for selecting dates.
        +//>>docs: http://api.jqueryui.com/datepicker/
        +//>>demos: http://jqueryui.com/datepicker/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/datepicker.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.extend( $.ui, { datepicker: { version: "1.12.1" } } );
        +
        +var datepicker_instActive;
        +
        +function datepicker_getZindex( elem ) {
        +	var position, value;
        +	while ( elem.length && elem[ 0 ] !== document ) {
        +
        +		// Ignore z-index if position is set to a value where z-index is ignored by the browser
        +		// This makes behavior of this function consistent across browsers
        +		// WebKit always returns auto if the element is positioned
        +		position = elem.css( "position" );
        +		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
        +
        +			// IE returns 0 when zIndex is not specified
        +			// other browsers return a string
        +			// we ignore the case of nested elements with an explicit value of 0
        +			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
        +			value = parseInt( elem.css( "zIndex" ), 10 );
        +			if ( !isNaN( value ) && value !== 0 ) {
        +				return value;
        +			}
        +		}
        +		elem = elem.parent();
        +	}
        +
        +	return 0;
        +}
        +/* Date picker manager.
        +   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
        +   Settings for (groups of) date pickers are maintained in an instance object,
        +   allowing multiple different settings on the same page. */
        +
        +function Datepicker() {
        +	this._curInst = null; // The current instance in use
        +	this._keyEvent = false; // If the last event was a key event
        +	this._disabledInputs = []; // List of date picker inputs that have been disabled
        +	this._datepickerShowing = false; // True if the popup picker is showing , false if not
        +	this._inDialog = false; // True if showing within a "dialog", false if not
        +	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
        +	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
        +	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
        +	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
        +	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
        +	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
        +	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
        +	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
        +	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
        +	this.regional = []; // Available regional settings, indexed by language code
        +	this.regional[ "" ] = { // Default regional settings
        +		closeText: "Done", // Display text for close link
        +		prevText: "Prev", // Display text for previous month link
        +		nextText: "Next", // Display text for next month link
        +		currentText: "Today", // Display text for current month link
        +		monthNames: [ "January","February","March","April","May","June",
        +			"July","August","September","October","November","December" ], // Names of months for drop-down and formatting
        +		monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
        +		dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
        +		dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
        +		dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], // Column headings for days starting at Sunday
        +		weekHeader: "Wk", // Column header for week of the year
        +		dateFormat: "mm/dd/yy", // See format options on parseDate
        +		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
        +		isRTL: false, // True if right-to-left language, false if left-to-right
        +		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
        +		yearSuffix: "" // Additional text to append to the year in the month headers
        +	};
        +	this._defaults = { // Global defaults for all the date picker instances
        +		showOn: "focus", // "focus" for popup on focus,
        +			// "button" for trigger button, or "both" for either
        +		showAnim: "fadeIn", // Name of jQuery animation for popup
        +		showOptions: {}, // Options for enhanced animations
        +		defaultDate: null, // Used when field is blank: actual date,
        +			// +/-number for offset from today, null for today
        +		appendText: "", // Display text following the input box, e.g. showing the format
        +		buttonText: "...", // Text for trigger button
        +		buttonImage: "", // URL for trigger button image
        +		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
        +		hideIfNoPrevNext: false, // True to hide next/previous month links
        +			// if not applicable, false to just disable them
        +		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
        +		gotoCurrent: false, // True if today link goes back to current selection instead
        +		changeMonth: false, // True if month can be selected directly, false if only prev/next
        +		changeYear: false, // True if year can be selected directly, false if only prev/next
        +		yearRange: "c-10:c+10", // Range of years to display in drop-down,
        +			// either relative to today's year (-nn:+nn), relative to currently displayed year
        +			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
        +		showOtherMonths: false, // True to show dates in other months, false to leave blank
        +		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
        +		showWeek: false, // True to show week of the year, false to not show it
        +		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
        +			// takes a Date and returns the number of the week for it
        +		shortYearCutoff: "+10", // Short year values < this are in the current century,
        +			// > this are in the previous century,
        +			// string value starting with "+" for current year + value
        +		minDate: null, // The earliest selectable date, or null for no limit
        +		maxDate: null, // The latest selectable date, or null for no limit
        +		duration: "fast", // Duration of display/closure
        +		beforeShowDay: null, // Function that takes a date and returns an array with
        +			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
        +			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
        +		beforeShow: null, // Function that takes an input field and
        +			// returns a set of custom settings for the date picker
        +		onSelect: null, // Define a callback function when a date is selected
        +		onChangeMonthYear: null, // Define a callback function when the month or year is changed
        +		onClose: null, // Define a callback function when the datepicker is closed
        +		numberOfMonths: 1, // Number of months to show at a time
        +		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
        +		stepMonths: 1, // Number of months to step back/forward
        +		stepBigMonths: 12, // Number of months to step back/forward for the big links
        +		altField: "", // Selector for an alternate field to store selected dates into
        +		altFormat: "", // The date format to use for the alternate field
        +		constrainInput: true, // The input is constrained by the current date format
        +		showButtonPanel: false, // True to show button panel, false to not show it
        +		autoSize: false, // True to size the input for the date format, false to leave as is
        +		disabled: false // The initial disabled state
        +	};
        +	$.extend( this._defaults, this.regional[ "" ] );
        +	this.regional.en = $.extend( true, {}, this.regional[ "" ] );
        +	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
        +	this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
        +}
        +
        +$.extend( Datepicker.prototype, {
        +	/* Class name added to elements to indicate already configured with a date picker. */
        +	markerClassName: "hasDatepicker",
        +
        +	//Keep track of the maximum number of rows displayed (see #7043)
        +	maxRows: 4,
        +
        +	// TODO rename to "widget" when switching to widget factory
        +	_widgetDatepicker: function() {
        +		return this.dpDiv;
        +	},
        +
        +	/* Override the default settings for all instances of the date picker.
        +	 * @param  settings  object - the new settings to use as defaults (anonymous object)
        +	 * @return the manager object
        +	 */
        +	setDefaults: function( settings ) {
        +		datepicker_extendRemove( this._defaults, settings || {} );
        +		return this;
        +	},
        +
        +	/* Attach the date picker to a jQuery selection.
        +	 * @param  target	element - the target input field or division or span
        +	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
        +	 */
        +	_attachDatepicker: function( target, settings ) {
        +		var nodeName, inline, inst;
        +		nodeName = target.nodeName.toLowerCase();
        +		inline = ( nodeName === "div" || nodeName === "span" );
        +		if ( !target.id ) {
        +			this.uuid += 1;
        +			target.id = "dp" + this.uuid;
        +		}
        +		inst = this._newInst( $( target ), inline );
        +		inst.settings = $.extend( {}, settings || {} );
        +		if ( nodeName === "input" ) {
        +			this._connectDatepicker( target, inst );
        +		} else if ( inline ) {
        +			this._inlineDatepicker( target, inst );
        +		}
        +	},
        +
        +	/* Create a new instance object. */
        +	_newInst: function( target, inline ) {
        +		var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
        +		return { id: id, input: target, // associated target
        +			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
        +			drawMonth: 0, drawYear: 0, // month being drawn
        +			inline: inline, // is datepicker inline or not
        +			dpDiv: ( !inline ? this.dpDiv : // presentation div
        +			datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
        +	},
        +
        +	/* Attach the date picker to an input field. */
        +	_connectDatepicker: function( target, inst ) {
        +		var input = $( target );
        +		inst.append = $( [] );
        +		inst.trigger = $( [] );
        +		if ( input.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +		this._attachments( input, inst );
        +		input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
        +			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
        +		this._autoSize( inst );
        +		$.data( target, "datepicker", inst );
        +
        +		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
        +		if ( inst.settings.disabled ) {
        +			this._disableDatepicker( target );
        +		}
        +	},
        +
        +	/* Make attachments based on settings. */
        +	_attachments: function( input, inst ) {
        +		var showOn, buttonText, buttonImage,
        +			appendText = this._get( inst, "appendText" ),
        +			isRTL = this._get( inst, "isRTL" );
        +
        +		if ( inst.append ) {
        +			inst.append.remove();
        +		}
        +		if ( appendText ) {
        +			inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + "</span>" );
        +			input[ isRTL ? "before" : "after" ]( inst.append );
        +		}
        +
        +		input.off( "focus", this._showDatepicker );
        +
        +		if ( inst.trigger ) {
        +			inst.trigger.remove();
        +		}
        +
        +		showOn = this._get( inst, "showOn" );
        +		if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
        +			input.on( "focus", this._showDatepicker );
        +		}
        +		if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
        +			buttonText = this._get( inst, "buttonText" );
        +			buttonImage = this._get( inst, "buttonImage" );
        +			inst.trigger = $( this._get( inst, "buttonImageOnly" ) ?
        +				$( "<img/>" ).addClass( this._triggerClass ).
        +					attr( { src: buttonImage, alt: buttonText, title: buttonText } ) :
        +				$( "<button type='button'></button>" ).addClass( this._triggerClass ).
        +					html( !buttonImage ? buttonText : $( "<img/>" ).attr(
        +					{ src:buttonImage, alt:buttonText, title:buttonText } ) ) );
        +			input[ isRTL ? "before" : "after" ]( inst.trigger );
        +			inst.trigger.on( "click", function() {
        +				if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
        +					$.datepicker._hideDatepicker();
        +				} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
        +					$.datepicker._hideDatepicker();
        +					$.datepicker._showDatepicker( input[ 0 ] );
        +				} else {
        +					$.datepicker._showDatepicker( input[ 0 ] );
        +				}
        +				return false;
        +			} );
        +		}
        +	},
        +
        +	/* Apply the maximum length for the date format. */
        +	_autoSize: function( inst ) {
        +		if ( this._get( inst, "autoSize" ) && !inst.inline ) {
        +			var findMax, max, maxI, i,
        +				date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
        +				dateFormat = this._get( inst, "dateFormat" );
        +
        +			if ( dateFormat.match( /[DM]/ ) ) {
        +				findMax = function( names ) {
        +					max = 0;
        +					maxI = 0;
        +					for ( i = 0; i < names.length; i++ ) {
        +						if ( names[ i ].length > max ) {
        +							max = names[ i ].length;
        +							maxI = i;
        +						}
        +					}
        +					return maxI;
        +				};
        +				date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
        +					"monthNames" : "monthNamesShort" ) ) ) );
        +				date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
        +					"dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
        +			}
        +			inst.input.attr( "size", this._formatDate( inst, date ).length );
        +		}
        +	},
        +
        +	/* Attach an inline date picker to a div. */
        +	_inlineDatepicker: function( target, inst ) {
        +		var divSpan = $( target );
        +		if ( divSpan.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +		divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
        +		$.data( target, "datepicker", inst );
        +		this._setDate( inst, this._getDefaultDate( inst ), true );
        +		this._updateDatepicker( inst );
        +		this._updateAlternate( inst );
        +
        +		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
        +		if ( inst.settings.disabled ) {
        +			this._disableDatepicker( target );
        +		}
        +
        +		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
        +		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
        +		inst.dpDiv.css( "display", "block" );
        +	},
        +
        +	/* Pop-up the date picker in a "dialog" box.
        +	 * @param  input element - ignored
        +	 * @param  date	string or Date - the initial date to display
        +	 * @param  onSelect  function - the function to call when a date is selected
        +	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
        +	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
        +	 *					event - with x/y coordinates or
        +	 *					leave empty for default (screen centre)
        +	 * @return the manager object
        +	 */
        +	_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
        +		var id, browserWidth, browserHeight, scrollX, scrollY,
        +			inst = this._dialogInst; // internal instance
        +
        +		if ( !inst ) {
        +			this.uuid += 1;
        +			id = "dp" + this.uuid;
        +			this._dialogInput = $( "<input type='text' id='" + id +
        +				"' style='position: absolute; top: -100px; width: 0px;'/>" );
        +			this._dialogInput.on( "keydown", this._doKeyDown );
        +			$( "body" ).append( this._dialogInput );
        +			inst = this._dialogInst = this._newInst( this._dialogInput, false );
        +			inst.settings = {};
        +			$.data( this._dialogInput[ 0 ], "datepicker", inst );
        +		}
        +		datepicker_extendRemove( inst.settings, settings || {} );
        +		date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
        +		this._dialogInput.val( date );
        +
        +		this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
        +		if ( !this._pos ) {
        +			browserWidth = document.documentElement.clientWidth;
        +			browserHeight = document.documentElement.clientHeight;
        +			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
        +			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
        +			this._pos = // should use actual width/height below
        +				[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
        +		}
        +
        +		// Move input on screen for focus, but hidden behind dialog
        +		this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
        +		inst.settings.onSelect = onSelect;
        +		this._inDialog = true;
        +		this.dpDiv.addClass( this._dialogClass );
        +		this._showDatepicker( this._dialogInput[ 0 ] );
        +		if ( $.blockUI ) {
        +			$.blockUI( this.dpDiv );
        +		}
        +		$.data( this._dialogInput[ 0 ], "datepicker", inst );
        +		return this;
        +	},
        +
        +	/* Detach a datepicker from its control.
        +	 * @param  target	element - the target input field or division or span
        +	 */
        +	_destroyDatepicker: function( target ) {
        +		var nodeName,
        +			$target = $( target ),
        +			inst = $.data( target, "datepicker" );
        +
        +		if ( !$target.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +
        +		nodeName = target.nodeName.toLowerCase();
        +		$.removeData( target, "datepicker" );
        +		if ( nodeName === "input" ) {
        +			inst.append.remove();
        +			inst.trigger.remove();
        +			$target.removeClass( this.markerClassName ).
        +				off( "focus", this._showDatepicker ).
        +				off( "keydown", this._doKeyDown ).
        +				off( "keypress", this._doKeyPress ).
        +				off( "keyup", this._doKeyUp );
        +		} else if ( nodeName === "div" || nodeName === "span" ) {
        +			$target.removeClass( this.markerClassName ).empty();
        +		}
        +
        +		if ( datepicker_instActive === inst ) {
        +			datepicker_instActive = null;
        +		}
        +	},
        +
        +	/* Enable the date picker to a jQuery selection.
        +	 * @param  target	element - the target input field or division or span
        +	 */
        +	_enableDatepicker: function( target ) {
        +		var nodeName, inline,
        +			$target = $( target ),
        +			inst = $.data( target, "datepicker" );
        +
        +		if ( !$target.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +
        +		nodeName = target.nodeName.toLowerCase();
        +		if ( nodeName === "input" ) {
        +			target.disabled = false;
        +			inst.trigger.filter( "button" ).
        +				each( function() { this.disabled = false; } ).end().
        +				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
        +		} else if ( nodeName === "div" || nodeName === "span" ) {
        +			inline = $target.children( "." + this._inlineClass );
        +			inline.children().removeClass( "ui-state-disabled" );
        +			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
        +				prop( "disabled", false );
        +		}
        +		this._disabledInputs = $.map( this._disabledInputs,
        +			function( value ) { return ( value === target ? null : value ); } ); // delete entry
        +	},
        +
        +	/* Disable the date picker to a jQuery selection.
        +	 * @param  target	element - the target input field or division or span
        +	 */
        +	_disableDatepicker: function( target ) {
        +		var nodeName, inline,
        +			$target = $( target ),
        +			inst = $.data( target, "datepicker" );
        +
        +		if ( !$target.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +
        +		nodeName = target.nodeName.toLowerCase();
        +		if ( nodeName === "input" ) {
        +			target.disabled = true;
        +			inst.trigger.filter( "button" ).
        +				each( function() { this.disabled = true; } ).end().
        +				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
        +		} else if ( nodeName === "div" || nodeName === "span" ) {
        +			inline = $target.children( "." + this._inlineClass );
        +			inline.children().addClass( "ui-state-disabled" );
        +			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
        +				prop( "disabled", true );
        +		}
        +		this._disabledInputs = $.map( this._disabledInputs,
        +			function( value ) { return ( value === target ? null : value ); } ); // delete entry
        +		this._disabledInputs[ this._disabledInputs.length ] = target;
        +	},
        +
        +	/* Is the first field in a jQuery collection disabled as a datepicker?
        +	 * @param  target	element - the target input field or division or span
        +	 * @return boolean - true if disabled, false if enabled
        +	 */
        +	_isDisabledDatepicker: function( target ) {
        +		if ( !target ) {
        +			return false;
        +		}
        +		for ( var i = 0; i < this._disabledInputs.length; i++ ) {
        +			if ( this._disabledInputs[ i ] === target ) {
        +				return true;
        +			}
        +		}
        +		return false;
        +	},
        +
        +	/* Retrieve the instance data for the target control.
        +	 * @param  target  element - the target input field or division or span
        +	 * @return  object - the associated instance data
        +	 * @throws  error if a jQuery problem getting data
        +	 */
        +	_getInst: function( target ) {
        +		try {
        +			return $.data( target, "datepicker" );
        +		}
        +		catch ( err ) {
        +			throw "Missing instance data for this datepicker";
        +		}
        +	},
        +
        +	/* Update or retrieve the settings for a date picker attached to an input field or division.
        +	 * @param  target  element - the target input field or division or span
        +	 * @param  name	object - the new settings to update or
        +	 *				string - the name of the setting to change or retrieve,
        +	 *				when retrieving also "all" for all instance settings or
        +	 *				"defaults" for all global defaults
        +	 * @param  value   any - the new value for the setting
        +	 *				(omit if above is an object or to retrieve a value)
        +	 */
        +	_optionDatepicker: function( target, name, value ) {
        +		var settings, date, minDate, maxDate,
        +			inst = this._getInst( target );
        +
        +		if ( arguments.length === 2 && typeof name === "string" ) {
        +			return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
        +				( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
        +				this._get( inst, name ) ) : null ) );
        +		}
        +
        +		settings = name || {};
        +		if ( typeof name === "string" ) {
        +			settings = {};
        +			settings[ name ] = value;
        +		}
        +
        +		if ( inst ) {
        +			if ( this._curInst === inst ) {
        +				this._hideDatepicker();
        +			}
        +
        +			date = this._getDateDatepicker( target, true );
        +			minDate = this._getMinMaxDate( inst, "min" );
        +			maxDate = this._getMinMaxDate( inst, "max" );
        +			datepicker_extendRemove( inst.settings, settings );
        +
        +			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
        +			if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
        +				inst.settings.minDate = this._formatDate( inst, minDate );
        +			}
        +			if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
        +				inst.settings.maxDate = this._formatDate( inst, maxDate );
        +			}
        +			if ( "disabled" in settings ) {
        +				if ( settings.disabled ) {
        +					this._disableDatepicker( target );
        +				} else {
        +					this._enableDatepicker( target );
        +				}
        +			}
        +			this._attachments( $( target ), inst );
        +			this._autoSize( inst );
        +			this._setDate( inst, date );
        +			this._updateAlternate( inst );
        +			this._updateDatepicker( inst );
        +		}
        +	},
        +
        +	// Change method deprecated
        +	_changeDatepicker: function( target, name, value ) {
        +		this._optionDatepicker( target, name, value );
        +	},
        +
        +	/* Redraw the date picker attached to an input field or division.
        +	 * @param  target  element - the target input field or division or span
        +	 */
        +	_refreshDatepicker: function( target ) {
        +		var inst = this._getInst( target );
        +		if ( inst ) {
        +			this._updateDatepicker( inst );
        +		}
        +	},
        +
        +	/* Set the dates for a jQuery selection.
        +	 * @param  target element - the target input field or division or span
        +	 * @param  date	Date - the new date
        +	 */
        +	_setDateDatepicker: function( target, date ) {
        +		var inst = this._getInst( target );
        +		if ( inst ) {
        +			this._setDate( inst, date );
        +			this._updateDatepicker( inst );
        +			this._updateAlternate( inst );
        +		}
        +	},
        +
        +	/* Get the date(s) for the first entry in a jQuery selection.
        +	 * @param  target element - the target input field or division or span
        +	 * @param  noDefault boolean - true if no default date is to be used
        +	 * @return Date - the current date
        +	 */
        +	_getDateDatepicker: function( target, noDefault ) {
        +		var inst = this._getInst( target );
        +		if ( inst && !inst.inline ) {
        +			this._setDateFromField( inst, noDefault );
        +		}
        +		return ( inst ? this._getDate( inst ) : null );
        +	},
        +
        +	/* Handle keystrokes. */
        +	_doKeyDown: function( event ) {
        +		var onSelect, dateStr, sel,
        +			inst = $.datepicker._getInst( event.target ),
        +			handled = true,
        +			isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
        +
        +		inst._keyEvent = true;
        +		if ( $.datepicker._datepickerShowing ) {
        +			switch ( event.keyCode ) {
        +				case 9: $.datepicker._hideDatepicker();
        +						handled = false;
        +						break; // hide on tab out
        +				case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
        +									$.datepicker._currentClass + ")", inst.dpDiv );
        +						if ( sel[ 0 ] ) {
        +							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
        +						}
        +
        +						onSelect = $.datepicker._get( inst, "onSelect" );
        +						if ( onSelect ) {
        +							dateStr = $.datepicker._formatDate( inst );
        +
        +							// Trigger custom callback
        +							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
        +						} else {
        +							$.datepicker._hideDatepicker();
        +						}
        +
        +						return false; // don't submit the form
        +				case 27: $.datepicker._hideDatepicker();
        +						break; // hide on escape
        +				case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +							-$.datepicker._get( inst, "stepBigMonths" ) :
        +							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						break; // previous month/year on page up/+ ctrl
        +				case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +							+$.datepicker._get( inst, "stepBigMonths" ) :
        +							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						break; // next month/year on page down/+ ctrl
        +				case 35: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._clearDate( event.target );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // clear on ctrl or command +end
        +				case 36: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._gotoToday( event.target );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // current on ctrl or command +home
        +				case 37: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +
        +						// -1 day on ctrl or command +left
        +						if ( event.originalEvent.altKey ) {
        +							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +								-$.datepicker._get( inst, "stepBigMonths" ) :
        +								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						}
        +
        +						// next month/year on alt +left on Mac
        +						break;
        +				case 38: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, -7, "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // -1 week on ctrl or command +up
        +				case 39: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +
        +						// +1 day on ctrl or command +right
        +						if ( event.originalEvent.altKey ) {
        +							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +								+$.datepicker._get( inst, "stepBigMonths" ) :
        +								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						}
        +
        +						// next month/year on alt +right
        +						break;
        +				case 40: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, +7, "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // +1 week on ctrl or command +down
        +				default: handled = false;
        +			}
        +		} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
        +			$.datepicker._showDatepicker( this );
        +		} else {
        +			handled = false;
        +		}
        +
        +		if ( handled ) {
        +			event.preventDefault();
        +			event.stopPropagation();
        +		}
        +	},
        +
        +	/* Filter entered characters - based on date format. */
        +	_doKeyPress: function( event ) {
        +		var chars, chr,
        +			inst = $.datepicker._getInst( event.target );
        +
        +		if ( $.datepicker._get( inst, "constrainInput" ) ) {
        +			chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
        +			chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
        +			return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
        +		}
        +	},
        +
        +	/* Synchronise manual entry and field/alternate field. */
        +	_doKeyUp: function( event ) {
        +		var date,
        +			inst = $.datepicker._getInst( event.target );
        +
        +		if ( inst.input.val() !== inst.lastVal ) {
        +			try {
        +				date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
        +					( inst.input ? inst.input.val() : null ),
        +					$.datepicker._getFormatConfig( inst ) );
        +
        +				if ( date ) { // only if valid
        +					$.datepicker._setDateFromField( inst );
        +					$.datepicker._updateAlternate( inst );
        +					$.datepicker._updateDatepicker( inst );
        +				}
        +			}
        +			catch ( err ) {
        +			}
        +		}
        +		return true;
        +	},
        +
        +	/* Pop-up the date picker for a given input field.
        +	 * If false returned from beforeShow event handler do not show.
        +	 * @param  input  element - the input field attached to the date picker or
        +	 *					event - if triggered by focus
        +	 */
        +	_showDatepicker: function( input ) {
        +		input = input.target || input;
        +		if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
        +			input = $( "input", input.parentNode )[ 0 ];
        +		}
        +
        +		if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
        +			return;
        +		}
        +
        +		var inst, beforeShow, beforeShowSettings, isFixed,
        +			offset, showAnim, duration;
        +
        +		inst = $.datepicker._getInst( input );
        +		if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
        +			$.datepicker._curInst.dpDiv.stop( true, true );
        +			if ( inst && $.datepicker._datepickerShowing ) {
        +				$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
        +			}
        +		}
        +
        +		beforeShow = $.datepicker._get( inst, "beforeShow" );
        +		beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
        +		if ( beforeShowSettings === false ) {
        +			return;
        +		}
        +		datepicker_extendRemove( inst.settings, beforeShowSettings );
        +
        +		inst.lastVal = null;
        +		$.datepicker._lastInput = input;
        +		$.datepicker._setDateFromField( inst );
        +
        +		if ( $.datepicker._inDialog ) { // hide cursor
        +			input.value = "";
        +		}
        +		if ( !$.datepicker._pos ) { // position below input
        +			$.datepicker._pos = $.datepicker._findPos( input );
        +			$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
        +		}
        +
        +		isFixed = false;
        +		$( input ).parents().each( function() {
        +			isFixed |= $( this ).css( "position" ) === "fixed";
        +			return !isFixed;
        +		} );
        +
        +		offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
        +		$.datepicker._pos = null;
        +
        +		//to avoid flashes on Firefox
        +		inst.dpDiv.empty();
        +
        +		// determine sizing offscreen
        +		inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
        +		$.datepicker._updateDatepicker( inst );
        +
        +		// fix width for dynamic number of date pickers
        +		// and adjust position before showing
        +		offset = $.datepicker._checkOffset( inst, offset, isFixed );
        +		inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
        +			"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
        +			left: offset.left + "px", top: offset.top + "px" } );
        +
        +		if ( !inst.inline ) {
        +			showAnim = $.datepicker._get( inst, "showAnim" );
        +			duration = $.datepicker._get( inst, "duration" );
        +			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
        +			$.datepicker._datepickerShowing = true;
        +
        +			if ( $.effects && $.effects.effect[ showAnim ] ) {
        +				inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
        +			} else {
        +				inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
        +			}
        +
        +			if ( $.datepicker._shouldFocusInput( inst ) ) {
        +				inst.input.trigger( "focus" );
        +			}
        +
        +			$.datepicker._curInst = inst;
        +		}
        +	},
        +
        +	/* Generate the date picker content. */
        +	_updateDatepicker: function( inst ) {
        +		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
        +		datepicker_instActive = inst; // for delegate hover events
        +		inst.dpDiv.empty().append( this._generateHTML( inst ) );
        +		this._attachHandlers( inst );
        +
        +		var origyearshtml,
        +			numMonths = this._getNumberOfMonths( inst ),
        +			cols = numMonths[ 1 ],
        +			width = 17,
        +			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
        +
        +		if ( activeCell.length > 0 ) {
        +			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
        +		}
        +
        +		inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
        +		if ( cols > 1 ) {
        +			inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
        +		}
        +		inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
        +			"Class" ]( "ui-datepicker-multi" );
        +		inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
        +			"Class" ]( "ui-datepicker-rtl" );
        +
        +		if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
        +			inst.input.trigger( "focus" );
        +		}
        +
        +		// Deffered render of the years select (to avoid flashes on Firefox)
        +		if ( inst.yearshtml ) {
        +			origyearshtml = inst.yearshtml;
        +			setTimeout( function() {
        +
        +				//assure that inst.yearshtml didn't change.
        +				if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
        +					inst.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( inst.yearshtml );
        +				}
        +				origyearshtml = inst.yearshtml = null;
        +			}, 0 );
        +		}
        +	},
        +
        +	// #6694 - don't focus the input if it's already focused
        +	// this breaks the change event in IE
        +	// Support: IE and jQuery <1.9
        +	_shouldFocusInput: function( inst ) {
        +		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
        +	},
        +
        +	/* Check positioning to remain on screen. */
        +	_checkOffset: function( inst, offset, isFixed ) {
        +		var dpWidth = inst.dpDiv.outerWidth(),
        +			dpHeight = inst.dpDiv.outerHeight(),
        +			inputWidth = inst.input ? inst.input.outerWidth() : 0,
        +			inputHeight = inst.input ? inst.input.outerHeight() : 0,
        +			viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
        +			viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
        +
        +		offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
        +		offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
        +		offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
        +
        +		// Now check if datepicker is showing outside window viewport - move to a better place if so.
        +		offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
        +			Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
        +		offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
        +			Math.abs( dpHeight + inputHeight ) : 0 );
        +
        +		return offset;
        +	},
        +
        +	/* Find an object's position on the screen. */
        +	_findPos: function( obj ) {
        +		var position,
        +			inst = this._getInst( obj ),
        +			isRTL = this._get( inst, "isRTL" );
        +
        +		while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
        +			obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
        +		}
        +
        +		position = $( obj ).offset();
        +		return [ position.left, position.top ];
        +	},
        +
        +	/* Hide the date picker from view.
        +	 * @param  input  element - the input field attached to the date picker
        +	 */
        +	_hideDatepicker: function( input ) {
        +		var showAnim, duration, postProcess, onClose,
        +			inst = this._curInst;
        +
        +		if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
        +			return;
        +		}
        +
        +		if ( this._datepickerShowing ) {
        +			showAnim = this._get( inst, "showAnim" );
        +			duration = this._get( inst, "duration" );
        +			postProcess = function() {
        +				$.datepicker._tidyDialog( inst );
        +			};
        +
        +			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
        +			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
        +				inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
        +			} else {
        +				inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
        +					( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
        +			}
        +
        +			if ( !showAnim ) {
        +				postProcess();
        +			}
        +			this._datepickerShowing = false;
        +
        +			onClose = this._get( inst, "onClose" );
        +			if ( onClose ) {
        +				onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
        +			}
        +
        +			this._lastInput = null;
        +			if ( this._inDialog ) {
        +				this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
        +				if ( $.blockUI ) {
        +					$.unblockUI();
        +					$( "body" ).append( this.dpDiv );
        +				}
        +			}
        +			this._inDialog = false;
        +		}
        +	},
        +
        +	/* Tidy up after a dialog display. */
        +	_tidyDialog: function( inst ) {
        +		inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
        +	},
        +
        +	/* Close date picker if clicked elsewhere. */
        +	_checkExternalClick: function( event ) {
        +		if ( !$.datepicker._curInst ) {
        +			return;
        +		}
        +
        +		var $target = $( event.target ),
        +			inst = $.datepicker._getInst( $target[ 0 ] );
        +
        +		if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
        +				$target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
        +				!$target.hasClass( $.datepicker.markerClassName ) &&
        +				!$target.closest( "." + $.datepicker._triggerClass ).length &&
        +				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
        +			( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
        +				$.datepicker._hideDatepicker();
        +		}
        +	},
        +
        +	/* Adjust one of the date sub-fields. */
        +	_adjustDate: function( id, offset, period ) {
        +		var target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
        +			return;
        +		}
        +		this._adjustInstDate( inst, offset +
        +			( period === "M" ? this._get( inst, "showCurrentAtPos" ) : 0 ), // undo positioning
        +			period );
        +		this._updateDatepicker( inst );
        +	},
        +
        +	/* Action for current link. */
        +	_gotoToday: function( id ) {
        +		var date,
        +			target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
        +			inst.selectedDay = inst.currentDay;
        +			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
        +			inst.drawYear = inst.selectedYear = inst.currentYear;
        +		} else {
        +			date = new Date();
        +			inst.selectedDay = date.getDate();
        +			inst.drawMonth = inst.selectedMonth = date.getMonth();
        +			inst.drawYear = inst.selectedYear = date.getFullYear();
        +		}
        +		this._notifyChange( inst );
        +		this._adjustDate( target );
        +	},
        +
        +	/* Action for selecting a new month/year. */
        +	_selectMonthYear: function( id, select, period ) {
        +		var target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
        +		inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
        +			parseInt( select.options[ select.selectedIndex ].value, 10 );
        +
        +		this._notifyChange( inst );
        +		this._adjustDate( target );
        +	},
        +
        +	/* Action for selecting a day. */
        +	_selectDay: function( id, month, year, td ) {
        +		var inst,
        +			target = $( id );
        +
        +		if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
        +			return;
        +		}
        +
        +		inst = this._getInst( target[ 0 ] );
        +		inst.selectedDay = inst.currentDay = $( "a", td ).html();
        +		inst.selectedMonth = inst.currentMonth = month;
        +		inst.selectedYear = inst.currentYear = year;
        +		this._selectDate( id, this._formatDate( inst,
        +			inst.currentDay, inst.currentMonth, inst.currentYear ) );
        +	},
        +
        +	/* Erase the input field and hide the date picker. */
        +	_clearDate: function( id ) {
        +		var target = $( id );
        +		this._selectDate( target, "" );
        +	},
        +
        +	/* Update the input field with the selected date. */
        +	_selectDate: function( id, dateStr ) {
        +		var onSelect,
        +			target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
        +		if ( inst.input ) {
        +			inst.input.val( dateStr );
        +		}
        +		this._updateAlternate( inst );
        +
        +		onSelect = this._get( inst, "onSelect" );
        +		if ( onSelect ) {
        +			onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
        +		} else if ( inst.input ) {
        +			inst.input.trigger( "change" ); // fire the change event
        +		}
        +
        +		if ( inst.inline ) {
        +			this._updateDatepicker( inst );
        +		} else {
        +			this._hideDatepicker();
        +			this._lastInput = inst.input[ 0 ];
        +			if ( typeof( inst.input[ 0 ] ) !== "object" ) {
        +				inst.input.trigger( "focus" ); // restore focus
        +			}
        +			this._lastInput = null;
        +		}
        +	},
        +
        +	/* Update any alternate field to synchronise with the main field. */
        +	_updateAlternate: function( inst ) {
        +		var altFormat, date, dateStr,
        +			altField = this._get( inst, "altField" );
        +
        +		if ( altField ) { // update alternate field too
        +			altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
        +			date = this._getDate( inst );
        +			dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
        +			$( altField ).val( dateStr );
        +		}
        +	},
        +
        +	/* Set as beforeShowDay function to prevent selection of weekends.
        +	 * @param  date  Date - the date to customise
        +	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
        +	 */
        +	noWeekends: function( date ) {
        +		var day = date.getDay();
        +		return [ ( day > 0 && day < 6 ), "" ];
        +	},
        +
        +	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
        +	 * @param  date  Date - the date to get the week for
        +	 * @return  number - the number of the week within the year that contains this date
        +	 */
        +	iso8601Week: function( date ) {
        +		var time,
        +			checkDate = new Date( date.getTime() );
        +
        +		// Find Thursday of this week starting on Monday
        +		checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
        +
        +		time = checkDate.getTime();
        +		checkDate.setMonth( 0 ); // Compare with Jan 1
        +		checkDate.setDate( 1 );
        +		return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
        +	},
        +
        +	/* Parse a string value into a date object.
        +	 * See formatDate below for the possible formats.
        +	 *
        +	 * @param  format string - the expected format of the date
        +	 * @param  value string - the date in the above format
        +	 * @param  settings Object - attributes include:
        +	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
        +	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        +	 *					dayNames		string[7] - names of the days from Sunday (optional)
        +	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        +	 *					monthNames		string[12] - names of the months (optional)
        +	 * @return  Date - the extracted date value or null if value is blank
        +	 */
        +	parseDate: function( format, value, settings ) {
        +		if ( format == null || value == null ) {
        +			throw "Invalid arguments";
        +		}
        +
        +		value = ( typeof value === "object" ? value.toString() : value + "" );
        +		if ( value === "" ) {
        +			return null;
        +		}
        +
        +		var iFormat, dim, extra,
        +			iValue = 0,
        +			shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
        +			shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
        +				new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
        +			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
        +			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
        +			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
        +			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
        +			year = -1,
        +			month = -1,
        +			day = -1,
        +			doy = -1,
        +			literal = false,
        +			date,
        +
        +			// Check whether a format character is doubled
        +			lookAhead = function( match ) {
        +				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
        +				if ( matches ) {
        +					iFormat++;
        +				}
        +				return matches;
        +			},
        +
        +			// Extract a number from the string value
        +			getNumber = function( match ) {
        +				var isDoubled = lookAhead( match ),
        +					size = ( match === "@" ? 14 : ( match === "!" ? 20 :
        +					( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
        +					minSize = ( match === "y" ? size : 1 ),
        +					digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
        +					num = value.substring( iValue ).match( digits );
        +				if ( !num ) {
        +					throw "Missing number at position " + iValue;
        +				}
        +				iValue += num[ 0 ].length;
        +				return parseInt( num[ 0 ], 10 );
        +			},
        +
        +			// Extract a name from the string value and convert to an index
        +			getName = function( match, shortNames, longNames ) {
        +				var index = -1,
        +					names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
        +						return [ [ k, v ] ];
        +					} ).sort( function( a, b ) {
        +						return -( a[ 1 ].length - b[ 1 ].length );
        +					} );
        +
        +				$.each( names, function( i, pair ) {
        +					var name = pair[ 1 ];
        +					if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
        +						index = pair[ 0 ];
        +						iValue += name.length;
        +						return false;
        +					}
        +				} );
        +				if ( index !== -1 ) {
        +					return index + 1;
        +				} else {
        +					throw "Unknown name at position " + iValue;
        +				}
        +			},
        +
        +			// Confirm that a literal character matches the string value
        +			checkLiteral = function() {
        +				if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
        +					throw "Unexpected literal at position " + iValue;
        +				}
        +				iValue++;
        +			};
        +
        +		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
        +			if ( literal ) {
        +				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
        +					literal = false;
        +				} else {
        +					checkLiteral();
        +				}
        +			} else {
        +				switch ( format.charAt( iFormat ) ) {
        +					case "d":
        +						day = getNumber( "d" );
        +						break;
        +					case "D":
        +						getName( "D", dayNamesShort, dayNames );
        +						break;
        +					case "o":
        +						doy = getNumber( "o" );
        +						break;
        +					case "m":
        +						month = getNumber( "m" );
        +						break;
        +					case "M":
        +						month = getName( "M", monthNamesShort, monthNames );
        +						break;
        +					case "y":
        +						year = getNumber( "y" );
        +						break;
        +					case "@":
        +						date = new Date( getNumber( "@" ) );
        +						year = date.getFullYear();
        +						month = date.getMonth() + 1;
        +						day = date.getDate();
        +						break;
        +					case "!":
        +						date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
        +						year = date.getFullYear();
        +						month = date.getMonth() + 1;
        +						day = date.getDate();
        +						break;
        +					case "'":
        +						if ( lookAhead( "'" ) ) {
        +							checkLiteral();
        +						} else {
        +							literal = true;
        +						}
        +						break;
        +					default:
        +						checkLiteral();
        +				}
        +			}
        +		}
        +
        +		if ( iValue < value.length ) {
        +			extra = value.substr( iValue );
        +			if ( !/^\s+/.test( extra ) ) {
        +				throw "Extra/unparsed characters found in date: " + extra;
        +			}
        +		}
        +
        +		if ( year === -1 ) {
        +			year = new Date().getFullYear();
        +		} else if ( year < 100 ) {
        +			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
        +				( year <= shortYearCutoff ? 0 : -100 );
        +		}
        +
        +		if ( doy > -1 ) {
        +			month = 1;
        +			day = doy;
        +			do {
        +				dim = this._getDaysInMonth( year, month - 1 );
        +				if ( day <= dim ) {
        +					break;
        +				}
        +				month++;
        +				day -= dim;
        +			} while ( true );
        +		}
        +
        +		date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
        +		if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
        +			throw "Invalid date"; // E.g. 31/02/00
        +		}
        +		return date;
        +	},
        +
        +	/* Standard date formats. */
        +	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
        +	COOKIE: "D, dd M yy",
        +	ISO_8601: "yy-mm-dd",
        +	RFC_822: "D, d M y",
        +	RFC_850: "DD, dd-M-y",
        +	RFC_1036: "D, d M y",
        +	RFC_1123: "D, d M yy",
        +	RFC_2822: "D, d M yy",
        +	RSS: "D, d M y", // RFC 822
        +	TICKS: "!",
        +	TIMESTAMP: "@",
        +	W3C: "yy-mm-dd", // ISO 8601
        +
        +	_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
        +		Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
        +
        +	/* Format a date object into a string value.
        +	 * The format can be combinations of the following:
        +	 * d  - day of month (no leading zero)
        +	 * dd - day of month (two digit)
        +	 * o  - day of year (no leading zeros)
        +	 * oo - day of year (three digit)
        +	 * D  - day name short
        +	 * DD - day name long
        +	 * m  - month of year (no leading zero)
        +	 * mm - month of year (two digit)
        +	 * M  - month name short
        +	 * MM - month name long
        +	 * y  - year (two digit)
        +	 * yy - year (four digit)
        +	 * @ - Unix timestamp (ms since 01/01/1970)
        +	 * ! - Windows ticks (100ns since 01/01/0001)
        +	 * "..." - literal text
        +	 * '' - single quote
        +	 *
        +	 * @param  format string - the desired format of the date
        +	 * @param  date Date - the date value to format
        +	 * @param  settings Object - attributes include:
        +	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        +	 *					dayNames		string[7] - names of the days from Sunday (optional)
        +	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        +	 *					monthNames		string[12] - names of the months (optional)
        +	 * @return  string - the date in the above format
        +	 */
        +	formatDate: function( format, date, settings ) {
        +		if ( !date ) {
        +			return "";
        +		}
        +
        +		var iFormat,
        +			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
        +			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
        +			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
        +			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
        +
        +			// Check whether a format character is doubled
        +			lookAhead = function( match ) {
        +				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
        +				if ( matches ) {
        +					iFormat++;
        +				}
        +				return matches;
        +			},
        +
        +			// Format a number, with leading zero if necessary
        +			formatNumber = function( match, value, len ) {
        +				var num = "" + value;
        +				if ( lookAhead( match ) ) {
        +					while ( num.length < len ) {
        +						num = "0" + num;
        +					}
        +				}
        +				return num;
        +			},
        +
        +			// Format a name, short or long as requested
        +			formatName = function( match, value, shortNames, longNames ) {
        +				return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
        +			},
        +			output = "",
        +			literal = false;
        +
        +		if ( date ) {
        +			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
        +				if ( literal ) {
        +					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
        +						literal = false;
        +					} else {
        +						output += format.charAt( iFormat );
        +					}
        +				} else {
        +					switch ( format.charAt( iFormat ) ) {
        +						case "d":
        +							output += formatNumber( "d", date.getDate(), 2 );
        +							break;
        +						case "D":
        +							output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
        +							break;
        +						case "o":
        +							output += formatNumber( "o",
        +								Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
        +							break;
        +						case "m":
        +							output += formatNumber( "m", date.getMonth() + 1, 2 );
        +							break;
        +						case "M":
        +							output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
        +							break;
        +						case "y":
        +							output += ( lookAhead( "y" ) ? date.getFullYear() :
        +								( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
        +							break;
        +						case "@":
        +							output += date.getTime();
        +							break;
        +						case "!":
        +							output += date.getTime() * 10000 + this._ticksTo1970;
        +							break;
        +						case "'":
        +							if ( lookAhead( "'" ) ) {
        +								output += "'";
        +							} else {
        +								literal = true;
        +							}
        +							break;
        +						default:
        +							output += format.charAt( iFormat );
        +					}
        +				}
        +			}
        +		}
        +		return output;
        +	},
        +
        +	/* Extract all possible characters from the date format. */
        +	_possibleChars: function( format ) {
        +		var iFormat,
        +			chars = "",
        +			literal = false,
        +
        +			// Check whether a format character is doubled
        +			lookAhead = function( match ) {
        +				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
        +				if ( matches ) {
        +					iFormat++;
        +				}
        +				return matches;
        +			};
        +
        +		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
        +			if ( literal ) {
        +				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
        +					literal = false;
        +				} else {
        +					chars += format.charAt( iFormat );
        +				}
        +			} else {
        +				switch ( format.charAt( iFormat ) ) {
        +					case "d": case "m": case "y": case "@":
        +						chars += "0123456789";
        +						break;
        +					case "D": case "M":
        +						return null; // Accept anything
        +					case "'":
        +						if ( lookAhead( "'" ) ) {
        +							chars += "'";
        +						} else {
        +							literal = true;
        +						}
        +						break;
        +					default:
        +						chars += format.charAt( iFormat );
        +				}
        +			}
        +		}
        +		return chars;
        +	},
        +
        +	/* Get a setting value, defaulting if necessary. */
        +	_get: function( inst, name ) {
        +		return inst.settings[ name ] !== undefined ?
        +			inst.settings[ name ] : this._defaults[ name ];
        +	},
        +
        +	/* Parse existing date and initialise date picker. */
        +	_setDateFromField: function( inst, noDefault ) {
        +		if ( inst.input.val() === inst.lastVal ) {
        +			return;
        +		}
        +
        +		var dateFormat = this._get( inst, "dateFormat" ),
        +			dates = inst.lastVal = inst.input ? inst.input.val() : null,
        +			defaultDate = this._getDefaultDate( inst ),
        +			date = defaultDate,
        +			settings = this._getFormatConfig( inst );
        +
        +		try {
        +			date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
        +		} catch ( event ) {
        +			dates = ( noDefault ? "" : dates );
        +		}
        +		inst.selectedDay = date.getDate();
        +		inst.drawMonth = inst.selectedMonth = date.getMonth();
        +		inst.drawYear = inst.selectedYear = date.getFullYear();
        +		inst.currentDay = ( dates ? date.getDate() : 0 );
        +		inst.currentMonth = ( dates ? date.getMonth() : 0 );
        +		inst.currentYear = ( dates ? date.getFullYear() : 0 );
        +		this._adjustInstDate( inst );
        +	},
        +
        +	/* Retrieve the default date shown on opening. */
        +	_getDefaultDate: function( inst ) {
        +		return this._restrictMinMax( inst,
        +			this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
        +	},
        +
        +	/* A date may be specified as an exact value or a relative one. */
        +	_determineDate: function( inst, date, defaultDate ) {
        +		var offsetNumeric = function( offset ) {
        +				var date = new Date();
        +				date.setDate( date.getDate() + offset );
        +				return date;
        +			},
        +			offsetString = function( offset ) {
        +				try {
        +					return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
        +						offset, $.datepicker._getFormatConfig( inst ) );
        +				}
        +				catch ( e ) {
        +
        +					// Ignore
        +				}
        +
        +				var date = ( offset.toLowerCase().match( /^c/ ) ?
        +					$.datepicker._getDate( inst ) : null ) || new Date(),
        +					year = date.getFullYear(),
        +					month = date.getMonth(),
        +					day = date.getDate(),
        +					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
        +					matches = pattern.exec( offset );
        +
        +				while ( matches ) {
        +					switch ( matches[ 2 ] || "d" ) {
        +						case "d" : case "D" :
        +							day += parseInt( matches[ 1 ], 10 ); break;
        +						case "w" : case "W" :
        +							day += parseInt( matches[ 1 ], 10 ) * 7; break;
        +						case "m" : case "M" :
        +							month += parseInt( matches[ 1 ], 10 );
        +							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
        +							break;
        +						case "y": case "Y" :
        +							year += parseInt( matches[ 1 ], 10 );
        +							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
        +							break;
        +					}
        +					matches = pattern.exec( offset );
        +				}
        +				return new Date( year, month, day );
        +			},
        +			newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
        +				( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
        +
        +		newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
        +		if ( newDate ) {
        +			newDate.setHours( 0 );
        +			newDate.setMinutes( 0 );
        +			newDate.setSeconds( 0 );
        +			newDate.setMilliseconds( 0 );
        +		}
        +		return this._daylightSavingAdjust( newDate );
        +	},
        +
        +	/* Handle switch to/from daylight saving.
        +	 * Hours may be non-zero on daylight saving cut-over:
        +	 * > 12 when midnight changeover, but then cannot generate
        +	 * midnight datetime, so jump to 1AM, otherwise reset.
        +	 * @param  date  (Date) the date to check
        +	 * @return  (Date) the corrected date
        +	 */
        +	_daylightSavingAdjust: function( date ) {
        +		if ( !date ) {
        +			return null;
        +		}
        +		date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
        +		return date;
        +	},
        +
        +	/* Set the date(s) directly. */
        +	_setDate: function( inst, date, noChange ) {
        +		var clear = !date,
        +			origMonth = inst.selectedMonth,
        +			origYear = inst.selectedYear,
        +			newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
        +
        +		inst.selectedDay = inst.currentDay = newDate.getDate();
        +		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
        +		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
        +		if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
        +			this._notifyChange( inst );
        +		}
        +		this._adjustInstDate( inst );
        +		if ( inst.input ) {
        +			inst.input.val( clear ? "" : this._formatDate( inst ) );
        +		}
        +	},
        +
        +	/* Retrieve the date(s) directly. */
        +	_getDate: function( inst ) {
        +		var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
        +			this._daylightSavingAdjust( new Date(
        +			inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
        +			return startDate;
        +	},
        +
        +	/* Attach the onxxx handlers.  These are declared statically so
        +	 * they work with static code transformers like Caja.
        +	 */
        +	_attachHandlers: function( inst ) {
        +		var stepMonths = this._get( inst, "stepMonths" ),
        +			id = "#" + inst.id.replace( /\\\\/g, "\\" );
        +		inst.dpDiv.find( "[data-handler]" ).map( function() {
        +			var handler = {
        +				prev: function() {
        +					$.datepicker._adjustDate( id, -stepMonths, "M" );
        +				},
        +				next: function() {
        +					$.datepicker._adjustDate( id, +stepMonths, "M" );
        +				},
        +				hide: function() {
        +					$.datepicker._hideDatepicker();
        +				},
        +				today: function() {
        +					$.datepicker._gotoToday( id );
        +				},
        +				selectDay: function() {
        +					$.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
        +					return false;
        +				},
        +				selectMonth: function() {
        +					$.datepicker._selectMonthYear( id, this, "M" );
        +					return false;
        +				},
        +				selectYear: function() {
        +					$.datepicker._selectMonthYear( id, this, "Y" );
        +					return false;
        +				}
        +			};
        +			$( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
        +		} );
        +	},
        +
        +	/* Generate the HTML for the current state of the date picker. */
        +	_generateHTML: function( inst ) {
        +		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
        +			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
        +			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
        +			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
        +			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
        +			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
        +			tempDate = new Date(),
        +			today = this._daylightSavingAdjust(
        +				new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
        +			isRTL = this._get( inst, "isRTL" ),
        +			showButtonPanel = this._get( inst, "showButtonPanel" ),
        +			hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
        +			navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
        +			numMonths = this._getNumberOfMonths( inst ),
        +			showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
        +			stepMonths = this._get( inst, "stepMonths" ),
        +			isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
        +			currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
        +				new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
        +			minDate = this._getMinMaxDate( inst, "min" ),
        +			maxDate = this._getMinMaxDate( inst, "max" ),
        +			drawMonth = inst.drawMonth - showCurrentAtPos,
        +			drawYear = inst.drawYear;
        +
        +		if ( drawMonth < 0 ) {
        +			drawMonth += 12;
        +			drawYear--;
        +		}
        +		if ( maxDate ) {
        +			maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
        +				maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
        +			maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
        +			while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
        +				drawMonth--;
        +				if ( drawMonth < 0 ) {
        +					drawMonth = 11;
        +					drawYear--;
        +				}
        +			}
        +		}
        +		inst.drawMonth = drawMonth;
        +		inst.drawYear = drawYear;
        +
        +		prevText = this._get( inst, "prevText" );
        +		prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
        +			this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
        +			this._getFormatConfig( inst ) ) );
        +
        +		prev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?
        +			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
        +			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" :
        +			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" ) );
        +
        +		nextText = this._get( inst, "nextText" );
        +		nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
        +			this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
        +			this._getFormatConfig( inst ) ) );
        +
        +		next = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?
        +			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
        +			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" :
        +			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" ) );
        +
        +		currentText = this._get( inst, "currentText" );
        +		gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
        +		currentText = ( !navigationAsDateFormat ? currentText :
        +			this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
        +
        +		controls = ( !inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
        +			this._get( inst, "closeText" ) + "</button>" : "" );
        +
        +		buttonPanel = ( showButtonPanel ) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + ( isRTL ? controls : "" ) +
        +			( this._isInRange( inst, gotoDate ) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
        +			">" + currentText + "</button>" : "" ) + ( isRTL ? "" : controls ) + "</div>" : "";
        +
        +		firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
        +		firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
        +
        +		showWeek = this._get( inst, "showWeek" );
        +		dayNames = this._get( inst, "dayNames" );
        +		dayNamesMin = this._get( inst, "dayNamesMin" );
        +		monthNames = this._get( inst, "monthNames" );
        +		monthNamesShort = this._get( inst, "monthNamesShort" );
        +		beforeShowDay = this._get( inst, "beforeShowDay" );
        +		showOtherMonths = this._get( inst, "showOtherMonths" );
        +		selectOtherMonths = this._get( inst, "selectOtherMonths" );
        +		defaultDate = this._getDefaultDate( inst );
        +		html = "";
        +
        +		for ( row = 0; row < numMonths[ 0 ]; row++ ) {
        +			group = "";
        +			this.maxRows = 4;
        +			for ( col = 0; col < numMonths[ 1 ]; col++ ) {
        +				selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
        +				cornerClass = " ui-corner-all";
        +				calender = "";
        +				if ( isMultiMonth ) {
        +					calender += "<div class='ui-datepicker-group";
        +					if ( numMonths[ 1 ] > 1 ) {
        +						switch ( col ) {
        +							case 0: calender += " ui-datepicker-group-first";
        +								cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
        +							case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
        +								cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
        +							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
        +						}
        +					}
        +					calender += "'>";
        +				}
        +				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
        +					( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
        +					( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
        +					this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
        +					row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
        +					"</div><table class='ui-datepicker-calendar'><thead>" +
        +					"<tr>";
        +				thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
        +				for ( dow = 0; dow < 7; dow++ ) { // days of the week
        +					day = ( dow + firstDay ) % 7;
        +					thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
        +						"<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
        +				}
        +				calender += thead + "</tr></thead><tbody>";
        +				daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
        +				if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
        +					inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
        +				}
        +				leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
        +				curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
        +				numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
        +				this.maxRows = numRows;
        +				printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
        +				for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
        +					calender += "<tr>";
        +					tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
        +						this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
        +					for ( dow = 0; dow < 7; dow++ ) { // create date picker days
        +						daySettings = ( beforeShowDay ?
        +							beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
        +						otherMonth = ( printDate.getMonth() !== drawMonth );
        +						unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
        +							( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
        +						tbody += "<td class='" +
        +							( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
        +							( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
        +							( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
        +							( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
        +
        +							// or defaultDate is current printedDate and defaultDate is selectedDate
        +							" " + this._dayOverClass : "" ) + // highlight selected day
        +							( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
        +							( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
        +							( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
        +							( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
        +							( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
        +							( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
        +							( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
        +							( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
        +							( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
        +							( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
        +							( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
        +							"' href='#'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
        +						printDate.setDate( printDate.getDate() + 1 );
        +						printDate = this._daylightSavingAdjust( printDate );
        +					}
        +					calender += tbody + "</tr>";
        +				}
        +				drawMonth++;
        +				if ( drawMonth > 11 ) {
        +					drawMonth = 0;
        +					drawYear++;
        +				}
        +				calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
        +							( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
        +				group += calender;
        +			}
        +			html += group;
        +		}
        +		html += buttonPanel;
        +		inst._keyEvent = false;
        +		return html;
        +	},
        +
        +	/* Generate the month and year header. */
        +	_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
        +			secondary, monthNames, monthNamesShort ) {
        +
        +		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
        +			changeMonth = this._get( inst, "changeMonth" ),
        +			changeYear = this._get( inst, "changeYear" ),
        +			showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
        +			html = "<div class='ui-datepicker-title'>",
        +			monthHtml = "";
        +
        +		// Month selection
        +		if ( secondary || !changeMonth ) {
        +			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
        +		} else {
        +			inMinYear = ( minDate && minDate.getFullYear() === drawYear );
        +			inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
        +			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
        +			for ( month = 0; month < 12; month++ ) {
        +				if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
        +					monthHtml += "<option value='" + month + "'" +
        +						( month === drawMonth ? " selected='selected'" : "" ) +
        +						">" + monthNamesShort[ month ] + "</option>";
        +				}
        +			}
        +			monthHtml += "</select>";
        +		}
        +
        +		if ( !showMonthAfterYear ) {
        +			html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
        +		}
        +
        +		// Year selection
        +		if ( !inst.yearshtml ) {
        +			inst.yearshtml = "";
        +			if ( secondary || !changeYear ) {
        +				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
        +			} else {
        +
        +				// determine range of years to display
        +				years = this._get( inst, "yearRange" ).split( ":" );
        +				thisYear = new Date().getFullYear();
        +				determineYear = function( value ) {
        +					var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
        +						( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
        +						parseInt( value, 10 ) ) );
        +					return ( isNaN( year ) ? thisYear : year );
        +				};
        +				year = determineYear( years[ 0 ] );
        +				endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
        +				year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
        +				endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
        +				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
        +				for ( ; year <= endYear; year++ ) {
        +					inst.yearshtml += "<option value='" + year + "'" +
        +						( year === drawYear ? " selected='selected'" : "" ) +
        +						">" + year + "</option>";
        +				}
        +				inst.yearshtml += "</select>";
        +
        +				html += inst.yearshtml;
        +				inst.yearshtml = null;
        +			}
        +		}
        +
        +		html += this._get( inst, "yearSuffix" );
        +		if ( showMonthAfterYear ) {
        +			html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
        +		}
        +		html += "</div>"; // Close datepicker_header
        +		return html;
        +	},
        +
        +	/* Adjust one of the date sub-fields. */
        +	_adjustInstDate: function( inst, offset, period ) {
        +		var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
        +			month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
        +			day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
        +			date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
        +
        +		inst.selectedDay = date.getDate();
        +		inst.drawMonth = inst.selectedMonth = date.getMonth();
        +		inst.drawYear = inst.selectedYear = date.getFullYear();
        +		if ( period === "M" || period === "Y" ) {
        +			this._notifyChange( inst );
        +		}
        +	},
        +
        +	/* Ensure a date is within any min/max bounds. */
        +	_restrictMinMax: function( inst, date ) {
        +		var minDate = this._getMinMaxDate( inst, "min" ),
        +			maxDate = this._getMinMaxDate( inst, "max" ),
        +			newDate = ( minDate && date < minDate ? minDate : date );
        +		return ( maxDate && newDate > maxDate ? maxDate : newDate );
        +	},
        +
        +	/* Notify change of month/year. */
        +	_notifyChange: function( inst ) {
        +		var onChange = this._get( inst, "onChangeMonthYear" );
        +		if ( onChange ) {
        +			onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
        +				[ inst.selectedYear, inst.selectedMonth + 1, inst ] );
        +		}
        +	},
        +
        +	/* Determine the number of months to show. */
        +	_getNumberOfMonths: function( inst ) {
        +		var numMonths = this._get( inst, "numberOfMonths" );
        +		return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
        +	},
        +
        +	/* Determine the current maximum date - ensure no time components are set. */
        +	_getMinMaxDate: function( inst, minMax ) {
        +		return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
        +	},
        +
        +	/* Find the number of days in a given month. */
        +	_getDaysInMonth: function( year, month ) {
        +		return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
        +	},
        +
        +	/* Find the day of the week of the first of a month. */
        +	_getFirstDayOfMonth: function( year, month ) {
        +		return new Date( year, month, 1 ).getDay();
        +	},
        +
        +	/* Determines if we should allow a "next/prev" month display change. */
        +	_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
        +		var numMonths = this._getNumberOfMonths( inst ),
        +			date = this._daylightSavingAdjust( new Date( curYear,
        +			curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
        +
        +		if ( offset < 0 ) {
        +			date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
        +		}
        +		return this._isInRange( inst, date );
        +	},
        +
        +	/* Is the given date in the accepted range? */
        +	_isInRange: function( inst, date ) {
        +		var yearSplit, currentYear,
        +			minDate = this._getMinMaxDate( inst, "min" ),
        +			maxDate = this._getMinMaxDate( inst, "max" ),
        +			minYear = null,
        +			maxYear = null,
        +			years = this._get( inst, "yearRange" );
        +			if ( years ) {
        +				yearSplit = years.split( ":" );
        +				currentYear = new Date().getFullYear();
        +				minYear = parseInt( yearSplit[ 0 ], 10 );
        +				maxYear = parseInt( yearSplit[ 1 ], 10 );
        +				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
        +					minYear += currentYear;
        +				}
        +				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
        +					maxYear += currentYear;
        +				}
        +			}
        +
        +		return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
        +			( !maxDate || date.getTime() <= maxDate.getTime() ) &&
        +			( !minYear || date.getFullYear() >= minYear ) &&
        +			( !maxYear || date.getFullYear() <= maxYear ) );
        +	},
        +
        +	/* Provide the configuration settings for formatting/parsing. */
        +	_getFormatConfig: function( inst ) {
        +		var shortYearCutoff = this._get( inst, "shortYearCutoff" );
        +		shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
        +			new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
        +		return { shortYearCutoff: shortYearCutoff,
        +			dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
        +			monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
        +	},
        +
        +	/* Format the given date for display. */
        +	_formatDate: function( inst, day, month, year ) {
        +		if ( !day ) {
        +			inst.currentDay = inst.selectedDay;
        +			inst.currentMonth = inst.selectedMonth;
        +			inst.currentYear = inst.selectedYear;
        +		}
        +		var date = ( day ? ( typeof day === "object" ? day :
        +			this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
        +			this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
        +		return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
        +	}
        +} );
        +
        +/*
        + * Bind hover events for datepicker elements.
        + * Done via delegate so the binding only occurs once in the lifetime of the parent div.
        + * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
        + */
        +function datepicker_bindHover( dpDiv ) {
        +	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
        +	return dpDiv.on( "mouseout", selector, function() {
        +			$( this ).removeClass( "ui-state-hover" );
        +			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
        +				$( this ).removeClass( "ui-datepicker-prev-hover" );
        +			}
        +			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
        +				$( this ).removeClass( "ui-datepicker-next-hover" );
        +			}
        +		} )
        +		.on( "mouseover", selector, datepicker_handleMouseover );
        +}
        +
        +function datepicker_handleMouseover() {
        +	if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
        +		$( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
        +		$( this ).addClass( "ui-state-hover" );
        +		if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
        +			$( this ).addClass( "ui-datepicker-prev-hover" );
        +		}
        +		if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
        +			$( this ).addClass( "ui-datepicker-next-hover" );
        +		}
        +	}
        +}
        +
        +/* jQuery extend now ignores nulls! */
        +function datepicker_extendRemove( target, props ) {
        +	$.extend( target, props );
        +	for ( var name in props ) {
        +		if ( props[ name ] == null ) {
        +			target[ name ] = props[ name ];
        +		}
        +	}
        +	return target;
        +}
        +
        +/* Invoke the datepicker functionality.
        +   @param  options  string - a command, optionally followed by additional parameters or
        +					Object - settings for attaching new datepicker functionality
        +   @return  jQuery object */
        +$.fn.datepicker = function( options ) {
        +
        +	/* Verify an empty collection wasn't passed - Fixes #6976 */
        +	if ( !this.length ) {
        +		return this;
        +	}
        +
        +	/* Initialise the date picker. */
        +	if ( !$.datepicker.initialized ) {
        +		$( document ).on( "mousedown", $.datepicker._checkExternalClick );
        +		$.datepicker.initialized = true;
        +	}
        +
        +	/* Append datepicker main container to body if not exist. */
        +	if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
        +		$( "body" ).append( $.datepicker.dpDiv );
        +	}
        +
        +	var otherArgs = Array.prototype.slice.call( arguments, 1 );
        +	if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
        +		return $.datepicker[ "_" + options + "Datepicker" ].
        +			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
        +	}
        +	if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
        +		return $.datepicker[ "_" + options + "Datepicker" ].
        +			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
        +	}
        +	return this.each( function() {
        +		typeof options === "string" ?
        +			$.datepicker[ "_" + options + "Datepicker" ].
        +				apply( $.datepicker, [ this ].concat( otherArgs ) ) :
        +			$.datepicker._attachDatepicker( this, options );
        +	} );
        +};
        +
        +$.datepicker = new Datepicker(); // singleton instance
        +$.datepicker.initialized = false;
        +$.datepicker.uuid = new Date().getTime();
        +$.datepicker.version = "1.12.1";
        +
        +var widgetsDatepicker = $.datepicker;
        +
        +
        +
        +
        +// This file is deprecated
        +var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
        +
        +/*!
        + * jQuery UI Mouse 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Mouse
        +//>>group: Widgets
        +//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
        +//>>docs: http://api.jqueryui.com/mouse/
        +
        +
        +
        +var mouseHandled = false;
        +$( document ).on( "mouseup", function() {
        +	mouseHandled = false;
        +} );
        +
        +var widgetsMouse = $.widget( "ui.mouse", {
        +	version: "1.12.1",
        +	options: {
        +		cancel: "input, textarea, button, select, option",
        +		distance: 1,
        +		delay: 0
        +	},
        +	_mouseInit: function() {
        +		var that = this;
        +
        +		this.element
        +			.on( "mousedown." + this.widgetName, function( event ) {
        +				return that._mouseDown( event );
        +			} )
        +			.on( "click." + this.widgetName, function( event ) {
        +				if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
        +					$.removeData( event.target, that.widgetName + ".preventClickEvent" );
        +					event.stopImmediatePropagation();
        +					return false;
        +				}
        +			} );
        +
        +		this.started = false;
        +	},
        +
        +	// TODO: make sure destroying one instance of mouse doesn't mess with
        +	// other instances of mouse
        +	_mouseDestroy: function() {
        +		this.element.off( "." + this.widgetName );
        +		if ( this._mouseMoveDelegate ) {
        +			this.document
        +				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        +				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
        +		}
        +	},
        +
        +	_mouseDown: function( event ) {
        +
        +		// don't let more than one widget handle mouseStart
        +		if ( mouseHandled ) {
        +			return;
        +		}
        +
        +		this._mouseMoved = false;
        +
        +		// We may have missed mouseup (out of window)
        +		( this._mouseStarted && this._mouseUp( event ) );
        +
        +		this._mouseDownEvent = event;
        +
        +		var that = this,
        +			btnIsLeft = ( event.which === 1 ),
        +
        +			// event.target.nodeName works around a bug in IE 8 with
        +			// disabled inputs (#7620)
        +			elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
        +				$( event.target ).closest( this.options.cancel ).length : false );
        +		if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
        +			return true;
        +		}
        +
        +		this.mouseDelayMet = !this.options.delay;
        +		if ( !this.mouseDelayMet ) {
        +			this._mouseDelayTimer = setTimeout( function() {
        +				that.mouseDelayMet = true;
        +			}, this.options.delay );
        +		}
        +
        +		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
        +			this._mouseStarted = ( this._mouseStart( event ) !== false );
        +			if ( !this._mouseStarted ) {
        +				event.preventDefault();
        +				return true;
        +			}
        +		}
        +
        +		// Click event may never have fired (Gecko & Opera)
        +		if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
        +			$.removeData( event.target, this.widgetName + ".preventClickEvent" );
        +		}
        +
        +		// These delegates are required to keep context
        +		this._mouseMoveDelegate = function( event ) {
        +			return that._mouseMove( event );
        +		};
        +		this._mouseUpDelegate = function( event ) {
        +			return that._mouseUp( event );
        +		};
        +
        +		this.document
        +			.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        +			.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
        +
        +		event.preventDefault();
        +
        +		mouseHandled = true;
        +		return true;
        +	},
        +
        +	_mouseMove: function( event ) {
        +
        +		// Only check for mouseups outside the document if you've moved inside the document
        +		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
        +		// fire a mousemove event if content is placed under the cursor. See #7778
        +		// Support: IE <9
        +		if ( this._mouseMoved ) {
        +
        +			// IE mouseup check - mouseup happened when mouse was out of window
        +			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
        +					!event.button ) {
        +				return this._mouseUp( event );
        +
        +			// Iframe mouseup check - mouseup occurred in another document
        +			} else if ( !event.which ) {
        +
        +				// Support: Safari <=8 - 9
        +				// Safari sets which to 0 if you press any of the following keys
        +				// during a drag (#14461)
        +				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
        +						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
        +					this.ignoreMissingWhich = true;
        +				} else if ( !this.ignoreMissingWhich ) {
        +					return this._mouseUp( event );
        +				}
        +			}
        +		}
        +
        +		if ( event.which || event.button ) {
        +			this._mouseMoved = true;
        +		}
        +
        +		if ( this._mouseStarted ) {
        +			this._mouseDrag( event );
        +			return event.preventDefault();
        +		}
        +
        +		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
        +			this._mouseStarted =
        +				( this._mouseStart( this._mouseDownEvent, event ) !== false );
        +			( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
        +		}
        +
        +		return !this._mouseStarted;
        +	},
        +
        +	_mouseUp: function( event ) {
        +		this.document
        +			.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        +			.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
        +
        +		if ( this._mouseStarted ) {
        +			this._mouseStarted = false;
        +
        +			if ( event.target === this._mouseDownEvent.target ) {
        +				$.data( event.target, this.widgetName + ".preventClickEvent", true );
        +			}
        +
        +			this._mouseStop( event );
        +		}
        +
        +		if ( this._mouseDelayTimer ) {
        +			clearTimeout( this._mouseDelayTimer );
        +			delete this._mouseDelayTimer;
        +		}
        +
        +		this.ignoreMissingWhich = false;
        +		mouseHandled = false;
        +		event.preventDefault();
        +	},
        +
        +	_mouseDistanceMet: function( event ) {
        +		return ( Math.max(
        +				Math.abs( this._mouseDownEvent.pageX - event.pageX ),
        +				Math.abs( this._mouseDownEvent.pageY - event.pageY )
        +			) >= this.options.distance
        +		);
        +	},
        +
        +	_mouseDelayMet: function( /* event */ ) {
        +		return this.mouseDelayMet;
        +	},
        +
        +	// These are placeholder methods, to be overriden by extending plugin
        +	_mouseStart: function( /* event */ ) {},
        +	_mouseDrag: function( /* event */ ) {},
        +	_mouseStop: function( /* event */ ) {},
        +	_mouseCapture: function( /* event */ ) { return true; }
        +} );
        +
        +
        +
        +
        +// $.ui.plugin is deprecated. Use $.widget() extensions instead.
        +var plugin = $.ui.plugin = {
        +	add: function( module, option, set ) {
        +		var i,
        +			proto = $.ui[ module ].prototype;
        +		for ( i in set ) {
        +			proto.plugins[ i ] = proto.plugins[ i ] || [];
        +			proto.plugins[ i ].push( [ option, set[ i ] ] );
        +		}
        +	},
        +	call: function( instance, name, args, allowDisconnected ) {
        +		var i,
        +			set = instance.plugins[ name ];
        +
        +		if ( !set ) {
        +			return;
        +		}
        +
        +		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
        +				instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
        +			return;
        +		}
        +
        +		for ( i = 0; i < set.length; i++ ) {
        +			if ( instance.options[ set[ i ][ 0 ] ] ) {
        +				set[ i ][ 1 ].apply( instance.element, args );
        +			}
        +		}
        +	}
        +};
        +
        +
        +
        +var safeBlur = $.ui.safeBlur = function( element ) {
        +
        +	// Support: IE9 - 10 only
        +	// If the <body> is blurred, IE will switch windows, see #9420
        +	if ( element && element.nodeName.toLowerCase() !== "body" ) {
        +		$( element ).trigger( "blur" );
        +	}
        +};
        +
        +
        +/*!
        + * jQuery UI Draggable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Draggable
        +//>>group: Interactions
        +//>>description: Enables dragging functionality for any element.
        +//>>docs: http://api.jqueryui.com/draggable/
        +//>>demos: http://jqueryui.com/draggable/
        +//>>css.structure: ../../themes/base/draggable.css
        +
        +
        +
        +$.widget( "ui.draggable", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "drag",
        +	options: {
        +		addClasses: true,
        +		appendTo: "parent",
        +		axis: false,
        +		connectToSortable: false,
        +		containment: false,
        +		cursor: "auto",
        +		cursorAt: false,
        +		grid: false,
        +		handle: false,
        +		helper: "original",
        +		iframeFix: false,
        +		opacity: false,
        +		refreshPositions: false,
        +		revert: false,
        +		revertDuration: 500,
        +		scope: "default",
        +		scroll: true,
        +		scrollSensitivity: 20,
        +		scrollSpeed: 20,
        +		snap: false,
        +		snapMode: "both",
        +		snapTolerance: 20,
        +		stack: false,
        +		zIndex: false,
        +
        +		// Callbacks
        +		drag: null,
        +		start: null,
        +		stop: null
        +	},
        +	_create: function() {
        +
        +		if ( this.options.helper === "original" ) {
        +			this._setPositionRelative();
        +		}
        +		if ( this.options.addClasses ) {
        +			this._addClass( "ui-draggable" );
        +		}
        +		this._setHandleClassName();
        +
        +		this._mouseInit();
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +		if ( key === "handle" ) {
        +			this._removeHandleClassName();
        +			this._setHandleClassName();
        +		}
        +	},
        +
        +	_destroy: function() {
        +		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
        +			this.destroyOnClear = true;
        +			return;
        +		}
        +		this._removeHandleClassName();
        +		this._mouseDestroy();
        +	},
        +
        +	_mouseCapture: function( event ) {
        +		var o = this.options;
        +
        +		// Among others, prevent a drag on a resizable-handle
        +		if ( this.helper || o.disabled ||
        +				$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
        +			return false;
        +		}
        +
        +		//Quit if we're not on a valid handle
        +		this.handle = this._getHandle( event );
        +		if ( !this.handle ) {
        +			return false;
        +		}
        +
        +		this._blurActiveElement( event );
        +
        +		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
        +
        +		return true;
        +
        +	},
        +
        +	_blockFrames: function( selector ) {
        +		this.iframeBlocks = this.document.find( selector ).map( function() {
        +			var iframe = $( this );
        +
        +			return $( "<div>" )
        +				.css( "position", "absolute" )
        +				.appendTo( iframe.parent() )
        +				.outerWidth( iframe.outerWidth() )
        +				.outerHeight( iframe.outerHeight() )
        +				.offset( iframe.offset() )[ 0 ];
        +		} );
        +	},
        +
        +	_unblockFrames: function() {
        +		if ( this.iframeBlocks ) {
        +			this.iframeBlocks.remove();
        +			delete this.iframeBlocks;
        +		}
        +	},
        +
        +	_blurActiveElement: function( event ) {
        +		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
        +			target = $( event.target );
        +
        +		// Don't blur if the event occurred on an element that is within
        +		// the currently focused element
        +		// See #10527, #12472
        +		if ( target.closest( activeElement ).length ) {
        +			return;
        +		}
        +
        +		// Blur any element that currently has focus, see #4261
        +		$.ui.safeBlur( activeElement );
        +	},
        +
        +	_mouseStart: function( event ) {
        +
        +		var o = this.options;
        +
        +		//Create and append the visible helper
        +		this.helper = this._createHelper( event );
        +
        +		this._addClass( this.helper, "ui-draggable-dragging" );
        +
        +		//Cache the helper size
        +		this._cacheHelperProportions();
        +
        +		//If ddmanager is used for droppables, set the global draggable
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.current = this;
        +		}
        +
        +		/*
        +		 * - Position generation -
        +		 * This block generates everything position related - it's the core of draggables.
        +		 */
        +
        +		//Cache the margins of the original element
        +		this._cacheMargins();
        +
        +		//Store the helper's css position
        +		this.cssPosition = this.helper.css( "position" );
        +		this.scrollParent = this.helper.scrollParent( true );
        +		this.offsetParent = this.helper.offsetParent();
        +		this.hasFixedAncestor = this.helper.parents().filter( function() {
        +				return $( this ).css( "position" ) === "fixed";
        +			} ).length > 0;
        +
        +		//The element's absolute position on the page minus margins
        +		this.positionAbs = this.element.offset();
        +		this._refreshOffsets( event );
        +
        +		//Generate the original position
        +		this.originalPosition = this.position = this._generatePosition( event, false );
        +		this.originalPageX = event.pageX;
        +		this.originalPageY = event.pageY;
        +
        +		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        +		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
        +
        +		//Set a containment if given in the options
        +		this._setContainment();
        +
        +		//Trigger event + callbacks
        +		if ( this._trigger( "start", event ) === false ) {
        +			this._clear();
        +			return false;
        +		}
        +
        +		//Recache the helper size
        +		this._cacheHelperProportions();
        +
        +		//Prepare the droppable offsets
        +		if ( $.ui.ddmanager && !o.dropBehaviour ) {
        +			$.ui.ddmanager.prepareOffsets( this, event );
        +		}
        +
        +		// Execute the drag once - this causes the helper not to be visible before getting its
        +		// correct position
        +		this._mouseDrag( event, true );
        +
        +		// If the ddmanager is used for droppables, inform the manager that dragging has started
        +		// (see #5003)
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.dragStart( this, event );
        +		}
        +
        +		return true;
        +	},
        +
        +	_refreshOffsets: function( event ) {
        +		this.offset = {
        +			top: this.positionAbs.top - this.margins.top,
        +			left: this.positionAbs.left - this.margins.left,
        +			scroll: false,
        +			parent: this._getParentOffset(),
        +			relative: this._getRelativeOffset()
        +		};
        +
        +		this.offset.click = {
        +			left: event.pageX - this.offset.left,
        +			top: event.pageY - this.offset.top
        +		};
        +	},
        +
        +	_mouseDrag: function( event, noPropagation ) {
        +
        +		// reset any necessary cached properties (see #5009)
        +		if ( this.hasFixedAncestor ) {
        +			this.offset.parent = this._getParentOffset();
        +		}
        +
        +		//Compute the helpers position
        +		this.position = this._generatePosition( event, true );
        +		this.positionAbs = this._convertPositionTo( "absolute" );
        +
        +		//Call plugins and callbacks and use the resulting position if something is returned
        +		if ( !noPropagation ) {
        +			var ui = this._uiHash();
        +			if ( this._trigger( "drag", event, ui ) === false ) {
        +				this._mouseUp( new $.Event( "mouseup", event ) );
        +				return false;
        +			}
        +			this.position = ui.position;
        +		}
        +
        +		this.helper[ 0 ].style.left = this.position.left + "px";
        +		this.helper[ 0 ].style.top = this.position.top + "px";
        +
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.drag( this, event );
        +		}
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +
        +		//If we are using droppables, inform the manager about the drop
        +		var that = this,
        +			dropped = false;
        +		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
        +			dropped = $.ui.ddmanager.drop( this, event );
        +		}
        +
        +		//if a drop comes from outside (a sortable)
        +		if ( this.dropped ) {
        +			dropped = this.dropped;
        +			this.dropped = false;
        +		}
        +
        +		if ( ( this.options.revert === "invalid" && !dropped ) ||
        +				( this.options.revert === "valid" && dropped ) ||
        +				this.options.revert === true || ( $.isFunction( this.options.revert ) &&
        +				this.options.revert.call( this.element, dropped ) )
        +		) {
        +			$( this.helper ).animate(
        +				this.originalPosition,
        +				parseInt( this.options.revertDuration, 10 ),
        +				function() {
        +					if ( that._trigger( "stop", event ) !== false ) {
        +						that._clear();
        +					}
        +				}
        +			);
        +		} else {
        +			if ( this._trigger( "stop", event ) !== false ) {
        +				this._clear();
        +			}
        +		}
        +
        +		return false;
        +	},
        +
        +	_mouseUp: function( event ) {
        +		this._unblockFrames();
        +
        +		// If the ddmanager is used for droppables, inform the manager that dragging has stopped
        +		// (see #5003)
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.dragStop( this, event );
        +		}
        +
        +		// Only need to focus if the event occurred on the draggable itself, see #10527
        +		if ( this.handleElement.is( event.target ) ) {
        +
        +			// The interaction is over; whether or not the click resulted in a drag,
        +			// focus the element
        +			this.element.trigger( "focus" );
        +		}
        +
        +		return $.ui.mouse.prototype._mouseUp.call( this, event );
        +	},
        +
        +	cancel: function() {
        +
        +		if ( this.helper.is( ".ui-draggable-dragging" ) ) {
        +			this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
        +		} else {
        +			this._clear();
        +		}
        +
        +		return this;
        +
        +	},
        +
        +	_getHandle: function( event ) {
        +		return this.options.handle ?
        +			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
        +			true;
        +	},
        +
        +	_setHandleClassName: function() {
        +		this.handleElement = this.options.handle ?
        +			this.element.find( this.options.handle ) : this.element;
        +		this._addClass( this.handleElement, "ui-draggable-handle" );
        +	},
        +
        +	_removeHandleClassName: function() {
        +		this._removeClass( this.handleElement, "ui-draggable-handle" );
        +	},
        +
        +	_createHelper: function( event ) {
        +
        +		var o = this.options,
        +			helperIsFunction = $.isFunction( o.helper ),
        +			helper = helperIsFunction ?
        +				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
        +				( o.helper === "clone" ?
        +					this.element.clone().removeAttr( "id" ) :
        +					this.element );
        +
        +		if ( !helper.parents( "body" ).length ) {
        +			helper.appendTo( ( o.appendTo === "parent" ?
        +				this.element[ 0 ].parentNode :
        +				o.appendTo ) );
        +		}
        +
        +		// Http://bugs.jqueryui.com/ticket/9446
        +		// a helper function can return the original element
        +		// which wouldn't have been set to relative in _create
        +		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
        +			this._setPositionRelative();
        +		}
        +
        +		if ( helper[ 0 ] !== this.element[ 0 ] &&
        +				!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
        +			helper.css( "position", "absolute" );
        +		}
        +
        +		return helper;
        +
        +	},
        +
        +	_setPositionRelative: function() {
        +		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
        +			this.element[ 0 ].style.position = "relative";
        +		}
        +	},
        +
        +	_adjustOffsetFromHelper: function( obj ) {
        +		if ( typeof obj === "string" ) {
        +			obj = obj.split( " " );
        +		}
        +		if ( $.isArray( obj ) ) {
        +			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
        +		}
        +		if ( "left" in obj ) {
        +			this.offset.click.left = obj.left + this.margins.left;
        +		}
        +		if ( "right" in obj ) {
        +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        +		}
        +		if ( "top" in obj ) {
        +			this.offset.click.top = obj.top + this.margins.top;
        +		}
        +		if ( "bottom" in obj ) {
        +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        +		}
        +	},
        +
        +	_isRootNode: function( element ) {
        +		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
        +	},
        +
        +	_getParentOffset: function() {
        +
        +		//Get the offsetParent and cache its position
        +		var po = this.offsetParent.offset(),
        +			document = this.document[ 0 ];
        +
        +		// This is a special case where we need to modify a offset calculated on start, since the
        +		// following happened:
        +		// 1. The position of the helper is absolute, so it's position is calculated based on the
        +		// next positioned parent
        +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
        +		// the document, which means that the scroll is included in the initial calculation of the
        +		// offset of the parent, and never recalculated upon drag
        +		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
        +			po.left += this.scrollParent.scrollLeft();
        +			po.top += this.scrollParent.scrollTop();
        +		}
        +
        +		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
        +			po = { top: 0, left: 0 };
        +		}
        +
        +		return {
        +			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
        +			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
        +		};
        +
        +	},
        +
        +	_getRelativeOffset: function() {
        +		if ( this.cssPosition !== "relative" ) {
        +			return { top: 0, left: 0 };
        +		}
        +
        +		var p = this.element.position(),
        +			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        +
        +		return {
        +			top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
        +				( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
        +			left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
        +				( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
        +		};
        +
        +	},
        +
        +	_cacheMargins: function() {
        +		this.margins = {
        +			left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
        +			top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
        +			right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
        +			bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
        +		};
        +	},
        +
        +	_cacheHelperProportions: function() {
        +		this.helperProportions = {
        +			width: this.helper.outerWidth(),
        +			height: this.helper.outerHeight()
        +		};
        +	},
        +
        +	_setContainment: function() {
        +
        +		var isUserScrollable, c, ce,
        +			o = this.options,
        +			document = this.document[ 0 ];
        +
        +		this.relativeContainer = null;
        +
        +		if ( !o.containment ) {
        +			this.containment = null;
        +			return;
        +		}
        +
        +		if ( o.containment === "window" ) {
        +			this.containment = [
        +				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
        +				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
        +				$( window ).scrollLeft() + $( window ).width() -
        +					this.helperProportions.width - this.margins.left,
        +				$( window ).scrollTop() +
        +					( $( window ).height() || document.body.parentNode.scrollHeight ) -
        +					this.helperProportions.height - this.margins.top
        +			];
        +			return;
        +		}
        +
        +		if ( o.containment === "document" ) {
        +			this.containment = [
        +				0,
        +				0,
        +				$( document ).width() - this.helperProportions.width - this.margins.left,
        +				( $( document ).height() || document.body.parentNode.scrollHeight ) -
        +					this.helperProportions.height - this.margins.top
        +			];
        +			return;
        +		}
        +
        +		if ( o.containment.constructor === Array ) {
        +			this.containment = o.containment;
        +			return;
        +		}
        +
        +		if ( o.containment === "parent" ) {
        +			o.containment = this.helper[ 0 ].parentNode;
        +		}
        +
        +		c = $( o.containment );
        +		ce = c[ 0 ];
        +
        +		if ( !ce ) {
        +			return;
        +		}
        +
        +		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
        +
        +		this.containment = [
        +			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
        +				( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
        +			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
        +				( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
        +			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
        +				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
        +				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
        +				this.helperProportions.width -
        +				this.margins.left -
        +				this.margins.right,
        +			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
        +				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
        +				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
        +				this.helperProportions.height -
        +				this.margins.top -
        +				this.margins.bottom
        +		];
        +		this.relativeContainer = c;
        +	},
        +
        +	_convertPositionTo: function( d, pos ) {
        +
        +		if ( !pos ) {
        +			pos = this.position;
        +		}
        +
        +		var mod = d === "absolute" ? 1 : -1,
        +			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pos.top	+
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top * mod -
        +				( ( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.top :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pos.left +
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left * mod	-
        +				( ( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.left :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
        +			)
        +		};
        +
        +	},
        +
        +	_generatePosition: function( event, constrainPosition ) {
        +
        +		var containment, co, top, left,
        +			o = this.options,
        +			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
        +			pageX = event.pageX,
        +			pageY = event.pageY;
        +
        +		// Cache the scroll
        +		if ( !scrollIsRootNode || !this.offset.scroll ) {
        +			this.offset.scroll = {
        +				top: this.scrollParent.scrollTop(),
        +				left: this.scrollParent.scrollLeft()
        +			};
        +		}
        +
        +		/*
        +		 * - Position constraining -
        +		 * Constrain the position to a mix of grid, containment.
        +		 */
        +
        +		// If we are not dragging yet, we won't check for options
        +		if ( constrainPosition ) {
        +			if ( this.containment ) {
        +				if ( this.relativeContainer ) {
        +					co = this.relativeContainer.offset();
        +					containment = [
        +						this.containment[ 0 ] + co.left,
        +						this.containment[ 1 ] + co.top,
        +						this.containment[ 2 ] + co.left,
        +						this.containment[ 3 ] + co.top
        +					];
        +				} else {
        +					containment = this.containment;
        +				}
        +
        +				if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
        +					pageX = containment[ 0 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
        +					pageY = containment[ 1 ] + this.offset.click.top;
        +				}
        +				if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
        +					pageX = containment[ 2 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
        +					pageY = containment[ 3 ] + this.offset.click.top;
        +				}
        +			}
        +
        +			if ( o.grid ) {
        +
        +				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
        +				// argument errors in IE (see ticket #6950)
        +				top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
        +					this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
        +				pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
        +					top - this.offset.click.top > containment[ 3 ] ) ?
        +						top :
        +						( ( top - this.offset.click.top >= containment[ 1 ] ) ?
        +							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
        +
        +				left = o.grid[ 0 ] ? this.originalPageX +
        +					Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
        +					this.originalPageX;
        +				pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
        +					left - this.offset.click.left > containment[ 2 ] ) ?
        +						left :
        +						( ( left - this.offset.click.left >= containment[ 0 ] ) ?
        +							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
        +			}
        +
        +			if ( o.axis === "y" ) {
        +				pageX = this.originalPageX;
        +			}
        +
        +			if ( o.axis === "x" ) {
        +				pageY = this.originalPageY;
        +			}
        +		}
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pageY -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.top -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top +
        +				( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.top :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pageX -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.left -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left +
        +				( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.left :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
        +			)
        +		};
        +
        +	},
        +
        +	_clear: function() {
        +		this._removeClass( this.helper, "ui-draggable-dragging" );
        +		if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
        +			this.helper.remove();
        +		}
        +		this.helper = null;
        +		this.cancelHelperRemoval = false;
        +		if ( this.destroyOnClear ) {
        +			this.destroy();
        +		}
        +	},
        +
        +	// From now on bulk stuff - mainly helpers
        +
        +	_trigger: function( type, event, ui ) {
        +		ui = ui || this._uiHash();
        +		$.ui.plugin.call( this, type, [ event, ui, this ], true );
        +
        +		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
        +		if ( /^(drag|start|stop)/.test( type ) ) {
        +			this.positionAbs = this._convertPositionTo( "absolute" );
        +			ui.offset = this.positionAbs;
        +		}
        +		return $.Widget.prototype._trigger.call( this, type, event, ui );
        +	},
        +
        +	plugins: {},
        +
        +	_uiHash: function() {
        +		return {
        +			helper: this.helper,
        +			position: this.position,
        +			originalPosition: this.originalPosition,
        +			offset: this.positionAbs
        +		};
        +	}
        +
        +} );
        +
        +$.ui.plugin.add( "draggable", "connectToSortable", {
        +	start: function( event, ui, draggable ) {
        +		var uiSortable = $.extend( {}, ui, {
        +			item: draggable.element
        +		} );
        +
        +		draggable.sortables = [];
        +		$( draggable.options.connectToSortable ).each( function() {
        +			var sortable = $( this ).sortable( "instance" );
        +
        +			if ( sortable && !sortable.options.disabled ) {
        +				draggable.sortables.push( sortable );
        +
        +				// RefreshPositions is called at drag start to refresh the containerCache
        +				// which is used in drag. This ensures it's initialized and synchronized
        +				// with any changes that might have happened on the page since initialization.
        +				sortable.refreshPositions();
        +				sortable._trigger( "activate", event, uiSortable );
        +			}
        +		} );
        +	},
        +	stop: function( event, ui, draggable ) {
        +		var uiSortable = $.extend( {}, ui, {
        +			item: draggable.element
        +		} );
        +
        +		draggable.cancelHelperRemoval = false;
        +
        +		$.each( draggable.sortables, function() {
        +			var sortable = this;
        +
        +			if ( sortable.isOver ) {
        +				sortable.isOver = 0;
        +
        +				// Allow this sortable to handle removing the helper
        +				draggable.cancelHelperRemoval = true;
        +				sortable.cancelHelperRemoval = false;
        +
        +				// Use _storedCSS To restore properties in the sortable,
        +				// as this also handles revert (#9675) since the draggable
        +				// may have modified them in unexpected ways (#8809)
        +				sortable._storedCSS = {
        +					position: sortable.placeholder.css( "position" ),
        +					top: sortable.placeholder.css( "top" ),
        +					left: sortable.placeholder.css( "left" )
        +				};
        +
        +				sortable._mouseStop( event );
        +
        +				// Once drag has ended, the sortable should return to using
        +				// its original helper, not the shared helper from draggable
        +				sortable.options.helper = sortable.options._helper;
        +			} else {
        +
        +				// Prevent this Sortable from removing the helper.
        +				// However, don't set the draggable to remove the helper
        +				// either as another connected Sortable may yet handle the removal.
        +				sortable.cancelHelperRemoval = true;
        +
        +				sortable._trigger( "deactivate", event, uiSortable );
        +			}
        +		} );
        +	},
        +	drag: function( event, ui, draggable ) {
        +		$.each( draggable.sortables, function() {
        +			var innermostIntersecting = false,
        +				sortable = this;
        +
        +			// Copy over variables that sortable's _intersectsWith uses
        +			sortable.positionAbs = draggable.positionAbs;
        +			sortable.helperProportions = draggable.helperProportions;
        +			sortable.offset.click = draggable.offset.click;
        +
        +			if ( sortable._intersectsWith( sortable.containerCache ) ) {
        +				innermostIntersecting = true;
        +
        +				$.each( draggable.sortables, function() {
        +
        +					// Copy over variables that sortable's _intersectsWith uses
        +					this.positionAbs = draggable.positionAbs;
        +					this.helperProportions = draggable.helperProportions;
        +					this.offset.click = draggable.offset.click;
        +
        +					if ( this !== sortable &&
        +							this._intersectsWith( this.containerCache ) &&
        +							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
        +						innermostIntersecting = false;
        +					}
        +
        +					return innermostIntersecting;
        +				} );
        +			}
        +
        +			if ( innermostIntersecting ) {
        +
        +				// If it intersects, we use a little isOver variable and set it once,
        +				// so that the move-in stuff gets fired only once.
        +				if ( !sortable.isOver ) {
        +					sortable.isOver = 1;
        +
        +					// Store draggable's parent in case we need to reappend to it later.
        +					draggable._parent = ui.helper.parent();
        +
        +					sortable.currentItem = ui.helper
        +						.appendTo( sortable.element )
        +						.data( "ui-sortable-item", true );
        +
        +					// Store helper option to later restore it
        +					sortable.options._helper = sortable.options.helper;
        +
        +					sortable.options.helper = function() {
        +						return ui.helper[ 0 ];
        +					};
        +
        +					// Fire the start events of the sortable with our passed browser event,
        +					// and our own helper (so it doesn't create a new one)
        +					event.target = sortable.currentItem[ 0 ];
        +					sortable._mouseCapture( event, true );
        +					sortable._mouseStart( event, true, true );
        +
        +					// Because the browser event is way off the new appended portlet,
        +					// modify necessary variables to reflect the changes
        +					sortable.offset.click.top = draggable.offset.click.top;
        +					sortable.offset.click.left = draggable.offset.click.left;
        +					sortable.offset.parent.left -= draggable.offset.parent.left -
        +						sortable.offset.parent.left;
        +					sortable.offset.parent.top -= draggable.offset.parent.top -
        +						sortable.offset.parent.top;
        +
        +					draggable._trigger( "toSortable", event );
        +
        +					// Inform draggable that the helper is in a valid drop zone,
        +					// used solely in the revert option to handle "valid/invalid".
        +					draggable.dropped = sortable.element;
        +
        +					// Need to refreshPositions of all sortables in the case that
        +					// adding to one sortable changes the location of the other sortables (#9675)
        +					$.each( draggable.sortables, function() {
        +						this.refreshPositions();
        +					} );
        +
        +					// Hack so receive/update callbacks work (mostly)
        +					draggable.currentItem = draggable.element;
        +					sortable.fromOutside = draggable;
        +				}
        +
        +				if ( sortable.currentItem ) {
        +					sortable._mouseDrag( event );
        +
        +					// Copy the sortable's position because the draggable's can potentially reflect
        +					// a relative position, while sortable is always absolute, which the dragged
        +					// element has now become. (#8809)
        +					ui.position = sortable.position;
        +				}
        +			} else {
        +
        +				// If it doesn't intersect with the sortable, and it intersected before,
        +				// we fake the drag stop of the sortable, but make sure it doesn't remove
        +				// the helper by using cancelHelperRemoval.
        +				if ( sortable.isOver ) {
        +
        +					sortable.isOver = 0;
        +					sortable.cancelHelperRemoval = true;
        +
        +					// Calling sortable's mouseStop would trigger a revert,
        +					// so revert must be temporarily false until after mouseStop is called.
        +					sortable.options._revert = sortable.options.revert;
        +					sortable.options.revert = false;
        +
        +					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
        +					sortable._mouseStop( event, true );
        +
        +					// Restore sortable behaviors that were modfied
        +					// when the draggable entered the sortable area (#9481)
        +					sortable.options.revert = sortable.options._revert;
        +					sortable.options.helper = sortable.options._helper;
        +
        +					if ( sortable.placeholder ) {
        +						sortable.placeholder.remove();
        +					}
        +
        +					// Restore and recalculate the draggable's offset considering the sortable
        +					// may have modified them in unexpected ways. (#8809, #10669)
        +					ui.helper.appendTo( draggable._parent );
        +					draggable._refreshOffsets( event );
        +					ui.position = draggable._generatePosition( event, true );
        +
        +					draggable._trigger( "fromSortable", event );
        +
        +					// Inform draggable that the helper is no longer in a valid drop zone
        +					draggable.dropped = false;
        +
        +					// Need to refreshPositions of all sortables just in case removing
        +					// from one sortable changes the location of other sortables (#9675)
        +					$.each( draggable.sortables, function() {
        +						this.refreshPositions();
        +					} );
        +				}
        +			}
        +		} );
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "cursor", {
        +	start: function( event, ui, instance ) {
        +		var t = $( "body" ),
        +			o = instance.options;
        +
        +		if ( t.css( "cursor" ) ) {
        +			o._cursor = t.css( "cursor" );
        +		}
        +		t.css( "cursor", o.cursor );
        +	},
        +	stop: function( event, ui, instance ) {
        +		var o = instance.options;
        +		if ( o._cursor ) {
        +			$( "body" ).css( "cursor", o._cursor );
        +		}
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "opacity", {
        +	start: function( event, ui, instance ) {
        +		var t = $( ui.helper ),
        +			o = instance.options;
        +		if ( t.css( "opacity" ) ) {
        +			o._opacity = t.css( "opacity" );
        +		}
        +		t.css( "opacity", o.opacity );
        +	},
        +	stop: function( event, ui, instance ) {
        +		var o = instance.options;
        +		if ( o._opacity ) {
        +			$( ui.helper ).css( "opacity", o._opacity );
        +		}
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "scroll", {
        +	start: function( event, ui, i ) {
        +		if ( !i.scrollParentNotHidden ) {
        +			i.scrollParentNotHidden = i.helper.scrollParent( false );
        +		}
        +
        +		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
        +				i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
        +			i.overflowOffset = i.scrollParentNotHidden.offset();
        +		}
        +	},
        +	drag: function( event, ui, i  ) {
        +
        +		var o = i.options,
        +			scrolled = false,
        +			scrollParent = i.scrollParentNotHidden[ 0 ],
        +			document = i.document[ 0 ];
        +
        +		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
        +			if ( !o.axis || o.axis !== "x" ) {
        +				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
        +						o.scrollSensitivity ) {
        +					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
        +				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
        +					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
        +				}
        +			}
        +
        +			if ( !o.axis || o.axis !== "y" ) {
        +				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
        +						o.scrollSensitivity ) {
        +					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
        +				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
        +					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
        +				}
        +			}
        +
        +		} else {
        +
        +			if ( !o.axis || o.axis !== "x" ) {
        +				if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
        +				} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
        +				}
        +			}
        +
        +			if ( !o.axis || o.axis !== "y" ) {
        +				if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollLeft(
        +						$( document ).scrollLeft() - o.scrollSpeed
        +					);
        +				} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollLeft(
        +						$( document ).scrollLeft() + o.scrollSpeed
        +					);
        +				}
        +			}
        +
        +		}
        +
        +		if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
        +			$.ui.ddmanager.prepareOffsets( i, event );
        +		}
        +
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "snap", {
        +	start: function( event, ui, i ) {
        +
        +		var o = i.options;
        +
        +		i.snapElements = [];
        +
        +		$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
        +			.each( function() {
        +				var $t = $( this ),
        +					$o = $t.offset();
        +				if ( this !== i.element[ 0 ] ) {
        +					i.snapElements.push( {
        +						item: this,
        +						width: $t.outerWidth(), height: $t.outerHeight(),
        +						top: $o.top, left: $o.left
        +					} );
        +				}
        +			} );
        +
        +	},
        +	drag: function( event, ui, inst ) {
        +
        +		var ts, bs, ls, rs, l, r, t, b, i, first,
        +			o = inst.options,
        +			d = o.snapTolerance,
        +			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
        +			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
        +
        +		for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
        +
        +			l = inst.snapElements[ i ].left - inst.margins.left;
        +			r = l + inst.snapElements[ i ].width;
        +			t = inst.snapElements[ i ].top - inst.margins.top;
        +			b = t + inst.snapElements[ i ].height;
        +
        +			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
        +					!$.contains( inst.snapElements[ i ].item.ownerDocument,
        +					inst.snapElements[ i ].item ) ) {
        +				if ( inst.snapElements[ i ].snapping ) {
        +					( inst.options.snap.release &&
        +						inst.options.snap.release.call(
        +							inst.element,
        +							event,
        +							$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
        +						) );
        +				}
        +				inst.snapElements[ i ].snapping = false;
        +				continue;
        +			}
        +
        +			if ( o.snapMode !== "inner" ) {
        +				ts = Math.abs( t - y2 ) <= d;
        +				bs = Math.abs( b - y1 ) <= d;
        +				ls = Math.abs( l - x2 ) <= d;
        +				rs = Math.abs( r - x1 ) <= d;
        +				if ( ts ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: t - inst.helperProportions.height,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( bs ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: b,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( ls ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: l - inst.helperProportions.width
        +					} ).left;
        +				}
        +				if ( rs ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: r
        +					} ).left;
        +				}
        +			}
        +
        +			first = ( ts || bs || ls || rs );
        +
        +			if ( o.snapMode !== "outer" ) {
        +				ts = Math.abs( t - y1 ) <= d;
        +				bs = Math.abs( b - y2 ) <= d;
        +				ls = Math.abs( l - x1 ) <= d;
        +				rs = Math.abs( r - x2 ) <= d;
        +				if ( ts ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: t,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( bs ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: b - inst.helperProportions.height,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( ls ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: l
        +					} ).left;
        +				}
        +				if ( rs ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: r - inst.helperProportions.width
        +					} ).left;
        +				}
        +			}
        +
        +			if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
        +				( inst.options.snap.snap &&
        +					inst.options.snap.snap.call(
        +						inst.element,
        +						event,
        +						$.extend( inst._uiHash(), {
        +							snapItem: inst.snapElements[ i ].item
        +						} ) ) );
        +			}
        +			inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
        +
        +		}
        +
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "stack", {
        +	start: function( event, ui, instance ) {
        +		var min,
        +			o = instance.options,
        +			group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
        +				return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
        +					( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
        +			} );
        +
        +		if ( !group.length ) { return; }
        +
        +		min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
        +		$( group ).each( function( i ) {
        +			$( this ).css( "zIndex", min + i );
        +		} );
        +		this.css( "zIndex", ( min + group.length ) );
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "zIndex", {
        +	start: function( event, ui, instance ) {
        +		var t = $( ui.helper ),
        +			o = instance.options;
        +
        +		if ( t.css( "zIndex" ) ) {
        +			o._zIndex = t.css( "zIndex" );
        +		}
        +		t.css( "zIndex", o.zIndex );
        +	},
        +	stop: function( event, ui, instance ) {
        +		var o = instance.options;
        +
        +		if ( o._zIndex ) {
        +			$( ui.helper ).css( "zIndex", o._zIndex );
        +		}
        +	}
        +} );
        +
        +var widgetsDraggable = $.ui.draggable;
        +
        +
        +/*!
        + * jQuery UI Resizable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Resizable
        +//>>group: Interactions
        +//>>description: Enables resize functionality for any element.
        +//>>docs: http://api.jqueryui.com/resizable/
        +//>>demos: http://jqueryui.com/resizable/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/resizable.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.widget( "ui.resizable", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "resize",
        +	options: {
        +		alsoResize: false,
        +		animate: false,
        +		animateDuration: "slow",
        +		animateEasing: "swing",
        +		aspectRatio: false,
        +		autoHide: false,
        +		classes: {
        +			"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
        +		},
        +		containment: false,
        +		ghost: false,
        +		grid: false,
        +		handles: "e,s,se",
        +		helper: false,
        +		maxHeight: null,
        +		maxWidth: null,
        +		minHeight: 10,
        +		minWidth: 10,
        +
        +		// See #7960
        +		zIndex: 90,
        +
        +		// Callbacks
        +		resize: null,
        +		start: null,
        +		stop: null
        +	},
        +
        +	_num: function( value ) {
        +		return parseFloat( value ) || 0;
        +	},
        +
        +	_isNumber: function( value ) {
        +		return !isNaN( parseFloat( value ) );
        +	},
        +
        +	_hasScroll: function( el, a ) {
        +
        +		if ( $( el ).css( "overflow" ) === "hidden" ) {
        +			return false;
        +		}
        +
        +		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
        +			has = false;
        +
        +		if ( el[ scroll ] > 0 ) {
        +			return true;
        +		}
        +
        +		// TODO: determine which cases actually cause this to happen
        +		// if the element doesn't have the scroll set, see if it's possible to
        +		// set the scroll
        +		el[ scroll ] = 1;
        +		has = ( el[ scroll ] > 0 );
        +		el[ scroll ] = 0;
        +		return has;
        +	},
        +
        +	_create: function() {
        +
        +		var margins,
        +			o = this.options,
        +			that = this;
        +		this._addClass( "ui-resizable" );
        +
        +		$.extend( this, {
        +			_aspectRatio: !!( o.aspectRatio ),
        +			aspectRatio: o.aspectRatio,
        +			originalElement: this.element,
        +			_proportionallyResizeElements: [],
        +			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
        +		} );
        +
        +		// Wrap the element if it cannot hold child nodes
        +		if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
        +
        +			this.element.wrap(
        +				$( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ).css( {
        +					position: this.element.css( "position" ),
        +					width: this.element.outerWidth(),
        +					height: this.element.outerHeight(),
        +					top: this.element.css( "top" ),
        +					left: this.element.css( "left" )
        +				} )
        +			);
        +
        +			this.element = this.element.parent().data(
        +				"ui-resizable", this.element.resizable( "instance" )
        +			);
        +
        +			this.elementIsWrapper = true;
        +
        +			margins = {
        +				marginTop: this.originalElement.css( "marginTop" ),
        +				marginRight: this.originalElement.css( "marginRight" ),
        +				marginBottom: this.originalElement.css( "marginBottom" ),
        +				marginLeft: this.originalElement.css( "marginLeft" )
        +			};
        +
        +			this.element.css( margins );
        +			this.originalElement.css( "margin", 0 );
        +
        +			// support: Safari
        +			// Prevent Safari textarea resize
        +			this.originalResizeStyle = this.originalElement.css( "resize" );
        +			this.originalElement.css( "resize", "none" );
        +
        +			this._proportionallyResizeElements.push( this.originalElement.css( {
        +				position: "static",
        +				zoom: 1,
        +				display: "block"
        +			} ) );
        +
        +			// Support: IE9
        +			// avoid IE jump (hard set the margin)
        +			this.originalElement.css( margins );
        +
        +			this._proportionallyResize();
        +		}
        +
        +		this._setupHandles();
        +
        +		if ( o.autoHide ) {
        +			$( this.element )
        +				.on( "mouseenter", function() {
        +					if ( o.disabled ) {
        +						return;
        +					}
        +					that._removeClass( "ui-resizable-autohide" );
        +					that._handles.show();
        +				} )
        +				.on( "mouseleave", function() {
        +					if ( o.disabled ) {
        +						return;
        +					}
        +					if ( !that.resizing ) {
        +						that._addClass( "ui-resizable-autohide" );
        +						that._handles.hide();
        +					}
        +				} );
        +		}
        +
        +		this._mouseInit();
        +	},
        +
        +	_destroy: function() {
        +
        +		this._mouseDestroy();
        +
        +		var wrapper,
        +			_destroy = function( exp ) {
        +				$( exp )
        +					.removeData( "resizable" )
        +					.removeData( "ui-resizable" )
        +					.off( ".resizable" )
        +					.find( ".ui-resizable-handle" )
        +						.remove();
        +			};
        +
        +		// TODO: Unwrap at same DOM position
        +		if ( this.elementIsWrapper ) {
        +			_destroy( this.element );
        +			wrapper = this.element;
        +			this.originalElement.css( {
        +				position: wrapper.css( "position" ),
        +				width: wrapper.outerWidth(),
        +				height: wrapper.outerHeight(),
        +				top: wrapper.css( "top" ),
        +				left: wrapper.css( "left" )
        +			} ).insertAfter( wrapper );
        +			wrapper.remove();
        +		}
        +
        +		this.originalElement.css( "resize", this.originalResizeStyle );
        +		_destroy( this.originalElement );
        +
        +		return this;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +
        +		switch ( key ) {
        +		case "handles":
        +			this._removeHandles();
        +			this._setupHandles();
        +			break;
        +		default:
        +			break;
        +		}
        +	},
        +
        +	_setupHandles: function() {
        +		var o = this.options, handle, i, n, hname, axis, that = this;
        +		this.handles = o.handles ||
        +			( !$( ".ui-resizable-handle", this.element ).length ?
        +				"e,s,se" : {
        +					n: ".ui-resizable-n",
        +					e: ".ui-resizable-e",
        +					s: ".ui-resizable-s",
        +					w: ".ui-resizable-w",
        +					se: ".ui-resizable-se",
        +					sw: ".ui-resizable-sw",
        +					ne: ".ui-resizable-ne",
        +					nw: ".ui-resizable-nw"
        +				} );
        +
        +		this._handles = $();
        +		if ( this.handles.constructor === String ) {
        +
        +			if ( this.handles === "all" ) {
        +				this.handles = "n,e,s,w,se,sw,ne,nw";
        +			}
        +
        +			n = this.handles.split( "," );
        +			this.handles = {};
        +
        +			for ( i = 0; i < n.length; i++ ) {
        +
        +				handle = $.trim( n[ i ] );
        +				hname = "ui-resizable-" + handle;
        +				axis = $( "<div>" );
        +				this._addClass( axis, "ui-resizable-handle " + hname );
        +
        +				axis.css( { zIndex: o.zIndex } );
        +
        +				this.handles[ handle ] = ".ui-resizable-" + handle;
        +				this.element.append( axis );
        +			}
        +
        +		}
        +
        +		this._renderAxis = function( target ) {
        +
        +			var i, axis, padPos, padWrapper;
        +
        +			target = target || this.element;
        +
        +			for ( i in this.handles ) {
        +
        +				if ( this.handles[ i ].constructor === String ) {
        +					this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
        +				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
        +					this.handles[ i ] = $( this.handles[ i ] );
        +					this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
        +				}
        +
        +				if ( this.elementIsWrapper &&
        +						this.originalElement[ 0 ]
        +							.nodeName
        +							.match( /^(textarea|input|select|button)$/i ) ) {
        +					axis = $( this.handles[ i ], this.element );
        +
        +					padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
        +						axis.outerHeight() :
        +						axis.outerWidth();
        +
        +					padPos = [ "padding",
        +						/ne|nw|n/.test( i ) ? "Top" :
        +						/se|sw|s/.test( i ) ? "Bottom" :
        +						/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
        +
        +					target.css( padPos, padWrapper );
        +
        +					this._proportionallyResize();
        +				}
        +
        +				this._handles = this._handles.add( this.handles[ i ] );
        +			}
        +		};
        +
        +		// TODO: make renderAxis a prototype function
        +		this._renderAxis( this.element );
        +
        +		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
        +		this._handles.disableSelection();
        +
        +		this._handles.on( "mouseover", function() {
        +			if ( !that.resizing ) {
        +				if ( this.className ) {
        +					axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
        +				}
        +				that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
        +			}
        +		} );
        +
        +		if ( o.autoHide ) {
        +			this._handles.hide();
        +			this._addClass( "ui-resizable-autohide" );
        +		}
        +	},
        +
        +	_removeHandles: function() {
        +		this._handles.remove();
        +	},
        +
        +	_mouseCapture: function( event ) {
        +		var i, handle,
        +			capture = false;
        +
        +		for ( i in this.handles ) {
        +			handle = $( this.handles[ i ] )[ 0 ];
        +			if ( handle === event.target || $.contains( handle, event.target ) ) {
        +				capture = true;
        +			}
        +		}
        +
        +		return !this.options.disabled && capture;
        +	},
        +
        +	_mouseStart: function( event ) {
        +
        +		var curleft, curtop, cursor,
        +			o = this.options,
        +			el = this.element;
        +
        +		this.resizing = true;
        +
        +		this._renderProxy();
        +
        +		curleft = this._num( this.helper.css( "left" ) );
        +		curtop = this._num( this.helper.css( "top" ) );
        +
        +		if ( o.containment ) {
        +			curleft += $( o.containment ).scrollLeft() || 0;
        +			curtop += $( o.containment ).scrollTop() || 0;
        +		}
        +
        +		this.offset = this.helper.offset();
        +		this.position = { left: curleft, top: curtop };
        +
        +		this.size = this._helper ? {
        +				width: this.helper.width(),
        +				height: this.helper.height()
        +			} : {
        +				width: el.width(),
        +				height: el.height()
        +			};
        +
        +		this.originalSize = this._helper ? {
        +				width: el.outerWidth(),
        +				height: el.outerHeight()
        +			} : {
        +				width: el.width(),
        +				height: el.height()
        +			};
        +
        +		this.sizeDiff = {
        +			width: el.outerWidth() - el.width(),
        +			height: el.outerHeight() - el.height()
        +		};
        +
        +		this.originalPosition = { left: curleft, top: curtop };
        +		this.originalMousePosition = { left: event.pageX, top: event.pageY };
        +
        +		this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
        +			o.aspectRatio :
        +			( ( this.originalSize.width / this.originalSize.height ) || 1 );
        +
        +		cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
        +		$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
        +
        +		this._addClass( "ui-resizable-resizing" );
        +		this._propagate( "start", event );
        +		return true;
        +	},
        +
        +	_mouseDrag: function( event ) {
        +
        +		var data, props,
        +			smp = this.originalMousePosition,
        +			a = this.axis,
        +			dx = ( event.pageX - smp.left ) || 0,
        +			dy = ( event.pageY - smp.top ) || 0,
        +			trigger = this._change[ a ];
        +
        +		this._updatePrevProperties();
        +
        +		if ( !trigger ) {
        +			return false;
        +		}
        +
        +		data = trigger.apply( this, [ event, dx, dy ] );
        +
        +		this._updateVirtualBoundaries( event.shiftKey );
        +		if ( this._aspectRatio || event.shiftKey ) {
        +			data = this._updateRatio( data, event );
        +		}
        +
        +		data = this._respectSize( data, event );
        +
        +		this._updateCache( data );
        +
        +		this._propagate( "resize", event );
        +
        +		props = this._applyChanges();
        +
        +		if ( !this._helper && this._proportionallyResizeElements.length ) {
        +			this._proportionallyResize();
        +		}
        +
        +		if ( !$.isEmptyObject( props ) ) {
        +			this._updatePrevProperties();
        +			this._trigger( "resize", event, this.ui() );
        +			this._applyChanges();
        +		}
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +
        +		this.resizing = false;
        +		var pr, ista, soffseth, soffsetw, s, left, top,
        +			o = this.options, that = this;
        +
        +		if ( this._helper ) {
        +
        +			pr = this._proportionallyResizeElements;
        +			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
        +			soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
        +			soffsetw = ista ? 0 : that.sizeDiff.width;
        +
        +			s = {
        +				width: ( that.helper.width()  - soffsetw ),
        +				height: ( that.helper.height() - soffseth )
        +			};
        +			left = ( parseFloat( that.element.css( "left" ) ) +
        +				( that.position.left - that.originalPosition.left ) ) || null;
        +			top = ( parseFloat( that.element.css( "top" ) ) +
        +				( that.position.top - that.originalPosition.top ) ) || null;
        +
        +			if ( !o.animate ) {
        +				this.element.css( $.extend( s, { top: top, left: left } ) );
        +			}
        +
        +			that.helper.height( that.size.height );
        +			that.helper.width( that.size.width );
        +
        +			if ( this._helper && !o.animate ) {
        +				this._proportionallyResize();
        +			}
        +		}
        +
        +		$( "body" ).css( "cursor", "auto" );
        +
        +		this._removeClass( "ui-resizable-resizing" );
        +
        +		this._propagate( "stop", event );
        +
        +		if ( this._helper ) {
        +			this.helper.remove();
        +		}
        +
        +		return false;
        +
        +	},
        +
        +	_updatePrevProperties: function() {
        +		this.prevPosition = {
        +			top: this.position.top,
        +			left: this.position.left
        +		};
        +		this.prevSize = {
        +			width: this.size.width,
        +			height: this.size.height
        +		};
        +	},
        +
        +	_applyChanges: function() {
        +		var props = {};
        +
        +		if ( this.position.top !== this.prevPosition.top ) {
        +			props.top = this.position.top + "px";
        +		}
        +		if ( this.position.left !== this.prevPosition.left ) {
        +			props.left = this.position.left + "px";
        +		}
        +		if ( this.size.width !== this.prevSize.width ) {
        +			props.width = this.size.width + "px";
        +		}
        +		if ( this.size.height !== this.prevSize.height ) {
        +			props.height = this.size.height + "px";
        +		}
        +
        +		this.helper.css( props );
        +
        +		return props;
        +	},
        +
        +	_updateVirtualBoundaries: function( forceAspectRatio ) {
        +		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
        +			o = this.options;
        +
        +		b = {
        +			minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
        +			maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
        +			minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
        +			maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
        +		};
        +
        +		if ( this._aspectRatio || forceAspectRatio ) {
        +			pMinWidth = b.minHeight * this.aspectRatio;
        +			pMinHeight = b.minWidth / this.aspectRatio;
        +			pMaxWidth = b.maxHeight * this.aspectRatio;
        +			pMaxHeight = b.maxWidth / this.aspectRatio;
        +
        +			if ( pMinWidth > b.minWidth ) {
        +				b.minWidth = pMinWidth;
        +			}
        +			if ( pMinHeight > b.minHeight ) {
        +				b.minHeight = pMinHeight;
        +			}
        +			if ( pMaxWidth < b.maxWidth ) {
        +				b.maxWidth = pMaxWidth;
        +			}
        +			if ( pMaxHeight < b.maxHeight ) {
        +				b.maxHeight = pMaxHeight;
        +			}
        +		}
        +		this._vBoundaries = b;
        +	},
        +
        +	_updateCache: function( data ) {
        +		this.offset = this.helper.offset();
        +		if ( this._isNumber( data.left ) ) {
        +			this.position.left = data.left;
        +		}
        +		if ( this._isNumber( data.top ) ) {
        +			this.position.top = data.top;
        +		}
        +		if ( this._isNumber( data.height ) ) {
        +			this.size.height = data.height;
        +		}
        +		if ( this._isNumber( data.width ) ) {
        +			this.size.width = data.width;
        +		}
        +	},
        +
        +	_updateRatio: function( data ) {
        +
        +		var cpos = this.position,
        +			csize = this.size,
        +			a = this.axis;
        +
        +		if ( this._isNumber( data.height ) ) {
        +			data.width = ( data.height * this.aspectRatio );
        +		} else if ( this._isNumber( data.width ) ) {
        +			data.height = ( data.width / this.aspectRatio );
        +		}
        +
        +		if ( a === "sw" ) {
        +			data.left = cpos.left + ( csize.width - data.width );
        +			data.top = null;
        +		}
        +		if ( a === "nw" ) {
        +			data.top = cpos.top + ( csize.height - data.height );
        +			data.left = cpos.left + ( csize.width - data.width );
        +		}
        +
        +		return data;
        +	},
        +
        +	_respectSize: function( data ) {
        +
        +		var o = this._vBoundaries,
        +			a = this.axis,
        +			ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
        +			ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
        +			isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
        +			isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
        +			dw = this.originalPosition.left + this.originalSize.width,
        +			dh = this.originalPosition.top + this.originalSize.height,
        +			cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
        +		if ( isminw ) {
        +			data.width = o.minWidth;
        +		}
        +		if ( isminh ) {
        +			data.height = o.minHeight;
        +		}
        +		if ( ismaxw ) {
        +			data.width = o.maxWidth;
        +		}
        +		if ( ismaxh ) {
        +			data.height = o.maxHeight;
        +		}
        +
        +		if ( isminw && cw ) {
        +			data.left = dw - o.minWidth;
        +		}
        +		if ( ismaxw && cw ) {
        +			data.left = dw - o.maxWidth;
        +		}
        +		if ( isminh && ch ) {
        +			data.top = dh - o.minHeight;
        +		}
        +		if ( ismaxh && ch ) {
        +			data.top = dh - o.maxHeight;
        +		}
        +
        +		// Fixing jump error on top/left - bug #2330
        +		if ( !data.width && !data.height && !data.left && data.top ) {
        +			data.top = null;
        +		} else if ( !data.width && !data.height && !data.top && data.left ) {
        +			data.left = null;
        +		}
        +
        +		return data;
        +	},
        +
        +	_getPaddingPlusBorderDimensions: function( element ) {
        +		var i = 0,
        +			widths = [],
        +			borders = [
        +				element.css( "borderTopWidth" ),
        +				element.css( "borderRightWidth" ),
        +				element.css( "borderBottomWidth" ),
        +				element.css( "borderLeftWidth" )
        +			],
        +			paddings = [
        +				element.css( "paddingTop" ),
        +				element.css( "paddingRight" ),
        +				element.css( "paddingBottom" ),
        +				element.css( "paddingLeft" )
        +			];
        +
        +		for ( ; i < 4; i++ ) {
        +			widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
        +			widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
        +		}
        +
        +		return {
        +			height: widths[ 0 ] + widths[ 2 ],
        +			width: widths[ 1 ] + widths[ 3 ]
        +		};
        +	},
        +
        +	_proportionallyResize: function() {
        +
        +		if ( !this._proportionallyResizeElements.length ) {
        +			return;
        +		}
        +
        +		var prel,
        +			i = 0,
        +			element = this.helper || this.element;
        +
        +		for ( ; i < this._proportionallyResizeElements.length; i++ ) {
        +
        +			prel = this._proportionallyResizeElements[ i ];
        +
        +			// TODO: Seems like a bug to cache this.outerDimensions
        +			// considering that we are in a loop.
        +			if ( !this.outerDimensions ) {
        +				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
        +			}
        +
        +			prel.css( {
        +				height: ( element.height() - this.outerDimensions.height ) || 0,
        +				width: ( element.width() - this.outerDimensions.width ) || 0
        +			} );
        +
        +		}
        +
        +	},
        +
        +	_renderProxy: function() {
        +
        +		var el = this.element, o = this.options;
        +		this.elementOffset = el.offset();
        +
        +		if ( this._helper ) {
        +
        +			this.helper = this.helper || $( "<div style='overflow:hidden;'></div>" );
        +
        +			this._addClass( this.helper, this._helper );
        +			this.helper.css( {
        +				width: this.element.outerWidth(),
        +				height: this.element.outerHeight(),
        +				position: "absolute",
        +				left: this.elementOffset.left + "px",
        +				top: this.elementOffset.top + "px",
        +				zIndex: ++o.zIndex //TODO: Don't modify option
        +			} );
        +
        +			this.helper
        +				.appendTo( "body" )
        +				.disableSelection();
        +
        +		} else {
        +			this.helper = this.element;
        +		}
        +
        +	},
        +
        +	_change: {
        +		e: function( event, dx ) {
        +			return { width: this.originalSize.width + dx };
        +		},
        +		w: function( event, dx ) {
        +			var cs = this.originalSize, sp = this.originalPosition;
        +			return { left: sp.left + dx, width: cs.width - dx };
        +		},
        +		n: function( event, dx, dy ) {
        +			var cs = this.originalSize, sp = this.originalPosition;
        +			return { top: sp.top + dy, height: cs.height - dy };
        +		},
        +		s: function( event, dx, dy ) {
        +			return { height: this.originalSize.height + dy };
        +		},
        +		se: function( event, dx, dy ) {
        +			return $.extend( this._change.s.apply( this, arguments ),
        +				this._change.e.apply( this, [ event, dx, dy ] ) );
        +		},
        +		sw: function( event, dx, dy ) {
        +			return $.extend( this._change.s.apply( this, arguments ),
        +				this._change.w.apply( this, [ event, dx, dy ] ) );
        +		},
        +		ne: function( event, dx, dy ) {
        +			return $.extend( this._change.n.apply( this, arguments ),
        +				this._change.e.apply( this, [ event, dx, dy ] ) );
        +		},
        +		nw: function( event, dx, dy ) {
        +			return $.extend( this._change.n.apply( this, arguments ),
        +				this._change.w.apply( this, [ event, dx, dy ] ) );
        +		}
        +	},
        +
        +	_propagate: function( n, event ) {
        +		$.ui.plugin.call( this, n, [ event, this.ui() ] );
        +		( n !== "resize" && this._trigger( n, event, this.ui() ) );
        +	},
        +
        +	plugins: {},
        +
        +	ui: function() {
        +		return {
        +			originalElement: this.originalElement,
        +			element: this.element,
        +			helper: this.helper,
        +			position: this.position,
        +			size: this.size,
        +			originalSize: this.originalSize,
        +			originalPosition: this.originalPosition
        +		};
        +	}
        +
        +} );
        +
        +/*
        + * Resizable Extensions
        + */
        +
        +$.ui.plugin.add( "resizable", "animate", {
        +
        +	stop: function( event ) {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			pr = that._proportionallyResizeElements,
        +			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
        +			soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
        +			soffsetw = ista ? 0 : that.sizeDiff.width,
        +			style = {
        +				width: ( that.size.width - soffsetw ),
        +				height: ( that.size.height - soffseth )
        +			},
        +			left = ( parseFloat( that.element.css( "left" ) ) +
        +				( that.position.left - that.originalPosition.left ) ) || null,
        +			top = ( parseFloat( that.element.css( "top" ) ) +
        +				( that.position.top - that.originalPosition.top ) ) || null;
        +
        +		that.element.animate(
        +			$.extend( style, top && left ? { top: top, left: left } : {} ), {
        +				duration: o.animateDuration,
        +				easing: o.animateEasing,
        +				step: function() {
        +
        +					var data = {
        +						width: parseFloat( that.element.css( "width" ) ),
        +						height: parseFloat( that.element.css( "height" ) ),
        +						top: parseFloat( that.element.css( "top" ) ),
        +						left: parseFloat( that.element.css( "left" ) )
        +					};
        +
        +					if ( pr && pr.length ) {
        +						$( pr[ 0 ] ).css( { width: data.width, height: data.height } );
        +					}
        +
        +					// Propagating resize, and updating values for each animation step
        +					that._updateCache( data );
        +					that._propagate( "resize", event );
        +
        +				}
        +			}
        +		);
        +	}
        +
        +} );
        +
        +$.ui.plugin.add( "resizable", "containment", {
        +
        +	start: function() {
        +		var element, p, co, ch, cw, width, height,
        +			that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			el = that.element,
        +			oc = o.containment,
        +			ce = ( oc instanceof $ ) ?
        +				oc.get( 0 ) :
        +				( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
        +
        +		if ( !ce ) {
        +			return;
        +		}
        +
        +		that.containerElement = $( ce );
        +
        +		if ( /document/.test( oc ) || oc === document ) {
        +			that.containerOffset = {
        +				left: 0,
        +				top: 0
        +			};
        +			that.containerPosition = {
        +				left: 0,
        +				top: 0
        +			};
        +
        +			that.parentData = {
        +				element: $( document ),
        +				left: 0,
        +				top: 0,
        +				width: $( document ).width(),
        +				height: $( document ).height() || document.body.parentNode.scrollHeight
        +			};
        +		} else {
        +			element = $( ce );
        +			p = [];
        +			$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
        +				p[ i ] = that._num( element.css( "padding" + name ) );
        +			} );
        +
        +			that.containerOffset = element.offset();
        +			that.containerPosition = element.position();
        +			that.containerSize = {
        +				height: ( element.innerHeight() - p[ 3 ] ),
        +				width: ( element.innerWidth() - p[ 1 ] )
        +			};
        +
        +			co = that.containerOffset;
        +			ch = that.containerSize.height;
        +			cw = that.containerSize.width;
        +			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
        +			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
        +
        +			that.parentData = {
        +				element: ce,
        +				left: co.left,
        +				top: co.top,
        +				width: width,
        +				height: height
        +			};
        +		}
        +	},
        +
        +	resize: function( event ) {
        +		var woset, hoset, isParent, isOffsetRelative,
        +			that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			co = that.containerOffset,
        +			cp = that.position,
        +			pRatio = that._aspectRatio || event.shiftKey,
        +			cop = {
        +				top: 0,
        +				left: 0
        +			},
        +			ce = that.containerElement,
        +			continueResize = true;
        +
        +		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
        +			cop = co;
        +		}
        +
        +		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
        +			that.size.width = that.size.width +
        +				( that._helper ?
        +					( that.position.left - co.left ) :
        +					( that.position.left - cop.left ) );
        +
        +			if ( pRatio ) {
        +				that.size.height = that.size.width / that.aspectRatio;
        +				continueResize = false;
        +			}
        +			that.position.left = o.helper ? co.left : 0;
        +		}
        +
        +		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
        +			that.size.height = that.size.height +
        +				( that._helper ?
        +					( that.position.top - co.top ) :
        +					that.position.top );
        +
        +			if ( pRatio ) {
        +				that.size.width = that.size.height * that.aspectRatio;
        +				continueResize = false;
        +			}
        +			that.position.top = that._helper ? co.top : 0;
        +		}
        +
        +		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
        +		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
        +
        +		if ( isParent && isOffsetRelative ) {
        +			that.offset.left = that.parentData.left + that.position.left;
        +			that.offset.top = that.parentData.top + that.position.top;
        +		} else {
        +			that.offset.left = that.element.offset().left;
        +			that.offset.top = that.element.offset().top;
        +		}
        +
        +		woset = Math.abs( that.sizeDiff.width +
        +			( that._helper ?
        +				that.offset.left - cop.left :
        +				( that.offset.left - co.left ) ) );
        +
        +		hoset = Math.abs( that.sizeDiff.height +
        +			( that._helper ?
        +				that.offset.top - cop.top :
        +				( that.offset.top - co.top ) ) );
        +
        +		if ( woset + that.size.width >= that.parentData.width ) {
        +			that.size.width = that.parentData.width - woset;
        +			if ( pRatio ) {
        +				that.size.height = that.size.width / that.aspectRatio;
        +				continueResize = false;
        +			}
        +		}
        +
        +		if ( hoset + that.size.height >= that.parentData.height ) {
        +			that.size.height = that.parentData.height - hoset;
        +			if ( pRatio ) {
        +				that.size.width = that.size.height * that.aspectRatio;
        +				continueResize = false;
        +			}
        +		}
        +
        +		if ( !continueResize ) {
        +			that.position.left = that.prevPosition.left;
        +			that.position.top = that.prevPosition.top;
        +			that.size.width = that.prevSize.width;
        +			that.size.height = that.prevSize.height;
        +		}
        +	},
        +
        +	stop: function() {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			co = that.containerOffset,
        +			cop = that.containerPosition,
        +			ce = that.containerElement,
        +			helper = $( that.helper ),
        +			ho = helper.offset(),
        +			w = helper.outerWidth() - that.sizeDiff.width,
        +			h = helper.outerHeight() - that.sizeDiff.height;
        +
        +		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
        +			$( this ).css( {
        +				left: ho.left - cop.left - co.left,
        +				width: w,
        +				height: h
        +			} );
        +		}
        +
        +		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
        +			$( this ).css( {
        +				left: ho.left - cop.left - co.left,
        +				width: w,
        +				height: h
        +			} );
        +		}
        +	}
        +} );
        +
        +$.ui.plugin.add( "resizable", "alsoResize", {
        +
        +	start: function() {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options;
        +
        +		$( o.alsoResize ).each( function() {
        +			var el = $( this );
        +			el.data( "ui-resizable-alsoresize", {
        +				width: parseFloat( el.width() ), height: parseFloat( el.height() ),
        +				left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
        +			} );
        +		} );
        +	},
        +
        +	resize: function( event, ui ) {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			os = that.originalSize,
        +			op = that.originalPosition,
        +			delta = {
        +				height: ( that.size.height - os.height ) || 0,
        +				width: ( that.size.width - os.width ) || 0,
        +				top: ( that.position.top - op.top ) || 0,
        +				left: ( that.position.left - op.left ) || 0
        +			};
        +
        +			$( o.alsoResize ).each( function() {
        +				var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
        +					css = el.parents( ui.originalElement[ 0 ] ).length ?
        +							[ "width", "height" ] :
        +							[ "width", "height", "top", "left" ];
        +
        +				$.each( css, function( i, prop ) {
        +					var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
        +					if ( sum && sum >= 0 ) {
        +						style[ prop ] = sum || null;
        +					}
        +				} );
        +
        +				el.css( style );
        +			} );
        +	},
        +
        +	stop: function() {
        +		$( this ).removeData( "ui-resizable-alsoresize" );
        +	}
        +} );
        +
        +$.ui.plugin.add( "resizable", "ghost", {
        +
        +	start: function() {
        +
        +		var that = $( this ).resizable( "instance" ), cs = that.size;
        +
        +		that.ghost = that.originalElement.clone();
        +		that.ghost.css( {
        +			opacity: 0.25,
        +			display: "block",
        +			position: "relative",
        +			height: cs.height,
        +			width: cs.width,
        +			margin: 0,
        +			left: 0,
        +			top: 0
        +		} );
        +
        +		that._addClass( that.ghost, "ui-resizable-ghost" );
        +
        +		// DEPRECATED
        +		// TODO: remove after 1.12
        +		if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
        +
        +			// Ghost option
        +			that.ghost.addClass( this.options.ghost );
        +		}
        +
        +		that.ghost.appendTo( that.helper );
        +
        +	},
        +
        +	resize: function() {
        +		var that = $( this ).resizable( "instance" );
        +		if ( that.ghost ) {
        +			that.ghost.css( {
        +				position: "relative",
        +				height: that.size.height,
        +				width: that.size.width
        +			} );
        +		}
        +	},
        +
        +	stop: function() {
        +		var that = $( this ).resizable( "instance" );
        +		if ( that.ghost && that.helper ) {
        +			that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
        +		}
        +	}
        +
        +} );
        +
        +$.ui.plugin.add( "resizable", "grid", {
        +
        +	resize: function() {
        +		var outerDimensions,
        +			that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			cs = that.size,
        +			os = that.originalSize,
        +			op = that.originalPosition,
        +			a = that.axis,
        +			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
        +			gridX = ( grid[ 0 ] || 1 ),
        +			gridY = ( grid[ 1 ] || 1 ),
        +			ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
        +			oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
        +			newWidth = os.width + ox,
        +			newHeight = os.height + oy,
        +			isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
        +			isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
        +			isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
        +			isMinHeight = o.minHeight && ( o.minHeight > newHeight );
        +
        +		o.grid = grid;
        +
        +		if ( isMinWidth ) {
        +			newWidth += gridX;
        +		}
        +		if ( isMinHeight ) {
        +			newHeight += gridY;
        +		}
        +		if ( isMaxWidth ) {
        +			newWidth -= gridX;
        +		}
        +		if ( isMaxHeight ) {
        +			newHeight -= gridY;
        +		}
        +
        +		if ( /^(se|s|e)$/.test( a ) ) {
        +			that.size.width = newWidth;
        +			that.size.height = newHeight;
        +		} else if ( /^(ne)$/.test( a ) ) {
        +			that.size.width = newWidth;
        +			that.size.height = newHeight;
        +			that.position.top = op.top - oy;
        +		} else if ( /^(sw)$/.test( a ) ) {
        +			that.size.width = newWidth;
        +			that.size.height = newHeight;
        +			that.position.left = op.left - ox;
        +		} else {
        +			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
        +				outerDimensions = that._getPaddingPlusBorderDimensions( this );
        +			}
        +
        +			if ( newHeight - gridY > 0 ) {
        +				that.size.height = newHeight;
        +				that.position.top = op.top - oy;
        +			} else {
        +				newHeight = gridY - outerDimensions.height;
        +				that.size.height = newHeight;
        +				that.position.top = op.top + os.height - newHeight;
        +			}
        +			if ( newWidth - gridX > 0 ) {
        +				that.size.width = newWidth;
        +				that.position.left = op.left - ox;
        +			} else {
        +				newWidth = gridX - outerDimensions.width;
        +				that.size.width = newWidth;
        +				that.position.left = op.left + os.width - newWidth;
        +			}
        +		}
        +	}
        +
        +} );
        +
        +var widgetsResizable = $.ui.resizable;
        +
        +
        +/*!
        + * jQuery UI Dialog 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Dialog
        +//>>group: Widgets
        +//>>description: Displays customizable dialog windows.
        +//>>docs: http://api.jqueryui.com/dialog/
        +//>>demos: http://jqueryui.com/dialog/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/dialog.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.widget( "ui.dialog", {
        +	version: "1.12.1",
        +	options: {
        +		appendTo: "body",
        +		autoOpen: true,
        +		buttons: [],
        +		classes: {
        +			"ui-dialog": "ui-corner-all",
        +			"ui-dialog-titlebar": "ui-corner-all"
        +		},
        +		closeOnEscape: true,
        +		closeText: "Close",
        +		draggable: true,
        +		hide: null,
        +		height: "auto",
        +		maxHeight: null,
        +		maxWidth: null,
        +		minHeight: 150,
        +		minWidth: 150,
        +		modal: false,
        +		position: {
        +			my: "center",
        +			at: "center",
        +			of: window,
        +			collision: "fit",
        +
        +			// Ensure the titlebar is always visible
        +			using: function( pos ) {
        +				var topOffset = $( this ).css( pos ).offset().top;
        +				if ( topOffset < 0 ) {
        +					$( this ).css( "top", pos.top - topOffset );
        +				}
        +			}
        +		},
        +		resizable: true,
        +		show: null,
        +		title: null,
        +		width: 300,
        +
        +		// Callbacks
        +		beforeClose: null,
        +		close: null,
        +		drag: null,
        +		dragStart: null,
        +		dragStop: null,
        +		focus: null,
        +		open: null,
        +		resize: null,
        +		resizeStart: null,
        +		resizeStop: null
        +	},
        +
        +	sizeRelatedOptions: {
        +		buttons: true,
        +		height: true,
        +		maxHeight: true,
        +		maxWidth: true,
        +		minHeight: true,
        +		minWidth: true,
        +		width: true
        +	},
        +
        +	resizableRelatedOptions: {
        +		maxHeight: true,
        +		maxWidth: true,
        +		minHeight: true,
        +		minWidth: true
        +	},
        +
        +	_create: function() {
        +		this.originalCss = {
        +			display: this.element[ 0 ].style.display,
        +			width: this.element[ 0 ].style.width,
        +			minHeight: this.element[ 0 ].style.minHeight,
        +			maxHeight: this.element[ 0 ].style.maxHeight,
        +			height: this.element[ 0 ].style.height
        +		};
        +		this.originalPosition = {
        +			parent: this.element.parent(),
        +			index: this.element.parent().children().index( this.element )
        +		};
        +		this.originalTitle = this.element.attr( "title" );
        +		if ( this.options.title == null && this.originalTitle != null ) {
        +			this.options.title = this.originalTitle;
        +		}
        +
        +		// Dialogs can't be disabled
        +		if ( this.options.disabled ) {
        +			this.options.disabled = false;
        +		}
        +
        +		this._createWrapper();
        +
        +		this.element
        +			.show()
        +			.removeAttr( "title" )
        +			.appendTo( this.uiDialog );
        +
        +		this._addClass( "ui-dialog-content", "ui-widget-content" );
        +
        +		this._createTitlebar();
        +		this._createButtonPane();
        +
        +		if ( this.options.draggable && $.fn.draggable ) {
        +			this._makeDraggable();
        +		}
        +		if ( this.options.resizable && $.fn.resizable ) {
        +			this._makeResizable();
        +		}
        +
        +		this._isOpen = false;
        +
        +		this._trackFocus();
        +	},
        +
        +	_init: function() {
        +		if ( this.options.autoOpen ) {
        +			this.open();
        +		}
        +	},
        +
        +	_appendTo: function() {
        +		var element = this.options.appendTo;
        +		if ( element && ( element.jquery || element.nodeType ) ) {
        +			return $( element );
        +		}
        +		return this.document.find( element || "body" ).eq( 0 );
        +	},
        +
        +	_destroy: function() {
        +		var next,
        +			originalPosition = this.originalPosition;
        +
        +		this._untrackInstance();
        +		this._destroyOverlay();
        +
        +		this.element
        +			.removeUniqueId()
        +			.css( this.originalCss )
        +
        +			// Without detaching first, the following becomes really slow
        +			.detach();
        +
        +		this.uiDialog.remove();
        +
        +		if ( this.originalTitle ) {
        +			this.element.attr( "title", this.originalTitle );
        +		}
        +
        +		next = originalPosition.parent.children().eq( originalPosition.index );
        +
        +		// Don't try to place the dialog next to itself (#8613)
        +		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
        +			next.before( this.element );
        +		} else {
        +			originalPosition.parent.append( this.element );
        +		}
        +	},
        +
        +	widget: function() {
        +		return this.uiDialog;
        +	},
        +
        +	disable: $.noop,
        +	enable: $.noop,
        +
        +	close: function( event ) {
        +		var that = this;
        +
        +		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
        +			return;
        +		}
        +
        +		this._isOpen = false;
        +		this._focusedElement = null;
        +		this._destroyOverlay();
        +		this._untrackInstance();
        +
        +		if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
        +
        +			// Hiding a focused element doesn't trigger blur in WebKit
        +			// so in case we have nothing to focus on, explicitly blur the active element
        +			// https://bugs.webkit.org/show_bug.cgi?id=47182
        +			$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
        +		}
        +
        +		this._hide( this.uiDialog, this.options.hide, function() {
        +			that._trigger( "close", event );
        +		} );
        +	},
        +
        +	isOpen: function() {
        +		return this._isOpen;
        +	},
        +
        +	moveToTop: function() {
        +		this._moveToTop();
        +	},
        +
        +	_moveToTop: function( event, silent ) {
        +		var moved = false,
        +			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
        +				return +$( this ).css( "z-index" );
        +			} ).get(),
        +			zIndexMax = Math.max.apply( null, zIndices );
        +
        +		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
        +			this.uiDialog.css( "z-index", zIndexMax + 1 );
        +			moved = true;
        +		}
        +
        +		if ( moved && !silent ) {
        +			this._trigger( "focus", event );
        +		}
        +		return moved;
        +	},
        +
        +	open: function() {
        +		var that = this;
        +		if ( this._isOpen ) {
        +			if ( this._moveToTop() ) {
        +				this._focusTabbable();
        +			}
        +			return;
        +		}
        +
        +		this._isOpen = true;
        +		this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
        +
        +		this._size();
        +		this._position();
        +		this._createOverlay();
        +		this._moveToTop( null, true );
        +
        +		// Ensure the overlay is moved to the top with the dialog, but only when
        +		// opening. The overlay shouldn't move after the dialog is open so that
        +		// modeless dialogs opened after the modal dialog stack properly.
        +		if ( this.overlay ) {
        +			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
        +		}
        +
        +		this._show( this.uiDialog, this.options.show, function() {
        +			that._focusTabbable();
        +			that._trigger( "focus" );
        +		} );
        +
        +		// Track the dialog immediately upon openening in case a focus event
        +		// somehow occurs outside of the dialog before an element inside the
        +		// dialog is focused (#10152)
        +		this._makeFocusTarget();
        +
        +		this._trigger( "open" );
        +	},
        +
        +	_focusTabbable: function() {
        +
        +		// Set focus to the first match:
        +		// 1. An element that was focused previously
        +		// 2. First element inside the dialog matching [autofocus]
        +		// 3. Tabbable element inside the content element
        +		// 4. Tabbable element inside the buttonpane
        +		// 5. The close button
        +		// 6. The dialog itself
        +		var hasFocus = this._focusedElement;
        +		if ( !hasFocus ) {
        +			hasFocus = this.element.find( "[autofocus]" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.element.find( ":tabbable" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.uiDialog;
        +		}
        +		hasFocus.eq( 0 ).trigger( "focus" );
        +	},
        +
        +	_keepFocus: function( event ) {
        +		function checkFocus() {
        +			var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
        +				isActive = this.uiDialog[ 0 ] === activeElement ||
        +					$.contains( this.uiDialog[ 0 ], activeElement );
        +			if ( !isActive ) {
        +				this._focusTabbable();
        +			}
        +		}
        +		event.preventDefault();
        +		checkFocus.call( this );
        +
        +		// support: IE
        +		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
        +		// so we check again later
        +		this._delay( checkFocus );
        +	},
        +
        +	_createWrapper: function() {
        +		this.uiDialog = $( "<div>" )
        +			.hide()
        +			.attr( {
        +
        +				// Setting tabIndex makes the div focusable
        +				tabIndex: -1,
        +				role: "dialog"
        +			} )
        +			.appendTo( this._appendTo() );
        +
        +		this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
        +		this._on( this.uiDialog, {
        +			keydown: function( event ) {
        +				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
        +						event.keyCode === $.ui.keyCode.ESCAPE ) {
        +					event.preventDefault();
        +					this.close( event );
        +					return;
        +				}
        +
        +				// Prevent tabbing out of dialogs
        +				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
        +					return;
        +				}
        +				var tabbables = this.uiDialog.find( ":tabbable" ),
        +					first = tabbables.filter( ":first" ),
        +					last = tabbables.filter( ":last" );
        +
        +				if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
        +						!event.shiftKey ) {
        +					this._delay( function() {
        +						first.trigger( "focus" );
        +					} );
        +					event.preventDefault();
        +				} else if ( ( event.target === first[ 0 ] ||
        +						event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
        +					this._delay( function() {
        +						last.trigger( "focus" );
        +					} );
        +					event.preventDefault();
        +				}
        +			},
        +			mousedown: function( event ) {
        +				if ( this._moveToTop( event ) ) {
        +					this._focusTabbable();
        +				}
        +			}
        +		} );
        +
        +		// We assume that any existing aria-describedby attribute means
        +		// that the dialog content is marked up properly
        +		// otherwise we brute force the content as the description
        +		if ( !this.element.find( "[aria-describedby]" ).length ) {
        +			this.uiDialog.attr( {
        +				"aria-describedby": this.element.uniqueId().attr( "id" )
        +			} );
        +		}
        +	},
        +
        +	_createTitlebar: function() {
        +		var uiDialogTitle;
        +
        +		this.uiDialogTitlebar = $( "<div>" );
        +		this._addClass( this.uiDialogTitlebar,
        +			"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
        +		this._on( this.uiDialogTitlebar, {
        +			mousedown: function( event ) {
        +
        +				// Don't prevent click on close button (#8838)
        +				// Focusing a dialog that is partially scrolled out of view
        +				// causes the browser to scroll it into view, preventing the click event
        +				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
        +
        +					// Dialog isn't getting focus when dragging (#8063)
        +					this.uiDialog.trigger( "focus" );
        +				}
        +			}
        +		} );
        +
        +		// Support: IE
        +		// Use type="button" to prevent enter keypresses in textboxes from closing the
        +		// dialog in IE (#9312)
        +		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
        +			.button( {
        +				label: $( "<a>" ).text( this.options.closeText ).html(),
        +				icon: "ui-icon-closethick",
        +				showLabel: false
        +			} )
        +			.appendTo( this.uiDialogTitlebar );
        +
        +		this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
        +		this._on( this.uiDialogTitlebarClose, {
        +			click: function( event ) {
        +				event.preventDefault();
        +				this.close( event );
        +			}
        +		} );
        +
        +		uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
        +		this._addClass( uiDialogTitle, "ui-dialog-title" );
        +		this._title( uiDialogTitle );
        +
        +		this.uiDialogTitlebar.prependTo( this.uiDialog );
        +
        +		this.uiDialog.attr( {
        +			"aria-labelledby": uiDialogTitle.attr( "id" )
        +		} );
        +	},
        +
        +	_title: function( title ) {
        +		if ( this.options.title ) {
        +			title.text( this.options.title );
        +		} else {
        +			title.html( "&#160;" );
        +		}
        +	},
        +
        +	_createButtonPane: function() {
        +		this.uiDialogButtonPane = $( "<div>" );
        +		this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
        +			"ui-widget-content ui-helper-clearfix" );
        +
        +		this.uiButtonSet = $( "<div>" )
        +			.appendTo( this.uiDialogButtonPane );
        +		this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
        +
        +		this._createButtons();
        +	},
        +
        +	_createButtons: function() {
        +		var that = this,
        +			buttons = this.options.buttons;
        +
        +		// If we already have a button pane, remove it
        +		this.uiDialogButtonPane.remove();
        +		this.uiButtonSet.empty();
        +
        +		if ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {
        +			this._removeClass( this.uiDialog, "ui-dialog-buttons" );
        +			return;
        +		}
        +
        +		$.each( buttons, function( name, props ) {
        +			var click, buttonOptions;
        +			props = $.isFunction( props ) ?
        +				{ click: props, text: name } :
        +				props;
        +
        +			// Default to a non-submitting button
        +			props = $.extend( { type: "button" }, props );
        +
        +			// Change the context for the click callback to be the main element
        +			click = props.click;
        +			buttonOptions = {
        +				icon: props.icon,
        +				iconPosition: props.iconPosition,
        +				showLabel: props.showLabel,
        +
        +				// Deprecated options
        +				icons: props.icons,
        +				text: props.text
        +			};
        +
        +			delete props.click;
        +			delete props.icon;
        +			delete props.iconPosition;
        +			delete props.showLabel;
        +
        +			// Deprecated options
        +			delete props.icons;
        +			if ( typeof props.text === "boolean" ) {
        +				delete props.text;
        +			}
        +
        +			$( "<button></button>", props )
        +				.button( buttonOptions )
        +				.appendTo( that.uiButtonSet )
        +				.on( "click", function() {
        +					click.apply( that.element[ 0 ], arguments );
        +				} );
        +		} );
        +		this._addClass( this.uiDialog, "ui-dialog-buttons" );
        +		this.uiDialogButtonPane.appendTo( this.uiDialog );
        +	},
        +
        +	_makeDraggable: function() {
        +		var that = this,
        +			options = this.options;
        +
        +		function filteredUi( ui ) {
        +			return {
        +				position: ui.position,
        +				offset: ui.offset
        +			};
        +		}
        +
        +		this.uiDialog.draggable( {
        +			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
        +			handle: ".ui-dialog-titlebar",
        +			containment: "document",
        +			start: function( event, ui ) {
        +				that._addClass( $( this ), "ui-dialog-dragging" );
        +				that._blockFrames();
        +				that._trigger( "dragStart", event, filteredUi( ui ) );
        +			},
        +			drag: function( event, ui ) {
        +				that._trigger( "drag", event, filteredUi( ui ) );
        +			},
        +			stop: function( event, ui ) {
        +				var left = ui.offset.left - that.document.scrollLeft(),
        +					top = ui.offset.top - that.document.scrollTop();
        +
        +				options.position = {
        +					my: "left top",
        +					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
        +						"top" + ( top >= 0 ? "+" : "" ) + top,
        +					of: that.window
        +				};
        +				that._removeClass( $( this ), "ui-dialog-dragging" );
        +				that._unblockFrames();
        +				that._trigger( "dragStop", event, filteredUi( ui ) );
        +			}
        +		} );
        +	},
        +
        +	_makeResizable: function() {
        +		var that = this,
        +			options = this.options,
        +			handles = options.resizable,
        +
        +			// .ui-resizable has position: relative defined in the stylesheet
        +			// but dialogs have to use absolute or fixed positioning
        +			position = this.uiDialog.css( "position" ),
        +			resizeHandles = typeof handles === "string" ?
        +				handles :
        +				"n,e,s,w,se,sw,ne,nw";
        +
        +		function filteredUi( ui ) {
        +			return {
        +				originalPosition: ui.originalPosition,
        +				originalSize: ui.originalSize,
        +				position: ui.position,
        +				size: ui.size
        +			};
        +		}
        +
        +		this.uiDialog.resizable( {
        +			cancel: ".ui-dialog-content",
        +			containment: "document",
        +			alsoResize: this.element,
        +			maxWidth: options.maxWidth,
        +			maxHeight: options.maxHeight,
        +			minWidth: options.minWidth,
        +			minHeight: this._minHeight(),
        +			handles: resizeHandles,
        +			start: function( event, ui ) {
        +				that._addClass( $( this ), "ui-dialog-resizing" );
        +				that._blockFrames();
        +				that._trigger( "resizeStart", event, filteredUi( ui ) );
        +			},
        +			resize: function( event, ui ) {
        +				that._trigger( "resize", event, filteredUi( ui ) );
        +			},
        +			stop: function( event, ui ) {
        +				var offset = that.uiDialog.offset(),
        +					left = offset.left - that.document.scrollLeft(),
        +					top = offset.top - that.document.scrollTop();
        +
        +				options.height = that.uiDialog.height();
        +				options.width = that.uiDialog.width();
        +				options.position = {
        +					my: "left top",
        +					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
        +						"top" + ( top >= 0 ? "+" : "" ) + top,
        +					of: that.window
        +				};
        +				that._removeClass( $( this ), "ui-dialog-resizing" );
        +				that._unblockFrames();
        +				that._trigger( "resizeStop", event, filteredUi( ui ) );
        +			}
        +		} )
        +			.css( "position", position );
        +	},
        +
        +	_trackFocus: function() {
        +		this._on( this.widget(), {
        +			focusin: function( event ) {
        +				this._makeFocusTarget();
        +				this._focusedElement = $( event.target );
        +			}
        +		} );
        +	},
        +
        +	_makeFocusTarget: function() {
        +		this._untrackInstance();
        +		this._trackingInstances().unshift( this );
        +	},
        +
        +	_untrackInstance: function() {
        +		var instances = this._trackingInstances(),
        +			exists = $.inArray( this, instances );
        +		if ( exists !== -1 ) {
        +			instances.splice( exists, 1 );
        +		}
        +	},
        +
        +	_trackingInstances: function() {
        +		var instances = this.document.data( "ui-dialog-instances" );
        +		if ( !instances ) {
        +			instances = [];
        +			this.document.data( "ui-dialog-instances", instances );
        +		}
        +		return instances;
        +	},
        +
        +	_minHeight: function() {
        +		var options = this.options;
        +
        +		return options.height === "auto" ?
        +			options.minHeight :
        +			Math.min( options.minHeight, options.height );
        +	},
        +
        +	_position: function() {
        +
        +		// Need to show the dialog to get the actual offset in the position plugin
        +		var isVisible = this.uiDialog.is( ":visible" );
        +		if ( !isVisible ) {
        +			this.uiDialog.show();
        +		}
        +		this.uiDialog.position( this.options.position );
        +		if ( !isVisible ) {
        +			this.uiDialog.hide();
        +		}
        +	},
        +
        +	_setOptions: function( options ) {
        +		var that = this,
        +			resize = false,
        +			resizableOptions = {};
        +
        +		$.each( options, function( key, value ) {
        +			that._setOption( key, value );
        +
        +			if ( key in that.sizeRelatedOptions ) {
        +				resize = true;
        +			}
        +			if ( key in that.resizableRelatedOptions ) {
        +				resizableOptions[ key ] = value;
        +			}
        +		} );
        +
        +		if ( resize ) {
        +			this._size();
        +			this._position();
        +		}
        +		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        +			this.uiDialog.resizable( "option", resizableOptions );
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var isDraggable, isResizable,
        +			uiDialog = this.uiDialog;
        +
        +		if ( key === "disabled" ) {
        +			return;
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "appendTo" ) {
        +			this.uiDialog.appendTo( this._appendTo() );
        +		}
        +
        +		if ( key === "buttons" ) {
        +			this._createButtons();
        +		}
        +
        +		if ( key === "closeText" ) {
        +			this.uiDialogTitlebarClose.button( {
        +
        +				// Ensure that we always pass a string
        +				label: $( "<a>" ).text( "" + this.options.closeText ).html()
        +			} );
        +		}
        +
        +		if ( key === "draggable" ) {
        +			isDraggable = uiDialog.is( ":data(ui-draggable)" );
        +			if ( isDraggable && !value ) {
        +				uiDialog.draggable( "destroy" );
        +			}
        +
        +			if ( !isDraggable && value ) {
        +				this._makeDraggable();
        +			}
        +		}
        +
        +		if ( key === "position" ) {
        +			this._position();
        +		}
        +
        +		if ( key === "resizable" ) {
        +
        +			// currently resizable, becoming non-resizable
        +			isResizable = uiDialog.is( ":data(ui-resizable)" );
        +			if ( isResizable && !value ) {
        +				uiDialog.resizable( "destroy" );
        +			}
        +
        +			// Currently resizable, changing handles
        +			if ( isResizable && typeof value === "string" ) {
        +				uiDialog.resizable( "option", "handles", value );
        +			}
        +
        +			// Currently non-resizable, becoming resizable
        +			if ( !isResizable && value !== false ) {
        +				this._makeResizable();
        +			}
        +		}
        +
        +		if ( key === "title" ) {
        +			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
        +		}
        +	},
        +
        +	_size: function() {
        +
        +		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
        +		// divs will both have width and height set, so we need to reset them
        +		var nonContentHeight, minContentHeight, maxContentHeight,
        +			options = this.options;
        +
        +		// Reset content sizing
        +		this.element.show().css( {
        +			width: "auto",
        +			minHeight: 0,
        +			maxHeight: "none",
        +			height: 0
        +		} );
        +
        +		if ( options.minWidth > options.width ) {
        +			options.width = options.minWidth;
        +		}
        +
        +		// Reset wrapper sizing
        +		// determine the height of all the non-content elements
        +		nonContentHeight = this.uiDialog.css( {
        +			height: "auto",
        +			width: options.width
        +		} )
        +			.outerHeight();
        +		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
        +		maxContentHeight = typeof options.maxHeight === "number" ?
        +			Math.max( 0, options.maxHeight - nonContentHeight ) :
        +			"none";
        +
        +		if ( options.height === "auto" ) {
        +			this.element.css( {
        +				minHeight: minContentHeight,
        +				maxHeight: maxContentHeight,
        +				height: "auto"
        +			} );
        +		} else {
        +			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
        +		}
        +
        +		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        +			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
        +		}
        +	},
        +
        +	_blockFrames: function() {
        +		this.iframeBlocks = this.document.find( "iframe" ).map( function() {
        +			var iframe = $( this );
        +
        +			return $( "<div>" )
        +				.css( {
        +					position: "absolute",
        +					width: iframe.outerWidth(),
        +					height: iframe.outerHeight()
        +				} )
        +				.appendTo( iframe.parent() )
        +				.offset( iframe.offset() )[ 0 ];
        +		} );
        +	},
        +
        +	_unblockFrames: function() {
        +		if ( this.iframeBlocks ) {
        +			this.iframeBlocks.remove();
        +			delete this.iframeBlocks;
        +		}
        +	},
        +
        +	_allowInteraction: function( event ) {
        +		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
        +			return true;
        +		}
        +
        +		// TODO: Remove hack when datepicker implements
        +		// the .ui-front logic (#8989)
        +		return !!$( event.target ).closest( ".ui-datepicker" ).length;
        +	},
        +
        +	_createOverlay: function() {
        +		if ( !this.options.modal ) {
        +			return;
        +		}
        +
        +		// We use a delay in case the overlay is created from an
        +		// event that we're going to be cancelling (#2804)
        +		var isOpening = true;
        +		this._delay( function() {
        +			isOpening = false;
        +		} );
        +
        +		if ( !this.document.data( "ui-dialog-overlays" ) ) {
        +
        +			// Prevent use of anchors and inputs
        +			// Using _on() for an event handler shared across many instances is
        +			// safe because the dialogs stack and must be closed in reverse order
        +			this._on( this.document, {
        +				focusin: function( event ) {
        +					if ( isOpening ) {
        +						return;
        +					}
        +
        +					if ( !this._allowInteraction( event ) ) {
        +						event.preventDefault();
        +						this._trackingInstances()[ 0 ]._focusTabbable();
        +					}
        +				}
        +			} );
        +		}
        +
        +		this.overlay = $( "<div>" )
        +			.appendTo( this._appendTo() );
        +
        +		this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
        +		this._on( this.overlay, {
        +			mousedown: "_keepFocus"
        +		} );
        +		this.document.data( "ui-dialog-overlays",
        +			( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
        +	},
        +
        +	_destroyOverlay: function() {
        +		if ( !this.options.modal ) {
        +			return;
        +		}
        +
        +		if ( this.overlay ) {
        +			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
        +
        +			if ( !overlays ) {
        +				this._off( this.document, "focusin" );
        +				this.document.removeData( "ui-dialog-overlays" );
        +			} else {
        +				this.document.data( "ui-dialog-overlays", overlays );
        +			}
        +
        +			this.overlay.remove();
        +			this.overlay = null;
        +		}
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for dialogClass option
        +	$.widget( "ui.dialog", $.ui.dialog, {
        +		options: {
        +			dialogClass: ""
        +		},
        +		_createWrapper: function() {
        +			this._super();
        +			this.uiDialog.addClass( this.options.dialogClass );
        +		},
        +		_setOption: function( key, value ) {
        +			if ( key === "dialogClass" ) {
        +				this.uiDialog
        +					.removeClass( this.options.dialogClass )
        +					.addClass( value );
        +			}
        +			this._superApply( arguments );
        +		}
        +	} );
        +}
        +
        +var widgetsDialog = $.ui.dialog;
        +
        +
        +/*!
        + * jQuery UI Droppable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Droppable
        +//>>group: Interactions
        +//>>description: Enables drop targets for draggable elements.
        +//>>docs: http://api.jqueryui.com/droppable/
        +//>>demos: http://jqueryui.com/droppable/
        +
        +
        +
        +$.widget( "ui.droppable", {
        +	version: "1.12.1",
        +	widgetEventPrefix: "drop",
        +	options: {
        +		accept: "*",
        +		addClasses: true,
        +		greedy: false,
        +		scope: "default",
        +		tolerance: "intersect",
        +
        +		// Callbacks
        +		activate: null,
        +		deactivate: null,
        +		drop: null,
        +		out: null,
        +		over: null
        +	},
        +	_create: function() {
        +
        +		var proportions,
        +			o = this.options,
        +			accept = o.accept;
        +
        +		this.isover = false;
        +		this.isout = true;
        +
        +		this.accept = $.isFunction( accept ) ? accept : function( d ) {
        +			return d.is( accept );
        +		};
        +
        +		this.proportions = function( /* valueToWrite */ ) {
        +			if ( arguments.length ) {
        +
        +				// Store the droppable's proportions
        +				proportions = arguments[ 0 ];
        +			} else {
        +
        +				// Retrieve or derive the droppable's proportions
        +				return proportions ?
        +					proportions :
        +					proportions = {
        +						width: this.element[ 0 ].offsetWidth,
        +						height: this.element[ 0 ].offsetHeight
        +					};
        +			}
        +		};
        +
        +		this._addToManager( o.scope );
        +
        +		o.addClasses && this._addClass( "ui-droppable" );
        +
        +	},
        +
        +	_addToManager: function( scope ) {
        +
        +		// Add the reference and positions to the manager
        +		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
        +		$.ui.ddmanager.droppables[ scope ].push( this );
        +	},
        +
        +	_splice: function( drop ) {
        +		var i = 0;
        +		for ( ; i < drop.length; i++ ) {
        +			if ( drop[ i ] === this ) {
        +				drop.splice( i, 1 );
        +			}
        +		}
        +	},
        +
        +	_destroy: function() {
        +		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        +
        +		this._splice( drop );
        +	},
        +
        +	_setOption: function( key, value ) {
        +
        +		if ( key === "accept" ) {
        +			this.accept = $.isFunction( value ) ? value : function( d ) {
        +				return d.is( value );
        +			};
        +		} else if ( key === "scope" ) {
        +			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        +
        +			this._splice( drop );
        +			this._addToManager( value );
        +		}
        +
        +		this._super( key, value );
        +	},
        +
        +	_activate: function( event ) {
        +		var draggable = $.ui.ddmanager.current;
        +
        +		this._addActiveClass();
        +		if ( draggable ) {
        +			this._trigger( "activate", event, this.ui( draggable ) );
        +		}
        +	},
        +
        +	_deactivate: function( event ) {
        +		var draggable = $.ui.ddmanager.current;
        +
        +		this._removeActiveClass();
        +		if ( draggable ) {
        +			this._trigger( "deactivate", event, this.ui( draggable ) );
        +		}
        +	},
        +
        +	_over: function( event ) {
        +
        +		var draggable = $.ui.ddmanager.current;
        +
        +		// Bail if draggable and droppable are same element
        +		if ( !draggable || ( draggable.currentItem ||
        +				draggable.element )[ 0 ] === this.element[ 0 ] ) {
        +			return;
        +		}
        +
        +		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
        +				draggable.element ) ) ) {
        +			this._addHoverClass();
        +			this._trigger( "over", event, this.ui( draggable ) );
        +		}
        +
        +	},
        +
        +	_out: function( event ) {
        +
        +		var draggable = $.ui.ddmanager.current;
        +
        +		// Bail if draggable and droppable are same element
        +		if ( !draggable || ( draggable.currentItem ||
        +				draggable.element )[ 0 ] === this.element[ 0 ] ) {
        +			return;
        +		}
        +
        +		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
        +				draggable.element ) ) ) {
        +			this._removeHoverClass();
        +			this._trigger( "out", event, this.ui( draggable ) );
        +		}
        +
        +	},
        +
        +	_drop: function( event, custom ) {
        +
        +		var draggable = custom || $.ui.ddmanager.current,
        +			childrenIntersection = false;
        +
        +		// Bail if draggable and droppable are same element
        +		if ( !draggable || ( draggable.currentItem ||
        +				draggable.element )[ 0 ] === this.element[ 0 ] ) {
        +			return false;
        +		}
        +
        +		this.element
        +			.find( ":data(ui-droppable)" )
        +			.not( ".ui-draggable-dragging" )
        +			.each( function() {
        +				var inst = $( this ).droppable( "instance" );
        +				if (
        +					inst.options.greedy &&
        +					!inst.options.disabled &&
        +					inst.options.scope === draggable.options.scope &&
        +					inst.accept.call(
        +						inst.element[ 0 ], ( draggable.currentItem || draggable.element )
        +					) &&
        +					intersect(
        +						draggable,
        +						$.extend( inst, { offset: inst.element.offset() } ),
        +						inst.options.tolerance, event
        +					)
        +				) {
        +					childrenIntersection = true;
        +					return false; }
        +			} );
        +		if ( childrenIntersection ) {
        +			return false;
        +		}
        +
        +		if ( this.accept.call( this.element[ 0 ],
        +				( draggable.currentItem || draggable.element ) ) ) {
        +			this._removeActiveClass();
        +			this._removeHoverClass();
        +
        +			this._trigger( "drop", event, this.ui( draggable ) );
        +			return this.element;
        +		}
        +
        +		return false;
        +
        +	},
        +
        +	ui: function( c ) {
        +		return {
        +			draggable: ( c.currentItem || c.element ),
        +			helper: c.helper,
        +			position: c.position,
        +			offset: c.positionAbs
        +		};
        +	},
        +
        +	// Extension points just to make backcompat sane and avoid duplicating logic
        +	// TODO: Remove in 1.13 along with call to it below
        +	_addHoverClass: function() {
        +		this._addClass( "ui-droppable-hover" );
        +	},
        +
        +	_removeHoverClass: function() {
        +		this._removeClass( "ui-droppable-hover" );
        +	},
        +
        +	_addActiveClass: function() {
        +		this._addClass( "ui-droppable-active" );
        +	},
        +
        +	_removeActiveClass: function() {
        +		this._removeClass( "ui-droppable-active" );
        +	}
        +} );
        +
        +var intersect = $.ui.intersect = ( function() {
        +	function isOverAxis( x, reference, size ) {
        +		return ( x >= reference ) && ( x < ( reference + size ) );
        +	}
        +
        +	return function( draggable, droppable, toleranceMode, event ) {
        +
        +		if ( !droppable.offset ) {
        +			return false;
        +		}
        +
        +		var x1 = ( draggable.positionAbs ||
        +				draggable.position.absolute ).left + draggable.margins.left,
        +			y1 = ( draggable.positionAbs ||
        +				draggable.position.absolute ).top + draggable.margins.top,
        +			x2 = x1 + draggable.helperProportions.width,
        +			y2 = y1 + draggable.helperProportions.height,
        +			l = droppable.offset.left,
        +			t = droppable.offset.top,
        +			r = l + droppable.proportions().width,
        +			b = t + droppable.proportions().height;
        +
        +		switch ( toleranceMode ) {
        +		case "fit":
        +			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
        +		case "intersect":
        +			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
        +				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
        +				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
        +				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
        +		case "pointer":
        +			return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
        +				isOverAxis( event.pageX, l, droppable.proportions().width );
        +		case "touch":
        +			return (
        +				( y1 >= t && y1 <= b ) || // Top edge touching
        +				( y2 >= t && y2 <= b ) || // Bottom edge touching
        +				( y1 < t && y2 > b ) // Surrounded vertically
        +			) && (
        +				( x1 >= l && x1 <= r ) || // Left edge touching
        +				( x2 >= l && x2 <= r ) || // Right edge touching
        +				( x1 < l && x2 > r ) // Surrounded horizontally
        +			);
        +		default:
        +			return false;
        +		}
        +	};
        +} )();
        +
        +/*
        +	This manager tracks offsets of draggables and droppables
        +*/
        +$.ui.ddmanager = {
        +	current: null,
        +	droppables: { "default": [] },
        +	prepareOffsets: function( t, event ) {
        +
        +		var i, j,
        +			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
        +			type = event ? event.type : null, // workaround for #2317
        +			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
        +
        +		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
        +
        +			// No disabled and non-accepted
        +			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
        +					( t.currentItem || t.element ) ) ) ) {
        +				continue;
        +			}
        +
        +			// Filter out elements in the current dragged item
        +			for ( j = 0; j < list.length; j++ ) {
        +				if ( list[ j ] === m[ i ].element[ 0 ] ) {
        +					m[ i ].proportions().height = 0;
        +					continue droppablesLoop;
        +				}
        +			}
        +
        +			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
        +			if ( !m[ i ].visible ) {
        +				continue;
        +			}
        +
        +			// Activate the droppable if used directly from draggables
        +			if ( type === "mousedown" ) {
        +				m[ i ]._activate.call( m[ i ], event );
        +			}
        +
        +			m[ i ].offset = m[ i ].element.offset();
        +			m[ i ].proportions( {
        +				width: m[ i ].element[ 0 ].offsetWidth,
        +				height: m[ i ].element[ 0 ].offsetHeight
        +			} );
        +
        +		}
        +
        +	},
        +	drop: function( draggable, event ) {
        +
        +		var dropped = false;
        +
        +		// Create a copy of the droppables in case the list changes during the drop (#9116)
        +		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
        +
        +			if ( !this.options ) {
        +				return;
        +			}
        +			if ( !this.options.disabled && this.visible &&
        +					intersect( draggable, this, this.options.tolerance, event ) ) {
        +				dropped = this._drop.call( this, event ) || dropped;
        +			}
        +
        +			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
        +					( draggable.currentItem || draggable.element ) ) ) {
        +				this.isout = true;
        +				this.isover = false;
        +				this._deactivate.call( this, event );
        +			}
        +
        +		} );
        +		return dropped;
        +
        +	},
        +	dragStart: function( draggable, event ) {
        +
        +		// Listen for scrolling so that if the dragging causes scrolling the position of the
        +		// droppables can be recalculated (see #5003)
        +		draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
        +			if ( !draggable.options.refreshPositions ) {
        +				$.ui.ddmanager.prepareOffsets( draggable, event );
        +			}
        +		} );
        +	},
        +	drag: function( draggable, event ) {
        +
        +		// If you have a highly dynamic page, you might try this option. It renders positions
        +		// every time you move the mouse.
        +		if ( draggable.options.refreshPositions ) {
        +			$.ui.ddmanager.prepareOffsets( draggable, event );
        +		}
        +
        +		// Run through all droppables and check their positions based on specific tolerance options
        +		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
        +
        +			if ( this.options.disabled || this.greedyChild || !this.visible ) {
        +				return;
        +			}
        +
        +			var parentInstance, scope, parent,
        +				intersects = intersect( draggable, this, this.options.tolerance, event ),
        +				c = !intersects && this.isover ?
        +					"isout" :
        +					( intersects && !this.isover ? "isover" : null );
        +			if ( !c ) {
        +				return;
        +			}
        +
        +			if ( this.options.greedy ) {
        +
        +				// find droppable parents with same scope
        +				scope = this.options.scope;
        +				parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
        +					return $( this ).droppable( "instance" ).options.scope === scope;
        +				} );
        +
        +				if ( parent.length ) {
        +					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
        +					parentInstance.greedyChild = ( c === "isover" );
        +				}
        +			}
        +
        +			// We just moved into a greedy child
        +			if ( parentInstance && c === "isover" ) {
        +				parentInstance.isover = false;
        +				parentInstance.isout = true;
        +				parentInstance._out.call( parentInstance, event );
        +			}
        +
        +			this[ c ] = true;
        +			this[ c === "isout" ? "isover" : "isout" ] = false;
        +			this[ c === "isover" ? "_over" : "_out" ].call( this, event );
        +
        +			// We just moved out of a greedy child
        +			if ( parentInstance && c === "isout" ) {
        +				parentInstance.isout = false;
        +				parentInstance.isover = true;
        +				parentInstance._over.call( parentInstance, event );
        +			}
        +		} );
        +
        +	},
        +	dragStop: function( draggable, event ) {
        +		draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
        +
        +		// Call prepareOffsets one final time since IE does not fire return scroll events when
        +		// overflow was caused by drag (see #5003)
        +		if ( !draggable.options.refreshPositions ) {
        +			$.ui.ddmanager.prepareOffsets( draggable, event );
        +		}
        +	}
        +};
        +
        +// DEPRECATED
        +// TODO: switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for activeClass and hoverClass options
        +	$.widget( "ui.droppable", $.ui.droppable, {
        +		options: {
        +			hoverClass: false,
        +			activeClass: false
        +		},
        +		_addActiveClass: function() {
        +			this._super();
        +			if ( this.options.activeClass ) {
        +				this.element.addClass( this.options.activeClass );
        +			}
        +		},
        +		_removeActiveClass: function() {
        +			this._super();
        +			if ( this.options.activeClass ) {
        +				this.element.removeClass( this.options.activeClass );
        +			}
        +		},
        +		_addHoverClass: function() {
        +			this._super();
        +			if ( this.options.hoverClass ) {
        +				this.element.addClass( this.options.hoverClass );
        +			}
        +		},
        +		_removeHoverClass: function() {
        +			this._super();
        +			if ( this.options.hoverClass ) {
        +				this.element.removeClass( this.options.hoverClass );
        +			}
        +		}
        +	} );
        +}
        +
        +var widgetsDroppable = $.ui.droppable;
        +
        +
        +/*!
        + * jQuery UI Progressbar 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Progressbar
        +//>>group: Widgets
        +// jscs:disable maximumLineLength
        +//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/progressbar/
        +//>>demos: http://jqueryui.com/progressbar/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/progressbar.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +var widgetsProgressbar = $.widget( "ui.progressbar", {
        +	version: "1.12.1",
        +	options: {
        +		classes: {
        +			"ui-progressbar": "ui-corner-all",
        +			"ui-progressbar-value": "ui-corner-left",
        +			"ui-progressbar-complete": "ui-corner-right"
        +		},
        +		max: 100,
        +		value: 0,
        +
        +		change: null,
        +		complete: null
        +	},
        +
        +	min: 0,
        +
        +	_create: function() {
        +
        +		// Constrain initial value
        +		this.oldValue = this.options.value = this._constrainedValue();
        +
        +		this.element.attr( {
        +
        +			// Only set static values; aria-valuenow and aria-valuemax are
        +			// set inside _refreshValue()
        +			role: "progressbar",
        +			"aria-valuemin": this.min
        +		} );
        +		this._addClass( "ui-progressbar", "ui-widget ui-widget-content" );
        +
        +		this.valueDiv = $( "<div>" ).appendTo( this.element );
        +		this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" );
        +		this._refreshValue();
        +	},
        +
        +	_destroy: function() {
        +		this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" );
        +
        +		this.valueDiv.remove();
        +	},
        +
        +	value: function( newValue ) {
        +		if ( newValue === undefined ) {
        +			return this.options.value;
        +		}
        +
        +		this.options.value = this._constrainedValue( newValue );
        +		this._refreshValue();
        +	},
        +
        +	_constrainedValue: function( newValue ) {
        +		if ( newValue === undefined ) {
        +			newValue = this.options.value;
        +		}
        +
        +		this.indeterminate = newValue === false;
        +
        +		// Sanitize value
        +		if ( typeof newValue !== "number" ) {
        +			newValue = 0;
        +		}
        +
        +		return this.indeterminate ? false :
        +			Math.min( this.options.max, Math.max( this.min, newValue ) );
        +	},
        +
        +	_setOptions: function( options ) {
        +
        +		// Ensure "value" option is set after other values (like max)
        +		var value = options.value;
        +		delete options.value;
        +
        +		this._super( options );
        +
        +		this.options.value = this._constrainedValue( value );
        +		this._refreshValue();
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "max" ) {
        +
        +			// Don't allow a max less than min
        +			value = Math.max( this.min, value );
        +		}
        +		this._super( key, value );
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.element.attr( "aria-disabled", value );
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +	},
        +
        +	_percentage: function() {
        +		return this.indeterminate ?
        +			100 :
        +			100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
        +	},
        +
        +	_refreshValue: function() {
        +		var value = this.options.value,
        +			percentage = this._percentage();
        +
        +		this.valueDiv
        +			.toggle( this.indeterminate || value > this.min )
        +			.width( percentage.toFixed( 0 ) + "%" );
        +
        +		this
        +			._toggleClass( this.valueDiv, "ui-progressbar-complete", null,
        +				value === this.options.max )
        +			._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate );
        +
        +		if ( this.indeterminate ) {
        +			this.element.removeAttr( "aria-valuenow" );
        +			if ( !this.overlayDiv ) {
        +				this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv );
        +				this._addClass( this.overlayDiv, "ui-progressbar-overlay" );
        +			}
        +		} else {
        +			this.element.attr( {
        +				"aria-valuemax": this.options.max,
        +				"aria-valuenow": value
        +			} );
        +			if ( this.overlayDiv ) {
        +				this.overlayDiv.remove();
        +				this.overlayDiv = null;
        +			}
        +		}
        +
        +		if ( this.oldValue !== value ) {
        +			this.oldValue = value;
        +			this._trigger( "change" );
        +		}
        +		if ( value === this.options.max ) {
        +			this._trigger( "complete" );
        +		}
        +	}
        +} );
        +
        +
        +/*!
        + * jQuery UI Selectable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Selectable
        +//>>group: Interactions
        +//>>description: Allows groups of elements to be selected with the mouse.
        +//>>docs: http://api.jqueryui.com/selectable/
        +//>>demos: http://jqueryui.com/selectable/
        +//>>css.structure: ../../themes/base/selectable.css
        +
        +
        +
        +var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
        +	version: "1.12.1",
        +	options: {
        +		appendTo: "body",
        +		autoRefresh: true,
        +		distance: 0,
        +		filter: "*",
        +		tolerance: "touch",
        +
        +		// Callbacks
        +		selected: null,
        +		selecting: null,
        +		start: null,
        +		stop: null,
        +		unselected: null,
        +		unselecting: null
        +	},
        +	_create: function() {
        +		var that = this;
        +
        +		this._addClass( "ui-selectable" );
        +
        +		this.dragged = false;
        +
        +		// Cache selectee children based on filter
        +		this.refresh = function() {
        +			that.elementPos = $( that.element[ 0 ] ).offset();
        +			that.selectees = $( that.options.filter, that.element[ 0 ] );
        +			that._addClass( that.selectees, "ui-selectee" );
        +			that.selectees.each( function() {
        +				var $this = $( this ),
        +					selecteeOffset = $this.offset(),
        +					pos = {
        +						left: selecteeOffset.left - that.elementPos.left,
        +						top: selecteeOffset.top - that.elementPos.top
        +					};
        +				$.data( this, "selectable-item", {
        +					element: this,
        +					$element: $this,
        +					left: pos.left,
        +					top: pos.top,
        +					right: pos.left + $this.outerWidth(),
        +					bottom: pos.top + $this.outerHeight(),
        +					startselected: false,
        +					selected: $this.hasClass( "ui-selected" ),
        +					selecting: $this.hasClass( "ui-selecting" ),
        +					unselecting: $this.hasClass( "ui-unselecting" )
        +				} );
        +			} );
        +		};
        +		this.refresh();
        +
        +		this._mouseInit();
        +
        +		this.helper = $( "<div>" );
        +		this._addClass( this.helper, "ui-selectable-helper" );
        +	},
        +
        +	_destroy: function() {
        +		this.selectees.removeData( "selectable-item" );
        +		this._mouseDestroy();
        +	},
        +
        +	_mouseStart: function( event ) {
        +		var that = this,
        +			options = this.options;
        +
        +		this.opos = [ event.pageX, event.pageY ];
        +		this.elementPos = $( this.element[ 0 ] ).offset();
        +
        +		if ( this.options.disabled ) {
        +			return;
        +		}
        +
        +		this.selectees = $( options.filter, this.element[ 0 ] );
        +
        +		this._trigger( "start", event );
        +
        +		$( options.appendTo ).append( this.helper );
        +
        +		// position helper (lasso)
        +		this.helper.css( {
        +			"left": event.pageX,
        +			"top": event.pageY,
        +			"width": 0,
        +			"height": 0
        +		} );
        +
        +		if ( options.autoRefresh ) {
        +			this.refresh();
        +		}
        +
        +		this.selectees.filter( ".ui-selected" ).each( function() {
        +			var selectee = $.data( this, "selectable-item" );
        +			selectee.startselected = true;
        +			if ( !event.metaKey && !event.ctrlKey ) {
        +				that._removeClass( selectee.$element, "ui-selected" );
        +				selectee.selected = false;
        +				that._addClass( selectee.$element, "ui-unselecting" );
        +				selectee.unselecting = true;
        +
        +				// selectable UNSELECTING callback
        +				that._trigger( "unselecting", event, {
        +					unselecting: selectee.element
        +				} );
        +			}
        +		} );
        +
        +		$( event.target ).parents().addBack().each( function() {
        +			var doSelect,
        +				selectee = $.data( this, "selectable-item" );
        +			if ( selectee ) {
        +				doSelect = ( !event.metaKey && !event.ctrlKey ) ||
        +					!selectee.$element.hasClass( "ui-selected" );
        +				that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" )
        +					._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" );
        +				selectee.unselecting = !doSelect;
        +				selectee.selecting = doSelect;
        +				selectee.selected = doSelect;
        +
        +				// selectable (UN)SELECTING callback
        +				if ( doSelect ) {
        +					that._trigger( "selecting", event, {
        +						selecting: selectee.element
        +					} );
        +				} else {
        +					that._trigger( "unselecting", event, {
        +						unselecting: selectee.element
        +					} );
        +				}
        +				return false;
        +			}
        +		} );
        +
        +	},
        +
        +	_mouseDrag: function( event ) {
        +
        +		this.dragged = true;
        +
        +		if ( this.options.disabled ) {
        +			return;
        +		}
        +
        +		var tmp,
        +			that = this,
        +			options = this.options,
        +			x1 = this.opos[ 0 ],
        +			y1 = this.opos[ 1 ],
        +			x2 = event.pageX,
        +			y2 = event.pageY;
        +
        +		if ( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; }
        +		if ( y1 > y2 ) { tmp = y2; y2 = y1; y1 = tmp; }
        +		this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );
        +
        +		this.selectees.each( function() {
        +			var selectee = $.data( this, "selectable-item" ),
        +				hit = false,
        +				offset = {};
        +
        +			//prevent helper from being selected if appendTo: selectable
        +			if ( !selectee || selectee.element === that.element[ 0 ] ) {
        +				return;
        +			}
        +
        +			offset.left   = selectee.left   + that.elementPos.left;
        +			offset.right  = selectee.right  + that.elementPos.left;
        +			offset.top    = selectee.top    + that.elementPos.top;
        +			offset.bottom = selectee.bottom + that.elementPos.top;
        +
        +			if ( options.tolerance === "touch" ) {
        +				hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
        +                    offset.bottom < y1 ) );
        +			} else if ( options.tolerance === "fit" ) {
        +				hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
        +                    offset.bottom < y2 );
        +			}
        +
        +			if ( hit ) {
        +
        +				// SELECT
        +				if ( selectee.selected ) {
        +					that._removeClass( selectee.$element, "ui-selected" );
        +					selectee.selected = false;
        +				}
        +				if ( selectee.unselecting ) {
        +					that._removeClass( selectee.$element, "ui-unselecting" );
        +					selectee.unselecting = false;
        +				}
        +				if ( !selectee.selecting ) {
        +					that._addClass( selectee.$element, "ui-selecting" );
        +					selectee.selecting = true;
        +
        +					// selectable SELECTING callback
        +					that._trigger( "selecting", event, {
        +						selecting: selectee.element
        +					} );
        +				}
        +			} else {
        +
        +				// UNSELECT
        +				if ( selectee.selecting ) {
        +					if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {
        +						that._removeClass( selectee.$element, "ui-selecting" );
        +						selectee.selecting = false;
        +						that._addClass( selectee.$element, "ui-selected" );
        +						selectee.selected = true;
        +					} else {
        +						that._removeClass( selectee.$element, "ui-selecting" );
        +						selectee.selecting = false;
        +						if ( selectee.startselected ) {
        +							that._addClass( selectee.$element, "ui-unselecting" );
        +							selectee.unselecting = true;
        +						}
        +
        +						// selectable UNSELECTING callback
        +						that._trigger( "unselecting", event, {
        +							unselecting: selectee.element
        +						} );
        +					}
        +				}
        +				if ( selectee.selected ) {
        +					if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {
        +						that._removeClass( selectee.$element, "ui-selected" );
        +						selectee.selected = false;
        +
        +						that._addClass( selectee.$element, "ui-unselecting" );
        +						selectee.unselecting = true;
        +
        +						// selectable UNSELECTING callback
        +						that._trigger( "unselecting", event, {
        +							unselecting: selectee.element
        +						} );
        +					}
        +				}
        +			}
        +		} );
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +		var that = this;
        +
        +		this.dragged = false;
        +
        +		$( ".ui-unselecting", this.element[ 0 ] ).each( function() {
        +			var selectee = $.data( this, "selectable-item" );
        +			that._removeClass( selectee.$element, "ui-unselecting" );
        +			selectee.unselecting = false;
        +			selectee.startselected = false;
        +			that._trigger( "unselected", event, {
        +				unselected: selectee.element
        +			} );
        +		} );
        +		$( ".ui-selecting", this.element[ 0 ] ).each( function() {
        +			var selectee = $.data( this, "selectable-item" );
        +			that._removeClass( selectee.$element, "ui-selecting" )
        +				._addClass( selectee.$element, "ui-selected" );
        +			selectee.selecting = false;
        +			selectee.selected = true;
        +			selectee.startselected = true;
        +			that._trigger( "selected", event, {
        +				selected: selectee.element
        +			} );
        +		} );
        +		this._trigger( "stop", event );
        +
        +		this.helper.remove();
        +
        +		return false;
        +	}
        +
        +} );
        +
        +
        +/*!
        + * jQuery UI Selectmenu 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Selectmenu
        +//>>group: Widgets
        +// jscs:disable maximumLineLength
        +//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/selectmenu/
        +//>>demos: http://jqueryui.com/selectmenu/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
        +	version: "1.12.1",
        +	defaultElement: "<select>",
        +	options: {
        +		appendTo: null,
        +		classes: {
        +			"ui-selectmenu-button-open": "ui-corner-top",
        +			"ui-selectmenu-button-closed": "ui-corner-all"
        +		},
        +		disabled: null,
        +		icons: {
        +			button: "ui-icon-triangle-1-s"
        +		},
        +		position: {
        +			my: "left top",
        +			at: "left bottom",
        +			collision: "none"
        +		},
        +		width: false,
        +
        +		// Callbacks
        +		change: null,
        +		close: null,
        +		focus: null,
        +		open: null,
        +		select: null
        +	},
        +
        +	_create: function() {
        +		var selectmenuId = this.element.uniqueId().attr( "id" );
        +		this.ids = {
        +			element: selectmenuId,
        +			button: selectmenuId + "-button",
        +			menu: selectmenuId + "-menu"
        +		};
        +
        +		this._drawButton();
        +		this._drawMenu();
        +		this._bindFormResetHandler();
        +
        +		this._rendered = false;
        +		this.menuItems = $();
        +	},
        +
        +	_drawButton: function() {
        +		var icon,
        +			that = this,
        +			item = this._parseOption(
        +				this.element.find( "option:selected" ),
        +				this.element[ 0 ].selectedIndex
        +			);
        +
        +		// Associate existing label with the new button
        +		this.labels = this.element.labels().attr( "for", this.ids.button );
        +		this._on( this.labels, {
        +			click: function( event ) {
        +				this.button.focus();
        +				event.preventDefault();
        +			}
        +		} );
        +
        +		// Hide original select element
        +		this.element.hide();
        +
        +		// Create button
        +		this.button = $( "<span>", {
        +			tabindex: this.options.disabled ? -1 : 0,
        +			id: this.ids.button,
        +			role: "combobox",
        +			"aria-expanded": "false",
        +			"aria-autocomplete": "list",
        +			"aria-owns": this.ids.menu,
        +			"aria-haspopup": "true",
        +			title: this.element.attr( "title" )
        +		} )
        +			.insertAfter( this.element );
        +
        +		this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
        +			"ui-button ui-widget" );
        +
        +		icon = $( "<span>" ).appendTo( this.button );
        +		this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button );
        +		this.buttonItem = this._renderButtonItem( item )
        +			.appendTo( this.button );
        +
        +		if ( this.options.width !== false ) {
        +			this._resizeButton();
        +		}
        +
        +		this._on( this.button, this._buttonEvents );
        +		this.button.one( "focusin", function() {
        +
        +			// Delay rendering the menu items until the button receives focus.
        +			// The menu may have already been rendered via a programmatic open.
        +			if ( !that._rendered ) {
        +				that._refreshMenu();
        +			}
        +		} );
        +	},
        +
        +	_drawMenu: function() {
        +		var that = this;
        +
        +		// Create menu
        +		this.menu = $( "<ul>", {
        +			"aria-hidden": "true",
        +			"aria-labelledby": this.ids.button,
        +			id: this.ids.menu
        +		} );
        +
        +		// Wrap menu
        +		this.menuWrap = $( "<div>" ).append( this.menu );
        +		this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
        +		this.menuWrap.appendTo( this._appendTo() );
        +
        +		// Initialize menu widget
        +		this.menuInstance = this.menu
        +			.menu( {
        +				classes: {
        +					"ui-menu": "ui-corner-bottom"
        +				},
        +				role: "listbox",
        +				select: function( event, ui ) {
        +					event.preventDefault();
        +
        +					// Support: IE8
        +					// If the item was selected via a click, the text selection
        +					// will be destroyed in IE
        +					that._setSelection();
        +
        +					that._select( ui.item.data( "ui-selectmenu-item" ), event );
        +				},
        +				focus: function( event, ui ) {
        +					var item = ui.item.data( "ui-selectmenu-item" );
        +
        +					// Prevent inital focus from firing and check if its a newly focused item
        +					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
        +						that._trigger( "focus", event, { item: item } );
        +						if ( !that.isOpen ) {
        +							that._select( item, event );
        +						}
        +					}
        +					that.focusIndex = item.index;
        +
        +					that.button.attr( "aria-activedescendant",
        +						that.menuItems.eq( item.index ).attr( "id" ) );
        +				}
        +			} )
        +			.menu( "instance" );
        +
        +		// Don't close the menu on mouseleave
        +		this.menuInstance._off( this.menu, "mouseleave" );
        +
        +		// Cancel the menu's collapseAll on document click
        +		this.menuInstance._closeOnDocumentClick = function() {
        +			return false;
        +		};
        +
        +		// Selects often contain empty items, but never contain dividers
        +		this.menuInstance._isDivider = function() {
        +			return false;
        +		};
        +	},
        +
        +	refresh: function() {
        +		this._refreshMenu();
        +		this.buttonItem.replaceWith(
        +			this.buttonItem = this._renderButtonItem(
        +
        +				// Fall back to an empty object in case there are no options
        +				this._getSelectedItem().data( "ui-selectmenu-item" ) || {}
        +			)
        +		);
        +		if ( this.options.width === null ) {
        +			this._resizeButton();
        +		}
        +	},
        +
        +	_refreshMenu: function() {
        +		var item,
        +			options = this.element.find( "option" );
        +
        +		this.menu.empty();
        +
        +		this._parseOptions( options );
        +		this._renderMenu( this.menu, this.items );
        +
        +		this.menuInstance.refresh();
        +		this.menuItems = this.menu.find( "li" )
        +			.not( ".ui-selectmenu-optgroup" )
        +				.find( ".ui-menu-item-wrapper" );
        +
        +		this._rendered = true;
        +
        +		if ( !options.length ) {
        +			return;
        +		}
        +
        +		item = this._getSelectedItem();
        +
        +		// Update the menu to have the correct item focused
        +		this.menuInstance.focus( null, item );
        +		this._setAria( item.data( "ui-selectmenu-item" ) );
        +
        +		// Set disabled state
        +		this._setOption( "disabled", this.element.prop( "disabled" ) );
        +	},
        +
        +	open: function( event ) {
        +		if ( this.options.disabled ) {
        +			return;
        +		}
        +
        +		// If this is the first time the menu is being opened, render the items
        +		if ( !this._rendered ) {
        +			this._refreshMenu();
        +		} else {
        +
        +			// Menu clears focus on close, reset focus to selected item
        +			this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
        +			this.menuInstance.focus( null, this._getSelectedItem() );
        +		}
        +
        +		// If there are no options, don't open the menu
        +		if ( !this.menuItems.length ) {
        +			return;
        +		}
        +
        +		this.isOpen = true;
        +		this._toggleAttr();
        +		this._resizeMenu();
        +		this._position();
        +
        +		this._on( this.document, this._documentClick );
        +
        +		this._trigger( "open", event );
        +	},
        +
        +	_position: function() {
        +		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
        +	},
        +
        +	close: function( event ) {
        +		if ( !this.isOpen ) {
        +			return;
        +		}
        +
        +		this.isOpen = false;
        +		this._toggleAttr();
        +
        +		this.range = null;
        +		this._off( this.document );
        +
        +		this._trigger( "close", event );
        +	},
        +
        +	widget: function() {
        +		return this.button;
        +	},
        +
        +	menuWidget: function() {
        +		return this.menu;
        +	},
        +
        +	_renderButtonItem: function( item ) {
        +		var buttonItem = $( "<span>" );
        +
        +		this._setText( buttonItem, item.label );
        +		this._addClass( buttonItem, "ui-selectmenu-text" );
        +
        +		return buttonItem;
        +	},
        +
        +	_renderMenu: function( ul, items ) {
        +		var that = this,
        +			currentOptgroup = "";
        +
        +		$.each( items, function( index, item ) {
        +			var li;
        +
        +			if ( item.optgroup !== currentOptgroup ) {
        +				li = $( "<li>", {
        +					text: item.optgroup
        +				} );
        +				that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
        +					( item.element.parent( "optgroup" ).prop( "disabled" ) ?
        +						" ui-state-disabled" :
        +						"" ) );
        +
        +				li.appendTo( ul );
        +
        +				currentOptgroup = item.optgroup;
        +			}
        +
        +			that._renderItemData( ul, item );
        +		} );
        +	},
        +
        +	_renderItemData: function( ul, item ) {
        +		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
        +	},
        +
        +	_renderItem: function( ul, item ) {
        +		var li = $( "<li>" ),
        +			wrapper = $( "<div>", {
        +				title: item.element.attr( "title" )
        +			} );
        +
        +		if ( item.disabled ) {
        +			this._addClass( li, null, "ui-state-disabled" );
        +		}
        +		this._setText( wrapper, item.label );
        +
        +		return li.append( wrapper ).appendTo( ul );
        +	},
        +
        +	_setText: function( element, value ) {
        +		if ( value ) {
        +			element.text( value );
        +		} else {
        +			element.html( "&#160;" );
        +		}
        +	},
        +
        +	_move: function( direction, event ) {
        +		var item, next,
        +			filter = ".ui-menu-item";
        +
        +		if ( this.isOpen ) {
        +			item = this.menuItems.eq( this.focusIndex ).parent( "li" );
        +		} else {
        +			item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
        +			filter += ":not(.ui-state-disabled)";
        +		}
        +
        +		if ( direction === "first" || direction === "last" ) {
        +			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
        +		} else {
        +			next = item[ direction + "All" ]( filter ).eq( 0 );
        +		}
        +
        +		if ( next.length ) {
        +			this.menuInstance.focus( event, next );
        +		}
        +	},
        +
        +	_getSelectedItem: function() {
        +		return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
        +	},
        +
        +	_toggle: function( event ) {
        +		this[ this.isOpen ? "close" : "open" ]( event );
        +	},
        +
        +	_setSelection: function() {
        +		var selection;
        +
        +		if ( !this.range ) {
        +			return;
        +		}
        +
        +		if ( window.getSelection ) {
        +			selection = window.getSelection();
        +			selection.removeAllRanges();
        +			selection.addRange( this.range );
        +
        +		// Support: IE8
        +		} else {
        +			this.range.select();
        +		}
        +
        +		// Support: IE
        +		// Setting the text selection kills the button focus in IE, but
        +		// restoring the focus doesn't kill the selection.
        +		this.button.focus();
        +	},
        +
        +	_documentClick: {
        +		mousedown: function( event ) {
        +			if ( !this.isOpen ) {
        +				return;
        +			}
        +
        +			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" +
        +					$.ui.escapeSelector( this.ids.button ) ).length ) {
        +				this.close( event );
        +			}
        +		}
        +	},
        +
        +	_buttonEvents: {
        +
        +		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
        +		mousedown: function() {
        +			var selection;
        +
        +			if ( window.getSelection ) {
        +				selection = window.getSelection();
        +				if ( selection.rangeCount ) {
        +					this.range = selection.getRangeAt( 0 );
        +				}
        +
        +			// Support: IE8
        +			} else {
        +				this.range = document.selection.createRange();
        +			}
        +		},
        +
        +		click: function( event ) {
        +			this._setSelection();
        +			this._toggle( event );
        +		},
        +
        +		keydown: function( event ) {
        +			var preventDefault = true;
        +			switch ( event.keyCode ) {
        +			case $.ui.keyCode.TAB:
        +			case $.ui.keyCode.ESCAPE:
        +				this.close( event );
        +				preventDefault = false;
        +				break;
        +			case $.ui.keyCode.ENTER:
        +				if ( this.isOpen ) {
        +					this._selectFocusedItem( event );
        +				}
        +				break;
        +			case $.ui.keyCode.UP:
        +				if ( event.altKey ) {
        +					this._toggle( event );
        +				} else {
        +					this._move( "prev", event );
        +				}
        +				break;
        +			case $.ui.keyCode.DOWN:
        +				if ( event.altKey ) {
        +					this._toggle( event );
        +				} else {
        +					this._move( "next", event );
        +				}
        +				break;
        +			case $.ui.keyCode.SPACE:
        +				if ( this.isOpen ) {
        +					this._selectFocusedItem( event );
        +				} else {
        +					this._toggle( event );
        +				}
        +				break;
        +			case $.ui.keyCode.LEFT:
        +				this._move( "prev", event );
        +				break;
        +			case $.ui.keyCode.RIGHT:
        +				this._move( "next", event );
        +				break;
        +			case $.ui.keyCode.HOME:
        +			case $.ui.keyCode.PAGE_UP:
        +				this._move( "first", event );
        +				break;
        +			case $.ui.keyCode.END:
        +			case $.ui.keyCode.PAGE_DOWN:
        +				this._move( "last", event );
        +				break;
        +			default:
        +				this.menu.trigger( event );
        +				preventDefault = false;
        +			}
        +
        +			if ( preventDefault ) {
        +				event.preventDefault();
        +			}
        +		}
        +	},
        +
        +	_selectFocusedItem: function( event ) {
        +		var item = this.menuItems.eq( this.focusIndex ).parent( "li" );
        +		if ( !item.hasClass( "ui-state-disabled" ) ) {
        +			this._select( item.data( "ui-selectmenu-item" ), event );
        +		}
        +	},
        +
        +	_select: function( item, event ) {
        +		var oldIndex = this.element[ 0 ].selectedIndex;
        +
        +		// Change native select element
        +		this.element[ 0 ].selectedIndex = item.index;
        +		this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );
        +		this._setAria( item );
        +		this._trigger( "select", event, { item: item } );
        +
        +		if ( item.index !== oldIndex ) {
        +			this._trigger( "change", event, { item: item } );
        +		}
        +
        +		this.close( event );
        +	},
        +
        +	_setAria: function( item ) {
        +		var id = this.menuItems.eq( item.index ).attr( "id" );
        +
        +		this.button.attr( {
        +			"aria-labelledby": id,
        +			"aria-activedescendant": id
        +		} );
        +		this.menu.attr( "aria-activedescendant", id );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "icons" ) {
        +			var icon = this.button.find( "span.ui-icon" );
        +			this._removeClass( icon, null, this.options.icons.button )
        +				._addClass( icon, null, value.button );
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "appendTo" ) {
        +			this.menuWrap.appendTo( this._appendTo() );
        +		}
        +
        +		if ( key === "width" ) {
        +			this._resizeButton();
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.menuInstance.option( "disabled", value );
        +		this.button.attr( "aria-disabled", value );
        +		this._toggleClass( this.button, null, "ui-state-disabled", value );
        +
        +		this.element.prop( "disabled", value );
        +		if ( value ) {
        +			this.button.attr( "tabindex", -1 );
        +			this.close();
        +		} else {
        +			this.button.attr( "tabindex", 0 );
        +		}
        +	},
        +
        +	_appendTo: function() {
        +		var element = this.options.appendTo;
        +
        +		if ( element ) {
        +			element = element.jquery || element.nodeType ?
        +				$( element ) :
        +				this.document.find( element ).eq( 0 );
        +		}
        +
        +		if ( !element || !element[ 0 ] ) {
        +			element = this.element.closest( ".ui-front, dialog" );
        +		}
        +
        +		if ( !element.length ) {
        +			element = this.document[ 0 ].body;
        +		}
        +
        +		return element;
        +	},
        +
        +	_toggleAttr: function() {
        +		this.button.attr( "aria-expanded", this.isOpen );
        +
        +		// We can't use two _toggleClass() calls here, because we need to make sure
        +		// we always remove classes first and add them second, otherwise if both classes have the
        +		// same theme class, it will be removed after we add it.
        +		this._removeClass( this.button, "ui-selectmenu-button-" +
        +			( this.isOpen ? "closed" : "open" ) )
        +			._addClass( this.button, "ui-selectmenu-button-" +
        +				( this.isOpen ? "open" : "closed" ) )
        +			._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
        +
        +		this.menu.attr( "aria-hidden", !this.isOpen );
        +	},
        +
        +	_resizeButton: function() {
        +		var width = this.options.width;
        +
        +		// For `width: false`, just remove inline style and stop
        +		if ( width === false ) {
        +			this.button.css( "width", "" );
        +			return;
        +		}
        +
        +		// For `width: null`, match the width of the original element
        +		if ( width === null ) {
        +			width = this.element.show().outerWidth();
        +			this.element.hide();
        +		}
        +
        +		this.button.outerWidth( width );
        +	},
        +
        +	_resizeMenu: function() {
        +		this.menu.outerWidth( Math.max(
        +			this.button.outerWidth(),
        +
        +			// Support: IE10
        +			// IE10 wraps long text (possibly a rounding bug)
        +			// so we add 1px to avoid the wrapping
        +			this.menu.width( "" ).outerWidth() + 1
        +		) );
        +	},
        +
        +	_getCreateOptions: function() {
        +		var options = this._super();
        +
        +		options.disabled = this.element.prop( "disabled" );
        +
        +		return options;
        +	},
        +
        +	_parseOptions: function( options ) {
        +		var that = this,
        +			data = [];
        +		options.each( function( index, item ) {
        +			data.push( that._parseOption( $( item ), index ) );
        +		} );
        +		this.items = data;
        +	},
        +
        +	_parseOption: function( option, index ) {
        +		var optgroup = option.parent( "optgroup" );
        +
        +		return {
        +			element: option,
        +			index: index,
        +			value: option.val(),
        +			label: option.text(),
        +			optgroup: optgroup.attr( "label" ) || "",
        +			disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
        +		};
        +	},
        +
        +	_destroy: function() {
        +		this._unbindFormResetHandler();
        +		this.menuWrap.remove();
        +		this.button.remove();
        +		this.element.show();
        +		this.element.removeUniqueId();
        +		this.labels.attr( "for", this.ids.element );
        +	}
        +} ] );
        +
        +
        +/*!
        + * jQuery UI Slider 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Slider
        +//>>group: Widgets
        +//>>description: Displays a flexible slider with ranges and accessibility via keyboard.
        +//>>docs: http://api.jqueryui.com/slider/
        +//>>demos: http://jqueryui.com/slider/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/slider.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "slide",
        +
        +	options: {
        +		animate: false,
        +		classes: {
        +			"ui-slider": "ui-corner-all",
        +			"ui-slider-handle": "ui-corner-all",
        +
        +			// Note: ui-widget-header isn't the most fittingly semantic framework class for this
        +			// element, but worked best visually with a variety of themes
        +			"ui-slider-range": "ui-corner-all ui-widget-header"
        +		},
        +		distance: 0,
        +		max: 100,
        +		min: 0,
        +		orientation: "horizontal",
        +		range: false,
        +		step: 1,
        +		value: 0,
        +		values: null,
        +
        +		// Callbacks
        +		change: null,
        +		slide: null,
        +		start: null,
        +		stop: null
        +	},
        +
        +	// Number of pages in a slider
        +	// (how many times can you page up/down to go through the whole range)
        +	numPages: 5,
        +
        +	_create: function() {
        +		this._keySliding = false;
        +		this._mouseSliding = false;
        +		this._animateOff = true;
        +		this._handleIndex = null;
        +		this._detectOrientation();
        +		this._mouseInit();
        +		this._calculateNewMax();
        +
        +		this._addClass( "ui-slider ui-slider-" + this.orientation,
        +			"ui-widget ui-widget-content" );
        +
        +		this._refresh();
        +
        +		this._animateOff = false;
        +	},
        +
        +	_refresh: function() {
        +		this._createRange();
        +		this._createHandles();
        +		this._setupEvents();
        +		this._refreshValue();
        +	},
        +
        +	_createHandles: function() {
        +		var i, handleCount,
        +			options = this.options,
        +			existingHandles = this.element.find( ".ui-slider-handle" ),
        +			handle = "<span tabindex='0'></span>",
        +			handles = [];
        +
        +		handleCount = ( options.values && options.values.length ) || 1;
        +
        +		if ( existingHandles.length > handleCount ) {
        +			existingHandles.slice( handleCount ).remove();
        +			existingHandles = existingHandles.slice( 0, handleCount );
        +		}
        +
        +		for ( i = existingHandles.length; i < handleCount; i++ ) {
        +			handles.push( handle );
        +		}
        +
        +		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
        +
        +		this._addClass( this.handles, "ui-slider-handle", "ui-state-default" );
        +
        +		this.handle = this.handles.eq( 0 );
        +
        +		this.handles.each( function( i ) {
        +			$( this )
        +				.data( "ui-slider-handle-index", i )
        +				.attr( "tabIndex", 0 );
        +		} );
        +	},
        +
        +	_createRange: function() {
        +		var options = this.options;
        +
        +		if ( options.range ) {
        +			if ( options.range === true ) {
        +				if ( !options.values ) {
        +					options.values = [ this._valueMin(), this._valueMin() ];
        +				} else if ( options.values.length && options.values.length !== 2 ) {
        +					options.values = [ options.values[ 0 ], options.values[ 0 ] ];
        +				} else if ( $.isArray( options.values ) ) {
        +					options.values = options.values.slice( 0 );
        +				}
        +			}
        +
        +			if ( !this.range || !this.range.length ) {
        +				this.range = $( "<div>" )
        +					.appendTo( this.element );
        +
        +				this._addClass( this.range, "ui-slider-range" );
        +			} else {
        +				this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" );
        +
        +				// Handle range switching from true to min/max
        +				this.range.css( {
        +					"left": "",
        +					"bottom": ""
        +				} );
        +			}
        +			if ( options.range === "min" || options.range === "max" ) {
        +				this._addClass( this.range, "ui-slider-range-" + options.range );
        +			}
        +		} else {
        +			if ( this.range ) {
        +				this.range.remove();
        +			}
        +			this.range = null;
        +		}
        +	},
        +
        +	_setupEvents: function() {
        +		this._off( this.handles );
        +		this._on( this.handles, this._handleEvents );
        +		this._hoverable( this.handles );
        +		this._focusable( this.handles );
        +	},
        +
        +	_destroy: function() {
        +		this.handles.remove();
        +		if ( this.range ) {
        +			this.range.remove();
        +		}
        +
        +		this._mouseDestroy();
        +	},
        +
        +	_mouseCapture: function( event ) {
        +		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
        +			that = this,
        +			o = this.options;
        +
        +		if ( o.disabled ) {
        +			return false;
        +		}
        +
        +		this.elementSize = {
        +			width: this.element.outerWidth(),
        +			height: this.element.outerHeight()
        +		};
        +		this.elementOffset = this.element.offset();
        +
        +		position = { x: event.pageX, y: event.pageY };
        +		normValue = this._normValueFromMouse( position );
        +		distance = this._valueMax() - this._valueMin() + 1;
        +		this.handles.each( function( i ) {
        +			var thisDistance = Math.abs( normValue - that.values( i ) );
        +			if ( ( distance > thisDistance ) ||
        +				( distance === thisDistance &&
        +					( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {
        +				distance = thisDistance;
        +				closestHandle = $( this );
        +				index = i;
        +			}
        +		} );
        +
        +		allowed = this._start( event, index );
        +		if ( allowed === false ) {
        +			return false;
        +		}
        +		this._mouseSliding = true;
        +
        +		this._handleIndex = index;
        +
        +		this._addClass( closestHandle, null, "ui-state-active" );
        +		closestHandle.trigger( "focus" );
        +
        +		offset = closestHandle.offset();
        +		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
        +		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
        +			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
        +			top: event.pageY - offset.top -
        +				( closestHandle.height() / 2 ) -
        +				( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) -
        +				( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) +
        +				( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 )
        +		};
        +
        +		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
        +			this._slide( event, index, normValue );
        +		}
        +		this._animateOff = true;
        +		return true;
        +	},
        +
        +	_mouseStart: function() {
        +		return true;
        +	},
        +
        +	_mouseDrag: function( event ) {
        +		var position = { x: event.pageX, y: event.pageY },
        +			normValue = this._normValueFromMouse( position );
        +
        +		this._slide( event, this._handleIndex, normValue );
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +		this._removeClass( this.handles, null, "ui-state-active" );
        +		this._mouseSliding = false;
        +
        +		this._stop( event, this._handleIndex );
        +		this._change( event, this._handleIndex );
        +
        +		this._handleIndex = null;
        +		this._clickOffset = null;
        +		this._animateOff = false;
        +
        +		return false;
        +	},
        +
        +	_detectOrientation: function() {
        +		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
        +	},
        +
        +	_normValueFromMouse: function( position ) {
        +		var pixelTotal,
        +			pixelMouse,
        +			percentMouse,
        +			valueTotal,
        +			valueMouse;
        +
        +		if ( this.orientation === "horizontal" ) {
        +			pixelTotal = this.elementSize.width;
        +			pixelMouse = position.x - this.elementOffset.left -
        +				( this._clickOffset ? this._clickOffset.left : 0 );
        +		} else {
        +			pixelTotal = this.elementSize.height;
        +			pixelMouse = position.y - this.elementOffset.top -
        +				( this._clickOffset ? this._clickOffset.top : 0 );
        +		}
        +
        +		percentMouse = ( pixelMouse / pixelTotal );
        +		if ( percentMouse > 1 ) {
        +			percentMouse = 1;
        +		}
        +		if ( percentMouse < 0 ) {
        +			percentMouse = 0;
        +		}
        +		if ( this.orientation === "vertical" ) {
        +			percentMouse = 1 - percentMouse;
        +		}
        +
        +		valueTotal = this._valueMax() - this._valueMin();
        +		valueMouse = this._valueMin() + percentMouse * valueTotal;
        +
        +		return this._trimAlignValue( valueMouse );
        +	},
        +
        +	_uiHash: function( index, value, values ) {
        +		var uiHash = {
        +			handle: this.handles[ index ],
        +			handleIndex: index,
        +			value: value !== undefined ? value : this.value()
        +		};
        +
        +		if ( this._hasMultipleValues() ) {
        +			uiHash.value = value !== undefined ? value : this.values( index );
        +			uiHash.values = values || this.values();
        +		}
        +
        +		return uiHash;
        +	},
        +
        +	_hasMultipleValues: function() {
        +		return this.options.values && this.options.values.length;
        +	},
        +
        +	_start: function( event, index ) {
        +		return this._trigger( "start", event, this._uiHash( index ) );
        +	},
        +
        +	_slide: function( event, index, newVal ) {
        +		var allowed, otherVal,
        +			currentValue = this.value(),
        +			newValues = this.values();
        +
        +		if ( this._hasMultipleValues() ) {
        +			otherVal = this.values( index ? 0 : 1 );
        +			currentValue = this.values( index );
        +
        +			if ( this.options.values.length === 2 && this.options.range === true ) {
        +				newVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );
        +			}
        +
        +			newValues[ index ] = newVal;
        +		}
        +
        +		if ( newVal === currentValue ) {
        +			return;
        +		}
        +
        +		allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) );
        +
        +		// A slide can be canceled by returning false from the slide callback
        +		if ( allowed === false ) {
        +			return;
        +		}
        +
        +		if ( this._hasMultipleValues() ) {
        +			this.values( index, newVal );
        +		} else {
        +			this.value( newVal );
        +		}
        +	},
        +
        +	_stop: function( event, index ) {
        +		this._trigger( "stop", event, this._uiHash( index ) );
        +	},
        +
        +	_change: function( event, index ) {
        +		if ( !this._keySliding && !this._mouseSliding ) {
        +
        +			//store the last changed value index for reference when handles overlap
        +			this._lastChangedValue = index;
        +			this._trigger( "change", event, this._uiHash( index ) );
        +		}
        +	},
        +
        +	value: function( newValue ) {
        +		if ( arguments.length ) {
        +			this.options.value = this._trimAlignValue( newValue );
        +			this._refreshValue();
        +			this._change( null, 0 );
        +			return;
        +		}
        +
        +		return this._value();
        +	},
        +
        +	values: function( index, newValue ) {
        +		var vals,
        +			newValues,
        +			i;
        +
        +		if ( arguments.length > 1 ) {
        +			this.options.values[ index ] = this._trimAlignValue( newValue );
        +			this._refreshValue();
        +			this._change( null, index );
        +			return;
        +		}
        +
        +		if ( arguments.length ) {
        +			if ( $.isArray( arguments[ 0 ] ) ) {
        +				vals = this.options.values;
        +				newValues = arguments[ 0 ];
        +				for ( i = 0; i < vals.length; i += 1 ) {
        +					vals[ i ] = this._trimAlignValue( newValues[ i ] );
        +					this._change( null, i );
        +				}
        +				this._refreshValue();
        +			} else {
        +				if ( this._hasMultipleValues() ) {
        +					return this._values( index );
        +				} else {
        +					return this.value();
        +				}
        +			}
        +		} else {
        +			return this._values();
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var i,
        +			valsLength = 0;
        +
        +		if ( key === "range" && this.options.range === true ) {
        +			if ( value === "min" ) {
        +				this.options.value = this._values( 0 );
        +				this.options.values = null;
        +			} else if ( value === "max" ) {
        +				this.options.value = this._values( this.options.values.length - 1 );
        +				this.options.values = null;
        +			}
        +		}
        +
        +		if ( $.isArray( this.options.values ) ) {
        +			valsLength = this.options.values.length;
        +		}
        +
        +		this._super( key, value );
        +
        +		switch ( key ) {
        +			case "orientation":
        +				this._detectOrientation();
        +				this._removeClass( "ui-slider-horizontal ui-slider-vertical" )
        +					._addClass( "ui-slider-" + this.orientation );
        +				this._refreshValue();
        +				if ( this.options.range ) {
        +					this._refreshRange( value );
        +				}
        +
        +				// Reset positioning from previous orientation
        +				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
        +				break;
        +			case "value":
        +				this._animateOff = true;
        +				this._refreshValue();
        +				this._change( null, 0 );
        +				this._animateOff = false;
        +				break;
        +			case "values":
        +				this._animateOff = true;
        +				this._refreshValue();
        +
        +				// Start from the last handle to prevent unreachable handles (#9046)
        +				for ( i = valsLength - 1; i >= 0; i-- ) {
        +					this._change( null, i );
        +				}
        +				this._animateOff = false;
        +				break;
        +			case "step":
        +			case "min":
        +			case "max":
        +				this._animateOff = true;
        +				this._calculateNewMax();
        +				this._refreshValue();
        +				this._animateOff = false;
        +				break;
        +			case "range":
        +				this._animateOff = true;
        +				this._refresh();
        +				this._animateOff = false;
        +				break;
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +	},
        +
        +	//internal value getter
        +	// _value() returns value trimmed by min and max, aligned by step
        +	_value: function() {
        +		var val = this.options.value;
        +		val = this._trimAlignValue( val );
        +
        +		return val;
        +	},
        +
        +	//internal values getter
        +	// _values() returns array of values trimmed by min and max, aligned by step
        +	// _values( index ) returns single value trimmed by min and max, aligned by step
        +	_values: function( index ) {
        +		var val,
        +			vals,
        +			i;
        +
        +		if ( arguments.length ) {
        +			val = this.options.values[ index ];
        +			val = this._trimAlignValue( val );
        +
        +			return val;
        +		} else if ( this._hasMultipleValues() ) {
        +
        +			// .slice() creates a copy of the array
        +			// this copy gets trimmed by min and max and then returned
        +			vals = this.options.values.slice();
        +			for ( i = 0; i < vals.length; i += 1 ) {
        +				vals[ i ] = this._trimAlignValue( vals[ i ] );
        +			}
        +
        +			return vals;
        +		} else {
        +			return [];
        +		}
        +	},
        +
        +	// Returns the step-aligned value that val is closest to, between (inclusive) min and max
        +	_trimAlignValue: function( val ) {
        +		if ( val <= this._valueMin() ) {
        +			return this._valueMin();
        +		}
        +		if ( val >= this._valueMax() ) {
        +			return this._valueMax();
        +		}
        +		var step = ( this.options.step > 0 ) ? this.options.step : 1,
        +			valModStep = ( val - this._valueMin() ) % step,
        +			alignValue = val - valModStep;
        +
        +		if ( Math.abs( valModStep ) * 2 >= step ) {
        +			alignValue += ( valModStep > 0 ) ? step : ( -step );
        +		}
        +
        +		// Since JavaScript has problems with large floats, round
        +		// the final value to 5 digits after the decimal point (see #4124)
        +		return parseFloat( alignValue.toFixed( 5 ) );
        +	},
        +
        +	_calculateNewMax: function() {
        +		var max = this.options.max,
        +			min = this._valueMin(),
        +			step = this.options.step,
        +			aboveMin = Math.round( ( max - min ) / step ) * step;
        +		max = aboveMin + min;
        +		if ( max > this.options.max ) {
        +
        +			//If max is not divisible by step, rounding off may increase its value
        +			max -= step;
        +		}
        +		this.max = parseFloat( max.toFixed( this._precision() ) );
        +	},
        +
        +	_precision: function() {
        +		var precision = this._precisionOf( this.options.step );
        +		if ( this.options.min !== null ) {
        +			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        +		}
        +		return precision;
        +	},
        +
        +	_precisionOf: function( num ) {
        +		var str = num.toString(),
        +			decimal = str.indexOf( "." );
        +		return decimal === -1 ? 0 : str.length - decimal - 1;
        +	},
        +
        +	_valueMin: function() {
        +		return this.options.min;
        +	},
        +
        +	_valueMax: function() {
        +		return this.max;
        +	},
        +
        +	_refreshRange: function( orientation ) {
        +		if ( orientation === "vertical" ) {
        +			this.range.css( { "width": "", "left": "" } );
        +		}
        +		if ( orientation === "horizontal" ) {
        +			this.range.css( { "height": "", "bottom": "" } );
        +		}
        +	},
        +
        +	_refreshValue: function() {
        +		var lastValPercent, valPercent, value, valueMin, valueMax,
        +			oRange = this.options.range,
        +			o = this.options,
        +			that = this,
        +			animate = ( !this._animateOff ) ? o.animate : false,
        +			_set = {};
        +
        +		if ( this._hasMultipleValues() ) {
        +			this.handles.each( function( i ) {
        +				valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -
        +					that._valueMin() ) * 100;
        +				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        +				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        +				if ( that.options.range === true ) {
        +					if ( that.orientation === "horizontal" ) {
        +						if ( i === 0 ) {
        +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +								left: valPercent + "%"
        +							}, o.animate );
        +						}
        +						if ( i === 1 ) {
        +							that.range[ animate ? "animate" : "css" ]( {
        +								width: ( valPercent - lastValPercent ) + "%"
        +							}, {
        +								queue: false,
        +								duration: o.animate
        +							} );
        +						}
        +					} else {
        +						if ( i === 0 ) {
        +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +								bottom: ( valPercent ) + "%"
        +							}, o.animate );
        +						}
        +						if ( i === 1 ) {
        +							that.range[ animate ? "animate" : "css" ]( {
        +								height: ( valPercent - lastValPercent ) + "%"
        +							}, {
        +								queue: false,
        +								duration: o.animate
        +							} );
        +						}
        +					}
        +				}
        +				lastValPercent = valPercent;
        +			} );
        +		} else {
        +			value = this.value();
        +			valueMin = this._valueMin();
        +			valueMax = this._valueMax();
        +			valPercent = ( valueMax !== valueMin ) ?
        +					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
        +					0;
        +			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        +			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        +
        +			if ( oRange === "min" && this.orientation === "horizontal" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					width: valPercent + "%"
        +				}, o.animate );
        +			}
        +			if ( oRange === "max" && this.orientation === "horizontal" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					width: ( 100 - valPercent ) + "%"
        +				}, o.animate );
        +			}
        +			if ( oRange === "min" && this.orientation === "vertical" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					height: valPercent + "%"
        +				}, o.animate );
        +			}
        +			if ( oRange === "max" && this.orientation === "vertical" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					height: ( 100 - valPercent ) + "%"
        +				}, o.animate );
        +			}
        +		}
        +	},
        +
        +	_handleEvents: {
        +		keydown: function( event ) {
        +			var allowed, curVal, newVal, step,
        +				index = $( event.target ).data( "ui-slider-handle-index" );
        +
        +			switch ( event.keyCode ) {
        +				case $.ui.keyCode.HOME:
        +				case $.ui.keyCode.END:
        +				case $.ui.keyCode.PAGE_UP:
        +				case $.ui.keyCode.PAGE_DOWN:
        +				case $.ui.keyCode.UP:
        +				case $.ui.keyCode.RIGHT:
        +				case $.ui.keyCode.DOWN:
        +				case $.ui.keyCode.LEFT:
        +					event.preventDefault();
        +					if ( !this._keySliding ) {
        +						this._keySliding = true;
        +						this._addClass( $( event.target ), null, "ui-state-active" );
        +						allowed = this._start( event, index );
        +						if ( allowed === false ) {
        +							return;
        +						}
        +					}
        +					break;
        +			}
        +
        +			step = this.options.step;
        +			if ( this._hasMultipleValues() ) {
        +				curVal = newVal = this.values( index );
        +			} else {
        +				curVal = newVal = this.value();
        +			}
        +
        +			switch ( event.keyCode ) {
        +				case $.ui.keyCode.HOME:
        +					newVal = this._valueMin();
        +					break;
        +				case $.ui.keyCode.END:
        +					newVal = this._valueMax();
        +					break;
        +				case $.ui.keyCode.PAGE_UP:
        +					newVal = this._trimAlignValue(
        +						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
        +					);
        +					break;
        +				case $.ui.keyCode.PAGE_DOWN:
        +					newVal = this._trimAlignValue(
        +						curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );
        +					break;
        +				case $.ui.keyCode.UP:
        +				case $.ui.keyCode.RIGHT:
        +					if ( curVal === this._valueMax() ) {
        +						return;
        +					}
        +					newVal = this._trimAlignValue( curVal + step );
        +					break;
        +				case $.ui.keyCode.DOWN:
        +				case $.ui.keyCode.LEFT:
        +					if ( curVal === this._valueMin() ) {
        +						return;
        +					}
        +					newVal = this._trimAlignValue( curVal - step );
        +					break;
        +			}
        +
        +			this._slide( event, index, newVal );
        +		},
        +		keyup: function( event ) {
        +			var index = $( event.target ).data( "ui-slider-handle-index" );
        +
        +			if ( this._keySliding ) {
        +				this._keySliding = false;
        +				this._stop( event, index );
        +				this._change( event, index );
        +				this._removeClass( $( event.target ), null, "ui-state-active" );
        +			}
        +		}
        +	}
        +} );
        +
        +
        +/*!
        + * jQuery UI Sortable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Sortable
        +//>>group: Interactions
        +//>>description: Enables items in a list to be sorted using the mouse.
        +//>>docs: http://api.jqueryui.com/sortable/
        +//>>demos: http://jqueryui.com/sortable/
        +//>>css.structure: ../../themes/base/sortable.css
        +
        +
        +
        +var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "sort",
        +	ready: false,
        +	options: {
        +		appendTo: "parent",
        +		axis: false,
        +		connectWith: false,
        +		containment: false,
        +		cursor: "auto",
        +		cursorAt: false,
        +		dropOnEmpty: true,
        +		forcePlaceholderSize: false,
        +		forceHelperSize: false,
        +		grid: false,
        +		handle: false,
        +		helper: "original",
        +		items: "> *",
        +		opacity: false,
        +		placeholder: false,
        +		revert: false,
        +		scroll: true,
        +		scrollSensitivity: 20,
        +		scrollSpeed: 20,
        +		scope: "default",
        +		tolerance: "intersect",
        +		zIndex: 1000,
        +
        +		// Callbacks
        +		activate: null,
        +		beforeStop: null,
        +		change: null,
        +		deactivate: null,
        +		out: null,
        +		over: null,
        +		receive: null,
        +		remove: null,
        +		sort: null,
        +		start: null,
        +		stop: null,
        +		update: null
        +	},
        +
        +	_isOverAxis: function( x, reference, size ) {
        +		return ( x >= reference ) && ( x < ( reference + size ) );
        +	},
        +
        +	_isFloating: function( item ) {
        +		return ( /left|right/ ).test( item.css( "float" ) ) ||
        +			( /inline|table-cell/ ).test( item.css( "display" ) );
        +	},
        +
        +	_create: function() {
        +		this.containerCache = {};
        +		this._addClass( "ui-sortable" );
        +
        +		//Get the items
        +		this.refresh();
        +
        +		//Let's determine the parent's offset
        +		this.offset = this.element.offset();
        +
        +		//Initialize mouse events for interaction
        +		this._mouseInit();
        +
        +		this._setHandleClassName();
        +
        +		//We're ready to go
        +		this.ready = true;
        +
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +
        +		if ( key === "handle" ) {
        +			this._setHandleClassName();
        +		}
        +	},
        +
        +	_setHandleClassName: function() {
        +		var that = this;
        +		this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
        +		$.each( this.items, function() {
        +			that._addClass(
        +				this.instance.options.handle ?
        +					this.item.find( this.instance.options.handle ) :
        +					this.item,
        +				"ui-sortable-handle"
        +			);
        +		} );
        +	},
        +
        +	_destroy: function() {
        +		this._mouseDestroy();
        +
        +		for ( var i = this.items.length - 1; i >= 0; i-- ) {
        +			this.items[ i ].item.removeData( this.widgetName + "-item" );
        +		}
        +
        +		return this;
        +	},
        +
        +	_mouseCapture: function( event, overrideHandle ) {
        +		var currentItem = null,
        +			validHandle = false,
        +			that = this;
        +
        +		if ( this.reverting ) {
        +			return false;
        +		}
        +
        +		if ( this.options.disabled || this.options.type === "static" ) {
        +			return false;
        +		}
        +
        +		//We have to refresh the items data once first
        +		this._refreshItems( event );
        +
        +		//Find out if the clicked node (or one of its parents) is a actual item in this.items
        +		$( event.target ).parents().each( function() {
        +			if ( $.data( this, that.widgetName + "-item" ) === that ) {
        +				currentItem = $( this );
        +				return false;
        +			}
        +		} );
        +		if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
        +			currentItem = $( event.target );
        +		}
        +
        +		if ( !currentItem ) {
        +			return false;
        +		}
        +		if ( this.options.handle && !overrideHandle ) {
        +			$( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
        +				if ( this === event.target ) {
        +					validHandle = true;
        +				}
        +			} );
        +			if ( !validHandle ) {
        +				return false;
        +			}
        +		}
        +
        +		this.currentItem = currentItem;
        +		this._removeCurrentsFromItems();
        +		return true;
        +
        +	},
        +
        +	_mouseStart: function( event, overrideHandle, noActivation ) {
        +
        +		var i, body,
        +			o = this.options;
        +
        +		this.currentContainer = this;
        +
        +		//We only need to call refreshPositions, because the refreshItems call has been moved to
        +		// mouseCapture
        +		this.refreshPositions();
        +
        +		//Create and append the visible helper
        +		this.helper = this._createHelper( event );
        +
        +		//Cache the helper size
        +		this._cacheHelperProportions();
        +
        +		/*
        +		 * - Position generation -
        +		 * This block generates everything position related - it's the core of draggables.
        +		 */
        +
        +		//Cache the margins of the original element
        +		this._cacheMargins();
        +
        +		//Get the next scrolling parent
        +		this.scrollParent = this.helper.scrollParent();
        +
        +		//The element's absolute position on the page minus margins
        +		this.offset = this.currentItem.offset();
        +		this.offset = {
        +			top: this.offset.top - this.margins.top,
        +			left: this.offset.left - this.margins.left
        +		};
        +
        +		$.extend( this.offset, {
        +			click: { //Where the click happened, relative to the element
        +				left: event.pageX - this.offset.left,
        +				top: event.pageY - this.offset.top
        +			},
        +			parent: this._getParentOffset(),
        +
        +			// This is a relative to absolute position minus the actual position calculation -
        +			// only used for relative positioned helper
        +			relative: this._getRelativeOffset()
        +		} );
        +
        +		// Only after we got the offset, we can change the helper's position to absolute
        +		// TODO: Still need to figure out a way to make relative sorting possible
        +		this.helper.css( "position", "absolute" );
        +		this.cssPosition = this.helper.css( "position" );
        +
        +		//Generate the original position
        +		this.originalPosition = this._generatePosition( event );
        +		this.originalPageX = event.pageX;
        +		this.originalPageY = event.pageY;
        +
        +		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        +		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
        +
        +		//Cache the former DOM position
        +		this.domPosition = {
        +			prev: this.currentItem.prev()[ 0 ],
        +			parent: this.currentItem.parent()[ 0 ]
        +		};
        +
        +		// If the helper is not the original, hide the original so it's not playing any role during
        +		// the drag, won't cause anything bad this way
        +		if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
        +			this.currentItem.hide();
        +		}
        +
        +		//Create the placeholder
        +		this._createPlaceholder();
        +
        +		//Set a containment if given in the options
        +		if ( o.containment ) {
        +			this._setContainment();
        +		}
        +
        +		if ( o.cursor && o.cursor !== "auto" ) { // cursor option
        +			body = this.document.find( "body" );
        +
        +			// Support: IE
        +			this.storedCursor = body.css( "cursor" );
        +			body.css( "cursor", o.cursor );
        +
        +			this.storedStylesheet =
        +				$( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
        +		}
        +
        +		if ( o.opacity ) { // opacity option
        +			if ( this.helper.css( "opacity" ) ) {
        +				this._storedOpacity = this.helper.css( "opacity" );
        +			}
        +			this.helper.css( "opacity", o.opacity );
        +		}
        +
        +		if ( o.zIndex ) { // zIndex option
        +			if ( this.helper.css( "zIndex" ) ) {
        +				this._storedZIndex = this.helper.css( "zIndex" );
        +			}
        +			this.helper.css( "zIndex", o.zIndex );
        +		}
        +
        +		//Prepare scrolling
        +		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				this.scrollParent[ 0 ].tagName !== "HTML" ) {
        +			this.overflowOffset = this.scrollParent.offset();
        +		}
        +
        +		//Call callbacks
        +		this._trigger( "start", event, this._uiHash() );
        +
        +		//Recache the helper size
        +		if ( !this._preserveHelperProportions ) {
        +			this._cacheHelperProportions();
        +		}
        +
        +		//Post "activate" events to possible containers
        +		if ( !noActivation ) {
        +			for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
        +			}
        +		}
        +
        +		//Prepare possible droppables
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.current = this;
        +		}
        +
        +		if ( $.ui.ddmanager && !o.dropBehaviour ) {
        +			$.ui.ddmanager.prepareOffsets( this, event );
        +		}
        +
        +		this.dragging = true;
        +
        +		this._addClass( this.helper, "ui-sortable-helper" );
        +
        +		// Execute the drag once - this causes the helper not to be visiblebefore getting its
        +		// correct position
        +		this._mouseDrag( event );
        +		return true;
        +
        +	},
        +
        +	_mouseDrag: function( event ) {
        +		var i, item, itemElement, intersection,
        +			o = this.options,
        +			scrolled = false;
        +
        +		//Compute the helpers position
        +		this.position = this._generatePosition( event );
        +		this.positionAbs = this._convertPositionTo( "absolute" );
        +
        +		if ( !this.lastPositionAbs ) {
        +			this.lastPositionAbs = this.positionAbs;
        +		}
        +
        +		//Do scrolling
        +		if ( this.options.scroll ) {
        +			if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +					this.scrollParent[ 0 ].tagName !== "HTML" ) {
        +
        +				if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
        +						event.pageY < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollTop =
        +						scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
        +				} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollTop =
        +						scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
        +				}
        +
        +				if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
        +						event.pageX < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollLeft = scrolled =
        +						this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
        +				} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollLeft = scrolled =
        +						this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
        +				}
        +
        +			} else {
        +
        +				if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
        +					scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
        +				} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
        +				}
        +
        +				if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
        +					scrolled = this.document.scrollLeft(
        +						this.document.scrollLeft() - o.scrollSpeed
        +					);
        +				} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = this.document.scrollLeft(
        +						this.document.scrollLeft() + o.scrollSpeed
        +					);
        +				}
        +
        +			}
        +
        +			if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
        +				$.ui.ddmanager.prepareOffsets( this, event );
        +			}
        +		}
        +
        +		//Regenerate the absolute position used for position checks
        +		this.positionAbs = this._convertPositionTo( "absolute" );
        +
        +		//Set the helper position
        +		if ( !this.options.axis || this.options.axis !== "y" ) {
        +			this.helper[ 0 ].style.left = this.position.left + "px";
        +		}
        +		if ( !this.options.axis || this.options.axis !== "x" ) {
        +			this.helper[ 0 ].style.top = this.position.top + "px";
        +		}
        +
        +		//Rearrange
        +		for ( i = this.items.length - 1; i >= 0; i-- ) {
        +
        +			//Cache variables and intersection, continue if no intersection
        +			item = this.items[ i ];
        +			itemElement = item.item[ 0 ];
        +			intersection = this._intersectsWithPointer( item );
        +			if ( !intersection ) {
        +				continue;
        +			}
        +
        +			// Only put the placeholder inside the current Container, skip all
        +			// items from other containers. This works because when moving
        +			// an item from one container to another the
        +			// currentContainer is switched before the placeholder is moved.
        +			//
        +			// Without this, moving items in "sub-sortables" can cause
        +			// the placeholder to jitter between the outer and inner container.
        +			if ( item.instance !== this.currentContainer ) {
        +				continue;
        +			}
        +
        +			// Cannot intersect with itself
        +			// no useless actions that have been done before
        +			// no action if the item moved is the parent of the item checked
        +			if ( itemElement !== this.currentItem[ 0 ] &&
        +				this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement &&
        +				!$.contains( this.placeholder[ 0 ], itemElement ) &&
        +				( this.options.type === "semi-dynamic" ?
        +					!$.contains( this.element[ 0 ], itemElement ) :
        +					true
        +				)
        +			) {
        +
        +				this.direction = intersection === 1 ? "down" : "up";
        +
        +				if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) {
        +					this._rearrange( event, item );
        +				} else {
        +					break;
        +				}
        +
        +				this._trigger( "change", event, this._uiHash() );
        +				break;
        +			}
        +		}
        +
        +		//Post events to containers
        +		this._contactContainers( event );
        +
        +		//Interconnect with droppables
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.drag( this, event );
        +		}
        +
        +		//Call callbacks
        +		this._trigger( "sort", event, this._uiHash() );
        +
        +		this.lastPositionAbs = this.positionAbs;
        +		return false;
        +
        +	},
        +
        +	_mouseStop: function( event, noPropagation ) {
        +
        +		if ( !event ) {
        +			return;
        +		}
        +
        +		//If we are using droppables, inform the manager about the drop
        +		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
        +			$.ui.ddmanager.drop( this, event );
        +		}
        +
        +		if ( this.options.revert ) {
        +			var that = this,
        +				cur = this.placeholder.offset(),
        +				axis = this.options.axis,
        +				animation = {};
        +
        +			if ( !axis || axis === "x" ) {
        +				animation.left = cur.left - this.offset.parent.left - this.margins.left +
        +					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
        +						0 :
        +						this.offsetParent[ 0 ].scrollLeft
        +					);
        +			}
        +			if ( !axis || axis === "y" ) {
        +				animation.top = cur.top - this.offset.parent.top - this.margins.top +
        +					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
        +						0 :
        +						this.offsetParent[ 0 ].scrollTop
        +					);
        +			}
        +			this.reverting = true;
        +			$( this.helper ).animate(
        +				animation,
        +				parseInt( this.options.revert, 10 ) || 500,
        +				function() {
        +					that._clear( event );
        +				}
        +			);
        +		} else {
        +			this._clear( event, noPropagation );
        +		}
        +
        +		return false;
        +
        +	},
        +
        +	cancel: function() {
        +
        +		if ( this.dragging ) {
        +
        +			this._mouseUp( new $.Event( "mouseup", { target: null } ) );
        +
        +			if ( this.options.helper === "original" ) {
        +				this.currentItem.css( this._storedCSS );
        +				this._removeClass( this.currentItem, "ui-sortable-helper" );
        +			} else {
        +				this.currentItem.show();
        +			}
        +
        +			//Post deactivating events to containers
        +			for ( var i = this.containers.length - 1; i >= 0; i-- ) {
        +				this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
        +				if ( this.containers[ i ].containerCache.over ) {
        +					this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
        +					this.containers[ i ].containerCache.over = 0;
        +				}
        +			}
        +
        +		}
        +
        +		if ( this.placeholder ) {
        +
        +			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
        +			// it unbinds ALL events from the original node!
        +			if ( this.placeholder[ 0 ].parentNode ) {
        +				this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
        +			}
        +			if ( this.options.helper !== "original" && this.helper &&
        +					this.helper[ 0 ].parentNode ) {
        +				this.helper.remove();
        +			}
        +
        +			$.extend( this, {
        +				helper: null,
        +				dragging: false,
        +				reverting: false,
        +				_noFinalSort: null
        +			} );
        +
        +			if ( this.domPosition.prev ) {
        +				$( this.domPosition.prev ).after( this.currentItem );
        +			} else {
        +				$( this.domPosition.parent ).prepend( this.currentItem );
        +			}
        +		}
        +
        +		return this;
        +
        +	},
        +
        +	serialize: function( o ) {
        +
        +		var items = this._getItemsAsjQuery( o && o.connected ),
        +			str = [];
        +		o = o || {};
        +
        +		$( items ).each( function() {
        +			var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
        +				.match( o.expression || ( /(.+)[\-=_](.+)/ ) );
        +			if ( res ) {
        +				str.push(
        +					( o.key || res[ 1 ] + "[]" ) +
        +					"=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
        +			}
        +		} );
        +
        +		if ( !str.length && o.key ) {
        +			str.push( o.key + "=" );
        +		}
        +
        +		return str.join( "&" );
        +
        +	},
        +
        +	toArray: function( o ) {
        +
        +		var items = this._getItemsAsjQuery( o && o.connected ),
        +			ret = [];
        +
        +		o = o || {};
        +
        +		items.each( function() {
        +			ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
        +		} );
        +		return ret;
        +
        +	},
        +
        +	/* Be careful with the following core functions */
        +	_intersectsWith: function( item ) {
        +
        +		var x1 = this.positionAbs.left,
        +			x2 = x1 + this.helperProportions.width,
        +			y1 = this.positionAbs.top,
        +			y2 = y1 + this.helperProportions.height,
        +			l = item.left,
        +			r = l + item.width,
        +			t = item.top,
        +			b = t + item.height,
        +			dyClick = this.offset.click.top,
        +			dxClick = this.offset.click.left,
        +			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
        +				( y1 + dyClick ) < b ),
        +			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
        +				( x1 + dxClick ) < r ),
        +			isOverElement = isOverElementHeight && isOverElementWidth;
        +
        +		if ( this.options.tolerance === "pointer" ||
        +			this.options.forcePointerForContainers ||
        +			( this.options.tolerance !== "pointer" &&
        +				this.helperProportions[ this.floating ? "width" : "height" ] >
        +				item[ this.floating ? "width" : "height" ] )
        +		) {
        +			return isOverElement;
        +		} else {
        +
        +			return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
        +				x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
        +				t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
        +				y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
        +
        +		}
        +	},
        +
        +	_intersectsWithPointer: function( item ) {
        +		var verticalDirection, horizontalDirection,
        +			isOverElementHeight = ( this.options.axis === "x" ) ||
        +				this._isOverAxis(
        +					this.positionAbs.top + this.offset.click.top, item.top, item.height ),
        +			isOverElementWidth = ( this.options.axis === "y" ) ||
        +				this._isOverAxis(
        +					this.positionAbs.left + this.offset.click.left, item.left, item.width ),
        +			isOverElement = isOverElementHeight && isOverElementWidth;
        +
        +		if ( !isOverElement ) {
        +			return false;
        +		}
        +
        +		verticalDirection = this._getDragVerticalDirection();
        +		horizontalDirection = this._getDragHorizontalDirection();
        +
        +		return this.floating ?
        +			( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
        +			: ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
        +
        +	},
        +
        +	_intersectsWithSides: function( item ) {
        +
        +		var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
        +				this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
        +			isOverRightHalf = this._isOverAxis( this.positionAbs.left +
        +				this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
        +			verticalDirection = this._getDragVerticalDirection(),
        +			horizontalDirection = this._getDragHorizontalDirection();
        +
        +		if ( this.floating && horizontalDirection ) {
        +			return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
        +				( horizontalDirection === "left" && !isOverRightHalf ) );
        +		} else {
        +			return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
        +				( verticalDirection === "up" && !isOverBottomHalf ) );
        +		}
        +
        +	},
        +
        +	_getDragVerticalDirection: function() {
        +		var delta = this.positionAbs.top - this.lastPositionAbs.top;
        +		return delta !== 0 && ( delta > 0 ? "down" : "up" );
        +	},
        +
        +	_getDragHorizontalDirection: function() {
        +		var delta = this.positionAbs.left - this.lastPositionAbs.left;
        +		return delta !== 0 && ( delta > 0 ? "right" : "left" );
        +	},
        +
        +	refresh: function( event ) {
        +		this._refreshItems( event );
        +		this._setHandleClassName();
        +		this.refreshPositions();
        +		return this;
        +	},
        +
        +	_connectWith: function() {
        +		var options = this.options;
        +		return options.connectWith.constructor === String ?
        +			[ options.connectWith ] :
        +			options.connectWith;
        +	},
        +
        +	_getItemsAsjQuery: function( connected ) {
        +
        +		var i, j, cur, inst,
        +			items = [],
        +			queries = [],
        +			connectWith = this._connectWith();
        +
        +		if ( connectWith && connected ) {
        +			for ( i = connectWith.length - 1; i >= 0; i-- ) {
        +				cur = $( connectWith[ i ], this.document[ 0 ] );
        +				for ( j = cur.length - 1; j >= 0; j-- ) {
        +					inst = $.data( cur[ j ], this.widgetFullName );
        +					if ( inst && inst !== this && !inst.options.disabled ) {
        +						queries.push( [ $.isFunction( inst.options.items ) ?
        +							inst.options.items.call( inst.element ) :
        +							$( inst.options.items, inst.element )
        +								.not( ".ui-sortable-helper" )
        +								.not( ".ui-sortable-placeholder" ), inst ] );
        +					}
        +				}
        +			}
        +		}
        +
        +		queries.push( [ $.isFunction( this.options.items ) ?
        +			this.options.items
        +				.call( this.element, null, { options: this.options, item: this.currentItem } ) :
        +			$( this.options.items, this.element )
        +				.not( ".ui-sortable-helper" )
        +				.not( ".ui-sortable-placeholder" ), this ] );
        +
        +		function addItems() {
        +			items.push( this );
        +		}
        +		for ( i = queries.length - 1; i >= 0; i-- ) {
        +			queries[ i ][ 0 ].each( addItems );
        +		}
        +
        +		return $( items );
        +
        +	},
        +
        +	_removeCurrentsFromItems: function() {
        +
        +		var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
        +
        +		this.items = $.grep( this.items, function( item ) {
        +			for ( var j = 0; j < list.length; j++ ) {
        +				if ( list[ j ] === item.item[ 0 ] ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		} );
        +
        +	},
        +
        +	_refreshItems: function( event ) {
        +
        +		this.items = [];
        +		this.containers = [ this ];
        +
        +		var i, j, cur, inst, targetData, _queries, item, queriesLength,
        +			items = this.items,
        +			queries = [ [ $.isFunction( this.options.items ) ?
        +				this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
        +				$( this.options.items, this.element ), this ] ],
        +			connectWith = this._connectWith();
        +
        +		//Shouldn't be run the first time through due to massive slow-down
        +		if ( connectWith && this.ready ) {
        +			for ( i = connectWith.length - 1; i >= 0; i-- ) {
        +				cur = $( connectWith[ i ], this.document[ 0 ] );
        +				for ( j = cur.length - 1; j >= 0; j-- ) {
        +					inst = $.data( cur[ j ], this.widgetFullName );
        +					if ( inst && inst !== this && !inst.options.disabled ) {
        +						queries.push( [ $.isFunction( inst.options.items ) ?
        +							inst.options.items
        +								.call( inst.element[ 0 ], event, { item: this.currentItem } ) :
        +							$( inst.options.items, inst.element ), inst ] );
        +						this.containers.push( inst );
        +					}
        +				}
        +			}
        +		}
        +
        +		for ( i = queries.length - 1; i >= 0; i-- ) {
        +			targetData = queries[ i ][ 1 ];
        +			_queries = queries[ i ][ 0 ];
        +
        +			for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
        +				item = $( _queries[ j ] );
        +
        +				// Data for target checking (mouse manager)
        +				item.data( this.widgetName + "-item", targetData );
        +
        +				items.push( {
        +					item: item,
        +					instance: targetData,
        +					width: 0, height: 0,
        +					left: 0, top: 0
        +				} );
        +			}
        +		}
        +
        +	},
        +
        +	refreshPositions: function( fast ) {
        +
        +		// Determine whether items are being displayed horizontally
        +		this.floating = this.items.length ?
        +			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
        +			false;
        +
        +		//This has to be redone because due to the item being moved out/into the offsetParent,
        +		// the offsetParent's position will change
        +		if ( this.offsetParent && this.helper ) {
        +			this.offset.parent = this._getParentOffset();
        +		}
        +
        +		var i, item, t, p;
        +
        +		for ( i = this.items.length - 1; i >= 0; i-- ) {
        +			item = this.items[ i ];
        +
        +			//We ignore calculating positions of all connected containers when we're not over them
        +			if ( item.instance !== this.currentContainer && this.currentContainer &&
        +					item.item[ 0 ] !== this.currentItem[ 0 ] ) {
        +				continue;
        +			}
        +
        +			t = this.options.toleranceElement ?
        +				$( this.options.toleranceElement, item.item ) :
        +				item.item;
        +
        +			if ( !fast ) {
        +				item.width = t.outerWidth();
        +				item.height = t.outerHeight();
        +			}
        +
        +			p = t.offset();
        +			item.left = p.left;
        +			item.top = p.top;
        +		}
        +
        +		if ( this.options.custom && this.options.custom.refreshContainers ) {
        +			this.options.custom.refreshContainers.call( this );
        +		} else {
        +			for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +				p = this.containers[ i ].element.offset();
        +				this.containers[ i ].containerCache.left = p.left;
        +				this.containers[ i ].containerCache.top = p.top;
        +				this.containers[ i ].containerCache.width =
        +					this.containers[ i ].element.outerWidth();
        +				this.containers[ i ].containerCache.height =
        +					this.containers[ i ].element.outerHeight();
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	_createPlaceholder: function( that ) {
        +		that = that || this;
        +		var className,
        +			o = that.options;
        +
        +		if ( !o.placeholder || o.placeholder.constructor === String ) {
        +			className = o.placeholder;
        +			o.placeholder = {
        +				element: function() {
        +
        +					var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),
        +						element = $( "<" + nodeName + ">", that.document[ 0 ] );
        +
        +						that._addClass( element, "ui-sortable-placeholder",
        +								className || that.currentItem[ 0 ].className )
        +							._removeClass( element, "ui-sortable-helper" );
        +
        +					if ( nodeName === "tbody" ) {
        +						that._createTrPlaceholder(
        +							that.currentItem.find( "tr" ).eq( 0 ),
        +							$( "<tr>", that.document[ 0 ] ).appendTo( element )
        +						);
        +					} else if ( nodeName === "tr" ) {
        +						that._createTrPlaceholder( that.currentItem, element );
        +					} else if ( nodeName === "img" ) {
        +						element.attr( "src", that.currentItem.attr( "src" ) );
        +					}
        +
        +					if ( !className ) {
        +						element.css( "visibility", "hidden" );
        +					}
        +
        +					return element;
        +				},
        +				update: function( container, p ) {
        +
        +					// 1. If a className is set as 'placeholder option, we don't force sizes -
        +					// the class is responsible for that
        +					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a
        +					// class name is specified
        +					if ( className && !o.forcePlaceholderSize ) {
        +						return;
        +					}
        +
        +					//If the element doesn't have a actual height by itself (without styles coming
        +					// from a stylesheet), it receives the inline height from the dragged item
        +					if ( !p.height() ) {
        +						p.height(
        +							that.currentItem.innerHeight() -
        +							parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
        +							parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
        +					}
        +					if ( !p.width() ) {
        +						p.width(
        +							that.currentItem.innerWidth() -
        +							parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
        +							parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
        +					}
        +				}
        +			};
        +		}
        +
        +		//Create the placeholder
        +		that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
        +
        +		//Append it after the actual current item
        +		that.currentItem.after( that.placeholder );
        +
        +		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
        +		o.placeholder.update( that, that.placeholder );
        +
        +	},
        +
        +	_createTrPlaceholder: function( sourceTr, targetTr ) {
        +		var that = this;
        +
        +		sourceTr.children().each( function() {
        +			$( "<td>&#160;</td>", that.document[ 0 ] )
        +				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
        +				.appendTo( targetTr );
        +		} );
        +	},
        +
        +	_contactContainers: function( event ) {
        +		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
        +			floating, axis,
        +			innermostContainer = null,
        +			innermostIndex = null;
        +
        +		// Get innermost container that intersects with item
        +		for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +
        +			// Never consider a container that's located within the item itself
        +			if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
        +				continue;
        +			}
        +
        +			if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
        +
        +				// If we've already found a container and it's more "inner" than this, then continue
        +				if ( innermostContainer &&
        +						$.contains(
        +							this.containers[ i ].element[ 0 ],
        +							innermostContainer.element[ 0 ] ) ) {
        +					continue;
        +				}
        +
        +				innermostContainer = this.containers[ i ];
        +				innermostIndex = i;
        +
        +			} else {
        +
        +				// container doesn't intersect. trigger "out" event if necessary
        +				if ( this.containers[ i ].containerCache.over ) {
        +					this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
        +					this.containers[ i ].containerCache.over = 0;
        +				}
        +			}
        +
        +		}
        +
        +		// If no intersecting containers found, return
        +		if ( !innermostContainer ) {
        +			return;
        +		}
        +
        +		// Move the item into the container if it's not there already
        +		if ( this.containers.length === 1 ) {
        +			if ( !this.containers[ innermostIndex ].containerCache.over ) {
        +				this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
        +				this.containers[ innermostIndex ].containerCache.over = 1;
        +			}
        +		} else {
        +
        +			// When entering a new container, we will find the item with the least distance and
        +			// append our item near it
        +			dist = 10000;
        +			itemWithLeastDistance = null;
        +			floating = innermostContainer.floating || this._isFloating( this.currentItem );
        +			posProperty = floating ? "left" : "top";
        +			sizeProperty = floating ? "width" : "height";
        +			axis = floating ? "pageX" : "pageY";
        +
        +			for ( j = this.items.length - 1; j >= 0; j-- ) {
        +				if ( !$.contains(
        +						this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
        +				) {
        +					continue;
        +				}
        +				if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
        +					continue;
        +				}
        +
        +				cur = this.items[ j ].item.offset()[ posProperty ];
        +				nearBottom = false;
        +				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
        +					nearBottom = true;
        +				}
        +
        +				if ( Math.abs( event[ axis ] - cur ) < dist ) {
        +					dist = Math.abs( event[ axis ] - cur );
        +					itemWithLeastDistance = this.items[ j ];
        +					this.direction = nearBottom ? "up" : "down";
        +				}
        +			}
        +
        +			//Check if dropOnEmpty is enabled
        +			if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
        +				return;
        +			}
        +
        +			if ( this.currentContainer === this.containers[ innermostIndex ] ) {
        +				if ( !this.currentContainer.containerCache.over ) {
        +					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
        +					this.currentContainer.containerCache.over = 1;
        +				}
        +				return;
        +			}
        +
        +			itemWithLeastDistance ?
        +				this._rearrange( event, itemWithLeastDistance, null, true ) :
        +				this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
        +			this._trigger( "change", event, this._uiHash() );
        +			this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
        +			this.currentContainer = this.containers[ innermostIndex ];
        +
        +			//Update the placeholder
        +			this.options.placeholder.update( this.currentContainer, this.placeholder );
        +
        +			this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
        +			this.containers[ innermostIndex ].containerCache.over = 1;
        +		}
        +
        +	},
        +
        +	_createHelper: function( event ) {
        +
        +		var o = this.options,
        +			helper = $.isFunction( o.helper ) ?
        +				$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
        +				( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
        +
        +		//Add the helper to the DOM if that didn't happen already
        +		if ( !helper.parents( "body" ).length ) {
        +			$( o.appendTo !== "parent" ?
        +				o.appendTo :
        +				this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );
        +		}
        +
        +		if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
        +			this._storedCSS = {
        +				width: this.currentItem[ 0 ].style.width,
        +				height: this.currentItem[ 0 ].style.height,
        +				position: this.currentItem.css( "position" ),
        +				top: this.currentItem.css( "top" ),
        +				left: this.currentItem.css( "left" )
        +			};
        +		}
        +
        +		if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
        +			helper.width( this.currentItem.width() );
        +		}
        +		if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
        +			helper.height( this.currentItem.height() );
        +		}
        +
        +		return helper;
        +
        +	},
        +
        +	_adjustOffsetFromHelper: function( obj ) {
        +		if ( typeof obj === "string" ) {
        +			obj = obj.split( " " );
        +		}
        +		if ( $.isArray( obj ) ) {
        +			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
        +		}
        +		if ( "left" in obj ) {
        +			this.offset.click.left = obj.left + this.margins.left;
        +		}
        +		if ( "right" in obj ) {
        +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        +		}
        +		if ( "top" in obj ) {
        +			this.offset.click.top = obj.top + this.margins.top;
        +		}
        +		if ( "bottom" in obj ) {
        +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        +		}
        +	},
        +
        +	_getParentOffset: function() {
        +
        +		//Get the offsetParent and cache its position
        +		this.offsetParent = this.helper.offsetParent();
        +		var po = this.offsetParent.offset();
        +
        +		// This is a special case where we need to modify a offset calculated on start, since the
        +		// following happened:
        +		// 1. The position of the helper is absolute, so it's position is calculated based on the
        +		// next positioned parent
        +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
        +		// the document, which means that the scroll is included in the initial calculation of the
        +		// offset of the parent, and never recalculated upon drag
        +		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
        +			po.left += this.scrollParent.scrollLeft();
        +			po.top += this.scrollParent.scrollTop();
        +		}
        +
        +		// This needs to be actually done for all browsers, since pageX/pageY includes this
        +		// information with an ugly IE fix
        +		if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
        +				( this.offsetParent[ 0 ].tagName &&
        +				this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
        +			po = { top: 0, left: 0 };
        +		}
        +
        +		return {
        +			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
        +			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
        +		};
        +
        +	},
        +
        +	_getRelativeOffset: function() {
        +
        +		if ( this.cssPosition === "relative" ) {
        +			var p = this.currentItem.position();
        +			return {
        +				top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
        +					this.scrollParent.scrollTop(),
        +				left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
        +					this.scrollParent.scrollLeft()
        +			};
        +		} else {
        +			return { top: 0, left: 0 };
        +		}
        +
        +	},
        +
        +	_cacheMargins: function() {
        +		this.margins = {
        +			left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
        +			top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
        +		};
        +	},
        +
        +	_cacheHelperProportions: function() {
        +		this.helperProportions = {
        +			width: this.helper.outerWidth(),
        +			height: this.helper.outerHeight()
        +		};
        +	},
        +
        +	_setContainment: function() {
        +
        +		var ce, co, over,
        +			o = this.options;
        +		if ( o.containment === "parent" ) {
        +			o.containment = this.helper[ 0 ].parentNode;
        +		}
        +		if ( o.containment === "document" || o.containment === "window" ) {
        +			this.containment = [
        +				0 - this.offset.relative.left - this.offset.parent.left,
        +				0 - this.offset.relative.top - this.offset.parent.top,
        +				o.containment === "document" ?
        +					this.document.width() :
        +					this.window.width() - this.helperProportions.width - this.margins.left,
        +				( o.containment === "document" ?
        +					( this.document.height() || document.body.parentNode.scrollHeight ) :
        +					this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
        +				) - this.helperProportions.height - this.margins.top
        +			];
        +		}
        +
        +		if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
        +			ce = $( o.containment )[ 0 ];
        +			co = $( o.containment ).offset();
        +			over = ( $( ce ).css( "overflow" ) !== "hidden" );
        +
        +			this.containment = [
        +				co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
        +					( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
        +				co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
        +					( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
        +				co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
        +					( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
        +					( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
        +					this.helperProportions.width - this.margins.left,
        +				co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
        +					( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
        +					( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
        +					this.helperProportions.height - this.margins.top
        +			];
        +		}
        +
        +	},
        +
        +	_convertPositionTo: function( d, pos ) {
        +
        +		if ( !pos ) {
        +			pos = this.position;
        +		}
        +		var mod = d === "absolute" ? 1 : -1,
        +			scroll = this.cssPosition === "absolute" &&
        +				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
        +					this.offsetParent :
        +					this.scrollParent,
        +			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pos.top	+
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top * mod -
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollTop() :
        +					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pos.left +
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left * mod	-
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
        +					scroll.scrollLeft() ) * mod )
        +			)
        +		};
        +
        +	},
        +
        +	_generatePosition: function( event ) {
        +
        +		var top, left,
        +			o = this.options,
        +			pageX = event.pageX,
        +			pageY = event.pageY,
        +			scroll = this.cssPosition === "absolute" &&
        +				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
        +					this.offsetParent :
        +					this.scrollParent,
        +				scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
        +
        +		// This is another very weird special case that only happens for relative elements:
        +		// 1. If the css position is relative
        +		// 2. and the scroll parent is the document or similar to the offset parent
        +		// we have to refresh the relative offset during the scroll so there are no jumps
        +		if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
        +			this.offset.relative = this._getRelativeOffset();
        +		}
        +
        +		/*
        +		 * - Position constraining -
        +		 * Constrain the position to a mix of grid, containment.
        +		 */
        +
        +		if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
        +
        +			if ( this.containment ) {
        +				if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
        +					pageX = this.containment[ 0 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
        +					pageY = this.containment[ 1 ] + this.offset.click.top;
        +				}
        +				if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
        +					pageX = this.containment[ 2 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
        +					pageY = this.containment[ 3 ] + this.offset.click.top;
        +				}
        +			}
        +
        +			if ( o.grid ) {
        +				top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
        +					o.grid[ 1 ] ) * o.grid[ 1 ];
        +				pageY = this.containment ?
        +					( ( top - this.offset.click.top >= this.containment[ 1 ] &&
        +						top - this.offset.click.top <= this.containment[ 3 ] ) ?
        +							top :
        +							( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
        +								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
        +								top;
        +
        +				left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
        +					o.grid[ 0 ] ) * o.grid[ 0 ];
        +				pageX = this.containment ?
        +					( ( left - this.offset.click.left >= this.containment[ 0 ] &&
        +						left - this.offset.click.left <= this.containment[ 2 ] ) ?
        +							left :
        +							( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
        +								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
        +								left;
        +			}
        +
        +		}
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pageY -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.top -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top +
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollTop() :
        +					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pageX -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.left -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left +
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollLeft() :
        +					scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
        +			)
        +		};
        +
        +	},
        +
        +	_rearrange: function( event, i, a, hardRefresh ) {
        +
        +		a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :
        +			i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
        +				( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
        +
        +		//Various things done here to improve the performance:
        +		// 1. we create a setTimeout, that calls refreshPositions
        +		// 2. on the instance, we have a counter variable, that get's higher after every append
        +		// 3. on the local scope, we copy the counter variable, and check in the timeout,
        +		// if it's still the same
        +		// 4. this lets only the last addition to the timeout stack through
        +		this.counter = this.counter ? ++this.counter : 1;
        +		var counter = this.counter;
        +
        +		this._delay( function() {
        +			if ( counter === this.counter ) {
        +
        +				//Precompute after each DOM insertion, NOT on mousemove
        +				this.refreshPositions( !hardRefresh );
        +			}
        +		} );
        +
        +	},
        +
        +	_clear: function( event, noPropagation ) {
        +
        +		this.reverting = false;
        +
        +		// We delay all events that have to be triggered to after the point where the placeholder
        +		// has been removed and everything else normalized again
        +		var i,
        +			delayedTriggers = [];
        +
        +		// We first have to update the dom position of the actual currentItem
        +		// Note: don't do it if the current item is already removed (by a user), or it gets
        +		// reappended (see #4088)
        +		if ( !this._noFinalSort && this.currentItem.parent().length ) {
        +			this.placeholder.before( this.currentItem );
        +		}
        +		this._noFinalSort = null;
        +
        +		if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
        +			for ( i in this._storedCSS ) {
        +				if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
        +					this._storedCSS[ i ] = "";
        +				}
        +			}
        +			this.currentItem.css( this._storedCSS );
        +			this._removeClass( this.currentItem, "ui-sortable-helper" );
        +		} else {
        +			this.currentItem.show();
        +		}
        +
        +		if ( this.fromOutside && !noPropagation ) {
        +			delayedTriggers.push( function( event ) {
        +				this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
        +			} );
        +		}
        +		if ( ( this.fromOutside ||
        +				this.domPosition.prev !==
        +				this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
        +				this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
        +
        +			// Trigger update callback if the DOM position has changed
        +			delayedTriggers.push( function( event ) {
        +				this._trigger( "update", event, this._uiHash() );
        +			} );
        +		}
        +
        +		// Check if the items Container has Changed and trigger appropriate
        +		// events.
        +		if ( this !== this.currentContainer ) {
        +			if ( !noPropagation ) {
        +				delayedTriggers.push( function( event ) {
        +					this._trigger( "remove", event, this._uiHash() );
        +				} );
        +				delayedTriggers.push( ( function( c ) {
        +					return function( event ) {
        +						c._trigger( "receive", event, this._uiHash( this ) );
        +					};
        +				} ).call( this, this.currentContainer ) );
        +				delayedTriggers.push( ( function( c ) {
        +					return function( event ) {
        +						c._trigger( "update", event, this._uiHash( this ) );
        +					};
        +				} ).call( this, this.currentContainer ) );
        +			}
        +		}
        +
        +		//Post events to containers
        +		function delayEvent( type, instance, container ) {
        +			return function( event ) {
        +				container._trigger( type, event, instance._uiHash( instance ) );
        +			};
        +		}
        +		for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +			if ( !noPropagation ) {
        +				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
        +			}
        +			if ( this.containers[ i ].containerCache.over ) {
        +				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
        +				this.containers[ i ].containerCache.over = 0;
        +			}
        +		}
        +
        +		//Do what was originally in plugins
        +		if ( this.storedCursor ) {
        +			this.document.find( "body" ).css( "cursor", this.storedCursor );
        +			this.storedStylesheet.remove();
        +		}
        +		if ( this._storedOpacity ) {
        +			this.helper.css( "opacity", this._storedOpacity );
        +		}
        +		if ( this._storedZIndex ) {
        +			this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
        +		}
        +
        +		this.dragging = false;
        +
        +		if ( !noPropagation ) {
        +			this._trigger( "beforeStop", event, this._uiHash() );
        +		}
        +
        +		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
        +		// it unbinds ALL events from the original node!
        +		this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
        +
        +		if ( !this.cancelHelperRemoval ) {
        +			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
        +				this.helper.remove();
        +			}
        +			this.helper = null;
        +		}
        +
        +		if ( !noPropagation ) {
        +			for ( i = 0; i < delayedTriggers.length; i++ ) {
        +
        +				// Trigger all delayed events
        +				delayedTriggers[ i ].call( this, event );
        +			}
        +			this._trigger( "stop", event, this._uiHash() );
        +		}
        +
        +		this.fromOutside = false;
        +		return !this.cancelHelperRemoval;
        +
        +	},
        +
        +	_trigger: function() {
        +		if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
        +			this.cancel();
        +		}
        +	},
        +
        +	_uiHash: function( _inst ) {
        +		var inst = _inst || this;
        +		return {
        +			helper: inst.helper,
        +			placeholder: inst.placeholder || $( [] ),
        +			position: inst.position,
        +			originalPosition: inst.originalPosition,
        +			offset: inst.positionAbs,
        +			item: inst.currentItem,
        +			sender: _inst ? _inst.element : null
        +		};
        +	}
        +
        +} );
        +
        +
        +/*!
        + * jQuery UI Spinner 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Spinner
        +//>>group: Widgets
        +//>>description: Displays buttons to easily input numbers via the keyboard or mouse.
        +//>>docs: http://api.jqueryui.com/spinner/
        +//>>demos: http://jqueryui.com/spinner/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/spinner.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +function spinnerModifer( fn ) {
        +	return function() {
        +		var previous = this.element.val();
        +		fn.apply( this, arguments );
        +		this._refresh();
        +		if ( previous !== this.element.val() ) {
        +			this._trigger( "change" );
        +		}
        +	};
        +}
        +
        +$.widget( "ui.spinner", {
        +	version: "1.12.1",
        +	defaultElement: "<input>",
        +	widgetEventPrefix: "spin",
        +	options: {
        +		classes: {
        +			"ui-spinner": "ui-corner-all",
        +			"ui-spinner-down": "ui-corner-br",
        +			"ui-spinner-up": "ui-corner-tr"
        +		},
        +		culture: null,
        +		icons: {
        +			down: "ui-icon-triangle-1-s",
        +			up: "ui-icon-triangle-1-n"
        +		},
        +		incremental: true,
        +		max: null,
        +		min: null,
        +		numberFormat: null,
        +		page: 10,
        +		step: 1,
        +
        +		change: null,
        +		spin: null,
        +		start: null,
        +		stop: null
        +	},
        +
        +	_create: function() {
        +
        +		// handle string values that need to be parsed
        +		this._setOption( "max", this.options.max );
        +		this._setOption( "min", this.options.min );
        +		this._setOption( "step", this.options.step );
        +
        +		// Only format if there is a value, prevents the field from being marked
        +		// as invalid in Firefox, see #9573.
        +		if ( this.value() !== "" ) {
        +
        +			// Format the value, but don't constrain.
        +			this._value( this.element.val(), true );
        +		}
        +
        +		this._draw();
        +		this._on( this._events );
        +		this._refresh();
        +
        +		// Turning off autocomplete prevents the browser from remembering the
        +		// value when navigating through history, so we re-enable autocomplete
        +		// if the page is unloaded before the widget is destroyed. #7790
        +		this._on( this.window, {
        +			beforeunload: function() {
        +				this.element.removeAttr( "autocomplete" );
        +			}
        +		} );
        +	},
        +
        +	_getCreateOptions: function() {
        +		var options = this._super();
        +		var element = this.element;
        +
        +		$.each( [ "min", "max", "step" ], function( i, option ) {
        +			var value = element.attr( option );
        +			if ( value != null && value.length ) {
        +				options[ option ] = value;
        +			}
        +		} );
        +
        +		return options;
        +	},
        +
        +	_events: {
        +		keydown: function( event ) {
        +			if ( this._start( event ) && this._keydown( event ) ) {
        +				event.preventDefault();
        +			}
        +		},
        +		keyup: "_stop",
        +		focus: function() {
        +			this.previous = this.element.val();
        +		},
        +		blur: function( event ) {
        +			if ( this.cancelBlur ) {
        +				delete this.cancelBlur;
        +				return;
        +			}
        +
        +			this._stop();
        +			this._refresh();
        +			if ( this.previous !== this.element.val() ) {
        +				this._trigger( "change", event );
        +			}
        +		},
        +		mousewheel: function( event, delta ) {
        +			if ( !delta ) {
        +				return;
        +			}
        +			if ( !this.spinning && !this._start( event ) ) {
        +				return false;
        +			}
        +
        +			this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );
        +			clearTimeout( this.mousewheelTimer );
        +			this.mousewheelTimer = this._delay( function() {
        +				if ( this.spinning ) {
        +					this._stop( event );
        +				}
        +			}, 100 );
        +			event.preventDefault();
        +		},
        +		"mousedown .ui-spinner-button": function( event ) {
        +			var previous;
        +
        +			// We never want the buttons to have focus; whenever the user is
        +			// interacting with the spinner, the focus should be on the input.
        +			// If the input is focused then this.previous is properly set from
        +			// when the input first received focus. If the input is not focused
        +			// then we need to set this.previous based on the value before spinning.
        +			previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?
        +				this.previous : this.element.val();
        +			function checkFocus() {
        +				var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );
        +				if ( !isActive ) {
        +					this.element.trigger( "focus" );
        +					this.previous = previous;
        +
        +					// support: IE
        +					// IE sets focus asynchronously, so we need to check if focus
        +					// moved off of the input because the user clicked on the button.
        +					this._delay( function() {
        +						this.previous = previous;
        +					} );
        +				}
        +			}
        +
        +			// Ensure focus is on (or stays on) the text field
        +			event.preventDefault();
        +			checkFocus.call( this );
        +
        +			// Support: IE
        +			// IE doesn't prevent moving focus even with event.preventDefault()
        +			// so we set a flag to know when we should ignore the blur event
        +			// and check (again) if focus moved off of the input.
        +			this.cancelBlur = true;
        +			this._delay( function() {
        +				delete this.cancelBlur;
        +				checkFocus.call( this );
        +			} );
        +
        +			if ( this._start( event ) === false ) {
        +				return;
        +			}
        +
        +			this._repeat( null, $( event.currentTarget )
        +				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        +		},
        +		"mouseup .ui-spinner-button": "_stop",
        +		"mouseenter .ui-spinner-button": function( event ) {
        +
        +			// button will add ui-state-active if mouse was down while mouseleave and kept down
        +			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
        +				return;
        +			}
        +
        +			if ( this._start( event ) === false ) {
        +				return false;
        +			}
        +			this._repeat( null, $( event.currentTarget )
        +				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        +		},
        +
        +		// TODO: do we really want to consider this a stop?
        +		// shouldn't we just stop the repeater and wait until mouseup before
        +		// we trigger the stop event?
        +		"mouseleave .ui-spinner-button": "_stop"
        +	},
        +
        +	// Support mobile enhanced option and make backcompat more sane
        +	_enhance: function() {
        +		this.uiSpinner = this.element
        +			.attr( "autocomplete", "off" )
        +			.wrap( "<span>" )
        +			.parent()
        +
        +				// Add buttons
        +				.append(
        +					"<a></a><a></a>"
        +				);
        +	},
        +
        +	_draw: function() {
        +		this._enhance();
        +
        +		this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
        +		this._addClass( "ui-spinner-input" );
        +
        +		this.element.attr( "role", "spinbutton" );
        +
        +		// Button bindings
        +		this.buttons = this.uiSpinner.children( "a" )
        +			.attr( "tabIndex", -1 )
        +			.attr( "aria-hidden", true )
        +			.button( {
        +				classes: {
        +					"ui-button": ""
        +				}
        +			} );
        +
        +		// TODO: Right now button does not support classes this is already updated in button PR
        +		this._removeClass( this.buttons, "ui-corner-all" );
        +
        +		this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
        +		this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
        +		this.buttons.first().button( {
        +			"icon": this.options.icons.up,
        +			"showLabel": false
        +		} );
        +		this.buttons.last().button( {
        +			"icon": this.options.icons.down,
        +			"showLabel": false
        +		} );
        +
        +		// IE 6 doesn't understand height: 50% for the buttons
        +		// unless the wrapper has an explicit height
        +		if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
        +				this.uiSpinner.height() > 0 ) {
        +			this.uiSpinner.height( this.uiSpinner.height() );
        +		}
        +	},
        +
        +	_keydown: function( event ) {
        +		var options = this.options,
        +			keyCode = $.ui.keyCode;
        +
        +		switch ( event.keyCode ) {
        +		case keyCode.UP:
        +			this._repeat( null, 1, event );
        +			return true;
        +		case keyCode.DOWN:
        +			this._repeat( null, -1, event );
        +			return true;
        +		case keyCode.PAGE_UP:
        +			this._repeat( null, options.page, event );
        +			return true;
        +		case keyCode.PAGE_DOWN:
        +			this._repeat( null, -options.page, event );
        +			return true;
        +		}
        +
        +		return false;
        +	},
        +
        +	_start: function( event ) {
        +		if ( !this.spinning && this._trigger( "start", event ) === false ) {
        +			return false;
        +		}
        +
        +		if ( !this.counter ) {
        +			this.counter = 1;
        +		}
        +		this.spinning = true;
        +		return true;
        +	},
        +
        +	_repeat: function( i, steps, event ) {
        +		i = i || 500;
        +
        +		clearTimeout( this.timer );
        +		this.timer = this._delay( function() {
        +			this._repeat( 40, steps, event );
        +		}, i );
        +
        +		this._spin( steps * this.options.step, event );
        +	},
        +
        +	_spin: function( step, event ) {
        +		var value = this.value() || 0;
        +
        +		if ( !this.counter ) {
        +			this.counter = 1;
        +		}
        +
        +		value = this._adjustValue( value + step * this._increment( this.counter ) );
        +
        +		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) {
        +			this._value( value );
        +			this.counter++;
        +		}
        +	},
        +
        +	_increment: function( i ) {
        +		var incremental = this.options.incremental;
        +
        +		if ( incremental ) {
        +			return $.isFunction( incremental ) ?
        +				incremental( i ) :
        +				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
        +		}
        +
        +		return 1;
        +	},
        +
        +	_precision: function() {
        +		var precision = this._precisionOf( this.options.step );
        +		if ( this.options.min !== null ) {
        +			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        +		}
        +		return precision;
        +	},
        +
        +	_precisionOf: function( num ) {
        +		var str = num.toString(),
        +			decimal = str.indexOf( "." );
        +		return decimal === -1 ? 0 : str.length - decimal - 1;
        +	},
        +
        +	_adjustValue: function( value ) {
        +		var base, aboveMin,
        +			options = this.options;
        +
        +		// Make sure we're at a valid step
        +		// - find out where we are relative to the base (min or 0)
        +		base = options.min !== null ? options.min : 0;
        +		aboveMin = value - base;
        +
        +		// - round to the nearest step
        +		aboveMin = Math.round( aboveMin / options.step ) * options.step;
        +
        +		// - rounding is based on 0, so adjust back to our base
        +		value = base + aboveMin;
        +
        +		// Fix precision from bad JS floating point math
        +		value = parseFloat( value.toFixed( this._precision() ) );
        +
        +		// Clamp the value
        +		if ( options.max !== null && value > options.max ) {
        +			return options.max;
        +		}
        +		if ( options.min !== null && value < options.min ) {
        +			return options.min;
        +		}
        +
        +		return value;
        +	},
        +
        +	_stop: function( event ) {
        +		if ( !this.spinning ) {
        +			return;
        +		}
        +
        +		clearTimeout( this.timer );
        +		clearTimeout( this.mousewheelTimer );
        +		this.counter = 0;
        +		this.spinning = false;
        +		this._trigger( "stop", event );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var prevValue, first, last;
        +
        +		if ( key === "culture" || key === "numberFormat" ) {
        +			prevValue = this._parse( this.element.val() );
        +			this.options[ key ] = value;
        +			this.element.val( this._format( prevValue ) );
        +			return;
        +		}
        +
        +		if ( key === "max" || key === "min" || key === "step" ) {
        +			if ( typeof value === "string" ) {
        +				value = this._parse( value );
        +			}
        +		}
        +		if ( key === "icons" ) {
        +			first = this.buttons.first().find( ".ui-icon" );
        +			this._removeClass( first, null, this.options.icons.up );
        +			this._addClass( first, null, value.up );
        +			last = this.buttons.last().find( ".ui-icon" );
        +			this._removeClass( last, null, this.options.icons.down );
        +			this._addClass( last, null, value.down );
        +		}
        +
        +		this._super( key, value );
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
        +		this.element.prop( "disabled", !!value );
        +		this.buttons.button( value ? "disable" : "enable" );
        +	},
        +
        +	_setOptions: spinnerModifer( function( options ) {
        +		this._super( options );
        +	} ),
        +
        +	_parse: function( val ) {
        +		if ( typeof val === "string" && val !== "" ) {
        +			val = window.Globalize && this.options.numberFormat ?
        +				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
        +		}
        +		return val === "" || isNaN( val ) ? null : val;
        +	},
        +
        +	_format: function( value ) {
        +		if ( value === "" ) {
        +			return "";
        +		}
        +		return window.Globalize && this.options.numberFormat ?
        +			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
        +			value;
        +	},
        +
        +	_refresh: function() {
        +		this.element.attr( {
        +			"aria-valuemin": this.options.min,
        +			"aria-valuemax": this.options.max,
        +
        +			// TODO: what should we do with values that can't be parsed?
        +			"aria-valuenow": this._parse( this.element.val() )
        +		} );
        +	},
        +
        +	isValid: function() {
        +		var value = this.value();
        +
        +		// Null is invalid
        +		if ( value === null ) {
        +			return false;
        +		}
        +
        +		// If value gets adjusted, it's invalid
        +		return value === this._adjustValue( value );
        +	},
        +
        +	// Update the value without triggering change
        +	_value: function( value, allowAny ) {
        +		var parsed;
        +		if ( value !== "" ) {
        +			parsed = this._parse( value );
        +			if ( parsed !== null ) {
        +				if ( !allowAny ) {
        +					parsed = this._adjustValue( parsed );
        +				}
        +				value = this._format( parsed );
        +			}
        +		}
        +		this.element.val( value );
        +		this._refresh();
        +	},
        +
        +	_destroy: function() {
        +		this.element
        +			.prop( "disabled", false )
        +			.removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" );
        +
        +		this.uiSpinner.replaceWith( this.element );
        +	},
        +
        +	stepUp: spinnerModifer( function( steps ) {
        +		this._stepUp( steps );
        +	} ),
        +	_stepUp: function( steps ) {
        +		if ( this._start() ) {
        +			this._spin( ( steps || 1 ) * this.options.step );
        +			this._stop();
        +		}
        +	},
        +
        +	stepDown: spinnerModifer( function( steps ) {
        +		this._stepDown( steps );
        +	} ),
        +	_stepDown: function( steps ) {
        +		if ( this._start() ) {
        +			this._spin( ( steps || 1 ) * -this.options.step );
        +			this._stop();
        +		}
        +	},
        +
        +	pageUp: spinnerModifer( function( pages ) {
        +		this._stepUp( ( pages || 1 ) * this.options.page );
        +	} ),
        +
        +	pageDown: spinnerModifer( function( pages ) {
        +		this._stepDown( ( pages || 1 ) * this.options.page );
        +	} ),
        +
        +	value: function( newVal ) {
        +		if ( !arguments.length ) {
        +			return this._parse( this.element.val() );
        +		}
        +		spinnerModifer( this._value ).call( this, newVal );
        +	},
        +
        +	widget: function() {
        +		return this.uiSpinner;
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for spinner html extension points
        +	$.widget( "ui.spinner", $.ui.spinner, {
        +		_enhance: function() {
        +			this.uiSpinner = this.element
        +				.attr( "autocomplete", "off" )
        +				.wrap( this._uiSpinnerHtml() )
        +				.parent()
        +
        +					// Add buttons
        +					.append( this._buttonHtml() );
        +		},
        +		_uiSpinnerHtml: function() {
        +			return "<span>";
        +		},
        +
        +		_buttonHtml: function() {
        +			return "<a></a><a></a>";
        +		}
        +	} );
        +}
        +
        +var widgetsSpinner = $.ui.spinner;
        +
        +
        +/*!
        + * jQuery UI Tabs 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Tabs
        +//>>group: Widgets
        +//>>description: Transforms a set of container elements into a tab structure.
        +//>>docs: http://api.jqueryui.com/tabs/
        +//>>demos: http://jqueryui.com/tabs/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/tabs.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.widget( "ui.tabs", {
        +	version: "1.12.1",
        +	delay: 300,
        +	options: {
        +		active: null,
        +		classes: {
        +			"ui-tabs": "ui-corner-all",
        +			"ui-tabs-nav": "ui-corner-all",
        +			"ui-tabs-panel": "ui-corner-bottom",
        +			"ui-tabs-tab": "ui-corner-top"
        +		},
        +		collapsible: false,
        +		event: "click",
        +		heightStyle: "content",
        +		hide: null,
        +		show: null,
        +
        +		// Callbacks
        +		activate: null,
        +		beforeActivate: null,
        +		beforeLoad: null,
        +		load: null
        +	},
        +
        +	_isLocal: ( function() {
        +		var rhash = /#.*$/;
        +
        +		return function( anchor ) {
        +			var anchorUrl, locationUrl;
        +
        +			anchorUrl = anchor.href.replace( rhash, "" );
        +			locationUrl = location.href.replace( rhash, "" );
        +
        +			// Decoding may throw an error if the URL isn't UTF-8 (#9518)
        +			try {
        +				anchorUrl = decodeURIComponent( anchorUrl );
        +			} catch ( error ) {}
        +			try {
        +				locationUrl = decodeURIComponent( locationUrl );
        +			} catch ( error ) {}
        +
        +			return anchor.hash.length > 1 && anchorUrl === locationUrl;
        +		};
        +	} )(),
        +
        +	_create: function() {
        +		var that = this,
        +			options = this.options;
        +
        +		this.running = false;
        +
        +		this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
        +		this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
        +
        +		this._processTabs();
        +		options.active = this._initialActive();
        +
        +		// Take disabling tabs via class attribute from HTML
        +		// into account and update option properly.
        +		if ( $.isArray( options.disabled ) ) {
        +			options.disabled = $.unique( options.disabled.concat(
        +				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
        +					return that.tabs.index( li );
        +				} )
        +			) ).sort();
        +		}
        +
        +		// Check for length avoids error when initializing empty list
        +		if ( this.options.active !== false && this.anchors.length ) {
        +			this.active = this._findActive( options.active );
        +		} else {
        +			this.active = $();
        +		}
        +
        +		this._refresh();
        +
        +		if ( this.active.length ) {
        +			this.load( options.active );
        +		}
        +	},
        +
        +	_initialActive: function() {
        +		var active = this.options.active,
        +			collapsible = this.options.collapsible,
        +			locationHash = location.hash.substring( 1 );
        +
        +		if ( active === null ) {
        +
        +			// check the fragment identifier in the URL
        +			if ( locationHash ) {
        +				this.tabs.each( function( i, tab ) {
        +					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
        +						active = i;
        +						return false;
        +					}
        +				} );
        +			}
        +
        +			// Check for a tab marked active via a class
        +			if ( active === null ) {
        +				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
        +			}
        +
        +			// No active tab, set to false
        +			if ( active === null || active === -1 ) {
        +				active = this.tabs.length ? 0 : false;
        +			}
        +		}
        +
        +		// Handle numbers: negative, out of range
        +		if ( active !== false ) {
        +			active = this.tabs.index( this.tabs.eq( active ) );
        +			if ( active === -1 ) {
        +				active = collapsible ? false : 0;
        +			}
        +		}
        +
        +		// Don't allow collapsible: false and active: false
        +		if ( !collapsible && active === false && this.anchors.length ) {
        +			active = 0;
        +		}
        +
        +		return active;
        +	},
        +
        +	_getCreateEventData: function() {
        +		return {
        +			tab: this.active,
        +			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
        +		};
        +	},
        +
        +	_tabKeydown: function( event ) {
        +		var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
        +			selectedIndex = this.tabs.index( focusedTab ),
        +			goingForward = true;
        +
        +		if ( this._handlePageNav( event ) ) {
        +			return;
        +		}
        +
        +		switch ( event.keyCode ) {
        +		case $.ui.keyCode.RIGHT:
        +		case $.ui.keyCode.DOWN:
        +			selectedIndex++;
        +			break;
        +		case $.ui.keyCode.UP:
        +		case $.ui.keyCode.LEFT:
        +			goingForward = false;
        +			selectedIndex--;
        +			break;
        +		case $.ui.keyCode.END:
        +			selectedIndex = this.anchors.length - 1;
        +			break;
        +		case $.ui.keyCode.HOME:
        +			selectedIndex = 0;
        +			break;
        +		case $.ui.keyCode.SPACE:
        +
        +			// Activate only, no collapsing
        +			event.preventDefault();
        +			clearTimeout( this.activating );
        +			this._activate( selectedIndex );
        +			return;
        +		case $.ui.keyCode.ENTER:
        +
        +			// Toggle (cancel delayed activation, allow collapsing)
        +			event.preventDefault();
        +			clearTimeout( this.activating );
        +
        +			// Determine if we should collapse or activate
        +			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
        +			return;
        +		default:
        +			return;
        +		}
        +
        +		// Focus the appropriate tab, based on which key was pressed
        +		event.preventDefault();
        +		clearTimeout( this.activating );
        +		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
        +
        +		// Navigating with control/command key will prevent automatic activation
        +		if ( !event.ctrlKey && !event.metaKey ) {
        +
        +			// Update aria-selected immediately so that AT think the tab is already selected.
        +			// Otherwise AT may confuse the user by stating that they need to activate the tab,
        +			// but the tab will already be activated by the time the announcement finishes.
        +			focusedTab.attr( "aria-selected", "false" );
        +			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
        +
        +			this.activating = this._delay( function() {
        +				this.option( "active", selectedIndex );
        +			}, this.delay );
        +		}
        +	},
        +
        +	_panelKeydown: function( event ) {
        +		if ( this._handlePageNav( event ) ) {
        +			return;
        +		}
        +
        +		// Ctrl+up moves focus to the current tab
        +		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
        +			event.preventDefault();
        +			this.active.trigger( "focus" );
        +		}
        +	},
        +
        +	// Alt+page up/down moves focus to the previous/next tab (and activates)
        +	_handlePageNav: function( event ) {
        +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
        +			this._activate( this._focusNextTab( this.options.active - 1, false ) );
        +			return true;
        +		}
        +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
        +			this._activate( this._focusNextTab( this.options.active + 1, true ) );
        +			return true;
        +		}
        +	},
        +
        +	_findNextTab: function( index, goingForward ) {
        +		var lastTabIndex = this.tabs.length - 1;
        +
        +		function constrain() {
        +			if ( index > lastTabIndex ) {
        +				index = 0;
        +			}
        +			if ( index < 0 ) {
        +				index = lastTabIndex;
        +			}
        +			return index;
        +		}
        +
        +		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
        +			index = goingForward ? index + 1 : index - 1;
        +		}
        +
        +		return index;
        +	},
        +
        +	_focusNextTab: function( index, goingForward ) {
        +		index = this._findNextTab( index, goingForward );
        +		this.tabs.eq( index ).trigger( "focus" );
        +		return index;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "active" ) {
        +
        +			// _activate() will handle invalid values and update this.options
        +			this._activate( value );
        +			return;
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "collapsible" ) {
        +			this._toggleClass( "ui-tabs-collapsible", null, value );
        +
        +			// Setting collapsible: false while collapsed; open first panel
        +			if ( !value && this.options.active === false ) {
        +				this._activate( 0 );
        +			}
        +		}
        +
        +		if ( key === "event" ) {
        +			this._setupEvents( value );
        +		}
        +
        +		if ( key === "heightStyle" ) {
        +			this._setupHeightStyle( value );
        +		}
        +	},
        +
        +	_sanitizeSelector: function( hash ) {
        +		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
        +	},
        +
        +	refresh: function() {
        +		var options = this.options,
        +			lis = this.tablist.children( ":has(a[href])" );
        +
        +		// Get disabled tabs from class attribute from HTML
        +		// this will get converted to a boolean if needed in _refresh()
        +		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
        +			return lis.index( tab );
        +		} );
        +
        +		this._processTabs();
        +
        +		// Was collapsed or no tabs
        +		if ( options.active === false || !this.anchors.length ) {
        +			options.active = false;
        +			this.active = $();
        +
        +		// was active, but active tab is gone
        +		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
        +
        +			// all remaining tabs are disabled
        +			if ( this.tabs.length === options.disabled.length ) {
        +				options.active = false;
        +				this.active = $();
        +
        +			// activate previous tab
        +			} else {
        +				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
        +			}
        +
        +		// was active, active tab still exists
        +		} else {
        +
        +			// make sure active index is correct
        +			options.active = this.tabs.index( this.active );
        +		}
        +
        +		this._refresh();
        +	},
        +
        +	_refresh: function() {
        +		this._setOptionDisabled( this.options.disabled );
        +		this._setupEvents( this.options.event );
        +		this._setupHeightStyle( this.options.heightStyle );
        +
        +		this.tabs.not( this.active ).attr( {
        +			"aria-selected": "false",
        +			"aria-expanded": "false",
        +			tabIndex: -1
        +		} );
        +		this.panels.not( this._getPanelForTab( this.active ) )
        +			.hide()
        +			.attr( {
        +				"aria-hidden": "true"
        +			} );
        +
        +		// Make sure one tab is in the tab order
        +		if ( !this.active.length ) {
        +			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
        +		} else {
        +			this.active
        +				.attr( {
        +					"aria-selected": "true",
        +					"aria-expanded": "true",
        +					tabIndex: 0
        +				} );
        +			this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
        +			this._getPanelForTab( this.active )
        +				.show()
        +				.attr( {
        +					"aria-hidden": "false"
        +				} );
        +		}
        +	},
        +
        +	_processTabs: function() {
        +		var that = this,
        +			prevTabs = this.tabs,
        +			prevAnchors = this.anchors,
        +			prevPanels = this.panels;
        +
        +		this.tablist = this._getList().attr( "role", "tablist" );
        +		this._addClass( this.tablist, "ui-tabs-nav",
        +			"ui-helper-reset ui-helper-clearfix ui-widget-header" );
        +
        +		// Prevent users from focusing disabled tabs via click
        +		this.tablist
        +			.on( "mousedown" + this.eventNamespace, "> li", function( event ) {
        +				if ( $( this ).is( ".ui-state-disabled" ) ) {
        +					event.preventDefault();
        +				}
        +			} )
        +
        +			// Support: IE <9
        +			// Preventing the default action in mousedown doesn't prevent IE
        +			// from focusing the element, so if the anchor gets focused, blur.
        +			// We don't have to worry about focusing the previously focused
        +			// element since clicking on a non-focusable element should focus
        +			// the body anyway.
        +			.on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
        +				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
        +					this.blur();
        +				}
        +			} );
        +
        +		this.tabs = this.tablist.find( "> li:has(a[href])" )
        +			.attr( {
        +				role: "tab",
        +				tabIndex: -1
        +			} );
        +		this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
        +
        +		this.anchors = this.tabs.map( function() {
        +			return $( "a", this )[ 0 ];
        +		} )
        +			.attr( {
        +				role: "presentation",
        +				tabIndex: -1
        +			} );
        +		this._addClass( this.anchors, "ui-tabs-anchor" );
        +
        +		this.panels = $();
        +
        +		this.anchors.each( function( i, anchor ) {
        +			var selector, panel, panelId,
        +				anchorId = $( anchor ).uniqueId().attr( "id" ),
        +				tab = $( anchor ).closest( "li" ),
        +				originalAriaControls = tab.attr( "aria-controls" );
        +
        +			// Inline tab
        +			if ( that._isLocal( anchor ) ) {
        +				selector = anchor.hash;
        +				panelId = selector.substring( 1 );
        +				panel = that.element.find( that._sanitizeSelector( selector ) );
        +
        +			// remote tab
        +			} else {
        +
        +				// If the tab doesn't already have aria-controls,
        +				// generate an id by using a throw-away element
        +				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
        +				selector = "#" + panelId;
        +				panel = that.element.find( selector );
        +				if ( !panel.length ) {
        +					panel = that._createPanel( panelId );
        +					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
        +				}
        +				panel.attr( "aria-live", "polite" );
        +			}
        +
        +			if ( panel.length ) {
        +				that.panels = that.panels.add( panel );
        +			}
        +			if ( originalAriaControls ) {
        +				tab.data( "ui-tabs-aria-controls", originalAriaControls );
        +			}
        +			tab.attr( {
        +				"aria-controls": panelId,
        +				"aria-labelledby": anchorId
        +			} );
        +			panel.attr( "aria-labelledby", anchorId );
        +		} );
        +
        +		this.panels.attr( "role", "tabpanel" );
        +		this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
        +
        +		// Avoid memory leaks (#10056)
        +		if ( prevTabs ) {
        +			this._off( prevTabs.not( this.tabs ) );
        +			this._off( prevAnchors.not( this.anchors ) );
        +			this._off( prevPanels.not( this.panels ) );
        +		}
        +	},
        +
        +	// Allow overriding how to find the list for rare usage scenarios (#7715)
        +	_getList: function() {
        +		return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
        +	},
        +
        +	_createPanel: function( id ) {
        +		return $( "<div>" )
        +			.attr( "id", id )
        +			.data( "ui-tabs-destroy", true );
        +	},
        +
        +	_setOptionDisabled: function( disabled ) {
        +		var currentItem, li, i;
        +
        +		if ( $.isArray( disabled ) ) {
        +			if ( !disabled.length ) {
        +				disabled = false;
        +			} else if ( disabled.length === this.anchors.length ) {
        +				disabled = true;
        +			}
        +		}
        +
        +		// Disable tabs
        +		for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
        +			currentItem = $( li );
        +			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
        +				currentItem.attr( "aria-disabled", "true" );
        +				this._addClass( currentItem, null, "ui-state-disabled" );
        +			} else {
        +				currentItem.removeAttr( "aria-disabled" );
        +				this._removeClass( currentItem, null, "ui-state-disabled" );
        +			}
        +		}
        +
        +		this.options.disabled = disabled;
        +
        +		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
        +			disabled === true );
        +	},
        +
        +	_setupEvents: function( event ) {
        +		var events = {};
        +		if ( event ) {
        +			$.each( event.split( " " ), function( index, eventName ) {
        +				events[ eventName ] = "_eventHandler";
        +			} );
        +		}
        +
        +		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
        +
        +		// Always prevent the default action, even when disabled
        +		this._on( true, this.anchors, {
        +			click: function( event ) {
        +				event.preventDefault();
        +			}
        +		} );
        +		this._on( this.anchors, events );
        +		this._on( this.tabs, { keydown: "_tabKeydown" } );
        +		this._on( this.panels, { keydown: "_panelKeydown" } );
        +
        +		this._focusable( this.tabs );
        +		this._hoverable( this.tabs );
        +	},
        +
        +	_setupHeightStyle: function( heightStyle ) {
        +		var maxHeight,
        +			parent = this.element.parent();
        +
        +		if ( heightStyle === "fill" ) {
        +			maxHeight = parent.height();
        +			maxHeight -= this.element.outerHeight() - this.element.height();
        +
        +			this.element.siblings( ":visible" ).each( function() {
        +				var elem = $( this ),
        +					position = elem.css( "position" );
        +
        +				if ( position === "absolute" || position === "fixed" ) {
        +					return;
        +				}
        +				maxHeight -= elem.outerHeight( true );
        +			} );
        +
        +			this.element.children().not( this.panels ).each( function() {
        +				maxHeight -= $( this ).outerHeight( true );
        +			} );
        +
        +			this.panels.each( function() {
        +				$( this ).height( Math.max( 0, maxHeight -
        +					$( this ).innerHeight() + $( this ).height() ) );
        +			} )
        +				.css( "overflow", "auto" );
        +		} else if ( heightStyle === "auto" ) {
        +			maxHeight = 0;
        +			this.panels.each( function() {
        +				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
        +			} ).height( maxHeight );
        +		}
        +	},
        +
        +	_eventHandler: function( event ) {
        +		var options = this.options,
        +			active = this.active,
        +			anchor = $( event.currentTarget ),
        +			tab = anchor.closest( "li" ),
        +			clickedIsActive = tab[ 0 ] === active[ 0 ],
        +			collapsing = clickedIsActive && options.collapsible,
        +			toShow = collapsing ? $() : this._getPanelForTab( tab ),
        +			toHide = !active.length ? $() : this._getPanelForTab( active ),
        +			eventData = {
        +				oldTab: active,
        +				oldPanel: toHide,
        +				newTab: collapsing ? $() : tab,
        +				newPanel: toShow
        +			};
        +
        +		event.preventDefault();
        +
        +		if ( tab.hasClass( "ui-state-disabled" ) ||
        +
        +				// tab is already loading
        +				tab.hasClass( "ui-tabs-loading" ) ||
        +
        +				// can't switch durning an animation
        +				this.running ||
        +
        +				// click on active header, but not collapsible
        +				( clickedIsActive && !options.collapsible ) ||
        +
        +				// allow canceling activation
        +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        +			return;
        +		}
        +
        +		options.active = collapsing ? false : this.tabs.index( tab );
        +
        +		this.active = clickedIsActive ? $() : tab;
        +		if ( this.xhr ) {
        +			this.xhr.abort();
        +		}
        +
        +		if ( !toHide.length && !toShow.length ) {
        +			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
        +		}
        +
        +		if ( toShow.length ) {
        +			this.load( this.tabs.index( tab ), event );
        +		}
        +		this._toggle( event, eventData );
        +	},
        +
        +	// Handles show/hide for selecting tabs
        +	_toggle: function( event, eventData ) {
        +		var that = this,
        +			toShow = eventData.newPanel,
        +			toHide = eventData.oldPanel;
        +
        +		this.running = true;
        +
        +		function complete() {
        +			that.running = false;
        +			that._trigger( "activate", event, eventData );
        +		}
        +
        +		function show() {
        +			that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
        +
        +			if ( toShow.length && that.options.show ) {
        +				that._show( toShow, that.options.show, complete );
        +			} else {
        +				toShow.show();
        +				complete();
        +			}
        +		}
        +
        +		// Start out by hiding, then showing, then completing
        +		if ( toHide.length && this.options.hide ) {
        +			this._hide( toHide, this.options.hide, function() {
        +				that._removeClass( eventData.oldTab.closest( "li" ),
        +					"ui-tabs-active", "ui-state-active" );
        +				show();
        +			} );
        +		} else {
        +			this._removeClass( eventData.oldTab.closest( "li" ),
        +				"ui-tabs-active", "ui-state-active" );
        +			toHide.hide();
        +			show();
        +		}
        +
        +		toHide.attr( "aria-hidden", "true" );
        +		eventData.oldTab.attr( {
        +			"aria-selected": "false",
        +			"aria-expanded": "false"
        +		} );
        +
        +		// If we're switching tabs, remove the old tab from the tab order.
        +		// If we're opening from collapsed state, remove the previous tab from the tab order.
        +		// If we're collapsing, then keep the collapsing tab in the tab order.
        +		if ( toShow.length && toHide.length ) {
        +			eventData.oldTab.attr( "tabIndex", -1 );
        +		} else if ( toShow.length ) {
        +			this.tabs.filter( function() {
        +				return $( this ).attr( "tabIndex" ) === 0;
        +			} )
        +				.attr( "tabIndex", -1 );
        +		}
        +
        +		toShow.attr( "aria-hidden", "false" );
        +		eventData.newTab.attr( {
        +			"aria-selected": "true",
        +			"aria-expanded": "true",
        +			tabIndex: 0
        +		} );
        +	},
        +
        +	_activate: function( index ) {
        +		var anchor,
        +			active = this._findActive( index );
        +
        +		// Trying to activate the already active panel
        +		if ( active[ 0 ] === this.active[ 0 ] ) {
        +			return;
        +		}
        +
        +		// Trying to collapse, simulate a click on the current active header
        +		if ( !active.length ) {
        +			active = this.active;
        +		}
        +
        +		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
        +		this._eventHandler( {
        +			target: anchor,
        +			currentTarget: anchor,
        +			preventDefault: $.noop
        +		} );
        +	},
        +
        +	_findActive: function( index ) {
        +		return index === false ? $() : this.tabs.eq( index );
        +	},
        +
        +	_getIndex: function( index ) {
        +
        +		// meta-function to give users option to provide a href string instead of a numerical index.
        +		if ( typeof index === "string" ) {
        +			index = this.anchors.index( this.anchors.filter( "[href$='" +
        +				$.ui.escapeSelector( index ) + "']" ) );
        +		}
        +
        +		return index;
        +	},
        +
        +	_destroy: function() {
        +		if ( this.xhr ) {
        +			this.xhr.abort();
        +		}
        +
        +		this.tablist
        +			.removeAttr( "role" )
        +			.off( this.eventNamespace );
        +
        +		this.anchors
        +			.removeAttr( "role tabIndex" )
        +			.removeUniqueId();
        +
        +		this.tabs.add( this.panels ).each( function() {
        +			if ( $.data( this, "ui-tabs-destroy" ) ) {
        +				$( this ).remove();
        +			} else {
        +				$( this ).removeAttr( "role tabIndex " +
        +					"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
        +			}
        +		} );
        +
        +		this.tabs.each( function() {
        +			var li = $( this ),
        +				prev = li.data( "ui-tabs-aria-controls" );
        +			if ( prev ) {
        +				li
        +					.attr( "aria-controls", prev )
        +					.removeData( "ui-tabs-aria-controls" );
        +			} else {
        +				li.removeAttr( "aria-controls" );
        +			}
        +		} );
        +
        +		this.panels.show();
        +
        +		if ( this.options.heightStyle !== "content" ) {
        +			this.panels.css( "height", "" );
        +		}
        +	},
        +
        +	enable: function( index ) {
        +		var disabled = this.options.disabled;
        +		if ( disabled === false ) {
        +			return;
        +		}
        +
        +		if ( index === undefined ) {
        +			disabled = false;
        +		} else {
        +			index = this._getIndex( index );
        +			if ( $.isArray( disabled ) ) {
        +				disabled = $.map( disabled, function( num ) {
        +					return num !== index ? num : null;
        +				} );
        +			} else {
        +				disabled = $.map( this.tabs, function( li, num ) {
        +					return num !== index ? num : null;
        +				} );
        +			}
        +		}
        +		this._setOptionDisabled( disabled );
        +	},
        +
        +	disable: function( index ) {
        +		var disabled = this.options.disabled;
        +		if ( disabled === true ) {
        +			return;
        +		}
        +
        +		if ( index === undefined ) {
        +			disabled = true;
        +		} else {
        +			index = this._getIndex( index );
        +			if ( $.inArray( index, disabled ) !== -1 ) {
        +				return;
        +			}
        +			if ( $.isArray( disabled ) ) {
        +				disabled = $.merge( [ index ], disabled ).sort();
        +			} else {
        +				disabled = [ index ];
        +			}
        +		}
        +		this._setOptionDisabled( disabled );
        +	},
        +
        +	load: function( index, event ) {
        +		index = this._getIndex( index );
        +		var that = this,
        +			tab = this.tabs.eq( index ),
        +			anchor = tab.find( ".ui-tabs-anchor" ),
        +			panel = this._getPanelForTab( tab ),
        +			eventData = {
        +				tab: tab,
        +				panel: panel
        +			},
        +			complete = function( jqXHR, status ) {
        +				if ( status === "abort" ) {
        +					that.panels.stop( false, true );
        +				}
        +
        +				that._removeClass( tab, "ui-tabs-loading" );
        +				panel.removeAttr( "aria-busy" );
        +
        +				if ( jqXHR === that.xhr ) {
        +					delete that.xhr;
        +				}
        +			};
        +
        +		// Not remote
        +		if ( this._isLocal( anchor[ 0 ] ) ) {
        +			return;
        +		}
        +
        +		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
        +
        +		// Support: jQuery <1.8
        +		// jQuery <1.8 returns false if the request is canceled in beforeSend,
        +		// but as of 1.8, $.ajax() always returns a jqXHR object.
        +		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
        +			this._addClass( tab, "ui-tabs-loading" );
        +			panel.attr( "aria-busy", "true" );
        +
        +			this.xhr
        +				.done( function( response, status, jqXHR ) {
        +
        +					// support: jQuery <1.8
        +					// http://bugs.jquery.com/ticket/11778
        +					setTimeout( function() {
        +						panel.html( response );
        +						that._trigger( "load", event, eventData );
        +
        +						complete( jqXHR, status );
        +					}, 1 );
        +				} )
        +				.fail( function( jqXHR, status ) {
        +
        +					// support: jQuery <1.8
        +					// http://bugs.jquery.com/ticket/11778
        +					setTimeout( function() {
        +						complete( jqXHR, status );
        +					}, 1 );
        +				} );
        +		}
        +	},
        +
        +	_ajaxSettings: function( anchor, event, eventData ) {
        +		var that = this;
        +		return {
        +
        +			// Support: IE <11 only
        +			// Strip any hash that exists to prevent errors with the Ajax request
        +			url: anchor.attr( "href" ).replace( /#.*$/, "" ),
        +			beforeSend: function( jqXHR, settings ) {
        +				return that._trigger( "beforeLoad", event,
        +					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
        +			}
        +		};
        +	},
        +
        +	_getPanelForTab: function( tab ) {
        +		var id = $( tab ).attr( "aria-controls" );
        +		return this.element.find( this._sanitizeSelector( "#" + id ) );
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: Switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for ui-tab class (now ui-tabs-tab)
        +	$.widget( "ui.tabs", $.ui.tabs, {
        +		_processTabs: function() {
        +			this._superApply( arguments );
        +			this._addClass( this.tabs, "ui-tab" );
        +		}
        +	} );
        +}
        +
        +var widgetsTabs = $.ui.tabs;
        +
        +
        +/*!
        + * jQuery UI Tooltip 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Tooltip
        +//>>group: Widgets
        +//>>description: Shows additional information for any element on hover or focus.
        +//>>docs: http://api.jqueryui.com/tooltip/
        +//>>demos: http://jqueryui.com/tooltip/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/tooltip.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +
        +
        +$.widget( "ui.tooltip", {
        +	version: "1.12.1",
        +	options: {
        +		classes: {
        +			"ui-tooltip": "ui-corner-all ui-widget-shadow"
        +		},
        +		content: function() {
        +
        +			// support: IE<9, Opera in jQuery <1.7
        +			// .text() can't accept undefined, so coerce to a string
        +			var title = $( this ).attr( "title" ) || "";
        +
        +			// Escape title, since we're going from an attribute to raw HTML
        +			return $( "<a>" ).text( title ).html();
        +		},
        +		hide: true,
        +
        +		// Disabled elements have inconsistent behavior across browsers (#8661)
        +		items: "[title]:not([disabled])",
        +		position: {
        +			my: "left top+15",
        +			at: "left bottom",
        +			collision: "flipfit flip"
        +		},
        +		show: true,
        +		track: false,
        +
        +		// Callbacks
        +		close: null,
        +		open: null
        +	},
        +
        +	_addDescribedBy: function( elem, id ) {
        +		var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ );
        +		describedby.push( id );
        +		elem
        +			.data( "ui-tooltip-id", id )
        +			.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
        +	},
        +
        +	_removeDescribedBy: function( elem ) {
        +		var id = elem.data( "ui-tooltip-id" ),
        +			describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ),
        +			index = $.inArray( id, describedby );
        +
        +		if ( index !== -1 ) {
        +			describedby.splice( index, 1 );
        +		}
        +
        +		elem.removeData( "ui-tooltip-id" );
        +		describedby = $.trim( describedby.join( " " ) );
        +		if ( describedby ) {
        +			elem.attr( "aria-describedby", describedby );
        +		} else {
        +			elem.removeAttr( "aria-describedby" );
        +		}
        +	},
        +
        +	_create: function() {
        +		this._on( {
        +			mouseover: "open",
        +			focusin: "open"
        +		} );
        +
        +		// IDs of generated tooltips, needed for destroy
        +		this.tooltips = {};
        +
        +		// IDs of parent tooltips where we removed the title attribute
        +		this.parents = {};
        +
        +		// Append the aria-live region so tooltips announce correctly
        +		this.liveRegion = $( "<div>" )
        +			.attr( {
        +				role: "log",
        +				"aria-live": "assertive",
        +				"aria-relevant": "additions"
        +			} )
        +			.appendTo( this.document[ 0 ].body );
        +		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
        +
        +		this.disabledTitles = $( [] );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var that = this;
        +
        +		this._super( key, value );
        +
        +		if ( key === "content" ) {
        +			$.each( this.tooltips, function( id, tooltipData ) {
        +				that._updateContent( tooltipData.element );
        +			} );
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this[ value ? "_disable" : "_enable" ]();
        +	},
        +
        +	_disable: function() {
        +		var that = this;
        +
        +		// Close open tooltips
        +		$.each( this.tooltips, function( id, tooltipData ) {
        +			var event = $.Event( "blur" );
        +			event.target = event.currentTarget = tooltipData.element[ 0 ];
        +			that.close( event, true );
        +		} );
        +
        +		// Remove title attributes to prevent native tooltips
        +		this.disabledTitles = this.disabledTitles.add(
        +			this.element.find( this.options.items ).addBack()
        +				.filter( function() {
        +					var element = $( this );
        +					if ( element.is( "[title]" ) ) {
        +						return element
        +							.data( "ui-tooltip-title", element.attr( "title" ) )
        +							.removeAttr( "title" );
        +					}
        +				} )
        +		);
        +	},
        +
        +	_enable: function() {
        +
        +		// restore title attributes
        +		this.disabledTitles.each( function() {
        +			var element = $( this );
        +			if ( element.data( "ui-tooltip-title" ) ) {
        +				element.attr( "title", element.data( "ui-tooltip-title" ) );
        +			}
        +		} );
        +		this.disabledTitles = $( [] );
        +	},
        +
        +	open: function( event ) {
        +		var that = this,
        +			target = $( event ? event.target : this.element )
        +
        +				// we need closest here due to mouseover bubbling,
        +				// but always pointing at the same event target
        +				.closest( this.options.items );
        +
        +		// No element to show a tooltip for or the tooltip is already open
        +		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
        +			return;
        +		}
        +
        +		if ( target.attr( "title" ) ) {
        +			target.data( "ui-tooltip-title", target.attr( "title" ) );
        +		}
        +
        +		target.data( "ui-tooltip-open", true );
        +
        +		// Kill parent tooltips, custom or native, for hover
        +		if ( event && event.type === "mouseover" ) {
        +			target.parents().each( function() {
        +				var parent = $( this ),
        +					blurEvent;
        +				if ( parent.data( "ui-tooltip-open" ) ) {
        +					blurEvent = $.Event( "blur" );
        +					blurEvent.target = blurEvent.currentTarget = this;
        +					that.close( blurEvent, true );
        +				}
        +				if ( parent.attr( "title" ) ) {
        +					parent.uniqueId();
        +					that.parents[ this.id ] = {
        +						element: this,
        +						title: parent.attr( "title" )
        +					};
        +					parent.attr( "title", "" );
        +				}
        +			} );
        +		}
        +
        +		this._registerCloseHandlers( event, target );
        +		this._updateContent( target, event );
        +	},
        +
        +	_updateContent: function( target, event ) {
        +		var content,
        +			contentOption = this.options.content,
        +			that = this,
        +			eventType = event ? event.type : null;
        +
        +		if ( typeof contentOption === "string" || contentOption.nodeType ||
        +				contentOption.jquery ) {
        +			return this._open( event, target, contentOption );
        +		}
        +
        +		content = contentOption.call( target[ 0 ], function( response ) {
        +
        +			// IE may instantly serve a cached response for ajax requests
        +			// delay this call to _open so the other call to _open runs first
        +			that._delay( function() {
        +
        +				// Ignore async response if tooltip was closed already
        +				if ( !target.data( "ui-tooltip-open" ) ) {
        +					return;
        +				}
        +
        +				// JQuery creates a special event for focusin when it doesn't
        +				// exist natively. To improve performance, the native event
        +				// object is reused and the type is changed. Therefore, we can't
        +				// rely on the type being correct after the event finished
        +				// bubbling, so we set it back to the previous value. (#8740)
        +				if ( event ) {
        +					event.type = eventType;
        +				}
        +				this._open( event, target, response );
        +			} );
        +		} );
        +		if ( content ) {
        +			this._open( event, target, content );
        +		}
        +	},
        +
        +	_open: function( event, target, content ) {
        +		var tooltipData, tooltip, delayedShow, a11yContent,
        +			positionOption = $.extend( {}, this.options.position );
        +
        +		if ( !content ) {
        +			return;
        +		}
        +
        +		// Content can be updated multiple times. If the tooltip already
        +		// exists, then just update the content and bail.
        +		tooltipData = this._find( target );
        +		if ( tooltipData ) {
        +			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
        +			return;
        +		}
        +
        +		// If we have a title, clear it to prevent the native tooltip
        +		// we have to check first to avoid defining a title if none exists
        +		// (we don't want to cause an element to start matching [title])
        +		//
        +		// We use removeAttr only for key events, to allow IE to export the correct
        +		// accessible attributes. For mouse events, set to empty string to avoid
        +		// native tooltip showing up (happens only when removing inside mouseover).
        +		if ( target.is( "[title]" ) ) {
        +			if ( event && event.type === "mouseover" ) {
        +				target.attr( "title", "" );
        +			} else {
        +				target.removeAttr( "title" );
        +			}
        +		}
        +
        +		tooltipData = this._tooltip( target );
        +		tooltip = tooltipData.tooltip;
        +		this._addDescribedBy( target, tooltip.attr( "id" ) );
        +		tooltip.find( ".ui-tooltip-content" ).html( content );
        +
        +		// Support: Voiceover on OS X, JAWS on IE <= 9
        +		// JAWS announces deletions even when aria-relevant="additions"
        +		// Voiceover will sometimes re-read the entire log region's contents from the beginning
        +		this.liveRegion.children().hide();
        +		a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() );
        +		a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" );
        +		a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
        +		a11yContent.appendTo( this.liveRegion );
        +
        +		function position( event ) {
        +			positionOption.of = event;
        +			if ( tooltip.is( ":hidden" ) ) {
        +				return;
        +			}
        +			tooltip.position( positionOption );
        +		}
        +		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
        +			this._on( this.document, {
        +				mousemove: position
        +			} );
        +
        +			// trigger once to override element-relative positioning
        +			position( event );
        +		} else {
        +			tooltip.position( $.extend( {
        +				of: target
        +			}, this.options.position ) );
        +		}
        +
        +		tooltip.hide();
        +
        +		this._show( tooltip, this.options.show );
        +
        +		// Handle tracking tooltips that are shown with a delay (#8644). As soon
        +		// as the tooltip is visible, position the tooltip using the most recent
        +		// event.
        +		// Adds the check to add the timers only when both delay and track options are set (#14682)
        +		if ( this.options.track && this.options.show && this.options.show.delay ) {
        +			delayedShow = this.delayedShow = setInterval( function() {
        +				if ( tooltip.is( ":visible" ) ) {
        +					position( positionOption.of );
        +					clearInterval( delayedShow );
        +				}
        +			}, $.fx.interval );
        +		}
        +
        +		this._trigger( "open", event, { tooltip: tooltip } );
        +	},
        +
        +	_registerCloseHandlers: function( event, target ) {
        +		var events = {
        +			keyup: function( event ) {
        +				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
        +					var fakeEvent = $.Event( event );
        +					fakeEvent.currentTarget = target[ 0 ];
        +					this.close( fakeEvent, true );
        +				}
        +			}
        +		};
        +
        +		// Only bind remove handler for delegated targets. Non-delegated
        +		// tooltips will handle this in destroy.
        +		if ( target[ 0 ] !== this.element[ 0 ] ) {
        +			events.remove = function() {
        +				this._removeTooltip( this._find( target ).tooltip );
        +			};
        +		}
        +
        +		if ( !event || event.type === "mouseover" ) {
        +			events.mouseleave = "close";
        +		}
        +		if ( !event || event.type === "focusin" ) {
        +			events.focusout = "close";
        +		}
        +		this._on( true, target, events );
        +	},
        +
        +	close: function( event ) {
        +		var tooltip,
        +			that = this,
        +			target = $( event ? event.currentTarget : this.element ),
        +			tooltipData = this._find( target );
        +
        +		// The tooltip may already be closed
        +		if ( !tooltipData ) {
        +
        +			// We set ui-tooltip-open immediately upon open (in open()), but only set the
        +			// additional data once there's actually content to show (in _open()). So even if the
        +			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
        +			// the period between open() and _open().
        +			target.removeData( "ui-tooltip-open" );
        +			return;
        +		}
        +
        +		tooltip = tooltipData.tooltip;
        +
        +		// Disabling closes the tooltip, so we need to track when we're closing
        +		// to avoid an infinite loop in case the tooltip becomes disabled on close
        +		if ( tooltipData.closing ) {
        +			return;
        +		}
        +
        +		// Clear the interval for delayed tracking tooltips
        +		clearInterval( this.delayedShow );
        +
        +		// Only set title if we had one before (see comment in _open())
        +		// If the title attribute has changed since open(), don't restore
        +		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
        +			target.attr( "title", target.data( "ui-tooltip-title" ) );
        +		}
        +
        +		this._removeDescribedBy( target );
        +
        +		tooltipData.hiding = true;
        +		tooltip.stop( true );
        +		this._hide( tooltip, this.options.hide, function() {
        +			that._removeTooltip( $( this ) );
        +		} );
        +
        +		target.removeData( "ui-tooltip-open" );
        +		this._off( target, "mouseleave focusout keyup" );
        +
        +		// Remove 'remove' binding only on delegated targets
        +		if ( target[ 0 ] !== this.element[ 0 ] ) {
        +			this._off( target, "remove" );
        +		}
        +		this._off( this.document, "mousemove" );
        +
        +		if ( event && event.type === "mouseleave" ) {
        +			$.each( this.parents, function( id, parent ) {
        +				$( parent.element ).attr( "title", parent.title );
        +				delete that.parents[ id ];
        +			} );
        +		}
        +
        +		tooltipData.closing = true;
        +		this._trigger( "close", event, { tooltip: tooltip } );
        +		if ( !tooltipData.hiding ) {
        +			tooltipData.closing = false;
        +		}
        +	},
        +
        +	_tooltip: function( element ) {
        +		var tooltip = $( "<div>" ).attr( "role", "tooltip" ),
        +			content = $( "<div>" ).appendTo( tooltip ),
        +			id = tooltip.uniqueId().attr( "id" );
        +
        +		this._addClass( content, "ui-tooltip-content" );
        +		this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" );
        +
        +		tooltip.appendTo( this._appendTo( element ) );
        +
        +		return this.tooltips[ id ] = {
        +			element: element,
        +			tooltip: tooltip
        +		};
        +	},
        +
        +	_find: function( target ) {
        +		var id = target.data( "ui-tooltip-id" );
        +		return id ? this.tooltips[ id ] : null;
        +	},
        +
        +	_removeTooltip: function( tooltip ) {
        +		tooltip.remove();
        +		delete this.tooltips[ tooltip.attr( "id" ) ];
        +	},
        +
        +	_appendTo: function( target ) {
        +		var element = target.closest( ".ui-front, dialog" );
        +
        +		if ( !element.length ) {
        +			element = this.document[ 0 ].body;
        +		}
        +
        +		return element;
        +	},
        +
        +	_destroy: function() {
        +		var that = this;
        +
        +		// Close open tooltips
        +		$.each( this.tooltips, function( id, tooltipData ) {
        +
        +			// Delegate to close method to handle common cleanup
        +			var event = $.Event( "blur" ),
        +				element = tooltipData.element;
        +			event.target = event.currentTarget = element[ 0 ];
        +			that.close( event, true );
        +
        +			// Remove immediately; destroying an open tooltip doesn't use the
        +			// hide animation
        +			$( "#" + id ).remove();
        +
        +			// Restore the title
        +			if ( element.data( "ui-tooltip-title" ) ) {
        +
        +				// If the title attribute has changed since open(), don't restore
        +				if ( !element.attr( "title" ) ) {
        +					element.attr( "title", element.data( "ui-tooltip-title" ) );
        +				}
        +				element.removeData( "ui-tooltip-title" );
        +			}
        +		} );
        +		this.liveRegion.remove();
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: Switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for tooltipClass option
        +	$.widget( "ui.tooltip", $.ui.tooltip, {
        +		options: {
        +			tooltipClass: null
        +		},
        +		_tooltip: function() {
        +			var tooltipData = this._superApply( arguments );
        +			if ( this.options.tooltipClass ) {
        +				tooltipData.tooltip.addClass( this.options.tooltipClass );
        +			}
        +			return tooltipData;
        +		}
        +	} );
        +}
        +
        +var widgetsTooltip = $.ui.tooltip;
        +
        +
        +
        +
        +}));
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/jquery-ui.min.js b/bower_components/jquery-ui/jquery-ui.min.js
        new file mode 100644
        index 0000000000..25398a1674
        --- /dev/null
        +++ b/bower_components/jquery-ui/jquery-ui.min.js
        @@ -0,0 +1,13 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,g,m,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),k={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,g=_.offset,m=t.extend({},g),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),k[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?m.left+=p:"center"===n.at[0]&&(m.left+=p/2),"bottom"===n.at[1]?m.top+=f:"center"===n.at[1]&&(m.top+=f/2),u=e(k.at,p,f),m.left+=u[0],m.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),x=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},m),I=e(k.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=I[0],D.top+=I[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:x,collisionHeight:C,offset:[u[0]+I[0],u[1]+I[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=g.left-D.left,i=e+p-l,s=g.top-D.top,r=s+f-c,u={target:{element:v,left:g.left,top:g.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(p),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(p.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(d)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(c+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(c+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)
        +}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var f=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t("<span>"),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},u=l&&c.down||c,d=function(){a._toggleComplete(i)};return"number"==typeof u&&(o=u),"string"==typeof u&&(n=u),n=n||u.easing||c.easing,o=o||u.duration||c.duration,e.length?t.length?(s=t.show().outerHeight(),e.animate(this.hideProps,{duration:o,easing:n,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(this.showProps,{duration:o,easing:n,complete:d,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==a.options.heightStyle&&(i.now=Math.round(s-e.outerHeight()-r),r=0)}}),void 0):e.animate(this.hideProps,o,n,d):t.animate(this.showProps,o,n,d)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,"ui-accordion-content-active"),this._removeClass(i,"ui-accordion-header-active")._addClass(i,"ui-accordion-header-collapsed"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("<span>").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)},_filterMenuItems:function(e){var i=e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(t.trim(t(this).children(".ui-menu-item-wrapper").text()))})}}),t.widget("ui.autocomplete",{version:"1.12.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;
        +this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return t.proxy(function(t){e===this.requestIndex&&this.__response(t),this.pending--,this.pending||this._removeClass("ui-autocomplete-loading")},this)},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({},e,{label:e.label||e.value,value:e.value||e.label})})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<div>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("<div>").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var g=/ui-corner-([a-z]){2,6}/g;t.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"<div>",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(s,n){var o,a={};return n?"controlgroupLabel"===s?(o=e.element.find(n),o.each(function(){var e=t(this);e.children(".ui-controlgroup-label-contents").length||e.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>")}),e._addClass(o,null,"ui-widget ui-widget-content ui-state-default"),i=i.concat(o.get()),void 0):(t.fn[s]&&(a=e["_"+s+"Options"]?e["_"+s+"Options"]("middle"):{classes:{}},e.element.find(n).each(function(){var n=t(this),o=n[s]("instance"),r=t.widget.extend({},a);if("button"!==s||!n.parent(".ui-spinner").length){o||(o=n[s]()[s]("instance")),o&&(r.classes=e._resolveClassesValues(r.classes,o)),n[s](r);var h=n[s]("widget");t.data(h[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(h[0])}})),void 0):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),s=i.data("ui-controlgroup-data");s&&s[e]&&s[e]()})},_updateCornerClass:function(t,e){var i="ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all",s=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,i),this._addClass(t,null,s)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,"ui-spinner");return e.classes["ui-spinner-up"]="",e.classes["ui-spinner-down"]="",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e?"auto":!1,classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(e,i){var s={};return t.each(e,function(n){var o=i.options.classes[n]||"";o=t.trim(o.replace(g,"")),s[n]=(o+" "+e[n]).replace(/\s+/g," ")}),s},_setOption:function(t,e){return"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"===t?(this._callChildMethod(e?"disable":"enable"),void 0):(this.refresh(),void 0)},refresh:function(){var e,i=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(":visible")),e.length&&(t.each(["first","last"],function(t,s){var n=e[s]().data("ui-controlgroup-data");if(n&&i["_"+n.widgetName+"Options"]){var o=i["_"+n.widgetName+"Options"](1===e.length?"only":s);o.classes=i._resolveClassesValues(o.classes,n),n.element[n.widgetName](o)}else i._updateCornerClass(e[s](),s)}),this._callChildMethod("refresh"))}}),t.widget("ui.checkboxradio",[t.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var e,i,s=this,n=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){s.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(n.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(n.disabled=e),n},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===e&&/radio|checkbox/.test(this.type)||t.error("Can't create checkboxradio on element.nodeName="+e+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,s="input[name='"+t.ui.escapeSelector(i)+"']";return i?(e=this.form.length?t(this.form[0].elements).filter(s):t(s).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",e),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",e)._toggleClass(this.icon,null,"ui-icon-blank",!e),"radio"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio("instance");e&&e._removeClass(e.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return"label"!==t||e?(this._super(t,e),"disabled"===t?(this._toggleClass(this.label,null,"ui-state-disabled",e),this.element[0].disabled=e,void 0):(this.refresh(),void 0)):void 0},_updateIcon:function(e){var i="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=t("<span>"),this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(i+=e?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,e?"ui-icon-blank":"ui-icon-check")):i+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",i),e||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget("ui.button",{version:"1.12.1",defaultElement:"<button>",options:{classes:{"ui-button":"ui-corner-all"},disabled:null,icon:null,iconPosition:"beginning",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is("input"),t=this.element[0].disabled,null!=t&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr("title"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass("ui-button","ui-widget"),this._setOption("disabled",this.options.disabled),this._enhance(),this.element.is("a")&&this._on({keyup:function(e){e.keyCode===t.ui.keyCode.SPACE&&(e.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger("click"))}})},_enhance:function(){this.element.is("button")||this.element.attr("role","button"),this.options.icon&&(this._updateIcon("icon",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr("title"),this.options.showLabel||this.title||this.element.attr("title",this.options.label)},_updateIcon:function(e,i){var s="iconPosition"!==e,n=s?this.options.iconPosition:i,o="top"===n||"bottom"===n;this.icon?s&&this._removeClass(this.icon,null,this.options.icon):(this.icon=t("<span>"),this._addClass(this.icon,"ui-button-icon","ui-icon"),this.options.showLabel||this._addClass("ui-button-icon-only")),s&&this._addClass(this.icon,null,i),this._attachIcon(n),o?(this._addClass(this.icon,null,"ui-widget-icon-block"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-button-icon-space")),this._removeClass(this.icon,null,"ui-wiget-icon-block"),this._attachIconSpace(n))},_destroy:function(){this.element.removeAttr("role"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr("title")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?"before":"after"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?"append":"prepend"](this.icon)},_setOptions:function(t){var e=void 0===t.showLabel?this.options.showLabel:t.showLabel,i=void 0===t.icon?this.options.icon:t.icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){"icon"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),"iconPosition"===t&&this._updateIcon(t,e),"showLabel"===t&&(this._toggleClass("ui-button-icon-only",null,!e),this._updateTooltip()),"label"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),"disabled"===t&&(this._toggleClass(null,"ui-state-disabled",e),this.element[0].disabled=e,e&&this.element.blur())},refresh:function(){var t=this.element.is("input, button")?this.element[0].disabled:this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),t.uiBackCompat!==!1&&(t.widget("ui.button",t.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition="end"),this._super()},_setOption:function(t,e){return"text"===t?(this._super("showLabel",e),void 0):("showLabel"===t&&(this.options.text=e),"icon"===t&&(this.options.icons.primary=e),"icons"===t&&(e.primary?(this._super("icon",e.primary),this._super("iconPosition","beginning")):e.secondary&&(this._super("icon",e.secondary),this._super("iconPosition","end"))),this._superApply(arguments),void 0)}}),t.fn.button=function(e){return function(){return!this.length||this.length&&"INPUT"!==this[0].tagName||this.length&&"INPUT"===this[0].tagName&&"checkbox"!==this.attr("type")&&"radio"!==this.attr("type")?e.apply(this,arguments):(t.ui.checkboxradio||t.error("Checkboxradio widget missing"),0===arguments.length?this.checkboxradio({icon:!1}):this.checkboxradio.apply(this,arguments))}}(t.fn.button),t.fn.buttonset=function(){return t.ui.controlgroup||t.error("Controlgroup widget missing"),"option"===arguments[0]&&"items"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],"items.button",arguments[2]]):"option"===arguments[0]&&"items"===arguments[1]?this.controlgroup.apply(this,[arguments[0],"items.button"]):("object"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))}),t.ui.button,t.extend(t.ui,{datepicker:{version:"1.12.1"}});var m;t.extend(s.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return a(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var s=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?n(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(i),t.data(e,"datepicker",i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.off("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.on("focus",this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,n,o){var r,h,l,c,u,d=this._dialogInst;return d||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+r+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),a(d.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+c,l/2-150+u]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,"datepicker");s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),m===n&&(m=null))},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,s){var n,o,r,h,l=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):l?"all"===i?t.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),a(l.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,r)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),l),this._autoSize(l),this._setDate(l,o),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,s,n=t.datepicker._getInst(e.target);return t.datepicker._get(n,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var s,n,o,r,h,l,c;s=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==s&&(t.datepicker._curInst.dpDiv.stop(!0,!0),s&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),n=t.datepicker._get(s,"beforeShow"),o=n?n.apply(e,[e,s]):{},o!==!1&&(a(s.settings,o),s.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(s),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),r=!1,t(e).parents().each(function(){return r|="fixed"===t(this).css("position"),!r}),h={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,s.dpDiv.empty(),s.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(s),h=t.datepicker._checkOffset(s,h,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),s.inline||(l=t.datepicker._get(s,"showAnim"),c=t.datepicker._get(s,"duration"),s.dpDiv.css("z-index",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[l]?s.dpDiv.show(l,t.datepicker._get(s,"showOptions"),c):s.dpDiv[l||"show"](l?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s))
        +}},_updateDatepicker:function(e){this.maxRows=4,m=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,s=this._getNumberOfMonths(e),n=s[1],a=17,r=e.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,a=this._curInst;!a||e&&a!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(a,"showAnim"),s=this._get(a,"duration"),n=function(){t.datepicker._tidyDialog(a)},t.effects&&(t.effects.effect[i]||t.effects[i])?a.dpDiv.hide(i,t.datepicker._get(a,"showOptions"),s,n):a.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(a,"onClose"),o&&o.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).val(n))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,s){if(null==e||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,o,a,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),u=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,d=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,_=-1,v=-1,b=!1,y=function(t){var i=e.length>n+1&&e.charAt(n+1)===t;return i&&n++,i},w=function(t){var e=y(t),s="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n="y"===t?s:1,o=RegExp("^\\d{"+n+","+s+"}"),a=i.substring(h).match(o);if(!a)throw"Missing number at position "+h;return h+=a[0].length,parseInt(a[0],10)},k=function(e,s,n){var o=-1,a=t.map(y(e)?n:s,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(a,function(t,e){var s=e[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],h+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+h},x=function(){if(i.charAt(h)!==e.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;e.length>n;n++)if(b)"'"!==e.charAt(n)||y("'")?x():b=!1;else switch(e.charAt(n)){case"d":_=w("d");break;case"D":k("D",u,d);break;case"o":v=w("o");break;case"m":m=w("m");break;case"M":m=k("M",p,f);break;case"y":g=w("y");break;case"@":r=new Date(w("@")),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"!":r=new Date((w("!")-this._ticksTo1970)/1e4),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"'":y("'")?x():b=!0;break;default:x()}if(i.length>h&&(a=i.substr(h),!/^\s+/.test(a)))throw"Extra/unparsed characters found in date: "+a;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),v>-1)for(m=1,_=v;;){if(o=this._getDaysInMonth(g,m-1),o>=_)break;m++,_-=o}if(r=this._daylightSavingAdjust(new Date(g,m-1,_)),r.getFullYear()!==g||r.getMonth()+1!==m||r.getDate()!==_)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,I,T,P,M,S,H,z,O,A,N,W,E,F,L,R=new Date,B=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),Y=this._get(t,"isRTL"),j=this._get(t,"showButtonPanel"),q=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),$=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=Q&&Q>e?Q:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-$,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":q?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+$,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":q?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:B,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=j?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(Y?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),_=this._get(t,"showOtherMonths"),v=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,C=0;U[1]>C;C++){if(D=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",T="",X){if(T+="<div class='ui-datepicker-group",U[1]>1)switch(C){case 0:T+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:T+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:T+=" ui-datepicker-group-middle",I=""}T+="'>"}for(T+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,Q,J,k>0||C>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",P=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,P+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(T+=P+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),H=(this._getFirstDayOfMonth(te,Z)-c+7)%7,z=Math.ceil((H+S)/7),O=X?this.maxRows>z?this.maxRows:z:z,this.maxRows=O,A=this._daylightSavingAdjust(new Date(te,Z,1-H)),N=0;O>N;N++){for(T+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(A)+"</td>":"",w=0;7>w;w++)E=m?m.apply(t.input?t.input[0]:null,[A]):[!0,""],F=A.getMonth()!==Z,L=F&&!v||!E[0]||Q&&Q>A||J&&A>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(A.getTime()===D.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===A.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!_?"":" "+E[1]+(A.getTime()===G.getTime()?" "+this._currentClass:"")+(A.getTime()===B.getTime()?" ui-datepicker-today":""))+"'"+(F&&!_||!E[2]?"":" title='"+E[2].replace(/'/g,"&#39;")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+A.getMonth()+"' data-year='"+A.getFullYear()+"'")+">"+(F&&!_?"&#xa0;":L?"<span class='ui-state-default'>"+A.getDate()+"</span>":"<a class='ui-state-default"+(A.getTime()===B.getTime()?" ui-state-highlight":"")+(A.getTime()===G.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+A.getDate()+"</a>")+"</td>",A.setDate(A.getDate()+1),A=this._daylightSavingAdjust(A);T+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),T+="</tbody></table>"+(X?"</div>"+(U[0]>0&&C===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=T}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),_=this._get(t,"changeYear"),v=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(v||(b+=y+(!o&&m&&_?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!_)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),v&&(b+=(!o&&m&&_?"":"&#xa0;")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new s,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.1",t.datepicker,t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var _=!1;t(document).on("mouseup",function(){_=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!_){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),_=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,_=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("<div>").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}
        +},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),h=t.pageX,l=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(h=this.originalPageX),"x"===a.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY<n.scrollSensitivity?a.scrollTop=o=a.scrollTop+n.scrollSpeed:e.pageY-s.overflowOffset.top<n.scrollSensitivity&&(a.scrollTop=o=a.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+a.offsetWidth-e.pageX<n.scrollSensitivity?a.scrollLeft=o=a.scrollLeft+n.scrollSpeed:e.pageX-s.overflowOffset.left<n.scrollSensitivity&&(a.scrollLeft=o=a.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(e.pageY-t(r).scrollTop()<n.scrollSensitivity?o=t(r).scrollTop(t(r).scrollTop()-n.scrollSpeed):t(window).height()-(e.pageY-t(r).scrollTop())<n.scrollSensitivity&&(o=t(r).scrollTop(t(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(e.pageX-t(r).scrollLeft()<n.scrollSensitivity?o=t(r).scrollLeft(t(r).scrollLeft()-n.scrollSpeed):t(window).width()-(e.pageX-t(r).scrollLeft())<n.scrollSensitivity&&(o=t(r).scrollLeft(t(r).scrollLeft()+n.scrollSpeed)))),o!==!1&&t.ui.ddmanager&&!n.dropBehaviour&&t.ui.ddmanager.prepareOffsets(s,e)}}),t.ui.plugin.add("draggable","snap",{start:function(e,i,s){var n=s.options;s.snapElements=[],t(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var e=t(this),i=e.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,s){var n,o,a,r,h,l,c,u,d,p,f=s.options,g=f.snapTolerance,m=i.offset.left,_=m+s.helperProportions.width,v=i.offset.top,b=v+s.helperProportions.height;for(d=s.snapElements.length-1;d>=0;d--)h=s.snapElements[d].left-s.margins.left,l=h+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,h-g>_||m>l+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(h-_),r=g>=Math.abs(l-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(h-m),r=g>=Math.abs(l-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),g&&(p-=l),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,t.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog
        +},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),o=Math.max.apply(null,n);return o>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",o+1),s=!0),s&&!i&&this._trigger("focus",e),s},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]),i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),void 0;if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){n.trigger("focus")}),e.preventDefault()):(this._delay(function(){s.trigger("focus")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=t("<button type='button'></button>").button({label:t("<a>").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html("&#160;")},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this._removeClass(this.uiDialog,"ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,o={icon:s.icon,iconPosition:s.iconPosition,showLabel:s.showLabel,icons:s.icons,text:s.text},delete s.click,delete s.icon,delete s.iconPosition,delete s.showLabel,delete s.icons,"boolean"==typeof s.text&&delete s.text,t("<button></button>",s).button(o).appendTo(e.uiButtonSet).on("click",function(){n.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),h=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,i){var s,n,o=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("<a>").text(""+this.options.closeText).html()}),"draggable"===e&&(s=o.is(":data(ui-draggable)"),s&&!i&&o.draggable("destroy"),!s&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(n=o.is(":data(ui-resizable)"),n&&!i&&o.resizable("destroy"),n&&"string"==typeof i&&o.resizable("option","handles",i),n||i===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("<div>").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&v(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var v=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,h=a+e.helperProportions.height,l=i.offset.left,c=i.offset.top,u=l+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=l&&u>=r&&a>=c&&d>=h;case"intersect":return o+e.helperProportions.width/2>l&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>h-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,l,i.proportions().width);case"touch":return(a>=c&&d>=a||h>=c&&d>=h||c>a&&h>d)&&(o>=l&&u>=o||r>=l&&u>=r||l>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&v(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=v(e,this,this.options.tolerance,i),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("<div>").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),void 0)},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div>").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("<div>"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?l=!(c.left>r||o>c.right||c.top>h||a>c.bottom):"fit"===n.tolerance&&(l=c.left>o&&r>c.right&&c.top>a&&h>c.bottom),l?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"<select>",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=t()},_drawButton:function(){var e,i=this,s=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.focus(),t.preventDefault()}}),this.element.hide(),this.button=t("<span>",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),e=t("<span>").appendTo(this.button),this._addClass(e,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(s).appendTo(this.button),this.options.width!==!1&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){i._rendered||i._refreshMenu()})},_drawMenu:function(){var e=this;this.menu=t("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=t("<div>").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,i){t.preventDefault(),e._setSelection(),e._select(i.item.data("ui-selectmenu-item"),t)},focus:function(t,i){var s=i.item.data("ui-selectmenu-item");null!=e.focusIndex&&s.index!==e.focusIndex&&(e._trigger("focus",t,{item:s}),e.isOpen||e._select(s,t)),e.focusIndex=s.index,e.button.attr("aria-activedescendant",e.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t,e=this.element.find("option");this.menu.empty(),this._parseOptions(e),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,e.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(t.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(e){var i=t("<span>");return this._setText(i,e.label),this._addClass(i,"ui-selectmenu-text"),i},_renderMenu:function(e,i){var s=this,n="";t.each(i,function(i,o){var a;o.optgroup!==n&&(a=t("<li>",{text:o.optgroup}),s._addClass(a,"ui-selectmenu-optgroup","ui-menu-divider"+(o.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),a.appendTo(e),n=o.optgroup),s._renderItemData(e,o)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(e,i){var s=t("<li>"),n=t("<div>",{title:i.element.attr("title")});return i.disabled&&this._addClass(s,null,"ui-state-disabled"),this._setText(n,i.label),s.append(n).appendTo(e)},_setText:function(t,e){e?t.text(e):t.html("&#160;")},_move:function(t,e){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),n+=":not(.ui-state-disabled)"),s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](n).eq(-1):i[t+"All"](n).eq(0),s.length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?(t=window.getSelection(),t.removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(e){this.isOpen&&(t(e.target).closest(".ui-selectmenu-menu, #"+t.ui.escapeSelector(this.ids.button)).length||this.close(e))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection(),t.rangeCount&&(this.range=t.getRangeAt(0))):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(e){var i=!0;switch(e.keyCode){case t.ui.keyCode.TAB:case t.ui.keyCode.ESCAPE:this.close(e),i=!1;break;case t.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(e);break;case t.ui.keyCode.UP:e.altKey?this._toggle(e):this._move("prev",e);break;case t.ui.keyCode.DOWN:e.altKey?this._toggle(e):this._move("next",e);break;case t.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(e):this._toggle(e);break;case t.ui.keyCode.LEFT:this._move("prev",e);break;case t.ui.keyCode.RIGHT:this._move("next",e);break;case t.ui.keyCode.HOME:case t.ui.keyCode.PAGE_UP:this._move("first",e);break;case t.ui.keyCode.END:case t.ui.keyCode.PAGE_DOWN:this._move("last",e);break;default:this.menu.trigger(e),i=!1}i&&e.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){var e=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":e,"aria-activedescendant":e}),this.menu.attr("aria-activedescendant",e)},_setOption:function(t,e){if("icons"===t){var i=this.button.find("span.ui-icon");this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)}this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;return t===!1?(this.button.css("width",""),void 0):(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t),void 0)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(e){var i=this,s=[];e.each(function(e,n){s.push(i._parseOption(t(n),e))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),t.widget("ui.slider",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1
        +},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle"),o="<span tabindex='0'></span>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e).attr("tabIndex",0)})},_createRange:function(){var e=this.options;e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=t("<div>").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),("min"===e.range||"max"===e.range)&&this._addClass(this.range,"ui-slider-range-"+e.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,this._addClass(o,null,"ui-state-active"),o.trigger("focus"),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n,o=this.value(),a=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),o=this.values(e),2===this.options.values.length&&this.options.range===!0&&(i=0===e?Math.min(n,i):Math.max(n,i)),a[e]=i),i!==o&&(s=this._trigger("slide",t,this._uiHash(e,i,a)),s!==!1&&(this._hasMultipleValues()?this.values(e,i):this.value(i)))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),void 0;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),this._super(e,i),e){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=n-1;s>=0;s--)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step,s=Math.round((t-e)/i)*i;t=s+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:100-i+"%"},r.animate))},_handleEvents:{keydown:function(e){var i,s,n,o,a=t(e.target).data("ui-slider-handle-index");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,"ui-state-active"),i=this._start(e,a),i===!1))return}switch(o=this.options.step,s=n=this._hasMultipleValues()?this.values(a):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+o);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-o)}this._slide(e,a,n)},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,"ui-state-active"))}}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-this.document.scrollTop()<a.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-a.scrollSpeed):this.window.height()-(e.pageY-this.document.scrollTop())<a.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+a.scrollSpeed)),e.pageX-this.document.scrollLeft()<a.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-a.scrollSpeed):this.window.width()-(e.pageX-this.document.scrollLeft())<a.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("<tr>",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t("<td>&#160;</td>",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;
        +this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.spinner",{version:"1.12.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("<span>").parent().append("<a></a><a></a>")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:r(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:r(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:r(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:r(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:r(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(r(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return"<span>"},_buttonHtml:function(){return"<a></a><a></a>"}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),h=t(s).closest("li"),l=h.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=h.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},h=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),h(n,e)},1)}).fail(function(t,e){setTimeout(function(){h(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var s=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s.element[0],e.close(n,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(e,s),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s||s.nodeType||s.jquery?this._open(e,t,s):(i=s.call(t[0],function(i){n._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=o),this._open(e,t,i))})}),i&&this._open(e,t,i),void 0)},_open:function(e,i,s){function n(t){l.of=t,a.is(":hidden")||a.position(l)}var o,a,r,h,l=t.extend({},this.options.position);if(s){if(o=this._find(i))return o.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),o=this._tooltip(i),a=o.tooltip,this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),h=t("<div>").html(a.find(".ui-tooltip-content").html()),h.removeAttr("name").find("[name]").removeAttr("name"),h.removeAttr("id").find("[id]").removeAttr("id"),h.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:n}),n(e)):a.position(t.extend({of:i},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},t.fx.interval)),this._trigger("open",e,{tooltip:a})}},_registerCloseHandlers:function(e,i){var s={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var s=t.Event(e);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(s.mouseleave="close"),e&&"focusin"!==e.type||(s.focusout="close"),this._on(!0,i,s)},close:function(e){var i,s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);return o?(i=o.tooltip,o.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),o.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]}),o.closing=!0,this._trigger("close",e,{tooltip:i}),o.hiding||(o.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(e){var i=t("<div>").attr("role","tooltip"),s=t("<div>").appendTo(i),n=i.uniqueId().attr("id");return this._addClass(s,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[n]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur"),o=s.element;n.target=n.currentTarget=o[0],e.close(n,!0),t("#"+i).remove(),o.data("ui-tooltip-title")&&(o.attr("title")||o.attr("title",o.data("ui-tooltip-title")),o.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),t.uiBackCompat!==!1&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/package.json b/bower_components/jquery-ui/package.json
        new file mode 100644
        index 0000000000..3f4c8ae779
        --- /dev/null
        +++ b/bower_components/jquery-ui/package.json
        @@ -0,0 +1,16 @@
        +{
        +    "name": "components-jqueryui",
        +    "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.",
        +    "version": "1.12.1",
        +    "homepage": "http://jqueryui.com",
        +    "author": {
        +        "name": "jQuery Foundation and other contributors",
        +        "url": "https://github.com/jquery/jquery-ui/blob/master/AUTHORS.txt"
        +    },
        +    "repository": {
        +        "type": "git",
        +        "url": "git://github.com/components/jqueryui.git"
        +    },
        +    "main": "jquery-ui.js",
        +    "license": "MIT"
        +}
        diff --git a/bower_components/jquery-ui/themes/base/accordion.css b/bower_components/jquery-ui/themes/base/accordion.css
        new file mode 100644
        index 0000000000..e096c8c541
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/accordion.css
        @@ -0,0 +1,23 @@
        +/*!
        + * jQuery UI Accordion 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/accordion/#theming
        + */
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/all.css b/bower_components/jquery-ui/themes/base/all.css
        new file mode 100644
        index 0000000000..0898cbc8ab
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/all.css
        @@ -0,0 +1,12 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + */
        +@import "base.css";
        +@import "theme.css";
        diff --git a/bower_components/jquery-ui/themes/base/autocomplete.css b/bower_components/jquery-ui/themes/base/autocomplete.css
        new file mode 100644
        index 0000000000..afdc3a4e74
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/autocomplete.css
        @@ -0,0 +1,16 @@
        +/*!
        + * jQuery UI Autocomplete 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/autocomplete/#theming
        + */
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/base.css b/bower_components/jquery-ui/themes/base/base.css
        new file mode 100644
        index 0000000000..f109655a54
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/base.css
        @@ -0,0 +1,30 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + */
        +@import url("core.css");
        +
        +@import url("accordion.css");
        +@import url("autocomplete.css");
        +@import url("button.css");
        +@import url("checkboxradio.css");
        +@import url("controlgroup.css");
        +@import url("datepicker.css");
        +@import url("dialog.css");
        +@import url("draggable.css");
        +@import url("menu.css");
        +@import url("progressbar.css");
        +@import url("resizable.css");
        +@import url("selectable.css");
        +@import url("selectmenu.css");
        +@import url("sortable.css");
        +@import url("slider.css");
        +@import url("spinner.css");
        +@import url("tabs.css");
        +@import url("tooltip.css");
        diff --git a/bower_components/jquery-ui/themes/base/button.css b/bower_components/jquery-ui/themes/base/button.css
        new file mode 100644
        index 0000000000..45915b616b
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/button.css
        @@ -0,0 +1,82 @@
        +/*!
        + * jQuery UI Button 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/button/#theming
        + */
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/checkboxradio.css b/bower_components/jquery-ui/themes/base/checkboxradio.css
        new file mode 100644
        index 0000000000..2bfdd29abc
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/checkboxradio.css
        @@ -0,0 +1,34 @@
        +/*!
        + * jQuery UI Checkboxradio 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/checkboxradio/#theming
        + */
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/controlgroup.css b/bower_components/jquery-ui/themes/base/controlgroup.css
        new file mode 100644
        index 0000000000..86f3306d27
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/controlgroup.css
        @@ -0,0 +1,65 @@
        +/*!
        + * jQuery UI Controlgroup 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/controlgroup/#theming
        + */
        +
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        diff --git a/bower_components/jquery-ui/themes/base/core.css b/bower_components/jquery-ui/themes/base/core.css
        new file mode 100644
        index 0000000000..a4c1b2de87
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/core.css
        @@ -0,0 +1,97 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/datepicker.css b/bower_components/jquery-ui/themes/base/datepicker.css
        new file mode 100644
        index 0000000000..c82ae33fba
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/datepicker.css
        @@ -0,0 +1,185 @@
        +/*!
        + * jQuery UI Datepicker 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/datepicker/#theming
        + */
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/dialog.css b/bower_components/jquery-ui/themes/base/dialog.css
        new file mode 100644
        index 0000000000..993f7975ca
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/dialog.css
        @@ -0,0 +1,101 @@
        +/*!
        + * jQuery UI Dialog 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/dialog/#theming
        + */
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/draggable.css b/bower_components/jquery-ui/themes/base/draggable.css
        new file mode 100644
        index 0000000000..3f71945369
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/draggable.css
        @@ -0,0 +1,12 @@
        +/*!
        + * jQuery UI Draggable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png b/bower_components/jquery-ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png
        new file mode 100644
        index 0000000000..a2e6bfc085
        Binary files /dev/null and b/bower_components/jquery-ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png differ
        diff --git a/bower_components/jquery-ui/themes/base/images/ui-icons_444444_256x240.png b/bower_components/jquery-ui/themes/base/images/ui-icons_444444_256x240.png
        new file mode 100644
        index 0000000000..618770efd1
        Binary files /dev/null and b/bower_components/jquery-ui/themes/base/images/ui-icons_444444_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/base/images/ui-icons_555555_256x240.png b/bower_components/jquery-ui/themes/base/images/ui-icons_555555_256x240.png
        new file mode 100644
        index 0000000000..fce0540199
        Binary files /dev/null and b/bower_components/jquery-ui/themes/base/images/ui-icons_555555_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/base/images/ui-icons_777620_256x240.png b/bower_components/jquery-ui/themes/base/images/ui-icons_777620_256x240.png
        new file mode 100644
        index 0000000000..c896b8d1f8
        Binary files /dev/null and b/bower_components/jquery-ui/themes/base/images/ui-icons_777620_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/base/images/ui-icons_777777_256x240.png b/bower_components/jquery-ui/themes/base/images/ui-icons_777777_256x240.png
        new file mode 100644
        index 0000000000..36e7a1ca0e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/base/images/ui-icons_777777_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/base/images/ui-icons_cc0000_256x240.png b/bower_components/jquery-ui/themes/base/images/ui-icons_cc0000_256x240.png
        new file mode 100644
        index 0000000000..5bd316c59d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/base/images/ui-icons_cc0000_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/base/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/base/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/base/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/base/jquery-ui.css b/bower_components/jquery-ui/themes/base/jquery-ui.css
        new file mode 100644
        index 0000000000..a22ecb05ca
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Arial,Helvetica,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Arial,Helvetica,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #c5c5c5;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #ffffff;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #dddddd;
        +	background: #e9e9e9;
        +	color: #333333;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #333333;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #c5c5c5;
        +	background: #f6f6f6;
        +	font-weight: normal;
        +	color: #454545;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #454545;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #cccccc;
        +	background: #ededed;
        +	font-weight: normal;
        +	color: #2b2b2b;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #2b2b2b;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #003eff;
        +	background: #007fff;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #003eff;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #dad55e;
        +	background: #fffa90;
        +	color: #777620;
        +}
        +.ui-state-checked {
        +	border: 1px solid #dad55e;
        +	background: #fffa90;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #777620;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #f1a899;
        +	background: #fddfdf;
        +	color: #5f3f3f;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #5f3f3f;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #5f3f3f;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_444444_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_444444_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_555555_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_777620_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_777777_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 3px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 0px 0px 5px #666666;
        +	box-shadow: 0px 0px 5px #666666;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/jquery-ui.min.css b/bower_components/jquery-ui/themes/base/jquery-ui.min.css
        new file mode 100644
        index 0000000000..121f222ff1
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/base/menu.css b/bower_components/jquery-ui/themes/base/menu.css
        new file mode 100644
        index 0000000000..60373e88c7
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/menu.css
        @@ -0,0 +1,64 @@
        +/*!
        + * jQuery UI Menu 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/menu/#theming
        + */
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/progressbar.css b/bower_components/jquery-ui/themes/base/progressbar.css
        new file mode 100644
        index 0000000000..a0ac4a3c2c
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/progressbar.css
        @@ -0,0 +1,28 @@
        +/*!
        + * jQuery UI Progressbar 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/progressbar/#theming
        + */
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/resizable.css b/bower_components/jquery-ui/themes/base/resizable.css
        new file mode 100644
        index 0000000000..2ee40cf3a9
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/resizable.css
        @@ -0,0 +1,78 @@
        +/*!
        + * jQuery UI Resizable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/selectable.css b/bower_components/jquery-ui/themes/base/selectable.css
        new file mode 100644
        index 0000000000..5d615b4516
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/selectable.css
        @@ -0,0 +1,17 @@
        +/*!
        + * jQuery UI Selectable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/selectmenu.css b/bower_components/jquery-ui/themes/base/selectmenu.css
        new file mode 100644
        index 0000000000..bf813dc315
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/selectmenu.css
        @@ -0,0 +1,50 @@
        +/*!
        + * jQuery UI Selectmenu 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/selectmenu/#theming
        + */
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/slider.css b/bower_components/jquery-ui/themes/base/slider.css
        new file mode 100644
        index 0000000000..e1f5030eea
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/slider.css
        @@ -0,0 +1,75 @@
        +/*!
        + * jQuery UI Slider 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/slider/#theming
        + */
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/sortable.css b/bower_components/jquery-ui/themes/base/sortable.css
        new file mode 100644
        index 0000000000..a1da55379b
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/sortable.css
        @@ -0,0 +1,12 @@
        +/*!
        + * jQuery UI Sortable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/spinner.css b/bower_components/jquery-ui/themes/base/spinner.css
        new file mode 100644
        index 0000000000..14db10bfd1
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/spinner.css
        @@ -0,0 +1,52 @@
        +/*!
        + * jQuery UI Spinner 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/spinner/#theming
        + */
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/tabs.css b/bower_components/jquery-ui/themes/base/tabs.css
        new file mode 100644
        index 0000000000..f81c11a958
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/tabs.css
        @@ -0,0 +1,51 @@
        +/*!
        + * jQuery UI Tabs 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/tabs/#theming
        + */
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/theme.css b/bower_components/jquery-ui/themes/base/theme.css
        new file mode 100644
        index 0000000000..23374a6f87
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Arial,Helvetica,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Arial,Helvetica,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #c5c5c5;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #ffffff;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #dddddd;
        +	background: #e9e9e9;
        +	color: #333333;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #333333;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #c5c5c5;
        +	background: #f6f6f6;
        +	font-weight: normal;
        +	color: #454545;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #454545;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #cccccc;
        +	background: #ededed;
        +	font-weight: normal;
        +	color: #2b2b2b;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #2b2b2b;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #003eff;
        +	background: #007fff;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #003eff;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #dad55e;
        +	background: #fffa90;
        +	color: #777620;
        +}
        +.ui-state-checked {
        +	border: 1px solid #dad55e;
        +	background: #fffa90;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #777620;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #f1a899;
        +	background: #fddfdf;
        +	color: #5f3f3f;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #5f3f3f;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #5f3f3f;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_444444_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_444444_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_555555_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_777620_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_777777_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 3px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 0px 0px 5px #666666;
        +	box-shadow: 0px 0px 5px #666666;
        +}
        diff --git a/bower_components/jquery-ui/themes/base/tooltip.css b/bower_components/jquery-ui/themes/base/tooltip.css
        new file mode 100644
        index 0000000000..fba6402a1d
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/base/tooltip.css
        @@ -0,0 +1,19 @@
        +/*!
        + * jQuery UI Tooltip 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/tooltip/#theming
        + */
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_diagonals-thick_8_333333_40x40.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_diagonals-thick_8_333333_40x40.png
        new file mode 100644
        index 0000000000..c9e5cfa41f
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_diagonals-thick_8_333333_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_glass_40_111111_1x400.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_glass_40_111111_1x400.png
        new file mode 100644
        index 0000000000..4fbef58243
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_glass_40_111111_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_glass_55_1c1c1c_1x400.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_glass_55_1c1c1c_1x400.png
        new file mode 100644
        index 0000000000..71345c04f7
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_glass_55_1c1c1c_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png
        new file mode 100644
        index 0000000000..e15d49f44f
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-hard_40_aaaaaa_1x100.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-hard_40_aaaaaa_1x100.png
        new file mode 100644
        index 0000000000..ffd3a3a8ae
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-hard_40_aaaaaa_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-soft_50_aaaaaa_1x100.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-soft_50_aaaaaa_1x100.png
        new file mode 100644
        index 0000000000..7314b4aa93
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_highlight-soft_50_aaaaaa_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_inset-hard_45_cd0a0a_1x100.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_inset-hard_45_cd0a0a_1x100.png
        new file mode 100644
        index 0000000000..58671a918c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_inset-hard_45_cd0a0a_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-bg_inset-hard_55_ffeb80_1x100.png b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_inset-hard_55_ffeb80_1x100.png
        new file mode 100644
        index 0000000000..05d8d313dd
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-bg_inset-hard_55_ffeb80_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-icons_222222_256x240.png b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_222222_256x240.png
        new file mode 100644
        index 0000000000..f184400db5
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_222222_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-icons_4ca300_256x240.png b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_4ca300_256x240.png
        new file mode 100644
        index 0000000000..b9665b6293
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_4ca300_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-icons_bbbbbb_256x240.png b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_bbbbbb_256x240.png
        new file mode 100644
        index 0000000000..ae2987873c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_bbbbbb_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ededed_256x240.png b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ededed_256x240.png
        new file mode 100644
        index 0000000000..5ea9b34830
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ededed_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ffcf29_256x240.png b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ffcf29_256x240.png
        new file mode 100644
        index 0000000000..9fb8bd5c0d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ffcf29_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/black-tie/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/black-tie/jquery-ui.css b/bower_components/jquery-ui/themes/black-tie/jquery-ui.css
        new file mode 100644
        index 0000000000..98863d7ae5
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/black-tie/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=333333&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=8&borderColorHeader=a3a3a3&fcHeader=eeeeee&iconColorHeader=bbbbbb&bgColorContent=f9f9f9&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=222222&iconColorContent=222222&bgColorDefault=111111&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=777777&fcDefault=e3e3e3&iconColorDefault=ededed&bgColorHover=1c1c1c&bgTextureHover=glass&bgImgOpacityHover=55&borderColorHover=000000&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=cccccc&fcActive=222222&iconColorActive=222222&bgColorHighlight=ffeb80&bgTextureHighlight=inset_hard&bgImgOpacityHighlight=55&borderColorHighlight=ffde2e&fcHighlight=363636&iconColorHighlight=4ca300&bgColorError=cd0a0a&bgTextureError=inset_hard&bgImgOpacityError=45&borderColorError=9e0505&fcError=ffffff&iconColorError=ffcf29&bgColorOverlay=aaaaaa&bgTextureOverlay=highlight_hard&bgImgOpacityOverlay=40&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=highlight_soft&bgImgOpacityShadow=50&opacityShadow=20&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #777777;
        +}
        +.ui-widget-content {
        +	border: 1px solid #cccccc;
        +	background: #f9f9f9 url("images/ui-bg_highlight-hard_100_f9f9f9_1x100.png") 50% top repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #a3a3a3;
        +	background: #333333 url("images/ui-bg_diagonals-thick_8_333333_40x40.png") 50% 50% repeat;
        +	color: #eeeeee;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #eeeeee;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #777777;
        +	background: #111111 url("images/ui-bg_glass_40_111111_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #e3e3e3;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #e3e3e3;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #000000;
        +	background: #1c1c1c url("images/ui-bg_glass_55_1c1c1c_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #cccccc;
        +	background: #ffffff;
        +	font-weight: normal;
        +	color: #222222;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #cccccc;
        +	background-color: #222222;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #222222;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffde2e;
        +	background: #ffeb80 url("images/ui-bg_inset-hard_55_ffeb80_1x100.png") 50% bottom repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffde2e;
        +	background: #ffeb80;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #9e0505;
        +	background: #cd0a0a url("images/ui-bg_inset-hard_45_cd0a0a_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_bbbbbb_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4ca300_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffcf29_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ededed_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa url("images/ui-bg_highlight-hard_40_aaaaaa_1x100.png") 50% top repeat-x;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/black-tie/jquery-ui.min.css b/bower_components/jquery-ui/themes/black-tie/jquery-ui.min.css
        new file mode 100644
        index 0000000000..193627b4d7
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/black-tie/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=333333&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=8&borderColorHeader=a3a3a3&fcHeader=eeeeee&iconColorHeader=bbbbbb&bgColorContent=f9f9f9&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=222222&iconColorContent=222222&bgColorDefault=111111&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=777777&fcDefault=e3e3e3&iconColorDefault=ededed&bgColorHover=1c1c1c&bgTextureHover=glass&bgImgOpacityHover=55&borderColorHover=000000&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=cccccc&fcActive=222222&iconColorActive=222222&bgColorHighlight=ffeb80&bgTextureHighlight=inset_hard&bgImgOpacityHighlight=55&borderColorHighlight=ffde2e&fcHighlight=363636&iconColorHighlight=4ca300&bgColorError=cd0a0a&bgTextureError=inset_hard&bgImgOpacityError=45&borderColorError=9e0505&fcError=ffffff&iconColorError=ffcf29&bgColorOverlay=aaaaaa&bgTextureOverlay=highlight_hard&bgImgOpacityOverlay=40&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=highlight_soft&bgImgOpacityShadow=50&opacityShadow=20&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #777}.ui-widget-content{border:1px solid #ccc;background:#f9f9f9 url("images/ui-bg_highlight-hard_100_f9f9f9_1x100.png") 50% top repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #a3a3a3;background:#333 url("images/ui-bg_diagonals-thick_8_333333_40x40.png") 50% 50% repeat;color:#eee;font-weight:bold}.ui-widget-header a{color:#eee}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #777;background:#111 url("images/ui-bg_glass_40_111111_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#e3e3e3}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#e3e3e3;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #000;background:#1c1c1c url("images/ui-bg_glass_55_1c1c1c_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ccc;background:#fff;font-weight:normal;color:#222}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ccc;background-color:#222}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#222;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ffde2e;background:#ffeb80 url("images/ui-bg_inset-hard_55_ffeb80_1x100.png") 50% bottom repeat-x;color:#363636}.ui-state-checked{border:1px solid #ffde2e;background:#ffeb80}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #9e0505;background:#cd0a0a url("images/ui-bg_inset-hard_45_cd0a0a_1x100.png") 50% bottom repeat-x;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_bbbbbb_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4ca300_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffcf29_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_ededed_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url("images/ui-bg_highlight-hard_40_aaaaaa_1x100.png") 50% top repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/black-tie/theme.css b/bower_components/jquery-ui/themes/black-tie/theme.css
        new file mode 100644
        index 0000000000..4953b23747
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/black-tie/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=333333&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=8&borderColorHeader=a3a3a3&fcHeader=eeeeee&iconColorHeader=bbbbbb&bgColorContent=f9f9f9&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=222222&iconColorContent=222222&bgColorDefault=111111&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=777777&fcDefault=e3e3e3&iconColorDefault=ededed&bgColorHover=1c1c1c&bgTextureHover=glass&bgImgOpacityHover=55&borderColorHover=000000&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=cccccc&fcActive=222222&iconColorActive=222222&bgColorHighlight=ffeb80&bgTextureHighlight=inset_hard&bgImgOpacityHighlight=55&borderColorHighlight=ffde2e&fcHighlight=363636&iconColorHighlight=4ca300&bgColorError=cd0a0a&bgTextureError=inset_hard&bgImgOpacityError=45&borderColorError=9e0505&fcError=ffffff&iconColorError=ffcf29&bgColorOverlay=aaaaaa&bgTextureOverlay=highlight_hard&bgImgOpacityOverlay=40&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=highlight_soft&bgImgOpacityShadow=50&opacityShadow=20&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #777777;
        +}
        +.ui-widget-content {
        +	border: 1px solid #cccccc;
        +	background: #f9f9f9 url("images/ui-bg_highlight-hard_100_f9f9f9_1x100.png") 50% top repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #a3a3a3;
        +	background: #333333 url("images/ui-bg_diagonals-thick_8_333333_40x40.png") 50% 50% repeat;
        +	color: #eeeeee;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #eeeeee;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #777777;
        +	background: #111111 url("images/ui-bg_glass_40_111111_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #e3e3e3;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #e3e3e3;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #000000;
        +	background: #1c1c1c url("images/ui-bg_glass_55_1c1c1c_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #cccccc;
        +	background: #ffffff;
        +	font-weight: normal;
        +	color: #222222;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #cccccc;
        +	background-color: #222222;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #222222;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffde2e;
        +	background: #ffeb80 url("images/ui-bg_inset-hard_55_ffeb80_1x100.png") 50% bottom repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffde2e;
        +	background: #ffeb80;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #9e0505;
        +	background: #cd0a0a url("images/ui-bg_inset-hard_45_cd0a0a_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_bbbbbb_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4ca300_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffcf29_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ededed_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa url("images/ui-bg_highlight-hard_40_aaaaaa_1x100.png") 50% top repeat-x;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png
        new file mode 100644
        index 0000000000..53b267c990
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-bg_dots-small_65_a6a6a6_2x2.png b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_dots-small_65_a6a6a6_2x2.png
        new file mode 100644
        index 0000000000..c4642193af
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_dots-small_65_a6a6a6_2x2.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-bg_glass_55_fbf8ee_1x400.png b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_glass_55_fbf8ee_1x400.png
        new file mode 100644
        index 0000000000..0f12fd6436
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_glass_55_fbf8ee_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-hard_100_eeeeee_1x100.png b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-hard_100_eeeeee_1x100.png
        new file mode 100644
        index 0000000000..b02e901992
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-hard_100_eeeeee_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png
        new file mode 100644
        index 0000000000..5147687ace
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-soft_15_cc0000_1x100.png b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-soft_15_cc0000_1x100.png
        new file mode 100644
        index 0000000000..2b6ab6b036
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-bg_highlight-soft_15_cc0000_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-icons_004276_256x240.png b/bower_components/jquery-ui/themes/blitzer/images/ui-icons_004276_256x240.png
        new file mode 100644
        index 0000000000..6646b8e8fb
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-icons_004276_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-icons_cc0000_256x240.png b/bower_components/jquery-ui/themes/blitzer/images/ui-icons_cc0000_256x240.png
        new file mode 100644
        index 0000000000..5bd316c59d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-icons_cc0000_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/blitzer/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/blitzer/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/blitzer/jquery-ui.css b/bower_components/jquery-ui/themes/blitzer/jquery-ui.css
        new file mode 100644
        index 0000000000..09ced4bb47
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/blitzer/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cc0000&bgTextureHeader=highlight_soft&bgImgOpacityHeader=15&borderColorHeader=e3a1a1&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=eeeeee&fcContent=333333&iconColorContent=cc0000&bgColorDefault=eeeeee&bgTextureDefault=highlight_hard&bgImgOpacityDefault=100&borderColorDefault=d8dcdf&fcDefault=004276&iconColorDefault=cc0000&bgColorHover=f6f6f6&bgTextureHover=highlight_hard&bgImgOpacityHover=100&borderColorHover=cdd5da&fcHover=111111&iconColorHover=cc0000&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=eeeeee&fcActive=cc0000&iconColorActive=cc0000&bgColorHighlight=fbf8ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd3a1&fcHighlight=444444&iconColorHighlight=004276&bgColorError=f3d8d8&bgTextureError=diagonals_thick&bgImgOpacityError=75&borderColorError=cc0000&fcError=2e2e2e&iconColorError=cc0000&bgColorOverlay=a6a6a6&bgTextureOverlay=dots_small&bgImgOpacityOverlay=65&opacityOverlay=40&bgColorShadow=333333&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=10&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #d8dcdf;
        +}
        +.ui-widget-content {
        +	border: 1px solid #eeeeee;
        +	background: #ffffff;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #e3a1a1;
        +	background: #cc0000 url("images/ui-bg_highlight-soft_15_cc0000_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #d8dcdf;
        +	background: #eeeeee url("images/ui-bg_highlight-hard_100_eeeeee_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #004276;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #004276;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #cdd5da;
        +	background: #f6f6f6 url("images/ui-bg_highlight-hard_100_f6f6f6_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #111111;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #111111;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #eeeeee;
        +	background: #ffffff;
        +	font-weight: bold;
        +	color: #cc0000;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #eeeeee;
        +	background-color: #cc0000;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #cc0000;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fcd3a1;
        +	background: #fbf8ee url("images/ui-bg_glass_55_fbf8ee_1x400.png") 50% 50% repeat-x;
        +	color: #444444;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fcd3a1;
        +	background: #fbf8ee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #444444;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cc0000;
        +	background: #f3d8d8 url("images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png") 50% 50% repeat;
        +	color: #2e2e2e;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #2e2e2e;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #2e2e2e;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_004276_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #a6a6a6 url("images/ui-bg_dots-small_65_a6a6a6_2x2.png") 50% 50% repeat;
        +	opacity: .4;
        +	filter: Alpha(Opacity=40); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #333333;
        +	box-shadow: -8px -8px 8px #333333;
        +}
        diff --git a/bower_components/jquery-ui/themes/blitzer/jquery-ui.min.css b/bower_components/jquery-ui/themes/blitzer/jquery-ui.min.css
        new file mode 100644
        index 0000000000..1f52c67849
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/blitzer/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cc0000&bgTextureHeader=highlight_soft&bgImgOpacityHeader=15&borderColorHeader=e3a1a1&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=eeeeee&fcContent=333333&iconColorContent=cc0000&bgColorDefault=eeeeee&bgTextureDefault=highlight_hard&bgImgOpacityDefault=100&borderColorDefault=d8dcdf&fcDefault=004276&iconColorDefault=cc0000&bgColorHover=f6f6f6&bgTextureHover=highlight_hard&bgImgOpacityHover=100&borderColorHover=cdd5da&fcHover=111111&iconColorHover=cc0000&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=eeeeee&fcActive=cc0000&iconColorActive=cc0000&bgColorHighlight=fbf8ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd3a1&fcHighlight=444444&iconColorHighlight=004276&bgColorError=f3d8d8&bgTextureError=diagonals_thick&bgImgOpacityError=75&borderColorError=cc0000&fcError=2e2e2e&iconColorError=cc0000&bgColorOverlay=a6a6a6&bgTextureOverlay=dots_small&bgImgOpacityOverlay=65&opacityOverlay=40&bgColorShadow=333333&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=10&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d8dcdf}.ui-widget-content{border:1px solid #eee;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e3a1a1;background:#c00 url("images/ui-bg_highlight-soft_15_cc0000_1x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d8dcdf;background:#eee url("images/ui-bg_highlight-hard_100_eeeeee_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#004276}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#004276;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #cdd5da;background:#f6f6f6 url("images/ui-bg_highlight-hard_100_f6f6f6_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#111}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#111;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #eee;background:#fff;font-weight:bold;color:#c00}.ui-icon-background,.ui-state-active .ui-icon-background{border:#eee;background-color:#c00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#c00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcd3a1;background:#fbf8ee url("images/ui-bg_glass_55_fbf8ee_1x400.png") 50% 50% repeat-x;color:#444}.ui-state-checked{border:1px solid #fcd3a1;background:#fbf8ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#444}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #c00;background:#f3d8d8 url("images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png") 50% 50% repeat;color:#2e2e2e}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#2e2e2e}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#2e2e2e}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_004276_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#a6a6a6 url("images/ui-bg_dots-small_65_a6a6a6_2x2.png") 50% 50% repeat;opacity:.4;filter:Alpha(Opacity=40)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #333;box-shadow:-8px -8px 8px #333}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/blitzer/theme.css b/bower_components/jquery-ui/themes/blitzer/theme.css
        new file mode 100644
        index 0000000000..29b2edf957
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/blitzer/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cc0000&bgTextureHeader=highlight_soft&bgImgOpacityHeader=15&borderColorHeader=e3a1a1&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=eeeeee&fcContent=333333&iconColorContent=cc0000&bgColorDefault=eeeeee&bgTextureDefault=highlight_hard&bgImgOpacityDefault=100&borderColorDefault=d8dcdf&fcDefault=004276&iconColorDefault=cc0000&bgColorHover=f6f6f6&bgTextureHover=highlight_hard&bgImgOpacityHover=100&borderColorHover=cdd5da&fcHover=111111&iconColorHover=cc0000&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=eeeeee&fcActive=cc0000&iconColorActive=cc0000&bgColorHighlight=fbf8ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd3a1&fcHighlight=444444&iconColorHighlight=004276&bgColorError=f3d8d8&bgTextureError=diagonals_thick&bgImgOpacityError=75&borderColorError=cc0000&fcError=2e2e2e&iconColorError=cc0000&bgColorOverlay=a6a6a6&bgTextureOverlay=dots_small&bgImgOpacityOverlay=65&opacityOverlay=40&bgColorShadow=333333&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=10&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #d8dcdf;
        +}
        +.ui-widget-content {
        +	border: 1px solid #eeeeee;
        +	background: #ffffff;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #e3a1a1;
        +	background: #cc0000 url("images/ui-bg_highlight-soft_15_cc0000_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #d8dcdf;
        +	background: #eeeeee url("images/ui-bg_highlight-hard_100_eeeeee_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #004276;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #004276;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #cdd5da;
        +	background: #f6f6f6 url("images/ui-bg_highlight-hard_100_f6f6f6_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #111111;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #111111;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #eeeeee;
        +	background: #ffffff;
        +	font-weight: bold;
        +	color: #cc0000;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #eeeeee;
        +	background-color: #cc0000;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #cc0000;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fcd3a1;
        +	background: #fbf8ee url("images/ui-bg_glass_55_fbf8ee_1x400.png") 50% 50% repeat-x;
        +	color: #444444;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fcd3a1;
        +	background: #fbf8ee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #444444;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cc0000;
        +	background: #f3d8d8 url("images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png") 50% 50% repeat;
        +	color: #2e2e2e;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #2e2e2e;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #2e2e2e;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_004276_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_cc0000_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #a6a6a6 url("images/ui-bg_dots-small_65_a6a6a6_2x2.png") 50% 50% repeat;
        +	opacity: .4;
        +	filter: Alpha(Opacity=40); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #333333;
        +	box-shadow: -8px -8px 8px #333333;
        +}
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png
        new file mode 100644
        index 0000000000..2f3c69b520
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png
        new file mode 100644
        index 0000000000..0cef1efede
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_50_3baae3_1x400.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_50_3baae3_1x400.png
        new file mode 100644
        index 0000000000..c2f2bbce8f
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_50_3baae3_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png
        new file mode 100644
        index 0000000000..1b1bd3b3ab
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
        new file mode 100644
        index 0000000000..afaf4fe33e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png
        new file mode 100644
        index 0000000000..4d8dfcc279
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png
        new file mode 100644
        index 0000000000..7758a1d76d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
        new file mode 100644
        index 0000000000..db227a6d38
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-icons_2694e8_256x240.png b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_2694e8_256x240.png
        new file mode 100644
        index 0000000000..8aab51b00c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_2694e8_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-icons_2e83ff_256x240.png b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_2e83ff_256x240.png
        new file mode 100644
        index 0000000000..264b221358
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_2e83ff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-icons_3d80b3_256x240.png b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_3d80b3_256x240.png
        new file mode 100644
        index 0000000000..2877b23d89
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_3d80b3_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-icons_72a7cf_256x240.png b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_72a7cf_256x240.png
        new file mode 100644
        index 0000000000..fadbb6cc0e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_72a7cf_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/cupertino/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/cupertino/jquery-ui.css b/bower_components/jquery-ui/themes/cupertino/jquery-ui.css
        new file mode 100644
        index 0000000000..f8a439b09c
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/cupertino/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #aed0ea;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;
        +	color: #362b36;
        +}
        +.ui-widget-content a {
        +	color: #362b36;
        +}
        +.ui-widget-header {
        +	border: 1px solid #aed0ea;
        +	background: #deedf7 url("images/ui-bg_highlight-soft_100_deedf7_1x100.png") 50% 50% repeat-x;
        +	color: #222222;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #222222;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #aed0ea;
        +	background: #d7ebf9 url("images/ui-bg_glass_80_d7ebf9_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #2779aa;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #2779aa;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #74b2e2;
        +	background: #e4f1fb url("images/ui-bg_glass_100_e4f1fb_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #0070a3;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #0070a3;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #2694e8;
        +	background: #3baae3 url("images/ui-bg_glass_50_3baae3_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #2694e8;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #f9dd34;
        +	background: #ffef8f url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #f9dd34;
        +	background: #ffef8f;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #cd0a0a;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_72a7cf_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_72a7cf_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_2694e8_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_2e83ff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_3d80b3_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee url("images/ui-bg_diagonals-thick_90_eeeeee_40x40.png") 50% 50% repeat;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #000000;
        +	box-shadow: -7px -7px 7px #000000;
        +}
        diff --git a/bower_components/jquery-ui/themes/cupertino/jquery-ui.min.css b/bower_components/jquery-ui/themes/cupertino/jquery-ui.min.css
        new file mode 100644
        index 0000000000..ef73f044ee
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/cupertino/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #aed0ea}.ui-widget-content{border:1px solid #ddd;background:#f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;color:#362b36}.ui-widget-content a{color:#362b36}.ui-widget-header{border:1px solid #aed0ea;background:#deedf7 url("images/ui-bg_highlight-soft_100_deedf7_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #aed0ea;background:#d7ebf9 url("images/ui-bg_glass_80_d7ebf9_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2779aa}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#2779aa;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #74b2e2;background:#e4f1fb url("images/ui-bg_glass_100_e4f1fb_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#0070a3}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#0070a3;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #2694e8;background:#3baae3 url("images/ui-bg_glass_50_3baae3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#2694e8;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #f9dd34;background:#ffef8f url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x;color:#363636}.ui-state-checked{border:1px solid #f9dd34;background:#ffef8f}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#cd0a0a;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_72a7cf_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_72a7cf_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_2694e8_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_3d80b3_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee url("images/ui-bg_diagonals-thick_90_eeeeee_40x40.png") 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #000;box-shadow:-7px -7px 7px #000}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/cupertino/theme.css b/bower_components/jquery-ui/themes/cupertino/theme.css
        new file mode 100644
        index 0000000000..1ab56fdb5c
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/cupertino/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #aed0ea;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;
        +	color: #362b36;
        +}
        +.ui-widget-content a {
        +	color: #362b36;
        +}
        +.ui-widget-header {
        +	border: 1px solid #aed0ea;
        +	background: #deedf7 url("images/ui-bg_highlight-soft_100_deedf7_1x100.png") 50% 50% repeat-x;
        +	color: #222222;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #222222;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #aed0ea;
        +	background: #d7ebf9 url("images/ui-bg_glass_80_d7ebf9_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #2779aa;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #2779aa;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #74b2e2;
        +	background: #e4f1fb url("images/ui-bg_glass_100_e4f1fb_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #0070a3;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #0070a3;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #2694e8;
        +	background: #3baae3 url("images/ui-bg_glass_50_3baae3_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #2694e8;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #f9dd34;
        +	background: #ffef8f url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #f9dd34;
        +	background: #ffef8f;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #cd0a0a;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_72a7cf_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_72a7cf_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_2694e8_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_2e83ff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_3d80b3_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee url("images/ui-bg_diagonals-thick_90_eeeeee_40x40.png") 50% 50% repeat;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #000000;
        +	box-shadow: -7px -7px 7px #000000;
        +}
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_glass_40_ffc73d_1x400.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_glass_40_ffc73d_1x400.png
        new file mode 100644
        index 0000000000..f528008685
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_glass_40_ffc73d_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png
        new file mode 100644
        index 0000000000..342a7e2d7a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png
        new file mode 100644
        index 0000000000..3b559813cf
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_35_222222_1x100.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_35_222222_1x100.png
        new file mode 100644
        index 0000000000..68970d0403
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_35_222222_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_44_444444_1x100.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_44_444444_1x100.png
        new file mode 100644
        index 0000000000..3f19c178ff
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_44_444444_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png
        new file mode 100644
        index 0000000000..6a501884e1
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_loop_25_000000_21x21.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_loop_25_000000_21x21.png
        new file mode 100644
        index 0000000000..3c22784693
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-bg_loop_25_000000_21x21.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_222222_256x240.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_222222_256x240.png
        new file mode 100644
        index 0000000000..f184400db5
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_222222_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_4b8e0b_256x240.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_4b8e0b_256x240.png
        new file mode 100644
        index 0000000000..4faad3e924
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_4b8e0b_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_a83300_256x240.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_a83300_256x240.png
        new file mode 100644
        index 0000000000..51581b3e40
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_a83300_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_cccccc_256x240.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_cccccc_256x240.png
        new file mode 100644
        index 0000000000..4184f21a6b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_cccccc_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dark-hive/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dark-hive/jquery-ui.css b/bower_components/jquery-ui/themes/dark-hive/jquery-ui.css
        new file mode 100644
        index 0000000000..76154ac0a9
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/dark-hive/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=444444&bgTextureHeader=highlight_soft&bgImgOpacityHeader=44&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=loop&bgImgOpacityContent=25&borderColorContent=555555&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=222222&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=444444&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=003147&bgTextureHover=highlight_soft&bgImgOpacityHover=33&borderColorHover=0b93d5&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=0972a5&bgTextureActive=highlight_hard&bgImgOpacityActive=20&borderColorActive=26b3f7&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #444444;
        +}
        +.ui-widget-content {
        +	border: 1px solid #555555;
        +	background: #000000 url("images/ui-bg_loop_25_000000_21x21.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #333333;
        +	background: #444444 url("images/ui-bg_highlight-soft_44_444444_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #444444;
        +	background: #222222 url("images/ui-bg_highlight-soft_35_222222_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #eeeeee;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #eeeeee;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #0b93d5;
        +	background: #003147 url("images/ui-bg_highlight-soft_33_003147_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #26b3f7;
        +	background: #0972a5 url("images/ui-bg_highlight-hard_20_0972a5_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #26b3f7;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;
        +	color: #2e7db2;
        +}
        +.ui-state-checked {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #2e7db2;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ffb73d;
        +	background: #ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;
        +	color: #111111;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #111111;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #111111;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4b8e0b_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_a83300_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #5c5c5c;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #cccccc;
        +	box-shadow: -7px -7px 7px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/dark-hive/jquery-ui.min.css b/bower_components/jquery-ui/themes/dark-hive/jquery-ui.min.css
        new file mode 100644
        index 0000000000..a3cbf771d9
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/dark-hive/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=444444&bgTextureHeader=highlight_soft&bgImgOpacityHeader=44&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=loop&bgImgOpacityContent=25&borderColorContent=555555&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=222222&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=444444&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=003147&bgTextureHover=highlight_soft&bgImgOpacityHover=33&borderColorHover=0b93d5&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=0972a5&bgTextureActive=highlight_hard&bgImgOpacityActive=20&borderColorActive=26b3f7&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #444}.ui-widget-content{border:1px solid #555;background:#000 url("images/ui-bg_loop_25_000000_21x21.png") 50% 50% repeat;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#444 url("images/ui-bg_highlight-soft_44_444444_1x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #444;background:#222 url("images/ui-bg_highlight-soft_35_222222_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#eee;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #0b93d5;background:#003147 url("images/ui-bg_highlight-soft_33_003147_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #26b3f7;background:#0972a5 url("images/ui-bg_highlight-hard_20_0972a5_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#26b3f7;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#eee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;color:#2e7db2}.ui-state-checked{border:1px solid #ccc;background:#eee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4b8e0b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_a83300_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #ccc;box-shadow:-7px -7px 7px #ccc}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/dark-hive/theme.css b/bower_components/jquery-ui/themes/dark-hive/theme.css
        new file mode 100644
        index 0000000000..19c62c7c2f
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/dark-hive/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=444444&bgTextureHeader=highlight_soft&bgImgOpacityHeader=44&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=loop&bgImgOpacityContent=25&borderColorContent=555555&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=222222&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=444444&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=003147&bgTextureHover=highlight_soft&bgImgOpacityHover=33&borderColorHover=0b93d5&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=0972a5&bgTextureActive=highlight_hard&bgImgOpacityActive=20&borderColorActive=26b3f7&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #444444;
        +}
        +.ui-widget-content {
        +	border: 1px solid #555555;
        +	background: #000000 url("images/ui-bg_loop_25_000000_21x21.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #333333;
        +	background: #444444 url("images/ui-bg_highlight-soft_44_444444_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #444444;
        +	background: #222222 url("images/ui-bg_highlight-soft_35_222222_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #eeeeee;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #eeeeee;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #0b93d5;
        +	background: #003147 url("images/ui-bg_highlight-soft_33_003147_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #26b3f7;
        +	background: #0972a5 url("images/ui-bg_highlight-hard_20_0972a5_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #26b3f7;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;
        +	color: #2e7db2;
        +}
        +.ui-state-checked {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #2e7db2;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ffb73d;
        +	background: #ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;
        +	color: #111111;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #111111;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #111111;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4b8e0b_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_a83300_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #5c5c5c;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #cccccc;
        +	box-shadow: -7px -7px 7px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png
        new file mode 100644
        index 0000000000..7fcdd6975a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-medium_30_0b58a2_4x4.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-medium_30_0b58a2_4x4.png
        new file mode 100644
        index 0000000000..64ea097bae
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-medium_30_0b58a2_4x4.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_20_333333_2x2.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_20_333333_2x2.png
        new file mode 100644
        index 0000000000..b8aae959c8
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_20_333333_2x2.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_30_a32d00_2x2.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_30_a32d00_2x2.png
        new file mode 100644
        index 0000000000..be4135db12
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_30_a32d00_2x2.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_40_00498f_2x2.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_40_00498f_2x2.png
        new file mode 100644
        index 0000000000..2569395350
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_dots-small_40_00498f_2x2.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_gloss-wave_20_111111_500x100.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_gloss-wave_20_111111_500x100.png
        new file mode 100644
        index 0000000000..99975d849c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-bg_gloss-wave_20_111111_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_00498f_256x240.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_00498f_256x240.png
        new file mode 100644
        index 0000000000..6ec4b39590
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_00498f_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_98d2fb_256x240.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_98d2fb_256x240.png
        new file mode 100644
        index 0000000000..fccf8937d4
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_98d2fb_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_9ccdfc_256x240.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_9ccdfc_256x240.png
        new file mode 100644
        index 0000000000..1225513244
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_9ccdfc_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/dot-luv/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/dot-luv/jquery-ui.css b/bower_components/jquery-ui/themes/dot-luv/jquery-ui.css
        new file mode 100644
        index 0000000000..bdd1439ef3
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/dot-luv/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.3em&cornerRadius=4px&bgColorHeader=0b3e6f&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=15&borderColorHeader=0b3e6f&fcHeader=f6f6f6&iconColorHeader=98d2fb&bgColorContent=111111&bgTextureContent=gloss_wave&bgImgOpacityContent=20&borderColorContent=000000&fcContent=d9d9d9&iconColorContent=9ccdfc&bgColorDefault=333333&bgTextureDefault=dots_small&bgImgOpacityDefault=20&borderColorDefault=333333&fcDefault=ffffff&iconColorDefault=9ccdfc&bgColorHover=00498f&bgTextureHover=dots_small&bgImgOpacityHover=40&borderColorHover=222222&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=292929&bgTextureActive=flat&bgImgOpacityActive=40&borderColorActive=096ac8&fcActive=75abff&iconColorActive=00498f&bgColorHighlight=0b58a2&bgTextureHighlight=dots_medium&bgImgOpacityHighlight=30&borderColorHighlight=052f57&fcHighlight=ffffff&iconColorHighlight=ffffff&bgColorError=a32d00&bgTextureError=dots_small&bgImgOpacityError=30&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Arial,sans-serif;
        +	font-size: 1.3em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #333333;
        +}
        +.ui-widget-content {
        +	border: 1px solid #000000;
        +	background: #111111 url("images/ui-bg_gloss-wave_20_111111_500x100.png") 50% top repeat-x;
        +	color: #d9d9d9;
        +}
        +.ui-widget-content a {
        +	color: #d9d9d9;
        +}
        +.ui-widget-header {
        +	border: 1px solid #0b3e6f;
        +	background: #0b3e6f url("images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png") 50% 50% repeat;
        +	color: #f6f6f6;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #f6f6f6;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #333333;
        +	background: #333333 url("images/ui-bg_dots-small_20_333333_2x2.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #222222;
        +	background: #00498f url("images/ui-bg_dots-small_40_00498f_2x2.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #096ac8;
        +	background: #292929;
        +	font-weight: bold;
        +	color: #75abff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #096ac8;
        +	background-color: #75abff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #75abff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #052f57;
        +	background: #0b58a2 url("images/ui-bg_dots-medium_30_0b58a2_4x4.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-checked {
        +	border: 1px solid #052f57;
        +	background: #0b58a2;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #ffffff;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #a32d00 url("images/ui-bg_dots-small_30_a32d00_2x2.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_9ccdfc_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_98d2fb_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_00498f_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_9ccdfc_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/dot-luv/jquery-ui.min.css b/bower_components/jquery-ui/themes/dot-luv/jquery-ui.min.css
        new file mode 100644
        index 0000000000..0e1ae2c59e
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/dot-luv/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.3em&cornerRadius=4px&bgColorHeader=0b3e6f&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=15&borderColorHeader=0b3e6f&fcHeader=f6f6f6&iconColorHeader=98d2fb&bgColorContent=111111&bgTextureContent=gloss_wave&bgImgOpacityContent=20&borderColorContent=000000&fcContent=d9d9d9&iconColorContent=9ccdfc&bgColorDefault=333333&bgTextureDefault=dots_small&bgImgOpacityDefault=20&borderColorDefault=333333&fcDefault=ffffff&iconColorDefault=9ccdfc&bgColorHover=00498f&bgTextureHover=dots_small&bgImgOpacityHover=40&borderColorHover=222222&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=292929&bgTextureActive=flat&bgImgOpacityActive=40&borderColorActive=096ac8&fcActive=75abff&iconColorActive=00498f&bgColorHighlight=0b58a2&bgTextureHighlight=dots_medium&bgImgOpacityHighlight=30&borderColorHighlight=052f57&fcHighlight=ffffff&iconColorHighlight=ffffff&bgColorError=a32d00&bgTextureError=dots_small&bgImgOpacityError=30&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,sans-serif;font-size:1.3em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #333}.ui-widget-content{border:1px solid #000;background:#111 url("images/ui-bg_gloss-wave_20_111111_500x100.png") 50% top repeat-x;color:#d9d9d9}.ui-widget-content a{color:#d9d9d9}.ui-widget-header{border:1px solid #0b3e6f;background:#0b3e6f url("images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png") 50% 50% repeat;color:#f6f6f6;font-weight:bold}.ui-widget-header a{color:#f6f6f6}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #333;background:#333 url("images/ui-bg_dots-small_20_333333_2x2.png") 50% 50% repeat;font-weight:bold;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #222;background:#00498f url("images/ui-bg_dots-small_40_00498f_2x2.png") 50% 50% repeat;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #096ac8;background:#292929;font-weight:bold;color:#75abff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#096ac8;background-color:#75abff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#75abff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #052f57;background:#0b58a2 url("images/ui-bg_dots-medium_30_0b58a2_4x4.png") 50% 50% repeat;color:#fff}.ui-state-checked{border:1px solid #052f57;background:#0b58a2}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#fff}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#a32d00 url("images/ui-bg_dots-small_30_a32d00_2x2.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_9ccdfc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_98d2fb_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_00498f_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_9ccdfc_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/dot-luv/theme.css b/bower_components/jquery-ui/themes/dot-luv/theme.css
        new file mode 100644
        index 0000000000..bb92a6c786
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/dot-luv/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.3em&cornerRadius=4px&bgColorHeader=0b3e6f&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=15&borderColorHeader=0b3e6f&fcHeader=f6f6f6&iconColorHeader=98d2fb&bgColorContent=111111&bgTextureContent=gloss_wave&bgImgOpacityContent=20&borderColorContent=000000&fcContent=d9d9d9&iconColorContent=9ccdfc&bgColorDefault=333333&bgTextureDefault=dots_small&bgImgOpacityDefault=20&borderColorDefault=333333&fcDefault=ffffff&iconColorDefault=9ccdfc&bgColorHover=00498f&bgTextureHover=dots_small&bgImgOpacityHover=40&borderColorHover=222222&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=292929&bgTextureActive=flat&bgImgOpacityActive=40&borderColorActive=096ac8&fcActive=75abff&iconColorActive=00498f&bgColorHighlight=0b58a2&bgTextureHighlight=dots_medium&bgImgOpacityHighlight=30&borderColorHighlight=052f57&fcHighlight=ffffff&iconColorHighlight=ffffff&bgColorError=a32d00&bgTextureError=dots_small&bgImgOpacityError=30&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Arial,sans-serif;
        +	font-size: 1.3em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #333333;
        +}
        +.ui-widget-content {
        +	border: 1px solid #000000;
        +	background: #111111 url("images/ui-bg_gloss-wave_20_111111_500x100.png") 50% top repeat-x;
        +	color: #d9d9d9;
        +}
        +.ui-widget-content a {
        +	color: #d9d9d9;
        +}
        +.ui-widget-header {
        +	border: 1px solid #0b3e6f;
        +	background: #0b3e6f url("images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png") 50% 50% repeat;
        +	color: #f6f6f6;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #f6f6f6;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #333333;
        +	background: #333333 url("images/ui-bg_dots-small_20_333333_2x2.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #222222;
        +	background: #00498f url("images/ui-bg_dots-small_40_00498f_2x2.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #096ac8;
        +	background: #292929;
        +	font-weight: bold;
        +	color: #75abff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #096ac8;
        +	background-color: #75abff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #75abff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #052f57;
        +	background: #0b58a2 url("images/ui-bg_dots-medium_30_0b58a2_4x4.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-checked {
        +	border: 1px solid #052f57;
        +	background: #0b58a2;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #ffffff;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #a32d00 url("images/ui-bg_dots-small_30_a32d00_2x2.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_9ccdfc_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_98d2fb_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_00498f_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_9ccdfc_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png
        new file mode 100644
        index 0000000000..341976f757
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_100_dcd9de_1x100.png b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_100_dcd9de_1x100.png
        new file mode 100644
        index 0000000000..a015034c56
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_100_dcd9de_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_100_eae6ea_1x100.png b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_100_eae6ea_1x100.png
        new file mode 100644
        index 0000000000..46eedf8f17
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_100_eae6ea_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_25_30273a_1x100.png b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_25_30273a_1x100.png
        new file mode 100644
        index 0000000000..7b1e0948d0
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_25_30273a_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png
        new file mode 100644
        index 0000000000..3bd2540a45
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-icons_454545_256x240.png b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_454545_256x240.png
        new file mode 100644
        index 0000000000..e6e41cd078
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_454545_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-icons_734d99_256x240.png b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_734d99_256x240.png
        new file mode 100644
        index 0000000000..6f8938e416
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_734d99_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-icons_8d78a5_256x240.png b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_8d78a5_256x240.png
        new file mode 100644
        index 0000000000..4d0a1f11de
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_8d78a5_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-icons_a8a3ae_256x240.png b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_a8a3ae_256x240.png
        new file mode 100644
        index 0000000000..54613679c1
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_a8a3ae_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-icons_ebccce_256x240.png b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_ebccce_256x240.png
        new file mode 100644
        index 0000000000..539dbc1acc
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_ebccce_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/eggplant/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/eggplant/jquery-ui.css b/bower_components/jquery-ui/themes/eggplant/jquery-ui.css
        new file mode 100644
        index 0000000000..03546dae28
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/eggplant/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=30273a&bgTextureHeader=highlight_soft&bgImgOpacityHeader=25&borderColorHeader=231d2b&fcHeader=ffffff&iconColorHeader=a8a3ae&bgColorContent=3d3644&bgTextureContent=gloss_wave&bgImgOpacityContent=30&borderColorContent=7e7783&fcContent=ffffff&iconColorContent=ffffff&bgColorDefault=dcd9de&bgTextureDefault=highlight_soft&bgImgOpacityDefault=100&borderColorDefault=dcd9de&fcDefault=665874&iconColorDefault=8d78a5&bgColorHover=eae6ea&bgTextureHover=highlight_soft&bgImgOpacityHover=100&borderColorHover=d1c5d8&fcHover=734d99&iconColorHover=734d99&bgColorActive=5f5964&bgTextureActive=highlight_soft&bgImgOpacityActive=45&borderColorActive=7e7783&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=fafafa&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffdb1f&fcHighlight=333333&iconColorHighlight=8d78a5&bgColorError=994d53&bgTextureError=flat&bgImgOpacityError=55&borderColorError=994d53&fcError=ffffff&iconColorError=ebccce&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #dcd9de;
        +}
        +.ui-widget-content {
        +	border: 1px solid #7e7783;
        +	background: #3d3644 url("images/ui-bg_gloss-wave_30_3d3644_500x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #231d2b;
        +	background: #30273a url("images/ui-bg_highlight-soft_25_30273a_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #dcd9de;
        +	background: #dcd9de url("images/ui-bg_highlight-soft_100_dcd9de_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #665874;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #665874;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #d1c5d8;
        +	background: #eae6ea url("images/ui-bg_highlight-soft_100_eae6ea_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #734d99;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #734d99;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #7e7783;
        +	background: #5f5964 url("images/ui-bg_highlight-soft_45_5f5964_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #7e7783;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffdb1f;
        +	background: #fafafa;
        +	color: #333333;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffdb1f;
        +	background: #fafafa;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #333333;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #994d53;
        +	background: #994d53;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_a8a3ae_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_734d99_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_8d78a5_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ebccce_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_8d78a5_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -4px -4px 4px #aaaaaa;
        +	box-shadow: -4px -4px 4px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/eggplant/jquery-ui.min.css b/bower_components/jquery-ui/themes/eggplant/jquery-ui.min.css
        new file mode 100644
        index 0000000000..200c493e44
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/eggplant/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=30273a&bgTextureHeader=highlight_soft&bgImgOpacityHeader=25&borderColorHeader=231d2b&fcHeader=ffffff&iconColorHeader=a8a3ae&bgColorContent=3d3644&bgTextureContent=gloss_wave&bgImgOpacityContent=30&borderColorContent=7e7783&fcContent=ffffff&iconColorContent=ffffff&bgColorDefault=dcd9de&bgTextureDefault=highlight_soft&bgImgOpacityDefault=100&borderColorDefault=dcd9de&fcDefault=665874&iconColorDefault=8d78a5&bgColorHover=eae6ea&bgTextureHover=highlight_soft&bgImgOpacityHover=100&borderColorHover=d1c5d8&fcHover=734d99&iconColorHover=734d99&bgColorActive=5f5964&bgTextureActive=highlight_soft&bgImgOpacityActive=45&borderColorActive=7e7783&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=fafafa&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffdb1f&fcHighlight=333333&iconColorHighlight=8d78a5&bgColorError=994d53&bgTextureError=flat&bgImgOpacityError=55&borderColorError=994d53&fcError=ffffff&iconColorError=ebccce&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #dcd9de}.ui-widget-content{border:1px solid #7e7783;background:#3d3644 url("images/ui-bg_gloss-wave_30_3d3644_500x100.png") 50% top repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #231d2b;background:#30273a url("images/ui-bg_highlight-soft_25_30273a_1x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #dcd9de;background:#dcd9de url("images/ui-bg_highlight-soft_100_dcd9de_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#665874}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#665874;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #d1c5d8;background:#eae6ea url("images/ui-bg_highlight-soft_100_eae6ea_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#734d99}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#734d99;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #7e7783;background:#5f5964 url("images/ui-bg_highlight-soft_45_5f5964_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#7e7783;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ffdb1f;background:#fafafa;color:#333}.ui-state-checked{border:1px solid #ffdb1f;background:#fafafa}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#333}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #994d53;background:#994d53;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_a8a3ae_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_734d99_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_8d78a5_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ebccce_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_8d78a5_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-4px -4px 4px #aaa;box-shadow:-4px -4px 4px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/eggplant/theme.css b/bower_components/jquery-ui/themes/eggplant/theme.css
        new file mode 100644
        index 0000000000..64e63d591e
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/eggplant/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=30273a&bgTextureHeader=highlight_soft&bgImgOpacityHeader=25&borderColorHeader=231d2b&fcHeader=ffffff&iconColorHeader=a8a3ae&bgColorContent=3d3644&bgTextureContent=gloss_wave&bgImgOpacityContent=30&borderColorContent=7e7783&fcContent=ffffff&iconColorContent=ffffff&bgColorDefault=dcd9de&bgTextureDefault=highlight_soft&bgImgOpacityDefault=100&borderColorDefault=dcd9de&fcDefault=665874&iconColorDefault=8d78a5&bgColorHover=eae6ea&bgTextureHover=highlight_soft&bgImgOpacityHover=100&borderColorHover=d1c5d8&fcHover=734d99&iconColorHover=734d99&bgColorActive=5f5964&bgTextureActive=highlight_soft&bgImgOpacityActive=45&borderColorActive=7e7783&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=fafafa&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffdb1f&fcHighlight=333333&iconColorHighlight=8d78a5&bgColorError=994d53&bgTextureError=flat&bgImgOpacityError=55&borderColorError=994d53&fcError=ffffff&iconColorError=ebccce&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #dcd9de;
        +}
        +.ui-widget-content {
        +	border: 1px solid #7e7783;
        +	background: #3d3644 url("images/ui-bg_gloss-wave_30_3d3644_500x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #231d2b;
        +	background: #30273a url("images/ui-bg_highlight-soft_25_30273a_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #dcd9de;
        +	background: #dcd9de url("images/ui-bg_highlight-soft_100_dcd9de_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #665874;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #665874;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #d1c5d8;
        +	background: #eae6ea url("images/ui-bg_highlight-soft_100_eae6ea_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #734d99;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #734d99;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #7e7783;
        +	background: #5f5964 url("images/ui-bg_highlight-soft_45_5f5964_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #7e7783;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffdb1f;
        +	background: #fafafa;
        +	color: #333333;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffdb1f;
        +	background: #fafafa;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #333333;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #994d53;
        +	background: #994d53;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_a8a3ae_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_734d99_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_8d78a5_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ebccce_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_8d78a5_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -4px -4px 4px #aaaaaa;
        +	box-shadow: -4px -4px 4px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-small_25_c5ddfc_40x40.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-small_25_c5ddfc_40x40.png
        new file mode 100644
        index 0000000000..9d264232e8
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-small_25_c5ddfc_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_20_e69700_40x40.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_20_e69700_40x40.png
        new file mode 100644
        index 0000000000..9f11531529
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_20_e69700_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_22_1484e6_40x40.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_22_1484e6_40x40.png
        new file mode 100644
        index 0000000000..95bc7e9ed4
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_22_1484e6_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_26_2293f7_40x40.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_26_2293f7_40x40.png
        new file mode 100644
        index 0000000000..0eecd2e49f
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_diagonals-thick_26_2293f7_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_highlight-soft_100_f9f9f9_1x100.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_highlight-soft_100_f9f9f9_1x100.png
        new file mode 100644
        index 0000000000..4aebfd3d49
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_highlight-soft_100_f9f9f9_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_inset-hard_100_eeeeee_1x100.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_inset-hard_100_eeeeee_1x100.png
        new file mode 100644
        index 0000000000..ee0c7bdc96
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-bg_inset-hard_100_eeeeee_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_0a82eb_256x240.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_0a82eb_256x240.png
        new file mode 100644
        index 0000000000..243d857227
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_0a82eb_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_0b54d5_256x240.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_0b54d5_256x240.png
        new file mode 100644
        index 0000000000..37c7143a09
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_0b54d5_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_5fa5e3_256x240.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_5fa5e3_256x240.png
        new file mode 100644
        index 0000000000..690a3b5a32
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_5fa5e3_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_fcdd4a_256x240.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_fcdd4a_256x240.png
        new file mode 100644
        index 0000000000..bcc357ee9c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_fcdd4a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/excite-bike/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/excite-bike/jquery-ui.css b/bower_components/jquery-ui/themes/excite-bike/jquery-ui.css
        new file mode 100644
        index 0000000000..edd1b91afe
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/excite-bike/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=segoe%20ui%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=3px&bgColorHeader=f9f9f9&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=cccccc&fcHeader=e69700&iconColorHeader=5fa5e3&bgColorContent=eeeeee&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=0a82eb&bgColorDefault=1484e6&bgTextureDefault=diagonals_thick&bgImgOpacityDefault=22&borderColorDefault=ffffff&fcDefault=ffffff&iconColorDefault=fcdd4a&bgColorHover=2293f7&bgTextureHover=diagonals_thick&bgImgOpacityHover=26&borderColorHover=2293f7&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=e69700&bgTextureActive=diagonals_thick&bgImgOpacityActive=20&borderColorActive=e69700&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=c5ddfc&bgTextureHighlight=diagonals_small&bgImgOpacityHighlight=25&borderColorHighlight=ffffff&fcHighlight=333333&iconColorHighlight=0b54d5&bgColorError=e69700&bgTextureError=diagonals_thick&bgImgOpacityError=20&borderColorError=e69700&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=e6b900&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=e69700&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=20&thicknessShadow=0px&offsetTopShadow=6px&offsetLeftShadow=6px&cornerRadiusShadow=3px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #ffffff;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #eeeeee url("images/ui-bg_inset-hard_100_eeeeee_1x100.png") 50% bottom repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #cccccc;
        +	background: #f9f9f9 url("images/ui-bg_highlight-soft_100_f9f9f9_1x100.png") 50% 50% repeat-x;
        +	color: #e69700;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #e69700;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #ffffff;
        +	background: #1484e6 url("images/ui-bg_diagonals-thick_22_1484e6_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #2293f7;
        +	background: #2293f7 url("images/ui-bg_diagonals-thick_26_2293f7_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #e69700;
        +	background: #e69700 url("images/ui-bg_diagonals-thick_20_e69700_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #e69700;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffffff;
        +	background: #c5ddfc url("images/ui-bg_diagonals-small_25_c5ddfc_40x40.png") 50% 50% repeat;
        +	color: #333333;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffffff;
        +	background: #c5ddfc;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #333333;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #e69700;
        +	background: #e69700 url("images/ui-bg_diagonals-thick_20_e69700_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_0a82eb_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_5fa5e3_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_0b54d5_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_fcdd4a_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 3px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #e6b900;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 6px 6px 0px #e69700;
        +	box-shadow: 6px 6px 0px #e69700;
        +}
        diff --git a/bower_components/jquery-ui/themes/excite-bike/jquery-ui.min.css b/bower_components/jquery-ui/themes/excite-bike/jquery-ui.min.css
        new file mode 100644
        index 0000000000..dea16e15b6
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/excite-bike/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=segoe%20ui%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=3px&bgColorHeader=f9f9f9&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=cccccc&fcHeader=e69700&iconColorHeader=5fa5e3&bgColorContent=eeeeee&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=0a82eb&bgColorDefault=1484e6&bgTextureDefault=diagonals_thick&bgImgOpacityDefault=22&borderColorDefault=ffffff&fcDefault=ffffff&iconColorDefault=fcdd4a&bgColorHover=2293f7&bgTextureHover=diagonals_thick&bgImgOpacityHover=26&borderColorHover=2293f7&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=e69700&bgTextureActive=diagonals_thick&bgImgOpacityActive=20&borderColorActive=e69700&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=c5ddfc&bgTextureHighlight=diagonals_small&bgImgOpacityHighlight=25&borderColorHighlight=ffffff&fcHighlight=333333&iconColorHighlight=0b54d5&bgColorError=e69700&bgTextureError=diagonals_thick&bgImgOpacityError=20&borderColorError=e69700&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=e6b900&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=e69700&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=20&thicknessShadow=0px&offsetTopShadow=6px&offsetLeftShadow=6px&cornerRadiusShadow=3px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:segoe ui,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:segoe ui,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #fff}.ui-widget-content{border:1px solid #aaa;background:#eee url("images/ui-bg_inset-hard_100_eeeeee_1x100.png") 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #ccc;background:#f9f9f9 url("images/ui-bg_highlight-soft_100_f9f9f9_1x100.png") 50% 50% repeat-x;color:#e69700;font-weight:bold}.ui-widget-header a{color:#e69700}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #fff;background:#1484e6 url("images/ui-bg_diagonals-thick_22_1484e6_40x40.png") 50% 50% repeat;font-weight:bold;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #2293f7;background:#2293f7 url("images/ui-bg_diagonals-thick_26_2293f7_40x40.png") 50% 50% repeat;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #e69700;background:#e69700 url("images/ui-bg_diagonals-thick_20_e69700_40x40.png") 50% 50% repeat;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#e69700;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fff;background:#c5ddfc url("images/ui-bg_diagonals-small_25_c5ddfc_40x40.png") 50% 50% repeat;color:#333}.ui-state-checked{border:1px solid #fff;background:#c5ddfc}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#333}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #e69700;background:#e69700 url("images/ui-bg_diagonals-thick_20_e69700_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_0a82eb_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_5fa5e3_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_0b54d5_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_fcdd4a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#e6b900;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:6px 6px 0 #e69700;box-shadow:6px 6px 0 #e69700}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/excite-bike/theme.css b/bower_components/jquery-ui/themes/excite-bike/theme.css
        new file mode 100644
        index 0000000000..948f54b8f9
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/excite-bike/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=segoe%20ui%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=3px&bgColorHeader=f9f9f9&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=cccccc&fcHeader=e69700&iconColorHeader=5fa5e3&bgColorContent=eeeeee&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=0a82eb&bgColorDefault=1484e6&bgTextureDefault=diagonals_thick&bgImgOpacityDefault=22&borderColorDefault=ffffff&fcDefault=ffffff&iconColorDefault=fcdd4a&bgColorHover=2293f7&bgTextureHover=diagonals_thick&bgImgOpacityHover=26&borderColorHover=2293f7&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=e69700&bgTextureActive=diagonals_thick&bgImgOpacityActive=20&borderColorActive=e69700&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=c5ddfc&bgTextureHighlight=diagonals_small&bgImgOpacityHighlight=25&borderColorHighlight=ffffff&fcHighlight=333333&iconColorHighlight=0b54d5&bgColorError=e69700&bgTextureError=diagonals_thick&bgImgOpacityError=20&borderColorError=e69700&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=e6b900&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=e69700&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=20&thicknessShadow=0px&offsetTopShadow=6px&offsetLeftShadow=6px&cornerRadiusShadow=3px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #ffffff;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #eeeeee url("images/ui-bg_inset-hard_100_eeeeee_1x100.png") 50% bottom repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #cccccc;
        +	background: #f9f9f9 url("images/ui-bg_highlight-soft_100_f9f9f9_1x100.png") 50% 50% repeat-x;
        +	color: #e69700;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #e69700;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #ffffff;
        +	background: #1484e6 url("images/ui-bg_diagonals-thick_22_1484e6_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #2293f7;
        +	background: #2293f7 url("images/ui-bg_diagonals-thick_26_2293f7_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #e69700;
        +	background: #e69700 url("images/ui-bg_diagonals-thick_20_e69700_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #e69700;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffffff;
        +	background: #c5ddfc url("images/ui-bg_diagonals-small_25_c5ddfc_40x40.png") 50% 50% repeat;
        +	color: #333333;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffffff;
        +	background: #c5ddfc;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #333333;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #e69700;
        +	background: #e69700 url("images/ui-bg_diagonals-thick_20_e69700_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_0a82eb_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_5fa5e3_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_0b54d5_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_fcdd4a_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 3px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 3px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #e6b900;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 6px 6px 0px #e69700;
        +	box-shadow: 6px 6px 0px #e69700;
        +}
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-bg_glass_65_ffffff_1x400.png b/bower_components/jquery-ui/themes/flick/images/ui-bg_glass_65_ffffff_1x400.png
        new file mode 100644
        index 0000000000..520d5047fb
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-bg_glass_65_ffffff_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png b/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png
        new file mode 100644
        index 0000000000..a0d8f0eb22
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png b/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png
        new file mode 100644
        index 0000000000..ba2ede19a0
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png b/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png
        new file mode 100644
        index 0000000000..8a528ef840
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-icons_0073ea_256x240.png b/bower_components/jquery-ui/themes/flick/images/ui-icons_0073ea_256x240.png
        new file mode 100644
        index 0000000000..375b0e3178
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-icons_0073ea_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-icons_454545_256x240.png b/bower_components/jquery-ui/themes/flick/images/ui-icons_454545_256x240.png
        new file mode 100644
        index 0000000000..e6e41cd078
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-icons_454545_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-icons_666666_256x240.png b/bower_components/jquery-ui/themes/flick/images/ui-icons_666666_256x240.png
        new file mode 100644
        index 0000000000..4bdf1575e3
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-icons_666666_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-icons_ff0084_256x240.png b/bower_components/jquery-ui/themes/flick/images/ui-icons_ff0084_256x240.png
        new file mode 100644
        index 0000000000..d79c1ee521
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-icons_ff0084_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/flick/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/flick/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/flick/jquery-ui.css b/bower_components/jquery-ui/themes/flick/jquery-ui.css
        new file mode 100644
        index 0000000000..91a513e934
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/flick/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=2px&bgColorHeader=dddddd&bgTextureHeader=highlight_soft&bgImgOpacityHeader=50&borderColorHeader=dddddd&fcHeader=444444&iconColorHeader=0073ea&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=dddddd&fcContent=444444&iconColorContent=ff0084&bgColorDefault=f6f6f6&bgTextureDefault=highlight_soft&bgImgOpacityDefault=100&borderColorDefault=dddddd&fcDefault=0073ea&iconColorDefault=666666&bgColorHover=0073ea&bgTextureHover=highlight_soft&bgImgOpacityHover=25&borderColorHover=0073ea&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=dddddd&fcActive=ff0084&iconColorActive=454545&bgColorHighlight=ffffff&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=cccccc&fcHighlight=444444&iconColorHighlight=0073ea&bgColorError=ffffff&bgTextureError=flat&bgImgOpacityError=55&borderColorError=ff0084&fcError=222222&iconColorError=ff0084&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #dddddd;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #ffffff;
        +	color: #444444;
        +}
        +.ui-widget-content a {
        +	color: #444444;
        +}
        +.ui-widget-header {
        +	border: 1px solid #dddddd;
        +	background: #dddddd url("images/ui-bg_highlight-soft_50_dddddd_1x100.png") 50% 50% repeat-x;
        +	color: #444444;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #444444;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #dddddd;
        +	background: #f6f6f6 url("images/ui-bg_highlight-soft_100_f6f6f6_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #0073ea;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #0073ea;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #0073ea;
        +	background: #0073ea url("images/ui-bg_highlight-soft_25_0073ea_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #dddddd;
        +	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ff0084;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #dddddd;
        +	background-color: #ff0084;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ff0084;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #cccccc;
        +	background: #ffffff;
        +	color: #444444;
        +}
        +.ui-state-checked {
        +	border: 1px solid #cccccc;
        +	background: #ffffff;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #444444;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ff0084;
        +	background: #ffffff;
        +	color: #222222;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #222222;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #222222;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_ff0084_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_0073ea_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_0073ea_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ff0084_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_666666_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 2px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 2px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 2px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 2px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -4px -4px 4px #aaaaaa;
        +	box-shadow: -4px -4px 4px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/flick/jquery-ui.min.css b/bower_components/jquery-ui/themes/flick/jquery-ui.min.css
        new file mode 100644
        index 0000000000..93fbdfb48b
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/flick/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=2px&bgColorHeader=dddddd&bgTextureHeader=highlight_soft&bgImgOpacityHeader=50&borderColorHeader=dddddd&fcHeader=444444&iconColorHeader=0073ea&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=dddddd&fcContent=444444&iconColorContent=ff0084&bgColorDefault=f6f6f6&bgTextureDefault=highlight_soft&bgImgOpacityDefault=100&borderColorDefault=dddddd&fcDefault=0073ea&iconColorDefault=666666&bgColorHover=0073ea&bgTextureHover=highlight_soft&bgImgOpacityHover=25&borderColorHover=0073ea&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=dddddd&fcActive=ff0084&iconColorActive=454545&bgColorHighlight=ffffff&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=cccccc&fcHighlight=444444&iconColorHighlight=0073ea&bgColorError=ffffff&bgTextureError=flat&bgImgOpacityError=55&borderColorError=ff0084&fcError=222222&iconColorError=ff0084&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Helvetica,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Helvetica,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #ddd}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#444}.ui-widget-content a{color:#444}.ui-widget-header{border:1px solid #ddd;background:#ddd url("images/ui-bg_highlight-soft_50_dddddd_1x100.png") 50% 50% repeat-x;color:#444;font-weight:bold}.ui-widget-header a{color:#444}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #ddd;background:#f6f6f6 url("images/ui-bg_highlight-soft_100_f6f6f6_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#0073ea}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#0073ea;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #0073ea;background:#0073ea url("images/ui-bg_highlight-soft_25_0073ea_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ddd;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#ff0084}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ddd;background-color:#ff0084}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#ff0084;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#fff;color:#444}.ui-state-checked{border:1px solid #ccc;background:#fff}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#444}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ff0084;background:#fff;color:#222}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#222}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#222}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_ff0084_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_0073ea_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_0073ea_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ff0084_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_666666_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:2px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:2px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:2px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:2px}.ui-widget-overlay{background:#eee;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-4px -4px 4px #aaa;box-shadow:-4px -4px 4px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/flick/theme.css b/bower_components/jquery-ui/themes/flick/theme.css
        new file mode 100644
        index 0000000000..7801798707
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/flick/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=2px&bgColorHeader=dddddd&bgTextureHeader=highlight_soft&bgImgOpacityHeader=50&borderColorHeader=dddddd&fcHeader=444444&iconColorHeader=0073ea&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=dddddd&fcContent=444444&iconColorContent=ff0084&bgColorDefault=f6f6f6&bgTextureDefault=highlight_soft&bgImgOpacityDefault=100&borderColorDefault=dddddd&fcDefault=0073ea&iconColorDefault=666666&bgColorHover=0073ea&bgTextureHover=highlight_soft&bgImgOpacityHover=25&borderColorHover=0073ea&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=dddddd&fcActive=ff0084&iconColorActive=454545&bgColorHighlight=ffffff&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=cccccc&fcHighlight=444444&iconColorHighlight=0073ea&bgColorError=ffffff&bgTextureError=flat&bgImgOpacityError=55&borderColorError=ff0084&fcError=222222&iconColorError=ff0084&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #dddddd;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #ffffff;
        +	color: #444444;
        +}
        +.ui-widget-content a {
        +	color: #444444;
        +}
        +.ui-widget-header {
        +	border: 1px solid #dddddd;
        +	background: #dddddd url("images/ui-bg_highlight-soft_50_dddddd_1x100.png") 50% 50% repeat-x;
        +	color: #444444;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #444444;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #dddddd;
        +	background: #f6f6f6 url("images/ui-bg_highlight-soft_100_f6f6f6_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #0073ea;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #0073ea;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #0073ea;
        +	background: #0073ea url("images/ui-bg_highlight-soft_25_0073ea_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #dddddd;
        +	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ff0084;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #dddddd;
        +	background-color: #ff0084;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ff0084;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #cccccc;
        +	background: #ffffff;
        +	color: #444444;
        +}
        +.ui-state-checked {
        +	border: 1px solid #cccccc;
        +	background: #ffffff;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #444444;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ff0084;
        +	background: #ffffff;
        +	color: #222222;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #222222;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #222222;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_ff0084_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_0073ea_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_0073ea_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ff0084_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_666666_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 2px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 2px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 2px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 2px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -4px -4px 4px #aaaaaa;
        +	box-shadow: -4px -4px 4px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_40_db4865_40x40.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_40_db4865_40x40.png
        new file mode 100644
        index 0000000000..ffda594b2e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_40_db4865_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_93c3cd_40x40.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_93c3cd_40x40.png
        new file mode 100644
        index 0000000000..b89b76ce32
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_93c3cd_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_ff3853_40x40.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_ff3853_40x40.png
        new file mode 100644
        index 0000000000..1a76690452
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_ff3853_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_75_ccd232_40x40.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_75_ccd232_40x40.png
        new file mode 100644
        index 0000000000..a20fea2946
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_diagonals-small_75_ccd232_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_dots-medium_80_ffff38_4x4.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_dots-medium_80_ffff38_4x4.png
        new file mode 100644
        index 0000000000..db7dfc1e4a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_dots-medium_80_ffff38_4x4.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_dots-small_35_35414f_2x2.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_dots-small_35_35414f_2x2.png
        new file mode 100644
        index 0000000000..632692dd21
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_dots-small_35_35414f_2x2.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_white-lines_85_f7f7ba_40x100.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_white-lines_85_f7f7ba_40x100.png
        new file mode 100644
        index 0000000000..9ea5ce72d8
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-bg_white-lines_85_f7f7ba_40x100.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_454545_256x240.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_454545_256x240.png
        new file mode 100644
        index 0000000000..e6e41cd078
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_454545_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_88a206_256x240.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_88a206_256x240.png
        new file mode 100644
        index 0000000000..1760af0a0e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_88a206_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_c02669_256x240.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_c02669_256x240.png
        new file mode 100644
        index 0000000000..8d0692aa4c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_c02669_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_e1e463_256x240.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_e1e463_256x240.png
        new file mode 100644
        index 0000000000..468aae8023
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_e1e463_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_ffeb33_256x240.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_ffeb33_256x240.png
        new file mode 100644
        index 0000000000..e4a0c7f335
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_ffeb33_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/hot-sneaks/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/jquery-ui.css b/bower_components/jquery-ui/themes/hot-sneaks/jquery-ui.css
        new file mode 100644
        index 0000000000..7b2b56f227
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/hot-sneaks/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Gill%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.2em&cornerRadius=4px&bgColorHeader=35414f&bgTextureHeader=dots_small&bgImgOpacityHeader=35&borderColorHeader=2c4359&fcHeader=e1e463&iconColorHeader=e1e463&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=2c4359&iconColorContent=c02669&bgColorDefault=93c3cd&bgTextureDefault=diagonals_small&bgImgOpacityDefault=50&borderColorDefault=93c3cd&fcDefault=333333&iconColorDefault=ffffff&bgColorHover=ccd232&bgTextureHover=diagonals_small&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=db4865&bgTextureActive=diagonals_small&bgImgOpacityActive=40&borderColorActive=ff6b7f&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffff38&bgTextureHighlight=dots_medium&bgImgOpacityHighlight=80&borderColorHighlight=b4d100&fcHighlight=363636&iconColorHighlight=88a206&bgColorError=ff3853&bgTextureError=diagonals_small&bgImgOpacityError=50&borderColorError=ff6b7f&fcError=ffffff&iconColorError=ffeb33&bgColorOverlay=f7f7ba&bgTextureOverlay=white_lines&bgImgOpacityOverlay=85&opacityOverlay=80&bgColorShadow=ba9217&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=20&thicknessShadow=10px&offsetTopShadow=8px&offsetLeftShadow=8px&cornerRadiusShadow=5px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Gill Sans,Arial,sans-serif;
        +	font-size: 1.2em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Gill Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #93c3cd;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #ffffff;
        +	color: #2c4359;
        +}
        +.ui-widget-content a {
        +	color: #2c4359;
        +}
        +.ui-widget-header {
        +	border: 1px solid #2c4359;
        +	background: #35414f url("images/ui-bg_dots-small_35_35414f_2x2.png") 50% 50% repeat;
        +	color: #e1e463;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #e1e463;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #93c3cd;
        +	background: #93c3cd url("images/ui-bg_diagonals-small_50_93c3cd_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #333333;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #333333;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #999999;
        +	background: #ccd232 url("images/ui-bg_diagonals-small_75_ccd232_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #212121;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #212121;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #ff6b7f;
        +	background: #db4865 url("images/ui-bg_diagonals-small_40_db4865_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #ff6b7f;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #b4d100;
        +	background: #ffff38 url("images/ui-bg_dots-medium_80_ffff38_4x4.png") 50% 50% repeat;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #b4d100;
        +	background: #ffff38;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ff6b7f;
        +	background: #ff3853 url("images/ui-bg_diagonals-small_50_ff3853_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_c02669_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_e1e463_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_88a206_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffeb33_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #f7f7ba url("images/ui-bg_white-lines_85_f7f7ba_40x100.png") 50% 50% repeat;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 8px 8px 10px #ba9217;
        +	box-shadow: 8px 8px 10px #ba9217;
        +}
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/jquery-ui.min.css b/bower_components/jquery-ui/themes/hot-sneaks/jquery-ui.min.css
        new file mode 100644
        index 0000000000..6b99239df4
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/hot-sneaks/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Gill%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.2em&cornerRadius=4px&bgColorHeader=35414f&bgTextureHeader=dots_small&bgImgOpacityHeader=35&borderColorHeader=2c4359&fcHeader=e1e463&iconColorHeader=e1e463&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=2c4359&iconColorContent=c02669&bgColorDefault=93c3cd&bgTextureDefault=diagonals_small&bgImgOpacityDefault=50&borderColorDefault=93c3cd&fcDefault=333333&iconColorDefault=ffffff&bgColorHover=ccd232&bgTextureHover=diagonals_small&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=db4865&bgTextureActive=diagonals_small&bgImgOpacityActive=40&borderColorActive=ff6b7f&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffff38&bgTextureHighlight=dots_medium&bgImgOpacityHighlight=80&borderColorHighlight=b4d100&fcHighlight=363636&iconColorHighlight=88a206&bgColorError=ff3853&bgTextureError=diagonals_small&bgImgOpacityError=50&borderColorError=ff6b7f&fcError=ffffff&iconColorError=ffeb33&bgColorOverlay=f7f7ba&bgTextureOverlay=white_lines&bgImgOpacityOverlay=85&opacityOverlay=80&bgColorShadow=ba9217&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=20&thicknessShadow=10px&offsetTopShadow=8px&offsetLeftShadow=8px&cornerRadiusShadow=5px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Gill Sans,Arial,sans-serif;font-size:1.2em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Gill Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #93c3cd}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#2c4359}.ui-widget-content a{color:#2c4359}.ui-widget-header{border:1px solid #2c4359;background:#35414f url("images/ui-bg_dots-small_35_35414f_2x2.png") 50% 50% repeat;color:#e1e463;font-weight:bold}.ui-widget-header a{color:#e1e463}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #93c3cd;background:#93c3cd url("images/ui-bg_diagonals-small_50_93c3cd_40x40.png") 50% 50% repeat;font-weight:bold;color:#333}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#333;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#ccd232 url("images/ui-bg_diagonals-small_75_ccd232_40x40.png") 50% 50% repeat;font-weight:bold;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ff6b7f;background:#db4865 url("images/ui-bg_diagonals-small_40_db4865_40x40.png") 50% 50% repeat;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ff6b7f;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #b4d100;background:#ffff38 url("images/ui-bg_dots-medium_80_ffff38_4x4.png") 50% 50% repeat;color:#363636}.ui-state-checked{border:1px solid #b4d100;background:#ffff38}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ff6b7f;background:#ff3853 url("images/ui-bg_diagonals-small_50_ff3853_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_c02669_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_e1e463_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_88a206_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffeb33_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#f7f7ba url("images/ui-bg_white-lines_85_f7f7ba_40x100.png") 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:8px 8px 10px #ba9217;box-shadow:8px 8px 10px #ba9217}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/hot-sneaks/theme.css b/bower_components/jquery-ui/themes/hot-sneaks/theme.css
        new file mode 100644
        index 0000000000..921bf6f217
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/hot-sneaks/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Gill%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.2em&cornerRadius=4px&bgColorHeader=35414f&bgTextureHeader=dots_small&bgImgOpacityHeader=35&borderColorHeader=2c4359&fcHeader=e1e463&iconColorHeader=e1e463&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=2c4359&iconColorContent=c02669&bgColorDefault=93c3cd&bgTextureDefault=diagonals_small&bgImgOpacityDefault=50&borderColorDefault=93c3cd&fcDefault=333333&iconColorDefault=ffffff&bgColorHover=ccd232&bgTextureHover=diagonals_small&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=db4865&bgTextureActive=diagonals_small&bgImgOpacityActive=40&borderColorActive=ff6b7f&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffff38&bgTextureHighlight=dots_medium&bgImgOpacityHighlight=80&borderColorHighlight=b4d100&fcHighlight=363636&iconColorHighlight=88a206&bgColorError=ff3853&bgTextureError=diagonals_small&bgImgOpacityError=50&borderColorError=ff6b7f&fcError=ffffff&iconColorError=ffeb33&bgColorOverlay=f7f7ba&bgTextureOverlay=white_lines&bgImgOpacityOverlay=85&opacityOverlay=80&bgColorShadow=ba9217&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=20&thicknessShadow=10px&offsetTopShadow=8px&offsetLeftShadow=8px&cornerRadiusShadow=5px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Gill Sans,Arial,sans-serif;
        +	font-size: 1.2em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Gill Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #93c3cd;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #ffffff;
        +	color: #2c4359;
        +}
        +.ui-widget-content a {
        +	color: #2c4359;
        +}
        +.ui-widget-header {
        +	border: 1px solid #2c4359;
        +	background: #35414f url("images/ui-bg_dots-small_35_35414f_2x2.png") 50% 50% repeat;
        +	color: #e1e463;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #e1e463;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #93c3cd;
        +	background: #93c3cd url("images/ui-bg_diagonals-small_50_93c3cd_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #333333;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #333333;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #999999;
        +	background: #ccd232 url("images/ui-bg_diagonals-small_75_ccd232_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #212121;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #212121;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #ff6b7f;
        +	background: #db4865 url("images/ui-bg_diagonals-small_40_db4865_40x40.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #ff6b7f;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #b4d100;
        +	background: #ffff38 url("images/ui-bg_dots-medium_80_ffff38_4x4.png") 50% 50% repeat;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #b4d100;
        +	background: #ffff38;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ff6b7f;
        +	background: #ff3853 url("images/ui-bg_diagonals-small_50_ff3853_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_c02669_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_e1e463_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_88a206_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffeb33_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #f7f7ba url("images/ui-bg_white-lines_85_f7f7ba_40x100.png") 50% 50% repeat;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 8px 8px 10px #ba9217;
        +	box-shadow: 8px 8px 10px #ba9217;
        +}
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png b/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png
        new file mode 100644
        index 0000000000..d20d8d98d7
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_25_cb842e_1x400.png b/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_25_cb842e_1x400.png
        new file mode 100644
        index 0000000000..9084a2228a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_25_cb842e_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_70_ede4d4_1x400.png b/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_70_ede4d4_1x400.png
        new file mode 100644
        index 0000000000..528c8a5df2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-bg_glass_70_ede4d4_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png b/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png
        new file mode 100644
        index 0000000000..b5fea91f2b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png b/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png
        new file mode 100644
        index 0000000000..182fb24842
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png b/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png
        new file mode 100644
        index 0000000000..dc1a0ef8f3
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png b/bower_components/jquery-ui/themes/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png
        new file mode 100644
        index 0000000000..a0d0d2e1fc
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-icons_c47a23_256x240.png b/bower_components/jquery-ui/themes/humanity/images/ui-icons_c47a23_256x240.png
        new file mode 100644
        index 0000000000..10597bccb6
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-icons_c47a23_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-icons_cb672b_256x240.png b/bower_components/jquery-ui/themes/humanity/images/ui-icons_cb672b_256x240.png
        new file mode 100644
        index 0000000000..d46354b864
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-icons_cb672b_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-icons_f08000_256x240.png b/bower_components/jquery-ui/themes/humanity/images/ui-icons_f08000_256x240.png
        new file mode 100644
        index 0000000000..b3f11e3e82
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-icons_f08000_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-icons_f35f07_256x240.png b/bower_components/jquery-ui/themes/humanity/images/ui-icons_f35f07_256x240.png
        new file mode 100644
        index 0000000000..08e52032ed
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-icons_f35f07_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-icons_ff7519_256x240.png b/bower_components/jquery-ui/themes/humanity/images/ui-icons_ff7519_256x240.png
        new file mode 100644
        index 0000000000..d52a40921e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-icons_ff7519_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/humanity/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/humanity/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/humanity/jquery-ui.css b/bower_components/jquery-ui/themes/humanity/jquery-ui.css
        new file mode 100644
        index 0000000000..f48d68686b
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/humanity/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cb842e&bgTextureHeader=glass&bgImgOpacityHeader=25&borderColorHeader=d49768&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=f4f0ec&bgTextureContent=inset_soft&bgImgOpacityContent=100&borderColorContent=e0cfc2&fcContent=1e1b1d&iconColorContent=c47a23&bgColorDefault=ede4d4&bgTextureDefault=glass&bgImgOpacityDefault=70&borderColorDefault=cdc3b7&fcDefault=3f3731&iconColorDefault=f08000&bgColorHover=f5f0e5&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=f5ad66&fcHover=a46313&iconColorHover=f08000&bgColorActive=f4f0ec&bgTextureActive=highlight_hard&bgImgOpacityActive=100&borderColorActive=e0cfc2&fcActive=b85700&iconColorActive=f35f07&bgColorHighlight=f5f5b5&bgTextureHighlight=highlight_hard&bgImgOpacityHighlight=75&borderColorHighlight=d9bb73&fcHighlight=060200&iconColorHighlight=cb672b&bgColorError=fee4bd&bgTextureError=highlight_hard&bgImgOpacityError=65&borderColorError=f8893f&fcError=592003&iconColorError=ff7519&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cdc3b7;
        +}
        +.ui-widget-content {
        +	border: 1px solid #e0cfc2;
        +	background: #f4f0ec url("images/ui-bg_inset-soft_100_f4f0ec_1x100.png") 50% bottom repeat-x;
        +	color: #1e1b1d;
        +}
        +.ui-widget-content a {
        +	color: #1e1b1d;
        +}
        +.ui-widget-header {
        +	border: 1px solid #d49768;
        +	background: #cb842e url("images/ui-bg_glass_25_cb842e_1x400.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cdc3b7;
        +	background: #ede4d4 url("images/ui-bg_glass_70_ede4d4_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #3f3731;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #3f3731;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #f5ad66;
        +	background: #f5f0e5 url("images/ui-bg_glass_100_f5f0e5_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #a46313;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #a46313;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #e0cfc2;
        +	background: #f4f0ec url("images/ui-bg_highlight-hard_100_f4f0ec_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #b85700;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #e0cfc2;
        +	background-color: #b85700;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #b85700;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #d9bb73;
        +	background: #f5f5b5 url("images/ui-bg_highlight-hard_75_f5f5b5_1x100.png") 50% top repeat-x;
        +	color: #060200;
        +}
        +.ui-state-checked {
        +	border: 1px solid #d9bb73;
        +	background: #f5f5b5;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #060200;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #f8893f;
        +	background: #fee4bd url("images/ui-bg_highlight-hard_65_fee4bd_1x100.png") 50% top repeat-x;
        +	color: #592003;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #592003;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #592003;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_c47a23_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_f08000_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f35f07_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_cb672b_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ff7519_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_f08000_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/humanity/jquery-ui.min.css b/bower_components/jquery-ui/themes/humanity/jquery-ui.min.css
        new file mode 100644
        index 0000000000..7f8e186810
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/humanity/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cb842e&bgTextureHeader=glass&bgImgOpacityHeader=25&borderColorHeader=d49768&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=f4f0ec&bgTextureContent=inset_soft&bgImgOpacityContent=100&borderColorContent=e0cfc2&fcContent=1e1b1d&iconColorContent=c47a23&bgColorDefault=ede4d4&bgTextureDefault=glass&bgImgOpacityDefault=70&borderColorDefault=cdc3b7&fcDefault=3f3731&iconColorDefault=f08000&bgColorHover=f5f0e5&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=f5ad66&fcHover=a46313&iconColorHover=f08000&bgColorActive=f4f0ec&bgTextureActive=highlight_hard&bgImgOpacityActive=100&borderColorActive=e0cfc2&fcActive=b85700&iconColorActive=f35f07&bgColorHighlight=f5f5b5&bgTextureHighlight=highlight_hard&bgImgOpacityHighlight=75&borderColorHighlight=d9bb73&fcHighlight=060200&iconColorHighlight=cb672b&bgColorError=fee4bd&bgTextureError=highlight_hard&bgImgOpacityError=65&borderColorError=f8893f&fcError=592003&iconColorError=ff7519&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Helvetica,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Helvetica,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #cdc3b7}.ui-widget-content{border:1px solid #e0cfc2;background:#f4f0ec url("images/ui-bg_inset-soft_100_f4f0ec_1x100.png") 50% bottom repeat-x;color:#1e1b1d}.ui-widget-content a{color:#1e1b1d}.ui-widget-header{border:1px solid #d49768;background:#cb842e url("images/ui-bg_glass_25_cb842e_1x400.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #cdc3b7;background:#ede4d4 url("images/ui-bg_glass_70_ede4d4_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#3f3731}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#3f3731;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #f5ad66;background:#f5f0e5 url("images/ui-bg_glass_100_f5f0e5_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#a46313}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#a46313;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #e0cfc2;background:#f4f0ec url("images/ui-bg_highlight-hard_100_f4f0ec_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#b85700}.ui-icon-background,.ui-state-active .ui-icon-background{border:#e0cfc2;background-color:#b85700}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#b85700;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #d9bb73;background:#f5f5b5 url("images/ui-bg_highlight-hard_75_f5f5b5_1x100.png") 50% top repeat-x;color:#060200}.ui-state-checked{border:1px solid #d9bb73;background:#f5f5b5}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#060200}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f8893f;background:#fee4bd url("images/ui-bg_highlight-hard_65_fee4bd_1x100.png") 50% top repeat-x;color:#592003}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#592003}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#592003}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_c47a23_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_f08000_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_f35f07_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_cb672b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ff7519_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_f08000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/humanity/theme.css b/bower_components/jquery-ui/themes/humanity/theme.css
        new file mode 100644
        index 0000000000..efe59d9d07
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/humanity/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cb842e&bgTextureHeader=glass&bgImgOpacityHeader=25&borderColorHeader=d49768&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=f4f0ec&bgTextureContent=inset_soft&bgImgOpacityContent=100&borderColorContent=e0cfc2&fcContent=1e1b1d&iconColorContent=c47a23&bgColorDefault=ede4d4&bgTextureDefault=glass&bgImgOpacityDefault=70&borderColorDefault=cdc3b7&fcDefault=3f3731&iconColorDefault=f08000&bgColorHover=f5f0e5&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=f5ad66&fcHover=a46313&iconColorHover=f08000&bgColorActive=f4f0ec&bgTextureActive=highlight_hard&bgImgOpacityActive=100&borderColorActive=e0cfc2&fcActive=b85700&iconColorActive=f35f07&bgColorHighlight=f5f5b5&bgTextureHighlight=highlight_hard&bgImgOpacityHighlight=75&borderColorHighlight=d9bb73&fcHighlight=060200&iconColorHighlight=cb672b&bgColorError=fee4bd&bgTextureError=highlight_hard&bgImgOpacityError=65&borderColorError=f8893f&fcError=592003&iconColorError=ff7519&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cdc3b7;
        +}
        +.ui-widget-content {
        +	border: 1px solid #e0cfc2;
        +	background: #f4f0ec url("images/ui-bg_inset-soft_100_f4f0ec_1x100.png") 50% bottom repeat-x;
        +	color: #1e1b1d;
        +}
        +.ui-widget-content a {
        +	color: #1e1b1d;
        +}
        +.ui-widget-header {
        +	border: 1px solid #d49768;
        +	background: #cb842e url("images/ui-bg_glass_25_cb842e_1x400.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cdc3b7;
        +	background: #ede4d4 url("images/ui-bg_glass_70_ede4d4_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #3f3731;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #3f3731;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #f5ad66;
        +	background: #f5f0e5 url("images/ui-bg_glass_100_f5f0e5_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #a46313;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #a46313;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #e0cfc2;
        +	background: #f4f0ec url("images/ui-bg_highlight-hard_100_f4f0ec_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #b85700;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #e0cfc2;
        +	background-color: #b85700;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #b85700;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #d9bb73;
        +	background: #f5f5b5 url("images/ui-bg_highlight-hard_75_f5f5b5_1x100.png") 50% top repeat-x;
        +	color: #060200;
        +}
        +.ui-state-checked {
        +	border: 1px solid #d9bb73;
        +	background: #f5f5b5;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #060200;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #f8893f;
        +	background: #fee4bd url("images/ui-bg_highlight-hard_65_fee4bd_1x100.png") 50% top repeat-x;
        +	color: #592003;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #592003;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #592003;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_c47a23_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_f08000_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f35f07_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_cb672b_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ff7519_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_f08000_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png
        new file mode 100644
        index 0000000000..4e2b1f6798
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png
        new file mode 100644
        index 0000000000..3b915e2373
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png
        new file mode 100644
        index 0000000000..c32c7081b0
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png
        new file mode 100644
        index 0000000000..d82638d37b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png
        new file mode 100644
        index 0000000000..248dfdb38e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png
        new file mode 100644
        index 0000000000..05d228ffe9
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png
        new file mode 100644
        index 0000000000..1daea7a196
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png
        new file mode 100644
        index 0000000000..6c8ff05d25
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-bg_inset-soft_10_285c00_1x100.png b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_inset-soft_10_285c00_1x100.png
        new file mode 100644
        index 0000000000..d88bfcc90f
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-bg_inset-soft_10_285c00_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-icons_4eb305_256x240.png b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_4eb305_256x240.png
        new file mode 100644
        index 0000000000..e18f39632e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_4eb305_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-icons_72b42d_256x240.png b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_72b42d_256x240.png
        new file mode 100644
        index 0000000000..d89bf40d82
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_72b42d_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-icons_cd0a0a_256x240.png b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_cd0a0a_256x240.png
        new file mode 100644
        index 0000000000..ed1b23a81c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_cd0a0a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/le-frog/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/le-frog/jquery-ui.css b/bower_components/jquery-ui/themes/le-frog/jquery-ui.css
        new file mode 100644
        index 0000000000..56f6af0c73
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/le-frog/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=10px&bgColorHeader=3a8104&bgTextureHeader=highlight_soft&bgImgOpacityHeader=33&borderColorHeader=3f7506&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=285c00&bgTextureContent=inset_soft&bgImgOpacityContent=10&borderColorContent=72b42d&fcContent=ffffff&iconColorContent=72b42d&bgColorDefault=4ca20b&bgTextureDefault=highlight_soft&bgImgOpacityDefault=60&borderColorDefault=45930b&fcDefault=ffffff&iconColorDefault=ffffff&bgColorHover=4eb305&bgTextureHover=highlight_soft&bgImgOpacityHover=50&borderColorHover=8bd83b&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=285c00&bgTextureActive=highlight_hard&bgImgOpacityActive=30&borderColorActive=72b42d&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fbf5d0&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=4eb305&bgColorError=ffdc2e&bgTextureError=diagonals_thick&bgImgOpacityError=95&borderColorError=fad000&fcError=2b2b2b&iconColorError=cd0a0a&bgColorOverlay=444444&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=15&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=diagonals_small&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=0px&offsetTopShadow=4px&offsetLeftShadow=4px&cornerRadiusShadow=4px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #45930b;
        +}
        +.ui-widget-content {
        +	border: 1px solid #72b42d;
        +	background: #285c00 url("images/ui-bg_inset-soft_10_285c00_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #3f7506;
        +	background: #3a8104 url("images/ui-bg_highlight-soft_33_3a8104_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #45930b;
        +	background: #4ca20b url("images/ui-bg_highlight-soft_60_4ca20b_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #8bd83b;
        +	background: #4eb305 url("images/ui-bg_highlight-soft_50_4eb305_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #72b42d;
        +	background: #285c00 url("images/ui-bg_highlight-hard_30_285c00_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #72b42d;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #f9dd34;
        +	background: #fbf5d0 url("images/ui-bg_glass_55_fbf5d0_1x400.png") 50% 50% repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #f9dd34;
        +	background: #fbf5d0;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #fad000;
        +	background: #ffdc2e url("images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png") 50% 50% repeat;
        +	color: #2b2b2b;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #2b2b2b;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #2b2b2b;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_72b42d_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4eb305_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 10px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 10px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 10px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 10px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #444444 url("images/ui-bg_diagonals-thick_15_444444_40x40.png") 50% 50% repeat;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 4px 4px 0px #aaaaaa;
        +	box-shadow: 4px 4px 0px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/le-frog/jquery-ui.min.css b/bower_components/jquery-ui/themes/le-frog/jquery-ui.min.css
        new file mode 100644
        index 0000000000..7687e39701
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/le-frog/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=10px&bgColorHeader=3a8104&bgTextureHeader=highlight_soft&bgImgOpacityHeader=33&borderColorHeader=3f7506&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=285c00&bgTextureContent=inset_soft&bgImgOpacityContent=10&borderColorContent=72b42d&fcContent=ffffff&iconColorContent=72b42d&bgColorDefault=4ca20b&bgTextureDefault=highlight_soft&bgImgOpacityDefault=60&borderColorDefault=45930b&fcDefault=ffffff&iconColorDefault=ffffff&bgColorHover=4eb305&bgTextureHover=highlight_soft&bgImgOpacityHover=50&borderColorHover=8bd83b&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=285c00&bgTextureActive=highlight_hard&bgImgOpacityActive=30&borderColorActive=72b42d&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fbf5d0&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=4eb305&bgColorError=ffdc2e&bgTextureError=diagonals_thick&bgImgOpacityError=95&borderColorError=fad000&fcError=2b2b2b&iconColorError=cd0a0a&bgColorOverlay=444444&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=15&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=diagonals_small&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=0px&offsetTopShadow=4px&offsetLeftShadow=4px&cornerRadiusShadow=4px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #45930b}.ui-widget-content{border:1px solid #72b42d;background:#285c00 url("images/ui-bg_inset-soft_10_285c00_1x100.png") 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #3f7506;background:#3a8104 url("images/ui-bg_highlight-soft_33_3a8104_1x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #45930b;background:#4ca20b url("images/ui-bg_highlight-soft_60_4ca20b_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #8bd83b;background:#4eb305 url("images/ui-bg_highlight-soft_50_4eb305_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #72b42d;background:#285c00 url("images/ui-bg_highlight-hard_30_285c00_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#72b42d;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #f9dd34;background:#fbf5d0 url("images/ui-bg_glass_55_fbf5d0_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #f9dd34;background:#fbf5d0}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #fad000;background:#ffdc2e url("images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png") 50% 50% repeat;color:#2b2b2b}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#2b2b2b}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#2b2b2b}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_72b42d_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4eb305_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:10px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:10px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:10px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:10px}.ui-widget-overlay{background:#444 url("images/ui-bg_diagonals-thick_15_444444_40x40.png") 50% 50% repeat;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:4px 4px 0 #aaa;box-shadow:4px 4px 0 #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/le-frog/theme.css b/bower_components/jquery-ui/themes/le-frog/theme.css
        new file mode 100644
        index 0000000000..c8d2804998
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/le-frog/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=10px&bgColorHeader=3a8104&bgTextureHeader=highlight_soft&bgImgOpacityHeader=33&borderColorHeader=3f7506&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=285c00&bgTextureContent=inset_soft&bgImgOpacityContent=10&borderColorContent=72b42d&fcContent=ffffff&iconColorContent=72b42d&bgColorDefault=4ca20b&bgTextureDefault=highlight_soft&bgImgOpacityDefault=60&borderColorDefault=45930b&fcDefault=ffffff&iconColorDefault=ffffff&bgColorHover=4eb305&bgTextureHover=highlight_soft&bgImgOpacityHover=50&borderColorHover=8bd83b&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=285c00&bgTextureActive=highlight_hard&bgImgOpacityActive=30&borderColorActive=72b42d&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fbf5d0&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=4eb305&bgColorError=ffdc2e&bgTextureError=diagonals_thick&bgImgOpacityError=95&borderColorError=fad000&fcError=2b2b2b&iconColorError=cd0a0a&bgColorOverlay=444444&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=15&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=diagonals_small&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=0px&offsetTopShadow=4px&offsetLeftShadow=4px&cornerRadiusShadow=4px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #45930b;
        +}
        +.ui-widget-content {
        +	border: 1px solid #72b42d;
        +	background: #285c00 url("images/ui-bg_inset-soft_10_285c00_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #3f7506;
        +	background: #3a8104 url("images/ui-bg_highlight-soft_33_3a8104_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #45930b;
        +	background: #4ca20b url("images/ui-bg_highlight-soft_60_4ca20b_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #8bd83b;
        +	background: #4eb305 url("images/ui-bg_highlight-soft_50_4eb305_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #72b42d;
        +	background: #285c00 url("images/ui-bg_highlight-hard_30_285c00_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #72b42d;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #f9dd34;
        +	background: #fbf5d0 url("images/ui-bg_glass_55_fbf5d0_1x400.png") 50% 50% repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #f9dd34;
        +	background: #fbf5d0;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #fad000;
        +	background: #ffdc2e url("images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png") 50% 50% repeat;
        +	color: #2b2b2b;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #2b2b2b;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #2b2b2b;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_72b42d_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4eb305_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 10px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 10px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 10px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 10px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #444444 url("images/ui-bg_diagonals-thick_15_444444_40x40.png") 50% 50% repeat;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 4px 4px 0px #aaaaaa;
        +	box-shadow: 4px 4px 0px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_glass_15_5f391b_1x400.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_glass_15_5f391b_1x400.png
        new file mode 100644
        index 0000000000..e6b136f36e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_glass_15_5f391b_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_20_1c160d_500x100.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_20_1c160d_500x100.png
        new file mode 100644
        index 0000000000..1091f625da
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_20_1c160d_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_25_453326_500x100.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_25_453326_500x100.png
        new file mode 100644
        index 0000000000..7538ca3cf1
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_25_453326_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_30_44372c_500x100.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_30_44372c_500x100.png
        new file mode 100644
        index 0000000000..3585beaa57
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_gloss-wave_30_44372c_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_highlight-soft_20_201913_1x100.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_highlight-soft_20_201913_1x100.png
        new file mode 100644
        index 0000000000..17dd59fee6
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_highlight-soft_20_201913_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_highlight-soft_20_619226_1x100.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_highlight-soft_20_619226_1x100.png
        new file mode 100644
        index 0000000000..95bb11d988
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_highlight-soft_20_619226_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_inset-soft_10_201913_1x100.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_inset-soft_10_201913_1x100.png
        new file mode 100644
        index 0000000000..fae58c013b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-bg_inset-soft_10_201913_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_222222_256x240.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_222222_256x240.png
        new file mode 100644
        index 0000000000..f184400db5
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_222222_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_9bcc60_256x240.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_9bcc60_256x240.png
        new file mode 100644
        index 0000000000..c221b4c784
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_9bcc60_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_add978_256x240.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_add978_256x240.png
        new file mode 100644
        index 0000000000..7a1cd35e54
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_add978_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_e3ddc9_256x240.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_e3ddc9_256x240.png
        new file mode 100644
        index 0000000000..74374fcf4a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_e3ddc9_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_f1fd86_256x240.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_f1fd86_256x240.png
        new file mode 100644
        index 0000000000..9742fcbfc8
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_f1fd86_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/mint-choc/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/mint-choc/jquery-ui.css b/bower_components/jquery-ui/themes/mint-choc/jquery-ui.css
        new file mode 100644
        index 0000000000..c8a3aba4f2
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/mint-choc/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=453326&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=695649&fcHeader=e3ddc9&iconColorHeader=e3ddc9&bgColorContent=201913&bgTextureContent=inset_soft&bgImgOpacityContent=10&borderColorContent=9c947c&fcContent=ffffff&iconColorContent=222222&bgColorDefault=1c160d&bgTextureDefault=gloss_wave&bgImgOpacityDefault=20&borderColorDefault=695444&fcDefault=9bcc60&iconColorDefault=9bcc60&bgColorHover=44372c&bgTextureHover=gloss_wave&bgImgOpacityHover=30&borderColorHover=9c947c&fcHover=baec7e&iconColorHover=add978&bgColorActive=201913&bgTextureActive=highlight_soft&bgImgOpacityActive=20&borderColorActive=9c947c&fcActive=e3ddc9&iconColorActive=e3ddc9&bgColorHighlight=619226&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=20&borderColorHighlight=add978&fcHighlight=ffffff&iconColorHighlight=ffffff&bgColorError=5f391b&bgTextureError=glass&bgImgOpacityError=15&borderColorError=5f391b&fcError=ffffff&iconColorError=f1fd86&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #695444;
        +}
        +.ui-widget-content {
        +	border: 1px solid #9c947c;
        +	background: #201913 url("images/ui-bg_inset-soft_10_201913_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #695649;
        +	background: #453326 url("images/ui-bg_gloss-wave_25_453326_500x100.png") 50% 50% repeat-x;
        +	color: #e3ddc9;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #e3ddc9;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #695444;
        +	background: #1c160d url("images/ui-bg_gloss-wave_20_1c160d_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #9bcc60;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #9bcc60;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #9c947c;
        +	background: #44372c url("images/ui-bg_gloss-wave_30_44372c_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #baec7e;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #baec7e;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #9c947c;
        +	background: #201913 url("images/ui-bg_highlight-soft_20_201913_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #e3ddc9;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #9c947c;
        +	background-color: #e3ddc9;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #e3ddc9;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #add978;
        +	background: #619226 url("images/ui-bg_highlight-soft_20_619226_1x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-checked {
        +	border: 1px solid #add978;
        +	background: #619226;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #ffffff;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #5f391b;
        +	background: #5f391b url("images/ui-bg_glass_15_5f391b_1x400.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_e3ddc9_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_add978_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_e3ddc9_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_f1fd86_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_9bcc60_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/mint-choc/jquery-ui.min.css b/bower_components/jquery-ui/themes/mint-choc/jquery-ui.min.css
        new file mode 100644
        index 0000000000..d0f48324e4
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/mint-choc/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=453326&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=695649&fcHeader=e3ddc9&iconColorHeader=e3ddc9&bgColorContent=201913&bgTextureContent=inset_soft&bgImgOpacityContent=10&borderColorContent=9c947c&fcContent=ffffff&iconColorContent=222222&bgColorDefault=1c160d&bgTextureDefault=gloss_wave&bgImgOpacityDefault=20&borderColorDefault=695444&fcDefault=9bcc60&iconColorDefault=9bcc60&bgColorHover=44372c&bgTextureHover=gloss_wave&bgImgOpacityHover=30&borderColorHover=9c947c&fcHover=baec7e&iconColorHover=add978&bgColorActive=201913&bgTextureActive=highlight_soft&bgImgOpacityActive=20&borderColorActive=9c947c&fcActive=e3ddc9&iconColorActive=e3ddc9&bgColorHighlight=619226&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=20&borderColorHighlight=add978&fcHighlight=ffffff&iconColorHighlight=ffffff&bgColorError=5f391b&bgTextureError=glass&bgImgOpacityError=15&borderColorError=5f391b&fcError=ffffff&iconColorError=f1fd86&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Helvetica,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Helvetica,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #695444}.ui-widget-content{border:1px solid #9c947c;background:#201913 url("images/ui-bg_inset-soft_10_201913_1x100.png") 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #695649;background:#453326 url("images/ui-bg_gloss-wave_25_453326_500x100.png") 50% 50% repeat-x;color:#e3ddc9;font-weight:bold}.ui-widget-header a{color:#e3ddc9}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #695444;background:#1c160d url("images/ui-bg_gloss-wave_20_1c160d_500x100.png") 50% 50% repeat-x;font-weight:bold;color:#9bcc60}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#9bcc60;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #9c947c;background:#44372c url("images/ui-bg_gloss-wave_30_44372c_500x100.png") 50% 50% repeat-x;font-weight:bold;color:#baec7e}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#baec7e;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #9c947c;background:#201913 url("images/ui-bg_highlight-soft_20_201913_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#e3ddc9}.ui-icon-background,.ui-state-active .ui-icon-background{border:#9c947c;background-color:#e3ddc9}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#e3ddc9;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #add978;background:#619226 url("images/ui-bg_highlight-soft_20_619226_1x100.png") 50% top repeat-x;color:#fff}.ui-state-checked{border:1px solid #add978;background:#619226}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#fff}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #5f391b;background:#5f391b url("images/ui-bg_glass_15_5f391b_1x400.png") 50% 50% repeat-x;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_e3ddc9_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_add978_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_e3ddc9_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_f1fd86_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_9bcc60_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/mint-choc/theme.css b/bower_components/jquery-ui/themes/mint-choc/theme.css
        new file mode 100644
        index 0000000000..874799d897
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/mint-choc/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=453326&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=695649&fcHeader=e3ddc9&iconColorHeader=e3ddc9&bgColorContent=201913&bgTextureContent=inset_soft&bgImgOpacityContent=10&borderColorContent=9c947c&fcContent=ffffff&iconColorContent=222222&bgColorDefault=1c160d&bgTextureDefault=gloss_wave&bgImgOpacityDefault=20&borderColorDefault=695444&fcDefault=9bcc60&iconColorDefault=9bcc60&bgColorHover=44372c&bgTextureHover=gloss_wave&bgImgOpacityHover=30&borderColorHover=9c947c&fcHover=baec7e&iconColorHover=add978&bgColorActive=201913&bgTextureActive=highlight_soft&bgImgOpacityActive=20&borderColorActive=9c947c&fcActive=e3ddc9&iconColorActive=e3ddc9&bgColorHighlight=619226&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=20&borderColorHighlight=add978&fcHighlight=ffffff&iconColorHighlight=ffffff&bgColorError=5f391b&bgTextureError=glass&bgImgOpacityError=15&borderColorError=5f391b&fcError=ffffff&iconColorError=f1fd86&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #695444;
        +}
        +.ui-widget-content {
        +	border: 1px solid #9c947c;
        +	background: #201913 url("images/ui-bg_inset-soft_10_201913_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #695649;
        +	background: #453326 url("images/ui-bg_gloss-wave_25_453326_500x100.png") 50% 50% repeat-x;
        +	color: #e3ddc9;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #e3ddc9;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #695444;
        +	background: #1c160d url("images/ui-bg_gloss-wave_20_1c160d_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #9bcc60;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #9bcc60;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #9c947c;
        +	background: #44372c url("images/ui-bg_gloss-wave_30_44372c_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #baec7e;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #baec7e;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #9c947c;
        +	background: #201913 url("images/ui-bg_highlight-soft_20_201913_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #e3ddc9;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #9c947c;
        +	background-color: #e3ddc9;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #e3ddc9;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #add978;
        +	background: #619226 url("images/ui-bg_highlight-soft_20_619226_1x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-checked {
        +	border: 1px solid #add978;
        +	background: #619226;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #ffffff;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #5f391b;
        +	background: #5f391b url("images/ui-bg_glass_15_5f391b_1x400.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_e3ddc9_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_add978_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_e3ddc9_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_f1fd86_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_9bcc60_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png b/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png
        new file mode 100644
        index 0000000000..a531a9a170
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_35_dddddd_1x400.png b/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_35_dddddd_1x400.png
        new file mode 100644
        index 0000000000..a70e0eb10e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_35_dddddd_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_60_eeeeee_1x400.png b/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_60_eeeeee_1x400.png
        new file mode 100644
        index 0000000000..223433fc3b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-bg_glass_60_eeeeee_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-bg_inset-hard_75_999999_1x100.png b/bower_components/jquery-ui/themes/overcast/images/ui-bg_inset-hard_75_999999_1x100.png
        new file mode 100644
        index 0000000000..b99cf57055
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-bg_inset-hard_75_999999_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png b/bower_components/jquery-ui/themes/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png
        new file mode 100644
        index 0000000000..e7a6c1363e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-icons_3383bb_256x240.png b/bower_components/jquery-ui/themes/overcast/images/ui-icons_3383bb_256x240.png
        new file mode 100644
        index 0000000000..45d36133f1
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-icons_3383bb_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-icons_454545_256x240.png b/bower_components/jquery-ui/themes/overcast/images/ui-icons_454545_256x240.png
        new file mode 100644
        index 0000000000..e6e41cd078
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-icons_454545_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-icons_70b2e1_256x240.png b/bower_components/jquery-ui/themes/overcast/images/ui-icons_70b2e1_256x240.png
        new file mode 100644
        index 0000000000..0d823681ee
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-icons_70b2e1_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-icons_999999_256x240.png b/bower_components/jquery-ui/themes/overcast/images/ui-icons_999999_256x240.png
        new file mode 100644
        index 0000000000..4ae5228b79
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-icons_999999_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/images/ui-icons_fbc856_256x240.png b/bower_components/jquery-ui/themes/overcast/images/ui-icons_fbc856_256x240.png
        new file mode 100644
        index 0000000000..f696b3d1c1
        Binary files /dev/null and b/bower_components/jquery-ui/themes/overcast/images/ui-icons_fbc856_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/overcast/jquery-ui.css b/bower_components/jquery-ui/themes/overcast/jquery-ui.css
        new file mode 100644
        index 0000000000..895a66dd51
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/overcast/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Trebuchet MS,Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Trebuchet MS,Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cccccc;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #c9c9c9 url("images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #bbbbbb;
        +	background: #dddddd url("images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x;
        +	color: #444444;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #444444;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee url("images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #3383bb;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #3383bb;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #bbbbbb;
        +	background: #f8f8f8 url("images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #599fcf;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #599fcf;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #999999;
        +	background: #999999 url("images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #999999;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffffff;
        +	background: #eeeeee;
        +	color: #444444;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffffff;
        +	background: #eeeeee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #444444;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #c0402a;
        +	background: #c0402a;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_999999_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_999999_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_3383bb_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_3383bb_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_fbc856_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_70b2e1_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -4px -4px 4px #aaaaaa;
        +	box-shadow: -4px -4px 4px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/overcast/jquery-ui.min.css b/bower_components/jquery-ui/themes/overcast/jquery-ui.min.css
        new file mode 100644
        index 0000000000..cdbeaee138
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/overcast/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Helvetica,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Helvetica,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #ccc}.ui-widget-content{border:1px solid #aaa;background:#c9c9c9 url("images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #bbb;background:#ddd url("images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x;color:#444;font-weight:bold}.ui-widget-header a{color:#444}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #ccc;background:#eee url("images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#3383bb}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#3383bb;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #bbb;background:#f8f8f8 url("images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#599fcf}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#599fcf;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #999;background:#999 url("images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#999;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fff;background:#eee;color:#444}.ui-state-checked{border:1px solid #fff;background:#eee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#444}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #c0402a;background:#c0402a;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_999999_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_999999_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_3383bb_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_3383bb_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_fbc856_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_70b2e1_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-4px -4px 4px #aaa;box-shadow:-4px -4px 4px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/overcast/theme.css b/bower_components/jquery-ui/themes/overcast/theme.css
        new file mode 100644
        index 0000000000..e86b290ead
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/overcast/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Trebuchet MS,Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Trebuchet MS,Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cccccc;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #c9c9c9 url("images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #bbbbbb;
        +	background: #dddddd url("images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x;
        +	color: #444444;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #444444;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee url("images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #3383bb;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #3383bb;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #bbbbbb;
        +	background: #f8f8f8 url("images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #599fcf;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #599fcf;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #999999;
        +	background: #999999 url("images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #999999;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #ffffff;
        +	background: #eeeeee;
        +	color: #444444;
        +}
        +.ui-state-checked {
        +	border: 1px solid #ffffff;
        +	background: #eeeeee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #444444;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #c0402a;
        +	background: #c0402a;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_999999_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_999999_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_3383bb_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_3383bb_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_fbc856_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_70b2e1_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #eeeeee;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -4px -4px 4px #aaaaaa;
        +	box-shadow: -4px -4px 4px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png
        new file mode 100644
        index 0000000000..8dc3b2a2eb
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_40_000000_10x10.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_40_000000_10x10.png
        new file mode 100644
        index 0000000000..82fbe8afbe
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_40_000000_10x10.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_eceadf_60x60.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_eceadf_60x60.png
        new file mode 100644
        index 0000000000..4e68918991
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_eceadf_60x60.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_f8f7f6_60x60.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_f8f7f6_60x60.png
        new file mode 100644
        index 0000000000..2e5afe1c5f
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_f8f7f6_60x60.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_eceadf_60x60.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_eceadf_60x60.png
        new file mode 100644
        index 0000000000..9d5371dd42
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_eceadf_60x60.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_f7f3de_60x60.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_f7f3de_60x60.png
        new file mode 100644
        index 0000000000..65509a644c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_f7f3de_60x60.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png
        new file mode 100644
        index 0000000000..adb029d5fe
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_65_654b24_60x60.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_65_654b24_60x60.png
        new file mode 100644
        index 0000000000..516f8ee1e0
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_65_654b24_60x60.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_68_b83400_60x60.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_68_b83400_60x60.png
        new file mode 100644
        index 0000000000..7a85373ef2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-bg_fine-grain_68_b83400_60x60.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_222222_256x240.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_222222_256x240.png
        new file mode 100644
        index 0000000000..f184400db5
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_222222_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_3572ac_256x240.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_3572ac_256x240.png
        new file mode 100644
        index 0000000000..921d320c9e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_3572ac_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_8c291d_256x240.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_8c291d_256x240.png
        new file mode 100644
        index 0000000000..f353bcab5d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_8c291d_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_b83400_256x240.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_b83400_256x240.png
        new file mode 100644
        index 0000000000..a502853281
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_b83400_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_fbdb93_256x240.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_fbdb93_256x240.png
        new file mode 100644
        index 0000000000..76eb080bf9
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_fbdb93_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/pepper-grinder/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/jquery-ui.css b/bower_components/jquery-ui/themes/pepper-grinder/jquery-ui.css
        new file mode 100644
        index 0000000000..11b31ee51c
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/pepper-grinder/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=ffffff&bgTextureHeader=fine_grain&bgImgOpacityHeader=15&borderColorHeader=d4d1bf&fcHeader=453821&iconColorHeader=b83400&bgColorContent=eceadf&bgTextureContent=fine_grain&bgImgOpacityContent=10&borderColorContent=d9d6c4&fcContent=1f1f1f&iconColorContent=222222&bgColorDefault=f8f7f6&bgTextureDefault=fine_grain&bgImgOpacityDefault=10&borderColorDefault=cbc7bd&fcDefault=654b24&iconColorDefault=b83400&bgColorHover=654b24&bgTextureHover=fine_grain&bgImgOpacityHover=65&borderColorHover=654b24&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=eceadf&bgTextureActive=fine_grain&bgImgOpacityActive=15&borderColorActive=d9d6c4&fcActive=140f06&iconColorActive=8c291d&bgColorHighlight=f7f3de&bgTextureHighlight=fine_grain&bgImgOpacityHighlight=15&borderColorHighlight=b2a266&fcHighlight=3a3427&iconColorHighlight=3572ac&bgColorError=b83400&bgTextureError=fine_grain&bgImgOpacityError=68&borderColorError=681818&fcError=ffffff&iconColorError=fbdb93&bgColorOverlay=6e4f1c&bgTextureOverlay=diagonal_maze&bgImgOpacityOverlay=20&opacityOverlay=60&bgColorShadow=000000&bgTextureShadow=diagonal_maze&bgImgOpacityShadow=40&opacityShadow=60&thicknessShadow=5px&offsetTopShadow=0&offsetLeftShadow=-10px&cornerRadiusShadow=18px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cbc7bd;
        +}
        +.ui-widget-content {
        +	border: 1px solid #d9d6c4;
        +	background: #eceadf url("images/ui-bg_fine-grain_10_eceadf_60x60.png") 50% 50% repeat;
        +	color: #1f1f1f;
        +}
        +.ui-widget-content a {
        +	color: #1f1f1f;
        +}
        +.ui-widget-header {
        +	border: 1px solid #d4d1bf;
        +	background: #ffffff url("images/ui-bg_fine-grain_15_ffffff_60x60.png") 50% 50% repeat;
        +	color: #453821;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #453821;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cbc7bd;
        +	background: #f8f7f6 url("images/ui-bg_fine-grain_10_f8f7f6_60x60.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #654b24;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #654b24;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #654b24;
        +	background: #654b24 url("images/ui-bg_fine-grain_65_654b24_60x60.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #d9d6c4;
        +	background: #eceadf url("images/ui-bg_fine-grain_15_eceadf_60x60.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #140f06;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #d9d6c4;
        +	background-color: #140f06;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #140f06;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #b2a266;
        +	background: #f7f3de url("images/ui-bg_fine-grain_15_f7f3de_60x60.png") 50% 50% repeat;
        +	color: #3a3427;
        +}
        +.ui-state-checked {
        +	border: 1px solid #b2a266;
        +	background: #f7f3de;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #3a3427;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #681818;
        +	background: #b83400 url("images/ui-bg_fine-grain_68_b83400_60x60.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_b83400_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_8c291d_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_3572ac_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_fbdb93_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_b83400_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #6e4f1c url("images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png") 50% 50% repeat;
        +	opacity: .6;
        +	filter: Alpha(Opacity=60); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -10px 0 5px #000000;
        +	box-shadow: -10px 0 5px #000000;
        +}
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/jquery-ui.min.css b/bower_components/jquery-ui/themes/pepper-grinder/jquery-ui.min.css
        new file mode 100644
        index 0000000000..02f157e996
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/pepper-grinder/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=ffffff&bgTextureHeader=fine_grain&bgImgOpacityHeader=15&borderColorHeader=d4d1bf&fcHeader=453821&iconColorHeader=b83400&bgColorContent=eceadf&bgTextureContent=fine_grain&bgImgOpacityContent=10&borderColorContent=d9d6c4&fcContent=1f1f1f&iconColorContent=222222&bgColorDefault=f8f7f6&bgTextureDefault=fine_grain&bgImgOpacityDefault=10&borderColorDefault=cbc7bd&fcDefault=654b24&iconColorDefault=b83400&bgColorHover=654b24&bgTextureHover=fine_grain&bgImgOpacityHover=65&borderColorHover=654b24&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=eceadf&bgTextureActive=fine_grain&bgImgOpacityActive=15&borderColorActive=d9d6c4&fcActive=140f06&iconColorActive=8c291d&bgColorHighlight=f7f3de&bgTextureHighlight=fine_grain&bgImgOpacityHighlight=15&borderColorHighlight=b2a266&fcHighlight=3a3427&iconColorHighlight=3572ac&bgColorError=b83400&bgTextureError=fine_grain&bgImgOpacityError=68&borderColorError=681818&fcError=ffffff&iconColorError=fbdb93&bgColorOverlay=6e4f1c&bgTextureOverlay=diagonal_maze&bgImgOpacityOverlay=20&opacityOverlay=60&bgColorShadow=000000&bgTextureShadow=diagonal_maze&bgImgOpacityShadow=40&opacityShadow=60&thicknessShadow=5px&offsetTopShadow=0&offsetLeftShadow=-10px&cornerRadiusShadow=18px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #cbc7bd}.ui-widget-content{border:1px solid #d9d6c4;background:#eceadf url("images/ui-bg_fine-grain_10_eceadf_60x60.png") 50% 50% repeat;color:#1f1f1f}.ui-widget-content a{color:#1f1f1f}.ui-widget-header{border:1px solid #d4d1bf;background:#fff url("images/ui-bg_fine-grain_15_ffffff_60x60.png") 50% 50% repeat;color:#453821;font-weight:bold}.ui-widget-header a{color:#453821}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #cbc7bd;background:#f8f7f6 url("images/ui-bg_fine-grain_10_f8f7f6_60x60.png") 50% 50% repeat;font-weight:bold;color:#654b24}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#654b24;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #654b24;background:#654b24 url("images/ui-bg_fine-grain_65_654b24_60x60.png") 50% 50% repeat;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #d9d6c4;background:#eceadf url("images/ui-bg_fine-grain_15_eceadf_60x60.png") 50% 50% repeat;font-weight:bold;color:#140f06}.ui-icon-background,.ui-state-active .ui-icon-background{border:#d9d6c4;background-color:#140f06}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#140f06;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #b2a266;background:#f7f3de url("images/ui-bg_fine-grain_15_f7f3de_60x60.png") 50% 50% repeat;color:#3a3427}.ui-state-checked{border:1px solid #b2a266;background:#f7f3de}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#3a3427}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #681818;background:#b83400 url("images/ui-bg_fine-grain_68_b83400_60x60.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_b83400_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_8c291d_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_3572ac_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_fbdb93_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_b83400_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#6e4f1c url("images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png") 50% 50% repeat;opacity:.6;filter:Alpha(Opacity=60)}.ui-widget-shadow{-webkit-box-shadow:-10px 0 5px #000;box-shadow:-10px 0 5px #000}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/pepper-grinder/theme.css b/bower_components/jquery-ui/themes/pepper-grinder/theme.css
        new file mode 100644
        index 0000000000..7449d7745c
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/pepper-grinder/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=ffffff&bgTextureHeader=fine_grain&bgImgOpacityHeader=15&borderColorHeader=d4d1bf&fcHeader=453821&iconColorHeader=b83400&bgColorContent=eceadf&bgTextureContent=fine_grain&bgImgOpacityContent=10&borderColorContent=d9d6c4&fcContent=1f1f1f&iconColorContent=222222&bgColorDefault=f8f7f6&bgTextureDefault=fine_grain&bgImgOpacityDefault=10&borderColorDefault=cbc7bd&fcDefault=654b24&iconColorDefault=b83400&bgColorHover=654b24&bgTextureHover=fine_grain&bgImgOpacityHover=65&borderColorHover=654b24&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=eceadf&bgTextureActive=fine_grain&bgImgOpacityActive=15&borderColorActive=d9d6c4&fcActive=140f06&iconColorActive=8c291d&bgColorHighlight=f7f3de&bgTextureHighlight=fine_grain&bgImgOpacityHighlight=15&borderColorHighlight=b2a266&fcHighlight=3a3427&iconColorHighlight=3572ac&bgColorError=b83400&bgTextureError=fine_grain&bgImgOpacityError=68&borderColorError=681818&fcError=ffffff&iconColorError=fbdb93&bgColorOverlay=6e4f1c&bgTextureOverlay=diagonal_maze&bgImgOpacityOverlay=20&opacityOverlay=60&bgColorShadow=000000&bgTextureShadow=diagonal_maze&bgImgOpacityShadow=40&opacityShadow=60&thicknessShadow=5px&offsetTopShadow=0&offsetLeftShadow=-10px&cornerRadiusShadow=18px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cbc7bd;
        +}
        +.ui-widget-content {
        +	border: 1px solid #d9d6c4;
        +	background: #eceadf url("images/ui-bg_fine-grain_10_eceadf_60x60.png") 50% 50% repeat;
        +	color: #1f1f1f;
        +}
        +.ui-widget-content a {
        +	color: #1f1f1f;
        +}
        +.ui-widget-header {
        +	border: 1px solid #d4d1bf;
        +	background: #ffffff url("images/ui-bg_fine-grain_15_ffffff_60x60.png") 50% 50% repeat;
        +	color: #453821;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #453821;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cbc7bd;
        +	background: #f8f7f6 url("images/ui-bg_fine-grain_10_f8f7f6_60x60.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #654b24;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #654b24;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #654b24;
        +	background: #654b24 url("images/ui-bg_fine-grain_65_654b24_60x60.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #d9d6c4;
        +	background: #eceadf url("images/ui-bg_fine-grain_15_eceadf_60x60.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #140f06;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #d9d6c4;
        +	background-color: #140f06;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #140f06;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #b2a266;
        +	background: #f7f3de url("images/ui-bg_fine-grain_15_f7f3de_60x60.png") 50% 50% repeat;
        +	color: #3a3427;
        +}
        +.ui-state-checked {
        +	border: 1px solid #b2a266;
        +	background: #f7f3de;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #3a3427;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #681818;
        +	background: #b83400 url("images/ui-bg_fine-grain_68_b83400_60x60.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_b83400_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_8c291d_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_3572ac_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_fbdb93_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_b83400_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #6e4f1c url("images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png") 50% 50% repeat;
        +	opacity: .6;
        +	filter: Alpha(Opacity=60); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -10px 0 5px #000000;
        +	box-shadow: -10px 0 5px #000000;
        +}
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png b/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png
        new file mode 100644
        index 0000000000..c252ff4c28
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_85_dfeffc_1x400.png b/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_85_dfeffc_1x400.png
        new file mode 100644
        index 0000000000..0892e8651e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_85_dfeffc_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_95_fef1ec_1x400.png b/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_95_fef1ec_1x400.png
        new file mode 100644
        index 0000000000..892e9dbf92
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-bg_glass_95_fef1ec_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png b/bower_components/jquery-ui/themes/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png
        new file mode 100644
        index 0000000000..e9d904ed23
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png b/bower_components/jquery-ui/themes/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png
        new file mode 100644
        index 0000000000..07b965bae7
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/bower_components/jquery-ui/themes/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png
        new file mode 100644
        index 0000000000..537f408366
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-icons_217bc0_256x240.png b/bower_components/jquery-ui/themes/redmond/images/ui-icons_217bc0_256x240.png
        new file mode 100644
        index 0000000000..0ac61c0d0d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-icons_217bc0_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-icons_2e83ff_256x240.png b/bower_components/jquery-ui/themes/redmond/images/ui-icons_2e83ff_256x240.png
        new file mode 100644
        index 0000000000..264b221358
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-icons_2e83ff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-icons_469bdd_256x240.png b/bower_components/jquery-ui/themes/redmond/images/ui-icons_469bdd_256x240.png
        new file mode 100644
        index 0000000000..3ad9bd2095
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-icons_469bdd_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-icons_6da8d5_256x240.png b/bower_components/jquery-ui/themes/redmond/images/ui-icons_6da8d5_256x240.png
        new file mode 100644
        index 0000000000..b58412256a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-icons_6da8d5_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-icons_cd0a0a_256x240.png b/bower_components/jquery-ui/themes/redmond/images/ui-icons_cd0a0a_256x240.png
        new file mode 100644
        index 0000000000..ed1b23a81c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-icons_cd0a0a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-icons_d8e7f3_256x240.png b/bower_components/jquery-ui/themes/redmond/images/ui-icons_d8e7f3_256x240.png
        new file mode 100644
        index 0000000000..421a8d72b3
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-icons_d8e7f3_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/images/ui-icons_f9bd01_256x240.png b/bower_components/jquery-ui/themes/redmond/images/ui-icons_f9bd01_256x240.png
        new file mode 100644
        index 0000000000..f0fdc61430
        Binary files /dev/null and b/bower_components/jquery-ui/themes/redmond/images/ui-icons_f9bd01_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/redmond/jquery-ui.css b/bower_components/jquery-ui/themes/redmond/jquery-ui.css
        new file mode 100644
        index 0000000000..409dac0804
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/redmond/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #c5dbec;
        +}
        +.ui-widget-content {
        +	border: 1px solid #a6c9e2;
        +	background: #fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #4297d7;
        +	background: #5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #c5dbec;
        +	background: #dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #2e6e9e;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #2e6e9e;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #79b7e7;
        +	background: #d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #1d5987;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #1d5987;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #79b7e7;
        +	background: #f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #e17009;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #79b7e7;
        +	background-color: #e17009;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #e17009;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fad42e;
        +	background: #fbec88;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fad42e;
        +	background: #fbec88;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
        +	color: #cd0a0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd0a0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd0a0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_469bdd_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_d8e7f3_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_217bc0_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f9bd01_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_2e83ff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_6da8d5_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/redmond/jquery-ui.min.css b/bower_components/jquery-ui/themes/redmond/jquery-ui.min.css
        new file mode 100644
        index 0000000000..e9c8ee05d7
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/redmond/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5dbec}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #4297d7;background:#5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5dbec;background:#dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2e6e9e}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#2e6e9e;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #79b7e7;background:#d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1d5987}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#1d5987;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #79b7e7;background:#f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#e17009}.ui-icon-background,.ui-state-active .ui-icon-background{border:#79b7e7;background-color:#e17009}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#e17009;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fad42e;background:#fbec88;color:#363636}.ui-state-checked{border:1px solid #fad42e;background:#fbec88}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_469bdd_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_d8e7f3_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_217bc0_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_f9bd01_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_6da8d5_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/redmond/theme.css b/bower_components/jquery-ui/themes/redmond/theme.css
        new file mode 100644
        index 0000000000..64912a5dac
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/redmond/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #c5dbec;
        +}
        +.ui-widget-content {
        +	border: 1px solid #a6c9e2;
        +	background: #fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #4297d7;
        +	background: #5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #c5dbec;
        +	background: #dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #2e6e9e;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #2e6e9e;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #79b7e7;
        +	background: #d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #1d5987;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #1d5987;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #79b7e7;
        +	background: #f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #e17009;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #79b7e7;
        +	background-color: #e17009;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #e17009;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fad42e;
        +	background: #fbec88;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fad42e;
        +	background: #fbec88;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
        +	color: #cd0a0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd0a0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd0a0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_469bdd_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_d8e7f3_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_217bc0_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f9bd01_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_2e83ff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_6da8d5_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
        new file mode 100644
        index 0000000000..4ca55a9b69
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
        new file mode 100644
        index 0000000000..3d53f77029
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png
        new file mode 100644
        index 0000000000..c1ac3b9383
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
        new file mode 100644
        index 0000000000..568c2e51e0
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
        new file mode 100644
        index 0000000000..892e9dbf92
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
        new file mode 100644
        index 0000000000..2241416fd0
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-icons_222222_256x240.png b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_222222_256x240.png
        new file mode 100644
        index 0000000000..f184400db5
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_222222_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png
        new file mode 100644
        index 0000000000..264b221358
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-icons_454545_256x240.png b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_454545_256x240.png
        new file mode 100644
        index 0000000000..e6e41cd078
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_454545_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-icons_888888_256x240.png b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_888888_256x240.png
        new file mode 100644
        index 0000000000..2f1cf26a50
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_888888_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
        new file mode 100644
        index 0000000000..ed1b23a81c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/smoothness/jquery-ui.css b/bower_components/jquery-ui/themes/smoothness/jquery-ui.css
        new file mode 100644
        index 0000000000..294452f154
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/smoothness/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #d3d3d3;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #ffffff;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #aaaaaa;
        +	background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
        +	color: #222222;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #222222;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #d3d3d3;
        +	background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #555555;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #555555;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #999999;
        +	background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #212121;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #212121;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #aaaaaa;
        +	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #212121;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #aaaaaa;
        +	background-color: #212121;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #212121;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fcefa1;
        +	background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fcefa1;
        +	background: #fbf9ee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
        +	color: #cd0a0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd0a0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd0a0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_2e83ff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_888888_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/smoothness/jquery-ui.min.css b/bower_components/jquery-ui/themes/smoothness/jquery-ui.min.css
        new file mode 100644
        index 0000000000..dbd7235360
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/smoothness/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/smoothness/theme.css b/bower_components/jquery-ui/themes/smoothness/theme.css
        new file mode 100644
        index 0000000000..af8904f6bf
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/smoothness/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #d3d3d3;
        +}
        +.ui-widget-content {
        +	border: 1px solid #aaaaaa;
        +	background: #ffffff;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #aaaaaa;
        +	background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
        +	color: #222222;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #222222;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #d3d3d3;
        +	background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #555555;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #555555;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #999999;
        +	background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #212121;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #212121;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #aaaaaa;
        +	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #212121;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #aaaaaa;
        +	background-color: #212121;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #212121;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fcefa1;
        +	background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fcefa1;
        +	background: #fbf9ee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
        +	color: #cd0a0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd0a0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd0a0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_454545_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_2e83ff_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_888888_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_glass_55_fcf0ba_1x400.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_glass_55_fcf0ba_1x400.png
        new file mode 100644
        index 0000000000..dc35db0f69
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_glass_55_fcf0ba_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_gloss-wave_100_ece8da_500x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_gloss-wave_100_ece8da_500x100.png
        new file mode 100644
        index 0000000000..664df97270
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_gloss-wave_100_ece8da_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_100_f5f3e5_1x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_100_f5f3e5_1x100.png
        new file mode 100644
        index 0000000000..23a0ed4bea
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_100_f5f3e5_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_100_fafaf4_1x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_100_fafaf4_1x100.png
        new file mode 100644
        index 0000000000..7b5e946866
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_100_fafaf4_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_15_459e00_1x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_15_459e00_1x100.png
        new file mode 100644
        index 0000000000..a939422c8e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_15_459e00_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_95_cccccc_1x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_95_cccccc_1x100.png
        new file mode 100644
        index 0000000000..709df129ce
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-hard_95_cccccc_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-soft_25_67b021_1x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-soft_25_67b021_1x100.png
        new file mode 100644
        index 0000000000..fc065b1e22
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-soft_25_67b021_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-soft_95_ffedad_1x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-soft_95_ffedad_1x100.png
        new file mode 100644
        index 0000000000..0cc1385ff2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_highlight-soft_95_ffedad_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-bg_inset-soft_15_2b2922_1x100.png b/bower_components/jquery-ui/themes/south-street/images/ui-bg_inset-soft_15_2b2922_1x100.png
        new file mode 100644
        index 0000000000..d5fe532f9b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-bg_inset-soft_15_2b2922_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-icons_808080_256x240.png b/bower_components/jquery-ui/themes/south-street/images/ui-icons_808080_256x240.png
        new file mode 100644
        index 0000000000..54650300df
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-icons_808080_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-icons_847e71_256x240.png b/bower_components/jquery-ui/themes/south-street/images/ui-icons_847e71_256x240.png
        new file mode 100644
        index 0000000000..f32c2d49a8
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-icons_847e71_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-icons_8DC262_256x240.png b/bower_components/jquery-ui/themes/south-street/images/ui-icons_8DC262_256x240.png
        new file mode 100644
        index 0000000000..00801a32cb
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-icons_8DC262_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-icons_cd0a0a_256x240.png b/bower_components/jquery-ui/themes/south-street/images/ui-icons_cd0a0a_256x240.png
        new file mode 100644
        index 0000000000..ed1b23a81c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-icons_cd0a0a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-icons_eeeeee_256x240.png b/bower_components/jquery-ui/themes/south-street/images/ui-icons_eeeeee_256x240.png
        new file mode 100644
        index 0000000000..3021e35acc
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-icons_eeeeee_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/south-street/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/south-street/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/south-street/jquery-ui.css b/bower_components/jquery-ui/themes/south-street/jquery-ui.css
        new file mode 100644
        index 0000000000..ab6e8efc44
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/south-street/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=segoe%20ui%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=ece8da&bgTextureHeader=gloss_wave&bgImgOpacityHeader=100&borderColorHeader=d4ccb0&fcHeader=433f38&iconColorHeader=847e71&bgColorContent=f5f3e5&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dfd9c3&fcContent=312e25&iconColorContent=808080&bgColorDefault=459e00&bgTextureDefault=highlight_hard&bgImgOpacityDefault=15&borderColorDefault=327E04&fcDefault=ffffff&iconColorDefault=eeeeee&bgColorHover=67b021&bgTextureHover=highlight_soft&bgImgOpacityHover=25&borderColorHover=327E04&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=fafaf4&bgTextureActive=highlight_hard&bgImgOpacityActive=100&borderColorActive=d4ccb0&fcActive=459e00&iconColorActive=8DC262&bgColorHighlight=fcf0ba&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=e8e1b5&fcHighlight=363636&iconColorHighlight=8DC262&bgColorError=ffedad&bgTextureError=highlight_soft&bgImgOpacityError=95&borderColorError=e3a345&fcError=cd5c0a&iconColorError=cd0a0a&bgColorOverlay=2b2922&bgTextureOverlay=inset_soft&bgImgOpacityOverlay=15&opacityOverlay=90&bgColorShadow=cccccc&bgTextureShadow=highlight_hard&bgImgOpacityShadow=95&opacityShadow=20&thicknessShadow=12px&offsetTopShadow=-12px&offsetLeftShadow=-12px&cornerRadiusShadow=10px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #327E04;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dfd9c3;
        +	background: #f5f3e5 url("images/ui-bg_highlight-hard_100_f5f3e5_1x100.png") 50% top repeat-x;
        +	color: #312e25;
        +}
        +.ui-widget-content a {
        +	color: #312e25;
        +}
        +.ui-widget-header {
        +	border: 1px solid #d4ccb0;
        +	background: #ece8da url("images/ui-bg_gloss-wave_100_ece8da_500x100.png") 50% 50% repeat-x;
        +	color: #433f38;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #433f38;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #327E04;
        +	background: #459e00 url("images/ui-bg_highlight-hard_15_459e00_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #327E04;
        +	background: #67b021 url("images/ui-bg_highlight-soft_25_67b021_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #d4ccb0;
        +	background: #fafaf4 url("images/ui-bg_highlight-hard_100_fafaf4_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #459e00;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #d4ccb0;
        +	background-color: #459e00;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #459e00;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #e8e1b5;
        +	background: #fcf0ba url("images/ui-bg_glass_55_fcf0ba_1x400.png") 50% 50% repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #e8e1b5;
        +	background: #fcf0ba;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #e3a345;
        +	background: #ffedad url("images/ui-bg_highlight-soft_95_ffedad_1x100.png") 50% top repeat-x;
        +	color: #cd5c0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd5c0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd5c0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_808080_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_847e71_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_8DC262_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_8DC262_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_eeeeee_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #2b2922 url("images/ui-bg_inset-soft_15_2b2922_1x100.png") 50% bottom repeat-x;
        +	opacity: .9;
        +	filter: Alpha(Opacity=90); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -12px -12px 12px #cccccc;
        +	box-shadow: -12px -12px 12px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/south-street/jquery-ui.min.css b/bower_components/jquery-ui/themes/south-street/jquery-ui.min.css
        new file mode 100644
        index 0000000000..bc4714179c
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/south-street/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=segoe%20ui%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=ece8da&bgTextureHeader=gloss_wave&bgImgOpacityHeader=100&borderColorHeader=d4ccb0&fcHeader=433f38&iconColorHeader=847e71&bgColorContent=f5f3e5&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dfd9c3&fcContent=312e25&iconColorContent=808080&bgColorDefault=459e00&bgTextureDefault=highlight_hard&bgImgOpacityDefault=15&borderColorDefault=327E04&fcDefault=ffffff&iconColorDefault=eeeeee&bgColorHover=67b021&bgTextureHover=highlight_soft&bgImgOpacityHover=25&borderColorHover=327E04&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=fafaf4&bgTextureActive=highlight_hard&bgImgOpacityActive=100&borderColorActive=d4ccb0&fcActive=459e00&iconColorActive=8DC262&bgColorHighlight=fcf0ba&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=e8e1b5&fcHighlight=363636&iconColorHighlight=8DC262&bgColorError=ffedad&bgTextureError=highlight_soft&bgImgOpacityError=95&borderColorError=e3a345&fcError=cd5c0a&iconColorError=cd0a0a&bgColorOverlay=2b2922&bgTextureOverlay=inset_soft&bgImgOpacityOverlay=15&opacityOverlay=90&bgColorShadow=cccccc&bgTextureShadow=highlight_hard&bgImgOpacityShadow=95&opacityShadow=20&thicknessShadow=12px&offsetTopShadow=-12px&offsetLeftShadow=-12px&cornerRadiusShadow=10px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:segoe ui,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:segoe ui,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #327E04}.ui-widget-content{border:1px solid #dfd9c3;background:#f5f3e5 url("images/ui-bg_highlight-hard_100_f5f3e5_1x100.png") 50% top repeat-x;color:#312e25}.ui-widget-content a{color:#312e25}.ui-widget-header{border:1px solid #d4ccb0;background:#ece8da url("images/ui-bg_gloss-wave_100_ece8da_500x100.png") 50% 50% repeat-x;color:#433f38;font-weight:bold}.ui-widget-header a{color:#433f38}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #327E04;background:#459e00 url("images/ui-bg_highlight-hard_15_459e00_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #327E04;background:#67b021 url("images/ui-bg_highlight-soft_25_67b021_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #d4ccb0;background:#fafaf4 url("images/ui-bg_highlight-hard_100_fafaf4_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#459e00}.ui-icon-background,.ui-state-active .ui-icon-background{border:#d4ccb0;background-color:#459e00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#459e00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #e8e1b5;background:#fcf0ba url("images/ui-bg_glass_55_fcf0ba_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #e8e1b5;background:#fcf0ba}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #e3a345;background:#ffedad url("images/ui-bg_highlight-soft_95_ffedad_1x100.png") 50% top repeat-x;color:#cd5c0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd5c0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd5c0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_808080_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_847e71_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_8DC262_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_8DC262_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_eeeeee_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#2b2922 url("images/ui-bg_inset-soft_15_2b2922_1x100.png") 50% bottom repeat-x;opacity:.9;filter:Alpha(Opacity=90)}.ui-widget-shadow{-webkit-box-shadow:-12px -12px 12px #ccc;box-shadow:-12px -12px 12px #ccc}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/south-street/theme.css b/bower_components/jquery-ui/themes/south-street/theme.css
        new file mode 100644
        index 0000000000..f6c88b43ea
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/south-street/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=segoe%20ui%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=ece8da&bgTextureHeader=gloss_wave&bgImgOpacityHeader=100&borderColorHeader=d4ccb0&fcHeader=433f38&iconColorHeader=847e71&bgColorContent=f5f3e5&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dfd9c3&fcContent=312e25&iconColorContent=808080&bgColorDefault=459e00&bgTextureDefault=highlight_hard&bgImgOpacityDefault=15&borderColorDefault=327E04&fcDefault=ffffff&iconColorDefault=eeeeee&bgColorHover=67b021&bgTextureHover=highlight_soft&bgImgOpacityHover=25&borderColorHover=327E04&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=fafaf4&bgTextureActive=highlight_hard&bgImgOpacityActive=100&borderColorActive=d4ccb0&fcActive=459e00&iconColorActive=8DC262&bgColorHighlight=fcf0ba&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=e8e1b5&fcHighlight=363636&iconColorHighlight=8DC262&bgColorError=ffedad&bgTextureError=highlight_soft&bgImgOpacityError=95&borderColorError=e3a345&fcError=cd5c0a&iconColorError=cd0a0a&bgColorOverlay=2b2922&bgTextureOverlay=inset_soft&bgImgOpacityOverlay=15&opacityOverlay=90&bgColorShadow=cccccc&bgTextureShadow=highlight_hard&bgImgOpacityShadow=95&opacityShadow=20&thicknessShadow=12px&offsetTopShadow=-12px&offsetLeftShadow=-12px&cornerRadiusShadow=10px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: segoe ui,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #327E04;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dfd9c3;
        +	background: #f5f3e5 url("images/ui-bg_highlight-hard_100_f5f3e5_1x100.png") 50% top repeat-x;
        +	color: #312e25;
        +}
        +.ui-widget-content a {
        +	color: #312e25;
        +}
        +.ui-widget-header {
        +	border: 1px solid #d4ccb0;
        +	background: #ece8da url("images/ui-bg_gloss-wave_100_ece8da_500x100.png") 50% 50% repeat-x;
        +	color: #433f38;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #433f38;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #327E04;
        +	background: #459e00 url("images/ui-bg_highlight-hard_15_459e00_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #327E04;
        +	background: #67b021 url("images/ui-bg_highlight-soft_25_67b021_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #d4ccb0;
        +	background: #fafaf4 url("images/ui-bg_highlight-hard_100_fafaf4_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #459e00;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #d4ccb0;
        +	background-color: #459e00;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #459e00;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #e8e1b5;
        +	background: #fcf0ba url("images/ui-bg_glass_55_fcf0ba_1x400.png") 50% 50% repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #e8e1b5;
        +	background: #fcf0ba;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #e3a345;
        +	background: #ffedad url("images/ui-bg_highlight-soft_95_ffedad_1x100.png") 50% top repeat-x;
        +	color: #cd5c0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd5c0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd5c0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_808080_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_847e71_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_8DC262_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_8DC262_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_eeeeee_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #2b2922 url("images/ui-bg_inset-soft_15_2b2922_1x100.png") 50% bottom repeat-x;
        +	opacity: .9;
        +	filter: Alpha(Opacity=90); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -12px -12px 12px #cccccc;
        +	box-shadow: -12px -12px 12px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-bg_glass_45_0078ae_1x400.png b/bower_components/jquery-ui/themes/start/images/ui-bg_glass_45_0078ae_1x400.png
        new file mode 100644
        index 0000000000..5890f6f01e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-bg_glass_45_0078ae_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-bg_glass_55_f8da4e_1x400.png b/bower_components/jquery-ui/themes/start/images/ui-bg_glass_55_f8da4e_1x400.png
        new file mode 100644
        index 0000000000..adcc7bd90b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-bg_glass_55_f8da4e_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-bg_glass_75_79c9ec_1x400.png b/bower_components/jquery-ui/themes/start/images/ui-bg_glass_75_79c9ec_1x400.png
        new file mode 100644
        index 0000000000..bc0d22bf72
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-bg_glass_75_79c9ec_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_45_e14f1c_500x100.png b/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_45_e14f1c_500x100.png
        new file mode 100644
        index 0000000000..313210b5fd
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_45_e14f1c_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_50_6eac2c_500x100.png b/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_50_6eac2c_500x100.png
        new file mode 100644
        index 0000000000..baad868369
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_50_6eac2c_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_75_2191c0_500x100.png b/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_75_2191c0_500x100.png
        new file mode 100644
        index 0000000000..2b354f0b61
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-bg_gloss-wave_75_2191c0_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/bower_components/jquery-ui/themes/start/images/ui-bg_inset-hard_100_fcfdfd_1x100.png
        new file mode 100644
        index 0000000000..537f408366
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-bg_inset-hard_100_fcfdfd_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-icons_0078ae_256x240.png b/bower_components/jquery-ui/themes/start/images/ui-icons_0078ae_256x240.png
        new file mode 100644
        index 0000000000..9db37d4d01
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-icons_0078ae_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-icons_056b93_256x240.png b/bower_components/jquery-ui/themes/start/images/ui-icons_056b93_256x240.png
        new file mode 100644
        index 0000000000..1eac73b43e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-icons_056b93_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-icons_d8e7f3_256x240.png b/bower_components/jquery-ui/themes/start/images/ui-icons_d8e7f3_256x240.png
        new file mode 100644
        index 0000000000..421a8d72b3
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-icons_d8e7f3_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-icons_e0fdff_256x240.png b/bower_components/jquery-ui/themes/start/images/ui-icons_e0fdff_256x240.png
        new file mode 100644
        index 0000000000..2b2e131c70
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-icons_e0fdff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-icons_f5e175_256x240.png b/bower_components/jquery-ui/themes/start/images/ui-icons_f5e175_256x240.png
        new file mode 100644
        index 0000000000..b253a33b79
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-icons_f5e175_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-icons_f7a50d_256x240.png b/bower_components/jquery-ui/themes/start/images/ui-icons_f7a50d_256x240.png
        new file mode 100644
        index 0000000000..4b1c9f9a88
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-icons_f7a50d_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/start/images/ui-icons_fcd113_256x240.png b/bower_components/jquery-ui/themes/start/images/ui-icons_fcd113_256x240.png
        new file mode 100644
        index 0000000000..e1a6e49052
        Binary files /dev/null and b/bower_components/jquery-ui/themes/start/images/ui-icons_fcd113_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/start/jquery-ui.css b/bower_components/jquery-ui/themes/start/jquery-ui.css
        new file mode 100644
        index 0000000000..b1370f270b
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/start/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=2191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=4297d7&fcHeader=eaf5f7&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=0078ae&bgColorDefault=0078ae&bgTextureDefault=glass&bgImgOpacityDefault=45&borderColorDefault=77d5f7&fcDefault=ffffff&iconColorDefault=e0fdff&bgColorHover=79c9ec&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=448dae&fcHover=026890&iconColorHover=056b93&bgColorActive=6eac2c&bgTextureActive=gloss_wave&bgImgOpacityActive=50&borderColorActive=acdd4a&fcActive=ffffff&iconColorActive=f5e175&bgColorHighlight=f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd113&fcHighlight=915608&iconColorHighlight=f7a50d&bgColorError=e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=cd0a0a&fcError=ffffff&iconColorError=fcd113&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #77d5f7;
        +}
        +.ui-widget-content {
        +	border: 1px solid #a6c9e2;
        +	background: #fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #4297d7;
        +	background: #2191c0 url("images/ui-bg_gloss-wave_75_2191c0_500x100.png") 50% 50% repeat-x;
        +	color: #eaf5f7;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #eaf5f7;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #77d5f7;
        +	background: #0078ae url("images/ui-bg_glass_45_0078ae_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #448dae;
        +	background: #79c9ec url("images/ui-bg_glass_75_79c9ec_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #026890;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #026890;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #acdd4a;
        +	background: #6eac2c url("images/ui-bg_gloss-wave_50_6eac2c_500x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #acdd4a;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fcd113;
        +	background: #f8da4e url("images/ui-bg_glass_55_f8da4e_1x400.png") 50% 50% repeat-x;
        +	color: #915608;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fcd113;
        +	background: #f8da4e;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #915608;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #e14f1c url("images/ui-bg_gloss-wave_45_e14f1c_500x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_0078ae_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_d8e7f3_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_056b93_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f5e175_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_f7a50d_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_fcd113_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_e0fdff_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 5px 5px 0px #999999;
        +	box-shadow: 5px 5px 0px #999999;
        +}
        diff --git a/bower_components/jquery-ui/themes/start/jquery-ui.min.css b/bower_components/jquery-ui/themes/start/jquery-ui.min.css
        new file mode 100644
        index 0000000000..8bafaa698f
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/start/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=2191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=4297d7&fcHeader=eaf5f7&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=0078ae&bgColorDefault=0078ae&bgTextureDefault=glass&bgImgOpacityDefault=45&borderColorDefault=77d5f7&fcDefault=ffffff&iconColorDefault=e0fdff&bgColorHover=79c9ec&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=448dae&fcHover=026890&iconColorHover=056b93&bgColorActive=6eac2c&bgTextureActive=gloss_wave&bgImgOpacityActive=50&borderColorActive=acdd4a&fcActive=ffffff&iconColorActive=f5e175&bgColorHighlight=f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd113&fcHighlight=915608&iconColorHighlight=f7a50d&bgColorError=e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=cd0a0a&fcError=ffffff&iconColorError=fcd113&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #77d5f7}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #4297d7;background:#2191c0 url("images/ui-bg_gloss-wave_75_2191c0_500x100.png") 50% 50% repeat-x;color:#eaf5f7;font-weight:bold}.ui-widget-header a{color:#eaf5f7}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #77d5f7;background:#0078ae url("images/ui-bg_glass_45_0078ae_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #448dae;background:#79c9ec url("images/ui-bg_glass_75_79c9ec_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#026890}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#026890;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #acdd4a;background:#6eac2c url("images/ui-bg_gloss-wave_50_6eac2c_500x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#acdd4a;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcd113;background:#f8da4e url("images/ui-bg_glass_55_f8da4e_1x400.png") 50% 50% repeat-x;color:#915608}.ui-state-checked{border:1px solid #fcd113;background:#f8da4e}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#915608}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#e14f1c url("images/ui-bg_gloss-wave_45_e14f1c_500x100.png") 50% top repeat-x;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_0078ae_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_d8e7f3_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_056b93_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_f5e175_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_f7a50d_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_fcd113_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_e0fdff_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:5px 5px 0 #999;box-shadow:5px 5px 0 #999}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/start/theme.css b/bower_components/jquery-ui/themes/start/theme.css
        new file mode 100644
        index 0000000000..23e149f89c
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/start/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=2191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=4297d7&fcHeader=eaf5f7&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=0078ae&bgColorDefault=0078ae&bgTextureDefault=glass&bgImgOpacityDefault=45&borderColorDefault=77d5f7&fcDefault=ffffff&iconColorDefault=e0fdff&bgColorHover=79c9ec&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=448dae&fcHover=026890&iconColorHover=056b93&bgColorActive=6eac2c&bgTextureActive=gloss_wave&bgImgOpacityActive=50&borderColorActive=acdd4a&fcActive=ffffff&iconColorActive=f5e175&bgColorHighlight=f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd113&fcHighlight=915608&iconColorHighlight=f7a50d&bgColorError=e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=cd0a0a&fcError=ffffff&iconColorError=fcd113&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #77d5f7;
        +}
        +.ui-widget-content {
        +	border: 1px solid #a6c9e2;
        +	background: #fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;
        +	color: #222222;
        +}
        +.ui-widget-content a {
        +	color: #222222;
        +}
        +.ui-widget-header {
        +	border: 1px solid #4297d7;
        +	background: #2191c0 url("images/ui-bg_gloss-wave_75_2191c0_500x100.png") 50% 50% repeat-x;
        +	color: #eaf5f7;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #eaf5f7;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #77d5f7;
        +	background: #0078ae url("images/ui-bg_glass_45_0078ae_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #448dae;
        +	background: #79c9ec url("images/ui-bg_glass_75_79c9ec_1x400.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #026890;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #026890;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #acdd4a;
        +	background: #6eac2c url("images/ui-bg_gloss-wave_50_6eac2c_500x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #acdd4a;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fcd113;
        +	background: #f8da4e url("images/ui-bg_glass_55_f8da4e_1x400.png") 50% 50% repeat-x;
        +	color: #915608;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fcd113;
        +	background: #f8da4e;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #915608;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #e14f1c url("images/ui-bg_gloss-wave_45_e14f1c_500x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_0078ae_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_d8e7f3_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_056b93_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f5e175_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_f7a50d_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_fcd113_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_e0fdff_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: 5px 5px 0px #999999;
        +	box-shadow: 5px 5px 0px #999999;
        +}
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-bg_diagonals-medium_20_d34d17_40x40.png b/bower_components/jquery-ui/themes/sunny/images/ui-bg_diagonals-medium_20_d34d17_40x40.png
        new file mode 100644
        index 0000000000..1100d9842c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-bg_diagonals-medium_20_d34d17_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_45_817865_500x100.png b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_45_817865_500x100.png
        new file mode 100644
        index 0000000000..4f02955262
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_45_817865_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_60_fece2f_500x100.png b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_60_fece2f_500x100.png
        new file mode 100644
        index 0000000000..3048f1b78b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_60_fece2f_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_70_ffdd57_500x100.png b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_70_ffdd57_500x100.png
        new file mode 100644
        index 0000000000..c8d7a6d7e4
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_70_ffdd57_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_90_fff9e5_500x100.png b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_90_fff9e5_500x100.png
        new file mode 100644
        index 0000000000..609a3581eb
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-bg_gloss-wave_90_fff9e5_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-bg_highlight-soft_100_feeebd_1x100.png b/bower_components/jquery-ui/themes/sunny/images/ui-bg_highlight-soft_100_feeebd_1x100.png
        new file mode 100644
        index 0000000000..81c0aa701e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-bg_highlight-soft_100_feeebd_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-bg_inset-soft_30_ffffff_1x100.png b/bower_components/jquery-ui/themes/sunny/images/ui-bg_inset-soft_30_ffffff_1x100.png
        new file mode 100644
        index 0000000000..adbfc818e6
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-bg_inset-soft_30_ffffff_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-icons_3d3d3d_256x240.png b/bower_components/jquery-ui/themes/sunny/images/ui-icons_3d3d3d_256x240.png
        new file mode 100644
        index 0000000000..5eb8c24068
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-icons_3d3d3d_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-icons_bd7b00_256x240.png b/bower_components/jquery-ui/themes/sunny/images/ui-icons_bd7b00_256x240.png
        new file mode 100644
        index 0000000000..70755d2fc4
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-icons_bd7b00_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-icons_d19405_256x240.png b/bower_components/jquery-ui/themes/sunny/images/ui-icons_d19405_256x240.png
        new file mode 100644
        index 0000000000..9ca88345eb
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-icons_d19405_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-icons_eb990f_256x240.png b/bower_components/jquery-ui/themes/sunny/images/ui-icons_eb990f_256x240.png
        new file mode 100644
        index 0000000000..bf9769d84a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-icons_eb990f_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-icons_ed9f26_256x240.png b/bower_components/jquery-ui/themes/sunny/images/ui-icons_ed9f26_256x240.png
        new file mode 100644
        index 0000000000..48e72983ec
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-icons_ed9f26_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-icons_fadc7a_256x240.png b/bower_components/jquery-ui/themes/sunny/images/ui-icons_fadc7a_256x240.png
        new file mode 100644
        index 0000000000..99f9c862fc
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-icons_fadc7a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/images/ui-icons_ffe180_256x240.png b/bower_components/jquery-ui/themes/sunny/images/ui-icons_ffe180_256x240.png
        new file mode 100644
        index 0000000000..09cbc5f684
        Binary files /dev/null and b/bower_components/jquery-ui/themes/sunny/images/ui-icons_ffe180_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/sunny/jquery-ui.css b/bower_components/jquery-ui/themes/sunny/jquery-ui.css
        new file mode 100644
        index 0000000000..4c9077e641
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/sunny/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=8px&bgColorHeader=817865&bgTextureHeader=gloss_wave&bgImgOpacityHeader=45&borderColorHeader=494437&fcHeader=ffffff&iconColorHeader=fadc7a&bgColorContent=feeebd&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=8e846b&fcContent=383838&iconColorContent=d19405&bgColorDefault=fece2f&bgTextureDefault=gloss_wave&bgImgOpacityDefault=60&borderColorDefault=d19405&fcDefault=4c3000&iconColorDefault=3d3d3d&bgColorHover=ffdd57&bgTextureHover=gloss_wave&bgImgOpacityHover=70&borderColorHover=a45b13&fcHover=381f00&iconColorHover=bd7b00&bgColorActive=ffffff&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=655e4e&fcActive=0074c7&iconColorActive=eb990f&bgColorHighlight=fff9e5&bgTextureHighlight=gloss_wave&bgImgOpacityHighlight=90&borderColorHighlight=eeb420&fcHighlight=1f1f1f&iconColorHighlight=ed9f26&bgColorError=d34d17&bgTextureError=diagonals_medium&bgImgOpacityError=20&borderColorError=ffb73d&fcError=ffffff&iconColorError=ffe180&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #d19405;
        +}
        +.ui-widget-content {
        +	border: 1px solid #8e846b;
        +	background: #feeebd url("images/ui-bg_highlight-soft_100_feeebd_1x100.png") 50% top repeat-x;
        +	color: #383838;
        +}
        +.ui-widget-content a {
        +	color: #383838;
        +}
        +.ui-widget-header {
        +	border: 1px solid #494437;
        +	background: #817865 url("images/ui-bg_gloss-wave_45_817865_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #d19405;
        +	background: #fece2f url("images/ui-bg_gloss-wave_60_fece2f_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #4c3000;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #4c3000;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #a45b13;
        +	background: #ffdd57 url("images/ui-bg_gloss-wave_70_ffdd57_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #381f00;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #381f00;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #655e4e;
        +	background: #ffffff url("images/ui-bg_inset-soft_30_ffffff_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #0074c7;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #655e4e;
        +	background-color: #0074c7;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #0074c7;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #eeb420;
        +	background: #fff9e5 url("images/ui-bg_gloss-wave_90_fff9e5_500x100.png") 50% top repeat-x;
        +	color: #1f1f1f;
        +}
        +.ui-state-checked {
        +	border: 1px solid #eeb420;
        +	background: #fff9e5;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #1f1f1f;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ffb73d;
        +	background: #d34d17 url("images/ui-bg_diagonals-medium_20_d34d17_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_d19405_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_fadc7a_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_bd7b00_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_eb990f_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_ed9f26_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffe180_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_3d3d3d_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 8px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 8px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 8px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 8px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #5c5c5c;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #cccccc;
        +	box-shadow: -7px -7px 7px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/sunny/jquery-ui.min.css b/bower_components/jquery-ui/themes/sunny/jquery-ui.min.css
        new file mode 100644
        index 0000000000..01756ad866
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/sunny/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=8px&bgColorHeader=817865&bgTextureHeader=gloss_wave&bgImgOpacityHeader=45&borderColorHeader=494437&fcHeader=ffffff&iconColorHeader=fadc7a&bgColorContent=feeebd&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=8e846b&fcContent=383838&iconColorContent=d19405&bgColorDefault=fece2f&bgTextureDefault=gloss_wave&bgImgOpacityDefault=60&borderColorDefault=d19405&fcDefault=4c3000&iconColorDefault=3d3d3d&bgColorHover=ffdd57&bgTextureHover=gloss_wave&bgImgOpacityHover=70&borderColorHover=a45b13&fcHover=381f00&iconColorHover=bd7b00&bgColorActive=ffffff&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=655e4e&fcActive=0074c7&iconColorActive=eb990f&bgColorHighlight=fff9e5&bgTextureHighlight=gloss_wave&bgImgOpacityHighlight=90&borderColorHighlight=eeb420&fcHighlight=1f1f1f&iconColorHighlight=ed9f26&bgColorError=d34d17&bgTextureError=diagonals_medium&bgImgOpacityError=20&borderColorError=ffb73d&fcError=ffffff&iconColorError=ffe180&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d19405}.ui-widget-content{border:1px solid #8e846b;background:#feeebd url("images/ui-bg_highlight-soft_100_feeebd_1x100.png") 50% top repeat-x;color:#383838}.ui-widget-content a{color:#383838}.ui-widget-header{border:1px solid #494437;background:#817865 url("images/ui-bg_gloss-wave_45_817865_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d19405;background:#fece2f url("images/ui-bg_gloss-wave_60_fece2f_500x100.png") 50% 50% repeat-x;font-weight:bold;color:#4c3000}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#4c3000;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #a45b13;background:#ffdd57 url("images/ui-bg_gloss-wave_70_ffdd57_500x100.png") 50% 50% repeat-x;font-weight:bold;color:#381f00}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#381f00;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #655e4e;background:#fff url("images/ui-bg_inset-soft_30_ffffff_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#0074c7}.ui-icon-background,.ui-state-active .ui-icon-background{border:#655e4e;background-color:#0074c7}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#0074c7;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #eeb420;background:#fff9e5 url("images/ui-bg_gloss-wave_90_fff9e5_500x100.png") 50% top repeat-x;color:#1f1f1f}.ui-state-checked{border:1px solid #eeb420;background:#fff9e5}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#1f1f1f}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#d34d17 url("images/ui-bg_diagonals-medium_20_d34d17_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_d19405_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_fadc7a_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_bd7b00_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_eb990f_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_ed9f26_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffe180_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_3d3d3d_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:8px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:8px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:8px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:8px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #ccc;box-shadow:-7px -7px 7px #ccc}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/sunny/theme.css b/bower_components/jquery-ui/themes/sunny/theme.css
        new file mode 100644
        index 0000000000..d773291b3b
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/sunny/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=8px&bgColorHeader=817865&bgTextureHeader=gloss_wave&bgImgOpacityHeader=45&borderColorHeader=494437&fcHeader=ffffff&iconColorHeader=fadc7a&bgColorContent=feeebd&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=8e846b&fcContent=383838&iconColorContent=d19405&bgColorDefault=fece2f&bgTextureDefault=gloss_wave&bgImgOpacityDefault=60&borderColorDefault=d19405&fcDefault=4c3000&iconColorDefault=3d3d3d&bgColorHover=ffdd57&bgTextureHover=gloss_wave&bgImgOpacityHover=70&borderColorHover=a45b13&fcHover=381f00&iconColorHover=bd7b00&bgColorActive=ffffff&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=655e4e&fcActive=0074c7&iconColorActive=eb990f&bgColorHighlight=fff9e5&bgTextureHighlight=gloss_wave&bgImgOpacityHighlight=90&borderColorHighlight=eeb420&fcHighlight=1f1f1f&iconColorHighlight=ed9f26&bgColorError=d34d17&bgTextureError=diagonals_medium&bgImgOpacityError=20&borderColorError=ffb73d&fcError=ffffff&iconColorError=ffe180&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #d19405;
        +}
        +.ui-widget-content {
        +	border: 1px solid #8e846b;
        +	background: #feeebd url("images/ui-bg_highlight-soft_100_feeebd_1x100.png") 50% top repeat-x;
        +	color: #383838;
        +}
        +.ui-widget-content a {
        +	color: #383838;
        +}
        +.ui-widget-header {
        +	border: 1px solid #494437;
        +	background: #817865 url("images/ui-bg_gloss-wave_45_817865_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #d19405;
        +	background: #fece2f url("images/ui-bg_gloss-wave_60_fece2f_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #4c3000;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #4c3000;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #a45b13;
        +	background: #ffdd57 url("images/ui-bg_gloss-wave_70_ffdd57_500x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #381f00;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #381f00;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #655e4e;
        +	background: #ffffff url("images/ui-bg_inset-soft_30_ffffff_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #0074c7;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #655e4e;
        +	background-color: #0074c7;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #0074c7;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #eeb420;
        +	background: #fff9e5 url("images/ui-bg_gloss-wave_90_fff9e5_500x100.png") 50% top repeat-x;
        +	color: #1f1f1f;
        +}
        +.ui-state-checked {
        +	border: 1px solid #eeb420;
        +	background: #fff9e5;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #1f1f1f;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ffb73d;
        +	background: #d34d17 url("images/ui-bg_diagonals-medium_20_d34d17_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_d19405_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_fadc7a_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_bd7b00_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_eb990f_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_ed9f26_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffe180_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_3d3d3d_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 8px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 8px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 8px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 8px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #5c5c5c;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #cccccc;
        +	box-shadow: -7px -7px 7px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_10_4f4221_10x8.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_10_4f4221_10x8.png
        new file mode 100644
        index 0000000000..44481a8ade
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_10_4f4221_10x8.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_20_372806_10x8.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_20_372806_10x8.png
        new file mode 100644
        index 0000000000..3506647339
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_20_372806_10x8.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_25_675423_10x8.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_25_675423_10x8.png
        new file mode 100644
        index 0000000000..41b3a7b549
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_25_675423_10x8.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_25_d5ac5d_10x8.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_25_d5ac5d_10x8.png
        new file mode 100644
        index 0000000000..2c454a3bab
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_25_d5ac5d_10x8.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_8_261803_10x8.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_8_261803_10x8.png
        new file mode 100644
        index 0000000000..8f5e2a1136
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_8_261803_10x8.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_8_443113_10x8.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_8_443113_10x8.png
        new file mode 100644
        index 0000000000..aaaa681788
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_diamond_8_443113_10x8.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_highlight-hard_65_fee4bd_1x100.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_highlight-hard_65_fee4bd_1x100.png
        new file mode 100644
        index 0000000000..896a99a9fd
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-bg_highlight-hard_65_fee4bd_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_070603_256x240.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_070603_256x240.png
        new file mode 100644
        index 0000000000..f99fb0da84
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_070603_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_e8e2b5_256x240.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_e8e2b5_256x240.png
        new file mode 100644
        index 0000000000..9f57dd4a74
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_e8e2b5_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_e9cd86_256x240.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_e9cd86_256x240.png
        new file mode 100644
        index 0000000000..d0512fd1a2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_e9cd86_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_efec9f_256x240.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_efec9f_256x240.png
        new file mode 100644
        index 0000000000..46ca494c51
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_efec9f_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_f2ec64_256x240.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_f2ec64_256x240.png
        new file mode 100644
        index 0000000000..ff2f65843c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_f2ec64_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_f9f2bd_256x240.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_f9f2bd_256x240.png
        new file mode 100644
        index 0000000000..b87d0eb2fd
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_f9f2bd_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_ff7519_256x240.png b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_ff7519_256x240.png
        new file mode 100644
        index 0000000000..d52a40921e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/swanky-purse/images/ui-icons_ff7519_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/jquery-ui.css b/bower_components/jquery-ui/themes/swanky-purse/jquery-ui.css
        new file mode 100644
        index 0000000000..22c9ffe919
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/swanky-purse/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Georgia%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.2em&cornerRadius=5px&bgColorHeader=261803&bgTextureHeader=diamond&bgImgOpacityHeader=8&borderColorHeader=baaa5a&fcHeader=eacd86&iconColorHeader=e9cd86&bgColorContent=443113&bgTextureContent=diamond&bgImgOpacityContent=8&borderColorContent=efec9f&fcContent=efec9f&iconColorContent=efec9f&bgColorDefault=4f4221&bgTextureDefault=diamond&bgImgOpacityDefault=10&borderColorDefault=362917&fcDefault=f8eec9&iconColorDefault=e8e2b5&bgColorHover=675423&bgTextureHover=diamond&bgImgOpacityHover=25&borderColorHover=362917&fcHover=f8eec9&iconColorHover=f2ec64&bgColorActive=443113&bgTextureActive=diamond&bgImgOpacityActive=8&borderColorActive=efec9f&fcActive=f9f2bd&iconColorActive=f9f2bd&bgColorHighlight=d5ac5d&bgTextureHighlight=diamond&bgImgOpacityHighlight=25&borderColorHighlight=362917&fcHighlight=060200&iconColorHighlight=070603&bgColorError=fee4bd&bgTextureError=highlight_hard&bgImgOpacityError=65&borderColorError=c26629&fcError=803f1e&iconColorError=ff7519&bgColorOverlay=372806&bgTextureOverlay=diamond&bgImgOpacityOverlay=20&opacityOverlay=80&bgColorShadow=ddd4b0&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=12px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Georgia,Verdana,Arial,sans-serif;
        +	font-size: 1.2em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Georgia,Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #362917;
        +}
        +.ui-widget-content {
        +	border: 1px solid #efec9f;
        +	background: #443113 url("images/ui-bg_diamond_8_443113_10x8.png") 50% 50% repeat;
        +	color: #efec9f;
        +}
        +.ui-widget-content a {
        +	color: #efec9f;
        +}
        +.ui-widget-header {
        +	border: 1px solid #baaa5a;
        +	background: #261803 url("images/ui-bg_diamond_8_261803_10x8.png") 50% 50% repeat;
        +	color: #eacd86;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #eacd86;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #362917;
        +	background: #4f4221 url("images/ui-bg_diamond_10_4f4221_10x8.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #f8eec9;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #f8eec9;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #362917;
        +	background: #675423 url("images/ui-bg_diamond_25_675423_10x8.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #f8eec9;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #f8eec9;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #efec9f;
        +	background: #443113 url("images/ui-bg_diamond_8_443113_10x8.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #f9f2bd;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #efec9f;
        +	background-color: #f9f2bd;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #f9f2bd;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #362917;
        +	background: #d5ac5d url("images/ui-bg_diamond_25_d5ac5d_10x8.png") 50% 50% repeat;
        +	color: #060200;
        +}
        +.ui-state-checked {
        +	border: 1px solid #362917;
        +	background: #d5ac5d;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #060200;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #c26629;
        +	background: #fee4bd url("images/ui-bg_highlight-hard_65_fee4bd_1x100.png") 50% top repeat-x;
        +	color: #803f1e;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #803f1e;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #803f1e;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_efec9f_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_e9cd86_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_f2ec64_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f9f2bd_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_070603_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ff7519_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_e8e2b5_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #372806 url("images/ui-bg_diamond_20_372806_10x8.png") 50% 50% repeat;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #ddd4b0;
        +	box-shadow: -8px -8px 8px #ddd4b0;
        +}
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/jquery-ui.min.css b/bower_components/jquery-ui/themes/swanky-purse/jquery-ui.min.css
        new file mode 100644
        index 0000000000..2a00533291
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/swanky-purse/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Georgia%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.2em&cornerRadius=5px&bgColorHeader=261803&bgTextureHeader=diamond&bgImgOpacityHeader=8&borderColorHeader=baaa5a&fcHeader=eacd86&iconColorHeader=e9cd86&bgColorContent=443113&bgTextureContent=diamond&bgImgOpacityContent=8&borderColorContent=efec9f&fcContent=efec9f&iconColorContent=efec9f&bgColorDefault=4f4221&bgTextureDefault=diamond&bgImgOpacityDefault=10&borderColorDefault=362917&fcDefault=f8eec9&iconColorDefault=e8e2b5&bgColorHover=675423&bgTextureHover=diamond&bgImgOpacityHover=25&borderColorHover=362917&fcHover=f8eec9&iconColorHover=f2ec64&bgColorActive=443113&bgTextureActive=diamond&bgImgOpacityActive=8&borderColorActive=efec9f&fcActive=f9f2bd&iconColorActive=f9f2bd&bgColorHighlight=d5ac5d&bgTextureHighlight=diamond&bgImgOpacityHighlight=25&borderColorHighlight=362917&fcHighlight=060200&iconColorHighlight=070603&bgColorError=fee4bd&bgTextureError=highlight_hard&bgImgOpacityError=65&borderColorError=c26629&fcError=803f1e&iconColorError=ff7519&bgColorOverlay=372806&bgTextureOverlay=diamond&bgImgOpacityOverlay=20&opacityOverlay=80&bgColorShadow=ddd4b0&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=12px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Georgia,Verdana,Arial,sans-serif;font-size:1.2em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Georgia,Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #362917}.ui-widget-content{border:1px solid #efec9f;background:#443113 url("images/ui-bg_diamond_8_443113_10x8.png") 50% 50% repeat;color:#efec9f}.ui-widget-content a{color:#efec9f}.ui-widget-header{border:1px solid #baaa5a;background:#261803 url("images/ui-bg_diamond_8_261803_10x8.png") 50% 50% repeat;color:#eacd86;font-weight:bold}.ui-widget-header a{color:#eacd86}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #362917;background:#4f4221 url("images/ui-bg_diamond_10_4f4221_10x8.png") 50% 50% repeat;font-weight:bold;color:#f8eec9}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#f8eec9;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #362917;background:#675423 url("images/ui-bg_diamond_25_675423_10x8.png") 50% 50% repeat;font-weight:bold;color:#f8eec9}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#f8eec9;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #efec9f;background:#443113 url("images/ui-bg_diamond_8_443113_10x8.png") 50% 50% repeat;font-weight:bold;color:#f9f2bd}.ui-icon-background,.ui-state-active .ui-icon-background{border:#efec9f;background-color:#f9f2bd}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#f9f2bd;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #362917;background:#d5ac5d url("images/ui-bg_diamond_25_d5ac5d_10x8.png") 50% 50% repeat;color:#060200}.ui-state-checked{border:1px solid #362917;background:#d5ac5d}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#060200}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #c26629;background:#fee4bd url("images/ui-bg_highlight-hard_65_fee4bd_1x100.png") 50% top repeat-x;color:#803f1e}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#803f1e}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#803f1e}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_efec9f_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_e9cd86_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_f2ec64_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_f9f2bd_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_070603_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ff7519_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_e8e2b5_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#372806 url("images/ui-bg_diamond_20_372806_10x8.png") 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #ddd4b0;box-shadow:-8px -8px 8px #ddd4b0}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/swanky-purse/theme.css b/bower_components/jquery-ui/themes/swanky-purse/theme.css
        new file mode 100644
        index 0000000000..487b0725c3
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/swanky-purse/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Georgia%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.2em&cornerRadius=5px&bgColorHeader=261803&bgTextureHeader=diamond&bgImgOpacityHeader=8&borderColorHeader=baaa5a&fcHeader=eacd86&iconColorHeader=e9cd86&bgColorContent=443113&bgTextureContent=diamond&bgImgOpacityContent=8&borderColorContent=efec9f&fcContent=efec9f&iconColorContent=efec9f&bgColorDefault=4f4221&bgTextureDefault=diamond&bgImgOpacityDefault=10&borderColorDefault=362917&fcDefault=f8eec9&iconColorDefault=e8e2b5&bgColorHover=675423&bgTextureHover=diamond&bgImgOpacityHover=25&borderColorHover=362917&fcHover=f8eec9&iconColorHover=f2ec64&bgColorActive=443113&bgTextureActive=diamond&bgImgOpacityActive=8&borderColorActive=efec9f&fcActive=f9f2bd&iconColorActive=f9f2bd&bgColorHighlight=d5ac5d&bgTextureHighlight=diamond&bgImgOpacityHighlight=25&borderColorHighlight=362917&fcHighlight=060200&iconColorHighlight=070603&bgColorError=fee4bd&bgTextureError=highlight_hard&bgImgOpacityError=65&borderColorError=c26629&fcError=803f1e&iconColorError=ff7519&bgColorOverlay=372806&bgTextureOverlay=diamond&bgImgOpacityOverlay=20&opacityOverlay=80&bgColorShadow=ddd4b0&bgTextureShadow=flat&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=12px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Georgia,Verdana,Arial,sans-serif;
        +	font-size: 1.2em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Georgia,Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #362917;
        +}
        +.ui-widget-content {
        +	border: 1px solid #efec9f;
        +	background: #443113 url("images/ui-bg_diamond_8_443113_10x8.png") 50% 50% repeat;
        +	color: #efec9f;
        +}
        +.ui-widget-content a {
        +	color: #efec9f;
        +}
        +.ui-widget-header {
        +	border: 1px solid #baaa5a;
        +	background: #261803 url("images/ui-bg_diamond_8_261803_10x8.png") 50% 50% repeat;
        +	color: #eacd86;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #eacd86;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #362917;
        +	background: #4f4221 url("images/ui-bg_diamond_10_4f4221_10x8.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #f8eec9;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #f8eec9;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #362917;
        +	background: #675423 url("images/ui-bg_diamond_25_675423_10x8.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #f8eec9;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #f8eec9;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #efec9f;
        +	background: #443113 url("images/ui-bg_diamond_8_443113_10x8.png") 50% 50% repeat;
        +	font-weight: bold;
        +	color: #f9f2bd;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #efec9f;
        +	background-color: #f9f2bd;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #f9f2bd;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #362917;
        +	background: #d5ac5d url("images/ui-bg_diamond_25_d5ac5d_10x8.png") 50% 50% repeat;
        +	color: #060200;
        +}
        +.ui-state-checked {
        +	border: 1px solid #362917;
        +	background: #d5ac5d;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #060200;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #c26629;
        +	background: #fee4bd url("images/ui-bg_highlight-hard_65_fee4bd_1x100.png") 50% top repeat-x;
        +	color: #803f1e;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #803f1e;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #803f1e;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_efec9f_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_e9cd86_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_f2ec64_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f9f2bd_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_070603_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ff7519_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_e8e2b5_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #372806 url("images/ui-bg_diamond_20_372806_10x8.png") 50% 50% repeat;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #ddd4b0;
        +	box-shadow: -8px -8px 8px #ddd4b0;
        +}
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-bg_diagonals-small_50_262626_40x40.png b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_diagonals-small_50_262626_40x40.png
        new file mode 100644
        index 0000000000..69a1775294
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_diagonals-small_50_262626_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_40_0a0a0a_1x400.png b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_40_0a0a0a_1x400.png
        new file mode 100644
        index 0000000000..d8307ffb3d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_40_0a0a0a_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_55_f1fbe5_1x400.png b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_55_f1fbe5_1x400.png
        new file mode 100644
        index 0000000000..9ba3f77c17
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_55_f1fbe5_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_60_000000_1x400.png b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_60_000000_1x400.png
        new file mode 100644
        index 0000000000..a4efa3eb5e
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_glass_60_000000_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_55_000000_500x100.png b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_55_000000_500x100.png
        new file mode 100644
        index 0000000000..29182962e1
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_55_000000_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_85_9fda58_500x100.png b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_85_9fda58_500x100.png
        new file mode 100644
        index 0000000000..5184d153a0
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_85_9fda58_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_95_f6ecd5_500x100.png b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_95_f6ecd5_500x100.png
        new file mode 100644
        index 0000000000..06b2212062
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-bg_gloss-wave_95_f6ecd5_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-icons_000000_256x240.png b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_000000_256x240.png
        new file mode 100644
        index 0000000000..321f128052
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_000000_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-icons_1f1f1f_256x240.png b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_1f1f1f_256x240.png
        new file mode 100644
        index 0000000000..e7d71d8b46
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_1f1f1f_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-icons_9fda58_256x240.png b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_9fda58_256x240.png
        new file mode 100644
        index 0000000000..cc4d55d129
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_9fda58_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-icons_b8ec79_256x240.png b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_b8ec79_256x240.png
        new file mode 100644
        index 0000000000..9788017a11
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_b8ec79_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-icons_cd0a0a_256x240.png b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_cd0a0a_256x240.png
        new file mode 100644
        index 0000000000..ed1b23a81c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_cd0a0a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/trontastic/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/trontastic/jquery-ui.css b/bower_components/jquery-ui/themes/trontastic/jquery-ui.css
        new file mode 100644
        index 0000000000..71c5ce2c10
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/trontastic/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=9fda58&bgTextureHeader=gloss_wave&bgImgOpacityHeader=85&borderColorHeader=000000&fcHeader=222222&iconColorHeader=1f1f1f&bgColorContent=000000&bgTextureContent=gloss_wave&bgImgOpacityContent=55&borderColorContent=4a4a4a&fcContent=ffffff&iconColorContent=9fda58&bgColorDefault=0a0a0a&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=1b1613&fcDefault=b8ec79&iconColorDefault=b8ec79&bgColorHover=000000&bgTextureHover=glass&bgImgOpacityHover=60&borderColorHover=000000&fcHover=96f226&iconColorHover=b8ec79&bgColorActive=4c4c4c&bgTextureActive=flat&bgImgOpacityActive=0&borderColorActive=696969&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=f1fbe5&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=8cce3b&fcHighlight=030303&iconColorHighlight=000000&bgColorError=f6ecd5&bgTextureError=gloss_wave&bgImgOpacityError=95&borderColorError=f1ac88&fcError=74736d&iconColorError=cd0a0a&bgColorOverlay=262626&bgTextureOverlay=diagonals_small&bgImgOpacityOverlay=50&opacityOverlay=30&bgColorShadow=303030&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=50&thicknessShadow=6px&offsetTopShadow=-6px&offsetLeftShadow=-6px&cornerRadiusShadow=12px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #1b1613;
        +}
        +.ui-widget-content {
        +	border: 1px solid #4a4a4a;
        +	background: #000000 url("images/ui-bg_gloss-wave_55_000000_500x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #000000;
        +	background: #9fda58 url("images/ui-bg_gloss-wave_85_9fda58_500x100.png") 50% 50% repeat-x;
        +	color: #222222;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #222222;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #1b1613;
        +	background: #0a0a0a url("images/ui-bg_glass_40_0a0a0a_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #b8ec79;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #b8ec79;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #000000;
        +	background: #000000 url("images/ui-bg_glass_60_000000_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #96f226;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #96f226;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #696969;
        +	background: #4c4c4c;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #696969;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #8cce3b;
        +	background: #f1fbe5 url("images/ui-bg_glass_55_f1fbe5_1x400.png") 50% 50% repeat-x;
        +	color: #030303;
        +}
        +.ui-state-checked {
        +	border: 1px solid #8cce3b;
        +	background: #f1fbe5;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #030303;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #f1ac88;
        +	background: #f6ecd5 url("images/ui-bg_gloss-wave_95_f6ecd5_500x100.png") 50% top repeat-x;
        +	color: #74736d;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #74736d;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #74736d;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_9fda58_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_1f1f1f_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_b8ec79_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_000000_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_b8ec79_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #262626 url("images/ui-bg_diagonals-small_50_262626_40x40.png") 50% 50% repeat;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -6px -6px 6px #303030;
        +	box-shadow: -6px -6px 6px #303030;
        +}
        diff --git a/bower_components/jquery-ui/themes/trontastic/jquery-ui.min.css b/bower_components/jquery-ui/themes/trontastic/jquery-ui.min.css
        new file mode 100644
        index 0000000000..5c68699c95
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/trontastic/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=9fda58&bgTextureHeader=gloss_wave&bgImgOpacityHeader=85&borderColorHeader=000000&fcHeader=222222&iconColorHeader=1f1f1f&bgColorContent=000000&bgTextureContent=gloss_wave&bgImgOpacityContent=55&borderColorContent=4a4a4a&fcContent=ffffff&iconColorContent=9fda58&bgColorDefault=0a0a0a&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=1b1613&fcDefault=b8ec79&iconColorDefault=b8ec79&bgColorHover=000000&bgTextureHover=glass&bgImgOpacityHover=60&borderColorHover=000000&fcHover=96f226&iconColorHover=b8ec79&bgColorActive=4c4c4c&bgTextureActive=flat&bgImgOpacityActive=0&borderColorActive=696969&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=f1fbe5&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=8cce3b&fcHighlight=030303&iconColorHighlight=000000&bgColorError=f6ecd5&bgTextureError=gloss_wave&bgImgOpacityError=95&borderColorError=f1ac88&fcError=74736d&iconColorError=cd0a0a&bgColorOverlay=262626&bgTextureOverlay=diagonals_small&bgImgOpacityOverlay=50&opacityOverlay=30&bgColorShadow=303030&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=50&thicknessShadow=6px&offsetTopShadow=-6px&offsetLeftShadow=-6px&cornerRadiusShadow=12px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Helvetica,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Helvetica,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #1b1613}.ui-widget-content{border:1px solid #4a4a4a;background:#000 url("images/ui-bg_gloss-wave_55_000000_500x100.png") 50% top repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #000;background:#9fda58 url("images/ui-bg_gloss-wave_85_9fda58_500x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #1b1613;background:#0a0a0a url("images/ui-bg_glass_40_0a0a0a_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#b8ec79}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#b8ec79;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #000;background:#000 url("images/ui-bg_glass_60_000000_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#96f226}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#96f226;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #696969;background:#4c4c4c;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#696969;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #8cce3b;background:#f1fbe5 url("images/ui-bg_glass_55_f1fbe5_1x400.png") 50% 50% repeat-x;color:#030303}.ui-state-checked{border:1px solid #8cce3b;background:#f1fbe5}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#030303}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1ac88;background:#f6ecd5 url("images/ui-bg_gloss-wave_95_f6ecd5_500x100.png") 50% top repeat-x;color:#74736d}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#74736d}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#74736d}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_9fda58_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_1f1f1f_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_b8ec79_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_000000_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_b8ec79_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#262626 url("images/ui-bg_diagonals-small_50_262626_40x40.png") 50% 50% repeat;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-6px -6px 6px #303030;box-shadow:-6px -6px 6px #303030}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/trontastic/theme.css b/bower_components/jquery-ui/themes/trontastic/theme.css
        new file mode 100644
        index 0000000000..3424d70d95
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/trontastic/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CHelvetica%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=9fda58&bgTextureHeader=gloss_wave&bgImgOpacityHeader=85&borderColorHeader=000000&fcHeader=222222&iconColorHeader=1f1f1f&bgColorContent=000000&bgTextureContent=gloss_wave&bgImgOpacityContent=55&borderColorContent=4a4a4a&fcContent=ffffff&iconColorContent=9fda58&bgColorDefault=0a0a0a&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=1b1613&fcDefault=b8ec79&iconColorDefault=b8ec79&bgColorHover=000000&bgTextureHover=glass&bgImgOpacityHover=60&borderColorHover=000000&fcHover=96f226&iconColorHover=b8ec79&bgColorActive=4c4c4c&bgTextureActive=flat&bgImgOpacityActive=0&borderColorActive=696969&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=f1fbe5&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=8cce3b&fcHighlight=030303&iconColorHighlight=000000&bgColorError=f6ecd5&bgTextureError=gloss_wave&bgImgOpacityError=95&borderColorError=f1ac88&fcError=74736d&iconColorError=cd0a0a&bgColorOverlay=262626&bgTextureOverlay=diagonals_small&bgImgOpacityOverlay=50&opacityOverlay=30&bgColorShadow=303030&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=50&thicknessShadow=6px&offsetTopShadow=-6px&offsetLeftShadow=-6px&cornerRadiusShadow=12px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #1b1613;
        +}
        +.ui-widget-content {
        +	border: 1px solid #4a4a4a;
        +	background: #000000 url("images/ui-bg_gloss-wave_55_000000_500x100.png") 50% top repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #000000;
        +	background: #9fda58 url("images/ui-bg_gloss-wave_85_9fda58_500x100.png") 50% 50% repeat-x;
        +	color: #222222;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #222222;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #1b1613;
        +	background: #0a0a0a url("images/ui-bg_glass_40_0a0a0a_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #b8ec79;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #b8ec79;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #000000;
        +	background: #000000 url("images/ui-bg_glass_60_000000_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #96f226;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #96f226;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #696969;
        +	background: #4c4c4c;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #696969;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #8cce3b;
        +	background: #f1fbe5 url("images/ui-bg_glass_55_f1fbe5_1x400.png") 50% 50% repeat-x;
        +	color: #030303;
        +}
        +.ui-state-checked {
        +	border: 1px solid #8cce3b;
        +	background: #f1fbe5;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #030303;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #f1ac88;
        +	background: #f6ecd5 url("images/ui-bg_gloss-wave_95_f6ecd5_500x100.png") 50% top repeat-x;
        +	color: #74736d;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #74736d;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #74736d;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_9fda58_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_1f1f1f_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_b8ec79_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_000000_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_b8ec79_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #262626 url("images/ui-bg_diagonals-small_50_262626_40x40.png") 50% 50% repeat;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -6px -6px 6px #303030;
        +	box-shadow: -6px -6px 6px #303030;
        +}
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_20_555555_1x400.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_20_555555_1x400.png
        new file mode 100644
        index 0000000000..ff324673b9
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_20_555555_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png
        new file mode 100644
        index 0000000000..396b795803
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png
        new file mode 100644
        index 0000000000..453b9df669
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png
        new file mode 100644
        index 0000000000..7ed024ddad
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png
        new file mode 100644
        index 0000000000..b4510e435d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png
        new file mode 100644
        index 0000000000..8538a23204
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png
        new file mode 100644
        index 0000000000..0bbd7586ba
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_222222_256x240.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_222222_256x240.png
        new file mode 100644
        index 0000000000..f184400db5
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_222222_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_4b8e0b_256x240.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_4b8e0b_256x240.png
        new file mode 100644
        index 0000000000..4faad3e924
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_4b8e0b_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_a83300_256x240.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_a83300_256x240.png
        new file mode 100644
        index 0000000000..51581b3e40
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_a83300_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_cccccc_256x240.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_cccccc_256x240.png
        new file mode 100644
        index 0000000000..4184f21a6b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_cccccc_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-darkness/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/jquery-ui.css b/bower_components/jquery-ui/themes/ui-darkness/jquery-ui.css
        new file mode 100644
        index 0000000000..96c0489c7e
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/ui-darkness/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=333333&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=inset_soft&bgImgOpacityContent=25&borderColorContent=666666&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=555555&bgTextureDefault=glass&bgImgOpacityDefault=20&borderColorDefault=666666&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=0078a3&bgTextureHover=glass&bgImgOpacityHover=40&borderColorHover=59b4d4&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f58400&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=ffaf0f&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #666666;
        +}
        +.ui-widget-content {
        +	border: 1px solid #666666;
        +	background: #000000 url("images/ui-bg_inset-soft_25_000000_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #333333;
        +	background: #333333 url("images/ui-bg_gloss-wave_25_333333_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #666666;
        +	background: #555555 url("images/ui-bg_glass_20_555555_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #eeeeee;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #eeeeee;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #59b4d4;
        +	background: #0078a3 url("images/ui-bg_glass_40_0078a3_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #ffaf0f;
        +	background: #f58400 url("images/ui-bg_inset-soft_30_f58400_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #ffaf0f;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;
        +	color: #2e7db2;
        +}
        +.ui-state-checked {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #2e7db2;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ffb73d;
        +	background: #ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;
        +	color: #111111;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #111111;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #111111;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4b8e0b_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_a83300_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #5c5c5c;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #cccccc;
        +	box-shadow: -7px -7px 7px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/jquery-ui.min.css b/bower_components/jquery-ui/themes/ui-darkness/jquery-ui.min.css
        new file mode 100644
        index 0000000000..5766f7eb20
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/ui-darkness/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=333333&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=inset_soft&bgImgOpacityContent=25&borderColorContent=666666&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=555555&bgTextureDefault=glass&bgImgOpacityDefault=20&borderColorDefault=666666&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=0078a3&bgTextureHover=glass&bgImgOpacityHover=40&borderColorHover=59b4d4&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f58400&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=ffaf0f&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #666}.ui-widget-content{border:1px solid #666;background:#000 url("images/ui-bg_inset-soft_25_000000_1x100.png") 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#333 url("images/ui-bg_gloss-wave_25_333333_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #666;background:#555 url("images/ui-bg_glass_20_555555_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#eee;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #59b4d4;background:#0078a3 url("images/ui-bg_glass_40_0078a3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ffaf0f;background:#f58400 url("images/ui-bg_inset-soft_30_f58400_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ffaf0f;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#eee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;color:#2e7db2}.ui-state-checked{border:1px solid #ccc;background:#eee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4b8e0b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_a83300_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #ccc;box-shadow:-7px -7px 7px #ccc}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/ui-darkness/theme.css b/bower_components/jquery-ui/themes/ui-darkness/theme.css
        new file mode 100644
        index 0000000000..214df591c8
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/ui-darkness/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=333333&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=inset_soft&bgImgOpacityContent=25&borderColorContent=666666&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=555555&bgTextureDefault=glass&bgImgOpacityDefault=20&borderColorDefault=666666&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=0078a3&bgTextureHover=glass&bgImgOpacityHover=40&borderColorHover=59b4d4&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f58400&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=ffaf0f&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Segoe UI,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #666666;
        +}
        +.ui-widget-content {
        +	border: 1px solid #666666;
        +	background: #000000 url("images/ui-bg_inset-soft_25_000000_1x100.png") 50% bottom repeat-x;
        +	color: #ffffff;
        +}
        +.ui-widget-content a {
        +	color: #ffffff;
        +}
        +.ui-widget-header {
        +	border: 1px solid #333333;
        +	background: #333333 url("images/ui-bg_gloss-wave_25_333333_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #666666;
        +	background: #555555 url("images/ui-bg_glass_20_555555_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #eeeeee;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #eeeeee;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #59b4d4;
        +	background: #0078a3 url("images/ui-bg_glass_40_0078a3_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #ffaf0f;
        +	background: #f58400 url("images/ui-bg_inset-soft_30_f58400_1x100.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #ffaf0f;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;
        +	color: #2e7db2;
        +}
        +.ui-state-checked {
        +	border: 1px solid #cccccc;
        +	background: #eeeeee;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #2e7db2;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #ffb73d;
        +	background: #ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;
        +	color: #111111;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #111111;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #111111;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_4b8e0b_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_a83300_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 6px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 6px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #5c5c5c;
        +	opacity: .8;
        +	filter: Alpha(Opacity=80); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -7px -7px 7px #cccccc;
        +	box-shadow: -7px -7px 7px #cccccc;
        +}
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
        new file mode 100644
        index 0000000000..41801c369d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
        new file mode 100644
        index 0000000000..c12b63e12a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
        new file mode 100644
        index 0000000000..e1a2a33249
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
        new file mode 100644
        index 0000000000..738ba3f632
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
        new file mode 100644
        index 0000000000..3d53f77029
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
        new file mode 100644
        index 0000000000..7af281173b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
        new file mode 100644
        index 0000000000..47862fe95a
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
        new file mode 100644
        index 0000000000..9dd4d01694
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_222222_256x240.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_222222_256x240.png
        new file mode 100644
        index 0000000000..f184400db5
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_222222_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_228ef1_256x240.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_228ef1_256x240.png
        new file mode 100644
        index 0000000000..33a0400c06
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_228ef1_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png
        new file mode 100644
        index 0000000000..457ac4764d
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png
        new file mode 100644
        index 0000000000..6a927e1fe2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ffffff_256x240.png b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ffffff_256x240.png
        new file mode 100644
        index 0000000000..2cbe10f0b2
        Binary files /dev/null and b/bower_components/jquery-ui/themes/ui-lightness/images/ui-icons_ffffff_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/jquery-ui.css b/bower_components/jquery-ui/themes/ui-lightness/jquery-ui.css
        new file mode 100644
        index 0000000000..6b7ec6aaf5
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/ui-lightness/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cccccc;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #e78f08;
        +	background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cccccc;
        +	background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #1c94c4;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #1c94c4;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #fbcb09;
        +	background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #c77405;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #c77405;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #fbd850;
        +	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #eb8f00;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #fbd850;
        +	background-color: #eb8f00;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #eb8f00;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fed22f;
        +	background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fed22f;
        +	background: #ffe45c;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ef8c08_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ef8c08_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_228ef1_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffd27a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ef8c08_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
        +	opacity: .5;
        +	filter: Alpha(Opacity=50); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -5px -5px 5px #000000;
        +	box-shadow: -5px -5px 5px #000000;
        +}
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css b/bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css
        new file mode 100644
        index 0000000000..8ed2351d64
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #ccc}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#c77405;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-icon-background,.ui-state-active .ui-icon-background{border:#fbd850;background-color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-checked{border:1px solid #fed22f;background:#ffe45c}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{-webkit-box-shadow:-5px -5px 5px #000;box-shadow:-5px -5px 5px #000}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/ui-lightness/theme.css b/bower_components/jquery-ui/themes/ui-lightness/theme.css
        new file mode 100644
        index 0000000000..dec77aed3e
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/ui-lightness/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cccccc;
        +}
        +.ui-widget-content {
        +	border: 1px solid #dddddd;
        +	background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
        +	color: #333333;
        +}
        +.ui-widget-content a {
        +	color: #333333;
        +}
        +.ui-widget-header {
        +	border: 1px solid #e78f08;
        +	background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cccccc;
        +	background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #1c94c4;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #1c94c4;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #fbcb09;
        +	background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #c77405;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #c77405;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #fbd850;
        +	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
        +	font-weight: bold;
        +	color: #eb8f00;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #fbd850;
        +	background-color: #eb8f00;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #eb8f00;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #fed22f;
        +	background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
        +	color: #363636;
        +}
        +.ui-state-checked {
        +	border: 1px solid #fed22f;
        +	background: #ffe45c;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #363636;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
        +	color: #ffffff;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #ffffff;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #ffffff;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_222222_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_ffffff_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_ef8c08_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_ef8c08_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_228ef1_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_ffd27a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_ef8c08_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 4px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 4px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
        +	opacity: .5;
        +	filter: Alpha(Opacity=50); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -5px -5px 5px #000000;
        +	box-shadow: -5px -5px 5px #000000;
        +}
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-bg_glass_95_fef1ec_1x400.png b/bower_components/jquery-ui/themes/vader/images/ui-bg_glass_95_fef1ec_1x400.png
        new file mode 100644
        index 0000000000..41de897103
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-bg_glass_95_fef1ec_1x400.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-bg_gloss-wave_16_121212_500x100.png b/bower_components/jquery-ui/themes/vader/images/ui-bg_gloss-wave_16_121212_500x100.png
        new file mode 100644
        index 0000000000..eac68e5cc8
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-bg_gloss-wave_16_121212_500x100.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-hard_15_888888_1x100.png b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-hard_15_888888_1x100.png
        new file mode 100644
        index 0000000000..6dd2bf64b3
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-hard_15_888888_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-hard_55_555555_1x100.png b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-hard_55_555555_1x100.png
        new file mode 100644
        index 0000000000..4e704a0071
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-hard_55_555555_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-soft_35_adadad_1x100.png b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-soft_35_adadad_1x100.png
        new file mode 100644
        index 0000000000..f0655a6a8f
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-soft_35_adadad_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-soft_60_dddddd_1x100.png b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-soft_60_dddddd_1x100.png
        new file mode 100644
        index 0000000000..625223b4fe
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-bg_highlight-soft_60_dddddd_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-bg_inset-soft_15_121212_1x100.png b/bower_components/jquery-ui/themes/vader/images/ui-bg_inset-soft_15_121212_1x100.png
        new file mode 100644
        index 0000000000..30c7bf4491
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-bg_inset-soft_15_121212_1x100.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-icons_666666_256x240.png b/bower_components/jquery-ui/themes/vader/images/ui-icons_666666_256x240.png
        new file mode 100644
        index 0000000000..4bdf1575e3
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-icons_666666_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-icons_aaaaaa_256x240.png b/bower_components/jquery-ui/themes/vader/images/ui-icons_aaaaaa_256x240.png
        new file mode 100644
        index 0000000000..c9b651cf72
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-icons_aaaaaa_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-icons_bbbbbb_256x240.png b/bower_components/jquery-ui/themes/vader/images/ui-icons_bbbbbb_256x240.png
        new file mode 100644
        index 0000000000..ae2987873c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-icons_bbbbbb_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-icons_c98000_256x240.png b/bower_components/jquery-ui/themes/vader/images/ui-icons_c98000_256x240.png
        new file mode 100644
        index 0000000000..552a9d0c55
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-icons_c98000_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-icons_cccccc_256x240.png b/bower_components/jquery-ui/themes/vader/images/ui-icons_cccccc_256x240.png
        new file mode 100644
        index 0000000000..4184f21a6b
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-icons_cccccc_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-icons_cd0a0a_256x240.png b/bower_components/jquery-ui/themes/vader/images/ui-icons_cd0a0a_256x240.png
        new file mode 100644
        index 0000000000..ed1b23a81c
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-icons_cd0a0a_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/images/ui-icons_f29a00_256x240.png b/bower_components/jquery-ui/themes/vader/images/ui-icons_f29a00_256x240.png
        new file mode 100644
        index 0000000000..0259655b71
        Binary files /dev/null and b/bower_components/jquery-ui/themes/vader/images/ui-icons_f29a00_256x240.png differ
        diff --git a/bower_components/jquery-ui/themes/vader/jquery-ui.css b/bower_components/jquery-ui/themes/vader/jquery-ui.css
        new file mode 100644
        index 0000000000..f95e236823
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/vader/jquery-ui.css
        @@ -0,0 +1,1311 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=888888&bgTextureHeader=highlight_hard&bgImgOpacityHeader=15&borderColorHeader=404040&fcHeader=ffffff&iconColorHeader=cccccc&bgColorContent=121212&bgTextureContent=gloss_wave&bgImgOpacityContent=16&borderColorContent=404040&fcContent=eeeeee&iconColorContent=bbbbbb&bgColorDefault=adadad&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=cccccc&fcDefault=333333&iconColorDefault=666666&bgColorHover=dddddd&bgTextureHover=highlight_soft&bgImgOpacityHover=60&borderColorHover=dddddd&fcHover=000000&iconColorHover=c98000&bgColorActive=121212&bgTextureActive=inset_soft&bgImgOpacityActive=15&borderColorActive=000000&fcActive=ffffff&iconColorActive=f29a00&bgColorHighlight=555555&bgTextureHighlight=highlight_hard&bgImgOpacityHighlight=55&borderColorHighlight=404040&fcHighlight=cccccc&iconColorHighlight=aaaaaa&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +/* Layout helpers
        +----------------------------------*/
        +.ui-helper-hidden {
        +	display: none;
        +}
        +.ui-helper-hidden-accessible {
        +	border: 0;
        +	clip: rect(0 0 0 0);
        +	height: 1px;
        +	margin: -1px;
        +	overflow: hidden;
        +	padding: 0;
        +	position: absolute;
        +	width: 1px;
        +}
        +.ui-helper-reset {
        +	margin: 0;
        +	padding: 0;
        +	border: 0;
        +	outline: 0;
        +	line-height: 1.3;
        +	text-decoration: none;
        +	font-size: 100%;
        +	list-style: none;
        +}
        +.ui-helper-clearfix:before,
        +.ui-helper-clearfix:after {
        +	content: "";
        +	display: table;
        +	border-collapse: collapse;
        +}
        +.ui-helper-clearfix:after {
        +	clear: both;
        +}
        +.ui-helper-zfix {
        +	width: 100%;
        +	height: 100%;
        +	top: 0;
        +	left: 0;
        +	position: absolute;
        +	opacity: 0;
        +	filter:Alpha(Opacity=0); /* support: IE8 */
        +}
        +
        +.ui-front {
        +	z-index: 100;
        +}
        +
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-disabled {
        +	cursor: default !important;
        +	pointer-events: none;
        +}
        +
        +
        +/* Icons
        +----------------------------------*/
        +.ui-icon {
        +	display: inline-block;
        +	vertical-align: middle;
        +	margin-top: -.25em;
        +	position: relative;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +}
        +
        +.ui-widget-icon-block {
        +	left: 50%;
        +	margin-left: -8px;
        +	display: block;
        +}
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	position: fixed;
        +	top: 0;
        +	left: 0;
        +	width: 100%;
        +	height: 100%;
        +}
        +.ui-accordion .ui-accordion-header {
        +	display: block;
        +	cursor: pointer;
        +	position: relative;
        +	margin: 2px 0 0 0;
        +	padding: .5em .5em .5em .7em;
        +	font-size: 100%;
        +}
        +.ui-accordion .ui-accordion-content {
        +	padding: 1em 2.2em;
        +	border-top: 0;
        +	overflow: auto;
        +}
        +.ui-autocomplete {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	cursor: default;
        +}
        +.ui-menu {
        +	list-style: none;
        +	padding: 0;
        +	margin: 0;
        +	display: block;
        +	outline: 0;
        +}
        +.ui-menu .ui-menu {
        +	position: absolute;
        +}
        +.ui-menu .ui-menu-item {
        +	margin: 0;
        +	cursor: pointer;
        +	/* support: IE10, see #8844 */
        +	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
        +}
        +.ui-menu .ui-menu-item-wrapper {
        +	position: relative;
        +	padding: 3px 1em 3px .4em;
        +}
        +.ui-menu .ui-menu-divider {
        +	margin: 5px 0;
        +	height: 0;
        +	font-size: 0;
        +	line-height: 0;
        +	border-width: 1px 0 0 0;
        +}
        +.ui-menu .ui-state-focus,
        +.ui-menu .ui-state-active {
        +	margin: -1px;
        +}
        +
        +/* icon support */
        +.ui-menu-icons {
        +	position: relative;
        +}
        +.ui-menu-icons .ui-menu-item-wrapper {
        +	padding-left: 2em;
        +}
        +
        +/* left-aligned */
        +.ui-menu .ui-icon {
        +	position: absolute;
        +	top: 0;
        +	bottom: 0;
        +	left: .2em;
        +	margin: auto 0;
        +}
        +
        +/* right-aligned */
        +.ui-menu .ui-menu-icon {
        +	left: auto;
        +	right: 0;
        +}
        +.ui-button {
        +	padding: .4em 1em;
        +	display: inline-block;
        +	position: relative;
        +	line-height: normal;
        +	margin-right: .1em;
        +	cursor: pointer;
        +	vertical-align: middle;
        +	text-align: center;
        +	-webkit-user-select: none;
        +	-moz-user-select: none;
        +	-ms-user-select: none;
        +	user-select: none;
        +
        +	/* Support: IE <= 11 */
        +	overflow: visible;
        +}
        +
        +.ui-button,
        +.ui-button:link,
        +.ui-button:visited,
        +.ui-button:hover,
        +.ui-button:active {
        +	text-decoration: none;
        +}
        +
        +/* to make room for the icon, a width needs to be set here */
        +.ui-button-icon-only {
        +	width: 2em;
        +	box-sizing: border-box;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +}
        +
        +/* no icon support for input elements */
        +input.ui-button.ui-button-icon-only {
        +	text-indent: 0;
        +}
        +
        +/* button icon element(s) */
        +.ui-button-icon-only .ui-icon {
        +	position: absolute;
        +	top: 50%;
        +	left: 50%;
        +	margin-top: -8px;
        +	margin-left: -8px;
        +}
        +
        +.ui-button.ui-icon-notext .ui-icon {
        +	padding: 0;
        +	width: 2.1em;
        +	height: 2.1em;
        +	text-indent: -9999px;
        +	white-space: nowrap;
        +
        +}
        +
        +input.ui-button.ui-icon-notext .ui-icon {
        +	width: auto;
        +	height: auto;
        +	text-indent: 0;
        +	white-space: normal;
        +	padding: .4em 1em;
        +}
        +
        +/* workarounds */
        +/* Support: Firefox 5 - 40 */
        +input.ui-button::-moz-focus-inner,
        +button.ui-button::-moz-focus-inner {
        +	border: 0;
        +	padding: 0;
        +}
        +.ui-controlgroup {
        +	vertical-align: middle;
        +	display: inline-block;
        +}
        +.ui-controlgroup > .ui-controlgroup-item {
        +	float: left;
        +	margin-left: 0;
        +	margin-right: 0;
        +}
        +.ui-controlgroup > .ui-controlgroup-item:focus,
        +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
        +	z-index: 9999;
        +}
        +.ui-controlgroup-vertical > .ui-controlgroup-item {
        +	display: block;
        +	float: none;
        +	width: 100%;
        +	margin-top: 0;
        +	margin-bottom: 0;
        +	text-align: left;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-item {
        +	box-sizing: border-box;
        +}
        +.ui-controlgroup .ui-controlgroup-label {
        +	padding: .4em 1em;
        +}
        +.ui-controlgroup .ui-controlgroup-label span {
        +	font-size: 80%;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-left: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
        +	border-top: none;
        +}
        +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
        +	border-right: none;
        +}
        +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
        +	border-bottom: none;
        +}
        +
        +/* Spinner specific style fixes */
        +.ui-controlgroup-vertical .ui-spinner-input {
        +
        +	/* Support: IE8 only, Android < 4.4 only */
        +	width: 75%;
        +	width: calc( 100% - 2.4em );
        +}
        +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
        +	border-top-style: solid;
        +}
        +
        +.ui-checkboxradio-label .ui-icon-background {
        +	box-shadow: inset 1px 1px 1px #ccc;
        +	border-radius: .12em;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label .ui-icon-background {
        +	width: 16px;
        +	height: 16px;
        +	border-radius: 1em;
        +	overflow: visible;
        +	border: none;
        +}
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
        +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
        +	background-image: none;
        +	width: 8px;
        +	height: 8px;
        +	border-width: 4px;
        +	border-style: solid;
        +}
        +.ui-checkboxradio-disabled {
        +	pointer-events: none;
        +}
        +.ui-datepicker {
        +	width: 17em;
        +	padding: .2em .2em 0;
        +	display: none;
        +}
        +.ui-datepicker .ui-datepicker-header {
        +	position: relative;
        +	padding: .2em 0;
        +}
        +.ui-datepicker .ui-datepicker-prev,
        +.ui-datepicker .ui-datepicker-next {
        +	position: absolute;
        +	top: 2px;
        +	width: 1.8em;
        +	height: 1.8em;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover,
        +.ui-datepicker .ui-datepicker-next-hover {
        +	top: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev {
        +	left: 2px;
        +}
        +.ui-datepicker .ui-datepicker-next {
        +	right: 2px;
        +}
        +.ui-datepicker .ui-datepicker-prev-hover {
        +	left: 1px;
        +}
        +.ui-datepicker .ui-datepicker-next-hover {
        +	right: 1px;
        +}
        +.ui-datepicker .ui-datepicker-prev span,
        +.ui-datepicker .ui-datepicker-next span {
        +	display: block;
        +	position: absolute;
        +	left: 50%;
        +	margin-left: -8px;
        +	top: 50%;
        +	margin-top: -8px;
        +}
        +.ui-datepicker .ui-datepicker-title {
        +	margin: 0 2.3em;
        +	line-height: 1.8em;
        +	text-align: center;
        +}
        +.ui-datepicker .ui-datepicker-title select {
        +	font-size: 1em;
        +	margin: 1px 0;
        +}
        +.ui-datepicker select.ui-datepicker-month,
        +.ui-datepicker select.ui-datepicker-year {
        +	width: 45%;
        +}
        +.ui-datepicker table {
        +	width: 100%;
        +	font-size: .9em;
        +	border-collapse: collapse;
        +	margin: 0 0 .4em;
        +}
        +.ui-datepicker th {
        +	padding: .7em .3em;
        +	text-align: center;
        +	font-weight: bold;
        +	border: 0;
        +}
        +.ui-datepicker td {
        +	border: 0;
        +	padding: 1px;
        +}
        +.ui-datepicker td span,
        +.ui-datepicker td a {
        +	display: block;
        +	padding: .2em;
        +	text-align: right;
        +	text-decoration: none;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane {
        +	background-image: none;
        +	margin: .7em 0 0 0;
        +	padding: 0 .2em;
        +	border-left: 0;
        +	border-right: 0;
        +	border-bottom: 0;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button {
        +	float: right;
        +	margin: .5em .2em .4em;
        +	cursor: pointer;
        +	padding: .2em .6em .3em .6em;
        +	width: auto;
        +	overflow: visible;
        +}
        +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
        +	float: left;
        +}
        +
        +/* with multiple calendars */
        +.ui-datepicker.ui-datepicker-multi {
        +	width: auto;
        +}
        +.ui-datepicker-multi .ui-datepicker-group {
        +	float: left;
        +}
        +.ui-datepicker-multi .ui-datepicker-group table {
        +	width: 95%;
        +	margin: 0 auto .4em;
        +}
        +.ui-datepicker-multi-2 .ui-datepicker-group {
        +	width: 50%;
        +}
        +.ui-datepicker-multi-3 .ui-datepicker-group {
        +	width: 33.3%;
        +}
        +.ui-datepicker-multi-4 .ui-datepicker-group {
        +	width: 25%;
        +}
        +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-left-width: 0;
        +}
        +.ui-datepicker-multi .ui-datepicker-buttonpane {
        +	clear: left;
        +}
        +.ui-datepicker-row-break {
        +	clear: both;
        +	width: 100%;
        +	font-size: 0;
        +}
        +
        +/* RTL support */
        +.ui-datepicker-rtl {
        +	direction: rtl;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev {
        +	right: 2px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next {
        +	left: 2px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-prev:hover {
        +	right: 1px;
        +	left: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-next:hover {
        +	left: 1px;
        +	right: auto;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane {
        +	clear: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
        +	float: left;
        +}
        +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
        +.ui-datepicker-rtl .ui-datepicker-group {
        +	float: right;
        +}
        +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
        +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
        +	border-right-width: 0;
        +	border-left-width: 1px;
        +}
        +
        +/* Icons */
        +.ui-datepicker .ui-icon {
        +	display: block;
        +	text-indent: -99999px;
        +	overflow: hidden;
        +	background-repeat: no-repeat;
        +	left: .5em;
        +	top: .3em;
        +}
        +.ui-dialog {
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	padding: .2em;
        +	outline: 0;
        +}
        +.ui-dialog .ui-dialog-titlebar {
        +	padding: .4em 1em;
        +	position: relative;
        +}
        +.ui-dialog .ui-dialog-title {
        +	float: left;
        +	margin: .1em 0;
        +	white-space: nowrap;
        +	width: 90%;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-dialog .ui-dialog-titlebar-close {
        +	position: absolute;
        +	right: .3em;
        +	top: 50%;
        +	width: 20px;
        +	margin: -10px 0 0 0;
        +	padding: 1px;
        +	height: 20px;
        +}
        +.ui-dialog .ui-dialog-content {
        +	position: relative;
        +	border: 0;
        +	padding: .5em 1em;
        +	background: none;
        +	overflow: auto;
        +}
        +.ui-dialog .ui-dialog-buttonpane {
        +	text-align: left;
        +	border-width: 1px 0 0 0;
        +	background-image: none;
        +	margin-top: .5em;
        +	padding: .3em 1em .5em .4em;
        +}
        +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
        +	float: right;
        +}
        +.ui-dialog .ui-dialog-buttonpane button {
        +	margin: .5em .4em .5em 0;
        +	cursor: pointer;
        +}
        +.ui-dialog .ui-resizable-n {
        +	height: 2px;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-e {
        +	width: 2px;
        +	right: 0;
        +}
        +.ui-dialog .ui-resizable-s {
        +	height: 2px;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-w {
        +	width: 2px;
        +	left: 0;
        +}
        +.ui-dialog .ui-resizable-se,
        +.ui-dialog .ui-resizable-sw,
        +.ui-dialog .ui-resizable-ne,
        +.ui-dialog .ui-resizable-nw {
        +	width: 7px;
        +	height: 7px;
        +}
        +.ui-dialog .ui-resizable-se {
        +	right: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-sw {
        +	left: 0;
        +	bottom: 0;
        +}
        +.ui-dialog .ui-resizable-ne {
        +	right: 0;
        +	top: 0;
        +}
        +.ui-dialog .ui-resizable-nw {
        +	left: 0;
        +	top: 0;
        +}
        +.ui-draggable .ui-dialog-titlebar {
        +	cursor: move;
        +}
        +.ui-draggable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable {
        +	position: relative;
        +}
        +.ui-resizable-handle {
        +	position: absolute;
        +	font-size: 0.1px;
        +	display: block;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-resizable-disabled .ui-resizable-handle,
        +.ui-resizable-autohide .ui-resizable-handle {
        +	display: none;
        +}
        +.ui-resizable-n {
        +	cursor: n-resize;
        +	height: 7px;
        +	width: 100%;
        +	top: -5px;
        +	left: 0;
        +}
        +.ui-resizable-s {
        +	cursor: s-resize;
        +	height: 7px;
        +	width: 100%;
        +	bottom: -5px;
        +	left: 0;
        +}
        +.ui-resizable-e {
        +	cursor: e-resize;
        +	width: 7px;
        +	right: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-w {
        +	cursor: w-resize;
        +	width: 7px;
        +	left: -5px;
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-resizable-se {
        +	cursor: se-resize;
        +	width: 12px;
        +	height: 12px;
        +	right: 1px;
        +	bottom: 1px;
        +}
        +.ui-resizable-sw {
        +	cursor: sw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	bottom: -5px;
        +}
        +.ui-resizable-nw {
        +	cursor: nw-resize;
        +	width: 9px;
        +	height: 9px;
        +	left: -5px;
        +	top: -5px;
        +}
        +.ui-resizable-ne {
        +	cursor: ne-resize;
        +	width: 9px;
        +	height: 9px;
        +	right: -5px;
        +	top: -5px;
        +}
        +.ui-progressbar {
        +	height: 2em;
        +	text-align: left;
        +	overflow: hidden;
        +}
        +.ui-progressbar .ui-progressbar-value {
        +	margin: -1px;
        +	height: 100%;
        +}
        +.ui-progressbar .ui-progressbar-overlay {
        +	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
        +	height: 100%;
        +	filter: alpha(opacity=25); /* support: IE8 */
        +	opacity: 0.25;
        +}
        +.ui-progressbar-indeterminate .ui-progressbar-value {
        +	background-image: none;
        +}
        +.ui-selectable {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-selectable-helper {
        +	position: absolute;
        +	z-index: 100;
        +	border: 1px dotted black;
        +}
        +.ui-selectmenu-menu {
        +	padding: 0;
        +	margin: 0;
        +	position: absolute;
        +	top: 0;
        +	left: 0;
        +	display: none;
        +}
        +.ui-selectmenu-menu .ui-menu {
        +	overflow: auto;
        +	overflow-x: hidden;
        +	padding-bottom: 1px;
        +}
        +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
        +	font-size: 1em;
        +	font-weight: bold;
        +	line-height: 1.5;
        +	padding: 2px 0.4em;
        +	margin: 0.5em 0 0 0;
        +	height: auto;
        +	border: 0;
        +}
        +.ui-selectmenu-open {
        +	display: block;
        +}
        +.ui-selectmenu-text {
        +	display: block;
        +	margin-right: 20px;
        +	overflow: hidden;
        +	text-overflow: ellipsis;
        +}
        +.ui-selectmenu-button.ui-button {
        +	text-align: left;
        +	white-space: nowrap;
        +	width: 14em;
        +}
        +.ui-selectmenu-icon.ui-icon {
        +	float: right;
        +	margin-top: 0;
        +}
        +.ui-slider {
        +	position: relative;
        +	text-align: left;
        +}
        +.ui-slider .ui-slider-handle {
        +	position: absolute;
        +	z-index: 2;
        +	width: 1.2em;
        +	height: 1.2em;
        +	cursor: default;
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-slider .ui-slider-range {
        +	position: absolute;
        +	z-index: 1;
        +	font-size: .7em;
        +	display: block;
        +	border: 0;
        +	background-position: 0 0;
        +}
        +
        +/* support: IE8 - See #6727 */
        +.ui-slider.ui-state-disabled .ui-slider-handle,
        +.ui-slider.ui-state-disabled .ui-slider-range {
        +	filter: inherit;
        +}
        +
        +.ui-slider-horizontal {
        +	height: .8em;
        +}
        +.ui-slider-horizontal .ui-slider-handle {
        +	top: -.3em;
        +	margin-left: -.6em;
        +}
        +.ui-slider-horizontal .ui-slider-range {
        +	top: 0;
        +	height: 100%;
        +}
        +.ui-slider-horizontal .ui-slider-range-min {
        +	left: 0;
        +}
        +.ui-slider-horizontal .ui-slider-range-max {
        +	right: 0;
        +}
        +
        +.ui-slider-vertical {
        +	width: .8em;
        +	height: 100px;
        +}
        +.ui-slider-vertical .ui-slider-handle {
        +	left: -.3em;
        +	margin-left: 0;
        +	margin-bottom: -.6em;
        +}
        +.ui-slider-vertical .ui-slider-range {
        +	left: 0;
        +	width: 100%;
        +}
        +.ui-slider-vertical .ui-slider-range-min {
        +	bottom: 0;
        +}
        +.ui-slider-vertical .ui-slider-range-max {
        +	top: 0;
        +}
        +.ui-sortable-handle {
        +	-ms-touch-action: none;
        +	touch-action: none;
        +}
        +.ui-spinner {
        +	position: relative;
        +	display: inline-block;
        +	overflow: hidden;
        +	padding: 0;
        +	vertical-align: middle;
        +}
        +.ui-spinner-input {
        +	border: none;
        +	background: none;
        +	color: inherit;
        +	padding: .222em 0;
        +	margin: .2em 0;
        +	vertical-align: middle;
        +	margin-left: .4em;
        +	margin-right: 2em;
        +}
        +.ui-spinner-button {
        +	width: 1.6em;
        +	height: 50%;
        +	font-size: .5em;
        +	padding: 0;
        +	margin: 0;
        +	text-align: center;
        +	position: absolute;
        +	cursor: default;
        +	display: block;
        +	overflow: hidden;
        +	right: 0;
        +}
        +/* more specificity required here to override default borders */
        +.ui-spinner a.ui-spinner-button {
        +	border-top-style: none;
        +	border-bottom-style: none;
        +	border-right-style: none;
        +}
        +.ui-spinner-up {
        +	top: 0;
        +}
        +.ui-spinner-down {
        +	bottom: 0;
        +}
        +.ui-tabs {
        +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
        +	padding: .2em;
        +}
        +.ui-tabs .ui-tabs-nav {
        +	margin: 0;
        +	padding: .2em .2em 0;
        +}
        +.ui-tabs .ui-tabs-nav li {
        +	list-style: none;
        +	float: left;
        +	position: relative;
        +	top: 0;
        +	margin: 1px .2em 0 0;
        +	border-bottom-width: 0;
        +	padding: 0;
        +	white-space: nowrap;
        +}
        +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
        +	float: left;
        +	padding: .5em 1em;
        +	text-decoration: none;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
        +	margin-bottom: -1px;
        +	padding-bottom: 1px;
        +}
        +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
        +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
        +	cursor: text;
        +}
        +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
        +	cursor: pointer;
        +}
        +.ui-tabs .ui-tabs-panel {
        +	display: block;
        +	border-width: 0;
        +	padding: 1em 1.4em;
        +	background: none;
        +}
        +.ui-tooltip {
        +	padding: 8px;
        +	position: absolute;
        +	z-index: 9999;
        +	max-width: 300px;
        +}
        +body .ui-tooltip {
        +	border-width: 2px;
        +}
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cccccc;
        +}
        +.ui-widget-content {
        +	border: 1px solid #404040;
        +	background: #121212 url("images/ui-bg_gloss-wave_16_121212_500x100.png") 50% top repeat-x;
        +	color: #eeeeee;
        +}
        +.ui-widget-content a {
        +	color: #eeeeee;
        +}
        +.ui-widget-header {
        +	border: 1px solid #404040;
        +	background: #888888 url("images/ui-bg_highlight-hard_15_888888_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cccccc;
        +	background: #adadad url("images/ui-bg_highlight-soft_35_adadad_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #333333;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #333333;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #dddddd;
        +	background: #dddddd url("images/ui-bg_highlight-soft_60_dddddd_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #000000;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #000000;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #000000;
        +	background: #121212 url("images/ui-bg_inset-soft_15_121212_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #000000;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #404040;
        +	background: #555555 url("images/ui-bg_highlight-hard_55_555555_1x100.png") 50% top repeat-x;
        +	color: #cccccc;
        +}
        +.ui-state-checked {
        +	border: 1px solid #404040;
        +	background: #555555;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #cccccc;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
        +	color: #cd0a0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd0a0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd0a0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_bbbbbb_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_c98000_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f29a00_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_aaaaaa_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_666666_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/themes/vader/jquery-ui.min.css b/bower_components/jquery-ui/themes/vader/jquery-ui.min.css
        new file mode 100644
        index 0000000000..7a2a0dc7bc
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/vader/jquery-ui.min.css
        @@ -0,0 +1,7 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-14
        +* http://jqueryui.com
        +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
        +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=888888&bgTextureHeader=highlight_hard&bgImgOpacityHeader=15&borderColorHeader=404040&fcHeader=ffffff&iconColorHeader=cccccc&bgColorContent=121212&bgTextureContent=gloss_wave&bgImgOpacityContent=16&borderColorContent=404040&fcContent=eeeeee&iconColorContent=bbbbbb&bgColorDefault=adadad&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=cccccc&fcDefault=333333&iconColorDefault=666666&bgColorHover=dddddd&bgTextureHover=highlight_soft&bgImgOpacityHover=60&borderColorHover=dddddd&fcHover=000000&iconColorHover=c98000&bgColorActive=121212&bgTextureActive=inset_soft&bgImgOpacityActive=15&borderColorActive=000000&fcActive=ffffff&iconColorActive=f29a00&bgColorHighlight=555555&bgTextureHighlight=highlight_hard&bgImgOpacityHighlight=55&borderColorHighlight=404040&fcHighlight=cccccc&iconColorHighlight=aaaaaa&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +
        +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Helvetica,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Helvetica,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #ccc}.ui-widget-content{border:1px solid #404040;background:#121212 url("images/ui-bg_gloss-wave_16_121212_500x100.png") 50% top repeat-x;color:#eee}.ui-widget-content a{color:#eee}.ui-widget-header{border:1px solid #404040;background:#888 url("images/ui-bg_highlight-hard_15_888888_1x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #ccc;background:#adadad url("images/ui-bg_highlight-soft_35_adadad_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#333}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#333;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ddd;background:#ddd url("images/ui-bg_highlight-soft_60_dddddd_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#000}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#000;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #000;background:#121212 url("images/ui-bg_inset-soft_15_121212_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#000;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #404040;background:#555 url("images/ui-bg_highlight-hard_55_555555_1x100.png") 50% top repeat-x;color:#ccc}.ui-state-checked{border:1px solid #404040;background:#555}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#ccc}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_bbbbbb_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_c98000_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_f29a00_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_aaaaaa_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_666666_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/themes/vader/theme.css b/bower_components/jquery-ui/themes/vader/theme.css
        new file mode 100644
        index 0000000000..093c30badd
        --- /dev/null
        +++ b/bower_components/jquery-ui/themes/vader/theme.css
        @@ -0,0 +1,443 @@
        +/*!
        + * jQuery UI CSS Framework 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/category/theming/
        + *
        + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Helvetica%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=888888&bgTextureHeader=highlight_hard&bgImgOpacityHeader=15&borderColorHeader=404040&fcHeader=ffffff&iconColorHeader=cccccc&bgColorContent=121212&bgTextureContent=gloss_wave&bgImgOpacityContent=16&borderColorContent=404040&fcContent=eeeeee&iconColorContent=bbbbbb&bgColorDefault=adadad&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=cccccc&fcDefault=333333&iconColorDefault=666666&bgColorHover=dddddd&bgTextureHover=highlight_soft&bgImgOpacityHover=60&borderColorHover=dddddd&fcHover=000000&iconColorHover=c98000&bgColorActive=121212&bgTextureActive=inset_soft&bgImgOpacityActive=15&borderColorActive=000000&fcActive=ffffff&iconColorActive=f29a00&bgColorHighlight=555555&bgTextureHighlight=highlight_hard&bgImgOpacityHighlight=55&borderColorHighlight=404040&fcHighlight=cccccc&iconColorHighlight=aaaaaa&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a
        + */
        +
        +
        +/* Component containers
        +----------------------------------*/
        +.ui-widget {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1.1em;
        +}
        +.ui-widget .ui-widget {
        +	font-size: 1em;
        +}
        +.ui-widget input,
        +.ui-widget select,
        +.ui-widget textarea,
        +.ui-widget button {
        +	font-family: Helvetica,Arial,sans-serif;
        +	font-size: 1em;
        +}
        +.ui-widget.ui-widget-content {
        +	border: 1px solid #cccccc;
        +}
        +.ui-widget-content {
        +	border: 1px solid #404040;
        +	background: #121212 url("images/ui-bg_gloss-wave_16_121212_500x100.png") 50% top repeat-x;
        +	color: #eeeeee;
        +}
        +.ui-widget-content a {
        +	color: #eeeeee;
        +}
        +.ui-widget-header {
        +	border: 1px solid #404040;
        +	background: #888888 url("images/ui-bg_highlight-hard_15_888888_1x100.png") 50% 50% repeat-x;
        +	color: #ffffff;
        +	font-weight: bold;
        +}
        +.ui-widget-header a {
        +	color: #ffffff;
        +}
        +
        +/* Interaction states
        +----------------------------------*/
        +.ui-state-default,
        +.ui-widget-content .ui-state-default,
        +.ui-widget-header .ui-state-default,
        +.ui-button,
        +
        +/* We use html here because we need a greater specificity to make sure disabled
        +works properly when clicked or hovered */
        +html .ui-button.ui-state-disabled:hover,
        +html .ui-button.ui-state-disabled:active {
        +	border: 1px solid #cccccc;
        +	background: #adadad url("images/ui-bg_highlight-soft_35_adadad_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #333333;
        +}
        +.ui-state-default a,
        +.ui-state-default a:link,
        +.ui-state-default a:visited,
        +a.ui-button,
        +a:link.ui-button,
        +a:visited.ui-button,
        +.ui-button {
        +	color: #333333;
        +	text-decoration: none;
        +}
        +.ui-state-hover,
        +.ui-widget-content .ui-state-hover,
        +.ui-widget-header .ui-state-hover,
        +.ui-state-focus,
        +.ui-widget-content .ui-state-focus,
        +.ui-widget-header .ui-state-focus,
        +.ui-button:hover,
        +.ui-button:focus {
        +	border: 1px solid #dddddd;
        +	background: #dddddd url("images/ui-bg_highlight-soft_60_dddddd_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #000000;
        +}
        +.ui-state-hover a,
        +.ui-state-hover a:hover,
        +.ui-state-hover a:link,
        +.ui-state-hover a:visited,
        +.ui-state-focus a,
        +.ui-state-focus a:hover,
        +.ui-state-focus a:link,
        +.ui-state-focus a:visited,
        +a.ui-button:hover,
        +a.ui-button:focus {
        +	color: #000000;
        +	text-decoration: none;
        +}
        +
        +.ui-visual-focus {
        +	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
        +}
        +.ui-state-active,
        +.ui-widget-content .ui-state-active,
        +.ui-widget-header .ui-state-active,
        +a.ui-button:active,
        +.ui-button:active,
        +.ui-button.ui-state-active:hover {
        +	border: 1px solid #000000;
        +	background: #121212 url("images/ui-bg_inset-soft_15_121212_1x100.png") 50% 50% repeat-x;
        +	font-weight: normal;
        +	color: #ffffff;
        +}
        +.ui-icon-background,
        +.ui-state-active .ui-icon-background {
        +	border: #000000;
        +	background-color: #ffffff;
        +}
        +.ui-state-active a,
        +.ui-state-active a:link,
        +.ui-state-active a:visited {
        +	color: #ffffff;
        +	text-decoration: none;
        +}
        +
        +/* Interaction Cues
        +----------------------------------*/
        +.ui-state-highlight,
        +.ui-widget-content .ui-state-highlight,
        +.ui-widget-header .ui-state-highlight {
        +	border: 1px solid #404040;
        +	background: #555555 url("images/ui-bg_highlight-hard_55_555555_1x100.png") 50% top repeat-x;
        +	color: #cccccc;
        +}
        +.ui-state-checked {
        +	border: 1px solid #404040;
        +	background: #555555;
        +}
        +.ui-state-highlight a,
        +.ui-widget-content .ui-state-highlight a,
        +.ui-widget-header .ui-state-highlight a {
        +	color: #cccccc;
        +}
        +.ui-state-error,
        +.ui-widget-content .ui-state-error,
        +.ui-widget-header .ui-state-error {
        +	border: 1px solid #cd0a0a;
        +	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
        +	color: #cd0a0a;
        +}
        +.ui-state-error a,
        +.ui-widget-content .ui-state-error a,
        +.ui-widget-header .ui-state-error a {
        +	color: #cd0a0a;
        +}
        +.ui-state-error-text,
        +.ui-widget-content .ui-state-error-text,
        +.ui-widget-header .ui-state-error-text {
        +	color: #cd0a0a;
        +}
        +.ui-priority-primary,
        +.ui-widget-content .ui-priority-primary,
        +.ui-widget-header .ui-priority-primary {
        +	font-weight: bold;
        +}
        +.ui-priority-secondary,
        +.ui-widget-content .ui-priority-secondary,
        +.ui-widget-header .ui-priority-secondary {
        +	opacity: .7;
        +	filter:Alpha(Opacity=70); /* support: IE8 */
        +	font-weight: normal;
        +}
        +.ui-state-disabled,
        +.ui-widget-content .ui-state-disabled,
        +.ui-widget-header .ui-state-disabled {
        +	opacity: .35;
        +	filter:Alpha(Opacity=35); /* support: IE8 */
        +	background-image: none;
        +}
        +.ui-state-disabled .ui-icon {
        +	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
        +}
        +
        +/* Icons
        +----------------------------------*/
        +
        +/* states and images */
        +.ui-icon {
        +	width: 16px;
        +	height: 16px;
        +}
        +.ui-icon,
        +.ui-widget-content .ui-icon {
        +	background-image: url("images/ui-icons_bbbbbb_256x240.png");
        +}
        +.ui-widget-header .ui-icon {
        +	background-image: url("images/ui-icons_cccccc_256x240.png");
        +}
        +.ui-state-hover .ui-icon,
        +.ui-state-focus .ui-icon,
        +.ui-button:hover .ui-icon,
        +.ui-button:focus .ui-icon {
        +	background-image: url("images/ui-icons_c98000_256x240.png");
        +}
        +.ui-state-active .ui-icon,
        +.ui-button:active .ui-icon {
        +	background-image: url("images/ui-icons_f29a00_256x240.png");
        +}
        +.ui-state-highlight .ui-icon,
        +.ui-button .ui-state-highlight.ui-icon {
        +	background-image: url("images/ui-icons_aaaaaa_256x240.png");
        +}
        +.ui-state-error .ui-icon,
        +.ui-state-error-text .ui-icon {
        +	background-image: url("images/ui-icons_cd0a0a_256x240.png");
        +}
        +.ui-button .ui-icon {
        +	background-image: url("images/ui-icons_666666_256x240.png");
        +}
        +
        +/* positioning */
        +.ui-icon-blank { background-position: 16px 16px; }
        +.ui-icon-caret-1-n { background-position: 0 0; }
        +.ui-icon-caret-1-ne { background-position: -16px 0; }
        +.ui-icon-caret-1-e { background-position: -32px 0; }
        +.ui-icon-caret-1-se { background-position: -48px 0; }
        +.ui-icon-caret-1-s { background-position: -65px 0; }
        +.ui-icon-caret-1-sw { background-position: -80px 0; }
        +.ui-icon-caret-1-w { background-position: -96px 0; }
        +.ui-icon-caret-1-nw { background-position: -112px 0; }
        +.ui-icon-caret-2-n-s { background-position: -128px 0; }
        +.ui-icon-caret-2-e-w { background-position: -144px 0; }
        +.ui-icon-triangle-1-n { background-position: 0 -16px; }
        +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
        +.ui-icon-triangle-1-e { background-position: -32px -16px; }
        +.ui-icon-triangle-1-se { background-position: -48px -16px; }
        +.ui-icon-triangle-1-s { background-position: -65px -16px; }
        +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
        +.ui-icon-triangle-1-w { background-position: -96px -16px; }
        +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
        +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
        +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
        +.ui-icon-arrow-1-n { background-position: 0 -32px; }
        +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
        +.ui-icon-arrow-1-e { background-position: -32px -32px; }
        +.ui-icon-arrow-1-se { background-position: -48px -32px; }
        +.ui-icon-arrow-1-s { background-position: -65px -32px; }
        +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
        +.ui-icon-arrow-1-w { background-position: -96px -32px; }
        +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
        +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
        +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
        +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
        +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
        +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
        +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
        +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
        +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
        +.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
        +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
        +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
        +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
        +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
        +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
        +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
        +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
        +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
        +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
        +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
        +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
        +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
        +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
        +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
        +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
        +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
        +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
        +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
        +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
        +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
        +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
        +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
        +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
        +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
        +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
        +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
        +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
        +.ui-icon-arrow-4 { background-position: 0 -80px; }
        +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
        +.ui-icon-extlink { background-position: -32px -80px; }
        +.ui-icon-newwin { background-position: -48px -80px; }
        +.ui-icon-refresh { background-position: -64px -80px; }
        +.ui-icon-shuffle { background-position: -80px -80px; }
        +.ui-icon-transfer-e-w { background-position: -96px -80px; }
        +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
        +.ui-icon-folder-collapsed { background-position: 0 -96px; }
        +.ui-icon-folder-open { background-position: -16px -96px; }
        +.ui-icon-document { background-position: -32px -96px; }
        +.ui-icon-document-b { background-position: -48px -96px; }
        +.ui-icon-note { background-position: -64px -96px; }
        +.ui-icon-mail-closed { background-position: -80px -96px; }
        +.ui-icon-mail-open { background-position: -96px -96px; }
        +.ui-icon-suitcase { background-position: -112px -96px; }
        +.ui-icon-comment { background-position: -128px -96px; }
        +.ui-icon-person { background-position: -144px -96px; }
        +.ui-icon-print { background-position: -160px -96px; }
        +.ui-icon-trash { background-position: -176px -96px; }
        +.ui-icon-locked { background-position: -192px -96px; }
        +.ui-icon-unlocked { background-position: -208px -96px; }
        +.ui-icon-bookmark { background-position: -224px -96px; }
        +.ui-icon-tag { background-position: -240px -96px; }
        +.ui-icon-home { background-position: 0 -112px; }
        +.ui-icon-flag { background-position: -16px -112px; }
        +.ui-icon-calendar { background-position: -32px -112px; }
        +.ui-icon-cart { background-position: -48px -112px; }
        +.ui-icon-pencil { background-position: -64px -112px; }
        +.ui-icon-clock { background-position: -80px -112px; }
        +.ui-icon-disk { background-position: -96px -112px; }
        +.ui-icon-calculator { background-position: -112px -112px; }
        +.ui-icon-zoomin { background-position: -128px -112px; }
        +.ui-icon-zoomout { background-position: -144px -112px; }
        +.ui-icon-search { background-position: -160px -112px; }
        +.ui-icon-wrench { background-position: -176px -112px; }
        +.ui-icon-gear { background-position: -192px -112px; }
        +.ui-icon-heart { background-position: -208px -112px; }
        +.ui-icon-star { background-position: -224px -112px; }
        +.ui-icon-link { background-position: -240px -112px; }
        +.ui-icon-cancel { background-position: 0 -128px; }
        +.ui-icon-plus { background-position: -16px -128px; }
        +.ui-icon-plusthick { background-position: -32px -128px; }
        +.ui-icon-minus { background-position: -48px -128px; }
        +.ui-icon-minusthick { background-position: -64px -128px; }
        +.ui-icon-close { background-position: -80px -128px; }
        +.ui-icon-closethick { background-position: -96px -128px; }
        +.ui-icon-key { background-position: -112px -128px; }
        +.ui-icon-lightbulb { background-position: -128px -128px; }
        +.ui-icon-scissors { background-position: -144px -128px; }
        +.ui-icon-clipboard { background-position: -160px -128px; }
        +.ui-icon-copy { background-position: -176px -128px; }
        +.ui-icon-contact { background-position: -192px -128px; }
        +.ui-icon-image { background-position: -208px -128px; }
        +.ui-icon-video { background-position: -224px -128px; }
        +.ui-icon-script { background-position: -240px -128px; }
        +.ui-icon-alert { background-position: 0 -144px; }
        +.ui-icon-info { background-position: -16px -144px; }
        +.ui-icon-notice { background-position: -32px -144px; }
        +.ui-icon-help { background-position: -48px -144px; }
        +.ui-icon-check { background-position: -64px -144px; }
        +.ui-icon-bullet { background-position: -80px -144px; }
        +.ui-icon-radio-on { background-position: -96px -144px; }
        +.ui-icon-radio-off { background-position: -112px -144px; }
        +.ui-icon-pin-w { background-position: -128px -144px; }
        +.ui-icon-pin-s { background-position: -144px -144px; }
        +.ui-icon-play { background-position: 0 -160px; }
        +.ui-icon-pause { background-position: -16px -160px; }
        +.ui-icon-seek-next { background-position: -32px -160px; }
        +.ui-icon-seek-prev { background-position: -48px -160px; }
        +.ui-icon-seek-end { background-position: -64px -160px; }
        +.ui-icon-seek-start { background-position: -80px -160px; }
        +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
        +.ui-icon-seek-first { background-position: -80px -160px; }
        +.ui-icon-stop { background-position: -96px -160px; }
        +.ui-icon-eject { background-position: -112px -160px; }
        +.ui-icon-volume-off { background-position: -128px -160px; }
        +.ui-icon-volume-on { background-position: -144px -160px; }
        +.ui-icon-power { background-position: 0 -176px; }
        +.ui-icon-signal-diag { background-position: -16px -176px; }
        +.ui-icon-signal { background-position: -32px -176px; }
        +.ui-icon-battery-0 { background-position: -48px -176px; }
        +.ui-icon-battery-1 { background-position: -64px -176px; }
        +.ui-icon-battery-2 { background-position: -80px -176px; }
        +.ui-icon-battery-3 { background-position: -96px -176px; }
        +.ui-icon-circle-plus { background-position: 0 -192px; }
        +.ui-icon-circle-minus { background-position: -16px -192px; }
        +.ui-icon-circle-close { background-position: -32px -192px; }
        +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
        +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
        +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
        +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
        +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
        +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
        +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
        +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
        +.ui-icon-circle-zoomin { background-position: -176px -192px; }
        +.ui-icon-circle-zoomout { background-position: -192px -192px; }
        +.ui-icon-circle-check { background-position: -208px -192px; }
        +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
        +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
        +.ui-icon-circlesmall-close { background-position: -32px -208px; }
        +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
        +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
        +.ui-icon-squaresmall-close { background-position: -80px -208px; }
        +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
        +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
        +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
        +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
        +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
        +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
        +
        +
        +/* Misc visuals
        +----------------------------------*/
        +
        +/* Corner radius */
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-left,
        +.ui-corner-tl {
        +	border-top-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-top,
        +.ui-corner-right,
        +.ui-corner-tr {
        +	border-top-right-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-left,
        +.ui-corner-bl {
        +	border-bottom-left-radius: 5px;
        +}
        +.ui-corner-all,
        +.ui-corner-bottom,
        +.ui-corner-right,
        +.ui-corner-br {
        +	border-bottom-right-radius: 5px;
        +}
        +
        +/* Overlays */
        +.ui-widget-overlay {
        +	background: #aaaaaa;
        +	opacity: .3;
        +	filter: Alpha(Opacity=30); /* support: IE8 */
        +}
        +.ui-widget-shadow {
        +	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
        +	box-shadow: -8px -8px 8px #aaaaaa;
        +}
        diff --git a/bower_components/jquery-ui/ui/.jshintrc b/bower_components/jquery-ui/ui/.jshintrc
        new file mode 100755
        index 0000000000..98a79b5dbd
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/.jshintrc
        @@ -0,0 +1,24 @@
        +{
        +	"boss": true,
        +	"curly": true,
        +	"eqeqeq": true,
        +	"eqnull": true,
        +	"expr": true,
        +	"immed": true,
        +	"noarg": true,
        +	"onevar": true,
        +	"quotmark": "double",
        +	"smarttabs": true,
        +	"trailing": true,
        +	"undef": true,
        +	"unused": true,
        +
        +	"browser": true,
        +	"es3": true,
        +	"jquery": true,
        +
        +	"globals": {
        +		"define": false,
        +		"Globalize": false
        +	}
        +}
        diff --git a/bower_components/jquery-ui/ui/core.js b/bower_components/jquery-ui/ui/core.js
        new file mode 100644
        index 0000000000..2cccd0bd8e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/core.js
        @@ -0,0 +1,21 @@
        +// This file is deprecated in 1.12.0 to be removed in 1.13
        +( function() {
        +define( [
        +	"jquery",
        +	"./data",
        +	"./disable-selection",
        +	"./focusable",
        +	"./form",
        +	"./ie",
        +	"./keycode",
        +	"./labels",
        +	"./jquery-1-7",
        +	"./plugin",
        +	"./safe-active-element",
        +	"./safe-blur",
        +	"./scroll-parent",
        +	"./tabbable",
        +	"./unique-id",
        +	"./version"
        +] );
        +} )();
        diff --git a/bower_components/jquery-ui/ui/data.js b/bower_components/jquery-ui/ui/data.js
        new file mode 100644
        index 0000000000..1a14ed1cf2
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/data.js
        @@ -0,0 +1,39 @@
        +/*!
        + * jQuery UI :data 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: :data Selector
        +//>>group: Core
        +//>>description: Selects elements which have data stored under the specified key.
        +//>>docs: http://api.jqueryui.com/data-selector/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +return $.extend( $.expr[ ":" ], {
        +	data: $.expr.createPseudo ?
        +		$.expr.createPseudo( function( dataName ) {
        +			return function( elem ) {
        +				return !!$.data( elem, dataName );
        +			};
        +		} ) :
        +
        +		// Support: jQuery <1.8
        +		function( elem, i, match ) {
        +			return !!$.data( elem, match[ 3 ] );
        +		}
        +} );
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/disable-selection.js b/bower_components/jquery-ui/ui/disable-selection.js
        new file mode 100644
        index 0000000000..6188b64687
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/disable-selection.js
        @@ -0,0 +1,46 @@
        +/*!
        + * jQuery UI Disable Selection 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: disableSelection
        +//>>group: Core
        +//>>description: Disable selection of text content within the set of matched elements.
        +//>>docs: http://api.jqueryui.com/disableSelection/
        +
        +// This file is deprecated
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +return $.fn.extend( {
        +	disableSelection: ( function() {
        +		var eventType = "onselectstart" in document.createElement( "div" ) ?
        +			"selectstart" :
        +			"mousedown";
        +
        +		return function() {
        +			return this.on( eventType + ".ui-disableSelection", function( event ) {
        +				event.preventDefault();
        +			} );
        +		};
        +	} )(),
        +
        +	enableSelection: function() {
        +		return this.off( ".ui-disableSelection" );
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effect.js b/bower_components/jquery-ui/ui/effect.js
        new file mode 100644
        index 0000000000..88bd7874da
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effect.js
        @@ -0,0 +1,1635 @@
        +/*!
        + * jQuery UI Effects 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Effects Core
        +//>>group: Effects
        +// jscs:disable maximumLineLength
        +//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/category/effects-core/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +var dataSpace = "ui-effects-",
        +	dataSpaceStyle = "ui-effects-style",
        +	dataSpaceAnimated = "ui-effects-animated",
        +
        +	// Create a local jQuery because jQuery Color relies on it and the
        +	// global may not exist with AMD and a custom build (#10199)
        +	jQuery = $;
        +
        +$.effects = {
        +	effect: {}
        +};
        +
        +/*!
        + * jQuery Color Animations v2.1.2
        + * https://github.com/jquery/jquery-color
        + *
        + * Copyright 2014 jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * Date: Wed Jan 16 08:47:09 2013 -0600
        + */
        +( function( jQuery, undefined ) {
        +
        +	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
        +		"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
        +
        +	// Plusequals test for += 100 -= 100
        +	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
        +
        +	// A set of RE's that can match strings and generate color tuples.
        +	stringParsers = [ {
        +			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        +			parse: function( execResult ) {
        +				return [
        +					execResult[ 1 ],
        +					execResult[ 2 ],
        +					execResult[ 3 ],
        +					execResult[ 4 ]
        +				];
        +			}
        +		}, {
        +			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        +			parse: function( execResult ) {
        +				return [
        +					execResult[ 1 ] * 2.55,
        +					execResult[ 2 ] * 2.55,
        +					execResult[ 3 ] * 2.55,
        +					execResult[ 4 ]
        +				];
        +			}
        +		}, {
        +
        +			// This regex ignores A-F because it's compared against an already lowercased string
        +			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
        +			parse: function( execResult ) {
        +				return [
        +					parseInt( execResult[ 1 ], 16 ),
        +					parseInt( execResult[ 2 ], 16 ),
        +					parseInt( execResult[ 3 ], 16 )
        +				];
        +			}
        +		}, {
        +
        +			// This regex ignores A-F because it's compared against an already lowercased string
        +			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
        +			parse: function( execResult ) {
        +				return [
        +					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
        +					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
        +					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
        +				];
        +			}
        +		}, {
        +			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        +			space: "hsla",
        +			parse: function( execResult ) {
        +				return [
        +					execResult[ 1 ],
        +					execResult[ 2 ] / 100,
        +					execResult[ 3 ] / 100,
        +					execResult[ 4 ]
        +				];
        +			}
        +		} ],
        +
        +	// JQuery.Color( )
        +	color = jQuery.Color = function( color, green, blue, alpha ) {
        +		return new jQuery.Color.fn.parse( color, green, blue, alpha );
        +	},
        +	spaces = {
        +		rgba: {
        +			props: {
        +				red: {
        +					idx: 0,
        +					type: "byte"
        +				},
        +				green: {
        +					idx: 1,
        +					type: "byte"
        +				},
        +				blue: {
        +					idx: 2,
        +					type: "byte"
        +				}
        +			}
        +		},
        +
        +		hsla: {
        +			props: {
        +				hue: {
        +					idx: 0,
        +					type: "degrees"
        +				},
        +				saturation: {
        +					idx: 1,
        +					type: "percent"
        +				},
        +				lightness: {
        +					idx: 2,
        +					type: "percent"
        +				}
        +			}
        +		}
        +	},
        +	propTypes = {
        +		"byte": {
        +			floor: true,
        +			max: 255
        +		},
        +		"percent": {
        +			max: 1
        +		},
        +		"degrees": {
        +			mod: 360,
        +			floor: true
        +		}
        +	},
        +	support = color.support = {},
        +
        +	// Element for support tests
        +	supportElem = jQuery( "<p>" )[ 0 ],
        +
        +	// Colors = jQuery.Color.names
        +	colors,
        +
        +	// Local aliases of functions called often
        +	each = jQuery.each;
        +
        +// Determine rgba support immediately
        +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
        +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
        +
        +// Define cache name and alpha properties
        +// for rgba and hsla spaces
        +each( spaces, function( spaceName, space ) {
        +	space.cache = "_" + spaceName;
        +	space.props.alpha = {
        +		idx: 3,
        +		type: "percent",
        +		def: 1
        +	};
        +} );
        +
        +function clamp( value, prop, allowEmpty ) {
        +	var type = propTypes[ prop.type ] || {};
        +
        +	if ( value == null ) {
        +		return ( allowEmpty || !prop.def ) ? null : prop.def;
        +	}
        +
        +	// ~~ is an short way of doing floor for positive numbers
        +	value = type.floor ? ~~value : parseFloat( value );
        +
        +	// IE will pass in empty strings as value for alpha,
        +	// which will hit this case
        +	if ( isNaN( value ) ) {
        +		return prop.def;
        +	}
        +
        +	if ( type.mod ) {
        +
        +		// We add mod before modding to make sure that negatives values
        +		// get converted properly: -10 -> 350
        +		return ( value + type.mod ) % type.mod;
        +	}
        +
        +	// For now all property types without mod have min and max
        +	return 0 > value ? 0 : type.max < value ? type.max : value;
        +}
        +
        +function stringParse( string ) {
        +	var inst = color(),
        +		rgba = inst._rgba = [];
        +
        +	string = string.toLowerCase();
        +
        +	each( stringParsers, function( i, parser ) {
        +		var parsed,
        +			match = parser.re.exec( string ),
        +			values = match && parser.parse( match ),
        +			spaceName = parser.space || "rgba";
        +
        +		if ( values ) {
        +			parsed = inst[ spaceName ]( values );
        +
        +			// If this was an rgba parse the assignment might happen twice
        +			// oh well....
        +			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
        +			rgba = inst._rgba = parsed._rgba;
        +
        +			// Exit each( stringParsers ) here because we matched
        +			return false;
        +		}
        +	} );
        +
        +	// Found a stringParser that handled it
        +	if ( rgba.length ) {
        +
        +		// If this came from a parsed string, force "transparent" when alpha is 0
        +		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
        +		if ( rgba.join() === "0,0,0,0" ) {
        +			jQuery.extend( rgba, colors.transparent );
        +		}
        +		return inst;
        +	}
        +
        +	// Named colors
        +	return colors[ string ];
        +}
        +
        +color.fn = jQuery.extend( color.prototype, {
        +	parse: function( red, green, blue, alpha ) {
        +		if ( red === undefined ) {
        +			this._rgba = [ null, null, null, null ];
        +			return this;
        +		}
        +		if ( red.jquery || red.nodeType ) {
        +			red = jQuery( red ).css( green );
        +			green = undefined;
        +		}
        +
        +		var inst = this,
        +			type = jQuery.type( red ),
        +			rgba = this._rgba = [];
        +
        +		// More than 1 argument specified - assume ( red, green, blue, alpha )
        +		if ( green !== undefined ) {
        +			red = [ red, green, blue, alpha ];
        +			type = "array";
        +		}
        +
        +		if ( type === "string" ) {
        +			return this.parse( stringParse( red ) || colors._default );
        +		}
        +
        +		if ( type === "array" ) {
        +			each( spaces.rgba.props, function( key, prop ) {
        +				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
        +			} );
        +			return this;
        +		}
        +
        +		if ( type === "object" ) {
        +			if ( red instanceof color ) {
        +				each( spaces, function( spaceName, space ) {
        +					if ( red[ space.cache ] ) {
        +						inst[ space.cache ] = red[ space.cache ].slice();
        +					}
        +				} );
        +			} else {
        +				each( spaces, function( spaceName, space ) {
        +					var cache = space.cache;
        +					each( space.props, function( key, prop ) {
        +
        +						// If the cache doesn't exist, and we know how to convert
        +						if ( !inst[ cache ] && space.to ) {
        +
        +							// If the value was null, we don't need to copy it
        +							// if the key was alpha, we don't need to copy it either
        +							if ( key === "alpha" || red[ key ] == null ) {
        +								return;
        +							}
        +							inst[ cache ] = space.to( inst._rgba );
        +						}
        +
        +						// This is the only case where we allow nulls for ALL properties.
        +						// call clamp with alwaysAllowEmpty
        +						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
        +					} );
        +
        +					// Everything defined but alpha?
        +					if ( inst[ cache ] &&
        +							jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
        +
        +						// Use the default of 1
        +						inst[ cache ][ 3 ] = 1;
        +						if ( space.from ) {
        +							inst._rgba = space.from( inst[ cache ] );
        +						}
        +					}
        +				} );
        +			}
        +			return this;
        +		}
        +	},
        +	is: function( compare ) {
        +		var is = color( compare ),
        +			same = true,
        +			inst = this;
        +
        +		each( spaces, function( _, space ) {
        +			var localCache,
        +				isCache = is[ space.cache ];
        +			if ( isCache ) {
        +				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
        +				each( space.props, function( _, prop ) {
        +					if ( isCache[ prop.idx ] != null ) {
        +						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
        +						return same;
        +					}
        +				} );
        +			}
        +			return same;
        +		} );
        +		return same;
        +	},
        +	_space: function() {
        +		var used = [],
        +			inst = this;
        +		each( spaces, function( spaceName, space ) {
        +			if ( inst[ space.cache ] ) {
        +				used.push( spaceName );
        +			}
        +		} );
        +		return used.pop();
        +	},
        +	transition: function( other, distance ) {
        +		var end = color( other ),
        +			spaceName = end._space(),
        +			space = spaces[ spaceName ],
        +			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
        +			start = startColor[ space.cache ] || space.to( startColor._rgba ),
        +			result = start.slice();
        +
        +		end = end[ space.cache ];
        +		each( space.props, function( key, prop ) {
        +			var index = prop.idx,
        +				startValue = start[ index ],
        +				endValue = end[ index ],
        +				type = propTypes[ prop.type ] || {};
        +
        +			// If null, don't override start value
        +			if ( endValue === null ) {
        +				return;
        +			}
        +
        +			// If null - use end
        +			if ( startValue === null ) {
        +				result[ index ] = endValue;
        +			} else {
        +				if ( type.mod ) {
        +					if ( endValue - startValue > type.mod / 2 ) {
        +						startValue += type.mod;
        +					} else if ( startValue - endValue > type.mod / 2 ) {
        +						startValue -= type.mod;
        +					}
        +				}
        +				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
        +			}
        +		} );
        +		return this[ spaceName ]( result );
        +	},
        +	blend: function( opaque ) {
        +
        +		// If we are already opaque - return ourself
        +		if ( this._rgba[ 3 ] === 1 ) {
        +			return this;
        +		}
        +
        +		var rgb = this._rgba.slice(),
        +			a = rgb.pop(),
        +			blend = color( opaque )._rgba;
        +
        +		return color( jQuery.map( rgb, function( v, i ) {
        +			return ( 1 - a ) * blend[ i ] + a * v;
        +		} ) );
        +	},
        +	toRgbaString: function() {
        +		var prefix = "rgba(",
        +			rgba = jQuery.map( this._rgba, function( v, i ) {
        +				return v == null ? ( i > 2 ? 1 : 0 ) : v;
        +			} );
        +
        +		if ( rgba[ 3 ] === 1 ) {
        +			rgba.pop();
        +			prefix = "rgb(";
        +		}
        +
        +		return prefix + rgba.join() + ")";
        +	},
        +	toHslaString: function() {
        +		var prefix = "hsla(",
        +			hsla = jQuery.map( this.hsla(), function( v, i ) {
        +				if ( v == null ) {
        +					v = i > 2 ? 1 : 0;
        +				}
        +
        +				// Catch 1 and 2
        +				if ( i && i < 3 ) {
        +					v = Math.round( v * 100 ) + "%";
        +				}
        +				return v;
        +			} );
        +
        +		if ( hsla[ 3 ] === 1 ) {
        +			hsla.pop();
        +			prefix = "hsl(";
        +		}
        +		return prefix + hsla.join() + ")";
        +	},
        +	toHexString: function( includeAlpha ) {
        +		var rgba = this._rgba.slice(),
        +			alpha = rgba.pop();
        +
        +		if ( includeAlpha ) {
        +			rgba.push( ~~( alpha * 255 ) );
        +		}
        +
        +		return "#" + jQuery.map( rgba, function( v ) {
        +
        +			// Default to 0 when nulls exist
        +			v = ( v || 0 ).toString( 16 );
        +			return v.length === 1 ? "0" + v : v;
        +		} ).join( "" );
        +	},
        +	toString: function() {
        +		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
        +	}
        +} );
        +color.fn.parse.prototype = color.fn;
        +
        +// Hsla conversions adapted from:
        +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
        +
        +function hue2rgb( p, q, h ) {
        +	h = ( h + 1 ) % 1;
        +	if ( h * 6 < 1 ) {
        +		return p + ( q - p ) * h * 6;
        +	}
        +	if ( h * 2 < 1 ) {
        +		return q;
        +	}
        +	if ( h * 3 < 2 ) {
        +		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
        +	}
        +	return p;
        +}
        +
        +spaces.hsla.to = function( rgba ) {
        +	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
        +		return [ null, null, null, rgba[ 3 ] ];
        +	}
        +	var r = rgba[ 0 ] / 255,
        +		g = rgba[ 1 ] / 255,
        +		b = rgba[ 2 ] / 255,
        +		a = rgba[ 3 ],
        +		max = Math.max( r, g, b ),
        +		min = Math.min( r, g, b ),
        +		diff = max - min,
        +		add = max + min,
        +		l = add * 0.5,
        +		h, s;
        +
        +	if ( min === max ) {
        +		h = 0;
        +	} else if ( r === max ) {
        +		h = ( 60 * ( g - b ) / diff ) + 360;
        +	} else if ( g === max ) {
        +		h = ( 60 * ( b - r ) / diff ) + 120;
        +	} else {
        +		h = ( 60 * ( r - g ) / diff ) + 240;
        +	}
        +
        +	// Chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
        +	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
        +	if ( diff === 0 ) {
        +		s = 0;
        +	} else if ( l <= 0.5 ) {
        +		s = diff / add;
        +	} else {
        +		s = diff / ( 2 - add );
        +	}
        +	return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
        +};
        +
        +spaces.hsla.from = function( hsla ) {
        +	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
        +		return [ null, null, null, hsla[ 3 ] ];
        +	}
        +	var h = hsla[ 0 ] / 360,
        +		s = hsla[ 1 ],
        +		l = hsla[ 2 ],
        +		a = hsla[ 3 ],
        +		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
        +		p = 2 * l - q;
        +
        +	return [
        +		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
        +		Math.round( hue2rgb( p, q, h ) * 255 ),
        +		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
        +		a
        +	];
        +};
        +
        +each( spaces, function( spaceName, space ) {
        +	var props = space.props,
        +		cache = space.cache,
        +		to = space.to,
        +		from = space.from;
        +
        +	// Makes rgba() and hsla()
        +	color.fn[ spaceName ] = function( value ) {
        +
        +		// Generate a cache for this space if it doesn't exist
        +		if ( to && !this[ cache ] ) {
        +			this[ cache ] = to( this._rgba );
        +		}
        +		if ( value === undefined ) {
        +			return this[ cache ].slice();
        +		}
        +
        +		var ret,
        +			type = jQuery.type( value ),
        +			arr = ( type === "array" || type === "object" ) ? value : arguments,
        +			local = this[ cache ].slice();
        +
        +		each( props, function( key, prop ) {
        +			var val = arr[ type === "object" ? key : prop.idx ];
        +			if ( val == null ) {
        +				val = local[ prop.idx ];
        +			}
        +			local[ prop.idx ] = clamp( val, prop );
        +		} );
        +
        +		if ( from ) {
        +			ret = color( from( local ) );
        +			ret[ cache ] = local;
        +			return ret;
        +		} else {
        +			return color( local );
        +		}
        +	};
        +
        +	// Makes red() green() blue() alpha() hue() saturation() lightness()
        +	each( props, function( key, prop ) {
        +
        +		// Alpha is included in more than one space
        +		if ( color.fn[ key ] ) {
        +			return;
        +		}
        +		color.fn[ key ] = function( value ) {
        +			var vtype = jQuery.type( value ),
        +				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
        +				local = this[ fn ](),
        +				cur = local[ prop.idx ],
        +				match;
        +
        +			if ( vtype === "undefined" ) {
        +				return cur;
        +			}
        +
        +			if ( vtype === "function" ) {
        +				value = value.call( this, cur );
        +				vtype = jQuery.type( value );
        +			}
        +			if ( value == null && prop.empty ) {
        +				return this;
        +			}
        +			if ( vtype === "string" ) {
        +				match = rplusequals.exec( value );
        +				if ( match ) {
        +					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
        +				}
        +			}
        +			local[ prop.idx ] = value;
        +			return this[ fn ]( local );
        +		};
        +	} );
        +} );
        +
        +// Add cssHook and .fx.step function for each named hook.
        +// accept a space separated string of properties
        +color.hook = function( hook ) {
        +	var hooks = hook.split( " " );
        +	each( hooks, function( i, hook ) {
        +		jQuery.cssHooks[ hook ] = {
        +			set: function( elem, value ) {
        +				var parsed, curElem,
        +					backgroundColor = "";
        +
        +				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" ||
        +						( parsed = stringParse( value ) ) ) ) {
        +					value = color( parsed || value );
        +					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
        +						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
        +						while (
        +							( backgroundColor === "" || backgroundColor === "transparent" ) &&
        +							curElem && curElem.style
        +						) {
        +							try {
        +								backgroundColor = jQuery.css( curElem, "backgroundColor" );
        +								curElem = curElem.parentNode;
        +							} catch ( e ) {
        +							}
        +						}
        +
        +						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
        +							backgroundColor :
        +							"_default" );
        +					}
        +
        +					value = value.toRgbaString();
        +				}
        +				try {
        +					elem.style[ hook ] = value;
        +				} catch ( e ) {
        +
        +					// Wrapped to prevent IE from throwing errors on "invalid" values like
        +					// 'auto' or 'inherit'
        +				}
        +			}
        +		};
        +		jQuery.fx.step[ hook ] = function( fx ) {
        +			if ( !fx.colorInit ) {
        +				fx.start = color( fx.elem, hook );
        +				fx.end = color( fx.end );
        +				fx.colorInit = true;
        +			}
        +			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
        +		};
        +	} );
        +
        +};
        +
        +color.hook( stepHooks );
        +
        +jQuery.cssHooks.borderColor = {
        +	expand: function( value ) {
        +		var expanded = {};
        +
        +		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
        +			expanded[ "border" + part + "Color" ] = value;
        +		} );
        +		return expanded;
        +	}
        +};
        +
        +// Basic color names only.
        +// Usage of any of the other color names requires adding yourself or including
        +// jquery.color.svg-names.js.
        +colors = jQuery.Color.names = {
        +
        +	// 4.1. Basic color keywords
        +	aqua: "#00ffff",
        +	black: "#000000",
        +	blue: "#0000ff",
        +	fuchsia: "#ff00ff",
        +	gray: "#808080",
        +	green: "#008000",
        +	lime: "#00ff00",
        +	maroon: "#800000",
        +	navy: "#000080",
        +	olive: "#808000",
        +	purple: "#800080",
        +	red: "#ff0000",
        +	silver: "#c0c0c0",
        +	teal: "#008080",
        +	white: "#ffffff",
        +	yellow: "#ffff00",
        +
        +	// 4.2.3. "transparent" color keyword
        +	transparent: [ null, null, null, 0 ],
        +
        +	_default: "#ffffff"
        +};
        +
        +} )( jQuery );
        +
        +/******************************************************************************/
        +/****************************** CLASS ANIMATIONS ******************************/
        +/******************************************************************************/
        +( function() {
        +
        +var classAnimationActions = [ "add", "remove", "toggle" ],
        +	shorthandStyles = {
        +		border: 1,
        +		borderBottom: 1,
        +		borderColor: 1,
        +		borderLeft: 1,
        +		borderRight: 1,
        +		borderTop: 1,
        +		borderWidth: 1,
        +		margin: 1,
        +		padding: 1
        +	};
        +
        +$.each(
        +	[ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
        +	function( _, prop ) {
        +		$.fx.step[ prop ] = function( fx ) {
        +			if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
        +				jQuery.style( fx.elem, prop, fx.end );
        +				fx.setAttr = true;
        +			}
        +		};
        +	}
        +);
        +
        +function getElementStyles( elem ) {
        +	var key, len,
        +		style = elem.ownerDocument.defaultView ?
        +			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
        +			elem.currentStyle,
        +		styles = {};
        +
        +	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
        +		len = style.length;
        +		while ( len-- ) {
        +			key = style[ len ];
        +			if ( typeof style[ key ] === "string" ) {
        +				styles[ $.camelCase( key ) ] = style[ key ];
        +			}
        +		}
        +
        +	// Support: Opera, IE <9
        +	} else {
        +		for ( key in style ) {
        +			if ( typeof style[ key ] === "string" ) {
        +				styles[ key ] = style[ key ];
        +			}
        +		}
        +	}
        +
        +	return styles;
        +}
        +
        +function styleDifference( oldStyle, newStyle ) {
        +	var diff = {},
        +		name, value;
        +
        +	for ( name in newStyle ) {
        +		value = newStyle[ name ];
        +		if ( oldStyle[ name ] !== value ) {
        +			if ( !shorthandStyles[ name ] ) {
        +				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
        +					diff[ name ] = value;
        +				}
        +			}
        +		}
        +	}
        +
        +	return diff;
        +}
        +
        +// Support: jQuery <1.8
        +if ( !$.fn.addBack ) {
        +	$.fn.addBack = function( selector ) {
        +		return this.add( selector == null ?
        +			this.prevObject : this.prevObject.filter( selector )
        +		);
        +	};
        +}
        +
        +$.effects.animateClass = function( value, duration, easing, callback ) {
        +	var o = $.speed( duration, easing, callback );
        +
        +	return this.queue( function() {
        +		var animated = $( this ),
        +			baseClass = animated.attr( "class" ) || "",
        +			applyClassChange,
        +			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
        +
        +		// Map the animated objects to store the original styles.
        +		allAnimations = allAnimations.map( function() {
        +			var el = $( this );
        +			return {
        +				el: el,
        +				start: getElementStyles( this )
        +			};
        +		} );
        +
        +		// Apply class change
        +		applyClassChange = function() {
        +			$.each( classAnimationActions, function( i, action ) {
        +				if ( value[ action ] ) {
        +					animated[ action + "Class" ]( value[ action ] );
        +				}
        +			} );
        +		};
        +		applyClassChange();
        +
        +		// Map all animated objects again - calculate new styles and diff
        +		allAnimations = allAnimations.map( function() {
        +			this.end = getElementStyles( this.el[ 0 ] );
        +			this.diff = styleDifference( this.start, this.end );
        +			return this;
        +		} );
        +
        +		// Apply original class
        +		animated.attr( "class", baseClass );
        +
        +		// Map all animated objects again - this time collecting a promise
        +		allAnimations = allAnimations.map( function() {
        +			var styleInfo = this,
        +				dfd = $.Deferred(),
        +				opts = $.extend( {}, o, {
        +					queue: false,
        +					complete: function() {
        +						dfd.resolve( styleInfo );
        +					}
        +				} );
        +
        +			this.el.animate( this.diff, opts );
        +			return dfd.promise();
        +		} );
        +
        +		// Once all animations have completed:
        +		$.when.apply( $, allAnimations.get() ).done( function() {
        +
        +			// Set the final class
        +			applyClassChange();
        +
        +			// For each animated element,
        +			// clear all css properties that were animated
        +			$.each( arguments, function() {
        +				var el = this.el;
        +				$.each( this.diff, function( key ) {
        +					el.css( key, "" );
        +				} );
        +			} );
        +
        +			// This is guarnteed to be there if you use jQuery.speed()
        +			// it also handles dequeuing the next anim...
        +			o.complete.call( animated[ 0 ] );
        +		} );
        +	} );
        +};
        +
        +$.fn.extend( {
        +	addClass: ( function( orig ) {
        +		return function( classNames, speed, easing, callback ) {
        +			return speed ?
        +				$.effects.animateClass.call( this,
        +					{ add: classNames }, speed, easing, callback ) :
        +				orig.apply( this, arguments );
        +		};
        +	} )( $.fn.addClass ),
        +
        +	removeClass: ( function( orig ) {
        +		return function( classNames, speed, easing, callback ) {
        +			return arguments.length > 1 ?
        +				$.effects.animateClass.call( this,
        +					{ remove: classNames }, speed, easing, callback ) :
        +				orig.apply( this, arguments );
        +		};
        +	} )( $.fn.removeClass ),
        +
        +	toggleClass: ( function( orig ) {
        +		return function( classNames, force, speed, easing, callback ) {
        +			if ( typeof force === "boolean" || force === undefined ) {
        +				if ( !speed ) {
        +
        +					// Without speed parameter
        +					return orig.apply( this, arguments );
        +				} else {
        +					return $.effects.animateClass.call( this,
        +						( force ? { add: classNames } : { remove: classNames } ),
        +						speed, easing, callback );
        +				}
        +			} else {
        +
        +				// Without force parameter
        +				return $.effects.animateClass.call( this,
        +					{ toggle: classNames }, force, speed, easing );
        +			}
        +		};
        +	} )( $.fn.toggleClass ),
        +
        +	switchClass: function( remove, add, speed, easing, callback ) {
        +		return $.effects.animateClass.call( this, {
        +			add: add,
        +			remove: remove
        +		}, speed, easing, callback );
        +	}
        +} );
        +
        +} )();
        +
        +/******************************************************************************/
        +/*********************************** EFFECTS **********************************/
        +/******************************************************************************/
        +
        +( function() {
        +
        +if ( $.expr && $.expr.filters && $.expr.filters.animated ) {
        +	$.expr.filters.animated = ( function( orig ) {
        +		return function( elem ) {
        +			return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
        +		};
        +	} )( $.expr.filters.animated );
        +}
        +
        +if ( $.uiBackCompat !== false ) {
        +	$.extend( $.effects, {
        +
        +		// Saves a set of properties in a data storage
        +		save: function( element, set ) {
        +			var i = 0, length = set.length;
        +			for ( ; i < length; i++ ) {
        +				if ( set[ i ] !== null ) {
        +					element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
        +				}
        +			}
        +		},
        +
        +		// Restores a set of previously saved properties from a data storage
        +		restore: function( element, set ) {
        +			var val, i = 0, length = set.length;
        +			for ( ; i < length; i++ ) {
        +				if ( set[ i ] !== null ) {
        +					val = element.data( dataSpace + set[ i ] );
        +					element.css( set[ i ], val );
        +				}
        +			}
        +		},
        +
        +		setMode: function( el, mode ) {
        +			if ( mode === "toggle" ) {
        +				mode = el.is( ":hidden" ) ? "show" : "hide";
        +			}
        +			return mode;
        +		},
        +
        +		// Wraps the element around a wrapper that copies position properties
        +		createWrapper: function( element ) {
        +
        +			// If the element is already wrapped, return it
        +			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
        +				return element.parent();
        +			}
        +
        +			// Wrap the element
        +			var props = {
        +					width: element.outerWidth( true ),
        +					height: element.outerHeight( true ),
        +					"float": element.css( "float" )
        +				},
        +				wrapper = $( "<div></div>" )
        +					.addClass( "ui-effects-wrapper" )
        +					.css( {
        +						fontSize: "100%",
        +						background: "transparent",
        +						border: "none",
        +						margin: 0,
        +						padding: 0
        +					} ),
        +
        +				// Store the size in case width/height are defined in % - Fixes #5245
        +				size = {
        +					width: element.width(),
        +					height: element.height()
        +				},
        +				active = document.activeElement;
        +
        +			// Support: Firefox
        +			// Firefox incorrectly exposes anonymous content
        +			// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
        +			try {
        +				active.id;
        +			} catch ( e ) {
        +				active = document.body;
        +			}
        +
        +			element.wrap( wrapper );
        +
        +			// Fixes #7595 - Elements lose focus when wrapped.
        +			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        +				$( active ).trigger( "focus" );
        +			}
        +
        +			// Hotfix for jQuery 1.4 since some change in wrap() seems to actually
        +			// lose the reference to the wrapped element
        +			wrapper = element.parent();
        +
        +			// Transfer positioning properties to the wrapper
        +			if ( element.css( "position" ) === "static" ) {
        +				wrapper.css( { position: "relative" } );
        +				element.css( { position: "relative" } );
        +			} else {
        +				$.extend( props, {
        +					position: element.css( "position" ),
        +					zIndex: element.css( "z-index" )
        +				} );
        +				$.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
        +					props[ pos ] = element.css( pos );
        +					if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
        +						props[ pos ] = "auto";
        +					}
        +				} );
        +				element.css( {
        +					position: "relative",
        +					top: 0,
        +					left: 0,
        +					right: "auto",
        +					bottom: "auto"
        +				} );
        +			}
        +			element.css( size );
        +
        +			return wrapper.css( props ).show();
        +		},
        +
        +		removeWrapper: function( element ) {
        +			var active = document.activeElement;
        +
        +			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
        +				element.parent().replaceWith( element );
        +
        +				// Fixes #7595 - Elements lose focus when wrapped.
        +				if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        +					$( active ).trigger( "focus" );
        +				}
        +			}
        +
        +			return element;
        +		}
        +	} );
        +}
        +
        +$.extend( $.effects, {
        +	version: "1.12.1",
        +
        +	define: function( name, mode, effect ) {
        +		if ( !effect ) {
        +			effect = mode;
        +			mode = "effect";
        +		}
        +
        +		$.effects.effect[ name ] = effect;
        +		$.effects.effect[ name ].mode = mode;
        +
        +		return effect;
        +	},
        +
        +	scaledDimensions: function( element, percent, direction ) {
        +		if ( percent === 0 ) {
        +			return {
        +				height: 0,
        +				width: 0,
        +				outerHeight: 0,
        +				outerWidth: 0
        +			};
        +		}
        +
        +		var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
        +			y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
        +
        +		return {
        +			height: element.height() * y,
        +			width: element.width() * x,
        +			outerHeight: element.outerHeight() * y,
        +			outerWidth: element.outerWidth() * x
        +		};
        +
        +	},
        +
        +	clipToBox: function( animation ) {
        +		return {
        +			width: animation.clip.right - animation.clip.left,
        +			height: animation.clip.bottom - animation.clip.top,
        +			left: animation.clip.left,
        +			top: animation.clip.top
        +		};
        +	},
        +
        +	// Injects recently queued functions to be first in line (after "inprogress")
        +	unshift: function( element, queueLength, count ) {
        +		var queue = element.queue();
        +
        +		if ( queueLength > 1 ) {
        +			queue.splice.apply( queue,
        +				[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
        +		}
        +		element.dequeue();
        +	},
        +
        +	saveStyle: function( element ) {
        +		element.data( dataSpaceStyle, element[ 0 ].style.cssText );
        +	},
        +
        +	restoreStyle: function( element ) {
        +		element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
        +		element.removeData( dataSpaceStyle );
        +	},
        +
        +	mode: function( element, mode ) {
        +		var hidden = element.is( ":hidden" );
        +
        +		if ( mode === "toggle" ) {
        +			mode = hidden ? "show" : "hide";
        +		}
        +		if ( hidden ? mode === "hide" : mode === "show" ) {
        +			mode = "none";
        +		}
        +		return mode;
        +	},
        +
        +	// Translates a [top,left] array into a baseline value
        +	getBaseline: function( origin, original ) {
        +		var y, x;
        +
        +		switch ( origin[ 0 ] ) {
        +		case "top":
        +			y = 0;
        +			break;
        +		case "middle":
        +			y = 0.5;
        +			break;
        +		case "bottom":
        +			y = 1;
        +			break;
        +		default:
        +			y = origin[ 0 ] / original.height;
        +		}
        +
        +		switch ( origin[ 1 ] ) {
        +		case "left":
        +			x = 0;
        +			break;
        +		case "center":
        +			x = 0.5;
        +			break;
        +		case "right":
        +			x = 1;
        +			break;
        +		default:
        +			x = origin[ 1 ] / original.width;
        +		}
        +
        +		return {
        +			x: x,
        +			y: y
        +		};
        +	},
        +
        +	// Creates a placeholder element so that the original element can be made absolute
        +	createPlaceholder: function( element ) {
        +		var placeholder,
        +			cssPosition = element.css( "position" ),
        +			position = element.position();
        +
        +		// Lock in margins first to account for form elements, which
        +		// will change margin if you explicitly set height
        +		// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
        +		// Support: Safari
        +		element.css( {
        +			marginTop: element.css( "marginTop" ),
        +			marginBottom: element.css( "marginBottom" ),
        +			marginLeft: element.css( "marginLeft" ),
        +			marginRight: element.css( "marginRight" )
        +		} )
        +		.outerWidth( element.outerWidth() )
        +		.outerHeight( element.outerHeight() );
        +
        +		if ( /^(static|relative)/.test( cssPosition ) ) {
        +			cssPosition = "absolute";
        +
        +			placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
        +
        +				// Convert inline to inline block to account for inline elements
        +				// that turn to inline block based on content (like img)
        +				display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
        +					"inline-block" :
        +					"block",
        +				visibility: "hidden",
        +
        +				// Margins need to be set to account for margin collapse
        +				marginTop: element.css( "marginTop" ),
        +				marginBottom: element.css( "marginBottom" ),
        +				marginLeft: element.css( "marginLeft" ),
        +				marginRight: element.css( "marginRight" ),
        +				"float": element.css( "float" )
        +			} )
        +			.outerWidth( element.outerWidth() )
        +			.outerHeight( element.outerHeight() )
        +			.addClass( "ui-effects-placeholder" );
        +
        +			element.data( dataSpace + "placeholder", placeholder );
        +		}
        +
        +		element.css( {
        +			position: cssPosition,
        +			left: position.left,
        +			top: position.top
        +		} );
        +
        +		return placeholder;
        +	},
        +
        +	removePlaceholder: function( element ) {
        +		var dataKey = dataSpace + "placeholder",
        +				placeholder = element.data( dataKey );
        +
        +		if ( placeholder ) {
        +			placeholder.remove();
        +			element.removeData( dataKey );
        +		}
        +	},
        +
        +	// Removes a placeholder if it exists and restores
        +	// properties that were modified during placeholder creation
        +	cleanUp: function( element ) {
        +		$.effects.restoreStyle( element );
        +		$.effects.removePlaceholder( element );
        +	},
        +
        +	setTransition: function( element, list, factor, value ) {
        +		value = value || {};
        +		$.each( list, function( i, x ) {
        +			var unit = element.cssUnit( x );
        +			if ( unit[ 0 ] > 0 ) {
        +				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
        +			}
        +		} );
        +		return value;
        +	}
        +} );
        +
        +// Return an effect options object for the given parameters:
        +function _normalizeArguments( effect, options, speed, callback ) {
        +
        +	// Allow passing all options as the first parameter
        +	if ( $.isPlainObject( effect ) ) {
        +		options = effect;
        +		effect = effect.effect;
        +	}
        +
        +	// Convert to an object
        +	effect = { effect: effect };
        +
        +	// Catch (effect, null, ...)
        +	if ( options == null ) {
        +		options = {};
        +	}
        +
        +	// Catch (effect, callback)
        +	if ( $.isFunction( options ) ) {
        +		callback = options;
        +		speed = null;
        +		options = {};
        +	}
        +
        +	// Catch (effect, speed, ?)
        +	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
        +		callback = speed;
        +		speed = options;
        +		options = {};
        +	}
        +
        +	// Catch (effect, options, callback)
        +	if ( $.isFunction( speed ) ) {
        +		callback = speed;
        +		speed = null;
        +	}
        +
        +	// Add options to effect
        +	if ( options ) {
        +		$.extend( effect, options );
        +	}
        +
        +	speed = speed || options.duration;
        +	effect.duration = $.fx.off ? 0 :
        +		typeof speed === "number" ? speed :
        +		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
        +		$.fx.speeds._default;
        +
        +	effect.complete = callback || options.complete;
        +
        +	return effect;
        +}
        +
        +function standardAnimationOption( option ) {
        +
        +	// Valid standard speeds (nothing, number, named speed)
        +	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
        +		return true;
        +	}
        +
        +	// Invalid strings - treat as "normal" speed
        +	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
        +		return true;
        +	}
        +
        +	// Complete callback
        +	if ( $.isFunction( option ) ) {
        +		return true;
        +	}
        +
        +	// Options hash (but not naming an effect)
        +	if ( typeof option === "object" && !option.effect ) {
        +		return true;
        +	}
        +
        +	// Didn't match any standard API
        +	return false;
        +}
        +
        +$.fn.extend( {
        +	effect: function( /* effect, options, speed, callback */ ) {
        +		var args = _normalizeArguments.apply( this, arguments ),
        +			effectMethod = $.effects.effect[ args.effect ],
        +			defaultMode = effectMethod.mode,
        +			queue = args.queue,
        +			queueName = queue || "fx",
        +			complete = args.complete,
        +			mode = args.mode,
        +			modes = [],
        +			prefilter = function( next ) {
        +				var el = $( this ),
        +					normalizedMode = $.effects.mode( el, mode ) || defaultMode;
        +
        +				// Sentinel for duck-punching the :animated psuedo-selector
        +				el.data( dataSpaceAnimated, true );
        +
        +				// Save effect mode for later use,
        +				// we can't just call $.effects.mode again later,
        +				// as the .show() below destroys the initial state
        +				modes.push( normalizedMode );
        +
        +				// See $.uiBackCompat inside of run() for removal of defaultMode in 1.13
        +				if ( defaultMode && ( normalizedMode === "show" ||
        +						( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
        +					el.show();
        +				}
        +
        +				if ( !defaultMode || normalizedMode !== "none" ) {
        +					$.effects.saveStyle( el );
        +				}
        +
        +				if ( $.isFunction( next ) ) {
        +					next();
        +				}
        +			};
        +
        +		if ( $.fx.off || !effectMethod ) {
        +
        +			// Delegate to the original method (e.g., .show()) if possible
        +			if ( mode ) {
        +				return this[ mode ]( args.duration, complete );
        +			} else {
        +				return this.each( function() {
        +					if ( complete ) {
        +						complete.call( this );
        +					}
        +				} );
        +			}
        +		}
        +
        +		function run( next ) {
        +			var elem = $( this );
        +
        +			function cleanup() {
        +				elem.removeData( dataSpaceAnimated );
        +
        +				$.effects.cleanUp( elem );
        +
        +				if ( args.mode === "hide" ) {
        +					elem.hide();
        +				}
        +
        +				done();
        +			}
        +
        +			function done() {
        +				if ( $.isFunction( complete ) ) {
        +					complete.call( elem[ 0 ] );
        +				}
        +
        +				if ( $.isFunction( next ) ) {
        +					next();
        +				}
        +			}
        +
        +			// Override mode option on a per element basis,
        +			// as toggle can be either show or hide depending on element state
        +			args.mode = modes.shift();
        +
        +			if ( $.uiBackCompat !== false && !defaultMode ) {
        +				if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
        +
        +					// Call the core method to track "olddisplay" properly
        +					elem[ mode ]();
        +					done();
        +				} else {
        +					effectMethod.call( elem[ 0 ], args, done );
        +				}
        +			} else {
        +				if ( args.mode === "none" ) {
        +
        +					// Call the core method to track "olddisplay" properly
        +					elem[ mode ]();
        +					done();
        +				} else {
        +					effectMethod.call( elem[ 0 ], args, cleanup );
        +				}
        +			}
        +		}
        +
        +		// Run prefilter on all elements first to ensure that
        +		// any showing or hiding happens before placeholder creation,
        +		// which ensures that any layout changes are correctly captured.
        +		return queue === false ?
        +			this.each( prefilter ).each( run ) :
        +			this.queue( queueName, prefilter ).queue( queueName, run );
        +	},
        +
        +	show: ( function( orig ) {
        +		return function( option ) {
        +			if ( standardAnimationOption( option ) ) {
        +				return orig.apply( this, arguments );
        +			} else {
        +				var args = _normalizeArguments.apply( this, arguments );
        +				args.mode = "show";
        +				return this.effect.call( this, args );
        +			}
        +		};
        +	} )( $.fn.show ),
        +
        +	hide: ( function( orig ) {
        +		return function( option ) {
        +			if ( standardAnimationOption( option ) ) {
        +				return orig.apply( this, arguments );
        +			} else {
        +				var args = _normalizeArguments.apply( this, arguments );
        +				args.mode = "hide";
        +				return this.effect.call( this, args );
        +			}
        +		};
        +	} )( $.fn.hide ),
        +
        +	toggle: ( function( orig ) {
        +		return function( option ) {
        +			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
        +				return orig.apply( this, arguments );
        +			} else {
        +				var args = _normalizeArguments.apply( this, arguments );
        +				args.mode = "toggle";
        +				return this.effect.call( this, args );
        +			}
        +		};
        +	} )( $.fn.toggle ),
        +
        +	cssUnit: function( key ) {
        +		var style = this.css( key ),
        +			val = [];
        +
        +		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
        +			if ( style.indexOf( unit ) > 0 ) {
        +				val = [ parseFloat( style ), unit ];
        +			}
        +		} );
        +		return val;
        +	},
        +
        +	cssClip: function( clipObj ) {
        +		if ( clipObj ) {
        +			return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
        +				clipObj.bottom + "px " + clipObj.left + "px)" );
        +		}
        +		return parseClip( this.css( "clip" ), this );
        +	},
        +
        +	transfer: function( options, done ) {
        +		var element = $( this ),
        +			target = $( options.to ),
        +			targetFixed = target.css( "position" ) === "fixed",
        +			body = $( "body" ),
        +			fixTop = targetFixed ? body.scrollTop() : 0,
        +			fixLeft = targetFixed ? body.scrollLeft() : 0,
        +			endPosition = target.offset(),
        +			animation = {
        +				top: endPosition.top - fixTop,
        +				left: endPosition.left - fixLeft,
        +				height: target.innerHeight(),
        +				width: target.innerWidth()
        +			},
        +			startPosition = element.offset(),
        +			transfer = $( "<div class='ui-effects-transfer'></div>" )
        +				.appendTo( "body" )
        +				.addClass( options.className )
        +				.css( {
        +					top: startPosition.top - fixTop,
        +					left: startPosition.left - fixLeft,
        +					height: element.innerHeight(),
        +					width: element.innerWidth(),
        +					position: targetFixed ? "fixed" : "absolute"
        +				} )
        +				.animate( animation, options.duration, options.easing, function() {
        +					transfer.remove();
        +					if ( $.isFunction( done ) ) {
        +						done();
        +					}
        +				} );
        +	}
        +} );
        +
        +function parseClip( str, element ) {
        +		var outerWidth = element.outerWidth(),
        +			outerHeight = element.outerHeight(),
        +			clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
        +			values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
        +
        +		return {
        +			top: parseFloat( values[ 1 ] ) || 0,
        +			right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
        +			bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
        +			left: parseFloat( values[ 4 ] ) || 0
        +		};
        +}
        +
        +$.fx.step.clip = function( fx ) {
        +	if ( !fx.clipInit ) {
        +		fx.start = $( fx.elem ).cssClip();
        +		if ( typeof fx.end === "string" ) {
        +			fx.end = parseClip( fx.end, fx.elem );
        +		}
        +		fx.clipInit = true;
        +	}
        +
        +	$( fx.elem ).cssClip( {
        +		top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
        +		right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
        +		bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
        +		left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
        +	} );
        +};
        +
        +} )();
        +
        +/******************************************************************************/
        +/*********************************** EASING ***********************************/
        +/******************************************************************************/
        +
        +( function() {
        +
        +// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
        +
        +var baseEasings = {};
        +
        +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
        +	baseEasings[ name ] = function( p ) {
        +		return Math.pow( p, i + 2 );
        +	};
        +} );
        +
        +$.extend( baseEasings, {
        +	Sine: function( p ) {
        +		return 1 - Math.cos( p * Math.PI / 2 );
        +	},
        +	Circ: function( p ) {
        +		return 1 - Math.sqrt( 1 - p * p );
        +	},
        +	Elastic: function( p ) {
        +		return p === 0 || p === 1 ? p :
        +			-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
        +	},
        +	Back: function( p ) {
        +		return p * p * ( 3 * p - 2 );
        +	},
        +	Bounce: function( p ) {
        +		var pow2,
        +			bounce = 4;
        +
        +		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
        +		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
        +	}
        +} );
        +
        +$.each( baseEasings, function( name, easeIn ) {
        +	$.easing[ "easeIn" + name ] = easeIn;
        +	$.easing[ "easeOut" + name ] = function( p ) {
        +		return 1 - easeIn( 1 - p );
        +	};
        +	$.easing[ "easeInOut" + name ] = function( p ) {
        +		return p < 0.5 ?
        +			easeIn( p * 2 ) / 2 :
        +			1 - easeIn( p * -2 + 2 ) / 2;
        +	};
        +} );
        +
        +} )();
        +
        +return $.effects;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-blind.js b/bower_components/jquery-ui/ui/effects/effect-blind.js
        new file mode 100644
        index 0000000000..1ec267441a
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-blind.js
        @@ -0,0 +1,70 @@
        +/*!
        + * jQuery UI Effects Blind 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Blind Effect
        +//>>group: Effects
        +//>>description: Blinds the element.
        +//>>docs: http://api.jqueryui.com/blind-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "blind", "hide", function( options, done ) {
        +	var map = {
        +			up: [ "bottom", "top" ],
        +			vertical: [ "bottom", "top" ],
        +			down: [ "top", "bottom" ],
        +			left: [ "right", "left" ],
        +			horizontal: [ "right", "left" ],
        +			right: [ "left", "right" ]
        +		},
        +		element = $( this ),
        +		direction = options.direction || "up",
        +		start = element.cssClip(),
        +		animate = { clip: $.extend( {}, start ) },
        +		placeholder = $.effects.createPlaceholder( element );
        +
        +	animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
        +
        +	if ( options.mode === "show" ) {
        +		element.cssClip( animate.clip );
        +		if ( placeholder ) {
        +			placeholder.css( $.effects.clipToBox( animate ) );
        +		}
        +
        +		animate.clip = start;
        +	}
        +
        +	if ( placeholder ) {
        +		placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
        +	}
        +
        +	element.animate( animate, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-bounce.js b/bower_components/jquery-ui/ui/effects/effect-bounce.js
        new file mode 100644
        index 0000000000..1a6304906e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-bounce.js
        @@ -0,0 +1,110 @@
        +/*!
        + * jQuery UI Effects Bounce 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Bounce Effect
        +//>>group: Effects
        +//>>description: Bounces an element horizontally or vertically n times.
        +//>>docs: http://api.jqueryui.com/bounce-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "bounce", function( options, done ) {
        +	var upAnim, downAnim, refValue,
        +		element = $( this ),
        +
        +		// Defaults:
        +		mode = options.mode,
        +		hide = mode === "hide",
        +		show = mode === "show",
        +		direction = options.direction || "up",
        +		distance = options.distance,
        +		times = options.times || 5,
        +
        +		// Number of internal animations
        +		anims = times * 2 + ( show || hide ? 1 : 0 ),
        +		speed = options.duration / anims,
        +		easing = options.easing,
        +
        +		// Utility:
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		motion = ( direction === "up" || direction === "left" ),
        +		i = 0,
        +
        +		queuelen = element.queue().length;
        +
        +	$.effects.createPlaceholder( element );
        +
        +	refValue = element.css( ref );
        +
        +	// Default distance for the BIGGEST bounce is the outer Distance / 3
        +	if ( !distance ) {
        +		distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
        +	}
        +
        +	if ( show ) {
        +		downAnim = { opacity: 1 };
        +		downAnim[ ref ] = refValue;
        +
        +		// If we are showing, force opacity 0 and set the initial position
        +		// then do the "first" animation
        +		element
        +			.css( "opacity", 0 )
        +			.css( ref, motion ? -distance * 2 : distance * 2 )
        +			.animate( downAnim, speed, easing );
        +	}
        +
        +	// Start at the smallest distance if we are hiding
        +	if ( hide ) {
        +		distance = distance / Math.pow( 2, times - 1 );
        +	}
        +
        +	downAnim = {};
        +	downAnim[ ref ] = refValue;
        +
        +	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
        +	for ( ; i < times; i++ ) {
        +		upAnim = {};
        +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        +
        +		element
        +			.animate( upAnim, speed, easing )
        +			.animate( downAnim, speed, easing );
        +
        +		distance = hide ? distance * 2 : distance / 2;
        +	}
        +
        +	// Last Bounce when Hiding
        +	if ( hide ) {
        +		upAnim = { opacity: 0 };
        +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        +
        +		element.animate( upAnim, speed, easing );
        +	}
        +
        +	element.queue( done );
        +
        +	$.effects.unshift( element, queuelen, anims + 1 );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-clip.js b/bower_components/jquery-ui/ui/effects/effect-clip.js
        new file mode 100644
        index 0000000000..5609fc8617
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-clip.js
        @@ -0,0 +1,65 @@
        +/*!
        + * jQuery UI Effects Clip 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Clip Effect
        +//>>group: Effects
        +//>>description: Clips the element on and off like an old TV.
        +//>>docs: http://api.jqueryui.com/clip-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "clip", "hide", function( options, done ) {
        +	var start,
        +		animate = {},
        +		element = $( this ),
        +		direction = options.direction || "vertical",
        +		both = direction === "both",
        +		horizontal = both || direction === "horizontal",
        +		vertical = both || direction === "vertical";
        +
        +	start = element.cssClip();
        +	animate.clip = {
        +		top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
        +		right: horizontal ? ( start.right - start.left ) / 2 : start.right,
        +		bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
        +		left: horizontal ? ( start.right - start.left ) / 2 : start.left
        +	};
        +
        +	$.effects.createPlaceholder( element );
        +
        +	if ( options.mode === "show" ) {
        +		element.cssClip( animate.clip );
        +		animate.clip = start;
        +	}
        +
        +	element.animate( animate, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-drop.js b/bower_components/jquery-ui/ui/effects/effect-drop.js
        new file mode 100644
        index 0000000000..428d49bd8c
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-drop.js
        @@ -0,0 +1,69 @@
        +/*!
        + * jQuery UI Effects Drop 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Drop Effect
        +//>>group: Effects
        +//>>description: Moves an element in one direction and hides it at the same time.
        +//>>docs: http://api.jqueryui.com/drop-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "drop", "hide", function( options, done ) {
        +
        +	var distance,
        +		element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +		direction = options.direction || "left",
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
        +		oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
        +		animation = {
        +			opacity: 0
        +		};
        +
        +	$.effects.createPlaceholder( element );
        +
        +	distance = options.distance ||
        +		element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
        +
        +	animation[ ref ] = motion + distance;
        +
        +	if ( show ) {
        +		element.css( animation );
        +
        +		animation[ ref ] = oppositeMotion + distance;
        +		animation.opacity = 1;
        +	}
        +
        +	// Animate
        +	element.animate( animation, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-explode.js b/bower_components/jquery-ui/ui/effects/effect-explode.js
        new file mode 100644
        index 0000000000..18f892fc42
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-explode.js
        @@ -0,0 +1,111 @@
        +/*!
        + * jQuery UI Effects Explode 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Explode Effect
        +//>>group: Effects
        +// jscs:disable maximumLineLength
        +//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/explode-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "explode", "hide", function( options, done ) {
        +
        +	var i, j, left, top, mx, my,
        +		rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
        +		cells = rows,
        +		element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +
        +		// Show and then visibility:hidden the element before calculating offset
        +		offset = element.show().css( "visibility", "hidden" ).offset(),
        +
        +		// Width and height of a piece
        +		width = Math.ceil( element.outerWidth() / cells ),
        +		height = Math.ceil( element.outerHeight() / rows ),
        +		pieces = [];
        +
        +	// Children animate complete:
        +	function childComplete() {
        +		pieces.push( this );
        +		if ( pieces.length === rows * cells ) {
        +			animComplete();
        +		}
        +	}
        +
        +	// Clone the element for each row and cell.
        +	for ( i = 0; i < rows; i++ ) { // ===>
        +		top = offset.top + i * height;
        +		my = i - ( rows - 1 ) / 2;
        +
        +		for ( j = 0; j < cells; j++ ) { // |||
        +			left = offset.left + j * width;
        +			mx = j - ( cells - 1 ) / 2;
        +
        +			// Create a clone of the now hidden main element that will be absolute positioned
        +			// within a wrapper div off the -left and -top equal to size of our pieces
        +			element
        +				.clone()
        +				.appendTo( "body" )
        +				.wrap( "<div></div>" )
        +				.css( {
        +					position: "absolute",
        +					visibility: "visible",
        +					left: -j * width,
        +					top: -i * height
        +				} )
        +
        +				// Select the wrapper - make it overflow: hidden and absolute positioned based on
        +				// where the original was located +left and +top equal to the size of pieces
        +				.parent()
        +					.addClass( "ui-effects-explode" )
        +					.css( {
        +						position: "absolute",
        +						overflow: "hidden",
        +						width: width,
        +						height: height,
        +						left: left + ( show ? mx * width : 0 ),
        +						top: top + ( show ? my * height : 0 ),
        +						opacity: show ? 0 : 1
        +					} )
        +					.animate( {
        +						left: left + ( show ? 0 : mx * width ),
        +						top: top + ( show ? 0 : my * height ),
        +						opacity: show ? 1 : 0
        +					}, options.duration || 500, options.easing, childComplete );
        +		}
        +	}
        +
        +	function animComplete() {
        +		element.css( {
        +			visibility: "visible"
        +		} );
        +		$( pieces ).remove();
        +		done();
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-fade.js b/bower_components/jquery-ui/ui/effects/effect-fade.js
        new file mode 100644
        index 0000000000..9bc29f7a64
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-fade.js
        @@ -0,0 +1,47 @@
        +/*!
        + * jQuery UI Effects Fade 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Fade Effect
        +//>>group: Effects
        +//>>description: Fades the element.
        +//>>docs: http://api.jqueryui.com/fade-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "fade", "toggle", function( options, done ) {
        +	var show = options.mode === "show";
        +
        +	$( this )
        +		.css( "opacity", show ? 0 : 1 )
        +		.animate( {
        +			opacity: show ? 1 : 0
        +		}, {
        +			queue: false,
        +			duration: options.duration,
        +			easing: options.easing,
        +			complete: done
        +		} );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-fold.js b/bower_components/jquery-ui/ui/effects/effect-fold.js
        new file mode 100644
        index 0000000000..ccfd67a558
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-fold.js
        @@ -0,0 +1,89 @@
        +/*!
        + * jQuery UI Effects Fold 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Fold Effect
        +//>>group: Effects
        +//>>description: Folds an element first horizontally and then vertically.
        +//>>docs: http://api.jqueryui.com/fold-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "fold", "hide", function( options, done ) {
        +
        +	// Create element
        +	var element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +		hide = mode === "hide",
        +		size = options.size || 15,
        +		percent = /([0-9]+)%/.exec( size ),
        +		horizFirst = !!options.horizFirst,
        +		ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
        +		duration = options.duration / 2,
        +
        +		placeholder = $.effects.createPlaceholder( element ),
        +
        +		start = element.cssClip(),
        +		animation1 = { clip: $.extend( {}, start ) },
        +		animation2 = { clip: $.extend( {}, start ) },
        +
        +		distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
        +
        +		queuelen = element.queue().length;
        +
        +	if ( percent ) {
        +		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
        +	}
        +	animation1.clip[ ref[ 0 ] ] = size;
        +	animation2.clip[ ref[ 0 ] ] = size;
        +	animation2.clip[ ref[ 1 ] ] = 0;
        +
        +	if ( show ) {
        +		element.cssClip( animation2.clip );
        +		if ( placeholder ) {
        +			placeholder.css( $.effects.clipToBox( animation2 ) );
        +		}
        +
        +		animation2.clip = start;
        +	}
        +
        +	// Animate
        +	element
        +		.queue( function( next ) {
        +			if ( placeholder ) {
        +				placeholder
        +					.animate( $.effects.clipToBox( animation1 ), duration, options.easing )
        +					.animate( $.effects.clipToBox( animation2 ), duration, options.easing );
        +			}
        +
        +			next();
        +		} )
        +		.animate( animation1, duration, options.easing )
        +		.animate( animation2, duration, options.easing )
        +		.queue( done );
        +
        +	$.effects.unshift( element, queuelen, 4 );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-highlight.js b/bower_components/jquery-ui/ui/effects/effect-highlight.js
        new file mode 100644
        index 0000000000..546e471466
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-highlight.js
        @@ -0,0 +1,57 @@
        +/*!
        + * jQuery UI Effects Highlight 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Highlight Effect
        +//>>group: Effects
        +//>>description: Highlights the background of an element in a defined color for a custom duration.
        +//>>docs: http://api.jqueryui.com/highlight-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "highlight", "show", function( options, done ) {
        +	var element = $( this ),
        +		animation = {
        +			backgroundColor: element.css( "backgroundColor" )
        +		};
        +
        +	if ( options.mode === "hide" ) {
        +		animation.opacity = 0;
        +	}
        +
        +	$.effects.saveStyle( element );
        +
        +	element
        +		.css( {
        +			backgroundImage: "none",
        +			backgroundColor: options.color || "#ffff99"
        +		} )
        +		.animate( animation, {
        +			queue: false,
        +			duration: options.duration,
        +			easing: options.easing,
        +			complete: done
        +		} );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-puff.js b/bower_components/jquery-ui/ui/effects/effect-puff.js
        new file mode 100644
        index 0000000000..f5e0910cfd
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-puff.js
        @@ -0,0 +1,42 @@
        +/*!
        + * jQuery UI Effects Puff 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Puff Effect
        +//>>group: Effects
        +//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
        +//>>docs: http://api.jqueryui.com/puff-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect",
        +			"./effect-scale"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "puff", "hide", function( options, done ) {
        +	var newOptions = $.extend( true, {}, options, {
        +		fade: true,
        +		percent: parseInt( options.percent, 10 ) || 150
        +	} );
        +
        +	$.effects.effect.scale.call( this, newOptions, done );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-pulsate.js b/bower_components/jquery-ui/ui/effects/effect-pulsate.js
        new file mode 100644
        index 0000000000..8d6826f9f0
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-pulsate.js
        @@ -0,0 +1,64 @@
        +/*!
        + * jQuery UI Effects Pulsate 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Pulsate Effect
        +//>>group: Effects
        +//>>description: Pulsates an element n times by changing the opacity to zero and back.
        +//>>docs: http://api.jqueryui.com/pulsate-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "pulsate", "show", function( options, done ) {
        +	var element = $( this ),
        +		mode = options.mode,
        +		show = mode === "show",
        +		hide = mode === "hide",
        +		showhide = show || hide,
        +
        +		// Showing or hiding leaves off the "last" animation
        +		anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
        +		duration = options.duration / anims,
        +		animateTo = 0,
        +		i = 1,
        +		queuelen = element.queue().length;
        +
        +	if ( show || !element.is( ":visible" ) ) {
        +		element.css( "opacity", 0 ).show();
        +		animateTo = 1;
        +	}
        +
        +	// Anims - 1 opacity "toggles"
        +	for ( ; i < anims; i++ ) {
        +		element.animate( { opacity: animateTo }, duration, options.easing );
        +		animateTo = 1 - animateTo;
        +	}
        +
        +	element.animate( { opacity: animateTo }, duration, options.easing );
        +
        +	element.queue( done );
        +
        +	$.effects.unshift( element, queuelen, anims + 1 );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-scale.js b/bower_components/jquery-ui/ui/effects/effect-scale.js
        new file mode 100644
        index 0000000000..477d8c8ba1
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-scale.js
        @@ -0,0 +1,56 @@
        +/*!
        + * jQuery UI Effects Scale 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Scale Effect
        +//>>group: Effects
        +//>>description: Grows or shrinks an element and its content.
        +//>>docs: http://api.jqueryui.com/scale-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect",
        +			"./effect-size"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "scale", function( options, done ) {
        +
        +	// Create element
        +	var el = $( this ),
        +		mode = options.mode,
        +		percent = parseInt( options.percent, 10 ) ||
        +			( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
        +
        +		newOptions = $.extend( true, {
        +			from: $.effects.scaledDimensions( el ),
        +			to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
        +			origin: options.origin || [ "middle", "center" ]
        +		}, options );
        +
        +	// Fade option to support puff
        +	if ( options.fade ) {
        +		newOptions.from.opacity = 1;
        +		newOptions.to.opacity = 0;
        +	}
        +
        +	$.effects.effect.size.call( this, newOptions, done );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-shake.js b/bower_components/jquery-ui/ui/effects/effect-shake.js
        new file mode 100644
        index 0000000000..37c0089bae
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-shake.js
        @@ -0,0 +1,74 @@
        +/*!
        + * jQuery UI Effects Shake 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Shake Effect
        +//>>group: Effects
        +//>>description: Shakes an element horizontally or vertically n times.
        +//>>docs: http://api.jqueryui.com/shake-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "shake", function( options, done ) {
        +
        +	var i = 1,
        +		element = $( this ),
        +		direction = options.direction || "left",
        +		distance = options.distance || 20,
        +		times = options.times || 3,
        +		anims = times * 2 + 1,
        +		speed = Math.round( options.duration / anims ),
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		positiveMotion = ( direction === "up" || direction === "left" ),
        +		animation = {},
        +		animation1 = {},
        +		animation2 = {},
        +
        +		queuelen = element.queue().length;
        +
        +	$.effects.createPlaceholder( element );
        +
        +	// Animation
        +	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
        +	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
        +	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
        +
        +	// Animate
        +	element.animate( animation, speed, options.easing );
        +
        +	// Shakes
        +	for ( ; i < times; i++ ) {
        +		element
        +			.animate( animation1, speed, options.easing )
        +			.animate( animation2, speed, options.easing );
        +	}
        +
        +	element
        +		.animate( animation1, speed, options.easing )
        +		.animate( animation, speed / 2, options.easing )
        +		.queue( done );
        +
        +	$.effects.unshift( element, queuelen, anims + 1 );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-size.js b/bower_components/jquery-ui/ui/effects/effect-size.js
        new file mode 100644
        index 0000000000..5cb26016d8
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-size.js
        @@ -0,0 +1,191 @@
        +/*!
        + * jQuery UI Effects Size 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Size Effect
        +//>>group: Effects
        +//>>description: Resize an element to a specified width and height.
        +//>>docs: http://api.jqueryui.com/size-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "size", function( options, done ) {
        +
        +	// Create element
        +	var baseline, factor, temp,
        +		element = $( this ),
        +
        +		// Copy for children
        +		cProps = [ "fontSize" ],
        +		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
        +		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
        +
        +		// Set options
        +		mode = options.mode,
        +		restore = mode !== "effect",
        +		scale = options.scale || "both",
        +		origin = options.origin || [ "middle", "center" ],
        +		position = element.css( "position" ),
        +		pos = element.position(),
        +		original = $.effects.scaledDimensions( element ),
        +		from = options.from || original,
        +		to = options.to || $.effects.scaledDimensions( element, 0 );
        +
        +	$.effects.createPlaceholder( element );
        +
        +	if ( mode === "show" ) {
        +		temp = from;
        +		from = to;
        +		to = temp;
        +	}
        +
        +	// Set scaling factor
        +	factor = {
        +		from: {
        +			y: from.height / original.height,
        +			x: from.width / original.width
        +		},
        +		to: {
        +			y: to.height / original.height,
        +			x: to.width / original.width
        +		}
        +	};
        +
        +	// Scale the css box
        +	if ( scale === "box" || scale === "both" ) {
        +
        +		// Vertical props scaling
        +		if ( factor.from.y !== factor.to.y ) {
        +			from = $.effects.setTransition( element, vProps, factor.from.y, from );
        +			to = $.effects.setTransition( element, vProps, factor.to.y, to );
        +		}
        +
        +		// Horizontal props scaling
        +		if ( factor.from.x !== factor.to.x ) {
        +			from = $.effects.setTransition( element, hProps, factor.from.x, from );
        +			to = $.effects.setTransition( element, hProps, factor.to.x, to );
        +		}
        +	}
        +
        +	// Scale the content
        +	if ( scale === "content" || scale === "both" ) {
        +
        +		// Vertical props scaling
        +		if ( factor.from.y !== factor.to.y ) {
        +			from = $.effects.setTransition( element, cProps, factor.from.y, from );
        +			to = $.effects.setTransition( element, cProps, factor.to.y, to );
        +		}
        +	}
        +
        +	// Adjust the position properties based on the provided origin points
        +	if ( origin ) {
        +		baseline = $.effects.getBaseline( origin, original );
        +		from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
        +		from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
        +		to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
        +		to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
        +	}
        +	element.css( from );
        +
        +	// Animate the children if desired
        +	if ( scale === "content" || scale === "both" ) {
        +
        +		vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
        +		hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
        +
        +		// Only animate children with width attributes specified
        +		// TODO: is this right? should we include anything with css width specified as well
        +		element.find( "*[width]" ).each( function() {
        +			var child = $( this ),
        +				childOriginal = $.effects.scaledDimensions( child ),
        +				childFrom = {
        +					height: childOriginal.height * factor.from.y,
        +					width: childOriginal.width * factor.from.x,
        +					outerHeight: childOriginal.outerHeight * factor.from.y,
        +					outerWidth: childOriginal.outerWidth * factor.from.x
        +				},
        +				childTo = {
        +					height: childOriginal.height * factor.to.y,
        +					width: childOriginal.width * factor.to.x,
        +					outerHeight: childOriginal.height * factor.to.y,
        +					outerWidth: childOriginal.width * factor.to.x
        +				};
        +
        +			// Vertical props scaling
        +			if ( factor.from.y !== factor.to.y ) {
        +				childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
        +				childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
        +			}
        +
        +			// Horizontal props scaling
        +			if ( factor.from.x !== factor.to.x ) {
        +				childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
        +				childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
        +			}
        +
        +			if ( restore ) {
        +				$.effects.saveStyle( child );
        +			}
        +
        +			// Animate children
        +			child.css( childFrom );
        +			child.animate( childTo, options.duration, options.easing, function() {
        +
        +				// Restore children
        +				if ( restore ) {
        +					$.effects.restoreStyle( child );
        +				}
        +			} );
        +		} );
        +	}
        +
        +	// Animate
        +	element.animate( to, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: function() {
        +
        +			var offset = element.offset();
        +
        +			if ( to.opacity === 0 ) {
        +				element.css( "opacity", from.opacity );
        +			}
        +
        +			if ( !restore ) {
        +				element
        +					.css( "position", position === "static" ? "relative" : position )
        +					.offset( offset );
        +
        +				// Need to save style here so that automatic style restoration
        +				// doesn't restore to the original styles from before the animation.
        +				$.effects.saveStyle( element );
        +			}
        +
        +			done();
        +		}
        +	} );
        +
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-slide.js b/bower_components/jquery-ui/ui/effects/effect-slide.js
        new file mode 100644
        index 0000000000..84f2893182
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-slide.js
        @@ -0,0 +1,76 @@
        +/*!
        + * jQuery UI Effects Slide 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Slide Effect
        +//>>group: Effects
        +//>>description: Slides an element in and out of the viewport.
        +//>>docs: http://api.jqueryui.com/slide-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.effects.define( "slide", "show", function( options, done ) {
        +	var startClip, startRef,
        +		element = $( this ),
        +		map = {
        +			up: [ "bottom", "top" ],
        +			down: [ "top", "bottom" ],
        +			left: [ "right", "left" ],
        +			right: [ "left", "right" ]
        +		},
        +		mode = options.mode,
        +		direction = options.direction || "left",
        +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        +		positiveMotion = ( direction === "up" || direction === "left" ),
        +		distance = options.distance ||
        +			element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
        +		animation = {};
        +
        +	$.effects.createPlaceholder( element );
        +
        +	startClip = element.cssClip();
        +	startRef = element.position()[ ref ];
        +
        +	// Define hide animation
        +	animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
        +	animation.clip = element.cssClip();
        +	animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
        +
        +	// Reverse the animation if we're showing
        +	if ( mode === "show" ) {
        +		element.cssClip( animation.clip );
        +		element.css( ref, animation[ ref ] );
        +		animation.clip = startClip;
        +		animation[ ref ] = startRef;
        +	}
        +
        +	// Actually animate
        +	element.animate( animation, {
        +		queue: false,
        +		duration: options.duration,
        +		easing: options.easing,
        +		complete: done
        +	} );
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/effects/effect-transfer.js b/bower_components/jquery-ui/ui/effects/effect-transfer.js
        new file mode 100644
        index 0000000000..dffcdab420
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/effects/effect-transfer.js
        @@ -0,0 +1,40 @@
        +/*!
        + * jQuery UI Effects Transfer 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Transfer Effect
        +//>>group: Effects
        +//>>description: Displays a transfer effect from one element to another.
        +//>>docs: http://api.jqueryui.com/transfer-effect/
        +//>>demos: http://jqueryui.com/effect/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../effect"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +var effect;
        +if ( $.uiBackCompat !== false ) {
        +	effect = $.effects.define( "transfer", function( options, done ) {
        +		$( this ).transfer( options, done );
        +	} );
        +}
        +return effect;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/escape-selector.js b/bower_components/jquery-ui/ui/escape-selector.js
        new file mode 100644
        index 0000000000..d43e4f8166
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/escape-selector.js
        @@ -0,0 +1,21 @@
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +// Internal use only
        +return $.ui.escapeSelector = ( function() {
        +	var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
        +	return function( selector ) {
        +		return selector.replace( selectorEscape, "\\$1" );
        +	};
        +} )();
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/focusable.js b/bower_components/jquery-ui/ui/focusable.js
        new file mode 100644
        index 0000000000..44992890d3
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/focusable.js
        @@ -0,0 +1,84 @@
        +/*!
        + * jQuery UI Focusable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: :focusable Selector
        +//>>group: Core
        +//>>description: Selects elements which can be focused.
        +//>>docs: http://api.jqueryui.com/focusable-selector/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +// Selectors
        +$.ui.focusable = function( element, hasTabindex ) {
        +	var map, mapName, img, focusableIfVisible, fieldset,
        +		nodeName = element.nodeName.toLowerCase();
        +
        +	if ( "area" === nodeName ) {
        +		map = element.parentNode;
        +		mapName = map.name;
        +		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
        +			return false;
        +		}
        +		img = $( "img[usemap='#" + mapName + "']" );
        +		return img.length > 0 && img.is( ":visible" );
        +	}
        +
        +	if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
        +		focusableIfVisible = !element.disabled;
        +
        +		if ( focusableIfVisible ) {
        +
        +			// Form controls within a disabled fieldset are disabled.
        +			// However, controls within the fieldset's legend do not get disabled.
        +			// Since controls generally aren't placed inside legends, we skip
        +			// this portion of the check.
        +			fieldset = $( element ).closest( "fieldset" )[ 0 ];
        +			if ( fieldset ) {
        +				focusableIfVisible = !fieldset.disabled;
        +			}
        +		}
        +	} else if ( "a" === nodeName ) {
        +		focusableIfVisible = element.href || hasTabindex;
        +	} else {
        +		focusableIfVisible = hasTabindex;
        +	}
        +
        +	return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
        +};
        +
        +// Support: IE 8 only
        +// IE 8 doesn't resolve inherit to visible/hidden for computed values
        +function visible( element ) {
        +	var visibility = element.css( "visibility" );
        +	while ( visibility === "inherit" ) {
        +		element = element.parent();
        +		visibility = element.css( "visibility" );
        +	}
        +	return visibility !== "hidden";
        +}
        +
        +$.extend( $.expr[ ":" ], {
        +	focusable: function( element ) {
        +		return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
        +	}
        +} );
        +
        +return $.ui.focusable;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/form-reset-mixin.js b/bower_components/jquery-ui/ui/form-reset-mixin.js
        new file mode 100644
        index 0000000000..74be1d5b9a
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/form-reset-mixin.js
        @@ -0,0 +1,77 @@
        +/*!
        + * jQuery UI Form Reset Mixin 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Form Reset Mixin
        +//>>group: Core
        +//>>description: Refresh input widgets when their form is reset
        +//>>docs: http://api.jqueryui.com/form-reset-mixin/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./form",
        +			"./version"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.ui.formResetMixin = {
        +	_formResetHandler: function() {
        +		var form = $( this );
        +
        +		// Wait for the form reset to actually happen before refreshing
        +		setTimeout( function() {
        +			var instances = form.data( "ui-form-reset-instances" );
        +			$.each( instances, function() {
        +				this.refresh();
        +			} );
        +		} );
        +	},
        +
        +	_bindFormResetHandler: function() {
        +		this.form = this.element.form();
        +		if ( !this.form.length ) {
        +			return;
        +		}
        +
        +		var instances = this.form.data( "ui-form-reset-instances" ) || [];
        +		if ( !instances.length ) {
        +
        +			// We don't use _on() here because we use a single event handler per form
        +			this.form.on( "reset.ui-form-reset", this._formResetHandler );
        +		}
        +		instances.push( this );
        +		this.form.data( "ui-form-reset-instances", instances );
        +	},
        +
        +	_unbindFormResetHandler: function() {
        +		if ( !this.form.length ) {
        +			return;
        +		}
        +
        +		var instances = this.form.data( "ui-form-reset-instances" );
        +		instances.splice( $.inArray( this, instances ), 1 );
        +		if ( instances.length ) {
        +			this.form.data( "ui-form-reset-instances", instances );
        +		} else {
        +			this.form
        +				.removeData( "ui-form-reset-instances" )
        +				.off( "reset.ui-form-reset" );
        +		}
        +	}
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/form.js b/bower_components/jquery-ui/ui/form.js
        new file mode 100644
        index 0000000000..cfb4bd280d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/form.js
        @@ -0,0 +1,20 @@
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +// Support: IE8 Only
        +// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
        +// with a string, so we need to find the proper form.
        +return $.fn.form = function() {
        +	return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-af.js b/bower_components/jquery-ui/ui/i18n/datepicker-af.js
        new file mode 100644
        index 0000000000..c756888846
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-af.js
        @@ -0,0 +1,37 @@
        +/* Afrikaans initialisation for the jQuery UI date picker plugin. */
        +/* Written by Renier Pretorius. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.af = {
        +	closeText: "Selekteer",
        +	prevText: "Vorige",
        +	nextText: "Volgende",
        +	currentText: "Vandag",
        +	monthNames: [ "Januarie","Februarie","Maart","April","Mei","Junie",
        +	"Julie","Augustus","September","Oktober","November","Desember" ],
        +	monthNamesShort: [ "Jan", "Feb", "Mrt", "Apr", "Mei", "Jun",
        +	"Jul", "Aug", "Sep", "Okt", "Nov", "Des" ],
        +	dayNames: [ "Sondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrydag", "Saterdag" ],
        +	dayNamesShort: [ "Son", "Maa", "Din", "Woe", "Don", "Vry", "Sat" ],
        +	dayNamesMin: [ "So","Ma","Di","Wo","Do","Vr","Sa" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.af );
        +
        +return datepicker.regional.af;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ar-DZ.js b/bower_components/jquery-ui/ui/i18n/datepicker-ar-DZ.js
        new file mode 100644
        index 0000000000..a2b1750b66
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ar-DZ.js
        @@ -0,0 +1,39 @@
        +/* Algerian Arabic Translation for jQuery UI date picker plugin.
        +/* Used in most of Maghreb countries, primarily in Algeria, Tunisia, Morocco.
        +/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
        +/* Mohamed Amine HADDAD -- zatamine@gmail.com */
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "ar-DZ" ] = {
        +	closeText: "إغلاق",
        +	prevText: "&#x3C;السابق",
        +	nextText: "التالي&#x3E;",
        +	currentText: "اليوم",
        +	monthNames: [ "جانفي", "فيفري", "مارس", "أفريل", "ماي", "جوان",
        +	"جويلية", "أوت", "سبتمبر","أكتوبر", "نوفمبر", "ديسمبر" ],
        +	monthNamesShort: [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" ],
        +	dayNames: [ "الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت" ],
        +	dayNamesShort: [ "الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت" ],
        +	dayNamesMin: [ "ح", "ن", "ث", "ر", "خ", "ج", "س" ],
        +	weekHeader: "أسبوع",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 6,
        +		isRTL: true,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "ar-DZ" ] );
        +
        +return datepicker.regional[ "ar-DZ" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ar.js b/bower_components/jquery-ui/ui/i18n/datepicker-ar.js
        new file mode 100644
        index 0000000000..95784e88cf
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ar.js
        @@ -0,0 +1,39 @@
        +/* Arabic Translation for jQuery UI date picker plugin. */
        +/* Used in most of Arab countries, primarily in Bahrain, */
        +/* Kuwait, Oman, Qatar, Saudi Arabia and the United Arab Emirates, Egypt, Sudan and Yemen. */
        +/* Written by Mohammed Alshehri -- m@dralshehri.com */
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ar = {
        +	closeText: "إغلاق",
        +	prevText: "&#x3C;السابق",
        +	nextText: "التالي&#x3E;",
        +	currentText: "اليوم",
        +	monthNames: [ "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو",
        +	"يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" ],
        +	monthNamesShort: [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" ],
        +	dayNames: [ "الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت" ],
        +	dayNamesShort: [ "أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت" ],
        +	dayNamesMin: [ "ح", "ن", "ث", "ر", "خ", "ج", "س" ],
        +	weekHeader: "أسبوع",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +		isRTL: true,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ar );
        +
        +return datepicker.regional.ar;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-az.js b/bower_components/jquery-ui/ui/i18n/datepicker-az.js
        new file mode 100644
        index 0000000000..2ebdcfa8b5
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-az.js
        @@ -0,0 +1,37 @@
        +/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Jamil Najafov (necefov33@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.az = {
        +	closeText: "Bağla",
        +	prevText: "&#x3C;Geri",
        +	nextText: "İrəli&#x3E;",
        +	currentText: "Bugün",
        +	monthNames: [ "Yanvar","Fevral","Mart","Aprel","May","İyun",
        +	"İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr" ],
        +	monthNamesShort: [ "Yan","Fev","Mar","Apr","May","İyun",
        +	"İyul","Avq","Sen","Okt","Noy","Dek" ],
        +	dayNames: [ "Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə" ],
        +	dayNamesShort: [ "B","Be","Ça","Ç","Ca","C","Ş" ],
        +	dayNamesMin: [ "B","B","Ç","С","Ç","C","Ş" ],
        +	weekHeader: "Hf",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.az );
        +
        +return datepicker.regional.az;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-be.js b/bower_components/jquery-ui/ui/i18n/datepicker-be.js
        new file mode 100644
        index 0000000000..7d96dd1da6
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-be.js
        @@ -0,0 +1,37 @@
        +/* Belarusian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Pavel Selitskas <p.selitskas@gmail.com> */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.be = {
        +	closeText: "Зачыніць",
        +	prevText: "&larr;Папяр.",
        +	nextText: "Наст.&rarr;",
        +	currentText: "Сёньня",
        +	monthNames: [ "Студзень","Люты","Сакавік","Красавік","Травень","Чэрвень",
        +	"Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Сьнежань" ],
        +	monthNamesShort: [ "Сту","Лют","Сак","Кра","Тра","Чэр",
        +	"Ліп","Жні","Вер","Кас","Ліс","Сьн" ],
        +	dayNames: [ "нядзеля","панядзелак","аўторак","серада","чацьвер","пятніца","субота" ],
        +	dayNamesShort: [ "ндз","пнд","аўт","срд","чцв","птн","сбт" ],
        +	dayNamesMin: [ "Нд","Пн","Аў","Ср","Чц","Пт","Сб" ],
        +	weekHeader: "Тд",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.be );
        +
        +return datepicker.regional.be;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-bg.js b/bower_components/jquery-ui/ui/i18n/datepicker-bg.js
        new file mode 100644
        index 0000000000..cb066a4c9d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-bg.js
        @@ -0,0 +1,38 @@
        +/* Bulgarian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Stoyan Kyosev (http://svest.org). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.bg = {
        +	closeText: "затвори",
        +	prevText: "&#x3C;назад",
        +	nextText: "напред&#x3E;",
        +	nextBigText: "&#x3E;&#x3E;",
        +	currentText: "днес",
        +	monthNames: [ "Януари","Февруари","Март","Април","Май","Юни",
        +	"Юли","Август","Септември","Октомври","Ноември","Декември" ],
        +	monthNamesShort: [ "Яну","Фев","Мар","Апр","Май","Юни",
        +	"Юли","Авг","Сеп","Окт","Нов","Дек" ],
        +	dayNames: [ "Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота" ],
        +	dayNamesShort: [ "Нед","Пон","Вто","Сря","Чет","Пет","Съб" ],
        +	dayNamesMin: [ "Не","По","Вт","Ср","Че","Пе","Съ" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.bg );
        +
        +return datepicker.regional.bg;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-bs.js b/bower_components/jquery-ui/ui/i18n/datepicker-bs.js
        new file mode 100644
        index 0000000000..b9f2e28691
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-bs.js
        @@ -0,0 +1,37 @@
        +/* Bosnian i18n for the jQuery UI date picker plugin. */
        +/* Written by Kenan Konjo. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.bs = {
        +	closeText: "Zatvori",
        +	prevText: "&#x3C;",
        +	nextText: "&#x3E;",
        +	currentText: "Danas",
        +	monthNames: [ "Januar","Februar","Mart","April","Maj","Juni",
        +	"Juli","August","Septembar","Oktobar","Novembar","Decembar" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
        +	"Jul","Aug","Sep","Okt","Nov","Dec" ],
        +	dayNames: [ "Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota" ],
        +	dayNamesShort: [ "Ned","Pon","Uto","Sri","Čet","Pet","Sub" ],
        +	dayNamesMin: [ "Ne","Po","Ut","Sr","Če","Pe","Su" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.bs );
        +
        +return datepicker.regional.bs;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ca.js b/bower_components/jquery-ui/ui/i18n/datepicker-ca.js
        new file mode 100644
        index 0000000000..9febd90eef
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ca.js
        @@ -0,0 +1,37 @@
        +/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */
        +/* Writers: (joan.leon@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ca = {
        +	closeText: "Tanca",
        +	prevText: "Anterior",
        +	nextText: "Següent",
        +	currentText: "Avui",
        +	monthNames: [ "gener","febrer","març","abril","maig","juny",
        +	"juliol","agost","setembre","octubre","novembre","desembre" ],
        +	monthNamesShort: [ "gen","feb","març","abr","maig","juny",
        +	"jul","ag","set","oct","nov","des" ],
        +	dayNames: [ "diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte" ],
        +	dayNamesShort: [ "dg","dl","dt","dc","dj","dv","ds" ],
        +	dayNamesMin: [ "dg","dl","dt","dc","dj","dv","ds" ],
        +	weekHeader: "Set",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ca );
        +
        +return datepicker.regional.ca;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-cs.js b/bower_components/jquery-ui/ui/i18n/datepicker-cs.js
        new file mode 100644
        index 0000000000..c2f79cf9e4
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-cs.js
        @@ -0,0 +1,37 @@
        +/* Czech initialisation for the jQuery UI date picker plugin. */
        +/* Written by Tomas Muller (tomas@tomas-muller.net). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.cs = {
        +	closeText: "Zavřít",
        +	prevText: "&#x3C;Dříve",
        +	nextText: "Později&#x3E;",
        +	currentText: "Nyní",
        +	monthNames: [ "leden","únor","březen","duben","květen","červen",
        +	"červenec","srpen","září","říjen","listopad","prosinec" ],
        +	monthNamesShort: [ "led","úno","bře","dub","kvě","čer",
        +	"čvc","srp","zář","říj","lis","pro" ],
        +	dayNames: [ "neděle", "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota" ],
        +	dayNamesShort: [ "ne", "po", "út", "st", "čt", "pá", "so" ],
        +	dayNamesMin: [ "ne","po","út","st","čt","pá","so" ],
        +	weekHeader: "Týd",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.cs );
        +
        +return datepicker.regional.cs;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-cy-GB.js b/bower_components/jquery-ui/ui/i18n/datepicker-cy-GB.js
        new file mode 100644
        index 0000000000..14fce914c3
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-cy-GB.js
        @@ -0,0 +1,45 @@
        +/* Welsh/UK initialisation for the jQuery UI date picker plugin. */
        +/* Written by William Griffiths. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "cy-GB" ] = {
        +	closeText: "Done",
        +	prevText: "Prev",
        +	nextText: "Next",
        +	currentText: "Today",
        +	monthNames: [ "Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin",
        +	"Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr" ],
        +	monthNamesShort: [ "Ion", "Chw", "Maw", "Ebr", "Mai", "Meh",
        +	"Gor", "Aws", "Med", "Hyd", "Tac", "Rha" ],
        +	dayNames: [
        +		"Dydd Sul",
        +		"Dydd Llun",
        +		"Dydd Mawrth",
        +		"Dydd Mercher",
        +		"Dydd Iau",
        +		"Dydd Gwener",
        +		"Dydd Sadwrn"
        +	],
        +	dayNamesShort: [ "Sul", "Llu", "Maw", "Mer", "Iau", "Gwe", "Sad" ],
        +	dayNamesMin: [ "Su","Ll","Ma","Me","Ia","Gw","Sa" ],
        +	weekHeader: "Wy",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "cy-GB" ] );
        +
        +return datepicker.regional[ "cy-GB" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-da.js b/bower_components/jquery-ui/ui/i18n/datepicker-da.js
        new file mode 100644
        index 0000000000..273f0e3ff6
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-da.js
        @@ -0,0 +1,37 @@
        +/* Danish initialisation for the jQuery UI date picker plugin. */
        +/* Written by Jan Christensen ( deletestuff@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.da = {
        +	closeText: "Luk",
        +	prevText: "&#x3C;Forrige",
        +	nextText: "Næste&#x3E;",
        +	currentText: "Idag",
        +	monthNames: [ "Januar","Februar","Marts","April","Maj","Juni",
        +	"Juli","August","September","Oktober","November","December" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
        +	"Jul","Aug","Sep","Okt","Nov","Dec" ],
        +	dayNames: [ "Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag" ],
        +	dayNamesShort: [ "Søn","Man","Tir","Ons","Tor","Fre","Lør" ],
        +	dayNamesMin: [ "Sø","Ma","Ti","On","To","Fr","Lø" ],
        +	weekHeader: "Uge",
        +	dateFormat: "dd-mm-yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.da );
        +
        +return datepicker.regional.da;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-de.js b/bower_components/jquery-ui/ui/i18n/datepicker-de.js
        new file mode 100644
        index 0000000000..a67790844a
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-de.js
        @@ -0,0 +1,37 @@
        +/* German initialisation for the jQuery UI date picker plugin. */
        +/* Written by Milian Wolff (mail@milianw.de). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.de = {
        +	closeText: "Schließen",
        +	prevText: "&#x3C;Zurück",
        +	nextText: "Vor&#x3E;",
        +	currentText: "Heute",
        +	monthNames: [ "Januar","Februar","März","April","Mai","Juni",
        +	"Juli","August","September","Oktober","November","Dezember" ],
        +	monthNamesShort: [ "Jan","Feb","Mär","Apr","Mai","Jun",
        +	"Jul","Aug","Sep","Okt","Nov","Dez" ],
        +	dayNames: [ "Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag" ],
        +	dayNamesShort: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
        +	dayNamesMin: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
        +	weekHeader: "KW",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.de );
        +
        +return datepicker.regional.de;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-el.js b/bower_components/jquery-ui/ui/i18n/datepicker-el.js
        new file mode 100644
        index 0000000000..f08d6f27d4
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-el.js
        @@ -0,0 +1,37 @@
        +/* Greek (el) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Alex Cicovic (http://www.alexcicovic.com) */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.el = {
        +	closeText: "Κλείσιμο",
        +	prevText: "Προηγούμενος",
        +	nextText: "Επόμενος",
        +	currentText: "Σήμερα",
        +	monthNames: [ "Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος",
        +	"Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος" ],
        +	monthNamesShort: [ "Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν",
        +	"Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ" ],
        +	dayNames: [ "Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο" ],
        +	dayNamesShort: [ "Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ" ],
        +	dayNamesMin: [ "Κυ","Δε","Τρ","Τε","Πε","Πα","Σα" ],
        +	weekHeader: "Εβδ",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.el );
        +
        +return datepicker.regional.el;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-en-AU.js b/bower_components/jquery-ui/ui/i18n/datepicker-en-AU.js
        new file mode 100644
        index 0000000000..f15277c37b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-en-AU.js
        @@ -0,0 +1,37 @@
        +/* English/Australia initialisation for the jQuery UI date picker plugin. */
        +/* Based on the en-GB initialisation. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "en-AU" ] = {
        +	closeText: "Done",
        +	prevText: "Prev",
        +	nextText: "Next",
        +	currentText: "Today",
        +	monthNames: [ "January","February","March","April","May","June",
        +	"July","August","September","October","November","December" ],
        +	monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        +	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ],
        +	dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
        +	dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
        +	dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "en-AU" ] );
        +
        +return datepicker.regional[ "en-AU" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-en-GB.js b/bower_components/jquery-ui/ui/i18n/datepicker-en-GB.js
        new file mode 100644
        index 0000000000..c961c18659
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-en-GB.js
        @@ -0,0 +1,37 @@
        +/* English/UK initialisation for the jQuery UI date picker plugin. */
        +/* Written by Stuart. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "en-GB" ] = {
        +	closeText: "Done",
        +	prevText: "Prev",
        +	nextText: "Next",
        +	currentText: "Today",
        +	monthNames: [ "January","February","March","April","May","June",
        +	"July","August","September","October","November","December" ],
        +	monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        +	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ],
        +	dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
        +	dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
        +	dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "en-GB" ] );
        +
        +return datepicker.regional[ "en-GB" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-en-NZ.js b/bower_components/jquery-ui/ui/i18n/datepicker-en-NZ.js
        new file mode 100644
        index 0000000000..7046362254
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-en-NZ.js
        @@ -0,0 +1,37 @@
        +/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
        +/* Based on the en-GB initialisation. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "en-NZ" ] = {
        +	closeText: "Done",
        +	prevText: "Prev",
        +	nextText: "Next",
        +	currentText: "Today",
        +	monthNames: [ "January","February","March","April","May","June",
        +	"July","August","September","October","November","December" ],
        +	monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        +	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ],
        +	dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
        +	dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
        +	dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "en-NZ" ] );
        +
        +return datepicker.regional[ "en-NZ" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-eo.js b/bower_components/jquery-ui/ui/i18n/datepicker-eo.js
        new file mode 100644
        index 0000000000..25f6162b5c
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-eo.js
        @@ -0,0 +1,37 @@
        +/* Esperanto initialisation for the jQuery UI date picker plugin. */
        +/* Written by Olivier M. (olivierweb@ifrance.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.eo = {
        +	closeText: "Fermi",
        +	prevText: "&#x3C;Anta",
        +	nextText: "Sekv&#x3E;",
        +	currentText: "Nuna",
        +	monthNames: [ "Januaro","Februaro","Marto","Aprilo","Majo","Junio",
        +	"Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
        +	"Jul","Aŭg","Sep","Okt","Nov","Dec" ],
        +	dayNames: [ "Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato" ],
        +	dayNamesShort: [ "Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab" ],
        +	dayNamesMin: [ "Di","Lu","Ma","Me","Ĵa","Ve","Sa" ],
        +	weekHeader: "Sb",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.eo );
        +
        +return datepicker.regional.eo;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-es.js b/bower_components/jquery-ui/ui/i18n/datepicker-es.js
        new file mode 100644
        index 0000000000..ea7116e0bf
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-es.js
        @@ -0,0 +1,37 @@
        +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
        +/* Traducido por Vester (xvester@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.es = {
        +	closeText: "Cerrar",
        +	prevText: "&#x3C;Ant",
        +	nextText: "Sig&#x3E;",
        +	currentText: "Hoy",
        +	monthNames: [ "enero","febrero","marzo","abril","mayo","junio",
        +	"julio","agosto","septiembre","octubre","noviembre","diciembre" ],
        +	monthNamesShort: [ "ene","feb","mar","abr","may","jun",
        +	"jul","ago","sep","oct","nov","dic" ],
        +	dayNames: [ "domingo","lunes","martes","miércoles","jueves","viernes","sábado" ],
        +	dayNamesShort: [ "dom","lun","mar","mié","jue","vie","sáb" ],
        +	dayNamesMin: [ "D","L","M","X","J","V","S" ],
        +	weekHeader: "Sm",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.es );
        +
        +return datepicker.regional.es;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-et.js b/bower_components/jquery-ui/ui/i18n/datepicker-et.js
        new file mode 100644
        index 0000000000..b2e226ae54
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-et.js
        @@ -0,0 +1,45 @@
        +/* Estonian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.et = {
        +	closeText: "Sulge",
        +	prevText: "Eelnev",
        +	nextText: "Järgnev",
        +	currentText: "Täna",
        +	monthNames: [ "Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni",
        +	"Juuli","August","September","Oktoober","November","Detsember" ],
        +	monthNamesShort: [ "Jaan", "Veebr", "Märts", "Apr", "Mai", "Juuni",
        +	"Juuli", "Aug", "Sept", "Okt", "Nov", "Dets" ],
        +	dayNames: [
        +		"Pühapäev",
        +		"Esmaspäev",
        +		"Teisipäev",
        +		"Kolmapäev",
        +		"Neljapäev",
        +		"Reede",
        +		"Laupäev"
        +	],
        +	dayNamesShort: [ "Pühap", "Esmasp", "Teisip", "Kolmap", "Neljap", "Reede", "Laup" ],
        +	dayNamesMin: [ "P","E","T","K","N","R","L" ],
        +	weekHeader: "näd",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.et );
        +
        +return datepicker.regional.et;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-eu.js b/bower_components/jquery-ui/ui/i18n/datepicker-eu.js
        new file mode 100644
        index 0000000000..8ea1ef9e58
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-eu.js
        @@ -0,0 +1,36 @@
        +/* Karrikas-ek itzulia (karrikas@karrikas.com) */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.eu = {
        +	closeText: "Egina",
        +	prevText: "&#x3C;Aur",
        +	nextText: "Hur&#x3E;",
        +	currentText: "Gaur",
        +	monthNames: [ "urtarrila","otsaila","martxoa","apirila","maiatza","ekaina",
        +		"uztaila","abuztua","iraila","urria","azaroa","abendua" ],
        +	monthNamesShort: [ "urt.","ots.","mar.","api.","mai.","eka.",
        +		"uzt.","abu.","ira.","urr.","aza.","abe." ],
        +	dayNames: [ "igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata" ],
        +	dayNamesShort: [ "ig.","al.","ar.","az.","og.","ol.","lr." ],
        +	dayNamesMin: [ "ig","al","ar","az","og","ol","lr" ],
        +	weekHeader: "As",
        +	dateFormat: "yy-mm-dd",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.eu );
        +
        +return datepicker.regional.eu;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-fa.js b/bower_components/jquery-ui/ui/i18n/datepicker-fa.js
        new file mode 100644
        index 0000000000..71da4981d3
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-fa.js
        @@ -0,0 +1,73 @@
        +/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
        +/* Javad Mowlanezhad -- jmowla@gmail.com */
        +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.fa = {
        +	closeText: "بستن",
        +	prevText: "&#x3C;قبلی",
        +	nextText: "بعدی&#x3E;",
        +	currentText: "امروز",
        +	monthNames: [
        +		"ژانویه",
        +		"فوریه",
        +		"مارس",
        +		"آوریل",
        +		"مه",
        +		"ژوئن",
        +		"ژوئیه",
        +		"اوت",
        +		"سپتامبر",
        +		"اکتبر",
        +		"نوامبر",
        +		"دسامبر"
        +	],
        +	monthNamesShort: [ "1","2","3","4","5","6","7","8","9","10","11","12" ],
        +	dayNames: [
        +		"يکشنبه",
        +		"دوشنبه",
        +		"سه‌شنبه",
        +		"چهارشنبه",
        +		"پنجشنبه",
        +		"جمعه",
        +		"شنبه"
        +	],
        +	dayNamesShort: [
        +		"ی",
        +		"د",
        +		"س",
        +		"چ",
        +		"پ",
        +		"ج",
        +		"ش"
        +	],
        +	dayNamesMin: [
        +		"ی",
        +		"د",
        +		"س",
        +		"چ",
        +		"پ",
        +		"ج",
        +		"ش"
        +	],
        +	weekHeader: "هف",
        +	dateFormat: "yy/mm/dd",
        +	firstDay: 6,
        +	isRTL: true,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.fa );
        +
        +return datepicker.regional.fa;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-fi.js b/bower_components/jquery-ui/ui/i18n/datepicker-fi.js
        new file mode 100644
        index 0000000000..a8386ff626
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-fi.js
        @@ -0,0 +1,37 @@
        +/* Finnish initialisation for the jQuery UI date picker plugin. */
        +/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.fi = {
        +	closeText: "Sulje",
        +	prevText: "&#xAB;Edellinen",
        +	nextText: "Seuraava&#xBB;",
        +	currentText: "Tänään",
        +	monthNames: [ "Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu",
        +	"Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu" ],
        +	monthNamesShort: [ "Tammi","Helmi","Maalis","Huhti","Touko","Kesä",
        +	"Heinä","Elo","Syys","Loka","Marras","Joulu" ],
        +	dayNamesShort: [ "Su","Ma","Ti","Ke","To","Pe","La" ],
        +	dayNames: [ "Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai" ],
        +	dayNamesMin: [ "Su","Ma","Ti","Ke","To","Pe","La" ],
        +	weekHeader: "Vk",
        +	dateFormat: "d.m.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.fi );
        +
        +return datepicker.regional.fi;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-fo.js b/bower_components/jquery-ui/ui/i18n/datepicker-fo.js
        new file mode 100644
        index 0000000000..6c24b8bff8
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-fo.js
        @@ -0,0 +1,45 @@
        +/* Faroese initialisation for the jQuery UI date picker plugin */
        +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.fo = {
        +	closeText: "Lat aftur",
        +	prevText: "&#x3C;Fyrra",
        +	nextText: "Næsta&#x3E;",
        +	currentText: "Í dag",
        +	monthNames: [ "Januar","Februar","Mars","Apríl","Mei","Juni",
        +	"Juli","August","September","Oktober","November","Desember" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Mei","Jun",
        +	"Jul","Aug","Sep","Okt","Nov","Des" ],
        +	dayNames: [
        +		"Sunnudagur",
        +		"Mánadagur",
        +		"Týsdagur",
        +		"Mikudagur",
        +		"Hósdagur",
        +		"Fríggjadagur",
        +		"Leyardagur"
        +	],
        +	dayNamesShort: [ "Sun","Mán","Týs","Mik","Hós","Frí","Ley" ],
        +	dayNamesMin: [ "Su","Má","Tý","Mi","Hó","Fr","Le" ],
        +	weekHeader: "Vk",
        +	dateFormat: "dd-mm-yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.fo );
        +
        +return datepicker.regional.fo;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-fr-CA.js b/bower_components/jquery-ui/ui/i18n/datepicker-fr-CA.js
        new file mode 100644
        index 0000000000..b590277d4b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-fr-CA.js
        @@ -0,0 +1,37 @@
        +/* Canadian-French initialisation for the jQuery UI date picker plugin. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "fr-CA" ] = {
        +	closeText: "Fermer",
        +	prevText: "Précédent",
        +	nextText: "Suivant",
        +	currentText: "Aujourd'hui",
        +	monthNames: [ "janvier", "février", "mars", "avril", "mai", "juin",
        +		"juillet", "août", "septembre", "octobre", "novembre", "décembre" ],
        +	monthNamesShort: [ "janv.", "févr.", "mars", "avril", "mai", "juin",
        +		"juil.", "août", "sept.", "oct.", "nov.", "déc." ],
        +	dayNames: [ "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi" ],
        +	dayNamesShort: [ "dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam." ],
        +	dayNamesMin: [ "D", "L", "M", "M", "J", "V", "S" ],
        +	weekHeader: "Sem.",
        +	dateFormat: "yy-mm-dd",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: ""
        +};
        +datepicker.setDefaults( datepicker.regional[ "fr-CA" ] );
        +
        +return datepicker.regional[ "fr-CA" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-fr-CH.js b/bower_components/jquery-ui/ui/i18n/datepicker-fr-CH.js
        new file mode 100644
        index 0000000000..d2f0584d6a
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-fr-CH.js
        @@ -0,0 +1,37 @@
        +/* Swiss-French initialisation for the jQuery UI date picker plugin. */
        +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "fr-CH" ] = {
        +	closeText: "Fermer",
        +	prevText: "&#x3C;Préc",
        +	nextText: "Suiv&#x3E;",
        +	currentText: "Courant",
        +	monthNames: [ "janvier", "février", "mars", "avril", "mai", "juin",
        +		"juillet", "août", "septembre", "octobre", "novembre", "décembre" ],
        +	monthNamesShort: [ "janv.", "févr.", "mars", "avril", "mai", "juin",
        +		"juil.", "août", "sept.", "oct.", "nov.", "déc." ],
        +	dayNames: [ "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi" ],
        +	dayNamesShort: [ "dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam." ],
        +	dayNamesMin: [ "D", "L", "M", "M", "J", "V", "S" ],
        +	weekHeader: "Sm",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "fr-CH" ] );
        +
        +return datepicker.regional[ "fr-CH" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-fr.js b/bower_components/jquery-ui/ui/i18n/datepicker-fr.js
        new file mode 100644
        index 0000000000..9e39fbd68f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-fr.js
        @@ -0,0 +1,39 @@
        +/* French initialisation for the jQuery UI date picker plugin. */
        +/* Written by Keith Wood (kbwood{at}iinet.com.au),
        +			  Stéphane Nahmani (sholby@sholby.net),
        +			  Stéphane Raimbault <stephane.raimbault@gmail.com> */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.fr = {
        +	closeText: "Fermer",
        +	prevText: "Précédent",
        +	nextText: "Suivant",
        +	currentText: "Aujourd'hui",
        +	monthNames: [ "janvier", "février", "mars", "avril", "mai", "juin",
        +		"juillet", "août", "septembre", "octobre", "novembre", "décembre" ],
        +	monthNamesShort: [ "janv.", "févr.", "mars", "avr.", "mai", "juin",
        +		"juil.", "août", "sept.", "oct.", "nov.", "déc." ],
        +	dayNames: [ "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi" ],
        +	dayNamesShort: [ "dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam." ],
        +	dayNamesMin: [ "D","L","M","M","J","V","S" ],
        +	weekHeader: "Sem.",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.fr );
        +
        +return datepicker.regional.fr;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-gl.js b/bower_components/jquery-ui/ui/i18n/datepicker-gl.js
        new file mode 100644
        index 0000000000..2765230746
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-gl.js
        @@ -0,0 +1,37 @@
        +/* Galician localization for 'UI date picker' jQuery extension. */
        +/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.gl = {
        +	closeText: "Pechar",
        +	prevText: "&#x3C;Ant",
        +	nextText: "Seg&#x3E;",
        +	currentText: "Hoxe",
        +	monthNames: [ "Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño",
        +	"Xullo","Agosto","Setembro","Outubro","Novembro","Decembro" ],
        +	monthNamesShort: [ "Xan","Feb","Mar","Abr","Mai","Xuñ",
        +	"Xul","Ago","Set","Out","Nov","Dec" ],
        +	dayNames: [ "Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado" ],
        +	dayNamesShort: [ "Dom","Lun","Mar","Mér","Xov","Ven","Sáb" ],
        +	dayNamesMin: [ "Do","Lu","Ma","Mé","Xo","Ve","Sá" ],
        +	weekHeader: "Sm",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.gl );
        +
        +return datepicker.regional.gl;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-he.js b/bower_components/jquery-ui/ui/i18n/datepicker-he.js
        new file mode 100644
        index 0000000000..fb6238fdac
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-he.js
        @@ -0,0 +1,37 @@
        +/* Hebrew initialisation for the UI Datepicker extension. */
        +/* Written by Amir Hardon (ahardon at gmail dot com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.he = {
        +	closeText: "סגור",
        +	prevText: "&#x3C;הקודם",
        +	nextText: "הבא&#x3E;",
        +	currentText: "היום",
        +	monthNames: [ "ינואר","פברואר","מרץ","אפריל","מאי","יוני",
        +	"יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר" ],
        +	monthNamesShort: [ "ינו","פבר","מרץ","אפר","מאי","יוני",
        +	"יולי","אוג","ספט","אוק","נוב","דצמ" ],
        +	dayNames: [ "ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת" ],
        +	dayNamesShort: [ "א'","ב'","ג'","ד'","ה'","ו'","שבת" ],
        +	dayNamesMin: [ "א'","ב'","ג'","ד'","ה'","ו'","שבת" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: true,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.he );
        +
        +return datepicker.regional.he;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-hi.js b/bower_components/jquery-ui/ui/i18n/datepicker-hi.js
        new file mode 100644
        index 0000000000..3b12097245
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-hi.js
        @@ -0,0 +1,37 @@
        +/* Hindi initialisation for the jQuery UI date picker plugin. */
        +/* Written by Michael Dawart. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.hi = {
        +	closeText: "बंद",
        +	prevText: "पिछला",
        +	nextText: "अगला",
        +	currentText: "आज",
        +	monthNames: [ "जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून",
        +	"जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर" ],
        +	monthNamesShort: [ "जन", "फर", "मार्च", "अप्रेल", "मई", "जून",
        +	"जूलाई", "अग", "सित", "अक्ट", "नव", "दि" ],
        +	dayNames: [ "रविवार", "सोमवार", "मंगलवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार" ],
        +	dayNamesShort: [ "रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि" ],
        +	dayNamesMin: [ "रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि" ],
        +	weekHeader: "हफ्ता",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.hi );
        +
        +return datepicker.regional.hi;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-hr.js b/bower_components/jquery-ui/ui/i18n/datepicker-hr.js
        new file mode 100644
        index 0000000000..5e218c12d8
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-hr.js
        @@ -0,0 +1,37 @@
        +/* Croatian i18n for the jQuery UI date picker plugin. */
        +/* Written by Vjekoslav Nesek. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.hr = {
        +	closeText: "Zatvori",
        +	prevText: "&#x3C;",
        +	nextText: "&#x3E;",
        +	currentText: "Danas",
        +	monthNames: [ "Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj",
        +	"Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac" ],
        +	monthNamesShort: [ "Sij","Velj","Ožu","Tra","Svi","Lip",
        +	"Srp","Kol","Ruj","Lis","Stu","Pro" ],
        +	dayNames: [ "Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota" ],
        +	dayNamesShort: [ "Ned","Pon","Uto","Sri","Čet","Pet","Sub" ],
        +	dayNamesMin: [ "Ne","Po","Ut","Sr","Če","Pe","Su" ],
        +	weekHeader: "Tje",
        +	dateFormat: "dd.mm.yy.",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.hr );
        +
        +return datepicker.regional.hr;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-hu.js b/bower_components/jquery-ui/ui/i18n/datepicker-hu.js
        new file mode 100644
        index 0000000000..22bbe7031e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-hu.js
        @@ -0,0 +1,36 @@
        +/* Hungarian initialisation for the jQuery UI date picker plugin. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.hu = {
        +	closeText: "bezár",
        +	prevText: "vissza",
        +	nextText: "előre",
        +	currentText: "ma",
        +	monthNames: [ "Január", "Február", "Március", "Április", "Május", "Június",
        +	"Július", "Augusztus", "Szeptember", "Október", "November", "December" ],
        +	monthNamesShort: [ "Jan", "Feb", "Már", "Ápr", "Máj", "Jún",
        +	"Júl", "Aug", "Szep", "Okt", "Nov", "Dec" ],
        +	dayNames: [ "Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat" ],
        +	dayNamesShort: [ "Vas", "Hét", "Ked", "Sze", "Csü", "Pén", "Szo" ],
        +	dayNamesMin: [ "V", "H", "K", "Sze", "Cs", "P", "Szo" ],
        +	weekHeader: "Hét",
        +	dateFormat: "yy.mm.dd.",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: true,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.hu );
        +
        +return datepicker.regional.hu;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-hy.js b/bower_components/jquery-ui/ui/i18n/datepicker-hy.js
        new file mode 100644
        index 0000000000..95638b3107
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-hy.js
        @@ -0,0 +1,37 @@
        +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.hy = {
        +	closeText: "Փակել",
        +	prevText: "&#x3C;Նախ.",
        +	nextText: "Հաջ.&#x3E;",
        +	currentText: "Այսօր",
        +	monthNames: [ "Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս",
        +	"Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր" ],
        +	monthNamesShort: [ "Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս",
        +	"Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ" ],
        +	dayNames: [ "կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ" ],
        +	dayNamesShort: [ "կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ" ],
        +	dayNamesMin: [ "կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ" ],
        +	weekHeader: "ՇԲՏ",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.hy );
        +
        +return datepicker.regional.hy;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-id.js b/bower_components/jquery-ui/ui/i18n/datepicker-id.js
        new file mode 100644
        index 0000000000..5aef348af8
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-id.js
        @@ -0,0 +1,37 @@
        +/* Indonesian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Deden Fathurahman (dedenf@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.id = {
        +	closeText: "Tutup",
        +	prevText: "&#x3C;mundur",
        +	nextText: "maju&#x3E;",
        +	currentText: "hari ini",
        +	monthNames: [ "Januari","Februari","Maret","April","Mei","Juni",
        +	"Juli","Agustus","September","Oktober","Nopember","Desember" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Mei","Jun",
        +	"Jul","Agus","Sep","Okt","Nop","Des" ],
        +	dayNames: [ "Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu" ],
        +	dayNamesShort: [ "Min","Sen","Sel","Rab","kam","Jum","Sab" ],
        +	dayNamesMin: [ "Mg","Sn","Sl","Rb","Km","jm","Sb" ],
        +	weekHeader: "Mg",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.id );
        +
        +return datepicker.regional.id;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-is.js b/bower_components/jquery-ui/ui/i18n/datepicker-is.js
        new file mode 100644
        index 0000000000..b15f37ab06
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-is.js
        @@ -0,0 +1,45 @@
        +/* Icelandic initialisation for the jQuery UI date picker plugin. */
        +/* Written by Haukur H. Thorsson (haukur@eskill.is). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.is = {
        +	closeText: "Loka",
        +	prevText: "&#x3C; Fyrri",
        +	nextText: "Næsti &#x3E;",
        +	currentText: "Í dag",
        +	monthNames: [ "Janúar","Febrúar","Mars","Apríl","Maí","Júní",
        +	"Júlí","Ágúst","September","Október","Nóvember","Desember" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maí","Jún",
        +	"Júl","Ágú","Sep","Okt","Nóv","Des" ],
        +	dayNames: [
        +		"Sunnudagur",
        +		"Mánudagur",
        +		"Þriðjudagur",
        +		"Miðvikudagur",
        +		"Fimmtudagur",
        +		"Föstudagur",
        +		"Laugardagur"
        +	],
        +	dayNamesShort: [ "Sun","Mán","Þri","Mið","Fim","Fös","Lau" ],
        +	dayNamesMin: [ "Su","Má","Þr","Mi","Fi","Fö","La" ],
        +	weekHeader: "Vika",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.is );
        +
        +return datepicker.regional.is;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-it-CH.js b/bower_components/jquery-ui/ui/i18n/datepicker-it-CH.js
        new file mode 100644
        index 0000000000..9895da4cc3
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-it-CH.js
        @@ -0,0 +1,37 @@
        +/* Italian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "it-CH" ] = {
        +	closeText: "Chiudi",
        +	prevText: "&#x3C;Prec",
        +	nextText: "Succ&#x3E;",
        +	currentText: "Oggi",
        +	monthNames: [ "Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno",
        +		"Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre" ],
        +	monthNamesShort: [ "Gen","Feb","Mar","Apr","Mag","Giu",
        +		"Lug","Ago","Set","Ott","Nov","Dic" ],
        +	dayNames: [ "Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato" ],
        +	dayNamesShort: [ "Dom","Lun","Mar","Mer","Gio","Ven","Sab" ],
        +	dayNamesMin: [ "Do","Lu","Ma","Me","Gi","Ve","Sa" ],
        +	weekHeader: "Sm",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "it-CH" ] );
        +
        +return datepicker.regional[ "it-CH" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-it.js b/bower_components/jquery-ui/ui/i18n/datepicker-it.js
        new file mode 100644
        index 0000000000..d67cb6c248
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-it.js
        @@ -0,0 +1,37 @@
        +/* Italian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.it = {
        +	closeText: "Chiudi",
        +	prevText: "&#x3C;Prec",
        +	nextText: "Succ&#x3E;",
        +	currentText: "Oggi",
        +	monthNames: [ "Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno",
        +		"Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre" ],
        +	monthNamesShort: [ "Gen","Feb","Mar","Apr","Mag","Giu",
        +		"Lug","Ago","Set","Ott","Nov","Dic" ],
        +	dayNames: [ "Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato" ],
        +	dayNamesShort: [ "Dom","Lun","Mar","Mer","Gio","Ven","Sab" ],
        +	dayNamesMin: [ "Do","Lu","Ma","Me","Gi","Ve","Sa" ],
        +	weekHeader: "Sm",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.it );
        +
        +return datepicker.regional.it;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ja.js b/bower_components/jquery-ui/ui/i18n/datepicker-ja.js
        new file mode 100644
        index 0000000000..52b10583ca
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ja.js
        @@ -0,0 +1,37 @@
        +/* Japanese initialisation for the jQuery UI date picker plugin. */
        +/* Written by Kentaro SATO (kentaro@ranvis.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ja = {
        +	closeText: "閉じる",
        +	prevText: "&#x3C;前",
        +	nextText: "次&#x3E;",
        +	currentText: "今日",
        +	monthNames: [ "1月","2月","3月","4月","5月","6月",
        +	"7月","8月","9月","10月","11月","12月" ],
        +	monthNamesShort: [ "1月","2月","3月","4月","5月","6月",
        +	"7月","8月","9月","10月","11月","12月" ],
        +	dayNames: [ "日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日" ],
        +	dayNamesShort: [ "日","月","火","水","木","金","土" ],
        +	dayNamesMin: [ "日","月","火","水","木","金","土" ],
        +	weekHeader: "週",
        +	dateFormat: "yy/mm/dd",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: true,
        +	yearSuffix: "年" };
        +datepicker.setDefaults( datepicker.regional.ja );
        +
        +return datepicker.regional.ja;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ka.js b/bower_components/jquery-ui/ui/i18n/datepicker-ka.js
        new file mode 100644
        index 0000000000..1f596cb318
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ka.js
        @@ -0,0 +1,48 @@
        +/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Lado Lomidze (lado.lomidze@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ka = {
        +	closeText: "დახურვა",
        +	prevText: "&#x3c; წინა",
        +	nextText: "შემდეგი &#x3e;",
        +	currentText: "დღეს",
        +	monthNames: [
        +		"იანვარი",
        +		"თებერვალი",
        +		"მარტი",
        +		"აპრილი",
        +		"მაისი",
        +		"ივნისი",
        +		"ივლისი",
        +		"აგვისტო",
        +		"სექტემბერი",
        +		"ოქტომბერი",
        +		"ნოემბერი",
        +		"დეკემბერი"
        +	],
        +	monthNamesShort: [ "იან","თებ","მარ","აპრ","მაი","ივნ", "ივლ","აგვ","სექ","ოქტ","ნოე","დეკ" ],
        +	dayNames: [ "კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი" ],
        +	dayNamesShort: [ "კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ" ],
        +	dayNamesMin: [ "კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ" ],
        +	weekHeader: "კვირა",
        +	dateFormat: "dd-mm-yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ka );
        +
        +return datepicker.regional.ka;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-kk.js b/bower_components/jquery-ui/ui/i18n/datepicker-kk.js
        new file mode 100644
        index 0000000000..fa0121f8c2
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-kk.js
        @@ -0,0 +1,37 @@
        +/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.kk = {
        +	closeText: "Жабу",
        +	prevText: "&#x3C;Алдыңғы",
        +	nextText: "Келесі&#x3E;",
        +	currentText: "Бүгін",
        +	monthNames: [ "Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым",
        +	"Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан" ],
        +	monthNamesShort: [ "Қаң","Ақп","Нау","Сәу","Мам","Мау",
        +	"Шіл","Там","Қыр","Қаз","Қар","Жел" ],
        +	dayNames: [ "Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі" ],
        +	dayNamesShort: [ "жкс","дсн","ссн","срс","бсн","жма","снб" ],
        +	dayNamesMin: [ "Жк","Дс","Сс","Ср","Бс","Жм","Сн" ],
        +	weekHeader: "Не",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.kk );
        +
        +return datepicker.regional.kk;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-km.js b/bower_components/jquery-ui/ui/i18n/datepicker-km.js
        new file mode 100644
        index 0000000000..d8a4596bce
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-km.js
        @@ -0,0 +1,37 @@
        +/* Khmer initialisation for the jQuery calendar extension. */
        +/* Written by Chandara Om (chandara.teacher@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.km = {
        +	closeText: "ធ្វើ​រួច",
        +	prevText: "មុន",
        +	nextText: "បន្ទាប់",
        +	currentText: "ថ្ងៃ​នេះ",
        +	monthNames: [ "មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា",
        +	"កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ" ],
        +	monthNamesShort: [ "មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា",
        +	"កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ" ],
        +	dayNames: [ "អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហស្បតិ៍", "សុក្រ", "សៅរ៍" ],
        +	dayNamesShort: [ "អា", "ច", "អ", "ពុ", "ព្រហ", "សុ", "សៅ" ],
        +	dayNamesMin: [ "អា", "ច", "អ", "ពុ", "ព្រហ", "សុ", "សៅ" ],
        +	weekHeader: "សប្ដាហ៍",
        +	dateFormat: "dd-mm-yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.km );
        +
        +return datepicker.regional.km;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ko.js b/bower_components/jquery-ui/ui/i18n/datepicker-ko.js
        new file mode 100644
        index 0000000000..8879a99509
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ko.js
        @@ -0,0 +1,37 @@
        +/* Korean initialisation for the jQuery calendar extension. */
        +/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie and Myeongjin Lee. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ko = {
        +	closeText: "닫기",
        +	prevText: "이전달",
        +	nextText: "다음달",
        +	currentText: "오늘",
        +	monthNames: [ "1월","2월","3월","4월","5월","6월",
        +	"7월","8월","9월","10월","11월","12월" ],
        +	monthNamesShort: [ "1월","2월","3월","4월","5월","6월",
        +	"7월","8월","9월","10월","11월","12월" ],
        +	dayNames: [ "일요일","월요일","화요일","수요일","목요일","금요일","토요일" ],
        +	dayNamesShort: [ "일","월","화","수","목","금","토" ],
        +	dayNamesMin: [ "일","월","화","수","목","금","토" ],
        +	weekHeader: "주",
        +	dateFormat: "yy. m. d.",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: true,
        +	yearSuffix: "년" };
        +datepicker.setDefaults( datepicker.regional.ko );
        +
        +return datepicker.regional.ko;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ky.js b/bower_components/jquery-ui/ui/i18n/datepicker-ky.js
        new file mode 100644
        index 0000000000..f748bc6060
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ky.js
        @@ -0,0 +1,38 @@
        +/* Kyrgyz (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Sergey Kartashov (ebishkek@yandex.ru). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ky = {
        +	closeText: "Жабуу",
        +	prevText: "&#x3c;Мур",
        +	nextText: "Кий&#x3e;",
        +	currentText: "Бүгүн",
        +	monthNames: [ "Январь","Февраль","Март","Апрель","Май","Июнь",
        +	"Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь" ],
        +	monthNamesShort: [ "Янв","Фев","Мар","Апр","Май","Июн",
        +	"Июл","Авг","Сен","Окт","Ноя","Дек" ],
        +	dayNames: [ "жекшемби", "дүйшөмбү", "шейшемби", "шаршемби", "бейшемби", "жума", "ишемби" ],
        +	dayNamesShort: [ "жек", "дүй", "шей", "шар", "бей", "жум", "ише" ],
        +	dayNamesMin: [ "Жк","Дш","Шш","Шр","Бш","Жм","Иш" ],
        +	weekHeader: "Жум",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: ""
        +};
        +datepicker.setDefaults( datepicker.regional.ky );
        +
        +return datepicker.regional.ky;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-lb.js b/bower_components/jquery-ui/ui/i18n/datepicker-lb.js
        new file mode 100644
        index 0000000000..02a9c51082
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-lb.js
        @@ -0,0 +1,45 @@
        +/* Luxembourgish initialisation for the jQuery UI date picker plugin. */
        +/* Written by Michel Weimerskirch <michel@weimerskirch.net> */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.lb = {
        +	closeText: "Fäerdeg",
        +	prevText: "Zréck",
        +	nextText: "Weider",
        +	currentText: "Haut",
        +	monthNames: [ "Januar","Februar","Mäerz","Abrëll","Mee","Juni",
        +	"Juli","August","September","Oktober","November","Dezember" ],
        +	monthNamesShort: [ "Jan", "Feb", "Mäe", "Abr", "Mee", "Jun",
        +	"Jul", "Aug", "Sep", "Okt", "Nov", "Dez" ],
        +	dayNames: [
        +		"Sonndeg",
        +		"Méindeg",
        +		"Dënschdeg",
        +		"Mëttwoch",
        +		"Donneschdeg",
        +		"Freideg",
        +		"Samschdeg"
        +	],
        +	dayNamesShort: [ "Son", "Méi", "Dën", "Mët", "Don", "Fre", "Sam" ],
        +	dayNamesMin: [ "So","Mé","Dë","Më","Do","Fr","Sa" ],
        +	weekHeader: "W",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.lb );
        +
        +return datepicker.regional.lb;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-lt.js b/bower_components/jquery-ui/ui/i18n/datepicker-lt.js
        new file mode 100644
        index 0000000000..a57fd9df00
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-lt.js
        @@ -0,0 +1,45 @@
        +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* @author Arturas Paleicikas <arturas@avalon.lt> */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.lt = {
        +	closeText: "Uždaryti",
        +	prevText: "&#x3C;Atgal",
        +	nextText: "Pirmyn&#x3E;",
        +	currentText: "Šiandien",
        +	monthNames: [ "Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis",
        +	"Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis" ],
        +	monthNamesShort: [ "Sau","Vas","Kov","Bal","Geg","Bir",
        +	"Lie","Rugp","Rugs","Spa","Lap","Gru" ],
        +	dayNames: [
        +		"sekmadienis",
        +		"pirmadienis",
        +		"antradienis",
        +		"trečiadienis",
        +		"ketvirtadienis",
        +		"penktadienis",
        +		"šeštadienis"
        +	],
        +	dayNamesShort: [ "sek","pir","ant","tre","ket","pen","šeš" ],
        +	dayNamesMin: [ "Se","Pr","An","Tr","Ke","Pe","Še" ],
        +	weekHeader: "SAV",
        +	dateFormat: "yy-mm-dd",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: true,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.lt );
        +
        +return datepicker.regional.lt;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-lv.js b/bower_components/jquery-ui/ui/i18n/datepicker-lv.js
        new file mode 100644
        index 0000000000..04556fbcf7
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-lv.js
        @@ -0,0 +1,45 @@
        +/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.lv = {
        +	closeText: "Aizvērt",
        +	prevText: "Iepr.",
        +	nextText: "Nāk.",
        +	currentText: "Šodien",
        +	monthNames: [ "Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs",
        +	"Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Mai","Jūn",
        +	"Jūl","Aug","Sep","Okt","Nov","Dec" ],
        +	dayNames: [
        +		"svētdiena",
        +		"pirmdiena",
        +		"otrdiena",
        +		"trešdiena",
        +		"ceturtdiena",
        +		"piektdiena",
        +		"sestdiena"
        +	],
        +	dayNamesShort: [ "svt","prm","otr","tre","ctr","pkt","sst" ],
        +	dayNamesMin: [ "Sv","Pr","Ot","Tr","Ct","Pk","Ss" ],
        +	weekHeader: "Ned.",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.lv );
        +
        +return datepicker.regional.lv;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-mk.js b/bower_components/jquery-ui/ui/i18n/datepicker-mk.js
        new file mode 100644
        index 0000000000..97864ab151
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-mk.js
        @@ -0,0 +1,37 @@
        +/* Macedonian i18n for the jQuery UI date picker plugin. */
        +/* Written by Stojce Slavkovski. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.mk = {
        +	closeText: "Затвори",
        +	prevText: "&#x3C;",
        +	nextText: "&#x3E;",
        +	currentText: "Денес",
        +	monthNames: [ "Јануари","Февруари","Март","Април","Мај","Јуни",
        +	"Јули","Август","Септември","Октомври","Ноември","Декември" ],
        +	monthNamesShort: [ "Јан","Фев","Мар","Апр","Мај","Јун",
        +	"Јул","Авг","Сеп","Окт","Ное","Дек" ],
        +	dayNames: [ "Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота" ],
        +	dayNamesShort: [ "Нед","Пон","Вто","Сре","Чет","Пет","Саб" ],
        +	dayNamesMin: [ "Не","По","Вт","Ср","Че","Пе","Са" ],
        +	weekHeader: "Сед",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.mk );
        +
        +return datepicker.regional.mk;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ml.js b/bower_components/jquery-ui/ui/i18n/datepicker-ml.js
        new file mode 100644
        index 0000000000..440e09e034
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ml.js
        @@ -0,0 +1,37 @@
        +/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Saji Nediyanchath (saji89@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ml = {
        +	closeText: "ശരി",
        +	prevText: "മുന്നത്തെ",
        +	nextText: "അടുത്തത് ",
        +	currentText: "ഇന്ന്",
        +	monthNames: [ "ജനുവരി","ഫെബ്രുവരി","മാര്‍ച്ച്","ഏപ്രില്‍","മേയ്","ജൂണ്‍",
        +	"ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്‍","ഒക്ടോബര്‍","നവംബര്‍","ഡിസംബര്‍" ],
        +	monthNamesShort: [ "ജനു", "ഫെബ്", "മാര്‍", "ഏപ്രി", "മേയ്", "ജൂണ്‍",
        +	"ജൂലാ", "ആഗ", "സെപ്", "ഒക്ടോ", "നവം", "ഡിസ" ],
        +	dayNames: [ "ഞായര്‍", "തിങ്കള്‍", "ചൊവ്വ", "ബുധന്‍", "വ്യാഴം", "വെള്ളി", "ശനി" ],
        +	dayNamesShort: [ "ഞായ", "തിങ്ക", "ചൊവ്വ", "ബുധ", "വ്യാഴം", "വെള്ളി", "ശനി" ],
        +	dayNamesMin: [ "ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ" ],
        +	weekHeader: "ആ",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ml );
        +
        +return datepicker.regional.ml;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ms.js b/bower_components/jquery-ui/ui/i18n/datepicker-ms.js
        new file mode 100644
        index 0000000000..58bc4f579e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ms.js
        @@ -0,0 +1,37 @@
        +/* Malaysian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ms = {
        +	closeText: "Tutup",
        +	prevText: "&#x3C;Sebelum",
        +	nextText: "Selepas&#x3E;",
        +	currentText: "hari ini",
        +	monthNames: [ "Januari","Februari","Mac","April","Mei","Jun",
        +	"Julai","Ogos","September","Oktober","November","Disember" ],
        +	monthNamesShort: [ "Jan","Feb","Mac","Apr","Mei","Jun",
        +	"Jul","Ogo","Sep","Okt","Nov","Dis" ],
        +	dayNames: [ "Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu" ],
        +	dayNamesShort: [ "Aha","Isn","Sel","Rab","kha","Jum","Sab" ],
        +	dayNamesMin: [ "Ah","Is","Se","Ra","Kh","Ju","Sa" ],
        +	weekHeader: "Mg",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ms );
        +
        +return datepicker.regional.ms;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-nb.js b/bower_components/jquery-ui/ui/i18n/datepicker-nb.js
        new file mode 100644
        index 0000000000..eb1112bc50
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-nb.js
        @@ -0,0 +1,49 @@
        +/* Norwegian Bokmål initialisation for the jQuery UI date picker plugin. */
        +/* Written by Bjørn Johansen (post@bjornjohansen.no). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.nb = {
        +	closeText: "Lukk",
        +	prevText: "&#xAB;Forrige",
        +	nextText: "Neste&#xBB;",
        +	currentText: "I dag",
        +	monthNames: [
        +		"januar",
        +		"februar",
        +		"mars",
        +		"april",
        +		"mai",
        +		"juni",
        +		"juli",
        +		"august",
        +		"september",
        +		"oktober",
        +		"november",
        +		"desember"
        +	],
        +	monthNamesShort: [ "jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des" ],
        +	dayNamesShort: [ "søn","man","tir","ons","tor","fre","lør" ],
        +	dayNames: [ "søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag" ],
        +	dayNamesMin: [ "sø","ma","ti","on","to","fr","lø" ],
        +	weekHeader: "Uke",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: ""
        +};
        +datepicker.setDefaults( datepicker.regional.nb );
        +
        +return datepicker.regional.nb;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-nl-BE.js b/bower_components/jquery-ui/ui/i18n/datepicker-nl-BE.js
        new file mode 100644
        index 0000000000..9ea22002d6
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-nl-BE.js
        @@ -0,0 +1,37 @@
        +/* Dutch (Belgium) initialisation for the jQuery UI date picker plugin. */
        +/* David De Sloovere @DavidDeSloovere */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "nl-BE" ] = {
        +	closeText: "Sluiten",
        +	prevText: "←",
        +	nextText: "→",
        +	currentText: "Vandaag",
        +	monthNames: [ "januari", "februari", "maart", "april", "mei", "juni",
        +	"juli", "augustus", "september", "oktober", "november", "december" ],
        +	monthNamesShort: [ "jan", "feb", "mrt", "apr", "mei", "jun",
        +	"jul", "aug", "sep", "okt", "nov", "dec" ],
        +	dayNames: [ "zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag" ],
        +	dayNamesShort: [ "zon", "maa", "din", "woe", "don", "vri", "zat" ],
        +	dayNamesMin: [ "zo", "ma", "di", "wo", "do", "vr", "za" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "nl-BE" ] );
        +
        +return datepicker.regional[ "nl-BE" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-nl.js b/bower_components/jquery-ui/ui/i18n/datepicker-nl.js
        new file mode 100644
        index 0000000000..7fcbff1ac1
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-nl.js
        @@ -0,0 +1,37 @@
        +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Mathias Bynens <http://mathiasbynens.be/> */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.nl = {
        +	closeText: "Sluiten",
        +	prevText: "←",
        +	nextText: "→",
        +	currentText: "Vandaag",
        +	monthNames: [ "januari", "februari", "maart", "april", "mei", "juni",
        +	"juli", "augustus", "september", "oktober", "november", "december" ],
        +	monthNamesShort: [ "jan", "feb", "mrt", "apr", "mei", "jun",
        +	"jul", "aug", "sep", "okt", "nov", "dec" ],
        +	dayNames: [ "zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag" ],
        +	dayNamesShort: [ "zon", "maa", "din", "woe", "don", "vri", "zat" ],
        +	dayNamesMin: [ "zo", "ma", "di", "wo", "do", "vr", "za" ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd-mm-yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.nl );
        +
        +return datepicker.regional.nl;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-nn.js b/bower_components/jquery-ui/ui/i18n/datepicker-nn.js
        new file mode 100644
        index 0000000000..bacd481a01
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-nn.js
        @@ -0,0 +1,49 @@
        +/* Norwegian Nynorsk initialisation for the jQuery UI date picker plugin. */
        +/* Written by Bjørn Johansen (post@bjornjohansen.no). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.nn = {
        +	closeText: "Lukk",
        +	prevText: "&#xAB;Førre",
        +	nextText: "Neste&#xBB;",
        +	currentText: "I dag",
        +	monthNames: [
        +		"januar",
        +		"februar",
        +		"mars",
        +		"april",
        +		"mai",
        +		"juni",
        +		"juli",
        +		"august",
        +		"september",
        +		"oktober",
        +		"november",
        +		"desember"
        +	],
        +	monthNamesShort: [ "jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des" ],
        +	dayNamesShort: [ "sun","mån","tys","ons","tor","fre","lau" ],
        +	dayNames: [ "sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag" ],
        +	dayNamesMin: [ "su","må","ty","on","to","fr","la" ],
        +	weekHeader: "Veke",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: ""
        +};
        +datepicker.setDefaults( datepicker.regional.nn );
        +
        +return datepicker.regional.nn;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-no.js b/bower_components/jquery-ui/ui/i18n/datepicker-no.js
        new file mode 100644
        index 0000000000..8a755aae91
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-no.js
        @@ -0,0 +1,50 @@
        +/* Norwegian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.no = {
        +	closeText: "Lukk",
        +	prevText: "&#xAB;Forrige",
        +	nextText: "Neste&#xBB;",
        +	currentText: "I dag",
        +	monthNames: [
        +		"januar",
        +		"februar",
        +		"mars",
        +		"april",
        +		"mai",
        +		"juni",
        +		"juli",
        +		"august",
        +		"september",
        +		"oktober",
        +		"november",
        +		"desember"
        +	],
        +	monthNamesShort: [ "jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des" ],
        +	dayNamesShort: [ "søn","man","tir","ons","tor","fre","lør" ],
        +	dayNames: [ "søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag" ],
        +	dayNamesMin: [ "sø","ma","ti","on","to","fr","lø" ],
        +	weekHeader: "Uke",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: ""
        +};
        +datepicker.setDefaults( datepicker.regional.no );
        +
        +return datepicker.regional.no;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-pl.js b/bower_components/jquery-ui/ui/i18n/datepicker-pl.js
        new file mode 100644
        index 0000000000..c2fddc1327
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-pl.js
        @@ -0,0 +1,37 @@
        +/* Polish initialisation for the jQuery UI date picker plugin. */
        +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.pl = {
        +	closeText: "Zamknij",
        +	prevText: "&#x3C;Poprzedni",
        +	nextText: "Następny&#x3E;",
        +	currentText: "Dziś",
        +	monthNames: [ "Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec",
        +	"Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień" ],
        +	monthNamesShort: [ "Sty","Lu","Mar","Kw","Maj","Cze",
        +	"Lip","Sie","Wrz","Pa","Lis","Gru" ],
        +	dayNames: [ "Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota" ],
        +	dayNamesShort: [ "Nie","Pn","Wt","Śr","Czw","Pt","So" ],
        +	dayNamesMin: [ "N","Pn","Wt","Śr","Cz","Pt","So" ],
        +	weekHeader: "Tydz",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.pl );
        +
        +return datepicker.regional.pl;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-pt-BR.js b/bower_components/jquery-ui/ui/i18n/datepicker-pt-BR.js
        new file mode 100644
        index 0000000000..aeae7ca4ec
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-pt-BR.js
        @@ -0,0 +1,45 @@
        +/* Brazilian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "pt-BR" ] = {
        +	closeText: "Fechar",
        +	prevText: "&#x3C;Anterior",
        +	nextText: "Próximo&#x3E;",
        +	currentText: "Hoje",
        +	monthNames: [ "Janeiro","Fevereiro","Março","Abril","Maio","Junho",
        +	"Julho","Agosto","Setembro","Outubro","Novembro","Dezembro" ],
        +	monthNamesShort: [ "Jan","Fev","Mar","Abr","Mai","Jun",
        +	"Jul","Ago","Set","Out","Nov","Dez" ],
        +	dayNames: [
        +		"Domingo",
        +		"Segunda-feira",
        +		"Terça-feira",
        +		"Quarta-feira",
        +		"Quinta-feira",
        +		"Sexta-feira",
        +		"Sábado"
        +	],
        +	dayNamesShort: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
        +	dayNamesMin: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
        +	weekHeader: "Sm",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "pt-BR" ] );
        +
        +return datepicker.regional[ "pt-BR" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-pt.js b/bower_components/jquery-ui/ui/i18n/datepicker-pt.js
        new file mode 100644
        index 0000000000..b1afd7b3d0
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-pt.js
        @@ -0,0 +1,44 @@
        +/* Portuguese initialisation for the jQuery UI date picker plugin. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.pt = {
        +	closeText: "Fechar",
        +	prevText: "Anterior",
        +	nextText: "Seguinte",
        +	currentText: "Hoje",
        +	monthNames: [ "Janeiro","Fevereiro","Março","Abril","Maio","Junho",
        +	"Julho","Agosto","Setembro","Outubro","Novembro","Dezembro" ],
        +	monthNamesShort: [ "Jan","Fev","Mar","Abr","Mai","Jun",
        +	"Jul","Ago","Set","Out","Nov","Dez" ],
        +	dayNames: [
        +		"Domingo",
        +		"Segunda-feira",
        +		"Terça-feira",
        +		"Quarta-feira",
        +		"Quinta-feira",
        +		"Sexta-feira",
        +		"Sábado"
        +	],
        +	dayNamesShort: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
        +	dayNamesMin: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
        +	weekHeader: "Sem",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.pt );
        +
        +return datepicker.regional.pt;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-rm.js b/bower_components/jquery-ui/ui/i18n/datepicker-rm.js
        new file mode 100644
        index 0000000000..89a5c77a11
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-rm.js
        @@ -0,0 +1,61 @@
        +/* Romansh initialisation for the jQuery UI date picker plugin. */
        +/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.rm = {
        +	closeText: "Serrar",
        +	prevText: "&#x3C;Suandant",
        +	nextText: "Precedent&#x3E;",
        +	currentText: "Actual",
        +	monthNames: [
        +		"Schaner",
        +		"Favrer",
        +		"Mars",
        +		"Avrigl",
        +		"Matg",
        +		"Zercladur",
        +		"Fanadur",
        +		"Avust",
        +		"Settember",
        +		"October",
        +		"November",
        +		"December"
        +	],
        +	monthNamesShort: [
        +		"Scha",
        +		"Fev",
        +		"Mar",
        +		"Avr",
        +		"Matg",
        +		"Zer",
        +		"Fan",
        +		"Avu",
        +		"Sett",
        +		"Oct",
        +		"Nov",
        +		"Dec"
        +	],
        +	dayNames: [ "Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda" ],
        +	dayNamesShort: [ "Dum","Gli","Mar","Mes","Gie","Ven","Som" ],
        +	dayNamesMin: [ "Du","Gl","Ma","Me","Gi","Ve","So" ],
        +	weekHeader: "emna",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.rm );
        +
        +return datepicker.regional.rm;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ro.js b/bower_components/jquery-ui/ui/i18n/datepicker-ro.js
        new file mode 100644
        index 0000000000..b26665c256
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ro.js
        @@ -0,0 +1,40 @@
        +/* Romanian initialisation for the jQuery UI date picker plugin.
        + *
        + * Written by Edmond L. (ll_edmond@walla.com)
        + * and Ionut G. Stan (ionut.g.stan@gmail.com)
        + */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ro = {
        +	closeText: "Închide",
        +	prevText: "&#xAB; Luna precedentă",
        +	nextText: "Luna următoare &#xBB;",
        +	currentText: "Azi",
        +	monthNames: [ "Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie",
        +	"Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie" ],
        +	monthNamesShort: [ "Ian", "Feb", "Mar", "Apr", "Mai", "Iun",
        +	"Iul", "Aug", "Sep", "Oct", "Nov", "Dec" ],
        +	dayNames: [ "Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă" ],
        +	dayNamesShort: [ "Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm" ],
        +	dayNamesMin: [ "Du","Lu","Ma","Mi","Jo","Vi","Sâ" ],
        +	weekHeader: "Săpt",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ro );
        +
        +return datepicker.regional.ro;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ru.js b/bower_components/jquery-ui/ui/i18n/datepicker-ru.js
        new file mode 100644
        index 0000000000..223e77645e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ru.js
        @@ -0,0 +1,37 @@
        +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Andrew Stromnov (stromnov@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ru = {
        +	closeText: "Закрыть",
        +	prevText: "&#x3C;Пред",
        +	nextText: "След&#x3E;",
        +	currentText: "Сегодня",
        +	monthNames: [ "Январь","Февраль","Март","Апрель","Май","Июнь",
        +	"Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь" ],
        +	monthNamesShort: [ "Янв","Фев","Мар","Апр","Май","Июн",
        +	"Июл","Авг","Сен","Окт","Ноя","Дек" ],
        +	dayNames: [ "воскресенье","понедельник","вторник","среда","четверг","пятница","суббота" ],
        +	dayNamesShort: [ "вск","пнд","втр","срд","чтв","птн","сбт" ],
        +	dayNamesMin: [ "Вс","Пн","Вт","Ср","Чт","Пт","Сб" ],
        +	weekHeader: "Нед",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ru );
        +
        +return datepicker.regional.ru;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-sk.js b/bower_components/jquery-ui/ui/i18n/datepicker-sk.js
        new file mode 100644
        index 0000000000..16d8bdfe4e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-sk.js
        @@ -0,0 +1,37 @@
        +/* Slovak initialisation for the jQuery UI date picker plugin. */
        +/* Written by Vojtech Rinik (vojto@hmm.sk). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.sk = {
        +	closeText: "Zavrieť",
        +	prevText: "&#x3C;Predchádzajúci",
        +	nextText: "Nasledujúci&#x3E;",
        +	currentText: "Dnes",
        +	monthNames: [ "január","február","marec","apríl","máj","jún",
        +	"júl","august","september","október","november","december" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Máj","Jún",
        +	"Júl","Aug","Sep","Okt","Nov","Dec" ],
        +	dayNames: [ "nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota" ],
        +	dayNamesShort: [ "Ned","Pon","Uto","Str","Štv","Pia","Sob" ],
        +	dayNamesMin: [ "Ne","Po","Ut","St","Št","Pia","So" ],
        +	weekHeader: "Ty",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.sk );
        +
        +return datepicker.regional.sk;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-sl.js b/bower_components/jquery-ui/ui/i18n/datepicker-sl.js
        new file mode 100644
        index 0000000000..6891624926
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-sl.js
        @@ -0,0 +1,38 @@
        +/* Slovenian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Jaka Jancar (jaka@kubje.org). */
        +/* c = č, s = š z = ž C = Č S = Š Z = Ž */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.sl = {
        +	closeText: "Zapri",
        +	prevText: "&#x3C;Prejšnji",
        +	nextText: "Naslednji&#x3E;",
        +	currentText: "Trenutni",
        +	monthNames: [ "Januar","Februar","Marec","April","Maj","Junij",
        +	"Julij","Avgust","September","Oktober","November","December" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
        +	"Jul","Avg","Sep","Okt","Nov","Dec" ],
        +	dayNames: [ "Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota" ],
        +	dayNamesShort: [ "Ned","Pon","Tor","Sre","Čet","Pet","Sob" ],
        +	dayNamesMin: [ "Ne","Po","To","Sr","Če","Pe","So" ],
        +	weekHeader: "Teden",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.sl );
        +
        +return datepicker.regional.sl;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-sq.js b/bower_components/jquery-ui/ui/i18n/datepicker-sq.js
        new file mode 100644
        index 0000000000..34fe66a59c
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-sq.js
        @@ -0,0 +1,37 @@
        +/* Albanian initialisation for the jQuery UI date picker plugin. */
        +/* Written by Flakron Bytyqi (flakron@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.sq = {
        +	closeText: "mbylle",
        +	prevText: "&#x3C;mbrapa",
        +	nextText: "Përpara&#x3E;",
        +	currentText: "sot",
        +	monthNames: [ "Janar","Shkurt","Mars","Prill","Maj","Qershor",
        +	"Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor" ],
        +	monthNamesShort: [ "Jan","Shk","Mar","Pri","Maj","Qer",
        +	"Kor","Gus","Sht","Tet","Nën","Dhj" ],
        +	dayNames: [ "E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune" ],
        +	dayNamesShort: [ "Di","Hë","Ma","Më","En","Pr","Sh" ],
        +	dayNamesMin: [ "Di","Hë","Ma","Më","En","Pr","Sh" ],
        +	weekHeader: "Ja",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.sq );
        +
        +return datepicker.regional.sq;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-sr-SR.js b/bower_components/jquery-ui/ui/i18n/datepicker-sr-SR.js
        new file mode 100644
        index 0000000000..e9db26a42e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-sr-SR.js
        @@ -0,0 +1,37 @@
        +/* Serbian i18n for the jQuery UI date picker plugin. */
        +/* Written by Dejan Dimić. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "sr-SR" ] = {
        +	closeText: "Zatvori",
        +	prevText: "&#x3C;",
        +	nextText: "&#x3E;",
        +	currentText: "Danas",
        +	monthNames: [ "Januar","Februar","Mart","April","Maj","Jun",
        +	"Jul","Avgust","Septembar","Oktobar","Novembar","Decembar" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
        +	"Jul","Avg","Sep","Okt","Nov","Dec" ],
        +	dayNames: [ "Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota" ],
        +	dayNamesShort: [ "Ned","Pon","Uto","Sre","Čet","Pet","Sub" ],
        +	dayNamesMin: [ "Ne","Po","Ut","Sr","Če","Pe","Su" ],
        +	weekHeader: "Sed",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional[ "sr-SR" ] );
        +
        +return datepicker.regional[ "sr-SR" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-sr.js b/bower_components/jquery-ui/ui/i18n/datepicker-sr.js
        new file mode 100644
        index 0000000000..fa8827aa12
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-sr.js
        @@ -0,0 +1,37 @@
        +/* Serbian i18n for the jQuery UI date picker plugin. */
        +/* Written by Dejan Dimić. */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.sr = {
        +	closeText: "Затвори",
        +	prevText: "&#x3C;",
        +	nextText: "&#x3E;",
        +	currentText: "Данас",
        +	monthNames: [ "Јануар","Фебруар","Март","Април","Мај","Јун",
        +	"Јул","Август","Септембар","Октобар","Новембар","Децембар" ],
        +	monthNamesShort: [ "Јан","Феб","Мар","Апр","Мај","Јун",
        +	"Јул","Авг","Сеп","Окт","Нов","Дец" ],
        +	dayNames: [ "Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота" ],
        +	dayNamesShort: [ "Нед","Пон","Уто","Сре","Чет","Пет","Суб" ],
        +	dayNamesMin: [ "Не","По","Ут","Ср","Че","Пе","Су" ],
        +	weekHeader: "Сед",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.sr );
        +
        +return datepicker.regional.sr;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-sv.js b/bower_components/jquery-ui/ui/i18n/datepicker-sv.js
        new file mode 100644
        index 0000000000..92686efa4f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-sv.js
        @@ -0,0 +1,37 @@
        +/* Swedish initialisation for the jQuery UI date picker plugin. */
        +/* Written by Anders Ekdahl ( anders@nomadiz.se). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.sv = {
        +	closeText: "Stäng",
        +	prevText: "&#xAB;Förra",
        +	nextText: "Nästa&#xBB;",
        +	currentText: "Idag",
        +	monthNames: [ "Januari","Februari","Mars","April","Maj","Juni",
        +	"Juli","Augusti","September","Oktober","November","December" ],
        +	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
        +	"Jul","Aug","Sep","Okt","Nov","Dec" ],
        +	dayNamesShort: [ "Sön","Mån","Tis","Ons","Tor","Fre","Lör" ],
        +	dayNames: [ "Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag" ],
        +	dayNamesMin: [ "Sö","Må","Ti","On","To","Fr","Lö" ],
        +	weekHeader: "Ve",
        +	dateFormat: "yy-mm-dd",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.sv );
        +
        +return datepicker.regional.sv;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-ta.js b/bower_components/jquery-ui/ui/i18n/datepicker-ta.js
        new file mode 100644
        index 0000000000..722614dd06
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-ta.js
        @@ -0,0 +1,53 @@
        +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by S A Sureshkumar (saskumar@live.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.ta = {
        +	closeText: "மூடு",
        +	prevText: "முன்னையது",
        +	nextText: "அடுத்தது",
        +	currentText: "இன்று",
        +	monthNames: [ "தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி",
        +	"ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி" ],
        +	monthNamesShort: [ "தை","மாசி","பங்","சித்","வைகா","ஆனி",
        +	"ஆடி","ஆவ","புர","ஐப்","கார்","மார்" ],
        +	dayNames: [
        +		"ஞாயிற்றுக்கிழமை",
        +		"திங்கட்கிழமை",
        +		"செவ்வாய்க்கிழமை",
        +		"புதன்கிழமை",
        +		"வியாழக்கிழமை",
        +		"வெள்ளிக்கிழமை",
        +		"சனிக்கிழமை"
        +	],
        +	dayNamesShort: [
        +		"ஞாயிறு",
        +		"திங்கள்",
        +		"செவ்வாய்",
        +		"புதன்",
        +		"வியாழன்",
        +		"வெள்ளி",
        +		"சனி"
        +	],
        +	dayNamesMin: [ "ஞா","தி","செ","பு","வி","வெ","ச" ],
        +	weekHeader: "Не",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.ta );
        +
        +return datepicker.regional.ta;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-th.js b/bower_components/jquery-ui/ui/i18n/datepicker-th.js
        new file mode 100644
        index 0000000000..6de48cf968
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-th.js
        @@ -0,0 +1,37 @@
        +/* Thai initialisation for the jQuery UI date picker plugin. */
        +/* Written by pipo (pipo@sixhead.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.th = {
        +	closeText: "ปิด",
        +	prevText: "&#xAB;&#xA0;ย้อน",
        +	nextText: "ถัดไป&#xA0;&#xBB;",
        +	currentText: "วันนี้",
        +	monthNames: [ "มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน",
        +	"กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม" ],
        +	monthNamesShort: [ "ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.",
        +	"ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค." ],
        +	dayNames: [ "อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์" ],
        +	dayNamesShort: [ "อา.","จ.","อ.","พ.","พฤ.","ศ.","ส." ],
        +	dayNamesMin: [ "อา.","จ.","อ.","พ.","พฤ.","ศ.","ส." ],
        +	weekHeader: "Wk",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.th );
        +
        +return datepicker.regional.th;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-tj.js b/bower_components/jquery-ui/ui/i18n/datepicker-tj.js
        new file mode 100644
        index 0000000000..8ede4ddcb0
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-tj.js
        @@ -0,0 +1,37 @@
        +/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.tj = {
        +	closeText: "Идома",
        +	prevText: "&#x3c;Қафо",
        +	nextText: "Пеш&#x3e;",
        +	currentText: "Имрӯз",
        +	monthNames: [ "Январ","Феврал","Март","Апрел","Май","Июн",
        +	"Июл","Август","Сентябр","Октябр","Ноябр","Декабр" ],
        +	monthNamesShort: [ "Янв","Фев","Мар","Апр","Май","Июн",
        +	"Июл","Авг","Сен","Окт","Ноя","Дек" ],
        +	dayNames: [ "якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе" ],
        +	dayNamesShort: [ "якш","душ","сеш","чор","пан","ҷум","шан" ],
        +	dayNamesMin: [ "Як","Дш","Сш","Чш","Пш","Ҷм","Шн" ],
        +	weekHeader: "Хф",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.tj );
        +
        +return datepicker.regional.tj;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-tr.js b/bower_components/jquery-ui/ui/i18n/datepicker-tr.js
        new file mode 100644
        index 0000000000..8328e21992
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-tr.js
        @@ -0,0 +1,37 @@
        +/* Turkish initialisation for the jQuery UI date picker plugin. */
        +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.tr = {
        +	closeText: "kapat",
        +	prevText: "&#x3C;geri",
        +	nextText: "ileri&#x3e",
        +	currentText: "bugün",
        +	monthNames: [ "Ocak","Şubat","Mart","Nisan","Mayıs","Haziran",
        +	"Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık" ],
        +	monthNamesShort: [ "Oca","Şub","Mar","Nis","May","Haz",
        +	"Tem","Ağu","Eyl","Eki","Kas","Ara" ],
        +	dayNames: [ "Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi" ],
        +	dayNamesShort: [ "Pz","Pt","Sa","Ça","Pe","Cu","Ct" ],
        +	dayNamesMin: [ "Pz","Pt","Sa","Ça","Pe","Cu","Ct" ],
        +	weekHeader: "Hf",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.tr );
        +
        +return datepicker.regional.tr;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-uk.js b/bower_components/jquery-ui/ui/i18n/datepicker-uk.js
        new file mode 100644
        index 0000000000..c82501ad28
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-uk.js
        @@ -0,0 +1,38 @@
        +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
        +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
        +/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.uk = {
        +	closeText: "Закрити",
        +	prevText: "&#x3C;",
        +	nextText: "&#x3E;",
        +	currentText: "Сьогодні",
        +	monthNames: [ "Січень","Лютий","Березень","Квітень","Травень","Червень",
        +	"Липень","Серпень","Вересень","Жовтень","Листопад","Грудень" ],
        +	monthNamesShort: [ "Січ","Лют","Бер","Кві","Тра","Чер",
        +	"Лип","Сер","Вер","Жов","Лис","Гру" ],
        +	dayNames: [ "неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота" ],
        +	dayNamesShort: [ "нед","пнд","вів","срд","чтв","птн","сбт" ],
        +	dayNamesMin: [ "Нд","Пн","Вт","Ср","Чт","Пт","Сб" ],
        +	weekHeader: "Тиж",
        +	dateFormat: "dd.mm.yy",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.uk );
        +
        +return datepicker.regional.uk;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-vi.js b/bower_components/jquery-ui/ui/i18n/datepicker-vi.js
        new file mode 100644
        index 0000000000..2c208ab71c
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-vi.js
        @@ -0,0 +1,37 @@
        +/* Vietnamese initialisation for the jQuery UI date picker plugin. */
        +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional.vi = {
        +	closeText: "Đóng",
        +	prevText: "&#x3C;Trước",
        +	nextText: "Tiếp&#x3E;",
        +	currentText: "Hôm nay",
        +	monthNames: [ "Tháng Một", "Tháng Hai", "Tháng Ba", "Tháng Tư", "Tháng Năm", "Tháng Sáu",
        +	"Tháng Bảy", "Tháng Tám", "Tháng Chín", "Tháng Mười", "Tháng Mười Một", "Tháng Mười Hai" ],
        +	monthNamesShort: [ "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6",
        +	"Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12" ],
        +	dayNames: [ "Chủ Nhật", "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy" ],
        +	dayNamesShort: [ "CN", "T2", "T3", "T4", "T5", "T6", "T7" ],
        +	dayNamesMin: [ "CN", "T2", "T3", "T4", "T5", "T6", "T7" ],
        +	weekHeader: "Tu",
        +	dateFormat: "dd/mm/yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: false,
        +	yearSuffix: "" };
        +datepicker.setDefaults( datepicker.regional.vi );
        +
        +return datepicker.regional.vi;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-zh-CN.js b/bower_components/jquery-ui/ui/i18n/datepicker-zh-CN.js
        new file mode 100644
        index 0000000000..91f99b4ed5
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-zh-CN.js
        @@ -0,0 +1,37 @@
        +/* Chinese initialisation for the jQuery UI date picker plugin. */
        +/* Written by Cloudream (cloudream@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "zh-CN" ] = {
        +	closeText: "关闭",
        +	prevText: "&#x3C;上月",
        +	nextText: "下月&#x3E;",
        +	currentText: "今天",
        +	monthNames: [ "一月","二月","三月","四月","五月","六月",
        +	"七月","八月","九月","十月","十一月","十二月" ],
        +	monthNamesShort: [ "一月","二月","三月","四月","五月","六月",
        +	"七月","八月","九月","十月","十一月","十二月" ],
        +	dayNames: [ "星期日","星期一","星期二","星期三","星期四","星期五","星期六" ],
        +	dayNamesShort: [ "周日","周一","周二","周三","周四","周五","周六" ],
        +	dayNamesMin: [ "日","一","二","三","四","五","六" ],
        +	weekHeader: "周",
        +	dateFormat: "yy-mm-dd",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: true,
        +	yearSuffix: "年" };
        +datepicker.setDefaults( datepicker.regional[ "zh-CN" ] );
        +
        +return datepicker.regional[ "zh-CN" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-zh-HK.js b/bower_components/jquery-ui/ui/i18n/datepicker-zh-HK.js
        new file mode 100644
        index 0000000000..27f02bc659
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-zh-HK.js
        @@ -0,0 +1,37 @@
        +/* Chinese initialisation for the jQuery UI date picker plugin. */
        +/* Written by SCCY (samuelcychan@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "zh-HK" ] = {
        +	closeText: "關閉",
        +	prevText: "&#x3C;上月",
        +	nextText: "下月&#x3E;",
        +	currentText: "今天",
        +	monthNames: [ "一月","二月","三月","四月","五月","六月",
        +	"七月","八月","九月","十月","十一月","十二月" ],
        +	monthNamesShort: [ "一月","二月","三月","四月","五月","六月",
        +	"七月","八月","九月","十月","十一月","十二月" ],
        +	dayNames: [ "星期日","星期一","星期二","星期三","星期四","星期五","星期六" ],
        +	dayNamesShort: [ "周日","周一","周二","周三","周四","周五","周六" ],
        +	dayNamesMin: [ "日","一","二","三","四","五","六" ],
        +	weekHeader: "周",
        +	dateFormat: "dd-mm-yy",
        +	firstDay: 0,
        +	isRTL: false,
        +	showMonthAfterYear: true,
        +	yearSuffix: "年" };
        +datepicker.setDefaults( datepicker.regional[ "zh-HK" ] );
        +
        +return datepicker.regional[ "zh-HK" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/i18n/datepicker-zh-TW.js b/bower_components/jquery-ui/ui/i18n/datepicker-zh-TW.js
        new file mode 100644
        index 0000000000..c20754bd51
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/i18n/datepicker-zh-TW.js
        @@ -0,0 +1,37 @@
        +/* Chinese initialisation for the jQuery UI date picker plugin. */
        +/* Written by Ressol (ressol@gmail.com). */
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "../widgets/datepicker" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery.datepicker );
        +	}
        +}( function( datepicker ) {
        +
        +datepicker.regional[ "zh-TW" ] = {
        +	closeText: "關閉",
        +	prevText: "&#x3C;上月",
        +	nextText: "下月&#x3E;",
        +	currentText: "今天",
        +	monthNames: [ "一月","二月","三月","四月","五月","六月",
        +	"七月","八月","九月","十月","十一月","十二月" ],
        +	monthNamesShort: [ "一月","二月","三月","四月","五月","六月",
        +	"七月","八月","九月","十月","十一月","十二月" ],
        +	dayNames: [ "星期日","星期一","星期二","星期三","星期四","星期五","星期六" ],
        +	dayNamesShort: [ "周日","周一","周二","周三","周四","周五","周六" ],
        +	dayNamesMin: [ "日","一","二","三","四","五","六" ],
        +	weekHeader: "周",
        +	dateFormat: "yy/mm/dd",
        +	firstDay: 1,
        +	isRTL: false,
        +	showMonthAfterYear: true,
        +	yearSuffix: "年" };
        +datepicker.setDefaults( datepicker.regional[ "zh-TW" ] );
        +
        +return datepicker.regional[ "zh-TW" ];
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/ie.js b/bower_components/jquery-ui/ui/ie.js
        new file mode 100644
        index 0000000000..1ce6a8450d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/ie.js
        @@ -0,0 +1,15 @@
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +// This file is deprecated
        +return $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/jquery-1-7.js b/bower_components/jquery-ui/ui/jquery-1-7.js
        new file mode 100644
        index 0000000000..252b427609
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/jquery-1-7.js
        @@ -0,0 +1,89 @@
        +/*!
        + * jQuery UI Support for jQuery core 1.7.x 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + */
        +
        +//>>label: jQuery 1.7 Support
        +//>>group: Core
        +//>>description: Support version 1.7.x of jQuery core
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +// Support: jQuery 1.7 only
        +// Not a great way to check versions, but since we only support 1.7+ and only
        +// need to detect <1.8, this is a simple check that should suffice. Checking
        +// for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0
        +// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting
        +// 1.7 anymore). See #11197 for why we're not using feature detection.
        +if ( $.fn.jquery.substring( 0, 3 ) === "1.7" ) {
        +
        +	// Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight()
        +	// Unlike jQuery Core 1.8+, these only support numeric values to set the
        +	// dimensions in pixels
        +	$.each( [ "Width", "Height" ], function( i, name ) {
        +		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
        +			type = name.toLowerCase(),
        +			orig = {
        +				innerWidth: $.fn.innerWidth,
        +				innerHeight: $.fn.innerHeight,
        +				outerWidth: $.fn.outerWidth,
        +				outerHeight: $.fn.outerHeight
        +			};
        +
        +		function reduce( elem, size, border, margin ) {
        +			$.each( side, function() {
        +				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
        +				if ( border ) {
        +					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
        +				}
        +				if ( margin ) {
        +					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
        +				}
        +			} );
        +			return size;
        +		}
        +
        +		$.fn[ "inner" + name ] = function( size ) {
        +			if ( size === undefined ) {
        +				return orig[ "inner" + name ].call( this );
        +			}
        +
        +			return this.each( function() {
        +				$( this ).css( type, reduce( this, size ) + "px" );
        +			} );
        +		};
        +
        +		$.fn[ "outer" + name ] = function( size, margin ) {
        +			if ( typeof size !== "number" ) {
        +				return orig[ "outer" + name ].call( this, size );
        +			}
        +
        +			return this.each( function() {
        +				$( this ).css( type, reduce( this, size, true, margin ) + "px" );
        +			} );
        +		};
        +	} );
        +
        +	$.fn.addBack = function( selector ) {
        +		return this.add( selector == null ?
        +			this.prevObject : this.prevObject.filter( selector )
        +		);
        +	};
        +}
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/keycode.js b/bower_components/jquery-ui/ui/keycode.js
        new file mode 100644
        index 0000000000..c02a6df52b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/keycode.js
        @@ -0,0 +1,45 @@
        +/*!
        + * jQuery UI Keycode 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Keycode
        +//>>group: Core
        +//>>description: Provide keycodes as keynames
        +//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +return $.ui.keyCode = {
        +	BACKSPACE: 8,
        +	COMMA: 188,
        +	DELETE: 46,
        +	DOWN: 40,
        +	END: 35,
        +	ENTER: 13,
        +	ESCAPE: 27,
        +	HOME: 36,
        +	LEFT: 37,
        +	PAGE_DOWN: 34,
        +	PAGE_UP: 33,
        +	PERIOD: 190,
        +	RIGHT: 39,
        +	SPACE: 32,
        +	TAB: 9,
        +	UP: 38
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/labels.js b/bower_components/jquery-ui/ui/labels.js
        new file mode 100644
        index 0000000000..57ab75267f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/labels.js
        @@ -0,0 +1,62 @@
        +/*!
        + * jQuery UI Labels 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: labels
        +//>>group: Core
        +//>>description: Find all the labels associated with a given input
        +//>>docs: http://api.jqueryui.com/labels/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version", "./escape-selector" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +return $.fn.labels = function() {
        +	var ancestor, selector, id, labels, ancestors;
        +
        +	// Check control.labels first
        +	if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
        +		return this.pushStack( this[ 0 ].labels );
        +	}
        +
        +	// Support: IE <= 11, FF <= 37, Android <= 2.3 only
        +	// Above browsers do not support control.labels. Everything below is to support them
        +	// as well as document fragments. control.labels does not work on document fragments
        +	labels = this.eq( 0 ).parents( "label" );
        +
        +	// Look for the label based on the id
        +	id = this.attr( "id" );
        +	if ( id ) {
        +
        +		// We don't search against the document in case the element
        +		// is disconnected from the DOM
        +		ancestor = this.eq( 0 ).parents().last();
        +
        +		// Get a full set of top level ancestors
        +		ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
        +
        +		// Create a selector for the label based on the id
        +		selector = "label[for='" + $.ui.escapeSelector( id ) + "']";
        +
        +		labels = labels.add( ancestors.find( selector ).addBack( selector ) );
        +
        +	}
        +
        +	// Return whatever we have found for labels
        +	return this.pushStack( labels );
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/minified/core.js b/bower_components/jquery-ui/ui/minified/core.js
        new file mode 100644
        index 0000000000..11192b62ef
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/core.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(){define(["jquery","./data","./disable-selection","./focusable","./form","./ie","./keycode","./labels","./jquery-1-7","./plugin","./safe-active-element","./safe-blur","./scroll-parent","./tabbable","./unique-id","./version"])}();
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/data.js b/bower_components/jquery-ui/ui/minified/data.js
        new file mode 100644
        index 0000000000..7da59216f8
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/data.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])}})});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/disable-selection.js b/bower_components/jquery-ui/ui/minified/disable-selection.js
        new file mode 100644
        index 0000000000..52058d1183
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/disable-selection.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.fn.extend({disableSelection:function(){var a="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(a+".ui-disableSelection",function(a){a.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}})});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/effect.js b/bower_components/jquery-ui/ui/minified/effect.js
        new file mode 100644
        index 0000000000..ab41475626
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/effect.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){var b="ui-effects-",c="ui-effects-style",d="ui-effects-animated",e=a;return a.effects={effect:{}},function(a,b){function c(a,b,c){var d=l[b.type]||{};return null==a?c||!b.def?null:b.def:(a=d.floor?~~a:parseFloat(a),isNaN(a)?b.def:d.mod?(a+d.mod)%d.mod:0>a?0:d.max<a?d.max:a)}function d(b){var c=j(),d=c._rgba=[];return b=b.toLowerCase(),o(i,function(a,e){var f,g=e.re.exec(b),h=g&&e.parse(g),i=e.space||"rgba";if(h)return f=c[i](h),c[k[i].cache]=f[k[i].cache],d=c._rgba=f._rgba,!1}),d.length?("0,0,0,0"===d.join()&&a.extend(d,f.transparent),c):f[b]}function e(a,b,c){return c=(c+1)%1,6*c<1?a+(b-a)*c*6:2*c<1?b:3*c<2?a+(b-a)*(2/3-c)*6:a}var f,g="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",h=/^([\-+])=\s*(\d+\.?\d*)/,i=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(a){return[a[1],a[2]/100,a[3]/100,a[4]]}}],j=a.Color=function(b,c,d,e){return new a.Color.fn.parse(b,c,d,e)},k={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},l={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},m=j.support={},n=a("<p>")[0],o=a.each;n.style.cssText="background-color:rgba(1,1,1,.5)",m.rgba=n.style.backgroundColor.indexOf("rgba")>-1,o(k,function(a,b){b.cache="_"+a,b.props.alpha={idx:3,type:"percent",def:1}}),j.fn=a.extend(j.prototype,{parse:function(e,g,h,i){if(e===b)return this._rgba=[null,null,null,null],this;(e.jquery||e.nodeType)&&(e=a(e).css(g),g=b);var l=this,m=a.type(e),n=this._rgba=[];return g!==b&&(e=[e,g,h,i],m="array"),"string"===m?this.parse(d(e)||f._default):"array"===m?(o(k.rgba.props,function(a,b){n[b.idx]=c(e[b.idx],b)}),this):"object"===m?(e instanceof j?o(k,function(a,b){e[b.cache]&&(l[b.cache]=e[b.cache].slice())}):o(k,function(b,d){var f=d.cache;o(d.props,function(a,b){if(!l[f]&&d.to){if("alpha"===a||null==e[a])return;l[f]=d.to(l._rgba)}l[f][b.idx]=c(e[a],b,!0)}),l[f]&&a.inArray(null,l[f].slice(0,3))<0&&(l[f][3]=1,d.from&&(l._rgba=d.from(l[f])))}),this):void 0},is:function(a){var b=j(a),c=!0,d=this;return o(k,function(a,e){var f,g=b[e.cache];return g&&(f=d[e.cache]||e.to&&e.to(d._rgba)||[],o(e.props,function(a,b){if(null!=g[b.idx])return c=g[b.idx]===f[b.idx]})),c}),c},_space:function(){var a=[],b=this;return o(k,function(c,d){b[d.cache]&&a.push(c)}),a.pop()},transition:function(a,b){var d=j(a),e=d._space(),f=k[e],g=0===this.alpha()?j("transparent"):this,h=g[f.cache]||f.to(g._rgba),i=h.slice();return d=d[f.cache],o(f.props,function(a,e){var f=e.idx,g=h[f],j=d[f],k=l[e.type]||{};null!==j&&(null===g?i[f]=j:(k.mod&&(j-g>k.mod/2?g+=k.mod:g-j>k.mod/2&&(g-=k.mod)),i[f]=c((j-g)*b+g,e)))}),this[e](i)},blend:function(b){if(1===this._rgba[3])return this;var c=this._rgba.slice(),d=c.pop(),e=j(b)._rgba;return j(a.map(c,function(a,b){return(1-d)*e[b]+d*a}))},toRgbaString:function(){var b="rgba(",c=a.map(this._rgba,function(a,b){return null==a?b>2?1:0:a});return 1===c[3]&&(c.pop(),b="rgb("),b+c.join()+")"},toHslaString:function(){var b="hsla(",c=a.map(this.hsla(),function(a,b){return null==a&&(a=b>2?1:0),b&&b<3&&(a=Math.round(100*a)+"%"),a});return 1===c[3]&&(c.pop(),b="hsl("),b+c.join()+")"},toHexString:function(b){var c=this._rgba.slice(),d=c.pop();return b&&c.push(~~(255*d)),"#"+a.map(c,function(a){return a=(a||0).toString(16),1===a.length?"0"+a:a}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),j.fn.parse.prototype=j.fn,k.hsla.to=function(a){if(null==a[0]||null==a[1]||null==a[2])return[null,null,null,a[3]];var b,c,d=a[0]/255,e=a[1]/255,f=a[2]/255,g=a[3],h=Math.max(d,e,f),i=Math.min(d,e,f),j=h-i,k=h+i,l=.5*k;return b=i===h?0:d===h?60*(e-f)/j+360:e===h?60*(f-d)/j+120:60*(d-e)/j+240,c=0===j?0:l<=.5?j/k:j/(2-k),[Math.round(b)%360,c,l,null==g?1:g]},k.hsla.from=function(a){if(null==a[0]||null==a[1]||null==a[2])return[null,null,null,a[3]];var b=a[0]/360,c=a[1],d=a[2],f=a[3],g=d<=.5?d*(1+c):d+c-d*c,h=2*d-g;return[Math.round(255*e(h,g,b+1/3)),Math.round(255*e(h,g,b)),Math.round(255*e(h,g,b-1/3)),f]},o(k,function(d,e){var f=e.props,g=e.cache,i=e.to,k=e.from;j.fn[d]=function(d){if(i&&!this[g]&&(this[g]=i(this._rgba)),d===b)return this[g].slice();var e,h=a.type(d),l="array"===h||"object"===h?d:arguments,m=this[g].slice();return o(f,function(a,b){var d=l["object"===h?a:b.idx];null==d&&(d=m[b.idx]),m[b.idx]=c(d,b)}),k?(e=j(k(m)),e[g]=m,e):j(m)},o(f,function(b,c){j.fn[b]||(j.fn[b]=function(e){var f,g=a.type(e),i="alpha"===b?this._hsla?"hsla":"rgba":d,j=this[i](),k=j[c.idx];return"undefined"===g?k:("function"===g&&(e=e.call(this,k),g=a.type(e)),null==e&&c.empty?this:("string"===g&&(f=h.exec(e),f&&(e=k+parseFloat(f[2])*("+"===f[1]?1:-1))),j[c.idx]=e,this[i](j)))})})}),j.hook=function(b){var c=b.split(" ");o(c,function(b,c){a.cssHooks[c]={set:function(b,e){var f,g,h="";if("transparent"!==e&&("string"!==a.type(e)||(f=d(e)))){if(e=j(f||e),!m.rgba&&1!==e._rgba[3]){for(g="backgroundColor"===c?b.parentNode:b;(""===h||"transparent"===h)&&g&&g.style;)try{h=a.css(g,"backgroundColor"),g=g.parentNode}catch(i){}e=e.blend(h&&"transparent"!==h?h:"_default")}e=e.toRgbaString()}try{b.style[c]=e}catch(i){}}},a.fx.step[c]=function(b){b.colorInit||(b.start=j(b.elem,c),b.end=j(b.end),b.colorInit=!0),a.cssHooks[c].set(b.elem,b.start.transition(b.end,b.pos))}})},j.hook(g),a.cssHooks.borderColor={expand:function(a){var b={};return o(["Top","Right","Bottom","Left"],function(c,d){b["border"+d+"Color"]=a}),b}},f=a.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(e),function(){function b(b){var c,d,e=b.ownerDocument.defaultView?b.ownerDocument.defaultView.getComputedStyle(b,null):b.currentStyle,f={};if(e&&e.length&&e[0]&&e[e[0]])for(d=e.length;d--;)c=e[d],"string"==typeof e[c]&&(f[a.camelCase(c)]=e[c]);else for(c in e)"string"==typeof e[c]&&(f[c]=e[c]);return f}function c(b,c){var d,e,g={};for(d in c)e=c[d],b[d]!==e&&(f[d]||!a.fx.step[d]&&isNaN(parseFloat(e))||(g[d]=e));return g}var d=["add","remove","toggle"],f={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(b,c){a.fx.step[c]=function(a){("none"!==a.end&&!a.setAttr||1===a.pos&&!a.setAttr)&&(e.style(a.elem,c,a.end),a.setAttr=!0)}}),a.fn.addBack||(a.fn.addBack=function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}),a.effects.animateClass=function(e,f,g,h){var i=a.speed(f,g,h);return this.queue(function(){var f,g=a(this),h=g.attr("class")||"",j=i.children?g.find("*").addBack():g;j=j.map(function(){var c=a(this);return{el:c,start:b(this)}}),f=function(){a.each(d,function(a,b){e[b]&&g[b+"Class"](e[b])})},f(),j=j.map(function(){return this.end=b(this.el[0]),this.diff=c(this.start,this.end),this}),g.attr("class",h),j=j.map(function(){var b=this,c=a.Deferred(),d=a.extend({},i,{queue:!1,complete:function(){c.resolve(b)}});return this.el.animate(this.diff,d),c.promise()}),a.when.apply(a,j.get()).done(function(){f(),a.each(arguments,function(){var b=this.el;a.each(this.diff,function(a){b.css(a,"")})}),i.complete.call(g[0])})})},a.fn.extend({addClass:function(b){return function(c,d,e,f){return d?a.effects.animateClass.call(this,{add:c},d,e,f):b.apply(this,arguments)}}(a.fn.addClass),removeClass:function(b){return function(c,d,e,f){return arguments.length>1?a.effects.animateClass.call(this,{remove:c},d,e,f):b.apply(this,arguments)}}(a.fn.removeClass),toggleClass:function(b){return function(c,d,e,f,g){return"boolean"==typeof d||void 0===d?e?a.effects.animateClass.call(this,d?{add:c}:{remove:c},e,f,g):b.apply(this,arguments):a.effects.animateClass.call(this,{toggle:c},d,e,f)}}(a.fn.toggleClass),switchClass:function(b,c,d,e,f){return a.effects.animateClass.call(this,{add:c,remove:b},d,e,f)}})}(),function(){function e(b,c,d,e){return a.isPlainObject(b)&&(c=b,b=b.effect),b={effect:b},null==c&&(c={}),a.isFunction(c)&&(e=c,d=null,c={}),("number"==typeof c||a.fx.speeds[c])&&(e=d,d=c,c={}),a.isFunction(d)&&(e=d,d=null),c&&a.extend(b,c),d=d||c.duration,b.duration=a.fx.off?0:"number"==typeof d?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,b.complete=e||c.complete,b}function f(b){return!(b&&"number"!=typeof b&&!a.fx.speeds[b])||("string"==typeof b&&!a.effects.effect[b]||(!!a.isFunction(b)||"object"==typeof b&&!b.effect))}function g(a,b){var c=b.outerWidth(),d=b.outerHeight(),e=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,f=e.exec(a)||["",0,c,d,0];return{top:parseFloat(f[1])||0,right:"auto"===f[2]?c:parseFloat(f[2]),bottom:"auto"===f[3]?d:parseFloat(f[3]),left:parseFloat(f[4])||0}}a.expr&&a.expr.filters&&a.expr.filters.animated&&(a.expr.filters.animated=function(b){return function(c){return!!a(c).data(d)||b(c)}}(a.expr.filters.animated)),a.uiBackCompat!==!1&&a.extend(a.effects,{save:function(a,c){for(var d=0,e=c.length;d<e;d++)null!==c[d]&&a.data(b+c[d],a[0].style[c[d]])},restore:function(a,c){for(var d,e=0,f=c.length;e<f;e++)null!==c[e]&&(d=a.data(b+c[e]),a.css(c[e],d))},setMode:function(a,b){return"toggle"===b&&(b=a.is(":hidden")?"show":"hide"),b},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper"))return b.parent();var c={width:b.outerWidth(!0),height:b.outerHeight(!0),"float":b.css("float")},d=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e={width:b.width(),height:b.height()},f=document.activeElement;try{f.id}catch(g){f=document.body}return b.wrap(d),(b[0]===f||a.contains(b[0],f))&&a(f).trigger("focus"),d=b.parent(),"static"===b.css("position")?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),b.css(e),d.css(c).show()},removeWrapper:function(b){var c=document.activeElement;return b.parent().is(".ui-effects-wrapper")&&(b.parent().replaceWith(b),(b[0]===c||a.contains(b[0],c))&&a(c).trigger("focus")),b}}),a.extend(a.effects,{version:"1.12.1",define:function(b,c,d){return d||(d=c,c="effect"),a.effects.effect[b]=d,a.effects.effect[b].mode=c,d},scaledDimensions:function(a,b,c){if(0===b)return{height:0,width:0,outerHeight:0,outerWidth:0};var d="horizontal"!==c?(b||100)/100:1,e="vertical"!==c?(b||100)/100:1;return{height:a.height()*e,width:a.width()*d,outerHeight:a.outerHeight()*e,outerWidth:a.outerWidth()*d}},clipToBox:function(a){return{width:a.clip.right-a.clip.left,height:a.clip.bottom-a.clip.top,left:a.clip.left,top:a.clip.top}},unshift:function(a,b,c){var d=a.queue();b>1&&d.splice.apply(d,[1,0].concat(d.splice(b,c))),a.dequeue()},saveStyle:function(a){a.data(c,a[0].style.cssText)},restoreStyle:function(a){a[0].style.cssText=a.data(c)||"",a.removeData(c)},mode:function(a,b){var c=a.is(":hidden");return"toggle"===b&&(b=c?"show":"hide"),(c?"hide"===b:"show"===b)&&(b="none"),b},getBaseline:function(a,b){var c,d;switch(a[0]){case"top":c=0;break;case"middle":c=.5;break;case"bottom":c=1;break;default:c=a[0]/b.height}switch(a[1]){case"left":d=0;break;case"center":d=.5;break;case"right":d=1;break;default:d=a[1]/b.width}return{x:d,y:c}},createPlaceholder:function(c){var d,e=c.css("position"),f=c.position();return c.css({marginTop:c.css("marginTop"),marginBottom:c.css("marginBottom"),marginLeft:c.css("marginLeft"),marginRight:c.css("marginRight")}).outerWidth(c.outerWidth()).outerHeight(c.outerHeight()),/^(static|relative)/.test(e)&&(e="absolute",d=a("<"+c[0].nodeName+">").insertAfter(c).css({display:/^(inline|ruby)/.test(c.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:c.css("marginTop"),marginBottom:c.css("marginBottom"),marginLeft:c.css("marginLeft"),marginRight:c.css("marginRight"),"float":c.css("float")}).outerWidth(c.outerWidth()).outerHeight(c.outerHeight()).addClass("ui-effects-placeholder"),c.data(b+"placeholder",d)),c.css({position:e,left:f.left,top:f.top}),d},removePlaceholder:function(a){var c=b+"placeholder",d=a.data(c);d&&(d.remove(),a.removeData(c))},cleanUp:function(b){a.effects.restoreStyle(b),a.effects.removePlaceholder(b)},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(){function b(b){function e(){i.removeData(d),a.effects.cleanUp(i),"hide"===c.mode&&i.hide(),h()}function h(){a.isFunction(j)&&j.call(i[0]),a.isFunction(b)&&b()}var i=a(this);c.mode=l.shift(),a.uiBackCompat===!1||g?"none"===c.mode?(i[k](),h()):f.call(i[0],c,e):(i.is(":hidden")?"hide"===k:"show"===k)?(i[k](),h()):f.call(i[0],c,h)}var c=e.apply(this,arguments),f=a.effects.effect[c.effect],g=f.mode,h=c.queue,i=h||"fx",j=c.complete,k=c.mode,l=[],m=function(b){var c=a(this),e=a.effects.mode(c,k)||g;c.data(d,!0),l.push(e),g&&("show"===e||e===g&&"hide"===e)&&c.show(),g&&"none"===e||a.effects.saveStyle(c),a.isFunction(b)&&b()};return a.fx.off||!f?k?this[k](c.duration,j):this.each(function(){j&&j.call(this)}):h===!1?this.each(m).each(b):this.queue(i,m).queue(i,b)},show:function(a){return function(b){if(f(b))return a.apply(this,arguments);var c=e.apply(this,arguments);return c.mode="show",this.effect.call(this,c)}}(a.fn.show),hide:function(a){return function(b){if(f(b))return a.apply(this,arguments);var c=e.apply(this,arguments);return c.mode="hide",this.effect.call(this,c)}}(a.fn.hide),toggle:function(a){return function(b){if(f(b)||"boolean"==typeof b)return a.apply(this,arguments);var c=e.apply(this,arguments);return c.mode="toggle",this.effect.call(this,c)}}(a.fn.toggle),cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d},cssClip:function(a){return a?this.css("clip","rect("+a.top+"px "+a.right+"px "+a.bottom+"px "+a.left+"px)"):g(this.css("clip"),this)},transfer:function(b,c){var d=a(this),e=a(b.to),f="fixed"===e.css("position"),g=a("body"),h=f?g.scrollTop():0,i=f?g.scrollLeft():0,j=e.offset(),k={top:j.top-h,left:j.left-i,height:e.innerHeight(),width:e.innerWidth()},l=d.offset(),m=a("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(b.className).css({top:l.top-h,left:l.left-i,height:d.innerHeight(),width:d.innerWidth(),position:f?"fixed":"absolute"}).animate(k,b.duration,b.easing,function(){m.remove(),a.isFunction(c)&&c()})}}),a.fx.step.clip=function(b){b.clipInit||(b.start=a(b.elem).cssClip(),"string"==typeof b.end&&(b.end=g(b.end,b.elem)),b.clipInit=!0),a(b.elem).cssClip({top:b.pos*(b.end.top-b.start.top)+b.start.top,right:b.pos*(b.end.right-b.start.right)+b.start.right,bottom:b.pos*(b.end.bottom-b.start.bottom)+b.start.bottom,left:b.pos*(b.end.left-b.start.left)+b.start.left})}}(),function(){var b={};a.each(["Quad","Cubic","Quart","Quint","Expo"],function(a,c){b[c]=function(b){return Math.pow(b,a+2)}}),a.extend(b,{Sine:function(a){return 1-Math.cos(a*Math.PI/2)},Circ:function(a){return 1-Math.sqrt(1-a*a)},Elastic:function(a){return 0===a||1===a?a:-Math.pow(2,8*(a-1))*Math.sin((80*(a-1)-7.5)*Math.PI/15)},Back:function(a){return a*a*(3*a-2)},Bounce:function(a){for(var b,c=4;a<((b=Math.pow(2,--c))-1)/11;);return 1/Math.pow(4,3-c)-7.5625*Math.pow((3*b-2)/22-a,2)}}),a.each(b,function(b,c){a.easing["easeIn"+b]=c,a.easing["easeOut"+b]=function(a){return 1-c(1-a)},a.easing["easeInOut"+b]=function(a){return a<.5?c(2*a)/2:1-c(a*-2+2)/2}})}(),a.effects});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/escape-selector.js b/bower_components/jquery-ui/ui/minified/escape-selector.js
        new file mode 100644
        index 0000000000..0e61ecfe85
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/escape-selector.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.ui.escapeSelector=function(){var a=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(b){return b.replace(a,"\\$1")}}()});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/focusable.js b/bower_components/jquery-ui/ui/minified/focusable.js
        new file mode 100644
        index 0000000000..78c6156c28
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/focusable.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){function b(a){for(var b=a.css("visibility");"inherit"===b;)a=a.parent(),b=a.css("visibility");return"hidden"!==b}return a.ui.focusable=function(c,d){var e,f,g,h,i,j=c.nodeName.toLowerCase();return"area"===j?(e=c.parentNode,f=e.name,!(!c.href||!f||"map"!==e.nodeName.toLowerCase())&&(g=a("img[usemap='#"+f+"']"),g.length>0&&g.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(j)?(h=!c.disabled,h&&(i=a(c).closest("fieldset")[0],i&&(h=!i.disabled))):h="a"===j?c.href||d:d,h&&a(c).is(":visible")&&b(a(c)))},a.extend(a.expr[":"],{focusable:function(b){return a.ui.focusable(b,null!=a.attr(b,"tabindex"))}}),a.ui.focusable});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/form-reset-mixin.js b/bower_components/jquery-ui/ui/minified/form-reset-mixin.js
        new file mode 100644
        index 0000000000..3378d77431
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/form-reset-mixin.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./form","./version"],a):a(jQuery)}(function(a){return a.ui.formResetMixin={_formResetHandler:function(){var b=a(this);setTimeout(function(){var c=b.data("ui-form-reset-instances");a.each(c,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var a=this.form.data("ui-form-reset-instances")||[];a.length||this.form.on("reset.ui-form-reset",this._formResetHandler),a.push(this),this.form.data("ui-form-reset-instances",a)}},_unbindFormResetHandler:function(){if(this.form.length){var b=this.form.data("ui-form-reset-instances");b.splice(a.inArray(this,b),1),b.length?this.form.data("ui-form-reset-instances",b):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/form.js b/bower_components/jquery-ui/ui/minified/form.js
        new file mode 100644
        index 0000000000..2e60eb5cf9
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/form.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):a(this[0].form)}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-af.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-af.js
        new file mode 100644
        index 0000000000..f01725fb5d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-af.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.af={closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.af),a.regional.af});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ar-DZ.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ar-DZ.js
        new file mode 100644
        index 0000000000..58888db857
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ar-DZ.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["ar-DZ"]={closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["ar-DZ"]),a.regional["ar-DZ"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ar.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ar.js
        new file mode 100644
        index 0000000000..95fddb903d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ar.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ar={closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ar),a.regional.ar});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-az.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-az.js
        new file mode 100644
        index 0000000000..7087aa7073
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-az.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.az={closeText:"Bağla",prevText:"&#x3C;Geri",nextText:"İrəli&#x3E;",currentText:"Bugün",monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthNamesShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],dayNamesShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayNamesMin:["B","B","Ç","С","Ç","C","Ş"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.az),a.regional.az});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-be.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-be.js
        new file mode 100644
        index 0000000000..b88a8b1520
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-be.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.be={closeText:"Зачыніць",prevText:"&larr;Папяр.",nextText:"Наст.&rarr;",currentText:"Сёньня",monthNames:["Студзень","Люты","Сакавік","Красавік","Травень","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Сьнежань"],monthNamesShort:["Сту","Лют","Сак","Кра","Тра","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сьн"],dayNames:["нядзеля","панядзелак","аўторак","серада","чацьвер","пятніца","субота"],dayNamesShort:["ндз","пнд","аўт","срд","чцв","птн","сбт"],dayNamesMin:["Нд","Пн","Аў","Ср","Чц","Пт","Сб"],weekHeader:"Тд",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.be),a.regional.be});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-bg.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-bg.js
        new file mode 100644
        index 0000000000..0f214a92ec
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-bg.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.bg={closeText:"затвори",prevText:"&#x3C;назад",nextText:"напред&#x3E;",nextBigText:"&#x3E;&#x3E;",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.bg),a.regional.bg});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-bs.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-bs.js
        new file mode 100644
        index 0000000000..face37e77b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-bs.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.bs={closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.bs),a.regional.bs});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ca.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ca.js
        new file mode 100644
        index 0000000000..d1336dde38
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ca.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ca={closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ca),a.regional.ca});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-cs.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-cs.js
        new file mode 100644
        index 0000000000..992e1a5104
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-cs.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.cs={closeText:"Zavřít",prevText:"&#x3C;Dříve",nextText:"Později&#x3E;",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.cs),a.regional.cs});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-cy-GB.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-cy-GB.js
        new file mode 100644
        index 0000000000..6d381c42b0
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-cy-GB.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["cy-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthNamesShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tac","Rha"],dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],dayNamesShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],dayNamesMin:["Su","Ll","Ma","Me","Ia","Gw","Sa"],weekHeader:"Wy",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["cy-GB"]),a.regional["cy-GB"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-da.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-da.js
        new file mode 100644
        index 0000000000..8a41994c8e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-da.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.da={closeText:"Luk",prevText:"&#x3C;Forrige",nextText:"Næste&#x3E;",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.da),a.regional.da});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-de.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-de.js
        new file mode 100644
        index 0000000000..ffceadca31
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-de.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.de={closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.de),a.regional.de});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-el.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-el.js
        new file mode 100644
        index 0000000000..101225960d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-el.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.el={closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Σήμερα",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.el),a.regional.el});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-AU.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-AU.js
        new file mode 100644
        index 0000000000..f5b89946e3
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-AU.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["en-AU"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["en-AU"]),a.regional["en-AU"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-GB.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-GB.js
        new file mode 100644
        index 0000000000..b0acd30765
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-GB.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["en-GB"]),a.regional["en-GB"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-NZ.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-NZ.js
        new file mode 100644
        index 0000000000..264dfd2d7b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-en-NZ.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["en-NZ"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["en-NZ"]),a.regional["en-NZ"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-eo.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-eo.js
        new file mode 100644
        index 0000000000..4cc590ad41
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-eo.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.eo={closeText:"Fermi",prevText:"&#x3C;Anta",nextText:"Sekv&#x3E;",currentText:"Nuna",monthNames:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aŭg","Sep","Okt","Nov","Dec"],dayNames:["Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato"],dayNamesShort:["Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab"],dayNamesMin:["Di","Lu","Ma","Me","Ĵa","Ve","Sa"],weekHeader:"Sb",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.eo),a.regional.eo});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-es.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-es.js
        new file mode 100644
        index 0000000000..3291f982fc
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-es.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.es={closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.es),a.regional.es});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-et.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-et.js
        new file mode 100644
        index 0000000000..4c41b0bc5b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-et.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.et={closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.et),a.regional.et});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-eu.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-eu.js
        new file mode 100644
        index 0000000000..e9d3c05ef8
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-eu.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.eu={closeText:"Egina",prevText:"&#x3C;Aur",nextText:"Hur&#x3E;",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.eu),a.regional.eu});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-fa.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fa.js
        new file mode 100644
        index 0000000000..a97326a5e3
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fa.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.fa={closeText:"بستن",prevText:"&#x3C;قبلی",nextText:"بعدی&#x3E;",currentText:"امروز",monthNames:["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.fa),a.regional.fa});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-fi.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fi.js
        new file mode 100644
        index 0000000000..c5e962d7e1
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fi.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.fi={closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.fi),a.regional.fi});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-fo.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fo.js
        new file mode 100644
        index 0000000000..79b3cc1590
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fo.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.fo={closeText:"Lat aftur",prevText:"&#x3C;Fyrra",nextText:"Næsta&#x3E;",currentText:"Í dag",monthNames:["Januar","Februar","Mars","Apríl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leyardagur"],dayNamesShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],dayNamesMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],weekHeader:"Vk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.fo),a.regional.fo});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr-CA.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr-CA.js
        new file mode 100644
        index 0000000000..cefbbf1172
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr-CA.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["fr-CA"]={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["fr-CA"]),a.regional["fr-CA"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr-CH.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr-CH.js
        new file mode 100644
        index 0000000000..e3da4973e6
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr-CH.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["fr-CH"]={closeText:"Fermer",prevText:"&#x3C;Préc",nextText:"Suiv&#x3E;",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["fr-CH"]),a.regional["fr-CH"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr.js
        new file mode 100644
        index 0000000000..736629028b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-fr.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.fr={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.fr),a.regional.fr});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-gl.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-gl.js
        new file mode 100644
        index 0000000000..8b9e8a418c
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-gl.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.gl={closeText:"Pechar",prevText:"&#x3C;Ant",nextText:"Seg&#x3E;",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.gl),a.regional.gl});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-he.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-he.js
        new file mode 100644
        index 0000000000..fd775fdc9c
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-he.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.he={closeText:"סגור",prevText:"&#x3C;הקודם",nextText:"הבא&#x3E;",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.he),a.regional.he});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-hi.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hi.js
        new file mode 100644
        index 0000000000..a1ab223def
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hi.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.hi={closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.hi),a.regional.hi});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-hr.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hr.js
        new file mode 100644
        index 0000000000..34bf168763
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hr.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.hr={closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.hr),a.regional.hr});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-hu.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hu.js
        new file mode 100644
        index 0000000000..58b8874f05
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hu.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.hu={closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},a.setDefaults(a.regional.hu),a.regional.hu});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-hy.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hy.js
        new file mode 100644
        index 0000000000..c039a6aa93
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-hy.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.hy={closeText:"Փակել",prevText:"&#x3C;Նախ.",nextText:"Հաջ.&#x3E;",currentText:"Այսօր",monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthNamesShort:["Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],dayNames:["կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],dayNamesShort:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],dayNamesMin:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],weekHeader:"ՇԲՏ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.hy),a.regional.hy});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-id.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-id.js
        new file mode 100644
        index 0000000000..62e6839f0f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-id.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.id={closeText:"Tutup",prevText:"&#x3C;mundur",nextText:"maju&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.id),a.regional.id});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-is.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-is.js
        new file mode 100644
        index 0000000000..969e0a846e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-is.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.is={closeText:"Loka",prevText:"&#x3C; Fyrri",nextText:"Næsti &#x3E;",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.is),a.regional.is});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-it-CH.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-it-CH.js
        new file mode 100644
        index 0000000000..5986c25a03
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-it-CH.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["it-CH"]={closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["it-CH"]),a.regional["it-CH"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-it.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-it.js
        new file mode 100644
        index 0000000000..942a2434d6
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-it.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.it={closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.it),a.regional.it});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ja.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ja.js
        new file mode 100644
        index 0000000000..ef3280b9d6
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ja.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ja={closeText:"閉じる",prevText:"&#x3C;前",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},a.setDefaults(a.regional.ja),a.regional.ja});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ka.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ka.js
        new file mode 100644
        index 0000000000..6691c448c9
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ka.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ka={closeText:"დახურვა",prevText:"&#x3c; წინა",nextText:"შემდეგი &#x3e;",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],weekHeader:"კვირა",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ka),a.regional.ka});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-kk.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-kk.js
        new file mode 100644
        index 0000000000..b0b8293a99
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-kk.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.kk={closeText:"Жабу",prevText:"&#x3C;Алдыңғы",nextText:"Келесі&#x3E;",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.kk),a.regional.kk});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-km.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-km.js
        new file mode 100644
        index 0000000000..a5ddf5b248
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-km.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.km={closeText:"ធ្វើ​រួច",prevText:"មុន",nextText:"បន្ទាប់",currentText:"ថ្ងៃ​នេះ",monthNames:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthNamesShort:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],dayNames:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],dayNamesShort:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],dayNamesMin:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],weekHeader:"សប្ដាហ៍",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.km),a.regional.km});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ko.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ko.js
        new file mode 100644
        index 0000000000..16ad480d34
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ko.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ko={closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"주",dateFormat:"yy. m. d.",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"},a.setDefaults(a.regional.ko),a.regional.ko});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ky.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ky.js
        new file mode 100644
        index 0000000000..a4cc9375ac
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ky.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ky={closeText:"Жабуу",prevText:"&#x3c;Мур",nextText:"Кий&#x3e;",currentText:"Бүгүн",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],dayNamesShort:["жек","дүй","шей","шар","бей","жум","ише"],dayNamesMin:["Жк","Дш","Шш","Шр","Бш","Жм","Иш"],weekHeader:"Жум",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ky),a.regional.ky});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-lb.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-lb.js
        new file mode 100644
        index 0000000000..cdb29aceae
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-lb.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.lb={closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.lb),a.regional.lb});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-lt.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-lt.js
        new file mode 100644
        index 0000000000..d6fa76b447
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-lt.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.lt={closeText:"Uždaryti",prevText:"&#x3C;Atgal",nextText:"Pirmyn&#x3E;",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},a.setDefaults(a.regional.lt),a.regional.lt});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-lv.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-lv.js
        new file mode 100644
        index 0000000000..0b23d3cd27
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-lv.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.lv={closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.lv),a.regional.lv});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-mk.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-mk.js
        new file mode 100644
        index 0000000000..6eee1c4c76
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-mk.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.mk={closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.mk),a.regional.mk});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ml.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ml.js
        new file mode 100644
        index 0000000000..d8ac49a6a5
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ml.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ml={closeText:"ശരി",prevText:"മുന്നത്തെ",nextText:"അടുത്തത് ",currentText:"ഇന്ന്",monthNames:["ജനുവരി","ഫെബ്രുവരി","മാര്‍ച്ച്","ഏപ്രില്‍","മേയ്","ജൂണ്‍","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്‍","ഒക്ടോബര്‍","നവംബര്‍","ഡിസംബര്‍"],monthNamesShort:["ജനു","ഫെബ്","മാര്‍","ഏപ്രി","മേയ്","ജൂണ്‍","ജൂലാ","ആഗ","സെപ്","ഒക്ടോ","നവം","ഡിസ"],dayNames:["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],dayNamesShort:["ഞായ","തിങ്ക","ചൊവ്വ","ബുധ","വ്യാഴം","വെള്ളി","ശനി"],dayNamesMin:["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],weekHeader:"ആ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ml),a.regional.ml});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ms.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ms.js
        new file mode 100644
        index 0000000000..a60754bfa4
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ms.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ms={closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ms),a.regional.ms});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-nb.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nb.js
        new file mode 100644
        index 0000000000..a74d3faa2e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nb.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.nb={closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.nb),a.regional.nb});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-nl-BE.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nl-BE.js
        new file mode 100644
        index 0000000000..170bbebeb5
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nl-BE.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["nl-BE"]={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["nl-BE"]),a.regional["nl-BE"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-nl.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nl.js
        new file mode 100644
        index 0000000000..c6cd6c57e1
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nl.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.nl={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.nl),a.regional.nl});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-nn.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nn.js
        new file mode 100644
        index 0000000000..6aef9f3a85
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-nn.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.nn={closeText:"Lukk",prevText:"&#xAB;Førre",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mån","tys","ons","tor","fre","lau"],dayNames:["sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","må","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.nn),a.regional.nn});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-no.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-no.js
        new file mode 100644
        index 0000000000..6feb98eb1e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-no.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.no={closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.no),a.regional.no});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-pl.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-pl.js
        new file mode 100644
        index 0000000000..50f081839f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-pl.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.pl={closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"Następny&#x3E;",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.pl),a.regional.pl});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-pt-BR.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-pt-BR.js
        new file mode 100644
        index 0000000000..1efe276601
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-pt-BR.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["pt-BR"]={closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["pt-BR"]),a.regional["pt-BR"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-pt.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-pt.js
        new file mode 100644
        index 0000000000..26252aa13b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-pt.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.pt={closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.pt),a.regional.pt});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-rm.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-rm.js
        new file mode 100644
        index 0000000000..484bf4101f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-rm.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.rm={closeText:"Serrar",prevText:"&#x3C;Suandant",nextText:"Precedent&#x3E;",currentText:"Actual",monthNames:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],monthNamesShort:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],dayNames:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],dayNamesShort:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],dayNamesMin:["Du","Gl","Ma","Me","Gi","Ve","So"],weekHeader:"emna",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.rm),a.regional.rm});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ro.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ro.js
        new file mode 100644
        index 0000000000..f23ecf3bf7
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ro.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ro={closeText:"Închide",prevText:"&#xAB; Luna precedentă",nextText:"Luna următoare &#xBB;",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ro),a.regional.ro});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ru.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ru.js
        new file mode 100644
        index 0000000000..24c20924d2
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ru.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ru={closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ru),a.regional.ru});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-sk.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sk.js
        new file mode 100644
        index 0000000000..65d4ca98c1
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sk.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.sk={closeText:"Zavrieť",prevText:"&#x3C;Predchádzajúci",nextText:"Nasledujúci&#x3E;",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.sk),a.regional.sk});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-sl.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sl.js
        new file mode 100644
        index 0000000000..f64b35d379
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sl.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.sl={closeText:"Zapri",prevText:"&#x3C;Prejšnji",nextText:"Naslednji&#x3E;",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.sl),a.regional.sl});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-sq.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sq.js
        new file mode 100644
        index 0000000000..c93a003a87
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sq.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.sq={closeText:"mbylle",prevText:"&#x3C;mbrapa",nextText:"Përpara&#x3E;",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.sq),a.regional.sq});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-sr-SR.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sr-SR.js
        new file mode 100644
        index 0000000000..07ca08d75b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sr-SR.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["sr-SR"]={closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional["sr-SR"]),a.regional["sr-SR"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-sr.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sr.js
        new file mode 100644
        index 0000000000..e3adff8189
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sr.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.sr={closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.sr),a.regional.sr});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-sv.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sv.js
        new file mode 100644
        index 0000000000..769d38562d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-sv.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.sv={closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.sv),a.regional.sv});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-ta.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ta.js
        new file mode 100644
        index 0000000000..513af5549b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-ta.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.ta={closeText:"மூடு",prevText:"முன்னையது",nextText:"அடுத்தது",currentText:"இன்று",monthNames:["தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி","ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி"],monthNamesShort:["தை","மாசி","பங்","சித்","வைகா","ஆனி","ஆடி","ஆவ","புர","ஐப்","கார்","மார்"],dayNames:["ஞாயிற்றுக்கிழமை","திங்கட்கிழமை","செவ்வாய்க்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],dayNamesShort:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],dayNamesMin:["ஞா","தி","செ","பு","வி","வெ","ச"],weekHeader:"Не",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.ta),a.regional.ta});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-th.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-th.js
        new file mode 100644
        index 0000000000..f5dc2b5fec
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-th.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.th={closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.th),a.regional.th});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-tj.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-tj.js
        new file mode 100644
        index 0000000000..5dea9f4389
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-tj.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.tj={closeText:"Идома",prevText:"&#x3c;Қафо",nextText:"Пеш&#x3e;",currentText:"Имрӯз",monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе"],dayNamesShort:["якш","душ","сеш","чор","пан","ҷум","шан"],dayNamesMin:["Як","Дш","Сш","Чш","Пш","Ҷм","Шн"],weekHeader:"Хф",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.tj),a.regional.tj});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-tr.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-tr.js
        new file mode 100644
        index 0000000000..04dd91b503
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-tr.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.tr={closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.tr),a.regional.tr});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-uk.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-uk.js
        new file mode 100644
        index 0000000000..00248797f7
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-uk.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.uk={closeText:"Закрити",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.uk),a.regional.uk});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-vi.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-vi.js
        new file mode 100644
        index 0000000000..042b261c7e
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-vi.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional.vi={closeText:"Đóng",prevText:"&#x3C;Trước",nextText:"Tiếp&#x3E;",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},a.setDefaults(a.regional.vi),a.regional.vi});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-CN.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-CN.js
        new file mode 100644
        index 0000000000..bf2f22f564
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-CN.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["zh-CN"]={closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},a.setDefaults(a.regional["zh-CN"]),a.regional["zh-CN"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-HK.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-HK.js
        new file mode 100644
        index 0000000000..44c8794693
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-HK.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["zh-HK"]={closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"dd-mm-yy",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},a.setDefaults(a.regional["zh-HK"]),a.regional["zh-HK"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-TW.js b/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-TW.js
        new file mode 100644
        index 0000000000..2593836014
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/i18n/datepicker-zh-TW.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["../widgets/datepicker"],a):a(jQuery.datepicker)}(function(a){return a.regional["zh-TW"]={closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},a.setDefaults(a.regional["zh-TW"]),a.regional["zh-TW"]});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/ie.js b/bower_components/jquery-ui/ui/minified/ie.js
        new file mode 100644
        index 0000000000..98ea6e9c7d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/ie.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase())});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/jquery-1-7.js b/bower_components/jquery-ui/ui/minified/jquery-1-7.js
        new file mode 100644
        index 0000000000..0e29948206
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/jquery-1-7.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){"1.7"===a.fn.jquery.substring(0,3)&&(a.each(["Width","Height"],function(b,c){function d(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.css(b,"padding"+this))||0,d&&(c-=parseFloat(a.css(b,"border"+this+"Width"))||0),f&&(c-=parseFloat(a.css(b,"margin"+this))||0)}),c}var e="Width"===c?["Left","Right"]:["Top","Bottom"],f=c.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+c]=function(b){return void 0===b?g["inner"+c].call(this):this.each(function(){a(this).css(f,d(this,b)+"px")})},a.fn["outer"+c]=function(b,e){return"number"!=typeof b?g["outer"+c].call(this,b):this.each(function(){a(this).css(f,d(this,b,!0,e)+"px")})}}),a.fn.addBack=function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))})});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/keycode.js b/bower_components/jquery-ui/ui/minified/keycode.js
        new file mode 100644
        index 0000000000..8dfe23ba35
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/keycode.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/labels.js b/bower_components/jquery-ui/ui/minified/labels.js
        new file mode 100644
        index 0000000000..ac28744cfc
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/labels.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version","./escape-selector"],a):a(jQuery)}(function(a){return a.fn.labels=function(){var b,c,d,e,f;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),d=this.attr("id"),d&&(b=this.eq(0).parents().last(),f=b.add(b.length?b.siblings():this.siblings()),c="label[for='"+a.ui.escapeSelector(d)+"']",e=e.add(f.find(c).addBack(c))),this.pushStack(e))}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/plugin.js b/bower_components/jquery-ui/ui/minified/plugin.js
        new file mode 100644
        index 0000000000..8094e67a87
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/plugin.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.ui.plugin={add:function(b,c,d){var e,f=a.ui[b].prototype;for(e in d)f.plugins[e]=f.plugins[e]||[],f.plugins[e].push([c,d[e]])},call:function(a,b,c,d){var e,f=a.plugins[b];if(f&&(d||a.element[0].parentNode&&11!==a.element[0].parentNode.nodeType))for(e=0;e<f.length;e++)a.options[f[e][0]]&&f[e][1].apply(a.element,c)}}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/position.js b/bower_components/jquery-ui/ui/minified/position.js
        new file mode 100644
        index 0000000000..6b615b808f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/position.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return function(){function b(a,b,c){return[parseFloat(a[0])*(l.test(a[0])?b/100:1),parseFloat(a[1])*(l.test(a[1])?c/100:1)]}function c(b,c){return parseInt(a.css(b,c),10)||0}function d(b){var c=b[0];return 9===c.nodeType?{width:b.width(),height:b.height(),offset:{top:0,left:0}}:a.isWindow(c)?{width:b.width(),height:b.height(),offset:{top:b.scrollTop(),left:b.scrollLeft()}}:c.preventDefault?{width:0,height:0,offset:{top:c.pageY,left:c.pageX}}:{width:b.outerWidth(),height:b.outerHeight(),offset:b.offset()}}var e,f=Math.max,g=Math.abs,h=/left|center|right/,i=/top|center|bottom/,j=/[\+\-]\d+(\.[\d]+)?%?/,k=/^\w+/,l=/%$/,m=a.fn.position;a.position={scrollbarWidth:function(){if(void 0!==e)return e;var b,c,d=a("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),f=d.children()[0];return a("body").append(d),b=f.offsetWidth,d.css("overflow","scroll"),c=f.offsetWidth,b===c&&(c=d[0].clientWidth),d.remove(),e=b-c},getScrollInfo:function(b){var c=b.isWindow||b.isDocument?"":b.element.css("overflow-x"),d=b.isWindow||b.isDocument?"":b.element.css("overflow-y"),e="scroll"===c||"auto"===c&&b.width<b.element[0].scrollWidth,f="scroll"===d||"auto"===d&&b.height<b.element[0].scrollHeight;return{width:f?a.position.scrollbarWidth():0,height:e?a.position.scrollbarWidth():0}},getWithinInfo:function(b){var c=a(b||window),d=a.isWindow(c[0]),e=!!c[0]&&9===c[0].nodeType,f=!d&&!e;return{element:c,isWindow:d,isDocument:e,offset:f?a(b).offset():{left:0,top:0},scrollLeft:c.scrollLeft(),scrollTop:c.scrollTop(),width:c.outerWidth(),height:c.outerHeight()}}},a.fn.position=function(e){if(!e||!e.of)return m.apply(this,arguments);e=a.extend({},e);var l,n,o,p,q,r,s=a(e.of),t=a.position.getWithinInfo(e.within),u=a.position.getScrollInfo(t),v=(e.collision||"flip").split(" "),w={};return r=d(s),s[0].preventDefault&&(e.at="left top"),n=r.width,o=r.height,p=r.offset,q=a.extend({},p),a.each(["my","at"],function(){var a,b,c=(e[this]||"").split(" ");1===c.length&&(c=h.test(c[0])?c.concat(["center"]):i.test(c[0])?["center"].concat(c):["center","center"]),c[0]=h.test(c[0])?c[0]:"center",c[1]=i.test(c[1])?c[1]:"center",a=j.exec(c[0]),b=j.exec(c[1]),w[this]=[a?a[0]:0,b?b[0]:0],e[this]=[k.exec(c[0])[0],k.exec(c[1])[0]]}),1===v.length&&(v[1]=v[0]),"right"===e.at[0]?q.left+=n:"center"===e.at[0]&&(q.left+=n/2),"bottom"===e.at[1]?q.top+=o:"center"===e.at[1]&&(q.top+=o/2),l=b(w.at,n,o),q.left+=l[0],q.top+=l[1],this.each(function(){var d,h,i=a(this),j=i.outerWidth(),k=i.outerHeight(),m=c(this,"marginLeft"),r=c(this,"marginTop"),x=j+m+c(this,"marginRight")+u.width,y=k+r+c(this,"marginBottom")+u.height,z=a.extend({},q),A=b(w.my,i.outerWidth(),i.outerHeight());"right"===e.my[0]?z.left-=j:"center"===e.my[0]&&(z.left-=j/2),"bottom"===e.my[1]?z.top-=k:"center"===e.my[1]&&(z.top-=k/2),z.left+=A[0],z.top+=A[1],d={marginLeft:m,marginTop:r},a.each(["left","top"],function(b,c){a.ui.position[v[b]]&&a.ui.position[v[b]][c](z,{targetWidth:n,targetHeight:o,elemWidth:j,elemHeight:k,collisionPosition:d,collisionWidth:x,collisionHeight:y,offset:[l[0]+A[0],l[1]+A[1]],my:e.my,at:e.at,within:t,elem:i})}),e.using&&(h=function(a){var b=p.left-z.left,c=b+n-j,d=p.top-z.top,h=d+o-k,l={target:{element:s,left:p.left,top:p.top,width:n,height:o},element:{element:i,left:z.left,top:z.top,width:j,height:k},horizontal:c<0?"left":b>0?"right":"center",vertical:h<0?"top":d>0?"bottom":"middle"};n<j&&g(b+c)<n&&(l.horizontal="center"),o<k&&g(d+h)<o&&(l.vertical="middle"),f(g(b),g(c))>f(g(d),g(h))?l.important="horizontal":l.important="vertical",e.using.call(this,a,l)}),i.offset(a.extend(z,{using:h}))})},a.ui.position={fit:{left:function(a,b){var c,d=b.within,e=d.isWindow?d.scrollLeft:d.offset.left,g=d.width,h=a.left-b.collisionPosition.marginLeft,i=e-h,j=h+b.collisionWidth-g-e;b.collisionWidth>g?i>0&&j<=0?(c=a.left+i+b.collisionWidth-g-e,a.left+=i-c):j>0&&i<=0?a.left=e:i>j?a.left=e+g-b.collisionWidth:a.left=e:i>0?a.left+=i:j>0?a.left-=j:a.left=f(a.left-h,a.left)},top:function(a,b){var c,d=b.within,e=d.isWindow?d.scrollTop:d.offset.top,g=b.within.height,h=a.top-b.collisionPosition.marginTop,i=e-h,j=h+b.collisionHeight-g-e;b.collisionHeight>g?i>0&&j<=0?(c=a.top+i+b.collisionHeight-g-e,a.top+=i-c):j>0&&i<=0?a.top=e:i>j?a.top=e+g-b.collisionHeight:a.top=e:i>0?a.top+=i:j>0?a.top-=j:a.top=f(a.top-h,a.top)}},flip:{left:function(a,b){var c,d,e=b.within,f=e.offset.left+e.scrollLeft,h=e.width,i=e.isWindow?e.scrollLeft:e.offset.left,j=a.left-b.collisionPosition.marginLeft,k=j-i,l=j+b.collisionWidth-h-i,m="left"===b.my[0]?-b.elemWidth:"right"===b.my[0]?b.elemWidth:0,n="left"===b.at[0]?b.targetWidth:"right"===b.at[0]?-b.targetWidth:0,o=-2*b.offset[0];k<0?(c=a.left+m+n+o+b.collisionWidth-h-f,(c<0||c<g(k))&&(a.left+=m+n+o)):l>0&&(d=a.left-b.collisionPosition.marginLeft+m+n+o-i,(d>0||g(d)<l)&&(a.left+=m+n+o))},top:function(a,b){var c,d,e=b.within,f=e.offset.top+e.scrollTop,h=e.height,i=e.isWindow?e.scrollTop:e.offset.top,j=a.top-b.collisionPosition.marginTop,k=j-i,l=j+b.collisionHeight-h-i,m="top"===b.my[1],n=m?-b.elemHeight:"bottom"===b.my[1]?b.elemHeight:0,o="top"===b.at[1]?b.targetHeight:"bottom"===b.at[1]?-b.targetHeight:0,p=-2*b.offset[1];k<0?(d=a.top+n+o+p+b.collisionHeight-h-f,(d<0||d<g(k))&&(a.top+=n+o+p)):l>0&&(c=a.top-b.collisionPosition.marginTop+n+o+p-i,(c>0||g(c)<l)&&(a.top+=n+o+p))}},flipfit:{left:function(){a.ui.position.flip.left.apply(this,arguments),a.ui.position.fit.left.apply(this,arguments)},top:function(){a.ui.position.flip.top.apply(this,arguments),a.ui.position.fit.top.apply(this,arguments)}}}}(),a.ui.position});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/safe-active-element.js b/bower_components/jquery-ui/ui/minified/safe-active-element.js
        new file mode 100644
        index 0000000000..bf273cc080
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/safe-active-element.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.ui.safeActiveElement=function(a){var b;try{b=a.activeElement}catch(c){b=a.body}return b||(b=a.body),b.nodeName||(b=a.body),b}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/safe-blur.js b/bower_components/jquery-ui/ui/minified/safe-blur.js
        new file mode 100644
        index 0000000000..385691b016
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/safe-blur.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.ui.safeBlur=function(b){b&&"body"!==b.nodeName.toLowerCase()&&a(b).trigger("blur")}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/scroll-parent.js b/bower_components/jquery-ui/ui/minified/scroll-parent.js
        new file mode 100644
        index 0000000000..dcc47e7964
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/scroll-parent.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.fn.scrollParent=function(b){var c=this.css("position"),d="absolute"===c,e=b?/(auto|scroll|hidden)/:/(auto|scroll)/,f=this.parents().filter(function(){var b=a(this);return(!d||"static"!==b.css("position"))&&e.test(b.css("overflow")+b.css("overflow-y")+b.css("overflow-x"))}).eq(0);return"fixed"!==c&&f.length?f:a(this[0].ownerDocument||document)}});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/tabbable.js b/bower_components/jquery-ui/ui/minified/tabbable.js
        new file mode 100644
        index 0000000000..7110e982e7
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/tabbable.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version","./focusable"],a):a(jQuery)}(function(a){return a.extend(a.expr[":"],{tabbable:function(b){var c=a.attr(b,"tabindex"),d=null!=c;return(!d||c>=0)&&a.ui.focusable(b,d)}})});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/unique-id.js b/bower_components/jquery-ui/ui/minified/unique-id.js
        new file mode 100644
        index 0000000000..4e0af17756
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/unique-id.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){return a.fn.extend({uniqueId:function(){var a=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++a)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&a(this).removeAttr("id")})}})});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/version.js b/bower_components/jquery-ui/ui/minified/version.js
        new file mode 100644
        index 0000000000..1bfddd1155
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/version.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){return a.ui=a.ui||{},a.ui.version="1.12.1"});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/minified/widget.js b/bower_components/jquery-ui/ui/minified/widget.js
        new file mode 100644
        index 0000000000..bc7d4d6f1f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/minified/widget.js
        @@ -0,0 +1,4 @@
        +/*! jQuery UI - v1.12.1 - 2016-09-15
        +* http://jqueryui.com
        +* Copyright jQuery Foundation and other contributors; Licensed  */
        +!function(a){"function"==typeof define&&define.amd?define(["jquery","./version"],a):a(jQuery)}(function(a){var b=0,c=Array.prototype.slice;return a.cleanData=function(b){return function(c){var d,e,f;for(f=0;null!=(e=c[f]);f++)try{d=a._data(e,"events"),d&&d.remove&&a(e).triggerHandler("remove")}catch(g){}b(c)}}(a.cleanData),a.widget=function(b,c,d){var e,f,g,h={},i=b.split(".")[0];b=b.split(".")[1];var j=i+"-"+b;return d||(d=c,c=a.Widget),a.isArray(d)&&(d=a.extend.apply(null,[{}].concat(d))),a.expr[":"][j.toLowerCase()]=function(b){return!!a.data(b,j)},a[i]=a[i]||{},e=a[i][b],f=a[i][b]=function(a,b){return this._createWidget?void(arguments.length&&this._createWidget(a,b)):new f(a,b)},a.extend(f,e,{version:d.version,_proto:a.extend({},d),_childConstructors:[]}),g=new c,g.options=a.widget.extend({},g.options),a.each(d,function(b,d){return a.isFunction(d)?void(h[b]=function(){function a(){return c.prototype[b].apply(this,arguments)}function e(a){return c.prototype[b].apply(this,a)}return function(){var b,c=this._super,f=this._superApply;return this._super=a,this._superApply=e,b=d.apply(this,arguments),this._super=c,this._superApply=f,b}}()):void(h[b]=d)}),f.prototype=a.widget.extend(g,{widgetEventPrefix:e?g.widgetEventPrefix||b:b},h,{constructor:f,namespace:i,widgetName:b,widgetFullName:j}),e?(a.each(e._childConstructors,function(b,c){var d=c.prototype;a.widget(d.namespace+"."+d.widgetName,f,c._proto)}),delete e._childConstructors):c._childConstructors.push(f),a.widget.bridge(b,f),f},a.widget.extend=function(b){for(var d,e,f=c.call(arguments,1),g=0,h=f.length;g<h;g++)for(d in f[g])e=f[g][d],f[g].hasOwnProperty(d)&&void 0!==e&&(a.isPlainObject(e)?b[d]=a.isPlainObject(b[d])?a.widget.extend({},b[d],e):a.widget.extend({},e):b[d]=e);return b},a.widget.bridge=function(b,d){var e=d.prototype.widgetFullName||b;a.fn[b]=function(f){var g="string"==typeof f,h=c.call(arguments,1),i=this;return g?this.length||"instance"!==f?this.each(function(){var c,d=a.data(this,e);return"instance"===f?(i=d,!1):d?a.isFunction(d[f])&&"_"!==f.charAt(0)?(c=d[f].apply(d,h),c!==d&&void 0!==c?(i=c&&c.jquery?i.pushStack(c.get()):c,!1):void 0):a.error("no such method '"+f+"' for "+b+" widget instance"):a.error("cannot call methods on "+b+" prior to initialization; attempted to call method '"+f+"'")}):i=void 0:(h.length&&(f=a.widget.extend.apply(null,[f].concat(h))),this.each(function(){var b=a.data(this,e);b?(b.option(f||{}),b._init&&b._init()):a.data(this,e,new d(f,this))})),i}},a.Widget=function(){},a.Widget._childConstructors=[],a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(c,d){d=a(d||this.defaultElement||this)[0],this.element=a(d),this.uuid=b++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=a(),this.hoverable=a(),this.focusable=a(),this.classesElementLookup={},d!==this&&(a.data(d,this.widgetFullName,this),this._on(!0,this.element,{remove:function(a){a.target===d&&this.destroy()}}),this.document=a(d.style?d.ownerDocument:d.document||d),this.window=a(this.document[0].defaultView||this.document[0].parentWindow)),this.options=a.widget.extend({},this.options,this._getCreateOptions(),c),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:a.noop,_create:a.noop,_init:a.noop,destroy:function(){var b=this;this._destroy(),a.each(this.classesElementLookup,function(a,c){b._removeClass(c,a)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:a.noop,widget:function(){return this.element},option:function(b,c){var d,e,f,g=b;if(0===arguments.length)return a.widget.extend({},this.options);if("string"==typeof b)if(g={},d=b.split("."),b=d.shift(),d.length){for(e=g[b]=a.widget.extend({},this.options[b]),f=0;f<d.length-1;f++)e[d[f]]=e[d[f]]||{},e=e[d[f]];if(b=d.pop(),1===arguments.length)return void 0===e[b]?null:e[b];e[b]=c}else{if(1===arguments.length)return void 0===this.options[b]?null:this.options[b];g[b]=c}return this._setOptions(g),this},_setOptions:function(a){var b;for(b in a)this._setOption(b,a[b]);return this},_setOption:function(a,b){return"classes"===a&&this._setOptionClasses(b),this.options[a]=b,"disabled"===a&&this._setOptionDisabled(b),this},_setOptionClasses:function(b){var c,d,e;for(c in b)e=this.classesElementLookup[c],b[c]!==this.options.classes[c]&&e&&e.length&&(d=a(e.get()),this._removeClass(e,c),d.addClass(this._classes({element:d,keys:c,classes:b,add:!0})))},_setOptionDisabled:function(a){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!a),a&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(b){function c(c,f){var g,h;for(h=0;h<c.length;h++)g=e.classesElementLookup[c[h]]||a(),g=a(b.add?a.unique(g.get().concat(b.element.get())):g.not(b.element).get()),e.classesElementLookup[c[h]]=g,d.push(c[h]),f&&b.classes[c[h]]&&d.push(b.classes[c[h]])}var d=[],e=this;return b=a.extend({element:this.element,classes:this.options.classes||{}},b),this._on(b.element,{remove:"_untrackClassesElement"}),b.keys&&c(b.keys.match(/\S+/g)||[],!0),b.extra&&c(b.extra.match(/\S+/g)||[]),d.join(" ")},_untrackClassesElement:function(b){var c=this;a.each(c.classesElementLookup,function(d,e){a.inArray(b.target,e)!==-1&&(c.classesElementLookup[d]=a(e.not(b.target).get()))})},_removeClass:function(a,b,c){return this._toggleClass(a,b,c,!1)},_addClass:function(a,b,c){return this._toggleClass(a,b,c,!0)},_toggleClass:function(a,b,c,d){d="boolean"==typeof d?d:c;var e="string"==typeof a||null===a,f={extra:e?b:c,keys:e?a:b,element:e?this.element:a,add:d};return f.element.toggleClass(this._classes(f),d),this},_on:function(b,c,d){var e,f=this;"boolean"!=typeof b&&(d=c,c=b,b=!1),d?(c=e=a(c),this.bindings=this.bindings.add(c)):(d=c,c=this.element,e=this.widget()),a.each(d,function(d,g){function h(){if(b||f.options.disabled!==!0&&!a(this).hasClass("ui-state-disabled"))return("string"==typeof g?f[g]:g).apply(f,arguments)}"string"!=typeof g&&(h.guid=g.guid=g.guid||h.guid||a.guid++);var i=d.match(/^([\w:-]*)\s*(.*)$/),j=i[1]+f.eventNamespace,k=i[2];k?e.on(j,k,h):c.on(j,h)})},_off:function(b,c){c=(c||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,b.off(c).off(c),this.bindings=a(this.bindings.not(b).get()),this.focusable=a(this.focusable.not(b).get()),this.hoverable=a(this.hoverable.not(b).get())},_delay:function(a,b){function c(){return("string"==typeof a?d[a]:a).apply(d,arguments)}var d=this;return setTimeout(c,b||0)},_hoverable:function(b){this.hoverable=this.hoverable.add(b),this._on(b,{mouseenter:function(b){this._addClass(a(b.currentTarget),null,"ui-state-hover")},mouseleave:function(b){this._removeClass(a(b.currentTarget),null,"ui-state-hover")}})},_focusable:function(b){this.focusable=this.focusable.add(b),this._on(b,{focusin:function(b){this._addClass(a(b.currentTarget),null,"ui-state-focus")},focusout:function(b){this._removeClass(a(b.currentTarget),null,"ui-state-focus")}})},_trigger:function(b,c,d){var e,f,g=this.options[b];if(d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent)for(e in f)e in c||(c[e]=f[e]);return this.element.trigger(c,d),!(a.isFunction(g)&&g.apply(this.element[0],[c].concat(d))===!1||c.isDefaultPrevented())}},a.each({show:"fadeIn",hide:"fadeOut"},function(b,c){a.Widget.prototype["_"+b]=function(d,e,f){"string"==typeof e&&(e={effect:e});var g,h=e?e===!0||"number"==typeof e?c:e.effect||c:b;e=e||{},"number"==typeof e&&(e={duration:e}),g=!a.isEmptyObject(e),e.complete=f,e.delay&&d.delay(e.delay),g&&a.effects&&a.effects.effect[h]?d[b](e):h!==b&&d[h]?d[h](e.duration,e.easing,f):d.queue(function(c){a(this)[b](),f&&f.call(d[0]),c()})}}),a.widget});
        \ No newline at end of file
        diff --git a/bower_components/jquery-ui/ui/plugin.js b/bower_components/jquery-ui/ui/plugin.js
        new file mode 100644
        index 0000000000..b282de7c6d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/plugin.js
        @@ -0,0 +1,44 @@
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +// $.ui.plugin is deprecated. Use $.widget() extensions instead.
        +return $.ui.plugin = {
        +	add: function( module, option, set ) {
        +		var i,
        +			proto = $.ui[ module ].prototype;
        +		for ( i in set ) {
        +			proto.plugins[ i ] = proto.plugins[ i ] || [];
        +			proto.plugins[ i ].push( [ option, set[ i ] ] );
        +		}
        +	},
        +	call: function( instance, name, args, allowDisconnected ) {
        +		var i,
        +			set = instance.plugins[ name ];
        +
        +		if ( !set ) {
        +			return;
        +		}
        +
        +		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
        +				instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
        +			return;
        +		}
        +
        +		for ( i = 0; i < set.length; i++ ) {
        +			if ( instance.options[ set[ i ][ 0 ] ] ) {
        +				set[ i ][ 1 ].apply( instance.element, args );
        +			}
        +		}
        +	}
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/position.js b/bower_components/jquery-ui/ui/position.js
        new file mode 100644
        index 0000000000..9aa8221695
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/position.js
        @@ -0,0 +1,498 @@
        +/*!
        + * jQuery UI Position 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + *
        + * http://api.jqueryui.com/position/
        + */
        +
        +//>>label: Position
        +//>>group: Core
        +//>>description: Positions elements relative to other elements.
        +//>>docs: http://api.jqueryui.com/position/
        +//>>demos: http://jqueryui.com/position/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +( function() {
        +var cachedScrollbarWidth,
        +	max = Math.max,
        +	abs = Math.abs,
        +	rhorizontal = /left|center|right/,
        +	rvertical = /top|center|bottom/,
        +	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
        +	rposition = /^\w+/,
        +	rpercent = /%$/,
        +	_position = $.fn.position;
        +
        +function getOffsets( offsets, width, height ) {
        +	return [
        +		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
        +		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
        +	];
        +}
        +
        +function parseCss( element, property ) {
        +	return parseInt( $.css( element, property ), 10 ) || 0;
        +}
        +
        +function getDimensions( elem ) {
        +	var raw = elem[ 0 ];
        +	if ( raw.nodeType === 9 ) {
        +		return {
        +			width: elem.width(),
        +			height: elem.height(),
        +			offset: { top: 0, left: 0 }
        +		};
        +	}
        +	if ( $.isWindow( raw ) ) {
        +		return {
        +			width: elem.width(),
        +			height: elem.height(),
        +			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
        +		};
        +	}
        +	if ( raw.preventDefault ) {
        +		return {
        +			width: 0,
        +			height: 0,
        +			offset: { top: raw.pageY, left: raw.pageX }
        +		};
        +	}
        +	return {
        +		width: elem.outerWidth(),
        +		height: elem.outerHeight(),
        +		offset: elem.offset()
        +	};
        +}
        +
        +$.position = {
        +	scrollbarWidth: function() {
        +		if ( cachedScrollbarWidth !== undefined ) {
        +			return cachedScrollbarWidth;
        +		}
        +		var w1, w2,
        +			div = $( "<div " +
        +				"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
        +				"<div style='height:100px;width:auto;'></div></div>" ),
        +			innerDiv = div.children()[ 0 ];
        +
        +		$( "body" ).append( div );
        +		w1 = innerDiv.offsetWidth;
        +		div.css( "overflow", "scroll" );
        +
        +		w2 = innerDiv.offsetWidth;
        +
        +		if ( w1 === w2 ) {
        +			w2 = div[ 0 ].clientWidth;
        +		}
        +
        +		div.remove();
        +
        +		return ( cachedScrollbarWidth = w1 - w2 );
        +	},
        +	getScrollInfo: function( within ) {
        +		var overflowX = within.isWindow || within.isDocument ? "" :
        +				within.element.css( "overflow-x" ),
        +			overflowY = within.isWindow || within.isDocument ? "" :
        +				within.element.css( "overflow-y" ),
        +			hasOverflowX = overflowX === "scroll" ||
        +				( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
        +			hasOverflowY = overflowY === "scroll" ||
        +				( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
        +		return {
        +			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
        +			height: hasOverflowX ? $.position.scrollbarWidth() : 0
        +		};
        +	},
        +	getWithinInfo: function( element ) {
        +		var withinElement = $( element || window ),
        +			isWindow = $.isWindow( withinElement[ 0 ] ),
        +			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
        +			hasOffset = !isWindow && !isDocument;
        +		return {
        +			element: withinElement,
        +			isWindow: isWindow,
        +			isDocument: isDocument,
        +			offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
        +			scrollLeft: withinElement.scrollLeft(),
        +			scrollTop: withinElement.scrollTop(),
        +			width: withinElement.outerWidth(),
        +			height: withinElement.outerHeight()
        +		};
        +	}
        +};
        +
        +$.fn.position = function( options ) {
        +	if ( !options || !options.of ) {
        +		return _position.apply( this, arguments );
        +	}
        +
        +	// Make a copy, we don't want to modify arguments
        +	options = $.extend( {}, options );
        +
        +	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
        +		target = $( options.of ),
        +		within = $.position.getWithinInfo( options.within ),
        +		scrollInfo = $.position.getScrollInfo( within ),
        +		collision = ( options.collision || "flip" ).split( " " ),
        +		offsets = {};
        +
        +	dimensions = getDimensions( target );
        +	if ( target[ 0 ].preventDefault ) {
        +
        +		// Force left top to allow flipping
        +		options.at = "left top";
        +	}
        +	targetWidth = dimensions.width;
        +	targetHeight = dimensions.height;
        +	targetOffset = dimensions.offset;
        +
        +	// Clone to reuse original targetOffset later
        +	basePosition = $.extend( {}, targetOffset );
        +
        +	// Force my and at to have valid horizontal and vertical positions
        +	// if a value is missing or invalid, it will be converted to center
        +	$.each( [ "my", "at" ], function() {
        +		var pos = ( options[ this ] || "" ).split( " " ),
        +			horizontalOffset,
        +			verticalOffset;
        +
        +		if ( pos.length === 1 ) {
        +			pos = rhorizontal.test( pos[ 0 ] ) ?
        +				pos.concat( [ "center" ] ) :
        +				rvertical.test( pos[ 0 ] ) ?
        +					[ "center" ].concat( pos ) :
        +					[ "center", "center" ];
        +		}
        +		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
        +		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
        +
        +		// Calculate offsets
        +		horizontalOffset = roffset.exec( pos[ 0 ] );
        +		verticalOffset = roffset.exec( pos[ 1 ] );
        +		offsets[ this ] = [
        +			horizontalOffset ? horizontalOffset[ 0 ] : 0,
        +			verticalOffset ? verticalOffset[ 0 ] : 0
        +		];
        +
        +		// Reduce to just the positions without the offsets
        +		options[ this ] = [
        +			rposition.exec( pos[ 0 ] )[ 0 ],
        +			rposition.exec( pos[ 1 ] )[ 0 ]
        +		];
        +	} );
        +
        +	// Normalize collision option
        +	if ( collision.length === 1 ) {
        +		collision[ 1 ] = collision[ 0 ];
        +	}
        +
        +	if ( options.at[ 0 ] === "right" ) {
        +		basePosition.left += targetWidth;
        +	} else if ( options.at[ 0 ] === "center" ) {
        +		basePosition.left += targetWidth / 2;
        +	}
        +
        +	if ( options.at[ 1 ] === "bottom" ) {
        +		basePosition.top += targetHeight;
        +	} else if ( options.at[ 1 ] === "center" ) {
        +		basePosition.top += targetHeight / 2;
        +	}
        +
        +	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
        +	basePosition.left += atOffset[ 0 ];
        +	basePosition.top += atOffset[ 1 ];
        +
        +	return this.each( function() {
        +		var collisionPosition, using,
        +			elem = $( this ),
        +			elemWidth = elem.outerWidth(),
        +			elemHeight = elem.outerHeight(),
        +			marginLeft = parseCss( this, "marginLeft" ),
        +			marginTop = parseCss( this, "marginTop" ),
        +			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
        +				scrollInfo.width,
        +			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
        +				scrollInfo.height,
        +			position = $.extend( {}, basePosition ),
        +			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
        +
        +		if ( options.my[ 0 ] === "right" ) {
        +			position.left -= elemWidth;
        +		} else if ( options.my[ 0 ] === "center" ) {
        +			position.left -= elemWidth / 2;
        +		}
        +
        +		if ( options.my[ 1 ] === "bottom" ) {
        +			position.top -= elemHeight;
        +		} else if ( options.my[ 1 ] === "center" ) {
        +			position.top -= elemHeight / 2;
        +		}
        +
        +		position.left += myOffset[ 0 ];
        +		position.top += myOffset[ 1 ];
        +
        +		collisionPosition = {
        +			marginLeft: marginLeft,
        +			marginTop: marginTop
        +		};
        +
        +		$.each( [ "left", "top" ], function( i, dir ) {
        +			if ( $.ui.position[ collision[ i ] ] ) {
        +				$.ui.position[ collision[ i ] ][ dir ]( position, {
        +					targetWidth: targetWidth,
        +					targetHeight: targetHeight,
        +					elemWidth: elemWidth,
        +					elemHeight: elemHeight,
        +					collisionPosition: collisionPosition,
        +					collisionWidth: collisionWidth,
        +					collisionHeight: collisionHeight,
        +					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
        +					my: options.my,
        +					at: options.at,
        +					within: within,
        +					elem: elem
        +				} );
        +			}
        +		} );
        +
        +		if ( options.using ) {
        +
        +			// Adds feedback as second argument to using callback, if present
        +			using = function( props ) {
        +				var left = targetOffset.left - position.left,
        +					right = left + targetWidth - elemWidth,
        +					top = targetOffset.top - position.top,
        +					bottom = top + targetHeight - elemHeight,
        +					feedback = {
        +						target: {
        +							element: target,
        +							left: targetOffset.left,
        +							top: targetOffset.top,
        +							width: targetWidth,
        +							height: targetHeight
        +						},
        +						element: {
        +							element: elem,
        +							left: position.left,
        +							top: position.top,
        +							width: elemWidth,
        +							height: elemHeight
        +						},
        +						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
        +						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
        +					};
        +				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
        +					feedback.horizontal = "center";
        +				}
        +				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
        +					feedback.vertical = "middle";
        +				}
        +				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
        +					feedback.important = "horizontal";
        +				} else {
        +					feedback.important = "vertical";
        +				}
        +				options.using.call( this, props, feedback );
        +			};
        +		}
        +
        +		elem.offset( $.extend( position, { using: using } ) );
        +	} );
        +};
        +
        +$.ui.position = {
        +	fit: {
        +		left: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
        +				outerWidth = within.width,
        +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        +				overLeft = withinOffset - collisionPosLeft,
        +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
        +				newOverRight;
        +
        +			// Element is wider than within
        +			if ( data.collisionWidth > outerWidth ) {
        +
        +				// Element is initially over the left side of within
        +				if ( overLeft > 0 && overRight <= 0 ) {
        +					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
        +						withinOffset;
        +					position.left += overLeft - newOverRight;
        +
        +				// Element is initially over right side of within
        +				} else if ( overRight > 0 && overLeft <= 0 ) {
        +					position.left = withinOffset;
        +
        +				// Element is initially over both left and right sides of within
        +				} else {
        +					if ( overLeft > overRight ) {
        +						position.left = withinOffset + outerWidth - data.collisionWidth;
        +					} else {
        +						position.left = withinOffset;
        +					}
        +				}
        +
        +			// Too far left -> align with left edge
        +			} else if ( overLeft > 0 ) {
        +				position.left += overLeft;
        +
        +			// Too far right -> align with right edge
        +			} else if ( overRight > 0 ) {
        +				position.left -= overRight;
        +
        +			// Adjust based on position and margin
        +			} else {
        +				position.left = max( position.left - collisionPosLeft, position.left );
        +			}
        +		},
        +		top: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
        +				outerHeight = data.within.height,
        +				collisionPosTop = position.top - data.collisionPosition.marginTop,
        +				overTop = withinOffset - collisionPosTop,
        +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
        +				newOverBottom;
        +
        +			// Element is taller than within
        +			if ( data.collisionHeight > outerHeight ) {
        +
        +				// Element is initially over the top of within
        +				if ( overTop > 0 && overBottom <= 0 ) {
        +					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
        +						withinOffset;
        +					position.top += overTop - newOverBottom;
        +
        +				// Element is initially over bottom of within
        +				} else if ( overBottom > 0 && overTop <= 0 ) {
        +					position.top = withinOffset;
        +
        +				// Element is initially over both top and bottom of within
        +				} else {
        +					if ( overTop > overBottom ) {
        +						position.top = withinOffset + outerHeight - data.collisionHeight;
        +					} else {
        +						position.top = withinOffset;
        +					}
        +				}
        +
        +			// Too far up -> align with top
        +			} else if ( overTop > 0 ) {
        +				position.top += overTop;
        +
        +			// Too far down -> align with bottom edge
        +			} else if ( overBottom > 0 ) {
        +				position.top -= overBottom;
        +
        +			// Adjust based on position and margin
        +			} else {
        +				position.top = max( position.top - collisionPosTop, position.top );
        +			}
        +		}
        +	},
        +	flip: {
        +		left: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.offset.left + within.scrollLeft,
        +				outerWidth = within.width,
        +				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
        +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        +				overLeft = collisionPosLeft - offsetLeft,
        +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
        +				myOffset = data.my[ 0 ] === "left" ?
        +					-data.elemWidth :
        +					data.my[ 0 ] === "right" ?
        +						data.elemWidth :
        +						0,
        +				atOffset = data.at[ 0 ] === "left" ?
        +					data.targetWidth :
        +					data.at[ 0 ] === "right" ?
        +						-data.targetWidth :
        +						0,
        +				offset = -2 * data.offset[ 0 ],
        +				newOverRight,
        +				newOverLeft;
        +
        +			if ( overLeft < 0 ) {
        +				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
        +					outerWidth - withinOffset;
        +				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
        +					position.left += myOffset + atOffset + offset;
        +				}
        +			} else if ( overRight > 0 ) {
        +				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
        +					atOffset + offset - offsetLeft;
        +				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
        +					position.left += myOffset + atOffset + offset;
        +				}
        +			}
        +		},
        +		top: function( position, data ) {
        +			var within = data.within,
        +				withinOffset = within.offset.top + within.scrollTop,
        +				outerHeight = within.height,
        +				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
        +				collisionPosTop = position.top - data.collisionPosition.marginTop,
        +				overTop = collisionPosTop - offsetTop,
        +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
        +				top = data.my[ 1 ] === "top",
        +				myOffset = top ?
        +					-data.elemHeight :
        +					data.my[ 1 ] === "bottom" ?
        +						data.elemHeight :
        +						0,
        +				atOffset = data.at[ 1 ] === "top" ?
        +					data.targetHeight :
        +					data.at[ 1 ] === "bottom" ?
        +						-data.targetHeight :
        +						0,
        +				offset = -2 * data.offset[ 1 ],
        +				newOverTop,
        +				newOverBottom;
        +			if ( overTop < 0 ) {
        +				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
        +					outerHeight - withinOffset;
        +				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
        +					position.top += myOffset + atOffset + offset;
        +				}
        +			} else if ( overBottom > 0 ) {
        +				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
        +					offset - offsetTop;
        +				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
        +					position.top += myOffset + atOffset + offset;
        +				}
        +			}
        +		}
        +	},
        +	flipfit: {
        +		left: function() {
        +			$.ui.position.flip.left.apply( this, arguments );
        +			$.ui.position.fit.left.apply( this, arguments );
        +		},
        +		top: function() {
        +			$.ui.position.flip.top.apply( this, arguments );
        +			$.ui.position.fit.top.apply( this, arguments );
        +		}
        +	}
        +};
        +
        +} )();
        +
        +return $.ui.position;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/safe-active-element.js b/bower_components/jquery-ui/ui/safe-active-element.js
        new file mode 100644
        index 0000000000..4d04add5ff
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/safe-active-element.js
        @@ -0,0 +1,40 @@
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +return $.ui.safeActiveElement = function( document ) {
        +	var activeElement;
        +
        +	// Support: IE 9 only
        +	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
        +	try {
        +		activeElement = document.activeElement;
        +	} catch ( error ) {
        +		activeElement = document.body;
        +	}
        +
        +	// Support: IE 9 - 11 only
        +	// IE may return null instead of an element
        +	// Interestingly, this only seems to occur when NOT in an iframe
        +	if ( !activeElement ) {
        +		activeElement = document.body;
        +	}
        +
        +	// Support: IE 11 only
        +	// IE11 returns a seemingly empty object in some cases when accessing
        +	// document.activeElement from an <iframe>
        +	if ( !activeElement.nodeName ) {
        +		activeElement = document.body;
        +	}
        +
        +	return activeElement;
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/safe-blur.js b/bower_components/jquery-ui/ui/safe-blur.js
        new file mode 100644
        index 0000000000..5258782680
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/safe-blur.js
        @@ -0,0 +1,21 @@
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +return $.ui.safeBlur = function( element ) {
        +
        +	// Support: IE9 - 10 only
        +	// If the <body> is blurred, IE will switch windows, see #9420
        +	if ( element && element.nodeName.toLowerCase() !== "body" ) {
        +		$( element ).trigger( "blur" );
        +	}
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/scroll-parent.js b/bower_components/jquery-ui/ui/scroll-parent.js
        new file mode 100644
        index 0000000000..dfe820b625
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/scroll-parent.js
        @@ -0,0 +1,45 @@
        +/*!
        + * jQuery UI Scroll Parent 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: scrollParent
        +//>>group: Core
        +//>>description: Get the closest ancestor element that is scrollable.
        +//>>docs: http://api.jqueryui.com/scrollParent/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +return $.fn.scrollParent = function( includeHidden ) {
        +	var position = this.css( "position" ),
        +		excludeStaticParent = position === "absolute",
        +		overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
        +		scrollParent = this.parents().filter( function() {
        +			var parent = $( this );
        +			if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
        +				return false;
        +			}
        +			return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
        +				parent.css( "overflow-x" ) );
        +		} ).eq( 0 );
        +
        +	return position === "fixed" || !scrollParent.length ?
        +		$( this[ 0 ].ownerDocument || document ) :
        +		scrollParent;
        +};
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/tabbable.js b/bower_components/jquery-ui/ui/tabbable.js
        new file mode 100644
        index 0000000000..d3ceafd90c
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/tabbable.js
        @@ -0,0 +1,35 @@
        +/*!
        + * jQuery UI Tabbable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: :tabbable Selector
        +//>>group: Core
        +//>>description: Selects elements which can be tabbed to.
        +//>>docs: http://api.jqueryui.com/tabbable-selector/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version", "./focusable" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +return $.extend( $.expr[ ":" ], {
        +	tabbable: function( element ) {
        +		var tabIndex = $.attr( element, "tabindex" ),
        +			hasTabindex = tabIndex != null;
        +		return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/unique-id.js b/bower_components/jquery-ui/ui/unique-id.js
        new file mode 100644
        index 0000000000..9e45f0afa3
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/unique-id.js
        @@ -0,0 +1,49 @@
        +/*!
        + * jQuery UI Unique ID 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: uniqueId
        +//>>group: Core
        +//>>description: Functions to generate and remove uniqueId's
        +//>>docs: http://api.jqueryui.com/uniqueId/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +return $.fn.extend( {
        +	uniqueId: ( function() {
        +		var uuid = 0;
        +
        +		return function() {
        +			return this.each( function() {
        +				if ( !this.id ) {
        +					this.id = "ui-id-" + ( ++uuid );
        +				}
        +			} );
        +		};
        +	} )(),
        +
        +	removeUniqueId: function() {
        +		return this.each( function() {
        +			if ( /^ui-id-\d+$/.test( this.id ) ) {
        +				$( this ).removeAttr( "id" );
        +			}
        +		} );
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/version.js b/bower_components/jquery-ui/ui/version.js
        new file mode 100644
        index 0000000000..e7505f5a3d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/version.js
        @@ -0,0 +1,17 @@
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +} ( function( $ ) {
        +
        +$.ui = $.ui || {};
        +
        +return $.ui.version = "1.12.1";
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widget.js b/bower_components/jquery-ui/ui/widget.js
        new file mode 100644
        index 0000000000..cac9413190
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widget.js
        @@ -0,0 +1,733 @@
        +/*!
        + * jQuery UI Widget 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Widget
        +//>>group: Core
        +//>>description: Provides a factory for creating stateful widgets with a common API.
        +//>>docs: http://api.jqueryui.com/jQuery.widget/
        +//>>demos: http://jqueryui.com/widget/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [ "jquery", "./version" ], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +var widgetUuid = 0;
        +var widgetSlice = Array.prototype.slice;
        +
        +$.cleanData = ( function( orig ) {
        +	return function( elems ) {
        +		var events, elem, i;
        +		for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
        +			try {
        +
        +				// Only trigger remove when necessary to save time
        +				events = $._data( elem, "events" );
        +				if ( events && events.remove ) {
        +					$( elem ).triggerHandler( "remove" );
        +				}
        +
        +			// Http://bugs.jquery.com/ticket/8235
        +			} catch ( e ) {}
        +		}
        +		orig( elems );
        +	};
        +} )( $.cleanData );
        +
        +$.widget = function( name, base, prototype ) {
        +	var existingConstructor, constructor, basePrototype;
        +
        +	// ProxiedPrototype allows the provided prototype to remain unmodified
        +	// so that it can be used as a mixin for multiple widgets (#8876)
        +	var proxiedPrototype = {};
        +
        +	var namespace = name.split( "." )[ 0 ];
        +	name = name.split( "." )[ 1 ];
        +	var fullName = namespace + "-" + name;
        +
        +	if ( !prototype ) {
        +		prototype = base;
        +		base = $.Widget;
        +	}
        +
        +	if ( $.isArray( prototype ) ) {
        +		prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
        +	}
        +
        +	// Create selector for plugin
        +	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
        +		return !!$.data( elem, fullName );
        +	};
        +
        +	$[ namespace ] = $[ namespace ] || {};
        +	existingConstructor = $[ namespace ][ name ];
        +	constructor = $[ namespace ][ name ] = function( options, element ) {
        +
        +		// Allow instantiation without "new" keyword
        +		if ( !this._createWidget ) {
        +			return new constructor( options, element );
        +		}
        +
        +		// Allow instantiation without initializing for simple inheritance
        +		// must use "new" keyword (the code above always passes args)
        +		if ( arguments.length ) {
        +			this._createWidget( options, element );
        +		}
        +	};
        +
        +	// Extend with the existing constructor to carry over any static properties
        +	$.extend( constructor, existingConstructor, {
        +		version: prototype.version,
        +
        +		// Copy the object used to create the prototype in case we need to
        +		// redefine the widget later
        +		_proto: $.extend( {}, prototype ),
        +
        +		// Track widgets that inherit from this widget in case this widget is
        +		// redefined after a widget inherits from it
        +		_childConstructors: []
        +	} );
        +
        +	basePrototype = new base();
        +
        +	// We need to make the options hash a property directly on the new instance
        +	// otherwise we'll modify the options hash on the prototype that we're
        +	// inheriting from
        +	basePrototype.options = $.widget.extend( {}, basePrototype.options );
        +	$.each( prototype, function( prop, value ) {
        +		if ( !$.isFunction( value ) ) {
        +			proxiedPrototype[ prop ] = value;
        +			return;
        +		}
        +		proxiedPrototype[ prop ] = ( function() {
        +			function _super() {
        +				return base.prototype[ prop ].apply( this, arguments );
        +			}
        +
        +			function _superApply( args ) {
        +				return base.prototype[ prop ].apply( this, args );
        +			}
        +
        +			return function() {
        +				var __super = this._super;
        +				var __superApply = this._superApply;
        +				var returnValue;
        +
        +				this._super = _super;
        +				this._superApply = _superApply;
        +
        +				returnValue = value.apply( this, arguments );
        +
        +				this._super = __super;
        +				this._superApply = __superApply;
        +
        +				return returnValue;
        +			};
        +		} )();
        +	} );
        +	constructor.prototype = $.widget.extend( basePrototype, {
        +
        +		// TODO: remove support for widgetEventPrefix
        +		// always use the name + a colon as the prefix, e.g., draggable:start
        +		// don't prefix for widgets that aren't DOM-based
        +		widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
        +	}, proxiedPrototype, {
        +		constructor: constructor,
        +		namespace: namespace,
        +		widgetName: name,
        +		widgetFullName: fullName
        +	} );
        +
        +	// If this widget is being redefined then we need to find all widgets that
        +	// are inheriting from it and redefine all of them so that they inherit from
        +	// the new version of this widget. We're essentially trying to replace one
        +	// level in the prototype chain.
        +	if ( existingConstructor ) {
        +		$.each( existingConstructor._childConstructors, function( i, child ) {
        +			var childPrototype = child.prototype;
        +
        +			// Redefine the child widget using the same prototype that was
        +			// originally used, but inherit from the new version of the base
        +			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
        +				child._proto );
        +		} );
        +
        +		// Remove the list of existing child constructors from the old constructor
        +		// so the old child constructors can be garbage collected
        +		delete existingConstructor._childConstructors;
        +	} else {
        +		base._childConstructors.push( constructor );
        +	}
        +
        +	$.widget.bridge( name, constructor );
        +
        +	return constructor;
        +};
        +
        +$.widget.extend = function( target ) {
        +	var input = widgetSlice.call( arguments, 1 );
        +	var inputIndex = 0;
        +	var inputLength = input.length;
        +	var key;
        +	var value;
        +
        +	for ( ; inputIndex < inputLength; inputIndex++ ) {
        +		for ( key in input[ inputIndex ] ) {
        +			value = input[ inputIndex ][ key ];
        +			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
        +
        +				// Clone objects
        +				if ( $.isPlainObject( value ) ) {
        +					target[ key ] = $.isPlainObject( target[ key ] ) ?
        +						$.widget.extend( {}, target[ key ], value ) :
        +
        +						// Don't extend strings, arrays, etc. with objects
        +						$.widget.extend( {}, value );
        +
        +				// Copy everything else by reference
        +				} else {
        +					target[ key ] = value;
        +				}
        +			}
        +		}
        +	}
        +	return target;
        +};
        +
        +$.widget.bridge = function( name, object ) {
        +	var fullName = object.prototype.widgetFullName || name;
        +	$.fn[ name ] = function( options ) {
        +		var isMethodCall = typeof options === "string";
        +		var args = widgetSlice.call( arguments, 1 );
        +		var returnValue = this;
        +
        +		if ( isMethodCall ) {
        +
        +			// If this is an empty collection, we need to have the instance method
        +			// return undefined instead of the jQuery instance
        +			if ( !this.length && options === "instance" ) {
        +				returnValue = undefined;
        +			} else {
        +				this.each( function() {
        +					var methodValue;
        +					var instance = $.data( this, fullName );
        +
        +					if ( options === "instance" ) {
        +						returnValue = instance;
        +						return false;
        +					}
        +
        +					if ( !instance ) {
        +						return $.error( "cannot call methods on " + name +
        +							" prior to initialization; " +
        +							"attempted to call method '" + options + "'" );
        +					}
        +
        +					if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
        +						return $.error( "no such method '" + options + "' for " + name +
        +							" widget instance" );
        +					}
        +
        +					methodValue = instance[ options ].apply( instance, args );
        +
        +					if ( methodValue !== instance && methodValue !== undefined ) {
        +						returnValue = methodValue && methodValue.jquery ?
        +							returnValue.pushStack( methodValue.get() ) :
        +							methodValue;
        +						return false;
        +					}
        +				} );
        +			}
        +		} else {
        +
        +			// Allow multiple hashes to be passed on init
        +			if ( args.length ) {
        +				options = $.widget.extend.apply( null, [ options ].concat( args ) );
        +			}
        +
        +			this.each( function() {
        +				var instance = $.data( this, fullName );
        +				if ( instance ) {
        +					instance.option( options || {} );
        +					if ( instance._init ) {
        +						instance._init();
        +					}
        +				} else {
        +					$.data( this, fullName, new object( options, this ) );
        +				}
        +			} );
        +		}
        +
        +		return returnValue;
        +	};
        +};
        +
        +$.Widget = function( /* options, element */ ) {};
        +$.Widget._childConstructors = [];
        +
        +$.Widget.prototype = {
        +	widgetName: "widget",
        +	widgetEventPrefix: "",
        +	defaultElement: "<div>",
        +
        +	options: {
        +		classes: {},
        +		disabled: false,
        +
        +		// Callbacks
        +		create: null
        +	},
        +
        +	_createWidget: function( options, element ) {
        +		element = $( element || this.defaultElement || this )[ 0 ];
        +		this.element = $( element );
        +		this.uuid = widgetUuid++;
        +		this.eventNamespace = "." + this.widgetName + this.uuid;
        +
        +		this.bindings = $();
        +		this.hoverable = $();
        +		this.focusable = $();
        +		this.classesElementLookup = {};
        +
        +		if ( element !== this ) {
        +			$.data( element, this.widgetFullName, this );
        +			this._on( true, this.element, {
        +				remove: function( event ) {
        +					if ( event.target === element ) {
        +						this.destroy();
        +					}
        +				}
        +			} );
        +			this.document = $( element.style ?
        +
        +				// Element within the document
        +				element.ownerDocument :
        +
        +				// Element is window or document
        +				element.document || element );
        +			this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
        +		}
        +
        +		this.options = $.widget.extend( {},
        +			this.options,
        +			this._getCreateOptions(),
        +			options );
        +
        +		this._create();
        +
        +		if ( this.options.disabled ) {
        +			this._setOptionDisabled( this.options.disabled );
        +		}
        +
        +		this._trigger( "create", null, this._getCreateEventData() );
        +		this._init();
        +	},
        +
        +	_getCreateOptions: function() {
        +		return {};
        +	},
        +
        +	_getCreateEventData: $.noop,
        +
        +	_create: $.noop,
        +
        +	_init: $.noop,
        +
        +	destroy: function() {
        +		var that = this;
        +
        +		this._destroy();
        +		$.each( this.classesElementLookup, function( key, value ) {
        +			that._removeClass( value, key );
        +		} );
        +
        +		// We can probably remove the unbind calls in 2.0
        +		// all event bindings should go through this._on()
        +		this.element
        +			.off( this.eventNamespace )
        +			.removeData( this.widgetFullName );
        +		this.widget()
        +			.off( this.eventNamespace )
        +			.removeAttr( "aria-disabled" );
        +
        +		// Clean up events and states
        +		this.bindings.off( this.eventNamespace );
        +	},
        +
        +	_destroy: $.noop,
        +
        +	widget: function() {
        +		return this.element;
        +	},
        +
        +	option: function( key, value ) {
        +		var options = key;
        +		var parts;
        +		var curOption;
        +		var i;
        +
        +		if ( arguments.length === 0 ) {
        +
        +			// Don't return a reference to the internal hash
        +			return $.widget.extend( {}, this.options );
        +		}
        +
        +		if ( typeof key === "string" ) {
        +
        +			// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
        +			options = {};
        +			parts = key.split( "." );
        +			key = parts.shift();
        +			if ( parts.length ) {
        +				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
        +				for ( i = 0; i < parts.length - 1; i++ ) {
        +					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
        +					curOption = curOption[ parts[ i ] ];
        +				}
        +				key = parts.pop();
        +				if ( arguments.length === 1 ) {
        +					return curOption[ key ] === undefined ? null : curOption[ key ];
        +				}
        +				curOption[ key ] = value;
        +			} else {
        +				if ( arguments.length === 1 ) {
        +					return this.options[ key ] === undefined ? null : this.options[ key ];
        +				}
        +				options[ key ] = value;
        +			}
        +		}
        +
        +		this._setOptions( options );
        +
        +		return this;
        +	},
        +
        +	_setOptions: function( options ) {
        +		var key;
        +
        +		for ( key in options ) {
        +			this._setOption( key, options[ key ] );
        +		}
        +
        +		return this;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "classes" ) {
        +			this._setOptionClasses( value );
        +		}
        +
        +		this.options[ key ] = value;
        +
        +		if ( key === "disabled" ) {
        +			this._setOptionDisabled( value );
        +		}
        +
        +		return this;
        +	},
        +
        +	_setOptionClasses: function( value ) {
        +		var classKey, elements, currentElements;
        +
        +		for ( classKey in value ) {
        +			currentElements = this.classesElementLookup[ classKey ];
        +			if ( value[ classKey ] === this.options.classes[ classKey ] ||
        +					!currentElements ||
        +					!currentElements.length ) {
        +				continue;
        +			}
        +
        +			// We are doing this to create a new jQuery object because the _removeClass() call
        +			// on the next line is going to destroy the reference to the current elements being
        +			// tracked. We need to save a copy of this collection so that we can add the new classes
        +			// below.
        +			elements = $( currentElements.get() );
        +			this._removeClass( currentElements, classKey );
        +
        +			// We don't use _addClass() here, because that uses this.options.classes
        +			// for generating the string of classes. We want to use the value passed in from
        +			// _setOption(), this is the new value of the classes option which was passed to
        +			// _setOption(). We pass this value directly to _classes().
        +			elements.addClass( this._classes( {
        +				element: elements,
        +				keys: classKey,
        +				classes: value,
        +				add: true
        +			} ) );
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
        +
        +		// If the widget is becoming disabled, then nothing is interactive
        +		if ( value ) {
        +			this._removeClass( this.hoverable, null, "ui-state-hover" );
        +			this._removeClass( this.focusable, null, "ui-state-focus" );
        +		}
        +	},
        +
        +	enable: function() {
        +		return this._setOptions( { disabled: false } );
        +	},
        +
        +	disable: function() {
        +		return this._setOptions( { disabled: true } );
        +	},
        +
        +	_classes: function( options ) {
        +		var full = [];
        +		var that = this;
        +
        +		options = $.extend( {
        +			element: this.element,
        +			classes: this.options.classes || {}
        +		}, options );
        +
        +		function processClassString( classes, checkOption ) {
        +			var current, i;
        +			for ( i = 0; i < classes.length; i++ ) {
        +				current = that.classesElementLookup[ classes[ i ] ] || $();
        +				if ( options.add ) {
        +					current = $( $.unique( current.get().concat( options.element.get() ) ) );
        +				} else {
        +					current = $( current.not( options.element ).get() );
        +				}
        +				that.classesElementLookup[ classes[ i ] ] = current;
        +				full.push( classes[ i ] );
        +				if ( checkOption && options.classes[ classes[ i ] ] ) {
        +					full.push( options.classes[ classes[ i ] ] );
        +				}
        +			}
        +		}
        +
        +		this._on( options.element, {
        +			"remove": "_untrackClassesElement"
        +		} );
        +
        +		if ( options.keys ) {
        +			processClassString( options.keys.match( /\S+/g ) || [], true );
        +		}
        +		if ( options.extra ) {
        +			processClassString( options.extra.match( /\S+/g ) || [] );
        +		}
        +
        +		return full.join( " " );
        +	},
        +
        +	_untrackClassesElement: function( event ) {
        +		var that = this;
        +		$.each( that.classesElementLookup, function( key, value ) {
        +			if ( $.inArray( event.target, value ) !== -1 ) {
        +				that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
        +			}
        +		} );
        +	},
        +
        +	_removeClass: function( element, keys, extra ) {
        +		return this._toggleClass( element, keys, extra, false );
        +	},
        +
        +	_addClass: function( element, keys, extra ) {
        +		return this._toggleClass( element, keys, extra, true );
        +	},
        +
        +	_toggleClass: function( element, keys, extra, add ) {
        +		add = ( typeof add === "boolean" ) ? add : extra;
        +		var shift = ( typeof element === "string" || element === null ),
        +			options = {
        +				extra: shift ? keys : extra,
        +				keys: shift ? element : keys,
        +				element: shift ? this.element : element,
        +				add: add
        +			};
        +		options.element.toggleClass( this._classes( options ), add );
        +		return this;
        +	},
        +
        +	_on: function( suppressDisabledCheck, element, handlers ) {
        +		var delegateElement;
        +		var instance = this;
        +
        +		// No suppressDisabledCheck flag, shuffle arguments
        +		if ( typeof suppressDisabledCheck !== "boolean" ) {
        +			handlers = element;
        +			element = suppressDisabledCheck;
        +			suppressDisabledCheck = false;
        +		}
        +
        +		// No element argument, shuffle and use this.element
        +		if ( !handlers ) {
        +			handlers = element;
        +			element = this.element;
        +			delegateElement = this.widget();
        +		} else {
        +			element = delegateElement = $( element );
        +			this.bindings = this.bindings.add( element );
        +		}
        +
        +		$.each( handlers, function( event, handler ) {
        +			function handlerProxy() {
        +
        +				// Allow widgets to customize the disabled handling
        +				// - disabled as an array instead of boolean
        +				// - disabled class as method for disabling individual parts
        +				if ( !suppressDisabledCheck &&
        +						( instance.options.disabled === true ||
        +						$( this ).hasClass( "ui-state-disabled" ) ) ) {
        +					return;
        +				}
        +				return ( typeof handler === "string" ? instance[ handler ] : handler )
        +					.apply( instance, arguments );
        +			}
        +
        +			// Copy the guid so direct unbinding works
        +			if ( typeof handler !== "string" ) {
        +				handlerProxy.guid = handler.guid =
        +					handler.guid || handlerProxy.guid || $.guid++;
        +			}
        +
        +			var match = event.match( /^([\w:-]*)\s*(.*)$/ );
        +			var eventName = match[ 1 ] + instance.eventNamespace;
        +			var selector = match[ 2 ];
        +
        +			if ( selector ) {
        +				delegateElement.on( eventName, selector, handlerProxy );
        +			} else {
        +				element.on( eventName, handlerProxy );
        +			}
        +		} );
        +	},
        +
        +	_off: function( element, eventName ) {
        +		eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
        +			this.eventNamespace;
        +		element.off( eventName ).off( eventName );
        +
        +		// Clear the stack to avoid memory leaks (#10056)
        +		this.bindings = $( this.bindings.not( element ).get() );
        +		this.focusable = $( this.focusable.not( element ).get() );
        +		this.hoverable = $( this.hoverable.not( element ).get() );
        +	},
        +
        +	_delay: function( handler, delay ) {
        +		function handlerProxy() {
        +			return ( typeof handler === "string" ? instance[ handler ] : handler )
        +				.apply( instance, arguments );
        +		}
        +		var instance = this;
        +		return setTimeout( handlerProxy, delay || 0 );
        +	},
        +
        +	_hoverable: function( element ) {
        +		this.hoverable = this.hoverable.add( element );
        +		this._on( element, {
        +			mouseenter: function( event ) {
        +				this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
        +			},
        +			mouseleave: function( event ) {
        +				this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
        +			}
        +		} );
        +	},
        +
        +	_focusable: function( element ) {
        +		this.focusable = this.focusable.add( element );
        +		this._on( element, {
        +			focusin: function( event ) {
        +				this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
        +			},
        +			focusout: function( event ) {
        +				this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
        +			}
        +		} );
        +	},
        +
        +	_trigger: function( type, event, data ) {
        +		var prop, orig;
        +		var callback = this.options[ type ];
        +
        +		data = data || {};
        +		event = $.Event( event );
        +		event.type = ( type === this.widgetEventPrefix ?
        +			type :
        +			this.widgetEventPrefix + type ).toLowerCase();
        +
        +		// The original event may come from any element
        +		// so we need to reset the target on the new event
        +		event.target = this.element[ 0 ];
        +
        +		// Copy original event properties over to the new event
        +		orig = event.originalEvent;
        +		if ( orig ) {
        +			for ( prop in orig ) {
        +				if ( !( prop in event ) ) {
        +					event[ prop ] = orig[ prop ];
        +				}
        +			}
        +		}
        +
        +		this.element.trigger( event, data );
        +		return !( $.isFunction( callback ) &&
        +			callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
        +			event.isDefaultPrevented() );
        +	}
        +};
        +
        +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
        +	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
        +		if ( typeof options === "string" ) {
        +			options = { effect: options };
        +		}
        +
        +		var hasOptions;
        +		var effectName = !options ?
        +			method :
        +			options === true || typeof options === "number" ?
        +				defaultEffect :
        +				options.effect || defaultEffect;
        +
        +		options = options || {};
        +		if ( typeof options === "number" ) {
        +			options = { duration: options };
        +		}
        +
        +		hasOptions = !$.isEmptyObject( options );
        +		options.complete = callback;
        +
        +		if ( options.delay ) {
        +			element.delay( options.delay );
        +		}
        +
        +		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
        +			element[ method ]( options );
        +		} else if ( effectName !== method && element[ effectName ] ) {
        +			element[ effectName ]( options.duration, options.easing, callback );
        +		} else {
        +			element.queue( function( next ) {
        +				$( this )[ method ]();
        +				if ( callback ) {
        +					callback.call( element[ 0 ] );
        +				}
        +				next();
        +			} );
        +		}
        +	};
        +} );
        +
        +return $.widget;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/accordion.js b/bower_components/jquery-ui/ui/widgets/accordion.js
        new file mode 100644
        index 0000000000..4b3a54d0fd
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/accordion.js
        @@ -0,0 +1,613 @@
        +/*!
        + * jQuery UI Accordion 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Accordion
        +//>>group: Widgets
        +// jscs:disable maximumLineLength
        +//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/accordion/
        +//>>demos: http://jqueryui.com/accordion/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/accordion.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../keycode",
        +			"../unique-id",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.widget( "ui.accordion", {
        +	version: "1.12.1",
        +	options: {
        +		active: 0,
        +		animate: {},
        +		classes: {
        +			"ui-accordion-header": "ui-corner-top",
        +			"ui-accordion-header-collapsed": "ui-corner-all",
        +			"ui-accordion-content": "ui-corner-bottom"
        +		},
        +		collapsible: false,
        +		event: "click",
        +		header: "> li > :first-child, > :not(li):even",
        +		heightStyle: "auto",
        +		icons: {
        +			activeHeader: "ui-icon-triangle-1-s",
        +			header: "ui-icon-triangle-1-e"
        +		},
        +
        +		// Callbacks
        +		activate: null,
        +		beforeActivate: null
        +	},
        +
        +	hideProps: {
        +		borderTopWidth: "hide",
        +		borderBottomWidth: "hide",
        +		paddingTop: "hide",
        +		paddingBottom: "hide",
        +		height: "hide"
        +	},
        +
        +	showProps: {
        +		borderTopWidth: "show",
        +		borderBottomWidth: "show",
        +		paddingTop: "show",
        +		paddingBottom: "show",
        +		height: "show"
        +	},
        +
        +	_create: function() {
        +		var options = this.options;
        +
        +		this.prevShow = this.prevHide = $();
        +		this._addClass( "ui-accordion", "ui-widget ui-helper-reset" );
        +		this.element.attr( "role", "tablist" );
        +
        +		// Don't allow collapsible: false and active: false / null
        +		if ( !options.collapsible && ( options.active === false || options.active == null ) ) {
        +			options.active = 0;
        +		}
        +
        +		this._processPanels();
        +
        +		// handle negative values
        +		if ( options.active < 0 ) {
        +			options.active += this.headers.length;
        +		}
        +		this._refresh();
        +	},
        +
        +	_getCreateEventData: function() {
        +		return {
        +			header: this.active,
        +			panel: !this.active.length ? $() : this.active.next()
        +		};
        +	},
        +
        +	_createIcons: function() {
        +		var icon, children,
        +			icons = this.options.icons;
        +
        +		if ( icons ) {
        +			icon = $( "<span>" );
        +			this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header );
        +			icon.prependTo( this.headers );
        +			children = this.active.children( ".ui-accordion-header-icon" );
        +			this._removeClass( children, icons.header )
        +				._addClass( children, null, icons.activeHeader )
        +				._addClass( this.headers, "ui-accordion-icons" );
        +		}
        +	},
        +
        +	_destroyIcons: function() {
        +		this._removeClass( this.headers, "ui-accordion-icons" );
        +		this.headers.children( ".ui-accordion-header-icon" ).remove();
        +	},
        +
        +	_destroy: function() {
        +		var contents;
        +
        +		// Clean up main element
        +		this.element.removeAttr( "role" );
        +
        +		// Clean up headers
        +		this.headers
        +			.removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" )
        +			.removeUniqueId();
        +
        +		this._destroyIcons();
        +
        +		// Clean up content panels
        +		contents = this.headers.next()
        +			.css( "display", "" )
        +			.removeAttr( "role aria-hidden aria-labelledby" )
        +			.removeUniqueId();
        +
        +		if ( this.options.heightStyle !== "content" ) {
        +			contents.css( "height", "" );
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "active" ) {
        +
        +			// _activate() will handle invalid values and update this.options
        +			this._activate( value );
        +			return;
        +		}
        +
        +		if ( key === "event" ) {
        +			if ( this.options.event ) {
        +				this._off( this.headers, this.options.event );
        +			}
        +			this._setupEvents( value );
        +		}
        +
        +		this._super( key, value );
        +
        +		// Setting collapsible: false while collapsed; open first panel
        +		if ( key === "collapsible" && !value && this.options.active === false ) {
        +			this._activate( 0 );
        +		}
        +
        +		if ( key === "icons" ) {
        +			this._destroyIcons();
        +			if ( value ) {
        +				this._createIcons();
        +			}
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.element.attr( "aria-disabled", value );
        +
        +		// Support: IE8 Only
        +		// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
        +		// so we need to add the disabled class to the headers and panels
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +		this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled",
        +			!!value );
        +	},
        +
        +	_keydown: function( event ) {
        +		if ( event.altKey || event.ctrlKey ) {
        +			return;
        +		}
        +
        +		var keyCode = $.ui.keyCode,
        +			length = this.headers.length,
        +			currentIndex = this.headers.index( event.target ),
        +			toFocus = false;
        +
        +		switch ( event.keyCode ) {
        +		case keyCode.RIGHT:
        +		case keyCode.DOWN:
        +			toFocus = this.headers[ ( currentIndex + 1 ) % length ];
        +			break;
        +		case keyCode.LEFT:
        +		case keyCode.UP:
        +			toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
        +			break;
        +		case keyCode.SPACE:
        +		case keyCode.ENTER:
        +			this._eventHandler( event );
        +			break;
        +		case keyCode.HOME:
        +			toFocus = this.headers[ 0 ];
        +			break;
        +		case keyCode.END:
        +			toFocus = this.headers[ length - 1 ];
        +			break;
        +		}
        +
        +		if ( toFocus ) {
        +			$( event.target ).attr( "tabIndex", -1 );
        +			$( toFocus ).attr( "tabIndex", 0 );
        +			$( toFocus ).trigger( "focus" );
        +			event.preventDefault();
        +		}
        +	},
        +
        +	_panelKeyDown: function( event ) {
        +		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
        +			$( event.currentTarget ).prev().trigger( "focus" );
        +		}
        +	},
        +
        +	refresh: function() {
        +		var options = this.options;
        +		this._processPanels();
        +
        +		// Was collapsed or no panel
        +		if ( ( options.active === false && options.collapsible === true ) ||
        +				!this.headers.length ) {
        +			options.active = false;
        +			this.active = $();
        +
        +		// active false only when collapsible is true
        +		} else if ( options.active === false ) {
        +			this._activate( 0 );
        +
        +		// was active, but active panel is gone
        +		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        +
        +			// all remaining panel are disabled
        +			if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) {
        +				options.active = false;
        +				this.active = $();
        +
        +			// activate previous panel
        +			} else {
        +				this._activate( Math.max( 0, options.active - 1 ) );
        +			}
        +
        +		// was active, active panel still exists
        +		} else {
        +
        +			// make sure active index is correct
        +			options.active = this.headers.index( this.active );
        +		}
        +
        +		this._destroyIcons();
        +
        +		this._refresh();
        +	},
        +
        +	_processPanels: function() {
        +		var prevHeaders = this.headers,
        +			prevPanels = this.panels;
        +
        +		this.headers = this.element.find( this.options.header );
        +		this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed",
        +			"ui-state-default" );
        +
        +		this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide();
        +		this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" );
        +
        +		// Avoid memory leaks (#10056)
        +		if ( prevPanels ) {
        +			this._off( prevHeaders.not( this.headers ) );
        +			this._off( prevPanels.not( this.panels ) );
        +		}
        +	},
        +
        +	_refresh: function() {
        +		var maxHeight,
        +			options = this.options,
        +			heightStyle = options.heightStyle,
        +			parent = this.element.parent();
        +
        +		this.active = this._findActive( options.active );
        +		this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" )
        +			._removeClass( this.active, "ui-accordion-header-collapsed" );
        +		this._addClass( this.active.next(), "ui-accordion-content-active" );
        +		this.active.next().show();
        +
        +		this.headers
        +			.attr( "role", "tab" )
        +			.each( function() {
        +				var header = $( this ),
        +					headerId = header.uniqueId().attr( "id" ),
        +					panel = header.next(),
        +					panelId = panel.uniqueId().attr( "id" );
        +				header.attr( "aria-controls", panelId );
        +				panel.attr( "aria-labelledby", headerId );
        +			} )
        +			.next()
        +				.attr( "role", "tabpanel" );
        +
        +		this.headers
        +			.not( this.active )
        +				.attr( {
        +					"aria-selected": "false",
        +					"aria-expanded": "false",
        +					tabIndex: -1
        +				} )
        +				.next()
        +					.attr( {
        +						"aria-hidden": "true"
        +					} )
        +					.hide();
        +
        +		// Make sure at least one header is in the tab order
        +		if ( !this.active.length ) {
        +			this.headers.eq( 0 ).attr( "tabIndex", 0 );
        +		} else {
        +			this.active.attr( {
        +				"aria-selected": "true",
        +				"aria-expanded": "true",
        +				tabIndex: 0
        +			} )
        +				.next()
        +					.attr( {
        +						"aria-hidden": "false"
        +					} );
        +		}
        +
        +		this._createIcons();
        +
        +		this._setupEvents( options.event );
        +
        +		if ( heightStyle === "fill" ) {
        +			maxHeight = parent.height();
        +			this.element.siblings( ":visible" ).each( function() {
        +				var elem = $( this ),
        +					position = elem.css( "position" );
        +
        +				if ( position === "absolute" || position === "fixed" ) {
        +					return;
        +				}
        +				maxHeight -= elem.outerHeight( true );
        +			} );
        +
        +			this.headers.each( function() {
        +				maxHeight -= $( this ).outerHeight( true );
        +			} );
        +
        +			this.headers.next()
        +				.each( function() {
        +					$( this ).height( Math.max( 0, maxHeight -
        +						$( this ).innerHeight() + $( this ).height() ) );
        +				} )
        +				.css( "overflow", "auto" );
        +		} else if ( heightStyle === "auto" ) {
        +			maxHeight = 0;
        +			this.headers.next()
        +				.each( function() {
        +					var isVisible = $( this ).is( ":visible" );
        +					if ( !isVisible ) {
        +						$( this ).show();
        +					}
        +					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
        +					if ( !isVisible ) {
        +						$( this ).hide();
        +					}
        +				} )
        +				.height( maxHeight );
        +		}
        +	},
        +
        +	_activate: function( index ) {
        +		var active = this._findActive( index )[ 0 ];
        +
        +		// Trying to activate the already active panel
        +		if ( active === this.active[ 0 ] ) {
        +			return;
        +		}
        +
        +		// Trying to collapse, simulate a click on the currently active header
        +		active = active || this.active[ 0 ];
        +
        +		this._eventHandler( {
        +			target: active,
        +			currentTarget: active,
        +			preventDefault: $.noop
        +		} );
        +	},
        +
        +	_findActive: function( selector ) {
        +		return typeof selector === "number" ? this.headers.eq( selector ) : $();
        +	},
        +
        +	_setupEvents: function( event ) {
        +		var events = {
        +			keydown: "_keydown"
        +		};
        +		if ( event ) {
        +			$.each( event.split( " " ), function( index, eventName ) {
        +				events[ eventName ] = "_eventHandler";
        +			} );
        +		}
        +
        +		this._off( this.headers.add( this.headers.next() ) );
        +		this._on( this.headers, events );
        +		this._on( this.headers.next(), { keydown: "_panelKeyDown" } );
        +		this._hoverable( this.headers );
        +		this._focusable( this.headers );
        +	},
        +
        +	_eventHandler: function( event ) {
        +		var activeChildren, clickedChildren,
        +			options = this.options,
        +			active = this.active,
        +			clicked = $( event.currentTarget ),
        +			clickedIsActive = clicked[ 0 ] === active[ 0 ],
        +			collapsing = clickedIsActive && options.collapsible,
        +			toShow = collapsing ? $() : clicked.next(),
        +			toHide = active.next(),
        +			eventData = {
        +				oldHeader: active,
        +				oldPanel: toHide,
        +				newHeader: collapsing ? $() : clicked,
        +				newPanel: toShow
        +			};
        +
        +		event.preventDefault();
        +
        +		if (
        +
        +				// click on active header, but not collapsible
        +				( clickedIsActive && !options.collapsible ) ||
        +
        +				// allow canceling activation
        +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        +			return;
        +		}
        +
        +		options.active = collapsing ? false : this.headers.index( clicked );
        +
        +		// When the call to ._toggle() comes after the class changes
        +		// it causes a very odd bug in IE 8 (see #6720)
        +		this.active = clickedIsActive ? $() : clicked;
        +		this._toggle( eventData );
        +
        +		// Switch classes
        +		// corner classes on the previously active header stay after the animation
        +		this._removeClass( active, "ui-accordion-header-active", "ui-state-active" );
        +		if ( options.icons ) {
        +			activeChildren = active.children( ".ui-accordion-header-icon" );
        +			this._removeClass( activeChildren, null, options.icons.activeHeader )
        +				._addClass( activeChildren, null, options.icons.header );
        +		}
        +
        +		if ( !clickedIsActive ) {
        +			this._removeClass( clicked, "ui-accordion-header-collapsed" )
        +				._addClass( clicked, "ui-accordion-header-active", "ui-state-active" );
        +			if ( options.icons ) {
        +				clickedChildren = clicked.children( ".ui-accordion-header-icon" );
        +				this._removeClass( clickedChildren, null, options.icons.header )
        +					._addClass( clickedChildren, null, options.icons.activeHeader );
        +			}
        +
        +			this._addClass( clicked.next(), "ui-accordion-content-active" );
        +		}
        +	},
        +
        +	_toggle: function( data ) {
        +		var toShow = data.newPanel,
        +			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
        +
        +		// Handle activating a panel during the animation for another activation
        +		this.prevShow.add( this.prevHide ).stop( true, true );
        +		this.prevShow = toShow;
        +		this.prevHide = toHide;
        +
        +		if ( this.options.animate ) {
        +			this._animate( toShow, toHide, data );
        +		} else {
        +			toHide.hide();
        +			toShow.show();
        +			this._toggleComplete( data );
        +		}
        +
        +		toHide.attr( {
        +			"aria-hidden": "true"
        +		} );
        +		toHide.prev().attr( {
        +			"aria-selected": "false",
        +			"aria-expanded": "false"
        +		} );
        +
        +		// if we're switching panels, remove the old header from the tab order
        +		// if we're opening from collapsed state, remove the previous header from the tab order
        +		// if we're collapsing, then keep the collapsing header in the tab order
        +		if ( toShow.length && toHide.length ) {
        +			toHide.prev().attr( {
        +				"tabIndex": -1,
        +				"aria-expanded": "false"
        +			} );
        +		} else if ( toShow.length ) {
        +			this.headers.filter( function() {
        +				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
        +			} )
        +				.attr( "tabIndex", -1 );
        +		}
        +
        +		toShow
        +			.attr( "aria-hidden", "false" )
        +			.prev()
        +				.attr( {
        +					"aria-selected": "true",
        +					"aria-expanded": "true",
        +					tabIndex: 0
        +				} );
        +	},
        +
        +	_animate: function( toShow, toHide, data ) {
        +		var total, easing, duration,
        +			that = this,
        +			adjust = 0,
        +			boxSizing = toShow.css( "box-sizing" ),
        +			down = toShow.length &&
        +				( !toHide.length || ( toShow.index() < toHide.index() ) ),
        +			animate = this.options.animate || {},
        +			options = down && animate.down || animate,
        +			complete = function() {
        +				that._toggleComplete( data );
        +			};
        +
        +		if ( typeof options === "number" ) {
        +			duration = options;
        +		}
        +		if ( typeof options === "string" ) {
        +			easing = options;
        +		}
        +
        +		// fall back from options to animation in case of partial down settings
        +		easing = easing || options.easing || animate.easing;
        +		duration = duration || options.duration || animate.duration;
        +
        +		if ( !toHide.length ) {
        +			return toShow.animate( this.showProps, duration, easing, complete );
        +		}
        +		if ( !toShow.length ) {
        +			return toHide.animate( this.hideProps, duration, easing, complete );
        +		}
        +
        +		total = toShow.show().outerHeight();
        +		toHide.animate( this.hideProps, {
        +			duration: duration,
        +			easing: easing,
        +			step: function( now, fx ) {
        +				fx.now = Math.round( now );
        +			}
        +		} );
        +		toShow
        +			.hide()
        +			.animate( this.showProps, {
        +				duration: duration,
        +				easing: easing,
        +				complete: complete,
        +				step: function( now, fx ) {
        +					fx.now = Math.round( now );
        +					if ( fx.prop !== "height" ) {
        +						if ( boxSizing === "content-box" ) {
        +							adjust += fx.now;
        +						}
        +					} else if ( that.options.heightStyle !== "content" ) {
        +						fx.now = Math.round( total - toHide.outerHeight() - adjust );
        +						adjust = 0;
        +					}
        +				}
        +			} );
        +	},
        +
        +	_toggleComplete: function( data ) {
        +		var toHide = data.oldPanel,
        +			prev = toHide.prev();
        +
        +		this._removeClass( toHide, "ui-accordion-content-active" );
        +		this._removeClass( prev, "ui-accordion-header-active" )
        +			._addClass( prev, "ui-accordion-header-collapsed" );
        +
        +		// Work around for rendering bug in IE (#5421)
        +		if ( toHide.length ) {
        +			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
        +		}
        +		this._trigger( "activate", null, data );
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/autocomplete.js b/bower_components/jquery-ui/ui/widgets/autocomplete.js
        new file mode 100644
        index 0000000000..f2bfb2d89a
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/autocomplete.js
        @@ -0,0 +1,682 @@
        +/*!
        + * jQuery UI Autocomplete 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Autocomplete
        +//>>group: Widgets
        +//>>description: Lists suggested words as the user is typing.
        +//>>docs: http://api.jqueryui.com/autocomplete/
        +//>>demos: http://jqueryui.com/autocomplete/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/autocomplete.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./menu",
        +			"../keycode",
        +			"../position",
        +			"../safe-active-element",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.autocomplete", {
        +	version: "1.12.1",
        +	defaultElement: "<input>",
        +	options: {
        +		appendTo: null,
        +		autoFocus: false,
        +		delay: 300,
        +		minLength: 1,
        +		position: {
        +			my: "left top",
        +			at: "left bottom",
        +			collision: "none"
        +		},
        +		source: null,
        +
        +		// Callbacks
        +		change: null,
        +		close: null,
        +		focus: null,
        +		open: null,
        +		response: null,
        +		search: null,
        +		select: null
        +	},
        +
        +	requestIndex: 0,
        +	pending: 0,
        +
        +	_create: function() {
        +
        +		// Some browsers only repeat keydown events, not keypress events,
        +		// so we use the suppressKeyPress flag to determine if we've already
        +		// handled the keydown event. #7269
        +		// Unfortunately the code for & in keypress is the same as the up arrow,
        +		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
        +		// events when we know the keydown event was used to modify the
        +		// search term. #7799
        +		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
        +			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
        +			isTextarea = nodeName === "textarea",
        +			isInput = nodeName === "input";
        +
        +		// Textareas are always multi-line
        +		// Inputs are always single-line, even if inside a contentEditable element
        +		// IE also treats inputs as contentEditable
        +		// All other element types are determined by whether or not they're contentEditable
        +		this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
        +
        +		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
        +		this.isNewMenu = true;
        +
        +		this._addClass( "ui-autocomplete-input" );
        +		this.element.attr( "autocomplete", "off" );
        +
        +		this._on( this.element, {
        +			keydown: function( event ) {
        +				if ( this.element.prop( "readOnly" ) ) {
        +					suppressKeyPress = true;
        +					suppressInput = true;
        +					suppressKeyPressRepeat = true;
        +					return;
        +				}
        +
        +				suppressKeyPress = false;
        +				suppressInput = false;
        +				suppressKeyPressRepeat = false;
        +				var keyCode = $.ui.keyCode;
        +				switch ( event.keyCode ) {
        +				case keyCode.PAGE_UP:
        +					suppressKeyPress = true;
        +					this._move( "previousPage", event );
        +					break;
        +				case keyCode.PAGE_DOWN:
        +					suppressKeyPress = true;
        +					this._move( "nextPage", event );
        +					break;
        +				case keyCode.UP:
        +					suppressKeyPress = true;
        +					this._keyEvent( "previous", event );
        +					break;
        +				case keyCode.DOWN:
        +					suppressKeyPress = true;
        +					this._keyEvent( "next", event );
        +					break;
        +				case keyCode.ENTER:
        +
        +					// when menu is open and has focus
        +					if ( this.menu.active ) {
        +
        +						// #6055 - Opera still allows the keypress to occur
        +						// which causes forms to submit
        +						suppressKeyPress = true;
        +						event.preventDefault();
        +						this.menu.select( event );
        +					}
        +					break;
        +				case keyCode.TAB:
        +					if ( this.menu.active ) {
        +						this.menu.select( event );
        +					}
        +					break;
        +				case keyCode.ESCAPE:
        +					if ( this.menu.element.is( ":visible" ) ) {
        +						if ( !this.isMultiLine ) {
        +							this._value( this.term );
        +						}
        +						this.close( event );
        +
        +						// Different browsers have different default behavior for escape
        +						// Single press can mean undo or clear
        +						// Double press in IE means clear the whole form
        +						event.preventDefault();
        +					}
        +					break;
        +				default:
        +					suppressKeyPressRepeat = true;
        +
        +					// search timeout should be triggered before the input value is changed
        +					this._searchTimeout( event );
        +					break;
        +				}
        +			},
        +			keypress: function( event ) {
        +				if ( suppressKeyPress ) {
        +					suppressKeyPress = false;
        +					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        +						event.preventDefault();
        +					}
        +					return;
        +				}
        +				if ( suppressKeyPressRepeat ) {
        +					return;
        +				}
        +
        +				// Replicate some key handlers to allow them to repeat in Firefox and Opera
        +				var keyCode = $.ui.keyCode;
        +				switch ( event.keyCode ) {
        +				case keyCode.PAGE_UP:
        +					this._move( "previousPage", event );
        +					break;
        +				case keyCode.PAGE_DOWN:
        +					this._move( "nextPage", event );
        +					break;
        +				case keyCode.UP:
        +					this._keyEvent( "previous", event );
        +					break;
        +				case keyCode.DOWN:
        +					this._keyEvent( "next", event );
        +					break;
        +				}
        +			},
        +			input: function( event ) {
        +				if ( suppressInput ) {
        +					suppressInput = false;
        +					event.preventDefault();
        +					return;
        +				}
        +				this._searchTimeout( event );
        +			},
        +			focus: function() {
        +				this.selectedItem = null;
        +				this.previous = this._value();
        +			},
        +			blur: function( event ) {
        +				if ( this.cancelBlur ) {
        +					delete this.cancelBlur;
        +					return;
        +				}
        +
        +				clearTimeout( this.searching );
        +				this.close( event );
        +				this._change( event );
        +			}
        +		} );
        +
        +		this._initSource();
        +		this.menu = $( "<ul>" )
        +			.appendTo( this._appendTo() )
        +			.menu( {
        +
        +				// disable ARIA support, the live region takes care of that
        +				role: null
        +			} )
        +			.hide()
        +			.menu( "instance" );
        +
        +		this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
        +		this._on( this.menu.element, {
        +			mousedown: function( event ) {
        +
        +				// prevent moving focus out of the text field
        +				event.preventDefault();
        +
        +				// IE doesn't prevent moving focus even with event.preventDefault()
        +				// so we set a flag to know when we should ignore the blur event
        +				this.cancelBlur = true;
        +				this._delay( function() {
        +					delete this.cancelBlur;
        +
        +					// Support: IE 8 only
        +					// Right clicking a menu item or selecting text from the menu items will
        +					// result in focus moving out of the input. However, we've already received
        +					// and ignored the blur event because of the cancelBlur flag set above. So
        +					// we restore focus to ensure that the menu closes properly based on the user's
        +					// next actions.
        +					if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
        +						this.element.trigger( "focus" );
        +					}
        +				} );
        +			},
        +			menufocus: function( event, ui ) {
        +				var label, item;
        +
        +				// support: Firefox
        +				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
        +				if ( this.isNewMenu ) {
        +					this.isNewMenu = false;
        +					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
        +						this.menu.blur();
        +
        +						this.document.one( "mousemove", function() {
        +							$( event.target ).trigger( event.originalEvent );
        +						} );
        +
        +						return;
        +					}
        +				}
        +
        +				item = ui.item.data( "ui-autocomplete-item" );
        +				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
        +
        +					// use value to match what will end up in the input, if it was a key event
        +					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
        +						this._value( item.value );
        +					}
        +				}
        +
        +				// Announce the value in the liveRegion
        +				label = ui.item.attr( "aria-label" ) || item.value;
        +				if ( label && $.trim( label ).length ) {
        +					this.liveRegion.children().hide();
        +					$( "<div>" ).text( label ).appendTo( this.liveRegion );
        +				}
        +			},
        +			menuselect: function( event, ui ) {
        +				var item = ui.item.data( "ui-autocomplete-item" ),
        +					previous = this.previous;
        +
        +				// Only trigger when focus was lost (click on menu)
        +				if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
        +					this.element.trigger( "focus" );
        +					this.previous = previous;
        +
        +					// #6109 - IE triggers two focus events and the second
        +					// is asynchronous, so we need to reset the previous
        +					// term synchronously and asynchronously :-(
        +					this._delay( function() {
        +						this.previous = previous;
        +						this.selectedItem = item;
        +					} );
        +				}
        +
        +				if ( false !== this._trigger( "select", event, { item: item } ) ) {
        +					this._value( item.value );
        +				}
        +
        +				// reset the term after the select event
        +				// this allows custom select handling to work properly
        +				this.term = this._value();
        +
        +				this.close( event );
        +				this.selectedItem = item;
        +			}
        +		} );
        +
        +		this.liveRegion = $( "<div>", {
        +			role: "status",
        +			"aria-live": "assertive",
        +			"aria-relevant": "additions"
        +		} )
        +			.appendTo( this.document[ 0 ].body );
        +
        +		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
        +
        +		// Turning off autocomplete prevents the browser from remembering the
        +		// value when navigating through history, so we re-enable autocomplete
        +		// if the page is unloaded before the widget is destroyed. #7790
        +		this._on( this.window, {
        +			beforeunload: function() {
        +				this.element.removeAttr( "autocomplete" );
        +			}
        +		} );
        +	},
        +
        +	_destroy: function() {
        +		clearTimeout( this.searching );
        +		this.element.removeAttr( "autocomplete" );
        +		this.menu.element.remove();
        +		this.liveRegion.remove();
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +		if ( key === "source" ) {
        +			this._initSource();
        +		}
        +		if ( key === "appendTo" ) {
        +			this.menu.element.appendTo( this._appendTo() );
        +		}
        +		if ( key === "disabled" && value && this.xhr ) {
        +			this.xhr.abort();
        +		}
        +	},
        +
        +	_isEventTargetInWidget: function( event ) {
        +		var menuElement = this.menu.element[ 0 ];
        +
        +		return event.target === this.element[ 0 ] ||
        +			event.target === menuElement ||
        +			$.contains( menuElement, event.target );
        +	},
        +
        +	_closeOnClickOutside: function( event ) {
        +		if ( !this._isEventTargetInWidget( event ) ) {
        +			this.close();
        +		}
        +	},
        +
        +	_appendTo: function() {
        +		var element = this.options.appendTo;
        +
        +		if ( element ) {
        +			element = element.jquery || element.nodeType ?
        +				$( element ) :
        +				this.document.find( element ).eq( 0 );
        +		}
        +
        +		if ( !element || !element[ 0 ] ) {
        +			element = this.element.closest( ".ui-front, dialog" );
        +		}
        +
        +		if ( !element.length ) {
        +			element = this.document[ 0 ].body;
        +		}
        +
        +		return element;
        +	},
        +
        +	_initSource: function() {
        +		var array, url,
        +			that = this;
        +		if ( $.isArray( this.options.source ) ) {
        +			array = this.options.source;
        +			this.source = function( request, response ) {
        +				response( $.ui.autocomplete.filter( array, request.term ) );
        +			};
        +		} else if ( typeof this.options.source === "string" ) {
        +			url = this.options.source;
        +			this.source = function( request, response ) {
        +				if ( that.xhr ) {
        +					that.xhr.abort();
        +				}
        +				that.xhr = $.ajax( {
        +					url: url,
        +					data: request,
        +					dataType: "json",
        +					success: function( data ) {
        +						response( data );
        +					},
        +					error: function() {
        +						response( [] );
        +					}
        +				} );
        +			};
        +		} else {
        +			this.source = this.options.source;
        +		}
        +	},
        +
        +	_searchTimeout: function( event ) {
        +		clearTimeout( this.searching );
        +		this.searching = this._delay( function() {
        +
        +			// Search if the value has changed, or if the user retypes the same value (see #7434)
        +			var equalValues = this.term === this._value(),
        +				menuVisible = this.menu.element.is( ":visible" ),
        +				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
        +
        +			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
        +				this.selectedItem = null;
        +				this.search( null, event );
        +			}
        +		}, this.options.delay );
        +	},
        +
        +	search: function( value, event ) {
        +		value = value != null ? value : this._value();
        +
        +		// Always save the actual value, not the one passed as an argument
        +		this.term = this._value();
        +
        +		if ( value.length < this.options.minLength ) {
        +			return this.close( event );
        +		}
        +
        +		if ( this._trigger( "search", event ) === false ) {
        +			return;
        +		}
        +
        +		return this._search( value );
        +	},
        +
        +	_search: function( value ) {
        +		this.pending++;
        +		this._addClass( "ui-autocomplete-loading" );
        +		this.cancelSearch = false;
        +
        +		this.source( { term: value }, this._response() );
        +	},
        +
        +	_response: function() {
        +		var index = ++this.requestIndex;
        +
        +		return $.proxy( function( content ) {
        +			if ( index === this.requestIndex ) {
        +				this.__response( content );
        +			}
        +
        +			this.pending--;
        +			if ( !this.pending ) {
        +				this._removeClass( "ui-autocomplete-loading" );
        +			}
        +		}, this );
        +	},
        +
        +	__response: function( content ) {
        +		if ( content ) {
        +			content = this._normalize( content );
        +		}
        +		this._trigger( "response", null, { content: content } );
        +		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
        +			this._suggest( content );
        +			this._trigger( "open" );
        +		} else {
        +
        +			// use ._close() instead of .close() so we don't cancel future searches
        +			this._close();
        +		}
        +	},
        +
        +	close: function( event ) {
        +		this.cancelSearch = true;
        +		this._close( event );
        +	},
        +
        +	_close: function( event ) {
        +
        +		// Remove the handler that closes the menu on outside clicks
        +		this._off( this.document, "mousedown" );
        +
        +		if ( this.menu.element.is( ":visible" ) ) {
        +			this.menu.element.hide();
        +			this.menu.blur();
        +			this.isNewMenu = true;
        +			this._trigger( "close", event );
        +		}
        +	},
        +
        +	_change: function( event ) {
        +		if ( this.previous !== this._value() ) {
        +			this._trigger( "change", event, { item: this.selectedItem } );
        +		}
        +	},
        +
        +	_normalize: function( items ) {
        +
        +		// assume all items have the right format when the first item is complete
        +		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
        +			return items;
        +		}
        +		return $.map( items, function( item ) {
        +			if ( typeof item === "string" ) {
        +				return {
        +					label: item,
        +					value: item
        +				};
        +			}
        +			return $.extend( {}, item, {
        +				label: item.label || item.value,
        +				value: item.value || item.label
        +			} );
        +		} );
        +	},
        +
        +	_suggest: function( items ) {
        +		var ul = this.menu.element.empty();
        +		this._renderMenu( ul, items );
        +		this.isNewMenu = true;
        +		this.menu.refresh();
        +
        +		// Size and position menu
        +		ul.show();
        +		this._resizeMenu();
        +		ul.position( $.extend( {
        +			of: this.element
        +		}, this.options.position ) );
        +
        +		if ( this.options.autoFocus ) {
        +			this.menu.next();
        +		}
        +
        +		// Listen for interactions outside of the widget (#6642)
        +		this._on( this.document, {
        +			mousedown: "_closeOnClickOutside"
        +		} );
        +	},
        +
        +	_resizeMenu: function() {
        +		var ul = this.menu.element;
        +		ul.outerWidth( Math.max(
        +
        +			// Firefox wraps long text (possibly a rounding bug)
        +			// so we add 1px to avoid the wrapping (#7513)
        +			ul.width( "" ).outerWidth() + 1,
        +			this.element.outerWidth()
        +		) );
        +	},
        +
        +	_renderMenu: function( ul, items ) {
        +		var that = this;
        +		$.each( items, function( index, item ) {
        +			that._renderItemData( ul, item );
        +		} );
        +	},
        +
        +	_renderItemData: function( ul, item ) {
        +		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
        +	},
        +
        +	_renderItem: function( ul, item ) {
        +		return $( "<li>" )
        +			.append( $( "<div>" ).text( item.label ) )
        +			.appendTo( ul );
        +	},
        +
        +	_move: function( direction, event ) {
        +		if ( !this.menu.element.is( ":visible" ) ) {
        +			this.search( null, event );
        +			return;
        +		}
        +		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
        +				this.menu.isLastItem() && /^next/.test( direction ) ) {
        +
        +			if ( !this.isMultiLine ) {
        +				this._value( this.term );
        +			}
        +
        +			this.menu.blur();
        +			return;
        +		}
        +		this.menu[ direction ]( event );
        +	},
        +
        +	widget: function() {
        +		return this.menu.element;
        +	},
        +
        +	_value: function() {
        +		return this.valueMethod.apply( this.element, arguments );
        +	},
        +
        +	_keyEvent: function( keyEvent, event ) {
        +		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        +			this._move( keyEvent, event );
        +
        +			// Prevents moving cursor to beginning/end of the text field in some browsers
        +			event.preventDefault();
        +		}
        +	},
        +
        +	// Support: Chrome <=50
        +	// We should be able to just use this.element.prop( "isContentEditable" )
        +	// but hidden elements always report false in Chrome.
        +	// https://code.google.com/p/chromium/issues/detail?id=313082
        +	_isContentEditable: function( element ) {
        +		if ( !element.length ) {
        +			return false;
        +		}
        +
        +		var editable = element.prop( "contentEditable" );
        +
        +		if ( editable === "inherit" ) {
        +		  return this._isContentEditable( element.parent() );
        +		}
        +
        +		return editable === "true";
        +	}
        +} );
        +
        +$.extend( $.ui.autocomplete, {
        +	escapeRegex: function( value ) {
        +		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
        +	},
        +	filter: function( array, term ) {
        +		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
        +		return $.grep( array, function( value ) {
        +			return matcher.test( value.label || value.value || value );
        +		} );
        +	}
        +} );
        +
        +// Live region extension, adding a `messages` option
        +// NOTE: This is an experimental API. We are still investigating
        +// a full solution for string manipulation and internationalization.
        +$.widget( "ui.autocomplete", $.ui.autocomplete, {
        +	options: {
        +		messages: {
        +			noResults: "No search results.",
        +			results: function( amount ) {
        +				return amount + ( amount > 1 ? " results are" : " result is" ) +
        +					" available, use up and down arrow keys to navigate.";
        +			}
        +		}
        +	},
        +
        +	__response: function( content ) {
        +		var message;
        +		this._superApply( arguments );
        +		if ( this.options.disabled || this.cancelSearch ) {
        +			return;
        +		}
        +		if ( content && content.length ) {
        +			message = this.options.messages.results( content.length );
        +		} else {
        +			message = this.options.messages.noResults;
        +		}
        +		this.liveRegion.children().hide();
        +		$( "<div>" ).text( message ).appendTo( this.liveRegion );
        +	}
        +} );
        +
        +return $.ui.autocomplete;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/button.js b/bower_components/jquery-ui/ui/widgets/button.js
        new file mode 100644
        index 0000000000..62cc43fcd1
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/button.js
        @@ -0,0 +1,386 @@
        +/*!
        + * jQuery UI Button 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Button
        +//>>group: Widgets
        +//>>description: Enhances a form with themeable buttons.
        +//>>docs: http://api.jqueryui.com/button/
        +//>>demos: http://jqueryui.com/button/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/button.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +
        +			// These are only for backcompat
        +			// TODO: Remove after 1.12
        +			"./controlgroup",
        +			"./checkboxradio",
        +
        +			"../keycode",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.button", {
        +	version: "1.12.1",
        +	defaultElement: "<button>",
        +	options: {
        +		classes: {
        +			"ui-button": "ui-corner-all"
        +		},
        +		disabled: null,
        +		icon: null,
        +		iconPosition: "beginning",
        +		label: null,
        +		showLabel: true
        +	},
        +
        +	_getCreateOptions: function() {
        +		var disabled,
        +
        +			// This is to support cases like in jQuery Mobile where the base widget does have
        +			// an implementation of _getCreateOptions
        +			options = this._super() || {};
        +
        +		this.isInput = this.element.is( "input" );
        +
        +		disabled = this.element[ 0 ].disabled;
        +		if ( disabled != null ) {
        +			options.disabled = disabled;
        +		}
        +
        +		this.originalLabel = this.isInput ? this.element.val() : this.element.html();
        +		if ( this.originalLabel ) {
        +			options.label = this.originalLabel;
        +		}
        +
        +		return options;
        +	},
        +
        +	_create: function() {
        +		if ( !this.option.showLabel & !this.options.icon ) {
        +			this.options.showLabel = true;
        +		}
        +
        +		// We have to check the option again here even though we did in _getCreateOptions,
        +		// because null may have been passed on init which would override what was set in
        +		// _getCreateOptions
        +		if ( this.options.disabled == null ) {
        +			this.options.disabled = this.element[ 0 ].disabled || false;
        +		}
        +
        +		this.hasTitle = !!this.element.attr( "title" );
        +
        +		// Check to see if the label needs to be set or if its already correct
        +		if ( this.options.label && this.options.label !== this.originalLabel ) {
        +			if ( this.isInput ) {
        +				this.element.val( this.options.label );
        +			} else {
        +				this.element.html( this.options.label );
        +			}
        +		}
        +		this._addClass( "ui-button", "ui-widget" );
        +		this._setOption( "disabled", this.options.disabled );
        +		this._enhance();
        +
        +		if ( this.element.is( "a" ) ) {
        +			this._on( {
        +				"keyup": function( event ) {
        +					if ( event.keyCode === $.ui.keyCode.SPACE ) {
        +						event.preventDefault();
        +
        +						// Support: PhantomJS <= 1.9, IE 8 Only
        +						// If a native click is available use it so we actually cause navigation
        +						// otherwise just trigger a click event
        +						if ( this.element[ 0 ].click ) {
        +							this.element[ 0 ].click();
        +						} else {
        +							this.element.trigger( "click" );
        +						}
        +					}
        +				}
        +			} );
        +		}
        +	},
        +
        +	_enhance: function() {
        +		if ( !this.element.is( "button" ) ) {
        +			this.element.attr( "role", "button" );
        +		}
        +
        +		if ( this.options.icon ) {
        +			this._updateIcon( "icon", this.options.icon );
        +			this._updateTooltip();
        +		}
        +	},
        +
        +	_updateTooltip: function() {
        +		this.title = this.element.attr( "title" );
        +
        +		if ( !this.options.showLabel && !this.title ) {
        +			this.element.attr( "title", this.options.label );
        +		}
        +	},
        +
        +	_updateIcon: function( option, value ) {
        +		var icon = option !== "iconPosition",
        +			position = icon ? this.options.iconPosition : value,
        +			displayBlock = position === "top" || position === "bottom";
        +
        +		// Create icon
        +		if ( !this.icon ) {
        +			this.icon = $( "<span>" );
        +
        +			this._addClass( this.icon, "ui-button-icon", "ui-icon" );
        +
        +			if ( !this.options.showLabel ) {
        +				this._addClass( "ui-button-icon-only" );
        +			}
        +		} else if ( icon ) {
        +
        +			// If we are updating the icon remove the old icon class
        +			this._removeClass( this.icon, null, this.options.icon );
        +		}
        +
        +		// If we are updating the icon add the new icon class
        +		if ( icon ) {
        +			this._addClass( this.icon, null, value );
        +		}
        +
        +		this._attachIcon( position );
        +
        +		// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
        +		// the iconSpace if there is one.
        +		if ( displayBlock ) {
        +			this._addClass( this.icon, null, "ui-widget-icon-block" );
        +			if ( this.iconSpace ) {
        +				this.iconSpace.remove();
        +			}
        +		} else {
        +
        +			// Position is beginning or end so remove the ui-widget-icon-block class and add the
        +			// space if it does not exist
        +			if ( !this.iconSpace ) {
        +				this.iconSpace = $( "<span> </span>" );
        +				this._addClass( this.iconSpace, "ui-button-icon-space" );
        +			}
        +			this._removeClass( this.icon, null, "ui-wiget-icon-block" );
        +			this._attachIconSpace( position );
        +		}
        +	},
        +
        +	_destroy: function() {
        +		this.element.removeAttr( "role" );
        +
        +		if ( this.icon ) {
        +			this.icon.remove();
        +		}
        +		if ( this.iconSpace ) {
        +			this.iconSpace.remove();
        +		}
        +		if ( !this.hasTitle ) {
        +			this.element.removeAttr( "title" );
        +		}
        +	},
        +
        +	_attachIconSpace: function( iconPosition ) {
        +		this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
        +	},
        +
        +	_attachIcon: function( iconPosition ) {
        +		this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
        +	},
        +
        +	_setOptions: function( options ) {
        +		var newShowLabel = options.showLabel === undefined ?
        +				this.options.showLabel :
        +				options.showLabel,
        +			newIcon = options.icon === undefined ? this.options.icon : options.icon;
        +
        +		if ( !newShowLabel && !newIcon ) {
        +			options.showLabel = true;
        +		}
        +		this._super( options );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "icon" ) {
        +			if ( value ) {
        +				this._updateIcon( key, value );
        +			} else if ( this.icon ) {
        +				this.icon.remove();
        +				if ( this.iconSpace ) {
        +					this.iconSpace.remove();
        +				}
        +			}
        +		}
        +
        +		if ( key === "iconPosition" ) {
        +			this._updateIcon( key, value );
        +		}
        +
        +		// Make sure we can't end up with a button that has neither text nor icon
        +		if ( key === "showLabel" ) {
        +				this._toggleClass( "ui-button-icon-only", null, !value );
        +				this._updateTooltip();
        +		}
        +
        +		if ( key === "label" ) {
        +			if ( this.isInput ) {
        +				this.element.val( value );
        +			} else {
        +
        +				// If there is an icon, append it, else nothing then append the value
        +				// this avoids removal of the icon when setting label text
        +				this.element.html( value );
        +				if ( this.icon ) {
        +					this._attachIcon( this.options.iconPosition );
        +					this._attachIconSpace( this.options.iconPosition );
        +				}
        +			}
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "disabled" ) {
        +			this._toggleClass( null, "ui-state-disabled", value );
        +			this.element[ 0 ].disabled = value;
        +			if ( value ) {
        +				this.element.blur();
        +			}
        +		}
        +	},
        +
        +	refresh: function() {
        +
        +		// Make sure to only check disabled if its an element that supports this otherwise
        +		// check for the disabled class to determine state
        +		var isDisabled = this.element.is( "input, button" ) ?
        +			this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
        +
        +		if ( isDisabled !== this.options.disabled ) {
        +			this._setOptions( { disabled: isDisabled } );
        +		}
        +
        +		this._updateTooltip();
        +	}
        +} );
        +
        +// DEPRECATED
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Text and Icons options
        +	$.widget( "ui.button", $.ui.button, {
        +		options: {
        +			text: true,
        +			icons: {
        +				primary: null,
        +				secondary: null
        +			}
        +		},
        +
        +		_create: function() {
        +			if ( this.options.showLabel && !this.options.text ) {
        +				this.options.showLabel = this.options.text;
        +			}
        +			if ( !this.options.showLabel && this.options.text ) {
        +				this.options.text = this.options.showLabel;
        +			}
        +			if ( !this.options.icon && ( this.options.icons.primary ||
        +					this.options.icons.secondary ) ) {
        +				if ( this.options.icons.primary ) {
        +					this.options.icon = this.options.icons.primary;
        +				} else {
        +					this.options.icon = this.options.icons.secondary;
        +					this.options.iconPosition = "end";
        +				}
        +			} else if ( this.options.icon ) {
        +				this.options.icons.primary = this.options.icon;
        +			}
        +			this._super();
        +		},
        +
        +		_setOption: function( key, value ) {
        +			if ( key === "text" ) {
        +				this._super( "showLabel", value );
        +				return;
        +			}
        +			if ( key === "showLabel" ) {
        +				this.options.text = value;
        +			}
        +			if ( key === "icon" ) {
        +				this.options.icons.primary = value;
        +			}
        +			if ( key === "icons" ) {
        +				if ( value.primary ) {
        +					this._super( "icon", value.primary );
        +					this._super( "iconPosition", "beginning" );
        +				} else if ( value.secondary ) {
        +					this._super( "icon", value.secondary );
        +					this._super( "iconPosition", "end" );
        +				}
        +			}
        +			this._superApply( arguments );
        +		}
        +	} );
        +
        +	$.fn.button = ( function( orig ) {
        +		return function() {
        +			if ( !this.length || ( this.length && this[ 0 ].tagName !== "INPUT" ) ||
        +					( this.length && this[ 0 ].tagName === "INPUT" && (
        +						this.attr( "type" ) !== "checkbox" && this.attr( "type" ) !== "radio"
        +					) ) ) {
        +				return orig.apply( this, arguments );
        +			}
        +			if ( !$.ui.checkboxradio ) {
        +				$.error( "Checkboxradio widget missing" );
        +			}
        +			if ( arguments.length === 0 ) {
        +				return this.checkboxradio( {
        +					"icon": false
        +				} );
        +			}
        +			return this.checkboxradio.apply( this, arguments );
        +		};
        +	} )( $.fn.button );
        +
        +	$.fn.buttonset = function() {
        +		if ( !$.ui.controlgroup ) {
        +			$.error( "Controlgroup widget missing" );
        +		}
        +		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
        +			return this.controlgroup.apply( this,
        +				[ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
        +		}
        +		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
        +			return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
        +		}
        +		if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
        +			arguments[ 0 ].items = {
        +				button: arguments[ 0 ].items
        +			};
        +		}
        +		return this.controlgroup.apply( this, arguments );
        +	};
        +}
        +
        +return $.ui.button;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/checkboxradio.js b/bower_components/jquery-ui/ui/widgets/checkboxradio.js
        new file mode 100644
        index 0000000000..ee70d848bb
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/checkboxradio.js
        @@ -0,0 +1,286 @@
        +/*!
        + * jQuery UI Checkboxradio 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Checkboxradio
        +//>>group: Widgets
        +//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
        +//>>docs: http://api.jqueryui.com/checkboxradio/
        +//>>demos: http://jqueryui.com/checkboxradio/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/button.css
        +//>>css.structure: ../../themes/base/checkboxradio.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../escape-selector",
        +			"../form-reset-mixin",
        +			"../labels",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
        +	version: "1.12.1",
        +	options: {
        +		disabled: null,
        +		label: null,
        +		icon: true,
        +		classes: {
        +			"ui-checkboxradio-label": "ui-corner-all",
        +			"ui-checkboxradio-icon": "ui-corner-all"
        +		}
        +	},
        +
        +	_getCreateOptions: function() {
        +		var disabled, labels;
        +		var that = this;
        +		var options = this._super() || {};
        +
        +		// We read the type here, because it makes more sense to throw a element type error first,
        +		// rather then the error for lack of a label. Often if its the wrong type, it
        +		// won't have a label (e.g. calling on a div, btn, etc)
        +		this._readType();
        +
        +		labels = this.element.labels();
        +
        +		// If there are multiple labels, use the last one
        +		this.label = $( labels[ labels.length - 1 ] );
        +		if ( !this.label.length ) {
        +			$.error( "No label found for checkboxradio widget" );
        +		}
        +
        +		this.originalLabel = "";
        +
        +		// We need to get the label text but this may also need to make sure it does not contain the
        +		// input itself.
        +		this.label.contents().not( this.element[ 0 ] ).each( function() {
        +
        +			// The label contents could be text, html, or a mix. We concat each element to get a
        +			// string representation of the label, without the input as part of it.
        +			that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
        +		} );
        +
        +		// Set the label option if we found label text
        +		if ( this.originalLabel ) {
        +			options.label = this.originalLabel;
        +		}
        +
        +		disabled = this.element[ 0 ].disabled;
        +		if ( disabled != null ) {
        +			options.disabled = disabled;
        +		}
        +		return options;
        +	},
        +
        +	_create: function() {
        +		var checked = this.element[ 0 ].checked;
        +
        +		this._bindFormResetHandler();
        +
        +		if ( this.options.disabled == null ) {
        +			this.options.disabled = this.element[ 0 ].disabled;
        +		}
        +
        +		this._setOption( "disabled", this.options.disabled );
        +		this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
        +		this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
        +
        +		if ( this.type === "radio" ) {
        +			this._addClass( this.label, "ui-checkboxradio-radio-label" );
        +		}
        +
        +		if ( this.options.label && this.options.label !== this.originalLabel ) {
        +			this._updateLabel();
        +		} else if ( this.originalLabel ) {
        +			this.options.label = this.originalLabel;
        +		}
        +
        +		this._enhance();
        +
        +		if ( checked ) {
        +			this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
        +			if ( this.icon ) {
        +				this._addClass( this.icon, null, "ui-state-hover" );
        +			}
        +		}
        +
        +		this._on( {
        +			change: "_toggleClasses",
        +			focus: function() {
        +				this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
        +			},
        +			blur: function() {
        +				this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
        +			}
        +		} );
        +	},
        +
        +	_readType: function() {
        +		var nodeName = this.element[ 0 ].nodeName.toLowerCase();
        +		this.type = this.element[ 0 ].type;
        +		if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
        +			$.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
        +				" and element.type=" + this.type );
        +		}
        +	},
        +
        +	// Support jQuery Mobile enhanced option
        +	_enhance: function() {
        +		this._updateIcon( this.element[ 0 ].checked );
        +	},
        +
        +	widget: function() {
        +		return this.label;
        +	},
        +
        +	_getRadioGroup: function() {
        +		var group;
        +		var name = this.element[ 0 ].name;
        +		var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";
        +
        +		if ( !name ) {
        +			return $( [] );
        +		}
        +
        +		if ( this.form.length ) {
        +			group = $( this.form[ 0 ].elements ).filter( nameSelector );
        +		} else {
        +
        +			// Not inside a form, check all inputs that also are not inside a form
        +			group = $( nameSelector ).filter( function() {
        +				return $( this ).form().length === 0;
        +			} );
        +		}
        +
        +		return group.not( this.element );
        +	},
        +
        +	_toggleClasses: function() {
        +		var checked = this.element[ 0 ].checked;
        +		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
        +
        +		if ( this.options.icon && this.type === "checkbox" ) {
        +			this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
        +				._toggleClass( this.icon, null, "ui-icon-blank", !checked );
        +		}
        +
        +		if ( this.type === "radio" ) {
        +			this._getRadioGroup()
        +				.each( function() {
        +					var instance = $( this ).checkboxradio( "instance" );
        +
        +					if ( instance ) {
        +						instance._removeClass( instance.label,
        +							"ui-checkboxradio-checked", "ui-state-active" );
        +					}
        +				} );
        +		}
        +	},
        +
        +	_destroy: function() {
        +		this._unbindFormResetHandler();
        +
        +		if ( this.icon ) {
        +			this.icon.remove();
        +			this.iconSpace.remove();
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +
        +		// We don't allow the value to be set to nothing
        +		if ( key === "label" && !value ) {
        +			return;
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "disabled" ) {
        +			this._toggleClass( this.label, null, "ui-state-disabled", value );
        +			this.element[ 0 ].disabled = value;
        +
        +			// Don't refresh when setting disabled
        +			return;
        +		}
        +		this.refresh();
        +	},
        +
        +	_updateIcon: function( checked ) {
        +		var toAdd = "ui-icon ui-icon-background ";
        +
        +		if ( this.options.icon ) {
        +			if ( !this.icon ) {
        +				this.icon = $( "<span>" );
        +				this.iconSpace = $( "<span> </span>" );
        +				this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
        +			}
        +
        +			if ( this.type === "checkbox" ) {
        +				toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
        +				this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
        +			} else {
        +				toAdd += "ui-icon-blank";
        +			}
        +			this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
        +			if ( !checked ) {
        +				this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
        +			}
        +			this.icon.prependTo( this.label ).after( this.iconSpace );
        +		} else if ( this.icon !== undefined ) {
        +			this.icon.remove();
        +			this.iconSpace.remove();
        +			delete this.icon;
        +		}
        +	},
        +
        +	_updateLabel: function() {
        +
        +		// Remove the contents of the label ( minus the icon, icon space, and input )
        +		var contents = this.label.contents().not( this.element[ 0 ] );
        +		if ( this.icon ) {
        +			contents = contents.not( this.icon[ 0 ] );
        +		}
        +		if ( this.iconSpace ) {
        +			contents = contents.not( this.iconSpace[ 0 ] );
        +		}
        +		contents.remove();
        +
        +		this.label.append( this.options.label );
        +	},
        +
        +	refresh: function() {
        +		var checked = this.element[ 0 ].checked,
        +			isDisabled = this.element[ 0 ].disabled;
        +
        +		this._updateIcon( checked );
        +		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
        +		if ( this.options.label !== null ) {
        +			this._updateLabel();
        +		}
        +
        +		if ( isDisabled !== this.options.disabled ) {
        +			this._setOptions( { "disabled": isDisabled } );
        +		}
        +	}
        +
        +} ] );
        +
        +return $.ui.checkboxradio;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/controlgroup.js b/bower_components/jquery-ui/ui/widgets/controlgroup.js
        new file mode 100644
        index 0000000000..b8234fb4a4
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/controlgroup.js
        @@ -0,0 +1,298 @@
        +/*!
        + * jQuery UI Controlgroup 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Controlgroup
        +//>>group: Widgets
        +//>>description: Visually groups form control widgets
        +//>>docs: http://api.jqueryui.com/controlgroup/
        +//>>demos: http://jqueryui.com/controlgroup/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/controlgroup.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
        +
        +return $.widget( "ui.controlgroup", {
        +	version: "1.12.1",
        +	defaultElement: "<div>",
        +	options: {
        +		direction: "horizontal",
        +		disabled: null,
        +		onlyVisible: true,
        +		items: {
        +			"button": "input[type=button], input[type=submit], input[type=reset], button, a",
        +			"controlgroupLabel": ".ui-controlgroup-label",
        +			"checkboxradio": "input[type='checkbox'], input[type='radio']",
        +			"selectmenu": "select",
        +			"spinner": ".ui-spinner-input"
        +		}
        +	},
        +
        +	_create: function() {
        +		this._enhance();
        +	},
        +
        +	// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
        +	_enhance: function() {
        +		this.element.attr( "role", "toolbar" );
        +		this.refresh();
        +	},
        +
        +	_destroy: function() {
        +		this._callChildMethod( "destroy" );
        +		this.childWidgets.removeData( "ui-controlgroup-data" );
        +		this.element.removeAttr( "role" );
        +		if ( this.options.items.controlgroupLabel ) {
        +			this.element
        +				.find( this.options.items.controlgroupLabel )
        +				.find( ".ui-controlgroup-label-contents" )
        +				.contents().unwrap();
        +		}
        +	},
        +
        +	_initWidgets: function() {
        +		var that = this,
        +			childWidgets = [];
        +
        +		// First we iterate over each of the items options
        +		$.each( this.options.items, function( widget, selector ) {
        +			var labels;
        +			var options = {};
        +
        +			// Make sure the widget has a selector set
        +			if ( !selector ) {
        +				return;
        +			}
        +
        +			if ( widget === "controlgroupLabel" ) {
        +				labels = that.element.find( selector );
        +				labels.each( function() {
        +					var element = $( this );
        +
        +					if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
        +						return;
        +					}
        +					element.contents()
        +						.wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
        +				} );
        +				that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
        +				childWidgets = childWidgets.concat( labels.get() );
        +				return;
        +			}
        +
        +			// Make sure the widget actually exists
        +			if ( !$.fn[ widget ] ) {
        +				return;
        +			}
        +
        +			// We assume everything is in the middle to start because we can't determine
        +			// first / last elements until all enhancments are done.
        +			if ( that[ "_" + widget + "Options" ] ) {
        +				options = that[ "_" + widget + "Options" ]( "middle" );
        +			} else {
        +				options = { classes: {} };
        +			}
        +
        +			// Find instances of this widget inside controlgroup and init them
        +			that.element
        +				.find( selector )
        +				.each( function() {
        +					var element = $( this );
        +					var instance = element[ widget ]( "instance" );
        +
        +					// We need to clone the default options for this type of widget to avoid
        +					// polluting the variable options which has a wider scope than a single widget.
        +					var instanceOptions = $.widget.extend( {}, options );
        +
        +					// If the button is the child of a spinner ignore it
        +					// TODO: Find a more generic solution
        +					if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
        +						return;
        +					}
        +
        +					// Create the widget if it doesn't exist
        +					if ( !instance ) {
        +						instance = element[ widget ]()[ widget ]( "instance" );
        +					}
        +					if ( instance ) {
        +						instanceOptions.classes =
        +							that._resolveClassesValues( instanceOptions.classes, instance );
        +					}
        +					element[ widget ]( instanceOptions );
        +
        +					// Store an instance of the controlgroup to be able to reference
        +					// from the outermost element for changing options and refresh
        +					var widgetElement = element[ widget ]( "widget" );
        +					$.data( widgetElement[ 0 ], "ui-controlgroup-data",
        +						instance ? instance : element[ widget ]( "instance" ) );
        +
        +					childWidgets.push( widgetElement[ 0 ] );
        +				} );
        +		} );
        +
        +		this.childWidgets = $( $.unique( childWidgets ) );
        +		this._addClass( this.childWidgets, "ui-controlgroup-item" );
        +	},
        +
        +	_callChildMethod: function( method ) {
        +		this.childWidgets.each( function() {
        +			var element = $( this ),
        +				data = element.data( "ui-controlgroup-data" );
        +			if ( data && data[ method ] ) {
        +				data[ method ]();
        +			}
        +		} );
        +	},
        +
        +	_updateCornerClass: function( element, position ) {
        +		var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
        +		var add = this._buildSimpleOptions( position, "label" ).classes.label;
        +
        +		this._removeClass( element, null, remove );
        +		this._addClass( element, null, add );
        +	},
        +
        +	_buildSimpleOptions: function( position, key ) {
        +		var direction = this.options.direction === "vertical";
        +		var result = {
        +			classes: {}
        +		};
        +		result.classes[ key ] = {
        +			"middle": "",
        +			"first": "ui-corner-" + ( direction ? "top" : "left" ),
        +			"last": "ui-corner-" + ( direction ? "bottom" : "right" ),
        +			"only": "ui-corner-all"
        +		}[ position ];
        +
        +		return result;
        +	},
        +
        +	_spinnerOptions: function( position ) {
        +		var options = this._buildSimpleOptions( position, "ui-spinner" );
        +
        +		options.classes[ "ui-spinner-up" ] = "";
        +		options.classes[ "ui-spinner-down" ] = "";
        +
        +		return options;
        +	},
        +
        +	_buttonOptions: function( position ) {
        +		return this._buildSimpleOptions( position, "ui-button" );
        +	},
        +
        +	_checkboxradioOptions: function( position ) {
        +		return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
        +	},
        +
        +	_selectmenuOptions: function( position ) {
        +		var direction = this.options.direction === "vertical";
        +		return {
        +			width: direction ? "auto" : false,
        +			classes: {
        +				middle: {
        +					"ui-selectmenu-button-open": "",
        +					"ui-selectmenu-button-closed": ""
        +				},
        +				first: {
        +					"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
        +					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
        +				},
        +				last: {
        +					"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
        +					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
        +				},
        +				only: {
        +					"ui-selectmenu-button-open": "ui-corner-top",
        +					"ui-selectmenu-button-closed": "ui-corner-all"
        +				}
        +
        +			}[ position ]
        +		};
        +	},
        +
        +	_resolveClassesValues: function( classes, instance ) {
        +		var result = {};
        +		$.each( classes, function( key ) {
        +			var current = instance.options.classes[ key ] || "";
        +			current = $.trim( current.replace( controlgroupCornerRegex, "" ) );
        +			result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
        +		} );
        +		return result;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "direction" ) {
        +			this._removeClass( "ui-controlgroup-" + this.options.direction );
        +		}
        +
        +		this._super( key, value );
        +		if ( key === "disabled" ) {
        +			this._callChildMethod( value ? "disable" : "enable" );
        +			return;
        +		}
        +
        +		this.refresh();
        +	},
        +
        +	refresh: function() {
        +		var children,
        +			that = this;
        +
        +		this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
        +
        +		if ( this.options.direction === "horizontal" ) {
        +			this._addClass( null, "ui-helper-clearfix" );
        +		}
        +		this._initWidgets();
        +
        +		children = this.childWidgets;
        +
        +		// We filter here because we need to track all childWidgets not just the visible ones
        +		if ( this.options.onlyVisible ) {
        +			children = children.filter( ":visible" );
        +		}
        +
        +		if ( children.length ) {
        +
        +			// We do this last because we need to make sure all enhancment is done
        +			// before determining first and last
        +			$.each( [ "first", "last" ], function( index, value ) {
        +				var instance = children[ value ]().data( "ui-controlgroup-data" );
        +
        +				if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
        +					var options = that[ "_" + instance.widgetName + "Options" ](
        +						children.length === 1 ? "only" : value
        +					);
        +					options.classes = that._resolveClassesValues( options.classes, instance );
        +					instance.element[ instance.widgetName ]( options );
        +				} else {
        +					that._updateCornerClass( children[ value ](), value );
        +				}
        +			} );
        +
        +			// Finally call the refresh method on each of the child widgets.
        +			this._callChildMethod( "refresh" );
        +		}
        +	}
        +} );
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/datepicker.js b/bower_components/jquery-ui/ui/widgets/datepicker.js
        new file mode 100644
        index 0000000000..8b6a4f4ecd
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/datepicker.js
        @@ -0,0 +1,2120 @@
        +// jscs:disable maximumLineLength
        +/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
        +/*!
        + * jQuery UI Datepicker 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Datepicker
        +//>>group: Widgets
        +//>>description: Displays a calendar from an input or inline for selecting dates.
        +//>>docs: http://api.jqueryui.com/datepicker/
        +//>>demos: http://jqueryui.com/datepicker/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/datepicker.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../keycode"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.extend( $.ui, { datepicker: { version: "1.12.1" } } );
        +
        +var datepicker_instActive;
        +
        +function datepicker_getZindex( elem ) {
        +	var position, value;
        +	while ( elem.length && elem[ 0 ] !== document ) {
        +
        +		// Ignore z-index if position is set to a value where z-index is ignored by the browser
        +		// This makes behavior of this function consistent across browsers
        +		// WebKit always returns auto if the element is positioned
        +		position = elem.css( "position" );
        +		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
        +
        +			// IE returns 0 when zIndex is not specified
        +			// other browsers return a string
        +			// we ignore the case of nested elements with an explicit value of 0
        +			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
        +			value = parseInt( elem.css( "zIndex" ), 10 );
        +			if ( !isNaN( value ) && value !== 0 ) {
        +				return value;
        +			}
        +		}
        +		elem = elem.parent();
        +	}
        +
        +	return 0;
        +}
        +/* Date picker manager.
        +   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
        +   Settings for (groups of) date pickers are maintained in an instance object,
        +   allowing multiple different settings on the same page. */
        +
        +function Datepicker() {
        +	this._curInst = null; // The current instance in use
        +	this._keyEvent = false; // If the last event was a key event
        +	this._disabledInputs = []; // List of date picker inputs that have been disabled
        +	this._datepickerShowing = false; // True if the popup picker is showing , false if not
        +	this._inDialog = false; // True if showing within a "dialog", false if not
        +	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
        +	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
        +	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
        +	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
        +	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
        +	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
        +	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
        +	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
        +	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
        +	this.regional = []; // Available regional settings, indexed by language code
        +	this.regional[ "" ] = { // Default regional settings
        +		closeText: "Done", // Display text for close link
        +		prevText: "Prev", // Display text for previous month link
        +		nextText: "Next", // Display text for next month link
        +		currentText: "Today", // Display text for current month link
        +		monthNames: [ "January","February","March","April","May","June",
        +			"July","August","September","October","November","December" ], // Names of months for drop-down and formatting
        +		monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
        +		dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
        +		dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
        +		dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], // Column headings for days starting at Sunday
        +		weekHeader: "Wk", // Column header for week of the year
        +		dateFormat: "mm/dd/yy", // See format options on parseDate
        +		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
        +		isRTL: false, // True if right-to-left language, false if left-to-right
        +		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
        +		yearSuffix: "" // Additional text to append to the year in the month headers
        +	};
        +	this._defaults = { // Global defaults for all the date picker instances
        +		showOn: "focus", // "focus" for popup on focus,
        +			// "button" for trigger button, or "both" for either
        +		showAnim: "fadeIn", // Name of jQuery animation for popup
        +		showOptions: {}, // Options for enhanced animations
        +		defaultDate: null, // Used when field is blank: actual date,
        +			// +/-number for offset from today, null for today
        +		appendText: "", // Display text following the input box, e.g. showing the format
        +		buttonText: "...", // Text for trigger button
        +		buttonImage: "", // URL for trigger button image
        +		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
        +		hideIfNoPrevNext: false, // True to hide next/previous month links
        +			// if not applicable, false to just disable them
        +		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
        +		gotoCurrent: false, // True if today link goes back to current selection instead
        +		changeMonth: false, // True if month can be selected directly, false if only prev/next
        +		changeYear: false, // True if year can be selected directly, false if only prev/next
        +		yearRange: "c-10:c+10", // Range of years to display in drop-down,
        +			// either relative to today's year (-nn:+nn), relative to currently displayed year
        +			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
        +		showOtherMonths: false, // True to show dates in other months, false to leave blank
        +		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
        +		showWeek: false, // True to show week of the year, false to not show it
        +		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
        +			// takes a Date and returns the number of the week for it
        +		shortYearCutoff: "+10", // Short year values < this are in the current century,
        +			// > this are in the previous century,
        +			// string value starting with "+" for current year + value
        +		minDate: null, // The earliest selectable date, or null for no limit
        +		maxDate: null, // The latest selectable date, or null for no limit
        +		duration: "fast", // Duration of display/closure
        +		beforeShowDay: null, // Function that takes a date and returns an array with
        +			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
        +			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
        +		beforeShow: null, // Function that takes an input field and
        +			// returns a set of custom settings for the date picker
        +		onSelect: null, // Define a callback function when a date is selected
        +		onChangeMonthYear: null, // Define a callback function when the month or year is changed
        +		onClose: null, // Define a callback function when the datepicker is closed
        +		numberOfMonths: 1, // Number of months to show at a time
        +		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
        +		stepMonths: 1, // Number of months to step back/forward
        +		stepBigMonths: 12, // Number of months to step back/forward for the big links
        +		altField: "", // Selector for an alternate field to store selected dates into
        +		altFormat: "", // The date format to use for the alternate field
        +		constrainInput: true, // The input is constrained by the current date format
        +		showButtonPanel: false, // True to show button panel, false to not show it
        +		autoSize: false, // True to size the input for the date format, false to leave as is
        +		disabled: false // The initial disabled state
        +	};
        +	$.extend( this._defaults, this.regional[ "" ] );
        +	this.regional.en = $.extend( true, {}, this.regional[ "" ] );
        +	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
        +	this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
        +}
        +
        +$.extend( Datepicker.prototype, {
        +	/* Class name added to elements to indicate already configured with a date picker. */
        +	markerClassName: "hasDatepicker",
        +
        +	//Keep track of the maximum number of rows displayed (see #7043)
        +	maxRows: 4,
        +
        +	// TODO rename to "widget" when switching to widget factory
        +	_widgetDatepicker: function() {
        +		return this.dpDiv;
        +	},
        +
        +	/* Override the default settings for all instances of the date picker.
        +	 * @param  settings  object - the new settings to use as defaults (anonymous object)
        +	 * @return the manager object
        +	 */
        +	setDefaults: function( settings ) {
        +		datepicker_extendRemove( this._defaults, settings || {} );
        +		return this;
        +	},
        +
        +	/* Attach the date picker to a jQuery selection.
        +	 * @param  target	element - the target input field or division or span
        +	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
        +	 */
        +	_attachDatepicker: function( target, settings ) {
        +		var nodeName, inline, inst;
        +		nodeName = target.nodeName.toLowerCase();
        +		inline = ( nodeName === "div" || nodeName === "span" );
        +		if ( !target.id ) {
        +			this.uuid += 1;
        +			target.id = "dp" + this.uuid;
        +		}
        +		inst = this._newInst( $( target ), inline );
        +		inst.settings = $.extend( {}, settings || {} );
        +		if ( nodeName === "input" ) {
        +			this._connectDatepicker( target, inst );
        +		} else if ( inline ) {
        +			this._inlineDatepicker( target, inst );
        +		}
        +	},
        +
        +	/* Create a new instance object. */
        +	_newInst: function( target, inline ) {
        +		var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
        +		return { id: id, input: target, // associated target
        +			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
        +			drawMonth: 0, drawYear: 0, // month being drawn
        +			inline: inline, // is datepicker inline or not
        +			dpDiv: ( !inline ? this.dpDiv : // presentation div
        +			datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
        +	},
        +
        +	/* Attach the date picker to an input field. */
        +	_connectDatepicker: function( target, inst ) {
        +		var input = $( target );
        +		inst.append = $( [] );
        +		inst.trigger = $( [] );
        +		if ( input.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +		this._attachments( input, inst );
        +		input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
        +			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
        +		this._autoSize( inst );
        +		$.data( target, "datepicker", inst );
        +
        +		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
        +		if ( inst.settings.disabled ) {
        +			this._disableDatepicker( target );
        +		}
        +	},
        +
        +	/* Make attachments based on settings. */
        +	_attachments: function( input, inst ) {
        +		var showOn, buttonText, buttonImage,
        +			appendText = this._get( inst, "appendText" ),
        +			isRTL = this._get( inst, "isRTL" );
        +
        +		if ( inst.append ) {
        +			inst.append.remove();
        +		}
        +		if ( appendText ) {
        +			inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + "</span>" );
        +			input[ isRTL ? "before" : "after" ]( inst.append );
        +		}
        +
        +		input.off( "focus", this._showDatepicker );
        +
        +		if ( inst.trigger ) {
        +			inst.trigger.remove();
        +		}
        +
        +		showOn = this._get( inst, "showOn" );
        +		if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
        +			input.on( "focus", this._showDatepicker );
        +		}
        +		if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
        +			buttonText = this._get( inst, "buttonText" );
        +			buttonImage = this._get( inst, "buttonImage" );
        +			inst.trigger = $( this._get( inst, "buttonImageOnly" ) ?
        +				$( "<img/>" ).addClass( this._triggerClass ).
        +					attr( { src: buttonImage, alt: buttonText, title: buttonText } ) :
        +				$( "<button type='button'></button>" ).addClass( this._triggerClass ).
        +					html( !buttonImage ? buttonText : $( "<img/>" ).attr(
        +					{ src:buttonImage, alt:buttonText, title:buttonText } ) ) );
        +			input[ isRTL ? "before" : "after" ]( inst.trigger );
        +			inst.trigger.on( "click", function() {
        +				if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
        +					$.datepicker._hideDatepicker();
        +				} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
        +					$.datepicker._hideDatepicker();
        +					$.datepicker._showDatepicker( input[ 0 ] );
        +				} else {
        +					$.datepicker._showDatepicker( input[ 0 ] );
        +				}
        +				return false;
        +			} );
        +		}
        +	},
        +
        +	/* Apply the maximum length for the date format. */
        +	_autoSize: function( inst ) {
        +		if ( this._get( inst, "autoSize" ) && !inst.inline ) {
        +			var findMax, max, maxI, i,
        +				date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
        +				dateFormat = this._get( inst, "dateFormat" );
        +
        +			if ( dateFormat.match( /[DM]/ ) ) {
        +				findMax = function( names ) {
        +					max = 0;
        +					maxI = 0;
        +					for ( i = 0; i < names.length; i++ ) {
        +						if ( names[ i ].length > max ) {
        +							max = names[ i ].length;
        +							maxI = i;
        +						}
        +					}
        +					return maxI;
        +				};
        +				date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
        +					"monthNames" : "monthNamesShort" ) ) ) );
        +				date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
        +					"dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
        +			}
        +			inst.input.attr( "size", this._formatDate( inst, date ).length );
        +		}
        +	},
        +
        +	/* Attach an inline date picker to a div. */
        +	_inlineDatepicker: function( target, inst ) {
        +		var divSpan = $( target );
        +		if ( divSpan.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +		divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
        +		$.data( target, "datepicker", inst );
        +		this._setDate( inst, this._getDefaultDate( inst ), true );
        +		this._updateDatepicker( inst );
        +		this._updateAlternate( inst );
        +
        +		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
        +		if ( inst.settings.disabled ) {
        +			this._disableDatepicker( target );
        +		}
        +
        +		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
        +		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
        +		inst.dpDiv.css( "display", "block" );
        +	},
        +
        +	/* Pop-up the date picker in a "dialog" box.
        +	 * @param  input element - ignored
        +	 * @param  date	string or Date - the initial date to display
        +	 * @param  onSelect  function - the function to call when a date is selected
        +	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
        +	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
        +	 *					event - with x/y coordinates or
        +	 *					leave empty for default (screen centre)
        +	 * @return the manager object
        +	 */
        +	_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
        +		var id, browserWidth, browserHeight, scrollX, scrollY,
        +			inst = this._dialogInst; // internal instance
        +
        +		if ( !inst ) {
        +			this.uuid += 1;
        +			id = "dp" + this.uuid;
        +			this._dialogInput = $( "<input type='text' id='" + id +
        +				"' style='position: absolute; top: -100px; width: 0px;'/>" );
        +			this._dialogInput.on( "keydown", this._doKeyDown );
        +			$( "body" ).append( this._dialogInput );
        +			inst = this._dialogInst = this._newInst( this._dialogInput, false );
        +			inst.settings = {};
        +			$.data( this._dialogInput[ 0 ], "datepicker", inst );
        +		}
        +		datepicker_extendRemove( inst.settings, settings || {} );
        +		date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
        +		this._dialogInput.val( date );
        +
        +		this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
        +		if ( !this._pos ) {
        +			browserWidth = document.documentElement.clientWidth;
        +			browserHeight = document.documentElement.clientHeight;
        +			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
        +			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
        +			this._pos = // should use actual width/height below
        +				[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
        +		}
        +
        +		// Move input on screen for focus, but hidden behind dialog
        +		this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
        +		inst.settings.onSelect = onSelect;
        +		this._inDialog = true;
        +		this.dpDiv.addClass( this._dialogClass );
        +		this._showDatepicker( this._dialogInput[ 0 ] );
        +		if ( $.blockUI ) {
        +			$.blockUI( this.dpDiv );
        +		}
        +		$.data( this._dialogInput[ 0 ], "datepicker", inst );
        +		return this;
        +	},
        +
        +	/* Detach a datepicker from its control.
        +	 * @param  target	element - the target input field or division or span
        +	 */
        +	_destroyDatepicker: function( target ) {
        +		var nodeName,
        +			$target = $( target ),
        +			inst = $.data( target, "datepicker" );
        +
        +		if ( !$target.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +
        +		nodeName = target.nodeName.toLowerCase();
        +		$.removeData( target, "datepicker" );
        +		if ( nodeName === "input" ) {
        +			inst.append.remove();
        +			inst.trigger.remove();
        +			$target.removeClass( this.markerClassName ).
        +				off( "focus", this._showDatepicker ).
        +				off( "keydown", this._doKeyDown ).
        +				off( "keypress", this._doKeyPress ).
        +				off( "keyup", this._doKeyUp );
        +		} else if ( nodeName === "div" || nodeName === "span" ) {
        +			$target.removeClass( this.markerClassName ).empty();
        +		}
        +
        +		if ( datepicker_instActive === inst ) {
        +			datepicker_instActive = null;
        +		}
        +	},
        +
        +	/* Enable the date picker to a jQuery selection.
        +	 * @param  target	element - the target input field or division or span
        +	 */
        +	_enableDatepicker: function( target ) {
        +		var nodeName, inline,
        +			$target = $( target ),
        +			inst = $.data( target, "datepicker" );
        +
        +		if ( !$target.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +
        +		nodeName = target.nodeName.toLowerCase();
        +		if ( nodeName === "input" ) {
        +			target.disabled = false;
        +			inst.trigger.filter( "button" ).
        +				each( function() { this.disabled = false; } ).end().
        +				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
        +		} else if ( nodeName === "div" || nodeName === "span" ) {
        +			inline = $target.children( "." + this._inlineClass );
        +			inline.children().removeClass( "ui-state-disabled" );
        +			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
        +				prop( "disabled", false );
        +		}
        +		this._disabledInputs = $.map( this._disabledInputs,
        +			function( value ) { return ( value === target ? null : value ); } ); // delete entry
        +	},
        +
        +	/* Disable the date picker to a jQuery selection.
        +	 * @param  target	element - the target input field or division or span
        +	 */
        +	_disableDatepicker: function( target ) {
        +		var nodeName, inline,
        +			$target = $( target ),
        +			inst = $.data( target, "datepicker" );
        +
        +		if ( !$target.hasClass( this.markerClassName ) ) {
        +			return;
        +		}
        +
        +		nodeName = target.nodeName.toLowerCase();
        +		if ( nodeName === "input" ) {
        +			target.disabled = true;
        +			inst.trigger.filter( "button" ).
        +				each( function() { this.disabled = true; } ).end().
        +				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
        +		} else if ( nodeName === "div" || nodeName === "span" ) {
        +			inline = $target.children( "." + this._inlineClass );
        +			inline.children().addClass( "ui-state-disabled" );
        +			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
        +				prop( "disabled", true );
        +		}
        +		this._disabledInputs = $.map( this._disabledInputs,
        +			function( value ) { return ( value === target ? null : value ); } ); // delete entry
        +		this._disabledInputs[ this._disabledInputs.length ] = target;
        +	},
        +
        +	/* Is the first field in a jQuery collection disabled as a datepicker?
        +	 * @param  target	element - the target input field or division or span
        +	 * @return boolean - true if disabled, false if enabled
        +	 */
        +	_isDisabledDatepicker: function( target ) {
        +		if ( !target ) {
        +			return false;
        +		}
        +		for ( var i = 0; i < this._disabledInputs.length; i++ ) {
        +			if ( this._disabledInputs[ i ] === target ) {
        +				return true;
        +			}
        +		}
        +		return false;
        +	},
        +
        +	/* Retrieve the instance data for the target control.
        +	 * @param  target  element - the target input field or division or span
        +	 * @return  object - the associated instance data
        +	 * @throws  error if a jQuery problem getting data
        +	 */
        +	_getInst: function( target ) {
        +		try {
        +			return $.data( target, "datepicker" );
        +		}
        +		catch ( err ) {
        +			throw "Missing instance data for this datepicker";
        +		}
        +	},
        +
        +	/* Update or retrieve the settings for a date picker attached to an input field or division.
        +	 * @param  target  element - the target input field or division or span
        +	 * @param  name	object - the new settings to update or
        +	 *				string - the name of the setting to change or retrieve,
        +	 *				when retrieving also "all" for all instance settings or
        +	 *				"defaults" for all global defaults
        +	 * @param  value   any - the new value for the setting
        +	 *				(omit if above is an object or to retrieve a value)
        +	 */
        +	_optionDatepicker: function( target, name, value ) {
        +		var settings, date, minDate, maxDate,
        +			inst = this._getInst( target );
        +
        +		if ( arguments.length === 2 && typeof name === "string" ) {
        +			return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
        +				( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
        +				this._get( inst, name ) ) : null ) );
        +		}
        +
        +		settings = name || {};
        +		if ( typeof name === "string" ) {
        +			settings = {};
        +			settings[ name ] = value;
        +		}
        +
        +		if ( inst ) {
        +			if ( this._curInst === inst ) {
        +				this._hideDatepicker();
        +			}
        +
        +			date = this._getDateDatepicker( target, true );
        +			minDate = this._getMinMaxDate( inst, "min" );
        +			maxDate = this._getMinMaxDate( inst, "max" );
        +			datepicker_extendRemove( inst.settings, settings );
        +
        +			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
        +			if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
        +				inst.settings.minDate = this._formatDate( inst, minDate );
        +			}
        +			if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
        +				inst.settings.maxDate = this._formatDate( inst, maxDate );
        +			}
        +			if ( "disabled" in settings ) {
        +				if ( settings.disabled ) {
        +					this._disableDatepicker( target );
        +				} else {
        +					this._enableDatepicker( target );
        +				}
        +			}
        +			this._attachments( $( target ), inst );
        +			this._autoSize( inst );
        +			this._setDate( inst, date );
        +			this._updateAlternate( inst );
        +			this._updateDatepicker( inst );
        +		}
        +	},
        +
        +	// Change method deprecated
        +	_changeDatepicker: function( target, name, value ) {
        +		this._optionDatepicker( target, name, value );
        +	},
        +
        +	/* Redraw the date picker attached to an input field or division.
        +	 * @param  target  element - the target input field or division or span
        +	 */
        +	_refreshDatepicker: function( target ) {
        +		var inst = this._getInst( target );
        +		if ( inst ) {
        +			this._updateDatepicker( inst );
        +		}
        +	},
        +
        +	/* Set the dates for a jQuery selection.
        +	 * @param  target element - the target input field or division or span
        +	 * @param  date	Date - the new date
        +	 */
        +	_setDateDatepicker: function( target, date ) {
        +		var inst = this._getInst( target );
        +		if ( inst ) {
        +			this._setDate( inst, date );
        +			this._updateDatepicker( inst );
        +			this._updateAlternate( inst );
        +		}
        +	},
        +
        +	/* Get the date(s) for the first entry in a jQuery selection.
        +	 * @param  target element - the target input field or division or span
        +	 * @param  noDefault boolean - true if no default date is to be used
        +	 * @return Date - the current date
        +	 */
        +	_getDateDatepicker: function( target, noDefault ) {
        +		var inst = this._getInst( target );
        +		if ( inst && !inst.inline ) {
        +			this._setDateFromField( inst, noDefault );
        +		}
        +		return ( inst ? this._getDate( inst ) : null );
        +	},
        +
        +	/* Handle keystrokes. */
        +	_doKeyDown: function( event ) {
        +		var onSelect, dateStr, sel,
        +			inst = $.datepicker._getInst( event.target ),
        +			handled = true,
        +			isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
        +
        +		inst._keyEvent = true;
        +		if ( $.datepicker._datepickerShowing ) {
        +			switch ( event.keyCode ) {
        +				case 9: $.datepicker._hideDatepicker();
        +						handled = false;
        +						break; // hide on tab out
        +				case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
        +									$.datepicker._currentClass + ")", inst.dpDiv );
        +						if ( sel[ 0 ] ) {
        +							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
        +						}
        +
        +						onSelect = $.datepicker._get( inst, "onSelect" );
        +						if ( onSelect ) {
        +							dateStr = $.datepicker._formatDate( inst );
        +
        +							// Trigger custom callback
        +							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
        +						} else {
        +							$.datepicker._hideDatepicker();
        +						}
        +
        +						return false; // don't submit the form
        +				case 27: $.datepicker._hideDatepicker();
        +						break; // hide on escape
        +				case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +							-$.datepicker._get( inst, "stepBigMonths" ) :
        +							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						break; // previous month/year on page up/+ ctrl
        +				case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +							+$.datepicker._get( inst, "stepBigMonths" ) :
        +							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						break; // next month/year on page down/+ ctrl
        +				case 35: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._clearDate( event.target );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // clear on ctrl or command +end
        +				case 36: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._gotoToday( event.target );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // current on ctrl or command +home
        +				case 37: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +
        +						// -1 day on ctrl or command +left
        +						if ( event.originalEvent.altKey ) {
        +							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +								-$.datepicker._get( inst, "stepBigMonths" ) :
        +								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						}
        +
        +						// next month/year on alt +left on Mac
        +						break;
        +				case 38: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, -7, "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // -1 week on ctrl or command +up
        +				case 39: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +
        +						// +1 day on ctrl or command +right
        +						if ( event.originalEvent.altKey ) {
        +							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
        +								+$.datepicker._get( inst, "stepBigMonths" ) :
        +								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
        +						}
        +
        +						// next month/year on alt +right
        +						break;
        +				case 40: if ( event.ctrlKey || event.metaKey ) {
        +							$.datepicker._adjustDate( event.target, +7, "D" );
        +						}
        +						handled = event.ctrlKey || event.metaKey;
        +						break; // +1 week on ctrl or command +down
        +				default: handled = false;
        +			}
        +		} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
        +			$.datepicker._showDatepicker( this );
        +		} else {
        +			handled = false;
        +		}
        +
        +		if ( handled ) {
        +			event.preventDefault();
        +			event.stopPropagation();
        +		}
        +	},
        +
        +	/* Filter entered characters - based on date format. */
        +	_doKeyPress: function( event ) {
        +		var chars, chr,
        +			inst = $.datepicker._getInst( event.target );
        +
        +		if ( $.datepicker._get( inst, "constrainInput" ) ) {
        +			chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
        +			chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
        +			return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
        +		}
        +	},
        +
        +	/* Synchronise manual entry and field/alternate field. */
        +	_doKeyUp: function( event ) {
        +		var date,
        +			inst = $.datepicker._getInst( event.target );
        +
        +		if ( inst.input.val() !== inst.lastVal ) {
        +			try {
        +				date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
        +					( inst.input ? inst.input.val() : null ),
        +					$.datepicker._getFormatConfig( inst ) );
        +
        +				if ( date ) { // only if valid
        +					$.datepicker._setDateFromField( inst );
        +					$.datepicker._updateAlternate( inst );
        +					$.datepicker._updateDatepicker( inst );
        +				}
        +			}
        +			catch ( err ) {
        +			}
        +		}
        +		return true;
        +	},
        +
        +	/* Pop-up the date picker for a given input field.
        +	 * If false returned from beforeShow event handler do not show.
        +	 * @param  input  element - the input field attached to the date picker or
        +	 *					event - if triggered by focus
        +	 */
        +	_showDatepicker: function( input ) {
        +		input = input.target || input;
        +		if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
        +			input = $( "input", input.parentNode )[ 0 ];
        +		}
        +
        +		if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
        +			return;
        +		}
        +
        +		var inst, beforeShow, beforeShowSettings, isFixed,
        +			offset, showAnim, duration;
        +
        +		inst = $.datepicker._getInst( input );
        +		if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
        +			$.datepicker._curInst.dpDiv.stop( true, true );
        +			if ( inst && $.datepicker._datepickerShowing ) {
        +				$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
        +			}
        +		}
        +
        +		beforeShow = $.datepicker._get( inst, "beforeShow" );
        +		beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
        +		if ( beforeShowSettings === false ) {
        +			return;
        +		}
        +		datepicker_extendRemove( inst.settings, beforeShowSettings );
        +
        +		inst.lastVal = null;
        +		$.datepicker._lastInput = input;
        +		$.datepicker._setDateFromField( inst );
        +
        +		if ( $.datepicker._inDialog ) { // hide cursor
        +			input.value = "";
        +		}
        +		if ( !$.datepicker._pos ) { // position below input
        +			$.datepicker._pos = $.datepicker._findPos( input );
        +			$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
        +		}
        +
        +		isFixed = false;
        +		$( input ).parents().each( function() {
        +			isFixed |= $( this ).css( "position" ) === "fixed";
        +			return !isFixed;
        +		} );
        +
        +		offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
        +		$.datepicker._pos = null;
        +
        +		//to avoid flashes on Firefox
        +		inst.dpDiv.empty();
        +
        +		// determine sizing offscreen
        +		inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
        +		$.datepicker._updateDatepicker( inst );
        +
        +		// fix width for dynamic number of date pickers
        +		// and adjust position before showing
        +		offset = $.datepicker._checkOffset( inst, offset, isFixed );
        +		inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
        +			"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
        +			left: offset.left + "px", top: offset.top + "px" } );
        +
        +		if ( !inst.inline ) {
        +			showAnim = $.datepicker._get( inst, "showAnim" );
        +			duration = $.datepicker._get( inst, "duration" );
        +			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
        +			$.datepicker._datepickerShowing = true;
        +
        +			if ( $.effects && $.effects.effect[ showAnim ] ) {
        +				inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
        +			} else {
        +				inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
        +			}
        +
        +			if ( $.datepicker._shouldFocusInput( inst ) ) {
        +				inst.input.trigger( "focus" );
        +			}
        +
        +			$.datepicker._curInst = inst;
        +		}
        +	},
        +
        +	/* Generate the date picker content. */
        +	_updateDatepicker: function( inst ) {
        +		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
        +		datepicker_instActive = inst; // for delegate hover events
        +		inst.dpDiv.empty().append( this._generateHTML( inst ) );
        +		this._attachHandlers( inst );
        +
        +		var origyearshtml,
        +			numMonths = this._getNumberOfMonths( inst ),
        +			cols = numMonths[ 1 ],
        +			width = 17,
        +			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
        +
        +		if ( activeCell.length > 0 ) {
        +			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
        +		}
        +
        +		inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
        +		if ( cols > 1 ) {
        +			inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
        +		}
        +		inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
        +			"Class" ]( "ui-datepicker-multi" );
        +		inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
        +			"Class" ]( "ui-datepicker-rtl" );
        +
        +		if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
        +			inst.input.trigger( "focus" );
        +		}
        +
        +		// Deffered render of the years select (to avoid flashes on Firefox)
        +		if ( inst.yearshtml ) {
        +			origyearshtml = inst.yearshtml;
        +			setTimeout( function() {
        +
        +				//assure that inst.yearshtml didn't change.
        +				if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
        +					inst.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( inst.yearshtml );
        +				}
        +				origyearshtml = inst.yearshtml = null;
        +			}, 0 );
        +		}
        +	},
        +
        +	// #6694 - don't focus the input if it's already focused
        +	// this breaks the change event in IE
        +	// Support: IE and jQuery <1.9
        +	_shouldFocusInput: function( inst ) {
        +		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
        +	},
        +
        +	/* Check positioning to remain on screen. */
        +	_checkOffset: function( inst, offset, isFixed ) {
        +		var dpWidth = inst.dpDiv.outerWidth(),
        +			dpHeight = inst.dpDiv.outerHeight(),
        +			inputWidth = inst.input ? inst.input.outerWidth() : 0,
        +			inputHeight = inst.input ? inst.input.outerHeight() : 0,
        +			viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
        +			viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
        +
        +		offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
        +		offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
        +		offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
        +
        +		// Now check if datepicker is showing outside window viewport - move to a better place if so.
        +		offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
        +			Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
        +		offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
        +			Math.abs( dpHeight + inputHeight ) : 0 );
        +
        +		return offset;
        +	},
        +
        +	/* Find an object's position on the screen. */
        +	_findPos: function( obj ) {
        +		var position,
        +			inst = this._getInst( obj ),
        +			isRTL = this._get( inst, "isRTL" );
        +
        +		while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
        +			obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
        +		}
        +
        +		position = $( obj ).offset();
        +		return [ position.left, position.top ];
        +	},
        +
        +	/* Hide the date picker from view.
        +	 * @param  input  element - the input field attached to the date picker
        +	 */
        +	_hideDatepicker: function( input ) {
        +		var showAnim, duration, postProcess, onClose,
        +			inst = this._curInst;
        +
        +		if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
        +			return;
        +		}
        +
        +		if ( this._datepickerShowing ) {
        +			showAnim = this._get( inst, "showAnim" );
        +			duration = this._get( inst, "duration" );
        +			postProcess = function() {
        +				$.datepicker._tidyDialog( inst );
        +			};
        +
        +			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
        +			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
        +				inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
        +			} else {
        +				inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
        +					( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
        +			}
        +
        +			if ( !showAnim ) {
        +				postProcess();
        +			}
        +			this._datepickerShowing = false;
        +
        +			onClose = this._get( inst, "onClose" );
        +			if ( onClose ) {
        +				onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
        +			}
        +
        +			this._lastInput = null;
        +			if ( this._inDialog ) {
        +				this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
        +				if ( $.blockUI ) {
        +					$.unblockUI();
        +					$( "body" ).append( this.dpDiv );
        +				}
        +			}
        +			this._inDialog = false;
        +		}
        +	},
        +
        +	/* Tidy up after a dialog display. */
        +	_tidyDialog: function( inst ) {
        +		inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
        +	},
        +
        +	/* Close date picker if clicked elsewhere. */
        +	_checkExternalClick: function( event ) {
        +		if ( !$.datepicker._curInst ) {
        +			return;
        +		}
        +
        +		var $target = $( event.target ),
        +			inst = $.datepicker._getInst( $target[ 0 ] );
        +
        +		if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
        +				$target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
        +				!$target.hasClass( $.datepicker.markerClassName ) &&
        +				!$target.closest( "." + $.datepicker._triggerClass ).length &&
        +				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
        +			( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
        +				$.datepicker._hideDatepicker();
        +		}
        +	},
        +
        +	/* Adjust one of the date sub-fields. */
        +	_adjustDate: function( id, offset, period ) {
        +		var target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
        +			return;
        +		}
        +		this._adjustInstDate( inst, offset +
        +			( period === "M" ? this._get( inst, "showCurrentAtPos" ) : 0 ), // undo positioning
        +			period );
        +		this._updateDatepicker( inst );
        +	},
        +
        +	/* Action for current link. */
        +	_gotoToday: function( id ) {
        +		var date,
        +			target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
        +			inst.selectedDay = inst.currentDay;
        +			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
        +			inst.drawYear = inst.selectedYear = inst.currentYear;
        +		} else {
        +			date = new Date();
        +			inst.selectedDay = date.getDate();
        +			inst.drawMonth = inst.selectedMonth = date.getMonth();
        +			inst.drawYear = inst.selectedYear = date.getFullYear();
        +		}
        +		this._notifyChange( inst );
        +		this._adjustDate( target );
        +	},
        +
        +	/* Action for selecting a new month/year. */
        +	_selectMonthYear: function( id, select, period ) {
        +		var target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
        +		inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
        +			parseInt( select.options[ select.selectedIndex ].value, 10 );
        +
        +		this._notifyChange( inst );
        +		this._adjustDate( target );
        +	},
        +
        +	/* Action for selecting a day. */
        +	_selectDay: function( id, month, year, td ) {
        +		var inst,
        +			target = $( id );
        +
        +		if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
        +			return;
        +		}
        +
        +		inst = this._getInst( target[ 0 ] );
        +		inst.selectedDay = inst.currentDay = $( "a", td ).html();
        +		inst.selectedMonth = inst.currentMonth = month;
        +		inst.selectedYear = inst.currentYear = year;
        +		this._selectDate( id, this._formatDate( inst,
        +			inst.currentDay, inst.currentMonth, inst.currentYear ) );
        +	},
        +
        +	/* Erase the input field and hide the date picker. */
        +	_clearDate: function( id ) {
        +		var target = $( id );
        +		this._selectDate( target, "" );
        +	},
        +
        +	/* Update the input field with the selected date. */
        +	_selectDate: function( id, dateStr ) {
        +		var onSelect,
        +			target = $( id ),
        +			inst = this._getInst( target[ 0 ] );
        +
        +		dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
        +		if ( inst.input ) {
        +			inst.input.val( dateStr );
        +		}
        +		this._updateAlternate( inst );
        +
        +		onSelect = this._get( inst, "onSelect" );
        +		if ( onSelect ) {
        +			onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
        +		} else if ( inst.input ) {
        +			inst.input.trigger( "change" ); // fire the change event
        +		}
        +
        +		if ( inst.inline ) {
        +			this._updateDatepicker( inst );
        +		} else {
        +			this._hideDatepicker();
        +			this._lastInput = inst.input[ 0 ];
        +			if ( typeof( inst.input[ 0 ] ) !== "object" ) {
        +				inst.input.trigger( "focus" ); // restore focus
        +			}
        +			this._lastInput = null;
        +		}
        +	},
        +
        +	/* Update any alternate field to synchronise with the main field. */
        +	_updateAlternate: function( inst ) {
        +		var altFormat, date, dateStr,
        +			altField = this._get( inst, "altField" );
        +
        +		if ( altField ) { // update alternate field too
        +			altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
        +			date = this._getDate( inst );
        +			dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
        +			$( altField ).val( dateStr );
        +		}
        +	},
        +
        +	/* Set as beforeShowDay function to prevent selection of weekends.
        +	 * @param  date  Date - the date to customise
        +	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
        +	 */
        +	noWeekends: function( date ) {
        +		var day = date.getDay();
        +		return [ ( day > 0 && day < 6 ), "" ];
        +	},
        +
        +	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
        +	 * @param  date  Date - the date to get the week for
        +	 * @return  number - the number of the week within the year that contains this date
        +	 */
        +	iso8601Week: function( date ) {
        +		var time,
        +			checkDate = new Date( date.getTime() );
        +
        +		// Find Thursday of this week starting on Monday
        +		checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
        +
        +		time = checkDate.getTime();
        +		checkDate.setMonth( 0 ); // Compare with Jan 1
        +		checkDate.setDate( 1 );
        +		return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
        +	},
        +
        +	/* Parse a string value into a date object.
        +	 * See formatDate below for the possible formats.
        +	 *
        +	 * @param  format string - the expected format of the date
        +	 * @param  value string - the date in the above format
        +	 * @param  settings Object - attributes include:
        +	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
        +	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        +	 *					dayNames		string[7] - names of the days from Sunday (optional)
        +	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        +	 *					monthNames		string[12] - names of the months (optional)
        +	 * @return  Date - the extracted date value or null if value is blank
        +	 */
        +	parseDate: function( format, value, settings ) {
        +		if ( format == null || value == null ) {
        +			throw "Invalid arguments";
        +		}
        +
        +		value = ( typeof value === "object" ? value.toString() : value + "" );
        +		if ( value === "" ) {
        +			return null;
        +		}
        +
        +		var iFormat, dim, extra,
        +			iValue = 0,
        +			shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
        +			shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
        +				new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
        +			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
        +			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
        +			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
        +			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
        +			year = -1,
        +			month = -1,
        +			day = -1,
        +			doy = -1,
        +			literal = false,
        +			date,
        +
        +			// Check whether a format character is doubled
        +			lookAhead = function( match ) {
        +				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
        +				if ( matches ) {
        +					iFormat++;
        +				}
        +				return matches;
        +			},
        +
        +			// Extract a number from the string value
        +			getNumber = function( match ) {
        +				var isDoubled = lookAhead( match ),
        +					size = ( match === "@" ? 14 : ( match === "!" ? 20 :
        +					( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
        +					minSize = ( match === "y" ? size : 1 ),
        +					digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
        +					num = value.substring( iValue ).match( digits );
        +				if ( !num ) {
        +					throw "Missing number at position " + iValue;
        +				}
        +				iValue += num[ 0 ].length;
        +				return parseInt( num[ 0 ], 10 );
        +			},
        +
        +			// Extract a name from the string value and convert to an index
        +			getName = function( match, shortNames, longNames ) {
        +				var index = -1,
        +					names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
        +						return [ [ k, v ] ];
        +					} ).sort( function( a, b ) {
        +						return -( a[ 1 ].length - b[ 1 ].length );
        +					} );
        +
        +				$.each( names, function( i, pair ) {
        +					var name = pair[ 1 ];
        +					if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
        +						index = pair[ 0 ];
        +						iValue += name.length;
        +						return false;
        +					}
        +				} );
        +				if ( index !== -1 ) {
        +					return index + 1;
        +				} else {
        +					throw "Unknown name at position " + iValue;
        +				}
        +			},
        +
        +			// Confirm that a literal character matches the string value
        +			checkLiteral = function() {
        +				if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
        +					throw "Unexpected literal at position " + iValue;
        +				}
        +				iValue++;
        +			};
        +
        +		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
        +			if ( literal ) {
        +				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
        +					literal = false;
        +				} else {
        +					checkLiteral();
        +				}
        +			} else {
        +				switch ( format.charAt( iFormat ) ) {
        +					case "d":
        +						day = getNumber( "d" );
        +						break;
        +					case "D":
        +						getName( "D", dayNamesShort, dayNames );
        +						break;
        +					case "o":
        +						doy = getNumber( "o" );
        +						break;
        +					case "m":
        +						month = getNumber( "m" );
        +						break;
        +					case "M":
        +						month = getName( "M", monthNamesShort, monthNames );
        +						break;
        +					case "y":
        +						year = getNumber( "y" );
        +						break;
        +					case "@":
        +						date = new Date( getNumber( "@" ) );
        +						year = date.getFullYear();
        +						month = date.getMonth() + 1;
        +						day = date.getDate();
        +						break;
        +					case "!":
        +						date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
        +						year = date.getFullYear();
        +						month = date.getMonth() + 1;
        +						day = date.getDate();
        +						break;
        +					case "'":
        +						if ( lookAhead( "'" ) ) {
        +							checkLiteral();
        +						} else {
        +							literal = true;
        +						}
        +						break;
        +					default:
        +						checkLiteral();
        +				}
        +			}
        +		}
        +
        +		if ( iValue < value.length ) {
        +			extra = value.substr( iValue );
        +			if ( !/^\s+/.test( extra ) ) {
        +				throw "Extra/unparsed characters found in date: " + extra;
        +			}
        +		}
        +
        +		if ( year === -1 ) {
        +			year = new Date().getFullYear();
        +		} else if ( year < 100 ) {
        +			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
        +				( year <= shortYearCutoff ? 0 : -100 );
        +		}
        +
        +		if ( doy > -1 ) {
        +			month = 1;
        +			day = doy;
        +			do {
        +				dim = this._getDaysInMonth( year, month - 1 );
        +				if ( day <= dim ) {
        +					break;
        +				}
        +				month++;
        +				day -= dim;
        +			} while ( true );
        +		}
        +
        +		date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
        +		if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
        +			throw "Invalid date"; // E.g. 31/02/00
        +		}
        +		return date;
        +	},
        +
        +	/* Standard date formats. */
        +	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
        +	COOKIE: "D, dd M yy",
        +	ISO_8601: "yy-mm-dd",
        +	RFC_822: "D, d M y",
        +	RFC_850: "DD, dd-M-y",
        +	RFC_1036: "D, d M y",
        +	RFC_1123: "D, d M yy",
        +	RFC_2822: "D, d M yy",
        +	RSS: "D, d M y", // RFC 822
        +	TICKS: "!",
        +	TIMESTAMP: "@",
        +	W3C: "yy-mm-dd", // ISO 8601
        +
        +	_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
        +		Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
        +
        +	/* Format a date object into a string value.
        +	 * The format can be combinations of the following:
        +	 * d  - day of month (no leading zero)
        +	 * dd - day of month (two digit)
        +	 * o  - day of year (no leading zeros)
        +	 * oo - day of year (three digit)
        +	 * D  - day name short
        +	 * DD - day name long
        +	 * m  - month of year (no leading zero)
        +	 * mm - month of year (two digit)
        +	 * M  - month name short
        +	 * MM - month name long
        +	 * y  - year (two digit)
        +	 * yy - year (four digit)
        +	 * @ - Unix timestamp (ms since 01/01/1970)
        +	 * ! - Windows ticks (100ns since 01/01/0001)
        +	 * "..." - literal text
        +	 * '' - single quote
        +	 *
        +	 * @param  format string - the desired format of the date
        +	 * @param  date Date - the date value to format
        +	 * @param  settings Object - attributes include:
        +	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        +	 *					dayNames		string[7] - names of the days from Sunday (optional)
        +	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        +	 *					monthNames		string[12] - names of the months (optional)
        +	 * @return  string - the date in the above format
        +	 */
        +	formatDate: function( format, date, settings ) {
        +		if ( !date ) {
        +			return "";
        +		}
        +
        +		var iFormat,
        +			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
        +			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
        +			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
        +			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
        +
        +			// Check whether a format character is doubled
        +			lookAhead = function( match ) {
        +				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
        +				if ( matches ) {
        +					iFormat++;
        +				}
        +				return matches;
        +			},
        +
        +			// Format a number, with leading zero if necessary
        +			formatNumber = function( match, value, len ) {
        +				var num = "" + value;
        +				if ( lookAhead( match ) ) {
        +					while ( num.length < len ) {
        +						num = "0" + num;
        +					}
        +				}
        +				return num;
        +			},
        +
        +			// Format a name, short or long as requested
        +			formatName = function( match, value, shortNames, longNames ) {
        +				return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
        +			},
        +			output = "",
        +			literal = false;
        +
        +		if ( date ) {
        +			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
        +				if ( literal ) {
        +					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
        +						literal = false;
        +					} else {
        +						output += format.charAt( iFormat );
        +					}
        +				} else {
        +					switch ( format.charAt( iFormat ) ) {
        +						case "d":
        +							output += formatNumber( "d", date.getDate(), 2 );
        +							break;
        +						case "D":
        +							output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
        +							break;
        +						case "o":
        +							output += formatNumber( "o",
        +								Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
        +							break;
        +						case "m":
        +							output += formatNumber( "m", date.getMonth() + 1, 2 );
        +							break;
        +						case "M":
        +							output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
        +							break;
        +						case "y":
        +							output += ( lookAhead( "y" ) ? date.getFullYear() :
        +								( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
        +							break;
        +						case "@":
        +							output += date.getTime();
        +							break;
        +						case "!":
        +							output += date.getTime() * 10000 + this._ticksTo1970;
        +							break;
        +						case "'":
        +							if ( lookAhead( "'" ) ) {
        +								output += "'";
        +							} else {
        +								literal = true;
        +							}
        +							break;
        +						default:
        +							output += format.charAt( iFormat );
        +					}
        +				}
        +			}
        +		}
        +		return output;
        +	},
        +
        +	/* Extract all possible characters from the date format. */
        +	_possibleChars: function( format ) {
        +		var iFormat,
        +			chars = "",
        +			literal = false,
        +
        +			// Check whether a format character is doubled
        +			lookAhead = function( match ) {
        +				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
        +				if ( matches ) {
        +					iFormat++;
        +				}
        +				return matches;
        +			};
        +
        +		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
        +			if ( literal ) {
        +				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
        +					literal = false;
        +				} else {
        +					chars += format.charAt( iFormat );
        +				}
        +			} else {
        +				switch ( format.charAt( iFormat ) ) {
        +					case "d": case "m": case "y": case "@":
        +						chars += "0123456789";
        +						break;
        +					case "D": case "M":
        +						return null; // Accept anything
        +					case "'":
        +						if ( lookAhead( "'" ) ) {
        +							chars += "'";
        +						} else {
        +							literal = true;
        +						}
        +						break;
        +					default:
        +						chars += format.charAt( iFormat );
        +				}
        +			}
        +		}
        +		return chars;
        +	},
        +
        +	/* Get a setting value, defaulting if necessary. */
        +	_get: function( inst, name ) {
        +		return inst.settings[ name ] !== undefined ?
        +			inst.settings[ name ] : this._defaults[ name ];
        +	},
        +
        +	/* Parse existing date and initialise date picker. */
        +	_setDateFromField: function( inst, noDefault ) {
        +		if ( inst.input.val() === inst.lastVal ) {
        +			return;
        +		}
        +
        +		var dateFormat = this._get( inst, "dateFormat" ),
        +			dates = inst.lastVal = inst.input ? inst.input.val() : null,
        +			defaultDate = this._getDefaultDate( inst ),
        +			date = defaultDate,
        +			settings = this._getFormatConfig( inst );
        +
        +		try {
        +			date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
        +		} catch ( event ) {
        +			dates = ( noDefault ? "" : dates );
        +		}
        +		inst.selectedDay = date.getDate();
        +		inst.drawMonth = inst.selectedMonth = date.getMonth();
        +		inst.drawYear = inst.selectedYear = date.getFullYear();
        +		inst.currentDay = ( dates ? date.getDate() : 0 );
        +		inst.currentMonth = ( dates ? date.getMonth() : 0 );
        +		inst.currentYear = ( dates ? date.getFullYear() : 0 );
        +		this._adjustInstDate( inst );
        +	},
        +
        +	/* Retrieve the default date shown on opening. */
        +	_getDefaultDate: function( inst ) {
        +		return this._restrictMinMax( inst,
        +			this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
        +	},
        +
        +	/* A date may be specified as an exact value or a relative one. */
        +	_determineDate: function( inst, date, defaultDate ) {
        +		var offsetNumeric = function( offset ) {
        +				var date = new Date();
        +				date.setDate( date.getDate() + offset );
        +				return date;
        +			},
        +			offsetString = function( offset ) {
        +				try {
        +					return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
        +						offset, $.datepicker._getFormatConfig( inst ) );
        +				}
        +				catch ( e ) {
        +
        +					// Ignore
        +				}
        +
        +				var date = ( offset.toLowerCase().match( /^c/ ) ?
        +					$.datepicker._getDate( inst ) : null ) || new Date(),
        +					year = date.getFullYear(),
        +					month = date.getMonth(),
        +					day = date.getDate(),
        +					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
        +					matches = pattern.exec( offset );
        +
        +				while ( matches ) {
        +					switch ( matches[ 2 ] || "d" ) {
        +						case "d" : case "D" :
        +							day += parseInt( matches[ 1 ], 10 ); break;
        +						case "w" : case "W" :
        +							day += parseInt( matches[ 1 ], 10 ) * 7; break;
        +						case "m" : case "M" :
        +							month += parseInt( matches[ 1 ], 10 );
        +							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
        +							break;
        +						case "y": case "Y" :
        +							year += parseInt( matches[ 1 ], 10 );
        +							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
        +							break;
        +					}
        +					matches = pattern.exec( offset );
        +				}
        +				return new Date( year, month, day );
        +			},
        +			newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
        +				( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
        +
        +		newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
        +		if ( newDate ) {
        +			newDate.setHours( 0 );
        +			newDate.setMinutes( 0 );
        +			newDate.setSeconds( 0 );
        +			newDate.setMilliseconds( 0 );
        +		}
        +		return this._daylightSavingAdjust( newDate );
        +	},
        +
        +	/* Handle switch to/from daylight saving.
        +	 * Hours may be non-zero on daylight saving cut-over:
        +	 * > 12 when midnight changeover, but then cannot generate
        +	 * midnight datetime, so jump to 1AM, otherwise reset.
        +	 * @param  date  (Date) the date to check
        +	 * @return  (Date) the corrected date
        +	 */
        +	_daylightSavingAdjust: function( date ) {
        +		if ( !date ) {
        +			return null;
        +		}
        +		date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
        +		return date;
        +	},
        +
        +	/* Set the date(s) directly. */
        +	_setDate: function( inst, date, noChange ) {
        +		var clear = !date,
        +			origMonth = inst.selectedMonth,
        +			origYear = inst.selectedYear,
        +			newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
        +
        +		inst.selectedDay = inst.currentDay = newDate.getDate();
        +		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
        +		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
        +		if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
        +			this._notifyChange( inst );
        +		}
        +		this._adjustInstDate( inst );
        +		if ( inst.input ) {
        +			inst.input.val( clear ? "" : this._formatDate( inst ) );
        +		}
        +	},
        +
        +	/* Retrieve the date(s) directly. */
        +	_getDate: function( inst ) {
        +		var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
        +			this._daylightSavingAdjust( new Date(
        +			inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
        +			return startDate;
        +	},
        +
        +	/* Attach the onxxx handlers.  These are declared statically so
        +	 * they work with static code transformers like Caja.
        +	 */
        +	_attachHandlers: function( inst ) {
        +		var stepMonths = this._get( inst, "stepMonths" ),
        +			id = "#" + inst.id.replace( /\\\\/g, "\\" );
        +		inst.dpDiv.find( "[data-handler]" ).map( function() {
        +			var handler = {
        +				prev: function() {
        +					$.datepicker._adjustDate( id, -stepMonths, "M" );
        +				},
        +				next: function() {
        +					$.datepicker._adjustDate( id, +stepMonths, "M" );
        +				},
        +				hide: function() {
        +					$.datepicker._hideDatepicker();
        +				},
        +				today: function() {
        +					$.datepicker._gotoToday( id );
        +				},
        +				selectDay: function() {
        +					$.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
        +					return false;
        +				},
        +				selectMonth: function() {
        +					$.datepicker._selectMonthYear( id, this, "M" );
        +					return false;
        +				},
        +				selectYear: function() {
        +					$.datepicker._selectMonthYear( id, this, "Y" );
        +					return false;
        +				}
        +			};
        +			$( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
        +		} );
        +	},
        +
        +	/* Generate the HTML for the current state of the date picker. */
        +	_generateHTML: function( inst ) {
        +		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
        +			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
        +			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
        +			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
        +			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
        +			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
        +			tempDate = new Date(),
        +			today = this._daylightSavingAdjust(
        +				new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
        +			isRTL = this._get( inst, "isRTL" ),
        +			showButtonPanel = this._get( inst, "showButtonPanel" ),
        +			hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
        +			navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
        +			numMonths = this._getNumberOfMonths( inst ),
        +			showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
        +			stepMonths = this._get( inst, "stepMonths" ),
        +			isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
        +			currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
        +				new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
        +			minDate = this._getMinMaxDate( inst, "min" ),
        +			maxDate = this._getMinMaxDate( inst, "max" ),
        +			drawMonth = inst.drawMonth - showCurrentAtPos,
        +			drawYear = inst.drawYear;
        +
        +		if ( drawMonth < 0 ) {
        +			drawMonth += 12;
        +			drawYear--;
        +		}
        +		if ( maxDate ) {
        +			maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
        +				maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
        +			maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
        +			while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
        +				drawMonth--;
        +				if ( drawMonth < 0 ) {
        +					drawMonth = 11;
        +					drawYear--;
        +				}
        +			}
        +		}
        +		inst.drawMonth = drawMonth;
        +		inst.drawYear = drawYear;
        +
        +		prevText = this._get( inst, "prevText" );
        +		prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
        +			this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
        +			this._getFormatConfig( inst ) ) );
        +
        +		prev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?
        +			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
        +			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" :
        +			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" ) );
        +
        +		nextText = this._get( inst, "nextText" );
        +		nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
        +			this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
        +			this._getFormatConfig( inst ) ) );
        +
        +		next = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?
        +			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
        +			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" :
        +			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" ) );
        +
        +		currentText = this._get( inst, "currentText" );
        +		gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
        +		currentText = ( !navigationAsDateFormat ? currentText :
        +			this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
        +
        +		controls = ( !inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
        +			this._get( inst, "closeText" ) + "</button>" : "" );
        +
        +		buttonPanel = ( showButtonPanel ) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + ( isRTL ? controls : "" ) +
        +			( this._isInRange( inst, gotoDate ) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
        +			">" + currentText + "</button>" : "" ) + ( isRTL ? "" : controls ) + "</div>" : "";
        +
        +		firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
        +		firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
        +
        +		showWeek = this._get( inst, "showWeek" );
        +		dayNames = this._get( inst, "dayNames" );
        +		dayNamesMin = this._get( inst, "dayNamesMin" );
        +		monthNames = this._get( inst, "monthNames" );
        +		monthNamesShort = this._get( inst, "monthNamesShort" );
        +		beforeShowDay = this._get( inst, "beforeShowDay" );
        +		showOtherMonths = this._get( inst, "showOtherMonths" );
        +		selectOtherMonths = this._get( inst, "selectOtherMonths" );
        +		defaultDate = this._getDefaultDate( inst );
        +		html = "";
        +
        +		for ( row = 0; row < numMonths[ 0 ]; row++ ) {
        +			group = "";
        +			this.maxRows = 4;
        +			for ( col = 0; col < numMonths[ 1 ]; col++ ) {
        +				selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
        +				cornerClass = " ui-corner-all";
        +				calender = "";
        +				if ( isMultiMonth ) {
        +					calender += "<div class='ui-datepicker-group";
        +					if ( numMonths[ 1 ] > 1 ) {
        +						switch ( col ) {
        +							case 0: calender += " ui-datepicker-group-first";
        +								cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
        +							case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
        +								cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
        +							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
        +						}
        +					}
        +					calender += "'>";
        +				}
        +				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
        +					( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
        +					( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
        +					this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
        +					row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
        +					"</div><table class='ui-datepicker-calendar'><thead>" +
        +					"<tr>";
        +				thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
        +				for ( dow = 0; dow < 7; dow++ ) { // days of the week
        +					day = ( dow + firstDay ) % 7;
        +					thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
        +						"<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
        +				}
        +				calender += thead + "</tr></thead><tbody>";
        +				daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
        +				if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
        +					inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
        +				}
        +				leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
        +				curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
        +				numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
        +				this.maxRows = numRows;
        +				printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
        +				for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
        +					calender += "<tr>";
        +					tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
        +						this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
        +					for ( dow = 0; dow < 7; dow++ ) { // create date picker days
        +						daySettings = ( beforeShowDay ?
        +							beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
        +						otherMonth = ( printDate.getMonth() !== drawMonth );
        +						unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
        +							( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
        +						tbody += "<td class='" +
        +							( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
        +							( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
        +							( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
        +							( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
        +
        +							// or defaultDate is current printedDate and defaultDate is selectedDate
        +							" " + this._dayOverClass : "" ) + // highlight selected day
        +							( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
        +							( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
        +							( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
        +							( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
        +							( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
        +							( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
        +							( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
        +							( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
        +							( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
        +							( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
        +							( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
        +							"' href='#'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
        +						printDate.setDate( printDate.getDate() + 1 );
        +						printDate = this._daylightSavingAdjust( printDate );
        +					}
        +					calender += tbody + "</tr>";
        +				}
        +				drawMonth++;
        +				if ( drawMonth > 11 ) {
        +					drawMonth = 0;
        +					drawYear++;
        +				}
        +				calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
        +							( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
        +				group += calender;
        +			}
        +			html += group;
        +		}
        +		html += buttonPanel;
        +		inst._keyEvent = false;
        +		return html;
        +	},
        +
        +	/* Generate the month and year header. */
        +	_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
        +			secondary, monthNames, monthNamesShort ) {
        +
        +		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
        +			changeMonth = this._get( inst, "changeMonth" ),
        +			changeYear = this._get( inst, "changeYear" ),
        +			showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
        +			html = "<div class='ui-datepicker-title'>",
        +			monthHtml = "";
        +
        +		// Month selection
        +		if ( secondary || !changeMonth ) {
        +			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
        +		} else {
        +			inMinYear = ( minDate && minDate.getFullYear() === drawYear );
        +			inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
        +			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
        +			for ( month = 0; month < 12; month++ ) {
        +				if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
        +					monthHtml += "<option value='" + month + "'" +
        +						( month === drawMonth ? " selected='selected'" : "" ) +
        +						">" + monthNamesShort[ month ] + "</option>";
        +				}
        +			}
        +			monthHtml += "</select>";
        +		}
        +
        +		if ( !showMonthAfterYear ) {
        +			html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
        +		}
        +
        +		// Year selection
        +		if ( !inst.yearshtml ) {
        +			inst.yearshtml = "";
        +			if ( secondary || !changeYear ) {
        +				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
        +			} else {
        +
        +				// determine range of years to display
        +				years = this._get( inst, "yearRange" ).split( ":" );
        +				thisYear = new Date().getFullYear();
        +				determineYear = function( value ) {
        +					var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
        +						( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
        +						parseInt( value, 10 ) ) );
        +					return ( isNaN( year ) ? thisYear : year );
        +				};
        +				year = determineYear( years[ 0 ] );
        +				endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
        +				year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
        +				endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
        +				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
        +				for ( ; year <= endYear; year++ ) {
        +					inst.yearshtml += "<option value='" + year + "'" +
        +						( year === drawYear ? " selected='selected'" : "" ) +
        +						">" + year + "</option>";
        +				}
        +				inst.yearshtml += "</select>";
        +
        +				html += inst.yearshtml;
        +				inst.yearshtml = null;
        +			}
        +		}
        +
        +		html += this._get( inst, "yearSuffix" );
        +		if ( showMonthAfterYear ) {
        +			html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
        +		}
        +		html += "</div>"; // Close datepicker_header
        +		return html;
        +	},
        +
        +	/* Adjust one of the date sub-fields. */
        +	_adjustInstDate: function( inst, offset, period ) {
        +		var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
        +			month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
        +			day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
        +			date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
        +
        +		inst.selectedDay = date.getDate();
        +		inst.drawMonth = inst.selectedMonth = date.getMonth();
        +		inst.drawYear = inst.selectedYear = date.getFullYear();
        +		if ( period === "M" || period === "Y" ) {
        +			this._notifyChange( inst );
        +		}
        +	},
        +
        +	/* Ensure a date is within any min/max bounds. */
        +	_restrictMinMax: function( inst, date ) {
        +		var minDate = this._getMinMaxDate( inst, "min" ),
        +			maxDate = this._getMinMaxDate( inst, "max" ),
        +			newDate = ( minDate && date < minDate ? minDate : date );
        +		return ( maxDate && newDate > maxDate ? maxDate : newDate );
        +	},
        +
        +	/* Notify change of month/year. */
        +	_notifyChange: function( inst ) {
        +		var onChange = this._get( inst, "onChangeMonthYear" );
        +		if ( onChange ) {
        +			onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
        +				[ inst.selectedYear, inst.selectedMonth + 1, inst ] );
        +		}
        +	},
        +
        +	/* Determine the number of months to show. */
        +	_getNumberOfMonths: function( inst ) {
        +		var numMonths = this._get( inst, "numberOfMonths" );
        +		return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
        +	},
        +
        +	/* Determine the current maximum date - ensure no time components are set. */
        +	_getMinMaxDate: function( inst, minMax ) {
        +		return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
        +	},
        +
        +	/* Find the number of days in a given month. */
        +	_getDaysInMonth: function( year, month ) {
        +		return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
        +	},
        +
        +	/* Find the day of the week of the first of a month. */
        +	_getFirstDayOfMonth: function( year, month ) {
        +		return new Date( year, month, 1 ).getDay();
        +	},
        +
        +	/* Determines if we should allow a "next/prev" month display change. */
        +	_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
        +		var numMonths = this._getNumberOfMonths( inst ),
        +			date = this._daylightSavingAdjust( new Date( curYear,
        +			curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
        +
        +		if ( offset < 0 ) {
        +			date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
        +		}
        +		return this._isInRange( inst, date );
        +	},
        +
        +	/* Is the given date in the accepted range? */
        +	_isInRange: function( inst, date ) {
        +		var yearSplit, currentYear,
        +			minDate = this._getMinMaxDate( inst, "min" ),
        +			maxDate = this._getMinMaxDate( inst, "max" ),
        +			minYear = null,
        +			maxYear = null,
        +			years = this._get( inst, "yearRange" );
        +			if ( years ) {
        +				yearSplit = years.split( ":" );
        +				currentYear = new Date().getFullYear();
        +				minYear = parseInt( yearSplit[ 0 ], 10 );
        +				maxYear = parseInt( yearSplit[ 1 ], 10 );
        +				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
        +					minYear += currentYear;
        +				}
        +				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
        +					maxYear += currentYear;
        +				}
        +			}
        +
        +		return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
        +			( !maxDate || date.getTime() <= maxDate.getTime() ) &&
        +			( !minYear || date.getFullYear() >= minYear ) &&
        +			( !maxYear || date.getFullYear() <= maxYear ) );
        +	},
        +
        +	/* Provide the configuration settings for formatting/parsing. */
        +	_getFormatConfig: function( inst ) {
        +		var shortYearCutoff = this._get( inst, "shortYearCutoff" );
        +		shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
        +			new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
        +		return { shortYearCutoff: shortYearCutoff,
        +			dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
        +			monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
        +	},
        +
        +	/* Format the given date for display. */
        +	_formatDate: function( inst, day, month, year ) {
        +		if ( !day ) {
        +			inst.currentDay = inst.selectedDay;
        +			inst.currentMonth = inst.selectedMonth;
        +			inst.currentYear = inst.selectedYear;
        +		}
        +		var date = ( day ? ( typeof day === "object" ? day :
        +			this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
        +			this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
        +		return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
        +	}
        +} );
        +
        +/*
        + * Bind hover events for datepicker elements.
        + * Done via delegate so the binding only occurs once in the lifetime of the parent div.
        + * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
        + */
        +function datepicker_bindHover( dpDiv ) {
        +	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
        +	return dpDiv.on( "mouseout", selector, function() {
        +			$( this ).removeClass( "ui-state-hover" );
        +			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
        +				$( this ).removeClass( "ui-datepicker-prev-hover" );
        +			}
        +			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
        +				$( this ).removeClass( "ui-datepicker-next-hover" );
        +			}
        +		} )
        +		.on( "mouseover", selector, datepicker_handleMouseover );
        +}
        +
        +function datepicker_handleMouseover() {
        +	if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
        +		$( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
        +		$( this ).addClass( "ui-state-hover" );
        +		if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
        +			$( this ).addClass( "ui-datepicker-prev-hover" );
        +		}
        +		if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
        +			$( this ).addClass( "ui-datepicker-next-hover" );
        +		}
        +	}
        +}
        +
        +/* jQuery extend now ignores nulls! */
        +function datepicker_extendRemove( target, props ) {
        +	$.extend( target, props );
        +	for ( var name in props ) {
        +		if ( props[ name ] == null ) {
        +			target[ name ] = props[ name ];
        +		}
        +	}
        +	return target;
        +}
        +
        +/* Invoke the datepicker functionality.
        +   @param  options  string - a command, optionally followed by additional parameters or
        +					Object - settings for attaching new datepicker functionality
        +   @return  jQuery object */
        +$.fn.datepicker = function( options ) {
        +
        +	/* Verify an empty collection wasn't passed - Fixes #6976 */
        +	if ( !this.length ) {
        +		return this;
        +	}
        +
        +	/* Initialise the date picker. */
        +	if ( !$.datepicker.initialized ) {
        +		$( document ).on( "mousedown", $.datepicker._checkExternalClick );
        +		$.datepicker.initialized = true;
        +	}
        +
        +	/* Append datepicker main container to body if not exist. */
        +	if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
        +		$( "body" ).append( $.datepicker.dpDiv );
        +	}
        +
        +	var otherArgs = Array.prototype.slice.call( arguments, 1 );
        +	if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
        +		return $.datepicker[ "_" + options + "Datepicker" ].
        +			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
        +	}
        +	if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
        +		return $.datepicker[ "_" + options + "Datepicker" ].
        +			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
        +	}
        +	return this.each( function() {
        +		typeof options === "string" ?
        +			$.datepicker[ "_" + options + "Datepicker" ].
        +				apply( $.datepicker, [ this ].concat( otherArgs ) ) :
        +			$.datepicker._attachDatepicker( this, options );
        +	} );
        +};
        +
        +$.datepicker = new Datepicker(); // singleton instance
        +$.datepicker.initialized = false;
        +$.datepicker.uuid = new Date().getTime();
        +$.datepicker.version = "1.12.1";
        +
        +return $.datepicker;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/dialog.js b/bower_components/jquery-ui/ui/widgets/dialog.js
        new file mode 100644
        index 0000000000..27dccd2ad9
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/dialog.js
        @@ -0,0 +1,940 @@
        +/*!
        + * jQuery UI Dialog 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Dialog
        +//>>group: Widgets
        +//>>description: Displays customizable dialog windows.
        +//>>docs: http://api.jqueryui.com/dialog/
        +//>>demos: http://jqueryui.com/dialog/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/dialog.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./button",
        +			"./draggable",
        +			"./mouse",
        +			"./resizable",
        +			"../focusable",
        +			"../keycode",
        +			"../position",
        +			"../safe-active-element",
        +			"../safe-blur",
        +			"../tabbable",
        +			"../unique-id",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.dialog", {
        +	version: "1.12.1",
        +	options: {
        +		appendTo: "body",
        +		autoOpen: true,
        +		buttons: [],
        +		classes: {
        +			"ui-dialog": "ui-corner-all",
        +			"ui-dialog-titlebar": "ui-corner-all"
        +		},
        +		closeOnEscape: true,
        +		closeText: "Close",
        +		draggable: true,
        +		hide: null,
        +		height: "auto",
        +		maxHeight: null,
        +		maxWidth: null,
        +		minHeight: 150,
        +		minWidth: 150,
        +		modal: false,
        +		position: {
        +			my: "center",
        +			at: "center",
        +			of: window,
        +			collision: "fit",
        +
        +			// Ensure the titlebar is always visible
        +			using: function( pos ) {
        +				var topOffset = $( this ).css( pos ).offset().top;
        +				if ( topOffset < 0 ) {
        +					$( this ).css( "top", pos.top - topOffset );
        +				}
        +			}
        +		},
        +		resizable: true,
        +		show: null,
        +		title: null,
        +		width: 300,
        +
        +		// Callbacks
        +		beforeClose: null,
        +		close: null,
        +		drag: null,
        +		dragStart: null,
        +		dragStop: null,
        +		focus: null,
        +		open: null,
        +		resize: null,
        +		resizeStart: null,
        +		resizeStop: null
        +	},
        +
        +	sizeRelatedOptions: {
        +		buttons: true,
        +		height: true,
        +		maxHeight: true,
        +		maxWidth: true,
        +		minHeight: true,
        +		minWidth: true,
        +		width: true
        +	},
        +
        +	resizableRelatedOptions: {
        +		maxHeight: true,
        +		maxWidth: true,
        +		minHeight: true,
        +		minWidth: true
        +	},
        +
        +	_create: function() {
        +		this.originalCss = {
        +			display: this.element[ 0 ].style.display,
        +			width: this.element[ 0 ].style.width,
        +			minHeight: this.element[ 0 ].style.minHeight,
        +			maxHeight: this.element[ 0 ].style.maxHeight,
        +			height: this.element[ 0 ].style.height
        +		};
        +		this.originalPosition = {
        +			parent: this.element.parent(),
        +			index: this.element.parent().children().index( this.element )
        +		};
        +		this.originalTitle = this.element.attr( "title" );
        +		if ( this.options.title == null && this.originalTitle != null ) {
        +			this.options.title = this.originalTitle;
        +		}
        +
        +		// Dialogs can't be disabled
        +		if ( this.options.disabled ) {
        +			this.options.disabled = false;
        +		}
        +
        +		this._createWrapper();
        +
        +		this.element
        +			.show()
        +			.removeAttr( "title" )
        +			.appendTo( this.uiDialog );
        +
        +		this._addClass( "ui-dialog-content", "ui-widget-content" );
        +
        +		this._createTitlebar();
        +		this._createButtonPane();
        +
        +		if ( this.options.draggable && $.fn.draggable ) {
        +			this._makeDraggable();
        +		}
        +		if ( this.options.resizable && $.fn.resizable ) {
        +			this._makeResizable();
        +		}
        +
        +		this._isOpen = false;
        +
        +		this._trackFocus();
        +	},
        +
        +	_init: function() {
        +		if ( this.options.autoOpen ) {
        +			this.open();
        +		}
        +	},
        +
        +	_appendTo: function() {
        +		var element = this.options.appendTo;
        +		if ( element && ( element.jquery || element.nodeType ) ) {
        +			return $( element );
        +		}
        +		return this.document.find( element || "body" ).eq( 0 );
        +	},
        +
        +	_destroy: function() {
        +		var next,
        +			originalPosition = this.originalPosition;
        +
        +		this._untrackInstance();
        +		this._destroyOverlay();
        +
        +		this.element
        +			.removeUniqueId()
        +			.css( this.originalCss )
        +
        +			// Without detaching first, the following becomes really slow
        +			.detach();
        +
        +		this.uiDialog.remove();
        +
        +		if ( this.originalTitle ) {
        +			this.element.attr( "title", this.originalTitle );
        +		}
        +
        +		next = originalPosition.parent.children().eq( originalPosition.index );
        +
        +		// Don't try to place the dialog next to itself (#8613)
        +		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
        +			next.before( this.element );
        +		} else {
        +			originalPosition.parent.append( this.element );
        +		}
        +	},
        +
        +	widget: function() {
        +		return this.uiDialog;
        +	},
        +
        +	disable: $.noop,
        +	enable: $.noop,
        +
        +	close: function( event ) {
        +		var that = this;
        +
        +		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
        +			return;
        +		}
        +
        +		this._isOpen = false;
        +		this._focusedElement = null;
        +		this._destroyOverlay();
        +		this._untrackInstance();
        +
        +		if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
        +
        +			// Hiding a focused element doesn't trigger blur in WebKit
        +			// so in case we have nothing to focus on, explicitly blur the active element
        +			// https://bugs.webkit.org/show_bug.cgi?id=47182
        +			$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
        +		}
        +
        +		this._hide( this.uiDialog, this.options.hide, function() {
        +			that._trigger( "close", event );
        +		} );
        +	},
        +
        +	isOpen: function() {
        +		return this._isOpen;
        +	},
        +
        +	moveToTop: function() {
        +		this._moveToTop();
        +	},
        +
        +	_moveToTop: function( event, silent ) {
        +		var moved = false,
        +			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
        +				return +$( this ).css( "z-index" );
        +			} ).get(),
        +			zIndexMax = Math.max.apply( null, zIndices );
        +
        +		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
        +			this.uiDialog.css( "z-index", zIndexMax + 1 );
        +			moved = true;
        +		}
        +
        +		if ( moved && !silent ) {
        +			this._trigger( "focus", event );
        +		}
        +		return moved;
        +	},
        +
        +	open: function() {
        +		var that = this;
        +		if ( this._isOpen ) {
        +			if ( this._moveToTop() ) {
        +				this._focusTabbable();
        +			}
        +			return;
        +		}
        +
        +		this._isOpen = true;
        +		this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
        +
        +		this._size();
        +		this._position();
        +		this._createOverlay();
        +		this._moveToTop( null, true );
        +
        +		// Ensure the overlay is moved to the top with the dialog, but only when
        +		// opening. The overlay shouldn't move after the dialog is open so that
        +		// modeless dialogs opened after the modal dialog stack properly.
        +		if ( this.overlay ) {
        +			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
        +		}
        +
        +		this._show( this.uiDialog, this.options.show, function() {
        +			that._focusTabbable();
        +			that._trigger( "focus" );
        +		} );
        +
        +		// Track the dialog immediately upon openening in case a focus event
        +		// somehow occurs outside of the dialog before an element inside the
        +		// dialog is focused (#10152)
        +		this._makeFocusTarget();
        +
        +		this._trigger( "open" );
        +	},
        +
        +	_focusTabbable: function() {
        +
        +		// Set focus to the first match:
        +		// 1. An element that was focused previously
        +		// 2. First element inside the dialog matching [autofocus]
        +		// 3. Tabbable element inside the content element
        +		// 4. Tabbable element inside the buttonpane
        +		// 5. The close button
        +		// 6. The dialog itself
        +		var hasFocus = this._focusedElement;
        +		if ( !hasFocus ) {
        +			hasFocus = this.element.find( "[autofocus]" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.element.find( ":tabbable" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
        +		}
        +		if ( !hasFocus.length ) {
        +			hasFocus = this.uiDialog;
        +		}
        +		hasFocus.eq( 0 ).trigger( "focus" );
        +	},
        +
        +	_keepFocus: function( event ) {
        +		function checkFocus() {
        +			var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
        +				isActive = this.uiDialog[ 0 ] === activeElement ||
        +					$.contains( this.uiDialog[ 0 ], activeElement );
        +			if ( !isActive ) {
        +				this._focusTabbable();
        +			}
        +		}
        +		event.preventDefault();
        +		checkFocus.call( this );
        +
        +		// support: IE
        +		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
        +		// so we check again later
        +		this._delay( checkFocus );
        +	},
        +
        +	_createWrapper: function() {
        +		this.uiDialog = $( "<div>" )
        +			.hide()
        +			.attr( {
        +
        +				// Setting tabIndex makes the div focusable
        +				tabIndex: -1,
        +				role: "dialog"
        +			} )
        +			.appendTo( this._appendTo() );
        +
        +		this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
        +		this._on( this.uiDialog, {
        +			keydown: function( event ) {
        +				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
        +						event.keyCode === $.ui.keyCode.ESCAPE ) {
        +					event.preventDefault();
        +					this.close( event );
        +					return;
        +				}
        +
        +				// Prevent tabbing out of dialogs
        +				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
        +					return;
        +				}
        +				var tabbables = this.uiDialog.find( ":tabbable" ),
        +					first = tabbables.filter( ":first" ),
        +					last = tabbables.filter( ":last" );
        +
        +				if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
        +						!event.shiftKey ) {
        +					this._delay( function() {
        +						first.trigger( "focus" );
        +					} );
        +					event.preventDefault();
        +				} else if ( ( event.target === first[ 0 ] ||
        +						event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
        +					this._delay( function() {
        +						last.trigger( "focus" );
        +					} );
        +					event.preventDefault();
        +				}
        +			},
        +			mousedown: function( event ) {
        +				if ( this._moveToTop( event ) ) {
        +					this._focusTabbable();
        +				}
        +			}
        +		} );
        +
        +		// We assume that any existing aria-describedby attribute means
        +		// that the dialog content is marked up properly
        +		// otherwise we brute force the content as the description
        +		if ( !this.element.find( "[aria-describedby]" ).length ) {
        +			this.uiDialog.attr( {
        +				"aria-describedby": this.element.uniqueId().attr( "id" )
        +			} );
        +		}
        +	},
        +
        +	_createTitlebar: function() {
        +		var uiDialogTitle;
        +
        +		this.uiDialogTitlebar = $( "<div>" );
        +		this._addClass( this.uiDialogTitlebar,
        +			"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
        +		this._on( this.uiDialogTitlebar, {
        +			mousedown: function( event ) {
        +
        +				// Don't prevent click on close button (#8838)
        +				// Focusing a dialog that is partially scrolled out of view
        +				// causes the browser to scroll it into view, preventing the click event
        +				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
        +
        +					// Dialog isn't getting focus when dragging (#8063)
        +					this.uiDialog.trigger( "focus" );
        +				}
        +			}
        +		} );
        +
        +		// Support: IE
        +		// Use type="button" to prevent enter keypresses in textboxes from closing the
        +		// dialog in IE (#9312)
        +		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
        +			.button( {
        +				label: $( "<a>" ).text( this.options.closeText ).html(),
        +				icon: "ui-icon-closethick",
        +				showLabel: false
        +			} )
        +			.appendTo( this.uiDialogTitlebar );
        +
        +		this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
        +		this._on( this.uiDialogTitlebarClose, {
        +			click: function( event ) {
        +				event.preventDefault();
        +				this.close( event );
        +			}
        +		} );
        +
        +		uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
        +		this._addClass( uiDialogTitle, "ui-dialog-title" );
        +		this._title( uiDialogTitle );
        +
        +		this.uiDialogTitlebar.prependTo( this.uiDialog );
        +
        +		this.uiDialog.attr( {
        +			"aria-labelledby": uiDialogTitle.attr( "id" )
        +		} );
        +	},
        +
        +	_title: function( title ) {
        +		if ( this.options.title ) {
        +			title.text( this.options.title );
        +		} else {
        +			title.html( "&#160;" );
        +		}
        +	},
        +
        +	_createButtonPane: function() {
        +		this.uiDialogButtonPane = $( "<div>" );
        +		this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
        +			"ui-widget-content ui-helper-clearfix" );
        +
        +		this.uiButtonSet = $( "<div>" )
        +			.appendTo( this.uiDialogButtonPane );
        +		this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
        +
        +		this._createButtons();
        +	},
        +
        +	_createButtons: function() {
        +		var that = this,
        +			buttons = this.options.buttons;
        +
        +		// If we already have a button pane, remove it
        +		this.uiDialogButtonPane.remove();
        +		this.uiButtonSet.empty();
        +
        +		if ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {
        +			this._removeClass( this.uiDialog, "ui-dialog-buttons" );
        +			return;
        +		}
        +
        +		$.each( buttons, function( name, props ) {
        +			var click, buttonOptions;
        +			props = $.isFunction( props ) ?
        +				{ click: props, text: name } :
        +				props;
        +
        +			// Default to a non-submitting button
        +			props = $.extend( { type: "button" }, props );
        +
        +			// Change the context for the click callback to be the main element
        +			click = props.click;
        +			buttonOptions = {
        +				icon: props.icon,
        +				iconPosition: props.iconPosition,
        +				showLabel: props.showLabel,
        +
        +				// Deprecated options
        +				icons: props.icons,
        +				text: props.text
        +			};
        +
        +			delete props.click;
        +			delete props.icon;
        +			delete props.iconPosition;
        +			delete props.showLabel;
        +
        +			// Deprecated options
        +			delete props.icons;
        +			if ( typeof props.text === "boolean" ) {
        +				delete props.text;
        +			}
        +
        +			$( "<button></button>", props )
        +				.button( buttonOptions )
        +				.appendTo( that.uiButtonSet )
        +				.on( "click", function() {
        +					click.apply( that.element[ 0 ], arguments );
        +				} );
        +		} );
        +		this._addClass( this.uiDialog, "ui-dialog-buttons" );
        +		this.uiDialogButtonPane.appendTo( this.uiDialog );
        +	},
        +
        +	_makeDraggable: function() {
        +		var that = this,
        +			options = this.options;
        +
        +		function filteredUi( ui ) {
        +			return {
        +				position: ui.position,
        +				offset: ui.offset
        +			};
        +		}
        +
        +		this.uiDialog.draggable( {
        +			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
        +			handle: ".ui-dialog-titlebar",
        +			containment: "document",
        +			start: function( event, ui ) {
        +				that._addClass( $( this ), "ui-dialog-dragging" );
        +				that._blockFrames();
        +				that._trigger( "dragStart", event, filteredUi( ui ) );
        +			},
        +			drag: function( event, ui ) {
        +				that._trigger( "drag", event, filteredUi( ui ) );
        +			},
        +			stop: function( event, ui ) {
        +				var left = ui.offset.left - that.document.scrollLeft(),
        +					top = ui.offset.top - that.document.scrollTop();
        +
        +				options.position = {
        +					my: "left top",
        +					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
        +						"top" + ( top >= 0 ? "+" : "" ) + top,
        +					of: that.window
        +				};
        +				that._removeClass( $( this ), "ui-dialog-dragging" );
        +				that._unblockFrames();
        +				that._trigger( "dragStop", event, filteredUi( ui ) );
        +			}
        +		} );
        +	},
        +
        +	_makeResizable: function() {
        +		var that = this,
        +			options = this.options,
        +			handles = options.resizable,
        +
        +			// .ui-resizable has position: relative defined in the stylesheet
        +			// but dialogs have to use absolute or fixed positioning
        +			position = this.uiDialog.css( "position" ),
        +			resizeHandles = typeof handles === "string" ?
        +				handles :
        +				"n,e,s,w,se,sw,ne,nw";
        +
        +		function filteredUi( ui ) {
        +			return {
        +				originalPosition: ui.originalPosition,
        +				originalSize: ui.originalSize,
        +				position: ui.position,
        +				size: ui.size
        +			};
        +		}
        +
        +		this.uiDialog.resizable( {
        +			cancel: ".ui-dialog-content",
        +			containment: "document",
        +			alsoResize: this.element,
        +			maxWidth: options.maxWidth,
        +			maxHeight: options.maxHeight,
        +			minWidth: options.minWidth,
        +			minHeight: this._minHeight(),
        +			handles: resizeHandles,
        +			start: function( event, ui ) {
        +				that._addClass( $( this ), "ui-dialog-resizing" );
        +				that._blockFrames();
        +				that._trigger( "resizeStart", event, filteredUi( ui ) );
        +			},
        +			resize: function( event, ui ) {
        +				that._trigger( "resize", event, filteredUi( ui ) );
        +			},
        +			stop: function( event, ui ) {
        +				var offset = that.uiDialog.offset(),
        +					left = offset.left - that.document.scrollLeft(),
        +					top = offset.top - that.document.scrollTop();
        +
        +				options.height = that.uiDialog.height();
        +				options.width = that.uiDialog.width();
        +				options.position = {
        +					my: "left top",
        +					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
        +						"top" + ( top >= 0 ? "+" : "" ) + top,
        +					of: that.window
        +				};
        +				that._removeClass( $( this ), "ui-dialog-resizing" );
        +				that._unblockFrames();
        +				that._trigger( "resizeStop", event, filteredUi( ui ) );
        +			}
        +		} )
        +			.css( "position", position );
        +	},
        +
        +	_trackFocus: function() {
        +		this._on( this.widget(), {
        +			focusin: function( event ) {
        +				this._makeFocusTarget();
        +				this._focusedElement = $( event.target );
        +			}
        +		} );
        +	},
        +
        +	_makeFocusTarget: function() {
        +		this._untrackInstance();
        +		this._trackingInstances().unshift( this );
        +	},
        +
        +	_untrackInstance: function() {
        +		var instances = this._trackingInstances(),
        +			exists = $.inArray( this, instances );
        +		if ( exists !== -1 ) {
        +			instances.splice( exists, 1 );
        +		}
        +	},
        +
        +	_trackingInstances: function() {
        +		var instances = this.document.data( "ui-dialog-instances" );
        +		if ( !instances ) {
        +			instances = [];
        +			this.document.data( "ui-dialog-instances", instances );
        +		}
        +		return instances;
        +	},
        +
        +	_minHeight: function() {
        +		var options = this.options;
        +
        +		return options.height === "auto" ?
        +			options.minHeight :
        +			Math.min( options.minHeight, options.height );
        +	},
        +
        +	_position: function() {
        +
        +		// Need to show the dialog to get the actual offset in the position plugin
        +		var isVisible = this.uiDialog.is( ":visible" );
        +		if ( !isVisible ) {
        +			this.uiDialog.show();
        +		}
        +		this.uiDialog.position( this.options.position );
        +		if ( !isVisible ) {
        +			this.uiDialog.hide();
        +		}
        +	},
        +
        +	_setOptions: function( options ) {
        +		var that = this,
        +			resize = false,
        +			resizableOptions = {};
        +
        +		$.each( options, function( key, value ) {
        +			that._setOption( key, value );
        +
        +			if ( key in that.sizeRelatedOptions ) {
        +				resize = true;
        +			}
        +			if ( key in that.resizableRelatedOptions ) {
        +				resizableOptions[ key ] = value;
        +			}
        +		} );
        +
        +		if ( resize ) {
        +			this._size();
        +			this._position();
        +		}
        +		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        +			this.uiDialog.resizable( "option", resizableOptions );
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var isDraggable, isResizable,
        +			uiDialog = this.uiDialog;
        +
        +		if ( key === "disabled" ) {
        +			return;
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "appendTo" ) {
        +			this.uiDialog.appendTo( this._appendTo() );
        +		}
        +
        +		if ( key === "buttons" ) {
        +			this._createButtons();
        +		}
        +
        +		if ( key === "closeText" ) {
        +			this.uiDialogTitlebarClose.button( {
        +
        +				// Ensure that we always pass a string
        +				label: $( "<a>" ).text( "" + this.options.closeText ).html()
        +			} );
        +		}
        +
        +		if ( key === "draggable" ) {
        +			isDraggable = uiDialog.is( ":data(ui-draggable)" );
        +			if ( isDraggable && !value ) {
        +				uiDialog.draggable( "destroy" );
        +			}
        +
        +			if ( !isDraggable && value ) {
        +				this._makeDraggable();
        +			}
        +		}
        +
        +		if ( key === "position" ) {
        +			this._position();
        +		}
        +
        +		if ( key === "resizable" ) {
        +
        +			// currently resizable, becoming non-resizable
        +			isResizable = uiDialog.is( ":data(ui-resizable)" );
        +			if ( isResizable && !value ) {
        +				uiDialog.resizable( "destroy" );
        +			}
        +
        +			// Currently resizable, changing handles
        +			if ( isResizable && typeof value === "string" ) {
        +				uiDialog.resizable( "option", "handles", value );
        +			}
        +
        +			// Currently non-resizable, becoming resizable
        +			if ( !isResizable && value !== false ) {
        +				this._makeResizable();
        +			}
        +		}
        +
        +		if ( key === "title" ) {
        +			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
        +		}
        +	},
        +
        +	_size: function() {
        +
        +		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
        +		// divs will both have width and height set, so we need to reset them
        +		var nonContentHeight, minContentHeight, maxContentHeight,
        +			options = this.options;
        +
        +		// Reset content sizing
        +		this.element.show().css( {
        +			width: "auto",
        +			minHeight: 0,
        +			maxHeight: "none",
        +			height: 0
        +		} );
        +
        +		if ( options.minWidth > options.width ) {
        +			options.width = options.minWidth;
        +		}
        +
        +		// Reset wrapper sizing
        +		// determine the height of all the non-content elements
        +		nonContentHeight = this.uiDialog.css( {
        +			height: "auto",
        +			width: options.width
        +		} )
        +			.outerHeight();
        +		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
        +		maxContentHeight = typeof options.maxHeight === "number" ?
        +			Math.max( 0, options.maxHeight - nonContentHeight ) :
        +			"none";
        +
        +		if ( options.height === "auto" ) {
        +			this.element.css( {
        +				minHeight: minContentHeight,
        +				maxHeight: maxContentHeight,
        +				height: "auto"
        +			} );
        +		} else {
        +			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
        +		}
        +
        +		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        +			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
        +		}
        +	},
        +
        +	_blockFrames: function() {
        +		this.iframeBlocks = this.document.find( "iframe" ).map( function() {
        +			var iframe = $( this );
        +
        +			return $( "<div>" )
        +				.css( {
        +					position: "absolute",
        +					width: iframe.outerWidth(),
        +					height: iframe.outerHeight()
        +				} )
        +				.appendTo( iframe.parent() )
        +				.offset( iframe.offset() )[ 0 ];
        +		} );
        +	},
        +
        +	_unblockFrames: function() {
        +		if ( this.iframeBlocks ) {
        +			this.iframeBlocks.remove();
        +			delete this.iframeBlocks;
        +		}
        +	},
        +
        +	_allowInteraction: function( event ) {
        +		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
        +			return true;
        +		}
        +
        +		// TODO: Remove hack when datepicker implements
        +		// the .ui-front logic (#8989)
        +		return !!$( event.target ).closest( ".ui-datepicker" ).length;
        +	},
        +
        +	_createOverlay: function() {
        +		if ( !this.options.modal ) {
        +			return;
        +		}
        +
        +		// We use a delay in case the overlay is created from an
        +		// event that we're going to be cancelling (#2804)
        +		var isOpening = true;
        +		this._delay( function() {
        +			isOpening = false;
        +		} );
        +
        +		if ( !this.document.data( "ui-dialog-overlays" ) ) {
        +
        +			// Prevent use of anchors and inputs
        +			// Using _on() for an event handler shared across many instances is
        +			// safe because the dialogs stack and must be closed in reverse order
        +			this._on( this.document, {
        +				focusin: function( event ) {
        +					if ( isOpening ) {
        +						return;
        +					}
        +
        +					if ( !this._allowInteraction( event ) ) {
        +						event.preventDefault();
        +						this._trackingInstances()[ 0 ]._focusTabbable();
        +					}
        +				}
        +			} );
        +		}
        +
        +		this.overlay = $( "<div>" )
        +			.appendTo( this._appendTo() );
        +
        +		this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
        +		this._on( this.overlay, {
        +			mousedown: "_keepFocus"
        +		} );
        +		this.document.data( "ui-dialog-overlays",
        +			( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
        +	},
        +
        +	_destroyOverlay: function() {
        +		if ( !this.options.modal ) {
        +			return;
        +		}
        +
        +		if ( this.overlay ) {
        +			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
        +
        +			if ( !overlays ) {
        +				this._off( this.document, "focusin" );
        +				this.document.removeData( "ui-dialog-overlays" );
        +			} else {
        +				this.document.data( "ui-dialog-overlays", overlays );
        +			}
        +
        +			this.overlay.remove();
        +			this.overlay = null;
        +		}
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for dialogClass option
        +	$.widget( "ui.dialog", $.ui.dialog, {
        +		options: {
        +			dialogClass: ""
        +		},
        +		_createWrapper: function() {
        +			this._super();
        +			this.uiDialog.addClass( this.options.dialogClass );
        +		},
        +		_setOption: function( key, value ) {
        +			if ( key === "dialogClass" ) {
        +				this.uiDialog
        +					.removeClass( this.options.dialogClass )
        +					.addClass( value );
        +			}
        +			this._superApply( arguments );
        +		}
        +	} );
        +}
        +
        +return $.ui.dialog;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/draggable.js b/bower_components/jquery-ui/ui/widgets/draggable.js
        new file mode 100644
        index 0000000000..8c9775138f
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/draggable.js
        @@ -0,0 +1,1250 @@
        +/*!
        + * jQuery UI Draggable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Draggable
        +//>>group: Interactions
        +//>>description: Enables dragging functionality for any element.
        +//>>docs: http://api.jqueryui.com/draggable/
        +//>>demos: http://jqueryui.com/draggable/
        +//>>css.structure: ../../themes/base/draggable.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./mouse",
        +			"../data",
        +			"../plugin",
        +			"../safe-active-element",
        +			"../safe-blur",
        +			"../scroll-parent",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.draggable", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "drag",
        +	options: {
        +		addClasses: true,
        +		appendTo: "parent",
        +		axis: false,
        +		connectToSortable: false,
        +		containment: false,
        +		cursor: "auto",
        +		cursorAt: false,
        +		grid: false,
        +		handle: false,
        +		helper: "original",
        +		iframeFix: false,
        +		opacity: false,
        +		refreshPositions: false,
        +		revert: false,
        +		revertDuration: 500,
        +		scope: "default",
        +		scroll: true,
        +		scrollSensitivity: 20,
        +		scrollSpeed: 20,
        +		snap: false,
        +		snapMode: "both",
        +		snapTolerance: 20,
        +		stack: false,
        +		zIndex: false,
        +
        +		// Callbacks
        +		drag: null,
        +		start: null,
        +		stop: null
        +	},
        +	_create: function() {
        +
        +		if ( this.options.helper === "original" ) {
        +			this._setPositionRelative();
        +		}
        +		if ( this.options.addClasses ) {
        +			this._addClass( "ui-draggable" );
        +		}
        +		this._setHandleClassName();
        +
        +		this._mouseInit();
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +		if ( key === "handle" ) {
        +			this._removeHandleClassName();
        +			this._setHandleClassName();
        +		}
        +	},
        +
        +	_destroy: function() {
        +		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
        +			this.destroyOnClear = true;
        +			return;
        +		}
        +		this._removeHandleClassName();
        +		this._mouseDestroy();
        +	},
        +
        +	_mouseCapture: function( event ) {
        +		var o = this.options;
        +
        +		// Among others, prevent a drag on a resizable-handle
        +		if ( this.helper || o.disabled ||
        +				$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
        +			return false;
        +		}
        +
        +		//Quit if we're not on a valid handle
        +		this.handle = this._getHandle( event );
        +		if ( !this.handle ) {
        +			return false;
        +		}
        +
        +		this._blurActiveElement( event );
        +
        +		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
        +
        +		return true;
        +
        +	},
        +
        +	_blockFrames: function( selector ) {
        +		this.iframeBlocks = this.document.find( selector ).map( function() {
        +			var iframe = $( this );
        +
        +			return $( "<div>" )
        +				.css( "position", "absolute" )
        +				.appendTo( iframe.parent() )
        +				.outerWidth( iframe.outerWidth() )
        +				.outerHeight( iframe.outerHeight() )
        +				.offset( iframe.offset() )[ 0 ];
        +		} );
        +	},
        +
        +	_unblockFrames: function() {
        +		if ( this.iframeBlocks ) {
        +			this.iframeBlocks.remove();
        +			delete this.iframeBlocks;
        +		}
        +	},
        +
        +	_blurActiveElement: function( event ) {
        +		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
        +			target = $( event.target );
        +
        +		// Don't blur if the event occurred on an element that is within
        +		// the currently focused element
        +		// See #10527, #12472
        +		if ( target.closest( activeElement ).length ) {
        +			return;
        +		}
        +
        +		// Blur any element that currently has focus, see #4261
        +		$.ui.safeBlur( activeElement );
        +	},
        +
        +	_mouseStart: function( event ) {
        +
        +		var o = this.options;
        +
        +		//Create and append the visible helper
        +		this.helper = this._createHelper( event );
        +
        +		this._addClass( this.helper, "ui-draggable-dragging" );
        +
        +		//Cache the helper size
        +		this._cacheHelperProportions();
        +
        +		//If ddmanager is used for droppables, set the global draggable
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.current = this;
        +		}
        +
        +		/*
        +		 * - Position generation -
        +		 * This block generates everything position related - it's the core of draggables.
        +		 */
        +
        +		//Cache the margins of the original element
        +		this._cacheMargins();
        +
        +		//Store the helper's css position
        +		this.cssPosition = this.helper.css( "position" );
        +		this.scrollParent = this.helper.scrollParent( true );
        +		this.offsetParent = this.helper.offsetParent();
        +		this.hasFixedAncestor = this.helper.parents().filter( function() {
        +				return $( this ).css( "position" ) === "fixed";
        +			} ).length > 0;
        +
        +		//The element's absolute position on the page minus margins
        +		this.positionAbs = this.element.offset();
        +		this._refreshOffsets( event );
        +
        +		//Generate the original position
        +		this.originalPosition = this.position = this._generatePosition( event, false );
        +		this.originalPageX = event.pageX;
        +		this.originalPageY = event.pageY;
        +
        +		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        +		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
        +
        +		//Set a containment if given in the options
        +		this._setContainment();
        +
        +		//Trigger event + callbacks
        +		if ( this._trigger( "start", event ) === false ) {
        +			this._clear();
        +			return false;
        +		}
        +
        +		//Recache the helper size
        +		this._cacheHelperProportions();
        +
        +		//Prepare the droppable offsets
        +		if ( $.ui.ddmanager && !o.dropBehaviour ) {
        +			$.ui.ddmanager.prepareOffsets( this, event );
        +		}
        +
        +		// Execute the drag once - this causes the helper not to be visible before getting its
        +		// correct position
        +		this._mouseDrag( event, true );
        +
        +		// If the ddmanager is used for droppables, inform the manager that dragging has started
        +		// (see #5003)
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.dragStart( this, event );
        +		}
        +
        +		return true;
        +	},
        +
        +	_refreshOffsets: function( event ) {
        +		this.offset = {
        +			top: this.positionAbs.top - this.margins.top,
        +			left: this.positionAbs.left - this.margins.left,
        +			scroll: false,
        +			parent: this._getParentOffset(),
        +			relative: this._getRelativeOffset()
        +		};
        +
        +		this.offset.click = {
        +			left: event.pageX - this.offset.left,
        +			top: event.pageY - this.offset.top
        +		};
        +	},
        +
        +	_mouseDrag: function( event, noPropagation ) {
        +
        +		// reset any necessary cached properties (see #5009)
        +		if ( this.hasFixedAncestor ) {
        +			this.offset.parent = this._getParentOffset();
        +		}
        +
        +		//Compute the helpers position
        +		this.position = this._generatePosition( event, true );
        +		this.positionAbs = this._convertPositionTo( "absolute" );
        +
        +		//Call plugins and callbacks and use the resulting position if something is returned
        +		if ( !noPropagation ) {
        +			var ui = this._uiHash();
        +			if ( this._trigger( "drag", event, ui ) === false ) {
        +				this._mouseUp( new $.Event( "mouseup", event ) );
        +				return false;
        +			}
        +			this.position = ui.position;
        +		}
        +
        +		this.helper[ 0 ].style.left = this.position.left + "px";
        +		this.helper[ 0 ].style.top = this.position.top + "px";
        +
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.drag( this, event );
        +		}
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +
        +		//If we are using droppables, inform the manager about the drop
        +		var that = this,
        +			dropped = false;
        +		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
        +			dropped = $.ui.ddmanager.drop( this, event );
        +		}
        +
        +		//if a drop comes from outside (a sortable)
        +		if ( this.dropped ) {
        +			dropped = this.dropped;
        +			this.dropped = false;
        +		}
        +
        +		if ( ( this.options.revert === "invalid" && !dropped ) ||
        +				( this.options.revert === "valid" && dropped ) ||
        +				this.options.revert === true || ( $.isFunction( this.options.revert ) &&
        +				this.options.revert.call( this.element, dropped ) )
        +		) {
        +			$( this.helper ).animate(
        +				this.originalPosition,
        +				parseInt( this.options.revertDuration, 10 ),
        +				function() {
        +					if ( that._trigger( "stop", event ) !== false ) {
        +						that._clear();
        +					}
        +				}
        +			);
        +		} else {
        +			if ( this._trigger( "stop", event ) !== false ) {
        +				this._clear();
        +			}
        +		}
        +
        +		return false;
        +	},
        +
        +	_mouseUp: function( event ) {
        +		this._unblockFrames();
        +
        +		// If the ddmanager is used for droppables, inform the manager that dragging has stopped
        +		// (see #5003)
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.dragStop( this, event );
        +		}
        +
        +		// Only need to focus if the event occurred on the draggable itself, see #10527
        +		if ( this.handleElement.is( event.target ) ) {
        +
        +			// The interaction is over; whether or not the click resulted in a drag,
        +			// focus the element
        +			this.element.trigger( "focus" );
        +		}
        +
        +		return $.ui.mouse.prototype._mouseUp.call( this, event );
        +	},
        +
        +	cancel: function() {
        +
        +		if ( this.helper.is( ".ui-draggable-dragging" ) ) {
        +			this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
        +		} else {
        +			this._clear();
        +		}
        +
        +		return this;
        +
        +	},
        +
        +	_getHandle: function( event ) {
        +		return this.options.handle ?
        +			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
        +			true;
        +	},
        +
        +	_setHandleClassName: function() {
        +		this.handleElement = this.options.handle ?
        +			this.element.find( this.options.handle ) : this.element;
        +		this._addClass( this.handleElement, "ui-draggable-handle" );
        +	},
        +
        +	_removeHandleClassName: function() {
        +		this._removeClass( this.handleElement, "ui-draggable-handle" );
        +	},
        +
        +	_createHelper: function( event ) {
        +
        +		var o = this.options,
        +			helperIsFunction = $.isFunction( o.helper ),
        +			helper = helperIsFunction ?
        +				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
        +				( o.helper === "clone" ?
        +					this.element.clone().removeAttr( "id" ) :
        +					this.element );
        +
        +		if ( !helper.parents( "body" ).length ) {
        +			helper.appendTo( ( o.appendTo === "parent" ?
        +				this.element[ 0 ].parentNode :
        +				o.appendTo ) );
        +		}
        +
        +		// Http://bugs.jqueryui.com/ticket/9446
        +		// a helper function can return the original element
        +		// which wouldn't have been set to relative in _create
        +		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
        +			this._setPositionRelative();
        +		}
        +
        +		if ( helper[ 0 ] !== this.element[ 0 ] &&
        +				!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
        +			helper.css( "position", "absolute" );
        +		}
        +
        +		return helper;
        +
        +	},
        +
        +	_setPositionRelative: function() {
        +		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
        +			this.element[ 0 ].style.position = "relative";
        +		}
        +	},
        +
        +	_adjustOffsetFromHelper: function( obj ) {
        +		if ( typeof obj === "string" ) {
        +			obj = obj.split( " " );
        +		}
        +		if ( $.isArray( obj ) ) {
        +			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
        +		}
        +		if ( "left" in obj ) {
        +			this.offset.click.left = obj.left + this.margins.left;
        +		}
        +		if ( "right" in obj ) {
        +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        +		}
        +		if ( "top" in obj ) {
        +			this.offset.click.top = obj.top + this.margins.top;
        +		}
        +		if ( "bottom" in obj ) {
        +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        +		}
        +	},
        +
        +	_isRootNode: function( element ) {
        +		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
        +	},
        +
        +	_getParentOffset: function() {
        +
        +		//Get the offsetParent and cache its position
        +		var po = this.offsetParent.offset(),
        +			document = this.document[ 0 ];
        +
        +		// This is a special case where we need to modify a offset calculated on start, since the
        +		// following happened:
        +		// 1. The position of the helper is absolute, so it's position is calculated based on the
        +		// next positioned parent
        +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
        +		// the document, which means that the scroll is included in the initial calculation of the
        +		// offset of the parent, and never recalculated upon drag
        +		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
        +			po.left += this.scrollParent.scrollLeft();
        +			po.top += this.scrollParent.scrollTop();
        +		}
        +
        +		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
        +			po = { top: 0, left: 0 };
        +		}
        +
        +		return {
        +			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
        +			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
        +		};
        +
        +	},
        +
        +	_getRelativeOffset: function() {
        +		if ( this.cssPosition !== "relative" ) {
        +			return { top: 0, left: 0 };
        +		}
        +
        +		var p = this.element.position(),
        +			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        +
        +		return {
        +			top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
        +				( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
        +			left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
        +				( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
        +		};
        +
        +	},
        +
        +	_cacheMargins: function() {
        +		this.margins = {
        +			left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
        +			top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
        +			right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
        +			bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
        +		};
        +	},
        +
        +	_cacheHelperProportions: function() {
        +		this.helperProportions = {
        +			width: this.helper.outerWidth(),
        +			height: this.helper.outerHeight()
        +		};
        +	},
        +
        +	_setContainment: function() {
        +
        +		var isUserScrollable, c, ce,
        +			o = this.options,
        +			document = this.document[ 0 ];
        +
        +		this.relativeContainer = null;
        +
        +		if ( !o.containment ) {
        +			this.containment = null;
        +			return;
        +		}
        +
        +		if ( o.containment === "window" ) {
        +			this.containment = [
        +				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
        +				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
        +				$( window ).scrollLeft() + $( window ).width() -
        +					this.helperProportions.width - this.margins.left,
        +				$( window ).scrollTop() +
        +					( $( window ).height() || document.body.parentNode.scrollHeight ) -
        +					this.helperProportions.height - this.margins.top
        +			];
        +			return;
        +		}
        +
        +		if ( o.containment === "document" ) {
        +			this.containment = [
        +				0,
        +				0,
        +				$( document ).width() - this.helperProportions.width - this.margins.left,
        +				( $( document ).height() || document.body.parentNode.scrollHeight ) -
        +					this.helperProportions.height - this.margins.top
        +			];
        +			return;
        +		}
        +
        +		if ( o.containment.constructor === Array ) {
        +			this.containment = o.containment;
        +			return;
        +		}
        +
        +		if ( o.containment === "parent" ) {
        +			o.containment = this.helper[ 0 ].parentNode;
        +		}
        +
        +		c = $( o.containment );
        +		ce = c[ 0 ];
        +
        +		if ( !ce ) {
        +			return;
        +		}
        +
        +		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
        +
        +		this.containment = [
        +			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
        +				( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
        +			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
        +				( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
        +			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
        +				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
        +				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
        +				this.helperProportions.width -
        +				this.margins.left -
        +				this.margins.right,
        +			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
        +				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
        +				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
        +				this.helperProportions.height -
        +				this.margins.top -
        +				this.margins.bottom
        +		];
        +		this.relativeContainer = c;
        +	},
        +
        +	_convertPositionTo: function( d, pos ) {
        +
        +		if ( !pos ) {
        +			pos = this.position;
        +		}
        +
        +		var mod = d === "absolute" ? 1 : -1,
        +			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pos.top	+
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top * mod -
        +				( ( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.top :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pos.left +
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left * mod	-
        +				( ( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.left :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
        +			)
        +		};
        +
        +	},
        +
        +	_generatePosition: function( event, constrainPosition ) {
        +
        +		var containment, co, top, left,
        +			o = this.options,
        +			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
        +			pageX = event.pageX,
        +			pageY = event.pageY;
        +
        +		// Cache the scroll
        +		if ( !scrollIsRootNode || !this.offset.scroll ) {
        +			this.offset.scroll = {
        +				top: this.scrollParent.scrollTop(),
        +				left: this.scrollParent.scrollLeft()
        +			};
        +		}
        +
        +		/*
        +		 * - Position constraining -
        +		 * Constrain the position to a mix of grid, containment.
        +		 */
        +
        +		// If we are not dragging yet, we won't check for options
        +		if ( constrainPosition ) {
        +			if ( this.containment ) {
        +				if ( this.relativeContainer ) {
        +					co = this.relativeContainer.offset();
        +					containment = [
        +						this.containment[ 0 ] + co.left,
        +						this.containment[ 1 ] + co.top,
        +						this.containment[ 2 ] + co.left,
        +						this.containment[ 3 ] + co.top
        +					];
        +				} else {
        +					containment = this.containment;
        +				}
        +
        +				if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
        +					pageX = containment[ 0 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
        +					pageY = containment[ 1 ] + this.offset.click.top;
        +				}
        +				if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
        +					pageX = containment[ 2 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
        +					pageY = containment[ 3 ] + this.offset.click.top;
        +				}
        +			}
        +
        +			if ( o.grid ) {
        +
        +				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
        +				// argument errors in IE (see ticket #6950)
        +				top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
        +					this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
        +				pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
        +					top - this.offset.click.top > containment[ 3 ] ) ?
        +						top :
        +						( ( top - this.offset.click.top >= containment[ 1 ] ) ?
        +							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
        +
        +				left = o.grid[ 0 ] ? this.originalPageX +
        +					Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
        +					this.originalPageX;
        +				pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
        +					left - this.offset.click.left > containment[ 2 ] ) ?
        +						left :
        +						( ( left - this.offset.click.left >= containment[ 0 ] ) ?
        +							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
        +			}
        +
        +			if ( o.axis === "y" ) {
        +				pageX = this.originalPageX;
        +			}
        +
        +			if ( o.axis === "x" ) {
        +				pageY = this.originalPageY;
        +			}
        +		}
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pageY -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.top -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top +
        +				( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.top :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pageX -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.left -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left +
        +				( this.cssPosition === "fixed" ?
        +					-this.offset.scroll.left :
        +					( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
        +			)
        +		};
        +
        +	},
        +
        +	_clear: function() {
        +		this._removeClass( this.helper, "ui-draggable-dragging" );
        +		if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
        +			this.helper.remove();
        +		}
        +		this.helper = null;
        +		this.cancelHelperRemoval = false;
        +		if ( this.destroyOnClear ) {
        +			this.destroy();
        +		}
        +	},
        +
        +	// From now on bulk stuff - mainly helpers
        +
        +	_trigger: function( type, event, ui ) {
        +		ui = ui || this._uiHash();
        +		$.ui.plugin.call( this, type, [ event, ui, this ], true );
        +
        +		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
        +		if ( /^(drag|start|stop)/.test( type ) ) {
        +			this.positionAbs = this._convertPositionTo( "absolute" );
        +			ui.offset = this.positionAbs;
        +		}
        +		return $.Widget.prototype._trigger.call( this, type, event, ui );
        +	},
        +
        +	plugins: {},
        +
        +	_uiHash: function() {
        +		return {
        +			helper: this.helper,
        +			position: this.position,
        +			originalPosition: this.originalPosition,
        +			offset: this.positionAbs
        +		};
        +	}
        +
        +} );
        +
        +$.ui.plugin.add( "draggable", "connectToSortable", {
        +	start: function( event, ui, draggable ) {
        +		var uiSortable = $.extend( {}, ui, {
        +			item: draggable.element
        +		} );
        +
        +		draggable.sortables = [];
        +		$( draggable.options.connectToSortable ).each( function() {
        +			var sortable = $( this ).sortable( "instance" );
        +
        +			if ( sortable && !sortable.options.disabled ) {
        +				draggable.sortables.push( sortable );
        +
        +				// RefreshPositions is called at drag start to refresh the containerCache
        +				// which is used in drag. This ensures it's initialized and synchronized
        +				// with any changes that might have happened on the page since initialization.
        +				sortable.refreshPositions();
        +				sortable._trigger( "activate", event, uiSortable );
        +			}
        +		} );
        +	},
        +	stop: function( event, ui, draggable ) {
        +		var uiSortable = $.extend( {}, ui, {
        +			item: draggable.element
        +		} );
        +
        +		draggable.cancelHelperRemoval = false;
        +
        +		$.each( draggable.sortables, function() {
        +			var sortable = this;
        +
        +			if ( sortable.isOver ) {
        +				sortable.isOver = 0;
        +
        +				// Allow this sortable to handle removing the helper
        +				draggable.cancelHelperRemoval = true;
        +				sortable.cancelHelperRemoval = false;
        +
        +				// Use _storedCSS To restore properties in the sortable,
        +				// as this also handles revert (#9675) since the draggable
        +				// may have modified them in unexpected ways (#8809)
        +				sortable._storedCSS = {
        +					position: sortable.placeholder.css( "position" ),
        +					top: sortable.placeholder.css( "top" ),
        +					left: sortable.placeholder.css( "left" )
        +				};
        +
        +				sortable._mouseStop( event );
        +
        +				// Once drag has ended, the sortable should return to using
        +				// its original helper, not the shared helper from draggable
        +				sortable.options.helper = sortable.options._helper;
        +			} else {
        +
        +				// Prevent this Sortable from removing the helper.
        +				// However, don't set the draggable to remove the helper
        +				// either as another connected Sortable may yet handle the removal.
        +				sortable.cancelHelperRemoval = true;
        +
        +				sortable._trigger( "deactivate", event, uiSortable );
        +			}
        +		} );
        +	},
        +	drag: function( event, ui, draggable ) {
        +		$.each( draggable.sortables, function() {
        +			var innermostIntersecting = false,
        +				sortable = this;
        +
        +			// Copy over variables that sortable's _intersectsWith uses
        +			sortable.positionAbs = draggable.positionAbs;
        +			sortable.helperProportions = draggable.helperProportions;
        +			sortable.offset.click = draggable.offset.click;
        +
        +			if ( sortable._intersectsWith( sortable.containerCache ) ) {
        +				innermostIntersecting = true;
        +
        +				$.each( draggable.sortables, function() {
        +
        +					// Copy over variables that sortable's _intersectsWith uses
        +					this.positionAbs = draggable.positionAbs;
        +					this.helperProportions = draggable.helperProportions;
        +					this.offset.click = draggable.offset.click;
        +
        +					if ( this !== sortable &&
        +							this._intersectsWith( this.containerCache ) &&
        +							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
        +						innermostIntersecting = false;
        +					}
        +
        +					return innermostIntersecting;
        +				} );
        +			}
        +
        +			if ( innermostIntersecting ) {
        +
        +				// If it intersects, we use a little isOver variable and set it once,
        +				// so that the move-in stuff gets fired only once.
        +				if ( !sortable.isOver ) {
        +					sortable.isOver = 1;
        +
        +					// Store draggable's parent in case we need to reappend to it later.
        +					draggable._parent = ui.helper.parent();
        +
        +					sortable.currentItem = ui.helper
        +						.appendTo( sortable.element )
        +						.data( "ui-sortable-item", true );
        +
        +					// Store helper option to later restore it
        +					sortable.options._helper = sortable.options.helper;
        +
        +					sortable.options.helper = function() {
        +						return ui.helper[ 0 ];
        +					};
        +
        +					// Fire the start events of the sortable with our passed browser event,
        +					// and our own helper (so it doesn't create a new one)
        +					event.target = sortable.currentItem[ 0 ];
        +					sortable._mouseCapture( event, true );
        +					sortable._mouseStart( event, true, true );
        +
        +					// Because the browser event is way off the new appended portlet,
        +					// modify necessary variables to reflect the changes
        +					sortable.offset.click.top = draggable.offset.click.top;
        +					sortable.offset.click.left = draggable.offset.click.left;
        +					sortable.offset.parent.left -= draggable.offset.parent.left -
        +						sortable.offset.parent.left;
        +					sortable.offset.parent.top -= draggable.offset.parent.top -
        +						sortable.offset.parent.top;
        +
        +					draggable._trigger( "toSortable", event );
        +
        +					// Inform draggable that the helper is in a valid drop zone,
        +					// used solely in the revert option to handle "valid/invalid".
        +					draggable.dropped = sortable.element;
        +
        +					// Need to refreshPositions of all sortables in the case that
        +					// adding to one sortable changes the location of the other sortables (#9675)
        +					$.each( draggable.sortables, function() {
        +						this.refreshPositions();
        +					} );
        +
        +					// Hack so receive/update callbacks work (mostly)
        +					draggable.currentItem = draggable.element;
        +					sortable.fromOutside = draggable;
        +				}
        +
        +				if ( sortable.currentItem ) {
        +					sortable._mouseDrag( event );
        +
        +					// Copy the sortable's position because the draggable's can potentially reflect
        +					// a relative position, while sortable is always absolute, which the dragged
        +					// element has now become. (#8809)
        +					ui.position = sortable.position;
        +				}
        +			} else {
        +
        +				// If it doesn't intersect with the sortable, and it intersected before,
        +				// we fake the drag stop of the sortable, but make sure it doesn't remove
        +				// the helper by using cancelHelperRemoval.
        +				if ( sortable.isOver ) {
        +
        +					sortable.isOver = 0;
        +					sortable.cancelHelperRemoval = true;
        +
        +					// Calling sortable's mouseStop would trigger a revert,
        +					// so revert must be temporarily false until after mouseStop is called.
        +					sortable.options._revert = sortable.options.revert;
        +					sortable.options.revert = false;
        +
        +					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
        +					sortable._mouseStop( event, true );
        +
        +					// Restore sortable behaviors that were modfied
        +					// when the draggable entered the sortable area (#9481)
        +					sortable.options.revert = sortable.options._revert;
        +					sortable.options.helper = sortable.options._helper;
        +
        +					if ( sortable.placeholder ) {
        +						sortable.placeholder.remove();
        +					}
        +
        +					// Restore and recalculate the draggable's offset considering the sortable
        +					// may have modified them in unexpected ways. (#8809, #10669)
        +					ui.helper.appendTo( draggable._parent );
        +					draggable._refreshOffsets( event );
        +					ui.position = draggable._generatePosition( event, true );
        +
        +					draggable._trigger( "fromSortable", event );
        +
        +					// Inform draggable that the helper is no longer in a valid drop zone
        +					draggable.dropped = false;
        +
        +					// Need to refreshPositions of all sortables just in case removing
        +					// from one sortable changes the location of other sortables (#9675)
        +					$.each( draggable.sortables, function() {
        +						this.refreshPositions();
        +					} );
        +				}
        +			}
        +		} );
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "cursor", {
        +	start: function( event, ui, instance ) {
        +		var t = $( "body" ),
        +			o = instance.options;
        +
        +		if ( t.css( "cursor" ) ) {
        +			o._cursor = t.css( "cursor" );
        +		}
        +		t.css( "cursor", o.cursor );
        +	},
        +	stop: function( event, ui, instance ) {
        +		var o = instance.options;
        +		if ( o._cursor ) {
        +			$( "body" ).css( "cursor", o._cursor );
        +		}
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "opacity", {
        +	start: function( event, ui, instance ) {
        +		var t = $( ui.helper ),
        +			o = instance.options;
        +		if ( t.css( "opacity" ) ) {
        +			o._opacity = t.css( "opacity" );
        +		}
        +		t.css( "opacity", o.opacity );
        +	},
        +	stop: function( event, ui, instance ) {
        +		var o = instance.options;
        +		if ( o._opacity ) {
        +			$( ui.helper ).css( "opacity", o._opacity );
        +		}
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "scroll", {
        +	start: function( event, ui, i ) {
        +		if ( !i.scrollParentNotHidden ) {
        +			i.scrollParentNotHidden = i.helper.scrollParent( false );
        +		}
        +
        +		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
        +				i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
        +			i.overflowOffset = i.scrollParentNotHidden.offset();
        +		}
        +	},
        +	drag: function( event, ui, i  ) {
        +
        +		var o = i.options,
        +			scrolled = false,
        +			scrollParent = i.scrollParentNotHidden[ 0 ],
        +			document = i.document[ 0 ];
        +
        +		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
        +			if ( !o.axis || o.axis !== "x" ) {
        +				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
        +						o.scrollSensitivity ) {
        +					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
        +				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
        +					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
        +				}
        +			}
        +
        +			if ( !o.axis || o.axis !== "y" ) {
        +				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
        +						o.scrollSensitivity ) {
        +					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
        +				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
        +					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
        +				}
        +			}
        +
        +		} else {
        +
        +			if ( !o.axis || o.axis !== "x" ) {
        +				if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
        +				} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
        +				}
        +			}
        +
        +			if ( !o.axis || o.axis !== "y" ) {
        +				if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollLeft(
        +						$( document ).scrollLeft() - o.scrollSpeed
        +					);
        +				} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = $( document ).scrollLeft(
        +						$( document ).scrollLeft() + o.scrollSpeed
        +					);
        +				}
        +			}
        +
        +		}
        +
        +		if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
        +			$.ui.ddmanager.prepareOffsets( i, event );
        +		}
        +
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "snap", {
        +	start: function( event, ui, i ) {
        +
        +		var o = i.options;
        +
        +		i.snapElements = [];
        +
        +		$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
        +			.each( function() {
        +				var $t = $( this ),
        +					$o = $t.offset();
        +				if ( this !== i.element[ 0 ] ) {
        +					i.snapElements.push( {
        +						item: this,
        +						width: $t.outerWidth(), height: $t.outerHeight(),
        +						top: $o.top, left: $o.left
        +					} );
        +				}
        +			} );
        +
        +	},
        +	drag: function( event, ui, inst ) {
        +
        +		var ts, bs, ls, rs, l, r, t, b, i, first,
        +			o = inst.options,
        +			d = o.snapTolerance,
        +			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
        +			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
        +
        +		for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
        +
        +			l = inst.snapElements[ i ].left - inst.margins.left;
        +			r = l + inst.snapElements[ i ].width;
        +			t = inst.snapElements[ i ].top - inst.margins.top;
        +			b = t + inst.snapElements[ i ].height;
        +
        +			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
        +					!$.contains( inst.snapElements[ i ].item.ownerDocument,
        +					inst.snapElements[ i ].item ) ) {
        +				if ( inst.snapElements[ i ].snapping ) {
        +					( inst.options.snap.release &&
        +						inst.options.snap.release.call(
        +							inst.element,
        +							event,
        +							$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
        +						) );
        +				}
        +				inst.snapElements[ i ].snapping = false;
        +				continue;
        +			}
        +
        +			if ( o.snapMode !== "inner" ) {
        +				ts = Math.abs( t - y2 ) <= d;
        +				bs = Math.abs( b - y1 ) <= d;
        +				ls = Math.abs( l - x2 ) <= d;
        +				rs = Math.abs( r - x1 ) <= d;
        +				if ( ts ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: t - inst.helperProportions.height,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( bs ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: b,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( ls ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: l - inst.helperProportions.width
        +					} ).left;
        +				}
        +				if ( rs ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: r
        +					} ).left;
        +				}
        +			}
        +
        +			first = ( ts || bs || ls || rs );
        +
        +			if ( o.snapMode !== "outer" ) {
        +				ts = Math.abs( t - y1 ) <= d;
        +				bs = Math.abs( b - y2 ) <= d;
        +				ls = Math.abs( l - x1 ) <= d;
        +				rs = Math.abs( r - x2 ) <= d;
        +				if ( ts ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: t,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( bs ) {
        +					ui.position.top = inst._convertPositionTo( "relative", {
        +						top: b - inst.helperProportions.height,
        +						left: 0
        +					} ).top;
        +				}
        +				if ( ls ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: l
        +					} ).left;
        +				}
        +				if ( rs ) {
        +					ui.position.left = inst._convertPositionTo( "relative", {
        +						top: 0,
        +						left: r - inst.helperProportions.width
        +					} ).left;
        +				}
        +			}
        +
        +			if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
        +				( inst.options.snap.snap &&
        +					inst.options.snap.snap.call(
        +						inst.element,
        +						event,
        +						$.extend( inst._uiHash(), {
        +							snapItem: inst.snapElements[ i ].item
        +						} ) ) );
        +			}
        +			inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
        +
        +		}
        +
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "stack", {
        +	start: function( event, ui, instance ) {
        +		var min,
        +			o = instance.options,
        +			group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
        +				return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
        +					( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
        +			} );
        +
        +		if ( !group.length ) { return; }
        +
        +		min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
        +		$( group ).each( function( i ) {
        +			$( this ).css( "zIndex", min + i );
        +		} );
        +		this.css( "zIndex", ( min + group.length ) );
        +	}
        +} );
        +
        +$.ui.plugin.add( "draggable", "zIndex", {
        +	start: function( event, ui, instance ) {
        +		var t = $( ui.helper ),
        +			o = instance.options;
        +
        +		if ( t.css( "zIndex" ) ) {
        +			o._zIndex = t.css( "zIndex" );
        +		}
        +		t.css( "zIndex", o.zIndex );
        +	},
        +	stop: function( event, ui, instance ) {
        +		var o = instance.options;
        +
        +		if ( o._zIndex ) {
        +			$( ui.helper ).css( "zIndex", o._zIndex );
        +		}
        +	}
        +} );
        +
        +return $.ui.draggable;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/droppable.js b/bower_components/jquery-ui/ui/widgets/droppable.js
        new file mode 100644
        index 0000000000..4b932aea39
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/droppable.js
        @@ -0,0 +1,497 @@
        +/*!
        + * jQuery UI Droppable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Droppable
        +//>>group: Interactions
        +//>>description: Enables drop targets for draggable elements.
        +//>>docs: http://api.jqueryui.com/droppable/
        +//>>demos: http://jqueryui.com/droppable/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./draggable",
        +			"./mouse",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.droppable", {
        +	version: "1.12.1",
        +	widgetEventPrefix: "drop",
        +	options: {
        +		accept: "*",
        +		addClasses: true,
        +		greedy: false,
        +		scope: "default",
        +		tolerance: "intersect",
        +
        +		// Callbacks
        +		activate: null,
        +		deactivate: null,
        +		drop: null,
        +		out: null,
        +		over: null
        +	},
        +	_create: function() {
        +
        +		var proportions,
        +			o = this.options,
        +			accept = o.accept;
        +
        +		this.isover = false;
        +		this.isout = true;
        +
        +		this.accept = $.isFunction( accept ) ? accept : function( d ) {
        +			return d.is( accept );
        +		};
        +
        +		this.proportions = function( /* valueToWrite */ ) {
        +			if ( arguments.length ) {
        +
        +				// Store the droppable's proportions
        +				proportions = arguments[ 0 ];
        +			} else {
        +
        +				// Retrieve or derive the droppable's proportions
        +				return proportions ?
        +					proportions :
        +					proportions = {
        +						width: this.element[ 0 ].offsetWidth,
        +						height: this.element[ 0 ].offsetHeight
        +					};
        +			}
        +		};
        +
        +		this._addToManager( o.scope );
        +
        +		o.addClasses && this._addClass( "ui-droppable" );
        +
        +	},
        +
        +	_addToManager: function( scope ) {
        +
        +		// Add the reference and positions to the manager
        +		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
        +		$.ui.ddmanager.droppables[ scope ].push( this );
        +	},
        +
        +	_splice: function( drop ) {
        +		var i = 0;
        +		for ( ; i < drop.length; i++ ) {
        +			if ( drop[ i ] === this ) {
        +				drop.splice( i, 1 );
        +			}
        +		}
        +	},
        +
        +	_destroy: function() {
        +		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        +
        +		this._splice( drop );
        +	},
        +
        +	_setOption: function( key, value ) {
        +
        +		if ( key === "accept" ) {
        +			this.accept = $.isFunction( value ) ? value : function( d ) {
        +				return d.is( value );
        +			};
        +		} else if ( key === "scope" ) {
        +			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        +
        +			this._splice( drop );
        +			this._addToManager( value );
        +		}
        +
        +		this._super( key, value );
        +	},
        +
        +	_activate: function( event ) {
        +		var draggable = $.ui.ddmanager.current;
        +
        +		this._addActiveClass();
        +		if ( draggable ) {
        +			this._trigger( "activate", event, this.ui( draggable ) );
        +		}
        +	},
        +
        +	_deactivate: function( event ) {
        +		var draggable = $.ui.ddmanager.current;
        +
        +		this._removeActiveClass();
        +		if ( draggable ) {
        +			this._trigger( "deactivate", event, this.ui( draggable ) );
        +		}
        +	},
        +
        +	_over: function( event ) {
        +
        +		var draggable = $.ui.ddmanager.current;
        +
        +		// Bail if draggable and droppable are same element
        +		if ( !draggable || ( draggable.currentItem ||
        +				draggable.element )[ 0 ] === this.element[ 0 ] ) {
        +			return;
        +		}
        +
        +		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
        +				draggable.element ) ) ) {
        +			this._addHoverClass();
        +			this._trigger( "over", event, this.ui( draggable ) );
        +		}
        +
        +	},
        +
        +	_out: function( event ) {
        +
        +		var draggable = $.ui.ddmanager.current;
        +
        +		// Bail if draggable and droppable are same element
        +		if ( !draggable || ( draggable.currentItem ||
        +				draggable.element )[ 0 ] === this.element[ 0 ] ) {
        +			return;
        +		}
        +
        +		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
        +				draggable.element ) ) ) {
        +			this._removeHoverClass();
        +			this._trigger( "out", event, this.ui( draggable ) );
        +		}
        +
        +	},
        +
        +	_drop: function( event, custom ) {
        +
        +		var draggable = custom || $.ui.ddmanager.current,
        +			childrenIntersection = false;
        +
        +		// Bail if draggable and droppable are same element
        +		if ( !draggable || ( draggable.currentItem ||
        +				draggable.element )[ 0 ] === this.element[ 0 ] ) {
        +			return false;
        +		}
        +
        +		this.element
        +			.find( ":data(ui-droppable)" )
        +			.not( ".ui-draggable-dragging" )
        +			.each( function() {
        +				var inst = $( this ).droppable( "instance" );
        +				if (
        +					inst.options.greedy &&
        +					!inst.options.disabled &&
        +					inst.options.scope === draggable.options.scope &&
        +					inst.accept.call(
        +						inst.element[ 0 ], ( draggable.currentItem || draggable.element )
        +					) &&
        +					intersect(
        +						draggable,
        +						$.extend( inst, { offset: inst.element.offset() } ),
        +						inst.options.tolerance, event
        +					)
        +				) {
        +					childrenIntersection = true;
        +					return false; }
        +			} );
        +		if ( childrenIntersection ) {
        +			return false;
        +		}
        +
        +		if ( this.accept.call( this.element[ 0 ],
        +				( draggable.currentItem || draggable.element ) ) ) {
        +			this._removeActiveClass();
        +			this._removeHoverClass();
        +
        +			this._trigger( "drop", event, this.ui( draggable ) );
        +			return this.element;
        +		}
        +
        +		return false;
        +
        +	},
        +
        +	ui: function( c ) {
        +		return {
        +			draggable: ( c.currentItem || c.element ),
        +			helper: c.helper,
        +			position: c.position,
        +			offset: c.positionAbs
        +		};
        +	},
        +
        +	// Extension points just to make backcompat sane and avoid duplicating logic
        +	// TODO: Remove in 1.13 along with call to it below
        +	_addHoverClass: function() {
        +		this._addClass( "ui-droppable-hover" );
        +	},
        +
        +	_removeHoverClass: function() {
        +		this._removeClass( "ui-droppable-hover" );
        +	},
        +
        +	_addActiveClass: function() {
        +		this._addClass( "ui-droppable-active" );
        +	},
        +
        +	_removeActiveClass: function() {
        +		this._removeClass( "ui-droppable-active" );
        +	}
        +} );
        +
        +var intersect = $.ui.intersect = ( function() {
        +	function isOverAxis( x, reference, size ) {
        +		return ( x >= reference ) && ( x < ( reference + size ) );
        +	}
        +
        +	return function( draggable, droppable, toleranceMode, event ) {
        +
        +		if ( !droppable.offset ) {
        +			return false;
        +		}
        +
        +		var x1 = ( draggable.positionAbs ||
        +				draggable.position.absolute ).left + draggable.margins.left,
        +			y1 = ( draggable.positionAbs ||
        +				draggable.position.absolute ).top + draggable.margins.top,
        +			x2 = x1 + draggable.helperProportions.width,
        +			y2 = y1 + draggable.helperProportions.height,
        +			l = droppable.offset.left,
        +			t = droppable.offset.top,
        +			r = l + droppable.proportions().width,
        +			b = t + droppable.proportions().height;
        +
        +		switch ( toleranceMode ) {
        +		case "fit":
        +			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
        +		case "intersect":
        +			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
        +				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
        +				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
        +				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
        +		case "pointer":
        +			return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
        +				isOverAxis( event.pageX, l, droppable.proportions().width );
        +		case "touch":
        +			return (
        +				( y1 >= t && y1 <= b ) || // Top edge touching
        +				( y2 >= t && y2 <= b ) || // Bottom edge touching
        +				( y1 < t && y2 > b ) // Surrounded vertically
        +			) && (
        +				( x1 >= l && x1 <= r ) || // Left edge touching
        +				( x2 >= l && x2 <= r ) || // Right edge touching
        +				( x1 < l && x2 > r ) // Surrounded horizontally
        +			);
        +		default:
        +			return false;
        +		}
        +	};
        +} )();
        +
        +/*
        +	This manager tracks offsets of draggables and droppables
        +*/
        +$.ui.ddmanager = {
        +	current: null,
        +	droppables: { "default": [] },
        +	prepareOffsets: function( t, event ) {
        +
        +		var i, j,
        +			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
        +			type = event ? event.type : null, // workaround for #2317
        +			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
        +
        +		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
        +
        +			// No disabled and non-accepted
        +			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
        +					( t.currentItem || t.element ) ) ) ) {
        +				continue;
        +			}
        +
        +			// Filter out elements in the current dragged item
        +			for ( j = 0; j < list.length; j++ ) {
        +				if ( list[ j ] === m[ i ].element[ 0 ] ) {
        +					m[ i ].proportions().height = 0;
        +					continue droppablesLoop;
        +				}
        +			}
        +
        +			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
        +			if ( !m[ i ].visible ) {
        +				continue;
        +			}
        +
        +			// Activate the droppable if used directly from draggables
        +			if ( type === "mousedown" ) {
        +				m[ i ]._activate.call( m[ i ], event );
        +			}
        +
        +			m[ i ].offset = m[ i ].element.offset();
        +			m[ i ].proportions( {
        +				width: m[ i ].element[ 0 ].offsetWidth,
        +				height: m[ i ].element[ 0 ].offsetHeight
        +			} );
        +
        +		}
        +
        +	},
        +	drop: function( draggable, event ) {
        +
        +		var dropped = false;
        +
        +		// Create a copy of the droppables in case the list changes during the drop (#9116)
        +		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
        +
        +			if ( !this.options ) {
        +				return;
        +			}
        +			if ( !this.options.disabled && this.visible &&
        +					intersect( draggable, this, this.options.tolerance, event ) ) {
        +				dropped = this._drop.call( this, event ) || dropped;
        +			}
        +
        +			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
        +					( draggable.currentItem || draggable.element ) ) ) {
        +				this.isout = true;
        +				this.isover = false;
        +				this._deactivate.call( this, event );
        +			}
        +
        +		} );
        +		return dropped;
        +
        +	},
        +	dragStart: function( draggable, event ) {
        +
        +		// Listen for scrolling so that if the dragging causes scrolling the position of the
        +		// droppables can be recalculated (see #5003)
        +		draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
        +			if ( !draggable.options.refreshPositions ) {
        +				$.ui.ddmanager.prepareOffsets( draggable, event );
        +			}
        +		} );
        +	},
        +	drag: function( draggable, event ) {
        +
        +		// If you have a highly dynamic page, you might try this option. It renders positions
        +		// every time you move the mouse.
        +		if ( draggable.options.refreshPositions ) {
        +			$.ui.ddmanager.prepareOffsets( draggable, event );
        +		}
        +
        +		// Run through all droppables and check their positions based on specific tolerance options
        +		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
        +
        +			if ( this.options.disabled || this.greedyChild || !this.visible ) {
        +				return;
        +			}
        +
        +			var parentInstance, scope, parent,
        +				intersects = intersect( draggable, this, this.options.tolerance, event ),
        +				c = !intersects && this.isover ?
        +					"isout" :
        +					( intersects && !this.isover ? "isover" : null );
        +			if ( !c ) {
        +				return;
        +			}
        +
        +			if ( this.options.greedy ) {
        +
        +				// find droppable parents with same scope
        +				scope = this.options.scope;
        +				parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
        +					return $( this ).droppable( "instance" ).options.scope === scope;
        +				} );
        +
        +				if ( parent.length ) {
        +					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
        +					parentInstance.greedyChild = ( c === "isover" );
        +				}
        +			}
        +
        +			// We just moved into a greedy child
        +			if ( parentInstance && c === "isover" ) {
        +				parentInstance.isover = false;
        +				parentInstance.isout = true;
        +				parentInstance._out.call( parentInstance, event );
        +			}
        +
        +			this[ c ] = true;
        +			this[ c === "isout" ? "isover" : "isout" ] = false;
        +			this[ c === "isover" ? "_over" : "_out" ].call( this, event );
        +
        +			// We just moved out of a greedy child
        +			if ( parentInstance && c === "isout" ) {
        +				parentInstance.isout = false;
        +				parentInstance.isover = true;
        +				parentInstance._over.call( parentInstance, event );
        +			}
        +		} );
        +
        +	},
        +	dragStop: function( draggable, event ) {
        +		draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
        +
        +		// Call prepareOffsets one final time since IE does not fire return scroll events when
        +		// overflow was caused by drag (see #5003)
        +		if ( !draggable.options.refreshPositions ) {
        +			$.ui.ddmanager.prepareOffsets( draggable, event );
        +		}
        +	}
        +};
        +
        +// DEPRECATED
        +// TODO: switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for activeClass and hoverClass options
        +	$.widget( "ui.droppable", $.ui.droppable, {
        +		options: {
        +			hoverClass: false,
        +			activeClass: false
        +		},
        +		_addActiveClass: function() {
        +			this._super();
        +			if ( this.options.activeClass ) {
        +				this.element.addClass( this.options.activeClass );
        +			}
        +		},
        +		_removeActiveClass: function() {
        +			this._super();
        +			if ( this.options.activeClass ) {
        +				this.element.removeClass( this.options.activeClass );
        +			}
        +		},
        +		_addHoverClass: function() {
        +			this._super();
        +			if ( this.options.hoverClass ) {
        +				this.element.addClass( this.options.hoverClass );
        +			}
        +		},
        +		_removeHoverClass: function() {
        +			this._super();
        +			if ( this.options.hoverClass ) {
        +				this.element.removeClass( this.options.hoverClass );
        +			}
        +		}
        +	} );
        +}
        +
        +return $.ui.droppable;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/menu.js b/bower_components/jquery-ui/ui/widgets/menu.js
        new file mode 100644
        index 0000000000..fd86527f77
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/menu.js
        @@ -0,0 +1,673 @@
        +/*!
        + * jQuery UI Menu 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Menu
        +//>>group: Widgets
        +//>>description: Creates nestable menus.
        +//>>docs: http://api.jqueryui.com/menu/
        +//>>demos: http://jqueryui.com/menu/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/menu.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../keycode",
        +			"../position",
        +			"../safe-active-element",
        +			"../unique-id",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.widget( "ui.menu", {
        +	version: "1.12.1",
        +	defaultElement: "<ul>",
        +	delay: 300,
        +	options: {
        +		icons: {
        +			submenu: "ui-icon-caret-1-e"
        +		},
        +		items: "> *",
        +		menus: "ul",
        +		position: {
        +			my: "left top",
        +			at: "right top"
        +		},
        +		role: "menu",
        +
        +		// Callbacks
        +		blur: null,
        +		focus: null,
        +		select: null
        +	},
        +
        +	_create: function() {
        +		this.activeMenu = this.element;
        +
        +		// Flag used to prevent firing of the click handler
        +		// as the event bubbles up through nested menus
        +		this.mouseHandled = false;
        +		this.element
        +			.uniqueId()
        +			.attr( {
        +				role: this.options.role,
        +				tabIndex: 0
        +			} );
        +
        +		this._addClass( "ui-menu", "ui-widget ui-widget-content" );
        +		this._on( {
        +
        +			// Prevent focus from sticking to links inside menu after clicking
        +			// them (focus should always stay on UL during navigation).
        +			"mousedown .ui-menu-item": function( event ) {
        +				event.preventDefault();
        +			},
        +			"click .ui-menu-item": function( event ) {
        +				var target = $( event.target );
        +				var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
        +				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
        +					this.select( event );
        +
        +					// Only set the mouseHandled flag if the event will bubble, see #9469.
        +					if ( !event.isPropagationStopped() ) {
        +						this.mouseHandled = true;
        +					}
        +
        +					// Open submenu on click
        +					if ( target.has( ".ui-menu" ).length ) {
        +						this.expand( event );
        +					} else if ( !this.element.is( ":focus" ) &&
        +							active.closest( ".ui-menu" ).length ) {
        +
        +						// Redirect focus to the menu
        +						this.element.trigger( "focus", [ true ] );
        +
        +						// If the active item is on the top level, let it stay active.
        +						// Otherwise, blur the active item since it is no longer visible.
        +						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
        +							clearTimeout( this.timer );
        +						}
        +					}
        +				}
        +			},
        +			"mouseenter .ui-menu-item": function( event ) {
        +
        +				// Ignore mouse events while typeahead is active, see #10458.
        +				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
        +				// is over an item in the menu
        +				if ( this.previousFilter ) {
        +					return;
        +				}
        +
        +				var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
        +					target = $( event.currentTarget );
        +
        +				// Ignore bubbled events on parent items, see #11641
        +				if ( actualTarget[ 0 ] !== target[ 0 ] ) {
        +					return;
        +				}
        +
        +				// Remove ui-state-active class from siblings of the newly focused menu item
        +				// to avoid a jump caused by adjacent elements both having a class with a border
        +				this._removeClass( target.siblings().children( ".ui-state-active" ),
        +					null, "ui-state-active" );
        +				this.focus( event, target );
        +			},
        +			mouseleave: "collapseAll",
        +			"mouseleave .ui-menu": "collapseAll",
        +			focus: function( event, keepActiveItem ) {
        +
        +				// If there's already an active item, keep it active
        +				// If not, activate the first item
        +				var item = this.active || this.element.find( this.options.items ).eq( 0 );
        +
        +				if ( !keepActiveItem ) {
        +					this.focus( event, item );
        +				}
        +			},
        +			blur: function( event ) {
        +				this._delay( function() {
        +					var notContained = !$.contains(
        +						this.element[ 0 ],
        +						$.ui.safeActiveElement( this.document[ 0 ] )
        +					);
        +					if ( notContained ) {
        +						this.collapseAll( event );
        +					}
        +				} );
        +			},
        +			keydown: "_keydown"
        +		} );
        +
        +		this.refresh();
        +
        +		// Clicks outside of a menu collapse any open menus
        +		this._on( this.document, {
        +			click: function( event ) {
        +				if ( this._closeOnDocumentClick( event ) ) {
        +					this.collapseAll( event );
        +				}
        +
        +				// Reset the mouseHandled flag
        +				this.mouseHandled = false;
        +			}
        +		} );
        +	},
        +
        +	_destroy: function() {
        +		var items = this.element.find( ".ui-menu-item" )
        +				.removeAttr( "role aria-disabled" ),
        +			submenus = items.children( ".ui-menu-item-wrapper" )
        +				.removeUniqueId()
        +				.removeAttr( "tabIndex role aria-haspopup" );
        +
        +		// Destroy (sub)menus
        +		this.element
        +			.removeAttr( "aria-activedescendant" )
        +			.find( ".ui-menu" ).addBack()
        +				.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
        +					"tabIndex" )
        +				.removeUniqueId()
        +				.show();
        +
        +		submenus.children().each( function() {
        +			var elem = $( this );
        +			if ( elem.data( "ui-menu-submenu-caret" ) ) {
        +				elem.remove();
        +			}
        +		} );
        +	},
        +
        +	_keydown: function( event ) {
        +		var match, prev, character, skip,
        +			preventDefault = true;
        +
        +		switch ( event.keyCode ) {
        +		case $.ui.keyCode.PAGE_UP:
        +			this.previousPage( event );
        +			break;
        +		case $.ui.keyCode.PAGE_DOWN:
        +			this.nextPage( event );
        +			break;
        +		case $.ui.keyCode.HOME:
        +			this._move( "first", "first", event );
        +			break;
        +		case $.ui.keyCode.END:
        +			this._move( "last", "last", event );
        +			break;
        +		case $.ui.keyCode.UP:
        +			this.previous( event );
        +			break;
        +		case $.ui.keyCode.DOWN:
        +			this.next( event );
        +			break;
        +		case $.ui.keyCode.LEFT:
        +			this.collapse( event );
        +			break;
        +		case $.ui.keyCode.RIGHT:
        +			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
        +				this.expand( event );
        +			}
        +			break;
        +		case $.ui.keyCode.ENTER:
        +		case $.ui.keyCode.SPACE:
        +			this._activate( event );
        +			break;
        +		case $.ui.keyCode.ESCAPE:
        +			this.collapse( event );
        +			break;
        +		default:
        +			preventDefault = false;
        +			prev = this.previousFilter || "";
        +			skip = false;
        +
        +			// Support number pad values
        +			character = event.keyCode >= 96 && event.keyCode <= 105 ?
        +				( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
        +
        +			clearTimeout( this.filterTimer );
        +
        +			if ( character === prev ) {
        +				skip = true;
        +			} else {
        +				character = prev + character;
        +			}
        +
        +			match = this._filterMenuItems( character );
        +			match = skip && match.index( this.active.next() ) !== -1 ?
        +				this.active.nextAll( ".ui-menu-item" ) :
        +				match;
        +
        +			// If no matches on the current filter, reset to the last character pressed
        +			// to move down the menu to the first item that starts with that character
        +			if ( !match.length ) {
        +				character = String.fromCharCode( event.keyCode );
        +				match = this._filterMenuItems( character );
        +			}
        +
        +			if ( match.length ) {
        +				this.focus( event, match );
        +				this.previousFilter = character;
        +				this.filterTimer = this._delay( function() {
        +					delete this.previousFilter;
        +				}, 1000 );
        +			} else {
        +				delete this.previousFilter;
        +			}
        +		}
        +
        +		if ( preventDefault ) {
        +			event.preventDefault();
        +		}
        +	},
        +
        +	_activate: function( event ) {
        +		if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
        +			if ( this.active.children( "[aria-haspopup='true']" ).length ) {
        +				this.expand( event );
        +			} else {
        +				this.select( event );
        +			}
        +		}
        +	},
        +
        +	refresh: function() {
        +		var menus, items, newSubmenus, newItems, newWrappers,
        +			that = this,
        +			icon = this.options.icons.submenu,
        +			submenus = this.element.find( this.options.menus );
        +
        +		this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
        +
        +		// Initialize nested menus
        +		newSubmenus = submenus.filter( ":not(.ui-menu)" )
        +			.hide()
        +			.attr( {
        +				role: this.options.role,
        +				"aria-hidden": "true",
        +				"aria-expanded": "false"
        +			} )
        +			.each( function() {
        +				var menu = $( this ),
        +					item = menu.prev(),
        +					submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
        +
        +				that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
        +				item
        +					.attr( "aria-haspopup", "true" )
        +					.prepend( submenuCaret );
        +				menu.attr( "aria-labelledby", item.attr( "id" ) );
        +			} );
        +
        +		this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
        +
        +		menus = submenus.add( this.element );
        +		items = menus.find( this.options.items );
        +
        +		// Initialize menu-items containing spaces and/or dashes only as dividers
        +		items.not( ".ui-menu-item" ).each( function() {
        +			var item = $( this );
        +			if ( that._isDivider( item ) ) {
        +				that._addClass( item, "ui-menu-divider", "ui-widget-content" );
        +			}
        +		} );
        +
        +		// Don't refresh list items that are already adapted
        +		newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
        +		newWrappers = newItems.children()
        +			.not( ".ui-menu" )
        +				.uniqueId()
        +				.attr( {
        +					tabIndex: -1,
        +					role: this._itemRole()
        +				} );
        +		this._addClass( newItems, "ui-menu-item" )
        +			._addClass( newWrappers, "ui-menu-item-wrapper" );
        +
        +		// Add aria-disabled attribute to any disabled menu item
        +		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
        +
        +		// If the active item has been removed, blur the menu
        +		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        +			this.blur();
        +		}
        +	},
        +
        +	_itemRole: function() {
        +		return {
        +			menu: "menuitem",
        +			listbox: "option"
        +		}[ this.options.role ];
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "icons" ) {
        +			var icons = this.element.find( ".ui-menu-icon" );
        +			this._removeClass( icons, null, this.options.icons.submenu )
        +				._addClass( icons, null, value.submenu );
        +		}
        +		this._super( key, value );
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.element.attr( "aria-disabled", String( value ) );
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +	},
        +
        +	focus: function( event, item ) {
        +		var nested, focused, activeParent;
        +		this.blur( event, event && event.type === "focus" );
        +
        +		this._scrollIntoView( item );
        +
        +		this.active = item.first();
        +
        +		focused = this.active.children( ".ui-menu-item-wrapper" );
        +		this._addClass( focused, null, "ui-state-active" );
        +
        +		// Only update aria-activedescendant if there's a role
        +		// otherwise we assume focus is managed elsewhere
        +		if ( this.options.role ) {
        +			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
        +		}
        +
        +		// Highlight active parent menu item, if any
        +		activeParent = this.active
        +			.parent()
        +				.closest( ".ui-menu-item" )
        +					.children( ".ui-menu-item-wrapper" );
        +		this._addClass( activeParent, null, "ui-state-active" );
        +
        +		if ( event && event.type === "keydown" ) {
        +			this._close();
        +		} else {
        +			this.timer = this._delay( function() {
        +				this._close();
        +			}, this.delay );
        +		}
        +
        +		nested = item.children( ".ui-menu" );
        +		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
        +			this._startOpening( nested );
        +		}
        +		this.activeMenu = item.parent();
        +
        +		this._trigger( "focus", event, { item: item } );
        +	},
        +
        +	_scrollIntoView: function( item ) {
        +		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
        +		if ( this._hasScroll() ) {
        +			borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
        +			paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
        +			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
        +			scroll = this.activeMenu.scrollTop();
        +			elementHeight = this.activeMenu.height();
        +			itemHeight = item.outerHeight();
        +
        +			if ( offset < 0 ) {
        +				this.activeMenu.scrollTop( scroll + offset );
        +			} else if ( offset + itemHeight > elementHeight ) {
        +				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
        +			}
        +		}
        +	},
        +
        +	blur: function( event, fromFocus ) {
        +		if ( !fromFocus ) {
        +			clearTimeout( this.timer );
        +		}
        +
        +		if ( !this.active ) {
        +			return;
        +		}
        +
        +		this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
        +			null, "ui-state-active" );
        +
        +		this._trigger( "blur", event, { item: this.active } );
        +		this.active = null;
        +	},
        +
        +	_startOpening: function( submenu ) {
        +		clearTimeout( this.timer );
        +
        +		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
        +		// shift in the submenu position when mousing over the caret icon
        +		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
        +			return;
        +		}
        +
        +		this.timer = this._delay( function() {
        +			this._close();
        +			this._open( submenu );
        +		}, this.delay );
        +	},
        +
        +	_open: function( submenu ) {
        +		var position = $.extend( {
        +			of: this.active
        +		}, this.options.position );
        +
        +		clearTimeout( this.timer );
        +		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
        +			.hide()
        +			.attr( "aria-hidden", "true" );
        +
        +		submenu
        +			.show()
        +			.removeAttr( "aria-hidden" )
        +			.attr( "aria-expanded", "true" )
        +			.position( position );
        +	},
        +
        +	collapseAll: function( event, all ) {
        +		clearTimeout( this.timer );
        +		this.timer = this._delay( function() {
        +
        +			// If we were passed an event, look for the submenu that contains the event
        +			var currentMenu = all ? this.element :
        +				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
        +
        +			// If we found no valid submenu ancestor, use the main menu to close all
        +			// sub menus anyway
        +			if ( !currentMenu.length ) {
        +				currentMenu = this.element;
        +			}
        +
        +			this._close( currentMenu );
        +
        +			this.blur( event );
        +
        +			// Work around active item staying active after menu is blurred
        +			this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
        +
        +			this.activeMenu = currentMenu;
        +		}, this.delay );
        +	},
        +
        +	// With no arguments, closes the currently active menu - if nothing is active
        +	// it closes all menus.  If passed an argument, it will search for menus BELOW
        +	_close: function( startMenu ) {
        +		if ( !startMenu ) {
        +			startMenu = this.active ? this.active.parent() : this.element;
        +		}
        +
        +		startMenu.find( ".ui-menu" )
        +			.hide()
        +			.attr( "aria-hidden", "true" )
        +			.attr( "aria-expanded", "false" );
        +	},
        +
        +	_closeOnDocumentClick: function( event ) {
        +		return !$( event.target ).closest( ".ui-menu" ).length;
        +	},
        +
        +	_isDivider: function( item ) {
        +
        +		// Match hyphen, em dash, en dash
        +		return !/[^\-\u2014\u2013\s]/.test( item.text() );
        +	},
        +
        +	collapse: function( event ) {
        +		var newItem = this.active &&
        +			this.active.parent().closest( ".ui-menu-item", this.element );
        +		if ( newItem && newItem.length ) {
        +			this._close();
        +			this.focus( event, newItem );
        +		}
        +	},
        +
        +	expand: function( event ) {
        +		var newItem = this.active &&
        +			this.active
        +				.children( ".ui-menu " )
        +					.find( this.options.items )
        +						.first();
        +
        +		if ( newItem && newItem.length ) {
        +			this._open( newItem.parent() );
        +
        +			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
        +			this._delay( function() {
        +				this.focus( event, newItem );
        +			} );
        +		}
        +	},
        +
        +	next: function( event ) {
        +		this._move( "next", "first", event );
        +	},
        +
        +	previous: function( event ) {
        +		this._move( "prev", "last", event );
        +	},
        +
        +	isFirstItem: function() {
        +		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
        +	},
        +
        +	isLastItem: function() {
        +		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
        +	},
        +
        +	_move: function( direction, filter, event ) {
        +		var next;
        +		if ( this.active ) {
        +			if ( direction === "first" || direction === "last" ) {
        +				next = this.active
        +					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
        +					.eq( -1 );
        +			} else {
        +				next = this.active
        +					[ direction + "All" ]( ".ui-menu-item" )
        +					.eq( 0 );
        +			}
        +		}
        +		if ( !next || !next.length || !this.active ) {
        +			next = this.activeMenu.find( this.options.items )[ filter ]();
        +		}
        +
        +		this.focus( event, next );
        +	},
        +
        +	nextPage: function( event ) {
        +		var item, base, height;
        +
        +		if ( !this.active ) {
        +			this.next( event );
        +			return;
        +		}
        +		if ( this.isLastItem() ) {
        +			return;
        +		}
        +		if ( this._hasScroll() ) {
        +			base = this.active.offset().top;
        +			height = this.element.height();
        +			this.active.nextAll( ".ui-menu-item" ).each( function() {
        +				item = $( this );
        +				return item.offset().top - base - height < 0;
        +			} );
        +
        +			this.focus( event, item );
        +		} else {
        +			this.focus( event, this.activeMenu.find( this.options.items )
        +				[ !this.active ? "first" : "last" ]() );
        +		}
        +	},
        +
        +	previousPage: function( event ) {
        +		var item, base, height;
        +		if ( !this.active ) {
        +			this.next( event );
        +			return;
        +		}
        +		if ( this.isFirstItem() ) {
        +			return;
        +		}
        +		if ( this._hasScroll() ) {
        +			base = this.active.offset().top;
        +			height = this.element.height();
        +			this.active.prevAll( ".ui-menu-item" ).each( function() {
        +				item = $( this );
        +				return item.offset().top - base + height > 0;
        +			} );
        +
        +			this.focus( event, item );
        +		} else {
        +			this.focus( event, this.activeMenu.find( this.options.items ).first() );
        +		}
        +	},
        +
        +	_hasScroll: function() {
        +		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
        +	},
        +
        +	select: function( event ) {
        +
        +		// TODO: It should never be possible to not have an active item at this
        +		// point, but the tests don't trigger mouseenter before click.
        +		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
        +		var ui = { item: this.active };
        +		if ( !this.active.has( ".ui-menu" ).length ) {
        +			this.collapseAll( event, true );
        +		}
        +		this._trigger( "select", event, ui );
        +	},
        +
        +	_filterMenuItems: function( character ) {
        +		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
        +			regex = new RegExp( "^" + escapedCharacter, "i" );
        +
        +		return this.activeMenu
        +			.find( this.options.items )
        +
        +				// Only match on items, not dividers or other content (#10571)
        +				.filter( ".ui-menu-item" )
        +					.filter( function() {
        +						return regex.test(
        +							$.trim( $( this ).children( ".ui-menu-item-wrapper" ).text() ) );
        +					} );
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/mouse.js b/bower_components/jquery-ui/ui/widgets/mouse.js
        new file mode 100644
        index 0000000000..11a201aa28
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/mouse.js
        @@ -0,0 +1,226 @@
        +/*!
        + * jQuery UI Mouse 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Mouse
        +//>>group: Widgets
        +//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
        +//>>docs: http://api.jqueryui.com/mouse/
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../ie",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +var mouseHandled = false;
        +$( document ).on( "mouseup", function() {
        +	mouseHandled = false;
        +} );
        +
        +return $.widget( "ui.mouse", {
        +	version: "1.12.1",
        +	options: {
        +		cancel: "input, textarea, button, select, option",
        +		distance: 1,
        +		delay: 0
        +	},
        +	_mouseInit: function() {
        +		var that = this;
        +
        +		this.element
        +			.on( "mousedown." + this.widgetName, function( event ) {
        +				return that._mouseDown( event );
        +			} )
        +			.on( "click." + this.widgetName, function( event ) {
        +				if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
        +					$.removeData( event.target, that.widgetName + ".preventClickEvent" );
        +					event.stopImmediatePropagation();
        +					return false;
        +				}
        +			} );
        +
        +		this.started = false;
        +	},
        +
        +	// TODO: make sure destroying one instance of mouse doesn't mess with
        +	// other instances of mouse
        +	_mouseDestroy: function() {
        +		this.element.off( "." + this.widgetName );
        +		if ( this._mouseMoveDelegate ) {
        +			this.document
        +				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        +				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
        +		}
        +	},
        +
        +	_mouseDown: function( event ) {
        +
        +		// don't let more than one widget handle mouseStart
        +		if ( mouseHandled ) {
        +			return;
        +		}
        +
        +		this._mouseMoved = false;
        +
        +		// We may have missed mouseup (out of window)
        +		( this._mouseStarted && this._mouseUp( event ) );
        +
        +		this._mouseDownEvent = event;
        +
        +		var that = this,
        +			btnIsLeft = ( event.which === 1 ),
        +
        +			// event.target.nodeName works around a bug in IE 8 with
        +			// disabled inputs (#7620)
        +			elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
        +				$( event.target ).closest( this.options.cancel ).length : false );
        +		if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
        +			return true;
        +		}
        +
        +		this.mouseDelayMet = !this.options.delay;
        +		if ( !this.mouseDelayMet ) {
        +			this._mouseDelayTimer = setTimeout( function() {
        +				that.mouseDelayMet = true;
        +			}, this.options.delay );
        +		}
        +
        +		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
        +			this._mouseStarted = ( this._mouseStart( event ) !== false );
        +			if ( !this._mouseStarted ) {
        +				event.preventDefault();
        +				return true;
        +			}
        +		}
        +
        +		// Click event may never have fired (Gecko & Opera)
        +		if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
        +			$.removeData( event.target, this.widgetName + ".preventClickEvent" );
        +		}
        +
        +		// These delegates are required to keep context
        +		this._mouseMoveDelegate = function( event ) {
        +			return that._mouseMove( event );
        +		};
        +		this._mouseUpDelegate = function( event ) {
        +			return that._mouseUp( event );
        +		};
        +
        +		this.document
        +			.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        +			.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
        +
        +		event.preventDefault();
        +
        +		mouseHandled = true;
        +		return true;
        +	},
        +
        +	_mouseMove: function( event ) {
        +
        +		// Only check for mouseups outside the document if you've moved inside the document
        +		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
        +		// fire a mousemove event if content is placed under the cursor. See #7778
        +		// Support: IE <9
        +		if ( this._mouseMoved ) {
        +
        +			// IE mouseup check - mouseup happened when mouse was out of window
        +			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
        +					!event.button ) {
        +				return this._mouseUp( event );
        +
        +			// Iframe mouseup check - mouseup occurred in another document
        +			} else if ( !event.which ) {
        +
        +				// Support: Safari <=8 - 9
        +				// Safari sets which to 0 if you press any of the following keys
        +				// during a drag (#14461)
        +				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
        +						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
        +					this.ignoreMissingWhich = true;
        +				} else if ( !this.ignoreMissingWhich ) {
        +					return this._mouseUp( event );
        +				}
        +			}
        +		}
        +
        +		if ( event.which || event.button ) {
        +			this._mouseMoved = true;
        +		}
        +
        +		if ( this._mouseStarted ) {
        +			this._mouseDrag( event );
        +			return event.preventDefault();
        +		}
        +
        +		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
        +			this._mouseStarted =
        +				( this._mouseStart( this._mouseDownEvent, event ) !== false );
        +			( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
        +		}
        +
        +		return !this._mouseStarted;
        +	},
        +
        +	_mouseUp: function( event ) {
        +		this.document
        +			.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        +			.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
        +
        +		if ( this._mouseStarted ) {
        +			this._mouseStarted = false;
        +
        +			if ( event.target === this._mouseDownEvent.target ) {
        +				$.data( event.target, this.widgetName + ".preventClickEvent", true );
        +			}
        +
        +			this._mouseStop( event );
        +		}
        +
        +		if ( this._mouseDelayTimer ) {
        +			clearTimeout( this._mouseDelayTimer );
        +			delete this._mouseDelayTimer;
        +		}
        +
        +		this.ignoreMissingWhich = false;
        +		mouseHandled = false;
        +		event.preventDefault();
        +	},
        +
        +	_mouseDistanceMet: function( event ) {
        +		return ( Math.max(
        +				Math.abs( this._mouseDownEvent.pageX - event.pageX ),
        +				Math.abs( this._mouseDownEvent.pageY - event.pageY )
        +			) >= this.options.distance
        +		);
        +	},
        +
        +	_mouseDelayMet: function( /* event */ ) {
        +		return this.mouseDelayMet;
        +	},
        +
        +	// These are placeholder methods, to be overriden by extending plugin
        +	_mouseStart: function( /* event */ ) {},
        +	_mouseDrag: function( /* event */ ) {},
        +	_mouseStop: function( /* event */ ) {},
        +	_mouseCapture: function( /* event */ ) { return true; }
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/progressbar.js b/bower_components/jquery-ui/ui/widgets/progressbar.js
        new file mode 100644
        index 0000000000..89beb58704
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/progressbar.js
        @@ -0,0 +1,178 @@
        +/*!
        + * jQuery UI Progressbar 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Progressbar
        +//>>group: Widgets
        +// jscs:disable maximumLineLength
        +//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/progressbar/
        +//>>demos: http://jqueryui.com/progressbar/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/progressbar.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.widget( "ui.progressbar", {
        +	version: "1.12.1",
        +	options: {
        +		classes: {
        +			"ui-progressbar": "ui-corner-all",
        +			"ui-progressbar-value": "ui-corner-left",
        +			"ui-progressbar-complete": "ui-corner-right"
        +		},
        +		max: 100,
        +		value: 0,
        +
        +		change: null,
        +		complete: null
        +	},
        +
        +	min: 0,
        +
        +	_create: function() {
        +
        +		// Constrain initial value
        +		this.oldValue = this.options.value = this._constrainedValue();
        +
        +		this.element.attr( {
        +
        +			// Only set static values; aria-valuenow and aria-valuemax are
        +			// set inside _refreshValue()
        +			role: "progressbar",
        +			"aria-valuemin": this.min
        +		} );
        +		this._addClass( "ui-progressbar", "ui-widget ui-widget-content" );
        +
        +		this.valueDiv = $( "<div>" ).appendTo( this.element );
        +		this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" );
        +		this._refreshValue();
        +	},
        +
        +	_destroy: function() {
        +		this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" );
        +
        +		this.valueDiv.remove();
        +	},
        +
        +	value: function( newValue ) {
        +		if ( newValue === undefined ) {
        +			return this.options.value;
        +		}
        +
        +		this.options.value = this._constrainedValue( newValue );
        +		this._refreshValue();
        +	},
        +
        +	_constrainedValue: function( newValue ) {
        +		if ( newValue === undefined ) {
        +			newValue = this.options.value;
        +		}
        +
        +		this.indeterminate = newValue === false;
        +
        +		// Sanitize value
        +		if ( typeof newValue !== "number" ) {
        +			newValue = 0;
        +		}
        +
        +		return this.indeterminate ? false :
        +			Math.min( this.options.max, Math.max( this.min, newValue ) );
        +	},
        +
        +	_setOptions: function( options ) {
        +
        +		// Ensure "value" option is set after other values (like max)
        +		var value = options.value;
        +		delete options.value;
        +
        +		this._super( options );
        +
        +		this.options.value = this._constrainedValue( value );
        +		this._refreshValue();
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "max" ) {
        +
        +			// Don't allow a max less than min
        +			value = Math.max( this.min, value );
        +		}
        +		this._super( key, value );
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.element.attr( "aria-disabled", value );
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +	},
        +
        +	_percentage: function() {
        +		return this.indeterminate ?
        +			100 :
        +			100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
        +	},
        +
        +	_refreshValue: function() {
        +		var value = this.options.value,
        +			percentage = this._percentage();
        +
        +		this.valueDiv
        +			.toggle( this.indeterminate || value > this.min )
        +			.width( percentage.toFixed( 0 ) + "%" );
        +
        +		this
        +			._toggleClass( this.valueDiv, "ui-progressbar-complete", null,
        +				value === this.options.max )
        +			._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate );
        +
        +		if ( this.indeterminate ) {
        +			this.element.removeAttr( "aria-valuenow" );
        +			if ( !this.overlayDiv ) {
        +				this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv );
        +				this._addClass( this.overlayDiv, "ui-progressbar-overlay" );
        +			}
        +		} else {
        +			this.element.attr( {
        +				"aria-valuemax": this.options.max,
        +				"aria-valuenow": value
        +			} );
        +			if ( this.overlayDiv ) {
        +				this.overlayDiv.remove();
        +				this.overlayDiv = null;
        +			}
        +		}
        +
        +		if ( this.oldValue !== value ) {
        +			this.oldValue = value;
        +			this._trigger( "change" );
        +		}
        +		if ( value === this.options.max ) {
        +			this._trigger( "complete" );
        +		}
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/resizable.js b/bower_components/jquery-ui/ui/widgets/resizable.js
        new file mode 100644
        index 0000000000..741664281d
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/resizable.js
        @@ -0,0 +1,1201 @@
        +/*!
        + * jQuery UI Resizable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Resizable
        +//>>group: Interactions
        +//>>description: Enables resize functionality for any element.
        +//>>docs: http://api.jqueryui.com/resizable/
        +//>>demos: http://jqueryui.com/resizable/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/resizable.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./mouse",
        +			"../disable-selection",
        +			"../plugin",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.resizable", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "resize",
        +	options: {
        +		alsoResize: false,
        +		animate: false,
        +		animateDuration: "slow",
        +		animateEasing: "swing",
        +		aspectRatio: false,
        +		autoHide: false,
        +		classes: {
        +			"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
        +		},
        +		containment: false,
        +		ghost: false,
        +		grid: false,
        +		handles: "e,s,se",
        +		helper: false,
        +		maxHeight: null,
        +		maxWidth: null,
        +		minHeight: 10,
        +		minWidth: 10,
        +
        +		// See #7960
        +		zIndex: 90,
        +
        +		// Callbacks
        +		resize: null,
        +		start: null,
        +		stop: null
        +	},
        +
        +	_num: function( value ) {
        +		return parseFloat( value ) || 0;
        +	},
        +
        +	_isNumber: function( value ) {
        +		return !isNaN( parseFloat( value ) );
        +	},
        +
        +	_hasScroll: function( el, a ) {
        +
        +		if ( $( el ).css( "overflow" ) === "hidden" ) {
        +			return false;
        +		}
        +
        +		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
        +			has = false;
        +
        +		if ( el[ scroll ] > 0 ) {
        +			return true;
        +		}
        +
        +		// TODO: determine which cases actually cause this to happen
        +		// if the element doesn't have the scroll set, see if it's possible to
        +		// set the scroll
        +		el[ scroll ] = 1;
        +		has = ( el[ scroll ] > 0 );
        +		el[ scroll ] = 0;
        +		return has;
        +	},
        +
        +	_create: function() {
        +
        +		var margins,
        +			o = this.options,
        +			that = this;
        +		this._addClass( "ui-resizable" );
        +
        +		$.extend( this, {
        +			_aspectRatio: !!( o.aspectRatio ),
        +			aspectRatio: o.aspectRatio,
        +			originalElement: this.element,
        +			_proportionallyResizeElements: [],
        +			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
        +		} );
        +
        +		// Wrap the element if it cannot hold child nodes
        +		if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
        +
        +			this.element.wrap(
        +				$( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ).css( {
        +					position: this.element.css( "position" ),
        +					width: this.element.outerWidth(),
        +					height: this.element.outerHeight(),
        +					top: this.element.css( "top" ),
        +					left: this.element.css( "left" )
        +				} )
        +			);
        +
        +			this.element = this.element.parent().data(
        +				"ui-resizable", this.element.resizable( "instance" )
        +			);
        +
        +			this.elementIsWrapper = true;
        +
        +			margins = {
        +				marginTop: this.originalElement.css( "marginTop" ),
        +				marginRight: this.originalElement.css( "marginRight" ),
        +				marginBottom: this.originalElement.css( "marginBottom" ),
        +				marginLeft: this.originalElement.css( "marginLeft" )
        +			};
        +
        +			this.element.css( margins );
        +			this.originalElement.css( "margin", 0 );
        +
        +			// support: Safari
        +			// Prevent Safari textarea resize
        +			this.originalResizeStyle = this.originalElement.css( "resize" );
        +			this.originalElement.css( "resize", "none" );
        +
        +			this._proportionallyResizeElements.push( this.originalElement.css( {
        +				position: "static",
        +				zoom: 1,
        +				display: "block"
        +			} ) );
        +
        +			// Support: IE9
        +			// avoid IE jump (hard set the margin)
        +			this.originalElement.css( margins );
        +
        +			this._proportionallyResize();
        +		}
        +
        +		this._setupHandles();
        +
        +		if ( o.autoHide ) {
        +			$( this.element )
        +				.on( "mouseenter", function() {
        +					if ( o.disabled ) {
        +						return;
        +					}
        +					that._removeClass( "ui-resizable-autohide" );
        +					that._handles.show();
        +				} )
        +				.on( "mouseleave", function() {
        +					if ( o.disabled ) {
        +						return;
        +					}
        +					if ( !that.resizing ) {
        +						that._addClass( "ui-resizable-autohide" );
        +						that._handles.hide();
        +					}
        +				} );
        +		}
        +
        +		this._mouseInit();
        +	},
        +
        +	_destroy: function() {
        +
        +		this._mouseDestroy();
        +
        +		var wrapper,
        +			_destroy = function( exp ) {
        +				$( exp )
        +					.removeData( "resizable" )
        +					.removeData( "ui-resizable" )
        +					.off( ".resizable" )
        +					.find( ".ui-resizable-handle" )
        +						.remove();
        +			};
        +
        +		// TODO: Unwrap at same DOM position
        +		if ( this.elementIsWrapper ) {
        +			_destroy( this.element );
        +			wrapper = this.element;
        +			this.originalElement.css( {
        +				position: wrapper.css( "position" ),
        +				width: wrapper.outerWidth(),
        +				height: wrapper.outerHeight(),
        +				top: wrapper.css( "top" ),
        +				left: wrapper.css( "left" )
        +			} ).insertAfter( wrapper );
        +			wrapper.remove();
        +		}
        +
        +		this.originalElement.css( "resize", this.originalResizeStyle );
        +		_destroy( this.originalElement );
        +
        +		return this;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +
        +		switch ( key ) {
        +		case "handles":
        +			this._removeHandles();
        +			this._setupHandles();
        +			break;
        +		default:
        +			break;
        +		}
        +	},
        +
        +	_setupHandles: function() {
        +		var o = this.options, handle, i, n, hname, axis, that = this;
        +		this.handles = o.handles ||
        +			( !$( ".ui-resizable-handle", this.element ).length ?
        +				"e,s,se" : {
        +					n: ".ui-resizable-n",
        +					e: ".ui-resizable-e",
        +					s: ".ui-resizable-s",
        +					w: ".ui-resizable-w",
        +					se: ".ui-resizable-se",
        +					sw: ".ui-resizable-sw",
        +					ne: ".ui-resizable-ne",
        +					nw: ".ui-resizable-nw"
        +				} );
        +
        +		this._handles = $();
        +		if ( this.handles.constructor === String ) {
        +
        +			if ( this.handles === "all" ) {
        +				this.handles = "n,e,s,w,se,sw,ne,nw";
        +			}
        +
        +			n = this.handles.split( "," );
        +			this.handles = {};
        +
        +			for ( i = 0; i < n.length; i++ ) {
        +
        +				handle = $.trim( n[ i ] );
        +				hname = "ui-resizable-" + handle;
        +				axis = $( "<div>" );
        +				this._addClass( axis, "ui-resizable-handle " + hname );
        +
        +				axis.css( { zIndex: o.zIndex } );
        +
        +				this.handles[ handle ] = ".ui-resizable-" + handle;
        +				this.element.append( axis );
        +			}
        +
        +		}
        +
        +		this._renderAxis = function( target ) {
        +
        +			var i, axis, padPos, padWrapper;
        +
        +			target = target || this.element;
        +
        +			for ( i in this.handles ) {
        +
        +				if ( this.handles[ i ].constructor === String ) {
        +					this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
        +				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
        +					this.handles[ i ] = $( this.handles[ i ] );
        +					this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
        +				}
        +
        +				if ( this.elementIsWrapper &&
        +						this.originalElement[ 0 ]
        +							.nodeName
        +							.match( /^(textarea|input|select|button)$/i ) ) {
        +					axis = $( this.handles[ i ], this.element );
        +
        +					padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
        +						axis.outerHeight() :
        +						axis.outerWidth();
        +
        +					padPos = [ "padding",
        +						/ne|nw|n/.test( i ) ? "Top" :
        +						/se|sw|s/.test( i ) ? "Bottom" :
        +						/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
        +
        +					target.css( padPos, padWrapper );
        +
        +					this._proportionallyResize();
        +				}
        +
        +				this._handles = this._handles.add( this.handles[ i ] );
        +			}
        +		};
        +
        +		// TODO: make renderAxis a prototype function
        +		this._renderAxis( this.element );
        +
        +		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
        +		this._handles.disableSelection();
        +
        +		this._handles.on( "mouseover", function() {
        +			if ( !that.resizing ) {
        +				if ( this.className ) {
        +					axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
        +				}
        +				that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
        +			}
        +		} );
        +
        +		if ( o.autoHide ) {
        +			this._handles.hide();
        +			this._addClass( "ui-resizable-autohide" );
        +		}
        +	},
        +
        +	_removeHandles: function() {
        +		this._handles.remove();
        +	},
        +
        +	_mouseCapture: function( event ) {
        +		var i, handle,
        +			capture = false;
        +
        +		for ( i in this.handles ) {
        +			handle = $( this.handles[ i ] )[ 0 ];
        +			if ( handle === event.target || $.contains( handle, event.target ) ) {
        +				capture = true;
        +			}
        +		}
        +
        +		return !this.options.disabled && capture;
        +	},
        +
        +	_mouseStart: function( event ) {
        +
        +		var curleft, curtop, cursor,
        +			o = this.options,
        +			el = this.element;
        +
        +		this.resizing = true;
        +
        +		this._renderProxy();
        +
        +		curleft = this._num( this.helper.css( "left" ) );
        +		curtop = this._num( this.helper.css( "top" ) );
        +
        +		if ( o.containment ) {
        +			curleft += $( o.containment ).scrollLeft() || 0;
        +			curtop += $( o.containment ).scrollTop() || 0;
        +		}
        +
        +		this.offset = this.helper.offset();
        +		this.position = { left: curleft, top: curtop };
        +
        +		this.size = this._helper ? {
        +				width: this.helper.width(),
        +				height: this.helper.height()
        +			} : {
        +				width: el.width(),
        +				height: el.height()
        +			};
        +
        +		this.originalSize = this._helper ? {
        +				width: el.outerWidth(),
        +				height: el.outerHeight()
        +			} : {
        +				width: el.width(),
        +				height: el.height()
        +			};
        +
        +		this.sizeDiff = {
        +			width: el.outerWidth() - el.width(),
        +			height: el.outerHeight() - el.height()
        +		};
        +
        +		this.originalPosition = { left: curleft, top: curtop };
        +		this.originalMousePosition = { left: event.pageX, top: event.pageY };
        +
        +		this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
        +			o.aspectRatio :
        +			( ( this.originalSize.width / this.originalSize.height ) || 1 );
        +
        +		cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
        +		$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
        +
        +		this._addClass( "ui-resizable-resizing" );
        +		this._propagate( "start", event );
        +		return true;
        +	},
        +
        +	_mouseDrag: function( event ) {
        +
        +		var data, props,
        +			smp = this.originalMousePosition,
        +			a = this.axis,
        +			dx = ( event.pageX - smp.left ) || 0,
        +			dy = ( event.pageY - smp.top ) || 0,
        +			trigger = this._change[ a ];
        +
        +		this._updatePrevProperties();
        +
        +		if ( !trigger ) {
        +			return false;
        +		}
        +
        +		data = trigger.apply( this, [ event, dx, dy ] );
        +
        +		this._updateVirtualBoundaries( event.shiftKey );
        +		if ( this._aspectRatio || event.shiftKey ) {
        +			data = this._updateRatio( data, event );
        +		}
        +
        +		data = this._respectSize( data, event );
        +
        +		this._updateCache( data );
        +
        +		this._propagate( "resize", event );
        +
        +		props = this._applyChanges();
        +
        +		if ( !this._helper && this._proportionallyResizeElements.length ) {
        +			this._proportionallyResize();
        +		}
        +
        +		if ( !$.isEmptyObject( props ) ) {
        +			this._updatePrevProperties();
        +			this._trigger( "resize", event, this.ui() );
        +			this._applyChanges();
        +		}
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +
        +		this.resizing = false;
        +		var pr, ista, soffseth, soffsetw, s, left, top,
        +			o = this.options, that = this;
        +
        +		if ( this._helper ) {
        +
        +			pr = this._proportionallyResizeElements;
        +			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
        +			soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
        +			soffsetw = ista ? 0 : that.sizeDiff.width;
        +
        +			s = {
        +				width: ( that.helper.width()  - soffsetw ),
        +				height: ( that.helper.height() - soffseth )
        +			};
        +			left = ( parseFloat( that.element.css( "left" ) ) +
        +				( that.position.left - that.originalPosition.left ) ) || null;
        +			top = ( parseFloat( that.element.css( "top" ) ) +
        +				( that.position.top - that.originalPosition.top ) ) || null;
        +
        +			if ( !o.animate ) {
        +				this.element.css( $.extend( s, { top: top, left: left } ) );
        +			}
        +
        +			that.helper.height( that.size.height );
        +			that.helper.width( that.size.width );
        +
        +			if ( this._helper && !o.animate ) {
        +				this._proportionallyResize();
        +			}
        +		}
        +
        +		$( "body" ).css( "cursor", "auto" );
        +
        +		this._removeClass( "ui-resizable-resizing" );
        +
        +		this._propagate( "stop", event );
        +
        +		if ( this._helper ) {
        +			this.helper.remove();
        +		}
        +
        +		return false;
        +
        +	},
        +
        +	_updatePrevProperties: function() {
        +		this.prevPosition = {
        +			top: this.position.top,
        +			left: this.position.left
        +		};
        +		this.prevSize = {
        +			width: this.size.width,
        +			height: this.size.height
        +		};
        +	},
        +
        +	_applyChanges: function() {
        +		var props = {};
        +
        +		if ( this.position.top !== this.prevPosition.top ) {
        +			props.top = this.position.top + "px";
        +		}
        +		if ( this.position.left !== this.prevPosition.left ) {
        +			props.left = this.position.left + "px";
        +		}
        +		if ( this.size.width !== this.prevSize.width ) {
        +			props.width = this.size.width + "px";
        +		}
        +		if ( this.size.height !== this.prevSize.height ) {
        +			props.height = this.size.height + "px";
        +		}
        +
        +		this.helper.css( props );
        +
        +		return props;
        +	},
        +
        +	_updateVirtualBoundaries: function( forceAspectRatio ) {
        +		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
        +			o = this.options;
        +
        +		b = {
        +			minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
        +			maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
        +			minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
        +			maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
        +		};
        +
        +		if ( this._aspectRatio || forceAspectRatio ) {
        +			pMinWidth = b.minHeight * this.aspectRatio;
        +			pMinHeight = b.minWidth / this.aspectRatio;
        +			pMaxWidth = b.maxHeight * this.aspectRatio;
        +			pMaxHeight = b.maxWidth / this.aspectRatio;
        +
        +			if ( pMinWidth > b.minWidth ) {
        +				b.minWidth = pMinWidth;
        +			}
        +			if ( pMinHeight > b.minHeight ) {
        +				b.minHeight = pMinHeight;
        +			}
        +			if ( pMaxWidth < b.maxWidth ) {
        +				b.maxWidth = pMaxWidth;
        +			}
        +			if ( pMaxHeight < b.maxHeight ) {
        +				b.maxHeight = pMaxHeight;
        +			}
        +		}
        +		this._vBoundaries = b;
        +	},
        +
        +	_updateCache: function( data ) {
        +		this.offset = this.helper.offset();
        +		if ( this._isNumber( data.left ) ) {
        +			this.position.left = data.left;
        +		}
        +		if ( this._isNumber( data.top ) ) {
        +			this.position.top = data.top;
        +		}
        +		if ( this._isNumber( data.height ) ) {
        +			this.size.height = data.height;
        +		}
        +		if ( this._isNumber( data.width ) ) {
        +			this.size.width = data.width;
        +		}
        +	},
        +
        +	_updateRatio: function( data ) {
        +
        +		var cpos = this.position,
        +			csize = this.size,
        +			a = this.axis;
        +
        +		if ( this._isNumber( data.height ) ) {
        +			data.width = ( data.height * this.aspectRatio );
        +		} else if ( this._isNumber( data.width ) ) {
        +			data.height = ( data.width / this.aspectRatio );
        +		}
        +
        +		if ( a === "sw" ) {
        +			data.left = cpos.left + ( csize.width - data.width );
        +			data.top = null;
        +		}
        +		if ( a === "nw" ) {
        +			data.top = cpos.top + ( csize.height - data.height );
        +			data.left = cpos.left + ( csize.width - data.width );
        +		}
        +
        +		return data;
        +	},
        +
        +	_respectSize: function( data ) {
        +
        +		var o = this._vBoundaries,
        +			a = this.axis,
        +			ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
        +			ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
        +			isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
        +			isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
        +			dw = this.originalPosition.left + this.originalSize.width,
        +			dh = this.originalPosition.top + this.originalSize.height,
        +			cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
        +		if ( isminw ) {
        +			data.width = o.minWidth;
        +		}
        +		if ( isminh ) {
        +			data.height = o.minHeight;
        +		}
        +		if ( ismaxw ) {
        +			data.width = o.maxWidth;
        +		}
        +		if ( ismaxh ) {
        +			data.height = o.maxHeight;
        +		}
        +
        +		if ( isminw && cw ) {
        +			data.left = dw - o.minWidth;
        +		}
        +		if ( ismaxw && cw ) {
        +			data.left = dw - o.maxWidth;
        +		}
        +		if ( isminh && ch ) {
        +			data.top = dh - o.minHeight;
        +		}
        +		if ( ismaxh && ch ) {
        +			data.top = dh - o.maxHeight;
        +		}
        +
        +		// Fixing jump error on top/left - bug #2330
        +		if ( !data.width && !data.height && !data.left && data.top ) {
        +			data.top = null;
        +		} else if ( !data.width && !data.height && !data.top && data.left ) {
        +			data.left = null;
        +		}
        +
        +		return data;
        +	},
        +
        +	_getPaddingPlusBorderDimensions: function( element ) {
        +		var i = 0,
        +			widths = [],
        +			borders = [
        +				element.css( "borderTopWidth" ),
        +				element.css( "borderRightWidth" ),
        +				element.css( "borderBottomWidth" ),
        +				element.css( "borderLeftWidth" )
        +			],
        +			paddings = [
        +				element.css( "paddingTop" ),
        +				element.css( "paddingRight" ),
        +				element.css( "paddingBottom" ),
        +				element.css( "paddingLeft" )
        +			];
        +
        +		for ( ; i < 4; i++ ) {
        +			widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
        +			widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
        +		}
        +
        +		return {
        +			height: widths[ 0 ] + widths[ 2 ],
        +			width: widths[ 1 ] + widths[ 3 ]
        +		};
        +	},
        +
        +	_proportionallyResize: function() {
        +
        +		if ( !this._proportionallyResizeElements.length ) {
        +			return;
        +		}
        +
        +		var prel,
        +			i = 0,
        +			element = this.helper || this.element;
        +
        +		for ( ; i < this._proportionallyResizeElements.length; i++ ) {
        +
        +			prel = this._proportionallyResizeElements[ i ];
        +
        +			// TODO: Seems like a bug to cache this.outerDimensions
        +			// considering that we are in a loop.
        +			if ( !this.outerDimensions ) {
        +				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
        +			}
        +
        +			prel.css( {
        +				height: ( element.height() - this.outerDimensions.height ) || 0,
        +				width: ( element.width() - this.outerDimensions.width ) || 0
        +			} );
        +
        +		}
        +
        +	},
        +
        +	_renderProxy: function() {
        +
        +		var el = this.element, o = this.options;
        +		this.elementOffset = el.offset();
        +
        +		if ( this._helper ) {
        +
        +			this.helper = this.helper || $( "<div style='overflow:hidden;'></div>" );
        +
        +			this._addClass( this.helper, this._helper );
        +			this.helper.css( {
        +				width: this.element.outerWidth(),
        +				height: this.element.outerHeight(),
        +				position: "absolute",
        +				left: this.elementOffset.left + "px",
        +				top: this.elementOffset.top + "px",
        +				zIndex: ++o.zIndex //TODO: Don't modify option
        +			} );
        +
        +			this.helper
        +				.appendTo( "body" )
        +				.disableSelection();
        +
        +		} else {
        +			this.helper = this.element;
        +		}
        +
        +	},
        +
        +	_change: {
        +		e: function( event, dx ) {
        +			return { width: this.originalSize.width + dx };
        +		},
        +		w: function( event, dx ) {
        +			var cs = this.originalSize, sp = this.originalPosition;
        +			return { left: sp.left + dx, width: cs.width - dx };
        +		},
        +		n: function( event, dx, dy ) {
        +			var cs = this.originalSize, sp = this.originalPosition;
        +			return { top: sp.top + dy, height: cs.height - dy };
        +		},
        +		s: function( event, dx, dy ) {
        +			return { height: this.originalSize.height + dy };
        +		},
        +		se: function( event, dx, dy ) {
        +			return $.extend( this._change.s.apply( this, arguments ),
        +				this._change.e.apply( this, [ event, dx, dy ] ) );
        +		},
        +		sw: function( event, dx, dy ) {
        +			return $.extend( this._change.s.apply( this, arguments ),
        +				this._change.w.apply( this, [ event, dx, dy ] ) );
        +		},
        +		ne: function( event, dx, dy ) {
        +			return $.extend( this._change.n.apply( this, arguments ),
        +				this._change.e.apply( this, [ event, dx, dy ] ) );
        +		},
        +		nw: function( event, dx, dy ) {
        +			return $.extend( this._change.n.apply( this, arguments ),
        +				this._change.w.apply( this, [ event, dx, dy ] ) );
        +		}
        +	},
        +
        +	_propagate: function( n, event ) {
        +		$.ui.plugin.call( this, n, [ event, this.ui() ] );
        +		( n !== "resize" && this._trigger( n, event, this.ui() ) );
        +	},
        +
        +	plugins: {},
        +
        +	ui: function() {
        +		return {
        +			originalElement: this.originalElement,
        +			element: this.element,
        +			helper: this.helper,
        +			position: this.position,
        +			size: this.size,
        +			originalSize: this.originalSize,
        +			originalPosition: this.originalPosition
        +		};
        +	}
        +
        +} );
        +
        +/*
        + * Resizable Extensions
        + */
        +
        +$.ui.plugin.add( "resizable", "animate", {
        +
        +	stop: function( event ) {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			pr = that._proportionallyResizeElements,
        +			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
        +			soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
        +			soffsetw = ista ? 0 : that.sizeDiff.width,
        +			style = {
        +				width: ( that.size.width - soffsetw ),
        +				height: ( that.size.height - soffseth )
        +			},
        +			left = ( parseFloat( that.element.css( "left" ) ) +
        +				( that.position.left - that.originalPosition.left ) ) || null,
        +			top = ( parseFloat( that.element.css( "top" ) ) +
        +				( that.position.top - that.originalPosition.top ) ) || null;
        +
        +		that.element.animate(
        +			$.extend( style, top && left ? { top: top, left: left } : {} ), {
        +				duration: o.animateDuration,
        +				easing: o.animateEasing,
        +				step: function() {
        +
        +					var data = {
        +						width: parseFloat( that.element.css( "width" ) ),
        +						height: parseFloat( that.element.css( "height" ) ),
        +						top: parseFloat( that.element.css( "top" ) ),
        +						left: parseFloat( that.element.css( "left" ) )
        +					};
        +
        +					if ( pr && pr.length ) {
        +						$( pr[ 0 ] ).css( { width: data.width, height: data.height } );
        +					}
        +
        +					// Propagating resize, and updating values for each animation step
        +					that._updateCache( data );
        +					that._propagate( "resize", event );
        +
        +				}
        +			}
        +		);
        +	}
        +
        +} );
        +
        +$.ui.plugin.add( "resizable", "containment", {
        +
        +	start: function() {
        +		var element, p, co, ch, cw, width, height,
        +			that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			el = that.element,
        +			oc = o.containment,
        +			ce = ( oc instanceof $ ) ?
        +				oc.get( 0 ) :
        +				( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
        +
        +		if ( !ce ) {
        +			return;
        +		}
        +
        +		that.containerElement = $( ce );
        +
        +		if ( /document/.test( oc ) || oc === document ) {
        +			that.containerOffset = {
        +				left: 0,
        +				top: 0
        +			};
        +			that.containerPosition = {
        +				left: 0,
        +				top: 0
        +			};
        +
        +			that.parentData = {
        +				element: $( document ),
        +				left: 0,
        +				top: 0,
        +				width: $( document ).width(),
        +				height: $( document ).height() || document.body.parentNode.scrollHeight
        +			};
        +		} else {
        +			element = $( ce );
        +			p = [];
        +			$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
        +				p[ i ] = that._num( element.css( "padding" + name ) );
        +			} );
        +
        +			that.containerOffset = element.offset();
        +			that.containerPosition = element.position();
        +			that.containerSize = {
        +				height: ( element.innerHeight() - p[ 3 ] ),
        +				width: ( element.innerWidth() - p[ 1 ] )
        +			};
        +
        +			co = that.containerOffset;
        +			ch = that.containerSize.height;
        +			cw = that.containerSize.width;
        +			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
        +			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
        +
        +			that.parentData = {
        +				element: ce,
        +				left: co.left,
        +				top: co.top,
        +				width: width,
        +				height: height
        +			};
        +		}
        +	},
        +
        +	resize: function( event ) {
        +		var woset, hoset, isParent, isOffsetRelative,
        +			that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			co = that.containerOffset,
        +			cp = that.position,
        +			pRatio = that._aspectRatio || event.shiftKey,
        +			cop = {
        +				top: 0,
        +				left: 0
        +			},
        +			ce = that.containerElement,
        +			continueResize = true;
        +
        +		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
        +			cop = co;
        +		}
        +
        +		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
        +			that.size.width = that.size.width +
        +				( that._helper ?
        +					( that.position.left - co.left ) :
        +					( that.position.left - cop.left ) );
        +
        +			if ( pRatio ) {
        +				that.size.height = that.size.width / that.aspectRatio;
        +				continueResize = false;
        +			}
        +			that.position.left = o.helper ? co.left : 0;
        +		}
        +
        +		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
        +			that.size.height = that.size.height +
        +				( that._helper ?
        +					( that.position.top - co.top ) :
        +					that.position.top );
        +
        +			if ( pRatio ) {
        +				that.size.width = that.size.height * that.aspectRatio;
        +				continueResize = false;
        +			}
        +			that.position.top = that._helper ? co.top : 0;
        +		}
        +
        +		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
        +		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
        +
        +		if ( isParent && isOffsetRelative ) {
        +			that.offset.left = that.parentData.left + that.position.left;
        +			that.offset.top = that.parentData.top + that.position.top;
        +		} else {
        +			that.offset.left = that.element.offset().left;
        +			that.offset.top = that.element.offset().top;
        +		}
        +
        +		woset = Math.abs( that.sizeDiff.width +
        +			( that._helper ?
        +				that.offset.left - cop.left :
        +				( that.offset.left - co.left ) ) );
        +
        +		hoset = Math.abs( that.sizeDiff.height +
        +			( that._helper ?
        +				that.offset.top - cop.top :
        +				( that.offset.top - co.top ) ) );
        +
        +		if ( woset + that.size.width >= that.parentData.width ) {
        +			that.size.width = that.parentData.width - woset;
        +			if ( pRatio ) {
        +				that.size.height = that.size.width / that.aspectRatio;
        +				continueResize = false;
        +			}
        +		}
        +
        +		if ( hoset + that.size.height >= that.parentData.height ) {
        +			that.size.height = that.parentData.height - hoset;
        +			if ( pRatio ) {
        +				that.size.width = that.size.height * that.aspectRatio;
        +				continueResize = false;
        +			}
        +		}
        +
        +		if ( !continueResize ) {
        +			that.position.left = that.prevPosition.left;
        +			that.position.top = that.prevPosition.top;
        +			that.size.width = that.prevSize.width;
        +			that.size.height = that.prevSize.height;
        +		}
        +	},
        +
        +	stop: function() {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			co = that.containerOffset,
        +			cop = that.containerPosition,
        +			ce = that.containerElement,
        +			helper = $( that.helper ),
        +			ho = helper.offset(),
        +			w = helper.outerWidth() - that.sizeDiff.width,
        +			h = helper.outerHeight() - that.sizeDiff.height;
        +
        +		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
        +			$( this ).css( {
        +				left: ho.left - cop.left - co.left,
        +				width: w,
        +				height: h
        +			} );
        +		}
        +
        +		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
        +			$( this ).css( {
        +				left: ho.left - cop.left - co.left,
        +				width: w,
        +				height: h
        +			} );
        +		}
        +	}
        +} );
        +
        +$.ui.plugin.add( "resizable", "alsoResize", {
        +
        +	start: function() {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options;
        +
        +		$( o.alsoResize ).each( function() {
        +			var el = $( this );
        +			el.data( "ui-resizable-alsoresize", {
        +				width: parseFloat( el.width() ), height: parseFloat( el.height() ),
        +				left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
        +			} );
        +		} );
        +	},
        +
        +	resize: function( event, ui ) {
        +		var that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			os = that.originalSize,
        +			op = that.originalPosition,
        +			delta = {
        +				height: ( that.size.height - os.height ) || 0,
        +				width: ( that.size.width - os.width ) || 0,
        +				top: ( that.position.top - op.top ) || 0,
        +				left: ( that.position.left - op.left ) || 0
        +			};
        +
        +			$( o.alsoResize ).each( function() {
        +				var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
        +					css = el.parents( ui.originalElement[ 0 ] ).length ?
        +							[ "width", "height" ] :
        +							[ "width", "height", "top", "left" ];
        +
        +				$.each( css, function( i, prop ) {
        +					var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
        +					if ( sum && sum >= 0 ) {
        +						style[ prop ] = sum || null;
        +					}
        +				} );
        +
        +				el.css( style );
        +			} );
        +	},
        +
        +	stop: function() {
        +		$( this ).removeData( "ui-resizable-alsoresize" );
        +	}
        +} );
        +
        +$.ui.plugin.add( "resizable", "ghost", {
        +
        +	start: function() {
        +
        +		var that = $( this ).resizable( "instance" ), cs = that.size;
        +
        +		that.ghost = that.originalElement.clone();
        +		that.ghost.css( {
        +			opacity: 0.25,
        +			display: "block",
        +			position: "relative",
        +			height: cs.height,
        +			width: cs.width,
        +			margin: 0,
        +			left: 0,
        +			top: 0
        +		} );
        +
        +		that._addClass( that.ghost, "ui-resizable-ghost" );
        +
        +		// DEPRECATED
        +		// TODO: remove after 1.12
        +		if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
        +
        +			// Ghost option
        +			that.ghost.addClass( this.options.ghost );
        +		}
        +
        +		that.ghost.appendTo( that.helper );
        +
        +	},
        +
        +	resize: function() {
        +		var that = $( this ).resizable( "instance" );
        +		if ( that.ghost ) {
        +			that.ghost.css( {
        +				position: "relative",
        +				height: that.size.height,
        +				width: that.size.width
        +			} );
        +		}
        +	},
        +
        +	stop: function() {
        +		var that = $( this ).resizable( "instance" );
        +		if ( that.ghost && that.helper ) {
        +			that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
        +		}
        +	}
        +
        +} );
        +
        +$.ui.plugin.add( "resizable", "grid", {
        +
        +	resize: function() {
        +		var outerDimensions,
        +			that = $( this ).resizable( "instance" ),
        +			o = that.options,
        +			cs = that.size,
        +			os = that.originalSize,
        +			op = that.originalPosition,
        +			a = that.axis,
        +			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
        +			gridX = ( grid[ 0 ] || 1 ),
        +			gridY = ( grid[ 1 ] || 1 ),
        +			ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
        +			oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
        +			newWidth = os.width + ox,
        +			newHeight = os.height + oy,
        +			isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
        +			isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
        +			isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
        +			isMinHeight = o.minHeight && ( o.minHeight > newHeight );
        +
        +		o.grid = grid;
        +
        +		if ( isMinWidth ) {
        +			newWidth += gridX;
        +		}
        +		if ( isMinHeight ) {
        +			newHeight += gridY;
        +		}
        +		if ( isMaxWidth ) {
        +			newWidth -= gridX;
        +		}
        +		if ( isMaxHeight ) {
        +			newHeight -= gridY;
        +		}
        +
        +		if ( /^(se|s|e)$/.test( a ) ) {
        +			that.size.width = newWidth;
        +			that.size.height = newHeight;
        +		} else if ( /^(ne)$/.test( a ) ) {
        +			that.size.width = newWidth;
        +			that.size.height = newHeight;
        +			that.position.top = op.top - oy;
        +		} else if ( /^(sw)$/.test( a ) ) {
        +			that.size.width = newWidth;
        +			that.size.height = newHeight;
        +			that.position.left = op.left - ox;
        +		} else {
        +			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
        +				outerDimensions = that._getPaddingPlusBorderDimensions( this );
        +			}
        +
        +			if ( newHeight - gridY > 0 ) {
        +				that.size.height = newHeight;
        +				that.position.top = op.top - oy;
        +			} else {
        +				newHeight = gridY - outerDimensions.height;
        +				that.size.height = newHeight;
        +				that.position.top = op.top + os.height - newHeight;
        +			}
        +			if ( newWidth - gridX > 0 ) {
        +				that.size.width = newWidth;
        +				that.position.left = op.left - ox;
        +			} else {
        +				newWidth = gridX - outerDimensions.width;
        +				that.size.width = newWidth;
        +				that.position.left = op.left + os.width - newWidth;
        +			}
        +		}
        +	}
        +
        +} );
        +
        +return $.ui.resizable;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/selectable.js b/bower_components/jquery-ui/ui/widgets/selectable.js
        new file mode 100644
        index 0000000000..205f0cbacf
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/selectable.js
        @@ -0,0 +1,310 @@
        +/*!
        + * jQuery UI Selectable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Selectable
        +//>>group: Interactions
        +//>>description: Allows groups of elements to be selected with the mouse.
        +//>>docs: http://api.jqueryui.com/selectable/
        +//>>demos: http://jqueryui.com/selectable/
        +//>>css.structure: ../../themes/base/selectable.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./mouse",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.widget( "ui.selectable", $.ui.mouse, {
        +	version: "1.12.1",
        +	options: {
        +		appendTo: "body",
        +		autoRefresh: true,
        +		distance: 0,
        +		filter: "*",
        +		tolerance: "touch",
        +
        +		// Callbacks
        +		selected: null,
        +		selecting: null,
        +		start: null,
        +		stop: null,
        +		unselected: null,
        +		unselecting: null
        +	},
        +	_create: function() {
        +		var that = this;
        +
        +		this._addClass( "ui-selectable" );
        +
        +		this.dragged = false;
        +
        +		// Cache selectee children based on filter
        +		this.refresh = function() {
        +			that.elementPos = $( that.element[ 0 ] ).offset();
        +			that.selectees = $( that.options.filter, that.element[ 0 ] );
        +			that._addClass( that.selectees, "ui-selectee" );
        +			that.selectees.each( function() {
        +				var $this = $( this ),
        +					selecteeOffset = $this.offset(),
        +					pos = {
        +						left: selecteeOffset.left - that.elementPos.left,
        +						top: selecteeOffset.top - that.elementPos.top
        +					};
        +				$.data( this, "selectable-item", {
        +					element: this,
        +					$element: $this,
        +					left: pos.left,
        +					top: pos.top,
        +					right: pos.left + $this.outerWidth(),
        +					bottom: pos.top + $this.outerHeight(),
        +					startselected: false,
        +					selected: $this.hasClass( "ui-selected" ),
        +					selecting: $this.hasClass( "ui-selecting" ),
        +					unselecting: $this.hasClass( "ui-unselecting" )
        +				} );
        +			} );
        +		};
        +		this.refresh();
        +
        +		this._mouseInit();
        +
        +		this.helper = $( "<div>" );
        +		this._addClass( this.helper, "ui-selectable-helper" );
        +	},
        +
        +	_destroy: function() {
        +		this.selectees.removeData( "selectable-item" );
        +		this._mouseDestroy();
        +	},
        +
        +	_mouseStart: function( event ) {
        +		var that = this,
        +			options = this.options;
        +
        +		this.opos = [ event.pageX, event.pageY ];
        +		this.elementPos = $( this.element[ 0 ] ).offset();
        +
        +		if ( this.options.disabled ) {
        +			return;
        +		}
        +
        +		this.selectees = $( options.filter, this.element[ 0 ] );
        +
        +		this._trigger( "start", event );
        +
        +		$( options.appendTo ).append( this.helper );
        +
        +		// position helper (lasso)
        +		this.helper.css( {
        +			"left": event.pageX,
        +			"top": event.pageY,
        +			"width": 0,
        +			"height": 0
        +		} );
        +
        +		if ( options.autoRefresh ) {
        +			this.refresh();
        +		}
        +
        +		this.selectees.filter( ".ui-selected" ).each( function() {
        +			var selectee = $.data( this, "selectable-item" );
        +			selectee.startselected = true;
        +			if ( !event.metaKey && !event.ctrlKey ) {
        +				that._removeClass( selectee.$element, "ui-selected" );
        +				selectee.selected = false;
        +				that._addClass( selectee.$element, "ui-unselecting" );
        +				selectee.unselecting = true;
        +
        +				// selectable UNSELECTING callback
        +				that._trigger( "unselecting", event, {
        +					unselecting: selectee.element
        +				} );
        +			}
        +		} );
        +
        +		$( event.target ).parents().addBack().each( function() {
        +			var doSelect,
        +				selectee = $.data( this, "selectable-item" );
        +			if ( selectee ) {
        +				doSelect = ( !event.metaKey && !event.ctrlKey ) ||
        +					!selectee.$element.hasClass( "ui-selected" );
        +				that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" )
        +					._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" );
        +				selectee.unselecting = !doSelect;
        +				selectee.selecting = doSelect;
        +				selectee.selected = doSelect;
        +
        +				// selectable (UN)SELECTING callback
        +				if ( doSelect ) {
        +					that._trigger( "selecting", event, {
        +						selecting: selectee.element
        +					} );
        +				} else {
        +					that._trigger( "unselecting", event, {
        +						unselecting: selectee.element
        +					} );
        +				}
        +				return false;
        +			}
        +		} );
        +
        +	},
        +
        +	_mouseDrag: function( event ) {
        +
        +		this.dragged = true;
        +
        +		if ( this.options.disabled ) {
        +			return;
        +		}
        +
        +		var tmp,
        +			that = this,
        +			options = this.options,
        +			x1 = this.opos[ 0 ],
        +			y1 = this.opos[ 1 ],
        +			x2 = event.pageX,
        +			y2 = event.pageY;
        +
        +		if ( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; }
        +		if ( y1 > y2 ) { tmp = y2; y2 = y1; y1 = tmp; }
        +		this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );
        +
        +		this.selectees.each( function() {
        +			var selectee = $.data( this, "selectable-item" ),
        +				hit = false,
        +				offset = {};
        +
        +			//prevent helper from being selected if appendTo: selectable
        +			if ( !selectee || selectee.element === that.element[ 0 ] ) {
        +				return;
        +			}
        +
        +			offset.left   = selectee.left   + that.elementPos.left;
        +			offset.right  = selectee.right  + that.elementPos.left;
        +			offset.top    = selectee.top    + that.elementPos.top;
        +			offset.bottom = selectee.bottom + that.elementPos.top;
        +
        +			if ( options.tolerance === "touch" ) {
        +				hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
        +                    offset.bottom < y1 ) );
        +			} else if ( options.tolerance === "fit" ) {
        +				hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
        +                    offset.bottom < y2 );
        +			}
        +
        +			if ( hit ) {
        +
        +				// SELECT
        +				if ( selectee.selected ) {
        +					that._removeClass( selectee.$element, "ui-selected" );
        +					selectee.selected = false;
        +				}
        +				if ( selectee.unselecting ) {
        +					that._removeClass( selectee.$element, "ui-unselecting" );
        +					selectee.unselecting = false;
        +				}
        +				if ( !selectee.selecting ) {
        +					that._addClass( selectee.$element, "ui-selecting" );
        +					selectee.selecting = true;
        +
        +					// selectable SELECTING callback
        +					that._trigger( "selecting", event, {
        +						selecting: selectee.element
        +					} );
        +				}
        +			} else {
        +
        +				// UNSELECT
        +				if ( selectee.selecting ) {
        +					if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {
        +						that._removeClass( selectee.$element, "ui-selecting" );
        +						selectee.selecting = false;
        +						that._addClass( selectee.$element, "ui-selected" );
        +						selectee.selected = true;
        +					} else {
        +						that._removeClass( selectee.$element, "ui-selecting" );
        +						selectee.selecting = false;
        +						if ( selectee.startselected ) {
        +							that._addClass( selectee.$element, "ui-unselecting" );
        +							selectee.unselecting = true;
        +						}
        +
        +						// selectable UNSELECTING callback
        +						that._trigger( "unselecting", event, {
        +							unselecting: selectee.element
        +						} );
        +					}
        +				}
        +				if ( selectee.selected ) {
        +					if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {
        +						that._removeClass( selectee.$element, "ui-selected" );
        +						selectee.selected = false;
        +
        +						that._addClass( selectee.$element, "ui-unselecting" );
        +						selectee.unselecting = true;
        +
        +						// selectable UNSELECTING callback
        +						that._trigger( "unselecting", event, {
        +							unselecting: selectee.element
        +						} );
        +					}
        +				}
        +			}
        +		} );
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +		var that = this;
        +
        +		this.dragged = false;
        +
        +		$( ".ui-unselecting", this.element[ 0 ] ).each( function() {
        +			var selectee = $.data( this, "selectable-item" );
        +			that._removeClass( selectee.$element, "ui-unselecting" );
        +			selectee.unselecting = false;
        +			selectee.startselected = false;
        +			that._trigger( "unselected", event, {
        +				unselected: selectee.element
        +			} );
        +		} );
        +		$( ".ui-selecting", this.element[ 0 ] ).each( function() {
        +			var selectee = $.data( this, "selectable-item" );
        +			that._removeClass( selectee.$element, "ui-selecting" )
        +				._addClass( selectee.$element, "ui-selected" );
        +			selectee.selecting = false;
        +			selectee.selected = true;
        +			selectee.startselected = true;
        +			that._trigger( "selected", event, {
        +				selected: selectee.element
        +			} );
        +		} );
        +		this._trigger( "stop", event );
        +
        +		this.helper.remove();
        +
        +		return false;
        +	}
        +
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/selectmenu.js b/bower_components/jquery-ui/ui/widgets/selectmenu.js
        new file mode 100644
        index 0000000000..e7cec577fc
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/selectmenu.js
        @@ -0,0 +1,687 @@
        +/*!
        + * jQuery UI Selectmenu 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Selectmenu
        +//>>group: Widgets
        +// jscs:disable maximumLineLength
        +//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
        +// jscs:enable maximumLineLength
        +//>>docs: http://api.jqueryui.com/selectmenu/
        +//>>demos: http://jqueryui.com/selectmenu/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./menu",
        +			"../escape-selector",
        +			"../form-reset-mixin",
        +			"../keycode",
        +			"../labels",
        +			"../position",
        +			"../unique-id",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
        +	version: "1.12.1",
        +	defaultElement: "<select>",
        +	options: {
        +		appendTo: null,
        +		classes: {
        +			"ui-selectmenu-button-open": "ui-corner-top",
        +			"ui-selectmenu-button-closed": "ui-corner-all"
        +		},
        +		disabled: null,
        +		icons: {
        +			button: "ui-icon-triangle-1-s"
        +		},
        +		position: {
        +			my: "left top",
        +			at: "left bottom",
        +			collision: "none"
        +		},
        +		width: false,
        +
        +		// Callbacks
        +		change: null,
        +		close: null,
        +		focus: null,
        +		open: null,
        +		select: null
        +	},
        +
        +	_create: function() {
        +		var selectmenuId = this.element.uniqueId().attr( "id" );
        +		this.ids = {
        +			element: selectmenuId,
        +			button: selectmenuId + "-button",
        +			menu: selectmenuId + "-menu"
        +		};
        +
        +		this._drawButton();
        +		this._drawMenu();
        +		this._bindFormResetHandler();
        +
        +		this._rendered = false;
        +		this.menuItems = $();
        +	},
        +
        +	_drawButton: function() {
        +		var icon,
        +			that = this,
        +			item = this._parseOption(
        +				this.element.find( "option:selected" ),
        +				this.element[ 0 ].selectedIndex
        +			);
        +
        +		// Associate existing label with the new button
        +		this.labels = this.element.labels().attr( "for", this.ids.button );
        +		this._on( this.labels, {
        +			click: function( event ) {
        +				this.button.focus();
        +				event.preventDefault();
        +			}
        +		} );
        +
        +		// Hide original select element
        +		this.element.hide();
        +
        +		// Create button
        +		this.button = $( "<span>", {
        +			tabindex: this.options.disabled ? -1 : 0,
        +			id: this.ids.button,
        +			role: "combobox",
        +			"aria-expanded": "false",
        +			"aria-autocomplete": "list",
        +			"aria-owns": this.ids.menu,
        +			"aria-haspopup": "true",
        +			title: this.element.attr( "title" )
        +		} )
        +			.insertAfter( this.element );
        +
        +		this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
        +			"ui-button ui-widget" );
        +
        +		icon = $( "<span>" ).appendTo( this.button );
        +		this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button );
        +		this.buttonItem = this._renderButtonItem( item )
        +			.appendTo( this.button );
        +
        +		if ( this.options.width !== false ) {
        +			this._resizeButton();
        +		}
        +
        +		this._on( this.button, this._buttonEvents );
        +		this.button.one( "focusin", function() {
        +
        +			// Delay rendering the menu items until the button receives focus.
        +			// The menu may have already been rendered via a programmatic open.
        +			if ( !that._rendered ) {
        +				that._refreshMenu();
        +			}
        +		} );
        +	},
        +
        +	_drawMenu: function() {
        +		var that = this;
        +
        +		// Create menu
        +		this.menu = $( "<ul>", {
        +			"aria-hidden": "true",
        +			"aria-labelledby": this.ids.button,
        +			id: this.ids.menu
        +		} );
        +
        +		// Wrap menu
        +		this.menuWrap = $( "<div>" ).append( this.menu );
        +		this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
        +		this.menuWrap.appendTo( this._appendTo() );
        +
        +		// Initialize menu widget
        +		this.menuInstance = this.menu
        +			.menu( {
        +				classes: {
        +					"ui-menu": "ui-corner-bottom"
        +				},
        +				role: "listbox",
        +				select: function( event, ui ) {
        +					event.preventDefault();
        +
        +					// Support: IE8
        +					// If the item was selected via a click, the text selection
        +					// will be destroyed in IE
        +					that._setSelection();
        +
        +					that._select( ui.item.data( "ui-selectmenu-item" ), event );
        +				},
        +				focus: function( event, ui ) {
        +					var item = ui.item.data( "ui-selectmenu-item" );
        +
        +					// Prevent inital focus from firing and check if its a newly focused item
        +					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
        +						that._trigger( "focus", event, { item: item } );
        +						if ( !that.isOpen ) {
        +							that._select( item, event );
        +						}
        +					}
        +					that.focusIndex = item.index;
        +
        +					that.button.attr( "aria-activedescendant",
        +						that.menuItems.eq( item.index ).attr( "id" ) );
        +				}
        +			} )
        +			.menu( "instance" );
        +
        +		// Don't close the menu on mouseleave
        +		this.menuInstance._off( this.menu, "mouseleave" );
        +
        +		// Cancel the menu's collapseAll on document click
        +		this.menuInstance._closeOnDocumentClick = function() {
        +			return false;
        +		};
        +
        +		// Selects often contain empty items, but never contain dividers
        +		this.menuInstance._isDivider = function() {
        +			return false;
        +		};
        +	},
        +
        +	refresh: function() {
        +		this._refreshMenu();
        +		this.buttonItem.replaceWith(
        +			this.buttonItem = this._renderButtonItem(
        +
        +				// Fall back to an empty object in case there are no options
        +				this._getSelectedItem().data( "ui-selectmenu-item" ) || {}
        +			)
        +		);
        +		if ( this.options.width === null ) {
        +			this._resizeButton();
        +		}
        +	},
        +
        +	_refreshMenu: function() {
        +		var item,
        +			options = this.element.find( "option" );
        +
        +		this.menu.empty();
        +
        +		this._parseOptions( options );
        +		this._renderMenu( this.menu, this.items );
        +
        +		this.menuInstance.refresh();
        +		this.menuItems = this.menu.find( "li" )
        +			.not( ".ui-selectmenu-optgroup" )
        +				.find( ".ui-menu-item-wrapper" );
        +
        +		this._rendered = true;
        +
        +		if ( !options.length ) {
        +			return;
        +		}
        +
        +		item = this._getSelectedItem();
        +
        +		// Update the menu to have the correct item focused
        +		this.menuInstance.focus( null, item );
        +		this._setAria( item.data( "ui-selectmenu-item" ) );
        +
        +		// Set disabled state
        +		this._setOption( "disabled", this.element.prop( "disabled" ) );
        +	},
        +
        +	open: function( event ) {
        +		if ( this.options.disabled ) {
        +			return;
        +		}
        +
        +		// If this is the first time the menu is being opened, render the items
        +		if ( !this._rendered ) {
        +			this._refreshMenu();
        +		} else {
        +
        +			// Menu clears focus on close, reset focus to selected item
        +			this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
        +			this.menuInstance.focus( null, this._getSelectedItem() );
        +		}
        +
        +		// If there are no options, don't open the menu
        +		if ( !this.menuItems.length ) {
        +			return;
        +		}
        +
        +		this.isOpen = true;
        +		this._toggleAttr();
        +		this._resizeMenu();
        +		this._position();
        +
        +		this._on( this.document, this._documentClick );
        +
        +		this._trigger( "open", event );
        +	},
        +
        +	_position: function() {
        +		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
        +	},
        +
        +	close: function( event ) {
        +		if ( !this.isOpen ) {
        +			return;
        +		}
        +
        +		this.isOpen = false;
        +		this._toggleAttr();
        +
        +		this.range = null;
        +		this._off( this.document );
        +
        +		this._trigger( "close", event );
        +	},
        +
        +	widget: function() {
        +		return this.button;
        +	},
        +
        +	menuWidget: function() {
        +		return this.menu;
        +	},
        +
        +	_renderButtonItem: function( item ) {
        +		var buttonItem = $( "<span>" );
        +
        +		this._setText( buttonItem, item.label );
        +		this._addClass( buttonItem, "ui-selectmenu-text" );
        +
        +		return buttonItem;
        +	},
        +
        +	_renderMenu: function( ul, items ) {
        +		var that = this,
        +			currentOptgroup = "";
        +
        +		$.each( items, function( index, item ) {
        +			var li;
        +
        +			if ( item.optgroup !== currentOptgroup ) {
        +				li = $( "<li>", {
        +					text: item.optgroup
        +				} );
        +				that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
        +					( item.element.parent( "optgroup" ).prop( "disabled" ) ?
        +						" ui-state-disabled" :
        +						"" ) );
        +
        +				li.appendTo( ul );
        +
        +				currentOptgroup = item.optgroup;
        +			}
        +
        +			that._renderItemData( ul, item );
        +		} );
        +	},
        +
        +	_renderItemData: function( ul, item ) {
        +		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
        +	},
        +
        +	_renderItem: function( ul, item ) {
        +		var li = $( "<li>" ),
        +			wrapper = $( "<div>", {
        +				title: item.element.attr( "title" )
        +			} );
        +
        +		if ( item.disabled ) {
        +			this._addClass( li, null, "ui-state-disabled" );
        +		}
        +		this._setText( wrapper, item.label );
        +
        +		return li.append( wrapper ).appendTo( ul );
        +	},
        +
        +	_setText: function( element, value ) {
        +		if ( value ) {
        +			element.text( value );
        +		} else {
        +			element.html( "&#160;" );
        +		}
        +	},
        +
        +	_move: function( direction, event ) {
        +		var item, next,
        +			filter = ".ui-menu-item";
        +
        +		if ( this.isOpen ) {
        +			item = this.menuItems.eq( this.focusIndex ).parent( "li" );
        +		} else {
        +			item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
        +			filter += ":not(.ui-state-disabled)";
        +		}
        +
        +		if ( direction === "first" || direction === "last" ) {
        +			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
        +		} else {
        +			next = item[ direction + "All" ]( filter ).eq( 0 );
        +		}
        +
        +		if ( next.length ) {
        +			this.menuInstance.focus( event, next );
        +		}
        +	},
        +
        +	_getSelectedItem: function() {
        +		return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
        +	},
        +
        +	_toggle: function( event ) {
        +		this[ this.isOpen ? "close" : "open" ]( event );
        +	},
        +
        +	_setSelection: function() {
        +		var selection;
        +
        +		if ( !this.range ) {
        +			return;
        +		}
        +
        +		if ( window.getSelection ) {
        +			selection = window.getSelection();
        +			selection.removeAllRanges();
        +			selection.addRange( this.range );
        +
        +		// Support: IE8
        +		} else {
        +			this.range.select();
        +		}
        +
        +		// Support: IE
        +		// Setting the text selection kills the button focus in IE, but
        +		// restoring the focus doesn't kill the selection.
        +		this.button.focus();
        +	},
        +
        +	_documentClick: {
        +		mousedown: function( event ) {
        +			if ( !this.isOpen ) {
        +				return;
        +			}
        +
        +			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" +
        +					$.ui.escapeSelector( this.ids.button ) ).length ) {
        +				this.close( event );
        +			}
        +		}
        +	},
        +
        +	_buttonEvents: {
        +
        +		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
        +		mousedown: function() {
        +			var selection;
        +
        +			if ( window.getSelection ) {
        +				selection = window.getSelection();
        +				if ( selection.rangeCount ) {
        +					this.range = selection.getRangeAt( 0 );
        +				}
        +
        +			// Support: IE8
        +			} else {
        +				this.range = document.selection.createRange();
        +			}
        +		},
        +
        +		click: function( event ) {
        +			this._setSelection();
        +			this._toggle( event );
        +		},
        +
        +		keydown: function( event ) {
        +			var preventDefault = true;
        +			switch ( event.keyCode ) {
        +			case $.ui.keyCode.TAB:
        +			case $.ui.keyCode.ESCAPE:
        +				this.close( event );
        +				preventDefault = false;
        +				break;
        +			case $.ui.keyCode.ENTER:
        +				if ( this.isOpen ) {
        +					this._selectFocusedItem( event );
        +				}
        +				break;
        +			case $.ui.keyCode.UP:
        +				if ( event.altKey ) {
        +					this._toggle( event );
        +				} else {
        +					this._move( "prev", event );
        +				}
        +				break;
        +			case $.ui.keyCode.DOWN:
        +				if ( event.altKey ) {
        +					this._toggle( event );
        +				} else {
        +					this._move( "next", event );
        +				}
        +				break;
        +			case $.ui.keyCode.SPACE:
        +				if ( this.isOpen ) {
        +					this._selectFocusedItem( event );
        +				} else {
        +					this._toggle( event );
        +				}
        +				break;
        +			case $.ui.keyCode.LEFT:
        +				this._move( "prev", event );
        +				break;
        +			case $.ui.keyCode.RIGHT:
        +				this._move( "next", event );
        +				break;
        +			case $.ui.keyCode.HOME:
        +			case $.ui.keyCode.PAGE_UP:
        +				this._move( "first", event );
        +				break;
        +			case $.ui.keyCode.END:
        +			case $.ui.keyCode.PAGE_DOWN:
        +				this._move( "last", event );
        +				break;
        +			default:
        +				this.menu.trigger( event );
        +				preventDefault = false;
        +			}
        +
        +			if ( preventDefault ) {
        +				event.preventDefault();
        +			}
        +		}
        +	},
        +
        +	_selectFocusedItem: function( event ) {
        +		var item = this.menuItems.eq( this.focusIndex ).parent( "li" );
        +		if ( !item.hasClass( "ui-state-disabled" ) ) {
        +			this._select( item.data( "ui-selectmenu-item" ), event );
        +		}
        +	},
        +
        +	_select: function( item, event ) {
        +		var oldIndex = this.element[ 0 ].selectedIndex;
        +
        +		// Change native select element
        +		this.element[ 0 ].selectedIndex = item.index;
        +		this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );
        +		this._setAria( item );
        +		this._trigger( "select", event, { item: item } );
        +
        +		if ( item.index !== oldIndex ) {
        +			this._trigger( "change", event, { item: item } );
        +		}
        +
        +		this.close( event );
        +	},
        +
        +	_setAria: function( item ) {
        +		var id = this.menuItems.eq( item.index ).attr( "id" );
        +
        +		this.button.attr( {
        +			"aria-labelledby": id,
        +			"aria-activedescendant": id
        +		} );
        +		this.menu.attr( "aria-activedescendant", id );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "icons" ) {
        +			var icon = this.button.find( "span.ui-icon" );
        +			this._removeClass( icon, null, this.options.icons.button )
        +				._addClass( icon, null, value.button );
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "appendTo" ) {
        +			this.menuWrap.appendTo( this._appendTo() );
        +		}
        +
        +		if ( key === "width" ) {
        +			this._resizeButton();
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this.menuInstance.option( "disabled", value );
        +		this.button.attr( "aria-disabled", value );
        +		this._toggleClass( this.button, null, "ui-state-disabled", value );
        +
        +		this.element.prop( "disabled", value );
        +		if ( value ) {
        +			this.button.attr( "tabindex", -1 );
        +			this.close();
        +		} else {
        +			this.button.attr( "tabindex", 0 );
        +		}
        +	},
        +
        +	_appendTo: function() {
        +		var element = this.options.appendTo;
        +
        +		if ( element ) {
        +			element = element.jquery || element.nodeType ?
        +				$( element ) :
        +				this.document.find( element ).eq( 0 );
        +		}
        +
        +		if ( !element || !element[ 0 ] ) {
        +			element = this.element.closest( ".ui-front, dialog" );
        +		}
        +
        +		if ( !element.length ) {
        +			element = this.document[ 0 ].body;
        +		}
        +
        +		return element;
        +	},
        +
        +	_toggleAttr: function() {
        +		this.button.attr( "aria-expanded", this.isOpen );
        +
        +		// We can't use two _toggleClass() calls here, because we need to make sure
        +		// we always remove classes first and add them second, otherwise if both classes have the
        +		// same theme class, it will be removed after we add it.
        +		this._removeClass( this.button, "ui-selectmenu-button-" +
        +			( this.isOpen ? "closed" : "open" ) )
        +			._addClass( this.button, "ui-selectmenu-button-" +
        +				( this.isOpen ? "open" : "closed" ) )
        +			._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
        +
        +		this.menu.attr( "aria-hidden", !this.isOpen );
        +	},
        +
        +	_resizeButton: function() {
        +		var width = this.options.width;
        +
        +		// For `width: false`, just remove inline style and stop
        +		if ( width === false ) {
        +			this.button.css( "width", "" );
        +			return;
        +		}
        +
        +		// For `width: null`, match the width of the original element
        +		if ( width === null ) {
        +			width = this.element.show().outerWidth();
        +			this.element.hide();
        +		}
        +
        +		this.button.outerWidth( width );
        +	},
        +
        +	_resizeMenu: function() {
        +		this.menu.outerWidth( Math.max(
        +			this.button.outerWidth(),
        +
        +			// Support: IE10
        +			// IE10 wraps long text (possibly a rounding bug)
        +			// so we add 1px to avoid the wrapping
        +			this.menu.width( "" ).outerWidth() + 1
        +		) );
        +	},
        +
        +	_getCreateOptions: function() {
        +		var options = this._super();
        +
        +		options.disabled = this.element.prop( "disabled" );
        +
        +		return options;
        +	},
        +
        +	_parseOptions: function( options ) {
        +		var that = this,
        +			data = [];
        +		options.each( function( index, item ) {
        +			data.push( that._parseOption( $( item ), index ) );
        +		} );
        +		this.items = data;
        +	},
        +
        +	_parseOption: function( option, index ) {
        +		var optgroup = option.parent( "optgroup" );
        +
        +		return {
        +			element: option,
        +			index: index,
        +			value: option.val(),
        +			label: option.text(),
        +			optgroup: optgroup.attr( "label" ) || "",
        +			disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
        +		};
        +	},
        +
        +	_destroy: function() {
        +		this._unbindFormResetHandler();
        +		this.menuWrap.remove();
        +		this.button.remove();
        +		this.element.show();
        +		this.element.removeUniqueId();
        +		this.labels.attr( "for", this.ids.element );
        +	}
        +} ] );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/slider.js b/bower_components/jquery-ui/ui/widgets/slider.js
        new file mode 100644
        index 0000000000..dc5e66d1fa
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/slider.js
        @@ -0,0 +1,752 @@
        +/*!
        + * jQuery UI Slider 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Slider
        +//>>group: Widgets
        +//>>description: Displays a flexible slider with ranges and accessibility via keyboard.
        +//>>docs: http://api.jqueryui.com/slider/
        +//>>demos: http://jqueryui.com/slider/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/slider.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./mouse",
        +			"../keycode",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.widget( "ui.slider", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "slide",
        +
        +	options: {
        +		animate: false,
        +		classes: {
        +			"ui-slider": "ui-corner-all",
        +			"ui-slider-handle": "ui-corner-all",
        +
        +			// Note: ui-widget-header isn't the most fittingly semantic framework class for this
        +			// element, but worked best visually with a variety of themes
        +			"ui-slider-range": "ui-corner-all ui-widget-header"
        +		},
        +		distance: 0,
        +		max: 100,
        +		min: 0,
        +		orientation: "horizontal",
        +		range: false,
        +		step: 1,
        +		value: 0,
        +		values: null,
        +
        +		// Callbacks
        +		change: null,
        +		slide: null,
        +		start: null,
        +		stop: null
        +	},
        +
        +	// Number of pages in a slider
        +	// (how many times can you page up/down to go through the whole range)
        +	numPages: 5,
        +
        +	_create: function() {
        +		this._keySliding = false;
        +		this._mouseSliding = false;
        +		this._animateOff = true;
        +		this._handleIndex = null;
        +		this._detectOrientation();
        +		this._mouseInit();
        +		this._calculateNewMax();
        +
        +		this._addClass( "ui-slider ui-slider-" + this.orientation,
        +			"ui-widget ui-widget-content" );
        +
        +		this._refresh();
        +
        +		this._animateOff = false;
        +	},
        +
        +	_refresh: function() {
        +		this._createRange();
        +		this._createHandles();
        +		this._setupEvents();
        +		this._refreshValue();
        +	},
        +
        +	_createHandles: function() {
        +		var i, handleCount,
        +			options = this.options,
        +			existingHandles = this.element.find( ".ui-slider-handle" ),
        +			handle = "<span tabindex='0'></span>",
        +			handles = [];
        +
        +		handleCount = ( options.values && options.values.length ) || 1;
        +
        +		if ( existingHandles.length > handleCount ) {
        +			existingHandles.slice( handleCount ).remove();
        +			existingHandles = existingHandles.slice( 0, handleCount );
        +		}
        +
        +		for ( i = existingHandles.length; i < handleCount; i++ ) {
        +			handles.push( handle );
        +		}
        +
        +		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
        +
        +		this._addClass( this.handles, "ui-slider-handle", "ui-state-default" );
        +
        +		this.handle = this.handles.eq( 0 );
        +
        +		this.handles.each( function( i ) {
        +			$( this )
        +				.data( "ui-slider-handle-index", i )
        +				.attr( "tabIndex", 0 );
        +		} );
        +	},
        +
        +	_createRange: function() {
        +		var options = this.options;
        +
        +		if ( options.range ) {
        +			if ( options.range === true ) {
        +				if ( !options.values ) {
        +					options.values = [ this._valueMin(), this._valueMin() ];
        +				} else if ( options.values.length && options.values.length !== 2 ) {
        +					options.values = [ options.values[ 0 ], options.values[ 0 ] ];
        +				} else if ( $.isArray( options.values ) ) {
        +					options.values = options.values.slice( 0 );
        +				}
        +			}
        +
        +			if ( !this.range || !this.range.length ) {
        +				this.range = $( "<div>" )
        +					.appendTo( this.element );
        +
        +				this._addClass( this.range, "ui-slider-range" );
        +			} else {
        +				this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" );
        +
        +				// Handle range switching from true to min/max
        +				this.range.css( {
        +					"left": "",
        +					"bottom": ""
        +				} );
        +			}
        +			if ( options.range === "min" || options.range === "max" ) {
        +				this._addClass( this.range, "ui-slider-range-" + options.range );
        +			}
        +		} else {
        +			if ( this.range ) {
        +				this.range.remove();
        +			}
        +			this.range = null;
        +		}
        +	},
        +
        +	_setupEvents: function() {
        +		this._off( this.handles );
        +		this._on( this.handles, this._handleEvents );
        +		this._hoverable( this.handles );
        +		this._focusable( this.handles );
        +	},
        +
        +	_destroy: function() {
        +		this.handles.remove();
        +		if ( this.range ) {
        +			this.range.remove();
        +		}
        +
        +		this._mouseDestroy();
        +	},
        +
        +	_mouseCapture: function( event ) {
        +		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
        +			that = this,
        +			o = this.options;
        +
        +		if ( o.disabled ) {
        +			return false;
        +		}
        +
        +		this.elementSize = {
        +			width: this.element.outerWidth(),
        +			height: this.element.outerHeight()
        +		};
        +		this.elementOffset = this.element.offset();
        +
        +		position = { x: event.pageX, y: event.pageY };
        +		normValue = this._normValueFromMouse( position );
        +		distance = this._valueMax() - this._valueMin() + 1;
        +		this.handles.each( function( i ) {
        +			var thisDistance = Math.abs( normValue - that.values( i ) );
        +			if ( ( distance > thisDistance ) ||
        +				( distance === thisDistance &&
        +					( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {
        +				distance = thisDistance;
        +				closestHandle = $( this );
        +				index = i;
        +			}
        +		} );
        +
        +		allowed = this._start( event, index );
        +		if ( allowed === false ) {
        +			return false;
        +		}
        +		this._mouseSliding = true;
        +
        +		this._handleIndex = index;
        +
        +		this._addClass( closestHandle, null, "ui-state-active" );
        +		closestHandle.trigger( "focus" );
        +
        +		offset = closestHandle.offset();
        +		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
        +		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
        +			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
        +			top: event.pageY - offset.top -
        +				( closestHandle.height() / 2 ) -
        +				( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) -
        +				( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) +
        +				( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 )
        +		};
        +
        +		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
        +			this._slide( event, index, normValue );
        +		}
        +		this._animateOff = true;
        +		return true;
        +	},
        +
        +	_mouseStart: function() {
        +		return true;
        +	},
        +
        +	_mouseDrag: function( event ) {
        +		var position = { x: event.pageX, y: event.pageY },
        +			normValue = this._normValueFromMouse( position );
        +
        +		this._slide( event, this._handleIndex, normValue );
        +
        +		return false;
        +	},
        +
        +	_mouseStop: function( event ) {
        +		this._removeClass( this.handles, null, "ui-state-active" );
        +		this._mouseSliding = false;
        +
        +		this._stop( event, this._handleIndex );
        +		this._change( event, this._handleIndex );
        +
        +		this._handleIndex = null;
        +		this._clickOffset = null;
        +		this._animateOff = false;
        +
        +		return false;
        +	},
        +
        +	_detectOrientation: function() {
        +		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
        +	},
        +
        +	_normValueFromMouse: function( position ) {
        +		var pixelTotal,
        +			pixelMouse,
        +			percentMouse,
        +			valueTotal,
        +			valueMouse;
        +
        +		if ( this.orientation === "horizontal" ) {
        +			pixelTotal = this.elementSize.width;
        +			pixelMouse = position.x - this.elementOffset.left -
        +				( this._clickOffset ? this._clickOffset.left : 0 );
        +		} else {
        +			pixelTotal = this.elementSize.height;
        +			pixelMouse = position.y - this.elementOffset.top -
        +				( this._clickOffset ? this._clickOffset.top : 0 );
        +		}
        +
        +		percentMouse = ( pixelMouse / pixelTotal );
        +		if ( percentMouse > 1 ) {
        +			percentMouse = 1;
        +		}
        +		if ( percentMouse < 0 ) {
        +			percentMouse = 0;
        +		}
        +		if ( this.orientation === "vertical" ) {
        +			percentMouse = 1 - percentMouse;
        +		}
        +
        +		valueTotal = this._valueMax() - this._valueMin();
        +		valueMouse = this._valueMin() + percentMouse * valueTotal;
        +
        +		return this._trimAlignValue( valueMouse );
        +	},
        +
        +	_uiHash: function( index, value, values ) {
        +		var uiHash = {
        +			handle: this.handles[ index ],
        +			handleIndex: index,
        +			value: value !== undefined ? value : this.value()
        +		};
        +
        +		if ( this._hasMultipleValues() ) {
        +			uiHash.value = value !== undefined ? value : this.values( index );
        +			uiHash.values = values || this.values();
        +		}
        +
        +		return uiHash;
        +	},
        +
        +	_hasMultipleValues: function() {
        +		return this.options.values && this.options.values.length;
        +	},
        +
        +	_start: function( event, index ) {
        +		return this._trigger( "start", event, this._uiHash( index ) );
        +	},
        +
        +	_slide: function( event, index, newVal ) {
        +		var allowed, otherVal,
        +			currentValue = this.value(),
        +			newValues = this.values();
        +
        +		if ( this._hasMultipleValues() ) {
        +			otherVal = this.values( index ? 0 : 1 );
        +			currentValue = this.values( index );
        +
        +			if ( this.options.values.length === 2 && this.options.range === true ) {
        +				newVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );
        +			}
        +
        +			newValues[ index ] = newVal;
        +		}
        +
        +		if ( newVal === currentValue ) {
        +			return;
        +		}
        +
        +		allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) );
        +
        +		// A slide can be canceled by returning false from the slide callback
        +		if ( allowed === false ) {
        +			return;
        +		}
        +
        +		if ( this._hasMultipleValues() ) {
        +			this.values( index, newVal );
        +		} else {
        +			this.value( newVal );
        +		}
        +	},
        +
        +	_stop: function( event, index ) {
        +		this._trigger( "stop", event, this._uiHash( index ) );
        +	},
        +
        +	_change: function( event, index ) {
        +		if ( !this._keySliding && !this._mouseSliding ) {
        +
        +			//store the last changed value index for reference when handles overlap
        +			this._lastChangedValue = index;
        +			this._trigger( "change", event, this._uiHash( index ) );
        +		}
        +	},
        +
        +	value: function( newValue ) {
        +		if ( arguments.length ) {
        +			this.options.value = this._trimAlignValue( newValue );
        +			this._refreshValue();
        +			this._change( null, 0 );
        +			return;
        +		}
        +
        +		return this._value();
        +	},
        +
        +	values: function( index, newValue ) {
        +		var vals,
        +			newValues,
        +			i;
        +
        +		if ( arguments.length > 1 ) {
        +			this.options.values[ index ] = this._trimAlignValue( newValue );
        +			this._refreshValue();
        +			this._change( null, index );
        +			return;
        +		}
        +
        +		if ( arguments.length ) {
        +			if ( $.isArray( arguments[ 0 ] ) ) {
        +				vals = this.options.values;
        +				newValues = arguments[ 0 ];
        +				for ( i = 0; i < vals.length; i += 1 ) {
        +					vals[ i ] = this._trimAlignValue( newValues[ i ] );
        +					this._change( null, i );
        +				}
        +				this._refreshValue();
        +			} else {
        +				if ( this._hasMultipleValues() ) {
        +					return this._values( index );
        +				} else {
        +					return this.value();
        +				}
        +			}
        +		} else {
        +			return this._values();
        +		}
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var i,
        +			valsLength = 0;
        +
        +		if ( key === "range" && this.options.range === true ) {
        +			if ( value === "min" ) {
        +				this.options.value = this._values( 0 );
        +				this.options.values = null;
        +			} else if ( value === "max" ) {
        +				this.options.value = this._values( this.options.values.length - 1 );
        +				this.options.values = null;
        +			}
        +		}
        +
        +		if ( $.isArray( this.options.values ) ) {
        +			valsLength = this.options.values.length;
        +		}
        +
        +		this._super( key, value );
        +
        +		switch ( key ) {
        +			case "orientation":
        +				this._detectOrientation();
        +				this._removeClass( "ui-slider-horizontal ui-slider-vertical" )
        +					._addClass( "ui-slider-" + this.orientation );
        +				this._refreshValue();
        +				if ( this.options.range ) {
        +					this._refreshRange( value );
        +				}
        +
        +				// Reset positioning from previous orientation
        +				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
        +				break;
        +			case "value":
        +				this._animateOff = true;
        +				this._refreshValue();
        +				this._change( null, 0 );
        +				this._animateOff = false;
        +				break;
        +			case "values":
        +				this._animateOff = true;
        +				this._refreshValue();
        +
        +				// Start from the last handle to prevent unreachable handles (#9046)
        +				for ( i = valsLength - 1; i >= 0; i-- ) {
        +					this._change( null, i );
        +				}
        +				this._animateOff = false;
        +				break;
        +			case "step":
        +			case "min":
        +			case "max":
        +				this._animateOff = true;
        +				this._calculateNewMax();
        +				this._refreshValue();
        +				this._animateOff = false;
        +				break;
        +			case "range":
        +				this._animateOff = true;
        +				this._refresh();
        +				this._animateOff = false;
        +				break;
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this._toggleClass( null, "ui-state-disabled", !!value );
        +	},
        +
        +	//internal value getter
        +	// _value() returns value trimmed by min and max, aligned by step
        +	_value: function() {
        +		var val = this.options.value;
        +		val = this._trimAlignValue( val );
        +
        +		return val;
        +	},
        +
        +	//internal values getter
        +	// _values() returns array of values trimmed by min and max, aligned by step
        +	// _values( index ) returns single value trimmed by min and max, aligned by step
        +	_values: function( index ) {
        +		var val,
        +			vals,
        +			i;
        +
        +		if ( arguments.length ) {
        +			val = this.options.values[ index ];
        +			val = this._trimAlignValue( val );
        +
        +			return val;
        +		} else if ( this._hasMultipleValues() ) {
        +
        +			// .slice() creates a copy of the array
        +			// this copy gets trimmed by min and max and then returned
        +			vals = this.options.values.slice();
        +			for ( i = 0; i < vals.length; i += 1 ) {
        +				vals[ i ] = this._trimAlignValue( vals[ i ] );
        +			}
        +
        +			return vals;
        +		} else {
        +			return [];
        +		}
        +	},
        +
        +	// Returns the step-aligned value that val is closest to, between (inclusive) min and max
        +	_trimAlignValue: function( val ) {
        +		if ( val <= this._valueMin() ) {
        +			return this._valueMin();
        +		}
        +		if ( val >= this._valueMax() ) {
        +			return this._valueMax();
        +		}
        +		var step = ( this.options.step > 0 ) ? this.options.step : 1,
        +			valModStep = ( val - this._valueMin() ) % step,
        +			alignValue = val - valModStep;
        +
        +		if ( Math.abs( valModStep ) * 2 >= step ) {
        +			alignValue += ( valModStep > 0 ) ? step : ( -step );
        +		}
        +
        +		// Since JavaScript has problems with large floats, round
        +		// the final value to 5 digits after the decimal point (see #4124)
        +		return parseFloat( alignValue.toFixed( 5 ) );
        +	},
        +
        +	_calculateNewMax: function() {
        +		var max = this.options.max,
        +			min = this._valueMin(),
        +			step = this.options.step,
        +			aboveMin = Math.round( ( max - min ) / step ) * step;
        +		max = aboveMin + min;
        +		if ( max > this.options.max ) {
        +
        +			//If max is not divisible by step, rounding off may increase its value
        +			max -= step;
        +		}
        +		this.max = parseFloat( max.toFixed( this._precision() ) );
        +	},
        +
        +	_precision: function() {
        +		var precision = this._precisionOf( this.options.step );
        +		if ( this.options.min !== null ) {
        +			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        +		}
        +		return precision;
        +	},
        +
        +	_precisionOf: function( num ) {
        +		var str = num.toString(),
        +			decimal = str.indexOf( "." );
        +		return decimal === -1 ? 0 : str.length - decimal - 1;
        +	},
        +
        +	_valueMin: function() {
        +		return this.options.min;
        +	},
        +
        +	_valueMax: function() {
        +		return this.max;
        +	},
        +
        +	_refreshRange: function( orientation ) {
        +		if ( orientation === "vertical" ) {
        +			this.range.css( { "width": "", "left": "" } );
        +		}
        +		if ( orientation === "horizontal" ) {
        +			this.range.css( { "height": "", "bottom": "" } );
        +		}
        +	},
        +
        +	_refreshValue: function() {
        +		var lastValPercent, valPercent, value, valueMin, valueMax,
        +			oRange = this.options.range,
        +			o = this.options,
        +			that = this,
        +			animate = ( !this._animateOff ) ? o.animate : false,
        +			_set = {};
        +
        +		if ( this._hasMultipleValues() ) {
        +			this.handles.each( function( i ) {
        +				valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -
        +					that._valueMin() ) * 100;
        +				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        +				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        +				if ( that.options.range === true ) {
        +					if ( that.orientation === "horizontal" ) {
        +						if ( i === 0 ) {
        +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +								left: valPercent + "%"
        +							}, o.animate );
        +						}
        +						if ( i === 1 ) {
        +							that.range[ animate ? "animate" : "css" ]( {
        +								width: ( valPercent - lastValPercent ) + "%"
        +							}, {
        +								queue: false,
        +								duration: o.animate
        +							} );
        +						}
        +					} else {
        +						if ( i === 0 ) {
        +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +								bottom: ( valPercent ) + "%"
        +							}, o.animate );
        +						}
        +						if ( i === 1 ) {
        +							that.range[ animate ? "animate" : "css" ]( {
        +								height: ( valPercent - lastValPercent ) + "%"
        +							}, {
        +								queue: false,
        +								duration: o.animate
        +							} );
        +						}
        +					}
        +				}
        +				lastValPercent = valPercent;
        +			} );
        +		} else {
        +			value = this.value();
        +			valueMin = this._valueMin();
        +			valueMax = this._valueMax();
        +			valPercent = ( valueMax !== valueMin ) ?
        +					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
        +					0;
        +			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        +			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        +
        +			if ( oRange === "min" && this.orientation === "horizontal" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					width: valPercent + "%"
        +				}, o.animate );
        +			}
        +			if ( oRange === "max" && this.orientation === "horizontal" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					width: ( 100 - valPercent ) + "%"
        +				}, o.animate );
        +			}
        +			if ( oRange === "min" && this.orientation === "vertical" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					height: valPercent + "%"
        +				}, o.animate );
        +			}
        +			if ( oRange === "max" && this.orientation === "vertical" ) {
        +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
        +					height: ( 100 - valPercent ) + "%"
        +				}, o.animate );
        +			}
        +		}
        +	},
        +
        +	_handleEvents: {
        +		keydown: function( event ) {
        +			var allowed, curVal, newVal, step,
        +				index = $( event.target ).data( "ui-slider-handle-index" );
        +
        +			switch ( event.keyCode ) {
        +				case $.ui.keyCode.HOME:
        +				case $.ui.keyCode.END:
        +				case $.ui.keyCode.PAGE_UP:
        +				case $.ui.keyCode.PAGE_DOWN:
        +				case $.ui.keyCode.UP:
        +				case $.ui.keyCode.RIGHT:
        +				case $.ui.keyCode.DOWN:
        +				case $.ui.keyCode.LEFT:
        +					event.preventDefault();
        +					if ( !this._keySliding ) {
        +						this._keySliding = true;
        +						this._addClass( $( event.target ), null, "ui-state-active" );
        +						allowed = this._start( event, index );
        +						if ( allowed === false ) {
        +							return;
        +						}
        +					}
        +					break;
        +			}
        +
        +			step = this.options.step;
        +			if ( this._hasMultipleValues() ) {
        +				curVal = newVal = this.values( index );
        +			} else {
        +				curVal = newVal = this.value();
        +			}
        +
        +			switch ( event.keyCode ) {
        +				case $.ui.keyCode.HOME:
        +					newVal = this._valueMin();
        +					break;
        +				case $.ui.keyCode.END:
        +					newVal = this._valueMax();
        +					break;
        +				case $.ui.keyCode.PAGE_UP:
        +					newVal = this._trimAlignValue(
        +						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
        +					);
        +					break;
        +				case $.ui.keyCode.PAGE_DOWN:
        +					newVal = this._trimAlignValue(
        +						curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );
        +					break;
        +				case $.ui.keyCode.UP:
        +				case $.ui.keyCode.RIGHT:
        +					if ( curVal === this._valueMax() ) {
        +						return;
        +					}
        +					newVal = this._trimAlignValue( curVal + step );
        +					break;
        +				case $.ui.keyCode.DOWN:
        +				case $.ui.keyCode.LEFT:
        +					if ( curVal === this._valueMin() ) {
        +						return;
        +					}
        +					newVal = this._trimAlignValue( curVal - step );
        +					break;
        +			}
        +
        +			this._slide( event, index, newVal );
        +		},
        +		keyup: function( event ) {
        +			var index = $( event.target ).data( "ui-slider-handle-index" );
        +
        +			if ( this._keySliding ) {
        +				this._keySliding = false;
        +				this._stop( event, index );
        +				this._change( event, index );
        +				this._removeClass( $( event.target ), null, "ui-state-active" );
        +			}
        +		}
        +	}
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/sortable.js b/bower_components/jquery-ui/ui/widgets/sortable.js
        new file mode 100644
        index 0000000000..33c2fb7665
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/sortable.js
        @@ -0,0 +1,1554 @@
        +/*!
        + * jQuery UI Sortable 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Sortable
        +//>>group: Interactions
        +//>>description: Enables items in a list to be sorted using the mouse.
        +//>>docs: http://api.jqueryui.com/sortable/
        +//>>demos: http://jqueryui.com/sortable/
        +//>>css.structure: ../../themes/base/sortable.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./mouse",
        +			"../data",
        +			"../ie",
        +			"../scroll-parent",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +return $.widget( "ui.sortable", $.ui.mouse, {
        +	version: "1.12.1",
        +	widgetEventPrefix: "sort",
        +	ready: false,
        +	options: {
        +		appendTo: "parent",
        +		axis: false,
        +		connectWith: false,
        +		containment: false,
        +		cursor: "auto",
        +		cursorAt: false,
        +		dropOnEmpty: true,
        +		forcePlaceholderSize: false,
        +		forceHelperSize: false,
        +		grid: false,
        +		handle: false,
        +		helper: "original",
        +		items: "> *",
        +		opacity: false,
        +		placeholder: false,
        +		revert: false,
        +		scroll: true,
        +		scrollSensitivity: 20,
        +		scrollSpeed: 20,
        +		scope: "default",
        +		tolerance: "intersect",
        +		zIndex: 1000,
        +
        +		// Callbacks
        +		activate: null,
        +		beforeStop: null,
        +		change: null,
        +		deactivate: null,
        +		out: null,
        +		over: null,
        +		receive: null,
        +		remove: null,
        +		sort: null,
        +		start: null,
        +		stop: null,
        +		update: null
        +	},
        +
        +	_isOverAxis: function( x, reference, size ) {
        +		return ( x >= reference ) && ( x < ( reference + size ) );
        +	},
        +
        +	_isFloating: function( item ) {
        +		return ( /left|right/ ).test( item.css( "float" ) ) ||
        +			( /inline|table-cell/ ).test( item.css( "display" ) );
        +	},
        +
        +	_create: function() {
        +		this.containerCache = {};
        +		this._addClass( "ui-sortable" );
        +
        +		//Get the items
        +		this.refresh();
        +
        +		//Let's determine the parent's offset
        +		this.offset = this.element.offset();
        +
        +		//Initialize mouse events for interaction
        +		this._mouseInit();
        +
        +		this._setHandleClassName();
        +
        +		//We're ready to go
        +		this.ready = true;
        +
        +	},
        +
        +	_setOption: function( key, value ) {
        +		this._super( key, value );
        +
        +		if ( key === "handle" ) {
        +			this._setHandleClassName();
        +		}
        +	},
        +
        +	_setHandleClassName: function() {
        +		var that = this;
        +		this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
        +		$.each( this.items, function() {
        +			that._addClass(
        +				this.instance.options.handle ?
        +					this.item.find( this.instance.options.handle ) :
        +					this.item,
        +				"ui-sortable-handle"
        +			);
        +		} );
        +	},
        +
        +	_destroy: function() {
        +		this._mouseDestroy();
        +
        +		for ( var i = this.items.length - 1; i >= 0; i-- ) {
        +			this.items[ i ].item.removeData( this.widgetName + "-item" );
        +		}
        +
        +		return this;
        +	},
        +
        +	_mouseCapture: function( event, overrideHandle ) {
        +		var currentItem = null,
        +			validHandle = false,
        +			that = this;
        +
        +		if ( this.reverting ) {
        +			return false;
        +		}
        +
        +		if ( this.options.disabled || this.options.type === "static" ) {
        +			return false;
        +		}
        +
        +		//We have to refresh the items data once first
        +		this._refreshItems( event );
        +
        +		//Find out if the clicked node (or one of its parents) is a actual item in this.items
        +		$( event.target ).parents().each( function() {
        +			if ( $.data( this, that.widgetName + "-item" ) === that ) {
        +				currentItem = $( this );
        +				return false;
        +			}
        +		} );
        +		if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
        +			currentItem = $( event.target );
        +		}
        +
        +		if ( !currentItem ) {
        +			return false;
        +		}
        +		if ( this.options.handle && !overrideHandle ) {
        +			$( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
        +				if ( this === event.target ) {
        +					validHandle = true;
        +				}
        +			} );
        +			if ( !validHandle ) {
        +				return false;
        +			}
        +		}
        +
        +		this.currentItem = currentItem;
        +		this._removeCurrentsFromItems();
        +		return true;
        +
        +	},
        +
        +	_mouseStart: function( event, overrideHandle, noActivation ) {
        +
        +		var i, body,
        +			o = this.options;
        +
        +		this.currentContainer = this;
        +
        +		//We only need to call refreshPositions, because the refreshItems call has been moved to
        +		// mouseCapture
        +		this.refreshPositions();
        +
        +		//Create and append the visible helper
        +		this.helper = this._createHelper( event );
        +
        +		//Cache the helper size
        +		this._cacheHelperProportions();
        +
        +		/*
        +		 * - Position generation -
        +		 * This block generates everything position related - it's the core of draggables.
        +		 */
        +
        +		//Cache the margins of the original element
        +		this._cacheMargins();
        +
        +		//Get the next scrolling parent
        +		this.scrollParent = this.helper.scrollParent();
        +
        +		//The element's absolute position on the page minus margins
        +		this.offset = this.currentItem.offset();
        +		this.offset = {
        +			top: this.offset.top - this.margins.top,
        +			left: this.offset.left - this.margins.left
        +		};
        +
        +		$.extend( this.offset, {
        +			click: { //Where the click happened, relative to the element
        +				left: event.pageX - this.offset.left,
        +				top: event.pageY - this.offset.top
        +			},
        +			parent: this._getParentOffset(),
        +
        +			// This is a relative to absolute position minus the actual position calculation -
        +			// only used for relative positioned helper
        +			relative: this._getRelativeOffset()
        +		} );
        +
        +		// Only after we got the offset, we can change the helper's position to absolute
        +		// TODO: Still need to figure out a way to make relative sorting possible
        +		this.helper.css( "position", "absolute" );
        +		this.cssPosition = this.helper.css( "position" );
        +
        +		//Generate the original position
        +		this.originalPosition = this._generatePosition( event );
        +		this.originalPageX = event.pageX;
        +		this.originalPageY = event.pageY;
        +
        +		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        +		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
        +
        +		//Cache the former DOM position
        +		this.domPosition = {
        +			prev: this.currentItem.prev()[ 0 ],
        +			parent: this.currentItem.parent()[ 0 ]
        +		};
        +
        +		// If the helper is not the original, hide the original so it's not playing any role during
        +		// the drag, won't cause anything bad this way
        +		if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
        +			this.currentItem.hide();
        +		}
        +
        +		//Create the placeholder
        +		this._createPlaceholder();
        +
        +		//Set a containment if given in the options
        +		if ( o.containment ) {
        +			this._setContainment();
        +		}
        +
        +		if ( o.cursor && o.cursor !== "auto" ) { // cursor option
        +			body = this.document.find( "body" );
        +
        +			// Support: IE
        +			this.storedCursor = body.css( "cursor" );
        +			body.css( "cursor", o.cursor );
        +
        +			this.storedStylesheet =
        +				$( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
        +		}
        +
        +		if ( o.opacity ) { // opacity option
        +			if ( this.helper.css( "opacity" ) ) {
        +				this._storedOpacity = this.helper.css( "opacity" );
        +			}
        +			this.helper.css( "opacity", o.opacity );
        +		}
        +
        +		if ( o.zIndex ) { // zIndex option
        +			if ( this.helper.css( "zIndex" ) ) {
        +				this._storedZIndex = this.helper.css( "zIndex" );
        +			}
        +			this.helper.css( "zIndex", o.zIndex );
        +		}
        +
        +		//Prepare scrolling
        +		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				this.scrollParent[ 0 ].tagName !== "HTML" ) {
        +			this.overflowOffset = this.scrollParent.offset();
        +		}
        +
        +		//Call callbacks
        +		this._trigger( "start", event, this._uiHash() );
        +
        +		//Recache the helper size
        +		if ( !this._preserveHelperProportions ) {
        +			this._cacheHelperProportions();
        +		}
        +
        +		//Post "activate" events to possible containers
        +		if ( !noActivation ) {
        +			for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
        +			}
        +		}
        +
        +		//Prepare possible droppables
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.current = this;
        +		}
        +
        +		if ( $.ui.ddmanager && !o.dropBehaviour ) {
        +			$.ui.ddmanager.prepareOffsets( this, event );
        +		}
        +
        +		this.dragging = true;
        +
        +		this._addClass( this.helper, "ui-sortable-helper" );
        +
        +		// Execute the drag once - this causes the helper not to be visiblebefore getting its
        +		// correct position
        +		this._mouseDrag( event );
        +		return true;
        +
        +	},
        +
        +	_mouseDrag: function( event ) {
        +		var i, item, itemElement, intersection,
        +			o = this.options,
        +			scrolled = false;
        +
        +		//Compute the helpers position
        +		this.position = this._generatePosition( event );
        +		this.positionAbs = this._convertPositionTo( "absolute" );
        +
        +		if ( !this.lastPositionAbs ) {
        +			this.lastPositionAbs = this.positionAbs;
        +		}
        +
        +		//Do scrolling
        +		if ( this.options.scroll ) {
        +			if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +					this.scrollParent[ 0 ].tagName !== "HTML" ) {
        +
        +				if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
        +						event.pageY < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollTop =
        +						scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
        +				} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollTop =
        +						scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
        +				}
        +
        +				if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
        +						event.pageX < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollLeft = scrolled =
        +						this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
        +				} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
        +					this.scrollParent[ 0 ].scrollLeft = scrolled =
        +						this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
        +				}
        +
        +			} else {
        +
        +				if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
        +					scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
        +				} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
        +				}
        +
        +				if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
        +					scrolled = this.document.scrollLeft(
        +						this.document.scrollLeft() - o.scrollSpeed
        +					);
        +				} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
        +						o.scrollSensitivity ) {
        +					scrolled = this.document.scrollLeft(
        +						this.document.scrollLeft() + o.scrollSpeed
        +					);
        +				}
        +
        +			}
        +
        +			if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
        +				$.ui.ddmanager.prepareOffsets( this, event );
        +			}
        +		}
        +
        +		//Regenerate the absolute position used for position checks
        +		this.positionAbs = this._convertPositionTo( "absolute" );
        +
        +		//Set the helper position
        +		if ( !this.options.axis || this.options.axis !== "y" ) {
        +			this.helper[ 0 ].style.left = this.position.left + "px";
        +		}
        +		if ( !this.options.axis || this.options.axis !== "x" ) {
        +			this.helper[ 0 ].style.top = this.position.top + "px";
        +		}
        +
        +		//Rearrange
        +		for ( i = this.items.length - 1; i >= 0; i-- ) {
        +
        +			//Cache variables and intersection, continue if no intersection
        +			item = this.items[ i ];
        +			itemElement = item.item[ 0 ];
        +			intersection = this._intersectsWithPointer( item );
        +			if ( !intersection ) {
        +				continue;
        +			}
        +
        +			// Only put the placeholder inside the current Container, skip all
        +			// items from other containers. This works because when moving
        +			// an item from one container to another the
        +			// currentContainer is switched before the placeholder is moved.
        +			//
        +			// Without this, moving items in "sub-sortables" can cause
        +			// the placeholder to jitter between the outer and inner container.
        +			if ( item.instance !== this.currentContainer ) {
        +				continue;
        +			}
        +
        +			// Cannot intersect with itself
        +			// no useless actions that have been done before
        +			// no action if the item moved is the parent of the item checked
        +			if ( itemElement !== this.currentItem[ 0 ] &&
        +				this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement &&
        +				!$.contains( this.placeholder[ 0 ], itemElement ) &&
        +				( this.options.type === "semi-dynamic" ?
        +					!$.contains( this.element[ 0 ], itemElement ) :
        +					true
        +				)
        +			) {
        +
        +				this.direction = intersection === 1 ? "down" : "up";
        +
        +				if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) {
        +					this._rearrange( event, item );
        +				} else {
        +					break;
        +				}
        +
        +				this._trigger( "change", event, this._uiHash() );
        +				break;
        +			}
        +		}
        +
        +		//Post events to containers
        +		this._contactContainers( event );
        +
        +		//Interconnect with droppables
        +		if ( $.ui.ddmanager ) {
        +			$.ui.ddmanager.drag( this, event );
        +		}
        +
        +		//Call callbacks
        +		this._trigger( "sort", event, this._uiHash() );
        +
        +		this.lastPositionAbs = this.positionAbs;
        +		return false;
        +
        +	},
        +
        +	_mouseStop: function( event, noPropagation ) {
        +
        +		if ( !event ) {
        +			return;
        +		}
        +
        +		//If we are using droppables, inform the manager about the drop
        +		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
        +			$.ui.ddmanager.drop( this, event );
        +		}
        +
        +		if ( this.options.revert ) {
        +			var that = this,
        +				cur = this.placeholder.offset(),
        +				axis = this.options.axis,
        +				animation = {};
        +
        +			if ( !axis || axis === "x" ) {
        +				animation.left = cur.left - this.offset.parent.left - this.margins.left +
        +					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
        +						0 :
        +						this.offsetParent[ 0 ].scrollLeft
        +					);
        +			}
        +			if ( !axis || axis === "y" ) {
        +				animation.top = cur.top - this.offset.parent.top - this.margins.top +
        +					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
        +						0 :
        +						this.offsetParent[ 0 ].scrollTop
        +					);
        +			}
        +			this.reverting = true;
        +			$( this.helper ).animate(
        +				animation,
        +				parseInt( this.options.revert, 10 ) || 500,
        +				function() {
        +					that._clear( event );
        +				}
        +			);
        +		} else {
        +			this._clear( event, noPropagation );
        +		}
        +
        +		return false;
        +
        +	},
        +
        +	cancel: function() {
        +
        +		if ( this.dragging ) {
        +
        +			this._mouseUp( new $.Event( "mouseup", { target: null } ) );
        +
        +			if ( this.options.helper === "original" ) {
        +				this.currentItem.css( this._storedCSS );
        +				this._removeClass( this.currentItem, "ui-sortable-helper" );
        +			} else {
        +				this.currentItem.show();
        +			}
        +
        +			//Post deactivating events to containers
        +			for ( var i = this.containers.length - 1; i >= 0; i-- ) {
        +				this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
        +				if ( this.containers[ i ].containerCache.over ) {
        +					this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
        +					this.containers[ i ].containerCache.over = 0;
        +				}
        +			}
        +
        +		}
        +
        +		if ( this.placeholder ) {
        +
        +			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
        +			// it unbinds ALL events from the original node!
        +			if ( this.placeholder[ 0 ].parentNode ) {
        +				this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
        +			}
        +			if ( this.options.helper !== "original" && this.helper &&
        +					this.helper[ 0 ].parentNode ) {
        +				this.helper.remove();
        +			}
        +
        +			$.extend( this, {
        +				helper: null,
        +				dragging: false,
        +				reverting: false,
        +				_noFinalSort: null
        +			} );
        +
        +			if ( this.domPosition.prev ) {
        +				$( this.domPosition.prev ).after( this.currentItem );
        +			} else {
        +				$( this.domPosition.parent ).prepend( this.currentItem );
        +			}
        +		}
        +
        +		return this;
        +
        +	},
        +
        +	serialize: function( o ) {
        +
        +		var items = this._getItemsAsjQuery( o && o.connected ),
        +			str = [];
        +		o = o || {};
        +
        +		$( items ).each( function() {
        +			var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
        +				.match( o.expression || ( /(.+)[\-=_](.+)/ ) );
        +			if ( res ) {
        +				str.push(
        +					( o.key || res[ 1 ] + "[]" ) +
        +					"=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
        +			}
        +		} );
        +
        +		if ( !str.length && o.key ) {
        +			str.push( o.key + "=" );
        +		}
        +
        +		return str.join( "&" );
        +
        +	},
        +
        +	toArray: function( o ) {
        +
        +		var items = this._getItemsAsjQuery( o && o.connected ),
        +			ret = [];
        +
        +		o = o || {};
        +
        +		items.each( function() {
        +			ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
        +		} );
        +		return ret;
        +
        +	},
        +
        +	/* Be careful with the following core functions */
        +	_intersectsWith: function( item ) {
        +
        +		var x1 = this.positionAbs.left,
        +			x2 = x1 + this.helperProportions.width,
        +			y1 = this.positionAbs.top,
        +			y2 = y1 + this.helperProportions.height,
        +			l = item.left,
        +			r = l + item.width,
        +			t = item.top,
        +			b = t + item.height,
        +			dyClick = this.offset.click.top,
        +			dxClick = this.offset.click.left,
        +			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
        +				( y1 + dyClick ) < b ),
        +			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
        +				( x1 + dxClick ) < r ),
        +			isOverElement = isOverElementHeight && isOverElementWidth;
        +
        +		if ( this.options.tolerance === "pointer" ||
        +			this.options.forcePointerForContainers ||
        +			( this.options.tolerance !== "pointer" &&
        +				this.helperProportions[ this.floating ? "width" : "height" ] >
        +				item[ this.floating ? "width" : "height" ] )
        +		) {
        +			return isOverElement;
        +		} else {
        +
        +			return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
        +				x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
        +				t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
        +				y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
        +
        +		}
        +	},
        +
        +	_intersectsWithPointer: function( item ) {
        +		var verticalDirection, horizontalDirection,
        +			isOverElementHeight = ( this.options.axis === "x" ) ||
        +				this._isOverAxis(
        +					this.positionAbs.top + this.offset.click.top, item.top, item.height ),
        +			isOverElementWidth = ( this.options.axis === "y" ) ||
        +				this._isOverAxis(
        +					this.positionAbs.left + this.offset.click.left, item.left, item.width ),
        +			isOverElement = isOverElementHeight && isOverElementWidth;
        +
        +		if ( !isOverElement ) {
        +			return false;
        +		}
        +
        +		verticalDirection = this._getDragVerticalDirection();
        +		horizontalDirection = this._getDragHorizontalDirection();
        +
        +		return this.floating ?
        +			( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
        +			: ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
        +
        +	},
        +
        +	_intersectsWithSides: function( item ) {
        +
        +		var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
        +				this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
        +			isOverRightHalf = this._isOverAxis( this.positionAbs.left +
        +				this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
        +			verticalDirection = this._getDragVerticalDirection(),
        +			horizontalDirection = this._getDragHorizontalDirection();
        +
        +		if ( this.floating && horizontalDirection ) {
        +			return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
        +				( horizontalDirection === "left" && !isOverRightHalf ) );
        +		} else {
        +			return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
        +				( verticalDirection === "up" && !isOverBottomHalf ) );
        +		}
        +
        +	},
        +
        +	_getDragVerticalDirection: function() {
        +		var delta = this.positionAbs.top - this.lastPositionAbs.top;
        +		return delta !== 0 && ( delta > 0 ? "down" : "up" );
        +	},
        +
        +	_getDragHorizontalDirection: function() {
        +		var delta = this.positionAbs.left - this.lastPositionAbs.left;
        +		return delta !== 0 && ( delta > 0 ? "right" : "left" );
        +	},
        +
        +	refresh: function( event ) {
        +		this._refreshItems( event );
        +		this._setHandleClassName();
        +		this.refreshPositions();
        +		return this;
        +	},
        +
        +	_connectWith: function() {
        +		var options = this.options;
        +		return options.connectWith.constructor === String ?
        +			[ options.connectWith ] :
        +			options.connectWith;
        +	},
        +
        +	_getItemsAsjQuery: function( connected ) {
        +
        +		var i, j, cur, inst,
        +			items = [],
        +			queries = [],
        +			connectWith = this._connectWith();
        +
        +		if ( connectWith && connected ) {
        +			for ( i = connectWith.length - 1; i >= 0; i-- ) {
        +				cur = $( connectWith[ i ], this.document[ 0 ] );
        +				for ( j = cur.length - 1; j >= 0; j-- ) {
        +					inst = $.data( cur[ j ], this.widgetFullName );
        +					if ( inst && inst !== this && !inst.options.disabled ) {
        +						queries.push( [ $.isFunction( inst.options.items ) ?
        +							inst.options.items.call( inst.element ) :
        +							$( inst.options.items, inst.element )
        +								.not( ".ui-sortable-helper" )
        +								.not( ".ui-sortable-placeholder" ), inst ] );
        +					}
        +				}
        +			}
        +		}
        +
        +		queries.push( [ $.isFunction( this.options.items ) ?
        +			this.options.items
        +				.call( this.element, null, { options: this.options, item: this.currentItem } ) :
        +			$( this.options.items, this.element )
        +				.not( ".ui-sortable-helper" )
        +				.not( ".ui-sortable-placeholder" ), this ] );
        +
        +		function addItems() {
        +			items.push( this );
        +		}
        +		for ( i = queries.length - 1; i >= 0; i-- ) {
        +			queries[ i ][ 0 ].each( addItems );
        +		}
        +
        +		return $( items );
        +
        +	},
        +
        +	_removeCurrentsFromItems: function() {
        +
        +		var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
        +
        +		this.items = $.grep( this.items, function( item ) {
        +			for ( var j = 0; j < list.length; j++ ) {
        +				if ( list[ j ] === item.item[ 0 ] ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		} );
        +
        +	},
        +
        +	_refreshItems: function( event ) {
        +
        +		this.items = [];
        +		this.containers = [ this ];
        +
        +		var i, j, cur, inst, targetData, _queries, item, queriesLength,
        +			items = this.items,
        +			queries = [ [ $.isFunction( this.options.items ) ?
        +				this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
        +				$( this.options.items, this.element ), this ] ],
        +			connectWith = this._connectWith();
        +
        +		//Shouldn't be run the first time through due to massive slow-down
        +		if ( connectWith && this.ready ) {
        +			for ( i = connectWith.length - 1; i >= 0; i-- ) {
        +				cur = $( connectWith[ i ], this.document[ 0 ] );
        +				for ( j = cur.length - 1; j >= 0; j-- ) {
        +					inst = $.data( cur[ j ], this.widgetFullName );
        +					if ( inst && inst !== this && !inst.options.disabled ) {
        +						queries.push( [ $.isFunction( inst.options.items ) ?
        +							inst.options.items
        +								.call( inst.element[ 0 ], event, { item: this.currentItem } ) :
        +							$( inst.options.items, inst.element ), inst ] );
        +						this.containers.push( inst );
        +					}
        +				}
        +			}
        +		}
        +
        +		for ( i = queries.length - 1; i >= 0; i-- ) {
        +			targetData = queries[ i ][ 1 ];
        +			_queries = queries[ i ][ 0 ];
        +
        +			for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
        +				item = $( _queries[ j ] );
        +
        +				// Data for target checking (mouse manager)
        +				item.data( this.widgetName + "-item", targetData );
        +
        +				items.push( {
        +					item: item,
        +					instance: targetData,
        +					width: 0, height: 0,
        +					left: 0, top: 0
        +				} );
        +			}
        +		}
        +
        +	},
        +
        +	refreshPositions: function( fast ) {
        +
        +		// Determine whether items are being displayed horizontally
        +		this.floating = this.items.length ?
        +			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
        +			false;
        +
        +		//This has to be redone because due to the item being moved out/into the offsetParent,
        +		// the offsetParent's position will change
        +		if ( this.offsetParent && this.helper ) {
        +			this.offset.parent = this._getParentOffset();
        +		}
        +
        +		var i, item, t, p;
        +
        +		for ( i = this.items.length - 1; i >= 0; i-- ) {
        +			item = this.items[ i ];
        +
        +			//We ignore calculating positions of all connected containers when we're not over them
        +			if ( item.instance !== this.currentContainer && this.currentContainer &&
        +					item.item[ 0 ] !== this.currentItem[ 0 ] ) {
        +				continue;
        +			}
        +
        +			t = this.options.toleranceElement ?
        +				$( this.options.toleranceElement, item.item ) :
        +				item.item;
        +
        +			if ( !fast ) {
        +				item.width = t.outerWidth();
        +				item.height = t.outerHeight();
        +			}
        +
        +			p = t.offset();
        +			item.left = p.left;
        +			item.top = p.top;
        +		}
        +
        +		if ( this.options.custom && this.options.custom.refreshContainers ) {
        +			this.options.custom.refreshContainers.call( this );
        +		} else {
        +			for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +				p = this.containers[ i ].element.offset();
        +				this.containers[ i ].containerCache.left = p.left;
        +				this.containers[ i ].containerCache.top = p.top;
        +				this.containers[ i ].containerCache.width =
        +					this.containers[ i ].element.outerWidth();
        +				this.containers[ i ].containerCache.height =
        +					this.containers[ i ].element.outerHeight();
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	_createPlaceholder: function( that ) {
        +		that = that || this;
        +		var className,
        +			o = that.options;
        +
        +		if ( !o.placeholder || o.placeholder.constructor === String ) {
        +			className = o.placeholder;
        +			o.placeholder = {
        +				element: function() {
        +
        +					var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),
        +						element = $( "<" + nodeName + ">", that.document[ 0 ] );
        +
        +						that._addClass( element, "ui-sortable-placeholder",
        +								className || that.currentItem[ 0 ].className )
        +							._removeClass( element, "ui-sortable-helper" );
        +
        +					if ( nodeName === "tbody" ) {
        +						that._createTrPlaceholder(
        +							that.currentItem.find( "tr" ).eq( 0 ),
        +							$( "<tr>", that.document[ 0 ] ).appendTo( element )
        +						);
        +					} else if ( nodeName === "tr" ) {
        +						that._createTrPlaceholder( that.currentItem, element );
        +					} else if ( nodeName === "img" ) {
        +						element.attr( "src", that.currentItem.attr( "src" ) );
        +					}
        +
        +					if ( !className ) {
        +						element.css( "visibility", "hidden" );
        +					}
        +
        +					return element;
        +				},
        +				update: function( container, p ) {
        +
        +					// 1. If a className is set as 'placeholder option, we don't force sizes -
        +					// the class is responsible for that
        +					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a
        +					// class name is specified
        +					if ( className && !o.forcePlaceholderSize ) {
        +						return;
        +					}
        +
        +					//If the element doesn't have a actual height by itself (without styles coming
        +					// from a stylesheet), it receives the inline height from the dragged item
        +					if ( !p.height() ) {
        +						p.height(
        +							that.currentItem.innerHeight() -
        +							parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
        +							parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
        +					}
        +					if ( !p.width() ) {
        +						p.width(
        +							that.currentItem.innerWidth() -
        +							parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
        +							parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
        +					}
        +				}
        +			};
        +		}
        +
        +		//Create the placeholder
        +		that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
        +
        +		//Append it after the actual current item
        +		that.currentItem.after( that.placeholder );
        +
        +		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
        +		o.placeholder.update( that, that.placeholder );
        +
        +	},
        +
        +	_createTrPlaceholder: function( sourceTr, targetTr ) {
        +		var that = this;
        +
        +		sourceTr.children().each( function() {
        +			$( "<td>&#160;</td>", that.document[ 0 ] )
        +				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
        +				.appendTo( targetTr );
        +		} );
        +	},
        +
        +	_contactContainers: function( event ) {
        +		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
        +			floating, axis,
        +			innermostContainer = null,
        +			innermostIndex = null;
        +
        +		// Get innermost container that intersects with item
        +		for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +
        +			// Never consider a container that's located within the item itself
        +			if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
        +				continue;
        +			}
        +
        +			if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
        +
        +				// If we've already found a container and it's more "inner" than this, then continue
        +				if ( innermostContainer &&
        +						$.contains(
        +							this.containers[ i ].element[ 0 ],
        +							innermostContainer.element[ 0 ] ) ) {
        +					continue;
        +				}
        +
        +				innermostContainer = this.containers[ i ];
        +				innermostIndex = i;
        +
        +			} else {
        +
        +				// container doesn't intersect. trigger "out" event if necessary
        +				if ( this.containers[ i ].containerCache.over ) {
        +					this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
        +					this.containers[ i ].containerCache.over = 0;
        +				}
        +			}
        +
        +		}
        +
        +		// If no intersecting containers found, return
        +		if ( !innermostContainer ) {
        +			return;
        +		}
        +
        +		// Move the item into the container if it's not there already
        +		if ( this.containers.length === 1 ) {
        +			if ( !this.containers[ innermostIndex ].containerCache.over ) {
        +				this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
        +				this.containers[ innermostIndex ].containerCache.over = 1;
        +			}
        +		} else {
        +
        +			// When entering a new container, we will find the item with the least distance and
        +			// append our item near it
        +			dist = 10000;
        +			itemWithLeastDistance = null;
        +			floating = innermostContainer.floating || this._isFloating( this.currentItem );
        +			posProperty = floating ? "left" : "top";
        +			sizeProperty = floating ? "width" : "height";
        +			axis = floating ? "pageX" : "pageY";
        +
        +			for ( j = this.items.length - 1; j >= 0; j-- ) {
        +				if ( !$.contains(
        +						this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
        +				) {
        +					continue;
        +				}
        +				if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
        +					continue;
        +				}
        +
        +				cur = this.items[ j ].item.offset()[ posProperty ];
        +				nearBottom = false;
        +				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
        +					nearBottom = true;
        +				}
        +
        +				if ( Math.abs( event[ axis ] - cur ) < dist ) {
        +					dist = Math.abs( event[ axis ] - cur );
        +					itemWithLeastDistance = this.items[ j ];
        +					this.direction = nearBottom ? "up" : "down";
        +				}
        +			}
        +
        +			//Check if dropOnEmpty is enabled
        +			if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
        +				return;
        +			}
        +
        +			if ( this.currentContainer === this.containers[ innermostIndex ] ) {
        +				if ( !this.currentContainer.containerCache.over ) {
        +					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
        +					this.currentContainer.containerCache.over = 1;
        +				}
        +				return;
        +			}
        +
        +			itemWithLeastDistance ?
        +				this._rearrange( event, itemWithLeastDistance, null, true ) :
        +				this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
        +			this._trigger( "change", event, this._uiHash() );
        +			this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
        +			this.currentContainer = this.containers[ innermostIndex ];
        +
        +			//Update the placeholder
        +			this.options.placeholder.update( this.currentContainer, this.placeholder );
        +
        +			this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
        +			this.containers[ innermostIndex ].containerCache.over = 1;
        +		}
        +
        +	},
        +
        +	_createHelper: function( event ) {
        +
        +		var o = this.options,
        +			helper = $.isFunction( o.helper ) ?
        +				$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
        +				( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
        +
        +		//Add the helper to the DOM if that didn't happen already
        +		if ( !helper.parents( "body" ).length ) {
        +			$( o.appendTo !== "parent" ?
        +				o.appendTo :
        +				this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );
        +		}
        +
        +		if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
        +			this._storedCSS = {
        +				width: this.currentItem[ 0 ].style.width,
        +				height: this.currentItem[ 0 ].style.height,
        +				position: this.currentItem.css( "position" ),
        +				top: this.currentItem.css( "top" ),
        +				left: this.currentItem.css( "left" )
        +			};
        +		}
        +
        +		if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
        +			helper.width( this.currentItem.width() );
        +		}
        +		if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
        +			helper.height( this.currentItem.height() );
        +		}
        +
        +		return helper;
        +
        +	},
        +
        +	_adjustOffsetFromHelper: function( obj ) {
        +		if ( typeof obj === "string" ) {
        +			obj = obj.split( " " );
        +		}
        +		if ( $.isArray( obj ) ) {
        +			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
        +		}
        +		if ( "left" in obj ) {
        +			this.offset.click.left = obj.left + this.margins.left;
        +		}
        +		if ( "right" in obj ) {
        +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        +		}
        +		if ( "top" in obj ) {
        +			this.offset.click.top = obj.top + this.margins.top;
        +		}
        +		if ( "bottom" in obj ) {
        +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        +		}
        +	},
        +
        +	_getParentOffset: function() {
        +
        +		//Get the offsetParent and cache its position
        +		this.offsetParent = this.helper.offsetParent();
        +		var po = this.offsetParent.offset();
        +
        +		// This is a special case where we need to modify a offset calculated on start, since the
        +		// following happened:
        +		// 1. The position of the helper is absolute, so it's position is calculated based on the
        +		// next positioned parent
        +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
        +		// the document, which means that the scroll is included in the initial calculation of the
        +		// offset of the parent, and never recalculated upon drag
        +		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
        +			po.left += this.scrollParent.scrollLeft();
        +			po.top += this.scrollParent.scrollTop();
        +		}
        +
        +		// This needs to be actually done for all browsers, since pageX/pageY includes this
        +		// information with an ugly IE fix
        +		if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
        +				( this.offsetParent[ 0 ].tagName &&
        +				this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
        +			po = { top: 0, left: 0 };
        +		}
        +
        +		return {
        +			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
        +			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
        +		};
        +
        +	},
        +
        +	_getRelativeOffset: function() {
        +
        +		if ( this.cssPosition === "relative" ) {
        +			var p = this.currentItem.position();
        +			return {
        +				top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
        +					this.scrollParent.scrollTop(),
        +				left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
        +					this.scrollParent.scrollLeft()
        +			};
        +		} else {
        +			return { top: 0, left: 0 };
        +		}
        +
        +	},
        +
        +	_cacheMargins: function() {
        +		this.margins = {
        +			left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
        +			top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
        +		};
        +	},
        +
        +	_cacheHelperProportions: function() {
        +		this.helperProportions = {
        +			width: this.helper.outerWidth(),
        +			height: this.helper.outerHeight()
        +		};
        +	},
        +
        +	_setContainment: function() {
        +
        +		var ce, co, over,
        +			o = this.options;
        +		if ( o.containment === "parent" ) {
        +			o.containment = this.helper[ 0 ].parentNode;
        +		}
        +		if ( o.containment === "document" || o.containment === "window" ) {
        +			this.containment = [
        +				0 - this.offset.relative.left - this.offset.parent.left,
        +				0 - this.offset.relative.top - this.offset.parent.top,
        +				o.containment === "document" ?
        +					this.document.width() :
        +					this.window.width() - this.helperProportions.width - this.margins.left,
        +				( o.containment === "document" ?
        +					( this.document.height() || document.body.parentNode.scrollHeight ) :
        +					this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
        +				) - this.helperProportions.height - this.margins.top
        +			];
        +		}
        +
        +		if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
        +			ce = $( o.containment )[ 0 ];
        +			co = $( o.containment ).offset();
        +			over = ( $( ce ).css( "overflow" ) !== "hidden" );
        +
        +			this.containment = [
        +				co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
        +					( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
        +				co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
        +					( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
        +				co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
        +					( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
        +					( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
        +					this.helperProportions.width - this.margins.left,
        +				co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
        +					( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
        +					( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
        +					this.helperProportions.height - this.margins.top
        +			];
        +		}
        +
        +	},
        +
        +	_convertPositionTo: function( d, pos ) {
        +
        +		if ( !pos ) {
        +			pos = this.position;
        +		}
        +		var mod = d === "absolute" ? 1 : -1,
        +			scroll = this.cssPosition === "absolute" &&
        +				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
        +					this.offsetParent :
        +					this.scrollParent,
        +			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pos.top	+
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top * mod -
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollTop() :
        +					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pos.left +
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left * mod +
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left * mod	-
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
        +					scroll.scrollLeft() ) * mod )
        +			)
        +		};
        +
        +	},
        +
        +	_generatePosition: function( event ) {
        +
        +		var top, left,
        +			o = this.options,
        +			pageX = event.pageX,
        +			pageY = event.pageY,
        +			scroll = this.cssPosition === "absolute" &&
        +				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
        +					this.offsetParent :
        +					this.scrollParent,
        +				scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
        +
        +		// This is another very weird special case that only happens for relative elements:
        +		// 1. If the css position is relative
        +		// 2. and the scroll parent is the document or similar to the offset parent
        +		// we have to refresh the relative offset during the scroll so there are no jumps
        +		if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
        +				this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
        +			this.offset.relative = this._getRelativeOffset();
        +		}
        +
        +		/*
        +		 * - Position constraining -
        +		 * Constrain the position to a mix of grid, containment.
        +		 */
        +
        +		if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
        +
        +			if ( this.containment ) {
        +				if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
        +					pageX = this.containment[ 0 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
        +					pageY = this.containment[ 1 ] + this.offset.click.top;
        +				}
        +				if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
        +					pageX = this.containment[ 2 ] + this.offset.click.left;
        +				}
        +				if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
        +					pageY = this.containment[ 3 ] + this.offset.click.top;
        +				}
        +			}
        +
        +			if ( o.grid ) {
        +				top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
        +					o.grid[ 1 ] ) * o.grid[ 1 ];
        +				pageY = this.containment ?
        +					( ( top - this.offset.click.top >= this.containment[ 1 ] &&
        +						top - this.offset.click.top <= this.containment[ 3 ] ) ?
        +							top :
        +							( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
        +								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
        +								top;
        +
        +				left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
        +					o.grid[ 0 ] ) * o.grid[ 0 ];
        +				pageX = this.containment ?
        +					( ( left - this.offset.click.left >= this.containment[ 0 ] &&
        +						left - this.offset.click.left <= this.containment[ 2 ] ) ?
        +							left :
        +							( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
        +								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
        +								left;
        +			}
        +
        +		}
        +
        +		return {
        +			top: (
        +
        +				// The absolute mouse position
        +				pageY -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.top -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.top -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.top +
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollTop() :
        +					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
        +			),
        +			left: (
        +
        +				// The absolute mouse position
        +				pageX -
        +
        +				// Click offset (relative to the element)
        +				this.offset.click.left -
        +
        +				// Only for relative positioned nodes: Relative offset from element to offset parent
        +				this.offset.relative.left -
        +
        +				// The offsetParent's offset without borders (offset + border)
        +				this.offset.parent.left +
        +				( ( this.cssPosition === "fixed" ?
        +					-this.scrollParent.scrollLeft() :
        +					scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
        +			)
        +		};
        +
        +	},
        +
        +	_rearrange: function( event, i, a, hardRefresh ) {
        +
        +		a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :
        +			i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
        +				( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
        +
        +		//Various things done here to improve the performance:
        +		// 1. we create a setTimeout, that calls refreshPositions
        +		// 2. on the instance, we have a counter variable, that get's higher after every append
        +		// 3. on the local scope, we copy the counter variable, and check in the timeout,
        +		// if it's still the same
        +		// 4. this lets only the last addition to the timeout stack through
        +		this.counter = this.counter ? ++this.counter : 1;
        +		var counter = this.counter;
        +
        +		this._delay( function() {
        +			if ( counter === this.counter ) {
        +
        +				//Precompute after each DOM insertion, NOT on mousemove
        +				this.refreshPositions( !hardRefresh );
        +			}
        +		} );
        +
        +	},
        +
        +	_clear: function( event, noPropagation ) {
        +
        +		this.reverting = false;
        +
        +		// We delay all events that have to be triggered to after the point where the placeholder
        +		// has been removed and everything else normalized again
        +		var i,
        +			delayedTriggers = [];
        +
        +		// We first have to update the dom position of the actual currentItem
        +		// Note: don't do it if the current item is already removed (by a user), or it gets
        +		// reappended (see #4088)
        +		if ( !this._noFinalSort && this.currentItem.parent().length ) {
        +			this.placeholder.before( this.currentItem );
        +		}
        +		this._noFinalSort = null;
        +
        +		if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
        +			for ( i in this._storedCSS ) {
        +				if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
        +					this._storedCSS[ i ] = "";
        +				}
        +			}
        +			this.currentItem.css( this._storedCSS );
        +			this._removeClass( this.currentItem, "ui-sortable-helper" );
        +		} else {
        +			this.currentItem.show();
        +		}
        +
        +		if ( this.fromOutside && !noPropagation ) {
        +			delayedTriggers.push( function( event ) {
        +				this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
        +			} );
        +		}
        +		if ( ( this.fromOutside ||
        +				this.domPosition.prev !==
        +				this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
        +				this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
        +
        +			// Trigger update callback if the DOM position has changed
        +			delayedTriggers.push( function( event ) {
        +				this._trigger( "update", event, this._uiHash() );
        +			} );
        +		}
        +
        +		// Check if the items Container has Changed and trigger appropriate
        +		// events.
        +		if ( this !== this.currentContainer ) {
        +			if ( !noPropagation ) {
        +				delayedTriggers.push( function( event ) {
        +					this._trigger( "remove", event, this._uiHash() );
        +				} );
        +				delayedTriggers.push( ( function( c ) {
        +					return function( event ) {
        +						c._trigger( "receive", event, this._uiHash( this ) );
        +					};
        +				} ).call( this, this.currentContainer ) );
        +				delayedTriggers.push( ( function( c ) {
        +					return function( event ) {
        +						c._trigger( "update", event, this._uiHash( this ) );
        +					};
        +				} ).call( this, this.currentContainer ) );
        +			}
        +		}
        +
        +		//Post events to containers
        +		function delayEvent( type, instance, container ) {
        +			return function( event ) {
        +				container._trigger( type, event, instance._uiHash( instance ) );
        +			};
        +		}
        +		for ( i = this.containers.length - 1; i >= 0; i-- ) {
        +			if ( !noPropagation ) {
        +				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
        +			}
        +			if ( this.containers[ i ].containerCache.over ) {
        +				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
        +				this.containers[ i ].containerCache.over = 0;
        +			}
        +		}
        +
        +		//Do what was originally in plugins
        +		if ( this.storedCursor ) {
        +			this.document.find( "body" ).css( "cursor", this.storedCursor );
        +			this.storedStylesheet.remove();
        +		}
        +		if ( this._storedOpacity ) {
        +			this.helper.css( "opacity", this._storedOpacity );
        +		}
        +		if ( this._storedZIndex ) {
        +			this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
        +		}
        +
        +		this.dragging = false;
        +
        +		if ( !noPropagation ) {
        +			this._trigger( "beforeStop", event, this._uiHash() );
        +		}
        +
        +		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
        +		// it unbinds ALL events from the original node!
        +		this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
        +
        +		if ( !this.cancelHelperRemoval ) {
        +			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
        +				this.helper.remove();
        +			}
        +			this.helper = null;
        +		}
        +
        +		if ( !noPropagation ) {
        +			for ( i = 0; i < delayedTriggers.length; i++ ) {
        +
        +				// Trigger all delayed events
        +				delayedTriggers[ i ].call( this, event );
        +			}
        +			this._trigger( "stop", event, this._uiHash() );
        +		}
        +
        +		this.fromOutside = false;
        +		return !this.cancelHelperRemoval;
        +
        +	},
        +
        +	_trigger: function() {
        +		if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
        +			this.cancel();
        +		}
        +	},
        +
        +	_uiHash: function( _inst ) {
        +		var inst = _inst || this;
        +		return {
        +			helper: inst.helper,
        +			placeholder: inst.placeholder || $( [] ),
        +			position: inst.position,
        +			originalPosition: inst.originalPosition,
        +			offset: inst.positionAbs,
        +			item: inst.currentItem,
        +			sender: _inst ? _inst.element : null
        +		};
        +	}
        +
        +} );
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/spinner.js b/bower_components/jquery-ui/ui/widgets/spinner.js
        new file mode 100644
        index 0000000000..c59fc57eeb
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/spinner.js
        @@ -0,0 +1,575 @@
        +/*!
        + * jQuery UI Spinner 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Spinner
        +//>>group: Widgets
        +//>>description: Displays buttons to easily input numbers via the keyboard or mouse.
        +//>>docs: http://api.jqueryui.com/spinner/
        +//>>demos: http://jqueryui.com/spinner/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/spinner.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"./button",
        +			"../version",
        +			"../keycode",
        +			"../safe-active-element",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +function spinnerModifer( fn ) {
        +	return function() {
        +		var previous = this.element.val();
        +		fn.apply( this, arguments );
        +		this._refresh();
        +		if ( previous !== this.element.val() ) {
        +			this._trigger( "change" );
        +		}
        +	};
        +}
        +
        +$.widget( "ui.spinner", {
        +	version: "1.12.1",
        +	defaultElement: "<input>",
        +	widgetEventPrefix: "spin",
        +	options: {
        +		classes: {
        +			"ui-spinner": "ui-corner-all",
        +			"ui-spinner-down": "ui-corner-br",
        +			"ui-spinner-up": "ui-corner-tr"
        +		},
        +		culture: null,
        +		icons: {
        +			down: "ui-icon-triangle-1-s",
        +			up: "ui-icon-triangle-1-n"
        +		},
        +		incremental: true,
        +		max: null,
        +		min: null,
        +		numberFormat: null,
        +		page: 10,
        +		step: 1,
        +
        +		change: null,
        +		spin: null,
        +		start: null,
        +		stop: null
        +	},
        +
        +	_create: function() {
        +
        +		// handle string values that need to be parsed
        +		this._setOption( "max", this.options.max );
        +		this._setOption( "min", this.options.min );
        +		this._setOption( "step", this.options.step );
        +
        +		// Only format if there is a value, prevents the field from being marked
        +		// as invalid in Firefox, see #9573.
        +		if ( this.value() !== "" ) {
        +
        +			// Format the value, but don't constrain.
        +			this._value( this.element.val(), true );
        +		}
        +
        +		this._draw();
        +		this._on( this._events );
        +		this._refresh();
        +
        +		// Turning off autocomplete prevents the browser from remembering the
        +		// value when navigating through history, so we re-enable autocomplete
        +		// if the page is unloaded before the widget is destroyed. #7790
        +		this._on( this.window, {
        +			beforeunload: function() {
        +				this.element.removeAttr( "autocomplete" );
        +			}
        +		} );
        +	},
        +
        +	_getCreateOptions: function() {
        +		var options = this._super();
        +		var element = this.element;
        +
        +		$.each( [ "min", "max", "step" ], function( i, option ) {
        +			var value = element.attr( option );
        +			if ( value != null && value.length ) {
        +				options[ option ] = value;
        +			}
        +		} );
        +
        +		return options;
        +	},
        +
        +	_events: {
        +		keydown: function( event ) {
        +			if ( this._start( event ) && this._keydown( event ) ) {
        +				event.preventDefault();
        +			}
        +		},
        +		keyup: "_stop",
        +		focus: function() {
        +			this.previous = this.element.val();
        +		},
        +		blur: function( event ) {
        +			if ( this.cancelBlur ) {
        +				delete this.cancelBlur;
        +				return;
        +			}
        +
        +			this._stop();
        +			this._refresh();
        +			if ( this.previous !== this.element.val() ) {
        +				this._trigger( "change", event );
        +			}
        +		},
        +		mousewheel: function( event, delta ) {
        +			if ( !delta ) {
        +				return;
        +			}
        +			if ( !this.spinning && !this._start( event ) ) {
        +				return false;
        +			}
        +
        +			this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );
        +			clearTimeout( this.mousewheelTimer );
        +			this.mousewheelTimer = this._delay( function() {
        +				if ( this.spinning ) {
        +					this._stop( event );
        +				}
        +			}, 100 );
        +			event.preventDefault();
        +		},
        +		"mousedown .ui-spinner-button": function( event ) {
        +			var previous;
        +
        +			// We never want the buttons to have focus; whenever the user is
        +			// interacting with the spinner, the focus should be on the input.
        +			// If the input is focused then this.previous is properly set from
        +			// when the input first received focus. If the input is not focused
        +			// then we need to set this.previous based on the value before spinning.
        +			previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?
        +				this.previous : this.element.val();
        +			function checkFocus() {
        +				var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );
        +				if ( !isActive ) {
        +					this.element.trigger( "focus" );
        +					this.previous = previous;
        +
        +					// support: IE
        +					// IE sets focus asynchronously, so we need to check if focus
        +					// moved off of the input because the user clicked on the button.
        +					this._delay( function() {
        +						this.previous = previous;
        +					} );
        +				}
        +			}
        +
        +			// Ensure focus is on (or stays on) the text field
        +			event.preventDefault();
        +			checkFocus.call( this );
        +
        +			// Support: IE
        +			// IE doesn't prevent moving focus even with event.preventDefault()
        +			// so we set a flag to know when we should ignore the blur event
        +			// and check (again) if focus moved off of the input.
        +			this.cancelBlur = true;
        +			this._delay( function() {
        +				delete this.cancelBlur;
        +				checkFocus.call( this );
        +			} );
        +
        +			if ( this._start( event ) === false ) {
        +				return;
        +			}
        +
        +			this._repeat( null, $( event.currentTarget )
        +				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        +		},
        +		"mouseup .ui-spinner-button": "_stop",
        +		"mouseenter .ui-spinner-button": function( event ) {
        +
        +			// button will add ui-state-active if mouse was down while mouseleave and kept down
        +			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
        +				return;
        +			}
        +
        +			if ( this._start( event ) === false ) {
        +				return false;
        +			}
        +			this._repeat( null, $( event.currentTarget )
        +				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        +		},
        +
        +		// TODO: do we really want to consider this a stop?
        +		// shouldn't we just stop the repeater and wait until mouseup before
        +		// we trigger the stop event?
        +		"mouseleave .ui-spinner-button": "_stop"
        +	},
        +
        +	// Support mobile enhanced option and make backcompat more sane
        +	_enhance: function() {
        +		this.uiSpinner = this.element
        +			.attr( "autocomplete", "off" )
        +			.wrap( "<span>" )
        +			.parent()
        +
        +				// Add buttons
        +				.append(
        +					"<a></a><a></a>"
        +				);
        +	},
        +
        +	_draw: function() {
        +		this._enhance();
        +
        +		this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
        +		this._addClass( "ui-spinner-input" );
        +
        +		this.element.attr( "role", "spinbutton" );
        +
        +		// Button bindings
        +		this.buttons = this.uiSpinner.children( "a" )
        +			.attr( "tabIndex", -1 )
        +			.attr( "aria-hidden", true )
        +			.button( {
        +				classes: {
        +					"ui-button": ""
        +				}
        +			} );
        +
        +		// TODO: Right now button does not support classes this is already updated in button PR
        +		this._removeClass( this.buttons, "ui-corner-all" );
        +
        +		this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
        +		this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
        +		this.buttons.first().button( {
        +			"icon": this.options.icons.up,
        +			"showLabel": false
        +		} );
        +		this.buttons.last().button( {
        +			"icon": this.options.icons.down,
        +			"showLabel": false
        +		} );
        +
        +		// IE 6 doesn't understand height: 50% for the buttons
        +		// unless the wrapper has an explicit height
        +		if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
        +				this.uiSpinner.height() > 0 ) {
        +			this.uiSpinner.height( this.uiSpinner.height() );
        +		}
        +	},
        +
        +	_keydown: function( event ) {
        +		var options = this.options,
        +			keyCode = $.ui.keyCode;
        +
        +		switch ( event.keyCode ) {
        +		case keyCode.UP:
        +			this._repeat( null, 1, event );
        +			return true;
        +		case keyCode.DOWN:
        +			this._repeat( null, -1, event );
        +			return true;
        +		case keyCode.PAGE_UP:
        +			this._repeat( null, options.page, event );
        +			return true;
        +		case keyCode.PAGE_DOWN:
        +			this._repeat( null, -options.page, event );
        +			return true;
        +		}
        +
        +		return false;
        +	},
        +
        +	_start: function( event ) {
        +		if ( !this.spinning && this._trigger( "start", event ) === false ) {
        +			return false;
        +		}
        +
        +		if ( !this.counter ) {
        +			this.counter = 1;
        +		}
        +		this.spinning = true;
        +		return true;
        +	},
        +
        +	_repeat: function( i, steps, event ) {
        +		i = i || 500;
        +
        +		clearTimeout( this.timer );
        +		this.timer = this._delay( function() {
        +			this._repeat( 40, steps, event );
        +		}, i );
        +
        +		this._spin( steps * this.options.step, event );
        +	},
        +
        +	_spin: function( step, event ) {
        +		var value = this.value() || 0;
        +
        +		if ( !this.counter ) {
        +			this.counter = 1;
        +		}
        +
        +		value = this._adjustValue( value + step * this._increment( this.counter ) );
        +
        +		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) {
        +			this._value( value );
        +			this.counter++;
        +		}
        +	},
        +
        +	_increment: function( i ) {
        +		var incremental = this.options.incremental;
        +
        +		if ( incremental ) {
        +			return $.isFunction( incremental ) ?
        +				incremental( i ) :
        +				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
        +		}
        +
        +		return 1;
        +	},
        +
        +	_precision: function() {
        +		var precision = this._precisionOf( this.options.step );
        +		if ( this.options.min !== null ) {
        +			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        +		}
        +		return precision;
        +	},
        +
        +	_precisionOf: function( num ) {
        +		var str = num.toString(),
        +			decimal = str.indexOf( "." );
        +		return decimal === -1 ? 0 : str.length - decimal - 1;
        +	},
        +
        +	_adjustValue: function( value ) {
        +		var base, aboveMin,
        +			options = this.options;
        +
        +		// Make sure we're at a valid step
        +		// - find out where we are relative to the base (min or 0)
        +		base = options.min !== null ? options.min : 0;
        +		aboveMin = value - base;
        +
        +		// - round to the nearest step
        +		aboveMin = Math.round( aboveMin / options.step ) * options.step;
        +
        +		// - rounding is based on 0, so adjust back to our base
        +		value = base + aboveMin;
        +
        +		// Fix precision from bad JS floating point math
        +		value = parseFloat( value.toFixed( this._precision() ) );
        +
        +		// Clamp the value
        +		if ( options.max !== null && value > options.max ) {
        +			return options.max;
        +		}
        +		if ( options.min !== null && value < options.min ) {
        +			return options.min;
        +		}
        +
        +		return value;
        +	},
        +
        +	_stop: function( event ) {
        +		if ( !this.spinning ) {
        +			return;
        +		}
        +
        +		clearTimeout( this.timer );
        +		clearTimeout( this.mousewheelTimer );
        +		this.counter = 0;
        +		this.spinning = false;
        +		this._trigger( "stop", event );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var prevValue, first, last;
        +
        +		if ( key === "culture" || key === "numberFormat" ) {
        +			prevValue = this._parse( this.element.val() );
        +			this.options[ key ] = value;
        +			this.element.val( this._format( prevValue ) );
        +			return;
        +		}
        +
        +		if ( key === "max" || key === "min" || key === "step" ) {
        +			if ( typeof value === "string" ) {
        +				value = this._parse( value );
        +			}
        +		}
        +		if ( key === "icons" ) {
        +			first = this.buttons.first().find( ".ui-icon" );
        +			this._removeClass( first, null, this.options.icons.up );
        +			this._addClass( first, null, value.up );
        +			last = this.buttons.last().find( ".ui-icon" );
        +			this._removeClass( last, null, this.options.icons.down );
        +			this._addClass( last, null, value.down );
        +		}
        +
        +		this._super( key, value );
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this._super( value );
        +
        +		this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
        +		this.element.prop( "disabled", !!value );
        +		this.buttons.button( value ? "disable" : "enable" );
        +	},
        +
        +	_setOptions: spinnerModifer( function( options ) {
        +		this._super( options );
        +	} ),
        +
        +	_parse: function( val ) {
        +		if ( typeof val === "string" && val !== "" ) {
        +			val = window.Globalize && this.options.numberFormat ?
        +				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
        +		}
        +		return val === "" || isNaN( val ) ? null : val;
        +	},
        +
        +	_format: function( value ) {
        +		if ( value === "" ) {
        +			return "";
        +		}
        +		return window.Globalize && this.options.numberFormat ?
        +			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
        +			value;
        +	},
        +
        +	_refresh: function() {
        +		this.element.attr( {
        +			"aria-valuemin": this.options.min,
        +			"aria-valuemax": this.options.max,
        +
        +			// TODO: what should we do with values that can't be parsed?
        +			"aria-valuenow": this._parse( this.element.val() )
        +		} );
        +	},
        +
        +	isValid: function() {
        +		var value = this.value();
        +
        +		// Null is invalid
        +		if ( value === null ) {
        +			return false;
        +		}
        +
        +		// If value gets adjusted, it's invalid
        +		return value === this._adjustValue( value );
        +	},
        +
        +	// Update the value without triggering change
        +	_value: function( value, allowAny ) {
        +		var parsed;
        +		if ( value !== "" ) {
        +			parsed = this._parse( value );
        +			if ( parsed !== null ) {
        +				if ( !allowAny ) {
        +					parsed = this._adjustValue( parsed );
        +				}
        +				value = this._format( parsed );
        +			}
        +		}
        +		this.element.val( value );
        +		this._refresh();
        +	},
        +
        +	_destroy: function() {
        +		this.element
        +			.prop( "disabled", false )
        +			.removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" );
        +
        +		this.uiSpinner.replaceWith( this.element );
        +	},
        +
        +	stepUp: spinnerModifer( function( steps ) {
        +		this._stepUp( steps );
        +	} ),
        +	_stepUp: function( steps ) {
        +		if ( this._start() ) {
        +			this._spin( ( steps || 1 ) * this.options.step );
        +			this._stop();
        +		}
        +	},
        +
        +	stepDown: spinnerModifer( function( steps ) {
        +		this._stepDown( steps );
        +	} ),
        +	_stepDown: function( steps ) {
        +		if ( this._start() ) {
        +			this._spin( ( steps || 1 ) * -this.options.step );
        +			this._stop();
        +		}
        +	},
        +
        +	pageUp: spinnerModifer( function( pages ) {
        +		this._stepUp( ( pages || 1 ) * this.options.page );
        +	} ),
        +
        +	pageDown: spinnerModifer( function( pages ) {
        +		this._stepDown( ( pages || 1 ) * this.options.page );
        +	} ),
        +
        +	value: function( newVal ) {
        +		if ( !arguments.length ) {
        +			return this._parse( this.element.val() );
        +		}
        +		spinnerModifer( this._value ).call( this, newVal );
        +	},
        +
        +	widget: function() {
        +		return this.uiSpinner;
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for spinner html extension points
        +	$.widget( "ui.spinner", $.ui.spinner, {
        +		_enhance: function() {
        +			this.uiSpinner = this.element
        +				.attr( "autocomplete", "off" )
        +				.wrap( this._uiSpinnerHtml() )
        +				.parent()
        +
        +					// Add buttons
        +					.append( this._buttonHtml() );
        +		},
        +		_uiSpinnerHtml: function() {
        +			return "<span>";
        +		},
        +
        +		_buttonHtml: function() {
        +			return "<a></a><a></a>";
        +		}
        +	} );
        +}
        +
        +return $.ui.spinner;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/tabs.js b/bower_components/jquery-ui/ui/widgets/tabs.js
        new file mode 100644
        index 0000000000..987cb9ef3b
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/tabs.js
        @@ -0,0 +1,924 @@
        +/*!
        + * jQuery UI Tabs 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Tabs
        +//>>group: Widgets
        +//>>description: Transforms a set of container elements into a tab structure.
        +//>>docs: http://api.jqueryui.com/tabs/
        +//>>demos: http://jqueryui.com/tabs/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/tabs.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../escape-selector",
        +			"../keycode",
        +			"../safe-active-element",
        +			"../unique-id",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.tabs", {
        +	version: "1.12.1",
        +	delay: 300,
        +	options: {
        +		active: null,
        +		classes: {
        +			"ui-tabs": "ui-corner-all",
        +			"ui-tabs-nav": "ui-corner-all",
        +			"ui-tabs-panel": "ui-corner-bottom",
        +			"ui-tabs-tab": "ui-corner-top"
        +		},
        +		collapsible: false,
        +		event: "click",
        +		heightStyle: "content",
        +		hide: null,
        +		show: null,
        +
        +		// Callbacks
        +		activate: null,
        +		beforeActivate: null,
        +		beforeLoad: null,
        +		load: null
        +	},
        +
        +	_isLocal: ( function() {
        +		var rhash = /#.*$/;
        +
        +		return function( anchor ) {
        +			var anchorUrl, locationUrl;
        +
        +			anchorUrl = anchor.href.replace( rhash, "" );
        +			locationUrl = location.href.replace( rhash, "" );
        +
        +			// Decoding may throw an error if the URL isn't UTF-8 (#9518)
        +			try {
        +				anchorUrl = decodeURIComponent( anchorUrl );
        +			} catch ( error ) {}
        +			try {
        +				locationUrl = decodeURIComponent( locationUrl );
        +			} catch ( error ) {}
        +
        +			return anchor.hash.length > 1 && anchorUrl === locationUrl;
        +		};
        +	} )(),
        +
        +	_create: function() {
        +		var that = this,
        +			options = this.options;
        +
        +		this.running = false;
        +
        +		this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
        +		this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
        +
        +		this._processTabs();
        +		options.active = this._initialActive();
        +
        +		// Take disabling tabs via class attribute from HTML
        +		// into account and update option properly.
        +		if ( $.isArray( options.disabled ) ) {
        +			options.disabled = $.unique( options.disabled.concat(
        +				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
        +					return that.tabs.index( li );
        +				} )
        +			) ).sort();
        +		}
        +
        +		// Check for length avoids error when initializing empty list
        +		if ( this.options.active !== false && this.anchors.length ) {
        +			this.active = this._findActive( options.active );
        +		} else {
        +			this.active = $();
        +		}
        +
        +		this._refresh();
        +
        +		if ( this.active.length ) {
        +			this.load( options.active );
        +		}
        +	},
        +
        +	_initialActive: function() {
        +		var active = this.options.active,
        +			collapsible = this.options.collapsible,
        +			locationHash = location.hash.substring( 1 );
        +
        +		if ( active === null ) {
        +
        +			// check the fragment identifier in the URL
        +			if ( locationHash ) {
        +				this.tabs.each( function( i, tab ) {
        +					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
        +						active = i;
        +						return false;
        +					}
        +				} );
        +			}
        +
        +			// Check for a tab marked active via a class
        +			if ( active === null ) {
        +				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
        +			}
        +
        +			// No active tab, set to false
        +			if ( active === null || active === -1 ) {
        +				active = this.tabs.length ? 0 : false;
        +			}
        +		}
        +
        +		// Handle numbers: negative, out of range
        +		if ( active !== false ) {
        +			active = this.tabs.index( this.tabs.eq( active ) );
        +			if ( active === -1 ) {
        +				active = collapsible ? false : 0;
        +			}
        +		}
        +
        +		// Don't allow collapsible: false and active: false
        +		if ( !collapsible && active === false && this.anchors.length ) {
        +			active = 0;
        +		}
        +
        +		return active;
        +	},
        +
        +	_getCreateEventData: function() {
        +		return {
        +			tab: this.active,
        +			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
        +		};
        +	},
        +
        +	_tabKeydown: function( event ) {
        +		var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
        +			selectedIndex = this.tabs.index( focusedTab ),
        +			goingForward = true;
        +
        +		if ( this._handlePageNav( event ) ) {
        +			return;
        +		}
        +
        +		switch ( event.keyCode ) {
        +		case $.ui.keyCode.RIGHT:
        +		case $.ui.keyCode.DOWN:
        +			selectedIndex++;
        +			break;
        +		case $.ui.keyCode.UP:
        +		case $.ui.keyCode.LEFT:
        +			goingForward = false;
        +			selectedIndex--;
        +			break;
        +		case $.ui.keyCode.END:
        +			selectedIndex = this.anchors.length - 1;
        +			break;
        +		case $.ui.keyCode.HOME:
        +			selectedIndex = 0;
        +			break;
        +		case $.ui.keyCode.SPACE:
        +
        +			// Activate only, no collapsing
        +			event.preventDefault();
        +			clearTimeout( this.activating );
        +			this._activate( selectedIndex );
        +			return;
        +		case $.ui.keyCode.ENTER:
        +
        +			// Toggle (cancel delayed activation, allow collapsing)
        +			event.preventDefault();
        +			clearTimeout( this.activating );
        +
        +			// Determine if we should collapse or activate
        +			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
        +			return;
        +		default:
        +			return;
        +		}
        +
        +		// Focus the appropriate tab, based on which key was pressed
        +		event.preventDefault();
        +		clearTimeout( this.activating );
        +		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
        +
        +		// Navigating with control/command key will prevent automatic activation
        +		if ( !event.ctrlKey && !event.metaKey ) {
        +
        +			// Update aria-selected immediately so that AT think the tab is already selected.
        +			// Otherwise AT may confuse the user by stating that they need to activate the tab,
        +			// but the tab will already be activated by the time the announcement finishes.
        +			focusedTab.attr( "aria-selected", "false" );
        +			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
        +
        +			this.activating = this._delay( function() {
        +				this.option( "active", selectedIndex );
        +			}, this.delay );
        +		}
        +	},
        +
        +	_panelKeydown: function( event ) {
        +		if ( this._handlePageNav( event ) ) {
        +			return;
        +		}
        +
        +		// Ctrl+up moves focus to the current tab
        +		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
        +			event.preventDefault();
        +			this.active.trigger( "focus" );
        +		}
        +	},
        +
        +	// Alt+page up/down moves focus to the previous/next tab (and activates)
        +	_handlePageNav: function( event ) {
        +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
        +			this._activate( this._focusNextTab( this.options.active - 1, false ) );
        +			return true;
        +		}
        +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
        +			this._activate( this._focusNextTab( this.options.active + 1, true ) );
        +			return true;
        +		}
        +	},
        +
        +	_findNextTab: function( index, goingForward ) {
        +		var lastTabIndex = this.tabs.length - 1;
        +
        +		function constrain() {
        +			if ( index > lastTabIndex ) {
        +				index = 0;
        +			}
        +			if ( index < 0 ) {
        +				index = lastTabIndex;
        +			}
        +			return index;
        +		}
        +
        +		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
        +			index = goingForward ? index + 1 : index - 1;
        +		}
        +
        +		return index;
        +	},
        +
        +	_focusNextTab: function( index, goingForward ) {
        +		index = this._findNextTab( index, goingForward );
        +		this.tabs.eq( index ).trigger( "focus" );
        +		return index;
        +	},
        +
        +	_setOption: function( key, value ) {
        +		if ( key === "active" ) {
        +
        +			// _activate() will handle invalid values and update this.options
        +			this._activate( value );
        +			return;
        +		}
        +
        +		this._super( key, value );
        +
        +		if ( key === "collapsible" ) {
        +			this._toggleClass( "ui-tabs-collapsible", null, value );
        +
        +			// Setting collapsible: false while collapsed; open first panel
        +			if ( !value && this.options.active === false ) {
        +				this._activate( 0 );
        +			}
        +		}
        +
        +		if ( key === "event" ) {
        +			this._setupEvents( value );
        +		}
        +
        +		if ( key === "heightStyle" ) {
        +			this._setupHeightStyle( value );
        +		}
        +	},
        +
        +	_sanitizeSelector: function( hash ) {
        +		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
        +	},
        +
        +	refresh: function() {
        +		var options = this.options,
        +			lis = this.tablist.children( ":has(a[href])" );
        +
        +		// Get disabled tabs from class attribute from HTML
        +		// this will get converted to a boolean if needed in _refresh()
        +		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
        +			return lis.index( tab );
        +		} );
        +
        +		this._processTabs();
        +
        +		// Was collapsed or no tabs
        +		if ( options.active === false || !this.anchors.length ) {
        +			options.active = false;
        +			this.active = $();
        +
        +		// was active, but active tab is gone
        +		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
        +
        +			// all remaining tabs are disabled
        +			if ( this.tabs.length === options.disabled.length ) {
        +				options.active = false;
        +				this.active = $();
        +
        +			// activate previous tab
        +			} else {
        +				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
        +			}
        +
        +		// was active, active tab still exists
        +		} else {
        +
        +			// make sure active index is correct
        +			options.active = this.tabs.index( this.active );
        +		}
        +
        +		this._refresh();
        +	},
        +
        +	_refresh: function() {
        +		this._setOptionDisabled( this.options.disabled );
        +		this._setupEvents( this.options.event );
        +		this._setupHeightStyle( this.options.heightStyle );
        +
        +		this.tabs.not( this.active ).attr( {
        +			"aria-selected": "false",
        +			"aria-expanded": "false",
        +			tabIndex: -1
        +		} );
        +		this.panels.not( this._getPanelForTab( this.active ) )
        +			.hide()
        +			.attr( {
        +				"aria-hidden": "true"
        +			} );
        +
        +		// Make sure one tab is in the tab order
        +		if ( !this.active.length ) {
        +			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
        +		} else {
        +			this.active
        +				.attr( {
        +					"aria-selected": "true",
        +					"aria-expanded": "true",
        +					tabIndex: 0
        +				} );
        +			this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
        +			this._getPanelForTab( this.active )
        +				.show()
        +				.attr( {
        +					"aria-hidden": "false"
        +				} );
        +		}
        +	},
        +
        +	_processTabs: function() {
        +		var that = this,
        +			prevTabs = this.tabs,
        +			prevAnchors = this.anchors,
        +			prevPanels = this.panels;
        +
        +		this.tablist = this._getList().attr( "role", "tablist" );
        +		this._addClass( this.tablist, "ui-tabs-nav",
        +			"ui-helper-reset ui-helper-clearfix ui-widget-header" );
        +
        +		// Prevent users from focusing disabled tabs via click
        +		this.tablist
        +			.on( "mousedown" + this.eventNamespace, "> li", function( event ) {
        +				if ( $( this ).is( ".ui-state-disabled" ) ) {
        +					event.preventDefault();
        +				}
        +			} )
        +
        +			// Support: IE <9
        +			// Preventing the default action in mousedown doesn't prevent IE
        +			// from focusing the element, so if the anchor gets focused, blur.
        +			// We don't have to worry about focusing the previously focused
        +			// element since clicking on a non-focusable element should focus
        +			// the body anyway.
        +			.on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
        +				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
        +					this.blur();
        +				}
        +			} );
        +
        +		this.tabs = this.tablist.find( "> li:has(a[href])" )
        +			.attr( {
        +				role: "tab",
        +				tabIndex: -1
        +			} );
        +		this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
        +
        +		this.anchors = this.tabs.map( function() {
        +			return $( "a", this )[ 0 ];
        +		} )
        +			.attr( {
        +				role: "presentation",
        +				tabIndex: -1
        +			} );
        +		this._addClass( this.anchors, "ui-tabs-anchor" );
        +
        +		this.panels = $();
        +
        +		this.anchors.each( function( i, anchor ) {
        +			var selector, panel, panelId,
        +				anchorId = $( anchor ).uniqueId().attr( "id" ),
        +				tab = $( anchor ).closest( "li" ),
        +				originalAriaControls = tab.attr( "aria-controls" );
        +
        +			// Inline tab
        +			if ( that._isLocal( anchor ) ) {
        +				selector = anchor.hash;
        +				panelId = selector.substring( 1 );
        +				panel = that.element.find( that._sanitizeSelector( selector ) );
        +
        +			// remote tab
        +			} else {
        +
        +				// If the tab doesn't already have aria-controls,
        +				// generate an id by using a throw-away element
        +				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
        +				selector = "#" + panelId;
        +				panel = that.element.find( selector );
        +				if ( !panel.length ) {
        +					panel = that._createPanel( panelId );
        +					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
        +				}
        +				panel.attr( "aria-live", "polite" );
        +			}
        +
        +			if ( panel.length ) {
        +				that.panels = that.panels.add( panel );
        +			}
        +			if ( originalAriaControls ) {
        +				tab.data( "ui-tabs-aria-controls", originalAriaControls );
        +			}
        +			tab.attr( {
        +				"aria-controls": panelId,
        +				"aria-labelledby": anchorId
        +			} );
        +			panel.attr( "aria-labelledby", anchorId );
        +		} );
        +
        +		this.panels.attr( "role", "tabpanel" );
        +		this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
        +
        +		// Avoid memory leaks (#10056)
        +		if ( prevTabs ) {
        +			this._off( prevTabs.not( this.tabs ) );
        +			this._off( prevAnchors.not( this.anchors ) );
        +			this._off( prevPanels.not( this.panels ) );
        +		}
        +	},
        +
        +	// Allow overriding how to find the list for rare usage scenarios (#7715)
        +	_getList: function() {
        +		return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
        +	},
        +
        +	_createPanel: function( id ) {
        +		return $( "<div>" )
        +			.attr( "id", id )
        +			.data( "ui-tabs-destroy", true );
        +	},
        +
        +	_setOptionDisabled: function( disabled ) {
        +		var currentItem, li, i;
        +
        +		if ( $.isArray( disabled ) ) {
        +			if ( !disabled.length ) {
        +				disabled = false;
        +			} else if ( disabled.length === this.anchors.length ) {
        +				disabled = true;
        +			}
        +		}
        +
        +		// Disable tabs
        +		for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
        +			currentItem = $( li );
        +			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
        +				currentItem.attr( "aria-disabled", "true" );
        +				this._addClass( currentItem, null, "ui-state-disabled" );
        +			} else {
        +				currentItem.removeAttr( "aria-disabled" );
        +				this._removeClass( currentItem, null, "ui-state-disabled" );
        +			}
        +		}
        +
        +		this.options.disabled = disabled;
        +
        +		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
        +			disabled === true );
        +	},
        +
        +	_setupEvents: function( event ) {
        +		var events = {};
        +		if ( event ) {
        +			$.each( event.split( " " ), function( index, eventName ) {
        +				events[ eventName ] = "_eventHandler";
        +			} );
        +		}
        +
        +		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
        +
        +		// Always prevent the default action, even when disabled
        +		this._on( true, this.anchors, {
        +			click: function( event ) {
        +				event.preventDefault();
        +			}
        +		} );
        +		this._on( this.anchors, events );
        +		this._on( this.tabs, { keydown: "_tabKeydown" } );
        +		this._on( this.panels, { keydown: "_panelKeydown" } );
        +
        +		this._focusable( this.tabs );
        +		this._hoverable( this.tabs );
        +	},
        +
        +	_setupHeightStyle: function( heightStyle ) {
        +		var maxHeight,
        +			parent = this.element.parent();
        +
        +		if ( heightStyle === "fill" ) {
        +			maxHeight = parent.height();
        +			maxHeight -= this.element.outerHeight() - this.element.height();
        +
        +			this.element.siblings( ":visible" ).each( function() {
        +				var elem = $( this ),
        +					position = elem.css( "position" );
        +
        +				if ( position === "absolute" || position === "fixed" ) {
        +					return;
        +				}
        +				maxHeight -= elem.outerHeight( true );
        +			} );
        +
        +			this.element.children().not( this.panels ).each( function() {
        +				maxHeight -= $( this ).outerHeight( true );
        +			} );
        +
        +			this.panels.each( function() {
        +				$( this ).height( Math.max( 0, maxHeight -
        +					$( this ).innerHeight() + $( this ).height() ) );
        +			} )
        +				.css( "overflow", "auto" );
        +		} else if ( heightStyle === "auto" ) {
        +			maxHeight = 0;
        +			this.panels.each( function() {
        +				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
        +			} ).height( maxHeight );
        +		}
        +	},
        +
        +	_eventHandler: function( event ) {
        +		var options = this.options,
        +			active = this.active,
        +			anchor = $( event.currentTarget ),
        +			tab = anchor.closest( "li" ),
        +			clickedIsActive = tab[ 0 ] === active[ 0 ],
        +			collapsing = clickedIsActive && options.collapsible,
        +			toShow = collapsing ? $() : this._getPanelForTab( tab ),
        +			toHide = !active.length ? $() : this._getPanelForTab( active ),
        +			eventData = {
        +				oldTab: active,
        +				oldPanel: toHide,
        +				newTab: collapsing ? $() : tab,
        +				newPanel: toShow
        +			};
        +
        +		event.preventDefault();
        +
        +		if ( tab.hasClass( "ui-state-disabled" ) ||
        +
        +				// tab is already loading
        +				tab.hasClass( "ui-tabs-loading" ) ||
        +
        +				// can't switch durning an animation
        +				this.running ||
        +
        +				// click on active header, but not collapsible
        +				( clickedIsActive && !options.collapsible ) ||
        +
        +				// allow canceling activation
        +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        +			return;
        +		}
        +
        +		options.active = collapsing ? false : this.tabs.index( tab );
        +
        +		this.active = clickedIsActive ? $() : tab;
        +		if ( this.xhr ) {
        +			this.xhr.abort();
        +		}
        +
        +		if ( !toHide.length && !toShow.length ) {
        +			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
        +		}
        +
        +		if ( toShow.length ) {
        +			this.load( this.tabs.index( tab ), event );
        +		}
        +		this._toggle( event, eventData );
        +	},
        +
        +	// Handles show/hide for selecting tabs
        +	_toggle: function( event, eventData ) {
        +		var that = this,
        +			toShow = eventData.newPanel,
        +			toHide = eventData.oldPanel;
        +
        +		this.running = true;
        +
        +		function complete() {
        +			that.running = false;
        +			that._trigger( "activate", event, eventData );
        +		}
        +
        +		function show() {
        +			that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
        +
        +			if ( toShow.length && that.options.show ) {
        +				that._show( toShow, that.options.show, complete );
        +			} else {
        +				toShow.show();
        +				complete();
        +			}
        +		}
        +
        +		// Start out by hiding, then showing, then completing
        +		if ( toHide.length && this.options.hide ) {
        +			this._hide( toHide, this.options.hide, function() {
        +				that._removeClass( eventData.oldTab.closest( "li" ),
        +					"ui-tabs-active", "ui-state-active" );
        +				show();
        +			} );
        +		} else {
        +			this._removeClass( eventData.oldTab.closest( "li" ),
        +				"ui-tabs-active", "ui-state-active" );
        +			toHide.hide();
        +			show();
        +		}
        +
        +		toHide.attr( "aria-hidden", "true" );
        +		eventData.oldTab.attr( {
        +			"aria-selected": "false",
        +			"aria-expanded": "false"
        +		} );
        +
        +		// If we're switching tabs, remove the old tab from the tab order.
        +		// If we're opening from collapsed state, remove the previous tab from the tab order.
        +		// If we're collapsing, then keep the collapsing tab in the tab order.
        +		if ( toShow.length && toHide.length ) {
        +			eventData.oldTab.attr( "tabIndex", -1 );
        +		} else if ( toShow.length ) {
        +			this.tabs.filter( function() {
        +				return $( this ).attr( "tabIndex" ) === 0;
        +			} )
        +				.attr( "tabIndex", -1 );
        +		}
        +
        +		toShow.attr( "aria-hidden", "false" );
        +		eventData.newTab.attr( {
        +			"aria-selected": "true",
        +			"aria-expanded": "true",
        +			tabIndex: 0
        +		} );
        +	},
        +
        +	_activate: function( index ) {
        +		var anchor,
        +			active = this._findActive( index );
        +
        +		// Trying to activate the already active panel
        +		if ( active[ 0 ] === this.active[ 0 ] ) {
        +			return;
        +		}
        +
        +		// Trying to collapse, simulate a click on the current active header
        +		if ( !active.length ) {
        +			active = this.active;
        +		}
        +
        +		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
        +		this._eventHandler( {
        +			target: anchor,
        +			currentTarget: anchor,
        +			preventDefault: $.noop
        +		} );
        +	},
        +
        +	_findActive: function( index ) {
        +		return index === false ? $() : this.tabs.eq( index );
        +	},
        +
        +	_getIndex: function( index ) {
        +
        +		// meta-function to give users option to provide a href string instead of a numerical index.
        +		if ( typeof index === "string" ) {
        +			index = this.anchors.index( this.anchors.filter( "[href$='" +
        +				$.ui.escapeSelector( index ) + "']" ) );
        +		}
        +
        +		return index;
        +	},
        +
        +	_destroy: function() {
        +		if ( this.xhr ) {
        +			this.xhr.abort();
        +		}
        +
        +		this.tablist
        +			.removeAttr( "role" )
        +			.off( this.eventNamespace );
        +
        +		this.anchors
        +			.removeAttr( "role tabIndex" )
        +			.removeUniqueId();
        +
        +		this.tabs.add( this.panels ).each( function() {
        +			if ( $.data( this, "ui-tabs-destroy" ) ) {
        +				$( this ).remove();
        +			} else {
        +				$( this ).removeAttr( "role tabIndex " +
        +					"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
        +			}
        +		} );
        +
        +		this.tabs.each( function() {
        +			var li = $( this ),
        +				prev = li.data( "ui-tabs-aria-controls" );
        +			if ( prev ) {
        +				li
        +					.attr( "aria-controls", prev )
        +					.removeData( "ui-tabs-aria-controls" );
        +			} else {
        +				li.removeAttr( "aria-controls" );
        +			}
        +		} );
        +
        +		this.panels.show();
        +
        +		if ( this.options.heightStyle !== "content" ) {
        +			this.panels.css( "height", "" );
        +		}
        +	},
        +
        +	enable: function( index ) {
        +		var disabled = this.options.disabled;
        +		if ( disabled === false ) {
        +			return;
        +		}
        +
        +		if ( index === undefined ) {
        +			disabled = false;
        +		} else {
        +			index = this._getIndex( index );
        +			if ( $.isArray( disabled ) ) {
        +				disabled = $.map( disabled, function( num ) {
        +					return num !== index ? num : null;
        +				} );
        +			} else {
        +				disabled = $.map( this.tabs, function( li, num ) {
        +					return num !== index ? num : null;
        +				} );
        +			}
        +		}
        +		this._setOptionDisabled( disabled );
        +	},
        +
        +	disable: function( index ) {
        +		var disabled = this.options.disabled;
        +		if ( disabled === true ) {
        +			return;
        +		}
        +
        +		if ( index === undefined ) {
        +			disabled = true;
        +		} else {
        +			index = this._getIndex( index );
        +			if ( $.inArray( index, disabled ) !== -1 ) {
        +				return;
        +			}
        +			if ( $.isArray( disabled ) ) {
        +				disabled = $.merge( [ index ], disabled ).sort();
        +			} else {
        +				disabled = [ index ];
        +			}
        +		}
        +		this._setOptionDisabled( disabled );
        +	},
        +
        +	load: function( index, event ) {
        +		index = this._getIndex( index );
        +		var that = this,
        +			tab = this.tabs.eq( index ),
        +			anchor = tab.find( ".ui-tabs-anchor" ),
        +			panel = this._getPanelForTab( tab ),
        +			eventData = {
        +				tab: tab,
        +				panel: panel
        +			},
        +			complete = function( jqXHR, status ) {
        +				if ( status === "abort" ) {
        +					that.panels.stop( false, true );
        +				}
        +
        +				that._removeClass( tab, "ui-tabs-loading" );
        +				panel.removeAttr( "aria-busy" );
        +
        +				if ( jqXHR === that.xhr ) {
        +					delete that.xhr;
        +				}
        +			};
        +
        +		// Not remote
        +		if ( this._isLocal( anchor[ 0 ] ) ) {
        +			return;
        +		}
        +
        +		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
        +
        +		// Support: jQuery <1.8
        +		// jQuery <1.8 returns false if the request is canceled in beforeSend,
        +		// but as of 1.8, $.ajax() always returns a jqXHR object.
        +		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
        +			this._addClass( tab, "ui-tabs-loading" );
        +			panel.attr( "aria-busy", "true" );
        +
        +			this.xhr
        +				.done( function( response, status, jqXHR ) {
        +
        +					// support: jQuery <1.8
        +					// http://bugs.jquery.com/ticket/11778
        +					setTimeout( function() {
        +						panel.html( response );
        +						that._trigger( "load", event, eventData );
        +
        +						complete( jqXHR, status );
        +					}, 1 );
        +				} )
        +				.fail( function( jqXHR, status ) {
        +
        +					// support: jQuery <1.8
        +					// http://bugs.jquery.com/ticket/11778
        +					setTimeout( function() {
        +						complete( jqXHR, status );
        +					}, 1 );
        +				} );
        +		}
        +	},
        +
        +	_ajaxSettings: function( anchor, event, eventData ) {
        +		var that = this;
        +		return {
        +
        +			// Support: IE <11 only
        +			// Strip any hash that exists to prevent errors with the Ajax request
        +			url: anchor.attr( "href" ).replace( /#.*$/, "" ),
        +			beforeSend: function( jqXHR, settings ) {
        +				return that._trigger( "beforeLoad", event,
        +					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
        +			}
        +		};
        +	},
        +
        +	_getPanelForTab: function( tab ) {
        +		var id = $( tab ).attr( "aria-controls" );
        +		return this.element.find( this._sanitizeSelector( "#" + id ) );
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: Switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for ui-tab class (now ui-tabs-tab)
        +	$.widget( "ui.tabs", $.ui.tabs, {
        +		_processTabs: function() {
        +			this._superApply( arguments );
        +			this._addClass( this.tabs, "ui-tab" );
        +		}
        +	} );
        +}
        +
        +return $.ui.tabs;
        +
        +} ) );
        diff --git a/bower_components/jquery-ui/ui/widgets/tooltip.js b/bower_components/jquery-ui/ui/widgets/tooltip.js
        new file mode 100644
        index 0000000000..f453b456f9
        --- /dev/null
        +++ b/bower_components/jquery-ui/ui/widgets/tooltip.js
        @@ -0,0 +1,520 @@
        +/*!
        + * jQuery UI Tooltip 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +
        +//>>label: Tooltip
        +//>>group: Widgets
        +//>>description: Shows additional information for any element on hover or focus.
        +//>>docs: http://api.jqueryui.com/tooltip/
        +//>>demos: http://jqueryui.com/tooltip/
        +//>>css.structure: ../../themes/base/core.css
        +//>>css.structure: ../../themes/base/tooltip.css
        +//>>css.theme: ../../themes/base/theme.css
        +
        +( function( factory ) {
        +	if ( typeof define === "function" && define.amd ) {
        +
        +		// AMD. Register as an anonymous module.
        +		define( [
        +			"jquery",
        +			"../keycode",
        +			"../position",
        +			"../unique-id",
        +			"../version",
        +			"../widget"
        +		], factory );
        +	} else {
        +
        +		// Browser globals
        +		factory( jQuery );
        +	}
        +}( function( $ ) {
        +
        +$.widget( "ui.tooltip", {
        +	version: "1.12.1",
        +	options: {
        +		classes: {
        +			"ui-tooltip": "ui-corner-all ui-widget-shadow"
        +		},
        +		content: function() {
        +
        +			// support: IE<9, Opera in jQuery <1.7
        +			// .text() can't accept undefined, so coerce to a string
        +			var title = $( this ).attr( "title" ) || "";
        +
        +			// Escape title, since we're going from an attribute to raw HTML
        +			return $( "<a>" ).text( title ).html();
        +		},
        +		hide: true,
        +
        +		// Disabled elements have inconsistent behavior across browsers (#8661)
        +		items: "[title]:not([disabled])",
        +		position: {
        +			my: "left top+15",
        +			at: "left bottom",
        +			collision: "flipfit flip"
        +		},
        +		show: true,
        +		track: false,
        +
        +		// Callbacks
        +		close: null,
        +		open: null
        +	},
        +
        +	_addDescribedBy: function( elem, id ) {
        +		var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ );
        +		describedby.push( id );
        +		elem
        +			.data( "ui-tooltip-id", id )
        +			.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
        +	},
        +
        +	_removeDescribedBy: function( elem ) {
        +		var id = elem.data( "ui-tooltip-id" ),
        +			describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ),
        +			index = $.inArray( id, describedby );
        +
        +		if ( index !== -1 ) {
        +			describedby.splice( index, 1 );
        +		}
        +
        +		elem.removeData( "ui-tooltip-id" );
        +		describedby = $.trim( describedby.join( " " ) );
        +		if ( describedby ) {
        +			elem.attr( "aria-describedby", describedby );
        +		} else {
        +			elem.removeAttr( "aria-describedby" );
        +		}
        +	},
        +
        +	_create: function() {
        +		this._on( {
        +			mouseover: "open",
        +			focusin: "open"
        +		} );
        +
        +		// IDs of generated tooltips, needed for destroy
        +		this.tooltips = {};
        +
        +		// IDs of parent tooltips where we removed the title attribute
        +		this.parents = {};
        +
        +		// Append the aria-live region so tooltips announce correctly
        +		this.liveRegion = $( "<div>" )
        +			.attr( {
        +				role: "log",
        +				"aria-live": "assertive",
        +				"aria-relevant": "additions"
        +			} )
        +			.appendTo( this.document[ 0 ].body );
        +		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
        +
        +		this.disabledTitles = $( [] );
        +	},
        +
        +	_setOption: function( key, value ) {
        +		var that = this;
        +
        +		this._super( key, value );
        +
        +		if ( key === "content" ) {
        +			$.each( this.tooltips, function( id, tooltipData ) {
        +				that._updateContent( tooltipData.element );
        +			} );
        +		}
        +	},
        +
        +	_setOptionDisabled: function( value ) {
        +		this[ value ? "_disable" : "_enable" ]();
        +	},
        +
        +	_disable: function() {
        +		var that = this;
        +
        +		// Close open tooltips
        +		$.each( this.tooltips, function( id, tooltipData ) {
        +			var event = $.Event( "blur" );
        +			event.target = event.currentTarget = tooltipData.element[ 0 ];
        +			that.close( event, true );
        +		} );
        +
        +		// Remove title attributes to prevent native tooltips
        +		this.disabledTitles = this.disabledTitles.add(
        +			this.element.find( this.options.items ).addBack()
        +				.filter( function() {
        +					var element = $( this );
        +					if ( element.is( "[title]" ) ) {
        +						return element
        +							.data( "ui-tooltip-title", element.attr( "title" ) )
        +							.removeAttr( "title" );
        +					}
        +				} )
        +		);
        +	},
        +
        +	_enable: function() {
        +
        +		// restore title attributes
        +		this.disabledTitles.each( function() {
        +			var element = $( this );
        +			if ( element.data( "ui-tooltip-title" ) ) {
        +				element.attr( "title", element.data( "ui-tooltip-title" ) );
        +			}
        +		} );
        +		this.disabledTitles = $( [] );
        +	},
        +
        +	open: function( event ) {
        +		var that = this,
        +			target = $( event ? event.target : this.element )
        +
        +				// we need closest here due to mouseover bubbling,
        +				// but always pointing at the same event target
        +				.closest( this.options.items );
        +
        +		// No element to show a tooltip for or the tooltip is already open
        +		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
        +			return;
        +		}
        +
        +		if ( target.attr( "title" ) ) {
        +			target.data( "ui-tooltip-title", target.attr( "title" ) );
        +		}
        +
        +		target.data( "ui-tooltip-open", true );
        +
        +		// Kill parent tooltips, custom or native, for hover
        +		if ( event && event.type === "mouseover" ) {
        +			target.parents().each( function() {
        +				var parent = $( this ),
        +					blurEvent;
        +				if ( parent.data( "ui-tooltip-open" ) ) {
        +					blurEvent = $.Event( "blur" );
        +					blurEvent.target = blurEvent.currentTarget = this;
        +					that.close( blurEvent, true );
        +				}
        +				if ( parent.attr( "title" ) ) {
        +					parent.uniqueId();
        +					that.parents[ this.id ] = {
        +						element: this,
        +						title: parent.attr( "title" )
        +					};
        +					parent.attr( "title", "" );
        +				}
        +			} );
        +		}
        +
        +		this._registerCloseHandlers( event, target );
        +		this._updateContent( target, event );
        +	},
        +
        +	_updateContent: function( target, event ) {
        +		var content,
        +			contentOption = this.options.content,
        +			that = this,
        +			eventType = event ? event.type : null;
        +
        +		if ( typeof contentOption === "string" || contentOption.nodeType ||
        +				contentOption.jquery ) {
        +			return this._open( event, target, contentOption );
        +		}
        +
        +		content = contentOption.call( target[ 0 ], function( response ) {
        +
        +			// IE may instantly serve a cached response for ajax requests
        +			// delay this call to _open so the other call to _open runs first
        +			that._delay( function() {
        +
        +				// Ignore async response if tooltip was closed already
        +				if ( !target.data( "ui-tooltip-open" ) ) {
        +					return;
        +				}
        +
        +				// JQuery creates a special event for focusin when it doesn't
        +				// exist natively. To improve performance, the native event
        +				// object is reused and the type is changed. Therefore, we can't
        +				// rely on the type being correct after the event finished
        +				// bubbling, so we set it back to the previous value. (#8740)
        +				if ( event ) {
        +					event.type = eventType;
        +				}
        +				this._open( event, target, response );
        +			} );
        +		} );
        +		if ( content ) {
        +			this._open( event, target, content );
        +		}
        +	},
        +
        +	_open: function( event, target, content ) {
        +		var tooltipData, tooltip, delayedShow, a11yContent,
        +			positionOption = $.extend( {}, this.options.position );
        +
        +		if ( !content ) {
        +			return;
        +		}
        +
        +		// Content can be updated multiple times. If the tooltip already
        +		// exists, then just update the content and bail.
        +		tooltipData = this._find( target );
        +		if ( tooltipData ) {
        +			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
        +			return;
        +		}
        +
        +		// If we have a title, clear it to prevent the native tooltip
        +		// we have to check first to avoid defining a title if none exists
        +		// (we don't want to cause an element to start matching [title])
        +		//
        +		// We use removeAttr only for key events, to allow IE to export the correct
        +		// accessible attributes. For mouse events, set to empty string to avoid
        +		// native tooltip showing up (happens only when removing inside mouseover).
        +		if ( target.is( "[title]" ) ) {
        +			if ( event && event.type === "mouseover" ) {
        +				target.attr( "title", "" );
        +			} else {
        +				target.removeAttr( "title" );
        +			}
        +		}
        +
        +		tooltipData = this._tooltip( target );
        +		tooltip = tooltipData.tooltip;
        +		this._addDescribedBy( target, tooltip.attr( "id" ) );
        +		tooltip.find( ".ui-tooltip-content" ).html( content );
        +
        +		// Support: Voiceover on OS X, JAWS on IE <= 9
        +		// JAWS announces deletions even when aria-relevant="additions"
        +		// Voiceover will sometimes re-read the entire log region's contents from the beginning
        +		this.liveRegion.children().hide();
        +		a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() );
        +		a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" );
        +		a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
        +		a11yContent.appendTo( this.liveRegion );
        +
        +		function position( event ) {
        +			positionOption.of = event;
        +			if ( tooltip.is( ":hidden" ) ) {
        +				return;
        +			}
        +			tooltip.position( positionOption );
        +		}
        +		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
        +			this._on( this.document, {
        +				mousemove: position
        +			} );
        +
        +			// trigger once to override element-relative positioning
        +			position( event );
        +		} else {
        +			tooltip.position( $.extend( {
        +				of: target
        +			}, this.options.position ) );
        +		}
        +
        +		tooltip.hide();
        +
        +		this._show( tooltip, this.options.show );
        +
        +		// Handle tracking tooltips that are shown with a delay (#8644). As soon
        +		// as the tooltip is visible, position the tooltip using the most recent
        +		// event.
        +		// Adds the check to add the timers only when both delay and track options are set (#14682)
        +		if ( this.options.track && this.options.show && this.options.show.delay ) {
        +			delayedShow = this.delayedShow = setInterval( function() {
        +				if ( tooltip.is( ":visible" ) ) {
        +					position( positionOption.of );
        +					clearInterval( delayedShow );
        +				}
        +			}, $.fx.interval );
        +		}
        +
        +		this._trigger( "open", event, { tooltip: tooltip } );
        +	},
        +
        +	_registerCloseHandlers: function( event, target ) {
        +		var events = {
        +			keyup: function( event ) {
        +				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
        +					var fakeEvent = $.Event( event );
        +					fakeEvent.currentTarget = target[ 0 ];
        +					this.close( fakeEvent, true );
        +				}
        +			}
        +		};
        +
        +		// Only bind remove handler for delegated targets. Non-delegated
        +		// tooltips will handle this in destroy.
        +		if ( target[ 0 ] !== this.element[ 0 ] ) {
        +			events.remove = function() {
        +				this._removeTooltip( this._find( target ).tooltip );
        +			};
        +		}
        +
        +		if ( !event || event.type === "mouseover" ) {
        +			events.mouseleave = "close";
        +		}
        +		if ( !event || event.type === "focusin" ) {
        +			events.focusout = "close";
        +		}
        +		this._on( true, target, events );
        +	},
        +
        +	close: function( event ) {
        +		var tooltip,
        +			that = this,
        +			target = $( event ? event.currentTarget : this.element ),
        +			tooltipData = this._find( target );
        +
        +		// The tooltip may already be closed
        +		if ( !tooltipData ) {
        +
        +			// We set ui-tooltip-open immediately upon open (in open()), but only set the
        +			// additional data once there's actually content to show (in _open()). So even if the
        +			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
        +			// the period between open() and _open().
        +			target.removeData( "ui-tooltip-open" );
        +			return;
        +		}
        +
        +		tooltip = tooltipData.tooltip;
        +
        +		// Disabling closes the tooltip, so we need to track when we're closing
        +		// to avoid an infinite loop in case the tooltip becomes disabled on close
        +		if ( tooltipData.closing ) {
        +			return;
        +		}
        +
        +		// Clear the interval for delayed tracking tooltips
        +		clearInterval( this.delayedShow );
        +
        +		// Only set title if we had one before (see comment in _open())
        +		// If the title attribute has changed since open(), don't restore
        +		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
        +			target.attr( "title", target.data( "ui-tooltip-title" ) );
        +		}
        +
        +		this._removeDescribedBy( target );
        +
        +		tooltipData.hiding = true;
        +		tooltip.stop( true );
        +		this._hide( tooltip, this.options.hide, function() {
        +			that._removeTooltip( $( this ) );
        +		} );
        +
        +		target.removeData( "ui-tooltip-open" );
        +		this._off( target, "mouseleave focusout keyup" );
        +
        +		// Remove 'remove' binding only on delegated targets
        +		if ( target[ 0 ] !== this.element[ 0 ] ) {
        +			this._off( target, "remove" );
        +		}
        +		this._off( this.document, "mousemove" );
        +
        +		if ( event && event.type === "mouseleave" ) {
        +			$.each( this.parents, function( id, parent ) {
        +				$( parent.element ).attr( "title", parent.title );
        +				delete that.parents[ id ];
        +			} );
        +		}
        +
        +		tooltipData.closing = true;
        +		this._trigger( "close", event, { tooltip: tooltip } );
        +		if ( !tooltipData.hiding ) {
        +			tooltipData.closing = false;
        +		}
        +	},
        +
        +	_tooltip: function( element ) {
        +		var tooltip = $( "<div>" ).attr( "role", "tooltip" ),
        +			content = $( "<div>" ).appendTo( tooltip ),
        +			id = tooltip.uniqueId().attr( "id" );
        +
        +		this._addClass( content, "ui-tooltip-content" );
        +		this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" );
        +
        +		tooltip.appendTo( this._appendTo( element ) );
        +
        +		return this.tooltips[ id ] = {
        +			element: element,
        +			tooltip: tooltip
        +		};
        +	},
        +
        +	_find: function( target ) {
        +		var id = target.data( "ui-tooltip-id" );
        +		return id ? this.tooltips[ id ] : null;
        +	},
        +
        +	_removeTooltip: function( tooltip ) {
        +		tooltip.remove();
        +		delete this.tooltips[ tooltip.attr( "id" ) ];
        +	},
        +
        +	_appendTo: function( target ) {
        +		var element = target.closest( ".ui-front, dialog" );
        +
        +		if ( !element.length ) {
        +			element = this.document[ 0 ].body;
        +		}
        +
        +		return element;
        +	},
        +
        +	_destroy: function() {
        +		var that = this;
        +
        +		// Close open tooltips
        +		$.each( this.tooltips, function( id, tooltipData ) {
        +
        +			// Delegate to close method to handle common cleanup
        +			var event = $.Event( "blur" ),
        +				element = tooltipData.element;
        +			event.target = event.currentTarget = element[ 0 ];
        +			that.close( event, true );
        +
        +			// Remove immediately; destroying an open tooltip doesn't use the
        +			// hide animation
        +			$( "#" + id ).remove();
        +
        +			// Restore the title
        +			if ( element.data( "ui-tooltip-title" ) ) {
        +
        +				// If the title attribute has changed since open(), don't restore
        +				if ( !element.attr( "title" ) ) {
        +					element.attr( "title", element.data( "ui-tooltip-title" ) );
        +				}
        +				element.removeData( "ui-tooltip-title" );
        +			}
        +		} );
        +		this.liveRegion.remove();
        +	}
        +} );
        +
        +// DEPRECATED
        +// TODO: Switch return back to widget declaration at top of file when this is removed
        +if ( $.uiBackCompat !== false ) {
        +
        +	// Backcompat for tooltipClass option
        +	$.widget( "ui.tooltip", $.ui.tooltip, {
        +		options: {
        +			tooltipClass: null
        +		},
        +		_tooltip: function() {
        +			var tooltipData = this._superApply( arguments );
        +			if ( this.options.tooltipClass ) {
        +				tooltipData.tooltip.addClass( this.options.tooltipClass );
        +			}
        +			return tooltipData;
        +		}
        +	} );
        +}
        +
        +return $.ui.tooltip;
        +
        +} ) );
        diff --git a/bower_components/jquery.iframe-transport/.bower.json b/bower_components/jquery.iframe-transport/.bower.json
        new file mode 100644
        index 0000000000..7a3c177219
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/.bower.json
        @@ -0,0 +1,38 @@
        +{
        +  "name": "jquery.iframe-transport",
        +  "version": "1.0.1",
        +  "homepage": "https://cmlenz.github.io/jquery-iframe-transport/",
        +  "authors": [
        +    "Christopher Lenz <cmlenz@gmail.com>"
        +  ],
        +  "description": "jQuery plugin that implements an iframe transport so that ajax calls support the uploading of files using standard HTML file input fields",
        +  "main": "jquery.iframe-transport.js",
        +  "dependencies": {
        +    "jquery": ">=1.6"
        +  },
        +  "keywords": [
        +    "jquery",
        +    "iframe",
        +    "upload",
        +    "file",
        +    "form",
        +    "ajax"
        +  ],
        +  "license": "MIT",
        +  "ignore": [
        +    "**/.*",
        +    "node_modules",
        +    "bower_components",
        +    "Gruntfile.js"
        +  ],
        +  "_release": "1.0.1",
        +  "_resolution": {
        +    "type": "version",
        +    "tag": "v1.0.1",
        +    "commit": "f9a5446f5f8a9d7bc4659ea9c49349b1f585316b"
        +  },
        +  "_source": "https://github.com/cmlenz/jquery-iframe-transport.git",
        +  "_target": "^1.0.1",
        +  "_originalSource": "jquery.iframe-transport",
        +  "_direct": true
        +}
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/License.txt b/bower_components/jquery.iframe-transport/LICENSE
        old mode 100755
        new mode 100644
        similarity index 94%
        rename from resources/assets/js/plugins/datatables/extensions/FixedColumns/License.txt
        rename to bower_components/jquery.iframe-transport/LICENSE
        index 9ade2f1b64..4fb2fda86c
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/License.txt
        +++ b/bower_components/jquery.iframe-transport/LICENSE
        @@ -1,5 +1,6 @@
        -Copyright (c) 2010-2015 SpryMedia Limited
        -http://datatables.net
        +The MIT License
        +
        +Copyright (c) 2014 Christopher Lenz
         
         Permission is hereby granted, free of charge, to any person obtaining a copy
         of this software and associated documentation files (the "Software"), to deal
        diff --git a/bower_components/jquery.iframe-transport/README.md b/bower_components/jquery.iframe-transport/README.md
        new file mode 100644
        index 0000000000..786ddcc44d
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/README.md
        @@ -0,0 +1,19 @@
        +# jQuery Iframe Transport
        +
        +jQuery Ajax transport plugin for iframe-based file uploads. For documentation, see:
        +
        +[https://cmlenz.github.io/jquery-iframe-transport/](https://cmlenz.github.io/jquery-iframe-transport/)
        +
        +# Demo
        +
        +To run the included simple demo application, you'll need [node.js](http://nodejs.org/).
        +
        +In the `jquery-iframe-transport` source directory, run:
        +
        +    $ npm install
        +
        +That should download and install all dependencies required for the build, including running the demo app. Then simply run:
        +
        +    $ grunt connect
        +
        +Point your browser to http://localhost:3000/ and you should be able to play with the demo.
        diff --git a/bower_components/jquery.iframe-transport/bower.json b/bower_components/jquery.iframe-transport/bower.json
        new file mode 100644
        index 0000000000..30e3a22298
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/bower.json
        @@ -0,0 +1,28 @@
        +{
        +  "name": "jquery.iframe-transport",
        +  "version": "1.0.0",
        +  "homepage": "https://cmlenz.github.io/jquery-iframe-transport/",
        +  "authors": [
        +    "Christopher Lenz <cmlenz@gmail.com>"
        +  ],
        +  "description": "jQuery plugin that implements an iframe transport so that ajax calls support the uploading of files using standard HTML file input fields",
        +  "main": "jquery.iframe-transport.js",
        +  "dependencies": {
        +    "jquery": ">=1.6"
        +  },
        +  "keywords": [
        +    "jquery",
        +    "iframe",
        +    "upload",
        +    "file",
        +    "form",
        +    "ajax"
        +  ],
        +  "license": "MIT",
        +  "ignore": [
        +    "**/.*",
        +    "node_modules",
        +    "bower_components",
        +    "Gruntfile.js"
        +  ]
        +}
        diff --git a/bower_components/jquery.iframe-transport/demo/client.js b/bower_components/jquery.iframe-transport/demo/client.js
        new file mode 100644
        index 0000000000..6e1da38c54
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/demo/client.js
        @@ -0,0 +1,45 @@
        +(function($) {
        +  'use strict';
        +
        +  $('form').on('click', 'button[type=submit]', function(evt) {
        +    var form = $(this.form).addClass('loading');
        +    evt.preventDefault();
        +    $.ajax(form.prop('action'), {
        +      data: form.find('textarea').serializeArray(),
        +      dataType: 'json',
        +      files: form.find(':file'),
        +      iframe: true,
        +      processData: false
        +    }).always(function() {
        +      form.removeClass('loading');
        +    }).done(function(data) {
        +      console.log(data);
        +      $.each(data.files, function(idx, file) {
        +        $('<li class="list-group-item">' +
        +          '<h4 class="list-group-item-heading"></h4>' +
        +          '<p class="list-group-item-text"><span class="size"></span>, <span class="mime"></span></p>' +
        +          '<blockquote class="list-group-item-text comment"></blockquote></li>')
        +          .find('h4').text(file.originalFilename).end()
        +          .find('.size').text(formatSize(file.size)).end()
        +          .find('.mime').text(file.headers['content-type']).end()
        +          .find('.comment').text(data.comment || '').end()
        +          .appendTo('#filelist');
        +      });
        +      form.find(':file').val('');
        +    });
        +  });
        +
        +  function formatSize(size) {
        +    var units = ['B', 'KB', 'MB', 'GB'],
        +        idx = 0;
        +    if (!size) {
        +      return '0 bytes';
        +    }
        +    while (size >= 1024) {
        +      size /= 1024;
        +      idx++;
        +    }
        +    return size.toFixed(0) + ' ' + units[idx];
        +  }
        +
        +})(jQuery);
        diff --git a/bower_components/jquery.iframe-transport/demo/index.html b/bower_components/jquery.iframe-transport/demo/index.html
        new file mode 100644
        index 0000000000..bc1232392c
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/demo/index.html
        @@ -0,0 +1,50 @@
        +<!DOCTYPE html>
        +<html>
        +  <head>
        +    <title>jQuery Iframe Transport Demo</title>
        +    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
        +    <style>
        +      form.loading { background: url(spinner.gif) 100% 0 no-repeat; }
        +    </style>
        +  </head>
        +  <body>
        +    <div class="container">
        +      <div class="page-header">
        +        <h1>jQuery Iframe Transport Demo</h1>
        +      </div>
        +      <p class="help-block">
        +        This is a simple example showing a file upload field that gets
        +        transmitted asynchronously using the iframe transport. Just choose one or
        +        more files, and they will be uploaded to the server (but not stored). After
        +        one upload has completed, you can upload more files.
        +      </p>
        +      <p class="help-block">
        +        Please note that this example needs to run via
        +        <code>grunt connect</code>, as uploads require a server-side
        +        component to work properly.
        +      </p>
        +      <div class="panel panel-default">
        +        <div class="panel-body">
        +          <form role="form" id="upload" action="/upload" method="post" enctype="multipart/form-data">
        +            <div class="form-group">
        +              <label for="file-field">Select files to upload:</label>
        +              <input type="file" id="file-field" name="file" multiple>
        +            </div>
        +            <div class="form-group">
        +              <label for="comment-field">Comment:</label>
        +              <textarea name="comment" id="comment-field" class="form-control"
        +                placeholder="Enter comment" rows="2" cols="50"></textarea>
        +            </div>
        +            <div class="form-group">
        +              <button type="submit" class="btn btn-default btn-submit">Upload</button>
        +            </div>
        +          </form>
        +        </div>
        +      </div>
        +      <ul id="filelist" class="list-group"></ul>
        +    </div>
        +  </body>
        +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.js"></script>
        +  <script src="jquery.iframe-transport.js"></script>
        +  <script src="client.js"></script>
        +</html>
        diff --git a/bower_components/jquery.iframe-transport/demo/layout.css b/bower_components/jquery.iframe-transport/demo/layout.css
        new file mode 100644
        index 0000000000..34dc588ae7
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/demo/layout.css
        @@ -0,0 +1 @@
        +form.loading { background: url(spinner.gif) 100% 0 no-repeat; }
        diff --git a/bower_components/jquery.iframe-transport/demo/spinner.gif b/bower_components/jquery.iframe-transport/demo/spinner.gif
        new file mode 100644
        index 0000000000..5b33f7e54f
        Binary files /dev/null and b/bower_components/jquery.iframe-transport/demo/spinner.gif differ
        diff --git a/bower_components/jquery.iframe-transport/jquery.iframe-transport.js b/bower_components/jquery.iframe-transport/jquery.iframe-transport.js
        new file mode 100644
        index 0000000000..289c5cd486
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/jquery.iframe-transport.js
        @@ -0,0 +1,247 @@
        +// This [jQuery](https://jquery.com/) plugin implements an `<iframe>`
        +// [transport](https://api.jquery.com/jQuery.ajax/#extending-ajax) so that
        +// `$.ajax()` calls support the uploading of files using standard HTML file
        +// input fields. This is done by switching the exchange from `XMLHttpRequest`
        +// to a hidden `iframe` element containing a form that is submitted.
        +
        +// The [source for the plugin](https://github.com/cmlenz/jquery-iframe-transport)
        +// is available on [Github](https://github.com/) and licensed under the [MIT
        +// license](https://github.com/cmlenz/jquery-iframe-transport/blob/master/LICENSE).
        +
        +// ## Usage
        +
        +// To use this plugin, you simply add an `iframe` option with the value `true`
        +// to the Ajax settings an `$.ajax()` call, and specify the file fields to
        +// include in the submssion using the `files` option, which can be a selector,
        +// jQuery object, or a list of DOM elements containing one or more
        +// `<input type="file">` elements:
        +
        +//     $("#myform").submit(function() {
        +//         $.ajax(this.action, {
        +//             files: $(":file", this),
        +//             iframe: true
        +//         }).complete(function(data) {
        +//             console.log(data);
        +//         });
        +//     });
        +
        +// The plugin will construct hidden `<iframe>` and `<form>` elements, add the
        +// file field(s) to that form, submit the form, and process the response.
        +
        +// If you want to include other form fields in the form submission, include
        +// them in the `data` option, and set the `processData` option to `false`:
        +
        +//     $("#myform").submit(function() {
        +//         $.ajax(this.action, {
        +//             data: $(":text", this).serializeArray(),
        +//             files: $(":file", this),
        +//             iframe: true,
        +//             processData: false
        +//         }).complete(function(data) {
        +//             console.log(data);
        +//         });
        +//     });
        +
        +// ### Response Data Types
        +
        +// As the transport does not have access to the HTTP headers of the server
        +// response, it is not as simple to make use of the automatic content type
        +// detection provided by jQuery as with regular XHR. If you can't set the
        +// expected response data type (for example because it may vary depending on
        +// the outcome of processing by the server), you will need to employ a
        +// workaround on the server side: Send back an HTML document containing just a
        +// `<textarea>` element with a `data-type` attribute that specifies the MIME
        +// type, and put the actual payload in the textarea:
        +
        +//     <textarea data-type="application/json">
        +//       {"ok": true, "message": "Thanks so much"}
        +//     </textarea>
        +
        +// The iframe transport plugin will detect this and pass the value of the
        +// `data-type` attribute on to jQuery as if it was the "Content-Type" response
        +// header, thereby enabling the same kind of conversions that jQuery applies
        +// to regular responses. For the example above you should get a Javascript
        +// object as the `data` parameter of the `complete` callback, with the
        +// properties `ok: true` and `message: "Thanks so much"`.
        +
        +// ### Handling Server Errors
        +
        +// Another problem with using an `iframe` for file uploads is that it is
        +// impossible for the javascript code to determine the HTTP status code of the
        +// servers response. Effectively, all of the calls you make will look like they
        +// are getting successful responses, and thus invoke the `done()` or
        +// `complete()` callbacks. You can only communicate problems using the content
        +// of the response payload. For example, consider using a JSON response such as
        +// the following to indicate a problem with an uploaded file:
        +
        +//     <textarea data-type="application/json">
        +//       {"ok": false, "message": "Please only upload reasonably sized files."}
        +//     </textarea>
        +
        +// ### Compatibility
        +
        +// This plugin has primarily been tested on Safari 5 (or later), Firefox 4 (or
        +// later), and Internet Explorer (all the way back to version 6). While I
        +// haven't found any issues with it so far, I'm fairly sure it still doesn't
        +// work around all the quirks in all different browsers. But the code is still
        +// pretty simple overall, so you should be able to fix it and contribute a
        +// patch :)
        +
        +// ## Annotated Source
        +
        +(function($, undefined) {
        +  "use strict";
        +
        +  // Register a prefilter that checks whether the `iframe` option is set, and
        +  // switches to the "iframe" data type if it is `true`.
        +  $.ajaxPrefilter(function(options, origOptions, jqXHR) {
        +    if (options.iframe) {
        +      options.originalURL = options.url;
        +      return "iframe";
        +    }
        +  });
        +
        +  // Register a transport for the "iframe" data type. It will only activate
        +  // when the "files" option has been set to a non-empty list of enabled file
        +  // inputs.
        +  $.ajaxTransport("iframe", function(options, origOptions, jqXHR) {
        +    var form = null,
        +        iframe = null,
        +        name = "iframe-" + $.now(),
        +        files = $(options.files).filter(":file:enabled"),
        +        markers = null,
        +        accepts = null;
        +
        +    // This function gets called after a successful submission or an abortion
        +    // and should revert all changes made to the page to enable the
        +    // submission via this transport.
        +    function cleanUp() {
        +      files.each(function(i, file) {
        +        var $file = $(file);
        +        $file.data("clone").replaceWith($file);
        +      });
        +      form.remove();
        +      iframe.one("load", function() { iframe.remove(); });
        +      iframe.attr("src", "about:blank");
        +    }
        +
        +    // Remove "iframe" from the data types list so that further processing is
        +    // based on the content type returned by the server, without attempting an
        +    // (unsupported) conversion from "iframe" to the actual type.
        +    options.dataTypes.shift();
        +
        +    // Use the data from the original AJAX options, as it doesn't seem to be 
        +    // copied over since jQuery 1.7.
        +    // See https://github.com/cmlenz/jquery-iframe-transport/issues/6
        +    options.data = origOptions.data;
        +
        +    if (files.length) {
        +      form = $("<form enctype='multipart/form-data' method='post'></form>").
        +        hide().attr({action: options.originalURL, target: name});
        +
        +      // If there is any additional data specified via the `data` option,
        +      // we add it as hidden fields to the form. This (currently) requires
        +      // the `processData` option to be set to false so that the data doesn't
        +      // get serialized to a string.
        +      if (typeof(options.data) === "string" && options.data.length > 0) {
        +        $.error("data must not be serialized");
        +      }
        +      $.each(options.data || {}, function(name, value) {
        +        if ($.isPlainObject(value)) {
        +          name = value.name;
        +          value = value.value;
        +        }
        +        $("<input type='hidden' />").attr({name:  name, value: value}).
        +          appendTo(form);
        +      });
        +
        +      // Add a hidden `X-Requested-With` field with the value `IFrame` to the
        +      // field, to help server-side code to determine that the upload happened
        +      // through this transport.
        +      $("<input type='hidden' value='IFrame' name='X-Requested-With' />").
        +        appendTo(form);
        +
        +      // Borrowed straight from the JQuery source.
        +      // Provides a way of specifying the accepted data type similar to the
        +      // HTTP "Accept" header
        +      if (options.dataTypes[0] && options.accepts[options.dataTypes[0]]) {
        +        accepts = options.accepts[options.dataTypes[0]] +
        +                  (options.dataTypes[0] !== "*" ? ", */*; q=0.01" : "");
        +      } else {
        +        accepts = options.accepts["*"];
        +      }
        +      $("<input type='hidden' name='X-HTTP-Accept'>").
        +        attr("value", accepts).appendTo(form);
        +
        +      // Move the file fields into the hidden form, but first remember their
        +      // original locations in the document by replacing them with disabled
        +      // clones. This should also avoid introducing unwanted changes to the
        +      // page layout during submission.
        +      markers = files.after(function(idx) {
        +        var $this = $(this),
        +            $clone = $this.clone().prop("disabled", true);
        +        $this.data("clone", $clone);
        +        return $clone;
        +      }).next();
        +      files.appendTo(form);
        +
        +      return {
        +
        +        // The `send` function is called by jQuery when the request should be
        +        // sent.
        +        send: function(headers, completeCallback) {
        +          iframe = $("<iframe src='about:blank' name='" + name +
        +            "' id='" + name + "' style='display:none'></iframe>");
        +
        +          // The first load event gets fired after the iframe has been injected
        +          // into the DOM, and is used to prepare the actual submission.
        +          iframe.one("load", function() {
        +
        +            // The second load event gets fired when the response to the form
        +            // submission is received. The implementation detects whether the
        +            // actual payload is embedded in a `<textarea>` element, and
        +            // prepares the required conversions to be made in that case.
        +            iframe.one("load", function() {
        +              var doc = this.contentWindow ? this.contentWindow.document :
        +                (this.contentDocument ? this.contentDocument : this.document),
        +                root = doc.documentElement ? doc.documentElement : doc.body,
        +                textarea = root.getElementsByTagName("textarea")[0],
        +                type = textarea && textarea.getAttribute("data-type") || null,
        +                status = textarea && textarea.getAttribute("data-status") || 200,
        +                statusText = textarea && textarea.getAttribute("data-statusText") || "OK",
        +                content = {
        +                  html: root.innerHTML,
        +                  text: type ?
        +                    textarea.value :
        +                    root ? (root.textContent || root.innerText) : null
        +                };
        +              cleanUp();
        +              completeCallback(status, statusText, content, type ?
        +                ("Content-Type: " + type) :
        +                null);
        +            });
        +
        +            // Now that the load handler has been set up, submit the form.
        +            form[0].submit();
        +          });
        +
        +          // After everything has been set up correctly, the form and iframe
        +          // get injected into the DOM so that the submission can be
        +          // initiated.
        +          $("body").append(form, iframe);
        +        },
        +
        +        // The `abort` function is called by jQuery when the request should be
        +        // aborted.
        +        abort: function() {
        +          if (iframe !== null) {
        +            iframe.unbind("load").attr("src", "about:blank");
        +            cleanUp();
        +          }
        +        }
        +
        +      };
        +    }
        +  });
        +
        +})(jQuery);
        diff --git a/bower_components/jquery.iframe-transport/package.json b/bower_components/jquery.iframe-transport/package.json
        new file mode 100644
        index 0000000000..31fb669437
        --- /dev/null
        +++ b/bower_components/jquery.iframe-transport/package.json
        @@ -0,0 +1,28 @@
        +{
        +  "name": "jquery.iframe-transport",
        +  "version": "1.0.0",
        +  "description": "jQuery plugin that implements an iframe transport so that ajax calls support the uploading of files using standard HTML file input fields",
        +  "main": "jquery.iframe-transport.js",
        +  "directories": {
        +    "demo": "demo"
        +  },
        +  "repository": {
        +    "type": "git",
        +    "url": "http://github.com/cmlenz/jquery-iframe-transport"
        +  },
        +  "author": "Christopher Lenz",
        +  "license": "MIT",
        +  "readmeFilename": "README.md",
        +  "devDependencies": {
        +    "grunt": "~0.4.1",
        +    "grunt-contrib-clean": "~0.5.0",
        +    "grunt-contrib-connect": "~0.7.1",
        +    "grunt-contrib-copy": "~0.5.0",
        +    "grunt-contrib-jshint": "~0.9.2",
        +    "grunt-contrib-uglify": "~0.4.0",
        +    "grunt-docco": "~0.3.3",
        +    "grunt-gh-pages": "~0.9.1",
        +    "grunt-shell": "~0.6.4",
        +    "multiparty": "~3.2.4"
        +  }
        +}
        diff --git a/bower_components/jquery/.bower.json b/bower_components/jquery/.bower.json
        new file mode 100644
        index 0000000000..878da023e1
        --- /dev/null
        +++ b/bower_components/jquery/.bower.json
        @@ -0,0 +1,25 @@
        +{
        +  "name": "jquery",
        +  "main": "dist/jquery.js",
        +  "license": "MIT",
        +  "ignore": [
        +    "package.json"
        +  ],
        +  "keywords": [
        +    "jquery",
        +    "javascript",
        +    "browser",
        +    "library"
        +  ],
        +  "homepage": "https://github.com/jquery/jquery-dist",
        +  "version": "3.1.1",
        +  "_release": "3.1.1",
        +  "_resolution": {
        +    "type": "version",
        +    "tag": "3.1.1",
        +    "commit": "1b30f3ad466ebf2714d47eda34dbd7fdf6849fe3"
        +  },
        +  "_source": "https://github.com/jquery/jquery-dist.git",
        +  "_target": ">=1.6",
        +  "_originalSource": "jquery"
        +}
        \ No newline at end of file
        diff --git a/bower_components/jquery/AUTHORS.txt b/bower_components/jquery/AUTHORS.txt
        new file mode 100644
        index 0000000000..334363deaa
        --- /dev/null
        +++ b/bower_components/jquery/AUTHORS.txt
        @@ -0,0 +1,295 @@
        +Authors ordered by first contribution.
        +
        +John Resig <jeresig@gmail.com>
        +Gilles van den Hoven <gilles0181@gmail.com>
        +Michael Geary <mike@geary.com>
        +Stefan Petre <stefan.petre@gmail.com>
        +Yehuda Katz <wycats@gmail.com>
        +Corey Jewett <cj@syntheticplayground.com>
        +Klaus Hartl <klaus.hartl@gmail.com>
        +Franck Marcia <franck.marcia@gmail.com>
        +Jörn Zaefferer <joern.zaefferer@gmail.com>
        +Paul Bakaus <paul.bakaus@gmail.com>
        +Brandon Aaron <brandon.aaron@gmail.com>
        +Mike Alsup <malsup@gmail.com>
        +Dave Methvin <dave.methvin@gmail.com>
        +Ed Engelhardt <edengelhardt@gmail.com>
        +Sean Catchpole <littlecooldude@gmail.com>
        +Paul Mclanahan <pmclanahan@gmail.com>
        +David Serduke <davidserduke@gmail.com>
        +Richard D. Worth <rdworth@gmail.com>
        +Scott González <scott.gonzalez@gmail.com>
        +Ariel Flesler <aflesler@gmail.com>
        +Jon Evans <jon@springyweb.com>
        +TJ Holowaychuk <tj@vision-media.ca>
        +Michael Bensoussan <mickey@seesmic.com>
        +Robert Katić <robert.katic@gmail.com>
        +Louis-Rémi Babé <lrbabe@gmail.com>
        +Earle Castledine <mrspeaker@gmail.com>
        +Damian Janowski <damian.janowski@gmail.com>
        +Rich Dougherty <rich@rd.gen.nz>
        +Kim Dalsgaard <kim@kimdalsgaard.com>
        +Andrea Giammarchi <andrea.giammarchi@gmail.com>
        +Mark Gibson <jollytoad@gmail.com>
        +Karl Swedberg <kswedberg@gmail.com>
        +Justin Meyer <justinbmeyer@gmail.com>
        +Ben Alman <cowboy@rj3.net>
        +James Padolsey <cla@padolsey.net>
        +David Petersen <public@petersendidit.com>
        +Batiste Bieler <batiste.bieler@gmail.com>
        +Alexander Farkas <info@corrupt-system.de>
        +Rick Waldron <waldron.rick@gmail.com>
        +Filipe Fortes <filipe@fortes.com>
        +Neeraj Singh <neerajdotname@gmail.com>
        +Paul Irish <paul.irish@gmail.com>
        +Iraê Carvalho <irae@irae.pro.br>
        +Matt Curry <matt@pseudocoder.com>
        +Michael Monteleone <michael@michaelmonteleone.net>
        +Noah Sloan <noah.sloan@gmail.com>
        +Tom Viner <github@viner.tv>
        +Douglas Neiner <doug@dougneiner.com>
        +Adam J. Sontag <ajpiano@ajpiano.com>
        +Dave Reed <dareed@microsoft.com>
        +Ralph Whitbeck <ralph.whitbeck@gmail.com>
        +Carl Fürstenberg <azatoth@gmail.com>
        +Jacob Wright <jacwright@gmail.com>
        +J. Ryan Stinnett <jryans@gmail.com>
        +unknown <Igen005@.upcorp.ad.uprr.com>
        +temp01 <temp01irc@gmail.com>
        +Heungsub Lee <h@subl.ee>
        +Colin Snover <github.com@zetafleet.com>
        +Ryan W Tenney <ryan@10e.us>
        +Pinhook <contact@pinhooklabs.com>
        +Ron Otten <r.j.g.otten@gmail.com>
        +Jephte Clain <Jephte.Clain@univ-reunion.fr>
        +Anton Matzneller <obhvsbypqghgc@gmail.com>
        +Alex Sexton <AlexSexton@gmail.com>
        +Dan Heberden <danheberden@gmail.com>
        +Henri Wiechers <hwiechers@gmail.com>
        +Russell Holbrook <russell.holbrook@patch.com>
        +Julian Aubourg <aubourg.julian@gmail.com>
        +Gianni Alessandro Chiappetta <gianni@runlevel6.org>
        +Scott Jehl <scottjehl@gmail.com>
        +James Burke <jrburke@gmail.com>
        +Jonas Pfenniger <jonas@pfenniger.name>
        +Xavi Ramirez <xavi.rmz@gmail.com>
        +Jared Grippe <jared@deadlyicon.com>
        +Sylvester Keil <sylvester@keil.or.at>
        +Brandon Sterne <bsterne@mozilla.com>
        +Mathias Bynens <mathias@qiwi.be>
        +Timmy Willison <4timmywil@gmail.com>
        +Corey Frang <gnarf37@gmail.com>
        +Digitalxero <digitalxero>
        +Anton Kovalyov <anton@kovalyov.net>
        +David Murdoch <david@davidmurdoch.com>
        +Josh Varner <josh.varner@gmail.com>
        +Charles McNulty <cmcnulty@kznf.com>
        +Jordan Boesch <jboesch26@gmail.com>
        +Jess Thrysoee <jess@thrysoee.dk>
        +Michael Murray <m@murz.net>
        +Lee Carpenter <elcarpie@gmail.com>
        +Alexis Abril <me@alexisabril.com>
        +Rob Morgan <robbym@gmail.com>
        +John Firebaugh <john_firebaugh@bigfix.com>
        +Sam Bisbee <sam@sbisbee.com>
        +Gilmore Davidson <gilmoreorless@gmail.com>
        +Brian Brennan <me@brianlovesthings.com>
        +Xavier Montillet <xavierm02.net@gmail.com>
        +Daniel Pihlstrom <sciolist.se@gmail.com>
        +Sahab Yazdani <sahab.yazdani+github@gmail.com>
        +avaly <github-com@agachi.name>
        +Scott Hughes <hi@scott-hughes.me>
        +Mike Sherov <mike.sherov@gmail.com>
        +Greg Hazel <ghazel@gmail.com>
        +Schalk Neethling <schalk@ossreleasefeed.com>
        +Denis Knauf <Denis.Knauf@gmail.com>
        +Timo Tijhof <krinklemail@gmail.com>
        +Steen Nielsen <swinedk@gmail.com>
        +Anton Ryzhov <anton@ryzhov.me>
        +Shi Chuan <shichuanr@gmail.com>
        +Berker Peksag <berker.peksag@gmail.com>
        +Toby Brain <tobyb@freshview.com>
        +Matt Mueller <mattmuelle@gmail.com>
        +Justin <drakefjustin@gmail.com>
        +Daniel Herman <daniel.c.herman@gmail.com>
        +Oleg Gaidarenko <markelog@gmail.com>
        +Richard Gibson <richard.gibson@gmail.com>
        +Rafaël Blais Masson <rafbmasson@gmail.com>
        +cmc3cn <59194618@qq.com>
        +Joe Presbrey <presbrey@gmail.com>
        +Sindre Sorhus <sindresorhus@gmail.com>
        +Arne de Bree <arne@bukkie.nl>
        +Vladislav Zarakovsky <vlad.zar@gmail.com>
        +Andrew E Monat <amonat@gmail.com>
        +Oskari <admin@o-programs.com>
        +Joao Henrique de Andrade Bruni <joaohbruni@yahoo.com.br>
        +tsinha <tsinha@Anthonys-MacBook-Pro.local>
        +Matt Farmer <matt@frmr.me>
        +Trey Hunner <treyhunner@gmail.com>
        +Jason Moon <jmoon@socialcast.com>
        +Jeffery To <jeffery.to@gmail.com>
        +Kris Borchers <kris.borchers@gmail.com>
        +Vladimir Zhuravlev <private.face@gmail.com>
        +Jacob Thornton <jacobthornton@gmail.com>
        +Chad Killingsworth <chadkillingsworth@missouristate.edu>
        +Nowres Rafid <nowres.rafed@gmail.com>
        +David Benjamin <davidben@mit.edu>
        +Uri Gilad <antishok@gmail.com>
        +Chris Faulkner <thefaulkner@gmail.com>
        +Elijah Manor <elijah.manor@gmail.com>
        +Daniel Chatfield <chatfielddaniel@gmail.com>
        +Nikita Govorov <nikita.govorov@gmail.com>
        +Wesley Walser <waw325@gmail.com>
        +Mike Pennisi <mike@mikepennisi.com>
        +Markus Staab <markus.staab@redaxo.de>
        +Dave Riddle <david@joyvuu.com>
        +Callum Macrae <callum@lynxphp.com>
        +Benjamin Truyman <bentruyman@gmail.com>
        +James Huston <james@jameshuston.net>
        +Erick Ruiz de Chávez <erickrdch@gmail.com>
        +David Bonner <dbonner@cogolabs.com>
        +Akintayo Akinwunmi <aakinwunmi@judge.com>
        +MORGAN <morgan@morgangraphics.com>
        +Ismail Khair <ismail.khair@gmail.com>
        +Carl Danley <carldanley@gmail.com>
        +Mike Petrovich <michael.c.petrovich@gmail.com>
        +Greg Lavallee <greglavallee@wapolabs.com>
        +Daniel Gálvez <dgalvez@editablething.com>
        +Sai Lung Wong <sai.wong@huffingtonpost.com>
        +Tom H Fuertes <TomFuertes@gmail.com>
        +Roland Eckl <eckl.roland@googlemail.com>
        +Jay Merrifield <fracmak@gmail.com>
        +Allen J Schmidt Jr <cobrasoft@gmail.com>
        +Jonathan Sampson <jjdsampson@gmail.com>
        +Marcel Greter <marcel.greter@ocbnet.ch>
        +Matthias Jäggli <matthias.jaeggli@gmail.com>
        +David Fox <dfoxinator@gmail.com>
        +Yiming He <yiminghe@gmail.com>
        +Devin Cooper <cooper.semantics@gmail.com>
        +Paul Ramos <paul.b.ramos@gmail.com>
        +Rod Vagg <rod@vagg.org>
        +Bennett Sorbo <bsorbo@gmail.com>
        +Sebastian Burkhard <sebi.burkhard@gmail.com>
        +Zachary Adam Kaplan <razic@viralkitty.com>
        +nanto_vi <nanto@moon.email.ne.jp>
        +nanto <nanto@moon.email.ne.jp>
        +Danil Somsikov <danilasomsikov@gmail.com>
        +Ryunosuke SATO <tricknotes.rs@gmail.com>
        +Jean Boussier <jean.boussier@gmail.com>
        +Adam Coulombe <me@adam.co>
        +Andrew Plummer <plummer.andrew@gmail.com>
        +Mark Raddatz <mraddatz@gmail.com>
        +Isaac Z. Schlueter <i@izs.me>
        +Karl Sieburg <ksieburg@yahoo.com>
        +Pascal Borreli <pascal@borreli.com>
        +Nguyen Phuc Lam <ruado1987@gmail.com>
        +Dmitry Gusev <dmitry.gusev@gmail.com>
        +Michał Gołębiowski <m.goleb@gmail.com>
        +Li Xudong <istonelee@gmail.com>
        +Steven Benner <admin@stevenbenner.com>
        +Tom H Fuertes <tomfuertes@gmail.com>
        +Renato Oliveira dos Santos <ros3@cin.ufpe.br>
        +ros3cin <ros3@cin.ufpe.br>
        +Jason Bedard <jason+jquery@jbedard.ca>
        +Kyle Robinson Young <kyle@dontkry.com>
        +Chris Talkington <chris@talkingtontech.com>
        +Eddie Monge <eddie@eddiemonge.com>
        +Terry Jones <terry@jon.es>
        +Jason Merino <jasonmerino@gmail.com>
        +Jeremy Dunck <jdunck@gmail.com>
        +Chris Price <price.c@gmail.com>
        +Guy Bedford <guybedford@gmail.com>
        +Amey Sakhadeo <me@ameyms.com>
        +Mike Sidorov <mikes.ekb@gmail.com>
        +Anthony Ryan <anthonyryan1@gmail.com>
        +Dominik D. Geyer <dominik.geyer@gmail.com>
        +George Kats <katsgeorgeek@gmail.com>
        +Lihan Li <frankieteardrop@gmail.com>
        +Ronny Springer <springer.ronny@gmail.com>
        +Chris Antaki <ChrisAntaki@gmail.com>
        +Marian Sollmann <marian.sollmann@cargomedia.ch>
        +njhamann <njhamann@gmail.com>
        +Ilya Kantor <iliakan@gmail.com>
        +David Hong <d.hong@me.com>
        +John Paul <john@johnkpaul.com>
        +Jakob Stoeck <jakob@pokermania.de>
        +Christopher Jones <chris@cjqed.com>
        +Forbes Lindesay <forbes@lindesay.co.uk>
        +S. Andrew Sheppard <andrew@wq.io>
        +Leonardo Balter <leonardo.balter@gmail.com>
        +Roman Reiß <me@silverwind.io>
        +Benjy Cui <benjytrys@gmail.com>
        +Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com>
        +John Hoven <hovenj@gmail.com>
        +Philip Jägenstedt <philip@foolip.org>
        +Christian Kosmowski <ksmwsk@gmail.com>
        +Liang Peng <poppinlp@gmail.com>
        +TJ VanToll <tj.vantoll@gmail.com>
        +Senya Pugach <upisfree@outlook.com>
        +Aurelio De Rosa <aurelioderosa@gmail.com>
        +Nazar Mokrynskyi <nazar@mokrynskyi.com>
        +Amit Merchant <bullredeyes@gmail.com>
        +Jason Bedard <jason+github@jbedard.ca>
        +Arthur Verschaeve <contact@arthurverschaeve.be>
        +Dan Hart <danhart@notonthehighstreet.com>
        +Bin Xin <rhyzix@gmail.com>
        +David Corbacho <davidcorbacho@gmail.com>
        +Veaceslav Grimalschi <grimalschi@yandex.ru>
        +Daniel Husar <dano.husar@gmail.com>
        +Frederic Hemberger <mail@frederic-hemberger.de>
        +Ben Toews <mastahyeti@gmail.com>
        +Aditya Raghavan <araghavan3@gmail.com>
        +Victor Homyakov <vkhomyackov@gmail.com>
        +Shivaji Varma <contact@shivajivarma.com>
        +Nicolas HENRY <icewil@gmail.com>
        +Anne-Gaelle Colom <coloma@westminster.ac.uk>
        +George Mauer <gmauer@gmail.com>
        +Leonardo Braga <leonardo.braga@gmail.com>
        +Stephen Edgar <stephen@netweb.com.au>
        +Thomas Tortorini <thomastortorini@gmail.com>
        +Winston Howes <winstonhowes@gmail.com>
        +Jon Hester <jon.d.hester@gmail.com>
        +Alexander O'Mara <me@alexomara.com>
        +Bastian Buchholz <buchholz.bastian@googlemail.com>
        +Arthur Stolyar <nekr.fabula@gmail.com>
        +Calvin Metcalf <calvin.metcalf@gmail.com>
        +Mu Haibao <mhbseal@163.com>
        +Richard McDaniel <rm0026@uah.edu>
        +Chris Rebert <github@rebertia.com>
        +Gabriel Schulhof <gabriel.schulhof@intel.com>
        +Gilad Peleg <giladp007@gmail.com>
        +Martin Naumann <martin@geekonaut.de>
        +Marek Lewandowski <m.lewandowski@cksource.com>
        +Bruno Pérel <brunoperel@gmail.com>
        +Reed Loden <reed@reedloden.com>
        +Daniel Nill <daniellnill@gmail.com>
        +Yongwoo Jeon <yongwoo.jeon@navercorp.com>
        +Sean Henderson <seanh.za@gmail.com>
        +Richard Kraaijenhagen <stdin+git@riichard.com>
        +Connor Atherton <c.liam.atherton@gmail.com>
        +Gary Ye <garysye@gmail.com>
        +Christian Grete <webmaster@christiangrete.com>
        +Liza Ramo <liza.h.ramo@gmail.com>
        +Julian Alexander Murillo <julian.alexander.murillo@gmail.com>
        +Joelle Fleurantin <joasqueeniebee@gmail.com>
        +Jae Sung Park <alberto.park@gmail.com>
        +Jun Sun <klsforever@gmail.com>
        +Josh Soref <apache@soref.com>
        +Henry Wong <henryw4k@gmail.com>
        +Jon Dufresne <jon.dufresne@gmail.com>
        +Martijn W. van der Lee <martijn@vanderlee.com>
        +Devin Wilson <dwilson6.github@gmail.com>
        +Steve Mao <maochenyan@gmail.com>
        +Zack Hall <zackhall@outlook.com>
        +Bernhard M. Wiedemann <jquerybmw@lsmod.de>
        +Todor Prikumov <tono_pr@abv.bg>
        +Jha Naman <createnaman@gmail.com>
        +William Robinet <william.robinet@conostix.com>
        +Alexander Lisianoi <all3fox@gmail.com>
        +Vitaliy Terziev <vitaliyterziev@gmail.com>
        +Joe Trumbull <trumbull.j@gmail.com>
        +Alexander K <xpyro@ya.ru>
        +Damian Senn <jquery@topaxi.codes>
        +Ralin Chimev <ralin.chimev@gmail.com>
        +Felipe Sateler <fsateler@gmail.com>
        +Christophe Tafani-Dereeper <christophetd@hotmail.fr>
        diff --git a/bower_components/jquery/LICENSE.txt b/bower_components/jquery/LICENSE.txt
        new file mode 100644
        index 0000000000..5312a4c864
        --- /dev/null
        +++ b/bower_components/jquery/LICENSE.txt
        @@ -0,0 +1,36 @@
        +Copyright jQuery Foundation and other contributors, https://jquery.org/
        +
        +This software consists of voluntary contributions made by many
        +individuals. For exact contribution history, see the revision history
        +available at https://github.com/jquery/jquery
        +
        +The following license applies to all parts of this software except as
        +documented below:
        +
        +====
        +
        +Permission is hereby granted, free of charge, to any person obtaining
        +a copy of this software and associated documentation files (the
        +"Software"), to deal in the Software without restriction, including
        +without limitation the rights to use, copy, modify, merge, publish,
        +distribute, sublicense, and/or sell copies of the Software, and to
        +permit persons to whom the Software is furnished to do so, subject to
        +the following conditions:
        +
        +The above copyright notice and this permission notice shall be
        +included in all copies or substantial portions of the Software.
        +
        +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
        +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
        +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
        +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
        +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
        +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
        +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        +
        +====
        +
        +All files located in the node_modules and external directories are
        +externally maintained libraries used by this software which have their
        +own licenses; we recommend you read them, as their terms may differ from
        +the terms above.
        diff --git a/bower_components/jquery/README.md b/bower_components/jquery/README.md
        new file mode 100644
        index 0000000000..ba3174a778
        --- /dev/null
        +++ b/bower_components/jquery/README.md
        @@ -0,0 +1,65 @@
        +# jQuery
        +
        +> jQuery is a fast, small, and feature-rich JavaScript library.
        +
        +For information on how to get started and how to use jQuery, please see [jQuery's documentation](http://api.jquery.com/).
        +For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery).
        +
        +## Including jQuery
        +
        +Below are some of the most common ways to include jQuery.
        +
        +### Browser
        +
        +#### Script tag
        +
        +```html
        +<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
        +```
        +
        +#### Babel
        +
        +[Babel](http://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively.
        +
        +```js
        +import $ from "jquery";
        +```
        +
        +#### Browserify/Webpack
        +
        +There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documention. In the script, including jQuery will usually look like this...
        +
        +```js
        +var $ = require("jquery");
        +```
        +
        +#### AMD (Asynchronous Module Definition)
        +
        +AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](http://requirejs.org/docs/whyamd.html).
        +
        +```js
        +define(["jquery"], function($) {
        +
        +});
        +```
        +
        +### Node
        +
        +To include jQuery in [Node](nodejs.org), first install with npm.
        +
        +```sh
        +npm install jquery
        +```
        +
        +For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/tmpvar/jsdom). This can be useful for testing purposes.
        +
        +```js
        +require("jsdom").env("", function(err, window) {
        +	if (err) {
        +		console.error(err);
        +		return;
        +	}
        +
        +	var $ = require("jquery")(window);
        +});
        +```
        diff --git a/bower_components/jquery/bower.json b/bower_components/jquery/bower.json
        new file mode 100644
        index 0000000000..95798d5ada
        --- /dev/null
        +++ b/bower_components/jquery/bower.json
        @@ -0,0 +1,14 @@
        +{
        +  "name": "jquery",
        +  "main": "dist/jquery.js",
        +  "license": "MIT",
        +  "ignore": [
        +    "package.json"
        +  ],
        +  "keywords": [
        +    "jquery",
        +    "javascript",
        +    "browser",
        +    "library"
        +  ]
        +}
        \ No newline at end of file
        diff --git a/bower_components/jquery/dist/core.js b/bower_components/jquery/dist/core.js
        new file mode 100644
        index 0000000000..4c8a4ab44b
        --- /dev/null
        +++ b/bower_components/jquery/dist/core.js
        @@ -0,0 +1,482 @@
        +/* global Symbol */
        +// Defining this global in .eslintrc.json would create a danger of using the global
        +// unguarded in another place, it seems safer to define global only for this module
        +
        +define( [
        +	"./var/arr",
        +	"./var/document",
        +	"./var/getProto",
        +	"./var/slice",
        +	"./var/concat",
        +	"./var/push",
        +	"./var/indexOf",
        +	"./var/class2type",
        +	"./var/toString",
        +	"./var/hasOwn",
        +	"./var/fnToString",
        +	"./var/ObjectFunctionString",
        +	"./var/support",
        +	"./core/DOMEval"
        +], function( arr, document, getProto, slice, concat, push, indexOf,
        +	class2type, toString, hasOwn, fnToString, ObjectFunctionString,
        +	support, DOMEval ) {
        +
        +"use strict";
        +
        +var
        +	version = "3.1.1",
        +
        +	// Define a local copy of jQuery
        +	jQuery = function( selector, context ) {
        +
        +		// The jQuery object is actually just the init constructor 'enhanced'
        +		// Need init if jQuery is called (just allow error to be thrown if not included)
        +		return new jQuery.fn.init( selector, context );
        +	},
        +
        +	// Support: Android <=4.0 only
        +	// Make sure we trim BOM and NBSP
        +	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
        +
        +	// Matches dashed string for camelizing
        +	rmsPrefix = /^-ms-/,
        +	rdashAlpha = /-([a-z])/g,
        +
        +	// Used by jQuery.camelCase as callback to replace()
        +	fcamelCase = function( all, letter ) {
        +		return letter.toUpperCase();
        +	};
        +
        +jQuery.fn = jQuery.prototype = {
        +
        +	// The current version of jQuery being used
        +	jquery: version,
        +
        +	constructor: jQuery,
        +
        +	// The default length of a jQuery object is 0
        +	length: 0,
        +
        +	toArray: function() {
        +		return slice.call( this );
        +	},
        +
        +	// Get the Nth element in the matched element set OR
        +	// Get the whole matched element set as a clean array
        +	get: function( num ) {
        +
        +		// Return all the elements in a clean array
        +		if ( num == null ) {
        +			return slice.call( this );
        +		}
        +
        +		// Return just the one element from the set
        +		return num < 0 ? this[ num + this.length ] : this[ num ];
        +	},
        +
        +	// Take an array of elements and push it onto the stack
        +	// (returning the new matched element set)
        +	pushStack: function( elems ) {
        +
        +		// Build a new jQuery matched element set
        +		var ret = jQuery.merge( this.constructor(), elems );
        +
        +		// Add the old object onto the stack (as a reference)
        +		ret.prevObject = this;
        +
        +		// Return the newly-formed element set
        +		return ret;
        +	},
        +
        +	// Execute a callback for every element in the matched set.
        +	each: function( callback ) {
        +		return jQuery.each( this, callback );
        +	},
        +
        +	map: function( callback ) {
        +		return this.pushStack( jQuery.map( this, function( elem, i ) {
        +			return callback.call( elem, i, elem );
        +		} ) );
        +	},
        +
        +	slice: function() {
        +		return this.pushStack( slice.apply( this, arguments ) );
        +	},
        +
        +	first: function() {
        +		return this.eq( 0 );
        +	},
        +
        +	last: function() {
        +		return this.eq( -1 );
        +	},
        +
        +	eq: function( i ) {
        +		var len = this.length,
        +			j = +i + ( i < 0 ? len : 0 );
        +		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
        +	},
        +
        +	end: function() {
        +		return this.prevObject || this.constructor();
        +	},
        +
        +	// For internal use only.
        +	// Behaves like an Array's method, not like a jQuery method.
        +	push: push,
        +	sort: arr.sort,
        +	splice: arr.splice
        +};
        +
        +jQuery.extend = jQuery.fn.extend = function() {
        +	var options, name, src, copy, copyIsArray, clone,
        +		target = arguments[ 0 ] || {},
        +		i = 1,
        +		length = arguments.length,
        +		deep = false;
        +
        +	// Handle a deep copy situation
        +	if ( typeof target === "boolean" ) {
        +		deep = target;
        +
        +		// Skip the boolean and the target
        +		target = arguments[ i ] || {};
        +		i++;
        +	}
        +
        +	// Handle case when target is a string or something (possible in deep copy)
        +	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
        +		target = {};
        +	}
        +
        +	// Extend jQuery itself if only one argument is passed
        +	if ( i === length ) {
        +		target = this;
        +		i--;
        +	}
        +
        +	for ( ; i < length; i++ ) {
        +
        +		// Only deal with non-null/undefined values
        +		if ( ( options = arguments[ i ] ) != null ) {
        +
        +			// Extend the base object
        +			for ( name in options ) {
        +				src = target[ name ];
        +				copy = options[ name ];
        +
        +				// Prevent never-ending loop
        +				if ( target === copy ) {
        +					continue;
        +				}
        +
        +				// Recurse if we're merging plain objects or arrays
        +				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
        +					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
        +
        +					if ( copyIsArray ) {
        +						copyIsArray = false;
        +						clone = src && jQuery.isArray( src ) ? src : [];
        +
        +					} else {
        +						clone = src && jQuery.isPlainObject( src ) ? src : {};
        +					}
        +
        +					// Never move original objects, clone them
        +					target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +				// Don't bring in undefined values
        +				} else if ( copy !== undefined ) {
        +					target[ name ] = copy;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Return the modified object
        +	return target;
        +};
        +
        +jQuery.extend( {
        +
        +	// Unique for each copy of jQuery on the page
        +	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
        +
        +	// Assume jQuery is ready without the ready module
        +	isReady: true,
        +
        +	error: function( msg ) {
        +		throw new Error( msg );
        +	},
        +
        +	noop: function() {},
        +
        +	isFunction: function( obj ) {
        +		return jQuery.type( obj ) === "function";
        +	},
        +
        +	isArray: Array.isArray,
        +
        +	isWindow: function( obj ) {
        +		return obj != null && obj === obj.window;
        +	},
        +
        +	isNumeric: function( obj ) {
        +
        +		// As of jQuery 3.0, isNumeric is limited to
        +		// strings and numbers (primitives or objects)
        +		// that can be coerced to finite numbers (gh-2662)
        +		var type = jQuery.type( obj );
        +		return ( type === "number" || type === "string" ) &&
        +
        +			// parseFloat NaNs numeric-cast false positives ("")
        +			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
        +			// subtraction forces infinities to NaN
        +			!isNaN( obj - parseFloat( obj ) );
        +	},
        +
        +	isPlainObject: function( obj ) {
        +		var proto, Ctor;
        +
        +		// Detect obvious negatives
        +		// Use toString instead of jQuery.type to catch host objects
        +		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
        +			return false;
        +		}
        +
        +		proto = getProto( obj );
        +
        +		// Objects with no prototype (e.g., `Object.create( null )`) are plain
        +		if ( !proto ) {
        +			return true;
        +		}
        +
        +		// Objects with prototype are plain iff they were constructed by a global Object function
        +		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        +		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
        +	},
        +
        +	isEmptyObject: function( obj ) {
        +
        +		/* eslint-disable no-unused-vars */
        +		// See https://github.com/eslint/eslint/issues/6125
        +		var name;
        +
        +		for ( name in obj ) {
        +			return false;
        +		}
        +		return true;
        +	},
        +
        +	type: function( obj ) {
        +		if ( obj == null ) {
        +			return obj + "";
        +		}
        +
        +		// Support: Android <=2.3 only (functionish RegExp)
        +		return typeof obj === "object" || typeof obj === "function" ?
        +			class2type[ toString.call( obj ) ] || "object" :
        +			typeof obj;
        +	},
        +
        +	// Evaluates a script in a global context
        +	globalEval: function( code ) {
        +		DOMEval( code );
        +	},
        +
        +	// Convert dashed to camelCase; used by the css and data modules
        +	// Support: IE <=9 - 11, Edge 12 - 13
        +	// Microsoft forgot to hump their vendor prefix (#9572)
        +	camelCase: function( string ) {
        +		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +	},
        +
        +	nodeName: function( elem, name ) {
        +		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        +	},
        +
        +	each: function( obj, callback ) {
        +		var length, i = 0;
        +
        +		if ( isArrayLike( obj ) ) {
        +			length = obj.length;
        +			for ( ; i < length; i++ ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		} else {
        +			for ( i in obj ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		}
        +
        +		return obj;
        +	},
        +
        +	// Support: Android <=4.0 only
        +	trim: function( text ) {
        +		return text == null ?
        +			"" :
        +			( text + "" ).replace( rtrim, "" );
        +	},
        +
        +	// results is for internal usage only
        +	makeArray: function( arr, results ) {
        +		var ret = results || [];
        +
        +		if ( arr != null ) {
        +			if ( isArrayLike( Object( arr ) ) ) {
        +				jQuery.merge( ret,
        +					typeof arr === "string" ?
        +					[ arr ] : arr
        +				);
        +			} else {
        +				push.call( ret, arr );
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	inArray: function( elem, arr, i ) {
        +		return arr == null ? -1 : indexOf.call( arr, elem, i );
        +	},
        +
        +	// Support: Android <=4.0 only, PhantomJS 1 only
        +	// push.apply(_, arraylike) throws on ancient WebKit
        +	merge: function( first, second ) {
        +		var len = +second.length,
        +			j = 0,
        +			i = first.length;
        +
        +		for ( ; j < len; j++ ) {
        +			first[ i++ ] = second[ j ];
        +		}
        +
        +		first.length = i;
        +
        +		return first;
        +	},
        +
        +	grep: function( elems, callback, invert ) {
        +		var callbackInverse,
        +			matches = [],
        +			i = 0,
        +			length = elems.length,
        +			callbackExpect = !invert;
        +
        +		// Go through the array, only saving the items
        +		// that pass the validator function
        +		for ( ; i < length; i++ ) {
        +			callbackInverse = !callback( elems[ i ], i );
        +			if ( callbackInverse !== callbackExpect ) {
        +				matches.push( elems[ i ] );
        +			}
        +		}
        +
        +		return matches;
        +	},
        +
        +	// arg is for internal usage only
        +	map: function( elems, callback, arg ) {
        +		var length, value,
        +			i = 0,
        +			ret = [];
        +
        +		// Go through the array, translating each of the items to their new values
        +		if ( isArrayLike( elems ) ) {
        +			length = elems.length;
        +			for ( ; i < length; i++ ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +
        +		// Go through every key on the object,
        +		} else {
        +			for ( i in elems ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +		}
        +
        +		// Flatten any nested arrays
        +		return concat.apply( [], ret );
        +	},
        +
        +	// A global GUID counter for objects
        +	guid: 1,
        +
        +	// Bind a function to a context, optionally partially applying any
        +	// arguments.
        +	proxy: function( fn, context ) {
        +		var tmp, args, proxy;
        +
        +		if ( typeof context === "string" ) {
        +			tmp = fn[ context ];
        +			context = fn;
        +			fn = tmp;
        +		}
        +
        +		// Quick check to determine if target is callable, in the spec
        +		// this throws a TypeError, but we will just return undefined.
        +		if ( !jQuery.isFunction( fn ) ) {
        +			return undefined;
        +		}
        +
        +		// Simulated bind
        +		args = slice.call( arguments, 2 );
        +		proxy = function() {
        +			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
        +		};
        +
        +		// Set the guid of unique handler to the same of original handler, so it can be removed
        +		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
        +
        +		return proxy;
        +	},
        +
        +	now: Date.now,
        +
        +	// jQuery.support is not used in Core but other projects attach their
        +	// properties to it so it needs to exist.
        +	support: support
        +} );
        +
        +if ( typeof Symbol === "function" ) {
        +	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
        +}
        +
        +// Populate the class2type map
        +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
        +function( i, name ) {
        +	class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +} );
        +
        +function isArrayLike( obj ) {
        +
        +	// Support: real iOS 8.2 only (not reproducible in simulator)
        +	// `in` check used to prevent JIT error (gh-2145)
        +	// hasOwn isn't used here due to false negatives
        +	// regarding Nodelist length in IE
        +	var length = !!obj && "length" in obj && obj.length,
        +		type = jQuery.type( obj );
        +
        +	if ( type === "function" || jQuery.isWindow( obj ) ) {
        +		return false;
        +	}
        +
        +	return type === "array" || length === 0 ||
        +		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
        +}
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/dist/jquery.js b/bower_components/jquery/dist/jquery.js
        new file mode 100644
        index 0000000000..072e308110
        --- /dev/null
        +++ b/bower_components/jquery/dist/jquery.js
        @@ -0,0 +1,10220 @@
        +/*!
        + * jQuery JavaScript Library v3.1.1
        + * https://jquery.com/
        + *
        + * Includes Sizzle.js
        + * https://sizzlejs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * https://jquery.org/license
        + *
        + * Date: 2016-09-22T22:30Z
        + */
        +( function( global, factory ) {
        +
        +	"use strict";
        +
        +	if ( typeof module === "object" && typeof module.exports === "object" ) {
        +
        +		// For CommonJS and CommonJS-like environments where a proper `window`
        +		// is present, execute the factory and get jQuery.
        +		// For environments that do not have a `window` with a `document`
        +		// (such as Node.js), expose a factory as module.exports.
        +		// This accentuates the need for the creation of a real `window`.
        +		// e.g. var jQuery = require("jquery")(window);
        +		// See ticket #14549 for more info.
        +		module.exports = global.document ?
        +			factory( global, true ) :
        +			function( w ) {
        +				if ( !w.document ) {
        +					throw new Error( "jQuery requires a window with a document" );
        +				}
        +				return factory( w );
        +			};
        +	} else {
        +		factory( global );
        +	}
        +
        +// Pass this if window is not defined yet
        +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
        +
        +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
        +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
        +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
        +// enough that all such attempts are guarded in a try block.
        +"use strict";
        +
        +var arr = [];
        +
        +var document = window.document;
        +
        +var getProto = Object.getPrototypeOf;
        +
        +var slice = arr.slice;
        +
        +var concat = arr.concat;
        +
        +var push = arr.push;
        +
        +var indexOf = arr.indexOf;
        +
        +var class2type = {};
        +
        +var toString = class2type.toString;
        +
        +var hasOwn = class2type.hasOwnProperty;
        +
        +var fnToString = hasOwn.toString;
        +
        +var ObjectFunctionString = fnToString.call( Object );
        +
        +var support = {};
        +
        +
        +
        +	function DOMEval( code, doc ) {
        +		doc = doc || document;
        +
        +		var script = doc.createElement( "script" );
        +
        +		script.text = code;
        +		doc.head.appendChild( script ).parentNode.removeChild( script );
        +	}
        +/* global Symbol */
        +// Defining this global in .eslintrc.json would create a danger of using the global
        +// unguarded in another place, it seems safer to define global only for this module
        +
        +
        +
        +var
        +	version = "3.1.1",
        +
        +	// Define a local copy of jQuery
        +	jQuery = function( selector, context ) {
        +
        +		// The jQuery object is actually just the init constructor 'enhanced'
        +		// Need init if jQuery is called (just allow error to be thrown if not included)
        +		return new jQuery.fn.init( selector, context );
        +	},
        +
        +	// Support: Android <=4.0 only
        +	// Make sure we trim BOM and NBSP
        +	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
        +
        +	// Matches dashed string for camelizing
        +	rmsPrefix = /^-ms-/,
        +	rdashAlpha = /-([a-z])/g,
        +
        +	// Used by jQuery.camelCase as callback to replace()
        +	fcamelCase = function( all, letter ) {
        +		return letter.toUpperCase();
        +	};
        +
        +jQuery.fn = jQuery.prototype = {
        +
        +	// The current version of jQuery being used
        +	jquery: version,
        +
        +	constructor: jQuery,
        +
        +	// The default length of a jQuery object is 0
        +	length: 0,
        +
        +	toArray: function() {
        +		return slice.call( this );
        +	},
        +
        +	// Get the Nth element in the matched element set OR
        +	// Get the whole matched element set as a clean array
        +	get: function( num ) {
        +
        +		// Return all the elements in a clean array
        +		if ( num == null ) {
        +			return slice.call( this );
        +		}
        +
        +		// Return just the one element from the set
        +		return num < 0 ? this[ num + this.length ] : this[ num ];
        +	},
        +
        +	// Take an array of elements and push it onto the stack
        +	// (returning the new matched element set)
        +	pushStack: function( elems ) {
        +
        +		// Build a new jQuery matched element set
        +		var ret = jQuery.merge( this.constructor(), elems );
        +
        +		// Add the old object onto the stack (as a reference)
        +		ret.prevObject = this;
        +
        +		// Return the newly-formed element set
        +		return ret;
        +	},
        +
        +	// Execute a callback for every element in the matched set.
        +	each: function( callback ) {
        +		return jQuery.each( this, callback );
        +	},
        +
        +	map: function( callback ) {
        +		return this.pushStack( jQuery.map( this, function( elem, i ) {
        +			return callback.call( elem, i, elem );
        +		} ) );
        +	},
        +
        +	slice: function() {
        +		return this.pushStack( slice.apply( this, arguments ) );
        +	},
        +
        +	first: function() {
        +		return this.eq( 0 );
        +	},
        +
        +	last: function() {
        +		return this.eq( -1 );
        +	},
        +
        +	eq: function( i ) {
        +		var len = this.length,
        +			j = +i + ( i < 0 ? len : 0 );
        +		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
        +	},
        +
        +	end: function() {
        +		return this.prevObject || this.constructor();
        +	},
        +
        +	// For internal use only.
        +	// Behaves like an Array's method, not like a jQuery method.
        +	push: push,
        +	sort: arr.sort,
        +	splice: arr.splice
        +};
        +
        +jQuery.extend = jQuery.fn.extend = function() {
        +	var options, name, src, copy, copyIsArray, clone,
        +		target = arguments[ 0 ] || {},
        +		i = 1,
        +		length = arguments.length,
        +		deep = false;
        +
        +	// Handle a deep copy situation
        +	if ( typeof target === "boolean" ) {
        +		deep = target;
        +
        +		// Skip the boolean and the target
        +		target = arguments[ i ] || {};
        +		i++;
        +	}
        +
        +	// Handle case when target is a string or something (possible in deep copy)
        +	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
        +		target = {};
        +	}
        +
        +	// Extend jQuery itself if only one argument is passed
        +	if ( i === length ) {
        +		target = this;
        +		i--;
        +	}
        +
        +	for ( ; i < length; i++ ) {
        +
        +		// Only deal with non-null/undefined values
        +		if ( ( options = arguments[ i ] ) != null ) {
        +
        +			// Extend the base object
        +			for ( name in options ) {
        +				src = target[ name ];
        +				copy = options[ name ];
        +
        +				// Prevent never-ending loop
        +				if ( target === copy ) {
        +					continue;
        +				}
        +
        +				// Recurse if we're merging plain objects or arrays
        +				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
        +					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
        +
        +					if ( copyIsArray ) {
        +						copyIsArray = false;
        +						clone = src && jQuery.isArray( src ) ? src : [];
        +
        +					} else {
        +						clone = src && jQuery.isPlainObject( src ) ? src : {};
        +					}
        +
        +					// Never move original objects, clone them
        +					target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +				// Don't bring in undefined values
        +				} else if ( copy !== undefined ) {
        +					target[ name ] = copy;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Return the modified object
        +	return target;
        +};
        +
        +jQuery.extend( {
        +
        +	// Unique for each copy of jQuery on the page
        +	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
        +
        +	// Assume jQuery is ready without the ready module
        +	isReady: true,
        +
        +	error: function( msg ) {
        +		throw new Error( msg );
        +	},
        +
        +	noop: function() {},
        +
        +	isFunction: function( obj ) {
        +		return jQuery.type( obj ) === "function";
        +	},
        +
        +	isArray: Array.isArray,
        +
        +	isWindow: function( obj ) {
        +		return obj != null && obj === obj.window;
        +	},
        +
        +	isNumeric: function( obj ) {
        +
        +		// As of jQuery 3.0, isNumeric is limited to
        +		// strings and numbers (primitives or objects)
        +		// that can be coerced to finite numbers (gh-2662)
        +		var type = jQuery.type( obj );
        +		return ( type === "number" || type === "string" ) &&
        +
        +			// parseFloat NaNs numeric-cast false positives ("")
        +			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
        +			// subtraction forces infinities to NaN
        +			!isNaN( obj - parseFloat( obj ) );
        +	},
        +
        +	isPlainObject: function( obj ) {
        +		var proto, Ctor;
        +
        +		// Detect obvious negatives
        +		// Use toString instead of jQuery.type to catch host objects
        +		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
        +			return false;
        +		}
        +
        +		proto = getProto( obj );
        +
        +		// Objects with no prototype (e.g., `Object.create( null )`) are plain
        +		if ( !proto ) {
        +			return true;
        +		}
        +
        +		// Objects with prototype are plain iff they were constructed by a global Object function
        +		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        +		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
        +	},
        +
        +	isEmptyObject: function( obj ) {
        +
        +		/* eslint-disable no-unused-vars */
        +		// See https://github.com/eslint/eslint/issues/6125
        +		var name;
        +
        +		for ( name in obj ) {
        +			return false;
        +		}
        +		return true;
        +	},
        +
        +	type: function( obj ) {
        +		if ( obj == null ) {
        +			return obj + "";
        +		}
        +
        +		// Support: Android <=2.3 only (functionish RegExp)
        +		return typeof obj === "object" || typeof obj === "function" ?
        +			class2type[ toString.call( obj ) ] || "object" :
        +			typeof obj;
        +	},
        +
        +	// Evaluates a script in a global context
        +	globalEval: function( code ) {
        +		DOMEval( code );
        +	},
        +
        +	// Convert dashed to camelCase; used by the css and data modules
        +	// Support: IE <=9 - 11, Edge 12 - 13
        +	// Microsoft forgot to hump their vendor prefix (#9572)
        +	camelCase: function( string ) {
        +		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +	},
        +
        +	nodeName: function( elem, name ) {
        +		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        +	},
        +
        +	each: function( obj, callback ) {
        +		var length, i = 0;
        +
        +		if ( isArrayLike( obj ) ) {
        +			length = obj.length;
        +			for ( ; i < length; i++ ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		} else {
        +			for ( i in obj ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		}
        +
        +		return obj;
        +	},
        +
        +	// Support: Android <=4.0 only
        +	trim: function( text ) {
        +		return text == null ?
        +			"" :
        +			( text + "" ).replace( rtrim, "" );
        +	},
        +
        +	// results is for internal usage only
        +	makeArray: function( arr, results ) {
        +		var ret = results || [];
        +
        +		if ( arr != null ) {
        +			if ( isArrayLike( Object( arr ) ) ) {
        +				jQuery.merge( ret,
        +					typeof arr === "string" ?
        +					[ arr ] : arr
        +				);
        +			} else {
        +				push.call( ret, arr );
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	inArray: function( elem, arr, i ) {
        +		return arr == null ? -1 : indexOf.call( arr, elem, i );
        +	},
        +
        +	// Support: Android <=4.0 only, PhantomJS 1 only
        +	// push.apply(_, arraylike) throws on ancient WebKit
        +	merge: function( first, second ) {
        +		var len = +second.length,
        +			j = 0,
        +			i = first.length;
        +
        +		for ( ; j < len; j++ ) {
        +			first[ i++ ] = second[ j ];
        +		}
        +
        +		first.length = i;
        +
        +		return first;
        +	},
        +
        +	grep: function( elems, callback, invert ) {
        +		var callbackInverse,
        +			matches = [],
        +			i = 0,
        +			length = elems.length,
        +			callbackExpect = !invert;
        +
        +		// Go through the array, only saving the items
        +		// that pass the validator function
        +		for ( ; i < length; i++ ) {
        +			callbackInverse = !callback( elems[ i ], i );
        +			if ( callbackInverse !== callbackExpect ) {
        +				matches.push( elems[ i ] );
        +			}
        +		}
        +
        +		return matches;
        +	},
        +
        +	// arg is for internal usage only
        +	map: function( elems, callback, arg ) {
        +		var length, value,
        +			i = 0,
        +			ret = [];
        +
        +		// Go through the array, translating each of the items to their new values
        +		if ( isArrayLike( elems ) ) {
        +			length = elems.length;
        +			for ( ; i < length; i++ ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +
        +		// Go through every key on the object,
        +		} else {
        +			for ( i in elems ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +		}
        +
        +		// Flatten any nested arrays
        +		return concat.apply( [], ret );
        +	},
        +
        +	// A global GUID counter for objects
        +	guid: 1,
        +
        +	// Bind a function to a context, optionally partially applying any
        +	// arguments.
        +	proxy: function( fn, context ) {
        +		var tmp, args, proxy;
        +
        +		if ( typeof context === "string" ) {
        +			tmp = fn[ context ];
        +			context = fn;
        +			fn = tmp;
        +		}
        +
        +		// Quick check to determine if target is callable, in the spec
        +		// this throws a TypeError, but we will just return undefined.
        +		if ( !jQuery.isFunction( fn ) ) {
        +			return undefined;
        +		}
        +
        +		// Simulated bind
        +		args = slice.call( arguments, 2 );
        +		proxy = function() {
        +			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
        +		};
        +
        +		// Set the guid of unique handler to the same of original handler, so it can be removed
        +		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
        +
        +		return proxy;
        +	},
        +
        +	now: Date.now,
        +
        +	// jQuery.support is not used in Core but other projects attach their
        +	// properties to it so it needs to exist.
        +	support: support
        +} );
        +
        +if ( typeof Symbol === "function" ) {
        +	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
        +}
        +
        +// Populate the class2type map
        +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
        +function( i, name ) {
        +	class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +} );
        +
        +function isArrayLike( obj ) {
        +
        +	// Support: real iOS 8.2 only (not reproducible in simulator)
        +	// `in` check used to prevent JIT error (gh-2145)
        +	// hasOwn isn't used here due to false negatives
        +	// regarding Nodelist length in IE
        +	var length = !!obj && "length" in obj && obj.length,
        +		type = jQuery.type( obj );
        +
        +	if ( type === "function" || jQuery.isWindow( obj ) ) {
        +		return false;
        +	}
        +
        +	return type === "array" || length === 0 ||
        +		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
        +}
        +var Sizzle =
        +/*!
        + * Sizzle CSS Selector Engine v2.3.3
        + * https://sizzlejs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + *
        + * Date: 2016-08-08
        + */
        +(function( window ) {
        +
        +var i,
        +	support,
        +	Expr,
        +	getText,
        +	isXML,
        +	tokenize,
        +	compile,
        +	select,
        +	outermostContext,
        +	sortInput,
        +	hasDuplicate,
        +
        +	// Local document vars
        +	setDocument,
        +	document,
        +	docElem,
        +	documentIsHTML,
        +	rbuggyQSA,
        +	rbuggyMatches,
        +	matches,
        +	contains,
        +
        +	// Instance-specific data
        +	expando = "sizzle" + 1 * new Date(),
        +	preferredDoc = window.document,
        +	dirruns = 0,
        +	done = 0,
        +	classCache = createCache(),
        +	tokenCache = createCache(),
        +	compilerCache = createCache(),
        +	sortOrder = function( a, b ) {
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +		}
        +		return 0;
        +	},
        +
        +	// Instance methods
        +	hasOwn = ({}).hasOwnProperty,
        +	arr = [],
        +	pop = arr.pop,
        +	push_native = arr.push,
        +	push = arr.push,
        +	slice = arr.slice,
        +	// Use a stripped-down indexOf as it's faster than native
        +	// https://jsperf.com/thor-indexof-vs-for/5
        +	indexOf = function( list, elem ) {
        +		var i = 0,
        +			len = list.length;
        +		for ( ; i < len; i++ ) {
        +			if ( list[i] === elem ) {
        +				return i;
        +			}
        +		}
        +		return -1;
        +	},
        +
        +	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
        +
        +	// Regular expressions
        +
        +	// http://www.w3.org/TR/css3-selectors/#whitespace
        +	whitespace = "[\\x20\\t\\r\\n\\f]",
        +
        +	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        +	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
        +
        +	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
        +	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
        +		// Operator (capture 2)
        +		"*([*^$|!~]?=)" + whitespace +
        +		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
        +		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
        +		"*\\]",
        +
        +	pseudos = ":(" + identifier + ")(?:\\((" +
        +		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
        +		// 1. quoted (capture 3; capture 4 or capture 5)
        +		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
        +		// 2. simple (capture 6)
        +		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
        +		// 3. anything else (capture 2)
        +		".*" +
        +		")\\)|)",
        +
        +	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
        +	rwhitespace = new RegExp( whitespace + "+", "g" ),
        +	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
        +
        +	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
        +	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
        +
        +	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
        +
        +	rpseudo = new RegExp( pseudos ),
        +	ridentifier = new RegExp( "^" + identifier + "$" ),
        +
        +	matchExpr = {
        +		"ID": new RegExp( "^#(" + identifier + ")" ),
        +		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
        +		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
        +		"ATTR": new RegExp( "^" + attributes ),
        +		"PSEUDO": new RegExp( "^" + pseudos ),
        +		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
        +			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
        +			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
        +		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
        +		// For use in libraries implementing .is()
        +		// We use this for POS matching in `select`
        +		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
        +			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
        +	},
        +
        +	rinputs = /^(?:input|select|textarea|button)$/i,
        +	rheader = /^h\d$/i,
        +
        +	rnative = /^[^{]+\{\s*\[native \w/,
        +
        +	// Easily-parseable/retrievable ID or TAG or CLASS selectors
        +	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
        +
        +	rsibling = /[+~]/,
        +
        +	// CSS escapes
        +	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
        +	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
        +	funescape = function( _, escaped, escapedWhitespace ) {
        +		var high = "0x" + escaped - 0x10000;
        +		// NaN means non-codepoint
        +		// Support: Firefox<24
        +		// Workaround erroneous numeric interpretation of +"0x"
        +		return high !== high || escapedWhitespace ?
        +			escaped :
        +			high < 0 ?
        +				// BMP codepoint
        +				String.fromCharCode( high + 0x10000 ) :
        +				// Supplemental Plane codepoint (surrogate pair)
        +				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
        +	},
        +
        +	// CSS string/identifier serialization
        +	// https://drafts.csswg.org/cssom/#common-serializing-idioms
        +	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
        +	fcssescape = function( ch, asCodePoint ) {
        +		if ( asCodePoint ) {
        +
        +			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
        +			if ( ch === "\0" ) {
        +				return "\uFFFD";
        +			}
        +
        +			// Control characters and (dependent upon position) numbers get escaped as code points
        +			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
        +		}
        +
        +		// Other potentially-special ASCII characters get backslash-escaped
        +		return "\\" + ch;
        +	},
        +
        +	// Used for iframes
        +	// See setDocument()
        +	// Removing the function wrapper causes a "Permission Denied"
        +	// error in IE
        +	unloadHandler = function() {
        +		setDocument();
        +	},
        +
        +	disabledAncestor = addCombinator(
        +		function( elem ) {
        +			return elem.disabled === true && ("form" in elem || "label" in elem);
        +		},
        +		{ dir: "parentNode", next: "legend" }
        +	);
        +
        +// Optimize for push.apply( _, NodeList )
        +try {
        +	push.apply(
        +		(arr = slice.call( preferredDoc.childNodes )),
        +		preferredDoc.childNodes
        +	);
        +	// Support: Android<4.0
        +	// Detect silently failing push.apply
        +	arr[ preferredDoc.childNodes.length ].nodeType;
        +} catch ( e ) {
        +	push = { apply: arr.length ?
        +
        +		// Leverage slice if possible
        +		function( target, els ) {
        +			push_native.apply( target, slice.call(els) );
        +		} :
        +
        +		// Support: IE<9
        +		// Otherwise append directly
        +		function( target, els ) {
        +			var j = target.length,
        +				i = 0;
        +			// Can't trust NodeList.length
        +			while ( (target[j++] = els[i++]) ) {}
        +			target.length = j - 1;
        +		}
        +	};
        +}
        +
        +function Sizzle( selector, context, results, seed ) {
        +	var m, i, elem, nid, match, groups, newSelector,
        +		newContext = context && context.ownerDocument,
        +
        +		// nodeType defaults to 9, since context defaults to document
        +		nodeType = context ? context.nodeType : 9;
        +
        +	results = results || [];
        +
        +	// Return early from calls with invalid selector or context
        +	if ( typeof selector !== "string" || !selector ||
        +		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
        +
        +		return results;
        +	}
        +
        +	// Try to shortcut find operations (as opposed to filters) in HTML documents
        +	if ( !seed ) {
        +
        +		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
        +			setDocument( context );
        +		}
        +		context = context || document;
        +
        +		if ( documentIsHTML ) {
        +
        +			// If the selector is sufficiently simple, try using a "get*By*" DOM method
        +			// (excepting DocumentFragment context, where the methods don't exist)
        +			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
        +
        +				// ID selector
        +				if ( (m = match[1]) ) {
        +
        +					// Document context
        +					if ( nodeType === 9 ) {
        +						if ( (elem = context.getElementById( m )) ) {
        +
        +							// Support: IE, Opera, Webkit
        +							// TODO: identify versions
        +							// getElementById can match elements by name instead of ID
        +							if ( elem.id === m ) {
        +								results.push( elem );
        +								return results;
        +							}
        +						} else {
        +							return results;
        +						}
        +
        +					// Element context
        +					} else {
        +
        +						// Support: IE, Opera, Webkit
        +						// TODO: identify versions
        +						// getElementById can match elements by name instead of ID
        +						if ( newContext && (elem = newContext.getElementById( m )) &&
        +							contains( context, elem ) &&
        +							elem.id === m ) {
        +
        +							results.push( elem );
        +							return results;
        +						}
        +					}
        +
        +				// Type selector
        +				} else if ( match[2] ) {
        +					push.apply( results, context.getElementsByTagName( selector ) );
        +					return results;
        +
        +				// Class selector
        +				} else if ( (m = match[3]) && support.getElementsByClassName &&
        +					context.getElementsByClassName ) {
        +
        +					push.apply( results, context.getElementsByClassName( m ) );
        +					return results;
        +				}
        +			}
        +
        +			// Take advantage of querySelectorAll
        +			if ( support.qsa &&
        +				!compilerCache[ selector + " " ] &&
        +				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
        +
        +				if ( nodeType !== 1 ) {
        +					newContext = context;
        +					newSelector = selector;
        +
        +				// qSA looks outside Element context, which is not what we want
        +				// Thanks to Andrew Dupont for this workaround technique
        +				// Support: IE <=8
        +				// Exclude object elements
        +				} else if ( context.nodeName.toLowerCase() !== "object" ) {
        +
        +					// Capture the context ID, setting it first if necessary
        +					if ( (nid = context.getAttribute( "id" )) ) {
        +						nid = nid.replace( rcssescape, fcssescape );
        +					} else {
        +						context.setAttribute( "id", (nid = expando) );
        +					}
        +
        +					// Prefix every selector in the list
        +					groups = tokenize( selector );
        +					i = groups.length;
        +					while ( i-- ) {
        +						groups[i] = "#" + nid + " " + toSelector( groups[i] );
        +					}
        +					newSelector = groups.join( "," );
        +
        +					// Expand context for sibling selectors
        +					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
        +						context;
        +				}
        +
        +				if ( newSelector ) {
        +					try {
        +						push.apply( results,
        +							newContext.querySelectorAll( newSelector )
        +						);
        +						return results;
        +					} catch ( qsaError ) {
        +					} finally {
        +						if ( nid === expando ) {
        +							context.removeAttribute( "id" );
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	// All others
        +	return select( selector.replace( rtrim, "$1" ), context, results, seed );
        +}
        +
        +/**
        + * Create key-value caches of limited size
        + * @returns {function(string, object)} Returns the Object data after storing it on itself with
        + *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
        + *	deleting the oldest entry
        + */
        +function createCache() {
        +	var keys = [];
        +
        +	function cache( key, value ) {
        +		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        +		if ( keys.push( key + " " ) > Expr.cacheLength ) {
        +			// Only keep the most recent entries
        +			delete cache[ keys.shift() ];
        +		}
        +		return (cache[ key + " " ] = value);
        +	}
        +	return cache;
        +}
        +
        +/**
        + * Mark a function for special use by Sizzle
        + * @param {Function} fn The function to mark
        + */
        +function markFunction( fn ) {
        +	fn[ expando ] = true;
        +	return fn;
        +}
        +
        +/**
        + * Support testing using an element
        + * @param {Function} fn Passed the created element and returns a boolean result
        + */
        +function assert( fn ) {
        +	var el = document.createElement("fieldset");
        +
        +	try {
        +		return !!fn( el );
        +	} catch (e) {
        +		return false;
        +	} finally {
        +		// Remove from its parent by default
        +		if ( el.parentNode ) {
        +			el.parentNode.removeChild( el );
        +		}
        +		// release memory in IE
        +		el = null;
        +	}
        +}
        +
        +/**
        + * Adds the same handler for all of the specified attrs
        + * @param {String} attrs Pipe-separated list of attributes
        + * @param {Function} handler The method that will be applied
        + */
        +function addHandle( attrs, handler ) {
        +	var arr = attrs.split("|"),
        +		i = arr.length;
        +
        +	while ( i-- ) {
        +		Expr.attrHandle[ arr[i] ] = handler;
        +	}
        +}
        +
        +/**
        + * Checks document order of two siblings
        + * @param {Element} a
        + * @param {Element} b
        + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
        + */
        +function siblingCheck( a, b ) {
        +	var cur = b && a,
        +		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
        +			a.sourceIndex - b.sourceIndex;
        +
        +	// Use IE sourceIndex if available on both nodes
        +	if ( diff ) {
        +		return diff;
        +	}
        +
        +	// Check if b follows a
        +	if ( cur ) {
        +		while ( (cur = cur.nextSibling) ) {
        +			if ( cur === b ) {
        +				return -1;
        +			}
        +		}
        +	}
        +
        +	return a ? 1 : -1;
        +}
        +
        +/**
        + * Returns a function to use in pseudos for input types
        + * @param {String} type
        + */
        +function createInputPseudo( type ) {
        +	return function( elem ) {
        +		var name = elem.nodeName.toLowerCase();
        +		return name === "input" && elem.type === type;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for buttons
        + * @param {String} type
        + */
        +function createButtonPseudo( type ) {
        +	return function( elem ) {
        +		var name = elem.nodeName.toLowerCase();
        +		return (name === "input" || name === "button") && elem.type === type;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for :enabled/:disabled
        + * @param {Boolean} disabled true for :disabled; false for :enabled
        + */
        +function createDisabledPseudo( disabled ) {
        +
        +	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
        +	return function( elem ) {
        +
        +		// Only certain elements can match :enabled or :disabled
        +		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
        +		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
        +		if ( "form" in elem ) {
        +
        +			// Check for inherited disabledness on relevant non-disabled elements:
        +			// * listed form-associated elements in a disabled fieldset
        +			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
        +			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
        +			// * option elements in a disabled optgroup
        +			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
        +			// All such elements have a "form" property.
        +			if ( elem.parentNode && elem.disabled === false ) {
        +
        +				// Option elements defer to a parent optgroup if present
        +				if ( "label" in elem ) {
        +					if ( "label" in elem.parentNode ) {
        +						return elem.parentNode.disabled === disabled;
        +					} else {
        +						return elem.disabled === disabled;
        +					}
        +				}
        +
        +				// Support: IE 6 - 11
        +				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
        +				return elem.isDisabled === disabled ||
        +
        +					// Where there is no isDisabled, check manually
        +					/* jshint -W018 */
        +					elem.isDisabled !== !disabled &&
        +						disabledAncestor( elem ) === disabled;
        +			}
        +
        +			return elem.disabled === disabled;
        +
        +		// Try to winnow out elements that can't be disabled before trusting the disabled property.
        +		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
        +		// even exist on them, let alone have a boolean value.
        +		} else if ( "label" in elem ) {
        +			return elem.disabled === disabled;
        +		}
        +
        +		// Remaining elements are neither :enabled nor :disabled
        +		return false;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for positionals
        + * @param {Function} fn
        + */
        +function createPositionalPseudo( fn ) {
        +	return markFunction(function( argument ) {
        +		argument = +argument;
        +		return markFunction(function( seed, matches ) {
        +			var j,
        +				matchIndexes = fn( [], seed.length, argument ),
        +				i = matchIndexes.length;
        +
        +			// Match elements found at the specified indexes
        +			while ( i-- ) {
        +				if ( seed[ (j = matchIndexes[i]) ] ) {
        +					seed[j] = !(matches[j] = seed[j]);
        +				}
        +			}
        +		});
        +	});
        +}
        +
        +/**
        + * Checks a node for validity as a Sizzle context
        + * @param {Element|Object=} context
        + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
        + */
        +function testContext( context ) {
        +	return context && typeof context.getElementsByTagName !== "undefined" && context;
        +}
        +
        +// Expose support vars for convenience
        +support = Sizzle.support = {};
        +
        +/**
        + * Detects XML nodes
        + * @param {Element|Object} elem An element or a document
        + * @returns {Boolean} True iff elem is a non-HTML XML node
        + */
        +isXML = Sizzle.isXML = function( elem ) {
        +	// documentElement is verified for cases where it doesn't yet exist
        +	// (such as loading iframes in IE - #4833)
        +	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
        +	return documentElement ? documentElement.nodeName !== "HTML" : false;
        +};
        +
        +/**
        + * Sets document-related variables once based on the current document
        + * @param {Element|Object} [doc] An element or document object to use to set the document
        + * @returns {Object} Returns the current document
        + */
        +setDocument = Sizzle.setDocument = function( node ) {
        +	var hasCompare, subWindow,
        +		doc = node ? node.ownerDocument || node : preferredDoc;
        +
        +	// Return early if doc is invalid or already selected
        +	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
        +		return document;
        +	}
        +
        +	// Update global variables
        +	document = doc;
        +	docElem = document.documentElement;
        +	documentIsHTML = !isXML( document );
        +
        +	// Support: IE 9-11, Edge
        +	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
        +	if ( preferredDoc !== document &&
        +		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
        +
        +		// Support: IE 11, Edge
        +		if ( subWindow.addEventListener ) {
        +			subWindow.addEventListener( "unload", unloadHandler, false );
        +
        +		// Support: IE 9 - 10 only
        +		} else if ( subWindow.attachEvent ) {
        +			subWindow.attachEvent( "onunload", unloadHandler );
        +		}
        +	}
        +
        +	/* Attributes
        +	---------------------------------------------------------------------- */
        +
        +	// Support: IE<8
        +	// Verify that getAttribute really returns attributes and not properties
        +	// (excepting IE8 booleans)
        +	support.attributes = assert(function( el ) {
        +		el.className = "i";
        +		return !el.getAttribute("className");
        +	});
        +
        +	/* getElement(s)By*
        +	---------------------------------------------------------------------- */
        +
        +	// Check if getElementsByTagName("*") returns only elements
        +	support.getElementsByTagName = assert(function( el ) {
        +		el.appendChild( document.createComment("") );
        +		return !el.getElementsByTagName("*").length;
        +	});
        +
        +	// Support: IE<9
        +	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
        +
        +	// Support: IE<10
        +	// Check if getElementById returns elements by name
        +	// The broken getElementById methods don't pick up programmatically-set names,
        +	// so use a roundabout getElementsByName test
        +	support.getById = assert(function( el ) {
        +		docElem.appendChild( el ).id = expando;
        +		return !document.getElementsByName || !document.getElementsByName( expando ).length;
        +	});
        +
        +	// ID filter and find
        +	if ( support.getById ) {
        +		Expr.filter["ID"] = function( id ) {
        +			var attrId = id.replace( runescape, funescape );
        +			return function( elem ) {
        +				return elem.getAttribute("id") === attrId;
        +			};
        +		};
        +		Expr.find["ID"] = function( id, context ) {
        +			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
        +				var elem = context.getElementById( id );
        +				return elem ? [ elem ] : [];
        +			}
        +		};
        +	} else {
        +		Expr.filter["ID"] =  function( id ) {
        +			var attrId = id.replace( runescape, funescape );
        +			return function( elem ) {
        +				var node = typeof elem.getAttributeNode !== "undefined" &&
        +					elem.getAttributeNode("id");
        +				return node && node.value === attrId;
        +			};
        +		};
        +
        +		// Support: IE 6 - 7 only
        +		// getElementById is not reliable as a find shortcut
        +		Expr.find["ID"] = function( id, context ) {
        +			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
        +				var node, i, elems,
        +					elem = context.getElementById( id );
        +
        +				if ( elem ) {
        +
        +					// Verify the id attribute
        +					node = elem.getAttributeNode("id");
        +					if ( node && node.value === id ) {
        +						return [ elem ];
        +					}
        +
        +					// Fall back on getElementsByName
        +					elems = context.getElementsByName( id );
        +					i = 0;
        +					while ( (elem = elems[i++]) ) {
        +						node = elem.getAttributeNode("id");
        +						if ( node && node.value === id ) {
        +							return [ elem ];
        +						}
        +					}
        +				}
        +
        +				return [];
        +			}
        +		};
        +	}
        +
        +	// Tag
        +	Expr.find["TAG"] = support.getElementsByTagName ?
        +		function( tag, context ) {
        +			if ( typeof context.getElementsByTagName !== "undefined" ) {
        +				return context.getElementsByTagName( tag );
        +
        +			// DocumentFragment nodes don't have gEBTN
        +			} else if ( support.qsa ) {
        +				return context.querySelectorAll( tag );
        +			}
        +		} :
        +
        +		function( tag, context ) {
        +			var elem,
        +				tmp = [],
        +				i = 0,
        +				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
        +				results = context.getElementsByTagName( tag );
        +
        +			// Filter out possible comments
        +			if ( tag === "*" ) {
        +				while ( (elem = results[i++]) ) {
        +					if ( elem.nodeType === 1 ) {
        +						tmp.push( elem );
        +					}
        +				}
        +
        +				return tmp;
        +			}
        +			return results;
        +		};
        +
        +	// Class
        +	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
        +		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
        +			return context.getElementsByClassName( className );
        +		}
        +	};
        +
        +	/* QSA/matchesSelector
        +	---------------------------------------------------------------------- */
        +
        +	// QSA and matchesSelector support
        +
        +	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
        +	rbuggyMatches = [];
        +
        +	// qSa(:focus) reports false when true (Chrome 21)
        +	// We allow this because of a bug in IE8/9 that throws an error
        +	// whenever `document.activeElement` is accessed on an iframe
        +	// So, we allow :focus to pass through QSA all the time to avoid the IE error
        +	// See https://bugs.jquery.com/ticket/13378
        +	rbuggyQSA = [];
        +
        +	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
        +		// Build QSA regex
        +		// Regex strategy adopted from Diego Perini
        +		assert(function( el ) {
        +			// Select is set to empty string on purpose
        +			// This is to test IE's treatment of not explicitly
        +			// setting a boolean content attribute,
        +			// since its presence should be enough
        +			// https://bugs.jquery.com/ticket/12359
        +			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
        +				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
        +				"<option selected=''></option></select>";
        +
        +			// Support: IE8, Opera 11-12.16
        +			// Nothing should be selected when empty strings follow ^= or $= or *=
        +			// The test attribute must be unknown in Opera but "safe" for WinRT
        +			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
        +			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
        +				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
        +			}
        +
        +			// Support: IE8
        +			// Boolean attributes and "value" are not treated correctly
        +			if ( !el.querySelectorAll("[selected]").length ) {
        +				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
        +			}
        +
        +			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
        +			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
        +				rbuggyQSA.push("~=");
        +			}
        +
        +			// Webkit/Opera - :checked should return selected option elements
        +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +			// IE8 throws error here and will not see later tests
        +			if ( !el.querySelectorAll(":checked").length ) {
        +				rbuggyQSA.push(":checked");
        +			}
        +
        +			// Support: Safari 8+, iOS 8+
        +			// https://bugs.webkit.org/show_bug.cgi?id=136851
        +			// In-page `selector#id sibling-combinator selector` fails
        +			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
        +				rbuggyQSA.push(".#.+[+~]");
        +			}
        +		});
        +
        +		assert(function( el ) {
        +			el.innerHTML = "<a href='' disabled='disabled'></a>" +
        +				"<select disabled='disabled'><option/></select>";
        +
        +			// Support: Windows 8 Native Apps
        +			// The type and name attributes are restricted during .innerHTML assignment
        +			var input = document.createElement("input");
        +			input.setAttribute( "type", "hidden" );
        +			el.appendChild( input ).setAttribute( "name", "D" );
        +
        +			// Support: IE8
        +			// Enforce case-sensitivity of name attribute
        +			if ( el.querySelectorAll("[name=d]").length ) {
        +				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
        +			}
        +
        +			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
        +			// IE8 throws error here and will not see later tests
        +			if ( el.querySelectorAll(":enabled").length !== 2 ) {
        +				rbuggyQSA.push( ":enabled", ":disabled" );
        +			}
        +
        +			// Support: IE9-11+
        +			// IE's :disabled selector does not pick up the children of disabled fieldsets
        +			docElem.appendChild( el ).disabled = true;
        +			if ( el.querySelectorAll(":disabled").length !== 2 ) {
        +				rbuggyQSA.push( ":enabled", ":disabled" );
        +			}
        +
        +			// Opera 10-11 does not throw on post-comma invalid pseudos
        +			el.querySelectorAll("*,:x");
        +			rbuggyQSA.push(",.*:");
        +		});
        +	}
        +
        +	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
        +		docElem.webkitMatchesSelector ||
        +		docElem.mozMatchesSelector ||
        +		docElem.oMatchesSelector ||
        +		docElem.msMatchesSelector) )) ) {
        +
        +		assert(function( el ) {
        +			// Check to see if it's possible to do matchesSelector
        +			// on a disconnected node (IE 9)
        +			support.disconnectedMatch = matches.call( el, "*" );
        +
        +			// This should fail with an exception
        +			// Gecko does not error, returns false instead
        +			matches.call( el, "[s!='']:x" );
        +			rbuggyMatches.push( "!=", pseudos );
        +		});
        +	}
        +
        +	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
        +	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
        +
        +	/* Contains
        +	---------------------------------------------------------------------- */
        +	hasCompare = rnative.test( docElem.compareDocumentPosition );
        +
        +	// Element contains another
        +	// Purposefully self-exclusive
        +	// As in, an element does not contain itself
        +	contains = hasCompare || rnative.test( docElem.contains ) ?
        +		function( a, b ) {
        +			var adown = a.nodeType === 9 ? a.documentElement : a,
        +				bup = b && b.parentNode;
        +			return a === bup || !!( bup && bup.nodeType === 1 && (
        +				adown.contains ?
        +					adown.contains( bup ) :
        +					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
        +			));
        +		} :
        +		function( a, b ) {
        +			if ( b ) {
        +				while ( (b = b.parentNode) ) {
        +					if ( b === a ) {
        +						return true;
        +					}
        +				}
        +			}
        +			return false;
        +		};
        +
        +	/* Sorting
        +	---------------------------------------------------------------------- */
        +
        +	// Document order sorting
        +	sortOrder = hasCompare ?
        +	function( a, b ) {
        +
        +		// Flag for duplicate removal
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +		}
        +
        +		// Sort on method existence if only one input has compareDocumentPosition
        +		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
        +		if ( compare ) {
        +			return compare;
        +		}
        +
        +		// Calculate position if both inputs belong to the same document
        +		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
        +			a.compareDocumentPosition( b ) :
        +
        +			// Otherwise we know they are disconnected
        +			1;
        +
        +		// Disconnected nodes
        +		if ( compare & 1 ||
        +			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
        +
        +			// Choose the first element that is related to our preferred document
        +			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
        +				return -1;
        +			}
        +			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
        +				return 1;
        +			}
        +
        +			// Maintain original order
        +			return sortInput ?
        +				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
        +				0;
        +		}
        +
        +		return compare & 4 ? -1 : 1;
        +	} :
        +	function( a, b ) {
        +		// Exit early if the nodes are identical
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +		}
        +
        +		var cur,
        +			i = 0,
        +			aup = a.parentNode,
        +			bup = b.parentNode,
        +			ap = [ a ],
        +			bp = [ b ];
        +
        +		// Parentless nodes are either documents or disconnected
        +		if ( !aup || !bup ) {
        +			return a === document ? -1 :
        +				b === document ? 1 :
        +				aup ? -1 :
        +				bup ? 1 :
        +				sortInput ?
        +				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
        +				0;
        +
        +		// If the nodes are siblings, we can do a quick check
        +		} else if ( aup === bup ) {
        +			return siblingCheck( a, b );
        +		}
        +
        +		// Otherwise we need full lists of their ancestors for comparison
        +		cur = a;
        +		while ( (cur = cur.parentNode) ) {
        +			ap.unshift( cur );
        +		}
        +		cur = b;
        +		while ( (cur = cur.parentNode) ) {
        +			bp.unshift( cur );
        +		}
        +
        +		// Walk down the tree looking for a discrepancy
        +		while ( ap[i] === bp[i] ) {
        +			i++;
        +		}
        +
        +		return i ?
        +			// Do a sibling check if the nodes have a common ancestor
        +			siblingCheck( ap[i], bp[i] ) :
        +
        +			// Otherwise nodes in our document sort first
        +			ap[i] === preferredDoc ? -1 :
        +			bp[i] === preferredDoc ? 1 :
        +			0;
        +	};
        +
        +	return document;
        +};
        +
        +Sizzle.matches = function( expr, elements ) {
        +	return Sizzle( expr, null, null, elements );
        +};
        +
        +Sizzle.matchesSelector = function( elem, expr ) {
        +	// Set document vars if needed
        +	if ( ( elem.ownerDocument || elem ) !== document ) {
        +		setDocument( elem );
        +	}
        +
        +	// Make sure that attribute selectors are quoted
        +	expr = expr.replace( rattributeQuotes, "='$1']" );
        +
        +	if ( support.matchesSelector && documentIsHTML &&
        +		!compilerCache[ expr + " " ] &&
        +		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
        +		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
        +
        +		try {
        +			var ret = matches.call( elem, expr );
        +
        +			// IE 9's matchesSelector returns false on disconnected nodes
        +			if ( ret || support.disconnectedMatch ||
        +					// As well, disconnected nodes are said to be in a document
        +					// fragment in IE 9
        +					elem.document && elem.document.nodeType !== 11 ) {
        +				return ret;
        +			}
        +		} catch (e) {}
        +	}
        +
        +	return Sizzle( expr, document, null, [ elem ] ).length > 0;
        +};
        +
        +Sizzle.contains = function( context, elem ) {
        +	// Set document vars if needed
        +	if ( ( context.ownerDocument || context ) !== document ) {
        +		setDocument( context );
        +	}
        +	return contains( context, elem );
        +};
        +
        +Sizzle.attr = function( elem, name ) {
        +	// Set document vars if needed
        +	if ( ( elem.ownerDocument || elem ) !== document ) {
        +		setDocument( elem );
        +	}
        +
        +	var fn = Expr.attrHandle[ name.toLowerCase() ],
        +		// Don't get fooled by Object.prototype properties (jQuery #13807)
        +		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
        +			fn( elem, name, !documentIsHTML ) :
        +			undefined;
        +
        +	return val !== undefined ?
        +		val :
        +		support.attributes || !documentIsHTML ?
        +			elem.getAttribute( name ) :
        +			(val = elem.getAttributeNode(name)) && val.specified ?
        +				val.value :
        +				null;
        +};
        +
        +Sizzle.escape = function( sel ) {
        +	return (sel + "").replace( rcssescape, fcssescape );
        +};
        +
        +Sizzle.error = function( msg ) {
        +	throw new Error( "Syntax error, unrecognized expression: " + msg );
        +};
        +
        +/**
        + * Document sorting and removing duplicates
        + * @param {ArrayLike} results
        + */
        +Sizzle.uniqueSort = function( results ) {
        +	var elem,
        +		duplicates = [],
        +		j = 0,
        +		i = 0;
        +
        +	// Unless we *know* we can detect duplicates, assume their presence
        +	hasDuplicate = !support.detectDuplicates;
        +	sortInput = !support.sortStable && results.slice( 0 );
        +	results.sort( sortOrder );
        +
        +	if ( hasDuplicate ) {
        +		while ( (elem = results[i++]) ) {
        +			if ( elem === results[ i ] ) {
        +				j = duplicates.push( i );
        +			}
        +		}
        +		while ( j-- ) {
        +			results.splice( duplicates[ j ], 1 );
        +		}
        +	}
        +
        +	// Clear input after sorting to release objects
        +	// See https://github.com/jquery/sizzle/pull/225
        +	sortInput = null;
        +
        +	return results;
        +};
        +
        +/**
        + * Utility function for retrieving the text value of an array of DOM nodes
        + * @param {Array|Element} elem
        + */
        +getText = Sizzle.getText = function( elem ) {
        +	var node,
        +		ret = "",
        +		i = 0,
        +		nodeType = elem.nodeType;
        +
        +	if ( !nodeType ) {
        +		// If no nodeType, this is expected to be an array
        +		while ( (node = elem[i++]) ) {
        +			// Do not traverse comment nodes
        +			ret += getText( node );
        +		}
        +	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +		// Use textContent for elements
        +		// innerText usage removed for consistency of new lines (jQuery #11153)
        +		if ( typeof elem.textContent === "string" ) {
        +			return elem.textContent;
        +		} else {
        +			// Traverse its children
        +			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +				ret += getText( elem );
        +			}
        +		}
        +	} else if ( nodeType === 3 || nodeType === 4 ) {
        +		return elem.nodeValue;
        +	}
        +	// Do not include comment or processing instruction nodes
        +
        +	return ret;
        +};
        +
        +Expr = Sizzle.selectors = {
        +
        +	// Can be adjusted by the user
        +	cacheLength: 50,
        +
        +	createPseudo: markFunction,
        +
        +	match: matchExpr,
        +
        +	attrHandle: {},
        +
        +	find: {},
        +
        +	relative: {
        +		">": { dir: "parentNode", first: true },
        +		" ": { dir: "parentNode" },
        +		"+": { dir: "previousSibling", first: true },
        +		"~": { dir: "previousSibling" }
        +	},
        +
        +	preFilter: {
        +		"ATTR": function( match ) {
        +			match[1] = match[1].replace( runescape, funescape );
        +
        +			// Move the given value to match[3] whether quoted or unquoted
        +			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
        +
        +			if ( match[2] === "~=" ) {
        +				match[3] = " " + match[3] + " ";
        +			}
        +
        +			return match.slice( 0, 4 );
        +		},
        +
        +		"CHILD": function( match ) {
        +			/* matches from matchExpr["CHILD"]
        +				1 type (only|nth|...)
        +				2 what (child|of-type)
        +				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
        +				4 xn-component of xn+y argument ([+-]?\d*n|)
        +				5 sign of xn-component
        +				6 x of xn-component
        +				7 sign of y-component
        +				8 y of y-component
        +			*/
        +			match[1] = match[1].toLowerCase();
        +
        +			if ( match[1].slice( 0, 3 ) === "nth" ) {
        +				// nth-* requires argument
        +				if ( !match[3] ) {
        +					Sizzle.error( match[0] );
        +				}
        +
        +				// numeric x and y parameters for Expr.filter.CHILD
        +				// remember that false/true cast respectively to 0/1
        +				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
        +				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
        +
        +			// other types prohibit arguments
        +			} else if ( match[3] ) {
        +				Sizzle.error( match[0] );
        +			}
        +
        +			return match;
        +		},
        +
        +		"PSEUDO": function( match ) {
        +			var excess,
        +				unquoted = !match[6] && match[2];
        +
        +			if ( matchExpr["CHILD"].test( match[0] ) ) {
        +				return null;
        +			}
        +
        +			// Accept quoted arguments as-is
        +			if ( match[3] ) {
        +				match[2] = match[4] || match[5] || "";
        +
        +			// Strip excess characters from unquoted arguments
        +			} else if ( unquoted && rpseudo.test( unquoted ) &&
        +				// Get excess from tokenize (recursively)
        +				(excess = tokenize( unquoted, true )) &&
        +				// advance to the next closing parenthesis
        +				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
        +
        +				// excess is a negative index
        +				match[0] = match[0].slice( 0, excess );
        +				match[2] = unquoted.slice( 0, excess );
        +			}
        +
        +			// Return only captures needed by the pseudo filter method (type and argument)
        +			return match.slice( 0, 3 );
        +		}
        +	},
        +
        +	filter: {
        +
        +		"TAG": function( nodeNameSelector ) {
        +			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
        +			return nodeNameSelector === "*" ?
        +				function() { return true; } :
        +				function( elem ) {
        +					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
        +				};
        +		},
        +
        +		"CLASS": function( className ) {
        +			var pattern = classCache[ className + " " ];
        +
        +			return pattern ||
        +				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
        +				classCache( className, function( elem ) {
        +					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
        +				});
        +		},
        +
        +		"ATTR": function( name, operator, check ) {
        +			return function( elem ) {
        +				var result = Sizzle.attr( elem, name );
        +
        +				if ( result == null ) {
        +					return operator === "!=";
        +				}
        +				if ( !operator ) {
        +					return true;
        +				}
        +
        +				result += "";
        +
        +				return operator === "=" ? result === check :
        +					operator === "!=" ? result !== check :
        +					operator === "^=" ? check && result.indexOf( check ) === 0 :
        +					operator === "*=" ? check && result.indexOf( check ) > -1 :
        +					operator === "$=" ? check && result.slice( -check.length ) === check :
        +					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
        +					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
        +					false;
        +			};
        +		},
        +
        +		"CHILD": function( type, what, argument, first, last ) {
        +			var simple = type.slice( 0, 3 ) !== "nth",
        +				forward = type.slice( -4 ) !== "last",
        +				ofType = what === "of-type";
        +
        +			return first === 1 && last === 0 ?
        +
        +				// Shortcut for :nth-*(n)
        +				function( elem ) {
        +					return !!elem.parentNode;
        +				} :
        +
        +				function( elem, context, xml ) {
        +					var cache, uniqueCache, outerCache, node, nodeIndex, start,
        +						dir = simple !== forward ? "nextSibling" : "previousSibling",
        +						parent = elem.parentNode,
        +						name = ofType && elem.nodeName.toLowerCase(),
        +						useCache = !xml && !ofType,
        +						diff = false;
        +
        +					if ( parent ) {
        +
        +						// :(first|last|only)-(child|of-type)
        +						if ( simple ) {
        +							while ( dir ) {
        +								node = elem;
        +								while ( (node = node[ dir ]) ) {
        +									if ( ofType ?
        +										node.nodeName.toLowerCase() === name :
        +										node.nodeType === 1 ) {
        +
        +										return false;
        +									}
        +								}
        +								// Reverse direction for :only-* (if we haven't yet done so)
        +								start = dir = type === "only" && !start && "nextSibling";
        +							}
        +							return true;
        +						}
        +
        +						start = [ forward ? parent.firstChild : parent.lastChild ];
        +
        +						// non-xml :nth-child(...) stores cache data on `parent`
        +						if ( forward && useCache ) {
        +
        +							// Seek `elem` from a previously-cached index
        +
        +							// ...in a gzip-friendly way
        +							node = parent;
        +							outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +							// Support: IE <9 only
        +							// Defend against cloned attroperties (jQuery gh-1709)
        +							uniqueCache = outerCache[ node.uniqueID ] ||
        +								(outerCache[ node.uniqueID ] = {});
        +
        +							cache = uniqueCache[ type ] || [];
        +							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
        +							diff = nodeIndex && cache[ 2 ];
        +							node = nodeIndex && parent.childNodes[ nodeIndex ];
        +
        +							while ( (node = ++nodeIndex && node && node[ dir ] ||
        +
        +								// Fallback to seeking `elem` from the start
        +								(diff = nodeIndex = 0) || start.pop()) ) {
        +
        +								// When found, cache indexes on `parent` and break
        +								if ( node.nodeType === 1 && ++diff && node === elem ) {
        +									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
        +									break;
        +								}
        +							}
        +
        +						} else {
        +							// Use previously-cached element index if available
        +							if ( useCache ) {
        +								// ...in a gzip-friendly way
        +								node = elem;
        +								outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +								// Support: IE <9 only
        +								// Defend against cloned attroperties (jQuery gh-1709)
        +								uniqueCache = outerCache[ node.uniqueID ] ||
        +									(outerCache[ node.uniqueID ] = {});
        +
        +								cache = uniqueCache[ type ] || [];
        +								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
        +								diff = nodeIndex;
        +							}
        +
        +							// xml :nth-child(...)
        +							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
        +							if ( diff === false ) {
        +								// Use the same loop as above to seek `elem` from the start
        +								while ( (node = ++nodeIndex && node && node[ dir ] ||
        +									(diff = nodeIndex = 0) || start.pop()) ) {
        +
        +									if ( ( ofType ?
        +										node.nodeName.toLowerCase() === name :
        +										node.nodeType === 1 ) &&
        +										++diff ) {
        +
        +										// Cache the index of each encountered element
        +										if ( useCache ) {
        +											outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +											// Support: IE <9 only
        +											// Defend against cloned attroperties (jQuery gh-1709)
        +											uniqueCache = outerCache[ node.uniqueID ] ||
        +												(outerCache[ node.uniqueID ] = {});
        +
        +											uniqueCache[ type ] = [ dirruns, diff ];
        +										}
        +
        +										if ( node === elem ) {
        +											break;
        +										}
        +									}
        +								}
        +							}
        +						}
        +
        +						// Incorporate the offset, then check against cycle size
        +						diff -= last;
        +						return diff === first || ( diff % first === 0 && diff / first >= 0 );
        +					}
        +				};
        +		},
        +
        +		"PSEUDO": function( pseudo, argument ) {
        +			// pseudo-class names are case-insensitive
        +			// http://www.w3.org/TR/selectors/#pseudo-classes
        +			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
        +			// Remember that setFilters inherits from pseudos
        +			var args,
        +				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
        +					Sizzle.error( "unsupported pseudo: " + pseudo );
        +
        +			// The user may use createPseudo to indicate that
        +			// arguments are needed to create the filter function
        +			// just as Sizzle does
        +			if ( fn[ expando ] ) {
        +				return fn( argument );
        +			}
        +
        +			// But maintain support for old signatures
        +			if ( fn.length > 1 ) {
        +				args = [ pseudo, pseudo, "", argument ];
        +				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
        +					markFunction(function( seed, matches ) {
        +						var idx,
        +							matched = fn( seed, argument ),
        +							i = matched.length;
        +						while ( i-- ) {
        +							idx = indexOf( seed, matched[i] );
        +							seed[ idx ] = !( matches[ idx ] = matched[i] );
        +						}
        +					}) :
        +					function( elem ) {
        +						return fn( elem, 0, args );
        +					};
        +			}
        +
        +			return fn;
        +		}
        +	},
        +
        +	pseudos: {
        +		// Potentially complex pseudos
        +		"not": markFunction(function( selector ) {
        +			// Trim the selector passed to compile
        +			// to avoid treating leading and trailing
        +			// spaces as combinators
        +			var input = [],
        +				results = [],
        +				matcher = compile( selector.replace( rtrim, "$1" ) );
        +
        +			return matcher[ expando ] ?
        +				markFunction(function( seed, matches, context, xml ) {
        +					var elem,
        +						unmatched = matcher( seed, null, xml, [] ),
        +						i = seed.length;
        +
        +					// Match elements unmatched by `matcher`
        +					while ( i-- ) {
        +						if ( (elem = unmatched[i]) ) {
        +							seed[i] = !(matches[i] = elem);
        +						}
        +					}
        +				}) :
        +				function( elem, context, xml ) {
        +					input[0] = elem;
        +					matcher( input, null, xml, results );
        +					// Don't keep the element (issue #299)
        +					input[0] = null;
        +					return !results.pop();
        +				};
        +		}),
        +
        +		"has": markFunction(function( selector ) {
        +			return function( elem ) {
        +				return Sizzle( selector, elem ).length > 0;
        +			};
        +		}),
        +
        +		"contains": markFunction(function( text ) {
        +			text = text.replace( runescape, funescape );
        +			return function( elem ) {
        +				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
        +			};
        +		}),
        +
        +		// "Whether an element is represented by a :lang() selector
        +		// is based solely on the element's language value
        +		// being equal to the identifier C,
        +		// or beginning with the identifier C immediately followed by "-".
        +		// The matching of C against the element's language value is performed case-insensitively.
        +		// The identifier C does not have to be a valid language name."
        +		// http://www.w3.org/TR/selectors/#lang-pseudo
        +		"lang": markFunction( function( lang ) {
        +			// lang value must be a valid identifier
        +			if ( !ridentifier.test(lang || "") ) {
        +				Sizzle.error( "unsupported lang: " + lang );
        +			}
        +			lang = lang.replace( runescape, funescape ).toLowerCase();
        +			return function( elem ) {
        +				var elemLang;
        +				do {
        +					if ( (elemLang = documentIsHTML ?
        +						elem.lang :
        +						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
        +
        +						elemLang = elemLang.toLowerCase();
        +						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
        +					}
        +				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
        +				return false;
        +			};
        +		}),
        +
        +		// Miscellaneous
        +		"target": function( elem ) {
        +			var hash = window.location && window.location.hash;
        +			return hash && hash.slice( 1 ) === elem.id;
        +		},
        +
        +		"root": function( elem ) {
        +			return elem === docElem;
        +		},
        +
        +		"focus": function( elem ) {
        +			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
        +		},
        +
        +		// Boolean properties
        +		"enabled": createDisabledPseudo( false ),
        +		"disabled": createDisabledPseudo( true ),
        +
        +		"checked": function( elem ) {
        +			// In CSS3, :checked should return both checked and selected elements
        +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +			var nodeName = elem.nodeName.toLowerCase();
        +			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
        +		},
        +
        +		"selected": function( elem ) {
        +			// Accessing this property makes selected-by-default
        +			// options in Safari work properly
        +			if ( elem.parentNode ) {
        +				elem.parentNode.selectedIndex;
        +			}
        +
        +			return elem.selected === true;
        +		},
        +
        +		// Contents
        +		"empty": function( elem ) {
        +			// http://www.w3.org/TR/selectors/#empty-pseudo
        +			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
        +			//   but not by others (comment: 8; processing instruction: 7; etc.)
        +			// nodeType < 6 works because attributes (2) do not appear as children
        +			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +				if ( elem.nodeType < 6 ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		},
        +
        +		"parent": function( elem ) {
        +			return !Expr.pseudos["empty"]( elem );
        +		},
        +
        +		// Element/input types
        +		"header": function( elem ) {
        +			return rheader.test( elem.nodeName );
        +		},
        +
        +		"input": function( elem ) {
        +			return rinputs.test( elem.nodeName );
        +		},
        +
        +		"button": function( elem ) {
        +			var name = elem.nodeName.toLowerCase();
        +			return name === "input" && elem.type === "button" || name === "button";
        +		},
        +
        +		"text": function( elem ) {
        +			var attr;
        +			return elem.nodeName.toLowerCase() === "input" &&
        +				elem.type === "text" &&
        +
        +				// Support: IE<8
        +				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
        +				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
        +		},
        +
        +		// Position-in-collection
        +		"first": createPositionalPseudo(function() {
        +			return [ 0 ];
        +		}),
        +
        +		"last": createPositionalPseudo(function( matchIndexes, length ) {
        +			return [ length - 1 ];
        +		}),
        +
        +		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			return [ argument < 0 ? argument + length : argument ];
        +		}),
        +
        +		"even": createPositionalPseudo(function( matchIndexes, length ) {
        +			var i = 0;
        +			for ( ; i < length; i += 2 ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"odd": createPositionalPseudo(function( matchIndexes, length ) {
        +			var i = 1;
        +			for ( ; i < length; i += 2 ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			var i = argument < 0 ? argument + length : argument;
        +			for ( ; --i >= 0; ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			var i = argument < 0 ? argument + length : argument;
        +			for ( ; ++i < length; ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		})
        +	}
        +};
        +
        +Expr.pseudos["nth"] = Expr.pseudos["eq"];
        +
        +// Add button/input type pseudos
        +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
        +	Expr.pseudos[ i ] = createInputPseudo( i );
        +}
        +for ( i in { submit: true, reset: true } ) {
        +	Expr.pseudos[ i ] = createButtonPseudo( i );
        +}
        +
        +// Easy API for creating new setFilters
        +function setFilters() {}
        +setFilters.prototype = Expr.filters = Expr.pseudos;
        +Expr.setFilters = new setFilters();
        +
        +tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
        +	var matched, match, tokens, type,
        +		soFar, groups, preFilters,
        +		cached = tokenCache[ selector + " " ];
        +
        +	if ( cached ) {
        +		return parseOnly ? 0 : cached.slice( 0 );
        +	}
        +
        +	soFar = selector;
        +	groups = [];
        +	preFilters = Expr.preFilter;
        +
        +	while ( soFar ) {
        +
        +		// Comma and first run
        +		if ( !matched || (match = rcomma.exec( soFar )) ) {
        +			if ( match ) {
        +				// Don't consume trailing commas as valid
        +				soFar = soFar.slice( match[0].length ) || soFar;
        +			}
        +			groups.push( (tokens = []) );
        +		}
        +
        +		matched = false;
        +
        +		// Combinators
        +		if ( (match = rcombinators.exec( soFar )) ) {
        +			matched = match.shift();
        +			tokens.push({
        +				value: matched,
        +				// Cast descendant combinators to space
        +				type: match[0].replace( rtrim, " " )
        +			});
        +			soFar = soFar.slice( matched.length );
        +		}
        +
        +		// Filters
        +		for ( type in Expr.filter ) {
        +			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
        +				(match = preFilters[ type ]( match ))) ) {
        +				matched = match.shift();
        +				tokens.push({
        +					value: matched,
        +					type: type,
        +					matches: match
        +				});
        +				soFar = soFar.slice( matched.length );
        +			}
        +		}
        +
        +		if ( !matched ) {
        +			break;
        +		}
        +	}
        +
        +	// Return the length of the invalid excess
        +	// if we're just parsing
        +	// Otherwise, throw an error or return tokens
        +	return parseOnly ?
        +		soFar.length :
        +		soFar ?
        +			Sizzle.error( selector ) :
        +			// Cache the tokens
        +			tokenCache( selector, groups ).slice( 0 );
        +};
        +
        +function toSelector( tokens ) {
        +	var i = 0,
        +		len = tokens.length,
        +		selector = "";
        +	for ( ; i < len; i++ ) {
        +		selector += tokens[i].value;
        +	}
        +	return selector;
        +}
        +
        +function addCombinator( matcher, combinator, base ) {
        +	var dir = combinator.dir,
        +		skip = combinator.next,
        +		key = skip || dir,
        +		checkNonElements = base && key === "parentNode",
        +		doneName = done++;
        +
        +	return combinator.first ?
        +		// Check against closest ancestor/preceding element
        +		function( elem, context, xml ) {
        +			while ( (elem = elem[ dir ]) ) {
        +				if ( elem.nodeType === 1 || checkNonElements ) {
        +					return matcher( elem, context, xml );
        +				}
        +			}
        +			return false;
        +		} :
        +
        +		// Check against all ancestor/preceding elements
        +		function( elem, context, xml ) {
        +			var oldCache, uniqueCache, outerCache,
        +				newCache = [ dirruns, doneName ];
        +
        +			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
        +			if ( xml ) {
        +				while ( (elem = elem[ dir ]) ) {
        +					if ( elem.nodeType === 1 || checkNonElements ) {
        +						if ( matcher( elem, context, xml ) ) {
        +							return true;
        +						}
        +					}
        +				}
        +			} else {
        +				while ( (elem = elem[ dir ]) ) {
        +					if ( elem.nodeType === 1 || checkNonElements ) {
        +						outerCache = elem[ expando ] || (elem[ expando ] = {});
        +
        +						// Support: IE <9 only
        +						// Defend against cloned attroperties (jQuery gh-1709)
        +						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
        +
        +						if ( skip && skip === elem.nodeName.toLowerCase() ) {
        +							elem = elem[ dir ] || elem;
        +						} else if ( (oldCache = uniqueCache[ key ]) &&
        +							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
        +
        +							// Assign to newCache so results back-propagate to previous elements
        +							return (newCache[ 2 ] = oldCache[ 2 ]);
        +						} else {
        +							// Reuse newcache so results back-propagate to previous elements
        +							uniqueCache[ key ] = newCache;
        +
        +							// A match means we're done; a fail means we have to keep checking
        +							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
        +								return true;
        +							}
        +						}
        +					}
        +				}
        +			}
        +			return false;
        +		};
        +}
        +
        +function elementMatcher( matchers ) {
        +	return matchers.length > 1 ?
        +		function( elem, context, xml ) {
        +			var i = matchers.length;
        +			while ( i-- ) {
        +				if ( !matchers[i]( elem, context, xml ) ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		} :
        +		matchers[0];
        +}
        +
        +function multipleContexts( selector, contexts, results ) {
        +	var i = 0,
        +		len = contexts.length;
        +	for ( ; i < len; i++ ) {
        +		Sizzle( selector, contexts[i], results );
        +	}
        +	return results;
        +}
        +
        +function condense( unmatched, map, filter, context, xml ) {
        +	var elem,
        +		newUnmatched = [],
        +		i = 0,
        +		len = unmatched.length,
        +		mapped = map != null;
        +
        +	for ( ; i < len; i++ ) {
        +		if ( (elem = unmatched[i]) ) {
        +			if ( !filter || filter( elem, context, xml ) ) {
        +				newUnmatched.push( elem );
        +				if ( mapped ) {
        +					map.push( i );
        +				}
        +			}
        +		}
        +	}
        +
        +	return newUnmatched;
        +}
        +
        +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
        +	if ( postFilter && !postFilter[ expando ] ) {
        +		postFilter = setMatcher( postFilter );
        +	}
        +	if ( postFinder && !postFinder[ expando ] ) {
        +		postFinder = setMatcher( postFinder, postSelector );
        +	}
        +	return markFunction(function( seed, results, context, xml ) {
        +		var temp, i, elem,
        +			preMap = [],
        +			postMap = [],
        +			preexisting = results.length,
        +
        +			// Get initial elements from seed or context
        +			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
        +
        +			// Prefilter to get matcher input, preserving a map for seed-results synchronization
        +			matcherIn = preFilter && ( seed || !selector ) ?
        +				condense( elems, preMap, preFilter, context, xml ) :
        +				elems,
        +
        +			matcherOut = matcher ?
        +				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
        +				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
        +
        +					// ...intermediate processing is necessary
        +					[] :
        +
        +					// ...otherwise use results directly
        +					results :
        +				matcherIn;
        +
        +		// Find primary matches
        +		if ( matcher ) {
        +			matcher( matcherIn, matcherOut, context, xml );
        +		}
        +
        +		// Apply postFilter
        +		if ( postFilter ) {
        +			temp = condense( matcherOut, postMap );
        +			postFilter( temp, [], context, xml );
        +
        +			// Un-match failing elements by moving them back to matcherIn
        +			i = temp.length;
        +			while ( i-- ) {
        +				if ( (elem = temp[i]) ) {
        +					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
        +				}
        +			}
        +		}
        +
        +		if ( seed ) {
        +			if ( postFinder || preFilter ) {
        +				if ( postFinder ) {
        +					// Get the final matcherOut by condensing this intermediate into postFinder contexts
        +					temp = [];
        +					i = matcherOut.length;
        +					while ( i-- ) {
        +						if ( (elem = matcherOut[i]) ) {
        +							// Restore matcherIn since elem is not yet a final match
        +							temp.push( (matcherIn[i] = elem) );
        +						}
        +					}
        +					postFinder( null, (matcherOut = []), temp, xml );
        +				}
        +
        +				// Move matched elements from seed to results to keep them synchronized
        +				i = matcherOut.length;
        +				while ( i-- ) {
        +					if ( (elem = matcherOut[i]) &&
        +						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
        +
        +						seed[temp] = !(results[temp] = elem);
        +					}
        +				}
        +			}
        +
        +		// Add elements to results, through postFinder if defined
        +		} else {
        +			matcherOut = condense(
        +				matcherOut === results ?
        +					matcherOut.splice( preexisting, matcherOut.length ) :
        +					matcherOut
        +			);
        +			if ( postFinder ) {
        +				postFinder( null, results, matcherOut, xml );
        +			} else {
        +				push.apply( results, matcherOut );
        +			}
        +		}
        +	});
        +}
        +
        +function matcherFromTokens( tokens ) {
        +	var checkContext, matcher, j,
        +		len = tokens.length,
        +		leadingRelative = Expr.relative[ tokens[0].type ],
        +		implicitRelative = leadingRelative || Expr.relative[" "],
        +		i = leadingRelative ? 1 : 0,
        +
        +		// The foundational matcher ensures that elements are reachable from top-level context(s)
        +		matchContext = addCombinator( function( elem ) {
        +			return elem === checkContext;
        +		}, implicitRelative, true ),
        +		matchAnyContext = addCombinator( function( elem ) {
        +			return indexOf( checkContext, elem ) > -1;
        +		}, implicitRelative, true ),
        +		matchers = [ function( elem, context, xml ) {
        +			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
        +				(checkContext = context).nodeType ?
        +					matchContext( elem, context, xml ) :
        +					matchAnyContext( elem, context, xml ) );
        +			// Avoid hanging onto element (issue #299)
        +			checkContext = null;
        +			return ret;
        +		} ];
        +
        +	for ( ; i < len; i++ ) {
        +		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
        +			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
        +		} else {
        +			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
        +
        +			// Return special upon seeing a positional matcher
        +			if ( matcher[ expando ] ) {
        +				// Find the next relative operator (if any) for proper handling
        +				j = ++i;
        +				for ( ; j < len; j++ ) {
        +					if ( Expr.relative[ tokens[j].type ] ) {
        +						break;
        +					}
        +				}
        +				return setMatcher(
        +					i > 1 && elementMatcher( matchers ),
        +					i > 1 && toSelector(
        +						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
        +						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
        +					).replace( rtrim, "$1" ),
        +					matcher,
        +					i < j && matcherFromTokens( tokens.slice( i, j ) ),
        +					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
        +					j < len && toSelector( tokens )
        +				);
        +			}
        +			matchers.push( matcher );
        +		}
        +	}
        +
        +	return elementMatcher( matchers );
        +}
        +
        +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
        +	var bySet = setMatchers.length > 0,
        +		byElement = elementMatchers.length > 0,
        +		superMatcher = function( seed, context, xml, results, outermost ) {
        +			var elem, j, matcher,
        +				matchedCount = 0,
        +				i = "0",
        +				unmatched = seed && [],
        +				setMatched = [],
        +				contextBackup = outermostContext,
        +				// We must always have either seed elements or outermost context
        +				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
        +				// Use integer dirruns iff this is the outermost matcher
        +				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
        +				len = elems.length;
        +
        +			if ( outermost ) {
        +				outermostContext = context === document || context || outermost;
        +			}
        +
        +			// Add elements passing elementMatchers directly to results
        +			// Support: IE<9, Safari
        +			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
        +			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
        +				if ( byElement && elem ) {
        +					j = 0;
        +					if ( !context && elem.ownerDocument !== document ) {
        +						setDocument( elem );
        +						xml = !documentIsHTML;
        +					}
        +					while ( (matcher = elementMatchers[j++]) ) {
        +						if ( matcher( elem, context || document, xml) ) {
        +							results.push( elem );
        +							break;
        +						}
        +					}
        +					if ( outermost ) {
        +						dirruns = dirrunsUnique;
        +					}
        +				}
        +
        +				// Track unmatched elements for set filters
        +				if ( bySet ) {
        +					// They will have gone through all possible matchers
        +					if ( (elem = !matcher && elem) ) {
        +						matchedCount--;
        +					}
        +
        +					// Lengthen the array for every element, matched or not
        +					if ( seed ) {
        +						unmatched.push( elem );
        +					}
        +				}
        +			}
        +
        +			// `i` is now the count of elements visited above, and adding it to `matchedCount`
        +			// makes the latter nonnegative.
        +			matchedCount += i;
        +
        +			// Apply set filters to unmatched elements
        +			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
        +			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
        +			// no element matchers and no seed.
        +			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
        +			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
        +			// numerically zero.
        +			if ( bySet && i !== matchedCount ) {
        +				j = 0;
        +				while ( (matcher = setMatchers[j++]) ) {
        +					matcher( unmatched, setMatched, context, xml );
        +				}
        +
        +				if ( seed ) {
        +					// Reintegrate element matches to eliminate the need for sorting
        +					if ( matchedCount > 0 ) {
        +						while ( i-- ) {
        +							if ( !(unmatched[i] || setMatched[i]) ) {
        +								setMatched[i] = pop.call( results );
        +							}
        +						}
        +					}
        +
        +					// Discard index placeholder values to get only actual matches
        +					setMatched = condense( setMatched );
        +				}
        +
        +				// Add matches to results
        +				push.apply( results, setMatched );
        +
        +				// Seedless set matches succeeding multiple successful matchers stipulate sorting
        +				if ( outermost && !seed && setMatched.length > 0 &&
        +					( matchedCount + setMatchers.length ) > 1 ) {
        +
        +					Sizzle.uniqueSort( results );
        +				}
        +			}
        +
        +			// Override manipulation of globals by nested matchers
        +			if ( outermost ) {
        +				dirruns = dirrunsUnique;
        +				outermostContext = contextBackup;
        +			}
        +
        +			return unmatched;
        +		};
        +
        +	return bySet ?
        +		markFunction( superMatcher ) :
        +		superMatcher;
        +}
        +
        +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
        +	var i,
        +		setMatchers = [],
        +		elementMatchers = [],
        +		cached = compilerCache[ selector + " " ];
        +
        +	if ( !cached ) {
        +		// Generate a function of recursive functions that can be used to check each element
        +		if ( !match ) {
        +			match = tokenize( selector );
        +		}
        +		i = match.length;
        +		while ( i-- ) {
        +			cached = matcherFromTokens( match[i] );
        +			if ( cached[ expando ] ) {
        +				setMatchers.push( cached );
        +			} else {
        +				elementMatchers.push( cached );
        +			}
        +		}
        +
        +		// Cache the compiled function
        +		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
        +
        +		// Save selector and tokenization
        +		cached.selector = selector;
        +	}
        +	return cached;
        +};
        +
        +/**
        + * A low-level selection function that works with Sizzle's compiled
        + *  selector functions
        + * @param {String|Function} selector A selector or a pre-compiled
        + *  selector function built with Sizzle.compile
        + * @param {Element} context
        + * @param {Array} [results]
        + * @param {Array} [seed] A set of elements to match against
        + */
        +select = Sizzle.select = function( selector, context, results, seed ) {
        +	var i, tokens, token, type, find,
        +		compiled = typeof selector === "function" && selector,
        +		match = !seed && tokenize( (selector = compiled.selector || selector) );
        +
        +	results = results || [];
        +
        +	// Try to minimize operations if there is only one selector in the list and no seed
        +	// (the latter of which guarantees us context)
        +	if ( match.length === 1 ) {
        +
        +		// Reduce context if the leading compound selector is an ID
        +		tokens = match[0] = match[0].slice( 0 );
        +		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
        +				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
        +
        +			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
        +			if ( !context ) {
        +				return results;
        +
        +			// Precompiled matchers will still verify ancestry, so step up a level
        +			} else if ( compiled ) {
        +				context = context.parentNode;
        +			}
        +
        +			selector = selector.slice( tokens.shift().value.length );
        +		}
        +
        +		// Fetch a seed set for right-to-left matching
        +		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
        +		while ( i-- ) {
        +			token = tokens[i];
        +
        +			// Abort if we hit a combinator
        +			if ( Expr.relative[ (type = token.type) ] ) {
        +				break;
        +			}
        +			if ( (find = Expr.find[ type ]) ) {
        +				// Search, expanding context for leading sibling combinators
        +				if ( (seed = find(
        +					token.matches[0].replace( runescape, funescape ),
        +					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
        +				)) ) {
        +
        +					// If seed is empty or no tokens remain, we can return early
        +					tokens.splice( i, 1 );
        +					selector = seed.length && toSelector( tokens );
        +					if ( !selector ) {
        +						push.apply( results, seed );
        +						return results;
        +					}
        +
        +					break;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Compile and execute a filtering function if one is not provided
        +	// Provide `match` to avoid retokenization if we modified the selector above
        +	( compiled || compile( selector, match ) )(
        +		seed,
        +		context,
        +		!documentIsHTML,
        +		results,
        +		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
        +	);
        +	return results;
        +};
        +
        +// One-time assignments
        +
        +// Sort stability
        +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
        +
        +// Support: Chrome 14-35+
        +// Always assume duplicates if they aren't passed to the comparison function
        +support.detectDuplicates = !!hasDuplicate;
        +
        +// Initialize against the default document
        +setDocument();
        +
        +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
        +// Detached nodes confoundingly follow *each other*
        +support.sortDetached = assert(function( el ) {
        +	// Should return 1, but returns 4 (following)
        +	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
        +});
        +
        +// Support: IE<8
        +// Prevent attribute/property "interpolation"
        +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
        +if ( !assert(function( el ) {
        +	el.innerHTML = "<a href='#'></a>";
        +	return el.firstChild.getAttribute("href") === "#" ;
        +}) ) {
        +	addHandle( "type|href|height|width", function( elem, name, isXML ) {
        +		if ( !isXML ) {
        +			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
        +		}
        +	});
        +}
        +
        +// Support: IE<9
        +// Use defaultValue in place of getAttribute("value")
        +if ( !support.attributes || !assert(function( el ) {
        +	el.innerHTML = "<input/>";
        +	el.firstChild.setAttribute( "value", "" );
        +	return el.firstChild.getAttribute( "value" ) === "";
        +}) ) {
        +	addHandle( "value", function( elem, name, isXML ) {
        +		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
        +			return elem.defaultValue;
        +		}
        +	});
        +}
        +
        +// Support: IE<9
        +// Use getAttributeNode to fetch booleans when getAttribute lies
        +if ( !assert(function( el ) {
        +	return el.getAttribute("disabled") == null;
        +}) ) {
        +	addHandle( booleans, function( elem, name, isXML ) {
        +		var val;
        +		if ( !isXML ) {
        +			return elem[ name ] === true ? name.toLowerCase() :
        +					(val = elem.getAttributeNode( name )) && val.specified ?
        +					val.value :
        +				null;
        +		}
        +	});
        +}
        +
        +return Sizzle;
        +
        +})( window );
        +
        +
        +
        +jQuery.find = Sizzle;
        +jQuery.expr = Sizzle.selectors;
        +
        +// Deprecated
        +jQuery.expr[ ":" ] = jQuery.expr.pseudos;
        +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
        +jQuery.text = Sizzle.getText;
        +jQuery.isXMLDoc = Sizzle.isXML;
        +jQuery.contains = Sizzle.contains;
        +jQuery.escapeSelector = Sizzle.escape;
        +
        +
        +
        +
        +var dir = function( elem, dir, until ) {
        +	var matched = [],
        +		truncate = until !== undefined;
        +
        +	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
        +		if ( elem.nodeType === 1 ) {
        +			if ( truncate && jQuery( elem ).is( until ) ) {
        +				break;
        +			}
        +			matched.push( elem );
        +		}
        +	}
        +	return matched;
        +};
        +
        +
        +var siblings = function( n, elem ) {
        +	var matched = [];
        +
        +	for ( ; n; n = n.nextSibling ) {
        +		if ( n.nodeType === 1 && n !== elem ) {
        +			matched.push( n );
        +		}
        +	}
        +
        +	return matched;
        +};
        +
        +
        +var rneedsContext = jQuery.expr.match.needsContext;
        +
        +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
        +
        +
        +
        +var risSimple = /^.[^:#\[\.,]*$/;
        +
        +// Implement the identical functionality for filter and not
        +function winnow( elements, qualifier, not ) {
        +	if ( jQuery.isFunction( qualifier ) ) {
        +		return jQuery.grep( elements, function( elem, i ) {
        +			return !!qualifier.call( elem, i, elem ) !== not;
        +		} );
        +	}
        +
        +	// Single element
        +	if ( qualifier.nodeType ) {
        +		return jQuery.grep( elements, function( elem ) {
        +			return ( elem === qualifier ) !== not;
        +		} );
        +	}
        +
        +	// Arraylike of elements (jQuery, arguments, Array)
        +	if ( typeof qualifier !== "string" ) {
        +		return jQuery.grep( elements, function( elem ) {
        +			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
        +		} );
        +	}
        +
        +	// Simple selector that can be filtered directly, removing non-Elements
        +	if ( risSimple.test( qualifier ) ) {
        +		return jQuery.filter( qualifier, elements, not );
        +	}
        +
        +	// Complex selector, compare the two sets, removing non-Elements
        +	qualifier = jQuery.filter( qualifier, elements );
        +	return jQuery.grep( elements, function( elem ) {
        +		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
        +	} );
        +}
        +
        +jQuery.filter = function( expr, elems, not ) {
        +	var elem = elems[ 0 ];
        +
        +	if ( not ) {
        +		expr = ":not(" + expr + ")";
        +	}
        +
        +	if ( elems.length === 1 && elem.nodeType === 1 ) {
        +		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
        +	}
        +
        +	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
        +		return elem.nodeType === 1;
        +	} ) );
        +};
        +
        +jQuery.fn.extend( {
        +	find: function( selector ) {
        +		var i, ret,
        +			len = this.length,
        +			self = this;
        +
        +		if ( typeof selector !== "string" ) {
        +			return this.pushStack( jQuery( selector ).filter( function() {
        +				for ( i = 0; i < len; i++ ) {
        +					if ( jQuery.contains( self[ i ], this ) ) {
        +						return true;
        +					}
        +				}
        +			} ) );
        +		}
        +
        +		ret = this.pushStack( [] );
        +
        +		for ( i = 0; i < len; i++ ) {
        +			jQuery.find( selector, self[ i ], ret );
        +		}
        +
        +		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
        +	},
        +	filter: function( selector ) {
        +		return this.pushStack( winnow( this, selector || [], false ) );
        +	},
        +	not: function( selector ) {
        +		return this.pushStack( winnow( this, selector || [], true ) );
        +	},
        +	is: function( selector ) {
        +		return !!winnow(
        +			this,
        +
        +			// If this is a positional/relative selector, check membership in the returned set
        +			// so $("p:first").is("p:last") won't return true for a doc with two "p".
        +			typeof selector === "string" && rneedsContext.test( selector ) ?
        +				jQuery( selector ) :
        +				selector || [],
        +			false
        +		).length;
        +	}
        +} );
        +
        +
        +// Initialize a jQuery object
        +
        +
        +// A central reference to the root jQuery(document)
        +var rootjQuery,
        +
        +	// A simple way to check for HTML strings
        +	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        +	// Strict HTML recognition (#11290: must start with <)
        +	// Shortcut simple #id case for speed
        +	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
        +
        +	init = jQuery.fn.init = function( selector, context, root ) {
        +		var match, elem;
        +
        +		// HANDLE: $(""), $(null), $(undefined), $(false)
        +		if ( !selector ) {
        +			return this;
        +		}
        +
        +		// Method init() accepts an alternate rootjQuery
        +		// so migrate can support jQuery.sub (gh-2101)
        +		root = root || rootjQuery;
        +
        +		// Handle HTML strings
        +		if ( typeof selector === "string" ) {
        +			if ( selector[ 0 ] === "<" &&
        +				selector[ selector.length - 1 ] === ">" &&
        +				selector.length >= 3 ) {
        +
        +				// Assume that strings that start and end with <> are HTML and skip the regex check
        +				match = [ null, selector, null ];
        +
        +			} else {
        +				match = rquickExpr.exec( selector );
        +			}
        +
        +			// Match html or make sure no context is specified for #id
        +			if ( match && ( match[ 1 ] || !context ) ) {
        +
        +				// HANDLE: $(html) -> $(array)
        +				if ( match[ 1 ] ) {
        +					context = context instanceof jQuery ? context[ 0 ] : context;
        +
        +					// Option to run scripts is true for back-compat
        +					// Intentionally let the error be thrown if parseHTML is not present
        +					jQuery.merge( this, jQuery.parseHTML(
        +						match[ 1 ],
        +						context && context.nodeType ? context.ownerDocument || context : document,
        +						true
        +					) );
        +
        +					// HANDLE: $(html, props)
        +					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
        +						for ( match in context ) {
        +
        +							// Properties of context are called as methods if possible
        +							if ( jQuery.isFunction( this[ match ] ) ) {
        +								this[ match ]( context[ match ] );
        +
        +							// ...and otherwise set as attributes
        +							} else {
        +								this.attr( match, context[ match ] );
        +							}
        +						}
        +					}
        +
        +					return this;
        +
        +				// HANDLE: $(#id)
        +				} else {
        +					elem = document.getElementById( match[ 2 ] );
        +
        +					if ( elem ) {
        +
        +						// Inject the element directly into the jQuery object
        +						this[ 0 ] = elem;
        +						this.length = 1;
        +					}
        +					return this;
        +				}
        +
        +			// HANDLE: $(expr, $(...))
        +			} else if ( !context || context.jquery ) {
        +				return ( context || root ).find( selector );
        +
        +			// HANDLE: $(expr, context)
        +			// (which is just equivalent to: $(context).find(expr)
        +			} else {
        +				return this.constructor( context ).find( selector );
        +			}
        +
        +		// HANDLE: $(DOMElement)
        +		} else if ( selector.nodeType ) {
        +			this[ 0 ] = selector;
        +			this.length = 1;
        +			return this;
        +
        +		// HANDLE: $(function)
        +		// Shortcut for document ready
        +		} else if ( jQuery.isFunction( selector ) ) {
        +			return root.ready !== undefined ?
        +				root.ready( selector ) :
        +
        +				// Execute immediately if ready is not present
        +				selector( jQuery );
        +		}
        +
        +		return jQuery.makeArray( selector, this );
        +	};
        +
        +// Give the init function the jQuery prototype for later instantiation
        +init.prototype = jQuery.fn;
        +
        +// Initialize central reference
        +rootjQuery = jQuery( document );
        +
        +
        +var rparentsprev = /^(?:parents|prev(?:Until|All))/,
        +
        +	// Methods guaranteed to produce a unique set when starting from a unique set
        +	guaranteedUnique = {
        +		children: true,
        +		contents: true,
        +		next: true,
        +		prev: true
        +	};
        +
        +jQuery.fn.extend( {
        +	has: function( target ) {
        +		var targets = jQuery( target, this ),
        +			l = targets.length;
        +
        +		return this.filter( function() {
        +			var i = 0;
        +			for ( ; i < l; i++ ) {
        +				if ( jQuery.contains( this, targets[ i ] ) ) {
        +					return true;
        +				}
        +			}
        +		} );
        +	},
        +
        +	closest: function( selectors, context ) {
        +		var cur,
        +			i = 0,
        +			l = this.length,
        +			matched = [],
        +			targets = typeof selectors !== "string" && jQuery( selectors );
        +
        +		// Positional selectors never match, since there's no _selection_ context
        +		if ( !rneedsContext.test( selectors ) ) {
        +			for ( ; i < l; i++ ) {
        +				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
        +
        +					// Always skip document fragments
        +					if ( cur.nodeType < 11 && ( targets ?
        +						targets.index( cur ) > -1 :
        +
        +						// Don't pass non-elements to Sizzle
        +						cur.nodeType === 1 &&
        +							jQuery.find.matchesSelector( cur, selectors ) ) ) {
        +
        +						matched.push( cur );
        +						break;
        +					}
        +				}
        +			}
        +		}
        +
        +		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
        +	},
        +
        +	// Determine the position of an element within the set
        +	index: function( elem ) {
        +
        +		// No argument, return index in parent
        +		if ( !elem ) {
        +			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
        +		}
        +
        +		// Index in selector
        +		if ( typeof elem === "string" ) {
        +			return indexOf.call( jQuery( elem ), this[ 0 ] );
        +		}
        +
        +		// Locate the position of the desired element
        +		return indexOf.call( this,
        +
        +			// If it receives a jQuery object, the first element is used
        +			elem.jquery ? elem[ 0 ] : elem
        +		);
        +	},
        +
        +	add: function( selector, context ) {
        +		return this.pushStack(
        +			jQuery.uniqueSort(
        +				jQuery.merge( this.get(), jQuery( selector, context ) )
        +			)
        +		);
        +	},
        +
        +	addBack: function( selector ) {
        +		return this.add( selector == null ?
        +			this.prevObject : this.prevObject.filter( selector )
        +		);
        +	}
        +} );
        +
        +function sibling( cur, dir ) {
        +	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
        +	return cur;
        +}
        +
        +jQuery.each( {
        +	parent: function( elem ) {
        +		var parent = elem.parentNode;
        +		return parent && parent.nodeType !== 11 ? parent : null;
        +	},
        +	parents: function( elem ) {
        +		return dir( elem, "parentNode" );
        +	},
        +	parentsUntil: function( elem, i, until ) {
        +		return dir( elem, "parentNode", until );
        +	},
        +	next: function( elem ) {
        +		return sibling( elem, "nextSibling" );
        +	},
        +	prev: function( elem ) {
        +		return sibling( elem, "previousSibling" );
        +	},
        +	nextAll: function( elem ) {
        +		return dir( elem, "nextSibling" );
        +	},
        +	prevAll: function( elem ) {
        +		return dir( elem, "previousSibling" );
        +	},
        +	nextUntil: function( elem, i, until ) {
        +		return dir( elem, "nextSibling", until );
        +	},
        +	prevUntil: function( elem, i, until ) {
        +		return dir( elem, "previousSibling", until );
        +	},
        +	siblings: function( elem ) {
        +		return siblings( ( elem.parentNode || {} ).firstChild, elem );
        +	},
        +	children: function( elem ) {
        +		return siblings( elem.firstChild );
        +	},
        +	contents: function( elem ) {
        +		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
        +	}
        +}, function( name, fn ) {
        +	jQuery.fn[ name ] = function( until, selector ) {
        +		var matched = jQuery.map( this, fn, until );
        +
        +		if ( name.slice( -5 ) !== "Until" ) {
        +			selector = until;
        +		}
        +
        +		if ( selector && typeof selector === "string" ) {
        +			matched = jQuery.filter( selector, matched );
        +		}
        +
        +		if ( this.length > 1 ) {
        +
        +			// Remove duplicates
        +			if ( !guaranteedUnique[ name ] ) {
        +				jQuery.uniqueSort( matched );
        +			}
        +
        +			// Reverse order for parents* and prev-derivatives
        +			if ( rparentsprev.test( name ) ) {
        +				matched.reverse();
        +			}
        +		}
        +
        +		return this.pushStack( matched );
        +	};
        +} );
        +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
        +
        +
        +
        +// Convert String-formatted options into Object-formatted ones
        +function createOptions( options ) {
        +	var object = {};
        +	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
        +		object[ flag ] = true;
        +	} );
        +	return object;
        +}
        +
        +/*
        + * Create a callback list using the following parameters:
        + *
        + *	options: an optional list of space-separated options that will change how
        + *			the callback list behaves or a more traditional option object
        + *
        + * By default a callback list will act like an event callback list and can be
        + * "fired" multiple times.
        + *
        + * Possible options:
        + *
        + *	once:			will ensure the callback list can only be fired once (like a Deferred)
        + *
        + *	memory:			will keep track of previous values and will call any callback added
        + *					after the list has been fired right away with the latest "memorized"
        + *					values (like a Deferred)
        + *
        + *	unique:			will ensure a callback can only be added once (no duplicate in the list)
        + *
        + *	stopOnFalse:	interrupt callings when a callback returns false
        + *
        + */
        +jQuery.Callbacks = function( options ) {
        +
        +	// Convert options from String-formatted to Object-formatted if needed
        +	// (we check in cache first)
        +	options = typeof options === "string" ?
        +		createOptions( options ) :
        +		jQuery.extend( {}, options );
        +
        +	var // Flag to know if list is currently firing
        +		firing,
        +
        +		// Last fire value for non-forgettable lists
        +		memory,
        +
        +		// Flag to know if list was already fired
        +		fired,
        +
        +		// Flag to prevent firing
        +		locked,
        +
        +		// Actual callback list
        +		list = [],
        +
        +		// Queue of execution data for repeatable lists
        +		queue = [],
        +
        +		// Index of currently firing callback (modified by add/remove as needed)
        +		firingIndex = -1,
        +
        +		// Fire callbacks
        +		fire = function() {
        +
        +			// Enforce single-firing
        +			locked = options.once;
        +
        +			// Execute callbacks for all pending executions,
        +			// respecting firingIndex overrides and runtime changes
        +			fired = firing = true;
        +			for ( ; queue.length; firingIndex = -1 ) {
        +				memory = queue.shift();
        +				while ( ++firingIndex < list.length ) {
        +
        +					// Run callback and check for early termination
        +					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
        +						options.stopOnFalse ) {
        +
        +						// Jump to end and forget the data so .add doesn't re-fire
        +						firingIndex = list.length;
        +						memory = false;
        +					}
        +				}
        +			}
        +
        +			// Forget the data if we're done with it
        +			if ( !options.memory ) {
        +				memory = false;
        +			}
        +
        +			firing = false;
        +
        +			// Clean up if we're done firing for good
        +			if ( locked ) {
        +
        +				// Keep an empty list if we have data for future add calls
        +				if ( memory ) {
        +					list = [];
        +
        +				// Otherwise, this object is spent
        +				} else {
        +					list = "";
        +				}
        +			}
        +		},
        +
        +		// Actual Callbacks object
        +		self = {
        +
        +			// Add a callback or a collection of callbacks to the list
        +			add: function() {
        +				if ( list ) {
        +
        +					// If we have memory from a past run, we should fire after adding
        +					if ( memory && !firing ) {
        +						firingIndex = list.length - 1;
        +						queue.push( memory );
        +					}
        +
        +					( function add( args ) {
        +						jQuery.each( args, function( _, arg ) {
        +							if ( jQuery.isFunction( arg ) ) {
        +								if ( !options.unique || !self.has( arg ) ) {
        +									list.push( arg );
        +								}
        +							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
        +
        +								// Inspect recursively
        +								add( arg );
        +							}
        +						} );
        +					} )( arguments );
        +
        +					if ( memory && !firing ) {
        +						fire();
        +					}
        +				}
        +				return this;
        +			},
        +
        +			// Remove a callback from the list
        +			remove: function() {
        +				jQuery.each( arguments, function( _, arg ) {
        +					var index;
        +					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
        +						list.splice( index, 1 );
        +
        +						// Handle firing indexes
        +						if ( index <= firingIndex ) {
        +							firingIndex--;
        +						}
        +					}
        +				} );
        +				return this;
        +			},
        +
        +			// Check if a given callback is in the list.
        +			// If no argument is given, return whether or not list has callbacks attached.
        +			has: function( fn ) {
        +				return fn ?
        +					jQuery.inArray( fn, list ) > -1 :
        +					list.length > 0;
        +			},
        +
        +			// Remove all callbacks from the list
        +			empty: function() {
        +				if ( list ) {
        +					list = [];
        +				}
        +				return this;
        +			},
        +
        +			// Disable .fire and .add
        +			// Abort any current/pending executions
        +			// Clear all callbacks and values
        +			disable: function() {
        +				locked = queue = [];
        +				list = memory = "";
        +				return this;
        +			},
        +			disabled: function() {
        +				return !list;
        +			},
        +
        +			// Disable .fire
        +			// Also disable .add unless we have memory (since it would have no effect)
        +			// Abort any pending executions
        +			lock: function() {
        +				locked = queue = [];
        +				if ( !memory && !firing ) {
        +					list = memory = "";
        +				}
        +				return this;
        +			},
        +			locked: function() {
        +				return !!locked;
        +			},
        +
        +			// Call all callbacks with the given context and arguments
        +			fireWith: function( context, args ) {
        +				if ( !locked ) {
        +					args = args || [];
        +					args = [ context, args.slice ? args.slice() : args ];
        +					queue.push( args );
        +					if ( !firing ) {
        +						fire();
        +					}
        +				}
        +				return this;
        +			},
        +
        +			// Call all the callbacks with the given arguments
        +			fire: function() {
        +				self.fireWith( this, arguments );
        +				return this;
        +			},
        +
        +			// To know if the callbacks have already been called at least once
        +			fired: function() {
        +				return !!fired;
        +			}
        +		};
        +
        +	return self;
        +};
        +
        +
        +function Identity( v ) {
        +	return v;
        +}
        +function Thrower( ex ) {
        +	throw ex;
        +}
        +
        +function adoptValue( value, resolve, reject ) {
        +	var method;
        +
        +	try {
        +
        +		// Check for promise aspect first to privilege synchronous behavior
        +		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
        +			method.call( value ).done( resolve ).fail( reject );
        +
        +		// Other thenables
        +		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
        +			method.call( value, resolve, reject );
        +
        +		// Other non-thenables
        +		} else {
        +
        +			// Support: Android 4.0 only
        +			// Strict mode functions invoked without .call/.apply get global-object context
        +			resolve.call( undefined, value );
        +		}
        +
        +	// For Promises/A+, convert exceptions into rejections
        +	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
        +	// Deferred#then to conditionally suppress rejection.
        +	} catch ( value ) {
        +
        +		// Support: Android 4.0 only
        +		// Strict mode functions invoked without .call/.apply get global-object context
        +		reject.call( undefined, value );
        +	}
        +}
        +
        +jQuery.extend( {
        +
        +	Deferred: function( func ) {
        +		var tuples = [
        +
        +				// action, add listener, callbacks,
        +				// ... .then handlers, argument index, [final state]
        +				[ "notify", "progress", jQuery.Callbacks( "memory" ),
        +					jQuery.Callbacks( "memory" ), 2 ],
        +				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
        +					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
        +				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
        +					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
        +			],
        +			state = "pending",
        +			promise = {
        +				state: function() {
        +					return state;
        +				},
        +				always: function() {
        +					deferred.done( arguments ).fail( arguments );
        +					return this;
        +				},
        +				"catch": function( fn ) {
        +					return promise.then( null, fn );
        +				},
        +
        +				// Keep pipe for back-compat
        +				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
        +					var fns = arguments;
        +
        +					return jQuery.Deferred( function( newDefer ) {
        +						jQuery.each( tuples, function( i, tuple ) {
        +
        +							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
        +							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
        +
        +							// deferred.progress(function() { bind to newDefer or newDefer.notify })
        +							// deferred.done(function() { bind to newDefer or newDefer.resolve })
        +							// deferred.fail(function() { bind to newDefer or newDefer.reject })
        +							deferred[ tuple[ 1 ] ]( function() {
        +								var returned = fn && fn.apply( this, arguments );
        +								if ( returned && jQuery.isFunction( returned.promise ) ) {
        +									returned.promise()
        +										.progress( newDefer.notify )
        +										.done( newDefer.resolve )
        +										.fail( newDefer.reject );
        +								} else {
        +									newDefer[ tuple[ 0 ] + "With" ](
        +										this,
        +										fn ? [ returned ] : arguments
        +									);
        +								}
        +							} );
        +						} );
        +						fns = null;
        +					} ).promise();
        +				},
        +				then: function( onFulfilled, onRejected, onProgress ) {
        +					var maxDepth = 0;
        +					function resolve( depth, deferred, handler, special ) {
        +						return function() {
        +							var that = this,
        +								args = arguments,
        +								mightThrow = function() {
        +									var returned, then;
        +
        +									// Support: Promises/A+ section 2.3.3.3.3
        +									// https://promisesaplus.com/#point-59
        +									// Ignore double-resolution attempts
        +									if ( depth < maxDepth ) {
        +										return;
        +									}
        +
        +									returned = handler.apply( that, args );
        +
        +									// Support: Promises/A+ section 2.3.1
        +									// https://promisesaplus.com/#point-48
        +									if ( returned === deferred.promise() ) {
        +										throw new TypeError( "Thenable self-resolution" );
        +									}
        +
        +									// Support: Promises/A+ sections 2.3.3.1, 3.5
        +									// https://promisesaplus.com/#point-54
        +									// https://promisesaplus.com/#point-75
        +									// Retrieve `then` only once
        +									then = returned &&
        +
        +										// Support: Promises/A+ section 2.3.4
        +										// https://promisesaplus.com/#point-64
        +										// Only check objects and functions for thenability
        +										( typeof returned === "object" ||
        +											typeof returned === "function" ) &&
        +										returned.then;
        +
        +									// Handle a returned thenable
        +									if ( jQuery.isFunction( then ) ) {
        +
        +										// Special processors (notify) just wait for resolution
        +										if ( special ) {
        +											then.call(
        +												returned,
        +												resolve( maxDepth, deferred, Identity, special ),
        +												resolve( maxDepth, deferred, Thrower, special )
        +											);
        +
        +										// Normal processors (resolve) also hook into progress
        +										} else {
        +
        +											// ...and disregard older resolution values
        +											maxDepth++;
        +
        +											then.call(
        +												returned,
        +												resolve( maxDepth, deferred, Identity, special ),
        +												resolve( maxDepth, deferred, Thrower, special ),
        +												resolve( maxDepth, deferred, Identity,
        +													deferred.notifyWith )
        +											);
        +										}
        +
        +									// Handle all other returned values
        +									} else {
        +
        +										// Only substitute handlers pass on context
        +										// and multiple values (non-spec behavior)
        +										if ( handler !== Identity ) {
        +											that = undefined;
        +											args = [ returned ];
        +										}
        +
        +										// Process the value(s)
        +										// Default process is resolve
        +										( special || deferred.resolveWith )( that, args );
        +									}
        +								},
        +
        +								// Only normal processors (resolve) catch and reject exceptions
        +								process = special ?
        +									mightThrow :
        +									function() {
        +										try {
        +											mightThrow();
        +										} catch ( e ) {
        +
        +											if ( jQuery.Deferred.exceptionHook ) {
        +												jQuery.Deferred.exceptionHook( e,
        +													process.stackTrace );
        +											}
        +
        +											// Support: Promises/A+ section 2.3.3.3.4.1
        +											// https://promisesaplus.com/#point-61
        +											// Ignore post-resolution exceptions
        +											if ( depth + 1 >= maxDepth ) {
        +
        +												// Only substitute handlers pass on context
        +												// and multiple values (non-spec behavior)
        +												if ( handler !== Thrower ) {
        +													that = undefined;
        +													args = [ e ];
        +												}
        +
        +												deferred.rejectWith( that, args );
        +											}
        +										}
        +									};
        +
        +							// Support: Promises/A+ section 2.3.3.3.1
        +							// https://promisesaplus.com/#point-57
        +							// Re-resolve promises immediately to dodge false rejection from
        +							// subsequent errors
        +							if ( depth ) {
        +								process();
        +							} else {
        +
        +								// Call an optional hook to record the stack, in case of exception
        +								// since it's otherwise lost when execution goes async
        +								if ( jQuery.Deferred.getStackHook ) {
        +									process.stackTrace = jQuery.Deferred.getStackHook();
        +								}
        +								window.setTimeout( process );
        +							}
        +						};
        +					}
        +
        +					return jQuery.Deferred( function( newDefer ) {
        +
        +						// progress_handlers.add( ... )
        +						tuples[ 0 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onProgress ) ?
        +									onProgress :
        +									Identity,
        +								newDefer.notifyWith
        +							)
        +						);
        +
        +						// fulfilled_handlers.add( ... )
        +						tuples[ 1 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onFulfilled ) ?
        +									onFulfilled :
        +									Identity
        +							)
        +						);
        +
        +						// rejected_handlers.add( ... )
        +						tuples[ 2 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onRejected ) ?
        +									onRejected :
        +									Thrower
        +							)
        +						);
        +					} ).promise();
        +				},
        +
        +				// Get a promise for this deferred
        +				// If obj is provided, the promise aspect is added to the object
        +				promise: function( obj ) {
        +					return obj != null ? jQuery.extend( obj, promise ) : promise;
        +				}
        +			},
        +			deferred = {};
        +
        +		// Add list-specific methods
        +		jQuery.each( tuples, function( i, tuple ) {
        +			var list = tuple[ 2 ],
        +				stateString = tuple[ 5 ];
        +
        +			// promise.progress = list.add
        +			// promise.done = list.add
        +			// promise.fail = list.add
        +			promise[ tuple[ 1 ] ] = list.add;
        +
        +			// Handle state
        +			if ( stateString ) {
        +				list.add(
        +					function() {
        +
        +						// state = "resolved" (i.e., fulfilled)
        +						// state = "rejected"
        +						state = stateString;
        +					},
        +
        +					// rejected_callbacks.disable
        +					// fulfilled_callbacks.disable
        +					tuples[ 3 - i ][ 2 ].disable,
        +
        +					// progress_callbacks.lock
        +					tuples[ 0 ][ 2 ].lock
        +				);
        +			}
        +
        +			// progress_handlers.fire
        +			// fulfilled_handlers.fire
        +			// rejected_handlers.fire
        +			list.add( tuple[ 3 ].fire );
        +
        +			// deferred.notify = function() { deferred.notifyWith(...) }
        +			// deferred.resolve = function() { deferred.resolveWith(...) }
        +			// deferred.reject = function() { deferred.rejectWith(...) }
        +			deferred[ tuple[ 0 ] ] = function() {
        +				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
        +				return this;
        +			};
        +
        +			// deferred.notifyWith = list.fireWith
        +			// deferred.resolveWith = list.fireWith
        +			// deferred.rejectWith = list.fireWith
        +			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
        +		} );
        +
        +		// Make the deferred a promise
        +		promise.promise( deferred );
        +
        +		// Call given func if any
        +		if ( func ) {
        +			func.call( deferred, deferred );
        +		}
        +
        +		// All done!
        +		return deferred;
        +	},
        +
        +	// Deferred helper
        +	when: function( singleValue ) {
        +		var
        +
        +			// count of uncompleted subordinates
        +			remaining = arguments.length,
        +
        +			// count of unprocessed arguments
        +			i = remaining,
        +
        +			// subordinate fulfillment data
        +			resolveContexts = Array( i ),
        +			resolveValues = slice.call( arguments ),
        +
        +			// the master Deferred
        +			master = jQuery.Deferred(),
        +
        +			// subordinate callback factory
        +			updateFunc = function( i ) {
        +				return function( value ) {
        +					resolveContexts[ i ] = this;
        +					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
        +					if ( !( --remaining ) ) {
        +						master.resolveWith( resolveContexts, resolveValues );
        +					}
        +				};
        +			};
        +
        +		// Single- and empty arguments are adopted like Promise.resolve
        +		if ( remaining <= 1 ) {
        +			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
        +
        +			// Use .then() to unwrap secondary thenables (cf. gh-3000)
        +			if ( master.state() === "pending" ||
        +				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
        +
        +				return master.then();
        +			}
        +		}
        +
        +		// Multiple arguments are aggregated like Promise.all array elements
        +		while ( i-- ) {
        +			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
        +		}
        +
        +		return master.promise();
        +	}
        +} );
        +
        +
        +// These usually indicate a programmer mistake during development,
        +// warn about them ASAP rather than swallowing them by default.
        +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
        +
        +jQuery.Deferred.exceptionHook = function( error, stack ) {
        +
        +	// Support: IE 8 - 9 only
        +	// Console exists when dev tools are open, which can happen at any time
        +	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
        +		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
        +	}
        +};
        +
        +
        +
        +
        +jQuery.readyException = function( error ) {
        +	window.setTimeout( function() {
        +		throw error;
        +	} );
        +};
        +
        +
        +
        +
        +// The deferred used on DOM ready
        +var readyList = jQuery.Deferred();
        +
        +jQuery.fn.ready = function( fn ) {
        +
        +	readyList
        +		.then( fn )
        +
        +		// Wrap jQuery.readyException in a function so that the lookup
        +		// happens at the time of error handling instead of callback
        +		// registration.
        +		.catch( function( error ) {
        +			jQuery.readyException( error );
        +		} );
        +
        +	return this;
        +};
        +
        +jQuery.extend( {
        +
        +	// Is the DOM ready to be used? Set to true once it occurs.
        +	isReady: false,
        +
        +	// A counter to track how many items to wait for before
        +	// the ready event fires. See #6781
        +	readyWait: 1,
        +
        +	// Hold (or release) the ready event
        +	holdReady: function( hold ) {
        +		if ( hold ) {
        +			jQuery.readyWait++;
        +		} else {
        +			jQuery.ready( true );
        +		}
        +	},
        +
        +	// Handle when the DOM is ready
        +	ready: function( wait ) {
        +
        +		// Abort if there are pending holds or we're already ready
        +		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
        +			return;
        +		}
        +
        +		// Remember that the DOM is ready
        +		jQuery.isReady = true;
        +
        +		// If a normal DOM Ready event fired, decrement, and wait if need be
        +		if ( wait !== true && --jQuery.readyWait > 0 ) {
        +			return;
        +		}
        +
        +		// If there are functions bound, to execute
        +		readyList.resolveWith( document, [ jQuery ] );
        +	}
        +} );
        +
        +jQuery.ready.then = readyList.then;
        +
        +// The ready event handler and self cleanup method
        +function completed() {
        +	document.removeEventListener( "DOMContentLoaded", completed );
        +	window.removeEventListener( "load", completed );
        +	jQuery.ready();
        +}
        +
        +// Catch cases where $(document).ready() is called
        +// after the browser event has already occurred.
        +// Support: IE <=9 - 10 only
        +// Older IE sometimes signals "interactive" too soon
        +if ( document.readyState === "complete" ||
        +	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
        +
        +	// Handle it asynchronously to allow scripts the opportunity to delay ready
        +	window.setTimeout( jQuery.ready );
        +
        +} else {
        +
        +	// Use the handy event callback
        +	document.addEventListener( "DOMContentLoaded", completed );
        +
        +	// A fallback to window.onload, that will always work
        +	window.addEventListener( "load", completed );
        +}
        +
        +
        +
        +
        +// Multifunctional method to get and set values of a collection
        +// The value/s can optionally be executed if it's a function
        +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
        +	var i = 0,
        +		len = elems.length,
        +		bulk = key == null;
        +
        +	// Sets many values
        +	if ( jQuery.type( key ) === "object" ) {
        +		chainable = true;
        +		for ( i in key ) {
        +			access( elems, fn, i, key[ i ], true, emptyGet, raw );
        +		}
        +
        +	// Sets one value
        +	} else if ( value !== undefined ) {
        +		chainable = true;
        +
        +		if ( !jQuery.isFunction( value ) ) {
        +			raw = true;
        +		}
        +
        +		if ( bulk ) {
        +
        +			// Bulk operations run against the entire set
        +			if ( raw ) {
        +				fn.call( elems, value );
        +				fn = null;
        +
        +			// ...except when executing function values
        +			} else {
        +				bulk = fn;
        +				fn = function( elem, key, value ) {
        +					return bulk.call( jQuery( elem ), value );
        +				};
        +			}
        +		}
        +
        +		if ( fn ) {
        +			for ( ; i < len; i++ ) {
        +				fn(
        +					elems[ i ], key, raw ?
        +					value :
        +					value.call( elems[ i ], i, fn( elems[ i ], key ) )
        +				);
        +			}
        +		}
        +	}
        +
        +	if ( chainable ) {
        +		return elems;
        +	}
        +
        +	// Gets
        +	if ( bulk ) {
        +		return fn.call( elems );
        +	}
        +
        +	return len ? fn( elems[ 0 ], key ) : emptyGet;
        +};
        +var acceptData = function( owner ) {
        +
        +	// Accepts only:
        +	//  - Node
        +	//    - Node.ELEMENT_NODE
        +	//    - Node.DOCUMENT_NODE
        +	//  - Object
        +	//    - Any
        +	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
        +};
        +
        +
        +
        +
        +function Data() {
        +	this.expando = jQuery.expando + Data.uid++;
        +}
        +
        +Data.uid = 1;
        +
        +Data.prototype = {
        +
        +	cache: function( owner ) {
        +
        +		// Check if the owner object already has a cache
        +		var value = owner[ this.expando ];
        +
        +		// If not, create one
        +		if ( !value ) {
        +			value = {};
        +
        +			// We can accept data for non-element nodes in modern browsers,
        +			// but we should not, see #8335.
        +			// Always return an empty object.
        +			if ( acceptData( owner ) ) {
        +
        +				// If it is a node unlikely to be stringify-ed or looped over
        +				// use plain assignment
        +				if ( owner.nodeType ) {
        +					owner[ this.expando ] = value;
        +
        +				// Otherwise secure it in a non-enumerable property
        +				// configurable must be true to allow the property to be
        +				// deleted when data is removed
        +				} else {
        +					Object.defineProperty( owner, this.expando, {
        +						value: value,
        +						configurable: true
        +					} );
        +				}
        +			}
        +		}
        +
        +		return value;
        +	},
        +	set: function( owner, data, value ) {
        +		var prop,
        +			cache = this.cache( owner );
        +
        +		// Handle: [ owner, key, value ] args
        +		// Always use camelCase key (gh-2257)
        +		if ( typeof data === "string" ) {
        +			cache[ jQuery.camelCase( data ) ] = value;
        +
        +		// Handle: [ owner, { properties } ] args
        +		} else {
        +
        +			// Copy the properties one-by-one to the cache object
        +			for ( prop in data ) {
        +				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
        +			}
        +		}
        +		return cache;
        +	},
        +	get: function( owner, key ) {
        +		return key === undefined ?
        +			this.cache( owner ) :
        +
        +			// Always use camelCase key (gh-2257)
        +			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
        +	},
        +	access: function( owner, key, value ) {
        +
        +		// In cases where either:
        +		//
        +		//   1. No key was specified
        +		//   2. A string key was specified, but no value provided
        +		//
        +		// Take the "read" path and allow the get method to determine
        +		// which value to return, respectively either:
        +		//
        +		//   1. The entire cache object
        +		//   2. The data stored at the key
        +		//
        +		if ( key === undefined ||
        +				( ( key && typeof key === "string" ) && value === undefined ) ) {
        +
        +			return this.get( owner, key );
        +		}
        +
        +		// When the key is not a string, or both a key and value
        +		// are specified, set or extend (existing objects) with either:
        +		//
        +		//   1. An object of properties
        +		//   2. A key and value
        +		//
        +		this.set( owner, key, value );
        +
        +		// Since the "set" path can have two possible entry points
        +		// return the expected data based on which path was taken[*]
        +		return value !== undefined ? value : key;
        +	},
        +	remove: function( owner, key ) {
        +		var i,
        +			cache = owner[ this.expando ];
        +
        +		if ( cache === undefined ) {
        +			return;
        +		}
        +
        +		if ( key !== undefined ) {
        +
        +			// Support array or space separated string of keys
        +			if ( jQuery.isArray( key ) ) {
        +
        +				// If key is an array of keys...
        +				// We always set camelCase keys, so remove that.
        +				key = key.map( jQuery.camelCase );
        +			} else {
        +				key = jQuery.camelCase( key );
        +
        +				// If a key with the spaces exists, use it.
        +				// Otherwise, create an array by matching non-whitespace
        +				key = key in cache ?
        +					[ key ] :
        +					( key.match( rnothtmlwhite ) || [] );
        +			}
        +
        +			i = key.length;
        +
        +			while ( i-- ) {
        +				delete cache[ key[ i ] ];
        +			}
        +		}
        +
        +		// Remove the expando if there's no more data
        +		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
        +
        +			// Support: Chrome <=35 - 45
        +			// Webkit & Blink performance suffers when deleting properties
        +			// from DOM nodes, so set to undefined instead
        +			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
        +			if ( owner.nodeType ) {
        +				owner[ this.expando ] = undefined;
        +			} else {
        +				delete owner[ this.expando ];
        +			}
        +		}
        +	},
        +	hasData: function( owner ) {
        +		var cache = owner[ this.expando ];
        +		return cache !== undefined && !jQuery.isEmptyObject( cache );
        +	}
        +};
        +var dataPriv = new Data();
        +
        +var dataUser = new Data();
        +
        +
        +
        +//	Implementation Summary
        +//
        +//	1. Enforce API surface and semantic compatibility with 1.9.x branch
        +//	2. Improve the module's maintainability by reducing the storage
        +//		paths to a single mechanism.
        +//	3. Use the same single mechanism to support "private" and "user" data.
        +//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
        +//	5. Avoid exposing implementation details on user objects (eg. expando properties)
        +//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
        +
        +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
        +	rmultiDash = /[A-Z]/g;
        +
        +function getData( data ) {
        +	if ( data === "true" ) {
        +		return true;
        +	}
        +
        +	if ( data === "false" ) {
        +		return false;
        +	}
        +
        +	if ( data === "null" ) {
        +		return null;
        +	}
        +
        +	// Only convert to a number if it doesn't change the string
        +	if ( data === +data + "" ) {
        +		return +data;
        +	}
        +
        +	if ( rbrace.test( data ) ) {
        +		return JSON.parse( data );
        +	}
        +
        +	return data;
        +}
        +
        +function dataAttr( elem, key, data ) {
        +	var name;
        +
        +	// If nothing was found internally, try to fetch any
        +	// data from the HTML5 data-* attribute
        +	if ( data === undefined && elem.nodeType === 1 ) {
        +		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
        +		data = elem.getAttribute( name );
        +
        +		if ( typeof data === "string" ) {
        +			try {
        +				data = getData( data );
        +			} catch ( e ) {}
        +
        +			// Make sure we set the data so it isn't changed later
        +			dataUser.set( elem, key, data );
        +		} else {
        +			data = undefined;
        +		}
        +	}
        +	return data;
        +}
        +
        +jQuery.extend( {
        +	hasData: function( elem ) {
        +		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
        +	},
        +
        +	data: function( elem, name, data ) {
        +		return dataUser.access( elem, name, data );
        +	},
        +
        +	removeData: function( elem, name ) {
        +		dataUser.remove( elem, name );
        +	},
        +
        +	// TODO: Now that all calls to _data and _removeData have been replaced
        +	// with direct calls to dataPriv methods, these can be deprecated.
        +	_data: function( elem, name, data ) {
        +		return dataPriv.access( elem, name, data );
        +	},
        +
        +	_removeData: function( elem, name ) {
        +		dataPriv.remove( elem, name );
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	data: function( key, value ) {
        +		var i, name, data,
        +			elem = this[ 0 ],
        +			attrs = elem && elem.attributes;
        +
        +		// Gets all values
        +		if ( key === undefined ) {
        +			if ( this.length ) {
        +				data = dataUser.get( elem );
        +
        +				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
        +					i = attrs.length;
        +					while ( i-- ) {
        +
        +						// Support: IE 11 only
        +						// The attrs elements can be null (#14894)
        +						if ( attrs[ i ] ) {
        +							name = attrs[ i ].name;
        +							if ( name.indexOf( "data-" ) === 0 ) {
        +								name = jQuery.camelCase( name.slice( 5 ) );
        +								dataAttr( elem, name, data[ name ] );
        +							}
        +						}
        +					}
        +					dataPriv.set( elem, "hasDataAttrs", true );
        +				}
        +			}
        +
        +			return data;
        +		}
        +
        +		// Sets multiple values
        +		if ( typeof key === "object" ) {
        +			return this.each( function() {
        +				dataUser.set( this, key );
        +			} );
        +		}
        +
        +		return access( this, function( value ) {
        +			var data;
        +
        +			// The calling jQuery object (element matches) is not empty
        +			// (and therefore has an element appears at this[ 0 ]) and the
        +			// `value` parameter was not undefined. An empty jQuery object
        +			// will result in `undefined` for elem = this[ 0 ] which will
        +			// throw an exception if an attempt to read a data cache is made.
        +			if ( elem && value === undefined ) {
        +
        +				// Attempt to get data from the cache
        +				// The key will always be camelCased in Data
        +				data = dataUser.get( elem, key );
        +				if ( data !== undefined ) {
        +					return data;
        +				}
        +
        +				// Attempt to "discover" the data in
        +				// HTML5 custom data-* attrs
        +				data = dataAttr( elem, key );
        +				if ( data !== undefined ) {
        +					return data;
        +				}
        +
        +				// We tried really hard, but the data doesn't exist.
        +				return;
        +			}
        +
        +			// Set the data...
        +			this.each( function() {
        +
        +				// We always store the camelCased key
        +				dataUser.set( this, key, value );
        +			} );
        +		}, null, value, arguments.length > 1, null, true );
        +	},
        +
        +	removeData: function( key ) {
        +		return this.each( function() {
        +			dataUser.remove( this, key );
        +		} );
        +	}
        +} );
        +
        +
        +jQuery.extend( {
        +	queue: function( elem, type, data ) {
        +		var queue;
        +
        +		if ( elem ) {
        +			type = ( type || "fx" ) + "queue";
        +			queue = dataPriv.get( elem, type );
        +
        +			// Speed up dequeue by getting out quickly if this is just a lookup
        +			if ( data ) {
        +				if ( !queue || jQuery.isArray( data ) ) {
        +					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
        +				} else {
        +					queue.push( data );
        +				}
        +			}
        +			return queue || [];
        +		}
        +	},
        +
        +	dequeue: function( elem, type ) {
        +		type = type || "fx";
        +
        +		var queue = jQuery.queue( elem, type ),
        +			startLength = queue.length,
        +			fn = queue.shift(),
        +			hooks = jQuery._queueHooks( elem, type ),
        +			next = function() {
        +				jQuery.dequeue( elem, type );
        +			};
        +
        +		// If the fx queue is dequeued, always remove the progress sentinel
        +		if ( fn === "inprogress" ) {
        +			fn = queue.shift();
        +			startLength--;
        +		}
        +
        +		if ( fn ) {
        +
        +			// Add a progress sentinel to prevent the fx queue from being
        +			// automatically dequeued
        +			if ( type === "fx" ) {
        +				queue.unshift( "inprogress" );
        +			}
        +
        +			// Clear up the last queue stop function
        +			delete hooks.stop;
        +			fn.call( elem, next, hooks );
        +		}
        +
        +		if ( !startLength && hooks ) {
        +			hooks.empty.fire();
        +		}
        +	},
        +
        +	// Not public - generate a queueHooks object, or return the current one
        +	_queueHooks: function( elem, type ) {
        +		var key = type + "queueHooks";
        +		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
        +			empty: jQuery.Callbacks( "once memory" ).add( function() {
        +				dataPriv.remove( elem, [ type + "queue", key ] );
        +			} )
        +		} );
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	queue: function( type, data ) {
        +		var setter = 2;
        +
        +		if ( typeof type !== "string" ) {
        +			data = type;
        +			type = "fx";
        +			setter--;
        +		}
        +
        +		if ( arguments.length < setter ) {
        +			return jQuery.queue( this[ 0 ], type );
        +		}
        +
        +		return data === undefined ?
        +			this :
        +			this.each( function() {
        +				var queue = jQuery.queue( this, type, data );
        +
        +				// Ensure a hooks for this queue
        +				jQuery._queueHooks( this, type );
        +
        +				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
        +					jQuery.dequeue( this, type );
        +				}
        +			} );
        +	},
        +	dequeue: function( type ) {
        +		return this.each( function() {
        +			jQuery.dequeue( this, type );
        +		} );
        +	},
        +	clearQueue: function( type ) {
        +		return this.queue( type || "fx", [] );
        +	},
        +
        +	// Get a promise resolved when queues of a certain type
        +	// are emptied (fx is the type by default)
        +	promise: function( type, obj ) {
        +		var tmp,
        +			count = 1,
        +			defer = jQuery.Deferred(),
        +			elements = this,
        +			i = this.length,
        +			resolve = function() {
        +				if ( !( --count ) ) {
        +					defer.resolveWith( elements, [ elements ] );
        +				}
        +			};
        +
        +		if ( typeof type !== "string" ) {
        +			obj = type;
        +			type = undefined;
        +		}
        +		type = type || "fx";
        +
        +		while ( i-- ) {
        +			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
        +			if ( tmp && tmp.empty ) {
        +				count++;
        +				tmp.empty.add( resolve );
        +			}
        +		}
        +		resolve();
        +		return defer.promise( obj );
        +	}
        +} );
        +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
        +
        +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
        +
        +
        +var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
        +
        +var isHiddenWithinTree = function( elem, el ) {
        +
        +		// isHiddenWithinTree might be called from jQuery#filter function;
        +		// in that case, element will be second argument
        +		elem = el || elem;
        +
        +		// Inline style trumps all
        +		return elem.style.display === "none" ||
        +			elem.style.display === "" &&
        +
        +			// Otherwise, check computed style
        +			// Support: Firefox <=43 - 45
        +			// Disconnected elements can have computed display: none, so first confirm that elem is
        +			// in the document.
        +			jQuery.contains( elem.ownerDocument, elem ) &&
        +
        +			jQuery.css( elem, "display" ) === "none";
        +	};
        +
        +var swap = function( elem, options, callback, args ) {
        +	var ret, name,
        +		old = {};
        +
        +	// Remember the old values, and insert the new ones
        +	for ( name in options ) {
        +		old[ name ] = elem.style[ name ];
        +		elem.style[ name ] = options[ name ];
        +	}
        +
        +	ret = callback.apply( elem, args || [] );
        +
        +	// Revert the old values
        +	for ( name in options ) {
        +		elem.style[ name ] = old[ name ];
        +	}
        +
        +	return ret;
        +};
        +
        +
        +
        +
        +function adjustCSS( elem, prop, valueParts, tween ) {
        +	var adjusted,
        +		scale = 1,
        +		maxIterations = 20,
        +		currentValue = tween ?
        +			function() {
        +				return tween.cur();
        +			} :
        +			function() {
        +				return jQuery.css( elem, prop, "" );
        +			},
        +		initial = currentValue(),
        +		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
        +
        +		// Starting value computation is required for potential unit mismatches
        +		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
        +			rcssNum.exec( jQuery.css( elem, prop ) );
        +
        +	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
        +
        +		// Trust units reported by jQuery.css
        +		unit = unit || initialInUnit[ 3 ];
        +
        +		// Make sure we update the tween properties later on
        +		valueParts = valueParts || [];
        +
        +		// Iteratively approximate from a nonzero starting point
        +		initialInUnit = +initial || 1;
        +
        +		do {
        +
        +			// If previous iteration zeroed out, double until we get *something*.
        +			// Use string for doubling so we don't accidentally see scale as unchanged below
        +			scale = scale || ".5";
        +
        +			// Adjust and apply
        +			initialInUnit = initialInUnit / scale;
        +			jQuery.style( elem, prop, initialInUnit + unit );
        +
        +		// Update scale, tolerating zero or NaN from tween.cur()
        +		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
        +		} while (
        +			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
        +		);
        +	}
        +
        +	if ( valueParts ) {
        +		initialInUnit = +initialInUnit || +initial || 0;
        +
        +		// Apply relative offset (+=/-=) if specified
        +		adjusted = valueParts[ 1 ] ?
        +			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
        +			+valueParts[ 2 ];
        +		if ( tween ) {
        +			tween.unit = unit;
        +			tween.start = initialInUnit;
        +			tween.end = adjusted;
        +		}
        +	}
        +	return adjusted;
        +}
        +
        +
        +var defaultDisplayMap = {};
        +
        +function getDefaultDisplay( elem ) {
        +	var temp,
        +		doc = elem.ownerDocument,
        +		nodeName = elem.nodeName,
        +		display = defaultDisplayMap[ nodeName ];
        +
        +	if ( display ) {
        +		return display;
        +	}
        +
        +	temp = doc.body.appendChild( doc.createElement( nodeName ) );
        +	display = jQuery.css( temp, "display" );
        +
        +	temp.parentNode.removeChild( temp );
        +
        +	if ( display === "none" ) {
        +		display = "block";
        +	}
        +	defaultDisplayMap[ nodeName ] = display;
        +
        +	return display;
        +}
        +
        +function showHide( elements, show ) {
        +	var display, elem,
        +		values = [],
        +		index = 0,
        +		length = elements.length;
        +
        +	// Determine new display value for elements that need to change
        +	for ( ; index < length; index++ ) {
        +		elem = elements[ index ];
        +		if ( !elem.style ) {
        +			continue;
        +		}
        +
        +		display = elem.style.display;
        +		if ( show ) {
        +
        +			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
        +			// check is required in this first loop unless we have a nonempty display value (either
        +			// inline or about-to-be-restored)
        +			if ( display === "none" ) {
        +				values[ index ] = dataPriv.get( elem, "display" ) || null;
        +				if ( !values[ index ] ) {
        +					elem.style.display = "";
        +				}
        +			}
        +			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
        +				values[ index ] = getDefaultDisplay( elem );
        +			}
        +		} else {
        +			if ( display !== "none" ) {
        +				values[ index ] = "none";
        +
        +				// Remember what we're overwriting
        +				dataPriv.set( elem, "display", display );
        +			}
        +		}
        +	}
        +
        +	// Set the display of the elements in a second loop to avoid constant reflow
        +	for ( index = 0; index < length; index++ ) {
        +		if ( values[ index ] != null ) {
        +			elements[ index ].style.display = values[ index ];
        +		}
        +	}
        +
        +	return elements;
        +}
        +
        +jQuery.fn.extend( {
        +	show: function() {
        +		return showHide( this, true );
        +	},
        +	hide: function() {
        +		return showHide( this );
        +	},
        +	toggle: function( state ) {
        +		if ( typeof state === "boolean" ) {
        +			return state ? this.show() : this.hide();
        +		}
        +
        +		return this.each( function() {
        +			if ( isHiddenWithinTree( this ) ) {
        +				jQuery( this ).show();
        +			} else {
        +				jQuery( this ).hide();
        +			}
        +		} );
        +	}
        +} );
        +var rcheckableType = ( /^(?:checkbox|radio)$/i );
        +
        +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
        +
        +var rscriptType = ( /^$|\/(?:java|ecma)script/i );
        +
        +
        +
        +// We have to close these tags to support XHTML (#13200)
        +var wrapMap = {
        +
        +	// Support: IE <=9 only
        +	option: [ 1, "<select multiple='multiple'>", "</select>" ],
        +
        +	// XHTML parsers do not magically insert elements in the
        +	// same way that tag soup parsers do. So we cannot shorten
        +	// this by omitting <tbody> or other required elements.
        +	thead: [ 1, "<table>", "</table>" ],
        +	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
        +	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
        +	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
        +
        +	_default: [ 0, "", "" ]
        +};
        +
        +// Support: IE <=9 only
        +wrapMap.optgroup = wrapMap.option;
        +
        +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
        +wrapMap.th = wrapMap.td;
        +
        +
        +function getAll( context, tag ) {
        +
        +	// Support: IE <=9 - 11 only
        +	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
        +	var ret;
        +
        +	if ( typeof context.getElementsByTagName !== "undefined" ) {
        +		ret = context.getElementsByTagName( tag || "*" );
        +
        +	} else if ( typeof context.querySelectorAll !== "undefined" ) {
        +		ret = context.querySelectorAll( tag || "*" );
        +
        +	} else {
        +		ret = [];
        +	}
        +
        +	if ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) {
        +		return jQuery.merge( [ context ], ret );
        +	}
        +
        +	return ret;
        +}
        +
        +
        +// Mark scripts as having already been evaluated
        +function setGlobalEval( elems, refElements ) {
        +	var i = 0,
        +		l = elems.length;
        +
        +	for ( ; i < l; i++ ) {
        +		dataPriv.set(
        +			elems[ i ],
        +			"globalEval",
        +			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
        +		);
        +	}
        +}
        +
        +
        +var rhtml = /<|&#?\w+;/;
        +
        +function buildFragment( elems, context, scripts, selection, ignored ) {
        +	var elem, tmp, tag, wrap, contains, j,
        +		fragment = context.createDocumentFragment(),
        +		nodes = [],
        +		i = 0,
        +		l = elems.length;
        +
        +	for ( ; i < l; i++ ) {
        +		elem = elems[ i ];
        +
        +		if ( elem || elem === 0 ) {
        +
        +			// Add nodes directly
        +			if ( jQuery.type( elem ) === "object" ) {
        +
        +				// Support: Android <=4.0 only, PhantomJS 1 only
        +				// push.apply(_, arraylike) throws on ancient WebKit
        +				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
        +
        +			// Convert non-html into a text node
        +			} else if ( !rhtml.test( elem ) ) {
        +				nodes.push( context.createTextNode( elem ) );
        +
        +			// Convert html into DOM nodes
        +			} else {
        +				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
        +
        +				// Deserialize a standard representation
        +				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
        +				wrap = wrapMap[ tag ] || wrapMap._default;
        +				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
        +
        +				// Descend through wrappers to the right content
        +				j = wrap[ 0 ];
        +				while ( j-- ) {
        +					tmp = tmp.lastChild;
        +				}
        +
        +				// Support: Android <=4.0 only, PhantomJS 1 only
        +				// push.apply(_, arraylike) throws on ancient WebKit
        +				jQuery.merge( nodes, tmp.childNodes );
        +
        +				// Remember the top-level container
        +				tmp = fragment.firstChild;
        +
        +				// Ensure the created nodes are orphaned (#12392)
        +				tmp.textContent = "";
        +			}
        +		}
        +	}
        +
        +	// Remove wrapper from fragment
        +	fragment.textContent = "";
        +
        +	i = 0;
        +	while ( ( elem = nodes[ i++ ] ) ) {
        +
        +		// Skip elements already in the context collection (trac-4087)
        +		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
        +			if ( ignored ) {
        +				ignored.push( elem );
        +			}
        +			continue;
        +		}
        +
        +		contains = jQuery.contains( elem.ownerDocument, elem );
        +
        +		// Append to fragment
        +		tmp = getAll( fragment.appendChild( elem ), "script" );
        +
        +		// Preserve script evaluation history
        +		if ( contains ) {
        +			setGlobalEval( tmp );
        +		}
        +
        +		// Capture executables
        +		if ( scripts ) {
        +			j = 0;
        +			while ( ( elem = tmp[ j++ ] ) ) {
        +				if ( rscriptType.test( elem.type || "" ) ) {
        +					scripts.push( elem );
        +				}
        +			}
        +		}
        +	}
        +
        +	return fragment;
        +}
        +
        +
        +( function() {
        +	var fragment = document.createDocumentFragment(),
        +		div = fragment.appendChild( document.createElement( "div" ) ),
        +		input = document.createElement( "input" );
        +
        +	// Support: Android 4.0 - 4.3 only
        +	// Check state lost if the name is set (#11217)
        +	// Support: Windows Web Apps (WWA)
        +	// `name` and `type` must use .setAttribute for WWA (#14901)
        +	input.setAttribute( "type", "radio" );
        +	input.setAttribute( "checked", "checked" );
        +	input.setAttribute( "name", "t" );
        +
        +	div.appendChild( input );
        +
        +	// Support: Android <=4.1 only
        +	// Older WebKit doesn't clone checked state correctly in fragments
        +	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
        +
        +	// Support: IE <=11 only
        +	// Make sure textarea (and checkbox) defaultValue is properly cloned
        +	div.innerHTML = "<textarea>x</textarea>";
        +	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
        +} )();
        +var documentElement = document.documentElement;
        +
        +
        +
        +var
        +	rkeyEvent = /^key/,
        +	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
        +	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
        +
        +function returnTrue() {
        +	return true;
        +}
        +
        +function returnFalse() {
        +	return false;
        +}
        +
        +// Support: IE <=9 only
        +// See #13393 for more info
        +function safeActiveElement() {
        +	try {
        +		return document.activeElement;
        +	} catch ( err ) { }
        +}
        +
        +function on( elem, types, selector, data, fn, one ) {
        +	var origFn, type;
        +
        +	// Types can be a map of types/handlers
        +	if ( typeof types === "object" ) {
        +
        +		// ( types-Object, selector, data )
        +		if ( typeof selector !== "string" ) {
        +
        +			// ( types-Object, data )
        +			data = data || selector;
        +			selector = undefined;
        +		}
        +		for ( type in types ) {
        +			on( elem, type, selector, data, types[ type ], one );
        +		}
        +		return elem;
        +	}
        +
        +	if ( data == null && fn == null ) {
        +
        +		// ( types, fn )
        +		fn = selector;
        +		data = selector = undefined;
        +	} else if ( fn == null ) {
        +		if ( typeof selector === "string" ) {
        +
        +			// ( types, selector, fn )
        +			fn = data;
        +			data = undefined;
        +		} else {
        +
        +			// ( types, data, fn )
        +			fn = data;
        +			data = selector;
        +			selector = undefined;
        +		}
        +	}
        +	if ( fn === false ) {
        +		fn = returnFalse;
        +	} else if ( !fn ) {
        +		return elem;
        +	}
        +
        +	if ( one === 1 ) {
        +		origFn = fn;
        +		fn = function( event ) {
        +
        +			// Can use an empty set, since event contains the info
        +			jQuery().off( event );
        +			return origFn.apply( this, arguments );
        +		};
        +
        +		// Use same guid so caller can remove using origFn
        +		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        +	}
        +	return elem.each( function() {
        +		jQuery.event.add( this, types, fn, data, selector );
        +	} );
        +}
        +
        +/*
        + * Helper functions for managing events -- not part of the public interface.
        + * Props to Dean Edwards' addEvent library for many of the ideas.
        + */
        +jQuery.event = {
        +
        +	global: {},
        +
        +	add: function( elem, types, handler, data, selector ) {
        +
        +		var handleObjIn, eventHandle, tmp,
        +			events, t, handleObj,
        +			special, handlers, type, namespaces, origType,
        +			elemData = dataPriv.get( elem );
        +
        +		// Don't attach events to noData or text/comment nodes (but allow plain objects)
        +		if ( !elemData ) {
        +			return;
        +		}
        +
        +		// Caller can pass in an object of custom data in lieu of the handler
        +		if ( handler.handler ) {
        +			handleObjIn = handler;
        +			handler = handleObjIn.handler;
        +			selector = handleObjIn.selector;
        +		}
        +
        +		// Ensure that invalid selectors throw exceptions at attach time
        +		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
        +		if ( selector ) {
        +			jQuery.find.matchesSelector( documentElement, selector );
        +		}
        +
        +		// Make sure that the handler has a unique ID, used to find/remove it later
        +		if ( !handler.guid ) {
        +			handler.guid = jQuery.guid++;
        +		}
        +
        +		// Init the element's event structure and main handler, if this is the first
        +		if ( !( events = elemData.events ) ) {
        +			events = elemData.events = {};
        +		}
        +		if ( !( eventHandle = elemData.handle ) ) {
        +			eventHandle = elemData.handle = function( e ) {
        +
        +				// Discard the second event of a jQuery.event.trigger() and
        +				// when an event is called after a page has unloaded
        +				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
        +					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
        +			};
        +		}
        +
        +		// Handle multiple events separated by a space
        +		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
        +		t = types.length;
        +		while ( t-- ) {
        +			tmp = rtypenamespace.exec( types[ t ] ) || [];
        +			type = origType = tmp[ 1 ];
        +			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
        +
        +			// There *must* be a type, no attaching namespace-only handlers
        +			if ( !type ) {
        +				continue;
        +			}
        +
        +			// If event changes its type, use the special event handlers for the changed type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// If selector defined, determine special event api type, otherwise given type
        +			type = ( selector ? special.delegateType : special.bindType ) || type;
        +
        +			// Update special based on newly reset type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// handleObj is passed to all event handlers
        +			handleObj = jQuery.extend( {
        +				type: type,
        +				origType: origType,
        +				data: data,
        +				handler: handler,
        +				guid: handler.guid,
        +				selector: selector,
        +				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
        +				namespace: namespaces.join( "." )
        +			}, handleObjIn );
        +
        +			// Init the event handler queue if we're the first
        +			if ( !( handlers = events[ type ] ) ) {
        +				handlers = events[ type ] = [];
        +				handlers.delegateCount = 0;
        +
        +				// Only use addEventListener if the special events handler returns false
        +				if ( !special.setup ||
        +					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        +
        +					if ( elem.addEventListener ) {
        +						elem.addEventListener( type, eventHandle );
        +					}
        +				}
        +			}
        +
        +			if ( special.add ) {
        +				special.add.call( elem, handleObj );
        +
        +				if ( !handleObj.handler.guid ) {
        +					handleObj.handler.guid = handler.guid;
        +				}
        +			}
        +
        +			// Add to the element's handler list, delegates in front
        +			if ( selector ) {
        +				handlers.splice( handlers.delegateCount++, 0, handleObj );
        +			} else {
        +				handlers.push( handleObj );
        +			}
        +
        +			// Keep track of which events have ever been used, for event optimization
        +			jQuery.event.global[ type ] = true;
        +		}
        +
        +	},
        +
        +	// Detach an event or set of events from an element
        +	remove: function( elem, types, handler, selector, mappedTypes ) {
        +
        +		var j, origCount, tmp,
        +			events, t, handleObj,
        +			special, handlers, type, namespaces, origType,
        +			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
        +
        +		if ( !elemData || !( events = elemData.events ) ) {
        +			return;
        +		}
        +
        +		// Once for each type.namespace in types; type may be omitted
        +		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
        +		t = types.length;
        +		while ( t-- ) {
        +			tmp = rtypenamespace.exec( types[ t ] ) || [];
        +			type = origType = tmp[ 1 ];
        +			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
        +
        +			// Unbind all events (on this namespace, if provided) for the element
        +			if ( !type ) {
        +				for ( type in events ) {
        +					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
        +				}
        +				continue;
        +			}
        +
        +			special = jQuery.event.special[ type ] || {};
        +			type = ( selector ? special.delegateType : special.bindType ) || type;
        +			handlers = events[ type ] || [];
        +			tmp = tmp[ 2 ] &&
        +				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
        +
        +			// Remove matching events
        +			origCount = j = handlers.length;
        +			while ( j-- ) {
        +				handleObj = handlers[ j ];
        +
        +				if ( ( mappedTypes || origType === handleObj.origType ) &&
        +					( !handler || handler.guid === handleObj.guid ) &&
        +					( !tmp || tmp.test( handleObj.namespace ) ) &&
        +					( !selector || selector === handleObj.selector ||
        +						selector === "**" && handleObj.selector ) ) {
        +					handlers.splice( j, 1 );
        +
        +					if ( handleObj.selector ) {
        +						handlers.delegateCount--;
        +					}
        +					if ( special.remove ) {
        +						special.remove.call( elem, handleObj );
        +					}
        +				}
        +			}
        +
        +			// Remove generic event handler if we removed something and no more handlers exist
        +			// (avoids potential for endless recursion during removal of special event handlers)
        +			if ( origCount && !handlers.length ) {
        +				if ( !special.teardown ||
        +					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
        +
        +					jQuery.removeEvent( elem, type, elemData.handle );
        +				}
        +
        +				delete events[ type ];
        +			}
        +		}
        +
        +		// Remove data and the expando if it's no longer used
        +		if ( jQuery.isEmptyObject( events ) ) {
        +			dataPriv.remove( elem, "handle events" );
        +		}
        +	},
        +
        +	dispatch: function( nativeEvent ) {
        +
        +		// Make a writable jQuery.Event from the native event object
        +		var event = jQuery.event.fix( nativeEvent );
        +
        +		var i, j, ret, matched, handleObj, handlerQueue,
        +			args = new Array( arguments.length ),
        +			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
        +			special = jQuery.event.special[ event.type ] || {};
        +
        +		// Use the fix-ed jQuery.Event rather than the (read-only) native event
        +		args[ 0 ] = event;
        +
        +		for ( i = 1; i < arguments.length; i++ ) {
        +			args[ i ] = arguments[ i ];
        +		}
        +
        +		event.delegateTarget = this;
        +
        +		// Call the preDispatch hook for the mapped type, and let it bail if desired
        +		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
        +			return;
        +		}
        +
        +		// Determine handlers
        +		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
        +
        +		// Run delegates first; they may want to stop propagation beneath us
        +		i = 0;
        +		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
        +			event.currentTarget = matched.elem;
        +
        +			j = 0;
        +			while ( ( handleObj = matched.handlers[ j++ ] ) &&
        +				!event.isImmediatePropagationStopped() ) {
        +
        +				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
        +				// a subset or equal to those in the bound event (both can have no namespace).
        +				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
        +
        +					event.handleObj = handleObj;
        +					event.data = handleObj.data;
        +
        +					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
        +						handleObj.handler ).apply( matched.elem, args );
        +
        +					if ( ret !== undefined ) {
        +						if ( ( event.result = ret ) === false ) {
        +							event.preventDefault();
        +							event.stopPropagation();
        +						}
        +					}
        +				}
        +			}
        +		}
        +
        +		// Call the postDispatch hook for the mapped type
        +		if ( special.postDispatch ) {
        +			special.postDispatch.call( this, event );
        +		}
        +
        +		return event.result;
        +	},
        +
        +	handlers: function( event, handlers ) {
        +		var i, handleObj, sel, matchedHandlers, matchedSelectors,
        +			handlerQueue = [],
        +			delegateCount = handlers.delegateCount,
        +			cur = event.target;
        +
        +		// Find delegate handlers
        +		if ( delegateCount &&
        +
        +			// Support: IE <=9
        +			// Black-hole SVG <use> instance trees (trac-13180)
        +			cur.nodeType &&
        +
        +			// Support: Firefox <=42
        +			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
        +			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
        +			// Support: IE 11 only
        +			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
        +			!( event.type === "click" && event.button >= 1 ) ) {
        +
        +			for ( ; cur !== this; cur = cur.parentNode || this ) {
        +
        +				// Don't check non-elements (#13208)
        +				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
        +				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
        +					matchedHandlers = [];
        +					matchedSelectors = {};
        +					for ( i = 0; i < delegateCount; i++ ) {
        +						handleObj = handlers[ i ];
        +
        +						// Don't conflict with Object.prototype properties (#13203)
        +						sel = handleObj.selector + " ";
        +
        +						if ( matchedSelectors[ sel ] === undefined ) {
        +							matchedSelectors[ sel ] = handleObj.needsContext ?
        +								jQuery( sel, this ).index( cur ) > -1 :
        +								jQuery.find( sel, this, null, [ cur ] ).length;
        +						}
        +						if ( matchedSelectors[ sel ] ) {
        +							matchedHandlers.push( handleObj );
        +						}
        +					}
        +					if ( matchedHandlers.length ) {
        +						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
        +					}
        +				}
        +			}
        +		}
        +
        +		// Add the remaining (directly-bound) handlers
        +		cur = this;
        +		if ( delegateCount < handlers.length ) {
        +			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
        +		}
        +
        +		return handlerQueue;
        +	},
        +
        +	addProp: function( name, hook ) {
        +		Object.defineProperty( jQuery.Event.prototype, name, {
        +			enumerable: true,
        +			configurable: true,
        +
        +			get: jQuery.isFunction( hook ) ?
        +				function() {
        +					if ( this.originalEvent ) {
        +							return hook( this.originalEvent );
        +					}
        +				} :
        +				function() {
        +					if ( this.originalEvent ) {
        +							return this.originalEvent[ name ];
        +					}
        +				},
        +
        +			set: function( value ) {
        +				Object.defineProperty( this, name, {
        +					enumerable: true,
        +					configurable: true,
        +					writable: true,
        +					value: value
        +				} );
        +			}
        +		} );
        +	},
        +
        +	fix: function( originalEvent ) {
        +		return originalEvent[ jQuery.expando ] ?
        +			originalEvent :
        +			new jQuery.Event( originalEvent );
        +	},
        +
        +	special: {
        +		load: {
        +
        +			// Prevent triggered image.load events from bubbling to window.load
        +			noBubble: true
        +		},
        +		focus: {
        +
        +			// Fire native event if possible so blur/focus sequence is correct
        +			trigger: function() {
        +				if ( this !== safeActiveElement() && this.focus ) {
        +					this.focus();
        +					return false;
        +				}
        +			},
        +			delegateType: "focusin"
        +		},
        +		blur: {
        +			trigger: function() {
        +				if ( this === safeActiveElement() && this.blur ) {
        +					this.blur();
        +					return false;
        +				}
        +			},
        +			delegateType: "focusout"
        +		},
        +		click: {
        +
        +			// For checkbox, fire native event so checked state will be right
        +			trigger: function() {
        +				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
        +					this.click();
        +					return false;
        +				}
        +			},
        +
        +			// For cross-browser consistency, don't fire native .click() on links
        +			_default: function( event ) {
        +				return jQuery.nodeName( event.target, "a" );
        +			}
        +		},
        +
        +		beforeunload: {
        +			postDispatch: function( event ) {
        +
        +				// Support: Firefox 20+
        +				// Firefox doesn't alert if the returnValue field is not set.
        +				if ( event.result !== undefined && event.originalEvent ) {
        +					event.originalEvent.returnValue = event.result;
        +				}
        +			}
        +		}
        +	}
        +};
        +
        +jQuery.removeEvent = function( elem, type, handle ) {
        +
        +	// This "if" is needed for plain objects
        +	if ( elem.removeEventListener ) {
        +		elem.removeEventListener( type, handle );
        +	}
        +};
        +
        +jQuery.Event = function( src, props ) {
        +
        +	// Allow instantiation without the 'new' keyword
        +	if ( !( this instanceof jQuery.Event ) ) {
        +		return new jQuery.Event( src, props );
        +	}
        +
        +	// Event object
        +	if ( src && src.type ) {
        +		this.originalEvent = src;
        +		this.type = src.type;
        +
        +		// Events bubbling up the document may have been marked as prevented
        +		// by a handler lower down the tree; reflect the correct value.
        +		this.isDefaultPrevented = src.defaultPrevented ||
        +				src.defaultPrevented === undefined &&
        +
        +				// Support: Android <=2.3 only
        +				src.returnValue === false ?
        +			returnTrue :
        +			returnFalse;
        +
        +		// Create target properties
        +		// Support: Safari <=6 - 7 only
        +		// Target should not be a text node (#504, #13143)
        +		this.target = ( src.target && src.target.nodeType === 3 ) ?
        +			src.target.parentNode :
        +			src.target;
        +
        +		this.currentTarget = src.currentTarget;
        +		this.relatedTarget = src.relatedTarget;
        +
        +	// Event type
        +	} else {
        +		this.type = src;
        +	}
        +
        +	// Put explicitly provided properties onto the event object
        +	if ( props ) {
        +		jQuery.extend( this, props );
        +	}
        +
        +	// Create a timestamp if incoming event doesn't have one
        +	this.timeStamp = src && src.timeStamp || jQuery.now();
        +
        +	// Mark it as fixed
        +	this[ jQuery.expando ] = true;
        +};
        +
        +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
        +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
        +jQuery.Event.prototype = {
        +	constructor: jQuery.Event,
        +	isDefaultPrevented: returnFalse,
        +	isPropagationStopped: returnFalse,
        +	isImmediatePropagationStopped: returnFalse,
        +	isSimulated: false,
        +
        +	preventDefault: function() {
        +		var e = this.originalEvent;
        +
        +		this.isDefaultPrevented = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.preventDefault();
        +		}
        +	},
        +	stopPropagation: function() {
        +		var e = this.originalEvent;
        +
        +		this.isPropagationStopped = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.stopPropagation();
        +		}
        +	},
        +	stopImmediatePropagation: function() {
        +		var e = this.originalEvent;
        +
        +		this.isImmediatePropagationStopped = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.stopImmediatePropagation();
        +		}
        +
        +		this.stopPropagation();
        +	}
        +};
        +
        +// Includes all common event props including KeyEvent and MouseEvent specific props
        +jQuery.each( {
        +	altKey: true,
        +	bubbles: true,
        +	cancelable: true,
        +	changedTouches: true,
        +	ctrlKey: true,
        +	detail: true,
        +	eventPhase: true,
        +	metaKey: true,
        +	pageX: true,
        +	pageY: true,
        +	shiftKey: true,
        +	view: true,
        +	"char": true,
        +	charCode: true,
        +	key: true,
        +	keyCode: true,
        +	button: true,
        +	buttons: true,
        +	clientX: true,
        +	clientY: true,
        +	offsetX: true,
        +	offsetY: true,
        +	pointerId: true,
        +	pointerType: true,
        +	screenX: true,
        +	screenY: true,
        +	targetTouches: true,
        +	toElement: true,
        +	touches: true,
        +
        +	which: function( event ) {
        +		var button = event.button;
        +
        +		// Add which for key events
        +		if ( event.which == null && rkeyEvent.test( event.type ) ) {
        +			return event.charCode != null ? event.charCode : event.keyCode;
        +		}
        +
        +		// Add which for click: 1 === left; 2 === middle; 3 === right
        +		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
        +			if ( button & 1 ) {
        +				return 1;
        +			}
        +
        +			if ( button & 2 ) {
        +				return 3;
        +			}
        +
        +			if ( button & 4 ) {
        +				return 2;
        +			}
        +
        +			return 0;
        +		}
        +
        +		return event.which;
        +	}
        +}, jQuery.event.addProp );
        +
        +// Create mouseenter/leave events using mouseover/out and event-time checks
        +// so that event delegation works in jQuery.
        +// Do the same for pointerenter/pointerleave and pointerover/pointerout
        +//
        +// Support: Safari 7 only
        +// Safari sends mouseenter too often; see:
        +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
        +// for the description of the bug (it existed in older Chrome versions as well).
        +jQuery.each( {
        +	mouseenter: "mouseover",
        +	mouseleave: "mouseout",
        +	pointerenter: "pointerover",
        +	pointerleave: "pointerout"
        +}, function( orig, fix ) {
        +	jQuery.event.special[ orig ] = {
        +		delegateType: fix,
        +		bindType: fix,
        +
        +		handle: function( event ) {
        +			var ret,
        +				target = this,
        +				related = event.relatedTarget,
        +				handleObj = event.handleObj;
        +
        +			// For mouseenter/leave call the handler if related is outside the target.
        +			// NB: No relatedTarget if the mouse left/entered the browser window
        +			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
        +				event.type = handleObj.origType;
        +				ret = handleObj.handler.apply( this, arguments );
        +				event.type = fix;
        +			}
        +			return ret;
        +		}
        +	};
        +} );
        +
        +jQuery.fn.extend( {
        +
        +	on: function( types, selector, data, fn ) {
        +		return on( this, types, selector, data, fn );
        +	},
        +	one: function( types, selector, data, fn ) {
        +		return on( this, types, selector, data, fn, 1 );
        +	},
        +	off: function( types, selector, fn ) {
        +		var handleObj, type;
        +		if ( types && types.preventDefault && types.handleObj ) {
        +
        +			// ( event )  dispatched jQuery.Event
        +			handleObj = types.handleObj;
        +			jQuery( types.delegateTarget ).off(
        +				handleObj.namespace ?
        +					handleObj.origType + "." + handleObj.namespace :
        +					handleObj.origType,
        +				handleObj.selector,
        +				handleObj.handler
        +			);
        +			return this;
        +		}
        +		if ( typeof types === "object" ) {
        +
        +			// ( types-object [, selector] )
        +			for ( type in types ) {
        +				this.off( type, selector, types[ type ] );
        +			}
        +			return this;
        +		}
        +		if ( selector === false || typeof selector === "function" ) {
        +
        +			// ( types [, fn] )
        +			fn = selector;
        +			selector = undefined;
        +		}
        +		if ( fn === false ) {
        +			fn = returnFalse;
        +		}
        +		return this.each( function() {
        +			jQuery.event.remove( this, types, fn, selector );
        +		} );
        +	}
        +} );
        +
        +
        +var
        +
        +	/* eslint-disable max-len */
        +
        +	// See https://github.com/eslint/eslint/issues/3229
        +	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
        +
        +	/* eslint-enable */
        +
        +	// Support: IE <=10 - 11, Edge 12 - 13
        +	// In IE/Edge using regex groups here causes severe slowdowns.
        +	// See https://connect.microsoft.com/IE/feedback/details/1736512/
        +	rnoInnerhtml = /<script|<style|<link/i,
        +
        +	// checked="checked" or checked
        +	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        +	rscriptTypeMasked = /^true\/(.*)/,
        +	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
        +
        +function manipulationTarget( elem, content ) {
        +	if ( jQuery.nodeName( elem, "table" ) &&
        +		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
        +
        +		return elem.getElementsByTagName( "tbody" )[ 0 ] || elem;
        +	}
        +
        +	return elem;
        +}
        +
        +// Replace/restore the type attribute of script elements for safe DOM manipulation
        +function disableScript( elem ) {
        +	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
        +	return elem;
        +}
        +function restoreScript( elem ) {
        +	var match = rscriptTypeMasked.exec( elem.type );
        +
        +	if ( match ) {
        +		elem.type = match[ 1 ];
        +	} else {
        +		elem.removeAttribute( "type" );
        +	}
        +
        +	return elem;
        +}
        +
        +function cloneCopyEvent( src, dest ) {
        +	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
        +
        +	if ( dest.nodeType !== 1 ) {
        +		return;
        +	}
        +
        +	// 1. Copy private data: events, handlers, etc.
        +	if ( dataPriv.hasData( src ) ) {
        +		pdataOld = dataPriv.access( src );
        +		pdataCur = dataPriv.set( dest, pdataOld );
        +		events = pdataOld.events;
        +
        +		if ( events ) {
        +			delete pdataCur.handle;
        +			pdataCur.events = {};
        +
        +			for ( type in events ) {
        +				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
        +					jQuery.event.add( dest, type, events[ type ][ i ] );
        +				}
        +			}
        +		}
        +	}
        +
        +	// 2. Copy user data
        +	if ( dataUser.hasData( src ) ) {
        +		udataOld = dataUser.access( src );
        +		udataCur = jQuery.extend( {}, udataOld );
        +
        +		dataUser.set( dest, udataCur );
        +	}
        +}
        +
        +// Fix IE bugs, see support tests
        +function fixInput( src, dest ) {
        +	var nodeName = dest.nodeName.toLowerCase();
        +
        +	// Fails to persist the checked state of a cloned checkbox or radio button.
        +	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
        +		dest.checked = src.checked;
        +
        +	// Fails to return the selected option to the default selected state when cloning options
        +	} else if ( nodeName === "input" || nodeName === "textarea" ) {
        +		dest.defaultValue = src.defaultValue;
        +	}
        +}
        +
        +function domManip( collection, args, callback, ignored ) {
        +
        +	// Flatten any nested arrays
        +	args = concat.apply( [], args );
        +
        +	var fragment, first, scripts, hasScripts, node, doc,
        +		i = 0,
        +		l = collection.length,
        +		iNoClone = l - 1,
        +		value = args[ 0 ],
        +		isFunction = jQuery.isFunction( value );
        +
        +	// We can't cloneNode fragments that contain checked, in WebKit
        +	if ( isFunction ||
        +			( l > 1 && typeof value === "string" &&
        +				!support.checkClone && rchecked.test( value ) ) ) {
        +		return collection.each( function( index ) {
        +			var self = collection.eq( index );
        +			if ( isFunction ) {
        +				args[ 0 ] = value.call( this, index, self.html() );
        +			}
        +			domManip( self, args, callback, ignored );
        +		} );
        +	}
        +
        +	if ( l ) {
        +		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
        +		first = fragment.firstChild;
        +
        +		if ( fragment.childNodes.length === 1 ) {
        +			fragment = first;
        +		}
        +
        +		// Require either new content or an interest in ignored elements to invoke the callback
        +		if ( first || ignored ) {
        +			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
        +			hasScripts = scripts.length;
        +
        +			// Use the original fragment for the last item
        +			// instead of the first because it can end up
        +			// being emptied incorrectly in certain situations (#8070).
        +			for ( ; i < l; i++ ) {
        +				node = fragment;
        +
        +				if ( i !== iNoClone ) {
        +					node = jQuery.clone( node, true, true );
        +
        +					// Keep references to cloned scripts for later restoration
        +					if ( hasScripts ) {
        +
        +						// Support: Android <=4.0 only, PhantomJS 1 only
        +						// push.apply(_, arraylike) throws on ancient WebKit
        +						jQuery.merge( scripts, getAll( node, "script" ) );
        +					}
        +				}
        +
        +				callback.call( collection[ i ], node, i );
        +			}
        +
        +			if ( hasScripts ) {
        +				doc = scripts[ scripts.length - 1 ].ownerDocument;
        +
        +				// Reenable scripts
        +				jQuery.map( scripts, restoreScript );
        +
        +				// Evaluate executable scripts on first document insertion
        +				for ( i = 0; i < hasScripts; i++ ) {
        +					node = scripts[ i ];
        +					if ( rscriptType.test( node.type || "" ) &&
        +						!dataPriv.access( node, "globalEval" ) &&
        +						jQuery.contains( doc, node ) ) {
        +
        +						if ( node.src ) {
        +
        +							// Optional AJAX dependency, but won't run scripts if not present
        +							if ( jQuery._evalUrl ) {
        +								jQuery._evalUrl( node.src );
        +							}
        +						} else {
        +							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	return collection;
        +}
        +
        +function remove( elem, selector, keepData ) {
        +	var node,
        +		nodes = selector ? jQuery.filter( selector, elem ) : elem,
        +		i = 0;
        +
        +	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
        +		if ( !keepData && node.nodeType === 1 ) {
        +			jQuery.cleanData( getAll( node ) );
        +		}
        +
        +		if ( node.parentNode ) {
        +			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
        +				setGlobalEval( getAll( node, "script" ) );
        +			}
        +			node.parentNode.removeChild( node );
        +		}
        +	}
        +
        +	return elem;
        +}
        +
        +jQuery.extend( {
        +	htmlPrefilter: function( html ) {
        +		return html.replace( rxhtmlTag, "<$1></$2>" );
        +	},
        +
        +	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
        +		var i, l, srcElements, destElements,
        +			clone = elem.cloneNode( true ),
        +			inPage = jQuery.contains( elem.ownerDocument, elem );
        +
        +		// Fix IE cloning issues
        +		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
        +				!jQuery.isXMLDoc( elem ) ) {
        +
        +			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
        +			destElements = getAll( clone );
        +			srcElements = getAll( elem );
        +
        +			for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +				fixInput( srcElements[ i ], destElements[ i ] );
        +			}
        +		}
        +
        +		// Copy the events from the original to the clone
        +		if ( dataAndEvents ) {
        +			if ( deepDataAndEvents ) {
        +				srcElements = srcElements || getAll( elem );
        +				destElements = destElements || getAll( clone );
        +
        +				for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
        +				}
        +			} else {
        +				cloneCopyEvent( elem, clone );
        +			}
        +		}
        +
        +		// Preserve script evaluation history
        +		destElements = getAll( clone, "script" );
        +		if ( destElements.length > 0 ) {
        +			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
        +		}
        +
        +		// Return the cloned set
        +		return clone;
        +	},
        +
        +	cleanData: function( elems ) {
        +		var data, elem, type,
        +			special = jQuery.event.special,
        +			i = 0;
        +
        +		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
        +			if ( acceptData( elem ) ) {
        +				if ( ( data = elem[ dataPriv.expando ] ) ) {
        +					if ( data.events ) {
        +						for ( type in data.events ) {
        +							if ( special[ type ] ) {
        +								jQuery.event.remove( elem, type );
        +
        +							// This is a shortcut to avoid jQuery.event.remove's overhead
        +							} else {
        +								jQuery.removeEvent( elem, type, data.handle );
        +							}
        +						}
        +					}
        +
        +					// Support: Chrome <=35 - 45+
        +					// Assign undefined instead of using delete, see Data#remove
        +					elem[ dataPriv.expando ] = undefined;
        +				}
        +				if ( elem[ dataUser.expando ] ) {
        +
        +					// Support: Chrome <=35 - 45+
        +					// Assign undefined instead of using delete, see Data#remove
        +					elem[ dataUser.expando ] = undefined;
        +				}
        +			}
        +		}
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	detach: function( selector ) {
        +		return remove( this, selector, true );
        +	},
        +
        +	remove: function( selector ) {
        +		return remove( this, selector );
        +	},
        +
        +	text: function( value ) {
        +		return access( this, function( value ) {
        +			return value === undefined ?
        +				jQuery.text( this ) :
        +				this.empty().each( function() {
        +					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +						this.textContent = value;
        +					}
        +				} );
        +		}, null, value, arguments.length );
        +	},
        +
        +	append: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +				var target = manipulationTarget( this, elem );
        +				target.appendChild( elem );
        +			}
        +		} );
        +	},
        +
        +	prepend: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +				var target = manipulationTarget( this, elem );
        +				target.insertBefore( elem, target.firstChild );
        +			}
        +		} );
        +	},
        +
        +	before: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.parentNode ) {
        +				this.parentNode.insertBefore( elem, this );
        +			}
        +		} );
        +	},
        +
        +	after: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.parentNode ) {
        +				this.parentNode.insertBefore( elem, this.nextSibling );
        +			}
        +		} );
        +	},
        +
        +	empty: function() {
        +		var elem,
        +			i = 0;
        +
        +		for ( ; ( elem = this[ i ] ) != null; i++ ) {
        +			if ( elem.nodeType === 1 ) {
        +
        +				// Prevent memory leaks
        +				jQuery.cleanData( getAll( elem, false ) );
        +
        +				// Remove any remaining nodes
        +				elem.textContent = "";
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	clone: function( dataAndEvents, deepDataAndEvents ) {
        +		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
        +		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
        +
        +		return this.map( function() {
        +			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
        +		} );
        +	},
        +
        +	html: function( value ) {
        +		return access( this, function( value ) {
        +			var elem = this[ 0 ] || {},
        +				i = 0,
        +				l = this.length;
        +
        +			if ( value === undefined && elem.nodeType === 1 ) {
        +				return elem.innerHTML;
        +			}
        +
        +			// See if we can take a shortcut and just use innerHTML
        +			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        +				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
        +
        +				value = jQuery.htmlPrefilter( value );
        +
        +				try {
        +					for ( ; i < l; i++ ) {
        +						elem = this[ i ] || {};
        +
        +						// Remove element nodes and prevent memory leaks
        +						if ( elem.nodeType === 1 ) {
        +							jQuery.cleanData( getAll( elem, false ) );
        +							elem.innerHTML = value;
        +						}
        +					}
        +
        +					elem = 0;
        +
        +				// If using innerHTML throws an exception, use the fallback method
        +				} catch ( e ) {}
        +			}
        +
        +			if ( elem ) {
        +				this.empty().append( value );
        +			}
        +		}, null, value, arguments.length );
        +	},
        +
        +	replaceWith: function() {
        +		var ignored = [];
        +
        +		// Make the changes, replacing each non-ignored context element with the new content
        +		return domManip( this, arguments, function( elem ) {
        +			var parent = this.parentNode;
        +
        +			if ( jQuery.inArray( this, ignored ) < 0 ) {
        +				jQuery.cleanData( getAll( this ) );
        +				if ( parent ) {
        +					parent.replaceChild( elem, this );
        +				}
        +			}
        +
        +		// Force callback invocation
        +		}, ignored );
        +	}
        +} );
        +
        +jQuery.each( {
        +	appendTo: "append",
        +	prependTo: "prepend",
        +	insertBefore: "before",
        +	insertAfter: "after",
        +	replaceAll: "replaceWith"
        +}, function( name, original ) {
        +	jQuery.fn[ name ] = function( selector ) {
        +		var elems,
        +			ret = [],
        +			insert = jQuery( selector ),
        +			last = insert.length - 1,
        +			i = 0;
        +
        +		for ( ; i <= last; i++ ) {
        +			elems = i === last ? this : this.clone( true );
        +			jQuery( insert[ i ] )[ original ]( elems );
        +
        +			// Support: Android <=4.0 only, PhantomJS 1 only
        +			// .get() because push.apply(_, arraylike) throws on ancient WebKit
        +			push.apply( ret, elems.get() );
        +		}
        +
        +		return this.pushStack( ret );
        +	};
        +} );
        +var rmargin = ( /^margin/ );
        +
        +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
        +
        +var getStyles = function( elem ) {
        +
        +		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
        +		// IE throws on elements created in popups
        +		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
        +		var view = elem.ownerDocument.defaultView;
        +
        +		if ( !view || !view.opener ) {
        +			view = window;
        +		}
        +
        +		return view.getComputedStyle( elem );
        +	};
        +
        +
        +
        +( function() {
        +
        +	// Executing both pixelPosition & boxSizingReliable tests require only one layout
        +	// so they're executed at the same time to save the second computation.
        +	function computeStyleTests() {
        +
        +		// This is a singleton, we need to execute it only once
        +		if ( !div ) {
        +			return;
        +		}
        +
        +		div.style.cssText =
        +			"box-sizing:border-box;" +
        +			"position:relative;display:block;" +
        +			"margin:auto;border:1px;padding:1px;" +
        +			"top:1%;width:50%";
        +		div.innerHTML = "";
        +		documentElement.appendChild( container );
        +
        +		var divStyle = window.getComputedStyle( div );
        +		pixelPositionVal = divStyle.top !== "1%";
        +
        +		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
        +		reliableMarginLeftVal = divStyle.marginLeft === "2px";
        +		boxSizingReliableVal = divStyle.width === "4px";
        +
        +		// Support: Android 4.0 - 4.3 only
        +		// Some styles come back with percentage values, even though they shouldn't
        +		div.style.marginRight = "50%";
        +		pixelMarginRightVal = divStyle.marginRight === "4px";
        +
        +		documentElement.removeChild( container );
        +
        +		// Nullify the div so it wouldn't be stored in the memory and
        +		// it will also be a sign that checks already performed
        +		div = null;
        +	}
        +
        +	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
        +		container = document.createElement( "div" ),
        +		div = document.createElement( "div" );
        +
        +	// Finish early in limited (non-browser) environments
        +	if ( !div.style ) {
        +		return;
        +	}
        +
        +	// Support: IE <=9 - 11 only
        +	// Style of cloned element affects source element cloned (#8908)
        +	div.style.backgroundClip = "content-box";
        +	div.cloneNode( true ).style.backgroundClip = "";
        +	support.clearCloneStyle = div.style.backgroundClip === "content-box";
        +
        +	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
        +		"padding:0;margin-top:1px;position:absolute";
        +	container.appendChild( div );
        +
        +	jQuery.extend( support, {
        +		pixelPosition: function() {
        +			computeStyleTests();
        +			return pixelPositionVal;
        +		},
        +		boxSizingReliable: function() {
        +			computeStyleTests();
        +			return boxSizingReliableVal;
        +		},
        +		pixelMarginRight: function() {
        +			computeStyleTests();
        +			return pixelMarginRightVal;
        +		},
        +		reliableMarginLeft: function() {
        +			computeStyleTests();
        +			return reliableMarginLeftVal;
        +		}
        +	} );
        +} )();
        +
        +
        +function curCSS( elem, name, computed ) {
        +	var width, minWidth, maxWidth, ret,
        +		style = elem.style;
        +
        +	computed = computed || getStyles( elem );
        +
        +	// Support: IE <=9 only
        +	// getPropertyValue is only needed for .css('filter') (#12537)
        +	if ( computed ) {
        +		ret = computed.getPropertyValue( name ) || computed[ name ];
        +
        +		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
        +			ret = jQuery.style( elem, name );
        +		}
        +
        +		// A tribute to the "awesome hack by Dean Edwards"
        +		// Android Browser returns percentage for some values,
        +		// but width seems to be reliably pixels.
        +		// This is against the CSSOM draft spec:
        +		// https://drafts.csswg.org/cssom/#resolved-values
        +		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
        +
        +			// Remember the original values
        +			width = style.width;
        +			minWidth = style.minWidth;
        +			maxWidth = style.maxWidth;
        +
        +			// Put in the new values to get a computed value out
        +			style.minWidth = style.maxWidth = style.width = ret;
        +			ret = computed.width;
        +
        +			// Revert the changed values
        +			style.width = width;
        +			style.minWidth = minWidth;
        +			style.maxWidth = maxWidth;
        +		}
        +	}
        +
        +	return ret !== undefined ?
        +
        +		// Support: IE <=9 - 11 only
        +		// IE returns zIndex value as an integer.
        +		ret + "" :
        +		ret;
        +}
        +
        +
        +function addGetHookIf( conditionFn, hookFn ) {
        +
        +	// Define the hook, we'll check on the first run if it's really needed.
        +	return {
        +		get: function() {
        +			if ( conditionFn() ) {
        +
        +				// Hook not needed (or it's not possible to use it due
        +				// to missing dependency), remove it.
        +				delete this.get;
        +				return;
        +			}
        +
        +			// Hook needed; redefine it so that the support test is not executed again.
        +			return ( this.get = hookFn ).apply( this, arguments );
        +		}
        +	};
        +}
        +
        +
        +var
        +
        +	// Swappable if display is none or starts with table
        +	// except "table", "table-cell", or "table-caption"
        +	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        +	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
        +	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        +	cssNormalTransform = {
        +		letterSpacing: "0",
        +		fontWeight: "400"
        +	},
        +
        +	cssPrefixes = [ "Webkit", "Moz", "ms" ],
        +	emptyStyle = document.createElement( "div" ).style;
        +
        +// Return a css property mapped to a potentially vendor prefixed property
        +function vendorPropName( name ) {
        +
        +	// Shortcut for names that are not vendor prefixed
        +	if ( name in emptyStyle ) {
        +		return name;
        +	}
        +
        +	// Check for vendor prefixed names
        +	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
        +		i = cssPrefixes.length;
        +
        +	while ( i-- ) {
        +		name = cssPrefixes[ i ] + capName;
        +		if ( name in emptyStyle ) {
        +			return name;
        +		}
        +	}
        +}
        +
        +function setPositiveNumber( elem, value, subtract ) {
        +
        +	// Any relative (+/-) values have already been
        +	// normalized at this point
        +	var matches = rcssNum.exec( value );
        +	return matches ?
        +
        +		// Guard against undefined "subtract", e.g., when used as in cssHooks
        +		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
        +		value;
        +}
        +
        +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
        +	var i,
        +		val = 0;
        +
        +	// If we already have the right measurement, avoid augmentation
        +	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
        +		i = 4;
        +
        +	// Otherwise initialize for horizontal or vertical properties
        +	} else {
        +		i = name === "width" ? 1 : 0;
        +	}
        +
        +	for ( ; i < 4; i += 2 ) {
        +
        +		// Both box models exclude margin, so add it if we want it
        +		if ( extra === "margin" ) {
        +			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
        +		}
        +
        +		if ( isBorderBox ) {
        +
        +			// border-box includes padding, so remove it if we want content
        +			if ( extra === "content" ) {
        +				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +			}
        +
        +			// At this point, extra isn't border nor margin, so remove border
        +			if ( extra !== "margin" ) {
        +				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +			}
        +		} else {
        +
        +			// At this point, extra isn't content, so add padding
        +			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +
        +			// At this point, extra isn't content nor padding, so add border
        +			if ( extra !== "padding" ) {
        +				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +			}
        +		}
        +	}
        +
        +	return val;
        +}
        +
        +function getWidthOrHeight( elem, name, extra ) {
        +
        +	// Start with offset property, which is equivalent to the border-box value
        +	var val,
        +		valueIsBorderBox = true,
        +		styles = getStyles( elem ),
        +		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
        +
        +	// Support: IE <=11 only
        +	// Running getBoundingClientRect on a disconnected node
        +	// in IE throws an error.
        +	if ( elem.getClientRects().length ) {
        +		val = elem.getBoundingClientRect()[ name ];
        +	}
        +
        +	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
        +	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        +	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        +	if ( val <= 0 || val == null ) {
        +
        +		// Fall back to computed then uncomputed css if necessary
        +		val = curCSS( elem, name, styles );
        +		if ( val < 0 || val == null ) {
        +			val = elem.style[ name ];
        +		}
        +
        +		// Computed unit is not pixels. Stop here and return.
        +		if ( rnumnonpx.test( val ) ) {
        +			return val;
        +		}
        +
        +		// Check for style in case a browser which returns unreliable values
        +		// for getComputedStyle silently falls back to the reliable elem.style
        +		valueIsBorderBox = isBorderBox &&
        +			( support.boxSizingReliable() || val === elem.style[ name ] );
        +
        +		// Normalize "", auto, and prepare for extra
        +		val = parseFloat( val ) || 0;
        +	}
        +
        +	// Use the active box-sizing model to add/subtract irrelevant styles
        +	return ( val +
        +		augmentWidthOrHeight(
        +			elem,
        +			name,
        +			extra || ( isBorderBox ? "border" : "content" ),
        +			valueIsBorderBox,
        +			styles
        +		)
        +	) + "px";
        +}
        +
        +jQuery.extend( {
        +
        +	// Add in style property hooks for overriding the default
        +	// behavior of getting and setting a style property
        +	cssHooks: {
        +		opacity: {
        +			get: function( elem, computed ) {
        +				if ( computed ) {
        +
        +					// We should always get a number back from opacity
        +					var ret = curCSS( elem, "opacity" );
        +					return ret === "" ? "1" : ret;
        +				}
        +			}
        +		}
        +	},
        +
        +	// Don't automatically add "px" to these possibly-unitless properties
        +	cssNumber: {
        +		"animationIterationCount": true,
        +		"columnCount": true,
        +		"fillOpacity": true,
        +		"flexGrow": true,
        +		"flexShrink": true,
        +		"fontWeight": true,
        +		"lineHeight": true,
        +		"opacity": true,
        +		"order": true,
        +		"orphans": true,
        +		"widows": true,
        +		"zIndex": true,
        +		"zoom": true
        +	},
        +
        +	// Add in properties whose names you wish to fix before
        +	// setting or getting the value
        +	cssProps: {
        +		"float": "cssFloat"
        +	},
        +
        +	// Get and set the style property on a DOM Node
        +	style: function( elem, name, value, extra ) {
        +
        +		// Don't set styles on text and comment nodes
        +		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        +			return;
        +		}
        +
        +		// Make sure that we're working with the right name
        +		var ret, type, hooks,
        +			origName = jQuery.camelCase( name ),
        +			style = elem.style;
        +
        +		name = jQuery.cssProps[ origName ] ||
        +			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
        +
        +		// Gets hook for the prefixed version, then unprefixed version
        +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +		// Check if we're setting a value
        +		if ( value !== undefined ) {
        +			type = typeof value;
        +
        +			// Convert "+=" or "-=" to relative numbers (#7345)
        +			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
        +				value = adjustCSS( elem, name, ret );
        +
        +				// Fixes bug #9237
        +				type = "number";
        +			}
        +
        +			// Make sure that null and NaN values aren't set (#7116)
        +			if ( value == null || value !== value ) {
        +				return;
        +			}
        +
        +			// If a number was passed in, add the unit (except for certain CSS properties)
        +			if ( type === "number" ) {
        +				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
        +			}
        +
        +			// background-* props affect original clone's values
        +			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
        +				style[ name ] = "inherit";
        +			}
        +
        +			// If a hook was provided, use that value, otherwise just set the specified value
        +			if ( !hooks || !( "set" in hooks ) ||
        +				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
        +
        +				style[ name ] = value;
        +			}
        +
        +		} else {
        +
        +			// If a hook was provided get the non-computed value from there
        +			if ( hooks && "get" in hooks &&
        +				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
        +
        +				return ret;
        +			}
        +
        +			// Otherwise just get the value from the style object
        +			return style[ name ];
        +		}
        +	},
        +
        +	css: function( elem, name, extra, styles ) {
        +		var val, num, hooks,
        +			origName = jQuery.camelCase( name );
        +
        +		// Make sure that we're working with the right name
        +		name = jQuery.cssProps[ origName ] ||
        +			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
        +
        +		// Try prefixed name followed by the unprefixed name
        +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +		// If a hook was provided get the computed value from there
        +		if ( hooks && "get" in hooks ) {
        +			val = hooks.get( elem, true, extra );
        +		}
        +
        +		// Otherwise, if a way to get the computed value exists, use that
        +		if ( val === undefined ) {
        +			val = curCSS( elem, name, styles );
        +		}
        +
        +		// Convert "normal" to computed value
        +		if ( val === "normal" && name in cssNormalTransform ) {
        +			val = cssNormalTransform[ name ];
        +		}
        +
        +		// Make numeric if forced or a qualifier was provided and val looks numeric
        +		if ( extra === "" || extra ) {
        +			num = parseFloat( val );
        +			return extra === true || isFinite( num ) ? num || 0 : val;
        +		}
        +		return val;
        +	}
        +} );
        +
        +jQuery.each( [ "height", "width" ], function( i, name ) {
        +	jQuery.cssHooks[ name ] = {
        +		get: function( elem, computed, extra ) {
        +			if ( computed ) {
        +
        +				// Certain elements can have dimension info if we invisibly show them
        +				// but it must have a current display style that would benefit
        +				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
        +
        +					// Support: Safari 8+
        +					// Table columns in Safari have non-zero offsetWidth & zero
        +					// getBoundingClientRect().width unless display is changed.
        +					// Support: IE <=11 only
        +					// Running getBoundingClientRect on a disconnected node
        +					// in IE throws an error.
        +					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
        +						swap( elem, cssShow, function() {
        +							return getWidthOrHeight( elem, name, extra );
        +						} ) :
        +						getWidthOrHeight( elem, name, extra );
        +			}
        +		},
        +
        +		set: function( elem, value, extra ) {
        +			var matches,
        +				styles = extra && getStyles( elem ),
        +				subtract = extra && augmentWidthOrHeight(
        +					elem,
        +					name,
        +					extra,
        +					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
        +					styles
        +				);
        +
        +			// Convert to pixels if value adjustment is needed
        +			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
        +				( matches[ 3 ] || "px" ) !== "px" ) {
        +
        +				elem.style[ name ] = value;
        +				value = jQuery.css( elem, name );
        +			}
        +
        +			return setPositiveNumber( elem, value, subtract );
        +		}
        +	};
        +} );
        +
        +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
        +	function( elem, computed ) {
        +		if ( computed ) {
        +			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
        +				elem.getBoundingClientRect().left -
        +					swap( elem, { marginLeft: 0 }, function() {
        +						return elem.getBoundingClientRect().left;
        +					} )
        +				) + "px";
        +		}
        +	}
        +);
        +
        +// These hooks are used by animate to expand properties
        +jQuery.each( {
        +	margin: "",
        +	padding: "",
        +	border: "Width"
        +}, function( prefix, suffix ) {
        +	jQuery.cssHooks[ prefix + suffix ] = {
        +		expand: function( value ) {
        +			var i = 0,
        +				expanded = {},
        +
        +				// Assumes a single number if not a string
        +				parts = typeof value === "string" ? value.split( " " ) : [ value ];
        +
        +			for ( ; i < 4; i++ ) {
        +				expanded[ prefix + cssExpand[ i ] + suffix ] =
        +					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
        +			}
        +
        +			return expanded;
        +		}
        +	};
        +
        +	if ( !rmargin.test( prefix ) ) {
        +		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	css: function( name, value ) {
        +		return access( this, function( elem, name, value ) {
        +			var styles, len,
        +				map = {},
        +				i = 0;
        +
        +			if ( jQuery.isArray( name ) ) {
        +				styles = getStyles( elem );
        +				len = name.length;
        +
        +				for ( ; i < len; i++ ) {
        +					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
        +				}
        +
        +				return map;
        +			}
        +
        +			return value !== undefined ?
        +				jQuery.style( elem, name, value ) :
        +				jQuery.css( elem, name );
        +		}, name, value, arguments.length > 1 );
        +	}
        +} );
        +
        +
        +function Tween( elem, options, prop, end, easing ) {
        +	return new Tween.prototype.init( elem, options, prop, end, easing );
        +}
        +jQuery.Tween = Tween;
        +
        +Tween.prototype = {
        +	constructor: Tween,
        +	init: function( elem, options, prop, end, easing, unit ) {
        +		this.elem = elem;
        +		this.prop = prop;
        +		this.easing = easing || jQuery.easing._default;
        +		this.options = options;
        +		this.start = this.now = this.cur();
        +		this.end = end;
        +		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        +	},
        +	cur: function() {
        +		var hooks = Tween.propHooks[ this.prop ];
        +
        +		return hooks && hooks.get ?
        +			hooks.get( this ) :
        +			Tween.propHooks._default.get( this );
        +	},
        +	run: function( percent ) {
        +		var eased,
        +			hooks = Tween.propHooks[ this.prop ];
        +
        +		if ( this.options.duration ) {
        +			this.pos = eased = jQuery.easing[ this.easing ](
        +				percent, this.options.duration * percent, 0, 1, this.options.duration
        +			);
        +		} else {
        +			this.pos = eased = percent;
        +		}
        +		this.now = ( this.end - this.start ) * eased + this.start;
        +
        +		if ( this.options.step ) {
        +			this.options.step.call( this.elem, this.now, this );
        +		}
        +
        +		if ( hooks && hooks.set ) {
        +			hooks.set( this );
        +		} else {
        +			Tween.propHooks._default.set( this );
        +		}
        +		return this;
        +	}
        +};
        +
        +Tween.prototype.init.prototype = Tween.prototype;
        +
        +Tween.propHooks = {
        +	_default: {
        +		get: function( tween ) {
        +			var result;
        +
        +			// Use a property on the element directly when it is not a DOM element,
        +			// or when there is no matching style property that exists.
        +			if ( tween.elem.nodeType !== 1 ||
        +				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
        +				return tween.elem[ tween.prop ];
        +			}
        +
        +			// Passing an empty string as a 3rd parameter to .css will automatically
        +			// attempt a parseFloat and fallback to a string if the parse fails.
        +			// Simple values such as "10px" are parsed to Float;
        +			// complex values such as "rotate(1rad)" are returned as-is.
        +			result = jQuery.css( tween.elem, tween.prop, "" );
        +
        +			// Empty strings, null, undefined and "auto" are converted to 0.
        +			return !result || result === "auto" ? 0 : result;
        +		},
        +		set: function( tween ) {
        +
        +			// Use step hook for back compat.
        +			// Use cssHook if its there.
        +			// Use .style if available and use plain properties where available.
        +			if ( jQuery.fx.step[ tween.prop ] ) {
        +				jQuery.fx.step[ tween.prop ]( tween );
        +			} else if ( tween.elem.nodeType === 1 &&
        +				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
        +					jQuery.cssHooks[ tween.prop ] ) ) {
        +				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
        +			} else {
        +				tween.elem[ tween.prop ] = tween.now;
        +			}
        +		}
        +	}
        +};
        +
        +// Support: IE <=9 only
        +// Panic based approach to setting things on disconnected nodes
        +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
        +	set: function( tween ) {
        +		if ( tween.elem.nodeType && tween.elem.parentNode ) {
        +			tween.elem[ tween.prop ] = tween.now;
        +		}
        +	}
        +};
        +
        +jQuery.easing = {
        +	linear: function( p ) {
        +		return p;
        +	},
        +	swing: function( p ) {
        +		return 0.5 - Math.cos( p * Math.PI ) / 2;
        +	},
        +	_default: "swing"
        +};
        +
        +jQuery.fx = Tween.prototype.init;
        +
        +// Back compat <1.8 extension point
        +jQuery.fx.step = {};
        +
        +
        +
        +
        +var
        +	fxNow, timerId,
        +	rfxtypes = /^(?:toggle|show|hide)$/,
        +	rrun = /queueHooks$/;
        +
        +function raf() {
        +	if ( timerId ) {
        +		window.requestAnimationFrame( raf );
        +		jQuery.fx.tick();
        +	}
        +}
        +
        +// Animations created synchronously will run synchronously
        +function createFxNow() {
        +	window.setTimeout( function() {
        +		fxNow = undefined;
        +	} );
        +	return ( fxNow = jQuery.now() );
        +}
        +
        +// Generate parameters to create a standard animation
        +function genFx( type, includeWidth ) {
        +	var which,
        +		i = 0,
        +		attrs = { height: type };
        +
        +	// If we include width, step value is 1 to do all cssExpand values,
        +	// otherwise step value is 2 to skip over Left and Right
        +	includeWidth = includeWidth ? 1 : 0;
        +	for ( ; i < 4; i += 2 - includeWidth ) {
        +		which = cssExpand[ i ];
        +		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
        +	}
        +
        +	if ( includeWidth ) {
        +		attrs.opacity = attrs.width = type;
        +	}
        +
        +	return attrs;
        +}
        +
        +function createTween( value, prop, animation ) {
        +	var tween,
        +		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
        +		index = 0,
        +		length = collection.length;
        +	for ( ; index < length; index++ ) {
        +		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
        +
        +			// We're done with this property
        +			return tween;
        +		}
        +	}
        +}
        +
        +function defaultPrefilter( elem, props, opts ) {
        +	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
        +		isBox = "width" in props || "height" in props,
        +		anim = this,
        +		orig = {},
        +		style = elem.style,
        +		hidden = elem.nodeType && isHiddenWithinTree( elem ),
        +		dataShow = dataPriv.get( elem, "fxshow" );
        +
        +	// Queue-skipping animations hijack the fx hooks
        +	if ( !opts.queue ) {
        +		hooks = jQuery._queueHooks( elem, "fx" );
        +		if ( hooks.unqueued == null ) {
        +			hooks.unqueued = 0;
        +			oldfire = hooks.empty.fire;
        +			hooks.empty.fire = function() {
        +				if ( !hooks.unqueued ) {
        +					oldfire();
        +				}
        +			};
        +		}
        +		hooks.unqueued++;
        +
        +		anim.always( function() {
        +
        +			// Ensure the complete handler is called before this completes
        +			anim.always( function() {
        +				hooks.unqueued--;
        +				if ( !jQuery.queue( elem, "fx" ).length ) {
        +					hooks.empty.fire();
        +				}
        +			} );
        +		} );
        +	}
        +
        +	// Detect show/hide animations
        +	for ( prop in props ) {
        +		value = props[ prop ];
        +		if ( rfxtypes.test( value ) ) {
        +			delete props[ prop ];
        +			toggle = toggle || value === "toggle";
        +			if ( value === ( hidden ? "hide" : "show" ) ) {
        +
        +				// Pretend to be hidden if this is a "show" and
        +				// there is still data from a stopped show/hide
        +				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
        +					hidden = true;
        +
        +				// Ignore all other no-op show/hide data
        +				} else {
        +					continue;
        +				}
        +			}
        +			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
        +		}
        +	}
        +
        +	// Bail out if this is a no-op like .hide().hide()
        +	propTween = !jQuery.isEmptyObject( props );
        +	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
        +		return;
        +	}
        +
        +	// Restrict "overflow" and "display" styles during box animations
        +	if ( isBox && elem.nodeType === 1 ) {
        +
        +		// Support: IE <=9 - 11, Edge 12 - 13
        +		// Record all 3 overflow attributes because IE does not infer the shorthand
        +		// from identically-valued overflowX and overflowY
        +		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
        +
        +		// Identify a display type, preferring old show/hide data over the CSS cascade
        +		restoreDisplay = dataShow && dataShow.display;
        +		if ( restoreDisplay == null ) {
        +			restoreDisplay = dataPriv.get( elem, "display" );
        +		}
        +		display = jQuery.css( elem, "display" );
        +		if ( display === "none" ) {
        +			if ( restoreDisplay ) {
        +				display = restoreDisplay;
        +			} else {
        +
        +				// Get nonempty value(s) by temporarily forcing visibility
        +				showHide( [ elem ], true );
        +				restoreDisplay = elem.style.display || restoreDisplay;
        +				display = jQuery.css( elem, "display" );
        +				showHide( [ elem ] );
        +			}
        +		}
        +
        +		// Animate inline elements as inline-block
        +		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
        +			if ( jQuery.css( elem, "float" ) === "none" ) {
        +
        +				// Restore the original display value at the end of pure show/hide animations
        +				if ( !propTween ) {
        +					anim.done( function() {
        +						style.display = restoreDisplay;
        +					} );
        +					if ( restoreDisplay == null ) {
        +						display = style.display;
        +						restoreDisplay = display === "none" ? "" : display;
        +					}
        +				}
        +				style.display = "inline-block";
        +			}
        +		}
        +	}
        +
        +	if ( opts.overflow ) {
        +		style.overflow = "hidden";
        +		anim.always( function() {
        +			style.overflow = opts.overflow[ 0 ];
        +			style.overflowX = opts.overflow[ 1 ];
        +			style.overflowY = opts.overflow[ 2 ];
        +		} );
        +	}
        +
        +	// Implement show/hide animations
        +	propTween = false;
        +	for ( prop in orig ) {
        +
        +		// General show/hide setup for this element animation
        +		if ( !propTween ) {
        +			if ( dataShow ) {
        +				if ( "hidden" in dataShow ) {
        +					hidden = dataShow.hidden;
        +				}
        +			} else {
        +				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
        +			}
        +
        +			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
        +			if ( toggle ) {
        +				dataShow.hidden = !hidden;
        +			}
        +
        +			// Show elements before animating them
        +			if ( hidden ) {
        +				showHide( [ elem ], true );
        +			}
        +
        +			/* eslint-disable no-loop-func */
        +
        +			anim.done( function() {
        +
        +			/* eslint-enable no-loop-func */
        +
        +				// The final step of a "hide" animation is actually hiding the element
        +				if ( !hidden ) {
        +					showHide( [ elem ] );
        +				}
        +				dataPriv.remove( elem, "fxshow" );
        +				for ( prop in orig ) {
        +					jQuery.style( elem, prop, orig[ prop ] );
        +				}
        +			} );
        +		}
        +
        +		// Per-property setup
        +		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
        +		if ( !( prop in dataShow ) ) {
        +			dataShow[ prop ] = propTween.start;
        +			if ( hidden ) {
        +				propTween.end = propTween.start;
        +				propTween.start = 0;
        +			}
        +		}
        +	}
        +}
        +
        +function propFilter( props, specialEasing ) {
        +	var index, name, easing, value, hooks;
        +
        +	// camelCase, specialEasing and expand cssHook pass
        +	for ( index in props ) {
        +		name = jQuery.camelCase( index );
        +		easing = specialEasing[ name ];
        +		value = props[ index ];
        +		if ( jQuery.isArray( value ) ) {
        +			easing = value[ 1 ];
        +			value = props[ index ] = value[ 0 ];
        +		}
        +
        +		if ( index !== name ) {
        +			props[ name ] = value;
        +			delete props[ index ];
        +		}
        +
        +		hooks = jQuery.cssHooks[ name ];
        +		if ( hooks && "expand" in hooks ) {
        +			value = hooks.expand( value );
        +			delete props[ name ];
        +
        +			// Not quite $.extend, this won't overwrite existing keys.
        +			// Reusing 'index' because we have the correct "name"
        +			for ( index in value ) {
        +				if ( !( index in props ) ) {
        +					props[ index ] = value[ index ];
        +					specialEasing[ index ] = easing;
        +				}
        +			}
        +		} else {
        +			specialEasing[ name ] = easing;
        +		}
        +	}
        +}
        +
        +function Animation( elem, properties, options ) {
        +	var result,
        +		stopped,
        +		index = 0,
        +		length = Animation.prefilters.length,
        +		deferred = jQuery.Deferred().always( function() {
        +
        +			// Don't match elem in the :animated selector
        +			delete tick.elem;
        +		} ),
        +		tick = function() {
        +			if ( stopped ) {
        +				return false;
        +			}
        +			var currentTime = fxNow || createFxNow(),
        +				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
        +
        +				// Support: Android 2.3 only
        +				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
        +				temp = remaining / animation.duration || 0,
        +				percent = 1 - temp,
        +				index = 0,
        +				length = animation.tweens.length;
        +
        +			for ( ; index < length; index++ ) {
        +				animation.tweens[ index ].run( percent );
        +			}
        +
        +			deferred.notifyWith( elem, [ animation, percent, remaining ] );
        +
        +			if ( percent < 1 && length ) {
        +				return remaining;
        +			} else {
        +				deferred.resolveWith( elem, [ animation ] );
        +				return false;
        +			}
        +		},
        +		animation = deferred.promise( {
        +			elem: elem,
        +			props: jQuery.extend( {}, properties ),
        +			opts: jQuery.extend( true, {
        +				specialEasing: {},
        +				easing: jQuery.easing._default
        +			}, options ),
        +			originalProperties: properties,
        +			originalOptions: options,
        +			startTime: fxNow || createFxNow(),
        +			duration: options.duration,
        +			tweens: [],
        +			createTween: function( prop, end ) {
        +				var tween = jQuery.Tween( elem, animation.opts, prop, end,
        +						animation.opts.specialEasing[ prop ] || animation.opts.easing );
        +				animation.tweens.push( tween );
        +				return tween;
        +			},
        +			stop: function( gotoEnd ) {
        +				var index = 0,
        +
        +					// If we are going to the end, we want to run all the tweens
        +					// otherwise we skip this part
        +					length = gotoEnd ? animation.tweens.length : 0;
        +				if ( stopped ) {
        +					return this;
        +				}
        +				stopped = true;
        +				for ( ; index < length; index++ ) {
        +					animation.tweens[ index ].run( 1 );
        +				}
        +
        +				// Resolve when we played the last frame; otherwise, reject
        +				if ( gotoEnd ) {
        +					deferred.notifyWith( elem, [ animation, 1, 0 ] );
        +					deferred.resolveWith( elem, [ animation, gotoEnd ] );
        +				} else {
        +					deferred.rejectWith( elem, [ animation, gotoEnd ] );
        +				}
        +				return this;
        +			}
        +		} ),
        +		props = animation.props;
        +
        +	propFilter( props, animation.opts.specialEasing );
        +
        +	for ( ; index < length; index++ ) {
        +		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
        +		if ( result ) {
        +			if ( jQuery.isFunction( result.stop ) ) {
        +				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
        +					jQuery.proxy( result.stop, result );
        +			}
        +			return result;
        +		}
        +	}
        +
        +	jQuery.map( props, createTween, animation );
        +
        +	if ( jQuery.isFunction( animation.opts.start ) ) {
        +		animation.opts.start.call( elem, animation );
        +	}
        +
        +	jQuery.fx.timer(
        +		jQuery.extend( tick, {
        +			elem: elem,
        +			anim: animation,
        +			queue: animation.opts.queue
        +		} )
        +	);
        +
        +	// attach callbacks from options
        +	return animation.progress( animation.opts.progress )
        +		.done( animation.opts.done, animation.opts.complete )
        +		.fail( animation.opts.fail )
        +		.always( animation.opts.always );
        +}
        +
        +jQuery.Animation = jQuery.extend( Animation, {
        +
        +	tweeners: {
        +		"*": [ function( prop, value ) {
        +			var tween = this.createTween( prop, value );
        +			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
        +			return tween;
        +		} ]
        +	},
        +
        +	tweener: function( props, callback ) {
        +		if ( jQuery.isFunction( props ) ) {
        +			callback = props;
        +			props = [ "*" ];
        +		} else {
        +			props = props.match( rnothtmlwhite );
        +		}
        +
        +		var prop,
        +			index = 0,
        +			length = props.length;
        +
        +		for ( ; index < length; index++ ) {
        +			prop = props[ index ];
        +			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
        +			Animation.tweeners[ prop ].unshift( callback );
        +		}
        +	},
        +
        +	prefilters: [ defaultPrefilter ],
        +
        +	prefilter: function( callback, prepend ) {
        +		if ( prepend ) {
        +			Animation.prefilters.unshift( callback );
        +		} else {
        +			Animation.prefilters.push( callback );
        +		}
        +	}
        +} );
        +
        +jQuery.speed = function( speed, easing, fn ) {
        +	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
        +		complete: fn || !fn && easing ||
        +			jQuery.isFunction( speed ) && speed,
        +		duration: speed,
        +		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
        +	};
        +
        +	// Go to the end state if fx are off or if document is hidden
        +	if ( jQuery.fx.off || document.hidden ) {
        +		opt.duration = 0;
        +
        +	} else {
        +		if ( typeof opt.duration !== "number" ) {
        +			if ( opt.duration in jQuery.fx.speeds ) {
        +				opt.duration = jQuery.fx.speeds[ opt.duration ];
        +
        +			} else {
        +				opt.duration = jQuery.fx.speeds._default;
        +			}
        +		}
        +	}
        +
        +	// Normalize opt.queue - true/undefined/null -> "fx"
        +	if ( opt.queue == null || opt.queue === true ) {
        +		opt.queue = "fx";
        +	}
        +
        +	// Queueing
        +	opt.old = opt.complete;
        +
        +	opt.complete = function() {
        +		if ( jQuery.isFunction( opt.old ) ) {
        +			opt.old.call( this );
        +		}
        +
        +		if ( opt.queue ) {
        +			jQuery.dequeue( this, opt.queue );
        +		}
        +	};
        +
        +	return opt;
        +};
        +
        +jQuery.fn.extend( {
        +	fadeTo: function( speed, to, easing, callback ) {
        +
        +		// Show any hidden elements after setting opacity to 0
        +		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
        +
        +			// Animate to the value specified
        +			.end().animate( { opacity: to }, speed, easing, callback );
        +	},
        +	animate: function( prop, speed, easing, callback ) {
        +		var empty = jQuery.isEmptyObject( prop ),
        +			optall = jQuery.speed( speed, easing, callback ),
        +			doAnimation = function() {
        +
        +				// Operate on a copy of prop so per-property easing won't be lost
        +				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
        +
        +				// Empty animations, or finishing resolves immediately
        +				if ( empty || dataPriv.get( this, "finish" ) ) {
        +					anim.stop( true );
        +				}
        +			};
        +			doAnimation.finish = doAnimation;
        +
        +		return empty || optall.queue === false ?
        +			this.each( doAnimation ) :
        +			this.queue( optall.queue, doAnimation );
        +	},
        +	stop: function( type, clearQueue, gotoEnd ) {
        +		var stopQueue = function( hooks ) {
        +			var stop = hooks.stop;
        +			delete hooks.stop;
        +			stop( gotoEnd );
        +		};
        +
        +		if ( typeof type !== "string" ) {
        +			gotoEnd = clearQueue;
        +			clearQueue = type;
        +			type = undefined;
        +		}
        +		if ( clearQueue && type !== false ) {
        +			this.queue( type || "fx", [] );
        +		}
        +
        +		return this.each( function() {
        +			var dequeue = true,
        +				index = type != null && type + "queueHooks",
        +				timers = jQuery.timers,
        +				data = dataPriv.get( this );
        +
        +			if ( index ) {
        +				if ( data[ index ] && data[ index ].stop ) {
        +					stopQueue( data[ index ] );
        +				}
        +			} else {
        +				for ( index in data ) {
        +					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
        +						stopQueue( data[ index ] );
        +					}
        +				}
        +			}
        +
        +			for ( index = timers.length; index--; ) {
        +				if ( timers[ index ].elem === this &&
        +					( type == null || timers[ index ].queue === type ) ) {
        +
        +					timers[ index ].anim.stop( gotoEnd );
        +					dequeue = false;
        +					timers.splice( index, 1 );
        +				}
        +			}
        +
        +			// Start the next in the queue if the last step wasn't forced.
        +			// Timers currently will call their complete callbacks, which
        +			// will dequeue but only if they were gotoEnd.
        +			if ( dequeue || !gotoEnd ) {
        +				jQuery.dequeue( this, type );
        +			}
        +		} );
        +	},
        +	finish: function( type ) {
        +		if ( type !== false ) {
        +			type = type || "fx";
        +		}
        +		return this.each( function() {
        +			var index,
        +				data = dataPriv.get( this ),
        +				queue = data[ type + "queue" ],
        +				hooks = data[ type + "queueHooks" ],
        +				timers = jQuery.timers,
        +				length = queue ? queue.length : 0;
        +
        +			// Enable finishing flag on private data
        +			data.finish = true;
        +
        +			// Empty the queue first
        +			jQuery.queue( this, type, [] );
        +
        +			if ( hooks && hooks.stop ) {
        +				hooks.stop.call( this, true );
        +			}
        +
        +			// Look for any active animations, and finish them
        +			for ( index = timers.length; index--; ) {
        +				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
        +					timers[ index ].anim.stop( true );
        +					timers.splice( index, 1 );
        +				}
        +			}
        +
        +			// Look for any animations in the old queue and finish them
        +			for ( index = 0; index < length; index++ ) {
        +				if ( queue[ index ] && queue[ index ].finish ) {
        +					queue[ index ].finish.call( this );
        +				}
        +			}
        +
        +			// Turn off finishing flag
        +			delete data.finish;
        +		} );
        +	}
        +} );
        +
        +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
        +	var cssFn = jQuery.fn[ name ];
        +	jQuery.fn[ name ] = function( speed, easing, callback ) {
        +		return speed == null || typeof speed === "boolean" ?
        +			cssFn.apply( this, arguments ) :
        +			this.animate( genFx( name, true ), speed, easing, callback );
        +	};
        +} );
        +
        +// Generate shortcuts for custom animations
        +jQuery.each( {
        +	slideDown: genFx( "show" ),
        +	slideUp: genFx( "hide" ),
        +	slideToggle: genFx( "toggle" ),
        +	fadeIn: { opacity: "show" },
        +	fadeOut: { opacity: "hide" },
        +	fadeToggle: { opacity: "toggle" }
        +}, function( name, props ) {
        +	jQuery.fn[ name ] = function( speed, easing, callback ) {
        +		return this.animate( props, speed, easing, callback );
        +	};
        +} );
        +
        +jQuery.timers = [];
        +jQuery.fx.tick = function() {
        +	var timer,
        +		i = 0,
        +		timers = jQuery.timers;
        +
        +	fxNow = jQuery.now();
        +
        +	for ( ; i < timers.length; i++ ) {
        +		timer = timers[ i ];
        +
        +		// Checks the timer has not already been removed
        +		if ( !timer() && timers[ i ] === timer ) {
        +			timers.splice( i--, 1 );
        +		}
        +	}
        +
        +	if ( !timers.length ) {
        +		jQuery.fx.stop();
        +	}
        +	fxNow = undefined;
        +};
        +
        +jQuery.fx.timer = function( timer ) {
        +	jQuery.timers.push( timer );
        +	if ( timer() ) {
        +		jQuery.fx.start();
        +	} else {
        +		jQuery.timers.pop();
        +	}
        +};
        +
        +jQuery.fx.interval = 13;
        +jQuery.fx.start = function() {
        +	if ( !timerId ) {
        +		timerId = window.requestAnimationFrame ?
        +			window.requestAnimationFrame( raf ) :
        +			window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
        +	}
        +};
        +
        +jQuery.fx.stop = function() {
        +	if ( window.cancelAnimationFrame ) {
        +		window.cancelAnimationFrame( timerId );
        +	} else {
        +		window.clearInterval( timerId );
        +	}
        +
        +	timerId = null;
        +};
        +
        +jQuery.fx.speeds = {
        +	slow: 600,
        +	fast: 200,
        +
        +	// Default speed
        +	_default: 400
        +};
        +
        +
        +// Based off of the plugin by Clint Helfers, with permission.
        +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
        +jQuery.fn.delay = function( time, type ) {
        +	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
        +	type = type || "fx";
        +
        +	return this.queue( type, function( next, hooks ) {
        +		var timeout = window.setTimeout( next, time );
        +		hooks.stop = function() {
        +			window.clearTimeout( timeout );
        +		};
        +	} );
        +};
        +
        +
        +( function() {
        +	var input = document.createElement( "input" ),
        +		select = document.createElement( "select" ),
        +		opt = select.appendChild( document.createElement( "option" ) );
        +
        +	input.type = "checkbox";
        +
        +	// Support: Android <=4.3 only
        +	// Default value for a checkbox should be "on"
        +	support.checkOn = input.value !== "";
        +
        +	// Support: IE <=11 only
        +	// Must access selectedIndex to make default options select
        +	support.optSelected = opt.selected;
        +
        +	// Support: IE <=11 only
        +	// An input loses its value after becoming a radio
        +	input = document.createElement( "input" );
        +	input.value = "t";
        +	input.type = "radio";
        +	support.radioValue = input.value === "t";
        +} )();
        +
        +
        +var boolHook,
        +	attrHandle = jQuery.expr.attrHandle;
        +
        +jQuery.fn.extend( {
        +	attr: function( name, value ) {
        +		return access( this, jQuery.attr, name, value, arguments.length > 1 );
        +	},
        +
        +	removeAttr: function( name ) {
        +		return this.each( function() {
        +			jQuery.removeAttr( this, name );
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	attr: function( elem, name, value ) {
        +		var ret, hooks,
        +			nType = elem.nodeType;
        +
        +		// Don't get/set attributes on text, comment and attribute nodes
        +		if ( nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		// Fallback to prop when attributes are not supported
        +		if ( typeof elem.getAttribute === "undefined" ) {
        +			return jQuery.prop( elem, name, value );
        +		}
        +
        +		// Attribute hooks are determined by the lowercase version
        +		// Grab necessary hook if one is defined
        +		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
        +			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
        +				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
        +		}
        +
        +		if ( value !== undefined ) {
        +			if ( value === null ) {
        +				jQuery.removeAttr( elem, name );
        +				return;
        +			}
        +
        +			if ( hooks && "set" in hooks &&
        +				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
        +				return ret;
        +			}
        +
        +			elem.setAttribute( name, value + "" );
        +			return value;
        +		}
        +
        +		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
        +			return ret;
        +		}
        +
        +		ret = jQuery.find.attr( elem, name );
        +
        +		// Non-existent attributes return null, we normalize to undefined
        +		return ret == null ? undefined : ret;
        +	},
        +
        +	attrHooks: {
        +		type: {
        +			set: function( elem, value ) {
        +				if ( !support.radioValue && value === "radio" &&
        +					jQuery.nodeName( elem, "input" ) ) {
        +					var val = elem.value;
        +					elem.setAttribute( "type", value );
        +					if ( val ) {
        +						elem.value = val;
        +					}
        +					return value;
        +				}
        +			}
        +		}
        +	},
        +
        +	removeAttr: function( elem, value ) {
        +		var name,
        +			i = 0,
        +
        +			// Attribute names can contain non-HTML whitespace characters
        +			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
        +			attrNames = value && value.match( rnothtmlwhite );
        +
        +		if ( attrNames && elem.nodeType === 1 ) {
        +			while ( ( name = attrNames[ i++ ] ) ) {
        +				elem.removeAttribute( name );
        +			}
        +		}
        +	}
        +} );
        +
        +// Hooks for boolean attributes
        +boolHook = {
        +	set: function( elem, value, name ) {
        +		if ( value === false ) {
        +
        +			// Remove boolean attributes when set to false
        +			jQuery.removeAttr( elem, name );
        +		} else {
        +			elem.setAttribute( name, name );
        +		}
        +		return name;
        +	}
        +};
        +
        +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
        +	var getter = attrHandle[ name ] || jQuery.find.attr;
        +
        +	attrHandle[ name ] = function( elem, name, isXML ) {
        +		var ret, handle,
        +			lowercaseName = name.toLowerCase();
        +
        +		if ( !isXML ) {
        +
        +			// Avoid an infinite loop by temporarily removing this function from the getter
        +			handle = attrHandle[ lowercaseName ];
        +			attrHandle[ lowercaseName ] = ret;
        +			ret = getter( elem, name, isXML ) != null ?
        +				lowercaseName :
        +				null;
        +			attrHandle[ lowercaseName ] = handle;
        +		}
        +		return ret;
        +	};
        +} );
        +
        +
        +
        +
        +var rfocusable = /^(?:input|select|textarea|button)$/i,
        +	rclickable = /^(?:a|area)$/i;
        +
        +jQuery.fn.extend( {
        +	prop: function( name, value ) {
        +		return access( this, jQuery.prop, name, value, arguments.length > 1 );
        +	},
        +
        +	removeProp: function( name ) {
        +		return this.each( function() {
        +			delete this[ jQuery.propFix[ name ] || name ];
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	prop: function( elem, name, value ) {
        +		var ret, hooks,
        +			nType = elem.nodeType;
        +
        +		// Don't get/set properties on text, comment and attribute nodes
        +		if ( nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
        +
        +			// Fix name and attach hooks
        +			name = jQuery.propFix[ name ] || name;
        +			hooks = jQuery.propHooks[ name ];
        +		}
        +
        +		if ( value !== undefined ) {
        +			if ( hooks && "set" in hooks &&
        +				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
        +				return ret;
        +			}
        +
        +			return ( elem[ name ] = value );
        +		}
        +
        +		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
        +			return ret;
        +		}
        +
        +		return elem[ name ];
        +	},
        +
        +	propHooks: {
        +		tabIndex: {
        +			get: function( elem ) {
        +
        +				// Support: IE <=9 - 11 only
        +				// elem.tabIndex doesn't always return the
        +				// correct value when it hasn't been explicitly set
        +				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
        +				// Use proper attribute retrieval(#12072)
        +				var tabindex = jQuery.find.attr( elem, "tabindex" );
        +
        +				if ( tabindex ) {
        +					return parseInt( tabindex, 10 );
        +				}
        +
        +				if (
        +					rfocusable.test( elem.nodeName ) ||
        +					rclickable.test( elem.nodeName ) &&
        +					elem.href
        +				) {
        +					return 0;
        +				}
        +
        +				return -1;
        +			}
        +		}
        +	},
        +
        +	propFix: {
        +		"for": "htmlFor",
        +		"class": "className"
        +	}
        +} );
        +
        +// Support: IE <=11 only
        +// Accessing the selectedIndex property
        +// forces the browser to respect setting selected
        +// on the option
        +// The getter ensures a default option is selected
        +// when in an optgroup
        +// eslint rule "no-unused-expressions" is disabled for this code
        +// since it considers such accessions noop
        +if ( !support.optSelected ) {
        +	jQuery.propHooks.selected = {
        +		get: function( elem ) {
        +
        +			/* eslint no-unused-expressions: "off" */
        +
        +			var parent = elem.parentNode;
        +			if ( parent && parent.parentNode ) {
        +				parent.parentNode.selectedIndex;
        +			}
        +			return null;
        +		},
        +		set: function( elem ) {
        +
        +			/* eslint no-unused-expressions: "off" */
        +
        +			var parent = elem.parentNode;
        +			if ( parent ) {
        +				parent.selectedIndex;
        +
        +				if ( parent.parentNode ) {
        +					parent.parentNode.selectedIndex;
        +				}
        +			}
        +		}
        +	};
        +}
        +
        +jQuery.each( [
        +	"tabIndex",
        +	"readOnly",
        +	"maxLength",
        +	"cellSpacing",
        +	"cellPadding",
        +	"rowSpan",
        +	"colSpan",
        +	"useMap",
        +	"frameBorder",
        +	"contentEditable"
        +], function() {
        +	jQuery.propFix[ this.toLowerCase() ] = this;
        +} );
        +
        +
        +
        +
        +	// Strip and collapse whitespace according to HTML spec
        +	// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
        +	function stripAndCollapse( value ) {
        +		var tokens = value.match( rnothtmlwhite ) || [];
        +		return tokens.join( " " );
        +	}
        +
        +
        +function getClass( elem ) {
        +	return elem.getAttribute && elem.getAttribute( "class" ) || "";
        +}
        +
        +jQuery.fn.extend( {
        +	addClass: function( value ) {
        +		var classes, elem, cur, curValue, clazz, j, finalValue,
        +			i = 0;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( j ) {
        +				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
        +			} );
        +		}
        +
        +		if ( typeof value === "string" && value ) {
        +			classes = value.match( rnothtmlwhite ) || [];
        +
        +			while ( ( elem = this[ i++ ] ) ) {
        +				curValue = getClass( elem );
        +				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
        +
        +				if ( cur ) {
        +					j = 0;
        +					while ( ( clazz = classes[ j++ ] ) ) {
        +						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
        +							cur += clazz + " ";
        +						}
        +					}
        +
        +					// Only assign if different to avoid unneeded rendering.
        +					finalValue = stripAndCollapse( cur );
        +					if ( curValue !== finalValue ) {
        +						elem.setAttribute( "class", finalValue );
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	removeClass: function( value ) {
        +		var classes, elem, cur, curValue, clazz, j, finalValue,
        +			i = 0;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( j ) {
        +				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
        +			} );
        +		}
        +
        +		if ( !arguments.length ) {
        +			return this.attr( "class", "" );
        +		}
        +
        +		if ( typeof value === "string" && value ) {
        +			classes = value.match( rnothtmlwhite ) || [];
        +
        +			while ( ( elem = this[ i++ ] ) ) {
        +				curValue = getClass( elem );
        +
        +				// This expression is here for better compressibility (see addClass)
        +				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
        +
        +				if ( cur ) {
        +					j = 0;
        +					while ( ( clazz = classes[ j++ ] ) ) {
        +
        +						// Remove *all* instances
        +						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
        +							cur = cur.replace( " " + clazz + " ", " " );
        +						}
        +					}
        +
        +					// Only assign if different to avoid unneeded rendering.
        +					finalValue = stripAndCollapse( cur );
        +					if ( curValue !== finalValue ) {
        +						elem.setAttribute( "class", finalValue );
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	toggleClass: function( value, stateVal ) {
        +		var type = typeof value;
        +
        +		if ( typeof stateVal === "boolean" && type === "string" ) {
        +			return stateVal ? this.addClass( value ) : this.removeClass( value );
        +		}
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( i ) {
        +				jQuery( this ).toggleClass(
        +					value.call( this, i, getClass( this ), stateVal ),
        +					stateVal
        +				);
        +			} );
        +		}
        +
        +		return this.each( function() {
        +			var className, i, self, classNames;
        +
        +			if ( type === "string" ) {
        +
        +				// Toggle individual class names
        +				i = 0;
        +				self = jQuery( this );
        +				classNames = value.match( rnothtmlwhite ) || [];
        +
        +				while ( ( className = classNames[ i++ ] ) ) {
        +
        +					// Check each className given, space separated list
        +					if ( self.hasClass( className ) ) {
        +						self.removeClass( className );
        +					} else {
        +						self.addClass( className );
        +					}
        +				}
        +
        +			// Toggle whole class name
        +			} else if ( value === undefined || type === "boolean" ) {
        +				className = getClass( this );
        +				if ( className ) {
        +
        +					// Store className if set
        +					dataPriv.set( this, "__className__", className );
        +				}
        +
        +				// If the element has a class name or if we're passed `false`,
        +				// then remove the whole classname (if there was one, the above saved it).
        +				// Otherwise bring back whatever was previously saved (if anything),
        +				// falling back to the empty string if nothing was stored.
        +				if ( this.setAttribute ) {
        +					this.setAttribute( "class",
        +						className || value === false ?
        +						"" :
        +						dataPriv.get( this, "__className__" ) || ""
        +					);
        +				}
        +			}
        +		} );
        +	},
        +
        +	hasClass: function( selector ) {
        +		var className, elem,
        +			i = 0;
        +
        +		className = " " + selector + " ";
        +		while ( ( elem = this[ i++ ] ) ) {
        +			if ( elem.nodeType === 1 &&
        +				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
        +					return true;
        +			}
        +		}
        +
        +		return false;
        +	}
        +} );
        +
        +
        +
        +
        +var rreturn = /\r/g;
        +
        +jQuery.fn.extend( {
        +	val: function( value ) {
        +		var hooks, ret, isFunction,
        +			elem = this[ 0 ];
        +
        +		if ( !arguments.length ) {
        +			if ( elem ) {
        +				hooks = jQuery.valHooks[ elem.type ] ||
        +					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
        +
        +				if ( hooks &&
        +					"get" in hooks &&
        +					( ret = hooks.get( elem, "value" ) ) !== undefined
        +				) {
        +					return ret;
        +				}
        +
        +				ret = elem.value;
        +
        +				// Handle most common string cases
        +				if ( typeof ret === "string" ) {
        +					return ret.replace( rreturn, "" );
        +				}
        +
        +				// Handle cases where value is null/undef or number
        +				return ret == null ? "" : ret;
        +			}
        +
        +			return;
        +		}
        +
        +		isFunction = jQuery.isFunction( value );
        +
        +		return this.each( function( i ) {
        +			var val;
        +
        +			if ( this.nodeType !== 1 ) {
        +				return;
        +			}
        +
        +			if ( isFunction ) {
        +				val = value.call( this, i, jQuery( this ).val() );
        +			} else {
        +				val = value;
        +			}
        +
        +			// Treat null/undefined as ""; convert numbers to string
        +			if ( val == null ) {
        +				val = "";
        +
        +			} else if ( typeof val === "number" ) {
        +				val += "";
        +
        +			} else if ( jQuery.isArray( val ) ) {
        +				val = jQuery.map( val, function( value ) {
        +					return value == null ? "" : value + "";
        +				} );
        +			}
        +
        +			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
        +
        +			// If set returns undefined, fall back to normal setting
        +			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
        +				this.value = val;
        +			}
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	valHooks: {
        +		option: {
        +			get: function( elem ) {
        +
        +				var val = jQuery.find.attr( elem, "value" );
        +				return val != null ?
        +					val :
        +
        +					// Support: IE <=10 - 11 only
        +					// option.text throws exceptions (#14686, #14858)
        +					// Strip and collapse whitespace
        +					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
        +					stripAndCollapse( jQuery.text( elem ) );
        +			}
        +		},
        +		select: {
        +			get: function( elem ) {
        +				var value, option, i,
        +					options = elem.options,
        +					index = elem.selectedIndex,
        +					one = elem.type === "select-one",
        +					values = one ? null : [],
        +					max = one ? index + 1 : options.length;
        +
        +				if ( index < 0 ) {
        +					i = max;
        +
        +				} else {
        +					i = one ? index : 0;
        +				}
        +
        +				// Loop through all the selected options
        +				for ( ; i < max; i++ ) {
        +					option = options[ i ];
        +
        +					// Support: IE <=9 only
        +					// IE8-9 doesn't update selected after form reset (#2551)
        +					if ( ( option.selected || i === index ) &&
        +
        +							// Don't return options that are disabled or in a disabled optgroup
        +							!option.disabled &&
        +							( !option.parentNode.disabled ||
        +								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
        +
        +						// Get the specific value for the option
        +						value = jQuery( option ).val();
        +
        +						// We don't need an array for one selects
        +						if ( one ) {
        +							return value;
        +						}
        +
        +						// Multi-Selects return an array
        +						values.push( value );
        +					}
        +				}
        +
        +				return values;
        +			},
        +
        +			set: function( elem, value ) {
        +				var optionSet, option,
        +					options = elem.options,
        +					values = jQuery.makeArray( value ),
        +					i = options.length;
        +
        +				while ( i-- ) {
        +					option = options[ i ];
        +
        +					/* eslint-disable no-cond-assign */
        +
        +					if ( option.selected =
        +						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
        +					) {
        +						optionSet = true;
        +					}
        +
        +					/* eslint-enable no-cond-assign */
        +				}
        +
        +				// Force browsers to behave consistently when non-matching value is set
        +				if ( !optionSet ) {
        +					elem.selectedIndex = -1;
        +				}
        +				return values;
        +			}
        +		}
        +	}
        +} );
        +
        +// Radios and checkboxes getter/setter
        +jQuery.each( [ "radio", "checkbox" ], function() {
        +	jQuery.valHooks[ this ] = {
        +		set: function( elem, value ) {
        +			if ( jQuery.isArray( value ) ) {
        +				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
        +			}
        +		}
        +	};
        +	if ( !support.checkOn ) {
        +		jQuery.valHooks[ this ].get = function( elem ) {
        +			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
        +		};
        +	}
        +} );
        +
        +
        +
        +
        +// Return jQuery for attributes-only inclusion
        +
        +
        +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
        +
        +jQuery.extend( jQuery.event, {
        +
        +	trigger: function( event, data, elem, onlyHandlers ) {
        +
        +		var i, cur, tmp, bubbleType, ontype, handle, special,
        +			eventPath = [ elem || document ],
        +			type = hasOwn.call( event, "type" ) ? event.type : event,
        +			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
        +
        +		cur = tmp = elem = elem || document;
        +
        +		// Don't do events on text and comment nodes
        +		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        +			return;
        +		}
        +
        +		// focus/blur morphs to focusin/out; ensure we're not firing them right now
        +		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        +			return;
        +		}
        +
        +		if ( type.indexOf( "." ) > -1 ) {
        +
        +			// Namespaced trigger; create a regexp to match event type in handle()
        +			namespaces = type.split( "." );
        +			type = namespaces.shift();
        +			namespaces.sort();
        +		}
        +		ontype = type.indexOf( ":" ) < 0 && "on" + type;
        +
        +		// Caller can pass in a jQuery.Event object, Object, or just an event type string
        +		event = event[ jQuery.expando ] ?
        +			event :
        +			new jQuery.Event( type, typeof event === "object" && event );
        +
        +		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
        +		event.isTrigger = onlyHandlers ? 2 : 3;
        +		event.namespace = namespaces.join( "." );
        +		event.rnamespace = event.namespace ?
        +			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
        +			null;
        +
        +		// Clean up the event in case it is being reused
        +		event.result = undefined;
        +		if ( !event.target ) {
        +			event.target = elem;
        +		}
        +
        +		// Clone any incoming data and prepend the event, creating the handler arg list
        +		data = data == null ?
        +			[ event ] :
        +			jQuery.makeArray( data, [ event ] );
        +
        +		// Allow special events to draw outside the lines
        +		special = jQuery.event.special[ type ] || {};
        +		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
        +			return;
        +		}
        +
        +		// Determine event propagation path in advance, per W3C events spec (#9951)
        +		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
        +		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
        +
        +			bubbleType = special.delegateType || type;
        +			if ( !rfocusMorph.test( bubbleType + type ) ) {
        +				cur = cur.parentNode;
        +			}
        +			for ( ; cur; cur = cur.parentNode ) {
        +				eventPath.push( cur );
        +				tmp = cur;
        +			}
        +
        +			// Only add window if we got to document (e.g., not plain obj or detached DOM)
        +			if ( tmp === ( elem.ownerDocument || document ) ) {
        +				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
        +			}
        +		}
        +
        +		// Fire handlers on the event path
        +		i = 0;
        +		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
        +
        +			event.type = i > 1 ?
        +				bubbleType :
        +				special.bindType || type;
        +
        +			// jQuery handler
        +			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
        +				dataPriv.get( cur, "handle" );
        +			if ( handle ) {
        +				handle.apply( cur, data );
        +			}
        +
        +			// Native handler
        +			handle = ontype && cur[ ontype ];
        +			if ( handle && handle.apply && acceptData( cur ) ) {
        +				event.result = handle.apply( cur, data );
        +				if ( event.result === false ) {
        +					event.preventDefault();
        +				}
        +			}
        +		}
        +		event.type = type;
        +
        +		// If nobody prevented the default action, do it now
        +		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
        +
        +			if ( ( !special._default ||
        +				special._default.apply( eventPath.pop(), data ) === false ) &&
        +				acceptData( elem ) ) {
        +
        +				// Call a native DOM method on the target with the same name as the event.
        +				// Don't do default actions on window, that's where global variables be (#6170)
        +				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
        +
        +					// Don't re-trigger an onFOO event when we call its FOO() method
        +					tmp = elem[ ontype ];
        +
        +					if ( tmp ) {
        +						elem[ ontype ] = null;
        +					}
        +
        +					// Prevent re-triggering of the same event, since we already bubbled it above
        +					jQuery.event.triggered = type;
        +					elem[ type ]();
        +					jQuery.event.triggered = undefined;
        +
        +					if ( tmp ) {
        +						elem[ ontype ] = tmp;
        +					}
        +				}
        +			}
        +		}
        +
        +		return event.result;
        +	},
        +
        +	// Piggyback on a donor event to simulate a different one
        +	// Used only for `focus(in | out)` events
        +	simulate: function( type, elem, event ) {
        +		var e = jQuery.extend(
        +			new jQuery.Event(),
        +			event,
        +			{
        +				type: type,
        +				isSimulated: true
        +			}
        +		);
        +
        +		jQuery.event.trigger( e, null, elem );
        +	}
        +
        +} );
        +
        +jQuery.fn.extend( {
        +
        +	trigger: function( type, data ) {
        +		return this.each( function() {
        +			jQuery.event.trigger( type, data, this );
        +		} );
        +	},
        +	triggerHandler: function( type, data ) {
        +		var elem = this[ 0 ];
        +		if ( elem ) {
        +			return jQuery.event.trigger( type, data, elem, true );
        +		}
        +	}
        +} );
        +
        +
        +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
        +	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
        +	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
        +	function( i, name ) {
        +
        +	// Handle event binding
        +	jQuery.fn[ name ] = function( data, fn ) {
        +		return arguments.length > 0 ?
        +			this.on( name, null, data, fn ) :
        +			this.trigger( name );
        +	};
        +} );
        +
        +jQuery.fn.extend( {
        +	hover: function( fnOver, fnOut ) {
        +		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        +	}
        +} );
        +
        +
        +
        +
        +support.focusin = "onfocusin" in window;
        +
        +
        +// Support: Firefox <=44
        +// Firefox doesn't have focus(in | out) events
        +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
        +//
        +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
        +// focus(in | out) events fire after focus & blur events,
        +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
        +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
        +if ( !support.focusin ) {
        +	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
        +
        +		// Attach a single capturing handler on the document while someone wants focusin/focusout
        +		var handler = function( event ) {
        +			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
        +		};
        +
        +		jQuery.event.special[ fix ] = {
        +			setup: function() {
        +				var doc = this.ownerDocument || this,
        +					attaches = dataPriv.access( doc, fix );
        +
        +				if ( !attaches ) {
        +					doc.addEventListener( orig, handler, true );
        +				}
        +				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
        +			},
        +			teardown: function() {
        +				var doc = this.ownerDocument || this,
        +					attaches = dataPriv.access( doc, fix ) - 1;
        +
        +				if ( !attaches ) {
        +					doc.removeEventListener( orig, handler, true );
        +					dataPriv.remove( doc, fix );
        +
        +				} else {
        +					dataPriv.access( doc, fix, attaches );
        +				}
        +			}
        +		};
        +	} );
        +}
        +var location = window.location;
        +
        +var nonce = jQuery.now();
        +
        +var rquery = ( /\?/ );
        +
        +
        +
        +// Cross-browser xml parsing
        +jQuery.parseXML = function( data ) {
        +	var xml;
        +	if ( !data || typeof data !== "string" ) {
        +		return null;
        +	}
        +
        +	// Support: IE 9 - 11 only
        +	// IE throws on parseFromString with invalid input.
        +	try {
        +		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
        +	} catch ( e ) {
        +		xml = undefined;
        +	}
        +
        +	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
        +		jQuery.error( "Invalid XML: " + data );
        +	}
        +	return xml;
        +};
        +
        +
        +var
        +	rbracket = /\[\]$/,
        +	rCRLF = /\r?\n/g,
        +	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
        +	rsubmittable = /^(?:input|select|textarea|keygen)/i;
        +
        +function buildParams( prefix, obj, traditional, add ) {
        +	var name;
        +
        +	if ( jQuery.isArray( obj ) ) {
        +
        +		// Serialize array item.
        +		jQuery.each( obj, function( i, v ) {
        +			if ( traditional || rbracket.test( prefix ) ) {
        +
        +				// Treat each array item as a scalar.
        +				add( prefix, v );
        +
        +			} else {
        +
        +				// Item is non-scalar (array or object), encode its numeric index.
        +				buildParams(
        +					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
        +					v,
        +					traditional,
        +					add
        +				);
        +			}
        +		} );
        +
        +	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
        +
        +		// Serialize object item.
        +		for ( name in obj ) {
        +			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
        +		}
        +
        +	} else {
        +
        +		// Serialize scalar item.
        +		add( prefix, obj );
        +	}
        +}
        +
        +// Serialize an array of form elements or a set of
        +// key/values into a query string
        +jQuery.param = function( a, traditional ) {
        +	var prefix,
        +		s = [],
        +		add = function( key, valueOrFunction ) {
        +
        +			// If value is a function, invoke it and use its return value
        +			var value = jQuery.isFunction( valueOrFunction ) ?
        +				valueOrFunction() :
        +				valueOrFunction;
        +
        +			s[ s.length ] = encodeURIComponent( key ) + "=" +
        +				encodeURIComponent( value == null ? "" : value );
        +		};
        +
        +	// If an array was passed in, assume that it is an array of form elements.
        +	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        +
        +		// Serialize the form elements
        +		jQuery.each( a, function() {
        +			add( this.name, this.value );
        +		} );
        +
        +	} else {
        +
        +		// If traditional, encode the "old" way (the way 1.3.2 or older
        +		// did it), otherwise encode params recursively.
        +		for ( prefix in a ) {
        +			buildParams( prefix, a[ prefix ], traditional, add );
        +		}
        +	}
        +
        +	// Return the resulting serialization
        +	return s.join( "&" );
        +};
        +
        +jQuery.fn.extend( {
        +	serialize: function() {
        +		return jQuery.param( this.serializeArray() );
        +	},
        +	serializeArray: function() {
        +		return this.map( function() {
        +
        +			// Can add propHook for "elements" to filter or add form elements
        +			var elements = jQuery.prop( this, "elements" );
        +			return elements ? jQuery.makeArray( elements ) : this;
        +		} )
        +		.filter( function() {
        +			var type = this.type;
        +
        +			// Use .is( ":disabled" ) so that fieldset[disabled] works
        +			return this.name && !jQuery( this ).is( ":disabled" ) &&
        +				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
        +				( this.checked || !rcheckableType.test( type ) );
        +		} )
        +		.map( function( i, elem ) {
        +			var val = jQuery( this ).val();
        +
        +			if ( val == null ) {
        +				return null;
        +			}
        +
        +			if ( jQuery.isArray( val ) ) {
        +				return jQuery.map( val, function( val ) {
        +					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +				} );
        +			}
        +
        +			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +		} ).get();
        +	}
        +} );
        +
        +
        +var
        +	r20 = /%20/g,
        +	rhash = /#.*$/,
        +	rantiCache = /([?&])_=[^&]*/,
        +	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
        +
        +	// #7653, #8125, #8152: local protocol detection
        +	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        +	rnoContent = /^(?:GET|HEAD)$/,
        +	rprotocol = /^\/\//,
        +
        +	/* Prefilters
        +	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
        +	 * 2) These are called:
        +	 *    - BEFORE asking for a transport
        +	 *    - AFTER param serialization (s.data is a string if s.processData is true)
        +	 * 3) key is the dataType
        +	 * 4) the catchall symbol "*" can be used
        +	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
        +	 */
        +	prefilters = {},
        +
        +	/* Transports bindings
        +	 * 1) key is the dataType
        +	 * 2) the catchall symbol "*" can be used
        +	 * 3) selection will start with transport dataType and THEN go to "*" if needed
        +	 */
        +	transports = {},
        +
        +	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        +	allTypes = "*/".concat( "*" ),
        +
        +	// Anchor tag for parsing the document origin
        +	originAnchor = document.createElement( "a" );
        +	originAnchor.href = location.href;
        +
        +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
        +function addToPrefiltersOrTransports( structure ) {
        +
        +	// dataTypeExpression is optional and defaults to "*"
        +	return function( dataTypeExpression, func ) {
        +
        +		if ( typeof dataTypeExpression !== "string" ) {
        +			func = dataTypeExpression;
        +			dataTypeExpression = "*";
        +		}
        +
        +		var dataType,
        +			i = 0,
        +			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
        +
        +		if ( jQuery.isFunction( func ) ) {
        +
        +			// For each dataType in the dataTypeExpression
        +			while ( ( dataType = dataTypes[ i++ ] ) ) {
        +
        +				// Prepend if requested
        +				if ( dataType[ 0 ] === "+" ) {
        +					dataType = dataType.slice( 1 ) || "*";
        +					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
        +
        +				// Otherwise append
        +				} else {
        +					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
        +				}
        +			}
        +		}
        +	};
        +}
        +
        +// Base inspection function for prefilters and transports
        +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
        +
        +	var inspected = {},
        +		seekingTransport = ( structure === transports );
        +
        +	function inspect( dataType ) {
        +		var selected;
        +		inspected[ dataType ] = true;
        +		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
        +			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
        +			if ( typeof dataTypeOrTransport === "string" &&
        +				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
        +
        +				options.dataTypes.unshift( dataTypeOrTransport );
        +				inspect( dataTypeOrTransport );
        +				return false;
        +			} else if ( seekingTransport ) {
        +				return !( selected = dataTypeOrTransport );
        +			}
        +		} );
        +		return selected;
        +	}
        +
        +	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
        +}
        +
        +// A special extend for ajax options
        +// that takes "flat" options (not to be deep extended)
        +// Fixes #9887
        +function ajaxExtend( target, src ) {
        +	var key, deep,
        +		flatOptions = jQuery.ajaxSettings.flatOptions || {};
        +
        +	for ( key in src ) {
        +		if ( src[ key ] !== undefined ) {
        +			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
        +		}
        +	}
        +	if ( deep ) {
        +		jQuery.extend( true, target, deep );
        +	}
        +
        +	return target;
        +}
        +
        +/* Handles responses to an ajax request:
        + * - finds the right dataType (mediates between content-type and expected dataType)
        + * - returns the corresponding response
        + */
        +function ajaxHandleResponses( s, jqXHR, responses ) {
        +
        +	var ct, type, finalDataType, firstDataType,
        +		contents = s.contents,
        +		dataTypes = s.dataTypes;
        +
        +	// Remove auto dataType and get content-type in the process
        +	while ( dataTypes[ 0 ] === "*" ) {
        +		dataTypes.shift();
        +		if ( ct === undefined ) {
        +			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
        +		}
        +	}
        +
        +	// Check if we're dealing with a known content-type
        +	if ( ct ) {
        +		for ( type in contents ) {
        +			if ( contents[ type ] && contents[ type ].test( ct ) ) {
        +				dataTypes.unshift( type );
        +				break;
        +			}
        +		}
        +	}
        +
        +	// Check to see if we have a response for the expected dataType
        +	if ( dataTypes[ 0 ] in responses ) {
        +		finalDataType = dataTypes[ 0 ];
        +	} else {
        +
        +		// Try convertible dataTypes
        +		for ( type in responses ) {
        +			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
        +				finalDataType = type;
        +				break;
        +			}
        +			if ( !firstDataType ) {
        +				firstDataType = type;
        +			}
        +		}
        +
        +		// Or just use first one
        +		finalDataType = finalDataType || firstDataType;
        +	}
        +
        +	// If we found a dataType
        +	// We add the dataType to the list if needed
        +	// and return the corresponding response
        +	if ( finalDataType ) {
        +		if ( finalDataType !== dataTypes[ 0 ] ) {
        +			dataTypes.unshift( finalDataType );
        +		}
        +		return responses[ finalDataType ];
        +	}
        +}
        +
        +/* Chain conversions given the request and the original response
        + * Also sets the responseXXX fields on the jqXHR instance
        + */
        +function ajaxConvert( s, response, jqXHR, isSuccess ) {
        +	var conv2, current, conv, tmp, prev,
        +		converters = {},
        +
        +		// Work with a copy of dataTypes in case we need to modify it for conversion
        +		dataTypes = s.dataTypes.slice();
        +
        +	// Create converters map with lowercased keys
        +	if ( dataTypes[ 1 ] ) {
        +		for ( conv in s.converters ) {
        +			converters[ conv.toLowerCase() ] = s.converters[ conv ];
        +		}
        +	}
        +
        +	current = dataTypes.shift();
        +
        +	// Convert to each sequential dataType
        +	while ( current ) {
        +
        +		if ( s.responseFields[ current ] ) {
        +			jqXHR[ s.responseFields[ current ] ] = response;
        +		}
        +
        +		// Apply the dataFilter if provided
        +		if ( !prev && isSuccess && s.dataFilter ) {
        +			response = s.dataFilter( response, s.dataType );
        +		}
        +
        +		prev = current;
        +		current = dataTypes.shift();
        +
        +		if ( current ) {
        +
        +			// There's only work to do if current dataType is non-auto
        +			if ( current === "*" ) {
        +
        +				current = prev;
        +
        +			// Convert response if prev dataType is non-auto and differs from current
        +			} else if ( prev !== "*" && prev !== current ) {
        +
        +				// Seek a direct converter
        +				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
        +
        +				// If none found, seek a pair
        +				if ( !conv ) {
        +					for ( conv2 in converters ) {
        +
        +						// If conv2 outputs current
        +						tmp = conv2.split( " " );
        +						if ( tmp[ 1 ] === current ) {
        +
        +							// If prev can be converted to accepted input
        +							conv = converters[ prev + " " + tmp[ 0 ] ] ||
        +								converters[ "* " + tmp[ 0 ] ];
        +							if ( conv ) {
        +
        +								// Condense equivalence converters
        +								if ( conv === true ) {
        +									conv = converters[ conv2 ];
        +
        +								// Otherwise, insert the intermediate dataType
        +								} else if ( converters[ conv2 ] !== true ) {
        +									current = tmp[ 0 ];
        +									dataTypes.unshift( tmp[ 1 ] );
        +								}
        +								break;
        +							}
        +						}
        +					}
        +				}
        +
        +				// Apply converter (if not an equivalence)
        +				if ( conv !== true ) {
        +
        +					// Unless errors are allowed to bubble, catch and return them
        +					if ( conv && s.throws ) {
        +						response = conv( response );
        +					} else {
        +						try {
        +							response = conv( response );
        +						} catch ( e ) {
        +							return {
        +								state: "parsererror",
        +								error: conv ? e : "No conversion from " + prev + " to " + current
        +							};
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	return { state: "success", data: response };
        +}
        +
        +jQuery.extend( {
        +
        +	// Counter for holding the number of active queries
        +	active: 0,
        +
        +	// Last-Modified header cache for next request
        +	lastModified: {},
        +	etag: {},
        +
        +	ajaxSettings: {
        +		url: location.href,
        +		type: "GET",
        +		isLocal: rlocalProtocol.test( location.protocol ),
        +		global: true,
        +		processData: true,
        +		async: true,
        +		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        +
        +		/*
        +		timeout: 0,
        +		data: null,
        +		dataType: null,
        +		username: null,
        +		password: null,
        +		cache: null,
        +		throws: false,
        +		traditional: false,
        +		headers: {},
        +		*/
        +
        +		accepts: {
        +			"*": allTypes,
        +			text: "text/plain",
        +			html: "text/html",
        +			xml: "application/xml, text/xml",
        +			json: "application/json, text/javascript"
        +		},
        +
        +		contents: {
        +			xml: /\bxml\b/,
        +			html: /\bhtml/,
        +			json: /\bjson\b/
        +		},
        +
        +		responseFields: {
        +			xml: "responseXML",
        +			text: "responseText",
        +			json: "responseJSON"
        +		},
        +
        +		// Data converters
        +		// Keys separate source (or catchall "*") and destination types with a single space
        +		converters: {
        +
        +			// Convert anything to text
        +			"* text": String,
        +
        +			// Text to html (true = no transformation)
        +			"text html": true,
        +
        +			// Evaluate text as a json expression
        +			"text json": JSON.parse,
        +
        +			// Parse text as xml
        +			"text xml": jQuery.parseXML
        +		},
        +
        +		// For options that shouldn't be deep extended:
        +		// you can add your own custom options here if
        +		// and when you create one that shouldn't be
        +		// deep extended (see ajaxExtend)
        +		flatOptions: {
        +			url: true,
        +			context: true
        +		}
        +	},
        +
        +	// Creates a full fledged settings object into target
        +	// with both ajaxSettings and settings fields.
        +	// If target is omitted, writes into ajaxSettings.
        +	ajaxSetup: function( target, settings ) {
        +		return settings ?
        +
        +			// Building a settings object
        +			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
        +
        +			// Extending ajaxSettings
        +			ajaxExtend( jQuery.ajaxSettings, target );
        +	},
        +
        +	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        +	ajaxTransport: addToPrefiltersOrTransports( transports ),
        +
        +	// Main method
        +	ajax: function( url, options ) {
        +
        +		// If url is an object, simulate pre-1.5 signature
        +		if ( typeof url === "object" ) {
        +			options = url;
        +			url = undefined;
        +		}
        +
        +		// Force options to be an object
        +		options = options || {};
        +
        +		var transport,
        +
        +			// URL without anti-cache param
        +			cacheURL,
        +
        +			// Response headers
        +			responseHeadersString,
        +			responseHeaders,
        +
        +			// timeout handle
        +			timeoutTimer,
        +
        +			// Url cleanup var
        +			urlAnchor,
        +
        +			// Request state (becomes false upon send and true upon completion)
        +			completed,
        +
        +			// To know if global events are to be dispatched
        +			fireGlobals,
        +
        +			// Loop variable
        +			i,
        +
        +			// uncached part of the url
        +			uncached,
        +
        +			// Create the final options object
        +			s = jQuery.ajaxSetup( {}, options ),
        +
        +			// Callbacks context
        +			callbackContext = s.context || s,
        +
        +			// Context for global events is callbackContext if it is a DOM node or jQuery collection
        +			globalEventContext = s.context &&
        +				( callbackContext.nodeType || callbackContext.jquery ) ?
        +					jQuery( callbackContext ) :
        +					jQuery.event,
        +
        +			// Deferreds
        +			deferred = jQuery.Deferred(),
        +			completeDeferred = jQuery.Callbacks( "once memory" ),
        +
        +			// Status-dependent callbacks
        +			statusCode = s.statusCode || {},
        +
        +			// Headers (they are sent all at once)
        +			requestHeaders = {},
        +			requestHeadersNames = {},
        +
        +			// Default abort message
        +			strAbort = "canceled",
        +
        +			// Fake xhr
        +			jqXHR = {
        +				readyState: 0,
        +
        +				// Builds headers hashtable if needed
        +				getResponseHeader: function( key ) {
        +					var match;
        +					if ( completed ) {
        +						if ( !responseHeaders ) {
        +							responseHeaders = {};
        +							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
        +								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
        +							}
        +						}
        +						match = responseHeaders[ key.toLowerCase() ];
        +					}
        +					return match == null ? null : match;
        +				},
        +
        +				// Raw string
        +				getAllResponseHeaders: function() {
        +					return completed ? responseHeadersString : null;
        +				},
        +
        +				// Caches the header
        +				setRequestHeader: function( name, value ) {
        +					if ( completed == null ) {
        +						name = requestHeadersNames[ name.toLowerCase() ] =
        +							requestHeadersNames[ name.toLowerCase() ] || name;
        +						requestHeaders[ name ] = value;
        +					}
        +					return this;
        +				},
        +
        +				// Overrides response content-type header
        +				overrideMimeType: function( type ) {
        +					if ( completed == null ) {
        +						s.mimeType = type;
        +					}
        +					return this;
        +				},
        +
        +				// Status-dependent callbacks
        +				statusCode: function( map ) {
        +					var code;
        +					if ( map ) {
        +						if ( completed ) {
        +
        +							// Execute the appropriate callbacks
        +							jqXHR.always( map[ jqXHR.status ] );
        +						} else {
        +
        +							// Lazy-add the new callbacks in a way that preserves old ones
        +							for ( code in map ) {
        +								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
        +							}
        +						}
        +					}
        +					return this;
        +				},
        +
        +				// Cancel the request
        +				abort: function( statusText ) {
        +					var finalText = statusText || strAbort;
        +					if ( transport ) {
        +						transport.abort( finalText );
        +					}
        +					done( 0, finalText );
        +					return this;
        +				}
        +			};
        +
        +		// Attach deferreds
        +		deferred.promise( jqXHR );
        +
        +		// Add protocol if not provided (prefilters might expect it)
        +		// Handle falsy url in the settings object (#10093: consistency with old signature)
        +		// We also use the url parameter if available
        +		s.url = ( ( url || s.url || location.href ) + "" )
        +			.replace( rprotocol, location.protocol + "//" );
        +
        +		// Alias method option to type as per ticket #12004
        +		s.type = options.method || options.type || s.method || s.type;
        +
        +		// Extract dataTypes list
        +		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
        +
        +		// A cross-domain request is in order when the origin doesn't match the current origin.
        +		if ( s.crossDomain == null ) {
        +			urlAnchor = document.createElement( "a" );
        +
        +			// Support: IE <=8 - 11, Edge 12 - 13
        +			// IE throws exception on accessing the href property if url is malformed,
        +			// e.g. http://example.com:80x/
        +			try {
        +				urlAnchor.href = s.url;
        +
        +				// Support: IE <=8 - 11 only
        +				// Anchor's host property isn't correctly set when s.url is relative
        +				urlAnchor.href = urlAnchor.href;
        +				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
        +					urlAnchor.protocol + "//" + urlAnchor.host;
        +			} catch ( e ) {
        +
        +				// If there is an error parsing the URL, assume it is crossDomain,
        +				// it can be rejected by the transport if it is invalid
        +				s.crossDomain = true;
        +			}
        +		}
        +
        +		// Convert data if not already a string
        +		if ( s.data && s.processData && typeof s.data !== "string" ) {
        +			s.data = jQuery.param( s.data, s.traditional );
        +		}
        +
        +		// Apply prefilters
        +		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
        +
        +		// If request was aborted inside a prefilter, stop there
        +		if ( completed ) {
        +			return jqXHR;
        +		}
        +
        +		// We can fire global events as of now if asked to
        +		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
        +		fireGlobals = jQuery.event && s.global;
        +
        +		// Watch for a new set of requests
        +		if ( fireGlobals && jQuery.active++ === 0 ) {
        +			jQuery.event.trigger( "ajaxStart" );
        +		}
        +
        +		// Uppercase the type
        +		s.type = s.type.toUpperCase();
        +
        +		// Determine if request has content
        +		s.hasContent = !rnoContent.test( s.type );
        +
        +		// Save the URL in case we're toying with the If-Modified-Since
        +		// and/or If-None-Match header later on
        +		// Remove hash to simplify url manipulation
        +		cacheURL = s.url.replace( rhash, "" );
        +
        +		// More options handling for requests with no content
        +		if ( !s.hasContent ) {
        +
        +			// Remember the hash so we can put it back
        +			uncached = s.url.slice( cacheURL.length );
        +
        +			// If data is available, append data to url
        +			if ( s.data ) {
        +				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
        +
        +				// #9682: remove data so that it's not used in an eventual retry
        +				delete s.data;
        +			}
        +
        +			// Add or update anti-cache param if needed
        +			if ( s.cache === false ) {
        +				cacheURL = cacheURL.replace( rantiCache, "$1" );
        +				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
        +			}
        +
        +			// Put hash and anti-cache on the URL that will be requested (gh-1732)
        +			s.url = cacheURL + uncached;
        +
        +		// Change '%20' to '+' if this is encoded form body content (gh-2658)
        +		} else if ( s.data && s.processData &&
        +			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
        +			s.data = s.data.replace( r20, "+" );
        +		}
        +
        +		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +		if ( s.ifModified ) {
        +			if ( jQuery.lastModified[ cacheURL ] ) {
        +				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
        +			}
        +			if ( jQuery.etag[ cacheURL ] ) {
        +				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
        +			}
        +		}
        +
        +		// Set the correct header, if data is being sent
        +		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
        +			jqXHR.setRequestHeader( "Content-Type", s.contentType );
        +		}
        +
        +		// Set the Accepts header for the server, depending on the dataType
        +		jqXHR.setRequestHeader(
        +			"Accept",
        +			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
        +				s.accepts[ s.dataTypes[ 0 ] ] +
        +					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
        +				s.accepts[ "*" ]
        +		);
        +
        +		// Check for headers option
        +		for ( i in s.headers ) {
        +			jqXHR.setRequestHeader( i, s.headers[ i ] );
        +		}
        +
        +		// Allow custom headers/mimetypes and early abort
        +		if ( s.beforeSend &&
        +			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
        +
        +			// Abort if not done already and return
        +			return jqXHR.abort();
        +		}
        +
        +		// Aborting is no longer a cancellation
        +		strAbort = "abort";
        +
        +		// Install callbacks on deferreds
        +		completeDeferred.add( s.complete );
        +		jqXHR.done( s.success );
        +		jqXHR.fail( s.error );
        +
        +		// Get transport
        +		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
        +
        +		// If no transport, we auto-abort
        +		if ( !transport ) {
        +			done( -1, "No Transport" );
        +		} else {
        +			jqXHR.readyState = 1;
        +
        +			// Send global event
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
        +			}
        +
        +			// If request was aborted inside ajaxSend, stop there
        +			if ( completed ) {
        +				return jqXHR;
        +			}
        +
        +			// Timeout
        +			if ( s.async && s.timeout > 0 ) {
        +				timeoutTimer = window.setTimeout( function() {
        +					jqXHR.abort( "timeout" );
        +				}, s.timeout );
        +			}
        +
        +			try {
        +				completed = false;
        +				transport.send( requestHeaders, done );
        +			} catch ( e ) {
        +
        +				// Rethrow post-completion exceptions
        +				if ( completed ) {
        +					throw e;
        +				}
        +
        +				// Propagate others as results
        +				done( -1, e );
        +			}
        +		}
        +
        +		// Callback for when everything is done
        +		function done( status, nativeStatusText, responses, headers ) {
        +			var isSuccess, success, error, response, modified,
        +				statusText = nativeStatusText;
        +
        +			// Ignore repeat invocations
        +			if ( completed ) {
        +				return;
        +			}
        +
        +			completed = true;
        +
        +			// Clear timeout if it exists
        +			if ( timeoutTimer ) {
        +				window.clearTimeout( timeoutTimer );
        +			}
        +
        +			// Dereference transport for early garbage collection
        +			// (no matter how long the jqXHR object will be used)
        +			transport = undefined;
        +
        +			// Cache response headers
        +			responseHeadersString = headers || "";
        +
        +			// Set readyState
        +			jqXHR.readyState = status > 0 ? 4 : 0;
        +
        +			// Determine if successful
        +			isSuccess = status >= 200 && status < 300 || status === 304;
        +
        +			// Get response data
        +			if ( responses ) {
        +				response = ajaxHandleResponses( s, jqXHR, responses );
        +			}
        +
        +			// Convert no matter what (that way responseXXX fields are always set)
        +			response = ajaxConvert( s, response, jqXHR, isSuccess );
        +
        +			// If successful, handle type chaining
        +			if ( isSuccess ) {
        +
        +				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +				if ( s.ifModified ) {
        +					modified = jqXHR.getResponseHeader( "Last-Modified" );
        +					if ( modified ) {
        +						jQuery.lastModified[ cacheURL ] = modified;
        +					}
        +					modified = jqXHR.getResponseHeader( "etag" );
        +					if ( modified ) {
        +						jQuery.etag[ cacheURL ] = modified;
        +					}
        +				}
        +
        +				// if no content
        +				if ( status === 204 || s.type === "HEAD" ) {
        +					statusText = "nocontent";
        +
        +				// if not modified
        +				} else if ( status === 304 ) {
        +					statusText = "notmodified";
        +
        +				// If we have data, let's convert it
        +				} else {
        +					statusText = response.state;
        +					success = response.data;
        +					error = response.error;
        +					isSuccess = !error;
        +				}
        +			} else {
        +
        +				// Extract error from statusText and normalize for non-aborts
        +				error = statusText;
        +				if ( status || !statusText ) {
        +					statusText = "error";
        +					if ( status < 0 ) {
        +						status = 0;
        +					}
        +				}
        +			}
        +
        +			// Set data for the fake xhr object
        +			jqXHR.status = status;
        +			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
        +
        +			// Success/Error
        +			if ( isSuccess ) {
        +				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
        +			} else {
        +				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
        +			}
        +
        +			// Status-dependent callbacks
        +			jqXHR.statusCode( statusCode );
        +			statusCode = undefined;
        +
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
        +					[ jqXHR, s, isSuccess ? success : error ] );
        +			}
        +
        +			// Complete
        +			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
        +
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
        +
        +				// Handle the global AJAX counter
        +				if ( !( --jQuery.active ) ) {
        +					jQuery.event.trigger( "ajaxStop" );
        +				}
        +			}
        +		}
        +
        +		return jqXHR;
        +	},
        +
        +	getJSON: function( url, data, callback ) {
        +		return jQuery.get( url, data, callback, "json" );
        +	},
        +
        +	getScript: function( url, callback ) {
        +		return jQuery.get( url, undefined, callback, "script" );
        +	}
        +} );
        +
        +jQuery.each( [ "get", "post" ], function( i, method ) {
        +	jQuery[ method ] = function( url, data, callback, type ) {
        +
        +		// Shift arguments if data argument was omitted
        +		if ( jQuery.isFunction( data ) ) {
        +			type = type || callback;
        +			callback = data;
        +			data = undefined;
        +		}
        +
        +		// The url can be an options object (which then must have .url)
        +		return jQuery.ajax( jQuery.extend( {
        +			url: url,
        +			type: method,
        +			dataType: type,
        +			data: data,
        +			success: callback
        +		}, jQuery.isPlainObject( url ) && url ) );
        +	};
        +} );
        +
        +
        +jQuery._evalUrl = function( url ) {
        +	return jQuery.ajax( {
        +		url: url,
        +
        +		// Make this explicit, since user can override this through ajaxSetup (#11264)
        +		type: "GET",
        +		dataType: "script",
        +		cache: true,
        +		async: false,
        +		global: false,
        +		"throws": true
        +	} );
        +};
        +
        +
        +jQuery.fn.extend( {
        +	wrapAll: function( html ) {
        +		var wrap;
        +
        +		if ( this[ 0 ] ) {
        +			if ( jQuery.isFunction( html ) ) {
        +				html = html.call( this[ 0 ] );
        +			}
        +
        +			// The elements to wrap the target around
        +			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
        +
        +			if ( this[ 0 ].parentNode ) {
        +				wrap.insertBefore( this[ 0 ] );
        +			}
        +
        +			wrap.map( function() {
        +				var elem = this;
        +
        +				while ( elem.firstElementChild ) {
        +					elem = elem.firstElementChild;
        +				}
        +
        +				return elem;
        +			} ).append( this );
        +		}
        +
        +		return this;
        +	},
        +
        +	wrapInner: function( html ) {
        +		if ( jQuery.isFunction( html ) ) {
        +			return this.each( function( i ) {
        +				jQuery( this ).wrapInner( html.call( this, i ) );
        +			} );
        +		}
        +
        +		return this.each( function() {
        +			var self = jQuery( this ),
        +				contents = self.contents();
        +
        +			if ( contents.length ) {
        +				contents.wrapAll( html );
        +
        +			} else {
        +				self.append( html );
        +			}
        +		} );
        +	},
        +
        +	wrap: function( html ) {
        +		var isFunction = jQuery.isFunction( html );
        +
        +		return this.each( function( i ) {
        +			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
        +		} );
        +	},
        +
        +	unwrap: function( selector ) {
        +		this.parent( selector ).not( "body" ).each( function() {
        +			jQuery( this ).replaceWith( this.childNodes );
        +		} );
        +		return this;
        +	}
        +} );
        +
        +
        +jQuery.expr.pseudos.hidden = function( elem ) {
        +	return !jQuery.expr.pseudos.visible( elem );
        +};
        +jQuery.expr.pseudos.visible = function( elem ) {
        +	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
        +};
        +
        +
        +
        +
        +jQuery.ajaxSettings.xhr = function() {
        +	try {
        +		return new window.XMLHttpRequest();
        +	} catch ( e ) {}
        +};
        +
        +var xhrSuccessStatus = {
        +
        +		// File protocol always yields status code 0, assume 200
        +		0: 200,
        +
        +		// Support: IE <=9 only
        +		// #1450: sometimes IE returns 1223 when it should be 204
        +		1223: 204
        +	},
        +	xhrSupported = jQuery.ajaxSettings.xhr();
        +
        +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
        +support.ajax = xhrSupported = !!xhrSupported;
        +
        +jQuery.ajaxTransport( function( options ) {
        +	var callback, errorCallback;
        +
        +	// Cross domain only allowed if supported through XMLHttpRequest
        +	if ( support.cors || xhrSupported && !options.crossDomain ) {
        +		return {
        +			send: function( headers, complete ) {
        +				var i,
        +					xhr = options.xhr();
        +
        +				xhr.open(
        +					options.type,
        +					options.url,
        +					options.async,
        +					options.username,
        +					options.password
        +				);
        +
        +				// Apply custom fields if provided
        +				if ( options.xhrFields ) {
        +					for ( i in options.xhrFields ) {
        +						xhr[ i ] = options.xhrFields[ i ];
        +					}
        +				}
        +
        +				// Override mime type if needed
        +				if ( options.mimeType && xhr.overrideMimeType ) {
        +					xhr.overrideMimeType( options.mimeType );
        +				}
        +
        +				// X-Requested-With header
        +				// For cross-domain requests, seeing as conditions for a preflight are
        +				// akin to a jigsaw puzzle, we simply never set it to be sure.
        +				// (it can always be set on a per-request basis or even using ajaxSetup)
        +				// For same-domain requests, won't change header if already provided.
        +				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
        +					headers[ "X-Requested-With" ] = "XMLHttpRequest";
        +				}
        +
        +				// Set headers
        +				for ( i in headers ) {
        +					xhr.setRequestHeader( i, headers[ i ] );
        +				}
        +
        +				// Callback
        +				callback = function( type ) {
        +					return function() {
        +						if ( callback ) {
        +							callback = errorCallback = xhr.onload =
        +								xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
        +
        +							if ( type === "abort" ) {
        +								xhr.abort();
        +							} else if ( type === "error" ) {
        +
        +								// Support: IE <=9 only
        +								// On a manual native abort, IE9 throws
        +								// errors on any property access that is not readyState
        +								if ( typeof xhr.status !== "number" ) {
        +									complete( 0, "error" );
        +								} else {
        +									complete(
        +
        +										// File: protocol always yields status 0; see #8605, #14207
        +										xhr.status,
        +										xhr.statusText
        +									);
        +								}
        +							} else {
        +								complete(
        +									xhrSuccessStatus[ xhr.status ] || xhr.status,
        +									xhr.statusText,
        +
        +									// Support: IE <=9 only
        +									// IE9 has no XHR2 but throws on binary (trac-11426)
        +									// For XHR2 non-text, let the caller handle it (gh-2498)
        +									( xhr.responseType || "text" ) !== "text"  ||
        +									typeof xhr.responseText !== "string" ?
        +										{ binary: xhr.response } :
        +										{ text: xhr.responseText },
        +									xhr.getAllResponseHeaders()
        +								);
        +							}
        +						}
        +					};
        +				};
        +
        +				// Listen to events
        +				xhr.onload = callback();
        +				errorCallback = xhr.onerror = callback( "error" );
        +
        +				// Support: IE 9 only
        +				// Use onreadystatechange to replace onabort
        +				// to handle uncaught aborts
        +				if ( xhr.onabort !== undefined ) {
        +					xhr.onabort = errorCallback;
        +				} else {
        +					xhr.onreadystatechange = function() {
        +
        +						// Check readyState before timeout as it changes
        +						if ( xhr.readyState === 4 ) {
        +
        +							// Allow onerror to be called first,
        +							// but that will not handle a native abort
        +							// Also, save errorCallback to a variable
        +							// as xhr.onerror cannot be accessed
        +							window.setTimeout( function() {
        +								if ( callback ) {
        +									errorCallback();
        +								}
        +							} );
        +						}
        +					};
        +				}
        +
        +				// Create the abort callback
        +				callback = callback( "abort" );
        +
        +				try {
        +
        +					// Do send the request (this may raise an exception)
        +					xhr.send( options.hasContent && options.data || null );
        +				} catch ( e ) {
        +
        +					// #14683: Only rethrow if this hasn't been notified as an error yet
        +					if ( callback ) {
        +						throw e;
        +					}
        +				}
        +			},
        +
        +			abort: function() {
        +				if ( callback ) {
        +					callback();
        +				}
        +			}
        +		};
        +	}
        +} );
        +
        +
        +
        +
        +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
        +jQuery.ajaxPrefilter( function( s ) {
        +	if ( s.crossDomain ) {
        +		s.contents.script = false;
        +	}
        +} );
        +
        +// Install script dataType
        +jQuery.ajaxSetup( {
        +	accepts: {
        +		script: "text/javascript, application/javascript, " +
        +			"application/ecmascript, application/x-ecmascript"
        +	},
        +	contents: {
        +		script: /\b(?:java|ecma)script\b/
        +	},
        +	converters: {
        +		"text script": function( text ) {
        +			jQuery.globalEval( text );
        +			return text;
        +		}
        +	}
        +} );
        +
        +// Handle cache's special case and crossDomain
        +jQuery.ajaxPrefilter( "script", function( s ) {
        +	if ( s.cache === undefined ) {
        +		s.cache = false;
        +	}
        +	if ( s.crossDomain ) {
        +		s.type = "GET";
        +	}
        +} );
        +
        +// Bind script tag hack transport
        +jQuery.ajaxTransport( "script", function( s ) {
        +
        +	// This transport only deals with cross domain requests
        +	if ( s.crossDomain ) {
        +		var script, callback;
        +		return {
        +			send: function( _, complete ) {
        +				script = jQuery( "<script>" ).prop( {
        +					charset: s.scriptCharset,
        +					src: s.url
        +				} ).on(
        +					"load error",
        +					callback = function( evt ) {
        +						script.remove();
        +						callback = null;
        +						if ( evt ) {
        +							complete( evt.type === "error" ? 404 : 200, evt.type );
        +						}
        +					}
        +				);
        +
        +				// Use native DOM manipulation to avoid our domManip AJAX trickery
        +				document.head.appendChild( script[ 0 ] );
        +			},
        +			abort: function() {
        +				if ( callback ) {
        +					callback();
        +				}
        +			}
        +		};
        +	}
        +} );
        +
        +
        +
        +
        +var oldCallbacks = [],
        +	rjsonp = /(=)\?(?=&|$)|\?\?/;
        +
        +// Default jsonp settings
        +jQuery.ajaxSetup( {
        +	jsonp: "callback",
        +	jsonpCallback: function() {
        +		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
        +		this[ callback ] = true;
        +		return callback;
        +	}
        +} );
        +
        +// Detect, normalize options and install callbacks for jsonp requests
        +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
        +
        +	var callbackName, overwritten, responseContainer,
        +		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
        +			"url" :
        +			typeof s.data === "string" &&
        +				( s.contentType || "" )
        +					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
        +				rjsonp.test( s.data ) && "data"
        +		);
        +
        +	// Handle iff the expected data type is "jsonp" or we have a parameter to set
        +	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
        +
        +		// Get callback name, remembering preexisting value associated with it
        +		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
        +			s.jsonpCallback() :
        +			s.jsonpCallback;
        +
        +		// Insert callback into url or form data
        +		if ( jsonProp ) {
        +			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
        +		} else if ( s.jsonp !== false ) {
        +			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
        +		}
        +
        +		// Use data converter to retrieve json after script execution
        +		s.converters[ "script json" ] = function() {
        +			if ( !responseContainer ) {
        +				jQuery.error( callbackName + " was not called" );
        +			}
        +			return responseContainer[ 0 ];
        +		};
        +
        +		// Force json dataType
        +		s.dataTypes[ 0 ] = "json";
        +
        +		// Install callback
        +		overwritten = window[ callbackName ];
        +		window[ callbackName ] = function() {
        +			responseContainer = arguments;
        +		};
        +
        +		// Clean-up function (fires after converters)
        +		jqXHR.always( function() {
        +
        +			// If previous value didn't exist - remove it
        +			if ( overwritten === undefined ) {
        +				jQuery( window ).removeProp( callbackName );
        +
        +			// Otherwise restore preexisting value
        +			} else {
        +				window[ callbackName ] = overwritten;
        +			}
        +
        +			// Save back as free
        +			if ( s[ callbackName ] ) {
        +
        +				// Make sure that re-using the options doesn't screw things around
        +				s.jsonpCallback = originalSettings.jsonpCallback;
        +
        +				// Save the callback name for future use
        +				oldCallbacks.push( callbackName );
        +			}
        +
        +			// Call if it was a function and we have a response
        +			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
        +				overwritten( responseContainer[ 0 ] );
        +			}
        +
        +			responseContainer = overwritten = undefined;
        +		} );
        +
        +		// Delegate to script
        +		return "script";
        +	}
        +} );
        +
        +
        +
        +
        +// Support: Safari 8 only
        +// In Safari 8 documents created via document.implementation.createHTMLDocument
        +// collapse sibling forms: the second one becomes a child of the first one.
        +// Because of that, this security measure has to be disabled in Safari 8.
        +// https://bugs.webkit.org/show_bug.cgi?id=137337
        +support.createHTMLDocument = ( function() {
        +	var body = document.implementation.createHTMLDocument( "" ).body;
        +	body.innerHTML = "<form></form><form></form>";
        +	return body.childNodes.length === 2;
        +} )();
        +
        +
        +// Argument "data" should be string of html
        +// context (optional): If specified, the fragment will be created in this context,
        +// defaults to document
        +// keepScripts (optional): If true, will include scripts passed in the html string
        +jQuery.parseHTML = function( data, context, keepScripts ) {
        +	if ( typeof data !== "string" ) {
        +		return [];
        +	}
        +	if ( typeof context === "boolean" ) {
        +		keepScripts = context;
        +		context = false;
        +	}
        +
        +	var base, parsed, scripts;
        +
        +	if ( !context ) {
        +
        +		// Stop scripts or inline event handlers from being executed immediately
        +		// by using document.implementation
        +		if ( support.createHTMLDocument ) {
        +			context = document.implementation.createHTMLDocument( "" );
        +
        +			// Set the base href for the created document
        +			// so any parsed elements with URLs
        +			// are based on the document's URL (gh-2965)
        +			base = context.createElement( "base" );
        +			base.href = document.location.href;
        +			context.head.appendChild( base );
        +		} else {
        +			context = document;
        +		}
        +	}
        +
        +	parsed = rsingleTag.exec( data );
        +	scripts = !keepScripts && [];
        +
        +	// Single tag
        +	if ( parsed ) {
        +		return [ context.createElement( parsed[ 1 ] ) ];
        +	}
        +
        +	parsed = buildFragment( [ data ], context, scripts );
        +
        +	if ( scripts && scripts.length ) {
        +		jQuery( scripts ).remove();
        +	}
        +
        +	return jQuery.merge( [], parsed.childNodes );
        +};
        +
        +
        +/**
        + * Load a url into a page
        + */
        +jQuery.fn.load = function( url, params, callback ) {
        +	var selector, type, response,
        +		self = this,
        +		off = url.indexOf( " " );
        +
        +	if ( off > -1 ) {
        +		selector = stripAndCollapse( url.slice( off ) );
        +		url = url.slice( 0, off );
        +	}
        +
        +	// If it's a function
        +	if ( jQuery.isFunction( params ) ) {
        +
        +		// We assume that it's the callback
        +		callback = params;
        +		params = undefined;
        +
        +	// Otherwise, build a param string
        +	} else if ( params && typeof params === "object" ) {
        +		type = "POST";
        +	}
        +
        +	// If we have elements to modify, make the request
        +	if ( self.length > 0 ) {
        +		jQuery.ajax( {
        +			url: url,
        +
        +			// If "type" variable is undefined, then "GET" method will be used.
        +			// Make value of this field explicit since
        +			// user can override it through ajaxSetup method
        +			type: type || "GET",
        +			dataType: "html",
        +			data: params
        +		} ).done( function( responseText ) {
        +
        +			// Save response for use in complete callback
        +			response = arguments;
        +
        +			self.html( selector ?
        +
        +				// If a selector was specified, locate the right elements in a dummy div
        +				// Exclude scripts to avoid IE 'Permission Denied' errors
        +				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
        +
        +				// Otherwise use the full result
        +				responseText );
        +
        +		// If the request succeeds, this function gets "data", "status", "jqXHR"
        +		// but they are ignored because response was set above.
        +		// If it fails, this function gets "jqXHR", "status", "error"
        +		} ).always( callback && function( jqXHR, status ) {
        +			self.each( function() {
        +				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
        +			} );
        +		} );
        +	}
        +
        +	return this;
        +};
        +
        +
        +
        +
        +// Attach a bunch of functions for handling common AJAX events
        +jQuery.each( [
        +	"ajaxStart",
        +	"ajaxStop",
        +	"ajaxComplete",
        +	"ajaxError",
        +	"ajaxSuccess",
        +	"ajaxSend"
        +], function( i, type ) {
        +	jQuery.fn[ type ] = function( fn ) {
        +		return this.on( type, fn );
        +	};
        +} );
        +
        +
        +
        +
        +jQuery.expr.pseudos.animated = function( elem ) {
        +	return jQuery.grep( jQuery.timers, function( fn ) {
        +		return elem === fn.elem;
        +	} ).length;
        +};
        +
        +
        +
        +
        +/**
        + * Gets a window from an element
        + */
        +function getWindow( elem ) {
        +	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
        +}
        +
        +jQuery.offset = {
        +	setOffset: function( elem, options, i ) {
        +		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
        +			position = jQuery.css( elem, "position" ),
        +			curElem = jQuery( elem ),
        +			props = {};
        +
        +		// Set position first, in-case top/left are set even on static elem
        +		if ( position === "static" ) {
        +			elem.style.position = "relative";
        +		}
        +
        +		curOffset = curElem.offset();
        +		curCSSTop = jQuery.css( elem, "top" );
        +		curCSSLeft = jQuery.css( elem, "left" );
        +		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
        +			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
        +
        +		// Need to be able to calculate position if either
        +		// top or left is auto and position is either absolute or fixed
        +		if ( calculatePosition ) {
        +			curPosition = curElem.position();
        +			curTop = curPosition.top;
        +			curLeft = curPosition.left;
        +
        +		} else {
        +			curTop = parseFloat( curCSSTop ) || 0;
        +			curLeft = parseFloat( curCSSLeft ) || 0;
        +		}
        +
        +		if ( jQuery.isFunction( options ) ) {
        +
        +			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
        +			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
        +		}
        +
        +		if ( options.top != null ) {
        +			props.top = ( options.top - curOffset.top ) + curTop;
        +		}
        +		if ( options.left != null ) {
        +			props.left = ( options.left - curOffset.left ) + curLeft;
        +		}
        +
        +		if ( "using" in options ) {
        +			options.using.call( elem, props );
        +
        +		} else {
        +			curElem.css( props );
        +		}
        +	}
        +};
        +
        +jQuery.fn.extend( {
        +	offset: function( options ) {
        +
        +		// Preserve chaining for setter
        +		if ( arguments.length ) {
        +			return options === undefined ?
        +				this :
        +				this.each( function( i ) {
        +					jQuery.offset.setOffset( this, options, i );
        +				} );
        +		}
        +
        +		var docElem, win, rect, doc,
        +			elem = this[ 0 ];
        +
        +		if ( !elem ) {
        +			return;
        +		}
        +
        +		// Support: IE <=11 only
        +		// Running getBoundingClientRect on a
        +		// disconnected node in IE throws an error
        +		if ( !elem.getClientRects().length ) {
        +			return { top: 0, left: 0 };
        +		}
        +
        +		rect = elem.getBoundingClientRect();
        +
        +		// Make sure element is not hidden (display: none)
        +		if ( rect.width || rect.height ) {
        +			doc = elem.ownerDocument;
        +			win = getWindow( doc );
        +			docElem = doc.documentElement;
        +
        +			return {
        +				top: rect.top + win.pageYOffset - docElem.clientTop,
        +				left: rect.left + win.pageXOffset - docElem.clientLeft
        +			};
        +		}
        +
        +		// Return zeros for disconnected and hidden elements (gh-2310)
        +		return rect;
        +	},
        +
        +	position: function() {
        +		if ( !this[ 0 ] ) {
        +			return;
        +		}
        +
        +		var offsetParent, offset,
        +			elem = this[ 0 ],
        +			parentOffset = { top: 0, left: 0 };
        +
        +		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
        +		// because it is its only offset parent
        +		if ( jQuery.css( elem, "position" ) === "fixed" ) {
        +
        +			// Assume getBoundingClientRect is there when computed position is fixed
        +			offset = elem.getBoundingClientRect();
        +
        +		} else {
        +
        +			// Get *real* offsetParent
        +			offsetParent = this.offsetParent();
        +
        +			// Get correct offsets
        +			offset = this.offset();
        +			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
        +				parentOffset = offsetParent.offset();
        +			}
        +
        +			// Add offsetParent borders
        +			parentOffset = {
        +				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
        +				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
        +			};
        +		}
        +
        +		// Subtract parent offsets and element margins
        +		return {
        +			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
        +			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
        +		};
        +	},
        +
        +	// This method will return documentElement in the following cases:
        +	// 1) For the element inside the iframe without offsetParent, this method will return
        +	//    documentElement of the parent window
        +	// 2) For the hidden or detached element
        +	// 3) For body or html element, i.e. in case of the html node - it will return itself
        +	//
        +	// but those exceptions were never presented as a real life use-cases
        +	// and might be considered as more preferable results.
        +	//
        +	// This logic, however, is not guaranteed and can change at any point in the future
        +	offsetParent: function() {
        +		return this.map( function() {
        +			var offsetParent = this.offsetParent;
        +
        +			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
        +				offsetParent = offsetParent.offsetParent;
        +			}
        +
        +			return offsetParent || documentElement;
        +		} );
        +	}
        +} );
        +
        +// Create scrollLeft and scrollTop methods
        +jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
        +	var top = "pageYOffset" === prop;
        +
        +	jQuery.fn[ method ] = function( val ) {
        +		return access( this, function( elem, method, val ) {
        +			var win = getWindow( elem );
        +
        +			if ( val === undefined ) {
        +				return win ? win[ prop ] : elem[ method ];
        +			}
        +
        +			if ( win ) {
        +				win.scrollTo(
        +					!top ? val : win.pageXOffset,
        +					top ? val : win.pageYOffset
        +				);
        +
        +			} else {
        +				elem[ method ] = val;
        +			}
        +		}, method, val, arguments.length );
        +	};
        +} );
        +
        +// Support: Safari <=7 - 9.1, Chrome <=37 - 49
        +// Add the top/left cssHooks using jQuery.fn.position
        +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
        +// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
        +// getComputedStyle returns percent when specified for top/left/bottom/right;
        +// rather than make the css module depend on the offset module, just check for it here
        +jQuery.each( [ "top", "left" ], function( i, prop ) {
        +	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
        +		function( elem, computed ) {
        +			if ( computed ) {
        +				computed = curCSS( elem, prop );
        +
        +				// If curCSS returns percentage, fallback to offset
        +				return rnumnonpx.test( computed ) ?
        +					jQuery( elem ).position()[ prop ] + "px" :
        +					computed;
        +			}
        +		}
        +	);
        +} );
        +
        +
        +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
        +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        +	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
        +		function( defaultExtra, funcName ) {
        +
        +		// Margin is only for outerHeight, outerWidth
        +		jQuery.fn[ funcName ] = function( margin, value ) {
        +			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
        +				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
        +
        +			return access( this, function( elem, type, value ) {
        +				var doc;
        +
        +				if ( jQuery.isWindow( elem ) ) {
        +
        +					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
        +					return funcName.indexOf( "outer" ) === 0 ?
        +						elem[ "inner" + name ] :
        +						elem.document.documentElement[ "client" + name ];
        +				}
        +
        +				// Get document width or height
        +				if ( elem.nodeType === 9 ) {
        +					doc = elem.documentElement;
        +
        +					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
        +					// whichever is greatest
        +					return Math.max(
        +						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
        +						elem.body[ "offset" + name ], doc[ "offset" + name ],
        +						doc[ "client" + name ]
        +					);
        +				}
        +
        +				return value === undefined ?
        +
        +					// Get width or height on the element, requesting but not forcing parseFloat
        +					jQuery.css( elem, type, extra ) :
        +
        +					// Set width or height on the element
        +					jQuery.style( elem, type, value, extra );
        +			}, type, chainable ? margin : undefined, chainable );
        +		};
        +	} );
        +} );
        +
        +
        +jQuery.fn.extend( {
        +
        +	bind: function( types, data, fn ) {
        +		return this.on( types, null, data, fn );
        +	},
        +	unbind: function( types, fn ) {
        +		return this.off( types, null, fn );
        +	},
        +
        +	delegate: function( selector, types, data, fn ) {
        +		return this.on( types, selector, data, fn );
        +	},
        +	undelegate: function( selector, types, fn ) {
        +
        +		// ( namespace ) or ( selector, types [, fn] )
        +		return arguments.length === 1 ?
        +			this.off( selector, "**" ) :
        +			this.off( types, selector || "**", fn );
        +	}
        +} );
        +
        +jQuery.parseJSON = JSON.parse;
        +
        +
        +
        +
        +// Register as a named AMD module, since jQuery can be concatenated with other
        +// files that may use define, but not via a proper concatenation script that
        +// understands anonymous AMD modules. A named AMD is safest and most robust
        +// way to register. Lowercase jquery is used because AMD module names are
        +// derived from file names, and jQuery is normally delivered in a lowercase
        +// file name. Do this after creating the global so that if an AMD module wants
        +// to call noConflict to hide this version of jQuery, it will work.
        +
        +// Note that for maximum portability, libraries that are not jQuery should
        +// declare themselves as anonymous modules, and avoid setting a global if an
        +// AMD loader is present. jQuery is a special case. For more information, see
        +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
        +
        +if ( typeof define === "function" && define.amd ) {
        +	define( "jquery", [], function() {
        +		return jQuery;
        +	} );
        +}
        +
        +
        +
        +
        +var
        +
        +	// Map over jQuery in case of overwrite
        +	_jQuery = window.jQuery,
        +
        +	// Map over the $ in case of overwrite
        +	_$ = window.$;
        +
        +jQuery.noConflict = function( deep ) {
        +	if ( window.$ === jQuery ) {
        +		window.$ = _$;
        +	}
        +
        +	if ( deep && window.jQuery === jQuery ) {
        +		window.jQuery = _jQuery;
        +	}
        +
        +	return jQuery;
        +};
        +
        +// Expose jQuery and $ identifiers, even in AMD
        +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
        +// and CommonJS for browser emulators (#13566)
        +if ( !noGlobal ) {
        +	window.jQuery = window.$ = jQuery;
        +}
        +
        +
        +
        +
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/dist/jquery.min.js b/bower_components/jquery/dist/jquery.min.js
        new file mode 100644
        index 0000000000..4c5be4c0fb
        --- /dev/null
        +++ b/bower_components/jquery/dist/jquery.min.js
        @@ -0,0 +1,4 @@
        +/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
        +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),
        +a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],_a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,"display"),ha([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=eb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:"number"!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db("show"),slideUp:db("hide"),slideToggle:db("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)),
        +void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
        diff --git a/bower_components/jquery/dist/jquery.min.map b/bower_components/jquery/dist/jquery.min.map
        new file mode 100644
        index 0000000000..8c09dd8141
        --- /dev/null
        +++ b/bower_components/jquery/dist/jquery.min.map
        @@ -0,0 +1 @@
        +{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","call","support","DOMEval","code","doc","script","createElement","text","head","appendChild","parentNode","removeChild","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","isNaN","parseFloat","proto","Ctor","isEmptyObject","globalEval","camelCase","string","nodeName","toLowerCase","isArrayLike","trim","makeArray","results","inArray","second","grep","invert","callbackInverse","matches","callbackExpect","arg","value","guid","proxy","tmp","args","now","Date","Symbol","iterator","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","pop","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","disabledAncestor","addCombinator","disabled","dir","next","childNodes","nodeType","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","join","testContext","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","escape","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","targets","l","closest","index","prevAll","add","addBack","sibling","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","reverse","rnothtmlwhite","createOptions","object","flag","Callbacks","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Identity","v","Thrower","ex","adoptValue","resolve","reject","method","promise","fail","then","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","readyWait","holdReady","hold","wait","completed","removeEventListener","readyState","doScroll","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","getData","JSON","parse","dataAttr","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isHiddenWithinTree","style","display","css","swap","old","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","body","showHide","show","values","hide","toggle","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","optgroup","tbody","tfoot","colgroup","caption","th","getAll","setGlobalEval","refElements","rhtml","buildFragment","scripts","selection","ignored","wrap","fragment","createDocumentFragment","nodes","htmlPrefilter","createTextNode","div","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","on","types","one","origFn","event","off","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","fix","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","preventDefault","stopPropagation","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","load","noBubble","trigger","blur","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","isSimulated","stopImmediatePropagation","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rxhtmlTag","rnoInnerhtml","rchecked","rscriptTypeMasked","rcleanScript","manipulationTarget","content","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rmargin","rnumnonpx","getStyles","opener","getComputedStyle","computeStyleTests","cssText","container","divStyle","pixelPositionVal","reliableMarginLeftVal","marginLeft","boxSizingReliableVal","width","marginRight","pixelMarginRightVal","backgroundClip","clearCloneStyle","pixelPosition","boxSizingReliable","pixelMarginRight","reliableMarginLeft","curCSS","computed","minWidth","maxWidth","getPropertyValue","addGetHookIf","conditionFn","hookFn","rdisplayswap","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","emptyStyle","vendorPropName","capName","setPositiveNumber","subtract","max","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","getClientRects","getBoundingClientRect","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","cssProps","float","origName","isFinite","left","margin","padding","border","prefix","suffix","expand","expanded","parts","Tween","easing","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rrun","raf","requestAnimationFrame","tick","createFxNow","genFx","includeWidth","height","createTween","animation","Animation","tweeners","defaultPrefilter","opts","oldfire","propTween","restoreDisplay","isBox","anim","hidden","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","properties","stopped","prefilters","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","timer","complete","*","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","cancelAnimationFrame","clearInterval","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","removeProp","propFix","tabindex","parseInt","for","class","stripAndCollapse","getClass","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","classNames","hasClass","rreturn","valHooks","optionSet","rfocusMorph","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","triggerHandler","hover","fnOver","fnOut","focusin","attaches","nonce","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rlocalProtocol","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","responses","ct","finalDataType","firstDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","overrideMimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","firstElementChild","wrapInner","unwrap","visible","offsetWidth","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","onreadystatechange","responseType","responseText","binary","text script","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","rect","pageYOffset","clientTop","pageXOffset","clientLeft","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","bind","unbind","delegate","undelegate","parseJSON","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,YAEuB,iBAAXC,SAAiD,gBAAnBA,QAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,KAAM,IAAIE,OAAO,2CAElB,OAAOL,GAASI,IAGlBJ,EAASD,IAIY,mBAAXO,QAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,YAEA,IAAIC,MAEAN,EAAWG,EAAOH,SAElBO,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAASL,EAAIK,OAEbC,EAAON,EAAIM,KAEXC,EAAUP,EAAIO,QAEdC,KAEAC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWE,KAAMZ,QAExCa,IAIH,SAASC,GAASC,EAAMC,GACvBA,EAAMA,GAAOxB,CAEb,IAAIyB,GAASD,EAAIE,cAAe,SAEhCD,GAAOE,KAAOJ,EACdC,EAAII,KAAKC,YAAaJ,GAASK,WAAWC,YAAaN,GAQzD,GACCO,GAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,MAAO,IAAIF,GAAOG,GAAGC,KAAMH,EAAUC,IAKtCG,EAAQ,qCAGRC,EAAY,QACZC,EAAa,YAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,cAGhBX,GAAOG,GAAKH,EAAOY,WAGlBC,OAAQd,EAERe,YAAad,EAGbe,OAAQ,EAERC,QAAS,WACR,MAAOvC,GAAMU,KAAMhB,OAKpB8C,IAAK,SAAUC,GAGd,MAAY,OAAPA,EACGzC,EAAMU,KAAMhB,MAIb+C,EAAM,EAAI/C,KAAM+C,EAAM/C,KAAK4C,QAAW5C,KAAM+C,IAKpDC,UAAW,SAAUC,GAGpB,GAAIC,GAAMrB,EAAOsB,MAAOnD,KAAK2C,cAAeM,EAM5C,OAHAC,GAAIE,WAAapD,KAGVkD,GAIRG,KAAM,SAAUC,GACf,MAAOzB,GAAOwB,KAAMrD,KAAMsD,IAG3BC,IAAK,SAAUD,GACd,MAAOtD,MAAKgD,UAAWnB,EAAO0B,IAAKvD,KAAM,SAAUwD,EAAMC,GACxD,MAAOH,GAAStC,KAAMwC,EAAMC,EAAGD,OAIjClD,MAAO,WACN,MAAON,MAAKgD,UAAW1C,EAAMoD,MAAO1D,KAAM2D,aAG3CC,MAAO,WACN,MAAO5D,MAAK6D,GAAI,IAGjBC,KAAM,WACL,MAAO9D,MAAK6D,QAGbA,GAAI,SAAUJ,GACb,GAAIM,GAAM/D,KAAK4C,OACdoB,GAAKP,GAAMA,EAAI,EAAIM,EAAM,EAC1B,OAAO/D,MAAKgD,UAAWgB,GAAK,GAAKA,EAAID,GAAQ/D,KAAMgE,SAGpDC,IAAK,WACJ,MAAOjE,MAAKoD,YAAcpD,KAAK2C,eAKhCnC,KAAMA,EACN0D,KAAMhE,EAAIgE,KACVC,OAAQjE,EAAIiE,QAGbtC,EAAOuC,OAASvC,EAAOG,GAAGoC,OAAS,WAClC,GAAIC,GAASC,EAAMC,EAAKC,EAAMC,EAAaC,EAC1CC,EAAShB,UAAW,OACpBF,EAAI,EACJb,EAASe,UAAUf,OACnBgC,GAAO,CAsBR,KAnBuB,iBAAXD,KACXC,EAAOD,EAGPA,EAAShB,UAAWF,OACpBA,KAIsB,gBAAXkB,IAAwB9C,EAAOgD,WAAYF,KACtDA,MAIIlB,IAAMb,IACV+B,EAAS3E,KACTyD,KAGOA,EAAIb,EAAQa,IAGnB,GAAqC,OAA9BY,EAAUV,UAAWF,IAG3B,IAAMa,IAAQD,GACbE,EAAMI,EAAQL,GACdE,EAAOH,EAASC,GAGXK,IAAWH,IAKXI,GAAQJ,IAAU3C,EAAOiD,cAAeN,KAC1CC,EAAc5C,EAAOkD,QAASP,MAE3BC,GACJA,GAAc,EACdC,EAAQH,GAAO1C,EAAOkD,QAASR,GAAQA,MAGvCG,EAAQH,GAAO1C,EAAOiD,cAAeP,GAAQA,KAI9CI,EAAQL,GAASzC,EAAOuC,OAAQQ,EAAMF,EAAOF,IAGzBQ,SAATR,IACXG,EAAQL,GAASE,GAOrB,OAAOG,IAGR9C,EAAOuC,QAGNa,QAAS,UAAarD,EAAUsD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,KAAM,IAAIzF,OAAOyF,IAGlBC,KAAM,aAENX,WAAY,SAAUY,GACrB,MAA8B,aAAvB5D,EAAO6D,KAAMD,IAGrBV,QAASY,MAAMZ,QAEfa,SAAU,SAAUH,GACnB,MAAc,OAAPA,GAAeA,IAAQA,EAAI1F,QAGnC8F,UAAW,SAAUJ,GAKpB,GAAIC,GAAO7D,EAAO6D,KAAMD,EACxB,QAAkB,WAATC,GAA8B,WAATA,KAK5BI,MAAOL,EAAMM,WAAYN,KAG5BX,cAAe,SAAUW,GACxB,GAAIO,GAAOC,CAIX,UAAMR,GAAgC,oBAAzB9E,EAASK,KAAMyE,QAI5BO,EAAQ7F,EAAUsF,MAQlBQ,EAAOrF,EAAOI,KAAMgF,EAAO,gBAAmBA,EAAMrD,YAC7B,kBAATsD,IAAuBnF,EAAWE,KAAMiF,KAAWlF,KAGlEmF,cAAe,SAAUT,GAIxB,GAAInB,EAEJ,KAAMA,IAAQmB,GACb,OAAO,CAER,QAAO,GAGRC,KAAM,SAAUD,GACf,MAAY,OAAPA,EACGA,EAAM,GAIQ,gBAARA,IAAmC,kBAARA,GACxC/E,EAAYC,EAASK,KAAMyE,KAAW,eAC/BA,IAITU,WAAY,SAAUhF,GACrBD,EAASC,IAMViF,UAAW,SAAUC,GACpB,MAAOA,GAAOjB,QAASjD,EAAW,OAAQiD,QAAShD,EAAYC,IAGhEiE,SAAU,SAAU9C,EAAMc,GACzB,MAAOd,GAAK8C,UAAY9C,EAAK8C,SAASC,gBAAkBjC,EAAKiC,eAG9DlD,KAAM,SAAUoC,EAAKnC,GACpB,GAAIV,GAAQa,EAAI,CAEhB,IAAK+C,EAAaf,IAEjB,IADA7C,EAAS6C,EAAI7C,OACLa,EAAIb,EAAQa,IACnB,GAAKH,EAAStC,KAAMyE,EAAKhC,GAAKA,EAAGgC,EAAKhC,OAAU,EAC/C,UAIF,KAAMA,IAAKgC,GACV,GAAKnC,EAAStC,KAAMyE,EAAKhC,GAAKA,EAAGgC,EAAKhC,OAAU,EAC/C,KAKH,OAAOgC,IAIRgB,KAAM,SAAUlF,GACf,MAAe,OAARA,EACN,IACEA,EAAO,IAAK6D,QAASlD,EAAO,KAIhCwE,UAAW,SAAUxG,EAAKyG,GACzB,GAAIzD,GAAMyD,KAaV,OAXY,OAAPzG,IACCsG,EAAapG,OAAQF,IACzB2B,EAAOsB,MAAOD,EACE,gBAARhD,IACLA,GAAQA,GAGXM,EAAKQ,KAAMkC,EAAKhD,IAIXgD,GAGR0D,QAAS,SAAUpD,EAAMtD,EAAKuD,GAC7B,MAAc,OAAPvD,KAAmBO,EAAQO,KAAMd,EAAKsD,EAAMC,IAKpDN,MAAO,SAAUS,EAAOiD,GAKvB,IAJA,GAAI9C,IAAO8C,EAAOjE,OACjBoB,EAAI,EACJP,EAAIG,EAAMhB,OAEHoB,EAAID,EAAKC,IAChBJ,EAAOH,KAAQoD,EAAQ7C,EAKxB,OAFAJ,GAAMhB,OAASa,EAERG,GAGRkD,KAAM,SAAU7D,EAAOK,EAAUyD,GAShC,IARA,GAAIC,GACHC,KACAxD,EAAI,EACJb,EAASK,EAAML,OACfsE,GAAkBH,EAIXtD,EAAIb,EAAQa,IACnBuD,GAAmB1D,EAAUL,EAAOQ,GAAKA,GACpCuD,IAAoBE,GACxBD,EAAQzG,KAAMyC,EAAOQ,GAIvB,OAAOwD,IAIR1D,IAAK,SAAUN,EAAOK,EAAU6D,GAC/B,GAAIvE,GAAQwE,EACX3D,EAAI,EACJP,IAGD,IAAKsD,EAAavD,GAEjB,IADAL,EAASK,EAAML,OACPa,EAAIb,EAAQa,IACnB2D,EAAQ9D,EAAUL,EAAOQ,GAAKA,EAAG0D,GAEnB,MAATC,GACJlE,EAAI1C,KAAM4G,OAMZ,KAAM3D,IAAKR,GACVmE,EAAQ9D,EAAUL,EAAOQ,GAAKA,EAAG0D,GAEnB,MAATC,GACJlE,EAAI1C,KAAM4G,EAMb,OAAO7G,GAAOmD,SAAWR,IAI1BmE,KAAM,EAINC,MAAO,SAAUtF,EAAID,GACpB,GAAIwF,GAAKC,EAAMF,CAUf,IARwB,gBAAZvF,KACXwF,EAAMvF,EAAID,GACVA,EAAUC,EACVA,EAAKuF,GAKA1F,EAAOgD,WAAY7C,GAazB,MARAwF,GAAOlH,EAAMU,KAAM2C,UAAW,GAC9B2D,EAAQ,WACP,MAAOtF,GAAG0B,MAAO3B,GAAW/B,KAAMwH,EAAKjH,OAAQD,EAAMU,KAAM2C,cAI5D2D,EAAMD,KAAOrF,EAAGqF,KAAOrF,EAAGqF,MAAQxF,EAAOwF,OAElCC,GAGRG,IAAKC,KAAKD,IAIVxG,QAASA,IAGa,kBAAX0G,UACX9F,EAAOG,GAAI2F,OAAOC,UAAa1H,EAAKyH,OAAOC,WAI5C/F,EAAOwB,KAAM,uEAAuEwE,MAAO,KAC3F,SAAUpE,EAAGa,GACZ5D,EAAY,WAAa4D,EAAO,KAAQA,EAAKiC,eAG9C,SAASC,GAAaf,GAMrB,GAAI7C,KAAW6C,GAAO,UAAYA,IAAOA,EAAI7C,OAC5C8C,EAAO7D,EAAO6D,KAAMD,EAErB,OAAc,aAATC,IAAuB7D,EAAO+D,SAAUH,KAI7B,UAATC,GAA+B,IAAX9C,GACR,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAO6C,IAEhE,GAAIqC,GAWJ,SAAW/H,GAEX,GAAI0D,GACHxC,EACA8G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACA5I,EACA6I,EACAC,EACAC,EACAC,EACA3B,EACA4B,EAGA5D,EAAU,SAAW,EAAI,GAAIyC,MAC7BoB,EAAe/I,EAAOH,SACtBmJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVhB,GAAe,GAET,GAIR3H,KAAcC,eACdX,KACAsJ,EAAMtJ,EAAIsJ,IACVC,EAAcvJ,EAAIM,KAClBA,EAAON,EAAIM,KACXF,EAAQJ,EAAII,MAGZG,EAAU,SAAUiJ,EAAMlG,GAGzB,IAFA,GAAIC,GAAI,EACPM,EAAM2F,EAAK9G,OACJa,EAAIM,EAAKN,IAChB,GAAKiG,EAAKjG,KAAOD,EAChB,MAAOC,EAGT,WAGDkG,EAAW,6HAKXC,EAAa,sBAGbC,EAAa,gCAGbC,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAE9D,gBAAkBA,EAElB,2DAA6DC,EAAa,OAASD,EACnF,OAEDG,EAAU,KAAOF,EAAa,wFAKAC,EAAa,eAM3CE,EAAc,GAAIC,QAAQL,EAAa,IAAK,KAC5C1H,EAAQ,GAAI+H,QAAQ,IAAML,EAAa,8BAAgCA,EAAa,KAAM,KAE1FM,EAAS,GAAID,QAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DO,EAAe,GAAIF,QAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FQ,EAAmB,GAAIH,QAAQ,IAAML,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FS,EAAU,GAAIJ,QAAQF,GACtBO,EAAc,GAAIL,QAAQ,IAAMJ,EAAa,KAE7CU,GACCC,GAAM,GAAIP,QAAQ,MAAQJ,EAAa,KACvCY,MAAS,GAAIR,QAAQ,QAAUJ,EAAa,KAC5Ca,IAAO,GAAIT,QAAQ,KAAOJ,EAAa,SACvCc,KAAQ,GAAIV,QAAQ,IAAMH,GAC1Bc,OAAU,GAAIX,QAAQ,IAAMF,GAC5Bc,MAAS,GAAIZ,QAAQ,yDAA2DL,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCkB,KAAQ,GAAIb,QAAQ,OAASN,EAAW,KAAM,KAG9CoB,aAAgB,GAAId,QAAQ,IAAML,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEoB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,EAAW,OAIXC,EAAY,GAAIpB,QAAQ,qBAAuBL,EAAa,MAAQA,EAAa,OAAQ,MACzF0B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACAE,EAAO,EAENC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,MAAKA,GAGQ,OAAPD,EACG,SAIDA,EAAGzL,MAAO,MAAU,KAAOyL,EAAGE,WAAYF,EAAGnJ,OAAS,GAAIjC,SAAU,IAAO,IAI5E,KAAOoL,GAOfG,GAAgB,WACf1D,KAGD2D,GAAmBC,GAClB,SAAU5I,GACT,MAAOA,GAAK6I,YAAa,IAAS,QAAU7I,IAAQ,SAAWA,MAE9D8I,IAAK,aAAcC,KAAM,UAI7B,KACC/L,EAAKkD,MACHxD,EAAMI,EAAMU,KAAM8H,EAAa0D,YAChC1D,EAAa0D,YAIdtM,EAAK4I,EAAa0D,WAAW5J,QAAS6J,SACrC,MAAQC,IACTlM,GAASkD,MAAOxD,EAAI0C,OAGnB,SAAU+B,EAAQgI,GACjBlD,EAAY/F,MAAOiB,EAAQrE,EAAMU,KAAK2L,KAKvC,SAAUhI,EAAQgI,GACjB,GAAI3I,GAAIW,EAAO/B,OACda,EAAI,CAEL,OAASkB,EAAOX,KAAO2I,EAAIlJ,MAC3BkB,EAAO/B,OAASoB,EAAI,IAKvB,QAAS8D,IAAQhG,EAAUC,EAAS4E,EAASiG,GAC5C,GAAIC,GAAGpJ,EAAGD,EAAMsJ,EAAKC,EAAOC,EAAQC,EACnCC,EAAanL,GAAWA,EAAQoL,cAGhCV,EAAW1K,EAAUA,EAAQ0K,SAAW,CAKzC,IAHA9F,EAAUA,MAGe,gBAAb7E,KAA0BA,GACxB,IAAb2K,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAO9F,EAIR,KAAMiG,KAEE7K,EAAUA,EAAQoL,eAAiBpL,EAAU+G,KAAmBlJ,GACtE4I,EAAazG,GAEdA,EAAUA,GAAWnC,EAEhB8I,GAAiB,CAIrB,GAAkB,KAAb+D,IAAoBM,EAAQ5B,EAAWiC,KAAMtL,IAGjD,GAAM+K,EAAIE,EAAM,IAGf,GAAkB,IAAbN,EAAiB,CACrB,KAAMjJ,EAAOzB,EAAQsL,eAAgBR,IAUpC,MAAOlG,EALP,IAAKnD,EAAK8J,KAAOT,EAEhB,MADAlG,GAAQnG,KAAMgD,GACPmD,MAYT,IAAKuG,IAAe1J,EAAO0J,EAAWG,eAAgBR,KACrDhE,EAAU9G,EAASyB,IACnBA,EAAK8J,KAAOT,EAGZ,MADAlG,GAAQnG,KAAMgD,GACPmD,MAKH,CAAA,GAAKoG,EAAM,GAEjB,MADAvM,GAAKkD,MAAOiD,EAAS5E,EAAQwL,qBAAsBzL,IAC5C6E,CAGD,KAAMkG,EAAIE,EAAM,KAAO9L,EAAQuM,wBACrCzL,EAAQyL,uBAGR,MADAhN,GAAKkD,MAAOiD,EAAS5E,EAAQyL,uBAAwBX,IAC9ClG,EAKT,GAAK1F,EAAQwM,MACXrE,EAAetH,EAAW,QACzB6G,IAAcA,EAAU+E,KAAM5L,IAAc,CAE9C,GAAkB,IAAb2K,EACJS,EAAanL,EACbkL,EAAcnL,MAMR,IAAwC,WAAnCC,EAAQuE,SAASC,cAA6B,EAGnDuG,EAAM/K,EAAQ4L,aAAc,OACjCb,EAAMA,EAAI1H,QAASyG,GAAYC,IAE/B/J,EAAQ6L,aAAc,KAAOd,EAAM7H,GAIpC+H,EAAS9E,EAAUpG,GACnB2B,EAAIuJ,EAAOpK,MACX,OAAQa,IACPuJ,EAAOvJ,GAAK,IAAMqJ,EAAM,IAAMe,GAAYb,EAAOvJ,GAElDwJ,GAAcD,EAAOc,KAAM,KAG3BZ,EAAa9B,EAASsC,KAAM5L,IAAciM,GAAahM,EAAQL,aAC9DK,EAGF,GAAKkL,EACJ,IAIC,MAHAzM,GAAKkD,MAAOiD,EACXuG,EAAWc,iBAAkBf,IAEvBtG,EACN,MAAQsH,IACR,QACInB,IAAQ7H,GACZlD,EAAQmM,gBAAiB,QAS/B,MAAO9F,GAAQtG,EAASsD,QAASlD,EAAO,MAAQH,EAAS4E,EAASiG,GASnE,QAAS1D,MACR,GAAIiF,KAEJ,SAASC,GAAOC,EAAKjH,GAMpB,MAJK+G,GAAK3N,KAAM6N,EAAM,KAAQtG,EAAKuG,mBAE3BF,GAAOD,EAAKI,SAEZH,EAAOC,EAAM,KAAQjH,EAE9B,MAAOgH,GAOR,QAASI,IAAcxM,GAEtB,MADAA,GAAIiD,IAAY,EACTjD,EAOR,QAASyM,IAAQzM,GAChB,GAAI0M,GAAK9O,EAAS0B,cAAc,WAEhC,KACC,QAASU,EAAI0M,GACZ,MAAOhC,GACR,OAAO,EACN,QAEIgC,EAAGhN,YACPgN,EAAGhN,WAAWC,YAAa+M,GAG5BA,EAAK,MASP,QAASC,IAAWC,EAAOC,GAC1B,GAAI3O,GAAM0O,EAAM/G,MAAM,KACrBpE,EAAIvD,EAAI0C,MAET,OAAQa,IACPsE,EAAK+G,WAAY5O,EAAIuD,IAAOoL,EAU9B,QAASE,IAAczF,EAAGC,GACzB,GAAIyF,GAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAEmD,UAAiC,IAAflD,EAAEkD,UACnCnD,EAAE4F,YAAc3F,EAAE2F,WAGpB,IAAKD,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQzF,EACZ,QAKH,OAAOD,GAAI,KAOZ,QAAS8F,IAAmB1J,GAC3B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAK8C,SAASC,aACzB,OAAgB,UAATjC,GAAoBd,EAAKkC,OAASA,GAQ3C,QAAS2J,IAAoB3J,GAC5B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAK8C,SAASC,aACzB,QAAiB,UAATjC,GAA6B,WAATA,IAAsBd,EAAKkC,OAASA,GAQlE,QAAS4J,IAAsBjD,GAG9B,MAAO,UAAU7I,GAKhB,MAAK,QAAUA,GASTA,EAAK9B,YAAc8B,EAAK6I,YAAa,EAGpC,SAAW7I,GACV,SAAWA,GAAK9B,WACb8B,EAAK9B,WAAW2K,WAAaA,EAE7B7I,EAAK6I,WAAaA,EAMpB7I,EAAK+L,aAAelD,GAI1B7I,EAAK+L,cAAgBlD,GACpBF,GAAkB3I,KAAW6I,EAGzB7I,EAAK6I,WAAaA,EAKd,SAAW7I,IACfA,EAAK6I,WAAaA,GAY5B,QAASmD,IAAwBxN,GAChC,MAAOwM,IAAa,SAAUiB,GAE7B,MADAA,IAAYA,EACLjB,GAAa,SAAU5B,EAAM3F,GACnC,GAAIjD,GACH0L,EAAe1N,KAAQ4K,EAAKhK,OAAQ6M,GACpChM,EAAIiM,EAAa9M,MAGlB,OAAQa,IACFmJ,EAAO5I,EAAI0L,EAAajM,MAC5BmJ,EAAK5I,KAAOiD,EAAQjD,GAAK4I,EAAK5I,SAYnC,QAAS+J,IAAahM,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQwL,sBAAwCxL,EAI1Ed,EAAU6G,GAAO7G,WAOjBgH,EAAQH,GAAOG,MAAQ,SAAUzE,GAGhC,GAAImM,GAAkBnM,IAASA,EAAK2J,eAAiB3J,GAAMmM,eAC3D,SAAOA,GAA+C,SAA7BA,EAAgBrJ,UAQ1CkC,EAAcV,GAAOU,YAAc,SAAUoH,GAC5C,GAAIC,GAAYC,EACf1O,EAAMwO,EAAOA,EAAKzC,eAAiByC,EAAO9G,CAG3C,OAAK1H,KAAQxB,GAA6B,IAAjBwB,EAAIqL,UAAmBrL,EAAIuO,iBAKpD/P,EAAWwB,EACXqH,EAAU7I,EAAS+P,gBACnBjH,GAAkBT,EAAOrI,GAIpBkJ,IAAiBlJ,IACpBkQ,EAAYlQ,EAASmQ,cAAgBD,EAAUE,MAAQF,IAGnDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KAUrCjL,EAAQ6I,WAAa2E,GAAO,SAAUC,GAErC,MADAA,GAAGyB,UAAY,KACPzB,EAAGf,aAAa,eAOzB1M,EAAQsM,qBAAuBkB,GAAO,SAAUC,GAE/C,MADAA,GAAGjN,YAAa7B,EAASwQ,cAAc,MAC/B1B,EAAGnB,qBAAqB,KAAK3K,SAItC3B,EAAQuM,uBAAyBtC,EAAQwC,KAAM9N,EAAS4N,wBAMxDvM,EAAQoP,QAAU5B,GAAO,SAAUC,GAElC,MADAjG,GAAQhH,YAAaiN,GAAKpB,GAAKrI,GACvBrF,EAAS0Q,oBAAsB1Q,EAAS0Q,kBAAmBrL,GAAUrC,SAIzE3B,EAAQoP,SACZtI,EAAKwI,OAAW,GAAI,SAAUjD,GAC7B,GAAIkD,GAASlD,EAAGlI,QAASiG,EAAWC,GACpC,OAAO,UAAU9H,GAChB,MAAOA,GAAKmK,aAAa,QAAU6C,IAGrCzI,EAAK0I,KAAS,GAAI,SAAUnD,EAAIvL,GAC/B,GAAuC,mBAA3BA,GAAQsL,gBAAkC3E,EAAiB,CACtE,GAAIlF,GAAOzB,EAAQsL,eAAgBC,EACnC,OAAO9J,IAASA,UAIlBuE,EAAKwI,OAAW,GAAK,SAAUjD,GAC9B,GAAIkD,GAASlD,EAAGlI,QAASiG,EAAWC,GACpC,OAAO,UAAU9H,GAChB,GAAIoM,GAAwC,mBAA1BpM,GAAKkN,kBACtBlN,EAAKkN,iBAAiB,KACvB,OAAOd,IAAQA,EAAKxI,QAAUoJ,IAMhCzI,EAAK0I,KAAS,GAAI,SAAUnD,EAAIvL,GAC/B,GAAuC,mBAA3BA,GAAQsL,gBAAkC3E,EAAiB,CACtE,GAAIkH,GAAMnM,EAAGR,EACZO,EAAOzB,EAAQsL,eAAgBC,EAEhC,IAAK9J,EAAO,CAIX,GADAoM,EAAOpM,EAAKkN,iBAAiB,MACxBd,GAAQA,EAAKxI,QAAUkG,EAC3B,OAAS9J,EAIVP,GAAQlB,EAAQuO,kBAAmBhD,GACnC7J,EAAI,CACJ,OAASD,EAAOP,EAAMQ,KAErB,GADAmM,EAAOpM,EAAKkN,iBAAiB,MACxBd,GAAQA,EAAKxI,QAAUkG,EAC3B,OAAS9J,GAKZ,YAMHuE,EAAK0I,KAAU,IAAIxP,EAAQsM,qBAC1B,SAAUoD,EAAK5O,GACd,MAA6C,mBAAjCA,GAAQwL,qBACZxL,EAAQwL,qBAAsBoD,GAG1B1P,EAAQwM,IACZ1L,EAAQiM,iBAAkB2C,GAD3B,QAKR,SAAUA,EAAK5O,GACd,GAAIyB,GACH+D,KACA9D,EAAI,EAEJkD,EAAU5E,EAAQwL,qBAAsBoD,EAGzC,IAAa,MAARA,EAAc,CAClB,MAASnN,EAAOmD,EAAQlD,KACA,IAAlBD,EAAKiJ,UACTlF,EAAI/G,KAAMgD,EAIZ,OAAO+D,GAER,MAAOZ,IAIToB,EAAK0I,KAAY,MAAIxP,EAAQuM,wBAA0B,SAAU2C,EAAWpO,GAC3E,GAA+C,mBAAnCA,GAAQyL,wBAA0C9E,EAC7D,MAAO3G,GAAQyL,uBAAwB2C,IAUzCvH,KAOAD,MAEM1H,EAAQwM,IAAMvC,EAAQwC,KAAM9N,EAASoO,qBAG1CS,GAAO,SAAUC,GAMhBjG,EAAQhH,YAAaiN,GAAKkC,UAAY,UAAY3L,EAAU,qBAC1CA,EAAU,kEAOvByJ,EAAGV,iBAAiB,wBAAwBpL,QAChD+F,EAAUnI,KAAM,SAAWoJ,EAAa,gBAKnC8E,EAAGV,iBAAiB,cAAcpL,QACvC+F,EAAUnI,KAAM,MAAQoJ,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/I,EAAU,MAAOrC,QACrD+F,EAAUnI,KAAK,MAMVkO,EAAGV,iBAAiB,YAAYpL,QACrC+F,EAAUnI,KAAK,YAMVkO,EAAGV,iBAAkB,KAAO/I,EAAU,MAAOrC,QAClD+F,EAAUnI,KAAK,cAIjBiO,GAAO,SAAUC,GAChBA,EAAGkC,UAAY,mFAKf,IAAIC,GAAQjR,EAAS0B,cAAc,QACnCuP,GAAMjD,aAAc,OAAQ,UAC5Bc,EAAGjN,YAAaoP,GAAQjD,aAAc,OAAQ,KAIzCc,EAAGV,iBAAiB,YAAYpL,QACpC+F,EAAUnI,KAAM,OAASoJ,EAAa,eAKS,IAA3C8E,EAAGV,iBAAiB,YAAYpL,QACpC+F,EAAUnI,KAAM,WAAY,aAK7BiI,EAAQhH,YAAaiN,GAAKrC,UAAW,EACY,IAA5CqC,EAAGV,iBAAiB,aAAapL,QACrC+F,EAAUnI,KAAM,WAAY,aAI7BkO,EAAGV,iBAAiB,QACpBrF,EAAUnI,KAAK,YAIXS,EAAQ6P,gBAAkB5F,EAAQwC,KAAOzG,EAAUwB,EAAQxB,SAChEwB,EAAQsI,uBACRtI,EAAQuI,oBACRvI,EAAQwI,kBACRxI,EAAQyI,qBAERzC,GAAO,SAAUC,GAGhBzN,EAAQkQ,kBAAoBlK,EAAQjG,KAAM0N,EAAI,KAI9CzH,EAAQjG,KAAM0N,EAAI,aAClB9F,EAAcpI,KAAM,KAAMuJ,KAI5BpB,EAAYA,EAAU/F,QAAU,GAAIqH,QAAQtB,EAAUmF,KAAK,MAC3DlF,EAAgBA,EAAchG,QAAU,GAAIqH,QAAQrB,EAAckF,KAAK,MAIvE+B,EAAa3E,EAAQwC,KAAMjF,EAAQ2I,yBAKnCvI,EAAWgH,GAAc3E,EAAQwC,KAAMjF,EAAQI,UAC9C,SAAUS,EAAGC,GACZ,GAAI8H,GAAuB,IAAf/H,EAAEmD,SAAiBnD,EAAEqG,gBAAkBrG,EAClDgI,EAAM/H,GAAKA,EAAE7H,UACd,OAAO4H,KAAMgI,MAAWA,GAAwB,IAAjBA,EAAI7E,YAClC4E,EAAMxI,SACLwI,EAAMxI,SAAUyI,GAChBhI,EAAE8H,yBAA8D,GAAnC9H,EAAE8H,wBAAyBE,MAG3D,SAAUhI,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAE7H,WACd,GAAK6H,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAYwG,EACZ,SAAUvG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAIR,IAAIgJ,IAAWjI,EAAE8H,yBAA2B7H,EAAE6H,uBAC9C,OAAKG,GACGA,GAIRA,GAAYjI,EAAE6D,eAAiB7D,MAAUC,EAAE4D,eAAiB5D,GAC3DD,EAAE8H,wBAAyB7H,GAG3B,EAGc,EAAVgI,IACFtQ,EAAQuQ,cAAgBjI,EAAE6H,wBAAyB9H,KAAQiI,EAGxDjI,IAAM1J,GAAY0J,EAAE6D,gBAAkBrE,GAAgBD,EAASC,EAAcQ,MAG7EC,IAAM3J,GAAY2J,EAAE4D,gBAAkBrE,GAAgBD,EAASC,EAAcS,GAC1E,EAIDjB,EACJ7H,EAAS6H,EAAWgB,GAAM7I,EAAS6H,EAAWiB,GAChD,EAGe,EAAVgI,KAAmB,IAE3B,SAAUjI,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAGR,IAAIyG,GACHvL,EAAI,EACJgO,EAAMnI,EAAE5H,WACR4P,EAAM/H,EAAE7H,WACRgQ,GAAOpI,GACPqI,GAAOpI,EAGR,KAAMkI,IAAQH,EACb,MAAOhI,KAAM1J,KACZ2J,IAAM3J,EAAW,EACjB6R,KACAH,EAAM,EACNhJ,EACE7H,EAAS6H,EAAWgB,GAAM7I,EAAS6H,EAAWiB,GAChD,CAGK,IAAKkI,IAAQH,EACnB,MAAOvC,IAAczF,EAAGC,EAIzByF,GAAM1F,CACN,OAAS0F,EAAMA,EAAItN,WAClBgQ,EAAGE,QAAS5C,EAEbA,GAAMzF,CACN,OAASyF,EAAMA,EAAItN,WAClBiQ,EAAGC,QAAS5C,EAIb,OAAQ0C,EAAGjO,KAAOkO,EAAGlO,GACpBA,GAGD,OAAOA,GAENsL,GAAc2C,EAAGjO,GAAIkO,EAAGlO,IAGxBiO,EAAGjO,KAAOqF,KACV6I,EAAGlO,KAAOqF,EAAe,EACzB,GAGKlJ,GA3YCA,GA8YTkI,GAAOb,QAAU,SAAU4K,EAAMC,GAChC,MAAOhK,IAAQ+J,EAAM,KAAM,KAAMC,IAGlChK,GAAOgJ,gBAAkB,SAAUtN,EAAMqO,GASxC,IAPOrO,EAAK2J,eAAiB3J,KAAW5D,GACvC4I,EAAahF,GAIdqO,EAAOA,EAAKzM,QAASgF,EAAkB,UAElCnJ,EAAQ6P,iBAAmBpI,IAC9BU,EAAeyI,EAAO,QACpBjJ,IAAkBA,EAAc8E,KAAMmE,OACtClJ,IAAkBA,EAAU+E,KAAMmE,IAErC,IACC,GAAI3O,GAAM+D,EAAQjG,KAAMwC,EAAMqO,EAG9B,IAAK3O,GAAOjC,EAAQkQ,mBAGlB3N,EAAK5D,UAAuC,KAA3B4D,EAAK5D,SAAS6M,SAChC,MAAOvJ,GAEP,MAAOwJ,IAGV,MAAO5E,IAAQ+J,EAAMjS,EAAU,MAAQ4D,IAASZ,OAAS,GAG1DkF,GAAOe,SAAW,SAAU9G,EAASyB,GAKpC,OAHOzB,EAAQoL,eAAiBpL,KAAcnC,GAC7C4I,EAAazG,GAEP8G,EAAU9G,EAASyB,IAG3BsE,GAAOiK,KAAO,SAAUvO,EAAMc,IAEtBd,EAAK2J,eAAiB3J,KAAW5D,GACvC4I,EAAahF,EAGd,IAAIxB,GAAK+F,EAAK+G,WAAYxK,EAAKiC,eAE9ByL,EAAMhQ,GAAMpB,EAAOI,KAAM+G,EAAK+G,WAAYxK,EAAKiC,eAC9CvE,EAAIwB,EAAMc,GAAOoE,GACjB1D,MAEF,OAAeA,UAARgN,EACNA,EACA/Q,EAAQ6I,aAAepB,EACtBlF,EAAKmK,aAAcrJ,IAClB0N,EAAMxO,EAAKkN,iBAAiBpM,KAAU0N,EAAIC,UAC1CD,EAAI5K,MACJ,MAGJU,GAAOoK,OAAS,SAAUC,GACzB,OAAQA,EAAM,IAAI/M,QAASyG,GAAYC,KAGxChE,GAAOxC,MAAQ,SAAUC,GACxB,KAAM,IAAIzF,OAAO,0CAA4CyF,IAO9DuC,GAAOsK,WAAa,SAAUzL,GAC7B,GAAInD,GACH6O,KACArO,EAAI,EACJP,EAAI,CAOL,IAJA8E,GAAgBtH,EAAQqR,iBACxBhK,GAAarH,EAAQsR,YAAc5L,EAAQrG,MAAO,GAClDqG,EAAQzC,KAAMmF,GAETd,EAAe,CACnB,MAAS/E,EAAOmD,EAAQlD,KAClBD,IAASmD,EAASlD,KACtBO,EAAIqO,EAAW7R,KAAMiD,GAGvB,OAAQO,IACP2C,EAAQxC,OAAQkO,EAAYrO,GAAK,GAQnC,MAFAsE,GAAY,KAEL3B,GAORqB,EAAUF,GAAOE,QAAU,SAAUxE,GACpC,GAAIoM,GACH1M,EAAM,GACNO,EAAI,EACJgJ,EAAWjJ,EAAKiJ,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBjJ,GAAKgP,YAChB,MAAOhP,GAAKgP,WAGZ,KAAMhP,EAAOA,EAAKiP,WAAYjP,EAAMA,EAAOA,EAAK2L,YAC/CjM,GAAO8E,EAASxE,OAGZ,IAAkB,IAAbiJ,GAA+B,IAAbA,EAC7B,MAAOjJ,GAAKkP,cAhBZ,OAAS9C,EAAOpM,EAAKC,KAEpBP,GAAO8E,EAAS4H,EAkBlB,OAAO1M,IAGR6E,EAAOD,GAAO6K,WAGbrE,YAAa,GAEbsE,aAAcpE,GAEdzB,MAAOxC,EAEPuE,cAEA2B,QAEAoC,UACCC,KAAOxG,IAAK,aAAc1I,OAAO,GACjCmP,KAAOzG,IAAK,cACZ0G,KAAO1G,IAAK,kBAAmB1I,OAAO,GACtCqP,KAAO3G,IAAK,oBAGb4G,WACCvI,KAAQ,SAAUoC,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAG3H,QAASiG,EAAWC,IAGxCyB,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAK3H,QAASiG,EAAWC,IAExD,OAAbyB,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMzM,MAAO,EAAG,IAGxBuK,MAAS,SAAUkC,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAGxG,cAEY,QAA3BwG,EAAM,GAAGzM,MAAO,EAAG,IAEjByM,EAAM,IACXjF,GAAOxC,MAAOyH,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBjF,GAAOxC,MAAOyH,EAAM,IAGdA,GAGRnC,OAAU,SAAUmC,GACnB,GAAIoG,GACHC,GAAYrG,EAAM,IAAMA,EAAM,EAE/B,OAAKxC,GAAiB,MAAEmD,KAAMX,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxBqG,GAAY/I,EAAQqD,KAAM0F,KAEpCD,EAASjL,EAAUkL,GAAU,MAE7BD,EAASC,EAAS3S,QAAS,IAAK2S,EAASxQ,OAASuQ,GAAWC,EAASxQ,UAGvEmK,EAAM,GAAKA,EAAM,GAAGzM,MAAO,EAAG6S,GAC9BpG,EAAM,GAAKqG,EAAS9S,MAAO,EAAG6S,IAIxBpG,EAAMzM,MAAO,EAAG,MAIzBiQ,QAEC7F,IAAO,SAAU2I,GAChB,GAAI/M,GAAW+M,EAAiBjO,QAASiG,EAAWC,IAAY/E,aAChE,OAA4B,MAArB8M,EACN,WAAa,OAAO,GACpB,SAAU7P,GACT,MAAOA,GAAK8C,UAAY9C,EAAK8C,SAASC,gBAAkBD,IAI3DmE,MAAS,SAAU0F,GAClB,GAAImD,GAAUrK,EAAYkH,EAAY,IAEtC,OAAOmD,KACLA,EAAU,GAAIrJ,QAAQ,MAAQL,EAAa,IAAMuG,EAAY,IAAMvG,EAAa,SACjFX,EAAYkH,EAAW,SAAU3M,GAChC,MAAO8P,GAAQ5F,KAAgC,gBAAnBlK,GAAK2M,WAA0B3M,EAAK2M,WAA0C,mBAAtB3M,GAAKmK,cAAgCnK,EAAKmK,aAAa,UAAY,OAI1JhD,KAAQ,SAAUrG,EAAMiP,EAAUC,GACjC,MAAO,UAAUhQ,GAChB,GAAIiQ,GAAS3L,GAAOiK,KAAMvO,EAAMc,EAEhC,OAAe,OAAVmP,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOhT,QAAS+S,GAChC,OAAbD,EAAoBC,GAASC,EAAOhT,QAAS+S,MAChC,OAAbD,EAAoBC,GAASC,EAAOnT,OAAQkT,EAAM5Q,UAAa4Q,EAClD,OAAbD,GAAsB,IAAME,EAAOrO,QAAS4E,EAAa,KAAQ,KAAMvJ,QAAS+S,MACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOnT,MAAO,EAAGkT,EAAM5Q,OAAS,KAAQ4Q,EAAQ,QAK3F3I,MAAS,SAAUnF,EAAMgO,EAAMjE,EAAU7L,EAAOE,GAC/C,GAAI6P,GAAgC,QAAvBjO,EAAKpF,MAAO,EAAG,GAC3BsT,EAA+B,SAArBlO,EAAKpF,UACfuT,EAAkB,YAATH,CAEV,OAAiB,KAAV9P,GAAwB,IAATE,EAGrB,SAAUN,GACT,QAASA,EAAK9B,YAGf,SAAU8B,EAAMzB,EAAS+R,GACxB,GAAI1F,GAAO2F,EAAaC,EAAYpE,EAAMqE,EAAWC,EACpD5H,EAAMqH,IAAWC,EAAU,cAAgB,kBAC3CO,EAAS3Q,EAAK9B,WACd4C,EAAOuP,GAAUrQ,EAAK8C,SAASC,cAC/B6N,GAAYN,IAAQD,EACpB5E,GAAO,CAER,IAAKkF,EAAS,CAGb,GAAKR,EAAS,CACb,MAAQrH,EAAM,CACbsD,EAAOpM,CACP,OAASoM,EAAOA,EAAMtD,GACrB,GAAKuH,EACJjE,EAAKtJ,SAASC,gBAAkBjC,EACd,IAAlBsL,EAAKnD,SAEL,OAAO,CAITyH,GAAQ5H,EAAe,SAAT5G,IAAoBwO,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUN,EAAUO,EAAO1B,WAAa0B,EAAOE,WAG1CT,GAAWQ,EAAW,CAK1BxE,EAAOuE,EACPH,EAAapE,EAAM3K,KAAc2K,EAAM3K,OAIvC8O,EAAcC,EAAYpE,EAAK0E,YAC7BN,EAAYpE,EAAK0E,cAEnBlG,EAAQ2F,EAAarO,OACrBuO,EAAY7F,EAAO,KAAQrF,GAAWqF,EAAO,GAC7Ca,EAAOgF,GAAa7F,EAAO,GAC3BwB,EAAOqE,GAAaE,EAAO3H,WAAYyH,EAEvC,OAASrE,IAASqE,GAAarE,GAAQA,EAAMtD,KAG3C2C,EAAOgF,EAAY,IAAMC,EAAM1K,MAGhC,GAAuB,IAAlBoG,EAAKnD,YAAoBwC,GAAQW,IAASpM,EAAO,CACrDuQ,EAAarO,IAAWqD,EAASkL,EAAWhF,EAC5C,YAuBF,IAjBKmF,IAEJxE,EAAOpM,EACPwQ,EAAapE,EAAM3K,KAAc2K,EAAM3K,OAIvC8O,EAAcC,EAAYpE,EAAK0E,YAC7BN,EAAYpE,EAAK0E,cAEnBlG,EAAQ2F,EAAarO,OACrBuO,EAAY7F,EAAO,KAAQrF,GAAWqF,EAAO,GAC7Ca,EAAOgF,GAKHhF,KAAS,EAEb,MAASW,IAASqE,GAAarE,GAAQA,EAAMtD,KAC3C2C,EAAOgF,EAAY,IAAMC,EAAM1K,MAEhC,IAAOqK,EACNjE,EAAKtJ,SAASC,gBAAkBjC,EACd,IAAlBsL,EAAKnD,aACHwC,IAGGmF,IACJJ,EAAapE,EAAM3K,KAAc2K,EAAM3K,OAIvC8O,EAAcC,EAAYpE,EAAK0E,YAC7BN,EAAYpE,EAAK0E,cAEnBP,EAAarO,IAAWqD,EAASkG,IAG7BW,IAASpM,GACb,KASL,OADAyL,IAAQnL,EACDmL,IAASrL,GAAWqL,EAAOrL,IAAU,GAAKqL,EAAOrL,GAAS,KAKrEgH,OAAU,SAAU2J,EAAQ9E,GAK3B,GAAIjI,GACHxF,EAAK+F,EAAKgC,QAASwK,IAAYxM,EAAKyM,WAAYD,EAAOhO,gBACtDuB,GAAOxC,MAAO,uBAAyBiP,EAKzC,OAAKvS,GAAIiD,GACDjD,EAAIyN,GAIPzN,EAAGY,OAAS,GAChB4E,GAAS+M,EAAQA,EAAQ,GAAI9E,GACtB1H,EAAKyM,WAAW3T,eAAgB0T,EAAOhO,eAC7CiI,GAAa,SAAU5B,EAAM3F,GAC5B,GAAIwN,GACHC,EAAU1S,EAAI4K,EAAM6C,GACpBhM,EAAIiR,EAAQ9R,MACb,OAAQa,IACPgR,EAAMhU,EAASmM,EAAM8H,EAAQjR,IAC7BmJ,EAAM6H,KAAWxN,EAASwN,GAAQC,EAAQjR,MAG5C,SAAUD,GACT,MAAOxB,GAAIwB,EAAM,EAAGgE,KAIhBxF,IAIT+H,SAEC4K,IAAOnG,GAAa,SAAU1M,GAI7B,GAAI+O,MACHlK,KACAiO,EAAUzM,EAASrG,EAASsD,QAASlD,EAAO,MAE7C,OAAO0S,GAAS3P,GACfuJ,GAAa,SAAU5B,EAAM3F,EAASlF,EAAS+R,GAC9C,GAAItQ,GACHqR,EAAYD,EAAShI,EAAM,KAAMkH,MACjCrQ,EAAImJ,EAAKhK,MAGV,OAAQa,KACDD,EAAOqR,EAAUpR,MACtBmJ,EAAKnJ,KAAOwD,EAAQxD,GAAKD,MAI5B,SAAUA,EAAMzB,EAAS+R,GAKxB,MAJAjD,GAAM,GAAKrN,EACXoR,EAAS/D,EAAO,KAAMiD,EAAKnN,GAE3BkK,EAAM,GAAK,MACHlK,EAAQ6C,SAInBsL,IAAOtG,GAAa,SAAU1M,GAC7B,MAAO,UAAU0B,GAChB,MAAOsE,IAAQhG,EAAU0B,GAAOZ,OAAS,KAI3CiG,SAAY2F,GAAa,SAAUjN,GAElC,MADAA,GAAOA,EAAK6D,QAASiG,EAAWC,IACzB,SAAU9H,GAChB,OAASA,EAAKgP,aAAehP,EAAKuR,WAAa/M,EAASxE,IAAS/C,QAASc,SAW5EyT,KAAQxG,GAAc,SAAUwG,GAM/B,MAJM1K,GAAYoD,KAAKsH,GAAQ,KAC9BlN,GAAOxC,MAAO,qBAAuB0P,GAEtCA,EAAOA,EAAK5P,QAASiG,EAAWC,IAAY/E,cACrC,SAAU/C,GAChB,GAAIyR,EACJ,GACC,IAAMA,EAAWvM,EAChBlF,EAAKwR,KACLxR,EAAKmK,aAAa,aAAenK,EAAKmK,aAAa,QAGnD,MADAsH,GAAWA,EAAS1O,cACb0O,IAAaD,GAA2C,IAAnCC,EAASxU,QAASuU,EAAO,YAE5CxR,EAAOA,EAAK9B,aAAiC,IAAlB8B,EAAKiJ,SAC3C,QAAO,KAKT9H,OAAU,SAAUnB,GACnB,GAAI0R,GAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,IAC9C,OAAOA,IAAQA,EAAK5U,MAAO,KAAQkD,EAAK8J,IAGzC8H,KAAQ,SAAU5R,GACjB,MAAOA,KAASiF,GAGjB4M,MAAS,SAAU7R,GAClB,MAAOA,KAAS5D,EAAS0V,iBAAmB1V,EAAS2V,UAAY3V,EAAS2V,gBAAkB/R,EAAKkC,MAAQlC,EAAKgS,OAAShS,EAAKiS,WAI7HC,QAAWpG,IAAsB,GACjCjD,SAAYiD,IAAsB,GAElCqG,QAAW,SAAUnS,GAGpB,GAAI8C,GAAW9C,EAAK8C,SAASC,aAC7B,OAAqB,UAAbD,KAA0B9C,EAAKmS,SAA0B,WAAbrP,KAA2B9C,EAAKoS,UAGrFA,SAAY,SAAUpS,GAOrB,MAJKA,GAAK9B,YACT8B,EAAK9B,WAAWmU,cAGVrS,EAAKoS,YAAa,GAI1BE,MAAS,SAAUtS,GAKlB,IAAMA,EAAOA,EAAKiP,WAAYjP,EAAMA,EAAOA,EAAK2L,YAC/C,GAAK3L,EAAKiJ,SAAW,EACpB,OAAO,CAGT,QAAO,GAGR0H,OAAU,SAAU3Q,GACnB,OAAQuE,EAAKgC,QAAe,MAAGvG,IAIhCuS,OAAU,SAAUvS,GACnB,MAAOyH,GAAQyC,KAAMlK,EAAK8C,WAG3BuK,MAAS,SAAUrN,GAClB,MAAOwH,GAAQ0C,KAAMlK,EAAK8C,WAG3B0P,OAAU,SAAUxS,GACnB,GAAIc,GAAOd,EAAK8C,SAASC,aACzB,OAAgB,UAATjC,GAAkC,WAAdd,EAAKkC,MAA8B,WAATpB,GAGtD/C,KAAQ,SAAUiC,GACjB,GAAIuO,EACJ,OAAuC,UAAhCvO,EAAK8C,SAASC,eACN,SAAd/C,EAAKkC,OAImC,OAArCqM,EAAOvO,EAAKmK,aAAa,UAA2C,SAAvBoE,EAAKxL,gBAIvD3C,MAAS4L,GAAuB,WAC/B,OAAS,KAGV1L,KAAQ0L,GAAuB,SAAUE,EAAc9M,GACtD,OAASA,EAAS,KAGnBiB,GAAM2L,GAAuB,SAAUE,EAAc9M,EAAQ6M,GAC5D,OAASA,EAAW,EAAIA,EAAW7M,EAAS6M,KAG7CwG,KAAQzG,GAAuB,SAAUE,EAAc9M,GAEtD,IADA,GAAIa,GAAI,EACAA,EAAIb,EAAQa,GAAK,EACxBiM,EAAalP,KAAMiD,EAEpB,OAAOiM,KAGRwG,IAAO1G,GAAuB,SAAUE,EAAc9M,GAErD,IADA,GAAIa,GAAI,EACAA,EAAIb,EAAQa,GAAK,EACxBiM,EAAalP,KAAMiD,EAEpB,OAAOiM,KAGRyG,GAAM3G,GAAuB,SAAUE,EAAc9M,EAAQ6M,GAE5D,IADA,GAAIhM,GAAIgM,EAAW,EAAIA,EAAW7M,EAAS6M,IACjChM,GAAK,GACdiM,EAAalP,KAAMiD,EAEpB,OAAOiM,KAGR0G,GAAM5G,GAAuB,SAAUE,EAAc9M,EAAQ6M,GAE5D,IADA,GAAIhM,GAAIgM,EAAW,EAAIA,EAAW7M,EAAS6M,IACjChM,EAAIb,GACb8M,EAAalP,KAAMiD,EAEpB,OAAOiM,OAKV3H,EAAKgC,QAAa,IAAIhC,EAAKgC,QAAY,EAGvC,KAAMtG,KAAO4S,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E1O,EAAKgC,QAAStG,GAAM2L,GAAmB3L,EAExC,KAAMA,KAAOiT,QAAQ,EAAMC,OAAO,GACjC5O,EAAKgC,QAAStG,GAAM4L,GAAoB5L,EAIzC,SAAS+Q,OACTA,GAAW/R,UAAYsF,EAAK6O,QAAU7O,EAAKgC,QAC3ChC,EAAKyM,WAAa,GAAIA,IAEtBtM,EAAWJ,GAAOI,SAAW,SAAUpG,EAAU+U,GAChD,GAAInC,GAAS3H,EAAO+J,EAAQpR,EAC3BqR,EAAO/J,EAAQgK,EACfC,EAAS9N,EAAYrH,EAAW,IAEjC,IAAKmV,EACJ,MAAOJ,GAAY,EAAII,EAAO3W,MAAO,EAGtCyW,GAAQjV,EACRkL,KACAgK,EAAajP,EAAKmL,SAElB,OAAQ6D,EAAQ,CAGTrC,KAAY3H,EAAQ7C,EAAOkD,KAAM2J,MACjChK,IAEJgK,EAAQA,EAAMzW,MAAOyM,EAAM,GAAGnK,SAAYmU,GAE3C/J,EAAOxM,KAAOsW,OAGfpC,GAAU,GAGJ3H,EAAQ5C,EAAaiD,KAAM2J,MAChCrC,EAAU3H,EAAMwB,QAChBuI,EAAOtW,MACN4G,MAAOsN,EAEPhP,KAAMqH,EAAM,GAAG3H,QAASlD,EAAO,OAEhC6U,EAAQA,EAAMzW,MAAOoU,EAAQ9R,QAI9B,KAAM8C,IAAQqC,GAAKwI,SACZxD,EAAQxC,EAAW7E,GAAO0H,KAAM2J,KAAcC,EAAYtR,MAC9DqH,EAAQiK,EAAYtR,GAAQqH,MAC7B2H,EAAU3H,EAAMwB,QAChBuI,EAAOtW,MACN4G,MAAOsN,EACPhP,KAAMA,EACNuB,QAAS8F,IAEVgK,EAAQA,EAAMzW,MAAOoU,EAAQ9R,QAI/B,KAAM8R,EACL,MAOF,MAAOmC,GACNE,EAAMnU,OACNmU,EACCjP,GAAOxC,MAAOxD,GAEdqH,EAAYrH,EAAUkL,GAAS1M,MAAO,GAGzC,SAASuN,IAAYiJ,GAIpB,IAHA,GAAIrT,GAAI,EACPM,EAAM+S,EAAOlU,OACbd,EAAW,GACJ2B,EAAIM,EAAKN,IAChB3B,GAAYgV,EAAOrT,GAAG2D,KAEvB,OAAOtF,GAGR,QAASsK,IAAewI,EAASsC,EAAYC,GAC5C,GAAI7K,GAAM4K,EAAW5K,IACpB8K,EAAOF,EAAW3K,KAClB8B,EAAM+I,GAAQ9K,EACd+K,EAAmBF,GAAgB,eAAR9I,EAC3BiJ,EAAWtO,GAEZ,OAAOkO,GAAWtT,MAEjB,SAAUJ,EAAMzB,EAAS+R,GACxB,MAAStQ,EAAOA,EAAM8I,GACrB,GAAuB,IAAlB9I,EAAKiJ,UAAkB4K,EAC3B,MAAOzC,GAASpR,EAAMzB,EAAS+R,EAGjC,QAAO,GAIR,SAAUtQ,EAAMzB,EAAS+R,GACxB,GAAIyD,GAAUxD,EAAaC,EAC1BwD,GAAazO,EAASuO,EAGvB,IAAKxD,GACJ,MAAStQ,EAAOA,EAAM8I,GACrB,IAAuB,IAAlB9I,EAAKiJ,UAAkB4K,IACtBzC,EAASpR,EAAMzB,EAAS+R,GAC5B,OAAO,MAKV,OAAStQ,EAAOA,EAAM8I,GACrB,GAAuB,IAAlB9I,EAAKiJ,UAAkB4K,EAO3B,GANArD,EAAaxQ,EAAMyB,KAAczB,EAAMyB,OAIvC8O,EAAcC,EAAYxQ,EAAK8Q,YAAeN,EAAYxQ,EAAK8Q,cAE1D8C,GAAQA,IAAS5T,EAAK8C,SAASC,cACnC/C,EAAOA,EAAM8I,IAAS9I,MAChB,CAAA,IAAM+T,EAAWxD,EAAa1F,KACpCkJ,EAAU,KAAQxO,GAAWwO,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHAxD,EAAa1F,GAAQmJ,EAGfA,EAAU,GAAM5C,EAASpR,EAAMzB,EAAS+R,GAC7C,OAAO,EAMZ,OAAO,GAIV,QAAS2D,IAAgBC,GACxB,MAAOA,GAAS9U,OAAS,EACxB,SAAUY,EAAMzB,EAAS+R,GACxB,GAAIrQ,GAAIiU,EAAS9U,MACjB,OAAQa,IACP,IAAMiU,EAASjU,GAAID,EAAMzB,EAAS+R,GACjC,OAAO,CAGT,QAAO,GAER4D,EAAS,GAGX,QAASC,IAAkB7V,EAAU8V,EAAUjR,GAG9C,IAFA,GAAIlD,GAAI,EACPM,EAAM6T,EAAShV,OACRa,EAAIM,EAAKN,IAChBqE,GAAQhG,EAAU8V,EAASnU,GAAIkD,EAEhC,OAAOA,GAGR,QAASkR,IAAUhD,EAAWtR,EAAKgN,EAAQxO,EAAS+R,GAOnD,IANA,GAAItQ,GACHsU,KACArU,EAAI,EACJM,EAAM8Q,EAAUjS,OAChBmV,EAAgB,MAAPxU,EAEFE,EAAIM,EAAKN,KACVD,EAAOqR,EAAUpR,MAChB8M,IAAUA,EAAQ/M,EAAMzB,EAAS+R,KACtCgE,EAAatX,KAAMgD,GACduU,GACJxU,EAAI/C,KAAMiD,IAMd,OAAOqU,GAGR,QAASE,IAAY9E,EAAWpR,EAAU8S,EAASqD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAYhT,KAC/BgT,EAAaD,GAAYC,IAErBC,IAAeA,EAAYjT,KAC/BiT,EAAaF,GAAYE,EAAYC,IAE/B3J,GAAa,SAAU5B,EAAMjG,EAAS5E,EAAS+R,GACrD,GAAIsE,GAAM3U,EAAGD,EACZ6U,KACAC,KACAC,EAAc5R,EAAQ/D,OAGtBK,EAAQ2J,GAAQ+K,GAAkB7V,GAAY,IAAKC,EAAQ0K,UAAa1K,GAAYA,MAGpFyW,GAAYtF,IAAetG,GAAS9K,EAEnCmB,EADA4U,GAAU5U,EAAOoV,EAAQnF,EAAWnR,EAAS+R,GAG9C2E,EAAa7D,EAEZsD,IAAgBtL,EAAOsG,EAAYqF,GAAeN,MAMjDtR,EACD6R,CAQF,IALK5D,GACJA,EAAS4D,EAAWC,EAAY1W,EAAS+R,GAIrCmE,EAAa,CACjBG,EAAOP,GAAUY,EAAYH,GAC7BL,EAAYG,KAAUrW,EAAS+R,GAG/BrQ,EAAI2U,EAAKxV,MACT,OAAQa,KACDD,EAAO4U,EAAK3U,MACjBgV,EAAYH,EAAQ7U,MAAS+U,EAAWF,EAAQ7U,IAAOD,IAK1D,GAAKoJ,GACJ,GAAKsL,GAAchF,EAAY,CAC9B,GAAKgF,EAAa,CAEjBE,KACA3U,EAAIgV,EAAW7V,MACf,OAAQa,KACDD,EAAOiV,EAAWhV,KAEvB2U,EAAK5X,KAAOgY,EAAU/U,GAAKD,EAG7B0U,GAAY,KAAOO,KAAkBL,EAAMtE,GAI5CrQ,EAAIgV,EAAW7V,MACf,OAAQa,KACDD,EAAOiV,EAAWhV,MACtB2U,EAAOF,EAAazX,EAASmM,EAAMpJ,GAAS6U,EAAO5U,SAEpDmJ,EAAKwL,KAAUzR,EAAQyR,GAAQ5U,SAOlCiV,GAAaZ,GACZY,IAAe9R,EACd8R,EAAWtU,OAAQoU,EAAaE,EAAW7V,QAC3C6V,GAEGP,EACJA,EAAY,KAAMvR,EAAS8R,EAAY3E,GAEvCtT,EAAKkD,MAAOiD,EAAS8R,KAMzB,QAASC,IAAmB5B,GAwB3B,IAvBA,GAAI6B,GAAc/D,EAAS5Q,EAC1BD,EAAM+S,EAAOlU,OACbgW,EAAkB7Q,EAAK8K,SAAUiE,EAAO,GAAGpR,MAC3CmT,EAAmBD,GAAmB7Q,EAAK8K,SAAS,KACpDpP,EAAImV,EAAkB,EAAI,EAG1BE,EAAe1M,GAAe,SAAU5I,GACvC,MAAOA,KAASmV,GACdE,GAAkB,GACrBE,EAAkB3M,GAAe,SAAU5I,GAC1C,MAAO/C,GAASkY,EAAcnV,OAC5BqV,GAAkB,GACrBnB,GAAa,SAAUlU,EAAMzB,EAAS+R,GACrC,GAAI5Q,IAAS0V,IAAqB9E,GAAO/R,IAAYsG,MACnDsQ,EAAe5W,GAAS0K,SACxBqM,EAActV,EAAMzB,EAAS+R,GAC7BiF,EAAiBvV,EAAMzB,EAAS+R,GAGlC,OADA6E,GAAe,KACRzV,IAGDO,EAAIM,EAAKN,IAChB,GAAMmR,EAAU7M,EAAK8K,SAAUiE,EAAOrT,GAAGiC,MACxCgS,GAAatL,GAAcqL,GAAgBC,GAAY9C,QACjD,CAIN,GAHAA,EAAU7M,EAAKwI,OAAQuG,EAAOrT,GAAGiC,MAAOhC,MAAO,KAAMoT,EAAOrT,GAAGwD,SAG1D2N,EAAS3P,GAAY,CAGzB,IADAjB,IAAMP,EACEO,EAAID,EAAKC,IAChB,GAAK+D,EAAK8K,SAAUiE,EAAO9S,GAAG0B,MAC7B,KAGF,OAAOsS,IACNvU,EAAI,GAAKgU,GAAgBC,GACzBjU,EAAI,GAAKoK,GAERiJ,EAAOxW,MAAO,EAAGmD,EAAI,GAAIlD,QAAS6G,MAAgC,MAAzB0P,EAAQrT,EAAI,GAAIiC,KAAe,IAAM,MAC7EN,QAASlD,EAAO,MAClB0S,EACAnR,EAAIO,GAAK0U,GAAmB5B,EAAOxW,MAAOmD,EAAGO,IAC7CA,EAAID,GAAO2U,GAAoB5B,EAASA,EAAOxW,MAAO0D,IACtDA,EAAID,GAAO8J,GAAYiJ,IAGzBY,EAASlX,KAAMoU,GAIjB,MAAO6C,IAAgBC,GAGxB,QAASsB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYtW,OAAS,EAChCwW,EAAYH,EAAgBrW,OAAS,EACrCyW,EAAe,SAAUzM,EAAM7K,EAAS+R,EAAKnN,EAAS2S,GACrD,GAAI9V,GAAMQ,EAAG4Q,EACZ2E,EAAe,EACf9V,EAAI,IACJoR,EAAYjI,MACZ4M,KACAC,EAAgBpR,EAEhBpF,EAAQ2J,GAAQwM,GAAarR,EAAK0I,KAAU,IAAG,IAAK6I,GAEpDI,EAAiB3Q,GAA4B,MAAjB0Q,EAAwB,EAAIvU,KAAKC,UAAY,GACzEpB,EAAMd,EAAML,MASb,KAPK0W,IACJjR,EAAmBtG,IAAYnC,GAAYmC,GAAWuX,GAM/C7V,IAAMM,GAA4B,OAApBP,EAAOP,EAAMQ,IAAaA,IAAM,CACrD,GAAK2V,GAAa5V,EAAO,CACxBQ,EAAI,EACEjC,GAAWyB,EAAK2J,gBAAkBvN,IACvC4I,EAAahF,GACbsQ,GAAOpL,EAER,OAASkM,EAAUqE,EAAgBjV,KAClC,GAAK4Q,EAASpR,EAAMzB,GAAWnC,EAAUkU,GAAO,CAC/CnN,EAAQnG,KAAMgD,EACd,OAGG8V,IACJvQ,EAAU2Q,GAKPP,KAEE3V,GAAQoR,GAAWpR,IACxB+V,IAII3M,GACJiI,EAAUrU,KAAMgD,IAgBnB,GATA+V,GAAgB9V,EASX0V,GAAS1V,IAAM8V,EAAe,CAClCvV,EAAI,CACJ,OAAS4Q,EAAUsE,EAAYlV,KAC9B4Q,EAASC,EAAW2E,EAAYzX,EAAS+R,EAG1C,IAAKlH,EAAO,CAEX,GAAK2M,EAAe,EACnB,MAAQ9V,IACAoR,EAAUpR,IAAM+V,EAAW/V,KACjC+V,EAAW/V,GAAK+F,EAAIxI,KAAM2F,GAM7B6S,GAAa3B,GAAU2B,GAIxBhZ,EAAKkD,MAAOiD,EAAS6S,GAGhBF,IAAc1M,GAAQ4M,EAAW5W,OAAS,GAC5C2W,EAAeL,EAAYtW,OAAW,GAExCkF,GAAOsK,WAAYzL,GAUrB,MALK2S,KACJvQ,EAAU2Q,EACVrR,EAAmBoR,GAGb5E,EAGT,OAAOsE,GACN3K,GAAc6K,GACdA,EA+KF,MA5KAlR,GAAUL,GAAOK,QAAU,SAAUrG,EAAUiL,GAC9C,GAAItJ,GACHyV,KACAD,KACAhC,EAAS7N,EAAetH,EAAW,IAEpC,KAAMmV,EAAS,CAERlK,IACLA,EAAQ7E,EAAUpG,IAEnB2B,EAAIsJ,EAAMnK,MACV,OAAQa,IACPwT,EAASyB,GAAmB3L,EAAMtJ,IAC7BwT,EAAQhS,GACZiU,EAAY1Y,KAAMyW,GAElBgC,EAAgBzY,KAAMyW,EAKxBA,GAAS7N,EAAetH,EAAUkX,GAA0BC,EAAiBC,IAG7EjC,EAAOnV,SAAWA,EAEnB,MAAOmV,IAYR7O,EAASN,GAAOM,OAAS,SAAUtG,EAAUC,EAAS4E,EAASiG,GAC9D,GAAInJ,GAAGqT,EAAQ6C,EAAOjU,EAAM+K,EAC3BmJ,EAA+B,kBAAb9X,IAA2BA,EAC7CiL,GAASH,GAAQ1E,EAAWpG,EAAW8X,EAAS9X,UAAYA,EAM7D,IAJA6E,EAAUA,MAIY,IAAjBoG,EAAMnK,OAAe,CAIzB,GADAkU,EAAS/J,EAAM,GAAKA,EAAM,GAAGzM,MAAO,GAC/BwW,EAAOlU,OAAS,GAAkC,QAA5B+W,EAAQ7C,EAAO,IAAIpR,MACvB,IAArB3D,EAAQ0K,UAAkB/D,GAAkBX,EAAK8K,SAAUiE,EAAO,GAAGpR,MAAS,CAG/E,GADA3D,GAAYgG,EAAK0I,KAAS,GAAGkJ,EAAM1S,QAAQ,GAAG7B,QAAQiG,EAAWC,IAAYvJ,QAAkB,IACzFA,EACL,MAAO4E,EAGIiT,KACX7X,EAAUA,EAAQL,YAGnBI,EAAWA,EAASxB,MAAOwW,EAAOvI,QAAQnH,MAAMxE,QAIjDa,EAAI8G,EAAwB,aAAEmD,KAAM5L,GAAa,EAAIgV,EAAOlU,MAC5D,OAAQa,IAAM,CAIb,GAHAkW,EAAQ7C,EAAOrT,GAGVsE,EAAK8K,SAAWnN,EAAOiU,EAAMjU,MACjC,KAED,KAAM+K,EAAO1I,EAAK0I,KAAM/K,MAEjBkH,EAAO6D,EACZkJ,EAAM1S,QAAQ,GAAG7B,QAASiG,EAAWC,IACrCF,EAASsC,KAAMoJ,EAAO,GAAGpR,OAAUqI,GAAahM,EAAQL,aAAgBK,IACpE,CAKJ,GAFA+U,EAAO3S,OAAQV,EAAG,GAClB3B,EAAW8K,EAAKhK,QAAUiL,GAAYiJ,IAChChV,EAEL,MADAtB,GAAKkD,MAAOiD,EAASiG,GACdjG,CAGR,SAeJ,OAPEiT,GAAYzR,EAASrG,EAAUiL,IAChCH,EACA7K,GACC2G,EACD/B,GACC5E,GAAWqJ,EAASsC,KAAM5L,IAAciM,GAAahM,EAAQL,aAAgBK,GAExE4E,GAMR1F,EAAQsR,WAAatN,EAAQ4C,MAAM,IAAI3D,KAAMmF,GAAYyE,KAAK,MAAQ7I,EAItEhE,EAAQqR,mBAAqB/J,EAG7BC,IAIAvH,EAAQuQ,aAAe/C,GAAO,SAAUC,GAEvC,MAA0E,GAAnEA,EAAG0C,wBAAyBxR,EAAS0B,cAAc,eAMrDmN,GAAO,SAAUC,GAEtB,MADAA,GAAGkC,UAAY,mBAC+B,MAAvClC,EAAG+D,WAAW9E,aAAa,WAElCgB,GAAW,yBAA0B,SAAUnL,EAAMc,EAAM2D,GAC1D,IAAMA,EACL,MAAOzE,GAAKmK,aAAcrJ,EAA6B,SAAvBA,EAAKiC,cAA2B,EAAI,KAOjEtF,EAAQ6I,YAAe2E,GAAO,SAAUC,GAG7C,MAFAA,GAAGkC,UAAY,WACflC,EAAG+D,WAAW7E,aAAc,QAAS,IACY,KAA1Cc,EAAG+D,WAAW9E,aAAc,YAEnCgB,GAAW,QAAS,SAAUnL,EAAMc,EAAM2D,GACzC,IAAMA,GAAyC,UAAhCzE,EAAK8C,SAASC,cAC5B,MAAO/C,GAAKqW,eAOTpL,GAAO,SAAUC,GACtB,MAAsC,OAA/BA,EAAGf,aAAa,eAEvBgB,GAAWhF,EAAU,SAAUnG,EAAMc,EAAM2D,GAC1C,GAAI+J,EACJ,KAAM/J,EACL,MAAOzE,GAAMc,MAAW,EAAOA,EAAKiC,eACjCyL,EAAMxO,EAAKkN,iBAAkBpM,KAAW0N,EAAIC,UAC7CD,EAAI5K,MACL,OAKGU,IAEH/H,EAIJ8B,GAAO4O,KAAO3I,EACdjG,EAAOgQ,KAAO/J,EAAO6K,UAGrB9Q,EAAOgQ,KAAM,KAAQhQ,EAAOgQ,KAAK9H,QACjClI,EAAOuQ,WAAavQ,EAAOiY,OAAShS,EAAOsK,WAC3CvQ,EAAON,KAAOuG,EAAOE,QACrBnG,EAAOkY,SAAWjS,EAAOG,MACzBpG,EAAOgH,SAAWf,EAAOe,SACzBhH,EAAOmY,eAAiBlS,EAAOoK,MAK/B,IAAI5F,GAAM,SAAU9I,EAAM8I,EAAK2N,GAC9B,GAAIvF,MACHwF,EAAqBlV,SAAViV,CAEZ,QAAUzW,EAAOA,EAAM8I,KAA6B,IAAlB9I,EAAKiJ,SACtC,GAAuB,IAAlBjJ,EAAKiJ,SAAiB,CAC1B,GAAKyN,GAAYrY,EAAQ2B,GAAO2W,GAAIF,GACnC,KAEDvF,GAAQlU,KAAMgD,GAGhB,MAAOkR,IAIJ0F,EAAW,SAAUC,EAAG7W,GAG3B,IAFA,GAAIkR,MAEI2F,EAAGA,EAAIA,EAAElL,YACI,IAAfkL,EAAE5N,UAAkB4N,IAAM7W,GAC9BkR,EAAQlU,KAAM6Z,EAIhB,OAAO3F,IAIJ4F,EAAgBzY,EAAOgQ,KAAK9E,MAAMhC,aAElCwP,EAAa,kEAIbC,EAAY,gBAGhB,SAASC,GAAQ3I,EAAU4I,EAAW/F,GACrC,MAAK9S,GAAOgD,WAAY6V,GAChB7Y,EAAOiF,KAAMgL,EAAU,SAAUtO,EAAMC,GAC7C,QAASiX,EAAU1Z,KAAMwC,EAAMC,EAAGD,KAAWmR,IAK1C+F,EAAUjO,SACP5K,EAAOiF,KAAMgL,EAAU,SAAUtO,GACvC,MAASA,KAASkX,IAAgB/F,IAKV,gBAAd+F,GACJ7Y,EAAOiF,KAAMgL,EAAU,SAAUtO,GACvC,MAAS/C,GAAQO,KAAM0Z,EAAWlX,QAAkBmR,IAKjD6F,EAAU9M,KAAMgN,GACb7Y,EAAO0O,OAAQmK,EAAW5I,EAAU6C,IAI5C+F,EAAY7Y,EAAO0O,OAAQmK,EAAW5I,GAC/BjQ,EAAOiF,KAAMgL,EAAU,SAAUtO,GACvC,MAAS/C,GAAQO,KAAM0Z,EAAWlX,QAAkBmR,GAAyB,IAAlBnR,EAAKiJ,YAIlE5K,EAAO0O,OAAS,SAAUsB,EAAM5O,EAAO0R,GACtC,GAAInR,GAAOP,EAAO,EAMlB,OAJK0R,KACJ9C,EAAO,QAAUA,EAAO,KAGH,IAAjB5O,EAAML,QAAkC,IAAlBY,EAAKiJ,SACxB5K,EAAO4O,KAAKK,gBAAiBtN,EAAMqO,IAAWrO,MAG/C3B,EAAO4O,KAAKxJ,QAAS4K,EAAMhQ,EAAOiF,KAAM7D,EAAO,SAAUO,GAC/D,MAAyB,KAAlBA,EAAKiJ,aAId5K,EAAOG,GAAGoC,QACTqM,KAAM,SAAU3O,GACf,GAAI2B,GAAGP,EACNa,EAAM/D,KAAK4C,OACX+X,EAAO3a,IAER,IAAyB,gBAAb8B,GACX,MAAO9B,MAAKgD,UAAWnB,EAAQC,GAAWyO,OAAQ,WACjD,IAAM9M,EAAI,EAAGA,EAAIM,EAAKN,IACrB,GAAK5B,EAAOgH,SAAU8R,EAAMlX,GAAKzD,MAChC,OAAO,IAQX,KAFAkD,EAAMlD,KAAKgD,cAELS,EAAI,EAAGA,EAAIM,EAAKN,IACrB5B,EAAO4O,KAAM3O,EAAU6Y,EAAMlX,GAAKP,EAGnC,OAAOa,GAAM,EAAIlC,EAAOuQ,WAAYlP,GAAQA,GAE7CqN,OAAQ,SAAUzO,GACjB,MAAO9B,MAAKgD,UAAWyX,EAAQza,KAAM8B,OAAgB,KAEtD6S,IAAK,SAAU7S,GACd,MAAO9B,MAAKgD,UAAWyX,EAAQza,KAAM8B,OAAgB,KAEtDqY,GAAI,SAAUrY,GACb,QAAS2Y,EACRza,KAIoB,gBAAb8B,IAAyBwY,EAAc5M,KAAM5L,GACnDD,EAAQC,GACRA,OACD,GACCc,SASJ,IAAIgY,GAMHzP,EAAa,sCAEblJ,EAAOJ,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASqT,GACpD,GAAIrI,GAAOvJ,CAGX,KAAM1B,EACL,MAAO9B,KAQR,IAHAoV,EAAOA,GAAQwF,EAGU,gBAAb9Y,GAAwB,CAanC,GAPCiL,EALsB,MAAlBjL,EAAU,IACsB,MAApCA,EAAUA,EAASc,OAAS,IAC5Bd,EAASc,QAAU,GAGT,KAAMd,EAAU,MAGlBqJ,EAAWiC,KAAMtL,IAIrBiL,IAAWA,EAAO,IAAQhL,EA6CxB,OAAMA,GAAWA,EAAQW,QACtBX,GAAWqT,GAAO3E,KAAM3O,GAK1B9B,KAAK2C,YAAaZ,GAAU0O,KAAM3O,EAhDzC,IAAKiL,EAAO,GAAM,CAYjB,GAXAhL,EAAUA,YAAmBF,GAASE,EAAS,GAAMA,EAIrDF,EAAOsB,MAAOnD,KAAM6B,EAAOgZ,UAC1B9N,EAAO,GACPhL,GAAWA,EAAQ0K,SAAW1K,EAAQoL,eAAiBpL,EAAUnC,GACjE,IAII2a,EAAW7M,KAAMX,EAAO,KAASlL,EAAOiD,cAAe/C,GAC3D,IAAMgL,IAAShL,GAGTF,EAAOgD,WAAY7E,KAAM+M,IAC7B/M,KAAM+M,GAAShL,EAASgL,IAIxB/M,KAAK+R,KAAMhF,EAAOhL,EAASgL,GAK9B,OAAO/M,MAYP,MARAwD,GAAO5D,EAASyN,eAAgBN,EAAO,IAElCvJ,IAGJxD,KAAM,GAAMwD,EACZxD,KAAK4C,OAAS,GAER5C,KAcH,MAAK8B,GAAS2K,UACpBzM,KAAM,GAAM8B,EACZ9B,KAAK4C,OAAS,EACP5C,MAII6B,EAAOgD,WAAY/C,GACRkD,SAAfoQ,EAAK0F,MACX1F,EAAK0F,MAAOhZ,GAGZA,EAAUD,GAGLA,EAAO6E,UAAW5E,EAAU9B,MAIrCiC,GAAKQ,UAAYZ,EAAOG,GAGxB4Y,EAAa/Y,EAAQjC,EAGrB,IAAImb,GAAe,iCAGlBC,GACCC,UAAU,EACVC,UAAU,EACV3O,MAAM,EACN4O,MAAM,EAGRtZ,GAAOG,GAAGoC,QACT0Q,IAAK,SAAUnQ,GACd,GAAIyW,GAAUvZ,EAAQ8C,EAAQ3E,MAC7Bqb,EAAID,EAAQxY,MAEb,OAAO5C,MAAKuQ,OAAQ,WAEnB,IADA,GAAI9M,GAAI,EACAA,EAAI4X,EAAG5X,IACd,GAAK5B,EAAOgH,SAAU7I,KAAMob,EAAS3X,IACpC,OAAO,KAMX6X,QAAS,SAAU3I,EAAW5Q,GAC7B,GAAIiN,GACHvL,EAAI,EACJ4X,EAAIrb,KAAK4C,OACT8R,KACA0G,EAA+B,gBAAdzI,IAA0B9Q,EAAQ8Q,EAGpD,KAAM2H,EAAc5M,KAAMiF,GACzB,KAAQlP,EAAI4X,EAAG5X,IACd,IAAMuL,EAAMhP,KAAMyD,GAAKuL,GAAOA,IAAQjN,EAASiN,EAAMA,EAAItN,WAGxD,GAAKsN,EAAIvC,SAAW,KAAQ2O,EAC3BA,EAAQG,MAAOvM,MAGE,IAAjBA,EAAIvC,UACH5K,EAAO4O,KAAKK,gBAAiB9B,EAAK2D,IAAgB,CAEnD+B,EAAQlU,KAAMwO,EACd,OAMJ,MAAOhP,MAAKgD,UAAW0R,EAAQ9R,OAAS,EAAIf,EAAOuQ,WAAYsC,GAAYA,IAI5E6G,MAAO,SAAU/X,GAGhB,MAAMA,GAKe,gBAATA,GACJ/C,EAAQO,KAAMa,EAAQ2B,GAAQxD,KAAM,IAIrCS,EAAQO,KAAMhB,KAGpBwD,EAAKd,OAASc,EAAM,GAAMA,GAZjBxD,KAAM,IAAOA,KAAM,GAAI0B,WAAe1B,KAAK4D,QAAQ4X,UAAU5Y,WAgBxE6Y,IAAK,SAAU3Z,EAAUC,GACxB,MAAO/B,MAAKgD,UACXnB,EAAOuQ,WACNvQ,EAAOsB,MAAOnD,KAAK8C,MAAOjB,EAAQC,EAAUC,OAK/C2Z,QAAS,SAAU5Z,GAClB,MAAO9B,MAAKyb,IAAiB,MAAZ3Z,EAChB9B,KAAKoD,WAAapD,KAAKoD,WAAWmN,OAAQzO,MAK7C,SAAS6Z,GAAS3M,EAAK1C,GACtB,OAAU0C,EAAMA,EAAK1C,KAA4B,IAAjB0C,EAAIvC,UACpC,MAAOuC,GAGRnN,EAAOwB,MACN8Q,OAAQ,SAAU3Q,GACjB,GAAI2Q,GAAS3Q,EAAK9B,UAClB,OAAOyS,IAA8B,KAApBA,EAAO1H,SAAkB0H,EAAS,MAEpDyH,QAAS,SAAUpY,GAClB,MAAO8I,GAAK9I,EAAM,eAEnBqY,aAAc,SAAUrY,EAAMC,EAAGwW,GAChC,MAAO3N,GAAK9I,EAAM,aAAcyW,IAEjC1N,KAAM,SAAU/I,GACf,MAAOmY,GAASnY,EAAM,gBAEvB2X,KAAM,SAAU3X,GACf,MAAOmY,GAASnY,EAAM,oBAEvBsY,QAAS,SAAUtY,GAClB,MAAO8I,GAAK9I,EAAM,gBAEnBgY,QAAS,SAAUhY,GAClB,MAAO8I,GAAK9I,EAAM,oBAEnBuY,UAAW,SAAUvY,EAAMC,EAAGwW,GAC7B,MAAO3N,GAAK9I,EAAM,cAAeyW,IAElC+B,UAAW,SAAUxY,EAAMC,EAAGwW,GAC7B,MAAO3N,GAAK9I,EAAM,kBAAmByW,IAEtCG,SAAU,SAAU5W,GACnB,MAAO4W,IAAY5W,EAAK9B,gBAAmB+Q,WAAYjP,IAExDyX,SAAU,SAAUzX,GACnB,MAAO4W,GAAU5W,EAAKiP,aAEvByI,SAAU,SAAU1X,GACnB,MAAOA,GAAKyY,iBAAmBpa,EAAOsB,SAAWK,EAAKgJ,cAErD,SAAUlI,EAAMtC,GAClBH,EAAOG,GAAIsC,GAAS,SAAU2V,EAAOnY,GACpC,GAAI4S,GAAU7S,EAAO0B,IAAKvD,KAAMgC,EAAIiY,EAuBpC,OArB0B,UAArB3V,EAAKhE,YACTwB,EAAWmY,GAGPnY,GAAgC,gBAAbA,KACvB4S,EAAU7S,EAAO0O,OAAQzO,EAAU4S,IAG/B1U,KAAK4C,OAAS,IAGZoY,EAAkB1W,IACvBzC,EAAOuQ,WAAYsC,GAIfqG,EAAarN,KAAMpJ,IACvBoQ,EAAQwH,WAIHlc,KAAKgD,UAAW0R,KAGzB,IAAIyH,GAAgB,mBAKpB,SAASC,GAAe/X,GACvB,GAAIgY,KAIJ,OAHAxa,GAAOwB,KAAMgB,EAAQ0I,MAAOoP,OAAuB,SAAU5Q,EAAG+Q,GAC/DD,EAAQC,IAAS,IAEXD,EAyBRxa,EAAO0a,UAAY,SAAUlY,GAI5BA,EAA6B,gBAAZA,GAChB+X,EAAe/X,GACfxC,EAAOuC,UAAYC,EAEpB,IACCmY,GAGAC,EAGAC,EAGAC,EAGAjT,KAGAkT,KAGAC,KAGAC,EAAO,WAQN,IALAH,EAAStY,EAAQ0Y,KAIjBL,EAAQF,GAAS,EACTI,EAAMha,OAAQia,KAAmB,CACxCJ,EAASG,EAAMrO,OACf,SAAUsO,EAAcnT,EAAK9G,OAGvB8G,EAAMmT,GAAcnZ,MAAO+Y,EAAQ,GAAKA,EAAQ,OAAU,GAC9DpY,EAAQ2Y,cAGRH,EAAcnT,EAAK9G,OACnB6Z,GAAS,GAMNpY,EAAQoY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIHjT,EADI+S,KAKG,KAMV9B,GAGCc,IAAK,WA2BJ,MA1BK/R,KAGC+S,IAAWD,IACfK,EAAcnT,EAAK9G,OAAS,EAC5Bga,EAAMpc,KAAMic,IAGb,QAAWhB,GAAKjU,GACf3F,EAAOwB,KAAMmE,EAAM,SAAU+D,EAAGpE,GAC1BtF,EAAOgD,WAAYsC,GACjB9C,EAAQyV,QAAWa,EAAK7F,IAAK3N,IAClCuC,EAAKlJ,KAAM2G,GAEDA,GAAOA,EAAIvE,QAAiC,WAAvBf,EAAO6D,KAAMyB,IAG7CsU,EAAKtU,MAGHxD,WAEA8Y,IAAWD,GACfM,KAGK9c,MAIRid,OAAQ,WAYP,MAXApb,GAAOwB,KAAMM,UAAW,SAAU4H,EAAGpE,GACpC,GAAIoU,EACJ,QAAUA,EAAQ1Z,EAAO+E,QAASO,EAAKuC,EAAM6R,OAC5C7R,EAAKvF,OAAQoX,EAAO,GAGfA,GAASsB,GACbA,MAII7c,MAKR8U,IAAK,SAAU9S,GACd,MAAOA,GACNH,EAAO+E,QAAS5E,EAAI0H,MACpBA,EAAK9G,OAAS,GAIhBkT,MAAO,WAIN,MAHKpM,KACJA,MAEM1J,MAMRkd,QAAS,WAGR,MAFAP,GAASC,KACTlT,EAAO+S,EAAS,GACTzc,MAERqM,SAAU,WACT,OAAQ3C,GAMTyT,KAAM,WAKL,MAJAR,GAASC,KACHH,GAAWD,IAChB9S,EAAO+S,EAAS,IAEVzc,MAER2c,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAUrb,EAASyF,GAS5B,MARMmV,KACLnV,EAAOA,MACPA,GAASzF,EAASyF,EAAKlH,MAAQkH,EAAKlH,QAAUkH,GAC9CoV,EAAMpc,KAAMgH,GACNgV,GACLM,KAGK9c,MAIR8c,KAAM,WAEL,MADAnC,GAAKyC,SAAUpd,KAAM2D,WACd3D,MAIR0c,MAAO,WACN,QAASA,GAIZ,OAAO/B,GAIR,SAAS0C,GAAUC,GAClB,MAAOA,GAER,QAASC,GAASC,GACjB,KAAMA,GAGP,QAASC,GAAYrW,EAAOsW,EAASC,GACpC,GAAIC,EAEJ,KAGMxW,GAASvF,EAAOgD,WAAc+Y,EAASxW,EAAMyW,SACjDD,EAAO5c,KAAMoG,GAAQ4B,KAAM0U,GAAUI,KAAMH,GAGhCvW,GAASvF,EAAOgD,WAAc+Y,EAASxW,EAAM2W,MACxDH,EAAO5c,KAAMoG,EAAOsW,EAASC,GAO7BD,EAAQ1c,KAAMgE,OAAWoC,GAMzB,MAAQA,GAITuW,EAAO3c,KAAMgE,OAAWoC,IAI1BvF,EAAOuC,QAEN4Z,SAAU,SAAUC,GACnB,GAAIC,KAIA,SAAU,WAAYrc,EAAO0a,UAAW,UACzC1a,EAAO0a,UAAW,UAAY,IAC7B,UAAW,OAAQ1a,EAAO0a,UAAW,eACtC1a,EAAO0a,UAAW,eAAiB,EAAG,aACrC,SAAU,OAAQ1a,EAAO0a,UAAW,eACrC1a,EAAO0a,UAAW,eAAiB,EAAG,aAExC4B,EAAQ,UACRN,GACCM,MAAO,WACN,MAAOA,IAERC,OAAQ,WAEP,MADAC,GAASrV,KAAMrF,WAAYma,KAAMna,WAC1B3D,MAERse,QAAS,SAAUtc,GAClB,MAAO6b,GAAQE,KAAM,KAAM/b,IAI5Buc,KAAM,WACL,GAAIC,GAAM7a,SAEV,OAAO9B,GAAOmc,SAAU,SAAUS,GACjC5c,EAAOwB,KAAM6a,EAAQ,SAAUza,EAAGib,GAGjC,GAAI1c,GAAKH,EAAOgD,WAAY2Z,EAAKE,EAAO,MAAWF,EAAKE,EAAO,GAK/DL,GAAUK,EAAO,IAAO,WACvB,GAAIC,GAAW3c,GAAMA,EAAG0B,MAAO1D,KAAM2D,UAChCgb,IAAY9c,EAAOgD,WAAY8Z,EAASd,SAC5Cc,EAASd,UACPe,SAAUH,EAASI,QACnB7V,KAAMyV,EAASf,SACfI,KAAMW,EAASd,QAEjBc,EAAUC,EAAO,GAAM,QACtB1e,KACAgC,GAAO2c,GAAahb,eAKxB6a,EAAM,OACHX,WAELE,KAAM,SAAUe,EAAaC,EAAYC,GACxC,GAAIC,GAAW,CACf,SAASvB,GAASwB,EAAOb,EAAUxP,EAASsQ,GAC3C,MAAO,YACN,GAAIC,GAAOpf,KACVwH,EAAO7D,UACP0b,EAAa,WACZ,GAAIV,GAAUZ,CAKd,MAAKmB,EAAQD,GAAb,CAQA,GAJAN,EAAW9P,EAAQnL,MAAO0b,EAAM5X,GAI3BmX,IAAaN,EAASR,UAC1B,KAAM,IAAIyB,WAAW,2BAOtBvB,GAAOY,IAKgB,gBAAbA,IACY,kBAAbA,KACRA,EAASZ,KAGLlc,EAAOgD,WAAYkZ,GAGlBoB,EACJpB,EAAK/c,KACJ2d,EACAjB,EAASuB,EAAUZ,EAAUhB,EAAU8B,GACvCzB,EAASuB,EAAUZ,EAAUd,EAAS4B,KAOvCF,IAEAlB,EAAK/c,KACJ2d,EACAjB,EAASuB,EAAUZ,EAAUhB,EAAU8B,GACvCzB,EAASuB,EAAUZ,EAAUd,EAAS4B,GACtCzB,EAASuB,EAAUZ,EAAUhB,EAC5BgB,EAASkB,eASP1Q,IAAYwO,IAChB+B,EAAOpa,OACPwC,GAASmX,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5X,MAK7CiY,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ3S,GAEJ7K,EAAOmc,SAAS0B,eACpB7d,EAAOmc,SAAS0B,cAAehT,EAC9B+S,EAAQE,YAMLT,EAAQ,GAAKD,IAIZpQ,IAAY0O,IAChB6B,EAAOpa,OACPwC,GAASkF,IAGV2R,EAASuB,WAAYR,EAAM5X,KAS3B0X,GACJO,KAKK5d,EAAOmc,SAAS6B,eACpBJ,EAAQE,WAAa9d,EAAOmc,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,MAAO5d,GAAOmc,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAIzC,IAChBiC,EACC,EACAe,EACA5c,EAAOgD,WAAYma,GAClBA,EACA3B,EACDoB,EAASc,aAKXrB,EAAQ,GAAK,GAAIzC,IAChBiC,EACC,EACAe,EACA5c,EAAOgD,WAAYia,GAClBA,EACAzB,IAKHa,EAAQ,GAAK,GAAIzC,IAChBiC,EACC,EACAe,EACA5c,EAAOgD,WAAYka,GAClBA,EACAxB,MAGAM,WAKLA,QAAS,SAAUpY,GAClB,MAAc,OAAPA,EAAc5D,EAAOuC,OAAQqB,EAAKoY,GAAYA,IAGvDQ,IA2DD,OAxDAxc,GAAOwB,KAAM6a,EAAQ,SAAUza,EAAGib,GACjC,GAAIhV,GAAOgV,EAAO,GACjBqB,EAAcrB,EAAO,EAKtBb,GAASa,EAAO,IAAQhV,EAAK+R,IAGxBsE,GACJrW,EAAK+R,IACJ,WAIC0C,EAAQ4B,GAKT7B,EAAQ,EAAIza,GAAK,GAAIyZ,QAGrBgB,EAAQ,GAAK,GAAIf,MAOnBzT,EAAK+R,IAAKiD,EAAO,GAAI5B,MAKrBuB,EAAUK,EAAO,IAAQ,WAExB,MADAL,GAAUK,EAAO,GAAM,QAAU1e,OAASqe,EAAWrZ,OAAYhF,KAAM2D,WAChE3D,MAMRqe,EAAUK,EAAO,GAAM,QAAWhV,EAAK0T,WAIxCS,EAAQA,QAASQ,GAGZJ,GACJA,EAAKjd,KAAMqd,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,GAGCC,GAAYvc,UAAUf,OAGtBa,EAAIyc,EAGJC,EAAkBxa,MAAOlC,GACzB2c,EAAgB9f,EAAMU,KAAM2C,WAG5B0c,EAASxe,EAAOmc,WAGhBsC,EAAa,SAAU7c,GACtB,MAAO,UAAU2D,GAChB+Y,EAAiB1c,GAAMzD,KACvBogB,EAAe3c,GAAME,UAAUf,OAAS,EAAItC,EAAMU,KAAM2C,WAAcyD,IAC5D8Y,GACTG,EAAOb,YAAaW,EAAiBC,IAMzC,IAAKF,GAAa,IACjBzC,EAAYwC,EAAaI,EAAOrX,KAAMsX,EAAY7c,IAAMia,QAAS2C,EAAO1C,QAGhD,YAAnB0C,EAAOlC,SACXtc,EAAOgD,WAAYub,EAAe3c,IAAO2c,EAAe3c,GAAIsa,OAE5D,MAAOsC,GAAOtC,MAKhB,OAAQta,IACPga,EAAY2C,EAAe3c,GAAK6c,EAAY7c,GAAK4c,EAAO1C,OAGzD,OAAO0C,GAAOxC,YAOhB,IAAI0C,GAAc,wDAElB1e,GAAOmc,SAAS0B,cAAgB,SAAUpa,EAAOkb,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQpb,GAASib,EAAY7S,KAAMpI,EAAMhB,OAC9EvE,EAAO0gB,QAAQC,KAAM,8BAAgCpb,EAAMqb,QAASrb,EAAMkb,MAAOA,IAOnF3e,EAAO+e,eAAiB,SAAUtb,GACjCvF,EAAO+f,WAAY,WAClB,KAAMxa,KAQR,IAAIub,GAAYhf,EAAOmc,UAEvBnc,GAAOG,GAAG8Y,MAAQ,SAAU9Y,GAY3B,MAVA6e,GACE9C,KAAM/b,GADR6e,SAMS,SAAUvb,GACjBzD,EAAO+e,eAAgBtb,KAGlBtF,MAGR6B,EAAOuC,QAGNiB,SAAS,EAITyb,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJnf,EAAOif,YAEPjf,EAAOiZ,OAAO,IAKhBA,MAAO,SAAUmG,IAGXA,KAAS,IAASpf,EAAOif,UAAYjf,EAAOwD,WAKjDxD,EAAOwD,SAAU,EAGZ4b,KAAS,KAAUpf,EAAOif,UAAY,GAK3CD,EAAUrB,YAAa5f,GAAYiC,QAIrCA,EAAOiZ,MAAMiD,KAAO8C,EAAU9C,IAG9B,SAASmD,KACRthB,EAASuhB,oBAAqB,mBAAoBD;AAClDnhB,EAAOohB,oBAAqB,OAAQD,GACpCrf,EAAOiZ,QAOqB,aAAxBlb,EAASwhB,YACa,YAAxBxhB,EAASwhB,aAA6BxhB,EAAS+P,gBAAgB0R,SAGjEthB,EAAO+f,WAAYje,EAAOiZ,QAK1Blb,EAASqQ,iBAAkB,mBAAoBiR,GAG/CnhB,EAAOkQ,iBAAkB,OAAQiR,GAQlC,IAAII,GAAS,SAAUre,EAAOjB,EAAIqM,EAAKjH,EAAOma,EAAWC,EAAUC,GAClE,GAAIhe,GAAI,EACPM,EAAMd,EAAML,OACZ8e,EAAc,MAAPrT,CAGR,IAA4B,WAAvBxM,EAAO6D,KAAM2I,GAAqB,CACtCkT,GAAY,CACZ,KAAM9d,IAAK4K,GACViT,EAAQre,EAAOjB,EAAIyB,EAAG4K,EAAK5K,IAAK,EAAM+d,EAAUC,OAI3C,IAAezc,SAAVoC,IACXma,GAAY,EAEN1f,EAAOgD,WAAYuC,KACxBqa,GAAM,GAGFC,IAGCD,GACJzf,EAAGhB,KAAMiC,EAAOmE,GAChBpF,EAAK,OAIL0f,EAAO1f,EACPA,EAAK,SAAUwB,EAAM6K,EAAKjH,GACzB,MAAOsa,GAAK1gB,KAAMa,EAAQ2B,GAAQ4D,MAKhCpF,GACJ,KAAQyB,EAAIM,EAAKN,IAChBzB,EACCiB,EAAOQ,GAAK4K,EAAKoT,EACjBra,EACAA,EAAMpG,KAAMiC,EAAOQ,GAAKA,EAAGzB,EAAIiB,EAAOQ,GAAK4K,IAM/C,OAAKkT,GACGte,EAIHye,EACG1f,EAAGhB,KAAMiC,GAGVc,EAAM/B,EAAIiB,EAAO,GAAKoL,GAAQmT,GAElCG,EAAa,SAAUC,GAQ1B,MAA0B,KAAnBA,EAAMnV,UAAqC,IAAnBmV,EAAMnV,YAAsBmV,EAAMnV,SAMlE,SAASoV,KACR7hB,KAAKiF,QAAUpD,EAAOoD,QAAU4c,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAKpf,WAEJ2L,MAAO,SAAUwT,GAGhB,GAAIxa,GAAQwa,EAAO5hB,KAAKiF,QA4BxB,OAzBMmC,KACLA,KAKKua,EAAYC,KAIXA,EAAMnV,SACVmV,EAAO5hB,KAAKiF,SAAYmC,EAMxBhH,OAAO2hB,eAAgBH,EAAO5hB,KAAKiF,SAClCmC,MAAOA,EACP4a,cAAc,MAMX5a,GAER6a,IAAK,SAAUL,EAAOM,EAAM9a,GAC3B,GAAI+a,GACH/T,EAAQpO,KAAKoO,MAAOwT,EAIrB,IAAqB,gBAATM,GACX9T,EAAOvM,EAAOuE,UAAW8b,IAAW9a,MAMpC,KAAM+a,IAAQD,GACb9T,EAAOvM,EAAOuE,UAAW+b,IAAWD,EAAMC,EAG5C,OAAO/T,IAERtL,IAAK,SAAU8e,EAAOvT,GACrB,MAAerJ,UAARqJ,EACNrO,KAAKoO,MAAOwT,GAGZA,EAAO5hB,KAAKiF,UAAa2c,EAAO5hB,KAAKiF,SAAWpD,EAAOuE,UAAWiI,KAEpEiT,OAAQ,SAAUM,EAAOvT,EAAKjH,GAa7B,MAAapC,UAARqJ,GACCA,GAAsB,gBAARA,IAAgCrJ,SAAVoC,EAElCpH,KAAK8C,IAAK8e,EAAOvT,IASzBrO,KAAKiiB,IAAKL,EAAOvT,EAAKjH,GAILpC,SAAVoC,EAAsBA,EAAQiH,IAEtC4O,OAAQ,SAAU2E,EAAOvT,GACxB,GAAI5K,GACH2K,EAAQwT,EAAO5hB,KAAKiF,QAErB,IAAeD,SAAVoJ,EAAL,CAIA,GAAapJ,SAARqJ,EAAoB,CAGnBxM,EAAOkD,QAASsJ,GAIpBA,EAAMA,EAAI9K,IAAK1B,EAAOuE,YAEtBiI,EAAMxM,EAAOuE,UAAWiI,GAIxBA,EAAMA,IAAOD,IACVC,GACAA,EAAItB,MAAOoP,QAGf1Y,EAAI4K,EAAIzL,MAER,OAAQa,UACA2K,GAAOC,EAAK5K,KAKRuB,SAARqJ,GAAqBxM,EAAOqE,cAAekI,MAM1CwT,EAAMnV,SACVmV,EAAO5hB,KAAKiF,SAAYD,aAEjB4c,GAAO5hB,KAAKiF,YAItBmd,QAAS,SAAUR,GAClB,GAAIxT,GAAQwT,EAAO5hB,KAAKiF,QACxB,OAAiBD,UAAVoJ,IAAwBvM,EAAOqE,cAAekI,IAGvD,IAAIiU,GAAW,GAAIR,GAEfS,EAAW,GAAIT,GAcfU,EAAS,gCACZC,EAAa,QAEd,SAASC,GAASP,GACjB,MAAc,SAATA,GAIS,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAO7U,KAAMwU,GACVQ,KAAKC,MAAOT,GAGbA,GAGR,QAASU,GAAUpf,EAAM6K,EAAK6T,GAC7B,GAAI5d,EAIJ,IAAcU,SAATkd,GAAwC,IAAlB1e,EAAKiJ,SAI/B,GAHAnI,EAAO,QAAU+J,EAAIjJ,QAASod,EAAY,OAAQjc,cAClD2b,EAAO1e,EAAKmK,aAAcrJ,GAEL,gBAAT4d,GAAoB,CAC/B,IACCA,EAAOO,EAASP,GACf,MAAQxV,IAGV4V,EAASL,IAAKze,EAAM6K,EAAK6T,OAEzBA,GAAOld,MAGT,OAAOkd,GAGRrgB,EAAOuC,QACNge,QAAS,SAAU5e,GAClB,MAAO8e,GAASF,QAAS5e,IAAU6e,EAASD,QAAS5e,IAGtD0e,KAAM,SAAU1e,EAAMc,EAAM4d,GAC3B,MAAOI,GAAShB,OAAQ9d,EAAMc,EAAM4d,IAGrCW,WAAY,SAAUrf,EAAMc,GAC3Bge,EAASrF,OAAQzZ,EAAMc,IAKxBwe,MAAO,SAAUtf,EAAMc,EAAM4d,GAC5B,MAAOG,GAASf,OAAQ9d,EAAMc,EAAM4d,IAGrCa,YAAa,SAAUvf,EAAMc,GAC5B+d,EAASpF,OAAQzZ,EAAMc,MAIzBzC,EAAOG,GAAGoC,QACT8d,KAAM,SAAU7T,EAAKjH,GACpB,GAAI3D,GAAGa,EAAM4d,EACZ1e,EAAOxD,KAAM,GACb4O,EAAQpL,GAAQA,EAAKsG,UAGtB,IAAa9E,SAARqJ,EAAoB,CACxB,GAAKrO,KAAK4C,SACTsf,EAAOI,EAASxf,IAAKU,GAEE,IAAlBA,EAAKiJ,WAAmB4V,EAASvf,IAAKU,EAAM,iBAAmB,CACnEC,EAAImL,EAAMhM,MACV,OAAQa,IAIFmL,EAAOnL,KACXa,EAAOsK,EAAOnL,GAAIa,KACe,IAA5BA,EAAK7D,QAAS,WAClB6D,EAAOzC,EAAOuE,UAAW9B,EAAKhE,MAAO,IACrCsiB,EAAUpf,EAAMc,EAAM4d,EAAM5d,KAI/B+d,GAASJ,IAAKze,EAAM,gBAAgB,GAItC,MAAO0e,GAIR,MAAoB,gBAAR7T,GACJrO,KAAKqD,KAAM,WACjBif,EAASL,IAAKjiB,KAAMqO,KAIfiT,EAAQthB,KAAM,SAAUoH,GAC9B,GAAI8a,EAOJ,IAAK1e,GAAkBwB,SAAVoC,EAAb,CAKC,GADA8a,EAAOI,EAASxf,IAAKU,EAAM6K,GACbrJ,SAATkd,EACJ,MAAOA,EAMR,IADAA,EAAOU,EAAUpf,EAAM6K,GACTrJ,SAATkd,EACJ,MAAOA,OAQTliB,MAAKqD,KAAM,WAGVif,EAASL,IAAKjiB,KAAMqO,EAAKjH,MAExB,KAAMA,EAAOzD,UAAUf,OAAS,EAAG,MAAM,IAG7CigB,WAAY,SAAUxU,GACrB,MAAOrO,MAAKqD,KAAM,WACjBif,EAASrF,OAAQjd,KAAMqO,QAM1BxM,EAAOuC,QACNwY,MAAO,SAAUpZ,EAAMkC,EAAMwc,GAC5B,GAAItF,EAEJ,IAAKpZ,EAYJ,MAXAkC,IAASA,GAAQ,MAAS,QAC1BkX,EAAQyF,EAASvf,IAAKU,EAAMkC,GAGvBwc,KACEtF,GAAS/a,EAAOkD,QAASmd,GAC9BtF,EAAQyF,EAASf,OAAQ9d,EAAMkC,EAAM7D,EAAO6E,UAAWwb,IAEvDtF,EAAMpc,KAAM0hB,IAGPtF,OAIToG,QAAS,SAAUxf,EAAMkC,GACxBA,EAAOA,GAAQ,IAEf,IAAIkX,GAAQ/a,EAAO+a,MAAOpZ,EAAMkC,GAC/Bud,EAAcrG,EAAMha,OACpBZ,EAAK4a,EAAMrO,QACX2U,EAAQrhB,EAAOshB,YAAa3f,EAAMkC,GAClC6G,EAAO,WACN1K,EAAOmhB,QAASxf,EAAMkC,GAIZ,gBAAP1D,IACJA,EAAK4a,EAAMrO,QACX0U,KAGIjhB,IAIU,OAAT0D,GACJkX,EAAMhL,QAAS,oBAITsR,GAAME,KACbphB,EAAGhB,KAAMwC,EAAM+I,EAAM2W,KAGhBD,GAAeC,GACpBA,EAAMpN,MAAMgH,QAKdqG,YAAa,SAAU3f,EAAMkC,GAC5B,GAAI2I,GAAM3I,EAAO,YACjB,OAAO2c,GAASvf,IAAKU,EAAM6K,IAASgU,EAASf,OAAQ9d,EAAM6K,GAC1DyH,MAAOjU,EAAO0a,UAAW,eAAgBd,IAAK,WAC7C4G,EAASpF,OAAQzZ,GAAQkC,EAAO,QAAS2I,WAM7CxM,EAAOG,GAAGoC,QACTwY,MAAO,SAAUlX,EAAMwc,GACtB,GAAImB,GAAS,CAQb,OANqB,gBAAT3d,KACXwc,EAAOxc,EACPA,EAAO,KACP2d,KAGI1f,UAAUf,OAASygB,EAChBxhB,EAAO+a,MAAO5c,KAAM,GAAK0F,GAGjBV,SAATkd,EACNliB,KACAA,KAAKqD,KAAM,WACV,GAAIuZ,GAAQ/a,EAAO+a,MAAO5c,KAAM0F,EAAMwc,EAGtCrgB,GAAOshB,YAAanjB,KAAM0F,GAEZ,OAATA,GAAgC,eAAfkX,EAAO,IAC5B/a,EAAOmhB,QAAShjB,KAAM0F,MAI1Bsd,QAAS,SAAUtd,GAClB,MAAO1F,MAAKqD,KAAM,WACjBxB,EAAOmhB,QAAShjB,KAAM0F,MAGxB4d,WAAY,SAAU5d,GACrB,MAAO1F,MAAK4c,MAAOlX,GAAQ,UAK5BmY,QAAS,SAAUnY,EAAMD,GACxB,GAAI8B,GACHgc,EAAQ,EACRC,EAAQ3hB,EAAOmc,WACflM,EAAW9R,KACXyD,EAAIzD,KAAK4C,OACT8a,EAAU,aACC6F,GACTC,EAAMhE,YAAa1N,GAAYA,IAIb,iBAATpM,KACXD,EAAMC,EACNA,EAAOV,QAERU,EAAOA,GAAQ,IAEf,OAAQjC,IACP8D,EAAM8a,EAASvf,IAAKgP,EAAUrO,GAAKiC,EAAO,cACrC6B,GAAOA,EAAIuO,QACfyN,IACAhc,EAAIuO,MAAM2F,IAAKiC,GAIjB,OADAA,KACO8F,EAAM3F,QAASpY,KAGxB,IAAIge,GAAO,sCAA0CC,OAEjDC,GAAU,GAAI1Z,QAAQ,iBAAmBwZ,EAAO,cAAe,KAG/DG,IAAc,MAAO,QAAS,SAAU,QAExCC,GAAqB,SAAUrgB,EAAMkL,GAOvC,MAHAlL,GAAOkL,GAAMlL,EAGiB,SAAvBA,EAAKsgB,MAAMC,SACM,KAAvBvgB,EAAKsgB,MAAMC,SAMXliB,EAAOgH,SAAUrF,EAAK2J,cAAe3J,IAEH,SAAlC3B,EAAOmiB,IAAKxgB,EAAM,YAGjBygB,GAAO,SAAUzgB,EAAMa,EAASf,EAAUkE,GAC7C,GAAItE,GAAKoB,EACR4f,IAGD,KAAM5f,IAAQD,GACb6f,EAAK5f,GAASd,EAAKsgB,MAAOxf,GAC1Bd,EAAKsgB,MAAOxf,GAASD,EAASC,EAG/BpB,GAAMI,EAASI,MAAOF,EAAMgE,MAG5B,KAAMlD,IAAQD,GACbb,EAAKsgB,MAAOxf,GAAS4f,EAAK5f,EAG3B,OAAOpB,GAMR,SAASihB,IAAW3gB,EAAM2e,EAAMiC,EAAYC,GAC3C,GAAIC,GACHC,EAAQ,EACRC,EAAgB,GAChBC,EAAeJ,EACd,WACC,MAAOA,GAAMrV,OAEd,WACC,MAAOnN,GAAOmiB,IAAKxgB,EAAM2e,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAASviB,EAAO+iB,UAAWzC,GAAS,GAAK,MAG1E0C,GAAkBhjB,EAAO+iB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAC/Df,GAAQvW,KAAMvL,EAAOmiB,IAAKxgB,EAAM2e,GAElC,IAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAGnDA,EAAOA,GAAQE,EAAe,GAG9BT,EAAaA,MAGbS,GAAiBH,GAAW,CAE5B,GAICH,GAAQA,GAAS,KAGjBM,GAAgCN,EAChC1iB,EAAOiiB,MAAOtgB,EAAM2e,EAAM0C,EAAgBF,SAK1CJ,KAAYA,EAAQE,IAAiBC,IAAuB,IAAVH,KAAiBC,GAiBrE,MAbKJ,KACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAMnQ,MAAQ2Q,EACdR,EAAMpgB,IAAMqgB,IAGPA,EAIR,GAAIQ,MAEJ,SAASC,IAAmBvhB,GAC3B,GAAI4U,GACHhX,EAAMoC,EAAK2J,cACX7G,EAAW9C,EAAK8C,SAChByd,EAAUe,GAAmBxe,EAE9B,OAAKyd,GACGA,GAGR3L,EAAOhX,EAAI4jB,KAAKvjB,YAAaL,EAAIE,cAAegF,IAChDyd,EAAUliB,EAAOmiB,IAAK5L,EAAM,WAE5BA,EAAK1W,WAAWC,YAAayW,GAEZ,SAAZ2L,IACJA,EAAU,SAEXe,GAAmBxe,GAAayd,EAEzBA,GAGR,QAASkB,IAAUnT,EAAUoT,GAO5B,IANA,GAAInB,GAASvgB,EACZ2hB,KACA5J,EAAQ,EACR3Y,EAASkP,EAASlP,OAGX2Y,EAAQ3Y,EAAQ2Y,IACvB/X,EAAOsO,EAAUyJ,GACX/X,EAAKsgB,QAIXC,EAAUvgB,EAAKsgB,MAAMC,QAChBmB,GAKa,SAAZnB,IACJoB,EAAQ5J,GAAU8G,EAASvf,IAAKU,EAAM,YAAe,KAC/C2hB,EAAQ5J,KACb/X,EAAKsgB,MAAMC,QAAU,KAGK,KAAvBvgB,EAAKsgB,MAAMC,SAAkBF,GAAoBrgB,KACrD2hB,EAAQ5J,GAAUwJ,GAAmBvhB,KAGrB,SAAZugB,IACJoB,EAAQ5J,GAAU,OAGlB8G,EAASJ,IAAKze,EAAM,UAAWugB,IAMlC,KAAMxI,EAAQ,EAAGA,EAAQ3Y,EAAQ2Y,IACR,MAAnB4J,EAAQ5J,KACZzJ,EAAUyJ,GAAQuI,MAAMC,QAAUoB,EAAQ5J,GAI5C,OAAOzJ,GAGRjQ,EAAOG,GAAGoC,QACT8gB,KAAM,WACL,MAAOD,IAAUjlB,MAAM,IAExBolB,KAAM,WACL,MAAOH,IAAUjlB,OAElBqlB,OAAQ,SAAUlH,GACjB,MAAsB,iBAAVA,GACJA,EAAQne,KAAKklB,OAASllB,KAAKolB,OAG5BplB,KAAKqD,KAAM,WACZwgB,GAAoB7jB,MACxB6B,EAAQ7B,MAAOklB,OAEfrjB,EAAQ7B,MAAOolB,WAKnB,IAAIE,IAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,4BAKdC,IAGHC,QAAU,EAAG,+BAAgC,aAK7CC,OAAS,EAAG,UAAW,YACvBC,KAAO,EAAG,oBAAqB,uBAC/BC,IAAM,EAAG,iBAAkB,oBAC3BC,IAAM,EAAG,qBAAsB,yBAE/BC,UAAY,EAAG,GAAI,IAIpBN,IAAQO,SAAWP,GAAQC,OAE3BD,GAAQQ,MAAQR,GAAQS,MAAQT,GAAQU,SAAWV,GAAQW,QAAUX,GAAQE,MAC7EF,GAAQY,GAAKZ,GAAQK,EAGrB,SAASQ,IAAQvkB,EAAS4O,GAIzB,GAAIzN,EAYJ,OATCA,GAD4C,mBAAjCnB,GAAQwL,qBACbxL,EAAQwL,qBAAsBoD,GAAO,KAEI,mBAA7B5O,GAAQiM,iBACpBjM,EAAQiM,iBAAkB2C,GAAO,QAM3B3L,SAAR2L,GAAqBA,GAAO9O,EAAOyE,SAAUvE,EAAS4O,GACnD9O,EAAOsB,OAASpB,GAAWmB,GAG5BA,EAKR,QAASqjB,IAAetjB,EAAOujB,GAI9B,IAHA,GAAI/iB,GAAI,EACP4X,EAAIpY,EAAML,OAEHa,EAAI4X,EAAG5X,IACd4e,EAASJ,IACRhf,EAAOQ,GACP,cACC+iB,GAAenE,EAASvf,IAAK0jB,EAAa/iB,GAAK,eAMnD,GAAIgjB,IAAQ,WAEZ,SAASC,IAAezjB,EAAOlB,EAAS4kB,EAASC,EAAWC,GAO3D,IANA,GAAIrjB,GAAM+D,EAAKoJ,EAAKmW,EAAMje,EAAU7E,EACnC+iB,EAAWhlB,EAAQilB,yBACnBC,KACAxjB,EAAI,EACJ4X,EAAIpY,EAAML,OAEHa,EAAI4X,EAAG5X,IAGd,GAFAD,EAAOP,EAAOQ,GAETD,GAAiB,IAATA,EAGZ,GAA6B,WAAxB3B,EAAO6D,KAAMlC,GAIjB3B,EAAOsB,MAAO8jB,EAAOzjB,EAAKiJ,UAAajJ,GAASA,OAG1C,IAAMijB,GAAM/Y,KAAMlK,GAIlB,CACN+D,EAAMA,GAAOwf,EAAStlB,YAAaM,EAAQT,cAAe,QAG1DqP,GAAQ4U,GAASnY,KAAM5J,KAAY,GAAI,KAAQ,GAAI+C,cACnDugB,EAAOrB,GAAS9U,IAAS8U,GAAQM,SACjCxe,EAAIqJ,UAAYkW,EAAM,GAAMjlB,EAAOqlB,cAAe1jB,GAASsjB,EAAM,GAGjE9iB,EAAI8iB,EAAM,EACV,OAAQ9iB,IACPuD,EAAMA,EAAI8M,SAKXxS,GAAOsB,MAAO8jB,EAAO1f,EAAIiF,YAGzBjF,EAAMwf,EAAStU,WAGflL,EAAIiL,YAAc,OAzBlByU,GAAMzmB,KAAMuB,EAAQolB,eAAgB3jB,GA+BvCujB,GAASvU,YAAc,GAEvB/O,EAAI,CACJ,OAAUD,EAAOyjB,EAAOxjB,KAGvB,GAAKmjB,GAAa/kB,EAAO+E,QAASpD,EAAMojB,MAClCC,GACJA,EAAQrmB,KAAMgD,OAgBhB,IAXAqF,EAAWhH,EAAOgH,SAAUrF,EAAK2J,cAAe3J,GAGhD+D,EAAM+e,GAAQS,EAAStlB,YAAa+B,GAAQ,UAGvCqF,GACJ0d,GAAehf,GAIXof,EAAU,CACd3iB,EAAI,CACJ,OAAUR,EAAO+D,EAAKvD,KAChBwhB,GAAY9X,KAAMlK,EAAKkC,MAAQ,KACnCihB,EAAQnmB,KAAMgD,GAMlB,MAAOujB,IAIR,WACC,GAAIA,GAAWnnB,EAASonB,yBACvBI,EAAML,EAAStlB,YAAa7B,EAAS0B,cAAe,QACpDuP,EAAQjR,EAAS0B,cAAe,QAMjCuP,GAAMjD,aAAc,OAAQ,SAC5BiD,EAAMjD,aAAc,UAAW,WAC/BiD,EAAMjD,aAAc,OAAQ,KAE5BwZ,EAAI3lB,YAAaoP,GAIjB5P,EAAQomB,WAAaD,EAAIE,WAAW,GAAOA,WAAW,GAAOjT,UAAUsB,QAIvEyR,EAAIxW,UAAY,yBAChB3P,EAAQsmB,iBAAmBH,EAAIE,WAAW,GAAOjT,UAAUwF,eAE5D,IAAIlK,IAAkB/P,EAAS+P,gBAK9B6X,GAAY,OACZC,GAAc,iDACdC,GAAiB,qBAElB,SAASC,MACR,OAAO,EAGR,QAASC,MACR,OAAO,EAKR,QAASC,MACR,IACC,MAAOjoB,GAAS0V,cACf,MAAQwS,KAGX,QAASC,IAAIvkB,EAAMwkB,EAAOlmB,EAAUogB,EAAMlgB,EAAIimB,GAC7C,GAAIC,GAAQxiB,CAGZ,IAAsB,gBAAVsiB,GAAqB,CAGP,gBAAblmB,KAGXogB,EAAOA,GAAQpgB,EACfA,EAAWkD,OAEZ,KAAMU,IAAQsiB,GACbD,GAAIvkB,EAAMkC,EAAM5D,EAAUogB,EAAM8F,EAAOtiB,GAAQuiB,EAEhD,OAAOzkB,GAsBR,GAnBa,MAAR0e,GAAsB,MAANlgB,GAGpBA,EAAKF,EACLogB,EAAOpgB,EAAWkD,QACD,MAANhD,IACc,gBAAbF,IAGXE,EAAKkgB,EACLA,EAAOld,SAIPhD,EAAKkgB,EACLA,EAAOpgB,EACPA,EAAWkD,SAGRhD,KAAO,EACXA,EAAK4lB,OACC,KAAM5lB,EACZ,MAAOwB,EAeR,OAZa,KAARykB,IACJC,EAASlmB,EACTA,EAAK,SAAUmmB,GAId,MADAtmB,KAASumB,IAAKD,GACPD,EAAOxkB,MAAO1D,KAAM2D,YAI5B3B,EAAGqF,KAAO6gB,EAAO7gB,OAAU6gB,EAAO7gB,KAAOxF,EAAOwF,SAE1C7D,EAAKH,KAAM,WACjBxB,EAAOsmB,MAAM1M,IAAKzb,KAAMgoB,EAAOhmB,EAAIkgB,EAAMpgB,KAQ3CD,EAAOsmB,OAEN3oB,UAEAic,IAAK,SAAUjY,EAAMwkB,EAAOnZ,EAASqT,EAAMpgB,GAE1C,GAAIumB,GAAaC,EAAa/gB,EAC7BghB,EAAQC,EAAGC,EACXtJ,EAASuJ,EAAUhjB,EAAMijB,EAAYC,EACrCC,EAAWxG,EAASvf,IAAKU,EAG1B,IAAMqlB,EAAN,CAKKha,EAAQA,UACZwZ,EAAcxZ,EACdA,EAAUwZ,EAAYxZ,QACtB/M,EAAWumB,EAAYvmB,UAKnBA,GACJD,EAAO4O,KAAKK,gBAAiBnB,GAAiB7N,GAIzC+M,EAAQxH,OACbwH,EAAQxH,KAAOxF,EAAOwF,SAIfkhB,EAASM,EAASN,UACzBA,EAASM,EAASN,YAEXD,EAAcO,EAASC,UAC9BR,EAAcO,EAASC,OAAS,SAAUpc,GAIzC,MAAyB,mBAAX7K,IAA0BA,EAAOsmB,MAAMY,YAAcrc,EAAEhH,KACpE7D,EAAOsmB,MAAMa,SAAStlB,MAAOF,EAAMG,WAAcqB,SAKpDgjB,GAAUA,GAAS,IAAKjb,MAAOoP,KAAqB,IACpDqM,EAAIR,EAAMplB,MACV,OAAQ4lB,IACPjhB,EAAMmgB,GAAeta,KAAM4a,EAAOQ,QAClC9iB,EAAOkjB,EAAWrhB,EAAK,GACvBohB,GAAephB,EAAK,IAAO,IAAKM,MAAO,KAAM3D,OAGvCwB,IAKNyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAGhCA,GAAS5D,EAAWqd,EAAQ8J,aAAe9J,EAAQ+J,WAAcxjB,EAGjEyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAGhC+iB,EAAY5mB,EAAOuC,QAClBsB,KAAMA,EACNkjB,SAAUA,EACV1G,KAAMA,EACNrT,QAASA,EACTxH,KAAMwH,EAAQxH,KACdvF,SAAUA,EACViJ,aAAcjJ,GAAYD,EAAOgQ,KAAK9E,MAAMhC,aAAa2C,KAAM5L,GAC/DqnB,UAAWR,EAAW7a,KAAM,MAC1Bua,IAGKK,EAAWH,EAAQ7iB,MAC1BgjB,EAAWH,EAAQ7iB,MACnBgjB,EAASU,cAAgB,EAGnBjK,EAAQkK,OACblK,EAAQkK,MAAMroB,KAAMwC,EAAM0e,EAAMyG,EAAYL,MAAkB,GAEzD9kB,EAAKyM,kBACTzM,EAAKyM,iBAAkBvK,EAAM4iB,IAK3BnJ,EAAQ1D,MACZ0D,EAAQ1D,IAAIza,KAAMwC,EAAMilB,GAElBA,EAAU5Z,QAAQxH,OACvBohB,EAAU5Z,QAAQxH,KAAOwH,EAAQxH,OAK9BvF,EACJ4mB,EAASvkB,OAAQukB,EAASU,gBAAiB,EAAGX,GAE9CC,EAASloB,KAAMioB,GAIhB5mB,EAAOsmB,MAAM3oB,OAAQkG,IAAS,KAMhCuX,OAAQ,SAAUzZ,EAAMwkB,EAAOnZ,EAAS/M,EAAUwnB,GAEjD,GAAItlB,GAAGulB,EAAWhiB,EACjBghB,EAAQC,EAAGC,EACXtJ,EAASuJ,EAAUhjB,EAAMijB,EAAYC,EACrCC,EAAWxG,EAASD,QAAS5e,IAAU6e,EAASvf,IAAKU,EAEtD,IAAMqlB,IAAeN,EAASM,EAASN,QAAvC,CAKAP,GAAUA,GAAS,IAAKjb,MAAOoP,KAAqB,IACpDqM,EAAIR,EAAMplB,MACV,OAAQ4lB,IAMP,GALAjhB,EAAMmgB,GAAeta,KAAM4a,EAAOQ,QAClC9iB,EAAOkjB,EAAWrhB,EAAK,GACvBohB,GAAephB,EAAK,IAAO,IAAKM,MAAO,KAAM3D,OAGvCwB,EAAN,CAOAyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAChCA,GAAS5D,EAAWqd,EAAQ8J,aAAe9J,EAAQ+J,WAAcxjB,EACjEgjB,EAAWH,EAAQ7iB,OACnB6B,EAAMA,EAAK,IACV,GAAI0C,QAAQ,UAAY0e,EAAW7a,KAAM,iBAAoB,WAG9Dyb,EAAYvlB,EAAI0kB,EAAS9lB,MACzB,OAAQoB,IACPykB,EAAYC,EAAU1kB,IAEfslB,GAAeV,IAAaH,EAAUG,UACzC/Z,GAAWA,EAAQxH,OAASohB,EAAUphB,MACtCE,IAAOA,EAAImG,KAAM+a,EAAUU,YAC3BrnB,GAAYA,IAAa2mB,EAAU3mB,WACxB,OAAbA,IAAqB2mB,EAAU3mB,YAChC4mB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAU3mB,UACd4mB,EAASU,gBAELjK,EAAQlC,QACZkC,EAAQlC,OAAOjc,KAAMwC,EAAMilB,GAOzBc,KAAcb,EAAS9lB,SACrBuc,EAAQqK,UACbrK,EAAQqK,SAASxoB,KAAMwC,EAAMmlB,EAAYE,EAASC,WAAa,GAE/DjnB,EAAO4nB,YAAajmB,EAAMkC,EAAMmjB,EAASC,cAGnCP,GAAQ7iB,QA1Cf,KAAMA,IAAQ6iB,GACb1mB,EAAOsmB,MAAMlL,OAAQzZ,EAAMkC,EAAOsiB,EAAOQ,GAAK3Z,EAAS/M,GAAU,EA8C/DD,GAAOqE,cAAeqiB,IAC1BlG,EAASpF,OAAQzZ,EAAM,mBAIzBwlB,SAAU,SAAUU,GAGnB,GAAIvB,GAAQtmB,EAAOsmB,MAAMwB,IAAKD,GAE1BjmB,EAAGO,EAAGd,EAAKwR,EAAS+T,EAAWmB,EAClCpiB,EAAO,GAAI7B,OAAOhC,UAAUf,QAC5B8lB,GAAarG,EAASvf,IAAK9C,KAAM,eAAoBmoB,EAAMziB,UAC3DyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASgJ,EAAMziB,SAKvC,KAFA8B,EAAM,GAAM2gB,EAEN1kB,EAAI,EAAGA,EAAIE,UAAUf,OAAQa,IAClC+D,EAAM/D,GAAME,UAAWF,EAMxB,IAHA0kB,EAAM0B,eAAiB7pB,MAGlBmf,EAAQ2K,aAAe3K,EAAQ2K,YAAY9oB,KAAMhB,KAAMmoB,MAAY,EAAxE,CAKAyB,EAAe/nB,EAAOsmB,MAAMO,SAAS1nB,KAAMhB,KAAMmoB,EAAOO,GAGxDjlB,EAAI,CACJ,QAAUiR,EAAUkV,EAAcnmB,QAAY0kB,EAAM4B,uBAAyB,CAC5E5B,EAAM6B,cAAgBtV,EAAQlR,KAE9BQ,EAAI,CACJ,QAAUykB,EAAY/T,EAAQgU,SAAU1kB,QACtCmkB,EAAM8B,gCAID9B,EAAM+B,aAAc/B,EAAM+B,WAAWxc,KAAM+a,EAAUU,aAE1DhB,EAAMM,UAAYA,EAClBN,EAAMjG,KAAOuG,EAAUvG,KAEvBhf,IAAUrB,EAAOsmB,MAAMhJ,QAASsJ,EAAUG,eAAmBE,QAC5DL,EAAU5Z,SAAUnL,MAAOgR,EAAQlR,KAAMgE,GAE7BxC,SAAR9B,IACGilB,EAAM1U,OAASvQ,MAAU,IAC/BilB,EAAMgC,iBACNhC,EAAMiC,oBAYX,MAJKjL,GAAQkL,cACZlL,EAAQkL,aAAarpB,KAAMhB,KAAMmoB,GAG3BA,EAAM1U,SAGdiV,SAAU,SAAUP,EAAOO,GAC1B,GAAIjlB,GAAGglB,EAAWtW,EAAKmY,EAAiBC,EACvCX,KACAR,EAAgBV,EAASU,cACzBpa,EAAMmZ,EAAMxjB,MAGb,IAAKykB,GAIJpa,EAAIvC,YAOc,UAAf0b,EAAMziB,MAAoByiB,EAAMnS,QAAU,GAE7C,KAAQhH,IAAQhP,KAAMgP,EAAMA,EAAItN,YAAc1B,KAI7C,GAAsB,IAAjBgP,EAAIvC,WAAoC,UAAf0b,EAAMziB,MAAoBsJ,EAAI3C,YAAa,GAAS,CAGjF,IAFAie,KACAC,KACM9mB,EAAI,EAAGA,EAAI2lB,EAAe3lB,IAC/BglB,EAAYC,EAAUjlB,GAGtB0O,EAAMsW,EAAU3mB,SAAW,IAEMkD,SAA5BulB,EAAkBpY,KACtBoY,EAAkBpY,GAAQsW,EAAU1d,aACnClJ,EAAQsQ,EAAKnS,MAAOub,MAAOvM,MAC3BnN,EAAO4O,KAAM0B,EAAKnS,KAAM,MAAQgP,IAAQpM,QAErC2nB,EAAkBpY,IACtBmY,EAAgB9pB,KAAMioB,EAGnB6B,GAAgB1nB,QACpBgnB,EAAappB,MAAQgD,KAAMwL,EAAK0Z,SAAU4B,IAY9C,MALAtb,GAAMhP,KACDopB,EAAgBV,EAAS9lB,QAC7BgnB,EAAappB,MAAQgD,KAAMwL,EAAK0Z,SAAUA,EAASpoB,MAAO8oB,KAGpDQ,GAGRY,QAAS,SAAUlmB,EAAMmmB,GACxBrqB,OAAO2hB,eAAgBlgB,EAAO6oB,MAAMjoB,UAAW6B,GAC9CqmB,YAAY,EACZ3I,cAAc,EAEdlf,IAAKjB,EAAOgD,WAAY4lB,GACvB,WACC,GAAKzqB,KAAK4qB,cACR,MAAOH,GAAMzqB,KAAK4qB,gBAGrB,WACC,GAAK5qB,KAAK4qB,cACR,MAAO5qB,MAAK4qB,cAAetmB,IAI/B2d,IAAK,SAAU7a,GACdhH,OAAO2hB,eAAgB/hB,KAAMsE,GAC5BqmB,YAAY,EACZ3I,cAAc,EACd6I,UAAU,EACVzjB,MAAOA,QAMXuiB,IAAK,SAAUiB,GACd,MAAOA,GAAe/oB,EAAOoD,SAC5B2lB,EACA,GAAI/oB,GAAO6oB,MAAOE,IAGpBzL,SACC2L,MAGCC,UAAU,GAEX1V,OAGC2V,QAAS,WACR,GAAKhrB,OAAS6nB,MAAuB7nB,KAAKqV,MAEzC,MADArV,MAAKqV,SACE,GAGT4T,aAAc,WAEfgC,MACCD,QAAS,WACR,GAAKhrB,OAAS6nB,MAAuB7nB,KAAKirB,KAEzC,MADAjrB,MAAKirB,QACE,GAGThC,aAAc,YAEfiC,OAGCF,QAAS,WACR,GAAmB,aAAdhrB,KAAK0F,MAAuB1F,KAAKkrB,OAASrpB,EAAOyE,SAAUtG,KAAM,SAErE,MADAA,MAAKkrB,SACE,GAKTnF,SAAU,SAAUoC,GACnB,MAAOtmB,GAAOyE,SAAU6hB,EAAMxjB,OAAQ,OAIxCwmB,cACCd,aAAc,SAAUlC,GAIDnjB,SAAjBmjB,EAAM1U,QAAwB0U,EAAMyC,gBACxCzC,EAAMyC,cAAcQ,YAAcjD,EAAM1U,YAO7C5R,EAAO4nB,YAAc,SAAUjmB,EAAMkC,EAAMojB,GAGrCtlB,EAAK2d,qBACT3d,EAAK2d,oBAAqBzb,EAAMojB,IAIlCjnB,EAAO6oB,MAAQ,SAAUnmB,EAAK8mB,GAG7B,MAAQrrB,gBAAgB6B,GAAO6oB,OAK1BnmB,GAAOA,EAAImB,MACf1F,KAAK4qB,cAAgBrmB,EACrBvE,KAAK0F,KAAOnB,EAAImB,KAIhB1F,KAAKsrB,mBAAqB/mB,EAAIgnB,kBACHvmB,SAAzBT,EAAIgnB,kBAGJhnB,EAAI6mB,eAAgB,EACrBzD,GACAC,GAKD5nB,KAAK2E,OAAWJ,EAAII,QAAkC,IAAxBJ,EAAII,OAAO8H,SACxClI,EAAII,OAAOjD,WACX6C,EAAII,OAEL3E,KAAKgqB,cAAgBzlB,EAAIylB,cACzBhqB,KAAKwrB,cAAgBjnB,EAAIinB,eAIzBxrB,KAAK0F,KAAOnB,EAIR8mB,GACJxpB,EAAOuC,OAAQpE,KAAMqrB,GAItBrrB,KAAKyrB,UAAYlnB,GAAOA,EAAIknB,WAAa5pB,EAAO4F,WAGhDzH,KAAM6B,EAAOoD,UAAY,IA1CjB,GAAIpD,GAAO6oB,MAAOnmB,EAAK8mB,IA+ChCxpB,EAAO6oB,MAAMjoB,WACZE,YAAad,EAAO6oB,MACpBY,mBAAoB1D,GACpBmC,qBAAsBnC,GACtBqC,8BAA+BrC,GAC/B8D,aAAa,EAEbvB,eAAgB,WACf,GAAIzd,GAAI1M,KAAK4qB,aAEb5qB,MAAKsrB,mBAAqB3D,GAErBjb,IAAM1M,KAAK0rB,aACfhf,EAAEyd,kBAGJC,gBAAiB,WAChB,GAAI1d,GAAI1M,KAAK4qB,aAEb5qB,MAAK+pB,qBAAuBpC,GAEvBjb,IAAM1M,KAAK0rB,aACfhf,EAAE0d,mBAGJuB,yBAA0B,WACzB,GAAIjf,GAAI1M,KAAK4qB,aAEb5qB,MAAKiqB,8BAAgCtC,GAEhCjb,IAAM1M,KAAK0rB,aACfhf,EAAEif,2BAGH3rB,KAAKoqB,oBAKPvoB,EAAOwB,MACNuoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVpe,KAAK,EACLqe,SAAS,EACT1W,QAAQ,EACR2W,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EAETC,MAAO,SAAUpF,GAChB,GAAInS,GAASmS,EAAMnS,MAGnB,OAAoB,OAAfmS,EAAMoF,OAAiB/F,GAAU9Z,KAAMya,EAAMziB,MACxB,MAAlByiB,EAAMsE,SAAmBtE,EAAMsE,SAAWtE,EAAMuE,SAIlDvE,EAAMoF,OAAoBvoB,SAAXgR,GAAwByR,GAAY/Z,KAAMya,EAAMziB,MACtD,EAATsQ,EACG,EAGM,EAATA,EACG,EAGM,EAATA,EACG,EAGD,EAGDmS,EAAMoF,QAEZ1rB,EAAOsmB,MAAMqC,SAUhB3oB,EAAOwB,MACNmqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAMjE,GAClB9nB,EAAOsmB,MAAMhJ,QAASyO,IACrB3E,aAAcU,EACdT,SAAUS,EAEVb,OAAQ,SAAUX,GACjB,GAAIjlB,GACHyB,EAAS3E,KACT6tB,EAAU1F,EAAMqD,cAChB/C,EAAYN,EAAMM,SASnB,OALMoF,KAAaA,IAAYlpB,GAAW9C,EAAOgH,SAAUlE,EAAQkpB,MAClE1F,EAAMziB,KAAO+iB,EAAUG,SACvB1lB,EAAMulB,EAAU5Z,QAAQnL,MAAO1D,KAAM2D,WACrCwkB,EAAMziB,KAAOikB,GAEPzmB,MAKVrB,EAAOG,GAAGoC,QAET2jB,GAAI,SAAUC,EAAOlmB,EAAUogB,EAAMlgB,GACpC,MAAO+lB,IAAI/nB,KAAMgoB,EAAOlmB,EAAUogB,EAAMlgB,IAEzCimB,IAAK,SAAUD,EAAOlmB,EAAUogB,EAAMlgB,GACrC,MAAO+lB,IAAI/nB,KAAMgoB,EAAOlmB,EAAUogB,EAAMlgB,EAAI,IAE7ComB,IAAK,SAAUJ,EAAOlmB,EAAUE,GAC/B,GAAIymB,GAAW/iB,CACf,IAAKsiB,GAASA,EAAMmC,gBAAkBnC,EAAMS,UAW3C,MARAA,GAAYT,EAAMS,UAClB5mB,EAAQmmB,EAAM6B,gBAAiBzB,IAC9BK,EAAUU,UACTV,EAAUG,SAAW,IAAMH,EAAUU,UACrCV,EAAUG,SACXH,EAAU3mB,SACV2mB,EAAU5Z,SAEJ7O,IAER,IAAsB,gBAAVgoB,GAAqB,CAGhC,IAAMtiB,IAAQsiB,GACbhoB,KAAKooB,IAAK1iB,EAAM5D,EAAUkmB,EAAOtiB,GAElC,OAAO1F,MAWR,MATK8B,MAAa,GAA6B,kBAAbA,KAGjCE,EAAKF,EACLA,EAAWkD,QAEPhD,KAAO,IACXA,EAAK4lB,IAEC5nB,KAAKqD,KAAM,WACjBxB,EAAOsmB,MAAMlL,OAAQjd,KAAMgoB,EAAOhmB,EAAIF,OAMzC,IAKCgsB,IAAY,8FAOZC,GAAe,wBAGfC,GAAW,oCACXC,GAAoB,cACpBC,GAAe,0CAEhB,SAASC,IAAoB3qB,EAAM4qB,GAClC,MAAKvsB,GAAOyE,SAAU9C,EAAM,UAC3B3B,EAAOyE,SAA+B,KAArB8nB,EAAQ3hB,SAAkB2hB,EAAUA,EAAQ3b,WAAY,MAElEjP,EAAK+J,qBAAsB,SAAW,IAAO/J,EAG9CA,EAIR,QAAS6qB,IAAe7qB,GAEvB,MADAA,GAAKkC,MAAyC,OAAhClC,EAAKmK,aAAc,SAAsB,IAAMnK,EAAKkC,KAC3DlC,EAER,QAAS8qB,IAAe9qB,GACvB,GAAIuJ,GAAQkhB,GAAkB7gB,KAAM5J,EAAKkC,KAQzC,OANKqH,GACJvJ,EAAKkC,KAAOqH,EAAO,GAEnBvJ,EAAK0K,gBAAiB,QAGhB1K,EAGR,QAAS+qB,IAAgBhqB,EAAKiqB,GAC7B,GAAI/qB,GAAG4X,EAAG3V,EAAM+oB,EAAUC,EAAUC,EAAUC,EAAUrG,CAExD,IAAuB,IAAlBiG,EAAK/hB,SAAV,CAKA,GAAK4V,EAASD,QAAS7d,KACtBkqB,EAAWpM,EAASf,OAAQ/c,GAC5BmqB,EAAWrM,EAASJ,IAAKuM,EAAMC,GAC/BlG,EAASkG,EAASlG,QAEJ,OACNmG,GAAS5F,OAChB4F,EAASnG,SAET,KAAM7iB,IAAQ6iB,GACb,IAAM9kB,EAAI,EAAG4X,EAAIkN,EAAQ7iB,GAAO9C,OAAQa,EAAI4X,EAAG5X,IAC9C5B,EAAOsmB,MAAM1M,IAAK+S,EAAM9oB,EAAM6iB,EAAQ7iB,GAAQjC,IAO7C6e,EAASF,QAAS7d,KACtBoqB,EAAWrM,EAAShB,OAAQ/c,GAC5BqqB,EAAW/sB,EAAOuC,UAAYuqB,GAE9BrM,EAASL,IAAKuM,EAAMI,KAKtB,QAASC,IAAUtqB,EAAKiqB,GACvB,GAAIloB,GAAWkoB,EAAKloB,SAASC,aAGX,WAAbD,GAAwBgf,GAAe5X,KAAMnJ,EAAImB,MACrD8oB,EAAK7Y,QAAUpR,EAAIoR,QAGK,UAAbrP,GAAqC,aAAbA,IACnCkoB,EAAK3U,aAAetV,EAAIsV,cAI1B,QAASiV,IAAUC,EAAYvnB,EAAMlE,EAAUujB,GAG9Crf,EAAOjH,EAAOmD,SAAW8D,EAEzB,IAAIuf,GAAUnjB,EAAO+iB,EAASqI,EAAYpf,EAAMxO,EAC/CqC,EAAI,EACJ4X,EAAI0T,EAAWnsB,OACfqsB,EAAW5T,EAAI,EACfjU,EAAQI,EAAM,GACd3C,EAAahD,EAAOgD,WAAYuC,EAGjC,IAAKvC,GACDwW,EAAI,GAAsB,gBAAVjU,KAChBnG,EAAQomB,YAAc2G,GAAStgB,KAAMtG,GACxC,MAAO2nB,GAAW1rB,KAAM,SAAUkY,GACjC,GAAIZ,GAAOoU,EAAWlrB,GAAI0X,EACrB1W,KACJ2C,EAAM,GAAMJ,EAAMpG,KAAMhB,KAAMub,EAAOZ,EAAKuU,SAE3CJ,GAAUnU,EAAMnT,EAAMlE,EAAUujB,IAIlC,IAAKxL,IACJ0L,EAAWL,GAAelf,EAAMunB,EAAY,GAAI5hB,eAAe,EAAO4hB,EAAYlI,GAClFjjB,EAAQmjB,EAAStU,WAEmB,IAA/BsU,EAASva,WAAW5J,SACxBmkB,EAAWnjB,GAIPA,GAASijB,GAAU,CAOvB,IANAF,EAAU9kB,EAAO0B,IAAK+iB,GAAQS,EAAU,UAAYsH,IACpDW,EAAarI,EAAQ/jB,OAKba,EAAI4X,EAAG5X,IACdmM,EAAOmX,EAEFtjB,IAAMwrB,IACVrf,EAAO/N,EAAO6C,MAAOkL,GAAM,GAAM,GAG5Bof,GAIJntB,EAAOsB,MAAOwjB,EAASL,GAAQ1W,EAAM,YAIvCtM,EAAStC,KAAM+tB,EAAYtrB,GAAKmM,EAAMnM,EAGvC,IAAKurB,EAOJ,IANA5tB,EAAMulB,EAASA,EAAQ/jB,OAAS,GAAIuK,cAGpCtL,EAAO0B,IAAKojB,EAAS2H,IAGf7qB,EAAI,EAAGA,EAAIurB,EAAYvrB,IAC5BmM,EAAO+W,EAASljB,GACX+hB,GAAY9X,KAAMkC,EAAKlK,MAAQ,MAClC2c,EAASf,OAAQ1R,EAAM,eACxB/N,EAAOgH,SAAUzH,EAAKwO,KAEjBA,EAAKrL,IAGJ1C,EAAOstB,UACXttB,EAAOstB,SAAUvf,EAAKrL,KAGvBrD,EAAS0O,EAAK4C,YAAYpN,QAAS8oB,GAAc,IAAM9sB,IAQ7D,MAAO2tB,GAGR,QAAS9R,IAAQzZ,EAAM1B,EAAUstB,GAKhC,IAJA,GAAIxf,GACHqX,EAAQnlB,EAAWD,EAAO0O,OAAQzO,EAAU0B,GAASA,EACrDC,EAAI,EAE4B,OAAvBmM,EAAOqX,EAAOxjB,IAAeA,IAChC2rB,GAA8B,IAAlBxf,EAAKnD,UACtB5K,EAAOwtB,UAAW/I,GAAQ1W,IAGtBA,EAAKlO,aACJ0tB,GAAYvtB,EAAOgH,SAAU+G,EAAKzC,cAAeyC,IACrD2W,GAAeD,GAAQ1W,EAAM,WAE9BA,EAAKlO,WAAWC,YAAaiO,GAI/B,OAAOpM,GAGR3B,EAAOuC,QACN8iB,cAAe,SAAUgI,GACxB,MAAOA,GAAK9pB,QAAS0oB,GAAW,cAGjCppB,MAAO,SAAUlB,EAAM8rB,EAAeC,GACrC,GAAI9rB,GAAG4X,EAAGmU,EAAaC,EACtB/qB,EAAQlB,EAAK8jB,WAAW,GACxBoI,EAAS7tB,EAAOgH,SAAUrF,EAAK2J,cAAe3J,EAG/C,MAAMvC,EAAQsmB,gBAAsC,IAAlB/jB,EAAKiJ,UAAoC,KAAlBjJ,EAAKiJ,UAC3D5K,EAAOkY,SAAUvW,IAMnB,IAHAisB,EAAenJ,GAAQ5hB,GACvB8qB,EAAclJ,GAAQ9iB,GAEhBC,EAAI,EAAG4X,EAAImU,EAAY5sB,OAAQa,EAAI4X,EAAG5X,IAC3CorB,GAAUW,EAAa/rB,GAAKgsB,EAAchsB,GAK5C,IAAK6rB,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQ9iB,GACrCisB,EAAeA,GAAgBnJ,GAAQ5hB,GAEjCjB,EAAI,EAAG4X,EAAImU,EAAY5sB,OAAQa,EAAI4X,EAAG5X,IAC3C8qB,GAAgBiB,EAAa/rB,GAAKgsB,EAAchsB,QAGjD8qB,IAAgB/qB,EAAMkB,EAWxB,OANA+qB,GAAenJ,GAAQ5hB,EAAO,UACzB+qB,EAAa7sB,OAAS,GAC1B2jB,GAAekJ,GAAeC,GAAUpJ,GAAQ9iB,EAAM,WAIhDkB,GAGR2qB,UAAW,SAAUpsB,GAKpB,IAJA,GAAIif,GAAM1e,EAAMkC,EACfyZ,EAAUtd,EAAOsmB,MAAMhJ,QACvB1b,EAAI,EAE6BuB,UAAxBxB,EAAOP,EAAOQ,IAAqBA,IAC5C,GAAKke,EAAYne,GAAS,CACzB,GAAO0e,EAAO1e,EAAM6e,EAASpd,SAAc,CAC1C,GAAKid,EAAKqG,OACT,IAAM7iB,IAAQwc,GAAKqG,OACbpJ,EAASzZ,GACb7D,EAAOsmB,MAAMlL,OAAQzZ,EAAMkC,GAI3B7D,EAAO4nB,YAAajmB,EAAMkC,EAAMwc,EAAK4G,OAOxCtlB,GAAM6e,EAASpd,SAAYD,OAEvBxB,EAAM8e,EAASrd,WAInBzB,EAAM8e,EAASrd,SAAYD,YAOhCnD,EAAOG,GAAGoC,QACTurB,OAAQ,SAAU7tB,GACjB,MAAOmb,IAAQjd,KAAM8B,GAAU,IAGhCmb,OAAQ,SAAUnb,GACjB,MAAOmb,IAAQjd,KAAM8B,IAGtBP,KAAM,SAAU6F,GACf,MAAOka,GAAQthB,KAAM,SAAUoH,GAC9B,MAAiBpC,UAAVoC,EACNvF,EAAON,KAAMvB,MACbA,KAAK8V,QAAQzS,KAAM,WACK,IAAlBrD,KAAKyM,UAAoC,KAAlBzM,KAAKyM,UAAqC,IAAlBzM,KAAKyM,WACxDzM,KAAKwS,YAAcpL,MAGpB,KAAMA,EAAOzD,UAAUf,SAG3BgtB,OAAQ,WACP,MAAOd,IAAU9uB,KAAM2D,UAAW,SAAUH,GAC3C,GAAuB,IAAlBxD,KAAKyM,UAAoC,KAAlBzM,KAAKyM,UAAqC,IAAlBzM,KAAKyM,SAAiB,CACzE,GAAI9H,GAASwpB,GAAoBnuB,KAAMwD,EACvCmB,GAAOlD,YAAa+B,OAKvBqsB,QAAS,WACR,MAAOf,IAAU9uB,KAAM2D,UAAW,SAAUH,GAC3C,GAAuB,IAAlBxD,KAAKyM,UAAoC,KAAlBzM,KAAKyM,UAAqC,IAAlBzM,KAAKyM,SAAiB,CACzE,GAAI9H,GAASwpB,GAAoBnuB,KAAMwD,EACvCmB,GAAOmrB,aAActsB,EAAMmB,EAAO8N,gBAKrCsd,OAAQ,WACP,MAAOjB,IAAU9uB,KAAM2D,UAAW,SAAUH,GACtCxD,KAAK0B,YACT1B,KAAK0B,WAAWouB,aAActsB,EAAMxD,SAKvCgwB,MAAO,WACN,MAAOlB,IAAU9uB,KAAM2D,UAAW,SAAUH,GACtCxD,KAAK0B,YACT1B,KAAK0B,WAAWouB,aAActsB,EAAMxD,KAAKmP,gBAK5C2G,MAAO,WAIN,IAHA,GAAItS,GACHC,EAAI,EAE2B,OAAtBD,EAAOxD,KAAMyD,IAAeA,IACd,IAAlBD,EAAKiJ,WAGT5K,EAAOwtB,UAAW/I,GAAQ9iB,GAAM,IAGhCA,EAAKgP,YAAc,GAIrB,OAAOxS,OAGR0E,MAAO,SAAU4qB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzDvvB,KAAKuD,IAAK,WAChB,MAAO1B,GAAO6C,MAAO1E,KAAMsvB,EAAeC,MAI5CL,KAAM,SAAU9nB,GACf,MAAOka,GAAQthB,KAAM,SAAUoH,GAC9B,GAAI5D,GAAOxD,KAAM,OAChByD,EAAI,EACJ4X,EAAIrb,KAAK4C,MAEV,IAAeoC,SAAVoC,GAAyC,IAAlB5D,EAAKiJ,SAChC,MAAOjJ,GAAKoN,SAIb,IAAsB,gBAAVxJ,KAAuB2mB,GAAargB,KAAMtG,KACpDqe,IAAWF,GAASnY,KAAMhG,KAAa,GAAI,KAAQ,GAAIb,eAAkB,CAE1Ea,EAAQvF,EAAOqlB,cAAe9f,EAE9B,KACC,KAAQ3D,EAAI4X,EAAG5X,IACdD,EAAOxD,KAAMyD,OAGU,IAAlBD,EAAKiJ,WACT5K,EAAOwtB,UAAW/I,GAAQ9iB,GAAM,IAChCA,EAAKoN,UAAYxJ,EAInB5D,GAAO,EAGN,MAAQkJ,KAGNlJ,GACJxD,KAAK8V,QAAQ8Z,OAAQxoB,IAEpB,KAAMA,EAAOzD,UAAUf,SAG3BqtB,YAAa,WACZ,GAAIpJ,KAGJ,OAAOiI,IAAU9uB,KAAM2D,UAAW,SAAUH,GAC3C,GAAI2Q,GAASnU,KAAK0B,UAEbG,GAAO+E,QAAS5G,KAAM6mB,GAAY,IACtChlB,EAAOwtB,UAAW/I,GAAQtmB,OACrBmU,GACJA,EAAO+b,aAAc1sB,EAAMxD,QAK3B6mB,MAILhlB,EAAOwB,MACN8sB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUhsB,EAAMisB,GAClB1uB,EAAOG,GAAIsC,GAAS,SAAUxC,GAO7B,IANA,GAAImB,GACHC,KACAstB,EAAS3uB,EAAQC,GACjBgC,EAAO0sB,EAAO5tB,OAAS,EACvBa,EAAI,EAEGA,GAAKK,EAAML,IAClBR,EAAQQ,IAAMK,EAAO9D,KAAOA,KAAK0E,OAAO,GACxC7C,EAAQ2uB,EAAQ/sB,IAAO8sB,GAAYttB,GAInCzC,EAAKkD,MAAOR,EAAKD,EAAMH,MAGxB,OAAO9C,MAAKgD,UAAWE,KAGzB,IAAIutB,IAAU,UAEVC,GAAY,GAAIzmB,QAAQ,KAAOwZ,EAAO,kBAAmB,KAEzDkN,GAAY,SAAUntB,GAKxB,GAAI+oB,GAAO/oB,EAAK2J,cAAc4C,WAM9B,OAJMwc,IAASA,EAAKqE,SACnBrE,EAAOxsB,GAGDwsB,EAAKsE,iBAAkBrtB,KAKhC,WAIC,QAASstB,KAGR,GAAM1J,EAAN,CAIAA,EAAItD,MAAMiN,QACT,4GAID3J,EAAIxW,UAAY,GAChBjB,GAAgBlO,YAAauvB,EAE7B,IAAIC,GAAWlxB,EAAO8wB,iBAAkBzJ,EACxC8J,GAAoC,OAAjBD,EAASjhB,IAG5BmhB,EAAgD,QAAxBF,EAASG,WACjCC,EAA0C,QAAnBJ,EAASK,MAIhClK,EAAItD,MAAMyN,YAAc,MACxBC,EAA+C,QAAzBP,EAASM,YAE/B5hB,GAAgBhO,YAAaqvB,GAI7B5J,EAAM,MAGP,GAAI8J,GAAkBG,EAAsBG,EAAqBL,EAChEH,EAAYpxB,EAAS0B,cAAe,OACpC8lB,EAAMxnB,EAAS0B,cAAe,MAGzB8lB,GAAItD,QAMVsD,EAAItD,MAAM2N,eAAiB,cAC3BrK,EAAIE,WAAW,GAAOxD,MAAM2N,eAAiB,GAC7CxwB,EAAQywB,gBAA+C,gBAA7BtK,EAAItD,MAAM2N,eAEpCT,EAAUlN,MAAMiN,QAAU,4FAE1BC,EAAUvvB,YAAa2lB,GAEvBvlB,EAAOuC,OAAQnD,GACd0wB,cAAe,WAEd,MADAb,KACOI,GAERU,kBAAmB,WAElB,MADAd,KACOO,GAERQ,iBAAkB,WAEjB,MADAf,KACOU,GAERM,mBAAoB,WAEnB,MADAhB,KACOK,QAMV,SAASY,IAAQvuB,EAAMc,EAAM0tB,GAC5B,GAAIV,GAAOW,EAAUC,EAAUhvB,EAC9B4gB,EAAQtgB,EAAKsgB,KAoCd,OAlCAkO,GAAWA,GAAYrB,GAAWntB,GAI7BwuB,IACJ9uB,EAAM8uB,EAASG,iBAAkB7tB,IAAU0tB,EAAU1tB,GAExC,KAARpB,GAAerB,EAAOgH,SAAUrF,EAAK2J,cAAe3J,KACxDN,EAAMrB,EAAOiiB,MAAOtgB,EAAMc,KAQrBrD,EAAQ4wB,oBAAsBnB,GAAUhjB,KAAMxK,IAASutB,GAAQ/iB,KAAMpJ,KAG1EgtB,EAAQxN,EAAMwN,MACdW,EAAWnO,EAAMmO,SACjBC,EAAWpO,EAAMoO,SAGjBpO,EAAMmO,SAAWnO,EAAMoO,SAAWpO,EAAMwN,MAAQpuB,EAChDA,EAAM8uB,EAASV,MAGfxN,EAAMwN,MAAQA,EACdxN,EAAMmO,SAAWA,EACjBnO,EAAMoO,SAAWA,IAIJltB,SAAR9B,EAINA,EAAM,GACNA,EAIF,QAASkvB,IAAcC,EAAaC,GAGnC,OACCxvB,IAAK,WACJ,MAAKuvB,gBAIGryB,MAAK8C,KAKJ9C,KAAK8C,IAAMwvB,GAAS5uB,MAAO1D,KAAM2D,aAM7C,GAKC4uB,IAAe,4BACfC,IAAYC,SAAU,WAAYC,WAAY,SAAU3O,QAAS,SACjE4O,IACCC,cAAe,IACfC,WAAY,OAGbC,IAAgB,SAAU,MAAO,MACjCC,GAAanzB,EAAS0B,cAAe,OAAQwiB,KAG9C,SAASkP,IAAgB1uB,GAGxB,GAAKA,IAAQyuB,IACZ,MAAOzuB,EAIR,IAAI2uB,GAAU3uB,EAAM,GAAI9B,cAAgB8B,EAAKhE,MAAO,GACnDmD,EAAIqvB,GAAYlwB,MAEjB,OAAQa,IAEP,GADAa,EAAOwuB,GAAarvB,GAAMwvB,EACrB3uB,IAAQyuB,IACZ,MAAOzuB,GAKV,QAAS4uB,IAAmB1vB,EAAM4D,EAAO+rB,GAIxC,GAAIlsB,GAAU0c,GAAQvW,KAAMhG,EAC5B,OAAOH,GAGN/B,KAAKkuB,IAAK,EAAGnsB,EAAS,IAAQksB,GAAY,KAAUlsB,EAAS,IAAO,MACpEG,EAGF,QAASisB,IAAsB7vB,EAAMc,EAAMgvB,EAAOC,EAAaC,GAC9D,GAAI/vB,GACHuO,EAAM,CAWP,KAPCvO,EADI6vB,KAAYC,EAAc,SAAW,WACrC,EAIS,UAATjvB,EAAmB,EAAI,EAGpBb,EAAI,EAAGA,GAAK,EAGJ,WAAV6vB,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM8vB,EAAQ1P,GAAWngB,IAAK,EAAM+vB,IAGnDD,GAGW,YAAVD,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,UAAYogB,GAAWngB,IAAK,EAAM+vB,IAI7C,WAAVF,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,SAAWogB,GAAWngB,GAAM,SAAS,EAAM+vB,MAKrExhB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,UAAYogB,GAAWngB,IAAK,EAAM+vB,GAG5C,YAAVF,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,SAAWogB,GAAWngB,GAAM,SAAS,EAAM+vB,IAKvE,OAAOxhB,GAGR,QAASyhB,IAAkBjwB,EAAMc,EAAMgvB,GAGtC,GAAIthB,GACH0hB,GAAmB,EACnBF,EAAS7C,GAAWntB,GACpB+vB,EAAiE,eAAnD1xB,EAAOmiB,IAAKxgB,EAAM,aAAa,EAAOgwB,EAYrD,IAPKhwB,EAAKmwB,iBAAiB/wB,SAC1BoP,EAAMxO,EAAKowB,wBAAyBtvB,IAMhC0N,GAAO,GAAY,MAAPA,EAAc,CAS9B,GANAA,EAAM+f,GAAQvuB,EAAMc,EAAMkvB,IACrBxhB,EAAM,GAAY,MAAPA,KACfA,EAAMxO,EAAKsgB,MAAOxf,IAIdosB,GAAUhjB,KAAMsE,GACpB,MAAOA,EAKR0hB,GAAmBH,IAChBtyB,EAAQ2wB,qBAAuB5f,IAAQxO,EAAKsgB,MAAOxf,IAGtD0N,EAAMjM,WAAYiM,IAAS,EAI5B,MAASA,GACRqhB,GACC7vB,EACAc,EACAgvB,IAAWC,EAAc,SAAW,WACpCG,EACAF,GAEE,KAGL3xB,EAAOuC,QAINyvB,UACCC,SACChxB,IAAK,SAAUU,EAAMwuB,GACpB,GAAKA,EAAW,CAGf,GAAI9uB,GAAM6uB,GAAQvuB,EAAM,UACxB,OAAe,KAARN,EAAa,IAAMA,MAO9B0hB,WACCmP,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdtB,YAAc,EACduB,YAAc,EACdN,SAAW,EACXO,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKTC,UACCC,QAAS,YAIV7Q,MAAO,SAAUtgB,EAAMc,EAAM8C,EAAOksB,GAGnC,GAAM9vB,GAA0B,IAAlBA,EAAKiJ,UAAoC,IAAlBjJ,EAAKiJ,UAAmBjJ,EAAKsgB,MAAlE,CAKA,GAAI5gB,GAAKwC,EAAMwd,EACd0R,EAAW/yB,EAAOuE,UAAW9B,GAC7Bwf,EAAQtgB,EAAKsgB,KASd,OAPAxf,GAAOzC,EAAO6yB,SAAUE,KACrB/yB,EAAO6yB,SAAUE,GAAa5B,GAAgB4B,IAAcA,GAG/D1R,EAAQrhB,EAAOgyB,SAAUvvB,IAAUzC,EAAOgyB,SAAUe,GAGrC5vB,SAAVoC,EAoCC8b,GAAS,OAASA,IACwBle,UAA5C9B,EAAMggB,EAAMpgB,IAAKU,GAAM,EAAO8vB,IAEzBpwB,EAID4gB,EAAOxf,IA1CdoB,QAAc0B,GAGA,WAAT1B,IAAuBxC,EAAMygB,GAAQvW,KAAMhG,KAAalE,EAAK,KACjEkE,EAAQ+c,GAAW3gB,EAAMc,EAAMpB,GAG/BwC,EAAO,UAIM,MAAT0B,GAAiBA,IAAUA,IAKlB,WAAT1B,IACJ0B,GAASlE,GAAOA,EAAK,KAASrB,EAAO+iB,UAAWgQ,GAAa,GAAK,OAI7D3zB,EAAQywB,iBAA6B,KAAVtqB,GAAiD,IAAjC9C,EAAK7D,QAAS,gBAC9DqjB,EAAOxf,GAAS,WAIX4e,GAAY,OAASA,IACsBle,UAA9CoC,EAAQ8b,EAAMjB,IAAKze,EAAM4D,EAAOksB,MAElCxP,EAAOxf,GAAS8C,IAlBjB,UAmCF4c,IAAK,SAAUxgB,EAAMc,EAAMgvB,EAAOE,GACjC,GAAIxhB,GAAKjP,EAAKmgB,EACb0R,EAAW/yB,EAAOuE,UAAW9B,EAyB9B,OAtBAA,GAAOzC,EAAO6yB,SAAUE,KACrB/yB,EAAO6yB,SAAUE,GAAa5B,GAAgB4B,IAAcA,GAG/D1R,EAAQrhB,EAAOgyB,SAAUvvB,IAAUzC,EAAOgyB,SAAUe,GAG/C1R,GAAS,OAASA,KACtBlR,EAAMkR,EAAMpgB,IAAKU,GAAM,EAAM8vB,IAIjBtuB,SAARgN,IACJA,EAAM+f,GAAQvuB,EAAMc,EAAMkvB,IAId,WAARxhB,GAAoB1N,IAAQquB,MAChC3gB,EAAM2gB,GAAoBruB,IAIZ,KAAVgvB,GAAgBA,GACpBvwB,EAAMgD,WAAYiM,GACXshB,KAAU,GAAQuB,SAAU9xB,GAAQA,GAAO,EAAIiP,GAEhDA,KAITnQ,EAAOwB,MAAQ,SAAU,SAAW,SAAUI,EAAGa,GAChDzC,EAAOgyB,SAAUvvB,IAChBxB,IAAK,SAAUU,EAAMwuB,EAAUsB,GAC9B,GAAKtB,EAIJ,OAAOO,GAAa7kB,KAAM7L,EAAOmiB,IAAKxgB,EAAM,aAQxCA,EAAKmwB,iBAAiB/wB,QAAWY,EAAKowB,wBAAwBtC,MAIhEmC,GAAkBjwB,EAAMc,EAAMgvB,GAH9BrP,GAAMzgB,EAAMgvB,GAAS,WACpB,MAAOiB,IAAkBjwB,EAAMc,EAAMgvB,MAM1CrR,IAAK,SAAUze,EAAM4D,EAAOksB,GAC3B,GAAIrsB,GACHusB,EAASF,GAAS3C,GAAWntB,GAC7B2vB,EAAWG,GAASD,GACnB7vB,EACAc,EACAgvB,EACmD,eAAnDzxB,EAAOmiB,IAAKxgB,EAAM,aAAa,EAAOgwB,GACtCA,EAWF,OAPKL,KAAclsB,EAAU0c,GAAQvW,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElBzD,EAAKsgB,MAAOxf,GAAS8C,EACrBA,EAAQvF,EAAOmiB,IAAKxgB,EAAMc,IAGpB4uB,GAAmB1vB,EAAM4D,EAAO+rB,OAK1CtxB,EAAOgyB,SAASzC,WAAagB,GAAcnxB,EAAQ6wB,mBAClD,SAAUtuB,EAAMwuB,GACf,GAAKA,EACJ,OAASjsB,WAAYgsB,GAAQvuB,EAAM,gBAClCA,EAAKowB,wBAAwBkB,KAC5B7Q,GAAMzgB,GAAQ4tB,WAAY,GAAK,WAC9B,MAAO5tB,GAAKowB,wBAAwBkB,QAElC,OAMRjzB,EAAOwB,MACN0xB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBtzB,EAAOgyB,SAAUqB,EAASC,IACzBC,OAAQ,SAAUhuB,GAOjB,IANA,GAAI3D,GAAI,EACP4xB,KAGAC,EAAyB,gBAAVluB,GAAqBA,EAAMS,MAAO,MAAUT,GAEpD3D,EAAI,EAAGA,IACd4xB,EAAUH,EAAStR,GAAWngB,GAAM0xB,GACnCG,EAAO7xB,IAAO6xB,EAAO7xB,EAAI,IAAO6xB,EAAO,EAGzC,OAAOD,KAIH5E,GAAQ/iB,KAAMwnB,KACnBrzB,EAAOgyB,SAAUqB,EAASC,GAASlT,IAAMiR,MAI3CrxB,EAAOG,GAAGoC,QACT4f,IAAK,SAAU1f,EAAM8C,GACpB,MAAOka,GAAQthB,KAAM,SAAUwD,EAAMc,EAAM8C,GAC1C,GAAIosB,GAAQzvB,EACXR,KACAE,EAAI,CAEL,IAAK5B,EAAOkD,QAAST,GAAS,CAI7B,IAHAkvB,EAAS7C,GAAWntB,GACpBO,EAAMO,EAAK1B,OAEHa,EAAIM,EAAKN,IAChBF,EAAKe,EAAMb,IAAQ5B,EAAOmiB,IAAKxgB,EAAMc,EAAMb,IAAK,EAAO+vB,EAGxD,OAAOjwB,GAGR,MAAiByB,UAAVoC,EACNvF,EAAOiiB,MAAOtgB,EAAMc,EAAM8C,GAC1BvF,EAAOmiB,IAAKxgB,EAAMc,IACjBA,EAAM8C,EAAOzD,UAAUf,OAAS,KAKrC,SAAS2yB,IAAO/xB,EAAMa,EAAS8d,EAAMle,EAAKuxB,GACzC,MAAO,IAAID,IAAM9yB,UAAUR,KAAMuB,EAAMa,EAAS8d,EAAMle,EAAKuxB,GAE5D3zB,EAAO0zB,MAAQA,GAEfA,GAAM9yB,WACLE,YAAa4yB,GACbtzB,KAAM,SAAUuB,EAAMa,EAAS8d,EAAMle,EAAKuxB,EAAQ7Q,GACjD3kB,KAAKwD,KAAOA,EACZxD,KAAKmiB,KAAOA,EACZniB,KAAKw1B,OAASA,GAAU3zB,EAAO2zB,OAAOzP,SACtC/lB,KAAKqE,QAAUA,EACfrE,KAAKkU,MAAQlU,KAAKyH,IAAMzH,KAAKgP,MAC7BhP,KAAKiE,IAAMA,EACXjE,KAAK2kB,KAAOA,IAAU9iB,EAAO+iB,UAAWzC,GAAS,GAAK,OAEvDnT,IAAK,WACJ,GAAIkU,GAAQqS,GAAME,UAAWz1B,KAAKmiB,KAElC,OAAOe,IAASA,EAAMpgB,IACrBogB,EAAMpgB,IAAK9C,MACXu1B,GAAME,UAAU1P,SAASjjB,IAAK9C,OAEhC01B,IAAK,SAAUC,GACd,GAAIC,GACH1S,EAAQqS,GAAME,UAAWz1B,KAAKmiB,KAoB/B,OAlBKniB,MAAKqE,QAAQwxB,SACjB71B,KAAK81B,IAAMF,EAAQ/zB,EAAO2zB,OAAQx1B,KAAKw1B,QACtCG,EAAS31B,KAAKqE,QAAQwxB,SAAWF,EAAS,EAAG,EAAG31B,KAAKqE,QAAQwxB,UAG9D71B,KAAK81B,IAAMF,EAAQD,EAEpB31B,KAAKyH,KAAQzH,KAAKiE,IAAMjE,KAAKkU,OAAU0hB,EAAQ51B,KAAKkU,MAE/ClU,KAAKqE,QAAQ0xB,MACjB/1B,KAAKqE,QAAQ0xB,KAAK/0B,KAAMhB,KAAKwD,KAAMxD,KAAKyH,IAAKzH,MAGzCkjB,GAASA,EAAMjB,IACnBiB,EAAMjB,IAAKjiB,MAEXu1B,GAAME,UAAU1P,SAAS9D,IAAKjiB,MAExBA,OAITu1B,GAAM9yB,UAAUR,KAAKQ,UAAY8yB,GAAM9yB,UAEvC8yB,GAAME,WACL1P,UACCjjB,IAAK,SAAUuhB,GACd,GAAI5Q,EAIJ,OAA6B,KAAxB4Q,EAAM7gB,KAAKiJ,UACa,MAA5B4X,EAAM7gB,KAAM6gB,EAAMlC,OAAoD,MAAlCkC,EAAM7gB,KAAKsgB,MAAOO,EAAMlC,MACrDkC,EAAM7gB,KAAM6gB,EAAMlC,OAO1B1O,EAAS5R,EAAOmiB,IAAKK,EAAM7gB,KAAM6gB,EAAMlC,KAAM,IAGrC1O,GAAqB,SAAXA,EAAwBA,EAAJ,IAEvCwO,IAAK,SAAUoC,GAKTxiB,EAAOm0B,GAAGD,KAAM1R,EAAMlC,MAC1BtgB,EAAOm0B,GAAGD,KAAM1R,EAAMlC,MAAQkC,GACK,IAAxBA,EAAM7gB,KAAKiJ,UACiC,MAArD4X,EAAM7gB,KAAKsgB,MAAOjiB,EAAO6yB,SAAUrQ,EAAMlC,SAC1CtgB,EAAOgyB,SAAUxP,EAAMlC,MAGxBkC,EAAM7gB,KAAM6gB,EAAMlC,MAASkC,EAAM5c,IAFjC5F,EAAOiiB,MAAOO,EAAM7gB,KAAM6gB,EAAMlC,KAAMkC,EAAM5c,IAAM4c,EAAMM,SAU5D4Q,GAAME,UAAUQ,UAAYV,GAAME,UAAUS,YAC3CjU,IAAK,SAAUoC,GACTA,EAAM7gB,KAAKiJ,UAAY4X,EAAM7gB,KAAK9B,aACtC2iB,EAAM7gB,KAAM6gB,EAAMlC,MAASkC,EAAM5c,OAKpC5F,EAAO2zB,QACNW,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAMlxB,KAAKoxB,IAAKF,EAAIlxB,KAAKqxB,IAAO,GAExCxQ,SAAU,SAGXlkB,EAAOm0B,GAAKT,GAAM9yB,UAAUR,KAG5BJ,EAAOm0B,GAAGD,OAKV,IACCS,IAAOC,GACPC,GAAW,yBACXC,GAAO,aAER,SAASC,MACHH,KACJ12B,EAAO82B,sBAAuBD,IAC9B/0B,EAAOm0B,GAAGc,QAKZ,QAASC,MAIR,MAHAh3B,GAAO+f,WAAY,WAClB0W,GAAQxxB,SAEAwxB,GAAQ30B,EAAO4F,MAIzB,QAASuvB,IAAOtxB,EAAMuxB,GACrB,GAAI1J,GACH9pB,EAAI,EACJmL,GAAUsoB,OAAQxxB,EAKnB,KADAuxB,EAAeA,EAAe,EAAI,EAC1BxzB,EAAI,EAAGA,GAAK,EAAIwzB,EACvB1J,EAAQ3J,GAAWngB,GACnBmL,EAAO,SAAW2e,GAAU3e,EAAO,UAAY2e,GAAU7nB,CAO1D,OAJKuxB,KACJroB,EAAMklB,QAAUllB,EAAM0iB,MAAQ5rB,GAGxBkJ,EAGR,QAASuoB,IAAa/vB,EAAO+a,EAAMiV,GAKlC,IAJA,GAAI/S,GACH0K,GAAesI,GAAUC,SAAUnV,QAAe5hB,OAAQ82B,GAAUC,SAAU,MAC9E/b,EAAQ,EACR3Y,EAASmsB,EAAWnsB,OACb2Y,EAAQ3Y,EAAQ2Y,IACvB,GAAO8I,EAAQ0K,EAAYxT,GAAQva,KAAMo2B,EAAWjV,EAAM/a,GAGzD,MAAOid,GAKV,QAASkT,IAAkB/zB,EAAM6nB,EAAOmM,GACvC,GAAIrV,GAAM/a,EAAOie,EAAQnC,EAAOuU,EAASC,EAAWC,EAAgB5T,EACnE6T,EAAQ,SAAWvM,IAAS,UAAYA,GACxCwM,EAAO73B,KACP4tB,KACA9J,EAAQtgB,EAAKsgB,MACbgU,EAASt0B,EAAKiJ,UAAYoX,GAAoBrgB,GAC9Cu0B,EAAW1V,EAASvf,IAAKU,EAAM,SAG1Bg0B,GAAK5a,QACVsG,EAAQrhB,EAAOshB,YAAa3f,EAAM,MACX,MAAlB0f,EAAM8U,WACV9U,EAAM8U,SAAW,EACjBP,EAAUvU,EAAMpN,MAAMgH,KACtBoG,EAAMpN,MAAMgH,KAAO,WACZoG,EAAM8U,UACXP,MAIHvU,EAAM8U,WAENH,EAAKzZ,OAAQ,WAGZyZ,EAAKzZ,OAAQ,WACZ8E,EAAM8U,WACAn2B,EAAO+a,MAAOpZ,EAAM,MAAOZ,QAChCsgB,EAAMpN,MAAMgH,WAOhB,KAAMqF,IAAQkJ,GAEb,GADAjkB,EAAQikB,EAAOlJ,GACVuU,GAAShpB,KAAMtG,GAAU,CAG7B,SAFOikB,GAAOlJ,GACdkD,EAASA,GAAoB,WAAVje,EACdA,KAAY0wB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAV1wB,IAAoB2wB,GAAiC/yB,SAArB+yB,EAAU5V,GAK9C,QAJA2V,IAAS,EAOXlK,EAAMzL,GAAS4V,GAAYA,EAAU5V,IAAUtgB,EAAOiiB,MAAOtgB,EAAM2e,GAMrE,GADAuV,GAAa71B,EAAOqE,cAAemlB,GAC7BqM,IAAa71B,EAAOqE,cAAe0nB,GAAzC,CAKKgK,GAA2B,IAAlBp0B,EAAKiJ,WAKlB+qB,EAAKS,UAAanU,EAAMmU,SAAUnU,EAAMoU,UAAWpU,EAAMqU,WAGzDR,EAAiBI,GAAYA,EAAShU,QACf,MAAlB4T,IACJA,EAAiBtV,EAASvf,IAAKU,EAAM,YAEtCugB,EAAUliB,EAAOmiB,IAAKxgB,EAAM,WACX,SAAZugB,IACC4T,EACJ5T,EAAU4T,GAIV1S,IAAYzhB,IAAQ,GACpBm0B,EAAiBn0B,EAAKsgB,MAAMC,SAAW4T,EACvC5T,EAAUliB,EAAOmiB,IAAKxgB,EAAM,WAC5ByhB,IAAYzhB,OAKG,WAAZugB,GAAoC,iBAAZA,GAAgD,MAAlB4T,IACrB,SAAhC91B,EAAOmiB,IAAKxgB,EAAM,WAGhBk0B,IACLG,EAAK7uB,KAAM,WACV8a,EAAMC,QAAU4T,IAEM,MAAlBA,IACJ5T,EAAUD,EAAMC,QAChB4T,EAA6B,SAAZ5T,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdyT,EAAKS,WACTnU,EAAMmU,SAAW,SACjBJ,EAAKzZ,OAAQ,WACZ0F,EAAMmU,SAAWT,EAAKS,SAAU,GAChCnU,EAAMoU,UAAYV,EAAKS,SAAU,GACjCnU,EAAMqU,UAAYX,EAAKS,SAAU,MAKnCP,GAAY,CACZ,KAAMvV,IAAQyL,GAGP8J,IACAK,EACC,UAAYA,KAChBD,EAASC,EAASD,QAGnBC,EAAW1V,EAASf,OAAQ9d,EAAM,UAAYugB,QAAS4T,IAInDtS,IACJ0S,EAASD,QAAUA,GAIfA,GACJ7S,IAAYzhB,IAAQ,GAKrBq0B,EAAK7uB,KAAM,WAKJ8uB,GACL7S,IAAYzhB,IAEb6e,EAASpF,OAAQzZ,EAAM,SACvB,KAAM2e,IAAQyL,GACb/rB,EAAOiiB,MAAOtgB,EAAM2e,EAAMyL,EAAMzL,OAMnCuV,EAAYP,GAAaW,EAASC,EAAU5V,GAAS,EAAGA,EAAM0V,GACtD1V,IAAQ4V,KACfA,EAAU5V,GAASuV,EAAUxjB,MACxB4jB,IACJJ,EAAUzzB,IAAMyzB,EAAUxjB,MAC1BwjB,EAAUxjB,MAAQ,KAMtB,QAASkkB,IAAY/M,EAAOgN,GAC3B,GAAI9c,GAAOjX,EAAMkxB,EAAQpuB,EAAO8b,CAGhC,KAAM3H,IAAS8P,GAed,GAdA/mB,EAAOzC,EAAOuE,UAAWmV,GACzBia,EAAS6C,EAAe/zB,GACxB8C,EAAQikB,EAAO9P,GACV1Z,EAAOkD,QAASqC,KACpBouB,EAASpuB,EAAO,GAChBA,EAAQikB,EAAO9P,GAAUnU,EAAO,IAG5BmU,IAAUjX,IACd+mB,EAAO/mB,GAAS8C,QACTikB,GAAO9P,IAGf2H,EAAQrhB,EAAOgyB,SAAUvvB,GACpB4e,GAAS,UAAYA,GAAQ,CACjC9b,EAAQ8b,EAAMkS,OAAQhuB,SACfikB,GAAO/mB,EAId,KAAMiX,IAASnU,GACNmU,IAAS8P,KAChBA,EAAO9P,GAAUnU,EAAOmU,GACxB8c,EAAe9c,GAAUia,OAI3B6C,GAAe/zB,GAASkxB,EAK3B,QAAS6B,IAAW7zB,EAAM80B,EAAYj0B,GACrC,GAAIoP,GACH8kB,EACAhd,EAAQ,EACR3Y,EAASy0B,GAAUmB,WAAW51B,OAC9Byb,EAAWxc,EAAOmc,WAAWI,OAAQ,iBAG7B0Y,GAAKtzB,OAEbszB,EAAO,WACN,GAAKyB,EACJ,OAAO,CAYR,KAVA,GAAIE,GAAcjC,IAASO,KAC1B7W,EAAYhb,KAAKkuB,IAAK,EAAGgE,EAAUsB,UAAYtB,EAAUvB,SAAW4C,GAIpErgB,EAAO8H,EAAYkX,EAAUvB,UAAY,EACzCF,EAAU,EAAIvd,EACdmD,EAAQ,EACR3Y,EAASw0B,EAAUuB,OAAO/1B,OAEnB2Y,EAAQ3Y,EAAQ2Y,IACvB6b,EAAUuB,OAAQpd,GAAQma,IAAKC,EAKhC,OAFAtX,GAASkB,WAAY/b,GAAQ4zB,EAAWzB,EAASzV,IAE5CyV,EAAU,GAAK/yB,EACZsd,GAEP7B,EAASmB,YAAahc,GAAQ4zB,KACvB,IAGTA,EAAY/Y,EAASR,SACpBra,KAAMA,EACN6nB,MAAOxpB,EAAOuC,UAAYk0B,GAC1Bd,KAAM31B,EAAOuC,QAAQ,GACpBi0B,iBACA7C,OAAQ3zB,EAAO2zB,OAAOzP,UACpB1hB,GACHu0B,mBAAoBN,EACpBO,gBAAiBx0B,EACjBq0B,UAAWlC,IAASO,KACpBlB,SAAUxxB,EAAQwxB,SAClB8C,UACAxB,YAAa,SAAUhV,EAAMle,GAC5B,GAAIogB,GAAQxiB,EAAO0zB,MAAO/xB,EAAM4zB,EAAUI,KAAMrV,EAAMle,EACpDmzB,EAAUI,KAAKa,cAAelW,IAAUiV,EAAUI,KAAKhC,OAEzD,OADA4B,GAAUuB,OAAOn4B,KAAM6jB,GAChBA,GAERjB,KAAM,SAAU0V,GACf,GAAIvd,GAAQ,EAIX3Y,EAASk2B,EAAU1B,EAAUuB,OAAO/1B,OAAS,CAC9C,IAAK21B,EACJ,MAAOv4B,KAGR,KADAu4B,GAAU,EACFhd,EAAQ3Y,EAAQ2Y,IACvB6b,EAAUuB,OAAQpd,GAAQma,IAAK,EAUhC,OANKoD,IACJza,EAASkB,WAAY/b,GAAQ4zB,EAAW,EAAG,IAC3C/Y,EAASmB,YAAahc,GAAQ4zB,EAAW0B,KAEzCza,EAASuB,WAAYpc,GAAQ4zB,EAAW0B,IAElC94B,QAGTqrB,EAAQ+L,EAAU/L,KAInB,KAFA+M,GAAY/M,EAAO+L,EAAUI,KAAKa,eAE1B9c,EAAQ3Y,EAAQ2Y,IAEvB,GADA9H,EAAS4jB,GAAUmB,WAAYjd,GAAQva,KAAMo2B,EAAW5zB,EAAM6nB,EAAO+L,EAAUI,MAM9E,MAJK31B,GAAOgD,WAAY4O,EAAO2P,QAC9BvhB,EAAOshB,YAAaiU,EAAU5zB,KAAM4zB,EAAUI,KAAK5a,OAAQwG,KAC1DvhB,EAAOyF,MAAOmM,EAAO2P,KAAM3P,IAEtBA,CAmBT,OAfA5R,GAAO0B,IAAK8nB,EAAO8L,GAAaC,GAE3Bv1B,EAAOgD,WAAYuyB,EAAUI,KAAKtjB,QACtCkjB,EAAUI,KAAKtjB,MAAMlT,KAAMwC,EAAM4zB,GAGlCv1B,EAAOm0B,GAAG+C,MACTl3B,EAAOuC,OAAQ0yB,GACdtzB,KAAMA,EACNq0B,KAAMT,EACNxa,MAAOwa,EAAUI,KAAK5a,SAKjBwa,EAAUxY,SAAUwY,EAAUI,KAAK5Y,UACxC5V,KAAMouB,EAAUI,KAAKxuB,KAAMouB,EAAUI,KAAKwB,UAC1Clb,KAAMsZ,EAAUI,KAAK1Z,MACrBM,OAAQgZ,EAAUI,KAAKpZ,QAG1Bvc,EAAOw1B,UAAYx1B,EAAOuC,OAAQizB,IAEjCC,UACC2B,KAAO,SAAU9W,EAAM/a,GACtB,GAAIid,GAAQrkB,KAAKm3B,YAAahV,EAAM/a,EAEpC,OADA+c,IAAWE,EAAM7gB,KAAM2e,EAAMwB,GAAQvW,KAAMhG,GAASid,GAC7CA,KAIT6U,QAAS,SAAU7N,EAAO/nB,GACpBzB,EAAOgD,WAAYwmB,IACvB/nB,EAAW+nB,EACXA,GAAU,MAEVA,EAAQA,EAAMte,MAAOoP,EAOtB,KAJA,GAAIgG,GACH5G,EAAQ,EACR3Y,EAASyoB,EAAMzoB,OAER2Y,EAAQ3Y,EAAQ2Y,IACvB4G,EAAOkJ,EAAO9P,GACd8b,GAAUC,SAAUnV,GAASkV,GAAUC,SAAUnV,OACjDkV,GAAUC,SAAUnV,GAAOvQ,QAAStO,IAItCk1B,YAAcjB,IAEd4B,UAAW,SAAU71B,EAAUusB,GACzBA,EACJwH,GAAUmB,WAAW5mB,QAAStO,GAE9B+zB,GAAUmB,WAAWh4B,KAAM8C,MAK9BzB,EAAOu3B,MAAQ,SAAUA,EAAO5D,EAAQxzB,GACvC,GAAIq3B,GAAMD,GAA0B,gBAAVA,GAAqBv3B,EAAOuC,UAAYg1B,IACjEJ,SAAUh3B,IAAOA,GAAMwzB,GACtB3zB,EAAOgD,WAAYu0B,IAAWA,EAC/BvD,SAAUuD,EACV5D,OAAQxzB,GAAMwzB,GAAUA,IAAW3zB,EAAOgD,WAAY2wB,IAAYA,EAoCnE,OAhCK3zB,GAAOm0B,GAAG5N,KAAOxoB,EAASk4B,OAC9BuB,EAAIxD,SAAW,EAGc,gBAAjBwD,GAAIxD,WACVwD,EAAIxD,WAAYh0B,GAAOm0B,GAAGsD,OAC9BD,EAAIxD,SAAWh0B,EAAOm0B,GAAGsD,OAAQD,EAAIxD,UAGrCwD,EAAIxD,SAAWh0B,EAAOm0B,GAAGsD,OAAOvT,UAMjB,MAAbsT,EAAIzc,OAAiByc,EAAIzc,SAAU,IACvCyc,EAAIzc,MAAQ,MAIbyc,EAAInV,IAAMmV,EAAIL,SAEdK,EAAIL,SAAW,WACTn3B,EAAOgD,WAAYw0B,EAAInV,MAC3BmV,EAAInV,IAAIljB,KAAMhB,MAGVq5B,EAAIzc,OACR/a,EAAOmhB,QAAShjB,KAAMq5B,EAAIzc,QAIrByc,GAGRx3B,EAAOG,GAAGoC,QACTm1B,OAAQ,SAAUH,EAAOI,EAAIhE,EAAQlyB,GAGpC,MAAOtD,MAAKuQ,OAAQsT,IAAqBG,IAAK,UAAW,GAAIkB,OAG3DjhB,MAAMw1B,SAAW3F,QAAS0F,GAAMJ,EAAO5D,EAAQlyB,IAElDm2B,QAAS,SAAUtX,EAAMiX,EAAO5D,EAAQlyB,GACvC,GAAIwS,GAAQjU,EAAOqE,cAAeic,GACjCuX,EAAS73B,EAAOu3B,MAAOA,EAAO5D,EAAQlyB,GACtCq2B,EAAc,WAGb,GAAI9B,GAAOR,GAAWr3B,KAAM6B,EAAOuC,UAAY+d,GAAQuX,IAGlD5jB,GAASuM,EAASvf,IAAK9C,KAAM,YACjC63B,EAAKzU,MAAM,GAKd,OAFCuW,GAAYC,OAASD,EAEf7jB,GAAS4jB,EAAO9c,SAAU,EAChC5c,KAAKqD,KAAMs2B,GACX35B,KAAK4c,MAAO8c,EAAO9c,MAAO+c,IAE5BvW,KAAM,SAAU1d,EAAM4d,EAAYwV,GACjC,GAAIe,GAAY,SAAU3W,GACzB,GAAIE,GAAOF,EAAME,WACVF,GAAME,KACbA,EAAM0V,GAYP,OATqB,gBAATpzB,KACXozB,EAAUxV,EACVA,EAAa5d,EACbA,EAAOV,QAEHse,GAAc5d,KAAS,GAC3B1F,KAAK4c,MAAOlX,GAAQ,SAGd1F,KAAKqD,KAAM,WACjB,GAAI2f,IAAU,EACbzH,EAAgB,MAAR7V,GAAgBA,EAAO,aAC/Bo0B,EAASj4B,EAAOi4B,OAChB5X,EAAOG,EAASvf,IAAK9C,KAEtB,IAAKub,EACC2G,EAAM3G,IAAW2G,EAAM3G,GAAQ6H,MACnCyW,EAAW3X,EAAM3G,QAGlB,KAAMA,IAAS2G,GACTA,EAAM3G,IAAW2G,EAAM3G,GAAQ6H,MAAQuT,GAAKjpB,KAAM6N,IACtDse,EAAW3X,EAAM3G,GAKpB,KAAMA,EAAQue,EAAOl3B,OAAQ2Y,KACvBue,EAAQve,GAAQ/X,OAASxD,MACnB,MAAR0F,GAAgBo0B,EAAQve,GAAQqB,QAAUlX,IAE5Co0B,EAAQve,GAAQsc,KAAKzU,KAAM0V,GAC3B9V,GAAU,EACV8W,EAAO31B,OAAQoX,EAAO,KAOnByH,GAAY8V,GAChBj3B,EAAOmhB,QAAShjB,KAAM0F,MAIzBk0B,OAAQ,SAAUl0B,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAET1F,KAAKqD,KAAM,WACjB,GAAIkY,GACH2G,EAAOG,EAASvf,IAAK9C,MACrB4c,EAAQsF,EAAMxc,EAAO,SACrBwd,EAAQhB,EAAMxc,EAAO,cACrBo0B,EAASj4B,EAAOi4B,OAChBl3B,EAASga,EAAQA,EAAMha,OAAS,CAajC,KAVAsf,EAAK0X,QAAS,EAGd/3B,EAAO+a,MAAO5c,KAAM0F,MAEfwd,GAASA,EAAME,MACnBF,EAAME,KAAKpiB,KAAMhB,MAAM,GAIlBub,EAAQue,EAAOl3B,OAAQ2Y,KACvBue,EAAQve,GAAQ/X,OAASxD,MAAQ85B,EAAQve,GAAQqB,QAAUlX,IAC/Do0B,EAAQve,GAAQsc,KAAKzU,MAAM,GAC3B0W,EAAO31B,OAAQoX,EAAO,GAKxB,KAAMA,EAAQ,EAAGA,EAAQ3Y,EAAQ2Y,IAC3BqB,EAAOrB,IAAWqB,EAAOrB,GAAQqe,QACrChd,EAAOrB,GAAQqe,OAAO54B,KAAMhB,YAKvBkiB,GAAK0X,YAKf/3B,EAAOwB,MAAQ,SAAU,OAAQ,QAAU,SAAUI,EAAGa,GACvD,GAAIy1B,GAAQl4B,EAAOG,GAAIsC,EACvBzC,GAAOG,GAAIsC,GAAS,SAAU80B,EAAO5D,EAAQlyB,GAC5C,MAAgB,OAAT81B,GAAkC,iBAAVA,GAC9BW,EAAMr2B,MAAO1D,KAAM2D,WACnB3D,KAAKy5B,QAASzC,GAAO1yB,GAAM,GAAQ80B,EAAO5D,EAAQlyB,MAKrDzB,EAAOwB,MACN22B,UAAWhD,GAAO,QAClBiD,QAASjD,GAAO,QAChBkD,YAAalD,GAAO,UACpBmD,QAAUrG,QAAS,QACnBsG,SAAWtG,QAAS,QACpBuG,YAAcvG,QAAS,WACrB,SAAUxvB,EAAM+mB,GAClBxpB,EAAOG,GAAIsC,GAAS,SAAU80B,EAAO5D,EAAQlyB,GAC5C,MAAOtD,MAAKy5B,QAASpO,EAAO+N,EAAO5D,EAAQlyB,MAI7CzB,EAAOi4B,UACPj4B,EAAOm0B,GAAGc,KAAO,WAChB,GAAIiC,GACHt1B,EAAI,EACJq2B,EAASj4B,EAAOi4B,MAIjB,KAFAtD,GAAQ30B,EAAO4F,MAEPhE,EAAIq2B,EAAOl3B,OAAQa,IAC1Bs1B,EAAQe,EAAQr2B,GAGVs1B,KAAWe,EAAQr2B,KAAQs1B,GAChCe,EAAO31B,OAAQV,IAAK,EAIhBq2B,GAAOl3B,QACZf,EAAOm0B,GAAG5S,OAEXoT,GAAQxxB,QAGTnD,EAAOm0B,GAAG+C,MAAQ,SAAUA,GAC3Bl3B,EAAOi4B,OAAOt5B,KAAMu4B,GACfA,IACJl3B,EAAOm0B,GAAG9hB,QAEVrS,EAAOi4B,OAAOtwB,OAIhB3H,EAAOm0B,GAAGsE,SAAW,GACrBz4B,EAAOm0B,GAAG9hB,MAAQ,WACXuiB,KACLA,GAAU12B,EAAO82B,sBAChB92B,EAAO82B,sBAAuBD,IAC9B72B,EAAOw6B,YAAa14B,EAAOm0B,GAAGc,KAAMj1B,EAAOm0B,GAAGsE,YAIjDz4B,EAAOm0B,GAAG5S,KAAO,WACXrjB,EAAOy6B,qBACXz6B,EAAOy6B,qBAAsB/D,IAE7B12B,EAAO06B,cAAehE,IAGvBA,GAAU,MAGX50B,EAAOm0B,GAAGsD,QACToB,KAAM,IACNC,KAAM,IAGN5U,SAAU,KAMXlkB,EAAOG,GAAG44B,MAAQ,SAAUC,EAAMn1B,GAIjC,MAHAm1B,GAAOh5B,EAAOm0B,GAAKn0B,EAAOm0B,GAAGsD,OAAQuB,IAAUA,EAAOA,EACtDn1B,EAAOA,GAAQ,KAER1F,KAAK4c,MAAOlX,EAAM,SAAU6G,EAAM2W,GACxC,GAAI4X,GAAU/6B,EAAO+f,WAAYvT,EAAMsuB,EACvC3X,GAAME,KAAO,WACZrjB,EAAOg7B,aAAcD,OAMxB,WACC,GAAIjqB,GAAQjR,EAAS0B,cAAe,SACnC8G,EAASxI,EAAS0B,cAAe,UACjC+3B,EAAMjxB,EAAO3G,YAAa7B,EAAS0B,cAAe,UAEnDuP,GAAMnL,KAAO,WAIbzE,EAAQ+5B,QAA0B,KAAhBnqB,EAAMzJ,MAIxBnG,EAAQg6B,YAAc5B,EAAIzjB,SAI1B/E,EAAQjR,EAAS0B,cAAe,SAChCuP,EAAMzJ,MAAQ,IACdyJ,EAAMnL,KAAO,QACbzE,EAAQi6B,WAA6B,MAAhBrqB,EAAMzJ,QAI5B,IAAI+zB,IACHrsB,GAAajN,EAAOgQ,KAAK/C,UAE1BjN,GAAOG,GAAGoC,QACT2N,KAAM,SAAUzN,EAAM8C,GACrB,MAAOka,GAAQthB,KAAM6B,EAAOkQ,KAAMzN,EAAM8C,EAAOzD,UAAUf,OAAS,IAGnEw4B,WAAY,SAAU92B,GACrB,MAAOtE,MAAKqD,KAAM,WACjBxB,EAAOu5B,WAAYp7B,KAAMsE,QAK5BzC,EAAOuC,QACN2N,KAAM,SAAUvO,EAAMc,EAAM8C,GAC3B,GAAIlE,GAAKggB,EACRmY,EAAQ73B,EAAKiJ,QAGd,IAAe,IAAV4uB,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,mBAAtB73B,GAAKmK,aACT9L,EAAOsgB,KAAM3e,EAAMc,EAAM8C,IAKlB,IAAVi0B,GAAgBx5B,EAAOkY,SAAUvW,KACrC0f,EAAQrhB,EAAOy5B,UAAWh3B,EAAKiC,iBAC5B1E,EAAOgQ,KAAK9E,MAAMjC,KAAK4C,KAAMpJ,GAAS62B,GAAWn2B;AAGtCA,SAAVoC,EACW,OAAVA,MACJvF,GAAOu5B,WAAY53B,EAAMc,GAIrB4e,GAAS,OAASA,IACuBle,UAA3C9B,EAAMggB,EAAMjB,IAAKze,EAAM4D,EAAO9C,IACzBpB,GAGRM,EAAKoK,aAActJ,EAAM8C,EAAQ,IAC1BA,GAGH8b,GAAS,OAASA,IAA+C,QAApChgB,EAAMggB,EAAMpgB,IAAKU,EAAMc,IACjDpB,GAGRA,EAAMrB,EAAO4O,KAAKsB,KAAMvO,EAAMc,GAGhB,MAAPpB,EAAc8B,OAAY9B,KAGlCo4B,WACC51B,MACCuc,IAAK,SAAUze,EAAM4D,GACpB,IAAMnG,EAAQi6B,YAAwB,UAAV9zB,GAC3BvF,EAAOyE,SAAU9C,EAAM,SAAY,CACnC,GAAIwO,GAAMxO,EAAK4D,KAKf,OAJA5D,GAAKoK,aAAc,OAAQxG,GACtB4K,IACJxO,EAAK4D,MAAQ4K,GAEP5K,MAMXg0B,WAAY,SAAU53B,EAAM4D,GAC3B,GAAI9C,GACHb,EAAI,EAIJ83B,EAAYn0B,GAASA,EAAM2F,MAAOoP,EAEnC,IAAKof,GAA+B,IAAlB/3B,EAAKiJ,SACtB,MAAUnI,EAAOi3B,EAAW93B,KAC3BD,EAAK0K,gBAAiB5J,MAO1B62B,IACClZ,IAAK,SAAUze,EAAM4D,EAAO9C,GAQ3B,MAPK8C,MAAU,EAGdvF,EAAOu5B,WAAY53B,EAAMc,GAEzBd,EAAKoK,aAActJ,EAAMA,GAEnBA,IAITzC,EAAOwB,KAAMxB,EAAOgQ,KAAK9E,MAAMjC,KAAK4Y,OAAO3W,MAAO,QAAU,SAAUtJ,EAAGa,GACxE,GAAIk3B,GAAS1sB,GAAYxK,IAAUzC,EAAO4O,KAAKsB,IAE/CjD,IAAYxK,GAAS,SAAUd,EAAMc,EAAM2D,GAC1C,GAAI/E,GAAK4lB,EACR2S,EAAgBn3B,EAAKiC,aAYtB,OAVM0B,KAGL6gB,EAASha,GAAY2sB,GACrB3sB,GAAY2sB,GAAkBv4B,EAC9BA,EAAqC,MAA/Bs4B,EAAQh4B,EAAMc,EAAM2D,GACzBwzB,EACA,KACD3sB,GAAY2sB,GAAkB3S,GAExB5lB,IAOT,IAAIw4B,IAAa,sCAChBC,GAAa,eAEd95B,GAAOG,GAAGoC,QACT+d,KAAM,SAAU7d,EAAM8C,GACrB,MAAOka,GAAQthB,KAAM6B,EAAOsgB,KAAM7d,EAAM8C,EAAOzD,UAAUf,OAAS,IAGnEg5B,WAAY,SAAUt3B,GACrB,MAAOtE,MAAKqD,KAAM,iBACVrD,MAAM6B,EAAOg6B,QAASv3B,IAAUA,QAK1CzC,EAAOuC,QACN+d,KAAM,SAAU3e,EAAMc,EAAM8C,GAC3B,GAAIlE,GAAKggB,EACRmY,EAAQ73B,EAAKiJ,QAGd,IAAe,IAAV4uB,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,MAPe,KAAVA,GAAgBx5B,EAAOkY,SAAUvW,KAGrCc,EAAOzC,EAAOg6B,QAASv3B,IAAUA,EACjC4e,EAAQrhB,EAAO4zB,UAAWnxB,IAGZU,SAAVoC,EACC8b,GAAS,OAASA,IACuBle,UAA3C9B,EAAMggB,EAAMjB,IAAKze,EAAM4D,EAAO9C,IACzBpB,EAGCM,EAAMc,GAAS8C,EAGpB8b,GAAS,OAASA,IAA+C,QAApChgB,EAAMggB,EAAMpgB,IAAKU,EAAMc,IACjDpB,EAGDM,EAAMc,IAGdmxB,WACChgB,UACC3S,IAAK,SAAUU,GAOd,GAAIs4B,GAAWj6B,EAAO4O,KAAKsB,KAAMvO,EAAM,WAEvC,OAAKs4B,GACGC,SAAUD,EAAU,IAI3BJ,GAAWhuB,KAAMlK,EAAK8C,WACtBq1B,GAAWjuB,KAAMlK,EAAK8C,WACtB9C,EAAKgS,KAEE,QAQXqmB,SACCG,MAAO,UACPC,QAAS,eAYLh7B,EAAQg6B,cACbp5B,EAAO4zB,UAAU7f,UAChB9S,IAAK,SAAUU,GAId,GAAI2Q,GAAS3Q,EAAK9B,UAIlB,OAHKyS,IAAUA,EAAOzS,YACrByS,EAAOzS,WAAWmU,cAEZ,MAERoM,IAAK,SAAUze,GAId,GAAI2Q,GAAS3Q,EAAK9B,UACbyS,KACJA,EAAO0B,cAEF1B,EAAOzS,YACXyS,EAAOzS,WAAWmU,kBAOvBhU,EAAOwB,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFxB,EAAOg6B,QAAS77B,KAAKuG,eAAkBvG,MAQvC,SAASk8B,IAAkB90B,GAC1B,GAAI0P,GAAS1P,EAAM2F,MAAOoP,MAC1B,OAAOrF,GAAOhJ,KAAM,KAItB,QAASquB,IAAU34B,GAClB,MAAOA,GAAKmK,cAAgBnK,EAAKmK,aAAc,UAAa,GAG7D9L,EAAOG,GAAGoC,QACTg4B,SAAU,SAAUh1B,GACnB,GAAIi1B,GAAS74B,EAAMwL,EAAKstB,EAAUC,EAAOv4B,EAAGw4B,EAC3C/4B,EAAI,CAEL,IAAK5B,EAAOgD,WAAYuC,GACvB,MAAOpH,MAAKqD,KAAM,SAAUW,GAC3BnC,EAAQ7B,MAAOo8B,SAAUh1B,EAAMpG,KAAMhB,KAAMgE,EAAGm4B,GAAUn8B,SAI1D,IAAsB,gBAAVoH,IAAsBA,EAAQ,CACzCi1B,EAAUj1B,EAAM2F,MAAOoP,MAEvB,OAAU3Y,EAAOxD,KAAMyD,KAItB,GAHA64B,EAAWH,GAAU34B,GACrBwL,EAAwB,IAAlBxL,EAAKiJ,UAAoB,IAAMyvB,GAAkBI,GAAa,IAEzD,CACVt4B,EAAI,CACJ,OAAUu4B,EAAQF,EAASr4B,KACrBgL,EAAIvO,QAAS,IAAM87B,EAAQ,KAAQ,IACvCvtB,GAAOutB,EAAQ,IAKjBC,GAAaN,GAAkBltB,GAC1BstB,IAAaE,GACjBh5B,EAAKoK,aAAc,QAAS4uB,IAMhC,MAAOx8B,OAGRy8B,YAAa,SAAUr1B,GACtB,GAAIi1B,GAAS74B,EAAMwL,EAAKstB,EAAUC,EAAOv4B,EAAGw4B,EAC3C/4B,EAAI,CAEL,IAAK5B,EAAOgD,WAAYuC,GACvB,MAAOpH,MAAKqD,KAAM,SAAUW,GAC3BnC,EAAQ7B,MAAOy8B,YAAar1B,EAAMpG,KAAMhB,KAAMgE,EAAGm4B,GAAUn8B,SAI7D,KAAM2D,UAAUf,OACf,MAAO5C,MAAK+R,KAAM,QAAS,GAG5B,IAAsB,gBAAV3K,IAAsBA,EAAQ,CACzCi1B,EAAUj1B,EAAM2F,MAAOoP,MAEvB,OAAU3Y,EAAOxD,KAAMyD,KAMtB,GALA64B,EAAWH,GAAU34B,GAGrBwL,EAAwB,IAAlBxL,EAAKiJ,UAAoB,IAAMyvB,GAAkBI,GAAa,IAEzD,CACVt4B,EAAI,CACJ,OAAUu4B,EAAQF,EAASr4B,KAG1B,MAAQgL,EAAIvO,QAAS,IAAM87B,EAAQ,QAClCvtB,EAAMA,EAAI5J,QAAS,IAAMm3B,EAAQ,IAAK,IAKxCC,GAAaN,GAAkBltB,GAC1BstB,IAAaE,GACjBh5B,EAAKoK,aAAc,QAAS4uB,IAMhC,MAAOx8B,OAGR08B,YAAa,SAAUt1B,EAAOu1B,GAC7B,GAAIj3B,SAAc0B,EAElB,OAAyB,iBAAbu1B,IAAmC,WAATj3B,EAC9Bi3B,EAAW38B,KAAKo8B,SAAUh1B,GAAUpH,KAAKy8B,YAAar1B,GAGzDvF,EAAOgD,WAAYuC,GAChBpH,KAAKqD,KAAM,SAAUI,GAC3B5B,EAAQ7B,MAAO08B,YACdt1B,EAAMpG,KAAMhB,KAAMyD,EAAG04B,GAAUn8B,MAAQ28B,GACvCA,KAKI38B,KAAKqD,KAAM,WACjB,GAAI8M,GAAW1M,EAAGkX,EAAMiiB,CAExB,IAAc,WAATl3B,EAAoB,CAGxBjC,EAAI,EACJkX,EAAO9Y,EAAQ7B,MACf48B,EAAax1B,EAAM2F,MAAOoP,MAE1B,OAAUhM,EAAYysB,EAAYn5B,KAG5BkX,EAAKkiB,SAAU1sB,GACnBwK,EAAK8hB,YAAatsB,GAElBwK,EAAKyhB,SAAUjsB,OAKInL,UAAVoC,GAAgC,YAAT1B,IAClCyK,EAAYgsB,GAAUn8B,MACjBmQ,GAGJkS,EAASJ,IAAKjiB,KAAM,gBAAiBmQ,GAOjCnQ,KAAK4N,cACT5N,KAAK4N,aAAc,QAClBuC,GAAa/I,KAAU,EACvB,GACAib,EAASvf,IAAK9C,KAAM,kBAAqB,QAO9C68B,SAAU,SAAU/6B,GACnB,GAAIqO,GAAW3M,EACdC,EAAI,CAEL0M,GAAY,IAAMrO,EAAW,GAC7B,OAAU0B,EAAOxD,KAAMyD,KACtB,GAAuB,IAAlBD,EAAKiJ,WACP,IAAMyvB,GAAkBC,GAAU34B,IAAW,KAAM/C,QAAS0P,MAC7D,OAAO,CAIV,QAAO,IAOT,IAAI2sB,IAAU,KAEdj7B,GAAOG,GAAGoC,QACT4N,IAAK,SAAU5K,GACd,GAAI8b,GAAOhgB,EAAK2B,EACfrB,EAAOxD,KAAM,EAEd,EAAA,GAAM2D,UAAUf,OA4BhB,MAFAiC,GAAahD,EAAOgD,WAAYuC,GAEzBpH,KAAKqD,KAAM,SAAUI,GAC3B,GAAIuO,EAEmB,KAAlBhS,KAAKyM,WAKTuF,EADInN,EACEuC,EAAMpG,KAAMhB,KAAMyD,EAAG5B,EAAQ7B,MAAOgS,OAEpC5K,EAIK,MAAP4K,EACJA,EAAM,GAEoB,gBAARA,GAClBA,GAAO,GAEInQ,EAAOkD,QAASiN,KAC3BA,EAAMnQ,EAAO0B,IAAKyO,EAAK,SAAU5K,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItC8b,EAAQrhB,EAAOk7B,SAAU/8B,KAAK0F,OAAU7D,EAAOk7B,SAAU/8B,KAAKsG,SAASC,eAGjE2c,GAAY,OAASA,IAA+Cle,SAApCke,EAAMjB,IAAKjiB,KAAMgS,EAAK,WAC3DhS,KAAKoH,MAAQ4K,KAzDd,IAAKxO,EAIJ,MAHA0f,GAAQrhB,EAAOk7B,SAAUv5B,EAAKkC,OAC7B7D,EAAOk7B,SAAUv5B,EAAK8C,SAASC,eAE3B2c,GACJ,OAASA,IACgCle,UAAvC9B,EAAMggB,EAAMpgB,IAAKU,EAAM,UAElBN,GAGRA,EAAMM,EAAK4D,MAGS,gBAARlE,GACJA,EAAIkC,QAAS03B,GAAS,IAIhB,MAAP55B,EAAc,GAAKA,OA4C9BrB,EAAOuC,QACN24B,UACCrX,QACC5iB,IAAK,SAAUU,GAEd,GAAIwO,GAAMnQ,EAAO4O,KAAKsB,KAAMvO,EAAM,QAClC,OAAc,OAAPwO,EACNA,EAMAkqB,GAAkBr6B,EAAON,KAAMiC,MAGlC4E,QACCtF,IAAK,SAAUU,GACd,GAAI4D,GAAOse,EAAQjiB,EAClBY,EAAUb,EAAKa,QACfkX,EAAQ/X,EAAKqS,cACboS,EAAoB,eAAdzkB,EAAKkC,KACXyf,EAAS8C,EAAM,QACfmL,EAAMnL,EAAM1M,EAAQ,EAAIlX,EAAQzB,MAUjC,KAPCa,EADI8X,EAAQ,EACR6X,EAGAnL,EAAM1M,EAAQ,EAIX9X,EAAI2vB,EAAK3vB,IAKhB,GAJAiiB,EAASrhB,EAASZ,IAIXiiB,EAAO9P,UAAYnS,IAAM8X,KAG7BmK,EAAOrZ,YACLqZ,EAAOhkB,WAAW2K,WACnBxK,EAAOyE,SAAUof,EAAOhkB,WAAY,aAAiB,CAMxD,GAHA0F,EAAQvF,EAAQ6jB,GAAS1T,MAGpBiW,EACJ,MAAO7gB,EAIR+d,GAAO3kB,KAAM4G,GAIf,MAAO+d,IAGRlD,IAAK,SAAUze,EAAM4D,GACpB,GAAI41B,GAAWtX,EACdrhB,EAAUb,EAAKa,QACf8gB,EAAStjB,EAAO6E,UAAWU,GAC3B3D,EAAIY,EAAQzB,MAEb,OAAQa,IACPiiB,EAASrhB,EAASZ,IAIbiiB,EAAO9P,SACX/T,EAAO+E,QAAS/E,EAAOk7B,SAASrX,OAAO5iB,IAAK4iB,GAAUP,SAEtD6X,GAAY,EAUd,OAHMA,KACLx5B,EAAKqS,kBAECsP,OAOXtjB,EAAOwB,MAAQ,QAAS,YAAc,WACrCxB,EAAOk7B,SAAU/8B,OAChBiiB,IAAK,SAAUze,EAAM4D,GACpB,GAAKvF,EAAOkD,QAASqC,GACpB,MAAS5D,GAAKmS,QAAU9T,EAAO+E,QAAS/E,EAAQ2B,GAAOwO,MAAO5K,QAI3DnG,EAAQ+5B,UACbn5B,EAAOk7B,SAAU/8B,MAAO8C,IAAM,SAAUU,GACvC,MAAwC,QAAjCA,EAAKmK,aAAc,SAAqB,KAAOnK,EAAK4D,SAW9D,IAAI61B,IAAc,iCAElBp7B,GAAOuC,OAAQvC,EAAOsmB,OAErB6C,QAAS,SAAU7C,EAAOjG,EAAM1e,EAAM05B,GAErC,GAAIz5B,GAAGuL,EAAKzH,EAAK41B,EAAYC,EAAQtU,EAAQ3J,EAC5Cke,GAAc75B,GAAQ5D,GACtB8F,EAAO9E,EAAOI,KAAMmnB,EAAO,QAAWA,EAAMziB,KAAOyiB,EACnDQ,EAAa/nB,EAAOI,KAAMmnB,EAAO,aAAgBA,EAAMgB,UAAUthB,MAAO,OAKzE,IAHAmH,EAAMzH,EAAM/D,EAAOA,GAAQ5D,EAGJ,IAAlB4D,EAAKiJ,UAAoC,IAAlBjJ,EAAKiJ,WAK5BwwB,GAAYvvB,KAAMhI,EAAO7D,EAAOsmB,MAAMY,aAItCrjB,EAAKjF,QAAS,UAGlBkoB,EAAajjB,EAAKmC,MAAO,KACzBnC,EAAOijB,EAAWpa,QAClBoa,EAAWzkB,QAEZk5B,EAAS13B,EAAKjF,QAAS,KAAQ,GAAK,KAAOiF,EAG3CyiB,EAAQA,EAAOtmB,EAAOoD,SACrBkjB,EACA,GAAItmB,GAAO6oB,MAAOhlB,EAAuB,gBAAVyiB,IAAsBA,GAGtDA,EAAMmV,UAAYJ,EAAe,EAAI,EACrC/U,EAAMgB,UAAYR,EAAW7a,KAAM,KACnCqa,EAAM+B,WAAa/B,EAAMgB,UACxB,GAAIlf,QAAQ,UAAY0e,EAAW7a,KAAM,iBAAoB,WAC7D,KAGDqa,EAAM1U,OAASzO,OACTmjB,EAAMxjB,SACXwjB,EAAMxjB,OAASnB,GAIhB0e,EAAe,MAARA,GACJiG,GACFtmB,EAAO6E,UAAWwb,GAAQiG,IAG3BhJ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAC1Bw3B,IAAgB/d,EAAQ6L,SAAW7L,EAAQ6L,QAAQtnB,MAAOF,EAAM0e,MAAW,GAAjF,CAMA,IAAMgb,IAAiB/d,EAAQ4L,WAAalpB,EAAO+D,SAAUpC,GAAS,CAMrE,IAJA25B,EAAahe,EAAQ8J,cAAgBvjB,EAC/Bu3B,GAAYvvB,KAAMyvB,EAAaz3B,KACpCsJ,EAAMA,EAAItN,YAEHsN,EAAKA,EAAMA,EAAItN,WACtB27B,EAAU78B,KAAMwO,GAChBzH,EAAMyH,CAIFzH,MAAU/D,EAAK2J,eAAiBvN,IACpCy9B,EAAU78B,KAAM+G,EAAIwI,aAAexI,EAAIg2B,cAAgBx9B,GAKzD0D,EAAI,CACJ,QAAUuL,EAAMquB,EAAW55B,QAAY0kB,EAAM4B,uBAE5C5B,EAAMziB,KAAOjC,EAAI,EAChB05B,EACAhe,EAAQ+J,UAAYxjB,EAGrBojB,GAAWzG,EAASvf,IAAKkM,EAAK,eAAoBmZ,EAAMziB,OACvD2c,EAASvf,IAAKkM,EAAK,UACf8Z,GACJA,EAAOplB,MAAOsL,EAAKkT,GAIpB4G,EAASsU,GAAUpuB,EAAKouB,GACnBtU,GAAUA,EAAOplB,OAASie,EAAY3S,KAC1CmZ,EAAM1U,OAASqV,EAAOplB,MAAOsL,EAAKkT,GAC7BiG,EAAM1U,UAAW,GACrB0U,EAAMgC,iBAoCT,OAhCAhC,GAAMziB,KAAOA,EAGPw3B,GAAiB/U,EAAMmD,sBAEpBnM,EAAQ4G,UACf5G,EAAQ4G,SAASriB,MAAO25B,EAAU7zB,MAAO0Y,MAAW,IACpDP,EAAYne,IAIP45B,GAAUv7B,EAAOgD,WAAYrB,EAAMkC,MAAa7D,EAAO+D,SAAUpC,KAGrE+D,EAAM/D,EAAM45B,GAEP71B,IACJ/D,EAAM45B,GAAW,MAIlBv7B,EAAOsmB,MAAMY,UAAYrjB,EACzBlC,EAAMkC,KACN7D,EAAOsmB,MAAMY,UAAY/jB,OAEpBuC,IACJ/D,EAAM45B,GAAW71B,IAMd4gB,EAAM1U,SAKd+pB,SAAU,SAAU93B,EAAMlC,EAAM2kB,GAC/B,GAAIzb,GAAI7K,EAAOuC,OACd,GAAIvC,GAAO6oB,MACXvC,GAECziB,KAAMA,EACNgmB,aAAa,GAIf7pB,GAAOsmB,MAAM6C,QAASte,EAAG,KAAMlJ,MAKjC3B,EAAOG,GAAGoC,QAET4mB,QAAS,SAAUtlB,EAAMwc,GACxB,MAAOliB,MAAKqD,KAAM,WACjBxB,EAAOsmB,MAAM6C,QAAStlB,EAAMwc,EAAMliB,SAGpCy9B,eAAgB,SAAU/3B,EAAMwc,GAC/B,GAAI1e,GAAOxD,KAAM,EACjB,IAAKwD,EACJ,MAAO3B,GAAOsmB,MAAM6C,QAAStlB,EAAMwc,EAAM1e,GAAM,MAMlD3B,EAAOwB,KAAM,wLAEgDwE,MAAO,KACnE,SAAUpE,EAAGa,GAGbzC,EAAOG,GAAIsC,GAAS,SAAU4d,EAAMlgB,GACnC,MAAO2B,WAAUf,OAAS,EACzB5C,KAAK+nB,GAAIzjB,EAAM,KAAM4d,EAAMlgB,GAC3BhC,KAAKgrB,QAAS1mB,MAIjBzC,EAAOG,GAAGoC,QACTs5B,MAAO,SAAUC,EAAQC,GACxB,MAAO59B,MAAKwtB,WAAYmQ,GAASlQ,WAAYmQ,GAASD,MAOxD18B,EAAQ48B,QAAU,aAAe99B,GAW3BkB,EAAQ48B,SACbh8B,EAAOwB,MAAQgS,MAAO,UAAW4V,KAAM,YAAc,SAAU2C,EAAMjE,GAGpE,GAAI9a,GAAU,SAAUsZ,GACvBtmB,EAAOsmB,MAAMqV,SAAU7T,EAAKxB,EAAMxjB,OAAQ9C,EAAOsmB,MAAMwB,IAAKxB,IAG7DtmB,GAAOsmB,MAAMhJ,QAASwK,IACrBN,MAAO,WACN,GAAIjoB,GAAMpB,KAAKmN,eAAiBnN,KAC/B89B,EAAWzb,EAASf,OAAQlgB,EAAKuoB,EAE5BmU,IACL18B,EAAI6O,iBAAkB2d,EAAM/e,GAAS,GAEtCwT,EAASf,OAAQlgB,EAAKuoB,GAAOmU,GAAY,GAAM,IAEhDtU,SAAU,WACT,GAAIpoB,GAAMpB,KAAKmN,eAAiBnN,KAC/B89B,EAAWzb,EAASf,OAAQlgB,EAAKuoB,GAAQ,CAEpCmU,GAKLzb,EAASf,OAAQlgB,EAAKuoB,EAAKmU,IAJ3B18B,EAAI+f,oBAAqByM,EAAM/e,GAAS,GACxCwT,EAASpF,OAAQ7b,EAAKuoB,OAS3B,IAAIxU,IAAWpV,EAAOoV,SAElB4oB,GAAQl8B,EAAO4F,MAEfu2B,GAAS,IAKbn8B,GAAOo8B,SAAW,SAAU/b,GAC3B,GAAIpO,EACJ,KAAMoO,GAAwB,gBAATA,GACpB,MAAO,KAKR,KACCpO,GAAM,GAAM/T,GAAOm+B,WAAcC,gBAAiBjc,EAAM,YACvD,MAAQxV,GACToH,EAAM9O,OAMP,MAHM8O,KAAOA,EAAIvG,qBAAsB,eAAgB3K,QACtDf,EAAOyD,MAAO,gBAAkB4c,GAE1BpO,EAIR,IACCsqB,IAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhB,SAASC,IAAatJ,EAAQzvB,EAAKg5B,EAAahjB,GAC/C,GAAInX,EAEJ,IAAKzC,EAAOkD,QAASU,GAGpB5D,EAAOwB,KAAMoC,EAAK,SAAUhC,EAAG6Z,GACzBmhB,GAAeL,GAAS1wB,KAAMwnB,GAGlCzZ,EAAKyZ,EAAQ5X,GAKbkhB,GACCtJ,EAAS,KAAqB,gBAAN5X,IAAuB,MAALA,EAAY7Z,EAAI,IAAO,IACjE6Z,EACAmhB,EACAhjB,SAKG,IAAMgjB,GAAsC,WAAvB58B,EAAO6D,KAAMD,GAUxCgW,EAAKyZ,EAAQzvB,OAPb,KAAMnB,IAAQmB,GACb+4B,GAAatJ,EAAS,IAAM5wB,EAAO,IAAKmB,EAAKnB,GAAQm6B,EAAahjB,GAYrE5Z,EAAO68B,MAAQ,SAAUp1B,EAAGm1B,GAC3B,GAAIvJ,GACHyJ,KACAljB,EAAM,SAAUpN,EAAKuwB,GAGpB,GAAIx3B,GAAQvF,EAAOgD,WAAY+5B,GAC9BA,IACAA,CAEDD,GAAGA,EAAE/7B,QAAWi8B,mBAAoBxwB,GAAQ,IAC3CwwB,mBAA6B,MAATz3B,EAAgB,GAAKA,GAI5C,IAAKvF,EAAOkD,QAASuE,IAASA,EAAE5G,SAAWb,EAAOiD,cAAewE,GAGhEzH,EAAOwB,KAAMiG,EAAG,WACfmS,EAAKzb,KAAKsE,KAAMtE,KAAKoH,aAOtB,KAAM8tB,IAAU5rB,GACfk1B,GAAatJ,EAAQ5rB,EAAG4rB,GAAUuJ,EAAahjB,EAKjD,OAAOkjB,GAAE7wB,KAAM,MAGhBjM,EAAOG,GAAGoC,QACT06B,UAAW,WACV,MAAOj9B,GAAO68B,MAAO1+B,KAAK++B,mBAE3BA,eAAgB,WACf,MAAO/+B,MAAKuD,IAAK,WAGhB,GAAIuO,GAAWjQ,EAAOsgB,KAAMniB,KAAM,WAClC,OAAO8R,GAAWjQ,EAAO6E,UAAWoL,GAAa9R,OAEjDuQ,OAAQ,WACR,GAAI7K,GAAO1F,KAAK0F,IAGhB,OAAO1F,MAAKsE,OAASzC,EAAQ7B,MAAOma,GAAI,cACvCokB,GAAa7wB,KAAM1N,KAAKsG,YAAeg4B,GAAgB5wB,KAAMhI,KAC3D1F,KAAK2V,UAAY2P,GAAe5X,KAAMhI,MAEzCnC,IAAK,SAAUE,EAAGD,GAClB,GAAIwO,GAAMnQ,EAAQ7B,MAAOgS,KAEzB,OAAY,OAAPA,EACG,KAGHnQ,EAAOkD,QAASiN,GACbnQ,EAAO0B,IAAKyO,EAAK,SAAUA,GACjC,OAAS1N,KAAMd,EAAKc,KAAM8C,MAAO4K,EAAI5M,QAASi5B,GAAO,YAI9C/5B,KAAMd,EAAKc,KAAM8C,MAAO4K,EAAI5M,QAASi5B,GAAO,WAClDv7B,QAKN,IACCk8B,IAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAGXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QAWZ9G,MAOA+G,MAGAC,GAAW,KAAKj/B,OAAQ,KAGxBk/B,GAAe7/B,EAAS0B,cAAe,IACvCm+B,IAAajqB,KAAOL,GAASK,IAG9B,SAASkqB,IAA6BC,GAGrC,MAAO,UAAUC,EAAoB3hB,GAED,gBAAvB2hB,KACX3hB,EAAO2hB,EACPA,EAAqB,IAGtB,IAAIC,GACHp8B,EAAI,EACJq8B,EAAYF,EAAmBr5B,cAAcwG,MAAOoP,MAErD,IAAKta,EAAOgD,WAAYoZ,GAGvB,MAAU4hB,EAAWC,EAAWr8B,KAGR,MAAlBo8B,EAAU,IACdA,EAAWA,EAASv/B,MAAO,IAAO,KAChCq/B,EAAWE,GAAaF,EAAWE,QAAmBjuB,QAASqM,KAI/D0hB,EAAWE,GAAaF,EAAWE,QAAmBr/B,KAAMyd,IAQnE,QAAS8hB,IAA+BJ,EAAWt7B,EAASw0B,EAAiBmH,GAE5E,GAAIC,MACHC,EAAqBP,IAAcJ,EAEpC,SAASY,GAASN,GACjB,GAAIjqB,EAcJ,OAbAqqB,GAAWJ,IAAa,EACxBh+B,EAAOwB,KAAMs8B,EAAWE,OAAkB,SAAUt0B,EAAG60B,GACtD,GAAIC,GAAsBD,EAAoB/7B,EAASw0B,EAAiBmH,EACxE,OAAoC,gBAAxBK,IACVH,GAAqBD,EAAWI,GAKtBH,IACDtqB,EAAWyqB,GADf,QAHNh8B,EAAQy7B,UAAUluB,QAASyuB,GAC3BF,EAASE,IACF,KAKFzqB,EAGR,MAAOuqB,GAAS97B,EAAQy7B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAY37B,EAAQJ,GAC5B,GAAI8J,GAAKzJ,EACR27B,EAAc1+B,EAAO2+B,aAAaD,eAEnC,KAAMlyB,IAAO9J,GACQS,SAAfT,EAAK8J,MACPkyB,EAAalyB,GAAQ1J,EAAWC,IAAUA,OAAiByJ,GAAQ9J,EAAK8J,GAO5E,OAJKzJ,IACJ/C,EAAOuC,QAAQ,EAAMO,EAAQC,GAGvBD,EAOR,QAAS87B,IAAqB9B,EAAGqB,EAAOU,GAEvC,GAAIC,GAAIj7B,EAAMk7B,EAAeC,EAC5B3lB,EAAWyjB,EAAEzjB,SACb4kB,EAAYnB,EAAEmB,SAGf,OAA2B,MAAnBA,EAAW,GAClBA,EAAUvxB,QACEvJ,SAAP27B,IACJA,EAAKhC,EAAEmC,UAAYd,EAAMe,kBAAmB,gBAK9C,IAAKJ,EACJ,IAAMj7B,IAAQwV,GACb,GAAKA,EAAUxV,IAAUwV,EAAUxV,GAAOgI,KAAMizB,GAAO,CACtDb,EAAUluB,QAASlM,EACnB,OAMH,GAAKo6B,EAAW,IAAOY,GACtBE,EAAgBd,EAAW,OACrB,CAGN,IAAMp6B,IAAQg7B,GAAY,CACzB,IAAMZ,EAAW,IAAOnB,EAAEqC,WAAYt7B,EAAO,IAAMo6B,EAAW,IAAQ,CACrEc,EAAgBl7B,CAChB,OAEKm7B,IACLA,EAAgBn7B,GAKlBk7B,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,MAHKA,KAAkBd,EAAW,IACjCA,EAAUluB,QAASgvB,GAEbF,EAAWE,GAOpB,QAASK,IAAatC,EAAGuC,EAAUlB,EAAOmB,GACzC,GAAIC,GAAOC,EAASC,EAAM/5B,EAAK4T,EAC9B6lB,KAGAlB,EAAYnB,EAAEmB,UAAUx/B,OAGzB,IAAKw/B,EAAW,GACf,IAAMwB,IAAQ3C,GAAEqC,WACfA,EAAYM,EAAK/6B,eAAkBo4B,EAAEqC,WAAYM,EAInDD,GAAUvB,EAAUvxB,OAGpB,OAAQ8yB,EAcP,GAZK1C,EAAE4C,eAAgBF,KACtBrB,EAAOrB,EAAE4C,eAAgBF,IAAcH,IAIlC/lB,GAAQgmB,GAAaxC,EAAE6C,aAC5BN,EAAWvC,EAAE6C,WAAYN,EAAUvC,EAAEkB,WAGtC1kB,EAAOkmB,EACPA,EAAUvB,EAAUvxB,QAKnB,GAAiB,MAAZ8yB,EAEJA,EAAUlmB,MAGJ,IAAc,MAATA,GAAgBA,IAASkmB,EAAU,CAM9C,GAHAC,EAAON,EAAY7lB,EAAO,IAAMkmB,IAAaL,EAAY,KAAOK,IAG1DC,EACL,IAAMF,IAASJ,GAId,GADAz5B,EAAM65B,EAAMv5B,MAAO,KACdN,EAAK,KAAQ85B,IAGjBC,EAAON,EAAY7lB,EAAO,IAAM5T,EAAK,KACpCy5B,EAAY,KAAOz5B,EAAK,KACb,CAGN+5B,KAAS,EACbA,EAAON,EAAYI,GAGRJ,EAAYI,MAAY,IACnCC,EAAU95B,EAAK,GACfu4B,EAAUluB,QAASrK,EAAK,IAEzB,OAOJ,GAAK+5B,KAAS,EAGb,GAAKA,GAAQ3C,EAAAA,UACZuC,EAAWI,EAAMJ,OAEjB,KACCA,EAAWI,EAAMJ,GAChB,MAAQx0B,GACT,OACCyR,MAAO,cACP7Y,MAAOg8B,EAAO50B,EAAI,sBAAwByO,EAAO,OAASkmB,IASjE,OAASljB,MAAO,UAAW+D,KAAMgf,GAGlCr/B,EAAOuC,QAGNq9B,OAAQ,EAGRC,gBACAC,QAEAnB,cACCoB,IAAKzsB,GAASK,KACd9P,KAAM,MACNm8B,QAASzC,GAAe1xB,KAAMyH,GAAS2sB,UACvCtiC,QAAQ,EACRuiC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,SACCjJ,IAAKuG,GACLj+B,KAAM,aACN2tB,KAAM,YACNpb,IAAK,4BACLquB,KAAM,qCAGPjnB,UACCpH,IAAK,UACLob,KAAM,SACNiT,KAAM,YAGPZ,gBACCztB,IAAK,cACLvS,KAAM,eACN4gC,KAAM,gBAKPnB,YAGCoB,SAAUz2B,OAGV02B,aAAa,EAGbC,YAAa5f,KAAKC,MAGlB4f,WAAY1gC,EAAOo8B,UAOpBsC,aACCqB,KAAK,EACL7/B,SAAS,IAOXygC,UAAW,SAAU79B,EAAQ89B,GAC5B,MAAOA,GAGNnC,GAAYA,GAAY37B,EAAQ9C,EAAO2+B,cAAgBiC,GAGvDnC,GAAYz+B,EAAO2+B,aAAc77B,IAGnC+9B,cAAehD,GAA6BlH,IAC5CmK,cAAejD,GAA6BH,IAG5CqD,KAAM,SAAUhB,EAAKv9B,GAGA,gBAARu9B,KACXv9B,EAAUu9B,EACVA,EAAM58B,QAIPX,EAAUA,KAEV,IAAIw+B,GAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGAhiB,EAGAiiB,EAGA1/B,EAGA2/B,EAGAzE,EAAI98B,EAAO2gC,aAAen+B,GAG1Bg/B,EAAkB1E,EAAE58B,SAAW48B,EAG/B2E,EAAqB3E,EAAE58B,UACpBshC,EAAgB52B,UAAY42B,EAAgB3gC,QAC7Cb,EAAQwhC,GACRxhC,EAAOsmB,MAGT9J,EAAWxc,EAAOmc,WAClBulB,EAAmB1hC,EAAO0a,UAAW,eAGrCinB,EAAa7E,EAAE6E,eAGfC,KACAC,KAGAC,EAAW,WAGX3D,GACC5e,WAAY,EAGZ2f,kBAAmB,SAAU1yB,GAC5B,GAAItB,EACJ,IAAKmU,EAAY,CAChB,IAAM8hB,EAAkB,CACvBA,IACA,OAAUj2B,EAAQoyB,GAAS/xB,KAAM21B,GAChCC,EAAiBj2B,EAAO,GAAIxG,eAAkBwG,EAAO,GAGvDA,EAAQi2B,EAAiB30B,EAAI9H,eAE9B,MAAgB,OAATwG,EAAgB,KAAOA,GAI/B62B,sBAAuB,WACtB,MAAO1iB,GAAY6hB,EAAwB,MAI5Cc,iBAAkB,SAAUv/B,EAAM8C,GAMjC,MALkB,OAAb8Z,IACJ5c,EAAOo/B,EAAqBp/B,EAAKiC,eAChCm9B,EAAqBp/B,EAAKiC,gBAAmBjC,EAC9Cm/B,EAAgBn/B,GAAS8C,GAEnBpH,MAIR8jC,iBAAkB,SAAUp+B,GAI3B,MAHkB,OAAbwb,IACJyd,EAAEmC,SAAWp7B,GAEP1F,MAIRwjC,WAAY,SAAUjgC,GACrB,GAAIpC,EACJ,IAAKoC,EACJ,GAAK2d,EAGJ8e,EAAM5hB,OAAQ7a,EAAKy8B,EAAM+D,aAIzB,KAAM5iC,IAAQoC,GACbigC,EAAYriC,IAAWqiC,EAAYriC,GAAQoC,EAAKpC,GAInD,OAAOnB,OAIRgkC,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcN,CAK9B,OAJKd,IACJA,EAAUmB,MAAOE,GAElBl7B,EAAM,EAAGk7B,GACFlkC,MAoBV,IAfAqe,EAASR,QAASmiB,GAKlBrB,EAAEiD,MAAUA,GAAOjD,EAAEiD,KAAOzsB,GAASK,MAAS,IAC5CpQ,QAASk6B,GAAWnqB,GAAS2sB,SAAW,MAG1CnD,EAAEj5B,KAAOrB,EAAQuZ,QAAUvZ,EAAQqB,MAAQi5B,EAAE/gB,QAAU+gB,EAAEj5B,KAGzDi5B,EAAEmB,WAAcnB,EAAEkB,UAAY,KAAMt5B,cAAcwG,MAAOoP,KAAqB,IAGxD,MAAjBwiB,EAAEwF,YAAsB,CAC5BjB,EAAYtjC,EAAS0B,cAAe,IAKpC,KACC4hC,EAAU1tB,KAAOmpB,EAAEiD,IAInBsB,EAAU1tB,KAAO0tB,EAAU1tB,KAC3BmpB,EAAEwF,YAAc1E,GAAaqC,SAAW,KAAOrC,GAAa2E,MAC3DlB,EAAUpB,SAAW,KAAOoB,EAAUkB,KACtC,MAAQ13B,GAITiyB,EAAEwF,aAAc,GAalB,GARKxF,EAAEzc,MAAQyc,EAAEoD,aAAiC,gBAAXpD,GAAEzc,OACxCyc,EAAEzc,KAAOrgB,EAAO68B,MAAOC,EAAEzc,KAAMyc,EAAEF,cAIlCsB,GAA+BvH,GAAYmG,EAAGt6B,EAAS27B,GAGlD9e,EACJ,MAAO8e,EAKRmD,GAActhC,EAAOsmB,OAASwW,EAAEn/B,OAG3B2jC,GAAmC,IAApBthC,EAAO4/B,UAC1B5/B,EAAOsmB,MAAM6C,QAAS,aAIvB2T,EAAEj5B,KAAOi5B,EAAEj5B,KAAKlD,cAGhBm8B,EAAE0F,YAAchF,GAAW3xB,KAAMixB,EAAEj5B,MAKnCo9B,EAAWnE,EAAEiD,IAAIx8B,QAAS65B,GAAO,IAG3BN,EAAE0F,WAuBI1F,EAAEzc,MAAQyc,EAAEoD,aACoD,KAAzEpD,EAAEsD,aAAe,IAAKxhC,QAAS,uCACjCk+B,EAAEzc,KAAOyc,EAAEzc,KAAK9c,QAAS45B,GAAK,OAtB9BoE,EAAWzE,EAAEiD,IAAIthC,MAAOwiC,EAASlgC,QAG5B+7B,EAAEzc,OACN4gB,IAAc9E,GAAOtwB,KAAMo1B,GAAa,IAAM,KAAQnE,EAAEzc,WAGjDyc,GAAEzc,MAILyc,EAAEvwB,SAAU,IAChB00B,EAAWA,EAAS19B,QAAS85B,GAAY,MACzCkE,GAAapF,GAAOtwB,KAAMo1B,GAAa,IAAM,KAAQ,KAAS/E,MAAYqF,GAI3EzE,EAAEiD,IAAMkB,EAAWM,GASfzE,EAAE2F,aACDziC,EAAO6/B,aAAcoB,IACzB9C,EAAM6D,iBAAkB,oBAAqBhiC,EAAO6/B,aAAcoB,IAE9DjhC,EAAO8/B,KAAMmB,IACjB9C,EAAM6D,iBAAkB,gBAAiBhiC,EAAO8/B,KAAMmB,MAKnDnE,EAAEzc,MAAQyc,EAAE0F,YAAc1F,EAAEsD,eAAgB,GAAS59B,EAAQ49B,cACjEjC,EAAM6D,iBAAkB,eAAgBlF,EAAEsD,aAI3CjC,EAAM6D,iBACL,SACAlF,EAAEmB,UAAW,IAAOnB,EAAEuD,QAASvD,EAAEmB,UAAW,IAC3CnB,EAAEuD,QAASvD,EAAEmB,UAAW,KACA,MAArBnB,EAAEmB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7Db,EAAEuD,QAAS,KAIb,KAAMz+B,IAAKk7B,GAAE4F,QACZvE,EAAM6D,iBAAkBpgC,EAAGk7B,EAAE4F,QAAS9gC,GAIvC,IAAKk7B,EAAE6F,aACJ7F,EAAE6F,WAAWxjC,KAAMqiC,EAAiBrD,EAAOrB,MAAQ,GAASzd,GAG9D,MAAO8e,GAAMgE,OAed,IAXAL,EAAW,QAGXJ,EAAiB9nB,IAAKkjB,EAAE3F,UACxBgH,EAAMh3B,KAAM21B,EAAE8F,SACdzE,EAAMliB,KAAM6gB,EAAEr5B,OAGdu9B,EAAY9C,GAA+BR,GAAYZ,EAAGt6B,EAAS27B,GAK5D,CASN,GARAA,EAAM5e,WAAa,EAGd+hB,GACJG,EAAmBtY,QAAS,YAAcgV,EAAOrB,IAI7Czd,EACJ,MAAO8e,EAIHrB,GAAEqD,OAASrD,EAAE7D,QAAU,IAC3BmI,EAAeljC,EAAO+f,WAAY,WACjCkgB,EAAMgE,MAAO,YACXrF,EAAE7D,SAGN,KACC5Z,GAAY,EACZ2hB,EAAU6B,KAAMjB,EAAgBz6B,GAC/B,MAAQ0D,GAGT,GAAKwU,EACJ,KAAMxU,EAIP1D,MAAU0D,QAhCX1D,MAAU,eAqCX,SAASA,GAAM+6B,EAAQY,EAAkBjE,EAAW6D,GACnD,GAAIpD,GAAWsD,EAASn/B,EAAO47B,EAAU0D,EACxCX,EAAaU,CAGTzjB,KAILA,GAAY,EAGP+hB,GACJljC,EAAOg7B,aAAckI,GAKtBJ,EAAY79B,OAGZ+9B,EAAwBwB,GAAW,GAGnCvE,EAAM5e,WAAa2iB,EAAS,EAAI,EAAI,EAGpC5C,EAAY4C,GAAU,KAAOA,EAAS,KAAkB,MAAXA,EAGxCrD,IACJQ,EAAWT,GAAqB9B,EAAGqB,EAAOU,IAI3CQ,EAAWD,GAAatC,EAAGuC,EAAUlB,EAAOmB,GAGvCA,GAGCxC,EAAE2F,aACNM,EAAW5E,EAAMe,kBAAmB,iBAC/B6D,IACJ/iC,EAAO6/B,aAAcoB,GAAa8B,GAEnCA,EAAW5E,EAAMe,kBAAmB,QAC/B6D,IACJ/iC,EAAO8/B,KAAMmB,GAAa8B,IAKZ,MAAXb,GAA6B,SAAXpF,EAAEj5B,KACxBu+B,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAa/C,EAAS/iB,MACtBsmB,EAAUvD,EAAShf,KACnB5c,EAAQ47B,EAAS57B,MACjB67B,GAAa77B,KAKdA,EAAQ2+B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZ/D,EAAM+D,OAASA,EACf/D,EAAMiE,YAAeU,GAAoBV,GAAe,GAGnD9C,EACJ9iB,EAASmB,YAAa6jB,GAAmBoB,EAASR,EAAYjE,IAE9D3hB,EAASuB,WAAYyjB,GAAmBrD,EAAOiE,EAAY3+B,IAI5D06B,EAAMwD,WAAYA,GAClBA,EAAax+B,OAERm+B,GACJG,EAAmBtY,QAASmW,EAAY,cAAgB,aACrDnB,EAAOrB,EAAGwC,EAAYsD,EAAUn/B,IAIpCi+B,EAAiBnmB,SAAUimB,GAAmBrD,EAAOiE,IAEhDd,IACJG,EAAmBtY,QAAS,gBAAkBgV,EAAOrB,MAG3C98B,EAAO4/B,QAChB5/B,EAAOsmB,MAAM6C,QAAS,cAKzB,MAAOgV,IAGR6E,QAAS,SAAUjD,EAAK1f,EAAM5e,GAC7B,MAAOzB,GAAOiB,IAAK8+B,EAAK1f,EAAM5e,EAAU,SAGzCwhC,UAAW,SAAUlD,EAAKt+B,GACzB,MAAOzB,GAAOiB,IAAK8+B,EAAK58B,OAAW1B,EAAU,aAI/CzB,EAAOwB,MAAQ,MAAO,QAAU,SAAUI,EAAGma,GAC5C/b,EAAQ+b,GAAW,SAAUgkB,EAAK1f,EAAM5e,EAAUoC,GAUjD,MAPK7D,GAAOgD,WAAYqd,KACvBxc,EAAOA,GAAQpC,EACfA,EAAW4e,EACXA,EAAOld,QAIDnD,EAAO+gC,KAAM/gC,EAAOuC,QAC1Bw9B,IAAKA,EACLl8B,KAAMkY,EACNiiB,SAAUn6B,EACVwc,KAAMA,EACNuiB,QAASnhC,GACPzB,EAAOiD,cAAe88B,IAASA,OAKpC//B,EAAOstB,SAAW,SAAUyS,GAC3B,MAAO//B,GAAO+gC,MACbhB,IAAKA,EAGLl8B,KAAM,MACNm6B,SAAU,SACVzxB,OAAO,EACP4zB,OAAO,EACPxiC,QAAQ,EACRulC,UAAU,KAKZljC,EAAOG,GAAGoC,QACT4gC,QAAS,SAAU9V,GAClB,GAAIpI,EAyBJ,OAvBK9mB,MAAM,KACL6B,EAAOgD,WAAYqqB,KACvBA,EAAOA,EAAKluB,KAAMhB,KAAM,KAIzB8mB,EAAOjlB,EAAQqtB,EAAMlvB,KAAM,GAAImN,eAAgBtJ,GAAI,GAAIa,OAAO,GAEzD1E,KAAM,GAAI0B,YACdolB,EAAKgJ,aAAc9vB,KAAM,IAG1B8mB,EAAKvjB,IAAK,WACT,GAAIC,GAAOxD,IAEX,OAAQwD,EAAKyhC,kBACZzhC,EAAOA,EAAKyhC,iBAGb,OAAOzhC,KACJosB,OAAQ5vB,OAGNA,MAGRklC,UAAW,SAAUhW,GACpB,MAAKrtB,GAAOgD,WAAYqqB,GAChBlvB,KAAKqD,KAAM,SAAUI,GAC3B5B,EAAQ7B,MAAOklC,UAAWhW,EAAKluB,KAAMhB,KAAMyD,MAItCzD,KAAKqD,KAAM,WACjB,GAAIsX,GAAO9Y,EAAQ7B,MAClBkb,EAAWP,EAAKO,UAEZA,GAAStY,OACbsY,EAAS8pB,QAAS9V,GAGlBvU,EAAKiV,OAAQV,MAKhBpI,KAAM,SAAUoI,GACf,GAAIrqB,GAAahD,EAAOgD,WAAYqqB,EAEpC,OAAOlvB,MAAKqD,KAAM,SAAUI,GAC3B5B,EAAQ7B,MAAOglC,QAASngC,EAAaqqB,EAAKluB,KAAMhB,KAAMyD,GAAMyrB,MAI9DiW,OAAQ,SAAUrjC,GAIjB,MAHA9B,MAAKmU,OAAQrS,GAAW6S,IAAK,QAAStR,KAAM,WAC3CxB,EAAQ7B,MAAOiwB,YAAajwB,KAAKwM,cAE3BxM,QAKT6B,EAAOgQ,KAAK9H,QAAQ+tB,OAAS,SAAUt0B,GACtC,OAAQ3B,EAAOgQ,KAAK9H,QAAQq7B,QAAS5hC,IAEtC3B,EAAOgQ,KAAK9H,QAAQq7B,QAAU,SAAU5hC,GACvC,SAAWA,EAAK6hC,aAAe7hC,EAAK8hC,cAAgB9hC,EAAKmwB,iBAAiB/wB,SAM3Ef,EAAO2+B,aAAa+E,IAAM,WACzB,IACC,MAAO,IAAIxlC,GAAOylC,eACjB,MAAQ94B,KAGX,IAAI+4B,KAGFC,EAAG,IAIHC,KAAM,KAEPC,GAAe/jC,EAAO2+B,aAAa+E,KAEpCtkC,GAAQ4kC,OAASD,IAAkB,mBAAqBA,IACxD3kC,EAAQ2hC,KAAOgD,KAAiBA,GAEhC/jC,EAAO8gC,cAAe,SAAUt+B,GAC/B,GAAIf,GAAUwiC,CAGd,IAAK7kC,EAAQ4kC,MAAQD,KAAiBvhC,EAAQ8/B,YAC7C,OACCO,KAAM,SAAUH,EAASvL,GACxB,GAAIv1B,GACH8hC,EAAMlhC,EAAQkhC,KAWf,IATAA,EAAIQ,KACH1hC,EAAQqB,KACRrB,EAAQu9B,IACRv9B,EAAQ29B,MACR39B,EAAQ2hC,SACR3hC,EAAQmS,UAIJnS,EAAQ4hC,UACZ,IAAMxiC,IAAKY,GAAQ4hC,UAClBV,EAAK9hC,GAAMY,EAAQ4hC,UAAWxiC,EAK3BY,GAAQy8B,UAAYyE,EAAIzB,kBAC5ByB,EAAIzB,iBAAkBz/B,EAAQy8B,UAQzBz8B,EAAQ8/B,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,iBAIjC,KAAM9gC,IAAK8gC,GACVgB,EAAI1B,iBAAkBpgC,EAAG8gC,EAAS9gC,GAInCH,GAAW,SAAUoC,GACpB,MAAO,YACDpC,IACJA,EAAWwiC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,mBAAqB,KAExC,UAAT3gC,EACJ6/B,EAAIvB,QACgB,UAATt+B,EAKgB,gBAAf6/B,GAAIxB,OACf/K,EAAU,EAAG,SAEbA,EAGCuM,EAAIxB,OACJwB,EAAItB,YAINjL,EACCyM,GAAkBF,EAAIxB,SAAYwB,EAAIxB,OACtCwB,EAAItB,WAK+B,UAAjCsB,EAAIe,cAAgB,SACM,gBAArBf,GAAIgB,cACRC,OAAQjB,EAAIrE,WACZ3/B,KAAMgkC,EAAIgB,cACbhB,EAAI3B,4BAQT2B,EAAIW,OAAS5iC,IACbwiC,EAAgBP,EAAIY,QAAU7iC,EAAU,SAKnB0B,SAAhBugC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIc,mBAAqB,WAGA,IAAnBd,EAAInkB,YAMRrhB,EAAO+f,WAAY,WACbxc,GACJwiC,OAQLxiC,EAAWA,EAAU,QAErB,KAGCiiC,EAAIb,KAAMrgC,EAAQggC,YAAchgC,EAAQ6d,MAAQ,MAC/C,MAAQxV,GAGT,GAAKpJ,EACJ,KAAMoJ,KAKTs3B,MAAO,WACD1gC,GACJA,QAWLzB,EAAO6gC,cAAe,SAAU/D,GAC1BA,EAAEwF,cACNxF,EAAEzjB,SAAS7Z,QAAS,KAKtBQ,EAAO2gC,WACNN,SACC7gC,OAAQ,6FAGT6Z,UACC7Z,OAAQ,2BAET2/B,YACCyF,cAAe,SAAUllC,GAExB,MADAM,GAAOsE,WAAY5E,GACZA,MAMVM,EAAO6gC,cAAe,SAAU,SAAU/D,GACxB35B,SAAZ25B,EAAEvwB,QACNuwB,EAAEvwB,OAAQ,GAENuwB,EAAEwF,cACNxF,EAAEj5B,KAAO,SAKX7D,EAAO8gC,cAAe,SAAU,SAAUhE,GAGzC,GAAKA,EAAEwF,YAAc,CACpB,GAAI9iC,GAAQiC,CACZ,QACCohC,KAAM,SAAUn5B,EAAGytB,GAClB33B,EAASQ,EAAQ,YAAasgB,MAC7BukB,QAAS/H,EAAEgI,cACXpiC,IAAKo6B,EAAEiD,MACJ7Z,GACH,aACAzkB,EAAW,SAAUsjC,GACpBvlC,EAAO4b,SACP3Z,EAAW,KACNsjC,GACJ5N,EAAuB,UAAb4N,EAAIlhC,KAAmB,IAAM,IAAKkhC,EAAIlhC,QAMnD9F,EAAS4B,KAAKC,YAAaJ,EAAQ,KAEpC2iC,MAAO,WACD1gC,GACJA,QAUL,IAAIujC,OACHC,GAAS,mBAGVjlC,GAAO2gC,WACNuE,MAAO,WACPC,cAAe,WACd,GAAI1jC,GAAWujC,GAAar9B,OAAW3H,EAAOoD,QAAU,IAAQ84B,IAEhE,OADA/9B,MAAMsD,IAAa,EACZA,KAKTzB,EAAO6gC,cAAe,aAAc,SAAU/D,EAAGsI,EAAkBjH,GAElE,GAAIkH,GAAcC,EAAaC,EAC9BC,EAAW1I,EAAEoI,SAAU,IAAWD,GAAOp5B,KAAMixB,EAAEiD,KAChD,MACkB,gBAAXjD,GAAEzc,MAE6C,KADnDyc,EAAEsD,aAAe,IACjBxhC,QAAS,sCACXqmC,GAAOp5B,KAAMixB,EAAEzc,OAAU,OAI5B,IAAKmlB,GAAiC,UAArB1I,EAAEmB,UAAW,GA8D7B,MA3DAoH,GAAevI,EAAEqI,cAAgBnlC,EAAOgD,WAAY85B,EAAEqI,eACrDrI,EAAEqI,gBACFrI,EAAEqI,cAGEK,EACJ1I,EAAG0I,GAAa1I,EAAG0I,GAAWjiC,QAAS0hC,GAAQ,KAAOI,GAC3CvI,EAAEoI,SAAU,IACvBpI,EAAEiD,MAAS5D,GAAOtwB,KAAMixB,EAAEiD,KAAQ,IAAM,KAAQjD,EAAEoI,MAAQ,IAAMG,GAIjEvI,EAAEqC,WAAY,eAAkB,WAI/B,MAHMoG,IACLvlC,EAAOyD,MAAO4hC,EAAe,mBAEvBE,EAAmB,IAI3BzI,EAAEmB,UAAW,GAAM,OAGnBqH,EAAcpnC,EAAQmnC,GACtBnnC,EAAQmnC,GAAiB,WACxBE,EAAoBzjC,WAIrBq8B,EAAM5hB,OAAQ,WAGQpZ,SAAhBmiC,EACJtlC,EAAQ9B,GAAS67B,WAAYsL,GAI7BnnC,EAAQmnC,GAAiBC,EAIrBxI,EAAGuI,KAGPvI,EAAEqI,cAAgBC,EAAiBD,cAGnCH,GAAarmC,KAAM0mC,IAIfE,GAAqBvlC,EAAOgD,WAAYsiC,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAcniC,SAI5B,WAYT/D,EAAQqmC,mBAAqB,WAC5B,GAAItiB,GAAOplB,EAAS2nC,eAAeD,mBAAoB,IAAKtiB,IAE5D,OADAA,GAAKpU,UAAY,6BACiB,IAA3BoU,EAAKxY,WAAW5J,UAQxBf,EAAOgZ,UAAY,SAAUqH,EAAMngB,EAASylC,GAC3C,GAAqB,gBAATtlB,GACX,QAEuB,kBAAZngB,KACXylC,EAAczlC,EACdA,GAAU,EAGX,IAAIoV,GAAMswB,EAAQ9gB,CAwBlB,OAtBM5kB,KAIAd,EAAQqmC,oBACZvlC,EAAUnC,EAAS2nC,eAAeD,mBAAoB,IAKtDnwB,EAAOpV,EAAQT,cAAe,QAC9B6V,EAAK3B,KAAO5V,EAASuV,SAASK,KAC9BzT,EAAQP,KAAKC,YAAa0V,IAE1BpV,EAAUnC,GAIZ6nC,EAASltB,EAAWnN,KAAM8U,GAC1ByE,GAAW6gB,MAGNC,GACK1lC,EAAQT,cAAemmC,EAAQ,MAGzCA,EAAS/gB,IAAiBxE,GAAQngB,EAAS4kB,GAEtCA,GAAWA,EAAQ/jB,QACvBf,EAAQ8kB,GAAU1J,SAGZpb,EAAOsB,SAAWskC,EAAOj7B,cAOjC3K,EAAOG,GAAG8oB,KAAO,SAAU8W,EAAK8F,EAAQpkC,GACvC,GAAIxB,GAAU4D,EAAMw7B,EACnBvmB,EAAO3a,KACPooB,EAAMwZ,EAAInhC,QAAS,IAsDpB,OApDK2nB,QACJtmB,EAAWo6B,GAAkB0F,EAAIthC,MAAO8nB,IACxCwZ,EAAMA,EAAIthC,MAAO,EAAG8nB,IAIhBvmB,EAAOgD,WAAY6iC,IAGvBpkC,EAAWokC,EACXA,EAAS1iC,QAGE0iC,GAA4B,gBAAXA,KAC5BhiC,EAAO,QAIHiV,EAAK/X,OAAS,GAClBf,EAAO+gC,MACNhB,IAAKA,EAKLl8B,KAAMA,GAAQ,MACdm6B,SAAU,OACV3d,KAAMwlB,IACH1+B,KAAM,SAAUu9B,GAGnBrF,EAAWv9B,UAEXgX,EAAKuU,KAAMptB,EAIVD,EAAQ,SAAU+tB,OAAQ/tB,EAAOgZ,UAAW0rB,IAAiB91B,KAAM3O,GAGnEykC,KAKEnoB,OAAQ9a,GAAY,SAAU08B,EAAO+D,GACxCppB,EAAKtX,KAAM,WACVC,EAASI,MAAO1D,KAAMkhC,IAAclB,EAAMuG,aAAcxC,EAAQ/D,QAK5DhgC,MAOR6B,EAAOwB,MACN,YACA,WACA,eACA,YACA,cACA,YACE,SAAUI,EAAGiC,GACf7D,EAAOG,GAAI0D,GAAS,SAAU1D,GAC7B,MAAOhC,MAAK+nB,GAAIriB,EAAM1D,MAOxBH,EAAOgQ,KAAK9H,QAAQ49B,SAAW,SAAUnkC,GACxC,MAAO3B,GAAOiF,KAAMjF,EAAOi4B,OAAQ,SAAU93B,GAC5C,MAAOwB,KAASxB,EAAGwB,OAChBZ,OASL,SAASglC,IAAWpkC,GACnB,MAAO3B,GAAO+D,SAAUpC,GAASA,EAAyB,IAAlBA,EAAKiJ,UAAkBjJ,EAAKuM,YAGrElO,EAAOgmC,QACNC,UAAW,SAAUtkC,EAAMa,EAASZ,GACnC,GAAIskC,GAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnE5V,EAAW5wB,EAAOmiB,IAAKxgB,EAAM,YAC7B8kC,EAAUzmC,EAAQ2B,GAClB6nB,IAGiB,YAAboH,IACJjvB,EAAKsgB,MAAM2O,SAAW,YAGvB0V,EAAYG,EAAQT,SACpBI,EAAYpmC,EAAOmiB,IAAKxgB,EAAM,OAC9B4kC,EAAavmC,EAAOmiB,IAAKxgB,EAAM,QAC/B6kC,GAAmC,aAAb5V,GAAwC,UAAbA,KAC9CwV,EAAYG,GAAa3nC,QAAS,WAIhC4nC,GACJN,EAAcO,EAAQ7V,WACtByV,EAASH,EAAY/3B,IACrBg4B,EAAUD,EAAYjT,OAGtBoT,EAASniC,WAAYkiC,IAAe,EACpCD,EAAUjiC,WAAYqiC,IAAgB,GAGlCvmC,EAAOgD,WAAYR,KAGvBA,EAAUA,EAAQrD,KAAMwC,EAAMC,EAAG5B,EAAOuC,UAAY+jC,KAGjC,MAAf9jC,EAAQ2L,MACZqb,EAAMrb,IAAQ3L,EAAQ2L,IAAMm4B,EAAUn4B,IAAQk4B,GAE1B,MAAhB7jC,EAAQywB,OACZzJ,EAAMyJ,KAASzwB,EAAQywB,KAAOqT,EAAUrT,KAASkT,GAG7C,SAAW3jC,GACfA,EAAQkkC,MAAMvnC,KAAMwC,EAAM6nB,GAG1Bid,EAAQtkB,IAAKqH,KAKhBxpB,EAAOG,GAAGoC,QACTyjC,OAAQ,SAAUxjC,GAGjB,GAAKV,UAAUf,OACd,MAAmBoC,UAAZX,EACNrE,KACAA,KAAKqD,KAAM,SAAUI,GACpB5B,EAAOgmC,OAAOC,UAAW9nC,KAAMqE,EAASZ,IAI3C,IAAIgF,GAAS+/B,EAAKC,EAAMrnC,EACvBoC,EAAOxD,KAAM,EAEd,IAAMwD,EAON,MAAMA,GAAKmwB,iBAAiB/wB,QAI5B6lC,EAAOjlC,EAAKowB,wBAGP6U,EAAKnX,OAASmX,EAAKvR,QACvB91B,EAAMoC,EAAK2J,cACXq7B,EAAMZ,GAAWxmC,GACjBqH,EAAUrH,EAAIuO,iBAGbK,IAAKy4B,EAAKz4B,IAAMw4B,EAAIE,YAAcjgC,EAAQkgC,UAC1C7T,KAAM2T,EAAK3T,KAAO0T,EAAII,YAAcngC,EAAQogC,aAKvCJ,IAlBGz4B,IAAK,EAAG8kB,KAAM,IAqBzBrC,SAAU,WACT,GAAMzyB,KAAM,GAAZ,CAIA,GAAI8oC,GAAcjB,EACjBrkC,EAAOxD,KAAM,GACb+oC,GAAiB/4B,IAAK,EAAG8kB,KAAM,EA4BhC,OAxBwC,UAAnCjzB,EAAOmiB,IAAKxgB,EAAM,YAGtBqkC,EAASrkC,EAAKowB,yBAKdkV,EAAe9oC,KAAK8oC,eAGpBjB,EAAS7nC,KAAK6nC,SACRhmC,EAAOyE,SAAUwiC,EAAc,GAAK,UACzCC,EAAeD,EAAajB,UAI7BkB,GACC/4B,IAAK+4B,EAAa/4B,IAAMnO,EAAOmiB,IAAK8kB,EAAc,GAAK,kBAAkB,GACzEhU,KAAMiU,EAAajU,KAAOjzB,EAAOmiB,IAAK8kB,EAAc,GAAK,mBAAmB,MAM7E94B,IAAK63B,EAAO73B,IAAM+4B,EAAa/4B,IAAMnO,EAAOmiB,IAAKxgB,EAAM,aAAa,GACpEsxB,KAAM+S,EAAO/S,KAAOiU,EAAajU,KAAOjzB,EAAOmiB,IAAKxgB,EAAM,cAAc,MAc1EslC,aAAc,WACb,MAAO9oC,MAAKuD,IAAK,WAChB,GAAIulC,GAAe9oC,KAAK8oC,YAExB,OAAQA,GAA2D,WAA3CjnC,EAAOmiB,IAAK8kB,EAAc,YACjDA,EAAeA,EAAaA,YAG7B,OAAOA,IAAgBn5B,QAM1B9N,EAAOwB,MAAQ6yB,WAAY,cAAeD,UAAW,eAAiB,SAAUrY,EAAQuE,GACvF,GAAInS,GAAM,gBAAkBmS,CAE5BtgB,GAAOG,GAAI4b,GAAW,SAAU5L,GAC/B,MAAOsP,GAAQthB,KAAM,SAAUwD,EAAMoa,EAAQ5L,GAC5C,GAAIw2B,GAAMZ,GAAWpkC,EAErB,OAAawB,UAARgN,EACGw2B,EAAMA,EAAKrmB,GAAS3e,EAAMoa,QAG7B4qB,EACJA,EAAIQ,SACFh5B,EAAYw4B,EAAII,YAAV52B,EACPhC,EAAMgC,EAAMw2B,EAAIE,aAIjBllC,EAAMoa,GAAW5L,IAEhB4L,EAAQ5L,EAAKrO,UAAUf,WAU5Bf,EAAOwB,MAAQ,MAAO,QAAU,SAAUI,EAAG0e,GAC5CtgB,EAAOgyB,SAAU1R,GAASiQ,GAAcnxB,EAAQ0wB,cAC/C,SAAUnuB,EAAMwuB,GACf,GAAKA,EAIJ,MAHAA,GAAWD,GAAQvuB,EAAM2e,GAGlBuO,GAAUhjB,KAAMskB,GACtBnwB,EAAQ2B,GAAOivB,WAAYtQ,GAAS,KACpC6P,MAQLnwB,EAAOwB,MAAQ4lC,OAAQ,SAAUC,MAAO,SAAW,SAAU5kC,EAAMoB,GAClE7D,EAAOwB,MAAQ2xB,QAAS,QAAU1wB,EAAM8pB,QAAS1oB,EAAMyjC,GAAI,QAAU7kC,GACpE,SAAU8kC,EAAcC,GAGxBxnC,EAAOG,GAAIqnC,GAAa,SAAUtU,EAAQ3tB,GACzC,GAAIma,GAAY5d,UAAUf,SAAYwmC,GAAkC,iBAAXrU,IAC5DzB,EAAQ8V,IAAkBrU,KAAW,GAAQ3tB,KAAU,EAAO,SAAW,SAE1E,OAAOka,GAAQthB,KAAM,SAAUwD,EAAMkC,EAAM0B,GAC1C,GAAIhG,EAEJ,OAAKS,GAAO+D,SAAUpC,GAGkB,IAAhC6lC,EAAS5oC,QAAS,SACxB+C,EAAM,QAAUc,GAChBd,EAAK5D,SAAS+P,gBAAiB,SAAWrL,GAIrB,IAAlBd,EAAKiJ,UACTrL,EAAMoC,EAAKmM,gBAIJzK,KAAKkuB,IACX5vB,EAAKwhB,KAAM,SAAW1gB,GAAQlD,EAAK,SAAWkD,GAC9Cd,EAAKwhB,KAAM,SAAW1gB,GAAQlD,EAAK,SAAWkD,GAC9ClD,EAAK,SAAWkD,KAIDU,SAAVoC,EAGNvF,EAAOmiB,IAAKxgB,EAAMkC,EAAM4tB,GAGxBzxB,EAAOiiB,MAAOtgB,EAAMkC,EAAM0B,EAAOksB,IAChC5tB,EAAM6b,EAAYwT,EAAS/vB,OAAWuc,QAM5C1f,EAAOG,GAAGoC,QAETklC,KAAM,SAAUthB,EAAO9F,EAAMlgB,GAC5B,MAAOhC,MAAK+nB,GAAIC,EAAO,KAAM9F,EAAMlgB,IAEpCunC,OAAQ,SAAUvhB,EAAOhmB,GACxB,MAAOhC,MAAKooB,IAAKJ,EAAO,KAAMhmB,IAG/BwnC,SAAU,SAAU1nC,EAAUkmB,EAAO9F,EAAMlgB,GAC1C,MAAOhC,MAAK+nB,GAAIC,EAAOlmB,EAAUogB,EAAMlgB,IAExCynC,WAAY,SAAU3nC,EAAUkmB,EAAOhmB,GAGtC,MAA4B,KAArB2B,UAAUf,OAChB5C,KAAKooB,IAAKtmB,EAAU,MACpB9B,KAAKooB,IAAKJ,EAAOlmB,GAAY,KAAME,MAItCH,EAAO6nC,UAAYhnB,KAAKC,MAkBD,kBAAXgnB,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WACrB,MAAO9nC,IAOT,IAGCgoC,IAAU9pC,EAAO8B,OAGjBioC,GAAK/pC,EAAOgqC,CAyBb,OAvBAloC,GAAOmoC,WAAa,SAAUplC,GAS7B,MARK7E,GAAOgqC,IAAMloC,IACjB9B,EAAOgqC,EAAID,IAGPllC,GAAQ7E,EAAO8B,SAAWA,IAC9B9B,EAAO8B,OAASgoC,IAGVhoC,GAMF5B,IACLF,EAAO8B,OAAS9B,EAAOgqC,EAAIloC,GAOrBA","file":"jquery.min.js"}
        \ No newline at end of file
        diff --git a/bower_components/jquery/dist/jquery.slim.js b/bower_components/jquery/dist/jquery.slim.js
        new file mode 100644
        index 0000000000..7c35f7d973
        --- /dev/null
        +++ b/bower_components/jquery/dist/jquery.slim.js
        @@ -0,0 +1,8107 @@
        +/*!
        + * jQuery JavaScript Library v3.1.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/animatedSelector,-effects/Tween,-deprecated
        + * https://jquery.com/
        + *
        + * Includes Sizzle.js
        + * https://sizzlejs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * https://jquery.org/license
        + *
        + * Date: 2016-09-22T22:30Z
        + */
        +( function( global, factory ) {
        +
        +	"use strict";
        +
        +	if ( typeof module === "object" && typeof module.exports === "object" ) {
        +
        +		// For CommonJS and CommonJS-like environments where a proper `window`
        +		// is present, execute the factory and get jQuery.
        +		// For environments that do not have a `window` with a `document`
        +		// (such as Node.js), expose a factory as module.exports.
        +		// This accentuates the need for the creation of a real `window`.
        +		// e.g. var jQuery = require("jquery")(window);
        +		// See ticket #14549 for more info.
        +		module.exports = global.document ?
        +			factory( global, true ) :
        +			function( w ) {
        +				if ( !w.document ) {
        +					throw new Error( "jQuery requires a window with a document" );
        +				}
        +				return factory( w );
        +			};
        +	} else {
        +		factory( global );
        +	}
        +
        +// Pass this if window is not defined yet
        +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
        +
        +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
        +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
        +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
        +// enough that all such attempts are guarded in a try block.
        +"use strict";
        +
        +var arr = [];
        +
        +var document = window.document;
        +
        +var getProto = Object.getPrototypeOf;
        +
        +var slice = arr.slice;
        +
        +var concat = arr.concat;
        +
        +var push = arr.push;
        +
        +var indexOf = arr.indexOf;
        +
        +var class2type = {};
        +
        +var toString = class2type.toString;
        +
        +var hasOwn = class2type.hasOwnProperty;
        +
        +var fnToString = hasOwn.toString;
        +
        +var ObjectFunctionString = fnToString.call( Object );
        +
        +var support = {};
        +
        +
        +
        +	function DOMEval( code, doc ) {
        +		doc = doc || document;
        +
        +		var script = doc.createElement( "script" );
        +
        +		script.text = code;
        +		doc.head.appendChild( script ).parentNode.removeChild( script );
        +	}
        +/* global Symbol */
        +// Defining this global in .eslintrc.json would create a danger of using the global
        +// unguarded in another place, it seems safer to define global only for this module
        +
        +
        +
        +var
        +	version = "3.1.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/animatedSelector,-effects/Tween,-deprecated",
        +
        +	// Define a local copy of jQuery
        +	jQuery = function( selector, context ) {
        +
        +		// The jQuery object is actually just the init constructor 'enhanced'
        +		// Need init if jQuery is called (just allow error to be thrown if not included)
        +		return new jQuery.fn.init( selector, context );
        +	},
        +
        +	// Support: Android <=4.0 only
        +	// Make sure we trim BOM and NBSP
        +	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
        +
        +	// Matches dashed string for camelizing
        +	rmsPrefix = /^-ms-/,
        +	rdashAlpha = /-([a-z])/g,
        +
        +	// Used by jQuery.camelCase as callback to replace()
        +	fcamelCase = function( all, letter ) {
        +		return letter.toUpperCase();
        +	};
        +
        +jQuery.fn = jQuery.prototype = {
        +
        +	// The current version of jQuery being used
        +	jquery: version,
        +
        +	constructor: jQuery,
        +
        +	// The default length of a jQuery object is 0
        +	length: 0,
        +
        +	toArray: function() {
        +		return slice.call( this );
        +	},
        +
        +	// Get the Nth element in the matched element set OR
        +	// Get the whole matched element set as a clean array
        +	get: function( num ) {
        +
        +		// Return all the elements in a clean array
        +		if ( num == null ) {
        +			return slice.call( this );
        +		}
        +
        +		// Return just the one element from the set
        +		return num < 0 ? this[ num + this.length ] : this[ num ];
        +	},
        +
        +	// Take an array of elements and push it onto the stack
        +	// (returning the new matched element set)
        +	pushStack: function( elems ) {
        +
        +		// Build a new jQuery matched element set
        +		var ret = jQuery.merge( this.constructor(), elems );
        +
        +		// Add the old object onto the stack (as a reference)
        +		ret.prevObject = this;
        +
        +		// Return the newly-formed element set
        +		return ret;
        +	},
        +
        +	// Execute a callback for every element in the matched set.
        +	each: function( callback ) {
        +		return jQuery.each( this, callback );
        +	},
        +
        +	map: function( callback ) {
        +		return this.pushStack( jQuery.map( this, function( elem, i ) {
        +			return callback.call( elem, i, elem );
        +		} ) );
        +	},
        +
        +	slice: function() {
        +		return this.pushStack( slice.apply( this, arguments ) );
        +	},
        +
        +	first: function() {
        +		return this.eq( 0 );
        +	},
        +
        +	last: function() {
        +		return this.eq( -1 );
        +	},
        +
        +	eq: function( i ) {
        +		var len = this.length,
        +			j = +i + ( i < 0 ? len : 0 );
        +		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
        +	},
        +
        +	end: function() {
        +		return this.prevObject || this.constructor();
        +	},
        +
        +	// For internal use only.
        +	// Behaves like an Array's method, not like a jQuery method.
        +	push: push,
        +	sort: arr.sort,
        +	splice: arr.splice
        +};
        +
        +jQuery.extend = jQuery.fn.extend = function() {
        +	var options, name, src, copy, copyIsArray, clone,
        +		target = arguments[ 0 ] || {},
        +		i = 1,
        +		length = arguments.length,
        +		deep = false;
        +
        +	// Handle a deep copy situation
        +	if ( typeof target === "boolean" ) {
        +		deep = target;
        +
        +		// Skip the boolean and the target
        +		target = arguments[ i ] || {};
        +		i++;
        +	}
        +
        +	// Handle case when target is a string or something (possible in deep copy)
        +	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
        +		target = {};
        +	}
        +
        +	// Extend jQuery itself if only one argument is passed
        +	if ( i === length ) {
        +		target = this;
        +		i--;
        +	}
        +
        +	for ( ; i < length; i++ ) {
        +
        +		// Only deal with non-null/undefined values
        +		if ( ( options = arguments[ i ] ) != null ) {
        +
        +			// Extend the base object
        +			for ( name in options ) {
        +				src = target[ name ];
        +				copy = options[ name ];
        +
        +				// Prevent never-ending loop
        +				if ( target === copy ) {
        +					continue;
        +				}
        +
        +				// Recurse if we're merging plain objects or arrays
        +				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
        +					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
        +
        +					if ( copyIsArray ) {
        +						copyIsArray = false;
        +						clone = src && jQuery.isArray( src ) ? src : [];
        +
        +					} else {
        +						clone = src && jQuery.isPlainObject( src ) ? src : {};
        +					}
        +
        +					// Never move original objects, clone them
        +					target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +				// Don't bring in undefined values
        +				} else if ( copy !== undefined ) {
        +					target[ name ] = copy;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Return the modified object
        +	return target;
        +};
        +
        +jQuery.extend( {
        +
        +	// Unique for each copy of jQuery on the page
        +	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
        +
        +	// Assume jQuery is ready without the ready module
        +	isReady: true,
        +
        +	error: function( msg ) {
        +		throw new Error( msg );
        +	},
        +
        +	noop: function() {},
        +
        +	isFunction: function( obj ) {
        +		return jQuery.type( obj ) === "function";
        +	},
        +
        +	isArray: Array.isArray,
        +
        +	isWindow: function( obj ) {
        +		return obj != null && obj === obj.window;
        +	},
        +
        +	isNumeric: function( obj ) {
        +
        +		// As of jQuery 3.0, isNumeric is limited to
        +		// strings and numbers (primitives or objects)
        +		// that can be coerced to finite numbers (gh-2662)
        +		var type = jQuery.type( obj );
        +		return ( type === "number" || type === "string" ) &&
        +
        +			// parseFloat NaNs numeric-cast false positives ("")
        +			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
        +			// subtraction forces infinities to NaN
        +			!isNaN( obj - parseFloat( obj ) );
        +	},
        +
        +	isPlainObject: function( obj ) {
        +		var proto, Ctor;
        +
        +		// Detect obvious negatives
        +		// Use toString instead of jQuery.type to catch host objects
        +		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
        +			return false;
        +		}
        +
        +		proto = getProto( obj );
        +
        +		// Objects with no prototype (e.g., `Object.create( null )`) are plain
        +		if ( !proto ) {
        +			return true;
        +		}
        +
        +		// Objects with prototype are plain iff they were constructed by a global Object function
        +		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        +		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
        +	},
        +
        +	isEmptyObject: function( obj ) {
        +
        +		/* eslint-disable no-unused-vars */
        +		// See https://github.com/eslint/eslint/issues/6125
        +		var name;
        +
        +		for ( name in obj ) {
        +			return false;
        +		}
        +		return true;
        +	},
        +
        +	type: function( obj ) {
        +		if ( obj == null ) {
        +			return obj + "";
        +		}
        +
        +		// Support: Android <=2.3 only (functionish RegExp)
        +		return typeof obj === "object" || typeof obj === "function" ?
        +			class2type[ toString.call( obj ) ] || "object" :
        +			typeof obj;
        +	},
        +
        +	// Evaluates a script in a global context
        +	globalEval: function( code ) {
        +		DOMEval( code );
        +	},
        +
        +	// Convert dashed to camelCase; used by the css and data modules
        +	// Support: IE <=9 - 11, Edge 12 - 13
        +	// Microsoft forgot to hump their vendor prefix (#9572)
        +	camelCase: function( string ) {
        +		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +	},
        +
        +	nodeName: function( elem, name ) {
        +		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        +	},
        +
        +	each: function( obj, callback ) {
        +		var length, i = 0;
        +
        +		if ( isArrayLike( obj ) ) {
        +			length = obj.length;
        +			for ( ; i < length; i++ ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		} else {
        +			for ( i in obj ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		}
        +
        +		return obj;
        +	},
        +
        +	// Support: Android <=4.0 only
        +	trim: function( text ) {
        +		return text == null ?
        +			"" :
        +			( text + "" ).replace( rtrim, "" );
        +	},
        +
        +	// results is for internal usage only
        +	makeArray: function( arr, results ) {
        +		var ret = results || [];
        +
        +		if ( arr != null ) {
        +			if ( isArrayLike( Object( arr ) ) ) {
        +				jQuery.merge( ret,
        +					typeof arr === "string" ?
        +					[ arr ] : arr
        +				);
        +			} else {
        +				push.call( ret, arr );
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	inArray: function( elem, arr, i ) {
        +		return arr == null ? -1 : indexOf.call( arr, elem, i );
        +	},
        +
        +	// Support: Android <=4.0 only, PhantomJS 1 only
        +	// push.apply(_, arraylike) throws on ancient WebKit
        +	merge: function( first, second ) {
        +		var len = +second.length,
        +			j = 0,
        +			i = first.length;
        +
        +		for ( ; j < len; j++ ) {
        +			first[ i++ ] = second[ j ];
        +		}
        +
        +		first.length = i;
        +
        +		return first;
        +	},
        +
        +	grep: function( elems, callback, invert ) {
        +		var callbackInverse,
        +			matches = [],
        +			i = 0,
        +			length = elems.length,
        +			callbackExpect = !invert;
        +
        +		// Go through the array, only saving the items
        +		// that pass the validator function
        +		for ( ; i < length; i++ ) {
        +			callbackInverse = !callback( elems[ i ], i );
        +			if ( callbackInverse !== callbackExpect ) {
        +				matches.push( elems[ i ] );
        +			}
        +		}
        +
        +		return matches;
        +	},
        +
        +	// arg is for internal usage only
        +	map: function( elems, callback, arg ) {
        +		var length, value,
        +			i = 0,
        +			ret = [];
        +
        +		// Go through the array, translating each of the items to their new values
        +		if ( isArrayLike( elems ) ) {
        +			length = elems.length;
        +			for ( ; i < length; i++ ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +
        +		// Go through every key on the object,
        +		} else {
        +			for ( i in elems ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +		}
        +
        +		// Flatten any nested arrays
        +		return concat.apply( [], ret );
        +	},
        +
        +	// A global GUID counter for objects
        +	guid: 1,
        +
        +	// Bind a function to a context, optionally partially applying any
        +	// arguments.
        +	proxy: function( fn, context ) {
        +		var tmp, args, proxy;
        +
        +		if ( typeof context === "string" ) {
        +			tmp = fn[ context ];
        +			context = fn;
        +			fn = tmp;
        +		}
        +
        +		// Quick check to determine if target is callable, in the spec
        +		// this throws a TypeError, but we will just return undefined.
        +		if ( !jQuery.isFunction( fn ) ) {
        +			return undefined;
        +		}
        +
        +		// Simulated bind
        +		args = slice.call( arguments, 2 );
        +		proxy = function() {
        +			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
        +		};
        +
        +		// Set the guid of unique handler to the same of original handler, so it can be removed
        +		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
        +
        +		return proxy;
        +	},
        +
        +	now: Date.now,
        +
        +	// jQuery.support is not used in Core but other projects attach their
        +	// properties to it so it needs to exist.
        +	support: support
        +} );
        +
        +if ( typeof Symbol === "function" ) {
        +	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
        +}
        +
        +// Populate the class2type map
        +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
        +function( i, name ) {
        +	class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +} );
        +
        +function isArrayLike( obj ) {
        +
        +	// Support: real iOS 8.2 only (not reproducible in simulator)
        +	// `in` check used to prevent JIT error (gh-2145)
        +	// hasOwn isn't used here due to false negatives
        +	// regarding Nodelist length in IE
        +	var length = !!obj && "length" in obj && obj.length,
        +		type = jQuery.type( obj );
        +
        +	if ( type === "function" || jQuery.isWindow( obj ) ) {
        +		return false;
        +	}
        +
        +	return type === "array" || length === 0 ||
        +		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
        +}
        +var Sizzle =
        +/*!
        + * Sizzle CSS Selector Engine v2.3.3
        + * https://sizzlejs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + *
        + * Date: 2016-08-08
        + */
        +(function( window ) {
        +
        +var i,
        +	support,
        +	Expr,
        +	getText,
        +	isXML,
        +	tokenize,
        +	compile,
        +	select,
        +	outermostContext,
        +	sortInput,
        +	hasDuplicate,
        +
        +	// Local document vars
        +	setDocument,
        +	document,
        +	docElem,
        +	documentIsHTML,
        +	rbuggyQSA,
        +	rbuggyMatches,
        +	matches,
        +	contains,
        +
        +	// Instance-specific data
        +	expando = "sizzle" + 1 * new Date(),
        +	preferredDoc = window.document,
        +	dirruns = 0,
        +	done = 0,
        +	classCache = createCache(),
        +	tokenCache = createCache(),
        +	compilerCache = createCache(),
        +	sortOrder = function( a, b ) {
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +		}
        +		return 0;
        +	},
        +
        +	// Instance methods
        +	hasOwn = ({}).hasOwnProperty,
        +	arr = [],
        +	pop = arr.pop,
        +	push_native = arr.push,
        +	push = arr.push,
        +	slice = arr.slice,
        +	// Use a stripped-down indexOf as it's faster than native
        +	// https://jsperf.com/thor-indexof-vs-for/5
        +	indexOf = function( list, elem ) {
        +		var i = 0,
        +			len = list.length;
        +		for ( ; i < len; i++ ) {
        +			if ( list[i] === elem ) {
        +				return i;
        +			}
        +		}
        +		return -1;
        +	},
        +
        +	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
        +
        +	// Regular expressions
        +
        +	// http://www.w3.org/TR/css3-selectors/#whitespace
        +	whitespace = "[\\x20\\t\\r\\n\\f]",
        +
        +	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        +	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
        +
        +	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
        +	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
        +		// Operator (capture 2)
        +		"*([*^$|!~]?=)" + whitespace +
        +		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
        +		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
        +		"*\\]",
        +
        +	pseudos = ":(" + identifier + ")(?:\\((" +
        +		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
        +		// 1. quoted (capture 3; capture 4 or capture 5)
        +		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
        +		// 2. simple (capture 6)
        +		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
        +		// 3. anything else (capture 2)
        +		".*" +
        +		")\\)|)",
        +
        +	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
        +	rwhitespace = new RegExp( whitespace + "+", "g" ),
        +	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
        +
        +	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
        +	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
        +
        +	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
        +
        +	rpseudo = new RegExp( pseudos ),
        +	ridentifier = new RegExp( "^" + identifier + "$" ),
        +
        +	matchExpr = {
        +		"ID": new RegExp( "^#(" + identifier + ")" ),
        +		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
        +		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
        +		"ATTR": new RegExp( "^" + attributes ),
        +		"PSEUDO": new RegExp( "^" + pseudos ),
        +		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
        +			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
        +			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
        +		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
        +		// For use in libraries implementing .is()
        +		// We use this for POS matching in `select`
        +		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
        +			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
        +	},
        +
        +	rinputs = /^(?:input|select|textarea|button)$/i,
        +	rheader = /^h\d$/i,
        +
        +	rnative = /^[^{]+\{\s*\[native \w/,
        +
        +	// Easily-parseable/retrievable ID or TAG or CLASS selectors
        +	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
        +
        +	rsibling = /[+~]/,
        +
        +	// CSS escapes
        +	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
        +	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
        +	funescape = function( _, escaped, escapedWhitespace ) {
        +		var high = "0x" + escaped - 0x10000;
        +		// NaN means non-codepoint
        +		// Support: Firefox<24
        +		// Workaround erroneous numeric interpretation of +"0x"
        +		return high !== high || escapedWhitespace ?
        +			escaped :
        +			high < 0 ?
        +				// BMP codepoint
        +				String.fromCharCode( high + 0x10000 ) :
        +				// Supplemental Plane codepoint (surrogate pair)
        +				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
        +	},
        +
        +	// CSS string/identifier serialization
        +	// https://drafts.csswg.org/cssom/#common-serializing-idioms
        +	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
        +	fcssescape = function( ch, asCodePoint ) {
        +		if ( asCodePoint ) {
        +
        +			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
        +			if ( ch === "\0" ) {
        +				return "\uFFFD";
        +			}
        +
        +			// Control characters and (dependent upon position) numbers get escaped as code points
        +			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
        +		}
        +
        +		// Other potentially-special ASCII characters get backslash-escaped
        +		return "\\" + ch;
        +	},
        +
        +	// Used for iframes
        +	// See setDocument()
        +	// Removing the function wrapper causes a "Permission Denied"
        +	// error in IE
        +	unloadHandler = function() {
        +		setDocument();
        +	},
        +
        +	disabledAncestor = addCombinator(
        +		function( elem ) {
        +			return elem.disabled === true && ("form" in elem || "label" in elem);
        +		},
        +		{ dir: "parentNode", next: "legend" }
        +	);
        +
        +// Optimize for push.apply( _, NodeList )
        +try {
        +	push.apply(
        +		(arr = slice.call( preferredDoc.childNodes )),
        +		preferredDoc.childNodes
        +	);
        +	// Support: Android<4.0
        +	// Detect silently failing push.apply
        +	arr[ preferredDoc.childNodes.length ].nodeType;
        +} catch ( e ) {
        +	push = { apply: arr.length ?
        +
        +		// Leverage slice if possible
        +		function( target, els ) {
        +			push_native.apply( target, slice.call(els) );
        +		} :
        +
        +		// Support: IE<9
        +		// Otherwise append directly
        +		function( target, els ) {
        +			var j = target.length,
        +				i = 0;
        +			// Can't trust NodeList.length
        +			while ( (target[j++] = els[i++]) ) {}
        +			target.length = j - 1;
        +		}
        +	};
        +}
        +
        +function Sizzle( selector, context, results, seed ) {
        +	var m, i, elem, nid, match, groups, newSelector,
        +		newContext = context && context.ownerDocument,
        +
        +		// nodeType defaults to 9, since context defaults to document
        +		nodeType = context ? context.nodeType : 9;
        +
        +	results = results || [];
        +
        +	// Return early from calls with invalid selector or context
        +	if ( typeof selector !== "string" || !selector ||
        +		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
        +
        +		return results;
        +	}
        +
        +	// Try to shortcut find operations (as opposed to filters) in HTML documents
        +	if ( !seed ) {
        +
        +		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
        +			setDocument( context );
        +		}
        +		context = context || document;
        +
        +		if ( documentIsHTML ) {
        +
        +			// If the selector is sufficiently simple, try using a "get*By*" DOM method
        +			// (excepting DocumentFragment context, where the methods don't exist)
        +			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
        +
        +				// ID selector
        +				if ( (m = match[1]) ) {
        +
        +					// Document context
        +					if ( nodeType === 9 ) {
        +						if ( (elem = context.getElementById( m )) ) {
        +
        +							// Support: IE, Opera, Webkit
        +							// TODO: identify versions
        +							// getElementById can match elements by name instead of ID
        +							if ( elem.id === m ) {
        +								results.push( elem );
        +								return results;
        +							}
        +						} else {
        +							return results;
        +						}
        +
        +					// Element context
        +					} else {
        +
        +						// Support: IE, Opera, Webkit
        +						// TODO: identify versions
        +						// getElementById can match elements by name instead of ID
        +						if ( newContext && (elem = newContext.getElementById( m )) &&
        +							contains( context, elem ) &&
        +							elem.id === m ) {
        +
        +							results.push( elem );
        +							return results;
        +						}
        +					}
        +
        +				// Type selector
        +				} else if ( match[2] ) {
        +					push.apply( results, context.getElementsByTagName( selector ) );
        +					return results;
        +
        +				// Class selector
        +				} else if ( (m = match[3]) && support.getElementsByClassName &&
        +					context.getElementsByClassName ) {
        +
        +					push.apply( results, context.getElementsByClassName( m ) );
        +					return results;
        +				}
        +			}
        +
        +			// Take advantage of querySelectorAll
        +			if ( support.qsa &&
        +				!compilerCache[ selector + " " ] &&
        +				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
        +
        +				if ( nodeType !== 1 ) {
        +					newContext = context;
        +					newSelector = selector;
        +
        +				// qSA looks outside Element context, which is not what we want
        +				// Thanks to Andrew Dupont for this workaround technique
        +				// Support: IE <=8
        +				// Exclude object elements
        +				} else if ( context.nodeName.toLowerCase() !== "object" ) {
        +
        +					// Capture the context ID, setting it first if necessary
        +					if ( (nid = context.getAttribute( "id" )) ) {
        +						nid = nid.replace( rcssescape, fcssescape );
        +					} else {
        +						context.setAttribute( "id", (nid = expando) );
        +					}
        +
        +					// Prefix every selector in the list
        +					groups = tokenize( selector );
        +					i = groups.length;
        +					while ( i-- ) {
        +						groups[i] = "#" + nid + " " + toSelector( groups[i] );
        +					}
        +					newSelector = groups.join( "," );
        +
        +					// Expand context for sibling selectors
        +					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
        +						context;
        +				}
        +
        +				if ( newSelector ) {
        +					try {
        +						push.apply( results,
        +							newContext.querySelectorAll( newSelector )
        +						);
        +						return results;
        +					} catch ( qsaError ) {
        +					} finally {
        +						if ( nid === expando ) {
        +							context.removeAttribute( "id" );
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	// All others
        +	return select( selector.replace( rtrim, "$1" ), context, results, seed );
        +}
        +
        +/**
        + * Create key-value caches of limited size
        + * @returns {function(string, object)} Returns the Object data after storing it on itself with
        + *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
        + *	deleting the oldest entry
        + */
        +function createCache() {
        +	var keys = [];
        +
        +	function cache( key, value ) {
        +		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        +		if ( keys.push( key + " " ) > Expr.cacheLength ) {
        +			// Only keep the most recent entries
        +			delete cache[ keys.shift() ];
        +		}
        +		return (cache[ key + " " ] = value);
        +	}
        +	return cache;
        +}
        +
        +/**
        + * Mark a function for special use by Sizzle
        + * @param {Function} fn The function to mark
        + */
        +function markFunction( fn ) {
        +	fn[ expando ] = true;
        +	return fn;
        +}
        +
        +/**
        + * Support testing using an element
        + * @param {Function} fn Passed the created element and returns a boolean result
        + */
        +function assert( fn ) {
        +	var el = document.createElement("fieldset");
        +
        +	try {
        +		return !!fn( el );
        +	} catch (e) {
        +		return false;
        +	} finally {
        +		// Remove from its parent by default
        +		if ( el.parentNode ) {
        +			el.parentNode.removeChild( el );
        +		}
        +		// release memory in IE
        +		el = null;
        +	}
        +}
        +
        +/**
        + * Adds the same handler for all of the specified attrs
        + * @param {String} attrs Pipe-separated list of attributes
        + * @param {Function} handler The method that will be applied
        + */
        +function addHandle( attrs, handler ) {
        +	var arr = attrs.split("|"),
        +		i = arr.length;
        +
        +	while ( i-- ) {
        +		Expr.attrHandle[ arr[i] ] = handler;
        +	}
        +}
        +
        +/**
        + * Checks document order of two siblings
        + * @param {Element} a
        + * @param {Element} b
        + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
        + */
        +function siblingCheck( a, b ) {
        +	var cur = b && a,
        +		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
        +			a.sourceIndex - b.sourceIndex;
        +
        +	// Use IE sourceIndex if available on both nodes
        +	if ( diff ) {
        +		return diff;
        +	}
        +
        +	// Check if b follows a
        +	if ( cur ) {
        +		while ( (cur = cur.nextSibling) ) {
        +			if ( cur === b ) {
        +				return -1;
        +			}
        +		}
        +	}
        +
        +	return a ? 1 : -1;
        +}
        +
        +/**
        + * Returns a function to use in pseudos for input types
        + * @param {String} type
        + */
        +function createInputPseudo( type ) {
        +	return function( elem ) {
        +		var name = elem.nodeName.toLowerCase();
        +		return name === "input" && elem.type === type;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for buttons
        + * @param {String} type
        + */
        +function createButtonPseudo( type ) {
        +	return function( elem ) {
        +		var name = elem.nodeName.toLowerCase();
        +		return (name === "input" || name === "button") && elem.type === type;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for :enabled/:disabled
        + * @param {Boolean} disabled true for :disabled; false for :enabled
        + */
        +function createDisabledPseudo( disabled ) {
        +
        +	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
        +	return function( elem ) {
        +
        +		// Only certain elements can match :enabled or :disabled
        +		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
        +		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
        +		if ( "form" in elem ) {
        +
        +			// Check for inherited disabledness on relevant non-disabled elements:
        +			// * listed form-associated elements in a disabled fieldset
        +			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
        +			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
        +			// * option elements in a disabled optgroup
        +			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
        +			// All such elements have a "form" property.
        +			if ( elem.parentNode && elem.disabled === false ) {
        +
        +				// Option elements defer to a parent optgroup if present
        +				if ( "label" in elem ) {
        +					if ( "label" in elem.parentNode ) {
        +						return elem.parentNode.disabled === disabled;
        +					} else {
        +						return elem.disabled === disabled;
        +					}
        +				}
        +
        +				// Support: IE 6 - 11
        +				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
        +				return elem.isDisabled === disabled ||
        +
        +					// Where there is no isDisabled, check manually
        +					/* jshint -W018 */
        +					elem.isDisabled !== !disabled &&
        +						disabledAncestor( elem ) === disabled;
        +			}
        +
        +			return elem.disabled === disabled;
        +
        +		// Try to winnow out elements that can't be disabled before trusting the disabled property.
        +		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
        +		// even exist on them, let alone have a boolean value.
        +		} else if ( "label" in elem ) {
        +			return elem.disabled === disabled;
        +		}
        +
        +		// Remaining elements are neither :enabled nor :disabled
        +		return false;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for positionals
        + * @param {Function} fn
        + */
        +function createPositionalPseudo( fn ) {
        +	return markFunction(function( argument ) {
        +		argument = +argument;
        +		return markFunction(function( seed, matches ) {
        +			var j,
        +				matchIndexes = fn( [], seed.length, argument ),
        +				i = matchIndexes.length;
        +
        +			// Match elements found at the specified indexes
        +			while ( i-- ) {
        +				if ( seed[ (j = matchIndexes[i]) ] ) {
        +					seed[j] = !(matches[j] = seed[j]);
        +				}
        +			}
        +		});
        +	});
        +}
        +
        +/**
        + * Checks a node for validity as a Sizzle context
        + * @param {Element|Object=} context
        + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
        + */
        +function testContext( context ) {
        +	return context && typeof context.getElementsByTagName !== "undefined" && context;
        +}
        +
        +// Expose support vars for convenience
        +support = Sizzle.support = {};
        +
        +/**
        + * Detects XML nodes
        + * @param {Element|Object} elem An element or a document
        + * @returns {Boolean} True iff elem is a non-HTML XML node
        + */
        +isXML = Sizzle.isXML = function( elem ) {
        +	// documentElement is verified for cases where it doesn't yet exist
        +	// (such as loading iframes in IE - #4833)
        +	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
        +	return documentElement ? documentElement.nodeName !== "HTML" : false;
        +};
        +
        +/**
        + * Sets document-related variables once based on the current document
        + * @param {Element|Object} [doc] An element or document object to use to set the document
        + * @returns {Object} Returns the current document
        + */
        +setDocument = Sizzle.setDocument = function( node ) {
        +	var hasCompare, subWindow,
        +		doc = node ? node.ownerDocument || node : preferredDoc;
        +
        +	// Return early if doc is invalid or already selected
        +	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
        +		return document;
        +	}
        +
        +	// Update global variables
        +	document = doc;
        +	docElem = document.documentElement;
        +	documentIsHTML = !isXML( document );
        +
        +	// Support: IE 9-11, Edge
        +	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
        +	if ( preferredDoc !== document &&
        +		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
        +
        +		// Support: IE 11, Edge
        +		if ( subWindow.addEventListener ) {
        +			subWindow.addEventListener( "unload", unloadHandler, false );
        +
        +		// Support: IE 9 - 10 only
        +		} else if ( subWindow.attachEvent ) {
        +			subWindow.attachEvent( "onunload", unloadHandler );
        +		}
        +	}
        +
        +	/* Attributes
        +	---------------------------------------------------------------------- */
        +
        +	// Support: IE<8
        +	// Verify that getAttribute really returns attributes and not properties
        +	// (excepting IE8 booleans)
        +	support.attributes = assert(function( el ) {
        +		el.className = "i";
        +		return !el.getAttribute("className");
        +	});
        +
        +	/* getElement(s)By*
        +	---------------------------------------------------------------------- */
        +
        +	// Check if getElementsByTagName("*") returns only elements
        +	support.getElementsByTagName = assert(function( el ) {
        +		el.appendChild( document.createComment("") );
        +		return !el.getElementsByTagName("*").length;
        +	});
        +
        +	// Support: IE<9
        +	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
        +
        +	// Support: IE<10
        +	// Check if getElementById returns elements by name
        +	// The broken getElementById methods don't pick up programmatically-set names,
        +	// so use a roundabout getElementsByName test
        +	support.getById = assert(function( el ) {
        +		docElem.appendChild( el ).id = expando;
        +		return !document.getElementsByName || !document.getElementsByName( expando ).length;
        +	});
        +
        +	// ID filter and find
        +	if ( support.getById ) {
        +		Expr.filter["ID"] = function( id ) {
        +			var attrId = id.replace( runescape, funescape );
        +			return function( elem ) {
        +				return elem.getAttribute("id") === attrId;
        +			};
        +		};
        +		Expr.find["ID"] = function( id, context ) {
        +			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
        +				var elem = context.getElementById( id );
        +				return elem ? [ elem ] : [];
        +			}
        +		};
        +	} else {
        +		Expr.filter["ID"] =  function( id ) {
        +			var attrId = id.replace( runescape, funescape );
        +			return function( elem ) {
        +				var node = typeof elem.getAttributeNode !== "undefined" &&
        +					elem.getAttributeNode("id");
        +				return node && node.value === attrId;
        +			};
        +		};
        +
        +		// Support: IE 6 - 7 only
        +		// getElementById is not reliable as a find shortcut
        +		Expr.find["ID"] = function( id, context ) {
        +			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
        +				var node, i, elems,
        +					elem = context.getElementById( id );
        +
        +				if ( elem ) {
        +
        +					// Verify the id attribute
        +					node = elem.getAttributeNode("id");
        +					if ( node && node.value === id ) {
        +						return [ elem ];
        +					}
        +
        +					// Fall back on getElementsByName
        +					elems = context.getElementsByName( id );
        +					i = 0;
        +					while ( (elem = elems[i++]) ) {
        +						node = elem.getAttributeNode("id");
        +						if ( node && node.value === id ) {
        +							return [ elem ];
        +						}
        +					}
        +				}
        +
        +				return [];
        +			}
        +		};
        +	}
        +
        +	// Tag
        +	Expr.find["TAG"] = support.getElementsByTagName ?
        +		function( tag, context ) {
        +			if ( typeof context.getElementsByTagName !== "undefined" ) {
        +				return context.getElementsByTagName( tag );
        +
        +			// DocumentFragment nodes don't have gEBTN
        +			} else if ( support.qsa ) {
        +				return context.querySelectorAll( tag );
        +			}
        +		} :
        +
        +		function( tag, context ) {
        +			var elem,
        +				tmp = [],
        +				i = 0,
        +				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
        +				results = context.getElementsByTagName( tag );
        +
        +			// Filter out possible comments
        +			if ( tag === "*" ) {
        +				while ( (elem = results[i++]) ) {
        +					if ( elem.nodeType === 1 ) {
        +						tmp.push( elem );
        +					}
        +				}
        +
        +				return tmp;
        +			}
        +			return results;
        +		};
        +
        +	// Class
        +	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
        +		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
        +			return context.getElementsByClassName( className );
        +		}
        +	};
        +
        +	/* QSA/matchesSelector
        +	---------------------------------------------------------------------- */
        +
        +	// QSA and matchesSelector support
        +
        +	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
        +	rbuggyMatches = [];
        +
        +	// qSa(:focus) reports false when true (Chrome 21)
        +	// We allow this because of a bug in IE8/9 that throws an error
        +	// whenever `document.activeElement` is accessed on an iframe
        +	// So, we allow :focus to pass through QSA all the time to avoid the IE error
        +	// See https://bugs.jquery.com/ticket/13378
        +	rbuggyQSA = [];
        +
        +	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
        +		// Build QSA regex
        +		// Regex strategy adopted from Diego Perini
        +		assert(function( el ) {
        +			// Select is set to empty string on purpose
        +			// This is to test IE's treatment of not explicitly
        +			// setting a boolean content attribute,
        +			// since its presence should be enough
        +			// https://bugs.jquery.com/ticket/12359
        +			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
        +				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
        +				"<option selected=''></option></select>";
        +
        +			// Support: IE8, Opera 11-12.16
        +			// Nothing should be selected when empty strings follow ^= or $= or *=
        +			// The test attribute must be unknown in Opera but "safe" for WinRT
        +			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
        +			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
        +				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
        +			}
        +
        +			// Support: IE8
        +			// Boolean attributes and "value" are not treated correctly
        +			if ( !el.querySelectorAll("[selected]").length ) {
        +				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
        +			}
        +
        +			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
        +			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
        +				rbuggyQSA.push("~=");
        +			}
        +
        +			// Webkit/Opera - :checked should return selected option elements
        +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +			// IE8 throws error here and will not see later tests
        +			if ( !el.querySelectorAll(":checked").length ) {
        +				rbuggyQSA.push(":checked");
        +			}
        +
        +			// Support: Safari 8+, iOS 8+
        +			// https://bugs.webkit.org/show_bug.cgi?id=136851
        +			// In-page `selector#id sibling-combinator selector` fails
        +			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
        +				rbuggyQSA.push(".#.+[+~]");
        +			}
        +		});
        +
        +		assert(function( el ) {
        +			el.innerHTML = "<a href='' disabled='disabled'></a>" +
        +				"<select disabled='disabled'><option/></select>";
        +
        +			// Support: Windows 8 Native Apps
        +			// The type and name attributes are restricted during .innerHTML assignment
        +			var input = document.createElement("input");
        +			input.setAttribute( "type", "hidden" );
        +			el.appendChild( input ).setAttribute( "name", "D" );
        +
        +			// Support: IE8
        +			// Enforce case-sensitivity of name attribute
        +			if ( el.querySelectorAll("[name=d]").length ) {
        +				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
        +			}
        +
        +			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
        +			// IE8 throws error here and will not see later tests
        +			if ( el.querySelectorAll(":enabled").length !== 2 ) {
        +				rbuggyQSA.push( ":enabled", ":disabled" );
        +			}
        +
        +			// Support: IE9-11+
        +			// IE's :disabled selector does not pick up the children of disabled fieldsets
        +			docElem.appendChild( el ).disabled = true;
        +			if ( el.querySelectorAll(":disabled").length !== 2 ) {
        +				rbuggyQSA.push( ":enabled", ":disabled" );
        +			}
        +
        +			// Opera 10-11 does not throw on post-comma invalid pseudos
        +			el.querySelectorAll("*,:x");
        +			rbuggyQSA.push(",.*:");
        +		});
        +	}
        +
        +	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
        +		docElem.webkitMatchesSelector ||
        +		docElem.mozMatchesSelector ||
        +		docElem.oMatchesSelector ||
        +		docElem.msMatchesSelector) )) ) {
        +
        +		assert(function( el ) {
        +			// Check to see if it's possible to do matchesSelector
        +			// on a disconnected node (IE 9)
        +			support.disconnectedMatch = matches.call( el, "*" );
        +
        +			// This should fail with an exception
        +			// Gecko does not error, returns false instead
        +			matches.call( el, "[s!='']:x" );
        +			rbuggyMatches.push( "!=", pseudos );
        +		});
        +	}
        +
        +	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
        +	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
        +
        +	/* Contains
        +	---------------------------------------------------------------------- */
        +	hasCompare = rnative.test( docElem.compareDocumentPosition );
        +
        +	// Element contains another
        +	// Purposefully self-exclusive
        +	// As in, an element does not contain itself
        +	contains = hasCompare || rnative.test( docElem.contains ) ?
        +		function( a, b ) {
        +			var adown = a.nodeType === 9 ? a.documentElement : a,
        +				bup = b && b.parentNode;
        +			return a === bup || !!( bup && bup.nodeType === 1 && (
        +				adown.contains ?
        +					adown.contains( bup ) :
        +					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
        +			));
        +		} :
        +		function( a, b ) {
        +			if ( b ) {
        +				while ( (b = b.parentNode) ) {
        +					if ( b === a ) {
        +						return true;
        +					}
        +				}
        +			}
        +			return false;
        +		};
        +
        +	/* Sorting
        +	---------------------------------------------------------------------- */
        +
        +	// Document order sorting
        +	sortOrder = hasCompare ?
        +	function( a, b ) {
        +
        +		// Flag for duplicate removal
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +		}
        +
        +		// Sort on method existence if only one input has compareDocumentPosition
        +		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
        +		if ( compare ) {
        +			return compare;
        +		}
        +
        +		// Calculate position if both inputs belong to the same document
        +		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
        +			a.compareDocumentPosition( b ) :
        +
        +			// Otherwise we know they are disconnected
        +			1;
        +
        +		// Disconnected nodes
        +		if ( compare & 1 ||
        +			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
        +
        +			// Choose the first element that is related to our preferred document
        +			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
        +				return -1;
        +			}
        +			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
        +				return 1;
        +			}
        +
        +			// Maintain original order
        +			return sortInput ?
        +				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
        +				0;
        +		}
        +
        +		return compare & 4 ? -1 : 1;
        +	} :
        +	function( a, b ) {
        +		// Exit early if the nodes are identical
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +		}
        +
        +		var cur,
        +			i = 0,
        +			aup = a.parentNode,
        +			bup = b.parentNode,
        +			ap = [ a ],
        +			bp = [ b ];
        +
        +		// Parentless nodes are either documents or disconnected
        +		if ( !aup || !bup ) {
        +			return a === document ? -1 :
        +				b === document ? 1 :
        +				aup ? -1 :
        +				bup ? 1 :
        +				sortInput ?
        +				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
        +				0;
        +
        +		// If the nodes are siblings, we can do a quick check
        +		} else if ( aup === bup ) {
        +			return siblingCheck( a, b );
        +		}
        +
        +		// Otherwise we need full lists of their ancestors for comparison
        +		cur = a;
        +		while ( (cur = cur.parentNode) ) {
        +			ap.unshift( cur );
        +		}
        +		cur = b;
        +		while ( (cur = cur.parentNode) ) {
        +			bp.unshift( cur );
        +		}
        +
        +		// Walk down the tree looking for a discrepancy
        +		while ( ap[i] === bp[i] ) {
        +			i++;
        +		}
        +
        +		return i ?
        +			// Do a sibling check if the nodes have a common ancestor
        +			siblingCheck( ap[i], bp[i] ) :
        +
        +			// Otherwise nodes in our document sort first
        +			ap[i] === preferredDoc ? -1 :
        +			bp[i] === preferredDoc ? 1 :
        +			0;
        +	};
        +
        +	return document;
        +};
        +
        +Sizzle.matches = function( expr, elements ) {
        +	return Sizzle( expr, null, null, elements );
        +};
        +
        +Sizzle.matchesSelector = function( elem, expr ) {
        +	// Set document vars if needed
        +	if ( ( elem.ownerDocument || elem ) !== document ) {
        +		setDocument( elem );
        +	}
        +
        +	// Make sure that attribute selectors are quoted
        +	expr = expr.replace( rattributeQuotes, "='$1']" );
        +
        +	if ( support.matchesSelector && documentIsHTML &&
        +		!compilerCache[ expr + " " ] &&
        +		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
        +		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
        +
        +		try {
        +			var ret = matches.call( elem, expr );
        +
        +			// IE 9's matchesSelector returns false on disconnected nodes
        +			if ( ret || support.disconnectedMatch ||
        +					// As well, disconnected nodes are said to be in a document
        +					// fragment in IE 9
        +					elem.document && elem.document.nodeType !== 11 ) {
        +				return ret;
        +			}
        +		} catch (e) {}
        +	}
        +
        +	return Sizzle( expr, document, null, [ elem ] ).length > 0;
        +};
        +
        +Sizzle.contains = function( context, elem ) {
        +	// Set document vars if needed
        +	if ( ( context.ownerDocument || context ) !== document ) {
        +		setDocument( context );
        +	}
        +	return contains( context, elem );
        +};
        +
        +Sizzle.attr = function( elem, name ) {
        +	// Set document vars if needed
        +	if ( ( elem.ownerDocument || elem ) !== document ) {
        +		setDocument( elem );
        +	}
        +
        +	var fn = Expr.attrHandle[ name.toLowerCase() ],
        +		// Don't get fooled by Object.prototype properties (jQuery #13807)
        +		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
        +			fn( elem, name, !documentIsHTML ) :
        +			undefined;
        +
        +	return val !== undefined ?
        +		val :
        +		support.attributes || !documentIsHTML ?
        +			elem.getAttribute( name ) :
        +			(val = elem.getAttributeNode(name)) && val.specified ?
        +				val.value :
        +				null;
        +};
        +
        +Sizzle.escape = function( sel ) {
        +	return (sel + "").replace( rcssescape, fcssescape );
        +};
        +
        +Sizzle.error = function( msg ) {
        +	throw new Error( "Syntax error, unrecognized expression: " + msg );
        +};
        +
        +/**
        + * Document sorting and removing duplicates
        + * @param {ArrayLike} results
        + */
        +Sizzle.uniqueSort = function( results ) {
        +	var elem,
        +		duplicates = [],
        +		j = 0,
        +		i = 0;
        +
        +	// Unless we *know* we can detect duplicates, assume their presence
        +	hasDuplicate = !support.detectDuplicates;
        +	sortInput = !support.sortStable && results.slice( 0 );
        +	results.sort( sortOrder );
        +
        +	if ( hasDuplicate ) {
        +		while ( (elem = results[i++]) ) {
        +			if ( elem === results[ i ] ) {
        +				j = duplicates.push( i );
        +			}
        +		}
        +		while ( j-- ) {
        +			results.splice( duplicates[ j ], 1 );
        +		}
        +	}
        +
        +	// Clear input after sorting to release objects
        +	// See https://github.com/jquery/sizzle/pull/225
        +	sortInput = null;
        +
        +	return results;
        +};
        +
        +/**
        + * Utility function for retrieving the text value of an array of DOM nodes
        + * @param {Array|Element} elem
        + */
        +getText = Sizzle.getText = function( elem ) {
        +	var node,
        +		ret = "",
        +		i = 0,
        +		nodeType = elem.nodeType;
        +
        +	if ( !nodeType ) {
        +		// If no nodeType, this is expected to be an array
        +		while ( (node = elem[i++]) ) {
        +			// Do not traverse comment nodes
        +			ret += getText( node );
        +		}
        +	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +		// Use textContent for elements
        +		// innerText usage removed for consistency of new lines (jQuery #11153)
        +		if ( typeof elem.textContent === "string" ) {
        +			return elem.textContent;
        +		} else {
        +			// Traverse its children
        +			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +				ret += getText( elem );
        +			}
        +		}
        +	} else if ( nodeType === 3 || nodeType === 4 ) {
        +		return elem.nodeValue;
        +	}
        +	// Do not include comment or processing instruction nodes
        +
        +	return ret;
        +};
        +
        +Expr = Sizzle.selectors = {
        +
        +	// Can be adjusted by the user
        +	cacheLength: 50,
        +
        +	createPseudo: markFunction,
        +
        +	match: matchExpr,
        +
        +	attrHandle: {},
        +
        +	find: {},
        +
        +	relative: {
        +		">": { dir: "parentNode", first: true },
        +		" ": { dir: "parentNode" },
        +		"+": { dir: "previousSibling", first: true },
        +		"~": { dir: "previousSibling" }
        +	},
        +
        +	preFilter: {
        +		"ATTR": function( match ) {
        +			match[1] = match[1].replace( runescape, funescape );
        +
        +			// Move the given value to match[3] whether quoted or unquoted
        +			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
        +
        +			if ( match[2] === "~=" ) {
        +				match[3] = " " + match[3] + " ";
        +			}
        +
        +			return match.slice( 0, 4 );
        +		},
        +
        +		"CHILD": function( match ) {
        +			/* matches from matchExpr["CHILD"]
        +				1 type (only|nth|...)
        +				2 what (child|of-type)
        +				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
        +				4 xn-component of xn+y argument ([+-]?\d*n|)
        +				5 sign of xn-component
        +				6 x of xn-component
        +				7 sign of y-component
        +				8 y of y-component
        +			*/
        +			match[1] = match[1].toLowerCase();
        +
        +			if ( match[1].slice( 0, 3 ) === "nth" ) {
        +				// nth-* requires argument
        +				if ( !match[3] ) {
        +					Sizzle.error( match[0] );
        +				}
        +
        +				// numeric x and y parameters for Expr.filter.CHILD
        +				// remember that false/true cast respectively to 0/1
        +				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
        +				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
        +
        +			// other types prohibit arguments
        +			} else if ( match[3] ) {
        +				Sizzle.error( match[0] );
        +			}
        +
        +			return match;
        +		},
        +
        +		"PSEUDO": function( match ) {
        +			var excess,
        +				unquoted = !match[6] && match[2];
        +
        +			if ( matchExpr["CHILD"].test( match[0] ) ) {
        +				return null;
        +			}
        +
        +			// Accept quoted arguments as-is
        +			if ( match[3] ) {
        +				match[2] = match[4] || match[5] || "";
        +
        +			// Strip excess characters from unquoted arguments
        +			} else if ( unquoted && rpseudo.test( unquoted ) &&
        +				// Get excess from tokenize (recursively)
        +				(excess = tokenize( unquoted, true )) &&
        +				// advance to the next closing parenthesis
        +				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
        +
        +				// excess is a negative index
        +				match[0] = match[0].slice( 0, excess );
        +				match[2] = unquoted.slice( 0, excess );
        +			}
        +
        +			// Return only captures needed by the pseudo filter method (type and argument)
        +			return match.slice( 0, 3 );
        +		}
        +	},
        +
        +	filter: {
        +
        +		"TAG": function( nodeNameSelector ) {
        +			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
        +			return nodeNameSelector === "*" ?
        +				function() { return true; } :
        +				function( elem ) {
        +					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
        +				};
        +		},
        +
        +		"CLASS": function( className ) {
        +			var pattern = classCache[ className + " " ];
        +
        +			return pattern ||
        +				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
        +				classCache( className, function( elem ) {
        +					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
        +				});
        +		},
        +
        +		"ATTR": function( name, operator, check ) {
        +			return function( elem ) {
        +				var result = Sizzle.attr( elem, name );
        +
        +				if ( result == null ) {
        +					return operator === "!=";
        +				}
        +				if ( !operator ) {
        +					return true;
        +				}
        +
        +				result += "";
        +
        +				return operator === "=" ? result === check :
        +					operator === "!=" ? result !== check :
        +					operator === "^=" ? check && result.indexOf( check ) === 0 :
        +					operator === "*=" ? check && result.indexOf( check ) > -1 :
        +					operator === "$=" ? check && result.slice( -check.length ) === check :
        +					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
        +					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
        +					false;
        +			};
        +		},
        +
        +		"CHILD": function( type, what, argument, first, last ) {
        +			var simple = type.slice( 0, 3 ) !== "nth",
        +				forward = type.slice( -4 ) !== "last",
        +				ofType = what === "of-type";
        +
        +			return first === 1 && last === 0 ?
        +
        +				// Shortcut for :nth-*(n)
        +				function( elem ) {
        +					return !!elem.parentNode;
        +				} :
        +
        +				function( elem, context, xml ) {
        +					var cache, uniqueCache, outerCache, node, nodeIndex, start,
        +						dir = simple !== forward ? "nextSibling" : "previousSibling",
        +						parent = elem.parentNode,
        +						name = ofType && elem.nodeName.toLowerCase(),
        +						useCache = !xml && !ofType,
        +						diff = false;
        +
        +					if ( parent ) {
        +
        +						// :(first|last|only)-(child|of-type)
        +						if ( simple ) {
        +							while ( dir ) {
        +								node = elem;
        +								while ( (node = node[ dir ]) ) {
        +									if ( ofType ?
        +										node.nodeName.toLowerCase() === name :
        +										node.nodeType === 1 ) {
        +
        +										return false;
        +									}
        +								}
        +								// Reverse direction for :only-* (if we haven't yet done so)
        +								start = dir = type === "only" && !start && "nextSibling";
        +							}
        +							return true;
        +						}
        +
        +						start = [ forward ? parent.firstChild : parent.lastChild ];
        +
        +						// non-xml :nth-child(...) stores cache data on `parent`
        +						if ( forward && useCache ) {
        +
        +							// Seek `elem` from a previously-cached index
        +
        +							// ...in a gzip-friendly way
        +							node = parent;
        +							outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +							// Support: IE <9 only
        +							// Defend against cloned attroperties (jQuery gh-1709)
        +							uniqueCache = outerCache[ node.uniqueID ] ||
        +								(outerCache[ node.uniqueID ] = {});
        +
        +							cache = uniqueCache[ type ] || [];
        +							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
        +							diff = nodeIndex && cache[ 2 ];
        +							node = nodeIndex && parent.childNodes[ nodeIndex ];
        +
        +							while ( (node = ++nodeIndex && node && node[ dir ] ||
        +
        +								// Fallback to seeking `elem` from the start
        +								(diff = nodeIndex = 0) || start.pop()) ) {
        +
        +								// When found, cache indexes on `parent` and break
        +								if ( node.nodeType === 1 && ++diff && node === elem ) {
        +									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
        +									break;
        +								}
        +							}
        +
        +						} else {
        +							// Use previously-cached element index if available
        +							if ( useCache ) {
        +								// ...in a gzip-friendly way
        +								node = elem;
        +								outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +								// Support: IE <9 only
        +								// Defend against cloned attroperties (jQuery gh-1709)
        +								uniqueCache = outerCache[ node.uniqueID ] ||
        +									(outerCache[ node.uniqueID ] = {});
        +
        +								cache = uniqueCache[ type ] || [];
        +								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
        +								diff = nodeIndex;
        +							}
        +
        +							// xml :nth-child(...)
        +							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
        +							if ( diff === false ) {
        +								// Use the same loop as above to seek `elem` from the start
        +								while ( (node = ++nodeIndex && node && node[ dir ] ||
        +									(diff = nodeIndex = 0) || start.pop()) ) {
        +
        +									if ( ( ofType ?
        +										node.nodeName.toLowerCase() === name :
        +										node.nodeType === 1 ) &&
        +										++diff ) {
        +
        +										// Cache the index of each encountered element
        +										if ( useCache ) {
        +											outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +											// Support: IE <9 only
        +											// Defend against cloned attroperties (jQuery gh-1709)
        +											uniqueCache = outerCache[ node.uniqueID ] ||
        +												(outerCache[ node.uniqueID ] = {});
        +
        +											uniqueCache[ type ] = [ dirruns, diff ];
        +										}
        +
        +										if ( node === elem ) {
        +											break;
        +										}
        +									}
        +								}
        +							}
        +						}
        +
        +						// Incorporate the offset, then check against cycle size
        +						diff -= last;
        +						return diff === first || ( diff % first === 0 && diff / first >= 0 );
        +					}
        +				};
        +		},
        +
        +		"PSEUDO": function( pseudo, argument ) {
        +			// pseudo-class names are case-insensitive
        +			// http://www.w3.org/TR/selectors/#pseudo-classes
        +			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
        +			// Remember that setFilters inherits from pseudos
        +			var args,
        +				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
        +					Sizzle.error( "unsupported pseudo: " + pseudo );
        +
        +			// The user may use createPseudo to indicate that
        +			// arguments are needed to create the filter function
        +			// just as Sizzle does
        +			if ( fn[ expando ] ) {
        +				return fn( argument );
        +			}
        +
        +			// But maintain support for old signatures
        +			if ( fn.length > 1 ) {
        +				args = [ pseudo, pseudo, "", argument ];
        +				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
        +					markFunction(function( seed, matches ) {
        +						var idx,
        +							matched = fn( seed, argument ),
        +							i = matched.length;
        +						while ( i-- ) {
        +							idx = indexOf( seed, matched[i] );
        +							seed[ idx ] = !( matches[ idx ] = matched[i] );
        +						}
        +					}) :
        +					function( elem ) {
        +						return fn( elem, 0, args );
        +					};
        +			}
        +
        +			return fn;
        +		}
        +	},
        +
        +	pseudos: {
        +		// Potentially complex pseudos
        +		"not": markFunction(function( selector ) {
        +			// Trim the selector passed to compile
        +			// to avoid treating leading and trailing
        +			// spaces as combinators
        +			var input = [],
        +				results = [],
        +				matcher = compile( selector.replace( rtrim, "$1" ) );
        +
        +			return matcher[ expando ] ?
        +				markFunction(function( seed, matches, context, xml ) {
        +					var elem,
        +						unmatched = matcher( seed, null, xml, [] ),
        +						i = seed.length;
        +
        +					// Match elements unmatched by `matcher`
        +					while ( i-- ) {
        +						if ( (elem = unmatched[i]) ) {
        +							seed[i] = !(matches[i] = elem);
        +						}
        +					}
        +				}) :
        +				function( elem, context, xml ) {
        +					input[0] = elem;
        +					matcher( input, null, xml, results );
        +					// Don't keep the element (issue #299)
        +					input[0] = null;
        +					return !results.pop();
        +				};
        +		}),
        +
        +		"has": markFunction(function( selector ) {
        +			return function( elem ) {
        +				return Sizzle( selector, elem ).length > 0;
        +			};
        +		}),
        +
        +		"contains": markFunction(function( text ) {
        +			text = text.replace( runescape, funescape );
        +			return function( elem ) {
        +				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
        +			};
        +		}),
        +
        +		// "Whether an element is represented by a :lang() selector
        +		// is based solely on the element's language value
        +		// being equal to the identifier C,
        +		// or beginning with the identifier C immediately followed by "-".
        +		// The matching of C against the element's language value is performed case-insensitively.
        +		// The identifier C does not have to be a valid language name."
        +		// http://www.w3.org/TR/selectors/#lang-pseudo
        +		"lang": markFunction( function( lang ) {
        +			// lang value must be a valid identifier
        +			if ( !ridentifier.test(lang || "") ) {
        +				Sizzle.error( "unsupported lang: " + lang );
        +			}
        +			lang = lang.replace( runescape, funescape ).toLowerCase();
        +			return function( elem ) {
        +				var elemLang;
        +				do {
        +					if ( (elemLang = documentIsHTML ?
        +						elem.lang :
        +						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
        +
        +						elemLang = elemLang.toLowerCase();
        +						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
        +					}
        +				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
        +				return false;
        +			};
        +		}),
        +
        +		// Miscellaneous
        +		"target": function( elem ) {
        +			var hash = window.location && window.location.hash;
        +			return hash && hash.slice( 1 ) === elem.id;
        +		},
        +
        +		"root": function( elem ) {
        +			return elem === docElem;
        +		},
        +
        +		"focus": function( elem ) {
        +			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
        +		},
        +
        +		// Boolean properties
        +		"enabled": createDisabledPseudo( false ),
        +		"disabled": createDisabledPseudo( true ),
        +
        +		"checked": function( elem ) {
        +			// In CSS3, :checked should return both checked and selected elements
        +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +			var nodeName = elem.nodeName.toLowerCase();
        +			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
        +		},
        +
        +		"selected": function( elem ) {
        +			// Accessing this property makes selected-by-default
        +			// options in Safari work properly
        +			if ( elem.parentNode ) {
        +				elem.parentNode.selectedIndex;
        +			}
        +
        +			return elem.selected === true;
        +		},
        +
        +		// Contents
        +		"empty": function( elem ) {
        +			// http://www.w3.org/TR/selectors/#empty-pseudo
        +			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
        +			//   but not by others (comment: 8; processing instruction: 7; etc.)
        +			// nodeType < 6 works because attributes (2) do not appear as children
        +			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +				if ( elem.nodeType < 6 ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		},
        +
        +		"parent": function( elem ) {
        +			return !Expr.pseudos["empty"]( elem );
        +		},
        +
        +		// Element/input types
        +		"header": function( elem ) {
        +			return rheader.test( elem.nodeName );
        +		},
        +
        +		"input": function( elem ) {
        +			return rinputs.test( elem.nodeName );
        +		},
        +
        +		"button": function( elem ) {
        +			var name = elem.nodeName.toLowerCase();
        +			return name === "input" && elem.type === "button" || name === "button";
        +		},
        +
        +		"text": function( elem ) {
        +			var attr;
        +			return elem.nodeName.toLowerCase() === "input" &&
        +				elem.type === "text" &&
        +
        +				// Support: IE<8
        +				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
        +				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
        +		},
        +
        +		// Position-in-collection
        +		"first": createPositionalPseudo(function() {
        +			return [ 0 ];
        +		}),
        +
        +		"last": createPositionalPseudo(function( matchIndexes, length ) {
        +			return [ length - 1 ];
        +		}),
        +
        +		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			return [ argument < 0 ? argument + length : argument ];
        +		}),
        +
        +		"even": createPositionalPseudo(function( matchIndexes, length ) {
        +			var i = 0;
        +			for ( ; i < length; i += 2 ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"odd": createPositionalPseudo(function( matchIndexes, length ) {
        +			var i = 1;
        +			for ( ; i < length; i += 2 ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			var i = argument < 0 ? argument + length : argument;
        +			for ( ; --i >= 0; ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			var i = argument < 0 ? argument + length : argument;
        +			for ( ; ++i < length; ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		})
        +	}
        +};
        +
        +Expr.pseudos["nth"] = Expr.pseudos["eq"];
        +
        +// Add button/input type pseudos
        +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
        +	Expr.pseudos[ i ] = createInputPseudo( i );
        +}
        +for ( i in { submit: true, reset: true } ) {
        +	Expr.pseudos[ i ] = createButtonPseudo( i );
        +}
        +
        +// Easy API for creating new setFilters
        +function setFilters() {}
        +setFilters.prototype = Expr.filters = Expr.pseudos;
        +Expr.setFilters = new setFilters();
        +
        +tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
        +	var matched, match, tokens, type,
        +		soFar, groups, preFilters,
        +		cached = tokenCache[ selector + " " ];
        +
        +	if ( cached ) {
        +		return parseOnly ? 0 : cached.slice( 0 );
        +	}
        +
        +	soFar = selector;
        +	groups = [];
        +	preFilters = Expr.preFilter;
        +
        +	while ( soFar ) {
        +
        +		// Comma and first run
        +		if ( !matched || (match = rcomma.exec( soFar )) ) {
        +			if ( match ) {
        +				// Don't consume trailing commas as valid
        +				soFar = soFar.slice( match[0].length ) || soFar;
        +			}
        +			groups.push( (tokens = []) );
        +		}
        +
        +		matched = false;
        +
        +		// Combinators
        +		if ( (match = rcombinators.exec( soFar )) ) {
        +			matched = match.shift();
        +			tokens.push({
        +				value: matched,
        +				// Cast descendant combinators to space
        +				type: match[0].replace( rtrim, " " )
        +			});
        +			soFar = soFar.slice( matched.length );
        +		}
        +
        +		// Filters
        +		for ( type in Expr.filter ) {
        +			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
        +				(match = preFilters[ type ]( match ))) ) {
        +				matched = match.shift();
        +				tokens.push({
        +					value: matched,
        +					type: type,
        +					matches: match
        +				});
        +				soFar = soFar.slice( matched.length );
        +			}
        +		}
        +
        +		if ( !matched ) {
        +			break;
        +		}
        +	}
        +
        +	// Return the length of the invalid excess
        +	// if we're just parsing
        +	// Otherwise, throw an error or return tokens
        +	return parseOnly ?
        +		soFar.length :
        +		soFar ?
        +			Sizzle.error( selector ) :
        +			// Cache the tokens
        +			tokenCache( selector, groups ).slice( 0 );
        +};
        +
        +function toSelector( tokens ) {
        +	var i = 0,
        +		len = tokens.length,
        +		selector = "";
        +	for ( ; i < len; i++ ) {
        +		selector += tokens[i].value;
        +	}
        +	return selector;
        +}
        +
        +function addCombinator( matcher, combinator, base ) {
        +	var dir = combinator.dir,
        +		skip = combinator.next,
        +		key = skip || dir,
        +		checkNonElements = base && key === "parentNode",
        +		doneName = done++;
        +
        +	return combinator.first ?
        +		// Check against closest ancestor/preceding element
        +		function( elem, context, xml ) {
        +			while ( (elem = elem[ dir ]) ) {
        +				if ( elem.nodeType === 1 || checkNonElements ) {
        +					return matcher( elem, context, xml );
        +				}
        +			}
        +			return false;
        +		} :
        +
        +		// Check against all ancestor/preceding elements
        +		function( elem, context, xml ) {
        +			var oldCache, uniqueCache, outerCache,
        +				newCache = [ dirruns, doneName ];
        +
        +			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
        +			if ( xml ) {
        +				while ( (elem = elem[ dir ]) ) {
        +					if ( elem.nodeType === 1 || checkNonElements ) {
        +						if ( matcher( elem, context, xml ) ) {
        +							return true;
        +						}
        +					}
        +				}
        +			} else {
        +				while ( (elem = elem[ dir ]) ) {
        +					if ( elem.nodeType === 1 || checkNonElements ) {
        +						outerCache = elem[ expando ] || (elem[ expando ] = {});
        +
        +						// Support: IE <9 only
        +						// Defend against cloned attroperties (jQuery gh-1709)
        +						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
        +
        +						if ( skip && skip === elem.nodeName.toLowerCase() ) {
        +							elem = elem[ dir ] || elem;
        +						} else if ( (oldCache = uniqueCache[ key ]) &&
        +							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
        +
        +							// Assign to newCache so results back-propagate to previous elements
        +							return (newCache[ 2 ] = oldCache[ 2 ]);
        +						} else {
        +							// Reuse newcache so results back-propagate to previous elements
        +							uniqueCache[ key ] = newCache;
        +
        +							// A match means we're done; a fail means we have to keep checking
        +							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
        +								return true;
        +							}
        +						}
        +					}
        +				}
        +			}
        +			return false;
        +		};
        +}
        +
        +function elementMatcher( matchers ) {
        +	return matchers.length > 1 ?
        +		function( elem, context, xml ) {
        +			var i = matchers.length;
        +			while ( i-- ) {
        +				if ( !matchers[i]( elem, context, xml ) ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		} :
        +		matchers[0];
        +}
        +
        +function multipleContexts( selector, contexts, results ) {
        +	var i = 0,
        +		len = contexts.length;
        +	for ( ; i < len; i++ ) {
        +		Sizzle( selector, contexts[i], results );
        +	}
        +	return results;
        +}
        +
        +function condense( unmatched, map, filter, context, xml ) {
        +	var elem,
        +		newUnmatched = [],
        +		i = 0,
        +		len = unmatched.length,
        +		mapped = map != null;
        +
        +	for ( ; i < len; i++ ) {
        +		if ( (elem = unmatched[i]) ) {
        +			if ( !filter || filter( elem, context, xml ) ) {
        +				newUnmatched.push( elem );
        +				if ( mapped ) {
        +					map.push( i );
        +				}
        +			}
        +		}
        +	}
        +
        +	return newUnmatched;
        +}
        +
        +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
        +	if ( postFilter && !postFilter[ expando ] ) {
        +		postFilter = setMatcher( postFilter );
        +	}
        +	if ( postFinder && !postFinder[ expando ] ) {
        +		postFinder = setMatcher( postFinder, postSelector );
        +	}
        +	return markFunction(function( seed, results, context, xml ) {
        +		var temp, i, elem,
        +			preMap = [],
        +			postMap = [],
        +			preexisting = results.length,
        +
        +			// Get initial elements from seed or context
        +			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
        +
        +			// Prefilter to get matcher input, preserving a map for seed-results synchronization
        +			matcherIn = preFilter && ( seed || !selector ) ?
        +				condense( elems, preMap, preFilter, context, xml ) :
        +				elems,
        +
        +			matcherOut = matcher ?
        +				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
        +				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
        +
        +					// ...intermediate processing is necessary
        +					[] :
        +
        +					// ...otherwise use results directly
        +					results :
        +				matcherIn;
        +
        +		// Find primary matches
        +		if ( matcher ) {
        +			matcher( matcherIn, matcherOut, context, xml );
        +		}
        +
        +		// Apply postFilter
        +		if ( postFilter ) {
        +			temp = condense( matcherOut, postMap );
        +			postFilter( temp, [], context, xml );
        +
        +			// Un-match failing elements by moving them back to matcherIn
        +			i = temp.length;
        +			while ( i-- ) {
        +				if ( (elem = temp[i]) ) {
        +					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
        +				}
        +			}
        +		}
        +
        +		if ( seed ) {
        +			if ( postFinder || preFilter ) {
        +				if ( postFinder ) {
        +					// Get the final matcherOut by condensing this intermediate into postFinder contexts
        +					temp = [];
        +					i = matcherOut.length;
        +					while ( i-- ) {
        +						if ( (elem = matcherOut[i]) ) {
        +							// Restore matcherIn since elem is not yet a final match
        +							temp.push( (matcherIn[i] = elem) );
        +						}
        +					}
        +					postFinder( null, (matcherOut = []), temp, xml );
        +				}
        +
        +				// Move matched elements from seed to results to keep them synchronized
        +				i = matcherOut.length;
        +				while ( i-- ) {
        +					if ( (elem = matcherOut[i]) &&
        +						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
        +
        +						seed[temp] = !(results[temp] = elem);
        +					}
        +				}
        +			}
        +
        +		// Add elements to results, through postFinder if defined
        +		} else {
        +			matcherOut = condense(
        +				matcherOut === results ?
        +					matcherOut.splice( preexisting, matcherOut.length ) :
        +					matcherOut
        +			);
        +			if ( postFinder ) {
        +				postFinder( null, results, matcherOut, xml );
        +			} else {
        +				push.apply( results, matcherOut );
        +			}
        +		}
        +	});
        +}
        +
        +function matcherFromTokens( tokens ) {
        +	var checkContext, matcher, j,
        +		len = tokens.length,
        +		leadingRelative = Expr.relative[ tokens[0].type ],
        +		implicitRelative = leadingRelative || Expr.relative[" "],
        +		i = leadingRelative ? 1 : 0,
        +
        +		// The foundational matcher ensures that elements are reachable from top-level context(s)
        +		matchContext = addCombinator( function( elem ) {
        +			return elem === checkContext;
        +		}, implicitRelative, true ),
        +		matchAnyContext = addCombinator( function( elem ) {
        +			return indexOf( checkContext, elem ) > -1;
        +		}, implicitRelative, true ),
        +		matchers = [ function( elem, context, xml ) {
        +			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
        +				(checkContext = context).nodeType ?
        +					matchContext( elem, context, xml ) :
        +					matchAnyContext( elem, context, xml ) );
        +			// Avoid hanging onto element (issue #299)
        +			checkContext = null;
        +			return ret;
        +		} ];
        +
        +	for ( ; i < len; i++ ) {
        +		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
        +			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
        +		} else {
        +			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
        +
        +			// Return special upon seeing a positional matcher
        +			if ( matcher[ expando ] ) {
        +				// Find the next relative operator (if any) for proper handling
        +				j = ++i;
        +				for ( ; j < len; j++ ) {
        +					if ( Expr.relative[ tokens[j].type ] ) {
        +						break;
        +					}
        +				}
        +				return setMatcher(
        +					i > 1 && elementMatcher( matchers ),
        +					i > 1 && toSelector(
        +						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
        +						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
        +					).replace( rtrim, "$1" ),
        +					matcher,
        +					i < j && matcherFromTokens( tokens.slice( i, j ) ),
        +					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
        +					j < len && toSelector( tokens )
        +				);
        +			}
        +			matchers.push( matcher );
        +		}
        +	}
        +
        +	return elementMatcher( matchers );
        +}
        +
        +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
        +	var bySet = setMatchers.length > 0,
        +		byElement = elementMatchers.length > 0,
        +		superMatcher = function( seed, context, xml, results, outermost ) {
        +			var elem, j, matcher,
        +				matchedCount = 0,
        +				i = "0",
        +				unmatched = seed && [],
        +				setMatched = [],
        +				contextBackup = outermostContext,
        +				// We must always have either seed elements or outermost context
        +				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
        +				// Use integer dirruns iff this is the outermost matcher
        +				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
        +				len = elems.length;
        +
        +			if ( outermost ) {
        +				outermostContext = context === document || context || outermost;
        +			}
        +
        +			// Add elements passing elementMatchers directly to results
        +			// Support: IE<9, Safari
        +			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
        +			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
        +				if ( byElement && elem ) {
        +					j = 0;
        +					if ( !context && elem.ownerDocument !== document ) {
        +						setDocument( elem );
        +						xml = !documentIsHTML;
        +					}
        +					while ( (matcher = elementMatchers[j++]) ) {
        +						if ( matcher( elem, context || document, xml) ) {
        +							results.push( elem );
        +							break;
        +						}
        +					}
        +					if ( outermost ) {
        +						dirruns = dirrunsUnique;
        +					}
        +				}
        +
        +				// Track unmatched elements for set filters
        +				if ( bySet ) {
        +					// They will have gone through all possible matchers
        +					if ( (elem = !matcher && elem) ) {
        +						matchedCount--;
        +					}
        +
        +					// Lengthen the array for every element, matched or not
        +					if ( seed ) {
        +						unmatched.push( elem );
        +					}
        +				}
        +			}
        +
        +			// `i` is now the count of elements visited above, and adding it to `matchedCount`
        +			// makes the latter nonnegative.
        +			matchedCount += i;
        +
        +			// Apply set filters to unmatched elements
        +			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
        +			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
        +			// no element matchers and no seed.
        +			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
        +			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
        +			// numerically zero.
        +			if ( bySet && i !== matchedCount ) {
        +				j = 0;
        +				while ( (matcher = setMatchers[j++]) ) {
        +					matcher( unmatched, setMatched, context, xml );
        +				}
        +
        +				if ( seed ) {
        +					// Reintegrate element matches to eliminate the need for sorting
        +					if ( matchedCount > 0 ) {
        +						while ( i-- ) {
        +							if ( !(unmatched[i] || setMatched[i]) ) {
        +								setMatched[i] = pop.call( results );
        +							}
        +						}
        +					}
        +
        +					// Discard index placeholder values to get only actual matches
        +					setMatched = condense( setMatched );
        +				}
        +
        +				// Add matches to results
        +				push.apply( results, setMatched );
        +
        +				// Seedless set matches succeeding multiple successful matchers stipulate sorting
        +				if ( outermost && !seed && setMatched.length > 0 &&
        +					( matchedCount + setMatchers.length ) > 1 ) {
        +
        +					Sizzle.uniqueSort( results );
        +				}
        +			}
        +
        +			// Override manipulation of globals by nested matchers
        +			if ( outermost ) {
        +				dirruns = dirrunsUnique;
        +				outermostContext = contextBackup;
        +			}
        +
        +			return unmatched;
        +		};
        +
        +	return bySet ?
        +		markFunction( superMatcher ) :
        +		superMatcher;
        +}
        +
        +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
        +	var i,
        +		setMatchers = [],
        +		elementMatchers = [],
        +		cached = compilerCache[ selector + " " ];
        +
        +	if ( !cached ) {
        +		// Generate a function of recursive functions that can be used to check each element
        +		if ( !match ) {
        +			match = tokenize( selector );
        +		}
        +		i = match.length;
        +		while ( i-- ) {
        +			cached = matcherFromTokens( match[i] );
        +			if ( cached[ expando ] ) {
        +				setMatchers.push( cached );
        +			} else {
        +				elementMatchers.push( cached );
        +			}
        +		}
        +
        +		// Cache the compiled function
        +		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
        +
        +		// Save selector and tokenization
        +		cached.selector = selector;
        +	}
        +	return cached;
        +};
        +
        +/**
        + * A low-level selection function that works with Sizzle's compiled
        + *  selector functions
        + * @param {String|Function} selector A selector or a pre-compiled
        + *  selector function built with Sizzle.compile
        + * @param {Element} context
        + * @param {Array} [results]
        + * @param {Array} [seed] A set of elements to match against
        + */
        +select = Sizzle.select = function( selector, context, results, seed ) {
        +	var i, tokens, token, type, find,
        +		compiled = typeof selector === "function" && selector,
        +		match = !seed && tokenize( (selector = compiled.selector || selector) );
        +
        +	results = results || [];
        +
        +	// Try to minimize operations if there is only one selector in the list and no seed
        +	// (the latter of which guarantees us context)
        +	if ( match.length === 1 ) {
        +
        +		// Reduce context if the leading compound selector is an ID
        +		tokens = match[0] = match[0].slice( 0 );
        +		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
        +				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
        +
        +			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
        +			if ( !context ) {
        +				return results;
        +
        +			// Precompiled matchers will still verify ancestry, so step up a level
        +			} else if ( compiled ) {
        +				context = context.parentNode;
        +			}
        +
        +			selector = selector.slice( tokens.shift().value.length );
        +		}
        +
        +		// Fetch a seed set for right-to-left matching
        +		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
        +		while ( i-- ) {
        +			token = tokens[i];
        +
        +			// Abort if we hit a combinator
        +			if ( Expr.relative[ (type = token.type) ] ) {
        +				break;
        +			}
        +			if ( (find = Expr.find[ type ]) ) {
        +				// Search, expanding context for leading sibling combinators
        +				if ( (seed = find(
        +					token.matches[0].replace( runescape, funescape ),
        +					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
        +				)) ) {
        +
        +					// If seed is empty or no tokens remain, we can return early
        +					tokens.splice( i, 1 );
        +					selector = seed.length && toSelector( tokens );
        +					if ( !selector ) {
        +						push.apply( results, seed );
        +						return results;
        +					}
        +
        +					break;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Compile and execute a filtering function if one is not provided
        +	// Provide `match` to avoid retokenization if we modified the selector above
        +	( compiled || compile( selector, match ) )(
        +		seed,
        +		context,
        +		!documentIsHTML,
        +		results,
        +		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
        +	);
        +	return results;
        +};
        +
        +// One-time assignments
        +
        +// Sort stability
        +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
        +
        +// Support: Chrome 14-35+
        +// Always assume duplicates if they aren't passed to the comparison function
        +support.detectDuplicates = !!hasDuplicate;
        +
        +// Initialize against the default document
        +setDocument();
        +
        +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
        +// Detached nodes confoundingly follow *each other*
        +support.sortDetached = assert(function( el ) {
        +	// Should return 1, but returns 4 (following)
        +	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
        +});
        +
        +// Support: IE<8
        +// Prevent attribute/property "interpolation"
        +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
        +if ( !assert(function( el ) {
        +	el.innerHTML = "<a href='#'></a>";
        +	return el.firstChild.getAttribute("href") === "#" ;
        +}) ) {
        +	addHandle( "type|href|height|width", function( elem, name, isXML ) {
        +		if ( !isXML ) {
        +			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
        +		}
        +	});
        +}
        +
        +// Support: IE<9
        +// Use defaultValue in place of getAttribute("value")
        +if ( !support.attributes || !assert(function( el ) {
        +	el.innerHTML = "<input/>";
        +	el.firstChild.setAttribute( "value", "" );
        +	return el.firstChild.getAttribute( "value" ) === "";
        +}) ) {
        +	addHandle( "value", function( elem, name, isXML ) {
        +		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
        +			return elem.defaultValue;
        +		}
        +	});
        +}
        +
        +// Support: IE<9
        +// Use getAttributeNode to fetch booleans when getAttribute lies
        +if ( !assert(function( el ) {
        +	return el.getAttribute("disabled") == null;
        +}) ) {
        +	addHandle( booleans, function( elem, name, isXML ) {
        +		var val;
        +		if ( !isXML ) {
        +			return elem[ name ] === true ? name.toLowerCase() :
        +					(val = elem.getAttributeNode( name )) && val.specified ?
        +					val.value :
        +				null;
        +		}
        +	});
        +}
        +
        +return Sizzle;
        +
        +})( window );
        +
        +
        +
        +jQuery.find = Sizzle;
        +jQuery.expr = Sizzle.selectors;
        +
        +// Deprecated
        +jQuery.expr[ ":" ] = jQuery.expr.pseudos;
        +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
        +jQuery.text = Sizzle.getText;
        +jQuery.isXMLDoc = Sizzle.isXML;
        +jQuery.contains = Sizzle.contains;
        +jQuery.escapeSelector = Sizzle.escape;
        +
        +
        +
        +
        +var dir = function( elem, dir, until ) {
        +	var matched = [],
        +		truncate = until !== undefined;
        +
        +	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
        +		if ( elem.nodeType === 1 ) {
        +			if ( truncate && jQuery( elem ).is( until ) ) {
        +				break;
        +			}
        +			matched.push( elem );
        +		}
        +	}
        +	return matched;
        +};
        +
        +
        +var siblings = function( n, elem ) {
        +	var matched = [];
        +
        +	for ( ; n; n = n.nextSibling ) {
        +		if ( n.nodeType === 1 && n !== elem ) {
        +			matched.push( n );
        +		}
        +	}
        +
        +	return matched;
        +};
        +
        +
        +var rneedsContext = jQuery.expr.match.needsContext;
        +
        +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
        +
        +
        +
        +var risSimple = /^.[^:#\[\.,]*$/;
        +
        +// Implement the identical functionality for filter and not
        +function winnow( elements, qualifier, not ) {
        +	if ( jQuery.isFunction( qualifier ) ) {
        +		return jQuery.grep( elements, function( elem, i ) {
        +			return !!qualifier.call( elem, i, elem ) !== not;
        +		} );
        +	}
        +
        +	// Single element
        +	if ( qualifier.nodeType ) {
        +		return jQuery.grep( elements, function( elem ) {
        +			return ( elem === qualifier ) !== not;
        +		} );
        +	}
        +
        +	// Arraylike of elements (jQuery, arguments, Array)
        +	if ( typeof qualifier !== "string" ) {
        +		return jQuery.grep( elements, function( elem ) {
        +			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
        +		} );
        +	}
        +
        +	// Simple selector that can be filtered directly, removing non-Elements
        +	if ( risSimple.test( qualifier ) ) {
        +		return jQuery.filter( qualifier, elements, not );
        +	}
        +
        +	// Complex selector, compare the two sets, removing non-Elements
        +	qualifier = jQuery.filter( qualifier, elements );
        +	return jQuery.grep( elements, function( elem ) {
        +		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
        +	} );
        +}
        +
        +jQuery.filter = function( expr, elems, not ) {
        +	var elem = elems[ 0 ];
        +
        +	if ( not ) {
        +		expr = ":not(" + expr + ")";
        +	}
        +
        +	if ( elems.length === 1 && elem.nodeType === 1 ) {
        +		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
        +	}
        +
        +	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
        +		return elem.nodeType === 1;
        +	} ) );
        +};
        +
        +jQuery.fn.extend( {
        +	find: function( selector ) {
        +		var i, ret,
        +			len = this.length,
        +			self = this;
        +
        +		if ( typeof selector !== "string" ) {
        +			return this.pushStack( jQuery( selector ).filter( function() {
        +				for ( i = 0; i < len; i++ ) {
        +					if ( jQuery.contains( self[ i ], this ) ) {
        +						return true;
        +					}
        +				}
        +			} ) );
        +		}
        +
        +		ret = this.pushStack( [] );
        +
        +		for ( i = 0; i < len; i++ ) {
        +			jQuery.find( selector, self[ i ], ret );
        +		}
        +
        +		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
        +	},
        +	filter: function( selector ) {
        +		return this.pushStack( winnow( this, selector || [], false ) );
        +	},
        +	not: function( selector ) {
        +		return this.pushStack( winnow( this, selector || [], true ) );
        +	},
        +	is: function( selector ) {
        +		return !!winnow(
        +			this,
        +
        +			// If this is a positional/relative selector, check membership in the returned set
        +			// so $("p:first").is("p:last") won't return true for a doc with two "p".
        +			typeof selector === "string" && rneedsContext.test( selector ) ?
        +				jQuery( selector ) :
        +				selector || [],
        +			false
        +		).length;
        +	}
        +} );
        +
        +
        +// Initialize a jQuery object
        +
        +
        +// A central reference to the root jQuery(document)
        +var rootjQuery,
        +
        +	// A simple way to check for HTML strings
        +	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        +	// Strict HTML recognition (#11290: must start with <)
        +	// Shortcut simple #id case for speed
        +	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
        +
        +	init = jQuery.fn.init = function( selector, context, root ) {
        +		var match, elem;
        +
        +		// HANDLE: $(""), $(null), $(undefined), $(false)
        +		if ( !selector ) {
        +			return this;
        +		}
        +
        +		// Method init() accepts an alternate rootjQuery
        +		// so migrate can support jQuery.sub (gh-2101)
        +		root = root || rootjQuery;
        +
        +		// Handle HTML strings
        +		if ( typeof selector === "string" ) {
        +			if ( selector[ 0 ] === "<" &&
        +				selector[ selector.length - 1 ] === ">" &&
        +				selector.length >= 3 ) {
        +
        +				// Assume that strings that start and end with <> are HTML and skip the regex check
        +				match = [ null, selector, null ];
        +
        +			} else {
        +				match = rquickExpr.exec( selector );
        +			}
        +
        +			// Match html or make sure no context is specified for #id
        +			if ( match && ( match[ 1 ] || !context ) ) {
        +
        +				// HANDLE: $(html) -> $(array)
        +				if ( match[ 1 ] ) {
        +					context = context instanceof jQuery ? context[ 0 ] : context;
        +
        +					// Option to run scripts is true for back-compat
        +					// Intentionally let the error be thrown if parseHTML is not present
        +					jQuery.merge( this, jQuery.parseHTML(
        +						match[ 1 ],
        +						context && context.nodeType ? context.ownerDocument || context : document,
        +						true
        +					) );
        +
        +					// HANDLE: $(html, props)
        +					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
        +						for ( match in context ) {
        +
        +							// Properties of context are called as methods if possible
        +							if ( jQuery.isFunction( this[ match ] ) ) {
        +								this[ match ]( context[ match ] );
        +
        +							// ...and otherwise set as attributes
        +							} else {
        +								this.attr( match, context[ match ] );
        +							}
        +						}
        +					}
        +
        +					return this;
        +
        +				// HANDLE: $(#id)
        +				} else {
        +					elem = document.getElementById( match[ 2 ] );
        +
        +					if ( elem ) {
        +
        +						// Inject the element directly into the jQuery object
        +						this[ 0 ] = elem;
        +						this.length = 1;
        +					}
        +					return this;
        +				}
        +
        +			// HANDLE: $(expr, $(...))
        +			} else if ( !context || context.jquery ) {
        +				return ( context || root ).find( selector );
        +
        +			// HANDLE: $(expr, context)
        +			// (which is just equivalent to: $(context).find(expr)
        +			} else {
        +				return this.constructor( context ).find( selector );
        +			}
        +
        +		// HANDLE: $(DOMElement)
        +		} else if ( selector.nodeType ) {
        +			this[ 0 ] = selector;
        +			this.length = 1;
        +			return this;
        +
        +		// HANDLE: $(function)
        +		// Shortcut for document ready
        +		} else if ( jQuery.isFunction( selector ) ) {
        +			return root.ready !== undefined ?
        +				root.ready( selector ) :
        +
        +				// Execute immediately if ready is not present
        +				selector( jQuery );
        +		}
        +
        +		return jQuery.makeArray( selector, this );
        +	};
        +
        +// Give the init function the jQuery prototype for later instantiation
        +init.prototype = jQuery.fn;
        +
        +// Initialize central reference
        +rootjQuery = jQuery( document );
        +
        +
        +var rparentsprev = /^(?:parents|prev(?:Until|All))/,
        +
        +	// Methods guaranteed to produce a unique set when starting from a unique set
        +	guaranteedUnique = {
        +		children: true,
        +		contents: true,
        +		next: true,
        +		prev: true
        +	};
        +
        +jQuery.fn.extend( {
        +	has: function( target ) {
        +		var targets = jQuery( target, this ),
        +			l = targets.length;
        +
        +		return this.filter( function() {
        +			var i = 0;
        +			for ( ; i < l; i++ ) {
        +				if ( jQuery.contains( this, targets[ i ] ) ) {
        +					return true;
        +				}
        +			}
        +		} );
        +	},
        +
        +	closest: function( selectors, context ) {
        +		var cur,
        +			i = 0,
        +			l = this.length,
        +			matched = [],
        +			targets = typeof selectors !== "string" && jQuery( selectors );
        +
        +		// Positional selectors never match, since there's no _selection_ context
        +		if ( !rneedsContext.test( selectors ) ) {
        +			for ( ; i < l; i++ ) {
        +				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
        +
        +					// Always skip document fragments
        +					if ( cur.nodeType < 11 && ( targets ?
        +						targets.index( cur ) > -1 :
        +
        +						// Don't pass non-elements to Sizzle
        +						cur.nodeType === 1 &&
        +							jQuery.find.matchesSelector( cur, selectors ) ) ) {
        +
        +						matched.push( cur );
        +						break;
        +					}
        +				}
        +			}
        +		}
        +
        +		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
        +	},
        +
        +	// Determine the position of an element within the set
        +	index: function( elem ) {
        +
        +		// No argument, return index in parent
        +		if ( !elem ) {
        +			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
        +		}
        +
        +		// Index in selector
        +		if ( typeof elem === "string" ) {
        +			return indexOf.call( jQuery( elem ), this[ 0 ] );
        +		}
        +
        +		// Locate the position of the desired element
        +		return indexOf.call( this,
        +
        +			// If it receives a jQuery object, the first element is used
        +			elem.jquery ? elem[ 0 ] : elem
        +		);
        +	},
        +
        +	add: function( selector, context ) {
        +		return this.pushStack(
        +			jQuery.uniqueSort(
        +				jQuery.merge( this.get(), jQuery( selector, context ) )
        +			)
        +		);
        +	},
        +
        +	addBack: function( selector ) {
        +		return this.add( selector == null ?
        +			this.prevObject : this.prevObject.filter( selector )
        +		);
        +	}
        +} );
        +
        +function sibling( cur, dir ) {
        +	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
        +	return cur;
        +}
        +
        +jQuery.each( {
        +	parent: function( elem ) {
        +		var parent = elem.parentNode;
        +		return parent && parent.nodeType !== 11 ? parent : null;
        +	},
        +	parents: function( elem ) {
        +		return dir( elem, "parentNode" );
        +	},
        +	parentsUntil: function( elem, i, until ) {
        +		return dir( elem, "parentNode", until );
        +	},
        +	next: function( elem ) {
        +		return sibling( elem, "nextSibling" );
        +	},
        +	prev: function( elem ) {
        +		return sibling( elem, "previousSibling" );
        +	},
        +	nextAll: function( elem ) {
        +		return dir( elem, "nextSibling" );
        +	},
        +	prevAll: function( elem ) {
        +		return dir( elem, "previousSibling" );
        +	},
        +	nextUntil: function( elem, i, until ) {
        +		return dir( elem, "nextSibling", until );
        +	},
        +	prevUntil: function( elem, i, until ) {
        +		return dir( elem, "previousSibling", until );
        +	},
        +	siblings: function( elem ) {
        +		return siblings( ( elem.parentNode || {} ).firstChild, elem );
        +	},
        +	children: function( elem ) {
        +		return siblings( elem.firstChild );
        +	},
        +	contents: function( elem ) {
        +		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
        +	}
        +}, function( name, fn ) {
        +	jQuery.fn[ name ] = function( until, selector ) {
        +		var matched = jQuery.map( this, fn, until );
        +
        +		if ( name.slice( -5 ) !== "Until" ) {
        +			selector = until;
        +		}
        +
        +		if ( selector && typeof selector === "string" ) {
        +			matched = jQuery.filter( selector, matched );
        +		}
        +
        +		if ( this.length > 1 ) {
        +
        +			// Remove duplicates
        +			if ( !guaranteedUnique[ name ] ) {
        +				jQuery.uniqueSort( matched );
        +			}
        +
        +			// Reverse order for parents* and prev-derivatives
        +			if ( rparentsprev.test( name ) ) {
        +				matched.reverse();
        +			}
        +		}
        +
        +		return this.pushStack( matched );
        +	};
        +} );
        +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
        +
        +
        +
        +// Convert String-formatted options into Object-formatted ones
        +function createOptions( options ) {
        +	var object = {};
        +	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
        +		object[ flag ] = true;
        +	} );
        +	return object;
        +}
        +
        +/*
        + * Create a callback list using the following parameters:
        + *
        + *	options: an optional list of space-separated options that will change how
        + *			the callback list behaves or a more traditional option object
        + *
        + * By default a callback list will act like an event callback list and can be
        + * "fired" multiple times.
        + *
        + * Possible options:
        + *
        + *	once:			will ensure the callback list can only be fired once (like a Deferred)
        + *
        + *	memory:			will keep track of previous values and will call any callback added
        + *					after the list has been fired right away with the latest "memorized"
        + *					values (like a Deferred)
        + *
        + *	unique:			will ensure a callback can only be added once (no duplicate in the list)
        + *
        + *	stopOnFalse:	interrupt callings when a callback returns false
        + *
        + */
        +jQuery.Callbacks = function( options ) {
        +
        +	// Convert options from String-formatted to Object-formatted if needed
        +	// (we check in cache first)
        +	options = typeof options === "string" ?
        +		createOptions( options ) :
        +		jQuery.extend( {}, options );
        +
        +	var // Flag to know if list is currently firing
        +		firing,
        +
        +		// Last fire value for non-forgettable lists
        +		memory,
        +
        +		// Flag to know if list was already fired
        +		fired,
        +
        +		// Flag to prevent firing
        +		locked,
        +
        +		// Actual callback list
        +		list = [],
        +
        +		// Queue of execution data for repeatable lists
        +		queue = [],
        +
        +		// Index of currently firing callback (modified by add/remove as needed)
        +		firingIndex = -1,
        +
        +		// Fire callbacks
        +		fire = function() {
        +
        +			// Enforce single-firing
        +			locked = options.once;
        +
        +			// Execute callbacks for all pending executions,
        +			// respecting firingIndex overrides and runtime changes
        +			fired = firing = true;
        +			for ( ; queue.length; firingIndex = -1 ) {
        +				memory = queue.shift();
        +				while ( ++firingIndex < list.length ) {
        +
        +					// Run callback and check for early termination
        +					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
        +						options.stopOnFalse ) {
        +
        +						// Jump to end and forget the data so .add doesn't re-fire
        +						firingIndex = list.length;
        +						memory = false;
        +					}
        +				}
        +			}
        +
        +			// Forget the data if we're done with it
        +			if ( !options.memory ) {
        +				memory = false;
        +			}
        +
        +			firing = false;
        +
        +			// Clean up if we're done firing for good
        +			if ( locked ) {
        +
        +				// Keep an empty list if we have data for future add calls
        +				if ( memory ) {
        +					list = [];
        +
        +				// Otherwise, this object is spent
        +				} else {
        +					list = "";
        +				}
        +			}
        +		},
        +
        +		// Actual Callbacks object
        +		self = {
        +
        +			// Add a callback or a collection of callbacks to the list
        +			add: function() {
        +				if ( list ) {
        +
        +					// If we have memory from a past run, we should fire after adding
        +					if ( memory && !firing ) {
        +						firingIndex = list.length - 1;
        +						queue.push( memory );
        +					}
        +
        +					( function add( args ) {
        +						jQuery.each( args, function( _, arg ) {
        +							if ( jQuery.isFunction( arg ) ) {
        +								if ( !options.unique || !self.has( arg ) ) {
        +									list.push( arg );
        +								}
        +							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
        +
        +								// Inspect recursively
        +								add( arg );
        +							}
        +						} );
        +					} )( arguments );
        +
        +					if ( memory && !firing ) {
        +						fire();
        +					}
        +				}
        +				return this;
        +			},
        +
        +			// Remove a callback from the list
        +			remove: function() {
        +				jQuery.each( arguments, function( _, arg ) {
        +					var index;
        +					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
        +						list.splice( index, 1 );
        +
        +						// Handle firing indexes
        +						if ( index <= firingIndex ) {
        +							firingIndex--;
        +						}
        +					}
        +				} );
        +				return this;
        +			},
        +
        +			// Check if a given callback is in the list.
        +			// If no argument is given, return whether or not list has callbacks attached.
        +			has: function( fn ) {
        +				return fn ?
        +					jQuery.inArray( fn, list ) > -1 :
        +					list.length > 0;
        +			},
        +
        +			// Remove all callbacks from the list
        +			empty: function() {
        +				if ( list ) {
        +					list = [];
        +				}
        +				return this;
        +			},
        +
        +			// Disable .fire and .add
        +			// Abort any current/pending executions
        +			// Clear all callbacks and values
        +			disable: function() {
        +				locked = queue = [];
        +				list = memory = "";
        +				return this;
        +			},
        +			disabled: function() {
        +				return !list;
        +			},
        +
        +			// Disable .fire
        +			// Also disable .add unless we have memory (since it would have no effect)
        +			// Abort any pending executions
        +			lock: function() {
        +				locked = queue = [];
        +				if ( !memory && !firing ) {
        +					list = memory = "";
        +				}
        +				return this;
        +			},
        +			locked: function() {
        +				return !!locked;
        +			},
        +
        +			// Call all callbacks with the given context and arguments
        +			fireWith: function( context, args ) {
        +				if ( !locked ) {
        +					args = args || [];
        +					args = [ context, args.slice ? args.slice() : args ];
        +					queue.push( args );
        +					if ( !firing ) {
        +						fire();
        +					}
        +				}
        +				return this;
        +			},
        +
        +			// Call all the callbacks with the given arguments
        +			fire: function() {
        +				self.fireWith( this, arguments );
        +				return this;
        +			},
        +
        +			// To know if the callbacks have already been called at least once
        +			fired: function() {
        +				return !!fired;
        +			}
        +		};
        +
        +	return self;
        +};
        +
        +
        +function Identity( v ) {
        +	return v;
        +}
        +function Thrower( ex ) {
        +	throw ex;
        +}
        +
        +function adoptValue( value, resolve, reject ) {
        +	var method;
        +
        +	try {
        +
        +		// Check for promise aspect first to privilege synchronous behavior
        +		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
        +			method.call( value ).done( resolve ).fail( reject );
        +
        +		// Other thenables
        +		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
        +			method.call( value, resolve, reject );
        +
        +		// Other non-thenables
        +		} else {
        +
        +			// Support: Android 4.0 only
        +			// Strict mode functions invoked without .call/.apply get global-object context
        +			resolve.call( undefined, value );
        +		}
        +
        +	// For Promises/A+, convert exceptions into rejections
        +	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
        +	// Deferred#then to conditionally suppress rejection.
        +	} catch ( value ) {
        +
        +		// Support: Android 4.0 only
        +		// Strict mode functions invoked without .call/.apply get global-object context
        +		reject.call( undefined, value );
        +	}
        +}
        +
        +jQuery.extend( {
        +
        +	Deferred: function( func ) {
        +		var tuples = [
        +
        +				// action, add listener, callbacks,
        +				// ... .then handlers, argument index, [final state]
        +				[ "notify", "progress", jQuery.Callbacks( "memory" ),
        +					jQuery.Callbacks( "memory" ), 2 ],
        +				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
        +					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
        +				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
        +					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
        +			],
        +			state = "pending",
        +			promise = {
        +				state: function() {
        +					return state;
        +				},
        +				always: function() {
        +					deferred.done( arguments ).fail( arguments );
        +					return this;
        +				},
        +				"catch": function( fn ) {
        +					return promise.then( null, fn );
        +				},
        +
        +				// Keep pipe for back-compat
        +				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
        +					var fns = arguments;
        +
        +					return jQuery.Deferred( function( newDefer ) {
        +						jQuery.each( tuples, function( i, tuple ) {
        +
        +							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
        +							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
        +
        +							// deferred.progress(function() { bind to newDefer or newDefer.notify })
        +							// deferred.done(function() { bind to newDefer or newDefer.resolve })
        +							// deferred.fail(function() { bind to newDefer or newDefer.reject })
        +							deferred[ tuple[ 1 ] ]( function() {
        +								var returned = fn && fn.apply( this, arguments );
        +								if ( returned && jQuery.isFunction( returned.promise ) ) {
        +									returned.promise()
        +										.progress( newDefer.notify )
        +										.done( newDefer.resolve )
        +										.fail( newDefer.reject );
        +								} else {
        +									newDefer[ tuple[ 0 ] + "With" ](
        +										this,
        +										fn ? [ returned ] : arguments
        +									);
        +								}
        +							} );
        +						} );
        +						fns = null;
        +					} ).promise();
        +				},
        +				then: function( onFulfilled, onRejected, onProgress ) {
        +					var maxDepth = 0;
        +					function resolve( depth, deferred, handler, special ) {
        +						return function() {
        +							var that = this,
        +								args = arguments,
        +								mightThrow = function() {
        +									var returned, then;
        +
        +									// Support: Promises/A+ section 2.3.3.3.3
        +									// https://promisesaplus.com/#point-59
        +									// Ignore double-resolution attempts
        +									if ( depth < maxDepth ) {
        +										return;
        +									}
        +
        +									returned = handler.apply( that, args );
        +
        +									// Support: Promises/A+ section 2.3.1
        +									// https://promisesaplus.com/#point-48
        +									if ( returned === deferred.promise() ) {
        +										throw new TypeError( "Thenable self-resolution" );
        +									}
        +
        +									// Support: Promises/A+ sections 2.3.3.1, 3.5
        +									// https://promisesaplus.com/#point-54
        +									// https://promisesaplus.com/#point-75
        +									// Retrieve `then` only once
        +									then = returned &&
        +
        +										// Support: Promises/A+ section 2.3.4
        +										// https://promisesaplus.com/#point-64
        +										// Only check objects and functions for thenability
        +										( typeof returned === "object" ||
        +											typeof returned === "function" ) &&
        +										returned.then;
        +
        +									// Handle a returned thenable
        +									if ( jQuery.isFunction( then ) ) {
        +
        +										// Special processors (notify) just wait for resolution
        +										if ( special ) {
        +											then.call(
        +												returned,
        +												resolve( maxDepth, deferred, Identity, special ),
        +												resolve( maxDepth, deferred, Thrower, special )
        +											);
        +
        +										// Normal processors (resolve) also hook into progress
        +										} else {
        +
        +											// ...and disregard older resolution values
        +											maxDepth++;
        +
        +											then.call(
        +												returned,
        +												resolve( maxDepth, deferred, Identity, special ),
        +												resolve( maxDepth, deferred, Thrower, special ),
        +												resolve( maxDepth, deferred, Identity,
        +													deferred.notifyWith )
        +											);
        +										}
        +
        +									// Handle all other returned values
        +									} else {
        +
        +										// Only substitute handlers pass on context
        +										// and multiple values (non-spec behavior)
        +										if ( handler !== Identity ) {
        +											that = undefined;
        +											args = [ returned ];
        +										}
        +
        +										// Process the value(s)
        +										// Default process is resolve
        +										( special || deferred.resolveWith )( that, args );
        +									}
        +								},
        +
        +								// Only normal processors (resolve) catch and reject exceptions
        +								process = special ?
        +									mightThrow :
        +									function() {
        +										try {
        +											mightThrow();
        +										} catch ( e ) {
        +
        +											if ( jQuery.Deferred.exceptionHook ) {
        +												jQuery.Deferred.exceptionHook( e,
        +													process.stackTrace );
        +											}
        +
        +											// Support: Promises/A+ section 2.3.3.3.4.1
        +											// https://promisesaplus.com/#point-61
        +											// Ignore post-resolution exceptions
        +											if ( depth + 1 >= maxDepth ) {
        +
        +												// Only substitute handlers pass on context
        +												// and multiple values (non-spec behavior)
        +												if ( handler !== Thrower ) {
        +													that = undefined;
        +													args = [ e ];
        +												}
        +
        +												deferred.rejectWith( that, args );
        +											}
        +										}
        +									};
        +
        +							// Support: Promises/A+ section 2.3.3.3.1
        +							// https://promisesaplus.com/#point-57
        +							// Re-resolve promises immediately to dodge false rejection from
        +							// subsequent errors
        +							if ( depth ) {
        +								process();
        +							} else {
        +
        +								// Call an optional hook to record the stack, in case of exception
        +								// since it's otherwise lost when execution goes async
        +								if ( jQuery.Deferred.getStackHook ) {
        +									process.stackTrace = jQuery.Deferred.getStackHook();
        +								}
        +								window.setTimeout( process );
        +							}
        +						};
        +					}
        +
        +					return jQuery.Deferred( function( newDefer ) {
        +
        +						// progress_handlers.add( ... )
        +						tuples[ 0 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onProgress ) ?
        +									onProgress :
        +									Identity,
        +								newDefer.notifyWith
        +							)
        +						);
        +
        +						// fulfilled_handlers.add( ... )
        +						tuples[ 1 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onFulfilled ) ?
        +									onFulfilled :
        +									Identity
        +							)
        +						);
        +
        +						// rejected_handlers.add( ... )
        +						tuples[ 2 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onRejected ) ?
        +									onRejected :
        +									Thrower
        +							)
        +						);
        +					} ).promise();
        +				},
        +
        +				// Get a promise for this deferred
        +				// If obj is provided, the promise aspect is added to the object
        +				promise: function( obj ) {
        +					return obj != null ? jQuery.extend( obj, promise ) : promise;
        +				}
        +			},
        +			deferred = {};
        +
        +		// Add list-specific methods
        +		jQuery.each( tuples, function( i, tuple ) {
        +			var list = tuple[ 2 ],
        +				stateString = tuple[ 5 ];
        +
        +			// promise.progress = list.add
        +			// promise.done = list.add
        +			// promise.fail = list.add
        +			promise[ tuple[ 1 ] ] = list.add;
        +
        +			// Handle state
        +			if ( stateString ) {
        +				list.add(
        +					function() {
        +
        +						// state = "resolved" (i.e., fulfilled)
        +						// state = "rejected"
        +						state = stateString;
        +					},
        +
        +					// rejected_callbacks.disable
        +					// fulfilled_callbacks.disable
        +					tuples[ 3 - i ][ 2 ].disable,
        +
        +					// progress_callbacks.lock
        +					tuples[ 0 ][ 2 ].lock
        +				);
        +			}
        +
        +			// progress_handlers.fire
        +			// fulfilled_handlers.fire
        +			// rejected_handlers.fire
        +			list.add( tuple[ 3 ].fire );
        +
        +			// deferred.notify = function() { deferred.notifyWith(...) }
        +			// deferred.resolve = function() { deferred.resolveWith(...) }
        +			// deferred.reject = function() { deferred.rejectWith(...) }
        +			deferred[ tuple[ 0 ] ] = function() {
        +				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
        +				return this;
        +			};
        +
        +			// deferred.notifyWith = list.fireWith
        +			// deferred.resolveWith = list.fireWith
        +			// deferred.rejectWith = list.fireWith
        +			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
        +		} );
        +
        +		// Make the deferred a promise
        +		promise.promise( deferred );
        +
        +		// Call given func if any
        +		if ( func ) {
        +			func.call( deferred, deferred );
        +		}
        +
        +		// All done!
        +		return deferred;
        +	},
        +
        +	// Deferred helper
        +	when: function( singleValue ) {
        +		var
        +
        +			// count of uncompleted subordinates
        +			remaining = arguments.length,
        +
        +			// count of unprocessed arguments
        +			i = remaining,
        +
        +			// subordinate fulfillment data
        +			resolveContexts = Array( i ),
        +			resolveValues = slice.call( arguments ),
        +
        +			// the master Deferred
        +			master = jQuery.Deferred(),
        +
        +			// subordinate callback factory
        +			updateFunc = function( i ) {
        +				return function( value ) {
        +					resolveContexts[ i ] = this;
        +					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
        +					if ( !( --remaining ) ) {
        +						master.resolveWith( resolveContexts, resolveValues );
        +					}
        +				};
        +			};
        +
        +		// Single- and empty arguments are adopted like Promise.resolve
        +		if ( remaining <= 1 ) {
        +			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
        +
        +			// Use .then() to unwrap secondary thenables (cf. gh-3000)
        +			if ( master.state() === "pending" ||
        +				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
        +
        +				return master.then();
        +			}
        +		}
        +
        +		// Multiple arguments are aggregated like Promise.all array elements
        +		while ( i-- ) {
        +			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
        +		}
        +
        +		return master.promise();
        +	}
        +} );
        +
        +
        +// These usually indicate a programmer mistake during development,
        +// warn about them ASAP rather than swallowing them by default.
        +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
        +
        +jQuery.Deferred.exceptionHook = function( error, stack ) {
        +
        +	// Support: IE 8 - 9 only
        +	// Console exists when dev tools are open, which can happen at any time
        +	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
        +		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
        +	}
        +};
        +
        +
        +
        +
        +jQuery.readyException = function( error ) {
        +	window.setTimeout( function() {
        +		throw error;
        +	} );
        +};
        +
        +
        +
        +
        +// The deferred used on DOM ready
        +var readyList = jQuery.Deferred();
        +
        +jQuery.fn.ready = function( fn ) {
        +
        +	readyList
        +		.then( fn )
        +
        +		// Wrap jQuery.readyException in a function so that the lookup
        +		// happens at the time of error handling instead of callback
        +		// registration.
        +		.catch( function( error ) {
        +			jQuery.readyException( error );
        +		} );
        +
        +	return this;
        +};
        +
        +jQuery.extend( {
        +
        +	// Is the DOM ready to be used? Set to true once it occurs.
        +	isReady: false,
        +
        +	// A counter to track how many items to wait for before
        +	// the ready event fires. See #6781
        +	readyWait: 1,
        +
        +	// Hold (or release) the ready event
        +	holdReady: function( hold ) {
        +		if ( hold ) {
        +			jQuery.readyWait++;
        +		} else {
        +			jQuery.ready( true );
        +		}
        +	},
        +
        +	// Handle when the DOM is ready
        +	ready: function( wait ) {
        +
        +		// Abort if there are pending holds or we're already ready
        +		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
        +			return;
        +		}
        +
        +		// Remember that the DOM is ready
        +		jQuery.isReady = true;
        +
        +		// If a normal DOM Ready event fired, decrement, and wait if need be
        +		if ( wait !== true && --jQuery.readyWait > 0 ) {
        +			return;
        +		}
        +
        +		// If there are functions bound, to execute
        +		readyList.resolveWith( document, [ jQuery ] );
        +	}
        +} );
        +
        +jQuery.ready.then = readyList.then;
        +
        +// The ready event handler and self cleanup method
        +function completed() {
        +	document.removeEventListener( "DOMContentLoaded", completed );
        +	window.removeEventListener( "load", completed );
        +	jQuery.ready();
        +}
        +
        +// Catch cases where $(document).ready() is called
        +// after the browser event has already occurred.
        +// Support: IE <=9 - 10 only
        +// Older IE sometimes signals "interactive" too soon
        +if ( document.readyState === "complete" ||
        +	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
        +
        +	// Handle it asynchronously to allow scripts the opportunity to delay ready
        +	window.setTimeout( jQuery.ready );
        +
        +} else {
        +
        +	// Use the handy event callback
        +	document.addEventListener( "DOMContentLoaded", completed );
        +
        +	// A fallback to window.onload, that will always work
        +	window.addEventListener( "load", completed );
        +}
        +
        +
        +
        +
        +// Multifunctional method to get and set values of a collection
        +// The value/s can optionally be executed if it's a function
        +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
        +	var i = 0,
        +		len = elems.length,
        +		bulk = key == null;
        +
        +	// Sets many values
        +	if ( jQuery.type( key ) === "object" ) {
        +		chainable = true;
        +		for ( i in key ) {
        +			access( elems, fn, i, key[ i ], true, emptyGet, raw );
        +		}
        +
        +	// Sets one value
        +	} else if ( value !== undefined ) {
        +		chainable = true;
        +
        +		if ( !jQuery.isFunction( value ) ) {
        +			raw = true;
        +		}
        +
        +		if ( bulk ) {
        +
        +			// Bulk operations run against the entire set
        +			if ( raw ) {
        +				fn.call( elems, value );
        +				fn = null;
        +
        +			// ...except when executing function values
        +			} else {
        +				bulk = fn;
        +				fn = function( elem, key, value ) {
        +					return bulk.call( jQuery( elem ), value );
        +				};
        +			}
        +		}
        +
        +		if ( fn ) {
        +			for ( ; i < len; i++ ) {
        +				fn(
        +					elems[ i ], key, raw ?
        +					value :
        +					value.call( elems[ i ], i, fn( elems[ i ], key ) )
        +				);
        +			}
        +		}
        +	}
        +
        +	if ( chainable ) {
        +		return elems;
        +	}
        +
        +	// Gets
        +	if ( bulk ) {
        +		return fn.call( elems );
        +	}
        +
        +	return len ? fn( elems[ 0 ], key ) : emptyGet;
        +};
        +var acceptData = function( owner ) {
        +
        +	// Accepts only:
        +	//  - Node
        +	//    - Node.ELEMENT_NODE
        +	//    - Node.DOCUMENT_NODE
        +	//  - Object
        +	//    - Any
        +	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
        +};
        +
        +
        +
        +
        +function Data() {
        +	this.expando = jQuery.expando + Data.uid++;
        +}
        +
        +Data.uid = 1;
        +
        +Data.prototype = {
        +
        +	cache: function( owner ) {
        +
        +		// Check if the owner object already has a cache
        +		var value = owner[ this.expando ];
        +
        +		// If not, create one
        +		if ( !value ) {
        +			value = {};
        +
        +			// We can accept data for non-element nodes in modern browsers,
        +			// but we should not, see #8335.
        +			// Always return an empty object.
        +			if ( acceptData( owner ) ) {
        +
        +				// If it is a node unlikely to be stringify-ed or looped over
        +				// use plain assignment
        +				if ( owner.nodeType ) {
        +					owner[ this.expando ] = value;
        +
        +				// Otherwise secure it in a non-enumerable property
        +				// configurable must be true to allow the property to be
        +				// deleted when data is removed
        +				} else {
        +					Object.defineProperty( owner, this.expando, {
        +						value: value,
        +						configurable: true
        +					} );
        +				}
        +			}
        +		}
        +
        +		return value;
        +	},
        +	set: function( owner, data, value ) {
        +		var prop,
        +			cache = this.cache( owner );
        +
        +		// Handle: [ owner, key, value ] args
        +		// Always use camelCase key (gh-2257)
        +		if ( typeof data === "string" ) {
        +			cache[ jQuery.camelCase( data ) ] = value;
        +
        +		// Handle: [ owner, { properties } ] args
        +		} else {
        +
        +			// Copy the properties one-by-one to the cache object
        +			for ( prop in data ) {
        +				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
        +			}
        +		}
        +		return cache;
        +	},
        +	get: function( owner, key ) {
        +		return key === undefined ?
        +			this.cache( owner ) :
        +
        +			// Always use camelCase key (gh-2257)
        +			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
        +	},
        +	access: function( owner, key, value ) {
        +
        +		// In cases where either:
        +		//
        +		//   1. No key was specified
        +		//   2. A string key was specified, but no value provided
        +		//
        +		// Take the "read" path and allow the get method to determine
        +		// which value to return, respectively either:
        +		//
        +		//   1. The entire cache object
        +		//   2. The data stored at the key
        +		//
        +		if ( key === undefined ||
        +				( ( key && typeof key === "string" ) && value === undefined ) ) {
        +
        +			return this.get( owner, key );
        +		}
        +
        +		// When the key is not a string, or both a key and value
        +		// are specified, set or extend (existing objects) with either:
        +		//
        +		//   1. An object of properties
        +		//   2. A key and value
        +		//
        +		this.set( owner, key, value );
        +
        +		// Since the "set" path can have two possible entry points
        +		// return the expected data based on which path was taken[*]
        +		return value !== undefined ? value : key;
        +	},
        +	remove: function( owner, key ) {
        +		var i,
        +			cache = owner[ this.expando ];
        +
        +		if ( cache === undefined ) {
        +			return;
        +		}
        +
        +		if ( key !== undefined ) {
        +
        +			// Support array or space separated string of keys
        +			if ( jQuery.isArray( key ) ) {
        +
        +				// If key is an array of keys...
        +				// We always set camelCase keys, so remove that.
        +				key = key.map( jQuery.camelCase );
        +			} else {
        +				key = jQuery.camelCase( key );
        +
        +				// If a key with the spaces exists, use it.
        +				// Otherwise, create an array by matching non-whitespace
        +				key = key in cache ?
        +					[ key ] :
        +					( key.match( rnothtmlwhite ) || [] );
        +			}
        +
        +			i = key.length;
        +
        +			while ( i-- ) {
        +				delete cache[ key[ i ] ];
        +			}
        +		}
        +
        +		// Remove the expando if there's no more data
        +		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
        +
        +			// Support: Chrome <=35 - 45
        +			// Webkit & Blink performance suffers when deleting properties
        +			// from DOM nodes, so set to undefined instead
        +			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
        +			if ( owner.nodeType ) {
        +				owner[ this.expando ] = undefined;
        +			} else {
        +				delete owner[ this.expando ];
        +			}
        +		}
        +	},
        +	hasData: function( owner ) {
        +		var cache = owner[ this.expando ];
        +		return cache !== undefined && !jQuery.isEmptyObject( cache );
        +	}
        +};
        +var dataPriv = new Data();
        +
        +var dataUser = new Data();
        +
        +
        +
        +//	Implementation Summary
        +//
        +//	1. Enforce API surface and semantic compatibility with 1.9.x branch
        +//	2. Improve the module's maintainability by reducing the storage
        +//		paths to a single mechanism.
        +//	3. Use the same single mechanism to support "private" and "user" data.
        +//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
        +//	5. Avoid exposing implementation details on user objects (eg. expando properties)
        +//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
        +
        +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
        +	rmultiDash = /[A-Z]/g;
        +
        +function getData( data ) {
        +	if ( data === "true" ) {
        +		return true;
        +	}
        +
        +	if ( data === "false" ) {
        +		return false;
        +	}
        +
        +	if ( data === "null" ) {
        +		return null;
        +	}
        +
        +	// Only convert to a number if it doesn't change the string
        +	if ( data === +data + "" ) {
        +		return +data;
        +	}
        +
        +	if ( rbrace.test( data ) ) {
        +		return JSON.parse( data );
        +	}
        +
        +	return data;
        +}
        +
        +function dataAttr( elem, key, data ) {
        +	var name;
        +
        +	// If nothing was found internally, try to fetch any
        +	// data from the HTML5 data-* attribute
        +	if ( data === undefined && elem.nodeType === 1 ) {
        +		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
        +		data = elem.getAttribute( name );
        +
        +		if ( typeof data === "string" ) {
        +			try {
        +				data = getData( data );
        +			} catch ( e ) {}
        +
        +			// Make sure we set the data so it isn't changed later
        +			dataUser.set( elem, key, data );
        +		} else {
        +			data = undefined;
        +		}
        +	}
        +	return data;
        +}
        +
        +jQuery.extend( {
        +	hasData: function( elem ) {
        +		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
        +	},
        +
        +	data: function( elem, name, data ) {
        +		return dataUser.access( elem, name, data );
        +	},
        +
        +	removeData: function( elem, name ) {
        +		dataUser.remove( elem, name );
        +	},
        +
        +	// TODO: Now that all calls to _data and _removeData have been replaced
        +	// with direct calls to dataPriv methods, these can be deprecated.
        +	_data: function( elem, name, data ) {
        +		return dataPriv.access( elem, name, data );
        +	},
        +
        +	_removeData: function( elem, name ) {
        +		dataPriv.remove( elem, name );
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	data: function( key, value ) {
        +		var i, name, data,
        +			elem = this[ 0 ],
        +			attrs = elem && elem.attributes;
        +
        +		// Gets all values
        +		if ( key === undefined ) {
        +			if ( this.length ) {
        +				data = dataUser.get( elem );
        +
        +				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
        +					i = attrs.length;
        +					while ( i-- ) {
        +
        +						// Support: IE 11 only
        +						// The attrs elements can be null (#14894)
        +						if ( attrs[ i ] ) {
        +							name = attrs[ i ].name;
        +							if ( name.indexOf( "data-" ) === 0 ) {
        +								name = jQuery.camelCase( name.slice( 5 ) );
        +								dataAttr( elem, name, data[ name ] );
        +							}
        +						}
        +					}
        +					dataPriv.set( elem, "hasDataAttrs", true );
        +				}
        +			}
        +
        +			return data;
        +		}
        +
        +		// Sets multiple values
        +		if ( typeof key === "object" ) {
        +			return this.each( function() {
        +				dataUser.set( this, key );
        +			} );
        +		}
        +
        +		return access( this, function( value ) {
        +			var data;
        +
        +			// The calling jQuery object (element matches) is not empty
        +			// (and therefore has an element appears at this[ 0 ]) and the
        +			// `value` parameter was not undefined. An empty jQuery object
        +			// will result in `undefined` for elem = this[ 0 ] which will
        +			// throw an exception if an attempt to read a data cache is made.
        +			if ( elem && value === undefined ) {
        +
        +				// Attempt to get data from the cache
        +				// The key will always be camelCased in Data
        +				data = dataUser.get( elem, key );
        +				if ( data !== undefined ) {
        +					return data;
        +				}
        +
        +				// Attempt to "discover" the data in
        +				// HTML5 custom data-* attrs
        +				data = dataAttr( elem, key );
        +				if ( data !== undefined ) {
        +					return data;
        +				}
        +
        +				// We tried really hard, but the data doesn't exist.
        +				return;
        +			}
        +
        +			// Set the data...
        +			this.each( function() {
        +
        +				// We always store the camelCased key
        +				dataUser.set( this, key, value );
        +			} );
        +		}, null, value, arguments.length > 1, null, true );
        +	},
        +
        +	removeData: function( key ) {
        +		return this.each( function() {
        +			dataUser.remove( this, key );
        +		} );
        +	}
        +} );
        +
        +
        +jQuery.extend( {
        +	queue: function( elem, type, data ) {
        +		var queue;
        +
        +		if ( elem ) {
        +			type = ( type || "fx" ) + "queue";
        +			queue = dataPriv.get( elem, type );
        +
        +			// Speed up dequeue by getting out quickly if this is just a lookup
        +			if ( data ) {
        +				if ( !queue || jQuery.isArray( data ) ) {
        +					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
        +				} else {
        +					queue.push( data );
        +				}
        +			}
        +			return queue || [];
        +		}
        +	},
        +
        +	dequeue: function( elem, type ) {
        +		type = type || "fx";
        +
        +		var queue = jQuery.queue( elem, type ),
        +			startLength = queue.length,
        +			fn = queue.shift(),
        +			hooks = jQuery._queueHooks( elem, type ),
        +			next = function() {
        +				jQuery.dequeue( elem, type );
        +			};
        +
        +		// If the fx queue is dequeued, always remove the progress sentinel
        +		if ( fn === "inprogress" ) {
        +			fn = queue.shift();
        +			startLength--;
        +		}
        +
        +		if ( fn ) {
        +
        +			// Add a progress sentinel to prevent the fx queue from being
        +			// automatically dequeued
        +			if ( type === "fx" ) {
        +				queue.unshift( "inprogress" );
        +			}
        +
        +			// Clear up the last queue stop function
        +			delete hooks.stop;
        +			fn.call( elem, next, hooks );
        +		}
        +
        +		if ( !startLength && hooks ) {
        +			hooks.empty.fire();
        +		}
        +	},
        +
        +	// Not public - generate a queueHooks object, or return the current one
        +	_queueHooks: function( elem, type ) {
        +		var key = type + "queueHooks";
        +		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
        +			empty: jQuery.Callbacks( "once memory" ).add( function() {
        +				dataPriv.remove( elem, [ type + "queue", key ] );
        +			} )
        +		} );
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	queue: function( type, data ) {
        +		var setter = 2;
        +
        +		if ( typeof type !== "string" ) {
        +			data = type;
        +			type = "fx";
        +			setter--;
        +		}
        +
        +		if ( arguments.length < setter ) {
        +			return jQuery.queue( this[ 0 ], type );
        +		}
        +
        +		return data === undefined ?
        +			this :
        +			this.each( function() {
        +				var queue = jQuery.queue( this, type, data );
        +
        +				// Ensure a hooks for this queue
        +				jQuery._queueHooks( this, type );
        +
        +				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
        +					jQuery.dequeue( this, type );
        +				}
        +			} );
        +	},
        +	dequeue: function( type ) {
        +		return this.each( function() {
        +			jQuery.dequeue( this, type );
        +		} );
        +	},
        +	clearQueue: function( type ) {
        +		return this.queue( type || "fx", [] );
        +	},
        +
        +	// Get a promise resolved when queues of a certain type
        +	// are emptied (fx is the type by default)
        +	promise: function( type, obj ) {
        +		var tmp,
        +			count = 1,
        +			defer = jQuery.Deferred(),
        +			elements = this,
        +			i = this.length,
        +			resolve = function() {
        +				if ( !( --count ) ) {
        +					defer.resolveWith( elements, [ elements ] );
        +				}
        +			};
        +
        +		if ( typeof type !== "string" ) {
        +			obj = type;
        +			type = undefined;
        +		}
        +		type = type || "fx";
        +
        +		while ( i-- ) {
        +			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
        +			if ( tmp && tmp.empty ) {
        +				count++;
        +				tmp.empty.add( resolve );
        +			}
        +		}
        +		resolve();
        +		return defer.promise( obj );
        +	}
        +} );
        +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
        +
        +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
        +
        +
        +var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
        +
        +var isHiddenWithinTree = function( elem, el ) {
        +
        +		// isHiddenWithinTree might be called from jQuery#filter function;
        +		// in that case, element will be second argument
        +		elem = el || elem;
        +
        +		// Inline style trumps all
        +		return elem.style.display === "none" ||
        +			elem.style.display === "" &&
        +
        +			// Otherwise, check computed style
        +			// Support: Firefox <=43 - 45
        +			// Disconnected elements can have computed display: none, so first confirm that elem is
        +			// in the document.
        +			jQuery.contains( elem.ownerDocument, elem ) &&
        +
        +			jQuery.css( elem, "display" ) === "none";
        +	};
        +
        +var swap = function( elem, options, callback, args ) {
        +	var ret, name,
        +		old = {};
        +
        +	// Remember the old values, and insert the new ones
        +	for ( name in options ) {
        +		old[ name ] = elem.style[ name ];
        +		elem.style[ name ] = options[ name ];
        +	}
        +
        +	ret = callback.apply( elem, args || [] );
        +
        +	// Revert the old values
        +	for ( name in options ) {
        +		elem.style[ name ] = old[ name ];
        +	}
        +
        +	return ret;
        +};
        +
        +
        +
        +
        +function adjustCSS( elem, prop, valueParts, tween ) {
        +	var adjusted,
        +		scale = 1,
        +		maxIterations = 20,
        +		currentValue = tween ?
        +			function() {
        +				return tween.cur();
        +			} :
        +			function() {
        +				return jQuery.css( elem, prop, "" );
        +			},
        +		initial = currentValue(),
        +		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
        +
        +		// Starting value computation is required for potential unit mismatches
        +		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
        +			rcssNum.exec( jQuery.css( elem, prop ) );
        +
        +	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
        +
        +		// Trust units reported by jQuery.css
        +		unit = unit || initialInUnit[ 3 ];
        +
        +		// Make sure we update the tween properties later on
        +		valueParts = valueParts || [];
        +
        +		// Iteratively approximate from a nonzero starting point
        +		initialInUnit = +initial || 1;
        +
        +		do {
        +
        +			// If previous iteration zeroed out, double until we get *something*.
        +			// Use string for doubling so we don't accidentally see scale as unchanged below
        +			scale = scale || ".5";
        +
        +			// Adjust and apply
        +			initialInUnit = initialInUnit / scale;
        +			jQuery.style( elem, prop, initialInUnit + unit );
        +
        +		// Update scale, tolerating zero or NaN from tween.cur()
        +		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
        +		} while (
        +			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
        +		);
        +	}
        +
        +	if ( valueParts ) {
        +		initialInUnit = +initialInUnit || +initial || 0;
        +
        +		// Apply relative offset (+=/-=) if specified
        +		adjusted = valueParts[ 1 ] ?
        +			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
        +			+valueParts[ 2 ];
        +		if ( tween ) {
        +			tween.unit = unit;
        +			tween.start = initialInUnit;
        +			tween.end = adjusted;
        +		}
        +	}
        +	return adjusted;
        +}
        +
        +
        +var defaultDisplayMap = {};
        +
        +function getDefaultDisplay( elem ) {
        +	var temp,
        +		doc = elem.ownerDocument,
        +		nodeName = elem.nodeName,
        +		display = defaultDisplayMap[ nodeName ];
        +
        +	if ( display ) {
        +		return display;
        +	}
        +
        +	temp = doc.body.appendChild( doc.createElement( nodeName ) );
        +	display = jQuery.css( temp, "display" );
        +
        +	temp.parentNode.removeChild( temp );
        +
        +	if ( display === "none" ) {
        +		display = "block";
        +	}
        +	defaultDisplayMap[ nodeName ] = display;
        +
        +	return display;
        +}
        +
        +function showHide( elements, show ) {
        +	var display, elem,
        +		values = [],
        +		index = 0,
        +		length = elements.length;
        +
        +	// Determine new display value for elements that need to change
        +	for ( ; index < length; index++ ) {
        +		elem = elements[ index ];
        +		if ( !elem.style ) {
        +			continue;
        +		}
        +
        +		display = elem.style.display;
        +		if ( show ) {
        +
        +			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
        +			// check is required in this first loop unless we have a nonempty display value (either
        +			// inline or about-to-be-restored)
        +			if ( display === "none" ) {
        +				values[ index ] = dataPriv.get( elem, "display" ) || null;
        +				if ( !values[ index ] ) {
        +					elem.style.display = "";
        +				}
        +			}
        +			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
        +				values[ index ] = getDefaultDisplay( elem );
        +			}
        +		} else {
        +			if ( display !== "none" ) {
        +				values[ index ] = "none";
        +
        +				// Remember what we're overwriting
        +				dataPriv.set( elem, "display", display );
        +			}
        +		}
        +	}
        +
        +	// Set the display of the elements in a second loop to avoid constant reflow
        +	for ( index = 0; index < length; index++ ) {
        +		if ( values[ index ] != null ) {
        +			elements[ index ].style.display = values[ index ];
        +		}
        +	}
        +
        +	return elements;
        +}
        +
        +jQuery.fn.extend( {
        +	show: function() {
        +		return showHide( this, true );
        +	},
        +	hide: function() {
        +		return showHide( this );
        +	},
        +	toggle: function( state ) {
        +		if ( typeof state === "boolean" ) {
        +			return state ? this.show() : this.hide();
        +		}
        +
        +		return this.each( function() {
        +			if ( isHiddenWithinTree( this ) ) {
        +				jQuery( this ).show();
        +			} else {
        +				jQuery( this ).hide();
        +			}
        +		} );
        +	}
        +} );
        +var rcheckableType = ( /^(?:checkbox|radio)$/i );
        +
        +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
        +
        +var rscriptType = ( /^$|\/(?:java|ecma)script/i );
        +
        +
        +
        +// We have to close these tags to support XHTML (#13200)
        +var wrapMap = {
        +
        +	// Support: IE <=9 only
        +	option: [ 1, "<select multiple='multiple'>", "</select>" ],
        +
        +	// XHTML parsers do not magically insert elements in the
        +	// same way that tag soup parsers do. So we cannot shorten
        +	// this by omitting <tbody> or other required elements.
        +	thead: [ 1, "<table>", "</table>" ],
        +	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
        +	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
        +	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
        +
        +	_default: [ 0, "", "" ]
        +};
        +
        +// Support: IE <=9 only
        +wrapMap.optgroup = wrapMap.option;
        +
        +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
        +wrapMap.th = wrapMap.td;
        +
        +
        +function getAll( context, tag ) {
        +
        +	// Support: IE <=9 - 11 only
        +	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
        +	var ret;
        +
        +	if ( typeof context.getElementsByTagName !== "undefined" ) {
        +		ret = context.getElementsByTagName( tag || "*" );
        +
        +	} else if ( typeof context.querySelectorAll !== "undefined" ) {
        +		ret = context.querySelectorAll( tag || "*" );
        +
        +	} else {
        +		ret = [];
        +	}
        +
        +	if ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) {
        +		return jQuery.merge( [ context ], ret );
        +	}
        +
        +	return ret;
        +}
        +
        +
        +// Mark scripts as having already been evaluated
        +function setGlobalEval( elems, refElements ) {
        +	var i = 0,
        +		l = elems.length;
        +
        +	for ( ; i < l; i++ ) {
        +		dataPriv.set(
        +			elems[ i ],
        +			"globalEval",
        +			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
        +		);
        +	}
        +}
        +
        +
        +var rhtml = /<|&#?\w+;/;
        +
        +function buildFragment( elems, context, scripts, selection, ignored ) {
        +	var elem, tmp, tag, wrap, contains, j,
        +		fragment = context.createDocumentFragment(),
        +		nodes = [],
        +		i = 0,
        +		l = elems.length;
        +
        +	for ( ; i < l; i++ ) {
        +		elem = elems[ i ];
        +
        +		if ( elem || elem === 0 ) {
        +
        +			// Add nodes directly
        +			if ( jQuery.type( elem ) === "object" ) {
        +
        +				// Support: Android <=4.0 only, PhantomJS 1 only
        +				// push.apply(_, arraylike) throws on ancient WebKit
        +				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
        +
        +			// Convert non-html into a text node
        +			} else if ( !rhtml.test( elem ) ) {
        +				nodes.push( context.createTextNode( elem ) );
        +
        +			// Convert html into DOM nodes
        +			} else {
        +				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
        +
        +				// Deserialize a standard representation
        +				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
        +				wrap = wrapMap[ tag ] || wrapMap._default;
        +				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
        +
        +				// Descend through wrappers to the right content
        +				j = wrap[ 0 ];
        +				while ( j-- ) {
        +					tmp = tmp.lastChild;
        +				}
        +
        +				// Support: Android <=4.0 only, PhantomJS 1 only
        +				// push.apply(_, arraylike) throws on ancient WebKit
        +				jQuery.merge( nodes, tmp.childNodes );
        +
        +				// Remember the top-level container
        +				tmp = fragment.firstChild;
        +
        +				// Ensure the created nodes are orphaned (#12392)
        +				tmp.textContent = "";
        +			}
        +		}
        +	}
        +
        +	// Remove wrapper from fragment
        +	fragment.textContent = "";
        +
        +	i = 0;
        +	while ( ( elem = nodes[ i++ ] ) ) {
        +
        +		// Skip elements already in the context collection (trac-4087)
        +		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
        +			if ( ignored ) {
        +				ignored.push( elem );
        +			}
        +			continue;
        +		}
        +
        +		contains = jQuery.contains( elem.ownerDocument, elem );
        +
        +		// Append to fragment
        +		tmp = getAll( fragment.appendChild( elem ), "script" );
        +
        +		// Preserve script evaluation history
        +		if ( contains ) {
        +			setGlobalEval( tmp );
        +		}
        +
        +		// Capture executables
        +		if ( scripts ) {
        +			j = 0;
        +			while ( ( elem = tmp[ j++ ] ) ) {
        +				if ( rscriptType.test( elem.type || "" ) ) {
        +					scripts.push( elem );
        +				}
        +			}
        +		}
        +	}
        +
        +	return fragment;
        +}
        +
        +
        +( function() {
        +	var fragment = document.createDocumentFragment(),
        +		div = fragment.appendChild( document.createElement( "div" ) ),
        +		input = document.createElement( "input" );
        +
        +	// Support: Android 4.0 - 4.3 only
        +	// Check state lost if the name is set (#11217)
        +	// Support: Windows Web Apps (WWA)
        +	// `name` and `type` must use .setAttribute for WWA (#14901)
        +	input.setAttribute( "type", "radio" );
        +	input.setAttribute( "checked", "checked" );
        +	input.setAttribute( "name", "t" );
        +
        +	div.appendChild( input );
        +
        +	// Support: Android <=4.1 only
        +	// Older WebKit doesn't clone checked state correctly in fragments
        +	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
        +
        +	// Support: IE <=11 only
        +	// Make sure textarea (and checkbox) defaultValue is properly cloned
        +	div.innerHTML = "<textarea>x</textarea>";
        +	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
        +} )();
        +var documentElement = document.documentElement;
        +
        +
        +
        +var
        +	rkeyEvent = /^key/,
        +	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
        +	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
        +
        +function returnTrue() {
        +	return true;
        +}
        +
        +function returnFalse() {
        +	return false;
        +}
        +
        +// Support: IE <=9 only
        +// See #13393 for more info
        +function safeActiveElement() {
        +	try {
        +		return document.activeElement;
        +	} catch ( err ) { }
        +}
        +
        +function on( elem, types, selector, data, fn, one ) {
        +	var origFn, type;
        +
        +	// Types can be a map of types/handlers
        +	if ( typeof types === "object" ) {
        +
        +		// ( types-Object, selector, data )
        +		if ( typeof selector !== "string" ) {
        +
        +			// ( types-Object, data )
        +			data = data || selector;
        +			selector = undefined;
        +		}
        +		for ( type in types ) {
        +			on( elem, type, selector, data, types[ type ], one );
        +		}
        +		return elem;
        +	}
        +
        +	if ( data == null && fn == null ) {
        +
        +		// ( types, fn )
        +		fn = selector;
        +		data = selector = undefined;
        +	} else if ( fn == null ) {
        +		if ( typeof selector === "string" ) {
        +
        +			// ( types, selector, fn )
        +			fn = data;
        +			data = undefined;
        +		} else {
        +
        +			// ( types, data, fn )
        +			fn = data;
        +			data = selector;
        +			selector = undefined;
        +		}
        +	}
        +	if ( fn === false ) {
        +		fn = returnFalse;
        +	} else if ( !fn ) {
        +		return elem;
        +	}
        +
        +	if ( one === 1 ) {
        +		origFn = fn;
        +		fn = function( event ) {
        +
        +			// Can use an empty set, since event contains the info
        +			jQuery().off( event );
        +			return origFn.apply( this, arguments );
        +		};
        +
        +		// Use same guid so caller can remove using origFn
        +		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        +	}
        +	return elem.each( function() {
        +		jQuery.event.add( this, types, fn, data, selector );
        +	} );
        +}
        +
        +/*
        + * Helper functions for managing events -- not part of the public interface.
        + * Props to Dean Edwards' addEvent library for many of the ideas.
        + */
        +jQuery.event = {
        +
        +	global: {},
        +
        +	add: function( elem, types, handler, data, selector ) {
        +
        +		var handleObjIn, eventHandle, tmp,
        +			events, t, handleObj,
        +			special, handlers, type, namespaces, origType,
        +			elemData = dataPriv.get( elem );
        +
        +		// Don't attach events to noData or text/comment nodes (but allow plain objects)
        +		if ( !elemData ) {
        +			return;
        +		}
        +
        +		// Caller can pass in an object of custom data in lieu of the handler
        +		if ( handler.handler ) {
        +			handleObjIn = handler;
        +			handler = handleObjIn.handler;
        +			selector = handleObjIn.selector;
        +		}
        +
        +		// Ensure that invalid selectors throw exceptions at attach time
        +		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
        +		if ( selector ) {
        +			jQuery.find.matchesSelector( documentElement, selector );
        +		}
        +
        +		// Make sure that the handler has a unique ID, used to find/remove it later
        +		if ( !handler.guid ) {
        +			handler.guid = jQuery.guid++;
        +		}
        +
        +		// Init the element's event structure and main handler, if this is the first
        +		if ( !( events = elemData.events ) ) {
        +			events = elemData.events = {};
        +		}
        +		if ( !( eventHandle = elemData.handle ) ) {
        +			eventHandle = elemData.handle = function( e ) {
        +
        +				// Discard the second event of a jQuery.event.trigger() and
        +				// when an event is called after a page has unloaded
        +				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
        +					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
        +			};
        +		}
        +
        +		// Handle multiple events separated by a space
        +		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
        +		t = types.length;
        +		while ( t-- ) {
        +			tmp = rtypenamespace.exec( types[ t ] ) || [];
        +			type = origType = tmp[ 1 ];
        +			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
        +
        +			// There *must* be a type, no attaching namespace-only handlers
        +			if ( !type ) {
        +				continue;
        +			}
        +
        +			// If event changes its type, use the special event handlers for the changed type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// If selector defined, determine special event api type, otherwise given type
        +			type = ( selector ? special.delegateType : special.bindType ) || type;
        +
        +			// Update special based on newly reset type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// handleObj is passed to all event handlers
        +			handleObj = jQuery.extend( {
        +				type: type,
        +				origType: origType,
        +				data: data,
        +				handler: handler,
        +				guid: handler.guid,
        +				selector: selector,
        +				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
        +				namespace: namespaces.join( "." )
        +			}, handleObjIn );
        +
        +			// Init the event handler queue if we're the first
        +			if ( !( handlers = events[ type ] ) ) {
        +				handlers = events[ type ] = [];
        +				handlers.delegateCount = 0;
        +
        +				// Only use addEventListener if the special events handler returns false
        +				if ( !special.setup ||
        +					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        +
        +					if ( elem.addEventListener ) {
        +						elem.addEventListener( type, eventHandle );
        +					}
        +				}
        +			}
        +
        +			if ( special.add ) {
        +				special.add.call( elem, handleObj );
        +
        +				if ( !handleObj.handler.guid ) {
        +					handleObj.handler.guid = handler.guid;
        +				}
        +			}
        +
        +			// Add to the element's handler list, delegates in front
        +			if ( selector ) {
        +				handlers.splice( handlers.delegateCount++, 0, handleObj );
        +			} else {
        +				handlers.push( handleObj );
        +			}
        +
        +			// Keep track of which events have ever been used, for event optimization
        +			jQuery.event.global[ type ] = true;
        +		}
        +
        +	},
        +
        +	// Detach an event or set of events from an element
        +	remove: function( elem, types, handler, selector, mappedTypes ) {
        +
        +		var j, origCount, tmp,
        +			events, t, handleObj,
        +			special, handlers, type, namespaces, origType,
        +			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
        +
        +		if ( !elemData || !( events = elemData.events ) ) {
        +			return;
        +		}
        +
        +		// Once for each type.namespace in types; type may be omitted
        +		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
        +		t = types.length;
        +		while ( t-- ) {
        +			tmp = rtypenamespace.exec( types[ t ] ) || [];
        +			type = origType = tmp[ 1 ];
        +			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
        +
        +			// Unbind all events (on this namespace, if provided) for the element
        +			if ( !type ) {
        +				for ( type in events ) {
        +					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
        +				}
        +				continue;
        +			}
        +
        +			special = jQuery.event.special[ type ] || {};
        +			type = ( selector ? special.delegateType : special.bindType ) || type;
        +			handlers = events[ type ] || [];
        +			tmp = tmp[ 2 ] &&
        +				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
        +
        +			// Remove matching events
        +			origCount = j = handlers.length;
        +			while ( j-- ) {
        +				handleObj = handlers[ j ];
        +
        +				if ( ( mappedTypes || origType === handleObj.origType ) &&
        +					( !handler || handler.guid === handleObj.guid ) &&
        +					( !tmp || tmp.test( handleObj.namespace ) ) &&
        +					( !selector || selector === handleObj.selector ||
        +						selector === "**" && handleObj.selector ) ) {
        +					handlers.splice( j, 1 );
        +
        +					if ( handleObj.selector ) {
        +						handlers.delegateCount--;
        +					}
        +					if ( special.remove ) {
        +						special.remove.call( elem, handleObj );
        +					}
        +				}
        +			}
        +
        +			// Remove generic event handler if we removed something and no more handlers exist
        +			// (avoids potential for endless recursion during removal of special event handlers)
        +			if ( origCount && !handlers.length ) {
        +				if ( !special.teardown ||
        +					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
        +
        +					jQuery.removeEvent( elem, type, elemData.handle );
        +				}
        +
        +				delete events[ type ];
        +			}
        +		}
        +
        +		// Remove data and the expando if it's no longer used
        +		if ( jQuery.isEmptyObject( events ) ) {
        +			dataPriv.remove( elem, "handle events" );
        +		}
        +	},
        +
        +	dispatch: function( nativeEvent ) {
        +
        +		// Make a writable jQuery.Event from the native event object
        +		var event = jQuery.event.fix( nativeEvent );
        +
        +		var i, j, ret, matched, handleObj, handlerQueue,
        +			args = new Array( arguments.length ),
        +			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
        +			special = jQuery.event.special[ event.type ] || {};
        +
        +		// Use the fix-ed jQuery.Event rather than the (read-only) native event
        +		args[ 0 ] = event;
        +
        +		for ( i = 1; i < arguments.length; i++ ) {
        +			args[ i ] = arguments[ i ];
        +		}
        +
        +		event.delegateTarget = this;
        +
        +		// Call the preDispatch hook for the mapped type, and let it bail if desired
        +		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
        +			return;
        +		}
        +
        +		// Determine handlers
        +		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
        +
        +		// Run delegates first; they may want to stop propagation beneath us
        +		i = 0;
        +		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
        +			event.currentTarget = matched.elem;
        +
        +			j = 0;
        +			while ( ( handleObj = matched.handlers[ j++ ] ) &&
        +				!event.isImmediatePropagationStopped() ) {
        +
        +				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
        +				// a subset or equal to those in the bound event (both can have no namespace).
        +				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
        +
        +					event.handleObj = handleObj;
        +					event.data = handleObj.data;
        +
        +					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
        +						handleObj.handler ).apply( matched.elem, args );
        +
        +					if ( ret !== undefined ) {
        +						if ( ( event.result = ret ) === false ) {
        +							event.preventDefault();
        +							event.stopPropagation();
        +						}
        +					}
        +				}
        +			}
        +		}
        +
        +		// Call the postDispatch hook for the mapped type
        +		if ( special.postDispatch ) {
        +			special.postDispatch.call( this, event );
        +		}
        +
        +		return event.result;
        +	},
        +
        +	handlers: function( event, handlers ) {
        +		var i, handleObj, sel, matchedHandlers, matchedSelectors,
        +			handlerQueue = [],
        +			delegateCount = handlers.delegateCount,
        +			cur = event.target;
        +
        +		// Find delegate handlers
        +		if ( delegateCount &&
        +
        +			// Support: IE <=9
        +			// Black-hole SVG <use> instance trees (trac-13180)
        +			cur.nodeType &&
        +
        +			// Support: Firefox <=42
        +			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
        +			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
        +			// Support: IE 11 only
        +			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
        +			!( event.type === "click" && event.button >= 1 ) ) {
        +
        +			for ( ; cur !== this; cur = cur.parentNode || this ) {
        +
        +				// Don't check non-elements (#13208)
        +				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
        +				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
        +					matchedHandlers = [];
        +					matchedSelectors = {};
        +					for ( i = 0; i < delegateCount; i++ ) {
        +						handleObj = handlers[ i ];
        +
        +						// Don't conflict with Object.prototype properties (#13203)
        +						sel = handleObj.selector + " ";
        +
        +						if ( matchedSelectors[ sel ] === undefined ) {
        +							matchedSelectors[ sel ] = handleObj.needsContext ?
        +								jQuery( sel, this ).index( cur ) > -1 :
        +								jQuery.find( sel, this, null, [ cur ] ).length;
        +						}
        +						if ( matchedSelectors[ sel ] ) {
        +							matchedHandlers.push( handleObj );
        +						}
        +					}
        +					if ( matchedHandlers.length ) {
        +						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
        +					}
        +				}
        +			}
        +		}
        +
        +		// Add the remaining (directly-bound) handlers
        +		cur = this;
        +		if ( delegateCount < handlers.length ) {
        +			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
        +		}
        +
        +		return handlerQueue;
        +	},
        +
        +	addProp: function( name, hook ) {
        +		Object.defineProperty( jQuery.Event.prototype, name, {
        +			enumerable: true,
        +			configurable: true,
        +
        +			get: jQuery.isFunction( hook ) ?
        +				function() {
        +					if ( this.originalEvent ) {
        +							return hook( this.originalEvent );
        +					}
        +				} :
        +				function() {
        +					if ( this.originalEvent ) {
        +							return this.originalEvent[ name ];
        +					}
        +				},
        +
        +			set: function( value ) {
        +				Object.defineProperty( this, name, {
        +					enumerable: true,
        +					configurable: true,
        +					writable: true,
        +					value: value
        +				} );
        +			}
        +		} );
        +	},
        +
        +	fix: function( originalEvent ) {
        +		return originalEvent[ jQuery.expando ] ?
        +			originalEvent :
        +			new jQuery.Event( originalEvent );
        +	},
        +
        +	special: {
        +		load: {
        +
        +			// Prevent triggered image.load events from bubbling to window.load
        +			noBubble: true
        +		},
        +		focus: {
        +
        +			// Fire native event if possible so blur/focus sequence is correct
        +			trigger: function() {
        +				if ( this !== safeActiveElement() && this.focus ) {
        +					this.focus();
        +					return false;
        +				}
        +			},
        +			delegateType: "focusin"
        +		},
        +		blur: {
        +			trigger: function() {
        +				if ( this === safeActiveElement() && this.blur ) {
        +					this.blur();
        +					return false;
        +				}
        +			},
        +			delegateType: "focusout"
        +		},
        +		click: {
        +
        +			// For checkbox, fire native event so checked state will be right
        +			trigger: function() {
        +				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
        +					this.click();
        +					return false;
        +				}
        +			},
        +
        +			// For cross-browser consistency, don't fire native .click() on links
        +			_default: function( event ) {
        +				return jQuery.nodeName( event.target, "a" );
        +			}
        +		},
        +
        +		beforeunload: {
        +			postDispatch: function( event ) {
        +
        +				// Support: Firefox 20+
        +				// Firefox doesn't alert if the returnValue field is not set.
        +				if ( event.result !== undefined && event.originalEvent ) {
        +					event.originalEvent.returnValue = event.result;
        +				}
        +			}
        +		}
        +	}
        +};
        +
        +jQuery.removeEvent = function( elem, type, handle ) {
        +
        +	// This "if" is needed for plain objects
        +	if ( elem.removeEventListener ) {
        +		elem.removeEventListener( type, handle );
        +	}
        +};
        +
        +jQuery.Event = function( src, props ) {
        +
        +	// Allow instantiation without the 'new' keyword
        +	if ( !( this instanceof jQuery.Event ) ) {
        +		return new jQuery.Event( src, props );
        +	}
        +
        +	// Event object
        +	if ( src && src.type ) {
        +		this.originalEvent = src;
        +		this.type = src.type;
        +
        +		// Events bubbling up the document may have been marked as prevented
        +		// by a handler lower down the tree; reflect the correct value.
        +		this.isDefaultPrevented = src.defaultPrevented ||
        +				src.defaultPrevented === undefined &&
        +
        +				// Support: Android <=2.3 only
        +				src.returnValue === false ?
        +			returnTrue :
        +			returnFalse;
        +
        +		// Create target properties
        +		// Support: Safari <=6 - 7 only
        +		// Target should not be a text node (#504, #13143)
        +		this.target = ( src.target && src.target.nodeType === 3 ) ?
        +			src.target.parentNode :
        +			src.target;
        +
        +		this.currentTarget = src.currentTarget;
        +		this.relatedTarget = src.relatedTarget;
        +
        +	// Event type
        +	} else {
        +		this.type = src;
        +	}
        +
        +	// Put explicitly provided properties onto the event object
        +	if ( props ) {
        +		jQuery.extend( this, props );
        +	}
        +
        +	// Create a timestamp if incoming event doesn't have one
        +	this.timeStamp = src && src.timeStamp || jQuery.now();
        +
        +	// Mark it as fixed
        +	this[ jQuery.expando ] = true;
        +};
        +
        +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
        +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
        +jQuery.Event.prototype = {
        +	constructor: jQuery.Event,
        +	isDefaultPrevented: returnFalse,
        +	isPropagationStopped: returnFalse,
        +	isImmediatePropagationStopped: returnFalse,
        +	isSimulated: false,
        +
        +	preventDefault: function() {
        +		var e = this.originalEvent;
        +
        +		this.isDefaultPrevented = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.preventDefault();
        +		}
        +	},
        +	stopPropagation: function() {
        +		var e = this.originalEvent;
        +
        +		this.isPropagationStopped = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.stopPropagation();
        +		}
        +	},
        +	stopImmediatePropagation: function() {
        +		var e = this.originalEvent;
        +
        +		this.isImmediatePropagationStopped = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.stopImmediatePropagation();
        +		}
        +
        +		this.stopPropagation();
        +	}
        +};
        +
        +// Includes all common event props including KeyEvent and MouseEvent specific props
        +jQuery.each( {
        +	altKey: true,
        +	bubbles: true,
        +	cancelable: true,
        +	changedTouches: true,
        +	ctrlKey: true,
        +	detail: true,
        +	eventPhase: true,
        +	metaKey: true,
        +	pageX: true,
        +	pageY: true,
        +	shiftKey: true,
        +	view: true,
        +	"char": true,
        +	charCode: true,
        +	key: true,
        +	keyCode: true,
        +	button: true,
        +	buttons: true,
        +	clientX: true,
        +	clientY: true,
        +	offsetX: true,
        +	offsetY: true,
        +	pointerId: true,
        +	pointerType: true,
        +	screenX: true,
        +	screenY: true,
        +	targetTouches: true,
        +	toElement: true,
        +	touches: true,
        +
        +	which: function( event ) {
        +		var button = event.button;
        +
        +		// Add which for key events
        +		if ( event.which == null && rkeyEvent.test( event.type ) ) {
        +			return event.charCode != null ? event.charCode : event.keyCode;
        +		}
        +
        +		// Add which for click: 1 === left; 2 === middle; 3 === right
        +		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
        +			if ( button & 1 ) {
        +				return 1;
        +			}
        +
        +			if ( button & 2 ) {
        +				return 3;
        +			}
        +
        +			if ( button & 4 ) {
        +				return 2;
        +			}
        +
        +			return 0;
        +		}
        +
        +		return event.which;
        +	}
        +}, jQuery.event.addProp );
        +
        +// Create mouseenter/leave events using mouseover/out and event-time checks
        +// so that event delegation works in jQuery.
        +// Do the same for pointerenter/pointerleave and pointerover/pointerout
        +//
        +// Support: Safari 7 only
        +// Safari sends mouseenter too often; see:
        +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
        +// for the description of the bug (it existed in older Chrome versions as well).
        +jQuery.each( {
        +	mouseenter: "mouseover",
        +	mouseleave: "mouseout",
        +	pointerenter: "pointerover",
        +	pointerleave: "pointerout"
        +}, function( orig, fix ) {
        +	jQuery.event.special[ orig ] = {
        +		delegateType: fix,
        +		bindType: fix,
        +
        +		handle: function( event ) {
        +			var ret,
        +				target = this,
        +				related = event.relatedTarget,
        +				handleObj = event.handleObj;
        +
        +			// For mouseenter/leave call the handler if related is outside the target.
        +			// NB: No relatedTarget if the mouse left/entered the browser window
        +			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
        +				event.type = handleObj.origType;
        +				ret = handleObj.handler.apply( this, arguments );
        +				event.type = fix;
        +			}
        +			return ret;
        +		}
        +	};
        +} );
        +
        +jQuery.fn.extend( {
        +
        +	on: function( types, selector, data, fn ) {
        +		return on( this, types, selector, data, fn );
        +	},
        +	one: function( types, selector, data, fn ) {
        +		return on( this, types, selector, data, fn, 1 );
        +	},
        +	off: function( types, selector, fn ) {
        +		var handleObj, type;
        +		if ( types && types.preventDefault && types.handleObj ) {
        +
        +			// ( event )  dispatched jQuery.Event
        +			handleObj = types.handleObj;
        +			jQuery( types.delegateTarget ).off(
        +				handleObj.namespace ?
        +					handleObj.origType + "." + handleObj.namespace :
        +					handleObj.origType,
        +				handleObj.selector,
        +				handleObj.handler
        +			);
        +			return this;
        +		}
        +		if ( typeof types === "object" ) {
        +
        +			// ( types-object [, selector] )
        +			for ( type in types ) {
        +				this.off( type, selector, types[ type ] );
        +			}
        +			return this;
        +		}
        +		if ( selector === false || typeof selector === "function" ) {
        +
        +			// ( types [, fn] )
        +			fn = selector;
        +			selector = undefined;
        +		}
        +		if ( fn === false ) {
        +			fn = returnFalse;
        +		}
        +		return this.each( function() {
        +			jQuery.event.remove( this, types, fn, selector );
        +		} );
        +	}
        +} );
        +
        +
        +var
        +
        +	/* eslint-disable max-len */
        +
        +	// See https://github.com/eslint/eslint/issues/3229
        +	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
        +
        +	/* eslint-enable */
        +
        +	// Support: IE <=10 - 11, Edge 12 - 13
        +	// In IE/Edge using regex groups here causes severe slowdowns.
        +	// See https://connect.microsoft.com/IE/feedback/details/1736512/
        +	rnoInnerhtml = /<script|<style|<link/i,
        +
        +	// checked="checked" or checked
        +	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        +	rscriptTypeMasked = /^true\/(.*)/,
        +	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
        +
        +function manipulationTarget( elem, content ) {
        +	if ( jQuery.nodeName( elem, "table" ) &&
        +		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
        +
        +		return elem.getElementsByTagName( "tbody" )[ 0 ] || elem;
        +	}
        +
        +	return elem;
        +}
        +
        +// Replace/restore the type attribute of script elements for safe DOM manipulation
        +function disableScript( elem ) {
        +	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
        +	return elem;
        +}
        +function restoreScript( elem ) {
        +	var match = rscriptTypeMasked.exec( elem.type );
        +
        +	if ( match ) {
        +		elem.type = match[ 1 ];
        +	} else {
        +		elem.removeAttribute( "type" );
        +	}
        +
        +	return elem;
        +}
        +
        +function cloneCopyEvent( src, dest ) {
        +	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
        +
        +	if ( dest.nodeType !== 1 ) {
        +		return;
        +	}
        +
        +	// 1. Copy private data: events, handlers, etc.
        +	if ( dataPriv.hasData( src ) ) {
        +		pdataOld = dataPriv.access( src );
        +		pdataCur = dataPriv.set( dest, pdataOld );
        +		events = pdataOld.events;
        +
        +		if ( events ) {
        +			delete pdataCur.handle;
        +			pdataCur.events = {};
        +
        +			for ( type in events ) {
        +				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
        +					jQuery.event.add( dest, type, events[ type ][ i ] );
        +				}
        +			}
        +		}
        +	}
        +
        +	// 2. Copy user data
        +	if ( dataUser.hasData( src ) ) {
        +		udataOld = dataUser.access( src );
        +		udataCur = jQuery.extend( {}, udataOld );
        +
        +		dataUser.set( dest, udataCur );
        +	}
        +}
        +
        +// Fix IE bugs, see support tests
        +function fixInput( src, dest ) {
        +	var nodeName = dest.nodeName.toLowerCase();
        +
        +	// Fails to persist the checked state of a cloned checkbox or radio button.
        +	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
        +		dest.checked = src.checked;
        +
        +	// Fails to return the selected option to the default selected state when cloning options
        +	} else if ( nodeName === "input" || nodeName === "textarea" ) {
        +		dest.defaultValue = src.defaultValue;
        +	}
        +}
        +
        +function domManip( collection, args, callback, ignored ) {
        +
        +	// Flatten any nested arrays
        +	args = concat.apply( [], args );
        +
        +	var fragment, first, scripts, hasScripts, node, doc,
        +		i = 0,
        +		l = collection.length,
        +		iNoClone = l - 1,
        +		value = args[ 0 ],
        +		isFunction = jQuery.isFunction( value );
        +
        +	// We can't cloneNode fragments that contain checked, in WebKit
        +	if ( isFunction ||
        +			( l > 1 && typeof value === "string" &&
        +				!support.checkClone && rchecked.test( value ) ) ) {
        +		return collection.each( function( index ) {
        +			var self = collection.eq( index );
        +			if ( isFunction ) {
        +				args[ 0 ] = value.call( this, index, self.html() );
        +			}
        +			domManip( self, args, callback, ignored );
        +		} );
        +	}
        +
        +	if ( l ) {
        +		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
        +		first = fragment.firstChild;
        +
        +		if ( fragment.childNodes.length === 1 ) {
        +			fragment = first;
        +		}
        +
        +		// Require either new content or an interest in ignored elements to invoke the callback
        +		if ( first || ignored ) {
        +			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
        +			hasScripts = scripts.length;
        +
        +			// Use the original fragment for the last item
        +			// instead of the first because it can end up
        +			// being emptied incorrectly in certain situations (#8070).
        +			for ( ; i < l; i++ ) {
        +				node = fragment;
        +
        +				if ( i !== iNoClone ) {
        +					node = jQuery.clone( node, true, true );
        +
        +					// Keep references to cloned scripts for later restoration
        +					if ( hasScripts ) {
        +
        +						// Support: Android <=4.0 only, PhantomJS 1 only
        +						// push.apply(_, arraylike) throws on ancient WebKit
        +						jQuery.merge( scripts, getAll( node, "script" ) );
        +					}
        +				}
        +
        +				callback.call( collection[ i ], node, i );
        +			}
        +
        +			if ( hasScripts ) {
        +				doc = scripts[ scripts.length - 1 ].ownerDocument;
        +
        +				// Reenable scripts
        +				jQuery.map( scripts, restoreScript );
        +
        +				// Evaluate executable scripts on first document insertion
        +				for ( i = 0; i < hasScripts; i++ ) {
        +					node = scripts[ i ];
        +					if ( rscriptType.test( node.type || "" ) &&
        +						!dataPriv.access( node, "globalEval" ) &&
        +						jQuery.contains( doc, node ) ) {
        +
        +						if ( node.src ) {
        +
        +							// Optional AJAX dependency, but won't run scripts if not present
        +							if ( jQuery._evalUrl ) {
        +								jQuery._evalUrl( node.src );
        +							}
        +						} else {
        +							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	return collection;
        +}
        +
        +function remove( elem, selector, keepData ) {
        +	var node,
        +		nodes = selector ? jQuery.filter( selector, elem ) : elem,
        +		i = 0;
        +
        +	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
        +		if ( !keepData && node.nodeType === 1 ) {
        +			jQuery.cleanData( getAll( node ) );
        +		}
        +
        +		if ( node.parentNode ) {
        +			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
        +				setGlobalEval( getAll( node, "script" ) );
        +			}
        +			node.parentNode.removeChild( node );
        +		}
        +	}
        +
        +	return elem;
        +}
        +
        +jQuery.extend( {
        +	htmlPrefilter: function( html ) {
        +		return html.replace( rxhtmlTag, "<$1></$2>" );
        +	},
        +
        +	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
        +		var i, l, srcElements, destElements,
        +			clone = elem.cloneNode( true ),
        +			inPage = jQuery.contains( elem.ownerDocument, elem );
        +
        +		// Fix IE cloning issues
        +		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
        +				!jQuery.isXMLDoc( elem ) ) {
        +
        +			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
        +			destElements = getAll( clone );
        +			srcElements = getAll( elem );
        +
        +			for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +				fixInput( srcElements[ i ], destElements[ i ] );
        +			}
        +		}
        +
        +		// Copy the events from the original to the clone
        +		if ( dataAndEvents ) {
        +			if ( deepDataAndEvents ) {
        +				srcElements = srcElements || getAll( elem );
        +				destElements = destElements || getAll( clone );
        +
        +				for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
        +				}
        +			} else {
        +				cloneCopyEvent( elem, clone );
        +			}
        +		}
        +
        +		// Preserve script evaluation history
        +		destElements = getAll( clone, "script" );
        +		if ( destElements.length > 0 ) {
        +			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
        +		}
        +
        +		// Return the cloned set
        +		return clone;
        +	},
        +
        +	cleanData: function( elems ) {
        +		var data, elem, type,
        +			special = jQuery.event.special,
        +			i = 0;
        +
        +		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
        +			if ( acceptData( elem ) ) {
        +				if ( ( data = elem[ dataPriv.expando ] ) ) {
        +					if ( data.events ) {
        +						for ( type in data.events ) {
        +							if ( special[ type ] ) {
        +								jQuery.event.remove( elem, type );
        +
        +							// This is a shortcut to avoid jQuery.event.remove's overhead
        +							} else {
        +								jQuery.removeEvent( elem, type, data.handle );
        +							}
        +						}
        +					}
        +
        +					// Support: Chrome <=35 - 45+
        +					// Assign undefined instead of using delete, see Data#remove
        +					elem[ dataPriv.expando ] = undefined;
        +				}
        +				if ( elem[ dataUser.expando ] ) {
        +
        +					// Support: Chrome <=35 - 45+
        +					// Assign undefined instead of using delete, see Data#remove
        +					elem[ dataUser.expando ] = undefined;
        +				}
        +			}
        +		}
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	detach: function( selector ) {
        +		return remove( this, selector, true );
        +	},
        +
        +	remove: function( selector ) {
        +		return remove( this, selector );
        +	},
        +
        +	text: function( value ) {
        +		return access( this, function( value ) {
        +			return value === undefined ?
        +				jQuery.text( this ) :
        +				this.empty().each( function() {
        +					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +						this.textContent = value;
        +					}
        +				} );
        +		}, null, value, arguments.length );
        +	},
        +
        +	append: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +				var target = manipulationTarget( this, elem );
        +				target.appendChild( elem );
        +			}
        +		} );
        +	},
        +
        +	prepend: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +				var target = manipulationTarget( this, elem );
        +				target.insertBefore( elem, target.firstChild );
        +			}
        +		} );
        +	},
        +
        +	before: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.parentNode ) {
        +				this.parentNode.insertBefore( elem, this );
        +			}
        +		} );
        +	},
        +
        +	after: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.parentNode ) {
        +				this.parentNode.insertBefore( elem, this.nextSibling );
        +			}
        +		} );
        +	},
        +
        +	empty: function() {
        +		var elem,
        +			i = 0;
        +
        +		for ( ; ( elem = this[ i ] ) != null; i++ ) {
        +			if ( elem.nodeType === 1 ) {
        +
        +				// Prevent memory leaks
        +				jQuery.cleanData( getAll( elem, false ) );
        +
        +				// Remove any remaining nodes
        +				elem.textContent = "";
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	clone: function( dataAndEvents, deepDataAndEvents ) {
        +		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
        +		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
        +
        +		return this.map( function() {
        +			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
        +		} );
        +	},
        +
        +	html: function( value ) {
        +		return access( this, function( value ) {
        +			var elem = this[ 0 ] || {},
        +				i = 0,
        +				l = this.length;
        +
        +			if ( value === undefined && elem.nodeType === 1 ) {
        +				return elem.innerHTML;
        +			}
        +
        +			// See if we can take a shortcut and just use innerHTML
        +			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        +				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
        +
        +				value = jQuery.htmlPrefilter( value );
        +
        +				try {
        +					for ( ; i < l; i++ ) {
        +						elem = this[ i ] || {};
        +
        +						// Remove element nodes and prevent memory leaks
        +						if ( elem.nodeType === 1 ) {
        +							jQuery.cleanData( getAll( elem, false ) );
        +							elem.innerHTML = value;
        +						}
        +					}
        +
        +					elem = 0;
        +
        +				// If using innerHTML throws an exception, use the fallback method
        +				} catch ( e ) {}
        +			}
        +
        +			if ( elem ) {
        +				this.empty().append( value );
        +			}
        +		}, null, value, arguments.length );
        +	},
        +
        +	replaceWith: function() {
        +		var ignored = [];
        +
        +		// Make the changes, replacing each non-ignored context element with the new content
        +		return domManip( this, arguments, function( elem ) {
        +			var parent = this.parentNode;
        +
        +			if ( jQuery.inArray( this, ignored ) < 0 ) {
        +				jQuery.cleanData( getAll( this ) );
        +				if ( parent ) {
        +					parent.replaceChild( elem, this );
        +				}
        +			}
        +
        +		// Force callback invocation
        +		}, ignored );
        +	}
        +} );
        +
        +jQuery.each( {
        +	appendTo: "append",
        +	prependTo: "prepend",
        +	insertBefore: "before",
        +	insertAfter: "after",
        +	replaceAll: "replaceWith"
        +}, function( name, original ) {
        +	jQuery.fn[ name ] = function( selector ) {
        +		var elems,
        +			ret = [],
        +			insert = jQuery( selector ),
        +			last = insert.length - 1,
        +			i = 0;
        +
        +		for ( ; i <= last; i++ ) {
        +			elems = i === last ? this : this.clone( true );
        +			jQuery( insert[ i ] )[ original ]( elems );
        +
        +			// Support: Android <=4.0 only, PhantomJS 1 only
        +			// .get() because push.apply(_, arraylike) throws on ancient WebKit
        +			push.apply( ret, elems.get() );
        +		}
        +
        +		return this.pushStack( ret );
        +	};
        +} );
        +var rmargin = ( /^margin/ );
        +
        +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
        +
        +var getStyles = function( elem ) {
        +
        +		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
        +		// IE throws on elements created in popups
        +		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
        +		var view = elem.ownerDocument.defaultView;
        +
        +		if ( !view || !view.opener ) {
        +			view = window;
        +		}
        +
        +		return view.getComputedStyle( elem );
        +	};
        +
        +
        +
        +( function() {
        +
        +	// Executing both pixelPosition & boxSizingReliable tests require only one layout
        +	// so they're executed at the same time to save the second computation.
        +	function computeStyleTests() {
        +
        +		// This is a singleton, we need to execute it only once
        +		if ( !div ) {
        +			return;
        +		}
        +
        +		div.style.cssText =
        +			"box-sizing:border-box;" +
        +			"position:relative;display:block;" +
        +			"margin:auto;border:1px;padding:1px;" +
        +			"top:1%;width:50%";
        +		div.innerHTML = "";
        +		documentElement.appendChild( container );
        +
        +		var divStyle = window.getComputedStyle( div );
        +		pixelPositionVal = divStyle.top !== "1%";
        +
        +		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
        +		reliableMarginLeftVal = divStyle.marginLeft === "2px";
        +		boxSizingReliableVal = divStyle.width === "4px";
        +
        +		// Support: Android 4.0 - 4.3 only
        +		// Some styles come back with percentage values, even though they shouldn't
        +		div.style.marginRight = "50%";
        +		pixelMarginRightVal = divStyle.marginRight === "4px";
        +
        +		documentElement.removeChild( container );
        +
        +		// Nullify the div so it wouldn't be stored in the memory and
        +		// it will also be a sign that checks already performed
        +		div = null;
        +	}
        +
        +	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
        +		container = document.createElement( "div" ),
        +		div = document.createElement( "div" );
        +
        +	// Finish early in limited (non-browser) environments
        +	if ( !div.style ) {
        +		return;
        +	}
        +
        +	// Support: IE <=9 - 11 only
        +	// Style of cloned element affects source element cloned (#8908)
        +	div.style.backgroundClip = "content-box";
        +	div.cloneNode( true ).style.backgroundClip = "";
        +	support.clearCloneStyle = div.style.backgroundClip === "content-box";
        +
        +	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
        +		"padding:0;margin-top:1px;position:absolute";
        +	container.appendChild( div );
        +
        +	jQuery.extend( support, {
        +		pixelPosition: function() {
        +			computeStyleTests();
        +			return pixelPositionVal;
        +		},
        +		boxSizingReliable: function() {
        +			computeStyleTests();
        +			return boxSizingReliableVal;
        +		},
        +		pixelMarginRight: function() {
        +			computeStyleTests();
        +			return pixelMarginRightVal;
        +		},
        +		reliableMarginLeft: function() {
        +			computeStyleTests();
        +			return reliableMarginLeftVal;
        +		}
        +	} );
        +} )();
        +
        +
        +function curCSS( elem, name, computed ) {
        +	var width, minWidth, maxWidth, ret,
        +		style = elem.style;
        +
        +	computed = computed || getStyles( elem );
        +
        +	// Support: IE <=9 only
        +	// getPropertyValue is only needed for .css('filter') (#12537)
        +	if ( computed ) {
        +		ret = computed.getPropertyValue( name ) || computed[ name ];
        +
        +		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
        +			ret = jQuery.style( elem, name );
        +		}
        +
        +		// A tribute to the "awesome hack by Dean Edwards"
        +		// Android Browser returns percentage for some values,
        +		// but width seems to be reliably pixels.
        +		// This is against the CSSOM draft spec:
        +		// https://drafts.csswg.org/cssom/#resolved-values
        +		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
        +
        +			// Remember the original values
        +			width = style.width;
        +			minWidth = style.minWidth;
        +			maxWidth = style.maxWidth;
        +
        +			// Put in the new values to get a computed value out
        +			style.minWidth = style.maxWidth = style.width = ret;
        +			ret = computed.width;
        +
        +			// Revert the changed values
        +			style.width = width;
        +			style.minWidth = minWidth;
        +			style.maxWidth = maxWidth;
        +		}
        +	}
        +
        +	return ret !== undefined ?
        +
        +		// Support: IE <=9 - 11 only
        +		// IE returns zIndex value as an integer.
        +		ret + "" :
        +		ret;
        +}
        +
        +
        +function addGetHookIf( conditionFn, hookFn ) {
        +
        +	// Define the hook, we'll check on the first run if it's really needed.
        +	return {
        +		get: function() {
        +			if ( conditionFn() ) {
        +
        +				// Hook not needed (or it's not possible to use it due
        +				// to missing dependency), remove it.
        +				delete this.get;
        +				return;
        +			}
        +
        +			// Hook needed; redefine it so that the support test is not executed again.
        +			return ( this.get = hookFn ).apply( this, arguments );
        +		}
        +	};
        +}
        +
        +
        +var
        +
        +	// Swappable if display is none or starts with table
        +	// except "table", "table-cell", or "table-caption"
        +	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        +	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
        +	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        +	cssNormalTransform = {
        +		letterSpacing: "0",
        +		fontWeight: "400"
        +	},
        +
        +	cssPrefixes = [ "Webkit", "Moz", "ms" ],
        +	emptyStyle = document.createElement( "div" ).style;
        +
        +// Return a css property mapped to a potentially vendor prefixed property
        +function vendorPropName( name ) {
        +
        +	// Shortcut for names that are not vendor prefixed
        +	if ( name in emptyStyle ) {
        +		return name;
        +	}
        +
        +	// Check for vendor prefixed names
        +	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
        +		i = cssPrefixes.length;
        +
        +	while ( i-- ) {
        +		name = cssPrefixes[ i ] + capName;
        +		if ( name in emptyStyle ) {
        +			return name;
        +		}
        +	}
        +}
        +
        +function setPositiveNumber( elem, value, subtract ) {
        +
        +	// Any relative (+/-) values have already been
        +	// normalized at this point
        +	var matches = rcssNum.exec( value );
        +	return matches ?
        +
        +		// Guard against undefined "subtract", e.g., when used as in cssHooks
        +		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
        +		value;
        +}
        +
        +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
        +	var i,
        +		val = 0;
        +
        +	// If we already have the right measurement, avoid augmentation
        +	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
        +		i = 4;
        +
        +	// Otherwise initialize for horizontal or vertical properties
        +	} else {
        +		i = name === "width" ? 1 : 0;
        +	}
        +
        +	for ( ; i < 4; i += 2 ) {
        +
        +		// Both box models exclude margin, so add it if we want it
        +		if ( extra === "margin" ) {
        +			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
        +		}
        +
        +		if ( isBorderBox ) {
        +
        +			// border-box includes padding, so remove it if we want content
        +			if ( extra === "content" ) {
        +				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +			}
        +
        +			// At this point, extra isn't border nor margin, so remove border
        +			if ( extra !== "margin" ) {
        +				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +			}
        +		} else {
        +
        +			// At this point, extra isn't content, so add padding
        +			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +
        +			// At this point, extra isn't content nor padding, so add border
        +			if ( extra !== "padding" ) {
        +				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +			}
        +		}
        +	}
        +
        +	return val;
        +}
        +
        +function getWidthOrHeight( elem, name, extra ) {
        +
        +	// Start with offset property, which is equivalent to the border-box value
        +	var val,
        +		valueIsBorderBox = true,
        +		styles = getStyles( elem ),
        +		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
        +
        +	// Support: IE <=11 only
        +	// Running getBoundingClientRect on a disconnected node
        +	// in IE throws an error.
        +	if ( elem.getClientRects().length ) {
        +		val = elem.getBoundingClientRect()[ name ];
        +	}
        +
        +	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
        +	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        +	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        +	if ( val <= 0 || val == null ) {
        +
        +		// Fall back to computed then uncomputed css if necessary
        +		val = curCSS( elem, name, styles );
        +		if ( val < 0 || val == null ) {
        +			val = elem.style[ name ];
        +		}
        +
        +		// Computed unit is not pixels. Stop here and return.
        +		if ( rnumnonpx.test( val ) ) {
        +			return val;
        +		}
        +
        +		// Check for style in case a browser which returns unreliable values
        +		// for getComputedStyle silently falls back to the reliable elem.style
        +		valueIsBorderBox = isBorderBox &&
        +			( support.boxSizingReliable() || val === elem.style[ name ] );
        +
        +		// Normalize "", auto, and prepare for extra
        +		val = parseFloat( val ) || 0;
        +	}
        +
        +	// Use the active box-sizing model to add/subtract irrelevant styles
        +	return ( val +
        +		augmentWidthOrHeight(
        +			elem,
        +			name,
        +			extra || ( isBorderBox ? "border" : "content" ),
        +			valueIsBorderBox,
        +			styles
        +		)
        +	) + "px";
        +}
        +
        +jQuery.extend( {
        +
        +	// Add in style property hooks for overriding the default
        +	// behavior of getting and setting a style property
        +	cssHooks: {
        +		opacity: {
        +			get: function( elem, computed ) {
        +				if ( computed ) {
        +
        +					// We should always get a number back from opacity
        +					var ret = curCSS( elem, "opacity" );
        +					return ret === "" ? "1" : ret;
        +				}
        +			}
        +		}
        +	},
        +
        +	// Don't automatically add "px" to these possibly-unitless properties
        +	cssNumber: {
        +		"animationIterationCount": true,
        +		"columnCount": true,
        +		"fillOpacity": true,
        +		"flexGrow": true,
        +		"flexShrink": true,
        +		"fontWeight": true,
        +		"lineHeight": true,
        +		"opacity": true,
        +		"order": true,
        +		"orphans": true,
        +		"widows": true,
        +		"zIndex": true,
        +		"zoom": true
        +	},
        +
        +	// Add in properties whose names you wish to fix before
        +	// setting or getting the value
        +	cssProps: {
        +		"float": "cssFloat"
        +	},
        +
        +	// Get and set the style property on a DOM Node
        +	style: function( elem, name, value, extra ) {
        +
        +		// Don't set styles on text and comment nodes
        +		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        +			return;
        +		}
        +
        +		// Make sure that we're working with the right name
        +		var ret, type, hooks,
        +			origName = jQuery.camelCase( name ),
        +			style = elem.style;
        +
        +		name = jQuery.cssProps[ origName ] ||
        +			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
        +
        +		// Gets hook for the prefixed version, then unprefixed version
        +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +		// Check if we're setting a value
        +		if ( value !== undefined ) {
        +			type = typeof value;
        +
        +			// Convert "+=" or "-=" to relative numbers (#7345)
        +			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
        +				value = adjustCSS( elem, name, ret );
        +
        +				// Fixes bug #9237
        +				type = "number";
        +			}
        +
        +			// Make sure that null and NaN values aren't set (#7116)
        +			if ( value == null || value !== value ) {
        +				return;
        +			}
        +
        +			// If a number was passed in, add the unit (except for certain CSS properties)
        +			if ( type === "number" ) {
        +				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
        +			}
        +
        +			// background-* props affect original clone's values
        +			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
        +				style[ name ] = "inherit";
        +			}
        +
        +			// If a hook was provided, use that value, otherwise just set the specified value
        +			if ( !hooks || !( "set" in hooks ) ||
        +				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
        +
        +				style[ name ] = value;
        +			}
        +
        +		} else {
        +
        +			// If a hook was provided get the non-computed value from there
        +			if ( hooks && "get" in hooks &&
        +				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
        +
        +				return ret;
        +			}
        +
        +			// Otherwise just get the value from the style object
        +			return style[ name ];
        +		}
        +	},
        +
        +	css: function( elem, name, extra, styles ) {
        +		var val, num, hooks,
        +			origName = jQuery.camelCase( name );
        +
        +		// Make sure that we're working with the right name
        +		name = jQuery.cssProps[ origName ] ||
        +			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
        +
        +		// Try prefixed name followed by the unprefixed name
        +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +		// If a hook was provided get the computed value from there
        +		if ( hooks && "get" in hooks ) {
        +			val = hooks.get( elem, true, extra );
        +		}
        +
        +		// Otherwise, if a way to get the computed value exists, use that
        +		if ( val === undefined ) {
        +			val = curCSS( elem, name, styles );
        +		}
        +
        +		// Convert "normal" to computed value
        +		if ( val === "normal" && name in cssNormalTransform ) {
        +			val = cssNormalTransform[ name ];
        +		}
        +
        +		// Make numeric if forced or a qualifier was provided and val looks numeric
        +		if ( extra === "" || extra ) {
        +			num = parseFloat( val );
        +			return extra === true || isFinite( num ) ? num || 0 : val;
        +		}
        +		return val;
        +	}
        +} );
        +
        +jQuery.each( [ "height", "width" ], function( i, name ) {
        +	jQuery.cssHooks[ name ] = {
        +		get: function( elem, computed, extra ) {
        +			if ( computed ) {
        +
        +				// Certain elements can have dimension info if we invisibly show them
        +				// but it must have a current display style that would benefit
        +				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
        +
        +					// Support: Safari 8+
        +					// Table columns in Safari have non-zero offsetWidth & zero
        +					// getBoundingClientRect().width unless display is changed.
        +					// Support: IE <=11 only
        +					// Running getBoundingClientRect on a disconnected node
        +					// in IE throws an error.
        +					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
        +						swap( elem, cssShow, function() {
        +							return getWidthOrHeight( elem, name, extra );
        +						} ) :
        +						getWidthOrHeight( elem, name, extra );
        +			}
        +		},
        +
        +		set: function( elem, value, extra ) {
        +			var matches,
        +				styles = extra && getStyles( elem ),
        +				subtract = extra && augmentWidthOrHeight(
        +					elem,
        +					name,
        +					extra,
        +					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
        +					styles
        +				);
        +
        +			// Convert to pixels if value adjustment is needed
        +			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
        +				( matches[ 3 ] || "px" ) !== "px" ) {
        +
        +				elem.style[ name ] = value;
        +				value = jQuery.css( elem, name );
        +			}
        +
        +			return setPositiveNumber( elem, value, subtract );
        +		}
        +	};
        +} );
        +
        +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
        +	function( elem, computed ) {
        +		if ( computed ) {
        +			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
        +				elem.getBoundingClientRect().left -
        +					swap( elem, { marginLeft: 0 }, function() {
        +						return elem.getBoundingClientRect().left;
        +					} )
        +				) + "px";
        +		}
        +	}
        +);
        +
        +// These hooks are used by animate to expand properties
        +jQuery.each( {
        +	margin: "",
        +	padding: "",
        +	border: "Width"
        +}, function( prefix, suffix ) {
        +	jQuery.cssHooks[ prefix + suffix ] = {
        +		expand: function( value ) {
        +			var i = 0,
        +				expanded = {},
        +
        +				// Assumes a single number if not a string
        +				parts = typeof value === "string" ? value.split( " " ) : [ value ];
        +
        +			for ( ; i < 4; i++ ) {
        +				expanded[ prefix + cssExpand[ i ] + suffix ] =
        +					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
        +			}
        +
        +			return expanded;
        +		}
        +	};
        +
        +	if ( !rmargin.test( prefix ) ) {
        +		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	css: function( name, value ) {
        +		return access( this, function( elem, name, value ) {
        +			var styles, len,
        +				map = {},
        +				i = 0;
        +
        +			if ( jQuery.isArray( name ) ) {
        +				styles = getStyles( elem );
        +				len = name.length;
        +
        +				for ( ; i < len; i++ ) {
        +					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
        +				}
        +
        +				return map;
        +			}
        +
        +			return value !== undefined ?
        +				jQuery.style( elem, name, value ) :
        +				jQuery.css( elem, name );
        +		}, name, value, arguments.length > 1 );
        +	}
        +} );
        +
        +
        +// Based off of the plugin by Clint Helfers, with permission.
        +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
        +jQuery.fn.delay = function( time, type ) {
        +	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
        +	type = type || "fx";
        +
        +	return this.queue( type, function( next, hooks ) {
        +		var timeout = window.setTimeout( next, time );
        +		hooks.stop = function() {
        +			window.clearTimeout( timeout );
        +		};
        +	} );
        +};
        +
        +
        +( function() {
        +	var input = document.createElement( "input" ),
        +		select = document.createElement( "select" ),
        +		opt = select.appendChild( document.createElement( "option" ) );
        +
        +	input.type = "checkbox";
        +
        +	// Support: Android <=4.3 only
        +	// Default value for a checkbox should be "on"
        +	support.checkOn = input.value !== "";
        +
        +	// Support: IE <=11 only
        +	// Must access selectedIndex to make default options select
        +	support.optSelected = opt.selected;
        +
        +	// Support: IE <=11 only
        +	// An input loses its value after becoming a radio
        +	input = document.createElement( "input" );
        +	input.value = "t";
        +	input.type = "radio";
        +	support.radioValue = input.value === "t";
        +} )();
        +
        +
        +var boolHook,
        +	attrHandle = jQuery.expr.attrHandle;
        +
        +jQuery.fn.extend( {
        +	attr: function( name, value ) {
        +		return access( this, jQuery.attr, name, value, arguments.length > 1 );
        +	},
        +
        +	removeAttr: function( name ) {
        +		return this.each( function() {
        +			jQuery.removeAttr( this, name );
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	attr: function( elem, name, value ) {
        +		var ret, hooks,
        +			nType = elem.nodeType;
        +
        +		// Don't get/set attributes on text, comment and attribute nodes
        +		if ( nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		// Fallback to prop when attributes are not supported
        +		if ( typeof elem.getAttribute === "undefined" ) {
        +			return jQuery.prop( elem, name, value );
        +		}
        +
        +		// Attribute hooks are determined by the lowercase version
        +		// Grab necessary hook if one is defined
        +		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
        +			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
        +				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
        +		}
        +
        +		if ( value !== undefined ) {
        +			if ( value === null ) {
        +				jQuery.removeAttr( elem, name );
        +				return;
        +			}
        +
        +			if ( hooks && "set" in hooks &&
        +				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
        +				return ret;
        +			}
        +
        +			elem.setAttribute( name, value + "" );
        +			return value;
        +		}
        +
        +		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
        +			return ret;
        +		}
        +
        +		ret = jQuery.find.attr( elem, name );
        +
        +		// Non-existent attributes return null, we normalize to undefined
        +		return ret == null ? undefined : ret;
        +	},
        +
        +	attrHooks: {
        +		type: {
        +			set: function( elem, value ) {
        +				if ( !support.radioValue && value === "radio" &&
        +					jQuery.nodeName( elem, "input" ) ) {
        +					var val = elem.value;
        +					elem.setAttribute( "type", value );
        +					if ( val ) {
        +						elem.value = val;
        +					}
        +					return value;
        +				}
        +			}
        +		}
        +	},
        +
        +	removeAttr: function( elem, value ) {
        +		var name,
        +			i = 0,
        +
        +			// Attribute names can contain non-HTML whitespace characters
        +			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
        +			attrNames = value && value.match( rnothtmlwhite );
        +
        +		if ( attrNames && elem.nodeType === 1 ) {
        +			while ( ( name = attrNames[ i++ ] ) ) {
        +				elem.removeAttribute( name );
        +			}
        +		}
        +	}
        +} );
        +
        +// Hooks for boolean attributes
        +boolHook = {
        +	set: function( elem, value, name ) {
        +		if ( value === false ) {
        +
        +			// Remove boolean attributes when set to false
        +			jQuery.removeAttr( elem, name );
        +		} else {
        +			elem.setAttribute( name, name );
        +		}
        +		return name;
        +	}
        +};
        +
        +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
        +	var getter = attrHandle[ name ] || jQuery.find.attr;
        +
        +	attrHandle[ name ] = function( elem, name, isXML ) {
        +		var ret, handle,
        +			lowercaseName = name.toLowerCase();
        +
        +		if ( !isXML ) {
        +
        +			// Avoid an infinite loop by temporarily removing this function from the getter
        +			handle = attrHandle[ lowercaseName ];
        +			attrHandle[ lowercaseName ] = ret;
        +			ret = getter( elem, name, isXML ) != null ?
        +				lowercaseName :
        +				null;
        +			attrHandle[ lowercaseName ] = handle;
        +		}
        +		return ret;
        +	};
        +} );
        +
        +
        +
        +
        +var rfocusable = /^(?:input|select|textarea|button)$/i,
        +	rclickable = /^(?:a|area)$/i;
        +
        +jQuery.fn.extend( {
        +	prop: function( name, value ) {
        +		return access( this, jQuery.prop, name, value, arguments.length > 1 );
        +	},
        +
        +	removeProp: function( name ) {
        +		return this.each( function() {
        +			delete this[ jQuery.propFix[ name ] || name ];
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	prop: function( elem, name, value ) {
        +		var ret, hooks,
        +			nType = elem.nodeType;
        +
        +		// Don't get/set properties on text, comment and attribute nodes
        +		if ( nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
        +
        +			// Fix name and attach hooks
        +			name = jQuery.propFix[ name ] || name;
        +			hooks = jQuery.propHooks[ name ];
        +		}
        +
        +		if ( value !== undefined ) {
        +			if ( hooks && "set" in hooks &&
        +				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
        +				return ret;
        +			}
        +
        +			return ( elem[ name ] = value );
        +		}
        +
        +		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
        +			return ret;
        +		}
        +
        +		return elem[ name ];
        +	},
        +
        +	propHooks: {
        +		tabIndex: {
        +			get: function( elem ) {
        +
        +				// Support: IE <=9 - 11 only
        +				// elem.tabIndex doesn't always return the
        +				// correct value when it hasn't been explicitly set
        +				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
        +				// Use proper attribute retrieval(#12072)
        +				var tabindex = jQuery.find.attr( elem, "tabindex" );
        +
        +				if ( tabindex ) {
        +					return parseInt( tabindex, 10 );
        +				}
        +
        +				if (
        +					rfocusable.test( elem.nodeName ) ||
        +					rclickable.test( elem.nodeName ) &&
        +					elem.href
        +				) {
        +					return 0;
        +				}
        +
        +				return -1;
        +			}
        +		}
        +	},
        +
        +	propFix: {
        +		"for": "htmlFor",
        +		"class": "className"
        +	}
        +} );
        +
        +// Support: IE <=11 only
        +// Accessing the selectedIndex property
        +// forces the browser to respect setting selected
        +// on the option
        +// The getter ensures a default option is selected
        +// when in an optgroup
        +// eslint rule "no-unused-expressions" is disabled for this code
        +// since it considers such accessions noop
        +if ( !support.optSelected ) {
        +	jQuery.propHooks.selected = {
        +		get: function( elem ) {
        +
        +			/* eslint no-unused-expressions: "off" */
        +
        +			var parent = elem.parentNode;
        +			if ( parent && parent.parentNode ) {
        +				parent.parentNode.selectedIndex;
        +			}
        +			return null;
        +		},
        +		set: function( elem ) {
        +
        +			/* eslint no-unused-expressions: "off" */
        +
        +			var parent = elem.parentNode;
        +			if ( parent ) {
        +				parent.selectedIndex;
        +
        +				if ( parent.parentNode ) {
        +					parent.parentNode.selectedIndex;
        +				}
        +			}
        +		}
        +	};
        +}
        +
        +jQuery.each( [
        +	"tabIndex",
        +	"readOnly",
        +	"maxLength",
        +	"cellSpacing",
        +	"cellPadding",
        +	"rowSpan",
        +	"colSpan",
        +	"useMap",
        +	"frameBorder",
        +	"contentEditable"
        +], function() {
        +	jQuery.propFix[ this.toLowerCase() ] = this;
        +} );
        +
        +
        +
        +
        +	// Strip and collapse whitespace according to HTML spec
        +	// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
        +	function stripAndCollapse( value ) {
        +		var tokens = value.match( rnothtmlwhite ) || [];
        +		return tokens.join( " " );
        +	}
        +
        +
        +function getClass( elem ) {
        +	return elem.getAttribute && elem.getAttribute( "class" ) || "";
        +}
        +
        +jQuery.fn.extend( {
        +	addClass: function( value ) {
        +		var classes, elem, cur, curValue, clazz, j, finalValue,
        +			i = 0;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( j ) {
        +				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
        +			} );
        +		}
        +
        +		if ( typeof value === "string" && value ) {
        +			classes = value.match( rnothtmlwhite ) || [];
        +
        +			while ( ( elem = this[ i++ ] ) ) {
        +				curValue = getClass( elem );
        +				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
        +
        +				if ( cur ) {
        +					j = 0;
        +					while ( ( clazz = classes[ j++ ] ) ) {
        +						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
        +							cur += clazz + " ";
        +						}
        +					}
        +
        +					// Only assign if different to avoid unneeded rendering.
        +					finalValue = stripAndCollapse( cur );
        +					if ( curValue !== finalValue ) {
        +						elem.setAttribute( "class", finalValue );
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	removeClass: function( value ) {
        +		var classes, elem, cur, curValue, clazz, j, finalValue,
        +			i = 0;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( j ) {
        +				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
        +			} );
        +		}
        +
        +		if ( !arguments.length ) {
        +			return this.attr( "class", "" );
        +		}
        +
        +		if ( typeof value === "string" && value ) {
        +			classes = value.match( rnothtmlwhite ) || [];
        +
        +			while ( ( elem = this[ i++ ] ) ) {
        +				curValue = getClass( elem );
        +
        +				// This expression is here for better compressibility (see addClass)
        +				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
        +
        +				if ( cur ) {
        +					j = 0;
        +					while ( ( clazz = classes[ j++ ] ) ) {
        +
        +						// Remove *all* instances
        +						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
        +							cur = cur.replace( " " + clazz + " ", " " );
        +						}
        +					}
        +
        +					// Only assign if different to avoid unneeded rendering.
        +					finalValue = stripAndCollapse( cur );
        +					if ( curValue !== finalValue ) {
        +						elem.setAttribute( "class", finalValue );
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	toggleClass: function( value, stateVal ) {
        +		var type = typeof value;
        +
        +		if ( typeof stateVal === "boolean" && type === "string" ) {
        +			return stateVal ? this.addClass( value ) : this.removeClass( value );
        +		}
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( i ) {
        +				jQuery( this ).toggleClass(
        +					value.call( this, i, getClass( this ), stateVal ),
        +					stateVal
        +				);
        +			} );
        +		}
        +
        +		return this.each( function() {
        +			var className, i, self, classNames;
        +
        +			if ( type === "string" ) {
        +
        +				// Toggle individual class names
        +				i = 0;
        +				self = jQuery( this );
        +				classNames = value.match( rnothtmlwhite ) || [];
        +
        +				while ( ( className = classNames[ i++ ] ) ) {
        +
        +					// Check each className given, space separated list
        +					if ( self.hasClass( className ) ) {
        +						self.removeClass( className );
        +					} else {
        +						self.addClass( className );
        +					}
        +				}
        +
        +			// Toggle whole class name
        +			} else if ( value === undefined || type === "boolean" ) {
        +				className = getClass( this );
        +				if ( className ) {
        +
        +					// Store className if set
        +					dataPriv.set( this, "__className__", className );
        +				}
        +
        +				// If the element has a class name or if we're passed `false`,
        +				// then remove the whole classname (if there was one, the above saved it).
        +				// Otherwise bring back whatever was previously saved (if anything),
        +				// falling back to the empty string if nothing was stored.
        +				if ( this.setAttribute ) {
        +					this.setAttribute( "class",
        +						className || value === false ?
        +						"" :
        +						dataPriv.get( this, "__className__" ) || ""
        +					);
        +				}
        +			}
        +		} );
        +	},
        +
        +	hasClass: function( selector ) {
        +		var className, elem,
        +			i = 0;
        +
        +		className = " " + selector + " ";
        +		while ( ( elem = this[ i++ ] ) ) {
        +			if ( elem.nodeType === 1 &&
        +				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
        +					return true;
        +			}
        +		}
        +
        +		return false;
        +	}
        +} );
        +
        +
        +
        +
        +var rreturn = /\r/g;
        +
        +jQuery.fn.extend( {
        +	val: function( value ) {
        +		var hooks, ret, isFunction,
        +			elem = this[ 0 ];
        +
        +		if ( !arguments.length ) {
        +			if ( elem ) {
        +				hooks = jQuery.valHooks[ elem.type ] ||
        +					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
        +
        +				if ( hooks &&
        +					"get" in hooks &&
        +					( ret = hooks.get( elem, "value" ) ) !== undefined
        +				) {
        +					return ret;
        +				}
        +
        +				ret = elem.value;
        +
        +				// Handle most common string cases
        +				if ( typeof ret === "string" ) {
        +					return ret.replace( rreturn, "" );
        +				}
        +
        +				// Handle cases where value is null/undef or number
        +				return ret == null ? "" : ret;
        +			}
        +
        +			return;
        +		}
        +
        +		isFunction = jQuery.isFunction( value );
        +
        +		return this.each( function( i ) {
        +			var val;
        +
        +			if ( this.nodeType !== 1 ) {
        +				return;
        +			}
        +
        +			if ( isFunction ) {
        +				val = value.call( this, i, jQuery( this ).val() );
        +			} else {
        +				val = value;
        +			}
        +
        +			// Treat null/undefined as ""; convert numbers to string
        +			if ( val == null ) {
        +				val = "";
        +
        +			} else if ( typeof val === "number" ) {
        +				val += "";
        +
        +			} else if ( jQuery.isArray( val ) ) {
        +				val = jQuery.map( val, function( value ) {
        +					return value == null ? "" : value + "";
        +				} );
        +			}
        +
        +			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
        +
        +			// If set returns undefined, fall back to normal setting
        +			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
        +				this.value = val;
        +			}
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	valHooks: {
        +		option: {
        +			get: function( elem ) {
        +
        +				var val = jQuery.find.attr( elem, "value" );
        +				return val != null ?
        +					val :
        +
        +					// Support: IE <=10 - 11 only
        +					// option.text throws exceptions (#14686, #14858)
        +					// Strip and collapse whitespace
        +					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
        +					stripAndCollapse( jQuery.text( elem ) );
        +			}
        +		},
        +		select: {
        +			get: function( elem ) {
        +				var value, option, i,
        +					options = elem.options,
        +					index = elem.selectedIndex,
        +					one = elem.type === "select-one",
        +					values = one ? null : [],
        +					max = one ? index + 1 : options.length;
        +
        +				if ( index < 0 ) {
        +					i = max;
        +
        +				} else {
        +					i = one ? index : 0;
        +				}
        +
        +				// Loop through all the selected options
        +				for ( ; i < max; i++ ) {
        +					option = options[ i ];
        +
        +					// Support: IE <=9 only
        +					// IE8-9 doesn't update selected after form reset (#2551)
        +					if ( ( option.selected || i === index ) &&
        +
        +							// Don't return options that are disabled or in a disabled optgroup
        +							!option.disabled &&
        +							( !option.parentNode.disabled ||
        +								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
        +
        +						// Get the specific value for the option
        +						value = jQuery( option ).val();
        +
        +						// We don't need an array for one selects
        +						if ( one ) {
        +							return value;
        +						}
        +
        +						// Multi-Selects return an array
        +						values.push( value );
        +					}
        +				}
        +
        +				return values;
        +			},
        +
        +			set: function( elem, value ) {
        +				var optionSet, option,
        +					options = elem.options,
        +					values = jQuery.makeArray( value ),
        +					i = options.length;
        +
        +				while ( i-- ) {
        +					option = options[ i ];
        +
        +					/* eslint-disable no-cond-assign */
        +
        +					if ( option.selected =
        +						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
        +					) {
        +						optionSet = true;
        +					}
        +
        +					/* eslint-enable no-cond-assign */
        +				}
        +
        +				// Force browsers to behave consistently when non-matching value is set
        +				if ( !optionSet ) {
        +					elem.selectedIndex = -1;
        +				}
        +				return values;
        +			}
        +		}
        +	}
        +} );
        +
        +// Radios and checkboxes getter/setter
        +jQuery.each( [ "radio", "checkbox" ], function() {
        +	jQuery.valHooks[ this ] = {
        +		set: function( elem, value ) {
        +			if ( jQuery.isArray( value ) ) {
        +				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
        +			}
        +		}
        +	};
        +	if ( !support.checkOn ) {
        +		jQuery.valHooks[ this ].get = function( elem ) {
        +			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
        +		};
        +	}
        +} );
        +
        +
        +
        +
        +// Return jQuery for attributes-only inclusion
        +
        +
        +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
        +
        +jQuery.extend( jQuery.event, {
        +
        +	trigger: function( event, data, elem, onlyHandlers ) {
        +
        +		var i, cur, tmp, bubbleType, ontype, handle, special,
        +			eventPath = [ elem || document ],
        +			type = hasOwn.call( event, "type" ) ? event.type : event,
        +			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
        +
        +		cur = tmp = elem = elem || document;
        +
        +		// Don't do events on text and comment nodes
        +		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        +			return;
        +		}
        +
        +		// focus/blur morphs to focusin/out; ensure we're not firing them right now
        +		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        +			return;
        +		}
        +
        +		if ( type.indexOf( "." ) > -1 ) {
        +
        +			// Namespaced trigger; create a regexp to match event type in handle()
        +			namespaces = type.split( "." );
        +			type = namespaces.shift();
        +			namespaces.sort();
        +		}
        +		ontype = type.indexOf( ":" ) < 0 && "on" + type;
        +
        +		// Caller can pass in a jQuery.Event object, Object, or just an event type string
        +		event = event[ jQuery.expando ] ?
        +			event :
        +			new jQuery.Event( type, typeof event === "object" && event );
        +
        +		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
        +		event.isTrigger = onlyHandlers ? 2 : 3;
        +		event.namespace = namespaces.join( "." );
        +		event.rnamespace = event.namespace ?
        +			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
        +			null;
        +
        +		// Clean up the event in case it is being reused
        +		event.result = undefined;
        +		if ( !event.target ) {
        +			event.target = elem;
        +		}
        +
        +		// Clone any incoming data and prepend the event, creating the handler arg list
        +		data = data == null ?
        +			[ event ] :
        +			jQuery.makeArray( data, [ event ] );
        +
        +		// Allow special events to draw outside the lines
        +		special = jQuery.event.special[ type ] || {};
        +		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
        +			return;
        +		}
        +
        +		// Determine event propagation path in advance, per W3C events spec (#9951)
        +		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
        +		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
        +
        +			bubbleType = special.delegateType || type;
        +			if ( !rfocusMorph.test( bubbleType + type ) ) {
        +				cur = cur.parentNode;
        +			}
        +			for ( ; cur; cur = cur.parentNode ) {
        +				eventPath.push( cur );
        +				tmp = cur;
        +			}
        +
        +			// Only add window if we got to document (e.g., not plain obj or detached DOM)
        +			if ( tmp === ( elem.ownerDocument || document ) ) {
        +				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
        +			}
        +		}
        +
        +		// Fire handlers on the event path
        +		i = 0;
        +		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
        +
        +			event.type = i > 1 ?
        +				bubbleType :
        +				special.bindType || type;
        +
        +			// jQuery handler
        +			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
        +				dataPriv.get( cur, "handle" );
        +			if ( handle ) {
        +				handle.apply( cur, data );
        +			}
        +
        +			// Native handler
        +			handle = ontype && cur[ ontype ];
        +			if ( handle && handle.apply && acceptData( cur ) ) {
        +				event.result = handle.apply( cur, data );
        +				if ( event.result === false ) {
        +					event.preventDefault();
        +				}
        +			}
        +		}
        +		event.type = type;
        +
        +		// If nobody prevented the default action, do it now
        +		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
        +
        +			if ( ( !special._default ||
        +				special._default.apply( eventPath.pop(), data ) === false ) &&
        +				acceptData( elem ) ) {
        +
        +				// Call a native DOM method on the target with the same name as the event.
        +				// Don't do default actions on window, that's where global variables be (#6170)
        +				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
        +
        +					// Don't re-trigger an onFOO event when we call its FOO() method
        +					tmp = elem[ ontype ];
        +
        +					if ( tmp ) {
        +						elem[ ontype ] = null;
        +					}
        +
        +					// Prevent re-triggering of the same event, since we already bubbled it above
        +					jQuery.event.triggered = type;
        +					elem[ type ]();
        +					jQuery.event.triggered = undefined;
        +
        +					if ( tmp ) {
        +						elem[ ontype ] = tmp;
        +					}
        +				}
        +			}
        +		}
        +
        +		return event.result;
        +	},
        +
        +	// Piggyback on a donor event to simulate a different one
        +	// Used only for `focus(in | out)` events
        +	simulate: function( type, elem, event ) {
        +		var e = jQuery.extend(
        +			new jQuery.Event(),
        +			event,
        +			{
        +				type: type,
        +				isSimulated: true
        +			}
        +		);
        +
        +		jQuery.event.trigger( e, null, elem );
        +	}
        +
        +} );
        +
        +jQuery.fn.extend( {
        +
        +	trigger: function( type, data ) {
        +		return this.each( function() {
        +			jQuery.event.trigger( type, data, this );
        +		} );
        +	},
        +	triggerHandler: function( type, data ) {
        +		var elem = this[ 0 ];
        +		if ( elem ) {
        +			return jQuery.event.trigger( type, data, elem, true );
        +		}
        +	}
        +} );
        +
        +
        +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
        +	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
        +	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
        +	function( i, name ) {
        +
        +	// Handle event binding
        +	jQuery.fn[ name ] = function( data, fn ) {
        +		return arguments.length > 0 ?
        +			this.on( name, null, data, fn ) :
        +			this.trigger( name );
        +	};
        +} );
        +
        +jQuery.fn.extend( {
        +	hover: function( fnOver, fnOut ) {
        +		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        +	}
        +} );
        +
        +
        +
        +
        +support.focusin = "onfocusin" in window;
        +
        +
        +// Support: Firefox <=44
        +// Firefox doesn't have focus(in | out) events
        +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
        +//
        +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
        +// focus(in | out) events fire after focus & blur events,
        +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
        +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
        +if ( !support.focusin ) {
        +	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
        +
        +		// Attach a single capturing handler on the document while someone wants focusin/focusout
        +		var handler = function( event ) {
        +			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
        +		};
        +
        +		jQuery.event.special[ fix ] = {
        +			setup: function() {
        +				var doc = this.ownerDocument || this,
        +					attaches = dataPriv.access( doc, fix );
        +
        +				if ( !attaches ) {
        +					doc.addEventListener( orig, handler, true );
        +				}
        +				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
        +			},
        +			teardown: function() {
        +				var doc = this.ownerDocument || this,
        +					attaches = dataPriv.access( doc, fix ) - 1;
        +
        +				if ( !attaches ) {
        +					doc.removeEventListener( orig, handler, true );
        +					dataPriv.remove( doc, fix );
        +
        +				} else {
        +					dataPriv.access( doc, fix, attaches );
        +				}
        +			}
        +		};
        +	} );
        +}
        +
        +
        +var
        +	rbracket = /\[\]$/,
        +	rCRLF = /\r?\n/g,
        +	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
        +	rsubmittable = /^(?:input|select|textarea|keygen)/i;
        +
        +function buildParams( prefix, obj, traditional, add ) {
        +	var name;
        +
        +	if ( jQuery.isArray( obj ) ) {
        +
        +		// Serialize array item.
        +		jQuery.each( obj, function( i, v ) {
        +			if ( traditional || rbracket.test( prefix ) ) {
        +
        +				// Treat each array item as a scalar.
        +				add( prefix, v );
        +
        +			} else {
        +
        +				// Item is non-scalar (array or object), encode its numeric index.
        +				buildParams(
        +					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
        +					v,
        +					traditional,
        +					add
        +				);
        +			}
        +		} );
        +
        +	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
        +
        +		// Serialize object item.
        +		for ( name in obj ) {
        +			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
        +		}
        +
        +	} else {
        +
        +		// Serialize scalar item.
        +		add( prefix, obj );
        +	}
        +}
        +
        +// Serialize an array of form elements or a set of
        +// key/values into a query string
        +jQuery.param = function( a, traditional ) {
        +	var prefix,
        +		s = [],
        +		add = function( key, valueOrFunction ) {
        +
        +			// If value is a function, invoke it and use its return value
        +			var value = jQuery.isFunction( valueOrFunction ) ?
        +				valueOrFunction() :
        +				valueOrFunction;
        +
        +			s[ s.length ] = encodeURIComponent( key ) + "=" +
        +				encodeURIComponent( value == null ? "" : value );
        +		};
        +
        +	// If an array was passed in, assume that it is an array of form elements.
        +	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        +
        +		// Serialize the form elements
        +		jQuery.each( a, function() {
        +			add( this.name, this.value );
        +		} );
        +
        +	} else {
        +
        +		// If traditional, encode the "old" way (the way 1.3.2 or older
        +		// did it), otherwise encode params recursively.
        +		for ( prefix in a ) {
        +			buildParams( prefix, a[ prefix ], traditional, add );
        +		}
        +	}
        +
        +	// Return the resulting serialization
        +	return s.join( "&" );
        +};
        +
        +jQuery.fn.extend( {
        +	serialize: function() {
        +		return jQuery.param( this.serializeArray() );
        +	},
        +	serializeArray: function() {
        +		return this.map( function() {
        +
        +			// Can add propHook for "elements" to filter or add form elements
        +			var elements = jQuery.prop( this, "elements" );
        +			return elements ? jQuery.makeArray( elements ) : this;
        +		} )
        +		.filter( function() {
        +			var type = this.type;
        +
        +			// Use .is( ":disabled" ) so that fieldset[disabled] works
        +			return this.name && !jQuery( this ).is( ":disabled" ) &&
        +				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
        +				( this.checked || !rcheckableType.test( type ) );
        +		} )
        +		.map( function( i, elem ) {
        +			var val = jQuery( this ).val();
        +
        +			if ( val == null ) {
        +				return null;
        +			}
        +
        +			if ( jQuery.isArray( val ) ) {
        +				return jQuery.map( val, function( val ) {
        +					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +				} );
        +			}
        +
        +			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +		} ).get();
        +	}
        +} );
        +
        +
        +jQuery.fn.extend( {
        +	wrapAll: function( html ) {
        +		var wrap;
        +
        +		if ( this[ 0 ] ) {
        +			if ( jQuery.isFunction( html ) ) {
        +				html = html.call( this[ 0 ] );
        +			}
        +
        +			// The elements to wrap the target around
        +			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
        +
        +			if ( this[ 0 ].parentNode ) {
        +				wrap.insertBefore( this[ 0 ] );
        +			}
        +
        +			wrap.map( function() {
        +				var elem = this;
        +
        +				while ( elem.firstElementChild ) {
        +					elem = elem.firstElementChild;
        +				}
        +
        +				return elem;
        +			} ).append( this );
        +		}
        +
        +		return this;
        +	},
        +
        +	wrapInner: function( html ) {
        +		if ( jQuery.isFunction( html ) ) {
        +			return this.each( function( i ) {
        +				jQuery( this ).wrapInner( html.call( this, i ) );
        +			} );
        +		}
        +
        +		return this.each( function() {
        +			var self = jQuery( this ),
        +				contents = self.contents();
        +
        +			if ( contents.length ) {
        +				contents.wrapAll( html );
        +
        +			} else {
        +				self.append( html );
        +			}
        +		} );
        +	},
        +
        +	wrap: function( html ) {
        +		var isFunction = jQuery.isFunction( html );
        +
        +		return this.each( function( i ) {
        +			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
        +		} );
        +	},
        +
        +	unwrap: function( selector ) {
        +		this.parent( selector ).not( "body" ).each( function() {
        +			jQuery( this ).replaceWith( this.childNodes );
        +		} );
        +		return this;
        +	}
        +} );
        +
        +
        +jQuery.expr.pseudos.hidden = function( elem ) {
        +	return !jQuery.expr.pseudos.visible( elem );
        +};
        +jQuery.expr.pseudos.visible = function( elem ) {
        +	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
        +};
        +
        +
        +
        +
        +// Support: Safari 8 only
        +// In Safari 8 documents created via document.implementation.createHTMLDocument
        +// collapse sibling forms: the second one becomes a child of the first one.
        +// Because of that, this security measure has to be disabled in Safari 8.
        +// https://bugs.webkit.org/show_bug.cgi?id=137337
        +support.createHTMLDocument = ( function() {
        +	var body = document.implementation.createHTMLDocument( "" ).body;
        +	body.innerHTML = "<form></form><form></form>";
        +	return body.childNodes.length === 2;
        +} )();
        +
        +
        +// Argument "data" should be string of html
        +// context (optional): If specified, the fragment will be created in this context,
        +// defaults to document
        +// keepScripts (optional): If true, will include scripts passed in the html string
        +jQuery.parseHTML = function( data, context, keepScripts ) {
        +	if ( typeof data !== "string" ) {
        +		return [];
        +	}
        +	if ( typeof context === "boolean" ) {
        +		keepScripts = context;
        +		context = false;
        +	}
        +
        +	var base, parsed, scripts;
        +
        +	if ( !context ) {
        +
        +		// Stop scripts or inline event handlers from being executed immediately
        +		// by using document.implementation
        +		if ( support.createHTMLDocument ) {
        +			context = document.implementation.createHTMLDocument( "" );
        +
        +			// Set the base href for the created document
        +			// so any parsed elements with URLs
        +			// are based on the document's URL (gh-2965)
        +			base = context.createElement( "base" );
        +			base.href = document.location.href;
        +			context.head.appendChild( base );
        +		} else {
        +			context = document;
        +		}
        +	}
        +
        +	parsed = rsingleTag.exec( data );
        +	scripts = !keepScripts && [];
        +
        +	// Single tag
        +	if ( parsed ) {
        +		return [ context.createElement( parsed[ 1 ] ) ];
        +	}
        +
        +	parsed = buildFragment( [ data ], context, scripts );
        +
        +	if ( scripts && scripts.length ) {
        +		jQuery( scripts ).remove();
        +	}
        +
        +	return jQuery.merge( [], parsed.childNodes );
        +};
        +
        +
        +/**
        + * Gets a window from an element
        + */
        +function getWindow( elem ) {
        +	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
        +}
        +
        +jQuery.offset = {
        +	setOffset: function( elem, options, i ) {
        +		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
        +			position = jQuery.css( elem, "position" ),
        +			curElem = jQuery( elem ),
        +			props = {};
        +
        +		// Set position first, in-case top/left are set even on static elem
        +		if ( position === "static" ) {
        +			elem.style.position = "relative";
        +		}
        +
        +		curOffset = curElem.offset();
        +		curCSSTop = jQuery.css( elem, "top" );
        +		curCSSLeft = jQuery.css( elem, "left" );
        +		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
        +			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
        +
        +		// Need to be able to calculate position if either
        +		// top or left is auto and position is either absolute or fixed
        +		if ( calculatePosition ) {
        +			curPosition = curElem.position();
        +			curTop = curPosition.top;
        +			curLeft = curPosition.left;
        +
        +		} else {
        +			curTop = parseFloat( curCSSTop ) || 0;
        +			curLeft = parseFloat( curCSSLeft ) || 0;
        +		}
        +
        +		if ( jQuery.isFunction( options ) ) {
        +
        +			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
        +			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
        +		}
        +
        +		if ( options.top != null ) {
        +			props.top = ( options.top - curOffset.top ) + curTop;
        +		}
        +		if ( options.left != null ) {
        +			props.left = ( options.left - curOffset.left ) + curLeft;
        +		}
        +
        +		if ( "using" in options ) {
        +			options.using.call( elem, props );
        +
        +		} else {
        +			curElem.css( props );
        +		}
        +	}
        +};
        +
        +jQuery.fn.extend( {
        +	offset: function( options ) {
        +
        +		// Preserve chaining for setter
        +		if ( arguments.length ) {
        +			return options === undefined ?
        +				this :
        +				this.each( function( i ) {
        +					jQuery.offset.setOffset( this, options, i );
        +				} );
        +		}
        +
        +		var docElem, win, rect, doc,
        +			elem = this[ 0 ];
        +
        +		if ( !elem ) {
        +			return;
        +		}
        +
        +		// Support: IE <=11 only
        +		// Running getBoundingClientRect on a
        +		// disconnected node in IE throws an error
        +		if ( !elem.getClientRects().length ) {
        +			return { top: 0, left: 0 };
        +		}
        +
        +		rect = elem.getBoundingClientRect();
        +
        +		// Make sure element is not hidden (display: none)
        +		if ( rect.width || rect.height ) {
        +			doc = elem.ownerDocument;
        +			win = getWindow( doc );
        +			docElem = doc.documentElement;
        +
        +			return {
        +				top: rect.top + win.pageYOffset - docElem.clientTop,
        +				left: rect.left + win.pageXOffset - docElem.clientLeft
        +			};
        +		}
        +
        +		// Return zeros for disconnected and hidden elements (gh-2310)
        +		return rect;
        +	},
        +
        +	position: function() {
        +		if ( !this[ 0 ] ) {
        +			return;
        +		}
        +
        +		var offsetParent, offset,
        +			elem = this[ 0 ],
        +			parentOffset = { top: 0, left: 0 };
        +
        +		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
        +		// because it is its only offset parent
        +		if ( jQuery.css( elem, "position" ) === "fixed" ) {
        +
        +			// Assume getBoundingClientRect is there when computed position is fixed
        +			offset = elem.getBoundingClientRect();
        +
        +		} else {
        +
        +			// Get *real* offsetParent
        +			offsetParent = this.offsetParent();
        +
        +			// Get correct offsets
        +			offset = this.offset();
        +			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
        +				parentOffset = offsetParent.offset();
        +			}
        +
        +			// Add offsetParent borders
        +			parentOffset = {
        +				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
        +				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
        +			};
        +		}
        +
        +		// Subtract parent offsets and element margins
        +		return {
        +			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
        +			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
        +		};
        +	},
        +
        +	// This method will return documentElement in the following cases:
        +	// 1) For the element inside the iframe without offsetParent, this method will return
        +	//    documentElement of the parent window
        +	// 2) For the hidden or detached element
        +	// 3) For body or html element, i.e. in case of the html node - it will return itself
        +	//
        +	// but those exceptions were never presented as a real life use-cases
        +	// and might be considered as more preferable results.
        +	//
        +	// This logic, however, is not guaranteed and can change at any point in the future
        +	offsetParent: function() {
        +		return this.map( function() {
        +			var offsetParent = this.offsetParent;
        +
        +			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
        +				offsetParent = offsetParent.offsetParent;
        +			}
        +
        +			return offsetParent || documentElement;
        +		} );
        +	}
        +} );
        +
        +// Create scrollLeft and scrollTop methods
        +jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
        +	var top = "pageYOffset" === prop;
        +
        +	jQuery.fn[ method ] = function( val ) {
        +		return access( this, function( elem, method, val ) {
        +			var win = getWindow( elem );
        +
        +			if ( val === undefined ) {
        +				return win ? win[ prop ] : elem[ method ];
        +			}
        +
        +			if ( win ) {
        +				win.scrollTo(
        +					!top ? val : win.pageXOffset,
        +					top ? val : win.pageYOffset
        +				);
        +
        +			} else {
        +				elem[ method ] = val;
        +			}
        +		}, method, val, arguments.length );
        +	};
        +} );
        +
        +// Support: Safari <=7 - 9.1, Chrome <=37 - 49
        +// Add the top/left cssHooks using jQuery.fn.position
        +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
        +// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
        +// getComputedStyle returns percent when specified for top/left/bottom/right;
        +// rather than make the css module depend on the offset module, just check for it here
        +jQuery.each( [ "top", "left" ], function( i, prop ) {
        +	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
        +		function( elem, computed ) {
        +			if ( computed ) {
        +				computed = curCSS( elem, prop );
        +
        +				// If curCSS returns percentage, fallback to offset
        +				return rnumnonpx.test( computed ) ?
        +					jQuery( elem ).position()[ prop ] + "px" :
        +					computed;
        +			}
        +		}
        +	);
        +} );
        +
        +
        +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
        +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        +	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
        +		function( defaultExtra, funcName ) {
        +
        +		// Margin is only for outerHeight, outerWidth
        +		jQuery.fn[ funcName ] = function( margin, value ) {
        +			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
        +				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
        +
        +			return access( this, function( elem, type, value ) {
        +				var doc;
        +
        +				if ( jQuery.isWindow( elem ) ) {
        +
        +					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
        +					return funcName.indexOf( "outer" ) === 0 ?
        +						elem[ "inner" + name ] :
        +						elem.document.documentElement[ "client" + name ];
        +				}
        +
        +				// Get document width or height
        +				if ( elem.nodeType === 9 ) {
        +					doc = elem.documentElement;
        +
        +					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
        +					// whichever is greatest
        +					return Math.max(
        +						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
        +						elem.body[ "offset" + name ], doc[ "offset" + name ],
        +						doc[ "client" + name ]
        +					);
        +				}
        +
        +				return value === undefined ?
        +
        +					// Get width or height on the element, requesting but not forcing parseFloat
        +					jQuery.css( elem, type, extra ) :
        +
        +					// Set width or height on the element
        +					jQuery.style( elem, type, value, extra );
        +			}, type, chainable ? margin : undefined, chainable );
        +		};
        +	} );
        +} );
        +
        +
        +// Register as a named AMD module, since jQuery can be concatenated with other
        +// files that may use define, but not via a proper concatenation script that
        +// understands anonymous AMD modules. A named AMD is safest and most robust
        +// way to register. Lowercase jquery is used because AMD module names are
        +// derived from file names, and jQuery is normally delivered in a lowercase
        +// file name. Do this after creating the global so that if an AMD module wants
        +// to call noConflict to hide this version of jQuery, it will work.
        +
        +// Note that for maximum portability, libraries that are not jQuery should
        +// declare themselves as anonymous modules, and avoid setting a global if an
        +// AMD loader is present. jQuery is a special case. For more information, see
        +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
        +
        +if ( typeof define === "function" && define.amd ) {
        +	define( "jquery", [], function() {
        +		return jQuery;
        +	} );
        +}
        +
        +
        +
        +
        +var
        +
        +	// Map over jQuery in case of overwrite
        +	_jQuery = window.jQuery,
        +
        +	// Map over the $ in case of overwrite
        +	_$ = window.$;
        +
        +jQuery.noConflict = function( deep ) {
        +	if ( window.$ === jQuery ) {
        +		window.$ = _$;
        +	}
        +
        +	if ( deep && window.jQuery === jQuery ) {
        +		window.jQuery = _jQuery;
        +	}
        +
        +	return jQuery;
        +};
        +
        +// Expose jQuery and $ identifiers, even in AMD
        +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
        +// and CommonJS for browser emulators (#13566)
        +if ( !noGlobal ) {
        +	window.jQuery = window.$ = jQuery;
        +}
        +
        +
        +
        +
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/dist/jquery.slim.min.js b/bower_components/jquery/dist/jquery.slim.min.js
        new file mode 100644
        index 0000000000..a240ca9b2d
        --- /dev/null
        +++ b/bower_components/jquery/dist/jquery.slim.min.js
        @@ -0,0 +1,4 @@
        +/*! jQuery v3.1.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/animatedSelector,-effects/Tween,-deprecated | (c) jQuery Foundation | jquery.org/license */
        +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/animatedSelector,-effects/Tween,-deprecated",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,
        +holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var Ya,Za=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?Ya:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),Ya={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=Za[b]||r.find.attr;Za[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=Za[g],Za[g]=e,e=null!=c(a,b,d)?g:null,Za[g]=f),e}});var $a=/^(?:input|select|textarea|button)$/i,_a=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):$a.test(a.nodeName)||_a.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function ab(a){var b=a.match(K)||[];return b.join(" ")}function bb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,bb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=bb(c),d=1===c.nodeType&&" "+ab(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=ab(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,bb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=bb(c),d=1===c.nodeType&&" "+ab(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=ab(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,bb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=bb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+ab(bb(c))+" ").indexOf(b)>-1)return!0;return!1}});var cb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(cb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:ab(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var db=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!db.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,db.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var eb=/\[\]$/,fb=/\r?\n/g,gb=/^(?:submit|button|image|reset|file)$/i,hb=/^(?:input|select|textarea|keygen)/i;function ib(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||eb.test(a)?d(a,e):ib(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d);
        +});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)ib(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)ib(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&hb.test(this.nodeName)&&!gb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(fb,"\r\n")}}):{name:b.name,value:c.replace(fb,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))};function jb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=jb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=jb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var kb=a.jQuery,lb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=lb),b&&a.jQuery===r&&(a.jQuery=kb),r},b||(a.jQuery=a.$=r),r});
        diff --git a/bower_components/jquery/dist/jquery.slim.min.map b/bower_components/jquery/dist/jquery.slim.min.map
        new file mode 100644
        index 0000000000..8054b9988d
        --- /dev/null
        +++ b/bower_components/jquery/dist/jquery.slim.min.map
        @@ -0,0 +1 @@
        +{"version":3,"sources":["jquery.slim.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","call","support","DOMEval","code","doc","script","createElement","text","head","appendChild","parentNode","removeChild","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","isNaN","parseFloat","proto","Ctor","isEmptyObject","globalEval","camelCase","string","nodeName","toLowerCase","isArrayLike","trim","makeArray","results","inArray","second","grep","invert","callbackInverse","matches","callbackExpect","arg","value","guid","proxy","tmp","args","now","Date","Symbol","iterator","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","pop","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","disabledAncestor","addCombinator","disabled","dir","next","childNodes","nodeType","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","join","testContext","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","escape","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","targets","l","closest","index","prevAll","add","addBack","sibling","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","reverse","rnothtmlwhite","createOptions","object","flag","Callbacks","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Identity","v","Thrower","ex","adoptValue","resolve","reject","method","promise","fail","then","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","readyWait","holdReady","hold","wait","completed","removeEventListener","readyState","doScroll","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","getData","JSON","parse","dataAttr","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isHiddenWithinTree","style","display","css","swap","old","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","body","showHide","show","values","hide","toggle","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","optgroup","tbody","tfoot","colgroup","caption","th","getAll","setGlobalEval","refElements","rhtml","buildFragment","scripts","selection","ignored","wrap","fragment","createDocumentFragment","nodes","htmlPrefilter","createTextNode","div","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","on","types","one","origFn","event","off","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","fix","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","preventDefault","stopPropagation","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","load","noBubble","trigger","blur","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","isSimulated","stopImmediatePropagation","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rxhtmlTag","rnoInnerhtml","rchecked","rscriptTypeMasked","rcleanScript","manipulationTarget","content","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rmargin","rnumnonpx","getStyles","opener","getComputedStyle","computeStyleTests","cssText","container","divStyle","pixelPositionVal","reliableMarginLeftVal","marginLeft","boxSizingReliableVal","width","marginRight","pixelMarginRightVal","backgroundClip","clearCloneStyle","pixelPosition","boxSizingReliable","pixelMarginRight","reliableMarginLeft","curCSS","computed","minWidth","maxWidth","getPropertyValue","addGetHookIf","conditionFn","hookFn","rdisplayswap","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","emptyStyle","vendorPropName","capName","setPositiveNumber","subtract","max","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","getClientRects","getBoundingClientRect","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","cssProps","float","origName","isFinite","left","margin","padding","border","prefix","suffix","expand","expanded","parts","delay","time","fx","speeds","timeout","clearTimeout","opt","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","removeProp","propFix","propHooks","tabindex","parseInt","for","class","stripAndCollapse","getClass","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","classNames","hasClass","rreturn","valHooks","optionSet","rfocusMorph","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","triggerHandler","hover","fnOver","fnOut","focusin","attaches","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","wrapAll","firstElementChild","wrapInner","unwrap","hidden","visible","offsetWidth","offsetHeight","createHTMLDocument","implementation","keepScripts","parsed","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","rect","height","pageYOffset","clientTop","pageXOffset","clientLeft","offsetParent","parentOffset","scrollLeft","scrollTop","scrollTo","Height","Width","","defaultExtra","funcName","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,YAEuB,iBAAXC,SAAiD,gBAAnBA,QAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,KAAM,IAAIE,OAAO,2CAElB,OAAOL,GAASI,IAGlBJ,EAASD,IAIY,mBAAXO,QAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,YAEA,IAAIC,MAEAN,EAAWG,EAAOH,SAElBO,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAASL,EAAIK,OAEbC,EAAON,EAAIM,KAEXC,EAAUP,EAAIO,QAEdC,KAEAC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWE,KAAMZ,QAExCa,IAIH,SAASC,GAASC,EAAMC,GACvBA,EAAMA,GAAOxB,CAEb,IAAIyB,GAASD,EAAIE,cAAe,SAEhCD,GAAOE,KAAOJ,EACdC,EAAII,KAAKC,YAAaJ,GAASK,WAAWC,YAAaN,GAQzD,GACCO,GAAU,gOAGVC,EAAS,SAAUC,EAAUC,GAI5B,MAAO,IAAIF,GAAOG,GAAGC,KAAMH,EAAUC,IAKtCG,EAAQ,qCAGRC,EAAY,QACZC,EAAa,YAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,cAGhBX,GAAOG,GAAKH,EAAOY,WAGlBC,OAAQd,EAERe,YAAad,EAGbe,OAAQ,EAERC,QAAS,WACR,MAAOvC,GAAMU,KAAMhB,OAKpB8C,IAAK,SAAUC,GAGd,MAAY,OAAPA,EACGzC,EAAMU,KAAMhB,MAIb+C,EAAM,EAAI/C,KAAM+C,EAAM/C,KAAK4C,QAAW5C,KAAM+C,IAKpDC,UAAW,SAAUC,GAGpB,GAAIC,GAAMrB,EAAOsB,MAAOnD,KAAK2C,cAAeM,EAM5C,OAHAC,GAAIE,WAAapD,KAGVkD,GAIRG,KAAM,SAAUC,GACf,MAAOzB,GAAOwB,KAAMrD,KAAMsD,IAG3BC,IAAK,SAAUD,GACd,MAAOtD,MAAKgD,UAAWnB,EAAO0B,IAAKvD,KAAM,SAAUwD,EAAMC,GACxD,MAAOH,GAAStC,KAAMwC,EAAMC,EAAGD,OAIjClD,MAAO,WACN,MAAON,MAAKgD,UAAW1C,EAAMoD,MAAO1D,KAAM2D,aAG3CC,MAAO,WACN,MAAO5D,MAAK6D,GAAI,IAGjBC,KAAM,WACL,MAAO9D,MAAK6D,QAGbA,GAAI,SAAUJ,GACb,GAAIM,GAAM/D,KAAK4C,OACdoB,GAAKP,GAAMA,EAAI,EAAIM,EAAM,EAC1B,OAAO/D,MAAKgD,UAAWgB,GAAK,GAAKA,EAAID,GAAQ/D,KAAMgE,SAGpDC,IAAK,WACJ,MAAOjE,MAAKoD,YAAcpD,KAAK2C,eAKhCnC,KAAMA,EACN0D,KAAMhE,EAAIgE,KACVC,OAAQjE,EAAIiE,QAGbtC,EAAOuC,OAASvC,EAAOG,GAAGoC,OAAS,WAClC,GAAIC,GAASC,EAAMC,EAAKC,EAAMC,EAAaC,EAC1CC,EAAShB,UAAW,OACpBF,EAAI,EACJb,EAASe,UAAUf,OACnBgC,GAAO,CAsBR,KAnBuB,iBAAXD,KACXC,EAAOD,EAGPA,EAAShB,UAAWF,OACpBA,KAIsB,gBAAXkB,IAAwB9C,EAAOgD,WAAYF,KACtDA,MAIIlB,IAAMb,IACV+B,EAAS3E,KACTyD,KAGOA,EAAIb,EAAQa,IAGnB,GAAqC,OAA9BY,EAAUV,UAAWF,IAG3B,IAAMa,IAAQD,GACbE,EAAMI,EAAQL,GACdE,EAAOH,EAASC,GAGXK,IAAWH,IAKXI,GAAQJ,IAAU3C,EAAOiD,cAAeN,KAC1CC,EAAc5C,EAAOkD,QAASP,MAE3BC,GACJA,GAAc,EACdC,EAAQH,GAAO1C,EAAOkD,QAASR,GAAQA,MAGvCG,EAAQH,GAAO1C,EAAOiD,cAAeP,GAAQA,KAI9CI,EAAQL,GAASzC,EAAOuC,OAAQQ,EAAMF,EAAOF,IAGzBQ,SAATR,IACXG,EAAQL,GAASE,GAOrB,OAAOG,IAGR9C,EAAOuC,QAGNa,QAAS,UAAarD,EAAUsD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,KAAM,IAAIzF,OAAOyF,IAGlBC,KAAM,aAENX,WAAY,SAAUY,GACrB,MAA8B,aAAvB5D,EAAO6D,KAAMD,IAGrBV,QAASY,MAAMZ,QAEfa,SAAU,SAAUH,GACnB,MAAc,OAAPA,GAAeA,IAAQA,EAAI1F,QAGnC8F,UAAW,SAAUJ,GAKpB,GAAIC,GAAO7D,EAAO6D,KAAMD,EACxB,QAAkB,WAATC,GAA8B,WAATA,KAK5BI,MAAOL,EAAMM,WAAYN,KAG5BX,cAAe,SAAUW,GACxB,GAAIO,GAAOC,CAIX,UAAMR,GAAgC,oBAAzB9E,EAASK,KAAMyE,QAI5BO,EAAQ7F,EAAUsF,MAQlBQ,EAAOrF,EAAOI,KAAMgF,EAAO,gBAAmBA,EAAMrD,YAC7B,kBAATsD,IAAuBnF,EAAWE,KAAMiF,KAAWlF,KAGlEmF,cAAe,SAAUT,GAIxB,GAAInB,EAEJ,KAAMA,IAAQmB,GACb,OAAO,CAER,QAAO,GAGRC,KAAM,SAAUD,GACf,MAAY,OAAPA,EACGA,EAAM,GAIQ,gBAARA,IAAmC,kBAARA,GACxC/E,EAAYC,EAASK,KAAMyE,KAAW,eAC/BA,IAITU,WAAY,SAAUhF,GACrBD,EAASC,IAMViF,UAAW,SAAUC,GACpB,MAAOA,GAAOjB,QAASjD,EAAW,OAAQiD,QAAShD,EAAYC,IAGhEiE,SAAU,SAAU9C,EAAMc,GACzB,MAAOd,GAAK8C,UAAY9C,EAAK8C,SAASC,gBAAkBjC,EAAKiC,eAG9DlD,KAAM,SAAUoC,EAAKnC,GACpB,GAAIV,GAAQa,EAAI,CAEhB,IAAK+C,EAAaf,IAEjB,IADA7C,EAAS6C,EAAI7C,OACLa,EAAIb,EAAQa,IACnB,GAAKH,EAAStC,KAAMyE,EAAKhC,GAAKA,EAAGgC,EAAKhC,OAAU,EAC/C,UAIF,KAAMA,IAAKgC,GACV,GAAKnC,EAAStC,KAAMyE,EAAKhC,GAAKA,EAAGgC,EAAKhC,OAAU,EAC/C,KAKH,OAAOgC,IAIRgB,KAAM,SAAUlF,GACf,MAAe,OAARA,EACN,IACEA,EAAO,IAAK6D,QAASlD,EAAO,KAIhCwE,UAAW,SAAUxG,EAAKyG,GACzB,GAAIzD,GAAMyD,KAaV,OAXY,OAAPzG,IACCsG,EAAapG,OAAQF,IACzB2B,EAAOsB,MAAOD,EACE,gBAARhD,IACLA,GAAQA,GAGXM,EAAKQ,KAAMkC,EAAKhD,IAIXgD,GAGR0D,QAAS,SAAUpD,EAAMtD,EAAKuD,GAC7B,MAAc,OAAPvD,KAAmBO,EAAQO,KAAMd,EAAKsD,EAAMC,IAKpDN,MAAO,SAAUS,EAAOiD,GAKvB,IAJA,GAAI9C,IAAO8C,EAAOjE,OACjBoB,EAAI,EACJP,EAAIG,EAAMhB,OAEHoB,EAAID,EAAKC,IAChBJ,EAAOH,KAAQoD,EAAQ7C,EAKxB,OAFAJ,GAAMhB,OAASa,EAERG,GAGRkD,KAAM,SAAU7D,EAAOK,EAAUyD,GAShC,IARA,GAAIC,GACHC,KACAxD,EAAI,EACJb,EAASK,EAAML,OACfsE,GAAkBH,EAIXtD,EAAIb,EAAQa,IACnBuD,GAAmB1D,EAAUL,EAAOQ,GAAKA,GACpCuD,IAAoBE,GACxBD,EAAQzG,KAAMyC,EAAOQ,GAIvB,OAAOwD,IAIR1D,IAAK,SAAUN,EAAOK,EAAU6D,GAC/B,GAAIvE,GAAQwE,EACX3D,EAAI,EACJP,IAGD,IAAKsD,EAAavD,GAEjB,IADAL,EAASK,EAAML,OACPa,EAAIb,EAAQa,IACnB2D,EAAQ9D,EAAUL,EAAOQ,GAAKA,EAAG0D,GAEnB,MAATC,GACJlE,EAAI1C,KAAM4G,OAMZ,KAAM3D,IAAKR,GACVmE,EAAQ9D,EAAUL,EAAOQ,GAAKA,EAAG0D,GAEnB,MAATC,GACJlE,EAAI1C,KAAM4G,EAMb,OAAO7G,GAAOmD,SAAWR,IAI1BmE,KAAM,EAINC,MAAO,SAAUtF,EAAID,GACpB,GAAIwF,GAAKC,EAAMF,CAUf,IARwB,gBAAZvF,KACXwF,EAAMvF,EAAID,GACVA,EAAUC,EACVA,EAAKuF,GAKA1F,EAAOgD,WAAY7C,GAazB,MARAwF,GAAOlH,EAAMU,KAAM2C,UAAW,GAC9B2D,EAAQ,WACP,MAAOtF,GAAG0B,MAAO3B,GAAW/B,KAAMwH,EAAKjH,OAAQD,EAAMU,KAAM2C,cAI5D2D,EAAMD,KAAOrF,EAAGqF,KAAOrF,EAAGqF,MAAQxF,EAAOwF,OAElCC,GAGRG,IAAKC,KAAKD,IAIVxG,QAASA,IAGa,kBAAX0G,UACX9F,EAAOG,GAAI2F,OAAOC,UAAa1H,EAAKyH,OAAOC,WAI5C/F,EAAOwB,KAAM,uEAAuEwE,MAAO,KAC3F,SAAUpE,EAAGa,GACZ5D,EAAY,WAAa4D,EAAO,KAAQA,EAAKiC,eAG9C,SAASC,GAAaf,GAMrB,GAAI7C,KAAW6C,GAAO,UAAYA,IAAOA,EAAI7C,OAC5C8C,EAAO7D,EAAO6D,KAAMD,EAErB,OAAc,aAATC,IAAuB7D,EAAO+D,SAAUH,KAI7B,UAATC,GAA+B,IAAX9C,GACR,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAO6C,IAEhE,GAAIqC,GAWJ,SAAW/H,GAEX,GAAI0D,GACHxC,EACA8G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACA5I,EACA6I,EACAC,EACAC,EACAC,EACA3B,EACA4B,EAGA5D,EAAU,SAAW,EAAI,GAAIyC,MAC7BoB,EAAe/I,EAAOH,SACtBmJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVhB,GAAe,GAET,GAIR3H,KAAcC,eACdX,KACAsJ,EAAMtJ,EAAIsJ,IACVC,EAAcvJ,EAAIM,KAClBA,EAAON,EAAIM,KACXF,EAAQJ,EAAII,MAGZG,EAAU,SAAUiJ,EAAMlG,GAGzB,IAFA,GAAIC,GAAI,EACPM,EAAM2F,EAAK9G,OACJa,EAAIM,EAAKN,IAChB,GAAKiG,EAAKjG,KAAOD,EAChB,MAAOC,EAGT,WAGDkG,EAAW,6HAKXC,EAAa,sBAGbC,EAAa,gCAGbC,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAE9D,gBAAkBA,EAElB,2DAA6DC,EAAa,OAASD,EACnF,OAEDG,EAAU,KAAOF,EAAa,wFAKAC,EAAa,eAM3CE,EAAc,GAAIC,QAAQL,EAAa,IAAK,KAC5C1H,EAAQ,GAAI+H,QAAQ,IAAML,EAAa,8BAAgCA,EAAa,KAAM,KAE1FM,EAAS,GAAID,QAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DO,EAAe,GAAIF,QAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FQ,EAAmB,GAAIH,QAAQ,IAAML,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FS,EAAU,GAAIJ,QAAQF,GACtBO,EAAc,GAAIL,QAAQ,IAAMJ,EAAa,KAE7CU,GACCC,GAAM,GAAIP,QAAQ,MAAQJ,EAAa,KACvCY,MAAS,GAAIR,QAAQ,QAAUJ,EAAa,KAC5Ca,IAAO,GAAIT,QAAQ,KAAOJ,EAAa,SACvCc,KAAQ,GAAIV,QAAQ,IAAMH,GAC1Bc,OAAU,GAAIX,QAAQ,IAAMF,GAC5Bc,MAAS,GAAIZ,QAAQ,yDAA2DL,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCkB,KAAQ,GAAIb,QAAQ,OAASN,EAAW,KAAM,KAG9CoB,aAAgB,GAAId,QAAQ,IAAML,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEoB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,EAAW,OAIXC,EAAY,GAAIpB,QAAQ,qBAAuBL,EAAa,MAAQA,EAAa,OAAQ,MACzF0B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACAE,EAAO,EAENC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,MAAKA,GAGQ,OAAPD,EACG,SAIDA,EAAGzL,MAAO,MAAU,KAAOyL,EAAGE,WAAYF,EAAGnJ,OAAS,GAAIjC,SAAU,IAAO,IAI5E,KAAOoL,GAOfG,GAAgB,WACf1D,KAGD2D,GAAmBC,GAClB,SAAU5I,GACT,MAAOA,GAAK6I,YAAa,IAAS,QAAU7I,IAAQ,SAAWA,MAE9D8I,IAAK,aAAcC,KAAM,UAI7B,KACC/L,EAAKkD,MACHxD,EAAMI,EAAMU,KAAM8H,EAAa0D,YAChC1D,EAAa0D,YAIdtM,EAAK4I,EAAa0D,WAAW5J,QAAS6J,SACrC,MAAQC,IACTlM,GAASkD,MAAOxD,EAAI0C,OAGnB,SAAU+B,EAAQgI,GACjBlD,EAAY/F,MAAOiB,EAAQrE,EAAMU,KAAK2L,KAKvC,SAAUhI,EAAQgI,GACjB,GAAI3I,GAAIW,EAAO/B,OACda,EAAI,CAEL,OAASkB,EAAOX,KAAO2I,EAAIlJ,MAC3BkB,EAAO/B,OAASoB,EAAI,IAKvB,QAAS8D,IAAQhG,EAAUC,EAAS4E,EAASiG,GAC5C,GAAIC,GAAGpJ,EAAGD,EAAMsJ,EAAKC,EAAOC,EAAQC,EACnCC,EAAanL,GAAWA,EAAQoL,cAGhCV,EAAW1K,EAAUA,EAAQ0K,SAAW,CAKzC,IAHA9F,EAAUA,MAGe,gBAAb7E,KAA0BA,GACxB,IAAb2K,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAO9F,EAIR,KAAMiG,KAEE7K,EAAUA,EAAQoL,eAAiBpL,EAAU+G,KAAmBlJ,GACtE4I,EAAazG,GAEdA,EAAUA,GAAWnC,EAEhB8I,GAAiB,CAIrB,GAAkB,KAAb+D,IAAoBM,EAAQ5B,EAAWiC,KAAMtL,IAGjD,GAAM+K,EAAIE,EAAM,IAGf,GAAkB,IAAbN,EAAiB,CACrB,KAAMjJ,EAAOzB,EAAQsL,eAAgBR,IAUpC,MAAOlG,EALP,IAAKnD,EAAK8J,KAAOT,EAEhB,MADAlG,GAAQnG,KAAMgD,GACPmD,MAYT,IAAKuG,IAAe1J,EAAO0J,EAAWG,eAAgBR,KACrDhE,EAAU9G,EAASyB,IACnBA,EAAK8J,KAAOT,EAGZ,MADAlG,GAAQnG,KAAMgD,GACPmD,MAKH,CAAA,GAAKoG,EAAM,GAEjB,MADAvM,GAAKkD,MAAOiD,EAAS5E,EAAQwL,qBAAsBzL,IAC5C6E,CAGD,KAAMkG,EAAIE,EAAM,KAAO9L,EAAQuM,wBACrCzL,EAAQyL,uBAGR,MADAhN,GAAKkD,MAAOiD,EAAS5E,EAAQyL,uBAAwBX,IAC9ClG,EAKT,GAAK1F,EAAQwM,MACXrE,EAAetH,EAAW,QACzB6G,IAAcA,EAAU+E,KAAM5L,IAAc,CAE9C,GAAkB,IAAb2K,EACJS,EAAanL,EACbkL,EAAcnL,MAMR,IAAwC,WAAnCC,EAAQuE,SAASC,cAA6B,EAGnDuG,EAAM/K,EAAQ4L,aAAc,OACjCb,EAAMA,EAAI1H,QAASyG,GAAYC,IAE/B/J,EAAQ6L,aAAc,KAAOd,EAAM7H,GAIpC+H,EAAS9E,EAAUpG,GACnB2B,EAAIuJ,EAAOpK,MACX,OAAQa,IACPuJ,EAAOvJ,GAAK,IAAMqJ,EAAM,IAAMe,GAAYb,EAAOvJ,GAElDwJ,GAAcD,EAAOc,KAAM,KAG3BZ,EAAa9B,EAASsC,KAAM5L,IAAciM,GAAahM,EAAQL,aAC9DK,EAGF,GAAKkL,EACJ,IAIC,MAHAzM,GAAKkD,MAAOiD,EACXuG,EAAWc,iBAAkBf,IAEvBtG,EACN,MAAQsH,IACR,QACInB,IAAQ7H,GACZlD,EAAQmM,gBAAiB,QAS/B,MAAO9F,GAAQtG,EAASsD,QAASlD,EAAO,MAAQH,EAAS4E,EAASiG,GASnE,QAAS1D,MACR,GAAIiF,KAEJ,SAASC,GAAOC,EAAKjH,GAMpB,MAJK+G,GAAK3N,KAAM6N,EAAM,KAAQtG,EAAKuG,mBAE3BF,GAAOD,EAAKI,SAEZH,EAAOC,EAAM,KAAQjH,EAE9B,MAAOgH,GAOR,QAASI,IAAcxM,GAEtB,MADAA,GAAIiD,IAAY,EACTjD,EAOR,QAASyM,IAAQzM,GAChB,GAAI0M,GAAK9O,EAAS0B,cAAc,WAEhC,KACC,QAASU,EAAI0M,GACZ,MAAOhC,GACR,OAAO,EACN,QAEIgC,EAAGhN,YACPgN,EAAGhN,WAAWC,YAAa+M,GAG5BA,EAAK,MASP,QAASC,IAAWC,EAAOC,GAC1B,GAAI3O,GAAM0O,EAAM/G,MAAM,KACrBpE,EAAIvD,EAAI0C,MAET,OAAQa,IACPsE,EAAK+G,WAAY5O,EAAIuD,IAAOoL,EAU9B,QAASE,IAAczF,EAAGC,GACzB,GAAIyF,GAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAEmD,UAAiC,IAAflD,EAAEkD,UACnCnD,EAAE4F,YAAc3F,EAAE2F,WAGpB,IAAKD,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQzF,EACZ,QAKH,OAAOD,GAAI,KAOZ,QAAS8F,IAAmB1J,GAC3B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAK8C,SAASC,aACzB,OAAgB,UAATjC,GAAoBd,EAAKkC,OAASA,GAQ3C,QAAS2J,IAAoB3J,GAC5B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAK8C,SAASC,aACzB,QAAiB,UAATjC,GAA6B,WAATA,IAAsBd,EAAKkC,OAASA,GAQlE,QAAS4J,IAAsBjD,GAG9B,MAAO,UAAU7I,GAKhB,MAAK,QAAUA,GASTA,EAAK9B,YAAc8B,EAAK6I,YAAa,EAGpC,SAAW7I,GACV,SAAWA,GAAK9B,WACb8B,EAAK9B,WAAW2K,WAAaA,EAE7B7I,EAAK6I,WAAaA,EAMpB7I,EAAK+L,aAAelD,GAI1B7I,EAAK+L,cAAgBlD,GACpBF,GAAkB3I,KAAW6I,EAGzB7I,EAAK6I,WAAaA,EAKd,SAAW7I,IACfA,EAAK6I,WAAaA,GAY5B,QAASmD,IAAwBxN,GAChC,MAAOwM,IAAa,SAAUiB,GAE7B,MADAA,IAAYA,EACLjB,GAAa,SAAU5B,EAAM3F,GACnC,GAAIjD,GACH0L,EAAe1N,KAAQ4K,EAAKhK,OAAQ6M,GACpChM,EAAIiM,EAAa9M,MAGlB,OAAQa,IACFmJ,EAAO5I,EAAI0L,EAAajM,MAC5BmJ,EAAK5I,KAAOiD,EAAQjD,GAAK4I,EAAK5I,SAYnC,QAAS+J,IAAahM,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQwL,sBAAwCxL,EAI1Ed,EAAU6G,GAAO7G,WAOjBgH,EAAQH,GAAOG,MAAQ,SAAUzE,GAGhC,GAAImM,GAAkBnM,IAASA,EAAK2J,eAAiB3J,GAAMmM,eAC3D,SAAOA,GAA+C,SAA7BA,EAAgBrJ,UAQ1CkC,EAAcV,GAAOU,YAAc,SAAUoH,GAC5C,GAAIC,GAAYC,EACf1O,EAAMwO,EAAOA,EAAKzC,eAAiByC,EAAO9G,CAG3C,OAAK1H,KAAQxB,GAA6B,IAAjBwB,EAAIqL,UAAmBrL,EAAIuO,iBAKpD/P,EAAWwB,EACXqH,EAAU7I,EAAS+P,gBACnBjH,GAAkBT,EAAOrI,GAIpBkJ,IAAiBlJ,IACpBkQ,EAAYlQ,EAASmQ,cAAgBD,EAAUE,MAAQF,IAGnDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KAUrCjL,EAAQ6I,WAAa2E,GAAO,SAAUC,GAErC,MADAA,GAAGyB,UAAY,KACPzB,EAAGf,aAAa,eAOzB1M,EAAQsM,qBAAuBkB,GAAO,SAAUC,GAE/C,MADAA,GAAGjN,YAAa7B,EAASwQ,cAAc,MAC/B1B,EAAGnB,qBAAqB,KAAK3K,SAItC3B,EAAQuM,uBAAyBtC,EAAQwC,KAAM9N,EAAS4N,wBAMxDvM,EAAQoP,QAAU5B,GAAO,SAAUC,GAElC,MADAjG,GAAQhH,YAAaiN,GAAKpB,GAAKrI,GACvBrF,EAAS0Q,oBAAsB1Q,EAAS0Q,kBAAmBrL,GAAUrC,SAIzE3B,EAAQoP,SACZtI,EAAKwI,OAAW,GAAI,SAAUjD,GAC7B,GAAIkD,GAASlD,EAAGlI,QAASiG,EAAWC,GACpC,OAAO,UAAU9H,GAChB,MAAOA,GAAKmK,aAAa,QAAU6C,IAGrCzI,EAAK0I,KAAS,GAAI,SAAUnD,EAAIvL,GAC/B,GAAuC,mBAA3BA,GAAQsL,gBAAkC3E,EAAiB,CACtE,GAAIlF,GAAOzB,EAAQsL,eAAgBC,EACnC,OAAO9J,IAASA,UAIlBuE,EAAKwI,OAAW,GAAK,SAAUjD,GAC9B,GAAIkD,GAASlD,EAAGlI,QAASiG,EAAWC,GACpC,OAAO,UAAU9H,GAChB,GAAIoM,GAAwC,mBAA1BpM,GAAKkN,kBACtBlN,EAAKkN,iBAAiB,KACvB,OAAOd,IAAQA,EAAKxI,QAAUoJ,IAMhCzI,EAAK0I,KAAS,GAAI,SAAUnD,EAAIvL,GAC/B,GAAuC,mBAA3BA,GAAQsL,gBAAkC3E,EAAiB,CACtE,GAAIkH,GAAMnM,EAAGR,EACZO,EAAOzB,EAAQsL,eAAgBC,EAEhC,IAAK9J,EAAO,CAIX,GADAoM,EAAOpM,EAAKkN,iBAAiB,MACxBd,GAAQA,EAAKxI,QAAUkG,EAC3B,OAAS9J,EAIVP,GAAQlB,EAAQuO,kBAAmBhD,GACnC7J,EAAI,CACJ,OAASD,EAAOP,EAAMQ,KAErB,GADAmM,EAAOpM,EAAKkN,iBAAiB,MACxBd,GAAQA,EAAKxI,QAAUkG,EAC3B,OAAS9J,GAKZ,YAMHuE,EAAK0I,KAAU,IAAIxP,EAAQsM,qBAC1B,SAAUoD,EAAK5O,GACd,MAA6C,mBAAjCA,GAAQwL,qBACZxL,EAAQwL,qBAAsBoD,GAG1B1P,EAAQwM,IACZ1L,EAAQiM,iBAAkB2C,GAD3B,QAKR,SAAUA,EAAK5O,GACd,GAAIyB,GACH+D,KACA9D,EAAI,EAEJkD,EAAU5E,EAAQwL,qBAAsBoD,EAGzC,IAAa,MAARA,EAAc,CAClB,MAASnN,EAAOmD,EAAQlD,KACA,IAAlBD,EAAKiJ,UACTlF,EAAI/G,KAAMgD,EAIZ,OAAO+D,GAER,MAAOZ,IAIToB,EAAK0I,KAAY,MAAIxP,EAAQuM,wBAA0B,SAAU2C,EAAWpO,GAC3E,GAA+C,mBAAnCA,GAAQyL,wBAA0C9E,EAC7D,MAAO3G,GAAQyL,uBAAwB2C,IAUzCvH,KAOAD,MAEM1H,EAAQwM,IAAMvC,EAAQwC,KAAM9N,EAASoO,qBAG1CS,GAAO,SAAUC,GAMhBjG,EAAQhH,YAAaiN,GAAKkC,UAAY,UAAY3L,EAAU,qBAC1CA,EAAU,kEAOvByJ,EAAGV,iBAAiB,wBAAwBpL,QAChD+F,EAAUnI,KAAM,SAAWoJ,EAAa,gBAKnC8E,EAAGV,iBAAiB,cAAcpL,QACvC+F,EAAUnI,KAAM,MAAQoJ,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/I,EAAU,MAAOrC,QACrD+F,EAAUnI,KAAK,MAMVkO,EAAGV,iBAAiB,YAAYpL,QACrC+F,EAAUnI,KAAK,YAMVkO,EAAGV,iBAAkB,KAAO/I,EAAU,MAAOrC,QAClD+F,EAAUnI,KAAK,cAIjBiO,GAAO,SAAUC,GAChBA,EAAGkC,UAAY,mFAKf,IAAIC,GAAQjR,EAAS0B,cAAc,QACnCuP,GAAMjD,aAAc,OAAQ,UAC5Bc,EAAGjN,YAAaoP,GAAQjD,aAAc,OAAQ,KAIzCc,EAAGV,iBAAiB,YAAYpL,QACpC+F,EAAUnI,KAAM,OAASoJ,EAAa,eAKS,IAA3C8E,EAAGV,iBAAiB,YAAYpL,QACpC+F,EAAUnI,KAAM,WAAY,aAK7BiI,EAAQhH,YAAaiN,GAAKrC,UAAW,EACY,IAA5CqC,EAAGV,iBAAiB,aAAapL,QACrC+F,EAAUnI,KAAM,WAAY,aAI7BkO,EAAGV,iBAAiB,QACpBrF,EAAUnI,KAAK,YAIXS,EAAQ6P,gBAAkB5F,EAAQwC,KAAOzG,EAAUwB,EAAQxB,SAChEwB,EAAQsI,uBACRtI,EAAQuI,oBACRvI,EAAQwI,kBACRxI,EAAQyI,qBAERzC,GAAO,SAAUC,GAGhBzN,EAAQkQ,kBAAoBlK,EAAQjG,KAAM0N,EAAI,KAI9CzH,EAAQjG,KAAM0N,EAAI,aAClB9F,EAAcpI,KAAM,KAAMuJ,KAI5BpB,EAAYA,EAAU/F,QAAU,GAAIqH,QAAQtB,EAAUmF,KAAK,MAC3DlF,EAAgBA,EAAchG,QAAU,GAAIqH,QAAQrB,EAAckF,KAAK,MAIvE+B,EAAa3E,EAAQwC,KAAMjF,EAAQ2I,yBAKnCvI,EAAWgH,GAAc3E,EAAQwC,KAAMjF,EAAQI,UAC9C,SAAUS,EAAGC,GACZ,GAAI8H,GAAuB,IAAf/H,EAAEmD,SAAiBnD,EAAEqG,gBAAkBrG,EAClDgI,EAAM/H,GAAKA,EAAE7H,UACd,OAAO4H,KAAMgI,MAAWA,GAAwB,IAAjBA,EAAI7E,YAClC4E,EAAMxI,SACLwI,EAAMxI,SAAUyI,GAChBhI,EAAE8H,yBAA8D,GAAnC9H,EAAE8H,wBAAyBE,MAG3D,SAAUhI,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAE7H,WACd,GAAK6H,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAYwG,EACZ,SAAUvG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAIR,IAAIgJ,IAAWjI,EAAE8H,yBAA2B7H,EAAE6H,uBAC9C,OAAKG,GACGA,GAIRA,GAAYjI,EAAE6D,eAAiB7D,MAAUC,EAAE4D,eAAiB5D,GAC3DD,EAAE8H,wBAAyB7H,GAG3B,EAGc,EAAVgI,IACFtQ,EAAQuQ,cAAgBjI,EAAE6H,wBAAyB9H,KAAQiI,EAGxDjI,IAAM1J,GAAY0J,EAAE6D,gBAAkBrE,GAAgBD,EAASC,EAAcQ,MAG7EC,IAAM3J,GAAY2J,EAAE4D,gBAAkBrE,GAAgBD,EAASC,EAAcS,GAC1E,EAIDjB,EACJ7H,EAAS6H,EAAWgB,GAAM7I,EAAS6H,EAAWiB,GAChD,EAGe,EAAVgI,KAAmB,IAE3B,SAAUjI,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAGR,IAAIyG,GACHvL,EAAI,EACJgO,EAAMnI,EAAE5H,WACR4P,EAAM/H,EAAE7H,WACRgQ,GAAOpI,GACPqI,GAAOpI,EAGR,KAAMkI,IAAQH,EACb,MAAOhI,KAAM1J,KACZ2J,IAAM3J,EAAW,EACjB6R,KACAH,EAAM,EACNhJ,EACE7H,EAAS6H,EAAWgB,GAAM7I,EAAS6H,EAAWiB,GAChD,CAGK,IAAKkI,IAAQH,EACnB,MAAOvC,IAAczF,EAAGC,EAIzByF,GAAM1F,CACN,OAAS0F,EAAMA,EAAItN,WAClBgQ,EAAGE,QAAS5C,EAEbA,GAAMzF,CACN,OAASyF,EAAMA,EAAItN,WAClBiQ,EAAGC,QAAS5C,EAIb,OAAQ0C,EAAGjO,KAAOkO,EAAGlO,GACpBA,GAGD,OAAOA,GAENsL,GAAc2C,EAAGjO,GAAIkO,EAAGlO,IAGxBiO,EAAGjO,KAAOqF,KACV6I,EAAGlO,KAAOqF,EAAe,EACzB,GAGKlJ,GA3YCA,GA8YTkI,GAAOb,QAAU,SAAU4K,EAAMC,GAChC,MAAOhK,IAAQ+J,EAAM,KAAM,KAAMC,IAGlChK,GAAOgJ,gBAAkB,SAAUtN,EAAMqO,GASxC,IAPOrO,EAAK2J,eAAiB3J,KAAW5D,GACvC4I,EAAahF,GAIdqO,EAAOA,EAAKzM,QAASgF,EAAkB,UAElCnJ,EAAQ6P,iBAAmBpI,IAC9BU,EAAeyI,EAAO,QACpBjJ,IAAkBA,EAAc8E,KAAMmE,OACtClJ,IAAkBA,EAAU+E,KAAMmE,IAErC,IACC,GAAI3O,GAAM+D,EAAQjG,KAAMwC,EAAMqO,EAG9B,IAAK3O,GAAOjC,EAAQkQ,mBAGlB3N,EAAK5D,UAAuC,KAA3B4D,EAAK5D,SAAS6M,SAChC,MAAOvJ,GAEP,MAAOwJ,IAGV,MAAO5E,IAAQ+J,EAAMjS,EAAU,MAAQ4D,IAASZ,OAAS,GAG1DkF,GAAOe,SAAW,SAAU9G,EAASyB,GAKpC,OAHOzB,EAAQoL,eAAiBpL,KAAcnC,GAC7C4I,EAAazG,GAEP8G,EAAU9G,EAASyB,IAG3BsE,GAAOiK,KAAO,SAAUvO,EAAMc,IAEtBd,EAAK2J,eAAiB3J,KAAW5D,GACvC4I,EAAahF,EAGd,IAAIxB,GAAK+F,EAAK+G,WAAYxK,EAAKiC,eAE9ByL,EAAMhQ,GAAMpB,EAAOI,KAAM+G,EAAK+G,WAAYxK,EAAKiC,eAC9CvE,EAAIwB,EAAMc,GAAOoE,GACjB1D,MAEF,OAAeA,UAARgN,EACNA,EACA/Q,EAAQ6I,aAAepB,EACtBlF,EAAKmK,aAAcrJ,IAClB0N,EAAMxO,EAAKkN,iBAAiBpM,KAAU0N,EAAIC,UAC1CD,EAAI5K,MACJ,MAGJU,GAAOoK,OAAS,SAAUC,GACzB,OAAQA,EAAM,IAAI/M,QAASyG,GAAYC,KAGxChE,GAAOxC,MAAQ,SAAUC,GACxB,KAAM,IAAIzF,OAAO,0CAA4CyF,IAO9DuC,GAAOsK,WAAa,SAAUzL,GAC7B,GAAInD,GACH6O,KACArO,EAAI,EACJP,EAAI,CAOL,IAJA8E,GAAgBtH,EAAQqR,iBACxBhK,GAAarH,EAAQsR,YAAc5L,EAAQrG,MAAO,GAClDqG,EAAQzC,KAAMmF,GAETd,EAAe,CACnB,MAAS/E,EAAOmD,EAAQlD,KAClBD,IAASmD,EAASlD,KACtBO,EAAIqO,EAAW7R,KAAMiD,GAGvB,OAAQO,IACP2C,EAAQxC,OAAQkO,EAAYrO,GAAK,GAQnC,MAFAsE,GAAY,KAEL3B,GAORqB,EAAUF,GAAOE,QAAU,SAAUxE,GACpC,GAAIoM,GACH1M,EAAM,GACNO,EAAI,EACJgJ,EAAWjJ,EAAKiJ,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBjJ,GAAKgP,YAChB,MAAOhP,GAAKgP,WAGZ,KAAMhP,EAAOA,EAAKiP,WAAYjP,EAAMA,EAAOA,EAAK2L,YAC/CjM,GAAO8E,EAASxE,OAGZ,IAAkB,IAAbiJ,GAA+B,IAAbA,EAC7B,MAAOjJ,GAAKkP,cAhBZ,OAAS9C,EAAOpM,EAAKC,KAEpBP,GAAO8E,EAAS4H,EAkBlB,OAAO1M,IAGR6E,EAAOD,GAAO6K,WAGbrE,YAAa,GAEbsE,aAAcpE,GAEdzB,MAAOxC,EAEPuE,cAEA2B,QAEAoC,UACCC,KAAOxG,IAAK,aAAc1I,OAAO,GACjCmP,KAAOzG,IAAK,cACZ0G,KAAO1G,IAAK,kBAAmB1I,OAAO,GACtCqP,KAAO3G,IAAK,oBAGb4G,WACCvI,KAAQ,SAAUoC,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAG3H,QAASiG,EAAWC,IAGxCyB,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAK3H,QAASiG,EAAWC,IAExD,OAAbyB,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMzM,MAAO,EAAG,IAGxBuK,MAAS,SAAUkC,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAGxG,cAEY,QAA3BwG,EAAM,GAAGzM,MAAO,EAAG,IAEjByM,EAAM,IACXjF,GAAOxC,MAAOyH,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBjF,GAAOxC,MAAOyH,EAAM,IAGdA,GAGRnC,OAAU,SAAUmC,GACnB,GAAIoG,GACHC,GAAYrG,EAAM,IAAMA,EAAM,EAE/B,OAAKxC,GAAiB,MAAEmD,KAAMX,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxBqG,GAAY/I,EAAQqD,KAAM0F,KAEpCD,EAASjL,EAAUkL,GAAU,MAE7BD,EAASC,EAAS3S,QAAS,IAAK2S,EAASxQ,OAASuQ,GAAWC,EAASxQ,UAGvEmK,EAAM,GAAKA,EAAM,GAAGzM,MAAO,EAAG6S,GAC9BpG,EAAM,GAAKqG,EAAS9S,MAAO,EAAG6S,IAIxBpG,EAAMzM,MAAO,EAAG,MAIzBiQ,QAEC7F,IAAO,SAAU2I,GAChB,GAAI/M,GAAW+M,EAAiBjO,QAASiG,EAAWC,IAAY/E,aAChE,OAA4B,MAArB8M,EACN,WAAa,OAAO,GACpB,SAAU7P,GACT,MAAOA,GAAK8C,UAAY9C,EAAK8C,SAASC,gBAAkBD,IAI3DmE,MAAS,SAAU0F,GAClB,GAAImD,GAAUrK,EAAYkH,EAAY,IAEtC,OAAOmD,KACLA,EAAU,GAAIrJ,QAAQ,MAAQL,EAAa,IAAMuG,EAAY,IAAMvG,EAAa,SACjFX,EAAYkH,EAAW,SAAU3M,GAChC,MAAO8P,GAAQ5F,KAAgC,gBAAnBlK,GAAK2M,WAA0B3M,EAAK2M,WAA0C,mBAAtB3M,GAAKmK,cAAgCnK,EAAKmK,aAAa,UAAY,OAI1JhD,KAAQ,SAAUrG,EAAMiP,EAAUC,GACjC,MAAO,UAAUhQ,GAChB,GAAIiQ,GAAS3L,GAAOiK,KAAMvO,EAAMc,EAEhC,OAAe,OAAVmP,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOhT,QAAS+S,GAChC,OAAbD,EAAoBC,GAASC,EAAOhT,QAAS+S,MAChC,OAAbD,EAAoBC,GAASC,EAAOnT,OAAQkT,EAAM5Q,UAAa4Q,EAClD,OAAbD,GAAsB,IAAME,EAAOrO,QAAS4E,EAAa,KAAQ,KAAMvJ,QAAS+S,MACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOnT,MAAO,EAAGkT,EAAM5Q,OAAS,KAAQ4Q,EAAQ,QAK3F3I,MAAS,SAAUnF,EAAMgO,EAAMjE,EAAU7L,EAAOE,GAC/C,GAAI6P,GAAgC,QAAvBjO,EAAKpF,MAAO,EAAG,GAC3BsT,EAA+B,SAArBlO,EAAKpF,UACfuT,EAAkB,YAATH,CAEV,OAAiB,KAAV9P,GAAwB,IAATE,EAGrB,SAAUN,GACT,QAASA,EAAK9B,YAGf,SAAU8B,EAAMzB,EAAS+R,GACxB,GAAI1F,GAAO2F,EAAaC,EAAYpE,EAAMqE,EAAWC,EACpD5H,EAAMqH,IAAWC,EAAU,cAAgB,kBAC3CO,EAAS3Q,EAAK9B,WACd4C,EAAOuP,GAAUrQ,EAAK8C,SAASC,cAC/B6N,GAAYN,IAAQD,EACpB5E,GAAO,CAER,IAAKkF,EAAS,CAGb,GAAKR,EAAS,CACb,MAAQrH,EAAM,CACbsD,EAAOpM,CACP,OAASoM,EAAOA,EAAMtD,GACrB,GAAKuH,EACJjE,EAAKtJ,SAASC,gBAAkBjC,EACd,IAAlBsL,EAAKnD,SAEL,OAAO,CAITyH,GAAQ5H,EAAe,SAAT5G,IAAoBwO,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUN,EAAUO,EAAO1B,WAAa0B,EAAOE,WAG1CT,GAAWQ,EAAW,CAK1BxE,EAAOuE,EACPH,EAAapE,EAAM3K,KAAc2K,EAAM3K,OAIvC8O,EAAcC,EAAYpE,EAAK0E,YAC7BN,EAAYpE,EAAK0E,cAEnBlG,EAAQ2F,EAAarO,OACrBuO,EAAY7F,EAAO,KAAQrF,GAAWqF,EAAO,GAC7Ca,EAAOgF,GAAa7F,EAAO,GAC3BwB,EAAOqE,GAAaE,EAAO3H,WAAYyH,EAEvC,OAASrE,IAASqE,GAAarE,GAAQA,EAAMtD,KAG3C2C,EAAOgF,EAAY,IAAMC,EAAM1K,MAGhC,GAAuB,IAAlBoG,EAAKnD,YAAoBwC,GAAQW,IAASpM,EAAO,CACrDuQ,EAAarO,IAAWqD,EAASkL,EAAWhF,EAC5C,YAuBF,IAjBKmF,IAEJxE,EAAOpM,EACPwQ,EAAapE,EAAM3K,KAAc2K,EAAM3K,OAIvC8O,EAAcC,EAAYpE,EAAK0E,YAC7BN,EAAYpE,EAAK0E,cAEnBlG,EAAQ2F,EAAarO,OACrBuO,EAAY7F,EAAO,KAAQrF,GAAWqF,EAAO,GAC7Ca,EAAOgF,GAKHhF,KAAS,EAEb,MAASW,IAASqE,GAAarE,GAAQA,EAAMtD,KAC3C2C,EAAOgF,EAAY,IAAMC,EAAM1K,MAEhC,IAAOqK,EACNjE,EAAKtJ,SAASC,gBAAkBjC,EACd,IAAlBsL,EAAKnD,aACHwC,IAGGmF,IACJJ,EAAapE,EAAM3K,KAAc2K,EAAM3K,OAIvC8O,EAAcC,EAAYpE,EAAK0E,YAC7BN,EAAYpE,EAAK0E,cAEnBP,EAAarO,IAAWqD,EAASkG,IAG7BW,IAASpM,GACb,KASL,OADAyL,IAAQnL,EACDmL,IAASrL,GAAWqL,EAAOrL,IAAU,GAAKqL,EAAOrL,GAAS,KAKrEgH,OAAU,SAAU2J,EAAQ9E,GAK3B,GAAIjI,GACHxF,EAAK+F,EAAKgC,QAASwK,IAAYxM,EAAKyM,WAAYD,EAAOhO,gBACtDuB,GAAOxC,MAAO,uBAAyBiP,EAKzC,OAAKvS,GAAIiD,GACDjD,EAAIyN,GAIPzN,EAAGY,OAAS,GAChB4E,GAAS+M,EAAQA,EAAQ,GAAI9E,GACtB1H,EAAKyM,WAAW3T,eAAgB0T,EAAOhO,eAC7CiI,GAAa,SAAU5B,EAAM3F,GAC5B,GAAIwN,GACHC,EAAU1S,EAAI4K,EAAM6C,GACpBhM,EAAIiR,EAAQ9R,MACb,OAAQa,IACPgR,EAAMhU,EAASmM,EAAM8H,EAAQjR,IAC7BmJ,EAAM6H,KAAWxN,EAASwN,GAAQC,EAAQjR,MAG5C,SAAUD,GACT,MAAOxB,GAAIwB,EAAM,EAAGgE,KAIhBxF,IAIT+H,SAEC4K,IAAOnG,GAAa,SAAU1M,GAI7B,GAAI+O,MACHlK,KACAiO,EAAUzM,EAASrG,EAASsD,QAASlD,EAAO,MAE7C,OAAO0S,GAAS3P,GACfuJ,GAAa,SAAU5B,EAAM3F,EAASlF,EAAS+R,GAC9C,GAAItQ,GACHqR,EAAYD,EAAShI,EAAM,KAAMkH,MACjCrQ,EAAImJ,EAAKhK,MAGV,OAAQa,KACDD,EAAOqR,EAAUpR,MACtBmJ,EAAKnJ,KAAOwD,EAAQxD,GAAKD,MAI5B,SAAUA,EAAMzB,EAAS+R,GAKxB,MAJAjD,GAAM,GAAKrN,EACXoR,EAAS/D,EAAO,KAAMiD,EAAKnN,GAE3BkK,EAAM,GAAK,MACHlK,EAAQ6C,SAInBsL,IAAOtG,GAAa,SAAU1M,GAC7B,MAAO,UAAU0B,GAChB,MAAOsE,IAAQhG,EAAU0B,GAAOZ,OAAS,KAI3CiG,SAAY2F,GAAa,SAAUjN,GAElC,MADAA,GAAOA,EAAK6D,QAASiG,EAAWC,IACzB,SAAU9H,GAChB,OAASA,EAAKgP,aAAehP,EAAKuR,WAAa/M,EAASxE,IAAS/C,QAASc,SAW5EyT,KAAQxG,GAAc,SAAUwG,GAM/B,MAJM1K,GAAYoD,KAAKsH,GAAQ,KAC9BlN,GAAOxC,MAAO,qBAAuB0P,GAEtCA,EAAOA,EAAK5P,QAASiG,EAAWC,IAAY/E,cACrC,SAAU/C,GAChB,GAAIyR,EACJ,GACC,IAAMA,EAAWvM,EAChBlF,EAAKwR,KACLxR,EAAKmK,aAAa,aAAenK,EAAKmK,aAAa,QAGnD,MADAsH,GAAWA,EAAS1O,cACb0O,IAAaD,GAA2C,IAAnCC,EAASxU,QAASuU,EAAO,YAE5CxR,EAAOA,EAAK9B,aAAiC,IAAlB8B,EAAKiJ,SAC3C,QAAO,KAKT9H,OAAU,SAAUnB,GACnB,GAAI0R,GAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,IAC9C,OAAOA,IAAQA,EAAK5U,MAAO,KAAQkD,EAAK8J,IAGzC8H,KAAQ,SAAU5R,GACjB,MAAOA,KAASiF,GAGjB4M,MAAS,SAAU7R,GAClB,MAAOA,KAAS5D,EAAS0V,iBAAmB1V,EAAS2V,UAAY3V,EAAS2V,gBAAkB/R,EAAKkC,MAAQlC,EAAKgS,OAAShS,EAAKiS,WAI7HC,QAAWpG,IAAsB,GACjCjD,SAAYiD,IAAsB,GAElCqG,QAAW,SAAUnS,GAGpB,GAAI8C,GAAW9C,EAAK8C,SAASC,aAC7B,OAAqB,UAAbD,KAA0B9C,EAAKmS,SAA0B,WAAbrP,KAA2B9C,EAAKoS,UAGrFA,SAAY,SAAUpS,GAOrB,MAJKA,GAAK9B,YACT8B,EAAK9B,WAAWmU,cAGVrS,EAAKoS,YAAa,GAI1BE,MAAS,SAAUtS,GAKlB,IAAMA,EAAOA,EAAKiP,WAAYjP,EAAMA,EAAOA,EAAK2L,YAC/C,GAAK3L,EAAKiJ,SAAW,EACpB,OAAO,CAGT,QAAO,GAGR0H,OAAU,SAAU3Q,GACnB,OAAQuE,EAAKgC,QAAe,MAAGvG,IAIhCuS,OAAU,SAAUvS,GACnB,MAAOyH,GAAQyC,KAAMlK,EAAK8C,WAG3BuK,MAAS,SAAUrN,GAClB,MAAOwH,GAAQ0C,KAAMlK,EAAK8C,WAG3B0P,OAAU,SAAUxS,GACnB,GAAIc,GAAOd,EAAK8C,SAASC,aACzB,OAAgB,UAATjC,GAAkC,WAAdd,EAAKkC,MAA8B,WAATpB,GAGtD/C,KAAQ,SAAUiC,GACjB,GAAIuO,EACJ,OAAuC,UAAhCvO,EAAK8C,SAASC,eACN,SAAd/C,EAAKkC,OAImC,OAArCqM,EAAOvO,EAAKmK,aAAa,UAA2C,SAAvBoE,EAAKxL,gBAIvD3C,MAAS4L,GAAuB,WAC/B,OAAS,KAGV1L,KAAQ0L,GAAuB,SAAUE,EAAc9M,GACtD,OAASA,EAAS,KAGnBiB,GAAM2L,GAAuB,SAAUE,EAAc9M,EAAQ6M,GAC5D,OAASA,EAAW,EAAIA,EAAW7M,EAAS6M,KAG7CwG,KAAQzG,GAAuB,SAAUE,EAAc9M,GAEtD,IADA,GAAIa,GAAI,EACAA,EAAIb,EAAQa,GAAK,EACxBiM,EAAalP,KAAMiD,EAEpB,OAAOiM,KAGRwG,IAAO1G,GAAuB,SAAUE,EAAc9M,GAErD,IADA,GAAIa,GAAI,EACAA,EAAIb,EAAQa,GAAK,EACxBiM,EAAalP,KAAMiD,EAEpB,OAAOiM,KAGRyG,GAAM3G,GAAuB,SAAUE,EAAc9M,EAAQ6M,GAE5D,IADA,GAAIhM,GAAIgM,EAAW,EAAIA,EAAW7M,EAAS6M,IACjChM,GAAK,GACdiM,EAAalP,KAAMiD,EAEpB,OAAOiM,KAGR0G,GAAM5G,GAAuB,SAAUE,EAAc9M,EAAQ6M,GAE5D,IADA,GAAIhM,GAAIgM,EAAW,EAAIA,EAAW7M,EAAS6M,IACjChM,EAAIb,GACb8M,EAAalP,KAAMiD,EAEpB,OAAOiM,OAKV3H,EAAKgC,QAAa,IAAIhC,EAAKgC,QAAY,EAGvC,KAAMtG,KAAO4S,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E1O,EAAKgC,QAAStG,GAAM2L,GAAmB3L,EAExC,KAAMA,KAAOiT,QAAQ,EAAMC,OAAO,GACjC5O,EAAKgC,QAAStG,GAAM4L,GAAoB5L,EAIzC,SAAS+Q,OACTA,GAAW/R,UAAYsF,EAAK6O,QAAU7O,EAAKgC,QAC3ChC,EAAKyM,WAAa,GAAIA,IAEtBtM,EAAWJ,GAAOI,SAAW,SAAUpG,EAAU+U,GAChD,GAAInC,GAAS3H,EAAO+J,EAAQpR,EAC3BqR,EAAO/J,EAAQgK,EACfC,EAAS9N,EAAYrH,EAAW,IAEjC,IAAKmV,EACJ,MAAOJ,GAAY,EAAII,EAAO3W,MAAO,EAGtCyW,GAAQjV,EACRkL,KACAgK,EAAajP,EAAKmL,SAElB,OAAQ6D,EAAQ,CAGTrC,KAAY3H,EAAQ7C,EAAOkD,KAAM2J,MACjChK,IAEJgK,EAAQA,EAAMzW,MAAOyM,EAAM,GAAGnK,SAAYmU,GAE3C/J,EAAOxM,KAAOsW,OAGfpC,GAAU,GAGJ3H,EAAQ5C,EAAaiD,KAAM2J,MAChCrC,EAAU3H,EAAMwB,QAChBuI,EAAOtW,MACN4G,MAAOsN,EAEPhP,KAAMqH,EAAM,GAAG3H,QAASlD,EAAO,OAEhC6U,EAAQA,EAAMzW,MAAOoU,EAAQ9R,QAI9B,KAAM8C,IAAQqC,GAAKwI,SACZxD,EAAQxC,EAAW7E,GAAO0H,KAAM2J,KAAcC,EAAYtR,MAC9DqH,EAAQiK,EAAYtR,GAAQqH,MAC7B2H,EAAU3H,EAAMwB,QAChBuI,EAAOtW,MACN4G,MAAOsN,EACPhP,KAAMA,EACNuB,QAAS8F,IAEVgK,EAAQA,EAAMzW,MAAOoU,EAAQ9R,QAI/B,KAAM8R,EACL,MAOF,MAAOmC,GACNE,EAAMnU,OACNmU,EACCjP,GAAOxC,MAAOxD,GAEdqH,EAAYrH,EAAUkL,GAAS1M,MAAO,GAGzC,SAASuN,IAAYiJ,GAIpB,IAHA,GAAIrT,GAAI,EACPM,EAAM+S,EAAOlU,OACbd,EAAW,GACJ2B,EAAIM,EAAKN,IAChB3B,GAAYgV,EAAOrT,GAAG2D,KAEvB,OAAOtF,GAGR,QAASsK,IAAewI,EAASsC,EAAYC,GAC5C,GAAI7K,GAAM4K,EAAW5K,IACpB8K,EAAOF,EAAW3K,KAClB8B,EAAM+I,GAAQ9K,EACd+K,EAAmBF,GAAgB,eAAR9I,EAC3BiJ,EAAWtO,GAEZ,OAAOkO,GAAWtT,MAEjB,SAAUJ,EAAMzB,EAAS+R,GACxB,MAAStQ,EAAOA,EAAM8I,GACrB,GAAuB,IAAlB9I,EAAKiJ,UAAkB4K,EAC3B,MAAOzC,GAASpR,EAAMzB,EAAS+R,EAGjC,QAAO,GAIR,SAAUtQ,EAAMzB,EAAS+R,GACxB,GAAIyD,GAAUxD,EAAaC,EAC1BwD,GAAazO,EAASuO,EAGvB,IAAKxD,GACJ,MAAStQ,EAAOA,EAAM8I,GACrB,IAAuB,IAAlB9I,EAAKiJ,UAAkB4K,IACtBzC,EAASpR,EAAMzB,EAAS+R,GAC5B,OAAO,MAKV,OAAStQ,EAAOA,EAAM8I,GACrB,GAAuB,IAAlB9I,EAAKiJ,UAAkB4K,EAO3B,GANArD,EAAaxQ,EAAMyB,KAAczB,EAAMyB,OAIvC8O,EAAcC,EAAYxQ,EAAK8Q,YAAeN,EAAYxQ,EAAK8Q,cAE1D8C,GAAQA,IAAS5T,EAAK8C,SAASC,cACnC/C,EAAOA,EAAM8I,IAAS9I,MAChB,CAAA,IAAM+T,EAAWxD,EAAa1F,KACpCkJ,EAAU,KAAQxO,GAAWwO,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHAxD,EAAa1F,GAAQmJ,EAGfA,EAAU,GAAM5C,EAASpR,EAAMzB,EAAS+R,GAC7C,OAAO,EAMZ,OAAO,GAIV,QAAS2D,IAAgBC,GACxB,MAAOA,GAAS9U,OAAS,EACxB,SAAUY,EAAMzB,EAAS+R,GACxB,GAAIrQ,GAAIiU,EAAS9U,MACjB,OAAQa,IACP,IAAMiU,EAASjU,GAAID,EAAMzB,EAAS+R,GACjC,OAAO,CAGT,QAAO,GAER4D,EAAS,GAGX,QAASC,IAAkB7V,EAAU8V,EAAUjR,GAG9C,IAFA,GAAIlD,GAAI,EACPM,EAAM6T,EAAShV,OACRa,EAAIM,EAAKN,IAChBqE,GAAQhG,EAAU8V,EAASnU,GAAIkD,EAEhC,OAAOA,GAGR,QAASkR,IAAUhD,EAAWtR,EAAKgN,EAAQxO,EAAS+R,GAOnD,IANA,GAAItQ,GACHsU,KACArU,EAAI,EACJM,EAAM8Q,EAAUjS,OAChBmV,EAAgB,MAAPxU,EAEFE,EAAIM,EAAKN,KACVD,EAAOqR,EAAUpR,MAChB8M,IAAUA,EAAQ/M,EAAMzB,EAAS+R,KACtCgE,EAAatX,KAAMgD,GACduU,GACJxU,EAAI/C,KAAMiD,IAMd,OAAOqU,GAGR,QAASE,IAAY9E,EAAWpR,EAAU8S,EAASqD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAYhT,KAC/BgT,EAAaD,GAAYC,IAErBC,IAAeA,EAAYjT,KAC/BiT,EAAaF,GAAYE,EAAYC,IAE/B3J,GAAa,SAAU5B,EAAMjG,EAAS5E,EAAS+R,GACrD,GAAIsE,GAAM3U,EAAGD,EACZ6U,KACAC,KACAC,EAAc5R,EAAQ/D,OAGtBK,EAAQ2J,GAAQ+K,GAAkB7V,GAAY,IAAKC,EAAQ0K,UAAa1K,GAAYA,MAGpFyW,GAAYtF,IAAetG,GAAS9K,EAEnCmB,EADA4U,GAAU5U,EAAOoV,EAAQnF,EAAWnR,EAAS+R,GAG9C2E,EAAa7D,EAEZsD,IAAgBtL,EAAOsG,EAAYqF,GAAeN,MAMjDtR,EACD6R,CAQF,IALK5D,GACJA,EAAS4D,EAAWC,EAAY1W,EAAS+R,GAIrCmE,EAAa,CACjBG,EAAOP,GAAUY,EAAYH,GAC7BL,EAAYG,KAAUrW,EAAS+R,GAG/BrQ,EAAI2U,EAAKxV,MACT,OAAQa,KACDD,EAAO4U,EAAK3U,MACjBgV,EAAYH,EAAQ7U,MAAS+U,EAAWF,EAAQ7U,IAAOD,IAK1D,GAAKoJ,GACJ,GAAKsL,GAAchF,EAAY,CAC9B,GAAKgF,EAAa,CAEjBE,KACA3U,EAAIgV,EAAW7V,MACf,OAAQa,KACDD,EAAOiV,EAAWhV,KAEvB2U,EAAK5X,KAAOgY,EAAU/U,GAAKD,EAG7B0U,GAAY,KAAOO,KAAkBL,EAAMtE,GAI5CrQ,EAAIgV,EAAW7V,MACf,OAAQa,KACDD,EAAOiV,EAAWhV,MACtB2U,EAAOF,EAAazX,EAASmM,EAAMpJ,GAAS6U,EAAO5U,SAEpDmJ,EAAKwL,KAAUzR,EAAQyR,GAAQ5U,SAOlCiV,GAAaZ,GACZY,IAAe9R,EACd8R,EAAWtU,OAAQoU,EAAaE,EAAW7V,QAC3C6V,GAEGP,EACJA,EAAY,KAAMvR,EAAS8R,EAAY3E,GAEvCtT,EAAKkD,MAAOiD,EAAS8R,KAMzB,QAASC,IAAmB5B,GAwB3B,IAvBA,GAAI6B,GAAc/D,EAAS5Q,EAC1BD,EAAM+S,EAAOlU,OACbgW,EAAkB7Q,EAAK8K,SAAUiE,EAAO,GAAGpR,MAC3CmT,EAAmBD,GAAmB7Q,EAAK8K,SAAS,KACpDpP,EAAImV,EAAkB,EAAI,EAG1BE,EAAe1M,GAAe,SAAU5I,GACvC,MAAOA,KAASmV,GACdE,GAAkB,GACrBE,EAAkB3M,GAAe,SAAU5I,GAC1C,MAAO/C,GAASkY,EAAcnV,OAC5BqV,GAAkB,GACrBnB,GAAa,SAAUlU,EAAMzB,EAAS+R,GACrC,GAAI5Q,IAAS0V,IAAqB9E,GAAO/R,IAAYsG,MACnDsQ,EAAe5W,GAAS0K,SACxBqM,EAActV,EAAMzB,EAAS+R,GAC7BiF,EAAiBvV,EAAMzB,EAAS+R,GAGlC,OADA6E,GAAe,KACRzV,IAGDO,EAAIM,EAAKN,IAChB,GAAMmR,EAAU7M,EAAK8K,SAAUiE,EAAOrT,GAAGiC,MACxCgS,GAAatL,GAAcqL,GAAgBC,GAAY9C,QACjD,CAIN,GAHAA,EAAU7M,EAAKwI,OAAQuG,EAAOrT,GAAGiC,MAAOhC,MAAO,KAAMoT,EAAOrT,GAAGwD,SAG1D2N,EAAS3P,GAAY,CAGzB,IADAjB,IAAMP,EACEO,EAAID,EAAKC,IAChB,GAAK+D,EAAK8K,SAAUiE,EAAO9S,GAAG0B,MAC7B,KAGF,OAAOsS,IACNvU,EAAI,GAAKgU,GAAgBC,GACzBjU,EAAI,GAAKoK,GAERiJ,EAAOxW,MAAO,EAAGmD,EAAI,GAAIlD,QAAS6G,MAAgC,MAAzB0P,EAAQrT,EAAI,GAAIiC,KAAe,IAAM,MAC7EN,QAASlD,EAAO,MAClB0S,EACAnR,EAAIO,GAAK0U,GAAmB5B,EAAOxW,MAAOmD,EAAGO,IAC7CA,EAAID,GAAO2U,GAAoB5B,EAASA,EAAOxW,MAAO0D,IACtDA,EAAID,GAAO8J,GAAYiJ,IAGzBY,EAASlX,KAAMoU,GAIjB,MAAO6C,IAAgBC,GAGxB,QAASsB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYtW,OAAS,EAChCwW,EAAYH,EAAgBrW,OAAS,EACrCyW,EAAe,SAAUzM,EAAM7K,EAAS+R,EAAKnN,EAAS2S,GACrD,GAAI9V,GAAMQ,EAAG4Q,EACZ2E,EAAe,EACf9V,EAAI,IACJoR,EAAYjI,MACZ4M,KACAC,EAAgBpR,EAEhBpF,EAAQ2J,GAAQwM,GAAarR,EAAK0I,KAAU,IAAG,IAAK6I,GAEpDI,EAAiB3Q,GAA4B,MAAjB0Q,EAAwB,EAAIvU,KAAKC,UAAY,GACzEpB,EAAMd,EAAML,MASb,KAPK0W,IACJjR,EAAmBtG,IAAYnC,GAAYmC,GAAWuX,GAM/C7V,IAAMM,GAA4B,OAApBP,EAAOP,EAAMQ,IAAaA,IAAM,CACrD,GAAK2V,GAAa5V,EAAO,CACxBQ,EAAI,EACEjC,GAAWyB,EAAK2J,gBAAkBvN,IACvC4I,EAAahF,GACbsQ,GAAOpL,EAER,OAASkM,EAAUqE,EAAgBjV,KAClC,GAAK4Q,EAASpR,EAAMzB,GAAWnC,EAAUkU,GAAO,CAC/CnN,EAAQnG,KAAMgD,EACd,OAGG8V,IACJvQ,EAAU2Q,GAKPP,KAEE3V,GAAQoR,GAAWpR,IACxB+V,IAII3M,GACJiI,EAAUrU,KAAMgD,IAgBnB,GATA+V,GAAgB9V,EASX0V,GAAS1V,IAAM8V,EAAe,CAClCvV,EAAI,CACJ,OAAS4Q,EAAUsE,EAAYlV,KAC9B4Q,EAASC,EAAW2E,EAAYzX,EAAS+R,EAG1C,IAAKlH,EAAO,CAEX,GAAK2M,EAAe,EACnB,MAAQ9V,IACAoR,EAAUpR,IAAM+V,EAAW/V,KACjC+V,EAAW/V,GAAK+F,EAAIxI,KAAM2F,GAM7B6S,GAAa3B,GAAU2B,GAIxBhZ,EAAKkD,MAAOiD,EAAS6S,GAGhBF,IAAc1M,GAAQ4M,EAAW5W,OAAS,GAC5C2W,EAAeL,EAAYtW,OAAW,GAExCkF,GAAOsK,WAAYzL,GAUrB,MALK2S,KACJvQ,EAAU2Q,EACVrR,EAAmBoR,GAGb5E,EAGT,OAAOsE,GACN3K,GAAc6K,GACdA,EA+KF,MA5KAlR,GAAUL,GAAOK,QAAU,SAAUrG,EAAUiL,GAC9C,GAAItJ,GACHyV,KACAD,KACAhC,EAAS7N,EAAetH,EAAW,IAEpC,KAAMmV,EAAS,CAERlK,IACLA,EAAQ7E,EAAUpG,IAEnB2B,EAAIsJ,EAAMnK,MACV,OAAQa,IACPwT,EAASyB,GAAmB3L,EAAMtJ,IAC7BwT,EAAQhS,GACZiU,EAAY1Y,KAAMyW,GAElBgC,EAAgBzY,KAAMyW,EAKxBA,GAAS7N,EAAetH,EAAUkX,GAA0BC,EAAiBC,IAG7EjC,EAAOnV,SAAWA,EAEnB,MAAOmV,IAYR7O,EAASN,GAAOM,OAAS,SAAUtG,EAAUC,EAAS4E,EAASiG,GAC9D,GAAInJ,GAAGqT,EAAQ6C,EAAOjU,EAAM+K,EAC3BmJ,EAA+B,kBAAb9X,IAA2BA,EAC7CiL,GAASH,GAAQ1E,EAAWpG,EAAW8X,EAAS9X,UAAYA,EAM7D,IAJA6E,EAAUA,MAIY,IAAjBoG,EAAMnK,OAAe,CAIzB,GADAkU,EAAS/J,EAAM,GAAKA,EAAM,GAAGzM,MAAO,GAC/BwW,EAAOlU,OAAS,GAAkC,QAA5B+W,EAAQ7C,EAAO,IAAIpR,MACvB,IAArB3D,EAAQ0K,UAAkB/D,GAAkBX,EAAK8K,SAAUiE,EAAO,GAAGpR,MAAS,CAG/E,GADA3D,GAAYgG,EAAK0I,KAAS,GAAGkJ,EAAM1S,QAAQ,GAAG7B,QAAQiG,EAAWC,IAAYvJ,QAAkB,IACzFA,EACL,MAAO4E,EAGIiT,KACX7X,EAAUA,EAAQL,YAGnBI,EAAWA,EAASxB,MAAOwW,EAAOvI,QAAQnH,MAAMxE,QAIjDa,EAAI8G,EAAwB,aAAEmD,KAAM5L,GAAa,EAAIgV,EAAOlU,MAC5D,OAAQa,IAAM,CAIb,GAHAkW,EAAQ7C,EAAOrT,GAGVsE,EAAK8K,SAAWnN,EAAOiU,EAAMjU,MACjC,KAED,KAAM+K,EAAO1I,EAAK0I,KAAM/K,MAEjBkH,EAAO6D,EACZkJ,EAAM1S,QAAQ,GAAG7B,QAASiG,EAAWC,IACrCF,EAASsC,KAAMoJ,EAAO,GAAGpR,OAAUqI,GAAahM,EAAQL,aAAgBK,IACpE,CAKJ,GAFA+U,EAAO3S,OAAQV,EAAG,GAClB3B,EAAW8K,EAAKhK,QAAUiL,GAAYiJ,IAChChV,EAEL,MADAtB,GAAKkD,MAAOiD,EAASiG,GACdjG,CAGR,SAeJ,OAPEiT,GAAYzR,EAASrG,EAAUiL,IAChCH,EACA7K,GACC2G,EACD/B,GACC5E,GAAWqJ,EAASsC,KAAM5L,IAAciM,GAAahM,EAAQL,aAAgBK,GAExE4E,GAMR1F,EAAQsR,WAAatN,EAAQ4C,MAAM,IAAI3D,KAAMmF,GAAYyE,KAAK,MAAQ7I,EAItEhE,EAAQqR,mBAAqB/J,EAG7BC,IAIAvH,EAAQuQ,aAAe/C,GAAO,SAAUC,GAEvC,MAA0E,GAAnEA,EAAG0C,wBAAyBxR,EAAS0B,cAAc,eAMrDmN,GAAO,SAAUC,GAEtB,MADAA,GAAGkC,UAAY,mBAC+B,MAAvClC,EAAG+D,WAAW9E,aAAa,WAElCgB,GAAW,yBAA0B,SAAUnL,EAAMc,EAAM2D,GAC1D,IAAMA,EACL,MAAOzE,GAAKmK,aAAcrJ,EAA6B,SAAvBA,EAAKiC,cAA2B,EAAI,KAOjEtF,EAAQ6I,YAAe2E,GAAO,SAAUC,GAG7C,MAFAA,GAAGkC,UAAY,WACflC,EAAG+D,WAAW7E,aAAc,QAAS,IACY,KAA1Cc,EAAG+D,WAAW9E,aAAc,YAEnCgB,GAAW,QAAS,SAAUnL,EAAMc,EAAM2D,GACzC,IAAMA,GAAyC,UAAhCzE,EAAK8C,SAASC,cAC5B,MAAO/C,GAAKqW,eAOTpL,GAAO,SAAUC,GACtB,MAAsC,OAA/BA,EAAGf,aAAa,eAEvBgB,GAAWhF,EAAU,SAAUnG,EAAMc,EAAM2D,GAC1C,GAAI+J,EACJ,KAAM/J,EACL,MAAOzE,GAAMc,MAAW,EAAOA,EAAKiC,eACjCyL,EAAMxO,EAAKkN,iBAAkBpM,KAAW0N,EAAIC,UAC7CD,EAAI5K,MACL,OAKGU,IAEH/H,EAIJ8B,GAAO4O,KAAO3I,EACdjG,EAAOgQ,KAAO/J,EAAO6K,UAGrB9Q,EAAOgQ,KAAM,KAAQhQ,EAAOgQ,KAAK9H,QACjClI,EAAOuQ,WAAavQ,EAAOiY,OAAShS,EAAOsK,WAC3CvQ,EAAON,KAAOuG,EAAOE,QACrBnG,EAAOkY,SAAWjS,EAAOG,MACzBpG,EAAOgH,SAAWf,EAAOe,SACzBhH,EAAOmY,eAAiBlS,EAAOoK,MAK/B,IAAI5F,GAAM,SAAU9I,EAAM8I,EAAK2N,GAC9B,GAAIvF,MACHwF,EAAqBlV,SAAViV,CAEZ,QAAUzW,EAAOA,EAAM8I,KAA6B,IAAlB9I,EAAKiJ,SACtC,GAAuB,IAAlBjJ,EAAKiJ,SAAiB,CAC1B,GAAKyN,GAAYrY,EAAQ2B,GAAO2W,GAAIF,GACnC,KAEDvF,GAAQlU,KAAMgD,GAGhB,MAAOkR,IAIJ0F,EAAW,SAAUC,EAAG7W,GAG3B,IAFA,GAAIkR,MAEI2F,EAAGA,EAAIA,EAAElL,YACI,IAAfkL,EAAE5N,UAAkB4N,IAAM7W,GAC9BkR,EAAQlU,KAAM6Z,EAIhB,OAAO3F,IAIJ4F,EAAgBzY,EAAOgQ,KAAK9E,MAAMhC,aAElCwP,EAAa,kEAIbC,EAAY,gBAGhB,SAASC,GAAQ3I,EAAU4I,EAAW/F,GACrC,MAAK9S,GAAOgD,WAAY6V,GAChB7Y,EAAOiF,KAAMgL,EAAU,SAAUtO,EAAMC,GAC7C,QAASiX,EAAU1Z,KAAMwC,EAAMC,EAAGD,KAAWmR,IAK1C+F,EAAUjO,SACP5K,EAAOiF,KAAMgL,EAAU,SAAUtO,GACvC,MAASA,KAASkX,IAAgB/F,IAKV,gBAAd+F,GACJ7Y,EAAOiF,KAAMgL,EAAU,SAAUtO,GACvC,MAAS/C,GAAQO,KAAM0Z,EAAWlX,QAAkBmR,IAKjD6F,EAAU9M,KAAMgN,GACb7Y,EAAO0O,OAAQmK,EAAW5I,EAAU6C,IAI5C+F,EAAY7Y,EAAO0O,OAAQmK,EAAW5I,GAC/BjQ,EAAOiF,KAAMgL,EAAU,SAAUtO,GACvC,MAAS/C,GAAQO,KAAM0Z,EAAWlX,QAAkBmR,GAAyB,IAAlBnR,EAAKiJ,YAIlE5K,EAAO0O,OAAS,SAAUsB,EAAM5O,EAAO0R,GACtC,GAAInR,GAAOP,EAAO,EAMlB,OAJK0R,KACJ9C,EAAO,QAAUA,EAAO,KAGH,IAAjB5O,EAAML,QAAkC,IAAlBY,EAAKiJ,SACxB5K,EAAO4O,KAAKK,gBAAiBtN,EAAMqO,IAAWrO,MAG/C3B,EAAO4O,KAAKxJ,QAAS4K,EAAMhQ,EAAOiF,KAAM7D,EAAO,SAAUO,GAC/D,MAAyB,KAAlBA,EAAKiJ,aAId5K,EAAOG,GAAGoC,QACTqM,KAAM,SAAU3O,GACf,GAAI2B,GAAGP,EACNa,EAAM/D,KAAK4C,OACX+X,EAAO3a,IAER,IAAyB,gBAAb8B,GACX,MAAO9B,MAAKgD,UAAWnB,EAAQC,GAAWyO,OAAQ,WACjD,IAAM9M,EAAI,EAAGA,EAAIM,EAAKN,IACrB,GAAK5B,EAAOgH,SAAU8R,EAAMlX,GAAKzD,MAChC,OAAO,IAQX,KAFAkD,EAAMlD,KAAKgD,cAELS,EAAI,EAAGA,EAAIM,EAAKN,IACrB5B,EAAO4O,KAAM3O,EAAU6Y,EAAMlX,GAAKP,EAGnC,OAAOa,GAAM,EAAIlC,EAAOuQ,WAAYlP,GAAQA,GAE7CqN,OAAQ,SAAUzO,GACjB,MAAO9B,MAAKgD,UAAWyX,EAAQza,KAAM8B,OAAgB,KAEtD6S,IAAK,SAAU7S,GACd,MAAO9B,MAAKgD,UAAWyX,EAAQza,KAAM8B,OAAgB,KAEtDqY,GAAI,SAAUrY,GACb,QAAS2Y,EACRza,KAIoB,gBAAb8B,IAAyBwY,EAAc5M,KAAM5L,GACnDD,EAAQC,GACRA,OACD,GACCc,SASJ,IAAIgY,GAMHzP,EAAa,sCAEblJ,EAAOJ,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASqT,GACpD,GAAIrI,GAAOvJ,CAGX,KAAM1B,EACL,MAAO9B,KAQR,IAHAoV,EAAOA,GAAQwF,EAGU,gBAAb9Y,GAAwB,CAanC,GAPCiL,EALsB,MAAlBjL,EAAU,IACsB,MAApCA,EAAUA,EAASc,OAAS,IAC5Bd,EAASc,QAAU,GAGT,KAAMd,EAAU,MAGlBqJ,EAAWiC,KAAMtL,IAIrBiL,IAAWA,EAAO,IAAQhL,EA6CxB,OAAMA,GAAWA,EAAQW,QACtBX,GAAWqT,GAAO3E,KAAM3O,GAK1B9B,KAAK2C,YAAaZ,GAAU0O,KAAM3O,EAhDzC,IAAKiL,EAAO,GAAM,CAYjB,GAXAhL,EAAUA,YAAmBF,GAASE,EAAS,GAAMA,EAIrDF,EAAOsB,MAAOnD,KAAM6B,EAAOgZ,UAC1B9N,EAAO,GACPhL,GAAWA,EAAQ0K,SAAW1K,EAAQoL,eAAiBpL,EAAUnC,GACjE,IAII2a,EAAW7M,KAAMX,EAAO,KAASlL,EAAOiD,cAAe/C,GAC3D,IAAMgL,IAAShL,GAGTF,EAAOgD,WAAY7E,KAAM+M,IAC7B/M,KAAM+M,GAAShL,EAASgL,IAIxB/M,KAAK+R,KAAMhF,EAAOhL,EAASgL,GAK9B,OAAO/M,MAYP,MARAwD,GAAO5D,EAASyN,eAAgBN,EAAO,IAElCvJ,IAGJxD,KAAM,GAAMwD,EACZxD,KAAK4C,OAAS,GAER5C,KAcH,MAAK8B,GAAS2K,UACpBzM,KAAM,GAAM8B,EACZ9B,KAAK4C,OAAS,EACP5C,MAII6B,EAAOgD,WAAY/C,GACRkD,SAAfoQ,EAAK0F,MACX1F,EAAK0F,MAAOhZ,GAGZA,EAAUD,GAGLA,EAAO6E,UAAW5E,EAAU9B,MAIrCiC,GAAKQ,UAAYZ,EAAOG,GAGxB4Y,EAAa/Y,EAAQjC,EAGrB,IAAImb,GAAe,iCAGlBC,GACCC,UAAU,EACVC,UAAU,EACV3O,MAAM,EACN4O,MAAM,EAGRtZ,GAAOG,GAAGoC,QACT0Q,IAAK,SAAUnQ,GACd,GAAIyW,GAAUvZ,EAAQ8C,EAAQ3E,MAC7Bqb,EAAID,EAAQxY,MAEb,OAAO5C,MAAKuQ,OAAQ,WAEnB,IADA,GAAI9M,GAAI,EACAA,EAAI4X,EAAG5X,IACd,GAAK5B,EAAOgH,SAAU7I,KAAMob,EAAS3X,IACpC,OAAO,KAMX6X,QAAS,SAAU3I,EAAW5Q,GAC7B,GAAIiN,GACHvL,EAAI,EACJ4X,EAAIrb,KAAK4C,OACT8R,KACA0G,EAA+B,gBAAdzI,IAA0B9Q,EAAQ8Q,EAGpD,KAAM2H,EAAc5M,KAAMiF,GACzB,KAAQlP,EAAI4X,EAAG5X,IACd,IAAMuL,EAAMhP,KAAMyD,GAAKuL,GAAOA,IAAQjN,EAASiN,EAAMA,EAAItN,WAGxD,GAAKsN,EAAIvC,SAAW,KAAQ2O,EAC3BA,EAAQG,MAAOvM,MAGE,IAAjBA,EAAIvC,UACH5K,EAAO4O,KAAKK,gBAAiB9B,EAAK2D,IAAgB,CAEnD+B,EAAQlU,KAAMwO,EACd,OAMJ,MAAOhP,MAAKgD,UAAW0R,EAAQ9R,OAAS,EAAIf,EAAOuQ,WAAYsC,GAAYA,IAI5E6G,MAAO,SAAU/X,GAGhB,MAAMA,GAKe,gBAATA,GACJ/C,EAAQO,KAAMa,EAAQ2B,GAAQxD,KAAM,IAIrCS,EAAQO,KAAMhB,KAGpBwD,EAAKd,OAASc,EAAM,GAAMA,GAZjBxD,KAAM,IAAOA,KAAM,GAAI0B,WAAe1B,KAAK4D,QAAQ4X,UAAU5Y,WAgBxE6Y,IAAK,SAAU3Z,EAAUC,GACxB,MAAO/B,MAAKgD,UACXnB,EAAOuQ,WACNvQ,EAAOsB,MAAOnD,KAAK8C,MAAOjB,EAAQC,EAAUC,OAK/C2Z,QAAS,SAAU5Z,GAClB,MAAO9B,MAAKyb,IAAiB,MAAZ3Z,EAChB9B,KAAKoD,WAAapD,KAAKoD,WAAWmN,OAAQzO,MAK7C,SAAS6Z,GAAS3M,EAAK1C,GACtB,OAAU0C,EAAMA,EAAK1C,KAA4B,IAAjB0C,EAAIvC,UACpC,MAAOuC,GAGRnN,EAAOwB,MACN8Q,OAAQ,SAAU3Q,GACjB,GAAI2Q,GAAS3Q,EAAK9B,UAClB,OAAOyS,IAA8B,KAApBA,EAAO1H,SAAkB0H,EAAS,MAEpDyH,QAAS,SAAUpY,GAClB,MAAO8I,GAAK9I,EAAM,eAEnBqY,aAAc,SAAUrY,EAAMC,EAAGwW,GAChC,MAAO3N,GAAK9I,EAAM,aAAcyW,IAEjC1N,KAAM,SAAU/I,GACf,MAAOmY,GAASnY,EAAM,gBAEvB2X,KAAM,SAAU3X,GACf,MAAOmY,GAASnY,EAAM,oBAEvBsY,QAAS,SAAUtY,GAClB,MAAO8I,GAAK9I,EAAM,gBAEnBgY,QAAS,SAAUhY,GAClB,MAAO8I,GAAK9I,EAAM,oBAEnBuY,UAAW,SAAUvY,EAAMC,EAAGwW,GAC7B,MAAO3N,GAAK9I,EAAM,cAAeyW,IAElC+B,UAAW,SAAUxY,EAAMC,EAAGwW,GAC7B,MAAO3N,GAAK9I,EAAM,kBAAmByW,IAEtCG,SAAU,SAAU5W,GACnB,MAAO4W,IAAY5W,EAAK9B,gBAAmB+Q,WAAYjP,IAExDyX,SAAU,SAAUzX,GACnB,MAAO4W,GAAU5W,EAAKiP,aAEvByI,SAAU,SAAU1X,GACnB,MAAOA,GAAKyY,iBAAmBpa,EAAOsB,SAAWK,EAAKgJ,cAErD,SAAUlI,EAAMtC,GAClBH,EAAOG,GAAIsC,GAAS,SAAU2V,EAAOnY,GACpC,GAAI4S,GAAU7S,EAAO0B,IAAKvD,KAAMgC,EAAIiY,EAuBpC,OArB0B,UAArB3V,EAAKhE,YACTwB,EAAWmY,GAGPnY,GAAgC,gBAAbA,KACvB4S,EAAU7S,EAAO0O,OAAQzO,EAAU4S,IAG/B1U,KAAK4C,OAAS,IAGZoY,EAAkB1W,IACvBzC,EAAOuQ,WAAYsC,GAIfqG,EAAarN,KAAMpJ,IACvBoQ,EAAQwH,WAIHlc,KAAKgD,UAAW0R,KAGzB,IAAIyH,GAAgB,mBAKpB,SAASC,GAAe/X,GACvB,GAAIgY,KAIJ,OAHAxa,GAAOwB,KAAMgB,EAAQ0I,MAAOoP,OAAuB,SAAU5Q,EAAG+Q,GAC/DD,EAAQC,IAAS,IAEXD,EAyBRxa,EAAO0a,UAAY,SAAUlY,GAI5BA,EAA6B,gBAAZA,GAChB+X,EAAe/X,GACfxC,EAAOuC,UAAYC,EAEpB,IACCmY,GAGAC,EAGAC,EAGAC,EAGAjT,KAGAkT,KAGAC,KAGAC,EAAO,WAQN,IALAH,EAAStY,EAAQ0Y,KAIjBL,EAAQF,GAAS,EACTI,EAAMha,OAAQia,KAAmB,CACxCJ,EAASG,EAAMrO,OACf,SAAUsO,EAAcnT,EAAK9G,OAGvB8G,EAAMmT,GAAcnZ,MAAO+Y,EAAQ,GAAKA,EAAQ,OAAU,GAC9DpY,EAAQ2Y,cAGRH,EAAcnT,EAAK9G,OACnB6Z,GAAS,GAMNpY,EAAQoY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIHjT,EADI+S,KAKG,KAMV9B,GAGCc,IAAK,WA2BJ,MA1BK/R,KAGC+S,IAAWD,IACfK,EAAcnT,EAAK9G,OAAS,EAC5Bga,EAAMpc,KAAMic,IAGb,QAAWhB,GAAKjU,GACf3F,EAAOwB,KAAMmE,EAAM,SAAU+D,EAAGpE,GAC1BtF,EAAOgD,WAAYsC,GACjB9C,EAAQyV,QAAWa,EAAK7F,IAAK3N,IAClCuC,EAAKlJ,KAAM2G,GAEDA,GAAOA,EAAIvE,QAAiC,WAAvBf,EAAO6D,KAAMyB,IAG7CsU,EAAKtU,MAGHxD,WAEA8Y,IAAWD,GACfM,KAGK9c,MAIRid,OAAQ,WAYP,MAXApb,GAAOwB,KAAMM,UAAW,SAAU4H,EAAGpE,GACpC,GAAIoU,EACJ,QAAUA,EAAQ1Z,EAAO+E,QAASO,EAAKuC,EAAM6R,OAC5C7R,EAAKvF,OAAQoX,EAAO,GAGfA,GAASsB,GACbA,MAII7c,MAKR8U,IAAK,SAAU9S,GACd,MAAOA,GACNH,EAAO+E,QAAS5E,EAAI0H,MACpBA,EAAK9G,OAAS,GAIhBkT,MAAO,WAIN,MAHKpM,KACJA,MAEM1J,MAMRkd,QAAS,WAGR,MAFAP,GAASC,KACTlT,EAAO+S,EAAS,GACTzc,MAERqM,SAAU,WACT,OAAQ3C,GAMTyT,KAAM,WAKL,MAJAR,GAASC,KACHH,GAAWD,IAChB9S,EAAO+S,EAAS,IAEVzc,MAER2c,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAUrb,EAASyF,GAS5B,MARMmV,KACLnV,EAAOA,MACPA,GAASzF,EAASyF,EAAKlH,MAAQkH,EAAKlH,QAAUkH,GAC9CoV,EAAMpc,KAAMgH,GACNgV,GACLM,KAGK9c,MAIR8c,KAAM,WAEL,MADAnC,GAAKyC,SAAUpd,KAAM2D,WACd3D,MAIR0c,MAAO,WACN,QAASA,GAIZ,OAAO/B,GAIR,SAAS0C,GAAUC,GAClB,MAAOA,GAER,QAASC,GAASC,GACjB,KAAMA,GAGP,QAASC,GAAYrW,EAAOsW,EAASC,GACpC,GAAIC,EAEJ,KAGMxW,GAASvF,EAAOgD,WAAc+Y,EAASxW,EAAMyW,SACjDD,EAAO5c,KAAMoG,GAAQ4B,KAAM0U,GAAUI,KAAMH,GAGhCvW,GAASvF,EAAOgD,WAAc+Y,EAASxW,EAAM2W,MACxDH,EAAO5c,KAAMoG,EAAOsW,EAASC,GAO7BD,EAAQ1c,KAAMgE,OAAWoC,GAMzB,MAAQA,GAITuW,EAAO3c,KAAMgE,OAAWoC,IAI1BvF,EAAOuC,QAEN4Z,SAAU,SAAUC,GACnB,GAAIC,KAIA,SAAU,WAAYrc,EAAO0a,UAAW,UACzC1a,EAAO0a,UAAW,UAAY,IAC7B,UAAW,OAAQ1a,EAAO0a,UAAW,eACtC1a,EAAO0a,UAAW,eAAiB,EAAG,aACrC,SAAU,OAAQ1a,EAAO0a,UAAW,eACrC1a,EAAO0a,UAAW,eAAiB,EAAG,aAExC4B,EAAQ,UACRN,GACCM,MAAO,WACN,MAAOA,IAERC,OAAQ,WAEP,MADAC,GAASrV,KAAMrF,WAAYma,KAAMna,WAC1B3D,MAERse,QAAS,SAAUtc,GAClB,MAAO6b,GAAQE,KAAM,KAAM/b,IAI5Buc,KAAM,WACL,GAAIC,GAAM7a,SAEV,OAAO9B,GAAOmc,SAAU,SAAUS,GACjC5c,EAAOwB,KAAM6a,EAAQ,SAAUza,EAAGib,GAGjC,GAAI1c,GAAKH,EAAOgD,WAAY2Z,EAAKE,EAAO,MAAWF,EAAKE,EAAO,GAK/DL,GAAUK,EAAO,IAAO,WACvB,GAAIC,GAAW3c,GAAMA,EAAG0B,MAAO1D,KAAM2D,UAChCgb,IAAY9c,EAAOgD,WAAY8Z,EAASd,SAC5Cc,EAASd,UACPe,SAAUH,EAASI,QACnB7V,KAAMyV,EAASf,SACfI,KAAMW,EAASd,QAEjBc,EAAUC,EAAO,GAAM,QACtB1e,KACAgC,GAAO2c,GAAahb,eAKxB6a,EAAM,OACHX,WAELE,KAAM,SAAUe,EAAaC,EAAYC,GACxC,GAAIC,GAAW,CACf,SAASvB,GAASwB,EAAOb,EAAUxP,EAASsQ,GAC3C,MAAO,YACN,GAAIC,GAAOpf,KACVwH,EAAO7D,UACP0b,EAAa,WACZ,GAAIV,GAAUZ,CAKd,MAAKmB,EAAQD,GAAb,CAQA,GAJAN,EAAW9P,EAAQnL,MAAO0b,EAAM5X,GAI3BmX,IAAaN,EAASR,UAC1B,KAAM,IAAIyB,WAAW,2BAOtBvB,GAAOY,IAKgB,gBAAbA,IACY,kBAAbA,KACRA,EAASZ,KAGLlc,EAAOgD,WAAYkZ,GAGlBoB,EACJpB,EAAK/c,KACJ2d,EACAjB,EAASuB,EAAUZ,EAAUhB,EAAU8B,GACvCzB,EAASuB,EAAUZ,EAAUd,EAAS4B,KAOvCF,IAEAlB,EAAK/c,KACJ2d,EACAjB,EAASuB,EAAUZ,EAAUhB,EAAU8B,GACvCzB,EAASuB,EAAUZ,EAAUd,EAAS4B,GACtCzB,EAASuB,EAAUZ,EAAUhB,EAC5BgB,EAASkB,eASP1Q,IAAYwO,IAChB+B,EAAOpa,OACPwC,GAASmX,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5X,MAK7CiY,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ3S,GAEJ7K,EAAOmc,SAAS0B,eACpB7d,EAAOmc,SAAS0B,cAAehT,EAC9B+S,EAAQE,YAMLT,EAAQ,GAAKD,IAIZpQ,IAAY0O,IAChB6B,EAAOpa,OACPwC,GAASkF,IAGV2R,EAASuB,WAAYR,EAAM5X,KAS3B0X,GACJO,KAKK5d,EAAOmc,SAAS6B,eACpBJ,EAAQE,WAAa9d,EAAOmc,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,MAAO5d,GAAOmc,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAIzC,IAChBiC,EACC,EACAe,EACA5c,EAAOgD,WAAYma,GAClBA,EACA3B,EACDoB,EAASc,aAKXrB,EAAQ,GAAK,GAAIzC,IAChBiC,EACC,EACAe,EACA5c,EAAOgD,WAAYia,GAClBA,EACAzB,IAKHa,EAAQ,GAAK,GAAIzC,IAChBiC,EACC,EACAe,EACA5c,EAAOgD,WAAYka,GAClBA,EACAxB,MAGAM,WAKLA,QAAS,SAAUpY,GAClB,MAAc,OAAPA,EAAc5D,EAAOuC,OAAQqB,EAAKoY,GAAYA,IAGvDQ,IA2DD,OAxDAxc,GAAOwB,KAAM6a,EAAQ,SAAUza,EAAGib,GACjC,GAAIhV,GAAOgV,EAAO,GACjBqB,EAAcrB,EAAO,EAKtBb,GAASa,EAAO,IAAQhV,EAAK+R,IAGxBsE,GACJrW,EAAK+R,IACJ,WAIC0C,EAAQ4B,GAKT7B,EAAQ,EAAIza,GAAK,GAAIyZ,QAGrBgB,EAAQ,GAAK,GAAIf,MAOnBzT,EAAK+R,IAAKiD,EAAO,GAAI5B,MAKrBuB,EAAUK,EAAO,IAAQ,WAExB,MADAL,GAAUK,EAAO,GAAM,QAAU1e,OAASqe,EAAWrZ,OAAYhF,KAAM2D,WAChE3D,MAMRqe,EAAUK,EAAO,GAAM,QAAWhV,EAAK0T,WAIxCS,EAAQA,QAASQ,GAGZJ,GACJA,EAAKjd,KAAMqd,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,GAGCC,GAAYvc,UAAUf,OAGtBa,EAAIyc,EAGJC,EAAkBxa,MAAOlC,GACzB2c,EAAgB9f,EAAMU,KAAM2C,WAG5B0c,EAASxe,EAAOmc,WAGhBsC,EAAa,SAAU7c,GACtB,MAAO,UAAU2D,GAChB+Y,EAAiB1c,GAAMzD,KACvBogB,EAAe3c,GAAME,UAAUf,OAAS,EAAItC,EAAMU,KAAM2C,WAAcyD,IAC5D8Y,GACTG,EAAOb,YAAaW,EAAiBC,IAMzC,IAAKF,GAAa,IACjBzC,EAAYwC,EAAaI,EAAOrX,KAAMsX,EAAY7c,IAAMia,QAAS2C,EAAO1C,QAGhD,YAAnB0C,EAAOlC,SACXtc,EAAOgD,WAAYub,EAAe3c,IAAO2c,EAAe3c,GAAIsa,OAE5D,MAAOsC,GAAOtC,MAKhB,OAAQta,IACPga,EAAY2C,EAAe3c,GAAK6c,EAAY7c,GAAK4c,EAAO1C,OAGzD,OAAO0C,GAAOxC,YAOhB,IAAI0C,GAAc,wDAElB1e,GAAOmc,SAAS0B,cAAgB,SAAUpa,EAAOkb,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQpb,GAASib,EAAY7S,KAAMpI,EAAMhB,OAC9EvE,EAAO0gB,QAAQC,KAAM,8BAAgCpb,EAAMqb,QAASrb,EAAMkb,MAAOA,IAOnF3e,EAAO+e,eAAiB,SAAUtb,GACjCvF,EAAO+f,WAAY,WAClB,KAAMxa,KAQR,IAAIub,GAAYhf,EAAOmc,UAEvBnc,GAAOG,GAAG8Y,MAAQ,SAAU9Y,GAY3B,MAVA6e,GACE9C,KAAM/b,GADR6e,SAMS,SAAUvb,GACjBzD,EAAO+e,eAAgBtb,KAGlBtF,MAGR6B,EAAOuC,QAGNiB,SAAS,EAITyb,UAAW;AAGXC,UAAW,SAAUC,GACfA,EACJnf,EAAOif,YAEPjf,EAAOiZ,OAAO,IAKhBA,MAAO,SAAUmG,IAGXA,KAAS,IAASpf,EAAOif,UAAYjf,EAAOwD,WAKjDxD,EAAOwD,SAAU,EAGZ4b,KAAS,KAAUpf,EAAOif,UAAY,GAK3CD,EAAUrB,YAAa5f,GAAYiC,QAIrCA,EAAOiZ,MAAMiD,KAAO8C,EAAU9C,IAG9B,SAASmD,KACRthB,EAASuhB,oBAAqB,mBAAoBD,GAClDnhB,EAAOohB,oBAAqB,OAAQD,GACpCrf,EAAOiZ,QAOqB,aAAxBlb,EAASwhB,YACa,YAAxBxhB,EAASwhB,aAA6BxhB,EAAS+P,gBAAgB0R,SAGjEthB,EAAO+f,WAAYje,EAAOiZ,QAK1Blb,EAASqQ,iBAAkB,mBAAoBiR,GAG/CnhB,EAAOkQ,iBAAkB,OAAQiR,GAQlC,IAAII,GAAS,SAAUre,EAAOjB,EAAIqM,EAAKjH,EAAOma,EAAWC,EAAUC,GAClE,GAAIhe,GAAI,EACPM,EAAMd,EAAML,OACZ8e,EAAc,MAAPrT,CAGR,IAA4B,WAAvBxM,EAAO6D,KAAM2I,GAAqB,CACtCkT,GAAY,CACZ,KAAM9d,IAAK4K,GACViT,EAAQre,EAAOjB,EAAIyB,EAAG4K,EAAK5K,IAAK,EAAM+d,EAAUC,OAI3C,IAAezc,SAAVoC,IACXma,GAAY,EAEN1f,EAAOgD,WAAYuC,KACxBqa,GAAM,GAGFC,IAGCD,GACJzf,EAAGhB,KAAMiC,EAAOmE,GAChBpF,EAAK,OAIL0f,EAAO1f,EACPA,EAAK,SAAUwB,EAAM6K,EAAKjH,GACzB,MAAOsa,GAAK1gB,KAAMa,EAAQ2B,GAAQ4D,MAKhCpF,GACJ,KAAQyB,EAAIM,EAAKN,IAChBzB,EACCiB,EAAOQ,GAAK4K,EAAKoT,EACjBra,EACAA,EAAMpG,KAAMiC,EAAOQ,GAAKA,EAAGzB,EAAIiB,EAAOQ,GAAK4K,IAM/C,OAAKkT,GACGte,EAIHye,EACG1f,EAAGhB,KAAMiC,GAGVc,EAAM/B,EAAIiB,EAAO,GAAKoL,GAAQmT,GAElCG,EAAa,SAAUC,GAQ1B,MAA0B,KAAnBA,EAAMnV,UAAqC,IAAnBmV,EAAMnV,YAAsBmV,EAAMnV,SAMlE,SAASoV,KACR7hB,KAAKiF,QAAUpD,EAAOoD,QAAU4c,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAKpf,WAEJ2L,MAAO,SAAUwT,GAGhB,GAAIxa,GAAQwa,EAAO5hB,KAAKiF,QA4BxB,OAzBMmC,KACLA,KAKKua,EAAYC,KAIXA,EAAMnV,SACVmV,EAAO5hB,KAAKiF,SAAYmC,EAMxBhH,OAAO2hB,eAAgBH,EAAO5hB,KAAKiF,SAClCmC,MAAOA,EACP4a,cAAc,MAMX5a,GAER6a,IAAK,SAAUL,EAAOM,EAAM9a,GAC3B,GAAI+a,GACH/T,EAAQpO,KAAKoO,MAAOwT,EAIrB,IAAqB,gBAATM,GACX9T,EAAOvM,EAAOuE,UAAW8b,IAAW9a,MAMpC,KAAM+a,IAAQD,GACb9T,EAAOvM,EAAOuE,UAAW+b,IAAWD,EAAMC,EAG5C,OAAO/T,IAERtL,IAAK,SAAU8e,EAAOvT,GACrB,MAAerJ,UAARqJ,EACNrO,KAAKoO,MAAOwT,GAGZA,EAAO5hB,KAAKiF,UAAa2c,EAAO5hB,KAAKiF,SAAWpD,EAAOuE,UAAWiI,KAEpEiT,OAAQ,SAAUM,EAAOvT,EAAKjH,GAa7B,MAAapC,UAARqJ,GACCA,GAAsB,gBAARA,IAAgCrJ,SAAVoC,EAElCpH,KAAK8C,IAAK8e,EAAOvT,IASzBrO,KAAKiiB,IAAKL,EAAOvT,EAAKjH,GAILpC,SAAVoC,EAAsBA,EAAQiH,IAEtC4O,OAAQ,SAAU2E,EAAOvT,GACxB,GAAI5K,GACH2K,EAAQwT,EAAO5hB,KAAKiF,QAErB,IAAeD,SAAVoJ,EAAL,CAIA,GAAapJ,SAARqJ,EAAoB,CAGnBxM,EAAOkD,QAASsJ,GAIpBA,EAAMA,EAAI9K,IAAK1B,EAAOuE,YAEtBiI,EAAMxM,EAAOuE,UAAWiI,GAIxBA,EAAMA,IAAOD,IACVC,GACAA,EAAItB,MAAOoP,QAGf1Y,EAAI4K,EAAIzL,MAER,OAAQa,UACA2K,GAAOC,EAAK5K,KAKRuB,SAARqJ,GAAqBxM,EAAOqE,cAAekI,MAM1CwT,EAAMnV,SACVmV,EAAO5hB,KAAKiF,SAAYD,aAEjB4c,GAAO5hB,KAAKiF,YAItBmd,QAAS,SAAUR,GAClB,GAAIxT,GAAQwT,EAAO5hB,KAAKiF,QACxB,OAAiBD,UAAVoJ,IAAwBvM,EAAOqE,cAAekI,IAGvD,IAAIiU,GAAW,GAAIR,GAEfS,EAAW,GAAIT,GAcfU,EAAS,gCACZC,EAAa,QAEd,SAASC,GAASP,GACjB,MAAc,SAATA,GAIS,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAO7U,KAAMwU,GACVQ,KAAKC,MAAOT,GAGbA,GAGR,QAASU,GAAUpf,EAAM6K,EAAK6T,GAC7B,GAAI5d,EAIJ,IAAcU,SAATkd,GAAwC,IAAlB1e,EAAKiJ,SAI/B,GAHAnI,EAAO,QAAU+J,EAAIjJ,QAASod,EAAY,OAAQjc,cAClD2b,EAAO1e,EAAKmK,aAAcrJ,GAEL,gBAAT4d,GAAoB,CAC/B,IACCA,EAAOO,EAASP,GACf,MAAQxV,IAGV4V,EAASL,IAAKze,EAAM6K,EAAK6T,OAEzBA,GAAOld,MAGT,OAAOkd,GAGRrgB,EAAOuC,QACNge,QAAS,SAAU5e,GAClB,MAAO8e,GAASF,QAAS5e,IAAU6e,EAASD,QAAS5e,IAGtD0e,KAAM,SAAU1e,EAAMc,EAAM4d,GAC3B,MAAOI,GAAShB,OAAQ9d,EAAMc,EAAM4d,IAGrCW,WAAY,SAAUrf,EAAMc,GAC3Bge,EAASrF,OAAQzZ,EAAMc,IAKxBwe,MAAO,SAAUtf,EAAMc,EAAM4d,GAC5B,MAAOG,GAASf,OAAQ9d,EAAMc,EAAM4d,IAGrCa,YAAa,SAAUvf,EAAMc,GAC5B+d,EAASpF,OAAQzZ,EAAMc,MAIzBzC,EAAOG,GAAGoC,QACT8d,KAAM,SAAU7T,EAAKjH,GACpB,GAAI3D,GAAGa,EAAM4d,EACZ1e,EAAOxD,KAAM,GACb4O,EAAQpL,GAAQA,EAAKsG,UAGtB,IAAa9E,SAARqJ,EAAoB,CACxB,GAAKrO,KAAK4C,SACTsf,EAAOI,EAASxf,IAAKU,GAEE,IAAlBA,EAAKiJ,WAAmB4V,EAASvf,IAAKU,EAAM,iBAAmB,CACnEC,EAAImL,EAAMhM,MACV,OAAQa,IAIFmL,EAAOnL,KACXa,EAAOsK,EAAOnL,GAAIa,KACe,IAA5BA,EAAK7D,QAAS,WAClB6D,EAAOzC,EAAOuE,UAAW9B,EAAKhE,MAAO,IACrCsiB,EAAUpf,EAAMc,EAAM4d,EAAM5d,KAI/B+d,GAASJ,IAAKze,EAAM,gBAAgB,GAItC,MAAO0e,GAIR,MAAoB,gBAAR7T,GACJrO,KAAKqD,KAAM,WACjBif,EAASL,IAAKjiB,KAAMqO,KAIfiT,EAAQthB,KAAM,SAAUoH,GAC9B,GAAI8a,EAOJ,IAAK1e,GAAkBwB,SAAVoC,EAAb,CAKC,GADA8a,EAAOI,EAASxf,IAAKU,EAAM6K,GACbrJ,SAATkd,EACJ,MAAOA,EAMR,IADAA,EAAOU,EAAUpf,EAAM6K,GACTrJ,SAATkd,EACJ,MAAOA,OAQTliB,MAAKqD,KAAM,WAGVif,EAASL,IAAKjiB,KAAMqO,EAAKjH,MAExB,KAAMA,EAAOzD,UAAUf,OAAS,EAAG,MAAM,IAG7CigB,WAAY,SAAUxU,GACrB,MAAOrO,MAAKqD,KAAM,WACjBif,EAASrF,OAAQjd,KAAMqO,QAM1BxM,EAAOuC,QACNwY,MAAO,SAAUpZ,EAAMkC,EAAMwc,GAC5B,GAAItF,EAEJ,IAAKpZ,EAYJ,MAXAkC,IAASA,GAAQ,MAAS,QAC1BkX,EAAQyF,EAASvf,IAAKU,EAAMkC,GAGvBwc,KACEtF,GAAS/a,EAAOkD,QAASmd,GAC9BtF,EAAQyF,EAASf,OAAQ9d,EAAMkC,EAAM7D,EAAO6E,UAAWwb,IAEvDtF,EAAMpc,KAAM0hB,IAGPtF,OAIToG,QAAS,SAAUxf,EAAMkC,GACxBA,EAAOA,GAAQ,IAEf,IAAIkX,GAAQ/a,EAAO+a,MAAOpZ,EAAMkC,GAC/Bud,EAAcrG,EAAMha,OACpBZ,EAAK4a,EAAMrO,QACX2U,EAAQrhB,EAAOshB,YAAa3f,EAAMkC,GAClC6G,EAAO,WACN1K,EAAOmhB,QAASxf,EAAMkC,GAIZ,gBAAP1D,IACJA,EAAK4a,EAAMrO,QACX0U,KAGIjhB,IAIU,OAAT0D,GACJkX,EAAMhL,QAAS,oBAITsR,GAAME,KACbphB,EAAGhB,KAAMwC,EAAM+I,EAAM2W,KAGhBD,GAAeC,GACpBA,EAAMpN,MAAMgH,QAKdqG,YAAa,SAAU3f,EAAMkC,GAC5B,GAAI2I,GAAM3I,EAAO,YACjB,OAAO2c,GAASvf,IAAKU,EAAM6K,IAASgU,EAASf,OAAQ9d,EAAM6K,GAC1DyH,MAAOjU,EAAO0a,UAAW,eAAgBd,IAAK,WAC7C4G,EAASpF,OAAQzZ,GAAQkC,EAAO,QAAS2I,WAM7CxM,EAAOG,GAAGoC,QACTwY,MAAO,SAAUlX,EAAMwc,GACtB,GAAImB,GAAS,CAQb,OANqB,gBAAT3d,KACXwc,EAAOxc,EACPA,EAAO,KACP2d,KAGI1f,UAAUf,OAASygB,EAChBxhB,EAAO+a,MAAO5c,KAAM,GAAK0F,GAGjBV,SAATkd,EACNliB,KACAA,KAAKqD,KAAM,WACV,GAAIuZ,GAAQ/a,EAAO+a,MAAO5c,KAAM0F,EAAMwc,EAGtCrgB,GAAOshB,YAAanjB,KAAM0F,GAEZ,OAATA,GAAgC,eAAfkX,EAAO,IAC5B/a,EAAOmhB,QAAShjB,KAAM0F,MAI1Bsd,QAAS,SAAUtd,GAClB,MAAO1F,MAAKqD,KAAM,WACjBxB,EAAOmhB,QAAShjB,KAAM0F,MAGxB4d,WAAY,SAAU5d,GACrB,MAAO1F,MAAK4c,MAAOlX,GAAQ,UAK5BmY,QAAS,SAAUnY,EAAMD,GACxB,GAAI8B,GACHgc,EAAQ,EACRC,EAAQ3hB,EAAOmc,WACflM,EAAW9R,KACXyD,EAAIzD,KAAK4C,OACT8a,EAAU,aACC6F,GACTC,EAAMhE,YAAa1N,GAAYA,IAIb,iBAATpM,KACXD,EAAMC,EACNA,EAAOV,QAERU,EAAOA,GAAQ,IAEf,OAAQjC,IACP8D,EAAM8a,EAASvf,IAAKgP,EAAUrO,GAAKiC,EAAO,cACrC6B,GAAOA,EAAIuO,QACfyN,IACAhc,EAAIuO,MAAM2F,IAAKiC,GAIjB,OADAA,KACO8F,EAAM3F,QAASpY,KAGxB,IAAIge,GAAO,sCAA0CC,OAEjDC,GAAU,GAAI1Z,QAAQ,iBAAmBwZ,EAAO,cAAe,KAG/DG,IAAc,MAAO,QAAS,SAAU,QAExCC,GAAqB,SAAUrgB,EAAMkL,GAOvC,MAHAlL,GAAOkL,GAAMlL,EAGiB,SAAvBA,EAAKsgB,MAAMC,SACM,KAAvBvgB,EAAKsgB,MAAMC,SAMXliB,EAAOgH,SAAUrF,EAAK2J,cAAe3J,IAEH,SAAlC3B,EAAOmiB,IAAKxgB,EAAM,YAGjBygB,GAAO,SAAUzgB,EAAMa,EAASf,EAAUkE,GAC7C,GAAItE,GAAKoB,EACR4f,IAGD,KAAM5f,IAAQD,GACb6f,EAAK5f,GAASd,EAAKsgB,MAAOxf,GAC1Bd,EAAKsgB,MAAOxf,GAASD,EAASC,EAG/BpB,GAAMI,EAASI,MAAOF,EAAMgE,MAG5B,KAAMlD,IAAQD,GACbb,EAAKsgB,MAAOxf,GAAS4f,EAAK5f,EAG3B,OAAOpB,GAMR,SAASihB,IAAW3gB,EAAM2e,EAAMiC,EAAYC,GAC3C,GAAIC,GACHC,EAAQ,EACRC,EAAgB,GAChBC,EAAeJ,EACd,WACC,MAAOA,GAAMrV,OAEd,WACC,MAAOnN,GAAOmiB,IAAKxgB,EAAM2e,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAASviB,EAAO+iB,UAAWzC,GAAS,GAAK,MAG1E0C,GAAkBhjB,EAAO+iB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAC/Df,GAAQvW,KAAMvL,EAAOmiB,IAAKxgB,EAAM2e,GAElC,IAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAGnDA,EAAOA,GAAQE,EAAe,GAG9BT,EAAaA,MAGbS,GAAiBH,GAAW,CAE5B,GAICH,GAAQA,GAAS,KAGjBM,GAAgCN,EAChC1iB,EAAOiiB,MAAOtgB,EAAM2e,EAAM0C,EAAgBF,SAK1CJ,KAAYA,EAAQE,IAAiBC,IAAuB,IAAVH,KAAiBC,GAiBrE,MAbKJ,KACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAMnQ,MAAQ2Q,EACdR,EAAMpgB,IAAMqgB,IAGPA,EAIR,GAAIQ,MAEJ,SAASC,IAAmBvhB,GAC3B,GAAI4U,GACHhX,EAAMoC,EAAK2J,cACX7G,EAAW9C,EAAK8C,SAChByd,EAAUe,GAAmBxe,EAE9B,OAAKyd,GACGA,GAGR3L,EAAOhX,EAAI4jB,KAAKvjB,YAAaL,EAAIE,cAAegF,IAChDyd,EAAUliB,EAAOmiB,IAAK5L,EAAM,WAE5BA,EAAK1W,WAAWC,YAAayW,GAEZ,SAAZ2L,IACJA,EAAU,SAEXe,GAAmBxe,GAAayd,EAEzBA,GAGR,QAASkB,IAAUnT,EAAUoT,GAO5B,IANA,GAAInB,GAASvgB,EACZ2hB,KACA5J,EAAQ,EACR3Y,EAASkP,EAASlP,OAGX2Y,EAAQ3Y,EAAQ2Y,IACvB/X,EAAOsO,EAAUyJ,GACX/X,EAAKsgB,QAIXC,EAAUvgB,EAAKsgB,MAAMC,QAChBmB,GAKa,SAAZnB,IACJoB,EAAQ5J,GAAU8G,EAASvf,IAAKU,EAAM,YAAe,KAC/C2hB,EAAQ5J,KACb/X,EAAKsgB,MAAMC,QAAU,KAGK,KAAvBvgB,EAAKsgB,MAAMC,SAAkBF,GAAoBrgB,KACrD2hB,EAAQ5J,GAAUwJ,GAAmBvhB,KAGrB,SAAZugB,IACJoB,EAAQ5J,GAAU,OAGlB8G,EAASJ,IAAKze,EAAM,UAAWugB,IAMlC,KAAMxI,EAAQ,EAAGA,EAAQ3Y,EAAQ2Y,IACR,MAAnB4J,EAAQ5J,KACZzJ,EAAUyJ,GAAQuI,MAAMC,QAAUoB,EAAQ5J,GAI5C,OAAOzJ,GAGRjQ,EAAOG,GAAGoC,QACT8gB,KAAM,WACL,MAAOD,IAAUjlB,MAAM,IAExBolB,KAAM,WACL,MAAOH,IAAUjlB,OAElBqlB,OAAQ,SAAUlH,GACjB,MAAsB,iBAAVA,GACJA,EAAQne,KAAKklB,OAASllB,KAAKolB,OAG5BplB,KAAKqD,KAAM,WACZwgB,GAAoB7jB,MACxB6B,EAAQ7B,MAAOklB,OAEfrjB,EAAQ7B,MAAOolB,WAKnB,IAAIE,IAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,4BAKdC,IAGHC,QAAU,EAAG,+BAAgC,aAK7CC,OAAS,EAAG,UAAW,YACvBC,KAAO,EAAG,oBAAqB,uBAC/BC,IAAM,EAAG,iBAAkB,oBAC3BC,IAAM,EAAG,qBAAsB,yBAE/BC,UAAY,EAAG,GAAI,IAIpBN,IAAQO,SAAWP,GAAQC,OAE3BD,GAAQQ,MAAQR,GAAQS,MAAQT,GAAQU,SAAWV,GAAQW,QAAUX,GAAQE,MAC7EF,GAAQY,GAAKZ,GAAQK,EAGrB,SAASQ,IAAQvkB,EAAS4O,GAIzB,GAAIzN,EAYJ,OATCA,GAD4C,mBAAjCnB,GAAQwL,qBACbxL,EAAQwL,qBAAsBoD,GAAO,KAEI,mBAA7B5O,GAAQiM,iBACpBjM,EAAQiM,iBAAkB2C,GAAO,QAM3B3L,SAAR2L,GAAqBA,GAAO9O,EAAOyE,SAAUvE,EAAS4O,GACnD9O,EAAOsB,OAASpB,GAAWmB,GAG5BA,EAKR,QAASqjB,IAAetjB,EAAOujB,GAI9B,IAHA,GAAI/iB,GAAI,EACP4X,EAAIpY,EAAML,OAEHa,EAAI4X,EAAG5X,IACd4e,EAASJ,IACRhf,EAAOQ,GACP,cACC+iB,GAAenE,EAASvf,IAAK0jB,EAAa/iB,GAAK,eAMnD,GAAIgjB,IAAQ,WAEZ,SAASC,IAAezjB,EAAOlB,EAAS4kB,EAASC,EAAWC,GAO3D,IANA,GAAIrjB,GAAM+D,EAAKoJ,EAAKmW,EAAMje,EAAU7E,EACnC+iB,EAAWhlB,EAAQilB,yBACnBC,KACAxjB,EAAI,EACJ4X,EAAIpY,EAAML,OAEHa,EAAI4X,EAAG5X,IAGd,GAFAD,EAAOP,EAAOQ,GAETD,GAAiB,IAATA,EAGZ,GAA6B,WAAxB3B,EAAO6D,KAAMlC,GAIjB3B,EAAOsB,MAAO8jB,EAAOzjB,EAAKiJ,UAAajJ,GAASA,OAG1C,IAAMijB,GAAM/Y,KAAMlK,GAIlB,CACN+D,EAAMA,GAAOwf,EAAStlB,YAAaM,EAAQT,cAAe,QAG1DqP,GAAQ4U,GAASnY,KAAM5J,KAAY,GAAI,KAAQ,GAAI+C,cACnDugB,EAAOrB,GAAS9U,IAAS8U,GAAQM,SACjCxe,EAAIqJ,UAAYkW,EAAM,GAAMjlB,EAAOqlB,cAAe1jB,GAASsjB,EAAM,GAGjE9iB,EAAI8iB,EAAM,EACV,OAAQ9iB,IACPuD,EAAMA,EAAI8M,SAKXxS,GAAOsB,MAAO8jB,EAAO1f,EAAIiF,YAGzBjF,EAAMwf,EAAStU,WAGflL,EAAIiL,YAAc,OAzBlByU,GAAMzmB,KAAMuB,EAAQolB,eAAgB3jB,GA+BvCujB,GAASvU,YAAc,GAEvB/O,EAAI,CACJ,OAAUD,EAAOyjB,EAAOxjB,KAGvB,GAAKmjB,GAAa/kB,EAAO+E,QAASpD,EAAMojB,MAClCC,GACJA,EAAQrmB,KAAMgD,OAgBhB,IAXAqF,EAAWhH,EAAOgH,SAAUrF,EAAK2J,cAAe3J,GAGhD+D,EAAM+e,GAAQS,EAAStlB,YAAa+B,GAAQ,UAGvCqF,GACJ0d,GAAehf,GAIXof,EAAU,CACd3iB,EAAI,CACJ,OAAUR,EAAO+D,EAAKvD,KAChBwhB,GAAY9X,KAAMlK,EAAKkC,MAAQ,KACnCihB,EAAQnmB,KAAMgD,GAMlB,MAAOujB,IAIR,WACC,GAAIA,GAAWnnB,EAASonB,yBACvBI,EAAML,EAAStlB,YAAa7B,EAAS0B,cAAe,QACpDuP,EAAQjR,EAAS0B,cAAe,QAMjCuP,GAAMjD,aAAc,OAAQ,SAC5BiD,EAAMjD,aAAc,UAAW,WAC/BiD,EAAMjD,aAAc,OAAQ,KAE5BwZ,EAAI3lB,YAAaoP,GAIjB5P,EAAQomB,WAAaD,EAAIE,WAAW,GAAOA,WAAW,GAAOjT,UAAUsB,QAIvEyR,EAAIxW,UAAY,yBAChB3P,EAAQsmB,iBAAmBH,EAAIE,WAAW,GAAOjT,UAAUwF,eAE5D,IAAIlK,IAAkB/P,EAAS+P,gBAK9B6X,GAAY,OACZC,GAAc,iDACdC,GAAiB,qBAElB,SAASC,MACR,OAAO,EAGR,QAASC,MACR,OAAO,EAKR,QAASC,MACR,IACC,MAAOjoB,GAAS0V,cACf,MAAQwS,KAGX,QAASC,IAAIvkB,EAAMwkB,EAAOlmB,EAAUogB,EAAMlgB,EAAIimB,GAC7C,GAAIC,GAAQxiB,CAGZ,IAAsB,gBAAVsiB,GAAqB,CAGP,gBAAblmB,KAGXogB,EAAOA,GAAQpgB,EACfA,EAAWkD,OAEZ,KAAMU,IAAQsiB,GACbD,GAAIvkB,EAAMkC,EAAM5D,EAAUogB,EAAM8F,EAAOtiB,GAAQuiB,EAEhD,OAAOzkB,GAsBR,GAnBa,MAAR0e,GAAsB,MAANlgB,GAGpBA,EAAKF,EACLogB,EAAOpgB,EAAWkD,QACD,MAANhD,IACc,gBAAbF,IAGXE,EAAKkgB,EACLA,EAAOld,SAIPhD,EAAKkgB,EACLA,EAAOpgB,EACPA,EAAWkD,SAGRhD,KAAO,EACXA,EAAK4lB,OACC,KAAM5lB,EACZ,MAAOwB,EAeR,OAZa,KAARykB,IACJC,EAASlmB,EACTA,EAAK,SAAUmmB,GAId,MADAtmB,KAASumB,IAAKD,GACPD,EAAOxkB,MAAO1D,KAAM2D,YAI5B3B,EAAGqF,KAAO6gB,EAAO7gB,OAAU6gB,EAAO7gB,KAAOxF,EAAOwF,SAE1C7D,EAAKH,KAAM,WACjBxB,EAAOsmB,MAAM1M,IAAKzb,KAAMgoB,EAAOhmB,EAAIkgB,EAAMpgB,KAQ3CD,EAAOsmB,OAEN3oB,UAEAic,IAAK,SAAUjY,EAAMwkB,EAAOnZ,EAASqT,EAAMpgB,GAE1C,GAAIumB,GAAaC,EAAa/gB,EAC7BghB,EAAQC,EAAGC,EACXtJ,EAASuJ,EAAUhjB,EAAMijB,EAAYC,EACrCC,EAAWxG,EAASvf,IAAKU,EAG1B,IAAMqlB,EAAN,CAKKha,EAAQA,UACZwZ,EAAcxZ,EACdA,EAAUwZ,EAAYxZ,QACtB/M,EAAWumB,EAAYvmB,UAKnBA,GACJD,EAAO4O,KAAKK,gBAAiBnB,GAAiB7N,GAIzC+M,EAAQxH,OACbwH,EAAQxH,KAAOxF,EAAOwF,SAIfkhB,EAASM,EAASN,UACzBA,EAASM,EAASN,YAEXD,EAAcO,EAASC,UAC9BR,EAAcO,EAASC,OAAS,SAAUpc,GAIzC,MAAyB,mBAAX7K,IAA0BA,EAAOsmB,MAAMY,YAAcrc,EAAEhH,KACpE7D,EAAOsmB,MAAMa,SAAStlB,MAAOF,EAAMG,WAAcqB,SAKpDgjB,GAAUA,GAAS,IAAKjb,MAAOoP,KAAqB,IACpDqM,EAAIR,EAAMplB,MACV,OAAQ4lB,IACPjhB,EAAMmgB,GAAeta,KAAM4a,EAAOQ,QAClC9iB,EAAOkjB,EAAWrhB,EAAK,GACvBohB,GAAephB,EAAK,IAAO,IAAKM,MAAO,KAAM3D,OAGvCwB,IAKNyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAGhCA,GAAS5D,EAAWqd,EAAQ8J,aAAe9J,EAAQ+J,WAAcxjB,EAGjEyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAGhC+iB,EAAY5mB,EAAOuC,QAClBsB,KAAMA,EACNkjB,SAAUA,EACV1G,KAAMA,EACNrT,QAASA,EACTxH,KAAMwH,EAAQxH,KACdvF,SAAUA,EACViJ,aAAcjJ,GAAYD,EAAOgQ,KAAK9E,MAAMhC,aAAa2C,KAAM5L,GAC/DqnB,UAAWR,EAAW7a,KAAM,MAC1Bua,IAGKK,EAAWH,EAAQ7iB,MAC1BgjB,EAAWH,EAAQ7iB,MACnBgjB,EAASU,cAAgB,EAGnBjK,EAAQkK,OACblK,EAAQkK,MAAMroB,KAAMwC,EAAM0e,EAAMyG,EAAYL,MAAkB,GAEzD9kB,EAAKyM,kBACTzM,EAAKyM,iBAAkBvK,EAAM4iB,IAK3BnJ,EAAQ1D,MACZ0D,EAAQ1D,IAAIza,KAAMwC,EAAMilB,GAElBA,EAAU5Z,QAAQxH,OACvBohB,EAAU5Z,QAAQxH,KAAOwH,EAAQxH,OAK9BvF,EACJ4mB,EAASvkB,OAAQukB,EAASU,gBAAiB,EAAGX,GAE9CC,EAASloB,KAAMioB,GAIhB5mB,EAAOsmB,MAAM3oB,OAAQkG,IAAS,KAMhCuX,OAAQ,SAAUzZ,EAAMwkB,EAAOnZ,EAAS/M,EAAUwnB,GAEjD,GAAItlB,GAAGulB,EAAWhiB,EACjBghB,EAAQC,EAAGC,EACXtJ,EAASuJ,EAAUhjB,EAAMijB,EAAYC,EACrCC,EAAWxG,EAASD,QAAS5e,IAAU6e,EAASvf,IAAKU,EAEtD,IAAMqlB,IAAeN,EAASM,EAASN,QAAvC,CAKAP,GAAUA,GAAS,IAAKjb,MAAOoP,KAAqB,IACpDqM,EAAIR,EAAMplB,MACV,OAAQ4lB,IAMP,GALAjhB,EAAMmgB,GAAeta,KAAM4a,EAAOQ,QAClC9iB,EAAOkjB,EAAWrhB,EAAK,GACvBohB,GAAephB,EAAK,IAAO,IAAKM,MAAO,KAAM3D,OAGvCwB,EAAN,CAOAyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAChCA,GAAS5D,EAAWqd,EAAQ8J,aAAe9J,EAAQ+J,WAAcxjB,EACjEgjB,EAAWH,EAAQ7iB,OACnB6B,EAAMA,EAAK,IACV,GAAI0C,QAAQ,UAAY0e,EAAW7a,KAAM,iBAAoB,WAG9Dyb,EAAYvlB,EAAI0kB,EAAS9lB,MACzB,OAAQoB,IACPykB,EAAYC,EAAU1kB,IAEfslB,GAAeV,IAAaH,EAAUG,UACzC/Z,GAAWA,EAAQxH,OAASohB,EAAUphB,MACtCE,IAAOA,EAAImG,KAAM+a,EAAUU,YAC3BrnB,GAAYA,IAAa2mB,EAAU3mB,WACxB,OAAbA,IAAqB2mB,EAAU3mB,YAChC4mB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAU3mB,UACd4mB,EAASU,gBAELjK,EAAQlC,QACZkC,EAAQlC,OAAOjc,KAAMwC,EAAMilB,GAOzBc,KAAcb,EAAS9lB,SACrBuc,EAAQqK,UACbrK,EAAQqK,SAASxoB,KAAMwC,EAAMmlB,EAAYE,EAASC,WAAa,GAE/DjnB,EAAO4nB,YAAajmB,EAAMkC,EAAMmjB,EAASC,cAGnCP,GAAQ7iB,QA1Cf,KAAMA,IAAQ6iB,GACb1mB,EAAOsmB,MAAMlL,OAAQzZ,EAAMkC,EAAOsiB,EAAOQ,GAAK3Z,EAAS/M,GAAU,EA8C/DD,GAAOqE,cAAeqiB,IAC1BlG,EAASpF,OAAQzZ,EAAM,mBAIzBwlB,SAAU,SAAUU,GAGnB,GAAIvB,GAAQtmB,EAAOsmB,MAAMwB,IAAKD,GAE1BjmB,EAAGO,EAAGd,EAAKwR,EAAS+T,EAAWmB,EAClCpiB,EAAO,GAAI7B,OAAOhC,UAAUf,QAC5B8lB,GAAarG,EAASvf,IAAK9C,KAAM,eAAoBmoB,EAAMziB,UAC3DyZ,EAAUtd,EAAOsmB,MAAMhJ,QAASgJ,EAAMziB,SAKvC,KAFA8B,EAAM,GAAM2gB,EAEN1kB,EAAI,EAAGA,EAAIE,UAAUf,OAAQa,IAClC+D,EAAM/D,GAAME,UAAWF,EAMxB,IAHA0kB,EAAM0B,eAAiB7pB,MAGlBmf,EAAQ2K,aAAe3K,EAAQ2K,YAAY9oB,KAAMhB,KAAMmoB,MAAY,EAAxE,CAKAyB,EAAe/nB,EAAOsmB,MAAMO,SAAS1nB,KAAMhB,KAAMmoB,EAAOO,GAGxDjlB,EAAI,CACJ,QAAUiR,EAAUkV,EAAcnmB,QAAY0kB,EAAM4B,uBAAyB,CAC5E5B,EAAM6B,cAAgBtV,EAAQlR,KAE9BQ,EAAI,CACJ,QAAUykB,EAAY/T,EAAQgU,SAAU1kB,QACtCmkB,EAAM8B,gCAID9B,EAAM+B,aAAc/B,EAAM+B,WAAWxc,KAAM+a,EAAUU,aAE1DhB,EAAMM,UAAYA,EAClBN,EAAMjG,KAAOuG,EAAUvG,KAEvBhf,IAAUrB,EAAOsmB,MAAMhJ,QAASsJ,EAAUG,eAAmBE,QAC5DL,EAAU5Z,SAAUnL,MAAOgR,EAAQlR,KAAMgE,GAE7BxC,SAAR9B,IACGilB,EAAM1U,OAASvQ,MAAU,IAC/BilB,EAAMgC,iBACNhC,EAAMiC,oBAYX,MAJKjL,GAAQkL,cACZlL,EAAQkL,aAAarpB,KAAMhB,KAAMmoB,GAG3BA,EAAM1U,SAGdiV,SAAU,SAAUP,EAAOO,GAC1B,GAAIjlB,GAAGglB,EAAWtW,EAAKmY,EAAiBC,EACvCX,KACAR,EAAgBV,EAASU,cACzBpa,EAAMmZ,EAAMxjB,MAGb,IAAKykB,GAIJpa,EAAIvC,YAOc,UAAf0b,EAAMziB,MAAoByiB,EAAMnS,QAAU,GAE7C,KAAQhH,IAAQhP,KAAMgP,EAAMA,EAAItN,YAAc1B,KAI7C,GAAsB,IAAjBgP,EAAIvC,WAAoC,UAAf0b,EAAMziB,MAAoBsJ,EAAI3C,YAAa,GAAS,CAGjF,IAFAie,KACAC,KACM9mB,EAAI,EAAGA,EAAI2lB,EAAe3lB,IAC/BglB,EAAYC,EAAUjlB,GAGtB0O,EAAMsW,EAAU3mB,SAAW,IAEMkD,SAA5BulB,EAAkBpY,KACtBoY,EAAkBpY,GAAQsW,EAAU1d,aACnClJ,EAAQsQ,EAAKnS,MAAOub,MAAOvM,MAC3BnN,EAAO4O,KAAM0B,EAAKnS,KAAM,MAAQgP,IAAQpM,QAErC2nB,EAAkBpY,IACtBmY,EAAgB9pB,KAAMioB,EAGnB6B,GAAgB1nB,QACpBgnB,EAAappB,MAAQgD,KAAMwL,EAAK0Z,SAAU4B,IAY9C,MALAtb,GAAMhP,KACDopB,EAAgBV,EAAS9lB,QAC7BgnB,EAAappB,MAAQgD,KAAMwL,EAAK0Z,SAAUA,EAASpoB,MAAO8oB,KAGpDQ,GAGRY,QAAS,SAAUlmB,EAAMmmB,GACxBrqB,OAAO2hB,eAAgBlgB,EAAO6oB,MAAMjoB,UAAW6B,GAC9CqmB,YAAY,EACZ3I,cAAc,EAEdlf,IAAKjB,EAAOgD,WAAY4lB,GACvB,WACC,GAAKzqB,KAAK4qB,cACR,MAAOH,GAAMzqB,KAAK4qB,gBAGrB,WACC,GAAK5qB,KAAK4qB,cACR,MAAO5qB,MAAK4qB,cAAetmB,IAI/B2d,IAAK,SAAU7a,GACdhH,OAAO2hB,eAAgB/hB,KAAMsE,GAC5BqmB,YAAY,EACZ3I,cAAc,EACd6I,UAAU,EACVzjB,MAAOA,QAMXuiB,IAAK,SAAUiB,GACd,MAAOA,GAAe/oB,EAAOoD,SAC5B2lB,EACA,GAAI/oB,GAAO6oB,MAAOE,IAGpBzL,SACC2L,MAGCC,UAAU,GAEX1V,OAGC2V,QAAS,WACR,GAAKhrB,OAAS6nB,MAAuB7nB,KAAKqV,MAEzC,MADArV,MAAKqV,SACE,GAGT4T,aAAc,WAEfgC,MACCD,QAAS,WACR,GAAKhrB,OAAS6nB,MAAuB7nB,KAAKirB,KAEzC,MADAjrB,MAAKirB,QACE,GAGThC,aAAc,YAEfiC,OAGCF,QAAS,WACR,GAAmB,aAAdhrB,KAAK0F,MAAuB1F,KAAKkrB,OAASrpB,EAAOyE,SAAUtG,KAAM,SAErE,MADAA,MAAKkrB,SACE,GAKTnF,SAAU,SAAUoC,GACnB,MAAOtmB,GAAOyE,SAAU6hB,EAAMxjB,OAAQ,OAIxCwmB,cACCd,aAAc,SAAUlC,GAIDnjB,SAAjBmjB,EAAM1U,QAAwB0U,EAAMyC,gBACxCzC,EAAMyC,cAAcQ,YAAcjD,EAAM1U,YAO7C5R,EAAO4nB,YAAc,SAAUjmB,EAAMkC,EAAMojB,GAGrCtlB,EAAK2d,qBACT3d,EAAK2d,oBAAqBzb,EAAMojB,IAIlCjnB,EAAO6oB,MAAQ,SAAUnmB,EAAK8mB,GAG7B,MAAQrrB,gBAAgB6B,GAAO6oB,OAK1BnmB,GAAOA,EAAImB,MACf1F,KAAK4qB,cAAgBrmB,EACrBvE,KAAK0F,KAAOnB,EAAImB,KAIhB1F,KAAKsrB,mBAAqB/mB,EAAIgnB,kBACHvmB,SAAzBT,EAAIgnB,kBAGJhnB,EAAI6mB,eAAgB,EACrBzD,GACAC,GAKD5nB,KAAK2E,OAAWJ,EAAII,QAAkC,IAAxBJ,EAAII,OAAO8H,SACxClI,EAAII,OAAOjD,WACX6C,EAAII,OAEL3E,KAAKgqB,cAAgBzlB,EAAIylB,cACzBhqB,KAAKwrB,cAAgBjnB,EAAIinB,eAIzBxrB,KAAK0F,KAAOnB,EAIR8mB,GACJxpB,EAAOuC,OAAQpE,KAAMqrB,GAItBrrB,KAAKyrB,UAAYlnB,GAAOA,EAAIknB,WAAa5pB,EAAO4F,WAGhDzH,KAAM6B,EAAOoD,UAAY,IA1CjB,GAAIpD,GAAO6oB,MAAOnmB,EAAK8mB,IA+ChCxpB,EAAO6oB,MAAMjoB,WACZE,YAAad,EAAO6oB,MACpBY,mBAAoB1D,GACpBmC,qBAAsBnC,GACtBqC,8BAA+BrC,GAC/B8D,aAAa,EAEbvB,eAAgB,WACf,GAAIzd,GAAI1M,KAAK4qB,aAEb5qB,MAAKsrB,mBAAqB3D,GAErBjb,IAAM1M,KAAK0rB,aACfhf,EAAEyd,kBAGJC,gBAAiB,WAChB,GAAI1d,GAAI1M,KAAK4qB,aAEb5qB,MAAK+pB,qBAAuBpC,GAEvBjb,IAAM1M,KAAK0rB,aACfhf,EAAE0d,mBAGJuB,yBAA0B,WACzB,GAAIjf,GAAI1M,KAAK4qB,aAEb5qB,MAAKiqB,8BAAgCtC,GAEhCjb,IAAM1M,KAAK0rB,aACfhf,EAAEif,2BAGH3rB,KAAKoqB,oBAKPvoB,EAAOwB,MACNuoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVpe,KAAK,EACLqe,SAAS,EACT1W,QAAQ,EACR2W,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EAETC,MAAO,SAAUpF,GAChB,GAAInS,GAASmS,EAAMnS,MAGnB,OAAoB,OAAfmS,EAAMoF,OAAiB/F,GAAU9Z,KAAMya,EAAMziB,MACxB,MAAlByiB,EAAMsE,SAAmBtE,EAAMsE,SAAWtE,EAAMuE,SAIlDvE,EAAMoF,OAAoBvoB,SAAXgR,GAAwByR,GAAY/Z,KAAMya,EAAMziB,MACtD,EAATsQ,EACG,EAGM,EAATA,EACG,EAGM,EAATA,EACG,EAGD,EAGDmS,EAAMoF,QAEZ1rB,EAAOsmB,MAAMqC,SAUhB3oB,EAAOwB,MACNmqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAMjE,GAClB9nB,EAAOsmB,MAAMhJ,QAASyO,IACrB3E,aAAcU,EACdT,SAAUS,EAEVb,OAAQ,SAAUX,GACjB,GAAIjlB,GACHyB,EAAS3E,KACT6tB,EAAU1F,EAAMqD,cAChB/C,EAAYN,EAAMM,SASnB,OALMoF,KAAaA,IAAYlpB,GAAW9C,EAAOgH,SAAUlE,EAAQkpB,MAClE1F,EAAMziB,KAAO+iB,EAAUG,SACvB1lB,EAAMulB,EAAU5Z,QAAQnL,MAAO1D,KAAM2D,WACrCwkB,EAAMziB,KAAOikB,GAEPzmB,MAKVrB,EAAOG,GAAGoC,QAET2jB,GAAI,SAAUC,EAAOlmB,EAAUogB,EAAMlgB,GACpC,MAAO+lB,IAAI/nB,KAAMgoB,EAAOlmB,EAAUogB,EAAMlgB,IAEzCimB,IAAK,SAAUD,EAAOlmB,EAAUogB,EAAMlgB,GACrC,MAAO+lB,IAAI/nB,KAAMgoB,EAAOlmB,EAAUogB,EAAMlgB,EAAI,IAE7ComB,IAAK,SAAUJ,EAAOlmB,EAAUE,GAC/B,GAAIymB,GAAW/iB,CACf,IAAKsiB,GAASA,EAAMmC,gBAAkBnC,EAAMS,UAW3C,MARAA,GAAYT,EAAMS,UAClB5mB,EAAQmmB,EAAM6B,gBAAiBzB,IAC9BK,EAAUU,UACTV,EAAUG,SAAW,IAAMH,EAAUU,UACrCV,EAAUG,SACXH,EAAU3mB,SACV2mB,EAAU5Z,SAEJ7O,IAER,IAAsB,gBAAVgoB,GAAqB,CAGhC,IAAMtiB,IAAQsiB,GACbhoB,KAAKooB,IAAK1iB,EAAM5D,EAAUkmB,EAAOtiB,GAElC,OAAO1F,MAWR,MATK8B,MAAa,GAA6B,kBAAbA,KAGjCE,EAAKF,EACLA,EAAWkD,QAEPhD,KAAO,IACXA,EAAK4lB,IAEC5nB,KAAKqD,KAAM,WACjBxB,EAAOsmB,MAAMlL,OAAQjd,KAAMgoB,EAAOhmB,EAAIF,OAMzC,IAKCgsB,IAAY,8FAOZC,GAAe,wBAGfC,GAAW,oCACXC,GAAoB,cACpBC,GAAe,0CAEhB,SAASC,IAAoB3qB,EAAM4qB,GAClC,MAAKvsB,GAAOyE,SAAU9C,EAAM,UAC3B3B,EAAOyE,SAA+B,KAArB8nB,EAAQ3hB,SAAkB2hB,EAAUA,EAAQ3b,WAAY,MAElEjP,EAAK+J,qBAAsB,SAAW,IAAO/J,EAG9CA,EAIR,QAAS6qB,IAAe7qB,GAEvB,MADAA,GAAKkC,MAAyC,OAAhClC,EAAKmK,aAAc,SAAsB,IAAMnK,EAAKkC,KAC3DlC,EAER,QAAS8qB,IAAe9qB,GACvB,GAAIuJ,GAAQkhB,GAAkB7gB,KAAM5J,EAAKkC,KAQzC,OANKqH,GACJvJ,EAAKkC,KAAOqH,EAAO,GAEnBvJ,EAAK0K,gBAAiB,QAGhB1K,EAGR,QAAS+qB,IAAgBhqB,EAAKiqB,GAC7B,GAAI/qB,GAAG4X,EAAG3V,EAAM+oB,EAAUC,EAAUC,EAAUC,EAAUrG,CAExD,IAAuB,IAAlBiG,EAAK/hB,SAAV,CAKA,GAAK4V,EAASD,QAAS7d,KACtBkqB,EAAWpM,EAASf,OAAQ/c,GAC5BmqB,EAAWrM,EAASJ,IAAKuM,EAAMC,GAC/BlG,EAASkG,EAASlG,QAEJ,OACNmG,GAAS5F,OAChB4F,EAASnG,SAET,KAAM7iB,IAAQ6iB,GACb,IAAM9kB,EAAI,EAAG4X,EAAIkN,EAAQ7iB,GAAO9C,OAAQa,EAAI4X,EAAG5X,IAC9C5B,EAAOsmB,MAAM1M,IAAK+S,EAAM9oB,EAAM6iB,EAAQ7iB,GAAQjC,IAO7C6e,EAASF,QAAS7d,KACtBoqB,EAAWrM,EAAShB,OAAQ/c,GAC5BqqB,EAAW/sB,EAAOuC,UAAYuqB,GAE9BrM,EAASL,IAAKuM,EAAMI,KAKtB,QAASC,IAAUtqB,EAAKiqB,GACvB,GAAIloB,GAAWkoB,EAAKloB,SAASC,aAGX,WAAbD,GAAwBgf,GAAe5X,KAAMnJ,EAAImB,MACrD8oB,EAAK7Y,QAAUpR,EAAIoR,QAGK,UAAbrP,GAAqC,aAAbA,IACnCkoB,EAAK3U,aAAetV,EAAIsV,cAI1B,QAASiV,IAAUC,EAAYvnB,EAAMlE,EAAUujB,GAG9Crf,EAAOjH,EAAOmD,SAAW8D,EAEzB,IAAIuf,GAAUnjB,EAAO+iB,EAASqI,EAAYpf,EAAMxO,EAC/CqC,EAAI,EACJ4X,EAAI0T,EAAWnsB,OACfqsB,EAAW5T,EAAI,EACfjU,EAAQI,EAAM,GACd3C,EAAahD,EAAOgD,WAAYuC,EAGjC,IAAKvC,GACDwW,EAAI,GAAsB,gBAAVjU,KAChBnG,EAAQomB,YAAc2G,GAAStgB,KAAMtG,GACxC,MAAO2nB,GAAW1rB,KAAM,SAAUkY,GACjC,GAAIZ,GAAOoU,EAAWlrB,GAAI0X,EACrB1W,KACJ2C,EAAM,GAAMJ,EAAMpG,KAAMhB,KAAMub,EAAOZ,EAAKuU,SAE3CJ,GAAUnU,EAAMnT,EAAMlE,EAAUujB,IAIlC,IAAKxL,IACJ0L,EAAWL,GAAelf,EAAMunB,EAAY,GAAI5hB,eAAe,EAAO4hB,EAAYlI,GAClFjjB,EAAQmjB,EAAStU,WAEmB,IAA/BsU,EAASva,WAAW5J,SACxBmkB,EAAWnjB,GAIPA,GAASijB,GAAU,CAOvB,IANAF,EAAU9kB,EAAO0B,IAAK+iB,GAAQS,EAAU,UAAYsH,IACpDW,EAAarI,EAAQ/jB,OAKba,EAAI4X,EAAG5X,IACdmM,EAAOmX,EAEFtjB,IAAMwrB,IACVrf,EAAO/N,EAAO6C,MAAOkL,GAAM,GAAM,GAG5Bof,GAIJntB,EAAOsB,MAAOwjB,EAASL,GAAQ1W,EAAM,YAIvCtM,EAAStC,KAAM+tB,EAAYtrB,GAAKmM,EAAMnM,EAGvC,IAAKurB,EAOJ,IANA5tB,EAAMulB,EAASA,EAAQ/jB,OAAS,GAAIuK,cAGpCtL,EAAO0B,IAAKojB,EAAS2H,IAGf7qB,EAAI,EAAGA,EAAIurB,EAAYvrB,IAC5BmM,EAAO+W,EAASljB,GACX+hB,GAAY9X,KAAMkC,EAAKlK,MAAQ,MAClC2c,EAASf,OAAQ1R,EAAM,eACxB/N,EAAOgH,SAAUzH,EAAKwO,KAEjBA,EAAKrL,IAGJ1C,EAAOstB,UACXttB,EAAOstB,SAAUvf,EAAKrL,KAGvBrD,EAAS0O,EAAK4C,YAAYpN,QAAS8oB,GAAc,IAAM9sB,IAQ7D,MAAO2tB,GAGR,QAAS9R,IAAQzZ,EAAM1B,EAAUstB,GAKhC,IAJA,GAAIxf,GACHqX,EAAQnlB,EAAWD,EAAO0O,OAAQzO,EAAU0B,GAASA,EACrDC,EAAI,EAE4B,OAAvBmM,EAAOqX,EAAOxjB,IAAeA,IAChC2rB,GAA8B,IAAlBxf,EAAKnD,UACtB5K,EAAOwtB,UAAW/I,GAAQ1W,IAGtBA,EAAKlO,aACJ0tB,GAAYvtB,EAAOgH,SAAU+G,EAAKzC,cAAeyC,IACrD2W,GAAeD,GAAQ1W,EAAM,WAE9BA,EAAKlO,WAAWC,YAAaiO,GAI/B,OAAOpM,GAGR3B,EAAOuC,QACN8iB,cAAe,SAAUgI,GACxB,MAAOA,GAAK9pB,QAAS0oB,GAAW,cAGjCppB,MAAO,SAAUlB,EAAM8rB,EAAeC,GACrC,GAAI9rB,GAAG4X,EAAGmU,EAAaC,EACtB/qB,EAAQlB,EAAK8jB,WAAW,GACxBoI,EAAS7tB,EAAOgH,SAAUrF,EAAK2J,cAAe3J,EAG/C,MAAMvC,EAAQsmB,gBAAsC,IAAlB/jB,EAAKiJ,UAAoC,KAAlBjJ,EAAKiJ,UAC3D5K,EAAOkY,SAAUvW,IAMnB,IAHAisB,EAAenJ,GAAQ5hB,GACvB8qB,EAAclJ,GAAQ9iB,GAEhBC,EAAI,EAAG4X,EAAImU,EAAY5sB,OAAQa,EAAI4X,EAAG5X,IAC3CorB,GAAUW,EAAa/rB,GAAKgsB,EAAchsB,GAK5C,IAAK6rB,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQ9iB,GACrCisB,EAAeA,GAAgBnJ,GAAQ5hB,GAEjCjB,EAAI,EAAG4X,EAAImU,EAAY5sB,OAAQa,EAAI4X,EAAG5X,IAC3C8qB,GAAgBiB,EAAa/rB,GAAKgsB,EAAchsB,QAGjD8qB,IAAgB/qB,EAAMkB,EAWxB,OANA+qB,GAAenJ,GAAQ5hB,EAAO,UACzB+qB,EAAa7sB,OAAS,GAC1B2jB,GAAekJ,GAAeC,GAAUpJ,GAAQ9iB,EAAM,WAIhDkB,GAGR2qB,UAAW,SAAUpsB,GAKpB,IAJA,GAAIif,GAAM1e,EAAMkC,EACfyZ,EAAUtd,EAAOsmB,MAAMhJ,QACvB1b,EAAI,EAE6BuB,UAAxBxB,EAAOP,EAAOQ,IAAqBA,IAC5C,GAAKke,EAAYne,GAAS,CACzB,GAAO0e,EAAO1e,EAAM6e,EAASpd,SAAc,CAC1C,GAAKid,EAAKqG,OACT,IAAM7iB,IAAQwc,GAAKqG,OACbpJ,EAASzZ,GACb7D,EAAOsmB,MAAMlL,OAAQzZ,EAAMkC,GAI3B7D,EAAO4nB,YAAajmB,EAAMkC,EAAMwc,EAAK4G,OAOxCtlB,GAAM6e,EAASpd,SAAYD,OAEvBxB,EAAM8e,EAASrd,WAInBzB,EAAM8e,EAASrd,SAAYD,YAOhCnD,EAAOG,GAAGoC,QACTurB,OAAQ,SAAU7tB,GACjB,MAAOmb,IAAQjd,KAAM8B,GAAU,IAGhCmb,OAAQ,SAAUnb,GACjB,MAAOmb,IAAQjd,KAAM8B,IAGtBP,KAAM,SAAU6F,GACf,MAAOka,GAAQthB,KAAM,SAAUoH,GAC9B,MAAiBpC,UAAVoC,EACNvF,EAAON,KAAMvB,MACbA,KAAK8V,QAAQzS,KAAM,WACK,IAAlBrD,KAAKyM,UAAoC,KAAlBzM,KAAKyM,UAAqC,IAAlBzM,KAAKyM,WACxDzM,KAAKwS,YAAcpL,MAGpB,KAAMA,EAAOzD,UAAUf,SAG3BgtB,OAAQ,WACP,MAAOd,IAAU9uB,KAAM2D,UAAW,SAAUH,GAC3C,GAAuB,IAAlBxD,KAAKyM,UAAoC,KAAlBzM,KAAKyM,UAAqC,IAAlBzM,KAAKyM,SAAiB,CACzE,GAAI9H,GAASwpB,GAAoBnuB,KAAMwD,EACvCmB,GAAOlD,YAAa+B,OAKvBqsB,QAAS,WACR,MAAOf,IAAU9uB,KAAM2D,UAAW,SAAUH,GAC3C,GAAuB,IAAlBxD,KAAKyM,UAAoC,KAAlBzM,KAAKyM,UAAqC,IAAlBzM,KAAKyM,SAAiB,CACzE,GAAI9H,GAASwpB,GAAoBnuB,KAAMwD,EACvCmB,GAAOmrB,aAActsB,EAAMmB,EAAO8N,gBAKrCsd,OAAQ,WACP,MAAOjB,IAAU9uB,KAAM2D,UAAW,SAAUH,GACtCxD,KAAK0B,YACT1B,KAAK0B,WAAWouB,aAActsB,EAAMxD,SAKvCgwB,MAAO,WACN,MAAOlB,IAAU9uB,KAAM2D,UAAW,SAAUH,GACtCxD,KAAK0B,YACT1B,KAAK0B,WAAWouB,aAActsB,EAAMxD,KAAKmP,gBAK5C2G,MAAO,WAIN,IAHA,GAAItS,GACHC,EAAI,EAE2B,OAAtBD,EAAOxD,KAAMyD,IAAeA,IACd,IAAlBD,EAAKiJ,WAGT5K,EAAOwtB,UAAW/I,GAAQ9iB,GAAM,IAGhCA,EAAKgP,YAAc,GAIrB,OAAOxS,OAGR0E,MAAO,SAAU4qB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzDvvB,KAAKuD,IAAK,WAChB,MAAO1B,GAAO6C,MAAO1E,KAAMsvB,EAAeC,MAI5CL,KAAM,SAAU9nB,GACf,MAAOka,GAAQthB,KAAM,SAAUoH,GAC9B,GAAI5D,GAAOxD,KAAM,OAChByD,EAAI,EACJ4X,EAAIrb,KAAK4C,MAEV,IAAeoC,SAAVoC,GAAyC,IAAlB5D,EAAKiJ,SAChC,MAAOjJ,GAAKoN,SAIb,IAAsB,gBAAVxJ,KAAuB2mB,GAAargB,KAAMtG,KACpDqe,IAAWF,GAASnY,KAAMhG,KAAa,GAAI,KAAQ,GAAIb,eAAkB,CAE1Ea,EAAQvF,EAAOqlB,cAAe9f,EAE9B,KACC,KAAQ3D,EAAI4X,EAAG5X,IACdD,EAAOxD,KAAMyD,OAGU,IAAlBD,EAAKiJ,WACT5K,EAAOwtB,UAAW/I,GAAQ9iB,GAAM,IAChCA,EAAKoN,UAAYxJ,EAInB5D,GAAO,EAGN,MAAQkJ,KAGNlJ,GACJxD,KAAK8V,QAAQ8Z,OAAQxoB,IAEpB,KAAMA,EAAOzD,UAAUf,SAG3BqtB,YAAa,WACZ,GAAIpJ,KAGJ,OAAOiI,IAAU9uB,KAAM2D,UAAW,SAAUH,GAC3C,GAAI2Q,GAASnU,KAAK0B,UAEbG,GAAO+E,QAAS5G,KAAM6mB,GAAY,IACtChlB,EAAOwtB,UAAW/I,GAAQtmB,OACrBmU,GACJA,EAAO+b,aAAc1sB,EAAMxD,QAK3B6mB,MAILhlB,EAAOwB,MACN8sB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUhsB,EAAMisB,GAClB1uB,EAAOG,GAAIsC,GAAS,SAAUxC,GAO7B,IANA,GAAImB,GACHC,KACAstB,EAAS3uB,EAAQC,GACjBgC,EAAO0sB,EAAO5tB,OAAS,EACvBa,EAAI,EAEGA,GAAKK,EAAML,IAClBR,EAAQQ,IAAMK,EAAO9D,KAAOA,KAAK0E,OAAO,GACxC7C,EAAQ2uB,EAAQ/sB,IAAO8sB,GAAYttB,GAInCzC,EAAKkD,MAAOR,EAAKD,EAAMH,MAGxB,OAAO9C,MAAKgD,UAAWE,KAGzB,IAAIutB,IAAU,UAEVC,GAAY,GAAIzmB,QAAQ,KAAOwZ,EAAO,kBAAmB,KAEzDkN,GAAY,SAAUntB,GAKxB,GAAI+oB,GAAO/oB,EAAK2J,cAAc4C,WAM9B,OAJMwc,IAASA,EAAKqE,SACnBrE,EAAOxsB,GAGDwsB,EAAKsE,iBAAkBrtB,KAKhC,WAIC,QAASstB,KAGR,GAAM1J,EAAN,CAIAA,EAAItD,MAAMiN,QACT,4GAID3J,EAAIxW,UAAY,GAChBjB,GAAgBlO,YAAauvB,EAE7B,IAAIC,GAAWlxB,EAAO8wB,iBAAkBzJ,EACxC8J,GAAoC,OAAjBD,EAASjhB,IAG5BmhB,EAAgD,QAAxBF,EAASG,WACjCC,EAA0C,QAAnBJ,EAASK,MAIhClK,EAAItD,MAAMyN,YAAc,MACxBC,EAA+C,QAAzBP,EAASM,YAE/B5hB,GAAgBhO,YAAaqvB,GAI7B5J,EAAM,MAGP,GAAI8J,GAAkBG,EAAsBG,EAAqBL,EAChEH,EAAYpxB,EAAS0B,cAAe,OACpC8lB,EAAMxnB,EAAS0B,cAAe,MAGzB8lB,GAAItD,QAMVsD,EAAItD,MAAM2N,eAAiB,cAC3BrK,EAAIE,WAAW,GAAOxD,MAAM2N,eAAiB,GAC7CxwB,EAAQywB,gBAA+C,gBAA7BtK,EAAItD,MAAM2N,eAEpCT,EAAUlN,MAAMiN,QAAU,4FAE1BC,EAAUvvB,YAAa2lB,GAEvBvlB,EAAOuC,OAAQnD,GACd0wB,cAAe,WAEd,MADAb,KACOI,GAERU,kBAAmB,WAElB,MADAd,KACOO,GAERQ,iBAAkB,WAEjB,MADAf,KACOU,GAERM,mBAAoB,WAEnB,MADAhB,KACOK,QAMV,SAASY,IAAQvuB,EAAMc,EAAM0tB,GAC5B,GAAIV,GAAOW,EAAUC,EAAUhvB,EAC9B4gB,EAAQtgB,EAAKsgB,KAoCd,OAlCAkO,GAAWA,GAAYrB,GAAWntB,GAI7BwuB,IACJ9uB,EAAM8uB,EAASG,iBAAkB7tB,IAAU0tB,EAAU1tB,GAExC,KAARpB,GAAerB,EAAOgH,SAAUrF,EAAK2J,cAAe3J,KACxDN,EAAMrB,EAAOiiB,MAAOtgB,EAAMc,KAQrBrD,EAAQ4wB,oBAAsBnB,GAAUhjB,KAAMxK,IAASutB,GAAQ/iB,KAAMpJ,KAG1EgtB,EAAQxN,EAAMwN,MACdW,EAAWnO,EAAMmO,SACjBC,EAAWpO,EAAMoO,SAGjBpO,EAAMmO,SAAWnO,EAAMoO,SAAWpO,EAAMwN,MAAQpuB,EAChDA,EAAM8uB,EAASV,MAGfxN,EAAMwN,MAAQA,EACdxN,EAAMmO,SAAWA,EACjBnO,EAAMoO,SAAWA,IAIJltB,SAAR9B,EAINA,EAAM,GACNA,EAIF,QAASkvB,IAAcC,EAAaC,GAGnC,OACCxvB,IAAK,WACJ,MAAKuvB,gBAIGryB,MAAK8C,KAKJ9C,KAAK8C,IAAMwvB,GAAS5uB,MAAO1D,KAAM2D,aAM7C,GAKC4uB,IAAe,4BACfC,IAAYC,SAAU,WAAYC,WAAY,SAAU3O,QAAS,SACjE4O,IACCC,cAAe,IACfC,WAAY,OAGbC,IAAgB,SAAU,MAAO,MACjCC,GAAanzB,EAAS0B,cAAe,OAAQwiB,KAG9C,SAASkP,IAAgB1uB,GAGxB,GAAKA,IAAQyuB,IACZ,MAAOzuB,EAIR,IAAI2uB,GAAU3uB,EAAM,GAAI9B,cAAgB8B,EAAKhE,MAAO,GACnDmD,EAAIqvB,GAAYlwB,MAEjB,OAAQa,IAEP,GADAa,EAAOwuB,GAAarvB,GAAMwvB,EACrB3uB,IAAQyuB,IACZ,MAAOzuB,GAKV,QAAS4uB,IAAmB1vB,EAAM4D,EAAO+rB,GAIxC,GAAIlsB,GAAU0c,GAAQvW,KAAMhG,EAC5B,OAAOH,GAGN/B,KAAKkuB,IAAK,EAAGnsB,EAAS,IAAQksB,GAAY,KAAUlsB,EAAS,IAAO,MACpEG,EAGF,QAASisB,IAAsB7vB,EAAMc,EAAMgvB,EAAOC,EAAaC,GAC9D,GAAI/vB,GACHuO,EAAM,CAWP,KAPCvO,EADI6vB,KAAYC,EAAc,SAAW,WACrC,EAIS,UAATjvB,EAAmB,EAAI,EAGpBb,EAAI,EAAGA,GAAK,EAGJ,WAAV6vB,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM8vB,EAAQ1P,GAAWngB,IAAK,EAAM+vB,IAGnDD,GAGW,YAAVD,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,UAAYogB,GAAWngB,IAAK,EAAM+vB,IAI7C,WAAVF,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,SAAWogB,GAAWngB,GAAM,SAAS,EAAM+vB,MAKrExhB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,UAAYogB,GAAWngB,IAAK,EAAM+vB,GAG5C,YAAVF,IACJthB,GAAOnQ,EAAOmiB,IAAKxgB,EAAM,SAAWogB,GAAWngB,GAAM,SAAS,EAAM+vB,IAKvE,OAAOxhB,GAGR,QAASyhB,IAAkBjwB,EAAMc,EAAMgvB,GAGtC,GAAIthB,GACH0hB,GAAmB,EACnBF,EAAS7C,GAAWntB,GACpB+vB,EAAiE,eAAnD1xB,EAAOmiB,IAAKxgB,EAAM,aAAa,EAAOgwB,EAYrD,IAPKhwB,EAAKmwB,iBAAiB/wB,SAC1BoP,EAAMxO,EAAKowB,wBAAyBtvB,IAMhC0N,GAAO,GAAY,MAAPA,EAAc,CAS9B,GANAA,EAAM+f,GAAQvuB,EAAMc,EAAMkvB,IACrBxhB,EAAM,GAAY,MAAPA,KACfA,EAAMxO,EAAKsgB,MAAOxf,IAIdosB,GAAUhjB,KAAMsE,GACpB,MAAOA,EAKR0hB,GAAmBH,IAChBtyB,EAAQ2wB,qBAAuB5f,IAAQxO,EAAKsgB,MAAOxf,IAGtD0N,EAAMjM,WAAYiM,IAAS,EAI5B,MAASA,GACRqhB,GACC7vB,EACAc,EACAgvB,IAAWC,EAAc,SAAW,WACpCG,EACAF,GAEE,KAGL3xB,EAAOuC,QAINyvB,UACCC,SACChxB,IAAK,SAAUU,EAAMwuB,GACpB,GAAKA,EAAW,CAGf,GAAI9uB,GAAM6uB,GAAQvuB,EAAM,UACxB,OAAe,KAARN,EAAa,IAAMA,MAO9B0hB,WACCmP,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdtB,YAAc,EACduB,YAAc,EACdN,SAAW,EACXO,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKTC,UACCC,QAAS,YAIV7Q,MAAO,SAAUtgB,EAAMc,EAAM8C,EAAOksB,GAGnC,GAAM9vB,GAA0B,IAAlBA,EAAKiJ,UAAoC,IAAlBjJ,EAAKiJ,UAAmBjJ,EAAKsgB,MAAlE,CAKA,GAAI5gB,GAAKwC,EAAMwd,EACd0R,EAAW/yB,EAAOuE,UAAW9B,GAC7Bwf,EAAQtgB,EAAKsgB,KASd,OAPAxf,GAAOzC,EAAO6yB,SAAUE,KACrB/yB,EAAO6yB,SAAUE,GAAa5B,GAAgB4B,IAAcA,GAG/D1R,EAAQrhB,EAAOgyB,SAAUvvB,IAAUzC,EAAOgyB,SAAUe,GAGrC5vB,SAAVoC,EAoCC8b,GAAS,OAASA,IACwBle,UAA5C9B,EAAMggB,EAAMpgB,IAAKU,GAAM,EAAO8vB,IAEzBpwB,EAID4gB,EAAOxf,IA1CdoB,QAAc0B,GAGA,WAAT1B,IAAuBxC,EAAMygB,GAAQvW,KAAMhG,KAAalE,EAAK,KACjEkE,EAAQ+c,GAAW3gB,EAAMc,EAAMpB,GAG/BwC,EAAO,UAIM,MAAT0B,GAAiBA,IAAUA,IAKlB,WAAT1B,IACJ0B,GAASlE,GAAOA,EAAK,KAASrB,EAAO+iB,UAAWgQ,GAAa,GAAK,OAI7D3zB,EAAQywB,iBAA6B,KAAVtqB,GAAiD,IAAjC9C,EAAK7D,QAAS,gBAC9DqjB,EAAOxf,GAAS,WAIX4e,GAAY,OAASA,IACsBle,UAA9CoC,EAAQ8b,EAAMjB,IAAKze,EAAM4D,EAAOksB,MAElCxP,EAAOxf,GAAS8C,IAlBjB,UAmCF4c,IAAK,SAAUxgB,EAAMc,EAAMgvB,EAAOE,GACjC,GAAIxhB,GAAKjP,EAAKmgB,EACb0R,EAAW/yB,EAAOuE,UAAW9B,EAyB9B,OAtBAA,GAAOzC,EAAO6yB,SAAUE,KACrB/yB,EAAO6yB,SAAUE,GAAa5B,GAAgB4B,IAAcA,GAG/D1R,EAAQrhB,EAAOgyB,SAAUvvB,IAAUzC,EAAOgyB,SAAUe,GAG/C1R,GAAS,OAASA,KACtBlR,EAAMkR,EAAMpgB,IAAKU,GAAM,EAAM8vB,IAIjBtuB,SAARgN,IACJA,EAAM+f,GAAQvuB,EAAMc,EAAMkvB,IAId,WAARxhB,GAAoB1N,IAAQquB,MAChC3gB,EAAM2gB,GAAoBruB,IAIZ,KAAVgvB,GAAgBA,GACpBvwB,EAAMgD,WAAYiM,GACXshB,KAAU,GAAQuB,SAAU9xB,GAAQA,GAAO,EAAIiP,GAEhDA,KAITnQ,EAAOwB,MAAQ,SAAU,SAAW,SAAUI,EAAGa,GAChDzC,EAAOgyB,SAAUvvB,IAChBxB,IAAK,SAAUU,EAAMwuB,EAAUsB,GAC9B,GAAKtB,EAIJ,OAAOO,GAAa7kB,KAAM7L,EAAOmiB,IAAKxgB,EAAM,aAQxCA,EAAKmwB,iBAAiB/wB,QAAWY,EAAKowB,wBAAwBtC,MAIhEmC,GAAkBjwB,EAAMc,EAAMgvB,GAH9BrP,GAAMzgB,EAAMgvB,GAAS,WACpB,MAAOiB,IAAkBjwB,EAAMc,EAAMgvB,MAM1CrR,IAAK,SAAUze,EAAM4D,EAAOksB,GAC3B,GAAIrsB,GACHusB,EAASF,GAAS3C,GAAWntB,GAC7B2vB,EAAWG,GAASD,GACnB7vB,EACAc,EACAgvB,EACmD,eAAnDzxB,EAAOmiB,IAAKxgB,EAAM,aAAa,EAAOgwB,GACtCA,EAWF,OAPKL,KAAclsB,EAAU0c,GAAQvW,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElBzD,EAAKsgB,MAAOxf,GAAS8C,EACrBA,EAAQvF,EAAOmiB,IAAKxgB,EAAMc,IAGpB4uB,GAAmB1vB,EAAM4D,EAAO+rB,OAK1CtxB,EAAOgyB,SAASzC,WAAagB,GAAcnxB,EAAQ6wB,mBAClD,SAAUtuB,EAAMwuB,GACf,GAAKA,EACJ,OAASjsB,WAAYgsB,GAAQvuB,EAAM,gBAClCA,EAAKowB,wBAAwBkB,KAC5B7Q,GAAMzgB,GAAQ4tB,WAAY,GAAK,WAC9B,MAAO5tB,GAAKowB,wBAAwBkB,QAElC,OAMRjzB,EAAOwB,MACN0xB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBtzB,EAAOgyB,SAAUqB,EAASC,IACzBC,OAAQ,SAAUhuB,GAOjB,IANA,GAAI3D,GAAI,EACP4xB,KAGAC,EAAyB,gBAAVluB,GAAqBA,EAAMS,MAAO,MAAUT,GAEpD3D,EAAI,EAAGA,IACd4xB,EAAUH,EAAStR,GAAWngB,GAAM0xB,GACnCG,EAAO7xB,IAAO6xB,EAAO7xB,EAAI,IAAO6xB,EAAO,EAGzC,OAAOD,KAIH5E,GAAQ/iB,KAAMwnB,KACnBrzB,EAAOgyB,SAAUqB,EAASC,GAASlT,IAAMiR,MAI3CrxB,EAAOG,GAAGoC,QACT4f,IAAK,SAAU1f,EAAM8C,GACpB,MAAOka,GAAQthB,KAAM,SAAUwD,EAAMc,EAAM8C,GAC1C,GAAIosB,GAAQzvB,EACXR,KACAE,EAAI,CAEL,IAAK5B,EAAOkD,QAAST,GAAS,CAI7B,IAHAkvB,EAAS7C,GAAWntB,GACpBO,EAAMO,EAAK1B,OAEHa,EAAIM,EAAKN,IAChBF,EAAKe,EAAMb,IAAQ5B,EAAOmiB,IAAKxgB,EAAMc,EAAMb,IAAK,EAAO+vB,EAGxD,OAAOjwB,GAGR,MAAiByB,UAAVoC,EACNvF,EAAOiiB,MAAOtgB,EAAMc,EAAM8C,GAC1BvF,EAAOmiB,IAAKxgB,EAAMc,IACjBA,EAAM8C,EAAOzD,UAAUf,OAAS,MAOrCf,EAAOG,GAAGuzB,MAAQ,SAAUC,EAAM9vB,GAIjC,MAHA8vB,GAAO3zB,EAAO4zB,GAAK5zB,EAAO4zB,GAAGC,OAAQF,IAAUA,EAAOA,EACtD9vB,EAAOA,GAAQ,KAER1F,KAAK4c,MAAOlX,EAAM,SAAU6G,EAAM2W,GACxC,GAAIyS,GAAU51B,EAAO+f,WAAYvT,EAAMipB,EACvCtS,GAAME,KAAO,WACZrjB,EAAO61B,aAAcD,OAMxB,WACC,GAAI9kB,GAAQjR,EAAS0B,cAAe,SACnC8G,EAASxI,EAAS0B,cAAe,UACjCu0B,EAAMztB,EAAO3G,YAAa7B,EAAS0B,cAAe,UAEnDuP,GAAMnL,KAAO,WAIbzE,EAAQ60B,QAA0B,KAAhBjlB,EAAMzJ,MAIxBnG,EAAQ80B,YAAcF,EAAIjgB,SAI1B/E,EAAQjR,EAAS0B,cAAe,SAChCuP,EAAMzJ,MAAQ,IACdyJ,EAAMnL,KAAO,QACbzE,EAAQ+0B,WAA6B,MAAhBnlB,EAAMzJ,QAI5B,IAAI6uB,IACHnnB,GAAajN,EAAOgQ,KAAK/C,UAE1BjN,GAAOG,GAAGoC,QACT2N,KAAM,SAAUzN,EAAM8C,GACrB,MAAOka,GAAQthB,KAAM6B,EAAOkQ,KAAMzN,EAAM8C,EAAOzD,UAAUf,OAAS,IAGnEszB,WAAY,SAAU5xB,GACrB,MAAOtE,MAAKqD,KAAM,WACjBxB,EAAOq0B,WAAYl2B,KAAMsE,QAK5BzC,EAAOuC,QACN2N,KAAM,SAAUvO,EAAMc,EAAM8C,GAC3B,GAAIlE,GAAKggB,EACRiT,EAAQ3yB,EAAKiJ,QAGd,IAAe,IAAV0pB,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,mBAAtB3yB,GAAKmK,aACT9L,EAAOsgB,KAAM3e,EAAMc,EAAM8C,IAKlB,IAAV+uB,GAAgBt0B,EAAOkY,SAAUvW,KACrC0f,EAAQrhB,EAAOu0B,UAAW9xB,EAAKiC,iBAC5B1E,EAAOgQ,KAAK9E,MAAMjC,KAAK4C,KAAMpJ,GAAS2xB,GAAWjxB,SAGtCA,SAAVoC,EACW,OAAVA,MACJvF,GAAOq0B,WAAY1yB,EAAMc,GAIrB4e,GAAS,OAASA,IACuBle,UAA3C9B,EAAMggB,EAAMjB,IAAKze,EAAM4D,EAAO9C,IACzBpB,GAGRM,EAAKoK,aAActJ,EAAM8C,EAAQ,IAC1BA,GAGH8b,GAAS,OAASA,IAA+C,QAApChgB,EAAMggB,EAAMpgB,IAAKU,EAAMc,IACjDpB,GAGRA,EAAMrB,EAAO4O,KAAKsB,KAAMvO,EAAMc,GAGhB,MAAPpB,EAAc8B,OAAY9B,KAGlCkzB,WACC1wB,MACCuc,IAAK,SAAUze,EAAM4D,GACpB,IAAMnG,EAAQ+0B,YAAwB,UAAV5uB,GAC3BvF,EAAOyE,SAAU9C,EAAM,SAAY,CACnC,GAAIwO,GAAMxO,EAAK4D,KAKf,OAJA5D,GAAKoK,aAAc,OAAQxG,GACtB4K,IACJxO,EAAK4D,MAAQ4K,GAEP5K,MAMX8uB,WAAY,SAAU1yB,EAAM4D,GAC3B,GAAI9C,GACHb,EAAI,EAIJ4yB,EAAYjvB,GAASA,EAAM2F,MAAOoP,EAEnC,IAAKka,GAA+B,IAAlB7yB,EAAKiJ,SACtB,MAAUnI,EAAO+xB,EAAW5yB,KAC3BD,EAAK0K,gBAAiB5J,MAO1B2xB,IACChU,IAAK,SAAUze,EAAM4D,EAAO9C,GAQ3B,MAPK8C,MAAU,EAGdvF,EAAOq0B,WAAY1yB,EAAMc,GAEzBd,EAAKoK,aAActJ,EAAMA,GAEnBA,IAITzC,EAAOwB,KAAMxB,EAAOgQ,KAAK9E,MAAMjC,KAAK4Y,OAAO3W,MAAO,QAAU,SAAUtJ,EAAGa,GACxE,GAAIgyB,GAASxnB,GAAYxK,IAAUzC,EAAO4O,KAAKsB,IAE/CjD,IAAYxK,GAAS,SAAUd,EAAMc,EAAM2D,GAC1C,GAAI/E,GAAK4lB,EACRyN,EAAgBjyB,EAAKiC,aAYtB,OAVM0B,KAGL6gB,EAASha,GAAYynB,GACrBznB,GAAYynB,GAAkBrzB,EAC9BA,EAAqC,MAA/BozB,EAAQ9yB,EAAMc,EAAM2D,GACzBsuB,EACA,KACDznB,GAAYynB,GAAkBzN,GAExB5lB,IAOT,IAAIszB,IAAa,sCAChBC,GAAa,eAEd50B,GAAOG,GAAGoC,QACT+d,KAAM,SAAU7d,EAAM8C,GACrB,MAAOka,GAAQthB,KAAM6B,EAAOsgB,KAAM7d,EAAM8C,EAAOzD,UAAUf,OAAS,IAGnE8zB,WAAY,SAAUpyB,GACrB,MAAOtE,MAAKqD,KAAM,iBACVrD,MAAM6B,EAAO80B,QAASryB,IAAUA,QAK1CzC,EAAOuC,QACN+d,KAAM,SAAU3e,EAAMc,EAAM8C,GAC3B,GAAIlE,GAAKggB,EACRiT,EAAQ3yB,EAAKiJ,QAGd,IAAe,IAAV0pB,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,MAPe,KAAVA,GAAgBt0B,EAAOkY,SAAUvW,KAGrCc,EAAOzC,EAAO80B,QAASryB,IAAUA,EACjC4e,EAAQrhB,EAAO+0B,UAAWtyB,IAGZU,SAAVoC,EACC8b,GAAS,OAASA,IACuBle,UAA3C9B,EAAMggB,EAAMjB,IAAKze,EAAM4D,EAAO9C,IACzBpB,EAGCM,EAAMc,GAAS8C,EAGpB8b,GAAS,OAASA,IAA+C,QAApChgB,EAAMggB,EAAMpgB,IAAKU,EAAMc,IACjDpB,EAGDM,EAAMc,IAGdsyB,WACCnhB,UACC3S,IAAK,SAAUU,GAOd,GAAIqzB,GAAWh1B,EAAO4O,KAAKsB,KAAMvO,EAAM,WAEvC,OAAKqzB,GACGC,SAAUD,EAAU,IAI3BL,GAAW9oB,KAAMlK,EAAK8C,WACtBmwB,GAAW/oB,KAAMlK,EAAK8C,WACtB9C,EAAKgS,KAEE,QAQXmhB,SACCI,MAAO,UACPC,QAAS,eAYL/1B,EAAQ80B,cACbl0B,EAAO+0B,UAAUhhB,UAChB9S,IAAK,SAAUU,GAId,GAAI2Q,GAAS3Q,EAAK9B,UAIlB,OAHKyS,IAAUA,EAAOzS,YACrByS,EAAOzS,WAAWmU,cAEZ,MAERoM,IAAK,SAAUze,GAId,GAAI2Q,GAAS3Q,EAAK9B,UACbyS,KACJA,EAAO0B,cAEF1B,EAAOzS,YACXyS,EAAOzS,WAAWmU,kBAOvBhU,EAAOwB,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFxB,EAAO80B,QAAS32B,KAAKuG,eAAkBvG,MAQvC,SAASi3B,IAAkB7vB,GAC1B,GAAI0P,GAAS1P,EAAM2F,MAAOoP,MAC1B,OAAOrF,GAAOhJ,KAAM,KAItB,QAASopB,IAAU1zB,GAClB,MAAOA,GAAKmK,cAAgBnK,EAAKmK,aAAc,UAAa,GAG7D9L,EAAOG,GAAGoC,QACT+yB,SAAU,SAAU/vB,GACnB,GAAIgwB,GAAS5zB,EAAMwL,EAAKqoB,EAAUC,EAAOtzB,EAAGuzB,EAC3C9zB,EAAI,CAEL,IAAK5B,EAAOgD,WAAYuC,GACvB,MAAOpH,MAAKqD,KAAM,SAAUW,GAC3BnC,EAAQ7B,MAAOm3B,SAAU/vB,EAAMpG,KAAMhB,KAAMgE,EAAGkzB,GAAUl3B,SAI1D,IAAsB,gBAAVoH,IAAsBA,EAAQ,CACzCgwB,EAAUhwB,EAAM2F,MAAOoP,MAEvB,OAAU3Y,EAAOxD,KAAMyD,KAItB,GAHA4zB,EAAWH,GAAU1zB,GACrBwL,EAAwB,IAAlBxL,EAAKiJ,UAAoB,IAAMwqB,GAAkBI,GAAa,IAEzD,CACVrzB,EAAI,CACJ,OAAUszB,EAAQF,EAASpzB,KACrBgL,EAAIvO,QAAS,IAAM62B,EAAQ,KAAQ,IACvCtoB,GAAOsoB,EAAQ,IAKjBC,GAAaN,GAAkBjoB,GAC1BqoB,IAAaE,GACjB/zB,EAAKoK,aAAc,QAAS2pB,IAMhC,MAAOv3B,OAGRw3B,YAAa,SAAUpwB,GACtB,GAAIgwB,GAAS5zB,EAAMwL,EAAKqoB,EAAUC,EAAOtzB,EAAGuzB,EAC3C9zB,EAAI,CAEL,IAAK5B,EAAOgD,WAAYuC,GACvB,MAAOpH,MAAKqD,KAAM,SAAUW,GAC3BnC,EAAQ7B,MAAOw3B,YAAapwB,EAAMpG,KAAMhB,KAAMgE,EAAGkzB,GAAUl3B,SAI7D,KAAM2D,UAAUf,OACf,MAAO5C,MAAK+R,KAAM,QAAS,GAG5B,IAAsB,gBAAV3K,IAAsBA,EAAQ,CACzCgwB,EAAUhwB,EAAM2F,MAAOoP,MAEvB,OAAU3Y,EAAOxD,KAAMyD,KAMtB,GALA4zB,EAAWH,GAAU1zB,GAGrBwL,EAAwB,IAAlBxL,EAAKiJ,UAAoB,IAAMwqB,GAAkBI,GAAa,IAEzD,CACVrzB,EAAI,CACJ,OAAUszB,EAAQF,EAASpzB,KAG1B,MAAQgL,EAAIvO,QAAS,IAAM62B,EAAQ,QAClCtoB,EAAMA,EAAI5J,QAAS,IAAMkyB,EAAQ,IAAK,IAKxCC,GAAaN,GAAkBjoB,GAC1BqoB,IAAaE,GACjB/zB,EAAKoK,aAAc,QAAS2pB,IAMhC,MAAOv3B,OAGRy3B,YAAa,SAAUrwB,EAAOswB,GAC7B,GAAIhyB,SAAc0B,EAElB,OAAyB,iBAAbswB,IAAmC,WAAThyB,EAC9BgyB,EAAW13B,KAAKm3B,SAAU/vB,GAAUpH,KAAKw3B,YAAapwB,GAGzDvF,EAAOgD,WAAYuC,GAChBpH,KAAKqD,KAAM,SAAUI,GAC3B5B,EAAQ7B,MAAOy3B,YACdrwB,EAAMpG,KAAMhB,KAAMyD,EAAGyzB,GAAUl3B,MAAQ03B,GACvCA,KAKI13B,KAAKqD,KAAM,WACjB,GAAI8M,GAAW1M,EAAGkX,EAAMgd,CAExB,IAAc,WAATjyB,EAAoB,CAGxBjC,EAAI,EACJkX,EAAO9Y,EAAQ7B,MACf23B,EAAavwB,EAAM2F,MAAOoP,MAE1B,OAAUhM,EAAYwnB,EAAYl0B,KAG5BkX,EAAKid,SAAUznB,GACnBwK,EAAK6c,YAAarnB,GAElBwK,EAAKwc,SAAUhnB,OAKInL,UAAVoC,GAAgC,YAAT1B,IAClCyK,EAAY+mB,GAAUl3B,MACjBmQ,GAGJkS,EAASJ,IAAKjiB,KAAM,gBAAiBmQ,GAOjCnQ,KAAK4N,cACT5N,KAAK4N,aAAc,QAClBuC,GAAa/I,KAAU,EACvB,GACAib,EAASvf,IAAK9C,KAAM,kBAAqB,QAO9C43B,SAAU,SAAU91B,GACnB,GAAIqO,GAAW3M,EACdC,EAAI,CAEL0M,GAAY,IAAMrO,EAAW,GAC7B,OAAU0B,EAAOxD,KAAMyD,KACtB,GAAuB,IAAlBD,EAAKiJ,WACP,IAAMwqB,GAAkBC,GAAU1zB,IAAW,KAAM/C,QAAS0P,MAC7D,OAAO,CAIV,QAAO,IAOT,IAAI0nB,IAAU,KAEdh2B,GAAOG,GAAGoC,QACT4N,IAAK,SAAU5K,GACd,GAAI8b,GAAOhgB,EAAK2B,EACfrB,EAAOxD,KAAM,EAEd,EAAA,GAAM2D,UAAUf,OA4BhB,MAFAiC,GAAahD,EAAOgD,WAAYuC,GAEzBpH,KAAKqD,KAAM,SAAUI,GAC3B,GAAIuO,EAEmB,KAAlBhS,KAAKyM,WAKTuF,EADInN,EACEuC,EAAMpG,KAAMhB,KAAMyD,EAAG5B,EAAQ7B,MAAOgS,OAEpC5K,EAIK,MAAP4K,EACJA,EAAM,GAEoB,gBAARA,GAClBA,GAAO,GAEInQ,EAAOkD,QAASiN,KAC3BA,EAAMnQ,EAAO0B,IAAKyO,EAAK,SAAU5K,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItC8b,EAAQrhB,EAAOi2B,SAAU93B,KAAK0F,OAAU7D,EAAOi2B,SAAU93B,KAAKsG,SAASC,eAGjE2c,GAAY,OAASA,IAA+Cle,SAApCke,EAAMjB,IAAKjiB,KAAMgS,EAAK,WAC3DhS,KAAKoH,MAAQ4K,KAzDd,IAAKxO,EAIJ,MAHA0f,GAAQrhB,EAAOi2B,SAAUt0B,EAAKkC,OAC7B7D,EAAOi2B,SAAUt0B,EAAK8C,SAASC,eAE3B2c,GACJ,OAASA,IACgCle,UAAvC9B,EAAMggB,EAAMpgB,IAAKU,EAAM,UAElBN,GAGRA,EAAMM,EAAK4D,MAGS,gBAARlE,GACJA,EAAIkC,QAASyyB,GAAS,IAIhB,MAAP30B,EAAc,GAAKA,OA4C9BrB,EAAOuC,QACN0zB,UACCpS,QACC5iB,IAAK,SAAUU,GAEd,GAAIwO,GAAMnQ,EAAO4O,KAAKsB,KAAMvO,EAAM,QAClC,OAAc,OAAPwO,EACNA,EAMAilB,GAAkBp1B,EAAON,KAAMiC,MAGlC4E,QACCtF,IAAK,SAAUU,GACd,GAAI4D,GAAOse,EAAQjiB,EAClBY,EAAUb,EAAKa,QACfkX,EAAQ/X,EAAKqS,cACboS,EAAoB,eAAdzkB,EAAKkC,KACXyf,EAAS8C,EAAM,QACfmL,EAAMnL,EAAM1M,EAAQ,EAAIlX,EAAQzB,MAUjC,KAPCa,EADI8X,EAAQ,EACR6X,EAGAnL,EAAM1M,EAAQ,EAIX9X,EAAI2vB,EAAK3vB,IAKhB,GAJAiiB,EAASrhB,EAASZ,IAIXiiB,EAAO9P,UAAYnS,IAAM8X,KAG7BmK,EAAOrZ,YACLqZ,EAAOhkB,WAAW2K,WACnBxK,EAAOyE,SAAUof,EAAOhkB,WAAY,aAAiB,CAMxD,GAHA0F,EAAQvF,EAAQ6jB,GAAS1T,MAGpBiW,EACJ,MAAO7gB,EAIR+d,GAAO3kB,KAAM4G,GAIf,MAAO+d,IAGRlD,IAAK,SAAUze,EAAM4D,GACpB,GAAI2wB,GAAWrS,EACdrhB,EAAUb,EAAKa,QACf8gB,EAAStjB,EAAO6E,UAAWU,GAC3B3D,EAAIY,EAAQzB,MAEb,OAAQa,IACPiiB,EAASrhB,EAASZ,IAIbiiB,EAAO9P,SACX/T,EAAO+E,QAAS/E,EAAOi2B,SAASpS,OAAO5iB,IAAK4iB,GAAUP,SAEtD4S,GAAY,EAUd,OAHMA,KACLv0B,EAAKqS,kBAECsP,OAOXtjB,EAAOwB,MAAQ,QAAS,YAAc,WACrCxB,EAAOi2B,SAAU93B,OAChBiiB,IAAK,SAAUze,EAAM4D,GACpB,GAAKvF,EAAOkD,QAASqC,GACpB,MAAS5D,GAAKmS,QAAU9T,EAAO+E,QAAS/E,EAAQ2B,GAAOwO,MAAO5K,QAI3DnG,EAAQ60B,UACbj0B,EAAOi2B,SAAU93B,MAAO8C,IAAM,SAAUU,GACvC,MAAwC,QAAjCA,EAAKmK,aAAc,SAAqB,KAAOnK,EAAK4D,SAW9D,IAAI4wB,IAAc,iCAElBn2B,GAAOuC,OAAQvC,EAAOsmB,OAErB6C,QAAS,SAAU7C,EAAOjG,EAAM1e,EAAMy0B,GAErC,GAAIx0B,GAAGuL,EAAKzH,EAAK2wB,EAAYC,EAAQrP,EAAQ3J,EAC5CiZ,GAAc50B,GAAQ5D,GACtB8F,EAAO9E,EAAOI,KAAMmnB,EAAO,QAAWA,EAAMziB,KAAOyiB,EACnDQ,EAAa/nB,EAAOI,KAAMmnB,EAAO,aAAgBA,EAAMgB,UAAUthB,MAAO,OAKzE,IAHAmH,EAAMzH,EAAM/D,EAAOA,GAAQ5D,EAGJ,IAAlB4D,EAAKiJ,UAAoC,IAAlBjJ,EAAKiJ,WAK5BurB,GAAYtqB,KAAMhI,EAAO7D,EAAOsmB,MAAMY,aAItCrjB,EAAKjF,QAAS,UAGlBkoB,EAAajjB,EAAKmC,MAAO,KACzBnC,EAAOijB,EAAWpa,QAClBoa,EAAWzkB,QAEZi0B,EAASzyB,EAAKjF,QAAS,KAAQ,GAAK,KAAOiF,EAG3CyiB,EAAQA,EAAOtmB,EAAOoD,SACrBkjB,EACA,GAAItmB,GAAO6oB,MAAOhlB,EAAuB,gBAAVyiB,IAAsBA,GAGtDA,EAAMkQ,UAAYJ,EAAe,EAAI,EACrC9P,EAAMgB,UAAYR,EAAW7a,KAAM,KACnCqa,EAAM+B,WAAa/B,EAAMgB,UACxB,GAAIlf,QAAQ,UAAY0e,EAAW7a,KAAM,iBAAoB,WAC7D,KAGDqa,EAAM1U,OAASzO,OACTmjB,EAAMxjB,SACXwjB,EAAMxjB,OAASnB,GAIhB0e,EAAe,MAARA,GACJiG,GACFtmB,EAAO6E,UAAWwb,GAAQiG,IAG3BhJ,EAAUtd,EAAOsmB,MAAMhJ,QAASzZ,OAC1BuyB,IAAgB9Y,EAAQ6L,SAAW7L,EAAQ6L,QAAQtnB,MAAOF,EAAM0e,MAAW,GAAjF,CAMA,IAAM+V,IAAiB9Y,EAAQ4L,WAAalpB,EAAO+D,SAAUpC,GAAS,CAMrE,IAJA00B,EAAa/Y,EAAQ8J,cAAgBvjB,EAC/BsyB,GAAYtqB,KAAMwqB,EAAaxyB,KACpCsJ,EAAMA,EAAItN,YAEHsN,EAAKA,EAAMA,EAAItN,WACtB02B,EAAU53B,KAAMwO,GAChBzH,EAAMyH,CAIFzH,MAAU/D,EAAK2J,eAAiBvN,IACpCw4B,EAAU53B,KAAM+G,EAAIwI,aAAexI,EAAI+wB,cAAgBv4B,GAKzD0D,EAAI,CACJ,QAAUuL,EAAMopB,EAAW30B,QAAY0kB,EAAM4B,uBAE5C5B,EAAMziB,KAAOjC,EAAI,EAChBy0B,EACA/Y,EAAQ+J,UAAYxjB,EAGrBojB,GAAWzG,EAASvf,IAAKkM,EAAK,eAAoBmZ,EAAMziB,OACvD2c,EAASvf,IAAKkM,EAAK,UACf8Z,GACJA,EAAOplB,MAAOsL,EAAKkT,GAIpB4G,EAASqP,GAAUnpB,EAAKmpB,GACnBrP,GAAUA,EAAOplB,OAASie,EAAY3S,KAC1CmZ,EAAM1U,OAASqV,EAAOplB,MAAOsL,EAAKkT,GAC7BiG,EAAM1U,UAAW,GACrB0U,EAAMgC,iBAoCT,OAhCAhC,GAAMziB,KAAOA,EAGPuyB,GAAiB9P,EAAMmD,sBAEpBnM,EAAQ4G,UACf5G,EAAQ4G,SAASriB,MAAO00B,EAAU5uB,MAAO0Y,MAAW,IACpDP,EAAYne,IAIP20B,GAAUt2B,EAAOgD,WAAYrB,EAAMkC,MAAa7D,EAAO+D,SAAUpC,KAGrE+D,EAAM/D,EAAM20B,GAEP5wB,IACJ/D,EAAM20B,GAAW,MAIlBt2B,EAAOsmB,MAAMY,UAAYrjB,EACzBlC,EAAMkC,KACN7D,EAAOsmB,MAAMY,UAAY/jB,OAEpBuC,IACJ/D,EAAM20B,GAAW5wB,IAMd4gB,EAAM1U,SAKd8kB,SAAU,SAAU7yB,EAAMlC,EAAM2kB,GAC/B,GAAIzb,GAAI7K,EAAOuC,OACd,GAAIvC,GAAO6oB,MACXvC,GAECziB,KAAMA,EACNgmB,aAAa,GAIf7pB,GAAOsmB,MAAM6C,QAASte,EAAG,KAAMlJ,MAKjC3B,EAAOG,GAAGoC,QAET4mB,QAAS,SAAUtlB,EAAMwc,GACxB,MAAOliB,MAAKqD,KAAM,WACjBxB,EAAOsmB,MAAM6C,QAAStlB,EAAMwc,EAAMliB,SAGpCw4B,eAAgB,SAAU9yB,EAAMwc,GAC/B,GAAI1e,GAAOxD,KAAM,EACjB,IAAKwD,EACJ,MAAO3B,GAAOsmB,MAAM6C,QAAStlB,EAAMwc,EAAM1e,GAAM,MAMlD3B,EAAOwB,KAAM,wLAEgDwE,MAAO,KACnE,SAAUpE,EAAGa,GAGbzC,EAAOG,GAAIsC,GAAS,SAAU4d,EAAMlgB,GACnC,MAAO2B,WAAUf,OAAS,EACzB5C,KAAK+nB,GAAIzjB,EAAM,KAAM4d,EAAMlgB,GAC3BhC,KAAKgrB,QAAS1mB,MAIjBzC,EAAOG,GAAGoC,QACTq0B,MAAO,SAAUC,EAAQC,GACxB,MAAO34B,MAAKwtB,WAAYkL,GAASjL,WAAYkL,GAASD,MAOxDz3B,EAAQ23B,QAAU,aAAe74B,GAW3BkB,EAAQ23B,SACb/2B,EAAOwB,MAAQgS,MAAO,UAAW4V,KAAM,YAAc,SAAU2C,EAAMjE,GAGpE,GAAI9a,GAAU,SAAUsZ,GACvBtmB,EAAOsmB,MAAMoQ,SAAU5O,EAAKxB,EAAMxjB,OAAQ9C,EAAOsmB,MAAMwB,IAAKxB,IAG7DtmB,GAAOsmB,MAAMhJ,QAASwK,IACrBN,MAAO,WACN,GAAIjoB,GAAMpB,KAAKmN,eAAiBnN,KAC/B64B,EAAWxW,EAASf,OAAQlgB,EAAKuoB,EAE5BkP,IACLz3B,EAAI6O,iBAAkB2d,EAAM/e,GAAS,GAEtCwT,EAASf,OAAQlgB,EAAKuoB,GAAOkP,GAAY,GAAM,IAEhDrP,SAAU,WACT,GAAIpoB,GAAMpB,KAAKmN,eAAiBnN,KAC/B64B,EAAWxW,EAASf,OAAQlgB,EAAKuoB,GAAQ,CAEpCkP,GAKLxW,EAASf,OAAQlgB,EAAKuoB,EAAKkP,IAJ3Bz3B,EAAI+f,oBAAqByM,EAAM/e,GAAS,GACxCwT,EAASpF,OAAQ7b,EAAKuoB,OAW3B,IACCmP,IAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhB,SAASC,IAAahE,EAAQzvB,EAAK0zB,EAAa1d,GAC/C,GAAInX,EAEJ,IAAKzC,EAAOkD,QAASU,GAGpB5D,EAAOwB,KAAMoC,EAAK,SAAUhC,EAAG6Z,GACzB6b,GAAeL,GAASprB,KAAMwnB,GAGlCzZ,EAAKyZ,EAAQ5X,GAKb4b,GACChE,EAAS,KAAqB,gBAAN5X,IAAuB,MAALA,EAAY7Z,EAAI,IAAO,IACjE6Z,EACA6b,EACA1d;OAKG,IAAM0d,GAAsC,WAAvBt3B,EAAO6D,KAAMD,GAUxCgW,EAAKyZ,EAAQzvB,OAPb,KAAMnB,IAAQmB,GACbyzB,GAAahE,EAAS,IAAM5wB,EAAO,IAAKmB,EAAKnB,GAAQ60B,EAAa1d,GAYrE5Z,EAAOu3B,MAAQ,SAAU9vB,EAAG6vB,GAC3B,GAAIjE,GACHmE,KACA5d,EAAM,SAAUpN,EAAKirB,GAGpB,GAAIlyB,GAAQvF,EAAOgD,WAAYy0B,GAC9BA,IACAA,CAEDD,GAAGA,EAAEz2B,QAAW22B,mBAAoBlrB,GAAQ,IAC3CkrB,mBAA6B,MAATnyB,EAAgB,GAAKA,GAI5C,IAAKvF,EAAOkD,QAASuE,IAASA,EAAE5G,SAAWb,EAAOiD,cAAewE,GAGhEzH,EAAOwB,KAAMiG,EAAG,WACfmS,EAAKzb,KAAKsE,KAAMtE,KAAKoH,aAOtB,KAAM8tB,IAAU5rB,GACf4vB,GAAahE,EAAQ5rB,EAAG4rB,GAAUiE,EAAa1d,EAKjD,OAAO4d,GAAEvrB,KAAM,MAGhBjM,EAAOG,GAAGoC,QACTo1B,UAAW,WACV,MAAO33B,GAAOu3B,MAAOp5B,KAAKy5B,mBAE3BA,eAAgB,WACf,MAAOz5B,MAAKuD,IAAK,WAGhB,GAAIuO,GAAWjQ,EAAOsgB,KAAMniB,KAAM,WAClC,OAAO8R,GAAWjQ,EAAO6E,UAAWoL,GAAa9R,OAEjDuQ,OAAQ,WACR,GAAI7K,GAAO1F,KAAK0F,IAGhB,OAAO1F,MAAKsE,OAASzC,EAAQ7B,MAAOma,GAAI,cACvC8e,GAAavrB,KAAM1N,KAAKsG,YAAe0yB,GAAgBtrB,KAAMhI,KAC3D1F,KAAK2V,UAAY2P,GAAe5X,KAAMhI,MAEzCnC,IAAK,SAAUE,EAAGD,GAClB,GAAIwO,GAAMnQ,EAAQ7B,MAAOgS,KAEzB,OAAY,OAAPA,EACG,KAGHnQ,EAAOkD,QAASiN,GACbnQ,EAAO0B,IAAKyO,EAAK,SAAUA,GACjC,OAAS1N,KAAMd,EAAKc,KAAM8C,MAAO4K,EAAI5M,QAAS2zB,GAAO,YAI9Cz0B,KAAMd,EAAKc,KAAM8C,MAAO4K,EAAI5M,QAAS2zB,GAAO,WAClDj2B,SAKNjB,EAAOG,GAAGoC,QACTs1B,QAAS,SAAUxK,GAClB,GAAIpI,EAyBJ,OAvBK9mB,MAAM,KACL6B,EAAOgD,WAAYqqB,KACvBA,EAAOA,EAAKluB,KAAMhB,KAAM,KAIzB8mB,EAAOjlB,EAAQqtB,EAAMlvB,KAAM,GAAImN,eAAgBtJ,GAAI,GAAIa,OAAO,GAEzD1E,KAAM,GAAI0B,YACdolB,EAAKgJ,aAAc9vB,KAAM,IAG1B8mB,EAAKvjB,IAAK,WACT,GAAIC,GAAOxD,IAEX,OAAQwD,EAAKm2B,kBACZn2B,EAAOA,EAAKm2B,iBAGb,OAAOn2B,KACJosB,OAAQ5vB,OAGNA,MAGR45B,UAAW,SAAU1K,GACpB,MAAKrtB,GAAOgD,WAAYqqB,GAChBlvB,KAAKqD,KAAM,SAAUI,GAC3B5B,EAAQ7B,MAAO45B,UAAW1K,EAAKluB,KAAMhB,KAAMyD,MAItCzD,KAAKqD,KAAM,WACjB,GAAIsX,GAAO9Y,EAAQ7B,MAClBkb,EAAWP,EAAKO,UAEZA,GAAStY,OACbsY,EAASwe,QAASxK,GAGlBvU,EAAKiV,OAAQV,MAKhBpI,KAAM,SAAUoI,GACf,GAAIrqB,GAAahD,EAAOgD,WAAYqqB,EAEpC,OAAOlvB,MAAKqD,KAAM,SAAUI,GAC3B5B,EAAQ7B,MAAO05B,QAAS70B,EAAaqqB,EAAKluB,KAAMhB,KAAMyD,GAAMyrB,MAI9D2K,OAAQ,SAAU/3B,GAIjB,MAHA9B,MAAKmU,OAAQrS,GAAW6S,IAAK,QAAStR,KAAM,WAC3CxB,EAAQ7B,MAAOiwB,YAAajwB,KAAKwM,cAE3BxM,QAKT6B,EAAOgQ,KAAK9H,QAAQ+vB,OAAS,SAAUt2B,GACtC,OAAQ3B,EAAOgQ,KAAK9H,QAAQgwB,QAASv2B,IAEtC3B,EAAOgQ,KAAK9H,QAAQgwB,QAAU,SAAUv2B,GACvC,SAAWA,EAAKw2B,aAAex2B,EAAKy2B,cAAgBz2B,EAAKmwB,iBAAiB/wB,SAW3E3B,EAAQi5B,mBAAqB,WAC5B,GAAIlV,GAAOplB,EAASu6B,eAAeD,mBAAoB,IAAKlV,IAE5D,OADAA,GAAKpU,UAAY,6BACiB,IAA3BoU,EAAKxY,WAAW5J,UAQxBf,EAAOgZ,UAAY,SAAUqH,EAAMngB,EAASq4B,GAC3C,GAAqB,gBAATlY,GACX,QAEuB,kBAAZngB,KACXq4B,EAAcr4B,EACdA,GAAU,EAGX,IAAIoV,GAAMkjB,EAAQ1T,CAwBlB,OAtBM5kB,KAIAd,EAAQi5B,oBACZn4B,EAAUnC,EAASu6B,eAAeD,mBAAoB,IAKtD/iB,EAAOpV,EAAQT,cAAe,QAC9B6V,EAAK3B,KAAO5V,EAASuV,SAASK,KAC9BzT,EAAQP,KAAKC,YAAa0V,IAE1BpV,EAAUnC,GAIZy6B,EAAS9f,EAAWnN,KAAM8U,GAC1ByE,GAAWyT,MAGNC,GACKt4B,EAAQT,cAAe+4B,EAAQ,MAGzCA,EAAS3T,IAAiBxE,GAAQngB,EAAS4kB,GAEtCA,GAAWA,EAAQ/jB,QACvBf,EAAQ8kB,GAAU1J,SAGZpb,EAAOsB,SAAWk3B,EAAO7tB,aAOjC,SAAS8tB,IAAW92B,GACnB,MAAO3B,GAAO+D,SAAUpC,GAASA,EAAyB,IAAlBA,EAAKiJ,UAAkBjJ,EAAKuM,YAGrElO,EAAO04B,QACNC,UAAW,SAAUh3B,EAAMa,EAASZ,GACnC,GAAIg3B,GAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnEtI,EAAW5wB,EAAOmiB,IAAKxgB,EAAM,YAC7Bw3B,EAAUn5B,EAAQ2B,GAClB6nB,IAGiB,YAAboH,IACJjvB,EAAKsgB,MAAM2O,SAAW,YAGvBoI,EAAYG,EAAQT,SACpBI,EAAY94B,EAAOmiB,IAAKxgB,EAAM,OAC9Bs3B,EAAaj5B,EAAOmiB,IAAKxgB,EAAM,QAC/Bu3B,GAAmC,aAAbtI,GAAwC,UAAbA,KAC9CkI,EAAYG,GAAar6B,QAAS,WAIhCs6B,GACJN,EAAcO,EAAQvI,WACtBmI,EAASH,EAAYzqB,IACrB0qB,EAAUD,EAAY3F,OAGtB8F,EAAS70B,WAAY40B,IAAe,EACpCD,EAAU30B,WAAY+0B,IAAgB,GAGlCj5B,EAAOgD,WAAYR,KAGvBA,EAAUA,EAAQrD,KAAMwC,EAAMC,EAAG5B,EAAOuC,UAAYy2B,KAGjC,MAAfx2B,EAAQ2L,MACZqb,EAAMrb,IAAQ3L,EAAQ2L,IAAM6qB,EAAU7qB,IAAQ4qB,GAE1B,MAAhBv2B,EAAQywB,OACZzJ,EAAMyJ,KAASzwB,EAAQywB,KAAO+F,EAAU/F,KAAS4F,GAG7C,SAAWr2B,GACfA,EAAQ42B,MAAMj6B,KAAMwC,EAAM6nB,GAG1B2P,EAAQhX,IAAKqH,KAKhBxpB,EAAOG,GAAGoC,QACTm2B,OAAQ,SAAUl2B,GAGjB,GAAKV,UAAUf,OACd,MAAmBoC,UAAZX,EACNrE,KACAA,KAAKqD,KAAM,SAAUI,GACpB5B,EAAO04B,OAAOC,UAAWx6B,KAAMqE,EAASZ,IAI3C,IAAIgF,GAASyyB,EAAKC,EAAM/5B,EACvBoC,EAAOxD,KAAM,EAEd,IAAMwD,EAON,MAAMA,GAAKmwB,iBAAiB/wB,QAI5Bu4B,EAAO33B,EAAKowB,wBAGPuH,EAAK7J,OAAS6J,EAAKC,QACvBh6B,EAAMoC,EAAK2J,cACX+tB,EAAMZ,GAAWl5B,GACjBqH,EAAUrH,EAAIuO,iBAGbK,IAAKmrB,EAAKnrB,IAAMkrB,EAAIG,YAAc5yB,EAAQ6yB,UAC1CxG,KAAMqG,EAAKrG,KAAOoG,EAAIK,YAAc9yB,EAAQ+yB,aAKvCL,IAlBGnrB,IAAK,EAAG8kB,KAAM,IAqBzBrC,SAAU,WACT,GAAMzyB,KAAM,GAAZ,CAIA,GAAIy7B,GAAclB,EACjB/2B,EAAOxD,KAAM,GACb07B,GAAiB1rB,IAAK,EAAG8kB,KAAM,EA4BhC,OAxBwC,UAAnCjzB,EAAOmiB,IAAKxgB,EAAM,YAGtB+2B,EAAS/2B,EAAKowB,yBAKd6H,EAAez7B,KAAKy7B,eAGpBlB,EAASv6B,KAAKu6B,SACR14B,EAAOyE,SAAUm1B,EAAc,GAAK,UACzCC,EAAeD,EAAalB,UAI7BmB,GACC1rB,IAAK0rB,EAAa1rB,IAAMnO,EAAOmiB,IAAKyX,EAAc,GAAK,kBAAkB,GACzE3G,KAAM4G,EAAa5G,KAAOjzB,EAAOmiB,IAAKyX,EAAc,GAAK,mBAAmB,MAM7EzrB,IAAKuqB,EAAOvqB,IAAM0rB,EAAa1rB,IAAMnO,EAAOmiB,IAAKxgB,EAAM,aAAa,GACpEsxB,KAAMyF,EAAOzF,KAAO4G,EAAa5G,KAAOjzB,EAAOmiB,IAAKxgB,EAAM,cAAc,MAc1Ei4B,aAAc,WACb,MAAOz7B,MAAKuD,IAAK,WAChB,GAAIk4B,GAAez7B,KAAKy7B,YAExB,OAAQA,GAA2D,WAA3C55B,EAAOmiB,IAAKyX,EAAc,YACjDA,EAAeA,EAAaA,YAG7B,OAAOA,IAAgB9rB,QAM1B9N,EAAOwB,MAAQs4B,WAAY,cAAeC,UAAW,eAAiB,SAAUhe,EAAQuE,GACvF,GAAInS,GAAM,gBAAkBmS,CAE5BtgB,GAAOG,GAAI4b,GAAW,SAAU5L,GAC/B,MAAOsP,GAAQthB,KAAM,SAAUwD,EAAMoa,EAAQ5L,GAC5C,GAAIkpB,GAAMZ,GAAW92B,EAErB,OAAawB,UAARgN,EACGkpB,EAAMA,EAAK/Y,GAAS3e,EAAMoa,QAG7Bsd,EACJA,EAAIW,SACF7rB,EAAYkrB,EAAIK,YAAVvpB,EACPhC,EAAMgC,EAAMkpB,EAAIG,aAIjB73B,EAAMoa,GAAW5L,IAEhB4L,EAAQ5L,EAAKrO,UAAUf,WAU5Bf,EAAOwB,MAAQ,MAAO,QAAU,SAAUI,EAAG0e,GAC5CtgB,EAAOgyB,SAAU1R,GAASiQ,GAAcnxB,EAAQ0wB,cAC/C,SAAUnuB,EAAMwuB,GACf,GAAKA,EAIJ,MAHAA,GAAWD,GAAQvuB,EAAM2e,GAGlBuO,GAAUhjB,KAAMskB,GACtBnwB,EAAQ2B,GAAOivB,WAAYtQ,GAAS,KACpC6P,MAQLnwB,EAAOwB,MAAQy4B,OAAQ,SAAUC,MAAO,SAAW,SAAUz3B,EAAMoB,GAClE7D,EAAOwB,MAAQ2xB,QAAS,QAAU1wB,EAAM8pB,QAAS1oB,EAAMs2B,GAAI,QAAU13B,GACpE,SAAU23B,EAAcC,GAGxBr6B,EAAOG,GAAIk6B,GAAa,SAAUnH,EAAQ3tB,GACzC,GAAIma,GAAY5d,UAAUf,SAAYq5B,GAAkC,iBAAXlH,IAC5DzB,EAAQ2I,IAAkBlH,KAAW,GAAQ3tB,KAAU,EAAO,SAAW,SAE1E,OAAOka,GAAQthB,KAAM,SAAUwD,EAAMkC,EAAM0B,GAC1C,GAAIhG,EAEJ,OAAKS,GAAO+D,SAAUpC,GAGkB,IAAhC04B,EAASz7B,QAAS,SACxB+C,EAAM,QAAUc,GAChBd,EAAK5D,SAAS+P,gBAAiB,SAAWrL,GAIrB,IAAlBd,EAAKiJ,UACTrL,EAAMoC,EAAKmM,gBAIJzK,KAAKkuB,IACX5vB,EAAKwhB,KAAM,SAAW1gB,GAAQlD,EAAK,SAAWkD,GAC9Cd,EAAKwhB,KAAM,SAAW1gB,GAAQlD,EAAK,SAAWkD,GAC9ClD,EAAK,SAAWkD,KAIDU,SAAVoC,EAGNvF,EAAOmiB,IAAKxgB,EAAMkC,EAAM4tB,GAGxBzxB,EAAOiiB,MAAOtgB,EAAMkC,EAAM0B,EAAOksB,IAChC5tB,EAAM6b,EAAYwT,EAAS/vB,OAAWuc,QAmBrB,kBAAX4a,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WACrB,MAAOt6B,IAOT,IAGCw6B,IAAUt8B,EAAO8B,OAGjBy6B,GAAKv8B,EAAOw8B,CAyBb,OAvBA16B,GAAO26B,WAAa,SAAU53B,GAS7B,MARK7E,GAAOw8B,IAAM16B,IACjB9B,EAAOw8B,EAAID,IAGP13B,GAAQ7E,EAAO8B,SAAWA,IAC9B9B,EAAO8B,OAASw6B,IAGVx6B,GAMF5B,IACLF,EAAO8B,OAAS9B,EAAOw8B,EAAI16B,GAOrBA","file":"jquery.slim.min.js"}
        \ No newline at end of file
        diff --git a/bower_components/jquery/external/sizzle/LICENSE.txt b/bower_components/jquery/external/sizzle/LICENSE.txt
        new file mode 100644
        index 0000000000..dd7ce9402c
        --- /dev/null
        +++ b/bower_components/jquery/external/sizzle/LICENSE.txt
        @@ -0,0 +1,36 @@
        +Copyright jQuery Foundation and other contributors, https://jquery.org/
        +
        +This software consists of voluntary contributions made by many
        +individuals. For exact contribution history, see the revision history
        +available at https://github.com/jquery/sizzle
        +
        +The following license applies to all parts of this software except as
        +documented below:
        +
        +====
        +
        +Permission is hereby granted, free of charge, to any person obtaining
        +a copy of this software and associated documentation files (the
        +"Software"), to deal in the Software without restriction, including
        +without limitation the rights to use, copy, modify, merge, publish,
        +distribute, sublicense, and/or sell copies of the Software, and to
        +permit persons to whom the Software is furnished to do so, subject to
        +the following conditions:
        +
        +The above copyright notice and this permission notice shall be
        +included in all copies or substantial portions of the Software.
        +
        +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
        +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
        +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
        +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
        +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
        +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
        +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        +
        +====
        +
        +All files located in the node_modules and external directories are
        +externally maintained libraries used by this software which have their
        +own licenses; we recommend you read them, as their terms may differ from
        +the terms above.
        diff --git a/bower_components/jquery/external/sizzle/dist/sizzle.js b/bower_components/jquery/external/sizzle/dist/sizzle.js
        new file mode 100644
        index 0000000000..bfa0793136
        --- /dev/null
        +++ b/bower_components/jquery/external/sizzle/dist/sizzle.js
        @@ -0,0 +1,2272 @@
        +/*!
        + * Sizzle CSS Selector Engine v2.3.3
        + * https://sizzlejs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + *
        + * Date: 2016-08-08
        + */
        +(function( window ) {
        +
        +var i,
        +	support,
        +	Expr,
        +	getText,
        +	isXML,
        +	tokenize,
        +	compile,
        +	select,
        +	outermostContext,
        +	sortInput,
        +	hasDuplicate,
        +
        +	// Local document vars
        +	setDocument,
        +	document,
        +	docElem,
        +	documentIsHTML,
        +	rbuggyQSA,
        +	rbuggyMatches,
        +	matches,
        +	contains,
        +
        +	// Instance-specific data
        +	expando = "sizzle" + 1 * new Date(),
        +	preferredDoc = window.document,
        +	dirruns = 0,
        +	done = 0,
        +	classCache = createCache(),
        +	tokenCache = createCache(),
        +	compilerCache = createCache(),
        +	sortOrder = function( a, b ) {
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +		}
        +		return 0;
        +	},
        +
        +	// Instance methods
        +	hasOwn = ({}).hasOwnProperty,
        +	arr = [],
        +	pop = arr.pop,
        +	push_native = arr.push,
        +	push = arr.push,
        +	slice = arr.slice,
        +	// Use a stripped-down indexOf as it's faster than native
        +	// https://jsperf.com/thor-indexof-vs-for/5
        +	indexOf = function( list, elem ) {
        +		var i = 0,
        +			len = list.length;
        +		for ( ; i < len; i++ ) {
        +			if ( list[i] === elem ) {
        +				return i;
        +			}
        +		}
        +		return -1;
        +	},
        +
        +	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
        +
        +	// Regular expressions
        +
        +	// http://www.w3.org/TR/css3-selectors/#whitespace
        +	whitespace = "[\\x20\\t\\r\\n\\f]",
        +
        +	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        +	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
        +
        +	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
        +	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
        +		// Operator (capture 2)
        +		"*([*^$|!~]?=)" + whitespace +
        +		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
        +		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
        +		"*\\]",
        +
        +	pseudos = ":(" + identifier + ")(?:\\((" +
        +		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
        +		// 1. quoted (capture 3; capture 4 or capture 5)
        +		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
        +		// 2. simple (capture 6)
        +		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
        +		// 3. anything else (capture 2)
        +		".*" +
        +		")\\)|)",
        +
        +	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
        +	rwhitespace = new RegExp( whitespace + "+", "g" ),
        +	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
        +
        +	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
        +	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
        +
        +	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
        +
        +	rpseudo = new RegExp( pseudos ),
        +	ridentifier = new RegExp( "^" + identifier + "$" ),
        +
        +	matchExpr = {
        +		"ID": new RegExp( "^#(" + identifier + ")" ),
        +		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
        +		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
        +		"ATTR": new RegExp( "^" + attributes ),
        +		"PSEUDO": new RegExp( "^" + pseudos ),
        +		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
        +			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
        +			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
        +		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
        +		// For use in libraries implementing .is()
        +		// We use this for POS matching in `select`
        +		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
        +			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
        +	},
        +
        +	rinputs = /^(?:input|select|textarea|button)$/i,
        +	rheader = /^h\d$/i,
        +
        +	rnative = /^[^{]+\{\s*\[native \w/,
        +
        +	// Easily-parseable/retrievable ID or TAG or CLASS selectors
        +	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
        +
        +	rsibling = /[+~]/,
        +
        +	// CSS escapes
        +	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
        +	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
        +	funescape = function( _, escaped, escapedWhitespace ) {
        +		var high = "0x" + escaped - 0x10000;
        +		// NaN means non-codepoint
        +		// Support: Firefox<24
        +		// Workaround erroneous numeric interpretation of +"0x"
        +		return high !== high || escapedWhitespace ?
        +			escaped :
        +			high < 0 ?
        +				// BMP codepoint
        +				String.fromCharCode( high + 0x10000 ) :
        +				// Supplemental Plane codepoint (surrogate pair)
        +				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
        +	},
        +
        +	// CSS string/identifier serialization
        +	// https://drafts.csswg.org/cssom/#common-serializing-idioms
        +	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
        +	fcssescape = function( ch, asCodePoint ) {
        +		if ( asCodePoint ) {
        +
        +			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
        +			if ( ch === "\0" ) {
        +				return "\uFFFD";
        +			}
        +
        +			// Control characters and (dependent upon position) numbers get escaped as code points
        +			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
        +		}
        +
        +		// Other potentially-special ASCII characters get backslash-escaped
        +		return "\\" + ch;
        +	},
        +
        +	// Used for iframes
        +	// See setDocument()
        +	// Removing the function wrapper causes a "Permission Denied"
        +	// error in IE
        +	unloadHandler = function() {
        +		setDocument();
        +	},
        +
        +	disabledAncestor = addCombinator(
        +		function( elem ) {
        +			return elem.disabled === true && ("form" in elem || "label" in elem);
        +		},
        +		{ dir: "parentNode", next: "legend" }
        +	);
        +
        +// Optimize for push.apply( _, NodeList )
        +try {
        +	push.apply(
        +		(arr = slice.call( preferredDoc.childNodes )),
        +		preferredDoc.childNodes
        +	);
        +	// Support: Android<4.0
        +	// Detect silently failing push.apply
        +	arr[ preferredDoc.childNodes.length ].nodeType;
        +} catch ( e ) {
        +	push = { apply: arr.length ?
        +
        +		// Leverage slice if possible
        +		function( target, els ) {
        +			push_native.apply( target, slice.call(els) );
        +		} :
        +
        +		// Support: IE<9
        +		// Otherwise append directly
        +		function( target, els ) {
        +			var j = target.length,
        +				i = 0;
        +			// Can't trust NodeList.length
        +			while ( (target[j++] = els[i++]) ) {}
        +			target.length = j - 1;
        +		}
        +	};
        +}
        +
        +function Sizzle( selector, context, results, seed ) {
        +	var m, i, elem, nid, match, groups, newSelector,
        +		newContext = context && context.ownerDocument,
        +
        +		// nodeType defaults to 9, since context defaults to document
        +		nodeType = context ? context.nodeType : 9;
        +
        +	results = results || [];
        +
        +	// Return early from calls with invalid selector or context
        +	if ( typeof selector !== "string" || !selector ||
        +		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
        +
        +		return results;
        +	}
        +
        +	// Try to shortcut find operations (as opposed to filters) in HTML documents
        +	if ( !seed ) {
        +
        +		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
        +			setDocument( context );
        +		}
        +		context = context || document;
        +
        +		if ( documentIsHTML ) {
        +
        +			// If the selector is sufficiently simple, try using a "get*By*" DOM method
        +			// (excepting DocumentFragment context, where the methods don't exist)
        +			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
        +
        +				// ID selector
        +				if ( (m = match[1]) ) {
        +
        +					// Document context
        +					if ( nodeType === 9 ) {
        +						if ( (elem = context.getElementById( m )) ) {
        +
        +							// Support: IE, Opera, Webkit
        +							// TODO: identify versions
        +							// getElementById can match elements by name instead of ID
        +							if ( elem.id === m ) {
        +								results.push( elem );
        +								return results;
        +							}
        +						} else {
        +							return results;
        +						}
        +
        +					// Element context
        +					} else {
        +
        +						// Support: IE, Opera, Webkit
        +						// TODO: identify versions
        +						// getElementById can match elements by name instead of ID
        +						if ( newContext && (elem = newContext.getElementById( m )) &&
        +							contains( context, elem ) &&
        +							elem.id === m ) {
        +
        +							results.push( elem );
        +							return results;
        +						}
        +					}
        +
        +				// Type selector
        +				} else if ( match[2] ) {
        +					push.apply( results, context.getElementsByTagName( selector ) );
        +					return results;
        +
        +				// Class selector
        +				} else if ( (m = match[3]) && support.getElementsByClassName &&
        +					context.getElementsByClassName ) {
        +
        +					push.apply( results, context.getElementsByClassName( m ) );
        +					return results;
        +				}
        +			}
        +
        +			// Take advantage of querySelectorAll
        +			if ( support.qsa &&
        +				!compilerCache[ selector + " " ] &&
        +				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
        +
        +				if ( nodeType !== 1 ) {
        +					newContext = context;
        +					newSelector = selector;
        +
        +				// qSA looks outside Element context, which is not what we want
        +				// Thanks to Andrew Dupont for this workaround technique
        +				// Support: IE <=8
        +				// Exclude object elements
        +				} else if ( context.nodeName.toLowerCase() !== "object" ) {
        +
        +					// Capture the context ID, setting it first if necessary
        +					if ( (nid = context.getAttribute( "id" )) ) {
        +						nid = nid.replace( rcssescape, fcssescape );
        +					} else {
        +						context.setAttribute( "id", (nid = expando) );
        +					}
        +
        +					// Prefix every selector in the list
        +					groups = tokenize( selector );
        +					i = groups.length;
        +					while ( i-- ) {
        +						groups[i] = "#" + nid + " " + toSelector( groups[i] );
        +					}
        +					newSelector = groups.join( "," );
        +
        +					// Expand context for sibling selectors
        +					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
        +						context;
        +				}
        +
        +				if ( newSelector ) {
        +					try {
        +						push.apply( results,
        +							newContext.querySelectorAll( newSelector )
        +						);
        +						return results;
        +					} catch ( qsaError ) {
        +					} finally {
        +						if ( nid === expando ) {
        +							context.removeAttribute( "id" );
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	// All others
        +	return select( selector.replace( rtrim, "$1" ), context, results, seed );
        +}
        +
        +/**
        + * Create key-value caches of limited size
        + * @returns {function(string, object)} Returns the Object data after storing it on itself with
        + *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
        + *	deleting the oldest entry
        + */
        +function createCache() {
        +	var keys = [];
        +
        +	function cache( key, value ) {
        +		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        +		if ( keys.push( key + " " ) > Expr.cacheLength ) {
        +			// Only keep the most recent entries
        +			delete cache[ keys.shift() ];
        +		}
        +		return (cache[ key + " " ] = value);
        +	}
        +	return cache;
        +}
        +
        +/**
        + * Mark a function for special use by Sizzle
        + * @param {Function} fn The function to mark
        + */
        +function markFunction( fn ) {
        +	fn[ expando ] = true;
        +	return fn;
        +}
        +
        +/**
        + * Support testing using an element
        + * @param {Function} fn Passed the created element and returns a boolean result
        + */
        +function assert( fn ) {
        +	var el = document.createElement("fieldset");
        +
        +	try {
        +		return !!fn( el );
        +	} catch (e) {
        +		return false;
        +	} finally {
        +		// Remove from its parent by default
        +		if ( el.parentNode ) {
        +			el.parentNode.removeChild( el );
        +		}
        +		// release memory in IE
        +		el = null;
        +	}
        +}
        +
        +/**
        + * Adds the same handler for all of the specified attrs
        + * @param {String} attrs Pipe-separated list of attributes
        + * @param {Function} handler The method that will be applied
        + */
        +function addHandle( attrs, handler ) {
        +	var arr = attrs.split("|"),
        +		i = arr.length;
        +
        +	while ( i-- ) {
        +		Expr.attrHandle[ arr[i] ] = handler;
        +	}
        +}
        +
        +/**
        + * Checks document order of two siblings
        + * @param {Element} a
        + * @param {Element} b
        + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
        + */
        +function siblingCheck( a, b ) {
        +	var cur = b && a,
        +		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
        +			a.sourceIndex - b.sourceIndex;
        +
        +	// Use IE sourceIndex if available on both nodes
        +	if ( diff ) {
        +		return diff;
        +	}
        +
        +	// Check if b follows a
        +	if ( cur ) {
        +		while ( (cur = cur.nextSibling) ) {
        +			if ( cur === b ) {
        +				return -1;
        +			}
        +		}
        +	}
        +
        +	return a ? 1 : -1;
        +}
        +
        +/**
        + * Returns a function to use in pseudos for input types
        + * @param {String} type
        + */
        +function createInputPseudo( type ) {
        +	return function( elem ) {
        +		var name = elem.nodeName.toLowerCase();
        +		return name === "input" && elem.type === type;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for buttons
        + * @param {String} type
        + */
        +function createButtonPseudo( type ) {
        +	return function( elem ) {
        +		var name = elem.nodeName.toLowerCase();
        +		return (name === "input" || name === "button") && elem.type === type;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for :enabled/:disabled
        + * @param {Boolean} disabled true for :disabled; false for :enabled
        + */
        +function createDisabledPseudo( disabled ) {
        +
        +	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
        +	return function( elem ) {
        +
        +		// Only certain elements can match :enabled or :disabled
        +		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
        +		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
        +		if ( "form" in elem ) {
        +
        +			// Check for inherited disabledness on relevant non-disabled elements:
        +			// * listed form-associated elements in a disabled fieldset
        +			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
        +			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
        +			// * option elements in a disabled optgroup
        +			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
        +			// All such elements have a "form" property.
        +			if ( elem.parentNode && elem.disabled === false ) {
        +
        +				// Option elements defer to a parent optgroup if present
        +				if ( "label" in elem ) {
        +					if ( "label" in elem.parentNode ) {
        +						return elem.parentNode.disabled === disabled;
        +					} else {
        +						return elem.disabled === disabled;
        +					}
        +				}
        +
        +				// Support: IE 6 - 11
        +				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
        +				return elem.isDisabled === disabled ||
        +
        +					// Where there is no isDisabled, check manually
        +					/* jshint -W018 */
        +					elem.isDisabled !== !disabled &&
        +						disabledAncestor( elem ) === disabled;
        +			}
        +
        +			return elem.disabled === disabled;
        +
        +		// Try to winnow out elements that can't be disabled before trusting the disabled property.
        +		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
        +		// even exist on them, let alone have a boolean value.
        +		} else if ( "label" in elem ) {
        +			return elem.disabled === disabled;
        +		}
        +
        +		// Remaining elements are neither :enabled nor :disabled
        +		return false;
        +	};
        +}
        +
        +/**
        + * Returns a function to use in pseudos for positionals
        + * @param {Function} fn
        + */
        +function createPositionalPseudo( fn ) {
        +	return markFunction(function( argument ) {
        +		argument = +argument;
        +		return markFunction(function( seed, matches ) {
        +			var j,
        +				matchIndexes = fn( [], seed.length, argument ),
        +				i = matchIndexes.length;
        +
        +			// Match elements found at the specified indexes
        +			while ( i-- ) {
        +				if ( seed[ (j = matchIndexes[i]) ] ) {
        +					seed[j] = !(matches[j] = seed[j]);
        +				}
        +			}
        +		});
        +	});
        +}
        +
        +/**
        + * Checks a node for validity as a Sizzle context
        + * @param {Element|Object=} context
        + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
        + */
        +function testContext( context ) {
        +	return context && typeof context.getElementsByTagName !== "undefined" && context;
        +}
        +
        +// Expose support vars for convenience
        +support = Sizzle.support = {};
        +
        +/**
        + * Detects XML nodes
        + * @param {Element|Object} elem An element or a document
        + * @returns {Boolean} True iff elem is a non-HTML XML node
        + */
        +isXML = Sizzle.isXML = function( elem ) {
        +	// documentElement is verified for cases where it doesn't yet exist
        +	// (such as loading iframes in IE - #4833)
        +	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
        +	return documentElement ? documentElement.nodeName !== "HTML" : false;
        +};
        +
        +/**
        + * Sets document-related variables once based on the current document
        + * @param {Element|Object} [doc] An element or document object to use to set the document
        + * @returns {Object} Returns the current document
        + */
        +setDocument = Sizzle.setDocument = function( node ) {
        +	var hasCompare, subWindow,
        +		doc = node ? node.ownerDocument || node : preferredDoc;
        +
        +	// Return early if doc is invalid or already selected
        +	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
        +		return document;
        +	}
        +
        +	// Update global variables
        +	document = doc;
        +	docElem = document.documentElement;
        +	documentIsHTML = !isXML( document );
        +
        +	// Support: IE 9-11, Edge
        +	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
        +	if ( preferredDoc !== document &&
        +		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
        +
        +		// Support: IE 11, Edge
        +		if ( subWindow.addEventListener ) {
        +			subWindow.addEventListener( "unload", unloadHandler, false );
        +
        +		// Support: IE 9 - 10 only
        +		} else if ( subWindow.attachEvent ) {
        +			subWindow.attachEvent( "onunload", unloadHandler );
        +		}
        +	}
        +
        +	/* Attributes
        +	---------------------------------------------------------------------- */
        +
        +	// Support: IE<8
        +	// Verify that getAttribute really returns attributes and not properties
        +	// (excepting IE8 booleans)
        +	support.attributes = assert(function( el ) {
        +		el.className = "i";
        +		return !el.getAttribute("className");
        +	});
        +
        +	/* getElement(s)By*
        +	---------------------------------------------------------------------- */
        +
        +	// Check if getElementsByTagName("*") returns only elements
        +	support.getElementsByTagName = assert(function( el ) {
        +		el.appendChild( document.createComment("") );
        +		return !el.getElementsByTagName("*").length;
        +	});
        +
        +	// Support: IE<9
        +	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
        +
        +	// Support: IE<10
        +	// Check if getElementById returns elements by name
        +	// The broken getElementById methods don't pick up programmatically-set names,
        +	// so use a roundabout getElementsByName test
        +	support.getById = assert(function( el ) {
        +		docElem.appendChild( el ).id = expando;
        +		return !document.getElementsByName || !document.getElementsByName( expando ).length;
        +	});
        +
        +	// ID filter and find
        +	if ( support.getById ) {
        +		Expr.filter["ID"] = function( id ) {
        +			var attrId = id.replace( runescape, funescape );
        +			return function( elem ) {
        +				return elem.getAttribute("id") === attrId;
        +			};
        +		};
        +		Expr.find["ID"] = function( id, context ) {
        +			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
        +				var elem = context.getElementById( id );
        +				return elem ? [ elem ] : [];
        +			}
        +		};
        +	} else {
        +		Expr.filter["ID"] =  function( id ) {
        +			var attrId = id.replace( runescape, funescape );
        +			return function( elem ) {
        +				var node = typeof elem.getAttributeNode !== "undefined" &&
        +					elem.getAttributeNode("id");
        +				return node && node.value === attrId;
        +			};
        +		};
        +
        +		// Support: IE 6 - 7 only
        +		// getElementById is not reliable as a find shortcut
        +		Expr.find["ID"] = function( id, context ) {
        +			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
        +				var node, i, elems,
        +					elem = context.getElementById( id );
        +
        +				if ( elem ) {
        +
        +					// Verify the id attribute
        +					node = elem.getAttributeNode("id");
        +					if ( node && node.value === id ) {
        +						return [ elem ];
        +					}
        +
        +					// Fall back on getElementsByName
        +					elems = context.getElementsByName( id );
        +					i = 0;
        +					while ( (elem = elems[i++]) ) {
        +						node = elem.getAttributeNode("id");
        +						if ( node && node.value === id ) {
        +							return [ elem ];
        +						}
        +					}
        +				}
        +
        +				return [];
        +			}
        +		};
        +	}
        +
        +	// Tag
        +	Expr.find["TAG"] = support.getElementsByTagName ?
        +		function( tag, context ) {
        +			if ( typeof context.getElementsByTagName !== "undefined" ) {
        +				return context.getElementsByTagName( tag );
        +
        +			// DocumentFragment nodes don't have gEBTN
        +			} else if ( support.qsa ) {
        +				return context.querySelectorAll( tag );
        +			}
        +		} :
        +
        +		function( tag, context ) {
        +			var elem,
        +				tmp = [],
        +				i = 0,
        +				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
        +				results = context.getElementsByTagName( tag );
        +
        +			// Filter out possible comments
        +			if ( tag === "*" ) {
        +				while ( (elem = results[i++]) ) {
        +					if ( elem.nodeType === 1 ) {
        +						tmp.push( elem );
        +					}
        +				}
        +
        +				return tmp;
        +			}
        +			return results;
        +		};
        +
        +	// Class
        +	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
        +		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
        +			return context.getElementsByClassName( className );
        +		}
        +	};
        +
        +	/* QSA/matchesSelector
        +	---------------------------------------------------------------------- */
        +
        +	// QSA and matchesSelector support
        +
        +	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
        +	rbuggyMatches = [];
        +
        +	// qSa(:focus) reports false when true (Chrome 21)
        +	// We allow this because of a bug in IE8/9 that throws an error
        +	// whenever `document.activeElement` is accessed on an iframe
        +	// So, we allow :focus to pass through QSA all the time to avoid the IE error
        +	// See https://bugs.jquery.com/ticket/13378
        +	rbuggyQSA = [];
        +
        +	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
        +		// Build QSA regex
        +		// Regex strategy adopted from Diego Perini
        +		assert(function( el ) {
        +			// Select is set to empty string on purpose
        +			// This is to test IE's treatment of not explicitly
        +			// setting a boolean content attribute,
        +			// since its presence should be enough
        +			// https://bugs.jquery.com/ticket/12359
        +			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
        +				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
        +				"<option selected=''></option></select>";
        +
        +			// Support: IE8, Opera 11-12.16
        +			// Nothing should be selected when empty strings follow ^= or $= or *=
        +			// The test attribute must be unknown in Opera but "safe" for WinRT
        +			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
        +			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
        +				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
        +			}
        +
        +			// Support: IE8
        +			// Boolean attributes and "value" are not treated correctly
        +			if ( !el.querySelectorAll("[selected]").length ) {
        +				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
        +			}
        +
        +			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
        +			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
        +				rbuggyQSA.push("~=");
        +			}
        +
        +			// Webkit/Opera - :checked should return selected option elements
        +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +			// IE8 throws error here and will not see later tests
        +			if ( !el.querySelectorAll(":checked").length ) {
        +				rbuggyQSA.push(":checked");
        +			}
        +
        +			// Support: Safari 8+, iOS 8+
        +			// https://bugs.webkit.org/show_bug.cgi?id=136851
        +			// In-page `selector#id sibling-combinator selector` fails
        +			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
        +				rbuggyQSA.push(".#.+[+~]");
        +			}
        +		});
        +
        +		assert(function( el ) {
        +			el.innerHTML = "<a href='' disabled='disabled'></a>" +
        +				"<select disabled='disabled'><option/></select>";
        +
        +			// Support: Windows 8 Native Apps
        +			// The type and name attributes are restricted during .innerHTML assignment
        +			var input = document.createElement("input");
        +			input.setAttribute( "type", "hidden" );
        +			el.appendChild( input ).setAttribute( "name", "D" );
        +
        +			// Support: IE8
        +			// Enforce case-sensitivity of name attribute
        +			if ( el.querySelectorAll("[name=d]").length ) {
        +				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
        +			}
        +
        +			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
        +			// IE8 throws error here and will not see later tests
        +			if ( el.querySelectorAll(":enabled").length !== 2 ) {
        +				rbuggyQSA.push( ":enabled", ":disabled" );
        +			}
        +
        +			// Support: IE9-11+
        +			// IE's :disabled selector does not pick up the children of disabled fieldsets
        +			docElem.appendChild( el ).disabled = true;
        +			if ( el.querySelectorAll(":disabled").length !== 2 ) {
        +				rbuggyQSA.push( ":enabled", ":disabled" );
        +			}
        +
        +			// Opera 10-11 does not throw on post-comma invalid pseudos
        +			el.querySelectorAll("*,:x");
        +			rbuggyQSA.push(",.*:");
        +		});
        +	}
        +
        +	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
        +		docElem.webkitMatchesSelector ||
        +		docElem.mozMatchesSelector ||
        +		docElem.oMatchesSelector ||
        +		docElem.msMatchesSelector) )) ) {
        +
        +		assert(function( el ) {
        +			// Check to see if it's possible to do matchesSelector
        +			// on a disconnected node (IE 9)
        +			support.disconnectedMatch = matches.call( el, "*" );
        +
        +			// This should fail with an exception
        +			// Gecko does not error, returns false instead
        +			matches.call( el, "[s!='']:x" );
        +			rbuggyMatches.push( "!=", pseudos );
        +		});
        +	}
        +
        +	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
        +	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
        +
        +	/* Contains
        +	---------------------------------------------------------------------- */
        +	hasCompare = rnative.test( docElem.compareDocumentPosition );
        +
        +	// Element contains another
        +	// Purposefully self-exclusive
        +	// As in, an element does not contain itself
        +	contains = hasCompare || rnative.test( docElem.contains ) ?
        +		function( a, b ) {
        +			var adown = a.nodeType === 9 ? a.documentElement : a,
        +				bup = b && b.parentNode;
        +			return a === bup || !!( bup && bup.nodeType === 1 && (
        +				adown.contains ?
        +					adown.contains( bup ) :
        +					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
        +			));
        +		} :
        +		function( a, b ) {
        +			if ( b ) {
        +				while ( (b = b.parentNode) ) {
        +					if ( b === a ) {
        +						return true;
        +					}
        +				}
        +			}
        +			return false;
        +		};
        +
        +	/* Sorting
        +	---------------------------------------------------------------------- */
        +
        +	// Document order sorting
        +	sortOrder = hasCompare ?
        +	function( a, b ) {
        +
        +		// Flag for duplicate removal
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +		}
        +
        +		// Sort on method existence if only one input has compareDocumentPosition
        +		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
        +		if ( compare ) {
        +			return compare;
        +		}
        +
        +		// Calculate position if both inputs belong to the same document
        +		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
        +			a.compareDocumentPosition( b ) :
        +
        +			// Otherwise we know they are disconnected
        +			1;
        +
        +		// Disconnected nodes
        +		if ( compare & 1 ||
        +			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
        +
        +			// Choose the first element that is related to our preferred document
        +			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
        +				return -1;
        +			}
        +			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
        +				return 1;
        +			}
        +
        +			// Maintain original order
        +			return sortInput ?
        +				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
        +				0;
        +		}
        +
        +		return compare & 4 ? -1 : 1;
        +	} :
        +	function( a, b ) {
        +		// Exit early if the nodes are identical
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +		}
        +
        +		var cur,
        +			i = 0,
        +			aup = a.parentNode,
        +			bup = b.parentNode,
        +			ap = [ a ],
        +			bp = [ b ];
        +
        +		// Parentless nodes are either documents or disconnected
        +		if ( !aup || !bup ) {
        +			return a === document ? -1 :
        +				b === document ? 1 :
        +				aup ? -1 :
        +				bup ? 1 :
        +				sortInput ?
        +				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
        +				0;
        +
        +		// If the nodes are siblings, we can do a quick check
        +		} else if ( aup === bup ) {
        +			return siblingCheck( a, b );
        +		}
        +
        +		// Otherwise we need full lists of their ancestors for comparison
        +		cur = a;
        +		while ( (cur = cur.parentNode) ) {
        +			ap.unshift( cur );
        +		}
        +		cur = b;
        +		while ( (cur = cur.parentNode) ) {
        +			bp.unshift( cur );
        +		}
        +
        +		// Walk down the tree looking for a discrepancy
        +		while ( ap[i] === bp[i] ) {
        +			i++;
        +		}
        +
        +		return i ?
        +			// Do a sibling check if the nodes have a common ancestor
        +			siblingCheck( ap[i], bp[i] ) :
        +
        +			// Otherwise nodes in our document sort first
        +			ap[i] === preferredDoc ? -1 :
        +			bp[i] === preferredDoc ? 1 :
        +			0;
        +	};
        +
        +	return document;
        +};
        +
        +Sizzle.matches = function( expr, elements ) {
        +	return Sizzle( expr, null, null, elements );
        +};
        +
        +Sizzle.matchesSelector = function( elem, expr ) {
        +	// Set document vars if needed
        +	if ( ( elem.ownerDocument || elem ) !== document ) {
        +		setDocument( elem );
        +	}
        +
        +	// Make sure that attribute selectors are quoted
        +	expr = expr.replace( rattributeQuotes, "='$1']" );
        +
        +	if ( support.matchesSelector && documentIsHTML &&
        +		!compilerCache[ expr + " " ] &&
        +		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
        +		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
        +
        +		try {
        +			var ret = matches.call( elem, expr );
        +
        +			// IE 9's matchesSelector returns false on disconnected nodes
        +			if ( ret || support.disconnectedMatch ||
        +					// As well, disconnected nodes are said to be in a document
        +					// fragment in IE 9
        +					elem.document && elem.document.nodeType !== 11 ) {
        +				return ret;
        +			}
        +		} catch (e) {}
        +	}
        +
        +	return Sizzle( expr, document, null, [ elem ] ).length > 0;
        +};
        +
        +Sizzle.contains = function( context, elem ) {
        +	// Set document vars if needed
        +	if ( ( context.ownerDocument || context ) !== document ) {
        +		setDocument( context );
        +	}
        +	return contains( context, elem );
        +};
        +
        +Sizzle.attr = function( elem, name ) {
        +	// Set document vars if needed
        +	if ( ( elem.ownerDocument || elem ) !== document ) {
        +		setDocument( elem );
        +	}
        +
        +	var fn = Expr.attrHandle[ name.toLowerCase() ],
        +		// Don't get fooled by Object.prototype properties (jQuery #13807)
        +		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
        +			fn( elem, name, !documentIsHTML ) :
        +			undefined;
        +
        +	return val !== undefined ?
        +		val :
        +		support.attributes || !documentIsHTML ?
        +			elem.getAttribute( name ) :
        +			(val = elem.getAttributeNode(name)) && val.specified ?
        +				val.value :
        +				null;
        +};
        +
        +Sizzle.escape = function( sel ) {
        +	return (sel + "").replace( rcssescape, fcssescape );
        +};
        +
        +Sizzle.error = function( msg ) {
        +	throw new Error( "Syntax error, unrecognized expression: " + msg );
        +};
        +
        +/**
        + * Document sorting and removing duplicates
        + * @param {ArrayLike} results
        + */
        +Sizzle.uniqueSort = function( results ) {
        +	var elem,
        +		duplicates = [],
        +		j = 0,
        +		i = 0;
        +
        +	// Unless we *know* we can detect duplicates, assume their presence
        +	hasDuplicate = !support.detectDuplicates;
        +	sortInput = !support.sortStable && results.slice( 0 );
        +	results.sort( sortOrder );
        +
        +	if ( hasDuplicate ) {
        +		while ( (elem = results[i++]) ) {
        +			if ( elem === results[ i ] ) {
        +				j = duplicates.push( i );
        +			}
        +		}
        +		while ( j-- ) {
        +			results.splice( duplicates[ j ], 1 );
        +		}
        +	}
        +
        +	// Clear input after sorting to release objects
        +	// See https://github.com/jquery/sizzle/pull/225
        +	sortInput = null;
        +
        +	return results;
        +};
        +
        +/**
        + * Utility function for retrieving the text value of an array of DOM nodes
        + * @param {Array|Element} elem
        + */
        +getText = Sizzle.getText = function( elem ) {
        +	var node,
        +		ret = "",
        +		i = 0,
        +		nodeType = elem.nodeType;
        +
        +	if ( !nodeType ) {
        +		// If no nodeType, this is expected to be an array
        +		while ( (node = elem[i++]) ) {
        +			// Do not traverse comment nodes
        +			ret += getText( node );
        +		}
        +	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +		// Use textContent for elements
        +		// innerText usage removed for consistency of new lines (jQuery #11153)
        +		if ( typeof elem.textContent === "string" ) {
        +			return elem.textContent;
        +		} else {
        +			// Traverse its children
        +			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +				ret += getText( elem );
        +			}
        +		}
        +	} else if ( nodeType === 3 || nodeType === 4 ) {
        +		return elem.nodeValue;
        +	}
        +	// Do not include comment or processing instruction nodes
        +
        +	return ret;
        +};
        +
        +Expr = Sizzle.selectors = {
        +
        +	// Can be adjusted by the user
        +	cacheLength: 50,
        +
        +	createPseudo: markFunction,
        +
        +	match: matchExpr,
        +
        +	attrHandle: {},
        +
        +	find: {},
        +
        +	relative: {
        +		">": { dir: "parentNode", first: true },
        +		" ": { dir: "parentNode" },
        +		"+": { dir: "previousSibling", first: true },
        +		"~": { dir: "previousSibling" }
        +	},
        +
        +	preFilter: {
        +		"ATTR": function( match ) {
        +			match[1] = match[1].replace( runescape, funescape );
        +
        +			// Move the given value to match[3] whether quoted or unquoted
        +			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
        +
        +			if ( match[2] === "~=" ) {
        +				match[3] = " " + match[3] + " ";
        +			}
        +
        +			return match.slice( 0, 4 );
        +		},
        +
        +		"CHILD": function( match ) {
        +			/* matches from matchExpr["CHILD"]
        +				1 type (only|nth|...)
        +				2 what (child|of-type)
        +				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
        +				4 xn-component of xn+y argument ([+-]?\d*n|)
        +				5 sign of xn-component
        +				6 x of xn-component
        +				7 sign of y-component
        +				8 y of y-component
        +			*/
        +			match[1] = match[1].toLowerCase();
        +
        +			if ( match[1].slice( 0, 3 ) === "nth" ) {
        +				// nth-* requires argument
        +				if ( !match[3] ) {
        +					Sizzle.error( match[0] );
        +				}
        +
        +				// numeric x and y parameters for Expr.filter.CHILD
        +				// remember that false/true cast respectively to 0/1
        +				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
        +				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
        +
        +			// other types prohibit arguments
        +			} else if ( match[3] ) {
        +				Sizzle.error( match[0] );
        +			}
        +
        +			return match;
        +		},
        +
        +		"PSEUDO": function( match ) {
        +			var excess,
        +				unquoted = !match[6] && match[2];
        +
        +			if ( matchExpr["CHILD"].test( match[0] ) ) {
        +				return null;
        +			}
        +
        +			// Accept quoted arguments as-is
        +			if ( match[3] ) {
        +				match[2] = match[4] || match[5] || "";
        +
        +			// Strip excess characters from unquoted arguments
        +			} else if ( unquoted && rpseudo.test( unquoted ) &&
        +				// Get excess from tokenize (recursively)
        +				(excess = tokenize( unquoted, true )) &&
        +				// advance to the next closing parenthesis
        +				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
        +
        +				// excess is a negative index
        +				match[0] = match[0].slice( 0, excess );
        +				match[2] = unquoted.slice( 0, excess );
        +			}
        +
        +			// Return only captures needed by the pseudo filter method (type and argument)
        +			return match.slice( 0, 3 );
        +		}
        +	},
        +
        +	filter: {
        +
        +		"TAG": function( nodeNameSelector ) {
        +			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
        +			return nodeNameSelector === "*" ?
        +				function() { return true; } :
        +				function( elem ) {
        +					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
        +				};
        +		},
        +
        +		"CLASS": function( className ) {
        +			var pattern = classCache[ className + " " ];
        +
        +			return pattern ||
        +				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
        +				classCache( className, function( elem ) {
        +					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
        +				});
        +		},
        +
        +		"ATTR": function( name, operator, check ) {
        +			return function( elem ) {
        +				var result = Sizzle.attr( elem, name );
        +
        +				if ( result == null ) {
        +					return operator === "!=";
        +				}
        +				if ( !operator ) {
        +					return true;
        +				}
        +
        +				result += "";
        +
        +				return operator === "=" ? result === check :
        +					operator === "!=" ? result !== check :
        +					operator === "^=" ? check && result.indexOf( check ) === 0 :
        +					operator === "*=" ? check && result.indexOf( check ) > -1 :
        +					operator === "$=" ? check && result.slice( -check.length ) === check :
        +					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
        +					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
        +					false;
        +			};
        +		},
        +
        +		"CHILD": function( type, what, argument, first, last ) {
        +			var simple = type.slice( 0, 3 ) !== "nth",
        +				forward = type.slice( -4 ) !== "last",
        +				ofType = what === "of-type";
        +
        +			return first === 1 && last === 0 ?
        +
        +				// Shortcut for :nth-*(n)
        +				function( elem ) {
        +					return !!elem.parentNode;
        +				} :
        +
        +				function( elem, context, xml ) {
        +					var cache, uniqueCache, outerCache, node, nodeIndex, start,
        +						dir = simple !== forward ? "nextSibling" : "previousSibling",
        +						parent = elem.parentNode,
        +						name = ofType && elem.nodeName.toLowerCase(),
        +						useCache = !xml && !ofType,
        +						diff = false;
        +
        +					if ( parent ) {
        +
        +						// :(first|last|only)-(child|of-type)
        +						if ( simple ) {
        +							while ( dir ) {
        +								node = elem;
        +								while ( (node = node[ dir ]) ) {
        +									if ( ofType ?
        +										node.nodeName.toLowerCase() === name :
        +										node.nodeType === 1 ) {
        +
        +										return false;
        +									}
        +								}
        +								// Reverse direction for :only-* (if we haven't yet done so)
        +								start = dir = type === "only" && !start && "nextSibling";
        +							}
        +							return true;
        +						}
        +
        +						start = [ forward ? parent.firstChild : parent.lastChild ];
        +
        +						// non-xml :nth-child(...) stores cache data on `parent`
        +						if ( forward && useCache ) {
        +
        +							// Seek `elem` from a previously-cached index
        +
        +							// ...in a gzip-friendly way
        +							node = parent;
        +							outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +							// Support: IE <9 only
        +							// Defend against cloned attroperties (jQuery gh-1709)
        +							uniqueCache = outerCache[ node.uniqueID ] ||
        +								(outerCache[ node.uniqueID ] = {});
        +
        +							cache = uniqueCache[ type ] || [];
        +							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
        +							diff = nodeIndex && cache[ 2 ];
        +							node = nodeIndex && parent.childNodes[ nodeIndex ];
        +
        +							while ( (node = ++nodeIndex && node && node[ dir ] ||
        +
        +								// Fallback to seeking `elem` from the start
        +								(diff = nodeIndex = 0) || start.pop()) ) {
        +
        +								// When found, cache indexes on `parent` and break
        +								if ( node.nodeType === 1 && ++diff && node === elem ) {
        +									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
        +									break;
        +								}
        +							}
        +
        +						} else {
        +							// Use previously-cached element index if available
        +							if ( useCache ) {
        +								// ...in a gzip-friendly way
        +								node = elem;
        +								outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +								// Support: IE <9 only
        +								// Defend against cloned attroperties (jQuery gh-1709)
        +								uniqueCache = outerCache[ node.uniqueID ] ||
        +									(outerCache[ node.uniqueID ] = {});
        +
        +								cache = uniqueCache[ type ] || [];
        +								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
        +								diff = nodeIndex;
        +							}
        +
        +							// xml :nth-child(...)
        +							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
        +							if ( diff === false ) {
        +								// Use the same loop as above to seek `elem` from the start
        +								while ( (node = ++nodeIndex && node && node[ dir ] ||
        +									(diff = nodeIndex = 0) || start.pop()) ) {
        +
        +									if ( ( ofType ?
        +										node.nodeName.toLowerCase() === name :
        +										node.nodeType === 1 ) &&
        +										++diff ) {
        +
        +										// Cache the index of each encountered element
        +										if ( useCache ) {
        +											outerCache = node[ expando ] || (node[ expando ] = {});
        +
        +											// Support: IE <9 only
        +											// Defend against cloned attroperties (jQuery gh-1709)
        +											uniqueCache = outerCache[ node.uniqueID ] ||
        +												(outerCache[ node.uniqueID ] = {});
        +
        +											uniqueCache[ type ] = [ dirruns, diff ];
        +										}
        +
        +										if ( node === elem ) {
        +											break;
        +										}
        +									}
        +								}
        +							}
        +						}
        +
        +						// Incorporate the offset, then check against cycle size
        +						diff -= last;
        +						return diff === first || ( diff % first === 0 && diff / first >= 0 );
        +					}
        +				};
        +		},
        +
        +		"PSEUDO": function( pseudo, argument ) {
        +			// pseudo-class names are case-insensitive
        +			// http://www.w3.org/TR/selectors/#pseudo-classes
        +			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
        +			// Remember that setFilters inherits from pseudos
        +			var args,
        +				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
        +					Sizzle.error( "unsupported pseudo: " + pseudo );
        +
        +			// The user may use createPseudo to indicate that
        +			// arguments are needed to create the filter function
        +			// just as Sizzle does
        +			if ( fn[ expando ] ) {
        +				return fn( argument );
        +			}
        +
        +			// But maintain support for old signatures
        +			if ( fn.length > 1 ) {
        +				args = [ pseudo, pseudo, "", argument ];
        +				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
        +					markFunction(function( seed, matches ) {
        +						var idx,
        +							matched = fn( seed, argument ),
        +							i = matched.length;
        +						while ( i-- ) {
        +							idx = indexOf( seed, matched[i] );
        +							seed[ idx ] = !( matches[ idx ] = matched[i] );
        +						}
        +					}) :
        +					function( elem ) {
        +						return fn( elem, 0, args );
        +					};
        +			}
        +
        +			return fn;
        +		}
        +	},
        +
        +	pseudos: {
        +		// Potentially complex pseudos
        +		"not": markFunction(function( selector ) {
        +			// Trim the selector passed to compile
        +			// to avoid treating leading and trailing
        +			// spaces as combinators
        +			var input = [],
        +				results = [],
        +				matcher = compile( selector.replace( rtrim, "$1" ) );
        +
        +			return matcher[ expando ] ?
        +				markFunction(function( seed, matches, context, xml ) {
        +					var elem,
        +						unmatched = matcher( seed, null, xml, [] ),
        +						i = seed.length;
        +
        +					// Match elements unmatched by `matcher`
        +					while ( i-- ) {
        +						if ( (elem = unmatched[i]) ) {
        +							seed[i] = !(matches[i] = elem);
        +						}
        +					}
        +				}) :
        +				function( elem, context, xml ) {
        +					input[0] = elem;
        +					matcher( input, null, xml, results );
        +					// Don't keep the element (issue #299)
        +					input[0] = null;
        +					return !results.pop();
        +				};
        +		}),
        +
        +		"has": markFunction(function( selector ) {
        +			return function( elem ) {
        +				return Sizzle( selector, elem ).length > 0;
        +			};
        +		}),
        +
        +		"contains": markFunction(function( text ) {
        +			text = text.replace( runescape, funescape );
        +			return function( elem ) {
        +				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
        +			};
        +		}),
        +
        +		// "Whether an element is represented by a :lang() selector
        +		// is based solely on the element's language value
        +		// being equal to the identifier C,
        +		// or beginning with the identifier C immediately followed by "-".
        +		// The matching of C against the element's language value is performed case-insensitively.
        +		// The identifier C does not have to be a valid language name."
        +		// http://www.w3.org/TR/selectors/#lang-pseudo
        +		"lang": markFunction( function( lang ) {
        +			// lang value must be a valid identifier
        +			if ( !ridentifier.test(lang || "") ) {
        +				Sizzle.error( "unsupported lang: " + lang );
        +			}
        +			lang = lang.replace( runescape, funescape ).toLowerCase();
        +			return function( elem ) {
        +				var elemLang;
        +				do {
        +					if ( (elemLang = documentIsHTML ?
        +						elem.lang :
        +						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
        +
        +						elemLang = elemLang.toLowerCase();
        +						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
        +					}
        +				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
        +				return false;
        +			};
        +		}),
        +
        +		// Miscellaneous
        +		"target": function( elem ) {
        +			var hash = window.location && window.location.hash;
        +			return hash && hash.slice( 1 ) === elem.id;
        +		},
        +
        +		"root": function( elem ) {
        +			return elem === docElem;
        +		},
        +
        +		"focus": function( elem ) {
        +			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
        +		},
        +
        +		// Boolean properties
        +		"enabled": createDisabledPseudo( false ),
        +		"disabled": createDisabledPseudo( true ),
        +
        +		"checked": function( elem ) {
        +			// In CSS3, :checked should return both checked and selected elements
        +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +			var nodeName = elem.nodeName.toLowerCase();
        +			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
        +		},
        +
        +		"selected": function( elem ) {
        +			// Accessing this property makes selected-by-default
        +			// options in Safari work properly
        +			if ( elem.parentNode ) {
        +				elem.parentNode.selectedIndex;
        +			}
        +
        +			return elem.selected === true;
        +		},
        +
        +		// Contents
        +		"empty": function( elem ) {
        +			// http://www.w3.org/TR/selectors/#empty-pseudo
        +			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
        +			//   but not by others (comment: 8; processing instruction: 7; etc.)
        +			// nodeType < 6 works because attributes (2) do not appear as children
        +			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +				if ( elem.nodeType < 6 ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		},
        +
        +		"parent": function( elem ) {
        +			return !Expr.pseudos["empty"]( elem );
        +		},
        +
        +		// Element/input types
        +		"header": function( elem ) {
        +			return rheader.test( elem.nodeName );
        +		},
        +
        +		"input": function( elem ) {
        +			return rinputs.test( elem.nodeName );
        +		},
        +
        +		"button": function( elem ) {
        +			var name = elem.nodeName.toLowerCase();
        +			return name === "input" && elem.type === "button" || name === "button";
        +		},
        +
        +		"text": function( elem ) {
        +			var attr;
        +			return elem.nodeName.toLowerCase() === "input" &&
        +				elem.type === "text" &&
        +
        +				// Support: IE<8
        +				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
        +				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
        +		},
        +
        +		// Position-in-collection
        +		"first": createPositionalPseudo(function() {
        +			return [ 0 ];
        +		}),
        +
        +		"last": createPositionalPseudo(function( matchIndexes, length ) {
        +			return [ length - 1 ];
        +		}),
        +
        +		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			return [ argument < 0 ? argument + length : argument ];
        +		}),
        +
        +		"even": createPositionalPseudo(function( matchIndexes, length ) {
        +			var i = 0;
        +			for ( ; i < length; i += 2 ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"odd": createPositionalPseudo(function( matchIndexes, length ) {
        +			var i = 1;
        +			for ( ; i < length; i += 2 ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			var i = argument < 0 ? argument + length : argument;
        +			for ( ; --i >= 0; ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		}),
        +
        +		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +			var i = argument < 0 ? argument + length : argument;
        +			for ( ; ++i < length; ) {
        +				matchIndexes.push( i );
        +			}
        +			return matchIndexes;
        +		})
        +	}
        +};
        +
        +Expr.pseudos["nth"] = Expr.pseudos["eq"];
        +
        +// Add button/input type pseudos
        +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
        +	Expr.pseudos[ i ] = createInputPseudo( i );
        +}
        +for ( i in { submit: true, reset: true } ) {
        +	Expr.pseudos[ i ] = createButtonPseudo( i );
        +}
        +
        +// Easy API for creating new setFilters
        +function setFilters() {}
        +setFilters.prototype = Expr.filters = Expr.pseudos;
        +Expr.setFilters = new setFilters();
        +
        +tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
        +	var matched, match, tokens, type,
        +		soFar, groups, preFilters,
        +		cached = tokenCache[ selector + " " ];
        +
        +	if ( cached ) {
        +		return parseOnly ? 0 : cached.slice( 0 );
        +	}
        +
        +	soFar = selector;
        +	groups = [];
        +	preFilters = Expr.preFilter;
        +
        +	while ( soFar ) {
        +
        +		// Comma and first run
        +		if ( !matched || (match = rcomma.exec( soFar )) ) {
        +			if ( match ) {
        +				// Don't consume trailing commas as valid
        +				soFar = soFar.slice( match[0].length ) || soFar;
        +			}
        +			groups.push( (tokens = []) );
        +		}
        +
        +		matched = false;
        +
        +		// Combinators
        +		if ( (match = rcombinators.exec( soFar )) ) {
        +			matched = match.shift();
        +			tokens.push({
        +				value: matched,
        +				// Cast descendant combinators to space
        +				type: match[0].replace( rtrim, " " )
        +			});
        +			soFar = soFar.slice( matched.length );
        +		}
        +
        +		// Filters
        +		for ( type in Expr.filter ) {
        +			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
        +				(match = preFilters[ type ]( match ))) ) {
        +				matched = match.shift();
        +				tokens.push({
        +					value: matched,
        +					type: type,
        +					matches: match
        +				});
        +				soFar = soFar.slice( matched.length );
        +			}
        +		}
        +
        +		if ( !matched ) {
        +			break;
        +		}
        +	}
        +
        +	// Return the length of the invalid excess
        +	// if we're just parsing
        +	// Otherwise, throw an error or return tokens
        +	return parseOnly ?
        +		soFar.length :
        +		soFar ?
        +			Sizzle.error( selector ) :
        +			// Cache the tokens
        +			tokenCache( selector, groups ).slice( 0 );
        +};
        +
        +function toSelector( tokens ) {
        +	var i = 0,
        +		len = tokens.length,
        +		selector = "";
        +	for ( ; i < len; i++ ) {
        +		selector += tokens[i].value;
        +	}
        +	return selector;
        +}
        +
        +function addCombinator( matcher, combinator, base ) {
        +	var dir = combinator.dir,
        +		skip = combinator.next,
        +		key = skip || dir,
        +		checkNonElements = base && key === "parentNode",
        +		doneName = done++;
        +
        +	return combinator.first ?
        +		// Check against closest ancestor/preceding element
        +		function( elem, context, xml ) {
        +			while ( (elem = elem[ dir ]) ) {
        +				if ( elem.nodeType === 1 || checkNonElements ) {
        +					return matcher( elem, context, xml );
        +				}
        +			}
        +			return false;
        +		} :
        +
        +		// Check against all ancestor/preceding elements
        +		function( elem, context, xml ) {
        +			var oldCache, uniqueCache, outerCache,
        +				newCache = [ dirruns, doneName ];
        +
        +			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
        +			if ( xml ) {
        +				while ( (elem = elem[ dir ]) ) {
        +					if ( elem.nodeType === 1 || checkNonElements ) {
        +						if ( matcher( elem, context, xml ) ) {
        +							return true;
        +						}
        +					}
        +				}
        +			} else {
        +				while ( (elem = elem[ dir ]) ) {
        +					if ( elem.nodeType === 1 || checkNonElements ) {
        +						outerCache = elem[ expando ] || (elem[ expando ] = {});
        +
        +						// Support: IE <9 only
        +						// Defend against cloned attroperties (jQuery gh-1709)
        +						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
        +
        +						if ( skip && skip === elem.nodeName.toLowerCase() ) {
        +							elem = elem[ dir ] || elem;
        +						} else if ( (oldCache = uniqueCache[ key ]) &&
        +							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
        +
        +							// Assign to newCache so results back-propagate to previous elements
        +							return (newCache[ 2 ] = oldCache[ 2 ]);
        +						} else {
        +							// Reuse newcache so results back-propagate to previous elements
        +							uniqueCache[ key ] = newCache;
        +
        +							// A match means we're done; a fail means we have to keep checking
        +							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
        +								return true;
        +							}
        +						}
        +					}
        +				}
        +			}
        +			return false;
        +		};
        +}
        +
        +function elementMatcher( matchers ) {
        +	return matchers.length > 1 ?
        +		function( elem, context, xml ) {
        +			var i = matchers.length;
        +			while ( i-- ) {
        +				if ( !matchers[i]( elem, context, xml ) ) {
        +					return false;
        +				}
        +			}
        +			return true;
        +		} :
        +		matchers[0];
        +}
        +
        +function multipleContexts( selector, contexts, results ) {
        +	var i = 0,
        +		len = contexts.length;
        +	for ( ; i < len; i++ ) {
        +		Sizzle( selector, contexts[i], results );
        +	}
        +	return results;
        +}
        +
        +function condense( unmatched, map, filter, context, xml ) {
        +	var elem,
        +		newUnmatched = [],
        +		i = 0,
        +		len = unmatched.length,
        +		mapped = map != null;
        +
        +	for ( ; i < len; i++ ) {
        +		if ( (elem = unmatched[i]) ) {
        +			if ( !filter || filter( elem, context, xml ) ) {
        +				newUnmatched.push( elem );
        +				if ( mapped ) {
        +					map.push( i );
        +				}
        +			}
        +		}
        +	}
        +
        +	return newUnmatched;
        +}
        +
        +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
        +	if ( postFilter && !postFilter[ expando ] ) {
        +		postFilter = setMatcher( postFilter );
        +	}
        +	if ( postFinder && !postFinder[ expando ] ) {
        +		postFinder = setMatcher( postFinder, postSelector );
        +	}
        +	return markFunction(function( seed, results, context, xml ) {
        +		var temp, i, elem,
        +			preMap = [],
        +			postMap = [],
        +			preexisting = results.length,
        +
        +			// Get initial elements from seed or context
        +			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
        +
        +			// Prefilter to get matcher input, preserving a map for seed-results synchronization
        +			matcherIn = preFilter && ( seed || !selector ) ?
        +				condense( elems, preMap, preFilter, context, xml ) :
        +				elems,
        +
        +			matcherOut = matcher ?
        +				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
        +				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
        +
        +					// ...intermediate processing is necessary
        +					[] :
        +
        +					// ...otherwise use results directly
        +					results :
        +				matcherIn;
        +
        +		// Find primary matches
        +		if ( matcher ) {
        +			matcher( matcherIn, matcherOut, context, xml );
        +		}
        +
        +		// Apply postFilter
        +		if ( postFilter ) {
        +			temp = condense( matcherOut, postMap );
        +			postFilter( temp, [], context, xml );
        +
        +			// Un-match failing elements by moving them back to matcherIn
        +			i = temp.length;
        +			while ( i-- ) {
        +				if ( (elem = temp[i]) ) {
        +					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
        +				}
        +			}
        +		}
        +
        +		if ( seed ) {
        +			if ( postFinder || preFilter ) {
        +				if ( postFinder ) {
        +					// Get the final matcherOut by condensing this intermediate into postFinder contexts
        +					temp = [];
        +					i = matcherOut.length;
        +					while ( i-- ) {
        +						if ( (elem = matcherOut[i]) ) {
        +							// Restore matcherIn since elem is not yet a final match
        +							temp.push( (matcherIn[i] = elem) );
        +						}
        +					}
        +					postFinder( null, (matcherOut = []), temp, xml );
        +				}
        +
        +				// Move matched elements from seed to results to keep them synchronized
        +				i = matcherOut.length;
        +				while ( i-- ) {
        +					if ( (elem = matcherOut[i]) &&
        +						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
        +
        +						seed[temp] = !(results[temp] = elem);
        +					}
        +				}
        +			}
        +
        +		// Add elements to results, through postFinder if defined
        +		} else {
        +			matcherOut = condense(
        +				matcherOut === results ?
        +					matcherOut.splice( preexisting, matcherOut.length ) :
        +					matcherOut
        +			);
        +			if ( postFinder ) {
        +				postFinder( null, results, matcherOut, xml );
        +			} else {
        +				push.apply( results, matcherOut );
        +			}
        +		}
        +	});
        +}
        +
        +function matcherFromTokens( tokens ) {
        +	var checkContext, matcher, j,
        +		len = tokens.length,
        +		leadingRelative = Expr.relative[ tokens[0].type ],
        +		implicitRelative = leadingRelative || Expr.relative[" "],
        +		i = leadingRelative ? 1 : 0,
        +
        +		// The foundational matcher ensures that elements are reachable from top-level context(s)
        +		matchContext = addCombinator( function( elem ) {
        +			return elem === checkContext;
        +		}, implicitRelative, true ),
        +		matchAnyContext = addCombinator( function( elem ) {
        +			return indexOf( checkContext, elem ) > -1;
        +		}, implicitRelative, true ),
        +		matchers = [ function( elem, context, xml ) {
        +			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
        +				(checkContext = context).nodeType ?
        +					matchContext( elem, context, xml ) :
        +					matchAnyContext( elem, context, xml ) );
        +			// Avoid hanging onto element (issue #299)
        +			checkContext = null;
        +			return ret;
        +		} ];
        +
        +	for ( ; i < len; i++ ) {
        +		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
        +			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
        +		} else {
        +			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
        +
        +			// Return special upon seeing a positional matcher
        +			if ( matcher[ expando ] ) {
        +				// Find the next relative operator (if any) for proper handling
        +				j = ++i;
        +				for ( ; j < len; j++ ) {
        +					if ( Expr.relative[ tokens[j].type ] ) {
        +						break;
        +					}
        +				}
        +				return setMatcher(
        +					i > 1 && elementMatcher( matchers ),
        +					i > 1 && toSelector(
        +						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
        +						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
        +					).replace( rtrim, "$1" ),
        +					matcher,
        +					i < j && matcherFromTokens( tokens.slice( i, j ) ),
        +					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
        +					j < len && toSelector( tokens )
        +				);
        +			}
        +			matchers.push( matcher );
        +		}
        +	}
        +
        +	return elementMatcher( matchers );
        +}
        +
        +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
        +	var bySet = setMatchers.length > 0,
        +		byElement = elementMatchers.length > 0,
        +		superMatcher = function( seed, context, xml, results, outermost ) {
        +			var elem, j, matcher,
        +				matchedCount = 0,
        +				i = "0",
        +				unmatched = seed && [],
        +				setMatched = [],
        +				contextBackup = outermostContext,
        +				// We must always have either seed elements or outermost context
        +				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
        +				// Use integer dirruns iff this is the outermost matcher
        +				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
        +				len = elems.length;
        +
        +			if ( outermost ) {
        +				outermostContext = context === document || context || outermost;
        +			}
        +
        +			// Add elements passing elementMatchers directly to results
        +			// Support: IE<9, Safari
        +			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
        +			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
        +				if ( byElement && elem ) {
        +					j = 0;
        +					if ( !context && elem.ownerDocument !== document ) {
        +						setDocument( elem );
        +						xml = !documentIsHTML;
        +					}
        +					while ( (matcher = elementMatchers[j++]) ) {
        +						if ( matcher( elem, context || document, xml) ) {
        +							results.push( elem );
        +							break;
        +						}
        +					}
        +					if ( outermost ) {
        +						dirruns = dirrunsUnique;
        +					}
        +				}
        +
        +				// Track unmatched elements for set filters
        +				if ( bySet ) {
        +					// They will have gone through all possible matchers
        +					if ( (elem = !matcher && elem) ) {
        +						matchedCount--;
        +					}
        +
        +					// Lengthen the array for every element, matched or not
        +					if ( seed ) {
        +						unmatched.push( elem );
        +					}
        +				}
        +			}
        +
        +			// `i` is now the count of elements visited above, and adding it to `matchedCount`
        +			// makes the latter nonnegative.
        +			matchedCount += i;
        +
        +			// Apply set filters to unmatched elements
        +			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
        +			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
        +			// no element matchers and no seed.
        +			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
        +			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
        +			// numerically zero.
        +			if ( bySet && i !== matchedCount ) {
        +				j = 0;
        +				while ( (matcher = setMatchers[j++]) ) {
        +					matcher( unmatched, setMatched, context, xml );
        +				}
        +
        +				if ( seed ) {
        +					// Reintegrate element matches to eliminate the need for sorting
        +					if ( matchedCount > 0 ) {
        +						while ( i-- ) {
        +							if ( !(unmatched[i] || setMatched[i]) ) {
        +								setMatched[i] = pop.call( results );
        +							}
        +						}
        +					}
        +
        +					// Discard index placeholder values to get only actual matches
        +					setMatched = condense( setMatched );
        +				}
        +
        +				// Add matches to results
        +				push.apply( results, setMatched );
        +
        +				// Seedless set matches succeeding multiple successful matchers stipulate sorting
        +				if ( outermost && !seed && setMatched.length > 0 &&
        +					( matchedCount + setMatchers.length ) > 1 ) {
        +
        +					Sizzle.uniqueSort( results );
        +				}
        +			}
        +
        +			// Override manipulation of globals by nested matchers
        +			if ( outermost ) {
        +				dirruns = dirrunsUnique;
        +				outermostContext = contextBackup;
        +			}
        +
        +			return unmatched;
        +		};
        +
        +	return bySet ?
        +		markFunction( superMatcher ) :
        +		superMatcher;
        +}
        +
        +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
        +	var i,
        +		setMatchers = [],
        +		elementMatchers = [],
        +		cached = compilerCache[ selector + " " ];
        +
        +	if ( !cached ) {
        +		// Generate a function of recursive functions that can be used to check each element
        +		if ( !match ) {
        +			match = tokenize( selector );
        +		}
        +		i = match.length;
        +		while ( i-- ) {
        +			cached = matcherFromTokens( match[i] );
        +			if ( cached[ expando ] ) {
        +				setMatchers.push( cached );
        +			} else {
        +				elementMatchers.push( cached );
        +			}
        +		}
        +
        +		// Cache the compiled function
        +		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
        +
        +		// Save selector and tokenization
        +		cached.selector = selector;
        +	}
        +	return cached;
        +};
        +
        +/**
        + * A low-level selection function that works with Sizzle's compiled
        + *  selector functions
        + * @param {String|Function} selector A selector or a pre-compiled
        + *  selector function built with Sizzle.compile
        + * @param {Element} context
        + * @param {Array} [results]
        + * @param {Array} [seed] A set of elements to match against
        + */
        +select = Sizzle.select = function( selector, context, results, seed ) {
        +	var i, tokens, token, type, find,
        +		compiled = typeof selector === "function" && selector,
        +		match = !seed && tokenize( (selector = compiled.selector || selector) );
        +
        +	results = results || [];
        +
        +	// Try to minimize operations if there is only one selector in the list and no seed
        +	// (the latter of which guarantees us context)
        +	if ( match.length === 1 ) {
        +
        +		// Reduce context if the leading compound selector is an ID
        +		tokens = match[0] = match[0].slice( 0 );
        +		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
        +				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
        +
        +			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
        +			if ( !context ) {
        +				return results;
        +
        +			// Precompiled matchers will still verify ancestry, so step up a level
        +			} else if ( compiled ) {
        +				context = context.parentNode;
        +			}
        +
        +			selector = selector.slice( tokens.shift().value.length );
        +		}
        +
        +		// Fetch a seed set for right-to-left matching
        +		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
        +		while ( i-- ) {
        +			token = tokens[i];
        +
        +			// Abort if we hit a combinator
        +			if ( Expr.relative[ (type = token.type) ] ) {
        +				break;
        +			}
        +			if ( (find = Expr.find[ type ]) ) {
        +				// Search, expanding context for leading sibling combinators
        +				if ( (seed = find(
        +					token.matches[0].replace( runescape, funescape ),
        +					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
        +				)) ) {
        +
        +					// If seed is empty or no tokens remain, we can return early
        +					tokens.splice( i, 1 );
        +					selector = seed.length && toSelector( tokens );
        +					if ( !selector ) {
        +						push.apply( results, seed );
        +						return results;
        +					}
        +
        +					break;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Compile and execute a filtering function if one is not provided
        +	// Provide `match` to avoid retokenization if we modified the selector above
        +	( compiled || compile( selector, match ) )(
        +		seed,
        +		context,
        +		!documentIsHTML,
        +		results,
        +		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
        +	);
        +	return results;
        +};
        +
        +// One-time assignments
        +
        +// Sort stability
        +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
        +
        +// Support: Chrome 14-35+
        +// Always assume duplicates if they aren't passed to the comparison function
        +support.detectDuplicates = !!hasDuplicate;
        +
        +// Initialize against the default document
        +setDocument();
        +
        +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
        +// Detached nodes confoundingly follow *each other*
        +support.sortDetached = assert(function( el ) {
        +	// Should return 1, but returns 4 (following)
        +	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
        +});
        +
        +// Support: IE<8
        +// Prevent attribute/property "interpolation"
        +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
        +if ( !assert(function( el ) {
        +	el.innerHTML = "<a href='#'></a>";
        +	return el.firstChild.getAttribute("href") === "#" ;
        +}) ) {
        +	addHandle( "type|href|height|width", function( elem, name, isXML ) {
        +		if ( !isXML ) {
        +			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
        +		}
        +	});
        +}
        +
        +// Support: IE<9
        +// Use defaultValue in place of getAttribute("value")
        +if ( !support.attributes || !assert(function( el ) {
        +	el.innerHTML = "<input/>";
        +	el.firstChild.setAttribute( "value", "" );
        +	return el.firstChild.getAttribute( "value" ) === "";
        +}) ) {
        +	addHandle( "value", function( elem, name, isXML ) {
        +		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
        +			return elem.defaultValue;
        +		}
        +	});
        +}
        +
        +// Support: IE<9
        +// Use getAttributeNode to fetch booleans when getAttribute lies
        +if ( !assert(function( el ) {
        +	return el.getAttribute("disabled") == null;
        +}) ) {
        +	addHandle( booleans, function( elem, name, isXML ) {
        +		var val;
        +		if ( !isXML ) {
        +			return elem[ name ] === true ? name.toLowerCase() :
        +					(val = elem.getAttributeNode( name )) && val.specified ?
        +					val.value :
        +				null;
        +		}
        +	});
        +}
        +
        +// EXPOSE
        +var _sizzle = window.Sizzle;
        +
        +Sizzle.noConflict = function() {
        +	if ( window.Sizzle === Sizzle ) {
        +		window.Sizzle = _sizzle;
        +	}
        +
        +	return Sizzle;
        +};
        +
        +if ( typeof define === "function" && define.amd ) {
        +	define(function() { return Sizzle; });
        +// Sizzle requires that there be a global window in Common-JS like environments
        +} else if ( typeof module !== "undefined" && module.exports ) {
        +	module.exports = Sizzle;
        +} else {
        +	window.Sizzle = Sizzle;
        +}
        +// EXPOSE
        +
        +})( window );
        diff --git a/bower_components/jquery/external/sizzle/dist/sizzle.min.js b/bower_components/jquery/external/sizzle/dist/sizzle.min.js
        new file mode 100644
        index 0000000000..be032788b6
        --- /dev/null
        +++ b/bower_components/jquery/external/sizzle/dist/sizzle.min.js
        @@ -0,0 +1,3 @@
        +/*! Sizzle v2.3.3 | (c) jQuery Foundation, Inc. | jquery.org/license */
        +!function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null});var Aa=a.Sizzle;ga.noConflict=function(){return a.Sizzle===ga&&(a.Sizzle=Aa),ga},"function"==typeof define&&define.amd?define(function(){return ga}):"undefined"!=typeof module&&module.exports?module.exports=ga:a.Sizzle=ga}(window);
        +//# sourceMappingURL=sizzle.min.map
        \ No newline at end of file
        diff --git a/bower_components/jquery/external/sizzle/dist/sizzle.min.map b/bower_components/jquery/external/sizzle/dist/sizzle.min.map
        new file mode 100644
        index 0000000000..031c1b78fa
        --- /dev/null
        +++ b/bower_components/jquery/external/sizzle/dist/sizzle.min.map
        @@ -0,0 +1 @@
        +{"version":3,"sources":["sizzle.js"],"names":["window","i","support","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","document","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","expando","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","hasOwn","hasOwnProperty","arr","pop","push_native","push","slice","indexOf","list","elem","len","length","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","toString","unloadHandler","disabledAncestor","addCombinator","disabled","dir","next","apply","call","childNodes","nodeType","e","target","els","j","Sizzle","selector","context","results","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","nodeName","toLowerCase","getAttribute","replace","setAttribute","toSelector","join","testContext","parentNode","querySelectorAll","qsaError","removeAttribute","keys","cache","key","value","cacheLength","shift","markFunction","fn","assert","el","createElement","removeChild","addHandle","attrs","handler","split","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","type","name","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","subWindow","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","elems","tag","tmp","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","ret","attr","val","undefined","specified","escape","sel","error","msg","Error","uniqueSort","duplicates","detectDuplicates","sortStable","sort","splice","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","first"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","last","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","text","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","prototype","filters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","concat","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","Math","random","token","compiled","defaultValue","_sizzle","noConflict","define","amd","module","exports"],"mappings":";CAUA,SAAWA,GAEX,GAAIC,GACHC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EAAU,SAAW,EAAI,GAAIC,MAC7BC,EAAetB,EAAOa,SACtBU,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVpB,GAAe,GAET,GAIRqB,KAAcC,eACdC,KACAC,EAAMD,EAAIC,IACVC,EAAcF,EAAIG,KAClBA,EAAOH,EAAIG,KACXC,EAAQJ,EAAII,MAGZC,EAAU,SAAUC,EAAMC,GAGzB,IAFA,GAAIxC,GAAI,EACPyC,EAAMF,EAAKG,OACJ1C,EAAIyC,EAAKzC,IAChB,GAAKuC,EAAKvC,KAAOwC,EAChB,MAAOxC,EAGT,WAGD2C,EAAW,6HAKXC,EAAa,sBAGbC,EAAa,gCAGbC,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAE9D,gBAAkBA,EAElB,2DAA6DC,EAAa,OAASD,EACnF,OAEDG,EAAU,KAAOF,EAAa,wFAKAC,EAAa,eAM3CE,EAAc,GAAIC,QAAQL,EAAa,IAAK,KAC5CM,EAAQ,GAAID,QAAQ,IAAML,EAAa,8BAAgCA,EAAa,KAAM,KAE1FO,EAAS,GAAIF,QAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,GAAIH,QAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FS,EAAmB,GAAIJ,QAAQ,IAAML,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FU,EAAU,GAAIL,QAAQF,GACtBQ,EAAc,GAAIN,QAAQ,IAAMJ,EAAa,KAE7CW,GACCC,GAAM,GAAIR,QAAQ,MAAQJ,EAAa,KACvCa,MAAS,GAAIT,QAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,GAAIV,QAAQ,KAAOJ,EAAa,SACvCe,KAAQ,GAAIX,QAAQ,IAAMH,GAC1Be,OAAU,GAAIZ,QAAQ,IAAMF,GAC5Be,MAAS,GAAIb,QAAQ,yDAA2DL,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAQ,GAAId,QAAQ,OAASN,EAAW,KAAM,KAG9CqB,aAAgB,GAAIf,QAAQ,IAAML,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,EAAW,OAIXC,EAAY,GAAIrB,QAAQ,qBAAuBL,EAAa,MAAQA,EAAa,OAAQ,MACzF2B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACAE,EAAO,EAENC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,MAAKA,GAGQ,OAAPD,EACG,SAIDA,EAAG3C,MAAO,MAAU,KAAO2C,EAAGE,WAAYF,EAAGtC,OAAS,GAAIyC,SAAU,IAAO,IAI5E,KAAOH,GAOfI,GAAgB,WACfzE,KAGD0E,GAAmBC,GAClB,SAAU9C,GACT,MAAOA,GAAK+C,YAAa,IAAS,QAAU/C,IAAQ,SAAWA,MAE9DgD,IAAK,aAAcC,KAAM,UAI7B,KACCrD,EAAKsD,MACHzD,EAAMI,EAAMsD,KAAMtE,EAAauE,YAChCvE,EAAauE,YAId3D,EAAKZ,EAAauE,WAAWlD,QAASmD,SACrC,MAAQC,IACT1D,GAASsD,MAAOzD,EAAIS,OAGnB,SAAUqD,EAAQC,GACjB7D,EAAYuD,MAAOK,EAAQ1D,EAAMsD,KAAKK,KAKvC,SAAUD,EAAQC,GACjB,GAAIC,GAAIF,EAAOrD,OACd1C,EAAI,CAEL,OAAS+F,EAAOE,KAAOD,EAAIhG,MAC3B+F,EAAOrD,OAASuD,EAAI,IAKvB,QAASC,IAAQC,EAAUC,EAASC,EAASC,GAC5C,GAAIC,GAAGvG,EAAGwC,EAAMgE,EAAKC,EAAOC,EAAQC,EACnCC,EAAaR,GAAWA,EAAQS,cAGhChB,EAAWO,EAAUA,EAAQP,SAAW,CAKzC,IAHAQ,EAAUA,MAGe,gBAAbF,KAA0BA,GACxB,IAAbN,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAOQ,EAIR,KAAMC,KAEEF,EAAUA,EAAQS,eAAiBT,EAAU/E,KAAmBT,GACtED,EAAayF,GAEdA,EAAUA,GAAWxF,EAEhBE,GAAiB,CAIrB,GAAkB,KAAb+E,IAAoBY,EAAQrC,EAAW0C,KAAMX,IAGjD,GAAMI,EAAIE,EAAM,IAGf,GAAkB,IAAbZ,EAAiB,CACrB,KAAMrD,EAAO4D,EAAQW,eAAgBR,IAUpC,MAAOF,EALP,IAAK7D,EAAKwE,KAAOT,EAEhB,MADAF,GAAQjE,KAAMI,GACP6D,MAYT,IAAKO,IAAepE,EAAOoE,EAAWG,eAAgBR,KACrDrF,EAAUkF,EAAS5D,IACnBA,EAAKwE,KAAOT,EAGZ,MADAF,GAAQjE,KAAMI,GACP6D,MAKH,CAAA,GAAKI,EAAM,GAEjB,MADArE,GAAKsD,MAAOW,EAASD,EAAQa,qBAAsBd,IAC5CE,CAGD,KAAME,EAAIE,EAAM,KAAOxG,EAAQiH,wBACrCd,EAAQc,uBAGR,MADA9E,GAAKsD,MAAOW,EAASD,EAAQc,uBAAwBX,IAC9CF,EAKT,GAAKpG,EAAQkH,MACXxF,EAAewE,EAAW,QACzBpF,IAAcA,EAAUqG,KAAMjB,IAAc,CAE9C,GAAkB,IAAbN,EACJe,EAAaR,EACbO,EAAcR,MAMR,IAAwC,WAAnCC,EAAQiB,SAASC,cAA6B,EAGnDd,EAAMJ,EAAQmB,aAAc,OACjCf,EAAMA,EAAIgB,QAAS1C,GAAYC,IAE/BqB,EAAQqB,aAAc,KAAOjB,EAAMrF,GAIpCuF,EAASrG,EAAU8F,GACnBnG,EAAI0G,EAAOhE,MACX,OAAQ1C,IACP0G,EAAO1G,GAAK,IAAMwG,EAAM,IAAMkB,GAAYhB,EAAO1G,GAElD2G,GAAcD,EAAOiB,KAAM,KAG3Bf,EAAavC,EAAS+C,KAAMjB,IAAcyB,GAAaxB,EAAQyB,aAC9DzB,EAGF,GAAKO,EACJ,IAIC,MAHAvE,GAAKsD,MAAOW,EACXO,EAAWkB,iBAAkBnB,IAEvBN,EACN,MAAQ0B,IACR,QACIvB,IAAQrF,GACZiF,EAAQ4B,gBAAiB,QAS/B,MAAOzH,GAAQ4F,EAASqB,QAAStE,EAAO,MAAQkD,EAASC,EAASC,GASnE,QAAS7E,MACR,GAAIwG,KAEJ,SAASC,GAAOC,EAAKC,GAMpB,MAJKH,GAAK7F,KAAM+F,EAAM,KAAQjI,EAAKmI,mBAE3BH,GAAOD,EAAKK,SAEZJ,EAAOC,EAAM,KAAQC,EAE9B,MAAOF,GAOR,QAASK,IAAcC,GAEtB,MADAA,GAAIrH,IAAY,EACTqH,EAOR,QAASC,IAAQD,GAChB,GAAIE,GAAK9H,EAAS+H,cAAc,WAEhC,KACC,QAASH,EAAIE,GACZ,MAAO5C,GACR,OAAO,EACN,QAEI4C,EAAGb,YACPa,EAAGb,WAAWe,YAAaF,GAG5BA,EAAK,MASP,QAASG,IAAWC,EAAOC,GAC1B,GAAI9G,GAAM6G,EAAME,MAAM,KACrBhJ,EAAIiC,EAAIS,MAET,OAAQ1C,IACPE,EAAK+I,WAAYhH,EAAIjC,IAAO+I,EAU9B,QAASG,IAAcrH,EAAGC,GACzB,GAAIqH,GAAMrH,GAAKD,EACduH,EAAOD,GAAsB,IAAftH,EAAEgE,UAAiC,IAAf/D,EAAE+D,UACnChE,EAAEwH,YAAcvH,EAAEuH,WAGpB,IAAKD,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQrH,EACZ,QAKH,OAAOD,GAAI,KAOZ,QAAS0H,IAAmBC,GAC3B,MAAO,UAAUhH,GAChB,GAAIiH,GAAOjH,EAAK6E,SAASC,aACzB,OAAgB,UAATmC,GAAoBjH,EAAKgH,OAASA,GAQ3C,QAASE,IAAoBF,GAC5B,MAAO,UAAUhH,GAChB,GAAIiH,GAAOjH,EAAK6E,SAASC,aACzB,QAAiB,UAATmC,GAA6B,WAATA,IAAsBjH,EAAKgH,OAASA,GAQlE,QAASG,IAAsBpE,GAG9B,MAAO,UAAU/C,GAKhB,MAAK,QAAUA,GASTA,EAAKqF,YAAcrF,EAAK+C,YAAa,EAGpC,SAAW/C,GACV,SAAWA,GAAKqF,WACbrF,EAAKqF,WAAWtC,WAAaA,EAE7B/C,EAAK+C,WAAaA,EAMpB/C,EAAKoH,aAAerE,GAI1B/C,EAAKoH,cAAgBrE,GACpBF,GAAkB7C,KAAW+C,EAGzB/C,EAAK+C,WAAaA,EAKd,SAAW/C,IACfA,EAAK+C,WAAaA,GAY5B,QAASsE,IAAwBrB,GAChC,MAAOD,IAAa,SAAUuB,GAE7B,MADAA,IAAYA,EACLvB,GAAa,SAAUjC,EAAMrF,GACnC,GAAIgF,GACH8D,EAAevB,KAAQlC,EAAK5D,OAAQoH,GACpC9J,EAAI+J,EAAarH,MAGlB,OAAQ1C,IACFsG,EAAOL,EAAI8D,EAAa/J,MAC5BsG,EAAKL,KAAOhF,EAAQgF,GAAKK,EAAKL,SAYnC,QAAS2B,IAAaxB,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQa,sBAAwCb,EAI1EnG,EAAUiG,GAAOjG,WAOjBG,EAAQ8F,GAAO9F,MAAQ,SAAUoC,GAGhC,GAAIwH,GAAkBxH,IAASA,EAAKqE,eAAiBrE,GAAMwH,eAC3D,SAAOA,GAA+C,SAA7BA,EAAgB3C,UAQ1C1G,EAAcuF,GAAOvF,YAAc,SAAUsJ,GAC5C,GAAIC,GAAYC,EACfC,EAAMH,EAAOA,EAAKpD,eAAiBoD,EAAO5I,CAG3C,OAAK+I,KAAQxJ,GAA6B,IAAjBwJ,EAAIvE,UAAmBuE,EAAIJ,iBAKpDpJ,EAAWwJ,EACXvJ,EAAUD,EAASoJ,gBACnBlJ,GAAkBV,EAAOQ,GAIpBS,IAAiBT,IACpBuJ,EAAYvJ,EAASyJ,cAAgBF,EAAUG,MAAQH,IAGnDA,EAAUI,iBACdJ,EAAUI,iBAAkB,SAAUnF,IAAe,GAG1C+E,EAAUK,aACrBL,EAAUK,YAAa,WAAYpF,KAUrCnF,EAAQ6C,WAAa2F,GAAO,SAAUC,GAErC,MADAA,GAAG+B,UAAY,KACP/B,EAAGnB,aAAa,eAOzBtH,EAAQgH,qBAAuBwB,GAAO,SAAUC,GAE/C,MADAA,GAAGgC,YAAa9J,EAAS+J,cAAc,MAC/BjC,EAAGzB,qBAAqB,KAAKvE,SAItCzC,EAAQiH,uBAAyB/C,EAAQiD,KAAMxG,EAASsG,wBAMxDjH,EAAQ2K,QAAUnC,GAAO,SAAUC,GAElC,MADA7H,GAAQ6J,YAAahC,GAAK1B,GAAK7F,GACvBP,EAASiK,oBAAsBjK,EAASiK,kBAAmB1J,GAAUuB,SAIzEzC,EAAQ2K,SACZ1K,EAAK4K,OAAW,GAAI,SAAU9D,GAC7B,GAAI+D,GAAS/D,EAAGQ,QAASlD,EAAWC,GACpC,OAAO,UAAU/B,GAChB,MAAOA,GAAK+E,aAAa,QAAUwD,IAGrC7K,EAAK8K,KAAS,GAAI,SAAUhE,EAAIZ,GAC/B,GAAuC,mBAA3BA,GAAQW,gBAAkCjG,EAAiB,CACtE,GAAI0B,GAAO4D,EAAQW,eAAgBC,EACnC,OAAOxE,IAASA,UAIlBtC,EAAK4K,OAAW,GAAK,SAAU9D,GAC9B,GAAI+D,GAAS/D,EAAGQ,QAASlD,EAAWC,GACpC,OAAO,UAAU/B,GAChB,GAAIyH,GAAwC,mBAA1BzH,GAAKyI,kBACtBzI,EAAKyI,iBAAiB,KACvB,OAAOhB,IAAQA,EAAK7B,QAAU2C,IAMhC7K,EAAK8K,KAAS,GAAI,SAAUhE,EAAIZ,GAC/B,GAAuC,mBAA3BA,GAAQW,gBAAkCjG,EAAiB,CACtE,GAAImJ,GAAMjK,EAAGkL,EACZ1I,EAAO4D,EAAQW,eAAgBC,EAEhC,IAAKxE,EAAO,CAIX,GADAyH,EAAOzH,EAAKyI,iBAAiB,MACxBhB,GAAQA,EAAK7B,QAAUpB,EAC3B,OAASxE,EAIV0I,GAAQ9E,EAAQyE,kBAAmB7D,GACnChH,EAAI,CACJ,OAASwC,EAAO0I,EAAMlL,KAErB,GADAiK,EAAOzH,EAAKyI,iBAAiB,MACxBhB,GAAQA,EAAK7B,QAAUpB,EAC3B,OAASxE,GAKZ,YAMHtC,EAAK8K,KAAU,IAAI/K,EAAQgH,qBAC1B,SAAUkE,EAAK/E,GACd,MAA6C,mBAAjCA,GAAQa,qBACZb,EAAQa,qBAAsBkE,GAG1BlL,EAAQkH,IACZf,EAAQ0B,iBAAkBqD,GAD3B,QAKR,SAAUA,EAAK/E,GACd,GAAI5D,GACH4I,KACApL,EAAI,EAEJqG,EAAUD,EAAQa,qBAAsBkE,EAGzC,IAAa,MAARA,EAAc,CAClB,MAAS3I,EAAO6D,EAAQrG,KACA,IAAlBwC,EAAKqD,UACTuF,EAAIhJ,KAAMI,EAIZ,OAAO4I,GAER,MAAO/E,IAITnG,EAAK8K,KAAY,MAAI/K,EAAQiH,wBAA0B,SAAUuD,EAAWrE,GAC3E,GAA+C,mBAAnCA,GAAQc,wBAA0CpG,EAC7D,MAAOsF,GAAQc,uBAAwBuD,IAUzCzJ,KAOAD,MAEMd,EAAQkH,IAAMhD,EAAQiD,KAAMxG,EAASkH,qBAG1CW,GAAO,SAAUC,GAMhB7H,EAAQ6J,YAAahC,GAAK2C,UAAY,UAAYlK,EAAU,qBAC1CA,EAAU,kEAOvBuH,EAAGZ,iBAAiB,wBAAwBpF,QAChD3B,EAAUqB,KAAM,SAAWQ,EAAa,gBAKnC8F,EAAGZ,iBAAiB,cAAcpF,QACvC3B,EAAUqB,KAAM,MAAQQ,EAAa,aAAeD,EAAW,KAI1D+F,EAAGZ,iBAAkB,QAAU3G,EAAU,MAAOuB,QACrD3B,EAAUqB,KAAK,MAMVsG,EAAGZ,iBAAiB,YAAYpF,QACrC3B,EAAUqB,KAAK,YAMVsG,EAAGZ,iBAAkB,KAAO3G,EAAU,MAAOuB,QAClD3B,EAAUqB,KAAK,cAIjBqG,GAAO,SAAUC,GAChBA,EAAG2C,UAAY,mFAKf,IAAIC,GAAQ1K,EAAS+H,cAAc,QACnC2C,GAAM7D,aAAc,OAAQ,UAC5BiB,EAAGgC,YAAaY,GAAQ7D,aAAc,OAAQ,KAIzCiB,EAAGZ,iBAAiB,YAAYpF,QACpC3B,EAAUqB,KAAM,OAASQ,EAAa,eAKS,IAA3C8F,EAAGZ,iBAAiB,YAAYpF,QACpC3B,EAAUqB,KAAM,WAAY,aAK7BvB,EAAQ6J,YAAahC,GAAKnD,UAAW,EACY,IAA5CmD,EAAGZ,iBAAiB,aAAapF,QACrC3B,EAAUqB,KAAM,WAAY,aAI7BsG,EAAGZ,iBAAiB,QACpB/G,EAAUqB,KAAK,YAIXnC,EAAQsL,gBAAkBpH,EAAQiD,KAAOnG,EAAUJ,EAAQI,SAChEJ,EAAQ2K,uBACR3K,EAAQ4K,oBACR5K,EAAQ6K,kBACR7K,EAAQ8K,qBAERlD,GAAO,SAAUC,GAGhBzI,EAAQ2L,kBAAoB3K,EAAQ0E,KAAM+C,EAAI,KAI9CzH,EAAQ0E,KAAM+C,EAAI,aAClB1H,EAAcoB,KAAM,KAAMW,KAI5BhC,EAAYA,EAAU2B,QAAU,GAAIO,QAAQlC,EAAU4G,KAAK,MAC3D3G,EAAgBA,EAAc0B,QAAU,GAAIO,QAAQjC,EAAc2G,KAAK,MAIvEuC,EAAa/F,EAAQiD,KAAMvG,EAAQgL,yBAKnC3K,EAAWgJ,GAAc/F,EAAQiD,KAAMvG,EAAQK,UAC9C,SAAUW,EAAGC,GACZ,GAAIgK,GAAuB,IAAfjK,EAAEgE,SAAiBhE,EAAEmI,gBAAkBnI,EAClDkK,EAAMjK,GAAKA,EAAE+F,UACd,OAAOhG,KAAMkK,MAAWA,GAAwB,IAAjBA,EAAIlG,YAClCiG,EAAM5K,SACL4K,EAAM5K,SAAU6K,GAChBlK,EAAEgK,yBAA8D,GAAnChK,EAAEgK,wBAAyBE,MAG3D,SAAUlK,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAE+F,WACd,GAAK/F,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAYsI,EACZ,SAAUrI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADApB,IAAe,EACR,CAIR,IAAIsL,IAAWnK,EAAEgK,yBAA2B/J,EAAE+J,uBAC9C,OAAKG,GACGA,GAIRA,GAAYnK,EAAEgF,eAAiBhF,MAAUC,EAAE+E,eAAiB/E,GAC3DD,EAAEgK,wBAAyB/J,GAG3B,EAGc,EAAVkK,IACF/L,EAAQgM,cAAgBnK,EAAE+J,wBAAyBhK,KAAQmK,EAGxDnK,IAAMjB,GAAYiB,EAAEgF,gBAAkBxF,GAAgBH,EAASG,EAAcQ,MAG7EC,IAAMlB,GAAYkB,EAAE+E,gBAAkBxF,GAAgBH,EAASG,EAAcS,GAC1E,EAIDrB,EACJ6B,EAAS7B,EAAWoB,GAAMS,EAAS7B,EAAWqB,GAChD,EAGe,EAAVkK,KAAmB,IAE3B,SAAUnK,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADApB,IAAe,EACR,CAGR,IAAIyI,GACHnJ,EAAI,EACJkM,EAAMrK,EAAEgG,WACRkE,EAAMjK,EAAE+F,WACRsE,GAAOtK,GACPuK,GAAOtK,EAGR,KAAMoK,IAAQH,EACb,MAAOlK,KAAMjB,KACZkB,IAAMlB,EAAW,EACjBsL,KACAH,EAAM,EACNtL,EACE6B,EAAS7B,EAAWoB,GAAMS,EAAS7B,EAAWqB,GAChD,CAGK,IAAKoK,IAAQH,EACnB,MAAO7C,IAAcrH,EAAGC,EAIzBqH,GAAMtH,CACN,OAASsH,EAAMA,EAAItB,WAClBsE,EAAGE,QAASlD,EAEbA,GAAMrH,CACN,OAASqH,EAAMA,EAAItB,WAClBuE,EAAGC,QAASlD,EAIb,OAAQgD,EAAGnM,KAAOoM,EAAGpM,GACpBA,GAGD,OAAOA,GAENkJ,GAAciD,EAAGnM,GAAIoM,EAAGpM,IAGxBmM,EAAGnM,KAAOqB,KACV+K,EAAGpM,KAAOqB,EAAe,EACzB,GAGKT,GA3YCA,GA8YTsF,GAAOjF,QAAU,SAAUqL,EAAMC,GAChC,MAAOrG,IAAQoG,EAAM,KAAM,KAAMC,IAGlCrG,GAAOqF,gBAAkB,SAAU/I,EAAM8J,GASxC,IAPO9J,EAAKqE,eAAiBrE,KAAW5B,GACvCD,EAAa6B,GAId8J,EAAOA,EAAK9E,QAASnE,EAAkB,UAElCpD,EAAQsL,iBAAmBzK,IAC9Ba,EAAe2K,EAAO,QACpBtL,IAAkBA,EAAcoG,KAAMkF,OACtCvL,IAAkBA,EAAUqG,KAAMkF,IAErC,IACC,GAAIE,GAAMvL,EAAQ0E,KAAMnD,EAAM8J,EAG9B,IAAKE,GAAOvM,EAAQ2L,mBAGlBpJ,EAAK5B,UAAuC,KAA3B4B,EAAK5B,SAASiF,SAChC,MAAO2G,GAEP,MAAO1G,IAGV,MAAOI,IAAQoG,EAAM1L,EAAU,MAAQ4B,IAASE,OAAS,GAG1DwD,GAAOhF,SAAW,SAAUkF,EAAS5D,GAKpC,OAHO4D,EAAQS,eAAiBT,KAAcxF,GAC7CD,EAAayF,GAEPlF,EAAUkF,EAAS5D,IAG3B0D,GAAOuG,KAAO,SAAUjK,EAAMiH,IAEtBjH,EAAKqE,eAAiBrE,KAAW5B,GACvCD,EAAa6B,EAGd,IAAIgG,GAAKtI,EAAK+I,WAAYQ,EAAKnC,eAE9BoF,EAAMlE,GAAMzG,EAAO4D,KAAMzF,EAAK+I,WAAYQ,EAAKnC,eAC9CkB,EAAIhG,EAAMiH,GAAO3I,GACjB6L,MAEF,OAAeA,UAARD,EACNA,EACAzM,EAAQ6C,aAAehC,EACtB0B,EAAK+E,aAAckC,IAClBiD,EAAMlK,EAAKyI,iBAAiBxB,KAAUiD,EAAIE,UAC1CF,EAAItE,MACJ,MAGJlC,GAAO2G,OAAS,SAAUC,GACzB,OAAQA,EAAM,IAAItF,QAAS1C,GAAYC,KAGxCmB,GAAO6G,MAAQ,SAAUC,GACxB,KAAM,IAAIC,OAAO,0CAA4CD,IAO9D9G,GAAOgH,WAAa,SAAU7G,GAC7B,GAAI7D,GACH2K,KACAlH,EAAI,EACJjG,EAAI,CAOL,IAJAU,GAAgBT,EAAQmN,iBACxB3M,GAAaR,EAAQoN,YAAchH,EAAQhE,MAAO,GAClDgE,EAAQiH,KAAM1L,GAETlB,EAAe,CACnB,MAAS8B,EAAO6D,EAAQrG,KAClBwC,IAAS6D,EAASrG,KACtBiG,EAAIkH,EAAW/K,KAAMpC,GAGvB,OAAQiG,IACPI,EAAQkH,OAAQJ,EAAYlH,GAAK,GAQnC,MAFAxF,GAAY,KAEL4F,GAORlG,EAAU+F,GAAO/F,QAAU,SAAUqC,GACpC,GAAIyH,GACHuC,EAAM,GACNxM,EAAI,EACJ6F,EAAWrD,EAAKqD,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBrD,GAAKgL,YAChB,MAAOhL,GAAKgL,WAGZ,KAAMhL,EAAOA,EAAKiL,WAAYjL,EAAMA,EAAOA,EAAK8G,YAC/CkD,GAAOrM,EAASqC,OAGZ,IAAkB,IAAbqD,GAA+B,IAAbA,EAC7B,MAAOrD,GAAKkL,cAhBZ,OAASzD,EAAOzH,EAAKxC,KAEpBwM,GAAOrM,EAAS8J,EAkBlB,OAAOuC,IAGRtM,EAAOgG,GAAOyH,WAGbtF,YAAa,GAEbuF,aAAcrF,GAEd9B,MAAOjD,EAEPyF,cAEA+B,QAEA6C,UACCC,KAAOtI,IAAK,aAAcuI,OAAO,GACjCC,KAAOxI,IAAK,cACZyI,KAAOzI,IAAK,kBAAmBuI,OAAO,GACtCG,KAAO1I,IAAK,oBAGb2I,WACCvK,KAAQ,SAAU6C,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGe,QAASlD,EAAWC,IAGxCkC,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAKe,QAASlD,EAAWC,IAExD,OAAbkC,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMpE,MAAO,EAAG,IAGxByB,MAAS,SAAU2C,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAGa,cAEY,QAA3Bb,EAAM,GAAGpE,MAAO,EAAG,IAEjBoE,EAAM,IACXP,GAAO6G,MAAOtG,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBP,GAAO6G,MAAOtG,EAAM,IAGdA,GAGR5C,OAAU,SAAU4C,GACnB,GAAI2H,GACHC,GAAY5H,EAAM,IAAMA,EAAM,EAE/B,OAAKjD,GAAiB,MAAE4D,KAAMX,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxB4H,GAAY/K,EAAQ8D,KAAMiH,KAEpCD,EAAS/N,EAAUgO,GAAU,MAE7BD,EAASC,EAAS/L,QAAS,IAAK+L,EAAS3L,OAAS0L,GAAWC,EAAS3L,UAGvE+D,EAAM,GAAKA,EAAM,GAAGpE,MAAO,EAAG+L,GAC9B3H,EAAM,GAAK4H,EAAShM,MAAO,EAAG+L,IAIxB3H,EAAMpE,MAAO,EAAG,MAIzByI,QAECnH,IAAO,SAAU2K,GAChB,GAAIjH,GAAWiH,EAAiB9G,QAASlD,EAAWC,IAAY+C,aAChE,OAA4B,MAArBgH,EACN,WAAa,OAAO,GACpB,SAAU9L,GACT,MAAOA,GAAK6E,UAAY7E,EAAK6E,SAASC,gBAAkBD,IAI3D3D,MAAS,SAAU+G,GAClB,GAAI8D,GAAU/M,EAAYiJ,EAAY,IAEtC,OAAO8D,KACLA,EAAU,GAAItL,QAAQ,MAAQL,EAAa,IAAM6H,EAAY,IAAM7H,EAAa,SACjFpB,EAAYiJ,EAAW,SAAUjI,GAChC,MAAO+L,GAAQnH,KAAgC,gBAAnB5E,GAAKiI,WAA0BjI,EAAKiI,WAA0C,mBAAtBjI,GAAK+E,cAAgC/E,EAAK+E,aAAa,UAAY,OAI1J3D,KAAQ,SAAU6F,EAAM+E,EAAUC,GACjC,MAAO,UAAUjM,GAChB,GAAIkM,GAASxI,GAAOuG,KAAMjK,EAAMiH,EAEhC,OAAe,OAAViF,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOpM,QAASmM,GAChC,OAAbD,EAAoBC,GAASC,EAAOpM,QAASmM,MAChC,OAAbD,EAAoBC,GAASC,EAAOrM,OAAQoM,EAAM/L,UAAa+L,EAClD,OAAbD,GAAsB,IAAME,EAAOlH,QAASxE,EAAa,KAAQ,KAAMV,QAASmM,MACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOrM,MAAO,EAAGoM,EAAM/L,OAAS,KAAQ+L,EAAQ,QAK3F3K,MAAS,SAAU0F,EAAMmF,EAAM7E,EAAUiE,EAAOa,GAC/C,GAAIC,GAAgC,QAAvBrF,EAAKnH,MAAO,EAAG,GAC3ByM,EAA+B,SAArBtF,EAAKnH,UACf0M,EAAkB,YAATJ,CAEV,OAAiB,KAAVZ,GAAwB,IAATa,EAGrB,SAAUpM,GACT,QAASA,EAAKqF,YAGf,SAAUrF,EAAM4D,EAAS4I,GACxB,GAAI9G,GAAO+G,EAAaC,EAAYjF,EAAMkF,EAAWC,EACpD5J,EAAMqJ,IAAWC,EAAU,cAAgB,kBAC3CO,EAAS7M,EAAKqF,WACd4B,EAAOsF,GAAUvM,EAAK6E,SAASC,cAC/BgI,GAAYN,IAAQD,EACpB3F,GAAO,CAER,IAAKiG,EAAS,CAGb,GAAKR,EAAS,CACb,MAAQrJ,EAAM,CACbyE,EAAOzH,CACP,OAASyH,EAAOA,EAAMzE,GACrB,GAAKuJ,EACJ9E,EAAK5C,SAASC,gBAAkBmC,EACd,IAAlBQ,EAAKpE,SAEL,OAAO,CAITuJ,GAAQ5J,EAAe,SAATgE,IAAoB4F,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUN,EAAUO,EAAO5B,WAAa4B,EAAOE,WAG1CT,GAAWQ,EAAW,CAK1BrF,EAAOoF,EACPH,EAAajF,EAAM9I,KAAc8I,EAAM9I,OAIvC8N,EAAcC,EAAYjF,EAAKuF,YAC7BN,EAAYjF,EAAKuF,cAEnBtH,EAAQ+G,EAAazF,OACrB2F,EAAYjH,EAAO,KAAQ5G,GAAW4G,EAAO,GAC7CkB,EAAO+F,GAAajH,EAAO,GAC3B+B,EAAOkF,GAAaE,EAAOzJ,WAAYuJ,EAEvC,OAASlF,IAASkF,GAAalF,GAAQA,EAAMzE,KAG3C4D,EAAO+F,EAAY,IAAMC,EAAMlN,MAGhC,GAAuB,IAAlB+H,EAAKpE,YAAoBuD,GAAQa,IAASzH,EAAO,CACrDyM,EAAazF,IAAWlI,EAAS6N,EAAW/F,EAC5C,YAuBF,IAjBKkG,IAEJrF,EAAOzH,EACP0M,EAAajF,EAAM9I,KAAc8I,EAAM9I,OAIvC8N,EAAcC,EAAYjF,EAAKuF,YAC7BN,EAAYjF,EAAKuF,cAEnBtH,EAAQ+G,EAAazF,OACrB2F,EAAYjH,EAAO,KAAQ5G,GAAW4G,EAAO,GAC7CkB,EAAO+F,GAKH/F,KAAS,EAEb,MAASa,IAASkF,GAAalF,GAAQA,EAAMzE,KAC3C4D,EAAO+F,EAAY,IAAMC,EAAMlN,MAEhC,IAAO6M,EACN9E,EAAK5C,SAASC,gBAAkBmC,EACd,IAAlBQ,EAAKpE,aACHuD,IAGGkG,IACJJ,EAAajF,EAAM9I,KAAc8I,EAAM9I,OAIvC8N,EAAcC,EAAYjF,EAAKuF,YAC7BN,EAAYjF,EAAKuF,cAEnBP,EAAazF,IAAWlI,EAAS8H,IAG7Ba,IAASzH,GACb,KASL,OADA4G,IAAQwF,EACDxF,IAAS2E,GAAW3E,EAAO2E,IAAU,GAAK3E,EAAO2E,GAAS,KAKrElK,OAAU,SAAU4L,EAAQ3F,GAK3B,GAAI4F,GACHlH,EAAKtI,EAAK6C,QAAS0M,IAAYvP,EAAKyP,WAAYF,EAAOnI,gBACtDpB,GAAO6G,MAAO,uBAAyB0C,EAKzC,OAAKjH,GAAIrH,GACDqH,EAAIsB,GAIPtB,EAAG9F,OAAS,GAChBgN,GAASD,EAAQA,EAAQ,GAAI3F,GACtB5J,EAAKyP,WAAW3N,eAAgByN,EAAOnI,eAC7CiB,GAAa,SAAUjC,EAAMrF,GAC5B,GAAI2O,GACHC,EAAUrH,EAAIlC,EAAMwD,GACpB9J,EAAI6P,EAAQnN,MACb,OAAQ1C,IACP4P,EAAMtN,EAASgE,EAAMuJ,EAAQ7P,IAC7BsG,EAAMsJ,KAAW3O,EAAS2O,GAAQC,EAAQ7P,MAG5C,SAAUwC,GACT,MAAOgG,GAAIhG,EAAM,EAAGkN,KAIhBlH,IAITzF,SAEC+M,IAAOvH,GAAa,SAAUpC,GAI7B,GAAImF,MACHjF,KACA0J,EAAUzP,EAAS6F,EAASqB,QAAStE,EAAO,MAE7C,OAAO6M,GAAS5O,GACfoH,GAAa,SAAUjC,EAAMrF,EAASmF,EAAS4I,GAC9C,GAAIxM,GACHwN,EAAYD,EAASzJ,EAAM,KAAM0I,MACjChP,EAAIsG,EAAK5D,MAGV,OAAQ1C,KACDwC,EAAOwN,EAAUhQ,MACtBsG,EAAKtG,KAAOiB,EAAQjB,GAAKwC,MAI5B,SAAUA,EAAM4D,EAAS4I,GAKxB,MAJA1D,GAAM,GAAK9I,EACXuN,EAASzE,EAAO,KAAM0D,EAAK3I,GAE3BiF,EAAM,GAAK,MACHjF,EAAQnE,SAInB+N,IAAO1H,GAAa,SAAUpC,GAC7B,MAAO,UAAU3D,GAChB,MAAO0D,IAAQC,EAAU3D,GAAOE,OAAS,KAI3CxB,SAAYqH,GAAa,SAAU2H,GAElC,MADAA,GAAOA,EAAK1I,QAASlD,EAAWC,IACzB,SAAU/B,GAChB,OAASA,EAAKgL,aAAehL,EAAK2N,WAAahQ,EAASqC,IAASF,QAAS4N,SAW5EE,KAAQ7H,GAAc,SAAU6H,GAM/B,MAJM7M,GAAY6D,KAAKgJ,GAAQ,KAC9BlK,GAAO6G,MAAO,qBAAuBqD,GAEtCA,EAAOA,EAAK5I,QAASlD,EAAWC,IAAY+C,cACrC,SAAU9E,GAChB,GAAI6N,EACJ,GACC,IAAMA,EAAWvP,EAChB0B,EAAK4N,KACL5N,EAAK+E,aAAa,aAAe/E,EAAK+E,aAAa,QAGnD,MADA8I,GAAWA,EAAS/I,cACb+I,IAAaD,GAA2C,IAAnCC,EAAS/N,QAAS8N,EAAO,YAE5C5N,EAAOA,EAAKqF,aAAiC,IAAlBrF,EAAKqD,SAC3C,QAAO,KAKTE,OAAU,SAAUvD,GACnB,GAAI8N,GAAOvQ,EAAOwQ,UAAYxQ,EAAOwQ,SAASD,IAC9C,OAAOA,IAAQA,EAAKjO,MAAO,KAAQG,EAAKwE,IAGzCwJ,KAAQ,SAAUhO,GACjB,MAAOA,KAAS3B,GAGjB4P,MAAS,SAAUjO,GAClB,MAAOA,KAAS5B,EAAS8P,iBAAmB9P,EAAS+P,UAAY/P,EAAS+P,gBAAkBnO,EAAKgH,MAAQhH,EAAKoO,OAASpO,EAAKqO,WAI7HC,QAAWnH,IAAsB,GACjCpE,SAAYoE,IAAsB,GAElCoH,QAAW,SAAUvO,GAGpB,GAAI6E,GAAW7E,EAAK6E,SAASC,aAC7B,OAAqB,UAAbD,KAA0B7E,EAAKuO,SAA0B,WAAb1J,KAA2B7E,EAAKwO,UAGrFA,SAAY,SAAUxO,GAOrB,MAJKA,GAAKqF,YACTrF,EAAKqF,WAAWoJ,cAGVzO,EAAKwO,YAAa,GAI1BE,MAAS,SAAU1O,GAKlB,IAAMA,EAAOA,EAAKiL,WAAYjL,EAAMA,EAAOA,EAAK8G,YAC/C,GAAK9G,EAAKqD,SAAW,EACpB,OAAO,CAGT,QAAO,GAGRwJ,OAAU,SAAU7M,GACnB,OAAQtC,EAAK6C,QAAe,MAAGP,IAIhC2O,OAAU,SAAU3O,GACnB,MAAO0B,GAAQkD,KAAM5E,EAAK6E,WAG3BiE,MAAS,SAAU9I,GAClB,MAAOyB,GAAQmD,KAAM5E,EAAK6E,WAG3B+J,OAAU,SAAU5O,GACnB,GAAIiH,GAAOjH,EAAK6E,SAASC,aACzB,OAAgB,UAATmC,GAAkC,WAAdjH,EAAKgH,MAA8B,WAATC,GAGtDyG,KAAQ,SAAU1N,GACjB,GAAIiK,EACJ,OAAuC,UAAhCjK,EAAK6E,SAASC,eACN,SAAd9E,EAAKgH,OAImC,OAArCiD,EAAOjK,EAAK+E,aAAa,UAA2C,SAAvBkF,EAAKnF,gBAIvDyG,MAASlE,GAAuB,WAC/B,OAAS,KAGV+E,KAAQ/E,GAAuB,SAAUE,EAAcrH,GACtD,OAASA,EAAS,KAGnB2O,GAAMxH,GAAuB,SAAUE,EAAcrH,EAAQoH,GAC5D,OAASA,EAAW,EAAIA,EAAWpH,EAASoH,KAG7CwH,KAAQzH,GAAuB,SAAUE,EAAcrH,GAEtD,IADA,GAAI1C,GAAI,EACAA,EAAI0C,EAAQ1C,GAAK,EACxB+J,EAAa3H,KAAMpC,EAEpB,OAAO+J,KAGRwH,IAAO1H,GAAuB,SAAUE,EAAcrH,GAErD,IADA,GAAI1C,GAAI,EACAA,EAAI0C,EAAQ1C,GAAK,EACxB+J,EAAa3H,KAAMpC,EAEpB,OAAO+J,KAGRyH,GAAM3H,GAAuB,SAAUE,EAAcrH,EAAQoH,GAE5D,IADA,GAAI9J,GAAI8J,EAAW,EAAIA,EAAWpH,EAASoH,IACjC9J,GAAK,GACd+J,EAAa3H,KAAMpC,EAEpB,OAAO+J,KAGR0H,GAAM5H,GAAuB,SAAUE,EAAcrH,EAAQoH,GAE5D,IADA,GAAI9J,GAAI8J,EAAW,EAAIA,EAAWpH,EAASoH,IACjC9J,EAAI0C,GACbqH,EAAa3H,KAAMpC,EAEpB,OAAO+J,OAKV7J,EAAK6C,QAAa,IAAI7C,EAAK6C,QAAY,EAGvC,KAAM/C,KAAO0R,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E5R,EAAK6C,QAAS/C,GAAMuJ,GAAmBvJ,EAExC,KAAMA,KAAO+R,QAAQ,EAAMC,OAAO,GACjC9R,EAAK6C,QAAS/C,GAAM0J,GAAoB1J,EAIzC,SAAS2P,OACTA,GAAWsC,UAAY/R,EAAKgS,QAAUhS,EAAK6C,QAC3C7C,EAAKyP,WAAa,GAAIA,IAEtBtP,EAAW6F,GAAO7F,SAAW,SAAU8F,EAAUgM,GAChD,GAAItC,GAASpJ,EAAO2L,EAAQ5I,EAC3B6I,EAAO3L,EAAQ4L,EACfC,EAAS7Q,EAAYyE,EAAW,IAEjC,IAAKoM,EACJ,MAAOJ,GAAY,EAAII,EAAOlQ,MAAO,EAGtCgQ,GAAQlM,EACRO,KACA4L,EAAapS,EAAKiO,SAElB,OAAQkE,EAAQ,CAGTxC,KAAYpJ,EAAQtD,EAAO2D,KAAMuL,MACjC5L,IAEJ4L,EAAQA,EAAMhQ,MAAOoE,EAAM,GAAG/D,SAAY2P,GAE3C3L,EAAOtE,KAAOgQ,OAGfvC,GAAU,GAGJpJ,EAAQrD,EAAa0D,KAAMuL,MAChCxC,EAAUpJ,EAAM6B,QAChB8J,EAAOhQ,MACNgG,MAAOyH,EAEPrG,KAAM/C,EAAM,GAAGe,QAAStE,EAAO,OAEhCmP,EAAQA,EAAMhQ,MAAOwN,EAAQnN,QAI9B,KAAM8G,IAAQtJ,GAAK4K,SACZrE,EAAQjD,EAAWgG,GAAO1C,KAAMuL,KAAcC,EAAY9I,MAC9D/C,EAAQ6L,EAAY9I,GAAQ/C,MAC7BoJ,EAAUpJ,EAAM6B,QAChB8J,EAAOhQ,MACNgG,MAAOyH,EACPrG,KAAMA,EACNvI,QAASwF,IAEV4L,EAAQA,EAAMhQ,MAAOwN,EAAQnN,QAI/B,KAAMmN,EACL,MAOF,MAAOsC,GACNE,EAAM3P,OACN2P,EACCnM,GAAO6G,MAAO5G,GAEdzE,EAAYyE,EAAUO,GAASrE,MAAO,GAGzC,SAASqF,IAAY0K,GAIpB,IAHA,GAAIpS,GAAI,EACPyC,EAAM2P,EAAO1P,OACbyD,EAAW,GACJnG,EAAIyC,EAAKzC,IAChBmG,GAAYiM,EAAOpS,GAAGoI,KAEvB,OAAOjC,GAGR,QAASb,IAAeyK,EAASyC,EAAYC,GAC5C,GAAIjN,GAAMgN,EAAWhN,IACpBkN,EAAOF,EAAW/M,KAClB0C,EAAMuK,GAAQlN,EACdmN,EAAmBF,GAAgB,eAARtK,EAC3ByK,EAAWrR,GAEZ,OAAOiR,GAAWzE,MAEjB,SAAUvL,EAAM4D,EAAS4I,GACxB,MAASxM,EAAOA,EAAMgD,GACrB,GAAuB,IAAlBhD,EAAKqD,UAAkB8M,EAC3B,MAAO5C,GAASvN,EAAM4D,EAAS4I,EAGjC,QAAO,GAIR,SAAUxM,EAAM4D,EAAS4I,GACxB,GAAI6D,GAAU5D,EAAaC,EAC1B4D,GAAaxR,EAASsR,EAGvB,IAAK5D,GACJ,MAASxM,EAAOA,EAAMgD,GACrB,IAAuB,IAAlBhD,EAAKqD,UAAkB8M,IACtB5C,EAASvN,EAAM4D,EAAS4I,GAC5B,OAAO,MAKV,OAASxM,EAAOA,EAAMgD,GACrB,GAAuB,IAAlBhD,EAAKqD,UAAkB8M,EAO3B,GANAzD,EAAa1M,EAAMrB,KAAcqB,EAAMrB,OAIvC8N,EAAcC,EAAY1M,EAAKgN,YAAeN,EAAY1M,EAAKgN,cAE1DkD,GAAQA,IAASlQ,EAAK6E,SAASC,cACnC9E,EAAOA,EAAMgD,IAAShD,MAChB,CAAA,IAAMqQ,EAAW5D,EAAa9G,KACpC0K,EAAU,KAAQvR,GAAWuR,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHA5D,EAAa9G,GAAQ2K,EAGfA,EAAU,GAAM/C,EAASvN,EAAM4D,EAAS4I,GAC7C,OAAO,EAMZ,OAAO,GAIV,QAAS+D,IAAgBC,GACxB,MAAOA,GAAStQ,OAAS,EACxB,SAAUF,EAAM4D,EAAS4I,GACxB,GAAIhP,GAAIgT,EAAStQ,MACjB,OAAQ1C,IACP,IAAMgT,EAAShT,GAAIwC,EAAM4D,EAAS4I,GACjC,OAAO,CAGT,QAAO,GAERgE,EAAS,GAGX,QAASC,IAAkB9M,EAAU+M,EAAU7M,GAG9C,IAFA,GAAIrG,GAAI,EACPyC,EAAMyQ,EAASxQ,OACR1C,EAAIyC,EAAKzC,IAChBkG,GAAQC,EAAU+M,EAASlT,GAAIqG,EAEhC,OAAOA,GAGR,QAAS8M,IAAUnD,EAAWoD,EAAKtI,EAAQ1E,EAAS4I,GAOnD,IANA,GAAIxM,GACH6Q,KACArT,EAAI,EACJyC,EAAMuN,EAAUtN,OAChB4Q,EAAgB,MAAPF,EAEFpT,EAAIyC,EAAKzC,KACVwC,EAAOwN,EAAUhQ,MAChB8K,IAAUA,EAAQtI,EAAM4D,EAAS4I,KACtCqE,EAAajR,KAAMI,GACd8Q,GACJF,EAAIhR,KAAMpC,IAMd,OAAOqT,GAGR,QAASE,IAAYpF,EAAWhI,EAAU4J,EAASyD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAYrS,KAC/BqS,EAAaD,GAAYC,IAErBC,IAAeA,EAAYtS,KAC/BsS,EAAaF,GAAYE,EAAYC,IAE/BnL,GAAa,SAAUjC,EAAMD,EAASD,EAAS4I,GACrD,GAAI2E,GAAM3T,EAAGwC,EACZoR,KACAC,KACAC,EAAczN,EAAQ3D,OAGtBwI,EAAQ5E,GAAQ2M,GAAkB9M,GAAY,IAAKC,EAAQP,UAAaO,GAAYA,MAGpF2N,GAAY5F,IAAe7H,GAASH,EAEnC+E,EADAiI,GAAUjI,EAAO0I,EAAQzF,EAAW/H,EAAS4I,GAG9CgF,EAAajE,EAEZ0D,IAAgBnN,EAAO6H,EAAY2F,GAAeN,MAMjDnN,EACD0N,CAQF,IALKhE,GACJA,EAASgE,EAAWC,EAAY5N,EAAS4I,GAIrCwE,EAAa,CACjBG,EAAOR,GAAUa,EAAYH,GAC7BL,EAAYG,KAAUvN,EAAS4I,GAG/BhP,EAAI2T,EAAKjR,MACT,OAAQ1C,KACDwC,EAAOmR,EAAK3T,MACjBgU,EAAYH,EAAQ7T,MAAS+T,EAAWF,EAAQ7T,IAAOwC,IAK1D,GAAK8D,GACJ,GAAKmN,GAActF,EAAY,CAC9B,GAAKsF,EAAa,CAEjBE,KACA3T,EAAIgU,EAAWtR,MACf,OAAQ1C,KACDwC,EAAOwR,EAAWhU,KAEvB2T,EAAKvR,KAAO2R,EAAU/T,GAAKwC,EAG7BiR,GAAY,KAAOO,KAAkBL,EAAM3E,GAI5ChP,EAAIgU,EAAWtR,MACf,OAAQ1C,KACDwC,EAAOwR,EAAWhU,MACtB2T,EAAOF,EAAanR,EAASgE,EAAM9D,GAASoR,EAAO5T,SAEpDsG,EAAKqN,KAAUtN,EAAQsN,GAAQnR,SAOlCwR,GAAab,GACZa,IAAe3N,EACd2N,EAAWzG,OAAQuG,EAAaE,EAAWtR,QAC3CsR,GAEGP,EACJA,EAAY,KAAMpN,EAAS2N,EAAYhF,GAEvC5M,EAAKsD,MAAOW,EAAS2N,KAMzB,QAASC,IAAmB7B,GAwB3B,IAvBA,GAAI8B,GAAcnE,EAAS9J,EAC1BxD,EAAM2P,EAAO1P,OACbyR,EAAkBjU,EAAK2N,SAAUuE,EAAO,GAAG5I,MAC3C4K,EAAmBD,GAAmBjU,EAAK2N,SAAS,KACpD7N,EAAImU,EAAkB,EAAI,EAG1BE,EAAe/O,GAAe,SAAU9C,GACvC,MAAOA,KAAS0R,GACdE,GAAkB,GACrBE,EAAkBhP,GAAe,SAAU9C,GAC1C,MAAOF,GAAS4R,EAAc1R,OAC5B4R,GAAkB,GACrBpB,GAAa,SAAUxQ,EAAM4D,EAAS4I,GACrC,GAAIxC,IAAS2H,IAAqBnF,GAAO5I,IAAY5F,MACnD0T,EAAe9N,GAASP,SACxBwO,EAAc7R,EAAM4D,EAAS4I,GAC7BsF,EAAiB9R,EAAM4D,EAAS4I,GAGlC,OADAkF,GAAe,KACR1H,IAGDxM,EAAIyC,EAAKzC,IAChB,GAAM+P,EAAU7P,EAAK2N,SAAUuE,EAAOpS,GAAGwJ,MACxCwJ,GAAa1N,GAAcyN,GAAgBC,GAAYjD,QACjD,CAIN,GAHAA,EAAU7P,EAAK4K,OAAQsH,EAAOpS,GAAGwJ,MAAO9D,MAAO,KAAM0M,EAAOpS,GAAGiB,SAG1D8O,EAAS5O,GAAY,CAGzB,IADA8E,IAAMjG,EACEiG,EAAIxD,EAAKwD,IAChB,GAAK/F,EAAK2N,SAAUuE,EAAOnM,GAAGuD,MAC7B,KAGF,OAAO+J,IACNvT,EAAI,GAAK+S,GAAgBC,GACzBhT,EAAI,GAAK0H,GAER0K,EAAO/P,MAAO,EAAGrC,EAAI,GAAIuU,QAASnM,MAAgC,MAAzBgK,EAAQpS,EAAI,GAAIwJ,KAAe,IAAM,MAC7EhC,QAAStE,EAAO,MAClB6M,EACA/P,EAAIiG,GAAKgO,GAAmB7B,EAAO/P,MAAOrC,EAAGiG,IAC7CA,EAAIxD,GAAOwR,GAAoB7B,EAASA,EAAO/P,MAAO4D,IACtDA,EAAIxD,GAAOiF,GAAY0K,IAGzBY,EAAS5Q,KAAM2N,GAIjB,MAAOgD,IAAgBC,GAGxB,QAASwB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYhS,OAAS,EAChCkS,EAAYH,EAAgB/R,OAAS,EACrCmS,EAAe,SAAUvO,EAAMF,EAAS4I,EAAK3I,EAASyO,GACrD,GAAItS,GAAMyD,EAAG8J,EACZgF,EAAe,EACf/U,EAAI,IACJgQ,EAAY1J,MACZ0O,KACAC,EAAgBzU,EAEhB0K,EAAQ5E,GAAQsO,GAAa1U,EAAK8K,KAAU,IAAG,IAAK8J,GAEpDI,EAAiB5T,GAA4B,MAAjB2T,EAAwB,EAAIE,KAAKC,UAAY,GACzE3S,EAAMyI,EAAMxI,MASb,KAPKoS,IACJtU,EAAmB4F,IAAYxF,GAAYwF,GAAW0O,GAM/C9U,IAAMyC,GAA4B,OAApBD,EAAO0I,EAAMlL,IAAaA,IAAM,CACrD,GAAK4U,GAAapS,EAAO,CACxByD,EAAI,EACEG,GAAW5D,EAAKqE,gBAAkBjG,IACvCD,EAAa6B,GACbwM,GAAOlO,EAER,OAASiP,EAAU0E,EAAgBxO,KAClC,GAAK8J,EAASvN,EAAM4D,GAAWxF,EAAUoO,GAAO,CAC/C3I,EAAQjE,KAAMI,EACd,OAGGsS,IACJxT,EAAU4T,GAKPP,KAEEnS,GAAQuN,GAAWvN,IACxBuS,IAIIzO,GACJ0J,EAAU5N,KAAMI,IAgBnB,GATAuS,GAAgB/U,EASX2U,GAAS3U,IAAM+U,EAAe,CAClC9O,EAAI,CACJ,OAAS8J,EAAU2E,EAAYzO,KAC9B8J,EAASC,EAAWgF,EAAY5O,EAAS4I,EAG1C,IAAK1I,EAAO,CAEX,GAAKyO,EAAe,EACnB,MAAQ/U,IACAgQ,EAAUhQ,IAAMgV,EAAWhV,KACjCgV,EAAWhV,GAAKkC,EAAIyD,KAAMU,GAM7B2O,GAAa7B,GAAU6B,GAIxB5S,EAAKsD,MAAOW,EAAS2O,GAGhBF,IAAcxO,GAAQ0O,EAAWtS,OAAS,GAC5CqS,EAAeL,EAAYhS,OAAW,GAExCwD,GAAOgH,WAAY7G,GAUrB,MALKyO,KACJxT,EAAU4T,EACV1U,EAAmByU,GAGbjF,EAGT,OAAO2E,GACNpM,GAAcsM,GACdA,EAGFvU,EAAU4F,GAAO5F,QAAU,SAAU6F,EAAUM,GAC9C,GAAIzG,GACH0U,KACAD,KACAlC,EAAS5Q,EAAewE,EAAW,IAEpC,KAAMoM,EAAS,CAER9L,IACLA,EAAQpG,EAAU8F,IAEnBnG,EAAIyG,EAAM/D,MACV,OAAQ1C,IACPuS,EAAS0B,GAAmBxN,EAAMzG,IAC7BuS,EAAQpR,GACZuT,EAAYtS,KAAMmQ,GAElBkC,EAAgBrS,KAAMmQ,EAKxBA,GAAS5Q,EAAewE,EAAUqO,GAA0BC,EAAiBC,IAG7EnC,EAAOpM,SAAWA,EAEnB,MAAOoM,IAYRhS,EAAS2F,GAAO3F,OAAS,SAAU4F,EAAUC,EAASC,EAASC,GAC9D,GAAItG,GAAGoS,EAAQiD,EAAO7L,EAAMwB,EAC3BsK,EAA+B,kBAAbnP,IAA2BA,EAC7CM,GAASH,GAAQjG,EAAW8F,EAAWmP,EAASnP,UAAYA,EAM7D,IAJAE,EAAUA,MAIY,IAAjBI,EAAM/D,OAAe,CAIzB,GADA0P,EAAS3L,EAAM,GAAKA,EAAM,GAAGpE,MAAO,GAC/B+P,EAAO1P,OAAS,GAAkC,QAA5B2S,EAAQjD,EAAO,IAAI5I,MACvB,IAArBpD,EAAQP,UAAkB/E,GAAkBZ,EAAK2N,SAAUuE,EAAO,GAAG5I,MAAS,CAG/E,GADApD,GAAYlG,EAAK8K,KAAS,GAAGqK,EAAMpU,QAAQ,GAAGuG,QAAQlD,EAAWC,IAAY6B,QAAkB,IACzFA,EACL,MAAOC,EAGIiP,KACXlP,EAAUA,EAAQyB,YAGnB1B,EAAWA,EAAS9D,MAAO+P,EAAO9J,QAAQF,MAAM1F,QAIjD1C,EAAIwD,EAAwB,aAAE4D,KAAMjB,GAAa,EAAIiM,EAAO1P,MAC5D,OAAQ1C,IAAM,CAIb,GAHAqV,EAAQjD,EAAOpS,GAGVE,EAAK2N,SAAWrE,EAAO6L,EAAM7L,MACjC,KAED,KAAMwB,EAAO9K,EAAK8K,KAAMxB,MAEjBlD,EAAO0E,EACZqK,EAAMpU,QAAQ,GAAGuG,QAASlD,EAAWC,IACrCF,EAAS+C,KAAMgL,EAAO,GAAG5I,OAAU5B,GAAaxB,EAAQyB,aAAgBzB,IACpE,CAKJ,GAFAgM,EAAO7E,OAAQvN,EAAG,GAClBmG,EAAWG,EAAK5D,QAAUgF,GAAY0K,IAChCjM,EAEL,MADA/D,GAAKsD,MAAOW,EAASC,GACdD,CAGR,SAeJ,OAPEiP,GAAYhV,EAAS6F,EAAUM,IAChCH,EACAF,GACCtF,EACDuF,GACCD,GAAW/B,EAAS+C,KAAMjB,IAAcyB,GAAaxB,EAAQyB,aAAgBzB,GAExEC,GAMRpG,EAAQoN,WAAalM,EAAQ6H,MAAM,IAAIsE,KAAM1L,GAAY+F,KAAK,MAAQxG,EAItElB,EAAQmN,mBAAqB1M,EAG7BC,IAIAV,EAAQgM,aAAexD,GAAO,SAAUC,GAEvC,MAA0E,GAAnEA,EAAGmD,wBAAyBjL,EAAS+H,cAAc,eAMrDF,GAAO,SAAUC,GAEtB,MADAA,GAAG2C,UAAY,mBAC+B,MAAvC3C,EAAG+E,WAAWlG,aAAa,WAElCsB,GAAW,yBAA0B,SAAUrG,EAAMiH,EAAMrJ,GAC1D,IAAMA,EACL,MAAOoC,GAAK+E,aAAckC,EAA6B,SAAvBA,EAAKnC,cAA2B,EAAI,KAOjErH,EAAQ6C,YAAe2F,GAAO,SAAUC,GAG7C,MAFAA,GAAG2C,UAAY,WACf3C,EAAG+E,WAAWhG,aAAc,QAAS,IACY,KAA1CiB,EAAG+E,WAAWlG,aAAc,YAEnCsB,GAAW,QAAS,SAAUrG,EAAMiH,EAAMrJ,GACzC,IAAMA,GAAyC,UAAhCoC,EAAK6E,SAASC,cAC5B,MAAO9E,GAAK+S,eAOT9M,GAAO,SAAUC,GACtB,MAAsC,OAA/BA,EAAGnB,aAAa,eAEvBsB,GAAWlG,EAAU,SAAUH,EAAMiH,EAAMrJ,GAC1C,GAAIsM,EACJ,KAAMtM,EACL,MAAOoC,GAAMiH,MAAW,EAAOA,EAAKnC,eACjCoF,EAAMlK,EAAKyI,iBAAkBxB,KAAWiD,EAAIE,UAC7CF,EAAItE,MACL,MAMJ,IAAIoN,IAAUzV,EAAOmG,MAErBA,IAAOuP,WAAa,WAKnB,MAJK1V,GAAOmG,SAAWA,KACtBnG,EAAOmG,OAASsP,IAGVtP,IAGe,kBAAXwP,SAAyBA,OAAOC,IAC3CD,OAAO,WAAa,MAAOxP,MAEE,mBAAX0P,SAA0BA,OAAOC,QACnDD,OAAOC,QAAU3P,GAEjBnG,EAAOmG,OAASA,IAIbnG","file":"sizzle.min.js"}
        \ No newline at end of file
        diff --git a/bower_components/jquery/src/.eslintrc.json b/bower_components/jquery/src/.eslintrc.json
        new file mode 100644
        index 0000000000..dbf16c5846
        --- /dev/null
        +++ b/bower_components/jquery/src/.eslintrc.json
        @@ -0,0 +1,18 @@
        +{
        +	// Support: IE <=9 only, Android <=4.0 only
        +	// The above browsers are failing a lot of tests in the ES5
        +	// test suite at http://test262.ecmascript.org.
        +	"parserOptions": {
        +		"ecmaVersion": 3
        +	},
        +	"globals": {
        +		"window": true,
        +		"jQuery": true,
        +		"define": true,
        +		"module": true,
        +		"noGlobal": true
        +	},
        +	"rules": {
        +		"strict": ["error", "function"]
        +	}
        +}
        diff --git a/bower_components/jquery/src/ajax.js b/bower_components/jquery/src/ajax.js
        new file mode 100644
        index 0000000000..36f707d7d1
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax.js
        @@ -0,0 +1,855 @@
        +define( [
        +	"./core",
        +	"./var/document",
        +	"./var/rnothtmlwhite",
        +	"./ajax/var/location",
        +	"./ajax/var/nonce",
        +	"./ajax/var/rquery",
        +
        +	"./core/init",
        +	"./ajax/parseXML",
        +	"./event/trigger",
        +	"./deferred",
        +	"./serialize" // jQuery.param
        +], function( jQuery, document, rnothtmlwhite, location, nonce, rquery ) {
        +
        +"use strict";
        +
        +var
        +	r20 = /%20/g,
        +	rhash = /#.*$/,
        +	rantiCache = /([?&])_=[^&]*/,
        +	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
        +
        +	// #7653, #8125, #8152: local protocol detection
        +	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        +	rnoContent = /^(?:GET|HEAD)$/,
        +	rprotocol = /^\/\//,
        +
        +	/* Prefilters
        +	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
        +	 * 2) These are called:
        +	 *    - BEFORE asking for a transport
        +	 *    - AFTER param serialization (s.data is a string if s.processData is true)
        +	 * 3) key is the dataType
        +	 * 4) the catchall symbol "*" can be used
        +	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
        +	 */
        +	prefilters = {},
        +
        +	/* Transports bindings
        +	 * 1) key is the dataType
        +	 * 2) the catchall symbol "*" can be used
        +	 * 3) selection will start with transport dataType and THEN go to "*" if needed
        +	 */
        +	transports = {},
        +
        +	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        +	allTypes = "*/".concat( "*" ),
        +
        +	// Anchor tag for parsing the document origin
        +	originAnchor = document.createElement( "a" );
        +	originAnchor.href = location.href;
        +
        +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
        +function addToPrefiltersOrTransports( structure ) {
        +
        +	// dataTypeExpression is optional and defaults to "*"
        +	return function( dataTypeExpression, func ) {
        +
        +		if ( typeof dataTypeExpression !== "string" ) {
        +			func = dataTypeExpression;
        +			dataTypeExpression = "*";
        +		}
        +
        +		var dataType,
        +			i = 0,
        +			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
        +
        +		if ( jQuery.isFunction( func ) ) {
        +
        +			// For each dataType in the dataTypeExpression
        +			while ( ( dataType = dataTypes[ i++ ] ) ) {
        +
        +				// Prepend if requested
        +				if ( dataType[ 0 ] === "+" ) {
        +					dataType = dataType.slice( 1 ) || "*";
        +					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
        +
        +				// Otherwise append
        +				} else {
        +					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
        +				}
        +			}
        +		}
        +	};
        +}
        +
        +// Base inspection function for prefilters and transports
        +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
        +
        +	var inspected = {},
        +		seekingTransport = ( structure === transports );
        +
        +	function inspect( dataType ) {
        +		var selected;
        +		inspected[ dataType ] = true;
        +		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
        +			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
        +			if ( typeof dataTypeOrTransport === "string" &&
        +				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
        +
        +				options.dataTypes.unshift( dataTypeOrTransport );
        +				inspect( dataTypeOrTransport );
        +				return false;
        +			} else if ( seekingTransport ) {
        +				return !( selected = dataTypeOrTransport );
        +			}
        +		} );
        +		return selected;
        +	}
        +
        +	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
        +}
        +
        +// A special extend for ajax options
        +// that takes "flat" options (not to be deep extended)
        +// Fixes #9887
        +function ajaxExtend( target, src ) {
        +	var key, deep,
        +		flatOptions = jQuery.ajaxSettings.flatOptions || {};
        +
        +	for ( key in src ) {
        +		if ( src[ key ] !== undefined ) {
        +			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
        +		}
        +	}
        +	if ( deep ) {
        +		jQuery.extend( true, target, deep );
        +	}
        +
        +	return target;
        +}
        +
        +/* Handles responses to an ajax request:
        + * - finds the right dataType (mediates between content-type and expected dataType)
        + * - returns the corresponding response
        + */
        +function ajaxHandleResponses( s, jqXHR, responses ) {
        +
        +	var ct, type, finalDataType, firstDataType,
        +		contents = s.contents,
        +		dataTypes = s.dataTypes;
        +
        +	// Remove auto dataType and get content-type in the process
        +	while ( dataTypes[ 0 ] === "*" ) {
        +		dataTypes.shift();
        +		if ( ct === undefined ) {
        +			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
        +		}
        +	}
        +
        +	// Check if we're dealing with a known content-type
        +	if ( ct ) {
        +		for ( type in contents ) {
        +			if ( contents[ type ] && contents[ type ].test( ct ) ) {
        +				dataTypes.unshift( type );
        +				break;
        +			}
        +		}
        +	}
        +
        +	// Check to see if we have a response for the expected dataType
        +	if ( dataTypes[ 0 ] in responses ) {
        +		finalDataType = dataTypes[ 0 ];
        +	} else {
        +
        +		// Try convertible dataTypes
        +		for ( type in responses ) {
        +			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
        +				finalDataType = type;
        +				break;
        +			}
        +			if ( !firstDataType ) {
        +				firstDataType = type;
        +			}
        +		}
        +
        +		// Or just use first one
        +		finalDataType = finalDataType || firstDataType;
        +	}
        +
        +	// If we found a dataType
        +	// We add the dataType to the list if needed
        +	// and return the corresponding response
        +	if ( finalDataType ) {
        +		if ( finalDataType !== dataTypes[ 0 ] ) {
        +			dataTypes.unshift( finalDataType );
        +		}
        +		return responses[ finalDataType ];
        +	}
        +}
        +
        +/* Chain conversions given the request and the original response
        + * Also sets the responseXXX fields on the jqXHR instance
        + */
        +function ajaxConvert( s, response, jqXHR, isSuccess ) {
        +	var conv2, current, conv, tmp, prev,
        +		converters = {},
        +
        +		// Work with a copy of dataTypes in case we need to modify it for conversion
        +		dataTypes = s.dataTypes.slice();
        +
        +	// Create converters map with lowercased keys
        +	if ( dataTypes[ 1 ] ) {
        +		for ( conv in s.converters ) {
        +			converters[ conv.toLowerCase() ] = s.converters[ conv ];
        +		}
        +	}
        +
        +	current = dataTypes.shift();
        +
        +	// Convert to each sequential dataType
        +	while ( current ) {
        +
        +		if ( s.responseFields[ current ] ) {
        +			jqXHR[ s.responseFields[ current ] ] = response;
        +		}
        +
        +		// Apply the dataFilter if provided
        +		if ( !prev && isSuccess && s.dataFilter ) {
        +			response = s.dataFilter( response, s.dataType );
        +		}
        +
        +		prev = current;
        +		current = dataTypes.shift();
        +
        +		if ( current ) {
        +
        +			// There's only work to do if current dataType is non-auto
        +			if ( current === "*" ) {
        +
        +				current = prev;
        +
        +			// Convert response if prev dataType is non-auto and differs from current
        +			} else if ( prev !== "*" && prev !== current ) {
        +
        +				// Seek a direct converter
        +				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
        +
        +				// If none found, seek a pair
        +				if ( !conv ) {
        +					for ( conv2 in converters ) {
        +
        +						// If conv2 outputs current
        +						tmp = conv2.split( " " );
        +						if ( tmp[ 1 ] === current ) {
        +
        +							// If prev can be converted to accepted input
        +							conv = converters[ prev + " " + tmp[ 0 ] ] ||
        +								converters[ "* " + tmp[ 0 ] ];
        +							if ( conv ) {
        +
        +								// Condense equivalence converters
        +								if ( conv === true ) {
        +									conv = converters[ conv2 ];
        +
        +								// Otherwise, insert the intermediate dataType
        +								} else if ( converters[ conv2 ] !== true ) {
        +									current = tmp[ 0 ];
        +									dataTypes.unshift( tmp[ 1 ] );
        +								}
        +								break;
        +							}
        +						}
        +					}
        +				}
        +
        +				// Apply converter (if not an equivalence)
        +				if ( conv !== true ) {
        +
        +					// Unless errors are allowed to bubble, catch and return them
        +					if ( conv && s.throws ) {
        +						response = conv( response );
        +					} else {
        +						try {
        +							response = conv( response );
        +						} catch ( e ) {
        +							return {
        +								state: "parsererror",
        +								error: conv ? e : "No conversion from " + prev + " to " + current
        +							};
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	return { state: "success", data: response };
        +}
        +
        +jQuery.extend( {
        +
        +	// Counter for holding the number of active queries
        +	active: 0,
        +
        +	// Last-Modified header cache for next request
        +	lastModified: {},
        +	etag: {},
        +
        +	ajaxSettings: {
        +		url: location.href,
        +		type: "GET",
        +		isLocal: rlocalProtocol.test( location.protocol ),
        +		global: true,
        +		processData: true,
        +		async: true,
        +		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        +
        +		/*
        +		timeout: 0,
        +		data: null,
        +		dataType: null,
        +		username: null,
        +		password: null,
        +		cache: null,
        +		throws: false,
        +		traditional: false,
        +		headers: {},
        +		*/
        +
        +		accepts: {
        +			"*": allTypes,
        +			text: "text/plain",
        +			html: "text/html",
        +			xml: "application/xml, text/xml",
        +			json: "application/json, text/javascript"
        +		},
        +
        +		contents: {
        +			xml: /\bxml\b/,
        +			html: /\bhtml/,
        +			json: /\bjson\b/
        +		},
        +
        +		responseFields: {
        +			xml: "responseXML",
        +			text: "responseText",
        +			json: "responseJSON"
        +		},
        +
        +		// Data converters
        +		// Keys separate source (or catchall "*") and destination types with a single space
        +		converters: {
        +
        +			// Convert anything to text
        +			"* text": String,
        +
        +			// Text to html (true = no transformation)
        +			"text html": true,
        +
        +			// Evaluate text as a json expression
        +			"text json": JSON.parse,
        +
        +			// Parse text as xml
        +			"text xml": jQuery.parseXML
        +		},
        +
        +		// For options that shouldn't be deep extended:
        +		// you can add your own custom options here if
        +		// and when you create one that shouldn't be
        +		// deep extended (see ajaxExtend)
        +		flatOptions: {
        +			url: true,
        +			context: true
        +		}
        +	},
        +
        +	// Creates a full fledged settings object into target
        +	// with both ajaxSettings and settings fields.
        +	// If target is omitted, writes into ajaxSettings.
        +	ajaxSetup: function( target, settings ) {
        +		return settings ?
        +
        +			// Building a settings object
        +			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
        +
        +			// Extending ajaxSettings
        +			ajaxExtend( jQuery.ajaxSettings, target );
        +	},
        +
        +	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        +	ajaxTransport: addToPrefiltersOrTransports( transports ),
        +
        +	// Main method
        +	ajax: function( url, options ) {
        +
        +		// If url is an object, simulate pre-1.5 signature
        +		if ( typeof url === "object" ) {
        +			options = url;
        +			url = undefined;
        +		}
        +
        +		// Force options to be an object
        +		options = options || {};
        +
        +		var transport,
        +
        +			// URL without anti-cache param
        +			cacheURL,
        +
        +			// Response headers
        +			responseHeadersString,
        +			responseHeaders,
        +
        +			// timeout handle
        +			timeoutTimer,
        +
        +			// Url cleanup var
        +			urlAnchor,
        +
        +			// Request state (becomes false upon send and true upon completion)
        +			completed,
        +
        +			// To know if global events are to be dispatched
        +			fireGlobals,
        +
        +			// Loop variable
        +			i,
        +
        +			// uncached part of the url
        +			uncached,
        +
        +			// Create the final options object
        +			s = jQuery.ajaxSetup( {}, options ),
        +
        +			// Callbacks context
        +			callbackContext = s.context || s,
        +
        +			// Context for global events is callbackContext if it is a DOM node or jQuery collection
        +			globalEventContext = s.context &&
        +				( callbackContext.nodeType || callbackContext.jquery ) ?
        +					jQuery( callbackContext ) :
        +					jQuery.event,
        +
        +			// Deferreds
        +			deferred = jQuery.Deferred(),
        +			completeDeferred = jQuery.Callbacks( "once memory" ),
        +
        +			// Status-dependent callbacks
        +			statusCode = s.statusCode || {},
        +
        +			// Headers (they are sent all at once)
        +			requestHeaders = {},
        +			requestHeadersNames = {},
        +
        +			// Default abort message
        +			strAbort = "canceled",
        +
        +			// Fake xhr
        +			jqXHR = {
        +				readyState: 0,
        +
        +				// Builds headers hashtable if needed
        +				getResponseHeader: function( key ) {
        +					var match;
        +					if ( completed ) {
        +						if ( !responseHeaders ) {
        +							responseHeaders = {};
        +							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
        +								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
        +							}
        +						}
        +						match = responseHeaders[ key.toLowerCase() ];
        +					}
        +					return match == null ? null : match;
        +				},
        +
        +				// Raw string
        +				getAllResponseHeaders: function() {
        +					return completed ? responseHeadersString : null;
        +				},
        +
        +				// Caches the header
        +				setRequestHeader: function( name, value ) {
        +					if ( completed == null ) {
        +						name = requestHeadersNames[ name.toLowerCase() ] =
        +							requestHeadersNames[ name.toLowerCase() ] || name;
        +						requestHeaders[ name ] = value;
        +					}
        +					return this;
        +				},
        +
        +				// Overrides response content-type header
        +				overrideMimeType: function( type ) {
        +					if ( completed == null ) {
        +						s.mimeType = type;
        +					}
        +					return this;
        +				},
        +
        +				// Status-dependent callbacks
        +				statusCode: function( map ) {
        +					var code;
        +					if ( map ) {
        +						if ( completed ) {
        +
        +							// Execute the appropriate callbacks
        +							jqXHR.always( map[ jqXHR.status ] );
        +						} else {
        +
        +							// Lazy-add the new callbacks in a way that preserves old ones
        +							for ( code in map ) {
        +								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
        +							}
        +						}
        +					}
        +					return this;
        +				},
        +
        +				// Cancel the request
        +				abort: function( statusText ) {
        +					var finalText = statusText || strAbort;
        +					if ( transport ) {
        +						transport.abort( finalText );
        +					}
        +					done( 0, finalText );
        +					return this;
        +				}
        +			};
        +
        +		// Attach deferreds
        +		deferred.promise( jqXHR );
        +
        +		// Add protocol if not provided (prefilters might expect it)
        +		// Handle falsy url in the settings object (#10093: consistency with old signature)
        +		// We also use the url parameter if available
        +		s.url = ( ( url || s.url || location.href ) + "" )
        +			.replace( rprotocol, location.protocol + "//" );
        +
        +		// Alias method option to type as per ticket #12004
        +		s.type = options.method || options.type || s.method || s.type;
        +
        +		// Extract dataTypes list
        +		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
        +
        +		// A cross-domain request is in order when the origin doesn't match the current origin.
        +		if ( s.crossDomain == null ) {
        +			urlAnchor = document.createElement( "a" );
        +
        +			// Support: IE <=8 - 11, Edge 12 - 13
        +			// IE throws exception on accessing the href property if url is malformed,
        +			// e.g. http://example.com:80x/
        +			try {
        +				urlAnchor.href = s.url;
        +
        +				// Support: IE <=8 - 11 only
        +				// Anchor's host property isn't correctly set when s.url is relative
        +				urlAnchor.href = urlAnchor.href;
        +				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
        +					urlAnchor.protocol + "//" + urlAnchor.host;
        +			} catch ( e ) {
        +
        +				// If there is an error parsing the URL, assume it is crossDomain,
        +				// it can be rejected by the transport if it is invalid
        +				s.crossDomain = true;
        +			}
        +		}
        +
        +		// Convert data if not already a string
        +		if ( s.data && s.processData && typeof s.data !== "string" ) {
        +			s.data = jQuery.param( s.data, s.traditional );
        +		}
        +
        +		// Apply prefilters
        +		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
        +
        +		// If request was aborted inside a prefilter, stop there
        +		if ( completed ) {
        +			return jqXHR;
        +		}
        +
        +		// We can fire global events as of now if asked to
        +		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
        +		fireGlobals = jQuery.event && s.global;
        +
        +		// Watch for a new set of requests
        +		if ( fireGlobals && jQuery.active++ === 0 ) {
        +			jQuery.event.trigger( "ajaxStart" );
        +		}
        +
        +		// Uppercase the type
        +		s.type = s.type.toUpperCase();
        +
        +		// Determine if request has content
        +		s.hasContent = !rnoContent.test( s.type );
        +
        +		// Save the URL in case we're toying with the If-Modified-Since
        +		// and/or If-None-Match header later on
        +		// Remove hash to simplify url manipulation
        +		cacheURL = s.url.replace( rhash, "" );
        +
        +		// More options handling for requests with no content
        +		if ( !s.hasContent ) {
        +
        +			// Remember the hash so we can put it back
        +			uncached = s.url.slice( cacheURL.length );
        +
        +			// If data is available, append data to url
        +			if ( s.data ) {
        +				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
        +
        +				// #9682: remove data so that it's not used in an eventual retry
        +				delete s.data;
        +			}
        +
        +			// Add or update anti-cache param if needed
        +			if ( s.cache === false ) {
        +				cacheURL = cacheURL.replace( rantiCache, "$1" );
        +				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
        +			}
        +
        +			// Put hash and anti-cache on the URL that will be requested (gh-1732)
        +			s.url = cacheURL + uncached;
        +
        +		// Change '%20' to '+' if this is encoded form body content (gh-2658)
        +		} else if ( s.data && s.processData &&
        +			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
        +			s.data = s.data.replace( r20, "+" );
        +		}
        +
        +		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +		if ( s.ifModified ) {
        +			if ( jQuery.lastModified[ cacheURL ] ) {
        +				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
        +			}
        +			if ( jQuery.etag[ cacheURL ] ) {
        +				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
        +			}
        +		}
        +
        +		// Set the correct header, if data is being sent
        +		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
        +			jqXHR.setRequestHeader( "Content-Type", s.contentType );
        +		}
        +
        +		// Set the Accepts header for the server, depending on the dataType
        +		jqXHR.setRequestHeader(
        +			"Accept",
        +			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
        +				s.accepts[ s.dataTypes[ 0 ] ] +
        +					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
        +				s.accepts[ "*" ]
        +		);
        +
        +		// Check for headers option
        +		for ( i in s.headers ) {
        +			jqXHR.setRequestHeader( i, s.headers[ i ] );
        +		}
        +
        +		// Allow custom headers/mimetypes and early abort
        +		if ( s.beforeSend &&
        +			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
        +
        +			// Abort if not done already and return
        +			return jqXHR.abort();
        +		}
        +
        +		// Aborting is no longer a cancellation
        +		strAbort = "abort";
        +
        +		// Install callbacks on deferreds
        +		completeDeferred.add( s.complete );
        +		jqXHR.done( s.success );
        +		jqXHR.fail( s.error );
        +
        +		// Get transport
        +		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
        +
        +		// If no transport, we auto-abort
        +		if ( !transport ) {
        +			done( -1, "No Transport" );
        +		} else {
        +			jqXHR.readyState = 1;
        +
        +			// Send global event
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
        +			}
        +
        +			// If request was aborted inside ajaxSend, stop there
        +			if ( completed ) {
        +				return jqXHR;
        +			}
        +
        +			// Timeout
        +			if ( s.async && s.timeout > 0 ) {
        +				timeoutTimer = window.setTimeout( function() {
        +					jqXHR.abort( "timeout" );
        +				}, s.timeout );
        +			}
        +
        +			try {
        +				completed = false;
        +				transport.send( requestHeaders, done );
        +			} catch ( e ) {
        +
        +				// Rethrow post-completion exceptions
        +				if ( completed ) {
        +					throw e;
        +				}
        +
        +				// Propagate others as results
        +				done( -1, e );
        +			}
        +		}
        +
        +		// Callback for when everything is done
        +		function done( status, nativeStatusText, responses, headers ) {
        +			var isSuccess, success, error, response, modified,
        +				statusText = nativeStatusText;
        +
        +			// Ignore repeat invocations
        +			if ( completed ) {
        +				return;
        +			}
        +
        +			completed = true;
        +
        +			// Clear timeout if it exists
        +			if ( timeoutTimer ) {
        +				window.clearTimeout( timeoutTimer );
        +			}
        +
        +			// Dereference transport for early garbage collection
        +			// (no matter how long the jqXHR object will be used)
        +			transport = undefined;
        +
        +			// Cache response headers
        +			responseHeadersString = headers || "";
        +
        +			// Set readyState
        +			jqXHR.readyState = status > 0 ? 4 : 0;
        +
        +			// Determine if successful
        +			isSuccess = status >= 200 && status < 300 || status === 304;
        +
        +			// Get response data
        +			if ( responses ) {
        +				response = ajaxHandleResponses( s, jqXHR, responses );
        +			}
        +
        +			// Convert no matter what (that way responseXXX fields are always set)
        +			response = ajaxConvert( s, response, jqXHR, isSuccess );
        +
        +			// If successful, handle type chaining
        +			if ( isSuccess ) {
        +
        +				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +				if ( s.ifModified ) {
        +					modified = jqXHR.getResponseHeader( "Last-Modified" );
        +					if ( modified ) {
        +						jQuery.lastModified[ cacheURL ] = modified;
        +					}
        +					modified = jqXHR.getResponseHeader( "etag" );
        +					if ( modified ) {
        +						jQuery.etag[ cacheURL ] = modified;
        +					}
        +				}
        +
        +				// if no content
        +				if ( status === 204 || s.type === "HEAD" ) {
        +					statusText = "nocontent";
        +
        +				// if not modified
        +				} else if ( status === 304 ) {
        +					statusText = "notmodified";
        +
        +				// If we have data, let's convert it
        +				} else {
        +					statusText = response.state;
        +					success = response.data;
        +					error = response.error;
        +					isSuccess = !error;
        +				}
        +			} else {
        +
        +				// Extract error from statusText and normalize for non-aborts
        +				error = statusText;
        +				if ( status || !statusText ) {
        +					statusText = "error";
        +					if ( status < 0 ) {
        +						status = 0;
        +					}
        +				}
        +			}
        +
        +			// Set data for the fake xhr object
        +			jqXHR.status = status;
        +			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
        +
        +			// Success/Error
        +			if ( isSuccess ) {
        +				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
        +			} else {
        +				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
        +			}
        +
        +			// Status-dependent callbacks
        +			jqXHR.statusCode( statusCode );
        +			statusCode = undefined;
        +
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
        +					[ jqXHR, s, isSuccess ? success : error ] );
        +			}
        +
        +			// Complete
        +			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
        +
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
        +
        +				// Handle the global AJAX counter
        +				if ( !( --jQuery.active ) ) {
        +					jQuery.event.trigger( "ajaxStop" );
        +				}
        +			}
        +		}
        +
        +		return jqXHR;
        +	},
        +
        +	getJSON: function( url, data, callback ) {
        +		return jQuery.get( url, data, callback, "json" );
        +	},
        +
        +	getScript: function( url, callback ) {
        +		return jQuery.get( url, undefined, callback, "script" );
        +	}
        +} );
        +
        +jQuery.each( [ "get", "post" ], function( i, method ) {
        +	jQuery[ method ] = function( url, data, callback, type ) {
        +
        +		// Shift arguments if data argument was omitted
        +		if ( jQuery.isFunction( data ) ) {
        +			type = type || callback;
        +			callback = data;
        +			data = undefined;
        +		}
        +
        +		// The url can be an options object (which then must have .url)
        +		return jQuery.ajax( jQuery.extend( {
        +			url: url,
        +			type: method,
        +			dataType: type,
        +			data: data,
        +			success: callback
        +		}, jQuery.isPlainObject( url ) && url ) );
        +	};
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/ajax/jsonp.js b/bower_components/jquery/src/ajax/jsonp.js
        new file mode 100644
        index 0000000000..8c406e7223
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/jsonp.js
        @@ -0,0 +1,102 @@
        +define( [
        +	"../core",
        +	"./var/nonce",
        +	"./var/rquery",
        +	"../ajax"
        +], function( jQuery, nonce, rquery ) {
        +
        +"use strict";
        +
        +var oldCallbacks = [],
        +	rjsonp = /(=)\?(?=&|$)|\?\?/;
        +
        +// Default jsonp settings
        +jQuery.ajaxSetup( {
        +	jsonp: "callback",
        +	jsonpCallback: function() {
        +		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
        +		this[ callback ] = true;
        +		return callback;
        +	}
        +} );
        +
        +// Detect, normalize options and install callbacks for jsonp requests
        +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
        +
        +	var callbackName, overwritten, responseContainer,
        +		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
        +			"url" :
        +			typeof s.data === "string" &&
        +				( s.contentType || "" )
        +					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
        +				rjsonp.test( s.data ) && "data"
        +		);
        +
        +	// Handle iff the expected data type is "jsonp" or we have a parameter to set
        +	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
        +
        +		// Get callback name, remembering preexisting value associated with it
        +		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
        +			s.jsonpCallback() :
        +			s.jsonpCallback;
        +
        +		// Insert callback into url or form data
        +		if ( jsonProp ) {
        +			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
        +		} else if ( s.jsonp !== false ) {
        +			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
        +		}
        +
        +		// Use data converter to retrieve json after script execution
        +		s.converters[ "script json" ] = function() {
        +			if ( !responseContainer ) {
        +				jQuery.error( callbackName + " was not called" );
        +			}
        +			return responseContainer[ 0 ];
        +		};
        +
        +		// Force json dataType
        +		s.dataTypes[ 0 ] = "json";
        +
        +		// Install callback
        +		overwritten = window[ callbackName ];
        +		window[ callbackName ] = function() {
        +			responseContainer = arguments;
        +		};
        +
        +		// Clean-up function (fires after converters)
        +		jqXHR.always( function() {
        +
        +			// If previous value didn't exist - remove it
        +			if ( overwritten === undefined ) {
        +				jQuery( window ).removeProp( callbackName );
        +
        +			// Otherwise restore preexisting value
        +			} else {
        +				window[ callbackName ] = overwritten;
        +			}
        +
        +			// Save back as free
        +			if ( s[ callbackName ] ) {
        +
        +				// Make sure that re-using the options doesn't screw things around
        +				s.jsonpCallback = originalSettings.jsonpCallback;
        +
        +				// Save the callback name for future use
        +				oldCallbacks.push( callbackName );
        +			}
        +
        +			// Call if it was a function and we have a response
        +			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
        +				overwritten( responseContainer[ 0 ] );
        +			}
        +
        +			responseContainer = overwritten = undefined;
        +		} );
        +
        +		// Delegate to script
        +		return "script";
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/ajax/load.js b/bower_components/jquery/src/ajax/load.js
        new file mode 100644
        index 0000000000..3ce3a5aae7
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/load.js
        @@ -0,0 +1,76 @@
        +define( [
        +	"../core",
        +	"../core/stripAndCollapse",
        +	"../core/parseHTML",
        +	"../ajax",
        +	"../traversing",
        +	"../manipulation",
        +	"../selector"
        +], function( jQuery, stripAndCollapse ) {
        +
        +"use strict";
        +
        +/**
        + * Load a url into a page
        + */
        +jQuery.fn.load = function( url, params, callback ) {
        +	var selector, type, response,
        +		self = this,
        +		off = url.indexOf( " " );
        +
        +	if ( off > -1 ) {
        +		selector = stripAndCollapse( url.slice( off ) );
        +		url = url.slice( 0, off );
        +	}
        +
        +	// If it's a function
        +	if ( jQuery.isFunction( params ) ) {
        +
        +		// We assume that it's the callback
        +		callback = params;
        +		params = undefined;
        +
        +	// Otherwise, build a param string
        +	} else if ( params && typeof params === "object" ) {
        +		type = "POST";
        +	}
        +
        +	// If we have elements to modify, make the request
        +	if ( self.length > 0 ) {
        +		jQuery.ajax( {
        +			url: url,
        +
        +			// If "type" variable is undefined, then "GET" method will be used.
        +			// Make value of this field explicit since
        +			// user can override it through ajaxSetup method
        +			type: type || "GET",
        +			dataType: "html",
        +			data: params
        +		} ).done( function( responseText ) {
        +
        +			// Save response for use in complete callback
        +			response = arguments;
        +
        +			self.html( selector ?
        +
        +				// If a selector was specified, locate the right elements in a dummy div
        +				// Exclude scripts to avoid IE 'Permission Denied' errors
        +				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
        +
        +				// Otherwise use the full result
        +				responseText );
        +
        +		// If the request succeeds, this function gets "data", "status", "jqXHR"
        +		// but they are ignored because response was set above.
        +		// If it fails, this function gets "jqXHR", "status", "error"
        +		} ).always( callback && function( jqXHR, status ) {
        +			self.each( function() {
        +				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
        +			} );
        +		} );
        +	}
        +
        +	return this;
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/ajax/parseXML.js b/bower_components/jquery/src/ajax/parseXML.js
        new file mode 100644
        index 0000000000..acf7ab259f
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/parseXML.js
        @@ -0,0 +1,30 @@
        +define( [
        +	"../core"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +// Cross-browser xml parsing
        +jQuery.parseXML = function( data ) {
        +	var xml;
        +	if ( !data || typeof data !== "string" ) {
        +		return null;
        +	}
        +
        +	// Support: IE 9 - 11 only
        +	// IE throws on parseFromString with invalid input.
        +	try {
        +		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
        +	} catch ( e ) {
        +		xml = undefined;
        +	}
        +
        +	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
        +		jQuery.error( "Invalid XML: " + data );
        +	}
        +	return xml;
        +};
        +
        +return jQuery.parseXML;
        +
        +} );
        diff --git a/bower_components/jquery/src/ajax/script.js b/bower_components/jquery/src/ajax/script.js
        new file mode 100644
        index 0000000000..6e0d21e993
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/script.js
        @@ -0,0 +1,77 @@
        +define( [
        +	"../core",
        +	"../var/document",
        +	"../ajax"
        +], function( jQuery, document ) {
        +
        +"use strict";
        +
        +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
        +jQuery.ajaxPrefilter( function( s ) {
        +	if ( s.crossDomain ) {
        +		s.contents.script = false;
        +	}
        +} );
        +
        +// Install script dataType
        +jQuery.ajaxSetup( {
        +	accepts: {
        +		script: "text/javascript, application/javascript, " +
        +			"application/ecmascript, application/x-ecmascript"
        +	},
        +	contents: {
        +		script: /\b(?:java|ecma)script\b/
        +	},
        +	converters: {
        +		"text script": function( text ) {
        +			jQuery.globalEval( text );
        +			return text;
        +		}
        +	}
        +} );
        +
        +// Handle cache's special case and crossDomain
        +jQuery.ajaxPrefilter( "script", function( s ) {
        +	if ( s.cache === undefined ) {
        +		s.cache = false;
        +	}
        +	if ( s.crossDomain ) {
        +		s.type = "GET";
        +	}
        +} );
        +
        +// Bind script tag hack transport
        +jQuery.ajaxTransport( "script", function( s ) {
        +
        +	// This transport only deals with cross domain requests
        +	if ( s.crossDomain ) {
        +		var script, callback;
        +		return {
        +			send: function( _, complete ) {
        +				script = jQuery( "<script>" ).prop( {
        +					charset: s.scriptCharset,
        +					src: s.url
        +				} ).on(
        +					"load error",
        +					callback = function( evt ) {
        +						script.remove();
        +						callback = null;
        +						if ( evt ) {
        +							complete( evt.type === "error" ? 404 : 200, evt.type );
        +						}
        +					}
        +				);
        +
        +				// Use native DOM manipulation to avoid our domManip AJAX trickery
        +				document.head.appendChild( script[ 0 ] );
        +			},
        +			abort: function() {
        +				if ( callback ) {
        +					callback();
        +				}
        +			}
        +		};
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/ajax/var/location.js b/bower_components/jquery/src/ajax/var/location.js
        new file mode 100644
        index 0000000000..4171d18c36
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/var/location.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return window.location;
        +} );
        diff --git a/bower_components/jquery/src/ajax/var/nonce.js b/bower_components/jquery/src/ajax/var/nonce.js
        new file mode 100644
        index 0000000000..6e23708a80
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/var/nonce.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"../../core"
        +], function( jQuery ) {
        +	"use strict";
        +
        +	return jQuery.now();
        +} );
        diff --git a/bower_components/jquery/src/ajax/var/rquery.js b/bower_components/jquery/src/ajax/var/rquery.js
        new file mode 100644
        index 0000000000..06fc37439c
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/var/rquery.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return ( /\?/ );
        +} );
        diff --git a/bower_components/jquery/src/ajax/xhr.js b/bower_components/jquery/src/ajax/xhr.js
        new file mode 100644
        index 0000000000..33dafb01d3
        --- /dev/null
        +++ b/bower_components/jquery/src/ajax/xhr.js
        @@ -0,0 +1,169 @@
        +define( [
        +	"../core",
        +	"../var/support",
        +	"../ajax"
        +], function( jQuery, support ) {
        +
        +"use strict";
        +
        +jQuery.ajaxSettings.xhr = function() {
        +	try {
        +		return new window.XMLHttpRequest();
        +	} catch ( e ) {}
        +};
        +
        +var xhrSuccessStatus = {
        +
        +		// File protocol always yields status code 0, assume 200
        +		0: 200,
        +
        +		// Support: IE <=9 only
        +		// #1450: sometimes IE returns 1223 when it should be 204
        +		1223: 204
        +	},
        +	xhrSupported = jQuery.ajaxSettings.xhr();
        +
        +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
        +support.ajax = xhrSupported = !!xhrSupported;
        +
        +jQuery.ajaxTransport( function( options ) {
        +	var callback, errorCallback;
        +
        +	// Cross domain only allowed if supported through XMLHttpRequest
        +	if ( support.cors || xhrSupported && !options.crossDomain ) {
        +		return {
        +			send: function( headers, complete ) {
        +				var i,
        +					xhr = options.xhr();
        +
        +				xhr.open(
        +					options.type,
        +					options.url,
        +					options.async,
        +					options.username,
        +					options.password
        +				);
        +
        +				// Apply custom fields if provided
        +				if ( options.xhrFields ) {
        +					for ( i in options.xhrFields ) {
        +						xhr[ i ] = options.xhrFields[ i ];
        +					}
        +				}
        +
        +				// Override mime type if needed
        +				if ( options.mimeType && xhr.overrideMimeType ) {
        +					xhr.overrideMimeType( options.mimeType );
        +				}
        +
        +				// X-Requested-With header
        +				// For cross-domain requests, seeing as conditions for a preflight are
        +				// akin to a jigsaw puzzle, we simply never set it to be sure.
        +				// (it can always be set on a per-request basis or even using ajaxSetup)
        +				// For same-domain requests, won't change header if already provided.
        +				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
        +					headers[ "X-Requested-With" ] = "XMLHttpRequest";
        +				}
        +
        +				// Set headers
        +				for ( i in headers ) {
        +					xhr.setRequestHeader( i, headers[ i ] );
        +				}
        +
        +				// Callback
        +				callback = function( type ) {
        +					return function() {
        +						if ( callback ) {
        +							callback = errorCallback = xhr.onload =
        +								xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
        +
        +							if ( type === "abort" ) {
        +								xhr.abort();
        +							} else if ( type === "error" ) {
        +
        +								// Support: IE <=9 only
        +								// On a manual native abort, IE9 throws
        +								// errors on any property access that is not readyState
        +								if ( typeof xhr.status !== "number" ) {
        +									complete( 0, "error" );
        +								} else {
        +									complete(
        +
        +										// File: protocol always yields status 0; see #8605, #14207
        +										xhr.status,
        +										xhr.statusText
        +									);
        +								}
        +							} else {
        +								complete(
        +									xhrSuccessStatus[ xhr.status ] || xhr.status,
        +									xhr.statusText,
        +
        +									// Support: IE <=9 only
        +									// IE9 has no XHR2 but throws on binary (trac-11426)
        +									// For XHR2 non-text, let the caller handle it (gh-2498)
        +									( xhr.responseType || "text" ) !== "text"  ||
        +									typeof xhr.responseText !== "string" ?
        +										{ binary: xhr.response } :
        +										{ text: xhr.responseText },
        +									xhr.getAllResponseHeaders()
        +								);
        +							}
        +						}
        +					};
        +				};
        +
        +				// Listen to events
        +				xhr.onload = callback();
        +				errorCallback = xhr.onerror = callback( "error" );
        +
        +				// Support: IE 9 only
        +				// Use onreadystatechange to replace onabort
        +				// to handle uncaught aborts
        +				if ( xhr.onabort !== undefined ) {
        +					xhr.onabort = errorCallback;
        +				} else {
        +					xhr.onreadystatechange = function() {
        +
        +						// Check readyState before timeout as it changes
        +						if ( xhr.readyState === 4 ) {
        +
        +							// Allow onerror to be called first,
        +							// but that will not handle a native abort
        +							// Also, save errorCallback to a variable
        +							// as xhr.onerror cannot be accessed
        +							window.setTimeout( function() {
        +								if ( callback ) {
        +									errorCallback();
        +								}
        +							} );
        +						}
        +					};
        +				}
        +
        +				// Create the abort callback
        +				callback = callback( "abort" );
        +
        +				try {
        +
        +					// Do send the request (this may raise an exception)
        +					xhr.send( options.hasContent && options.data || null );
        +				} catch ( e ) {
        +
        +					// #14683: Only rethrow if this hasn't been notified as an error yet
        +					if ( callback ) {
        +						throw e;
        +					}
        +				}
        +			},
        +
        +			abort: function() {
        +				if ( callback ) {
        +					callback();
        +				}
        +			}
        +		};
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/attributes.js b/bower_components/jquery/src/attributes.js
        new file mode 100644
        index 0000000000..2d801e5639
        --- /dev/null
        +++ b/bower_components/jquery/src/attributes.js
        @@ -0,0 +1,13 @@
        +define( [
        +	"./core",
        +	"./attributes/attr",
        +	"./attributes/prop",
        +	"./attributes/classes",
        +	"./attributes/val"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +// Return jQuery for attributes-only inclusion
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/attributes/attr.js b/bower_components/jquery/src/attributes/attr.js
        new file mode 100644
        index 0000000000..2d9c76feb5
        --- /dev/null
        +++ b/bower_components/jquery/src/attributes/attr.js
        @@ -0,0 +1,140 @@
        +define( [
        +	"../core",
        +	"../core/access",
        +	"./support",
        +	"../var/rnothtmlwhite",
        +	"../selector"
        +], function( jQuery, access, support, rnothtmlwhite ) {
        +
        +"use strict";
        +
        +var boolHook,
        +	attrHandle = jQuery.expr.attrHandle;
        +
        +jQuery.fn.extend( {
        +	attr: function( name, value ) {
        +		return access( this, jQuery.attr, name, value, arguments.length > 1 );
        +	},
        +
        +	removeAttr: function( name ) {
        +		return this.each( function() {
        +			jQuery.removeAttr( this, name );
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	attr: function( elem, name, value ) {
        +		var ret, hooks,
        +			nType = elem.nodeType;
        +
        +		// Don't get/set attributes on text, comment and attribute nodes
        +		if ( nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		// Fallback to prop when attributes are not supported
        +		if ( typeof elem.getAttribute === "undefined" ) {
        +			return jQuery.prop( elem, name, value );
        +		}
        +
        +		// Attribute hooks are determined by the lowercase version
        +		// Grab necessary hook if one is defined
        +		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
        +			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
        +				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
        +		}
        +
        +		if ( value !== undefined ) {
        +			if ( value === null ) {
        +				jQuery.removeAttr( elem, name );
        +				return;
        +			}
        +
        +			if ( hooks && "set" in hooks &&
        +				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
        +				return ret;
        +			}
        +
        +			elem.setAttribute( name, value + "" );
        +			return value;
        +		}
        +
        +		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
        +			return ret;
        +		}
        +
        +		ret = jQuery.find.attr( elem, name );
        +
        +		// Non-existent attributes return null, we normalize to undefined
        +		return ret == null ? undefined : ret;
        +	},
        +
        +	attrHooks: {
        +		type: {
        +			set: function( elem, value ) {
        +				if ( !support.radioValue && value === "radio" &&
        +					jQuery.nodeName( elem, "input" ) ) {
        +					var val = elem.value;
        +					elem.setAttribute( "type", value );
        +					if ( val ) {
        +						elem.value = val;
        +					}
        +					return value;
        +				}
        +			}
        +		}
        +	},
        +
        +	removeAttr: function( elem, value ) {
        +		var name,
        +			i = 0,
        +
        +			// Attribute names can contain non-HTML whitespace characters
        +			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
        +			attrNames = value && value.match( rnothtmlwhite );
        +
        +		if ( attrNames && elem.nodeType === 1 ) {
        +			while ( ( name = attrNames[ i++ ] ) ) {
        +				elem.removeAttribute( name );
        +			}
        +		}
        +	}
        +} );
        +
        +// Hooks for boolean attributes
        +boolHook = {
        +	set: function( elem, value, name ) {
        +		if ( value === false ) {
        +
        +			// Remove boolean attributes when set to false
        +			jQuery.removeAttr( elem, name );
        +		} else {
        +			elem.setAttribute( name, name );
        +		}
        +		return name;
        +	}
        +};
        +
        +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
        +	var getter = attrHandle[ name ] || jQuery.find.attr;
        +
        +	attrHandle[ name ] = function( elem, name, isXML ) {
        +		var ret, handle,
        +			lowercaseName = name.toLowerCase();
        +
        +		if ( !isXML ) {
        +
        +			// Avoid an infinite loop by temporarily removing this function from the getter
        +			handle = attrHandle[ lowercaseName ];
        +			attrHandle[ lowercaseName ] = ret;
        +			ret = getter( elem, name, isXML ) != null ?
        +				lowercaseName :
        +				null;
        +			attrHandle[ lowercaseName ] = handle;
        +		}
        +		return ret;
        +	};
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/attributes/classes.js b/bower_components/jquery/src/attributes/classes.js
        new file mode 100644
        index 0000000000..23b4cd6af4
        --- /dev/null
        +++ b/bower_components/jquery/src/attributes/classes.js
        @@ -0,0 +1,174 @@
        +define( [
        +	"../core",
        +	"../core/stripAndCollapse",
        +	"../var/rnothtmlwhite",
        +	"../data/var/dataPriv",
        +	"../core/init"
        +], function( jQuery, stripAndCollapse, rnothtmlwhite, dataPriv ) {
        +
        +"use strict";
        +
        +function getClass( elem ) {
        +	return elem.getAttribute && elem.getAttribute( "class" ) || "";
        +}
        +
        +jQuery.fn.extend( {
        +	addClass: function( value ) {
        +		var classes, elem, cur, curValue, clazz, j, finalValue,
        +			i = 0;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( j ) {
        +				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
        +			} );
        +		}
        +
        +		if ( typeof value === "string" && value ) {
        +			classes = value.match( rnothtmlwhite ) || [];
        +
        +			while ( ( elem = this[ i++ ] ) ) {
        +				curValue = getClass( elem );
        +				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
        +
        +				if ( cur ) {
        +					j = 0;
        +					while ( ( clazz = classes[ j++ ] ) ) {
        +						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
        +							cur += clazz + " ";
        +						}
        +					}
        +
        +					// Only assign if different to avoid unneeded rendering.
        +					finalValue = stripAndCollapse( cur );
        +					if ( curValue !== finalValue ) {
        +						elem.setAttribute( "class", finalValue );
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	removeClass: function( value ) {
        +		var classes, elem, cur, curValue, clazz, j, finalValue,
        +			i = 0;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( j ) {
        +				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
        +			} );
        +		}
        +
        +		if ( !arguments.length ) {
        +			return this.attr( "class", "" );
        +		}
        +
        +		if ( typeof value === "string" && value ) {
        +			classes = value.match( rnothtmlwhite ) || [];
        +
        +			while ( ( elem = this[ i++ ] ) ) {
        +				curValue = getClass( elem );
        +
        +				// This expression is here for better compressibility (see addClass)
        +				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
        +
        +				if ( cur ) {
        +					j = 0;
        +					while ( ( clazz = classes[ j++ ] ) ) {
        +
        +						// Remove *all* instances
        +						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
        +							cur = cur.replace( " " + clazz + " ", " " );
        +						}
        +					}
        +
        +					// Only assign if different to avoid unneeded rendering.
        +					finalValue = stripAndCollapse( cur );
        +					if ( curValue !== finalValue ) {
        +						elem.setAttribute( "class", finalValue );
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	toggleClass: function( value, stateVal ) {
        +		var type = typeof value;
        +
        +		if ( typeof stateVal === "boolean" && type === "string" ) {
        +			return stateVal ? this.addClass( value ) : this.removeClass( value );
        +		}
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each( function( i ) {
        +				jQuery( this ).toggleClass(
        +					value.call( this, i, getClass( this ), stateVal ),
        +					stateVal
        +				);
        +			} );
        +		}
        +
        +		return this.each( function() {
        +			var className, i, self, classNames;
        +
        +			if ( type === "string" ) {
        +
        +				// Toggle individual class names
        +				i = 0;
        +				self = jQuery( this );
        +				classNames = value.match( rnothtmlwhite ) || [];
        +
        +				while ( ( className = classNames[ i++ ] ) ) {
        +
        +					// Check each className given, space separated list
        +					if ( self.hasClass( className ) ) {
        +						self.removeClass( className );
        +					} else {
        +						self.addClass( className );
        +					}
        +				}
        +
        +			// Toggle whole class name
        +			} else if ( value === undefined || type === "boolean" ) {
        +				className = getClass( this );
        +				if ( className ) {
        +
        +					// Store className if set
        +					dataPriv.set( this, "__className__", className );
        +				}
        +
        +				// If the element has a class name or if we're passed `false`,
        +				// then remove the whole classname (if there was one, the above saved it).
        +				// Otherwise bring back whatever was previously saved (if anything),
        +				// falling back to the empty string if nothing was stored.
        +				if ( this.setAttribute ) {
        +					this.setAttribute( "class",
        +						className || value === false ?
        +						"" :
        +						dataPriv.get( this, "__className__" ) || ""
        +					);
        +				}
        +			}
        +		} );
        +	},
        +
        +	hasClass: function( selector ) {
        +		var className, elem,
        +			i = 0;
        +
        +		className = " " + selector + " ";
        +		while ( ( elem = this[ i++ ] ) ) {
        +			if ( elem.nodeType === 1 &&
        +				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
        +					return true;
        +			}
        +		}
        +
        +		return false;
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/attributes/prop.js b/bower_components/jquery/src/attributes/prop.js
        new file mode 100644
        index 0000000000..49ac244dfd
        --- /dev/null
        +++ b/bower_components/jquery/src/attributes/prop.js
        @@ -0,0 +1,143 @@
        +define( [
        +	"../core",
        +	"../core/access",
        +	"./support",
        +	"../selector"
        +], function( jQuery, access, support ) {
        +
        +"use strict";
        +
        +var rfocusable = /^(?:input|select|textarea|button)$/i,
        +	rclickable = /^(?:a|area)$/i;
        +
        +jQuery.fn.extend( {
        +	prop: function( name, value ) {
        +		return access( this, jQuery.prop, name, value, arguments.length > 1 );
        +	},
        +
        +	removeProp: function( name ) {
        +		return this.each( function() {
        +			delete this[ jQuery.propFix[ name ] || name ];
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	prop: function( elem, name, value ) {
        +		var ret, hooks,
        +			nType = elem.nodeType;
        +
        +		// Don't get/set properties on text, comment and attribute nodes
        +		if ( nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
        +
        +			// Fix name and attach hooks
        +			name = jQuery.propFix[ name ] || name;
        +			hooks = jQuery.propHooks[ name ];
        +		}
        +
        +		if ( value !== undefined ) {
        +			if ( hooks && "set" in hooks &&
        +				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
        +				return ret;
        +			}
        +
        +			return ( elem[ name ] = value );
        +		}
        +
        +		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
        +			return ret;
        +		}
        +
        +		return elem[ name ];
        +	},
        +
        +	propHooks: {
        +		tabIndex: {
        +			get: function( elem ) {
        +
        +				// Support: IE <=9 - 11 only
        +				// elem.tabIndex doesn't always return the
        +				// correct value when it hasn't been explicitly set
        +				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
        +				// Use proper attribute retrieval(#12072)
        +				var tabindex = jQuery.find.attr( elem, "tabindex" );
        +
        +				if ( tabindex ) {
        +					return parseInt( tabindex, 10 );
        +				}
        +
        +				if (
        +					rfocusable.test( elem.nodeName ) ||
        +					rclickable.test( elem.nodeName ) &&
        +					elem.href
        +				) {
        +					return 0;
        +				}
        +
        +				return -1;
        +			}
        +		}
        +	},
        +
        +	propFix: {
        +		"for": "htmlFor",
        +		"class": "className"
        +	}
        +} );
        +
        +// Support: IE <=11 only
        +// Accessing the selectedIndex property
        +// forces the browser to respect setting selected
        +// on the option
        +// The getter ensures a default option is selected
        +// when in an optgroup
        +// eslint rule "no-unused-expressions" is disabled for this code
        +// since it considers such accessions noop
        +if ( !support.optSelected ) {
        +	jQuery.propHooks.selected = {
        +		get: function( elem ) {
        +
        +			/* eslint no-unused-expressions: "off" */
        +
        +			var parent = elem.parentNode;
        +			if ( parent && parent.parentNode ) {
        +				parent.parentNode.selectedIndex;
        +			}
        +			return null;
        +		},
        +		set: function( elem ) {
        +
        +			/* eslint no-unused-expressions: "off" */
        +
        +			var parent = elem.parentNode;
        +			if ( parent ) {
        +				parent.selectedIndex;
        +
        +				if ( parent.parentNode ) {
        +					parent.parentNode.selectedIndex;
        +				}
        +			}
        +		}
        +	};
        +}
        +
        +jQuery.each( [
        +	"tabIndex",
        +	"readOnly",
        +	"maxLength",
        +	"cellSpacing",
        +	"cellPadding",
        +	"rowSpan",
        +	"colSpan",
        +	"useMap",
        +	"frameBorder",
        +	"contentEditable"
        +], function() {
        +	jQuery.propFix[ this.toLowerCase() ] = this;
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/attributes/support.js b/bower_components/jquery/src/attributes/support.js
        new file mode 100644
        index 0000000000..af60e96949
        --- /dev/null
        +++ b/bower_components/jquery/src/attributes/support.js
        @@ -0,0 +1,33 @@
        +define( [
        +	"../var/document",
        +	"../var/support"
        +], function( document, support ) {
        +
        +"use strict";
        +
        +( function() {
        +	var input = document.createElement( "input" ),
        +		select = document.createElement( "select" ),
        +		opt = select.appendChild( document.createElement( "option" ) );
        +
        +	input.type = "checkbox";
        +
        +	// Support: Android <=4.3 only
        +	// Default value for a checkbox should be "on"
        +	support.checkOn = input.value !== "";
        +
        +	// Support: IE <=11 only
        +	// Must access selectedIndex to make default options select
        +	support.optSelected = opt.selected;
        +
        +	// Support: IE <=11 only
        +	// An input loses its value after becoming a radio
        +	input = document.createElement( "input" );
        +	input.value = "t";
        +	input.type = "radio";
        +	support.radioValue = input.value === "t";
        +} )();
        +
        +return support;
        +
        +} );
        diff --git a/bower_components/jquery/src/attributes/val.js b/bower_components/jquery/src/attributes/val.js
        new file mode 100644
        index 0000000000..fbf406929e
        --- /dev/null
        +++ b/bower_components/jquery/src/attributes/val.js
        @@ -0,0 +1,188 @@
        +define( [
        +	"../core",
        +	"../core/stripAndCollapse",
        +	"./support",
        +	"../core/init"
        +], function( jQuery, stripAndCollapse, support ) {
        +
        +"use strict";
        +
        +var rreturn = /\r/g;
        +
        +jQuery.fn.extend( {
        +	val: function( value ) {
        +		var hooks, ret, isFunction,
        +			elem = this[ 0 ];
        +
        +		if ( !arguments.length ) {
        +			if ( elem ) {
        +				hooks = jQuery.valHooks[ elem.type ] ||
        +					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
        +
        +				if ( hooks &&
        +					"get" in hooks &&
        +					( ret = hooks.get( elem, "value" ) ) !== undefined
        +				) {
        +					return ret;
        +				}
        +
        +				ret = elem.value;
        +
        +				// Handle most common string cases
        +				if ( typeof ret === "string" ) {
        +					return ret.replace( rreturn, "" );
        +				}
        +
        +				// Handle cases where value is null/undef or number
        +				return ret == null ? "" : ret;
        +			}
        +
        +			return;
        +		}
        +
        +		isFunction = jQuery.isFunction( value );
        +
        +		return this.each( function( i ) {
        +			var val;
        +
        +			if ( this.nodeType !== 1 ) {
        +				return;
        +			}
        +
        +			if ( isFunction ) {
        +				val = value.call( this, i, jQuery( this ).val() );
        +			} else {
        +				val = value;
        +			}
        +
        +			// Treat null/undefined as ""; convert numbers to string
        +			if ( val == null ) {
        +				val = "";
        +
        +			} else if ( typeof val === "number" ) {
        +				val += "";
        +
        +			} else if ( jQuery.isArray( val ) ) {
        +				val = jQuery.map( val, function( value ) {
        +					return value == null ? "" : value + "";
        +				} );
        +			}
        +
        +			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
        +
        +			// If set returns undefined, fall back to normal setting
        +			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
        +				this.value = val;
        +			}
        +		} );
        +	}
        +} );
        +
        +jQuery.extend( {
        +	valHooks: {
        +		option: {
        +			get: function( elem ) {
        +
        +				var val = jQuery.find.attr( elem, "value" );
        +				return val != null ?
        +					val :
        +
        +					// Support: IE <=10 - 11 only
        +					// option.text throws exceptions (#14686, #14858)
        +					// Strip and collapse whitespace
        +					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
        +					stripAndCollapse( jQuery.text( elem ) );
        +			}
        +		},
        +		select: {
        +			get: function( elem ) {
        +				var value, option, i,
        +					options = elem.options,
        +					index = elem.selectedIndex,
        +					one = elem.type === "select-one",
        +					values = one ? null : [],
        +					max = one ? index + 1 : options.length;
        +
        +				if ( index < 0 ) {
        +					i = max;
        +
        +				} else {
        +					i = one ? index : 0;
        +				}
        +
        +				// Loop through all the selected options
        +				for ( ; i < max; i++ ) {
        +					option = options[ i ];
        +
        +					// Support: IE <=9 only
        +					// IE8-9 doesn't update selected after form reset (#2551)
        +					if ( ( option.selected || i === index ) &&
        +
        +							// Don't return options that are disabled or in a disabled optgroup
        +							!option.disabled &&
        +							( !option.parentNode.disabled ||
        +								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
        +
        +						// Get the specific value for the option
        +						value = jQuery( option ).val();
        +
        +						// We don't need an array for one selects
        +						if ( one ) {
        +							return value;
        +						}
        +
        +						// Multi-Selects return an array
        +						values.push( value );
        +					}
        +				}
        +
        +				return values;
        +			},
        +
        +			set: function( elem, value ) {
        +				var optionSet, option,
        +					options = elem.options,
        +					values = jQuery.makeArray( value ),
        +					i = options.length;
        +
        +				while ( i-- ) {
        +					option = options[ i ];
        +
        +					/* eslint-disable no-cond-assign */
        +
        +					if ( option.selected =
        +						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
        +					) {
        +						optionSet = true;
        +					}
        +
        +					/* eslint-enable no-cond-assign */
        +				}
        +
        +				// Force browsers to behave consistently when non-matching value is set
        +				if ( !optionSet ) {
        +					elem.selectedIndex = -1;
        +				}
        +				return values;
        +			}
        +		}
        +	}
        +} );
        +
        +// Radios and checkboxes getter/setter
        +jQuery.each( [ "radio", "checkbox" ], function() {
        +	jQuery.valHooks[ this ] = {
        +		set: function( elem, value ) {
        +			if ( jQuery.isArray( value ) ) {
        +				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
        +			}
        +		}
        +	};
        +	if ( !support.checkOn ) {
        +		jQuery.valHooks[ this ].get = function( elem ) {
        +			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
        +		};
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/callbacks.js b/bower_components/jquery/src/callbacks.js
        new file mode 100644
        index 0000000000..a6d4df03fb
        --- /dev/null
        +++ b/bower_components/jquery/src/callbacks.js
        @@ -0,0 +1,234 @@
        +define( [
        +	"./core",
        +	"./var/rnothtmlwhite"
        +], function( jQuery, rnothtmlwhite ) {
        +
        +"use strict";
        +
        +// Convert String-formatted options into Object-formatted ones
        +function createOptions( options ) {
        +	var object = {};
        +	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
        +		object[ flag ] = true;
        +	} );
        +	return object;
        +}
        +
        +/*
        + * Create a callback list using the following parameters:
        + *
        + *	options: an optional list of space-separated options that will change how
        + *			the callback list behaves or a more traditional option object
        + *
        + * By default a callback list will act like an event callback list and can be
        + * "fired" multiple times.
        + *
        + * Possible options:
        + *
        + *	once:			will ensure the callback list can only be fired once (like a Deferred)
        + *
        + *	memory:			will keep track of previous values and will call any callback added
        + *					after the list has been fired right away with the latest "memorized"
        + *					values (like a Deferred)
        + *
        + *	unique:			will ensure a callback can only be added once (no duplicate in the list)
        + *
        + *	stopOnFalse:	interrupt callings when a callback returns false
        + *
        + */
        +jQuery.Callbacks = function( options ) {
        +
        +	// Convert options from String-formatted to Object-formatted if needed
        +	// (we check in cache first)
        +	options = typeof options === "string" ?
        +		createOptions( options ) :
        +		jQuery.extend( {}, options );
        +
        +	var // Flag to know if list is currently firing
        +		firing,
        +
        +		// Last fire value for non-forgettable lists
        +		memory,
        +
        +		// Flag to know if list was already fired
        +		fired,
        +
        +		// Flag to prevent firing
        +		locked,
        +
        +		// Actual callback list
        +		list = [],
        +
        +		// Queue of execution data for repeatable lists
        +		queue = [],
        +
        +		// Index of currently firing callback (modified by add/remove as needed)
        +		firingIndex = -1,
        +
        +		// Fire callbacks
        +		fire = function() {
        +
        +			// Enforce single-firing
        +			locked = options.once;
        +
        +			// Execute callbacks for all pending executions,
        +			// respecting firingIndex overrides and runtime changes
        +			fired = firing = true;
        +			for ( ; queue.length; firingIndex = -1 ) {
        +				memory = queue.shift();
        +				while ( ++firingIndex < list.length ) {
        +
        +					// Run callback and check for early termination
        +					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
        +						options.stopOnFalse ) {
        +
        +						// Jump to end and forget the data so .add doesn't re-fire
        +						firingIndex = list.length;
        +						memory = false;
        +					}
        +				}
        +			}
        +
        +			// Forget the data if we're done with it
        +			if ( !options.memory ) {
        +				memory = false;
        +			}
        +
        +			firing = false;
        +
        +			// Clean up if we're done firing for good
        +			if ( locked ) {
        +
        +				// Keep an empty list if we have data for future add calls
        +				if ( memory ) {
        +					list = [];
        +
        +				// Otherwise, this object is spent
        +				} else {
        +					list = "";
        +				}
        +			}
        +		},
        +
        +		// Actual Callbacks object
        +		self = {
        +
        +			// Add a callback or a collection of callbacks to the list
        +			add: function() {
        +				if ( list ) {
        +
        +					// If we have memory from a past run, we should fire after adding
        +					if ( memory && !firing ) {
        +						firingIndex = list.length - 1;
        +						queue.push( memory );
        +					}
        +
        +					( function add( args ) {
        +						jQuery.each( args, function( _, arg ) {
        +							if ( jQuery.isFunction( arg ) ) {
        +								if ( !options.unique || !self.has( arg ) ) {
        +									list.push( arg );
        +								}
        +							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
        +
        +								// Inspect recursively
        +								add( arg );
        +							}
        +						} );
        +					} )( arguments );
        +
        +					if ( memory && !firing ) {
        +						fire();
        +					}
        +				}
        +				return this;
        +			},
        +
        +			// Remove a callback from the list
        +			remove: function() {
        +				jQuery.each( arguments, function( _, arg ) {
        +					var index;
        +					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
        +						list.splice( index, 1 );
        +
        +						// Handle firing indexes
        +						if ( index <= firingIndex ) {
        +							firingIndex--;
        +						}
        +					}
        +				} );
        +				return this;
        +			},
        +
        +			// Check if a given callback is in the list.
        +			// If no argument is given, return whether or not list has callbacks attached.
        +			has: function( fn ) {
        +				return fn ?
        +					jQuery.inArray( fn, list ) > -1 :
        +					list.length > 0;
        +			},
        +
        +			// Remove all callbacks from the list
        +			empty: function() {
        +				if ( list ) {
        +					list = [];
        +				}
        +				return this;
        +			},
        +
        +			// Disable .fire and .add
        +			// Abort any current/pending executions
        +			// Clear all callbacks and values
        +			disable: function() {
        +				locked = queue = [];
        +				list = memory = "";
        +				return this;
        +			},
        +			disabled: function() {
        +				return !list;
        +			},
        +
        +			// Disable .fire
        +			// Also disable .add unless we have memory (since it would have no effect)
        +			// Abort any pending executions
        +			lock: function() {
        +				locked = queue = [];
        +				if ( !memory && !firing ) {
        +					list = memory = "";
        +				}
        +				return this;
        +			},
        +			locked: function() {
        +				return !!locked;
        +			},
        +
        +			// Call all callbacks with the given context and arguments
        +			fireWith: function( context, args ) {
        +				if ( !locked ) {
        +					args = args || [];
        +					args = [ context, args.slice ? args.slice() : args ];
        +					queue.push( args );
        +					if ( !firing ) {
        +						fire();
        +					}
        +				}
        +				return this;
        +			},
        +
        +			// Call all the callbacks with the given arguments
        +			fire: function() {
        +				self.fireWith( this, arguments );
        +				return this;
        +			},
        +
        +			// To know if the callbacks have already been called at least once
        +			fired: function() {
        +				return !!fired;
        +			}
        +		};
        +
        +	return self;
        +};
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/core.js b/bower_components/jquery/src/core.js
        new file mode 100644
        index 0000000000..4c8a4ab44b
        --- /dev/null
        +++ b/bower_components/jquery/src/core.js
        @@ -0,0 +1,482 @@
        +/* global Symbol */
        +// Defining this global in .eslintrc.json would create a danger of using the global
        +// unguarded in another place, it seems safer to define global only for this module
        +
        +define( [
        +	"./var/arr",
        +	"./var/document",
        +	"./var/getProto",
        +	"./var/slice",
        +	"./var/concat",
        +	"./var/push",
        +	"./var/indexOf",
        +	"./var/class2type",
        +	"./var/toString",
        +	"./var/hasOwn",
        +	"./var/fnToString",
        +	"./var/ObjectFunctionString",
        +	"./var/support",
        +	"./core/DOMEval"
        +], function( arr, document, getProto, slice, concat, push, indexOf,
        +	class2type, toString, hasOwn, fnToString, ObjectFunctionString,
        +	support, DOMEval ) {
        +
        +"use strict";
        +
        +var
        +	version = "3.1.1",
        +
        +	// Define a local copy of jQuery
        +	jQuery = function( selector, context ) {
        +
        +		// The jQuery object is actually just the init constructor 'enhanced'
        +		// Need init if jQuery is called (just allow error to be thrown if not included)
        +		return new jQuery.fn.init( selector, context );
        +	},
        +
        +	// Support: Android <=4.0 only
        +	// Make sure we trim BOM and NBSP
        +	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
        +
        +	// Matches dashed string for camelizing
        +	rmsPrefix = /^-ms-/,
        +	rdashAlpha = /-([a-z])/g,
        +
        +	// Used by jQuery.camelCase as callback to replace()
        +	fcamelCase = function( all, letter ) {
        +		return letter.toUpperCase();
        +	};
        +
        +jQuery.fn = jQuery.prototype = {
        +
        +	// The current version of jQuery being used
        +	jquery: version,
        +
        +	constructor: jQuery,
        +
        +	// The default length of a jQuery object is 0
        +	length: 0,
        +
        +	toArray: function() {
        +		return slice.call( this );
        +	},
        +
        +	// Get the Nth element in the matched element set OR
        +	// Get the whole matched element set as a clean array
        +	get: function( num ) {
        +
        +		// Return all the elements in a clean array
        +		if ( num == null ) {
        +			return slice.call( this );
        +		}
        +
        +		// Return just the one element from the set
        +		return num < 0 ? this[ num + this.length ] : this[ num ];
        +	},
        +
        +	// Take an array of elements and push it onto the stack
        +	// (returning the new matched element set)
        +	pushStack: function( elems ) {
        +
        +		// Build a new jQuery matched element set
        +		var ret = jQuery.merge( this.constructor(), elems );
        +
        +		// Add the old object onto the stack (as a reference)
        +		ret.prevObject = this;
        +
        +		// Return the newly-formed element set
        +		return ret;
        +	},
        +
        +	// Execute a callback for every element in the matched set.
        +	each: function( callback ) {
        +		return jQuery.each( this, callback );
        +	},
        +
        +	map: function( callback ) {
        +		return this.pushStack( jQuery.map( this, function( elem, i ) {
        +			return callback.call( elem, i, elem );
        +		} ) );
        +	},
        +
        +	slice: function() {
        +		return this.pushStack( slice.apply( this, arguments ) );
        +	},
        +
        +	first: function() {
        +		return this.eq( 0 );
        +	},
        +
        +	last: function() {
        +		return this.eq( -1 );
        +	},
        +
        +	eq: function( i ) {
        +		var len = this.length,
        +			j = +i + ( i < 0 ? len : 0 );
        +		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
        +	},
        +
        +	end: function() {
        +		return this.prevObject || this.constructor();
        +	},
        +
        +	// For internal use only.
        +	// Behaves like an Array's method, not like a jQuery method.
        +	push: push,
        +	sort: arr.sort,
        +	splice: arr.splice
        +};
        +
        +jQuery.extend = jQuery.fn.extend = function() {
        +	var options, name, src, copy, copyIsArray, clone,
        +		target = arguments[ 0 ] || {},
        +		i = 1,
        +		length = arguments.length,
        +		deep = false;
        +
        +	// Handle a deep copy situation
        +	if ( typeof target === "boolean" ) {
        +		deep = target;
        +
        +		// Skip the boolean and the target
        +		target = arguments[ i ] || {};
        +		i++;
        +	}
        +
        +	// Handle case when target is a string or something (possible in deep copy)
        +	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
        +		target = {};
        +	}
        +
        +	// Extend jQuery itself if only one argument is passed
        +	if ( i === length ) {
        +		target = this;
        +		i--;
        +	}
        +
        +	for ( ; i < length; i++ ) {
        +
        +		// Only deal with non-null/undefined values
        +		if ( ( options = arguments[ i ] ) != null ) {
        +
        +			// Extend the base object
        +			for ( name in options ) {
        +				src = target[ name ];
        +				copy = options[ name ];
        +
        +				// Prevent never-ending loop
        +				if ( target === copy ) {
        +					continue;
        +				}
        +
        +				// Recurse if we're merging plain objects or arrays
        +				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
        +					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
        +
        +					if ( copyIsArray ) {
        +						copyIsArray = false;
        +						clone = src && jQuery.isArray( src ) ? src : [];
        +
        +					} else {
        +						clone = src && jQuery.isPlainObject( src ) ? src : {};
        +					}
        +
        +					// Never move original objects, clone them
        +					target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +				// Don't bring in undefined values
        +				} else if ( copy !== undefined ) {
        +					target[ name ] = copy;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Return the modified object
        +	return target;
        +};
        +
        +jQuery.extend( {
        +
        +	// Unique for each copy of jQuery on the page
        +	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
        +
        +	// Assume jQuery is ready without the ready module
        +	isReady: true,
        +
        +	error: function( msg ) {
        +		throw new Error( msg );
        +	},
        +
        +	noop: function() {},
        +
        +	isFunction: function( obj ) {
        +		return jQuery.type( obj ) === "function";
        +	},
        +
        +	isArray: Array.isArray,
        +
        +	isWindow: function( obj ) {
        +		return obj != null && obj === obj.window;
        +	},
        +
        +	isNumeric: function( obj ) {
        +
        +		// As of jQuery 3.0, isNumeric is limited to
        +		// strings and numbers (primitives or objects)
        +		// that can be coerced to finite numbers (gh-2662)
        +		var type = jQuery.type( obj );
        +		return ( type === "number" || type === "string" ) &&
        +
        +			// parseFloat NaNs numeric-cast false positives ("")
        +			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
        +			// subtraction forces infinities to NaN
        +			!isNaN( obj - parseFloat( obj ) );
        +	},
        +
        +	isPlainObject: function( obj ) {
        +		var proto, Ctor;
        +
        +		// Detect obvious negatives
        +		// Use toString instead of jQuery.type to catch host objects
        +		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
        +			return false;
        +		}
        +
        +		proto = getProto( obj );
        +
        +		// Objects with no prototype (e.g., `Object.create( null )`) are plain
        +		if ( !proto ) {
        +			return true;
        +		}
        +
        +		// Objects with prototype are plain iff they were constructed by a global Object function
        +		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        +		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
        +	},
        +
        +	isEmptyObject: function( obj ) {
        +
        +		/* eslint-disable no-unused-vars */
        +		// See https://github.com/eslint/eslint/issues/6125
        +		var name;
        +
        +		for ( name in obj ) {
        +			return false;
        +		}
        +		return true;
        +	},
        +
        +	type: function( obj ) {
        +		if ( obj == null ) {
        +			return obj + "";
        +		}
        +
        +		// Support: Android <=2.3 only (functionish RegExp)
        +		return typeof obj === "object" || typeof obj === "function" ?
        +			class2type[ toString.call( obj ) ] || "object" :
        +			typeof obj;
        +	},
        +
        +	// Evaluates a script in a global context
        +	globalEval: function( code ) {
        +		DOMEval( code );
        +	},
        +
        +	// Convert dashed to camelCase; used by the css and data modules
        +	// Support: IE <=9 - 11, Edge 12 - 13
        +	// Microsoft forgot to hump their vendor prefix (#9572)
        +	camelCase: function( string ) {
        +		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +	},
        +
        +	nodeName: function( elem, name ) {
        +		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        +	},
        +
        +	each: function( obj, callback ) {
        +		var length, i = 0;
        +
        +		if ( isArrayLike( obj ) ) {
        +			length = obj.length;
        +			for ( ; i < length; i++ ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		} else {
        +			for ( i in obj ) {
        +				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
        +					break;
        +				}
        +			}
        +		}
        +
        +		return obj;
        +	},
        +
        +	// Support: Android <=4.0 only
        +	trim: function( text ) {
        +		return text == null ?
        +			"" :
        +			( text + "" ).replace( rtrim, "" );
        +	},
        +
        +	// results is for internal usage only
        +	makeArray: function( arr, results ) {
        +		var ret = results || [];
        +
        +		if ( arr != null ) {
        +			if ( isArrayLike( Object( arr ) ) ) {
        +				jQuery.merge( ret,
        +					typeof arr === "string" ?
        +					[ arr ] : arr
        +				);
        +			} else {
        +				push.call( ret, arr );
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	inArray: function( elem, arr, i ) {
        +		return arr == null ? -1 : indexOf.call( arr, elem, i );
        +	},
        +
        +	// Support: Android <=4.0 only, PhantomJS 1 only
        +	// push.apply(_, arraylike) throws on ancient WebKit
        +	merge: function( first, second ) {
        +		var len = +second.length,
        +			j = 0,
        +			i = first.length;
        +
        +		for ( ; j < len; j++ ) {
        +			first[ i++ ] = second[ j ];
        +		}
        +
        +		first.length = i;
        +
        +		return first;
        +	},
        +
        +	grep: function( elems, callback, invert ) {
        +		var callbackInverse,
        +			matches = [],
        +			i = 0,
        +			length = elems.length,
        +			callbackExpect = !invert;
        +
        +		// Go through the array, only saving the items
        +		// that pass the validator function
        +		for ( ; i < length; i++ ) {
        +			callbackInverse = !callback( elems[ i ], i );
        +			if ( callbackInverse !== callbackExpect ) {
        +				matches.push( elems[ i ] );
        +			}
        +		}
        +
        +		return matches;
        +	},
        +
        +	// arg is for internal usage only
        +	map: function( elems, callback, arg ) {
        +		var length, value,
        +			i = 0,
        +			ret = [];
        +
        +		// Go through the array, translating each of the items to their new values
        +		if ( isArrayLike( elems ) ) {
        +			length = elems.length;
        +			for ( ; i < length; i++ ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +
        +		// Go through every key on the object,
        +		} else {
        +			for ( i in elems ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret.push( value );
        +				}
        +			}
        +		}
        +
        +		// Flatten any nested arrays
        +		return concat.apply( [], ret );
        +	},
        +
        +	// A global GUID counter for objects
        +	guid: 1,
        +
        +	// Bind a function to a context, optionally partially applying any
        +	// arguments.
        +	proxy: function( fn, context ) {
        +		var tmp, args, proxy;
        +
        +		if ( typeof context === "string" ) {
        +			tmp = fn[ context ];
        +			context = fn;
        +			fn = tmp;
        +		}
        +
        +		// Quick check to determine if target is callable, in the spec
        +		// this throws a TypeError, but we will just return undefined.
        +		if ( !jQuery.isFunction( fn ) ) {
        +			return undefined;
        +		}
        +
        +		// Simulated bind
        +		args = slice.call( arguments, 2 );
        +		proxy = function() {
        +			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
        +		};
        +
        +		// Set the guid of unique handler to the same of original handler, so it can be removed
        +		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
        +
        +		return proxy;
        +	},
        +
        +	now: Date.now,
        +
        +	// jQuery.support is not used in Core but other projects attach their
        +	// properties to it so it needs to exist.
        +	support: support
        +} );
        +
        +if ( typeof Symbol === "function" ) {
        +	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
        +}
        +
        +// Populate the class2type map
        +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
        +function( i, name ) {
        +	class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +} );
        +
        +function isArrayLike( obj ) {
        +
        +	// Support: real iOS 8.2 only (not reproducible in simulator)
        +	// `in` check used to prevent JIT error (gh-2145)
        +	// hasOwn isn't used here due to false negatives
        +	// regarding Nodelist length in IE
        +	var length = !!obj && "length" in obj && obj.length,
        +		type = jQuery.type( obj );
        +
        +	if ( type === "function" || jQuery.isWindow( obj ) ) {
        +		return false;
        +	}
        +
        +	return type === "array" || length === 0 ||
        +		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
        +}
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/core/DOMEval.js b/bower_components/jquery/src/core/DOMEval.js
        new file mode 100644
        index 0000000000..c49c12e5e5
        --- /dev/null
        +++ b/bower_components/jquery/src/core/DOMEval.js
        @@ -0,0 +1,16 @@
        +define( [
        +	"../var/document"
        +], function( document ) {
        +	"use strict";
        +
        +	function DOMEval( code, doc ) {
        +		doc = doc || document;
        +
        +		var script = doc.createElement( "script" );
        +
        +		script.text = code;
        +		doc.head.appendChild( script ).parentNode.removeChild( script );
        +	}
        +
        +	return DOMEval;
        +} );
        diff --git a/bower_components/jquery/src/core/access.js b/bower_components/jquery/src/core/access.js
        new file mode 100644
        index 0000000000..86cdbc7e68
        --- /dev/null
        +++ b/bower_components/jquery/src/core/access.js
        @@ -0,0 +1,70 @@
        +define( [
        +	"../core"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +// Multifunctional method to get and set values of a collection
        +// The value/s can optionally be executed if it's a function
        +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
        +	var i = 0,
        +		len = elems.length,
        +		bulk = key == null;
        +
        +	// Sets many values
        +	if ( jQuery.type( key ) === "object" ) {
        +		chainable = true;
        +		for ( i in key ) {
        +			access( elems, fn, i, key[ i ], true, emptyGet, raw );
        +		}
        +
        +	// Sets one value
        +	} else if ( value !== undefined ) {
        +		chainable = true;
        +
        +		if ( !jQuery.isFunction( value ) ) {
        +			raw = true;
        +		}
        +
        +		if ( bulk ) {
        +
        +			// Bulk operations run against the entire set
        +			if ( raw ) {
        +				fn.call( elems, value );
        +				fn = null;
        +
        +			// ...except when executing function values
        +			} else {
        +				bulk = fn;
        +				fn = function( elem, key, value ) {
        +					return bulk.call( jQuery( elem ), value );
        +				};
        +			}
        +		}
        +
        +		if ( fn ) {
        +			for ( ; i < len; i++ ) {
        +				fn(
        +					elems[ i ], key, raw ?
        +					value :
        +					value.call( elems[ i ], i, fn( elems[ i ], key ) )
        +				);
        +			}
        +		}
        +	}
        +
        +	if ( chainable ) {
        +		return elems;
        +	}
        +
        +	// Gets
        +	if ( bulk ) {
        +		return fn.call( elems );
        +	}
        +
        +	return len ? fn( elems[ 0 ], key ) : emptyGet;
        +};
        +
        +return access;
        +
        +} );
        diff --git a/bower_components/jquery/src/core/init.js b/bower_components/jquery/src/core/init.js
        new file mode 100644
        index 0000000000..19a3c7c682
        --- /dev/null
        +++ b/bower_components/jquery/src/core/init.js
        @@ -0,0 +1,127 @@
        +// Initialize a jQuery object
        +define( [
        +	"../core",
        +	"../var/document",
        +	"./var/rsingleTag",
        +	"../traversing/findFilter"
        +], function( jQuery, document, rsingleTag ) {
        +
        +"use strict";
        +
        +// A central reference to the root jQuery(document)
        +var rootjQuery,
        +
        +	// A simple way to check for HTML strings
        +	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        +	// Strict HTML recognition (#11290: must start with <)
        +	// Shortcut simple #id case for speed
        +	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
        +
        +	init = jQuery.fn.init = function( selector, context, root ) {
        +		var match, elem;
        +
        +		// HANDLE: $(""), $(null), $(undefined), $(false)
        +		if ( !selector ) {
        +			return this;
        +		}
        +
        +		// Method init() accepts an alternate rootjQuery
        +		// so migrate can support jQuery.sub (gh-2101)
        +		root = root || rootjQuery;
        +
        +		// Handle HTML strings
        +		if ( typeof selector === "string" ) {
        +			if ( selector[ 0 ] === "<" &&
        +				selector[ selector.length - 1 ] === ">" &&
        +				selector.length >= 3 ) {
        +
        +				// Assume that strings that start and end with <> are HTML and skip the regex check
        +				match = [ null, selector, null ];
        +
        +			} else {
        +				match = rquickExpr.exec( selector );
        +			}
        +
        +			// Match html or make sure no context is specified for #id
        +			if ( match && ( match[ 1 ] || !context ) ) {
        +
        +				// HANDLE: $(html) -> $(array)
        +				if ( match[ 1 ] ) {
        +					context = context instanceof jQuery ? context[ 0 ] : context;
        +
        +					// Option to run scripts is true for back-compat
        +					// Intentionally let the error be thrown if parseHTML is not present
        +					jQuery.merge( this, jQuery.parseHTML(
        +						match[ 1 ],
        +						context && context.nodeType ? context.ownerDocument || context : document,
        +						true
        +					) );
        +
        +					// HANDLE: $(html, props)
        +					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
        +						for ( match in context ) {
        +
        +							// Properties of context are called as methods if possible
        +							if ( jQuery.isFunction( this[ match ] ) ) {
        +								this[ match ]( context[ match ] );
        +
        +							// ...and otherwise set as attributes
        +							} else {
        +								this.attr( match, context[ match ] );
        +							}
        +						}
        +					}
        +
        +					return this;
        +
        +				// HANDLE: $(#id)
        +				} else {
        +					elem = document.getElementById( match[ 2 ] );
        +
        +					if ( elem ) {
        +
        +						// Inject the element directly into the jQuery object
        +						this[ 0 ] = elem;
        +						this.length = 1;
        +					}
        +					return this;
        +				}
        +
        +			// HANDLE: $(expr, $(...))
        +			} else if ( !context || context.jquery ) {
        +				return ( context || root ).find( selector );
        +
        +			// HANDLE: $(expr, context)
        +			// (which is just equivalent to: $(context).find(expr)
        +			} else {
        +				return this.constructor( context ).find( selector );
        +			}
        +
        +		// HANDLE: $(DOMElement)
        +		} else if ( selector.nodeType ) {
        +			this[ 0 ] = selector;
        +			this.length = 1;
        +			return this;
        +
        +		// HANDLE: $(function)
        +		// Shortcut for document ready
        +		} else if ( jQuery.isFunction( selector ) ) {
        +			return root.ready !== undefined ?
        +				root.ready( selector ) :
        +
        +				// Execute immediately if ready is not present
        +				selector( jQuery );
        +		}
        +
        +		return jQuery.makeArray( selector, this );
        +	};
        +
        +// Give the init function the jQuery prototype for later instantiation
        +init.prototype = jQuery.fn;
        +
        +// Initialize central reference
        +rootjQuery = jQuery( document );
        +
        +return init;
        +
        +} );
        diff --git a/bower_components/jquery/src/core/parseHTML.js b/bower_components/jquery/src/core/parseHTML.js
        new file mode 100644
        index 0000000000..21ff6bfa70
        --- /dev/null
        +++ b/bower_components/jquery/src/core/parseHTML.js
        @@ -0,0 +1,65 @@
        +define( [
        +	"../core",
        +	"../var/document",
        +	"./var/rsingleTag",
        +	"../manipulation/buildFragment",
        +
        +	// This is the only module that needs core/support
        +	"./support"
        +], function( jQuery, document, rsingleTag, buildFragment, support ) {
        +
        +"use strict";
        +
        +// Argument "data" should be string of html
        +// context (optional): If specified, the fragment will be created in this context,
        +// defaults to document
        +// keepScripts (optional): If true, will include scripts passed in the html string
        +jQuery.parseHTML = function( data, context, keepScripts ) {
        +	if ( typeof data !== "string" ) {
        +		return [];
        +	}
        +	if ( typeof context === "boolean" ) {
        +		keepScripts = context;
        +		context = false;
        +	}
        +
        +	var base, parsed, scripts;
        +
        +	if ( !context ) {
        +
        +		// Stop scripts or inline event handlers from being executed immediately
        +		// by using document.implementation
        +		if ( support.createHTMLDocument ) {
        +			context = document.implementation.createHTMLDocument( "" );
        +
        +			// Set the base href for the created document
        +			// so any parsed elements with URLs
        +			// are based on the document's URL (gh-2965)
        +			base = context.createElement( "base" );
        +			base.href = document.location.href;
        +			context.head.appendChild( base );
        +		} else {
        +			context = document;
        +		}
        +	}
        +
        +	parsed = rsingleTag.exec( data );
        +	scripts = !keepScripts && [];
        +
        +	// Single tag
        +	if ( parsed ) {
        +		return [ context.createElement( parsed[ 1 ] ) ];
        +	}
        +
        +	parsed = buildFragment( [ data ], context, scripts );
        +
        +	if ( scripts && scripts.length ) {
        +		jQuery( scripts ).remove();
        +	}
        +
        +	return jQuery.merge( [], parsed.childNodes );
        +};
        +
        +return jQuery.parseHTML;
        +
        +} );
        diff --git a/bower_components/jquery/src/core/ready-no-deferred.js b/bower_components/jquery/src/core/ready-no-deferred.js
        new file mode 100644
        index 0000000000..02d6014013
        --- /dev/null
        +++ b/bower_components/jquery/src/core/ready-no-deferred.js
        @@ -0,0 +1,105 @@
        +define( [
        +	"../core",
        +	"../var/document"
        +], function( jQuery, document ) {
        +
        +"use strict";
        +
        +var readyCallbacks = [],
        +	whenReady = function( fn ) {
        +		readyCallbacks.push( fn );
        +	},
        +	executeReady = function( fn ) {
        +
        +		// Prevent errors from freezing future callback execution (gh-1823)
        +		// Not backwards-compatible as this does not execute sync
        +		window.setTimeout( function() {
        +			fn.call( document, jQuery );
        +		} );
        +	};
        +
        +jQuery.fn.ready = function( fn ) {
        +	whenReady( fn );
        +	return this;
        +};
        +
        +jQuery.extend( {
        +
        +	// Is the DOM ready to be used? Set to true once it occurs.
        +	isReady: false,
        +
        +	// A counter to track how many items to wait for before
        +	// the ready event fires. See #6781
        +	readyWait: 1,
        +
        +	// Hold (or release) the ready event
        +	holdReady: function( hold ) {
        +		if ( hold ) {
        +			jQuery.readyWait++;
        +		} else {
        +			jQuery.ready( true );
        +		}
        +	},
        +
        +	ready: function( wait ) {
        +
        +		// Abort if there are pending holds or we're already ready
        +		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
        +			return;
        +		}
        +
        +		// Remember that the DOM is ready
        +		jQuery.isReady = true;
        +
        +		// If a normal DOM Ready event fired, decrement, and wait if need be
        +		if ( wait !== true && --jQuery.readyWait > 0 ) {
        +			return;
        +		}
        +
        +		whenReady = function( fn ) {
        +			readyCallbacks.push( fn );
        +
        +			while ( readyCallbacks.length ) {
        +				fn = readyCallbacks.shift();
        +				if ( jQuery.isFunction( fn ) ) {
        +					executeReady( fn );
        +				}
        +			}
        +		};
        +
        +		whenReady();
        +	}
        +} );
        +
        +// Make jQuery.ready Promise consumable (gh-1778)
        +jQuery.ready.then = jQuery.fn.ready;
        +
        +/**
        + * The ready event handler and self cleanup method
        + */
        +function completed() {
        +	document.removeEventListener( "DOMContentLoaded", completed );
        +	window.removeEventListener( "load", completed );
        +	jQuery.ready();
        +}
        +
        +// Catch cases where $(document).ready() is called
        +// after the browser event has already occurred.
        +// Support: IE9-10 only
        +// Older IE sometimes signals "interactive" too soon
        +if ( document.readyState === "complete" ||
        +	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
        +
        +	// Handle it asynchronously to allow scripts the opportunity to delay ready
        +	window.setTimeout( jQuery.ready );
        +
        +} else {
        +
        +	// Use the handy event callback
        +	document.addEventListener( "DOMContentLoaded", completed );
        +
        +	// A fallback to window.onload, that will always work
        +	window.addEventListener( "load", completed );
        +}
        +
        +} );
        diff --git a/bower_components/jquery/src/core/ready.js b/bower_components/jquery/src/core/ready.js
        new file mode 100644
        index 0000000000..53b1b2da75
        --- /dev/null
        +++ b/bower_components/jquery/src/core/ready.js
        @@ -0,0 +1,95 @@
        +define( [
        +	"../core",
        +	"../var/document",
        +	"../core/readyException",
        +	"../deferred"
        +], function( jQuery, document ) {
        +
        +"use strict";
        +
        +// The deferred used on DOM ready
        +var readyList = jQuery.Deferred();
        +
        +jQuery.fn.ready = function( fn ) {
        +
        +	readyList
        +		.then( fn )
        +
        +		// Wrap jQuery.readyException in a function so that the lookup
        +		// happens at the time of error handling instead of callback
        +		// registration.
        +		.catch( function( error ) {
        +			jQuery.readyException( error );
        +		} );
        +
        +	return this;
        +};
        +
        +jQuery.extend( {
        +
        +	// Is the DOM ready to be used? Set to true once it occurs.
        +	isReady: false,
        +
        +	// A counter to track how many items to wait for before
        +	// the ready event fires. See #6781
        +	readyWait: 1,
        +
        +	// Hold (or release) the ready event
        +	holdReady: function( hold ) {
        +		if ( hold ) {
        +			jQuery.readyWait++;
        +		} else {
        +			jQuery.ready( true );
        +		}
        +	},
        +
        +	// Handle when the DOM is ready
        +	ready: function( wait ) {
        +
        +		// Abort if there are pending holds or we're already ready
        +		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
        +			return;
        +		}
        +
        +		// Remember that the DOM is ready
        +		jQuery.isReady = true;
        +
        +		// If a normal DOM Ready event fired, decrement, and wait if need be
        +		if ( wait !== true && --jQuery.readyWait > 0 ) {
        +			return;
        +		}
        +
        +		// If there are functions bound, to execute
        +		readyList.resolveWith( document, [ jQuery ] );
        +	}
        +} );
        +
        +jQuery.ready.then = readyList.then;
        +
        +// The ready event handler and self cleanup method
        +function completed() {
        +	document.removeEventListener( "DOMContentLoaded", completed );
        +	window.removeEventListener( "load", completed );
        +	jQuery.ready();
        +}
        +
        +// Catch cases where $(document).ready() is called
        +// after the browser event has already occurred.
        +// Support: IE <=9 - 10 only
        +// Older IE sometimes signals "interactive" too soon
        +if ( document.readyState === "complete" ||
        +	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
        +
        +	// Handle it asynchronously to allow scripts the opportunity to delay ready
        +	window.setTimeout( jQuery.ready );
        +
        +} else {
        +
        +	// Use the handy event callback
        +	document.addEventListener( "DOMContentLoaded", completed );
        +
        +	// A fallback to window.onload, that will always work
        +	window.addEventListener( "load", completed );
        +}
        +
        +} );
        diff --git a/bower_components/jquery/src/core/readyException.js b/bower_components/jquery/src/core/readyException.js
        new file mode 100644
        index 0000000000..72bdd90b54
        --- /dev/null
        +++ b/bower_components/jquery/src/core/readyException.js
        @@ -0,0 +1,13 @@
        +define( [
        +	"../core"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +jQuery.readyException = function( error ) {
        +	window.setTimeout( function() {
        +		throw error;
        +	} );
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/core/stripAndCollapse.js b/bower_components/jquery/src/core/stripAndCollapse.js
        new file mode 100644
        index 0000000000..ccad6602ec
        --- /dev/null
        +++ b/bower_components/jquery/src/core/stripAndCollapse.js
        @@ -0,0 +1,14 @@
        +define( [
        +	"../var/rnothtmlwhite"
        +], function( rnothtmlwhite ) {
        +	"use strict";
        +
        +	// Strip and collapse whitespace according to HTML spec
        +	// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
        +	function stripAndCollapse( value ) {
        +		var tokens = value.match( rnothtmlwhite ) || [];
        +		return tokens.join( " " );
        +	}
        +
        +	return stripAndCollapse;
        +} );
        diff --git a/bower_components/jquery/src/core/support.js b/bower_components/jquery/src/core/support.js
        new file mode 100644
        index 0000000000..13ae02f085
        --- /dev/null
        +++ b/bower_components/jquery/src/core/support.js
        @@ -0,0 +1,20 @@
        +define( [
        +	"../var/document",
        +	"../var/support"
        +], function( document, support ) {
        +
        +"use strict";
        +
        +// Support: Safari 8 only
        +// In Safari 8 documents created via document.implementation.createHTMLDocument
        +// collapse sibling forms: the second one becomes a child of the first one.
        +// Because of that, this security measure has to be disabled in Safari 8.
        +// https://bugs.webkit.org/show_bug.cgi?id=137337
        +support.createHTMLDocument = ( function() {
        +	var body = document.implementation.createHTMLDocument( "" ).body;
        +	body.innerHTML = "<form></form><form></form>";
        +	return body.childNodes.length === 2;
        +} )();
        +
        +return support;
        +} );
        diff --git a/bower_components/jquery/src/core/var/rsingleTag.js b/bower_components/jquery/src/core/var/rsingleTag.js
        new file mode 100644
        index 0000000000..4d6e8a0ac7
        --- /dev/null
        +++ b/bower_components/jquery/src/core/var/rsingleTag.js
        @@ -0,0 +1,6 @@
        +define( function() {
        +	"use strict";
        +
        +	// Match a standalone tag
        +	return ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
        +} );
        diff --git a/bower_components/jquery/src/css.js b/bower_components/jquery/src/css.js
        new file mode 100644
        index 0000000000..5e44511939
        --- /dev/null
        +++ b/bower_components/jquery/src/css.js
        @@ -0,0 +1,426 @@
        +define( [
        +	"./core",
        +	"./var/pnum",
        +	"./core/access",
        +	"./css/var/rmargin",
        +	"./var/document",
        +	"./var/rcssNum",
        +	"./css/var/rnumnonpx",
        +	"./css/var/cssExpand",
        +	"./css/var/getStyles",
        +	"./css/var/swap",
        +	"./css/curCSS",
        +	"./css/adjustCSS",
        +	"./css/addGetHookIf",
        +	"./css/support",
        +
        +	"./core/init",
        +	"./core/ready",
        +	"./selector" // contains
        +], function( jQuery, pnum, access, rmargin, document, rcssNum, rnumnonpx, cssExpand,
        +	getStyles, swap, curCSS, adjustCSS, addGetHookIf, support ) {
        +
        +"use strict";
        +
        +var
        +
        +	// Swappable if display is none or starts with table
        +	// except "table", "table-cell", or "table-caption"
        +	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        +	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
        +	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        +	cssNormalTransform = {
        +		letterSpacing: "0",
        +		fontWeight: "400"
        +	},
        +
        +	cssPrefixes = [ "Webkit", "Moz", "ms" ],
        +	emptyStyle = document.createElement( "div" ).style;
        +
        +// Return a css property mapped to a potentially vendor prefixed property
        +function vendorPropName( name ) {
        +
        +	// Shortcut for names that are not vendor prefixed
        +	if ( name in emptyStyle ) {
        +		return name;
        +	}
        +
        +	// Check for vendor prefixed names
        +	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
        +		i = cssPrefixes.length;
        +
        +	while ( i-- ) {
        +		name = cssPrefixes[ i ] + capName;
        +		if ( name in emptyStyle ) {
        +			return name;
        +		}
        +	}
        +}
        +
        +function setPositiveNumber( elem, value, subtract ) {
        +
        +	// Any relative (+/-) values have already been
        +	// normalized at this point
        +	var matches = rcssNum.exec( value );
        +	return matches ?
        +
        +		// Guard against undefined "subtract", e.g., when used as in cssHooks
        +		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
        +		value;
        +}
        +
        +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
        +	var i,
        +		val = 0;
        +
        +	// If we already have the right measurement, avoid augmentation
        +	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
        +		i = 4;
        +
        +	// Otherwise initialize for horizontal or vertical properties
        +	} else {
        +		i = name === "width" ? 1 : 0;
        +	}
        +
        +	for ( ; i < 4; i += 2 ) {
        +
        +		// Both box models exclude margin, so add it if we want it
        +		if ( extra === "margin" ) {
        +			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
        +		}
        +
        +		if ( isBorderBox ) {
        +
        +			// border-box includes padding, so remove it if we want content
        +			if ( extra === "content" ) {
        +				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +			}
        +
        +			// At this point, extra isn't border nor margin, so remove border
        +			if ( extra !== "margin" ) {
        +				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +			}
        +		} else {
        +
        +			// At this point, extra isn't content, so add padding
        +			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +
        +			// At this point, extra isn't content nor padding, so add border
        +			if ( extra !== "padding" ) {
        +				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +			}
        +		}
        +	}
        +
        +	return val;
        +}
        +
        +function getWidthOrHeight( elem, name, extra ) {
        +
        +	// Start with offset property, which is equivalent to the border-box value
        +	var val,
        +		valueIsBorderBox = true,
        +		styles = getStyles( elem ),
        +		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
        +
        +	// Support: IE <=11 only
        +	// Running getBoundingClientRect on a disconnected node
        +	// in IE throws an error.
        +	if ( elem.getClientRects().length ) {
        +		val = elem.getBoundingClientRect()[ name ];
        +	}
        +
        +	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
        +	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        +	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        +	if ( val <= 0 || val == null ) {
        +
        +		// Fall back to computed then uncomputed css if necessary
        +		val = curCSS( elem, name, styles );
        +		if ( val < 0 || val == null ) {
        +			val = elem.style[ name ];
        +		}
        +
        +		// Computed unit is not pixels. Stop here and return.
        +		if ( rnumnonpx.test( val ) ) {
        +			return val;
        +		}
        +
        +		// Check for style in case a browser which returns unreliable values
        +		// for getComputedStyle silently falls back to the reliable elem.style
        +		valueIsBorderBox = isBorderBox &&
        +			( support.boxSizingReliable() || val === elem.style[ name ] );
        +
        +		// Normalize "", auto, and prepare for extra
        +		val = parseFloat( val ) || 0;
        +	}
        +
        +	// Use the active box-sizing model to add/subtract irrelevant styles
        +	return ( val +
        +		augmentWidthOrHeight(
        +			elem,
        +			name,
        +			extra || ( isBorderBox ? "border" : "content" ),
        +			valueIsBorderBox,
        +			styles
        +		)
        +	) + "px";
        +}
        +
        +jQuery.extend( {
        +
        +	// Add in style property hooks for overriding the default
        +	// behavior of getting and setting a style property
        +	cssHooks: {
        +		opacity: {
        +			get: function( elem, computed ) {
        +				if ( computed ) {
        +
        +					// We should always get a number back from opacity
        +					var ret = curCSS( elem, "opacity" );
        +					return ret === "" ? "1" : ret;
        +				}
        +			}
        +		}
        +	},
        +
        +	// Don't automatically add "px" to these possibly-unitless properties
        +	cssNumber: {
        +		"animationIterationCount": true,
        +		"columnCount": true,
        +		"fillOpacity": true,
        +		"flexGrow": true,
        +		"flexShrink": true,
        +		"fontWeight": true,
        +		"lineHeight": true,
        +		"opacity": true,
        +		"order": true,
        +		"orphans": true,
        +		"widows": true,
        +		"zIndex": true,
        +		"zoom": true
        +	},
        +
        +	// Add in properties whose names you wish to fix before
        +	// setting or getting the value
        +	cssProps: {
        +		"float": "cssFloat"
        +	},
        +
        +	// Get and set the style property on a DOM Node
        +	style: function( elem, name, value, extra ) {
        +
        +		// Don't set styles on text and comment nodes
        +		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        +			return;
        +		}
        +
        +		// Make sure that we're working with the right name
        +		var ret, type, hooks,
        +			origName = jQuery.camelCase( name ),
        +			style = elem.style;
        +
        +		name = jQuery.cssProps[ origName ] ||
        +			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
        +
        +		// Gets hook for the prefixed version, then unprefixed version
        +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +		// Check if we're setting a value
        +		if ( value !== undefined ) {
        +			type = typeof value;
        +
        +			// Convert "+=" or "-=" to relative numbers (#7345)
        +			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
        +				value = adjustCSS( elem, name, ret );
        +
        +				// Fixes bug #9237
        +				type = "number";
        +			}
        +
        +			// Make sure that null and NaN values aren't set (#7116)
        +			if ( value == null || value !== value ) {
        +				return;
        +			}
        +
        +			// If a number was passed in, add the unit (except for certain CSS properties)
        +			if ( type === "number" ) {
        +				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
        +			}
        +
        +			// background-* props affect original clone's values
        +			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
        +				style[ name ] = "inherit";
        +			}
        +
        +			// If a hook was provided, use that value, otherwise just set the specified value
        +			if ( !hooks || !( "set" in hooks ) ||
        +				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
        +
        +				style[ name ] = value;
        +			}
        +
        +		} else {
        +
        +			// If a hook was provided get the non-computed value from there
        +			if ( hooks && "get" in hooks &&
        +				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
        +
        +				return ret;
        +			}
        +
        +			// Otherwise just get the value from the style object
        +			return style[ name ];
        +		}
        +	},
        +
        +	css: function( elem, name, extra, styles ) {
        +		var val, num, hooks,
        +			origName = jQuery.camelCase( name );
        +
        +		// Make sure that we're working with the right name
        +		name = jQuery.cssProps[ origName ] ||
        +			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
        +
        +		// Try prefixed name followed by the unprefixed name
        +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +		// If a hook was provided get the computed value from there
        +		if ( hooks && "get" in hooks ) {
        +			val = hooks.get( elem, true, extra );
        +		}
        +
        +		// Otherwise, if a way to get the computed value exists, use that
        +		if ( val === undefined ) {
        +			val = curCSS( elem, name, styles );
        +		}
        +
        +		// Convert "normal" to computed value
        +		if ( val === "normal" && name in cssNormalTransform ) {
        +			val = cssNormalTransform[ name ];
        +		}
        +
        +		// Make numeric if forced or a qualifier was provided and val looks numeric
        +		if ( extra === "" || extra ) {
        +			num = parseFloat( val );
        +			return extra === true || isFinite( num ) ? num || 0 : val;
        +		}
        +		return val;
        +	}
        +} );
        +
        +jQuery.each( [ "height", "width" ], function( i, name ) {
        +	jQuery.cssHooks[ name ] = {
        +		get: function( elem, computed, extra ) {
        +			if ( computed ) {
        +
        +				// Certain elements can have dimension info if we invisibly show them
        +				// but it must have a current display style that would benefit
        +				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
        +
        +					// Support: Safari 8+
        +					// Table columns in Safari have non-zero offsetWidth & zero
        +					// getBoundingClientRect().width unless display is changed.
        +					// Support: IE <=11 only
        +					// Running getBoundingClientRect on a disconnected node
        +					// in IE throws an error.
        +					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
        +						swap( elem, cssShow, function() {
        +							return getWidthOrHeight( elem, name, extra );
        +						} ) :
        +						getWidthOrHeight( elem, name, extra );
        +			}
        +		},
        +
        +		set: function( elem, value, extra ) {
        +			var matches,
        +				styles = extra && getStyles( elem ),
        +				subtract = extra && augmentWidthOrHeight(
        +					elem,
        +					name,
        +					extra,
        +					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
        +					styles
        +				);
        +
        +			// Convert to pixels if value adjustment is needed
        +			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
        +				( matches[ 3 ] || "px" ) !== "px" ) {
        +
        +				elem.style[ name ] = value;
        +				value = jQuery.css( elem, name );
        +			}
        +
        +			return setPositiveNumber( elem, value, subtract );
        +		}
        +	};
        +} );
        +
        +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
        +	function( elem, computed ) {
        +		if ( computed ) {
        +			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
        +				elem.getBoundingClientRect().left -
        +					swap( elem, { marginLeft: 0 }, function() {
        +						return elem.getBoundingClientRect().left;
        +					} )
        +				) + "px";
        +		}
        +	}
        +);
        +
        +// These hooks are used by animate to expand properties
        +jQuery.each( {
        +	margin: "",
        +	padding: "",
        +	border: "Width"
        +}, function( prefix, suffix ) {
        +	jQuery.cssHooks[ prefix + suffix ] = {
        +		expand: function( value ) {
        +			var i = 0,
        +				expanded = {},
        +
        +				// Assumes a single number if not a string
        +				parts = typeof value === "string" ? value.split( " " ) : [ value ];
        +
        +			for ( ; i < 4; i++ ) {
        +				expanded[ prefix + cssExpand[ i ] + suffix ] =
        +					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
        +			}
        +
        +			return expanded;
        +		}
        +	};
        +
        +	if ( !rmargin.test( prefix ) ) {
        +		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	css: function( name, value ) {
        +		return access( this, function( elem, name, value ) {
        +			var styles, len,
        +				map = {},
        +				i = 0;
        +
        +			if ( jQuery.isArray( name ) ) {
        +				styles = getStyles( elem );
        +				len = name.length;
        +
        +				for ( ; i < len; i++ ) {
        +					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
        +				}
        +
        +				return map;
        +			}
        +
        +			return value !== undefined ?
        +				jQuery.style( elem, name, value ) :
        +				jQuery.css( elem, name );
        +		}, name, value, arguments.length > 1 );
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/css/addGetHookIf.js b/bower_components/jquery/src/css/addGetHookIf.js
        new file mode 100644
        index 0000000000..e4bb49a674
        --- /dev/null
        +++ b/bower_components/jquery/src/css/addGetHookIf.js
        @@ -0,0 +1,26 @@
        +define( function() {
        +
        +"use strict";
        +
        +function addGetHookIf( conditionFn, hookFn ) {
        +
        +	// Define the hook, we'll check on the first run if it's really needed.
        +	return {
        +		get: function() {
        +			if ( conditionFn() ) {
        +
        +				// Hook not needed (or it's not possible to use it due
        +				// to missing dependency), remove it.
        +				delete this.get;
        +				return;
        +			}
        +
        +			// Hook needed; redefine it so that the support test is not executed again.
        +			return ( this.get = hookFn ).apply( this, arguments );
        +		}
        +	};
        +}
        +
        +return addGetHookIf;
        +
        +} );
        diff --git a/bower_components/jquery/src/css/adjustCSS.js b/bower_components/jquery/src/css/adjustCSS.js
        new file mode 100644
        index 0000000000..ded3a16667
        --- /dev/null
        +++ b/bower_components/jquery/src/css/adjustCSS.js
        @@ -0,0 +1,71 @@
        +define( [
        +	"../core",
        +	"../var/rcssNum"
        +], function( jQuery, rcssNum ) {
        +
        +"use strict";
        +
        +function adjustCSS( elem, prop, valueParts, tween ) {
        +	var adjusted,
        +		scale = 1,
        +		maxIterations = 20,
        +		currentValue = tween ?
        +			function() {
        +				return tween.cur();
        +			} :
        +			function() {
        +				return jQuery.css( elem, prop, "" );
        +			},
        +		initial = currentValue(),
        +		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
        +
        +		// Starting value computation is required for potential unit mismatches
        +		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
        +			rcssNum.exec( jQuery.css( elem, prop ) );
        +
        +	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
        +
        +		// Trust units reported by jQuery.css
        +		unit = unit || initialInUnit[ 3 ];
        +
        +		// Make sure we update the tween properties later on
        +		valueParts = valueParts || [];
        +
        +		// Iteratively approximate from a nonzero starting point
        +		initialInUnit = +initial || 1;
        +
        +		do {
        +
        +			// If previous iteration zeroed out, double until we get *something*.
        +			// Use string for doubling so we don't accidentally see scale as unchanged below
        +			scale = scale || ".5";
        +
        +			// Adjust and apply
        +			initialInUnit = initialInUnit / scale;
        +			jQuery.style( elem, prop, initialInUnit + unit );
        +
        +		// Update scale, tolerating zero or NaN from tween.cur()
        +		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
        +		} while (
        +			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
        +		);
        +	}
        +
        +	if ( valueParts ) {
        +		initialInUnit = +initialInUnit || +initial || 0;
        +
        +		// Apply relative offset (+=/-=) if specified
        +		adjusted = valueParts[ 1 ] ?
        +			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
        +			+valueParts[ 2 ];
        +		if ( tween ) {
        +			tween.unit = unit;
        +			tween.start = initialInUnit;
        +			tween.end = adjusted;
        +		}
        +	}
        +	return adjusted;
        +}
        +
        +return adjustCSS;
        +} );
        diff --git a/bower_components/jquery/src/css/curCSS.js b/bower_components/jquery/src/css/curCSS.js
        new file mode 100644
        index 0000000000..313da42221
        --- /dev/null
        +++ b/bower_components/jquery/src/css/curCSS.js
        @@ -0,0 +1,59 @@
        +define( [
        +	"../core",
        +	"./var/rnumnonpx",
        +	"./var/rmargin",
        +	"./var/getStyles",
        +	"./support",
        +	"../selector" // Get jQuery.contains
        +], function( jQuery, rnumnonpx, rmargin, getStyles, support ) {
        +
        +"use strict";
        +
        +function curCSS( elem, name, computed ) {
        +	var width, minWidth, maxWidth, ret,
        +		style = elem.style;
        +
        +	computed = computed || getStyles( elem );
        +
        +	// Support: IE <=9 only
        +	// getPropertyValue is only needed for .css('filter') (#12537)
        +	if ( computed ) {
        +		ret = computed.getPropertyValue( name ) || computed[ name ];
        +
        +		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
        +			ret = jQuery.style( elem, name );
        +		}
        +
        +		// A tribute to the "awesome hack by Dean Edwards"
        +		// Android Browser returns percentage for some values,
        +		// but width seems to be reliably pixels.
        +		// This is against the CSSOM draft spec:
        +		// https://drafts.csswg.org/cssom/#resolved-values
        +		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
        +
        +			// Remember the original values
        +			width = style.width;
        +			minWidth = style.minWidth;
        +			maxWidth = style.maxWidth;
        +
        +			// Put in the new values to get a computed value out
        +			style.minWidth = style.maxWidth = style.width = ret;
        +			ret = computed.width;
        +
        +			// Revert the changed values
        +			style.width = width;
        +			style.minWidth = minWidth;
        +			style.maxWidth = maxWidth;
        +		}
        +	}
        +
        +	return ret !== undefined ?
        +
        +		// Support: IE <=9 - 11 only
        +		// IE returns zIndex value as an integer.
        +		ret + "" :
        +		ret;
        +}
        +
        +return curCSS;
        +} );
        diff --git a/bower_components/jquery/src/css/hiddenVisibleSelectors.js b/bower_components/jquery/src/css/hiddenVisibleSelectors.js
        new file mode 100644
        index 0000000000..d7a9339dd1
        --- /dev/null
        +++ b/bower_components/jquery/src/css/hiddenVisibleSelectors.js
        @@ -0,0 +1,15 @@
        +define( [
        +	"../core",
        +	"../selector"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +jQuery.expr.pseudos.hidden = function( elem ) {
        +	return !jQuery.expr.pseudos.visible( elem );
        +};
        +jQuery.expr.pseudos.visible = function( elem ) {
        +	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/css/showHide.js b/bower_components/jquery/src/css/showHide.js
        new file mode 100644
        index 0000000000..3eeafef116
        --- /dev/null
        +++ b/bower_components/jquery/src/css/showHide.js
        @@ -0,0 +1,105 @@
        +define( [
        +	"../core",
        +	"../data/var/dataPriv",
        +	"../css/var/isHiddenWithinTree"
        +], function( jQuery, dataPriv, isHiddenWithinTree ) {
        +
        +"use strict";
        +
        +var defaultDisplayMap = {};
        +
        +function getDefaultDisplay( elem ) {
        +	var temp,
        +		doc = elem.ownerDocument,
        +		nodeName = elem.nodeName,
        +		display = defaultDisplayMap[ nodeName ];
        +
        +	if ( display ) {
        +		return display;
        +	}
        +
        +	temp = doc.body.appendChild( doc.createElement( nodeName ) );
        +	display = jQuery.css( temp, "display" );
        +
        +	temp.parentNode.removeChild( temp );
        +
        +	if ( display === "none" ) {
        +		display = "block";
        +	}
        +	defaultDisplayMap[ nodeName ] = display;
        +
        +	return display;
        +}
        +
        +function showHide( elements, show ) {
        +	var display, elem,
        +		values = [],
        +		index = 0,
        +		length = elements.length;
        +
        +	// Determine new display value for elements that need to change
        +	for ( ; index < length; index++ ) {
        +		elem = elements[ index ];
        +		if ( !elem.style ) {
        +			continue;
        +		}
        +
        +		display = elem.style.display;
        +		if ( show ) {
        +
        +			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
        +			// check is required in this first loop unless we have a nonempty display value (either
        +			// inline or about-to-be-restored)
        +			if ( display === "none" ) {
        +				values[ index ] = dataPriv.get( elem, "display" ) || null;
        +				if ( !values[ index ] ) {
        +					elem.style.display = "";
        +				}
        +			}
        +			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
        +				values[ index ] = getDefaultDisplay( elem );
        +			}
        +		} else {
        +			if ( display !== "none" ) {
        +				values[ index ] = "none";
        +
        +				// Remember what we're overwriting
        +				dataPriv.set( elem, "display", display );
        +			}
        +		}
        +	}
        +
        +	// Set the display of the elements in a second loop to avoid constant reflow
        +	for ( index = 0; index < length; index++ ) {
        +		if ( values[ index ] != null ) {
        +			elements[ index ].style.display = values[ index ];
        +		}
        +	}
        +
        +	return elements;
        +}
        +
        +jQuery.fn.extend( {
        +	show: function() {
        +		return showHide( this, true );
        +	},
        +	hide: function() {
        +		return showHide( this );
        +	},
        +	toggle: function( state ) {
        +		if ( typeof state === "boolean" ) {
        +			return state ? this.show() : this.hide();
        +		}
        +
        +		return this.each( function() {
        +			if ( isHiddenWithinTree( this ) ) {
        +				jQuery( this ).show();
        +			} else {
        +				jQuery( this ).hide();
        +			}
        +		} );
        +	}
        +} );
        +
        +return showHide;
        +} );
        diff --git a/bower_components/jquery/src/css/support.js b/bower_components/jquery/src/css/support.js
        new file mode 100644
        index 0000000000..883d0e53ef
        --- /dev/null
        +++ b/bower_components/jquery/src/css/support.js
        @@ -0,0 +1,89 @@
        +define( [
        +	"../core",
        +	"../var/document",
        +	"../var/documentElement",
        +	"../var/support"
        +], function( jQuery, document, documentElement, support ) {
        +
        +"use strict";
        +
        +( function() {
        +
        +	// Executing both pixelPosition & boxSizingReliable tests require only one layout
        +	// so they're executed at the same time to save the second computation.
        +	function computeStyleTests() {
        +
        +		// This is a singleton, we need to execute it only once
        +		if ( !div ) {
        +			return;
        +		}
        +
        +		div.style.cssText =
        +			"box-sizing:border-box;" +
        +			"position:relative;display:block;" +
        +			"margin:auto;border:1px;padding:1px;" +
        +			"top:1%;width:50%";
        +		div.innerHTML = "";
        +		documentElement.appendChild( container );
        +
        +		var divStyle = window.getComputedStyle( div );
        +		pixelPositionVal = divStyle.top !== "1%";
        +
        +		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
        +		reliableMarginLeftVal = divStyle.marginLeft === "2px";
        +		boxSizingReliableVal = divStyle.width === "4px";
        +
        +		// Support: Android 4.0 - 4.3 only
        +		// Some styles come back with percentage values, even though they shouldn't
        +		div.style.marginRight = "50%";
        +		pixelMarginRightVal = divStyle.marginRight === "4px";
        +
        +		documentElement.removeChild( container );
        +
        +		// Nullify the div so it wouldn't be stored in the memory and
        +		// it will also be a sign that checks already performed
        +		div = null;
        +	}
        +
        +	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
        +		container = document.createElement( "div" ),
        +		div = document.createElement( "div" );
        +
        +	// Finish early in limited (non-browser) environments
        +	if ( !div.style ) {
        +		return;
        +	}
        +
        +	// Support: IE <=9 - 11 only
        +	// Style of cloned element affects source element cloned (#8908)
        +	div.style.backgroundClip = "content-box";
        +	div.cloneNode( true ).style.backgroundClip = "";
        +	support.clearCloneStyle = div.style.backgroundClip === "content-box";
        +
        +	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
        +		"padding:0;margin-top:1px;position:absolute";
        +	container.appendChild( div );
        +
        +	jQuery.extend( support, {
        +		pixelPosition: function() {
        +			computeStyleTests();
        +			return pixelPositionVal;
        +		},
        +		boxSizingReliable: function() {
        +			computeStyleTests();
        +			return boxSizingReliableVal;
        +		},
        +		pixelMarginRight: function() {
        +			computeStyleTests();
        +			return pixelMarginRightVal;
        +		},
        +		reliableMarginLeft: function() {
        +			computeStyleTests();
        +			return reliableMarginLeftVal;
        +		}
        +	} );
        +} )();
        +
        +return support;
        +
        +} );
        diff --git a/bower_components/jquery/src/css/var/cssExpand.js b/bower_components/jquery/src/css/var/cssExpand.js
        new file mode 100644
        index 0000000000..dd2007c3fb
        --- /dev/null
        +++ b/bower_components/jquery/src/css/var/cssExpand.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return [ "Top", "Right", "Bottom", "Left" ];
        +} );
        diff --git a/bower_components/jquery/src/css/var/getStyles.js b/bower_components/jquery/src/css/var/getStyles.js
        new file mode 100644
        index 0000000000..0b893acf0b
        --- /dev/null
        +++ b/bower_components/jquery/src/css/var/getStyles.js
        @@ -0,0 +1,17 @@
        +define( function() {
        +	"use strict";
        +
        +	return function( elem ) {
        +
        +		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
        +		// IE throws on elements created in popups
        +		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
        +		var view = elem.ownerDocument.defaultView;
        +
        +		if ( !view || !view.opener ) {
        +			view = window;
        +		}
        +
        +		return view.getComputedStyle( elem );
        +	};
        +} );
        diff --git a/bower_components/jquery/src/css/var/isHiddenWithinTree.js b/bower_components/jquery/src/css/var/isHiddenWithinTree.js
        new file mode 100644
        index 0000000000..3cfb93e160
        --- /dev/null
        +++ b/bower_components/jquery/src/css/var/isHiddenWithinTree.js
        @@ -0,0 +1,34 @@
        +define( [
        +	"../../core",
        +	"../../selector"
        +
        +	// css is assumed
        +], function( jQuery ) {
        +	"use strict";
        +
        +	// isHiddenWithinTree reports if an element has a non-"none" display style (inline and/or
        +	// through the CSS cascade), which is useful in deciding whether or not to make it visible.
        +	// It differs from the :hidden selector (jQuery.expr.pseudos.hidden) in two important ways:
        +	// * A hidden ancestor does not force an element to be classified as hidden.
        +	// * Being disconnected from the document does not force an element to be classified as hidden.
        +	// These differences improve the behavior of .toggle() et al. when applied to elements that are
        +	// detached or contained within hidden ancestors (gh-2404, gh-2863).
        +	return function( elem, el ) {
        +
        +		// isHiddenWithinTree might be called from jQuery#filter function;
        +		// in that case, element will be second argument
        +		elem = el || elem;
        +
        +		// Inline style trumps all
        +		return elem.style.display === "none" ||
        +			elem.style.display === "" &&
        +
        +			// Otherwise, check computed style
        +			// Support: Firefox <=43 - 45
        +			// Disconnected elements can have computed display: none, so first confirm that elem is
        +			// in the document.
        +			jQuery.contains( elem.ownerDocument, elem ) &&
        +
        +			jQuery.css( elem, "display" ) === "none";
        +	};
        +} );
        diff --git a/bower_components/jquery/src/css/var/rmargin.js b/bower_components/jquery/src/css/var/rmargin.js
        new file mode 100644
        index 0000000000..0fbfbd8530
        --- /dev/null
        +++ b/bower_components/jquery/src/css/var/rmargin.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return ( /^margin/ );
        +} );
        diff --git a/bower_components/jquery/src/css/var/rnumnonpx.js b/bower_components/jquery/src/css/var/rnumnonpx.js
        new file mode 100644
        index 0000000000..056cda7add
        --- /dev/null
        +++ b/bower_components/jquery/src/css/var/rnumnonpx.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"../../var/pnum"
        +], function( pnum ) {
        +	"use strict";
        +
        +	return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
        +} );
        diff --git a/bower_components/jquery/src/css/var/swap.js b/bower_components/jquery/src/css/var/swap.js
        new file mode 100644
        index 0000000000..1a9556bad8
        --- /dev/null
        +++ b/bower_components/jquery/src/css/var/swap.js
        @@ -0,0 +1,26 @@
        +define( function() {
        +
        +"use strict";
        +
        +// A method for quickly swapping in/out CSS properties to get correct calculations.
        +return function( elem, options, callback, args ) {
        +	var ret, name,
        +		old = {};
        +
        +	// Remember the old values, and insert the new ones
        +	for ( name in options ) {
        +		old[ name ] = elem.style[ name ];
        +		elem.style[ name ] = options[ name ];
        +	}
        +
        +	ret = callback.apply( elem, args || [] );
        +
        +	// Revert the old values
        +	for ( name in options ) {
        +		elem.style[ name ] = old[ name ];
        +	}
        +
        +	return ret;
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/data.js b/bower_components/jquery/src/data.js
        new file mode 100644
        index 0000000000..087ce4eb72
        --- /dev/null
        +++ b/bower_components/jquery/src/data.js
        @@ -0,0 +1,179 @@
        +define( [
        +	"./core",
        +	"./core/access",
        +	"./data/var/dataPriv",
        +	"./data/var/dataUser"
        +], function( jQuery, access, dataPriv, dataUser ) {
        +
        +"use strict";
        +
        +//	Implementation Summary
        +//
        +//	1. Enforce API surface and semantic compatibility with 1.9.x branch
        +//	2. Improve the module's maintainability by reducing the storage
        +//		paths to a single mechanism.
        +//	3. Use the same single mechanism to support "private" and "user" data.
        +//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
        +//	5. Avoid exposing implementation details on user objects (eg. expando properties)
        +//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
        +
        +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
        +	rmultiDash = /[A-Z]/g;
        +
        +function getData( data ) {
        +	if ( data === "true" ) {
        +		return true;
        +	}
        +
        +	if ( data === "false" ) {
        +		return false;
        +	}
        +
        +	if ( data === "null" ) {
        +		return null;
        +	}
        +
        +	// Only convert to a number if it doesn't change the string
        +	if ( data === +data + "" ) {
        +		return +data;
        +	}
        +
        +	if ( rbrace.test( data ) ) {
        +		return JSON.parse( data );
        +	}
        +
        +	return data;
        +}
        +
        +function dataAttr( elem, key, data ) {
        +	var name;
        +
        +	// If nothing was found internally, try to fetch any
        +	// data from the HTML5 data-* attribute
        +	if ( data === undefined && elem.nodeType === 1 ) {
        +		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
        +		data = elem.getAttribute( name );
        +
        +		if ( typeof data === "string" ) {
        +			try {
        +				data = getData( data );
        +			} catch ( e ) {}
        +
        +			// Make sure we set the data so it isn't changed later
        +			dataUser.set( elem, key, data );
        +		} else {
        +			data = undefined;
        +		}
        +	}
        +	return data;
        +}
        +
        +jQuery.extend( {
        +	hasData: function( elem ) {
        +		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
        +	},
        +
        +	data: function( elem, name, data ) {
        +		return dataUser.access( elem, name, data );
        +	},
        +
        +	removeData: function( elem, name ) {
        +		dataUser.remove( elem, name );
        +	},
        +
        +	// TODO: Now that all calls to _data and _removeData have been replaced
        +	// with direct calls to dataPriv methods, these can be deprecated.
        +	_data: function( elem, name, data ) {
        +		return dataPriv.access( elem, name, data );
        +	},
        +
        +	_removeData: function( elem, name ) {
        +		dataPriv.remove( elem, name );
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	data: function( key, value ) {
        +		var i, name, data,
        +			elem = this[ 0 ],
        +			attrs = elem && elem.attributes;
        +
        +		// Gets all values
        +		if ( key === undefined ) {
        +			if ( this.length ) {
        +				data = dataUser.get( elem );
        +
        +				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
        +					i = attrs.length;
        +					while ( i-- ) {
        +
        +						// Support: IE 11 only
        +						// The attrs elements can be null (#14894)
        +						if ( attrs[ i ] ) {
        +							name = attrs[ i ].name;
        +							if ( name.indexOf( "data-" ) === 0 ) {
        +								name = jQuery.camelCase( name.slice( 5 ) );
        +								dataAttr( elem, name, data[ name ] );
        +							}
        +						}
        +					}
        +					dataPriv.set( elem, "hasDataAttrs", true );
        +				}
        +			}
        +
        +			return data;
        +		}
        +
        +		// Sets multiple values
        +		if ( typeof key === "object" ) {
        +			return this.each( function() {
        +				dataUser.set( this, key );
        +			} );
        +		}
        +
        +		return access( this, function( value ) {
        +			var data;
        +
        +			// The calling jQuery object (element matches) is not empty
        +			// (and therefore has an element appears at this[ 0 ]) and the
        +			// `value` parameter was not undefined. An empty jQuery object
        +			// will result in `undefined` for elem = this[ 0 ] which will
        +			// throw an exception if an attempt to read a data cache is made.
        +			if ( elem && value === undefined ) {
        +
        +				// Attempt to get data from the cache
        +				// The key will always be camelCased in Data
        +				data = dataUser.get( elem, key );
        +				if ( data !== undefined ) {
        +					return data;
        +				}
        +
        +				// Attempt to "discover" the data in
        +				// HTML5 custom data-* attrs
        +				data = dataAttr( elem, key );
        +				if ( data !== undefined ) {
        +					return data;
        +				}
        +
        +				// We tried really hard, but the data doesn't exist.
        +				return;
        +			}
        +
        +			// Set the data...
        +			this.each( function() {
        +
        +				// We always store the camelCased key
        +				dataUser.set( this, key, value );
        +			} );
        +		}, null, value, arguments.length > 1, null, true );
        +	},
        +
        +	removeData: function( key ) {
        +		return this.each( function() {
        +			dataUser.remove( this, key );
        +		} );
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/data/Data.js b/bower_components/jquery/src/data/Data.js
        new file mode 100644
        index 0000000000..43ae01623b
        --- /dev/null
        +++ b/bower_components/jquery/src/data/Data.js
        @@ -0,0 +1,161 @@
        +define( [
        +	"../core",
        +	"../var/rnothtmlwhite",
        +	"./var/acceptData"
        +], function( jQuery, rnothtmlwhite, acceptData ) {
        +
        +"use strict";
        +
        +function Data() {
        +	this.expando = jQuery.expando + Data.uid++;
        +}
        +
        +Data.uid = 1;
        +
        +Data.prototype = {
        +
        +	cache: function( owner ) {
        +
        +		// Check if the owner object already has a cache
        +		var value = owner[ this.expando ];
        +
        +		// If not, create one
        +		if ( !value ) {
        +			value = {};
        +
        +			// We can accept data for non-element nodes in modern browsers,
        +			// but we should not, see #8335.
        +			// Always return an empty object.
        +			if ( acceptData( owner ) ) {
        +
        +				// If it is a node unlikely to be stringify-ed or looped over
        +				// use plain assignment
        +				if ( owner.nodeType ) {
        +					owner[ this.expando ] = value;
        +
        +				// Otherwise secure it in a non-enumerable property
        +				// configurable must be true to allow the property to be
        +				// deleted when data is removed
        +				} else {
        +					Object.defineProperty( owner, this.expando, {
        +						value: value,
        +						configurable: true
        +					} );
        +				}
        +			}
        +		}
        +
        +		return value;
        +	},
        +	set: function( owner, data, value ) {
        +		var prop,
        +			cache = this.cache( owner );
        +
        +		// Handle: [ owner, key, value ] args
        +		// Always use camelCase key (gh-2257)
        +		if ( typeof data === "string" ) {
        +			cache[ jQuery.camelCase( data ) ] = value;
        +
        +		// Handle: [ owner, { properties } ] args
        +		} else {
        +
        +			// Copy the properties one-by-one to the cache object
        +			for ( prop in data ) {
        +				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
        +			}
        +		}
        +		return cache;
        +	},
        +	get: function( owner, key ) {
        +		return key === undefined ?
        +			this.cache( owner ) :
        +
        +			// Always use camelCase key (gh-2257)
        +			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
        +	},
        +	access: function( owner, key, value ) {
        +
        +		// In cases where either:
        +		//
        +		//   1. No key was specified
        +		//   2. A string key was specified, but no value provided
        +		//
        +		// Take the "read" path and allow the get method to determine
        +		// which value to return, respectively either:
        +		//
        +		//   1. The entire cache object
        +		//   2. The data stored at the key
        +		//
        +		if ( key === undefined ||
        +				( ( key && typeof key === "string" ) && value === undefined ) ) {
        +
        +			return this.get( owner, key );
        +		}
        +
        +		// When the key is not a string, or both a key and value
        +		// are specified, set or extend (existing objects) with either:
        +		//
        +		//   1. An object of properties
        +		//   2. A key and value
        +		//
        +		this.set( owner, key, value );
        +
        +		// Since the "set" path can have two possible entry points
        +		// return the expected data based on which path was taken[*]
        +		return value !== undefined ? value : key;
        +	},
        +	remove: function( owner, key ) {
        +		var i,
        +			cache = owner[ this.expando ];
        +
        +		if ( cache === undefined ) {
        +			return;
        +		}
        +
        +		if ( key !== undefined ) {
        +
        +			// Support array or space separated string of keys
        +			if ( jQuery.isArray( key ) ) {
        +
        +				// If key is an array of keys...
        +				// We always set camelCase keys, so remove that.
        +				key = key.map( jQuery.camelCase );
        +			} else {
        +				key = jQuery.camelCase( key );
        +
        +				// If a key with the spaces exists, use it.
        +				// Otherwise, create an array by matching non-whitespace
        +				key = key in cache ?
        +					[ key ] :
        +					( key.match( rnothtmlwhite ) || [] );
        +			}
        +
        +			i = key.length;
        +
        +			while ( i-- ) {
        +				delete cache[ key[ i ] ];
        +			}
        +		}
        +
        +		// Remove the expando if there's no more data
        +		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
        +
        +			// Support: Chrome <=35 - 45
        +			// Webkit & Blink performance suffers when deleting properties
        +			// from DOM nodes, so set to undefined instead
        +			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
        +			if ( owner.nodeType ) {
        +				owner[ this.expando ] = undefined;
        +			} else {
        +				delete owner[ this.expando ];
        +			}
        +		}
        +	},
        +	hasData: function( owner ) {
        +		var cache = owner[ this.expando ];
        +		return cache !== undefined && !jQuery.isEmptyObject( cache );
        +	}
        +};
        +
        +return Data;
        +} );
        diff --git a/bower_components/jquery/src/data/var/acceptData.js b/bower_components/jquery/src/data/var/acceptData.js
        new file mode 100644
        index 0000000000..e00f7538b3
        --- /dev/null
        +++ b/bower_components/jquery/src/data/var/acceptData.js
        @@ -0,0 +1,19 @@
        +define( function() {
        +
        +"use strict";
        +
        +/**
        + * Determines whether an object can have data
        + */
        +return function( owner ) {
        +
        +	// Accepts only:
        +	//  - Node
        +	//    - Node.ELEMENT_NODE
        +	//    - Node.DOCUMENT_NODE
        +	//  - Object
        +	//    - Any
        +	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/data/var/dataPriv.js b/bower_components/jquery/src/data/var/dataPriv.js
        new file mode 100644
        index 0000000000..72713c88cc
        --- /dev/null
        +++ b/bower_components/jquery/src/data/var/dataPriv.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"../Data"
        +], function( Data ) {
        +	"use strict";
        +
        +	return new Data();
        +} );
        diff --git a/bower_components/jquery/src/data/var/dataUser.js b/bower_components/jquery/src/data/var/dataUser.js
        new file mode 100644
        index 0000000000..72713c88cc
        --- /dev/null
        +++ b/bower_components/jquery/src/data/var/dataUser.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"../Data"
        +], function( Data ) {
        +	"use strict";
        +
        +	return new Data();
        +} );
        diff --git a/bower_components/jquery/src/deferred.js b/bower_components/jquery/src/deferred.js
        new file mode 100644
        index 0000000000..8139515fef
        --- /dev/null
        +++ b/bower_components/jquery/src/deferred.js
        @@ -0,0 +1,389 @@
        +define( [
        +	"./core",
        +	"./var/slice",
        +	"./callbacks"
        +], function( jQuery, slice ) {
        +
        +"use strict";
        +
        +function Identity( v ) {
        +	return v;
        +}
        +function Thrower( ex ) {
        +	throw ex;
        +}
        +
        +function adoptValue( value, resolve, reject ) {
        +	var method;
        +
        +	try {
        +
        +		// Check for promise aspect first to privilege synchronous behavior
        +		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
        +			method.call( value ).done( resolve ).fail( reject );
        +
        +		// Other thenables
        +		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
        +			method.call( value, resolve, reject );
        +
        +		// Other non-thenables
        +		} else {
        +
        +			// Support: Android 4.0 only
        +			// Strict mode functions invoked without .call/.apply get global-object context
        +			resolve.call( undefined, value );
        +		}
        +
        +	// For Promises/A+, convert exceptions into rejections
        +	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
        +	// Deferred#then to conditionally suppress rejection.
        +	} catch ( value ) {
        +
        +		// Support: Android 4.0 only
        +		// Strict mode functions invoked without .call/.apply get global-object context
        +		reject.call( undefined, value );
        +	}
        +}
        +
        +jQuery.extend( {
        +
        +	Deferred: function( func ) {
        +		var tuples = [
        +
        +				// action, add listener, callbacks,
        +				// ... .then handlers, argument index, [final state]
        +				[ "notify", "progress", jQuery.Callbacks( "memory" ),
        +					jQuery.Callbacks( "memory" ), 2 ],
        +				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
        +					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
        +				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
        +					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
        +			],
        +			state = "pending",
        +			promise = {
        +				state: function() {
        +					return state;
        +				},
        +				always: function() {
        +					deferred.done( arguments ).fail( arguments );
        +					return this;
        +				},
        +				"catch": function( fn ) {
        +					return promise.then( null, fn );
        +				},
        +
        +				// Keep pipe for back-compat
        +				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
        +					var fns = arguments;
        +
        +					return jQuery.Deferred( function( newDefer ) {
        +						jQuery.each( tuples, function( i, tuple ) {
        +
        +							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
        +							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
        +
        +							// deferred.progress(function() { bind to newDefer or newDefer.notify })
        +							// deferred.done(function() { bind to newDefer or newDefer.resolve })
        +							// deferred.fail(function() { bind to newDefer or newDefer.reject })
        +							deferred[ tuple[ 1 ] ]( function() {
        +								var returned = fn && fn.apply( this, arguments );
        +								if ( returned && jQuery.isFunction( returned.promise ) ) {
        +									returned.promise()
        +										.progress( newDefer.notify )
        +										.done( newDefer.resolve )
        +										.fail( newDefer.reject );
        +								} else {
        +									newDefer[ tuple[ 0 ] + "With" ](
        +										this,
        +										fn ? [ returned ] : arguments
        +									);
        +								}
        +							} );
        +						} );
        +						fns = null;
        +					} ).promise();
        +				},
        +				then: function( onFulfilled, onRejected, onProgress ) {
        +					var maxDepth = 0;
        +					function resolve( depth, deferred, handler, special ) {
        +						return function() {
        +							var that = this,
        +								args = arguments,
        +								mightThrow = function() {
        +									var returned, then;
        +
        +									// Support: Promises/A+ section 2.3.3.3.3
        +									// https://promisesaplus.com/#point-59
        +									// Ignore double-resolution attempts
        +									if ( depth < maxDepth ) {
        +										return;
        +									}
        +
        +									returned = handler.apply( that, args );
        +
        +									// Support: Promises/A+ section 2.3.1
        +									// https://promisesaplus.com/#point-48
        +									if ( returned === deferred.promise() ) {
        +										throw new TypeError( "Thenable self-resolution" );
        +									}
        +
        +									// Support: Promises/A+ sections 2.3.3.1, 3.5
        +									// https://promisesaplus.com/#point-54
        +									// https://promisesaplus.com/#point-75
        +									// Retrieve `then` only once
        +									then = returned &&
        +
        +										// Support: Promises/A+ section 2.3.4
        +										// https://promisesaplus.com/#point-64
        +										// Only check objects and functions for thenability
        +										( typeof returned === "object" ||
        +											typeof returned === "function" ) &&
        +										returned.then;
        +
        +									// Handle a returned thenable
        +									if ( jQuery.isFunction( then ) ) {
        +
        +										// Special processors (notify) just wait for resolution
        +										if ( special ) {
        +											then.call(
        +												returned,
        +												resolve( maxDepth, deferred, Identity, special ),
        +												resolve( maxDepth, deferred, Thrower, special )
        +											);
        +
        +										// Normal processors (resolve) also hook into progress
        +										} else {
        +
        +											// ...and disregard older resolution values
        +											maxDepth++;
        +
        +											then.call(
        +												returned,
        +												resolve( maxDepth, deferred, Identity, special ),
        +												resolve( maxDepth, deferred, Thrower, special ),
        +												resolve( maxDepth, deferred, Identity,
        +													deferred.notifyWith )
        +											);
        +										}
        +
        +									// Handle all other returned values
        +									} else {
        +
        +										// Only substitute handlers pass on context
        +										// and multiple values (non-spec behavior)
        +										if ( handler !== Identity ) {
        +											that = undefined;
        +											args = [ returned ];
        +										}
        +
        +										// Process the value(s)
        +										// Default process is resolve
        +										( special || deferred.resolveWith )( that, args );
        +									}
        +								},
        +
        +								// Only normal processors (resolve) catch and reject exceptions
        +								process = special ?
        +									mightThrow :
        +									function() {
        +										try {
        +											mightThrow();
        +										} catch ( e ) {
        +
        +											if ( jQuery.Deferred.exceptionHook ) {
        +												jQuery.Deferred.exceptionHook( e,
        +													process.stackTrace );
        +											}
        +
        +											// Support: Promises/A+ section 2.3.3.3.4.1
        +											// https://promisesaplus.com/#point-61
        +											// Ignore post-resolution exceptions
        +											if ( depth + 1 >= maxDepth ) {
        +
        +												// Only substitute handlers pass on context
        +												// and multiple values (non-spec behavior)
        +												if ( handler !== Thrower ) {
        +													that = undefined;
        +													args = [ e ];
        +												}
        +
        +												deferred.rejectWith( that, args );
        +											}
        +										}
        +									};
        +
        +							// Support: Promises/A+ section 2.3.3.3.1
        +							// https://promisesaplus.com/#point-57
        +							// Re-resolve promises immediately to dodge false rejection from
        +							// subsequent errors
        +							if ( depth ) {
        +								process();
        +							} else {
        +
        +								// Call an optional hook to record the stack, in case of exception
        +								// since it's otherwise lost when execution goes async
        +								if ( jQuery.Deferred.getStackHook ) {
        +									process.stackTrace = jQuery.Deferred.getStackHook();
        +								}
        +								window.setTimeout( process );
        +							}
        +						};
        +					}
        +
        +					return jQuery.Deferred( function( newDefer ) {
        +
        +						// progress_handlers.add( ... )
        +						tuples[ 0 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onProgress ) ?
        +									onProgress :
        +									Identity,
        +								newDefer.notifyWith
        +							)
        +						);
        +
        +						// fulfilled_handlers.add( ... )
        +						tuples[ 1 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onFulfilled ) ?
        +									onFulfilled :
        +									Identity
        +							)
        +						);
        +
        +						// rejected_handlers.add( ... )
        +						tuples[ 2 ][ 3 ].add(
        +							resolve(
        +								0,
        +								newDefer,
        +								jQuery.isFunction( onRejected ) ?
        +									onRejected :
        +									Thrower
        +							)
        +						);
        +					} ).promise();
        +				},
        +
        +				// Get a promise for this deferred
        +				// If obj is provided, the promise aspect is added to the object
        +				promise: function( obj ) {
        +					return obj != null ? jQuery.extend( obj, promise ) : promise;
        +				}
        +			},
        +			deferred = {};
        +
        +		// Add list-specific methods
        +		jQuery.each( tuples, function( i, tuple ) {
        +			var list = tuple[ 2 ],
        +				stateString = tuple[ 5 ];
        +
        +			// promise.progress = list.add
        +			// promise.done = list.add
        +			// promise.fail = list.add
        +			promise[ tuple[ 1 ] ] = list.add;
        +
        +			// Handle state
        +			if ( stateString ) {
        +				list.add(
        +					function() {
        +
        +						// state = "resolved" (i.e., fulfilled)
        +						// state = "rejected"
        +						state = stateString;
        +					},
        +
        +					// rejected_callbacks.disable
        +					// fulfilled_callbacks.disable
        +					tuples[ 3 - i ][ 2 ].disable,
        +
        +					// progress_callbacks.lock
        +					tuples[ 0 ][ 2 ].lock
        +				);
        +			}
        +
        +			// progress_handlers.fire
        +			// fulfilled_handlers.fire
        +			// rejected_handlers.fire
        +			list.add( tuple[ 3 ].fire );
        +
        +			// deferred.notify = function() { deferred.notifyWith(...) }
        +			// deferred.resolve = function() { deferred.resolveWith(...) }
        +			// deferred.reject = function() { deferred.rejectWith(...) }
        +			deferred[ tuple[ 0 ] ] = function() {
        +				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
        +				return this;
        +			};
        +
        +			// deferred.notifyWith = list.fireWith
        +			// deferred.resolveWith = list.fireWith
        +			// deferred.rejectWith = list.fireWith
        +			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
        +		} );
        +
        +		// Make the deferred a promise
        +		promise.promise( deferred );
        +
        +		// Call given func if any
        +		if ( func ) {
        +			func.call( deferred, deferred );
        +		}
        +
        +		// All done!
        +		return deferred;
        +	},
        +
        +	// Deferred helper
        +	when: function( singleValue ) {
        +		var
        +
        +			// count of uncompleted subordinates
        +			remaining = arguments.length,
        +
        +			// count of unprocessed arguments
        +			i = remaining,
        +
        +			// subordinate fulfillment data
        +			resolveContexts = Array( i ),
        +			resolveValues = slice.call( arguments ),
        +
        +			// the master Deferred
        +			master = jQuery.Deferred(),
        +
        +			// subordinate callback factory
        +			updateFunc = function( i ) {
        +				return function( value ) {
        +					resolveContexts[ i ] = this;
        +					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
        +					if ( !( --remaining ) ) {
        +						master.resolveWith( resolveContexts, resolveValues );
        +					}
        +				};
        +			};
        +
        +		// Single- and empty arguments are adopted like Promise.resolve
        +		if ( remaining <= 1 ) {
        +			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
        +
        +			// Use .then() to unwrap secondary thenables (cf. gh-3000)
        +			if ( master.state() === "pending" ||
        +				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
        +
        +				return master.then();
        +			}
        +		}
        +
        +		// Multiple arguments are aggregated like Promise.all array elements
        +		while ( i-- ) {
        +			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
        +		}
        +
        +		return master.promise();
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/deferred/exceptionHook.js b/bower_components/jquery/src/deferred/exceptionHook.js
        new file mode 100644
        index 0000000000..6dbdc85208
        --- /dev/null
        +++ b/bower_components/jquery/src/deferred/exceptionHook.js
        @@ -0,0 +1,21 @@
        +define( [
        +	"../core",
        +	"../deferred"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +// These usually indicate a programmer mistake during development,
        +// warn about them ASAP rather than swallowing them by default.
        +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
        +
        +jQuery.Deferred.exceptionHook = function( error, stack ) {
        +
        +	// Support: IE 8 - 9 only
        +	// Console exists when dev tools are open, which can happen at any time
        +	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
        +		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
        +	}
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/deprecated.js b/bower_components/jquery/src/deprecated.js
        new file mode 100644
        index 0000000000..9fcc6b7daa
        --- /dev/null
        +++ b/bower_components/jquery/src/deprecated.js
        @@ -0,0 +1,30 @@
        +define( [
        +	"./core"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +jQuery.fn.extend( {
        +
        +	bind: function( types, data, fn ) {
        +		return this.on( types, null, data, fn );
        +	},
        +	unbind: function( types, fn ) {
        +		return this.off( types, null, fn );
        +	},
        +
        +	delegate: function( selector, types, data, fn ) {
        +		return this.on( types, selector, data, fn );
        +	},
        +	undelegate: function( selector, types, fn ) {
        +
        +		// ( namespace ) or ( selector, types [, fn] )
        +		return arguments.length === 1 ?
        +			this.off( selector, "**" ) :
        +			this.off( types, selector || "**", fn );
        +	}
        +} );
        +
        +jQuery.parseJSON = JSON.parse;
        +
        +} );
        diff --git a/bower_components/jquery/src/dimensions.js b/bower_components/jquery/src/dimensions.js
        new file mode 100644
        index 0000000000..46e7b1c460
        --- /dev/null
        +++ b/bower_components/jquery/src/dimensions.js
        @@ -0,0 +1,56 @@
        +define( [
        +	"./core",
        +	"./core/access",
        +	"./css"
        +], function( jQuery, access ) {
        +
        +"use strict";
        +
        +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
        +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        +	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
        +		function( defaultExtra, funcName ) {
        +
        +		// Margin is only for outerHeight, outerWidth
        +		jQuery.fn[ funcName ] = function( margin, value ) {
        +			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
        +				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
        +
        +			return access( this, function( elem, type, value ) {
        +				var doc;
        +
        +				if ( jQuery.isWindow( elem ) ) {
        +
        +					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
        +					return funcName.indexOf( "outer" ) === 0 ?
        +						elem[ "inner" + name ] :
        +						elem.document.documentElement[ "client" + name ];
        +				}
        +
        +				// Get document width or height
        +				if ( elem.nodeType === 9 ) {
        +					doc = elem.documentElement;
        +
        +					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
        +					// whichever is greatest
        +					return Math.max(
        +						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
        +						elem.body[ "offset" + name ], doc[ "offset" + name ],
        +						doc[ "client" + name ]
        +					);
        +				}
        +
        +				return value === undefined ?
        +
        +					// Get width or height on the element, requesting but not forcing parseFloat
        +					jQuery.css( elem, type, extra ) :
        +
        +					// Set width or height on the element
        +					jQuery.style( elem, type, value, extra );
        +			}, type, chainable ? margin : undefined, chainable );
        +		};
        +	} );
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/effects.js b/bower_components/jquery/src/effects.js
        new file mode 100644
        index 0000000000..68af96c61a
        --- /dev/null
        +++ b/bower_components/jquery/src/effects.js
        @@ -0,0 +1,693 @@
        +define( [
        +	"./core",
        +	"./var/document",
        +	"./var/rcssNum",
        +	"./var/rnothtmlwhite",
        +	"./css/var/cssExpand",
        +	"./css/var/isHiddenWithinTree",
        +	"./css/var/swap",
        +	"./css/adjustCSS",
        +	"./data/var/dataPriv",
        +	"./css/showHide",
        +
        +	"./core/init",
        +	"./queue",
        +	"./deferred",
        +	"./traversing",
        +	"./manipulation",
        +	"./css",
        +	"./effects/Tween"
        +], function( jQuery, document, rcssNum, rnothtmlwhite, cssExpand, isHiddenWithinTree, swap,
        +	adjustCSS, dataPriv, showHide ) {
        +
        +"use strict";
        +
        +var
        +	fxNow, timerId,
        +	rfxtypes = /^(?:toggle|show|hide)$/,
        +	rrun = /queueHooks$/;
        +
        +function raf() {
        +	if ( timerId ) {
        +		window.requestAnimationFrame( raf );
        +		jQuery.fx.tick();
        +	}
        +}
        +
        +// Animations created synchronously will run synchronously
        +function createFxNow() {
        +	window.setTimeout( function() {
        +		fxNow = undefined;
        +	} );
        +	return ( fxNow = jQuery.now() );
        +}
        +
        +// Generate parameters to create a standard animation
        +function genFx( type, includeWidth ) {
        +	var which,
        +		i = 0,
        +		attrs = { height: type };
        +
        +	// If we include width, step value is 1 to do all cssExpand values,
        +	// otherwise step value is 2 to skip over Left and Right
        +	includeWidth = includeWidth ? 1 : 0;
        +	for ( ; i < 4; i += 2 - includeWidth ) {
        +		which = cssExpand[ i ];
        +		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
        +	}
        +
        +	if ( includeWidth ) {
        +		attrs.opacity = attrs.width = type;
        +	}
        +
        +	return attrs;
        +}
        +
        +function createTween( value, prop, animation ) {
        +	var tween,
        +		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
        +		index = 0,
        +		length = collection.length;
        +	for ( ; index < length; index++ ) {
        +		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
        +
        +			// We're done with this property
        +			return tween;
        +		}
        +	}
        +}
        +
        +function defaultPrefilter( elem, props, opts ) {
        +	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
        +		isBox = "width" in props || "height" in props,
        +		anim = this,
        +		orig = {},
        +		style = elem.style,
        +		hidden = elem.nodeType && isHiddenWithinTree( elem ),
        +		dataShow = dataPriv.get( elem, "fxshow" );
        +
        +	// Queue-skipping animations hijack the fx hooks
        +	if ( !opts.queue ) {
        +		hooks = jQuery._queueHooks( elem, "fx" );
        +		if ( hooks.unqueued == null ) {
        +			hooks.unqueued = 0;
        +			oldfire = hooks.empty.fire;
        +			hooks.empty.fire = function() {
        +				if ( !hooks.unqueued ) {
        +					oldfire();
        +				}
        +			};
        +		}
        +		hooks.unqueued++;
        +
        +		anim.always( function() {
        +
        +			// Ensure the complete handler is called before this completes
        +			anim.always( function() {
        +				hooks.unqueued--;
        +				if ( !jQuery.queue( elem, "fx" ).length ) {
        +					hooks.empty.fire();
        +				}
        +			} );
        +		} );
        +	}
        +
        +	// Detect show/hide animations
        +	for ( prop in props ) {
        +		value = props[ prop ];
        +		if ( rfxtypes.test( value ) ) {
        +			delete props[ prop ];
        +			toggle = toggle || value === "toggle";
        +			if ( value === ( hidden ? "hide" : "show" ) ) {
        +
        +				// Pretend to be hidden if this is a "show" and
        +				// there is still data from a stopped show/hide
        +				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
        +					hidden = true;
        +
        +				// Ignore all other no-op show/hide data
        +				} else {
        +					continue;
        +				}
        +			}
        +			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
        +		}
        +	}
        +
        +	// Bail out if this is a no-op like .hide().hide()
        +	propTween = !jQuery.isEmptyObject( props );
        +	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
        +		return;
        +	}
        +
        +	// Restrict "overflow" and "display" styles during box animations
        +	if ( isBox && elem.nodeType === 1 ) {
        +
        +		// Support: IE <=9 - 11, Edge 12 - 13
        +		// Record all 3 overflow attributes because IE does not infer the shorthand
        +		// from identically-valued overflowX and overflowY
        +		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
        +
        +		// Identify a display type, preferring old show/hide data over the CSS cascade
        +		restoreDisplay = dataShow && dataShow.display;
        +		if ( restoreDisplay == null ) {
        +			restoreDisplay = dataPriv.get( elem, "display" );
        +		}
        +		display = jQuery.css( elem, "display" );
        +		if ( display === "none" ) {
        +			if ( restoreDisplay ) {
        +				display = restoreDisplay;
        +			} else {
        +
        +				// Get nonempty value(s) by temporarily forcing visibility
        +				showHide( [ elem ], true );
        +				restoreDisplay = elem.style.display || restoreDisplay;
        +				display = jQuery.css( elem, "display" );
        +				showHide( [ elem ] );
        +			}
        +		}
        +
        +		// Animate inline elements as inline-block
        +		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
        +			if ( jQuery.css( elem, "float" ) === "none" ) {
        +
        +				// Restore the original display value at the end of pure show/hide animations
        +				if ( !propTween ) {
        +					anim.done( function() {
        +						style.display = restoreDisplay;
        +					} );
        +					if ( restoreDisplay == null ) {
        +						display = style.display;
        +						restoreDisplay = display === "none" ? "" : display;
        +					}
        +				}
        +				style.display = "inline-block";
        +			}
        +		}
        +	}
        +
        +	if ( opts.overflow ) {
        +		style.overflow = "hidden";
        +		anim.always( function() {
        +			style.overflow = opts.overflow[ 0 ];
        +			style.overflowX = opts.overflow[ 1 ];
        +			style.overflowY = opts.overflow[ 2 ];
        +		} );
        +	}
        +
        +	// Implement show/hide animations
        +	propTween = false;
        +	for ( prop in orig ) {
        +
        +		// General show/hide setup for this element animation
        +		if ( !propTween ) {
        +			if ( dataShow ) {
        +				if ( "hidden" in dataShow ) {
        +					hidden = dataShow.hidden;
        +				}
        +			} else {
        +				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
        +			}
        +
        +			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
        +			if ( toggle ) {
        +				dataShow.hidden = !hidden;
        +			}
        +
        +			// Show elements before animating them
        +			if ( hidden ) {
        +				showHide( [ elem ], true );
        +			}
        +
        +			/* eslint-disable no-loop-func */
        +
        +			anim.done( function() {
        +
        +			/* eslint-enable no-loop-func */
        +
        +				// The final step of a "hide" animation is actually hiding the element
        +				if ( !hidden ) {
        +					showHide( [ elem ] );
        +				}
        +				dataPriv.remove( elem, "fxshow" );
        +				for ( prop in orig ) {
        +					jQuery.style( elem, prop, orig[ prop ] );
        +				}
        +			} );
        +		}
        +
        +		// Per-property setup
        +		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
        +		if ( !( prop in dataShow ) ) {
        +			dataShow[ prop ] = propTween.start;
        +			if ( hidden ) {
        +				propTween.end = propTween.start;
        +				propTween.start = 0;
        +			}
        +		}
        +	}
        +}
        +
        +function propFilter( props, specialEasing ) {
        +	var index, name, easing, value, hooks;
        +
        +	// camelCase, specialEasing and expand cssHook pass
        +	for ( index in props ) {
        +		name = jQuery.camelCase( index );
        +		easing = specialEasing[ name ];
        +		value = props[ index ];
        +		if ( jQuery.isArray( value ) ) {
        +			easing = value[ 1 ];
        +			value = props[ index ] = value[ 0 ];
        +		}
        +
        +		if ( index !== name ) {
        +			props[ name ] = value;
        +			delete props[ index ];
        +		}
        +
        +		hooks = jQuery.cssHooks[ name ];
        +		if ( hooks && "expand" in hooks ) {
        +			value = hooks.expand( value );
        +			delete props[ name ];
        +
        +			// Not quite $.extend, this won't overwrite existing keys.
        +			// Reusing 'index' because we have the correct "name"
        +			for ( index in value ) {
        +				if ( !( index in props ) ) {
        +					props[ index ] = value[ index ];
        +					specialEasing[ index ] = easing;
        +				}
        +			}
        +		} else {
        +			specialEasing[ name ] = easing;
        +		}
        +	}
        +}
        +
        +function Animation( elem, properties, options ) {
        +	var result,
        +		stopped,
        +		index = 0,
        +		length = Animation.prefilters.length,
        +		deferred = jQuery.Deferred().always( function() {
        +
        +			// Don't match elem in the :animated selector
        +			delete tick.elem;
        +		} ),
        +		tick = function() {
        +			if ( stopped ) {
        +				return false;
        +			}
        +			var currentTime = fxNow || createFxNow(),
        +				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
        +
        +				// Support: Android 2.3 only
        +				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
        +				temp = remaining / animation.duration || 0,
        +				percent = 1 - temp,
        +				index = 0,
        +				length = animation.tweens.length;
        +
        +			for ( ; index < length; index++ ) {
        +				animation.tweens[ index ].run( percent );
        +			}
        +
        +			deferred.notifyWith( elem, [ animation, percent, remaining ] );
        +
        +			if ( percent < 1 && length ) {
        +				return remaining;
        +			} else {
        +				deferred.resolveWith( elem, [ animation ] );
        +				return false;
        +			}
        +		},
        +		animation = deferred.promise( {
        +			elem: elem,
        +			props: jQuery.extend( {}, properties ),
        +			opts: jQuery.extend( true, {
        +				specialEasing: {},
        +				easing: jQuery.easing._default
        +			}, options ),
        +			originalProperties: properties,
        +			originalOptions: options,
        +			startTime: fxNow || createFxNow(),
        +			duration: options.duration,
        +			tweens: [],
        +			createTween: function( prop, end ) {
        +				var tween = jQuery.Tween( elem, animation.opts, prop, end,
        +						animation.opts.specialEasing[ prop ] || animation.opts.easing );
        +				animation.tweens.push( tween );
        +				return tween;
        +			},
        +			stop: function( gotoEnd ) {
        +				var index = 0,
        +
        +					// If we are going to the end, we want to run all the tweens
        +					// otherwise we skip this part
        +					length = gotoEnd ? animation.tweens.length : 0;
        +				if ( stopped ) {
        +					return this;
        +				}
        +				stopped = true;
        +				for ( ; index < length; index++ ) {
        +					animation.tweens[ index ].run( 1 );
        +				}
        +
        +				// Resolve when we played the last frame; otherwise, reject
        +				if ( gotoEnd ) {
        +					deferred.notifyWith( elem, [ animation, 1, 0 ] );
        +					deferred.resolveWith( elem, [ animation, gotoEnd ] );
        +				} else {
        +					deferred.rejectWith( elem, [ animation, gotoEnd ] );
        +				}
        +				return this;
        +			}
        +		} ),
        +		props = animation.props;
        +
        +	propFilter( props, animation.opts.specialEasing );
        +
        +	for ( ; index < length; index++ ) {
        +		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
        +		if ( result ) {
        +			if ( jQuery.isFunction( result.stop ) ) {
        +				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
        +					jQuery.proxy( result.stop, result );
        +			}
        +			return result;
        +		}
        +	}
        +
        +	jQuery.map( props, createTween, animation );
        +
        +	if ( jQuery.isFunction( animation.opts.start ) ) {
        +		animation.opts.start.call( elem, animation );
        +	}
        +
        +	jQuery.fx.timer(
        +		jQuery.extend( tick, {
        +			elem: elem,
        +			anim: animation,
        +			queue: animation.opts.queue
        +		} )
        +	);
        +
        +	// attach callbacks from options
        +	return animation.progress( animation.opts.progress )
        +		.done( animation.opts.done, animation.opts.complete )
        +		.fail( animation.opts.fail )
        +		.always( animation.opts.always );
        +}
        +
        +jQuery.Animation = jQuery.extend( Animation, {
        +
        +	tweeners: {
        +		"*": [ function( prop, value ) {
        +			var tween = this.createTween( prop, value );
        +			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
        +			return tween;
        +		} ]
        +	},
        +
        +	tweener: function( props, callback ) {
        +		if ( jQuery.isFunction( props ) ) {
        +			callback = props;
        +			props = [ "*" ];
        +		} else {
        +			props = props.match( rnothtmlwhite );
        +		}
        +
        +		var prop,
        +			index = 0,
        +			length = props.length;
        +
        +		for ( ; index < length; index++ ) {
        +			prop = props[ index ];
        +			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
        +			Animation.tweeners[ prop ].unshift( callback );
        +		}
        +	},
        +
        +	prefilters: [ defaultPrefilter ],
        +
        +	prefilter: function( callback, prepend ) {
        +		if ( prepend ) {
        +			Animation.prefilters.unshift( callback );
        +		} else {
        +			Animation.prefilters.push( callback );
        +		}
        +	}
        +} );
        +
        +jQuery.speed = function( speed, easing, fn ) {
        +	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
        +		complete: fn || !fn && easing ||
        +			jQuery.isFunction( speed ) && speed,
        +		duration: speed,
        +		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
        +	};
        +
        +	// Go to the end state if fx are off or if document is hidden
        +	if ( jQuery.fx.off || document.hidden ) {
        +		opt.duration = 0;
        +
        +	} else {
        +		if ( typeof opt.duration !== "number" ) {
        +			if ( opt.duration in jQuery.fx.speeds ) {
        +				opt.duration = jQuery.fx.speeds[ opt.duration ];
        +
        +			} else {
        +				opt.duration = jQuery.fx.speeds._default;
        +			}
        +		}
        +	}
        +
        +	// Normalize opt.queue - true/undefined/null -> "fx"
        +	if ( opt.queue == null || opt.queue === true ) {
        +		opt.queue = "fx";
        +	}
        +
        +	// Queueing
        +	opt.old = opt.complete;
        +
        +	opt.complete = function() {
        +		if ( jQuery.isFunction( opt.old ) ) {
        +			opt.old.call( this );
        +		}
        +
        +		if ( opt.queue ) {
        +			jQuery.dequeue( this, opt.queue );
        +		}
        +	};
        +
        +	return opt;
        +};
        +
        +jQuery.fn.extend( {
        +	fadeTo: function( speed, to, easing, callback ) {
        +
        +		// Show any hidden elements after setting opacity to 0
        +		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
        +
        +			// Animate to the value specified
        +			.end().animate( { opacity: to }, speed, easing, callback );
        +	},
        +	animate: function( prop, speed, easing, callback ) {
        +		var empty = jQuery.isEmptyObject( prop ),
        +			optall = jQuery.speed( speed, easing, callback ),
        +			doAnimation = function() {
        +
        +				// Operate on a copy of prop so per-property easing won't be lost
        +				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
        +
        +				// Empty animations, or finishing resolves immediately
        +				if ( empty || dataPriv.get( this, "finish" ) ) {
        +					anim.stop( true );
        +				}
        +			};
        +			doAnimation.finish = doAnimation;
        +
        +		return empty || optall.queue === false ?
        +			this.each( doAnimation ) :
        +			this.queue( optall.queue, doAnimation );
        +	},
        +	stop: function( type, clearQueue, gotoEnd ) {
        +		var stopQueue = function( hooks ) {
        +			var stop = hooks.stop;
        +			delete hooks.stop;
        +			stop( gotoEnd );
        +		};
        +
        +		if ( typeof type !== "string" ) {
        +			gotoEnd = clearQueue;
        +			clearQueue = type;
        +			type = undefined;
        +		}
        +		if ( clearQueue && type !== false ) {
        +			this.queue( type || "fx", [] );
        +		}
        +
        +		return this.each( function() {
        +			var dequeue = true,
        +				index = type != null && type + "queueHooks",
        +				timers = jQuery.timers,
        +				data = dataPriv.get( this );
        +
        +			if ( index ) {
        +				if ( data[ index ] && data[ index ].stop ) {
        +					stopQueue( data[ index ] );
        +				}
        +			} else {
        +				for ( index in data ) {
        +					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
        +						stopQueue( data[ index ] );
        +					}
        +				}
        +			}
        +
        +			for ( index = timers.length; index--; ) {
        +				if ( timers[ index ].elem === this &&
        +					( type == null || timers[ index ].queue === type ) ) {
        +
        +					timers[ index ].anim.stop( gotoEnd );
        +					dequeue = false;
        +					timers.splice( index, 1 );
        +				}
        +			}
        +
        +			// Start the next in the queue if the last step wasn't forced.
        +			// Timers currently will call their complete callbacks, which
        +			// will dequeue but only if they were gotoEnd.
        +			if ( dequeue || !gotoEnd ) {
        +				jQuery.dequeue( this, type );
        +			}
        +		} );
        +	},
        +	finish: function( type ) {
        +		if ( type !== false ) {
        +			type = type || "fx";
        +		}
        +		return this.each( function() {
        +			var index,
        +				data = dataPriv.get( this ),
        +				queue = data[ type + "queue" ],
        +				hooks = data[ type + "queueHooks" ],
        +				timers = jQuery.timers,
        +				length = queue ? queue.length : 0;
        +
        +			// Enable finishing flag on private data
        +			data.finish = true;
        +
        +			// Empty the queue first
        +			jQuery.queue( this, type, [] );
        +
        +			if ( hooks && hooks.stop ) {
        +				hooks.stop.call( this, true );
        +			}
        +
        +			// Look for any active animations, and finish them
        +			for ( index = timers.length; index--; ) {
        +				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
        +					timers[ index ].anim.stop( true );
        +					timers.splice( index, 1 );
        +				}
        +			}
        +
        +			// Look for any animations in the old queue and finish them
        +			for ( index = 0; index < length; index++ ) {
        +				if ( queue[ index ] && queue[ index ].finish ) {
        +					queue[ index ].finish.call( this );
        +				}
        +			}
        +
        +			// Turn off finishing flag
        +			delete data.finish;
        +		} );
        +	}
        +} );
        +
        +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
        +	var cssFn = jQuery.fn[ name ];
        +	jQuery.fn[ name ] = function( speed, easing, callback ) {
        +		return speed == null || typeof speed === "boolean" ?
        +			cssFn.apply( this, arguments ) :
        +			this.animate( genFx( name, true ), speed, easing, callback );
        +	};
        +} );
        +
        +// Generate shortcuts for custom animations
        +jQuery.each( {
        +	slideDown: genFx( "show" ),
        +	slideUp: genFx( "hide" ),
        +	slideToggle: genFx( "toggle" ),
        +	fadeIn: { opacity: "show" },
        +	fadeOut: { opacity: "hide" },
        +	fadeToggle: { opacity: "toggle" }
        +}, function( name, props ) {
        +	jQuery.fn[ name ] = function( speed, easing, callback ) {
        +		return this.animate( props, speed, easing, callback );
        +	};
        +} );
        +
        +jQuery.timers = [];
        +jQuery.fx.tick = function() {
        +	var timer,
        +		i = 0,
        +		timers = jQuery.timers;
        +
        +	fxNow = jQuery.now();
        +
        +	for ( ; i < timers.length; i++ ) {
        +		timer = timers[ i ];
        +
        +		// Checks the timer has not already been removed
        +		if ( !timer() && timers[ i ] === timer ) {
        +			timers.splice( i--, 1 );
        +		}
        +	}
        +
        +	if ( !timers.length ) {
        +		jQuery.fx.stop();
        +	}
        +	fxNow = undefined;
        +};
        +
        +jQuery.fx.timer = function( timer ) {
        +	jQuery.timers.push( timer );
        +	if ( timer() ) {
        +		jQuery.fx.start();
        +	} else {
        +		jQuery.timers.pop();
        +	}
        +};
        +
        +jQuery.fx.interval = 13;
        +jQuery.fx.start = function() {
        +	if ( !timerId ) {
        +		timerId = window.requestAnimationFrame ?
        +			window.requestAnimationFrame( raf ) :
        +			window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
        +	}
        +};
        +
        +jQuery.fx.stop = function() {
        +	if ( window.cancelAnimationFrame ) {
        +		window.cancelAnimationFrame( timerId );
        +	} else {
        +		window.clearInterval( timerId );
        +	}
        +
        +	timerId = null;
        +};
        +
        +jQuery.fx.speeds = {
        +	slow: 600,
        +	fast: 200,
        +
        +	// Default speed
        +	_default: 400
        +};
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/effects/Tween.js b/bower_components/jquery/src/effects/Tween.js
        new file mode 100644
        index 0000000000..43eb8fa0b1
        --- /dev/null
        +++ b/bower_components/jquery/src/effects/Tween.js
        @@ -0,0 +1,123 @@
        +define( [
        +	"../core",
        +	"../css"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +function Tween( elem, options, prop, end, easing ) {
        +	return new Tween.prototype.init( elem, options, prop, end, easing );
        +}
        +jQuery.Tween = Tween;
        +
        +Tween.prototype = {
        +	constructor: Tween,
        +	init: function( elem, options, prop, end, easing, unit ) {
        +		this.elem = elem;
        +		this.prop = prop;
        +		this.easing = easing || jQuery.easing._default;
        +		this.options = options;
        +		this.start = this.now = this.cur();
        +		this.end = end;
        +		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        +	},
        +	cur: function() {
        +		var hooks = Tween.propHooks[ this.prop ];
        +
        +		return hooks && hooks.get ?
        +			hooks.get( this ) :
        +			Tween.propHooks._default.get( this );
        +	},
        +	run: function( percent ) {
        +		var eased,
        +			hooks = Tween.propHooks[ this.prop ];
        +
        +		if ( this.options.duration ) {
        +			this.pos = eased = jQuery.easing[ this.easing ](
        +				percent, this.options.duration * percent, 0, 1, this.options.duration
        +			);
        +		} else {
        +			this.pos = eased = percent;
        +		}
        +		this.now = ( this.end - this.start ) * eased + this.start;
        +
        +		if ( this.options.step ) {
        +			this.options.step.call( this.elem, this.now, this );
        +		}
        +
        +		if ( hooks && hooks.set ) {
        +			hooks.set( this );
        +		} else {
        +			Tween.propHooks._default.set( this );
        +		}
        +		return this;
        +	}
        +};
        +
        +Tween.prototype.init.prototype = Tween.prototype;
        +
        +Tween.propHooks = {
        +	_default: {
        +		get: function( tween ) {
        +			var result;
        +
        +			// Use a property on the element directly when it is not a DOM element,
        +			// or when there is no matching style property that exists.
        +			if ( tween.elem.nodeType !== 1 ||
        +				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
        +				return tween.elem[ tween.prop ];
        +			}
        +
        +			// Passing an empty string as a 3rd parameter to .css will automatically
        +			// attempt a parseFloat and fallback to a string if the parse fails.
        +			// Simple values such as "10px" are parsed to Float;
        +			// complex values such as "rotate(1rad)" are returned as-is.
        +			result = jQuery.css( tween.elem, tween.prop, "" );
        +
        +			// Empty strings, null, undefined and "auto" are converted to 0.
        +			return !result || result === "auto" ? 0 : result;
        +		},
        +		set: function( tween ) {
        +
        +			// Use step hook for back compat.
        +			// Use cssHook if its there.
        +			// Use .style if available and use plain properties where available.
        +			if ( jQuery.fx.step[ tween.prop ] ) {
        +				jQuery.fx.step[ tween.prop ]( tween );
        +			} else if ( tween.elem.nodeType === 1 &&
        +				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
        +					jQuery.cssHooks[ tween.prop ] ) ) {
        +				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
        +			} else {
        +				tween.elem[ tween.prop ] = tween.now;
        +			}
        +		}
        +	}
        +};
        +
        +// Support: IE <=9 only
        +// Panic based approach to setting things on disconnected nodes
        +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
        +	set: function( tween ) {
        +		if ( tween.elem.nodeType && tween.elem.parentNode ) {
        +			tween.elem[ tween.prop ] = tween.now;
        +		}
        +	}
        +};
        +
        +jQuery.easing = {
        +	linear: function( p ) {
        +		return p;
        +	},
        +	swing: function( p ) {
        +		return 0.5 - Math.cos( p * Math.PI ) / 2;
        +	},
        +	_default: "swing"
        +};
        +
        +jQuery.fx = Tween.prototype.init;
        +
        +// Back compat <1.8 extension point
        +jQuery.fx.step = {};
        +
        +} );
        diff --git a/bower_components/jquery/src/effects/animatedSelector.js b/bower_components/jquery/src/effects/animatedSelector.js
        new file mode 100644
        index 0000000000..24c1bfba2c
        --- /dev/null
        +++ b/bower_components/jquery/src/effects/animatedSelector.js
        @@ -0,0 +1,15 @@
        +define( [
        +	"../core",
        +	"../selector",
        +	"../effects"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +jQuery.expr.pseudos.animated = function( elem ) {
        +	return jQuery.grep( jQuery.timers, function( fn ) {
        +		return elem === fn.elem;
        +	} ).length;
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/event.js b/bower_components/jquery/src/event.js
        new file mode 100644
        index 0000000000..ab2c63cd19
        --- /dev/null
        +++ b/bower_components/jquery/src/event.js
        @@ -0,0 +1,745 @@
        +define( [
        +	"./core",
        +	"./var/document",
        +	"./var/documentElement",
        +	"./var/rnothtmlwhite",
        +	"./var/slice",
        +	"./data/var/dataPriv",
        +
        +	"./core/init",
        +	"./selector"
        +], function( jQuery, document, documentElement, rnothtmlwhite, slice, dataPriv ) {
        +
        +"use strict";
        +
        +var
        +	rkeyEvent = /^key/,
        +	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
        +	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
        +
        +function returnTrue() {
        +	return true;
        +}
        +
        +function returnFalse() {
        +	return false;
        +}
        +
        +// Support: IE <=9 only
        +// See #13393 for more info
        +function safeActiveElement() {
        +	try {
        +		return document.activeElement;
        +	} catch ( err ) { }
        +}
        +
        +function on( elem, types, selector, data, fn, one ) {
        +	var origFn, type;
        +
        +	// Types can be a map of types/handlers
        +	if ( typeof types === "object" ) {
        +
        +		// ( types-Object, selector, data )
        +		if ( typeof selector !== "string" ) {
        +
        +			// ( types-Object, data )
        +			data = data || selector;
        +			selector = undefined;
        +		}
        +		for ( type in types ) {
        +			on( elem, type, selector, data, types[ type ], one );
        +		}
        +		return elem;
        +	}
        +
        +	if ( data == null && fn == null ) {
        +
        +		// ( types, fn )
        +		fn = selector;
        +		data = selector = undefined;
        +	} else if ( fn == null ) {
        +		if ( typeof selector === "string" ) {
        +
        +			// ( types, selector, fn )
        +			fn = data;
        +			data = undefined;
        +		} else {
        +
        +			// ( types, data, fn )
        +			fn = data;
        +			data = selector;
        +			selector = undefined;
        +		}
        +	}
        +	if ( fn === false ) {
        +		fn = returnFalse;
        +	} else if ( !fn ) {
        +		return elem;
        +	}
        +
        +	if ( one === 1 ) {
        +		origFn = fn;
        +		fn = function( event ) {
        +
        +			// Can use an empty set, since event contains the info
        +			jQuery().off( event );
        +			return origFn.apply( this, arguments );
        +		};
        +
        +		// Use same guid so caller can remove using origFn
        +		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        +	}
        +	return elem.each( function() {
        +		jQuery.event.add( this, types, fn, data, selector );
        +	} );
        +}
        +
        +/*
        + * Helper functions for managing events -- not part of the public interface.
        + * Props to Dean Edwards' addEvent library for many of the ideas.
        + */
        +jQuery.event = {
        +
        +	global: {},
        +
        +	add: function( elem, types, handler, data, selector ) {
        +
        +		var handleObjIn, eventHandle, tmp,
        +			events, t, handleObj,
        +			special, handlers, type, namespaces, origType,
        +			elemData = dataPriv.get( elem );
        +
        +		// Don't attach events to noData or text/comment nodes (but allow plain objects)
        +		if ( !elemData ) {
        +			return;
        +		}
        +
        +		// Caller can pass in an object of custom data in lieu of the handler
        +		if ( handler.handler ) {
        +			handleObjIn = handler;
        +			handler = handleObjIn.handler;
        +			selector = handleObjIn.selector;
        +		}
        +
        +		// Ensure that invalid selectors throw exceptions at attach time
        +		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
        +		if ( selector ) {
        +			jQuery.find.matchesSelector( documentElement, selector );
        +		}
        +
        +		// Make sure that the handler has a unique ID, used to find/remove it later
        +		if ( !handler.guid ) {
        +			handler.guid = jQuery.guid++;
        +		}
        +
        +		// Init the element's event structure and main handler, if this is the first
        +		if ( !( events = elemData.events ) ) {
        +			events = elemData.events = {};
        +		}
        +		if ( !( eventHandle = elemData.handle ) ) {
        +			eventHandle = elemData.handle = function( e ) {
        +
        +				// Discard the second event of a jQuery.event.trigger() and
        +				// when an event is called after a page has unloaded
        +				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
        +					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
        +			};
        +		}
        +
        +		// Handle multiple events separated by a space
        +		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
        +		t = types.length;
        +		while ( t-- ) {
        +			tmp = rtypenamespace.exec( types[ t ] ) || [];
        +			type = origType = tmp[ 1 ];
        +			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
        +
        +			// There *must* be a type, no attaching namespace-only handlers
        +			if ( !type ) {
        +				continue;
        +			}
        +
        +			// If event changes its type, use the special event handlers for the changed type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// If selector defined, determine special event api type, otherwise given type
        +			type = ( selector ? special.delegateType : special.bindType ) || type;
        +
        +			// Update special based on newly reset type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// handleObj is passed to all event handlers
        +			handleObj = jQuery.extend( {
        +				type: type,
        +				origType: origType,
        +				data: data,
        +				handler: handler,
        +				guid: handler.guid,
        +				selector: selector,
        +				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
        +				namespace: namespaces.join( "." )
        +			}, handleObjIn );
        +
        +			// Init the event handler queue if we're the first
        +			if ( !( handlers = events[ type ] ) ) {
        +				handlers = events[ type ] = [];
        +				handlers.delegateCount = 0;
        +
        +				// Only use addEventListener if the special events handler returns false
        +				if ( !special.setup ||
        +					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        +
        +					if ( elem.addEventListener ) {
        +						elem.addEventListener( type, eventHandle );
        +					}
        +				}
        +			}
        +
        +			if ( special.add ) {
        +				special.add.call( elem, handleObj );
        +
        +				if ( !handleObj.handler.guid ) {
        +					handleObj.handler.guid = handler.guid;
        +				}
        +			}
        +
        +			// Add to the element's handler list, delegates in front
        +			if ( selector ) {
        +				handlers.splice( handlers.delegateCount++, 0, handleObj );
        +			} else {
        +				handlers.push( handleObj );
        +			}
        +
        +			// Keep track of which events have ever been used, for event optimization
        +			jQuery.event.global[ type ] = true;
        +		}
        +
        +	},
        +
        +	// Detach an event or set of events from an element
        +	remove: function( elem, types, handler, selector, mappedTypes ) {
        +
        +		var j, origCount, tmp,
        +			events, t, handleObj,
        +			special, handlers, type, namespaces, origType,
        +			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
        +
        +		if ( !elemData || !( events = elemData.events ) ) {
        +			return;
        +		}
        +
        +		// Once for each type.namespace in types; type may be omitted
        +		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
        +		t = types.length;
        +		while ( t-- ) {
        +			tmp = rtypenamespace.exec( types[ t ] ) || [];
        +			type = origType = tmp[ 1 ];
        +			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
        +
        +			// Unbind all events (on this namespace, if provided) for the element
        +			if ( !type ) {
        +				for ( type in events ) {
        +					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
        +				}
        +				continue;
        +			}
        +
        +			special = jQuery.event.special[ type ] || {};
        +			type = ( selector ? special.delegateType : special.bindType ) || type;
        +			handlers = events[ type ] || [];
        +			tmp = tmp[ 2 ] &&
        +				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
        +
        +			// Remove matching events
        +			origCount = j = handlers.length;
        +			while ( j-- ) {
        +				handleObj = handlers[ j ];
        +
        +				if ( ( mappedTypes || origType === handleObj.origType ) &&
        +					( !handler || handler.guid === handleObj.guid ) &&
        +					( !tmp || tmp.test( handleObj.namespace ) ) &&
        +					( !selector || selector === handleObj.selector ||
        +						selector === "**" && handleObj.selector ) ) {
        +					handlers.splice( j, 1 );
        +
        +					if ( handleObj.selector ) {
        +						handlers.delegateCount--;
        +					}
        +					if ( special.remove ) {
        +						special.remove.call( elem, handleObj );
        +					}
        +				}
        +			}
        +
        +			// Remove generic event handler if we removed something and no more handlers exist
        +			// (avoids potential for endless recursion during removal of special event handlers)
        +			if ( origCount && !handlers.length ) {
        +				if ( !special.teardown ||
        +					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
        +
        +					jQuery.removeEvent( elem, type, elemData.handle );
        +				}
        +
        +				delete events[ type ];
        +			}
        +		}
        +
        +		// Remove data and the expando if it's no longer used
        +		if ( jQuery.isEmptyObject( events ) ) {
        +			dataPriv.remove( elem, "handle events" );
        +		}
        +	},
        +
        +	dispatch: function( nativeEvent ) {
        +
        +		// Make a writable jQuery.Event from the native event object
        +		var event = jQuery.event.fix( nativeEvent );
        +
        +		var i, j, ret, matched, handleObj, handlerQueue,
        +			args = new Array( arguments.length ),
        +			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
        +			special = jQuery.event.special[ event.type ] || {};
        +
        +		// Use the fix-ed jQuery.Event rather than the (read-only) native event
        +		args[ 0 ] = event;
        +
        +		for ( i = 1; i < arguments.length; i++ ) {
        +			args[ i ] = arguments[ i ];
        +		}
        +
        +		event.delegateTarget = this;
        +
        +		// Call the preDispatch hook for the mapped type, and let it bail if desired
        +		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
        +			return;
        +		}
        +
        +		// Determine handlers
        +		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
        +
        +		// Run delegates first; they may want to stop propagation beneath us
        +		i = 0;
        +		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
        +			event.currentTarget = matched.elem;
        +
        +			j = 0;
        +			while ( ( handleObj = matched.handlers[ j++ ] ) &&
        +				!event.isImmediatePropagationStopped() ) {
        +
        +				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
        +				// a subset or equal to those in the bound event (both can have no namespace).
        +				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
        +
        +					event.handleObj = handleObj;
        +					event.data = handleObj.data;
        +
        +					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
        +						handleObj.handler ).apply( matched.elem, args );
        +
        +					if ( ret !== undefined ) {
        +						if ( ( event.result = ret ) === false ) {
        +							event.preventDefault();
        +							event.stopPropagation();
        +						}
        +					}
        +				}
        +			}
        +		}
        +
        +		// Call the postDispatch hook for the mapped type
        +		if ( special.postDispatch ) {
        +			special.postDispatch.call( this, event );
        +		}
        +
        +		return event.result;
        +	},
        +
        +	handlers: function( event, handlers ) {
        +		var i, handleObj, sel, matchedHandlers, matchedSelectors,
        +			handlerQueue = [],
        +			delegateCount = handlers.delegateCount,
        +			cur = event.target;
        +
        +		// Find delegate handlers
        +		if ( delegateCount &&
        +
        +			// Support: IE <=9
        +			// Black-hole SVG <use> instance trees (trac-13180)
        +			cur.nodeType &&
        +
        +			// Support: Firefox <=42
        +			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
        +			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
        +			// Support: IE 11 only
        +			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
        +			!( event.type === "click" && event.button >= 1 ) ) {
        +
        +			for ( ; cur !== this; cur = cur.parentNode || this ) {
        +
        +				// Don't check non-elements (#13208)
        +				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
        +				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
        +					matchedHandlers = [];
        +					matchedSelectors = {};
        +					for ( i = 0; i < delegateCount; i++ ) {
        +						handleObj = handlers[ i ];
        +
        +						// Don't conflict with Object.prototype properties (#13203)
        +						sel = handleObj.selector + " ";
        +
        +						if ( matchedSelectors[ sel ] === undefined ) {
        +							matchedSelectors[ sel ] = handleObj.needsContext ?
        +								jQuery( sel, this ).index( cur ) > -1 :
        +								jQuery.find( sel, this, null, [ cur ] ).length;
        +						}
        +						if ( matchedSelectors[ sel ] ) {
        +							matchedHandlers.push( handleObj );
        +						}
        +					}
        +					if ( matchedHandlers.length ) {
        +						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
        +					}
        +				}
        +			}
        +		}
        +
        +		// Add the remaining (directly-bound) handlers
        +		cur = this;
        +		if ( delegateCount < handlers.length ) {
        +			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
        +		}
        +
        +		return handlerQueue;
        +	},
        +
        +	addProp: function( name, hook ) {
        +		Object.defineProperty( jQuery.Event.prototype, name, {
        +			enumerable: true,
        +			configurable: true,
        +
        +			get: jQuery.isFunction( hook ) ?
        +				function() {
        +					if ( this.originalEvent ) {
        +							return hook( this.originalEvent );
        +					}
        +				} :
        +				function() {
        +					if ( this.originalEvent ) {
        +							return this.originalEvent[ name ];
        +					}
        +				},
        +
        +			set: function( value ) {
        +				Object.defineProperty( this, name, {
        +					enumerable: true,
        +					configurable: true,
        +					writable: true,
        +					value: value
        +				} );
        +			}
        +		} );
        +	},
        +
        +	fix: function( originalEvent ) {
        +		return originalEvent[ jQuery.expando ] ?
        +			originalEvent :
        +			new jQuery.Event( originalEvent );
        +	},
        +
        +	special: {
        +		load: {
        +
        +			// Prevent triggered image.load events from bubbling to window.load
        +			noBubble: true
        +		},
        +		focus: {
        +
        +			// Fire native event if possible so blur/focus sequence is correct
        +			trigger: function() {
        +				if ( this !== safeActiveElement() && this.focus ) {
        +					this.focus();
        +					return false;
        +				}
        +			},
        +			delegateType: "focusin"
        +		},
        +		blur: {
        +			trigger: function() {
        +				if ( this === safeActiveElement() && this.blur ) {
        +					this.blur();
        +					return false;
        +				}
        +			},
        +			delegateType: "focusout"
        +		},
        +		click: {
        +
        +			// For checkbox, fire native event so checked state will be right
        +			trigger: function() {
        +				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
        +					this.click();
        +					return false;
        +				}
        +			},
        +
        +			// For cross-browser consistency, don't fire native .click() on links
        +			_default: function( event ) {
        +				return jQuery.nodeName( event.target, "a" );
        +			}
        +		},
        +
        +		beforeunload: {
        +			postDispatch: function( event ) {
        +
        +				// Support: Firefox 20+
        +				// Firefox doesn't alert if the returnValue field is not set.
        +				if ( event.result !== undefined && event.originalEvent ) {
        +					event.originalEvent.returnValue = event.result;
        +				}
        +			}
        +		}
        +	}
        +};
        +
        +jQuery.removeEvent = function( elem, type, handle ) {
        +
        +	// This "if" is needed for plain objects
        +	if ( elem.removeEventListener ) {
        +		elem.removeEventListener( type, handle );
        +	}
        +};
        +
        +jQuery.Event = function( src, props ) {
        +
        +	// Allow instantiation without the 'new' keyword
        +	if ( !( this instanceof jQuery.Event ) ) {
        +		return new jQuery.Event( src, props );
        +	}
        +
        +	// Event object
        +	if ( src && src.type ) {
        +		this.originalEvent = src;
        +		this.type = src.type;
        +
        +		// Events bubbling up the document may have been marked as prevented
        +		// by a handler lower down the tree; reflect the correct value.
        +		this.isDefaultPrevented = src.defaultPrevented ||
        +				src.defaultPrevented === undefined &&
        +
        +				// Support: Android <=2.3 only
        +				src.returnValue === false ?
        +			returnTrue :
        +			returnFalse;
        +
        +		// Create target properties
        +		// Support: Safari <=6 - 7 only
        +		// Target should not be a text node (#504, #13143)
        +		this.target = ( src.target && src.target.nodeType === 3 ) ?
        +			src.target.parentNode :
        +			src.target;
        +
        +		this.currentTarget = src.currentTarget;
        +		this.relatedTarget = src.relatedTarget;
        +
        +	// Event type
        +	} else {
        +		this.type = src;
        +	}
        +
        +	// Put explicitly provided properties onto the event object
        +	if ( props ) {
        +		jQuery.extend( this, props );
        +	}
        +
        +	// Create a timestamp if incoming event doesn't have one
        +	this.timeStamp = src && src.timeStamp || jQuery.now();
        +
        +	// Mark it as fixed
        +	this[ jQuery.expando ] = true;
        +};
        +
        +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
        +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
        +jQuery.Event.prototype = {
        +	constructor: jQuery.Event,
        +	isDefaultPrevented: returnFalse,
        +	isPropagationStopped: returnFalse,
        +	isImmediatePropagationStopped: returnFalse,
        +	isSimulated: false,
        +
        +	preventDefault: function() {
        +		var e = this.originalEvent;
        +
        +		this.isDefaultPrevented = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.preventDefault();
        +		}
        +	},
        +	stopPropagation: function() {
        +		var e = this.originalEvent;
        +
        +		this.isPropagationStopped = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.stopPropagation();
        +		}
        +	},
        +	stopImmediatePropagation: function() {
        +		var e = this.originalEvent;
        +
        +		this.isImmediatePropagationStopped = returnTrue;
        +
        +		if ( e && !this.isSimulated ) {
        +			e.stopImmediatePropagation();
        +		}
        +
        +		this.stopPropagation();
        +	}
        +};
        +
        +// Includes all common event props including KeyEvent and MouseEvent specific props
        +jQuery.each( {
        +	altKey: true,
        +	bubbles: true,
        +	cancelable: true,
        +	changedTouches: true,
        +	ctrlKey: true,
        +	detail: true,
        +	eventPhase: true,
        +	metaKey: true,
        +	pageX: true,
        +	pageY: true,
        +	shiftKey: true,
        +	view: true,
        +	"char": true,
        +	charCode: true,
        +	key: true,
        +	keyCode: true,
        +	button: true,
        +	buttons: true,
        +	clientX: true,
        +	clientY: true,
        +	offsetX: true,
        +	offsetY: true,
        +	pointerId: true,
        +	pointerType: true,
        +	screenX: true,
        +	screenY: true,
        +	targetTouches: true,
        +	toElement: true,
        +	touches: true,
        +
        +	which: function( event ) {
        +		var button = event.button;
        +
        +		// Add which for key events
        +		if ( event.which == null && rkeyEvent.test( event.type ) ) {
        +			return event.charCode != null ? event.charCode : event.keyCode;
        +		}
        +
        +		// Add which for click: 1 === left; 2 === middle; 3 === right
        +		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
        +			if ( button & 1 ) {
        +				return 1;
        +			}
        +
        +			if ( button & 2 ) {
        +				return 3;
        +			}
        +
        +			if ( button & 4 ) {
        +				return 2;
        +			}
        +
        +			return 0;
        +		}
        +
        +		return event.which;
        +	}
        +}, jQuery.event.addProp );
        +
        +// Create mouseenter/leave events using mouseover/out and event-time checks
        +// so that event delegation works in jQuery.
        +// Do the same for pointerenter/pointerleave and pointerover/pointerout
        +//
        +// Support: Safari 7 only
        +// Safari sends mouseenter too often; see:
        +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
        +// for the description of the bug (it existed in older Chrome versions as well).
        +jQuery.each( {
        +	mouseenter: "mouseover",
        +	mouseleave: "mouseout",
        +	pointerenter: "pointerover",
        +	pointerleave: "pointerout"
        +}, function( orig, fix ) {
        +	jQuery.event.special[ orig ] = {
        +		delegateType: fix,
        +		bindType: fix,
        +
        +		handle: function( event ) {
        +			var ret,
        +				target = this,
        +				related = event.relatedTarget,
        +				handleObj = event.handleObj;
        +
        +			// For mouseenter/leave call the handler if related is outside the target.
        +			// NB: No relatedTarget if the mouse left/entered the browser window
        +			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
        +				event.type = handleObj.origType;
        +				ret = handleObj.handler.apply( this, arguments );
        +				event.type = fix;
        +			}
        +			return ret;
        +		}
        +	};
        +} );
        +
        +jQuery.fn.extend( {
        +
        +	on: function( types, selector, data, fn ) {
        +		return on( this, types, selector, data, fn );
        +	},
        +	one: function( types, selector, data, fn ) {
        +		return on( this, types, selector, data, fn, 1 );
        +	},
        +	off: function( types, selector, fn ) {
        +		var handleObj, type;
        +		if ( types && types.preventDefault && types.handleObj ) {
        +
        +			// ( event )  dispatched jQuery.Event
        +			handleObj = types.handleObj;
        +			jQuery( types.delegateTarget ).off(
        +				handleObj.namespace ?
        +					handleObj.origType + "." + handleObj.namespace :
        +					handleObj.origType,
        +				handleObj.selector,
        +				handleObj.handler
        +			);
        +			return this;
        +		}
        +		if ( typeof types === "object" ) {
        +
        +			// ( types-object [, selector] )
        +			for ( type in types ) {
        +				this.off( type, selector, types[ type ] );
        +			}
        +			return this;
        +		}
        +		if ( selector === false || typeof selector === "function" ) {
        +
        +			// ( types [, fn] )
        +			fn = selector;
        +			selector = undefined;
        +		}
        +		if ( fn === false ) {
        +			fn = returnFalse;
        +		}
        +		return this.each( function() {
        +			jQuery.event.remove( this, types, fn, selector );
        +		} );
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/event/ajax.js b/bower_components/jquery/src/event/ajax.js
        new file mode 100644
        index 0000000000..500b36cdd3
        --- /dev/null
        +++ b/bower_components/jquery/src/event/ajax.js
        @@ -0,0 +1,22 @@
        +define( [
        +	"../core",
        +	"../event"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +// Attach a bunch of functions for handling common AJAX events
        +jQuery.each( [
        +	"ajaxStart",
        +	"ajaxStop",
        +	"ajaxComplete",
        +	"ajaxError",
        +	"ajaxSuccess",
        +	"ajaxSend"
        +], function( i, type ) {
        +	jQuery.fn[ type ] = function( fn ) {
        +		return this.on( type, fn );
        +	};
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/event/alias.js b/bower_components/jquery/src/event/alias.js
        new file mode 100644
        index 0000000000..863c94ad2e
        --- /dev/null
        +++ b/bower_components/jquery/src/event/alias.js
        @@ -0,0 +1,29 @@
        +define( [
        +	"../core",
        +
        +	"../event",
        +	"./trigger"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
        +	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
        +	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
        +	function( i, name ) {
        +
        +	// Handle event binding
        +	jQuery.fn[ name ] = function( data, fn ) {
        +		return arguments.length > 0 ?
        +			this.on( name, null, data, fn ) :
        +			this.trigger( name );
        +	};
        +} );
        +
        +jQuery.fn.extend( {
        +	hover: function( fnOver, fnOut ) {
        +		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/event/focusin.js b/bower_components/jquery/src/event/focusin.js
        new file mode 100644
        index 0000000000..7faef29813
        --- /dev/null
        +++ b/bower_components/jquery/src/event/focusin.js
        @@ -0,0 +1,55 @@
        +define( [
        +	"../core",
        +	"../data/var/dataPriv",
        +	"./support",
        +
        +	"../event",
        +	"./trigger"
        +], function( jQuery, dataPriv, support ) {
        +
        +"use strict";
        +
        +// Support: Firefox <=44
        +// Firefox doesn't have focus(in | out) events
        +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
        +//
        +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
        +// focus(in | out) events fire after focus & blur events,
        +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
        +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
        +if ( !support.focusin ) {
        +	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
        +
        +		// Attach a single capturing handler on the document while someone wants focusin/focusout
        +		var handler = function( event ) {
        +			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
        +		};
        +
        +		jQuery.event.special[ fix ] = {
        +			setup: function() {
        +				var doc = this.ownerDocument || this,
        +					attaches = dataPriv.access( doc, fix );
        +
        +				if ( !attaches ) {
        +					doc.addEventListener( orig, handler, true );
        +				}
        +				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
        +			},
        +			teardown: function() {
        +				var doc = this.ownerDocument || this,
        +					attaches = dataPriv.access( doc, fix ) - 1;
        +
        +				if ( !attaches ) {
        +					doc.removeEventListener( orig, handler, true );
        +					dataPriv.remove( doc, fix );
        +
        +				} else {
        +					dataPriv.access( doc, fix, attaches );
        +				}
        +			}
        +		};
        +	} );
        +}
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/event/support.js b/bower_components/jquery/src/event/support.js
        new file mode 100644
        index 0000000000..e3db9ad83f
        --- /dev/null
        +++ b/bower_components/jquery/src/event/support.js
        @@ -0,0 +1,11 @@
        +define( [
        +	"../var/support"
        +], function( support ) {
        +
        +"use strict";
        +
        +support.focusin = "onfocusin" in window;
        +
        +return support;
        +
        +} );
        diff --git a/bower_components/jquery/src/event/trigger.js b/bower_components/jquery/src/event/trigger.js
        new file mode 100644
        index 0000000000..ef391370f0
        --- /dev/null
        +++ b/bower_components/jquery/src/event/trigger.js
        @@ -0,0 +1,185 @@
        +define( [
        +	"../core",
        +	"../var/document",
        +	"../data/var/dataPriv",
        +	"../data/var/acceptData",
        +	"../var/hasOwn",
        +
        +	"../event"
        +], function( jQuery, document, dataPriv, acceptData, hasOwn ) {
        +
        +"use strict";
        +
        +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
        +
        +jQuery.extend( jQuery.event, {
        +
        +	trigger: function( event, data, elem, onlyHandlers ) {
        +
        +		var i, cur, tmp, bubbleType, ontype, handle, special,
        +			eventPath = [ elem || document ],
        +			type = hasOwn.call( event, "type" ) ? event.type : event,
        +			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
        +
        +		cur = tmp = elem = elem || document;
        +
        +		// Don't do events on text and comment nodes
        +		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        +			return;
        +		}
        +
        +		// focus/blur morphs to focusin/out; ensure we're not firing them right now
        +		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        +			return;
        +		}
        +
        +		if ( type.indexOf( "." ) > -1 ) {
        +
        +			// Namespaced trigger; create a regexp to match event type in handle()
        +			namespaces = type.split( "." );
        +			type = namespaces.shift();
        +			namespaces.sort();
        +		}
        +		ontype = type.indexOf( ":" ) < 0 && "on" + type;
        +
        +		// Caller can pass in a jQuery.Event object, Object, or just an event type string
        +		event = event[ jQuery.expando ] ?
        +			event :
        +			new jQuery.Event( type, typeof event === "object" && event );
        +
        +		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
        +		event.isTrigger = onlyHandlers ? 2 : 3;
        +		event.namespace = namespaces.join( "." );
        +		event.rnamespace = event.namespace ?
        +			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
        +			null;
        +
        +		// Clean up the event in case it is being reused
        +		event.result = undefined;
        +		if ( !event.target ) {
        +			event.target = elem;
        +		}
        +
        +		// Clone any incoming data and prepend the event, creating the handler arg list
        +		data = data == null ?
        +			[ event ] :
        +			jQuery.makeArray( data, [ event ] );
        +
        +		// Allow special events to draw outside the lines
        +		special = jQuery.event.special[ type ] || {};
        +		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
        +			return;
        +		}
        +
        +		// Determine event propagation path in advance, per W3C events spec (#9951)
        +		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
        +		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
        +
        +			bubbleType = special.delegateType || type;
        +			if ( !rfocusMorph.test( bubbleType + type ) ) {
        +				cur = cur.parentNode;
        +			}
        +			for ( ; cur; cur = cur.parentNode ) {
        +				eventPath.push( cur );
        +				tmp = cur;
        +			}
        +
        +			// Only add window if we got to document (e.g., not plain obj or detached DOM)
        +			if ( tmp === ( elem.ownerDocument || document ) ) {
        +				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
        +			}
        +		}
        +
        +		// Fire handlers on the event path
        +		i = 0;
        +		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
        +
        +			event.type = i > 1 ?
        +				bubbleType :
        +				special.bindType || type;
        +
        +			// jQuery handler
        +			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
        +				dataPriv.get( cur, "handle" );
        +			if ( handle ) {
        +				handle.apply( cur, data );
        +			}
        +
        +			// Native handler
        +			handle = ontype && cur[ ontype ];
        +			if ( handle && handle.apply && acceptData( cur ) ) {
        +				event.result = handle.apply( cur, data );
        +				if ( event.result === false ) {
        +					event.preventDefault();
        +				}
        +			}
        +		}
        +		event.type = type;
        +
        +		// If nobody prevented the default action, do it now
        +		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
        +
        +			if ( ( !special._default ||
        +				special._default.apply( eventPath.pop(), data ) === false ) &&
        +				acceptData( elem ) ) {
        +
        +				// Call a native DOM method on the target with the same name as the event.
        +				// Don't do default actions on window, that's where global variables be (#6170)
        +				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
        +
        +					// Don't re-trigger an onFOO event when we call its FOO() method
        +					tmp = elem[ ontype ];
        +
        +					if ( tmp ) {
        +						elem[ ontype ] = null;
        +					}
        +
        +					// Prevent re-triggering of the same event, since we already bubbled it above
        +					jQuery.event.triggered = type;
        +					elem[ type ]();
        +					jQuery.event.triggered = undefined;
        +
        +					if ( tmp ) {
        +						elem[ ontype ] = tmp;
        +					}
        +				}
        +			}
        +		}
        +
        +		return event.result;
        +	},
        +
        +	// Piggyback on a donor event to simulate a different one
        +	// Used only for `focus(in | out)` events
        +	simulate: function( type, elem, event ) {
        +		var e = jQuery.extend(
        +			new jQuery.Event(),
        +			event,
        +			{
        +				type: type,
        +				isSimulated: true
        +			}
        +		);
        +
        +		jQuery.event.trigger( e, null, elem );
        +	}
        +
        +} );
        +
        +jQuery.fn.extend( {
        +
        +	trigger: function( type, data ) {
        +		return this.each( function() {
        +			jQuery.event.trigger( type, data, this );
        +		} );
        +	},
        +	triggerHandler: function( type, data ) {
        +		var elem = this[ 0 ];
        +		if ( elem ) {
        +			return jQuery.event.trigger( type, data, elem, true );
        +		}
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/exports/amd.js b/bower_components/jquery/src/exports/amd.js
        new file mode 100644
        index 0000000000..cbb1ef5806
        --- /dev/null
        +++ b/bower_components/jquery/src/exports/amd.js
        @@ -0,0 +1,26 @@
        +define( [
        +	"../core"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +// Register as a named AMD module, since jQuery can be concatenated with other
        +// files that may use define, but not via a proper concatenation script that
        +// understands anonymous AMD modules. A named AMD is safest and most robust
        +// way to register. Lowercase jquery is used because AMD module names are
        +// derived from file names, and jQuery is normally delivered in a lowercase
        +// file name. Do this after creating the global so that if an AMD module wants
        +// to call noConflict to hide this version of jQuery, it will work.
        +
        +// Note that for maximum portability, libraries that are not jQuery should
        +// declare themselves as anonymous modules, and avoid setting a global if an
        +// AMD loader is present. jQuery is a special case. For more information, see
        +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
        +
        +if ( typeof define === "function" && define.amd ) {
        +	define( "jquery", [], function() {
        +		return jQuery;
        +	} );
        +}
        +
        +} );
        diff --git a/bower_components/jquery/src/exports/global.js b/bower_components/jquery/src/exports/global.js
        new file mode 100644
        index 0000000000..460b56e478
        --- /dev/null
        +++ b/bower_components/jquery/src/exports/global.js
        @@ -0,0 +1,34 @@
        +define( [
        +	"../core"
        +], function( jQuery, noGlobal ) {
        +
        +"use strict";
        +
        +var
        +
        +	// Map over jQuery in case of overwrite
        +	_jQuery = window.jQuery,
        +
        +	// Map over the $ in case of overwrite
        +	_$ = window.$;
        +
        +jQuery.noConflict = function( deep ) {
        +	if ( window.$ === jQuery ) {
        +		window.$ = _$;
        +	}
        +
        +	if ( deep && window.jQuery === jQuery ) {
        +		window.jQuery = _jQuery;
        +	}
        +
        +	return jQuery;
        +};
        +
        +// Expose jQuery and $ identifiers, even in AMD
        +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
        +// and CommonJS for browser emulators (#13566)
        +if ( !noGlobal ) {
        +	window.jQuery = window.$ = jQuery;
        +}
        +
        +} );
        diff --git a/bower_components/jquery/src/jquery.js b/bower_components/jquery/src/jquery.js
        new file mode 100644
        index 0000000000..52fc87dbd4
        --- /dev/null
        +++ b/bower_components/jquery/src/jquery.js
        @@ -0,0 +1,41 @@
        +define( [
        +	"./core",
        +	"./selector",
        +	"./traversing",
        +	"./callbacks",
        +	"./deferred",
        +	"./deferred/exceptionHook",
        +	"./core/ready",
        +	"./data",
        +	"./queue",
        +	"./queue/delay",
        +	"./attributes",
        +	"./event",
        +	"./event/alias",
        +	"./event/focusin",
        +	"./manipulation",
        +	"./manipulation/_evalUrl",
        +	"./wrap",
        +	"./css",
        +	"./css/hiddenVisibleSelectors",
        +	"./serialize",
        +	"./ajax",
        +	"./ajax/xhr",
        +	"./ajax/script",
        +	"./ajax/jsonp",
        +	"./ajax/load",
        +	"./event/ajax",
        +	"./effects",
        +	"./effects/animatedSelector",
        +	"./offset",
        +	"./dimensions",
        +	"./deprecated",
        +	"./exports/amd",
        +	"./exports/global"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +return jQuery;
        +
        +} );
        diff --git a/bower_components/jquery/src/manipulation.js b/bower_components/jquery/src/manipulation.js
        new file mode 100644
        index 0000000000..9b4f5e451d
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation.js
        @@ -0,0 +1,486 @@
        +define( [
        +	"./core",
        +	"./var/concat",
        +	"./var/push",
        +	"./core/access",
        +	"./manipulation/var/rcheckableType",
        +	"./manipulation/var/rtagName",
        +	"./manipulation/var/rscriptType",
        +	"./manipulation/wrapMap",
        +	"./manipulation/getAll",
        +	"./manipulation/setGlobalEval",
        +	"./manipulation/buildFragment",
        +	"./manipulation/support",
        +
        +	"./data/var/dataPriv",
        +	"./data/var/dataUser",
        +	"./data/var/acceptData",
        +	"./core/DOMEval",
        +
        +	"./core/init",
        +	"./traversing",
        +	"./selector",
        +	"./event"
        +], function( jQuery, concat, push, access,
        +	rcheckableType, rtagName, rscriptType,
        +	wrapMap, getAll, setGlobalEval, buildFragment, support,
        +	dataPriv, dataUser, acceptData, DOMEval ) {
        +
        +"use strict";
        +
        +var
        +
        +	/* eslint-disable max-len */
        +
        +	// See https://github.com/eslint/eslint/issues/3229
        +	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
        +
        +	/* eslint-enable */
        +
        +	// Support: IE <=10 - 11, Edge 12 - 13
        +	// In IE/Edge using regex groups here causes severe slowdowns.
        +	// See https://connect.microsoft.com/IE/feedback/details/1736512/
        +	rnoInnerhtml = /<script|<style|<link/i,
        +
        +	// checked="checked" or checked
        +	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        +	rscriptTypeMasked = /^true\/(.*)/,
        +	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
        +
        +function manipulationTarget( elem, content ) {
        +	if ( jQuery.nodeName( elem, "table" ) &&
        +		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
        +
        +		return elem.getElementsByTagName( "tbody" )[ 0 ] || elem;
        +	}
        +
        +	return elem;
        +}
        +
        +// Replace/restore the type attribute of script elements for safe DOM manipulation
        +function disableScript( elem ) {
        +	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
        +	return elem;
        +}
        +function restoreScript( elem ) {
        +	var match = rscriptTypeMasked.exec( elem.type );
        +
        +	if ( match ) {
        +		elem.type = match[ 1 ];
        +	} else {
        +		elem.removeAttribute( "type" );
        +	}
        +
        +	return elem;
        +}
        +
        +function cloneCopyEvent( src, dest ) {
        +	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
        +
        +	if ( dest.nodeType !== 1 ) {
        +		return;
        +	}
        +
        +	// 1. Copy private data: events, handlers, etc.
        +	if ( dataPriv.hasData( src ) ) {
        +		pdataOld = dataPriv.access( src );
        +		pdataCur = dataPriv.set( dest, pdataOld );
        +		events = pdataOld.events;
        +
        +		if ( events ) {
        +			delete pdataCur.handle;
        +			pdataCur.events = {};
        +
        +			for ( type in events ) {
        +				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
        +					jQuery.event.add( dest, type, events[ type ][ i ] );
        +				}
        +			}
        +		}
        +	}
        +
        +	// 2. Copy user data
        +	if ( dataUser.hasData( src ) ) {
        +		udataOld = dataUser.access( src );
        +		udataCur = jQuery.extend( {}, udataOld );
        +
        +		dataUser.set( dest, udataCur );
        +	}
        +}
        +
        +// Fix IE bugs, see support tests
        +function fixInput( src, dest ) {
        +	var nodeName = dest.nodeName.toLowerCase();
        +
        +	// Fails to persist the checked state of a cloned checkbox or radio button.
        +	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
        +		dest.checked = src.checked;
        +
        +	// Fails to return the selected option to the default selected state when cloning options
        +	} else if ( nodeName === "input" || nodeName === "textarea" ) {
        +		dest.defaultValue = src.defaultValue;
        +	}
        +}
        +
        +function domManip( collection, args, callback, ignored ) {
        +
        +	// Flatten any nested arrays
        +	args = concat.apply( [], args );
        +
        +	var fragment, first, scripts, hasScripts, node, doc,
        +		i = 0,
        +		l = collection.length,
        +		iNoClone = l - 1,
        +		value = args[ 0 ],
        +		isFunction = jQuery.isFunction( value );
        +
        +	// We can't cloneNode fragments that contain checked, in WebKit
        +	if ( isFunction ||
        +			( l > 1 && typeof value === "string" &&
        +				!support.checkClone && rchecked.test( value ) ) ) {
        +		return collection.each( function( index ) {
        +			var self = collection.eq( index );
        +			if ( isFunction ) {
        +				args[ 0 ] = value.call( this, index, self.html() );
        +			}
        +			domManip( self, args, callback, ignored );
        +		} );
        +	}
        +
        +	if ( l ) {
        +		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
        +		first = fragment.firstChild;
        +
        +		if ( fragment.childNodes.length === 1 ) {
        +			fragment = first;
        +		}
        +
        +		// Require either new content or an interest in ignored elements to invoke the callback
        +		if ( first || ignored ) {
        +			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
        +			hasScripts = scripts.length;
        +
        +			// Use the original fragment for the last item
        +			// instead of the first because it can end up
        +			// being emptied incorrectly in certain situations (#8070).
        +			for ( ; i < l; i++ ) {
        +				node = fragment;
        +
        +				if ( i !== iNoClone ) {
        +					node = jQuery.clone( node, true, true );
        +
        +					// Keep references to cloned scripts for later restoration
        +					if ( hasScripts ) {
        +
        +						// Support: Android <=4.0 only, PhantomJS 1 only
        +						// push.apply(_, arraylike) throws on ancient WebKit
        +						jQuery.merge( scripts, getAll( node, "script" ) );
        +					}
        +				}
        +
        +				callback.call( collection[ i ], node, i );
        +			}
        +
        +			if ( hasScripts ) {
        +				doc = scripts[ scripts.length - 1 ].ownerDocument;
        +
        +				// Reenable scripts
        +				jQuery.map( scripts, restoreScript );
        +
        +				// Evaluate executable scripts on first document insertion
        +				for ( i = 0; i < hasScripts; i++ ) {
        +					node = scripts[ i ];
        +					if ( rscriptType.test( node.type || "" ) &&
        +						!dataPriv.access( node, "globalEval" ) &&
        +						jQuery.contains( doc, node ) ) {
        +
        +						if ( node.src ) {
        +
        +							// Optional AJAX dependency, but won't run scripts if not present
        +							if ( jQuery._evalUrl ) {
        +								jQuery._evalUrl( node.src );
        +							}
        +						} else {
        +							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
        +						}
        +					}
        +				}
        +			}
        +		}
        +	}
        +
        +	return collection;
        +}
        +
        +function remove( elem, selector, keepData ) {
        +	var node,
        +		nodes = selector ? jQuery.filter( selector, elem ) : elem,
        +		i = 0;
        +
        +	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
        +		if ( !keepData && node.nodeType === 1 ) {
        +			jQuery.cleanData( getAll( node ) );
        +		}
        +
        +		if ( node.parentNode ) {
        +			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
        +				setGlobalEval( getAll( node, "script" ) );
        +			}
        +			node.parentNode.removeChild( node );
        +		}
        +	}
        +
        +	return elem;
        +}
        +
        +jQuery.extend( {
        +	htmlPrefilter: function( html ) {
        +		return html.replace( rxhtmlTag, "<$1></$2>" );
        +	},
        +
        +	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
        +		var i, l, srcElements, destElements,
        +			clone = elem.cloneNode( true ),
        +			inPage = jQuery.contains( elem.ownerDocument, elem );
        +
        +		// Fix IE cloning issues
        +		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
        +				!jQuery.isXMLDoc( elem ) ) {
        +
        +			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
        +			destElements = getAll( clone );
        +			srcElements = getAll( elem );
        +
        +			for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +				fixInput( srcElements[ i ], destElements[ i ] );
        +			}
        +		}
        +
        +		// Copy the events from the original to the clone
        +		if ( dataAndEvents ) {
        +			if ( deepDataAndEvents ) {
        +				srcElements = srcElements || getAll( elem );
        +				destElements = destElements || getAll( clone );
        +
        +				for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
        +				}
        +			} else {
        +				cloneCopyEvent( elem, clone );
        +			}
        +		}
        +
        +		// Preserve script evaluation history
        +		destElements = getAll( clone, "script" );
        +		if ( destElements.length > 0 ) {
        +			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
        +		}
        +
        +		// Return the cloned set
        +		return clone;
        +	},
        +
        +	cleanData: function( elems ) {
        +		var data, elem, type,
        +			special = jQuery.event.special,
        +			i = 0;
        +
        +		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
        +			if ( acceptData( elem ) ) {
        +				if ( ( data = elem[ dataPriv.expando ] ) ) {
        +					if ( data.events ) {
        +						for ( type in data.events ) {
        +							if ( special[ type ] ) {
        +								jQuery.event.remove( elem, type );
        +
        +							// This is a shortcut to avoid jQuery.event.remove's overhead
        +							} else {
        +								jQuery.removeEvent( elem, type, data.handle );
        +							}
        +						}
        +					}
        +
        +					// Support: Chrome <=35 - 45+
        +					// Assign undefined instead of using delete, see Data#remove
        +					elem[ dataPriv.expando ] = undefined;
        +				}
        +				if ( elem[ dataUser.expando ] ) {
        +
        +					// Support: Chrome <=35 - 45+
        +					// Assign undefined instead of using delete, see Data#remove
        +					elem[ dataUser.expando ] = undefined;
        +				}
        +			}
        +		}
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	detach: function( selector ) {
        +		return remove( this, selector, true );
        +	},
        +
        +	remove: function( selector ) {
        +		return remove( this, selector );
        +	},
        +
        +	text: function( value ) {
        +		return access( this, function( value ) {
        +			return value === undefined ?
        +				jQuery.text( this ) :
        +				this.empty().each( function() {
        +					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +						this.textContent = value;
        +					}
        +				} );
        +		}, null, value, arguments.length );
        +	},
        +
        +	append: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +				var target = manipulationTarget( this, elem );
        +				target.appendChild( elem );
        +			}
        +		} );
        +	},
        +
        +	prepend: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +				var target = manipulationTarget( this, elem );
        +				target.insertBefore( elem, target.firstChild );
        +			}
        +		} );
        +	},
        +
        +	before: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.parentNode ) {
        +				this.parentNode.insertBefore( elem, this );
        +			}
        +		} );
        +	},
        +
        +	after: function() {
        +		return domManip( this, arguments, function( elem ) {
        +			if ( this.parentNode ) {
        +				this.parentNode.insertBefore( elem, this.nextSibling );
        +			}
        +		} );
        +	},
        +
        +	empty: function() {
        +		var elem,
        +			i = 0;
        +
        +		for ( ; ( elem = this[ i ] ) != null; i++ ) {
        +			if ( elem.nodeType === 1 ) {
        +
        +				// Prevent memory leaks
        +				jQuery.cleanData( getAll( elem, false ) );
        +
        +				// Remove any remaining nodes
        +				elem.textContent = "";
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	clone: function( dataAndEvents, deepDataAndEvents ) {
        +		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
        +		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
        +
        +		return this.map( function() {
        +			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
        +		} );
        +	},
        +
        +	html: function( value ) {
        +		return access( this, function( value ) {
        +			var elem = this[ 0 ] || {},
        +				i = 0,
        +				l = this.length;
        +
        +			if ( value === undefined && elem.nodeType === 1 ) {
        +				return elem.innerHTML;
        +			}
        +
        +			// See if we can take a shortcut and just use innerHTML
        +			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        +				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
        +
        +				value = jQuery.htmlPrefilter( value );
        +
        +				try {
        +					for ( ; i < l; i++ ) {
        +						elem = this[ i ] || {};
        +
        +						// Remove element nodes and prevent memory leaks
        +						if ( elem.nodeType === 1 ) {
        +							jQuery.cleanData( getAll( elem, false ) );
        +							elem.innerHTML = value;
        +						}
        +					}
        +
        +					elem = 0;
        +
        +				// If using innerHTML throws an exception, use the fallback method
        +				} catch ( e ) {}
        +			}
        +
        +			if ( elem ) {
        +				this.empty().append( value );
        +			}
        +		}, null, value, arguments.length );
        +	},
        +
        +	replaceWith: function() {
        +		var ignored = [];
        +
        +		// Make the changes, replacing each non-ignored context element with the new content
        +		return domManip( this, arguments, function( elem ) {
        +			var parent = this.parentNode;
        +
        +			if ( jQuery.inArray( this, ignored ) < 0 ) {
        +				jQuery.cleanData( getAll( this ) );
        +				if ( parent ) {
        +					parent.replaceChild( elem, this );
        +				}
        +			}
        +
        +		// Force callback invocation
        +		}, ignored );
        +	}
        +} );
        +
        +jQuery.each( {
        +	appendTo: "append",
        +	prependTo: "prepend",
        +	insertBefore: "before",
        +	insertAfter: "after",
        +	replaceAll: "replaceWith"
        +}, function( name, original ) {
        +	jQuery.fn[ name ] = function( selector ) {
        +		var elems,
        +			ret = [],
        +			insert = jQuery( selector ),
        +			last = insert.length - 1,
        +			i = 0;
        +
        +		for ( ; i <= last; i++ ) {
        +			elems = i === last ? this : this.clone( true );
        +			jQuery( insert[ i ] )[ original ]( elems );
        +
        +			// Support: Android <=4.0 only, PhantomJS 1 only
        +			// .get() because push.apply(_, arraylike) throws on ancient WebKit
        +			push.apply( ret, elems.get() );
        +		}
        +
        +		return this.pushStack( ret );
        +	};
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/manipulation/_evalUrl.js b/bower_components/jquery/src/manipulation/_evalUrl.js
        new file mode 100644
        index 0000000000..f9ec7027c2
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/_evalUrl.js
        @@ -0,0 +1,23 @@
        +define( [
        +	"../ajax"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +jQuery._evalUrl = function( url ) {
        +	return jQuery.ajax( {
        +		url: url,
        +
        +		// Make this explicit, since user can override this through ajaxSetup (#11264)
        +		type: "GET",
        +		dataType: "script",
        +		cache: true,
        +		async: false,
        +		global: false,
        +		"throws": true
        +	} );
        +};
        +
        +return jQuery._evalUrl;
        +
        +} );
        diff --git a/bower_components/jquery/src/manipulation/buildFragment.js b/bower_components/jquery/src/manipulation/buildFragment.js
        new file mode 100644
        index 0000000000..bcb508531b
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/buildFragment.js
        @@ -0,0 +1,104 @@
        +define( [
        +	"../core",
        +	"./var/rtagName",
        +	"./var/rscriptType",
        +	"./wrapMap",
        +	"./getAll",
        +	"./setGlobalEval"
        +], function( jQuery, rtagName, rscriptType, wrapMap, getAll, setGlobalEval ) {
        +
        +"use strict";
        +
        +var rhtml = /<|&#?\w+;/;
        +
        +function buildFragment( elems, context, scripts, selection, ignored ) {
        +	var elem, tmp, tag, wrap, contains, j,
        +		fragment = context.createDocumentFragment(),
        +		nodes = [],
        +		i = 0,
        +		l = elems.length;
        +
        +	for ( ; i < l; i++ ) {
        +		elem = elems[ i ];
        +
        +		if ( elem || elem === 0 ) {
        +
        +			// Add nodes directly
        +			if ( jQuery.type( elem ) === "object" ) {
        +
        +				// Support: Android <=4.0 only, PhantomJS 1 only
        +				// push.apply(_, arraylike) throws on ancient WebKit
        +				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
        +
        +			// Convert non-html into a text node
        +			} else if ( !rhtml.test( elem ) ) {
        +				nodes.push( context.createTextNode( elem ) );
        +
        +			// Convert html into DOM nodes
        +			} else {
        +				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
        +
        +				// Deserialize a standard representation
        +				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
        +				wrap = wrapMap[ tag ] || wrapMap._default;
        +				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
        +
        +				// Descend through wrappers to the right content
        +				j = wrap[ 0 ];
        +				while ( j-- ) {
        +					tmp = tmp.lastChild;
        +				}
        +
        +				// Support: Android <=4.0 only, PhantomJS 1 only
        +				// push.apply(_, arraylike) throws on ancient WebKit
        +				jQuery.merge( nodes, tmp.childNodes );
        +
        +				// Remember the top-level container
        +				tmp = fragment.firstChild;
        +
        +				// Ensure the created nodes are orphaned (#12392)
        +				tmp.textContent = "";
        +			}
        +		}
        +	}
        +
        +	// Remove wrapper from fragment
        +	fragment.textContent = "";
        +
        +	i = 0;
        +	while ( ( elem = nodes[ i++ ] ) ) {
        +
        +		// Skip elements already in the context collection (trac-4087)
        +		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
        +			if ( ignored ) {
        +				ignored.push( elem );
        +			}
        +			continue;
        +		}
        +
        +		contains = jQuery.contains( elem.ownerDocument, elem );
        +
        +		// Append to fragment
        +		tmp = getAll( fragment.appendChild( elem ), "script" );
        +
        +		// Preserve script evaluation history
        +		if ( contains ) {
        +			setGlobalEval( tmp );
        +		}
        +
        +		// Capture executables
        +		if ( scripts ) {
        +			j = 0;
        +			while ( ( elem = tmp[ j++ ] ) ) {
        +				if ( rscriptType.test( elem.type || "" ) ) {
        +					scripts.push( elem );
        +				}
        +			}
        +		}
        +	}
        +
        +	return fragment;
        +}
        +
        +return buildFragment;
        +} );
        diff --git a/bower_components/jquery/src/manipulation/getAll.js b/bower_components/jquery/src/manipulation/getAll.js
        new file mode 100644
        index 0000000000..f68e3219e0
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/getAll.js
        @@ -0,0 +1,31 @@
        +define( [
        +	"../core"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +function getAll( context, tag ) {
        +
        +	// Support: IE <=9 - 11 only
        +	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
        +	var ret;
        +
        +	if ( typeof context.getElementsByTagName !== "undefined" ) {
        +		ret = context.getElementsByTagName( tag || "*" );
        +
        +	} else if ( typeof context.querySelectorAll !== "undefined" ) {
        +		ret = context.querySelectorAll( tag || "*" );
        +
        +	} else {
        +		ret = [];
        +	}
        +
        +	if ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) {
        +		return jQuery.merge( [ context ], ret );
        +	}
        +
        +	return ret;
        +}
        +
        +return getAll;
        +} );
        diff --git a/bower_components/jquery/src/manipulation/setGlobalEval.js b/bower_components/jquery/src/manipulation/setGlobalEval.js
        new file mode 100644
        index 0000000000..cf95240a48
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/setGlobalEval.js
        @@ -0,0 +1,22 @@
        +define( [
        +	"../data/var/dataPriv"
        +], function( dataPriv ) {
        +
        +"use strict";
        +
        +// Mark scripts as having already been evaluated
        +function setGlobalEval( elems, refElements ) {
        +	var i = 0,
        +		l = elems.length;
        +
        +	for ( ; i < l; i++ ) {
        +		dataPriv.set(
        +			elems[ i ],
        +			"globalEval",
        +			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
        +		);
        +	}
        +}
        +
        +return setGlobalEval;
        +} );
        diff --git a/bower_components/jquery/src/manipulation/support.js b/bower_components/jquery/src/manipulation/support.js
        new file mode 100644
        index 0000000000..4a5d9af4cc
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/support.js
        @@ -0,0 +1,35 @@
        +define( [
        +	"../var/document",
        +	"../var/support"
        +], function( document, support ) {
        +
        +"use strict";
        +
        +( function() {
        +	var fragment = document.createDocumentFragment(),
        +		div = fragment.appendChild( document.createElement( "div" ) ),
        +		input = document.createElement( "input" );
        +
        +	// Support: Android 4.0 - 4.3 only
        +	// Check state lost if the name is set (#11217)
        +	// Support: Windows Web Apps (WWA)
        +	// `name` and `type` must use .setAttribute for WWA (#14901)
        +	input.setAttribute( "type", "radio" );
        +	input.setAttribute( "checked", "checked" );
        +	input.setAttribute( "name", "t" );
        +
        +	div.appendChild( input );
        +
        +	// Support: Android <=4.1 only
        +	// Older WebKit doesn't clone checked state correctly in fragments
        +	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
        +
        +	// Support: IE <=11 only
        +	// Make sure textarea (and checkbox) defaultValue is properly cloned
        +	div.innerHTML = "<textarea>x</textarea>";
        +	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
        +} )();
        +
        +return support;
        +
        +} );
        diff --git a/bower_components/jquery/src/manipulation/var/rcheckableType.js b/bower_components/jquery/src/manipulation/var/rcheckableType.js
        new file mode 100644
        index 0000000000..25bbcb4188
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/var/rcheckableType.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return ( /^(?:checkbox|radio)$/i );
        +} );
        diff --git a/bower_components/jquery/src/manipulation/var/rscriptType.js b/bower_components/jquery/src/manipulation/var/rscriptType.js
        new file mode 100644
        index 0000000000..7237c8a313
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/var/rscriptType.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return ( /^$|\/(?:java|ecma)script/i );
        +} );
        diff --git a/bower_components/jquery/src/manipulation/var/rtagName.js b/bower_components/jquery/src/manipulation/var/rtagName.js
        new file mode 100644
        index 0000000000..d565dd3de6
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/var/rtagName.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
        +} );
        diff --git a/bower_components/jquery/src/manipulation/wrapMap.js b/bower_components/jquery/src/manipulation/wrapMap.js
        new file mode 100644
        index 0000000000..1f446f7d73
        --- /dev/null
        +++ b/bower_components/jquery/src/manipulation/wrapMap.js
        @@ -0,0 +1,29 @@
        +define( function() {
        +
        +"use strict";
        +
        +// We have to close these tags to support XHTML (#13200)
        +var wrapMap = {
        +
        +	// Support: IE <=9 only
        +	option: [ 1, "<select multiple='multiple'>", "</select>" ],
        +
        +	// XHTML parsers do not magically insert elements in the
        +	// same way that tag soup parsers do. So we cannot shorten
        +	// this by omitting <tbody> or other required elements.
        +	thead: [ 1, "<table>", "</table>" ],
        +	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
        +	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
        +	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
        +
        +	_default: [ 0, "", "" ]
        +};
        +
        +// Support: IE <=9 only
        +wrapMap.optgroup = wrapMap.option;
        +
        +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
        +wrapMap.th = wrapMap.td;
        +
        +return wrapMap;
        +} );
        diff --git a/bower_components/jquery/src/offset.js b/bower_components/jquery/src/offset.js
        new file mode 100644
        index 0000000000..54442eb45c
        --- /dev/null
        +++ b/bower_components/jquery/src/offset.js
        @@ -0,0 +1,232 @@
        +define( [
        +	"./core",
        +	"./core/access",
        +	"./var/document",
        +	"./var/documentElement",
        +	"./css/var/rnumnonpx",
        +	"./css/curCSS",
        +	"./css/addGetHookIf",
        +	"./css/support",
        +
        +	"./core/init",
        +	"./css",
        +	"./selector" // contains
        +], function( jQuery, access, document, documentElement, rnumnonpx, curCSS, addGetHookIf, support ) {
        +
        +"use strict";
        +
        +/**
        + * Gets a window from an element
        + */
        +function getWindow( elem ) {
        +	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
        +}
        +
        +jQuery.offset = {
        +	setOffset: function( elem, options, i ) {
        +		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
        +			position = jQuery.css( elem, "position" ),
        +			curElem = jQuery( elem ),
        +			props = {};
        +
        +		// Set position first, in-case top/left are set even on static elem
        +		if ( position === "static" ) {
        +			elem.style.position = "relative";
        +		}
        +
        +		curOffset = curElem.offset();
        +		curCSSTop = jQuery.css( elem, "top" );
        +		curCSSLeft = jQuery.css( elem, "left" );
        +		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
        +			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
        +
        +		// Need to be able to calculate position if either
        +		// top or left is auto and position is either absolute or fixed
        +		if ( calculatePosition ) {
        +			curPosition = curElem.position();
        +			curTop = curPosition.top;
        +			curLeft = curPosition.left;
        +
        +		} else {
        +			curTop = parseFloat( curCSSTop ) || 0;
        +			curLeft = parseFloat( curCSSLeft ) || 0;
        +		}
        +
        +		if ( jQuery.isFunction( options ) ) {
        +
        +			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
        +			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
        +		}
        +
        +		if ( options.top != null ) {
        +			props.top = ( options.top - curOffset.top ) + curTop;
        +		}
        +		if ( options.left != null ) {
        +			props.left = ( options.left - curOffset.left ) + curLeft;
        +		}
        +
        +		if ( "using" in options ) {
        +			options.using.call( elem, props );
        +
        +		} else {
        +			curElem.css( props );
        +		}
        +	}
        +};
        +
        +jQuery.fn.extend( {
        +	offset: function( options ) {
        +
        +		// Preserve chaining for setter
        +		if ( arguments.length ) {
        +			return options === undefined ?
        +				this :
        +				this.each( function( i ) {
        +					jQuery.offset.setOffset( this, options, i );
        +				} );
        +		}
        +
        +		var docElem, win, rect, doc,
        +			elem = this[ 0 ];
        +
        +		if ( !elem ) {
        +			return;
        +		}
        +
        +		// Support: IE <=11 only
        +		// Running getBoundingClientRect on a
        +		// disconnected node in IE throws an error
        +		if ( !elem.getClientRects().length ) {
        +			return { top: 0, left: 0 };
        +		}
        +
        +		rect = elem.getBoundingClientRect();
        +
        +		// Make sure element is not hidden (display: none)
        +		if ( rect.width || rect.height ) {
        +			doc = elem.ownerDocument;
        +			win = getWindow( doc );
        +			docElem = doc.documentElement;
        +
        +			return {
        +				top: rect.top + win.pageYOffset - docElem.clientTop,
        +				left: rect.left + win.pageXOffset - docElem.clientLeft
        +			};
        +		}
        +
        +		// Return zeros for disconnected and hidden elements (gh-2310)
        +		return rect;
        +	},
        +
        +	position: function() {
        +		if ( !this[ 0 ] ) {
        +			return;
        +		}
        +
        +		var offsetParent, offset,
        +			elem = this[ 0 ],
        +			parentOffset = { top: 0, left: 0 };
        +
        +		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
        +		// because it is its only offset parent
        +		if ( jQuery.css( elem, "position" ) === "fixed" ) {
        +
        +			// Assume getBoundingClientRect is there when computed position is fixed
        +			offset = elem.getBoundingClientRect();
        +
        +		} else {
        +
        +			// Get *real* offsetParent
        +			offsetParent = this.offsetParent();
        +
        +			// Get correct offsets
        +			offset = this.offset();
        +			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
        +				parentOffset = offsetParent.offset();
        +			}
        +
        +			// Add offsetParent borders
        +			parentOffset = {
        +				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
        +				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
        +			};
        +		}
        +
        +		// Subtract parent offsets and element margins
        +		return {
        +			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
        +			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
        +		};
        +	},
        +
        +	// This method will return documentElement in the following cases:
        +	// 1) For the element inside the iframe without offsetParent, this method will return
        +	//    documentElement of the parent window
        +	// 2) For the hidden or detached element
        +	// 3) For body or html element, i.e. in case of the html node - it will return itself
        +	//
        +	// but those exceptions were never presented as a real life use-cases
        +	// and might be considered as more preferable results.
        +	//
        +	// This logic, however, is not guaranteed and can change at any point in the future
        +	offsetParent: function() {
        +		return this.map( function() {
        +			var offsetParent = this.offsetParent;
        +
        +			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
        +				offsetParent = offsetParent.offsetParent;
        +			}
        +
        +			return offsetParent || documentElement;
        +		} );
        +	}
        +} );
        +
        +// Create scrollLeft and scrollTop methods
        +jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
        +	var top = "pageYOffset" === prop;
        +
        +	jQuery.fn[ method ] = function( val ) {
        +		return access( this, function( elem, method, val ) {
        +			var win = getWindow( elem );
        +
        +			if ( val === undefined ) {
        +				return win ? win[ prop ] : elem[ method ];
        +			}
        +
        +			if ( win ) {
        +				win.scrollTo(
        +					!top ? val : win.pageXOffset,
        +					top ? val : win.pageYOffset
        +				);
        +
        +			} else {
        +				elem[ method ] = val;
        +			}
        +		}, method, val, arguments.length );
        +	};
        +} );
        +
        +// Support: Safari <=7 - 9.1, Chrome <=37 - 49
        +// Add the top/left cssHooks using jQuery.fn.position
        +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
        +// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
        +// getComputedStyle returns percent when specified for top/left/bottom/right;
        +// rather than make the css module depend on the offset module, just check for it here
        +jQuery.each( [ "top", "left" ], function( i, prop ) {
        +	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
        +		function( elem, computed ) {
        +			if ( computed ) {
        +				computed = curCSS( elem, prop );
        +
        +				// If curCSS returns percentage, fallback to offset
        +				return rnumnonpx.test( computed ) ?
        +					jQuery( elem ).position()[ prop ] + "px" :
        +					computed;
        +			}
        +		}
        +	);
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/queue.js b/bower_components/jquery/src/queue.js
        new file mode 100644
        index 0000000000..3a626a2fc3
        --- /dev/null
        +++ b/bower_components/jquery/src/queue.js
        @@ -0,0 +1,145 @@
        +define( [
        +	"./core",
        +	"./data/var/dataPriv",
        +	"./deferred",
        +	"./callbacks"
        +], function( jQuery, dataPriv ) {
        +
        +"use strict";
        +
        +jQuery.extend( {
        +	queue: function( elem, type, data ) {
        +		var queue;
        +
        +		if ( elem ) {
        +			type = ( type || "fx" ) + "queue";
        +			queue = dataPriv.get( elem, type );
        +
        +			// Speed up dequeue by getting out quickly if this is just a lookup
        +			if ( data ) {
        +				if ( !queue || jQuery.isArray( data ) ) {
        +					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
        +				} else {
        +					queue.push( data );
        +				}
        +			}
        +			return queue || [];
        +		}
        +	},
        +
        +	dequeue: function( elem, type ) {
        +		type = type || "fx";
        +
        +		var queue = jQuery.queue( elem, type ),
        +			startLength = queue.length,
        +			fn = queue.shift(),
        +			hooks = jQuery._queueHooks( elem, type ),
        +			next = function() {
        +				jQuery.dequeue( elem, type );
        +			};
        +
        +		// If the fx queue is dequeued, always remove the progress sentinel
        +		if ( fn === "inprogress" ) {
        +			fn = queue.shift();
        +			startLength--;
        +		}
        +
        +		if ( fn ) {
        +
        +			// Add a progress sentinel to prevent the fx queue from being
        +			// automatically dequeued
        +			if ( type === "fx" ) {
        +				queue.unshift( "inprogress" );
        +			}
        +
        +			// Clear up the last queue stop function
        +			delete hooks.stop;
        +			fn.call( elem, next, hooks );
        +		}
        +
        +		if ( !startLength && hooks ) {
        +			hooks.empty.fire();
        +		}
        +	},
        +
        +	// Not public - generate a queueHooks object, or return the current one
        +	_queueHooks: function( elem, type ) {
        +		var key = type + "queueHooks";
        +		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
        +			empty: jQuery.Callbacks( "once memory" ).add( function() {
        +				dataPriv.remove( elem, [ type + "queue", key ] );
        +			} )
        +		} );
        +	}
        +} );
        +
        +jQuery.fn.extend( {
        +	queue: function( type, data ) {
        +		var setter = 2;
        +
        +		if ( typeof type !== "string" ) {
        +			data = type;
        +			type = "fx";
        +			setter--;
        +		}
        +
        +		if ( arguments.length < setter ) {
        +			return jQuery.queue( this[ 0 ], type );
        +		}
        +
        +		return data === undefined ?
        +			this :
        +			this.each( function() {
        +				var queue = jQuery.queue( this, type, data );
        +
        +				// Ensure a hooks for this queue
        +				jQuery._queueHooks( this, type );
        +
        +				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
        +					jQuery.dequeue( this, type );
        +				}
        +			} );
        +	},
        +	dequeue: function( type ) {
        +		return this.each( function() {
        +			jQuery.dequeue( this, type );
        +		} );
        +	},
        +	clearQueue: function( type ) {
        +		return this.queue( type || "fx", [] );
        +	},
        +
        +	// Get a promise resolved when queues of a certain type
        +	// are emptied (fx is the type by default)
        +	promise: function( type, obj ) {
        +		var tmp,
        +			count = 1,
        +			defer = jQuery.Deferred(),
        +			elements = this,
        +			i = this.length,
        +			resolve = function() {
        +				if ( !( --count ) ) {
        +					defer.resolveWith( elements, [ elements ] );
        +				}
        +			};
        +
        +		if ( typeof type !== "string" ) {
        +			obj = type;
        +			type = undefined;
        +		}
        +		type = type || "fx";
        +
        +		while ( i-- ) {
        +			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
        +			if ( tmp && tmp.empty ) {
        +				count++;
        +				tmp.empty.add( resolve );
        +			}
        +		}
        +		resolve();
        +		return defer.promise( obj );
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/queue/delay.js b/bower_components/jquery/src/queue/delay.js
        new file mode 100644
        index 0000000000..d471eedc55
        --- /dev/null
        +++ b/bower_components/jquery/src/queue/delay.js
        @@ -0,0 +1,24 @@
        +define( [
        +	"../core",
        +	"../queue",
        +	"../effects" // Delay is optional because of this dependency
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +// Based off of the plugin by Clint Helfers, with permission.
        +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
        +jQuery.fn.delay = function( time, type ) {
        +	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
        +	type = type || "fx";
        +
        +	return this.queue( type, function( next, hooks ) {
        +		var timeout = window.setTimeout( next, time );
        +		hooks.stop = function() {
        +			window.clearTimeout( timeout );
        +		};
        +	} );
        +};
        +
        +return jQuery.fn.delay;
        +} );
        diff --git a/bower_components/jquery/src/selector-native.js b/bower_components/jquery/src/selector-native.js
        new file mode 100644
        index 0000000000..da837a0046
        --- /dev/null
        +++ b/bower_components/jquery/src/selector-native.js
        @@ -0,0 +1,237 @@
        +define( [
        +	"./core",
        +	"./var/document",
        +	"./var/documentElement",
        +	"./var/hasOwn",
        +	"./var/indexOf"
        +], function( jQuery, document, documentElement, hasOwn, indexOf ) {
        +
        +"use strict";
        +
        +/*
        + * Optional (non-Sizzle) selector module for custom builds.
        + *
        + * Note that this DOES NOT SUPPORT many documented jQuery
        + * features in exchange for its smaller size:
        + *
        + * Attribute not equal selector
        + * Positional selectors (:first; :eq(n); :odd; etc.)
        + * Type selectors (:input; :checkbox; :button; etc.)
        + * State-based selectors (:animated; :visible; :hidden; etc.)
        + * :has(selector)
        + * :not(complex selector)
        + * custom selectors via Sizzle extensions
        + * Leading combinators (e.g., $collection.find("> *"))
        + * Reliable functionality on XML fragments
        + * Requiring all parts of a selector to match elements under context
        + *   (e.g., $div.find("div > *") now matches children of $div)
        + * Matching against non-elements
        + * Reliable sorting of disconnected nodes
        + * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)
        + *
        + * If any of these are unacceptable tradeoffs, either use Sizzle or
        + * customize this stub for the project's specific needs.
        + */
        +
        +var hasDuplicate, sortInput,
        +	sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando,
        +	matches = documentElement.matches ||
        +		documentElement.webkitMatchesSelector ||
        +		documentElement.mozMatchesSelector ||
        +		documentElement.oMatchesSelector ||
        +		documentElement.msMatchesSelector,
        +
        +	// CSS string/identifier serialization
        +	// https://drafts.csswg.org/cssom/#common-serializing-idioms
        +	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
        +	fcssescape = function( ch, asCodePoint ) {
        +		if ( asCodePoint ) {
        +
        +			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
        +			if ( ch === "\0" ) {
        +				return "\uFFFD";
        +			}
        +
        +			// Control characters and (dependent upon position) numbers get escaped as code points
        +			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
        +		}
        +
        +		// Other potentially-special ASCII characters get backslash-escaped
        +		return "\\" + ch;
        +	};
        +
        +function sortOrder( a, b ) {
        +
        +	// Flag for duplicate removal
        +	if ( a === b ) {
        +		hasDuplicate = true;
        +		return 0;
        +	}
        +
        +	// Sort on method existence if only one input has compareDocumentPosition
        +	var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
        +	if ( compare ) {
        +		return compare;
        +	}
        +
        +	// Calculate position if both inputs belong to the same document
        +	compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
        +		a.compareDocumentPosition( b ) :
        +
        +		// Otherwise we know they are disconnected
        +		1;
        +
        +	// Disconnected nodes
        +	if ( compare & 1 ) {
        +
        +		// Choose the first element that is related to our preferred document
        +		if ( a === document || a.ownerDocument === document &&
        +			jQuery.contains( document, a ) ) {
        +			return -1;
        +		}
        +		if ( b === document || b.ownerDocument === document &&
        +			jQuery.contains( document, b ) ) {
        +			return 1;
        +		}
        +
        +		// Maintain original order
        +		return sortInput ?
        +			( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
        +			0;
        +	}
        +
        +	return compare & 4 ? -1 : 1;
        +}
        +
        +function uniqueSort( results ) {
        +	var elem,
        +		duplicates = [],
        +		j = 0,
        +		i = 0;
        +
        +	hasDuplicate = false;
        +	sortInput = !sortStable && results.slice( 0 );
        +	results.sort( sortOrder );
        +
        +	if ( hasDuplicate ) {
        +		while ( ( elem = results[ i++ ] ) ) {
        +			if ( elem === results[ i ] ) {
        +				j = duplicates.push( i );
        +			}
        +		}
        +		while ( j-- ) {
        +			results.splice( duplicates[ j ], 1 );
        +		}
        +	}
        +
        +	// Clear input after sorting to release objects
        +	// See https://github.com/jquery/sizzle/pull/225
        +	sortInput = null;
        +
        +	return results;
        +}
        +
        +function escape( sel ) {
        +	return ( sel + "" ).replace( rcssescape, fcssescape );
        +}
        +
        +jQuery.extend( {
        +	uniqueSort: uniqueSort,
        +	unique: uniqueSort,
        +	escapeSelector: escape,
        +	find: function( selector, context, results, seed ) {
        +		var elem, nodeType,
        +			i = 0;
        +
        +		results = results || [];
        +		context = context || document;
        +
        +		// Same basic safeguard as Sizzle
        +		if ( !selector || typeof selector !== "string" ) {
        +			return results;
        +		}
        +
        +		// Early return if context is not an element or document
        +		if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) {
        +			return [];
        +		}
        +
        +		if ( seed ) {
        +			while ( ( elem = seed[ i++ ] ) ) {
        +				if ( jQuery.find.matchesSelector( elem, selector ) ) {
        +					results.push( elem );
        +				}
        +			}
        +		} else {
        +			jQuery.merge( results, context.querySelectorAll( selector ) );
        +		}
        +
        +		return results;
        +	},
        +	text: function( elem ) {
        +		var node,
        +			ret = "",
        +			i = 0,
        +			nodeType = elem.nodeType;
        +
        +		if ( !nodeType ) {
        +
        +			// If no nodeType, this is expected to be an array
        +			while ( ( node = elem[ i++ ] ) ) {
        +
        +				// Do not traverse comment nodes
        +				ret += jQuery.text( node );
        +			}
        +		} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +
        +			// Use textContent for elements
        +			return elem.textContent;
        +		} else if ( nodeType === 3 || nodeType === 4 ) {
        +			return elem.nodeValue;
        +		}
        +
        +		// Do not include comment or processing instruction nodes
        +
        +		return ret;
        +	},
        +	contains: function( a, b ) {
        +		var adown = a.nodeType === 9 ? a.documentElement : a,
        +			bup = b && b.parentNode;
        +		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains( bup ) );
        +	},
        +	isXMLDoc: function( elem ) {
        +
        +		// documentElement is verified for cases where it doesn't yet exist
        +		// (such as loading iframes in IE - #4833)
        +		var documentElement = elem && ( elem.ownerDocument || elem ).documentElement;
        +		return documentElement ? documentElement.nodeName !== "HTML" : false;
        +	},
        +	expr: {
        +		attrHandle: {},
        +		match: {
        +			bool: new RegExp( "^(?:checked|selected|async|autofocus|autoplay|controls|defer" +
        +				"|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$", "i" ),
        +			needsContext: /^[\x20\t\r\n\f]*[>+~]/
        +		}
        +	}
        +} );
        +
        +jQuery.extend( jQuery.find, {
        +	matches: function( expr, elements ) {
        +		return jQuery.find( expr, null, null, elements );
        +	},
        +	matchesSelector: function( elem, expr ) {
        +		return matches.call( elem, expr );
        +	},
        +	attr: function( elem, name ) {
        +		var fn = jQuery.expr.attrHandle[ name.toLowerCase() ],
        +
        +			// Don't get fooled by Object.prototype properties (jQuery #13807)
        +			value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ?
        +				fn( elem, name, jQuery.isXMLDoc( elem ) ) :
        +				undefined;
        +		return value !== undefined ? value : elem.getAttribute( name );
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/selector-sizzle.js b/bower_components/jquery/src/selector-sizzle.js
        new file mode 100644
        index 0000000000..ff7bc70ee1
        --- /dev/null
        +++ b/bower_components/jquery/src/selector-sizzle.js
        @@ -0,0 +1,19 @@
        +define( [
        +	"./core",
        +	"../external/sizzle/dist/sizzle"
        +], function( jQuery, Sizzle ) {
        +
        +"use strict";
        +
        +jQuery.find = Sizzle;
        +jQuery.expr = Sizzle.selectors;
        +
        +// Deprecated
        +jQuery.expr[ ":" ] = jQuery.expr.pseudos;
        +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
        +jQuery.text = Sizzle.getText;
        +jQuery.isXMLDoc = Sizzle.isXML;
        +jQuery.contains = Sizzle.contains;
        +jQuery.escapeSelector = Sizzle.escape;
        +
        +} );
        diff --git a/bower_components/jquery/src/selector.js b/bower_components/jquery/src/selector.js
        new file mode 100644
        index 0000000000..2e0c17e153
        --- /dev/null
        +++ b/bower_components/jquery/src/selector.js
        @@ -0,0 +1,3 @@
        +define( [ "./selector-sizzle" ], function() {
        +	"use strict";
        +} );
        diff --git a/bower_components/jquery/src/serialize.js b/bower_components/jquery/src/serialize.js
        new file mode 100644
        index 0000000000..35dcf04f9b
        --- /dev/null
        +++ b/bower_components/jquery/src/serialize.js
        @@ -0,0 +1,130 @@
        +define( [
        +	"./core",
        +	"./manipulation/var/rcheckableType",
        +	"./core/init",
        +	"./traversing", // filter
        +	"./attributes/prop"
        +], function( jQuery, rcheckableType ) {
        +
        +"use strict";
        +
        +var
        +	rbracket = /\[\]$/,
        +	rCRLF = /\r?\n/g,
        +	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
        +	rsubmittable = /^(?:input|select|textarea|keygen)/i;
        +
        +function buildParams( prefix, obj, traditional, add ) {
        +	var name;
        +
        +	if ( jQuery.isArray( obj ) ) {
        +
        +		// Serialize array item.
        +		jQuery.each( obj, function( i, v ) {
        +			if ( traditional || rbracket.test( prefix ) ) {
        +
        +				// Treat each array item as a scalar.
        +				add( prefix, v );
        +
        +			} else {
        +
        +				// Item is non-scalar (array or object), encode its numeric index.
        +				buildParams(
        +					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
        +					v,
        +					traditional,
        +					add
        +				);
        +			}
        +		} );
        +
        +	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
        +
        +		// Serialize object item.
        +		for ( name in obj ) {
        +			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
        +		}
        +
        +	} else {
        +
        +		// Serialize scalar item.
        +		add( prefix, obj );
        +	}
        +}
        +
        +// Serialize an array of form elements or a set of
        +// key/values into a query string
        +jQuery.param = function( a, traditional ) {
        +	var prefix,
        +		s = [],
        +		add = function( key, valueOrFunction ) {
        +
        +			// If value is a function, invoke it and use its return value
        +			var value = jQuery.isFunction( valueOrFunction ) ?
        +				valueOrFunction() :
        +				valueOrFunction;
        +
        +			s[ s.length ] = encodeURIComponent( key ) + "=" +
        +				encodeURIComponent( value == null ? "" : value );
        +		};
        +
        +	// If an array was passed in, assume that it is an array of form elements.
        +	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        +
        +		// Serialize the form elements
        +		jQuery.each( a, function() {
        +			add( this.name, this.value );
        +		} );
        +
        +	} else {
        +
        +		// If traditional, encode the "old" way (the way 1.3.2 or older
        +		// did it), otherwise encode params recursively.
        +		for ( prefix in a ) {
        +			buildParams( prefix, a[ prefix ], traditional, add );
        +		}
        +	}
        +
        +	// Return the resulting serialization
        +	return s.join( "&" );
        +};
        +
        +jQuery.fn.extend( {
        +	serialize: function() {
        +		return jQuery.param( this.serializeArray() );
        +	},
        +	serializeArray: function() {
        +		return this.map( function() {
        +
        +			// Can add propHook for "elements" to filter or add form elements
        +			var elements = jQuery.prop( this, "elements" );
        +			return elements ? jQuery.makeArray( elements ) : this;
        +		} )
        +		.filter( function() {
        +			var type = this.type;
        +
        +			// Use .is( ":disabled" ) so that fieldset[disabled] works
        +			return this.name && !jQuery( this ).is( ":disabled" ) &&
        +				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
        +				( this.checked || !rcheckableType.test( type ) );
        +		} )
        +		.map( function( i, elem ) {
        +			var val = jQuery( this ).val();
        +
        +			if ( val == null ) {
        +				return null;
        +			}
        +
        +			if ( jQuery.isArray( val ) ) {
        +				return jQuery.map( val, function( val ) {
        +					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +				} );
        +			}
        +
        +			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +		} ).get();
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/traversing.js b/bower_components/jquery/src/traversing.js
        new file mode 100644
        index 0000000000..50cd2d6ee7
        --- /dev/null
        +++ b/bower_components/jquery/src/traversing.js
        @@ -0,0 +1,178 @@
        +define( [
        +	"./core",
        +	"./var/indexOf",
        +	"./traversing/var/dir",
        +	"./traversing/var/siblings",
        +	"./traversing/var/rneedsContext",
        +	"./core/init",
        +	"./traversing/findFilter",
        +	"./selector"
        +], function( jQuery, indexOf, dir, siblings, rneedsContext ) {
        +
        +"use strict";
        +
        +var rparentsprev = /^(?:parents|prev(?:Until|All))/,
        +
        +	// Methods guaranteed to produce a unique set when starting from a unique set
        +	guaranteedUnique = {
        +		children: true,
        +		contents: true,
        +		next: true,
        +		prev: true
        +	};
        +
        +jQuery.fn.extend( {
        +	has: function( target ) {
        +		var targets = jQuery( target, this ),
        +			l = targets.length;
        +
        +		return this.filter( function() {
        +			var i = 0;
        +			for ( ; i < l; i++ ) {
        +				if ( jQuery.contains( this, targets[ i ] ) ) {
        +					return true;
        +				}
        +			}
        +		} );
        +	},
        +
        +	closest: function( selectors, context ) {
        +		var cur,
        +			i = 0,
        +			l = this.length,
        +			matched = [],
        +			targets = typeof selectors !== "string" && jQuery( selectors );
        +
        +		// Positional selectors never match, since there's no _selection_ context
        +		if ( !rneedsContext.test( selectors ) ) {
        +			for ( ; i < l; i++ ) {
        +				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
        +
        +					// Always skip document fragments
        +					if ( cur.nodeType < 11 && ( targets ?
        +						targets.index( cur ) > -1 :
        +
        +						// Don't pass non-elements to Sizzle
        +						cur.nodeType === 1 &&
        +							jQuery.find.matchesSelector( cur, selectors ) ) ) {
        +
        +						matched.push( cur );
        +						break;
        +					}
        +				}
        +			}
        +		}
        +
        +		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
        +	},
        +
        +	// Determine the position of an element within the set
        +	index: function( elem ) {
        +
        +		// No argument, return index in parent
        +		if ( !elem ) {
        +			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
        +		}
        +
        +		// Index in selector
        +		if ( typeof elem === "string" ) {
        +			return indexOf.call( jQuery( elem ), this[ 0 ] );
        +		}
        +
        +		// Locate the position of the desired element
        +		return indexOf.call( this,
        +
        +			// If it receives a jQuery object, the first element is used
        +			elem.jquery ? elem[ 0 ] : elem
        +		);
        +	},
        +
        +	add: function( selector, context ) {
        +		return this.pushStack(
        +			jQuery.uniqueSort(
        +				jQuery.merge( this.get(), jQuery( selector, context ) )
        +			)
        +		);
        +	},
        +
        +	addBack: function( selector ) {
        +		return this.add( selector == null ?
        +			this.prevObject : this.prevObject.filter( selector )
        +		);
        +	}
        +} );
        +
        +function sibling( cur, dir ) {
        +	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
        +	return cur;
        +}
        +
        +jQuery.each( {
        +	parent: function( elem ) {
        +		var parent = elem.parentNode;
        +		return parent && parent.nodeType !== 11 ? parent : null;
        +	},
        +	parents: function( elem ) {
        +		return dir( elem, "parentNode" );
        +	},
        +	parentsUntil: function( elem, i, until ) {
        +		return dir( elem, "parentNode", until );
        +	},
        +	next: function( elem ) {
        +		return sibling( elem, "nextSibling" );
        +	},
        +	prev: function( elem ) {
        +		return sibling( elem, "previousSibling" );
        +	},
        +	nextAll: function( elem ) {
        +		return dir( elem, "nextSibling" );
        +	},
        +	prevAll: function( elem ) {
        +		return dir( elem, "previousSibling" );
        +	},
        +	nextUntil: function( elem, i, until ) {
        +		return dir( elem, "nextSibling", until );
        +	},
        +	prevUntil: function( elem, i, until ) {
        +		return dir( elem, "previousSibling", until );
        +	},
        +	siblings: function( elem ) {
        +		return siblings( ( elem.parentNode || {} ).firstChild, elem );
        +	},
        +	children: function( elem ) {
        +		return siblings( elem.firstChild );
        +	},
        +	contents: function( elem ) {
        +		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
        +	}
        +}, function( name, fn ) {
        +	jQuery.fn[ name ] = function( until, selector ) {
        +		var matched = jQuery.map( this, fn, until );
        +
        +		if ( name.slice( -5 ) !== "Until" ) {
        +			selector = until;
        +		}
        +
        +		if ( selector && typeof selector === "string" ) {
        +			matched = jQuery.filter( selector, matched );
        +		}
        +
        +		if ( this.length > 1 ) {
        +
        +			// Remove duplicates
        +			if ( !guaranteedUnique[ name ] ) {
        +				jQuery.uniqueSort( matched );
        +			}
        +
        +			// Reverse order for parents* and prev-derivatives
        +			if ( rparentsprev.test( name ) ) {
        +				matched.reverse();
        +			}
        +		}
        +
        +		return this.pushStack( matched );
        +	};
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/jquery/src/traversing/findFilter.js b/bower_components/jquery/src/traversing/findFilter.js
        new file mode 100644
        index 0000000000..3bd036a18a
        --- /dev/null
        +++ b/bower_components/jquery/src/traversing/findFilter.js
        @@ -0,0 +1,106 @@
        +define( [
        +	"../core",
        +	"../var/indexOf",
        +	"./var/rneedsContext",
        +	"../selector"
        +], function( jQuery, indexOf, rneedsContext ) {
        +
        +"use strict";
        +
        +var risSimple = /^.[^:#\[\.,]*$/;
        +
        +// Implement the identical functionality for filter and not
        +function winnow( elements, qualifier, not ) {
        +	if ( jQuery.isFunction( qualifier ) ) {
        +		return jQuery.grep( elements, function( elem, i ) {
        +			return !!qualifier.call( elem, i, elem ) !== not;
        +		} );
        +	}
        +
        +	// Single element
        +	if ( qualifier.nodeType ) {
        +		return jQuery.grep( elements, function( elem ) {
        +			return ( elem === qualifier ) !== not;
        +		} );
        +	}
        +
        +	// Arraylike of elements (jQuery, arguments, Array)
        +	if ( typeof qualifier !== "string" ) {
        +		return jQuery.grep( elements, function( elem ) {
        +			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
        +		} );
        +	}
        +
        +	// Simple selector that can be filtered directly, removing non-Elements
        +	if ( risSimple.test( qualifier ) ) {
        +		return jQuery.filter( qualifier, elements, not );
        +	}
        +
        +	// Complex selector, compare the two sets, removing non-Elements
        +	qualifier = jQuery.filter( qualifier, elements );
        +	return jQuery.grep( elements, function( elem ) {
        +		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
        +	} );
        +}
        +
        +jQuery.filter = function( expr, elems, not ) {
        +	var elem = elems[ 0 ];
        +
        +	if ( not ) {
        +		expr = ":not(" + expr + ")";
        +	}
        +
        +	if ( elems.length === 1 && elem.nodeType === 1 ) {
        +		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
        +	}
        +
        +	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
        +		return elem.nodeType === 1;
        +	} ) );
        +};
        +
        +jQuery.fn.extend( {
        +	find: function( selector ) {
        +		var i, ret,
        +			len = this.length,
        +			self = this;
        +
        +		if ( typeof selector !== "string" ) {
        +			return this.pushStack( jQuery( selector ).filter( function() {
        +				for ( i = 0; i < len; i++ ) {
        +					if ( jQuery.contains( self[ i ], this ) ) {
        +						return true;
        +					}
        +				}
        +			} ) );
        +		}
        +
        +		ret = this.pushStack( [] );
        +
        +		for ( i = 0; i < len; i++ ) {
        +			jQuery.find( selector, self[ i ], ret );
        +		}
        +
        +		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
        +	},
        +	filter: function( selector ) {
        +		return this.pushStack( winnow( this, selector || [], false ) );
        +	},
        +	not: function( selector ) {
        +		return this.pushStack( winnow( this, selector || [], true ) );
        +	},
        +	is: function( selector ) {
        +		return !!winnow(
        +			this,
        +
        +			// If this is a positional/relative selector, check membership in the returned set
        +			// so $("p:first").is("p:last") won't return true for a doc with two "p".
        +			typeof selector === "string" && rneedsContext.test( selector ) ?
        +				jQuery( selector ) :
        +				selector || [],
        +			false
        +		).length;
        +	}
        +} );
        +
        +} );
        diff --git a/bower_components/jquery/src/traversing/var/dir.js b/bower_components/jquery/src/traversing/var/dir.js
        new file mode 100644
        index 0000000000..366a823d69
        --- /dev/null
        +++ b/bower_components/jquery/src/traversing/var/dir.js
        @@ -0,0 +1,22 @@
        +define( [
        +	"../../core"
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +return function( elem, dir, until ) {
        +	var matched = [],
        +		truncate = until !== undefined;
        +
        +	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
        +		if ( elem.nodeType === 1 ) {
        +			if ( truncate && jQuery( elem ).is( until ) ) {
        +				break;
        +			}
        +			matched.push( elem );
        +		}
        +	}
        +	return matched;
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/traversing/var/rneedsContext.js b/bower_components/jquery/src/traversing/var/rneedsContext.js
        new file mode 100644
        index 0000000000..d0663cee8a
        --- /dev/null
        +++ b/bower_components/jquery/src/traversing/var/rneedsContext.js
        @@ -0,0 +1,8 @@
        +define( [
        +	"../../core",
        +	"../../selector"
        +], function( jQuery ) {
        +	"use strict";
        +
        +	return jQuery.expr.match.needsContext;
        +} );
        diff --git a/bower_components/jquery/src/traversing/var/siblings.js b/bower_components/jquery/src/traversing/var/siblings.js
        new file mode 100644
        index 0000000000..952629d0c8
        --- /dev/null
        +++ b/bower_components/jquery/src/traversing/var/siblings.js
        @@ -0,0 +1,17 @@
        +define( function() {
        +
        +"use strict";
        +
        +return function( n, elem ) {
        +	var matched = [];
        +
        +	for ( ; n; n = n.nextSibling ) {
        +		if ( n.nodeType === 1 && n !== elem ) {
        +			matched.push( n );
        +		}
        +	}
        +
        +	return matched;
        +};
        +
        +} );
        diff --git a/bower_components/jquery/src/var/ObjectFunctionString.js b/bower_components/jquery/src/var/ObjectFunctionString.js
        new file mode 100644
        index 0000000000..f9e850fd8e
        --- /dev/null
        +++ b/bower_components/jquery/src/var/ObjectFunctionString.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./fnToString"
        +], function( fnToString ) {
        +	"use strict";
        +
        +	return fnToString.call( Object );
        +} );
        diff --git a/bower_components/jquery/src/var/arr.js b/bower_components/jquery/src/var/arr.js
        new file mode 100644
        index 0000000000..84713d8380
        --- /dev/null
        +++ b/bower_components/jquery/src/var/arr.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return [];
        +} );
        diff --git a/bower_components/jquery/src/var/class2type.js b/bower_components/jquery/src/var/class2type.js
        new file mode 100644
        index 0000000000..4365d46a26
        --- /dev/null
        +++ b/bower_components/jquery/src/var/class2type.js
        @@ -0,0 +1,6 @@
        +define( function() {
        +	"use strict";
        +
        +	// [[Class]] -> type pairs
        +	return {};
        +} );
        diff --git a/bower_components/jquery/src/var/concat.js b/bower_components/jquery/src/var/concat.js
        new file mode 100644
        index 0000000000..e47c19d753
        --- /dev/null
        +++ b/bower_components/jquery/src/var/concat.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./arr"
        +], function( arr ) {
        +	"use strict";
        +
        +	return arr.concat;
        +} );
        diff --git a/bower_components/jquery/src/var/document.js b/bower_components/jquery/src/var/document.js
        new file mode 100644
        index 0000000000..dd3939df4f
        --- /dev/null
        +++ b/bower_components/jquery/src/var/document.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return window.document;
        +} );
        diff --git a/bower_components/jquery/src/var/documentElement.js b/bower_components/jquery/src/var/documentElement.js
        new file mode 100644
        index 0000000000..0e3f8b48c8
        --- /dev/null
        +++ b/bower_components/jquery/src/var/documentElement.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./document"
        +], function( document ) {
        +	"use strict";
        +
        +	return document.documentElement;
        +} );
        diff --git a/bower_components/jquery/src/var/fnToString.js b/bower_components/jquery/src/var/fnToString.js
        new file mode 100644
        index 0000000000..18c43ff301
        --- /dev/null
        +++ b/bower_components/jquery/src/var/fnToString.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./hasOwn"
        +], function( hasOwn ) {
        +	"use strict";
        +
        +	return hasOwn.toString;
        +} );
        diff --git a/bower_components/jquery/src/var/getProto.js b/bower_components/jquery/src/var/getProto.js
        new file mode 100644
        index 0000000000..965fab8fb4
        --- /dev/null
        +++ b/bower_components/jquery/src/var/getProto.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return Object.getPrototypeOf;
        +} );
        diff --git a/bower_components/jquery/src/var/hasOwn.js b/bower_components/jquery/src/var/hasOwn.js
        new file mode 100644
        index 0000000000..44ab6807d8
        --- /dev/null
        +++ b/bower_components/jquery/src/var/hasOwn.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./class2type"
        +], function( class2type ) {
        +	"use strict";
        +
        +	return class2type.hasOwnProperty;
        +} );
        diff --git a/bower_components/jquery/src/var/indexOf.js b/bower_components/jquery/src/var/indexOf.js
        new file mode 100644
        index 0000000000..8320b98e57
        --- /dev/null
        +++ b/bower_components/jquery/src/var/indexOf.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./arr"
        +], function( arr ) {
        +	"use strict";
        +
        +	return arr.indexOf;
        +} );
        diff --git a/bower_components/jquery/src/var/pnum.js b/bower_components/jquery/src/var/pnum.js
        new file mode 100644
        index 0000000000..6f06d73b17
        --- /dev/null
        +++ b/bower_components/jquery/src/var/pnum.js
        @@ -0,0 +1,5 @@
        +define( function() {
        +	"use strict";
        +
        +	return ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
        +} );
        diff --git a/bower_components/jquery/src/var/push.js b/bower_components/jquery/src/var/push.js
        new file mode 100644
        index 0000000000..94656209ab
        --- /dev/null
        +++ b/bower_components/jquery/src/var/push.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./arr"
        +], function( arr ) {
        +	"use strict";
        +
        +	return arr.push;
        +} );
        diff --git a/bower_components/jquery/src/var/rcssNum.js b/bower_components/jquery/src/var/rcssNum.js
        new file mode 100644
        index 0000000000..4214b14aa5
        --- /dev/null
        +++ b/bower_components/jquery/src/var/rcssNum.js
        @@ -0,0 +1,9 @@
        +define( [
        +	"../var/pnum"
        +], function( pnum ) {
        +
        +"use strict";
        +
        +return new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
        +
        +} );
        diff --git a/bower_components/jquery/src/var/rnothtmlwhite.js b/bower_components/jquery/src/var/rnothtmlwhite.js
        new file mode 100644
        index 0000000000..30604db4f6
        --- /dev/null
        +++ b/bower_components/jquery/src/var/rnothtmlwhite.js
        @@ -0,0 +1,8 @@
        +define( function() {
        +	"use strict";
        +
        +	// Only count HTML whitespace
        +	// Other whitespace should count in values
        +	// https://html.spec.whatwg.org/multipage/infrastructure.html#space-character
        +	return ( /[^\x20\t\r\n\f]+/g );
        +} );
        diff --git a/bower_components/jquery/src/var/slice.js b/bower_components/jquery/src/var/slice.js
        new file mode 100644
        index 0000000000..915f837be4
        --- /dev/null
        +++ b/bower_components/jquery/src/var/slice.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./arr"
        +], function( arr ) {
        +	"use strict";
        +
        +	return arr.slice;
        +} );
        diff --git a/bower_components/jquery/src/var/support.js b/bower_components/jquery/src/var/support.js
        new file mode 100644
        index 0000000000..094d0aece0
        --- /dev/null
        +++ b/bower_components/jquery/src/var/support.js
        @@ -0,0 +1,6 @@
        +define( function() {
        +	"use strict";
        +
        +	// All support tests are defined in their respective modules.
        +	return {};
        +} );
        diff --git a/bower_components/jquery/src/var/toString.js b/bower_components/jquery/src/var/toString.js
        new file mode 100644
        index 0000000000..ff4ecdc722
        --- /dev/null
        +++ b/bower_components/jquery/src/var/toString.js
        @@ -0,0 +1,7 @@
        +define( [
        +	"./class2type"
        +], function( class2type ) {
        +	"use strict";
        +
        +	return class2type.toString;
        +} );
        diff --git a/bower_components/jquery/src/wrap.js b/bower_components/jquery/src/wrap.js
        new file mode 100644
        index 0000000000..88b9bb56dc
        --- /dev/null
        +++ b/bower_components/jquery/src/wrap.js
        @@ -0,0 +1,77 @@
        +define( [
        +	"./core",
        +	"./core/init",
        +	"./manipulation", // clone
        +	"./traversing" // parent, contents
        +], function( jQuery ) {
        +
        +"use strict";
        +
        +jQuery.fn.extend( {
        +	wrapAll: function( html ) {
        +		var wrap;
        +
        +		if ( this[ 0 ] ) {
        +			if ( jQuery.isFunction( html ) ) {
        +				html = html.call( this[ 0 ] );
        +			}
        +
        +			// The elements to wrap the target around
        +			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
        +
        +			if ( this[ 0 ].parentNode ) {
        +				wrap.insertBefore( this[ 0 ] );
        +			}
        +
        +			wrap.map( function() {
        +				var elem = this;
        +
        +				while ( elem.firstElementChild ) {
        +					elem = elem.firstElementChild;
        +				}
        +
        +				return elem;
        +			} ).append( this );
        +		}
        +
        +		return this;
        +	},
        +
        +	wrapInner: function( html ) {
        +		if ( jQuery.isFunction( html ) ) {
        +			return this.each( function( i ) {
        +				jQuery( this ).wrapInner( html.call( this, i ) );
        +			} );
        +		}
        +
        +		return this.each( function() {
        +			var self = jQuery( this ),
        +				contents = self.contents();
        +
        +			if ( contents.length ) {
        +				contents.wrapAll( html );
        +
        +			} else {
        +				self.append( html );
        +			}
        +		} );
        +	},
        +
        +	wrap: function( html ) {
        +		var isFunction = jQuery.isFunction( html );
        +
        +		return this.each( function( i ) {
        +			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
        +		} );
        +	},
        +
        +	unwrap: function( selector ) {
        +		this.parent( selector ).not( "body" ).each( function() {
        +			jQuery( this ).replaceWith( this.childNodes );
        +		} );
        +		return this;
        +	}
        +} );
        +
        +return jQuery;
        +} );
        diff --git a/bower_components/select2/.bower.json b/bower_components/select2/.bower.json
        new file mode 100644
        index 0000000000..097d309ee2
        --- /dev/null
        +++ b/bower_components/select2/.bower.json
        @@ -0,0 +1,24 @@
        +{
        +  "name": "select2",
        +  "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
        +  "main": [
        +    "dist/js/select2.js",
        +    "src/scss/core.scss"
        +  ],
        +  "repository": {
        +    "type": "git",
        +    "url": "git@github.com:select2/select2.git"
        +  },
        +  "homepage": "https://github.com/ivaynberg/select2",
        +  "version": "4.0.3",
        +  "_release": "4.0.3",
        +  "_resolution": {
        +    "type": "version",
        +    "tag": "4.0.3",
        +    "commit": "566c7846fbf8c3b7674346f26d0ee872c0a77629"
        +  },
        +  "_source": "https://github.com/ivaynberg/select2.git",
        +  "_target": "^4.0.3",
        +  "_originalSource": "select2",
        +  "_direct": true
        +}
        \ No newline at end of file
        diff --git a/bower_components/select2/.editorconfig b/bower_components/select2/.editorconfig
        new file mode 100644
        index 0000000000..54f4d3beed
        --- /dev/null
        +++ b/bower_components/select2/.editorconfig
        @@ -0,0 +1,6 @@
        +[*]
        +indent_style = space
        +end_of_line = lf
        +
        +[*.js]
        +indent_size = 2
        diff --git a/bower_components/select2/.gitignore b/bower_components/select2/.gitignore
        new file mode 100644
        index 0000000000..aa970da651
        --- /dev/null
        +++ b/bower_components/select2/.gitignore
        @@ -0,0 +1,3 @@
        +node_modules
        +dist/js/i18n/build.txt
        +.sass-cache
        diff --git a/bower_components/select2/.jshintignore b/bower_components/select2/.jshintignore
        new file mode 100644
        index 0000000000..ba5a30f8c3
        --- /dev/null
        +++ b/bower_components/select2/.jshintignore
        @@ -0,0 +1,4 @@
        +src/js/banner.*.js
        +src/js/wrapper.*.js
        +tests/vendor/*.js
        +tests/helpers.js
        diff --git a/bower_components/select2/.jshintrc b/bower_components/select2/.jshintrc
        new file mode 100644
        index 0000000000..9429926877
        --- /dev/null
        +++ b/bower_components/select2/.jshintrc
        @@ -0,0 +1,25 @@
        +{
        +  "bitwise": true,
        +  "camelcase": true,
        +  "curly": true,
        +  "es3": true,
        +  "eqnull": true,
        +  "freeze": true,
        +  "globals": {
        +    "console": false,
        +    "define": false,
        +    "document": false,
        +    "MockContainer": false,
        +    "module": false,
        +    "QUnit": false,
        +    "require": false,
        +    "test": false,
        +    "window": false
        +  },
        +  "indent": 2,
        +  "maxlen": 80,
        +  "noarg": true,
        +  "nonew": true,
        +  "quotmark": "single",
        +  "undef": true
        +}
        diff --git a/bower_components/select2/.travis.yml b/bower_components/select2/.travis.yml
        new file mode 100644
        index 0000000000..0af4c6960a
        --- /dev/null
        +++ b/bower_components/select2/.travis.yml
        @@ -0,0 +1,22 @@
        +language: node_js
        +
        +sudo: false
        +
        +node_js:
        +  - 0.10
        +
        +env:
        +  global:
        +    - secure: XMNK8GVxkwKa6oLl7nJwgg/wmY1YDk5rrMd+UXz26EDCsMDbiy1P7GhN2fEiBSLaQ7YfEuvaDcmzQxTrT0YTHp1PDzb2o9J4tIDdEkqPcv1y8xMaYDfmsN0rBPdBwZEg9H5zUgi7OdUbrGswSYxsKCE3x8EOqK89104HyOo1LN4=
        +    - secure: BU5BPRx6H4O3WJ509YPixjUxg+hDF3z2BVJX6NiGmKWweqvCEYFfiiHLwDEgp/ynRcF9vGVi1V4Ly1jq7f8NIajbDZ5q443XchZFYFg78K/EwD5mK6LYt16zb7+Jn0KbzwHeGRGzc9AvcEYlW6i634cSCm4n3BnqtF5PpogSzdw=
        +
        +script:
        +  - grunt ci
        +
        +notifications:
        +  email: false
        +  irc:
        +    channels:
        +      - "chat.freenode.net#select2"
        +    on_success: change
        +    on_failure: always
        diff --git a/bower_components/select2/CONTRIBUTING.md b/bower_components/select2/CONTRIBUTING.md
        new file mode 100644
        index 0000000000..ad81e80371
        --- /dev/null
        +++ b/bower_components/select2/CONTRIBUTING.md
        @@ -0,0 +1,204 @@
        +Contributing to Select2
        +=======================
        +Looking to contribute something to Select2? **Here's how you can help.**
        +
        +Please take a moment to review this document in order to make the contribution
        +process easy and effective for everyone involved.
        +
        +Following these guidelines helps to communicate that you respect the time of
        +the developers managing and developing this open source project. In return,
        +they should reciprocate that respect in addressing your issue or assessing
        +patches and features.
        +
        +Using the issue tracker
        +-----------------------
        +When [reporting bugs][reporting-bugs] or
        +[requesting features][requesting-features], the
        +[issue tracker on GitHub][issue-tracker] is the recommended channel to use.
        +
        +The issue tracker **is not** a place for support requests. The
        +[mailing list][community] or [IRC channel][community] are better places to
        +get help.
        +
        +Reporting bugs with Select2
        +---------------------------
        +We really appreciate clear bug reports that _consistently_ show an issue
        +_within Select2_.
        +
        +The ideal bug report follows these guidelines:
        +
        +1. **Use the [GitHub issue search][issue-search]**  &mdash; Check if the issue
        +   has already been reported.
        +2. **Check if the issue has been fixed**  &mdash; Try to reproduce the problem
        +   using the code in the `master` branch.
        +3. **Isolate the problem**  &mdash; Try to create an
        +   [isolated test case][isolated-case] that consistently reproduces the problem.
        +
        +Please try to be as detailed as possible in your bug report, especially if an
        +isolated test case cannot be made. Some useful questions to include the answer
        +to are:
        +
        +- What steps can be used to reproduce the issue?
        +- What is the bug and what is the expected outcome?
        +- What browser(s) and Operating System have you tested with?
        +- Does the bug happen consistently across all tested browsers?
        +- What version of jQuery are you using? And what version of Select2?
        +- Are you using Select2 with other plugins?
        +
        +All of these questions will help others fix and identify any potential bugs.
        +
        +Requesting features in Select2
        +------------------------------
        +Select2 is a large library that carries with it a lot of functionality. Because
        +of this, many feature requests will not be implemented in the core library.
        +
        +Before starting work on a major feature for Select2, **contact the
        +[community][community] first** or you may risk spending a considerable amount of
        +time on something which the project developers are not interested in bringing
        +into the project.
        +
        +Contributing changes to Select2
        +-------------------------------
        +Select2 is made up of multiple submodules that all come together to make the
        +standard and extended builds that are available to users. The build system uses
        +Node.js to manage and compile the submodules, all of which is done using the
        +Grunt build system.
        +
        +### Installing development dependencies
        +
        +Select2 can be built and developed on any system which supports Node.js. The
        +preferred Node.js version is 0.10, but 0.12 and later versions can be used
        +without any noticeable issues. You can download Node.js at
        +[their website][nodejs].
        +
        +All other required Node.js packages can be installed using [npm][npm], which
        +comes bundled alongside Node.js.
        +
        +```bash
        +cd /path/to/select2/repo
        +npm install
        +```
        +
        +You may need to install libsass on your system if it is not already available
        +in order to build the SASS files which generate the CSS for themes and the main
        +component.
        +
        +In order to build and serve the documentation, you need to have [Jekyll][jekyll]
        +installed on your system.
        +
        +### Building the Select2 component
        +
        +Select2 uses the [Grunt][grunt] build task system and defines a few custom
        +tasks for common routines. One of them is the `compile` task, which compiles
        +the JavaScript and CSS and produces the final files.
        +
        +```bash
        +cd /path/to/select2/repo
        +grunt compile
        +```
        +
        +You can also generate the minified versions (`.min.js` files) by executing the
        +`minify` task after compiling.
        +
        +```bash
        +cd /path/to/select2/repo
        +grunt minify
        +```
        +
        +### Building the documentation
        +
        +Using the Grunt build system, you run Jekyll and serve the documentation
        +locally. This will also set up the examples to use the latest version of
        +Select2 that has been built.
        +
        +```bash
        +cd /path/to/select2/repo
        +grunt docs
        +```
        +
        +### Running tests
        +
        +Select2 uses the QUnit test system to test individual components.
        +
        +```bash
        +cd /path/to/selct2/repo
        +grunt test
        +```
        +
        +### Submitting a pull request
        +
        +We use GitHub's pull request system for submitting patches. Here are some
        +guidelines to follow when creating the pull request for your fix.
        +
        +1. Make sure to create a ticket for your pull request. This will serve as the
        +bug ticket, and any discussion about the bug will take place there. Your pull
        +request will be focused on the specific changes that fix the bug.
        +2. Make sure to reference the ticket you are fixing within your pull request.
        +This will allow us to close off the ticket once we merge the pull request, or
        +follow up on the ticket if there are any related blocking issues.
        +3. Explain why the specific change was made. Not everyone who is reviewing your
        +pull request will be familiar with the problem it is fixing.
        +4. Run your tests first. If your tests aren't passing, the pull request won't
        +be able to be merged. If you're breaking existing tests, make sure that you
        +aren't causing any breaking changes.
        +5. Only include source changes. While it's not required, only including changes
        +from the `src` directory will prevent merge conflicts from occuring. Making
        +this happen can be as a simple as not committing changes from the `dist`
        +directory.
        +
        +By following these steps, you will make it easier for your pull request to be
        +reviewed and eventually merged.
        +
        +Triaging issues and pull requests
        +---------------------------------
        +Anyone can help the project maintainers triage issues and review pull requests.
        +
        +### Handling new issues
        +
        +Select2 regularly receives new issues which need to be tested and organized.
        +
        +When a new issue that comes in that is similar to another existing issue, it
        +should be checked to make sure it is not a duplicate.  Duplicates issues should
        +be marked by replying to the issue with "Duplicate of #[issue number]" where
        +`[issue number]` is the url or issue number for the existing issue.  This will
        +allow the project maintainers to quickly close off additional issues and keep
        +the discussion focused within a single issue.
        +
        +If you can test issues that are reported to Select2 that contain test cases and
        +confirm under what conditions bugs happen, that will allow others to identify
        +what causes a bug quicker.
        +
        +### Reviewing pull requests
        +
        +It is very common for pull requests to be opened for issues that contain a clear
        +solution to the problem.  These pull requests should be rigorously reviewed by
        +the community before being accepted.  If you are not sure about a piece of
        +submitted code, or know of a better way to do something, do not hesitate to make
        +a comment on the pull request.
        +
        +### Reviving old tickets
        +
        +If you come across tickets which have not been updated for a while, you are
        +encouraged to revive them. While this can be as simple as saying `:+1:`, it is
        +best if you can include more information on the issue. Common bugs and feature
        +requests are more likely to be fixed, whether it is by the community or the
        +developers, so keeping tickets up to date is encouraged.
        +
        +Licensing
        +---------
        +
        +It should also be made clear that **all code contributed to Select** must be
        +licensable under the [MIT license][licensing].  Code that cannot be released
        +under this license **cannot be accepted** into the project.
        +
        +[community]: https://select2.github.io/community.html
        +[grunt]: http://gruntjs.com/
        +[isolated-case]: http://css-tricks.com/6263-reduced-test-cases/
        +[issue-search]: https://github.com/select2/select2/search?q=&type=Issues
        +[issue-tracker]: https://github.com/select2/select2/issues
        +[jekyll]: https://jekyllrb.com/docs/installation/
        +[licensing]: https://github.com/select2/select2/blob/master/LICENSE.md
        +[nodejs]: https://nodejs.org/
        +[npm]: https://www.npmjs.com/
        +[reporting-bugs]: #reporting-bugs-with-select2
        +[requesting-features]: #requesting-features-in-select2
        \ No newline at end of file
        diff --git a/bower_components/select2/Gruntfile.js b/bower_components/select2/Gruntfile.js
        new file mode 100644
        index 0000000000..63619dea08
        --- /dev/null
        +++ b/bower_components/select2/Gruntfile.js
        @@ -0,0 +1,370 @@
        +module.exports = function (grunt) {
        +  // Full list of files that must be included by RequireJS
        +  includes = [
        +    'jquery.select2',
        +    'almond',
        +
        +    'jquery-mousewheel' // shimmed for non-full builds
        +  ];
        +
        +  fullIncludes = [
        +    'jquery',
        +
        +    'select2/compat/containerCss',
        +    'select2/compat/dropdownCss',
        +
        +    'select2/compat/initSelection',
        +    'select2/compat/inputData',
        +    'select2/compat/matcher',
        +    'select2/compat/query',
        +
        +    'select2/dropdown/attachContainer',
        +    'select2/dropdown/stopPropagation',
        +
        +    'select2/selection/stopPropagation'
        +  ].concat(includes);
        +
        +  var i18nModules = [];
        +  var i18nPaths = {};
        +
        +  var i18nFiles = grunt.file.expand({
        +    cwd: 'src/js'
        +  }, 'select2/i18n/*.js');
        +
        +  var testFiles = grunt.file.expand('tests/**/*.html');
        +  var testUrls = testFiles.map(function (filePath) {
        +    return 'http://localhost:9999/' + filePath;
        +  });
        +
        +  var testBuildNumber = "unknown";
        +
        +  if (process.env.TRAVIS_JOB_ID) {
        +    testBuildNumber = "travis-" + process.env.TRAVIS_JOB_ID;
        +  } else {
        +    var currentTime = new Date();
        +
        +    testBuildNumber = "manual-" + currentTime.getTime();
        +  }
        +
        +  for (var i = 0; i < i18nFiles.length; i++) {
        +    var file = i18nFiles[i];
        +    var name = file.split('.')[0];
        +
        +    i18nModules.push({
        +      name: name
        +    });
        +
        +    i18nPaths[name] = '../../' + name;
        +  }
        +
        +  var minifiedBanner = '/*! Select2 <%= package.version %> | https://github.com/select2/select2/blob/master/LICENSE.md */';
        +
        +  grunt.initConfig({
        +    package: grunt.file.readJSON('package.json'),
        +
        +    clean: {
        +      docs: ['docs/_site']
        +    },
        +
        +    concat: {
        +      'dist': {
        +        options: {
        +          banner: grunt.file.read('src/js/wrapper.start.js'),
        +        },
        +        src: [
        +          'dist/js/select2.js',
        +          'src/js/wrapper.end.js'
        +        ],
        +        dest: 'dist/js/select2.js'
        +      },
        +      'dist.full': {
        +        options: {
        +          banner: grunt.file.read('src/js/wrapper.start.js'),
        +        },
        +        src: [
        +          'dist/js/select2.full.js',
        +          'src/js/wrapper.end.js'
        +        ],
        +        dest: 'dist/js/select2.full.js'
        +      }
        +    },
        +
        +    connect: {
        +      tests: {
        +        options: {
        +          base: '.',
        +          hostname: '127.0.0.1',
        +          port: 9999
        +        }
        +      }
        +    },
        +
        +    uglify: {
        +      'dist': {
        +        src: 'dist/js/select2.js',
        +        dest: 'dist/js/select2.min.js',
        +        options: {
        +          banner: minifiedBanner
        +        }
        +      },
        +      'dist.full': {
        +        src: 'dist/js/select2.full.js',
        +        dest: 'dist/js/select2.full.min.js',
        +        options: {
        +          banner: minifiedBanner
        +        }
        +      }
        +    },
        +
        +    qunit: {
        +      all: {
        +        options: {
        +          urls: testUrls
        +        }
        +      }
        +    },
        +
        +    'saucelabs-qunit': {
        +      all: {
        +        options: {
        +          build: testBuildNumber,
        +          tags: ['tests', 'qunit'],
        +          urls: testUrls,
        +          testname: 'QUnit test for Select2',
        +          browsers: [
        +            {
        +              browserName: 'internet explorer',
        +              version: '8'
        +            },
        +            {
        +              browserName: 'internet explorer',
        +              version: '9'
        +            },
        +            {
        +              browserName: 'internet explorer',
        +              version: '10'
        +            },
        +            {
        +              browserName: 'internet explorer',
        +              version: '11'
        +            },
        +
        +            {
        +              browserName: 'firefox',
        +              platform: 'linux'
        +            },
        +
        +            {
        +              browserName: 'chrome'
        +            },
        +
        +            {
        +              browserName: 'opera',
        +              version: '12',
        +              platform: 'linux'
        +            }
        +          ]
        +        }
        +      }
        +    },
        +
        +    'gh-pages': {
        +      options: {
        +        base: 'docs',
        +        branch: 'master',
        +        clone: 'node_modules/grunt-gh-pages/repo',
        +        message: 'Updated docs with master',
        +        push: true,
        +        repo: 'git@github.com:select2/select2.github.io.git'
        +      },
        +      src: '**'
        +    },
        +
        +    jekyll: {
        +      options: {
        +        src: 'docs',
        +        dest: 'docs/_site'
        +      },
        +      build: {
        +        d: null
        +      },
        +      serve: {
        +        options: {
        +          serve: true,
        +          watch: true
        +        }
        +      }
        +    },
        +
        +    jshint: {
        +      options: {
        +        jshintrc: true
        +      },
        +      code: {
        +        src: ['src/js/**/*.js']
        +      },
        +      tests: {
        +        src: ['tests/**/*.js']
        +      }
        +    },
        +
        +    sass: {
        +      dist: {
        +        options: {
        +          outputStyle: 'compressed'
        +        },
        +        files: {
        +          'dist/css/select2.min.css': [
        +            'src/scss/core.scss',
        +            'src/scss/theme/default/layout.css'
        +          ]
        +        }
        +      },
        +      dev: {
        +        options: {
        +          outputStyle: 'nested'
        +        },
        +        files: {
        +          'dist/css/select2.css': [
        +            'src/scss/core.scss',
        +            'src/scss/theme/default/layout.css'
        +          ]
        +        }
        +      }
        +    },
        +
        +    symlink: {
        +      docs: {
        +        cwd: 'dist',
        +        expand: true,
        +        overwrite: false,
        +        src: [
        +          '*'
        +        ],
        +        dest: 'docs/dist',
        +        filter: 'isDirectory'
        +      }
        +    },
        +
        +    requirejs: {
        +      'dist': {
        +        options: {
        +          baseUrl: 'src/js',
        +          optimize: 'none',
        +          name: 'select2/core',
        +          out: 'dist/js/select2.js',
        +          include: includes,
        +          namespace: 'S2',
        +          paths: {
        +            'almond': require.resolve('almond').slice(0, -3),
        +            'jquery': 'jquery.shim',
        +            'jquery-mousewheel': 'jquery.mousewheel.shim'
        +          },
        +          wrap: {
        +            startFile: 'src/js/banner.start.js',
        +            endFile: 'src/js/banner.end.js'
        +          }
        +        }
        +      },
        +      'dist.full': {
        +        options: {
        +          baseUrl: 'src/js',
        +          optimize: 'none',
        +          name: 'select2/core',
        +          out: 'dist/js/select2.full.js',
        +          include: fullIncludes,
        +          namespace: 'S2',
        +          paths: {
        +            'almond': require.resolve('almond').slice(0, -3),
        +            'jquery': 'jquery.shim',
        +            'jquery-mousewheel': require.resolve('jquery-mousewheel').slice(0, -3)
        +          },
        +          wrap: {
        +            startFile: 'src/js/banner.start.js',
        +            endFile: 'src/js/banner.end.js'
        +          }
        +        }
        +      },
        +      'i18n': {
        +        options: {
        +          baseUrl: 'src/js/select2/i18n',
        +          dir: 'dist/js/i18n',
        +          paths: i18nPaths,
        +          modules: i18nModules,
        +          namespace: 'S2',
        +          wrap: {
        +            start: minifiedBanner + grunt.file.read('src/js/banner.start.js'),
        +            end: grunt.file.read('src/js/banner.end.js')
        +          }
        +        }
        +      }
        +    },
        +
        +    watch: {
        +      js: {
        +        files: [
        +          'src/js/select2/**/*.js',
        +          'tests/**/*.js'
        +        ],
        +        tasks: [
        +          'compile',
        +          'test',
        +          'minify'
        +        ]
        +      },
        +      css: {
        +        files: [
        +          'src/scss/**/*.scss'
        +        ],
        +        tasks: [
        +          'compile',
        +          'minify'
        +        ]
        +      }
        +    }
        +  });
        +
        +  grunt.loadNpmTasks('grunt-contrib-clean');
        +  grunt.loadNpmTasks('grunt-contrib-concat');
        +  grunt.loadNpmTasks('grunt-contrib-connect');
        +  grunt.loadNpmTasks('grunt-contrib-jshint');
        +  grunt.loadNpmTasks('grunt-contrib-qunit');
        +  grunt.loadNpmTasks('grunt-contrib-requirejs');
        +  grunt.loadNpmTasks('grunt-contrib-symlink');
        +  grunt.loadNpmTasks('grunt-contrib-uglify');
        +  grunt.loadNpmTasks('grunt-contrib-watch');
        +
        +  grunt.loadNpmTasks('grunt-gh-pages');
        +  grunt.loadNpmTasks('grunt-jekyll');
        +  grunt.loadNpmTasks('grunt-saucelabs');
        +  grunt.loadNpmTasks('grunt-sass');
        +
        +  grunt.registerTask('default', ['compile', 'test', 'minify']);
        +
        +  grunt.registerTask('compile', [
        +    'requirejs:dist', 'requirejs:dist.full', 'requirejs:i18n',
        +    'concat:dist', 'concat:dist.full',
        +    'sass:dev'
        +  ]);
        +  grunt.registerTask('minify', ['uglify', 'sass:dist']);
        +  grunt.registerTask('test', ['connect:tests', 'qunit', 'jshint']);
        +
        +  var ciTasks = [];
        +
        +  ciTasks.push('compile')
        +  ciTasks.push('connect:tests');
        +
        +  // Can't run Sauce Labs tests in pull requests
        +  if (process.env.TRAVIS_PULL_REQUEST == 'false') {
        +    ciTasks.push('saucelabs-qunit');
        +  }
        +
        +  ciTasks.push('qunit');
        +  ciTasks.push('jshint');
        +
        +  grunt.registerTask('ci', ciTasks);
        +
        +  grunt.registerTask('docs', ['symlink:docs', 'jekyll:serve']);
        +
        +  grunt.registerTask('docs-release', ['default', 'clean:docs', 'gh-pages']);
        +};
        diff --git a/bower_components/select2/ISSUE_TEMPLATE.md b/bower_components/select2/ISSUE_TEMPLATE.md
        new file mode 100644
        index 0000000000..42223285eb
        --- /dev/null
        +++ b/bower_components/select2/ISSUE_TEMPLATE.md
        @@ -0,0 +1,46 @@
        +## Prerequisites
        +
        +- [ ] I have searched for similar issues in both open and closed tickets and cannot find a duplicate
        +- [ ] The issue still exists against the latest `master` branch of Select2
        +- [ ] This is not a usage question (Those should be directed to the [community](https://select2.github.io/community.html))
        +- [ ] I have attempted to find the simplest possible steos to reproduce the issue
        +- [ ] I have included a failing test as a pull request (Optional)
        +
        +## Steps to reproduce the issue
        +
        +1.
        +2.
        +3.
        +
        +## Expected behavior and actual behavior
        +
        +When I follow those steps, I see...
        +
        +I was expecting...
        +
        +## Environment
        +
        +Browsers
        +
        +- [ ] Google Chrome
        +- [ ] Mozilla Firefox
        +- [ ] Internet Explorer
        +
        +Operating System
        +
        +- [ ] Windows
        +- [ ] Mac OS X
        +- [ ] Linux
        +- [ ] Mobile
        +
        +Libraries
        +
        +- jQuery version:
        +- Select2 version:
        +
        +## Isolating the problem
        +
        +- [ ] This bug happens [on the examples page](https://select2.github.io/examples.html)
        +- [ ] The bug happens consistently across all tested browsers
        +- [ ] This bug happens when using Select2 without other pluigns
        +- [ ] I can reproduce this bug in [a jsbin](https://jsbin.com/)
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/License.txt b/bower_components/select2/LICENSE.md
        old mode 100755
        new mode 100644
        similarity index 91%
        rename from resources/assets/js/plugins/datatables/extensions/Responsive/License.txt
        rename to bower_components/select2/LICENSE.md
        index c0ee1c0245..86c7c291a9
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/License.txt
        +++ b/bower_components/select2/LICENSE.md
        @@ -1,5 +1,6 @@
        -Copyright (c) 2014-2015 SpryMedia Limited
        -http://datatables.net
        +The MIT License (MIT)
        +
        +Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors
         
         Permission is hereby granted, free of charge, to any person obtaining a copy
         of this software and associated documentation files (the "Software"), to deal
        diff --git a/bower_components/select2/PULL_REQUEST_TEMPLATE.md b/bower_components/select2/PULL_REQUEST_TEMPLATE.md
        new file mode 100644
        index 0000000000..82395c757b
        --- /dev/null
        +++ b/bower_components/select2/PULL_REQUEST_TEMPLATE.md
        @@ -0,0 +1,13 @@
        +This pull request includes a
        +
        +- [ ] Bug fix
        +- [ ] New feature
        +- [ ] Translation
        +
        +The following changes were made
        +
        +-
        +-
        +-
        +
        +If this is related to an existing ticket, include a link to it as well.
        diff --git a/bower_components/select2/README.md b/bower_components/select2/README.md
        new file mode 100644
        index 0000000000..5984bb2484
        --- /dev/null
        +++ b/bower_components/select2/README.md
        @@ -0,0 +1,121 @@
        +Select2
        +=======
        +[![Build Status][travis-ci-image]][travis-ci-status]
        +
        +Select2 is a jQuery-based replacement for select boxes. It supports searching,
        +remote data sets, and pagination of results.
        +
        +To get started, checkout examples and documentation at
        +https://select2.github.io/
        +
        +Use cases
        +---------
        +* Enhancing native selects with search.
        +* Enhancing native selects with a better multi-select interface.
        +* Loading data from JavaScript: easily load items via AJAX and have them
        +  searchable.
        +* Nesting optgroups: native selects only support one level of nesting. Select2
        +  does not have this restriction.
        +* Tagging: ability to add new items on the fly.
        +* Working with large, remote datasets: ability to partially load a dataset based
        +  on the search term.
        +* Paging of large datasets: easy support for loading more pages when the results
        +  are scrolled to the end.
        +* Templating: support for custom rendering of results and selections.
        +
        +Browser compatibility
        +---------------------
        +* IE 8+
        +* Chrome 8+
        +* Firefox 10+
        +* Safari 3+
        +* Opera 10.6+
        +
        +Select2 is automatically tested on the following browsers.
        +
        +[![Sauce Labs Test Status][saucelabs-matrix]][saucelabs-status]
        +
        +Usage
        +-----
        +You can source Select2 directly from a CDN like [JSDliver][jsdelivr] or
        +[CDNJS][cdnjs], [download it from this GitHub repo][releases], or use one of
        +the integrations below.
        +
        +Integrations
        +------------
        +Third party developers have create plugins for platforms which allow Select2 to be integrated more natively and quickly. For many platforms, additional plugins are not required because Select2 acts as a standard `<select>` box.
        +
        +Plugins
        +
        +* [Django]
        +  - [django-easy-select2]
        +  - [django-select2]
        +* [Meteor] - [meteor-select2]
        +* [Ruby on Rails][ruby-on-rails] - [select2-rails]
        +* [Wicket] - [wicketstuff-select2]
        +* [Yii 2][yii2] - [yii2-widget-select2]
        +
        +Themes
        +
        +- [Bootstrap 3][bootstrap3] - [select2-bootstrap-theme]
        +- [Flat UI][flat-ui] - [select2-flat-theme]
        +- [Metro UI][metro-ui] - [select2-metro]
        +
        +Missing an integration? Modify this `README` and make a pull request back here to Select2 on GitHub.
        +
        +Internationalization (i18n)
        +---------------------------
        +Select2 supports multiple languages by simply including the right language JS
        +file (`dist/js/i18n/it.js`, `dist/js/i18n/nl.js`, etc.) after
        +`dist/js/select2.js`.
        +
        +Missing a language? Just copy `src/js/select2/i18n/en.js`, translate it, and
        +make a pull request back to Select2 here on GitHub.
        +
        +Documentation
        +-------------
        +The documentation for Select2 is available
        +[through GitHub Pages][documentation] and is located within this repository
        +in the [`docs` folder][documentation-folder].
        +
        +Community
        +---------
        +You can find out about the different ways to get in touch with the Select2
        +community at the [Select2 community page][community].
        +
        +Copyright and license
        +---------------------
        +The license is available within the repository in the [LICENSE][license] file.
        +
        +[cdnjs]: http://www.cdnjs.com/libraries/select2
        +[community]: https://select2.github.io/community.html
        +[documentation]: https://select2.github.io/
        +[documentation-folder]: https://github.com/select2/select2/tree/master/docs
        +[freenode]: https://freenode.net/
        +[jsdelivr]: http://www.jsdelivr.com/#!select2
        +[license]: LICENSE.md
        +[releases]: https://github.com/select2/select2/releases
        +[saucelabs-matrix]: https://saucelabs.com/browser-matrix/select2.svg
        +[saucelabs-status]: https://saucelabs.com/u/select2
        +[travis-ci-image]: https://img.shields.io/travis/select2/select2/master.svg
        +[travis-ci-status]: https://travis-ci.org/select2/select2
        +
        +[bootstrap3]: https://getbootstrap.com/
        +[django]: https://www.djangoproject.com/
        +[django-easy-select2]: https://github.com/asyncee/django-easy-select2
        +[django-select2]: https://github.com/applegrew/django-select2
        +[flat-ui]: http://designmodo.github.io/Flat-UI/
        +[meteor]: https://www.meteor.com/
        +[meteor-select2]: https://github.com/nate-strauser/meteor-select2
        +[metro-ui]: http://metroui.org.ua/
        +[select2-metro]: http://metroui.org.ua/select2.html
        +[ruby-on-rails]: http://rubyonrails.org/
        +[select2-bootstrap-theme]: https://github.com/select2/select2-bootstrap-theme
        +[select2-flat-theme]: https://github.com/techhysahil/select2-Flat_Theme
        +[select2-rails]: https://github.com/argerim/select2-rails
        +[vue.js]: http://vuejs.org/
        +[select2-vue]: http://vuejs.org/examples/select2.html
        +[wicket]: https://wicket.apache.org/
        +[wicketstuff-select2]: https://github.com/wicketstuff/core/tree/master/select2-parent
        +[yii2]: http://www.yiiframework.com/
        +[yii2-widget-select2]: https://github.com/kartik-v/yii2-widget-select2
        diff --git a/bower_components/select2/bower.json b/bower_components/select2/bower.json
        new file mode 100644
        index 0000000000..834e4957b0
        --- /dev/null
        +++ b/bower_components/select2/bower.json
        @@ -0,0 +1,12 @@
        +{
        +    "name": "select2",
        +    "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
        +    "main": [
        +        "dist/js/select2.js",
        +        "src/scss/core.scss"
        +    ],
        +    "repository": {
        +        "type": "git",
        +        "url": "git@github.com:select2/select2.git"
        +    }
        +}
        diff --git a/bower_components/select2/component.json b/bower_components/select2/component.json
        new file mode 100644
        index 0000000000..cacb935af9
        --- /dev/null
        +++ b/bower_components/select2/component.json
        @@ -0,0 +1,19 @@
        +{
        +  "name": "select2",
        +  "repo": "select/select2",
        +  "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
        +  "version": "4.0.3",
        +  "demo": "https://select2.github.io/",
        +  "keywords": [
        +    "jquery"
        +  ],
        +  "main": "dist/js/select2.js",
        +  "styles": [
        +    "dist/css/select2.css"
        +  ],
        +  "scripts": [
        +    "dist/js/select2.js",
        +    "dist/js/i18n/*.js"
        +  ],
        +  "license": "MIT"
        +}
        diff --git a/bower_components/select2/composer.json b/bower_components/select2/composer.json
        new file mode 100644
        index 0000000000..e03d5df4e4
        --- /dev/null
        +++ b/bower_components/select2/composer.json
        @@ -0,0 +1,25 @@
        +{
        +  "name": "select2/select2",
        +  "description": "Select2 is a jQuery based replacement for select boxes.",
        +  "type": "component",
        +  "homepage": "https://select2.github.io/",
        +  "license": "MIT",
        +  "require": {
        +    "robloach/component-installer": "*"
        +  },
        +  "extra": {
        +    "component": {
        +      "scripts": [
        +        "dist/js/select2.js"
        +      ],
        +      "styles": [
        +        "dist/css/select2.css"
        +      ],
        +      "files": [
        +        "dist/js/select2.js",
        +        "dist/js/i18n/*.js",
        +        "dist/css/select2.css"
        +      ]
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/dist/css/select2.css b/bower_components/select2/dist/css/select2.css
        new file mode 100644
        index 0000000000..447b2b86cc
        --- /dev/null
        +++ b/bower_components/select2/dist/css/select2.css
        @@ -0,0 +1,484 @@
        +.select2-container {
        +  box-sizing: border-box;
        +  display: inline-block;
        +  margin: 0;
        +  position: relative;
        +  vertical-align: middle; }
        +  .select2-container .select2-selection--single {
        +    box-sizing: border-box;
        +    cursor: pointer;
        +    display: block;
        +    height: 28px;
        +    user-select: none;
        +    -webkit-user-select: none; }
        +    .select2-container .select2-selection--single .select2-selection__rendered {
        +      display: block;
        +      padding-left: 8px;
        +      padding-right: 20px;
        +      overflow: hidden;
        +      text-overflow: ellipsis;
        +      white-space: nowrap; }
        +    .select2-container .select2-selection--single .select2-selection__clear {
        +      position: relative; }
        +  .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
        +    padding-right: 8px;
        +    padding-left: 20px; }
        +  .select2-container .select2-selection--multiple {
        +    box-sizing: border-box;
        +    cursor: pointer;
        +    display: block;
        +    min-height: 32px;
        +    user-select: none;
        +    -webkit-user-select: none; }
        +    .select2-container .select2-selection--multiple .select2-selection__rendered {
        +      display: inline-block;
        +      overflow: hidden;
        +      padding-left: 8px;
        +      text-overflow: ellipsis;
        +      white-space: nowrap; }
        +  .select2-container .select2-search--inline {
        +    float: left; }
        +    .select2-container .select2-search--inline .select2-search__field {
        +      box-sizing: border-box;
        +      border: none;
        +      font-size: 100%;
        +      margin-top: 5px;
        +      padding: 0; }
        +      .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
        +        -webkit-appearance: none; }
        +
        +.select2-dropdown {
        +  background-color: white;
        +  border: 1px solid #aaa;
        +  border-radius: 4px;
        +  box-sizing: border-box;
        +  display: block;
        +  position: absolute;
        +  left: -100000px;
        +  width: 100%;
        +  z-index: 1051; }
        +
        +.select2-results {
        +  display: block; }
        +
        +.select2-results__options {
        +  list-style: none;
        +  margin: 0;
        +  padding: 0; }
        +
        +.select2-results__option {
        +  padding: 6px;
        +  user-select: none;
        +  -webkit-user-select: none; }
        +  .select2-results__option[aria-selected] {
        +    cursor: pointer; }
        +
        +.select2-container--open .select2-dropdown {
        +  left: 0; }
        +
        +.select2-container--open .select2-dropdown--above {
        +  border-bottom: none;
        +  border-bottom-left-radius: 0;
        +  border-bottom-right-radius: 0; }
        +
        +.select2-container--open .select2-dropdown--below {
        +  border-top: none;
        +  border-top-left-radius: 0;
        +  border-top-right-radius: 0; }
        +
        +.select2-search--dropdown {
        +  display: block;
        +  padding: 4px; }
        +  .select2-search--dropdown .select2-search__field {
        +    padding: 4px;
        +    width: 100%;
        +    box-sizing: border-box; }
        +    .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
        +      -webkit-appearance: none; }
        +  .select2-search--dropdown.select2-search--hide {
        +    display: none; }
        +
        +.select2-close-mask {
        +  border: 0;
        +  margin: 0;
        +  padding: 0;
        +  display: block;
        +  position: fixed;
        +  left: 0;
        +  top: 0;
        +  min-height: 100%;
        +  min-width: 100%;
        +  height: auto;
        +  width: auto;
        +  opacity: 0;
        +  z-index: 99;
        +  background-color: #fff;
        +  filter: alpha(opacity=0); }
        +
        +.select2-hidden-accessible {
        +  border: 0 !important;
        +  clip: rect(0 0 0 0) !important;
        +  height: 1px !important;
        +  margin: -1px !important;
        +  overflow: hidden !important;
        +  padding: 0 !important;
        +  position: absolute !important;
        +  width: 1px !important; }
        +
        +.select2-container--default .select2-selection--single {
        +  background-color: #fff;
        +  border: 1px solid #aaa;
        +  border-radius: 4px; }
        +  .select2-container--default .select2-selection--single .select2-selection__rendered {
        +    color: #444;
        +    line-height: 28px; }
        +  .select2-container--default .select2-selection--single .select2-selection__clear {
        +    cursor: pointer;
        +    float: right;
        +    font-weight: bold; }
        +  .select2-container--default .select2-selection--single .select2-selection__placeholder {
        +    color: #999; }
        +  .select2-container--default .select2-selection--single .select2-selection__arrow {
        +    height: 26px;
        +    position: absolute;
        +    top: 1px;
        +    right: 1px;
        +    width: 20px; }
        +    .select2-container--default .select2-selection--single .select2-selection__arrow b {
        +      border-color: #888 transparent transparent transparent;
        +      border-style: solid;
        +      border-width: 5px 4px 0 4px;
        +      height: 0;
        +      left: 50%;
        +      margin-left: -4px;
        +      margin-top: -2px;
        +      position: absolute;
        +      top: 50%;
        +      width: 0; }
        +
        +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
        +  float: left; }
        +
        +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
        +  left: 1px;
        +  right: auto; }
        +
        +.select2-container--default.select2-container--disabled .select2-selection--single {
        +  background-color: #eee;
        +  cursor: default; }
        +  .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
        +    display: none; }
        +
        +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
        +  border-color: transparent transparent #888 transparent;
        +  border-width: 0 4px 5px 4px; }
        +
        +.select2-container--default .select2-selection--multiple {
        +  background-color: white;
        +  border: 1px solid #aaa;
        +  border-radius: 4px;
        +  cursor: text; }
        +  .select2-container--default .select2-selection--multiple .select2-selection__rendered {
        +    box-sizing: border-box;
        +    list-style: none;
        +    margin: 0;
        +    padding: 0 5px;
        +    width: 100%; }
        +    .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
        +      list-style: none; }
        +  .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
        +    color: #999;
        +    margin-top: 5px;
        +    float: left; }
        +  .select2-container--default .select2-selection--multiple .select2-selection__clear {
        +    cursor: pointer;
        +    float: right;
        +    font-weight: bold;
        +    margin-top: 5px;
        +    margin-right: 10px; }
        +  .select2-container--default .select2-selection--multiple .select2-selection__choice {
        +    background-color: #e4e4e4;
        +    border: 1px solid #aaa;
        +    border-radius: 4px;
        +    cursor: default;
        +    float: left;
        +    margin-right: 5px;
        +    margin-top: 5px;
        +    padding: 0 5px; }
        +  .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
        +    color: #999;
        +    cursor: pointer;
        +    display: inline-block;
        +    font-weight: bold;
        +    margin-right: 2px; }
        +    .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
        +      color: #333; }
        +
        +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
        +  float: right; }
        +
        +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
        +  margin-left: 5px;
        +  margin-right: auto; }
        +
        +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
        +  margin-left: 2px;
        +  margin-right: auto; }
        +
        +.select2-container--default.select2-container--focus .select2-selection--multiple {
        +  border: solid black 1px;
        +  outline: 0; }
        +
        +.select2-container--default.select2-container--disabled .select2-selection--multiple {
        +  background-color: #eee;
        +  cursor: default; }
        +
        +.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
        +  display: none; }
        +
        +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
        +  border-top-left-radius: 0;
        +  border-top-right-radius: 0; }
        +
        +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
        +  border-bottom-left-radius: 0;
        +  border-bottom-right-radius: 0; }
        +
        +.select2-container--default .select2-search--dropdown .select2-search__field {
        +  border: 1px solid #aaa; }
        +
        +.select2-container--default .select2-search--inline .select2-search__field {
        +  background: transparent;
        +  border: none;
        +  outline: 0;
        +  box-shadow: none;
        +  -webkit-appearance: textfield; }
        +
        +.select2-container--default .select2-results > .select2-results__options {
        +  max-height: 200px;
        +  overflow-y: auto; }
        +
        +.select2-container--default .select2-results__option[role=group] {
        +  padding: 0; }
        +
        +.select2-container--default .select2-results__option[aria-disabled=true] {
        +  color: #999; }
        +
        +.select2-container--default .select2-results__option[aria-selected=true] {
        +  background-color: #ddd; }
        +
        +.select2-container--default .select2-results__option .select2-results__option {
        +  padding-left: 1em; }
        +  .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
        +    padding-left: 0; }
        +  .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
        +    margin-left: -1em;
        +    padding-left: 2em; }
        +    .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
        +      margin-left: -2em;
        +      padding-left: 3em; }
        +      .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
        +        margin-left: -3em;
        +        padding-left: 4em; }
        +        .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
        +          margin-left: -4em;
        +          padding-left: 5em; }
        +          .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
        +            margin-left: -5em;
        +            padding-left: 6em; }
        +
        +.select2-container--default .select2-results__option--highlighted[aria-selected] {
        +  background-color: #5897fb;
        +  color: white; }
        +
        +.select2-container--default .select2-results__group {
        +  cursor: default;
        +  display: block;
        +  padding: 6px; }
        +
        +.select2-container--classic .select2-selection--single {
        +  background-color: #f7f7f7;
        +  border: 1px solid #aaa;
        +  border-radius: 4px;
        +  outline: 0;
        +  background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
        +  background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
        +  background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
        +  background-repeat: repeat-x;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
        +  .select2-container--classic .select2-selection--single:focus {
        +    border: 1px solid #5897fb; }
        +  .select2-container--classic .select2-selection--single .select2-selection__rendered {
        +    color: #444;
        +    line-height: 28px; }
        +  .select2-container--classic .select2-selection--single .select2-selection__clear {
        +    cursor: pointer;
        +    float: right;
        +    font-weight: bold;
        +    margin-right: 10px; }
        +  .select2-container--classic .select2-selection--single .select2-selection__placeholder {
        +    color: #999; }
        +  .select2-container--classic .select2-selection--single .select2-selection__arrow {
        +    background-color: #ddd;
        +    border: none;
        +    border-left: 1px solid #aaa;
        +    border-top-right-radius: 4px;
        +    border-bottom-right-radius: 4px;
        +    height: 26px;
        +    position: absolute;
        +    top: 1px;
        +    right: 1px;
        +    width: 20px;
        +    background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
        +    background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
        +    background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
        +    background-repeat: repeat-x;
        +    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
        +    .select2-container--classic .select2-selection--single .select2-selection__arrow b {
        +      border-color: #888 transparent transparent transparent;
        +      border-style: solid;
        +      border-width: 5px 4px 0 4px;
        +      height: 0;
        +      left: 50%;
        +      margin-left: -4px;
        +      margin-top: -2px;
        +      position: absolute;
        +      top: 50%;
        +      width: 0; }
        +
        +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
        +  float: left; }
        +
        +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
        +  border: none;
        +  border-right: 1px solid #aaa;
        +  border-radius: 0;
        +  border-top-left-radius: 4px;
        +  border-bottom-left-radius: 4px;
        +  left: 1px;
        +  right: auto; }
        +
        +.select2-container--classic.select2-container--open .select2-selection--single {
        +  border: 1px solid #5897fb; }
        +  .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
        +    background: transparent;
        +    border: none; }
        +    .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
        +      border-color: transparent transparent #888 transparent;
        +      border-width: 0 4px 5px 4px; }
        +
        +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
        +  border-top: none;
        +  border-top-left-radius: 0;
        +  border-top-right-radius: 0;
        +  background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
        +  background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
        +  background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
        +  background-repeat: repeat-x;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
        +
        +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
        +  border-bottom: none;
        +  border-bottom-left-radius: 0;
        +  border-bottom-right-radius: 0;
        +  background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
        +  background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
        +  background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
        +  background-repeat: repeat-x;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
        +
        +.select2-container--classic .select2-selection--multiple {
        +  background-color: white;
        +  border: 1px solid #aaa;
        +  border-radius: 4px;
        +  cursor: text;
        +  outline: 0; }
        +  .select2-container--classic .select2-selection--multiple:focus {
        +    border: 1px solid #5897fb; }
        +  .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
        +    list-style: none;
        +    margin: 0;
        +    padding: 0 5px; }
        +  .select2-container--classic .select2-selection--multiple .select2-selection__clear {
        +    display: none; }
        +  .select2-container--classic .select2-selection--multiple .select2-selection__choice {
        +    background-color: #e4e4e4;
        +    border: 1px solid #aaa;
        +    border-radius: 4px;
        +    cursor: default;
        +    float: left;
        +    margin-right: 5px;
        +    margin-top: 5px;
        +    padding: 0 5px; }
        +  .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
        +    color: #888;
        +    cursor: pointer;
        +    display: inline-block;
        +    font-weight: bold;
        +    margin-right: 2px; }
        +    .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
        +      color: #555; }
        +
        +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
        +  float: right; }
        +
        +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
        +  margin-left: 5px;
        +  margin-right: auto; }
        +
        +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
        +  margin-left: 2px;
        +  margin-right: auto; }
        +
        +.select2-container--classic.select2-container--open .select2-selection--multiple {
        +  border: 1px solid #5897fb; }
        +
        +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
        +  border-top: none;
        +  border-top-left-radius: 0;
        +  border-top-right-radius: 0; }
        +
        +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
        +  border-bottom: none;
        +  border-bottom-left-radius: 0;
        +  border-bottom-right-radius: 0; }
        +
        +.select2-container--classic .select2-search--dropdown .select2-search__field {
        +  border: 1px solid #aaa;
        +  outline: 0; }
        +
        +.select2-container--classic .select2-search--inline .select2-search__field {
        +  outline: 0;
        +  box-shadow: none; }
        +
        +.select2-container--classic .select2-dropdown {
        +  background-color: white;
        +  border: 1px solid transparent; }
        +
        +.select2-container--classic .select2-dropdown--above {
        +  border-bottom: none; }
        +
        +.select2-container--classic .select2-dropdown--below {
        +  border-top: none; }
        +
        +.select2-container--classic .select2-results > .select2-results__options {
        +  max-height: 200px;
        +  overflow-y: auto; }
        +
        +.select2-container--classic .select2-results__option[role=group] {
        +  padding: 0; }
        +
        +.select2-container--classic .select2-results__option[aria-disabled=true] {
        +  color: grey; }
        +
        +.select2-container--classic .select2-results__option--highlighted[aria-selected] {
        +  background-color: #3875d7;
        +  color: white; }
        +
        +.select2-container--classic .select2-results__group {
        +  cursor: default;
        +  display: block;
        +  padding: 6px; }
        +
        +.select2-container--classic.select2-container--open .select2-dropdown {
        +  border-color: #5897fb; }
        diff --git a/bower_components/select2/dist/css/select2.min.css b/bower_components/select2/dist/css/select2.min.css
        new file mode 100644
        index 0000000000..76de04d923
        --- /dev/null
        +++ b/bower_components/select2/dist/css/select2.min.css
        @@ -0,0 +1 @@
        +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
        diff --git a/bower_components/select2/dist/js/i18n/ar.js b/bower_components/select2/dist/js/i18n/ar.js
        new file mode 100644
        index 0000000000..01a6882948
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/ar.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="الرجاء حذف "+t+" عناصر";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="الرجاء إضافة "+t+" عناصر";return n},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){var t="تستطيع إختيار "+e.maximum+" بنود فقط";return t},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/az.js b/bower_components/select2/dist/js/i18n/az.js
        new file mode 100644
        index 0000000000..2accb973f6
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/az.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/bg.js b/bower_components/select2/dist/js/i18n/bg.js
        new file mode 100644
        index 0000000000..35ae989447
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/bg.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/ca.js b/bower_components/select2/dist/js/i18n/ca.js
        new file mode 100644
        index 0000000000..fdb5f3d2a5
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/ca.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/cs.js b/bower_components/select2/dist/js/i18n/cs.js
        new file mode 100644
        index 0000000000..9651378a60
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/cs.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/da.js b/bower_components/select2/dist/js/i18n/da.js
        new file mode 100644
        index 0000000000..501c51e933
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/da.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/de.js b/bower_components/select2/dist/js/i18n/de.js
        new file mode 100644
        index 0000000000..9a6d55366f
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/de.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/el.js b/bower_components/select2/dist/js/i18n/el.js
        new file mode 100644
        index 0000000000..4735d14052
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/el.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/en.js b/bower_components/select2/dist/js/i18n/en.js
        new file mode 100644
        index 0000000000..8e80ede8db
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/en.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/es.js b/bower_components/select2/dist/js/i18n/es.js
        new file mode 100644
        index 0000000000..0a096502da
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/es.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/et.js b/bower_components/select2/dist/js/i18n/et.js
        new file mode 100644
        index 0000000000..c70f4a5b31
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/et.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/eu.js b/bower_components/select2/dist/js/i18n/eu.js
        new file mode 100644
        index 0000000000..9336053a7d
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/eu.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/fa.js b/bower_components/select2/dist/js/i18n/fa.js
        new file mode 100644
        index 0000000000..5118cd28f8
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/fa.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/fi.js b/bower_components/select2/dist/js/i18n/fi.js
        new file mode 100644
        index 0000000000..9e60f26a05
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/fi.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/fr.js b/bower_components/select2/dist/js/i18n/fr.js
        new file mode 100644
        index 0000000000..e4a6650097
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/fr.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/gl.js b/bower_components/select2/dist/js/i18n/gl.js
        new file mode 100644
        index 0000000000..02f258f928
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/gl.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/he.js b/bower_components/select2/dist/js/i18n/he.js
        new file mode 100644
        index 0000000000..881f8d389f
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/he.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/hi.js b/bower_components/select2/dist/js/i18n/hi.js
        new file mode 100644
        index 0000000000..e829684268
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/hi.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/hr.js b/bower_components/select2/dist/js/i18n/hr.js
        new file mode 100644
        index 0000000000..89f7b12bff
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/hr.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/hu.js b/bower_components/select2/dist/js/i18n/hu.js
        new file mode 100644
        index 0000000000..74c8a90dec
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/hu.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/id.js b/bower_components/select2/dist/js/i18n/id.js
        new file mode 100644
        index 0000000000..9586782618
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/id.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/is.js b/bower_components/select2/dist/js/i18n/is.js
        new file mode 100644
        index 0000000000..ab97a14d18
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/is.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/it.js b/bower_components/select2/dist/js/i18n/it.js
        new file mode 100644
        index 0000000000..7796b9f76a
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/it.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/ja.js b/bower_components/select2/dist/js/i18n/ja.js
        new file mode 100644
        index 0000000000..9f4fff6cb2
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/ja.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/km.js b/bower_components/select2/dist/js/i18n/km.js
        new file mode 100644
        index 0000000000..8e94adcf3a
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/km.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ  "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/ko.js b/bower_components/select2/dist/js/i18n/ko.js
        new file mode 100644
        index 0000000000..4ed03215fc
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/ko.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/lt.js b/bower_components/select2/dist/js/i18n/lt.js
        new file mode 100644
        index 0000000000..05f3a6e5eb
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/lt.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/lv.js b/bower_components/select2/dist/js/i18n/lv.js
        new file mode 100644
        index 0000000000..df8ee94232
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/lv.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par  "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/mk.js b/bower_components/select2/dist/js/i18n/mk.js
        new file mode 100644
        index 0000000000..319ecca14b
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/mk.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/ms.js b/bower_components/select2/dist/js/i18n/ms.js
        new file mode 100644
        index 0000000000..4258f125b5
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/ms.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/nb.js b/bower_components/select2/dist/js/i18n/nb.js
        new file mode 100644
        index 0000000000..6770087cee
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/nb.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/nl.js b/bower_components/select2/dist/js/i18n/nl.js
        new file mode 100644
        index 0000000000..8bd5e3cf43
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/nl.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/pl.js b/bower_components/select2/dist/js/i18n/pl.js
        new file mode 100644
        index 0000000000..54ba28e9ba
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/pl.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/pt-BR.js b/bower_components/select2/dist/js/i18n/pt-BR.js
        new file mode 100644
        index 0000000000..a6629c8aec
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/pt-BR.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/pt.js b/bower_components/select2/dist/js/i18n/pt.js
        new file mode 100644
        index 0000000000..0cbda561b9
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/pt.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/ro.js b/bower_components/select2/dist/js/i18n/ro.js
        new file mode 100644
        index 0000000000..788a26376a
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/ro.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/ru.js b/bower_components/select2/dist/js/i18n/ru.js
        new file mode 100644
        index 0000000000..9ecab80911
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/ru.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/sk.js b/bower_components/select2/dist/js/i18n/sk.js
        new file mode 100644
        index 0000000000..82f294138a
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/sk.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/sr-Cyrl.js b/bower_components/select2/dist/js/i18n/sr-Cyrl.js
        new file mode 100644
        index 0000000000..e9453940cc
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/sr-Cyrl.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/sr.js b/bower_components/select2/dist/js/i18n/sr.js
        new file mode 100644
        index 0000000000..ac0cc721fd
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/sr.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/sv.js b/bower_components/select2/dist/js/i18n/sv.js
        new file mode 100644
        index 0000000000..bedac08c47
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/sv.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/th.js b/bower_components/select2/dist/js/i18n/th.js
        new file mode 100644
        index 0000000000..097a86c699
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/th.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/tr.js b/bower_components/select2/dist/js/i18n/tr.js
        new file mode 100644
        index 0000000000..25d27a877f
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/tr.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/uk.js b/bower_components/select2/dist/js/i18n/uk.js
        new file mode 100644
        index 0000000000..eb3ca89031
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/uk.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/vi.js b/bower_components/select2/dist/js/i18n/vi.js
        new file mode 100644
        index 0000000000..8975b8ac6e
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/vi.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/zh-CN.js b/bower_components/select2/dist/js/i18n/zh-CN.js
        new file mode 100644
        index 0000000000..2ed959723d
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/zh-CN.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/i18n/zh-TW.js b/bower_components/select2/dist/js/i18n/zh-TW.js
        new file mode 100644
        index 0000000000..ea0812ee0d
        --- /dev/null
        +++ b/bower_components/select2/dist/js/i18n/zh-TW.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
        +
        +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/select2.full.js b/bower_components/select2/dist/js/select2.full.js
        new file mode 100644
        index 0000000000..e750834ef5
        --- /dev/null
        +++ b/bower_components/select2/dist/js/select2.full.js
        @@ -0,0 +1,6436 @@
        +/*!
        + * Select2 4.0.3
        + * https://select2.github.io
        + *
        + * Released under the MIT license
        + * https://github.com/select2/select2/blob/master/LICENSE.md
        + */
        +(function (factory) {
        +  if (typeof define === 'function' && define.amd) {
        +    // AMD. Register as an anonymous module.
        +    define(['jquery'], factory);
        +  } else if (typeof exports === 'object') {
        +    // Node/CommonJS
        +    factory(require('jquery'));
        +  } else {
        +    // Browser globals
        +    factory(jQuery);
        +  }
        +}(function (jQuery) {
        +  // This is needed so we can catch the AMD loader configuration and use it
        +  // The inner file should be wrapped (by `banner.start.js`) in a function that
        +  // returns the AMD loader references.
        +  var S2 =
        +(function () {
        +  // Restore the Select2 AMD loader so it can be used
        +  // Needed mostly in the language files, where the loader is not inserted
        +  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
        +    var S2 = jQuery.fn.select2.amd;
        +  }
        +var S2;(function () { if (!S2 || !S2.requirejs) {
        +if (!S2) { S2 = {}; } else { require = S2; }
        +/**
        + * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
        + * Available via the MIT or new BSD license.
        + * see: http://github.com/jrburke/almond for details
        + */
        +//Going sloppy to avoid 'use strict' string cost, but strict practices should
        +//be followed.
        +/*jslint sloppy: true */
        +/*global setTimeout: false */
        +
        +var requirejs, require, define;
        +(function (undef) {
        +    var main, req, makeMap, handlers,
        +        defined = {},
        +        waiting = {},
        +        config = {},
        +        defining = {},
        +        hasOwn = Object.prototype.hasOwnProperty,
        +        aps = [].slice,
        +        jsSuffixRegExp = /\.js$/;
        +
        +    function hasProp(obj, prop) {
        +        return hasOwn.call(obj, prop);
        +    }
        +
        +    /**
        +     * Given a relative module name, like ./something, normalize it to
        +     * a real name that can be mapped to a path.
        +     * @param {String} name the relative name
        +     * @param {String} baseName a real name that the name arg is relative
        +     * to.
        +     * @returns {String} normalized name
        +     */
        +    function normalize(name, baseName) {
        +        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
        +            foundI, foundStarMap, starI, i, j, part,
        +            baseParts = baseName && baseName.split("/"),
        +            map = config.map,
        +            starMap = (map && map['*']) || {};
        +
        +        //Adjust any relative paths.
        +        if (name && name.charAt(0) === ".") {
        +            //If have a base name, try to normalize against it,
        +            //otherwise, assume it is a top-level require that will
        +            //be relative to baseUrl in the end.
        +            if (baseName) {
        +                name = name.split('/');
        +                lastIndex = name.length - 1;
        +
        +                // Node .js allowance:
        +                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
        +                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
        +                }
        +
        +                //Lop off the last part of baseParts, so that . matches the
        +                //"directory" and not name of the baseName's module. For instance,
        +                //baseName of "one/two/three", maps to "one/two/three.js", but we
        +                //want the directory, "one/two" for this normalization.
        +                name = baseParts.slice(0, baseParts.length - 1).concat(name);
        +
        +                //start trimDots
        +                for (i = 0; i < name.length; i += 1) {
        +                    part = name[i];
        +                    if (part === ".") {
        +                        name.splice(i, 1);
        +                        i -= 1;
        +                    } else if (part === "..") {
        +                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {
        +                            //End of the line. Keep at least one non-dot
        +                            //path segment at the front so it can be mapped
        +                            //correctly to disk. Otherwise, there is likely
        +                            //no path mapping for a path starting with '..'.
        +                            //This can still fail, but catches the most reasonable
        +                            //uses of ..
        +                            break;
        +                        } else if (i > 0) {
        +                            name.splice(i - 1, 2);
        +                            i -= 2;
        +                        }
        +                    }
        +                }
        +                //end trimDots
        +
        +                name = name.join("/");
        +            } else if (name.indexOf('./') === 0) {
        +                // No baseName, so this is ID is resolved relative
        +                // to baseUrl, pull off the leading dot.
        +                name = name.substring(2);
        +            }
        +        }
        +
        +        //Apply map config if available.
        +        if ((baseParts || starMap) && map) {
        +            nameParts = name.split('/');
        +
        +            for (i = nameParts.length; i > 0; i -= 1) {
        +                nameSegment = nameParts.slice(0, i).join("/");
        +
        +                if (baseParts) {
        +                    //Find the longest baseName segment match in the config.
        +                    //So, do joins on the biggest to smallest lengths of baseParts.
        +                    for (j = baseParts.length; j > 0; j -= 1) {
        +                        mapValue = map[baseParts.slice(0, j).join('/')];
        +
        +                        //baseName segment has  config, find if it has one for
        +                        //this name.
        +                        if (mapValue) {
        +                            mapValue = mapValue[nameSegment];
        +                            if (mapValue) {
        +                                //Match, update name to the new value.
        +                                foundMap = mapValue;
        +                                foundI = i;
        +                                break;
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                if (foundMap) {
        +                    break;
        +                }
        +
        +                //Check for a star map match, but just hold on to it,
        +                //if there is a shorter segment match later in a matching
        +                //config, then favor over this star map.
        +                if (!foundStarMap && starMap && starMap[nameSegment]) {
        +                    foundStarMap = starMap[nameSegment];
        +                    starI = i;
        +                }
        +            }
        +
        +            if (!foundMap && foundStarMap) {
        +                foundMap = foundStarMap;
        +                foundI = starI;
        +            }
        +
        +            if (foundMap) {
        +                nameParts.splice(0, foundI, foundMap);
        +                name = nameParts.join('/');
        +            }
        +        }
        +
        +        return name;
        +    }
        +
        +    function makeRequire(relName, forceSync) {
        +        return function () {
        +            //A version of a require function that passes a moduleName
        +            //value for items that may need to
        +            //look up paths relative to the moduleName
        +            var args = aps.call(arguments, 0);
        +
        +            //If first arg is not require('string'), and there is only
        +            //one arg, it is the array form without a callback. Insert
        +            //a null so that the following concat is correct.
        +            if (typeof args[0] !== 'string' && args.length === 1) {
        +                args.push(null);
        +            }
        +            return req.apply(undef, args.concat([relName, forceSync]));
        +        };
        +    }
        +
        +    function makeNormalize(relName) {
        +        return function (name) {
        +            return normalize(name, relName);
        +        };
        +    }
        +
        +    function makeLoad(depName) {
        +        return function (value) {
        +            defined[depName] = value;
        +        };
        +    }
        +
        +    function callDep(name) {
        +        if (hasProp(waiting, name)) {
        +            var args = waiting[name];
        +            delete waiting[name];
        +            defining[name] = true;
        +            main.apply(undef, args);
        +        }
        +
        +        if (!hasProp(defined, name) && !hasProp(defining, name)) {
        +            throw new Error('No ' + name);
        +        }
        +        return defined[name];
        +    }
        +
        +    //Turns a plugin!resource to [plugin, resource]
        +    //with the plugin being undefined if the name
        +    //did not have a plugin prefix.
        +    function splitPrefix(name) {
        +        var prefix,
        +            index = name ? name.indexOf('!') : -1;
        +        if (index > -1) {
        +            prefix = name.substring(0, index);
        +            name = name.substring(index + 1, name.length);
        +        }
        +        return [prefix, name];
        +    }
        +
        +    /**
        +     * Makes a name map, normalizing the name, and using a plugin
        +     * for normalization if necessary. Grabs a ref to plugin
        +     * too, as an optimization.
        +     */
        +    makeMap = function (name, relName) {
        +        var plugin,
        +            parts = splitPrefix(name),
        +            prefix = parts[0];
        +
        +        name = parts[1];
        +
        +        if (prefix) {
        +            prefix = normalize(prefix, relName);
        +            plugin = callDep(prefix);
        +        }
        +
        +        //Normalize according
        +        if (prefix) {
        +            if (plugin && plugin.normalize) {
        +                name = plugin.normalize(name, makeNormalize(relName));
        +            } else {
        +                name = normalize(name, relName);
        +            }
        +        } else {
        +            name = normalize(name, relName);
        +            parts = splitPrefix(name);
        +            prefix = parts[0];
        +            name = parts[1];
        +            if (prefix) {
        +                plugin = callDep(prefix);
        +            }
        +        }
        +
        +        //Using ridiculous property names for space reasons
        +        return {
        +            f: prefix ? prefix + '!' + name : name, //fullName
        +            n: name,
        +            pr: prefix,
        +            p: plugin
        +        };
        +    };
        +
        +    function makeConfig(name) {
        +        return function () {
        +            return (config && config.config && config.config[name]) || {};
        +        };
        +    }
        +
        +    handlers = {
        +        require: function (name) {
        +            return makeRequire(name);
        +        },
        +        exports: function (name) {
        +            var e = defined[name];
        +            if (typeof e !== 'undefined') {
        +                return e;
        +            } else {
        +                return (defined[name] = {});
        +            }
        +        },
        +        module: function (name) {
        +            return {
        +                id: name,
        +                uri: '',
        +                exports: defined[name],
        +                config: makeConfig(name)
        +            };
        +        }
        +    };
        +
        +    main = function (name, deps, callback, relName) {
        +        var cjsModule, depName, ret, map, i,
        +            args = [],
        +            callbackType = typeof callback,
        +            usingExports;
        +
        +        //Use name if no relName
        +        relName = relName || name;
        +
        +        //Call the callback to define the module, if necessary.
        +        if (callbackType === 'undefined' || callbackType === 'function') {
        +            //Pull out the defined dependencies and pass the ordered
        +            //values to the callback.
        +            //Default to [require, exports, module] if no deps
        +            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
        +            for (i = 0; i < deps.length; i += 1) {
        +                map = makeMap(deps[i], relName);
        +                depName = map.f;
        +
        +                //Fast path CommonJS standard dependencies.
        +                if (depName === "require") {
        +                    args[i] = handlers.require(name);
        +                } else if (depName === "exports") {
        +                    //CommonJS module spec 1.1
        +                    args[i] = handlers.exports(name);
        +                    usingExports = true;
        +                } else if (depName === "module") {
        +                    //CommonJS module spec 1.1
        +                    cjsModule = args[i] = handlers.module(name);
        +                } else if (hasProp(defined, depName) ||
        +                           hasProp(waiting, depName) ||
        +                           hasProp(defining, depName)) {
        +                    args[i] = callDep(depName);
        +                } else if (map.p) {
        +                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
        +                    args[i] = defined[depName];
        +                } else {
        +                    throw new Error(name + ' missing ' + depName);
        +                }
        +            }
        +
        +            ret = callback ? callback.apply(defined[name], args) : undefined;
        +
        +            if (name) {
        +                //If setting exports via "module" is in play,
        +                //favor that over return value and exports. After that,
        +                //favor a non-undefined return value over exports use.
        +                if (cjsModule && cjsModule.exports !== undef &&
        +                        cjsModule.exports !== defined[name]) {
        +                    defined[name] = cjsModule.exports;
        +                } else if (ret !== undef || !usingExports) {
        +                    //Use the return value from the function.
        +                    defined[name] = ret;
        +                }
        +            }
        +        } else if (name) {
        +            //May just be an object definition for the module. Only
        +            //worry about defining if have a module name.
        +            defined[name] = callback;
        +        }
        +    };
        +
        +    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
        +        if (typeof deps === "string") {
        +            if (handlers[deps]) {
        +                //callback in this case is really relName
        +                return handlers[deps](callback);
        +            }
        +            //Just return the module wanted. In this scenario, the
        +            //deps arg is the module name, and second arg (if passed)
        +            //is just the relName.
        +            //Normalize module name, if it contains . or ..
        +            return callDep(makeMap(deps, callback).f);
        +        } else if (!deps.splice) {
        +            //deps is a config object, not an array.
        +            config = deps;
        +            if (config.deps) {
        +                req(config.deps, config.callback);
        +            }
        +            if (!callback) {
        +                return;
        +            }
        +
        +            if (callback.splice) {
        +                //callback is an array, which means it is a dependency list.
        +                //Adjust args if there are dependencies
        +                deps = callback;
        +                callback = relName;
        +                relName = null;
        +            } else {
        +                deps = undef;
        +            }
        +        }
        +
        +        //Support require(['a'])
        +        callback = callback || function () {};
        +
        +        //If relName is a function, it is an errback handler,
        +        //so remove it.
        +        if (typeof relName === 'function') {
        +            relName = forceSync;
        +            forceSync = alt;
        +        }
        +
        +        //Simulate async callback;
        +        if (forceSync) {
        +            main(undef, deps, callback, relName);
        +        } else {
        +            //Using a non-zero value because of concern for what old browsers
        +            //do, and latest browsers "upgrade" to 4 if lower value is used:
        +            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
        +            //If want a value immediately, use require('id') instead -- something
        +            //that works in almond on the global level, but not guaranteed and
        +            //unlikely to work in other AMD implementations.
        +            setTimeout(function () {
        +                main(undef, deps, callback, relName);
        +            }, 4);
        +        }
        +
        +        return req;
        +    };
        +
        +    /**
        +     * Just drops the config on the floor, but returns req in case
        +     * the config return value is used.
        +     */
        +    req.config = function (cfg) {
        +        return req(cfg);
        +    };
        +
        +    /**
        +     * Expose module registry for debugging and tooling
        +     */
        +    requirejs._defined = defined;
        +
        +    define = function (name, deps, callback) {
        +        if (typeof name !== 'string') {
        +            throw new Error('See almond README: incorrect module build, no module name');
        +        }
        +
        +        //This module may not have dependencies
        +        if (!deps.splice) {
        +            //deps is not an array, so probably means
        +            //an object literal or factory function for
        +            //the value. Adjust args.
        +            callback = deps;
        +            deps = [];
        +        }
        +
        +        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
        +            waiting[name] = [name, deps, callback];
        +        }
        +    };
        +
        +    define.amd = {
        +        jQuery: true
        +    };
        +}());
        +
        +S2.requirejs = requirejs;S2.require = require;S2.define = define;
        +}
        +}());
        +S2.define("almond", function(){});
        +
        +/* global jQuery:false, $:false */
        +S2.define('jquery',[],function () {
        +  var _$ = jQuery || $;
        +
        +  if (_$ == null && console && console.error) {
        +    console.error(
        +      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
        +      'found. Make sure that you are including jQuery before Select2 on your ' +
        +      'web page.'
        +    );
        +  }
        +
        +  return _$;
        +});
        +
        +S2.define('select2/utils',[
        +  'jquery'
        +], function ($) {
        +  var Utils = {};
        +
        +  Utils.Extend = function (ChildClass, SuperClass) {
        +    var __hasProp = {}.hasOwnProperty;
        +
        +    function BaseConstructor () {
        +      this.constructor = ChildClass;
        +    }
        +
        +    for (var key in SuperClass) {
        +      if (__hasProp.call(SuperClass, key)) {
        +        ChildClass[key] = SuperClass[key];
        +      }
        +    }
        +
        +    BaseConstructor.prototype = SuperClass.prototype;
        +    ChildClass.prototype = new BaseConstructor();
        +    ChildClass.__super__ = SuperClass.prototype;
        +
        +    return ChildClass;
        +  };
        +
        +  function getMethods (theClass) {
        +    var proto = theClass.prototype;
        +
        +    var methods = [];
        +
        +    for (var methodName in proto) {
        +      var m = proto[methodName];
        +
        +      if (typeof m !== 'function') {
        +        continue;
        +      }
        +
        +      if (methodName === 'constructor') {
        +        continue;
        +      }
        +
        +      methods.push(methodName);
        +    }
        +
        +    return methods;
        +  }
        +
        +  Utils.Decorate = function (SuperClass, DecoratorClass) {
        +    var decoratedMethods = getMethods(DecoratorClass);
        +    var superMethods = getMethods(SuperClass);
        +
        +    function DecoratedClass () {
        +      var unshift = Array.prototype.unshift;
        +
        +      var argCount = DecoratorClass.prototype.constructor.length;
        +
        +      var calledConstructor = SuperClass.prototype.constructor;
        +
        +      if (argCount > 0) {
        +        unshift.call(arguments, SuperClass.prototype.constructor);
        +
        +        calledConstructor = DecoratorClass.prototype.constructor;
        +      }
        +
        +      calledConstructor.apply(this, arguments);
        +    }
        +
        +    DecoratorClass.displayName = SuperClass.displayName;
        +
        +    function ctr () {
        +      this.constructor = DecoratedClass;
        +    }
        +
        +    DecoratedClass.prototype = new ctr();
        +
        +    for (var m = 0; m < superMethods.length; m++) {
        +        var superMethod = superMethods[m];
        +
        +        DecoratedClass.prototype[superMethod] =
        +          SuperClass.prototype[superMethod];
        +    }
        +
        +    var calledMethod = function (methodName) {
        +      // Stub out the original method if it's not decorating an actual method
        +      var originalMethod = function () {};
        +
        +      if (methodName in DecoratedClass.prototype) {
        +        originalMethod = DecoratedClass.prototype[methodName];
        +      }
        +
        +      var decoratedMethod = DecoratorClass.prototype[methodName];
        +
        +      return function () {
        +        var unshift = Array.prototype.unshift;
        +
        +        unshift.call(arguments, originalMethod);
        +
        +        return decoratedMethod.apply(this, arguments);
        +      };
        +    };
        +
        +    for (var d = 0; d < decoratedMethods.length; d++) {
        +      var decoratedMethod = decoratedMethods[d];
        +
        +      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
        +    }
        +
        +    return DecoratedClass;
        +  };
        +
        +  var Observable = function () {
        +    this.listeners = {};
        +  };
        +
        +  Observable.prototype.on = function (event, callback) {
        +    this.listeners = this.listeners || {};
        +
        +    if (event in this.listeners) {
        +      this.listeners[event].push(callback);
        +    } else {
        +      this.listeners[event] = [callback];
        +    }
        +  };
        +
        +  Observable.prototype.trigger = function (event) {
        +    var slice = Array.prototype.slice;
        +    var params = slice.call(arguments, 1);
        +
        +    this.listeners = this.listeners || {};
        +
        +    // Params should always come in as an array
        +    if (params == null) {
        +      params = [];
        +    }
        +
        +    // If there are no arguments to the event, use a temporary object
        +    if (params.length === 0) {
        +      params.push({});
        +    }
        +
        +    // Set the `_type` of the first object to the event
        +    params[0]._type = event;
        +
        +    if (event in this.listeners) {
        +      this.invoke(this.listeners[event], slice.call(arguments, 1));
        +    }
        +
        +    if ('*' in this.listeners) {
        +      this.invoke(this.listeners['*'], arguments);
        +    }
        +  };
        +
        +  Observable.prototype.invoke = function (listeners, params) {
        +    for (var i = 0, len = listeners.length; i < len; i++) {
        +      listeners[i].apply(this, params);
        +    }
        +  };
        +
        +  Utils.Observable = Observable;
        +
        +  Utils.generateChars = function (length) {
        +    var chars = '';
        +
        +    for (var i = 0; i < length; i++) {
        +      var randomChar = Math.floor(Math.random() * 36);
        +      chars += randomChar.toString(36);
        +    }
        +
        +    return chars;
        +  };
        +
        +  Utils.bind = function (func, context) {
        +    return function () {
        +      func.apply(context, arguments);
        +    };
        +  };
        +
        +  Utils._convertData = function (data) {
        +    for (var originalKey in data) {
        +      var keys = originalKey.split('-');
        +
        +      var dataLevel = data;
        +
        +      if (keys.length === 1) {
        +        continue;
        +      }
        +
        +      for (var k = 0; k < keys.length; k++) {
        +        var key = keys[k];
        +
        +        // Lowercase the first letter
        +        // By default, dash-separated becomes camelCase
        +        key = key.substring(0, 1).toLowerCase() + key.substring(1);
        +
        +        if (!(key in dataLevel)) {
        +          dataLevel[key] = {};
        +        }
        +
        +        if (k == keys.length - 1) {
        +          dataLevel[key] = data[originalKey];
        +        }
        +
        +        dataLevel = dataLevel[key];
        +      }
        +
        +      delete data[originalKey];
        +    }
        +
        +    return data;
        +  };
        +
        +  Utils.hasScroll = function (index, el) {
        +    // Adapted from the function created by @ShadowScripter
        +    // and adapted by @BillBarry on the Stack Exchange Code Review website.
        +    // The original code can be found at
        +    // http://codereview.stackexchange.com/q/13338
        +    // and was designed to be used with the Sizzle selector engine.
        +
        +    var $el = $(el);
        +    var overflowX = el.style.overflowX;
        +    var overflowY = el.style.overflowY;
        +
        +    //Check both x and y declarations
        +    if (overflowX === overflowY &&
        +        (overflowY === 'hidden' || overflowY === 'visible')) {
        +      return false;
        +    }
        +
        +    if (overflowX === 'scroll' || overflowY === 'scroll') {
        +      return true;
        +    }
        +
        +    return ($el.innerHeight() < el.scrollHeight ||
        +      $el.innerWidth() < el.scrollWidth);
        +  };
        +
        +  Utils.escapeMarkup = function (markup) {
        +    var replaceMap = {
        +      '\\': '&#92;',
        +      '&': '&amp;',
        +      '<': '&lt;',
        +      '>': '&gt;',
        +      '"': '&quot;',
        +      '\'': '&#39;',
        +      '/': '&#47;'
        +    };
        +
        +    // Do not try to escape the markup if it's not a string
        +    if (typeof markup !== 'string') {
        +      return markup;
        +    }
        +
        +    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
        +      return replaceMap[match];
        +    });
        +  };
        +
        +  // Append an array of jQuery nodes to a given element.
        +  Utils.appendMany = function ($element, $nodes) {
        +    // jQuery 1.7.x does not support $.fn.append() with an array
        +    // Fall back to a jQuery object collection using $.fn.add()
        +    if ($.fn.jquery.substr(0, 3) === '1.7') {
        +      var $jqNodes = $();
        +
        +      $.map($nodes, function (node) {
        +        $jqNodes = $jqNodes.add(node);
        +      });
        +
        +      $nodes = $jqNodes;
        +    }
        +
        +    $element.append($nodes);
        +  };
        +
        +  return Utils;
        +});
        +
        +S2.define('select2/results',[
        +  'jquery',
        +  './utils'
        +], function ($, Utils) {
        +  function Results ($element, options, dataAdapter) {
        +    this.$element = $element;
        +    this.data = dataAdapter;
        +    this.options = options;
        +
        +    Results.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(Results, Utils.Observable);
        +
        +  Results.prototype.render = function () {
        +    var $results = $(
        +      '<ul class="select2-results__options" role="tree"></ul>'
        +    );
        +
        +    if (this.options.get('multiple')) {
        +      $results.attr('aria-multiselectable', 'true');
        +    }
        +
        +    this.$results = $results;
        +
        +    return $results;
        +  };
        +
        +  Results.prototype.clear = function () {
        +    this.$results.empty();
        +  };
        +
        +  Results.prototype.displayMessage = function (params) {
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    this.clear();
        +    this.hideLoading();
        +
        +    var $message = $(
        +      '<li role="treeitem" aria-live="assertive"' +
        +      ' class="select2-results__option"></li>'
        +    );
        +
        +    var message = this.options.get('translations').get(params.message);
        +
        +    $message.append(
        +      escapeMarkup(
        +        message(params.args)
        +      )
        +    );
        +
        +    $message[0].className += ' select2-results__message';
        +
        +    this.$results.append($message);
        +  };
        +
        +  Results.prototype.hideMessages = function () {
        +    this.$results.find('.select2-results__message').remove();
        +  };
        +
        +  Results.prototype.append = function (data) {
        +    this.hideLoading();
        +
        +    var $options = [];
        +
        +    if (data.results == null || data.results.length === 0) {
        +      if (this.$results.children().length === 0) {
        +        this.trigger('results:message', {
        +          message: 'noResults'
        +        });
        +      }
        +
        +      return;
        +    }
        +
        +    data.results = this.sort(data.results);
        +
        +    for (var d = 0; d < data.results.length; d++) {
        +      var item = data.results[d];
        +
        +      var $option = this.option(item);
        +
        +      $options.push($option);
        +    }
        +
        +    this.$results.append($options);
        +  };
        +
        +  Results.prototype.position = function ($results, $dropdown) {
        +    var $resultsContainer = $dropdown.find('.select2-results');
        +    $resultsContainer.append($results);
        +  };
        +
        +  Results.prototype.sort = function (data) {
        +    var sorter = this.options.get('sorter');
        +
        +    return sorter(data);
        +  };
        +
        +  Results.prototype.highlightFirstItem = function () {
        +    var $options = this.$results
        +      .find('.select2-results__option[aria-selected]');
        +
        +    var $selected = $options.filter('[aria-selected=true]');
        +
        +    // Check if there are any selected options
        +    if ($selected.length > 0) {
        +      // If there are selected options, highlight the first
        +      $selected.first().trigger('mouseenter');
        +    } else {
        +      // If there are no selected options, highlight the first option
        +      // in the dropdown
        +      $options.first().trigger('mouseenter');
        +    }
        +
        +    this.ensureHighlightVisible();
        +  };
        +
        +  Results.prototype.setClasses = function () {
        +    var self = this;
        +
        +    this.data.current(function (selected) {
        +      var selectedIds = $.map(selected, function (s) {
        +        return s.id.toString();
        +      });
        +
        +      var $options = self.$results
        +        .find('.select2-results__option[aria-selected]');
        +
        +      $options.each(function () {
        +        var $option = $(this);
        +
        +        var item = $.data(this, 'data');
        +
        +        // id needs to be converted to a string when comparing
        +        var id = '' + item.id;
        +
        +        if ((item.element != null && item.element.selected) ||
        +            (item.element == null && $.inArray(id, selectedIds) > -1)) {
        +          $option.attr('aria-selected', 'true');
        +        } else {
        +          $option.attr('aria-selected', 'false');
        +        }
        +      });
        +
        +    });
        +  };
        +
        +  Results.prototype.showLoading = function (params) {
        +    this.hideLoading();
        +
        +    var loadingMore = this.options.get('translations').get('searching');
        +
        +    var loading = {
        +      disabled: true,
        +      loading: true,
        +      text: loadingMore(params)
        +    };
        +    var $loading = this.option(loading);
        +    $loading.className += ' loading-results';
        +
        +    this.$results.prepend($loading);
        +  };
        +
        +  Results.prototype.hideLoading = function () {
        +    this.$results.find('.loading-results').remove();
        +  };
        +
        +  Results.prototype.option = function (data) {
        +    var option = document.createElement('li');
        +    option.className = 'select2-results__option';
        +
        +    var attrs = {
        +      'role': 'treeitem',
        +      'aria-selected': 'false'
        +    };
        +
        +    if (data.disabled) {
        +      delete attrs['aria-selected'];
        +      attrs['aria-disabled'] = 'true';
        +    }
        +
        +    if (data.id == null) {
        +      delete attrs['aria-selected'];
        +    }
        +
        +    if (data._resultId != null) {
        +      option.id = data._resultId;
        +    }
        +
        +    if (data.title) {
        +      option.title = data.title;
        +    }
        +
        +    if (data.children) {
        +      attrs.role = 'group';
        +      attrs['aria-label'] = data.text;
        +      delete attrs['aria-selected'];
        +    }
        +
        +    for (var attr in attrs) {
        +      var val = attrs[attr];
        +
        +      option.setAttribute(attr, val);
        +    }
        +
        +    if (data.children) {
        +      var $option = $(option);
        +
        +      var label = document.createElement('strong');
        +      label.className = 'select2-results__group';
        +
        +      var $label = $(label);
        +      this.template(data, label);
        +
        +      var $children = [];
        +
        +      for (var c = 0; c < data.children.length; c++) {
        +        var child = data.children[c];
        +
        +        var $child = this.option(child);
        +
        +        $children.push($child);
        +      }
        +
        +      var $childrenContainer = $('<ul></ul>', {
        +        'class': 'select2-results__options select2-results__options--nested'
        +      });
        +
        +      $childrenContainer.append($children);
        +
        +      $option.append(label);
        +      $option.append($childrenContainer);
        +    } else {
        +      this.template(data, option);
        +    }
        +
        +    $.data(option, 'data', data);
        +
        +    return option;
        +  };
        +
        +  Results.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    var id = container.id + '-results';
        +
        +    this.$results.attr('id', id);
        +
        +    container.on('results:all', function (params) {
        +      self.clear();
        +      self.append(params.data);
        +
        +      if (container.isOpen()) {
        +        self.setClasses();
        +        self.highlightFirstItem();
        +      }
        +    });
        +
        +    container.on('results:append', function (params) {
        +      self.append(params.data);
        +
        +      if (container.isOpen()) {
        +        self.setClasses();
        +      }
        +    });
        +
        +    container.on('query', function (params) {
        +      self.hideMessages();
        +      self.showLoading(params);
        +    });
        +
        +    container.on('select', function () {
        +      if (!container.isOpen()) {
        +        return;
        +      }
        +
        +      self.setClasses();
        +      self.highlightFirstItem();
        +    });
        +
        +    container.on('unselect', function () {
        +      if (!container.isOpen()) {
        +        return;
        +      }
        +
        +      self.setClasses();
        +      self.highlightFirstItem();
        +    });
        +
        +    container.on('open', function () {
        +      // When the dropdown is open, aria-expended="true"
        +      self.$results.attr('aria-expanded', 'true');
        +      self.$results.attr('aria-hidden', 'false');
        +
        +      self.setClasses();
        +      self.ensureHighlightVisible();
        +    });
        +
        +    container.on('close', function () {
        +      // When the dropdown is closed, aria-expended="false"
        +      self.$results.attr('aria-expanded', 'false');
        +      self.$results.attr('aria-hidden', 'true');
        +      self.$results.removeAttr('aria-activedescendant');
        +    });
        +
        +    container.on('results:toggle', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      if ($highlighted.length === 0) {
        +        return;
        +      }
        +
        +      $highlighted.trigger('mouseup');
        +    });
        +
        +    container.on('results:select', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      if ($highlighted.length === 0) {
        +        return;
        +      }
        +
        +      var data = $highlighted.data('data');
        +
        +      if ($highlighted.attr('aria-selected') == 'true') {
        +        self.trigger('close', {});
        +      } else {
        +        self.trigger('select', {
        +          data: data
        +        });
        +      }
        +    });
        +
        +    container.on('results:previous', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      var $options = self.$results.find('[aria-selected]');
        +
        +      var currentIndex = $options.index($highlighted);
        +
        +      // If we are already at te top, don't move further
        +      if (currentIndex === 0) {
        +        return;
        +      }
        +
        +      var nextIndex = currentIndex - 1;
        +
        +      // If none are highlighted, highlight the first
        +      if ($highlighted.length === 0) {
        +        nextIndex = 0;
        +      }
        +
        +      var $next = $options.eq(nextIndex);
        +
        +      $next.trigger('mouseenter');
        +
        +      var currentOffset = self.$results.offset().top;
        +      var nextTop = $next.offset().top;
        +      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
        +
        +      if (nextIndex === 0) {
        +        self.$results.scrollTop(0);
        +      } else if (nextTop - currentOffset < 0) {
        +        self.$results.scrollTop(nextOffset);
        +      }
        +    });
        +
        +    container.on('results:next', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      var $options = self.$results.find('[aria-selected]');
        +
        +      var currentIndex = $options.index($highlighted);
        +
        +      var nextIndex = currentIndex + 1;
        +
        +      // If we are at the last option, stay there
        +      if (nextIndex >= $options.length) {
        +        return;
        +      }
        +
        +      var $next = $options.eq(nextIndex);
        +
        +      $next.trigger('mouseenter');
        +
        +      var currentOffset = self.$results.offset().top +
        +        self.$results.outerHeight(false);
        +      var nextBottom = $next.offset().top + $next.outerHeight(false);
        +      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
        +
        +      if (nextIndex === 0) {
        +        self.$results.scrollTop(0);
        +      } else if (nextBottom > currentOffset) {
        +        self.$results.scrollTop(nextOffset);
        +      }
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      params.element.addClass('select2-results__option--highlighted');
        +    });
        +
        +    container.on('results:message', function (params) {
        +      self.displayMessage(params);
        +    });
        +
        +    if ($.fn.mousewheel) {
        +      this.$results.on('mousewheel', function (e) {
        +        var top = self.$results.scrollTop();
        +
        +        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
        +
        +        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
        +        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
        +
        +        if (isAtTop) {
        +          self.$results.scrollTop(0);
        +
        +          e.preventDefault();
        +          e.stopPropagation();
        +        } else if (isAtBottom) {
        +          self.$results.scrollTop(
        +            self.$results.get(0).scrollHeight - self.$results.height()
        +          );
        +
        +          e.preventDefault();
        +          e.stopPropagation();
        +        }
        +      });
        +    }
        +
        +    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
        +      function (evt) {
        +      var $this = $(this);
        +
        +      var data = $this.data('data');
        +
        +      if ($this.attr('aria-selected') === 'true') {
        +        if (self.options.get('multiple')) {
        +          self.trigger('unselect', {
        +            originalEvent: evt,
        +            data: data
        +          });
        +        } else {
        +          self.trigger('close', {});
        +        }
        +
        +        return;
        +      }
        +
        +      self.trigger('select', {
        +        originalEvent: evt,
        +        data: data
        +      });
        +    });
        +
        +    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
        +      function (evt) {
        +      var data = $(this).data('data');
        +
        +      self.getHighlightedResults()
        +          .removeClass('select2-results__option--highlighted');
        +
        +      self.trigger('results:focus', {
        +        data: data,
        +        element: $(this)
        +      });
        +    });
        +  };
        +
        +  Results.prototype.getHighlightedResults = function () {
        +    var $highlighted = this.$results
        +    .find('.select2-results__option--highlighted');
        +
        +    return $highlighted;
        +  };
        +
        +  Results.prototype.destroy = function () {
        +    this.$results.remove();
        +  };
        +
        +  Results.prototype.ensureHighlightVisible = function () {
        +    var $highlighted = this.getHighlightedResults();
        +
        +    if ($highlighted.length === 0) {
        +      return;
        +    }
        +
        +    var $options = this.$results.find('[aria-selected]');
        +
        +    var currentIndex = $options.index($highlighted);
        +
        +    var currentOffset = this.$results.offset().top;
        +    var nextTop = $highlighted.offset().top;
        +    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
        +
        +    var offsetDelta = nextTop - currentOffset;
        +    nextOffset -= $highlighted.outerHeight(false) * 2;
        +
        +    if (currentIndex <= 2) {
        +      this.$results.scrollTop(0);
        +    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
        +      this.$results.scrollTop(nextOffset);
        +    }
        +  };
        +
        +  Results.prototype.template = function (result, container) {
        +    var template = this.options.get('templateResult');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    var content = template(result, container);
        +
        +    if (content == null) {
        +      container.style.display = 'none';
        +    } else if (typeof content === 'string') {
        +      container.innerHTML = escapeMarkup(content);
        +    } else {
        +      $(container).append(content);
        +    }
        +  };
        +
        +  return Results;
        +});
        +
        +S2.define('select2/keys',[
        +
        +], function () {
        +  var KEYS = {
        +    BACKSPACE: 8,
        +    TAB: 9,
        +    ENTER: 13,
        +    SHIFT: 16,
        +    CTRL: 17,
        +    ALT: 18,
        +    ESC: 27,
        +    SPACE: 32,
        +    PAGE_UP: 33,
        +    PAGE_DOWN: 34,
        +    END: 35,
        +    HOME: 36,
        +    LEFT: 37,
        +    UP: 38,
        +    RIGHT: 39,
        +    DOWN: 40,
        +    DELETE: 46
        +  };
        +
        +  return KEYS;
        +});
        +
        +S2.define('select2/selection/base',[
        +  'jquery',
        +  '../utils',
        +  '../keys'
        +], function ($, Utils, KEYS) {
        +  function BaseSelection ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    BaseSelection.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(BaseSelection, Utils.Observable);
        +
        +  BaseSelection.prototype.render = function () {
        +    var $selection = $(
        +      '<span class="select2-selection" role="combobox" ' +
        +      ' aria-haspopup="true" aria-expanded="false">' +
        +      '</span>'
        +    );
        +
        +    this._tabindex = 0;
        +
        +    if (this.$element.data('old-tabindex') != null) {
        +      this._tabindex = this.$element.data('old-tabindex');
        +    } else if (this.$element.attr('tabindex') != null) {
        +      this._tabindex = this.$element.attr('tabindex');
        +    }
        +
        +    $selection.attr('title', this.$element.attr('title'));
        +    $selection.attr('tabindex', this._tabindex);
        +
        +    this.$selection = $selection;
        +
        +    return $selection;
        +  };
        +
        +  BaseSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    var id = container.id + '-container';
        +    var resultsId = container.id + '-results';
        +
        +    this.container = container;
        +
        +    this.$selection.on('focus', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this.$selection.on('blur', function (evt) {
        +      self._handleBlur(evt);
        +    });
        +
        +    this.$selection.on('keydown', function (evt) {
        +      self.trigger('keypress', evt);
        +
        +      if (evt.which === KEYS.SPACE) {
        +        evt.preventDefault();
        +      }
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      self.$selection.attr('aria-activedescendant', params.data._resultId);
        +    });
        +
        +    container.on('selection:update', function (params) {
        +      self.update(params.data);
        +    });
        +
        +    container.on('open', function () {
        +      // When the dropdown is open, aria-expanded="true"
        +      self.$selection.attr('aria-expanded', 'true');
        +      self.$selection.attr('aria-owns', resultsId);
        +
        +      self._attachCloseHandler(container);
        +    });
        +
        +    container.on('close', function () {
        +      // When the dropdown is closed, aria-expanded="false"
        +      self.$selection.attr('aria-expanded', 'false');
        +      self.$selection.removeAttr('aria-activedescendant');
        +      self.$selection.removeAttr('aria-owns');
        +
        +      self.$selection.focus();
        +
        +      self._detachCloseHandler(container);
        +    });
        +
        +    container.on('enable', function () {
        +      self.$selection.attr('tabindex', self._tabindex);
        +    });
        +
        +    container.on('disable', function () {
        +      self.$selection.attr('tabindex', '-1');
        +    });
        +  };
        +
        +  BaseSelection.prototype._handleBlur = function (evt) {
        +    var self = this;
        +
        +    // This needs to be delayed as the active element is the body when the tab
        +    // key is pressed, possibly along with others.
        +    window.setTimeout(function () {
        +      // Don't trigger `blur` if the focus is still in the selection
        +      if (
        +        (document.activeElement == self.$selection[0]) ||
        +        ($.contains(self.$selection[0], document.activeElement))
        +      ) {
        +        return;
        +      }
        +
        +      self.trigger('blur', evt);
        +    }, 1);
        +  };
        +
        +  BaseSelection.prototype._attachCloseHandler = function (container) {
        +    var self = this;
        +
        +    $(document.body).on('mousedown.select2.' + container.id, function (e) {
        +      var $target = $(e.target);
        +
        +      var $select = $target.closest('.select2');
        +
        +      var $all = $('.select2.select2-container--open');
        +
        +      $all.each(function () {
        +        var $this = $(this);
        +
        +        if (this == $select[0]) {
        +          return;
        +        }
        +
        +        var $element = $this.data('element');
        +
        +        $element.select2('close');
        +      });
        +    });
        +  };
        +
        +  BaseSelection.prototype._detachCloseHandler = function (container) {
        +    $(document.body).off('mousedown.select2.' + container.id);
        +  };
        +
        +  BaseSelection.prototype.position = function ($selection, $container) {
        +    var $selectionContainer = $container.find('.selection');
        +    $selectionContainer.append($selection);
        +  };
        +
        +  BaseSelection.prototype.destroy = function () {
        +    this._detachCloseHandler(this.container);
        +  };
        +
        +  BaseSelection.prototype.update = function (data) {
        +    throw new Error('The `update` method must be defined in child classes.');
        +  };
        +
        +  return BaseSelection;
        +});
        +
        +S2.define('select2/selection/single',[
        +  'jquery',
        +  './base',
        +  '../utils',
        +  '../keys'
        +], function ($, BaseSelection, Utils, KEYS) {
        +  function SingleSelection () {
        +    SingleSelection.__super__.constructor.apply(this, arguments);
        +  }
        +
        +  Utils.Extend(SingleSelection, BaseSelection);
        +
        +  SingleSelection.prototype.render = function () {
        +    var $selection = SingleSelection.__super__.render.call(this);
        +
        +    $selection.addClass('select2-selection--single');
        +
        +    $selection.html(
        +      '<span class="select2-selection__rendered"></span>' +
        +      '<span class="select2-selection__arrow" role="presentation">' +
        +        '<b role="presentation"></b>' +
        +      '</span>'
        +    );
        +
        +    return $selection;
        +  };
        +
        +  SingleSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    SingleSelection.__super__.bind.apply(this, arguments);
        +
        +    var id = container.id + '-container';
        +
        +    this.$selection.find('.select2-selection__rendered').attr('id', id);
        +    this.$selection.attr('aria-labelledby', id);
        +
        +    this.$selection.on('mousedown', function (evt) {
        +      // Only respond to left clicks
        +      if (evt.which !== 1) {
        +        return;
        +      }
        +
        +      self.trigger('toggle', {
        +        originalEvent: evt
        +      });
        +    });
        +
        +    this.$selection.on('focus', function (evt) {
        +      // User focuses on the container
        +    });
        +
        +    this.$selection.on('blur', function (evt) {
        +      // User exits the container
        +    });
        +
        +    container.on('focus', function (evt) {
        +      if (!container.isOpen()) {
        +        self.$selection.focus();
        +      }
        +    });
        +
        +    container.on('selection:update', function (params) {
        +      self.update(params.data);
        +    });
        +  };
        +
        +  SingleSelection.prototype.clear = function () {
        +    this.$selection.find('.select2-selection__rendered').empty();
        +  };
        +
        +  SingleSelection.prototype.display = function (data, container) {
        +    var template = this.options.get('templateSelection');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    return escapeMarkup(template(data, container));
        +  };
        +
        +  SingleSelection.prototype.selectionContainer = function () {
        +    return $('<span></span>');
        +  };
        +
        +  SingleSelection.prototype.update = function (data) {
        +    if (data.length === 0) {
        +      this.clear();
        +      return;
        +    }
        +
        +    var selection = data[0];
        +
        +    var $rendered = this.$selection.find('.select2-selection__rendered');
        +    var formatted = this.display(selection, $rendered);
        +
        +    $rendered.empty().append(formatted);
        +    $rendered.prop('title', selection.title || selection.text);
        +  };
        +
        +  return SingleSelection;
        +});
        +
        +S2.define('select2/selection/multiple',[
        +  'jquery',
        +  './base',
        +  '../utils'
        +], function ($, BaseSelection, Utils) {
        +  function MultipleSelection ($element, options) {
        +    MultipleSelection.__super__.constructor.apply(this, arguments);
        +  }
        +
        +  Utils.Extend(MultipleSelection, BaseSelection);
        +
        +  MultipleSelection.prototype.render = function () {
        +    var $selection = MultipleSelection.__super__.render.call(this);
        +
        +    $selection.addClass('select2-selection--multiple');
        +
        +    $selection.html(
        +      '<ul class="select2-selection__rendered"></ul>'
        +    );
        +
        +    return $selection;
        +  };
        +
        +  MultipleSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    MultipleSelection.__super__.bind.apply(this, arguments);
        +
        +    this.$selection.on('click', function (evt) {
        +      self.trigger('toggle', {
        +        originalEvent: evt
        +      });
        +    });
        +
        +    this.$selection.on(
        +      'click',
        +      '.select2-selection__choice__remove',
        +      function (evt) {
        +        // Ignore the event if it is disabled
        +        if (self.options.get('disabled')) {
        +          return;
        +        }
        +
        +        var $remove = $(this);
        +        var $selection = $remove.parent();
        +
        +        var data = $selection.data('data');
        +
        +        self.trigger('unselect', {
        +          originalEvent: evt,
        +          data: data
        +        });
        +      }
        +    );
        +  };
        +
        +  MultipleSelection.prototype.clear = function () {
        +    this.$selection.find('.select2-selection__rendered').empty();
        +  };
        +
        +  MultipleSelection.prototype.display = function (data, container) {
        +    var template = this.options.get('templateSelection');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    return escapeMarkup(template(data, container));
        +  };
        +
        +  MultipleSelection.prototype.selectionContainer = function () {
        +    var $container = $(
        +      '<li class="select2-selection__choice">' +
        +        '<span class="select2-selection__choice__remove" role="presentation">' +
        +          '&times;' +
        +        '</span>' +
        +      '</li>'
        +    );
        +
        +    return $container;
        +  };
        +
        +  MultipleSelection.prototype.update = function (data) {
        +    this.clear();
        +
        +    if (data.length === 0) {
        +      return;
        +    }
        +
        +    var $selections = [];
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var selection = data[d];
        +
        +      var $selection = this.selectionContainer();
        +      var formatted = this.display(selection, $selection);
        +
        +      $selection.append(formatted);
        +      $selection.prop('title', selection.title || selection.text);
        +
        +      $selection.data('data', selection);
        +
        +      $selections.push($selection);
        +    }
        +
        +    var $rendered = this.$selection.find('.select2-selection__rendered');
        +
        +    Utils.appendMany($rendered, $selections);
        +  };
        +
        +  return MultipleSelection;
        +});
        +
        +S2.define('select2/selection/placeholder',[
        +  '../utils'
        +], function (Utils) {
        +  function Placeholder (decorated, $element, options) {
        +    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
        +    if (typeof placeholder === 'string') {
        +      placeholder = {
        +        id: '',
        +        text: placeholder
        +      };
        +    }
        +
        +    return placeholder;
        +  };
        +
        +  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
        +    var $placeholder = this.selectionContainer();
        +
        +    $placeholder.html(this.display(placeholder));
        +    $placeholder.addClass('select2-selection__placeholder')
        +                .removeClass('select2-selection__choice');
        +
        +    return $placeholder;
        +  };
        +
        +  Placeholder.prototype.update = function (decorated, data) {
        +    var singlePlaceholder = (
        +      data.length == 1 && data[0].id != this.placeholder.id
        +    );
        +    var multipleSelections = data.length > 1;
        +
        +    if (multipleSelections || singlePlaceholder) {
        +      return decorated.call(this, data);
        +    }
        +
        +    this.clear();
        +
        +    var $placeholder = this.createPlaceholder(this.placeholder);
        +
        +    this.$selection.find('.select2-selection__rendered').append($placeholder);
        +  };
        +
        +  return Placeholder;
        +});
        +
        +S2.define('select2/selection/allowClear',[
        +  'jquery',
        +  '../keys'
        +], function ($, KEYS) {
        +  function AllowClear () { }
        +
        +  AllowClear.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    if (this.placeholder == null) {
        +      if (this.options.get('debug') && window.console && console.error) {
        +        console.error(
        +          'Select2: The `allowClear` option should be used in combination ' +
        +          'with the `placeholder` option.'
        +        );
        +      }
        +    }
        +
        +    this.$selection.on('mousedown', '.select2-selection__clear',
        +      function (evt) {
        +        self._handleClear(evt);
        +    });
        +
        +    container.on('keypress', function (evt) {
        +      self._handleKeyboardClear(evt, container);
        +    });
        +  };
        +
        +  AllowClear.prototype._handleClear = function (_, evt) {
        +    // Ignore the event if it is disabled
        +    if (this.options.get('disabled')) {
        +      return;
        +    }
        +
        +    var $clear = this.$selection.find('.select2-selection__clear');
        +
        +    // Ignore the event if nothing has been selected
        +    if ($clear.length === 0) {
        +      return;
        +    }
        +
        +    evt.stopPropagation();
        +
        +    var data = $clear.data('data');
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var unselectData = {
        +        data: data[d]
        +      };
        +
        +      // Trigger the `unselect` event, so people can prevent it from being
        +      // cleared.
        +      this.trigger('unselect', unselectData);
        +
        +      // If the event was prevented, don't clear it out.
        +      if (unselectData.prevented) {
        +        return;
        +      }
        +    }
        +
        +    this.$element.val(this.placeholder.id).trigger('change');
        +
        +    this.trigger('toggle', {});
        +  };
        +
        +  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
        +    if (container.isOpen()) {
        +      return;
        +    }
        +
        +    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
        +      this._handleClear(evt);
        +    }
        +  };
        +
        +  AllowClear.prototype.update = function (decorated, data) {
        +    decorated.call(this, data);
        +
        +    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
        +        data.length === 0) {
        +      return;
        +    }
        +
        +    var $remove = $(
        +      '<span class="select2-selection__clear">' +
        +        '&times;' +
        +      '</span>'
        +    );
        +    $remove.data('data', data);
        +
        +    this.$selection.find('.select2-selection__rendered').prepend($remove);
        +  };
        +
        +  return AllowClear;
        +});
        +
        +S2.define('select2/selection/search',[
        +  'jquery',
        +  '../utils',
        +  '../keys'
        +], function ($, Utils, KEYS) {
        +  function Search (decorated, $element, options) {
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Search.prototype.render = function (decorated) {
        +    var $search = $(
        +      '<li class="select2-search select2-search--inline">' +
        +        '<input class="select2-search__field" type="search" tabindex="-1"' +
        +        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        +        ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
        +      '</li>'
        +    );
        +
        +    this.$searchContainer = $search;
        +    this.$search = $search.find('input');
        +
        +    var $rendered = decorated.call(this);
        +
        +    this._transferTabIndex();
        +
        +    return $rendered;
        +  };
        +
        +  Search.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('open', function () {
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('close', function () {
        +      self.$search.val('');
        +      self.$search.removeAttr('aria-activedescendant');
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('enable', function () {
        +      self.$search.prop('disabled', false);
        +
        +      self._transferTabIndex();
        +    });
        +
        +    container.on('disable', function () {
        +      self.$search.prop('disabled', true);
        +    });
        +
        +    container.on('focus', function (evt) {
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      self.$search.attr('aria-activedescendant', params.id);
        +    });
        +
        +    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
        +      self._handleBlur(evt);
        +    });
        +
        +    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
        +      evt.stopPropagation();
        +
        +      self.trigger('keypress', evt);
        +
        +      self._keyUpPrevented = evt.isDefaultPrevented();
        +
        +      var key = evt.which;
        +
        +      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
        +        var $previousChoice = self.$searchContainer
        +          .prev('.select2-selection__choice');
        +
        +        if ($previousChoice.length > 0) {
        +          var item = $previousChoice.data('data');
        +
        +          self.searchRemoveChoice(item);
        +
        +          evt.preventDefault();
        +        }
        +      }
        +    });
        +
        +    // Try to detect the IE version should the `documentMode` property that
        +    // is stored on the document. This is only implemented in IE and is
        +    // slightly cleaner than doing a user agent check.
        +    // This property is not available in Edge, but Edge also doesn't have
        +    // this bug.
        +    var msie = document.documentMode;
        +    var disableInputEvents = msie && msie <= 11;
        +
        +    // Workaround for browsers which do not support the `input` event
        +    // This will prevent double-triggering of events for browsers which support
        +    // both the `keyup` and `input` events.
        +    this.$selection.on(
        +      'input.searchcheck',
        +      '.select2-search--inline',
        +      function (evt) {
        +        // IE will trigger the `input` event when a placeholder is used on a
        +        // search box. To get around this issue, we are forced to ignore all
        +        // `input` events in IE and keep using `keyup`.
        +        if (disableInputEvents) {
        +          self.$selection.off('input.search input.searchcheck');
        +          return;
        +        }
        +
        +        // Unbind the duplicated `keyup` event
        +        self.$selection.off('keyup.search');
        +      }
        +    );
        +
        +    this.$selection.on(
        +      'keyup.search input.search',
        +      '.select2-search--inline',
        +      function (evt) {
        +        // IE will trigger the `input` event when a placeholder is used on a
        +        // search box. To get around this issue, we are forced to ignore all
        +        // `input` events in IE and keep using `keyup`.
        +        if (disableInputEvents && evt.type === 'input') {
        +          self.$selection.off('input.search input.searchcheck');
        +          return;
        +        }
        +
        +        var key = evt.which;
        +
        +        // We can freely ignore events from modifier keys
        +        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
        +          return;
        +        }
        +
        +        // Tabbing will be handled during the `keydown` phase
        +        if (key == KEYS.TAB) {
        +          return;
        +        }
        +
        +        self.handleSearch(evt);
        +      }
        +    );
        +  };
        +
        +  /**
        +   * This method will transfer the tabindex attribute from the rendered
        +   * selection to the search box. This allows for the search box to be used as
        +   * the primary focus instead of the selection container.
        +   *
        +   * @private
        +   */
        +  Search.prototype._transferTabIndex = function (decorated) {
        +    this.$search.attr('tabindex', this.$selection.attr('tabindex'));
        +    this.$selection.attr('tabindex', '-1');
        +  };
        +
        +  Search.prototype.createPlaceholder = function (decorated, placeholder) {
        +    this.$search.attr('placeholder', placeholder.text);
        +  };
        +
        +  Search.prototype.update = function (decorated, data) {
        +    var searchHadFocus = this.$search[0] == document.activeElement;
        +
        +    this.$search.attr('placeholder', '');
        +
        +    decorated.call(this, data);
        +
        +    this.$selection.find('.select2-selection__rendered')
        +                   .append(this.$searchContainer);
        +
        +    this.resizeSearch();
        +    if (searchHadFocus) {
        +      this.$search.focus();
        +    }
        +  };
        +
        +  Search.prototype.handleSearch = function () {
        +    this.resizeSearch();
        +
        +    if (!this._keyUpPrevented) {
        +      var input = this.$search.val();
        +
        +      this.trigger('query', {
        +        term: input
        +      });
        +    }
        +
        +    this._keyUpPrevented = false;
        +  };
        +
        +  Search.prototype.searchRemoveChoice = function (decorated, item) {
        +    this.trigger('unselect', {
        +      data: item
        +    });
        +
        +    this.$search.val(item.text);
        +    this.handleSearch();
        +  };
        +
        +  Search.prototype.resizeSearch = function () {
        +    this.$search.css('width', '25px');
        +
        +    var width = '';
        +
        +    if (this.$search.attr('placeholder') !== '') {
        +      width = this.$selection.find('.select2-selection__rendered').innerWidth();
        +    } else {
        +      var minimumWidth = this.$search.val().length + 1;
        +
        +      width = (minimumWidth * 0.75) + 'em';
        +    }
        +
        +    this.$search.css('width', width);
        +  };
        +
        +  return Search;
        +});
        +
        +S2.define('select2/selection/eventRelay',[
        +  'jquery'
        +], function ($) {
        +  function EventRelay () { }
        +
        +  EventRelay.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +    var relayEvents = [
        +      'open', 'opening',
        +      'close', 'closing',
        +      'select', 'selecting',
        +      'unselect', 'unselecting'
        +    ];
        +
        +    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('*', function (name, params) {
        +      // Ignore events that should not be relayed
        +      if ($.inArray(name, relayEvents) === -1) {
        +        return;
        +      }
        +
        +      // The parameters should always be an object
        +      params = params || {};
        +
        +      // Generate the jQuery event for the Select2 event
        +      var evt = $.Event('select2:' + name, {
        +        params: params
        +      });
        +
        +      self.$element.trigger(evt);
        +
        +      // Only handle preventable events if it was one
        +      if ($.inArray(name, preventableEvents) === -1) {
        +        return;
        +      }
        +
        +      params.prevented = evt.isDefaultPrevented();
        +    });
        +  };
        +
        +  return EventRelay;
        +});
        +
        +S2.define('select2/translation',[
        +  'jquery',
        +  'require'
        +], function ($, require) {
        +  function Translation (dict) {
        +    this.dict = dict || {};
        +  }
        +
        +  Translation.prototype.all = function () {
        +    return this.dict;
        +  };
        +
        +  Translation.prototype.get = function (key) {
        +    return this.dict[key];
        +  };
        +
        +  Translation.prototype.extend = function (translation) {
        +    this.dict = $.extend({}, translation.all(), this.dict);
        +  };
        +
        +  // Static functions
        +
        +  Translation._cache = {};
        +
        +  Translation.loadPath = function (path) {
        +    if (!(path in Translation._cache)) {
        +      var translations = require(path);
        +
        +      Translation._cache[path] = translations;
        +    }
        +
        +    return new Translation(Translation._cache[path]);
        +  };
        +
        +  return Translation;
        +});
        +
        +S2.define('select2/diacritics',[
        +
        +], function () {
        +  var diacritics = {
        +    '\u24B6': 'A',
        +    '\uFF21': 'A',
        +    '\u00C0': 'A',
        +    '\u00C1': 'A',
        +    '\u00C2': 'A',
        +    '\u1EA6': 'A',
        +    '\u1EA4': 'A',
        +    '\u1EAA': 'A',
        +    '\u1EA8': 'A',
        +    '\u00C3': 'A',
        +    '\u0100': 'A',
        +    '\u0102': 'A',
        +    '\u1EB0': 'A',
        +    '\u1EAE': 'A',
        +    '\u1EB4': 'A',
        +    '\u1EB2': 'A',
        +    '\u0226': 'A',
        +    '\u01E0': 'A',
        +    '\u00C4': 'A',
        +    '\u01DE': 'A',
        +    '\u1EA2': 'A',
        +    '\u00C5': 'A',
        +    '\u01FA': 'A',
        +    '\u01CD': 'A',
        +    '\u0200': 'A',
        +    '\u0202': 'A',
        +    '\u1EA0': 'A',
        +    '\u1EAC': 'A',
        +    '\u1EB6': 'A',
        +    '\u1E00': 'A',
        +    '\u0104': 'A',
        +    '\u023A': 'A',
        +    '\u2C6F': 'A',
        +    '\uA732': 'AA',
        +    '\u00C6': 'AE',
        +    '\u01FC': 'AE',
        +    '\u01E2': 'AE',
        +    '\uA734': 'AO',
        +    '\uA736': 'AU',
        +    '\uA738': 'AV',
        +    '\uA73A': 'AV',
        +    '\uA73C': 'AY',
        +    '\u24B7': 'B',
        +    '\uFF22': 'B',
        +    '\u1E02': 'B',
        +    '\u1E04': 'B',
        +    '\u1E06': 'B',
        +    '\u0243': 'B',
        +    '\u0182': 'B',
        +    '\u0181': 'B',
        +    '\u24B8': 'C',
        +    '\uFF23': 'C',
        +    '\u0106': 'C',
        +    '\u0108': 'C',
        +    '\u010A': 'C',
        +    '\u010C': 'C',
        +    '\u00C7': 'C',
        +    '\u1E08': 'C',
        +    '\u0187': 'C',
        +    '\u023B': 'C',
        +    '\uA73E': 'C',
        +    '\u24B9': 'D',
        +    '\uFF24': 'D',
        +    '\u1E0A': 'D',
        +    '\u010E': 'D',
        +    '\u1E0C': 'D',
        +    '\u1E10': 'D',
        +    '\u1E12': 'D',
        +    '\u1E0E': 'D',
        +    '\u0110': 'D',
        +    '\u018B': 'D',
        +    '\u018A': 'D',
        +    '\u0189': 'D',
        +    '\uA779': 'D',
        +    '\u01F1': 'DZ',
        +    '\u01C4': 'DZ',
        +    '\u01F2': 'Dz',
        +    '\u01C5': 'Dz',
        +    '\u24BA': 'E',
        +    '\uFF25': 'E',
        +    '\u00C8': 'E',
        +    '\u00C9': 'E',
        +    '\u00CA': 'E',
        +    '\u1EC0': 'E',
        +    '\u1EBE': 'E',
        +    '\u1EC4': 'E',
        +    '\u1EC2': 'E',
        +    '\u1EBC': 'E',
        +    '\u0112': 'E',
        +    '\u1E14': 'E',
        +    '\u1E16': 'E',
        +    '\u0114': 'E',
        +    '\u0116': 'E',
        +    '\u00CB': 'E',
        +    '\u1EBA': 'E',
        +    '\u011A': 'E',
        +    '\u0204': 'E',
        +    '\u0206': 'E',
        +    '\u1EB8': 'E',
        +    '\u1EC6': 'E',
        +    '\u0228': 'E',
        +    '\u1E1C': 'E',
        +    '\u0118': 'E',
        +    '\u1E18': 'E',
        +    '\u1E1A': 'E',
        +    '\u0190': 'E',
        +    '\u018E': 'E',
        +    '\u24BB': 'F',
        +    '\uFF26': 'F',
        +    '\u1E1E': 'F',
        +    '\u0191': 'F',
        +    '\uA77B': 'F',
        +    '\u24BC': 'G',
        +    '\uFF27': 'G',
        +    '\u01F4': 'G',
        +    '\u011C': 'G',
        +    '\u1E20': 'G',
        +    '\u011E': 'G',
        +    '\u0120': 'G',
        +    '\u01E6': 'G',
        +    '\u0122': 'G',
        +    '\u01E4': 'G',
        +    '\u0193': 'G',
        +    '\uA7A0': 'G',
        +    '\uA77D': 'G',
        +    '\uA77E': 'G',
        +    '\u24BD': 'H',
        +    '\uFF28': 'H',
        +    '\u0124': 'H',
        +    '\u1E22': 'H',
        +    '\u1E26': 'H',
        +    '\u021E': 'H',
        +    '\u1E24': 'H',
        +    '\u1E28': 'H',
        +    '\u1E2A': 'H',
        +    '\u0126': 'H',
        +    '\u2C67': 'H',
        +    '\u2C75': 'H',
        +    '\uA78D': 'H',
        +    '\u24BE': 'I',
        +    '\uFF29': 'I',
        +    '\u00CC': 'I',
        +    '\u00CD': 'I',
        +    '\u00CE': 'I',
        +    '\u0128': 'I',
        +    '\u012A': 'I',
        +    '\u012C': 'I',
        +    '\u0130': 'I',
        +    '\u00CF': 'I',
        +    '\u1E2E': 'I',
        +    '\u1EC8': 'I',
        +    '\u01CF': 'I',
        +    '\u0208': 'I',
        +    '\u020A': 'I',
        +    '\u1ECA': 'I',
        +    '\u012E': 'I',
        +    '\u1E2C': 'I',
        +    '\u0197': 'I',
        +    '\u24BF': 'J',
        +    '\uFF2A': 'J',
        +    '\u0134': 'J',
        +    '\u0248': 'J',
        +    '\u24C0': 'K',
        +    '\uFF2B': 'K',
        +    '\u1E30': 'K',
        +    '\u01E8': 'K',
        +    '\u1E32': 'K',
        +    '\u0136': 'K',
        +    '\u1E34': 'K',
        +    '\u0198': 'K',
        +    '\u2C69': 'K',
        +    '\uA740': 'K',
        +    '\uA742': 'K',
        +    '\uA744': 'K',
        +    '\uA7A2': 'K',
        +    '\u24C1': 'L',
        +    '\uFF2C': 'L',
        +    '\u013F': 'L',
        +    '\u0139': 'L',
        +    '\u013D': 'L',
        +    '\u1E36': 'L',
        +    '\u1E38': 'L',
        +    '\u013B': 'L',
        +    '\u1E3C': 'L',
        +    '\u1E3A': 'L',
        +    '\u0141': 'L',
        +    '\u023D': 'L',
        +    '\u2C62': 'L',
        +    '\u2C60': 'L',
        +    '\uA748': 'L',
        +    '\uA746': 'L',
        +    '\uA780': 'L',
        +    '\u01C7': 'LJ',
        +    '\u01C8': 'Lj',
        +    '\u24C2': 'M',
        +    '\uFF2D': 'M',
        +    '\u1E3E': 'M',
        +    '\u1E40': 'M',
        +    '\u1E42': 'M',
        +    '\u2C6E': 'M',
        +    '\u019C': 'M',
        +    '\u24C3': 'N',
        +    '\uFF2E': 'N',
        +    '\u01F8': 'N',
        +    '\u0143': 'N',
        +    '\u00D1': 'N',
        +    '\u1E44': 'N',
        +    '\u0147': 'N',
        +    '\u1E46': 'N',
        +    '\u0145': 'N',
        +    '\u1E4A': 'N',
        +    '\u1E48': 'N',
        +    '\u0220': 'N',
        +    '\u019D': 'N',
        +    '\uA790': 'N',
        +    '\uA7A4': 'N',
        +    '\u01CA': 'NJ',
        +    '\u01CB': 'Nj',
        +    '\u24C4': 'O',
        +    '\uFF2F': 'O',
        +    '\u00D2': 'O',
        +    '\u00D3': 'O',
        +    '\u00D4': 'O',
        +    '\u1ED2': 'O',
        +    '\u1ED0': 'O',
        +    '\u1ED6': 'O',
        +    '\u1ED4': 'O',
        +    '\u00D5': 'O',
        +    '\u1E4C': 'O',
        +    '\u022C': 'O',
        +    '\u1E4E': 'O',
        +    '\u014C': 'O',
        +    '\u1E50': 'O',
        +    '\u1E52': 'O',
        +    '\u014E': 'O',
        +    '\u022E': 'O',
        +    '\u0230': 'O',
        +    '\u00D6': 'O',
        +    '\u022A': 'O',
        +    '\u1ECE': 'O',
        +    '\u0150': 'O',
        +    '\u01D1': 'O',
        +    '\u020C': 'O',
        +    '\u020E': 'O',
        +    '\u01A0': 'O',
        +    '\u1EDC': 'O',
        +    '\u1EDA': 'O',
        +    '\u1EE0': 'O',
        +    '\u1EDE': 'O',
        +    '\u1EE2': 'O',
        +    '\u1ECC': 'O',
        +    '\u1ED8': 'O',
        +    '\u01EA': 'O',
        +    '\u01EC': 'O',
        +    '\u00D8': 'O',
        +    '\u01FE': 'O',
        +    '\u0186': 'O',
        +    '\u019F': 'O',
        +    '\uA74A': 'O',
        +    '\uA74C': 'O',
        +    '\u01A2': 'OI',
        +    '\uA74E': 'OO',
        +    '\u0222': 'OU',
        +    '\u24C5': 'P',
        +    '\uFF30': 'P',
        +    '\u1E54': 'P',
        +    '\u1E56': 'P',
        +    '\u01A4': 'P',
        +    '\u2C63': 'P',
        +    '\uA750': 'P',
        +    '\uA752': 'P',
        +    '\uA754': 'P',
        +    '\u24C6': 'Q',
        +    '\uFF31': 'Q',
        +    '\uA756': 'Q',
        +    '\uA758': 'Q',
        +    '\u024A': 'Q',
        +    '\u24C7': 'R',
        +    '\uFF32': 'R',
        +    '\u0154': 'R',
        +    '\u1E58': 'R',
        +    '\u0158': 'R',
        +    '\u0210': 'R',
        +    '\u0212': 'R',
        +    '\u1E5A': 'R',
        +    '\u1E5C': 'R',
        +    '\u0156': 'R',
        +    '\u1E5E': 'R',
        +    '\u024C': 'R',
        +    '\u2C64': 'R',
        +    '\uA75A': 'R',
        +    '\uA7A6': 'R',
        +    '\uA782': 'R',
        +    '\u24C8': 'S',
        +    '\uFF33': 'S',
        +    '\u1E9E': 'S',
        +    '\u015A': 'S',
        +    '\u1E64': 'S',
        +    '\u015C': 'S',
        +    '\u1E60': 'S',
        +    '\u0160': 'S',
        +    '\u1E66': 'S',
        +    '\u1E62': 'S',
        +    '\u1E68': 'S',
        +    '\u0218': 'S',
        +    '\u015E': 'S',
        +    '\u2C7E': 'S',
        +    '\uA7A8': 'S',
        +    '\uA784': 'S',
        +    '\u24C9': 'T',
        +    '\uFF34': 'T',
        +    '\u1E6A': 'T',
        +    '\u0164': 'T',
        +    '\u1E6C': 'T',
        +    '\u021A': 'T',
        +    '\u0162': 'T',
        +    '\u1E70': 'T',
        +    '\u1E6E': 'T',
        +    '\u0166': 'T',
        +    '\u01AC': 'T',
        +    '\u01AE': 'T',
        +    '\u023E': 'T',
        +    '\uA786': 'T',
        +    '\uA728': 'TZ',
        +    '\u24CA': 'U',
        +    '\uFF35': 'U',
        +    '\u00D9': 'U',
        +    '\u00DA': 'U',
        +    '\u00DB': 'U',
        +    '\u0168': 'U',
        +    '\u1E78': 'U',
        +    '\u016A': 'U',
        +    '\u1E7A': 'U',
        +    '\u016C': 'U',
        +    '\u00DC': 'U',
        +    '\u01DB': 'U',
        +    '\u01D7': 'U',
        +    '\u01D5': 'U',
        +    '\u01D9': 'U',
        +    '\u1EE6': 'U',
        +    '\u016E': 'U',
        +    '\u0170': 'U',
        +    '\u01D3': 'U',
        +    '\u0214': 'U',
        +    '\u0216': 'U',
        +    '\u01AF': 'U',
        +    '\u1EEA': 'U',
        +    '\u1EE8': 'U',
        +    '\u1EEE': 'U',
        +    '\u1EEC': 'U',
        +    '\u1EF0': 'U',
        +    '\u1EE4': 'U',
        +    '\u1E72': 'U',
        +    '\u0172': 'U',
        +    '\u1E76': 'U',
        +    '\u1E74': 'U',
        +    '\u0244': 'U',
        +    '\u24CB': 'V',
        +    '\uFF36': 'V',
        +    '\u1E7C': 'V',
        +    '\u1E7E': 'V',
        +    '\u01B2': 'V',
        +    '\uA75E': 'V',
        +    '\u0245': 'V',
        +    '\uA760': 'VY',
        +    '\u24CC': 'W',
        +    '\uFF37': 'W',
        +    '\u1E80': 'W',
        +    '\u1E82': 'W',
        +    '\u0174': 'W',
        +    '\u1E86': 'W',
        +    '\u1E84': 'W',
        +    '\u1E88': 'W',
        +    '\u2C72': 'W',
        +    '\u24CD': 'X',
        +    '\uFF38': 'X',
        +    '\u1E8A': 'X',
        +    '\u1E8C': 'X',
        +    '\u24CE': 'Y',
        +    '\uFF39': 'Y',
        +    '\u1EF2': 'Y',
        +    '\u00DD': 'Y',
        +    '\u0176': 'Y',
        +    '\u1EF8': 'Y',
        +    '\u0232': 'Y',
        +    '\u1E8E': 'Y',
        +    '\u0178': 'Y',
        +    '\u1EF6': 'Y',
        +    '\u1EF4': 'Y',
        +    '\u01B3': 'Y',
        +    '\u024E': 'Y',
        +    '\u1EFE': 'Y',
        +    '\u24CF': 'Z',
        +    '\uFF3A': 'Z',
        +    '\u0179': 'Z',
        +    '\u1E90': 'Z',
        +    '\u017B': 'Z',
        +    '\u017D': 'Z',
        +    '\u1E92': 'Z',
        +    '\u1E94': 'Z',
        +    '\u01B5': 'Z',
        +    '\u0224': 'Z',
        +    '\u2C7F': 'Z',
        +    '\u2C6B': 'Z',
        +    '\uA762': 'Z',
        +    '\u24D0': 'a',
        +    '\uFF41': 'a',
        +    '\u1E9A': 'a',
        +    '\u00E0': 'a',
        +    '\u00E1': 'a',
        +    '\u00E2': 'a',
        +    '\u1EA7': 'a',
        +    '\u1EA5': 'a',
        +    '\u1EAB': 'a',
        +    '\u1EA9': 'a',
        +    '\u00E3': 'a',
        +    '\u0101': 'a',
        +    '\u0103': 'a',
        +    '\u1EB1': 'a',
        +    '\u1EAF': 'a',
        +    '\u1EB5': 'a',
        +    '\u1EB3': 'a',
        +    '\u0227': 'a',
        +    '\u01E1': 'a',
        +    '\u00E4': 'a',
        +    '\u01DF': 'a',
        +    '\u1EA3': 'a',
        +    '\u00E5': 'a',
        +    '\u01FB': 'a',
        +    '\u01CE': 'a',
        +    '\u0201': 'a',
        +    '\u0203': 'a',
        +    '\u1EA1': 'a',
        +    '\u1EAD': 'a',
        +    '\u1EB7': 'a',
        +    '\u1E01': 'a',
        +    '\u0105': 'a',
        +    '\u2C65': 'a',
        +    '\u0250': 'a',
        +    '\uA733': 'aa',
        +    '\u00E6': 'ae',
        +    '\u01FD': 'ae',
        +    '\u01E3': 'ae',
        +    '\uA735': 'ao',
        +    '\uA737': 'au',
        +    '\uA739': 'av',
        +    '\uA73B': 'av',
        +    '\uA73D': 'ay',
        +    '\u24D1': 'b',
        +    '\uFF42': 'b',
        +    '\u1E03': 'b',
        +    '\u1E05': 'b',
        +    '\u1E07': 'b',
        +    '\u0180': 'b',
        +    '\u0183': 'b',
        +    '\u0253': 'b',
        +    '\u24D2': 'c',
        +    '\uFF43': 'c',
        +    '\u0107': 'c',
        +    '\u0109': 'c',
        +    '\u010B': 'c',
        +    '\u010D': 'c',
        +    '\u00E7': 'c',
        +    '\u1E09': 'c',
        +    '\u0188': 'c',
        +    '\u023C': 'c',
        +    '\uA73F': 'c',
        +    '\u2184': 'c',
        +    '\u24D3': 'd',
        +    '\uFF44': 'd',
        +    '\u1E0B': 'd',
        +    '\u010F': 'd',
        +    '\u1E0D': 'd',
        +    '\u1E11': 'd',
        +    '\u1E13': 'd',
        +    '\u1E0F': 'd',
        +    '\u0111': 'd',
        +    '\u018C': 'd',
        +    '\u0256': 'd',
        +    '\u0257': 'd',
        +    '\uA77A': 'd',
        +    '\u01F3': 'dz',
        +    '\u01C6': 'dz',
        +    '\u24D4': 'e',
        +    '\uFF45': 'e',
        +    '\u00E8': 'e',
        +    '\u00E9': 'e',
        +    '\u00EA': 'e',
        +    '\u1EC1': 'e',
        +    '\u1EBF': 'e',
        +    '\u1EC5': 'e',
        +    '\u1EC3': 'e',
        +    '\u1EBD': 'e',
        +    '\u0113': 'e',
        +    '\u1E15': 'e',
        +    '\u1E17': 'e',
        +    '\u0115': 'e',
        +    '\u0117': 'e',
        +    '\u00EB': 'e',
        +    '\u1EBB': 'e',
        +    '\u011B': 'e',
        +    '\u0205': 'e',
        +    '\u0207': 'e',
        +    '\u1EB9': 'e',
        +    '\u1EC7': 'e',
        +    '\u0229': 'e',
        +    '\u1E1D': 'e',
        +    '\u0119': 'e',
        +    '\u1E19': 'e',
        +    '\u1E1B': 'e',
        +    '\u0247': 'e',
        +    '\u025B': 'e',
        +    '\u01DD': 'e',
        +    '\u24D5': 'f',
        +    '\uFF46': 'f',
        +    '\u1E1F': 'f',
        +    '\u0192': 'f',
        +    '\uA77C': 'f',
        +    '\u24D6': 'g',
        +    '\uFF47': 'g',
        +    '\u01F5': 'g',
        +    '\u011D': 'g',
        +    '\u1E21': 'g',
        +    '\u011F': 'g',
        +    '\u0121': 'g',
        +    '\u01E7': 'g',
        +    '\u0123': 'g',
        +    '\u01E5': 'g',
        +    '\u0260': 'g',
        +    '\uA7A1': 'g',
        +    '\u1D79': 'g',
        +    '\uA77F': 'g',
        +    '\u24D7': 'h',
        +    '\uFF48': 'h',
        +    '\u0125': 'h',
        +    '\u1E23': 'h',
        +    '\u1E27': 'h',
        +    '\u021F': 'h',
        +    '\u1E25': 'h',
        +    '\u1E29': 'h',
        +    '\u1E2B': 'h',
        +    '\u1E96': 'h',
        +    '\u0127': 'h',
        +    '\u2C68': 'h',
        +    '\u2C76': 'h',
        +    '\u0265': 'h',
        +    '\u0195': 'hv',
        +    '\u24D8': 'i',
        +    '\uFF49': 'i',
        +    '\u00EC': 'i',
        +    '\u00ED': 'i',
        +    '\u00EE': 'i',
        +    '\u0129': 'i',
        +    '\u012B': 'i',
        +    '\u012D': 'i',
        +    '\u00EF': 'i',
        +    '\u1E2F': 'i',
        +    '\u1EC9': 'i',
        +    '\u01D0': 'i',
        +    '\u0209': 'i',
        +    '\u020B': 'i',
        +    '\u1ECB': 'i',
        +    '\u012F': 'i',
        +    '\u1E2D': 'i',
        +    '\u0268': 'i',
        +    '\u0131': 'i',
        +    '\u24D9': 'j',
        +    '\uFF4A': 'j',
        +    '\u0135': 'j',
        +    '\u01F0': 'j',
        +    '\u0249': 'j',
        +    '\u24DA': 'k',
        +    '\uFF4B': 'k',
        +    '\u1E31': 'k',
        +    '\u01E9': 'k',
        +    '\u1E33': 'k',
        +    '\u0137': 'k',
        +    '\u1E35': 'k',
        +    '\u0199': 'k',
        +    '\u2C6A': 'k',
        +    '\uA741': 'k',
        +    '\uA743': 'k',
        +    '\uA745': 'k',
        +    '\uA7A3': 'k',
        +    '\u24DB': 'l',
        +    '\uFF4C': 'l',
        +    '\u0140': 'l',
        +    '\u013A': 'l',
        +    '\u013E': 'l',
        +    '\u1E37': 'l',
        +    '\u1E39': 'l',
        +    '\u013C': 'l',
        +    '\u1E3D': 'l',
        +    '\u1E3B': 'l',
        +    '\u017F': 'l',
        +    '\u0142': 'l',
        +    '\u019A': 'l',
        +    '\u026B': 'l',
        +    '\u2C61': 'l',
        +    '\uA749': 'l',
        +    '\uA781': 'l',
        +    '\uA747': 'l',
        +    '\u01C9': 'lj',
        +    '\u24DC': 'm',
        +    '\uFF4D': 'm',
        +    '\u1E3F': 'm',
        +    '\u1E41': 'm',
        +    '\u1E43': 'm',
        +    '\u0271': 'm',
        +    '\u026F': 'm',
        +    '\u24DD': 'n',
        +    '\uFF4E': 'n',
        +    '\u01F9': 'n',
        +    '\u0144': 'n',
        +    '\u00F1': 'n',
        +    '\u1E45': 'n',
        +    '\u0148': 'n',
        +    '\u1E47': 'n',
        +    '\u0146': 'n',
        +    '\u1E4B': 'n',
        +    '\u1E49': 'n',
        +    '\u019E': 'n',
        +    '\u0272': 'n',
        +    '\u0149': 'n',
        +    '\uA791': 'n',
        +    '\uA7A5': 'n',
        +    '\u01CC': 'nj',
        +    '\u24DE': 'o',
        +    '\uFF4F': 'o',
        +    '\u00F2': 'o',
        +    '\u00F3': 'o',
        +    '\u00F4': 'o',
        +    '\u1ED3': 'o',
        +    '\u1ED1': 'o',
        +    '\u1ED7': 'o',
        +    '\u1ED5': 'o',
        +    '\u00F5': 'o',
        +    '\u1E4D': 'o',
        +    '\u022D': 'o',
        +    '\u1E4F': 'o',
        +    '\u014D': 'o',
        +    '\u1E51': 'o',
        +    '\u1E53': 'o',
        +    '\u014F': 'o',
        +    '\u022F': 'o',
        +    '\u0231': 'o',
        +    '\u00F6': 'o',
        +    '\u022B': 'o',
        +    '\u1ECF': 'o',
        +    '\u0151': 'o',
        +    '\u01D2': 'o',
        +    '\u020D': 'o',
        +    '\u020F': 'o',
        +    '\u01A1': 'o',
        +    '\u1EDD': 'o',
        +    '\u1EDB': 'o',
        +    '\u1EE1': 'o',
        +    '\u1EDF': 'o',
        +    '\u1EE3': 'o',
        +    '\u1ECD': 'o',
        +    '\u1ED9': 'o',
        +    '\u01EB': 'o',
        +    '\u01ED': 'o',
        +    '\u00F8': 'o',
        +    '\u01FF': 'o',
        +    '\u0254': 'o',
        +    '\uA74B': 'o',
        +    '\uA74D': 'o',
        +    '\u0275': 'o',
        +    '\u01A3': 'oi',
        +    '\u0223': 'ou',
        +    '\uA74F': 'oo',
        +    '\u24DF': 'p',
        +    '\uFF50': 'p',
        +    '\u1E55': 'p',
        +    '\u1E57': 'p',
        +    '\u01A5': 'p',
        +    '\u1D7D': 'p',
        +    '\uA751': 'p',
        +    '\uA753': 'p',
        +    '\uA755': 'p',
        +    '\u24E0': 'q',
        +    '\uFF51': 'q',
        +    '\u024B': 'q',
        +    '\uA757': 'q',
        +    '\uA759': 'q',
        +    '\u24E1': 'r',
        +    '\uFF52': 'r',
        +    '\u0155': 'r',
        +    '\u1E59': 'r',
        +    '\u0159': 'r',
        +    '\u0211': 'r',
        +    '\u0213': 'r',
        +    '\u1E5B': 'r',
        +    '\u1E5D': 'r',
        +    '\u0157': 'r',
        +    '\u1E5F': 'r',
        +    '\u024D': 'r',
        +    '\u027D': 'r',
        +    '\uA75B': 'r',
        +    '\uA7A7': 'r',
        +    '\uA783': 'r',
        +    '\u24E2': 's',
        +    '\uFF53': 's',
        +    '\u00DF': 's',
        +    '\u015B': 's',
        +    '\u1E65': 's',
        +    '\u015D': 's',
        +    '\u1E61': 's',
        +    '\u0161': 's',
        +    '\u1E67': 's',
        +    '\u1E63': 's',
        +    '\u1E69': 's',
        +    '\u0219': 's',
        +    '\u015F': 's',
        +    '\u023F': 's',
        +    '\uA7A9': 's',
        +    '\uA785': 's',
        +    '\u1E9B': 's',
        +    '\u24E3': 't',
        +    '\uFF54': 't',
        +    '\u1E6B': 't',
        +    '\u1E97': 't',
        +    '\u0165': 't',
        +    '\u1E6D': 't',
        +    '\u021B': 't',
        +    '\u0163': 't',
        +    '\u1E71': 't',
        +    '\u1E6F': 't',
        +    '\u0167': 't',
        +    '\u01AD': 't',
        +    '\u0288': 't',
        +    '\u2C66': 't',
        +    '\uA787': 't',
        +    '\uA729': 'tz',
        +    '\u24E4': 'u',
        +    '\uFF55': 'u',
        +    '\u00F9': 'u',
        +    '\u00FA': 'u',
        +    '\u00FB': 'u',
        +    '\u0169': 'u',
        +    '\u1E79': 'u',
        +    '\u016B': 'u',
        +    '\u1E7B': 'u',
        +    '\u016D': 'u',
        +    '\u00FC': 'u',
        +    '\u01DC': 'u',
        +    '\u01D8': 'u',
        +    '\u01D6': 'u',
        +    '\u01DA': 'u',
        +    '\u1EE7': 'u',
        +    '\u016F': 'u',
        +    '\u0171': 'u',
        +    '\u01D4': 'u',
        +    '\u0215': 'u',
        +    '\u0217': 'u',
        +    '\u01B0': 'u',
        +    '\u1EEB': 'u',
        +    '\u1EE9': 'u',
        +    '\u1EEF': 'u',
        +    '\u1EED': 'u',
        +    '\u1EF1': 'u',
        +    '\u1EE5': 'u',
        +    '\u1E73': 'u',
        +    '\u0173': 'u',
        +    '\u1E77': 'u',
        +    '\u1E75': 'u',
        +    '\u0289': 'u',
        +    '\u24E5': 'v',
        +    '\uFF56': 'v',
        +    '\u1E7D': 'v',
        +    '\u1E7F': 'v',
        +    '\u028B': 'v',
        +    '\uA75F': 'v',
        +    '\u028C': 'v',
        +    '\uA761': 'vy',
        +    '\u24E6': 'w',
        +    '\uFF57': 'w',
        +    '\u1E81': 'w',
        +    '\u1E83': 'w',
        +    '\u0175': 'w',
        +    '\u1E87': 'w',
        +    '\u1E85': 'w',
        +    '\u1E98': 'w',
        +    '\u1E89': 'w',
        +    '\u2C73': 'w',
        +    '\u24E7': 'x',
        +    '\uFF58': 'x',
        +    '\u1E8B': 'x',
        +    '\u1E8D': 'x',
        +    '\u24E8': 'y',
        +    '\uFF59': 'y',
        +    '\u1EF3': 'y',
        +    '\u00FD': 'y',
        +    '\u0177': 'y',
        +    '\u1EF9': 'y',
        +    '\u0233': 'y',
        +    '\u1E8F': 'y',
        +    '\u00FF': 'y',
        +    '\u1EF7': 'y',
        +    '\u1E99': 'y',
        +    '\u1EF5': 'y',
        +    '\u01B4': 'y',
        +    '\u024F': 'y',
        +    '\u1EFF': 'y',
        +    '\u24E9': 'z',
        +    '\uFF5A': 'z',
        +    '\u017A': 'z',
        +    '\u1E91': 'z',
        +    '\u017C': 'z',
        +    '\u017E': 'z',
        +    '\u1E93': 'z',
        +    '\u1E95': 'z',
        +    '\u01B6': 'z',
        +    '\u0225': 'z',
        +    '\u0240': 'z',
        +    '\u2C6C': 'z',
        +    '\uA763': 'z',
        +    '\u0386': '\u0391',
        +    '\u0388': '\u0395',
        +    '\u0389': '\u0397',
        +    '\u038A': '\u0399',
        +    '\u03AA': '\u0399',
        +    '\u038C': '\u039F',
        +    '\u038E': '\u03A5',
        +    '\u03AB': '\u03A5',
        +    '\u038F': '\u03A9',
        +    '\u03AC': '\u03B1',
        +    '\u03AD': '\u03B5',
        +    '\u03AE': '\u03B7',
        +    '\u03AF': '\u03B9',
        +    '\u03CA': '\u03B9',
        +    '\u0390': '\u03B9',
        +    '\u03CC': '\u03BF',
        +    '\u03CD': '\u03C5',
        +    '\u03CB': '\u03C5',
        +    '\u03B0': '\u03C5',
        +    '\u03C9': '\u03C9',
        +    '\u03C2': '\u03C3'
        +  };
        +
        +  return diacritics;
        +});
        +
        +S2.define('select2/data/base',[
        +  '../utils'
        +], function (Utils) {
        +  function BaseAdapter ($element, options) {
        +    BaseAdapter.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(BaseAdapter, Utils.Observable);
        +
        +  BaseAdapter.prototype.current = function (callback) {
        +    throw new Error('The `current` method must be defined in child classes.');
        +  };
        +
        +  BaseAdapter.prototype.query = function (params, callback) {
        +    throw new Error('The `query` method must be defined in child classes.');
        +  };
        +
        +  BaseAdapter.prototype.bind = function (container, $container) {
        +    // Can be implemented in subclasses
        +  };
        +
        +  BaseAdapter.prototype.destroy = function () {
        +    // Can be implemented in subclasses
        +  };
        +
        +  BaseAdapter.prototype.generateResultId = function (container, data) {
        +    var id = container.id + '-result-';
        +
        +    id += Utils.generateChars(4);
        +
        +    if (data.id != null) {
        +      id += '-' + data.id.toString();
        +    } else {
        +      id += '-' + Utils.generateChars(4);
        +    }
        +    return id;
        +  };
        +
        +  return BaseAdapter;
        +});
        +
        +S2.define('select2/data/select',[
        +  './base',
        +  '../utils',
        +  'jquery'
        +], function (BaseAdapter, Utils, $) {
        +  function SelectAdapter ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    SelectAdapter.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(SelectAdapter, BaseAdapter);
        +
        +  SelectAdapter.prototype.current = function (callback) {
        +    var data = [];
        +    var self = this;
        +
        +    this.$element.find(':selected').each(function () {
        +      var $option = $(this);
        +
        +      var option = self.item($option);
        +
        +      data.push(option);
        +    });
        +
        +    callback(data);
        +  };
        +
        +  SelectAdapter.prototype.select = function (data) {
        +    var self = this;
        +
        +    data.selected = true;
        +
        +    // If data.element is a DOM node, use it instead
        +    if ($(data.element).is('option')) {
        +      data.element.selected = true;
        +
        +      this.$element.trigger('change');
        +
        +      return;
        +    }
        +
        +    if (this.$element.prop('multiple')) {
        +      this.current(function (currentData) {
        +        var val = [];
        +
        +        data = [data];
        +        data.push.apply(data, currentData);
        +
        +        for (var d = 0; d < data.length; d++) {
        +          var id = data[d].id;
        +
        +          if ($.inArray(id, val) === -1) {
        +            val.push(id);
        +          }
        +        }
        +
        +        self.$element.val(val);
        +        self.$element.trigger('change');
        +      });
        +    } else {
        +      var val = data.id;
        +
        +      this.$element.val(val);
        +      this.$element.trigger('change');
        +    }
        +  };
        +
        +  SelectAdapter.prototype.unselect = function (data) {
        +    var self = this;
        +
        +    if (!this.$element.prop('multiple')) {
        +      return;
        +    }
        +
        +    data.selected = false;
        +
        +    if ($(data.element).is('option')) {
        +      data.element.selected = false;
        +
        +      this.$element.trigger('change');
        +
        +      return;
        +    }
        +
        +    this.current(function (currentData) {
        +      var val = [];
        +
        +      for (var d = 0; d < currentData.length; d++) {
        +        var id = currentData[d].id;
        +
        +        if (id !== data.id && $.inArray(id, val) === -1) {
        +          val.push(id);
        +        }
        +      }
        +
        +      self.$element.val(val);
        +
        +      self.$element.trigger('change');
        +    });
        +  };
        +
        +  SelectAdapter.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    this.container = container;
        +
        +    container.on('select', function (params) {
        +      self.select(params.data);
        +    });
        +
        +    container.on('unselect', function (params) {
        +      self.unselect(params.data);
        +    });
        +  };
        +
        +  SelectAdapter.prototype.destroy = function () {
        +    // Remove anything added to child elements
        +    this.$element.find('*').each(function () {
        +      // Remove any custom data set by Select2
        +      $.removeData(this, 'data');
        +    });
        +  };
        +
        +  SelectAdapter.prototype.query = function (params, callback) {
        +    var data = [];
        +    var self = this;
        +
        +    var $options = this.$element.children();
        +
        +    $options.each(function () {
        +      var $option = $(this);
        +
        +      if (!$option.is('option') && !$option.is('optgroup')) {
        +        return;
        +      }
        +
        +      var option = self.item($option);
        +
        +      var matches = self.matches(params, option);
        +
        +      if (matches !== null) {
        +        data.push(matches);
        +      }
        +    });
        +
        +    callback({
        +      results: data
        +    });
        +  };
        +
        +  SelectAdapter.prototype.addOptions = function ($options) {
        +    Utils.appendMany(this.$element, $options);
        +  };
        +
        +  SelectAdapter.prototype.option = function (data) {
        +    var option;
        +
        +    if (data.children) {
        +      option = document.createElement('optgroup');
        +      option.label = data.text;
        +    } else {
        +      option = document.createElement('option');
        +
        +      if (option.textContent !== undefined) {
        +        option.textContent = data.text;
        +      } else {
        +        option.innerText = data.text;
        +      }
        +    }
        +
        +    if (data.id) {
        +      option.value = data.id;
        +    }
        +
        +    if (data.disabled) {
        +      option.disabled = true;
        +    }
        +
        +    if (data.selected) {
        +      option.selected = true;
        +    }
        +
        +    if (data.title) {
        +      option.title = data.title;
        +    }
        +
        +    var $option = $(option);
        +
        +    var normalizedData = this._normalizeItem(data);
        +    normalizedData.element = option;
        +
        +    // Override the option's data with the combined data
        +    $.data(option, 'data', normalizedData);
        +
        +    return $option;
        +  };
        +
        +  SelectAdapter.prototype.item = function ($option) {
        +    var data = {};
        +
        +    data = $.data($option[0], 'data');
        +
        +    if (data != null) {
        +      return data;
        +    }
        +
        +    if ($option.is('option')) {
        +      data = {
        +        id: $option.val(),
        +        text: $option.text(),
        +        disabled: $option.prop('disabled'),
        +        selected: $option.prop('selected'),
        +        title: $option.prop('title')
        +      };
        +    } else if ($option.is('optgroup')) {
        +      data = {
        +        text: $option.prop('label'),
        +        children: [],
        +        title: $option.prop('title')
        +      };
        +
        +      var $children = $option.children('option');
        +      var children = [];
        +
        +      for (var c = 0; c < $children.length; c++) {
        +        var $child = $($children[c]);
        +
        +        var child = this.item($child);
        +
        +        children.push(child);
        +      }
        +
        +      data.children = children;
        +    }
        +
        +    data = this._normalizeItem(data);
        +    data.element = $option[0];
        +
        +    $.data($option[0], 'data', data);
        +
        +    return data;
        +  };
        +
        +  SelectAdapter.prototype._normalizeItem = function (item) {
        +    if (!$.isPlainObject(item)) {
        +      item = {
        +        id: item,
        +        text: item
        +      };
        +    }
        +
        +    item = $.extend({}, {
        +      text: ''
        +    }, item);
        +
        +    var defaults = {
        +      selected: false,
        +      disabled: false
        +    };
        +
        +    if (item.id != null) {
        +      item.id = item.id.toString();
        +    }
        +
        +    if (item.text != null) {
        +      item.text = item.text.toString();
        +    }
        +
        +    if (item._resultId == null && item.id && this.container != null) {
        +      item._resultId = this.generateResultId(this.container, item);
        +    }
        +
        +    return $.extend({}, defaults, item);
        +  };
        +
        +  SelectAdapter.prototype.matches = function (params, data) {
        +    var matcher = this.options.get('matcher');
        +
        +    return matcher(params, data);
        +  };
        +
        +  return SelectAdapter;
        +});
        +
        +S2.define('select2/data/array',[
        +  './select',
        +  '../utils',
        +  'jquery'
        +], function (SelectAdapter, Utils, $) {
        +  function ArrayAdapter ($element, options) {
        +    var data = options.get('data') || [];
        +
        +    ArrayAdapter.__super__.constructor.call(this, $element, options);
        +
        +    this.addOptions(this.convertToOptions(data));
        +  }
        +
        +  Utils.Extend(ArrayAdapter, SelectAdapter);
        +
        +  ArrayAdapter.prototype.select = function (data) {
        +    var $option = this.$element.find('option').filter(function (i, elm) {
        +      return elm.value == data.id.toString();
        +    });
        +
        +    if ($option.length === 0) {
        +      $option = this.option(data);
        +
        +      this.addOptions($option);
        +    }
        +
        +    ArrayAdapter.__super__.select.call(this, data);
        +  };
        +
        +  ArrayAdapter.prototype.convertToOptions = function (data) {
        +    var self = this;
        +
        +    var $existing = this.$element.find('option');
        +    var existingIds = $existing.map(function () {
        +      return self.item($(this)).id;
        +    }).get();
        +
        +    var $options = [];
        +
        +    // Filter out all items except for the one passed in the argument
        +    function onlyItem (item) {
        +      return function () {
        +        return $(this).val() == item.id;
        +      };
        +    }
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var item = this._normalizeItem(data[d]);
        +
        +      // Skip items which were pre-loaded, only merge the data
        +      if ($.inArray(item.id, existingIds) >= 0) {
        +        var $existingOption = $existing.filter(onlyItem(item));
        +
        +        var existingData = this.item($existingOption);
        +        var newData = $.extend(true, {}, item, existingData);
        +
        +        var $newOption = this.option(newData);
        +
        +        $existingOption.replaceWith($newOption);
        +
        +        continue;
        +      }
        +
        +      var $option = this.option(item);
        +
        +      if (item.children) {
        +        var $children = this.convertToOptions(item.children);
        +
        +        Utils.appendMany($option, $children);
        +      }
        +
        +      $options.push($option);
        +    }
        +
        +    return $options;
        +  };
        +
        +  return ArrayAdapter;
        +});
        +
        +S2.define('select2/data/ajax',[
        +  './array',
        +  '../utils',
        +  'jquery'
        +], function (ArrayAdapter, Utils, $) {
        +  function AjaxAdapter ($element, options) {
        +    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
        +
        +    if (this.ajaxOptions.processResults != null) {
        +      this.processResults = this.ajaxOptions.processResults;
        +    }
        +
        +    AjaxAdapter.__super__.constructor.call(this, $element, options);
        +  }
        +
        +  Utils.Extend(AjaxAdapter, ArrayAdapter);
        +
        +  AjaxAdapter.prototype._applyDefaults = function (options) {
        +    var defaults = {
        +      data: function (params) {
        +        return $.extend({}, params, {
        +          q: params.term
        +        });
        +      },
        +      transport: function (params, success, failure) {
        +        var $request = $.ajax(params);
        +
        +        $request.then(success);
        +        $request.fail(failure);
        +
        +        return $request;
        +      }
        +    };
        +
        +    return $.extend({}, defaults, options, true);
        +  };
        +
        +  AjaxAdapter.prototype.processResults = function (results) {
        +    return results;
        +  };
        +
        +  AjaxAdapter.prototype.query = function (params, callback) {
        +    var matches = [];
        +    var self = this;
        +
        +    if (this._request != null) {
        +      // JSONP requests cannot always be aborted
        +      if ($.isFunction(this._request.abort)) {
        +        this._request.abort();
        +      }
        +
        +      this._request = null;
        +    }
        +
        +    var options = $.extend({
        +      type: 'GET'
        +    }, this.ajaxOptions);
        +
        +    if (typeof options.url === 'function') {
        +      options.url = options.url.call(this.$element, params);
        +    }
        +
        +    if (typeof options.data === 'function') {
        +      options.data = options.data.call(this.$element, params);
        +    }
        +
        +    function request () {
        +      var $request = options.transport(options, function (data) {
        +        var results = self.processResults(data, params);
        +
        +        if (self.options.get('debug') && window.console && console.error) {
        +          // Check to make sure that the response included a `results` key.
        +          if (!results || !results.results || !$.isArray(results.results)) {
        +            console.error(
        +              'Select2: The AJAX results did not return an array in the ' +
        +              '`results` key of the response.'
        +            );
        +          }
        +        }
        +
        +        callback(results);
        +      }, function () {
        +        // Attempt to detect if a request was aborted
        +        // Only works if the transport exposes a status property
        +        if ($request.status && $request.status === '0') {
        +          return;
        +        }
        +
        +        self.trigger('results:message', {
        +          message: 'errorLoading'
        +        });
        +      });
        +
        +      self._request = $request;
        +    }
        +
        +    if (this.ajaxOptions.delay && params.term != null) {
        +      if (this._queryTimeout) {
        +        window.clearTimeout(this._queryTimeout);
        +      }
        +
        +      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
        +    } else {
        +      request();
        +    }
        +  };
        +
        +  return AjaxAdapter;
        +});
        +
        +S2.define('select2/data/tags',[
        +  'jquery'
        +], function ($) {
        +  function Tags (decorated, $element, options) {
        +    var tags = options.get('tags');
        +
        +    var createTag = options.get('createTag');
        +
        +    if (createTag !== undefined) {
        +      this.createTag = createTag;
        +    }
        +
        +    var insertTag = options.get('insertTag');
        +
        +    if (insertTag !== undefined) {
        +        this.insertTag = insertTag;
        +    }
        +
        +    decorated.call(this, $element, options);
        +
        +    if ($.isArray(tags)) {
        +      for (var t = 0; t < tags.length; t++) {
        +        var tag = tags[t];
        +        var item = this._normalizeItem(tag);
        +
        +        var $option = this.option(item);
        +
        +        this.$element.append($option);
        +      }
        +    }
        +  }
        +
        +  Tags.prototype.query = function (decorated, params, callback) {
        +    var self = this;
        +
        +    this._removeOldTags();
        +
        +    if (params.term == null || params.page != null) {
        +      decorated.call(this, params, callback);
        +      return;
        +    }
        +
        +    function wrapper (obj, child) {
        +      var data = obj.results;
        +
        +      for (var i = 0; i < data.length; i++) {
        +        var option = data[i];
        +
        +        var checkChildren = (
        +          option.children != null &&
        +          !wrapper({
        +            results: option.children
        +          }, true)
        +        );
        +
        +        var checkText = option.text === params.term;
        +
        +        if (checkText || checkChildren) {
        +          if (child) {
        +            return false;
        +          }
        +
        +          obj.data = data;
        +          callback(obj);
        +
        +          return;
        +        }
        +      }
        +
        +      if (child) {
        +        return true;
        +      }
        +
        +      var tag = self.createTag(params);
        +
        +      if (tag != null) {
        +        var $option = self.option(tag);
        +        $option.attr('data-select2-tag', true);
        +
        +        self.addOptions([$option]);
        +
        +        self.insertTag(data, tag);
        +      }
        +
        +      obj.results = data;
        +
        +      callback(obj);
        +    }
        +
        +    decorated.call(this, params, wrapper);
        +  };
        +
        +  Tags.prototype.createTag = function (decorated, params) {
        +    var term = $.trim(params.term);
        +
        +    if (term === '') {
        +      return null;
        +    }
        +
        +    return {
        +      id: term,
        +      text: term
        +    };
        +  };
        +
        +  Tags.prototype.insertTag = function (_, data, tag) {
        +    data.unshift(tag);
        +  };
        +
        +  Tags.prototype._removeOldTags = function (_) {
        +    var tag = this._lastTag;
        +
        +    var $options = this.$element.find('option[data-select2-tag]');
        +
        +    $options.each(function () {
        +      if (this.selected) {
        +        return;
        +      }
        +
        +      $(this).remove();
        +    });
        +  };
        +
        +  return Tags;
        +});
        +
        +S2.define('select2/data/tokenizer',[
        +  'jquery'
        +], function ($) {
        +  function Tokenizer (decorated, $element, options) {
        +    var tokenizer = options.get('tokenizer');
        +
        +    if (tokenizer !== undefined) {
        +      this.tokenizer = tokenizer;
        +    }
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Tokenizer.prototype.bind = function (decorated, container, $container) {
        +    decorated.call(this, container, $container);
        +
        +    this.$search =  container.dropdown.$search || container.selection.$search ||
        +      $container.find('.select2-search__field');
        +  };
        +
        +  Tokenizer.prototype.query = function (decorated, params, callback) {
        +    var self = this;
        +
        +    function createAndSelect (data) {
        +      // Normalize the data object so we can use it for checks
        +      var item = self._normalizeItem(data);
        +
        +      // Check if the data object already exists as a tag
        +      // Select it if it doesn't
        +      var $existingOptions = self.$element.find('option').filter(function () {
        +        return $(this).val() === item.id;
        +      });
        +
        +      // If an existing option wasn't found for it, create the option
        +      if (!$existingOptions.length) {
        +        var $option = self.option(item);
        +        $option.attr('data-select2-tag', true);
        +
        +        self._removeOldTags();
        +        self.addOptions([$option]);
        +      }
        +
        +      // Select the item, now that we know there is an option for it
        +      select(item);
        +    }
        +
        +    function select (data) {
        +      self.trigger('select', {
        +        data: data
        +      });
        +    }
        +
        +    params.term = params.term || '';
        +
        +    var tokenData = this.tokenizer(params, this.options, createAndSelect);
        +
        +    if (tokenData.term !== params.term) {
        +      // Replace the search term if we have the search box
        +      if (this.$search.length) {
        +        this.$search.val(tokenData.term);
        +        this.$search.focus();
        +      }
        +
        +      params.term = tokenData.term;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
        +    var separators = options.get('tokenSeparators') || [];
        +    var term = params.term;
        +    var i = 0;
        +
        +    var createTag = this.createTag || function (params) {
        +      return {
        +        id: params.term,
        +        text: params.term
        +      };
        +    };
        +
        +    while (i < term.length) {
        +      var termChar = term[i];
        +
        +      if ($.inArray(termChar, separators) === -1) {
        +        i++;
        +
        +        continue;
        +      }
        +
        +      var part = term.substr(0, i);
        +      var partParams = $.extend({}, params, {
        +        term: part
        +      });
        +
        +      var data = createTag(partParams);
        +
        +      if (data == null) {
        +        i++;
        +        continue;
        +      }
        +
        +      callback(data);
        +
        +      // Reset the term to not include the tokenized portion
        +      term = term.substr(i + 1) || '';
        +      i = 0;
        +    }
        +
        +    return {
        +      term: term
        +    };
        +  };
        +
        +  return Tokenizer;
        +});
        +
        +S2.define('select2/data/minimumInputLength',[
        +
        +], function () {
        +  function MinimumInputLength (decorated, $e, options) {
        +    this.minimumInputLength = options.get('minimumInputLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MinimumInputLength.prototype.query = function (decorated, params, callback) {
        +    params.term = params.term || '';
        +
        +    if (params.term.length < this.minimumInputLength) {
        +      this.trigger('results:message', {
        +        message: 'inputTooShort',
        +        args: {
        +          minimum: this.minimumInputLength,
        +          input: params.term,
        +          params: params
        +        }
        +      });
        +
        +      return;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  return MinimumInputLength;
        +});
        +
        +S2.define('select2/data/maximumInputLength',[
        +
        +], function () {
        +  function MaximumInputLength (decorated, $e, options) {
        +    this.maximumInputLength = options.get('maximumInputLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MaximumInputLength.prototype.query = function (decorated, params, callback) {
        +    params.term = params.term || '';
        +
        +    if (this.maximumInputLength > 0 &&
        +        params.term.length > this.maximumInputLength) {
        +      this.trigger('results:message', {
        +        message: 'inputTooLong',
        +        args: {
        +          maximum: this.maximumInputLength,
        +          input: params.term,
        +          params: params
        +        }
        +      });
        +
        +      return;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  return MaximumInputLength;
        +});
        +
        +S2.define('select2/data/maximumSelectionLength',[
        +
        +], function (){
        +  function MaximumSelectionLength (decorated, $e, options) {
        +    this.maximumSelectionLength = options.get('maximumSelectionLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MaximumSelectionLength.prototype.query =
        +    function (decorated, params, callback) {
        +      var self = this;
        +
        +      this.current(function (currentData) {
        +        var count = currentData != null ? currentData.length : 0;
        +        if (self.maximumSelectionLength > 0 &&
        +          count >= self.maximumSelectionLength) {
        +          self.trigger('results:message', {
        +            message: 'maximumSelected',
        +            args: {
        +              maximum: self.maximumSelectionLength
        +            }
        +          });
        +          return;
        +        }
        +        decorated.call(self, params, callback);
        +      });
        +  };
        +
        +  return MaximumSelectionLength;
        +});
        +
        +S2.define('select2/dropdown',[
        +  'jquery',
        +  './utils'
        +], function ($, Utils) {
        +  function Dropdown ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    Dropdown.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(Dropdown, Utils.Observable);
        +
        +  Dropdown.prototype.render = function () {
        +    var $dropdown = $(
        +      '<span class="select2-dropdown">' +
        +        '<span class="select2-results"></span>' +
        +      '</span>'
        +    );
        +
        +    $dropdown.attr('dir', this.options.get('dir'));
        +
        +    this.$dropdown = $dropdown;
        +
        +    return $dropdown;
        +  };
        +
        +  Dropdown.prototype.bind = function () {
        +    // Should be implemented in subclasses
        +  };
        +
        +  Dropdown.prototype.position = function ($dropdown, $container) {
        +    // Should be implmented in subclasses
        +  };
        +
        +  Dropdown.prototype.destroy = function () {
        +    // Remove the dropdown from the DOM
        +    this.$dropdown.remove();
        +  };
        +
        +  return Dropdown;
        +});
        +
        +S2.define('select2/dropdown/search',[
        +  'jquery',
        +  '../utils'
        +], function ($, Utils) {
        +  function Search () { }
        +
        +  Search.prototype.render = function (decorated) {
        +    var $rendered = decorated.call(this);
        +
        +    var $search = $(
        +      '<span class="select2-search select2-search--dropdown">' +
        +        '<input class="select2-search__field" type="search" tabindex="-1"' +
        +        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        +        ' spellcheck="false" role="textbox" />' +
        +      '</span>'
        +    );
        +
        +    this.$searchContainer = $search;
        +    this.$search = $search.find('input');
        +
        +    $rendered.prepend($search);
        +
        +    return $rendered;
        +  };
        +
        +  Search.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    this.$search.on('keydown', function (evt) {
        +      self.trigger('keypress', evt);
        +
        +      self._keyUpPrevented = evt.isDefaultPrevented();
        +    });
        +
        +    // Workaround for browsers which do not support the `input` event
        +    // This will prevent double-triggering of events for browsers which support
        +    // both the `keyup` and `input` events.
        +    this.$search.on('input', function (evt) {
        +      // Unbind the duplicated `keyup` event
        +      $(this).off('keyup');
        +    });
        +
        +    this.$search.on('keyup input', function (evt) {
        +      self.handleSearch(evt);
        +    });
        +
        +    container.on('open', function () {
        +      self.$search.attr('tabindex', 0);
        +
        +      self.$search.focus();
        +
        +      window.setTimeout(function () {
        +        self.$search.focus();
        +      }, 0);
        +    });
        +
        +    container.on('close', function () {
        +      self.$search.attr('tabindex', -1);
        +
        +      self.$search.val('');
        +    });
        +
        +    container.on('focus', function () {
        +      if (container.isOpen()) {
        +        self.$search.focus();
        +      }
        +    });
        +
        +    container.on('results:all', function (params) {
        +      if (params.query.term == null || params.query.term === '') {
        +        var showSearch = self.showSearch(params);
        +
        +        if (showSearch) {
        +          self.$searchContainer.removeClass('select2-search--hide');
        +        } else {
        +          self.$searchContainer.addClass('select2-search--hide');
        +        }
        +      }
        +    });
        +  };
        +
        +  Search.prototype.handleSearch = function (evt) {
        +    if (!this._keyUpPrevented) {
        +      var input = this.$search.val();
        +
        +      this.trigger('query', {
        +        term: input
        +      });
        +    }
        +
        +    this._keyUpPrevented = false;
        +  };
        +
        +  Search.prototype.showSearch = function (_, params) {
        +    return true;
        +  };
        +
        +  return Search;
        +});
        +
        +S2.define('select2/dropdown/hidePlaceholder',[
        +
        +], function () {
        +  function HidePlaceholder (decorated, $element, options, dataAdapter) {
        +    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +  }
        +
        +  HidePlaceholder.prototype.append = function (decorated, data) {
        +    data.results = this.removePlaceholder(data.results);
        +
        +    decorated.call(this, data);
        +  };
        +
        +  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
        +    if (typeof placeholder === 'string') {
        +      placeholder = {
        +        id: '',
        +        text: placeholder
        +      };
        +    }
        +
        +    return placeholder;
        +  };
        +
        +  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
        +    var modifiedData = data.slice(0);
        +
        +    for (var d = data.length - 1; d >= 0; d--) {
        +      var item = data[d];
        +
        +      if (this.placeholder.id === item.id) {
        +        modifiedData.splice(d, 1);
        +      }
        +    }
        +
        +    return modifiedData;
        +  };
        +
        +  return HidePlaceholder;
        +});
        +
        +S2.define('select2/dropdown/infiniteScroll',[
        +  'jquery'
        +], function ($) {
        +  function InfiniteScroll (decorated, $element, options, dataAdapter) {
        +    this.lastParams = {};
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +
        +    this.$loadingMore = this.createLoadingMore();
        +    this.loading = false;
        +  }
        +
        +  InfiniteScroll.prototype.append = function (decorated, data) {
        +    this.$loadingMore.remove();
        +    this.loading = false;
        +
        +    decorated.call(this, data);
        +
        +    if (this.showLoadingMore(data)) {
        +      this.$results.append(this.$loadingMore);
        +    }
        +  };
        +
        +  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('query', function (params) {
        +      self.lastParams = params;
        +      self.loading = true;
        +    });
        +
        +    container.on('query:append', function (params) {
        +      self.lastParams = params;
        +      self.loading = true;
        +    });
        +
        +    this.$results.on('scroll', function () {
        +      var isLoadMoreVisible = $.contains(
        +        document.documentElement,
        +        self.$loadingMore[0]
        +      );
        +
        +      if (self.loading || !isLoadMoreVisible) {
        +        return;
        +      }
        +
        +      var currentOffset = self.$results.offset().top +
        +        self.$results.outerHeight(false);
        +      var loadingMoreOffset = self.$loadingMore.offset().top +
        +        self.$loadingMore.outerHeight(false);
        +
        +      if (currentOffset + 50 >= loadingMoreOffset) {
        +        self.loadMore();
        +      }
        +    });
        +  };
        +
        +  InfiniteScroll.prototype.loadMore = function () {
        +    this.loading = true;
        +
        +    var params = $.extend({}, {page: 1}, this.lastParams);
        +
        +    params.page++;
        +
        +    this.trigger('query:append', params);
        +  };
        +
        +  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
        +    return data.pagination && data.pagination.more;
        +  };
        +
        +  InfiniteScroll.prototype.createLoadingMore = function () {
        +    var $option = $(
        +      '<li ' +
        +      'class="select2-results__option select2-results__option--load-more"' +
        +      'role="treeitem" aria-disabled="true"></li>'
        +    );
        +
        +    var message = this.options.get('translations').get('loadingMore');
        +
        +    $option.html(message(this.lastParams));
        +
        +    return $option;
        +  };
        +
        +  return InfiniteScroll;
        +});
        +
        +S2.define('select2/dropdown/attachBody',[
        +  'jquery',
        +  '../utils'
        +], function ($, Utils) {
        +  function AttachBody (decorated, $element, options) {
        +    this.$dropdownParent = options.get('dropdownParent') || $(document.body);
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  AttachBody.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    var setupResultsEvents = false;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('open', function () {
        +      self._showDropdown();
        +      self._attachPositioningHandler(container);
        +
        +      if (!setupResultsEvents) {
        +        setupResultsEvents = true;
        +
        +        container.on('results:all', function () {
        +          self._positionDropdown();
        +          self._resizeDropdown();
        +        });
        +
        +        container.on('results:append', function () {
        +          self._positionDropdown();
        +          self._resizeDropdown();
        +        });
        +      }
        +    });
        +
        +    container.on('close', function () {
        +      self._hideDropdown();
        +      self._detachPositioningHandler(container);
        +    });
        +
        +    this.$dropdownContainer.on('mousedown', function (evt) {
        +      evt.stopPropagation();
        +    });
        +  };
        +
        +  AttachBody.prototype.destroy = function (decorated) {
        +    decorated.call(this);
        +
        +    this.$dropdownContainer.remove();
        +  };
        +
        +  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
        +    // Clone all of the container classes
        +    $dropdown.attr('class', $container.attr('class'));
        +
        +    $dropdown.removeClass('select2');
        +    $dropdown.addClass('select2-container--open');
        +
        +    $dropdown.css({
        +      position: 'absolute',
        +      top: -999999
        +    });
        +
        +    this.$container = $container;
        +  };
        +
        +  AttachBody.prototype.render = function (decorated) {
        +    var $container = $('<span></span>');
        +
        +    var $dropdown = decorated.call(this);
        +    $container.append($dropdown);
        +
        +    this.$dropdownContainer = $container;
        +
        +    return $container;
        +  };
        +
        +  AttachBody.prototype._hideDropdown = function (decorated) {
        +    this.$dropdownContainer.detach();
        +  };
        +
        +  AttachBody.prototype._attachPositioningHandler =
        +      function (decorated, container) {
        +    var self = this;
        +
        +    var scrollEvent = 'scroll.select2.' + container.id;
        +    var resizeEvent = 'resize.select2.' + container.id;
        +    var orientationEvent = 'orientationchange.select2.' + container.id;
        +
        +    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        +    $watchers.each(function () {
        +      $(this).data('select2-scroll-position', {
        +        x: $(this).scrollLeft(),
        +        y: $(this).scrollTop()
        +      });
        +    });
        +
        +    $watchers.on(scrollEvent, function (ev) {
        +      var position = $(this).data('select2-scroll-position');
        +      $(this).scrollTop(position.y);
        +    });
        +
        +    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
        +      function (e) {
        +      self._positionDropdown();
        +      self._resizeDropdown();
        +    });
        +  };
        +
        +  AttachBody.prototype._detachPositioningHandler =
        +      function (decorated, container) {
        +    var scrollEvent = 'scroll.select2.' + container.id;
        +    var resizeEvent = 'resize.select2.' + container.id;
        +    var orientationEvent = 'orientationchange.select2.' + container.id;
        +
        +    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        +    $watchers.off(scrollEvent);
        +
        +    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
        +  };
        +
        +  AttachBody.prototype._positionDropdown = function () {
        +    var $window = $(window);
        +
        +    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
        +    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
        +
        +    var newDirection = null;
        +
        +    var offset = this.$container.offset();
        +
        +    offset.bottom = offset.top + this.$container.outerHeight(false);
        +
        +    var container = {
        +      height: this.$container.outerHeight(false)
        +    };
        +
        +    container.top = offset.top;
        +    container.bottom = offset.top + container.height;
        +
        +    var dropdown = {
        +      height: this.$dropdown.outerHeight(false)
        +    };
        +
        +    var viewport = {
        +      top: $window.scrollTop(),
        +      bottom: $window.scrollTop() + $window.height()
        +    };
        +
        +    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
        +    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
        +
        +    var css = {
        +      left: offset.left,
        +      top: container.bottom
        +    };
        +
        +    // Determine what the parent element is to use for calciulating the offset
        +    var $offsetParent = this.$dropdownParent;
        +
        +    // For statically positoned elements, we need to get the element
        +    // that is determining the offset
        +    if ($offsetParent.css('position') === 'static') {
        +      $offsetParent = $offsetParent.offsetParent();
        +    }
        +
        +    var parentOffset = $offsetParent.offset();
        +
        +    css.top -= parentOffset.top;
        +    css.left -= parentOffset.left;
        +
        +    if (!isCurrentlyAbove && !isCurrentlyBelow) {
        +      newDirection = 'below';
        +    }
        +
        +    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
        +      newDirection = 'above';
        +    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
        +      newDirection = 'below';
        +    }
        +
        +    if (newDirection == 'above' ||
        +      (isCurrentlyAbove && newDirection !== 'below')) {
        +      css.top = container.top - parentOffset.top - dropdown.height;
        +    }
        +
        +    if (newDirection != null) {
        +      this.$dropdown
        +        .removeClass('select2-dropdown--below select2-dropdown--above')
        +        .addClass('select2-dropdown--' + newDirection);
        +      this.$container
        +        .removeClass('select2-container--below select2-container--above')
        +        .addClass('select2-container--' + newDirection);
        +    }
        +
        +    this.$dropdownContainer.css(css);
        +  };
        +
        +  AttachBody.prototype._resizeDropdown = function () {
        +    var css = {
        +      width: this.$container.outerWidth(false) + 'px'
        +    };
        +
        +    if (this.options.get('dropdownAutoWidth')) {
        +      css.minWidth = css.width;
        +      css.position = 'relative';
        +      css.width = 'auto';
        +    }
        +
        +    this.$dropdown.css(css);
        +  };
        +
        +  AttachBody.prototype._showDropdown = function (decorated) {
        +    this.$dropdownContainer.appendTo(this.$dropdownParent);
        +
        +    this._positionDropdown();
        +    this._resizeDropdown();
        +  };
        +
        +  return AttachBody;
        +});
        +
        +S2.define('select2/dropdown/minimumResultsForSearch',[
        +
        +], function () {
        +  function countResults (data) {
        +    var count = 0;
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var item = data[d];
        +
        +      if (item.children) {
        +        count += countResults(item.children);
        +      } else {
        +        count++;
        +      }
        +    }
        +
        +    return count;
        +  }
        +
        +  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
        +    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
        +
        +    if (this.minimumResultsForSearch < 0) {
        +      this.minimumResultsForSearch = Infinity;
        +    }
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +  }
        +
        +  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
        +    if (countResults(params.data.results) < this.minimumResultsForSearch) {
        +      return false;
        +    }
        +
        +    return decorated.call(this, params);
        +  };
        +
        +  return MinimumResultsForSearch;
        +});
        +
        +S2.define('select2/dropdown/selectOnClose',[
        +
        +], function () {
        +  function SelectOnClose () { }
        +
        +  SelectOnClose.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('close', function (params) {
        +      self._handleSelectOnClose(params);
        +    });
        +  };
        +
        +  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
        +    if (params && params.originalSelect2Event != null) {
        +      var event = params.originalSelect2Event;
        +
        +      // Don't select an item if the close event was triggered from a select or
        +      // unselect event
        +      if (event._type === 'select' || event._type === 'unselect') {
        +        return;
        +      }
        +    }
        +
        +    var $highlightedResults = this.getHighlightedResults();
        +
        +    // Only select highlighted results
        +    if ($highlightedResults.length < 1) {
        +      return;
        +    }
        +
        +    var data = $highlightedResults.data('data');
        +
        +    // Don't re-select already selected resulte
        +    if (
        +      (data.element != null && data.element.selected) ||
        +      (data.element == null && data.selected)
        +    ) {
        +      return;
        +    }
        +
        +    this.trigger('select', {
        +        data: data
        +    });
        +  };
        +
        +  return SelectOnClose;
        +});
        +
        +S2.define('select2/dropdown/closeOnSelect',[
        +
        +], function () {
        +  function CloseOnSelect () { }
        +
        +  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('select', function (evt) {
        +      self._selectTriggered(evt);
        +    });
        +
        +    container.on('unselect', function (evt) {
        +      self._selectTriggered(evt);
        +    });
        +  };
        +
        +  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
        +    var originalEvent = evt.originalEvent;
        +
        +    // Don't close if the control key is being held
        +    if (originalEvent && originalEvent.ctrlKey) {
        +      return;
        +    }
        +
        +    this.trigger('close', {
        +      originalEvent: originalEvent,
        +      originalSelect2Event: evt
        +    });
        +  };
        +
        +  return CloseOnSelect;
        +});
        +
        +S2.define('select2/i18n/en',[],function () {
        +  // English
        +  return {
        +    errorLoading: function () {
        +      return 'The results could not be loaded.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Please delete ' + overChars + ' character';
        +
        +      if (overChars != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Please enter ' + remainingChars + ' or more characters';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Loading more results…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'You can only select ' + args.maximum + ' item';
        +
        +      if (args.maximum != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'No results found';
        +    },
        +    searching: function () {
        +      return 'Searching…';
        +    }
        +  };
        +});
        +
        +S2.define('select2/defaults',[
        +  'jquery',
        +  'require',
        +
        +  './results',
        +
        +  './selection/single',
        +  './selection/multiple',
        +  './selection/placeholder',
        +  './selection/allowClear',
        +  './selection/search',
        +  './selection/eventRelay',
        +
        +  './utils',
        +  './translation',
        +  './diacritics',
        +
        +  './data/select',
        +  './data/array',
        +  './data/ajax',
        +  './data/tags',
        +  './data/tokenizer',
        +  './data/minimumInputLength',
        +  './data/maximumInputLength',
        +  './data/maximumSelectionLength',
        +
        +  './dropdown',
        +  './dropdown/search',
        +  './dropdown/hidePlaceholder',
        +  './dropdown/infiniteScroll',
        +  './dropdown/attachBody',
        +  './dropdown/minimumResultsForSearch',
        +  './dropdown/selectOnClose',
        +  './dropdown/closeOnSelect',
        +
        +  './i18n/en'
        +], function ($, require,
        +
        +             ResultsList,
        +
        +             SingleSelection, MultipleSelection, Placeholder, AllowClear,
        +             SelectionSearch, EventRelay,
        +
        +             Utils, Translation, DIACRITICS,
        +
        +             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
        +             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
        +
        +             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
        +             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
        +
        +             EnglishTranslation) {
        +  function Defaults () {
        +    this.reset();
        +  }
        +
        +  Defaults.prototype.apply = function (options) {
        +    options = $.extend(true, {}, this.defaults, options);
        +
        +    if (options.dataAdapter == null) {
        +      if (options.ajax != null) {
        +        options.dataAdapter = AjaxData;
        +      } else if (options.data != null) {
        +        options.dataAdapter = ArrayData;
        +      } else {
        +        options.dataAdapter = SelectData;
        +      }
        +
        +      if (options.minimumInputLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MinimumInputLength
        +        );
        +      }
        +
        +      if (options.maximumInputLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MaximumInputLength
        +        );
        +      }
        +
        +      if (options.maximumSelectionLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MaximumSelectionLength
        +        );
        +      }
        +
        +      if (options.tags) {
        +        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
        +      }
        +
        +      if (options.tokenSeparators != null || options.tokenizer != null) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          Tokenizer
        +        );
        +      }
        +
        +      if (options.query != null) {
        +        var Query = require(options.amdBase + 'compat/query');
        +
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          Query
        +        );
        +      }
        +
        +      if (options.initSelection != null) {
        +        var InitSelection = require(options.amdBase + 'compat/initSelection');
        +
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          InitSelection
        +        );
        +      }
        +    }
        +
        +    if (options.resultsAdapter == null) {
        +      options.resultsAdapter = ResultsList;
        +
        +      if (options.ajax != null) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          InfiniteScroll
        +        );
        +      }
        +
        +      if (options.placeholder != null) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          HidePlaceholder
        +        );
        +      }
        +
        +      if (options.selectOnClose) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          SelectOnClose
        +        );
        +      }
        +    }
        +
        +    if (options.dropdownAdapter == null) {
        +      if (options.multiple) {
        +        options.dropdownAdapter = Dropdown;
        +      } else {
        +        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
        +
        +        options.dropdownAdapter = SearchableDropdown;
        +      }
        +
        +      if (options.minimumResultsForSearch !== 0) {
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          MinimumResultsForSearch
        +        );
        +      }
        +
        +      if (options.closeOnSelect) {
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          CloseOnSelect
        +        );
        +      }
        +
        +      if (
        +        options.dropdownCssClass != null ||
        +        options.dropdownCss != null ||
        +        options.adaptDropdownCssClass != null
        +      ) {
        +        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
        +
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          DropdownCSS
        +        );
        +      }
        +
        +      options.dropdownAdapter = Utils.Decorate(
        +        options.dropdownAdapter,
        +        AttachBody
        +      );
        +    }
        +
        +    if (options.selectionAdapter == null) {
        +      if (options.multiple) {
        +        options.selectionAdapter = MultipleSelection;
        +      } else {
        +        options.selectionAdapter = SingleSelection;
        +      }
        +
        +      // Add the placeholder mixin if a placeholder was specified
        +      if (options.placeholder != null) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          Placeholder
        +        );
        +      }
        +
        +      if (options.allowClear) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          AllowClear
        +        );
        +      }
        +
        +      if (options.multiple) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          SelectionSearch
        +        );
        +      }
        +
        +      if (
        +        options.containerCssClass != null ||
        +        options.containerCss != null ||
        +        options.adaptContainerCssClass != null
        +      ) {
        +        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
        +
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          ContainerCSS
        +        );
        +      }
        +
        +      options.selectionAdapter = Utils.Decorate(
        +        options.selectionAdapter,
        +        EventRelay
        +      );
        +    }
        +
        +    if (typeof options.language === 'string') {
        +      // Check if the language is specified with a region
        +      if (options.language.indexOf('-') > 0) {
        +        // Extract the region information if it is included
        +        var languageParts = options.language.split('-');
        +        var baseLanguage = languageParts[0];
        +
        +        options.language = [options.language, baseLanguage];
        +      } else {
        +        options.language = [options.language];
        +      }
        +    }
        +
        +    if ($.isArray(options.language)) {
        +      var languages = new Translation();
        +      options.language.push('en');
        +
        +      var languageNames = options.language;
        +
        +      for (var l = 0; l < languageNames.length; l++) {
        +        var name = languageNames[l];
        +        var language = {};
        +
        +        try {
        +          // Try to load it with the original name
        +          language = Translation.loadPath(name);
        +        } catch (e) {
        +          try {
        +            // If we couldn't load it, check if it wasn't the full path
        +            name = this.defaults.amdLanguageBase + name;
        +            language = Translation.loadPath(name);
        +          } catch (ex) {
        +            // The translation could not be loaded at all. Sometimes this is
        +            // because of a configuration problem, other times this can be
        +            // because of how Select2 helps load all possible translation files.
        +            if (options.debug && window.console && console.warn) {
        +              console.warn(
        +                'Select2: The language file for "' + name + '" could not be ' +
        +                'automatically loaded. A fallback will be used instead.'
        +              );
        +            }
        +
        +            continue;
        +          }
        +        }
        +
        +        languages.extend(language);
        +      }
        +
        +      options.translations = languages;
        +    } else {
        +      var baseTranslation = Translation.loadPath(
        +        this.defaults.amdLanguageBase + 'en'
        +      );
        +      var customTranslation = new Translation(options.language);
        +
        +      customTranslation.extend(baseTranslation);
        +
        +      options.translations = customTranslation;
        +    }
        +
        +    return options;
        +  };
        +
        +  Defaults.prototype.reset = function () {
        +    function stripDiacritics (text) {
        +      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
        +      function match(a) {
        +        return DIACRITICS[a] || a;
        +      }
        +
        +      return text.replace(/[^\u0000-\u007E]/g, match);
        +    }
        +
        +    function matcher (params, data) {
        +      // Always return the object if there is nothing to compare
        +      if ($.trim(params.term) === '') {
        +        return data;
        +      }
        +
        +      // Do a recursive check for options with children
        +      if (data.children && data.children.length > 0) {
        +        // Clone the data object if there are children
        +        // This is required as we modify the object to remove any non-matches
        +        var match = $.extend(true, {}, data);
        +
        +        // Check each child of the option
        +        for (var c = data.children.length - 1; c >= 0; c--) {
        +          var child = data.children[c];
        +
        +          var matches = matcher(params, child);
        +
        +          // If there wasn't a match, remove the object in the array
        +          if (matches == null) {
        +            match.children.splice(c, 1);
        +          }
        +        }
        +
        +        // If any children matched, return the new object
        +        if (match.children.length > 0) {
        +          return match;
        +        }
        +
        +        // If there were no matching children, check just the plain object
        +        return matcher(params, match);
        +      }
        +
        +      var original = stripDiacritics(data.text).toUpperCase();
        +      var term = stripDiacritics(params.term).toUpperCase();
        +
        +      // Check if the text contains the term
        +      if (original.indexOf(term) > -1) {
        +        return data;
        +      }
        +
        +      // If it doesn't contain the term, don't return anything
        +      return null;
        +    }
        +
        +    this.defaults = {
        +      amdBase: './',
        +      amdLanguageBase: './i18n/',
        +      closeOnSelect: true,
        +      debug: false,
        +      dropdownAutoWidth: false,
        +      escapeMarkup: Utils.escapeMarkup,
        +      language: EnglishTranslation,
        +      matcher: matcher,
        +      minimumInputLength: 0,
        +      maximumInputLength: 0,
        +      maximumSelectionLength: 0,
        +      minimumResultsForSearch: 0,
        +      selectOnClose: false,
        +      sorter: function (data) {
        +        return data;
        +      },
        +      templateResult: function (result) {
        +        return result.text;
        +      },
        +      templateSelection: function (selection) {
        +        return selection.text;
        +      },
        +      theme: 'default',
        +      width: 'resolve'
        +    };
        +  };
        +
        +  Defaults.prototype.set = function (key, value) {
        +    var camelKey = $.camelCase(key);
        +
        +    var data = {};
        +    data[camelKey] = value;
        +
        +    var convertedData = Utils._convertData(data);
        +
        +    $.extend(this.defaults, convertedData);
        +  };
        +
        +  var defaults = new Defaults();
        +
        +  return defaults;
        +});
        +
        +S2.define('select2/options',[
        +  'require',
        +  'jquery',
        +  './defaults',
        +  './utils'
        +], function (require, $, Defaults, Utils) {
        +  function Options (options, $element) {
        +    this.options = options;
        +
        +    if ($element != null) {
        +      this.fromElement($element);
        +    }
        +
        +    this.options = Defaults.apply(this.options);
        +
        +    if ($element && $element.is('input')) {
        +      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
        +
        +      this.options.dataAdapter = Utils.Decorate(
        +        this.options.dataAdapter,
        +        InputCompat
        +      );
        +    }
        +  }
        +
        +  Options.prototype.fromElement = function ($e) {
        +    var excludedData = ['select2'];
        +
        +    if (this.options.multiple == null) {
        +      this.options.multiple = $e.prop('multiple');
        +    }
        +
        +    if (this.options.disabled == null) {
        +      this.options.disabled = $e.prop('disabled');
        +    }
        +
        +    if (this.options.language == null) {
        +      if ($e.prop('lang')) {
        +        this.options.language = $e.prop('lang').toLowerCase();
        +      } else if ($e.closest('[lang]').prop('lang')) {
        +        this.options.language = $e.closest('[lang]').prop('lang');
        +      }
        +    }
        +
        +    if (this.options.dir == null) {
        +      if ($e.prop('dir')) {
        +        this.options.dir = $e.prop('dir');
        +      } else if ($e.closest('[dir]').prop('dir')) {
        +        this.options.dir = $e.closest('[dir]').prop('dir');
        +      } else {
        +        this.options.dir = 'ltr';
        +      }
        +    }
        +
        +    $e.prop('disabled', this.options.disabled);
        +    $e.prop('multiple', this.options.multiple);
        +
        +    if ($e.data('select2Tags')) {
        +      if (this.options.debug && window.console && console.warn) {
        +        console.warn(
        +          'Select2: The `data-select2-tags` attribute has been changed to ' +
        +          'use the `data-data` and `data-tags="true"` attributes and will be ' +
        +          'removed in future versions of Select2.'
        +        );
        +      }
        +
        +      $e.data('data', $e.data('select2Tags'));
        +      $e.data('tags', true);
        +    }
        +
        +    if ($e.data('ajaxUrl')) {
        +      if (this.options.debug && window.console && console.warn) {
        +        console.warn(
        +          'Select2: The `data-ajax-url` attribute has been changed to ' +
        +          '`data-ajax--url` and support for the old attribute will be removed' +
        +          ' in future versions of Select2.'
        +        );
        +      }
        +
        +      $e.attr('ajax--url', $e.data('ajaxUrl'));
        +      $e.data('ajax--url', $e.data('ajaxUrl'));
        +    }
        +
        +    var dataset = {};
        +
        +    // Prefer the element's `dataset` attribute if it exists
        +    // jQuery 1.x does not correctly handle data attributes with multiple dashes
        +    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
        +      dataset = $.extend(true, {}, $e[0].dataset, $e.data());
        +    } else {
        +      dataset = $e.data();
        +    }
        +
        +    var data = $.extend(true, {}, dataset);
        +
        +    data = Utils._convertData(data);
        +
        +    for (var key in data) {
        +      if ($.inArray(key, excludedData) > -1) {
        +        continue;
        +      }
        +
        +      if ($.isPlainObject(this.options[key])) {
        +        $.extend(this.options[key], data[key]);
        +      } else {
        +        this.options[key] = data[key];
        +      }
        +    }
        +
        +    return this;
        +  };
        +
        +  Options.prototype.get = function (key) {
        +    return this.options[key];
        +  };
        +
        +  Options.prototype.set = function (key, val) {
        +    this.options[key] = val;
        +  };
        +
        +  return Options;
        +});
        +
        +S2.define('select2/core',[
        +  'jquery',
        +  './options',
        +  './utils',
        +  './keys'
        +], function ($, Options, Utils, KEYS) {
        +  var Select2 = function ($element, options) {
        +    if ($element.data('select2') != null) {
        +      $element.data('select2').destroy();
        +    }
        +
        +    this.$element = $element;
        +
        +    this.id = this._generateId($element);
        +
        +    options = options || {};
        +
        +    this.options = new Options(options, $element);
        +
        +    Select2.__super__.constructor.call(this);
        +
        +    // Set up the tabindex
        +
        +    var tabindex = $element.attr('tabindex') || 0;
        +    $element.data('old-tabindex', tabindex);
        +    $element.attr('tabindex', '-1');
        +
        +    // Set up containers and adapters
        +
        +    var DataAdapter = this.options.get('dataAdapter');
        +    this.dataAdapter = new DataAdapter($element, this.options);
        +
        +    var $container = this.render();
        +
        +    this._placeContainer($container);
        +
        +    var SelectionAdapter = this.options.get('selectionAdapter');
        +    this.selection = new SelectionAdapter($element, this.options);
        +    this.$selection = this.selection.render();
        +
        +    this.selection.position(this.$selection, $container);
        +
        +    var DropdownAdapter = this.options.get('dropdownAdapter');
        +    this.dropdown = new DropdownAdapter($element, this.options);
        +    this.$dropdown = this.dropdown.render();
        +
        +    this.dropdown.position(this.$dropdown, $container);
        +
        +    var ResultsAdapter = this.options.get('resultsAdapter');
        +    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
        +    this.$results = this.results.render();
        +
        +    this.results.position(this.$results, this.$dropdown);
        +
        +    // Bind events
        +
        +    var self = this;
        +
        +    // Bind the container to all of the adapters
        +    this._bindAdapters();
        +
        +    // Register any DOM event handlers
        +    this._registerDomEvents();
        +
        +    // Register any internal event handlers
        +    this._registerDataEvents();
        +    this._registerSelectionEvents();
        +    this._registerDropdownEvents();
        +    this._registerResultsEvents();
        +    this._registerEvents();
        +
        +    // Set the initial state
        +    this.dataAdapter.current(function (initialData) {
        +      self.trigger('selection:update', {
        +        data: initialData
        +      });
        +    });
        +
        +    // Hide the original select
        +    $element.addClass('select2-hidden-accessible');
        +    $element.attr('aria-hidden', 'true');
        +
        +    // Synchronize any monitored attributes
        +    this._syncAttributes();
        +
        +    $element.data('select2', this);
        +  };
        +
        +  Utils.Extend(Select2, Utils.Observable);
        +
        +  Select2.prototype._generateId = function ($element) {
        +    var id = '';
        +
        +    if ($element.attr('id') != null) {
        +      id = $element.attr('id');
        +    } else if ($element.attr('name') != null) {
        +      id = $element.attr('name') + '-' + Utils.generateChars(2);
        +    } else {
        +      id = Utils.generateChars(4);
        +    }
        +
        +    id = id.replace(/(:|\.|\[|\]|,)/g, '');
        +    id = 'select2-' + id;
        +
        +    return id;
        +  };
        +
        +  Select2.prototype._placeContainer = function ($container) {
        +    $container.insertAfter(this.$element);
        +
        +    var width = this._resolveWidth(this.$element, this.options.get('width'));
        +
        +    if (width != null) {
        +      $container.css('width', width);
        +    }
        +  };
        +
        +  Select2.prototype._resolveWidth = function ($element, method) {
        +    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
        +
        +    if (method == 'resolve') {
        +      var styleWidth = this._resolveWidth($element, 'style');
        +
        +      if (styleWidth != null) {
        +        return styleWidth;
        +      }
        +
        +      return this._resolveWidth($element, 'element');
        +    }
        +
        +    if (method == 'element') {
        +      var elementWidth = $element.outerWidth(false);
        +
        +      if (elementWidth <= 0) {
        +        return 'auto';
        +      }
        +
        +      return elementWidth + 'px';
        +    }
        +
        +    if (method == 'style') {
        +      var style = $element.attr('style');
        +
        +      if (typeof(style) !== 'string') {
        +        return null;
        +      }
        +
        +      var attrs = style.split(';');
        +
        +      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
        +        var attr = attrs[i].replace(/\s/g, '');
        +        var matches = attr.match(WIDTH);
        +
        +        if (matches !== null && matches.length >= 1) {
        +          return matches[1];
        +        }
        +      }
        +
        +      return null;
        +    }
        +
        +    return method;
        +  };
        +
        +  Select2.prototype._bindAdapters = function () {
        +    this.dataAdapter.bind(this, this.$container);
        +    this.selection.bind(this, this.$container);
        +
        +    this.dropdown.bind(this, this.$container);
        +    this.results.bind(this, this.$container);
        +  };
        +
        +  Select2.prototype._registerDomEvents = function () {
        +    var self = this;
        +
        +    this.$element.on('change.select2', function () {
        +      self.dataAdapter.current(function (data) {
        +        self.trigger('selection:update', {
        +          data: data
        +        });
        +      });
        +    });
        +
        +    this.$element.on('focus.select2', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this._syncA = Utils.bind(this._syncAttributes, this);
        +    this._syncS = Utils.bind(this._syncSubtree, this);
        +
        +    if (this.$element[0].attachEvent) {
        +      this.$element[0].attachEvent('onpropertychange', this._syncA);
        +    }
        +
        +    var observer = window.MutationObserver ||
        +      window.WebKitMutationObserver ||
        +      window.MozMutationObserver
        +    ;
        +
        +    if (observer != null) {
        +      this._observer = new observer(function (mutations) {
        +        $.each(mutations, self._syncA);
        +        $.each(mutations, self._syncS);
        +      });
        +      this._observer.observe(this.$element[0], {
        +        attributes: true,
        +        childList: true,
        +        subtree: false
        +      });
        +    } else if (this.$element[0].addEventListener) {
        +      this.$element[0].addEventListener(
        +        'DOMAttrModified',
        +        self._syncA,
        +        false
        +      );
        +      this.$element[0].addEventListener(
        +        'DOMNodeInserted',
        +        self._syncS,
        +        false
        +      );
        +      this.$element[0].addEventListener(
        +        'DOMNodeRemoved',
        +        self._syncS,
        +        false
        +      );
        +    }
        +  };
        +
        +  Select2.prototype._registerDataEvents = function () {
        +    var self = this;
        +
        +    this.dataAdapter.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerSelectionEvents = function () {
        +    var self = this;
        +    var nonRelayEvents = ['toggle', 'focus'];
        +
        +    this.selection.on('toggle', function () {
        +      self.toggleDropdown();
        +    });
        +
        +    this.selection.on('focus', function (params) {
        +      self.focus(params);
        +    });
        +
        +    this.selection.on('*', function (name, params) {
        +      if ($.inArray(name, nonRelayEvents) !== -1) {
        +        return;
        +      }
        +
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerDropdownEvents = function () {
        +    var self = this;
        +
        +    this.dropdown.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerResultsEvents = function () {
        +    var self = this;
        +
        +    this.results.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerEvents = function () {
        +    var self = this;
        +
        +    this.on('open', function () {
        +      self.$container.addClass('select2-container--open');
        +    });
        +
        +    this.on('close', function () {
        +      self.$container.removeClass('select2-container--open');
        +    });
        +
        +    this.on('enable', function () {
        +      self.$container.removeClass('select2-container--disabled');
        +    });
        +
        +    this.on('disable', function () {
        +      self.$container.addClass('select2-container--disabled');
        +    });
        +
        +    this.on('blur', function () {
        +      self.$container.removeClass('select2-container--focus');
        +    });
        +
        +    this.on('query', function (params) {
        +      if (!self.isOpen()) {
        +        self.trigger('open', {});
        +      }
        +
        +      this.dataAdapter.query(params, function (data) {
        +        self.trigger('results:all', {
        +          data: data,
        +          query: params
        +        });
        +      });
        +    });
        +
        +    this.on('query:append', function (params) {
        +      this.dataAdapter.query(params, function (data) {
        +        self.trigger('results:append', {
        +          data: data,
        +          query: params
        +        });
        +      });
        +    });
        +
        +    this.on('keypress', function (evt) {
        +      var key = evt.which;
        +
        +      if (self.isOpen()) {
        +        if (key === KEYS.ESC || key === KEYS.TAB ||
        +            (key === KEYS.UP && evt.altKey)) {
        +          self.close();
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.ENTER) {
        +          self.trigger('results:select', {});
        +
        +          evt.preventDefault();
        +        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
        +          self.trigger('results:toggle', {});
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.UP) {
        +          self.trigger('results:previous', {});
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.DOWN) {
        +          self.trigger('results:next', {});
        +
        +          evt.preventDefault();
        +        }
        +      } else {
        +        if (key === KEYS.ENTER || key === KEYS.SPACE ||
        +            (key === KEYS.DOWN && evt.altKey)) {
        +          self.open();
        +
        +          evt.preventDefault();
        +        }
        +      }
        +    });
        +  };
        +
        +  Select2.prototype._syncAttributes = function () {
        +    this.options.set('disabled', this.$element.prop('disabled'));
        +
        +    if (this.options.get('disabled')) {
        +      if (this.isOpen()) {
        +        this.close();
        +      }
        +
        +      this.trigger('disable', {});
        +    } else {
        +      this.trigger('enable', {});
        +    }
        +  };
        +
        +  Select2.prototype._syncSubtree = function (evt, mutations) {
        +    var changed = false;
        +    var self = this;
        +
        +    // Ignore any mutation events raised for elements that aren't options or
        +    // optgroups. This handles the case when the select element is destroyed
        +    if (
        +      evt && evt.target && (
        +        evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
        +      )
        +    ) {
        +      return;
        +    }
        +
        +    if (!mutations) {
        +      // If mutation events aren't supported, then we can only assume that the
        +      // change affected the selections
        +      changed = true;
        +    } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
        +      for (var n = 0; n < mutations.addedNodes.length; n++) {
        +        var node = mutations.addedNodes[n];
        +
        +        if (node.selected) {
        +          changed = true;
        +        }
        +      }
        +    } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
        +      changed = true;
        +    }
        +
        +    // Only re-pull the data if we think there is a change
        +    if (changed) {
        +      this.dataAdapter.current(function (currentData) {
        +        self.trigger('selection:update', {
        +          data: currentData
        +        });
        +      });
        +    }
        +  };
        +
        +  /**
        +   * Override the trigger method to automatically trigger pre-events when
        +   * there are events that can be prevented.
        +   */
        +  Select2.prototype.trigger = function (name, args) {
        +    var actualTrigger = Select2.__super__.trigger;
        +    var preTriggerMap = {
        +      'open': 'opening',
        +      'close': 'closing',
        +      'select': 'selecting',
        +      'unselect': 'unselecting'
        +    };
        +
        +    if (args === undefined) {
        +      args = {};
        +    }
        +
        +    if (name in preTriggerMap) {
        +      var preTriggerName = preTriggerMap[name];
        +      var preTriggerArgs = {
        +        prevented: false,
        +        name: name,
        +        args: args
        +      };
        +
        +      actualTrigger.call(this, preTriggerName, preTriggerArgs);
        +
        +      if (preTriggerArgs.prevented) {
        +        args.prevented = true;
        +
        +        return;
        +      }
        +    }
        +
        +    actualTrigger.call(this, name, args);
        +  };
        +
        +  Select2.prototype.toggleDropdown = function () {
        +    if (this.options.get('disabled')) {
        +      return;
        +    }
        +
        +    if (this.isOpen()) {
        +      this.close();
        +    } else {
        +      this.open();
        +    }
        +  };
        +
        +  Select2.prototype.open = function () {
        +    if (this.isOpen()) {
        +      return;
        +    }
        +
        +    this.trigger('query', {});
        +  };
        +
        +  Select2.prototype.close = function () {
        +    if (!this.isOpen()) {
        +      return;
        +    }
        +
        +    this.trigger('close', {});
        +  };
        +
        +  Select2.prototype.isOpen = function () {
        +    return this.$container.hasClass('select2-container--open');
        +  };
        +
        +  Select2.prototype.hasFocus = function () {
        +    return this.$container.hasClass('select2-container--focus');
        +  };
        +
        +  Select2.prototype.focus = function (data) {
        +    // No need to re-trigger focus events if we are already focused
        +    if (this.hasFocus()) {
        +      return;
        +    }
        +
        +    this.$container.addClass('select2-container--focus');
        +    this.trigger('focus', {});
        +  };
        +
        +  Select2.prototype.enable = function (args) {
        +    if (this.options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `select2("enable")` method has been deprecated and will' +
        +        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
        +        ' instead.'
        +      );
        +    }
        +
        +    if (args == null || args.length === 0) {
        +      args = [true];
        +    }
        +
        +    var disabled = !args[0];
        +
        +    this.$element.prop('disabled', disabled);
        +  };
        +
        +  Select2.prototype.data = function () {
        +    if (this.options.get('debug') &&
        +        arguments.length > 0 && window.console && console.warn) {
        +      console.warn(
        +        'Select2: Data can no longer be set using `select2("data")`. You ' +
        +        'should consider setting the value instead using `$element.val()`.'
        +      );
        +    }
        +
        +    var data = [];
        +
        +    this.dataAdapter.current(function (currentData) {
        +      data = currentData;
        +    });
        +
        +    return data;
        +  };
        +
        +  Select2.prototype.val = function (args) {
        +    if (this.options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `select2("val")` method has been deprecated and will be' +
        +        ' removed in later Select2 versions. Use $element.val() instead.'
        +      );
        +    }
        +
        +    if (args == null || args.length === 0) {
        +      return this.$element.val();
        +    }
        +
        +    var newVal = args[0];
        +
        +    if ($.isArray(newVal)) {
        +      newVal = $.map(newVal, function (obj) {
        +        return obj.toString();
        +      });
        +    }
        +
        +    this.$element.val(newVal).trigger('change');
        +  };
        +
        +  Select2.prototype.destroy = function () {
        +    this.$container.remove();
        +
        +    if (this.$element[0].detachEvent) {
        +      this.$element[0].detachEvent('onpropertychange', this._syncA);
        +    }
        +
        +    if (this._observer != null) {
        +      this._observer.disconnect();
        +      this._observer = null;
        +    } else if (this.$element[0].removeEventListener) {
        +      this.$element[0]
        +        .removeEventListener('DOMAttrModified', this._syncA, false);
        +      this.$element[0]
        +        .removeEventListener('DOMNodeInserted', this._syncS, false);
        +      this.$element[0]
        +        .removeEventListener('DOMNodeRemoved', this._syncS, false);
        +    }
        +
        +    this._syncA = null;
        +    this._syncS = null;
        +
        +    this.$element.off('.select2');
        +    this.$element.attr('tabindex', this.$element.data('old-tabindex'));
        +
        +    this.$element.removeClass('select2-hidden-accessible');
        +    this.$element.attr('aria-hidden', 'false');
        +    this.$element.removeData('select2');
        +
        +    this.dataAdapter.destroy();
        +    this.selection.destroy();
        +    this.dropdown.destroy();
        +    this.results.destroy();
        +
        +    this.dataAdapter = null;
        +    this.selection = null;
        +    this.dropdown = null;
        +    this.results = null;
        +  };
        +
        +  Select2.prototype.render = function () {
        +    var $container = $(
        +      '<span class="select2 select2-container">' +
        +        '<span class="selection"></span>' +
        +        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
        +      '</span>'
        +    );
        +
        +    $container.attr('dir', this.options.get('dir'));
        +
        +    this.$container = $container;
        +
        +    this.$container.addClass('select2-container--' + this.options.get('theme'));
        +
        +    $container.data('element', this.$element);
        +
        +    return $container;
        +  };
        +
        +  return Select2;
        +});
        +
        +S2.define('select2/compat/utils',[
        +  'jquery'
        +], function ($) {
        +  function syncCssClasses ($dest, $src, adapter) {
        +    var classes, replacements = [], adapted;
        +
        +    classes = $.trim($dest.attr('class'));
        +
        +    if (classes) {
        +      classes = '' + classes; // for IE which returns object
        +
        +      $(classes.split(/\s+/)).each(function () {
        +        // Save all Select2 classes
        +        if (this.indexOf('select2-') === 0) {
        +          replacements.push(this);
        +        }
        +      });
        +    }
        +
        +    classes = $.trim($src.attr('class'));
        +
        +    if (classes) {
        +      classes = '' + classes; // for IE which returns object
        +
        +      $(classes.split(/\s+/)).each(function () {
        +        // Only adapt non-Select2 classes
        +        if (this.indexOf('select2-') !== 0) {
        +          adapted = adapter(this);
        +
        +          if (adapted != null) {
        +            replacements.push(adapted);
        +          }
        +        }
        +      });
        +    }
        +
        +    $dest.attr('class', replacements.join(' '));
        +  }
        +
        +  return {
        +    syncCssClasses: syncCssClasses
        +  };
        +});
        +
        +S2.define('select2/compat/containerCss',[
        +  'jquery',
        +  './utils'
        +], function ($, CompatUtils) {
        +  // No-op CSS adapter that discards all classes by default
        +  function _containerAdapter (clazz) {
        +    return null;
        +  }
        +
        +  function ContainerCSS () { }
        +
        +  ContainerCSS.prototype.render = function (decorated) {
        +    var $container = decorated.call(this);
        +
        +    var containerCssClass = this.options.get('containerCssClass') || '';
        +
        +    if ($.isFunction(containerCssClass)) {
        +      containerCssClass = containerCssClass(this.$element);
        +    }
        +
        +    var containerCssAdapter = this.options.get('adaptContainerCssClass');
        +    containerCssAdapter = containerCssAdapter || _containerAdapter;
        +
        +    if (containerCssClass.indexOf(':all:') !== -1) {
        +      containerCssClass = containerCssClass.replace(':all:', '');
        +
        +      var _cssAdapter = containerCssAdapter;
        +
        +      containerCssAdapter = function (clazz) {
        +        var adapted = _cssAdapter(clazz);
        +
        +        if (adapted != null) {
        +          // Append the old one along with the adapted one
        +          return adapted + ' ' + clazz;
        +        }
        +
        +        return clazz;
        +      };
        +    }
        +
        +    var containerCss = this.options.get('containerCss') || {};
        +
        +    if ($.isFunction(containerCss)) {
        +      containerCss = containerCss(this.$element);
        +    }
        +
        +    CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);
        +
        +    $container.css(containerCss);
        +    $container.addClass(containerCssClass);
        +
        +    return $container;
        +  };
        +
        +  return ContainerCSS;
        +});
        +
        +S2.define('select2/compat/dropdownCss',[
        +  'jquery',
        +  './utils'
        +], function ($, CompatUtils) {
        +  // No-op CSS adapter that discards all classes by default
        +  function _dropdownAdapter (clazz) {
        +    return null;
        +  }
        +
        +  function DropdownCSS () { }
        +
        +  DropdownCSS.prototype.render = function (decorated) {
        +    var $dropdown = decorated.call(this);
        +
        +    var dropdownCssClass = this.options.get('dropdownCssClass') || '';
        +
        +    if ($.isFunction(dropdownCssClass)) {
        +      dropdownCssClass = dropdownCssClass(this.$element);
        +    }
        +
        +    var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');
        +    dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;
        +
        +    if (dropdownCssClass.indexOf(':all:') !== -1) {
        +      dropdownCssClass = dropdownCssClass.replace(':all:', '');
        +
        +      var _cssAdapter = dropdownCssAdapter;
        +
        +      dropdownCssAdapter = function (clazz) {
        +        var adapted = _cssAdapter(clazz);
        +
        +        if (adapted != null) {
        +          // Append the old one along with the adapted one
        +          return adapted + ' ' + clazz;
        +        }
        +
        +        return clazz;
        +      };
        +    }
        +
        +    var dropdownCss = this.options.get('dropdownCss') || {};
        +
        +    if ($.isFunction(dropdownCss)) {
        +      dropdownCss = dropdownCss(this.$element);
        +    }
        +
        +    CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);
        +
        +    $dropdown.css(dropdownCss);
        +    $dropdown.addClass(dropdownCssClass);
        +
        +    return $dropdown;
        +  };
        +
        +  return DropdownCSS;
        +});
        +
        +S2.define('select2/compat/initSelection',[
        +  'jquery'
        +], function ($) {
        +  function InitSelection (decorated, $element, options) {
        +    if (options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `initSelection` option has been deprecated in favor' +
        +        ' of a custom data adapter that overrides the `current` method. ' +
        +        'This method is now called multiple times instead of a single ' +
        +        'time when the instance is initialized. Support will be removed ' +
        +        'for the `initSelection` option in future versions of Select2'
        +      );
        +    }
        +
        +    this.initSelection = options.get('initSelection');
        +    this._isInitialized = false;
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  InitSelection.prototype.current = function (decorated, callback) {
        +    var self = this;
        +
        +    if (this._isInitialized) {
        +      decorated.call(this, callback);
        +
        +      return;
        +    }
        +
        +    this.initSelection.call(null, this.$element, function (data) {
        +      self._isInitialized = true;
        +
        +      if (!$.isArray(data)) {
        +        data = [data];
        +      }
        +
        +      callback(data);
        +    });
        +  };
        +
        +  return InitSelection;
        +});
        +
        +S2.define('select2/compat/inputData',[
        +  'jquery'
        +], function ($) {
        +  function InputData (decorated, $element, options) {
        +    this._currentData = [];
        +    this._valueSeparator = options.get('valueSeparator') || ',';
        +
        +    if ($element.prop('type') === 'hidden') {
        +      if (options.get('debug') && console && console.warn) {
        +        console.warn(
        +          'Select2: Using a hidden input with Select2 is no longer ' +
        +          'supported and may stop working in the future. It is recommended ' +
        +          'to use a `<select>` element instead.'
        +        );
        +      }
        +    }
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  InputData.prototype.current = function (_, callback) {
        +    function getSelected (data, selectedIds) {
        +      var selected = [];
        +
        +      if (data.selected || $.inArray(data.id, selectedIds) !== -1) {
        +        data.selected = true;
        +        selected.push(data);
        +      } else {
        +        data.selected = false;
        +      }
        +
        +      if (data.children) {
        +        selected.push.apply(selected, getSelected(data.children, selectedIds));
        +      }
        +
        +      return selected;
        +    }
        +
        +    var selected = [];
        +
        +    for (var d = 0; d < this._currentData.length; d++) {
        +      var data = this._currentData[d];
        +
        +      selected.push.apply(
        +        selected,
        +        getSelected(
        +          data,
        +          this.$element.val().split(
        +            this._valueSeparator
        +          )
        +        )
        +      );
        +    }
        +
        +    callback(selected);
        +  };
        +
        +  InputData.prototype.select = function (_, data) {
        +    if (!this.options.get('multiple')) {
        +      this.current(function (allData) {
        +        $.map(allData, function (data) {
        +          data.selected = false;
        +        });
        +      });
        +
        +      this.$element.val(data.id);
        +      this.$element.trigger('change');
        +    } else {
        +      var value = this.$element.val();
        +      value += this._valueSeparator + data.id;
        +
        +      this.$element.val(value);
        +      this.$element.trigger('change');
        +    }
        +  };
        +
        +  InputData.prototype.unselect = function (_, data) {
        +    var self = this;
        +
        +    data.selected = false;
        +
        +    this.current(function (allData) {
        +      var values = [];
        +
        +      for (var d = 0; d < allData.length; d++) {
        +        var item = allData[d];
        +
        +        if (data.id == item.id) {
        +          continue;
        +        }
        +
        +        values.push(item.id);
        +      }
        +
        +      self.$element.val(values.join(self._valueSeparator));
        +      self.$element.trigger('change');
        +    });
        +  };
        +
        +  InputData.prototype.query = function (_, params, callback) {
        +    var results = [];
        +
        +    for (var d = 0; d < this._currentData.length; d++) {
        +      var data = this._currentData[d];
        +
        +      var matches = this.matches(params, data);
        +
        +      if (matches !== null) {
        +        results.push(matches);
        +      }
        +    }
        +
        +    callback({
        +      results: results
        +    });
        +  };
        +
        +  InputData.prototype.addOptions = function (_, $options) {
        +    var options = $.map($options, function ($option) {
        +      return $.data($option[0], 'data');
        +    });
        +
        +    this._currentData.push.apply(this._currentData, options);
        +  };
        +
        +  return InputData;
        +});
        +
        +S2.define('select2/compat/matcher',[
        +  'jquery'
        +], function ($) {
        +  function oldMatcher (matcher) {
        +    function wrappedMatcher (params, data) {
        +      var match = $.extend(true, {}, data);
        +
        +      if (params.term == null || $.trim(params.term) === '') {
        +        return match;
        +      }
        +
        +      if (data.children) {
        +        for (var c = data.children.length - 1; c >= 0; c--) {
        +          var child = data.children[c];
        +
        +          // Check if the child object matches
        +          // The old matcher returned a boolean true or false
        +          var doesMatch = matcher(params.term, child.text, child);
        +
        +          // If the child didn't match, pop it off
        +          if (!doesMatch) {
        +            match.children.splice(c, 1);
        +          }
        +        }
        +
        +        if (match.children.length > 0) {
        +          return match;
        +        }
        +      }
        +
        +      if (matcher(params.term, data.text, data)) {
        +        return match;
        +      }
        +
        +      return null;
        +    }
        +
        +    return wrappedMatcher;
        +  }
        +
        +  return oldMatcher;
        +});
        +
        +S2.define('select2/compat/query',[
        +
        +], function () {
        +  function Query (decorated, $element, options) {
        +    if (options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `query` option has been deprecated in favor of a ' +
        +        'custom data adapter that overrides the `query` method. Support ' +
        +        'will be removed for the `query` option in future versions of ' +
        +        'Select2.'
        +      );
        +    }
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Query.prototype.query = function (_, params, callback) {
        +    params.callback = callback;
        +
        +    var query = this.options.get('query');
        +
        +    query.call(null, params);
        +  };
        +
        +  return Query;
        +});
        +
        +S2.define('select2/dropdown/attachContainer',[
        +
        +], function () {
        +  function AttachContainer (decorated, $element, options) {
        +    decorated.call(this, $element, options);
        +  }
        +
        +  AttachContainer.prototype.position =
        +    function (decorated, $dropdown, $container) {
        +    var $dropdownContainer = $container.find('.dropdown-wrapper');
        +    $dropdownContainer.append($dropdown);
        +
        +    $dropdown.addClass('select2-dropdown--below');
        +    $container.addClass('select2-container--below');
        +  };
        +
        +  return AttachContainer;
        +});
        +
        +S2.define('select2/dropdown/stopPropagation',[
        +
        +], function () {
        +  function StopPropagation () { }
        +
        +  StopPropagation.prototype.bind = function (decorated, container, $container) {
        +    decorated.call(this, container, $container);
        +
        +    var stoppedEvents = [
        +    'blur',
        +    'change',
        +    'click',
        +    'dblclick',
        +    'focus',
        +    'focusin',
        +    'focusout',
        +    'input',
        +    'keydown',
        +    'keyup',
        +    'keypress',
        +    'mousedown',
        +    'mouseenter',
        +    'mouseleave',
        +    'mousemove',
        +    'mouseover',
        +    'mouseup',
        +    'search',
        +    'touchend',
        +    'touchstart'
        +    ];
        +
        +    this.$dropdown.on(stoppedEvents.join(' '), function (evt) {
        +      evt.stopPropagation();
        +    });
        +  };
        +
        +  return StopPropagation;
        +});
        +
        +S2.define('select2/selection/stopPropagation',[
        +
        +], function () {
        +  function StopPropagation () { }
        +
        +  StopPropagation.prototype.bind = function (decorated, container, $container) {
        +    decorated.call(this, container, $container);
        +
        +    var stoppedEvents = [
        +      'blur',
        +      'change',
        +      'click',
        +      'dblclick',
        +      'focus',
        +      'focusin',
        +      'focusout',
        +      'input',
        +      'keydown',
        +      'keyup',
        +      'keypress',
        +      'mousedown',
        +      'mouseenter',
        +      'mouseleave',
        +      'mousemove',
        +      'mouseover',
        +      'mouseup',
        +      'search',
        +      'touchend',
        +      'touchstart'
        +    ];
        +
        +    this.$selection.on(stoppedEvents.join(' '), function (evt) {
        +      evt.stopPropagation();
        +    });
        +  };
        +
        +  return StopPropagation;
        +});
        +
        +/*!
        + * jQuery Mousewheel 3.1.13
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + */
        +
        +(function (factory) {
        +    if ( typeof S2.define === 'function' && S2.define.amd ) {
        +        // AMD. Register as an anonymous module.
        +        S2.define('jquery-mousewheel',['jquery'], factory);
        +    } else if (typeof exports === 'object') {
        +        // Node/CommonJS style for Browserify
        +        module.exports = factory;
        +    } else {
        +        // Browser globals
        +        factory(jQuery);
        +    }
        +}(function ($) {
        +
        +    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
        +        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
        +                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
        +        slice  = Array.prototype.slice,
        +        nullLowestDeltaTimeout, lowestDelta;
        +
        +    if ( $.event.fixHooks ) {
        +        for ( var i = toFix.length; i; ) {
        +            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
        +        }
        +    }
        +
        +    var special = $.event.special.mousewheel = {
        +        version: '3.1.12',
        +
        +        setup: function() {
        +            if ( this.addEventListener ) {
        +                for ( var i = toBind.length; i; ) {
        +                    this.addEventListener( toBind[--i], handler, false );
        +                }
        +            } else {
        +                this.onmousewheel = handler;
        +            }
        +            // Store the line height and page height for this particular element
        +            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
        +            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
        +        },
        +
        +        teardown: function() {
        +            if ( this.removeEventListener ) {
        +                for ( var i = toBind.length; i; ) {
        +                    this.removeEventListener( toBind[--i], handler, false );
        +                }
        +            } else {
        +                this.onmousewheel = null;
        +            }
        +            // Clean up the data we added to the element
        +            $.removeData(this, 'mousewheel-line-height');
        +            $.removeData(this, 'mousewheel-page-height');
        +        },
        +
        +        getLineHeight: function(elem) {
        +            var $elem = $(elem),
        +                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
        +            if (!$parent.length) {
        +                $parent = $('body');
        +            }
        +            return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
        +        },
        +
        +        getPageHeight: function(elem) {
        +            return $(elem).height();
        +        },
        +
        +        settings: {
        +            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
        +            normalizeOffset: true  // calls getBoundingClientRect for each event
        +        }
        +    };
        +
        +    $.fn.extend({
        +        mousewheel: function(fn) {
        +            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
        +        },
        +
        +        unmousewheel: function(fn) {
        +            return this.unbind('mousewheel', fn);
        +        }
        +    });
        +
        +
        +    function handler(event) {
        +        var orgEvent   = event || window.event,
        +            args       = slice.call(arguments, 1),
        +            delta      = 0,
        +            deltaX     = 0,
        +            deltaY     = 0,
        +            absDelta   = 0,
        +            offsetX    = 0,
        +            offsetY    = 0;
        +        event = $.event.fix(orgEvent);
        +        event.type = 'mousewheel';
        +
        +        // Old school scrollwheel delta
        +        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
        +        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
        +        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
        +        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
        +
        +        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
        +        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
        +            deltaX = deltaY * -1;
        +            deltaY = 0;
        +        }
        +
        +        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
        +        delta = deltaY === 0 ? deltaX : deltaY;
        +
        +        // New school wheel delta (wheel event)
        +        if ( 'deltaY' in orgEvent ) {
        +            deltaY = orgEvent.deltaY * -1;
        +            delta  = deltaY;
        +        }
        +        if ( 'deltaX' in orgEvent ) {
        +            deltaX = orgEvent.deltaX;
        +            if ( deltaY === 0 ) { delta  = deltaX * -1; }
        +        }
        +
        +        // No change actually happened, no reason to go any further
        +        if ( deltaY === 0 && deltaX === 0 ) { return; }
        +
        +        // Need to convert lines and pages to pixels if we aren't already in pixels
        +        // There are three delta modes:
        +        //   * deltaMode 0 is by pixels, nothing to do
        +        //   * deltaMode 1 is by lines
        +        //   * deltaMode 2 is by pages
        +        if ( orgEvent.deltaMode === 1 ) {
        +            var lineHeight = $.data(this, 'mousewheel-line-height');
        +            delta  *= lineHeight;
        +            deltaY *= lineHeight;
        +            deltaX *= lineHeight;
        +        } else if ( orgEvent.deltaMode === 2 ) {
        +            var pageHeight = $.data(this, 'mousewheel-page-height');
        +            delta  *= pageHeight;
        +            deltaY *= pageHeight;
        +            deltaX *= pageHeight;
        +        }
        +
        +        // Store lowest absolute delta to normalize the delta values
        +        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
        +
        +        if ( !lowestDelta || absDelta < lowestDelta ) {
        +            lowestDelta = absDelta;
        +
        +            // Adjust older deltas if necessary
        +            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
        +                lowestDelta /= 40;
        +            }
        +        }
        +
        +        // Adjust older deltas if necessary
        +        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
        +            // Divide all the things by 40!
        +            delta  /= 40;
        +            deltaX /= 40;
        +            deltaY /= 40;
        +        }
        +
        +        // Get a whole, normalized value for the deltas
        +        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
        +        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
        +        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
        +
        +        // Normalise offsetX and offsetY properties
        +        if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
        +            var boundingRect = this.getBoundingClientRect();
        +            offsetX = event.clientX - boundingRect.left;
        +            offsetY = event.clientY - boundingRect.top;
        +        }
        +
        +        // Add information to the event object
        +        event.deltaX = deltaX;
        +        event.deltaY = deltaY;
        +        event.deltaFactor = lowestDelta;
        +        event.offsetX = offsetX;
        +        event.offsetY = offsetY;
        +        // Go ahead and set deltaMode to 0 since we converted to pixels
        +        // Although this is a little odd since we overwrite the deltaX/Y
        +        // properties with normalized deltas.
        +        event.deltaMode = 0;
        +
        +        // Add event and delta to the front of the arguments
        +        args.unshift(event, delta, deltaX, deltaY);
        +
        +        // Clearout lowestDelta after sometime to better
        +        // handle multiple device types that give different
        +        // a different lowestDelta
        +        // Ex: trackpad = 3 and mouse wheel = 120
        +        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
        +        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
        +
        +        return ($.event.dispatch || $.event.handle).apply(this, args);
        +    }
        +
        +    function nullLowestDelta() {
        +        lowestDelta = null;
        +    }
        +
        +    function shouldAdjustOldDeltas(orgEvent, absDelta) {
        +        // If this is an older event and the delta is divisable by 120,
        +        // then we are assuming that the browser is treating this as an
        +        // older mouse wheel event and that we should divide the deltas
        +        // by 40 to try and get a more usable deltaFactor.
        +        // Side note, this actually impacts the reported scroll distance
        +        // in older browsers and can cause scrolling to be slower than native.
        +        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
        +        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
        +    }
        +
        +}));
        +
        +S2.define('jquery.select2',[
        +  'jquery',
        +  'jquery-mousewheel',
        +
        +  './select2/core',
        +  './select2/defaults'
        +], function ($, _, Select2, Defaults) {
        +  if ($.fn.select2 == null) {
        +    // All methods that should return the element
        +    var thisMethods = ['open', 'close', 'destroy'];
        +
        +    $.fn.select2 = function (options) {
        +      options = options || {};
        +
        +      if (typeof options === 'object') {
        +        this.each(function () {
        +          var instanceOptions = $.extend(true, {}, options);
        +
        +          var instance = new Select2($(this), instanceOptions);
        +        });
        +
        +        return this;
        +      } else if (typeof options === 'string') {
        +        var ret;
        +        var args = Array.prototype.slice.call(arguments, 1);
        +
        +        this.each(function () {
        +          var instance = $(this).data('select2');
        +
        +          if (instance == null && window.console && console.error) {
        +            console.error(
        +              'The select2(\'' + options + '\') method was called on an ' +
        +              'element that is not using Select2.'
        +            );
        +          }
        +
        +          ret = instance[options].apply(instance, args);
        +        });
        +
        +        // Check if we should be returning `this`
        +        if ($.inArray(options, thisMethods) > -1) {
        +          return this;
        +        }
        +
        +        return ret;
        +      } else {
        +        throw new Error('Invalid arguments for Select2: ' + options);
        +      }
        +    };
        +  }
        +
        +  if ($.fn.select2.defaults == null) {
        +    $.fn.select2.defaults = Defaults;
        +  }
        +
        +  return Select2;
        +});
        +
        +  // Return the AMD loader configuration so it can be used outside of this file
        +  return {
        +    define: S2.define,
        +    require: S2.require
        +  };
        +}());
        +
        +  // Autoload the jQuery bindings
        +  // We know that all of the modules exist above this, so we're safe
        +  var select2 = S2.require('jquery.select2');
        +
        +  // Hold the AMD module references on the jQuery function that was just loaded
        +  // This allows Select2 to use the internal loader outside of this file, such
        +  // as in the language files.
        +  jQuery.fn.select2.amd = S2;
        +
        +  // Return the Select2 instance for anyone who is importing it.
        +  return select2;
        +}));
        diff --git a/bower_components/select2/dist/js/select2.full.min.js b/bower_components/select2/dist/js/select2.full.min.js
        new file mode 100644
        index 0000000000..684edf3238
        --- /dev/null
        +++ b/bower_components/select2/dist/js/select2.full.min.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
        +if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){var c=(this._lastTag,this.$element.find("option[data-select2-tag]"));c.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b),d=g.$element.find("option").filter(function(){return a(this).val()===c.id});if(!d.length){var e=g.option(c);e.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([e])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
        +},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get("multiple")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger("change")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger("change")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];b.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger("change")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],"data")});this._currentData.push.apply(this._currentData,d)},b}),b.define("select2/compat/matcher",["jquery"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||""===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define("select2/compat/query",[],function(){function a(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get("query");d.call(null,b)},a}),b.define("select2/dropdown/attachContainer",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(".dropdown-wrapper");d.append(b),b.addClass("select2-dropdown--below"),c.addClass("select2-container--below")},a}),b.define("select2/dropdown/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("select2/selection/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(d.join(" "),function(a){a.stopPropagation()})},a}),function(c){"function"==typeof b.define&&b.define.amd?b.define("jquery-mousewheel",["jquery"],c):"object"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
        \ No newline at end of file
        diff --git a/bower_components/select2/dist/js/select2.js b/bower_components/select2/dist/js/select2.js
        new file mode 100644
        index 0000000000..13b84fadff
        --- /dev/null
        +++ b/bower_components/select2/dist/js/select2.js
        @@ -0,0 +1,5725 @@
        +/*!
        + * Select2 4.0.3
        + * https://select2.github.io
        + *
        + * Released under the MIT license
        + * https://github.com/select2/select2/blob/master/LICENSE.md
        + */
        +(function (factory) {
        +  if (typeof define === 'function' && define.amd) {
        +    // AMD. Register as an anonymous module.
        +    define(['jquery'], factory);
        +  } else if (typeof exports === 'object') {
        +    // Node/CommonJS
        +    factory(require('jquery'));
        +  } else {
        +    // Browser globals
        +    factory(jQuery);
        +  }
        +}(function (jQuery) {
        +  // This is needed so we can catch the AMD loader configuration and use it
        +  // The inner file should be wrapped (by `banner.start.js`) in a function that
        +  // returns the AMD loader references.
        +  var S2 =
        +(function () {
        +  // Restore the Select2 AMD loader so it can be used
        +  // Needed mostly in the language files, where the loader is not inserted
        +  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
        +    var S2 = jQuery.fn.select2.amd;
        +  }
        +var S2;(function () { if (!S2 || !S2.requirejs) {
        +if (!S2) { S2 = {}; } else { require = S2; }
        +/**
        + * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
        + * Available via the MIT or new BSD license.
        + * see: http://github.com/jrburke/almond for details
        + */
        +//Going sloppy to avoid 'use strict' string cost, but strict practices should
        +//be followed.
        +/*jslint sloppy: true */
        +/*global setTimeout: false */
        +
        +var requirejs, require, define;
        +(function (undef) {
        +    var main, req, makeMap, handlers,
        +        defined = {},
        +        waiting = {},
        +        config = {},
        +        defining = {},
        +        hasOwn = Object.prototype.hasOwnProperty,
        +        aps = [].slice,
        +        jsSuffixRegExp = /\.js$/;
        +
        +    function hasProp(obj, prop) {
        +        return hasOwn.call(obj, prop);
        +    }
        +
        +    /**
        +     * Given a relative module name, like ./something, normalize it to
        +     * a real name that can be mapped to a path.
        +     * @param {String} name the relative name
        +     * @param {String} baseName a real name that the name arg is relative
        +     * to.
        +     * @returns {String} normalized name
        +     */
        +    function normalize(name, baseName) {
        +        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
        +            foundI, foundStarMap, starI, i, j, part,
        +            baseParts = baseName && baseName.split("/"),
        +            map = config.map,
        +            starMap = (map && map['*']) || {};
        +
        +        //Adjust any relative paths.
        +        if (name && name.charAt(0) === ".") {
        +            //If have a base name, try to normalize against it,
        +            //otherwise, assume it is a top-level require that will
        +            //be relative to baseUrl in the end.
        +            if (baseName) {
        +                name = name.split('/');
        +                lastIndex = name.length - 1;
        +
        +                // Node .js allowance:
        +                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
        +                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
        +                }
        +
        +                //Lop off the last part of baseParts, so that . matches the
        +                //"directory" and not name of the baseName's module. For instance,
        +                //baseName of "one/two/three", maps to "one/two/three.js", but we
        +                //want the directory, "one/two" for this normalization.
        +                name = baseParts.slice(0, baseParts.length - 1).concat(name);
        +
        +                //start trimDots
        +                for (i = 0; i < name.length; i += 1) {
        +                    part = name[i];
        +                    if (part === ".") {
        +                        name.splice(i, 1);
        +                        i -= 1;
        +                    } else if (part === "..") {
        +                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {
        +                            //End of the line. Keep at least one non-dot
        +                            //path segment at the front so it can be mapped
        +                            //correctly to disk. Otherwise, there is likely
        +                            //no path mapping for a path starting with '..'.
        +                            //This can still fail, but catches the most reasonable
        +                            //uses of ..
        +                            break;
        +                        } else if (i > 0) {
        +                            name.splice(i - 1, 2);
        +                            i -= 2;
        +                        }
        +                    }
        +                }
        +                //end trimDots
        +
        +                name = name.join("/");
        +            } else if (name.indexOf('./') === 0) {
        +                // No baseName, so this is ID is resolved relative
        +                // to baseUrl, pull off the leading dot.
        +                name = name.substring(2);
        +            }
        +        }
        +
        +        //Apply map config if available.
        +        if ((baseParts || starMap) && map) {
        +            nameParts = name.split('/');
        +
        +            for (i = nameParts.length; i > 0; i -= 1) {
        +                nameSegment = nameParts.slice(0, i).join("/");
        +
        +                if (baseParts) {
        +                    //Find the longest baseName segment match in the config.
        +                    //So, do joins on the biggest to smallest lengths of baseParts.
        +                    for (j = baseParts.length; j > 0; j -= 1) {
        +                        mapValue = map[baseParts.slice(0, j).join('/')];
        +
        +                        //baseName segment has  config, find if it has one for
        +                        //this name.
        +                        if (mapValue) {
        +                            mapValue = mapValue[nameSegment];
        +                            if (mapValue) {
        +                                //Match, update name to the new value.
        +                                foundMap = mapValue;
        +                                foundI = i;
        +                                break;
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                if (foundMap) {
        +                    break;
        +                }
        +
        +                //Check for a star map match, but just hold on to it,
        +                //if there is a shorter segment match later in a matching
        +                //config, then favor over this star map.
        +                if (!foundStarMap && starMap && starMap[nameSegment]) {
        +                    foundStarMap = starMap[nameSegment];
        +                    starI = i;
        +                }
        +            }
        +
        +            if (!foundMap && foundStarMap) {
        +                foundMap = foundStarMap;
        +                foundI = starI;
        +            }
        +
        +            if (foundMap) {
        +                nameParts.splice(0, foundI, foundMap);
        +                name = nameParts.join('/');
        +            }
        +        }
        +
        +        return name;
        +    }
        +
        +    function makeRequire(relName, forceSync) {
        +        return function () {
        +            //A version of a require function that passes a moduleName
        +            //value for items that may need to
        +            //look up paths relative to the moduleName
        +            var args = aps.call(arguments, 0);
        +
        +            //If first arg is not require('string'), and there is only
        +            //one arg, it is the array form without a callback. Insert
        +            //a null so that the following concat is correct.
        +            if (typeof args[0] !== 'string' && args.length === 1) {
        +                args.push(null);
        +            }
        +            return req.apply(undef, args.concat([relName, forceSync]));
        +        };
        +    }
        +
        +    function makeNormalize(relName) {
        +        return function (name) {
        +            return normalize(name, relName);
        +        };
        +    }
        +
        +    function makeLoad(depName) {
        +        return function (value) {
        +            defined[depName] = value;
        +        };
        +    }
        +
        +    function callDep(name) {
        +        if (hasProp(waiting, name)) {
        +            var args = waiting[name];
        +            delete waiting[name];
        +            defining[name] = true;
        +            main.apply(undef, args);
        +        }
        +
        +        if (!hasProp(defined, name) && !hasProp(defining, name)) {
        +            throw new Error('No ' + name);
        +        }
        +        return defined[name];
        +    }
        +
        +    //Turns a plugin!resource to [plugin, resource]
        +    //with the plugin being undefined if the name
        +    //did not have a plugin prefix.
        +    function splitPrefix(name) {
        +        var prefix,
        +            index = name ? name.indexOf('!') : -1;
        +        if (index > -1) {
        +            prefix = name.substring(0, index);
        +            name = name.substring(index + 1, name.length);
        +        }
        +        return [prefix, name];
        +    }
        +
        +    /**
        +     * Makes a name map, normalizing the name, and using a plugin
        +     * for normalization if necessary. Grabs a ref to plugin
        +     * too, as an optimization.
        +     */
        +    makeMap = function (name, relName) {
        +        var plugin,
        +            parts = splitPrefix(name),
        +            prefix = parts[0];
        +
        +        name = parts[1];
        +
        +        if (prefix) {
        +            prefix = normalize(prefix, relName);
        +            plugin = callDep(prefix);
        +        }
        +
        +        //Normalize according
        +        if (prefix) {
        +            if (plugin && plugin.normalize) {
        +                name = plugin.normalize(name, makeNormalize(relName));
        +            } else {
        +                name = normalize(name, relName);
        +            }
        +        } else {
        +            name = normalize(name, relName);
        +            parts = splitPrefix(name);
        +            prefix = parts[0];
        +            name = parts[1];
        +            if (prefix) {
        +                plugin = callDep(prefix);
        +            }
        +        }
        +
        +        //Using ridiculous property names for space reasons
        +        return {
        +            f: prefix ? prefix + '!' + name : name, //fullName
        +            n: name,
        +            pr: prefix,
        +            p: plugin
        +        };
        +    };
        +
        +    function makeConfig(name) {
        +        return function () {
        +            return (config && config.config && config.config[name]) || {};
        +        };
        +    }
        +
        +    handlers = {
        +        require: function (name) {
        +            return makeRequire(name);
        +        },
        +        exports: function (name) {
        +            var e = defined[name];
        +            if (typeof e !== 'undefined') {
        +                return e;
        +            } else {
        +                return (defined[name] = {});
        +            }
        +        },
        +        module: function (name) {
        +            return {
        +                id: name,
        +                uri: '',
        +                exports: defined[name],
        +                config: makeConfig(name)
        +            };
        +        }
        +    };
        +
        +    main = function (name, deps, callback, relName) {
        +        var cjsModule, depName, ret, map, i,
        +            args = [],
        +            callbackType = typeof callback,
        +            usingExports;
        +
        +        //Use name if no relName
        +        relName = relName || name;
        +
        +        //Call the callback to define the module, if necessary.
        +        if (callbackType === 'undefined' || callbackType === 'function') {
        +            //Pull out the defined dependencies and pass the ordered
        +            //values to the callback.
        +            //Default to [require, exports, module] if no deps
        +            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
        +            for (i = 0; i < deps.length; i += 1) {
        +                map = makeMap(deps[i], relName);
        +                depName = map.f;
        +
        +                //Fast path CommonJS standard dependencies.
        +                if (depName === "require") {
        +                    args[i] = handlers.require(name);
        +                } else if (depName === "exports") {
        +                    //CommonJS module spec 1.1
        +                    args[i] = handlers.exports(name);
        +                    usingExports = true;
        +                } else if (depName === "module") {
        +                    //CommonJS module spec 1.1
        +                    cjsModule = args[i] = handlers.module(name);
        +                } else if (hasProp(defined, depName) ||
        +                           hasProp(waiting, depName) ||
        +                           hasProp(defining, depName)) {
        +                    args[i] = callDep(depName);
        +                } else if (map.p) {
        +                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
        +                    args[i] = defined[depName];
        +                } else {
        +                    throw new Error(name + ' missing ' + depName);
        +                }
        +            }
        +
        +            ret = callback ? callback.apply(defined[name], args) : undefined;
        +
        +            if (name) {
        +                //If setting exports via "module" is in play,
        +                //favor that over return value and exports. After that,
        +                //favor a non-undefined return value over exports use.
        +                if (cjsModule && cjsModule.exports !== undef &&
        +                        cjsModule.exports !== defined[name]) {
        +                    defined[name] = cjsModule.exports;
        +                } else if (ret !== undef || !usingExports) {
        +                    //Use the return value from the function.
        +                    defined[name] = ret;
        +                }
        +            }
        +        } else if (name) {
        +            //May just be an object definition for the module. Only
        +            //worry about defining if have a module name.
        +            defined[name] = callback;
        +        }
        +    };
        +
        +    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
        +        if (typeof deps === "string") {
        +            if (handlers[deps]) {
        +                //callback in this case is really relName
        +                return handlers[deps](callback);
        +            }
        +            //Just return the module wanted. In this scenario, the
        +            //deps arg is the module name, and second arg (if passed)
        +            //is just the relName.
        +            //Normalize module name, if it contains . or ..
        +            return callDep(makeMap(deps, callback).f);
        +        } else if (!deps.splice) {
        +            //deps is a config object, not an array.
        +            config = deps;
        +            if (config.deps) {
        +                req(config.deps, config.callback);
        +            }
        +            if (!callback) {
        +                return;
        +            }
        +
        +            if (callback.splice) {
        +                //callback is an array, which means it is a dependency list.
        +                //Adjust args if there are dependencies
        +                deps = callback;
        +                callback = relName;
        +                relName = null;
        +            } else {
        +                deps = undef;
        +            }
        +        }
        +
        +        //Support require(['a'])
        +        callback = callback || function () {};
        +
        +        //If relName is a function, it is an errback handler,
        +        //so remove it.
        +        if (typeof relName === 'function') {
        +            relName = forceSync;
        +            forceSync = alt;
        +        }
        +
        +        //Simulate async callback;
        +        if (forceSync) {
        +            main(undef, deps, callback, relName);
        +        } else {
        +            //Using a non-zero value because of concern for what old browsers
        +            //do, and latest browsers "upgrade" to 4 if lower value is used:
        +            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
        +            //If want a value immediately, use require('id') instead -- something
        +            //that works in almond on the global level, but not guaranteed and
        +            //unlikely to work in other AMD implementations.
        +            setTimeout(function () {
        +                main(undef, deps, callback, relName);
        +            }, 4);
        +        }
        +
        +        return req;
        +    };
        +
        +    /**
        +     * Just drops the config on the floor, but returns req in case
        +     * the config return value is used.
        +     */
        +    req.config = function (cfg) {
        +        return req(cfg);
        +    };
        +
        +    /**
        +     * Expose module registry for debugging and tooling
        +     */
        +    requirejs._defined = defined;
        +
        +    define = function (name, deps, callback) {
        +        if (typeof name !== 'string') {
        +            throw new Error('See almond README: incorrect module build, no module name');
        +        }
        +
        +        //This module may not have dependencies
        +        if (!deps.splice) {
        +            //deps is not an array, so probably means
        +            //an object literal or factory function for
        +            //the value. Adjust args.
        +            callback = deps;
        +            deps = [];
        +        }
        +
        +        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
        +            waiting[name] = [name, deps, callback];
        +        }
        +    };
        +
        +    define.amd = {
        +        jQuery: true
        +    };
        +}());
        +
        +S2.requirejs = requirejs;S2.require = require;S2.define = define;
        +}
        +}());
        +S2.define("almond", function(){});
        +
        +/* global jQuery:false, $:false */
        +S2.define('jquery',[],function () {
        +  var _$ = jQuery || $;
        +
        +  if (_$ == null && console && console.error) {
        +    console.error(
        +      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
        +      'found. Make sure that you are including jQuery before Select2 on your ' +
        +      'web page.'
        +    );
        +  }
        +
        +  return _$;
        +});
        +
        +S2.define('select2/utils',[
        +  'jquery'
        +], function ($) {
        +  var Utils = {};
        +
        +  Utils.Extend = function (ChildClass, SuperClass) {
        +    var __hasProp = {}.hasOwnProperty;
        +
        +    function BaseConstructor () {
        +      this.constructor = ChildClass;
        +    }
        +
        +    for (var key in SuperClass) {
        +      if (__hasProp.call(SuperClass, key)) {
        +        ChildClass[key] = SuperClass[key];
        +      }
        +    }
        +
        +    BaseConstructor.prototype = SuperClass.prototype;
        +    ChildClass.prototype = new BaseConstructor();
        +    ChildClass.__super__ = SuperClass.prototype;
        +
        +    return ChildClass;
        +  };
        +
        +  function getMethods (theClass) {
        +    var proto = theClass.prototype;
        +
        +    var methods = [];
        +
        +    for (var methodName in proto) {
        +      var m = proto[methodName];
        +
        +      if (typeof m !== 'function') {
        +        continue;
        +      }
        +
        +      if (methodName === 'constructor') {
        +        continue;
        +      }
        +
        +      methods.push(methodName);
        +    }
        +
        +    return methods;
        +  }
        +
        +  Utils.Decorate = function (SuperClass, DecoratorClass) {
        +    var decoratedMethods = getMethods(DecoratorClass);
        +    var superMethods = getMethods(SuperClass);
        +
        +    function DecoratedClass () {
        +      var unshift = Array.prototype.unshift;
        +
        +      var argCount = DecoratorClass.prototype.constructor.length;
        +
        +      var calledConstructor = SuperClass.prototype.constructor;
        +
        +      if (argCount > 0) {
        +        unshift.call(arguments, SuperClass.prototype.constructor);
        +
        +        calledConstructor = DecoratorClass.prototype.constructor;
        +      }
        +
        +      calledConstructor.apply(this, arguments);
        +    }
        +
        +    DecoratorClass.displayName = SuperClass.displayName;
        +
        +    function ctr () {
        +      this.constructor = DecoratedClass;
        +    }
        +
        +    DecoratedClass.prototype = new ctr();
        +
        +    for (var m = 0; m < superMethods.length; m++) {
        +        var superMethod = superMethods[m];
        +
        +        DecoratedClass.prototype[superMethod] =
        +          SuperClass.prototype[superMethod];
        +    }
        +
        +    var calledMethod = function (methodName) {
        +      // Stub out the original method if it's not decorating an actual method
        +      var originalMethod = function () {};
        +
        +      if (methodName in DecoratedClass.prototype) {
        +        originalMethod = DecoratedClass.prototype[methodName];
        +      }
        +
        +      var decoratedMethod = DecoratorClass.prototype[methodName];
        +
        +      return function () {
        +        var unshift = Array.prototype.unshift;
        +
        +        unshift.call(arguments, originalMethod);
        +
        +        return decoratedMethod.apply(this, arguments);
        +      };
        +    };
        +
        +    for (var d = 0; d < decoratedMethods.length; d++) {
        +      var decoratedMethod = decoratedMethods[d];
        +
        +      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
        +    }
        +
        +    return DecoratedClass;
        +  };
        +
        +  var Observable = function () {
        +    this.listeners = {};
        +  };
        +
        +  Observable.prototype.on = function (event, callback) {
        +    this.listeners = this.listeners || {};
        +
        +    if (event in this.listeners) {
        +      this.listeners[event].push(callback);
        +    } else {
        +      this.listeners[event] = [callback];
        +    }
        +  };
        +
        +  Observable.prototype.trigger = function (event) {
        +    var slice = Array.prototype.slice;
        +    var params = slice.call(arguments, 1);
        +
        +    this.listeners = this.listeners || {};
        +
        +    // Params should always come in as an array
        +    if (params == null) {
        +      params = [];
        +    }
        +
        +    // If there are no arguments to the event, use a temporary object
        +    if (params.length === 0) {
        +      params.push({});
        +    }
        +
        +    // Set the `_type` of the first object to the event
        +    params[0]._type = event;
        +
        +    if (event in this.listeners) {
        +      this.invoke(this.listeners[event], slice.call(arguments, 1));
        +    }
        +
        +    if ('*' in this.listeners) {
        +      this.invoke(this.listeners['*'], arguments);
        +    }
        +  };
        +
        +  Observable.prototype.invoke = function (listeners, params) {
        +    for (var i = 0, len = listeners.length; i < len; i++) {
        +      listeners[i].apply(this, params);
        +    }
        +  };
        +
        +  Utils.Observable = Observable;
        +
        +  Utils.generateChars = function (length) {
        +    var chars = '';
        +
        +    for (var i = 0; i < length; i++) {
        +      var randomChar = Math.floor(Math.random() * 36);
        +      chars += randomChar.toString(36);
        +    }
        +
        +    return chars;
        +  };
        +
        +  Utils.bind = function (func, context) {
        +    return function () {
        +      func.apply(context, arguments);
        +    };
        +  };
        +
        +  Utils._convertData = function (data) {
        +    for (var originalKey in data) {
        +      var keys = originalKey.split('-');
        +
        +      var dataLevel = data;
        +
        +      if (keys.length === 1) {
        +        continue;
        +      }
        +
        +      for (var k = 0; k < keys.length; k++) {
        +        var key = keys[k];
        +
        +        // Lowercase the first letter
        +        // By default, dash-separated becomes camelCase
        +        key = key.substring(0, 1).toLowerCase() + key.substring(1);
        +
        +        if (!(key in dataLevel)) {
        +          dataLevel[key] = {};
        +        }
        +
        +        if (k == keys.length - 1) {
        +          dataLevel[key] = data[originalKey];
        +        }
        +
        +        dataLevel = dataLevel[key];
        +      }
        +
        +      delete data[originalKey];
        +    }
        +
        +    return data;
        +  };
        +
        +  Utils.hasScroll = function (index, el) {
        +    // Adapted from the function created by @ShadowScripter
        +    // and adapted by @BillBarry on the Stack Exchange Code Review website.
        +    // The original code can be found at
        +    // http://codereview.stackexchange.com/q/13338
        +    // and was designed to be used with the Sizzle selector engine.
        +
        +    var $el = $(el);
        +    var overflowX = el.style.overflowX;
        +    var overflowY = el.style.overflowY;
        +
        +    //Check both x and y declarations
        +    if (overflowX === overflowY &&
        +        (overflowY === 'hidden' || overflowY === 'visible')) {
        +      return false;
        +    }
        +
        +    if (overflowX === 'scroll' || overflowY === 'scroll') {
        +      return true;
        +    }
        +
        +    return ($el.innerHeight() < el.scrollHeight ||
        +      $el.innerWidth() < el.scrollWidth);
        +  };
        +
        +  Utils.escapeMarkup = function (markup) {
        +    var replaceMap = {
        +      '\\': '&#92;',
        +      '&': '&amp;',
        +      '<': '&lt;',
        +      '>': '&gt;',
        +      '"': '&quot;',
        +      '\'': '&#39;',
        +      '/': '&#47;'
        +    };
        +
        +    // Do not try to escape the markup if it's not a string
        +    if (typeof markup !== 'string') {
        +      return markup;
        +    }
        +
        +    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
        +      return replaceMap[match];
        +    });
        +  };
        +
        +  // Append an array of jQuery nodes to a given element.
        +  Utils.appendMany = function ($element, $nodes) {
        +    // jQuery 1.7.x does not support $.fn.append() with an array
        +    // Fall back to a jQuery object collection using $.fn.add()
        +    if ($.fn.jquery.substr(0, 3) === '1.7') {
        +      var $jqNodes = $();
        +
        +      $.map($nodes, function (node) {
        +        $jqNodes = $jqNodes.add(node);
        +      });
        +
        +      $nodes = $jqNodes;
        +    }
        +
        +    $element.append($nodes);
        +  };
        +
        +  return Utils;
        +});
        +
        +S2.define('select2/results',[
        +  'jquery',
        +  './utils'
        +], function ($, Utils) {
        +  function Results ($element, options, dataAdapter) {
        +    this.$element = $element;
        +    this.data = dataAdapter;
        +    this.options = options;
        +
        +    Results.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(Results, Utils.Observable);
        +
        +  Results.prototype.render = function () {
        +    var $results = $(
        +      '<ul class="select2-results__options" role="tree"></ul>'
        +    );
        +
        +    if (this.options.get('multiple')) {
        +      $results.attr('aria-multiselectable', 'true');
        +    }
        +
        +    this.$results = $results;
        +
        +    return $results;
        +  };
        +
        +  Results.prototype.clear = function () {
        +    this.$results.empty();
        +  };
        +
        +  Results.prototype.displayMessage = function (params) {
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    this.clear();
        +    this.hideLoading();
        +
        +    var $message = $(
        +      '<li role="treeitem" aria-live="assertive"' +
        +      ' class="select2-results__option"></li>'
        +    );
        +
        +    var message = this.options.get('translations').get(params.message);
        +
        +    $message.append(
        +      escapeMarkup(
        +        message(params.args)
        +      )
        +    );
        +
        +    $message[0].className += ' select2-results__message';
        +
        +    this.$results.append($message);
        +  };
        +
        +  Results.prototype.hideMessages = function () {
        +    this.$results.find('.select2-results__message').remove();
        +  };
        +
        +  Results.prototype.append = function (data) {
        +    this.hideLoading();
        +
        +    var $options = [];
        +
        +    if (data.results == null || data.results.length === 0) {
        +      if (this.$results.children().length === 0) {
        +        this.trigger('results:message', {
        +          message: 'noResults'
        +        });
        +      }
        +
        +      return;
        +    }
        +
        +    data.results = this.sort(data.results);
        +
        +    for (var d = 0; d < data.results.length; d++) {
        +      var item = data.results[d];
        +
        +      var $option = this.option(item);
        +
        +      $options.push($option);
        +    }
        +
        +    this.$results.append($options);
        +  };
        +
        +  Results.prototype.position = function ($results, $dropdown) {
        +    var $resultsContainer = $dropdown.find('.select2-results');
        +    $resultsContainer.append($results);
        +  };
        +
        +  Results.prototype.sort = function (data) {
        +    var sorter = this.options.get('sorter');
        +
        +    return sorter(data);
        +  };
        +
        +  Results.prototype.highlightFirstItem = function () {
        +    var $options = this.$results
        +      .find('.select2-results__option[aria-selected]');
        +
        +    var $selected = $options.filter('[aria-selected=true]');
        +
        +    // Check if there are any selected options
        +    if ($selected.length > 0) {
        +      // If there are selected options, highlight the first
        +      $selected.first().trigger('mouseenter');
        +    } else {
        +      // If there are no selected options, highlight the first option
        +      // in the dropdown
        +      $options.first().trigger('mouseenter');
        +    }
        +
        +    this.ensureHighlightVisible();
        +  };
        +
        +  Results.prototype.setClasses = function () {
        +    var self = this;
        +
        +    this.data.current(function (selected) {
        +      var selectedIds = $.map(selected, function (s) {
        +        return s.id.toString();
        +      });
        +
        +      var $options = self.$results
        +        .find('.select2-results__option[aria-selected]');
        +
        +      $options.each(function () {
        +        var $option = $(this);
        +
        +        var item = $.data(this, 'data');
        +
        +        // id needs to be converted to a string when comparing
        +        var id = '' + item.id;
        +
        +        if ((item.element != null && item.element.selected) ||
        +            (item.element == null && $.inArray(id, selectedIds) > -1)) {
        +          $option.attr('aria-selected', 'true');
        +        } else {
        +          $option.attr('aria-selected', 'false');
        +        }
        +      });
        +
        +    });
        +  };
        +
        +  Results.prototype.showLoading = function (params) {
        +    this.hideLoading();
        +
        +    var loadingMore = this.options.get('translations').get('searching');
        +
        +    var loading = {
        +      disabled: true,
        +      loading: true,
        +      text: loadingMore(params)
        +    };
        +    var $loading = this.option(loading);
        +    $loading.className += ' loading-results';
        +
        +    this.$results.prepend($loading);
        +  };
        +
        +  Results.prototype.hideLoading = function () {
        +    this.$results.find('.loading-results').remove();
        +  };
        +
        +  Results.prototype.option = function (data) {
        +    var option = document.createElement('li');
        +    option.className = 'select2-results__option';
        +
        +    var attrs = {
        +      'role': 'treeitem',
        +      'aria-selected': 'false'
        +    };
        +
        +    if (data.disabled) {
        +      delete attrs['aria-selected'];
        +      attrs['aria-disabled'] = 'true';
        +    }
        +
        +    if (data.id == null) {
        +      delete attrs['aria-selected'];
        +    }
        +
        +    if (data._resultId != null) {
        +      option.id = data._resultId;
        +    }
        +
        +    if (data.title) {
        +      option.title = data.title;
        +    }
        +
        +    if (data.children) {
        +      attrs.role = 'group';
        +      attrs['aria-label'] = data.text;
        +      delete attrs['aria-selected'];
        +    }
        +
        +    for (var attr in attrs) {
        +      var val = attrs[attr];
        +
        +      option.setAttribute(attr, val);
        +    }
        +
        +    if (data.children) {
        +      var $option = $(option);
        +
        +      var label = document.createElement('strong');
        +      label.className = 'select2-results__group';
        +
        +      var $label = $(label);
        +      this.template(data, label);
        +
        +      var $children = [];
        +
        +      for (var c = 0; c < data.children.length; c++) {
        +        var child = data.children[c];
        +
        +        var $child = this.option(child);
        +
        +        $children.push($child);
        +      }
        +
        +      var $childrenContainer = $('<ul></ul>', {
        +        'class': 'select2-results__options select2-results__options--nested'
        +      });
        +
        +      $childrenContainer.append($children);
        +
        +      $option.append(label);
        +      $option.append($childrenContainer);
        +    } else {
        +      this.template(data, option);
        +    }
        +
        +    $.data(option, 'data', data);
        +
        +    return option;
        +  };
        +
        +  Results.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    var id = container.id + '-results';
        +
        +    this.$results.attr('id', id);
        +
        +    container.on('results:all', function (params) {
        +      self.clear();
        +      self.append(params.data);
        +
        +      if (container.isOpen()) {
        +        self.setClasses();
        +        self.highlightFirstItem();
        +      }
        +    });
        +
        +    container.on('results:append', function (params) {
        +      self.append(params.data);
        +
        +      if (container.isOpen()) {
        +        self.setClasses();
        +      }
        +    });
        +
        +    container.on('query', function (params) {
        +      self.hideMessages();
        +      self.showLoading(params);
        +    });
        +
        +    container.on('select', function () {
        +      if (!container.isOpen()) {
        +        return;
        +      }
        +
        +      self.setClasses();
        +      self.highlightFirstItem();
        +    });
        +
        +    container.on('unselect', function () {
        +      if (!container.isOpen()) {
        +        return;
        +      }
        +
        +      self.setClasses();
        +      self.highlightFirstItem();
        +    });
        +
        +    container.on('open', function () {
        +      // When the dropdown is open, aria-expended="true"
        +      self.$results.attr('aria-expanded', 'true');
        +      self.$results.attr('aria-hidden', 'false');
        +
        +      self.setClasses();
        +      self.ensureHighlightVisible();
        +    });
        +
        +    container.on('close', function () {
        +      // When the dropdown is closed, aria-expended="false"
        +      self.$results.attr('aria-expanded', 'false');
        +      self.$results.attr('aria-hidden', 'true');
        +      self.$results.removeAttr('aria-activedescendant');
        +    });
        +
        +    container.on('results:toggle', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      if ($highlighted.length === 0) {
        +        return;
        +      }
        +
        +      $highlighted.trigger('mouseup');
        +    });
        +
        +    container.on('results:select', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      if ($highlighted.length === 0) {
        +        return;
        +      }
        +
        +      var data = $highlighted.data('data');
        +
        +      if ($highlighted.attr('aria-selected') == 'true') {
        +        self.trigger('close', {});
        +      } else {
        +        self.trigger('select', {
        +          data: data
        +        });
        +      }
        +    });
        +
        +    container.on('results:previous', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      var $options = self.$results.find('[aria-selected]');
        +
        +      var currentIndex = $options.index($highlighted);
        +
        +      // If we are already at te top, don't move further
        +      if (currentIndex === 0) {
        +        return;
        +      }
        +
        +      var nextIndex = currentIndex - 1;
        +
        +      // If none are highlighted, highlight the first
        +      if ($highlighted.length === 0) {
        +        nextIndex = 0;
        +      }
        +
        +      var $next = $options.eq(nextIndex);
        +
        +      $next.trigger('mouseenter');
        +
        +      var currentOffset = self.$results.offset().top;
        +      var nextTop = $next.offset().top;
        +      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
        +
        +      if (nextIndex === 0) {
        +        self.$results.scrollTop(0);
        +      } else if (nextTop - currentOffset < 0) {
        +        self.$results.scrollTop(nextOffset);
        +      }
        +    });
        +
        +    container.on('results:next', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      var $options = self.$results.find('[aria-selected]');
        +
        +      var currentIndex = $options.index($highlighted);
        +
        +      var nextIndex = currentIndex + 1;
        +
        +      // If we are at the last option, stay there
        +      if (nextIndex >= $options.length) {
        +        return;
        +      }
        +
        +      var $next = $options.eq(nextIndex);
        +
        +      $next.trigger('mouseenter');
        +
        +      var currentOffset = self.$results.offset().top +
        +        self.$results.outerHeight(false);
        +      var nextBottom = $next.offset().top + $next.outerHeight(false);
        +      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
        +
        +      if (nextIndex === 0) {
        +        self.$results.scrollTop(0);
        +      } else if (nextBottom > currentOffset) {
        +        self.$results.scrollTop(nextOffset);
        +      }
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      params.element.addClass('select2-results__option--highlighted');
        +    });
        +
        +    container.on('results:message', function (params) {
        +      self.displayMessage(params);
        +    });
        +
        +    if ($.fn.mousewheel) {
        +      this.$results.on('mousewheel', function (e) {
        +        var top = self.$results.scrollTop();
        +
        +        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
        +
        +        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
        +        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
        +
        +        if (isAtTop) {
        +          self.$results.scrollTop(0);
        +
        +          e.preventDefault();
        +          e.stopPropagation();
        +        } else if (isAtBottom) {
        +          self.$results.scrollTop(
        +            self.$results.get(0).scrollHeight - self.$results.height()
        +          );
        +
        +          e.preventDefault();
        +          e.stopPropagation();
        +        }
        +      });
        +    }
        +
        +    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
        +      function (evt) {
        +      var $this = $(this);
        +
        +      var data = $this.data('data');
        +
        +      if ($this.attr('aria-selected') === 'true') {
        +        if (self.options.get('multiple')) {
        +          self.trigger('unselect', {
        +            originalEvent: evt,
        +            data: data
        +          });
        +        } else {
        +          self.trigger('close', {});
        +        }
        +
        +        return;
        +      }
        +
        +      self.trigger('select', {
        +        originalEvent: evt,
        +        data: data
        +      });
        +    });
        +
        +    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
        +      function (evt) {
        +      var data = $(this).data('data');
        +
        +      self.getHighlightedResults()
        +          .removeClass('select2-results__option--highlighted');
        +
        +      self.trigger('results:focus', {
        +        data: data,
        +        element: $(this)
        +      });
        +    });
        +  };
        +
        +  Results.prototype.getHighlightedResults = function () {
        +    var $highlighted = this.$results
        +    .find('.select2-results__option--highlighted');
        +
        +    return $highlighted;
        +  };
        +
        +  Results.prototype.destroy = function () {
        +    this.$results.remove();
        +  };
        +
        +  Results.prototype.ensureHighlightVisible = function () {
        +    var $highlighted = this.getHighlightedResults();
        +
        +    if ($highlighted.length === 0) {
        +      return;
        +    }
        +
        +    var $options = this.$results.find('[aria-selected]');
        +
        +    var currentIndex = $options.index($highlighted);
        +
        +    var currentOffset = this.$results.offset().top;
        +    var nextTop = $highlighted.offset().top;
        +    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
        +
        +    var offsetDelta = nextTop - currentOffset;
        +    nextOffset -= $highlighted.outerHeight(false) * 2;
        +
        +    if (currentIndex <= 2) {
        +      this.$results.scrollTop(0);
        +    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
        +      this.$results.scrollTop(nextOffset);
        +    }
        +  };
        +
        +  Results.prototype.template = function (result, container) {
        +    var template = this.options.get('templateResult');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    var content = template(result, container);
        +
        +    if (content == null) {
        +      container.style.display = 'none';
        +    } else if (typeof content === 'string') {
        +      container.innerHTML = escapeMarkup(content);
        +    } else {
        +      $(container).append(content);
        +    }
        +  };
        +
        +  return Results;
        +});
        +
        +S2.define('select2/keys',[
        +
        +], function () {
        +  var KEYS = {
        +    BACKSPACE: 8,
        +    TAB: 9,
        +    ENTER: 13,
        +    SHIFT: 16,
        +    CTRL: 17,
        +    ALT: 18,
        +    ESC: 27,
        +    SPACE: 32,
        +    PAGE_UP: 33,
        +    PAGE_DOWN: 34,
        +    END: 35,
        +    HOME: 36,
        +    LEFT: 37,
        +    UP: 38,
        +    RIGHT: 39,
        +    DOWN: 40,
        +    DELETE: 46
        +  };
        +
        +  return KEYS;
        +});
        +
        +S2.define('select2/selection/base',[
        +  'jquery',
        +  '../utils',
        +  '../keys'
        +], function ($, Utils, KEYS) {
        +  function BaseSelection ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    BaseSelection.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(BaseSelection, Utils.Observable);
        +
        +  BaseSelection.prototype.render = function () {
        +    var $selection = $(
        +      '<span class="select2-selection" role="combobox" ' +
        +      ' aria-haspopup="true" aria-expanded="false">' +
        +      '</span>'
        +    );
        +
        +    this._tabindex = 0;
        +
        +    if (this.$element.data('old-tabindex') != null) {
        +      this._tabindex = this.$element.data('old-tabindex');
        +    } else if (this.$element.attr('tabindex') != null) {
        +      this._tabindex = this.$element.attr('tabindex');
        +    }
        +
        +    $selection.attr('title', this.$element.attr('title'));
        +    $selection.attr('tabindex', this._tabindex);
        +
        +    this.$selection = $selection;
        +
        +    return $selection;
        +  };
        +
        +  BaseSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    var id = container.id + '-container';
        +    var resultsId = container.id + '-results';
        +
        +    this.container = container;
        +
        +    this.$selection.on('focus', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this.$selection.on('blur', function (evt) {
        +      self._handleBlur(evt);
        +    });
        +
        +    this.$selection.on('keydown', function (evt) {
        +      self.trigger('keypress', evt);
        +
        +      if (evt.which === KEYS.SPACE) {
        +        evt.preventDefault();
        +      }
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      self.$selection.attr('aria-activedescendant', params.data._resultId);
        +    });
        +
        +    container.on('selection:update', function (params) {
        +      self.update(params.data);
        +    });
        +
        +    container.on('open', function () {
        +      // When the dropdown is open, aria-expanded="true"
        +      self.$selection.attr('aria-expanded', 'true');
        +      self.$selection.attr('aria-owns', resultsId);
        +
        +      self._attachCloseHandler(container);
        +    });
        +
        +    container.on('close', function () {
        +      // When the dropdown is closed, aria-expanded="false"
        +      self.$selection.attr('aria-expanded', 'false');
        +      self.$selection.removeAttr('aria-activedescendant');
        +      self.$selection.removeAttr('aria-owns');
        +
        +      self.$selection.focus();
        +
        +      self._detachCloseHandler(container);
        +    });
        +
        +    container.on('enable', function () {
        +      self.$selection.attr('tabindex', self._tabindex);
        +    });
        +
        +    container.on('disable', function () {
        +      self.$selection.attr('tabindex', '-1');
        +    });
        +  };
        +
        +  BaseSelection.prototype._handleBlur = function (evt) {
        +    var self = this;
        +
        +    // This needs to be delayed as the active element is the body when the tab
        +    // key is pressed, possibly along with others.
        +    window.setTimeout(function () {
        +      // Don't trigger `blur` if the focus is still in the selection
        +      if (
        +        (document.activeElement == self.$selection[0]) ||
        +        ($.contains(self.$selection[0], document.activeElement))
        +      ) {
        +        return;
        +      }
        +
        +      self.trigger('blur', evt);
        +    }, 1);
        +  };
        +
        +  BaseSelection.prototype._attachCloseHandler = function (container) {
        +    var self = this;
        +
        +    $(document.body).on('mousedown.select2.' + container.id, function (e) {
        +      var $target = $(e.target);
        +
        +      var $select = $target.closest('.select2');
        +
        +      var $all = $('.select2.select2-container--open');
        +
        +      $all.each(function () {
        +        var $this = $(this);
        +
        +        if (this == $select[0]) {
        +          return;
        +        }
        +
        +        var $element = $this.data('element');
        +
        +        $element.select2('close');
        +      });
        +    });
        +  };
        +
        +  BaseSelection.prototype._detachCloseHandler = function (container) {
        +    $(document.body).off('mousedown.select2.' + container.id);
        +  };
        +
        +  BaseSelection.prototype.position = function ($selection, $container) {
        +    var $selectionContainer = $container.find('.selection');
        +    $selectionContainer.append($selection);
        +  };
        +
        +  BaseSelection.prototype.destroy = function () {
        +    this._detachCloseHandler(this.container);
        +  };
        +
        +  BaseSelection.prototype.update = function (data) {
        +    throw new Error('The `update` method must be defined in child classes.');
        +  };
        +
        +  return BaseSelection;
        +});
        +
        +S2.define('select2/selection/single',[
        +  'jquery',
        +  './base',
        +  '../utils',
        +  '../keys'
        +], function ($, BaseSelection, Utils, KEYS) {
        +  function SingleSelection () {
        +    SingleSelection.__super__.constructor.apply(this, arguments);
        +  }
        +
        +  Utils.Extend(SingleSelection, BaseSelection);
        +
        +  SingleSelection.prototype.render = function () {
        +    var $selection = SingleSelection.__super__.render.call(this);
        +
        +    $selection.addClass('select2-selection--single');
        +
        +    $selection.html(
        +      '<span class="select2-selection__rendered"></span>' +
        +      '<span class="select2-selection__arrow" role="presentation">' +
        +        '<b role="presentation"></b>' +
        +      '</span>'
        +    );
        +
        +    return $selection;
        +  };
        +
        +  SingleSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    SingleSelection.__super__.bind.apply(this, arguments);
        +
        +    var id = container.id + '-container';
        +
        +    this.$selection.find('.select2-selection__rendered').attr('id', id);
        +    this.$selection.attr('aria-labelledby', id);
        +
        +    this.$selection.on('mousedown', function (evt) {
        +      // Only respond to left clicks
        +      if (evt.which !== 1) {
        +        return;
        +      }
        +
        +      self.trigger('toggle', {
        +        originalEvent: evt
        +      });
        +    });
        +
        +    this.$selection.on('focus', function (evt) {
        +      // User focuses on the container
        +    });
        +
        +    this.$selection.on('blur', function (evt) {
        +      // User exits the container
        +    });
        +
        +    container.on('focus', function (evt) {
        +      if (!container.isOpen()) {
        +        self.$selection.focus();
        +      }
        +    });
        +
        +    container.on('selection:update', function (params) {
        +      self.update(params.data);
        +    });
        +  };
        +
        +  SingleSelection.prototype.clear = function () {
        +    this.$selection.find('.select2-selection__rendered').empty();
        +  };
        +
        +  SingleSelection.prototype.display = function (data, container) {
        +    var template = this.options.get('templateSelection');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    return escapeMarkup(template(data, container));
        +  };
        +
        +  SingleSelection.prototype.selectionContainer = function () {
        +    return $('<span></span>');
        +  };
        +
        +  SingleSelection.prototype.update = function (data) {
        +    if (data.length === 0) {
        +      this.clear();
        +      return;
        +    }
        +
        +    var selection = data[0];
        +
        +    var $rendered = this.$selection.find('.select2-selection__rendered');
        +    var formatted = this.display(selection, $rendered);
        +
        +    $rendered.empty().append(formatted);
        +    $rendered.prop('title', selection.title || selection.text);
        +  };
        +
        +  return SingleSelection;
        +});
        +
        +S2.define('select2/selection/multiple',[
        +  'jquery',
        +  './base',
        +  '../utils'
        +], function ($, BaseSelection, Utils) {
        +  function MultipleSelection ($element, options) {
        +    MultipleSelection.__super__.constructor.apply(this, arguments);
        +  }
        +
        +  Utils.Extend(MultipleSelection, BaseSelection);
        +
        +  MultipleSelection.prototype.render = function () {
        +    var $selection = MultipleSelection.__super__.render.call(this);
        +
        +    $selection.addClass('select2-selection--multiple');
        +
        +    $selection.html(
        +      '<ul class="select2-selection__rendered"></ul>'
        +    );
        +
        +    return $selection;
        +  };
        +
        +  MultipleSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    MultipleSelection.__super__.bind.apply(this, arguments);
        +
        +    this.$selection.on('click', function (evt) {
        +      self.trigger('toggle', {
        +        originalEvent: evt
        +      });
        +    });
        +
        +    this.$selection.on(
        +      'click',
        +      '.select2-selection__choice__remove',
        +      function (evt) {
        +        // Ignore the event if it is disabled
        +        if (self.options.get('disabled')) {
        +          return;
        +        }
        +
        +        var $remove = $(this);
        +        var $selection = $remove.parent();
        +
        +        var data = $selection.data('data');
        +
        +        self.trigger('unselect', {
        +          originalEvent: evt,
        +          data: data
        +        });
        +      }
        +    );
        +  };
        +
        +  MultipleSelection.prototype.clear = function () {
        +    this.$selection.find('.select2-selection__rendered').empty();
        +  };
        +
        +  MultipleSelection.prototype.display = function (data, container) {
        +    var template = this.options.get('templateSelection');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    return escapeMarkup(template(data, container));
        +  };
        +
        +  MultipleSelection.prototype.selectionContainer = function () {
        +    var $container = $(
        +      '<li class="select2-selection__choice">' +
        +        '<span class="select2-selection__choice__remove" role="presentation">' +
        +          '&times;' +
        +        '</span>' +
        +      '</li>'
        +    );
        +
        +    return $container;
        +  };
        +
        +  MultipleSelection.prototype.update = function (data) {
        +    this.clear();
        +
        +    if (data.length === 0) {
        +      return;
        +    }
        +
        +    var $selections = [];
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var selection = data[d];
        +
        +      var $selection = this.selectionContainer();
        +      var formatted = this.display(selection, $selection);
        +
        +      $selection.append(formatted);
        +      $selection.prop('title', selection.title || selection.text);
        +
        +      $selection.data('data', selection);
        +
        +      $selections.push($selection);
        +    }
        +
        +    var $rendered = this.$selection.find('.select2-selection__rendered');
        +
        +    Utils.appendMany($rendered, $selections);
        +  };
        +
        +  return MultipleSelection;
        +});
        +
        +S2.define('select2/selection/placeholder',[
        +  '../utils'
        +], function (Utils) {
        +  function Placeholder (decorated, $element, options) {
        +    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
        +    if (typeof placeholder === 'string') {
        +      placeholder = {
        +        id: '',
        +        text: placeholder
        +      };
        +    }
        +
        +    return placeholder;
        +  };
        +
        +  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
        +    var $placeholder = this.selectionContainer();
        +
        +    $placeholder.html(this.display(placeholder));
        +    $placeholder.addClass('select2-selection__placeholder')
        +                .removeClass('select2-selection__choice');
        +
        +    return $placeholder;
        +  };
        +
        +  Placeholder.prototype.update = function (decorated, data) {
        +    var singlePlaceholder = (
        +      data.length == 1 && data[0].id != this.placeholder.id
        +    );
        +    var multipleSelections = data.length > 1;
        +
        +    if (multipleSelections || singlePlaceholder) {
        +      return decorated.call(this, data);
        +    }
        +
        +    this.clear();
        +
        +    var $placeholder = this.createPlaceholder(this.placeholder);
        +
        +    this.$selection.find('.select2-selection__rendered').append($placeholder);
        +  };
        +
        +  return Placeholder;
        +});
        +
        +S2.define('select2/selection/allowClear',[
        +  'jquery',
        +  '../keys'
        +], function ($, KEYS) {
        +  function AllowClear () { }
        +
        +  AllowClear.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    if (this.placeholder == null) {
        +      if (this.options.get('debug') && window.console && console.error) {
        +        console.error(
        +          'Select2: The `allowClear` option should be used in combination ' +
        +          'with the `placeholder` option.'
        +        );
        +      }
        +    }
        +
        +    this.$selection.on('mousedown', '.select2-selection__clear',
        +      function (evt) {
        +        self._handleClear(evt);
        +    });
        +
        +    container.on('keypress', function (evt) {
        +      self._handleKeyboardClear(evt, container);
        +    });
        +  };
        +
        +  AllowClear.prototype._handleClear = function (_, evt) {
        +    // Ignore the event if it is disabled
        +    if (this.options.get('disabled')) {
        +      return;
        +    }
        +
        +    var $clear = this.$selection.find('.select2-selection__clear');
        +
        +    // Ignore the event if nothing has been selected
        +    if ($clear.length === 0) {
        +      return;
        +    }
        +
        +    evt.stopPropagation();
        +
        +    var data = $clear.data('data');
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var unselectData = {
        +        data: data[d]
        +      };
        +
        +      // Trigger the `unselect` event, so people can prevent it from being
        +      // cleared.
        +      this.trigger('unselect', unselectData);
        +
        +      // If the event was prevented, don't clear it out.
        +      if (unselectData.prevented) {
        +        return;
        +      }
        +    }
        +
        +    this.$element.val(this.placeholder.id).trigger('change');
        +
        +    this.trigger('toggle', {});
        +  };
        +
        +  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
        +    if (container.isOpen()) {
        +      return;
        +    }
        +
        +    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
        +      this._handleClear(evt);
        +    }
        +  };
        +
        +  AllowClear.prototype.update = function (decorated, data) {
        +    decorated.call(this, data);
        +
        +    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
        +        data.length === 0) {
        +      return;
        +    }
        +
        +    var $remove = $(
        +      '<span class="select2-selection__clear">' +
        +        '&times;' +
        +      '</span>'
        +    );
        +    $remove.data('data', data);
        +
        +    this.$selection.find('.select2-selection__rendered').prepend($remove);
        +  };
        +
        +  return AllowClear;
        +});
        +
        +S2.define('select2/selection/search',[
        +  'jquery',
        +  '../utils',
        +  '../keys'
        +], function ($, Utils, KEYS) {
        +  function Search (decorated, $element, options) {
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Search.prototype.render = function (decorated) {
        +    var $search = $(
        +      '<li class="select2-search select2-search--inline">' +
        +        '<input class="select2-search__field" type="search" tabindex="-1"' +
        +        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        +        ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
        +      '</li>'
        +    );
        +
        +    this.$searchContainer = $search;
        +    this.$search = $search.find('input');
        +
        +    var $rendered = decorated.call(this);
        +
        +    this._transferTabIndex();
        +
        +    return $rendered;
        +  };
        +
        +  Search.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('open', function () {
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('close', function () {
        +      self.$search.val('');
        +      self.$search.removeAttr('aria-activedescendant');
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('enable', function () {
        +      self.$search.prop('disabled', false);
        +
        +      self._transferTabIndex();
        +    });
        +
        +    container.on('disable', function () {
        +      self.$search.prop('disabled', true);
        +    });
        +
        +    container.on('focus', function (evt) {
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      self.$search.attr('aria-activedescendant', params.id);
        +    });
        +
        +    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
        +      self._handleBlur(evt);
        +    });
        +
        +    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
        +      evt.stopPropagation();
        +
        +      self.trigger('keypress', evt);
        +
        +      self._keyUpPrevented = evt.isDefaultPrevented();
        +
        +      var key = evt.which;
        +
        +      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
        +        var $previousChoice = self.$searchContainer
        +          .prev('.select2-selection__choice');
        +
        +        if ($previousChoice.length > 0) {
        +          var item = $previousChoice.data('data');
        +
        +          self.searchRemoveChoice(item);
        +
        +          evt.preventDefault();
        +        }
        +      }
        +    });
        +
        +    // Try to detect the IE version should the `documentMode` property that
        +    // is stored on the document. This is only implemented in IE and is
        +    // slightly cleaner than doing a user agent check.
        +    // This property is not available in Edge, but Edge also doesn't have
        +    // this bug.
        +    var msie = document.documentMode;
        +    var disableInputEvents = msie && msie <= 11;
        +
        +    // Workaround for browsers which do not support the `input` event
        +    // This will prevent double-triggering of events for browsers which support
        +    // both the `keyup` and `input` events.
        +    this.$selection.on(
        +      'input.searchcheck',
        +      '.select2-search--inline',
        +      function (evt) {
        +        // IE will trigger the `input` event when a placeholder is used on a
        +        // search box. To get around this issue, we are forced to ignore all
        +        // `input` events in IE and keep using `keyup`.
        +        if (disableInputEvents) {
        +          self.$selection.off('input.search input.searchcheck');
        +          return;
        +        }
        +
        +        // Unbind the duplicated `keyup` event
        +        self.$selection.off('keyup.search');
        +      }
        +    );
        +
        +    this.$selection.on(
        +      'keyup.search input.search',
        +      '.select2-search--inline',
        +      function (evt) {
        +        // IE will trigger the `input` event when a placeholder is used on a
        +        // search box. To get around this issue, we are forced to ignore all
        +        // `input` events in IE and keep using `keyup`.
        +        if (disableInputEvents && evt.type === 'input') {
        +          self.$selection.off('input.search input.searchcheck');
        +          return;
        +        }
        +
        +        var key = evt.which;
        +
        +        // We can freely ignore events from modifier keys
        +        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
        +          return;
        +        }
        +
        +        // Tabbing will be handled during the `keydown` phase
        +        if (key == KEYS.TAB) {
        +          return;
        +        }
        +
        +        self.handleSearch(evt);
        +      }
        +    );
        +  };
        +
        +  /**
        +   * This method will transfer the tabindex attribute from the rendered
        +   * selection to the search box. This allows for the search box to be used as
        +   * the primary focus instead of the selection container.
        +   *
        +   * @private
        +   */
        +  Search.prototype._transferTabIndex = function (decorated) {
        +    this.$search.attr('tabindex', this.$selection.attr('tabindex'));
        +    this.$selection.attr('tabindex', '-1');
        +  };
        +
        +  Search.prototype.createPlaceholder = function (decorated, placeholder) {
        +    this.$search.attr('placeholder', placeholder.text);
        +  };
        +
        +  Search.prototype.update = function (decorated, data) {
        +    var searchHadFocus = this.$search[0] == document.activeElement;
        +
        +    this.$search.attr('placeholder', '');
        +
        +    decorated.call(this, data);
        +
        +    this.$selection.find('.select2-selection__rendered')
        +                   .append(this.$searchContainer);
        +
        +    this.resizeSearch();
        +    if (searchHadFocus) {
        +      this.$search.focus();
        +    }
        +  };
        +
        +  Search.prototype.handleSearch = function () {
        +    this.resizeSearch();
        +
        +    if (!this._keyUpPrevented) {
        +      var input = this.$search.val();
        +
        +      this.trigger('query', {
        +        term: input
        +      });
        +    }
        +
        +    this._keyUpPrevented = false;
        +  };
        +
        +  Search.prototype.searchRemoveChoice = function (decorated, item) {
        +    this.trigger('unselect', {
        +      data: item
        +    });
        +
        +    this.$search.val(item.text);
        +    this.handleSearch();
        +  };
        +
        +  Search.prototype.resizeSearch = function () {
        +    this.$search.css('width', '25px');
        +
        +    var width = '';
        +
        +    if (this.$search.attr('placeholder') !== '') {
        +      width = this.$selection.find('.select2-selection__rendered').innerWidth();
        +    } else {
        +      var minimumWidth = this.$search.val().length + 1;
        +
        +      width = (minimumWidth * 0.75) + 'em';
        +    }
        +
        +    this.$search.css('width', width);
        +  };
        +
        +  return Search;
        +});
        +
        +S2.define('select2/selection/eventRelay',[
        +  'jquery'
        +], function ($) {
        +  function EventRelay () { }
        +
        +  EventRelay.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +    var relayEvents = [
        +      'open', 'opening',
        +      'close', 'closing',
        +      'select', 'selecting',
        +      'unselect', 'unselecting'
        +    ];
        +
        +    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('*', function (name, params) {
        +      // Ignore events that should not be relayed
        +      if ($.inArray(name, relayEvents) === -1) {
        +        return;
        +      }
        +
        +      // The parameters should always be an object
        +      params = params || {};
        +
        +      // Generate the jQuery event for the Select2 event
        +      var evt = $.Event('select2:' + name, {
        +        params: params
        +      });
        +
        +      self.$element.trigger(evt);
        +
        +      // Only handle preventable events if it was one
        +      if ($.inArray(name, preventableEvents) === -1) {
        +        return;
        +      }
        +
        +      params.prevented = evt.isDefaultPrevented();
        +    });
        +  };
        +
        +  return EventRelay;
        +});
        +
        +S2.define('select2/translation',[
        +  'jquery',
        +  'require'
        +], function ($, require) {
        +  function Translation (dict) {
        +    this.dict = dict || {};
        +  }
        +
        +  Translation.prototype.all = function () {
        +    return this.dict;
        +  };
        +
        +  Translation.prototype.get = function (key) {
        +    return this.dict[key];
        +  };
        +
        +  Translation.prototype.extend = function (translation) {
        +    this.dict = $.extend({}, translation.all(), this.dict);
        +  };
        +
        +  // Static functions
        +
        +  Translation._cache = {};
        +
        +  Translation.loadPath = function (path) {
        +    if (!(path in Translation._cache)) {
        +      var translations = require(path);
        +
        +      Translation._cache[path] = translations;
        +    }
        +
        +    return new Translation(Translation._cache[path]);
        +  };
        +
        +  return Translation;
        +});
        +
        +S2.define('select2/diacritics',[
        +
        +], function () {
        +  var diacritics = {
        +    '\u24B6': 'A',
        +    '\uFF21': 'A',
        +    '\u00C0': 'A',
        +    '\u00C1': 'A',
        +    '\u00C2': 'A',
        +    '\u1EA6': 'A',
        +    '\u1EA4': 'A',
        +    '\u1EAA': 'A',
        +    '\u1EA8': 'A',
        +    '\u00C3': 'A',
        +    '\u0100': 'A',
        +    '\u0102': 'A',
        +    '\u1EB0': 'A',
        +    '\u1EAE': 'A',
        +    '\u1EB4': 'A',
        +    '\u1EB2': 'A',
        +    '\u0226': 'A',
        +    '\u01E0': 'A',
        +    '\u00C4': 'A',
        +    '\u01DE': 'A',
        +    '\u1EA2': 'A',
        +    '\u00C5': 'A',
        +    '\u01FA': 'A',
        +    '\u01CD': 'A',
        +    '\u0200': 'A',
        +    '\u0202': 'A',
        +    '\u1EA0': 'A',
        +    '\u1EAC': 'A',
        +    '\u1EB6': 'A',
        +    '\u1E00': 'A',
        +    '\u0104': 'A',
        +    '\u023A': 'A',
        +    '\u2C6F': 'A',
        +    '\uA732': 'AA',
        +    '\u00C6': 'AE',
        +    '\u01FC': 'AE',
        +    '\u01E2': 'AE',
        +    '\uA734': 'AO',
        +    '\uA736': 'AU',
        +    '\uA738': 'AV',
        +    '\uA73A': 'AV',
        +    '\uA73C': 'AY',
        +    '\u24B7': 'B',
        +    '\uFF22': 'B',
        +    '\u1E02': 'B',
        +    '\u1E04': 'B',
        +    '\u1E06': 'B',
        +    '\u0243': 'B',
        +    '\u0182': 'B',
        +    '\u0181': 'B',
        +    '\u24B8': 'C',
        +    '\uFF23': 'C',
        +    '\u0106': 'C',
        +    '\u0108': 'C',
        +    '\u010A': 'C',
        +    '\u010C': 'C',
        +    '\u00C7': 'C',
        +    '\u1E08': 'C',
        +    '\u0187': 'C',
        +    '\u023B': 'C',
        +    '\uA73E': 'C',
        +    '\u24B9': 'D',
        +    '\uFF24': 'D',
        +    '\u1E0A': 'D',
        +    '\u010E': 'D',
        +    '\u1E0C': 'D',
        +    '\u1E10': 'D',
        +    '\u1E12': 'D',
        +    '\u1E0E': 'D',
        +    '\u0110': 'D',
        +    '\u018B': 'D',
        +    '\u018A': 'D',
        +    '\u0189': 'D',
        +    '\uA779': 'D',
        +    '\u01F1': 'DZ',
        +    '\u01C4': 'DZ',
        +    '\u01F2': 'Dz',
        +    '\u01C5': 'Dz',
        +    '\u24BA': 'E',
        +    '\uFF25': 'E',
        +    '\u00C8': 'E',
        +    '\u00C9': 'E',
        +    '\u00CA': 'E',
        +    '\u1EC0': 'E',
        +    '\u1EBE': 'E',
        +    '\u1EC4': 'E',
        +    '\u1EC2': 'E',
        +    '\u1EBC': 'E',
        +    '\u0112': 'E',
        +    '\u1E14': 'E',
        +    '\u1E16': 'E',
        +    '\u0114': 'E',
        +    '\u0116': 'E',
        +    '\u00CB': 'E',
        +    '\u1EBA': 'E',
        +    '\u011A': 'E',
        +    '\u0204': 'E',
        +    '\u0206': 'E',
        +    '\u1EB8': 'E',
        +    '\u1EC6': 'E',
        +    '\u0228': 'E',
        +    '\u1E1C': 'E',
        +    '\u0118': 'E',
        +    '\u1E18': 'E',
        +    '\u1E1A': 'E',
        +    '\u0190': 'E',
        +    '\u018E': 'E',
        +    '\u24BB': 'F',
        +    '\uFF26': 'F',
        +    '\u1E1E': 'F',
        +    '\u0191': 'F',
        +    '\uA77B': 'F',
        +    '\u24BC': 'G',
        +    '\uFF27': 'G',
        +    '\u01F4': 'G',
        +    '\u011C': 'G',
        +    '\u1E20': 'G',
        +    '\u011E': 'G',
        +    '\u0120': 'G',
        +    '\u01E6': 'G',
        +    '\u0122': 'G',
        +    '\u01E4': 'G',
        +    '\u0193': 'G',
        +    '\uA7A0': 'G',
        +    '\uA77D': 'G',
        +    '\uA77E': 'G',
        +    '\u24BD': 'H',
        +    '\uFF28': 'H',
        +    '\u0124': 'H',
        +    '\u1E22': 'H',
        +    '\u1E26': 'H',
        +    '\u021E': 'H',
        +    '\u1E24': 'H',
        +    '\u1E28': 'H',
        +    '\u1E2A': 'H',
        +    '\u0126': 'H',
        +    '\u2C67': 'H',
        +    '\u2C75': 'H',
        +    '\uA78D': 'H',
        +    '\u24BE': 'I',
        +    '\uFF29': 'I',
        +    '\u00CC': 'I',
        +    '\u00CD': 'I',
        +    '\u00CE': 'I',
        +    '\u0128': 'I',
        +    '\u012A': 'I',
        +    '\u012C': 'I',
        +    '\u0130': 'I',
        +    '\u00CF': 'I',
        +    '\u1E2E': 'I',
        +    '\u1EC8': 'I',
        +    '\u01CF': 'I',
        +    '\u0208': 'I',
        +    '\u020A': 'I',
        +    '\u1ECA': 'I',
        +    '\u012E': 'I',
        +    '\u1E2C': 'I',
        +    '\u0197': 'I',
        +    '\u24BF': 'J',
        +    '\uFF2A': 'J',
        +    '\u0134': 'J',
        +    '\u0248': 'J',
        +    '\u24C0': 'K',
        +    '\uFF2B': 'K',
        +    '\u1E30': 'K',
        +    '\u01E8': 'K',
        +    '\u1E32': 'K',
        +    '\u0136': 'K',
        +    '\u1E34': 'K',
        +    '\u0198': 'K',
        +    '\u2C69': 'K',
        +    '\uA740': 'K',
        +    '\uA742': 'K',
        +    '\uA744': 'K',
        +    '\uA7A2': 'K',
        +    '\u24C1': 'L',
        +    '\uFF2C': 'L',
        +    '\u013F': 'L',
        +    '\u0139': 'L',
        +    '\u013D': 'L',
        +    '\u1E36': 'L',
        +    '\u1E38': 'L',
        +    '\u013B': 'L',
        +    '\u1E3C': 'L',
        +    '\u1E3A': 'L',
        +    '\u0141': 'L',
        +    '\u023D': 'L',
        +    '\u2C62': 'L',
        +    '\u2C60': 'L',
        +    '\uA748': 'L',
        +    '\uA746': 'L',
        +    '\uA780': 'L',
        +    '\u01C7': 'LJ',
        +    '\u01C8': 'Lj',
        +    '\u24C2': 'M',
        +    '\uFF2D': 'M',
        +    '\u1E3E': 'M',
        +    '\u1E40': 'M',
        +    '\u1E42': 'M',
        +    '\u2C6E': 'M',
        +    '\u019C': 'M',
        +    '\u24C3': 'N',
        +    '\uFF2E': 'N',
        +    '\u01F8': 'N',
        +    '\u0143': 'N',
        +    '\u00D1': 'N',
        +    '\u1E44': 'N',
        +    '\u0147': 'N',
        +    '\u1E46': 'N',
        +    '\u0145': 'N',
        +    '\u1E4A': 'N',
        +    '\u1E48': 'N',
        +    '\u0220': 'N',
        +    '\u019D': 'N',
        +    '\uA790': 'N',
        +    '\uA7A4': 'N',
        +    '\u01CA': 'NJ',
        +    '\u01CB': 'Nj',
        +    '\u24C4': 'O',
        +    '\uFF2F': 'O',
        +    '\u00D2': 'O',
        +    '\u00D3': 'O',
        +    '\u00D4': 'O',
        +    '\u1ED2': 'O',
        +    '\u1ED0': 'O',
        +    '\u1ED6': 'O',
        +    '\u1ED4': 'O',
        +    '\u00D5': 'O',
        +    '\u1E4C': 'O',
        +    '\u022C': 'O',
        +    '\u1E4E': 'O',
        +    '\u014C': 'O',
        +    '\u1E50': 'O',
        +    '\u1E52': 'O',
        +    '\u014E': 'O',
        +    '\u022E': 'O',
        +    '\u0230': 'O',
        +    '\u00D6': 'O',
        +    '\u022A': 'O',
        +    '\u1ECE': 'O',
        +    '\u0150': 'O',
        +    '\u01D1': 'O',
        +    '\u020C': 'O',
        +    '\u020E': 'O',
        +    '\u01A0': 'O',
        +    '\u1EDC': 'O',
        +    '\u1EDA': 'O',
        +    '\u1EE0': 'O',
        +    '\u1EDE': 'O',
        +    '\u1EE2': 'O',
        +    '\u1ECC': 'O',
        +    '\u1ED8': 'O',
        +    '\u01EA': 'O',
        +    '\u01EC': 'O',
        +    '\u00D8': 'O',
        +    '\u01FE': 'O',
        +    '\u0186': 'O',
        +    '\u019F': 'O',
        +    '\uA74A': 'O',
        +    '\uA74C': 'O',
        +    '\u01A2': 'OI',
        +    '\uA74E': 'OO',
        +    '\u0222': 'OU',
        +    '\u24C5': 'P',
        +    '\uFF30': 'P',
        +    '\u1E54': 'P',
        +    '\u1E56': 'P',
        +    '\u01A4': 'P',
        +    '\u2C63': 'P',
        +    '\uA750': 'P',
        +    '\uA752': 'P',
        +    '\uA754': 'P',
        +    '\u24C6': 'Q',
        +    '\uFF31': 'Q',
        +    '\uA756': 'Q',
        +    '\uA758': 'Q',
        +    '\u024A': 'Q',
        +    '\u24C7': 'R',
        +    '\uFF32': 'R',
        +    '\u0154': 'R',
        +    '\u1E58': 'R',
        +    '\u0158': 'R',
        +    '\u0210': 'R',
        +    '\u0212': 'R',
        +    '\u1E5A': 'R',
        +    '\u1E5C': 'R',
        +    '\u0156': 'R',
        +    '\u1E5E': 'R',
        +    '\u024C': 'R',
        +    '\u2C64': 'R',
        +    '\uA75A': 'R',
        +    '\uA7A6': 'R',
        +    '\uA782': 'R',
        +    '\u24C8': 'S',
        +    '\uFF33': 'S',
        +    '\u1E9E': 'S',
        +    '\u015A': 'S',
        +    '\u1E64': 'S',
        +    '\u015C': 'S',
        +    '\u1E60': 'S',
        +    '\u0160': 'S',
        +    '\u1E66': 'S',
        +    '\u1E62': 'S',
        +    '\u1E68': 'S',
        +    '\u0218': 'S',
        +    '\u015E': 'S',
        +    '\u2C7E': 'S',
        +    '\uA7A8': 'S',
        +    '\uA784': 'S',
        +    '\u24C9': 'T',
        +    '\uFF34': 'T',
        +    '\u1E6A': 'T',
        +    '\u0164': 'T',
        +    '\u1E6C': 'T',
        +    '\u021A': 'T',
        +    '\u0162': 'T',
        +    '\u1E70': 'T',
        +    '\u1E6E': 'T',
        +    '\u0166': 'T',
        +    '\u01AC': 'T',
        +    '\u01AE': 'T',
        +    '\u023E': 'T',
        +    '\uA786': 'T',
        +    '\uA728': 'TZ',
        +    '\u24CA': 'U',
        +    '\uFF35': 'U',
        +    '\u00D9': 'U',
        +    '\u00DA': 'U',
        +    '\u00DB': 'U',
        +    '\u0168': 'U',
        +    '\u1E78': 'U',
        +    '\u016A': 'U',
        +    '\u1E7A': 'U',
        +    '\u016C': 'U',
        +    '\u00DC': 'U',
        +    '\u01DB': 'U',
        +    '\u01D7': 'U',
        +    '\u01D5': 'U',
        +    '\u01D9': 'U',
        +    '\u1EE6': 'U',
        +    '\u016E': 'U',
        +    '\u0170': 'U',
        +    '\u01D3': 'U',
        +    '\u0214': 'U',
        +    '\u0216': 'U',
        +    '\u01AF': 'U',
        +    '\u1EEA': 'U',
        +    '\u1EE8': 'U',
        +    '\u1EEE': 'U',
        +    '\u1EEC': 'U',
        +    '\u1EF0': 'U',
        +    '\u1EE4': 'U',
        +    '\u1E72': 'U',
        +    '\u0172': 'U',
        +    '\u1E76': 'U',
        +    '\u1E74': 'U',
        +    '\u0244': 'U',
        +    '\u24CB': 'V',
        +    '\uFF36': 'V',
        +    '\u1E7C': 'V',
        +    '\u1E7E': 'V',
        +    '\u01B2': 'V',
        +    '\uA75E': 'V',
        +    '\u0245': 'V',
        +    '\uA760': 'VY',
        +    '\u24CC': 'W',
        +    '\uFF37': 'W',
        +    '\u1E80': 'W',
        +    '\u1E82': 'W',
        +    '\u0174': 'W',
        +    '\u1E86': 'W',
        +    '\u1E84': 'W',
        +    '\u1E88': 'W',
        +    '\u2C72': 'W',
        +    '\u24CD': 'X',
        +    '\uFF38': 'X',
        +    '\u1E8A': 'X',
        +    '\u1E8C': 'X',
        +    '\u24CE': 'Y',
        +    '\uFF39': 'Y',
        +    '\u1EF2': 'Y',
        +    '\u00DD': 'Y',
        +    '\u0176': 'Y',
        +    '\u1EF8': 'Y',
        +    '\u0232': 'Y',
        +    '\u1E8E': 'Y',
        +    '\u0178': 'Y',
        +    '\u1EF6': 'Y',
        +    '\u1EF4': 'Y',
        +    '\u01B3': 'Y',
        +    '\u024E': 'Y',
        +    '\u1EFE': 'Y',
        +    '\u24CF': 'Z',
        +    '\uFF3A': 'Z',
        +    '\u0179': 'Z',
        +    '\u1E90': 'Z',
        +    '\u017B': 'Z',
        +    '\u017D': 'Z',
        +    '\u1E92': 'Z',
        +    '\u1E94': 'Z',
        +    '\u01B5': 'Z',
        +    '\u0224': 'Z',
        +    '\u2C7F': 'Z',
        +    '\u2C6B': 'Z',
        +    '\uA762': 'Z',
        +    '\u24D0': 'a',
        +    '\uFF41': 'a',
        +    '\u1E9A': 'a',
        +    '\u00E0': 'a',
        +    '\u00E1': 'a',
        +    '\u00E2': 'a',
        +    '\u1EA7': 'a',
        +    '\u1EA5': 'a',
        +    '\u1EAB': 'a',
        +    '\u1EA9': 'a',
        +    '\u00E3': 'a',
        +    '\u0101': 'a',
        +    '\u0103': 'a',
        +    '\u1EB1': 'a',
        +    '\u1EAF': 'a',
        +    '\u1EB5': 'a',
        +    '\u1EB3': 'a',
        +    '\u0227': 'a',
        +    '\u01E1': 'a',
        +    '\u00E4': 'a',
        +    '\u01DF': 'a',
        +    '\u1EA3': 'a',
        +    '\u00E5': 'a',
        +    '\u01FB': 'a',
        +    '\u01CE': 'a',
        +    '\u0201': 'a',
        +    '\u0203': 'a',
        +    '\u1EA1': 'a',
        +    '\u1EAD': 'a',
        +    '\u1EB7': 'a',
        +    '\u1E01': 'a',
        +    '\u0105': 'a',
        +    '\u2C65': 'a',
        +    '\u0250': 'a',
        +    '\uA733': 'aa',
        +    '\u00E6': 'ae',
        +    '\u01FD': 'ae',
        +    '\u01E3': 'ae',
        +    '\uA735': 'ao',
        +    '\uA737': 'au',
        +    '\uA739': 'av',
        +    '\uA73B': 'av',
        +    '\uA73D': 'ay',
        +    '\u24D1': 'b',
        +    '\uFF42': 'b',
        +    '\u1E03': 'b',
        +    '\u1E05': 'b',
        +    '\u1E07': 'b',
        +    '\u0180': 'b',
        +    '\u0183': 'b',
        +    '\u0253': 'b',
        +    '\u24D2': 'c',
        +    '\uFF43': 'c',
        +    '\u0107': 'c',
        +    '\u0109': 'c',
        +    '\u010B': 'c',
        +    '\u010D': 'c',
        +    '\u00E7': 'c',
        +    '\u1E09': 'c',
        +    '\u0188': 'c',
        +    '\u023C': 'c',
        +    '\uA73F': 'c',
        +    '\u2184': 'c',
        +    '\u24D3': 'd',
        +    '\uFF44': 'd',
        +    '\u1E0B': 'd',
        +    '\u010F': 'd',
        +    '\u1E0D': 'd',
        +    '\u1E11': 'd',
        +    '\u1E13': 'd',
        +    '\u1E0F': 'd',
        +    '\u0111': 'd',
        +    '\u018C': 'd',
        +    '\u0256': 'd',
        +    '\u0257': 'd',
        +    '\uA77A': 'd',
        +    '\u01F3': 'dz',
        +    '\u01C6': 'dz',
        +    '\u24D4': 'e',
        +    '\uFF45': 'e',
        +    '\u00E8': 'e',
        +    '\u00E9': 'e',
        +    '\u00EA': 'e',
        +    '\u1EC1': 'e',
        +    '\u1EBF': 'e',
        +    '\u1EC5': 'e',
        +    '\u1EC3': 'e',
        +    '\u1EBD': 'e',
        +    '\u0113': 'e',
        +    '\u1E15': 'e',
        +    '\u1E17': 'e',
        +    '\u0115': 'e',
        +    '\u0117': 'e',
        +    '\u00EB': 'e',
        +    '\u1EBB': 'e',
        +    '\u011B': 'e',
        +    '\u0205': 'e',
        +    '\u0207': 'e',
        +    '\u1EB9': 'e',
        +    '\u1EC7': 'e',
        +    '\u0229': 'e',
        +    '\u1E1D': 'e',
        +    '\u0119': 'e',
        +    '\u1E19': 'e',
        +    '\u1E1B': 'e',
        +    '\u0247': 'e',
        +    '\u025B': 'e',
        +    '\u01DD': 'e',
        +    '\u24D5': 'f',
        +    '\uFF46': 'f',
        +    '\u1E1F': 'f',
        +    '\u0192': 'f',
        +    '\uA77C': 'f',
        +    '\u24D6': 'g',
        +    '\uFF47': 'g',
        +    '\u01F5': 'g',
        +    '\u011D': 'g',
        +    '\u1E21': 'g',
        +    '\u011F': 'g',
        +    '\u0121': 'g',
        +    '\u01E7': 'g',
        +    '\u0123': 'g',
        +    '\u01E5': 'g',
        +    '\u0260': 'g',
        +    '\uA7A1': 'g',
        +    '\u1D79': 'g',
        +    '\uA77F': 'g',
        +    '\u24D7': 'h',
        +    '\uFF48': 'h',
        +    '\u0125': 'h',
        +    '\u1E23': 'h',
        +    '\u1E27': 'h',
        +    '\u021F': 'h',
        +    '\u1E25': 'h',
        +    '\u1E29': 'h',
        +    '\u1E2B': 'h',
        +    '\u1E96': 'h',
        +    '\u0127': 'h',
        +    '\u2C68': 'h',
        +    '\u2C76': 'h',
        +    '\u0265': 'h',
        +    '\u0195': 'hv',
        +    '\u24D8': 'i',
        +    '\uFF49': 'i',
        +    '\u00EC': 'i',
        +    '\u00ED': 'i',
        +    '\u00EE': 'i',
        +    '\u0129': 'i',
        +    '\u012B': 'i',
        +    '\u012D': 'i',
        +    '\u00EF': 'i',
        +    '\u1E2F': 'i',
        +    '\u1EC9': 'i',
        +    '\u01D0': 'i',
        +    '\u0209': 'i',
        +    '\u020B': 'i',
        +    '\u1ECB': 'i',
        +    '\u012F': 'i',
        +    '\u1E2D': 'i',
        +    '\u0268': 'i',
        +    '\u0131': 'i',
        +    '\u24D9': 'j',
        +    '\uFF4A': 'j',
        +    '\u0135': 'j',
        +    '\u01F0': 'j',
        +    '\u0249': 'j',
        +    '\u24DA': 'k',
        +    '\uFF4B': 'k',
        +    '\u1E31': 'k',
        +    '\u01E9': 'k',
        +    '\u1E33': 'k',
        +    '\u0137': 'k',
        +    '\u1E35': 'k',
        +    '\u0199': 'k',
        +    '\u2C6A': 'k',
        +    '\uA741': 'k',
        +    '\uA743': 'k',
        +    '\uA745': 'k',
        +    '\uA7A3': 'k',
        +    '\u24DB': 'l',
        +    '\uFF4C': 'l',
        +    '\u0140': 'l',
        +    '\u013A': 'l',
        +    '\u013E': 'l',
        +    '\u1E37': 'l',
        +    '\u1E39': 'l',
        +    '\u013C': 'l',
        +    '\u1E3D': 'l',
        +    '\u1E3B': 'l',
        +    '\u017F': 'l',
        +    '\u0142': 'l',
        +    '\u019A': 'l',
        +    '\u026B': 'l',
        +    '\u2C61': 'l',
        +    '\uA749': 'l',
        +    '\uA781': 'l',
        +    '\uA747': 'l',
        +    '\u01C9': 'lj',
        +    '\u24DC': 'm',
        +    '\uFF4D': 'm',
        +    '\u1E3F': 'm',
        +    '\u1E41': 'm',
        +    '\u1E43': 'm',
        +    '\u0271': 'm',
        +    '\u026F': 'm',
        +    '\u24DD': 'n',
        +    '\uFF4E': 'n',
        +    '\u01F9': 'n',
        +    '\u0144': 'n',
        +    '\u00F1': 'n',
        +    '\u1E45': 'n',
        +    '\u0148': 'n',
        +    '\u1E47': 'n',
        +    '\u0146': 'n',
        +    '\u1E4B': 'n',
        +    '\u1E49': 'n',
        +    '\u019E': 'n',
        +    '\u0272': 'n',
        +    '\u0149': 'n',
        +    '\uA791': 'n',
        +    '\uA7A5': 'n',
        +    '\u01CC': 'nj',
        +    '\u24DE': 'o',
        +    '\uFF4F': 'o',
        +    '\u00F2': 'o',
        +    '\u00F3': 'o',
        +    '\u00F4': 'o',
        +    '\u1ED3': 'o',
        +    '\u1ED1': 'o',
        +    '\u1ED7': 'o',
        +    '\u1ED5': 'o',
        +    '\u00F5': 'o',
        +    '\u1E4D': 'o',
        +    '\u022D': 'o',
        +    '\u1E4F': 'o',
        +    '\u014D': 'o',
        +    '\u1E51': 'o',
        +    '\u1E53': 'o',
        +    '\u014F': 'o',
        +    '\u022F': 'o',
        +    '\u0231': 'o',
        +    '\u00F6': 'o',
        +    '\u022B': 'o',
        +    '\u1ECF': 'o',
        +    '\u0151': 'o',
        +    '\u01D2': 'o',
        +    '\u020D': 'o',
        +    '\u020F': 'o',
        +    '\u01A1': 'o',
        +    '\u1EDD': 'o',
        +    '\u1EDB': 'o',
        +    '\u1EE1': 'o',
        +    '\u1EDF': 'o',
        +    '\u1EE3': 'o',
        +    '\u1ECD': 'o',
        +    '\u1ED9': 'o',
        +    '\u01EB': 'o',
        +    '\u01ED': 'o',
        +    '\u00F8': 'o',
        +    '\u01FF': 'o',
        +    '\u0254': 'o',
        +    '\uA74B': 'o',
        +    '\uA74D': 'o',
        +    '\u0275': 'o',
        +    '\u01A3': 'oi',
        +    '\u0223': 'ou',
        +    '\uA74F': 'oo',
        +    '\u24DF': 'p',
        +    '\uFF50': 'p',
        +    '\u1E55': 'p',
        +    '\u1E57': 'p',
        +    '\u01A5': 'p',
        +    '\u1D7D': 'p',
        +    '\uA751': 'p',
        +    '\uA753': 'p',
        +    '\uA755': 'p',
        +    '\u24E0': 'q',
        +    '\uFF51': 'q',
        +    '\u024B': 'q',
        +    '\uA757': 'q',
        +    '\uA759': 'q',
        +    '\u24E1': 'r',
        +    '\uFF52': 'r',
        +    '\u0155': 'r',
        +    '\u1E59': 'r',
        +    '\u0159': 'r',
        +    '\u0211': 'r',
        +    '\u0213': 'r',
        +    '\u1E5B': 'r',
        +    '\u1E5D': 'r',
        +    '\u0157': 'r',
        +    '\u1E5F': 'r',
        +    '\u024D': 'r',
        +    '\u027D': 'r',
        +    '\uA75B': 'r',
        +    '\uA7A7': 'r',
        +    '\uA783': 'r',
        +    '\u24E2': 's',
        +    '\uFF53': 's',
        +    '\u00DF': 's',
        +    '\u015B': 's',
        +    '\u1E65': 's',
        +    '\u015D': 's',
        +    '\u1E61': 's',
        +    '\u0161': 's',
        +    '\u1E67': 's',
        +    '\u1E63': 's',
        +    '\u1E69': 's',
        +    '\u0219': 's',
        +    '\u015F': 's',
        +    '\u023F': 's',
        +    '\uA7A9': 's',
        +    '\uA785': 's',
        +    '\u1E9B': 's',
        +    '\u24E3': 't',
        +    '\uFF54': 't',
        +    '\u1E6B': 't',
        +    '\u1E97': 't',
        +    '\u0165': 't',
        +    '\u1E6D': 't',
        +    '\u021B': 't',
        +    '\u0163': 't',
        +    '\u1E71': 't',
        +    '\u1E6F': 't',
        +    '\u0167': 't',
        +    '\u01AD': 't',
        +    '\u0288': 't',
        +    '\u2C66': 't',
        +    '\uA787': 't',
        +    '\uA729': 'tz',
        +    '\u24E4': 'u',
        +    '\uFF55': 'u',
        +    '\u00F9': 'u',
        +    '\u00FA': 'u',
        +    '\u00FB': 'u',
        +    '\u0169': 'u',
        +    '\u1E79': 'u',
        +    '\u016B': 'u',
        +    '\u1E7B': 'u',
        +    '\u016D': 'u',
        +    '\u00FC': 'u',
        +    '\u01DC': 'u',
        +    '\u01D8': 'u',
        +    '\u01D6': 'u',
        +    '\u01DA': 'u',
        +    '\u1EE7': 'u',
        +    '\u016F': 'u',
        +    '\u0171': 'u',
        +    '\u01D4': 'u',
        +    '\u0215': 'u',
        +    '\u0217': 'u',
        +    '\u01B0': 'u',
        +    '\u1EEB': 'u',
        +    '\u1EE9': 'u',
        +    '\u1EEF': 'u',
        +    '\u1EED': 'u',
        +    '\u1EF1': 'u',
        +    '\u1EE5': 'u',
        +    '\u1E73': 'u',
        +    '\u0173': 'u',
        +    '\u1E77': 'u',
        +    '\u1E75': 'u',
        +    '\u0289': 'u',
        +    '\u24E5': 'v',
        +    '\uFF56': 'v',
        +    '\u1E7D': 'v',
        +    '\u1E7F': 'v',
        +    '\u028B': 'v',
        +    '\uA75F': 'v',
        +    '\u028C': 'v',
        +    '\uA761': 'vy',
        +    '\u24E6': 'w',
        +    '\uFF57': 'w',
        +    '\u1E81': 'w',
        +    '\u1E83': 'w',
        +    '\u0175': 'w',
        +    '\u1E87': 'w',
        +    '\u1E85': 'w',
        +    '\u1E98': 'w',
        +    '\u1E89': 'w',
        +    '\u2C73': 'w',
        +    '\u24E7': 'x',
        +    '\uFF58': 'x',
        +    '\u1E8B': 'x',
        +    '\u1E8D': 'x',
        +    '\u24E8': 'y',
        +    '\uFF59': 'y',
        +    '\u1EF3': 'y',
        +    '\u00FD': 'y',
        +    '\u0177': 'y',
        +    '\u1EF9': 'y',
        +    '\u0233': 'y',
        +    '\u1E8F': 'y',
        +    '\u00FF': 'y',
        +    '\u1EF7': 'y',
        +    '\u1E99': 'y',
        +    '\u1EF5': 'y',
        +    '\u01B4': 'y',
        +    '\u024F': 'y',
        +    '\u1EFF': 'y',
        +    '\u24E9': 'z',
        +    '\uFF5A': 'z',
        +    '\u017A': 'z',
        +    '\u1E91': 'z',
        +    '\u017C': 'z',
        +    '\u017E': 'z',
        +    '\u1E93': 'z',
        +    '\u1E95': 'z',
        +    '\u01B6': 'z',
        +    '\u0225': 'z',
        +    '\u0240': 'z',
        +    '\u2C6C': 'z',
        +    '\uA763': 'z',
        +    '\u0386': '\u0391',
        +    '\u0388': '\u0395',
        +    '\u0389': '\u0397',
        +    '\u038A': '\u0399',
        +    '\u03AA': '\u0399',
        +    '\u038C': '\u039F',
        +    '\u038E': '\u03A5',
        +    '\u03AB': '\u03A5',
        +    '\u038F': '\u03A9',
        +    '\u03AC': '\u03B1',
        +    '\u03AD': '\u03B5',
        +    '\u03AE': '\u03B7',
        +    '\u03AF': '\u03B9',
        +    '\u03CA': '\u03B9',
        +    '\u0390': '\u03B9',
        +    '\u03CC': '\u03BF',
        +    '\u03CD': '\u03C5',
        +    '\u03CB': '\u03C5',
        +    '\u03B0': '\u03C5',
        +    '\u03C9': '\u03C9',
        +    '\u03C2': '\u03C3'
        +  };
        +
        +  return diacritics;
        +});
        +
        +S2.define('select2/data/base',[
        +  '../utils'
        +], function (Utils) {
        +  function BaseAdapter ($element, options) {
        +    BaseAdapter.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(BaseAdapter, Utils.Observable);
        +
        +  BaseAdapter.prototype.current = function (callback) {
        +    throw new Error('The `current` method must be defined in child classes.');
        +  };
        +
        +  BaseAdapter.prototype.query = function (params, callback) {
        +    throw new Error('The `query` method must be defined in child classes.');
        +  };
        +
        +  BaseAdapter.prototype.bind = function (container, $container) {
        +    // Can be implemented in subclasses
        +  };
        +
        +  BaseAdapter.prototype.destroy = function () {
        +    // Can be implemented in subclasses
        +  };
        +
        +  BaseAdapter.prototype.generateResultId = function (container, data) {
        +    var id = container.id + '-result-';
        +
        +    id += Utils.generateChars(4);
        +
        +    if (data.id != null) {
        +      id += '-' + data.id.toString();
        +    } else {
        +      id += '-' + Utils.generateChars(4);
        +    }
        +    return id;
        +  };
        +
        +  return BaseAdapter;
        +});
        +
        +S2.define('select2/data/select',[
        +  './base',
        +  '../utils',
        +  'jquery'
        +], function (BaseAdapter, Utils, $) {
        +  function SelectAdapter ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    SelectAdapter.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(SelectAdapter, BaseAdapter);
        +
        +  SelectAdapter.prototype.current = function (callback) {
        +    var data = [];
        +    var self = this;
        +
        +    this.$element.find(':selected').each(function () {
        +      var $option = $(this);
        +
        +      var option = self.item($option);
        +
        +      data.push(option);
        +    });
        +
        +    callback(data);
        +  };
        +
        +  SelectAdapter.prototype.select = function (data) {
        +    var self = this;
        +
        +    data.selected = true;
        +
        +    // If data.element is a DOM node, use it instead
        +    if ($(data.element).is('option')) {
        +      data.element.selected = true;
        +
        +      this.$element.trigger('change');
        +
        +      return;
        +    }
        +
        +    if (this.$element.prop('multiple')) {
        +      this.current(function (currentData) {
        +        var val = [];
        +
        +        data = [data];
        +        data.push.apply(data, currentData);
        +
        +        for (var d = 0; d < data.length; d++) {
        +          var id = data[d].id;
        +
        +          if ($.inArray(id, val) === -1) {
        +            val.push(id);
        +          }
        +        }
        +
        +        self.$element.val(val);
        +        self.$element.trigger('change');
        +      });
        +    } else {
        +      var val = data.id;
        +
        +      this.$element.val(val);
        +      this.$element.trigger('change');
        +    }
        +  };
        +
        +  SelectAdapter.prototype.unselect = function (data) {
        +    var self = this;
        +
        +    if (!this.$element.prop('multiple')) {
        +      return;
        +    }
        +
        +    data.selected = false;
        +
        +    if ($(data.element).is('option')) {
        +      data.element.selected = false;
        +
        +      this.$element.trigger('change');
        +
        +      return;
        +    }
        +
        +    this.current(function (currentData) {
        +      var val = [];
        +
        +      for (var d = 0; d < currentData.length; d++) {
        +        var id = currentData[d].id;
        +
        +        if (id !== data.id && $.inArray(id, val) === -1) {
        +          val.push(id);
        +        }
        +      }
        +
        +      self.$element.val(val);
        +
        +      self.$element.trigger('change');
        +    });
        +  };
        +
        +  SelectAdapter.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    this.container = container;
        +
        +    container.on('select', function (params) {
        +      self.select(params.data);
        +    });
        +
        +    container.on('unselect', function (params) {
        +      self.unselect(params.data);
        +    });
        +  };
        +
        +  SelectAdapter.prototype.destroy = function () {
        +    // Remove anything added to child elements
        +    this.$element.find('*').each(function () {
        +      // Remove any custom data set by Select2
        +      $.removeData(this, 'data');
        +    });
        +  };
        +
        +  SelectAdapter.prototype.query = function (params, callback) {
        +    var data = [];
        +    var self = this;
        +
        +    var $options = this.$element.children();
        +
        +    $options.each(function () {
        +      var $option = $(this);
        +
        +      if (!$option.is('option') && !$option.is('optgroup')) {
        +        return;
        +      }
        +
        +      var option = self.item($option);
        +
        +      var matches = self.matches(params, option);
        +
        +      if (matches !== null) {
        +        data.push(matches);
        +      }
        +    });
        +
        +    callback({
        +      results: data
        +    });
        +  };
        +
        +  SelectAdapter.prototype.addOptions = function ($options) {
        +    Utils.appendMany(this.$element, $options);
        +  };
        +
        +  SelectAdapter.prototype.option = function (data) {
        +    var option;
        +
        +    if (data.children) {
        +      option = document.createElement('optgroup');
        +      option.label = data.text;
        +    } else {
        +      option = document.createElement('option');
        +
        +      if (option.textContent !== undefined) {
        +        option.textContent = data.text;
        +      } else {
        +        option.innerText = data.text;
        +      }
        +    }
        +
        +    if (data.id) {
        +      option.value = data.id;
        +    }
        +
        +    if (data.disabled) {
        +      option.disabled = true;
        +    }
        +
        +    if (data.selected) {
        +      option.selected = true;
        +    }
        +
        +    if (data.title) {
        +      option.title = data.title;
        +    }
        +
        +    var $option = $(option);
        +
        +    var normalizedData = this._normalizeItem(data);
        +    normalizedData.element = option;
        +
        +    // Override the option's data with the combined data
        +    $.data(option, 'data', normalizedData);
        +
        +    return $option;
        +  };
        +
        +  SelectAdapter.prototype.item = function ($option) {
        +    var data = {};
        +
        +    data = $.data($option[0], 'data');
        +
        +    if (data != null) {
        +      return data;
        +    }
        +
        +    if ($option.is('option')) {
        +      data = {
        +        id: $option.val(),
        +        text: $option.text(),
        +        disabled: $option.prop('disabled'),
        +        selected: $option.prop('selected'),
        +        title: $option.prop('title')
        +      };
        +    } else if ($option.is('optgroup')) {
        +      data = {
        +        text: $option.prop('label'),
        +        children: [],
        +        title: $option.prop('title')
        +      };
        +
        +      var $children = $option.children('option');
        +      var children = [];
        +
        +      for (var c = 0; c < $children.length; c++) {
        +        var $child = $($children[c]);
        +
        +        var child = this.item($child);
        +
        +        children.push(child);
        +      }
        +
        +      data.children = children;
        +    }
        +
        +    data = this._normalizeItem(data);
        +    data.element = $option[0];
        +
        +    $.data($option[0], 'data', data);
        +
        +    return data;
        +  };
        +
        +  SelectAdapter.prototype._normalizeItem = function (item) {
        +    if (!$.isPlainObject(item)) {
        +      item = {
        +        id: item,
        +        text: item
        +      };
        +    }
        +
        +    item = $.extend({}, {
        +      text: ''
        +    }, item);
        +
        +    var defaults = {
        +      selected: false,
        +      disabled: false
        +    };
        +
        +    if (item.id != null) {
        +      item.id = item.id.toString();
        +    }
        +
        +    if (item.text != null) {
        +      item.text = item.text.toString();
        +    }
        +
        +    if (item._resultId == null && item.id && this.container != null) {
        +      item._resultId = this.generateResultId(this.container, item);
        +    }
        +
        +    return $.extend({}, defaults, item);
        +  };
        +
        +  SelectAdapter.prototype.matches = function (params, data) {
        +    var matcher = this.options.get('matcher');
        +
        +    return matcher(params, data);
        +  };
        +
        +  return SelectAdapter;
        +});
        +
        +S2.define('select2/data/array',[
        +  './select',
        +  '../utils',
        +  'jquery'
        +], function (SelectAdapter, Utils, $) {
        +  function ArrayAdapter ($element, options) {
        +    var data = options.get('data') || [];
        +
        +    ArrayAdapter.__super__.constructor.call(this, $element, options);
        +
        +    this.addOptions(this.convertToOptions(data));
        +  }
        +
        +  Utils.Extend(ArrayAdapter, SelectAdapter);
        +
        +  ArrayAdapter.prototype.select = function (data) {
        +    var $option = this.$element.find('option').filter(function (i, elm) {
        +      return elm.value == data.id.toString();
        +    });
        +
        +    if ($option.length === 0) {
        +      $option = this.option(data);
        +
        +      this.addOptions($option);
        +    }
        +
        +    ArrayAdapter.__super__.select.call(this, data);
        +  };
        +
        +  ArrayAdapter.prototype.convertToOptions = function (data) {
        +    var self = this;
        +
        +    var $existing = this.$element.find('option');
        +    var existingIds = $existing.map(function () {
        +      return self.item($(this)).id;
        +    }).get();
        +
        +    var $options = [];
        +
        +    // Filter out all items except for the one passed in the argument
        +    function onlyItem (item) {
        +      return function () {
        +        return $(this).val() == item.id;
        +      };
        +    }
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var item = this._normalizeItem(data[d]);
        +
        +      // Skip items which were pre-loaded, only merge the data
        +      if ($.inArray(item.id, existingIds) >= 0) {
        +        var $existingOption = $existing.filter(onlyItem(item));
        +
        +        var existingData = this.item($existingOption);
        +        var newData = $.extend(true, {}, item, existingData);
        +
        +        var $newOption = this.option(newData);
        +
        +        $existingOption.replaceWith($newOption);
        +
        +        continue;
        +      }
        +
        +      var $option = this.option(item);
        +
        +      if (item.children) {
        +        var $children = this.convertToOptions(item.children);
        +
        +        Utils.appendMany($option, $children);
        +      }
        +
        +      $options.push($option);
        +    }
        +
        +    return $options;
        +  };
        +
        +  return ArrayAdapter;
        +});
        +
        +S2.define('select2/data/ajax',[
        +  './array',
        +  '../utils',
        +  'jquery'
        +], function (ArrayAdapter, Utils, $) {
        +  function AjaxAdapter ($element, options) {
        +    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
        +
        +    if (this.ajaxOptions.processResults != null) {
        +      this.processResults = this.ajaxOptions.processResults;
        +    }
        +
        +    AjaxAdapter.__super__.constructor.call(this, $element, options);
        +  }
        +
        +  Utils.Extend(AjaxAdapter, ArrayAdapter);
        +
        +  AjaxAdapter.prototype._applyDefaults = function (options) {
        +    var defaults = {
        +      data: function (params) {
        +        return $.extend({}, params, {
        +          q: params.term
        +        });
        +      },
        +      transport: function (params, success, failure) {
        +        var $request = $.ajax(params);
        +
        +        $request.then(success);
        +        $request.fail(failure);
        +
        +        return $request;
        +      }
        +    };
        +
        +    return $.extend({}, defaults, options, true);
        +  };
        +
        +  AjaxAdapter.prototype.processResults = function (results) {
        +    return results;
        +  };
        +
        +  AjaxAdapter.prototype.query = function (params, callback) {
        +    var matches = [];
        +    var self = this;
        +
        +    if (this._request != null) {
        +      // JSONP requests cannot always be aborted
        +      if ($.isFunction(this._request.abort)) {
        +        this._request.abort();
        +      }
        +
        +      this._request = null;
        +    }
        +
        +    var options = $.extend({
        +      type: 'GET'
        +    }, this.ajaxOptions);
        +
        +    if (typeof options.url === 'function') {
        +      options.url = options.url.call(this.$element, params);
        +    }
        +
        +    if (typeof options.data === 'function') {
        +      options.data = options.data.call(this.$element, params);
        +    }
        +
        +    function request () {
        +      var $request = options.transport(options, function (data) {
        +        var results = self.processResults(data, params);
        +
        +        if (self.options.get('debug') && window.console && console.error) {
        +          // Check to make sure that the response included a `results` key.
        +          if (!results || !results.results || !$.isArray(results.results)) {
        +            console.error(
        +              'Select2: The AJAX results did not return an array in the ' +
        +              '`results` key of the response.'
        +            );
        +          }
        +        }
        +
        +        callback(results);
        +      }, function () {
        +        // Attempt to detect if a request was aborted
        +        // Only works if the transport exposes a status property
        +        if ($request.status && $request.status === '0') {
        +          return;
        +        }
        +
        +        self.trigger('results:message', {
        +          message: 'errorLoading'
        +        });
        +      });
        +
        +      self._request = $request;
        +    }
        +
        +    if (this.ajaxOptions.delay && params.term != null) {
        +      if (this._queryTimeout) {
        +        window.clearTimeout(this._queryTimeout);
        +      }
        +
        +      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
        +    } else {
        +      request();
        +    }
        +  };
        +
        +  return AjaxAdapter;
        +});
        +
        +S2.define('select2/data/tags',[
        +  'jquery'
        +], function ($) {
        +  function Tags (decorated, $element, options) {
        +    var tags = options.get('tags');
        +
        +    var createTag = options.get('createTag');
        +
        +    if (createTag !== undefined) {
        +      this.createTag = createTag;
        +    }
        +
        +    var insertTag = options.get('insertTag');
        +
        +    if (insertTag !== undefined) {
        +        this.insertTag = insertTag;
        +    }
        +
        +    decorated.call(this, $element, options);
        +
        +    if ($.isArray(tags)) {
        +      for (var t = 0; t < tags.length; t++) {
        +        var tag = tags[t];
        +        var item = this._normalizeItem(tag);
        +
        +        var $option = this.option(item);
        +
        +        this.$element.append($option);
        +      }
        +    }
        +  }
        +
        +  Tags.prototype.query = function (decorated, params, callback) {
        +    var self = this;
        +
        +    this._removeOldTags();
        +
        +    if (params.term == null || params.page != null) {
        +      decorated.call(this, params, callback);
        +      return;
        +    }
        +
        +    function wrapper (obj, child) {
        +      var data = obj.results;
        +
        +      for (var i = 0; i < data.length; i++) {
        +        var option = data[i];
        +
        +        var checkChildren = (
        +          option.children != null &&
        +          !wrapper({
        +            results: option.children
        +          }, true)
        +        );
        +
        +        var checkText = option.text === params.term;
        +
        +        if (checkText || checkChildren) {
        +          if (child) {
        +            return false;
        +          }
        +
        +          obj.data = data;
        +          callback(obj);
        +
        +          return;
        +        }
        +      }
        +
        +      if (child) {
        +        return true;
        +      }
        +
        +      var tag = self.createTag(params);
        +
        +      if (tag != null) {
        +        var $option = self.option(tag);
        +        $option.attr('data-select2-tag', true);
        +
        +        self.addOptions([$option]);
        +
        +        self.insertTag(data, tag);
        +      }
        +
        +      obj.results = data;
        +
        +      callback(obj);
        +    }
        +
        +    decorated.call(this, params, wrapper);
        +  };
        +
        +  Tags.prototype.createTag = function (decorated, params) {
        +    var term = $.trim(params.term);
        +
        +    if (term === '') {
        +      return null;
        +    }
        +
        +    return {
        +      id: term,
        +      text: term
        +    };
        +  };
        +
        +  Tags.prototype.insertTag = function (_, data, tag) {
        +    data.unshift(tag);
        +  };
        +
        +  Tags.prototype._removeOldTags = function (_) {
        +    var tag = this._lastTag;
        +
        +    var $options = this.$element.find('option[data-select2-tag]');
        +
        +    $options.each(function () {
        +      if (this.selected) {
        +        return;
        +      }
        +
        +      $(this).remove();
        +    });
        +  };
        +
        +  return Tags;
        +});
        +
        +S2.define('select2/data/tokenizer',[
        +  'jquery'
        +], function ($) {
        +  function Tokenizer (decorated, $element, options) {
        +    var tokenizer = options.get('tokenizer');
        +
        +    if (tokenizer !== undefined) {
        +      this.tokenizer = tokenizer;
        +    }
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Tokenizer.prototype.bind = function (decorated, container, $container) {
        +    decorated.call(this, container, $container);
        +
        +    this.$search =  container.dropdown.$search || container.selection.$search ||
        +      $container.find('.select2-search__field');
        +  };
        +
        +  Tokenizer.prototype.query = function (decorated, params, callback) {
        +    var self = this;
        +
        +    function createAndSelect (data) {
        +      // Normalize the data object so we can use it for checks
        +      var item = self._normalizeItem(data);
        +
        +      // Check if the data object already exists as a tag
        +      // Select it if it doesn't
        +      var $existingOptions = self.$element.find('option').filter(function () {
        +        return $(this).val() === item.id;
        +      });
        +
        +      // If an existing option wasn't found for it, create the option
        +      if (!$existingOptions.length) {
        +        var $option = self.option(item);
        +        $option.attr('data-select2-tag', true);
        +
        +        self._removeOldTags();
        +        self.addOptions([$option]);
        +      }
        +
        +      // Select the item, now that we know there is an option for it
        +      select(item);
        +    }
        +
        +    function select (data) {
        +      self.trigger('select', {
        +        data: data
        +      });
        +    }
        +
        +    params.term = params.term || '';
        +
        +    var tokenData = this.tokenizer(params, this.options, createAndSelect);
        +
        +    if (tokenData.term !== params.term) {
        +      // Replace the search term if we have the search box
        +      if (this.$search.length) {
        +        this.$search.val(tokenData.term);
        +        this.$search.focus();
        +      }
        +
        +      params.term = tokenData.term;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
        +    var separators = options.get('tokenSeparators') || [];
        +    var term = params.term;
        +    var i = 0;
        +
        +    var createTag = this.createTag || function (params) {
        +      return {
        +        id: params.term,
        +        text: params.term
        +      };
        +    };
        +
        +    while (i < term.length) {
        +      var termChar = term[i];
        +
        +      if ($.inArray(termChar, separators) === -1) {
        +        i++;
        +
        +        continue;
        +      }
        +
        +      var part = term.substr(0, i);
        +      var partParams = $.extend({}, params, {
        +        term: part
        +      });
        +
        +      var data = createTag(partParams);
        +
        +      if (data == null) {
        +        i++;
        +        continue;
        +      }
        +
        +      callback(data);
        +
        +      // Reset the term to not include the tokenized portion
        +      term = term.substr(i + 1) || '';
        +      i = 0;
        +    }
        +
        +    return {
        +      term: term
        +    };
        +  };
        +
        +  return Tokenizer;
        +});
        +
        +S2.define('select2/data/minimumInputLength',[
        +
        +], function () {
        +  function MinimumInputLength (decorated, $e, options) {
        +    this.minimumInputLength = options.get('minimumInputLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MinimumInputLength.prototype.query = function (decorated, params, callback) {
        +    params.term = params.term || '';
        +
        +    if (params.term.length < this.minimumInputLength) {
        +      this.trigger('results:message', {
        +        message: 'inputTooShort',
        +        args: {
        +          minimum: this.minimumInputLength,
        +          input: params.term,
        +          params: params
        +        }
        +      });
        +
        +      return;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  return MinimumInputLength;
        +});
        +
        +S2.define('select2/data/maximumInputLength',[
        +
        +], function () {
        +  function MaximumInputLength (decorated, $e, options) {
        +    this.maximumInputLength = options.get('maximumInputLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MaximumInputLength.prototype.query = function (decorated, params, callback) {
        +    params.term = params.term || '';
        +
        +    if (this.maximumInputLength > 0 &&
        +        params.term.length > this.maximumInputLength) {
        +      this.trigger('results:message', {
        +        message: 'inputTooLong',
        +        args: {
        +          maximum: this.maximumInputLength,
        +          input: params.term,
        +          params: params
        +        }
        +      });
        +
        +      return;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  return MaximumInputLength;
        +});
        +
        +S2.define('select2/data/maximumSelectionLength',[
        +
        +], function (){
        +  function MaximumSelectionLength (decorated, $e, options) {
        +    this.maximumSelectionLength = options.get('maximumSelectionLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MaximumSelectionLength.prototype.query =
        +    function (decorated, params, callback) {
        +      var self = this;
        +
        +      this.current(function (currentData) {
        +        var count = currentData != null ? currentData.length : 0;
        +        if (self.maximumSelectionLength > 0 &&
        +          count >= self.maximumSelectionLength) {
        +          self.trigger('results:message', {
        +            message: 'maximumSelected',
        +            args: {
        +              maximum: self.maximumSelectionLength
        +            }
        +          });
        +          return;
        +        }
        +        decorated.call(self, params, callback);
        +      });
        +  };
        +
        +  return MaximumSelectionLength;
        +});
        +
        +S2.define('select2/dropdown',[
        +  'jquery',
        +  './utils'
        +], function ($, Utils) {
        +  function Dropdown ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    Dropdown.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(Dropdown, Utils.Observable);
        +
        +  Dropdown.prototype.render = function () {
        +    var $dropdown = $(
        +      '<span class="select2-dropdown">' +
        +        '<span class="select2-results"></span>' +
        +      '</span>'
        +    );
        +
        +    $dropdown.attr('dir', this.options.get('dir'));
        +
        +    this.$dropdown = $dropdown;
        +
        +    return $dropdown;
        +  };
        +
        +  Dropdown.prototype.bind = function () {
        +    // Should be implemented in subclasses
        +  };
        +
        +  Dropdown.prototype.position = function ($dropdown, $container) {
        +    // Should be implmented in subclasses
        +  };
        +
        +  Dropdown.prototype.destroy = function () {
        +    // Remove the dropdown from the DOM
        +    this.$dropdown.remove();
        +  };
        +
        +  return Dropdown;
        +});
        +
        +S2.define('select2/dropdown/search',[
        +  'jquery',
        +  '../utils'
        +], function ($, Utils) {
        +  function Search () { }
        +
        +  Search.prototype.render = function (decorated) {
        +    var $rendered = decorated.call(this);
        +
        +    var $search = $(
        +      '<span class="select2-search select2-search--dropdown">' +
        +        '<input class="select2-search__field" type="search" tabindex="-1"' +
        +        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        +        ' spellcheck="false" role="textbox" />' +
        +      '</span>'
        +    );
        +
        +    this.$searchContainer = $search;
        +    this.$search = $search.find('input');
        +
        +    $rendered.prepend($search);
        +
        +    return $rendered;
        +  };
        +
        +  Search.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    this.$search.on('keydown', function (evt) {
        +      self.trigger('keypress', evt);
        +
        +      self._keyUpPrevented = evt.isDefaultPrevented();
        +    });
        +
        +    // Workaround for browsers which do not support the `input` event
        +    // This will prevent double-triggering of events for browsers which support
        +    // both the `keyup` and `input` events.
        +    this.$search.on('input', function (evt) {
        +      // Unbind the duplicated `keyup` event
        +      $(this).off('keyup');
        +    });
        +
        +    this.$search.on('keyup input', function (evt) {
        +      self.handleSearch(evt);
        +    });
        +
        +    container.on('open', function () {
        +      self.$search.attr('tabindex', 0);
        +
        +      self.$search.focus();
        +
        +      window.setTimeout(function () {
        +        self.$search.focus();
        +      }, 0);
        +    });
        +
        +    container.on('close', function () {
        +      self.$search.attr('tabindex', -1);
        +
        +      self.$search.val('');
        +    });
        +
        +    container.on('focus', function () {
        +      if (container.isOpen()) {
        +        self.$search.focus();
        +      }
        +    });
        +
        +    container.on('results:all', function (params) {
        +      if (params.query.term == null || params.query.term === '') {
        +        var showSearch = self.showSearch(params);
        +
        +        if (showSearch) {
        +          self.$searchContainer.removeClass('select2-search--hide');
        +        } else {
        +          self.$searchContainer.addClass('select2-search--hide');
        +        }
        +      }
        +    });
        +  };
        +
        +  Search.prototype.handleSearch = function (evt) {
        +    if (!this._keyUpPrevented) {
        +      var input = this.$search.val();
        +
        +      this.trigger('query', {
        +        term: input
        +      });
        +    }
        +
        +    this._keyUpPrevented = false;
        +  };
        +
        +  Search.prototype.showSearch = function (_, params) {
        +    return true;
        +  };
        +
        +  return Search;
        +});
        +
        +S2.define('select2/dropdown/hidePlaceholder',[
        +
        +], function () {
        +  function HidePlaceholder (decorated, $element, options, dataAdapter) {
        +    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +  }
        +
        +  HidePlaceholder.prototype.append = function (decorated, data) {
        +    data.results = this.removePlaceholder(data.results);
        +
        +    decorated.call(this, data);
        +  };
        +
        +  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
        +    if (typeof placeholder === 'string') {
        +      placeholder = {
        +        id: '',
        +        text: placeholder
        +      };
        +    }
        +
        +    return placeholder;
        +  };
        +
        +  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
        +    var modifiedData = data.slice(0);
        +
        +    for (var d = data.length - 1; d >= 0; d--) {
        +      var item = data[d];
        +
        +      if (this.placeholder.id === item.id) {
        +        modifiedData.splice(d, 1);
        +      }
        +    }
        +
        +    return modifiedData;
        +  };
        +
        +  return HidePlaceholder;
        +});
        +
        +S2.define('select2/dropdown/infiniteScroll',[
        +  'jquery'
        +], function ($) {
        +  function InfiniteScroll (decorated, $element, options, dataAdapter) {
        +    this.lastParams = {};
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +
        +    this.$loadingMore = this.createLoadingMore();
        +    this.loading = false;
        +  }
        +
        +  InfiniteScroll.prototype.append = function (decorated, data) {
        +    this.$loadingMore.remove();
        +    this.loading = false;
        +
        +    decorated.call(this, data);
        +
        +    if (this.showLoadingMore(data)) {
        +      this.$results.append(this.$loadingMore);
        +    }
        +  };
        +
        +  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('query', function (params) {
        +      self.lastParams = params;
        +      self.loading = true;
        +    });
        +
        +    container.on('query:append', function (params) {
        +      self.lastParams = params;
        +      self.loading = true;
        +    });
        +
        +    this.$results.on('scroll', function () {
        +      var isLoadMoreVisible = $.contains(
        +        document.documentElement,
        +        self.$loadingMore[0]
        +      );
        +
        +      if (self.loading || !isLoadMoreVisible) {
        +        return;
        +      }
        +
        +      var currentOffset = self.$results.offset().top +
        +        self.$results.outerHeight(false);
        +      var loadingMoreOffset = self.$loadingMore.offset().top +
        +        self.$loadingMore.outerHeight(false);
        +
        +      if (currentOffset + 50 >= loadingMoreOffset) {
        +        self.loadMore();
        +      }
        +    });
        +  };
        +
        +  InfiniteScroll.prototype.loadMore = function () {
        +    this.loading = true;
        +
        +    var params = $.extend({}, {page: 1}, this.lastParams);
        +
        +    params.page++;
        +
        +    this.trigger('query:append', params);
        +  };
        +
        +  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
        +    return data.pagination && data.pagination.more;
        +  };
        +
        +  InfiniteScroll.prototype.createLoadingMore = function () {
        +    var $option = $(
        +      '<li ' +
        +      'class="select2-results__option select2-results__option--load-more"' +
        +      'role="treeitem" aria-disabled="true"></li>'
        +    );
        +
        +    var message = this.options.get('translations').get('loadingMore');
        +
        +    $option.html(message(this.lastParams));
        +
        +    return $option;
        +  };
        +
        +  return InfiniteScroll;
        +});
        +
        +S2.define('select2/dropdown/attachBody',[
        +  'jquery',
        +  '../utils'
        +], function ($, Utils) {
        +  function AttachBody (decorated, $element, options) {
        +    this.$dropdownParent = options.get('dropdownParent') || $(document.body);
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  AttachBody.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    var setupResultsEvents = false;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('open', function () {
        +      self._showDropdown();
        +      self._attachPositioningHandler(container);
        +
        +      if (!setupResultsEvents) {
        +        setupResultsEvents = true;
        +
        +        container.on('results:all', function () {
        +          self._positionDropdown();
        +          self._resizeDropdown();
        +        });
        +
        +        container.on('results:append', function () {
        +          self._positionDropdown();
        +          self._resizeDropdown();
        +        });
        +      }
        +    });
        +
        +    container.on('close', function () {
        +      self._hideDropdown();
        +      self._detachPositioningHandler(container);
        +    });
        +
        +    this.$dropdownContainer.on('mousedown', function (evt) {
        +      evt.stopPropagation();
        +    });
        +  };
        +
        +  AttachBody.prototype.destroy = function (decorated) {
        +    decorated.call(this);
        +
        +    this.$dropdownContainer.remove();
        +  };
        +
        +  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
        +    // Clone all of the container classes
        +    $dropdown.attr('class', $container.attr('class'));
        +
        +    $dropdown.removeClass('select2');
        +    $dropdown.addClass('select2-container--open');
        +
        +    $dropdown.css({
        +      position: 'absolute',
        +      top: -999999
        +    });
        +
        +    this.$container = $container;
        +  };
        +
        +  AttachBody.prototype.render = function (decorated) {
        +    var $container = $('<span></span>');
        +
        +    var $dropdown = decorated.call(this);
        +    $container.append($dropdown);
        +
        +    this.$dropdownContainer = $container;
        +
        +    return $container;
        +  };
        +
        +  AttachBody.prototype._hideDropdown = function (decorated) {
        +    this.$dropdownContainer.detach();
        +  };
        +
        +  AttachBody.prototype._attachPositioningHandler =
        +      function (decorated, container) {
        +    var self = this;
        +
        +    var scrollEvent = 'scroll.select2.' + container.id;
        +    var resizeEvent = 'resize.select2.' + container.id;
        +    var orientationEvent = 'orientationchange.select2.' + container.id;
        +
        +    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        +    $watchers.each(function () {
        +      $(this).data('select2-scroll-position', {
        +        x: $(this).scrollLeft(),
        +        y: $(this).scrollTop()
        +      });
        +    });
        +
        +    $watchers.on(scrollEvent, function (ev) {
        +      var position = $(this).data('select2-scroll-position');
        +      $(this).scrollTop(position.y);
        +    });
        +
        +    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
        +      function (e) {
        +      self._positionDropdown();
        +      self._resizeDropdown();
        +    });
        +  };
        +
        +  AttachBody.prototype._detachPositioningHandler =
        +      function (decorated, container) {
        +    var scrollEvent = 'scroll.select2.' + container.id;
        +    var resizeEvent = 'resize.select2.' + container.id;
        +    var orientationEvent = 'orientationchange.select2.' + container.id;
        +
        +    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        +    $watchers.off(scrollEvent);
        +
        +    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
        +  };
        +
        +  AttachBody.prototype._positionDropdown = function () {
        +    var $window = $(window);
        +
        +    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
        +    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
        +
        +    var newDirection = null;
        +
        +    var offset = this.$container.offset();
        +
        +    offset.bottom = offset.top + this.$container.outerHeight(false);
        +
        +    var container = {
        +      height: this.$container.outerHeight(false)
        +    };
        +
        +    container.top = offset.top;
        +    container.bottom = offset.top + container.height;
        +
        +    var dropdown = {
        +      height: this.$dropdown.outerHeight(false)
        +    };
        +
        +    var viewport = {
        +      top: $window.scrollTop(),
        +      bottom: $window.scrollTop() + $window.height()
        +    };
        +
        +    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
        +    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
        +
        +    var css = {
        +      left: offset.left,
        +      top: container.bottom
        +    };
        +
        +    // Determine what the parent element is to use for calciulating the offset
        +    var $offsetParent = this.$dropdownParent;
        +
        +    // For statically positoned elements, we need to get the element
        +    // that is determining the offset
        +    if ($offsetParent.css('position') === 'static') {
        +      $offsetParent = $offsetParent.offsetParent();
        +    }
        +
        +    var parentOffset = $offsetParent.offset();
        +
        +    css.top -= parentOffset.top;
        +    css.left -= parentOffset.left;
        +
        +    if (!isCurrentlyAbove && !isCurrentlyBelow) {
        +      newDirection = 'below';
        +    }
        +
        +    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
        +      newDirection = 'above';
        +    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
        +      newDirection = 'below';
        +    }
        +
        +    if (newDirection == 'above' ||
        +      (isCurrentlyAbove && newDirection !== 'below')) {
        +      css.top = container.top - parentOffset.top - dropdown.height;
        +    }
        +
        +    if (newDirection != null) {
        +      this.$dropdown
        +        .removeClass('select2-dropdown--below select2-dropdown--above')
        +        .addClass('select2-dropdown--' + newDirection);
        +      this.$container
        +        .removeClass('select2-container--below select2-container--above')
        +        .addClass('select2-container--' + newDirection);
        +    }
        +
        +    this.$dropdownContainer.css(css);
        +  };
        +
        +  AttachBody.prototype._resizeDropdown = function () {
        +    var css = {
        +      width: this.$container.outerWidth(false) + 'px'
        +    };
        +
        +    if (this.options.get('dropdownAutoWidth')) {
        +      css.minWidth = css.width;
        +      css.position = 'relative';
        +      css.width = 'auto';
        +    }
        +
        +    this.$dropdown.css(css);
        +  };
        +
        +  AttachBody.prototype._showDropdown = function (decorated) {
        +    this.$dropdownContainer.appendTo(this.$dropdownParent);
        +
        +    this._positionDropdown();
        +    this._resizeDropdown();
        +  };
        +
        +  return AttachBody;
        +});
        +
        +S2.define('select2/dropdown/minimumResultsForSearch',[
        +
        +], function () {
        +  function countResults (data) {
        +    var count = 0;
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var item = data[d];
        +
        +      if (item.children) {
        +        count += countResults(item.children);
        +      } else {
        +        count++;
        +      }
        +    }
        +
        +    return count;
        +  }
        +
        +  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
        +    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
        +
        +    if (this.minimumResultsForSearch < 0) {
        +      this.minimumResultsForSearch = Infinity;
        +    }
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +  }
        +
        +  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
        +    if (countResults(params.data.results) < this.minimumResultsForSearch) {
        +      return false;
        +    }
        +
        +    return decorated.call(this, params);
        +  };
        +
        +  return MinimumResultsForSearch;
        +});
        +
        +S2.define('select2/dropdown/selectOnClose',[
        +
        +], function () {
        +  function SelectOnClose () { }
        +
        +  SelectOnClose.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('close', function (params) {
        +      self._handleSelectOnClose(params);
        +    });
        +  };
        +
        +  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
        +    if (params && params.originalSelect2Event != null) {
        +      var event = params.originalSelect2Event;
        +
        +      // Don't select an item if the close event was triggered from a select or
        +      // unselect event
        +      if (event._type === 'select' || event._type === 'unselect') {
        +        return;
        +      }
        +    }
        +
        +    var $highlightedResults = this.getHighlightedResults();
        +
        +    // Only select highlighted results
        +    if ($highlightedResults.length < 1) {
        +      return;
        +    }
        +
        +    var data = $highlightedResults.data('data');
        +
        +    // Don't re-select already selected resulte
        +    if (
        +      (data.element != null && data.element.selected) ||
        +      (data.element == null && data.selected)
        +    ) {
        +      return;
        +    }
        +
        +    this.trigger('select', {
        +        data: data
        +    });
        +  };
        +
        +  return SelectOnClose;
        +});
        +
        +S2.define('select2/dropdown/closeOnSelect',[
        +
        +], function () {
        +  function CloseOnSelect () { }
        +
        +  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('select', function (evt) {
        +      self._selectTriggered(evt);
        +    });
        +
        +    container.on('unselect', function (evt) {
        +      self._selectTriggered(evt);
        +    });
        +  };
        +
        +  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
        +    var originalEvent = evt.originalEvent;
        +
        +    // Don't close if the control key is being held
        +    if (originalEvent && originalEvent.ctrlKey) {
        +      return;
        +    }
        +
        +    this.trigger('close', {
        +      originalEvent: originalEvent,
        +      originalSelect2Event: evt
        +    });
        +  };
        +
        +  return CloseOnSelect;
        +});
        +
        +S2.define('select2/i18n/en',[],function () {
        +  // English
        +  return {
        +    errorLoading: function () {
        +      return 'The results could not be loaded.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Please delete ' + overChars + ' character';
        +
        +      if (overChars != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Please enter ' + remainingChars + ' or more characters';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Loading more results…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'You can only select ' + args.maximum + ' item';
        +
        +      if (args.maximum != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'No results found';
        +    },
        +    searching: function () {
        +      return 'Searching…';
        +    }
        +  };
        +});
        +
        +S2.define('select2/defaults',[
        +  'jquery',
        +  'require',
        +
        +  './results',
        +
        +  './selection/single',
        +  './selection/multiple',
        +  './selection/placeholder',
        +  './selection/allowClear',
        +  './selection/search',
        +  './selection/eventRelay',
        +
        +  './utils',
        +  './translation',
        +  './diacritics',
        +
        +  './data/select',
        +  './data/array',
        +  './data/ajax',
        +  './data/tags',
        +  './data/tokenizer',
        +  './data/minimumInputLength',
        +  './data/maximumInputLength',
        +  './data/maximumSelectionLength',
        +
        +  './dropdown',
        +  './dropdown/search',
        +  './dropdown/hidePlaceholder',
        +  './dropdown/infiniteScroll',
        +  './dropdown/attachBody',
        +  './dropdown/minimumResultsForSearch',
        +  './dropdown/selectOnClose',
        +  './dropdown/closeOnSelect',
        +
        +  './i18n/en'
        +], function ($, require,
        +
        +             ResultsList,
        +
        +             SingleSelection, MultipleSelection, Placeholder, AllowClear,
        +             SelectionSearch, EventRelay,
        +
        +             Utils, Translation, DIACRITICS,
        +
        +             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
        +             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
        +
        +             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
        +             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
        +
        +             EnglishTranslation) {
        +  function Defaults () {
        +    this.reset();
        +  }
        +
        +  Defaults.prototype.apply = function (options) {
        +    options = $.extend(true, {}, this.defaults, options);
        +
        +    if (options.dataAdapter == null) {
        +      if (options.ajax != null) {
        +        options.dataAdapter = AjaxData;
        +      } else if (options.data != null) {
        +        options.dataAdapter = ArrayData;
        +      } else {
        +        options.dataAdapter = SelectData;
        +      }
        +
        +      if (options.minimumInputLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MinimumInputLength
        +        );
        +      }
        +
        +      if (options.maximumInputLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MaximumInputLength
        +        );
        +      }
        +
        +      if (options.maximumSelectionLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MaximumSelectionLength
        +        );
        +      }
        +
        +      if (options.tags) {
        +        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
        +      }
        +
        +      if (options.tokenSeparators != null || options.tokenizer != null) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          Tokenizer
        +        );
        +      }
        +
        +      if (options.query != null) {
        +        var Query = require(options.amdBase + 'compat/query');
        +
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          Query
        +        );
        +      }
        +
        +      if (options.initSelection != null) {
        +        var InitSelection = require(options.amdBase + 'compat/initSelection');
        +
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          InitSelection
        +        );
        +      }
        +    }
        +
        +    if (options.resultsAdapter == null) {
        +      options.resultsAdapter = ResultsList;
        +
        +      if (options.ajax != null) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          InfiniteScroll
        +        );
        +      }
        +
        +      if (options.placeholder != null) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          HidePlaceholder
        +        );
        +      }
        +
        +      if (options.selectOnClose) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          SelectOnClose
        +        );
        +      }
        +    }
        +
        +    if (options.dropdownAdapter == null) {
        +      if (options.multiple) {
        +        options.dropdownAdapter = Dropdown;
        +      } else {
        +        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
        +
        +        options.dropdownAdapter = SearchableDropdown;
        +      }
        +
        +      if (options.minimumResultsForSearch !== 0) {
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          MinimumResultsForSearch
        +        );
        +      }
        +
        +      if (options.closeOnSelect) {
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          CloseOnSelect
        +        );
        +      }
        +
        +      if (
        +        options.dropdownCssClass != null ||
        +        options.dropdownCss != null ||
        +        options.adaptDropdownCssClass != null
        +      ) {
        +        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
        +
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          DropdownCSS
        +        );
        +      }
        +
        +      options.dropdownAdapter = Utils.Decorate(
        +        options.dropdownAdapter,
        +        AttachBody
        +      );
        +    }
        +
        +    if (options.selectionAdapter == null) {
        +      if (options.multiple) {
        +        options.selectionAdapter = MultipleSelection;
        +      } else {
        +        options.selectionAdapter = SingleSelection;
        +      }
        +
        +      // Add the placeholder mixin if a placeholder was specified
        +      if (options.placeholder != null) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          Placeholder
        +        );
        +      }
        +
        +      if (options.allowClear) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          AllowClear
        +        );
        +      }
        +
        +      if (options.multiple) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          SelectionSearch
        +        );
        +      }
        +
        +      if (
        +        options.containerCssClass != null ||
        +        options.containerCss != null ||
        +        options.adaptContainerCssClass != null
        +      ) {
        +        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
        +
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          ContainerCSS
        +        );
        +      }
        +
        +      options.selectionAdapter = Utils.Decorate(
        +        options.selectionAdapter,
        +        EventRelay
        +      );
        +    }
        +
        +    if (typeof options.language === 'string') {
        +      // Check if the language is specified with a region
        +      if (options.language.indexOf('-') > 0) {
        +        // Extract the region information if it is included
        +        var languageParts = options.language.split('-');
        +        var baseLanguage = languageParts[0];
        +
        +        options.language = [options.language, baseLanguage];
        +      } else {
        +        options.language = [options.language];
        +      }
        +    }
        +
        +    if ($.isArray(options.language)) {
        +      var languages = new Translation();
        +      options.language.push('en');
        +
        +      var languageNames = options.language;
        +
        +      for (var l = 0; l < languageNames.length; l++) {
        +        var name = languageNames[l];
        +        var language = {};
        +
        +        try {
        +          // Try to load it with the original name
        +          language = Translation.loadPath(name);
        +        } catch (e) {
        +          try {
        +            // If we couldn't load it, check if it wasn't the full path
        +            name = this.defaults.amdLanguageBase + name;
        +            language = Translation.loadPath(name);
        +          } catch (ex) {
        +            // The translation could not be loaded at all. Sometimes this is
        +            // because of a configuration problem, other times this can be
        +            // because of how Select2 helps load all possible translation files.
        +            if (options.debug && window.console && console.warn) {
        +              console.warn(
        +                'Select2: The language file for "' + name + '" could not be ' +
        +                'automatically loaded. A fallback will be used instead.'
        +              );
        +            }
        +
        +            continue;
        +          }
        +        }
        +
        +        languages.extend(language);
        +      }
        +
        +      options.translations = languages;
        +    } else {
        +      var baseTranslation = Translation.loadPath(
        +        this.defaults.amdLanguageBase + 'en'
        +      );
        +      var customTranslation = new Translation(options.language);
        +
        +      customTranslation.extend(baseTranslation);
        +
        +      options.translations = customTranslation;
        +    }
        +
        +    return options;
        +  };
        +
        +  Defaults.prototype.reset = function () {
        +    function stripDiacritics (text) {
        +      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
        +      function match(a) {
        +        return DIACRITICS[a] || a;
        +      }
        +
        +      return text.replace(/[^\u0000-\u007E]/g, match);
        +    }
        +
        +    function matcher (params, data) {
        +      // Always return the object if there is nothing to compare
        +      if ($.trim(params.term) === '') {
        +        return data;
        +      }
        +
        +      // Do a recursive check for options with children
        +      if (data.children && data.children.length > 0) {
        +        // Clone the data object if there are children
        +        // This is required as we modify the object to remove any non-matches
        +        var match = $.extend(true, {}, data);
        +
        +        // Check each child of the option
        +        for (var c = data.children.length - 1; c >= 0; c--) {
        +          var child = data.children[c];
        +
        +          var matches = matcher(params, child);
        +
        +          // If there wasn't a match, remove the object in the array
        +          if (matches == null) {
        +            match.children.splice(c, 1);
        +          }
        +        }
        +
        +        // If any children matched, return the new object
        +        if (match.children.length > 0) {
        +          return match;
        +        }
        +
        +        // If there were no matching children, check just the plain object
        +        return matcher(params, match);
        +      }
        +
        +      var original = stripDiacritics(data.text).toUpperCase();
        +      var term = stripDiacritics(params.term).toUpperCase();
        +
        +      // Check if the text contains the term
        +      if (original.indexOf(term) > -1) {
        +        return data;
        +      }
        +
        +      // If it doesn't contain the term, don't return anything
        +      return null;
        +    }
        +
        +    this.defaults = {
        +      amdBase: './',
        +      amdLanguageBase: './i18n/',
        +      closeOnSelect: true,
        +      debug: false,
        +      dropdownAutoWidth: false,
        +      escapeMarkup: Utils.escapeMarkup,
        +      language: EnglishTranslation,
        +      matcher: matcher,
        +      minimumInputLength: 0,
        +      maximumInputLength: 0,
        +      maximumSelectionLength: 0,
        +      minimumResultsForSearch: 0,
        +      selectOnClose: false,
        +      sorter: function (data) {
        +        return data;
        +      },
        +      templateResult: function (result) {
        +        return result.text;
        +      },
        +      templateSelection: function (selection) {
        +        return selection.text;
        +      },
        +      theme: 'default',
        +      width: 'resolve'
        +    };
        +  };
        +
        +  Defaults.prototype.set = function (key, value) {
        +    var camelKey = $.camelCase(key);
        +
        +    var data = {};
        +    data[camelKey] = value;
        +
        +    var convertedData = Utils._convertData(data);
        +
        +    $.extend(this.defaults, convertedData);
        +  };
        +
        +  var defaults = new Defaults();
        +
        +  return defaults;
        +});
        +
        +S2.define('select2/options',[
        +  'require',
        +  'jquery',
        +  './defaults',
        +  './utils'
        +], function (require, $, Defaults, Utils) {
        +  function Options (options, $element) {
        +    this.options = options;
        +
        +    if ($element != null) {
        +      this.fromElement($element);
        +    }
        +
        +    this.options = Defaults.apply(this.options);
        +
        +    if ($element && $element.is('input')) {
        +      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
        +
        +      this.options.dataAdapter = Utils.Decorate(
        +        this.options.dataAdapter,
        +        InputCompat
        +      );
        +    }
        +  }
        +
        +  Options.prototype.fromElement = function ($e) {
        +    var excludedData = ['select2'];
        +
        +    if (this.options.multiple == null) {
        +      this.options.multiple = $e.prop('multiple');
        +    }
        +
        +    if (this.options.disabled == null) {
        +      this.options.disabled = $e.prop('disabled');
        +    }
        +
        +    if (this.options.language == null) {
        +      if ($e.prop('lang')) {
        +        this.options.language = $e.prop('lang').toLowerCase();
        +      } else if ($e.closest('[lang]').prop('lang')) {
        +        this.options.language = $e.closest('[lang]').prop('lang');
        +      }
        +    }
        +
        +    if (this.options.dir == null) {
        +      if ($e.prop('dir')) {
        +        this.options.dir = $e.prop('dir');
        +      } else if ($e.closest('[dir]').prop('dir')) {
        +        this.options.dir = $e.closest('[dir]').prop('dir');
        +      } else {
        +        this.options.dir = 'ltr';
        +      }
        +    }
        +
        +    $e.prop('disabled', this.options.disabled);
        +    $e.prop('multiple', this.options.multiple);
        +
        +    if ($e.data('select2Tags')) {
        +      if (this.options.debug && window.console && console.warn) {
        +        console.warn(
        +          'Select2: The `data-select2-tags` attribute has been changed to ' +
        +          'use the `data-data` and `data-tags="true"` attributes and will be ' +
        +          'removed in future versions of Select2.'
        +        );
        +      }
        +
        +      $e.data('data', $e.data('select2Tags'));
        +      $e.data('tags', true);
        +    }
        +
        +    if ($e.data('ajaxUrl')) {
        +      if (this.options.debug && window.console && console.warn) {
        +        console.warn(
        +          'Select2: The `data-ajax-url` attribute has been changed to ' +
        +          '`data-ajax--url` and support for the old attribute will be removed' +
        +          ' in future versions of Select2.'
        +        );
        +      }
        +
        +      $e.attr('ajax--url', $e.data('ajaxUrl'));
        +      $e.data('ajax--url', $e.data('ajaxUrl'));
        +    }
        +
        +    var dataset = {};
        +
        +    // Prefer the element's `dataset` attribute if it exists
        +    // jQuery 1.x does not correctly handle data attributes with multiple dashes
        +    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
        +      dataset = $.extend(true, {}, $e[0].dataset, $e.data());
        +    } else {
        +      dataset = $e.data();
        +    }
        +
        +    var data = $.extend(true, {}, dataset);
        +
        +    data = Utils._convertData(data);
        +
        +    for (var key in data) {
        +      if ($.inArray(key, excludedData) > -1) {
        +        continue;
        +      }
        +
        +      if ($.isPlainObject(this.options[key])) {
        +        $.extend(this.options[key], data[key]);
        +      } else {
        +        this.options[key] = data[key];
        +      }
        +    }
        +
        +    return this;
        +  };
        +
        +  Options.prototype.get = function (key) {
        +    return this.options[key];
        +  };
        +
        +  Options.prototype.set = function (key, val) {
        +    this.options[key] = val;
        +  };
        +
        +  return Options;
        +});
        +
        +S2.define('select2/core',[
        +  'jquery',
        +  './options',
        +  './utils',
        +  './keys'
        +], function ($, Options, Utils, KEYS) {
        +  var Select2 = function ($element, options) {
        +    if ($element.data('select2') != null) {
        +      $element.data('select2').destroy();
        +    }
        +
        +    this.$element = $element;
        +
        +    this.id = this._generateId($element);
        +
        +    options = options || {};
        +
        +    this.options = new Options(options, $element);
        +
        +    Select2.__super__.constructor.call(this);
        +
        +    // Set up the tabindex
        +
        +    var tabindex = $element.attr('tabindex') || 0;
        +    $element.data('old-tabindex', tabindex);
        +    $element.attr('tabindex', '-1');
        +
        +    // Set up containers and adapters
        +
        +    var DataAdapter = this.options.get('dataAdapter');
        +    this.dataAdapter = new DataAdapter($element, this.options);
        +
        +    var $container = this.render();
        +
        +    this._placeContainer($container);
        +
        +    var SelectionAdapter = this.options.get('selectionAdapter');
        +    this.selection = new SelectionAdapter($element, this.options);
        +    this.$selection = this.selection.render();
        +
        +    this.selection.position(this.$selection, $container);
        +
        +    var DropdownAdapter = this.options.get('dropdownAdapter');
        +    this.dropdown = new DropdownAdapter($element, this.options);
        +    this.$dropdown = this.dropdown.render();
        +
        +    this.dropdown.position(this.$dropdown, $container);
        +
        +    var ResultsAdapter = this.options.get('resultsAdapter');
        +    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
        +    this.$results = this.results.render();
        +
        +    this.results.position(this.$results, this.$dropdown);
        +
        +    // Bind events
        +
        +    var self = this;
        +
        +    // Bind the container to all of the adapters
        +    this._bindAdapters();
        +
        +    // Register any DOM event handlers
        +    this._registerDomEvents();
        +
        +    // Register any internal event handlers
        +    this._registerDataEvents();
        +    this._registerSelectionEvents();
        +    this._registerDropdownEvents();
        +    this._registerResultsEvents();
        +    this._registerEvents();
        +
        +    // Set the initial state
        +    this.dataAdapter.current(function (initialData) {
        +      self.trigger('selection:update', {
        +        data: initialData
        +      });
        +    });
        +
        +    // Hide the original select
        +    $element.addClass('select2-hidden-accessible');
        +    $element.attr('aria-hidden', 'true');
        +
        +    // Synchronize any monitored attributes
        +    this._syncAttributes();
        +
        +    $element.data('select2', this);
        +  };
        +
        +  Utils.Extend(Select2, Utils.Observable);
        +
        +  Select2.prototype._generateId = function ($element) {
        +    var id = '';
        +
        +    if ($element.attr('id') != null) {
        +      id = $element.attr('id');
        +    } else if ($element.attr('name') != null) {
        +      id = $element.attr('name') + '-' + Utils.generateChars(2);
        +    } else {
        +      id = Utils.generateChars(4);
        +    }
        +
        +    id = id.replace(/(:|\.|\[|\]|,)/g, '');
        +    id = 'select2-' + id;
        +
        +    return id;
        +  };
        +
        +  Select2.prototype._placeContainer = function ($container) {
        +    $container.insertAfter(this.$element);
        +
        +    var width = this._resolveWidth(this.$element, this.options.get('width'));
        +
        +    if (width != null) {
        +      $container.css('width', width);
        +    }
        +  };
        +
        +  Select2.prototype._resolveWidth = function ($element, method) {
        +    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
        +
        +    if (method == 'resolve') {
        +      var styleWidth = this._resolveWidth($element, 'style');
        +
        +      if (styleWidth != null) {
        +        return styleWidth;
        +      }
        +
        +      return this._resolveWidth($element, 'element');
        +    }
        +
        +    if (method == 'element') {
        +      var elementWidth = $element.outerWidth(false);
        +
        +      if (elementWidth <= 0) {
        +        return 'auto';
        +      }
        +
        +      return elementWidth + 'px';
        +    }
        +
        +    if (method == 'style') {
        +      var style = $element.attr('style');
        +
        +      if (typeof(style) !== 'string') {
        +        return null;
        +      }
        +
        +      var attrs = style.split(';');
        +
        +      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
        +        var attr = attrs[i].replace(/\s/g, '');
        +        var matches = attr.match(WIDTH);
        +
        +        if (matches !== null && matches.length >= 1) {
        +          return matches[1];
        +        }
        +      }
        +
        +      return null;
        +    }
        +
        +    return method;
        +  };
        +
        +  Select2.prototype._bindAdapters = function () {
        +    this.dataAdapter.bind(this, this.$container);
        +    this.selection.bind(this, this.$container);
        +
        +    this.dropdown.bind(this, this.$container);
        +    this.results.bind(this, this.$container);
        +  };
        +
        +  Select2.prototype._registerDomEvents = function () {
        +    var self = this;
        +
        +    this.$element.on('change.select2', function () {
        +      self.dataAdapter.current(function (data) {
        +        self.trigger('selection:update', {
        +          data: data
        +        });
        +      });
        +    });
        +
        +    this.$element.on('focus.select2', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this._syncA = Utils.bind(this._syncAttributes, this);
        +    this._syncS = Utils.bind(this._syncSubtree, this);
        +
        +    if (this.$element[0].attachEvent) {
        +      this.$element[0].attachEvent('onpropertychange', this._syncA);
        +    }
        +
        +    var observer = window.MutationObserver ||
        +      window.WebKitMutationObserver ||
        +      window.MozMutationObserver
        +    ;
        +
        +    if (observer != null) {
        +      this._observer = new observer(function (mutations) {
        +        $.each(mutations, self._syncA);
        +        $.each(mutations, self._syncS);
        +      });
        +      this._observer.observe(this.$element[0], {
        +        attributes: true,
        +        childList: true,
        +        subtree: false
        +      });
        +    } else if (this.$element[0].addEventListener) {
        +      this.$element[0].addEventListener(
        +        'DOMAttrModified',
        +        self._syncA,
        +        false
        +      );
        +      this.$element[0].addEventListener(
        +        'DOMNodeInserted',
        +        self._syncS,
        +        false
        +      );
        +      this.$element[0].addEventListener(
        +        'DOMNodeRemoved',
        +        self._syncS,
        +        false
        +      );
        +    }
        +  };
        +
        +  Select2.prototype._registerDataEvents = function () {
        +    var self = this;
        +
        +    this.dataAdapter.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerSelectionEvents = function () {
        +    var self = this;
        +    var nonRelayEvents = ['toggle', 'focus'];
        +
        +    this.selection.on('toggle', function () {
        +      self.toggleDropdown();
        +    });
        +
        +    this.selection.on('focus', function (params) {
        +      self.focus(params);
        +    });
        +
        +    this.selection.on('*', function (name, params) {
        +      if ($.inArray(name, nonRelayEvents) !== -1) {
        +        return;
        +      }
        +
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerDropdownEvents = function () {
        +    var self = this;
        +
        +    this.dropdown.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerResultsEvents = function () {
        +    var self = this;
        +
        +    this.results.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerEvents = function () {
        +    var self = this;
        +
        +    this.on('open', function () {
        +      self.$container.addClass('select2-container--open');
        +    });
        +
        +    this.on('close', function () {
        +      self.$container.removeClass('select2-container--open');
        +    });
        +
        +    this.on('enable', function () {
        +      self.$container.removeClass('select2-container--disabled');
        +    });
        +
        +    this.on('disable', function () {
        +      self.$container.addClass('select2-container--disabled');
        +    });
        +
        +    this.on('blur', function () {
        +      self.$container.removeClass('select2-container--focus');
        +    });
        +
        +    this.on('query', function (params) {
        +      if (!self.isOpen()) {
        +        self.trigger('open', {});
        +      }
        +
        +      this.dataAdapter.query(params, function (data) {
        +        self.trigger('results:all', {
        +          data: data,
        +          query: params
        +        });
        +      });
        +    });
        +
        +    this.on('query:append', function (params) {
        +      this.dataAdapter.query(params, function (data) {
        +        self.trigger('results:append', {
        +          data: data,
        +          query: params
        +        });
        +      });
        +    });
        +
        +    this.on('keypress', function (evt) {
        +      var key = evt.which;
        +
        +      if (self.isOpen()) {
        +        if (key === KEYS.ESC || key === KEYS.TAB ||
        +            (key === KEYS.UP && evt.altKey)) {
        +          self.close();
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.ENTER) {
        +          self.trigger('results:select', {});
        +
        +          evt.preventDefault();
        +        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
        +          self.trigger('results:toggle', {});
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.UP) {
        +          self.trigger('results:previous', {});
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.DOWN) {
        +          self.trigger('results:next', {});
        +
        +          evt.preventDefault();
        +        }
        +      } else {
        +        if (key === KEYS.ENTER || key === KEYS.SPACE ||
        +            (key === KEYS.DOWN && evt.altKey)) {
        +          self.open();
        +
        +          evt.preventDefault();
        +        }
        +      }
        +    });
        +  };
        +
        +  Select2.prototype._syncAttributes = function () {
        +    this.options.set('disabled', this.$element.prop('disabled'));
        +
        +    if (this.options.get('disabled')) {
        +      if (this.isOpen()) {
        +        this.close();
        +      }
        +
        +      this.trigger('disable', {});
        +    } else {
        +      this.trigger('enable', {});
        +    }
        +  };
        +
        +  Select2.prototype._syncSubtree = function (evt, mutations) {
        +    var changed = false;
        +    var self = this;
        +
        +    // Ignore any mutation events raised for elements that aren't options or
        +    // optgroups. This handles the case when the select element is destroyed
        +    if (
        +      evt && evt.target && (
        +        evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
        +      )
        +    ) {
        +      return;
        +    }
        +
        +    if (!mutations) {
        +      // If mutation events aren't supported, then we can only assume that the
        +      // change affected the selections
        +      changed = true;
        +    } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
        +      for (var n = 0; n < mutations.addedNodes.length; n++) {
        +        var node = mutations.addedNodes[n];
        +
        +        if (node.selected) {
        +          changed = true;
        +        }
        +      }
        +    } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
        +      changed = true;
        +    }
        +
        +    // Only re-pull the data if we think there is a change
        +    if (changed) {
        +      this.dataAdapter.current(function (currentData) {
        +        self.trigger('selection:update', {
        +          data: currentData
        +        });
        +      });
        +    }
        +  };
        +
        +  /**
        +   * Override the trigger method to automatically trigger pre-events when
        +   * there are events that can be prevented.
        +   */
        +  Select2.prototype.trigger = function (name, args) {
        +    var actualTrigger = Select2.__super__.trigger;
        +    var preTriggerMap = {
        +      'open': 'opening',
        +      'close': 'closing',
        +      'select': 'selecting',
        +      'unselect': 'unselecting'
        +    };
        +
        +    if (args === undefined) {
        +      args = {};
        +    }
        +
        +    if (name in preTriggerMap) {
        +      var preTriggerName = preTriggerMap[name];
        +      var preTriggerArgs = {
        +        prevented: false,
        +        name: name,
        +        args: args
        +      };
        +
        +      actualTrigger.call(this, preTriggerName, preTriggerArgs);
        +
        +      if (preTriggerArgs.prevented) {
        +        args.prevented = true;
        +
        +        return;
        +      }
        +    }
        +
        +    actualTrigger.call(this, name, args);
        +  };
        +
        +  Select2.prototype.toggleDropdown = function () {
        +    if (this.options.get('disabled')) {
        +      return;
        +    }
        +
        +    if (this.isOpen()) {
        +      this.close();
        +    } else {
        +      this.open();
        +    }
        +  };
        +
        +  Select2.prototype.open = function () {
        +    if (this.isOpen()) {
        +      return;
        +    }
        +
        +    this.trigger('query', {});
        +  };
        +
        +  Select2.prototype.close = function () {
        +    if (!this.isOpen()) {
        +      return;
        +    }
        +
        +    this.trigger('close', {});
        +  };
        +
        +  Select2.prototype.isOpen = function () {
        +    return this.$container.hasClass('select2-container--open');
        +  };
        +
        +  Select2.prototype.hasFocus = function () {
        +    return this.$container.hasClass('select2-container--focus');
        +  };
        +
        +  Select2.prototype.focus = function (data) {
        +    // No need to re-trigger focus events if we are already focused
        +    if (this.hasFocus()) {
        +      return;
        +    }
        +
        +    this.$container.addClass('select2-container--focus');
        +    this.trigger('focus', {});
        +  };
        +
        +  Select2.prototype.enable = function (args) {
        +    if (this.options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `select2("enable")` method has been deprecated and will' +
        +        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
        +        ' instead.'
        +      );
        +    }
        +
        +    if (args == null || args.length === 0) {
        +      args = [true];
        +    }
        +
        +    var disabled = !args[0];
        +
        +    this.$element.prop('disabled', disabled);
        +  };
        +
        +  Select2.prototype.data = function () {
        +    if (this.options.get('debug') &&
        +        arguments.length > 0 && window.console && console.warn) {
        +      console.warn(
        +        'Select2: Data can no longer be set using `select2("data")`. You ' +
        +        'should consider setting the value instead using `$element.val()`.'
        +      );
        +    }
        +
        +    var data = [];
        +
        +    this.dataAdapter.current(function (currentData) {
        +      data = currentData;
        +    });
        +
        +    return data;
        +  };
        +
        +  Select2.prototype.val = function (args) {
        +    if (this.options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `select2("val")` method has been deprecated and will be' +
        +        ' removed in later Select2 versions. Use $element.val() instead.'
        +      );
        +    }
        +
        +    if (args == null || args.length === 0) {
        +      return this.$element.val();
        +    }
        +
        +    var newVal = args[0];
        +
        +    if ($.isArray(newVal)) {
        +      newVal = $.map(newVal, function (obj) {
        +        return obj.toString();
        +      });
        +    }
        +
        +    this.$element.val(newVal).trigger('change');
        +  };
        +
        +  Select2.prototype.destroy = function () {
        +    this.$container.remove();
        +
        +    if (this.$element[0].detachEvent) {
        +      this.$element[0].detachEvent('onpropertychange', this._syncA);
        +    }
        +
        +    if (this._observer != null) {
        +      this._observer.disconnect();
        +      this._observer = null;
        +    } else if (this.$element[0].removeEventListener) {
        +      this.$element[0]
        +        .removeEventListener('DOMAttrModified', this._syncA, false);
        +      this.$element[0]
        +        .removeEventListener('DOMNodeInserted', this._syncS, false);
        +      this.$element[0]
        +        .removeEventListener('DOMNodeRemoved', this._syncS, false);
        +    }
        +
        +    this._syncA = null;
        +    this._syncS = null;
        +
        +    this.$element.off('.select2');
        +    this.$element.attr('tabindex', this.$element.data('old-tabindex'));
        +
        +    this.$element.removeClass('select2-hidden-accessible');
        +    this.$element.attr('aria-hidden', 'false');
        +    this.$element.removeData('select2');
        +
        +    this.dataAdapter.destroy();
        +    this.selection.destroy();
        +    this.dropdown.destroy();
        +    this.results.destroy();
        +
        +    this.dataAdapter = null;
        +    this.selection = null;
        +    this.dropdown = null;
        +    this.results = null;
        +  };
        +
        +  Select2.prototype.render = function () {
        +    var $container = $(
        +      '<span class="select2 select2-container">' +
        +        '<span class="selection"></span>' +
        +        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
        +      '</span>'
        +    );
        +
        +    $container.attr('dir', this.options.get('dir'));
        +
        +    this.$container = $container;
        +
        +    this.$container.addClass('select2-container--' + this.options.get('theme'));
        +
        +    $container.data('element', this.$element);
        +
        +    return $container;
        +  };
        +
        +  return Select2;
        +});
        +
        +S2.define('jquery-mousewheel',[
        +  'jquery'
        +], function ($) {
        +  // Used to shim jQuery.mousewheel for non-full builds.
        +  return $;
        +});
        +
        +S2.define('jquery.select2',[
        +  'jquery',
        +  'jquery-mousewheel',
        +
        +  './select2/core',
        +  './select2/defaults'
        +], function ($, _, Select2, Defaults) {
        +  if ($.fn.select2 == null) {
        +    // All methods that should return the element
        +    var thisMethods = ['open', 'close', 'destroy'];
        +
        +    $.fn.select2 = function (options) {
        +      options = options || {};
        +
        +      if (typeof options === 'object') {
        +        this.each(function () {
        +          var instanceOptions = $.extend(true, {}, options);
        +
        +          var instance = new Select2($(this), instanceOptions);
        +        });
        +
        +        return this;
        +      } else if (typeof options === 'string') {
        +        var ret;
        +        var args = Array.prototype.slice.call(arguments, 1);
        +
        +        this.each(function () {
        +          var instance = $(this).data('select2');
        +
        +          if (instance == null && window.console && console.error) {
        +            console.error(
        +              'The select2(\'' + options + '\') method was called on an ' +
        +              'element that is not using Select2.'
        +            );
        +          }
        +
        +          ret = instance[options].apply(instance, args);
        +        });
        +
        +        // Check if we should be returning `this`
        +        if ($.inArray(options, thisMethods) > -1) {
        +          return this;
        +        }
        +
        +        return ret;
        +      } else {
        +        throw new Error('Invalid arguments for Select2: ' + options);
        +      }
        +    };
        +  }
        +
        +  if ($.fn.select2.defaults == null) {
        +    $.fn.select2.defaults = Defaults;
        +  }
        +
        +  return Select2;
        +});
        +
        +  // Return the AMD loader configuration so it can be used outside of this file
        +  return {
        +    define: S2.define,
        +    require: S2.require
        +  };
        +}());
        +
        +  // Autoload the jQuery bindings
        +  // We know that all of the modules exist above this, so we're safe
        +  var select2 = S2.require('jquery.select2');
        +
        +  // Hold the AMD module references on the jQuery function that was just loaded
        +  // This allows Select2 to use the internal loader outside of this file, such
        +  // as in the language files.
        +  jQuery.fn.select2.amd = S2;
        +
        +  // Return the Select2 instance for anyone who is importing it.
        +  return select2;
        +}));
        diff --git a/bower_components/select2/dist/js/select2.min.js b/bower_components/select2/dist/js/select2.min.js
        new file mode 100644
        index 0000000000..43f0a651e6
        --- /dev/null
        +++ b/bower_components/select2/dist/js/select2.min.js
        @@ -0,0 +1,3 @@
        +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
        +if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){var c=(this._lastTag,this.$element.find("option[data-select2-tag]"));c.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b),d=g.$element.find("option").filter(function(){return a(this).val()===c.id});if(!d.length){var e=g.option(c);e.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([e])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
        +},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/.gitignore b/bower_components/select2/docs/.gitignore
        new file mode 100644
        index 0000000000..aec680090a
        --- /dev/null
        +++ b/bower_components/select2/docs/.gitignore
        @@ -0,0 +1,2 @@
        +_site
        +dist
        diff --git a/bower_components/select2/docs/README.md b/bower_components/select2/docs/README.md
        new file mode 100644
        index 0000000000..b69aed1b32
        --- /dev/null
        +++ b/bower_components/select2/docs/README.md
        @@ -0,0 +1,38 @@
        +Select2 Documentation
        +=====================
        +[This repository][select2-docs-source] holds the latest documentation for
        +[Select2][select2].
        +
        +What is this?
        +-------------
        +The documentation is automatically extracted from the `docs` directory at the
        +[Select2 source repository][select2-source]. This is done periodically by
        +the maintainers of Select2.
        +
        +How can I fix an issue in these docs?
        +-------------------------------------
        +If you are reading this from the source repository, within the `docs` directory,
        +then you're already in the right place. You can fork the source repository,
        +commit your changes, and then make a pull request and it will be reviewed.
        +
        +**If you are reading this from the
        +[documentation repository][select2-docs-source], you are in the wrong place.**
        +Pull requests made directly to the documentation repository will be ignored and
        +eventually closed, so don't do that.
        +
        +How can I build these docs manually?
        +------------------------------------
        +In the [main Select2 repository][select2-source], you can build the
        +documentation by executing
        +
        +```bash
        +grunt docs
        +```
        +
        +Which will start up the documentation on port 4000. You will need
        +[Jekyll][jekyll] installed to build the documentation.
        +
        +[jekyll]: http://jekyllrb.com/
        +[select2]: https://select2.github.io
        +[select2-docs-source]: https://github.com/select2/select2.github.io
        +[select2-source]: https://github.com/select2/select2
        diff --git a/bower_components/select2/docs/_includes/examples/basics.html b/bower_components/select2/docs/_includes/examples/basics.html
        new file mode 100644
        index 0000000000..a077da7721
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/basics.html
        @@ -0,0 +1,97 @@
        +<section>
        +
        +  <h1 id="basics" class="page-header">The basics</h1>
        +
        +  <h2 id="single">Single select boxes</h2>
        +
        +  <p>
        +    Select2 can take a regular select box like this...
        +  </p>
        +
        +  <p>
        +    <select class="js-states form-control"></select>
        +  </p>
        +
        +  <p>
        +    and turn it into this...
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-basic-single js-states form-control"></select>
        +    </p>
        +  </div>
        +
        +{% highlight html linenos %}
        +<script type="text/javascript">
        +$(document).ready(function() {
        +  $(".js-example-basic-single").select2();
        +});
        +</script>
        +
        +<select class="js-example-basic-single">
        +  <option value="AL">Alabama</option>
        +    ...
        +  <option value="WY">Wyoming</option>
        +</select>
        +{% endhighlight %}
        +
        +  <h2 id="multiple">Multiple select boxes</h2>
        +
        +  <p>
        +    Select2 also supports multi-value select boxes. The select below is declared with the <code>multiple</code> attribute.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-basic-multiple js-states form-control" multiple="multiple"></select>
        +    </p>
        +  </div>
        +
        +{% highlight html linenos %}
        +<script type="text/javascript">
        +$(".js-example-basic-multiple").select2();
        +</script>
        +
        +<select class="js-example-basic-multiple" multiple="multiple">
        +  <option value="AL">Alabama</option>
        +    ...
        +  <option value="WY">Wyoming</option>
        +</select>
        +{% endhighlight %}
        +
        +  <h2>Select boxes with labels</h2>
        +
        +  <p>
        +    You can, and should, use a <code>&lt;label&gt;</code> with Select2, just like any other <code>&lt;select&gt</code> element.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <label for="id_label_single">
        +        Click this to highlight the single select element
        +        <select class="js-example-basic-single js-states form-control" id="id_label_single"></select>
        +      </label>
        +    </p>
        +    <p>
        +      <label for="id_label_multiple">
        +        Click this to highlight the multiple select element
        +        <select class="js-example-basic-multiple js-states form-control" id="id_label_multiple" multiple="multiple"></select>
        +      </label>
        +    </p>
        +  </div>
        +
        +{% highlight html linenos %}
        +<label for="id_label_single">
        +  Click this to highlight the single select element
        +
        +  <select class="js-example-basic-single js-states form-control" id="id_label_single"></select>
        +</label>
        +
        +<label for="id_label_multiple">
        +  Click this to highlight the multiple select element
        +
        +  <select class="js-example-basic-multiple js-states form-control" id="id_label_multiple" multiple="multiple"></select>
        +</label>
        +{% endhighlight %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/examples/data.html b/bower_components/select2/docs/_includes/examples/data.html
        new file mode 100644
        index 0000000000..4b55a760ac
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/data.html
        @@ -0,0 +1,123 @@
        +<section>
        +
        +  <h1 id="data" class="page-header">
        +    Data sources
        +  </h1>
        +
        +  <p>In addition to handling options from a standard <code>&lt;select&gt;</code>, Select2 can also retrieve the results from other data sources.</p>
        +
        +  <h2 id="data-array" >Loading array data</h2>
        +
        +  <p>
        +    Select2 provides a way to load the data from a local array.
        +    You can provide initial selections with array data by providing the
        +    option tag for the selected values, similar to how it would be done for
        +    a standard select.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-data-array form-control"></select>
        +    </p>
        +    <p>
        +      <select class="js-example-data-array-selected form-control">
        +        <option value="2" selected="selected">duplicate</option>
        +      </select>
        +    </p>
        +  </div>
        +
        +{% highlight html linenos %}
        +<script type="text/javascript">
        +var data = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }];
        +
        +$(".js-example-data-array").select2({
        +  data: data
        +})
        +
        +$(".js-example-data-array-selected").select2({
        +  data: data
        +})
        +</script>
        +
        +<select class="js-example-data-array"></select>
        +
        +<select class="js-example-data-array-selected">
        +  <option value="2" selected="selected">duplicate</option>
        +</select>
        +{% endhighlight %}
        +
        +  <h2 id="data-ajax" >Loading remote data</h2>
        +
        +  <p>
        +    Select2 comes with AJAX support built in, using jQuery's AJAX methods.
        +    In this example, we can search for repositories using GitHub's API.
        +  </p>
        +
        +  <p>
        +    <select class="js-example-data-ajax form-control">
        +      <option value="3620194" selected="selected">select2/select2</option>
        +    </select>
        +  </p>
        +
        +  <p>
        +    When using Select2 with remote data, the HTML required for the
        +    <code>select</code> is the same as any other Select2. If you need to
        +    provide default selections, you just need to include an
        +    <code>option</code> for each selection that contains the value and text
        +    that should be displayed.
        +  </p>
        +
        +{% highlight html linenos %}
        +<select class="js-data-example-ajax">
        +  <option value="3620194" selected="selected">select2/select2</option>
        +</select>
        +{% endhighlight %}
        +
        +  <p>
        +    You can configure how Select2 searches for remote data using the
        +    <code>ajax</code> option. More information on the individual options
        +    that Select2 handles can be found in the
        +    <a href="options.html#ajax">options documentation for <code>ajax</code></a>.
        +  </p>
        +
        +{% highlight js linenos %}
        +$(".js-data-example-ajax").select2({
        +  ajax: {
        +    url: "https://api.github.com/search/repositories",
        +    dataType: 'json',
        +    delay: 250,
        +    data: function (params) {
        +      return {
        +        q: params.term, // search term
        +        page: params.page
        +      };
        +    },
        +    processResults: function (data, params) {
        +      // parse the results into the format expected by Select2
        +      // since we are using custom formatting functions we do not need to
        +      // alter the remote JSON data, except to indicate that infinite
        +      // scrolling can be used
        +      params.page = params.page || 1;
        +
        +      return {
        +        results: data.items,
        +        pagination: {
        +          more: (params.page * 30) < data.total_count
        +        }
        +      };
        +    },
        +    cache: true
        +  },
        +  escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
        +  minimumInputLength: 1,
        +  templateResult: formatRepo, // omitted for brevity, see the source of this page
        +  templateSelection: formatRepoSelection // omitted for brevity, see the source of this page
        +});
        +{% endhighlight %}
        +
        +  <p>
        +    Select2 will pass any options in the <code>ajax</code> object to
        +    jQuery's <code>$.ajax</code> function, or the <code>transport</code>
        +    function you specify.
        +  </p>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/disabled-mode.html b/bower_components/select2/docs/_includes/examples/disabled-mode.html
        new file mode 100644
        index 0000000000..309a2c2b63
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/disabled-mode.html
        @@ -0,0 +1,43 @@
        +<section>
        +
        +  <h1 id="disabled">Disabled mode</h1>
        +
        +  <p>
        +    Select2 will respond to the <code>disabled</code> attribute on
        +    <code>&lt;select&gt;</code> elements. You can also initialize Select2
        +    with <code>disabled: true</code> to get the same effect.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-disabled js-states form-control" disabled="disabled"></select>
        +    </p>
        +
        +    <p>
        +      <select class="js-example-disabled-multi js-states form-control" multiple="multiple" disabled="disabled"></select>
        +    </p>
        +    <div class="btn-group btn-group-sm" role="group" aria-label="Programmatic enabling and disabling">
        +      <button type="button" class="js-programmatic-enable btn btn-default">
        +        Enable
        +      </button>
        +      <button type="button" class="js-programmatic-disable btn btn-default">
        +        Disable
        +      </button>
        +    </div>
        +  </div>
        +
        +  <pre data-fill-from=".js-code-disabled"></pre>
        +
        +<script type="text/javascript" class="js-code-disabled">
        +$(".js-programmatic-enable").on("click", function () {
        +  $(".js-example-disabled").prop("disabled", false);
        +  $(".js-example-disabled-multi").prop("disabled", false);
        +});
        +
        +$(".js-programmatic-disable").on("click", function () {
        +  $(".js-example-disabled").prop("disabled", true);
        +  $(".js-example-disabled-multi").prop("disabled", true);
        +});
        +</script>
        +
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/disabled-results.html b/bower_components/select2/docs/_includes/examples/disabled-results.html
        new file mode 100644
        index 0000000000..b695a3b6f4
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/disabled-results.html
        @@ -0,0 +1,29 @@
        +<section>
        +
        +  <h1 id="disabled-results">Disabled results</h1>
        +
        +  <p>
        +    Select2 will correctly handle disabled results, both with data coming
        +    from a standard select (when the <code>disabled</code> attribute is set)
        +    and from remote sources, where the object has
        +    <code>disabled: true</code> set.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-disabled-results form-control">
        +        <option value="one">First</option>
        +        <option value="two" disabled="disabled">Second (disabled)</option>
        +        <option value="three">Third</option>
        +      </select>
        +    </p>
        +  </div>
        +
        +{% highlight html linenos %}
        +<select class="js-example-disabled-results">
        +  <option value="one">First</option>
        +  <option value="two" disabled="disabled">Second (disabled)</option>
        +  <option value="three">Third</option>
        +</select>
        +{% endhighlight %}
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/hide-search.html b/bower_components/select2/docs/_includes/examples/hide-search.html
        new file mode 100644
        index 0000000000..0203c1a750
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/hide-search.html
        @@ -0,0 +1,22 @@
        +<section>
        +
        +  <h1 id="hide-search">Hiding the search box</h1>
        +
        +  <p>
        +    Select2 allows you to hide the search box depending on the number of
        +    options which are displayed. In this example, we use the value
        +    <code>Infinity</code> to tell Select2 to never display the search box.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-basic-hide-search js-states form-control"></select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-basic-hide-search").select2({
        +  minimumResultsForSearch: Infinity
        +});
        +{% endhighlight %}
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/localization-rtl-diacritics.html b/bower_components/select2/docs/_includes/examples/localization-rtl-diacritics.html
        new file mode 100644
        index 0000000000..8b881586a6
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/localization-rtl-diacritics.html
        @@ -0,0 +1,82 @@
        +<section>
        +  <h1 id="localization-rtl-diacritics" class="page-header">
        +    Localization, RTL and diacritics support
        +  </h1>
        +
        +  <h2 id="language">Multiple languages</h2>
        +
        +  <p>
        +    Select2 supports displaying the messages in different languages, as well
        +    as providing your own
        +    <a href="options.html#language">custom messages</a>
        +    that can be displayed.
        +  </p>
        +
        +  <p>
        +    The language does not have to be defined when Select2 is being
        +    initialized, but instead can be defined in the <code>[lang]</code>
        +    attribute of any parent elements as <code>[lang="es"]</code>.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-language js-states form-control">
        +      </select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-language").select2({
        +  language: "es"
        +});
        +{% endhighlight %}
        +
        +  <h2 id="rtl">RTL support</h2>
        +
        +  <p>
        +    Select2 will work on RTL websites if the <code>dir</code> attribute is
        +    set on the <code>&lt;select&gt;</code> or any parents of it. You can also
        +    initialize Select2 with <code>dir: "rtl"</code> set.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-rtl js-states form-control" dir="rtl"></select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-rtl").select2({
        +  dir: "rtl"
        +});
        +{% endhighlight %}
        +
        +  <h2 id="diacritics">Diacritics support</h2>
        +
        +  <p>
        +    Select2's default matcher will ignore diacritics, making it easier for
        +    users to filter results in international selects. Type "aero" into the
        +    select below.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-diacritics form-control">
        +        <option>Aeróbics</option>
        +        <option>Aeróbics en Agua</option>
        +        <option>Aerografía</option>
        +        <option>Aeromodelaje</option>
        +        <option>Águilas</option>
        +        <option>Ajedrez</option>
        +        <option>Ala Delta</option>
        +        <option>Álbumes de Música</option>
        +        <option>Alusivos</option>
        +        <option>Análisis de Escritura a Mano</option>
        +      </select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-diacritics").select2();
        +{% endhighlight %}
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/matcher.html b/bower_components/select2/docs/_includes/examples/matcher.html
        new file mode 100644
        index 0000000000..fbdcf1f204
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/matcher.html
        @@ -0,0 +1,39 @@
        +<section>
        +  <h1 id="matcher">Customizing how results are matched</h1>
        +
        +  <p>
        +    Unlike other dropdowns on this page, this one matches options only if
        +    the term appears in the beginning of the string as opposed to anywhere:
        +  </p>
        +
        +  <p>
        +    This custom matcher uses a
        +    <a href="options.html#compat-matcher">compatibility module</a> that is
        +    only bundled in the
        +    <a href="index.html#builds-full">full version of Select2</a>. You also
        +    have the option of using a
        +    <a href="options.html#matcher">more complex matcher</a>.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-matcher-start js-states form-control"></select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +function matchStart (term, text) {
        +  if (text.toUpperCase().indexOf(term.toUpperCase()) == 0) {
        +    return true;
        +  }
        +
        +  return false;
        +}
        +
        +$.fn.select2.amd.require(['select2/compat/matcher'], function (oldMatcher) {
        +  $(".js-example-matcher-start").select2({
        +    matcher: oldMatcher(matchStart)
        +  })
        +});
        +{% endhighlight %}
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/multiple-max.html b/bower_components/select2/docs/_includes/examples/multiple-max.html
        new file mode 100644
        index 0000000000..6ec0056e70
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/multiple-max.html
        @@ -0,0 +1,24 @@
        +<section>
        +  <h1 id="multiple-max">
        +    Limiting the number of selections
        +  </h1>
        +
        +  <p>
        +    Select2 multi-value select boxes can set restrictions regarding the
        +    maximum number of options selected. The select below is declared with
        +    the <code>multiple</code> attribute with <code>maximumSelectionLength</code>
        +    in the select2 options.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-basic-multiple-limit js-states form-control" multiple="multiple"></select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-basic-multiple-limit").select2({
        +  maximumSelectionLength: 2
        +});
        +{% endhighlight %}
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/placeholders.html b/bower_components/select2/docs/_includes/examples/placeholders.html
        new file mode 100644
        index 0000000000..1b6afda950
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/placeholders.html
        @@ -0,0 +1,36 @@
        +<section>
        +  <h1 id="placeholders">Placeholders</h1>
        +
        +  <p>
        +    A placeholder value can be defined and will be displayed until a
        +    selection is made. Select2 uses the <code>placeholder</code> attribute
        +    on multiple select boxes, which requires IE 10+. You can support it in
        +    older versions with
        +    <a href="https://github.com/jamesallardice/Placeholders.js">the Placeholders.js polyfill</a>.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-placeholder-single js-states form-control">
        +        <option></option>
        +      </select>
        +    </p>
        +    <p>
        +      <select class="js-example-placeholder-multiple js-states form-control" multiple="multiple"></select>
        +    </p>
        +  </div>
        +
        +  <pre data-fill-from=".js-code-placeholder"></pre>
        +
        +<script type="text/javascript" class="js-code-placeholder">
        +$(".js-example-placeholder-single").select2({
        +  placeholder: "Select a state",
        +  allowClear: true
        +});
        +
        +$(".js-example-placeholder-multiple").select2({
        +  placeholder: "Select a state"
        +});
        +</script>
        +
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/programmatic-control.html b/bower_components/select2/docs/_includes/examples/programmatic-control.html
        new file mode 100644
        index 0000000000..375eaa4206
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/programmatic-control.html
        @@ -0,0 +1,155 @@
        +<section>
        +  <h1 id="programmatic-control" class="page-header">
        +    Programmatic control
        +  </h1>
        +
        +  <h2 id="events">DOM events</h2>
        +
        +  <p>
        +    Select2 will trigger some events on the original select element,
        +    allowing you to integrate it with other components. You can find more
        +    information on events
        +    <a href="options.html#events">on the options page</a>.
        +  </p>
        +
        +  <p>
        +    <code>change</code> is fired whenever an option is selected or removed.
        +  </p>
        +
        +  <p>
        +    <code>select2:open</code> is fired whenever the dropdown is opened.
        +    <code>select2:opening</code> is fired before this and can be prevented.
        +  </p>
        +
        +  <p>
        +    <code>select2:close</code> is fired whenever the dropdown is closed.
        +    <code>select2:closing</code> is fired before this and can be prevented.
        +  </p>
        +
        +  <p>
        +    <code>select2:select</code> is fired whenever a result is selected.
        +    <code>select2:selecting</code> is fired before this and can be prevented.
        +  </p>
        +
        +  <p>
        +    <code>select2:unselect</code> is fired whenever a result is unselected.
        +    <code>select2:unselecting</code> is fired before this and can be prevented.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-states js-example-events form-control"></select>
        +    </p>
        +    <p>
        +      <select class="js-states js-example-events form-control" multiple="multiple"></select>
        +    </p>
        +  </div>
        +
        +  <div class="s2-event-log">
        +    <ul class="js-event-log"></ul>
        +  </div>
        +
        +  <pre data-fill-from=".js-code-events"></pre>
        +
        +<script type="text/javascript" class="js-code-events">
        +var $eventLog = $(".js-event-log");
        +var $eventSelect = $(".js-example-events");
        +
        +$eventSelect.on("select2:open", function (e) { log("select2:open", e); });
        +$eventSelect.on("select2:close", function (e) { log("select2:close", e); });
        +$eventSelect.on("select2:select", function (e) { log("select2:select", e); });
        +$eventSelect.on("select2:unselect", function (e) { log("select2:unselect", e); });
        +
        +$eventSelect.on("change", function (e) { log("change"); });
        +
        +function log (name, evt) {
        +  if (!evt) {
        +    var args = "{}";
        +  } else {
        +    var args = JSON.stringify(evt.params, function (key, value) {
        +      if (value && value.nodeName) return "[DOM node]";
        +      if (value instanceof $.Event) return "[$.Event]";
        +      return value;
        +    });
        +  }
        +  var $e = $("<li>" + name + " -> " + args + "</li>");
        +  $eventLog.append($e);
        +  $e.animate({ opacity: 1 }, 10000, 'linear', function () {
        +    $e.animate({ opacity: 0 }, 2000, 'linear', function () {
        +      $e.remove();
        +    });
        +  });
        +}
        +</script>
        +
        +  <h2 id="programmatic">Programmatic access</h2>
        +
        +  <p>
        +    Select2 supports methods that allow programmatic control of the
        +    component.
        +  </p>
        +
        +  <div class="s2-example">
        +
        +    <p>
        +      <select class="js-example-programmatic js-states form-control"></select>
        +    </p>
        +
        +    <div class="btn-toolbar" role="toolbar" aria-label="Programmatic control">
        +      <div class="btn-group btn-group-sm" aria-label="Set Select2 option">
        +        <button class="js-programmatic-set-val btn btn-default">
        +          Set "California"
        +        </button>
        +      </div>
        +      <div class="btn-group btn-group-sm" role="group" aria-label="Open and close">
        +        <button class="js-programmatic-open btn btn-default">
        +          Open
        +        </button>
        +        <button class="js-programmatic-close btn btn-default">
        +          Close
        +        </button>
        +      </div>
        +      <div class="btn-group btn-group-sm" role="group" aria-label="Initialize and destroy">
        +        <button class="js-programmatic-init btn btn-default">
        +          Init
        +        </button>
        +        <button class="js-programmatic-destroy btn btn-default">
        +          Destroy
        +        </button>
        +      </div>
        +    </div>
        +
        +    <p>
        +      <select class="js-example-programmatic-multi js-states form-control" multiple="multiple"></select>
        +    </p>
        +
        +    <div class="btn-group btn-group-sm" role="group" aria-label="Programmatic setting and clearing Select2 options">
        +      <button type="button" class="js-programmatic-multi-set-val btn btn-default">
        +        Set to California and Alabama
        +      </button>
        +      <button type="button" class="js-programmatic-multi-clear btn btn-default">
        +        Clear
        +      </button>
        +    </div>
        +
        +  </div>
        +
        +  <pre data-fill-from=".js-code-programmatic"></pre>
        +
        +<script type="text/javascript" class="js-code-programmatic">
        +var $example = $(".js-example-programmatic").select2();
        +var $exampleMulti = $(".js-example-programmatic-multi").select2();
        +
        +$(".js-programmatic-set-val").on("click", function () { $example.val("CA").trigger("change"); });
        +
        +$(".js-programmatic-open").on("click", function () { $example.select2("open"); });
        +$(".js-programmatic-close").on("click", function () { $example.select2("close"); });
        +
        +$(".js-programmatic-init").on("click", function () { $example.select2(); });
        +$(".js-programmatic-destroy").on("click", function () { $example.select2("destroy"); });
        +
        +$(".js-programmatic-multi-set-val").on("click", function () { $exampleMulti.val(["CA", "AL"]).trigger("change"); });
        +$(".js-programmatic-multi-clear").on("click", function () { $exampleMulti.val(null).trigger("change"); });
        +</script>
        +
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/tags.html b/bower_components/select2/docs/_includes/examples/tags.html
        new file mode 100644
        index 0000000000..69733a386d
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/tags.html
        @@ -0,0 +1,29 @@
        +<section>
        +  <h1 id="tags">Tagging support</h1>
        +
        +  <p>
        +    Select2 can be used to quickly set up fields used for tagging.
        +  </p>
        +
        +  <p>
        +    Note that when tagging is enabled the user can select from pre-existing
        +    options or create a new tag by picking the first choice, which is what
        +    the user has typed into the search box so far.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-tags form-control" multiple="multiple">
        +        <option selected="selected">orange</option>
        +        <option>white</option>
        +        <option selected="selected">purple</option>
        +      </select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-tags").select2({
        +  tags: true
        +})
        +{% endhighlight %}
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/themes-templating-responsive-design.html b/bower_components/select2/docs/_includes/examples/themes-templating-responsive-design.html
        new file mode 100644
        index 0000000000..15537f7480
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/themes-templating-responsive-design.html
        @@ -0,0 +1,104 @@
        +<section>
        +
        +  <h1 id="themes-templating-responsive-design" class="page-header">
        +    Themes, templating and responsive design
        +  </h1>
        +
        +  <h2 id="themes">Theme support</h2>
        +
        +  <p>
        +    Select2 supports custom themes using the
        +    <a href="options.html#theme">theme option</a>
        +    so you can style Select2 to match the rest of your application.
        +  </p>
        +
        +  <p>
        +    These are using the <code>classic</code> theme, which matches the old
        +    look of Select2.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-theme-single js-states form-control">
        +      </select>
        +    </p>
        +    <p>
        +      <select class="js-example-theme-multiple js-states form-control" multiple="multiple"></select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-theme-single").select2({
        +  theme: "classic"
        +});
        +
        +$(".js-example-theme-multiple").select2({
        +  theme: "classic"
        +});
        +{% endhighlight %}
        +
        +<h2 id="templating">Templating</h2>
        +
        +<p>
        +  Various display options of the Select2 component can be changed:
        +  You can access the <code>&lt;option&gt;</code> element
        +  (or <code>&lt;optgroup&gt;</code>) and any attributes on those elements
        +  using <code>.element</code>.
        +</p>
        +
        +<p>
        +  Templating is primarily controlled by the
        +  <a href="options.html#templateResult"><code>templateResult</code></a>
        +  and <a href="options.html#templateSelection"><code>templateSelection</code></a>
        +  options.
        +</p>
        +
        +<div class="s2-example">
        +  <p>
        +    <select class="js-example-templating js-states form-control"></select>
        +  </p>
        +</div>
        +
        +{% highlight js linenos %}
        +function formatState (state) {
        +  if (!state.id) { return state.text; }
        +  var $state = $(
        +    '<span><img src="vendor/images/flags/' + state.element.value.toLowerCase() + '.png" class="img-flag" /> ' + state.text + '</span>'
        +  );
        +  return $state;
        +};
        +
        +$(".js-example-templating").select2({
        +  templateResult: formatState
        +});
        +{% endhighlight %}
        +
        +<h2 id="responsive">Responsive design - Percent width</h2>
        +
        +<p>
        +  Select2's width can be set to a percentage of its parent to support
        +  responsive design. The two Select2 boxes below are styled to 50% and 75%
        +  width respectively.
        +</p>
        +
        +<div class="s2-example">
        +  <p>
        +    <select class="js-example-responsive js-states" style="width: 50%"></select>
        +  </p>
        +  <p>
        +    <select class="js-example-responsive js-states" multiple="multiple" style="width: 75%"></select>
        +  </p>
        +</div>
        +
        +{% highlight html linenos %}
        +<select class="js-example-responsive" style="width: 50%"></select>
        +<select class="js-example-responsive" multiple="multiple" style="width: 75%"></select>
        +{% endhighlight %}
        +
        +<div class="alert alert-warning">
        +  Select2 will do its best to resolve the percent width specified via a
        +  css class, but it is not always possible. The best way to ensure that
        +  Select2 is using a percent based width is to inline the
        +  <code>style</code> declaration into the tag.
        +</div>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/examples/tokenizer.html b/bower_components/select2/docs/_includes/examples/tokenizer.html
        new file mode 100644
        index 0000000000..6fa04ca6d1
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/examples/tokenizer.html
        @@ -0,0 +1,32 @@
        +<section>
        +  <h1 id="tokenizer">Automatic tokenization</h1>
        +
        +  <p>
        +    Select2 supports ability to add choices automatically as the user is
        +    typing into the search field. Try typing in the search field below and
        +    entering a space or a comma.
        +  </p>
        +
        +  <p>
        +    The separators that should be used when tokenizing can be specified
        +    using the <a href="options.html#tokenSeparators">tokenSeparators</a>
        +    options.
        +  </p>
        +
        +  <div class="s2-example">
        +    <p>
        +      <select class="js-example-tokenizer form-control" multiple="multiple">
        +        <option>red</option>
        +        <option>blue</option>
        +        <option>green</option>
        +      </select>
        +    </p>
        +  </div>
        +
        +{% highlight js linenos %}
        +$(".js-example-tokenizer").select2({
        +  tags: true,
        +  tokenSeparators: [',', ' ']
        +})
        +{% endhighlight %}
        +</section>
        diff --git a/bower_components/select2/docs/_includes/footer.html b/bower_components/select2/docs/_includes/footer.html
        new file mode 100644
        index 0000000000..1198d5af3d
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/footer.html
        @@ -0,0 +1,20 @@
        +<footer class="s2-docs-footer" role="contentinfo">
        +  <div class="container">
        +    {% include social-buttons.html %}
        +    <p>
        +      Select2 is licensed under <a href="https://github.com/select2/select2/blob/master/LICENSE.md">MIT</a>, documentation under <a href="https://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.
        +    </p>
        +    <p>
        +      Maintained by <a href="https://github.com/kevin-brown">Kevin Brown</a> and <a href="https://github.com/ivaynberg">Igor Vaynberg</a> with the help of <a href="https://github.com/select2/select2/graphs/contributors">our contributors</a>.
        +    </p>
        +    <ul class="s2-docs-footer-links">
        +      <li>Currently v4.0.3</li>
        +      <li><a href="https://github.com/select2/select2">GitHub</a></li>
        +      <li><a href="./examples.html">Examples</a></li>
        +      <li><a href="./options.html">Options</a></li>
        +      <li><a href="http://select2.github.io/select2/">v3.5.2 docs</a></li>
        +      <li><a href="https://github.com/select2/select2/issues">Issues</a></li>
        +      <li><a href="https://github.com/select2/select2/releases">Releases</a></li>
        +    </ul>
        +  </div>
        +</footer>
        diff --git a/bower_components/select2/docs/_includes/ga.html b/bower_components/select2/docs/_includes/ga.html
        new file mode 100644
        index 0000000000..5ed5228526
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/ga.html
        @@ -0,0 +1,9 @@
        +<script type="text/javascript">
        +  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        +    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        +    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        +  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
        +
        +  ga('create', 'UA-57144786-2', 'auto');
        +  ga('send', 'pageview');
        +</script>
        diff --git a/bower_components/select2/docs/_includes/head.html b/bower_components/select2/docs/_includes/head.html
        new file mode 100644
        index 0000000000..84270cfc35
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/head.html
        @@ -0,0 +1,31 @@
        +<meta charset="utf-8">
        +<meta http-equiv="X-UA-Compatible" content="IE=edge">
        +<meta name="viewport" content="width=device-width, initial-scale=1">
        +
        +<link rel="apple-touch-icon" sizes="57x57" href="/images/apple-touch-icon-57x57.png?v=699Nxpjr2A">
        +<link rel="apple-touch-icon" sizes="60x60" href="/images/apple-touch-icon-60x60.png?v=699Nxpjr2A">
        +<link rel="apple-touch-icon" sizes="72x72" href="/images/apple-touch-icon-72x72.png?v=699Nxpjr2A">
        +<link rel="icon" type="image/png" href="/images/favicon-32x32.png?v=699Nxpjr2A" sizes="32x32">
        +<link rel="icon" type="image/png" href="/images/favicon-16x16.png?v=699Nxpjr2A" sizes="16x16">
        +<link rel="manifest" href="/images/manifest.json?v=699Nxpjr2A">
        +<link rel="mask-icon" href="/images/safari-pinned-tab.svg?v=699Nxpjr2A" color="#F6F6F6">
        +<link rel="shortcut icon" href="/images/favicon.ico?v=699Nxpjr2A">
        +<meta name="msapplication-TileColor" content="#da532c">
        +<meta name="msapplication-config" content="/browserconfig.xml?v=699Nxpjr2A">
        +<meta name="theme-color" content="#f6f6f6">
        +
        +<title>
        +  {{ page.title }}
        +</title>
        +
        +<script type="text/javascript" src="vendor/js/jquery.min.js"></script>
        +<script type="text/javascript" src="dist/js/select2.full.js"></script>
        +<script type="text/javascript" src="vendor/js/bootstrap.min.js"></script>
        +<script type="text/javascript" src="vendor/js/prettify.min.js"></script>
        +<script type="text/javascript" src="vendor/js/anchor.min.js"></script>
        +
        +<link href="css/bootstrap.css" type="text/css" rel="stylesheet" />
        +<link href="dist/css/select2.min.css" type="text/css" rel="stylesheet" />
        +
        +<link href="css/font-awesome.css" type="text/css" rel="stylesheet" />
        +<link href="css/s2-docs.css" type="text/css" rel="stylesheet" >
        diff --git a/bower_components/select2/docs/_includes/js-source-states.html b/bower_components/select2/docs/_includes/js-source-states.html
        new file mode 100644
        index 0000000000..34876bee6e
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/js-source-states.html
        @@ -0,0 +1,62 @@
        +<select class="js-source-states">
        +  <optgroup label="Alaskan/Hawaiian Time Zone">
        +    <option value="AK">Alaska</option>
        +    <option value="HI">Hawaii</option>
        +  </optgroup>
        +  <optgroup label="Pacific Time Zone">
        +    <option value="CA">California</option>
        +    <option value="NV">Nevada</option>
        +    <option value="OR">Oregon</option>
        +    <option value="WA">Washington</option>
        +  </optgroup>
        +  <optgroup label="Mountain Time Zone">
        +    <option value="AZ">Arizona</option>
        +    <option value="CO">Colorado</option>
        +    <option value="ID">Idaho</option>
        +    <option value="MT">Montana</option>
        +    <option value="NE">Nebraska</option>
        +    <option value="NM">New Mexico</option>
        +    <option value="ND">North Dakota</option>
        +    <option value="UT">Utah</option>
        +    <option value="WY">Wyoming</option>
        +  </optgroup>
        +  <optgroup label="Central Time Zone">
        +    <option value="AL">Alabama</option>
        +    <option value="AR">Arkansas</option>
        +    <option value="IL">Illinois</option>
        +    <option value="IA">Iowa</option>
        +    <option value="KS">Kansas</option>
        +    <option value="KY">Kentucky</option>
        +    <option value="LA">Louisiana</option>
        +    <option value="MN">Minnesota</option>
        +    <option value="MS">Mississippi</option>
        +    <option value="MO">Missouri</option>
        +    <option value="OK">Oklahoma</option>
        +    <option value="SD">South Dakota</option>
        +    <option value="TX">Texas</option>
        +    <option value="TN">Tennessee</option>
        +    <option value="WI">Wisconsin</option>
        +  </optgroup>
        +  <optgroup label="Eastern Time Zone">
        +    <option value="CT">Connecticut</option>
        +    <option value="DE">Delaware</option>
        +    <option value="FL">Florida</option>
        +    <option value="GA">Georgia</option>
        +    <option value="IN">Indiana</option>
        +    <option value="ME">Maine</option>
        +    <option value="MD">Maryland</option>
        +    <option value="MA">Massachusetts</option>
        +    <option value="MI">Michigan</option>
        +    <option value="NH">New Hampshire</option>
        +    <option value="NJ">New Jersey</option>
        +    <option value="NY">New York</option>
        +    <option value="NC">North Carolina</option>
        +    <option value="OH">Ohio</option>
        +    <option value="PA">Pennsylvania</option>
        +    <option value="RI">Rhode Island</option>
        +    <option value="SC">South Carolina</option>
        +    <option value="VT">Vermont</option>
        +    <option value="VA">Virginia</option>
        +    <option value="WV">West Virginia</option>
        +  </optgroup>
        +</select>
        diff --git a/bower_components/select2/docs/_includes/nav/announcements-4.0.html b/bower_components/select2/docs/_includes/nav/announcements-4.0.html
        new file mode 100644
        index 0000000000..733e2c472f
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/nav/announcements-4.0.html
        @@ -0,0 +1,26 @@
        +<nav class="s2-docs-sidebar hidden-print hidden-xs hidden-sm">
        +  <ul class="nav s2-docs-sidenav">
        +    <li>
        +      <a href="#select2-400">Select2 4.0.0</a>
        +      <ul class="nav">
        +        <li><a href="#new-features">New features</a></li>
        +        <li><a href="#plugin-system">Plugin system</a></li>
        +        <li><a href="#amd-based-build-system">AMD-based build system</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#migrating-from-select2-35">Migrating from Select2 3.5</a>
        +      <ul class="nav">
        +        <li><a href="#hidden-input">No more hidden input tags</a></li>
        +        <li><a href="#new-matcher">Advanced matching of searches</a></li>
        +        <li><a href="#flexible-placeholders">More flexible placeholders</a></li>
        +        <li><a href="#value-ordering">Display reflects the actual order of the values</a></li>
        +        <li><a href="#changed-options">Changed method and option names</a></li>
        +        <li><a href="#removed-methods">Deprecated and removed methods</a></li>
        +      </ul>
        +    </li>
        +  </ul>
        +  <a class="back-to-top" href="#top">
        +    Back to top
        +  </a>
        +</nav>
        diff --git a/bower_components/select2/docs/_includes/nav/examples.html b/bower_components/select2/docs/_includes/nav/examples.html
        new file mode 100644
        index 0000000000..3e48e4046f
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/nav/examples.html
        @@ -0,0 +1,96 @@
        +<nav class="s2-docs-sidebar hidden-print hidden-xs hidden-sm">
        +  <ul class="nav s2-docs-sidenav">
        +    <li>
        +      <a href="#basics">The basics</a>
        +      <ul class="nav">
        +        <li>
        +          <a href="#single">Single select boxes</a>
        +        </li>
        +        <li>
        +          <a href="#multiple">Multiple select boxes</a>
        +        </li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#placeholders">Placeholders</a>
        +    </li>
        +    <li>
        +      <a href="#data">
        +        Data sources
        +      </a>
        +      <ul class="nav">
        +        <li>
        +          <a href="#data-array">Loading array data</a>
        +        </li>
        +        <li>
        +          <a href="#data-ajax">Loading remote data</a>
        +        </li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#disabled">Disabled mode</a>
        +    </li>
        +    <li>
        +      <a href="#disabled-results">Disabled results</a>
        +    </li>
        +    <li>
        +      <a href="#multiple-max">Limiting the number of selections</a>
        +    </li>
        +    <li>
        +      <a href="#hide-search">Hiding the search box</a>
        +    </li>
        +    <li>
        +      <a href="#programmatic-control">Programmatic control</a>
        +      <ul class="nav">
        +        <li>
        +          <a href="#events">DOM events</a>
        +        </li>
        +        <li>
        +          <a href="#programmatic">Programmatic access</a>
        +        </li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#tags">Tagging support</a>
        +    </li>
        +    <li>
        +      <a href="#tokenizer">Automatic tokenization</a>
        +    </li>
        +    <li>
        +      <a href="#matcher">Customizing how results are matched</a>
        +    </li>
        +    <li>
        +      <a href="#localization-rtl-diacritics">Localization, RTL and diacritics support</a>
        +      <ul class="nav">
        +        <li>
        +          <a href="#language">Multiple languages</a>
        +        </li>
        +        <li>
        +          <a href="#rtl">RTL support</a>
        +        </li>
        +        <li>
        +          <a href="#diacritics">Diacritics support</a>
        +        </li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#themes-templating-responsive-design">
        +        Themes, templating and responsive design
        +      </a>
        +      <ul class="nav">
        +        <li>
        +          <a href="#themes">Theme support</a>
        +        </li>
        +        <li>
        +          <a href="#templating">Templating</a>
        +        </li>
        +        <li>
        +          <a href="#responsive">Responsive design</a>
        +        </li>
        +      </ul>
        +    </li>
        +  </ul>
        +  <a class="back-to-top" href="#top">
        +    Back to top
        +  </a>
        +</nav>
        diff --git a/bower_components/select2/docs/_includes/nav/options-old.html b/bower_components/select2/docs/_includes/nav/options-old.html
        new file mode 100644
        index 0000000000..b03d3d0701
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/nav/options-old.html
        @@ -0,0 +1,55 @@
        +<nav class="s2-docs-sidebar hidden-print hidden-xs hidden-sm">
        +  <ul class="nav s2-docs-sidenav">
        +    <li>
        +      <a href="#core-options">Core Options</a>
        +      <ul class="nav">
        +        <li><a href="#data-attributes">Declaring configuration in the <code>data-*</code> attributes</a></li>
        +        <li><a href="#amd">AMD compatibility</a></li>
        +        <li><a href="#core-options-display">Displaying selections</a></li>
        +        <li><a href="#core-options-results">Returning and displaying results</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#dropdown">Dropdown</a>
        +      <ul class="nav">
        +        <li><a href="#dropdownParent">Attached to body</a></li>
        +        <li><a href="#dropdown-attachContainer">Attached below the container</a></li>
        +        <li><a href="#dropdown-search">Search</a></li>
        +        <li><a href="#dropdown-select-on-close">Select the highlighted option on close</a></li>
        +        <li><a href="#closeOnSelect">Close the dropdown when a result is selected</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#events">Events</a>
        +      <ul class="nav">
        +        <li><a href="#events-public">Public events</a></li>
        +        <li><a href="#events-internal">Internal events</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#adapters">The plugin system (adapters)</a>
        +      <ul class="nav">
        +        <li><a href="#adapters-all">All adapters</a></li>
        +        <li><a href="#selectionAdapter">Container (selection)</a></li>
        +        <li><a href="#dataAdapter">Data set</a></li>
        +        <li><a href="#dropdownAdapter">Dropdown</a></li>
        +        <li><a href="#resultsAdapter">Results</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#setting-default-options">Setting default options</a>
        +    </li>
        +    <li>
        +      <a href="#backwards-compatibility">Backwards compatibility</a>
        +      <ul class="nav">
        +        <li><a href="#compat-matcher">Simplified function for matching data objects</a></li>
        +        <li><a href="#initSelection">Old initial selections with <code>initSelection</code></a></li>
        +        <li><a href="#query">Querying old data with <code>query</code></a></li>
        +        <li><a href="#input-fallback">Compatibility with <code>&lt;input type="text" /&gt;</code></a></li>
        +      </ul>
        +    </li>
        +  </ul>
        +  <a class="back-to-top" href="#top">
        +    Back to top
        +  </a>
        +</nav>
        diff --git a/bower_components/select2/docs/_includes/nav/options.html b/bower_components/select2/docs/_includes/nav/options.html
        new file mode 100644
        index 0000000000..4c1be4f355
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/nav/options.html
        @@ -0,0 +1,77 @@
        +<nav class="s2-docs-sidebar hidden-print hidden-xs hidden-sm">
        +  <ul class="nav s2-docs-sidenav">
        +    <li>
        +      <a href="#core-options">Core options</a>
        +      <ul class="nav">
        +        <li><a href="#setting-default-options">Changing default options</a></li>
        +        <li><a href="#data-attributes">Declaring configuration in the HTML</a></li>
        +        <li><a href="#amd">AMD compatibility</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#data-adapters">Data adapters</a>
        +      <ul class="nav">
        +        <li>
        +          <a href="#data-adapters-select-tag">Using a <code>&lt;select&gt;</code></a>
        +        </li>
        +        <li>
        +          <a href="#data">Loading data from an array</a>
        +        </li>
        +        <li>
        +          <a href="#ajax">Connecting to a remote data source</a>
        +        </li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#selections">Displaying selections</a>
        +      <ul class="nav">
        +        <li>
        +          <a href="#placeholder">Showing a placeholder</a>
        +        </li>
        +        <li>
        +          <a href="#allowClear">Clearing selections</a>
        +        </li>
        +        <li>
        +          <a href="#templateSelection">Templating</a>
        +        </li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#results">Displaying results</a>
        +      <ul class="nav">
        +        <li><a href="#can-i-change-when-search-results-are-loaded">Controlling result loading</a></li>
        +        <li><a href="#can-i-change-how-selecting-results-works">Making selections</a></li>
        +        <li><a href="#can-i-change-how-the-dropdown-is-placed">Placement</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#events">Events</a>
        +      <ul class="nav">
        +        <li><a href="#events-public">Public jQuery events</a></li>
        +        <li><a href="#events-internal">Internal events</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#adapters">The plugin system (adapters)</a>
        +      <ul class="nav">
        +        <li><a href="#adapters-all">All adapters</a></li>
        +        <li><a href="#selectionAdapter">Container (selection)</a></li>
        +        <li><a href="#dataAdapter">Data set</a></li>
        +        <li><a href="#dropdownAdapter">Dropdown</a></li>
        +        <li><a href="#resultsAdapter">Results</a></li>
        +      </ul>
        +    </li>
        +    <li>
        +      <a href="#backwards-compatibility">Deprecated options</a>
        +      <ul class="nav">
        +        <li><a href="#compat-matcher">Simplified function for matching data objects</a></li>
        +        <li><a href="#initSelection">Old initial selections with <code>initSelection</code></a></li>
        +        <li><a href="#query">Querying old data with <code>query</code></a></li>
        +        <li><a href="#input-fallback">Compatibility with <code>&lt;input type="text" /&gt;</code></a></li>
        +      </ul>
        +    </li>
        +  </ul>
        +  <a class="back-to-top" href="#top">
        +    Back to top
        +  </a>
        +</nav>
        diff --git a/bower_components/select2/docs/_includes/navigation.html b/bower_components/select2/docs/_includes/navigation.html
        new file mode 100644
        index 0000000000..d694fa1f46
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/navigation.html
        @@ -0,0 +1,53 @@
        +<header class="s2-docs-nav navbar navbar-default navbar-static-top" id="top" role="banner">
        +  <div class="container">
        +    <div class="navbar-header">
        +      <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".select2-navbar-collapse">
        +        <span class="sr-only">Toggle navigation</span>
        +        <span class="icon-bar top-bar"></span>
        +        <span class="icon-bar middle-bar"></span>
        +        <span class="icon-bar bottom-bar"></span>
        +      </button>
        +      <a href="./" class="navbar-brand"><img src="/images/logo.png" height="20px"> Select2</a>
        +    </div>
        +
        +    <nav class="collapse navbar-collapse select2-navbar-collapse" role="navigation">
        +      <ul class="nav navbar-nav">
        +        <li{% if page.slug == "examples" %} class="active"{% endif %}>
        +          <a href="./examples.html">Examples</a>
        +        </li>
        +        <li{% if page.slug == "options" %} class="active"{% endif %}>
        +          <a href="./options.html">Options</a>
        +        </li>
        +        <li class="dropdown{% if page.slug == "announcements-4.0" %} active{% endif %}">
        +          <a href="#" class="dropdown-toggle" data-toggle="dropdown">
        +            Topics
        +            <span class="caret"></span>
        +          </a>
        +          <ul class="dropdown-menu">
        +            <li{% if page.slug == "announcements-4.0" %} class="active"{% endif %}>
        +              <a href="./announcements-4.0.html">4.0 Announcement</a>
        +            </li>
        +            <li class="divider"></li>
        +            <li>
        +              <a href="https://github.com/select2/select2/releases">
        +                Release notes
        +              </a>
        +            </li>
        +          </ul>
        +        </li>
        +        <li{% if page.slug == "community" %} class="active"{% endif %}>
        +          <a href="./community.html">Community</a>
        +        </li>
        +      </ul>
        +
        +      <ul class="nav navbar-nav navbar-right">
        +        <li>
        +          <a href="https://github.com/select2/select2">
        +            <i class="fa fa-github"></i>
        +            GitHub
        +          </a>
        +        </li>
        +      </ul>
        +    </nav>
        +  </div>
        +</header>
        diff --git a/bower_components/select2/docs/_includes/notice-previous.html b/bower_components/select2/docs/_includes/notice-previous.html
        new file mode 100644
        index 0000000000..9a444cfc98
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/notice-previous.html
        @@ -0,0 +1,7 @@
        +<section class="notice-previous">
        +  <div class="container text-center">
        +    <a href="http://select2.github.io/select2/">Looking for the Select2 3.5.2 docs?</a>
        +    We have moved them to a new location
        +    <a href="announcements-4.0.html">while we push forward with Select2 4.0</a>.
        +  </div>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options-old/adapters.html b/bower_components/select2/docs/_includes/options-old/adapters.html
        new file mode 100644
        index 0000000000..c0807ede12
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options-old/adapters.html
        @@ -0,0 +1,209 @@
        +<section>
        +  <div class="page-header">
        +    <h1 id="adapters">Adapters</h1>
        +  </div>
        +
        +  <p>
        +    Select2 allows plugins to add additional functionality through the core
        +    adapters. You can change almost anything involving the way Select2 works
        +    to the way Select2 interacts with the page by modifying the core adapters.
        +    Most third-party plugins should provide decorators (used to wrap adapters)
        +    and custom adapters that you can use.
        +  </p>
        +
        +  <p>
        +    Each adapter contains a set of methods which will must always be defined.
        +    Along with the global methods that all adapters must implement, these
        +    methods must be implemented.
        +  </p>
        +
        +  <h2 id="adapters-all">
        +    All adapters
        +  </h2>
        +
        +  <p>
        +    All adapters must implement a set of methods that Select2 will use to
        +    display them and bind any internal events.
        +  </p>
        +
        +<pre class="prettyprint linenums">
        +// The basic HTML that should be rendered by Select2. A jQuery or DOM element
        +// should be returned, which will automatically be placed by Select2 within the
        +// DOM.
        +//
        +// @returns A jQuery or DOM element that contains any elements that must be
        +//   rendered by Select2.
        +Adapter.render = function () {
        +  return $jq;
        +};
        +
        +// Bind to any Select2 or DOM events.
        +//
        +// @param container The Select2 object that is bound to the jQuery element.  You
        +//   can listen to Select2 events with `on` and trigger Select2 events using the
        +//   `trigger` method.
        +// @param $container The jQuery DOM node that all default adapters will be
        +//   rendered within.
        +Adapter.bind = function (container, $container) { };
        +
        +// Position the DOM element within the Select2 DOM container, or in another
        +// place. This allows adapters to be located outside of the Select2 DOM,
        +// such as at the end of the document or in a specific place within the Select2
        +// DOM node.
        +//
        +// Note: This method is not called on data adapters.
        +//
        +// @param $rendered The rendered DOM element that was returned from the call to
        +//   `render`. This may have been modified by Select2, but the root element
        +//   will always be the same.
        +// @param $defaultContainer The default container that Select2 will typically
        +//   place the rendered DOM element within. For most adapters, this is the
        +//   Select2 DOM element.
        +Adapter.position = function ($rendered, $defaultContainer) { };
        +
        +// Destroy any events or DOM elements that have been created.
        +// This is called when `select2("destroy")` is called on an element.
        +Adapter.destroy = function () { };
        +</pre>
        +
        +  <h2 id="selectionAdapter">
        +    Container (selection)
        +  </h2>
        +
        +  <p>
        +    The selection is what is shown to the user as a replacement of the
        +    standard <code>&lt;select&gt;</code> box. It controls the display of the
        +    selection option(s), as well anything else that needs to be embedded
        +    within the container, such as a search box.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd>
        +      <code>selectionAdapter</code>
        +    </dd>
        +
        +    <dt>Default</dt>
        +    <dd>
        +      <code title="select2/selection/single">SingleSelection</code> or
        +      <code title="select2/selection/multiple">MultipleSelection</code>
        +    </dd>
        +
        +    <dt>Base</dt>
        +    <dd>
        +      <code title="select2/selection/base">BaseSelection</code>
        +    </dd>
        +  </dl>
        +
        +<pre class="prettyprint linenums">
        +// Update the selected data.
        +//
        +// @param data An array of data objects that have been generated by the data
        +//   adapter. If no objects should be selected, an empty array will be passed.
        +//
        +// Note: An array will always be passed into this method, even if Select2 is
        +// attached to a source which only accepts a single selection.
        +SelectionAdapter.update = function (data) { };
        +</pre>
        +
        +  <h2 id="dataAdapter">
        +    Data set
        +  </h2>
        +
        +  <p>
        +    The data set is what Select2 uses to generate the possible results that
        +    can be selected, as well as the currently selected results.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd>
        +      <code>dataAdapter</code>
        +    </dd>
        +
        +    <dt>Default</dt>
        +    <dd>
        +      <code title="select2/data/select">SelectAdapter</code>
        +    </dd>
        +
        +    <dt>Base</dt>
        +    <dd>
        +      <code title="select2/data/base">BaseAdapter</code>
        +    </dd>
        +  </dl>
        +
        +<pre class="prettyprint linenums">
        +// Get the currently selected options. This is called when trying to get the
        +// initial selection for Select2, as well as when Select2 needs to determine
        +// what options within the results are selected.
        +//
        +// @param callback A function that should be called when the current selection
        +//   has been retrieved. The first parameter to the function should be an array
        +//   of data objects.
        +DataAdapter.current = function (callback) {
        +  callback(currentData);
        +}
        +
        +// Get a set of options that are filtered based on the parameters that have
        +// been passed on in.
        +//
        +// @param params An object containing any number of parameters that the query
        +//   could be affected by. Only the core parameters will be documented.
        +// @param params.term A user-supplied term. This is typically the value of the
        +//   search box, if one exists, but can also be an empty string or null value.
        +// @param params.page The specific page that should be loaded. This is typically
        +//   provided when working with remote data sets, which rely on pagination to
        +//   determine what objects should be displayed.
        +// @param callback The function that should be called with the queried results.
        +DataAdapter.query = function (params, callback) {
        +  callback(queryiedData);
        +}
        +</pre>
        +
        +  <h2 id="dropdownAdapter">
        +    Dropdown
        +  </h2>
        +
        +  <p>
        +    The dropdown adapter defines the main container that the dropdown should
        +    be held in. <strong>It does not define any extra methods that can be used
        +    for decorators</strong>, but it is common for decorators to attach to the
        +    <code>render</code> and <code>position</code> methods to alter how the
        +    dropdown is altered and positioned.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd>
        +      <code>dropdownAdapter</code>
        +    </dd>
        +
        +    <dt>Default</dt>
        +    <dd>
        +      <code title="select2/dropdown">DropdownAdapter</code>
        +    </dd>
        +  </dl>
        +
        +  <h2 id="resultsAdapter">
        +    Results
        +  </h2>
        +
        +  <p>
        +    The results adapter controls the list of results that the user can select
        +    from. While the results adapter does not define any additional methods
        +    that must be implemented, it makes extensive use of the Select2 event
        +    system for controlling the display of results and messages.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd>
        +      <code>resultsAdapter</code>
        +    </dd>
        +
        +    <dt>Default</dt>
        +    <dd>
        +      <code title="select2/results">ResultsAdapter</code>
        +    </dd>
        +  </dl>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options-old/backwards-compatibility.html b/bower_components/select2/docs/_includes/options-old/backwards-compatibility.html
        new file mode 100644
        index 0000000000..4bdd937203
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options-old/backwards-compatibility.html
        @@ -0,0 +1,200 @@
        +<section>
        +  <div class="page-header">
        +    <h1 id="compatibility">Backwards compatibility</h1>
        +  </div>
        +
        +  <p>
        +    Select2 offers limited backwards compatibility with the previously 3.5.x
        +    release line, allowing people more efficiently transfer across releases
        +    and get the latest features. For many of the larger changes, such as the
        +    change in how custom data adapters work, compatibility modules were
        +    created that will be used to assist in the upgrade process. It is not
        +    recommended to rely on these compatibility modules, as they will not
        +    always exist, but they make upgrading easier for major changes.
        +  </p>
        +
        +  <p>
        +    <strong>The compatibility modules are only included in the
        +    <a href="index.html#builds-full" class="alert-link">full builds</a> of
        +    Select2</strong>. These files end in <code>.full.js</code>, and the
        +    compatibility modules are prefixed with <code>select2/compat</code>.
        +  </p>
        +
        +  <h2 id="compat-matcher">
        +    Simplified function for matching data objects
        +  </h2>
        +
        +  <p class="alert alert-info">
        +    <a href="announcements-4.0.html#new-matcher" class="alert-link">Added in Select2 4.0.0.</a>
        +    This method was added to make upgrading easier from earlier versions of
        +    Select2.
        +  </p>
        +
        +  <p>
        +    During the <a href="announcements-4.0.html">Select2 4.0.0 release</a>, the
        +    <code>matcher</code> function was changed to allow for more complex
        +    matching of nested objects.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>matcher</code>
        +        </dd>
        +
        +        <dt>Value</dt>
        +        <dd>
        +          A function taking a search <code>term</code> and the data object
        +          <code>text</code>.
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/compat/matcher">oldMatcher</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <p>
        +    The <a href="examples.html#matcher">custom matcher example</a> provides a
        +    guide for how to use this in your own application. For those upgrading
        +    from older versions of Select2, you just need to wrap your old
        +    <code>matcher</code> with this function to maintain compatibility.
        +  </p>
        +
        +  <h2 id="initSelection">
        +    Old initial selections with <code>initSelection</code>
        +  </h2>
        +
        +  <p class="alert alert-warning">
        +    <a href="announcements-4.0.html#removed-initselection" class="alert-link">Deprecated in Select2 4.0.</a>
        +    This has been replaced by another option and is only available in the
        +    <a href="index.html#builds-full" class="alert-link">full builds</a> of
        +    Select2.
        +  </p>
        +
        +  <p>
        +    In the past, Select2 required an option called <code>initSelection</code>
        +    that was defined whenever a custom data source was being used, allowing
        +    for the initial selection for the component to be determined. This has
        +    been replaced by the <code>current</code> method on the
        +    <a href="#dataAdapter">data adapter</a>.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>initSelection</code>
        +        </dd>
        +
        +        <dt>Value</dt>
        +        <dd>
        +          A function taking a <code>callback</code>
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/base">DataAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/compat/initSelection">InitSelection</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <h2 id="query">
        +    Querying old data with <code>query</code>
        +  </h2>
        +
        +  <p class="alert alert-warning">
        +    <a href="announcements-4.0.html#query-to-data-adapter" class="alert-link">Deprecated in Select2 4.0.</a>
        +    This has been replaced by another option and is only available in the
        +    <a href="index.html#builds-full" class="alert-link">full builds</a> of
        +    Select2.
        +  </p>
        +
        +  <p>
        +    In the past, Select2 supported an option called <code>query</code> that
        +    allowed for a custom data source to be used. This option has been replaced
        +    by the <code>query</code> method on the
        +    <a href="#dataAdapter">data adapter</a> and takes a very similar set of
        +    parameters.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>query</code>
        +        </dd>
        +
        +        <dt>Value</dt>
        +        <dd>
        +          A function taking <code>params</code> (including a <code>callback</code>)
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/base">DataAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/compat/query">Query</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <h2 id="input-fallback">
        +    Compatibility with <code>&lt;input type="text" /&gt;</code>
        +  </h2>
        +
        +  <p class="alert alert-warning">
        +    <a href="announcements-4.0.html#hidden-input" class="alert-link">Deprecated in Select2 4.0.</a>
        +    It is now encouraged to use the <code>&lt;select&gt;</code> tag instead.
        +  </p>
        +
        +  <p>
        +    In past versions of Select2, a <code>&lt;select&gt;</code> element could
        +    only be used with a limited subset of options. An
        +    <code>&lt;input type="hidden" /&gt;</code> was required instead, which did
        +    not allow for a graceful fallback for users who did not have JavaScript
        +    enabled. Select2 now supports the <code>&lt;select&gt;</code> element for
        +    all options, so it is no longer required to use <code>&lt;input /&gt;</code>
        +    elements with Select2.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Adapter</dt>
        +    <dd>
        +      <code title="select2/data/base">DataAdapter</code>
        +    </dd>
        +
        +    <dt>Decorator</dt>
        +    <dd>
        +      <code title="select2/compat/inputData">InputData</code>
        +    </dd>
        +  </dl>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options-old/core-options.html b/bower_components/select2/docs/_includes/options-old/core-options.html
        new file mode 100644
        index 0000000000..c32ca56f66
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options-old/core-options.html
        @@ -0,0 +1,790 @@
        +<section>
        +  <h1 id="core-options" class="page-header">Core options</h1>
        +
        +  <p>
        +    Select2 supports a small subset of options in every build that is
        +    generated. Each option typically has a decorator that is required that
        +    wraps an adapter, adding support for the option. This is only required
        +    when a custom adapter is being used, as Select2 will build the required
        +    adapters by default.
        +  </p>
        +
        +  <p>
        +    Select2 will automatically apply decorators to any adapters which have not
        +    been manually overridden. The only time you need to decorate adapters is
        +    when you are using third-party adapters not provided by Select2, or you
        +    are using features not provided in the Select2 core. You can apply a
        +    decorator to an adapter using the
        +    <code title="select2/utils">Utils.Decorate</code> method provided with
        +    Select2.
        +  </p>
        +
        +<pre class="prettyprint linenums">
        +$.fn.select2.amd.require(
        +    ["select2/utils", "select2/selection/single", "select2/selection/placeholder"],
        +    function (Utils, SingleSelection, Placeholder) {
        +  var CustomSelectionAdapter = Utils.Decorate(SingleSelection, Placeholder);
        +});
        +</pre>
        +
        +  <p>
        +    All core options that use decorators or adapters will clearly state it
        +    in the "Decorator" or "Adapter" part of the documentation. Decorators are
        +    typically only compatible with a specific type of adapter, so make sure to
        +    note what adapter is given.
        +  </p>
        +
        +  <h2 id="data-attributes">
        +    Declaring configuration in the <code>data-*</code> attributes
        +  </h2>
        +
        +  <p>
        +    It is recommended that you declare your configuration options for Select2
        +    when initializing Select2. You can also define your configuration options
        +    by using the HTML5 <code>data-*</code> attributes, which will override
        +    any options set when initializing Select2 and any defaults.
        +  </p>
        +
        +  <p>
        +    This means that if you declare your <code>&lt;select&gt;</code> tag as...
        +  </p>
        +
        +<pre class="prettyprint">
        +&lt;select data-tags="true" data-placeholder="Select an option"&gt;&lt;/select&gt;
        +</pre>
        +
        +  <p>
        +    Will be interpreted the same as initializing Select2 as...
        +  </p>
        +
        +<pre class="prettyprint linenums">
        +$("select").select2({
        +  tags: "true",
        +  placeholder: "Select an option"
        +});
        +</pre>
        +
        +  <p>
        +    You can also define nested configurations, which are typically needed for
        +    options such as AJAX. Each level of nesting should be separated by two
        +    dashes (<code>--</code>) instead of one. Due to
        +    <a href="https://github.com/jquery/jquery/issues/2070">a jQuery bug</a>,
        +    nested options using <code>data-*</code> attributes
        +    <a href="https://github.com/select2/select2/issues/2969">do not work in jQuery 1.x</a>.
        +  </p>
        +
        +<pre class="prettyprint">
        +&lt;select data-ajax--url="http://example.org/api/test" data-ajax--cache="true"&gt;&lt;/select&gt;
        +</pre>
        +
        +  <p>
        +    Which will be interpreted the same as initializing Select2 with...
        +  </p>
        +
        +<pre class="prettyprint linenums">
        +$("select").select2({
        +  ajax: {
        +    url: "http://example.org/api/test",
        +    cache: "true"
        +  }
        +});
        +</pre>
        +
        +  <p>
        +    The value of the option is subject to jQuery's
        +    <a href="https://api.jquery.com/data/#data-html5">parsing rules</a> for
        +    HTML5 data attributes.
        +  </p>
        +
        +  <h2 id="amd">
        +    AMD compatibility
        +  </h2>
        +
        +  <p>
        +    You can find more information on how to integrate Select2 with your
        +    existing AMD-based project by
        +    <a href="announcements-4.0.html#builds">viewing the 4.0 release notes</a>.
        +    Select2 automatically loads some modules when the adapters are being
        +    automatically constructed, so those who are using Select2 with a custom
        +    AMD build using their own system may need to specify the paths that are
        +    generated to the Select2 modules.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>amdBase</code>
        +        </dd>
        +
        +        <dt>Default</dt>
        +        <dd>
        +          <code>select2/</code>
        +        </dd>
        +      </dl>
        +    </div>
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>amdLanguageBase</code>
        +        </dd>
        +
        +        <dt>Default</dt>
        +        <dd>
        +          <code>select2/i18n/</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <h2 id="core-options-display">
        +    Displaying selections
        +  </h2>
        +
        +  <p>
        +    Select2 provides options that allow you to directly affect how the
        +    container that holds the current selection is displayed.
        +  </p>
        +
        +  <h3 id="placeholder">
        +    Placeholders
        +  </h3>
        +
        +  <p>
        +    Select2 can display a placeholder for a single-value select that will
        +    replace an option, or be shown when no options are selected for
        +    multiple-value selects. You can find an example on the
        +    <a href="examples.html#placeholders">example page</a>.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>placeholder</code>
        +        </dd>
        +
        +        <dt>Value</dt>
        +        <dd>string or object</dd>
        +      </dl>
        +
        +      <hr />
        +
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/selection/base">SelectionAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/selection/placeholder">Placeholder</code>
        +          and
        +          <code title="select2/dropdown/hidePlaceholder">HidePlaceholder</code>
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <div class="alert alert-warning">
        +        <strong>Heads up!</strong>
        +        Because browsers assume that the first <code>option</code> in
        +        single-value select boxes is selected, you should add an empty
        +        <code>&lt;option&gt;&lt;/option&gt;</code> tag that the placeholder
        +        should use or it may not work.
        +      </div>
        +    </div>
        +  </div>
        +
        +  <p>
        +    If the <strong>value is a string</strong>, the placeholder will be
        +    displayed when a <strong>blank option</strong> is used as the placeholder.
        +    The <strong>value</strong> will be the message to show to users as the
        +    placeholders.
        +  </p>
        +
        +<pre class="prettyprint">
        +placeholder: "Select a repository"
        +</pre>
        +
        +      <p>
        +        If the <strong>value is an object</strong>, the object should be
        +        compatible with Select2's internal objects. The <code>id</code> should
        +        be the id to look for when determining if the placeholder should be
        +        displayed. The <code>text</code> should be the placeholder to display
        +        when that option is selected.
        +      </p>
        +
        +<pre class="prettyprint linenums">
        +placeholder: {
        +  id: "-1",
        +  text: "Select a repository"
        +}
        +</pre>
        +
        +  <div class="alert alert-info">
        +    You should <strong>pass in an object</strong> when you are using a
        +    framework that <strong>creates its own placeholder option</strong>. The
        +    <strong>id</strong> should be the same as the <code>value</code>
        +    attribute on the <code>option</code>.
        +  </div>
        +
        +  <p id="allowClear">
        +    You can allow a selected option to be cleared back to the placeholder by
        +    enabling the <code>allowClear</code> option.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>allowClear</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>boolean</dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/selection/base">SelectionAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/selection/allowClear">AllowClear</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <p>
        +    This will display an "x" that the user can click to clear the current
        +    selection. It is designed to be used for cases where a single selection
        +    can be made.
        +  </p>
        +
        +  <h3 id="multiple">
        +    Multiple selections
        +  </h3>
        +
        +  <p>
        +    Select2 can display either a single selection or multiple selections.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd><code>multiple</code></dd>
        +
        +    <dt>Value</dt>
        +    <dd>boolean (<code>true</code> or <code>false</code>)</dd>
        +  </dl>
        +
        +  <p>
        +    This option will determine what the <code>SelectAdapter</code> (used by
        +    default) should use to set the value of the underlying <code>select</code>
        +    element. It will also determine if the <code>MultipleSelection</code>
        +    adapter should be used.
        +  </p>
        +
        +  <h3 id="width">
        +    Container width
        +  </h3>
        +
        +  <p>
        +    Select2 will try to match the width of the original element as closely as
        +    possible. Sometimes this isn't perfect, which is what you can tell Select2
        +    how to determine the width.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <table class="table table-striped table-bordered">
        +        <thead>
        +          <tr>
        +            <th>Value</th>
        +            <th>Description</th>
        +          </tr>
        +        </thead>
        +        <tbody>
        +          <tr>
        +            <td><code>"element"</code></td>
        +            <td>
        +              Uses javascript to calculate the width of the source element.
        +            </td>
        +          </tr>
        +          <tr>
        +            <td><code>"style"</code></td>
        +            <td>
        +              Copies the value of the width <code>style</code> attribute set on the source element.
        +            </td>
        +          </tr>
        +          <tr>
        +            <td><code>"resolve"</code></td>
        +            <td>
        +              Tries to use <code>style</code> to determine the width, falling back to <code>element</code>.
        +            </td>
        +          </tr>
        +          <tr>
        +            <td>Anything else</td>
        +            <td>
        +              The value of the <code>width</code> option is directly set as the width of the container.
        +            </td>
        +          </tr>
        +        </tbody>
        +      </table>
        +    </div>
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>width</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>string</dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <h3 id="language">
        +    Internationalization (Language support)
        +  </h3>
        +
        +  <p>
        +    Messages will be displayed to users when necessary, such as when no
        +    search results were found or more characters need to be entered in order
        +    for a search to be made. These messages have been
        +    <a href="community.html#translations">translated into many languages</a>
        +    by contributors to Select2, but you can also provide your own
        +    translations.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>language</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>object or string</dd>
        +      </dl>
        +
        +      <hr />
        +
        +      <dl class="dl-horizontal">
        +        <dt>Module</dt>
        +        <dd>
        +          <code title="select2/translation">Translation</code>
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <p class="alert alert-warning">
        +        <strong>Heads up!</strong> When using translations provided by Select2,
        +        you must make sure to include the translation file in your page after
        +        Select2.
        +      </p>
        +    </div>
        +  </div>
        +
        +  <p>
        +    When a string is passed in as the language, Select2 will try to resolve
        +    it into a language file. This allows you to specify your own language
        +    files, which must be defined as an AMD module. If the language file
        +    cannot be found, Select2 will assume it is a language code controlled by
        +    Select2, and it will try to load the translations for that language
        +    instead.
        +  </p>
        +
        +  <p>
        +    You can include your own translations by providing an object similar to
        +    the one below.
        +  </p>
        +
        +<pre class="prettyprint linenums">
        +language: {
        +  // You can find all of the options in the language files provided in the
        +  // build. They all must be functions that return the string that should be
        +  // displayed.
        +  inputTooShort: function () {
        +    return "You must enter more characters...";
        +  }
        +}
        +</pre>
        +
        +  <h3 id="templating">
        +    Templating results and selections
        +  </h3>
        +
        +  <p>
        +    By default, Select2 will display the option text within the list of
        +    results and when the option has been selected.  Select2 comes with options
        +    that allow you to further customize the display of results and selections,
        +    allowing you to display them however you want.
        +  </p>
        +
        +  <h4 id="templateSelection">
        +    Customizing the display of selections
        +  </h4>
        +
        +  <p>
        +    When an option is displayed after it has been selected, it is passed
        +    through a formatting function that determines what is displayed. By
        +    default, the function only returns the <code>text</code> key of the data
        +    object.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd><code>templateSelection</code></dd>
        +
        +    <dt>Value</dt>
        +    <dd>A function taking a <code>selection</code> object</dd>
        +  </dl>
        +
        +  <div class="alert alert-info">
        +    <strong>Anything rendered as a selection is templated.</strong>
        +    This includes placeholders and pre-existing selections that are displayed,
        +    so you must ensure that your templating functions can support them.
        +  </div>
        +
        +  <p>
        +    The <code>templateSelection</code> function should return a string
        +    containing the text to be displayed, or an object (such as a jQuery
        +    object) that contains the data that should be displayed.
        +  </p>
        +
        +  <p>
        +    <strong>Strings are assumed to contain only text</strong> and will be
        +    passed through the <code>escapeMarkup</code> function, which strips any
        +    HTML markup.
        +  </p>
        +
        +  <p>
        +    <strong>
        +      Anything else will be passed
        +      <a href="https://api.jquery.com/append/">directly to <code>jQuery.fn.append</code></a>
        +    </strong> and will be handled directly by jQuery.  Any markup, such as
        +    HTML, returned will not be escaped and it is up to you to escape any
        +    malicious input provided by users.
        +  </p>
        +
        +  <h4 id="templateResult">
        +    Customizing the display of results
        +  </h4>
        +
        +  <p>
        +    When an option is displayed after it has been selected, it is passed
        +    through a formatting function that determines what is displayed. By
        +    default, the function only returns the <code>text</code> key of the data
        +    object.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd><code>templateResult</code></dd>
        +
        +    <dt>Value</dt>
        +    <dd>A function taking a <code>result</code> object</dd>
        +  </dl>
        +
        +  <div class="alert alert-info">
        +    <strong>Anything rendered in the results is templated.</strong>
        +    This includes results such as the "Searching..." and "Loading more..."
        +    text which will periodically be displayed, which allows you to add more
        +    advanced formatting to these automatically generated options.
        +  </div>
        +
        +  <p>
        +    The <code>templateResult</code> function should return a string
        +    containing the text to be displayed, or an object (such as a jQuery
        +    object) that contains the data that should be displayed.  It can also
        +    return <code>null</code>, which will prevent the option from being
        +    displayed in the results list.
        +  </p>
        +
        +  <p>
        +    <strong>Strings are assumed to contain only text</strong> and will be
        +    passed through the <code>escapeMarkup</code> function, which strips any
        +    HTML markup.
        +  </p>
        +
        +  <p>
        +    <strong>
        +      Anything else will be passed
        +      <a href="https://api.jquery.com/append/">directly to <code>jQuery.fn.append</code></a>
        +    </strong> and will be handled directly by jQuery.  Any markup, such as
        +    HTML, returned will not be escaped and it is up to you to escape any
        +    malicious input provided by users.
        +  </p>
        +
        +  <h2 id="core-options-results">
        +    Returning and displaying results
        +  </h2>
        +
        +  <p>
        +    Select2 can work on many different data sets ranging from local options,
        +    the same way that a <code>&lt;select&gt;</code> typically works, from
        +    remote options where a server generates the results that users can select
        +    from.
        +  </p>
        +
        +  <h3 id="data">
        +    Array
        +  </h3>
        +
        +  <p>
        +    Select2 allows creating the results based on an array of data objects that
        +    is included when initializing Select2.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>data</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>array of objects</dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/array">ArrayAdapter</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <p>
        +    The objects that the users can select from should be passed as an array
        +    with each object containing <code>id</code> and <code>text</code>
        +    properties.
        +  </p>
        +
        +  <h3 id="ajax">
        +    AJAX
        +  </h3>
        +
        +  <p>
        +    Select2 allows searching for results from remote data sources using AJAX
        +    requests.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>ajax</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>object</dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/ajax">AjaxAdapter</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <p>
        +    All options passed to this option will be directly passed to the
        +    <code>$.ajax</code> function that executes AJAX requests. There are a few
        +    custom options that Select2 will intercept, allowing you to customize the
        +    request as it is being made.
        +
        +<pre class="prettyprint linenums">
        +ajax: {
        +  // The number of milliseconds to wait for the user to stop typing before
        +  // issuing the ajax request.
        +  delay: 250,
        +  // You can craft a custom url based on the parameters that are passed into the
        +  // request. This is useful if you are using a framework which has
        +  // JavaScript-based functions for generating the urls to make requests to.
        +  //
        +  // @param params The object containing the parameters used to generate the
        +  //   request.
        +  // @returns The url that the request should be made to.
        +  url: function (params) {
        +    return UrlGenerator.Random();
        +  },
        +  // You can pass custom data into the request based on the parameters used to
        +  // make the request. For `GET` requests, the default method, these are the
        +  // query parameters that are appended to the url. For `POST` requests, this
        +  // is the form data that will be passed into the request. For other requests,
        +  // the data returned from here should be customized based on what jQuery and
        +  // your server are expecting.
        +  //
        +  // @param params The object containing the parameters used to generate the
        +  //   request.
        +  // @returns Data to be directly passed into the request.
        +  data: function (params) {
        +    var queryParameters = {
        +      q: params.term
        +    }
        +
        +    return queryParameters;
        +  },
        +  // You can modify the results that are returned from the server, allowing you
        +  // to make last-minute changes to the data, or find the correct part of the
        +  // response to pass to Select2. Keep in mind that results should be passed as
        +  // an array of objects.
        +  //
        +  // @param data The data as it is returned directly by jQuery.
        +  // @returns An object containing the results data as well as any required
        +  //   metadata that is used by plugins. The object should contain an array of
        +  //   data objects as the `results` key.
        +  processResults: function (data) {
        +    return {
        +      results: data
        +    };
        +  },
        +  // You can use a custom AJAX transport function if you do not want to use the
        +  // default one provided by jQuery.
        +  //
        +  // @param params The object containing the parameters used to generate the
        +  //   request.
        +  // @param success A callback function that takes `data`, the results from the
        +  //   request.
        +  // @param failure A callback function that indicates that the request could
        +  //   not be completed.
        +  // @returns An object that has an `abort` function that can be called to abort
        +  //   the request if needed.
        +  transport: function (params, success, failure) {
        +    var $request = $.ajax(params);
        +
        +    $request.then(success);
        +    $request.fail(failure);
        +
        +    return $request;
        +  }
        +}
        +</pre>
        +  </p>
        +
        +  <h3 id="tags">
        +    Tags
        +  </h3>
        +
        +  <p>
        +    Users can create their own options based on the text that they have
        +    entered.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>tags</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>boolean / array of objects</dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/base">DataAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/data/tags">Tags</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <p>
        +    If the <code>tags</code> option is passed into Select2, if a user types
        +    anything into the search box which doesn't already exist, it will be
        +    displayed at the top and the user will be able to select it.
        +  </p>
        +
        +  <p>
        +    <strong>For backwards compatibility</strong>, if an array of objects is
        +    passed in with the <code>tags</code> option, the options will be
        +    automatically created and the user will be able to select from them.
        +    This is the <strong>same as how <a href="#data">array data</a>
        +    works</strong>, and has similar limitations.
        +  </p>
        +
        +  <h3 id="matcher">
        +    Change how options are matched when searching
        +  </h3>
        +
        +  <p>
        +    When users filter down the results by entering search terms into the
        +    search box, Select2 uses an internal "matcher" to match search terms to
        +    results. <strong>When a remote data set is used, Select2 expects that the
        +    returned results have already been filtered.</strong>
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Key</dt>
        +    <dd>
        +      <code>matcher</code>
        +    </dd>
        +
        +    <dt>Value</dt>
        +    <dd>
        +      A function taking search <code>params</code> and the
        +      <code>data</code> object.
        +    </dd>
        +  </dl>
        +
        +  <p>
        +    Select2 will pass the individual data objects that have been passed back
        +    from the data adapter into the <code>matcher</code> individually to
        +    determine if they should be displayed. Only the first-level objects will
        +    be passed in, so <strong>if you are working with nested data, you need to
        +    match those individually</strong>.
        +  </p>
        +
        +<pre class="prettyprint linenums">
        +matcher: function (params, data) {
        +  // If there are no search terms, return all of the data
        +  if ($.trim(params.term) === '') {
        +    return data;
        +  }
        +
        +  // `params.term` should be the term that is used for searching
        +  // `data.text` is the text that is displayed for the data object
        +  if (data.text.indexOf(params.term) > -1) {
        +    var modifiedData = $.extend({}, data, true);
        +    modifiedData.text += ' (matched)';
        +
        +    // You can return modified objects from here
        +    // This includes matching the `children` how you want in nested data sets
        +    return modifiedData;
        +  }
        +
        +  // Return `null` if the term should not be displayed
        +  return null;
        +}
        +</pre>
        +
        +  <p>
        +    This allows for more advanced matching when working with nested objects,
        +    allowing you to handle them however you want. For those who are not
        +    looking to implement highly customized matching, but instead are just
        +    looking to change the matching algorithm for the text, a
        +    <a href="#compat-matcher">compatibility modules</a> has been created to
        +    make it easier.
        +  </p>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options-old/dropdown.html b/bower_components/select2/docs/_includes/options-old/dropdown.html
        new file mode 100644
        index 0000000000..87629077dd
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options-old/dropdown.html
        @@ -0,0 +1,308 @@
        +<section>
        +  <div class="page-header">
        +    <h1 id="dropdown">Dropdown</h1>
        +  </div>
        +
        +  <p>
        +    Select2 allows you to change the way that the dropdown works, allowing you
        +    to do anything from attach it to a different location in the document or
        +    add a search box.
        +  </p>
        +
        +  <h2 id="dropdownParent">
        +    Attached to body
        +  </h2>
        +
        +  <p>
        +    By default, Select2 will attach the dropdown to the end of the body and
        +    will absolutely position it to appear below the selection container.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>dropdownParent</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>jQuery element or DOM node</dd>
        +
        +        <hr />
        +
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/dropdown">DropdownAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/dropdown/attachBody">AttachBody</code>
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <div class="alert alert-warning">
        +        <strong>Heads up!</strong>
        +        This will cause DOM events to be raised outside of the standard
        +        Select2 DOM container. This can cause issues with
        +        third-party components such as modals.
        +      </div>
        +    </div>
        +  </div>
        +
        +  <p>
        +    When the dropdown is attached to the body, you are not limited to just
        +    displaying the dropdown below the container. Select2 will display above
        +    the container if there is not enough space below the container, but there
        +    is enough space above it. You are also not limited to displaying the
        +    dropdown within the parent container, which means Select2 will render
        +    correctly inside of modals and other small containers.
        +  </p>
        +
        +  <h2 id="dropdown-attachContainer">
        +    Attached below the container
        +  </h2>
        +
        +  <p>
        +    Select2 can place the dropdown directly after the selection container, so
        +    it will appear in the same location within the DOM as the rest of Select2.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/dropdown">DropdownAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/dropdown/attachContainer">AttachContainer</code>
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <div class="alert alert-warning">
        +        <strong>Check your build.</strong> This module is only included in the
        +        <a href="index.html#builds-full" class="alert-link">full builds</a> of
        +        Select2.
        +      </div>
        +    </div>
        +  </div>
        +
        +  <div class="alert alert-info">
        +    <strong>
        +      <a href="https://harvesthq.github.io/chosen/">Harvest Chosen</a>
        +      migrators!
        +    </strong>
        +    If you are migrating to Select2 from Chosen, this option will cause
        +    Select2 to position the dropdown in a similar way.
        +  </div>
        +
        +  <h2 id="dropdown-search">
        +    Search
        +  </h2>
        +
        +  <p>
        +    Users can filter down the results by typing a search term into a box that
        +    is displayed at the top of the dropdown.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Adapter</dt>
        +    <dd>
        +      <code title="select2/dropdown">DropdownAdapter</code>
        +    </dd>
        +
        +    <dt>Decorator</dt>
        +    <dd>
        +      <code title="select2/dropdown/search">DropdownSearch</code>
        +    </dd>
        +  </dl>
        +
        +  <p>
        +    A search box is added to the top of the dropdown automatically for select
        +    boxes where only a single option can be selected.
        +  </p>
        +
        +  <h3 id="dropdown-minimumInputLength">
        +    Minimum search term length to filter results
        +  </h3>
        +
        +  <p>
        +    Sometimes when working with large data sets, it is more efficient to start
        +    filtering the results when the search term is a certain length. This is
        +    very common when working with remote data sets, as allows for only
        +    significant search terms to be used.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>minimumInputLength</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>integer</dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/base">DataAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/data/minimumInputLength">MinimumInputLength</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <h3 id="dropdown-maximumInputLength">
        +    Maximum search term length to filter results
        +  </h3>
        +
        +  <p>
        +    In some cases, search terms need to be limited to a certain range. Select2
        +    allows you to limit the length of the search term such that it does not
        +    exceed a certain length.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>maximumInputLength</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>integer</dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/base">DataAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/data/maximumInputLength">MaximumInputLength</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <h3 id="dropdown-maximumInputLength">
        +    Minimum results to display the search box
        +  </h3>
        +
        +  <p>
        +    When working with smaller data sets, the search box can take up more space
        +    that is necessary, as there are not enough results for filtering to be
        +    effective. Select2 allows you to only display the search box when the
        +    number of search results reaches a certain threshold.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>minimumResultsForSearch</code></dd>
        +
        +        <dt>Value</dt>
        +        <dd>integer</dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/dropdown">DropdownAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/dropdown/minimumResultsForSearch">MinimumResultsForSearch</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <h2 id="dropdown-select-on-close">
        +    Select the highlighted option on close
        +  </h2>
        +
        +  <p>
        +    When users close the dropdown, the last highlighted option can be
        +    automatically selected. This is commonly used in combination with
        +    <a href="#tags">tagging</a> and <a href="#placeholder">placeholders</a>
        +    and other situations where the user is required to select an option, or
        +    they need to be able to quickly select multiple options.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Adapter</dt>
        +    <dd>
        +      <code title="select2/results">ResultsAdapter</code>
        +    </dd>
        +
        +    <dt>Decorator</dt>
        +    <dd>
        +      <code title="select2/dropdown/selectOnClose">SelectOnClose</code>
        +    </dd>
        +  </dl>
        +
        +  <h2 id="closeOnSelect">
        +    Close the dropdown when a result is selected
        +  </h2>
        +
        +  <p>
        +    Select2 will automatically close the dropdown when an element is selected,
        +    similar to what is done with a normal select box.  This behavior can be
        +    changed though to keep the dropdown open when results are selected,
        +    allowing for multiple options to be selected quickly.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd><code>closeOnSelect</code></dd>
        +
        +        <dt>Default</dt>
        +        <dd><code>true</code></dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/dropdown">DropdownAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/dropdown/closeOnSelect">CloseOnSelect</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <p>
        +    If this decorator is not used (or <code>closeOnSelect</code> is set to
        +    <code>false</code>), the dropdown will not automatically close when a
        +    result is selected.  The dropdown will also never close if the
        +    <kbd>ctrl</kbd> key is held down when the result is selected.
        +  </p>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options-old/events.html b/bower_components/select2/docs/_includes/options-old/events.html
        new file mode 100644
        index 0000000000..bf4f39a942
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options-old/events.html
        @@ -0,0 +1,50 @@
        +<section>
        +  <div id="events" class="page-header">
        +    <h1>Events</h1>
        +  </div>
        +
        +  <p>
        +    Select2 has an internal event system that is used to notify parts of the
        +    component that state has changed, as well as an adapter that allows some
        +    of these events to be relayed to the outside word.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Adapter</dt>
        +    <dd>
        +      <code title="select2/selection">SelectionAdapter</code>
        +    </dd>
        +
        +    <dt>Decorator</dt>
        +    <dd>
        +      <code title="select2/selection/eventRelay">EventRelay</code>
        +    </dd>
        +  </dl>
        +
        +  <h2 id="events-public">
        +    Public events
        +  </h2>
        +
        +  <p>
        +    All public events are relayed using the jQuery event system, and they are
        +    triggered on the <code>&lt;select&gt;</code> element that Select2 is
        +    attached to. You can attach to them using the
        +    <a href="https://api.jquery.com/on/"><code>.on</code> method</a> provided
        +    by jQuery.
        +  </p>
        +
        +  <h2 id="events-internal">
        +    Internal events
        +  </h2>
        +
        +  <p>
        +    Select2 triggers internal events using its own internal event system,
        +    which allows adapters to communicate with each other. These events are not
        +    accessible through the jQuery event system.
        +  </p>
        +
        +  <p>
        +    You can find more information on the public events triggered by individual
        +    adapters in <a href="#adapters">the individual adapter documentation</a>.
        +  </p>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options-old/setting-default-options.html b/bower_components/select2/docs/_includes/options-old/setting-default-options.html
        new file mode 100644
        index 0000000000..f2c74f6096
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options-old/setting-default-options.html
        @@ -0,0 +1,37 @@
        +<section>
        +  <h1 id="setting-default-options">Setting default options</h1>
        +
        +  <p>
        +    In some cases, you need to set the default options for all instances of
        +    Select2 in your web application. This is especially useful when you are
        +    migrating from past versions of Select2, or you are using non-standard
        +    options <a href="#amd">like custom AMD builds</a>. Select2 exposes the
        +    default options through <code>$.fn.select2.defaults</code>, which allows
        +    you to set them globally.
        +  </p>
        +
        +  <p>
        +    When setting options globally, any past defaults that have been set will
        +    be overriden. Default options are only used when an option is requested
        +    that has not been set during initialization.
        +  </p>
        +
        +  <p>
        +    <strong>You can set default options</strong> by calling
        +    <code>$.fn.select2.defaults.set("key", "value")</code>. The key that is
        +    set should take the same format as keys set using
        +    <a href="#data-attributes">HTML <code>data-*</code> attributes</a> which
        +    means that two dashes (<code>--</code>) will be replaced by a level of
        +    nesting, and a single dash (<code>-</code>) will convert it to a camelCase
        +    string.
        +  </p>
        +
        +<pre class="prettyprint">
        +$.fn.select2.defaults.set("theme", "classic");
        +</pre>
        +
        +  <p>
        +    <strong>You can reset the default options</strong> by calling
        +    <code>$.fn.select2.defaults.reset()</code>.
        +  </p>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options/compatibility.html b/bower_components/select2/docs/_includes/options/compatibility.html
        new file mode 100644
        index 0000000000..a7f6197e28
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/compatibility.html
        @@ -0,0 +1,10 @@
        +<section>
        +  <h1>
        +    Backwards compatibility
        +  </h1>
        +
        +  {% include options/compatibility/matcher.html %}
        +  {% include options/compatibility/initial-selection.html %}
        +  {% include options/compatibility/query-function.html %}
        +  {% include options/compatibility/text-input.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/compatibility/initial-selection.html b/bower_components/select2/docs/_includes/options/compatibility/initial-selection.html
        new file mode 100644
        index 0000000000..62fd09335a
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/compatibility/initial-selection.html
        @@ -0,0 +1,50 @@
        +<section>
        +  <h2 id="initSelection">
        +    Old initial selections with <code>initSelection</code>
        +  </h2>
        +
        +  <p class="alert alert-warning">
        +    <a href="announcements-4.0.html#removed-initselection" class="alert-link">Deprecated in Select2 4.0.</a>
        +    This has been replaced by another option and is only available in the
        +    <a href="index.html#builds-full" class="alert-link">full builds</a> of
        +    Select2.
        +  </p>
        +
        +  <p>
        +    In the past, Select2 required an option called <code>initSelection</code>
        +    that was defined whenever a custom data source was being used, allowing
        +    for the initial selection for the component to be determined. This has
        +    been replaced by the <code>current</code> method on the
        +    <a href="#dataAdapter">data adapter</a>.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>initSelection</code>
        +        </dd>
        +
        +        <dt>Value</dt>
        +        <dd>
        +          A function taking a <code>callback</code>
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/base">DataAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/compat/initSelection">InitSelection</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/compatibility/introduction.html b/bower_components/select2/docs/_includes/options/compatibility/introduction.html
        new file mode 100644
        index 0000000000..0e82aabe14
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/compatibility/introduction.html
        @@ -0,0 +1,18 @@
        +<section>
        +  <p>
        +    Select2 offers limited backwards compatibility with the previously 3.5.x
        +    release line, allowing people more efficiently transfer across releases
        +    and get the latest features. For many of the larger changes, such as the
        +    change in how custom data adapters work, compatibility modules were
        +    created that will be used to assist in the upgrade process. It is not
        +    recommended to rely on these compatibility modules, as they will not
        +    always exist, but they make upgrading easier for major changes.
        +  </p>
        +
        +  <p>
        +    <strong>The compatibility modules are only included in the
        +    <a href="index.html#builds-full" class="alert-link">full builds</a> of
        +    Select2</strong>. These files end in <code>.full.js</code>, and the
        +    compatibility modules are prefixed with <code>select2/compat</code>.
        +  </p>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/compatibility/matcher.html b/bower_components/select2/docs/_includes/options/compatibility/matcher.html
        new file mode 100644
        index 0000000000..150f72c192
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/compatibility/matcher.html
        @@ -0,0 +1,50 @@
        +<section>
        +  <h2 id="compat-matcher">
        +    Simplified function for matching data objects
        +  </h2>
        +
        +  <p class="alert alert-info">
        +    <a href="announcements-4.0.html#new-matcher" class="alert-link">Added in Select2 4.0.0.</a>
        +    This method was added to make upgrading easier from earlier versions of
        +    Select2.
        +  </p>
        +
        +  <p>
        +    During the <a href="announcements-4.0.html">Select2 4.0.0 release</a>, the
        +    <code>matcher</code> function was changed to allow for more complex
        +    matching of nested objects.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>matcher</code>
        +        </dd>
        +
        +        <dt>Value</dt>
        +        <dd>
        +          A function taking a search <code>term</code> and the data object
        +          <code>text</code>.
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/compat/matcher">oldMatcher</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +
        +  <p>
        +    The <a href="examples.html#matcher">custom matcher example</a> provides a
        +    guide for how to use this in your own application. For those upgrading
        +    from older versions of Select2, you just need to wrap your old
        +    <code>matcher</code> with this function to maintain compatibility.
        +  </p>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/compatibility/query-function.html b/bower_components/select2/docs/_includes/options/compatibility/query-function.html
        new file mode 100644
        index 0000000000..f5f557ded3
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/compatibility/query-function.html
        @@ -0,0 +1,50 @@
        +<section>
        +  <h2 id="query">
        +    Querying old data with <code>query</code>
        +  </h2>
        +
        +  <p class="alert alert-warning">
        +    <a href="announcements-4.0.html#query-to-data-adapter" class="alert-link">Deprecated in Select2 4.0.</a>
        +    This has been replaced by another option and is only available in the
        +    <a href="index.html#builds-full" class="alert-link">full builds</a> of
        +    Select2.
        +  </p>
        +
        +  <p>
        +    In the past, Select2 supported an option called <code>query</code> that
        +    allowed for a custom data source to be used. This option has been replaced
        +    by the <code>query</code> method on the
        +    <a href="#dataAdapter">data adapter</a> and takes a very similar set of
        +    parameters.
        +  </p>
        +
        +  <div class="row">
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Key</dt>
        +        <dd>
        +          <code>query</code>
        +        </dd>
        +
        +        <dt>Value</dt>
        +        <dd>
        +          A function taking <code>params</code> (including a <code>callback</code>)
        +        </dd>
        +      </dl>
        +    </div>
        +
        +    <div class="col-sm-6">
        +      <dl class="dl-horizontal">
        +        <dt>Adapter</dt>
        +        <dd>
        +          <code title="select2/data/base">DataAdapter</code>
        +        </dd>
        +
        +        <dt>Decorator</dt>
        +        <dd>
        +          <code title="select2/compat/query">Query</code>
        +        </dd>
        +      </dl>
        +    </div>
        +  </div>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/compatibility/text-input.html b/bower_components/select2/docs/_includes/options/compatibility/text-input.html
        new file mode 100644
        index 0000000000..4cea8c86c1
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/compatibility/text-input.html
        @@ -0,0 +1,32 @@
        +<section>
        +  <h2 id="input-fallback">
        +    Compatibility with <code>&lt;input type="text" /&gt;</code>
        +  </h2>
        +
        +  <p class="alert alert-warning">
        +    <a href="announcements-4.0.html#hidden-input" class="alert-link">Deprecated in Select2 4.0.</a>
        +    It is now encouraged to use the <code>&lt;select&gt;</code> tag instead.
        +  </p>
        +
        +  <p>
        +    In past versions of Select2, a <code>&lt;select&gt;</code> element could
        +    only be used with a limited subset of options. An
        +    <code>&lt;input type="hidden" /&gt;</code> was required instead, which did
        +    not allow for a graceful fallback for users who did not have JavaScript
        +    enabled. Select2 now supports the <code>&lt;select&gt;</code> element for
        +    all options, so it is no longer required to use <code>&lt;input /&gt;</code>
        +    elements with Select2.
        +  </p>
        +
        +  <dl class="dl-horizontal">
        +    <dt>Adapter</dt>
        +    <dd>
        +      <code title="select2/data/base">DataAdapter</code>
        +    </dd>
        +
        +    <dt>Decorator</dt>
        +    <dd>
        +      <code title="select2/compat/inputData">InputData</code>
        +    </dd>
        +  </dl>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/core.html b/bower_components/select2/docs/_includes/options/core.html
        new file mode 100644
        index 0000000000..df834804f6
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/core.html
        @@ -0,0 +1,9 @@
        +<section>
        +  <h1>
        +    Core options
        +  </h1>
        +
        +  {% include options/core/options.html %}
        +  {% include options/core/data-attributes.html %}
        +  {% include options/core/amd-support.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/core/amd-support.html b/bower_components/select2/docs/_includes/options/core/amd-support.html
        new file mode 100644
        index 0000000000..2cb6b30766
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/core/amd-support.html
        @@ -0,0 +1,46 @@
        +<section>
        +  <h2 id="amd">
        +    Can I use Select2 with my AMD or CommonJS loader?
        +  </h2>
        +
        +  <p>
        +    Select2 should work with most AMD- or CommonJS-compliant module loaders, including <a href="http://requirejs.org/">RequireJS</a> and <a href="https://github.com/jrburke/almond">almond</a>. Select2 ships with a modified version of the <a href="https://github.com/umdjs/umd/blob/f208d385768ed30cd0025d5415997075345cd1c0/templates/jqueryPlugin.js">UMD jQuery template</a> that supports both CommonJS and AMD environments.
        +  </p>
        +
        +  <h3>
        +    How do I tell Select2 where to look for modules?
        +  </h3>
        +
        +  <p>
        +    For most AMD and CommonJS setups, the location of the data files used by Select2 will be automatically determined and handled without you needing to do anything.
        +  </p>
        +
        +  <p>
        +    If you are using Select2 in a build environment where preexisting module names are changed during a build step, Select2 may not be able to find optional dependencies or language files. You can manually set the prefixes to use for these files using the <code>amdBase</code> and <code>amdLanugageBase</code> options.
        +  </p>
        +
        +{% highlight js linenos %}
        +$.fn.select2.defaults.set('amdBase', 'select2/');
        +$.fn.select2.defaults.set('amdLanguageBase', 'select2/i18n/');
        +{% endhighlight %}
        +
        +  <h3>
        +    Select2 is being placed before jQuery in my JavaScript file
        +  </h3>
        +
        +  <p>
        +    Due to <a href="https://github.com/jrburke/requirejs/issues/1342">a bug in older versions</a> of the r.js build tool, Select2 was sometimes placed before jQuery in then compiled build file. Because of this, Select2 will trigger an error because it won't be able to find or load jQuery.
        +  </p>
        +
        +  <p>
        +    By upgrading to version 2.1.18 or higher of the r.js build tool, you will be able to fix the issue.
        +  </p>
        +
        +  <h3>
        +    Should I point to the files in <code>dist</code> or <code>src</code>?
        +  </h3>
        +
        +  <p>
        +    Select2 internally uses AMD and the r.js build tool to build the files located in the <code>dist</code> folder. These are built using the files in the <code>src</code> folder, so <em>you can</em> just point your modules to the Select2 source and load in <code>jquery.select2</code> or <code>select2/core</code> when you want to use Select2. The files located in the <code>dist</code> folder are also AMD-compatible, so you can point to that file if you want to load in all of the default Select2 modules.
        +  </p>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/core/data-attributes.html b/bower_components/select2/docs/_includes/options/core/data-attributes.html
        new file mode 100644
        index 0000000000..db6078d9e7
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/core/data-attributes.html
        @@ -0,0 +1,76 @@
        +<section>
        +  <h2 id="data-attributes">
        +    Can I declare my configuration within the HTML?
        +  </h2>
        +
        +  <p>
        +    It is recommended that you declare your configuration options for Select2
        +    when initializing Select2. You can also define your configuration options
        +    by using the HTML5 <code>data-*</code> attributes, which will override
        +    any options set when initializing Select2 and any defaults.
        +  </p>
        +
        +  <h3>
        +    How should <code>camelCase</code> options be written?
        +  </h3>
        +
        +  <p>
        +    HTML data attributes are case-insensitive, so any options which contain capital letters will be parsed as if they were all lowercase. Because Select2 has many options which are camelCase, where words are separated by uppercase letters, you must write these options out with dashes instead. So an option that would normally be called <code>allowClear</code> should instead be defined as <code>allow-clear</code>.
        +  </p>
        +
        +  <p>
        +    This means that if you declare your <code>&lt;select&gt;</code> tag as...
        +  </p>
        +
        +{% highlight html linenos %}
        +<select data-tags="true" data-placeholder="Select an option" data-allow-clear="true"></select>
        +{% endhighlight %}
        +
        +  <p>
        +    Will be interpreted the same as initializing Select2 as...
        +  </p>
        +
        +{% highlight js linenos %}
        +$("select").select2({
        +  tags: "true",
        +  placeholder: "Select an option",
        +  allowClear: true
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    Are options with nested configurations supported?
        +  </h3>
        +
        +  <p>
        +    You can also define nested configurations, which are typically needed for
        +    options such as AJAX. Each level of nesting should be separated by two
        +    dashes (<code>--</code>) instead of one. Due to
        +    <a href="https://github.com/jquery/jquery/issues/2070">a jQuery bug</a>,
        +    nested options using <code>data-*</code> attributes
        +    <a href="https://github.com/select2/select2/issues/2969">do not work in jQuery 1.x</a>.
        +  </p>
        +
        +{% highlight html linenos %}
        +<select data-ajax--url="http://example.org/api/test" data-ajax--cache="true"></select>
        +{% endhighlight %}
        +
        +  <p>
        +    Which will be interpreted the same as initializing Select2 with...
        +  </p>
        +
        +{% highlight js linenos %}
        +$("select").select2({
        +  ajax: {
        +    url: "http://example.org/api/test",
        +    cache: true
        +  }
        +});
        +{% endhighlight %}
        +
        +  <p>
        +    The value of the option is subject to jQuery's
        +    <a href="https://api.jquery.com/data/#data-html5">parsing rules</a> for
        +    HTML5 data attributes.
        +  </p>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/core/options.html b/bower_components/select2/docs/_includes/options/core/options.html
        new file mode 100644
        index 0000000000..aaa2b1126e
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/core/options.html
        @@ -0,0 +1,80 @@
        +<section>
        +  <h2 id="options">
        +    How should Select2 be initialized?
        +  </h2>
        +
        +  <p>
        +    Select2 will register itself as a jQuery function if you use any of the distribution builds, so you can call <code>.select2()</code> on any jQuery element where you would like to initialize Select2.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2();
        +{% endhighlight %}
        +
        +  <p>
        +    You can optionally pass an object containing all of the options that you would like to initialize Select2 with.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  placeholder: 'Select an option'
        +});
        +{% endhighlight %}
        +
        +  <h3 id="setting-default-options">
        +    Can default options be set for all dropdowns?
        +  </h3>
        +
        +  <p>
        +    In some cases, you need to set the default options for all instances of
        +    Select2 in your web application. This is especially useful when you are
        +    migrating from past versions of Select2, or you are using non-standard
        +    options <a href="#amd">like custom AMD builds</a>. Select2 exposes the
        +    default options through <code>$.fn.select2.defaults</code>, which allows
        +    you to set them globally.
        +  </p>
        +
        +  <p>
        +    When setting options globally, any past defaults that have been set will
        +    be overriden. Default options are only used when an option is requested
        +    that has not been set during initialization.
        +  </p>
        +
        +  <p>
        +    <strong>You can set default options</strong> by calling
        +    <code>$.fn.select2.defaults.set("key", "value")</code>.
        +  </p>
        +
        +{% highlight js linenos %}
        +$.fn.select2.defaults.set("theme", "classic");
        +{% endhighlight %}
        +
        +  <h3>
        +    How can I set a default value for a nested option?
        +  </h3>
        +
        +  <p>
        +    The key that is
        +    set should take the same format as keys set using
        +    <a href="#data-attributes">HTML <code>data-*</code> attributes</a> which
        +    means that two dashes (<code>--</code>) will be replaced by a level of
        +    nesting, and a single dash (<code>-</code>) will convert it to a camelCase
        +    string.
        +  </p>
        +
        +{% highlight js linenos %}
        +$.fn.select2.defaults.set("ajax--cache", false);
        +{% endhighlight %}
        +
        +  <h3>
        +    How can I reset all of the global default options?
        +  </h3>
        +
        +  <p>
        +    You can reset the default options to their initial values by calling
        +  </p>
        +
        +{% highlight js linenos %}
        +$.fn.select2.defaults.reset();
        +{% endhighlight %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/data.html b/bower_components/select2/docs/_includes/options/data.html
        new file mode 100644
        index 0000000000..c9c6f684b2
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/data.html
        @@ -0,0 +1,9 @@
        +<section>
        +  <h1>
        +    Data adapters
        +  </h1>
        +
        +  {% include options/data/select.html %}
        +  {% include options/data/array.html %}
        +  {% include options/data/ajax.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/data/ajax.html b/bower_components/select2/docs/_includes/options/data/ajax.html
        new file mode 100644
        index 0000000000..774727410a
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/data/ajax.html
        @@ -0,0 +1,147 @@
        +<section>
        +  <h2 id="ajax">
        +    Can Select2 be connected to a remote data source?
        +  </h2>
        +
        +  <p>
        +    Select2 supports connecting to a remote data source using the <code>ajax</code> option.
        +  </p>
        +
        +  <h3>
        +    How can I set the initially selected options when using AJAX?
        +  </h3>
        +
        +  <p>
        +    You can refer to the following Stack Overflow answer if you want to set the initial value for AJAX requests: <a href="http://stackoverflow.com/q/30316586/359284#30328989">Select2 4.0.0 initial value with AJAX</a>
        +  </p>
        +
        +  <h3>
        +    What should the results returned to Select2 look like?
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    Is there a way to modify the response before passing it back to Select2?
        +  </h3>
        +
        +  <p>
        +    You can use the <code>ajax.processResults</code> option to modify the data returned from the server before passing it to Select2.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  ajax: {
        +    url: '/example/api',
        +    processResults: function (data) {
        +      return {
        +        results: data.items
        +      };
        +    }
        +  }
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    A request is being triggered on every key stroke, can I delay this?
        +  </h3>
        +
        +  <p>
        +    By default, Select2 will trigger a new AJAX request whenever the user changes their search term. You can set a time limit for debouncing requests using the <code>ajax.delay</code> option.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  ajax: {
        +    url: '/example/api',
        +    delay: 250
        +  }
        +});
        +{% endhighlight %}
        +
        +  <p>
        +    This will tell Select2 to wait 250 milliseconds before sending the request out to your API.
        +  </p>
        +
        +  <h3>
        +    How do I tell Select2 which URL to get the results from?
        +  </h3>
        +
        +  <p>
        +    When connecting Select2 to a remote data source, you have the option of using either a single endpoint (a single page which handles all requests) or a dynamic endpoint (one of many pages). You can point Select2 to a single endpoint during initialization by specifying a string for the <code>ajax.url</code> option.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  ajax: {
        +    url: '/path/to/search/endpoint'
        +  }
        +});
        +{% endhighlight %}
        +
        +  <p>
        +    If there isn't a single url for your search results, or you need to call a function to determine the url to use, you can specify a function for the <code>ajax.url</code> option, and this will be used instead. The query parameters will be passed in through the <code>params</code> option.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  ajax: {
        +    url: function (params) {
        +      return '/some/url/' + params.term;
        +    }
        +  }
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    I want to add more query parameters to the request, where can this be done?
        +  </h3>
        +
        +  <p>
        +    By default, Select2 will send the query term as well as the pagination data as query parameters in requests. You can override the data that is sent to your API, or change any of the query paramters, by overriding the <code>ajax.data</codE> option.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  ajax: {
        +    data: function (params) {
        +      var query = {
        +        search: params.term,
        +        page: params.page
        +      }
        +
        +      // Query paramters will be ?search=[term]&page=[page]
        +      return query;
        +    }
        +  }
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    The results that I am seeing never change
        +  </h3>
        +
        +  <p>
        +    Select2 expects that the results that are returned from the remote endpoint are already filtered ahead of time based on the search term. If your remote endpoint just returns the list of all possible options, you may be interested in using Select2's <a href="examples.html#data-array">support for data arrays</a>.
        +  </p>
        +
        +  <h3>
        +    Can an AJAX plugin other than <code>jQuery.ajax</code> be used?
        +  </h3>
        +
        +  <p>
        +    Select2 uses the transport method defined in <code>ajax.transport</code> to send requests to your API. By default, this transport method is <code>jQuery.ajax</code> but this can be changed.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  ajax: {
        +    transport: function (params, success, failure) {
        +      var request = new AjaxRequest(params.url, params);
        +      request.on('success', success);
        +      request.on('failure', failure);
        +    }
        +  }
        +});
        +{% endhighlight %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/data/array.html b/bower_components/select2/docs/_includes/options/data/array.html
        new file mode 100644
        index 0000000000..751635e861
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/data/array.html
        @@ -0,0 +1,150 @@
        +<section>
        +  <h2 id="data">
        +    Can I load data into Select2 using an array?
        +  </h2>
        +
        +  <p>
        +    While Select2 is designed to be used with a <code>&lt;select&gt;</code> tag
        +    the data that is used to search through and display the results can be
        +    loaded from a JavaScript array using the <code>data</code> option. This
        +    option should be passed in during the initialization of Select2.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  data: [
        +    {
        +      id: 'value',
        +      text: 'Text to display'
        +    },
        +    // ... more data objects ...
        +  ]
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    What properties are required on the objects passed in to the array?
        +  </h3>
        +
        +  <p>
        +    The <code>id</code> and <code>text</code> properties are required on each
        +    object, and these are the properties that Select2 uses for the internal
        +    data objects. Any additional paramters passed in with data objects will be
        +    included on the data objects that Select2 exposes.
        +  </p>
        +
        +  <h3>
        +    Do the <code>id</code> properties have to be strings?
        +  </h3>
        +
        +  <p>
        +    Because the <code>value</code> attributes on a <code>&gt;select&lt;</code>
        +    tag must be strings, the <code>id</code> property on the data objects must
        +    also be strings. Select2 will attempt to convert anything that is not a
        +    string to a string, which will work for most situations, but it is
        +    recommended to force all of your ids to strings ahead of time.
        +  </p>
        +
        +  <h3>
        +    I can't select results with blank ids or an id of <code>0</code>!
        +  </h3>
        +
        +  <p>
        +    See <a href="#do-the-id-properties-have-to-be-strings">Do the <code>id</code> properties have to be strings?</a>.
        +  </p>
        +
        +  <h3>
        +    How should nested results be formatted?
        +  </h3>
        +
        +  <p>
        +    Nested results should be specified using the <code>children</code> property
        +    on the data objects that are passed in. This <code>children</code> property
        +    should be an array of data objects that are grouped under this option, and
        +    the label for the group should be specified as the <code>text</code>
        +    property on the root data object.
        +  </p>
        +
        +{% highlight js linenos %}
        +{
        +  text: 'Group label',
        +  children: [
        +    {
        +      id: 'nested-1',
        +      text: 'First nested option'
        +    },
        +    // ... more data objects ...
        +  ]
        +}
        +{% endhighlight %}
        +
        +  <h3>
        +    How many levels of nesting are allowed?
        +  </h3>
        +
        +  <p>
        +    Because Select2 falls back to an <code>&lt;optgroup&gt;</code> when
        +    creating nested options, only
        +    <a href="#how-many-levels-of-nesting-can-there-be">a single level of nesting</a>
        +    is supported. Any additional levels of nesting is not guarenteed to be
        +    displayed properly across all browsers and devices.
        +  </p>
        +
        +  <h3>
        +    Why are <code>&lt;option&gt;</code> tags being created?
        +  </h3>
        +
        +  <p>
        +    The <code>data</code> option is a shortcut that Select2 provides which
        +    allows you to load options into your <code>select</code> from a data array.
        +  </p>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    My objects don&apos;t use <code>id</code> for their unique identifiers,
        +    what can I do?
        +  </h3>
        +
        +  <p>
        +    Select2 requires that the <code>id</code> property is used to uniquely
        +    identify the options that are displayed in the results list. If you use a
        +    property other than <code>id</code> (like <code>pk</code>) to uniquely
        +    identify an option, you need to map your old property to <code>id</code>
        +    before passing it to Select2.
        +  </p>
        +
        +  <p>
        +    If you cannot do this on your server or you are in a situation where the
        +    identifier cannot be changed, you can do this in JavaScript before passing
        +    it to Select2.
        +  </p>
        +
        +{% highlight js linenos %}
        +var data = $.map(yourArrayData, function (obj) {
        +  obj.id = obj.id || obj.pk; // replace pk with your identifier
        +
        +  return obj;
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    My objects use a property other than <code>text</code> for the text that
        +    needs to be displayed
        +  </h3>
        +
        +  <p>
        +    Just like with the <code>id</code> property, Select2 requires that the text
        +    that should be displayed for an option is stored in the <code>text</code>
        +    property. You can map this property from any existing property using the
        +    following JavaScript.
        +  </p>
        +
        +{% highlight js linenos %}
        +var data = $.map(yourArrayData, function (obj) {
        +  obj.text = obj.text || obj.name; // replace name with the property used for the text
        +
        +  return obj;
        +});
        +{% endhighlight %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/data/select.html b/bower_components/select2/docs/_includes/options/data/select.html
        new file mode 100644
        index 0000000000..aa323012c1
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/data/select.html
        @@ -0,0 +1,69 @@
        +<section>
        +  <h2 id="data-adapters-select-tag">
        +    Can Select2 be used with a <code>&lt;select&gt;</code> tag?
        +  </h2>
        +
        +  <p>
        +    Select2 was designed to be a replacement for the standard <code>&lt;select&gt;</code> boxes that are displayed by the browser, so by default it supports all options and operations that are available in a standard select box, but with added flexibility. There is no special configuration required to make Select2 work with a <code>&lt;select&gt;</code> tag.
        +  </p>
        +
        +  <h3>
        +    Does Select2 support nesting options?
        +  </h3>
        +
        +  <p>
        +    A standard <code>&lt;select&gt;</code> box can display nested options by wrapping them with in an <code>&lt;optgroup&gt;</code> tag.
        +  </p>
        +
        +{% highlight html linenos %}
        +<select>
        +  <optgroup label="Group Name">
        +    <option>Nested option</option>
        +  </optgroup>
        +</select>
        +{% endhighlight %}
        +
        +  <h3>
        +    How many levels of nesting can there be?
        +  </h3>
        +
        +  <p>
        +    Only a single level of nesting is allowed per the HTML specification. If you nest an <code>&lt;optgroup&gt;</code> within another <code>&lt;optgroup&gt;</code>, Select2 will not be able to detect the extra level of nesting and errors may be triggered as a result.
        +  </p>
        +
        +  <h3>
        +    Can <code>&lt;optgroup&gt;</code> tags be made selectable?
        +  </h3>
        +
        +  <p>
        +    No. This is a limitation of the HTML specification and is not a limitation that Select2 can overcome. You can emulate grouping by using an <code>&lt;option&gt;</code> instead of an <code>&lt;optgroup&gt;</code> and <a href="http://stackoverflow.com/q/30820215/359284#30948247">changing the style by using CSS</a>, but this is not recommended as it is not fully accessible.
        +  </p>
        +
        +  <h3>
        +    How are <code>&lt;option&gt;</code> and <code>&lt;optgroup&gt;</code> tags serialized into data objects?
        +  </h3>
        +
        +  <p>
        +    Select2 will convert the <code>&lt;option&gt;</code> tag into a data object based on the following rules.
        +  </p>
        +
        +{% highlight js linenos %}
        +{
        +  "id": "value attribute" || "option text",
        +  "text": "label attribute" || "option text",
        +  "element": HTMLOptionElement
        +}
        +{% endhighlight %}
        +
        +  <p>
        +    And <code>&lt;optgroup&gt;</code> tags will be converted into data objects using the following rules
        +  </p>
        +
        +{% highlight js linenos %}
        +{
        +  "text": "label attribute",
        +  "children": [ option data object, ... ],
        +  "elment": HTMLOptGroupElement
        +}
        +{% endhighlight %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/dropdown.html b/bower_components/select2/docs/_includes/options/dropdown.html
        new file mode 100644
        index 0000000000..52d8ea25bb
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/dropdown.html
        @@ -0,0 +1,10 @@
        +<section>
        +  <h1 id="results">
        +    Displaying results
        +  </h1>
        +
        +  {% include options/dropdown/filtering.html %}
        +  {% include options/dropdown/selections.html %}
        +  {% include options/dropdown/tagging.html %}
        +  {% include options/dropdown/placement.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/dropdown/filtering.html b/bower_components/select2/docs/_includes/options/dropdown/filtering.html
        new file mode 100644
        index 0000000000..7e6bce75f3
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/dropdown/filtering.html
        @@ -0,0 +1,55 @@
        +<section>
        +  <h2>
        +    Can I change when search results are loaded?
        +  </h2>
        +
        +  <h3>
        +    Can Select2 wait until the user has typed a search term before triggering the request?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  ajax: {
        +    delay: 250 // wait 250 milliseconds before triggering the request
        +  }
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    Select2 is allowing long search terms, can this be prevented?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  maximumInputLength: 20 // only allow terms up to 20 characters long
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    I only want the search box if there are enough results
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  minimumResultsForSearch: 20 // at least 20 results must be displayed
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    How can I permanently hide the search box?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  minimumResultsForSearch: Infinity
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/dropdown/placement.html b/bower_components/select2/docs/_includes/options/dropdown/placement.html
        new file mode 100644
        index 0000000000..1f78686c59
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/dropdown/placement.html
        @@ -0,0 +1,39 @@
        +<section>
        +  <h2>
        +    Can I change how the dropdown is placed?
        +  </h2>
        +
        +  <h3 id="dropdown-attachContainer">
        +    Can the dropdown be placed directly after the selection container?
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3 id="dropdownParent">
        +    Can I pick an element for the dropdown to be appended to?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  dropdownParent: $('#my_amazing_modal')
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    I&apos;m using a Bootstrap modal and I can&apos;t use the search box
        +  </h3>
        +
        +  <p>
        +    Use the <code>dropdownParent</code> option, setting it to the modal.
        +  </p>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    I&apos;m using jQuery UI and I can&apos;t use the search box
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/dropdown/selections.html b/bower_components/select2/docs/_includes/options/dropdown/selections.html
        new file mode 100644
        index 0000000000..1c9f86e36b
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/dropdown/selections.html
        @@ -0,0 +1,29 @@
        +<section>
        +  <h2>
        +    Can I change how selecting results works?
        +  </h2>
        +
        +  <h3>
        +    Can I select the highlighted result when the dropdown is closed?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  selectOnClose: true
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    Can I prevent the dropdown from closing when a result is selected?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  closeOnSelect: false
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/dropdown/tagging.html b/bower_components/select2/docs/_includes/options/dropdown/tagging.html
        new file mode 100644
        index 0000000000..43e1eb015c
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/dropdown/tagging.html
        @@ -0,0 +1,89 @@
        +<section>
        +  <h2>
        +    Can options be created based on the search term?
        +  </h2>
        +
        +  <h3>
        +    How do I enable tagging?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  tags: true
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    Does tagging work with a single select?
        +  </h3>
        +
        +  <p>
        +    Yes.
        +  </p>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    How do I add extra properties to the tag?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  createTag: function (params) {
        +    var term = $.trim(params.term);
        +
        +    if (term === '') {
        +      return null;
        +    }
        +
        +    return {
        +      id: term,
        +      text: term,
        +      newTag: true // add additional parameters
        +    }
        +  }
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    Can I control when tags are created?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  createTag: function (params) {
        +    // Don't offset to create a tag if there is no @ symbol
        +    if (params.term.indexOf('@') === -1) {
        +      // Return null to disable tag creation
        +      return null;
        +    }
        +
        +    return {
        +      id: params.term,
        +      text: params.term
        +    }
        +  }
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    How do I control the placement of the option?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  insertTag: function (data, tag) {
        +    // Insert the tag at the end of the results
        +    data.push(tag);
        +  }
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/events.html b/bower_components/select2/docs/_includes/options/events.html
        new file mode 100644
        index 0000000000..ea0dd2c16a
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/events.html
        @@ -0,0 +1,8 @@
        +<section>
        +  <h1>
        +    Events
        +  </h1>
        +
        +  {% include options/events/jquery.html %}
        +  {% include options/events/internal.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/events/internal.html b/bower_components/select2/docs/_includes/options/events/internal.html
        new file mode 100644
        index 0000000000..df49d5c92f
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/events/internal.html
        @@ -0,0 +1,9 @@
        +<section>
        +  <h2 id="events-internal">
        +    Internal Select2 events
        +  </h2>
        +  
        +  <p>
        +    Select2 has an internal event system that works independently of the DOM event system. This internal event system is only accesssible from plugins and adapters that are connected to Select2.
        +  </p>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/events/jquery.html b/bower_components/select2/docs/_includes/options/events/jquery.html
        new file mode 100644
        index 0000000000..0c2bb2257c
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/events/jquery.html
        @@ -0,0 +1,101 @@
        +<section>
        +  <h2 id="events-public">
        +    Public jQuery events
        +  </h2>
        +
        +  <h3>
        +    What events will Select2 trigger?
        +  </h3>
        +
        +  <p>
        +    Select2 will trigger a few different events when different actions are taken using the component, allowing you to add custom hooks and perform actions.
        +  </p>
        +
        +  <dl class="s2-docs-panels">
        +    <dt>change</dt>
        +    <dd>Triggered whenever an option is selected or removed.</dd>
        +
        +    <dt>select2:close</dt>
        +    <dd>Triggered whenever the dropdown is closed.</dd>
        +
        +    <dt>select2:closing</dt>
        +    <dd>Triggered before the dropdown is closed. This event can be prevented.</dd>
        +
        +    <dt>select2:open</dt>
        +    <dd>Triggered whenever the dropdown is opened.</dd>
        +
        +    <dt>select2:opening</dt>
        +    <dd>Triggered before the dropdown is opened. This event can be prevented.</dd>
        +
        +    <dt>select2:select</dt>
        +    <dd>Triggered whenever a result is selected.</dd>
        +
        +    <dt>select2:selecting</dt>
        +    <dd>Triggered before a result is selected. This event can be prevented.</dd>
        +
        +    <dt>select2:unselect</dt>
        +    <dd>Triggered whenever a selection is removed.</dd>
        +
        +    <dt>select2:unselecting</dt>
        +    <dd>Triggered before a selection is removed. This event can be prevented.</dd>
        +  </dl>
        +
        +  <h3>
        +    Does Select2 include extra information in these events?
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    How can I attach listeners for these events?
        +  </h3>
        +
        +{% highlight js linenos %}
        +$('select').on('select2:select', function (evt) {
        +  // Do something
        +});
        +{% endhighlight %}
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    What events does Select2 listen for?
        +  </h3>
        +
        +  <p>
        +    Select2 will listen for the <code>change</code> event on the
        +    <code>&lt;select&gt;</code> that it is attached to. If you make any
        +    external changes that need to be reflected in Select2 (such as changing the
        +    value), you should trigger this event.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').val('US'); // Select the option with a value of 'US'
        +$('select').trigger('change'); // Notify any JS components that the value changed
        +{% endhighlight %}
        +
        +  <h3>
        +    Can I trigger an event other than <code>change</code> to notify Select2 of changes?
        +  </h3>
        +
        +  <p>
        +    It's common for other components to be listening to the <code>change</code>
        +    event, or for custom event handlers to be attached that may have side
        +    effects. Select2 does not have a custom event (like
        +    <code>select2:update</code>) that can be triggered other than
        +    <code>change</code>. You can rely on jQuery's event namespacing to limit
        +    the scope to Select2 though by triggering the <code>change.select2</code>
        +    event.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').val('US'); // Change the value or make some change to the internal state
        +$('select').trigger('change.select2'); // Notify only Select2 of changes
        +{% endhighlight %}
        +
        +  <h3>
        +    What events can be prevented? How can I prevent a selection from being made?
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/introduction.html b/bower_components/select2/docs/_includes/options/introduction.html
        new file mode 100644
        index 0000000000..7cc343fcb4
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/introduction.html
        @@ -0,0 +1,9 @@
        +<section>
        +  <div class="alert alert-warning">
        +    This page of the documentation is currently <strong>undergoing a rewrite and may be incomplete</strong>. If you do not find the answer you are looking for on this page, you may have better luck looking at <a href="options-old.html">the old options page</a>.
        +  </div>
        +
        +  <p>
        +    This documentation is set up in the form of a FAQ and covers the most common questions. If you do not find the answer to your question here, you may want to <a href="community.html">reach out to the community</a> to see if someone else can answer it.
        +  </p>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/not-written.html b/bower_components/select2/docs/_includes/options/not-written.html
        new file mode 100644
        index 0000000000..b4967088d3
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/not-written.html
        @@ -0,0 +1,3 @@
        +<div class="alert alert-info">
        +  This answer to this question has not yet been written. You can <a href="https://github.com/select2/select2/blob/master/docs/README.md#how-can-i-fix-an-issue-in-these-docs">improve this documentation</a> by creating a pull request with an answer to this question.
        +</div>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/selections.html b/bower_components/select2/docs/_includes/options/selections.html
        new file mode 100644
        index 0000000000..086c2aec9e
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/selections.html
        @@ -0,0 +1,10 @@
        +<section>
        +  <h1 id="selections">
        +    Displaying selections
        +  </h1>
        +
        +  {% include options/selections/multiple.html %}
        +  {% include options/selections/placeholder.html %}
        +  {% include options/selections/clearing-selections.html %}
        +  {% include options/selections/templating.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/selections/clearing-selections.html b/bower_components/select2/docs/_includes/options/selections/clearing-selections.html
        new file mode 100644
        index 0000000000..dd9c10d2b0
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/selections/clearing-selections.html
        @@ -0,0 +1,34 @@
        +<section>
        +  <h2 id="allowClear">
        +    Can I allow users to clear their selections?
        +  </h2>
        +
        +  <p>
        +    You can allow people to clear their current selections with the <code>allowClear</code> option when initializing Select2. Setting this option to <code>true</code> will enable an "x" icon that will reset the selection to the placeholder.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  placeholder: 'This is my placeholder',
        +  allowClear: true
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    Why is a placeholder required?
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    The "x" icon is not clearing the selection
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    Can users remove all of their selections in a multiple select at once?
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/selections/multiple.html b/bower_components/select2/docs/_includes/options/selections/multiple.html
        new file mode 100644
        index 0000000000..645a0b6141
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/selections/multiple.html
        @@ -0,0 +1,17 @@
        +<section>
        +  <h2 id="multiple">
        +    Can I allow users to make multiple selections?
        +  </h2>
        +
        +  <p>
        +    Yes, Select2 supports making multiple selections through the use of the <code>multiple</code> option that can be passed in when initializing Select2.
        +  </p>
        +
        +  <h3>
        +    Can the <code>multiple</code> attribute be used on my <code>&lt;select&gt;</code> element?
        +  </h3>
        +
        +  <p>
        +    Yes, Select2 will automatically map the value of the <code>multiple</code> attribute to the <code>multiple</code> option during initialization.
        +  </p>
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/options/selections/placeholder.html b/bower_components/select2/docs/_includes/options/selections/placeholder.html
        new file mode 100644
        index 0000000000..3dd5ef9c5e
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/selections/placeholder.html
        @@ -0,0 +1,84 @@
        +<section>
        +  <h2 id="placeholder">
        +    How can I have Select2 display a placeholder?
        +  </h2>
        +
        +  <p>
        +    Select2 supports displaying a placeholder by default using the <code>placeholder</code> option. This can be either a data object matching the placeholder option, or a string to display as the placeholder if you are using a blank placeholder option.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  placeholder: 'Select an option'
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    My first option is being displayed instead of my placeholder
        +  </h3>
        +
        +  <p>
        +    This usually means that you do not have a blank <code>&lt;option&gt;&lt/option&gt;</code> as the first option in your <code>&lt;select&gt;</code>.
        +  </p>
        +
        +  <p>
        +    Note that this does not apply to multiple selects, as the browser does not select the first option by default when multiple selections can be made.
        +  </p>
        +
        +  <h3>
        +    I am using AJAX, can I still show a placeholder?
        +  </h3>
        +
        +  <p>
        +    Yes, Select2 supports placeholders for all configurations. You will still need to add in the placeholder option if you are using a single select.
        +  </p>
        +
        +  <h3>
        +    Can I use an option without a blank value as my placeholder?
        +  </h3>
        +
        +  <p>
        +    The <code>placeholder</code> option allows you to pass in a data object instead of just a string if you need more flexibility. The <code>id</code> of the data object should match the <code>value</code> of the placeholder option.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  placeholder: {
        +    id: '-1', // the value of the option
        +    text: 'Select an option'
        +  }
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    Can I change how the placeholder looks?
        +  </h3>
        +
        +  <p>
        +    When using Select2 <strong>when only a single selection can be made</strong>, the placeholder option will be passed through the standard templating methods, including the <code>templateSelection</code> option, so you are able to change how it is displayed.
        +  </p>
        +
        +{% highlight js linenos %}
        +$('select').select2({
        +  templateResult: function (data) {
        +    if (data.id === '') { // adjust for custom placeholder values
        +      return 'Custom styled placeholder text';
        +    }
        +
        +    return data.text;
        +  }
        +});
        +{% endhighlight %}
        +
        +  <p>
        +    <strong>When multiple selections are allowed</strong>, the placeholder will be displayed using the <code>placeholder</code> attribute on the search box. You can cusotmize the display of this placholder using CSS, as explained in the following Stack Overflow answer: <a href="http://stackoverflow.com/q/2610497/359284">Change an input's HTML5 placeholder color with CSS</a>
        +  </p>
        +
        +  <h3>
        +    My placeholders aren&apos;t being displayed in Internet Explorer
        +  </h3>
        +
        +  <p>
        +    Select2 uses the native <code>placeholder</code> attribute on input boxes for the multiple select, and that attribute is not supported in older versions of Internet Explorer. You need to include <a href="https://github.com/jamesallardice/Placeholders.js">Placeholders.js</a> on your page, or use the full build, in order to add <code>placeholder</code> attribute support to input boxes.
        +  </p>
        +</section>
        diff --git a/bower_components/select2/docs/_includes/options/selections/templating.html b/bower_components/select2/docs/_includes/options/selections/templating.html
        new file mode 100644
        index 0000000000..19eb8f23dd
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/options/selections/templating.html
        @@ -0,0 +1,37 @@
        +<section>
        +  <h2 id="templateSelection">
        +    How can I customize the way selections are displayed?
        +  </h2>
        +
        +  <p>
        +    When a selection is made by the user Select2 will display the text of the option by default, just like how it is displayed in a standard select box.  You can override the display of the selection by setting the <code>templateSelection</code> option to a JavaScript function.
        +  </p>
        +
        +{% highlight js linenos %}
        +function template(data, container) {
        +  return data.text;
        +}
        +
        +$('select').select2({
        +  templateSelection: template
        +});
        +{% endhighlight %}
        +
        +  <h3>
        +    Nothing is being displayed when I select an option
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    I am using HTML in my selection template but it isn't displaying it
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +
        +  <h3>
        +    How can I access the container where the selection is displayed?
        +  </h3>
        +
        +  {% include options/not-written.html %}
        +</section>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_includes/social-buttons.html b/bower_components/select2/docs/_includes/social-buttons.html
        new file mode 100644
        index 0000000000..bcf90cfd4c
        --- /dev/null
        +++ b/bower_components/select2/docs/_includes/social-buttons.html
        @@ -0,0 +1,10 @@
        +<div class="s2-docs-social">
        +  <ul class="s2-docs-social-buttons">
        +    <li>
        +      <iframe class="github-btn" src="https://ghbtns.com/github-btn.html?user=select2&amp;repo=select2&amp;type=watch&amp;count=true" width="100" height="20" title="Star on GitHub"></iframe>
        +    </li>
        +    <li>
        +      <iframe class="github-btn" src="https://ghbtns.com/github-btn.html?user=select2&amp;repo=select2&amp;type=fork&amp;count=true" width="102" height="20" title="Fork on GitHub"></iframe>
        +    </li>
        +  </ul>
        +</div>
        diff --git a/bower_components/select2/docs/_layouts/default.html b/bower_components/select2/docs/_layouts/default.html
        new file mode 100644
        index 0000000000..97bd98716f
        --- /dev/null
        +++ b/bower_components/select2/docs/_layouts/default.html
        @@ -0,0 +1,57 @@
        +<!doctype html>
        +<html>
        +  <head>
        +    {% include head.html %}
        +  </head>
        +  <body>
        +    {% include navigation.html %}
        +
        +    {{ content }}
        +
        +    {% include footer.html %}
        +
        +    <script>
        +      (function ($) {
        +        'use strict';
        +
        +        $(function () {
        +          var $window = $(window);
        +          var $body = $(document.body);
        +          var $sidebar = $('.s2-docs-sidebar');
        +
        +          $body.scrollspy({
        +            target: '.s2-docs-sidebar',
        +            offset: 40
        +          });
        +
        +          $window.on('load', function () {
        +            $body.scrollspy('refresh');
        +          });
        +
        +          $sidebar.affix({
        +            offset: {
        +              top: function () {
        +                var offsetTop = $sidebar.offset().top;
        +                var navOuterHeight = $('.s2-docs-nav').height();
        +
        +                return (this.top = offsetTop - navOuterHeight);
        +              },
        +              bottom: function () {
        +                return (this.bottom = $('.s2-docs-footer').outerHeight(true));
        +              }
        +            }
        +          });
        +        });
        +      })(jQuery);
        +
        +      (function () {
        +        'use strict';
        +
        +        anchors.options.placement = 'left';
        +        anchors.add('.s2-docs-container h1, .s2-docs-container h2, .s2-docs-container h3, .s2-docs-container h4, .s2-docs-container h5');
        +      })();
        +    </script>
        +
        +    {% include ga.html %}
        +  </body>
        +</html>
        diff --git a/bower_components/select2/docs/_layouts/home.html b/bower_components/select2/docs/_layouts/home.html
        new file mode 100644
        index 0000000000..0732b29f35
        --- /dev/null
        +++ b/bower_components/select2/docs/_layouts/home.html
        @@ -0,0 +1,23 @@
        +<!doctype html>
        +<html class="s2-docs-home">
        +  <head>
        +    {% include head.html %}
        +  </head>
        +  <body>
        +    {% include navigation.html %}
        +
        +    {{ content }}
        +
        +    {% include footer.html %}
        +
        +    <script>
        +      (function () {
        +        'use strict';
        +
        +        prettyPrint();
        +      })();
        +    </script>
        +
        +    {% include ga.html %}
        +  </body>
        +</html>
        diff --git a/bower_components/select2/docs/_sass/_alert.scss b/bower_components/select2/docs/_sass/_alert.scss
        new file mode 100644
        index 0000000000..cb5d54fd28
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_alert.scss
        @@ -0,0 +1,47 @@
        +// Alerts
        +//
        +// Modify Bootstrap's default alert styles to mimick
        +// the `.bs-callout` styles from Bootstrap's docs.
        +//
        +// @see https://github.com/twbs/bootstrap/blob/master/docs/assets/css/src/docs.css#L711
        +// @see https://github.com/twbs/bootstrap/blob/master/less/alerts.less
        +
        +.alert {
        +  background: #fff;
        +  border: 1px solid #eee;
        +  border-left-width: 5px;
        +  border-radius: 3px;
        +  color: #333;
        +  margin: 20px 0;
        +  padding: 20px;
        +
        +  h4 {
        +    font-size: 18px;
        +    margin-top: 0;
        +    margin-bottom: 5px;
        +  }
        +
        +  &-danger {
        +    border-left-color: #ce4844;
        +
        +    h4 {
        +      color: #ce4844;
        +    }
        +  }
        +
        +  &-info {
        +    border-left-color: #1b809e;
        +
        +    h4 {
        +      color: #1b809e;
        +    }
        +  }
        +
        +  &-warning {
        +    border-left-color: #aa6708;
        +
        +    h4 {
        +      color: #aa6708;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_anchorjs.scss b/bower_components/select2/docs/_sass/_anchorjs.scss
        new file mode 100644
        index 0000000000..6190049164
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_anchorjs.scss
        @@ -0,0 +1,27 @@
        +// AnchorJS Styles
        +
        +.anchorjs-link {
        +  color: inherit;
        +  transition: all .16s linear;
        +  text-decoration: none;
        +
        +  &:link,
        +  &:visited {
        +    text-decoration: none;
        +    color: inherit;
        +  }
        +
        +  @media (max-width: 480px) {
        +    display: none;
        +  }
        +}
        +
        +*:hover > .anchorjs-link {
        +  opacity: .5;
        +  margin-left: -0.9em !important;
        +}
        +
        +*:hover > .anchorjs-link:hover,
        +.anchorjs-link:focus {
        +  opacity: 1;
        +}
        diff --git a/bower_components/select2/docs/_sass/_buttons.scss b/bower_components/select2/docs/_sass/_buttons.scss
        new file mode 100644
        index 0000000000..1ad817691a
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_buttons.scss
        @@ -0,0 +1,20 @@
        +// Buttons
        +
        +.btn-outline-inverse {
        +  color: #428BCA;
        +  background-color: transparent;
        +  border-color: #428BCA;
        +  padding: 15px 30px;
        +  font-size: 20px;
        +  transition: all .1s ease-in-out;
        +
        +  &:hover {
        +    color: #fff;
        +    border-color: #428BCA;
        +    background-color: #428BCA;
        +  }
        +}
        +
        +.btn-toolbar {
        +  margin-bottom: 20px;
        +}
        diff --git a/bower_components/select2/docs/_sass/_code.scss b/bower_components/select2/docs/_sass/_code.scss
        new file mode 100644
        index 0000000000..ecd3aa97c6
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_code.scss
        @@ -0,0 +1,16 @@
        +// Code (inline and block)
        +
        +// Inline code within headings retain the heading's background-color
        +h2 code,
        +h3 code,
        +h4 code {
        +  background-color: inherit;
        +}
        +
        +// Modify Bootstrap's styles for blocks of code
        +pre.prettyprint {
        +  padding: 9px 14px;
        +  margin-bottom: 14px;
        +  background-color: #f7f7f9;
        +  border: 1px solid #e1e1e8;
        +}
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_sass/_dl-panels.scss b/bower_components/select2/docs/_sass/_dl-panels.scss
        new file mode 100644
        index 0000000000..76d5151f9e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_dl-panels.scss
        @@ -0,0 +1,24 @@
        +.s2-docs-panels {
        +    dt, dd {
        +        border: 1px solid $panel-default-border;
        +    }
        +
        +    dt {
        +        background-color: $panel-default-heading-bg;
        +        border-top-left-radius: $panel-border-radius;
        +        border-top-right-radius: $panel-border-radius;
        +        padding: 5px 7.5px;
        +    }
        +
        +    dd {
        +        background-color: $panel-bg;
        +        border-bottom-left-radius: $panel-border-radius;
        +        border-bottom-right-radius: $panel-border-radius;
        +        margin-bottom: 0.75em;
        +        padding: 7.5px;
        +    }
        +
        +    dt + dd {
        +        border-top: none;
        +    }
        +}
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_sass/_examples.scss b/bower_components/select2/docs/_sass/_examples.scss
        new file mode 100644
        index 0000000000..0af5591477
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_examples.scss
        @@ -0,0 +1,91 @@
        +// Examples
        +//
        +// Styles for the Select2 examples, largely copied
        +// from Bootstrap's docs styles.
        +//
        +// @see https://github.com/twbs/bootstrap/blob/master/docs/assets/css/src/docs.css#L533
        +
        +.s2-example {
        +  position: relative;
        +  padding: 45px 15px 15px;
        +  margin: 0 -15px 15px;
        +  background-color: #fafafa;
        +  box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.05);
        +  border-color: #e5e5e5 #eee #eee;
        +  border-style: solid;
        +  border-width: 1px 0;
        +
        +  &:after {
        +    content: "Example";
        +    position: absolute;
        +    top: 15px;
        +    left: 15px;
        +    font-size: 12px;
        +    font-weight: bold;
        +    color: #bbb;
        +    text-transform: uppercase;
        +    letter-spacing: 1px;
        +  }
        +
        +  @media (min-width: 768px) {
        +    margin-left: 0;
        +    margin-right: 0;
        +    background-color: #fff;
        +    border-width: 1px;
        +    border-color: #eee;
        +    border-radius: 4px 4px 0 0;
        +    box-shadow: none;
        +  }
        +}
        +
        +// styles for the event log in the "DOM events" section of the docs
        +.s2-event-log {
        +  background: #002451;
        +  color: white;
        +  font-family: Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, Consolas, monospace;
        +  margin: 0 -15px 15px;
        +  padding: 45px 15px 15px;
        +  position: relative;
        +
        +  &:after {
        +    content: "Event Log";
        +    position: absolute;
        +    top: 15px;
        +    left: 15px;
        +    font-size: 12px;
        +    font-weight: bold;
        +    color: #BBB;
        +    text-transform: uppercase;
        +    letter-spacing: 1px;
        +  }
        +
        +  @media (min-width: 768px) {
        +    margin-left: 0;
        +    margin-right: 0;
        +    margin-top: -15px;
        +    border-width: 1px;
        +    border-color: #eee;
        +    box-shadow: none;
        +  }
        +}
        +
        +.s2-example + pre,
        +.s2-example + figure,
        +.s2-event-log + pre {
        +  margin: -15px -15px 15px;
        +  border-radius: 0;
        +  border-width: 0 0 1px;
        +
        +  @media (min-width: 768px) {
        +    margin-top: -16px;
        +    margin-left: 0;
        +    margin-right: 0;
        +    border-width: 1px;
        +    border-bottom-left-radius: 4px;
        +    border-bottom-right-radius: 4px;
        +  }
        +}
        +
        +.s2-example + .s2-event-log {
        +  margin-top: -15px;
        +}
        diff --git a/bower_components/select2/docs/_sass/_featurette.scss b/bower_components/select2/docs/_sass/_featurette.scss
        new file mode 100644
        index 0000000000..56eedf8c42
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_featurette.scss
        @@ -0,0 +1,16 @@
        +// Homepage featurettes
        +
        +.s2-docs-featurette {
        +  color: #777;
        +  padding: 15px 0;
        +  text-align: center;
        +
        +  h4 {
        +    margin: 30px 0 15px;
        +  }
        +
        +  .fa {
        +    font-size: 28px;
        +    color: #777;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_footer.scss b/bower_components/select2/docs/_sass/_footer.scss
        new file mode 100644
        index 0000000000..dfe5d40e10
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_footer.scss
        @@ -0,0 +1,42 @@
        +// Footer
        +
        +.s2-docs-footer {
        +  border-top: 1px solid #eee;
        +  color: #767676;
        +  padding-top: 40px;
        +  padding-bottom: 40px;
        +  margin-top: 100px;
        +  text-align: center;
        +
        +  &-links {
        +    padding-left: 0;
        +    margin-top: 20px;
        +  }
        +
        +  &-links li {
        +    display: inline;
        +    padding: 0 2px;
        +
        +    &:after {
        +      content: "·";
        +      padding-left: 8px;
        +    }
        +
        +    &:first-child {
        +      padding-left: 0;
        +    }
        +
        +    &:last-child:after {
        +      content: "";
        +      padding-left: 0;
        +    }
        +  }
        +
        +  @media (min-width: 768px) {
        +    p {
        +      margin-bottom: 0;
        +    }
        +  }
        +}
        +
        +
        diff --git a/bower_components/select2/docs/_sass/_hamburger.scss b/bower_components/select2/docs/_sass/_hamburger.scss
        new file mode 100644
        index 0000000000..759c53fc25
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_hamburger.scss
        @@ -0,0 +1,49 @@
        +// Animated hamburger icon
        +//
        +// Add an animation to Bootstrap's `.navbar-toggle` hamburger icon,
        +// courtesy of Julien Melissas.
        +//
        +// @see http://codepen.io/JulienMelissas/pen/LEBGLj
        +// @see http://julienmelissas.com/animated-x-icon-for-the-bootstrap-navbar-toggle/
        +
        +.navbar-toggle {
        +  border: none;
        +  background: transparent !important;
        +
        +  &:hover {
        +    background: transparent !important;
        +  }
        +
        +  .icon-bar {
        +    width: 22px;
        +    transition: all 0.2s;
        +  }
        +
        +  .top-bar {
        +    transform: rotate(45deg);
        +    transform-origin: 10% 10%;
        +  }
        +
        +  .middle-bar {
        +    opacity: 0;
        +  }
        +
        +  .bottom-bar {
        +    transform: rotate(-45deg);
        +    transform-origin: 10% 90%;
        +  }
        +
        +  &.collapsed {
        +    .top-bar {
        +      transform: rotate(0);
        +    }
        +
        +    .middle-bar {
        +      opacity: 1;
        +    }
        +
        +    .bottom-bar {
        +      transform: rotate(0);
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_home.scss b/bower_components/select2/docs/_sass/_home.scss
        new file mode 100644
        index 0000000000..985308022e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_home.scss
        @@ -0,0 +1,31 @@
        +// Homepage-specific styles
        +
        +.s2-docs-home {
        +  .jumbotron {
        +    margin-bottom: 0;
        +    color: #000;
        +
        +    h1 {
        +      color: #000;
        +      margin-top: 20px;
        +    }
        +  }
        +
        +  .lead {
        +    text-align: center;
        +    max-width: 800px;
        +    margin: 0 auto 40px;
        +  }
        +
        +  .notice-previous {
        +    background: #f6f6f6;
        +    color: #666;
        +    border-bottom: 1px solid #eee;
        +    padding: 15px 20px;
        +  }
        +
        +  .half-rule {
        +    width: 100px;
        +    margin: 40px auto;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_jumbotron.scss b/bower_components/select2/docs/_sass/_jumbotron.scss
        new file mode 100644
        index 0000000000..7b3cc5eedd
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_jumbotron.scss
        @@ -0,0 +1,24 @@
        +// Jumbotron
        +//
        +// Modify Bootstrap's default `.jumbotron` styles.
        +
        +.jumbotron {
        +  background-color: #F6F6F6;
        +  border-bottom: 1px solid #eee;
        +  color: #777;
        +  padding-left: 0;
        +  padding-right: 0;
        +
        +  h1 {
        +    color: #777;
        +    font-size: 36px;
        +    margin-top: 10px;
        +  }
        +
        +  .version {
        +    color: #999;
        +    font-size: 14px;
        +    font-weight: normal;
        +    margin-bottom: 30px;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_layout.scss b/bower_components/select2/docs/_sass/_layout.scss
        new file mode 100644
        index 0000000000..e53a648efd
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_layout.scss
        @@ -0,0 +1,14 @@
        +// Layout
        +
        +.s2-docs-container {
        +  line-height: 1.6;
        +}
        +
        +section {
        +  margin-bottom: 40px;
        +}
        +
        +.page-header {
        +  padding-bottom: 19px;
        +  margin-bottom: 29px;
        +}
        diff --git a/bower_components/select2/docs/_sass/_nav.scss b/bower_components/select2/docs/_sass/_nav.scss
        new file mode 100644
        index 0000000000..40fd17ce79
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_nav.scss
        @@ -0,0 +1,59 @@
        +// Main navigation
        +//
        +// Styles for the top `.navbar` and its dropdowns.
        +
        +.s2-docs-nav {
        +  margin-bottom: 0;
        +  border-color: #eee;
        +  background-color: #f6f6f6;
        +
        +  .navbar-brand {
        +    font-weight: 500;
        +    > img {
        +      display: inline;
        +      margin-right: 4px;
        +    }
        +  }
        +
        +  .navbar-nav > .active > a,
        +  .navbar-nav > .active > a:hover,
        +  .navbar-nav > .active > a:focus {
        +    background-color: #f0f0f0;
        +    color: #000;
        +  }
        +
        +  @media (min-width: 768px) {
        +
        +    .navbar-nav > li > .dropdown-menu:before {
        +      position: absolute;
        +      top: -21px;
        +      left: 24px;
        +      display: block;
        +      width: 0;
        +      height: 0;
        +      border-color: rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgba(0, 0, 0, 0.1);
        +      border-style: solid;
        +      border-width: 10px;
        +      content: "";
        +    }
        +
        +    .navbar-nav > li > .dropdown-menu:after {
        +      position: absolute;
        +      top: -20px;
        +      left: 24px;
        +      display: block;
        +      width: 0;
        +      height: 0;
        +      border-color: rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) #FFF;
        +      border-style: solid;
        +      border-width: 10px;
        +      content: '';
        +    }
        +
        +    .navbar-nav .dropdown-menu {
        +      border-radius: 4px;
        +      border-color: #ddd;
        +      margin-top: -1px;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_prettify.scss b/bower_components/select2/docs/_sass/_prettify.scss
        new file mode 100644
        index 0000000000..4b799d544b
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_prettify.scss
        @@ -0,0 +1,50 @@
        +// Google Code Prettify styles
        +
        +.com {
        +  color: #999;
        +}
        +.lit {
        +  color: #195f91;
        +}
        +.pun, .opn, .clo {
        +  color: #93a1a1;
        +}
        +.fun {
        +  color: #dc322f;
        +}
        +.str, .atv {
        +  color: #C7254E;
        +}
        +.kwd, .prettyprint .tag {
        +  color: #2F6F9F;
        +}
        +.typ, .atn, .dec, .var {
        +  color: #428BCA;
        +}
        +.pln {
        +  color: #333;
        +}
        +
        +.prettyprint {
        +  padding: 9px 14px;
        +  margin-bottom: 20px;
        +  margin-top: 20px;
        +  border: 1px solid #eee;
        +
        +  &.linenums {
        +    -webkit-box-shadow: inset 40px 0 0 #fbfbfb, inset 41px 0 0 #f6f6f6;
        +       -moz-box-shadow: inset 40px 0 0 #fbfbfb, inset 41px 0 0 #f6f6f6;
        +            box-shadow: inset 40px 0 0 #fbfbfb, inset 41px 0 0 #f6f6f6;
        +  }
        +}
        +
        +// Specify class=linenums on a pre to get line numbering
        +ol.linenums {
        +  margin: 0 0 0 -12px;
        +
        +  li {
        +    padding-left: 12px;
        +    color: #bebebe;
        +    line-height: 18px;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_result-repository.scss b/bower_components/select2/docs/_sass/_result-repository.scss
        new file mode 100644
        index 0000000000..a4e256afe0
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_result-repository.scss
        @@ -0,0 +1,62 @@
        +// Styles accompanying the "Loading remote data" example `templateResult
        +
        +.select2-result-repository {
        +  padding-top: 4px;
        +  padding-bottom: 3px;
        +
        +  &__avatar {
        +    float: left;
        +    width: 60px;
        +    margin-right: 10px;
        +
        +    img {
        +      width: 100%;
        +      height: auto;
        +      border-radius: 2px;
        +    }
        +  }
        +
        +  &__meta {
        +    margin-left: 70px;
        +  }
        +
        +  &__title {
        +    color: black;
        +    font-weight: bold;
        +    word-wrap: break-word;
        +    line-height: 1.1;
        +    margin-bottom: 4px;
        +  }
        +
        +  &__forks,
        +  &__stargazers {
        +    margin-right: 1em;
        +  }
        +
        +  &__forks,
        +  &__stargazers,
        +  &__watchers {
        +    display: inline-block;
        +    color: #aaa;
        +    font-size: 11px;
        +  }
        +
        +  &__description {
        +    font-size: 13px;
        +    color: #777;
        +    margin-top: 4px;
        +  }
        +
        +  .select2-results__option--highlighted & {
        +    &__title {
        +      color: white;
        +    }
        +
        +    &__forks,
        +    &__stargazers,
        +    &__description,
        +    &__watchers {
        +      color: mix(#428BCA, white, 30%);
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_sidenav.scss b/bower_components/select2/docs/_sass/_sidenav.scss
        new file mode 100644
        index 0000000000..3608c15086
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_sidenav.scss
        @@ -0,0 +1,152 @@
        +// Side navigation
        +//
        +// Scrollspy and affixed enhanced navigation to
        +// highlight sections and secondary sections of docs content`.
        +
        +.s2-docs-sidebar {
        +  // By default it is not affixed in mobile views, so undo that
        +  &.affix {
        +    position: static;
        +  }
        +
        +  @media (min-width: 768px) {
        +    padding-left: 20px;
        +  }
        +}
        +
        +// First level of nav
        +.s2-docs-sidenav {
        +  margin-top: 20px;
        +  margin-bottom: 20px;
        +}
        +
        +// All levels of nav
        +.s2-docs-sidebar .nav {
        +  > li > a {
        +    margin-left: -1px;
        +    display: block;
        +    padding: 4px 20px;
        +    font-size: 13px;
        +    font-weight: 500;
        +    color: #767676;
        +    border-left: 1px solid transparent;
        +    transition: color .2s, border-color .2s;
        +  }
        +
        +  > li > a code {
        +    background-color: inherit;
        +    color: inherit;
        +  }
        +
        +  > li > a:hover,
        +  > li > a:focus {
        +    color: #428BCA;
        +    text-decoration: none;
        +    background-color: transparent;
        +    border-left-color: #428BCA;
        +  }
        +
        +  > .active > a,
        +  > .active:hover > a,
        +  > .active:focus > a {
        +    padding-left: 19px;
        +    font-weight: bold;
        +    color: #428BCA;
        +    background-color: transparent;
        +    border-left: 2px solid #428BCA;
        +  }
        +
        +  // Nav: second level (shown on .active)
        +  .nav {
        +    display: none; // Hide by default, but at >768px, show it
        +    padding-bottom: 10px;
        +  }
        +
        +  .nav > li > a {
        +    padding-top: 1px;
        +    padding-bottom: 1px;
        +    padding-left: 30px;
        +    font-size: 12px;
        +    font-weight: normal;
        +  }
        +
        +  .nav > li > a:hover,
        +  .nav > li > a:focus {
        +    padding-left: 30px;
        +  }
        +
        +  .nav > .active > a,
        +  .nav > .active:hover > a,
        +  .nav > .active:focus > a {
        +    padding-left: 29px;
        +    font-weight: 400;
        +  }
        +}
        +
        +// Show and affix the side nav when space allows it
        +@media (min-width: 992px) {
        +  .s2-docs-sidebar .s2-docs-sidenav {
        +    padding-top: 40px;
        +    transition: border-color .2s;
        +    border-left: 1px solid transparent;
        +  }
        +
        +  .s2-docs-sidebar.affix .s2-docs-sidenav {
        +    border-left-color: #eee;
        +  }
        +
        +  .s2-docs-sidebar .nav > .active > ul {
        +    display: block;
        +  }
        +
        +  // Widen the fixed sidebar
        +  .s2-docs-sidebar.affix,
        +  .s2-docs-sidebar.affix-bottom {
        +    width: 213px;
        +  }
        +
        +  // Undo the static from mobile first approach
        +  .s2-docs-sidebar.affix {
        +    position: fixed;
        +    top: 0px;
        +  }
        +
        +  // Undo the static from mobile first approach
        +  .s2-docs-sidebar.affix-bottom {
        +    position: absolute;
        +  }
        +
        +  .s2-docs-sidebar.affix-bottom .s2-docs-sidenav,
        +  .s2-docs-sidebar.affix .s2-docs-sidenav {
        +    margin-top: 0;
        +    margin-bottom: 0;
        +  }
        +}
        +
        +@media (min-width: 1200px) {
        +  // Widen the fixed sidebar again
        +  .s2-docs-sidebar.affix-bottom,
        +  .s2-docs-sidebar.affix {
        +    width: 263px;
        +  }
        +}
        +
        +/* Back to top (hidden on mobile) */
        +.back-to-top {
        +  display: none;
        +  padding: 4px 10px;
        +  margin-top: 10px;
        +  margin-left: 10px;
        +  font-size: 12px;
        +  font-weight: 400;
        +  color: #999;
        +
        +  &:hover {
        +    color: #428BCA;
        +    text-decoration: none;
        +  }
        +
        +  @media (min-width: 768px) {
        +    display: block;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/_social.scss b/bower_components/select2/docs/_sass/_social.scss
        new file mode 100644
        index 0000000000..0e8d073689
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_social.scss
        @@ -0,0 +1,35 @@
        +// Social buttons
        +//
        +// Twitter and GitHub social action buttons.
        +
        +.s2-docs-social {
        +  margin-bottom: 20px;
        +  text-align: center;
        +}
        +
        +.s2-docs-social-buttons {
        +  display: inline-block;
        +  padding-left: 0;
        +  margin-bottom: 0;
        +  list-style: none;
        +
        +  li {
        +    display: inline-block;
        +    padding: 5px 8px;
        +    line-height: 1;
        +  }
        +
        +  .twitter-follow-button {
        +    width: 225px !important;
        +  }
        +
        +  .twitter-share-button {
        +    width: 98px !important;
        +  }
        +}
        +
        +// Style the GitHub buttons via CSS instead of inline attributes
        +.github-btn {
        +  overflow: hidden;
        +  border: 0;
        +}
        diff --git a/bower_components/select2/docs/_sass/_syntax-highlighting.scss b/bower_components/select2/docs/_sass/_syntax-highlighting.scss
        new file mode 100644
        index 0000000000..9dca6bdc28
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_syntax-highlighting.scss
        @@ -0,0 +1,117 @@
        +// Jekyll syntax highlighting styles adjusted to match Google Code Prettify
        +
        +.highlight  {
        +    background: #fff;
        +
        +    // Text
        +    .nx {
        +        color: #333;
        +    }
        +
        +    // Keywords and operators
        +    .k, .o {
        +        font-weight: bold;
        +    }
        +
        +    // Attribute name
        +    .na {
        +        color: #428BCA;
        +    }
        +
        +    // Strings
        +    .s, .s1, .s2, .sb, .sc, .sd, .se, .sh, .si, .sx {
        +        color: #C7254E;
        +    }
        +
        +    // Literals
        +    .m, .mf, mh, .mi, .mo {
        +        color: #195f91;
        +    }
        +
        +    // Parentheses
        +    .p {
        +        color: #93a1a1;
        +    }
        +
        +    // Tag
        +    .nt {
        +        color: #2F6F9F;
        +    }
        +
        +    // Comments
        +    .c {
        +        color: #999;
        +        font-style: italic;
        +    }
        +
        +    // Error
        +    .err {
        +        background-color: #e3d2d2;
        +        color: #a61717;
        +    }
        +
        +    // Generic error
        +    .gr {
        +        color: #a00;
        +    }
        +
        +    // Container styles
        +    pre {
        +        border: none;
        +        margin: 0;
        +    }
        +
        +    & > pre {
        +        border: 1px solid #eee;
        +        padding: 0;
        +        margin-bottom: 14px;
        +    }
        +
        +    // Line numbers
        +    .lineno {
        +        background-color: #fbfbfb;
        +        color: #bebebe;
        +
        +        -ms-user-select: none;
        +        -moz-user-select: none;
        +        -webkit-user-select: none;
        +    }
        +}
        +
        +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
        +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
        +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
        +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
        +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
        +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
        +.highlight .ge { font-style: italic } /* Generic.Emph */
        +.highlight .gh { color: #999999 } /* Generic.Heading */
        +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
        +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
        +.highlight .go { color: #888888 } /* Generic.Output */
        +.highlight .gp { color: #555555 } /* Generic.Prompt */
        +.highlight .gs { font-weight: bold } /* Generic.Strong */
        +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
        +.highlight .gt { color: #aa0000 } /* Generic.Traceback */
        +.highlight .kc { font-weight: bold } /* Keyword.Constant */
        +.highlight .kd { font-weight: bold } /* Keyword.Declaration */
        +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
        +.highlight .kr { font-weight: bold } /* Keyword.Reserved */
        +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
        +.highlight .nb { color: #0086B3 } /* Name.Builtin */
        +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
        +.highlight .no { color: #008080 } /* Name.Constant */
        +.highlight .ni { color: #800080 } /* Name.Entity */
        +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
        +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
        +.highlight .nn { color: #555555 } /* Name.Namespace */
        +.highlight .nv { color: #008080 } /* Name.Variable */
        +.highlight .ow { font-weight: bold } /* Operator.Word */
        +.highlight .w { color: #bbbbbb } /* Text.Whitespace */
        +.highlight .sr { color: #009926 } /* Literal.String.Regex */
        +.highlight .ss { color: #990073 } /* Literal.String.Symbol */
        +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
        +.highlight .vc { color: #008080 } /* Name.Variable.Class */
        +.highlight .vg { color: #008080 } /* Name.Variable.Global */
        +.highlight .vi { color: #008080 } /* Name.Variable.Instance */
        +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/_sass/_typography.scss b/bower_components/select2/docs/_sass/_typography.scss
        new file mode 100644
        index 0000000000..1046c99455
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/_typography.scss
        @@ -0,0 +1,6 @@
        +// Typography
        +
        +h1[id] {
        +  padding-top: 20px;
        +  margin-top: 0;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_alerts.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_alerts.scss
        new file mode 100644
        index 0000000000..7d1e1fddd1
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_alerts.scss
        @@ -0,0 +1,73 @@
        +//
        +// Alerts
        +// --------------------------------------------------
        +
        +
        +// Base styles
        +// -------------------------
        +
        +.alert {
        +  padding: $alert-padding;
        +  margin-bottom: $line-height-computed;
        +  border: 1px solid transparent;
        +  border-radius: $alert-border-radius;
        +
        +  // Headings for larger alerts
        +  h4 {
        +    margin-top: 0;
        +    // Specified for the h4 to prevent conflicts of changing $headings-color
        +    color: inherit;
        +  }
        +
        +  // Provide class for links that match alerts
        +  .alert-link {
        +    font-weight: $alert-link-font-weight;
        +  }
        +
        +  // Improve alignment and spacing of inner content
        +  > p,
        +  > ul {
        +    margin-bottom: 0;
        +  }
        +
        +  > p + p {
        +    margin-top: 5px;
        +  }
        +}
        +
        +// Dismissible alerts
        +//
        +// Expand the right padding and account for the close button's positioning.
        +
        +.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
        +.alert-dismissible {
        +  padding-right: ($alert-padding + 20);
        +
        +  // Adjust close link position
        +  .close {
        +    position: relative;
        +    top: -2px;
        +    right: -21px;
        +    color: inherit;
        +  }
        +}
        +
        +// Alternate styles
        +//
        +// Generate contextual modifier classes for colorizing the alert.
        +
        +.alert-success {
        +  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
        +}
        +
        +.alert-info {
        +  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
        +}
        +
        +.alert-warning {
        +  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
        +}
        +
        +.alert-danger {
        +  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_badges.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_badges.scss
        new file mode 100644
        index 0000000000..70002e085b
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_badges.scss
        @@ -0,0 +1,68 @@
        +//
        +// Badges
        +// --------------------------------------------------
        +
        +
        +// Base class
        +.badge {
        +  display: inline-block;
        +  min-width: 10px;
        +  padding: 3px 7px;
        +  font-size: $font-size-small;
        +  font-weight: $badge-font-weight;
        +  color: $badge-color;
        +  line-height: $badge-line-height;
        +  vertical-align: middle;
        +  white-space: nowrap;
        +  text-align: center;
        +  background-color: $badge-bg;
        +  border-radius: $badge-border-radius;
        +
        +  // Empty badges collapse automatically (not available in IE8)
        +  &:empty {
        +    display: none;
        +  }
        +
        +  // Quick fix for badges in buttons
        +  .btn & {
        +    position: relative;
        +    top: -1px;
        +  }
        +
        +  .btn-xs &,
        +  .btn-group-xs > .btn & {
        +    top: 0;
        +    padding: 1px 5px;
        +  }
        +
        +  // [converter] extracted a& to a.badge
        +
        +  // Account for badges in navs
        +  .list-group-item.active > &,
        +  .nav-pills > .active > a > & {
        +    color: $badge-active-color;
        +    background-color: $badge-active-bg;
        +  }
        +
        +  .list-group-item > & {
        +    float: right;
        +  }
        +
        +  .list-group-item > & + & {
        +    margin-right: 5px;
        +  }
        +
        +  .nav-pills > li > a > & {
        +    margin-left: 3px;
        +  }
        +}
        +
        +// Hover state, but only for links
        +a.badge {
        +  &:hover,
        +  &:focus {
        +    color: $badge-link-hover-color;
        +    text-decoration: none;
        +    cursor: pointer;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_breadcrumbs.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_breadcrumbs.scss
        new file mode 100644
        index 0000000000..b61f0c731c
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_breadcrumbs.scss
        @@ -0,0 +1,28 @@
        +//
        +// Breadcrumbs
        +// --------------------------------------------------
        +
        +
        +.breadcrumb {
        +  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
        +  margin-bottom: $line-height-computed;
        +  list-style: none;
        +  background-color: $breadcrumb-bg;
        +  border-radius: $border-radius-base;
        +
        +  > li {
        +    display: inline-block;
        +
        +    + li:before {
        +      // [converter] Workaround for https://github.com/sass/libsass/issues/1115
        +      $nbsp: "\00a0";
        +      content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space
        +      padding: 0 5px;
        +      color: $breadcrumb-color;
        +    }
        +  }
        +
        +  > .active {
        +    color: $breadcrumb-active-color;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_button-groups.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_button-groups.scss
        new file mode 100644
        index 0000000000..baaacc4446
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_button-groups.scss
        @@ -0,0 +1,244 @@
        +//
        +// Button groups
        +// --------------------------------------------------
        +
        +// Make the div behave like a button
        +.btn-group,
        +.btn-group-vertical {
        +  position: relative;
        +  display: inline-block;
        +  vertical-align: middle; // match .btn alignment given font-size hack above
        +  > .btn {
        +    position: relative;
        +    float: left;
        +    // Bring the "active" button to the front
        +    &:hover,
        +    &:focus,
        +    &:active,
        +    &.active {
        +      z-index: 2;
        +    }
        +  }
        +}
        +
        +// Prevent double borders when buttons are next to each other
        +.btn-group {
        +  .btn + .btn,
        +  .btn + .btn-group,
        +  .btn-group + .btn,
        +  .btn-group + .btn-group {
        +    margin-left: -1px;
        +  }
        +}
        +
        +// Optional: Group multiple button groups together for a toolbar
        +.btn-toolbar {
        +  margin-left: -5px; // Offset the first child's margin
        +  @include clearfix;
        +
        +  .btn,
        +  .btn-group,
        +  .input-group {
        +    float: left;
        +  }
        +  > .btn,
        +  > .btn-group,
        +  > .input-group {
        +    margin-left: 5px;
        +  }
        +}
        +
        +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
        +  border-radius: 0;
        +}
        +
        +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
        +.btn-group > .btn:first-child {
        +  margin-left: 0;
        +  &:not(:last-child):not(.dropdown-toggle) {
        +    @include border-right-radius(0);
        +  }
        +}
        +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
        +.btn-group > .btn:last-child:not(:first-child),
        +.btn-group > .dropdown-toggle:not(:first-child) {
        +  @include border-left-radius(0);
        +}
        +
        +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
        +.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:not(:last-child) {
        +  > .btn:last-child,
        +  > .dropdown-toggle {
        +    @include border-right-radius(0);
        +  }
        +}
        +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
        +  @include border-left-radius(0);
        +}
        +
        +// On active and open, don't show outline
        +.btn-group .dropdown-toggle:active,
        +.btn-group.open .dropdown-toggle {
        +  outline: 0;
        +}
        +
        +
        +// Sizing
        +//
        +// Remix the default button sizing classes into new ones for easier manipulation.
        +
        +.btn-group-xs > .btn { @extend .btn-xs; }
        +.btn-group-sm > .btn { @extend .btn-sm; }
        +.btn-group-lg > .btn { @extend .btn-lg; }
        +
        +
        +// Split button dropdowns
        +// ----------------------
        +
        +// Give the line between buttons some depth
        +.btn-group > .btn + .dropdown-toggle {
        +  padding-left: 8px;
        +  padding-right: 8px;
        +}
        +.btn-group > .btn-lg + .dropdown-toggle {
        +  padding-left: 12px;
        +  padding-right: 12px;
        +}
        +
        +// The clickable button for toggling the menu
        +// Remove the gradient and set the same inset shadow as the :active state
        +.btn-group.open .dropdown-toggle {
        +  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
        +
        +  // Show no shadow for `.btn-link` since it has no other button styles.
        +  &.btn-link {
        +    @include box-shadow(none);
        +  }
        +}
        +
        +
        +// Reposition the caret
        +.btn .caret {
        +  margin-left: 0;
        +}
        +// Carets in other button sizes
        +.btn-lg .caret {
        +  border-width: $caret-width-large $caret-width-large 0;
        +  border-bottom-width: 0;
        +}
        +// Upside down carets for .dropup
        +.dropup .btn-lg .caret {
        +  border-width: 0 $caret-width-large $caret-width-large;
        +}
        +
        +
        +// Vertical button groups
        +// ----------------------
        +
        +.btn-group-vertical {
        +  > .btn,
        +  > .btn-group,
        +  > .btn-group > .btn {
        +    display: block;
        +    float: none;
        +    width: 100%;
        +    max-width: 100%;
        +  }
        +
        +  // Clear floats so dropdown menus can be properly placed
        +  > .btn-group {
        +    @include clearfix;
        +    > .btn {
        +      float: none;
        +    }
        +  }
        +
        +  > .btn + .btn,
        +  > .btn + .btn-group,
        +  > .btn-group + .btn,
        +  > .btn-group + .btn-group {
        +    margin-top: -1px;
        +    margin-left: 0;
        +  }
        +}
        +
        +.btn-group-vertical > .btn {
        +  &:not(:first-child):not(:last-child) {
        +    border-radius: 0;
        +  }
        +  &:first-child:not(:last-child) {
        +    @include border-top-radius($btn-border-radius-base);
        +    @include border-bottom-radius(0);
        +  }
        +  &:last-child:not(:first-child) {
        +    @include border-top-radius(0);
        +    @include border-bottom-radius($btn-border-radius-base);
        +  }
        +}
        +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
        +  border-radius: 0;
        +}
        +.btn-group-vertical > .btn-group:first-child:not(:last-child) {
        +  > .btn:last-child,
        +  > .dropdown-toggle {
        +    @include border-bottom-radius(0);
        +  }
        +}
        +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
        +  @include border-top-radius(0);
        +}
        +
        +
        +// Justified button groups
        +// ----------------------
        +
        +.btn-group-justified {
        +  display: table;
        +  width: 100%;
        +  table-layout: fixed;
        +  border-collapse: separate;
        +  > .btn,
        +  > .btn-group {
        +    float: none;
        +    display: table-cell;
        +    width: 1%;
        +  }
        +  > .btn-group .btn {
        +    width: 100%;
        +  }
        +
        +  > .btn-group .dropdown-menu {
        +    left: auto;
        +  }
        +}
        +
        +
        +// Checkbox and radio options
        +//
        +// In order to support the browser's form validation feedback, powered by the
        +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
        +// `display: none;` or `visibility: hidden;` as that also hides the popover.
        +// Simply visually hiding the inputs via `opacity` would leave them clickable in
        +// certain cases which is prevented by using `clip` and `pointer-events`.
        +// This way, we ensure a DOM element is visible to position the popover from.
        +//
        +// See https://github.com/twbs/bootstrap/pull/12794 and
        +// https://github.com/twbs/bootstrap/pull/14559 for more information.
        +
        +[data-toggle="buttons"] {
        +  > .btn,
        +  > .btn-group > .btn {
        +    input[type="radio"],
        +    input[type="checkbox"] {
        +      position: absolute;
        +      clip: rect(0,0,0,0);
        +      pointer-events: none;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_buttons.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_buttons.scss
        new file mode 100644
        index 0000000000..6452b709f1
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_buttons.scss
        @@ -0,0 +1,168 @@
        +//
        +// Buttons
        +// --------------------------------------------------
        +
        +
        +// Base styles
        +// --------------------------------------------------
        +
        +.btn {
        +  display: inline-block;
        +  margin-bottom: 0; // For input.btn
        +  font-weight: $btn-font-weight;
        +  text-align: center;
        +  vertical-align: middle;
        +  touch-action: manipulation;
        +  cursor: pointer;
        +  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
        +  border: 1px solid transparent;
        +  white-space: nowrap;
        +  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);
        +  @include user-select(none);
        +
        +  &,
        +  &:active,
        +  &.active {
        +    &:focus,
        +    &.focus {
        +      @include tab-focus;
        +    }
        +  }
        +
        +  &:hover,
        +  &:focus,
        +  &.focus {
        +    color: $btn-default-color;
        +    text-decoration: none;
        +  }
        +
        +  &:active,
        +  &.active {
        +    outline: 0;
        +    background-image: none;
        +    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
        +  }
        +
        +  &.disabled,
        +  &[disabled],
        +  fieldset[disabled] & {
        +    cursor: $cursor-disabled;
        +    @include opacity(.65);
        +    @include box-shadow(none);
        +  }
        +
        +  // [converter] extracted a& to a.btn
        +}
        +
        +a.btn {
        +  &.disabled,
        +  fieldset[disabled] & {
        +    pointer-events: none; // Future-proof disabling of clicks on `<a>` elements
        +  }
        +}
        +
        +
        +// Alternate buttons
        +// --------------------------------------------------
        +
        +.btn-default {
        +  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
        +}
        +.btn-primary {
        +  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
        +}
        +// Success appears as green
        +.btn-success {
        +  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
        +}
        +// Info appears as blue-green
        +.btn-info {
        +  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
        +}
        +// Warning appears as orange
        +.btn-warning {
        +  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
        +}
        +// Danger and error appear as red
        +.btn-danger {
        +  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
        +}
        +
        +
        +// Link buttons
        +// -------------------------
        +
        +// Make a button look and behave like a link
        +.btn-link {
        +  color: $link-color;
        +  font-weight: normal;
        +  border-radius: 0;
        +
        +  &,
        +  &:active,
        +  &.active,
        +  &[disabled],
        +  fieldset[disabled] & {
        +    background-color: transparent;
        +    @include box-shadow(none);
        +  }
        +  &,
        +  &:hover,
        +  &:focus,
        +  &:active {
        +    border-color: transparent;
        +  }
        +  &:hover,
        +  &:focus {
        +    color: $link-hover-color;
        +    text-decoration: $link-hover-decoration;
        +    background-color: transparent;
        +  }
        +  &[disabled],
        +  fieldset[disabled] & {
        +    &:hover,
        +    &:focus {
        +      color: $btn-link-disabled-color;
        +      text-decoration: none;
        +    }
        +  }
        +}
        +
        +
        +// Button Sizes
        +// --------------------------------------------------
        +
        +.btn-lg {
        +  // line-height: ensure even-numbered height of button next to large input
        +  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);
        +}
        +.btn-sm {
        +  // line-height: ensure proper height of button next to small input
        +  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
        +}
        +.btn-xs {
        +  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
        +}
        +
        +
        +// Block button
        +// --------------------------------------------------
        +
        +.btn-block {
        +  display: block;
        +  width: 100%;
        +}
        +
        +// Vertically space out multiple block buttons
        +.btn-block + .btn-block {
        +  margin-top: 5px;
        +}
        +
        +// Specificity overrides
        +input[type="submit"],
        +input[type="reset"],
        +input[type="button"] {
        +  &.btn-block {
        +    width: 100%;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_carousel.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_carousel.scss
        new file mode 100644
        index 0000000000..753d881f45
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_carousel.scss
        @@ -0,0 +1,270 @@
        +//
        +// Carousel
        +// --------------------------------------------------
        +
        +
        +// Wrapper for the slide container and indicators
        +.carousel {
        +  position: relative;
        +}
        +
        +.carousel-inner {
        +  position: relative;
        +  overflow: hidden;
        +  width: 100%;
        +
        +  > .item {
        +    display: none;
        +    position: relative;
        +    @include transition(.6s ease-in-out left);
        +
        +    // Account for jankitude on images
        +    > img,
        +    > a > img {
        +      @include img-responsive;
        +      line-height: 1;
        +    }
        +
        +    // WebKit CSS3 transforms for supported devices
        +    @media all and (transform-3d), (-webkit-transform-3d) {
        +      @include transition-transform(0.6s ease-in-out);
        +      @include backface-visibility(hidden);
        +      @include perspective(1000px);
        +
        +      &.next,
        +      &.active.right {
        +        @include translate3d(100%, 0, 0);
        +        left: 0;
        +      }
        +      &.prev,
        +      &.active.left {
        +        @include translate3d(-100%, 0, 0);
        +        left: 0;
        +      }
        +      &.next.left,
        +      &.prev.right,
        +      &.active {
        +        @include translate3d(0, 0, 0);
        +        left: 0;
        +      }
        +    }
        +  }
        +
        +  > .active,
        +  > .next,
        +  > .prev {
        +    display: block;
        +  }
        +
        +  > .active {
        +    left: 0;
        +  }
        +
        +  > .next,
        +  > .prev {
        +    position: absolute;
        +    top: 0;
        +    width: 100%;
        +  }
        +
        +  > .next {
        +    left: 100%;
        +  }
        +  > .prev {
        +    left: -100%;
        +  }
        +  > .next.left,
        +  > .prev.right {
        +    left: 0;
        +  }
        +
        +  > .active.left {
        +    left: -100%;
        +  }
        +  > .active.right {
        +    left: 100%;
        +  }
        +
        +}
        +
        +// Left/right controls for nav
        +// ---------------------------
        +
        +.carousel-control {
        +  position: absolute;
        +  top: 0;
        +  left: 0;
        +  bottom: 0;
        +  width: $carousel-control-width;
        +  @include opacity($carousel-control-opacity);
        +  font-size: $carousel-control-font-size;
        +  color: $carousel-control-color;
        +  text-align: center;
        +  text-shadow: $carousel-text-shadow;
        +  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug
        +  // We can't have this transition here because WebKit cancels the carousel
        +  // animation if you trip this while in the middle of another animation.
        +
        +  // Set gradients for backgrounds
        +  &.left {
        +    @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
        +  }
        +  &.right {
        +    left: auto;
        +    right: 0;
        +    @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
        +  }
        +
        +  // Hover/focus state
        +  &:hover,
        +  &:focus {
        +    outline: 0;
        +    color: $carousel-control-color;
        +    text-decoration: none;
        +    @include opacity(.9);
        +  }
        +
        +  // Toggles
        +  .icon-prev,
        +  .icon-next,
        +  .glyphicon-chevron-left,
        +  .glyphicon-chevron-right {
        +    position: absolute;
        +    top: 50%;
        +    margin-top: -10px;
        +    z-index: 5;
        +    display: inline-block;
        +  }
        +  .icon-prev,
        +  .glyphicon-chevron-left {
        +    left: 50%;
        +    margin-left: -10px;
        +  }
        +  .icon-next,
        +  .glyphicon-chevron-right {
        +    right: 50%;
        +    margin-right: -10px;
        +  }
        +  .icon-prev,
        +  .icon-next {
        +    width:  20px;
        +    height: 20px;
        +    line-height: 1;
        +    font-family: serif;
        +  }
        +
        +
        +  .icon-prev {
        +    &:before {
        +      content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
        +    }
        +  }
        +  .icon-next {
        +    &:before {
        +      content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
        +    }
        +  }
        +}
        +
        +// Optional indicator pips
        +//
        +// Add an unordered list with the following class and add a list item for each
        +// slide your carousel holds.
        +
        +.carousel-indicators {
        +  position: absolute;
        +  bottom: 10px;
        +  left: 50%;
        +  z-index: 15;
        +  width: 60%;
        +  margin-left: -30%;
        +  padding-left: 0;
        +  list-style: none;
        +  text-align: center;
        +
        +  li {
        +    display: inline-block;
        +    width:  10px;
        +    height: 10px;
        +    margin: 1px;
        +    text-indent: -999px;
        +    border: 1px solid $carousel-indicator-border-color;
        +    border-radius: 10px;
        +    cursor: pointer;
        +
        +    // IE8-9 hack for event handling
        +    //
        +    // Internet Explorer 8-9 does not support clicks on elements without a set
        +    // `background-color`. We cannot use `filter` since that's not viewed as a
        +    // background color by the browser. Thus, a hack is needed.
        +    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
        +    //
        +    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
        +    // set alpha transparency for the best results possible.
        +    background-color: #000 \9; // IE8
        +    background-color: rgba(0,0,0,0); // IE9
        +  }
        +  .active {
        +    margin: 0;
        +    width:  12px;
        +    height: 12px;
        +    background-color: $carousel-indicator-active-bg;
        +  }
        +}
        +
        +// Optional captions
        +// -----------------------------
        +// Hidden by default for smaller viewports
        +.carousel-caption {
        +  position: absolute;
        +  left: 15%;
        +  right: 15%;
        +  bottom: 20px;
        +  z-index: 10;
        +  padding-top: 20px;
        +  padding-bottom: 20px;
        +  color: $carousel-caption-color;
        +  text-align: center;
        +  text-shadow: $carousel-text-shadow;
        +  & .btn {
        +    text-shadow: none; // No shadow for button elements in carousel-caption
        +  }
        +}
        +
        +
        +// Scale up controls for tablets and up
        +@media screen and (min-width: $screen-sm-min) {
        +
        +  // Scale up the controls a smidge
        +  .carousel-control {
        +    .glyphicon-chevron-left,
        +    .glyphicon-chevron-right,
        +    .icon-prev,
        +    .icon-next {
        +      width: ($carousel-control-font-size * 1.5);
        +      height: ($carousel-control-font-size * 1.5);
        +      margin-top: ($carousel-control-font-size / -2);
        +      font-size: ($carousel-control-font-size * 1.5);
        +    }
        +    .glyphicon-chevron-left,
        +    .icon-prev {
        +      margin-left: ($carousel-control-font-size / -2);
        +    }
        +    .glyphicon-chevron-right,
        +    .icon-next {
        +      margin-right: ($carousel-control-font-size / -2);
        +    }
        +  }
        +
        +  // Show and left align the captions
        +  .carousel-caption {
        +    left: 20%;
        +    right: 20%;
        +    padding-bottom: 30px;
        +  }
        +
        +  // Move up the indicators
        +  .carousel-indicators {
        +    bottom: 20px;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_close.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_close.scss
        new file mode 100644
        index 0000000000..3b74d8a973
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_close.scss
        @@ -0,0 +1,36 @@
        +//
        +// Close icons
        +// --------------------------------------------------
        +
        +
        +.close {
        +  float: right;
        +  font-size: ($font-size-base * 1.5);
        +  font-weight: $close-font-weight;
        +  line-height: 1;
        +  color: $close-color;
        +  text-shadow: $close-text-shadow;
        +  @include opacity(.2);
        +
        +  &:hover,
        +  &:focus {
        +    color: $close-color;
        +    text-decoration: none;
        +    cursor: pointer;
        +    @include opacity(.5);
        +  }
        +
        +  // [converter] extracted button& to button.close
        +}
        +
        +// Additional properties for button version
        +// iOS requires the button element instead of an anchor tag.
        +// If you want the anchor version, it requires `href="#"`.
        +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
        +button.close {
        +  padding: 0;
        +  cursor: pointer;
        +  background: transparent;
        +  border: 0;
        +  -webkit-appearance: none;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_code.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_code.scss
        new file mode 100644
        index 0000000000..caa5f06304
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_code.scss
        @@ -0,0 +1,69 @@
        +//
        +// Code (inline and block)
        +// --------------------------------------------------
        +
        +
        +// Inline and block code styles
        +code,
        +kbd,
        +pre,
        +samp {
        +  font-family: $font-family-monospace;
        +}
        +
        +// Inline code
        +code {
        +  padding: 2px 4px;
        +  font-size: 90%;
        +  color: $code-color;
        +  background-color: $code-bg;
        +  border-radius: $border-radius-base;
        +}
        +
        +// User input typically entered via keyboard
        +kbd {
        +  padding: 2px 4px;
        +  font-size: 90%;
        +  color: $kbd-color;
        +  background-color: $kbd-bg;
        +  border-radius: $border-radius-small;
        +  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
        +
        +  kbd {
        +    padding: 0;
        +    font-size: 100%;
        +    font-weight: bold;
        +    box-shadow: none;
        +  }
        +}
        +
        +// Blocks of code
        +pre {
        +  display: block;
        +  padding: (($line-height-computed - 1) / 2);
        +  margin: 0 0 ($line-height-computed / 2);
        +  font-size: ($font-size-base - 1); // 14px to 13px
        +  line-height: $line-height-base;
        +  word-break: break-all;
        +  word-wrap: break-word;
        +  color: $pre-color;
        +  background-color: $pre-bg;
        +  border: 1px solid $pre-border-color;
        +  border-radius: $border-radius-base;
        +
        +  // Account for some code outputs that place code tags in pre tags
        +  code {
        +    padding: 0;
        +    font-size: inherit;
        +    color: inherit;
        +    white-space: pre-wrap;
        +    background-color: transparent;
        +    border-radius: 0;
        +  }
        +}
        +
        +// Enable scrollable blocks of code
        +.pre-scrollable {
        +  max-height: $pre-scrollable-max-height;
        +  overflow-y: scroll;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_component-animations.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_component-animations.scss
        new file mode 100644
        index 0000000000..ca3b43ca78
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_component-animations.scss
        @@ -0,0 +1,37 @@
        +//
        +// Component animations
        +// --------------------------------------------------
        +
        +// Heads up!
        +//
        +// We don't use the `.opacity()` mixin here since it causes a bug with text
        +// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
        +
        +.fade {
        +  opacity: 0;
        +  @include transition(opacity .15s linear);
        +  &.in {
        +    opacity: 1;
        +  }
        +}
        +
        +.collapse {
        +  display: none;
        +
        +  &.in      { display: block; }
        +  // [converter] extracted tr&.in to tr.collapse.in
        +  // [converter] extracted tbody&.in to tbody.collapse.in
        +}
        +
        +tr.collapse.in    { display: table-row; }
        +
        +tbody.collapse.in { display: table-row-group; }
        +
        +.collapsing {
        +  position: relative;
        +  height: 0;
        +  overflow: hidden;
        +  @include transition-property(height, visibility);
        +  @include transition-duration(.35s);
        +  @include transition-timing-function(ease);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_dropdowns.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_dropdowns.scss
        new file mode 100644
        index 0000000000..aac84597a4
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_dropdowns.scss
        @@ -0,0 +1,216 @@
        +//
        +// Dropdown menus
        +// --------------------------------------------------
        +
        +
        +// Dropdown arrow/caret
        +.caret {
        +  display: inline-block;
        +  width: 0;
        +  height: 0;
        +  margin-left: 2px;
        +  vertical-align: middle;
        +  border-top:   $caret-width-base dashed;
        +  border-top:   $caret-width-base solid \9; // IE8
        +  border-right: $caret-width-base solid transparent;
        +  border-left:  $caret-width-base solid transparent;
        +}
        +
        +// The dropdown wrapper (div)
        +.dropup,
        +.dropdown {
        +  position: relative;
        +}
        +
        +// Prevent the focus on the dropdown toggle when closing dropdowns
        +.dropdown-toggle:focus {
        +  outline: 0;
        +}
        +
        +// The dropdown menu (ul)
        +.dropdown-menu {
        +  position: absolute;
        +  top: 100%;
        +  left: 0;
        +  z-index: $zindex-dropdown;
        +  display: none; // none by default, but block on "open" of the menu
        +  float: left;
        +  min-width: 160px;
        +  padding: 5px 0;
        +  margin: 2px 0 0; // override default ul
        +  list-style: none;
        +  font-size: $font-size-base;
        +  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
        +  background-color: $dropdown-bg;
        +  border: 1px solid $dropdown-fallback-border; // IE8 fallback
        +  border: 1px solid $dropdown-border;
        +  border-radius: $border-radius-base;
        +  @include box-shadow(0 6px 12px rgba(0,0,0,.175));
        +  background-clip: padding-box;
        +
        +  // Aligns the dropdown menu to right
        +  //
        +  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
        +  &.pull-right {
        +    right: 0;
        +    left: auto;
        +  }
        +
        +  // Dividers (basically an hr) within the dropdown
        +  .divider {
        +    @include nav-divider($dropdown-divider-bg);
        +  }
        +
        +  // Links within the dropdown menu
        +  > li > a {
        +    display: block;
        +    padding: 3px 20px;
        +    clear: both;
        +    font-weight: normal;
        +    line-height: $line-height-base;
        +    color: $dropdown-link-color;
        +    white-space: nowrap; // prevent links from randomly breaking onto new lines
        +  }
        +}
        +
        +// Hover/Focus state
        +.dropdown-menu > li > a {
        +  &:hover,
        +  &:focus {
        +    text-decoration: none;
        +    color: $dropdown-link-hover-color;
        +    background-color: $dropdown-link-hover-bg;
        +  }
        +}
        +
        +// Active state
        +.dropdown-menu > .active > a {
        +  &,
        +  &:hover,
        +  &:focus {
        +    color: $dropdown-link-active-color;
        +    text-decoration: none;
        +    outline: 0;
        +    background-color: $dropdown-link-active-bg;
        +  }
        +}
        +
        +// Disabled state
        +//
        +// Gray out text and ensure the hover/focus state remains gray
        +
        +.dropdown-menu > .disabled > a {
        +  &,
        +  &:hover,
        +  &:focus {
        +    color: $dropdown-link-disabled-color;
        +  }
        +
        +  // Nuke hover/focus effects
        +  &:hover,
        +  &:focus {
        +    text-decoration: none;
        +    background-color: transparent;
        +    background-image: none; // Remove CSS gradient
        +    @include reset-filter;
        +    cursor: $cursor-disabled;
        +  }
        +}
        +
        +// Open state for the dropdown
        +.open {
        +  // Show the menu
        +  > .dropdown-menu {
        +    display: block;
        +  }
        +
        +  // Remove the outline when :focus is triggered
        +  > a {
        +    outline: 0;
        +  }
        +}
        +
        +// Menu positioning
        +//
        +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
        +// menu with the parent.
        +.dropdown-menu-right {
        +  left: auto; // Reset the default from `.dropdown-menu`
        +  right: 0;
        +}
        +// With v3, we enabled auto-flipping if you have a dropdown within a right
        +// aligned nav component. To enable the undoing of that, we provide an override
        +// to restore the default dropdown menu alignment.
        +//
        +// This is only for left-aligning a dropdown menu within a `.navbar-right` or
        +// `.pull-right` nav component.
        +.dropdown-menu-left {
        +  left: 0;
        +  right: auto;
        +}
        +
        +// Dropdown section headers
        +.dropdown-header {
        +  display: block;
        +  padding: 3px 20px;
        +  font-size: $font-size-small;
        +  line-height: $line-height-base;
        +  color: $dropdown-header-color;
        +  white-space: nowrap; // as with > li > a
        +}
        +
        +// Backdrop to catch body clicks on mobile, etc.
        +.dropdown-backdrop {
        +  position: fixed;
        +  left: 0;
        +  right: 0;
        +  bottom: 0;
        +  top: 0;
        +  z-index: ($zindex-dropdown - 10);
        +}
        +
        +// Right aligned dropdowns
        +.pull-right > .dropdown-menu {
        +  right: 0;
        +  left: auto;
        +}
        +
        +// Allow for dropdowns to go bottom up (aka, dropup-menu)
        +//
        +// Just add .dropup after the standard .dropdown class and you're set, bro.
        +// TODO: abstract this so that the navbar fixed styles are not placed here?
        +
        +.dropup,
        +.navbar-fixed-bottom .dropdown {
        +  // Reverse the caret
        +  .caret {
        +    border-top: 0;
        +    border-bottom: $caret-width-base dashed;
        +    border-bottom: $caret-width-base solid \9; // IE8
        +    content: "";
        +  }
        +  // Different positioning for bottom up menu
        +  .dropdown-menu {
        +    top: auto;
        +    bottom: 100%;
        +    margin-bottom: 2px;
        +  }
        +}
        +
        +
        +// Component alignment
        +//
        +// Reiterate per navbar.less and the modified component alignment there.
        +
        +@media (min-width: $grid-float-breakpoint) {
        +  .navbar-right {
        +    .dropdown-menu {
        +      right: 0; left: auto;
        +    }
        +    // Necessary for overrides of the default right aligned menu.
        +    // Will remove come v4 in all likelihood.
        +    .dropdown-menu-left {
        +      left: 0; right: auto;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_forms.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_forms.scss
        new file mode 100644
        index 0000000000..11ba1096c7
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_forms.scss
        @@ -0,0 +1,617 @@
        +//
        +// Forms
        +// --------------------------------------------------
        +
        +
        +// Normalize non-controls
        +//
        +// Restyle and baseline non-control form elements.
        +
        +fieldset {
        +  padding: 0;
        +  margin: 0;
        +  border: 0;
        +  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,
        +  // so we reset that to ensure it behaves more like a standard block element.
        +  // See https://github.com/twbs/bootstrap/issues/12359.
        +  min-width: 0;
        +}
        +
        +legend {
        +  display: block;
        +  width: 100%;
        +  padding: 0;
        +  margin-bottom: $line-height-computed;
        +  font-size: ($font-size-base * 1.5);
        +  line-height: inherit;
        +  color: $legend-color;
        +  border: 0;
        +  border-bottom: 1px solid $legend-border-color;
        +}
        +
        +label {
        +  display: inline-block;
        +  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
        +  margin-bottom: 5px;
        +  font-weight: bold;
        +}
        +
        +
        +// Normalize form controls
        +//
        +// While most of our form styles require extra classes, some basic normalization
        +// is required to ensure optimum display with or without those classes to better
        +// address browser inconsistencies.
        +
        +// Override content-box in Normalize (* isn't specific enough)
        +input[type="search"] {
        +  @include box-sizing(border-box);
        +}
        +
        +// Position radios and checkboxes better
        +input[type="radio"],
        +input[type="checkbox"] {
        +  margin: 4px 0 0;
        +  margin-top: 1px \9; // IE8-9
        +  line-height: normal;
        +}
        +
        +input[type="file"] {
        +  display: block;
        +}
        +
        +// Make range inputs behave like textual form controls
        +input[type="range"] {
        +  display: block;
        +  width: 100%;
        +}
        +
        +// Make multiple select elements height not fixed
        +select[multiple],
        +select[size] {
        +  height: auto;
        +}
        +
        +// Focus for file, radio, and checkbox
        +input[type="file"]:focus,
        +input[type="radio"]:focus,
        +input[type="checkbox"]:focus {
        +  @include tab-focus;
        +}
        +
        +// Adjust output element
        +output {
        +  display: block;
        +  padding-top: ($padding-base-vertical + 1);
        +  font-size: $font-size-base;
        +  line-height: $line-height-base;
        +  color: $input-color;
        +}
        +
        +
        +// Common form controls
        +//
        +// Shared size and type resets for form controls. Apply `.form-control` to any
        +// of the following form controls:
        +//
        +// select
        +// textarea
        +// input[type="text"]
        +// input[type="password"]
        +// input[type="datetime"]
        +// input[type="datetime-local"]
        +// input[type="date"]
        +// input[type="month"]
        +// input[type="time"]
        +// input[type="week"]
        +// input[type="number"]
        +// input[type="email"]
        +// input[type="url"]
        +// input[type="search"]
        +// input[type="tel"]
        +// input[type="color"]
        +
        +.form-control {
        +  display: block;
        +  width: 100%;
        +  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
        +  padding: $padding-base-vertical $padding-base-horizontal;
        +  font-size: $font-size-base;
        +  line-height: $line-height-base;
        +  color: $input-color;
        +  background-color: $input-bg;
        +  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
        +  border: 1px solid $input-border;
        +  border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
        +  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
        +  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
        +
        +  // Customize the `:focus` state to imitate native WebKit styles.
        +  @include form-control-focus;
        +
        +  // Placeholder
        +  @include placeholder;
        +
        +  // Unstyle the caret on `<select>`s in IE10+.
        +  &::-ms-expand {
        +    border: 0;
        +    background-color: transparent;
        +  }
        +
        +  // Disabled and read-only inputs
        +  //
        +  // HTML5 says that controls under a fieldset > legend:first-child won't be
        +  // disabled if the fieldset is disabled. Due to implementation difficulty, we
        +  // don't honor that edge case; we style them as disabled anyway.
        +  &[disabled],
        +  &[readonly],
        +  fieldset[disabled] & {
        +    background-color: $input-bg-disabled;
        +    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655
        +  }
        +
        +  &[disabled],
        +  fieldset[disabled] & {
        +    cursor: $cursor-disabled;
        +  }
        +
        +  // [converter] extracted textarea& to textarea.form-control
        +}
        +
        +// Reset height for `textarea`s
        +textarea.form-control {
        +  height: auto;
        +}
        +
        +
        +// Search inputs in iOS
        +//
        +// This overrides the extra rounded corners on search inputs in iOS so that our
        +// `.form-control` class can properly style them. Note that this cannot simply
        +// be added to `.form-control` as it's not specific enough. For details, see
        +// https://github.com/twbs/bootstrap/issues/11586.
        +
        +input[type="search"] {
        +  -webkit-appearance: none;
        +}
        +
        +
        +// Special styles for iOS temporal inputs
        +//
        +// In Mobile Safari, setting `display: block` on temporal inputs causes the
        +// text within the input to become vertically misaligned. As a workaround, we
        +// set a pixel line-height that matches the given height of the input, but only
        +// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
        +//
        +// Note that as of 8.3, iOS doesn't support `datetime` or `week`.
        +
        +@media screen and (-webkit-min-device-pixel-ratio: 0) {
        +  input[type="date"],
        +  input[type="time"],
        +  input[type="datetime-local"],
        +  input[type="month"] {
        +    &.form-control {
        +      line-height: $input-height-base;
        +    }
        +
        +    &.input-sm,
        +    .input-group-sm & {
        +      line-height: $input-height-small;
        +    }
        +
        +    &.input-lg,
        +    .input-group-lg & {
        +      line-height: $input-height-large;
        +    }
        +  }
        +}
        +
        +
        +// Form groups
        +//
        +// Designed to help with the organization and spacing of vertical forms. For
        +// horizontal forms, use the predefined grid classes.
        +
        +.form-group {
        +  margin-bottom: $form-group-margin-bottom;
        +}
        +
        +
        +// Checkboxes and radios
        +//
        +// Indent the labels to position radios/checkboxes as hanging controls.
        +
        +.radio,
        +.checkbox {
        +  position: relative;
        +  display: block;
        +  margin-top: 10px;
        +  margin-bottom: 10px;
        +
        +  label {
        +    min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text
        +    padding-left: 20px;
        +    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"] {
        +  position: absolute;
        +  margin-left: -20px;
        +  margin-top: 4px \9;
        +}
        +
        +.radio + .radio,
        +.checkbox + .checkbox {
        +  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
        +}
        +
        +// Radios and checkboxes on same line
        +.radio-inline,
        +.checkbox-inline {
        +  position: relative;
        +  display: inline-block;
        +  padding-left: 20px;
        +  margin-bottom: 0;
        +  vertical-align: middle;
        +  font-weight: normal;
        +  cursor: pointer;
        +}
        +.radio-inline + .radio-inline,
        +.checkbox-inline + .checkbox-inline {
        +  margin-top: 0;
        +  margin-left: 10px; // space out consecutive inline controls
        +}
        +
        +// Apply same disabled cursor tweak as for inputs
        +// Some special care is needed because <label>s don't inherit their parent's `cursor`.
        +//
        +// Note: Neither radios nor checkboxes can be readonly.
        +input[type="radio"],
        +input[type="checkbox"] {
        +  &[disabled],
        +  &.disabled,
        +  fieldset[disabled] & {
        +    cursor: $cursor-disabled;
        +  }
        +}
        +// These classes are used directly on <label>s
        +.radio-inline,
        +.checkbox-inline {
        +  &.disabled,
        +  fieldset[disabled] & {
        +    cursor: $cursor-disabled;
        +  }
        +}
        +// These classes are used on elements with <label> descendants
        +.radio,
        +.checkbox {
        +  &.disabled,
        +  fieldset[disabled] & {
        +    label {
        +      cursor: $cursor-disabled;
        +    }
        +  }
        +}
        +
        +
        +// Static form control text
        +//
        +// Apply class to a `p` element to make any string of text align with labels in
        +// a horizontal form layout.
        +
        +.form-control-static {
        +  // Size it appropriately next to real form controls
        +  padding-top: ($padding-base-vertical + 1);
        +  padding-bottom: ($padding-base-vertical + 1);
        +  // Remove default margin from `p`
        +  margin-bottom: 0;
        +  min-height: ($line-height-computed + $font-size-base);
        +
        +  &.input-lg,
        +  &.input-sm {
        +    padding-left: 0;
        +    padding-right: 0;
        +  }
        +}
        +
        +
        +// Form control sizing
        +//
        +// Build on `.form-control` with modifier classes to decrease or increase the
        +// height and font-size of form controls.
        +//
        +// The `.form-group-* form-control` variations are sadly duplicated to avoid the
        +// issue documented in https://github.com/twbs/bootstrap/issues/15074.
        +
        +@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);
        +.form-group-sm {
        +  .form-control {
        +    height: $input-height-small;
        +    padding: $padding-small-vertical $padding-small-horizontal;
        +    font-size: $font-size-small;
        +    line-height: $line-height-small;
        +    border-radius: $input-border-radius-small;
        +  }
        +  select.form-control {
        +    height: $input-height-small;
        +    line-height: $input-height-small;
        +  }
        +  textarea.form-control,
        +  select[multiple].form-control {
        +    height: auto;
        +  }
        +  .form-control-static {
        +    height: $input-height-small;
        +    min-height: ($line-height-computed + $font-size-small);
        +    padding: ($padding-small-vertical + 1) $padding-small-horizontal;
        +    font-size: $font-size-small;
        +    line-height: $line-height-small;
        +  }
        +}
        +
        +@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);
        +.form-group-lg {
        +  .form-control {
        +    height: $input-height-large;
        +    padding: $padding-large-vertical $padding-large-horizontal;
        +    font-size: $font-size-large;
        +    line-height: $line-height-large;
        +    border-radius: $input-border-radius-large;
        +  }
        +  select.form-control {
        +    height: $input-height-large;
        +    line-height: $input-height-large;
        +  }
        +  textarea.form-control,
        +  select[multiple].form-control {
        +    height: auto;
        +  }
        +  .form-control-static {
        +    height: $input-height-large;
        +    min-height: ($line-height-computed + $font-size-large);
        +    padding: ($padding-large-vertical + 1) $padding-large-horizontal;
        +    font-size: $font-size-large;
        +    line-height: $line-height-large;
        +  }
        +}
        +
        +
        +// Form control feedback states
        +//
        +// Apply contextual and semantic states to individual form controls.
        +
        +.has-feedback {
        +  // Enable absolute positioning
        +  position: relative;
        +
        +  // Ensure icons don't overlap text
        +  .form-control {
        +    padding-right: ($input-height-base * 1.25);
        +  }
        +}
        +// Feedback icon (requires .glyphicon classes)
        +.form-control-feedback {
        +  position: absolute;
        +  top: 0;
        +  right: 0;
        +  z-index: 2; // Ensure icon is above input groups
        +  display: block;
        +  width: $input-height-base;
        +  height: $input-height-base;
        +  line-height: $input-height-base;
        +  text-align: center;
        +  pointer-events: none;
        +}
        +.input-lg + .form-control-feedback,
        +.input-group-lg + .form-control-feedback,
        +.form-group-lg .form-control + .form-control-feedback {
        +  width: $input-height-large;
        +  height: $input-height-large;
        +  line-height: $input-height-large;
        +}
        +.input-sm + .form-control-feedback,
        +.input-group-sm + .form-control-feedback,
        +.form-group-sm .form-control + .form-control-feedback {
        +  width: $input-height-small;
        +  height: $input-height-small;
        +  line-height: $input-height-small;
        +}
        +
        +// Feedback states
        +.has-success {
        +  @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
        +}
        +.has-warning {
        +  @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
        +}
        +.has-error {
        +  @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
        +}
        +
        +// Reposition feedback icon if input has visible label above
        +.has-feedback label {
        +
        +  & ~ .form-control-feedback {
        +    top: ($line-height-computed + 5); // Height of the `label` and its margin
        +  }
        +  &.sr-only ~ .form-control-feedback {
        +    top: 0;
        +  }
        +}
        +
        +
        +// Help text
        +//
        +// Apply to any element you wish to create light text for placement immediately
        +// below a form control. Use for general help, formatting, or instructional text.
        +
        +.help-block {
        +  display: block; // account for any element using help-block
        +  margin-top: 5px;
        +  margin-bottom: 10px;
        +  color: lighten($text-color, 25%); // lighten the text some for contrast
        +}
        +
        +
        +// Inline forms
        +//
        +// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
        +// forms begin stacked on extra small (mobile) devices and then go inline when
        +// viewports reach <768px.
        +//
        +// Requires wrapping inputs and labels with `.form-group` for proper display of
        +// default HTML form controls and our custom form controls (e.g., input groups).
        +//
        +// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
        +
        +// [converter] extracted from `.form-inline` for libsass compatibility
        +@mixin form-inline {
        +
        +  // Kick in the inline
        +  @media (min-width: $screen-sm-min) {
        +    // Inline-block all the things for "inline"
        +    .form-group {
        +      display: inline-block;
        +      margin-bottom: 0;
        +      vertical-align: middle;
        +    }
        +
        +    // In navbar-form, allow folks to *not* use `.form-group`
        +    .form-control {
        +      display: inline-block;
        +      width: auto; // Prevent labels from stacking above inputs in `.form-group`
        +      vertical-align: middle;
        +    }
        +
        +    // Make static controls behave like regular ones
        +    .form-control-static {
        +      display: inline-block;
        +    }
        +
        +    .input-group {
        +      display: inline-table;
        +      vertical-align: middle;
        +
        +      .input-group-addon,
        +      .input-group-btn,
        +      .form-control {
        +        width: auto;
        +      }
        +    }
        +
        +    // Input groups need that 100% width though
        +    .input-group > .form-control {
        +      width: 100%;
        +    }
        +
        +    .control-label {
        +      margin-bottom: 0;
        +      vertical-align: middle;
        +    }
        +
        +    // Remove default margin on radios/checkboxes that were used for stacking, and
        +    // then undo the floating of radios and checkboxes to match.
        +    .radio,
        +    .checkbox {
        +      display: inline-block;
        +      margin-top: 0;
        +      margin-bottom: 0;
        +      vertical-align: middle;
        +
        +      label {
        +        padding-left: 0;
        +      }
        +    }
        +    .radio input[type="radio"],
        +    .checkbox input[type="checkbox"] {
        +      position: relative;
        +      margin-left: 0;
        +    }
        +
        +    // Re-override the feedback icon.
        +    .has-feedback .form-control-feedback {
        +      top: 0;
        +    }
        +  }
        +}
        +// [converter] extracted as `@mixin form-inline` for libsass compatibility
        +.form-inline {
        +  @include form-inline;
        +}
        +
        +
        +
        +// Horizontal forms
        +//
        +// Horizontal forms are built on grid classes and allow you to create forms with
        +// labels on the left and inputs on the right.
        +
        +.form-horizontal {
        +
        +  // Consistent vertical alignment of radios and checkboxes
        +  //
        +  // Labels also get some reset styles, but that is scoped to a media query below.
        +  .radio,
        +  .checkbox,
        +  .radio-inline,
        +  .checkbox-inline {
        +    margin-top: 0;
        +    margin-bottom: 0;
        +    padding-top: ($padding-base-vertical + 1); // Default padding plus a border
        +  }
        +  // Account for padding we're adding to ensure the alignment and of help text
        +  // and other content below items
        +  .radio,
        +  .checkbox {
        +    min-height: ($line-height-computed + ($padding-base-vertical + 1));
        +  }
        +
        +  // Make form groups behave like rows
        +  .form-group {
        +    @include make-row;
        +  }
        +
        +  // Reset spacing and right align labels, but scope to media queries so that
        +  // labels on narrow viewports stack the same as a default form example.
        +  @media (min-width: $screen-sm-min) {
        +    .control-label {
        +      text-align: right;
        +      margin-bottom: 0;
        +      padding-top: ($padding-base-vertical + 1); // Default padding plus a border
        +    }
        +  }
        +
        +  // Validation states
        +  //
        +  // Reposition the icon because it's now within a grid column and columns have
        +  // `position: relative;` on them. Also accounts for the grid gutter padding.
        +  .has-feedback .form-control-feedback {
        +    right: floor(($grid-gutter-width / 2));
        +  }
        +
        +  // Form group sizes
        +  //
        +  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the
        +  // inputs and labels within a `.form-group`.
        +  .form-group-lg {
        +    @media (min-width: $screen-sm-min) {
        +      .control-label {
        +        padding-top: ($padding-large-vertical + 1);
        +        font-size: $font-size-large;
        +      }
        +    }
        +  }
        +  .form-group-sm {
        +    @media (min-width: $screen-sm-min) {
        +      .control-label {
        +        padding-top: ($padding-small-vertical + 1);
        +        font-size: $font-size-small;
        +      }
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_glyphicons.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_glyphicons.scss
        new file mode 100644
        index 0000000000..07a0fc91fe
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_glyphicons.scss
        @@ -0,0 +1,307 @@
        +//
        +// Glyphicons for Bootstrap
        +//
        +// Since icons are fonts, they can be placed anywhere text is placed and are
        +// thus automatically sized to match the surrounding child. To use, create an
        +// inline element with the appropriate classes, like so:
        +//
        +// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
        +
        +@at-root {
        +  // Import the fonts
        +  @font-face {
        +    font-family: 'Glyphicons Halflings';
        +    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
        +    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
        +         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),
        +         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
        +         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
        +         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
        +  }
        +}
        +
        +// Catchall baseclass
        +.glyphicon {
        +  position: relative;
        +  top: 1px;
        +  display: inline-block;
        +  font-family: 'Glyphicons Halflings';
        +  font-style: normal;
        +  font-weight: normal;
        +  line-height: 1;
        +  -webkit-font-smoothing: antialiased;
        +  -moz-osx-font-smoothing: grayscale;
        +}
        +
        +// Individual icons
        +.glyphicon-asterisk               { &:before { content: "\002a"; } }
        +.glyphicon-plus                   { &:before { content: "\002b"; } }
        +.glyphicon-euro,
        +.glyphicon-eur                    { &: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"; } }
        +.glyphicon-cd                     { &:before { content: "\e201"; } }
        +.glyphicon-save-file              { &:before { content: "\e202"; } }
        +.glyphicon-open-file              { &:before { content: "\e203"; } }
        +.glyphicon-level-up               { &:before { content: "\e204"; } }
        +.glyphicon-copy                   { &:before { content: "\e205"; } }
        +.glyphicon-paste                  { &:before { content: "\e206"; } }
        +// The following 2 Glyphicons are omitted for the time being because
        +// they currently use Unicode codepoints that are outside the
        +// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
        +// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
        +// Notably, the bug affects some older versions of the Android Browser.
        +// More info: https://github.com/twbs/bootstrap/issues/10106
        +// .glyphicon-door                   { &:before { content: "\1f6aa"; } }
        +// .glyphicon-key                    { &:before { content: "\1f511"; } }
        +.glyphicon-alert                  { &:before { content: "\e209"; } }
        +.glyphicon-equalizer              { &:before { content: "\e210"; } }
        +.glyphicon-king                   { &:before { content: "\e211"; } }
        +.glyphicon-queen                  { &:before { content: "\e212"; } }
        +.glyphicon-pawn                   { &:before { content: "\e213"; } }
        +.glyphicon-bishop                 { &:before { content: "\e214"; } }
        +.glyphicon-knight                 { &:before { content: "\e215"; } }
        +.glyphicon-baby-formula           { &:before { content: "\e216"; } }
        +.glyphicon-tent                   { &:before { content: "\26fa"; } }
        +.glyphicon-blackboard             { &:before { content: "\e218"; } }
        +.glyphicon-bed                    { &:before { content: "\e219"; } }
        +.glyphicon-apple                  { &:before { content: "\f8ff"; } }
        +.glyphicon-erase                  { &:before { content: "\e221"; } }
        +.glyphicon-hourglass              { &:before { content: "\231b"; } }
        +.glyphicon-lamp                   { &:before { content: "\e223"; } }
        +.glyphicon-duplicate              { &:before { content: "\e224"; } }
        +.glyphicon-piggy-bank             { &:before { content: "\e225"; } }
        +.glyphicon-scissors               { &:before { content: "\e226"; } }
        +.glyphicon-bitcoin                { &:before { content: "\e227"; } }
        +.glyphicon-btc                    { &:before { content: "\e227"; } }
        +.glyphicon-xbt                    { &:before { content: "\e227"; } }
        +.glyphicon-yen                    { &:before { content: "\00a5"; } }
        +.glyphicon-jpy                    { &:before { content: "\00a5"; } }
        +.glyphicon-ruble                  { &:before { content: "\20bd"; } }
        +.glyphicon-rub                    { &:before { content: "\20bd"; } }
        +.glyphicon-scale                  { &:before { content: "\e230"; } }
        +.glyphicon-ice-lolly              { &:before { content: "\e231"; } }
        +.glyphicon-ice-lolly-tasted       { &:before { content: "\e232"; } }
        +.glyphicon-education              { &:before { content: "\e233"; } }
        +.glyphicon-option-horizontal      { &:before { content: "\e234"; } }
        +.glyphicon-option-vertical        { &:before { content: "\e235"; } }
        +.glyphicon-menu-hamburger         { &:before { content: "\e236"; } }
        +.glyphicon-modal-window           { &:before { content: "\e237"; } }
        +.glyphicon-oil                    { &:before { content: "\e238"; } }
        +.glyphicon-grain                  { &:before { content: "\e239"; } }
        +.glyphicon-sunglasses             { &:before { content: "\e240"; } }
        +.glyphicon-text-size              { &:before { content: "\e241"; } }
        +.glyphicon-text-color             { &:before { content: "\e242"; } }
        +.glyphicon-text-background        { &:before { content: "\e243"; } }
        +.glyphicon-object-align-top       { &:before { content: "\e244"; } }
        +.glyphicon-object-align-bottom    { &:before { content: "\e245"; } }
        +.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
        +.glyphicon-object-align-left      { &:before { content: "\e247"; } }
        +.glyphicon-object-align-vertical  { &:before { content: "\e248"; } }
        +.glyphicon-object-align-right     { &:before { content: "\e249"; } }
        +.glyphicon-triangle-right         { &:before { content: "\e250"; } }
        +.glyphicon-triangle-left          { &:before { content: "\e251"; } }
        +.glyphicon-triangle-bottom        { &:before { content: "\e252"; } }
        +.glyphicon-triangle-top           { &:before { content: "\e253"; } }
        +.glyphicon-console                { &:before { content: "\e254"; } }
        +.glyphicon-superscript            { &:before { content: "\e255"; } }
        +.glyphicon-subscript              { &:before { content: "\e256"; } }
        +.glyphicon-menu-left              { &:before { content: "\e257"; } }
        +.glyphicon-menu-right             { &:before { content: "\e258"; } }
        +.glyphicon-menu-down              { &:before { content: "\e259"; } }
        +.glyphicon-menu-up                { &:before { content: "\e260"; } }
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_grid.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_grid.scss
        new file mode 100644
        index 0000000000..b15ca27bb5
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_grid.scss
        @@ -0,0 +1,84 @@
        +//
        +// Grid system
        +// --------------------------------------------------
        +
        +
        +// Container widths
        +//
        +// Set the container width, and override it for fixed navbars in media queries.
        +
        +.container {
        +  @include container-fixed;
        +
        +  @media (min-width: $screen-sm-min) {
        +    width: $container-sm;
        +  }
        +  @media (min-width: $screen-md-min) {
        +    width: $container-md;
        +  }
        +  @media (min-width: $screen-lg-min) {
        +    width: $container-lg;
        +  }
        +}
        +
        +
        +// Fluid container
        +//
        +// Utilizes the mixin meant for fixed width containers, but without any defined
        +// width for fluid, full width layouts.
        +
        +.container-fluid {
        +  @include container-fixed;
        +}
        +
        +
        +// Row
        +//
        +// Rows contain and clear the floats of your columns.
        +
        +.row {
        +  @include make-row;
        +}
        +
        +
        +// Columns
        +//
        +// Common styles for small and large grid columns
        +
        +@include make-grid-columns;
        +
        +
        +// Extra small grid
        +//
        +// Columns, offsets, pushes, and pulls for extra small devices like
        +// smartphones.
        +
        +@include make-grid(xs);
        +
        +
        +// Small grid
        +//
        +// Columns, offsets, pushes, and pulls for the small device range, from phones
        +// to tablets.
        +
        +@media (min-width: $screen-sm-min) {
        +  @include make-grid(sm);
        +}
        +
        +
        +// Medium grid
        +//
        +// Columns, offsets, pushes, and pulls for the desktop device range.
        +
        +@media (min-width: $screen-md-min) {
        +  @include make-grid(md);
        +}
        +
        +
        +// Large grid
        +//
        +// Columns, offsets, pushes, and pulls for the large desktop device range.
        +
        +@media (min-width: $screen-lg-min) {
        +  @include make-grid(lg);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_input-groups.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_input-groups.scss
        new file mode 100644
        index 0000000000..f7c1d60139
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_input-groups.scss
        @@ -0,0 +1,171 @@
        +//
        +// Input groups
        +// --------------------------------------------------
        +
        +// Base styles
        +// -------------------------
        +.input-group {
        +  position: relative; // For dropdowns
        +  display: table;
        +  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
        +
        +  // Undo padding and float of grid classes
        +  &[class*="col-"] {
        +    float: none;
        +    padding-left: 0;
        +    padding-right: 0;
        +  }
        +
        +  .form-control {
        +    // Ensure that the input is always above the *appended* addon button for
        +    // proper border colors.
        +    position: relative;
        +    z-index: 2;
        +
        +    // IE9 fubars the placeholder attribute in text inputs and the arrows on
        +    // select elements in input groups. To fix it, we float the input. Details:
        +    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
        +    float: left;
        +
        +    width: 100%;
        +    margin-bottom: 0;
        +    
        +    &:focus {
        +      z-index: 3;
        +    }
        +  }
        +}
        +
        +// Sizing options
        +//
        +// Remix the default form control sizing classes into new ones for easier
        +// manipulation.
        +
        +.input-group-lg > .form-control,
        +.input-group-lg > .input-group-addon,
        +.input-group-lg > .input-group-btn > .btn {
        +  @extend .input-lg;
        +}
        +.input-group-sm > .form-control,
        +.input-group-sm > .input-group-addon,
        +.input-group-sm > .input-group-btn > .btn {
        +  @extend .input-sm;
        +}
        +
        +
        +// Display as table-cell
        +// -------------------------
        +.input-group-addon,
        +.input-group-btn,
        +.input-group .form-control {
        +  display: table-cell;
        +
        +  &:not(:first-child):not(:last-child) {
        +    border-radius: 0;
        +  }
        +}
        +// Addon and addon wrapper for buttons
        +.input-group-addon,
        +.input-group-btn {
        +  width: 1%;
        +  white-space: nowrap;
        +  vertical-align: middle; // Match the inputs
        +}
        +
        +// Text input groups
        +// -------------------------
        +.input-group-addon {
        +  padding: $padding-base-vertical $padding-base-horizontal;
        +  font-size: $font-size-base;
        +  font-weight: normal;
        +  line-height: 1;
        +  color: $input-color;
        +  text-align: center;
        +  background-color: $input-group-addon-bg;
        +  border: 1px solid $input-group-addon-border-color;
        +  border-radius: $input-border-radius;
        +
        +  // Sizing
        +  &.input-sm {
        +    padding: $padding-small-vertical $padding-small-horizontal;
        +    font-size: $font-size-small;
        +    border-radius: $input-border-radius-small;
        +  }
        +  &.input-lg {
        +    padding: $padding-large-vertical $padding-large-horizontal;
        +    font-size: $font-size-large;
        +    border-radius: $input-border-radius-large;
        +  }
        +
        +  // Nuke default margins from checkboxes and radios to vertically center within.
        +  input[type="radio"],
        +  input[type="checkbox"] {
        +    margin-top: 0;
        +  }
        +}
        +
        +// Reset rounded corners
        +.input-group .form-control:first-child,
        +.input-group-addon:first-child,
        +.input-group-btn:first-child > .btn,
        +.input-group-btn:first-child > .btn-group > .btn,
        +.input-group-btn:first-child > .dropdown-toggle,
        +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
        +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
        +  @include border-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 > .btn-group > .btn,
        +.input-group-btn:last-child > .dropdown-toggle,
        +.input-group-btn:first-child > .btn:not(:first-child),
        +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
        +  @include border-left-radius(0);
        +}
        +.input-group-addon:last-child {
        +  border-left: 0;
        +}
        +
        +// Button input groups
        +// -------------------------
        +.input-group-btn {
        +  position: relative;
        +  // Jankily prevent input button groups from wrapping with `white-space` and
        +  // `font-size` in combination with `inline-block` on buttons.
        +  font-size: 0;
        +  white-space: nowrap;
        +
        +  // Negative margin for spacing, position for bringing hovered/focused/actived
        +  // element above the siblings.
        +  > .btn {
        +    position: relative;
        +    + .btn {
        +      margin-left: -1px;
        +    }
        +    // Bring the "active" button to the front
        +    &:hover,
        +    &:focus,
        +    &:active {
        +      z-index: 2;
        +    }
        +  }
        +
        +  // Negative margin to only have a 1px border between the two
        +  &:first-child {
        +    > .btn,
        +    > .btn-group {
        +      margin-right: -1px;
        +    }
        +  }
        +  &:last-child {
        +    > .btn,
        +    > .btn-group {
        +      z-index: 2;
        +      margin-left: -1px;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_jumbotron.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_jumbotron.scss
        new file mode 100644
        index 0000000000..a27da4738f
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_jumbotron.scss
        @@ -0,0 +1,54 @@
        +//
        +// Jumbotron
        +// --------------------------------------------------
        +
        +
        +.jumbotron {
        +  padding-top:    $jumbotron-padding;
        +  padding-bottom: $jumbotron-padding;
        +  margin-bottom: $jumbotron-padding;
        +  color: $jumbotron-color;
        +  background-color: $jumbotron-bg;
        +
        +  h1,
        +  .h1 {
        +    color: $jumbotron-heading-color;
        +  }
        +
        +  p {
        +    margin-bottom: ($jumbotron-padding / 2);
        +    font-size: $jumbotron-font-size;
        +    font-weight: 200;
        +  }
        +
        +  > hr {
        +    border-top-color: darken($jumbotron-bg, 10%);
        +  }
        +
        +  .container &,
        +  .container-fluid & {
        +    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
        +    padding-left:  ($grid-gutter-width / 2);
        +    padding-right: ($grid-gutter-width / 2);
        +  }
        +
        +  .container {
        +    max-width: 100%;
        +  }
        +
        +  @media screen and (min-width: $screen-sm-min) {
        +    padding-top:    ($jumbotron-padding * 1.6);
        +    padding-bottom: ($jumbotron-padding * 1.6);
        +
        +    .container &,
        +    .container-fluid & {
        +      padding-left:  ($jumbotron-padding * 2);
        +      padding-right: ($jumbotron-padding * 2);
        +    }
        +
        +    h1,
        +    .h1 {
        +      font-size: $jumbotron-heading-font-size;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_labels.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_labels.scss
        new file mode 100644
        index 0000000000..42ed6ea123
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_labels.scss
        @@ -0,0 +1,66 @@
        +//
        +// Labels
        +// --------------------------------------------------
        +
        +.label {
        +  display: inline;
        +  padding: .2em .6em .3em;
        +  font-size: 75%;
        +  font-weight: bold;
        +  line-height: 1;
        +  color: $label-color;
        +  text-align: center;
        +  white-space: nowrap;
        +  vertical-align: baseline;
        +  border-radius: .25em;
        +
        +  // [converter] extracted a& to a.label
        +
        +  // Empty labels collapse automatically (not available in IE8)
        +  &:empty {
        +    display: none;
        +  }
        +
        +  // Quick fix for labels in buttons
        +  .btn & {
        +    position: relative;
        +    top: -1px;
        +  }
        +}
        +
        +// Add hover effects, but only for links
        +a.label {
        +  &:hover,
        +  &:focus {
        +    color: $label-link-hover-color;
        +    text-decoration: none;
        +    cursor: pointer;
        +  }
        +}
        +
        +// Colors
        +// Contextual variations (linked labels get darker on :hover)
        +
        +.label-default {
        +  @include label-variant($label-default-bg);
        +}
        +
        +.label-primary {
        +  @include label-variant($label-primary-bg);
        +}
        +
        +.label-success {
        +  @include label-variant($label-success-bg);
        +}
        +
        +.label-info {
        +  @include label-variant($label-info-bg);
        +}
        +
        +.label-warning {
        +  @include label-variant($label-warning-bg);
        +}
        +
        +.label-danger {
        +  @include label-variant($label-danger-bg);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_list-group.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_list-group.scss
        new file mode 100644
        index 0000000000..7cb83aab05
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_list-group.scss
        @@ -0,0 +1,130 @@
        +//
        +// List groups
        +// --------------------------------------------------
        +
        +
        +// Base class
        +//
        +// Easily usable on <ul>, <ol>, or <div>.
        +
        +.list-group {
        +  // No need to set list-style: none; since .list-group-item is block level
        +  margin-bottom: 20px;
        +  padding-left: 0; // reset padding because ul and ol
        +}
        +
        +
        +// Individual list items
        +//
        +// Use on `li`s or `div`s within the `.list-group` parent.
        +
        +.list-group-item {
        +  position: relative;
        +  display: block;
        +  padding: 10px 15px;
        +  // Place the border on the list items and negative margin up for better styling
        +  margin-bottom: -1px;
        +  background-color: $list-group-bg;
        +  border: 1px solid $list-group-border;
        +
        +  // Round the first and last items
        +  &:first-child {
        +    @include border-top-radius($list-group-border-radius);
        +  }
        +  &:last-child {
        +    margin-bottom: 0;
        +    @include border-bottom-radius($list-group-border-radius);
        +  }
        +}
        +
        +
        +// Interactive list items
        +//
        +// Use anchor or button elements instead of `li`s or `div`s to create interactive items.
        +// Includes an extra `.active` modifier class for showing selected items.
        +
        +a.list-group-item,
        +button.list-group-item {
        +  color: $list-group-link-color;
        +
        +  .list-group-item-heading {
        +    color: $list-group-link-heading-color;
        +  }
        +
        +  // Hover state
        +  &:hover,
        +  &:focus {
        +    text-decoration: none;
        +    color: $list-group-link-hover-color;
        +    background-color: $list-group-hover-bg;
        +  }
        +}
        +
        +button.list-group-item {
        +  width: 100%;
        +  text-align: left;
        +}
        +
        +.list-group-item {
        +  // Disabled state
        +  &.disabled,
        +  &.disabled:hover,
        +  &.disabled:focus {
        +    background-color: $list-group-disabled-bg;
        +    color: $list-group-disabled-color;
        +    cursor: $cursor-disabled;
        +
        +    // Force color to inherit for custom content
        +    .list-group-item-heading {
        +      color: inherit;
        +    }
        +    .list-group-item-text {
        +      color: $list-group-disabled-text-color;
        +    }
        +  }
        +
        +  // Active class on item itself, not parent
        +  &.active,
        +  &.active:hover,
        +  &.active:focus {
        +    z-index: 2; // Place active items above their siblings for proper border styling
        +    color: $list-group-active-color;
        +    background-color: $list-group-active-bg;
        +    border-color: $list-group-active-border;
        +
        +    // Force color to inherit for custom content
        +    .list-group-item-heading,
        +    .list-group-item-heading > small,
        +    .list-group-item-heading > .small {
        +      color: inherit;
        +    }
        +    .list-group-item-text {
        +      color: $list-group-active-text-color;
        +    }
        +  }
        +}
        +
        +
        +// Contextual variants
        +//
        +// Add modifier classes to change text and background color on individual items.
        +// Organizationally, this must come after the `:hover` states.
        +
        +@include list-group-item-variant(success, $state-success-bg, $state-success-text);
        +@include list-group-item-variant(info, $state-info-bg, $state-info-text);
        +@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
        +@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
        +
        +
        +// Custom content options
        +//
        +// Extra classes for creating well-formatted content within `.list-group-item`s.
        +
        +.list-group-item-heading {
        +  margin-top: 0;
        +  margin-bottom: 5px;
        +}
        +.list-group-item-text {
        +  margin-bottom: 0;
        +  line-height: 1.3;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_media.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_media.scss
        new file mode 100644
        index 0000000000..8c835e861e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_media.scss
        @@ -0,0 +1,66 @@
        +.media {
        +  // Proper spacing between instances of .media
        +  margin-top: 15px;
        +
        +  &:first-child {
        +    margin-top: 0;
        +  }
        +}
        +
        +.media,
        +.media-body {
        +  zoom: 1;
        +  overflow: hidden;
        +}
        +
        +.media-body {
        +  width: 10000px;
        +}
        +
        +.media-object {
        +  display: block;
        +
        +  // Fix collapse in webkit from max-width: 100% and display: table-cell.
        +  &.img-thumbnail {
        +    max-width: none;
        +  }
        +}
        +
        +.media-right,
        +.media > .pull-right {
        +  padding-left: 10px;
        +}
        +
        +.media-left,
        +.media > .pull-left {
        +  padding-right: 10px;
        +}
        +
        +.media-left,
        +.media-right,
        +.media-body {
        +  display: table-cell;
        +  vertical-align: top;
        +}
        +
        +.media-middle {
        +  vertical-align: middle;
        +}
        +
        +.media-bottom {
        +  vertical-align: bottom;
        +}
        +
        +// Reset margins on headings for tighter default spacing
        +.media-heading {
        +  margin-top: 0;
        +  margin-bottom: 5px;
        +}
        +
        +// Media list variation
        +//
        +// Undo default ul/ol styles
        +.media-list {
        +  padding-left: 0;
        +  list-style: none;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_mixins.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_mixins.scss
        new file mode 100644
        index 0000000000..78cd5aa0ff
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_mixins.scss
        @@ -0,0 +1,40 @@
        +// Mixins
        +// --------------------------------------------------
        +
        +// Utilities
        +@import "mixins/hide-text";
        +@import "mixins/opacity";
        +@import "mixins/image";
        +@import "mixins/labels";
        +@import "mixins/reset-filter";
        +@import "mixins/resize";
        +@import "mixins/responsive-visibility";
        +@import "mixins/size";
        +@import "mixins/tab-focus";
        +@import "mixins/reset-text";
        +@import "mixins/text-emphasis";
        +@import "mixins/text-overflow";
        +@import "mixins/vendor-prefixes";
        +
        +// Components
        +@import "mixins/alerts";
        +@import "mixins/buttons";
        +@import "mixins/panels";
        +@import "mixins/pagination";
        +@import "mixins/list-group";
        +@import "mixins/nav-divider";
        +@import "mixins/forms";
        +@import "mixins/progress-bar";
        +@import "mixins/table-row";
        +
        +// Skins
        +@import "mixins/background-variant";
        +@import "mixins/border-radius";
        +@import "mixins/gradients";
        +
        +// Layout
        +@import "mixins/clearfix";
        +@import "mixins/center-block";
        +@import "mixins/nav-vertical-align";
        +@import "mixins/grid-framework";
        +@import "mixins/grid";
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_modals.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_modals.scss
        new file mode 100644
        index 0000000000..823870f2a4
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_modals.scss
        @@ -0,0 +1,150 @@
        +//
        +// Modals
        +// --------------------------------------------------
        +
        +// .modal-open      - body class for killing the scroll
        +// .modal           - container to scroll within
        +// .modal-dialog    - positioning shell for the actual modal
        +// .modal-content   - actual modal w/ bg and corners and shit
        +
        +// Kill the scroll on the body
        +.modal-open {
        +  overflow: hidden;
        +}
        +
        +// Container that the modal scrolls within
        +.modal {
        +  display: none;
        +  overflow: hidden;
        +  position: fixed;
        +  top: 0;
        +  right: 0;
        +  bottom: 0;
        +  left: 0;
        +  z-index: $zindex-modal;
        +  -webkit-overflow-scrolling: touch;
        +
        +  // Prevent Chrome on Windows from adding a focus outline. For details, see
        +  // https://github.com/twbs/bootstrap/pull/10951.
        +  outline: 0;
        +
        +  // When fading in the modal, animate it to slide down
        +  &.fade .modal-dialog {
        +    @include translate(0, -25%);
        +    @include transition-transform(0.3s ease-out);
        +  }
        +  &.in .modal-dialog { @include translate(0, 0) }
        +}
        +.modal-open .modal {
        +  overflow-x: hidden;
        +  overflow-y: auto;
        +}
        +
        +// Shell div to position the modal with bottom padding
        +.modal-dialog {
        +  position: relative;
        +  width: auto;
        +  margin: 10px;
        +}
        +
        +// Actual modal
        +.modal-content {
        +  position: relative;
        +  background-color: $modal-content-bg;
        +  border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
        +  border: 1px solid $modal-content-border-color;
        +  border-radius: $border-radius-large;
        +  @include box-shadow(0 3px 9px rgba(0,0,0,.5));
        +  background-clip: padding-box;
        +  // Remove focus outline from opened modal
        +  outline: 0;
        +}
        +
        +// Modal background
        +.modal-backdrop {
        +  position: fixed;
        +  top: 0;
        +  right: 0;
        +  bottom: 0;
        +  left: 0;
        +  z-index: $zindex-modal-background;
        +  background-color: $modal-backdrop-bg;
        +  // Fade for backdrop
        +  &.fade { @include opacity(0); }
        +  &.in { @include opacity($modal-backdrop-opacity); }
        +}
        +
        +// Modal header
        +// Top section of the modal w/ title and dismiss
        +.modal-header {
        +  padding: $modal-title-padding;
        +  border-bottom: 1px solid $modal-header-border-color;
        +  @include clearfix;
        +}
        +// Close icon
        +.modal-header .close {
        +  margin-top: -2px;
        +}
        +
        +// Title text within header
        +.modal-title {
        +  margin: 0;
        +  line-height: $modal-title-line-height;
        +}
        +
        +// Modal body
        +// Where all modal content resides (sibling of .modal-header and .modal-footer)
        +.modal-body {
        +  position: relative;
        +  padding: $modal-inner-padding;
        +}
        +
        +// Footer (for actions)
        +.modal-footer {
        +  padding: $modal-inner-padding;
        +  text-align: right; // right align buttons
        +  border-top: 1px solid $modal-footer-border-color;
        +  @include clearfix; // clear it in case folks use .pull-* classes on buttons
        +
        +  // Properly space out buttons
        +  .btn + .btn {
        +    margin-left: 5px;
        +    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
        +  }
        +  // but override that for button groups
        +  .btn-group .btn + .btn {
        +    margin-left: -1px;
        +  }
        +  // and override it for block buttons as well
        +  .btn-block + .btn-block {
        +    margin-left: 0;
        +  }
        +}
        +
        +// Measure scrollbar width for padding body during modal show/hide
        +.modal-scrollbar-measure {
        +  position: absolute;
        +  top: -9999px;
        +  width: 50px;
        +  height: 50px;
        +  overflow: scroll;
        +}
        +
        +// Scale up the modal
        +@media (min-width: $screen-sm-min) {
        +  // Automatically set modal's width for larger viewports
        +  .modal-dialog {
        +    width: $modal-md;
        +    margin: 30px auto;
        +  }
        +  .modal-content {
        +    @include box-shadow(0 5px 15px rgba(0,0,0,.5));
        +  }
        +
        +  // Modal sizes
        +  .modal-sm { width: $modal-sm; }
        +}
        +
        +@media (min-width: $screen-md-min) {
        +  .modal-lg { width: $modal-lg; }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_navbar.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_navbar.scss
        new file mode 100644
        index 0000000000..11e5c01c15
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_navbar.scss
        @@ -0,0 +1,662 @@
        +//
        +// Navbars
        +// --------------------------------------------------
        +
        +
        +// Wrapper and base class
        +//
        +// Provide a static navbar from which we expand to create full-width, fixed, and
        +// other navbar variations.
        +
        +.navbar {
        +  position: relative;
        +  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
        +  margin-bottom: $navbar-margin-bottom;
        +  border: 1px solid transparent;
        +
        +  // Prevent floats from breaking the navbar
        +  @include clearfix;
        +
        +  @media (min-width: $grid-float-breakpoint) {
        +    border-radius: $navbar-border-radius;
        +  }
        +}
        +
        +
        +// Navbar heading
        +//
        +// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
        +// styling of responsive aspects.
        +
        +.navbar-header {
        +  @include clearfix;
        +
        +  @media (min-width: $grid-float-breakpoint) {
        +    float: left;
        +  }
        +}
        +
        +
        +// Navbar collapse (body)
        +//
        +// Group your navbar content into this for easy collapsing and expanding across
        +// various device sizes. By default, this content is collapsed when <768px, but
        +// will expand past that for a horizontal display.
        +//
        +// To start (on mobile devices) the navbar links, forms, and buttons are stacked
        +// vertically and include a `max-height` to overflow in case you have too much
        +// content for the user's viewport.
        +
        +.navbar-collapse {
        +  overflow-x: visible;
        +  padding-right: $navbar-padding-horizontal;
        +  padding-left:  $navbar-padding-horizontal;
        +  border-top: 1px solid transparent;
        +  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
        +  @include clearfix;
        +  -webkit-overflow-scrolling: touch;
        +
        +  &.in {
        +    overflow-y: auto;
        +  }
        +
        +  @media (min-width: $grid-float-breakpoint) {
        +    width: auto;
        +    border-top: 0;
        +    box-shadow: none;
        +
        +    &.collapse {
        +      display: block !important;
        +      height: auto !important;
        +      padding-bottom: 0; // Override default setting
        +      overflow: visible !important;
        +    }
        +
        +    &.in {
        +      overflow-y: visible;
        +    }
        +
        +    // Undo the collapse side padding for navbars with containers to ensure
        +    // alignment of right-aligned contents.
        +    .navbar-fixed-top &,
        +    .navbar-static-top &,
        +    .navbar-fixed-bottom & {
        +      padding-left: 0;
        +      padding-right: 0;
        +    }
        +  }
        +}
        +
        +.navbar-fixed-top,
        +.navbar-fixed-bottom {
        +  .navbar-collapse {
        +    max-height: $navbar-collapse-max-height;
        +
        +    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {
        +      max-height: 200px;
        +    }
        +  }
        +}
        +
        +
        +// Both navbar header and collapse
        +//
        +// When a container is present, change the behavior of the header and collapse.
        +
        +.container,
        +.container-fluid {
        +  > .navbar-header,
        +  > .navbar-collapse {
        +    margin-right: -$navbar-padding-horizontal;
        +    margin-left:  -$navbar-padding-horizontal;
        +
        +    @media (min-width: $grid-float-breakpoint) {
        +      margin-right: 0;
        +      margin-left:  0;
        +    }
        +  }
        +}
        +
        +
        +//
        +// Navbar alignment options
        +//
        +// Display the navbar across the entirety of the page or fixed it to the top or
        +// bottom of the page.
        +
        +// Static top (unfixed, but 100% wide) navbar
        +.navbar-static-top {
        +  z-index: $zindex-navbar;
        +  border-width: 0 0 1px;
        +
        +  @media (min-width: $grid-float-breakpoint) {
        +    border-radius: 0;
        +  }
        +}
        +
        +// Fix the top/bottom navbars when screen real estate supports it
        +.navbar-fixed-top,
        +.navbar-fixed-bottom {
        +  position: fixed;
        +  right: 0;
        +  left: 0;
        +  z-index: $zindex-navbar-fixed;
        +
        +  // Undo the rounded corners
        +  @media (min-width: $grid-float-breakpoint) {
        +    border-radius: 0;
        +  }
        +}
        +.navbar-fixed-top {
        +  top: 0;
        +  border-width: 0 0 1px;
        +}
        +.navbar-fixed-bottom {
        +  bottom: 0;
        +  margin-bottom: 0; // override .navbar defaults
        +  border-width: 1px 0 0;
        +}
        +
        +
        +// Brand/project name
        +
        +.navbar-brand {
        +  float: left;
        +  padding: $navbar-padding-vertical $navbar-padding-horizontal;
        +  font-size: $font-size-large;
        +  line-height: $line-height-computed;
        +  height: $navbar-height;
        +
        +  &:hover,
        +  &:focus {
        +    text-decoration: none;
        +  }
        +
        +  > img {
        +    display: block;
        +  }
        +
        +  @media (min-width: $grid-float-breakpoint) {
        +    .navbar > .container &,
        +    .navbar > .container-fluid & {
        +      margin-left: -$navbar-padding-horizontal;
        +    }
        +  }
        +}
        +
        +
        +// Navbar toggle
        +//
        +// Custom button for toggling the `.navbar-collapse`, powered by the collapse
        +// JavaScript plugin.
        +
        +.navbar-toggle {
        +  position: relative;
        +  float: right;
        +  margin-right: $navbar-padding-horizontal;
        +  padding: 9px 10px;
        +  @include navbar-vertical-align(34px);
        +  background-color: transparent;
        +  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
        +  border: 1px solid transparent;
        +  border-radius: $border-radius-base;
        +
        +  // We remove the `outline` here, but later compensate by attaching `:hover`
        +  // styles to `:focus`.
        +  &:focus {
        +    outline: 0;
        +  }
        +
        +  // Bars
        +  .icon-bar {
        +    display: block;
        +    width: 22px;
        +    height: 2px;
        +    border-radius: 1px;
        +  }
        +  .icon-bar + .icon-bar {
        +    margin-top: 4px;
        +  }
        +
        +  @media (min-width: $grid-float-breakpoint) {
        +    display: none;
        +  }
        +}
        +
        +
        +// Navbar nav links
        +//
        +// Builds on top of the `.nav` components with its own modifier class to make
        +// the nav the full height of the horizontal nav (above 768px).
        +
        +.navbar-nav {
        +  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
        +
        +  > li > a {
        +    padding-top:    10px;
        +    padding-bottom: 10px;
        +    line-height: $line-height-computed;
        +  }
        +
        +  @media (max-width: $grid-float-breakpoint-max) {
        +    // Dropdowns get custom display when collapsed
        +    .open .dropdown-menu {
        +      position: static;
        +      float: none;
        +      width: auto;
        +      margin-top: 0;
        +      background-color: transparent;
        +      border: 0;
        +      box-shadow: none;
        +      > li > a,
        +      .dropdown-header {
        +        padding: 5px 15px 5px 25px;
        +      }
        +      > li > a {
        +        line-height: $line-height-computed;
        +        &:hover,
        +        &:focus {
        +          background-image: none;
        +        }
        +      }
        +    }
        +  }
        +
        +  // Uncollapse the nav
        +  @media (min-width: $grid-float-breakpoint) {
        +    float: left;
        +    margin: 0;
        +
        +    > li {
        +      float: left;
        +      > a {
        +        padding-top:    $navbar-padding-vertical;
        +        padding-bottom: $navbar-padding-vertical;
        +      }
        +    }
        +  }
        +}
        +
        +
        +// Navbar form
        +//
        +// Extension of the `.form-inline` with some extra flavor for optimum display in
        +// our navbars.
        +
        +.navbar-form {
        +  margin-left: -$navbar-padding-horizontal;
        +  margin-right: -$navbar-padding-horizontal;
        +  padding: 10px $navbar-padding-horizontal;
        +  border-top: 1px solid transparent;
        +  border-bottom: 1px solid transparent;
        +  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
        +  @include box-shadow($shadow);
        +
        +  // Mixin behavior for optimum display
        +  @include form-inline;
        +
        +  .form-group {
        +    @media (max-width: $grid-float-breakpoint-max) {
        +      margin-bottom: 5px;
        +
        +      &:last-child {
        +        margin-bottom: 0;
        +      }
        +    }
        +  }
        +
        +  // Vertically center in expanded, horizontal navbar
        +  @include navbar-vertical-align($input-height-base);
        +
        +  // Undo 100% width for pull classes
        +  @media (min-width: $grid-float-breakpoint) {
        +    width: auto;
        +    border: 0;
        +    margin-left: 0;
        +    margin-right: 0;
        +    padding-top: 0;
        +    padding-bottom: 0;
        +    @include box-shadow(none);
        +  }
        +}
        +
        +
        +// Dropdown menus
        +
        +// Menu position and menu carets
        +.navbar-nav > li > .dropdown-menu {
        +  margin-top: 0;
        +  @include border-top-radius(0);
        +}
        +// Menu position and menu caret support for dropups via extra dropup class
        +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
        +  margin-bottom: 0;
        +  @include border-top-radius($navbar-border-radius);
        +  @include border-bottom-radius(0);
        +}
        +
        +
        +// Buttons in navbars
        +//
        +// Vertically center a button within a navbar (when *not* in a form).
        +
        +.navbar-btn {
        +  @include navbar-vertical-align($input-height-base);
        +
        +  &.btn-sm {
        +    @include navbar-vertical-align($input-height-small);
        +  }
        +  &.btn-xs {
        +    @include navbar-vertical-align(22);
        +  }
        +}
        +
        +
        +// Text in navbars
        +//
        +// Add a class to make any element properly align itself vertically within the navbars.
        +
        +.navbar-text {
        +  @include navbar-vertical-align($line-height-computed);
        +
        +  @media (min-width: $grid-float-breakpoint) {
        +    float: left;
        +    margin-left: $navbar-padding-horizontal;
        +    margin-right: $navbar-padding-horizontal;
        +  }
        +}
        +
        +
        +// Component alignment
        +//
        +// Repurpose the pull utilities as their own navbar utilities to avoid specificity
        +// issues with parents and chaining. Only do this when the navbar is uncollapsed
        +// though so that navbar contents properly stack and align in mobile.
        +//
        +// Declared after the navbar components to ensure more specificity on the margins.
        +
        +@media (min-width: $grid-float-breakpoint) {
        +  .navbar-left {
        +    float: left !important;
        +  }
        +  .navbar-right {
        +    float: right !important;
        +  margin-right: -$navbar-padding-horizontal;
        +
        +    ~ .navbar-right {
        +      margin-right: 0;
        +    }
        +  }
        +}
        +
        +
        +// Alternate navbars
        +// --------------------------------------------------
        +
        +// Default navbar
        +.navbar-default {
        +  background-color: $navbar-default-bg;
        +  border-color: $navbar-default-border;
        +
        +  .navbar-brand {
        +    color: $navbar-default-brand-color;
        +    &:hover,
        +    &:focus {
        +      color: $navbar-default-brand-hover-color;
        +      background-color: $navbar-default-brand-hover-bg;
        +    }
        +  }
        +
        +  .navbar-text {
        +    color: $navbar-default-color;
        +  }
        +
        +  .navbar-nav {
        +    > li > a {
        +      color: $navbar-default-link-color;
        +
        +      &:hover,
        +      &:focus {
        +        color: $navbar-default-link-hover-color;
        +        background-color: $navbar-default-link-hover-bg;
        +      }
        +    }
        +    > .active > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        color: $navbar-default-link-active-color;
        +        background-color: $navbar-default-link-active-bg;
        +      }
        +    }
        +    > .disabled > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        color: $navbar-default-link-disabled-color;
        +        background-color: $navbar-default-link-disabled-bg;
        +      }
        +    }
        +  }
        +
        +  .navbar-toggle {
        +    border-color: $navbar-default-toggle-border-color;
        +    &:hover,
        +    &:focus {
        +      background-color: $navbar-default-toggle-hover-bg;
        +    }
        +    .icon-bar {
        +      background-color: $navbar-default-toggle-icon-bar-bg;
        +    }
        +  }
        +
        +  .navbar-collapse,
        +  .navbar-form {
        +    border-color: $navbar-default-border;
        +  }
        +
        +  // Dropdown menu items
        +  .navbar-nav {
        +    // Remove background color from open dropdown
        +    > .open > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        background-color: $navbar-default-link-active-bg;
        +        color: $navbar-default-link-active-color;
        +      }
        +    }
        +
        +    @media (max-width: $grid-float-breakpoint-max) {
        +      // Dropdowns get custom display when collapsed
        +      .open .dropdown-menu {
        +        > li > a {
        +          color: $navbar-default-link-color;
        +          &:hover,
        +          &:focus {
        +            color: $navbar-default-link-hover-color;
        +            background-color: $navbar-default-link-hover-bg;
        +          }
        +        }
        +        > .active > a {
        +          &,
        +          &:hover,
        +          &:focus {
        +            color: $navbar-default-link-active-color;
        +            background-color: $navbar-default-link-active-bg;
        +          }
        +        }
        +        > .disabled > a {
        +          &,
        +          &:hover,
        +          &:focus {
        +            color: $navbar-default-link-disabled-color;
        +            background-color: $navbar-default-link-disabled-bg;
        +          }
        +        }
        +      }
        +    }
        +  }
        +
        +
        +  // Links in navbars
        +  //
        +  // Add a class to ensure links outside the navbar nav are colored correctly.
        +
        +  .navbar-link {
        +    color: $navbar-default-link-color;
        +    &:hover {
        +      color: $navbar-default-link-hover-color;
        +    }
        +  }
        +
        +  .btn-link {
        +    color: $navbar-default-link-color;
        +    &:hover,
        +    &:focus {
        +      color: $navbar-default-link-hover-color;
        +    }
        +    &[disabled],
        +    fieldset[disabled] & {
        +      &:hover,
        +      &:focus {
        +        color: $navbar-default-link-disabled-color;
        +      }
        +    }
        +  }
        +}
        +
        +// Inverse navbar
        +
        +.navbar-inverse {
        +  background-color: $navbar-inverse-bg;
        +  border-color: $navbar-inverse-border;
        +
        +  .navbar-brand {
        +    color: $navbar-inverse-brand-color;
        +    &:hover,
        +    &:focus {
        +      color: $navbar-inverse-brand-hover-color;
        +      background-color: $navbar-inverse-brand-hover-bg;
        +    }
        +  }
        +
        +  .navbar-text {
        +    color: $navbar-inverse-color;
        +  }
        +
        +  .navbar-nav {
        +    > li > a {
        +      color: $navbar-inverse-link-color;
        +
        +      &:hover,
        +      &:focus {
        +        color: $navbar-inverse-link-hover-color;
        +        background-color: $navbar-inverse-link-hover-bg;
        +      }
        +    }
        +    > .active > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        color: $navbar-inverse-link-active-color;
        +        background-color: $navbar-inverse-link-active-bg;
        +      }
        +    }
        +    > .disabled > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        color: $navbar-inverse-link-disabled-color;
        +        background-color: $navbar-inverse-link-disabled-bg;
        +      }
        +    }
        +  }
        +
        +  // Darken the responsive nav toggle
        +  .navbar-toggle {
        +    border-color: $navbar-inverse-toggle-border-color;
        +    &:hover,
        +    &:focus {
        +      background-color: $navbar-inverse-toggle-hover-bg;
        +    }
        +    .icon-bar {
        +      background-color: $navbar-inverse-toggle-icon-bar-bg;
        +    }
        +  }
        +
        +  .navbar-collapse,
        +  .navbar-form {
        +    border-color: darken($navbar-inverse-bg, 7%);
        +  }
        +
        +  // Dropdowns
        +  .navbar-nav {
        +    > .open > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        background-color: $navbar-inverse-link-active-bg;
        +        color: $navbar-inverse-link-active-color;
        +      }
        +    }
        +
        +    @media (max-width: $grid-float-breakpoint-max) {
        +      // Dropdowns get custom display
        +      .open .dropdown-menu {
        +        > .dropdown-header {
        +          border-color: $navbar-inverse-border;
        +        }
        +        .divider {
        +          background-color: $navbar-inverse-border;
        +        }
        +        > li > a {
        +          color: $navbar-inverse-link-color;
        +          &:hover,
        +          &:focus {
        +            color: $navbar-inverse-link-hover-color;
        +            background-color: $navbar-inverse-link-hover-bg;
        +          }
        +        }
        +        > .active > a {
        +          &,
        +          &:hover,
        +          &:focus {
        +            color: $navbar-inverse-link-active-color;
        +            background-color: $navbar-inverse-link-active-bg;
        +          }
        +        }
        +        > .disabled > a {
        +          &,
        +          &:hover,
        +          &:focus {
        +            color: $navbar-inverse-link-disabled-color;
        +            background-color: $navbar-inverse-link-disabled-bg;
        +          }
        +        }
        +      }
        +    }
        +  }
        +
        +  .navbar-link {
        +    color: $navbar-inverse-link-color;
        +    &:hover {
        +      color: $navbar-inverse-link-hover-color;
        +    }
        +  }
        +
        +  .btn-link {
        +    color: $navbar-inverse-link-color;
        +    &:hover,
        +    &:focus {
        +      color: $navbar-inverse-link-hover-color;
        +    }
        +    &[disabled],
        +    fieldset[disabled] & {
        +      &:hover,
        +      &:focus {
        +        color: $navbar-inverse-link-disabled-color;
        +      }
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_navs.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_navs.scss
        new file mode 100644
        index 0000000000..9d369f3079
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_navs.scss
        @@ -0,0 +1,242 @@
        +//
        +// Navs
        +// --------------------------------------------------
        +
        +
        +// Base class
        +// --------------------------------------------------
        +
        +.nav {
        +  margin-bottom: 0;
        +  padding-left: 0; // Override default ul/ol
        +  list-style: none;
        +  @include clearfix;
        +
        +  > li {
        +    position: relative;
        +    display: block;
        +
        +    > a {
        +      position: relative;
        +      display: block;
        +      padding: $nav-link-padding;
        +      &:hover,
        +      &:focus {
        +        text-decoration: none;
        +        background-color: $nav-link-hover-bg;
        +      }
        +    }
        +
        +    // Disabled state sets text to gray and nukes hover/tab effects
        +    &.disabled > a {
        +      color: $nav-disabled-link-color;
        +
        +      &:hover,
        +      &:focus {
        +        color: $nav-disabled-link-hover-color;
        +        text-decoration: none;
        +        background-color: transparent;
        +        cursor: $cursor-disabled;
        +      }
        +    }
        +  }
        +
        +  // Open dropdowns
        +  .open > a {
        +    &,
        +    &:hover,
        +    &:focus {
        +      background-color: $nav-link-hover-bg;
        +      border-color: $link-color;
        +    }
        +  }
        +
        +  // Nav dividers (deprecated with v3.0.1)
        +  //
        +  // This should have been removed in v3 with the dropping of `.nav-list`, but
        +  // we missed it. We don't currently support this anywhere, but in the interest
        +  // of maintaining backward compatibility in case you use it, it's deprecated.
        +  .nav-divider {
        +    @include nav-divider;
        +  }
        +
        +  // Prevent IE8 from misplacing imgs
        +  //
        +  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
        +  > li > a > img {
        +    max-width: none;
        +  }
        +}
        +
        +
        +// Tabs
        +// -------------------------
        +
        +// Give the tabs something to sit on
        +.nav-tabs {
        +  border-bottom: 1px solid $nav-tabs-border-color;
        +  > li {
        +    float: left;
        +    // Make the list-items overlay the bottom border
        +    margin-bottom: -1px;
        +
        +    // Actual tabs (as links)
        +    > a {
        +      margin-right: 2px;
        +      line-height: $line-height-base;
        +      border: 1px solid transparent;
        +      border-radius: $border-radius-base $border-radius-base 0 0;
        +      &:hover {
        +        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
        +      }
        +    }
        +
        +    // Active state, and its :hover to override normal :hover
        +    &.active > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        color: $nav-tabs-active-link-hover-color;
        +        background-color: $nav-tabs-active-link-hover-bg;
        +        border: 1px solid $nav-tabs-active-link-hover-border-color;
        +        border-bottom-color: transparent;
        +        cursor: default;
        +      }
        +    }
        +  }
        +  // pulling this in mainly for less shorthand
        +  &.nav-justified {
        +    @extend .nav-justified;
        +    @extend .nav-tabs-justified;
        +  }
        +}
        +
        +
        +// Pills
        +// -------------------------
        +.nav-pills {
        +  > li {
        +    float: left;
        +
        +    // Links rendered as pills
        +    > a {
        +      border-radius: $nav-pills-border-radius;
        +    }
        +    + li {
        +      margin-left: 2px;
        +    }
        +
        +    // Active state
        +    &.active > a {
        +      &,
        +      &:hover,
        +      &:focus {
        +        color: $nav-pills-active-link-hover-color;
        +        background-color: $nav-pills-active-link-hover-bg;
        +      }
        +    }
        +  }
        +}
        +
        +
        +// Stacked pills
        +.nav-stacked {
        +  > li {
        +    float: none;
        +    + li {
        +      margin-top: 2px;
        +      margin-left: 0; // no need for this gap between nav items
        +    }
        +  }
        +}
        +
        +
        +// Nav variations
        +// --------------------------------------------------
        +
        +// Justified nav links
        +// -------------------------
        +
        +.nav-justified {
        +  width: 100%;
        +
        +  > li {
        +    float: none;
        +    > a {
        +      text-align: center;
        +      margin-bottom: 5px;
        +    }
        +  }
        +
        +  > .dropdown .dropdown-menu {
        +    top: auto;
        +    left: auto;
        +  }
        +
        +  @media (min-width: $screen-sm-min) {
        +    > li {
        +      display: table-cell;
        +      width: 1%;
        +      > a {
        +        margin-bottom: 0;
        +      }
        +    }
        +  }
        +}
        +
        +// Move borders to anchors instead of bottom of list
        +//
        +// Mixin for adding on top the shared `.nav-justified` styles for our tabs
        +.nav-tabs-justified {
        +  border-bottom: 0;
        +
        +  > li > a {
        +    // Override margin from .nav-tabs
        +    margin-right: 0;
        +    border-radius: $border-radius-base;
        +  }
        +
        +  > .active > a,
        +  > .active > a:hover,
        +  > .active > a:focus {
        +    border: 1px solid $nav-tabs-justified-link-border-color;
        +  }
        +
        +  @media (min-width: $screen-sm-min) {
        +    > li > a {
        +      border-bottom: 1px solid $nav-tabs-justified-link-border-color;
        +      border-radius: $border-radius-base $border-radius-base 0 0;
        +    }
        +    > .active > a,
        +    > .active > a:hover,
        +    > .active > a:focus {
        +      border-bottom-color: $nav-tabs-justified-active-link-border-color;
        +    }
        +  }
        +}
        +
        +
        +// Tabbable tabs
        +// -------------------------
        +
        +// Hide tabbable panes to start, show them when `.active`
        +.tab-content {
        +  > .tab-pane {
        +    display: none;
        +  }
        +  > .active {
        +    display: block;
        +  }
        +}
        +
        +
        +// Dropdowns
        +// -------------------------
        +
        +// Specific dropdowns
        +.nav-tabs .dropdown-menu {
        +  // make dropdown border overlap tab border
        +  margin-top: -1px;
        +  // Remove the top rounded corners here since there is a hard edge above the menu
        +  @include border-top-radius(0);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_normalize.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_normalize.scss
        new file mode 100644
        index 0000000000..9dddf73ad2
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_normalize.scss
        @@ -0,0 +1,424 @@
        +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
        +
        +//
        +// 1. Set default font family to sans-serif.
        +// 2. Prevent iOS and IE text size adjust after device orientation change,
        +//    without disabling user zoom.
        +//
        +
        +html {
        +  font-family: sans-serif; // 1
        +  -ms-text-size-adjust: 100%; // 2
        +  -webkit-text-size-adjust: 100%; // 2
        +}
        +
        +//
        +// Remove default margin.
        +//
        +
        +body {
        +  margin: 0;
        +}
        +
        +// HTML5 display definitions
        +// ==========================================================================
        +
        +//
        +// Correct `block` display not defined for any HTML5 element in IE 8/9.
        +// Correct `block` display not defined for `details` or `summary` in IE 10/11
        +// and Firefox.
        +// Correct `block` display not defined for `main` in IE 11.
        +//
        +
        +article,
        +aside,
        +details,
        +figcaption,
        +figure,
        +footer,
        +header,
        +hgroup,
        +main,
        +menu,
        +nav,
        +section,
        +summary {
        +  display: block;
        +}
        +
        +//
        +// 1. Correct `inline-block` display not defined in IE 8/9.
        +// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
        +//
        +
        +audio,
        +canvas,
        +progress,
        +video {
        +  display: inline-block; // 1
        +  vertical-align: baseline; // 2
        +}
        +
        +//
        +// Prevent modern browsers from displaying `audio` without controls.
        +// Remove excess height in iOS 5 devices.
        +//
        +
        +audio:not([controls]) {
        +  display: none;
        +  height: 0;
        +}
        +
        +//
        +// Address `[hidden]` styling not present in IE 8/9/10.
        +// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
        +//
        +
        +[hidden],
        +template {
        +  display: none;
        +}
        +
        +// Links
        +// ==========================================================================
        +
        +//
        +// Remove the gray background color from active links in IE 10.
        +//
        +
        +a {
        +  background-color: transparent;
        +}
        +
        +//
        +// Improve readability of focused elements when they are also in an
        +// active/hover state.
        +//
        +
        +a:active,
        +a:hover {
        +  outline: 0;
        +}
        +
        +// Text-level semantics
        +// ==========================================================================
        +
        +//
        +// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
        +//
        +
        +abbr[title] {
        +  border-bottom: 1px dotted;
        +}
        +
        +//
        +// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
        +//
        +
        +b,
        +strong {
        +  font-weight: bold;
        +}
        +
        +//
        +// Address styling not present in Safari and Chrome.
        +//
        +
        +dfn {
        +  font-style: italic;
        +}
        +
        +//
        +// Address variable `h1` font-size and margin within `section` and `article`
        +// contexts in Firefox 4+, Safari, and Chrome.
        +//
        +
        +h1 {
        +  font-size: 2em;
        +  margin: 0.67em 0;
        +}
        +
        +//
        +// Address styling not present in IE 8/9.
        +//
        +
        +mark {
        +  background: #ff0;
        +  color: #000;
        +}
        +
        +//
        +// Address inconsistent and variable font size in all browsers.
        +//
        +
        +small {
        +  font-size: 80%;
        +}
        +
        +//
        +// Prevent `sub` and `sup` affecting `line-height` in all browsers.
        +//
        +
        +sub,
        +sup {
        +  font-size: 75%;
        +  line-height: 0;
        +  position: relative;
        +  vertical-align: baseline;
        +}
        +
        +sup {
        +  top: -0.5em;
        +}
        +
        +sub {
        +  bottom: -0.25em;
        +}
        +
        +// Embedded content
        +// ==========================================================================
        +
        +//
        +// Remove border when inside `a` element in IE 8/9/10.
        +//
        +
        +img {
        +  border: 0;
        +}
        +
        +//
        +// Correct overflow not hidden in IE 9/10/11.
        +//
        +
        +svg:not(:root) {
        +  overflow: hidden;
        +}
        +
        +// Grouping content
        +// ==========================================================================
        +
        +//
        +// Address margin not present in IE 8/9 and Safari.
        +//
        +
        +figure {
        +  margin: 1em 40px;
        +}
        +
        +//
        +// Address differences between Firefox and other browsers.
        +//
        +
        +hr {
        +  box-sizing: content-box;
        +  height: 0;
        +}
        +
        +//
        +// Contain overflow in all browsers.
        +//
        +
        +pre {
        +  overflow: auto;
        +}
        +
        +//
        +// Address odd `em`-unit font size rendering in all browsers.
        +//
        +
        +code,
        +kbd,
        +pre,
        +samp {
        +  font-family: monospace, monospace;
        +  font-size: 1em;
        +}
        +
        +// Forms
        +// ==========================================================================
        +
        +//
        +// Known limitation: by default, Chrome and Safari on OS X allow very limited
        +// styling of `select`, unless a `border` property is set.
        +//
        +
        +//
        +// 1. Correct color not being inherited.
        +//    Known issue: affects color of disabled elements.
        +// 2. Correct font properties not being inherited.
        +// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
        +//
        +
        +button,
        +input,
        +optgroup,
        +select,
        +textarea {
        +  color: inherit; // 1
        +  font: inherit; // 2
        +  margin: 0; // 3
        +}
        +
        +//
        +// Address `overflow` set to `hidden` in IE 8/9/10/11.
        +//
        +
        +button {
        +  overflow: visible;
        +}
        +
        +//
        +// Address inconsistent `text-transform` inheritance for `button` and `select`.
        +// All other form control elements do not inherit `text-transform` values.
        +// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
        +// Correct `select` style inheritance in Firefox.
        +//
        +
        +button,
        +select {
        +  text-transform: none;
        +}
        +
        +//
        +// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
        +//    and `video` controls.
        +// 2. Correct inability to style clickable `input` types in iOS.
        +// 3. Improve usability and consistency of cursor style between image-type
        +//    `input` and others.
        +//
        +
        +button,
        +html input[type="button"], // 1
        +input[type="reset"],
        +input[type="submit"] {
        +  -webkit-appearance: button; // 2
        +  cursor: pointer; // 3
        +}
        +
        +//
        +// Re-set default cursor for disabled elements.
        +//
        +
        +button[disabled],
        +html input[disabled] {
        +  cursor: default;
        +}
        +
        +//
        +// Remove inner padding and border in Firefox 4+.
        +//
        +
        +button::-moz-focus-inner,
        +input::-moz-focus-inner {
        +  border: 0;
        +  padding: 0;
        +}
        +
        +//
        +// Address Firefox 4+ setting `line-height` on `input` using `!important` in
        +// the UA stylesheet.
        +//
        +
        +input {
        +  line-height: normal;
        +}
        +
        +//
        +// It's recommended that you don't attempt to style these elements.
        +// Firefox's implementation doesn't respect box-sizing, padding, or width.
        +//
        +// 1. Address box sizing set to `content-box` in IE 8/9/10.
        +// 2. Remove excess padding in IE 8/9/10.
        +//
        +
        +input[type="checkbox"],
        +input[type="radio"] {
        +  box-sizing: border-box; // 1
        +  padding: 0; // 2
        +}
        +
        +//
        +// Fix the cursor style for Chrome's increment/decrement buttons. For certain
        +// `font-size` values of the `input`, it causes the cursor style of the
        +// decrement button to change from `default` to `text`.
        +//
        +
        +input[type="number"]::-webkit-inner-spin-button,
        +input[type="number"]::-webkit-outer-spin-button {
        +  height: auto;
        +}
        +
        +//
        +// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
        +// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
        +//
        +
        +input[type="search"] {
        +  -webkit-appearance: textfield; // 1
        +  box-sizing: content-box; //2
        +}
        +
        +//
        +// Remove inner padding and search cancel button in Safari and Chrome on OS X.
        +// Safari (but not Chrome) clips the cancel button when the search input has
        +// padding (and `textfield` appearance).
        +//
        +
        +input[type="search"]::-webkit-search-cancel-button,
        +input[type="search"]::-webkit-search-decoration {
        +  -webkit-appearance: none;
        +}
        +
        +//
        +// Define consistent border, margin, and padding.
        +//
        +
        +fieldset {
        +  border: 1px solid #c0c0c0;
        +  margin: 0 2px;
        +  padding: 0.35em 0.625em 0.75em;
        +}
        +
        +//
        +// 1. Correct `color` not being inherited in IE 8/9/10/11.
        +// 2. Remove padding so people aren't caught out if they zero out fieldsets.
        +//
        +
        +legend {
        +  border: 0; // 1
        +  padding: 0; // 2
        +}
        +
        +//
        +// Remove default vertical scrollbar in IE 8/9/10/11.
        +//
        +
        +textarea {
        +  overflow: auto;
        +}
        +
        +//
        +// Don't inherit the `font-weight` (applied by a rule above).
        +// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
        +//
        +
        +optgroup {
        +  font-weight: bold;
        +}
        +
        +// Tables
        +// ==========================================================================
        +
        +//
        +// Remove most spacing between table cells.
        +//
        +
        +table {
        +  border-collapse: collapse;
        +  border-spacing: 0;
        +}
        +
        +td,
        +th {
        +  padding: 0;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_pager.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_pager.scss
        new file mode 100644
        index 0000000000..c2342174ff
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_pager.scss
        @@ -0,0 +1,54 @@
        +//
        +// Pager pagination
        +// --------------------------------------------------
        +
        +
        +.pager {
        +  padding-left: 0;
        +  margin: $line-height-computed 0;
        +  list-style: none;
        +  text-align: center;
        +  @include clearfix;
        +  li {
        +    display: inline;
        +    > a,
        +    > span {
        +      display: inline-block;
        +      padding: 5px 14px;
        +      background-color: $pager-bg;
        +      border: 1px solid $pager-border;
        +      border-radius: $pager-border-radius;
        +    }
        +
        +    > a:hover,
        +    > a:focus {
        +      text-decoration: none;
        +      background-color: $pager-hover-bg;
        +    }
        +  }
        +
        +  .next {
        +    > a,
        +    > span {
        +      float: right;
        +    }
        +  }
        +
        +  .previous {
        +    > a,
        +    > span {
        +      float: left;
        +    }
        +  }
        +
        +  .disabled {
        +    > a,
        +    > a:hover,
        +    > a:focus,
        +    > span {
        +      color: $pager-disabled-color;
        +      background-color: $pager-bg;
        +      cursor: $cursor-disabled;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_pagination.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_pagination.scss
        new file mode 100644
        index 0000000000..fecfa9c642
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_pagination.scss
        @@ -0,0 +1,89 @@
        +//
        +// Pagination (multiple pages)
        +// --------------------------------------------------
        +.pagination {
        +  display: inline-block;
        +  padding-left: 0;
        +  margin: $line-height-computed 0;
        +  border-radius: $border-radius-base;
        +
        +  > li {
        +    display: inline; // Remove list-style and block-level defaults
        +    > a,
        +    > span {
        +      position: relative;
        +      float: left; // Collapse white-space
        +      padding: $padding-base-vertical $padding-base-horizontal;
        +      line-height: $line-height-base;
        +      text-decoration: none;
        +      color: $pagination-color;
        +      background-color: $pagination-bg;
        +      border: 1px solid $pagination-border;
        +      margin-left: -1px;
        +    }
        +    &:first-child {
        +      > a,
        +      > span {
        +        margin-left: 0;
        +        @include border-left-radius($border-radius-base);
        +      }
        +    }
        +    &:last-child {
        +      > a,
        +      > span {
        +        @include border-right-radius($border-radius-base);
        +      }
        +    }
        +  }
        +
        +  > li > a,
        +  > li > span {
        +    &:hover,
        +    &:focus {
        +      z-index: 2;
        +      color: $pagination-hover-color;
        +      background-color: $pagination-hover-bg;
        +      border-color: $pagination-hover-border;
        +    }
        +  }
        +
        +  > .active > a,
        +  > .active > span {
        +    &,
        +    &:hover,
        +    &:focus {
        +      z-index: 3;
        +      color: $pagination-active-color;
        +      background-color: $pagination-active-bg;
        +      border-color: $pagination-active-border;
        +      cursor: default;
        +    }
        +  }
        +
        +  > .disabled {
        +    > span,
        +    > span:hover,
        +    > span:focus,
        +    > a,
        +    > a:hover,
        +    > a:focus {
        +      color: $pagination-disabled-color;
        +      background-color: $pagination-disabled-bg;
        +      border-color: $pagination-disabled-border;
        +      cursor: $cursor-disabled;
        +    }
        +  }
        +}
        +
        +// Sizing
        +// --------------------------------------------------
        +
        +// Large
        +.pagination-lg {
        +  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
        +}
        +
        +// Small
        +.pagination-sm {
        +  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_panels.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_panels.scss
        new file mode 100644
        index 0000000000..be9410f5b9
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_panels.scss
        @@ -0,0 +1,271 @@
        +//
        +// Panels
        +// --------------------------------------------------
        +
        +
        +// Base class
        +.panel {
        +  margin-bottom: $line-height-computed;
        +  background-color: $panel-bg;
        +  border: 1px solid transparent;
        +  border-radius: $panel-border-radius;
        +  @include box-shadow(0 1px 1px rgba(0,0,0,.05));
        +}
        +
        +// Panel contents
        +.panel-body {
        +  padding: $panel-body-padding;
        +  @include clearfix;
        +}
        +
        +// Optional heading
        +.panel-heading {
        +  padding: $panel-heading-padding;
        +  border-bottom: 1px solid transparent;
        +  @include border-top-radius(($panel-border-radius - 1));
        +
        +  > .dropdown .dropdown-toggle {
        +    color: inherit;
        +  }
        +}
        +
        +// Within heading, strip any `h*` tag of its default margins for spacing.
        +.panel-title {
        +  margin-top: 0;
        +  margin-bottom: 0;
        +  font-size: ceil(($font-size-base * 1.125));
        +  color: inherit;
        +
        +  > a,
        +  > small,
        +  > .small,
        +  > small > a,
        +  > .small > a {
        +    color: inherit;
        +  }
        +}
        +
        +// Optional footer (stays gray in every modifier class)
        +.panel-footer {
        +  padding: $panel-footer-padding;
        +  background-color: $panel-footer-bg;
        +  border-top: 1px solid $panel-inner-border;
        +  @include border-bottom-radius(($panel-border-radius - 1));
        +}
        +
        +
        +// List groups in panels
        +//
        +// By default, space out list group content from panel headings to account for
        +// any kind of custom content between the two.
        +
        +.panel {
        +  > .list-group,
        +  > .panel-collapse > .list-group {
        +    margin-bottom: 0;
        +
        +    .list-group-item {
        +      border-width: 1px 0;
        +      border-radius: 0;
        +    }
        +
        +    // Add border top radius for first one
        +    &:first-child {
        +      .list-group-item:first-child {
        +        border-top: 0;
        +        @include border-top-radius(($panel-border-radius - 1));
        +      }
        +    }
        +
        +    // Add border bottom radius for last one
        +    &:last-child {
        +      .list-group-item:last-child {
        +        border-bottom: 0;
        +        @include border-bottom-radius(($panel-border-radius - 1));
        +      }
        +    }
        +  }
        +  > .panel-heading + .panel-collapse > .list-group {
        +    .list-group-item:first-child {
        +      @include border-top-radius(0);
        +    }
        +  }
        +}
        +// Collapse space between when there's no additional content.
        +.panel-heading + .list-group {
        +  .list-group-item:first-child {
        +    border-top-width: 0;
        +  }
        +}
        +.list-group + .panel-footer {
        +  border-top-width: 0;
        +}
        +
        +// Tables in panels
        +//
        +// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
        +// watch it go full width.
        +
        +.panel {
        +  > .table,
        +  > .table-responsive > .table,
        +  > .panel-collapse > .table {
        +    margin-bottom: 0;
        +
        +    caption {
        +      padding-left: $panel-body-padding;
        +      padding-right: $panel-body-padding;
        +    }
        +  }
        +  // Add border top radius for first one
        +  > .table:first-child,
        +  > .table-responsive:first-child > .table:first-child {
        +    @include border-top-radius(($panel-border-radius - 1));
        +
        +    > thead:first-child,
        +    > tbody:first-child {
        +      > tr:first-child {
        +        border-top-left-radius: ($panel-border-radius - 1);
        +        border-top-right-radius: ($panel-border-radius - 1);
        +
        +        td:first-child,
        +        th:first-child {
        +          border-top-left-radius: ($panel-border-radius - 1);
        +        }
        +        td:last-child,
        +        th:last-child {
        +          border-top-right-radius: ($panel-border-radius - 1);
        +        }
        +      }
        +    }
        +  }
        +  // Add border bottom radius for last one
        +  > .table:last-child,
        +  > .table-responsive:last-child > .table:last-child {
        +    @include border-bottom-radius(($panel-border-radius - 1));
        +
        +    > tbody:last-child,
        +    > tfoot:last-child {
        +      > tr:last-child {
        +        border-bottom-left-radius: ($panel-border-radius - 1);
        +        border-bottom-right-radius: ($panel-border-radius - 1);
        +
        +        td:first-child,
        +        th:first-child {
        +          border-bottom-left-radius: ($panel-border-radius - 1);
        +        }
        +        td:last-child,
        +        th:last-child {
        +          border-bottom-right-radius: ($panel-border-radius - 1);
        +        }
        +      }
        +    }
        +  }
        +  > .panel-body + .table,
        +  > .panel-body + .table-responsive,
        +  > .table + .panel-body,
        +  > .table-responsive + .panel-body {
        +    border-top: 1px solid $table-border-color;
        +  }
        +  > .table > tbody:first-child > tr:first-child th,
        +  > .table > tbody:first-child > tr:first-child td {
        +    border-top: 0;
        +  }
        +  > .table-bordered,
        +  > .table-responsive > .table-bordered {
        +    border: 0;
        +    > thead,
        +    > tbody,
        +    > tfoot {
        +      > tr {
        +        > th:first-child,
        +        > td:first-child {
        +          border-left: 0;
        +        }
        +        > th:last-child,
        +        > td:last-child {
        +          border-right: 0;
        +        }
        +      }
        +    }
        +    > thead,
        +    > tbody {
        +      > tr:first-child {
        +        > td,
        +        > th {
        +          border-bottom: 0;
        +        }
        +      }
        +    }
        +    > tbody,
        +    > tfoot {
        +      > tr:last-child {
        +        > td,
        +        > th {
        +          border-bottom: 0;
        +        }
        +      }
        +    }
        +  }
        +  > .table-responsive {
        +    border: 0;
        +    margin-bottom: 0;
        +  }
        +}
        +
        +
        +// Collapsable panels (aka, accordion)
        +//
        +// Wrap a series of panels in `.panel-group` to turn them into an accordion with
        +// the help of our collapse JavaScript plugin.
        +
        +.panel-group {
        +  margin-bottom: $line-height-computed;
        +
        +  // Tighten up margin so it's only between panels
        +  .panel {
        +    margin-bottom: 0;
        +    border-radius: $panel-border-radius;
        +
        +    + .panel {
        +      margin-top: 5px;
        +    }
        +  }
        +
        +  .panel-heading {
        +    border-bottom: 0;
        +
        +    + .panel-collapse > .panel-body,
        +    + .panel-collapse > .list-group {
        +      border-top: 1px solid $panel-inner-border;
        +    }
        +  }
        +
        +  .panel-footer {
        +    border-top: 0;
        +    + .panel-collapse .panel-body {
        +      border-bottom: 1px solid $panel-inner-border;
        +    }
        +  }
        +}
        +
        +
        +// Contextual variations
        +.panel-default {
        +  @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
        +}
        +.panel-primary {
        +  @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
        +}
        +.panel-success {
        +  @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
        +}
        +.panel-info {
        +  @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
        +}
        +.panel-warning {
        +  @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
        +}
        +.panel-danger {
        +  @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_popovers.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_popovers.scss
        new file mode 100644
        index 0000000000..9b90a2e964
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_popovers.scss
        @@ -0,0 +1,131 @@
        +//
        +// Popovers
        +// --------------------------------------------------
        +
        +
        +.popover {
        +  position: absolute;
        +  top: 0;
        +  left: 0;
        +  z-index: $zindex-popover;
        +  display: none;
        +  max-width: $popover-max-width;
        +  padding: 1px;
        +  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.
        +  // So reset our font and text properties to avoid inheriting weird values.
        +  @include reset-text;
        +  font-size: $font-size-base;
        +
        +  background-color: $popover-bg;
        +  background-clip: padding-box;
        +  border: 1px solid $popover-fallback-border-color;
        +  border: 1px solid $popover-border-color;
        +  border-radius: $border-radius-large;
        +  @include box-shadow(0 5px 10px rgba(0,0,0,.2));
        +
        +  // Offset the popover to account for the popover arrow
        +  &.top     { margin-top: -$popover-arrow-width; }
        +  &.right   { margin-left: $popover-arrow-width; }
        +  &.bottom  { margin-top: $popover-arrow-width; }
        +  &.left    { margin-left: -$popover-arrow-width; }
        +}
        +
        +.popover-title {
        +  margin: 0; // reset heading margin
        +  padding: 8px 14px;
        +  font-size: $font-size-base;
        +  background-color: $popover-title-bg;
        +  border-bottom: 1px solid darken($popover-title-bg, 5%);
        +  border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
        +}
        +
        +.popover-content {
        +  padding: 9px 14px;
        +}
        +
        +// Arrows
        +//
        +// .arrow is outer, .arrow:after is inner
        +
        +.popover > .arrow {
        +  &,
        +  &:after {
        +    position: absolute;
        +    display: block;
        +    width: 0;
        +    height: 0;
        +    border-color: transparent;
        +    border-style: solid;
        +  }
        +}
        +.popover > .arrow {
        +  border-width: $popover-arrow-outer-width;
        +}
        +.popover > .arrow:after {
        +  border-width: $popover-arrow-width;
        +  content: "";
        +}
        +
        +.popover {
        +  &.top > .arrow {
        +    left: 50%;
        +    margin-left: -$popover-arrow-outer-width;
        +    border-bottom-width: 0;
        +    border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
        +    border-top-color: $popover-arrow-outer-color;
        +    bottom: -$popover-arrow-outer-width;
        +    &:after {
        +      content: " ";
        +      bottom: 1px;
        +      margin-left: -$popover-arrow-width;
        +      border-bottom-width: 0;
        +      border-top-color: $popover-arrow-color;
        +    }
        +  }
        +  &.right > .arrow {
        +    top: 50%;
        +    left: -$popover-arrow-outer-width;
        +    margin-top: -$popover-arrow-outer-width;
        +    border-left-width: 0;
        +    border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
        +    border-right-color: $popover-arrow-outer-color;
        +    &:after {
        +      content: " ";
        +      left: 1px;
        +      bottom: -$popover-arrow-width;
        +      border-left-width: 0;
        +      border-right-color: $popover-arrow-color;
        +    }
        +  }
        +  &.bottom > .arrow {
        +    left: 50%;
        +    margin-left: -$popover-arrow-outer-width;
        +    border-top-width: 0;
        +    border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
        +    border-bottom-color: $popover-arrow-outer-color;
        +    top: -$popover-arrow-outer-width;
        +    &:after {
        +      content: " ";
        +      top: 1px;
        +      margin-left: -$popover-arrow-width;
        +      border-top-width: 0;
        +      border-bottom-color: $popover-arrow-color;
        +    }
        +  }
        +
        +  &.left > .arrow {
        +    top: 50%;
        +    right: -$popover-arrow-outer-width;
        +    margin-top: -$popover-arrow-outer-width;
        +    border-right-width: 0;
        +    border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
        +    border-left-color: $popover-arrow-outer-color;
        +    &:after {
        +      content: " ";
        +      right: 1px;
        +      border-right-width: 0;
        +      border-left-color: $popover-arrow-color;
        +      bottom: -$popover-arrow-width;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_print.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_print.scss
        new file mode 100644
        index 0000000000..66e54ab489
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_print.scss
        @@ -0,0 +1,101 @@
        +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
        +
        +// ==========================================================================
        +// Print styles.
        +// Inlined to avoid the additional HTTP request: h5bp.com/r
        +// ==========================================================================
        +
        +@media print {
        +    *,
        +    *:before,
        +    *:after {
        +        background: transparent !important;
        +        color: #000 !important; // Black prints faster: h5bp.com/s
        +        box-shadow: none !important;
        +        text-shadow: none !important;
        +    }
        +
        +    a,
        +    a:visited {
        +        text-decoration: underline;
        +    }
        +
        +    a[href]:after {
        +        content: " (" attr(href) ")";
        +    }
        +
        +    abbr[title]:after {
        +        content: " (" attr(title) ")";
        +    }
        +
        +    // Don't show links that are fragment identifiers,
        +    // or use the `javascript:` pseudo protocol
        +    a[href^="#"]:after,
        +    a[href^="javascript:"]:after {
        +        content: "";
        +    }
        +
        +    pre,
        +    blockquote {
        +        border: 1px solid #999;
        +        page-break-inside: avoid;
        +    }
        +
        +    thead {
        +        display: table-header-group; // h5bp.com/t
        +    }
        +
        +    tr,
        +    img {
        +        page-break-inside: avoid;
        +    }
        +
        +    img {
        +        max-width: 100% !important;
        +    }
        +
        +    p,
        +    h2,
        +    h3 {
        +        orphans: 3;
        +        widows: 3;
        +    }
        +
        +    h2,
        +    h3 {
        +        page-break-after: avoid;
        +    }
        +
        +    // Bootstrap specific changes start
        +
        +    // Bootstrap components
        +    .navbar {
        +        display: none;
        +    }
        +    .btn,
        +    .dropup > .btn {
        +        > .caret {
        +            border-top-color: #000 !important;
        +        }
        +    }
        +    .label {
        +        border: 1px solid #000;
        +    }
        +
        +    .table {
        +        border-collapse: collapse !important;
        +
        +        td,
        +        th {
        +            background-color: #fff !important;
        +        }
        +    }
        +    .table-bordered {
        +        th,
        +        td {
        +            border: 1px solid #ddd !important;
        +        }
        +    }
        +
        +    // Bootstrap specific changes end
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_progress-bars.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_progress-bars.scss
        new file mode 100644
        index 0000000000..343df6323c
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_progress-bars.scss
        @@ -0,0 +1,87 @@
        +//
        +// Progress bars
        +// --------------------------------------------------
        +
        +
        +// Bar animations
        +// -------------------------
        +
        +// WebKit
        +@-webkit-keyframes progress-bar-stripes {
        +  from  { background-position: 40px 0; }
        +  to    { background-position: 0 0; }
        +}
        +
        +// Spec and IE10+
        +@keyframes progress-bar-stripes {
        +  from  { background-position: 40px 0; }
        +  to    { background-position: 0 0; }
        +}
        +
        +
        +// Bar itself
        +// -------------------------
        +
        +// Outer container
        +.progress {
        +  overflow: hidden;
        +  height: $line-height-computed;
        +  margin-bottom: $line-height-computed;
        +  background-color: $progress-bg;
        +  border-radius: $progress-border-radius;
        +  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
        +}
        +
        +// Bar of progress
        +.progress-bar {
        +  float: left;
        +  width: 0%;
        +  height: 100%;
        +  font-size: $font-size-small;
        +  line-height: $line-height-computed;
        +  color: $progress-bar-color;
        +  text-align: center;
        +  background-color: $progress-bar-bg;
        +  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
        +  @include transition(width .6s ease);
        +}
        +
        +// Striped bars
        +//
        +// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
        +// `.progress-bar-striped` class, which you just add to an existing
        +// `.progress-bar`.
        +.progress-striped .progress-bar,
        +.progress-bar-striped {
        +  @include gradient-striped;
        +  background-size: 40px 40px;
        +}
        +
        +// Call animation for the active one
        +//
        +// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
        +// `.progress-bar.active` approach.
        +.progress.active .progress-bar,
        +.progress-bar.active {
        +  @include animation(progress-bar-stripes 2s linear infinite);
        +}
        +
        +
        +// Variations
        +// -------------------------
        +
        +.progress-bar-success {
        +  @include progress-bar-variant($progress-bar-success-bg);
        +}
        +
        +.progress-bar-info {
        +  @include progress-bar-variant($progress-bar-info-bg);
        +}
        +
        +.progress-bar-warning {
        +  @include progress-bar-variant($progress-bar-warning-bg);
        +}
        +
        +.progress-bar-danger {
        +  @include progress-bar-variant($progress-bar-danger-bg);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_responsive-embed.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_responsive-embed.scss
        new file mode 100644
        index 0000000000..080a5118fe
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_responsive-embed.scss
        @@ -0,0 +1,35 @@
        +// Embeds responsive
        +//
        +// Credit: Nicolas Gallagher and SUIT CSS.
        +
        +.embed-responsive {
        +  position: relative;
        +  display: block;
        +  height: 0;
        +  padding: 0;
        +  overflow: hidden;
        +
        +  .embed-responsive-item,
        +  iframe,
        +  embed,
        +  object,
        +  video {
        +    position: absolute;
        +    top: 0;
        +    left: 0;
        +    bottom: 0;
        +    height: 100%;
        +    width: 100%;
        +    border: 0;
        +  }
        +}
        +
        +// Modifier class for 16:9 aspect ratio
        +.embed-responsive-16by9 {
        +  padding-bottom: 56.25%;
        +}
        +
        +// Modifier class for 4:3 aspect ratio
        +.embed-responsive-4by3 {
        +  padding-bottom: 75%;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_responsive-utilities.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_responsive-utilities.scss
        new file mode 100644
        index 0000000000..f3f0c839be
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_responsive-utilities.scss
        @@ -0,0 +1,179 @@
        +//
        +// Responsive: Utility classes
        +// --------------------------------------------------
        +
        +
        +// IE10 in Windows (Phone) 8
        +//
        +// Support for responsive views via media queries is kind of borked in IE10, for
        +// Surface/desktop in split view and for Windows Phone 8. This particular fix
        +// must be accompanied by a snippet of JavaScript to sniff the user agent and
        +// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
        +// our Getting Started page for more information on this bug.
        +//
        +// For more information, see the following:
        +//
        +// Issue: https://github.com/twbs/bootstrap/issues/10497
        +// Docs: http://getbootstrap.com/getting-started/#support-ie10-width
        +// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
        +// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
        +
        +@at-root {
        +  @-ms-viewport {
        +    width: device-width;
        +  }
        +}
        +
        +
        +// Visibility utilities
        +// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
        +
        +@include responsive-invisibility('.visible-xs');
        +@include responsive-invisibility('.visible-sm');
        +@include responsive-invisibility('.visible-md');
        +@include responsive-invisibility('.visible-lg');
        +
        +.visible-xs-block,
        +.visible-xs-inline,
        +.visible-xs-inline-block,
        +.visible-sm-block,
        +.visible-sm-inline,
        +.visible-sm-inline-block,
        +.visible-md-block,
        +.visible-md-inline,
        +.visible-md-inline-block,
        +.visible-lg-block,
        +.visible-lg-inline,
        +.visible-lg-inline-block {
        +  display: none !important;
        +}
        +
        +@media (max-width: $screen-xs-max) {
        +  @include responsive-visibility('.visible-xs');
        +}
        +.visible-xs-block {
        +  @media (max-width: $screen-xs-max) {
        +    display: block !important;
        +  }
        +}
        +.visible-xs-inline {
        +  @media (max-width: $screen-xs-max) {
        +    display: inline !important;
        +  }
        +}
        +.visible-xs-inline-block {
        +  @media (max-width: $screen-xs-max) {
        +    display: inline-block !important;
        +  }
        +}
        +
        +@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
        +  @include responsive-visibility('.visible-sm');
        +}
        +.visible-sm-block {
        +  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
        +    display: block !important;
        +  }
        +}
        +.visible-sm-inline {
        +  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
        +    display: inline !important;
        +  }
        +}
        +.visible-sm-inline-block {
        +  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
        +    display: inline-block !important;
        +  }
        +}
        +
        +@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
        +  @include responsive-visibility('.visible-md');
        +}
        +.visible-md-block {
        +  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
        +    display: block !important;
        +  }
        +}
        +.visible-md-inline {
        +  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
        +    display: inline !important;
        +  }
        +}
        +.visible-md-inline-block {
        +  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
        +    display: inline-block !important;
        +  }
        +}
        +
        +@media (min-width: $screen-lg-min) {
        +  @include responsive-visibility('.visible-lg');
        +}
        +.visible-lg-block {
        +  @media (min-width: $screen-lg-min) {
        +    display: block !important;
        +  }
        +}
        +.visible-lg-inline {
        +  @media (min-width: $screen-lg-min) {
        +    display: inline !important;
        +  }
        +}
        +.visible-lg-inline-block {
        +  @media (min-width: $screen-lg-min) {
        +    display: inline-block !important;
        +  }
        +}
        +
        +@media (max-width: $screen-xs-max) {
        +  @include responsive-invisibility('.hidden-xs');
        +}
        +
        +@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
        +  @include responsive-invisibility('.hidden-sm');
        +}
        +
        +@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
        +  @include responsive-invisibility('.hidden-md');
        +}
        +
        +@media (min-width: $screen-lg-min) {
        +  @include responsive-invisibility('.hidden-lg');
        +}
        +
        +
        +// Print utilities
        +//
        +// Media queries are placed on the inside to be mixin-friendly.
        +
        +// Note: Deprecated .visible-print as of v3.2.0
        +
        +@include responsive-invisibility('.visible-print');
        +
        +@media print {
        +  @include responsive-visibility('.visible-print');
        +}
        +.visible-print-block {
        +  display: none !important;
        +
        +  @media print {
        +    display: block !important;
        +  }
        +}
        +.visible-print-inline {
        +  display: none !important;
        +
        +  @media print {
        +    display: inline !important;
        +  }
        +}
        +.visible-print-inline-block {
        +  display: none !important;
        +
        +  @media print {
        +    display: inline-block !important;
        +  }
        +}
        +
        +@media print {
        +  @include responsive-invisibility('.hidden-print');
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_scaffolding.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_scaffolding.scss
        new file mode 100644
        index 0000000000..83adb5dd51
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_scaffolding.scss
        @@ -0,0 +1,161 @@
        +//
        +// Scaffolding
        +// --------------------------------------------------
        +
        +
        +// Reset the box-sizing
        +//
        +// Heads up! This reset may cause conflicts with some third-party widgets.
        +// For recommendations on resolving such conflicts, see
        +// http://getbootstrap.com/getting-started/#third-box-sizing
        +* {
        +  @include box-sizing(border-box);
        +}
        +*:before,
        +*:after {
        +  @include box-sizing(border-box);
        +}
        +
        +
        +// Body reset
        +
        +html {
        +  font-size: 10px;
        +  -webkit-tap-highlight-color: rgba(0,0,0,0);
        +}
        +
        +body {
        +  font-family: $font-family-base;
        +  font-size: $font-size-base;
        +  line-height: $line-height-base;
        +  color: $text-color;
        +  background-color: $body-bg;
        +}
        +
        +// Reset fonts for relevant elements
        +input,
        +button,
        +select,
        +textarea {
        +  font-family: inherit;
        +  font-size: inherit;
        +  line-height: inherit;
        +}
        +
        +
        +// Links
        +
        +a {
        +  color: $link-color;
        +  text-decoration: none;
        +
        +  &:hover,
        +  &:focus {
        +    color: $link-hover-color;
        +    text-decoration: $link-hover-decoration;
        +  }
        +
        +  &:focus {
        +    @include tab-focus;
        +  }
        +}
        +
        +
        +// Figures
        +//
        +// We reset this here because previously Normalize had no `figure` margins. This
        +// ensures we don't break anyone's use of the element.
        +
        +figure {
        +  margin: 0;
        +}
        +
        +
        +// Images
        +
        +img {
        +  vertical-align: middle;
        +}
        +
        +// Responsive images (ensure images don't scale beyond their parents)
        +.img-responsive {
        +  @include img-responsive;
        +}
        +
        +// Rounded corners
        +.img-rounded {
        +  border-radius: $border-radius-large;
        +}
        +
        +// Image thumbnails
        +//
        +// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
        +.img-thumbnail {
        +  padding: $thumbnail-padding;
        +  line-height: $line-height-base;
        +  background-color: $thumbnail-bg;
        +  border: 1px solid $thumbnail-border;
        +  border-radius: $thumbnail-border-radius;
        +  @include transition(all .2s ease-in-out);
        +
        +  // Keep them at most 100% wide
        +  @include img-responsive(inline-block);
        +}
        +
        +// Perfect circle
        +.img-circle {
        +  border-radius: 50%; // set radius in percents
        +}
        +
        +
        +// Horizontal rules
        +
        +hr {
        +  margin-top:    $line-height-computed;
        +  margin-bottom: $line-height-computed;
        +  border: 0;
        +  border-top: 1px solid $hr-border;
        +}
        +
        +
        +// Only display content to screen readers
        +//
        +// See: http://a11yproject.com/posts/how-to-hide-content/
        +
        +.sr-only {
        +  position: absolute;
        +  width: 1px;
        +  height: 1px;
        +  margin: -1px;
        +  padding: 0;
        +  overflow: hidden;
        +  clip: rect(0,0,0,0);
        +  border: 0;
        +}
        +
        +// Use in conjunction with .sr-only to only display content when it's focused.
        +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
        +// Credit: HTML5 Boilerplate
        +
        +.sr-only-focusable {
        +  &:active,
        +  &:focus {
        +    position: static;
        +    width: auto;
        +    height: auto;
        +    margin: 0;
        +    overflow: visible;
        +    clip: auto;
        +  }
        +}
        +
        +
        +// iOS "clickable elements" fix for role="button"
        +//
        +// Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
        +// for traditionally non-focusable elements with role="button"
        +// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
        +
        +[role="button"] {
        +  cursor: pointer;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_tables.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_tables.scss
        new file mode 100644
        index 0000000000..affcc58c0b
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_tables.scss
        @@ -0,0 +1,234 @@
        +//
        +// Tables
        +// --------------------------------------------------
        +
        +
        +table {
        +  background-color: $table-bg;
        +}
        +caption {
        +  padding-top: $table-cell-padding;
        +  padding-bottom: $table-cell-padding;
        +  color: $text-muted;
        +  text-align: left;
        +}
        +th {
        +  text-align: left;
        +}
        +
        +
        +// Baseline styles
        +
        +.table {
        +  width: 100%;
        +  max-width: 100%;
        +  margin-bottom: $line-height-computed;
        +  // Cells
        +  > thead,
        +  > tbody,
        +  > tfoot {
        +    > tr {
        +      > th,
        +      > td {
        +        padding: $table-cell-padding;
        +        line-height: $line-height-base;
        +        vertical-align: top;
        +        border-top: 1px solid $table-border-color;
        +      }
        +    }
        +  }
        +  // Bottom align for column headings
        +  > thead > tr > th {
        +    vertical-align: bottom;
        +    border-bottom: 2px solid $table-border-color;
        +  }
        +  // Remove top border from thead by default
        +  > caption + thead,
        +  > colgroup + thead,
        +  > thead:first-child {
        +    > tr:first-child {
        +      > th,
        +      > td {
        +        border-top: 0;
        +      }
        +    }
        +  }
        +  // Account for multiple tbody instances
        +  > tbody + tbody {
        +    border-top: 2px solid $table-border-color;
        +  }
        +
        +  // Nesting
        +  .table {
        +    background-color: $body-bg;
        +  }
        +}
        +
        +
        +// Condensed table w/ half padding
        +
        +.table-condensed {
        +  > thead,
        +  > tbody,
        +  > tfoot {
        +    > tr {
        +      > th,
        +      > td {
        +        padding: $table-condensed-cell-padding;
        +      }
        +    }
        +  }
        +}
        +
        +
        +// Bordered version
        +//
        +// Add borders all around the table and between all the columns.
        +
        +.table-bordered {
        +  border: 1px solid $table-border-color;
        +  > thead,
        +  > tbody,
        +  > tfoot {
        +    > tr {
        +      > th,
        +      > td {
        +        border: 1px solid $table-border-color;
        +      }
        +    }
        +  }
        +  > thead > tr {
        +    > th,
        +    > td {
        +      border-bottom-width: 2px;
        +    }
        +  }
        +}
        +
        +
        +// Zebra-striping
        +//
        +// Default zebra-stripe styles (alternating gray and transparent backgrounds)
        +
        +.table-striped {
        +  > tbody > tr:nth-of-type(odd) {
        +    background-color: $table-bg-accent;
        +  }
        +}
        +
        +
        +// Hover effect
        +//
        +// Placed here since it has to come after the potential zebra striping
        +
        +.table-hover {
        +  > tbody > tr:hover {
        +    background-color: $table-bg-hover;
        +  }
        +}
        +
        +
        +// Table cell sizing
        +//
        +// Reset default table behavior
        +
        +table col[class*="col-"] {
        +  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
        +  float: none;
        +  display: table-column;
        +}
        +table {
        +  td,
        +  th {
        +    &[class*="col-"] {
        +      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
        +      float: none;
        +      display: table-cell;
        +    }
        +  }
        +}
        +
        +
        +// Table backgrounds
        +//
        +// Exact selectors below required to override `.table-striped` and prevent
        +// inheritance to nested tables.
        +
        +// Generate the contextual variants
        +@include table-row-variant('active', $table-bg-active);
        +@include table-row-variant('success', $state-success-bg);
        +@include table-row-variant('info', $state-info-bg);
        +@include table-row-variant('warning', $state-warning-bg);
        +@include table-row-variant('danger', $state-danger-bg);
        +
        +
        +// Responsive tables
        +//
        +// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
        +// by enabling horizontal scrolling. Only applies <768px. Everything above that
        +// will display normally.
        +
        +.table-responsive {
        +  overflow-x: auto;
        +  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
        +
        +  @media screen and (max-width: $screen-xs-max) {
        +    width: 100%;
        +    margin-bottom: ($line-height-computed * 0.75);
        +    overflow-y: hidden;
        +    -ms-overflow-style: -ms-autohiding-scrollbar;
        +    border: 1px solid $table-border-color;
        +
        +    // Tighten up spacing
        +    > .table {
        +      margin-bottom: 0;
        +
        +      // Ensure the content doesn't wrap
        +      > thead,
        +      > tbody,
        +      > tfoot {
        +        > tr {
        +          > th,
        +          > td {
        +            white-space: nowrap;
        +          }
        +        }
        +      }
        +    }
        +
        +    // Special overrides for the bordered tables
        +    > .table-bordered {
        +      border: 0;
        +
        +      // Nuke the appropriate borders so that the parent can handle them
        +      > thead,
        +      > tbody,
        +      > tfoot {
        +        > tr {
        +          > th:first-child,
        +          > td:first-child {
        +            border-left: 0;
        +          }
        +          > th:last-child,
        +          > td:last-child {
        +            border-right: 0;
        +          }
        +        }
        +      }
        +
        +      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
        +      // chances are there will be only one `tr` in a `thead` and that would
        +      // remove the border altogether.
        +      > tbody,
        +      > tfoot {
        +        > tr:last-child {
        +          > th,
        +          > td {
        +            border-bottom: 0;
        +          }
        +        }
        +      }
        +
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_theme.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_theme.scss
        new file mode 100644
        index 0000000000..c64b3d619a
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_theme.scss
        @@ -0,0 +1,291 @@
        +/*!
        + * Bootstrap v3.3.6 (http://getbootstrap.com)
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + */
        +
        +//
        +// Load core variables and mixins
        +// --------------------------------------------------
        +
        +@import "variables";
        +@import "mixins";
        +
        +
        +//
        +// Buttons
        +// --------------------------------------------------
        +
        +// Common styles
        +.btn-default,
        +.btn-primary,
        +.btn-success,
        +.btn-info,
        +.btn-warning,
        +.btn-danger {
        +  text-shadow: 0 -1px 0 rgba(0,0,0,.2);
        +  $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
        +  @include box-shadow($shadow);
        +
        +  // Reset the shadow
        +  &:active,
        +  &.active {
        +    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
        +  }
        +
        +  &.disabled,
        +  &[disabled],
        +  fieldset[disabled] & {
        +    @include box-shadow(none);
        +  }
        +
        +  .badge {
        +    text-shadow: none;
        +  }
        +}
        +
        +// Mixin for generating new styles
        +@mixin btn-styles($btn-color: #555) {
        +  @include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%));
        +  @include reset-filter; // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
        +  background-repeat: repeat-x;
        +  border-color: darken($btn-color, 14%);
        +
        +  &:hover,
        +  &:focus  {
        +    background-color: darken($btn-color, 12%);
        +    background-position: 0 -15px;
        +  }
        +
        +  &:active,
        +  &.active {
        +    background-color: darken($btn-color, 12%);
        +    border-color: darken($btn-color, 14%);
        +  }
        +
        +  &.disabled,
        +  &[disabled],
        +  fieldset[disabled] & {
        +    &,
        +    &:hover,
        +    &:focus,
        +    &.focus,
        +    &:active,
        +    &.active {
        +      background-color: darken($btn-color, 12%);
        +      background-image: none;
        +    }
        +  }
        +}
        +
        +// Common styles
        +.btn {
        +  // Remove the gradient for the pressed/active state
        +  &:active,
        +  &.active {
        +    background-image: none;
        +  }
        +}
        +
        +// Apply the mixin to the buttons
        +.btn-default { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
        +.btn-primary { @include btn-styles($btn-primary-bg); }
        +.btn-success { @include btn-styles($btn-success-bg); }
        +.btn-info    { @include btn-styles($btn-info-bg); }
        +.btn-warning { @include btn-styles($btn-warning-bg); }
        +.btn-danger  { @include btn-styles($btn-danger-bg); }
        +
        +
        +//
        +// Images
        +// --------------------------------------------------
        +
        +.thumbnail,
        +.img-thumbnail {
        +  @include box-shadow(0 1px 2px rgba(0,0,0,.075));
        +}
        +
        +
        +//
        +// Dropdowns
        +// --------------------------------------------------
        +
        +.dropdown-menu > li > a:hover,
        +.dropdown-menu > li > a:focus {
        +  @include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%));
        +  background-color: darken($dropdown-link-hover-bg, 5%);
        +}
        +.dropdown-menu > .active > a,
        +.dropdown-menu > .active > a:hover,
        +.dropdown-menu > .active > a:focus {
        +  @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
        +  background-color: darken($dropdown-link-active-bg, 5%);
        +}
        +
        +
        +//
        +// Navbar
        +// --------------------------------------------------
        +
        +// Default navbar
        +.navbar-default {
        +  @include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg);
        +  @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
        +  border-radius: $navbar-border-radius;
        +  $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
        +  @include box-shadow($shadow);
        +
        +  .navbar-nav > .open > a,
        +  .navbar-nav > .active > a {
        +    @include gradient-vertical($start-color: darken($navbar-default-link-active-bg, 5%), $end-color: darken($navbar-default-link-active-bg, 2%));
        +    @include box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
        +  }
        +}
        +.navbar-brand,
        +.navbar-nav > li > a {
        +  text-shadow: 0 1px 0 rgba(255,255,255,.25);
        +}
        +
        +// Inverted navbar
        +.navbar-inverse {
        +  @include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg);
        +  @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
        +  border-radius: $navbar-border-radius;
        +  .navbar-nav > .open > a,
        +  .navbar-nav > .active > a {
        +    @include gradient-vertical($start-color: $navbar-inverse-link-active-bg, $end-color: lighten($navbar-inverse-link-active-bg, 2.5%));
        +    @include box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
        +  }
        +
        +  .navbar-brand,
        +  .navbar-nav > li > a {
        +    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
        +  }
        +}
        +
        +// Undo rounded corners in static and fixed navbars
        +.navbar-static-top,
        +.navbar-fixed-top,
        +.navbar-fixed-bottom {
        +  border-radius: 0;
        +}
        +
        +// Fix active state of dropdown items in collapsed mode
        +@media (max-width: $grid-float-breakpoint-max) {
        +  .navbar .navbar-nav .open .dropdown-menu > .active > a {
        +    &,
        +    &:hover,
        +    &:focus {
        +      color: #fff;
        +      @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
        +    }
        +  }
        +}
        +
        +
        +//
        +// Alerts
        +// --------------------------------------------------
        +
        +// Common styles
        +.alert {
        +  text-shadow: 0 1px 0 rgba(255,255,255,.2);
        +  $shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
        +  @include box-shadow($shadow);
        +}
        +
        +// Mixin for generating new styles
        +@mixin alert-styles($color) {
        +  @include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%));
        +  border-color: darken($color, 15%);
        +}
        +
        +// Apply the mixin to the alerts
        +.alert-success    { @include alert-styles($alert-success-bg); }
        +.alert-info       { @include alert-styles($alert-info-bg); }
        +.alert-warning    { @include alert-styles($alert-warning-bg); }
        +.alert-danger     { @include alert-styles($alert-danger-bg); }
        +
        +
        +//
        +// Progress bars
        +// --------------------------------------------------
        +
        +// Give the progress background some depth
        +.progress {
        +  @include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
        +}
        +
        +// Mixin for generating new styles
        +@mixin progress-bar-styles($color) {
        +  @include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
        +}
        +
        +// Apply the mixin to the progress bars
        +.progress-bar            { @include progress-bar-styles($progress-bar-bg); }
        +.progress-bar-success    { @include progress-bar-styles($progress-bar-success-bg); }
        +.progress-bar-info       { @include progress-bar-styles($progress-bar-info-bg); }
        +.progress-bar-warning    { @include progress-bar-styles($progress-bar-warning-bg); }
        +.progress-bar-danger     { @include progress-bar-styles($progress-bar-danger-bg); }
        +
        +// Reset the striped class because our mixins don't do multiple gradients and
        +// the above custom styles override the new `.progress-bar-striped` in v3.2.0.
        +.progress-bar-striped {
        +  @include gradient-striped;
        +}
        +
        +
        +//
        +// List groups
        +// --------------------------------------------------
        +
        +.list-group {
        +  border-radius: $border-radius-base;
        +  @include box-shadow(0 1px 2px rgba(0,0,0,.075));
        +}
        +.list-group-item.active,
        +.list-group-item.active:hover,
        +.list-group-item.active:focus {
        +  text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%);
        +  @include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%));
        +  border-color: darken($list-group-active-border, 7.5%);
        +
        +  .badge {
        +    text-shadow: none;
        +  }
        +}
        +
        +
        +//
        +// Panels
        +// --------------------------------------------------
        +
        +// Common styles
        +.panel {
        +  @include box-shadow(0 1px 2px rgba(0,0,0,.05));
        +}
        +
        +// Mixin for generating new styles
        +@mixin panel-heading-styles($color) {
        +  @include gradient-vertical($start-color: $color, $end-color: darken($color, 5%));
        +}
        +
        +// Apply the mixin to the panel headings only
        +.panel-default > .panel-heading   { @include panel-heading-styles($panel-default-heading-bg); }
        +.panel-primary > .panel-heading   { @include panel-heading-styles($panel-primary-heading-bg); }
        +.panel-success > .panel-heading   { @include panel-heading-styles($panel-success-heading-bg); }
        +.panel-info > .panel-heading      { @include panel-heading-styles($panel-info-heading-bg); }
        +.panel-warning > .panel-heading   { @include panel-heading-styles($panel-warning-heading-bg); }
        +.panel-danger > .panel-heading    { @include panel-heading-styles($panel-danger-heading-bg); }
        +
        +
        +//
        +// Wells
        +// --------------------------------------------------
        +
        +.well {
        +  @include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg);
        +  border-color: darken($well-bg, 10%);
        +  $shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
        +  @include box-shadow($shadow);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_thumbnails.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_thumbnails.scss
        new file mode 100644
        index 0000000000..da0e1e76cf
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_thumbnails.scss
        @@ -0,0 +1,38 @@
        +//
        +// Thumbnails
        +// --------------------------------------------------
        +
        +
        +// Mixin and adjust the regular image class
        +.thumbnail {
        +  display: block;
        +  padding: $thumbnail-padding;
        +  margin-bottom: $line-height-computed;
        +  line-height: $line-height-base;
        +  background-color: $thumbnail-bg;
        +  border: 1px solid $thumbnail-border;
        +  border-radius: $thumbnail-border-radius;
        +  @include transition(border .2s ease-in-out);
        +
        +  > img,
        +  a > img {
        +    @include img-responsive;
        +    margin-left: auto;
        +    margin-right: auto;
        +  }
        +
        +  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
        +
        +  // Image captions
        +  .caption {
        +    padding: $thumbnail-caption-padding;
        +    color: $thumbnail-caption-color;
        +  }
        +}
        +
        +// Add a hover state for linked versions only
        +a.thumbnail:hover,
        +a.thumbnail:focus,
        +a.thumbnail.active {
        +  border-color: $link-color;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_tooltip.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_tooltip.scss
        new file mode 100644
        index 0000000000..f0c1658274
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_tooltip.scss
        @@ -0,0 +1,101 @@
        +//
        +// Tooltips
        +// --------------------------------------------------
        +
        +
        +// Base class
        +.tooltip {
        +  position: absolute;
        +  z-index: $zindex-tooltip;
        +  display: block;
        +  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
        +  // So reset our font and text properties to avoid inheriting weird values.
        +  @include reset-text;
        +  font-size: $font-size-small;
        +
        +  @include opacity(0);
        +
        +  &.in     { @include opacity($tooltip-opacity); }
        +  &.top    { margin-top:  -3px; padding: $tooltip-arrow-width 0; }
        +  &.right  { margin-left:  3px; padding: 0 $tooltip-arrow-width; }
        +  &.bottom { margin-top:   3px; padding: $tooltip-arrow-width 0; }
        +  &.left   { margin-left: -3px; padding: 0 $tooltip-arrow-width; }
        +}
        +
        +// Wrapper for the tooltip content
        +.tooltip-inner {
        +  max-width: $tooltip-max-width;
        +  padding: 3px 8px;
        +  color: $tooltip-color;
        +  text-align: center;
        +  background-color: $tooltip-bg;
        +  border-radius: $border-radius-base;
        +}
        +
        +// Arrows
        +.tooltip-arrow {
        +  position: absolute;
        +  width: 0;
        +  height: 0;
        +  border-color: transparent;
        +  border-style: solid;
        +}
        +// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
        +.tooltip {
        +  &.top .tooltip-arrow {
        +    bottom: 0;
        +    left: 50%;
        +    margin-left: -$tooltip-arrow-width;
        +    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
        +    border-top-color: $tooltip-arrow-color;
        +  }
        +  &.top-left .tooltip-arrow {
        +    bottom: 0;
        +    right: $tooltip-arrow-width;
        +    margin-bottom: -$tooltip-arrow-width;
        +    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
        +    border-top-color: $tooltip-arrow-color;
        +  }
        +  &.top-right .tooltip-arrow {
        +    bottom: 0;
        +    left: $tooltip-arrow-width;
        +    margin-bottom: -$tooltip-arrow-width;
        +    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
        +    border-top-color: $tooltip-arrow-color;
        +  }
        +  &.right .tooltip-arrow {
        +    top: 50%;
        +    left: 0;
        +    margin-top: -$tooltip-arrow-width;
        +    border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
        +    border-right-color: $tooltip-arrow-color;
        +  }
        +  &.left .tooltip-arrow {
        +    top: 50%;
        +    right: 0;
        +    margin-top: -$tooltip-arrow-width;
        +    border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
        +    border-left-color: $tooltip-arrow-color;
        +  }
        +  &.bottom .tooltip-arrow {
        +    top: 0;
        +    left: 50%;
        +    margin-left: -$tooltip-arrow-width;
        +    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
        +    border-bottom-color: $tooltip-arrow-color;
        +  }
        +  &.bottom-left .tooltip-arrow {
        +    top: 0;
        +    right: $tooltip-arrow-width;
        +    margin-top: -$tooltip-arrow-width;
        +    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
        +    border-bottom-color: $tooltip-arrow-color;
        +  }
        +  &.bottom-right .tooltip-arrow {
        +    top: 0;
        +    left: $tooltip-arrow-width;
        +    margin-top: -$tooltip-arrow-width;
        +    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
        +    border-bottom-color: $tooltip-arrow-color;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_type.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_type.scss
        new file mode 100644
        index 0000000000..620796adc1
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_type.scss
        @@ -0,0 +1,298 @@
        +//
        +// Typography
        +// --------------------------------------------------
        +
        +
        +// Headings
        +// -------------------------
        +
        +h1, h2, h3, h4, h5, h6,
        +.h1, .h2, .h3, .h4, .h5, .h6 {
        +  font-family: $headings-font-family;
        +  font-weight: $headings-font-weight;
        +  line-height: $headings-line-height;
        +  color: $headings-color;
        +
        +  small,
        +  .small {
        +    font-weight: normal;
        +    line-height: 1;
        +    color: $headings-small-color;
        +  }
        +}
        +
        +h1, .h1,
        +h2, .h2,
        +h3, .h3 {
        +  margin-top: $line-height-computed;
        +  margin-bottom: ($line-height-computed / 2);
        +
        +  small,
        +  .small {
        +    font-size: 65%;
        +  }
        +}
        +h4, .h4,
        +h5, .h5,
        +h6, .h6 {
        +  margin-top: ($line-height-computed / 2);
        +  margin-bottom: ($line-height-computed / 2);
        +
        +  small,
        +  .small {
        +    font-size: 75%;
        +  }
        +}
        +
        +h1, .h1 { font-size: $font-size-h1; }
        +h2, .h2 { font-size: $font-size-h2; }
        +h3, .h3 { font-size: $font-size-h3; }
        +h4, .h4 { font-size: $font-size-h4; }
        +h5, .h5 { font-size: $font-size-h5; }
        +h6, .h6 { font-size: $font-size-h6; }
        +
        +
        +// Body text
        +// -------------------------
        +
        +p {
        +  margin: 0 0 ($line-height-computed / 2);
        +}
        +
        +.lead {
        +  margin-bottom: $line-height-computed;
        +  font-size: floor(($font-size-base * 1.15));
        +  font-weight: 300;
        +  line-height: 1.4;
        +
        +  @media (min-width: $screen-sm-min) {
        +    font-size: ($font-size-base * 1.5);
        +  }
        +}
        +
        +
        +// Emphasis & misc
        +// -------------------------
        +
        +// Ex: (12px small font / 14px base font) * 100% = about 85%
        +small,
        +.small {
        +  font-size: floor((100% * $font-size-small / $font-size-base));
        +}
        +
        +mark,
        +.mark {
        +  background-color: $state-warning-bg;
        +  padding: .2em;
        +}
        +
        +// Alignment
        +.text-left           { text-align: left; }
        +.text-right          { text-align: right; }
        +.text-center         { text-align: center; }
        +.text-justify        { text-align: justify; }
        +.text-nowrap         { white-space: nowrap; }
        +
        +// Transformation
        +.text-lowercase      { text-transform: lowercase; }
        +.text-uppercase      { text-transform: uppercase; }
        +.text-capitalize     { text-transform: capitalize; }
        +
        +// Contextual colors
        +.text-muted {
        +  color: $text-muted;
        +}
        +
        +@include text-emphasis-variant('.text-primary', $brand-primary);
        +
        +@include text-emphasis-variant('.text-success', $state-success-text);
        +
        +@include text-emphasis-variant('.text-info', $state-info-text);
        +
        +@include text-emphasis-variant('.text-warning', $state-warning-text);
        +
        +@include text-emphasis-variant('.text-danger', $state-danger-text);
        +
        +// Contextual backgrounds
        +// For now we'll leave these alongside the text classes until v4 when we can
        +// safely shift things around (per SemVer rules).
        +.bg-primary {
        +  // Given the contrast here, this is the only class to have its color inverted
        +  // automatically.
        +  color: #fff;
        +}
        +@include bg-variant('.bg-primary', $brand-primary);
        +
        +@include bg-variant('.bg-success', $state-success-bg);
        +
        +@include bg-variant('.bg-info', $state-info-bg);
        +
        +@include bg-variant('.bg-warning', $state-warning-bg);
        +
        +@include bg-variant('.bg-danger', $state-danger-bg);
        +
        +
        +// Page header
        +// -------------------------
        +
        +.page-header {
        +  padding-bottom: (($line-height-computed / 2) - 1);
        +  margin: ($line-height-computed * 2) 0 $line-height-computed;
        +  border-bottom: 1px solid $page-header-border-color;
        +}
        +
        +
        +// Lists
        +// -------------------------
        +
        +// Unordered and Ordered lists
        +ul,
        +ol {
        +  margin-top: 0;
        +  margin-bottom: ($line-height-computed / 2);
        +  ul,
        +  ol {
        +    margin-bottom: 0;
        +  }
        +}
        +
        +// List options
        +
        +// [converter] extracted from `.list-unstyled` for libsass compatibility
        +@mixin list-unstyled {
        +  padding-left: 0;
        +  list-style: none;
        +}
        +// [converter] extracted as `@mixin list-unstyled` for libsass compatibility
        +.list-unstyled {
        +  @include list-unstyled;
        +}
        +
        +
        +// Inline turns list items into inline-block
        +.list-inline {
        +  @include list-unstyled;
        +  margin-left: -5px;
        +
        +  > li {
        +    display: inline-block;
        +    padding-left: 5px;
        +    padding-right: 5px;
        +  }
        +}
        +
        +// Description Lists
        +dl {
        +  margin-top: 0; // Remove browser default
        +  margin-bottom: $line-height-computed;
        +}
        +dt,
        +dd {
        +  line-height: $line-height-base;
        +}
        +dt {
        +  font-weight: bold;
        +}
        +dd {
        +  margin-left: 0; // Undo browser default
        +}
        +
        +// Horizontal description lists
        +//
        +// Defaults to being stacked without any of the below styles applied, until the
        +// grid breakpoint is reached (default of ~768px).
        +
        +.dl-horizontal {
        +  dd {
        +    @include clearfix; // Clear the floated `dt` if an empty `dd` is present
        +  }
        +
        +  @media (min-width: $dl-horizontal-breakpoint) {
        +    dt {
        +      float: left;
        +      width: ($dl-horizontal-offset - 20);
        +      clear: left;
        +      text-align: right;
        +      @include text-overflow;
        +    }
        +    dd {
        +      margin-left: $dl-horizontal-offset;
        +    }
        +  }
        +}
        +
        +
        +// Misc
        +// -------------------------
        +
        +// Abbreviations and acronyms
        +abbr[title],
        +// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
        +abbr[data-original-title] {
        +  cursor: help;
        +  border-bottom: 1px dotted $abbr-border-color;
        +}
        +.initialism {
        +  font-size: 90%;
        +  @extend .text-uppercase;
        +}
        +
        +// Blockquotes
        +blockquote {
        +  padding: ($line-height-computed / 2) $line-height-computed;
        +  margin: 0 0 $line-height-computed;
        +  font-size: $blockquote-font-size;
        +  border-left: 5px solid $blockquote-border-color;
        +
        +  p,
        +  ul,
        +  ol {
        +    &:last-child {
        +      margin-bottom: 0;
        +    }
        +  }
        +
        +  // Note: Deprecated small and .small as of v3.1.0
        +  // Context: https://github.com/twbs/bootstrap/issues/11660
        +  footer,
        +  small,
        +  .small {
        +    display: block;
        +    font-size: 80%; // back to default font-size
        +    line-height: $line-height-base;
        +    color: $blockquote-small-color;
        +
        +    &:before {
        +      content: '\2014 \00A0'; // em dash, nbsp
        +    }
        +  }
        +}
        +
        +// Opposite alignment of blockquote
        +//
        +// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
        +.blockquote-reverse,
        +blockquote.pull-right {
        +  padding-right: 15px;
        +  padding-left: 0;
        +  border-right: 5px solid $blockquote-border-color;
        +  border-left: 0;
        +  text-align: right;
        +
        +  // Account for citation
        +  footer,
        +  small,
        +  .small {
        +    &:before { content: ''; }
        +    &:after {
        +      content: '\00A0 \2014'; // nbsp, em dash
        +    }
        +  }
        +}
        +
        +// Addresses
        +address {
        +  margin-bottom: $line-height-computed;
        +  font-style: normal;
        +  line-height: $line-height-base;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_utilities.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_utilities.scss
        new file mode 100644
        index 0000000000..8c99c71643
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_utilities.scss
        @@ -0,0 +1,55 @@
        +//
        +// Utility classes
        +// --------------------------------------------------
        +
        +
        +// Floats
        +// -------------------------
        +
        +.clearfix {
        +  @include clearfix;
        +}
        +.center-block {
        +  @include center-block;
        +}
        +.pull-right {
        +  float: right !important;
        +}
        +.pull-left {
        +  float: left !important;
        +}
        +
        +
        +// Toggling content
        +// -------------------------
        +
        +// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
        +.hide {
        +  display: none !important;
        +}
        +.show {
        +  display: block !important;
        +}
        +.invisible {
        +  visibility: hidden;
        +}
        +.text-hide {
        +  @include text-hide;
        +}
        +
        +
        +// Hide from screenreaders and browsers
        +//
        +// Credit: HTML5 Boilerplate
        +
        +.hidden {
        +  display: none !important;
        +}
        +
        +
        +// For Affix plugin
        +// -------------------------
        +
        +.affix {
        +  position: fixed;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_variables.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_variables.scss
        new file mode 100644
        index 0000000000..0703b0c9a6
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_variables.scss
        @@ -0,0 +1,874 @@
        +$bootstrap-sass-asset-helper: false !default;
        +//
        +// Variables
        +// --------------------------------------------------
        +
        +
        +//== Colors
        +//
        +//## Gray and brand colors for use across Bootstrap.
        +
        +$gray-base:              #000 !default;
        +$gray-darker:            lighten($gray-base, 13.5%) !default; // #222
        +$gray-dark:              lighten($gray-base, 20%) !default;   // #333
        +$gray:                   lighten($gray-base, 33.5%) !default; // #555
        +$gray-light:             lighten($gray-base, 46.7%) !default; // #777
        +$gray-lighter:           lighten($gray-base, 93.5%) !default; // #eee
        +
        +$brand-primary:         darken(#428bca, 6.5%) !default; // #337ab7
        +$brand-success:         #5cb85c !default;
        +$brand-info:            #5bc0de !default;
        +$brand-warning:         #f0ad4e !default;
        +$brand-danger:          #d9534f !default;
        +
        +
        +//== Scaffolding
        +//
        +//## Settings for some of the most global styles.
        +
        +//** Background color for `<body>`.
        +$body-bg:               #fff !default;
        +//** Global text color on `<body>`.
        +$text-color:            $gray-dark !default;
        +
        +//** Global textual link color.
        +$link-color:            $brand-primary !default;
        +//** Link hover color set via `darken()` function.
        +$link-hover-color:      darken($link-color, 15%) !default;
        +//** Link hover decoration.
        +$link-hover-decoration: underline !default;
        +
        +
        +//== Typography
        +//
        +//## Font, line-height, and color for body text, headings, and more.
        +
        +$font-family-sans-serif:  "Helvetica Neue", Helvetica, Arial, sans-serif !default;
        +$font-family-serif:       Georgia, "Times New Roman", Times, serif !default;
        +//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
        +$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
        +$font-family-base:        $font-family-sans-serif !default;
        +
        +$font-size-base:          14px !default;
        +$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
        +$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
        +
        +$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
        +$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px
        +$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px
        +$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
        +$font-size-h5:            $font-size-base !default;
        +$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px
        +
        +//** Unit-less `line-height` for use in components like buttons.
        +$line-height-base:        1.428571429 !default; // 20/14
        +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
        +$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
        +
        +//** By default, this inherits from the `<body>`.
        +$headings-font-family:    inherit !default;
        +$headings-font-weight:    500 !default;
        +$headings-line-height:    1.1 !default;
        +$headings-color:          inherit !default;
        +
        +
        +//== Iconography
        +//
        +//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
        +
        +//** Load fonts from this directory.
        +
        +// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
        +// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
        +$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
        +
        +//** File name for all font files.
        +$icon-font-name:          "glyphicons-halflings-regular" !default;
        +//** Element ID within SVG icon file.
        +$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
        +
        +
        +//== Components
        +//
        +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
        +
        +$padding-base-vertical:     6px !default;
        +$padding-base-horizontal:   12px !default;
        +
        +$padding-large-vertical:    10px !default;
        +$padding-large-horizontal:  16px !default;
        +
        +$padding-small-vertical:    5px !default;
        +$padding-small-horizontal:  10px !default;
        +
        +$padding-xs-vertical:       1px !default;
        +$padding-xs-horizontal:     5px !default;
        +
        +$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
        +$line-height-small:         1.5 !default;
        +
        +$border-radius-base:        4px !default;
        +$border-radius-large:       6px !default;
        +$border-radius-small:       3px !default;
        +
        +//** Global color for active items (e.g., navs or dropdowns).
        +$component-active-color:    #fff !default;
        +//** Global background color for active items (e.g., navs or dropdowns).
        +$component-active-bg:       $brand-primary !default;
        +
        +//** Width of the `border` for generating carets that indicator dropdowns.
        +$caret-width-base:          4px !default;
        +//** Carets increase slightly in size for larger components.
        +$caret-width-large:         5px !default;
        +
        +
        +//== Tables
        +//
        +//## Customizes the `.table` component with basic values, each used across all table variations.
        +
        +//** Padding for `<th>`s and `<td>`s.
        +$table-cell-padding:            8px !default;
        +//** Padding for cells in `.table-condensed`.
        +$table-condensed-cell-padding:  5px !default;
        +
        +//** Default background color used for all tables.
        +$table-bg:                      transparent !default;
        +//** Background color used for `.table-striped`.
        +$table-bg-accent:               #f9f9f9 !default;
        +//** Background color used for `.table-hover`.
        +$table-bg-hover:                #f5f5f5 !default;
        +$table-bg-active:               $table-bg-hover !default;
        +
        +//** Border color for table and cell borders.
        +$table-border-color:            #ddd !default;
        +
        +
        +//== Buttons
        +//
        +//## For each of Bootstrap's buttons, define text, background and border color.
        +
        +$btn-font-weight:                normal !default;
        +
        +$btn-default-color:              #333 !default;
        +$btn-default-bg:                 #fff !default;
        +$btn-default-border:             #ccc !default;
        +
        +$btn-primary-color:              #fff !default;
        +$btn-primary-bg:                 $brand-primary !default;
        +$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
        +
        +$btn-success-color:              #fff !default;
        +$btn-success-bg:                 $brand-success !default;
        +$btn-success-border:             darken($btn-success-bg, 5%) !default;
        +
        +$btn-info-color:                 #fff !default;
        +$btn-info-bg:                    $brand-info !default;
        +$btn-info-border:                darken($btn-info-bg, 5%) !default;
        +
        +$btn-warning-color:              #fff !default;
        +$btn-warning-bg:                 $brand-warning !default;
        +$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
        +
        +$btn-danger-color:               #fff !default;
        +$btn-danger-bg:                  $brand-danger !default;
        +$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
        +
        +$btn-link-disabled-color:        $gray-light !default;
        +
        +// Allows for customizing button radius independently from global border radius
        +$btn-border-radius-base:         $border-radius-base !default;
        +$btn-border-radius-large:        $border-radius-large !default;
        +$btn-border-radius-small:        $border-radius-small !default;
        +
        +
        +//== Forms
        +//
        +//##
        +
        +//** `<input>` background color
        +$input-bg:                       #fff !default;
        +//** `<input disabled>` background color
        +$input-bg-disabled:              $gray-lighter !default;
        +
        +//** Text color for `<input>`s
        +$input-color:                    $gray !default;
        +//** `<input>` border color
        +$input-border:                   #ccc !default;
        +
        +// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
        +//** Default `.form-control` border radius
        +// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
        +$input-border-radius:            $border-radius-base !default;
        +//** Large `.form-control` border radius
        +$input-border-radius-large:      $border-radius-large !default;
        +//** Small `.form-control` border radius
        +$input-border-radius-small:      $border-radius-small !default;
        +
        +//** Border color for inputs on focus
        +$input-border-focus:             #66afe9 !default;
        +
        +//** Placeholder text color
        +$input-color-placeholder:        #999 !default;
        +
        +//** Default `.form-control` height
        +$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
        +//** Large `.form-control` height
        +$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
        +//** Small `.form-control` height
        +$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
        +
        +//** `.form-group` margin
        +$form-group-margin-bottom:       15px !default;
        +
        +$legend-color:                   $gray-dark !default;
        +$legend-border-color:            #e5e5e5 !default;
        +
        +//** Background color for textual input addons
        +$input-group-addon-bg:           $gray-lighter !default;
        +//** Border color for textual input addons
        +$input-group-addon-border-color: $input-border !default;
        +
        +//** Disabled cursor for form controls and buttons.
        +$cursor-disabled:                not-allowed !default;
        +
        +
        +//== Dropdowns
        +//
        +//## Dropdown menu container and contents.
        +
        +//** Background for the dropdown menu.
        +$dropdown-bg:                    #fff !default;
        +//** Dropdown menu `border-color`.
        +$dropdown-border:                rgba(0,0,0,.15) !default;
        +//** Dropdown menu `border-color` **for IE8**.
        +$dropdown-fallback-border:       #ccc !default;
        +//** Divider color for between dropdown items.
        +$dropdown-divider-bg:            #e5e5e5 !default;
        +
        +//** Dropdown link text color.
        +$dropdown-link-color:            $gray-dark !default;
        +//** Hover color for dropdown links.
        +$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
        +//** Hover background for dropdown links.
        +$dropdown-link-hover-bg:         #f5f5f5 !default;
        +
        +//** Active dropdown menu item text color.
        +$dropdown-link-active-color:     $component-active-color !default;
        +//** Active dropdown menu item background color.
        +$dropdown-link-active-bg:        $component-active-bg !default;
        +
        +//** Disabled dropdown menu item background color.
        +$dropdown-link-disabled-color:   $gray-light !default;
        +
        +//** Text color for headers within dropdown menus.
        +$dropdown-header-color:          $gray-light !default;
        +
        +//** Deprecated `$dropdown-caret-color` as of v3.1.0
        +$dropdown-caret-color:           #000 !default;
        +
        +
        +//-- Z-index master list
        +//
        +// Warning: Avoid customizing these values. They're used for a bird's eye view
        +// of components dependent on the z-axis and are designed to all work together.
        +//
        +// Note: These variables are not generated into the Customizer.
        +
        +$zindex-navbar:            1000 !default;
        +$zindex-dropdown:          1000 !default;
        +$zindex-popover:           1060 !default;
        +$zindex-tooltip:           1070 !default;
        +$zindex-navbar-fixed:      1030 !default;
        +$zindex-modal-background:  1040 !default;
        +$zindex-modal:             1050 !default;
        +
        +
        +//== Media queries breakpoints
        +//
        +//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
        +
        +// Extra small screen / phone
        +//** Deprecated `$screen-xs` as of v3.0.1
        +$screen-xs:                  480px !default;
        +//** Deprecated `$screen-xs-min` as of v3.2.0
        +$screen-xs-min:              $screen-xs !default;
        +//** Deprecated `$screen-phone` as of v3.0.1
        +$screen-phone:               $screen-xs-min !default;
        +
        +// Small screen / tablet
        +//** Deprecated `$screen-sm` as of v3.0.1
        +$screen-sm:                  768px !default;
        +$screen-sm-min:              $screen-sm !default;
        +//** Deprecated `$screen-tablet` as of v3.0.1
        +$screen-tablet:              $screen-sm-min !default;
        +
        +// Medium screen / desktop
        +//** Deprecated `$screen-md` as of v3.0.1
        +$screen-md:                  992px !default;
        +$screen-md-min:              $screen-md !default;
        +//** Deprecated `$screen-desktop` as of v3.0.1
        +$screen-desktop:             $screen-md-min !default;
        +
        +// Large screen / wide desktop
        +//** Deprecated `$screen-lg` as of v3.0.1
        +$screen-lg:                  1200px !default;
        +$screen-lg-min:              $screen-lg !default;
        +//** Deprecated `$screen-lg-desktop` as of v3.0.1
        +$screen-lg-desktop:          $screen-lg-min !default;
        +
        +// So media queries don't overlap when required, provide a maximum
        +$screen-xs-max:              ($screen-sm-min - 1) !default;
        +$screen-sm-max:              ($screen-md-min - 1) !default;
        +$screen-md-max:              ($screen-lg-min - 1) !default;
        +
        +
        +//== Grid system
        +//
        +//## Define your custom responsive grid.
        +
        +//** Number of columns in the grid.
        +$grid-columns:              12 !default;
        +//** Padding between columns. Gets divided in half for the left and right.
        +$grid-gutter-width:         30px !default;
        +// Navbar collapse
        +//** Point at which the navbar becomes uncollapsed.
        +$grid-float-breakpoint:     $screen-sm-min !default;
        +//** Point at which the navbar begins collapsing.
        +$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
        +
        +
        +//== Container sizes
        +//
        +//## Define the maximum width of `.container` for different screen sizes.
        +
        +// Small screen / tablet
        +$container-tablet:             (720px + $grid-gutter-width) !default;
        +//** For `$screen-sm-min` and up.
        +$container-sm:                 $container-tablet !default;
        +
        +// Medium screen / desktop
        +$container-desktop:            (940px + $grid-gutter-width) !default;
        +//** For `$screen-md-min` and up.
        +$container-md:                 $container-desktop !default;
        +
        +// Large screen / wide desktop
        +$container-large-desktop:      (1140px + $grid-gutter-width) !default;
        +//** For `$screen-lg-min` and up.
        +$container-lg:                 $container-large-desktop !default;
        +
        +
        +//== Navbar
        +//
        +//##
        +
        +// Basics of a navbar
        +$navbar-height:                    50px !default;
        +$navbar-margin-bottom:             $line-height-computed !default;
        +$navbar-border-radius:             $border-radius-base !default;
        +$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
        +$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
        +$navbar-collapse-max-height:       340px !default;
        +
        +$navbar-default-color:             #777 !default;
        +$navbar-default-bg:                #f8f8f8 !default;
        +$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
        +
        +// Navbar links
        +$navbar-default-link-color:                #777 !default;
        +$navbar-default-link-hover-color:          #333 !default;
        +$navbar-default-link-hover-bg:             transparent !default;
        +$navbar-default-link-active-color:         #555 !default;
        +$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
        +$navbar-default-link-disabled-color:       #ccc !default;
        +$navbar-default-link-disabled-bg:          transparent !default;
        +
        +// Navbar brand label
        +$navbar-default-brand-color:               $navbar-default-link-color !default;
        +$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
        +$navbar-default-brand-hover-bg:            transparent !default;
        +
        +// Navbar toggle
        +$navbar-default-toggle-hover-bg:           #ddd !default;
        +$navbar-default-toggle-icon-bar-bg:        #888 !default;
        +$navbar-default-toggle-border-color:       #ddd !default;
        +
        +
        +//=== Inverted navbar
        +// Reset inverted navbar basics
        +$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
        +$navbar-inverse-bg:                         #222 !default;
        +$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
        +
        +// Inverted navbar links
        +$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
        +$navbar-inverse-link-hover-color:           #fff !default;
        +$navbar-inverse-link-hover-bg:              transparent !default;
        +$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
        +$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
        +$navbar-inverse-link-disabled-color:        #444 !default;
        +$navbar-inverse-link-disabled-bg:           transparent !default;
        +
        +// Inverted navbar brand label
        +$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
        +$navbar-inverse-brand-hover-color:          #fff !default;
        +$navbar-inverse-brand-hover-bg:             transparent !default;
        +
        +// Inverted navbar toggle
        +$navbar-inverse-toggle-hover-bg:            #333 !default;
        +$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
        +$navbar-inverse-toggle-border-color:        #333 !default;
        +
        +
        +//== Navs
        +//
        +//##
        +
        +//=== Shared nav styles
        +$nav-link-padding:                          10px 15px !default;
        +$nav-link-hover-bg:                         $gray-lighter !default;
        +
        +$nav-disabled-link-color:                   $gray-light !default;
        +$nav-disabled-link-hover-color:             $gray-light !default;
        +
        +//== Tabs
        +$nav-tabs-border-color:                     #ddd !default;
        +
        +$nav-tabs-link-hover-border-color:          $gray-lighter !default;
        +
        +$nav-tabs-active-link-hover-bg:             $body-bg !default;
        +$nav-tabs-active-link-hover-color:          $gray !default;
        +$nav-tabs-active-link-hover-border-color:   #ddd !default;
        +
        +$nav-tabs-justified-link-border-color:            #ddd !default;
        +$nav-tabs-justified-active-link-border-color:     $body-bg !default;
        +
        +//== Pills
        +$nav-pills-border-radius:                   $border-radius-base !default;
        +$nav-pills-active-link-hover-bg:            $component-active-bg !default;
        +$nav-pills-active-link-hover-color:         $component-active-color !default;
        +
        +
        +//== Pagination
        +//
        +//##
        +
        +$pagination-color:                     $link-color !default;
        +$pagination-bg:                        #fff !default;
        +$pagination-border:                    #ddd !default;
        +
        +$pagination-hover-color:               $link-hover-color !default;
        +$pagination-hover-bg:                  $gray-lighter !default;
        +$pagination-hover-border:              #ddd !default;
        +
        +$pagination-active-color:              #fff !default;
        +$pagination-active-bg:                 $brand-primary !default;
        +$pagination-active-border:             $brand-primary !default;
        +
        +$pagination-disabled-color:            $gray-light !default;
        +$pagination-disabled-bg:               #fff !default;
        +$pagination-disabled-border:           #ddd !default;
        +
        +
        +//== Pager
        +//
        +//##
        +
        +$pager-bg:                             $pagination-bg !default;
        +$pager-border:                         $pagination-border !default;
        +$pager-border-radius:                  15px !default;
        +
        +$pager-hover-bg:                       $pagination-hover-bg !default;
        +
        +$pager-active-bg:                      $pagination-active-bg !default;
        +$pager-active-color:                   $pagination-active-color !default;
        +
        +$pager-disabled-color:                 $pagination-disabled-color !default;
        +
        +
        +//== Jumbotron
        +//
        +//##
        +
        +$jumbotron-padding:              30px !default;
        +$jumbotron-color:                inherit !default;
        +$jumbotron-bg:                   $gray-lighter !default;
        +$jumbotron-heading-color:        inherit !default;
        +$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
        +$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;
        +
        +
        +//== Form states and alerts
        +//
        +//## Define colors for form feedback states and, by default, alerts.
        +
        +$state-success-text:             #3c763d !default;
        +$state-success-bg:               #dff0d8 !default;
        +$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
        +
        +$state-info-text:                #31708f !default;
        +$state-info-bg:                  #d9edf7 !default;
        +$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
        +
        +$state-warning-text:             #8a6d3b !default;
        +$state-warning-bg:               #fcf8e3 !default;
        +$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
        +
        +$state-danger-text:              #a94442 !default;
        +$state-danger-bg:                #f2dede !default;
        +$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
        +
        +
        +//== Tooltips
        +//
        +//##
        +
        +//** Tooltip max width
        +$tooltip-max-width:           200px !default;
        +//** Tooltip text color
        +$tooltip-color:               #fff !default;
        +//** Tooltip background color
        +$tooltip-bg:                  #000 !default;
        +$tooltip-opacity:             .9 !default;
        +
        +//** Tooltip arrow width
        +$tooltip-arrow-width:         5px !default;
        +//** Tooltip arrow color
        +$tooltip-arrow-color:         $tooltip-bg !default;
        +
        +
        +//== Popovers
        +//
        +//##
        +
        +//** Popover body background color
        +$popover-bg:                          #fff !default;
        +//** Popover maximum width
        +$popover-max-width:                   276px !default;
        +//** Popover border color
        +$popover-border-color:                rgba(0,0,0,.2) !default;
        +//** Popover fallback border color
        +$popover-fallback-border-color:       #ccc !default;
        +
        +//** Popover title background color
        +$popover-title-bg:                    darken($popover-bg, 3%) !default;
        +
        +//** Popover arrow width
        +$popover-arrow-width:                 10px !default;
        +//** Popover arrow color
        +$popover-arrow-color:                 $popover-bg !default;
        +
        +//** Popover outer arrow width
        +$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
        +//** Popover outer arrow color
        +$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
        +//** Popover outer arrow fallback color
        +$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
        +
        +
        +//== Labels
        +//
        +//##
        +
        +//** Default label background color
        +$label-default-bg:            $gray-light !default;
        +//** Primary label background color
        +$label-primary-bg:            $brand-primary !default;
        +//** Success label background color
        +$label-success-bg:            $brand-success !default;
        +//** Info label background color
        +$label-info-bg:               $brand-info !default;
        +//** Warning label background color
        +$label-warning-bg:            $brand-warning !default;
        +//** Danger label background color
        +$label-danger-bg:             $brand-danger !default;
        +
        +//** Default label text color
        +$label-color:                 #fff !default;
        +//** Default text color of a linked label
        +$label-link-hover-color:      #fff !default;
        +
        +
        +//== Modals
        +//
        +//##
        +
        +//** Padding applied to the modal body
        +$modal-inner-padding:         15px !default;
        +
        +//** Padding applied to the modal title
        +$modal-title-padding:         15px !default;
        +//** Modal title line-height
        +$modal-title-line-height:     $line-height-base !default;
        +
        +//** Background color of modal content area
        +$modal-content-bg:                             #fff !default;
        +//** Modal content border color
        +$modal-content-border-color:                   rgba(0,0,0,.2) !default;
        +//** Modal content border color **for IE8**
        +$modal-content-fallback-border-color:          #999 !default;
        +
        +//** Modal backdrop background color
        +$modal-backdrop-bg:           #000 !default;
        +//** Modal backdrop opacity
        +$modal-backdrop-opacity:      .5 !default;
        +//** Modal header border color
        +$modal-header-border-color:   #e5e5e5 !default;
        +//** Modal footer border color
        +$modal-footer-border-color:   $modal-header-border-color !default;
        +
        +$modal-lg:                    900px !default;
        +$modal-md:                    600px !default;
        +$modal-sm:                    300px !default;
        +
        +
        +//== Alerts
        +//
        +//## Define alert colors, border radius, and padding.
        +
        +$alert-padding:               15px !default;
        +$alert-border-radius:         $border-radius-base !default;
        +$alert-link-font-weight:      bold !default;
        +
        +$alert-success-bg:            $state-success-bg !default;
        +$alert-success-text:          $state-success-text !default;
        +$alert-success-border:        $state-success-border !default;
        +
        +$alert-info-bg:               $state-info-bg !default;
        +$alert-info-text:             $state-info-text !default;
        +$alert-info-border:           $state-info-border !default;
        +
        +$alert-warning-bg:            $state-warning-bg !default;
        +$alert-warning-text:          $state-warning-text !default;
        +$alert-warning-border:        $state-warning-border !default;
        +
        +$alert-danger-bg:             $state-danger-bg !default;
        +$alert-danger-text:           $state-danger-text !default;
        +$alert-danger-border:         $state-danger-border !default;
        +
        +
        +//== Progress bars
        +//
        +//##
        +
        +//** Background color of the whole progress component
        +$progress-bg:                 #f5f5f5 !default;
        +//** Progress bar text color
        +$progress-bar-color:          #fff !default;
        +//** Variable for setting rounded corners on progress bar.
        +$progress-border-radius:      $border-radius-base !default;
        +
        +//** Default progress bar color
        +$progress-bar-bg:             $brand-primary !default;
        +//** Success progress bar color
        +$progress-bar-success-bg:     $brand-success !default;
        +//** Warning progress bar color
        +$progress-bar-warning-bg:     $brand-warning !default;
        +//** Danger progress bar color
        +$progress-bar-danger-bg:      $brand-danger !default;
        +//** Info progress bar color
        +$progress-bar-info-bg:        $brand-info !default;
        +
        +
        +//== List group
        +//
        +//##
        +
        +//** Background color on `.list-group-item`
        +$list-group-bg:                 #fff !default;
        +//** `.list-group-item` border color
        +$list-group-border:             #ddd !default;
        +//** List group border radius
        +$list-group-border-radius:      $border-radius-base !default;
        +
        +//** Background color of single list items on hover
        +$list-group-hover-bg:           #f5f5f5 !default;
        +//** Text color of active list items
        +$list-group-active-color:       $component-active-color !default;
        +//** Background color of active list items
        +$list-group-active-bg:          $component-active-bg !default;
        +//** Border color of active list elements
        +$list-group-active-border:      $list-group-active-bg !default;
        +//** Text color for content within active list items
        +$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
        +
        +//** Text color of disabled list items
        +$list-group-disabled-color:      $gray-light !default;
        +//** Background color of disabled list items
        +$list-group-disabled-bg:         $gray-lighter !default;
        +//** Text color for content within disabled list items
        +$list-group-disabled-text-color: $list-group-disabled-color !default;
        +
        +$list-group-link-color:         #555 !default;
        +$list-group-link-hover-color:   $list-group-link-color !default;
        +$list-group-link-heading-color: #333 !default;
        +
        +
        +//== Panels
        +//
        +//##
        +
        +$panel-bg:                    #fff !default;
        +$panel-body-padding:          15px !default;
        +$panel-heading-padding:       10px 15px !default;
        +$panel-footer-padding:        $panel-heading-padding !default;
        +$panel-border-radius:         $border-radius-base !default;
        +
        +//** Border color for elements within panels
        +$panel-inner-border:          #ddd !default;
        +$panel-footer-bg:             #f5f5f5 !default;
        +
        +$panel-default-text:          $gray-dark !default;
        +$panel-default-border:        #ddd !default;
        +$panel-default-heading-bg:    #f5f5f5 !default;
        +
        +$panel-primary-text:          #fff !default;
        +$panel-primary-border:        $brand-primary !default;
        +$panel-primary-heading-bg:    $brand-primary !default;
        +
        +$panel-success-text:          $state-success-text !default;
        +$panel-success-border:        $state-success-border !default;
        +$panel-success-heading-bg:    $state-success-bg !default;
        +
        +$panel-info-text:             $state-info-text !default;
        +$panel-info-border:           $state-info-border !default;
        +$panel-info-heading-bg:       $state-info-bg !default;
        +
        +$panel-warning-text:          $state-warning-text !default;
        +$panel-warning-border:        $state-warning-border !default;
        +$panel-warning-heading-bg:    $state-warning-bg !default;
        +
        +$panel-danger-text:           $state-danger-text !default;
        +$panel-danger-border:         $state-danger-border !default;
        +$panel-danger-heading-bg:     $state-danger-bg !default;
        +
        +
        +//== Thumbnails
        +//
        +//##
        +
        +//** Padding around the thumbnail image
        +$thumbnail-padding:           4px !default;
        +//** Thumbnail background color
        +$thumbnail-bg:                $body-bg !default;
        +//** Thumbnail border color
        +$thumbnail-border:            #ddd !default;
        +//** Thumbnail border radius
        +$thumbnail-border-radius:     $border-radius-base !default;
        +
        +//** Custom text color for thumbnail captions
        +$thumbnail-caption-color:     $text-color !default;
        +//** Padding around the thumbnail caption
        +$thumbnail-caption-padding:   9px !default;
        +
        +
        +//== Wells
        +//
        +//##
        +
        +$well-bg:                     #f5f5f5 !default;
        +$well-border:                 darken($well-bg, 7%) !default;
        +
        +
        +//== Badges
        +//
        +//##
        +
        +$badge-color:                 #fff !default;
        +//** Linked badge text color on hover
        +$badge-link-hover-color:      #fff !default;
        +$badge-bg:                    $gray-light !default;
        +
        +//** Badge text color in active nav link
        +$badge-active-color:          $link-color !default;
        +//** Badge background color in active nav link
        +$badge-active-bg:             #fff !default;
        +
        +$badge-font-weight:           bold !default;
        +$badge-line-height:           1 !default;
        +$badge-border-radius:         10px !default;
        +
        +
        +//== Breadcrumbs
        +//
        +//##
        +
        +$breadcrumb-padding-vertical:   8px !default;
        +$breadcrumb-padding-horizontal: 15px !default;
        +//** Breadcrumb background color
        +$breadcrumb-bg:                 #f5f5f5 !default;
        +//** Breadcrumb text color
        +$breadcrumb-color:              #ccc !default;
        +//** Text color of current page in the breadcrumb
        +$breadcrumb-active-color:       $gray-light !default;
        +//** Textual separator for between breadcrumb elements
        +$breadcrumb-separator:          "/" !default;
        +
        +
        +//== Carousel
        +//
        +//##
        +
        +$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
        +
        +$carousel-control-color:                      #fff !default;
        +$carousel-control-width:                      15% !default;
        +$carousel-control-opacity:                    .5 !default;
        +$carousel-control-font-size:                  20px !default;
        +
        +$carousel-indicator-active-bg:                #fff !default;
        +$carousel-indicator-border-color:             #fff !default;
        +
        +$carousel-caption-color:                      #fff !default;
        +
        +
        +//== Close
        +//
        +//##
        +
        +$close-font-weight:           bold !default;
        +$close-color:                 #000 !default;
        +$close-text-shadow:           0 1px 0 #fff !default;
        +
        +
        +//== Code
        +//
        +//##
        +
        +$code-color:                  #c7254e !default;
        +$code-bg:                     #f9f2f4 !default;
        +
        +$kbd-color:                   #fff !default;
        +$kbd-bg:                      #333 !default;
        +
        +$pre-bg:                      #f5f5f5 !default;
        +$pre-color:                   $gray-dark !default;
        +$pre-border-color:            #ccc !default;
        +$pre-scrollable-max-height:   340px !default;
        +
        +
        +//== Type
        +//
        +//##
        +
        +//** Horizontal offset for forms and lists.
        +$component-offset-horizontal: 180px !default;
        +//** Text muted color
        +$text-muted:                  $gray-light !default;
        +//** Abbreviations and acronyms border color
        +$abbr-border-color:           $gray-light !default;
        +//** Headings small color
        +$headings-small-color:        $gray-light !default;
        +//** Blockquote small color
        +$blockquote-small-color:      $gray-light !default;
        +//** Blockquote font size
        +$blockquote-font-size:        ($font-size-base * 1.25) !default;
        +//** Blockquote border color
        +$blockquote-border-color:     $gray-lighter !default;
        +//** Page header border color
        +$page-header-border-color:    $gray-lighter !default;
        +//** Width of horizontal description list titles
        +$dl-horizontal-offset:        $component-offset-horizontal !default;
        +//** Point at which .dl-horizontal becomes horizontal
        +$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;
        +//** Horizontal line color.
        +$hr-border:                   $gray-lighter !default;
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/_wells.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/_wells.scss
        new file mode 100644
        index 0000000000..b8657118a6
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/_wells.scss
        @@ -0,0 +1,29 @@
        +//
        +// Wells
        +// --------------------------------------------------
        +
        +
        +// Base class
        +.well {
        +  min-height: 20px;
        +  padding: 19px;
        +  margin-bottom: 20px;
        +  background-color: $well-bg;
        +  border: 1px solid $well-border;
        +  border-radius: $border-radius-base;
        +  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
        +  blockquote {
        +    border-color: #ddd;
        +    border-color: rgba(0,0,0,.15);
        +  }
        +}
        +
        +// Sizes
        +.well-lg {
        +  padding: 24px;
        +  border-radius: $border-radius-large;
        +}
        +.well-sm {
        +  padding: 9px;
        +  border-radius: $border-radius-small;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_alerts.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_alerts.scss
        new file mode 100644
        index 0000000000..3faf0b5a50
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_alerts.scss
        @@ -0,0 +1,14 @@
        +// Alerts
        +
        +@mixin alert-variant($background, $border, $text-color) {
        +  background-color: $background;
        +  border-color: $border;
        +  color: $text-color;
        +
        +  hr {
        +    border-top-color: darken($border, 5%);
        +  }
        +  .alert-link {
        +    color: darken($text-color, 10%);
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_background-variant.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_background-variant.scss
        new file mode 100644
        index 0000000000..4c7769e13a
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_background-variant.scss
        @@ -0,0 +1,12 @@
        +// Contextual backgrounds
        +
        +// [converter] $parent hack
        +@mixin bg-variant($parent, $color) {
        +  #{$parent} {
        +    background-color: $color;
        +  }
        +  a#{$parent}:hover,
        +  a#{$parent}:focus {
        +    background-color: darken($color, 10%);
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_border-radius.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_border-radius.scss
        new file mode 100644
        index 0000000000..ce19499875
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_border-radius.scss
        @@ -0,0 +1,18 @@
        +// Single side border-radius
        +
        +@mixin border-top-radius($radius) {
        +  border-top-right-radius: $radius;
        +   border-top-left-radius: $radius;
        +}
        +@mixin border-right-radius($radius) {
        +  border-bottom-right-radius: $radius;
        +     border-top-right-radius: $radius;
        +}
        +@mixin border-bottom-radius($radius) {
        +  border-bottom-right-radius: $radius;
        +   border-bottom-left-radius: $radius;
        +}
        +@mixin border-left-radius($radius) {
        +  border-bottom-left-radius: $radius;
        +     border-top-left-radius: $radius;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_buttons.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_buttons.scss
        new file mode 100644
        index 0000000000..b93f84b2cb
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_buttons.scss
        @@ -0,0 +1,65 @@
        +// Button variants
        +//
        +// Easily pump out default styles, as well as :hover, :focus, :active,
        +// and disabled options for all buttons
        +
        +@mixin button-variant($color, $background, $border) {
        +  color: $color;
        +  background-color: $background;
        +  border-color: $border;
        +
        +  &:focus,
        +  &.focus {
        +    color: $color;
        +    background-color: darken($background, 10%);
        +        border-color: darken($border, 25%);
        +  }
        +  &:hover {
        +    color: $color;
        +    background-color: darken($background, 10%);
        +        border-color: darken($border, 12%);
        +  }
        +  &:active,
        +  &.active,
        +  .open > &.dropdown-toggle {
        +    color: $color;
        +    background-color: darken($background, 10%);
        +        border-color: darken($border, 12%);
        +
        +    &:hover,
        +    &:focus,
        +    &.focus {
        +      color: $color;
        +      background-color: darken($background, 17%);
        +          border-color: darken($border, 25%);
        +    }
        +  }
        +  &:active,
        +  &.active,
        +  .open > &.dropdown-toggle {
        +    background-image: none;
        +  }
        +  &.disabled,
        +  &[disabled],
        +  fieldset[disabled] & {
        +    &:hover,
        +    &:focus,
        +    &.focus {
        +      background-color: $background;
        +          border-color: $border;
        +    }
        +  }
        +
        +  .badge {
        +    color: $background;
        +    background-color: $color;
        +  }
        +}
        +
        +// Button sizes
        +@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
        +  padding: $padding-vertical $padding-horizontal;
        +  font-size: $font-size;
        +  line-height: $line-height;
        +  border-radius: $border-radius;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_center-block.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_center-block.scss
        new file mode 100644
        index 0000000000..e06fb5e276
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_center-block.scss
        @@ -0,0 +1,7 @@
        +// Center-align a block level element
        +
        +@mixin center-block() {
        +  display: block;
        +  margin-left: auto;
        +  margin-right: auto;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_clearfix.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_clearfix.scss
        new file mode 100644
        index 0000000000..dc3e2ab426
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_clearfix.scss
        @@ -0,0 +1,22 @@
        +// Clearfix
        +//
        +// For modern browsers
        +// 1. The space content is one way to avoid an Opera bug when the
        +//    contenteditable attribute is included anywhere else in the document.
        +//    Otherwise it causes space to appear at the top and bottom of elements
        +//    that are clearfixed.
        +// 2. The use of `table` rather than `block` is only necessary if using
        +//    `:before` to contain the top-margins of child elements.
        +//
        +// Source: http://nicolasgallagher.com/micro-clearfix-hack/
        +
        +@mixin clearfix() {
        +  &:before,
        +  &:after {
        +    content: " "; // 1
        +    display: table; // 2
        +  }
        +  &:after {
        +    clear: both;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_forms.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_forms.scss
        new file mode 100644
        index 0000000000..277aa5f8e1
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_forms.scss
        @@ -0,0 +1,88 @@
        +// Form validation states
        +//
        +// Used in forms.less to generate the form validation CSS for warnings, errors,
        +// and successes.
        +
        +@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
        +  // Color the label and help text
        +  .help-block,
        +  .control-label,
        +  .radio,
        +  .checkbox,
        +  .radio-inline,
        +  .checkbox-inline,
        +  &.radio label,
        +  &.checkbox label,
        +  &.radio-inline label,
        +  &.checkbox-inline label  {
        +    color: $text-color;
        +  }
        +  // Set the border and box shadow on specific inputs to match
        +  .form-control {
        +    border-color: $border-color;
        +    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
        +    &:focus {
        +      border-color: darken($border-color, 10%);
        +      $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
        +      @include box-shadow($shadow);
        +    }
        +  }
        +  // Set validation states also for addons
        +  .input-group-addon {
        +    color: $text-color;
        +    border-color: $border-color;
        +    background-color: $background-color;
        +  }
        +  // Optional feedback icon
        +  .form-control-feedback {
        +    color: $text-color;
        +  }
        +}
        +
        +
        +// Form control focus state
        +//
        +// Generate a customized focus state and for any input with the specified color,
        +// which defaults to the `$input-border-focus` variable.
        +//
        +// We highly encourage you to not customize the default value, but instead use
        +// this to tweak colors on an as-needed basis. This aesthetic change is based on
        +// WebKit's default styles, but applicable to a wider range of browsers. Its
        +// usability and accessibility should be taken into account with any change.
        +//
        +// Example usage: change the default blue border and shadow to white for better
        +// contrast against a dark gray background.
        +@mixin form-control-focus($color: $input-border-focus) {
        +  $color-rgba: rgba(red($color), green($color), blue($color), .6);
        +  &:focus {
        +    border-color: $color;
        +    outline: 0;
        +    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
        +  }
        +}
        +
        +// Form control sizing
        +//
        +// Relative text size, padding, and border-radii changes for form controls. For
        +// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
        +// element gets special love because it's special, and that's a fact!
        +// [converter] $parent hack
        +@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
        +  #{$parent} {
        +    height: $input-height;
        +    padding: $padding-vertical $padding-horizontal;
        +    font-size: $font-size;
        +    line-height: $line-height;
        +    border-radius: $border-radius;
        +  }
        +
        +  select#{$parent} {
        +    height: $input-height;
        +    line-height: $input-height;
        +  }
        +
        +  textarea#{$parent},
        +  select[multiple]#{$parent} {
        +    height: auto;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_gradients.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_gradients.scss
        new file mode 100644
        index 0000000000..a8939f5ae6
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_gradients.scss
        @@ -0,0 +1,58 @@
        +// Gradients
        +
        +
        +
        +// Horizontal gradient, from left to right
        +//
        +// Creates two color stops, start and end, by specifying a color and position for each color stop.
        +// Color stops are not available in IE9 and below.
        +@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
        +  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
        +  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12
        +  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        +  background-repeat: repeat-x;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
        +}
        +
        +// Vertical gradient, from top to bottom
        +//
        +// Creates two color stops, start and end, by specifying a color and position for each color stop.
        +// Color stops are not available in IE9 and below.
        +@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
        +  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+
        +  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12
        +  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        +  background-repeat: repeat-x;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
        +}
        +
        +@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
        +  background-repeat: repeat-x;
        +  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
        +  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12
        +  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        +}
        +@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
        +  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
        +  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
        +  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
        +  background-repeat: no-repeat;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
        +}
        +@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
        +  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
        +  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);
        +  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
        +  background-repeat: no-repeat;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
        +}
        +@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
        +  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
        +  background-image: radial-gradient(circle, $inner-color, $outer-color);
        +  background-repeat: no-repeat;
        +}
        +@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
        +  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
        +  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
        +  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_grid-framework.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_grid-framework.scss
        new file mode 100644
        index 0000000000..16d038c04f
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_grid-framework.scss
        @@ -0,0 +1,81 @@
        +// Framework grid generation
        +//
        +// Used only by Bootstrap to generate the correct number of grid classes given
        +// any value of `$grid-columns`.
        +
        +// [converter] This is defined recursively in LESS, but Sass supports real loops
        +@mixin make-grid-columns($i: 1, $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}") {
        +  @for $i from (1 + 1) through $grid-columns {
        +    $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
        +  }
        +  #{$list} {
        +    position: relative;
        +    // Prevent columns from collapsing when empty
        +    min-height: 1px;
        +    // Inner gutter via padding
        +    padding-left:  ceil(($grid-gutter-width / 2));
        +    padding-right: floor(($grid-gutter-width / 2));
        +  }
        +}
        +
        +
        +// [converter] This is defined recursively in LESS, but Sass supports real loops
        +@mixin float-grid-columns($class, $i: 1, $list: ".col-#{$class}-#{$i}") {
        +  @for $i from (1 + 1) through $grid-columns {
        +    $list: "#{$list}, .col-#{$class}-#{$i}";
        +  }
        +  #{$list} {
        +    float: left;
        +  }
        +}
        +
        +
        +@mixin calc-grid-column($index, $class, $type) {
        +  @if ($type == width) and ($index > 0) {
        +    .col-#{$class}-#{$index} {
        +      width: percentage(($index / $grid-columns));
        +    }
        +  }
        +  @if ($type == push) and ($index > 0) {
        +    .col-#{$class}-push-#{$index} {
        +      left: percentage(($index / $grid-columns));
        +    }
        +  }
        +  @if ($type == push) and ($index == 0) {
        +    .col-#{$class}-push-0 {
        +      left: auto;
        +    }
        +  }
        +  @if ($type == pull) and ($index > 0) {
        +    .col-#{$class}-pull-#{$index} {
        +      right: percentage(($index / $grid-columns));
        +    }
        +  }
        +  @if ($type == pull) and ($index == 0) {
        +    .col-#{$class}-pull-0 {
        +      right: auto;
        +    }
        +  }
        +  @if ($type == offset) {
        +    .col-#{$class}-offset-#{$index} {
        +      margin-left: percentage(($index / $grid-columns));
        +    }
        +  }
        +}
        +
        +// [converter] This is defined recursively in LESS, but Sass supports real loops
        +@mixin loop-grid-columns($columns, $class, $type) {
        +  @for $i from 0 through $columns {
        +    @include calc-grid-column($i, $class, $type);
        +  }
        +}
        +
        +
        +// Create grid for specific class
        +@mixin make-grid($class) {
        +  @include float-grid-columns($class);
        +  @include loop-grid-columns($grid-columns, $class, width);
        +  @include loop-grid-columns($grid-columns, $class, pull);
        +  @include loop-grid-columns($grid-columns, $class, push);
        +  @include loop-grid-columns($grid-columns, $class, offset);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_grid.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_grid.scss
        new file mode 100644
        index 0000000000..59551dac1e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_grid.scss
        @@ -0,0 +1,122 @@
        +// Grid system
        +//
        +// Generate semantic grid columns with these mixins.
        +
        +// Centered container element
        +@mixin container-fixed($gutter: $grid-gutter-width) {
        +  margin-right: auto;
        +  margin-left: auto;
        +  padding-left:  floor(($gutter / 2));
        +  padding-right: ceil(($gutter / 2));
        +  @include clearfix;
        +}
        +
        +// Creates a wrapper for a series of columns
        +@mixin make-row($gutter: $grid-gutter-width) {
        +  margin-left:  ceil(($gutter / -2));
        +  margin-right: floor(($gutter / -2));
        +  @include clearfix;
        +}
        +
        +// Generate the extra small columns
        +@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
        +  position: relative;
        +  float: left;
        +  width: percentage(($columns / $grid-columns));
        +  min-height: 1px;
        +  padding-left:  ($gutter / 2);
        +  padding-right: ($gutter / 2);
        +}
        +@mixin make-xs-column-offset($columns) {
        +  margin-left: percentage(($columns / $grid-columns));
        +}
        +@mixin make-xs-column-push($columns) {
        +  left: percentage(($columns / $grid-columns));
        +}
        +@mixin make-xs-column-pull($columns) {
        +  right: percentage(($columns / $grid-columns));
        +}
        +
        +// Generate the small columns
        +@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
        +  position: relative;
        +  min-height: 1px;
        +  padding-left:  ($gutter / 2);
        +  padding-right: ($gutter / 2);
        +
        +  @media (min-width: $screen-sm-min) {
        +    float: left;
        +    width: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-sm-column-offset($columns) {
        +  @media (min-width: $screen-sm-min) {
        +    margin-left: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-sm-column-push($columns) {
        +  @media (min-width: $screen-sm-min) {
        +    left: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-sm-column-pull($columns) {
        +  @media (min-width: $screen-sm-min) {
        +    right: percentage(($columns / $grid-columns));
        +  }
        +}
        +
        +// Generate the medium columns
        +@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
        +  position: relative;
        +  min-height: 1px;
        +  padding-left:  ($gutter / 2);
        +  padding-right: ($gutter / 2);
        +
        +  @media (min-width: $screen-md-min) {
        +    float: left;
        +    width: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-md-column-offset($columns) {
        +  @media (min-width: $screen-md-min) {
        +    margin-left: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-md-column-push($columns) {
        +  @media (min-width: $screen-md-min) {
        +    left: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-md-column-pull($columns) {
        +  @media (min-width: $screen-md-min) {
        +    right: percentage(($columns / $grid-columns));
        +  }
        +}
        +
        +// Generate the large columns
        +@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
        +  position: relative;
        +  min-height: 1px;
        +  padding-left:  ($gutter / 2);
        +  padding-right: ($gutter / 2);
        +
        +  @media (min-width: $screen-lg-min) {
        +    float: left;
        +    width: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-lg-column-offset($columns) {
        +  @media (min-width: $screen-lg-min) {
        +    margin-left: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-lg-column-push($columns) {
        +  @media (min-width: $screen-lg-min) {
        +    left: percentage(($columns / $grid-columns));
        +  }
        +}
        +@mixin make-lg-column-pull($columns) {
        +  @media (min-width: $screen-lg-min) {
        +    right: percentage(($columns / $grid-columns));
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_hide-text.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_hide-text.scss
        new file mode 100644
        index 0000000000..1767e029c5
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_hide-text.scss
        @@ -0,0 +1,21 @@
        +// CSS image replacement
        +//
        +// Heads up! v3 launched with only `.hide-text()`, but per our pattern for
        +// mixins being reused as classes with the same name, this doesn't hold up. As
        +// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
        +//
        +// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
        +
        +// Deprecated as of v3.0.1 (has been removed in v4)
        +@mixin hide-text() {
        +  font: 0/0 a;
        +  color: transparent;
        +  text-shadow: none;
        +  background-color: transparent;
        +  border: 0;
        +}
        +
        +// New mixin to use as of v3.0.1
        +@mixin text-hide() {
        +  @include hide-text;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_image.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_image.scss
        new file mode 100644
        index 0000000000..c8dcf5e9cd
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_image.scss
        @@ -0,0 +1,33 @@
        +// Image Mixins
        +// - Responsive image
        +// - Retina image
        +
        +
        +// Responsive image
        +//
        +// Keep images from scaling beyond the width of their parents.
        +@mixin img-responsive($display: block) {
        +  display: $display;
        +  max-width: 100%; // Part 1: Set a maximum relative to the parent
        +  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
        +}
        +
        +
        +// Retina image
        +//
        +// Short retina mixin for setting background-image and -size. Note that the
        +// spelling of `min--moz-device-pixel-ratio` is intentional.
        +@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
        +  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
        +
        +  @media
        +  only screen and (-webkit-min-device-pixel-ratio: 2),
        +  only screen and (   min--moz-device-pixel-ratio: 2),
        +  only screen and (     -o-min-device-pixel-ratio: 2/1),
        +  only screen and (        min-device-pixel-ratio: 2),
        +  only screen and (                min-resolution: 192dpi),
        +  only screen and (                min-resolution: 2dppx) {
        +    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
        +    background-size: $width-1x $height-1x;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_labels.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_labels.scss
        new file mode 100644
        index 0000000000..eda6dfd29e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_labels.scss
        @@ -0,0 +1,12 @@
        +// Labels
        +
        +@mixin label-variant($color) {
        +  background-color: $color;
        +
        +  &[href] {
        +    &:hover,
        +    &:focus {
        +      background-color: darken($color, 10%);
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_list-group.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_list-group.scss
        new file mode 100644
        index 0000000000..c478eeb31e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_list-group.scss
        @@ -0,0 +1,32 @@
        +// List Groups
        +
        +@mixin list-group-item-variant($state, $background, $color) {
        +  .list-group-item-#{$state} {
        +    color: $color;
        +    background-color: $background;
        +
        +    // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}
        +  }
        +
        +  a.list-group-item-#{$state},
        +  button.list-group-item-#{$state} {
        +    color: $color;
        +
        +    .list-group-item-heading {
        +      color: inherit;
        +    }
        +
        +    &:hover,
        +    &:focus {
        +      color: $color;
        +      background-color: darken($background, 5%);
        +    }
        +    &.active,
        +    &.active:hover,
        +    &.active:focus {
        +      color: #fff;
        +      background-color: $color;
        +      border-color: $color;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_nav-divider.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_nav-divider.scss
        new file mode 100644
        index 0000000000..2e6da02a47
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_nav-divider.scss
        @@ -0,0 +1,10 @@
        +// Horizontal dividers
        +//
        +// Dividers (basically an hr) within dropdowns and nav lists
        +
        +@mixin nav-divider($color: #e5e5e5) {
        +  height: 1px;
        +  margin: (($line-height-computed / 2) - 1) 0;
        +  overflow: hidden;
        +  background-color: $color;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_nav-vertical-align.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_nav-vertical-align.scss
        new file mode 100644
        index 0000000000..c8fbf1a7d6
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_nav-vertical-align.scss
        @@ -0,0 +1,9 @@
        +// Navbar vertical align
        +//
        +// Vertically center elements in the navbar.
        +// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
        +
        +@mixin navbar-vertical-align($element-height) {
        +  margin-top: (($navbar-height - $element-height) / 2);
        +  margin-bottom: (($navbar-height - $element-height) / 2);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_opacity.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_opacity.scss
        new file mode 100644
        index 0000000000..88e9a576ab
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_opacity.scss
        @@ -0,0 +1,8 @@
        +// Opacity
        +
        +@mixin opacity($opacity) {
        +  opacity: $opacity;
        +  // IE8 filter
        +  $opacity-ie: ($opacity * 100);
        +  filter: alpha(opacity=$opacity-ie);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_pagination.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_pagination.scss
        new file mode 100644
        index 0000000000..d4a5404fce
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_pagination.scss
        @@ -0,0 +1,24 @@
        +// Pagination
        +
        +@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
        +  > li {
        +    > a,
        +    > span {
        +      padding: $padding-vertical $padding-horizontal;
        +      font-size: $font-size;
        +      line-height: $line-height;
        +    }
        +    &:first-child {
        +      > a,
        +      > span {
        +        @include border-left-radius($border-radius);
        +      }
        +    }
        +    &:last-child {
        +      > a,
        +      > span {
        +        @include border-right-radius($border-radius);
        +      }
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_panels.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_panels.scss
        new file mode 100644
        index 0000000000..3ff31ae51e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_panels.scss
        @@ -0,0 +1,24 @@
        +// Panels
        +
        +@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
        +  border-color: $border;
        +
        +  & > .panel-heading {
        +    color: $heading-text-color;
        +    background-color: $heading-bg-color;
        +    border-color: $heading-border;
        +
        +    + .panel-collapse > .panel-body {
        +      border-top-color: $border;
        +    }
        +    .badge {
        +      color: $heading-bg-color;
        +      background-color: $heading-text-color;
        +    }
        +  }
        +  & > .panel-footer {
        +    + .panel-collapse > .panel-body {
        +      border-bottom-color: $border;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_progress-bar.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_progress-bar.scss
        new file mode 100644
        index 0000000000..90a62afc2d
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_progress-bar.scss
        @@ -0,0 +1,10 @@
        +// Progress bars
        +
        +@mixin progress-bar-variant($color) {
        +  background-color: $color;
        +
        +  // Deprecated parent class requirement as of v3.2.0
        +  .progress-striped & {
        +    @include gradient-striped;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_reset-filter.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_reset-filter.scss
        new file mode 100644
        index 0000000000..bf73051200
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_reset-filter.scss
        @@ -0,0 +1,8 @@
        +// Reset filters for IE
        +//
        +// When you need to remove a gradient background, do not forget to use this to reset
        +// the IE filter for IE9 and below.
        +
        +@mixin reset-filter() {
        +  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_reset-text.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_reset-text.scss
        new file mode 100644
        index 0000000000..c9c28417fa
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_reset-text.scss
        @@ -0,0 +1,18 @@
        +@mixin reset-text() {
        +  font-family: $font-family-base;
        +  // We deliberately do NOT reset font-size.
        +  font-style: normal;
        +  font-weight: normal;
        +  letter-spacing: normal;
        +  line-break: auto;
        +  line-height: $line-height-base;
        +  text-align: left; // Fallback for where `start` is not supported
        +  text-align: start;
        +  text-decoration: none;
        +  text-shadow: none;
        +  text-transform: none;
        +  white-space: normal;
        +  word-break: normal;
        +  word-spacing: normal;
        +  word-wrap: normal;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_resize.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_resize.scss
        new file mode 100644
        index 0000000000..83fa637917
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_resize.scss
        @@ -0,0 +1,6 @@
        +// Resize anything
        +
        +@mixin resizable($direction) {
        +  resize: $direction; // Options: horizontal, vertical, both
        +  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_responsive-visibility.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_responsive-visibility.scss
        new file mode 100644
        index 0000000000..cbdf777239
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_responsive-visibility.scss
        @@ -0,0 +1,21 @@
        +// Responsive utilities
        +
        +//
        +// More easily include all the states for responsive-utilities.less.
        +// [converter] $parent hack
        +@mixin responsive-visibility($parent) {
        +  #{$parent} {
        +    display: block !important;
        +  }
        +  table#{$parent}  { display: table !important; }
        +  tr#{$parent}     { display: table-row !important; }
        +  th#{$parent},
        +  td#{$parent}     { display: table-cell !important; }
        +}
        +
        +// [converter] $parent hack
        +@mixin responsive-invisibility($parent) {
        +  #{$parent} {
        +    display: none !important;
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_size.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_size.scss
        new file mode 100644
        index 0000000000..abbe2463ce
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_size.scss
        @@ -0,0 +1,10 @@
        +// Sizing shortcuts
        +
        +@mixin size($width, $height) {
        +  width: $width;
        +  height: $height;
        +}
        +
        +@mixin square($size) {
        +  @include size($size, $size);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_tab-focus.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_tab-focus.scss
        new file mode 100644
        index 0000000000..7df0ae7ca1
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_tab-focus.scss
        @@ -0,0 +1,9 @@
        +// WebKit-style focus
        +
        +@mixin tab-focus() {
        +  // Default
        +  outline: thin dotted;
        +  // WebKit
        +  outline: 5px auto -webkit-focus-ring-color;
        +  outline-offset: -2px;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_table-row.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_table-row.scss
        new file mode 100644
        index 0000000000..136795081e
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_table-row.scss
        @@ -0,0 +1,28 @@
        +// Tables
        +
        +@mixin table-row-variant($state, $background) {
        +  // Exact selectors below required to override `.table-striped` and prevent
        +  // inheritance to nested tables.
        +  .table > thead > tr,
        +  .table > tbody > tr,
        +  .table > tfoot > tr {
        +    > td.#{$state},
        +    > th.#{$state},
        +    &.#{$state} > td,
        +    &.#{$state} > th {
        +      background-color: $background;
        +    }
        +  }
        +
        +  // Hover states for `.table-hover`
        +  // Note: this is not available for cells or rows within `thead` or `tfoot`.
        +  .table-hover > tbody > tr {
        +    > td.#{$state}:hover,
        +    > th.#{$state}:hover,
        +    &.#{$state}:hover > td,
        +    &:hover > .#{$state},
        +    &.#{$state}:hover > th {
        +      background-color: darken($background, 5%);
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_text-emphasis.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_text-emphasis.scss
        new file mode 100644
        index 0000000000..3b446c4152
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_text-emphasis.scss
        @@ -0,0 +1,12 @@
        +// Typography
        +
        +// [converter] $parent hack
        +@mixin text-emphasis-variant($parent, $color) {
        +  #{$parent} {
        +    color: $color;
        +  }
        +  a#{$parent}:hover,
        +  a#{$parent}:focus {
        +    color: darken($color, 10%);
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_text-overflow.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_text-overflow.scss
        new file mode 100644
        index 0000000000..1593b25ea5
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_text-overflow.scss
        @@ -0,0 +1,8 @@
        +// Text overflow
        +// Requires inline-block or block for proper styling
        +
        +@mixin text-overflow() {
        +  overflow: hidden;
        +  text-overflow: ellipsis;
        +  white-space: nowrap;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_vendor-prefixes.scss b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_vendor-prefixes.scss
        new file mode 100644
        index 0000000000..b3d0371fa8
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/bootstrap/mixins/_vendor-prefixes.scss
        @@ -0,0 +1,222 @@
        +// Vendor Prefixes
        +//
        +// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
        +// Autoprefixer in our Gruntfile. They have been removed in v4.
        +
        +// - Animations
        +// - Backface visibility
        +// - Box shadow
        +// - Box sizing
        +// - Content columns
        +// - Hyphens
        +// - Placeholder text
        +// - Transformations
        +// - Transitions
        +// - User Select
        +
        +
        +// Animations
        +@mixin animation($animation) {
        +  -webkit-animation: $animation;
        +       -o-animation: $animation;
        +          animation: $animation;
        +}
        +@mixin animation-name($name) {
        +  -webkit-animation-name: $name;
        +          animation-name: $name;
        +}
        +@mixin animation-duration($duration) {
        +  -webkit-animation-duration: $duration;
        +          animation-duration: $duration;
        +}
        +@mixin animation-timing-function($timing-function) {
        +  -webkit-animation-timing-function: $timing-function;
        +          animation-timing-function: $timing-function;
        +}
        +@mixin animation-delay($delay) {
        +  -webkit-animation-delay: $delay;
        +          animation-delay: $delay;
        +}
        +@mixin animation-iteration-count($iteration-count) {
        +  -webkit-animation-iteration-count: $iteration-count;
        +          animation-iteration-count: $iteration-count;
        +}
        +@mixin animation-direction($direction) {
        +  -webkit-animation-direction: $direction;
        +          animation-direction: $direction;
        +}
        +@mixin animation-fill-mode($fill-mode) {
        +  -webkit-animation-fill-mode: $fill-mode;
        +          animation-fill-mode: $fill-mode;
        +}
        +
        +// Backface visibility
        +// Prevent browsers from flickering when using CSS 3D transforms.
        +// Default value is `visible`, but can be changed to `hidden`
        +
        +@mixin backface-visibility($visibility) {
        +  -webkit-backface-visibility: $visibility;
        +     -moz-backface-visibility: $visibility;
        +          backface-visibility: $visibility;
        +}
        +
        +// Drop shadows
        +//
        +// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
        +// supported browsers that have box shadow capabilities now support it.
        +
        +@mixin box-shadow($shadow...) {
        +  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
        +          box-shadow: $shadow;
        +}
        +
        +// Box sizing
        +@mixin box-sizing($boxmodel) {
        +  -webkit-box-sizing: $boxmodel;
        +     -moz-box-sizing: $boxmodel;
        +          box-sizing: $boxmodel;
        +}
        +
        +// CSS3 Content Columns
        +@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
        +  -webkit-column-count: $column-count;
        +     -moz-column-count: $column-count;
        +          column-count: $column-count;
        +  -webkit-column-gap: $column-gap;
        +     -moz-column-gap: $column-gap;
        +          column-gap: $column-gap;
        +}
        +
        +// Optional hyphenation
        +@mixin hyphens($mode: auto) {
        +  word-wrap: break-word;
        +  -webkit-hyphens: $mode;
        +     -moz-hyphens: $mode;
        +      -ms-hyphens: $mode; // IE10+
        +       -o-hyphens: $mode;
        +          hyphens: $mode;
        +}
        +
        +// Placeholder text
        +@mixin placeholder($color: $input-color-placeholder) {
        +  // Firefox
        +  &::-moz-placeholder {
        +    color: $color;
        +    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
        +  }
        +  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
        +  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome
        +}
        +
        +// Transformations
        +@mixin scale($ratio...) {
        +  -webkit-transform: scale($ratio);
        +      -ms-transform: scale($ratio); // IE9 only
        +       -o-transform: scale($ratio);
        +          transform: scale($ratio);
        +}
        +
        +@mixin scaleX($ratio) {
        +  -webkit-transform: scaleX($ratio);
        +      -ms-transform: scaleX($ratio); // IE9 only
        +       -o-transform: scaleX($ratio);
        +          transform: scaleX($ratio);
        +}
        +@mixin scaleY($ratio) {
        +  -webkit-transform: scaleY($ratio);
        +      -ms-transform: scaleY($ratio); // IE9 only
        +       -o-transform: scaleY($ratio);
        +          transform: scaleY($ratio);
        +}
        +@mixin skew($x, $y) {
        +  -webkit-transform: skewX($x) skewY($y);
        +      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
        +       -o-transform: skewX($x) skewY($y);
        +          transform: skewX($x) skewY($y);
        +}
        +@mixin translate($x, $y) {
        +  -webkit-transform: translate($x, $y);
        +      -ms-transform: translate($x, $y); // IE9 only
        +       -o-transform: translate($x, $y);
        +          transform: translate($x, $y);
        +}
        +@mixin translate3d($x, $y, $z) {
        +  -webkit-transform: translate3d($x, $y, $z);
        +          transform: translate3d($x, $y, $z);
        +}
        +@mixin rotate($degrees) {
        +  -webkit-transform: rotate($degrees);
        +      -ms-transform: rotate($degrees); // IE9 only
        +       -o-transform: rotate($degrees);
        +          transform: rotate($degrees);
        +}
        +@mixin rotateX($degrees) {
        +  -webkit-transform: rotateX($degrees);
        +      -ms-transform: rotateX($degrees); // IE9 only
        +       -o-transform: rotateX($degrees);
        +          transform: rotateX($degrees);
        +}
        +@mixin rotateY($degrees) {
        +  -webkit-transform: rotateY($degrees);
        +      -ms-transform: rotateY($degrees); // IE9 only
        +       -o-transform: rotateY($degrees);
        +          transform: rotateY($degrees);
        +}
        +@mixin perspective($perspective) {
        +  -webkit-perspective: $perspective;
        +     -moz-perspective: $perspective;
        +          perspective: $perspective;
        +}
        +@mixin perspective-origin($perspective) {
        +  -webkit-perspective-origin: $perspective;
        +     -moz-perspective-origin: $perspective;
        +          perspective-origin: $perspective;
        +}
        +@mixin transform-origin($origin) {
        +  -webkit-transform-origin: $origin;
        +     -moz-transform-origin: $origin;
        +      -ms-transform-origin: $origin; // IE9 only
        +          transform-origin: $origin;
        +}
        +
        +
        +// Transitions
        +
        +@mixin transition($transition...) {
        +  -webkit-transition: $transition;
        +       -o-transition: $transition;
        +          transition: $transition;
        +}
        +@mixin transition-property($transition-property...) {
        +  -webkit-transition-property: $transition-property;
        +          transition-property: $transition-property;
        +}
        +@mixin transition-delay($transition-delay) {
        +  -webkit-transition-delay: $transition-delay;
        +          transition-delay: $transition-delay;
        +}
        +@mixin transition-duration($transition-duration...) {
        +  -webkit-transition-duration: $transition-duration;
        +          transition-duration: $transition-duration;
        +}
        +@mixin transition-timing-function($timing-function) {
        +  -webkit-transition-timing-function: $timing-function;
        +          transition-timing-function: $timing-function;
        +}
        +@mixin transition-transform($transition...) {
        +  -webkit-transition: -webkit-transform $transition;
        +     -moz-transition: -moz-transform $transition;
        +       -o-transition: -o-transform $transition;
        +          transition: transform $transition;
        +}
        +
        +
        +// User select
        +// For selecting text on the page
        +
        +@mixin user-select($select) {
        +  -webkit-user-select: $select;
        +     -moz-user-select: $select;
        +      -ms-user-select: $select; // IE10+
        +          user-select: $select;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_animated.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_animated.scss
        new file mode 100644
        index 0000000000..8a020dbfff
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_animated.scss
        @@ -0,0 +1,34 @@
        +// Spinning Icons
        +// --------------------------
        +
        +.#{$fa-css-prefix}-spin {
        +  -webkit-animation: fa-spin 2s infinite linear;
        +          animation: fa-spin 2s infinite linear;
        +}
        +
        +.#{$fa-css-prefix}-pulse {
        +  -webkit-animation: fa-spin 1s infinite steps(8);
        +          animation: fa-spin 1s infinite steps(8);
        +}
        +
        +@-webkit-keyframes fa-spin {
        +  0% {
        +    -webkit-transform: rotate(0deg);
        +            transform: rotate(0deg);
        +  }
        +  100% {
        +    -webkit-transform: rotate(359deg);
        +            transform: rotate(359deg);
        +  }
        +}
        +
        +@keyframes fa-spin {
        +  0% {
        +    -webkit-transform: rotate(0deg);
        +            transform: rotate(0deg);
        +  }
        +  100% {
        +    -webkit-transform: rotate(359deg);
        +            transform: rotate(359deg);
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_bordered-pulled.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_bordered-pulled.scss
        new file mode 100644
        index 0000000000..d4b85a02f2
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_bordered-pulled.scss
        @@ -0,0 +1,25 @@
        +// Bordered & Pulled
        +// -------------------------
        +
        +.#{$fa-css-prefix}-border {
        +  padding: .2em .25em .15em;
        +  border: solid .08em $fa-border-color;
        +  border-radius: .1em;
        +}
        +
        +.#{$fa-css-prefix}-pull-left { float: left; }
        +.#{$fa-css-prefix}-pull-right { float: right; }
        +
        +.#{$fa-css-prefix} {
        +  &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
        +  &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
        +}
        +
        +/* Deprecated as of 4.4.0 */
        +.pull-right { float: right; }
        +.pull-left { float: left; }
        +
        +.#{$fa-css-prefix} {
        +  &.pull-left { margin-right: .3em; }
        +  &.pull-right { margin-left: .3em; }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_core.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_core.scss
        new file mode 100644
        index 0000000000..7425ef85fc
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_core.scss
        @@ -0,0 +1,12 @@
        +// Base Class Definition
        +// -------------------------
        +
        +.#{$fa-css-prefix} {
        +  display: inline-block;
        +  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
        +  font-size: inherit; // can't have font-size inherit on line above, so need to override
        +  text-rendering: auto; // optimizelegibility throws things off #1094
        +  -webkit-font-smoothing: antialiased;
        +  -moz-osx-font-smoothing: grayscale;
        +
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_fixed-width.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_fixed-width.scss
        new file mode 100644
        index 0000000000..b221c98133
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_fixed-width.scss
        @@ -0,0 +1,6 @@
        +// Fixed Width Icons
        +// -------------------------
        +.#{$fa-css-prefix}-fw {
        +  width: (18em / 14);
        +  text-align: center;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_icons.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_icons.scss
        new file mode 100644
        index 0000000000..6f9375989a
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_icons.scss
        @@ -0,0 +1,697 @@
        +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
        +   readers do not read off random characters that represent icons */
        +
        +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
        +.#{$fa-css-prefix}-music:before { content: $fa-var-music; }
        +.#{$fa-css-prefix}-search:before { content: $fa-var-search; }
        +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
        +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
        +.#{$fa-css-prefix}-star:before { content: $fa-var-star; }
        +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
        +.#{$fa-css-prefix}-user:before { content: $fa-var-user; }
        +.#{$fa-css-prefix}-film:before { content: $fa-var-film; }
        +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
        +.#{$fa-css-prefix}-th:before { content: $fa-var-th; }
        +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
        +.#{$fa-css-prefix}-check:before { content: $fa-var-check; }
        +.#{$fa-css-prefix}-remove:before,
        +.#{$fa-css-prefix}-close:before,
        +.#{$fa-css-prefix}-times:before { content: $fa-var-times; }
        +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
        +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
        +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
        +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
        +.#{$fa-css-prefix}-gear:before,
        +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
        +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
        +.#{$fa-css-prefix}-home:before { content: $fa-var-home; }
        +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
        +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
        +.#{$fa-css-prefix}-road:before { content: $fa-var-road; }
        +.#{$fa-css-prefix}-download:before { content: $fa-var-download; }
        +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
        +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
        +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
        +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
        +.#{$fa-css-prefix}-rotate-right:before,
        +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
        +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
        +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
        +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
        +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
        +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
        +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
        +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
        +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
        +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
        +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
        +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
        +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
        +.#{$fa-css-prefix}-book:before { content: $fa-var-book; }
        +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
        +.#{$fa-css-prefix}-print:before { content: $fa-var-print; }
        +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
        +.#{$fa-css-prefix}-font:before { content: $fa-var-font; }
        +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
        +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
        +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
        +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
        +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
        +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
        +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
        +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
        +.#{$fa-css-prefix}-list:before { content: $fa-var-list; }
        +.#{$fa-css-prefix}-dedent:before,
        +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
        +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
        +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
        +.#{$fa-css-prefix}-photo:before,
        +.#{$fa-css-prefix}-image:before,
        +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
        +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
        +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
        +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
        +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
        +.#{$fa-css-prefix}-edit:before,
        +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
        +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
        +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
        +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
        +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
        +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
        +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
        +.#{$fa-css-prefix}-play:before { content: $fa-var-play; }
        +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
        +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
        +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
        +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
        +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
        +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
        +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
        +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
        +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
        +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
        +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
        +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
        +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
        +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
        +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
        +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
        +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
        +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
        +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
        +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
        +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
        +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
        +.#{$fa-css-prefix}-mail-forward:before,
        +.#{$fa-css-prefix}-share:before { content: $fa-var-share; }
        +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
        +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
        +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
        +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
        +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
        +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
        +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
        +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
        +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
        +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
        +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
        +.#{$fa-css-prefix}-warning:before,
        +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
        +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
        +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
        +.#{$fa-css-prefix}-random:before { content: $fa-var-random; }
        +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
        +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
        +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
        +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
        +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
        +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
        +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
        +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
        +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
        +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
        +.#{$fa-css-prefix}-bar-chart-o:before,
        +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
        +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
        +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
        +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
        +.#{$fa-css-prefix}-key:before { content: $fa-var-key; }
        +.#{$fa-css-prefix}-gears:before,
        +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
        +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
        +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
        +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
        +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
        +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
        +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
        +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
        +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
        +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
        +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
        +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
        +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
        +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
        +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
        +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
        +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
        +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
        +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
        +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
        +.#{$fa-css-prefix}-facebook-f:before,
        +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
        +.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
        +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
        +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
        +.#{$fa-css-prefix}-feed:before,
        +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
        +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
        +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
        +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
        +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
        +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
        +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
        +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
        +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
        +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
        +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
        +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
        +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
        +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
        +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
        +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
        +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
        +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
        +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
        +.#{$fa-css-prefix}-group:before,
        +.#{$fa-css-prefix}-users:before { content: $fa-var-users; }
        +.#{$fa-css-prefix}-chain:before,
        +.#{$fa-css-prefix}-link:before { content: $fa-var-link; }
        +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
        +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
        +.#{$fa-css-prefix}-cut:before,
        +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
        +.#{$fa-css-prefix}-copy:before,
        +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
        +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
        +.#{$fa-css-prefix}-save:before,
        +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
        +.#{$fa-css-prefix}-square:before { content: $fa-var-square; }
        +.#{$fa-css-prefix}-navicon:before,
        +.#{$fa-css-prefix}-reorder:before,
        +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
        +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
        +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
        +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
        +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
        +.#{$fa-css-prefix}-table:before { content: $fa-var-table; }
        +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
        +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
        +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
        +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
        +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
        +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
        +.#{$fa-css-prefix}-money:before { content: $fa-var-money; }
        +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
        +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
        +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
        +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
        +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
        +.#{$fa-css-prefix}-unsorted:before,
        +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
        +.#{$fa-css-prefix}-sort-down:before,
        +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
        +.#{$fa-css-prefix}-sort-up:before,
        +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
        +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
        +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
        +.#{$fa-css-prefix}-rotate-left:before,
        +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
        +.#{$fa-css-prefix}-legal:before,
        +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
        +.#{$fa-css-prefix}-dashboard:before,
        +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
        +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
        +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
        +.#{$fa-css-prefix}-flash:before,
        +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
        +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
        +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
        +.#{$fa-css-prefix}-paste:before,
        +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
        +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
        +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
        +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
        +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
        +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
        +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
        +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
        +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
        +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
        +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
        +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
        +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
        +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
        +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
        +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
        +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
        +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
        +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
        +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
        +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
        +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
        +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
        +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
        +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
        +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
        +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
        +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
        +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
        +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
        +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
        +.#{$fa-css-prefix}-mobile-phone:before,
        +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
        +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
        +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
        +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
        +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
        +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
        +.#{$fa-css-prefix}-mail-reply:before,
        +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
        +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
        +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
        +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
        +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
        +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
        +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
        +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
        +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
        +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
        +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
        +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
        +.#{$fa-css-prefix}-code:before { content: $fa-var-code; }
        +.#{$fa-css-prefix}-mail-reply-all:before,
        +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
        +.#{$fa-css-prefix}-star-half-empty:before,
        +.#{$fa-css-prefix}-star-half-full:before,
        +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
        +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
        +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
        +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
        +.#{$fa-css-prefix}-unlink:before,
        +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
        +.#{$fa-css-prefix}-question:before { content: $fa-var-question; }
        +.#{$fa-css-prefix}-info:before { content: $fa-var-info; }
        +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
        +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
        +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
        +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
        +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
        +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
        +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
        +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
        +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
        +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
        +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
        +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
        +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
        +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
        +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
        +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
        +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
        +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
        +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
        +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
        +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
        +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
        +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
        +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
        +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
        +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
        +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
        +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
        +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
        +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
        +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
        +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
        +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
        +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
        +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
        +.#{$fa-css-prefix}-toggle-down:before,
        +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
        +.#{$fa-css-prefix}-toggle-up:before,
        +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
        +.#{$fa-css-prefix}-toggle-right:before,
        +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
        +.#{$fa-css-prefix}-euro:before,
        +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
        +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
        +.#{$fa-css-prefix}-dollar:before,
        +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
        +.#{$fa-css-prefix}-rupee:before,
        +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
        +.#{$fa-css-prefix}-cny:before,
        +.#{$fa-css-prefix}-rmb:before,
        +.#{$fa-css-prefix}-yen:before,
        +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
        +.#{$fa-css-prefix}-ruble:before,
        +.#{$fa-css-prefix}-rouble:before,
        +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
        +.#{$fa-css-prefix}-won:before,
        +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
        +.#{$fa-css-prefix}-bitcoin:before,
        +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
        +.#{$fa-css-prefix}-file:before { content: $fa-var-file; }
        +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
        +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
        +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
        +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
        +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
        +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
        +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
        +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
        +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
        +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
        +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
        +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
        +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
        +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
        +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
        +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
        +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
        +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
        +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
        +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
        +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
        +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
        +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
        +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
        +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
        +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
        +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
        +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
        +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
        +.#{$fa-css-prefix}-android:before { content: $fa-var-android; }
        +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
        +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
        +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
        +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
        +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
        +.#{$fa-css-prefix}-female:before { content: $fa-var-female; }
        +.#{$fa-css-prefix}-male:before { content: $fa-var-male; }
        +.#{$fa-css-prefix}-gittip:before,
        +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }
        +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
        +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
        +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
        +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
        +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
        +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
        +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
        +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
        +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
        +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
        +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
        +.#{$fa-css-prefix}-toggle-left:before,
        +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
        +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
        +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
        +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
        +.#{$fa-css-prefix}-turkish-lira:before,
        +.#{$fa-css-prefix}-try:before { content: $fa-var-try; }
        +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
        +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
        +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
        +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
        +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
        +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
        +.#{$fa-css-prefix}-institution:before,
        +.#{$fa-css-prefix}-bank:before,
        +.#{$fa-css-prefix}-university:before { content: $fa-var-university; }
        +.#{$fa-css-prefix}-mortar-board:before,
        +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
        +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
        +.#{$fa-css-prefix}-google:before { content: $fa-var-google; }
        +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
        +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
        +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
        +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
        +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
        +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
        +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
        +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
        +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
        +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
        +.#{$fa-css-prefix}-language:before { content: $fa-var-language; }
        +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
        +.#{$fa-css-prefix}-building:before { content: $fa-var-building; }
        +.#{$fa-css-prefix}-child:before { content: $fa-var-child; }
        +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
        +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
        +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
        +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
        +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
        +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
        +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
        +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
        +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
        +.#{$fa-css-prefix}-automobile:before,
        +.#{$fa-css-prefix}-car:before { content: $fa-var-car; }
        +.#{$fa-css-prefix}-cab:before,
        +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
        +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
        +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
        +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
        +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
        +.#{$fa-css-prefix}-database:before { content: $fa-var-database; }
        +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
        +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
        +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
        +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
        +.#{$fa-css-prefix}-file-photo-o:before,
        +.#{$fa-css-prefix}-file-picture-o:before,
        +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
        +.#{$fa-css-prefix}-file-zip-o:before,
        +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
        +.#{$fa-css-prefix}-file-sound-o:before,
        +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
        +.#{$fa-css-prefix}-file-movie-o:before,
        +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
        +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
        +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
        +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
        +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
        +.#{$fa-css-prefix}-life-bouy:before,
        +.#{$fa-css-prefix}-life-buoy:before,
        +.#{$fa-css-prefix}-life-saver:before,
        +.#{$fa-css-prefix}-support:before,
        +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
        +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
        +.#{$fa-css-prefix}-ra:before,
        +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
        +.#{$fa-css-prefix}-ge:before,
        +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
        +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
        +.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
        +.#{$fa-css-prefix}-y-combinator-square:before,
        +.#{$fa-css-prefix}-yc-square:before,
        +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
        +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
        +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
        +.#{$fa-css-prefix}-wechat:before,
        +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
        +.#{$fa-css-prefix}-send:before,
        +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
        +.#{$fa-css-prefix}-send-o:before,
        +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
        +.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
        +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
        +.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
        +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
        +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
        +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
        +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
        +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
        +.#{$fa-css-prefix}-soccer-ball-o:before,
        +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
        +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
        +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
        +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
        +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
        +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
        +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
        +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
        +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
        +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
        +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
        +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
        +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
        +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
        +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
        +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
        +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
        +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
        +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
        +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
        +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
        +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
        +.#{$fa-css-prefix}-at:before { content: $fa-var-at; }
        +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
        +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
        +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
        +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
        +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
        +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
        +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
        +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
        +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
        +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
        +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
        +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
        +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
        +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
        +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
        +.#{$fa-css-prefix}-shekel:before,
        +.#{$fa-css-prefix}-sheqel:before,
        +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
        +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
        +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }
        +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }
        +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }
        +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }
        +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }
        +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }
        +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }
        +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }
        +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }
        +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }
        +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }
        +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }
        +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }
        +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }
        +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }
        +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }
        +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }
        +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }
        +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }
        +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }
        +.#{$fa-css-prefix}-intersex:before,
        +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }
        +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }
        +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }
        +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }
        +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }
        +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }
        +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }
        +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }
        +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }
        +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }
        +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }
        +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }
        +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }
        +.#{$fa-css-prefix}-server:before { content: $fa-var-server; }
        +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }
        +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }
        +.#{$fa-css-prefix}-hotel:before,
        +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }
        +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }
        +.#{$fa-css-prefix}-train:before { content: $fa-var-train; }
        +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }
        +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }
        +.#{$fa-css-prefix}-yc:before,
        +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }
        +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }
        +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }
        +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }
        +.#{$fa-css-prefix}-battery-4:before,
        +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }
        +.#{$fa-css-prefix}-battery-3:before,
        +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }
        +.#{$fa-css-prefix}-battery-2:before,
        +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }
        +.#{$fa-css-prefix}-battery-1:before,
        +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }
        +.#{$fa-css-prefix}-battery-0:before,
        +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }
        +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }
        +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }
        +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }
        +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }
        +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }
        +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }
        +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }
        +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }
        +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }
        +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }
        +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }
        +.#{$fa-css-prefix}-hourglass-1:before,
        +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }
        +.#{$fa-css-prefix}-hourglass-2:before,
        +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }
        +.#{$fa-css-prefix}-hourglass-3:before,
        +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }
        +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }
        +.#{$fa-css-prefix}-hand-grab-o:before,
        +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }
        +.#{$fa-css-prefix}-hand-stop-o:before,
        +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }
        +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }
        +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }
        +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }
        +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }
        +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }
        +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }
        +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }
        +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }
        +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }
        +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }
        +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }
        +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }
        +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }
        +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }
        +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }
        +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }
        +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }
        +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }
        +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }
        +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }
        +.#{$fa-css-prefix}-tv:before,
        +.#{$fa-css-prefix}-television:before { content: $fa-var-television; }
        +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }
        +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }
        +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }
        +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }
        +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }
        +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }
        +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }
        +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }
        +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }
        +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }
        +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }
        +.#{$fa-css-prefix}-map:before { content: $fa-var-map; }
        +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }
        +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }
        +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }
        +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }
        +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }
        +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }
        +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }
        +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }
        +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }
        +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }
        +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }
        +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }
        +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }
        +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }
        +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }
        +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }
        +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }
        +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }
        +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }
        +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }
        +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }
        +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }
        +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }
        +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }
        +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }
        +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_larger.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_larger.scss
        new file mode 100644
        index 0000000000..41e9a8184a
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_larger.scss
        @@ -0,0 +1,13 @@
        +// Icon Sizes
        +// -------------------------
        +
        +/* makes the font 33% larger relative to the icon container */
        +.#{$fa-css-prefix}-lg {
        +  font-size: (4em / 3);
        +  line-height: (3em / 4);
        +  vertical-align: -15%;
        +}
        +.#{$fa-css-prefix}-2x { font-size: 2em; }
        +.#{$fa-css-prefix}-3x { font-size: 3em; }
        +.#{$fa-css-prefix}-4x { font-size: 4em; }
        +.#{$fa-css-prefix}-5x { font-size: 5em; }
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_list.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_list.scss
        new file mode 100644
        index 0000000000..7d1e4d54d6
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_list.scss
        @@ -0,0 +1,19 @@
        +// List Icons
        +// -------------------------
        +
        +.#{$fa-css-prefix}-ul {
        +  padding-left: 0;
        +  margin-left: $fa-li-width;
        +  list-style-type: none;
        +  > li { position: relative; }
        +}
        +.#{$fa-css-prefix}-li {
        +  position: absolute;
        +  left: -$fa-li-width;
        +  width: $fa-li-width;
        +  top: (2em / 14);
        +  text-align: center;
        +  &.#{$fa-css-prefix}-lg {
        +    left: -$fa-li-width + (4em / 14);
        +  }
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_mixins.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_mixins.scss
        new file mode 100644
        index 0000000000..f96719b6a0
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_mixins.scss
        @@ -0,0 +1,26 @@
        +// Mixins
        +// --------------------------
        +
        +@mixin fa-icon() {
        +  display: inline-block;
        +  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
        +  font-size: inherit; // can't have font-size inherit on line above, so need to override
        +  text-rendering: auto; // optimizelegibility throws things off #1094
        +  -webkit-font-smoothing: antialiased;
        +  -moz-osx-font-smoothing: grayscale;
        +
        +}
        +
        +@mixin fa-icon-rotate($degrees, $rotation) {
        +  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
        +  -webkit-transform: rotate($degrees);
        +      -ms-transform: rotate($degrees);
        +          transform: rotate($degrees);
        +}
        +
        +@mixin fa-icon-flip($horiz, $vert, $rotation) {
        +  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
        +  -webkit-transform: scale($horiz, $vert);
        +      -ms-transform: scale($horiz, $vert);
        +          transform: scale($horiz, $vert);
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_path.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_path.scss
        new file mode 100644
        index 0000000000..bb457c23a8
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_path.scss
        @@ -0,0 +1,15 @@
        +/* FONT PATH
        + * -------------------------- */
        +
        +@font-face {
        +  font-family: 'FontAwesome';
        +  src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
        +  src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
        +    url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
        +    url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
        +    url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
        +    url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
        +//  src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
        +  font-weight: normal;
        +  font-style: normal;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_rotated-flipped.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_rotated-flipped.scss
        new file mode 100644
        index 0000000000..a3558fd09c
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_rotated-flipped.scss
        @@ -0,0 +1,20 @@
        +// Rotated & Flipped Icons
        +// -------------------------
        +
        +.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }
        +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
        +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
        +
        +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
        +.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }
        +
        +// Hook for IE8-9
        +// -------------------------
        +
        +:root .#{$fa-css-prefix}-rotate-90,
        +:root .#{$fa-css-prefix}-rotate-180,
        +:root .#{$fa-css-prefix}-rotate-270,
        +:root .#{$fa-css-prefix}-flip-horizontal,
        +:root .#{$fa-css-prefix}-flip-vertical {
        +  filter: none;
        +}
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_stacked.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_stacked.scss
        new file mode 100644
        index 0000000000..aef7403660
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_stacked.scss
        @@ -0,0 +1,20 @@
        +// Stacked Icons
        +// -------------------------
        +
        +.#{$fa-css-prefix}-stack {
        +  position: relative;
        +  display: inline-block;
        +  width: 2em;
        +  height: 2em;
        +  line-height: 2em;
        +  vertical-align: middle;
        +}
        +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
        +  position: absolute;
        +  left: 0;
        +  width: 100%;
        +  text-align: center;
        +}
        +.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
        +.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
        +.#{$fa-css-prefix}-inverse { color: $fa-inverse; }
        diff --git a/bower_components/select2/docs/_sass/vendor/font-awesome/_variables.scss b/bower_components/select2/docs/_sass/vendor/font-awesome/_variables.scss
        new file mode 100644
        index 0000000000..0a471102c4
        --- /dev/null
        +++ b/bower_components/select2/docs/_sass/vendor/font-awesome/_variables.scss
        @@ -0,0 +1,708 @@
        +// Variables
        +// --------------------------
        +
        +$fa-font-path:        "../fonts" !default;
        +$fa-font-size-base:   14px !default;
        +$fa-line-height-base: 1 !default;
        +//$fa-font-path:        "//netdna.bootstrapcdn.com/font-awesome/4.5.0/fonts" !default; // for referencing Bootstrap CDN font files directly
        +$fa-css-prefix:       fa !default;
        +$fa-version:          "4.5.0" !default;
        +$fa-border-color:     #eee !default;
        +$fa-inverse:          #fff !default;
        +$fa-li-width:         (30em / 14) !default;
        +
        +$fa-var-500px: "\f26e";
        +$fa-var-adjust: "\f042";
        +$fa-var-adn: "\f170";
        +$fa-var-align-center: "\f037";
        +$fa-var-align-justify: "\f039";
        +$fa-var-align-left: "\f036";
        +$fa-var-align-right: "\f038";
        +$fa-var-amazon: "\f270";
        +$fa-var-ambulance: "\f0f9";
        +$fa-var-anchor: "\f13d";
        +$fa-var-android: "\f17b";
        +$fa-var-angellist: "\f209";
        +$fa-var-angle-double-down: "\f103";
        +$fa-var-angle-double-left: "\f100";
        +$fa-var-angle-double-right: "\f101";
        +$fa-var-angle-double-up: "\f102";
        +$fa-var-angle-down: "\f107";
        +$fa-var-angle-left: "\f104";
        +$fa-var-angle-right: "\f105";
        +$fa-var-angle-up: "\f106";
        +$fa-var-apple: "\f179";
        +$fa-var-archive: "\f187";
        +$fa-var-area-chart: "\f1fe";
        +$fa-var-arrow-circle-down: "\f0ab";
        +$fa-var-arrow-circle-left: "\f0a8";
        +$fa-var-arrow-circle-o-down: "\f01a";
        +$fa-var-arrow-circle-o-left: "\f190";
        +$fa-var-arrow-circle-o-right: "\f18e";
        +$fa-var-arrow-circle-o-up: "\f01b";
        +$fa-var-arrow-circle-right: "\f0a9";
        +$fa-var-arrow-circle-up: "\f0aa";
        +$fa-var-arrow-down: "\f063";
        +$fa-var-arrow-left: "\f060";
        +$fa-var-arrow-right: "\f061";
        +$fa-var-arrow-up: "\f062";
        +$fa-var-arrows: "\f047";
        +$fa-var-arrows-alt: "\f0b2";
        +$fa-var-arrows-h: "\f07e";
        +$fa-var-arrows-v: "\f07d";
        +$fa-var-asterisk: "\f069";
        +$fa-var-at: "\f1fa";
        +$fa-var-automobile: "\f1b9";
        +$fa-var-backward: "\f04a";
        +$fa-var-balance-scale: "\f24e";
        +$fa-var-ban: "\f05e";
        +$fa-var-bank: "\f19c";
        +$fa-var-bar-chart: "\f080";
        +$fa-var-bar-chart-o: "\f080";
        +$fa-var-barcode: "\f02a";
        +$fa-var-bars: "\f0c9";
        +$fa-var-battery-0: "\f244";
        +$fa-var-battery-1: "\f243";
        +$fa-var-battery-2: "\f242";
        +$fa-var-battery-3: "\f241";
        +$fa-var-battery-4: "\f240";
        +$fa-var-battery-empty: "\f244";
        +$fa-var-battery-full: "\f240";
        +$fa-var-battery-half: "\f242";
        +$fa-var-battery-quarter: "\f243";
        +$fa-var-battery-three-quarters: "\f241";
        +$fa-var-bed: "\f236";
        +$fa-var-beer: "\f0fc";
        +$fa-var-behance: "\f1b4";
        +$fa-var-behance-square: "\f1b5";
        +$fa-var-bell: "\f0f3";
        +$fa-var-bell-o: "\f0a2";
        +$fa-var-bell-slash: "\f1f6";
        +$fa-var-bell-slash-o: "\f1f7";
        +$fa-var-bicycle: "\f206";
        +$fa-var-binoculars: "\f1e5";
        +$fa-var-birthday-cake: "\f1fd";
        +$fa-var-bitbucket: "\f171";
        +$fa-var-bitbucket-square: "\f172";
        +$fa-var-bitcoin: "\f15a";
        +$fa-var-black-tie: "\f27e";
        +$fa-var-bluetooth: "\f293";
        +$fa-var-bluetooth-b: "\f294";
        +$fa-var-bold: "\f032";
        +$fa-var-bolt: "\f0e7";
        +$fa-var-bomb: "\f1e2";
        +$fa-var-book: "\f02d";
        +$fa-var-bookmark: "\f02e";
        +$fa-var-bookmark-o: "\f097";
        +$fa-var-briefcase: "\f0b1";
        +$fa-var-btc: "\f15a";
        +$fa-var-bug: "\f188";
        +$fa-var-building: "\f1ad";
        +$fa-var-building-o: "\f0f7";
        +$fa-var-bullhorn: "\f0a1";
        +$fa-var-bullseye: "\f140";
        +$fa-var-bus: "\f207";
        +$fa-var-buysellads: "\f20d";
        +$fa-var-cab: "\f1ba";
        +$fa-var-calculator: "\f1ec";
        +$fa-var-calendar: "\f073";
        +$fa-var-calendar-check-o: "\f274";
        +$fa-var-calendar-minus-o: "\f272";
        +$fa-var-calendar-o: "\f133";
        +$fa-var-calendar-plus-o: "\f271";
        +$fa-var-calendar-times-o: "\f273";
        +$fa-var-camera: "\f030";
        +$fa-var-camera-retro: "\f083";
        +$fa-var-car: "\f1b9";
        +$fa-var-caret-down: "\f0d7";
        +$fa-var-caret-left: "\f0d9";
        +$fa-var-caret-right: "\f0da";
        +$fa-var-caret-square-o-down: "\f150";
        +$fa-var-caret-square-o-left: "\f191";
        +$fa-var-caret-square-o-right: "\f152";
        +$fa-var-caret-square-o-up: "\f151";
        +$fa-var-caret-up: "\f0d8";
        +$fa-var-cart-arrow-down: "\f218";
        +$fa-var-cart-plus: "\f217";
        +$fa-var-cc: "\f20a";
        +$fa-var-cc-amex: "\f1f3";
        +$fa-var-cc-diners-club: "\f24c";
        +$fa-var-cc-discover: "\f1f2";
        +$fa-var-cc-jcb: "\f24b";
        +$fa-var-cc-mastercard: "\f1f1";
        +$fa-var-cc-paypal: "\f1f4";
        +$fa-var-cc-stripe: "\f1f5";
        +$fa-var-cc-visa: "\f1f0";
        +$fa-var-certificate: "\f0a3";
        +$fa-var-chain: "\f0c1";
        +$fa-var-chain-broken: "\f127";
        +$fa-var-check: "\f00c";
        +$fa-var-check-circle: "\f058";
        +$fa-var-check-circle-o: "\f05d";
        +$fa-var-check-square: "\f14a";
        +$fa-var-check-square-o: "\f046";
        +$fa-var-chevron-circle-down: "\f13a";
        +$fa-var-chevron-circle-left: "\f137";
        +$fa-var-chevron-circle-right: "\f138";
        +$fa-var-chevron-circle-up: "\f139";
        +$fa-var-chevron-down: "\f078";
        +$fa-var-chevron-left: "\f053";
        +$fa-var-chevron-right: "\f054";
        +$fa-var-chevron-up: "\f077";
        +$fa-var-child: "\f1ae";
        +$fa-var-chrome: "\f268";
        +$fa-var-circle: "\f111";
        +$fa-var-circle-o: "\f10c";
        +$fa-var-circle-o-notch: "\f1ce";
        +$fa-var-circle-thin: "\f1db";
        +$fa-var-clipboard: "\f0ea";
        +$fa-var-clock-o: "\f017";
        +$fa-var-clone: "\f24d";
        +$fa-var-close: "\f00d";
        +$fa-var-cloud: "\f0c2";
        +$fa-var-cloud-download: "\f0ed";
        +$fa-var-cloud-upload: "\f0ee";
        +$fa-var-cny: "\f157";
        +$fa-var-code: "\f121";
        +$fa-var-code-fork: "\f126";
        +$fa-var-codepen: "\f1cb";
        +$fa-var-codiepie: "\f284";
        +$fa-var-coffee: "\f0f4";
        +$fa-var-cog: "\f013";
        +$fa-var-cogs: "\f085";
        +$fa-var-columns: "\f0db";
        +$fa-var-comment: "\f075";
        +$fa-var-comment-o: "\f0e5";
        +$fa-var-commenting: "\f27a";
        +$fa-var-commenting-o: "\f27b";
        +$fa-var-comments: "\f086";
        +$fa-var-comments-o: "\f0e6";
        +$fa-var-compass: "\f14e";
        +$fa-var-compress: "\f066";
        +$fa-var-connectdevelop: "\f20e";
        +$fa-var-contao: "\f26d";
        +$fa-var-copy: "\f0c5";
        +$fa-var-copyright: "\f1f9";
        +$fa-var-creative-commons: "\f25e";
        +$fa-var-credit-card: "\f09d";
        +$fa-var-credit-card-alt: "\f283";
        +$fa-var-crop: "\f125";
        +$fa-var-crosshairs: "\f05b";
        +$fa-var-css3: "\f13c";
        +$fa-var-cube: "\f1b2";
        +$fa-var-cubes: "\f1b3";
        +$fa-var-cut: "\f0c4";
        +$fa-var-cutlery: "\f0f5";
        +$fa-var-dashboard: "\f0e4";
        +$fa-var-dashcube: "\f210";
        +$fa-var-database: "\f1c0";
        +$fa-var-dedent: "\f03b";
        +$fa-var-delicious: "\f1a5";
        +$fa-var-desktop: "\f108";
        +$fa-var-deviantart: "\f1bd";
        +$fa-var-diamond: "\f219";
        +$fa-var-digg: "\f1a6";
        +$fa-var-dollar: "\f155";
        +$fa-var-dot-circle-o: "\f192";
        +$fa-var-download: "\f019";
        +$fa-var-dribbble: "\f17d";
        +$fa-var-dropbox: "\f16b";
        +$fa-var-drupal: "\f1a9";
        +$fa-var-edge: "\f282";
        +$fa-var-edit: "\f044";
        +$fa-var-eject: "\f052";
        +$fa-var-ellipsis-h: "\f141";
        +$fa-var-ellipsis-v: "\f142";
        +$fa-var-empire: "\f1d1";
        +$fa-var-envelope: "\f0e0";
        +$fa-var-envelope-o: "\f003";
        +$fa-var-envelope-square: "\f199";
        +$fa-var-eraser: "\f12d";
        +$fa-var-eur: "\f153";
        +$fa-var-euro: "\f153";
        +$fa-var-exchange: "\f0ec";
        +$fa-var-exclamation: "\f12a";
        +$fa-var-exclamation-circle: "\f06a";
        +$fa-var-exclamation-triangle: "\f071";
        +$fa-var-expand: "\f065";
        +$fa-var-expeditedssl: "\f23e";
        +$fa-var-external-link: "\f08e";
        +$fa-var-external-link-square: "\f14c";
        +$fa-var-eye: "\f06e";
        +$fa-var-eye-slash: "\f070";
        +$fa-var-eyedropper: "\f1fb";
        +$fa-var-facebook: "\f09a";
        +$fa-var-facebook-f: "\f09a";
        +$fa-var-facebook-official: "\f230";
        +$fa-var-facebook-square: "\f082";
        +$fa-var-fast-backward: "\f049";
        +$fa-var-fast-forward: "\f050";
        +$fa-var-fax: "\f1ac";
        +$fa-var-feed: "\f09e";
        +$fa-var-female: "\f182";
        +$fa-var-fighter-jet: "\f0fb";
        +$fa-var-file: "\f15b";
        +$fa-var-file-archive-o: "\f1c6";
        +$fa-var-file-audio-o: "\f1c7";
        +$fa-var-file-code-o: "\f1c9";
        +$fa-var-file-excel-o: "\f1c3";
        +$fa-var-file-image-o: "\f1c5";
        +$fa-var-file-movie-o: "\f1c8";
        +$fa-var-file-o: "\f016";
        +$fa-var-file-pdf-o: "\f1c1";
        +$fa-var-file-photo-o: "\f1c5";
        +$fa-var-file-picture-o: "\f1c5";
        +$fa-var-file-powerpoint-o: "\f1c4";
        +$fa-var-file-sound-o: "\f1c7";
        +$fa-var-file-text: "\f15c";
        +$fa-var-file-text-o: "\f0f6";
        +$fa-var-file-video-o: "\f1c8";
        +$fa-var-file-word-o: "\f1c2";
        +$fa-var-file-zip-o: "\f1c6";
        +$fa-var-files-o: "\f0c5";
        +$fa-var-film: "\f008";
        +$fa-var-filter: "\f0b0";
        +$fa-var-fire: "\f06d";
        +$fa-var-fire-extinguisher: "\f134";
        +$fa-var-firefox: "\f269";
        +$fa-var-flag: "\f024";
        +$fa-var-flag-checkered: "\f11e";
        +$fa-var-flag-o: "\f11d";
        +$fa-var-flash: "\f0e7";
        +$fa-var-flask: "\f0c3";
        +$fa-var-flickr: "\f16e";
        +$fa-var-floppy-o: "\f0c7";
        +$fa-var-folder: "\f07b";
        +$fa-var-folder-o: "\f114";
        +$fa-var-folder-open: "\f07c";
        +$fa-var-folder-open-o: "\f115";
        +$fa-var-font: "\f031";
        +$fa-var-fonticons: "\f280";
        +$fa-var-fort-awesome: "\f286";
        +$fa-var-forumbee: "\f211";
        +$fa-var-forward: "\f04e";
        +$fa-var-foursquare: "\f180";
        +$fa-var-frown-o: "\f119";
        +$fa-var-futbol-o: "\f1e3";
        +$fa-var-gamepad: "\f11b";
        +$fa-var-gavel: "\f0e3";
        +$fa-var-gbp: "\f154";
        +$fa-var-ge: "\f1d1";
        +$fa-var-gear: "\f013";
        +$fa-var-gears: "\f085";
        +$fa-var-genderless: "\f22d";
        +$fa-var-get-pocket: "\f265";
        +$fa-var-gg: "\f260";
        +$fa-var-gg-circle: "\f261";
        +$fa-var-gift: "\f06b";
        +$fa-var-git: "\f1d3";
        +$fa-var-git-square: "\f1d2";
        +$fa-var-github: "\f09b";
        +$fa-var-github-alt: "\f113";
        +$fa-var-github-square: "\f092";
        +$fa-var-gittip: "\f184";
        +$fa-var-glass: "\f000";
        +$fa-var-globe: "\f0ac";
        +$fa-var-google: "\f1a0";
        +$fa-var-google-plus: "\f0d5";
        +$fa-var-google-plus-square: "\f0d4";
        +$fa-var-google-wallet: "\f1ee";
        +$fa-var-graduation-cap: "\f19d";
        +$fa-var-gratipay: "\f184";
        +$fa-var-group: "\f0c0";
        +$fa-var-h-square: "\f0fd";
        +$fa-var-hacker-news: "\f1d4";
        +$fa-var-hand-grab-o: "\f255";
        +$fa-var-hand-lizard-o: "\f258";
        +$fa-var-hand-o-down: "\f0a7";
        +$fa-var-hand-o-left: "\f0a5";
        +$fa-var-hand-o-right: "\f0a4";
        +$fa-var-hand-o-up: "\f0a6";
        +$fa-var-hand-paper-o: "\f256";
        +$fa-var-hand-peace-o: "\f25b";
        +$fa-var-hand-pointer-o: "\f25a";
        +$fa-var-hand-rock-o: "\f255";
        +$fa-var-hand-scissors-o: "\f257";
        +$fa-var-hand-spock-o: "\f259";
        +$fa-var-hand-stop-o: "\f256";
        +$fa-var-hashtag: "\f292";
        +$fa-var-hdd-o: "\f0a0";
        +$fa-var-header: "\f1dc";
        +$fa-var-headphones: "\f025";
        +$fa-var-heart: "\f004";
        +$fa-var-heart-o: "\f08a";
        +$fa-var-heartbeat: "\f21e";
        +$fa-var-history: "\f1da";
        +$fa-var-home: "\f015";
        +$fa-var-hospital-o: "\f0f8";
        +$fa-var-hotel: "\f236";
        +$fa-var-hourglass: "\f254";
        +$fa-var-hourglass-1: "\f251";
        +$fa-var-hourglass-2: "\f252";
        +$fa-var-hourglass-3: "\f253";
        +$fa-var-hourglass-end: "\f253";
        +$fa-var-hourglass-half: "\f252";
        +$fa-var-hourglass-o: "\f250";
        +$fa-var-hourglass-start: "\f251";
        +$fa-var-houzz: "\f27c";
        +$fa-var-html5: "\f13b";
        +$fa-var-i-cursor: "\f246";
        +$fa-var-ils: "\f20b";
        +$fa-var-image: "\f03e";
        +$fa-var-inbox: "\f01c";
        +$fa-var-indent: "\f03c";
        +$fa-var-industry: "\f275";
        +$fa-var-info: "\f129";
        +$fa-var-info-circle: "\f05a";
        +$fa-var-inr: "\f156";
        +$fa-var-instagram: "\f16d";
        +$fa-var-institution: "\f19c";
        +$fa-var-internet-explorer: "\f26b";
        +$fa-var-intersex: "\f224";
        +$fa-var-ioxhost: "\f208";
        +$fa-var-italic: "\f033";
        +$fa-var-joomla: "\f1aa";
        +$fa-var-jpy: "\f157";
        +$fa-var-jsfiddle: "\f1cc";
        +$fa-var-key: "\f084";
        +$fa-var-keyboard-o: "\f11c";
        +$fa-var-krw: "\f159";
        +$fa-var-language: "\f1ab";
        +$fa-var-laptop: "\f109";
        +$fa-var-lastfm: "\f202";
        +$fa-var-lastfm-square: "\f203";
        +$fa-var-leaf: "\f06c";
        +$fa-var-leanpub: "\f212";
        +$fa-var-legal: "\f0e3";
        +$fa-var-lemon-o: "\f094";
        +$fa-var-level-down: "\f149";
        +$fa-var-level-up: "\f148";
        +$fa-var-life-bouy: "\f1cd";
        +$fa-var-life-buoy: "\f1cd";
        +$fa-var-life-ring: "\f1cd";
        +$fa-var-life-saver: "\f1cd";
        +$fa-var-lightbulb-o: "\f0eb";
        +$fa-var-line-chart: "\f201";
        +$fa-var-link: "\f0c1";
        +$fa-var-linkedin: "\f0e1";
        +$fa-var-linkedin-square: "\f08c";
        +$fa-var-linux: "\f17c";
        +$fa-var-list: "\f03a";
        +$fa-var-list-alt: "\f022";
        +$fa-var-list-ol: "\f0cb";
        +$fa-var-list-ul: "\f0ca";
        +$fa-var-location-arrow: "\f124";
        +$fa-var-lock: "\f023";
        +$fa-var-long-arrow-down: "\f175";
        +$fa-var-long-arrow-left: "\f177";
        +$fa-var-long-arrow-right: "\f178";
        +$fa-var-long-arrow-up: "\f176";
        +$fa-var-magic: "\f0d0";
        +$fa-var-magnet: "\f076";
        +$fa-var-mail-forward: "\f064";
        +$fa-var-mail-reply: "\f112";
        +$fa-var-mail-reply-all: "\f122";
        +$fa-var-male: "\f183";
        +$fa-var-map: "\f279";
        +$fa-var-map-marker: "\f041";
        +$fa-var-map-o: "\f278";
        +$fa-var-map-pin: "\f276";
        +$fa-var-map-signs: "\f277";
        +$fa-var-mars: "\f222";
        +$fa-var-mars-double: "\f227";
        +$fa-var-mars-stroke: "\f229";
        +$fa-var-mars-stroke-h: "\f22b";
        +$fa-var-mars-stroke-v: "\f22a";
        +$fa-var-maxcdn: "\f136";
        +$fa-var-meanpath: "\f20c";
        +$fa-var-medium: "\f23a";
        +$fa-var-medkit: "\f0fa";
        +$fa-var-meh-o: "\f11a";
        +$fa-var-mercury: "\f223";
        +$fa-var-microphone: "\f130";
        +$fa-var-microphone-slash: "\f131";
        +$fa-var-minus: "\f068";
        +$fa-var-minus-circle: "\f056";
        +$fa-var-minus-square: "\f146";
        +$fa-var-minus-square-o: "\f147";
        +$fa-var-mixcloud: "\f289";
        +$fa-var-mobile: "\f10b";
        +$fa-var-mobile-phone: "\f10b";
        +$fa-var-modx: "\f285";
        +$fa-var-money: "\f0d6";
        +$fa-var-moon-o: "\f186";
        +$fa-var-mortar-board: "\f19d";
        +$fa-var-motorcycle: "\f21c";
        +$fa-var-mouse-pointer: "\f245";
        +$fa-var-music: "\f001";
        +$fa-var-navicon: "\f0c9";
        +$fa-var-neuter: "\f22c";
        +$fa-var-newspaper-o: "\f1ea";
        +$fa-var-object-group: "\f247";
        +$fa-var-object-ungroup: "\f248";
        +$fa-var-odnoklassniki: "\f263";
        +$fa-var-odnoklassniki-square: "\f264";
        +$fa-var-opencart: "\f23d";
        +$fa-var-openid: "\f19b";
        +$fa-var-opera: "\f26a";
        +$fa-var-optin-monster: "\f23c";
        +$fa-var-outdent: "\f03b";
        +$fa-var-pagelines: "\f18c";
        +$fa-var-paint-brush: "\f1fc";
        +$fa-var-paper-plane: "\f1d8";
        +$fa-var-paper-plane-o: "\f1d9";
        +$fa-var-paperclip: "\f0c6";
        +$fa-var-paragraph: "\f1dd";
        +$fa-var-paste: "\f0ea";
        +$fa-var-pause: "\f04c";
        +$fa-var-pause-circle: "\f28b";
        +$fa-var-pause-circle-o: "\f28c";
        +$fa-var-paw: "\f1b0";
        +$fa-var-paypal: "\f1ed";
        +$fa-var-pencil: "\f040";
        +$fa-var-pencil-square: "\f14b";
        +$fa-var-pencil-square-o: "\f044";
        +$fa-var-percent: "\f295";
        +$fa-var-phone: "\f095";
        +$fa-var-phone-square: "\f098";
        +$fa-var-photo: "\f03e";
        +$fa-var-picture-o: "\f03e";
        +$fa-var-pie-chart: "\f200";
        +$fa-var-pied-piper: "\f1a7";
        +$fa-var-pied-piper-alt: "\f1a8";
        +$fa-var-pinterest: "\f0d2";
        +$fa-var-pinterest-p: "\f231";
        +$fa-var-pinterest-square: "\f0d3";
        +$fa-var-plane: "\f072";
        +$fa-var-play: "\f04b";
        +$fa-var-play-circle: "\f144";
        +$fa-var-play-circle-o: "\f01d";
        +$fa-var-plug: "\f1e6";
        +$fa-var-plus: "\f067";
        +$fa-var-plus-circle: "\f055";
        +$fa-var-plus-square: "\f0fe";
        +$fa-var-plus-square-o: "\f196";
        +$fa-var-power-off: "\f011";
        +$fa-var-print: "\f02f";
        +$fa-var-product-hunt: "\f288";
        +$fa-var-puzzle-piece: "\f12e";
        +$fa-var-qq: "\f1d6";
        +$fa-var-qrcode: "\f029";
        +$fa-var-question: "\f128";
        +$fa-var-question-circle: "\f059";
        +$fa-var-quote-left: "\f10d";
        +$fa-var-quote-right: "\f10e";
        +$fa-var-ra: "\f1d0";
        +$fa-var-random: "\f074";
        +$fa-var-rebel: "\f1d0";
        +$fa-var-recycle: "\f1b8";
        +$fa-var-reddit: "\f1a1";
        +$fa-var-reddit-alien: "\f281";
        +$fa-var-reddit-square: "\f1a2";
        +$fa-var-refresh: "\f021";
        +$fa-var-registered: "\f25d";
        +$fa-var-remove: "\f00d";
        +$fa-var-renren: "\f18b";
        +$fa-var-reorder: "\f0c9";
        +$fa-var-repeat: "\f01e";
        +$fa-var-reply: "\f112";
        +$fa-var-reply-all: "\f122";
        +$fa-var-retweet: "\f079";
        +$fa-var-rmb: "\f157";
        +$fa-var-road: "\f018";
        +$fa-var-rocket: "\f135";
        +$fa-var-rotate-left: "\f0e2";
        +$fa-var-rotate-right: "\f01e";
        +$fa-var-rouble: "\f158";
        +$fa-var-rss: "\f09e";
        +$fa-var-rss-square: "\f143";
        +$fa-var-rub: "\f158";
        +$fa-var-ruble: "\f158";
        +$fa-var-rupee: "\f156";
        +$fa-var-safari: "\f267";
        +$fa-var-save: "\f0c7";
        +$fa-var-scissors: "\f0c4";
        +$fa-var-scribd: "\f28a";
        +$fa-var-search: "\f002";
        +$fa-var-search-minus: "\f010";
        +$fa-var-search-plus: "\f00e";
        +$fa-var-sellsy: "\f213";
        +$fa-var-send: "\f1d8";
        +$fa-var-send-o: "\f1d9";
        +$fa-var-server: "\f233";
        +$fa-var-share: "\f064";
        +$fa-var-share-alt: "\f1e0";
        +$fa-var-share-alt-square: "\f1e1";
        +$fa-var-share-square: "\f14d";
        +$fa-var-share-square-o: "\f045";
        +$fa-var-shekel: "\f20b";
        +$fa-var-sheqel: "\f20b";
        +$fa-var-shield: "\f132";
        +$fa-var-ship: "\f21a";
        +$fa-var-shirtsinbulk: "\f214";
        +$fa-var-shopping-bag: "\f290";
        +$fa-var-shopping-basket: "\f291";
        +$fa-var-shopping-cart: "\f07a";
        +$fa-var-sign-in: "\f090";
        +$fa-var-sign-out: "\f08b";
        +$fa-var-signal: "\f012";
        +$fa-var-simplybuilt: "\f215";
        +$fa-var-sitemap: "\f0e8";
        +$fa-var-skyatlas: "\f216";
        +$fa-var-skype: "\f17e";
        +$fa-var-slack: "\f198";
        +$fa-var-sliders: "\f1de";
        +$fa-var-slideshare: "\f1e7";
        +$fa-var-smile-o: "\f118";
        +$fa-var-soccer-ball-o: "\f1e3";
        +$fa-var-sort: "\f0dc";
        +$fa-var-sort-alpha-asc: "\f15d";
        +$fa-var-sort-alpha-desc: "\f15e";
        +$fa-var-sort-amount-asc: "\f160";
        +$fa-var-sort-amount-desc: "\f161";
        +$fa-var-sort-asc: "\f0de";
        +$fa-var-sort-desc: "\f0dd";
        +$fa-var-sort-down: "\f0dd";
        +$fa-var-sort-numeric-asc: "\f162";
        +$fa-var-sort-numeric-desc: "\f163";
        +$fa-var-sort-up: "\f0de";
        +$fa-var-soundcloud: "\f1be";
        +$fa-var-space-shuttle: "\f197";
        +$fa-var-spinner: "\f110";
        +$fa-var-spoon: "\f1b1";
        +$fa-var-spotify: "\f1bc";
        +$fa-var-square: "\f0c8";
        +$fa-var-square-o: "\f096";
        +$fa-var-stack-exchange: "\f18d";
        +$fa-var-stack-overflow: "\f16c";
        +$fa-var-star: "\f005";
        +$fa-var-star-half: "\f089";
        +$fa-var-star-half-empty: "\f123";
        +$fa-var-star-half-full: "\f123";
        +$fa-var-star-half-o: "\f123";
        +$fa-var-star-o: "\f006";
        +$fa-var-steam: "\f1b6";
        +$fa-var-steam-square: "\f1b7";
        +$fa-var-step-backward: "\f048";
        +$fa-var-step-forward: "\f051";
        +$fa-var-stethoscope: "\f0f1";
        +$fa-var-sticky-note: "\f249";
        +$fa-var-sticky-note-o: "\f24a";
        +$fa-var-stop: "\f04d";
        +$fa-var-stop-circle: "\f28d";
        +$fa-var-stop-circle-o: "\f28e";
        +$fa-var-street-view: "\f21d";
        +$fa-var-strikethrough: "\f0cc";
        +$fa-var-stumbleupon: "\f1a4";
        +$fa-var-stumbleupon-circle: "\f1a3";
        +$fa-var-subscript: "\f12c";
        +$fa-var-subway: "\f239";
        +$fa-var-suitcase: "\f0f2";
        +$fa-var-sun-o: "\f185";
        +$fa-var-superscript: "\f12b";
        +$fa-var-support: "\f1cd";
        +$fa-var-table: "\f0ce";
        +$fa-var-tablet: "\f10a";
        +$fa-var-tachometer: "\f0e4";
        +$fa-var-tag: "\f02b";
        +$fa-var-tags: "\f02c";
        +$fa-var-tasks: "\f0ae";
        +$fa-var-taxi: "\f1ba";
        +$fa-var-television: "\f26c";
        +$fa-var-tencent-weibo: "\f1d5";
        +$fa-var-terminal: "\f120";
        +$fa-var-text-height: "\f034";
        +$fa-var-text-width: "\f035";
        +$fa-var-th: "\f00a";
        +$fa-var-th-large: "\f009";
        +$fa-var-th-list: "\f00b";
        +$fa-var-thumb-tack: "\f08d";
        +$fa-var-thumbs-down: "\f165";
        +$fa-var-thumbs-o-down: "\f088";
        +$fa-var-thumbs-o-up: "\f087";
        +$fa-var-thumbs-up: "\f164";
        +$fa-var-ticket: "\f145";
        +$fa-var-times: "\f00d";
        +$fa-var-times-circle: "\f057";
        +$fa-var-times-circle-o: "\f05c";
        +$fa-var-tint: "\f043";
        +$fa-var-toggle-down: "\f150";
        +$fa-var-toggle-left: "\f191";
        +$fa-var-toggle-off: "\f204";
        +$fa-var-toggle-on: "\f205";
        +$fa-var-toggle-right: "\f152";
        +$fa-var-toggle-up: "\f151";
        +$fa-var-trademark: "\f25c";
        +$fa-var-train: "\f238";
        +$fa-var-transgender: "\f224";
        +$fa-var-transgender-alt: "\f225";
        +$fa-var-trash: "\f1f8";
        +$fa-var-trash-o: "\f014";
        +$fa-var-tree: "\f1bb";
        +$fa-var-trello: "\f181";
        +$fa-var-tripadvisor: "\f262";
        +$fa-var-trophy: "\f091";
        +$fa-var-truck: "\f0d1";
        +$fa-var-try: "\f195";
        +$fa-var-tty: "\f1e4";
        +$fa-var-tumblr: "\f173";
        +$fa-var-tumblr-square: "\f174";
        +$fa-var-turkish-lira: "\f195";
        +$fa-var-tv: "\f26c";
        +$fa-var-twitch: "\f1e8";
        +$fa-var-twitter: "\f099";
        +$fa-var-twitter-square: "\f081";
        +$fa-var-umbrella: "\f0e9";
        +$fa-var-underline: "\f0cd";
        +$fa-var-undo: "\f0e2";
        +$fa-var-university: "\f19c";
        +$fa-var-unlink: "\f127";
        +$fa-var-unlock: "\f09c";
        +$fa-var-unlock-alt: "\f13e";
        +$fa-var-unsorted: "\f0dc";
        +$fa-var-upload: "\f093";
        +$fa-var-usb: "\f287";
        +$fa-var-usd: "\f155";
        +$fa-var-user: "\f007";
        +$fa-var-user-md: "\f0f0";
        +$fa-var-user-plus: "\f234";
        +$fa-var-user-secret: "\f21b";
        +$fa-var-user-times: "\f235";
        +$fa-var-users: "\f0c0";
        +$fa-var-venus: "\f221";
        +$fa-var-venus-double: "\f226";
        +$fa-var-venus-mars: "\f228";
        +$fa-var-viacoin: "\f237";
        +$fa-var-video-camera: "\f03d";
        +$fa-var-vimeo: "\f27d";
        +$fa-var-vimeo-square: "\f194";
        +$fa-var-vine: "\f1ca";
        +$fa-var-vk: "\f189";
        +$fa-var-volume-down: "\f027";
        +$fa-var-volume-off: "\f026";
        +$fa-var-volume-up: "\f028";
        +$fa-var-warning: "\f071";
        +$fa-var-wechat: "\f1d7";
        +$fa-var-weibo: "\f18a";
        +$fa-var-weixin: "\f1d7";
        +$fa-var-whatsapp: "\f232";
        +$fa-var-wheelchair: "\f193";
        +$fa-var-wifi: "\f1eb";
        +$fa-var-wikipedia-w: "\f266";
        +$fa-var-windows: "\f17a";
        +$fa-var-won: "\f159";
        +$fa-var-wordpress: "\f19a";
        +$fa-var-wrench: "\f0ad";
        +$fa-var-xing: "\f168";
        +$fa-var-xing-square: "\f169";
        +$fa-var-y-combinator: "\f23b";
        +$fa-var-y-combinator-square: "\f1d4";
        +$fa-var-yahoo: "\f19e";
        +$fa-var-yc: "\f23b";
        +$fa-var-yc-square: "\f1d4";
        +$fa-var-yelp: "\f1e9";
        +$fa-var-yen: "\f157";
        +$fa-var-youtube: "\f167";
        +$fa-var-youtube-play: "\f16a";
        +$fa-var-youtube-square: "\f166";
        +
        diff --git a/bower_components/select2/docs/announcements-4.0.html b/bower_components/select2/docs/announcements-4.0.html
        new file mode 100644
        index 0000000000..165af9ee85
        --- /dev/null
        +++ b/bower_components/select2/docs/announcements-4.0.html
        @@ -0,0 +1,752 @@
        +---
        +layout: default
        +title: Select2 4.0.0 Released
        +slug: announcements-4.0
        +---
        +<section id="pre-release" class="jumbotron">
        +  <div class="container">
        +    <h1>Announcing Select2 4.0.0</h1>
        +  </div>
        +</section>
        +
        +<div class="container s2-docs-container">
        +  <div class="row">
        +    <div class="col-md-9" role="main">
        +
        +      <section id="release">
        +        <h1 class="page-header">Select2 4.0.0</h1>
        +
        +        <p class="lead">
        +          The 4.0 release of Select2 is the result of three years of working on the
        +          code base and watching where it needs to go. At the core, it is a full
        +          rewrite that addresses many of the extensibility and usability problems
        +          that could not be addressed in previous versions.
        +        </p>
        +
        +        <p>
        +          This release contains many breaking changes, but easy-upgrade paths have
        +          been created as well as helper modules that will allow for backwards
        +          compatibility to be maintained with past versions of Select2. Upgrading
        +          <em>will</em> require you to read the release notes carefully, but the
        +          migration path should be relatively straightforward. You can view a list
        +          of the most common changes that you will need to make
        +          <a href="https://github.com/select2/select2/releases">in the release notes</a>.
        +        </p>
        +
        +        <p>
        +          Below is an in-depth review of what is new in Select2, as well as some of
        +          the major changes that have been made.
        +        </p>
        +      </section>
        +
        +      <section id="new">
        +        <h2>New features</h2>
        +
        +        <p>
        +          The notable features of this new release include:
        +        </p>
        +
        +        <ul>
        +          <li>
        +            A more flexible plugin framework that allows you to override Select2 to
        +            behave exactly how you want it to.
        +          </li>
        +          <li>
        +            Consistency with standard <code>&lt;select&gt;</code> elements for all
        +            data adapters, removing the need for hidden <code>&lt;input&gt;</code>
        +            elements.
        +          </li>
        +          <li>
        +            A new build system that uses AMD to keep everything organized.
        +          </li>
        +          <li>
        +            Less specific selectors allowing for Select2 to be styled to fit the
        +            rest of your application.
        +          </li>
        +        </ul>
        +      </section>
        +
        +      <section id="plugins">
        +        <h2>Plugin system</h2>
        +
        +        <p>
        +          Select2 now provides interfaces that allow for it to be easily extended,
        +          allowing for anyone to create a plugin that changes the way Select2 works.
        +          This is the result of Select2 being broken into four distinct sections,
        +          each of which can be extended and used together to create your unique
        +          Select2.
        +        </p>
        +
        +        <p>
        +          The adapters implement a consistent interface that is documented in the
        +          <a href="options.html#adapters">options section for adapters</a>, allowing
        +          you to customize Select2 to do exactly what you are looking for. Select2
        +          is designed such that you can mix and match plugins, with most of the core
        +          options being built as decorators that wrap the standard adapters.
        +        </p>
        +      </section>
        +
        +      <section id="amd-builds">
        +        <h2>AMD-based build system</h2>
        +
        +        <p>
        +          Select2 now uses an
        +          <a href="https://en.wikipedia.org/wiki/Asynchronous_module_definition">AMD-based build system</a>,
        +          allowing for builds that only require the parts of Select2 that you need.
        +          While a custom build system has not yet been created, Select2 is open
        +          source and will gladly accept a pull request for one.
        +        </p>
        +
        +        <p>
        +          Select2 includes the minimal <a href="https://github.com/jrburke/almond">almond</a>
        +          AMD loader, but a custom <code>select2.amd.js</code> build is available
        +          if you already use an AMD loader. The code base (available in the
        +          <code>src</code> directory) also uses AMD, allowing you to include Select2
        +          in your own build system and generate your own builds alongside your
        +          existing infrastructure.
        +        </p>
        +
        +        <p>
        +          The AMD methods used by Select2 are available as
        +          <code>jQuery.fn.select2.amd.define()/require()</code>, allowing you to use the
        +          included almond loader. These methods are primarily used by the
        +          translations, but they are the recommended way to access custom modules
        +          that Select2 provides.
        +        </p>
        +      </section>
        +
        +      <section id="migrating">
        +        <h1>Migrating from Select2 3.5</h1>
        +
        +        <p>
        +          There are a few breaking changes that migrators should be aware of when
        +          they are coming from older versions of Select2.
        +        </p>
        +
        +        <p>
        +          If you use the full build of Select2 (<code>select2.full.js</code>), you
        +          will be automatically notified of the major breaking changes, and
        +          compatibility modules will be used in some cases to ensure that your code
        +          still behaves how you were expecting.
        +        </p>
        +
        +        <h2 id="hidden-input">No more hidden input tags</h2>
        +
        +        <p>
        +          In past versions of Select2, an <code>&lt;input type="hidden" /&gt;</code>
        +          tag was recommended if you wanted to do anything advanced with Select2,
        +          such as work with remote data sources or allow users to add their own
        +          tags. This had the unfortunate side-effect of servers not receiving the
        +          data from Select2 as an array, like a standard <code>&lt;select&gt;</code>
        +          element does, but instead sending a string containing the comma-separated
        +          strings. The code base ended up being littered with special cases for the
        +          hidden input, and libraries using Select2 had to work around the
        +          differences it caused.
        +        </p>
        +
        +        <p>
        +          In Select2 4.0, the <code>&lt;select&gt;</code> element supports all core
        +          options, and support for the old
        +          <code>&lt;input type="hidden" /&gt;</code> has been deprecated. This means
        +          that if you previously declared an AJAX field with some pre-selected
        +          options that looked like…
        +        </p>
        +
        +{% highlight html linenos %}
        +<input type="hidden" name="select-boxes" value="1,2,4,6" />
        +{% endhighlight %}
        +
        +        <p>
        +          It will need to be recreated as a <code>&lt;select&gt;</code> element with
        +          some <code>&lt;option&gt;</code> tags that have <code>value</code>
        +          attributes that match the old value.
        +        </p>
        +
        +{% highlight html linenos %}
        +<select name="select-boxes" multiple="multiple">
        +  <option value="1" selected="selected">Select2</option>
        +  <option value="2" selected="selected">Chosen</option>
        +  <option value="4" selected="selected">selectize.js</option>
        +  <option value="6" selected="selected">typeahead.js</option>
        +</select>
        +{% endhighlight %}
        +
        +        <p>
        +          The options that you create should have <code>selected="selected"</code>
        +          set so Select2 and the browser knows that they should be selected. The
        +          <code>value</code> attribute of the option should also be set to the value
        +          that will be returned from the server for the result, so Select2 can
        +          highlight it as selected in the dropdown. The text within the option
        +          should also reflect the value that should be displayed by default for the
        +          option.
        +        </p>
        +
        +        <h2 id="new-matcher">Advanced matching of searches</h2>
        +
        +        <p>
        +          In past versions of Select2, when matching search terms to individual
        +          options, which limited the control that you had when displaying results,
        +          especially in cases where there was nested data. The <code>matcher</code>
        +          function was only given the individual option, even if it was a nested
        +          options, without any context.
        +        </p>
        +
        +        <p>
        +          With the new matcher function, only the root-level options are matched and
        +          matchers are expected to limit the results of any children options that
        +          they contain. This allows developers to customize how options within
        +          groups can be displayed, and modify how the results are returned.
        +        </p>
        +
        +        <p>
        +          A function has been created that allows old-style matcher functions to be
        +          converted to the new style. You can retrieve the function from the
        +          <code>select2/compat/matcher</code> module, which should just wrap the old
        +          matcher function.
        +        </p>
        +
        +        <p>
        +          So if your old code used a matcher that only displayed options if they
        +          started with the term that was entered, it would look something like…
        +        </p>
        +
        +{% highlight js linenos %}
        +function matchStart (term, text) {
        +  if (text.toUpperCase().indexOf(term.toUpperCase()) == 0) {
        +    return true;
        +  }
        +
        +  return false;
        +}
        +
        +$("select").select2({
        +  matcher: matchStart
        +})
        +{% endhighlight %}
        +
        +        <p>
        +          Then in Select2 4.0, you would need to wrap the <code>matchStart</code>
        +          method (or the name of the matcher you created) with a
        +          <code>oldMatcher</code> method that we have created.
        +        </p>
        +
        +{% highlight js linenos %}
        +function matchStart (term, text) {
        +  if (text.toUpperCase().indexOf(term.toUpperCase()) == 0) {
        +    return true;
        +  }
        +
        +  return false;
        +}
        +
        +$.fn.select2.amd.require(['select2/compat/matcher'], function (oldMatcher) {
        +  $("select").select2({
        +    matcher: oldMatcher(matchStart)
        +  })
        +});
        +{% endhighlight %}
        +
        +        <p>
        +          This will work for any matchers that only took in the search term and the
        +          text of the option as parameters. If your matcher relied on the third
        +          parameter containing the jQuery element representing the original
        +          <code>&lt;option&gt;</code> tag, then you may need to slightly change
        +          your matcher to expect the full JavaScript data object being passed in
        +          instead. You can still retrieve the jQuery element from the data object
        +          using the <code>data.element</code> property.
        +        </p>
        +
        +        <h2 id="flexible-placeholders">More flexible placeholders</h2>
        +
        +        <p>
        +          In the most recent versions of Select2, placeholders could only be
        +          applied to the first (typically the default) option in a
        +          <code>&lt;select&gt;</code> if it was blank. The
        +          <code>placeholderOption</code> option was added to Select2 to allow users
        +          using the <code>select</code> tag to select a different option, typically
        +          an automatically generated option with a different value.
        +        </p>
        +
        +        <p>
        +          The <code>placeholder</code> option can now take an object as well as just
        +          a string. This replaces the need for the old
        +          <code>placeholderOption</code>, as now the <code>id</code> of the object
        +          can be set to the <code>value</code> attribute of the
        +          <code>&lt;option&gt;</code> tag.
        +        </p>
        +
        +        <p>
        +          For a select that looks like the following, where the first option (with a
        +          value of <code>-1</code>) is the placeholder option…
        +        </p>
        +
        +{% highlight html linenos %}
        +<select>
        +  <option value="-1" selected="selected">Select an option</option>
        +  <option value="1">Something else</option>
        +</select>
        +{% endhighlight %}
        +
        +        <p>
        +          You would have previously had to get the placeholder option through the
        +          <code>placeholderOption</code>, but now you can do it through the
        +          <code>placeholder</code> option by setting an <code>id</code>.
        +        </p>
        +
        +{% highlight js linenos %}
        +$("select").select2({
        +  placeholder: {
        +    id: "-1",
        +    placeholder: "Select an option"
        +  }
        +})
        +{% endhighlight %}
        +
        +        <p>
        +          And Select2 will automatically display the placeholder when the value of
        +          the select is <code>-1</code>, which it will be by default. This does not
        +          break the old functionality of Select2 where the placeholder option was
        +          blank by default.
        +        </p>
        +
        +        <h2 id="value-ordering">Display reflects the actual order of the values</h2>
        +
        +        <p>
        +          In past versions of Select2, choices were displayed in the order that
        +          they were selected. In cases where Select2 was used on a
        +          <code>&lt;select&gt;</code> element, the order that the server received
        +          the selections did not always match the order that the choices were
        +          displayed, resulting in confusion in situations where the order is
        +          important.
        +        </p>
        +
        +        <p>
        +          Select2 will now order selected choices in the same order that will be
        +          sent to the server.
        +        </p>
        +
        +        <h2 id="changed-options">Changed method and option names</h2>
        +
        +        <p>
        +          When designing the future option set for Select2 4.0, special care was
        +          taken to ensure that the most commonly used options were brought over.
        +          For the most part, the commonly used options of Select2 can still be
        +          referenced under their previous names, but there were some changes which
        +          have been noted.
        +        </p>
        +
        +        <h3 id="removed-initselection">
        +          Removed the requirement of <code>initSelection</code>
        +        </h3>
        +
        +        <p>
        +          In the past, whenever you wanted to use a custom data adapter, such as
        +          AJAX or tagging, you needed to help Select2 out in determining the initial
        +          values that were selected. This was typically done through the
        +          <code>initSelection</code> option, which took the underlying data of the
        +          input and converted it into data objects that Select2 could use.
        +        </p>
        +
        +        <p>
        +          This is now handled by
        +          <a href="options.html#dataAdapter">the data adapter</a> in the
        +          <code>current</code> method, which allows Select2 to convert the currently
        +          selected values into data objects that can be displayed. The default
        +          implementation converts the text and value of <code>option</code> elements
        +          into data objects, and is probably suitable for most cases. An example of
        +          the old <code>initSelection</code> option is included below, which
        +          converts the value of the selected options into a data object with both
        +          the <code>id</code> and <code>text</code> matching the selected value.
        +        </p>
        +
        +{% highlight js linenos %}
        +{
        +  initSelection : function (element, callback) {
        +    var data = [];
        +    $(element.val()).each(function () {
        +      data.push({id: this, text: this});
        +    });
        +    callback(data);
        +  }
        +}
        +{% endhighlight %}
        +
        +        <p>
        +          When using the new <code>current</code> method of the custom data adapter,
        +          <strong>this method is called any time Select2 needs a list</strong> of
        +          the currently selected options. This is different from the old
        +          <code>initSelection</code> in that it was only called once, so it could
        +          suffer from being relatively slow to process the data (such as from a
        +          remote data source).
        +        </p>
        +
        +{% highlight js linenos %}
        +$.fn.select2.amd.require([
        +  'select2/data/array',
        +  'select2/utils'
        +], function (ArrayData, Utils) {
        +  function CustomData ($element, options) {
        +    CustomData.__super__.constructor.call(this, $element, options);
        +  }
        +
        +  Utils.Extend(CustomData, ArrayData);
        +
        +  CustomData.prototype.current = function (callback) {
        +    var data = [];
        +    var currentVal = this.$element.val();
        +
        +    if (!this.$element.prop('multiple')) {
        +      currentVal = [currentVal];
        +    }
        +
        +    for (var v = 0; v < currentVal.length; v++) {
        +      data.push({
        +        id: currentVal[v],
        +        text: currentVal[v]
        +      });
        +    }
        +
        +    callback(data);
        +  };
        +
        +  $("#select").select2({
        +    dataAdapter: CustomData
        +  });
        +}
        +{% endhighlight %}
        +
        +        <p>
        +          The new <code>current</code> method of the data adapter works in a similar
        +          way to the old <code>initSelection</code> method, with three notable
        +          differences. The first, and most important, is that <strong>it is called
        +          whenever the current selections are needed</strong> to ensure that Select2
        +          is always displaying the most accurate and up to date data. No matter
        +          what type of element Select2 is attached to, whether it supports a
        +          single or multiple selections, the data passed to the callback
        +          <strong>must be an array, even if it contains one selection</strong>.
        +          The last is that there is only one parameter, the callback to be
        +          executed with the latest data, and the current element that Select2 is
        +          attached to is available on the class itself as
        +          <code>this.$element</code>.
        +        </p>
        +
        +        <p>
        +          If you only need to load in the initial options once, and otherwise will
        +          be letting Select2 handle the state of the selections, you don't need to
        +          use a custom data adapter. You can just create the
        +          <code>&lt;option&gt;</code> tags on your own, and Select2 will pick up
        +          the changes.
        +        </p>
        +
        +{% highlight js linenos %}
        +var $element = $('select').select2(); // the select element you are working with
        +
        +var $request = $.ajax({
        +  url: '/my/remote/source' // wherever your data is actually coming from
        +});
        +
        +$request.then(function (data) {
        +  // This assumes that the data comes back as an array of data objects
        +  // The idea is that you are using the same callback as the old `initSelection`
        +
        +  for (var d = 0; d < data.length; d++) {
        +    var item = data[d];
        +
        +    // Create the DOM option that is pre-selected by default
        +    var option = new Option(item.text, item.id, true, true);
        +
        +    // Append it to the select
        +    $element.append(option);
        +  }
        +
        +  // Update the selected options that are displayed
        +  $element.trigger('change');
        +});
        +{% endhighlight %}
        +
        +        <h3 id="query-to-data-adapter">
        +          Custom data adapters instead of <code>query</code>
        +        </h3>
        +
        +        <p>
        +          <a href="http://select2.github.io/select2/#data">In the past</a>, any time
        +          you wanted to hook Select2 up to a different data source you would be
        +          required to implement custom <code>query</code> and
        +          <code>initSelection</code> methods. This allowed Select2 to determine the
        +          initial selection and the list of results to display, and it would handle
        +          everything else internally, which was fine more most people.
        +        </p>
        +
        +        <p>
        +          The custom <code>query</code> and <code>initSelection</code> methods have
        +          been replaced by
        +          <a href="options.html#dataAdapter">custom data adapters</a> that handle
        +          how Select2 stores and retrieves the data that will be displayed to the
        +          user. An example of the old <code>query</code> option is provided below,
        +          which is
        +          <a href="http://select2.github.io/select2/#data">the same as the old example</a>,
        +          and it generates results that contain the search term repeated a certain
        +          number of times.
        +        </p>
        +
        +{% highlight js linenos %}
        +{
        +  query: function (query) {
        +    var data = {results: []}, i, j, s;
        +    for (i = 1; i < 5; i++) {
        +      s = "";
        +      for (j = 0; j < i; j++) {s = s + query.term;}
        +      data.results.push({id: query.term + i, text: s});
        +    }
        +    query.callback(data);
        +  }
        +}
        +{% endhighlight %}
        +
        +        <p>
        +          This has been replaced by custom data adapters which define a similarly
        +          named <code>query</code> method. The comparable data adapter is provided
        +          below as an example.
        +        </p>
        +
        +{% highlight js linenos %}
        +$.fn.select2.amd.require([
        +  'select2/data/array',
        +  'select2/utils'
        +], function (ArrayData, Utils) {
        +  function CustomData ($element, options) {
        +    CustomData.__super__.constructor.call(this, $element, options);
        +  }
        +
        +  Utils.Extend(CustomData, ArrayData);
        +
        +  CustomData.prototype.query = function (params, callback) {
        +    var data = {
        +      results: []
        +    };
        +
        +    for (var i = 1; i < 5; i++) {
        +      var s = "";
        +
        +      for (var j = 0; j < i; j++) {
        +        s = s + params.term;
        +      }
        +
        +      data.results.push({
        +        id: params.term + i,
        +        text: s
        +      });
        +    }
        +
        +    callback(data);
        +  };
        +
        +  $("#select").select2({
        +    dataAdapter: CustomData
        +  });
        +}
        +{% endhighlight %}
        +
        +        <p>
        +          The new <code>query</code> method of the data adapter is very similar to
        +          the old <code>query</code> option that was passed into Select2 when
        +          initializing it. The old <code>query</code> argument is mostly the same as
        +          the new <code>params</code> that are passed in to query on, and the
        +          callback that should be used to return the results is now passed in as the
        +          second parameter.
        +        </p>
        +
        +        <h3 id="changed-templating">Renamed templating options</h3>
        +
        +        <p>
        +          Select2 previously provided multiple options for formatting the results
        +          list and selected options, commonly referred to as "formatters", using the
        +          <code>formatSelection</code> and <code>formatResult</code> options. As the
        +          "formatters" were also used for things such as localization,
        +          <a href="#changed-translations">which has also changed</a>, they have been
        +          renamed to <code>templateSelection</code> and <code>templateResult</code>
        +          and their signatures have changed as well.
        +        </p>
        +
        +        <p>
        +          You should refer to the updated
        +          <a href="options.html#templating">documentation on templates</a> when
        +          migrating from previous versions of Select2.
        +        </p>
        +
        +        <h3 id="changed-id">
        +          The <code>id</code> and <code>text</code> properties are strictly enforced
        +        </h3>
        +
        +        <p>
        +          When working with array and AJAX data in the past, Select2 allowed a
        +          custom <code>id</code> function or attribute to be set in various places,
        +          ranging from the initialization of Select2 to when the remote data was
        +          being returned. This allowed Select2 to better integrate with existing
        +          data sources that did not necessarily use the <code>id</code> attribute to
        +          indicate the unique identifier for an object.
        +        </p>
        +
        +        <p>
        +          Select2 no longer supports a custom <code>id</code> or <code>text</code>
        +          to be used, but provides integration points for converting incorrect data
        +          to the expected format.
        +        </p>
        +
        +        <h4>
        +          When working with array data
        +        </h4>
        +
        +        <p>
        +          Select2 previously supported defining array data as an object that matched
        +          the signature of an AJAX response. A <code>text</code> property could be
        +          specified that would map the given property to the <code>text</code>
        +          property on the individual objects. You can now do this when initializing
        +          Select2 by using the following jQuery code to map the old
        +          <code>text</code> and <code>id</code> properties to the new ones.
        +        </p>
        +
        +{% highlight js linenos %}
        +var data = $.map([
        +  {
        +    pk: 1,
        +    word: 'one'
        +  },
        +  {
        +    pk: 2,
        +    word: 'two'
        +  }
        +], function (obj) {
        +  obj.id = obj.id || obj.pk;
        +  obj.text = obj.text || obj.word;
        +
        +  return obj;
        +});
        +{% endhighlight %}
        +
        +        <p>
        +          This will result in an array of data objects that have the <code>id</code>
        +          properties that match the existing <code>pk</code> properties and
        +          <code>text</code> properties that match the existing <code>word</code>
        +          properties.
        +        </p>
        +
        +        <h4>
        +          When working with remote data
        +        </h4>
        +
        +        <p>
        +          The same code that was given above can be used in the
        +          <code>processResults</code> method of an AJAX call to map properties there
        +          as well.
        +        </p>
        +
        +        <h3 id="changed-translations">Renamed translation options</h3>
        +
        +        <p>
        +          In previous versions of Select2, the default messages provided to users
        +          could be localized to fit the language of the website that it was being
        +          used on. Select2 only comes with the English language by default, but
        +          provides
        +          <a href="options.html#language">community-contributed translations</a> for
        +          many common languages. Many of the formatters have been moved to the
        +          <code>language</code> option and the signatures of the formatters have
        +          been changed to handle future additions.
        +        </p>
        +
        +        <h3 id="changed-data">
        +          Declaring options using <code>data-*</code> attributes
        +        </h3>
        +
        +        <p>
        +          In the past, Select2 has only supported declaring a subset of options
        +          using <code>data-*</code> attributes. Select2 now supports declaring all
        +          options using the attributes, using
        +          <a href="options.html#data-attributes">the format specified in the documentation</a>.
        +        </p>
        +
        +        <p>
        +          You could previously declare the URL that was used for AJAX requests using
        +          the <code>data-ajax-url</code> attribute. While Select2 still allows for
        +          this, the new attribute that should be used is the
        +          <code>data-ajax--url</code> attribute. Support for the old attribute will
        +          be removed in Select2 4.1.
        +        </p>
        +
        +        <p>
        +          Although it was not documented, a list of possible tags could also be
        +          provided using the <code>data-select2-tags</code> attribute and passing in
        +          a JSON-formatted array of objects for tags. As the method for specifying
        +          tags has changed in 4.0, you should now provide the array of objects using
        +          the <code>data-data</code> attribute, which maps to
        +          <a href="options.html#data">the array data</a> option. You should also
        +          enable tags by setting <code>data-tags="true"</code> on the object, to
        +          maintain the ability for users to create their own options as well.
        +        </p>
        +
        +        <p>
        +          If you previously declared the list of tags as…
        +        </p>
        +
        +{% highlight html linenos %}
        +<select data-select2-tags='[{"id": "1", "text": "One"}, {"id": "2", "text": "Two"}]'></select>
        +{% endhighlight %}
        +
        +        <p>
        +          …then you should now declare it as…
        +        </p>
        +
        +{% highlight html linenos %}
        +<select data-data='[{"id": "1", "text": "One"}, {"id": "2", "text": "Two"}]' data-tags="true"></select>
        +{% endhighlight %}
        +
        +        <h2 id="removed-methods">Deprecated and removed methods</h2>
        +
        +        <p>
        +          As Select2 now uses a <code>&lt;select&gt;</code> element for all data
        +          sources, a few methods that were available by calling
        +          <code>.select2()</code> are no longer required.
        +        </p>
        +
        +        <h3>.select2("val")</h3>
        +
        +        <p>
        +          The <code>"val"</code> method has been deprecated and will be removed in
        +          Select2 4.1. The deprecated method no longer includes the
        +          <code>triggerChange</code> parameter.
        +        </p>
        +
        +        <p>
        +          You should directly call <code>.val</code> on the underlying
        +          <code>&lt;select&gt;</code> element instead. If you needed the second
        +          parameter (<code>triggerChange</code>), you should also call
        +          <code>.trigger("change")</code> on the element.
        +        </p>
        +
        +{% highlight js linenos %}
        +$("select").val("1").trigger("change"); // instead of $("select").select2("val", "1");
        +{% endhighlight %}
        +
        +        <h3>.select2("enable")</h3>
        +
        +        <p>
        +          Select2 will respect the <code>disabled</code> property of the underlying
        +          select element. In order to enable or disable Select2, you should call
        +          <code>.prop('disabled', true/false)</code> on the
        +          <code>&lt;select&gt;</code> element. Support for the old methods will be
        +          completely removed in Select2 4.1.
        +        </p>
        +
        +{% highlight js linenos %}
        +$("select").prop("disabled", true); // instead of $("select").enable(false);
        +{% endhighlight %}
        +
        +      </section>
        +    </div>
        +    <div class="col-md-3" role="complementary">
        +
        +      {% include nav/announcements-4.0.html %}
        +
        +    </div>
        +  </div>
        +</div>
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/browserconfig.xml b/bower_components/select2/docs/browserconfig.xml
        new file mode 100644
        index 0000000000..beca4f5f92
        --- /dev/null
        +++ b/bower_components/select2/docs/browserconfig.xml
        @@ -0,0 +1,11 @@
        +<?xml version="1.0" encoding="utf-8"?>
        +<browserconfig>
        +  <msapplication>
        +    <tile>
        +      <square70x70logo src="/images/mstile-70x70.png?v=699Nxpjr2A"/>
        +      <square150x150logo src="/images/mstile-150x150.png?v=699Nxpjr2A"/>
        +      <wide310x150logo src="/images/mstile-310x150.png?v=699Nxpjr2A"/>
        +      <TileColor>#da532c</TileColor>
        +    </tile>
        +  </msapplication>
        +</browserconfig>
        diff --git a/bower_components/select2/docs/community.html b/bower_components/select2/docs/community.html
        new file mode 100644
        index 0000000000..54830af089
        --- /dev/null
        +++ b/bower_components/select2/docs/community.html
        @@ -0,0 +1,154 @@
        +---
        +layout: default
        +title: Community - Select2
        +slug: community
        +---
        +
        +<section class="jumbotron">
        +  <div class="container">
        +    <h1>
        +      Community
        +    </h1>
        +    <p class="lead">
        +      Select2 has an active community that enjoys helping each other out.
        +    </p>
        +  </div>
        +</section>
        +
        +<div class="container">
        +  <section id="support">
        +    <div class="page-header">
        +      <h1>Getting support</h1>
        +    </div>
        +
        +    <p>
        +      Having trouble getting Select2 working on your website? Is it not working
        +      together with another plugin, even though you think it should? Select2 has a
        +      few communities that you can go to for help getting it all working together.
        +    </p>
        +
        +    <ol>
        +      <li>
        +        Try sending a message to the
        +        <a href="https://groups.google.com/d/forum/select2">
        +          Select2 discussion group
        +        </a>
        +        or searching the archives.
        +      </li>
        +      <li>
        +        Ask in the <code>#select2</code> channel on
        +        <code>chat.freenode.net</code> or use the
        +        <a href="https://webchat.freenode.net/?channels=select2">
        +          web irc client.
        +        </a>
        +      </li>
        +      <li>
        +        Raise a question on
        +        <a href="http://stackoverflow.com/">Stack Overflow</a>,
        +        make sure to include the
        +        <a href="http://stackoverflow.com/questions/tagged/jquery-select2?sort=votes">
        +          "jquery-select2"
        +        </a>
        +        tag.
        +      </li>
        +    </ol>
        +  </section>
        +
        +  <section id="reporting-bugs">
        +    <div class="page-header">
        +      <h1>Reporting bugs</h1>
        +    </div>
        +
        +    <p>
        +      Found a problem with Select2? Feel free to open a ticket on the Select2
        +      repository on GitHub, but you should keep a few things in mind:
        +    </p>
        +
        +    <ol>
        +      <li>
        +        Use the
        +        <a href="https://github.com/select2/select2/search?q=&type=Issues">
        +          GitHub issue search
        +        </a>
        +        to check if your issue has already been reported.
        +      </li>
        +      <li>
        +        Try to isolate your problem as much as possible, so we can easily test if
        +        the issue has been fixed.
        +      </li>
        +      <li>
        +        Once you are sure the issue is with Select2, and not a third party
        +        library,
        +        <a href="https://github.com/select2/select2/issues/new">
        +          submit a ticket
        +        </a>
        +        to the repository.
        +      </li>
        +    </ol>
        +
        +    <p>
        +      You can find more information on reporting bugs in the
        +      <a href="https://github.com/select2/select2/blob/master/CONTRIBUTING.md#reporting-bugs-with-select2">
        +        contributing guide,
        +      </a>
        +      including tips on what information to include.
        +    </p>
        +  </section>
        +
        +  <section id="requesting-features">
        +    <div class="page-header">
        +      <h1>Requesting new features</h1>
        +    </div>
        +
        +    <p>
        +      New feature requests are usually requested by the
        +      <a href="https://github.com/select2/select2/issues">
        +        Select2 community on GitHub,
        +      </a>
        +      and are often fulfilled by
        +      <a href="#contributing">
        +        fellow contributors.
        +      </a>
        +    </p>
        +
        +    <ol>
        +      <li>
        +        Use the
        +        <a href="https://github.com/select2/select2/search?q=&type=Issues">
        +          GitHub issue search
        +        </a>
        +        to check if your feature has already been requested.
        +      </li>
        +      <li>
        +        Check if it hasn't already been implemented as a
        +        <a href="">
        +          third party plugin.
        +        </a>
        +      </li>
        +      <li>
        +        Please make sure you are only requesting a single feature, and not a
        +        collection of smaller features.
        +      </li>
        +    </ol>
        +
        +    <p>
        +      You can find more information on requesting new features in the
        +      <a href="https://github.com/select2/select2/blob/master/CONTRIBUTING.md#requesting-features-in-select2">
        +        contributing guide.
        +      </a>
        +    </p>
        +  </section>
        +
        +  <section id="contributing">
        +    <div class="page-header">
        +      <h1>Getting involved</h1>
        +    </div>
        +
        +    <p>
        +      You can find more information on getting involved with Select2 in the
        +      <a href="https://github.com/select2/select2/blob/master/CONTRIBUTING.md#triaging-issues-and-pull-requests">
        +        contributing guide.
        +      </a>
        +    </p>
        +  </section>
        +</div>
        diff --git a/bower_components/select2/docs/css/bootstrap.scss b/bower_components/select2/docs/css/bootstrap.scss
        new file mode 100644
        index 0000000000..83fc0c7b11
        --- /dev/null
        +++ b/bower_components/select2/docs/css/bootstrap.scss
        @@ -0,0 +1,51 @@
        +---
        +---
        +
        +/*!
        + * Bootstrap v3.3.6 (http://getbootstrap.com)
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + */
        +
        +// Core variables and mixins
        +@import "vendor/bootstrap/variables";
        +@import "vendor/bootstrap/mixins";
        +
        +// Reset and dependencies
        +@import "vendor/bootstrap/normalize";
        +@import "vendor/bootstrap/print";
        +
        +// Core CSS
        +@import "vendor/bootstrap/scaffolding";
        +@import "vendor/bootstrap/type";
        +@import "vendor/bootstrap/code";
        +@import "vendor/bootstrap/grid";
        +@import "vendor/bootstrap/tables";
        +@import "vendor/bootstrap/forms";
        +@import "vendor/bootstrap/buttons";
        +
        +// Components
        +@import "vendor/bootstrap/component-animations";
        +@import "vendor/bootstrap/dropdowns";
        +@import "vendor/bootstrap/button-groups";
        +@import "vendor/bootstrap/input-groups";
        +@import "vendor/bootstrap/navs";
        +@import "vendor/bootstrap/navbar";
        +@import "vendor/bootstrap/breadcrumbs";
        +@import "vendor/bootstrap/pagination";
        +@import "vendor/bootstrap/pager";
        +@import "vendor/bootstrap/labels";
        +@import "vendor/bootstrap/badges";
        +@import "vendor/bootstrap/jumbotron";
        +@import "vendor/bootstrap/thumbnails";
        +@import "vendor/bootstrap/alerts";
        +@import "vendor/bootstrap/media";
        +@import "vendor/bootstrap/list-group";
        +@import "vendor/bootstrap/panels";
        +@import "vendor/bootstrap/responsive-embed";
        +@import "vendor/bootstrap/wells";
        +@import "vendor/bootstrap/close";
        +
        +// Utility classes
        +@import "vendor/bootstrap/utilities";
        +@import "vendor/bootstrap/responsive-utilities";
        diff --git a/bower_components/select2/docs/css/font-awesome.scss b/bower_components/select2/docs/css/font-awesome.scss
        new file mode 100644
        index 0000000000..d72cf940fd
        --- /dev/null
        +++ b/bower_components/select2/docs/css/font-awesome.scss
        @@ -0,0 +1,16 @@
        +---
        +---
        +
        +/*!
        + *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
        + *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
        + */
        +
        +$fa-font-path: "../vendor/fonts";
        +
        +@import "vendor/font-awesome/variables";
        +@import "vendor/font-awesome/mixins";
        +@import "vendor/font-awesome/path";
        +@import "vendor/font-awesome/core";
        +@import "vendor/font-awesome/list";
        +@import "vendor/font-awesome/icons";
        diff --git a/bower_components/select2/docs/css/s2-docs.scss b/bower_components/select2/docs/css/s2-docs.scss
        new file mode 100644
        index 0000000000..6b66a37c1f
        --- /dev/null
        +++ b/bower_components/select2/docs/css/s2-docs.scss
        @@ -0,0 +1,24 @@
        +---
        +---
        +
        +@import "vendor/bootstrap/variables";
        +
        +@import "result-repository";
        +@import "sidenav";
        +@import "hamburger";
        +@import "code";
        +@import "featurette";
        +@import "layout";
        +@import "nav";
        +@import "footer";
        +@import "alert";
        +@import "home";
        +@import "examples";
        +@import "social";
        +@import "buttons";
        +@import "anchorjs";
        +@import "jumbotron";
        +@import "prettify";
        +@import "syntax-highlighting";
        +@import "typography";
        +@import "dl-panels";
        \ No newline at end of file
        diff --git a/public/assets/js/respond.js b/bower_components/select2/docs/dist/.gitkeep
        similarity index 100%
        rename from public/assets/js/respond.js
        rename to bower_components/select2/docs/dist/.gitkeep
        diff --git a/bower_components/select2/docs/examples.html b/bower_components/select2/docs/examples.html
        new file mode 100644
        index 0000000000..aeb329ba15
        --- /dev/null
        +++ b/bower_components/select2/docs/examples.html
        @@ -0,0 +1,256 @@
        +---
        +layout: default
        +title: Examples - Select2
        +slug: examples
        +---
        +
        +<script type="text/javascript" src="vendor/js/placeholders.jquery.min.js"></script>
        +<script type="text/javascript" src="dist/js/i18n/es.js"></script>
        +
        +<style type="text/css">
        +  .img-flag {
        +    height: 15px;
        +    width: 18px;
        +  }
        +</style>
        +
        +<section class="jumbotron">
        +  <div class="container">
        +    <h1>
        +      Examples
        +    </h1>
        +  </div>
        +</section>
        +
        +<div class="container s2-docs-container">
        +  <div class="row">
        +    <div class="col-md-9" role="main">
        +
        +      {% include examples/basics.html %}
        +      {% include examples/placeholders.html %}
        +      {% include examples/data.html %}
        +      {% include examples/disabled-mode.html %}
        +      {% include examples/disabled-results.html %}
        +      {% include examples/multiple-max.html %}
        +      {% include examples/hide-search.html %}
        +      {% include examples/programmatic-control.html %}
        +      {% include examples/tags.html %}
        +      {% include examples/tokenizer.html %}
        +      {% include examples/matcher.html %}
        +      {% include examples/localization-rtl-diacritics.html %}
        +      {% include examples/themes-templating-responsive-design.html %}
        +
        +    </div>
        +    <div class="col-md-3" role="complementary">
        +
        +      {% include nav/examples.html %}
        +
        +    </div>
        +  </div>
        +</div>
        +
        +{% include js-source-states.html %}
        +
        +<script type="text/javascript">
        +  var $states = $(".js-source-states");
        +  var statesOptions = $states.html();
        +  $states.remove();
        +
        +  $(".js-states").append(statesOptions);
        +
        +  $("[data-fill-from]").each(function () {
        +    var $this = $(this);
        +
        +    var codeContainer = $this.data("fill-from");
        +    var $container = $(codeContainer);
        +
        +    var code = $.trim($container.html());
        +
        +    $this.text(code);
        +    $this.addClass("prettyprint linenums");
        +  });
        +
        +  prettyPrint();
        +
        +  $.fn.select2.amd.require([
        +    "select2/core",
        +    "select2/utils",
        +    "select2/compat/matcher"
        +  ], function (Select2, Utils, oldMatcher) {
        +    var $basicSingle = $(".js-example-basic-single");
        +    var $basicMultiple = $(".js-example-basic-multiple");
        +    var $limitMultiple = $(".js-example-basic-multiple-limit");
        +
        +    var $dataArray = $(".js-example-data-array");
        +    var $dataArraySelected = $(".js-example-data-array-selected");
        +
        +    var data = [
        +      { id: 0, text: 'enhancement' },
        +      { id: 1, text: 'bug' },
        +      { id: 2, text: 'duplicate' },
        +      { id: 3, text: 'invalid' },
        +      { id: 4, text: 'wontfix' }
        +    ];
        +
        +    var $ajax = $(".js-example-data-ajax");
        +
        +    var $disabledResults = $(".js-example-disabled-results");
        +
        +    var $tags = $(".js-example-tags");
        +
        +    var $matcherStart = $('.js-example-matcher-start');
        +
        +    var $diacritics = $(".js-example-diacritics");
        +    var $language = $(".js-example-language");
        +
        +    $.fn.select2.defaults.set("width", "100%");
        +
        +    $basicSingle.select2();
        +    $basicMultiple.select2();
        +    $limitMultiple.select2({
        +      maximumSelectionLength: 2
        +    });
        +
        +    function formatState (state) {
        +      if (!state.id) {
        +        return state.text;
        +      }
        +      var $state = $(
        +        '<span>' +
        +          '<img src="vendor/images/flags/' +
        +            state.element.value.toLowerCase() +
        +          '.png" class="img-flag" /> ' +
        +          state.text +
        +        '</span>'
        +      );
        +      return $state;
        +    };
        +
        +    $(".js-example-templating").select2({
        +      templateResult: formatState,
        +      templateSelection: formatState
        +    });
        +
        +    $dataArray.select2({
        +      data: data
        +    });
        +
        +    $dataArraySelected.select2({
        +      data: data
        +    });
        +
        +    function formatRepo (repo) {
        +      if (repo.loading) return repo.text;
        +
        +      var markup = "<div class='select2-result-repository clearfix'>" +
        +        "<div class='select2-result-repository__avatar'><img src='" + repo.owner.avatar_url + "' /></div>" +
        +        "<div class='select2-result-repository__meta'>" +
        +          "<div class='select2-result-repository__title'>" + repo.full_name + "</div>";
        +
        +      if (repo.description) {
        +        markup += "<div class='select2-result-repository__description'>" + repo.description + "</div>";
        +      }
        +
        +      markup += "<div class='select2-result-repository__statistics'>" +
        +        "<div class='select2-result-repository__forks'><i class='fa fa-flash'></i> " + repo.forks_count + " Forks</div>" +
        +        "<div class='select2-result-repository__stargazers'><i class='fa fa-star'></i> " + repo.stargazers_count + " Stars</div>" +
        +        "<div class='select2-result-repository__watchers'><i class='fa fa-eye'></i> " + repo.watchers_count + " Watchers</div>" +
        +      "</div>" +
        +      "</div></div>";
        +
        +      return markup;
        +    }
        +
        +    function formatRepoSelection (repo) {
        +      return repo.full_name || repo.text;
        +    }
        +
        +    $ajax.select2({
        +      ajax: {
        +        url: "https://api.github.com/search/repositories",
        +        dataType: 'json',
        +        delay: 250,
        +        data: function (params) {
        +          return {
        +            q: params.term, // search term
        +            page: params.page
        +          };
        +        },
        +        processResults: function (data, params) {
        +          // parse the results into the format expected by Select2
        +          // since we are using custom formatting functions we do not need to
        +          // alter the remote JSON data, except to indicate that infinite
        +          // scrolling can be used
        +          params.page = params.page || 1;
        +
        +          return {
        +            results: data.items,
        +            pagination: {
        +              more: (params.page * 30) < data.total_count
        +            }
        +          };
        +        },
        +        cache: true
        +      },
        +      escapeMarkup: function (markup) { return markup; },
        +      minimumInputLength: 1,
        +      templateResult: formatRepo,
        +      templateSelection: formatRepoSelection
        +    });
        +
        +    $(".js-example-disabled").select2();
        +    $(".js-example-disabled-multi").select2();
        +
        +    $(".js-example-responsive").select2({
        +        width: 'resolve' // need to override the changed default
        +    });
        +
        +    $disabledResults.select2();
        +
        +    $(".js-example-programmatic").select2();
        +    $(".js-example-programmatic-multi").select2();
        +
        +    $eventSelect.select2();
        +
        +    $tags.select2({
        +      tags: ['red', 'blue', 'green']
        +    });
        +
        +    $(".js-example-tokenizer").select2({
        +      tags: true,
        +      tokenSeparators: [',', ' ']
        +    });
        +
        +    function matchStart (term, text) {
        +      if (text.toUpperCase().indexOf(term.toUpperCase()) == 0) {
        +        return true;
        +      }
        +
        +      return false;
        +    }
        +
        +    $matcherStart.select2({
        +      matcher: oldMatcher(matchStart)
        +    });
        +
        +    $(".js-example-basic-hide-search").select2({
        +      minimumResultsForSearch: Infinity
        +    });
        +
        +    $diacritics.select2();
        +
        +    $language.select2({
        +      language: "es"
        +    });
        +
        +    $(".js-example-theme-single").select2({
        +      theme: "classic"
        +    });
        +
        +    $(".js-example-theme-multiple").select2({
        +      theme: "classic"
        +    });
        +
        +    $(".js-example-rtl").select2();
        +  });
        +</script>
        diff --git a/bower_components/select2/docs/images/android-chrome-36x36.png b/bower_components/select2/docs/images/android-chrome-36x36.png
        new file mode 100644
        index 0000000000..12a3dc6b4e
        Binary files /dev/null and b/bower_components/select2/docs/images/android-chrome-36x36.png differ
        diff --git a/bower_components/select2/docs/images/android-chrome-48x48.png b/bower_components/select2/docs/images/android-chrome-48x48.png
        new file mode 100644
        index 0000000000..64aa46a47a
        Binary files /dev/null and b/bower_components/select2/docs/images/android-chrome-48x48.png differ
        diff --git a/bower_components/select2/docs/images/android-chrome-72x72.png b/bower_components/select2/docs/images/android-chrome-72x72.png
        new file mode 100644
        index 0000000000..2c2c829ba5
        Binary files /dev/null and b/bower_components/select2/docs/images/android-chrome-72x72.png differ
        diff --git a/bower_components/select2/docs/images/apple-touch-icon-57x57.png b/bower_components/select2/docs/images/apple-touch-icon-57x57.png
        new file mode 100644
        index 0000000000..ae24323d40
        Binary files /dev/null and b/bower_components/select2/docs/images/apple-touch-icon-57x57.png differ
        diff --git a/bower_components/select2/docs/images/apple-touch-icon-60x60.png b/bower_components/select2/docs/images/apple-touch-icon-60x60.png
        new file mode 100644
        index 0000000000..e3f8d21fc5
        Binary files /dev/null and b/bower_components/select2/docs/images/apple-touch-icon-60x60.png differ
        diff --git a/bower_components/select2/docs/images/apple-touch-icon-72x72.png b/bower_components/select2/docs/images/apple-touch-icon-72x72.png
        new file mode 100644
        index 0000000000..e5399209d9
        Binary files /dev/null and b/bower_components/select2/docs/images/apple-touch-icon-72x72.png differ
        diff --git a/bower_components/select2/docs/images/apple-touch-icon-precomposed.png b/bower_components/select2/docs/images/apple-touch-icon-precomposed.png
        new file mode 100644
        index 0000000000..31b912e71d
        Binary files /dev/null and b/bower_components/select2/docs/images/apple-touch-icon-precomposed.png differ
        diff --git a/bower_components/select2/docs/images/apple-touch-icon.png b/bower_components/select2/docs/images/apple-touch-icon.png
        new file mode 100644
        index 0000000000..e5399209d9
        Binary files /dev/null and b/bower_components/select2/docs/images/apple-touch-icon.png differ
        diff --git a/bower_components/select2/docs/images/favicon-16x16.png b/bower_components/select2/docs/images/favicon-16x16.png
        new file mode 100644
        index 0000000000..ab60a1d139
        Binary files /dev/null and b/bower_components/select2/docs/images/favicon-16x16.png differ
        diff --git a/bower_components/select2/docs/images/favicon-32x32.png b/bower_components/select2/docs/images/favicon-32x32.png
        new file mode 100644
        index 0000000000..5319e04a7b
        Binary files /dev/null and b/bower_components/select2/docs/images/favicon-32x32.png differ
        diff --git a/bower_components/select2/docs/images/favicon.ico b/bower_components/select2/docs/images/favicon.ico
        new file mode 100644
        index 0000000000..91dcfd50e8
        Binary files /dev/null and b/bower_components/select2/docs/images/favicon.ico differ
        diff --git a/bower_components/select2/docs/images/logo.png b/bower_components/select2/docs/images/logo.png
        new file mode 100644
        index 0000000000..8de094fc94
        Binary files /dev/null and b/bower_components/select2/docs/images/logo.png differ
        diff --git a/bower_components/select2/docs/images/manifest.json b/bower_components/select2/docs/images/manifest.json
        new file mode 100644
        index 0000000000..99bc8aa42d
        --- /dev/null
        +++ b/bower_components/select2/docs/images/manifest.json
        @@ -0,0 +1,23 @@
        +{
        +	"name": "Select2",
        +	"icons": [
        +		{
        +			"src": "\/images\/android-chrome-36x36.png?v=699Nxpjr2A",
        +			"sizes": "36x36",
        +			"type": "image\/png",
        +			"density": 0.75
        +		},
        +		{
        +			"src": "\/images\/android-chrome-48x48.png?v=699Nxpjr2A",
        +			"sizes": "48x48",
        +			"type": "image\/png",
        +			"density": 1
        +		},
        +		{
        +			"src": "\/images\/android-chrome-72x72.png?v=699Nxpjr2A",
        +			"sizes": "72x72",
        +			"type": "image\/png",
        +			"density": 1.5
        +		}
        +	]
        +}
        diff --git a/bower_components/select2/docs/images/mstile-150x150.png b/bower_components/select2/docs/images/mstile-150x150.png
        new file mode 100644
        index 0000000000..9dede7da16
        Binary files /dev/null and b/bower_components/select2/docs/images/mstile-150x150.png differ
        diff --git a/bower_components/select2/docs/images/mstile-310x150.png b/bower_components/select2/docs/images/mstile-310x150.png
        new file mode 100644
        index 0000000000..a266af2ea5
        Binary files /dev/null and b/bower_components/select2/docs/images/mstile-310x150.png differ
        diff --git a/bower_components/select2/docs/images/mstile-70x70.png b/bower_components/select2/docs/images/mstile-70x70.png
        new file mode 100644
        index 0000000000..f2efb68c9c
        Binary files /dev/null and b/bower_components/select2/docs/images/mstile-70x70.png differ
        diff --git a/bower_components/select2/docs/images/safari-pinned-tab.svg b/bower_components/select2/docs/images/safari-pinned-tab.svg
        new file mode 100644
        index 0000000000..700213c40d
        --- /dev/null
        +++ b/bower_components/select2/docs/images/safari-pinned-tab.svg
        @@ -0,0 +1,17 @@
        +<?xml version="1.0" standalone="no"?>
        +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
        + "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
        +<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
        + width="72.000000pt" height="72.000000pt" viewBox="0 0 72.000000 72.000000"
        + preserveAspectRatio="xMidYMid meet">
        +<metadata>
        +Created by potrace 1.11, written by Peter Selinger 2001-2013
        +</metadata>
        +<g transform="translate(0.000000,72.000000) scale(0.100000,-0.100000)"
        +fill="#000000" stroke="none">
        +<path d="M177 598 l-179 -120 86 -57 c47 -31 86 -59 86 -63 0 -3 -39 -32 -86
        +-63 l-86 -58 181 -119 181 -119 181 122 180 121 -82 54 c-46 30 -84 56 -86 58
        +-3 2 21 21 52 42 31 22 70 49 86 61 l30 21 -180 121 c-99 67 -181 121 -183
        +120 -2 0 -83 -54 -181 -121z"/>
        +</g>
        +</svg>
        diff --git a/bower_components/select2/docs/index.html b/bower_components/select2/docs/index.html
        new file mode 100644
        index 0000000000..accd1db992
        --- /dev/null
        +++ b/bower_components/select2/docs/index.html
        @@ -0,0 +1,237 @@
        +---
        +layout: home
        +title: Select2 - The jQuery replacement for select boxes
        +slug: home
        +---
        +
        +<main class="jumbotron" role="main">
        +  <div class="container text-center">
        +    <h1>Select2</h1>
        +    <p class="lead">
        +      The jQuery replacement for select boxes
        +    </p>
        +    <p>
        +      <a href="https://github.com/select2/select2/releases" class="btn btn-outline-inverse btn-lg">
        +        Download Select2
        +      </a>
        +    </p>
        +    <p class="version">
        +      Currently v4.0.3</a>
        +    </p>
        +  </div>
        +</main>
        +
        +{% include notice-previous.html %}
        +
        +<div class="container">
        +  <section id="lead" class="lead">
        +    Select2 gives you a customizable select box with support for searching,
        +    tagging, remote data sets, infinite scrolling, and many other highly used
        +    options.
        +  </section>
        +
        +  <hr class="half-rule">
        +
        +  <div class="s2-docs-featurette">
        +    <div class="row">
        +      <div class="col-sm-4">
        +        <i class="fa fa-language"></i>
        +        <h4>In your language</h4>
        +        <p>
        +          Select2 comes with support for
        +          <a href="examples.html#rtl">RTL environments</a>,
        +          <a href="examples.html#diacritics">searching with diacritics</a> and
        +          <a href="examples.html#language">over 40 languages</a> built-in.
        +        </p>
        +      </div>
        +
        +      <div class="col-sm-4">
        +        <i class="fa fa-database"></i>
        +        <h4>Remote data support</h4>
        +        <p>
        +          <a href="examples.html#data-ajax">Using AJAX</a> you can efficiently
        +          search large lists of items.
        +        </p>
        +      </div>
        +
        +      <div class="col-sm-4">
        +        <i class="fa fa-paint-brush"></i>
        +        <h4>Fits in with your theme</h4>
        +        <p>
        +          Fully skinnable, CSS built with Sass and an
        +          <a href="https://github.com/select2/select2-bootstrap-theme">optional theme for Bootstrap 3</a>.
        +        </p>
        +      </div>
        +    </div>
        +
        +    <div class="row">
        +      <div class="col-sm-4">
        +        <i class="fa fa-plug"></i>
        +        <h4>Fully extensible</h4>
        +        <p>
        +          The <a href="announcements-4.0.html#plugin-system">plugin system</a>
        +          allows you to easily customize Select2 to work exactly how you want it
        +          to.
        +        </p>
        +      </div>
        +
        +      <div class="col-sm-4">
        +        <i class="fa fa-tag"></i>
        +        <h4>Dynamic item creation</h4>
        +        <p>
        +          Allow users to type in a new option and
        +          <a href="examples.html#tags">add it on the fly</a>.
        +        </p>
        +      </div>
        +
        +      <div class="col-sm-4">
        +        <i class="fa fa-html5"></i>
        +        <h4>Full browser support</h4>
        +        <p>Support for both modern and legacy browsers is built-in, even including Internet Explorer 8.</p>
        +      </div>
        +    </div>
        +  </div>
        +
        +  <hr class="half-rule">
        +
        +  <section id="getting-started">
        +    <h2>
        +      Getting started with Select2
        +    </h2>
        +
        +    <p>
        +      In order to use Select2, you must include the JavaScript and CSS file on
        +      your website. You can get these files built for you from many different
        +      locations.
        +    </p>
        +
        +    <h3>
        +      Using Select2 from a CDN
        +    </h3>
        +
        +    <p>
        +      Select2 is hosted on both the
        +      <a href="https://cdnjs.com/libraries/select2">cdnjs</a> and
        +      <a href="https://www.jsdelivr.com/#!select2">jsDelivr</a> CDNs, allowing
        +      you to quickly include Select2 on your website.
        +    </p>
        +
        +    <ol>
        +      <li>
        +        <p>
        +          Include the following lines of code in the <code>&lt;head&gt;</code>
        +          section of your HTML.
        +        </p>
        +
        +{% highlight html %}
        +<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" />
        +<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>
        +{% endhighlight %}
        +
        +        <div class="alert alert-info">
        +          <i class="fa fa-info-circle"></i>
        +          Immediately following a new release, it takes some time for CDNs to
        +          catch up and get the new versions live on the CDN.
        +        </div>
        +      </li>
        +      <li>
        +        <p>
        +          Initialize Select2 on the <code>&lt;select&gt;</code> element that you
        +          want to make awesome.
        +        </p>
        +
        +{% highlight html %}
        +<script type="text/javascript">
        +  $('select').select2();
        +</script>
        +{% endhighlight %}
        +
        +      </li>
        +      <li>
        +        Check out the <a href="examples.html">examples page</a> to start using
        +        the additional features of Select2.
        +      </li>
        +    </ol>
        +
        +    <h3>
        +      Downloading the code locally
        +    </h3>
        +
        +    <p>
        +      In some situations, you can't use Select2 from a CDN and you must include
        +      the files through your own static file servers.
        +    </p>
        +
        +    <ol>
        +      <li>
        +        <p>
        +          <a href="https://github.com/select2/select2/tags">
        +            Download the code
        +          </a>
        +          from GitHub and copy the <code>dist</code> directory to your project.
        +        </p>
        +      </li>
        +      <li>
        +        <p>
        +          Include the following lines of code in the <code>&lt;head&gt;</code>
        +          section of your HTML.
        +        </p>
        +
        +{% highlight html %}
        +<link href="path/to/select2.min.css" rel="stylesheet" />
        +<script src="path/to/select2.min.js"></script>
        +{% endhighlight %}
        +
        +      </li>
        +      <li>
        +        Check out the <a href="examples.html">examples page</a> to start using
        +        the additional features of Select2.
        +      </li>
        +    </ol>
        +  </section>
        +
        +  <section id="builds">
        +    <h2>
        +      The different Select2 builds
        +    </h2>
        +
        +    <p>
        +      Select2 provides multiple builds that are tailored to different
        +      environments where it is going to be used. If you think you need to use
        +      Select2 in a nonstandard environment, like when you are using AMD, you
        +      should read over the list below.
        +    </p>
        +
        +    <table class="table table-bordered table-striped">
        +      <thead>
        +        <tr>
        +          <th>Build name</th>
        +          <th>When you should use it</th>
        +        </tr>
        +      </thead>
        +      <tbody>
        +        <tr id="builds-standard">
        +          <td>
        +            Standard (<code>select2.js</code> / <code>select2.min.js</code>)
        +          </td>
        +          <td>
        +            This is the build that most people should be using for Select2. It
        +            includes the most commonly used features.
        +          </td>
        +        </tr>
        +        <tr id="builds-full">
        +          <td>
        +            Full (<code>select2.full.js</code> / <code>select2.full.min.js</code>)
        +          </td>
        +          <td>
        +            You should only use this build if you need the additional features
        +            from Select2, like the
        +            <a href="options.html#compatibility">compatibility modules</a> or
        +            recommended includes like
        +            <a href="https://github.com/jquery/jquery-mousewheel">jquery.mousewheel</a>
        +          </td>
        +        </tr>
        +      </tbody>
        +    </table>
        +  </section>
        +</div>
        diff --git a/bower_components/select2/docs/options-old.html b/bower_components/select2/docs/options-old.html
        new file mode 100644
        index 0000000000..65690d1852
        --- /dev/null
        +++ b/bower_components/select2/docs/options-old.html
        @@ -0,0 +1,37 @@
        +---
        +layout: default
        +title: Options - Select2
        +slug: options
        +---
        +
        +<section class="jumbotron">
        +  <div class="container">
        +    <h1>
        +      Options
        +    </h1>
        +  </div>
        +</section>
        +
        +<div class="container s2-docs-container">
        +  <div class="row">
        +    <div class="col-md-9" role="main">
        +
        +      {% include options-old/core-options.html %}
        +      {% include options-old/dropdown.html %}
        +      {% include options-old/events.html %}
        +      {% include options-old/adapters.html %}
        +      {% include options-old/setting-default-options.html %}
        +      {% include options-old/backwards-compatibility.html %}
        +
        +    </div>
        +    <div class="col-md-3" role="complementary">
        +
        +      {% include nav/options-old.html %}
        +
        +    </div>
        +  </div>
        +</div>
        +
        +<script type="text/javascript">
        +  prettyPrint();
        +</script>
        diff --git a/bower_components/select2/docs/options.html b/bower_components/select2/docs/options.html
        new file mode 100644
        index 0000000000..5670c1cf10
        --- /dev/null
        +++ b/bower_components/select2/docs/options.html
        @@ -0,0 +1,37 @@
        +---
        +layout: default
        +title: Options - Select2
        +slug: options
        +---
        +
        +<section class="jumbotron">
        +  <div class="container">
        +    <h1>
        +      Options
        +    </h1>
        +    <p class="lead">
        +      Select2 supports a wide variety of options that allow you to customize it to your needs.
        +    </p>
        +  </div>
        +</section>
        +
        +<div class="container s2-docs-container">
        +  <div class="row">
        +    <div class="col-md-9" role="main">
        +      {% include options/introduction.html %}
        +      {% include options/core.html %}
        +      {% include options/data.html %}
        +      {% include options/selections.html %}
        +      {% include options/dropdown.html %}
        +      {% include options/events.html %}
        +      {% include options/compatibility.html %}
        +    </div>
        +    <div class="col-md-3" role="complementary">
        +      {% include nav/options.html %}
        +    </div>
        +  </div>
        +</div>
        +
        +<script type="text/javascript">
        +  prettyPrint();
        +</script>
        diff --git a/public/assets/fonts/FontAwesome.otf b/bower_components/select2/docs/vendor/fonts/FontAwesome.otf
        similarity index 100%
        rename from public/assets/fonts/FontAwesome.otf
        rename to bower_components/select2/docs/vendor/fonts/FontAwesome.otf
        diff --git a/public/assets/fonts/fontawesome-webfont.eot b/bower_components/select2/docs/vendor/fonts/fontawesome-webfont.eot
        similarity index 100%
        rename from public/assets/fonts/fontawesome-webfont.eot
        rename to bower_components/select2/docs/vendor/fonts/fontawesome-webfont.eot
        diff --git a/public/assets/fonts/fontawesome-webfont.svg b/bower_components/select2/docs/vendor/fonts/fontawesome-webfont.svg
        similarity index 100%
        rename from public/assets/fonts/fontawesome-webfont.svg
        rename to bower_components/select2/docs/vendor/fonts/fontawesome-webfont.svg
        diff --git a/public/assets/fonts/fontawesome-webfont.ttf b/bower_components/select2/docs/vendor/fonts/fontawesome-webfont.ttf
        similarity index 100%
        rename from public/assets/fonts/fontawesome-webfont.ttf
        rename to bower_components/select2/docs/vendor/fonts/fontawesome-webfont.ttf
        diff --git a/public/assets/fonts/fontawesome-webfont.woff b/bower_components/select2/docs/vendor/fonts/fontawesome-webfont.woff
        similarity index 100%
        rename from public/assets/fonts/fontawesome-webfont.woff
        rename to bower_components/select2/docs/vendor/fonts/fontawesome-webfont.woff
        diff --git a/public/assets/fonts/fontawesome-webfont.woff2 b/bower_components/select2/docs/vendor/fonts/fontawesome-webfont.woff2
        similarity index 100%
        rename from public/assets/fonts/fontawesome-webfont.woff2
        rename to bower_components/select2/docs/vendor/fonts/fontawesome-webfont.woff2
        diff --git a/bower_components/select2/docs/vendor/images/flags/ak.png b/bower_components/select2/docs/vendor/images/flags/ak.png
        new file mode 100755
        index 0000000000..d79dc4fe4b
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ak.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/al.png b/bower_components/select2/docs/vendor/images/flags/al.png
        new file mode 100755
        index 0000000000..a729794e94
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/al.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ar.png b/bower_components/select2/docs/vendor/images/flags/ar.png
        new file mode 100755
        index 0000000000..6357a8f6f3
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ar.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/az.png b/bower_components/select2/docs/vendor/images/flags/az.png
        new file mode 100755
        index 0000000000..b6d8aaea51
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/az.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ca.png b/bower_components/select2/docs/vendor/images/flags/ca.png
        new file mode 100755
        index 0000000000..9d6d955f39
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ca.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/co.png b/bower_components/select2/docs/vendor/images/flags/co.png
        new file mode 100755
        index 0000000000..888e8308ea
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/co.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ct.png b/bower_components/select2/docs/vendor/images/flags/ct.png
        new file mode 100755
        index 0000000000..a953918ae8
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ct.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/de.png b/bower_components/select2/docs/vendor/images/flags/de.png
        new file mode 100755
        index 0000000000..1bfb3badb3
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/de.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/fl.png b/bower_components/select2/docs/vendor/images/flags/fl.png
        new file mode 100755
        index 0000000000..199a2f16c6
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/fl.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ga.png b/bower_components/select2/docs/vendor/images/flags/ga.png
        new file mode 100755
        index 0000000000..03f52bb855
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ga.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/hi.png b/bower_components/select2/docs/vendor/images/flags/hi.png
        new file mode 100755
        index 0000000000..36de7a583b
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/hi.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ia.png b/bower_components/select2/docs/vendor/images/flags/ia.png
        new file mode 100755
        index 0000000000..c2c4cf0f86
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ia.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/id.png b/bower_components/select2/docs/vendor/images/flags/id.png
        new file mode 100755
        index 0000000000..bfbf897f79
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/id.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/il.png b/bower_components/select2/docs/vendor/images/flags/il.png
        new file mode 100755
        index 0000000000..5c13e67a82
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/il.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/in.png b/bower_components/select2/docs/vendor/images/flags/in.png
        new file mode 100755
        index 0000000000..5952580bec
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/in.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ks.png b/bower_components/select2/docs/vendor/images/flags/ks.png
        new file mode 100755
        index 0000000000..9190b24d20
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ks.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ky.png b/bower_components/select2/docs/vendor/images/flags/ky.png
        new file mode 100755
        index 0000000000..5c8d0cad8e
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ky.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/la.png b/bower_components/select2/docs/vendor/images/flags/la.png
        new file mode 100755
        index 0000000000..3f2c4785ab
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/la.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ma.png b/bower_components/select2/docs/vendor/images/flags/ma.png
        new file mode 100755
        index 0000000000..a50208138d
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ma.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/md.png b/bower_components/select2/docs/vendor/images/flags/md.png
        new file mode 100755
        index 0000000000..1717a26469
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/md.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/me.png b/bower_components/select2/docs/vendor/images/flags/me.png
        new file mode 100755
        index 0000000000..7e696f3e3c
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/me.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/mi.png b/bower_components/select2/docs/vendor/images/flags/mi.png
        new file mode 100755
        index 0000000000..49494fcf85
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/mi.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/mn.png b/bower_components/select2/docs/vendor/images/flags/mn.png
        new file mode 100755
        index 0000000000..602f36b3d5
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/mn.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/mo.png b/bower_components/select2/docs/vendor/images/flags/mo.png
        new file mode 100755
        index 0000000000..413ea1a663
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/mo.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ms.png b/bower_components/select2/docs/vendor/images/flags/ms.png
        new file mode 100755
        index 0000000000..d3e4a1cd3e
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ms.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/mt.png b/bower_components/select2/docs/vendor/images/flags/mt.png
        new file mode 100755
        index 0000000000..6822acb90e
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/mt.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/nc.png b/bower_components/select2/docs/vendor/images/flags/nc.png
        new file mode 100755
        index 0000000000..9555820d8f
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/nc.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/nd.png b/bower_components/select2/docs/vendor/images/flags/nd.png
        new file mode 100755
        index 0000000000..87e401cf7c
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/nd.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ne.png b/bower_components/select2/docs/vendor/images/flags/ne.png
        new file mode 100755
        index 0000000000..a69e15fc93
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ne.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/nh.png b/bower_components/select2/docs/vendor/images/flags/nh.png
        new file mode 100755
        index 0000000000..d6ad1cb689
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/nh.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/nj.png b/bower_components/select2/docs/vendor/images/flags/nj.png
        new file mode 100755
        index 0000000000..f2c646603b
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/nj.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/nm.png b/bower_components/select2/docs/vendor/images/flags/nm.png
        new file mode 100755
        index 0000000000..c273181124
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/nm.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/nv.png b/bower_components/select2/docs/vendor/images/flags/nv.png
        new file mode 100755
        index 0000000000..8f1a855d3c
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/nv.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ny.png b/bower_components/select2/docs/vendor/images/flags/ny.png
        new file mode 100755
        index 0000000000..794b86e3c4
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ny.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/oh.png b/bower_components/select2/docs/vendor/images/flags/oh.png
        new file mode 100755
        index 0000000000..08601a6d6c
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/oh.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ok.png b/bower_components/select2/docs/vendor/images/flags/ok.png
        new file mode 100755
        index 0000000000..543be9133c
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ok.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/or.png b/bower_components/select2/docs/vendor/images/flags/or.png
        new file mode 100755
        index 0000000000..846b4a699a
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/or.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/pa.png b/bower_components/select2/docs/vendor/images/flags/pa.png
        new file mode 100755
        index 0000000000..55f6c0ff4e
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/pa.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ri.png b/bower_components/select2/docs/vendor/images/flags/ri.png
        new file mode 100755
        index 0000000000..5cece5db10
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ri.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/sc.png b/bower_components/select2/docs/vendor/images/flags/sc.png
        new file mode 100755
        index 0000000000..9e393039ce
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/sc.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/sd.png b/bower_components/select2/docs/vendor/images/flags/sd.png
        new file mode 100755
        index 0000000000..154618f4ce
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/sd.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/tn.png b/bower_components/select2/docs/vendor/images/flags/tn.png
        new file mode 100755
        index 0000000000..321b48cbb6
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/tn.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/tx.png b/bower_components/select2/docs/vendor/images/flags/tx.png
        new file mode 100755
        index 0000000000..0914b319ea
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/tx.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/ut.png b/bower_components/select2/docs/vendor/images/flags/ut.png
        new file mode 100755
        index 0000000000..7a01ae6339
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/ut.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/va.png b/bower_components/select2/docs/vendor/images/flags/va.png
        new file mode 100755
        index 0000000000..ce58c0158d
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/va.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/vt.png b/bower_components/select2/docs/vendor/images/flags/vt.png
        new file mode 100755
        index 0000000000..fe1b19fe2e
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/vt.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/wa.png b/bower_components/select2/docs/vendor/images/flags/wa.png
        new file mode 100755
        index 0000000000..0c0d8f0fc9
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/wa.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/wi.png b/bower_components/select2/docs/vendor/images/flags/wi.png
        new file mode 100755
        index 0000000000..2569f176c3
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/wi.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/wv.png b/bower_components/select2/docs/vendor/images/flags/wv.png
        new file mode 100755
        index 0000000000..b40389966c
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/wv.png differ
        diff --git a/bower_components/select2/docs/vendor/images/flags/wy.png b/bower_components/select2/docs/vendor/images/flags/wy.png
        new file mode 100755
        index 0000000000..82a453cc3a
        Binary files /dev/null and b/bower_components/select2/docs/vendor/images/flags/wy.png differ
        diff --git a/bower_components/select2/docs/vendor/js/anchor.min.js b/bower_components/select2/docs/vendor/js/anchor.min.js
        new file mode 100755
        index 0000000000..68c3cb7073
        --- /dev/null
        +++ b/bower_components/select2/docs/vendor/js/anchor.min.js
        @@ -0,0 +1,6 @@
        +/*!
        + * AnchorJS - v1.1.1 - 2015-05-23
        + * https://github.com/bryanbraun/anchorjs
        + * Copyright (c) 2015 Bryan Braun; Licensed MIT
        + */
        +function AnchorJS(A){"use strict";this.options=A||{},this._applyRemainingDefaultOptions=function(A){this.options.icon=this.options.hasOwnProperty("icon")?A.icon:"&#xe9cb",this.options.visible=this.options.hasOwnProperty("visible")?A.visible:"hover",this.options.placement=this.options.hasOwnProperty("placement")?A.placement:"right",this.options.class=this.options.hasOwnProperty("class")?A.class:""},this._applyRemainingDefaultOptions(A),this.add=function(A){var e,t,o,n,i,s,a,l,c,r,h,g,B,Q;if(this._applyRemainingDefaultOptions(this.options),A){if("string"!=typeof A)throw new Error("The selector provided to AnchorJS was invalid.")}else A="h1, h2, h3, h4, h5, h6";if(e=document.querySelectorAll(A),0===e.length)return!1;for(this._addBaselineStyles(),t=document.querySelectorAll("[id]"),o=[].map.call(t,function(A){return A.id}),i=0;i<e.length;i++){if(e[i].hasAttribute("id"))n=e[i].getAttribute("id");else{s=e[i].textContent,a=s.replace(/[^\w\s-]/gi,"").replace(/\s+/g,"-").replace(/-{2,}/g,"-").substring(0,64).replace(/^-+|-+$/gm,"").toLowerCase(),r=a,c=0;do void 0!==l&&(r=a+"-"+c),l=o.indexOf(r),c+=1;while(-1!==l);l=void 0,o.push(r),e[i].setAttribute("id",r),n=r}h=n.replace(/-/g," "),g='<a class="anchorjs-link '+this.options.class+'" href="#'+n+'" aria-label="Anchor link for: '+h+'" data-anchorjs-icon="'+this.options.icon+'"></a>',B=document.createElement("div"),B.innerHTML=g,Q=B.childNodes,"always"===this.options.visible&&(Q[0].style.opacity="1"),"&#xe9cb"===this.options.icon&&(Q[0].style.fontFamily="anchorjs-icons",Q[0].style.fontStyle="normal",Q[0].style.fontVariant="normal",Q[0].style.fontWeight="normal"),"left"===this.options.placement?(Q[0].style.position="absolute",Q[0].style.marginLeft="-1em",Q[0].style.paddingRight="0.5em",e[i].insertBefore(Q[0],e[i].firstChild)):(Q[0].style.paddingLeft="0.375em",e[i].appendChild(Q[0]))}return this},this.remove=function(A){for(var e,t=document.querySelectorAll(A),o=0;o<t.length;o++)e=t[o].querySelector(".anchorjs-link"),e&&t[o].removeChild(e);return this},this._addBaselineStyles=function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style"),t=" .anchorjs-link {   opacity: 0;   text-decoration: none;   -webkit-font-smoothing: antialiased;   -moz-osx-font-smoothing: grayscale; }",o=" *:hover > .anchorjs-link, .anchorjs-link:focus  {   opacity: 1; }",n=' @font-face {   font-family: "anchorjs-icons";   font-style: normal;   font-weight: normal;   src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',i=" [data-anchorjs-icon]::after {   content: attr(data-anchorjs-icon); }";e.className="anchorjs",e.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(t,e.sheet.cssRules.length),e.sheet.insertRule(o,e.sheet.cssRules.length),e.sheet.insertRule(i,e.sheet.cssRules.length),e.sheet.insertRule(n,e.sheet.cssRules.length)}}}var anchors=new AnchorJS;
        diff --git a/bower_components/select2/docs/vendor/js/bootstrap.min.js b/bower_components/select2/docs/vendor/js/bootstrap.min.js
        new file mode 100644
        index 0000000000..7c1561a8b9
        --- /dev/null
        +++ b/bower_components/select2/docs/vendor/js/bootstrap.min.js
        @@ -0,0 +1,6 @@
        +/*!
        + * Bootstrap v3.2.0 (http://getbootstrap.com)
        + * Copyright 2011-2014 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + */
        +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript 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]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",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(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().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("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),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.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.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},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));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]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.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]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.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?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.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 e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.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)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);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":"focusin",i="hover"==g?"mouseleave":"focusout";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()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.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},c.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},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.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").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.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)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(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]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[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).parentsUntil(this.options.target,".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 d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.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.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.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("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).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(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.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(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/vendor/js/jquery.min.js b/bower_components/select2/docs/vendor/js/jquery.min.js
        new file mode 100644
        index 0000000000..e6a051d0d1
        --- /dev/null
        +++ b/bower_components/select2/docs/vendor/js/jquery.min.js
        @@ -0,0 +1,4 @@
        +/*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
        +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=mb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=nb(b);function qb(){}qb.prototype=d.filters=d.pseudos,d.setFilters=new qb,g=gb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?gb.error(a):z(a,i).slice(0)};function rb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
        +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)
        +}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
        diff --git a/bower_components/select2/docs/vendor/js/placeholders.jquery.min.js b/bower_components/select2/docs/vendor/js/placeholders.jquery.min.js
        new file mode 100644
        index 0000000000..02845bf5c9
        --- /dev/null
        +++ b/bower_components/select2/docs/vendor/js/placeholders.jquery.min.js
        @@ -0,0 +1,2 @@
        +/* Placeholders.js v3.0.2 */
        +(function(t){"use strict";function e(t,e,r){return t.addEventListener?t.addEventListener(e,r,!1):t.attachEvent?t.attachEvent("on"+e,r):void 0}function r(t,e){var r,n;for(r=0,n=t.length;n>r;r++)if(t[r]===e)return!0;return!1}function n(t,e){var r;t.createTextRange?(r=t.createTextRange(),r.move("character",e),r.select()):t.selectionStart&&(t.focus(),t.setSelectionRange(e,e))}function a(t,e){try{return t.type=e,!0}catch(r){return!1}}t.Placeholders={Utils:{addEventListener:e,inArray:r,moveCaret:n,changeType:a}}})(this),function(t){"use strict";function e(){}function r(){try{return document.activeElement}catch(t){}}function n(t,e){var r,n,a=!!e&&t.value!==e,u=t.value===t.getAttribute(V);return(a||u)&&"true"===t.getAttribute(P)?(t.removeAttribute(P),t.value=t.value.replace(t.getAttribute(V),""),t.className=t.className.replace(R,""),n=t.getAttribute(z),parseInt(n,10)>=0&&(t.setAttribute("maxLength",n),t.removeAttribute(z)),r=t.getAttribute(D),r&&(t.type=r),!0):!1}function a(t){var e,r,n=t.getAttribute(V);return""===t.value&&n?(t.setAttribute(P,"true"),t.value=n,t.className+=" "+I,r=t.getAttribute(z),r||(t.setAttribute(z,t.maxLength),t.removeAttribute("maxLength")),e=t.getAttribute(D),e?t.type="text":"password"===t.type&&K.changeType(t,"text")&&t.setAttribute(D,"password"),!0):!1}function u(t,e){var r,n,a,u,i,l,o;if(t&&t.getAttribute(V))e(t);else for(a=t?t.getElementsByTagName("input"):f,u=t?t.getElementsByTagName("textarea"):h,r=a?a.length:0,n=u?u.length:0,o=0,l=r+n;l>o;o++)i=r>o?a[o]:u[o-r],e(i)}function i(t){u(t,n)}function l(t){u(t,a)}function o(t){return function(){b&&t.value===t.getAttribute(V)&&"true"===t.getAttribute(P)?K.moveCaret(t,0):n(t)}}function c(t){return function(){a(t)}}function s(t){return function(e){return A=t.value,"true"===t.getAttribute(P)&&A===t.getAttribute(V)&&K.inArray(C,e.keyCode)?(e.preventDefault&&e.preventDefault(),!1):void 0}}function d(t){return function(){n(t,A),""===t.value&&(t.blur(),K.moveCaret(t,0))}}function v(t){return function(){t===r()&&t.value===t.getAttribute(V)&&"true"===t.getAttribute(P)&&K.moveCaret(t,0)}}function g(t){return function(){i(t)}}function p(t){t.form&&(T=t.form,"string"==typeof T&&(T=document.getElementById(T)),T.getAttribute(U)||(K.addEventListener(T,"submit",g(T)),T.setAttribute(U,"true"))),K.addEventListener(t,"focus",o(t)),K.addEventListener(t,"blur",c(t)),b&&(K.addEventListener(t,"keydown",s(t)),K.addEventListener(t,"keyup",d(t)),K.addEventListener(t,"click",v(t))),t.setAttribute(j,"true"),t.setAttribute(V,x),(b||t!==r())&&a(t)}var f,h,b,m,A,y,E,x,L,T,S,N,w,B=["text","search","url","tel","email","password","number","textarea"],C=[27,33,34,35,36,37,38,39,40,8,46],k="#ccc",I="placeholdersjs",R=RegExp("(?:^|\\s)"+I+"(?!\\S)"),V="data-placeholder-value",P="data-placeholder-active",D="data-placeholder-type",U="data-placeholder-submit",j="data-placeholder-bound",q="data-placeholder-focus",Q="data-placeholder-live",z="data-placeholder-maxlength",F=document.createElement("input"),G=document.getElementsByTagName("head")[0],H=document.documentElement,J=t.Placeholders,K=J.Utils;if(J.nativeSupport=void 0!==F.placeholder,!J.nativeSupport){for(f=document.getElementsByTagName("input"),h=document.getElementsByTagName("textarea"),b="false"===H.getAttribute(q),m="false"!==H.getAttribute(Q),y=document.createElement("style"),y.type="text/css",E=document.createTextNode("."+I+" { color:"+k+"; }"),y.styleSheet?y.styleSheet.cssText=E.nodeValue:y.appendChild(E),G.insertBefore(y,G.firstChild),w=0,N=f.length+h.length;N>w;w++)S=f.length>w?f[w]:h[w-f.length],x=S.attributes.placeholder,x&&(x=x.nodeValue,x&&K.inArray(B,S.type)&&p(S));L=setInterval(function(){for(w=0,N=f.length+h.length;N>w;w++)S=f.length>w?f[w]:h[w-f.length],x=S.attributes.placeholder,x?(x=x.nodeValue,x&&K.inArray(B,S.type)&&(S.getAttribute(j)||p(S),(x!==S.getAttribute(V)||"password"===S.type&&!S.getAttribute(D))&&("password"===S.type&&!S.getAttribute(D)&&K.changeType(S,"text")&&S.setAttribute(D,"password"),S.value===S.getAttribute(V)&&(S.value=x),S.setAttribute(V,x)))):S.getAttribute(P)&&(n(S),S.removeAttribute(V));m||clearInterval(L)},100)}K.addEventListener(t,"beforeunload",function(){J.disable()}),J.disable=J.nativeSupport?e:i,J.enable=J.nativeSupport?e:l}(this),function(t){"use strict";var e=t.fn.val,r=t.fn.prop;Placeholders.nativeSupport||(t.fn.val=function(t){var r=e.apply(this,arguments),n=this.eq(0).data("placeholder-value");return void 0===t&&this.eq(0).data("placeholder-active")&&r===n?"":r},t.fn.prop=function(t,e){return void 0===e&&this.eq(0).data("placeholder-active")&&"value"===t?"":r.apply(this,arguments)})}(jQuery);
        \ No newline at end of file
        diff --git a/bower_components/select2/docs/vendor/js/prettify.min.js b/bower_components/select2/docs/vendor/js/prettify.min.js
        new file mode 100644
        index 0000000000..f66f6f2352
        --- /dev/null
        +++ b/bower_components/select2/docs/vendor/js/prettify.min.js
        @@ -0,0 +1,28 @@
        +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
        +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
        +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
        +f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
        +(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
        +{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
        +t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
        +"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
        +l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
        +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
        +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
        +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
        +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
        +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
        +m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
        +a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
        +j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
        +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
        +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
        +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
        +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
        +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
        +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
        +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
        +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
        +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
        +250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
        +PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
        \ No newline at end of file
        diff --git a/bower_components/select2/package.json b/bower_components/select2/package.json
        new file mode 100644
        index 0000000000..3eda0e8a73
        --- /dev/null
        +++ b/bower_components/select2/package.json
        @@ -0,0 +1,66 @@
        +{
        +  "name": "select2",
        +  "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
        +  "homepage": "https://select2.github.io",
        +  "author": {
        +    "name": "Kevin Brown",
        +    "url": "https://github.com/kevin-brown"
        +  },
        +  "contributors": [
        +    {
        +      "name": "Igor Vaynberg",
        +      "url": "https://github.com/ivaynberg"
        +    }
        +  ],
        +  "repository": {
        +    "type": "git",
        +    "url": "git://github.com/select2/select2.git"
        +  },
        +  "bugs": {
        +    "url": "https://github.com/select2/select2/issues"
        +  },
        +  "keywords": [
        +    "select",
        +    "autocomplete",
        +    "typeahead",
        +    "dropdown",
        +    "multiselect",
        +    "tag",
        +    "tagging"
        +  ],
        +  "license": "MIT",
        +  "main": "dist/js/select2.js",
        +  "files": [
        +    "src",
        +    "dist"
        +  ],
        +  "version": "4.0.3",
        +  "jspm": {
        +    "main": "js/select2",
        +    "directories": {
        +      "lib": "dist"
        +    }
        +  },
        +  "devDependencies": {
        +    "grunt": "^0.4.5",
        +    "grunt-cli": "^0.1.13",
        +    "grunt-contrib-clean": "^0.6.0",
        +    "grunt-contrib-concat": "^0.4.0",
        +    "grunt-contrib-connect": "^0.9.0",
        +    "grunt-contrib-jshint": "^0.10.0",
        +    "grunt-contrib-nodeunit": "~0.3.3",
        +    "grunt-contrib-qunit": "~0.4.0",
        +    "grunt-contrib-requirejs": "^0.4.4",
        +    "grunt-contrib-symlink": "^0.3.0",
        +    "grunt-contrib-uglify": "~0.4.0",
        +    "grunt-contrib-watch": "~0.6.0",
        +    "grunt-gh-pages": "^0.9.1",
        +    "grunt-jekyll": "^0.4.2",
        +    "grunt-sass": "^1.0.0",
        +    "grunt-saucelabs": "^8.6.0"
        +  },
        +  "dependencies": {
        +    "almond": "~0.3.1",
        +    "jquery-mousewheel": "~3.1.13"
        +  }
        +}
        diff --git a/bower_components/select2/select2.jquery.json b/bower_components/select2/select2.jquery.json
        new file mode 100644
        index 0000000000..e2df6ef15a
        --- /dev/null
        +++ b/bower_components/select2/select2.jquery.json
        @@ -0,0 +1,32 @@
        +{
        +    "name": "select2",
        +    "title": "Select2",
        +    "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
        +    "keywords": [
        +        "select",
        +        "autocomplete",
        +        "typeahead",
        +        "dropdown",
        +        "multiselect",
        +        "tag",
        +        "tagging"
        +    ],
        +    "version": "4.0.3",
        +    "author": {
        +        "name": "Kevin Brown",
        +        "url": "https://github.com/kevin-brown"
        +    },
        +    "licenses": [
        +        {
        +            "type": "MIT",
        +            "url": "http://opensource.org/licenses/MIT"
        +        }
        +    ],
        +    "bugs": "https://github.com/select2/select2/issues",
        +    "homepage": "https://select2.github.io",
        +    "docs": "https://select2.github.io",
        +    "download": "https://github.com/select2/select2/releases",
        +    "dependencies": {
        +        "jquery": ">=1.7.2"
        +    }
        +}
        diff --git a/bower_components/select2/src/js/banner.end.js b/bower_components/select2/src/js/banner.end.js
        new file mode 100644
        index 0000000000..ea00a0365e
        --- /dev/null
        +++ b/bower_components/select2/src/js/banner.end.js
        @@ -0,0 +1,6 @@
        +  // Return the AMD loader configuration so it can be used outside of this file
        +  return {
        +    define: S2.define,
        +    require: S2.require
        +  };
        +}());
        diff --git a/bower_components/select2/src/js/banner.start.js b/bower_components/select2/src/js/banner.start.js
        new file mode 100644
        index 0000000000..78fe8b0212
        --- /dev/null
        +++ b/bower_components/select2/src/js/banner.start.js
        @@ -0,0 +1,6 @@
        +(function () {
        +  // Restore the Select2 AMD loader so it can be used
        +  // Needed mostly in the language files, where the loader is not inserted
        +  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
        +    var S2 = jQuery.fn.select2.amd;
        +  }
        diff --git a/bower_components/select2/src/js/jquery.mousewheel.shim.js b/bower_components/select2/src/js/jquery.mousewheel.shim.js
        new file mode 100644
        index 0000000000..a27fda0e65
        --- /dev/null
        +++ b/bower_components/select2/src/js/jquery.mousewheel.shim.js
        @@ -0,0 +1,6 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  // Used to shim jQuery.mousewheel for non-full builds.
        +  return $;
        +});
        diff --git a/bower_components/select2/src/js/jquery.select2.js b/bower_components/select2/src/js/jquery.select2.js
        new file mode 100644
        index 0000000000..a3f8eff412
        --- /dev/null
        +++ b/bower_components/select2/src/js/jquery.select2.js
        @@ -0,0 +1,57 @@
        +define([
        +  'jquery',
        +  'jquery-mousewheel',
        +
        +  './select2/core',
        +  './select2/defaults'
        +], function ($, _, Select2, Defaults) {
        +  if ($.fn.select2 == null) {
        +    // All methods that should return the element
        +    var thisMethods = ['open', 'close', 'destroy'];
        +
        +    $.fn.select2 = function (options) {
        +      options = options || {};
        +
        +      if (typeof options === 'object') {
        +        this.each(function () {
        +          var instanceOptions = $.extend(true, {}, options);
        +
        +          var instance = new Select2($(this), instanceOptions);
        +        });
        +
        +        return this;
        +      } else if (typeof options === 'string') {
        +        var ret;
        +        var args = Array.prototype.slice.call(arguments, 1);
        +
        +        this.each(function () {
        +          var instance = $(this).data('select2');
        +
        +          if (instance == null && window.console && console.error) {
        +            console.error(
        +              'The select2(\'' + options + '\') method was called on an ' +
        +              'element that is not using Select2.'
        +            );
        +          }
        +
        +          ret = instance[options].apply(instance, args);
        +        });
        +
        +        // Check if we should be returning `this`
        +        if ($.inArray(options, thisMethods) > -1) {
        +          return this;
        +        }
        +
        +        return ret;
        +      } else {
        +        throw new Error('Invalid arguments for Select2: ' + options);
        +      }
        +    };
        +  }
        +
        +  if ($.fn.select2.defaults == null) {
        +    $.fn.select2.defaults = Defaults;
        +  }
        +
        +  return Select2;
        +});
        diff --git a/bower_components/select2/src/js/jquery.shim.js b/bower_components/select2/src/js/jquery.shim.js
        new file mode 100644
        index 0000000000..880993af1a
        --- /dev/null
        +++ b/bower_components/select2/src/js/jquery.shim.js
        @@ -0,0 +1,14 @@
        +/* global jQuery:false, $:false */
        +define(function () {
        +  var _$ = jQuery || $;
        +
        +  if (_$ == null && console && console.error) {
        +    console.error(
        +      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
        +      'found. Make sure that you are including jQuery before Select2 on your ' +
        +      'web page.'
        +    );
        +  }
        +
        +  return _$;
        +});
        diff --git a/bower_components/select2/src/js/select2/compat/containerCss.js b/bower_components/select2/src/js/select2/compat/containerCss.js
        new file mode 100644
        index 0000000000..45703ac8d0
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/compat/containerCss.js
        @@ -0,0 +1,56 @@
        +define([
        +  'jquery',
        +  './utils'
        +], function ($, CompatUtils) {
        +  // No-op CSS adapter that discards all classes by default
        +  function _containerAdapter (clazz) {
        +    return null;
        +  }
        +
        +  function ContainerCSS () { }
        +
        +  ContainerCSS.prototype.render = function (decorated) {
        +    var $container = decorated.call(this);
        +
        +    var containerCssClass = this.options.get('containerCssClass') || '';
        +
        +    if ($.isFunction(containerCssClass)) {
        +      containerCssClass = containerCssClass(this.$element);
        +    }
        +
        +    var containerCssAdapter = this.options.get('adaptContainerCssClass');
        +    containerCssAdapter = containerCssAdapter || _containerAdapter;
        +
        +    if (containerCssClass.indexOf(':all:') !== -1) {
        +      containerCssClass = containerCssClass.replace(':all:', '');
        +
        +      var _cssAdapter = containerCssAdapter;
        +
        +      containerCssAdapter = function (clazz) {
        +        var adapted = _cssAdapter(clazz);
        +
        +        if (adapted != null) {
        +          // Append the old one along with the adapted one
        +          return adapted + ' ' + clazz;
        +        }
        +
        +        return clazz;
        +      };
        +    }
        +
        +    var containerCss = this.options.get('containerCss') || {};
        +
        +    if ($.isFunction(containerCss)) {
        +      containerCss = containerCss(this.$element);
        +    }
        +
        +    CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);
        +
        +    $container.css(containerCss);
        +    $container.addClass(containerCssClass);
        +
        +    return $container;
        +  };
        +
        +  return ContainerCSS;
        +});
        diff --git a/bower_components/select2/src/js/select2/compat/dropdownCss.js b/bower_components/select2/src/js/select2/compat/dropdownCss.js
        new file mode 100644
        index 0000000000..02f558200e
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/compat/dropdownCss.js
        @@ -0,0 +1,56 @@
        +define([
        +  'jquery',
        +  './utils'
        +], function ($, CompatUtils) {
        +  // No-op CSS adapter that discards all classes by default
        +  function _dropdownAdapter (clazz) {
        +    return null;
        +  }
        +
        +  function DropdownCSS () { }
        +
        +  DropdownCSS.prototype.render = function (decorated) {
        +    var $dropdown = decorated.call(this);
        +
        +    var dropdownCssClass = this.options.get('dropdownCssClass') || '';
        +
        +    if ($.isFunction(dropdownCssClass)) {
        +      dropdownCssClass = dropdownCssClass(this.$element);
        +    }
        +
        +    var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');
        +    dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;
        +
        +    if (dropdownCssClass.indexOf(':all:') !== -1) {
        +      dropdownCssClass = dropdownCssClass.replace(':all:', '');
        +
        +      var _cssAdapter = dropdownCssAdapter;
        +
        +      dropdownCssAdapter = function (clazz) {
        +        var adapted = _cssAdapter(clazz);
        +
        +        if (adapted != null) {
        +          // Append the old one along with the adapted one
        +          return adapted + ' ' + clazz;
        +        }
        +
        +        return clazz;
        +      };
        +    }
        +
        +    var dropdownCss = this.options.get('dropdownCss') || {};
        +
        +    if ($.isFunction(dropdownCss)) {
        +      dropdownCss = dropdownCss(this.$element);
        +    }
        +
        +    CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);
        +
        +    $dropdown.css(dropdownCss);
        +    $dropdown.addClass(dropdownCssClass);
        +
        +    return $dropdown;
        +  };
        +
        +  return DropdownCSS;
        +});
        diff --git a/bower_components/select2/src/js/select2/compat/initSelection.js b/bower_components/select2/src/js/select2/compat/initSelection.js
        new file mode 100644
        index 0000000000..71ee29d1ec
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/compat/initSelection.js
        @@ -0,0 +1,42 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function InitSelection (decorated, $element, options) {
        +    if (options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `initSelection` option has been deprecated in favor' +
        +        ' of a custom data adapter that overrides the `current` method. ' +
        +        'This method is now called multiple times instead of a single ' +
        +        'time when the instance is initialized. Support will be removed ' +
        +        'for the `initSelection` option in future versions of Select2'
        +      );
        +    }
        +
        +    this.initSelection = options.get('initSelection');
        +    this._isInitialized = false;
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  InitSelection.prototype.current = function (decorated, callback) {
        +    var self = this;
        +
        +    if (this._isInitialized) {
        +      decorated.call(this, callback);
        +
        +      return;
        +    }
        +
        +    this.initSelection.call(null, this.$element, function (data) {
        +      self._isInitialized = true;
        +
        +      if (!$.isArray(data)) {
        +        data = [data];
        +      }
        +
        +      callback(data);
        +    });
        +  };
        +
        +  return InitSelection;
        +});
        diff --git a/bower_components/select2/src/js/select2/compat/inputData.js b/bower_components/select2/src/js/select2/compat/inputData.js
        new file mode 100644
        index 0000000000..a338bf1eea
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/compat/inputData.js
        @@ -0,0 +1,127 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function InputData (decorated, $element, options) {
        +    this._currentData = [];
        +    this._valueSeparator = options.get('valueSeparator') || ',';
        +
        +    if ($element.prop('type') === 'hidden') {
        +      if (options.get('debug') && console && console.warn) {
        +        console.warn(
        +          'Select2: Using a hidden input with Select2 is no longer ' +
        +          'supported and may stop working in the future. It is recommended ' +
        +          'to use a `<select>` element instead.'
        +        );
        +      }
        +    }
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  InputData.prototype.current = function (_, callback) {
        +    function getSelected (data, selectedIds) {
        +      var selected = [];
        +
        +      if (data.selected || $.inArray(data.id, selectedIds) !== -1) {
        +        data.selected = true;
        +        selected.push(data);
        +      } else {
        +        data.selected = false;
        +      }
        +
        +      if (data.children) {
        +        selected.push.apply(selected, getSelected(data.children, selectedIds));
        +      }
        +
        +      return selected;
        +    }
        +
        +    var selected = [];
        +
        +    for (var d = 0; d < this._currentData.length; d++) {
        +      var data = this._currentData[d];
        +
        +      selected.push.apply(
        +        selected,
        +        getSelected(
        +          data,
        +          this.$element.val().split(
        +            this._valueSeparator
        +          )
        +        )
        +      );
        +    }
        +
        +    callback(selected);
        +  };
        +
        +  InputData.prototype.select = function (_, data) {
        +    if (!this.options.get('multiple')) {
        +      this.current(function (allData) {
        +        $.map(allData, function (data) {
        +          data.selected = false;
        +        });
        +      });
        +
        +      this.$element.val(data.id);
        +      this.$element.trigger('change');
        +    } else {
        +      var value = this.$element.val();
        +      value += this._valueSeparator + data.id;
        +
        +      this.$element.val(value);
        +      this.$element.trigger('change');
        +    }
        +  };
        +
        +  InputData.prototype.unselect = function (_, data) {
        +    var self = this;
        +
        +    data.selected = false;
        +
        +    this.current(function (allData) {
        +      var values = [];
        +
        +      for (var d = 0; d < allData.length; d++) {
        +        var item = allData[d];
        +
        +        if (data.id == item.id) {
        +          continue;
        +        }
        +
        +        values.push(item.id);
        +      }
        +
        +      self.$element.val(values.join(self._valueSeparator));
        +      self.$element.trigger('change');
        +    });
        +  };
        +
        +  InputData.prototype.query = function (_, params, callback) {
        +    var results = [];
        +
        +    for (var d = 0; d < this._currentData.length; d++) {
        +      var data = this._currentData[d];
        +
        +      var matches = this.matches(params, data);
        +
        +      if (matches !== null) {
        +        results.push(matches);
        +      }
        +    }
        +
        +    callback({
        +      results: results
        +    });
        +  };
        +
        +  InputData.prototype.addOptions = function (_, $options) {
        +    var options = $.map($options, function ($option) {
        +      return $.data($option[0], 'data');
        +    });
        +
        +    this._currentData.push.apply(this._currentData, options);
        +  };
        +
        +  return InputData;
        +});
        diff --git a/bower_components/select2/src/js/select2/compat/matcher.js b/bower_components/select2/src/js/select2/compat/matcher.js
        new file mode 100644
        index 0000000000..a975fdddad
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/compat/matcher.js
        @@ -0,0 +1,42 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function oldMatcher (matcher) {
        +    function wrappedMatcher (params, data) {
        +      var match = $.extend(true, {}, data);
        +
        +      if (params.term == null || $.trim(params.term) === '') {
        +        return match;
        +      }
        +
        +      if (data.children) {
        +        for (var c = data.children.length - 1; c >= 0; c--) {
        +          var child = data.children[c];
        +
        +          // Check if the child object matches
        +          // The old matcher returned a boolean true or false
        +          var doesMatch = matcher(params.term, child.text, child);
        +
        +          // If the child didn't match, pop it off
        +          if (!doesMatch) {
        +            match.children.splice(c, 1);
        +          }
        +        }
        +
        +        if (match.children.length > 0) {
        +          return match;
        +        }
        +      }
        +
        +      if (matcher(params.term, data.text, data)) {
        +        return match;
        +      }
        +
        +      return null;
        +    }
        +
        +    return wrappedMatcher;
        +  }
        +
        +  return oldMatcher;
        +});
        diff --git a/bower_components/select2/src/js/select2/compat/query.js b/bower_components/select2/src/js/select2/compat/query.js
        new file mode 100644
        index 0000000000..f2884a7aa2
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/compat/query.js
        @@ -0,0 +1,26 @@
        +define([
        +
        +], function () {
        +  function Query (decorated, $element, options) {
        +    if (options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `query` option has been deprecated in favor of a ' +
        +        'custom data adapter that overrides the `query` method. Support ' +
        +        'will be removed for the `query` option in future versions of ' +
        +        'Select2.'
        +      );
        +    }
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Query.prototype.query = function (_, params, callback) {
        +    params.callback = callback;
        +
        +    var query = this.options.get('query');
        +
        +    query.call(null, params);
        +  };
        +
        +  return Query;
        +});
        diff --git a/bower_components/select2/src/js/select2/compat/utils.js b/bower_components/select2/src/js/select2/compat/utils.js
        new file mode 100644
        index 0000000000..5a3ea1c6e7
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/compat/utils.js
        @@ -0,0 +1,43 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function syncCssClasses ($dest, $src, adapter) {
        +    var classes, replacements = [], adapted;
        +
        +    classes = $.trim($dest.attr('class'));
        +
        +    if (classes) {
        +      classes = '' + classes; // for IE which returns object
        +
        +      $(classes.split(/\s+/)).each(function () {
        +        // Save all Select2 classes
        +        if (this.indexOf('select2-') === 0) {
        +          replacements.push(this);
        +        }
        +      });
        +    }
        +
        +    classes = $.trim($src.attr('class'));
        +
        +    if (classes) {
        +      classes = '' + classes; // for IE which returns object
        +
        +      $(classes.split(/\s+/)).each(function () {
        +        // Only adapt non-Select2 classes
        +        if (this.indexOf('select2-') !== 0) {
        +          adapted = adapter(this);
        +
        +          if (adapted != null) {
        +            replacements.push(adapted);
        +          }
        +        }
        +      });
        +    }
        +
        +    $dest.attr('class', replacements.join(' '));
        +  }
        +
        +  return {
        +    syncCssClasses: syncCssClasses
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/core.js b/bower_components/select2/src/js/select2/core.js
        new file mode 100644
        index 0000000000..4ba06edb3e
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/core.js
        @@ -0,0 +1,612 @@
        +define([
        +  'jquery',
        +  './options',
        +  './utils',
        +  './keys'
        +], function ($, Options, Utils, KEYS) {
        +  var Select2 = function ($element, options) {
        +    if ($element.data('select2') != null) {
        +      $element.data('select2').destroy();
        +    }
        +
        +    this.$element = $element;
        +
        +    this.id = this._generateId($element);
        +
        +    options = options || {};
        +
        +    this.options = new Options(options, $element);
        +
        +    Select2.__super__.constructor.call(this);
        +
        +    // Set up the tabindex
        +
        +    var tabindex = $element.attr('tabindex') || 0;
        +    $element.data('old-tabindex', tabindex);
        +    $element.attr('tabindex', '-1');
        +
        +    // Set up containers and adapters
        +
        +    var DataAdapter = this.options.get('dataAdapter');
        +    this.dataAdapter = new DataAdapter($element, this.options);
        +
        +    var $container = this.render();
        +
        +    this._placeContainer($container);
        +
        +    var SelectionAdapter = this.options.get('selectionAdapter');
        +    this.selection = new SelectionAdapter($element, this.options);
        +    this.$selection = this.selection.render();
        +
        +    this.selection.position(this.$selection, $container);
        +
        +    var DropdownAdapter = this.options.get('dropdownAdapter');
        +    this.dropdown = new DropdownAdapter($element, this.options);
        +    this.$dropdown = this.dropdown.render();
        +
        +    this.dropdown.position(this.$dropdown, $container);
        +
        +    var ResultsAdapter = this.options.get('resultsAdapter');
        +    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
        +    this.$results = this.results.render();
        +
        +    this.results.position(this.$results, this.$dropdown);
        +
        +    // Bind events
        +
        +    var self = this;
        +
        +    // Bind the container to all of the adapters
        +    this._bindAdapters();
        +
        +    // Register any DOM event handlers
        +    this._registerDomEvents();
        +
        +    // Register any internal event handlers
        +    this._registerDataEvents();
        +    this._registerSelectionEvents();
        +    this._registerDropdownEvents();
        +    this._registerResultsEvents();
        +    this._registerEvents();
        +
        +    // Set the initial state
        +    this.dataAdapter.current(function (initialData) {
        +      self.trigger('selection:update', {
        +        data: initialData
        +      });
        +    });
        +
        +    // Hide the original select
        +    $element.addClass('select2-hidden-accessible');
        +    $element.attr('aria-hidden', 'true');
        +
        +    // Synchronize any monitored attributes
        +    this._syncAttributes();
        +
        +    $element.data('select2', this);
        +  };
        +
        +  Utils.Extend(Select2, Utils.Observable);
        +
        +  Select2.prototype._generateId = function ($element) {
        +    var id = '';
        +
        +    if ($element.attr('id') != null) {
        +      id = $element.attr('id');
        +    } else if ($element.attr('name') != null) {
        +      id = $element.attr('name') + '-' + Utils.generateChars(2);
        +    } else {
        +      id = Utils.generateChars(4);
        +    }
        +
        +    id = id.replace(/(:|\.|\[|\]|,)/g, '');
        +    id = 'select2-' + id;
        +
        +    return id;
        +  };
        +
        +  Select2.prototype._placeContainer = function ($container) {
        +    $container.insertAfter(this.$element);
        +
        +    var width = this._resolveWidth(this.$element, this.options.get('width'));
        +
        +    if (width != null) {
        +      $container.css('width', width);
        +    }
        +  };
        +
        +  Select2.prototype._resolveWidth = function ($element, method) {
        +    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
        +
        +    if (method == 'resolve') {
        +      var styleWidth = this._resolveWidth($element, 'style');
        +
        +      if (styleWidth != null) {
        +        return styleWidth;
        +      }
        +
        +      return this._resolveWidth($element, 'element');
        +    }
        +
        +    if (method == 'element') {
        +      var elementWidth = $element.outerWidth(false);
        +
        +      if (elementWidth <= 0) {
        +        return 'auto';
        +      }
        +
        +      return elementWidth + 'px';
        +    }
        +
        +    if (method == 'style') {
        +      var style = $element.attr('style');
        +
        +      if (typeof(style) !== 'string') {
        +        return null;
        +      }
        +
        +      var attrs = style.split(';');
        +
        +      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
        +        var attr = attrs[i].replace(/\s/g, '');
        +        var matches = attr.match(WIDTH);
        +
        +        if (matches !== null && matches.length >= 1) {
        +          return matches[1];
        +        }
        +      }
        +
        +      return null;
        +    }
        +
        +    return method;
        +  };
        +
        +  Select2.prototype._bindAdapters = function () {
        +    this.dataAdapter.bind(this, this.$container);
        +    this.selection.bind(this, this.$container);
        +
        +    this.dropdown.bind(this, this.$container);
        +    this.results.bind(this, this.$container);
        +  };
        +
        +  Select2.prototype._registerDomEvents = function () {
        +    var self = this;
        +
        +    this.$element.on('change.select2', function () {
        +      self.dataAdapter.current(function (data) {
        +        self.trigger('selection:update', {
        +          data: data
        +        });
        +      });
        +    });
        +
        +    this.$element.on('focus.select2', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this._syncA = Utils.bind(this._syncAttributes, this);
        +    this._syncS = Utils.bind(this._syncSubtree, this);
        +
        +    if (this.$element[0].attachEvent) {
        +      this.$element[0].attachEvent('onpropertychange', this._syncA);
        +    }
        +
        +    var observer = window.MutationObserver ||
        +      window.WebKitMutationObserver ||
        +      window.MozMutationObserver
        +    ;
        +
        +    if (observer != null) {
        +      this._observer = new observer(function (mutations) {
        +        $.each(mutations, self._syncA);
        +        $.each(mutations, self._syncS);
        +      });
        +      this._observer.observe(this.$element[0], {
        +        attributes: true,
        +        childList: true,
        +        subtree: false
        +      });
        +    } else if (this.$element[0].addEventListener) {
        +      this.$element[0].addEventListener(
        +        'DOMAttrModified',
        +        self._syncA,
        +        false
        +      );
        +      this.$element[0].addEventListener(
        +        'DOMNodeInserted',
        +        self._syncS,
        +        false
        +      );
        +      this.$element[0].addEventListener(
        +        'DOMNodeRemoved',
        +        self._syncS,
        +        false
        +      );
        +    }
        +  };
        +
        +  Select2.prototype._registerDataEvents = function () {
        +    var self = this;
        +
        +    this.dataAdapter.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerSelectionEvents = function () {
        +    var self = this;
        +    var nonRelayEvents = ['toggle', 'focus'];
        +
        +    this.selection.on('toggle', function () {
        +      self.toggleDropdown();
        +    });
        +
        +    this.selection.on('focus', function (params) {
        +      self.focus(params);
        +    });
        +
        +    this.selection.on('*', function (name, params) {
        +      if ($.inArray(name, nonRelayEvents) !== -1) {
        +        return;
        +      }
        +
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerDropdownEvents = function () {
        +    var self = this;
        +
        +    this.dropdown.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerResultsEvents = function () {
        +    var self = this;
        +
        +    this.results.on('*', function (name, params) {
        +      self.trigger(name, params);
        +    });
        +  };
        +
        +  Select2.prototype._registerEvents = function () {
        +    var self = this;
        +
        +    this.on('open', function () {
        +      self.$container.addClass('select2-container--open');
        +    });
        +
        +    this.on('close', function () {
        +      self.$container.removeClass('select2-container--open');
        +    });
        +
        +    this.on('enable', function () {
        +      self.$container.removeClass('select2-container--disabled');
        +    });
        +
        +    this.on('disable', function () {
        +      self.$container.addClass('select2-container--disabled');
        +    });
        +
        +    this.on('blur', function () {
        +      self.$container.removeClass('select2-container--focus');
        +    });
        +
        +    this.on('query', function (params) {
        +      if (!self.isOpen()) {
        +        self.trigger('open', {});
        +      }
        +
        +      this.dataAdapter.query(params, function (data) {
        +        self.trigger('results:all', {
        +          data: data,
        +          query: params
        +        });
        +      });
        +    });
        +
        +    this.on('query:append', function (params) {
        +      this.dataAdapter.query(params, function (data) {
        +        self.trigger('results:append', {
        +          data: data,
        +          query: params
        +        });
        +      });
        +    });
        +
        +    this.on('keypress', function (evt) {
        +      var key = evt.which;
        +
        +      if (self.isOpen()) {
        +        if (key === KEYS.ESC || key === KEYS.TAB ||
        +            (key === KEYS.UP && evt.altKey)) {
        +          self.close();
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.ENTER) {
        +          self.trigger('results:select', {});
        +
        +          evt.preventDefault();
        +        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
        +          self.trigger('results:toggle', {});
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.UP) {
        +          self.trigger('results:previous', {});
        +
        +          evt.preventDefault();
        +        } else if (key === KEYS.DOWN) {
        +          self.trigger('results:next', {});
        +
        +          evt.preventDefault();
        +        }
        +      } else {
        +        if (key === KEYS.ENTER || key === KEYS.SPACE ||
        +            (key === KEYS.DOWN && evt.altKey)) {
        +          self.open();
        +
        +          evt.preventDefault();
        +        }
        +      }
        +    });
        +  };
        +
        +  Select2.prototype._syncAttributes = function () {
        +    this.options.set('disabled', this.$element.prop('disabled'));
        +
        +    if (this.options.get('disabled')) {
        +      if (this.isOpen()) {
        +        this.close();
        +      }
        +
        +      this.trigger('disable', {});
        +    } else {
        +      this.trigger('enable', {});
        +    }
        +  };
        +
        +  Select2.prototype._syncSubtree = function (evt, mutations) {
        +    var changed = false;
        +    var self = this;
        +
        +    // Ignore any mutation events raised for elements that aren't options or
        +    // optgroups. This handles the case when the select element is destroyed
        +    if (
        +      evt && evt.target && (
        +        evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
        +      )
        +    ) {
        +      return;
        +    }
        +
        +    if (!mutations) {
        +      // If mutation events aren't supported, then we can only assume that the
        +      // change affected the selections
        +      changed = true;
        +    } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
        +      for (var n = 0; n < mutations.addedNodes.length; n++) {
        +        var node = mutations.addedNodes[n];
        +
        +        if (node.selected) {
        +          changed = true;
        +        }
        +      }
        +    } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
        +      changed = true;
        +    }
        +
        +    // Only re-pull the data if we think there is a change
        +    if (changed) {
        +      this.dataAdapter.current(function (currentData) {
        +        self.trigger('selection:update', {
        +          data: currentData
        +        });
        +      });
        +    }
        +  };
        +
        +  /**
        +   * Override the trigger method to automatically trigger pre-events when
        +   * there are events that can be prevented.
        +   */
        +  Select2.prototype.trigger = function (name, args) {
        +    var actualTrigger = Select2.__super__.trigger;
        +    var preTriggerMap = {
        +      'open': 'opening',
        +      'close': 'closing',
        +      'select': 'selecting',
        +      'unselect': 'unselecting'
        +    };
        +
        +    if (args === undefined) {
        +      args = {};
        +    }
        +
        +    if (name in preTriggerMap) {
        +      var preTriggerName = preTriggerMap[name];
        +      var preTriggerArgs = {
        +        prevented: false,
        +        name: name,
        +        args: args
        +      };
        +
        +      actualTrigger.call(this, preTriggerName, preTriggerArgs);
        +
        +      if (preTriggerArgs.prevented) {
        +        args.prevented = true;
        +
        +        return;
        +      }
        +    }
        +
        +    actualTrigger.call(this, name, args);
        +  };
        +
        +  Select2.prototype.toggleDropdown = function () {
        +    if (this.options.get('disabled')) {
        +      return;
        +    }
        +
        +    if (this.isOpen()) {
        +      this.close();
        +    } else {
        +      this.open();
        +    }
        +  };
        +
        +  Select2.prototype.open = function () {
        +    if (this.isOpen()) {
        +      return;
        +    }
        +
        +    this.trigger('query', {});
        +  };
        +
        +  Select2.prototype.close = function () {
        +    if (!this.isOpen()) {
        +      return;
        +    }
        +
        +    this.trigger('close', {});
        +  };
        +
        +  Select2.prototype.isOpen = function () {
        +    return this.$container.hasClass('select2-container--open');
        +  };
        +
        +  Select2.prototype.hasFocus = function () {
        +    return this.$container.hasClass('select2-container--focus');
        +  };
        +
        +  Select2.prototype.focus = function (data) {
        +    // No need to re-trigger focus events if we are already focused
        +    if (this.hasFocus()) {
        +      return;
        +    }
        +
        +    this.$container.addClass('select2-container--focus');
        +    this.trigger('focus', {});
        +  };
        +
        +  Select2.prototype.enable = function (args) {
        +    if (this.options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `select2("enable")` method has been deprecated and will' +
        +        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
        +        ' instead.'
        +      );
        +    }
        +
        +    if (args == null || args.length === 0) {
        +      args = [true];
        +    }
        +
        +    var disabled = !args[0];
        +
        +    this.$element.prop('disabled', disabled);
        +  };
        +
        +  Select2.prototype.data = function () {
        +    if (this.options.get('debug') &&
        +        arguments.length > 0 && window.console && console.warn) {
        +      console.warn(
        +        'Select2: Data can no longer be set using `select2("data")`. You ' +
        +        'should consider setting the value instead using `$element.val()`.'
        +      );
        +    }
        +
        +    var data = [];
        +
        +    this.dataAdapter.current(function (currentData) {
        +      data = currentData;
        +    });
        +
        +    return data;
        +  };
        +
        +  Select2.prototype.val = function (args) {
        +    if (this.options.get('debug') && window.console && console.warn) {
        +      console.warn(
        +        'Select2: The `select2("val")` method has been deprecated and will be' +
        +        ' removed in later Select2 versions. Use $element.val() instead.'
        +      );
        +    }
        +
        +    if (args == null || args.length === 0) {
        +      return this.$element.val();
        +    }
        +
        +    var newVal = args[0];
        +
        +    if ($.isArray(newVal)) {
        +      newVal = $.map(newVal, function (obj) {
        +        return obj.toString();
        +      });
        +    }
        +
        +    this.$element.val(newVal).trigger('change');
        +  };
        +
        +  Select2.prototype.destroy = function () {
        +    this.$container.remove();
        +
        +    if (this.$element[0].detachEvent) {
        +      this.$element[0].detachEvent('onpropertychange', this._syncA);
        +    }
        +
        +    if (this._observer != null) {
        +      this._observer.disconnect();
        +      this._observer = null;
        +    } else if (this.$element[0].removeEventListener) {
        +      this.$element[0]
        +        .removeEventListener('DOMAttrModified', this._syncA, false);
        +      this.$element[0]
        +        .removeEventListener('DOMNodeInserted', this._syncS, false);
        +      this.$element[0]
        +        .removeEventListener('DOMNodeRemoved', this._syncS, false);
        +    }
        +
        +    this._syncA = null;
        +    this._syncS = null;
        +
        +    this.$element.off('.select2');
        +    this.$element.attr('tabindex', this.$element.data('old-tabindex'));
        +
        +    this.$element.removeClass('select2-hidden-accessible');
        +    this.$element.attr('aria-hidden', 'false');
        +    this.$element.removeData('select2');
        +
        +    this.dataAdapter.destroy();
        +    this.selection.destroy();
        +    this.dropdown.destroy();
        +    this.results.destroy();
        +
        +    this.dataAdapter = null;
        +    this.selection = null;
        +    this.dropdown = null;
        +    this.results = null;
        +  };
        +
        +  Select2.prototype.render = function () {
        +    var $container = $(
        +      '<span class="select2 select2-container">' +
        +        '<span class="selection"></span>' +
        +        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
        +      '</span>'
        +    );
        +
        +    $container.attr('dir', this.options.get('dir'));
        +
        +    this.$container = $container;
        +
        +    this.$container.addClass('select2-container--' + this.options.get('theme'));
        +
        +    $container.data('element', this.$element);
        +
        +    return $container;
        +  };
        +
        +  return Select2;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/ajax.js b/bower_components/select2/src/js/select2/data/ajax.js
        new file mode 100644
        index 0000000000..97d3416020
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/ajax.js
        @@ -0,0 +1,109 @@
        +define([
        +  './array',
        +  '../utils',
        +  'jquery'
        +], function (ArrayAdapter, Utils, $) {
        +  function AjaxAdapter ($element, options) {
        +    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
        +
        +    if (this.ajaxOptions.processResults != null) {
        +      this.processResults = this.ajaxOptions.processResults;
        +    }
        +
        +    AjaxAdapter.__super__.constructor.call(this, $element, options);
        +  }
        +
        +  Utils.Extend(AjaxAdapter, ArrayAdapter);
        +
        +  AjaxAdapter.prototype._applyDefaults = function (options) {
        +    var defaults = {
        +      data: function (params) {
        +        return $.extend({}, params, {
        +          q: params.term
        +        });
        +      },
        +      transport: function (params, success, failure) {
        +        var $request = $.ajax(params);
        +
        +        $request.then(success);
        +        $request.fail(failure);
        +
        +        return $request;
        +      }
        +    };
        +
        +    return $.extend({}, defaults, options, true);
        +  };
        +
        +  AjaxAdapter.prototype.processResults = function (results) {
        +    return results;
        +  };
        +
        +  AjaxAdapter.prototype.query = function (params, callback) {
        +    var matches = [];
        +    var self = this;
        +
        +    if (this._request != null) {
        +      // JSONP requests cannot always be aborted
        +      if ($.isFunction(this._request.abort)) {
        +        this._request.abort();
        +      }
        +
        +      this._request = null;
        +    }
        +
        +    var options = $.extend({
        +      type: 'GET'
        +    }, this.ajaxOptions);
        +
        +    if (typeof options.url === 'function') {
        +      options.url = options.url.call(this.$element, params);
        +    }
        +
        +    if (typeof options.data === 'function') {
        +      options.data = options.data.call(this.$element, params);
        +    }
        +
        +    function request () {
        +      var $request = options.transport(options, function (data) {
        +        var results = self.processResults(data, params);
        +
        +        if (self.options.get('debug') && window.console && console.error) {
        +          // Check to make sure that the response included a `results` key.
        +          if (!results || !results.results || !$.isArray(results.results)) {
        +            console.error(
        +              'Select2: The AJAX results did not return an array in the ' +
        +              '`results` key of the response.'
        +            );
        +          }
        +        }
        +
        +        callback(results);
        +      }, function () {
        +        // Attempt to detect if a request was aborted
        +        // Only works if the transport exposes a status property
        +        if ($request.status && $request.status === '0') {
        +          return;
        +        }
        +
        +        self.trigger('results:message', {
        +          message: 'errorLoading'
        +        });
        +      });
        +
        +      self._request = $request;
        +    }
        +
        +    if (this.ajaxOptions.delay && params.term != null) {
        +      if (this._queryTimeout) {
        +        window.clearTimeout(this._queryTimeout);
        +      }
        +
        +      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
        +    } else {
        +      request();
        +    }
        +  };
        +
        +  return AjaxAdapter;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/array.js b/bower_components/select2/src/js/select2/data/array.js
        new file mode 100644
        index 0000000000..b88996625f
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/array.js
        @@ -0,0 +1,79 @@
        +define([
        +  './select',
        +  '../utils',
        +  'jquery'
        +], function (SelectAdapter, Utils, $) {
        +  function ArrayAdapter ($element, options) {
        +    var data = options.get('data') || [];
        +
        +    ArrayAdapter.__super__.constructor.call(this, $element, options);
        +
        +    this.addOptions(this.convertToOptions(data));
        +  }
        +
        +  Utils.Extend(ArrayAdapter, SelectAdapter);
        +
        +  ArrayAdapter.prototype.select = function (data) {
        +    var $option = this.$element.find('option').filter(function (i, elm) {
        +      return elm.value == data.id.toString();
        +    });
        +
        +    if ($option.length === 0) {
        +      $option = this.option(data);
        +
        +      this.addOptions($option);
        +    }
        +
        +    ArrayAdapter.__super__.select.call(this, data);
        +  };
        +
        +  ArrayAdapter.prototype.convertToOptions = function (data) {
        +    var self = this;
        +
        +    var $existing = this.$element.find('option');
        +    var existingIds = $existing.map(function () {
        +      return self.item($(this)).id;
        +    }).get();
        +
        +    var $options = [];
        +
        +    // Filter out all items except for the one passed in the argument
        +    function onlyItem (item) {
        +      return function () {
        +        return $(this).val() == item.id;
        +      };
        +    }
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var item = this._normalizeItem(data[d]);
        +
        +      // Skip items which were pre-loaded, only merge the data
        +      if ($.inArray(item.id, existingIds) >= 0) {
        +        var $existingOption = $existing.filter(onlyItem(item));
        +
        +        var existingData = this.item($existingOption);
        +        var newData = $.extend(true, {}, item, existingData);
        +
        +        var $newOption = this.option(newData);
        +
        +        $existingOption.replaceWith($newOption);
        +
        +        continue;
        +      }
        +
        +      var $option = this.option(item);
        +
        +      if (item.children) {
        +        var $children = this.convertToOptions(item.children);
        +
        +        Utils.appendMany($option, $children);
        +      }
        +
        +      $options.push($option);
        +    }
        +
        +    return $options;
        +  };
        +
        +  return ArrayAdapter;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/base.js b/bower_components/select2/src/js/select2/data/base.js
        new file mode 100644
        index 0000000000..e35054d9f2
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/base.js
        @@ -0,0 +1,40 @@
        +define([
        +  '../utils'
        +], function (Utils) {
        +  function BaseAdapter ($element, options) {
        +    BaseAdapter.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(BaseAdapter, Utils.Observable);
        +
        +  BaseAdapter.prototype.current = function (callback) {
        +    throw new Error('The `current` method must be defined in child classes.');
        +  };
        +
        +  BaseAdapter.prototype.query = function (params, callback) {
        +    throw new Error('The `query` method must be defined in child classes.');
        +  };
        +
        +  BaseAdapter.prototype.bind = function (container, $container) {
        +    // Can be implemented in subclasses
        +  };
        +
        +  BaseAdapter.prototype.destroy = function () {
        +    // Can be implemented in subclasses
        +  };
        +
        +  BaseAdapter.prototype.generateResultId = function (container, data) {
        +    var id = container.id + '-result-';
        +
        +    id += Utils.generateChars(4);
        +
        +    if (data.id != null) {
        +      id += '-' + data.id.toString();
        +    } else {
        +      id += '-' + Utils.generateChars(4);
        +    }
        +    return id;
        +  };
        +
        +  return BaseAdapter;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/maximumInputLength.js b/bower_components/select2/src/js/select2/data/maximumInputLength.js
        new file mode 100644
        index 0000000000..f303ba8813
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/maximumInputLength.js
        @@ -0,0 +1,31 @@
        +define([
        +
        +], function () {
        +  function MaximumInputLength (decorated, $e, options) {
        +    this.maximumInputLength = options.get('maximumInputLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MaximumInputLength.prototype.query = function (decorated, params, callback) {
        +    params.term = params.term || '';
        +
        +    if (this.maximumInputLength > 0 &&
        +        params.term.length > this.maximumInputLength) {
        +      this.trigger('results:message', {
        +        message: 'inputTooLong',
        +        args: {
        +          maximum: this.maximumInputLength,
        +          input: params.term,
        +          params: params
        +        }
        +      });
        +
        +      return;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  return MaximumInputLength;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/maximumSelectionLength.js b/bower_components/select2/src/js/select2/data/maximumSelectionLength.js
        new file mode 100644
        index 0000000000..ae727529c1
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/maximumSelectionLength.js
        @@ -0,0 +1,31 @@
        +define([
        +
        +], function (){
        +  function MaximumSelectionLength (decorated, $e, options) {
        +    this.maximumSelectionLength = options.get('maximumSelectionLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MaximumSelectionLength.prototype.query =
        +    function (decorated, params, callback) {
        +      var self = this;
        +
        +      this.current(function (currentData) {
        +        var count = currentData != null ? currentData.length : 0;
        +        if (self.maximumSelectionLength > 0 &&
        +          count >= self.maximumSelectionLength) {
        +          self.trigger('results:message', {
        +            message: 'maximumSelected',
        +            args: {
        +              maximum: self.maximumSelectionLength
        +            }
        +          });
        +          return;
        +        }
        +        decorated.call(self, params, callback);
        +      });
        +  };
        +
        +  return MaximumSelectionLength;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/minimumInputLength.js b/bower_components/select2/src/js/select2/data/minimumInputLength.js
        new file mode 100644
        index 0000000000..c19f71c2e6
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/minimumInputLength.js
        @@ -0,0 +1,30 @@
        +define([
        +
        +], function () {
        +  function MinimumInputLength (decorated, $e, options) {
        +    this.minimumInputLength = options.get('minimumInputLength');
        +
        +    decorated.call(this, $e, options);
        +  }
        +
        +  MinimumInputLength.prototype.query = function (decorated, params, callback) {
        +    params.term = params.term || '';
        +
        +    if (params.term.length < this.minimumInputLength) {
        +      this.trigger('results:message', {
        +        message: 'inputTooShort',
        +        args: {
        +          minimum: this.minimumInputLength,
        +          input: params.term,
        +          params: params
        +        }
        +      });
        +
        +      return;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  return MinimumInputLength;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/select.js b/bower_components/select2/src/js/select2/data/select.js
        new file mode 100644
        index 0000000000..ab50410755
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/select.js
        @@ -0,0 +1,285 @@
        +define([
        +  './base',
        +  '../utils',
        +  'jquery'
        +], function (BaseAdapter, Utils, $) {
        +  function SelectAdapter ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    SelectAdapter.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(SelectAdapter, BaseAdapter);
        +
        +  SelectAdapter.prototype.current = function (callback) {
        +    var data = [];
        +    var self = this;
        +
        +    this.$element.find(':selected').each(function () {
        +      var $option = $(this);
        +
        +      var option = self.item($option);
        +
        +      data.push(option);
        +    });
        +
        +    callback(data);
        +  };
        +
        +  SelectAdapter.prototype.select = function (data) {
        +    var self = this;
        +
        +    data.selected = true;
        +
        +    // If data.element is a DOM node, use it instead
        +    if ($(data.element).is('option')) {
        +      data.element.selected = true;
        +
        +      this.$element.trigger('change');
        +
        +      return;
        +    }
        +
        +    if (this.$element.prop('multiple')) {
        +      this.current(function (currentData) {
        +        var val = [];
        +
        +        data = [data];
        +        data.push.apply(data, currentData);
        +
        +        for (var d = 0; d < data.length; d++) {
        +          var id = data[d].id;
        +
        +          if ($.inArray(id, val) === -1) {
        +            val.push(id);
        +          }
        +        }
        +
        +        self.$element.val(val);
        +        self.$element.trigger('change');
        +      });
        +    } else {
        +      var val = data.id;
        +
        +      this.$element.val(val);
        +      this.$element.trigger('change');
        +    }
        +  };
        +
        +  SelectAdapter.prototype.unselect = function (data) {
        +    var self = this;
        +
        +    if (!this.$element.prop('multiple')) {
        +      return;
        +    }
        +
        +    data.selected = false;
        +
        +    if ($(data.element).is('option')) {
        +      data.element.selected = false;
        +
        +      this.$element.trigger('change');
        +
        +      return;
        +    }
        +
        +    this.current(function (currentData) {
        +      var val = [];
        +
        +      for (var d = 0; d < currentData.length; d++) {
        +        var id = currentData[d].id;
        +
        +        if (id !== data.id && $.inArray(id, val) === -1) {
        +          val.push(id);
        +        }
        +      }
        +
        +      self.$element.val(val);
        +
        +      self.$element.trigger('change');
        +    });
        +  };
        +
        +  SelectAdapter.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    this.container = container;
        +
        +    container.on('select', function (params) {
        +      self.select(params.data);
        +    });
        +
        +    container.on('unselect', function (params) {
        +      self.unselect(params.data);
        +    });
        +  };
        +
        +  SelectAdapter.prototype.destroy = function () {
        +    // Remove anything added to child elements
        +    this.$element.find('*').each(function () {
        +      // Remove any custom data set by Select2
        +      $.removeData(this, 'data');
        +    });
        +  };
        +
        +  SelectAdapter.prototype.query = function (params, callback) {
        +    var data = [];
        +    var self = this;
        +
        +    var $options = this.$element.children();
        +
        +    $options.each(function () {
        +      var $option = $(this);
        +
        +      if (!$option.is('option') && !$option.is('optgroup')) {
        +        return;
        +      }
        +
        +      var option = self.item($option);
        +
        +      var matches = self.matches(params, option);
        +
        +      if (matches !== null) {
        +        data.push(matches);
        +      }
        +    });
        +
        +    callback({
        +      results: data
        +    });
        +  };
        +
        +  SelectAdapter.prototype.addOptions = function ($options) {
        +    Utils.appendMany(this.$element, $options);
        +  };
        +
        +  SelectAdapter.prototype.option = function (data) {
        +    var option;
        +
        +    if (data.children) {
        +      option = document.createElement('optgroup');
        +      option.label = data.text;
        +    } else {
        +      option = document.createElement('option');
        +
        +      if (option.textContent !== undefined) {
        +        option.textContent = data.text;
        +      } else {
        +        option.innerText = data.text;
        +      }
        +    }
        +
        +    if (data.id) {
        +      option.value = data.id;
        +    }
        +
        +    if (data.disabled) {
        +      option.disabled = true;
        +    }
        +
        +    if (data.selected) {
        +      option.selected = true;
        +    }
        +
        +    if (data.title) {
        +      option.title = data.title;
        +    }
        +
        +    var $option = $(option);
        +
        +    var normalizedData = this._normalizeItem(data);
        +    normalizedData.element = option;
        +
        +    // Override the option's data with the combined data
        +    $.data(option, 'data', normalizedData);
        +
        +    return $option;
        +  };
        +
        +  SelectAdapter.prototype.item = function ($option) {
        +    var data = {};
        +
        +    data = $.data($option[0], 'data');
        +
        +    if (data != null) {
        +      return data;
        +    }
        +
        +    if ($option.is('option')) {
        +      data = {
        +        id: $option.val(),
        +        text: $option.text(),
        +        disabled: $option.prop('disabled'),
        +        selected: $option.prop('selected'),
        +        title: $option.prop('title')
        +      };
        +    } else if ($option.is('optgroup')) {
        +      data = {
        +        text: $option.prop('label'),
        +        children: [],
        +        title: $option.prop('title')
        +      };
        +
        +      var $children = $option.children('option');
        +      var children = [];
        +
        +      for (var c = 0; c < $children.length; c++) {
        +        var $child = $($children[c]);
        +
        +        var child = this.item($child);
        +
        +        children.push(child);
        +      }
        +
        +      data.children = children;
        +    }
        +
        +    data = this._normalizeItem(data);
        +    data.element = $option[0];
        +
        +    $.data($option[0], 'data', data);
        +
        +    return data;
        +  };
        +
        +  SelectAdapter.prototype._normalizeItem = function (item) {
        +    if (!$.isPlainObject(item)) {
        +      item = {
        +        id: item,
        +        text: item
        +      };
        +    }
        +
        +    item = $.extend({}, {
        +      text: ''
        +    }, item);
        +
        +    var defaults = {
        +      selected: false,
        +      disabled: false
        +    };
        +
        +    if (item.id != null) {
        +      item.id = item.id.toString();
        +    }
        +
        +    if (item.text != null) {
        +      item.text = item.text.toString();
        +    }
        +
        +    if (item._resultId == null && item.id && this.container != null) {
        +      item._resultId = this.generateResultId(this.container, item);
        +    }
        +
        +    return $.extend({}, defaults, item);
        +  };
        +
        +  SelectAdapter.prototype.matches = function (params, data) {
        +    var matcher = this.options.get('matcher');
        +
        +    return matcher(params, data);
        +  };
        +
        +  return SelectAdapter;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/tags.js b/bower_components/select2/src/js/select2/data/tags.js
        new file mode 100644
        index 0000000000..db42faabed
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/tags.js
        @@ -0,0 +1,125 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function Tags (decorated, $element, options) {
        +    var tags = options.get('tags');
        +
        +    var createTag = options.get('createTag');
        +
        +    if (createTag !== undefined) {
        +      this.createTag = createTag;
        +    }
        +
        +    var insertTag = options.get('insertTag');
        +
        +    if (insertTag !== undefined) {
        +        this.insertTag = insertTag;
        +    }
        +
        +    decorated.call(this, $element, options);
        +
        +    if ($.isArray(tags)) {
        +      for (var t = 0; t < tags.length; t++) {
        +        var tag = tags[t];
        +        var item = this._normalizeItem(tag);
        +
        +        var $option = this.option(item);
        +
        +        this.$element.append($option);
        +      }
        +    }
        +  }
        +
        +  Tags.prototype.query = function (decorated, params, callback) {
        +    var self = this;
        +
        +    this._removeOldTags();
        +
        +    if (params.term == null || params.page != null) {
        +      decorated.call(this, params, callback);
        +      return;
        +    }
        +
        +    function wrapper (obj, child) {
        +      var data = obj.results;
        +
        +      for (var i = 0; i < data.length; i++) {
        +        var option = data[i];
        +
        +        var checkChildren = (
        +          option.children != null &&
        +          !wrapper({
        +            results: option.children
        +          }, true)
        +        );
        +
        +        var checkText = option.text === params.term;
        +
        +        if (checkText || checkChildren) {
        +          if (child) {
        +            return false;
        +          }
        +
        +          obj.data = data;
        +          callback(obj);
        +
        +          return;
        +        }
        +      }
        +
        +      if (child) {
        +        return true;
        +      }
        +
        +      var tag = self.createTag(params);
        +
        +      if (tag != null) {
        +        var $option = self.option(tag);
        +        $option.attr('data-select2-tag', true);
        +
        +        self.addOptions([$option]);
        +
        +        self.insertTag(data, tag);
        +      }
        +
        +      obj.results = data;
        +
        +      callback(obj);
        +    }
        +
        +    decorated.call(this, params, wrapper);
        +  };
        +
        +  Tags.prototype.createTag = function (decorated, params) {
        +    var term = $.trim(params.term);
        +
        +    if (term === '') {
        +      return null;
        +    }
        +
        +    return {
        +      id: term,
        +      text: term
        +    };
        +  };
        +
        +  Tags.prototype.insertTag = function (_, data, tag) {
        +    data.unshift(tag);
        +  };
        +
        +  Tags.prototype._removeOldTags = function (_) {
        +    var tag = this._lastTag;
        +
        +    var $options = this.$element.find('option[data-select2-tag]');
        +
        +    $options.each(function () {
        +      if (this.selected) {
        +        return;
        +      }
        +
        +      $(this).remove();
        +    });
        +  };
        +
        +  return Tags;
        +});
        diff --git a/bower_components/select2/src/js/select2/data/tokenizer.js b/bower_components/select2/src/js/select2/data/tokenizer.js
        new file mode 100644
        index 0000000000..77576556a3
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/data/tokenizer.js
        @@ -0,0 +1,116 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function Tokenizer (decorated, $element, options) {
        +    var tokenizer = options.get('tokenizer');
        +
        +    if (tokenizer !== undefined) {
        +      this.tokenizer = tokenizer;
        +    }
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Tokenizer.prototype.bind = function (decorated, container, $container) {
        +    decorated.call(this, container, $container);
        +
        +    this.$search =  container.dropdown.$search || container.selection.$search ||
        +      $container.find('.select2-search__field');
        +  };
        +
        +  Tokenizer.prototype.query = function (decorated, params, callback) {
        +    var self = this;
        +
        +    function createAndSelect (data) {
        +      // Normalize the data object so we can use it for checks
        +      var item = self._normalizeItem(data);
        +
        +      // Check if the data object already exists as a tag
        +      // Select it if it doesn't
        +      var $existingOptions = self.$element.find('option').filter(function () {
        +        return $(this).val() === item.id;
        +      });
        +
        +      // If an existing option wasn't found for it, create the option
        +      if (!$existingOptions.length) {
        +        var $option = self.option(item);
        +        $option.attr('data-select2-tag', true);
        +
        +        self._removeOldTags();
        +        self.addOptions([$option]);
        +      }
        +
        +      // Select the item, now that we know there is an option for it
        +      select(item);
        +    }
        +
        +    function select (data) {
        +      self.trigger('select', {
        +        data: data
        +      });
        +    }
        +
        +    params.term = params.term || '';
        +
        +    var tokenData = this.tokenizer(params, this.options, createAndSelect);
        +
        +    if (tokenData.term !== params.term) {
        +      // Replace the search term if we have the search box
        +      if (this.$search.length) {
        +        this.$search.val(tokenData.term);
        +        this.$search.focus();
        +      }
        +
        +      params.term = tokenData.term;
        +    }
        +
        +    decorated.call(this, params, callback);
        +  };
        +
        +  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
        +    var separators = options.get('tokenSeparators') || [];
        +    var term = params.term;
        +    var i = 0;
        +
        +    var createTag = this.createTag || function (params) {
        +      return {
        +        id: params.term,
        +        text: params.term
        +      };
        +    };
        +
        +    while (i < term.length) {
        +      var termChar = term[i];
        +
        +      if ($.inArray(termChar, separators) === -1) {
        +        i++;
        +
        +        continue;
        +      }
        +
        +      var part = term.substr(0, i);
        +      var partParams = $.extend({}, params, {
        +        term: part
        +      });
        +
        +      var data = createTag(partParams);
        +
        +      if (data == null) {
        +        i++;
        +        continue;
        +      }
        +
        +      callback(data);
        +
        +      // Reset the term to not include the tokenized portion
        +      term = term.substr(i + 1) || '';
        +      i = 0;
        +    }
        +
        +    return {
        +      term: term
        +    };
        +  };
        +
        +  return Tokenizer;
        +});
        diff --git a/bower_components/select2/src/js/select2/defaults.js b/bower_components/select2/src/js/select2/defaults.js
        new file mode 100644
        index 0000000000..ad4d224f84
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/defaults.js
        @@ -0,0 +1,396 @@
        +define([
        +  'jquery',
        +  'require',
        +
        +  './results',
        +
        +  './selection/single',
        +  './selection/multiple',
        +  './selection/placeholder',
        +  './selection/allowClear',
        +  './selection/search',
        +  './selection/eventRelay',
        +
        +  './utils',
        +  './translation',
        +  './diacritics',
        +
        +  './data/select',
        +  './data/array',
        +  './data/ajax',
        +  './data/tags',
        +  './data/tokenizer',
        +  './data/minimumInputLength',
        +  './data/maximumInputLength',
        +  './data/maximumSelectionLength',
        +
        +  './dropdown',
        +  './dropdown/search',
        +  './dropdown/hidePlaceholder',
        +  './dropdown/infiniteScroll',
        +  './dropdown/attachBody',
        +  './dropdown/minimumResultsForSearch',
        +  './dropdown/selectOnClose',
        +  './dropdown/closeOnSelect',
        +
        +  './i18n/en'
        +], function ($, require,
        +
        +             ResultsList,
        +
        +             SingleSelection, MultipleSelection, Placeholder, AllowClear,
        +             SelectionSearch, EventRelay,
        +
        +             Utils, Translation, DIACRITICS,
        +
        +             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
        +             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
        +
        +             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
        +             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
        +
        +             EnglishTranslation) {
        +  function Defaults () {
        +    this.reset();
        +  }
        +
        +  Defaults.prototype.apply = function (options) {
        +    options = $.extend(true, {}, this.defaults, options);
        +
        +    if (options.dataAdapter == null) {
        +      if (options.ajax != null) {
        +        options.dataAdapter = AjaxData;
        +      } else if (options.data != null) {
        +        options.dataAdapter = ArrayData;
        +      } else {
        +        options.dataAdapter = SelectData;
        +      }
        +
        +      if (options.minimumInputLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MinimumInputLength
        +        );
        +      }
        +
        +      if (options.maximumInputLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MaximumInputLength
        +        );
        +      }
        +
        +      if (options.maximumSelectionLength > 0) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          MaximumSelectionLength
        +        );
        +      }
        +
        +      if (options.tags) {
        +        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
        +      }
        +
        +      if (options.tokenSeparators != null || options.tokenizer != null) {
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          Tokenizer
        +        );
        +      }
        +
        +      if (options.query != null) {
        +        var Query = require(options.amdBase + 'compat/query');
        +
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          Query
        +        );
        +      }
        +
        +      if (options.initSelection != null) {
        +        var InitSelection = require(options.amdBase + 'compat/initSelection');
        +
        +        options.dataAdapter = Utils.Decorate(
        +          options.dataAdapter,
        +          InitSelection
        +        );
        +      }
        +    }
        +
        +    if (options.resultsAdapter == null) {
        +      options.resultsAdapter = ResultsList;
        +
        +      if (options.ajax != null) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          InfiniteScroll
        +        );
        +      }
        +
        +      if (options.placeholder != null) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          HidePlaceholder
        +        );
        +      }
        +
        +      if (options.selectOnClose) {
        +        options.resultsAdapter = Utils.Decorate(
        +          options.resultsAdapter,
        +          SelectOnClose
        +        );
        +      }
        +    }
        +
        +    if (options.dropdownAdapter == null) {
        +      if (options.multiple) {
        +        options.dropdownAdapter = Dropdown;
        +      } else {
        +        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
        +
        +        options.dropdownAdapter = SearchableDropdown;
        +      }
        +
        +      if (options.minimumResultsForSearch !== 0) {
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          MinimumResultsForSearch
        +        );
        +      }
        +
        +      if (options.closeOnSelect) {
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          CloseOnSelect
        +        );
        +      }
        +
        +      if (
        +        options.dropdownCssClass != null ||
        +        options.dropdownCss != null ||
        +        options.adaptDropdownCssClass != null
        +      ) {
        +        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
        +
        +        options.dropdownAdapter = Utils.Decorate(
        +          options.dropdownAdapter,
        +          DropdownCSS
        +        );
        +      }
        +
        +      options.dropdownAdapter = Utils.Decorate(
        +        options.dropdownAdapter,
        +        AttachBody
        +      );
        +    }
        +
        +    if (options.selectionAdapter == null) {
        +      if (options.multiple) {
        +        options.selectionAdapter = MultipleSelection;
        +      } else {
        +        options.selectionAdapter = SingleSelection;
        +      }
        +
        +      // Add the placeholder mixin if a placeholder was specified
        +      if (options.placeholder != null) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          Placeholder
        +        );
        +      }
        +
        +      if (options.allowClear) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          AllowClear
        +        );
        +      }
        +
        +      if (options.multiple) {
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          SelectionSearch
        +        );
        +      }
        +
        +      if (
        +        options.containerCssClass != null ||
        +        options.containerCss != null ||
        +        options.adaptContainerCssClass != null
        +      ) {
        +        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
        +
        +        options.selectionAdapter = Utils.Decorate(
        +          options.selectionAdapter,
        +          ContainerCSS
        +        );
        +      }
        +
        +      options.selectionAdapter = Utils.Decorate(
        +        options.selectionAdapter,
        +        EventRelay
        +      );
        +    }
        +
        +    if (typeof options.language === 'string') {
        +      // Check if the language is specified with a region
        +      if (options.language.indexOf('-') > 0) {
        +        // Extract the region information if it is included
        +        var languageParts = options.language.split('-');
        +        var baseLanguage = languageParts[0];
        +
        +        options.language = [options.language, baseLanguage];
        +      } else {
        +        options.language = [options.language];
        +      }
        +    }
        +
        +    if ($.isArray(options.language)) {
        +      var languages = new Translation();
        +      options.language.push('en');
        +
        +      var languageNames = options.language;
        +
        +      for (var l = 0; l < languageNames.length; l++) {
        +        var name = languageNames[l];
        +        var language = {};
        +
        +        try {
        +          // Try to load it with the original name
        +          language = Translation.loadPath(name);
        +        } catch (e) {
        +          try {
        +            // If we couldn't load it, check if it wasn't the full path
        +            name = this.defaults.amdLanguageBase + name;
        +            language = Translation.loadPath(name);
        +          } catch (ex) {
        +            // The translation could not be loaded at all. Sometimes this is
        +            // because of a configuration problem, other times this can be
        +            // because of how Select2 helps load all possible translation files.
        +            if (options.debug && window.console && console.warn) {
        +              console.warn(
        +                'Select2: The language file for "' + name + '" could not be ' +
        +                'automatically loaded. A fallback will be used instead.'
        +              );
        +            }
        +
        +            continue;
        +          }
        +        }
        +
        +        languages.extend(language);
        +      }
        +
        +      options.translations = languages;
        +    } else {
        +      var baseTranslation = Translation.loadPath(
        +        this.defaults.amdLanguageBase + 'en'
        +      );
        +      var customTranslation = new Translation(options.language);
        +
        +      customTranslation.extend(baseTranslation);
        +
        +      options.translations = customTranslation;
        +    }
        +
        +    return options;
        +  };
        +
        +  Defaults.prototype.reset = function () {
        +    function stripDiacritics (text) {
        +      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
        +      function match(a) {
        +        return DIACRITICS[a] || a;
        +      }
        +
        +      return text.replace(/[^\u0000-\u007E]/g, match);
        +    }
        +
        +    function matcher (params, data) {
        +      // Always return the object if there is nothing to compare
        +      if ($.trim(params.term) === '') {
        +        return data;
        +      }
        +
        +      // Do a recursive check for options with children
        +      if (data.children && data.children.length > 0) {
        +        // Clone the data object if there are children
        +        // This is required as we modify the object to remove any non-matches
        +        var match = $.extend(true, {}, data);
        +
        +        // Check each child of the option
        +        for (var c = data.children.length - 1; c >= 0; c--) {
        +          var child = data.children[c];
        +
        +          var matches = matcher(params, child);
        +
        +          // If there wasn't a match, remove the object in the array
        +          if (matches == null) {
        +            match.children.splice(c, 1);
        +          }
        +        }
        +
        +        // If any children matched, return the new object
        +        if (match.children.length > 0) {
        +          return match;
        +        }
        +
        +        // If there were no matching children, check just the plain object
        +        return matcher(params, match);
        +      }
        +
        +      var original = stripDiacritics(data.text).toUpperCase();
        +      var term = stripDiacritics(params.term).toUpperCase();
        +
        +      // Check if the text contains the term
        +      if (original.indexOf(term) > -1) {
        +        return data;
        +      }
        +
        +      // If it doesn't contain the term, don't return anything
        +      return null;
        +    }
        +
        +    this.defaults = {
        +      amdBase: './',
        +      amdLanguageBase: './i18n/',
        +      closeOnSelect: true,
        +      debug: false,
        +      dropdownAutoWidth: false,
        +      escapeMarkup: Utils.escapeMarkup,
        +      language: EnglishTranslation,
        +      matcher: matcher,
        +      minimumInputLength: 0,
        +      maximumInputLength: 0,
        +      maximumSelectionLength: 0,
        +      minimumResultsForSearch: 0,
        +      selectOnClose: false,
        +      sorter: function (data) {
        +        return data;
        +      },
        +      templateResult: function (result) {
        +        return result.text;
        +      },
        +      templateSelection: function (selection) {
        +        return selection.text;
        +      },
        +      theme: 'default',
        +      width: 'resolve'
        +    };
        +  };
        +
        +  Defaults.prototype.set = function (key, value) {
        +    var camelKey = $.camelCase(key);
        +
        +    var data = {};
        +    data[camelKey] = value;
        +
        +    var convertedData = Utils._convertData(data);
        +
        +    $.extend(this.defaults, convertedData);
        +  };
        +
        +  var defaults = new Defaults();
        +
        +  return defaults;
        +});
        diff --git a/bower_components/select2/src/js/select2/diacritics.js b/bower_components/select2/src/js/select2/diacritics.js
        new file mode 100644
        index 0000000000..c99ae6162c
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/diacritics.js
        @@ -0,0 +1,847 @@
        +define([
        +
        +], function () {
        +  var diacritics = {
        +    '\u24B6': 'A',
        +    '\uFF21': 'A',
        +    '\u00C0': 'A',
        +    '\u00C1': 'A',
        +    '\u00C2': 'A',
        +    '\u1EA6': 'A',
        +    '\u1EA4': 'A',
        +    '\u1EAA': 'A',
        +    '\u1EA8': 'A',
        +    '\u00C3': 'A',
        +    '\u0100': 'A',
        +    '\u0102': 'A',
        +    '\u1EB0': 'A',
        +    '\u1EAE': 'A',
        +    '\u1EB4': 'A',
        +    '\u1EB2': 'A',
        +    '\u0226': 'A',
        +    '\u01E0': 'A',
        +    '\u00C4': 'A',
        +    '\u01DE': 'A',
        +    '\u1EA2': 'A',
        +    '\u00C5': 'A',
        +    '\u01FA': 'A',
        +    '\u01CD': 'A',
        +    '\u0200': 'A',
        +    '\u0202': 'A',
        +    '\u1EA0': 'A',
        +    '\u1EAC': 'A',
        +    '\u1EB6': 'A',
        +    '\u1E00': 'A',
        +    '\u0104': 'A',
        +    '\u023A': 'A',
        +    '\u2C6F': 'A',
        +    '\uA732': 'AA',
        +    '\u00C6': 'AE',
        +    '\u01FC': 'AE',
        +    '\u01E2': 'AE',
        +    '\uA734': 'AO',
        +    '\uA736': 'AU',
        +    '\uA738': 'AV',
        +    '\uA73A': 'AV',
        +    '\uA73C': 'AY',
        +    '\u24B7': 'B',
        +    '\uFF22': 'B',
        +    '\u1E02': 'B',
        +    '\u1E04': 'B',
        +    '\u1E06': 'B',
        +    '\u0243': 'B',
        +    '\u0182': 'B',
        +    '\u0181': 'B',
        +    '\u24B8': 'C',
        +    '\uFF23': 'C',
        +    '\u0106': 'C',
        +    '\u0108': 'C',
        +    '\u010A': 'C',
        +    '\u010C': 'C',
        +    '\u00C7': 'C',
        +    '\u1E08': 'C',
        +    '\u0187': 'C',
        +    '\u023B': 'C',
        +    '\uA73E': 'C',
        +    '\u24B9': 'D',
        +    '\uFF24': 'D',
        +    '\u1E0A': 'D',
        +    '\u010E': 'D',
        +    '\u1E0C': 'D',
        +    '\u1E10': 'D',
        +    '\u1E12': 'D',
        +    '\u1E0E': 'D',
        +    '\u0110': 'D',
        +    '\u018B': 'D',
        +    '\u018A': 'D',
        +    '\u0189': 'D',
        +    '\uA779': 'D',
        +    '\u01F1': 'DZ',
        +    '\u01C4': 'DZ',
        +    '\u01F2': 'Dz',
        +    '\u01C5': 'Dz',
        +    '\u24BA': 'E',
        +    '\uFF25': 'E',
        +    '\u00C8': 'E',
        +    '\u00C9': 'E',
        +    '\u00CA': 'E',
        +    '\u1EC0': 'E',
        +    '\u1EBE': 'E',
        +    '\u1EC4': 'E',
        +    '\u1EC2': 'E',
        +    '\u1EBC': 'E',
        +    '\u0112': 'E',
        +    '\u1E14': 'E',
        +    '\u1E16': 'E',
        +    '\u0114': 'E',
        +    '\u0116': 'E',
        +    '\u00CB': 'E',
        +    '\u1EBA': 'E',
        +    '\u011A': 'E',
        +    '\u0204': 'E',
        +    '\u0206': 'E',
        +    '\u1EB8': 'E',
        +    '\u1EC6': 'E',
        +    '\u0228': 'E',
        +    '\u1E1C': 'E',
        +    '\u0118': 'E',
        +    '\u1E18': 'E',
        +    '\u1E1A': 'E',
        +    '\u0190': 'E',
        +    '\u018E': 'E',
        +    '\u24BB': 'F',
        +    '\uFF26': 'F',
        +    '\u1E1E': 'F',
        +    '\u0191': 'F',
        +    '\uA77B': 'F',
        +    '\u24BC': 'G',
        +    '\uFF27': 'G',
        +    '\u01F4': 'G',
        +    '\u011C': 'G',
        +    '\u1E20': 'G',
        +    '\u011E': 'G',
        +    '\u0120': 'G',
        +    '\u01E6': 'G',
        +    '\u0122': 'G',
        +    '\u01E4': 'G',
        +    '\u0193': 'G',
        +    '\uA7A0': 'G',
        +    '\uA77D': 'G',
        +    '\uA77E': 'G',
        +    '\u24BD': 'H',
        +    '\uFF28': 'H',
        +    '\u0124': 'H',
        +    '\u1E22': 'H',
        +    '\u1E26': 'H',
        +    '\u021E': 'H',
        +    '\u1E24': 'H',
        +    '\u1E28': 'H',
        +    '\u1E2A': 'H',
        +    '\u0126': 'H',
        +    '\u2C67': 'H',
        +    '\u2C75': 'H',
        +    '\uA78D': 'H',
        +    '\u24BE': 'I',
        +    '\uFF29': 'I',
        +    '\u00CC': 'I',
        +    '\u00CD': 'I',
        +    '\u00CE': 'I',
        +    '\u0128': 'I',
        +    '\u012A': 'I',
        +    '\u012C': 'I',
        +    '\u0130': 'I',
        +    '\u00CF': 'I',
        +    '\u1E2E': 'I',
        +    '\u1EC8': 'I',
        +    '\u01CF': 'I',
        +    '\u0208': 'I',
        +    '\u020A': 'I',
        +    '\u1ECA': 'I',
        +    '\u012E': 'I',
        +    '\u1E2C': 'I',
        +    '\u0197': 'I',
        +    '\u24BF': 'J',
        +    '\uFF2A': 'J',
        +    '\u0134': 'J',
        +    '\u0248': 'J',
        +    '\u24C0': 'K',
        +    '\uFF2B': 'K',
        +    '\u1E30': 'K',
        +    '\u01E8': 'K',
        +    '\u1E32': 'K',
        +    '\u0136': 'K',
        +    '\u1E34': 'K',
        +    '\u0198': 'K',
        +    '\u2C69': 'K',
        +    '\uA740': 'K',
        +    '\uA742': 'K',
        +    '\uA744': 'K',
        +    '\uA7A2': 'K',
        +    '\u24C1': 'L',
        +    '\uFF2C': 'L',
        +    '\u013F': 'L',
        +    '\u0139': 'L',
        +    '\u013D': 'L',
        +    '\u1E36': 'L',
        +    '\u1E38': 'L',
        +    '\u013B': 'L',
        +    '\u1E3C': 'L',
        +    '\u1E3A': 'L',
        +    '\u0141': 'L',
        +    '\u023D': 'L',
        +    '\u2C62': 'L',
        +    '\u2C60': 'L',
        +    '\uA748': 'L',
        +    '\uA746': 'L',
        +    '\uA780': 'L',
        +    '\u01C7': 'LJ',
        +    '\u01C8': 'Lj',
        +    '\u24C2': 'M',
        +    '\uFF2D': 'M',
        +    '\u1E3E': 'M',
        +    '\u1E40': 'M',
        +    '\u1E42': 'M',
        +    '\u2C6E': 'M',
        +    '\u019C': 'M',
        +    '\u24C3': 'N',
        +    '\uFF2E': 'N',
        +    '\u01F8': 'N',
        +    '\u0143': 'N',
        +    '\u00D1': 'N',
        +    '\u1E44': 'N',
        +    '\u0147': 'N',
        +    '\u1E46': 'N',
        +    '\u0145': 'N',
        +    '\u1E4A': 'N',
        +    '\u1E48': 'N',
        +    '\u0220': 'N',
        +    '\u019D': 'N',
        +    '\uA790': 'N',
        +    '\uA7A4': 'N',
        +    '\u01CA': 'NJ',
        +    '\u01CB': 'Nj',
        +    '\u24C4': 'O',
        +    '\uFF2F': 'O',
        +    '\u00D2': 'O',
        +    '\u00D3': 'O',
        +    '\u00D4': 'O',
        +    '\u1ED2': 'O',
        +    '\u1ED0': 'O',
        +    '\u1ED6': 'O',
        +    '\u1ED4': 'O',
        +    '\u00D5': 'O',
        +    '\u1E4C': 'O',
        +    '\u022C': 'O',
        +    '\u1E4E': 'O',
        +    '\u014C': 'O',
        +    '\u1E50': 'O',
        +    '\u1E52': 'O',
        +    '\u014E': 'O',
        +    '\u022E': 'O',
        +    '\u0230': 'O',
        +    '\u00D6': 'O',
        +    '\u022A': 'O',
        +    '\u1ECE': 'O',
        +    '\u0150': 'O',
        +    '\u01D1': 'O',
        +    '\u020C': 'O',
        +    '\u020E': 'O',
        +    '\u01A0': 'O',
        +    '\u1EDC': 'O',
        +    '\u1EDA': 'O',
        +    '\u1EE0': 'O',
        +    '\u1EDE': 'O',
        +    '\u1EE2': 'O',
        +    '\u1ECC': 'O',
        +    '\u1ED8': 'O',
        +    '\u01EA': 'O',
        +    '\u01EC': 'O',
        +    '\u00D8': 'O',
        +    '\u01FE': 'O',
        +    '\u0186': 'O',
        +    '\u019F': 'O',
        +    '\uA74A': 'O',
        +    '\uA74C': 'O',
        +    '\u01A2': 'OI',
        +    '\uA74E': 'OO',
        +    '\u0222': 'OU',
        +    '\u24C5': 'P',
        +    '\uFF30': 'P',
        +    '\u1E54': 'P',
        +    '\u1E56': 'P',
        +    '\u01A4': 'P',
        +    '\u2C63': 'P',
        +    '\uA750': 'P',
        +    '\uA752': 'P',
        +    '\uA754': 'P',
        +    '\u24C6': 'Q',
        +    '\uFF31': 'Q',
        +    '\uA756': 'Q',
        +    '\uA758': 'Q',
        +    '\u024A': 'Q',
        +    '\u24C7': 'R',
        +    '\uFF32': 'R',
        +    '\u0154': 'R',
        +    '\u1E58': 'R',
        +    '\u0158': 'R',
        +    '\u0210': 'R',
        +    '\u0212': 'R',
        +    '\u1E5A': 'R',
        +    '\u1E5C': 'R',
        +    '\u0156': 'R',
        +    '\u1E5E': 'R',
        +    '\u024C': 'R',
        +    '\u2C64': 'R',
        +    '\uA75A': 'R',
        +    '\uA7A6': 'R',
        +    '\uA782': 'R',
        +    '\u24C8': 'S',
        +    '\uFF33': 'S',
        +    '\u1E9E': 'S',
        +    '\u015A': 'S',
        +    '\u1E64': 'S',
        +    '\u015C': 'S',
        +    '\u1E60': 'S',
        +    '\u0160': 'S',
        +    '\u1E66': 'S',
        +    '\u1E62': 'S',
        +    '\u1E68': 'S',
        +    '\u0218': 'S',
        +    '\u015E': 'S',
        +    '\u2C7E': 'S',
        +    '\uA7A8': 'S',
        +    '\uA784': 'S',
        +    '\u24C9': 'T',
        +    '\uFF34': 'T',
        +    '\u1E6A': 'T',
        +    '\u0164': 'T',
        +    '\u1E6C': 'T',
        +    '\u021A': 'T',
        +    '\u0162': 'T',
        +    '\u1E70': 'T',
        +    '\u1E6E': 'T',
        +    '\u0166': 'T',
        +    '\u01AC': 'T',
        +    '\u01AE': 'T',
        +    '\u023E': 'T',
        +    '\uA786': 'T',
        +    '\uA728': 'TZ',
        +    '\u24CA': 'U',
        +    '\uFF35': 'U',
        +    '\u00D9': 'U',
        +    '\u00DA': 'U',
        +    '\u00DB': 'U',
        +    '\u0168': 'U',
        +    '\u1E78': 'U',
        +    '\u016A': 'U',
        +    '\u1E7A': 'U',
        +    '\u016C': 'U',
        +    '\u00DC': 'U',
        +    '\u01DB': 'U',
        +    '\u01D7': 'U',
        +    '\u01D5': 'U',
        +    '\u01D9': 'U',
        +    '\u1EE6': 'U',
        +    '\u016E': 'U',
        +    '\u0170': 'U',
        +    '\u01D3': 'U',
        +    '\u0214': 'U',
        +    '\u0216': 'U',
        +    '\u01AF': 'U',
        +    '\u1EEA': 'U',
        +    '\u1EE8': 'U',
        +    '\u1EEE': 'U',
        +    '\u1EEC': 'U',
        +    '\u1EF0': 'U',
        +    '\u1EE4': 'U',
        +    '\u1E72': 'U',
        +    '\u0172': 'U',
        +    '\u1E76': 'U',
        +    '\u1E74': 'U',
        +    '\u0244': 'U',
        +    '\u24CB': 'V',
        +    '\uFF36': 'V',
        +    '\u1E7C': 'V',
        +    '\u1E7E': 'V',
        +    '\u01B2': 'V',
        +    '\uA75E': 'V',
        +    '\u0245': 'V',
        +    '\uA760': 'VY',
        +    '\u24CC': 'W',
        +    '\uFF37': 'W',
        +    '\u1E80': 'W',
        +    '\u1E82': 'W',
        +    '\u0174': 'W',
        +    '\u1E86': 'W',
        +    '\u1E84': 'W',
        +    '\u1E88': 'W',
        +    '\u2C72': 'W',
        +    '\u24CD': 'X',
        +    '\uFF38': 'X',
        +    '\u1E8A': 'X',
        +    '\u1E8C': 'X',
        +    '\u24CE': 'Y',
        +    '\uFF39': 'Y',
        +    '\u1EF2': 'Y',
        +    '\u00DD': 'Y',
        +    '\u0176': 'Y',
        +    '\u1EF8': 'Y',
        +    '\u0232': 'Y',
        +    '\u1E8E': 'Y',
        +    '\u0178': 'Y',
        +    '\u1EF6': 'Y',
        +    '\u1EF4': 'Y',
        +    '\u01B3': 'Y',
        +    '\u024E': 'Y',
        +    '\u1EFE': 'Y',
        +    '\u24CF': 'Z',
        +    '\uFF3A': 'Z',
        +    '\u0179': 'Z',
        +    '\u1E90': 'Z',
        +    '\u017B': 'Z',
        +    '\u017D': 'Z',
        +    '\u1E92': 'Z',
        +    '\u1E94': 'Z',
        +    '\u01B5': 'Z',
        +    '\u0224': 'Z',
        +    '\u2C7F': 'Z',
        +    '\u2C6B': 'Z',
        +    '\uA762': 'Z',
        +    '\u24D0': 'a',
        +    '\uFF41': 'a',
        +    '\u1E9A': 'a',
        +    '\u00E0': 'a',
        +    '\u00E1': 'a',
        +    '\u00E2': 'a',
        +    '\u1EA7': 'a',
        +    '\u1EA5': 'a',
        +    '\u1EAB': 'a',
        +    '\u1EA9': 'a',
        +    '\u00E3': 'a',
        +    '\u0101': 'a',
        +    '\u0103': 'a',
        +    '\u1EB1': 'a',
        +    '\u1EAF': 'a',
        +    '\u1EB5': 'a',
        +    '\u1EB3': 'a',
        +    '\u0227': 'a',
        +    '\u01E1': 'a',
        +    '\u00E4': 'a',
        +    '\u01DF': 'a',
        +    '\u1EA3': 'a',
        +    '\u00E5': 'a',
        +    '\u01FB': 'a',
        +    '\u01CE': 'a',
        +    '\u0201': 'a',
        +    '\u0203': 'a',
        +    '\u1EA1': 'a',
        +    '\u1EAD': 'a',
        +    '\u1EB7': 'a',
        +    '\u1E01': 'a',
        +    '\u0105': 'a',
        +    '\u2C65': 'a',
        +    '\u0250': 'a',
        +    '\uA733': 'aa',
        +    '\u00E6': 'ae',
        +    '\u01FD': 'ae',
        +    '\u01E3': 'ae',
        +    '\uA735': 'ao',
        +    '\uA737': 'au',
        +    '\uA739': 'av',
        +    '\uA73B': 'av',
        +    '\uA73D': 'ay',
        +    '\u24D1': 'b',
        +    '\uFF42': 'b',
        +    '\u1E03': 'b',
        +    '\u1E05': 'b',
        +    '\u1E07': 'b',
        +    '\u0180': 'b',
        +    '\u0183': 'b',
        +    '\u0253': 'b',
        +    '\u24D2': 'c',
        +    '\uFF43': 'c',
        +    '\u0107': 'c',
        +    '\u0109': 'c',
        +    '\u010B': 'c',
        +    '\u010D': 'c',
        +    '\u00E7': 'c',
        +    '\u1E09': 'c',
        +    '\u0188': 'c',
        +    '\u023C': 'c',
        +    '\uA73F': 'c',
        +    '\u2184': 'c',
        +    '\u24D3': 'd',
        +    '\uFF44': 'd',
        +    '\u1E0B': 'd',
        +    '\u010F': 'd',
        +    '\u1E0D': 'd',
        +    '\u1E11': 'd',
        +    '\u1E13': 'd',
        +    '\u1E0F': 'd',
        +    '\u0111': 'd',
        +    '\u018C': 'd',
        +    '\u0256': 'd',
        +    '\u0257': 'd',
        +    '\uA77A': 'd',
        +    '\u01F3': 'dz',
        +    '\u01C6': 'dz',
        +    '\u24D4': 'e',
        +    '\uFF45': 'e',
        +    '\u00E8': 'e',
        +    '\u00E9': 'e',
        +    '\u00EA': 'e',
        +    '\u1EC1': 'e',
        +    '\u1EBF': 'e',
        +    '\u1EC5': 'e',
        +    '\u1EC3': 'e',
        +    '\u1EBD': 'e',
        +    '\u0113': 'e',
        +    '\u1E15': 'e',
        +    '\u1E17': 'e',
        +    '\u0115': 'e',
        +    '\u0117': 'e',
        +    '\u00EB': 'e',
        +    '\u1EBB': 'e',
        +    '\u011B': 'e',
        +    '\u0205': 'e',
        +    '\u0207': 'e',
        +    '\u1EB9': 'e',
        +    '\u1EC7': 'e',
        +    '\u0229': 'e',
        +    '\u1E1D': 'e',
        +    '\u0119': 'e',
        +    '\u1E19': 'e',
        +    '\u1E1B': 'e',
        +    '\u0247': 'e',
        +    '\u025B': 'e',
        +    '\u01DD': 'e',
        +    '\u24D5': 'f',
        +    '\uFF46': 'f',
        +    '\u1E1F': 'f',
        +    '\u0192': 'f',
        +    '\uA77C': 'f',
        +    '\u24D6': 'g',
        +    '\uFF47': 'g',
        +    '\u01F5': 'g',
        +    '\u011D': 'g',
        +    '\u1E21': 'g',
        +    '\u011F': 'g',
        +    '\u0121': 'g',
        +    '\u01E7': 'g',
        +    '\u0123': 'g',
        +    '\u01E5': 'g',
        +    '\u0260': 'g',
        +    '\uA7A1': 'g',
        +    '\u1D79': 'g',
        +    '\uA77F': 'g',
        +    '\u24D7': 'h',
        +    '\uFF48': 'h',
        +    '\u0125': 'h',
        +    '\u1E23': 'h',
        +    '\u1E27': 'h',
        +    '\u021F': 'h',
        +    '\u1E25': 'h',
        +    '\u1E29': 'h',
        +    '\u1E2B': 'h',
        +    '\u1E96': 'h',
        +    '\u0127': 'h',
        +    '\u2C68': 'h',
        +    '\u2C76': 'h',
        +    '\u0265': 'h',
        +    '\u0195': 'hv',
        +    '\u24D8': 'i',
        +    '\uFF49': 'i',
        +    '\u00EC': 'i',
        +    '\u00ED': 'i',
        +    '\u00EE': 'i',
        +    '\u0129': 'i',
        +    '\u012B': 'i',
        +    '\u012D': 'i',
        +    '\u00EF': 'i',
        +    '\u1E2F': 'i',
        +    '\u1EC9': 'i',
        +    '\u01D0': 'i',
        +    '\u0209': 'i',
        +    '\u020B': 'i',
        +    '\u1ECB': 'i',
        +    '\u012F': 'i',
        +    '\u1E2D': 'i',
        +    '\u0268': 'i',
        +    '\u0131': 'i',
        +    '\u24D9': 'j',
        +    '\uFF4A': 'j',
        +    '\u0135': 'j',
        +    '\u01F0': 'j',
        +    '\u0249': 'j',
        +    '\u24DA': 'k',
        +    '\uFF4B': 'k',
        +    '\u1E31': 'k',
        +    '\u01E9': 'k',
        +    '\u1E33': 'k',
        +    '\u0137': 'k',
        +    '\u1E35': 'k',
        +    '\u0199': 'k',
        +    '\u2C6A': 'k',
        +    '\uA741': 'k',
        +    '\uA743': 'k',
        +    '\uA745': 'k',
        +    '\uA7A3': 'k',
        +    '\u24DB': 'l',
        +    '\uFF4C': 'l',
        +    '\u0140': 'l',
        +    '\u013A': 'l',
        +    '\u013E': 'l',
        +    '\u1E37': 'l',
        +    '\u1E39': 'l',
        +    '\u013C': 'l',
        +    '\u1E3D': 'l',
        +    '\u1E3B': 'l',
        +    '\u017F': 'l',
        +    '\u0142': 'l',
        +    '\u019A': 'l',
        +    '\u026B': 'l',
        +    '\u2C61': 'l',
        +    '\uA749': 'l',
        +    '\uA781': 'l',
        +    '\uA747': 'l',
        +    '\u01C9': 'lj',
        +    '\u24DC': 'm',
        +    '\uFF4D': 'm',
        +    '\u1E3F': 'm',
        +    '\u1E41': 'm',
        +    '\u1E43': 'm',
        +    '\u0271': 'm',
        +    '\u026F': 'm',
        +    '\u24DD': 'n',
        +    '\uFF4E': 'n',
        +    '\u01F9': 'n',
        +    '\u0144': 'n',
        +    '\u00F1': 'n',
        +    '\u1E45': 'n',
        +    '\u0148': 'n',
        +    '\u1E47': 'n',
        +    '\u0146': 'n',
        +    '\u1E4B': 'n',
        +    '\u1E49': 'n',
        +    '\u019E': 'n',
        +    '\u0272': 'n',
        +    '\u0149': 'n',
        +    '\uA791': 'n',
        +    '\uA7A5': 'n',
        +    '\u01CC': 'nj',
        +    '\u24DE': 'o',
        +    '\uFF4F': 'o',
        +    '\u00F2': 'o',
        +    '\u00F3': 'o',
        +    '\u00F4': 'o',
        +    '\u1ED3': 'o',
        +    '\u1ED1': 'o',
        +    '\u1ED7': 'o',
        +    '\u1ED5': 'o',
        +    '\u00F5': 'o',
        +    '\u1E4D': 'o',
        +    '\u022D': 'o',
        +    '\u1E4F': 'o',
        +    '\u014D': 'o',
        +    '\u1E51': 'o',
        +    '\u1E53': 'o',
        +    '\u014F': 'o',
        +    '\u022F': 'o',
        +    '\u0231': 'o',
        +    '\u00F6': 'o',
        +    '\u022B': 'o',
        +    '\u1ECF': 'o',
        +    '\u0151': 'o',
        +    '\u01D2': 'o',
        +    '\u020D': 'o',
        +    '\u020F': 'o',
        +    '\u01A1': 'o',
        +    '\u1EDD': 'o',
        +    '\u1EDB': 'o',
        +    '\u1EE1': 'o',
        +    '\u1EDF': 'o',
        +    '\u1EE3': 'o',
        +    '\u1ECD': 'o',
        +    '\u1ED9': 'o',
        +    '\u01EB': 'o',
        +    '\u01ED': 'o',
        +    '\u00F8': 'o',
        +    '\u01FF': 'o',
        +    '\u0254': 'o',
        +    '\uA74B': 'o',
        +    '\uA74D': 'o',
        +    '\u0275': 'o',
        +    '\u01A3': 'oi',
        +    '\u0223': 'ou',
        +    '\uA74F': 'oo',
        +    '\u24DF': 'p',
        +    '\uFF50': 'p',
        +    '\u1E55': 'p',
        +    '\u1E57': 'p',
        +    '\u01A5': 'p',
        +    '\u1D7D': 'p',
        +    '\uA751': 'p',
        +    '\uA753': 'p',
        +    '\uA755': 'p',
        +    '\u24E0': 'q',
        +    '\uFF51': 'q',
        +    '\u024B': 'q',
        +    '\uA757': 'q',
        +    '\uA759': 'q',
        +    '\u24E1': 'r',
        +    '\uFF52': 'r',
        +    '\u0155': 'r',
        +    '\u1E59': 'r',
        +    '\u0159': 'r',
        +    '\u0211': 'r',
        +    '\u0213': 'r',
        +    '\u1E5B': 'r',
        +    '\u1E5D': 'r',
        +    '\u0157': 'r',
        +    '\u1E5F': 'r',
        +    '\u024D': 'r',
        +    '\u027D': 'r',
        +    '\uA75B': 'r',
        +    '\uA7A7': 'r',
        +    '\uA783': 'r',
        +    '\u24E2': 's',
        +    '\uFF53': 's',
        +    '\u00DF': 's',
        +    '\u015B': 's',
        +    '\u1E65': 's',
        +    '\u015D': 's',
        +    '\u1E61': 's',
        +    '\u0161': 's',
        +    '\u1E67': 's',
        +    '\u1E63': 's',
        +    '\u1E69': 's',
        +    '\u0219': 's',
        +    '\u015F': 's',
        +    '\u023F': 's',
        +    '\uA7A9': 's',
        +    '\uA785': 's',
        +    '\u1E9B': 's',
        +    '\u24E3': 't',
        +    '\uFF54': 't',
        +    '\u1E6B': 't',
        +    '\u1E97': 't',
        +    '\u0165': 't',
        +    '\u1E6D': 't',
        +    '\u021B': 't',
        +    '\u0163': 't',
        +    '\u1E71': 't',
        +    '\u1E6F': 't',
        +    '\u0167': 't',
        +    '\u01AD': 't',
        +    '\u0288': 't',
        +    '\u2C66': 't',
        +    '\uA787': 't',
        +    '\uA729': 'tz',
        +    '\u24E4': 'u',
        +    '\uFF55': 'u',
        +    '\u00F9': 'u',
        +    '\u00FA': 'u',
        +    '\u00FB': 'u',
        +    '\u0169': 'u',
        +    '\u1E79': 'u',
        +    '\u016B': 'u',
        +    '\u1E7B': 'u',
        +    '\u016D': 'u',
        +    '\u00FC': 'u',
        +    '\u01DC': 'u',
        +    '\u01D8': 'u',
        +    '\u01D6': 'u',
        +    '\u01DA': 'u',
        +    '\u1EE7': 'u',
        +    '\u016F': 'u',
        +    '\u0171': 'u',
        +    '\u01D4': 'u',
        +    '\u0215': 'u',
        +    '\u0217': 'u',
        +    '\u01B0': 'u',
        +    '\u1EEB': 'u',
        +    '\u1EE9': 'u',
        +    '\u1EEF': 'u',
        +    '\u1EED': 'u',
        +    '\u1EF1': 'u',
        +    '\u1EE5': 'u',
        +    '\u1E73': 'u',
        +    '\u0173': 'u',
        +    '\u1E77': 'u',
        +    '\u1E75': 'u',
        +    '\u0289': 'u',
        +    '\u24E5': 'v',
        +    '\uFF56': 'v',
        +    '\u1E7D': 'v',
        +    '\u1E7F': 'v',
        +    '\u028B': 'v',
        +    '\uA75F': 'v',
        +    '\u028C': 'v',
        +    '\uA761': 'vy',
        +    '\u24E6': 'w',
        +    '\uFF57': 'w',
        +    '\u1E81': 'w',
        +    '\u1E83': 'w',
        +    '\u0175': 'w',
        +    '\u1E87': 'w',
        +    '\u1E85': 'w',
        +    '\u1E98': 'w',
        +    '\u1E89': 'w',
        +    '\u2C73': 'w',
        +    '\u24E7': 'x',
        +    '\uFF58': 'x',
        +    '\u1E8B': 'x',
        +    '\u1E8D': 'x',
        +    '\u24E8': 'y',
        +    '\uFF59': 'y',
        +    '\u1EF3': 'y',
        +    '\u00FD': 'y',
        +    '\u0177': 'y',
        +    '\u1EF9': 'y',
        +    '\u0233': 'y',
        +    '\u1E8F': 'y',
        +    '\u00FF': 'y',
        +    '\u1EF7': 'y',
        +    '\u1E99': 'y',
        +    '\u1EF5': 'y',
        +    '\u01B4': 'y',
        +    '\u024F': 'y',
        +    '\u1EFF': 'y',
        +    '\u24E9': 'z',
        +    '\uFF5A': 'z',
        +    '\u017A': 'z',
        +    '\u1E91': 'z',
        +    '\u017C': 'z',
        +    '\u017E': 'z',
        +    '\u1E93': 'z',
        +    '\u1E95': 'z',
        +    '\u01B6': 'z',
        +    '\u0225': 'z',
        +    '\u0240': 'z',
        +    '\u2C6C': 'z',
        +    '\uA763': 'z',
        +    '\u0386': '\u0391',
        +    '\u0388': '\u0395',
        +    '\u0389': '\u0397',
        +    '\u038A': '\u0399',
        +    '\u03AA': '\u0399',
        +    '\u038C': '\u039F',
        +    '\u038E': '\u03A5',
        +    '\u03AB': '\u03A5',
        +    '\u038F': '\u03A9',
        +    '\u03AC': '\u03B1',
        +    '\u03AD': '\u03B5',
        +    '\u03AE': '\u03B7',
        +    '\u03AF': '\u03B9',
        +    '\u03CA': '\u03B9',
        +    '\u0390': '\u03B9',
        +    '\u03CC': '\u03BF',
        +    '\u03CD': '\u03C5',
        +    '\u03CB': '\u03C5',
        +    '\u03B0': '\u03C5',
        +    '\u03C9': '\u03C9',
        +    '\u03C2': '\u03C3'
        +  };
        +
        +  return diacritics;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown.js b/bower_components/select2/src/js/select2/dropdown.js
        new file mode 100644
        index 0000000000..a6fc40bce7
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown.js
        @@ -0,0 +1,42 @@
        +define([
        +  'jquery',
        +  './utils'
        +], function ($, Utils) {
        +  function Dropdown ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    Dropdown.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(Dropdown, Utils.Observable);
        +
        +  Dropdown.prototype.render = function () {
        +    var $dropdown = $(
        +      '<span class="select2-dropdown">' +
        +        '<span class="select2-results"></span>' +
        +      '</span>'
        +    );
        +
        +    $dropdown.attr('dir', this.options.get('dir'));
        +
        +    this.$dropdown = $dropdown;
        +
        +    return $dropdown;
        +  };
        +
        +  Dropdown.prototype.bind = function () {
        +    // Should be implemented in subclasses
        +  };
        +
        +  Dropdown.prototype.position = function ($dropdown, $container) {
        +    // Should be implmented in subclasses
        +  };
        +
        +  Dropdown.prototype.destroy = function () {
        +    // Remove the dropdown from the DOM
        +    this.$dropdown.remove();
        +  };
        +
        +  return Dropdown;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/attachBody.js b/bower_components/select2/src/js/select2/dropdown/attachBody.js
        new file mode 100644
        index 0000000000..70a10d40d0
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/attachBody.js
        @@ -0,0 +1,222 @@
        +define([
        +  'jquery',
        +  '../utils'
        +], function ($, Utils) {
        +  function AttachBody (decorated, $element, options) {
        +    this.$dropdownParent = options.get('dropdownParent') || $(document.body);
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  AttachBody.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    var setupResultsEvents = false;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('open', function () {
        +      self._showDropdown();
        +      self._attachPositioningHandler(container);
        +
        +      if (!setupResultsEvents) {
        +        setupResultsEvents = true;
        +
        +        container.on('results:all', function () {
        +          self._positionDropdown();
        +          self._resizeDropdown();
        +        });
        +
        +        container.on('results:append', function () {
        +          self._positionDropdown();
        +          self._resizeDropdown();
        +        });
        +      }
        +    });
        +
        +    container.on('close', function () {
        +      self._hideDropdown();
        +      self._detachPositioningHandler(container);
        +    });
        +
        +    this.$dropdownContainer.on('mousedown', function (evt) {
        +      evt.stopPropagation();
        +    });
        +  };
        +
        +  AttachBody.prototype.destroy = function (decorated) {
        +    decorated.call(this);
        +
        +    this.$dropdownContainer.remove();
        +  };
        +
        +  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
        +    // Clone all of the container classes
        +    $dropdown.attr('class', $container.attr('class'));
        +
        +    $dropdown.removeClass('select2');
        +    $dropdown.addClass('select2-container--open');
        +
        +    $dropdown.css({
        +      position: 'absolute',
        +      top: -999999
        +    });
        +
        +    this.$container = $container;
        +  };
        +
        +  AttachBody.prototype.render = function (decorated) {
        +    var $container = $('<span></span>');
        +
        +    var $dropdown = decorated.call(this);
        +    $container.append($dropdown);
        +
        +    this.$dropdownContainer = $container;
        +
        +    return $container;
        +  };
        +
        +  AttachBody.prototype._hideDropdown = function (decorated) {
        +    this.$dropdownContainer.detach();
        +  };
        +
        +  AttachBody.prototype._attachPositioningHandler =
        +      function (decorated, container) {
        +    var self = this;
        +
        +    var scrollEvent = 'scroll.select2.' + container.id;
        +    var resizeEvent = 'resize.select2.' + container.id;
        +    var orientationEvent = 'orientationchange.select2.' + container.id;
        +
        +    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        +    $watchers.each(function () {
        +      $(this).data('select2-scroll-position', {
        +        x: $(this).scrollLeft(),
        +        y: $(this).scrollTop()
        +      });
        +    });
        +
        +    $watchers.on(scrollEvent, function (ev) {
        +      var position = $(this).data('select2-scroll-position');
        +      $(this).scrollTop(position.y);
        +    });
        +
        +    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
        +      function (e) {
        +      self._positionDropdown();
        +      self._resizeDropdown();
        +    });
        +  };
        +
        +  AttachBody.prototype._detachPositioningHandler =
        +      function (decorated, container) {
        +    var scrollEvent = 'scroll.select2.' + container.id;
        +    var resizeEvent = 'resize.select2.' + container.id;
        +    var orientationEvent = 'orientationchange.select2.' + container.id;
        +
        +    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        +    $watchers.off(scrollEvent);
        +
        +    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
        +  };
        +
        +  AttachBody.prototype._positionDropdown = function () {
        +    var $window = $(window);
        +
        +    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
        +    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
        +
        +    var newDirection = null;
        +
        +    var offset = this.$container.offset();
        +
        +    offset.bottom = offset.top + this.$container.outerHeight(false);
        +
        +    var container = {
        +      height: this.$container.outerHeight(false)
        +    };
        +
        +    container.top = offset.top;
        +    container.bottom = offset.top + container.height;
        +
        +    var dropdown = {
        +      height: this.$dropdown.outerHeight(false)
        +    };
        +
        +    var viewport = {
        +      top: $window.scrollTop(),
        +      bottom: $window.scrollTop() + $window.height()
        +    };
        +
        +    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
        +    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
        +
        +    var css = {
        +      left: offset.left,
        +      top: container.bottom
        +    };
        +
        +    // Determine what the parent element is to use for calciulating the offset
        +    var $offsetParent = this.$dropdownParent;
        +
        +    // For statically positoned elements, we need to get the element
        +    // that is determining the offset
        +    if ($offsetParent.css('position') === 'static') {
        +      $offsetParent = $offsetParent.offsetParent();
        +    }
        +
        +    var parentOffset = $offsetParent.offset();
        +
        +    css.top -= parentOffset.top;
        +    css.left -= parentOffset.left;
        +
        +    if (!isCurrentlyAbove && !isCurrentlyBelow) {
        +      newDirection = 'below';
        +    }
        +
        +    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
        +      newDirection = 'above';
        +    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
        +      newDirection = 'below';
        +    }
        +
        +    if (newDirection == 'above' ||
        +      (isCurrentlyAbove && newDirection !== 'below')) {
        +      css.top = container.top - parentOffset.top - dropdown.height;
        +    }
        +
        +    if (newDirection != null) {
        +      this.$dropdown
        +        .removeClass('select2-dropdown--below select2-dropdown--above')
        +        .addClass('select2-dropdown--' + newDirection);
        +      this.$container
        +        .removeClass('select2-container--below select2-container--above')
        +        .addClass('select2-container--' + newDirection);
        +    }
        +
        +    this.$dropdownContainer.css(css);
        +  };
        +
        +  AttachBody.prototype._resizeDropdown = function () {
        +    var css = {
        +      width: this.$container.outerWidth(false) + 'px'
        +    };
        +
        +    if (this.options.get('dropdownAutoWidth')) {
        +      css.minWidth = css.width;
        +      css.position = 'relative';
        +      css.width = 'auto';
        +    }
        +
        +    this.$dropdown.css(css);
        +  };
        +
        +  AttachBody.prototype._showDropdown = function (decorated) {
        +    this.$dropdownContainer.appendTo(this.$dropdownParent);
        +
        +    this._positionDropdown();
        +    this._resizeDropdown();
        +  };
        +
        +  return AttachBody;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/attachContainer.js b/bower_components/select2/src/js/select2/dropdown/attachContainer.js
        new file mode 100644
        index 0000000000..4995df46a2
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/attachContainer.js
        @@ -0,0 +1,18 @@
        +define([
        +
        +], function () {
        +  function AttachContainer (decorated, $element, options) {
        +    decorated.call(this, $element, options);
        +  }
        +
        +  AttachContainer.prototype.position =
        +    function (decorated, $dropdown, $container) {
        +    var $dropdownContainer = $container.find('.dropdown-wrapper');
        +    $dropdownContainer.append($dropdown);
        +
        +    $dropdown.addClass('select2-dropdown--below');
        +    $container.addClass('select2-container--below');
        +  };
        +
        +  return AttachContainer;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/closeOnSelect.js b/bower_components/select2/src/js/select2/dropdown/closeOnSelect.js
        new file mode 100644
        index 0000000000..fa6a82c43c
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/closeOnSelect.js
        @@ -0,0 +1,35 @@
        +define([
        +
        +], function () {
        +  function CloseOnSelect () { }
        +
        +  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('select', function (evt) {
        +      self._selectTriggered(evt);
        +    });
        +
        +    container.on('unselect', function (evt) {
        +      self._selectTriggered(evt);
        +    });
        +  };
        +
        +  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
        +    var originalEvent = evt.originalEvent;
        +
        +    // Don't close if the control key is being held
        +    if (originalEvent && originalEvent.ctrlKey) {
        +      return;
        +    }
        +
        +    this.trigger('close', {
        +      originalEvent: originalEvent,
        +      originalSelect2Event: evt
        +    });
        +  };
        +
        +  return CloseOnSelect;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/hidePlaceholder.js b/bower_components/select2/src/js/select2/dropdown/hidePlaceholder.js
        new file mode 100644
        index 0000000000..2901f68886
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/hidePlaceholder.js
        @@ -0,0 +1,42 @@
        +define([
        +
        +], function () {
        +  function HidePlaceholder (decorated, $element, options, dataAdapter) {
        +    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +  }
        +
        +  HidePlaceholder.prototype.append = function (decorated, data) {
        +    data.results = this.removePlaceholder(data.results);
        +
        +    decorated.call(this, data);
        +  };
        +
        +  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
        +    if (typeof placeholder === 'string') {
        +      placeholder = {
        +        id: '',
        +        text: placeholder
        +      };
        +    }
        +
        +    return placeholder;
        +  };
        +
        +  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
        +    var modifiedData = data.slice(0);
        +
        +    for (var d = data.length - 1; d >= 0; d--) {
        +      var item = data[d];
        +
        +      if (this.placeholder.id === item.id) {
        +        modifiedData.splice(d, 1);
        +      }
        +    }
        +
        +    return modifiedData;
        +  };
        +
        +  return HidePlaceholder;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/infiniteScroll.js b/bower_components/select2/src/js/select2/dropdown/infiniteScroll.js
        new file mode 100644
        index 0000000000..41d85de0b3
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/infiniteScroll.js
        @@ -0,0 +1,89 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function InfiniteScroll (decorated, $element, options, dataAdapter) {
        +    this.lastParams = {};
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +
        +    this.$loadingMore = this.createLoadingMore();
        +    this.loading = false;
        +  }
        +
        +  InfiniteScroll.prototype.append = function (decorated, data) {
        +    this.$loadingMore.remove();
        +    this.loading = false;
        +
        +    decorated.call(this, data);
        +
        +    if (this.showLoadingMore(data)) {
        +      this.$results.append(this.$loadingMore);
        +    }
        +  };
        +
        +  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('query', function (params) {
        +      self.lastParams = params;
        +      self.loading = true;
        +    });
        +
        +    container.on('query:append', function (params) {
        +      self.lastParams = params;
        +      self.loading = true;
        +    });
        +
        +    this.$results.on('scroll', function () {
        +      var isLoadMoreVisible = $.contains(
        +        document.documentElement,
        +        self.$loadingMore[0]
        +      );
        +
        +      if (self.loading || !isLoadMoreVisible) {
        +        return;
        +      }
        +
        +      var currentOffset = self.$results.offset().top +
        +        self.$results.outerHeight(false);
        +      var loadingMoreOffset = self.$loadingMore.offset().top +
        +        self.$loadingMore.outerHeight(false);
        +
        +      if (currentOffset + 50 >= loadingMoreOffset) {
        +        self.loadMore();
        +      }
        +    });
        +  };
        +
        +  InfiniteScroll.prototype.loadMore = function () {
        +    this.loading = true;
        +
        +    var params = $.extend({}, {page: 1}, this.lastParams);
        +
        +    params.page++;
        +
        +    this.trigger('query:append', params);
        +  };
        +
        +  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
        +    return data.pagination && data.pagination.more;
        +  };
        +
        +  InfiniteScroll.prototype.createLoadingMore = function () {
        +    var $option = $(
        +      '<li ' +
        +      'class="select2-results__option select2-results__option--load-more"' +
        +      'role="treeitem" aria-disabled="true"></li>'
        +    );
        +
        +    var message = this.options.get('translations').get('loadingMore');
        +
        +    $option.html(message(this.lastParams));
        +
        +    return $option;
        +  };
        +
        +  return InfiniteScroll;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/minimumResultsForSearch.js b/bower_components/select2/src/js/select2/dropdown/minimumResultsForSearch.js
        new file mode 100644
        index 0000000000..b3625d48bc
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/minimumResultsForSearch.js
        @@ -0,0 +1,39 @@
        +define([
        +
        +], function () {
        +  function countResults (data) {
        +    var count = 0;
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var item = data[d];
        +
        +      if (item.children) {
        +        count += countResults(item.children);
        +      } else {
        +        count++;
        +      }
        +    }
        +
        +    return count;
        +  }
        +
        +  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
        +    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
        +
        +    if (this.minimumResultsForSearch < 0) {
        +      this.minimumResultsForSearch = Infinity;
        +    }
        +
        +    decorated.call(this, $element, options, dataAdapter);
        +  }
        +
        +  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
        +    if (countResults(params.data.results) < this.minimumResultsForSearch) {
        +      return false;
        +    }
        +
        +    return decorated.call(this, params);
        +  };
        +
        +  return MinimumResultsForSearch;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/search.js b/bower_components/select2/src/js/select2/dropdown/search.js
        new file mode 100644
        index 0000000000..3e9df401df
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/search.js
        @@ -0,0 +1,101 @@
        +define([
        +  'jquery',
        +  '../utils'
        +], function ($, Utils) {
        +  function Search () { }
        +
        +  Search.prototype.render = function (decorated) {
        +    var $rendered = decorated.call(this);
        +
        +    var $search = $(
        +      '<span class="select2-search select2-search--dropdown">' +
        +        '<input class="select2-search__field" type="search" tabindex="-1"' +
        +        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        +        ' spellcheck="false" role="textbox" />' +
        +      '</span>'
        +    );
        +
        +    this.$searchContainer = $search;
        +    this.$search = $search.find('input');
        +
        +    $rendered.prepend($search);
        +
        +    return $rendered;
        +  };
        +
        +  Search.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    this.$search.on('keydown', function (evt) {
        +      self.trigger('keypress', evt);
        +
        +      self._keyUpPrevented = evt.isDefaultPrevented();
        +    });
        +
        +    // Workaround for browsers which do not support the `input` event
        +    // This will prevent double-triggering of events for browsers which support
        +    // both the `keyup` and `input` events.
        +    this.$search.on('input', function (evt) {
        +      // Unbind the duplicated `keyup` event
        +      $(this).off('keyup');
        +    });
        +
        +    this.$search.on('keyup input', function (evt) {
        +      self.handleSearch(evt);
        +    });
        +
        +    container.on('open', function () {
        +      self.$search.attr('tabindex', 0);
        +
        +      self.$search.focus();
        +
        +      window.setTimeout(function () {
        +        self.$search.focus();
        +      }, 0);
        +    });
        +
        +    container.on('close', function () {
        +      self.$search.attr('tabindex', -1);
        +
        +      self.$search.val('');
        +    });
        +
        +    container.on('focus', function () {
        +      if (container.isOpen()) {
        +        self.$search.focus();
        +      }
        +    });
        +
        +    container.on('results:all', function (params) {
        +      if (params.query.term == null || params.query.term === '') {
        +        var showSearch = self.showSearch(params);
        +
        +        if (showSearch) {
        +          self.$searchContainer.removeClass('select2-search--hide');
        +        } else {
        +          self.$searchContainer.addClass('select2-search--hide');
        +        }
        +      }
        +    });
        +  };
        +
        +  Search.prototype.handleSearch = function (evt) {
        +    if (!this._keyUpPrevented) {
        +      var input = this.$search.val();
        +
        +      this.trigger('query', {
        +        term: input
        +      });
        +    }
        +
        +    this._keyUpPrevented = false;
        +  };
        +
        +  Search.prototype.showSearch = function (_, params) {
        +    return true;
        +  };
        +
        +  return Search;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/selectOnClose.js b/bower_components/select2/src/js/select2/dropdown/selectOnClose.js
        new file mode 100644
        index 0000000000..430c0329b5
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/selectOnClose.js
        @@ -0,0 +1,50 @@
        +define([
        +
        +], function () {
        +  function SelectOnClose () { }
        +
        +  SelectOnClose.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('close', function (params) {
        +      self._handleSelectOnClose(params);
        +    });
        +  };
        +
        +  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
        +    if (params && params.originalSelect2Event != null) {
        +      var event = params.originalSelect2Event;
        +
        +      // Don't select an item if the close event was triggered from a select or
        +      // unselect event
        +      if (event._type === 'select' || event._type === 'unselect') {
        +        return;
        +      }
        +    }
        +
        +    var $highlightedResults = this.getHighlightedResults();
        +
        +    // Only select highlighted results
        +    if ($highlightedResults.length < 1) {
        +      return;
        +    }
        +
        +    var data = $highlightedResults.data('data');
        +
        +    // Don't re-select already selected resulte
        +    if (
        +      (data.element != null && data.element.selected) ||
        +      (data.element == null && data.selected)
        +    ) {
        +      return;
        +    }
        +
        +    this.trigger('select', {
        +        data: data
        +    });
        +  };
        +
        +  return SelectOnClose;
        +});
        diff --git a/bower_components/select2/src/js/select2/dropdown/stopPropagation.js b/bower_components/select2/src/js/select2/dropdown/stopPropagation.js
        new file mode 100644
        index 0000000000..4f641827fb
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/dropdown/stopPropagation.js
        @@ -0,0 +1,38 @@
        +define([
        +
        +], function () {
        +  function StopPropagation () { }
        +
        +  StopPropagation.prototype.bind = function (decorated, container, $container) {
        +    decorated.call(this, container, $container);
        +
        +    var stoppedEvents = [
        +    'blur',
        +    'change',
        +    'click',
        +    'dblclick',
        +    'focus',
        +    'focusin',
        +    'focusout',
        +    'input',
        +    'keydown',
        +    'keyup',
        +    'keypress',
        +    'mousedown',
        +    'mouseenter',
        +    'mouseleave',
        +    'mousemove',
        +    'mouseover',
        +    'mouseup',
        +    'search',
        +    'touchend',
        +    'touchstart'
        +    ];
        +
        +    this.$dropdown.on(stoppedEvents.join(' '), function (evt) {
        +      evt.stopPropagation();
        +    });
        +  };
        +
        +  return StopPropagation;
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/ar.js b/bower_components/select2/src/js/select2/i18n/ar.js
        new file mode 100644
        index 0000000000..b7d44f4785
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/ar.js
        @@ -0,0 +1,36 @@
        +define(function () {
        +  // Arabic
        +  return {
        +    errorLoading: function () {
        +      return 'لا يمكن تحميل النتائج';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'الرجاء حذف ' + overChars + ' عناصر';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'الرجاء إضافة ' + remainingChars + ' عناصر';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'جاري تحميل نتائج إضافية...';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'تستطيع إختيار ' + args.maximum + ' بنود فقط';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'لم يتم العثور على أي نتائج';
        +    },
        +    searching: function () {
        +      return 'جاري البحث…';
        +    }
        +  };
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/src/js/select2/i18n/az.js b/bower_components/select2/src/js/select2/i18n/az.js
        new file mode 100644
        index 0000000000..0d9bda4357
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/az.js
        @@ -0,0 +1,27 @@
        +define(function () {
        +  // Azerbaijani
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return overChars + ' simvol silin';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      return remainingChars + ' simvol daxil edin';
        +    },
        +    loadingMore: function () {
        +      return 'Daha çox nəticə yüklənir…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Sadəcə ' + args.maximum + ' element seçə bilərsiniz';
        +    },
        +    noResults: function () {
        +      return 'Nəticə tapılmadı';
        +    },
        +    searching: function () {
        +      return 'Axtarılır…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/bg.js b/bower_components/select2/src/js/select2/i18n/bg.js
        new file mode 100644
        index 0000000000..909b4e55d0
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/bg.js
        @@ -0,0 +1,47 @@
        +define(function () {
        +  // Bulgarian
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Моля въведете с ' + overChars + ' по-малко символ';
        +
        +      if (overChars > 1) {
        +        message += 'a';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Моля въведете още ' + remainingChars + ' символ';
        +
        +      if (remainingChars > 1) {
        +        message += 'a';
        +      }
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Зареждат се още…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Можете да направите до ' + args.maximum + ' ';
        +
        +      if (args.maximum > 1) {
        +        message += 'избора';
        +      } else {
        +        message += 'избор';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Няма намерени съвпадения';
        +    },
        +    searching: function () {
        +      return 'Търсене…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/ca.js b/bower_components/select2/src/js/select2/i18n/ca.js
        new file mode 100644
        index 0000000000..7aa8cc6a46
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/ca.js
        @@ -0,0 +1,52 @@
        +define(function () {
        +  // Catalan
        +  return {
        +    errorLoading: function () {
        +      return 'La càrrega ha fallat';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Si us plau, elimina ' + overChars + ' car';
        +
        +      if (overChars == 1) {
        +        message += 'àcter';
        +      } else {
        +        message += 'àcters';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Si us plau, introdueix ' + remainingChars + ' car';
        +
        +      if (remainingChars == 1) {
        +        message += 'àcter';
        +      } else {
        +        message += 'àcters';
        +      }
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Carregant més resultats…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Només es pot seleccionar ' + args.maximum + ' element';
        +
        +      if (args.maximum != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'No s\'han trobat resultats';
        +    },
        +    searching: function () {
        +      return 'Cercant…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/cs.js b/bower_components/select2/src/js/select2/i18n/cs.js
        new file mode 100644
        index 0000000000..3769e2a40c
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/cs.js
        @@ -0,0 +1,61 @@
        +define(function () {
        +  // Czech
        +  function small (count, masc) {
        +    switch(count) {
        +      case 2:
        +        return masc ? 'dva' : 'dvě';
        +      case 3:
        +        return 'tři';
        +      case 4:
        +        return 'čtyři';
        +    }
        +    return '';
        +  }
        +  return {
        +    errorLoading: function () {
        +      return 'Výsledky nemohly být načteny.';
        +    },
        +    inputTooLong: function (args) {
        +      var n = args.input.length - args.maximum;
        +
        +      if (n == 1) {
        +        return 'Prosím zadejte o jeden znak méně';
        +      } else if (n <= 4) {
        +        return 'Prosím zadejte o ' + small(n, true) + ' znaky méně';
        +      } else {
        +        return 'Prosím zadejte o ' + n + ' znaků méně';
        +      }
        +    },
        +    inputTooShort: function (args) {
        +      var n = args.minimum - args.input.length;
        +
        +      if (n == 1) {
        +        return 'Prosím zadejte ještě jeden znak';
        +      } else if (n <= 4) {
        +        return 'Prosím zadejte ještě další ' + small(n, true) + ' znaky';
        +      } else {
        +        return 'Prosím zadejte ještě dalších ' + n + ' znaků';
        +      }
        +    },
        +    loadingMore: function () {
        +      return 'Načítají se další výsledky…';
        +    },
        +    maximumSelected: function (args) {
        +      var n = args.maximum;
        +
        +      if (n == 1) {
        +        return 'Můžete zvolit jen jednu položku';
        +      } else if (n <= 4) {
        +        return 'Můžete zvolit maximálně ' + small(n, false) + ' položky';
        +      } else {
        +        return 'Můžete zvolit maximálně ' + n + ' položek';
        +      }
        +    },
        +    noResults: function () {
        +      return 'Nenalezeny žádné položky';
        +    },
        +    searching: function () {
        +      return 'Vyhledávání…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/da.js b/bower_components/select2/src/js/select2/i18n/da.js
        new file mode 100644
        index 0000000000..896d6591d0
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/da.js
        @@ -0,0 +1,40 @@
        +define(function () {
        +  // Danish
        +  return {
        +    errorLoading: function () {
        +      return 'Resultaterne kunne ikke indlæses.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Angiv venligst ' + overChars + ' tegn mindre';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Angiv venligst ' + remainingChars + ' tegn mere';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Indlæser flere resultater…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Du kan kun vælge ' + args.maximum + ' emne';
        +
        +      if (args.maximum != 1) {
        +        message += 'r';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Ingen resultater fundet';
        +    },
        +    searching: function () {
        +      return 'Søger…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/de.js b/bower_components/select2/src/js/select2/i18n/de.js
        new file mode 100644
        index 0000000000..482a2e76d5
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/de.js
        @@ -0,0 +1,37 @@
        +define(function () {
        +  // German
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Bitte ' + overChars + ' Zeichen weniger eingeben';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      return 'Bitte ' + remainingChars + ' Zeichen mehr eingeben';
        +    },
        +    loadingMore: function () {
        +      return 'Lade mehr Ergebnisse…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Sie können nur ' + args.maximum + ' Eintr';
        +
        +      if (args.maximum === 1) {
        +        message += 'ag';
        +      } else {
        +        message += 'äge';
        +      }
        +
        +      message += ' auswählen';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Keine Übereinstimmungen gefunden';
        +    },
        +    searching: function () {
        +      return 'Suche…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/el.js b/bower_components/select2/src/js/select2/i18n/el.js
        new file mode 100644
        index 0000000000..9cf8ee4888
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/el.js
        @@ -0,0 +1,52 @@
        +define(function () {
        +  // Greek (el)
        +  return {
        +    errorLoading: function () {
        +      return 'Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Παρακαλώ διαγράψτε ' + overChars + ' χαρακτήρ';
        +
        +      if (overChars == 1) {
        +        message += 'α';
        +      }
        +      if (overChars != 1) {
        +        message += 'ες';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Παρακαλώ συμπληρώστε ' + remainingChars +
        +        ' ή περισσότερους χαρακτήρες';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Φόρτωση περισσότερων αποτελεσμάτων…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Μπορείτε να επιλέξετε μόνο ' + args.maximum + ' επιλογ';
        +
        +      if (args.maximum == 1) {
        +        message += 'ή';
        +      }
        +
        +      if (args.maximum != 1) {
        +        message += 'ές';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Δεν βρέθηκαν αποτελέσματα';
        +    },
        +    searching: function () {
        +      return 'Αναζήτηση…';
        +    }
        +  };
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/src/js/select2/i18n/en.js b/bower_components/select2/src/js/select2/i18n/en.js
        new file mode 100644
        index 0000000000..f226f2c6d9
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/en.js
        @@ -0,0 +1,44 @@
        +define(function () {
        +  // English
        +  return {
        +    errorLoading: function () {
        +      return 'The results could not be loaded.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Please delete ' + overChars + ' character';
        +
        +      if (overChars != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Please enter ' + remainingChars + ' or more characters';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Loading more results…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'You can only select ' + args.maximum + ' item';
        +
        +      if (args.maximum != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'No results found';
        +    },
        +    searching: function () {
        +      return 'Searching…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/es.js b/bower_components/select2/src/js/select2/i18n/es.js
        new file mode 100644
        index 0000000000..f17826d0b4
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/es.js
        @@ -0,0 +1,52 @@
        +define(function () {
        +  // Spanish
        +  return {
        +    errorLoading: function () {
        +      return 'La carga falló';
        +    },
        +    inputTooLong: function (args) {
        +      var remainingChars = args.input.length - args.maximum;
        +
        +      var message = 'Por favor, elimine ' + remainingChars + ' car';
        +
        +      if (remainingChars == 1) {
        +        message += 'ácter';
        +      } else {
        +        message += 'acteres';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Por favor, introduzca ' + remainingChars + ' car';
        +
        +      if (remainingChars == 1) {
        +        message += 'ácter';
        +      } else {
        +        message += 'acteres';
        +      }
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Cargando más resultados…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Sólo puede seleccionar ' + args.maximum + ' elemento';
        +
        +      if (args.maximum != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'No se encontraron resultados';
        +    },
        +    searching: function () {
        +      return 'Buscando…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/et.js b/bower_components/select2/src/js/select2/i18n/et.js
        new file mode 100644
        index 0000000000..d546ade2b1
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/et.js
        @@ -0,0 +1,53 @@
        +define(function () {
        +  // Estonian
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Sisesta ' + overChars + ' täht';
        +
        +      if (overChars != 1) {
        +        message += 'e';
        +      }
        +
        +      message += ' vähem';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Sisesta ' + remainingChars + ' täht';
        +
        +      if (remainingChars != 1) {
        +        message += 'e';
        +      }
        +
        +      message += ' rohkem';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Laen tulemusi…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Saad vaid ' + args.maximum + ' tulemus';
        +
        +      if (args.maximum == 1) {
        +        message += 'e';
        +      } else {
        +        message += 't';
        +      }
        +
        +      message += ' valida';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Tulemused puuduvad';
        +    },
        +    searching: function () {
        +      return 'Otsin…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/eu.js b/bower_components/select2/src/js/select2/i18n/eu.js
        new file mode 100644
        index 0000000000..4a1f894884
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/eu.js
        @@ -0,0 +1,51 @@
        +define(function () {
        +  // Basque
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Idatzi ';
        +
        +      if (overChars == 1) {
        +        message += 'karaktere bat';
        +      } else {
        +        message += overChars + ' karaktere';
        +      }
        +
        +      message += ' gutxiago';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Idatzi ';
        +
        +      if (remainingChars == 1) {
        +        message += 'karaktere bat';
        +      } else {
        +        message += remainingChars + ' karaktere';
        +      }
        +
        +      message += ' gehiago';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Emaitza gehiago kargatzen…';
        +    },
        +    maximumSelected: function (args) {
        +      if (args.maximum === 1) {
        +        return 'Elementu bakarra hauta dezakezu';
        +      } else {
        +        return args.maximum + ' elementu hauta ditzakezu soilik';
        +      }
        +    },
        +    noResults: function () {
        +      return 'Ez da bat datorrenik aurkitu';
        +    },
        +    searching: function () {
        +      return 'Bilatzen…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/fa.js b/bower_components/select2/src/js/select2/i18n/fa.js
        new file mode 100644
        index 0000000000..64ce1a5f8f
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/fa.js
        @@ -0,0 +1,38 @@
        +/* jshint -W100 */
        +/* jslint maxlen: 86 */
        +define(function () {
        +  // Farsi (Persian)
        +  return {
        +    errorLoading: function () {
        +      return 'امکان بارگذاری نتایج وجود ندارد.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'لطفاً ' + overChars + ' کاراکتر را حذف نمایید';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'لطفاً تعداد ' + remainingChars + ' کاراکتر یا بیشتر وارد نمایید';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'در حال بارگذاری نتایج بیشتر...';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'شما تنها می‌توانید ' + args.maximum + ' آیتم را انتخاب نمایید';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'هیچ نتیجه‌ای یافت نشد';
        +    },
        +    searching: function () {
        +      return 'در حال جستجو...';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/fi.js b/bower_components/select2/src/js/select2/i18n/fi.js
        new file mode 100644
        index 0000000000..94605afd39
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/fi.js
        @@ -0,0 +1,27 @@
        +define(function () {
        +  // Finnish
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Ole hyvä ja anna ' + overChars + ' merkkiä vähemmän';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      return 'Ole hyvä ja anna ' + remainingChars + ' merkkiä lisää';
        +    },
        +    loadingMore: function () {
        +      return 'Ladataan lisää tuloksia…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Voit valita ainoastaan ' + args.maximum + ' kpl';
        +    },
        +    noResults: function () {
        +      return 'Ei tuloksia';
        +    },
        +    searching: function () {
        +
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/fr.js b/bower_components/select2/src/js/select2/i18n/fr.js
        new file mode 100644
        index 0000000000..0f4fbdc2fb
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/fr.js
        @@ -0,0 +1,49 @@
        +define(function () {
        +  // French
        +  return {
        +    errorLoading: function () {
        +      return 'Les résultats ne peuvent pas être chargés.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Supprimez ' + overChars + ' caractère';
        +
        +      if (overChars !== 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Saisissez ' + remainingChars + ' caractère';
        +
        +      if (remainingChars !== 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Chargement de résultats supplémentaires…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Vous pouvez seulement sélectionner ' +
        +        args.maximum + ' élément';
        +
        +      if (args.maximum !== 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Aucun résultat trouvé';
        +    },
        +    searching: function () {
        +      return 'Recherche en cours…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/gl.js b/bower_components/select2/src/js/select2/i18n/gl.js
        new file mode 100644
        index 0000000000..1d89f0a022
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/gl.js
        @@ -0,0 +1,51 @@
        +define(function () {
        +  // Galician
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Elimine ';
        +
        +      if (overChars === 1) {
        +        message += 'un carácter';
        +      } else {
        +        message += overChars + ' caracteres';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Engada ';
        +
        +      if (remainingChars === 1) {
        +        message += 'un carácter';
        +      } else {
        +        message += remainingChars + ' caracteres';
        +      }
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Cargando máis resultados…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Só pode ';
        +
        +      if (args.maximum === 1) {
        +        message += 'un elemento';
        +      } else {
        +        message += args.maximum + ' elementos';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Non se atoparon resultados';
        +    },
        +    searching: function () {
        +      return 'Buscando…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/he.js b/bower_components/select2/src/js/select2/i18n/he.js
        new file mode 100644
        index 0000000000..5a27f8199f
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/he.js
        @@ -0,0 +1,56 @@
        +define(function () {
        +  // Hebrew
        +  return {
        +    errorLoading: function () {
        +      return 'שגיאה בטעינת התוצאות';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'נא למחוק ';
        +
        +      if (overChars === 1) {
        +        message += 'תו אחד';
        +      } else {
        +        message += overChars + ' תווים';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'נא להכניס ';
        +
        +      if (remainingChars === 1) {
        +        message += 'תו אחד';
        +      } else {
        +        message += remainingChars + ' תווים';
        +      }
        +
        +      message += ' או יותר';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'טוען תוצאות נוספות…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'באפשרותך לבחור עד ';
        +
        +      if (args.maximum === 1) {
        +        message += 'פריט אחד';
        +      } else {
        +        message += args.maximum + ' פריטים';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'לא נמצאו תוצאות';
        +    },
        +    searching: function () {
        +      return 'מחפש…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/hi.js b/bower_components/select2/src/js/select2/i18n/hi.js
        new file mode 100644
        index 0000000000..e8ee153322
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/hi.js
        @@ -0,0 +1,39 @@
        +define(function () {
        +  // Hindi
        +  return {
        +    errorLoading: function () {
        +      return 'परिणामों को लोड नहीं किया जा सका।';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message =  overChars + ' अक्षर को हटा दें';
        +
        +      if (overChars > 1) {
        +        message = overChars + ' अक्षरों को हटा दें ';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'कृपया ' + remainingChars + ' या अधिक अक्षर दर्ज करें';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'अधिक परिणाम लोड हो रहे है...';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'आप केवल ' + args.maximum + ' आइटम का चयन कर सकते हैं';
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'कोई परिणाम नहीं मिला';
        +    },
        +    searching: function () {
        +      return 'खोज रहा है...';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/hr.js b/bower_components/select2/src/js/select2/i18n/hr.js
        new file mode 100644
        index 0000000000..81462a5ca5
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/hr.js
        @@ -0,0 +1,44 @@
        +define(function () {
        +  // Croatian
        +  function character (n) {
        +    var message = ' ' + n + ' znak';
        +
        +    if (n % 10 < 5 && n % 10 > 0 && (n % 100 < 5 || n % 100 > 19)) {
        +      if (n % 10 > 1) {
        +        message += 'a';
        +      }
        +    } else {
        +      message += 'ova';
        +    }
        +
        +    return message;
        +  }
        +
        +  return {
        +    errorLoading: function () {
        +      return 'Preuzimanje nije uspjelo.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Unesite ' + character(overChars);
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      return 'Unesite još ' + character(remainingChars);
        +    },
        +    loadingMore: function () {
        +      return 'Učitavanje rezultata…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Maksimalan broj odabranih stavki je ' + args.maximum;
        +    },
        +    noResults: function () {
        +      return 'Nema rezultata';
        +    },
        +    searching: function () {
        +      return 'Pretraga…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/hu.js b/bower_components/select2/src/js/select2/i18n/hu.js
        new file mode 100644
        index 0000000000..3fd8ada4be
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/hu.js
        @@ -0,0 +1,27 @@
        +define(function () {
        +  // Hungarian
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Túl hosszú. ' + overChars + ' karakterrel több, mint kellene.';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      return 'Túl rövid. Még ' + remainingChars + ' karakter hiányzik.';
        +    },
        +    loadingMore: function () {
        +      return 'Töltés…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Csak ' + args.maximum + ' elemet lehet kiválasztani.';
        +    },
        +    noResults: function () {
        +      return 'Nincs találat.';
        +    },
        +    searching: function () {
        +      return 'Keresés…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/id.js b/bower_components/select2/src/js/select2/i18n/id.js
        new file mode 100644
        index 0000000000..43b632e5bf
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/id.js
        @@ -0,0 +1,30 @@
        +define(function () {
        +  // Indonesian
        +  return {
        +    errorLoading: function () {
        +      return 'Data tidak boleh diambil.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Hapuskan ' + overChars + ' huruf';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      return 'Masukkan ' + remainingChars + ' huruf lagi';
        +    },
        +    loadingMore: function () {
        +      return 'Mengambil data…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Anda hanya dapat memilih ' + args.maximum + ' pilihan';
        +    },
        +    noResults: function () {
        +      return 'Tidak ada data yang sesuai';
        +    },
        +    searching: function () {
        +      return 'Mencari…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/is.js b/bower_components/select2/src/js/select2/i18n/is.js
        new file mode 100644
        index 0000000000..7a835f5aeb
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/is.js
        @@ -0,0 +1,41 @@
        +define(function () {
        +  // Icelandic
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Vinsamlegast styttið texta um ' + overChars + ' staf';
        +
        +      if (overChars <= 1) {
        +        return message;
        +      }
        +
        +      return message + 'i';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Vinsamlegast skrifið ' + remainingChars + ' staf';
        +
        +      if (remainingChars > 1) {
        +        message += 'i';
        +      }
        +
        +      message += ' í viðbót';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Sæki fleiri niðurstöður…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Þú getur aðeins valið ' + args.maximum + ' atriði';
        +    },
        +    noResults: function () {
        +      return 'Ekkert fannst';
        +    },
        +    searching: function () {
        +      return 'Leita…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/it.js b/bower_components/select2/src/js/select2/i18n/it.js
        new file mode 100644
        index 0000000000..76c2e4bc11
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/it.js
        @@ -0,0 +1,48 @@
        +define(function () {
        +  // Italian
        +  return {
        +    errorLoading: function () {
        +      return 'I risultati non possono essere caricati.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Per favore cancella ' + overChars + ' caratter';
        +
        +      if (overChars !== 1) {
        +        message += 'i';
        +      } else {
        +        message += 'e';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Per favore inserisci ' +remainingChars+ ' o più caratteri';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Caricando più risultati…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Puoi selezionare solo ' + args.maximum + ' element';
        +
        +      if (args.maximum !== 1) {
        +        message += 'i';
        +      } else {
        +        message += 'o';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Nessun risultato trovato';
        +    },
        +    searching: function () {
        +      return 'Sto cercando…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/ja.js b/bower_components/select2/src/js/select2/i18n/ja.js
        new file mode 100644
        index 0000000000..c954c4f49e
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/ja.js
        @@ -0,0 +1,36 @@
        +define(function () {
        +  // Japanese
        +  return {
        +    errorLoading: function () {
        +      return '結果が読み込まれませんでした';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = overChars + ' 文字を削除してください';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = '少なくとも ' + remainingChars + ' 文字を入力してください';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return '読み込み中…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = args.maximum + ' 件しか選択できません';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return '対象が見つかりません';
        +    },
        +    searching: function () {
        +      return '検索しています…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/km.js b/bower_components/select2/src/js/select2/i18n/km.js
        new file mode 100644
        index 0000000000..10e3d7e13f
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/km.js
        @@ -0,0 +1,36 @@
        +define(function () {
        +  // Khmer
        +  return {
        +    errorLoading: function () {
        +      return 'មិនអាចទាញយកទិន្នន័យ';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'សូមលុបចេញ  ' + overChars + ' អក្សរ';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'សូមបញ្ចូល' + remainingChars + ' អក្សរ រឺ ច្រើនជាងនេះ';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'កំពុងទាញយកទិន្នន័យបន្ថែម...';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'អ្នកអាចជ្រើសរើសបានតែ ' + args.maximum + ' ជម្រើសប៉ុណ្ណោះ';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'មិនមានលទ្ធផល';
        +    },
        +    searching: function () {
        +      return 'កំពុងស្វែងរក...';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/ko.js b/bower_components/select2/src/js/select2/i18n/ko.js
        new file mode 100644
        index 0000000000..9a2de10904
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/ko.js
        @@ -0,0 +1,36 @@
        +define(function () {
        +  // Korean
        +  return {
        +    errorLoading: function () {
        +      return '결과를 불러올 수 없습니다.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = '너무 깁니다. ' + overChars + ' 글자 지워주세요.';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = '너무 짧습니다. ' + remainingChars + ' 글자 더 입력해주세요.';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return '불러오는 중…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = '최대 ' + args.maximum + '개까지만 선택 가능합니다.';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return '결과가 없습니다.';
        +    },
        +    searching: function () {
        +      return '검색 중…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/lt.js b/bower_components/select2/src/js/select2/i18n/lt.js
        new file mode 100644
        index 0000000000..500a519ab2
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/lt.js
        @@ -0,0 +1,52 @@
        +define(function () {
        +  // rules from
        +  // http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#lt
        +  function ending(count, one, few, other) {
        +    if (count % 10 === 1 && (count % 100 < 11 || count % 100 > 19)) {
        +      return one;
        +    } else if (
        +      (count % 10 >= 2 && count % 10 <= 9) &&
        +      (count % 100 < 11 || count % 100 > 19)) {
        +      return few;
        +    } else {
        +      return other;
        +    }
        +  }
        +
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Pašalinkite ' + overChars + ' simbol';
        +
        +      message += ending(overChars, 'į', 'ius', 'ių');
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Įrašykite dar ' + remainingChars + ' simbol';
        +
        +      message += ending(remainingChars, 'į', 'ius', 'ių');
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Kraunama daugiau rezultatų…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Jūs galite pasirinkti tik ' + args.maximum + ' element';
        +
        +      message += ending(args.maximum, 'ą', 'us', 'ų');
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Atitikmenų nerasta';
        +    },
        +    searching: function () {
        +      return 'Ieškoma…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/lv.js b/bower_components/select2/src/js/select2/i18n/lv.js
        new file mode 100644
        index 0000000000..560cab0fc3
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/lv.js
        @@ -0,0 +1,51 @@
        +define(function () {
        +  // Latvian
        +  function ending (count, eleven, singular, other) {
        +    if (count === 11) {
        +      return eleven;
        +    }
        +
        +    if (count % 10 === 1) {
        +      return singular;
        +    }
        +
        +    return other;
        +  }
        +
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Lūdzu ievadiet par  ' + overChars;
        +
        +      message += ' simbol' + ending(overChars, 'iem', 'u', 'iem');
        +
        +      return message + ' mazāk';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Lūdzu ievadiet vēl ' + remainingChars;
        +
        +      message += ' simbol' + ending(remainingChars, 'us', 'u', 'us');
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Datu ielāde…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Jūs varat izvēlēties ne vairāk kā ' + args.maximum;
        +
        +      message += ' element' + ending(args.maximum, 'us', 'u', 'us');
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Sakritību nav';
        +    },
        +    searching: function () {
        +      return 'Meklēšana…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/mk.js b/bower_components/select2/src/js/select2/i18n/mk.js
        new file mode 100644
        index 0000000000..a27f0e8144
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/mk.js
        @@ -0,0 +1,47 @@
        +define(function () {
        +  // Macedonian
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Ве молиме внесете ' + args.maximum + ' помалку карактер';
        +
        +      if (args.maximum !== 1) {
        +        message += 'и';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Ве молиме внесете уште ' + args.maximum + ' карактер';
        +
        +      if (args.maximum !== 1) {
        +        message += 'и';
        +      }
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Вчитување резултати…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Можете да изберете само ' + args.maximum + ' ставк';
        +
        +      if (args.maximum === 1) {
        +        message += 'а';
        +      } else {
        +        message += 'и';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Нема пронајдено совпаѓања';
        +    },
        +    searching: function () {
        +      return 'Пребарување…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/ms.js b/bower_components/select2/src/js/select2/i18n/ms.js
        new file mode 100644
        index 0000000000..3c115621e3
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/ms.js
        @@ -0,0 +1,30 @@
        +define(function () {
        +  // Malay
        +  return {
        +    errorLoading: function () {
        +      return 'Keputusan tidak berjaya dimuatkan.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Sila hapuskan ' + overChars + ' aksara';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      return 'Sila masukkan ' + remainingChars + ' atau lebih aksara';
        +    },
        +    loadingMore: function () {
        +      return 'Sedang memuatkan keputusan…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Anda hanya boleh memilih ' + args.maximum + ' pilihan';
        +    },
        +    noResults: function () {
        +      return 'Tiada padanan yang ditemui';
        +    },
        +    searching: function () {
        +      return 'Mencari…';
        +    }
        +  };
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/src/js/select2/i18n/nb.js b/bower_components/select2/src/js/select2/i18n/nb.js
        new file mode 100644
        index 0000000000..2b7fe16f86
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/nb.js
        @@ -0,0 +1,38 @@
        +define(function () {
        +  // Norwegian (Bokmål)
        +  return {
        +    errorLoading: function () {
        +      return 'Kunne ikke hente resultater.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Vennligst fjern ' + overChars + ' tegn';
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Vennligst skriv inn ';
        +
        +      if (remainingChars > 1) {
        +        message += ' flere tegn';
        +      } else {
        +        message += ' tegn til';
        +      }
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Laster flere resultater…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Du kan velge maks ' + args.maximum + ' elementer';
        +    },
        +    noResults: function () {
        +      return 'Ingen treff';
        +    },
        +    searching: function () {
        +      return 'Søker…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/nl.js b/bower_components/select2/src/js/select2/i18n/nl.js
        new file mode 100644
        index 0000000000..e8c016ad08
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/nl.js
        @@ -0,0 +1,43 @@
        +define(function () {
        +  // Dutch
        +  return {
        +    errorLoading: function () {
        +      return 'De resultaten konden niet worden geladen.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Gelieve ' + overChars + ' karakters te verwijderen';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Gelieve ' + remainingChars +
        +        ' of meer karakters in te voeren';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Meer resultaten laden…';
        +    },
        +    maximumSelected: function (args) {
        +      var verb = args.maximum == 1 ? 'kan' : 'kunnen';
        +      var message = 'Er ' + verb + ' maar ' + args.maximum + ' item';
        +
        +      if (args.maximum != 1) {
        +        message += 's';
        +      }
        +      message += ' worden geselecteerd';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Geen resultaten gevonden…';
        +    },
        +    searching: function () {
        +      return 'Zoeken…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/pl.js b/bower_components/select2/src/js/select2/i18n/pl.js
        new file mode 100644
        index 0000000000..030a4ddc3d
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/pl.js
        @@ -0,0 +1,45 @@
        +define(function () {
        +  // Polish
        +  var charsWords = ['znak', 'znaki', 'znaków'];
        +  var itemsWords = ['element', 'elementy', 'elementów'];
        +
        +  var pluralWord = function pluralWord(numberOfChars, words) {
        +    if (numberOfChars === 1) {
        +        return words[0];
        +    } else if (numberOfChars > 1 && numberOfChars <= 4) {
        +      return words[1];
        +    } else if (numberOfChars >= 5) {
        +      return words[2];
        +    }
        +  };
        +  
        +  return {
        +    errorLoading: function () {
        +      return 'Nie można załadować wyników.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      return 'Usuń ' + overChars + ' ' + pluralWord(overChars, charsWords);
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +      
        +      return 'Podaj przynajmniej ' + remainingChars + ' ' +
        +        pluralWord(remainingChars, charsWords);
        +    },
        +    loadingMore: function () {
        +      return 'Trwa ładowanie…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Możesz zaznaczyć tylko ' + args.maximum + ' ' +
        +        pluralWord(args.maximum, itemsWords);
        +    },
        +    noResults: function () {
        +      return 'Brak wyników';
        +    },
        +    searching: function () {
        +      return 'Trwa wyszukiwanie…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/pt-BR.js b/bower_components/select2/src/js/select2/i18n/pt-BR.js
        new file mode 100644
        index 0000000000..7f769b6922
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/pt-BR.js
        @@ -0,0 +1,46 @@
        +define(function () {
        +  // Brazilian Portuguese
        +  return {
        +    errorLoading: function () {
        +      return 'Os resultados não puderam ser carregados.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Apague ' + overChars + ' caracter';
        +
        +      if (overChars != 1) {
        +        message += 'es';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Digite ' + remainingChars + ' ou mais caracteres';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Carregando mais resultados…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Você só pode selecionar ' + args.maximum + ' ite';
        +
        +      if (args.maximum == 1) {
        +        message += 'm';
        +      } else {
        +        message += 'ns';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Nenhum resultado encontrado';
        +    },
        +    searching: function () {
        +      return 'Buscando…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/pt.js b/bower_components/select2/src/js/select2/i18n/pt.js
        new file mode 100644
        index 0000000000..4919f696b0
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/pt.js
        @@ -0,0 +1,40 @@
        +define(function () {
        +  // European Portuguese
        +  return {
        +    errorLoading: function () {
        +      return 'Os resultados não puderam ser carregados.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Por favor apague ' + overChars + ' ';
        +
        +      message += overChars != 1 ? 'caracteres' : 'carácter';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Introduza ' + remainingChars + ' ou mais caracteres';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'A carregar mais resultados…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Apenas pode seleccionar ' + args.maximum + ' ';
        +
        +      message += args.maximum != 1 ? 'itens' : 'item';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Sem resultados';
        +    },
        +    searching: function () {
        +      return 'A procurar…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/ro.js b/bower_components/select2/src/js/select2/i18n/ro.js
        new file mode 100644
        index 0000000000..d62133a0f2
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/ro.js
        @@ -0,0 +1,46 @@
        +define(function () {
        +  // Romanian
        +  return {
        +    errorLoading: function () {
        +      return 'Rezultatele nu au putut fi incărcate.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Vă rugăm să ștergeți' + overChars + ' caracter';
        +
        +      if (overChars !== 1) {
        +        message += 'e';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Vă rugăm să introduceți ' + remainingChars +
        +        'sau mai multe caractere';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Se încarcă mai multe rezultate…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Aveți voie să selectați cel mult ' + args.maximum;
        +      message += ' element';
        +
        +      if (args.maximum !== 1) {
        +        message += 'e';
        +      }
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Nu au fost găsite rezultate';
        +    },
        +    searching: function () {
        +      return 'Căutare…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/ru.js b/bower_components/select2/src/js/select2/i18n/ru.js
        new file mode 100644
        index 0000000000..2ac11ec750
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/ru.js
        @@ -0,0 +1,58 @@
        +define(function () {
        +  // Russian
        +  function ending (count, one, couple, more) {
        +    if (count % 10 < 5 && count % 10 > 0 &&
        +        count % 100 < 5 || count % 100 > 20) {
        +      if (count % 10 > 1) {
        +        return couple;
        +      }
        +    } else {
        +      return more;
        +    }
        +
        +    return one;
        +  }
        +
        +  return {
        +    errorLoading: function () {
        +      return 'Невозможно загрузить результаты';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Пожалуйста, введите на ' + overChars + ' символ';
        +
        +      message += ending(overChars, '', 'a', 'ов');
        +
        +      message += ' меньше';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Пожалуйста, введите еще хотя бы ' + remainingChars +
        +        ' символ';
        +
        +      message += ending(remainingChars, '', 'a', 'ов');
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Загрузка данных…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Вы можете выбрать не более ' + args.maximum + ' элемент';
        +
        +      message += ending(args.maximum, '', 'a', 'ов');
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Совпадений не найдено';
        +    },
        +    searching: function () {
        +      return 'Поиск…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/sk.js b/bower_components/select2/src/js/select2/i18n/sk.js
        new file mode 100644
        index 0000000000..449754e3ec
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/sk.js
        @@ -0,0 +1,56 @@
        +define(function () {
        +  // Slovak
        +
        +  // use text for the numbers 2 through 4
        +  var smallNumbers = {
        +    2: function (masc) { return (masc ? 'dva' : 'dve'); },
        +    3: function () { return 'tri'; },
        +    4: function () { return 'štyri'; }
        +  };
        +
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      if (overChars == 1) {
        +        return 'Prosím, zadajte o jeden znak menej';
        +      } else if (overChars >= 2 && overChars <= 4) {
        +        return 'Prosím, zadajte o ' + smallNumbers[overChars](true) +
        +          ' znaky menej';
        +      } else {
        +        return 'Prosím, zadajte o ' + overChars + ' znakov menej';
        +      }
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      if (remainingChars == 1) {
        +        return 'Prosím, zadajte ešte jeden znak';
        +      } else if (remainingChars <= 4) {
        +        return 'Prosím, zadajte ešte ďalšie ' +
        +          smallNumbers[remainingChars](true) + ' znaky';
        +      } else {
        +        return 'Prosím, zadajte ešte ďalších ' + remainingChars + ' znakov';
        +      }
        +    },
        +    loadingMore: function () {
        +      return 'Loading more results…';
        +    },
        +    maximumSelected: function (args) {
        +      if (args.maximum == 1) {
        +        return 'Môžete zvoliť len jednu položku';
        +      } else if (args.maximum >= 2 && args.maximum <= 4) {
        +        return 'Môžete zvoliť najviac ' + smallNumbers[args.maximum](false) +
        +          ' položky';
        +      } else {
        +        return 'Môžete zvoliť najviac ' + args.maximum + ' položiek';
        +      }
        +    },
        +    noResults: function () {
        +      return 'Nenašli sa žiadne položky';
        +    },
        +    searching: function () {
        +      return 'Vyhľadávanie…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/sr-Cyrl.js b/bower_components/select2/src/js/select2/i18n/sr-Cyrl.js
        new file mode 100644
        index 0000000000..c61184e3b3
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/sr-Cyrl.js
        @@ -0,0 +1,55 @@
        +define(function () {
        +  // Serbian Cyrilic
        +  function ending (count, one, some, many) {
        +    if (count % 10 == 1 && count % 100 != 11) {
        +      return one;
        +    }
        +
        +    if (count % 10 >= 2 && count % 10 <= 4 &&
        +      (count % 100 < 12 || count % 100 > 14)) {
        +        return some;
        +    }
        +
        +    return many;
        +  }
        +
        +  return {
        +    errorLoading: function () {
        +      return 'Преузимање није успело.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Обришите ' + overChars + ' симбол';
        +
        +      message += ending(overChars, '', 'а', 'а');
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Укуцајте бар још ' + remainingChars + ' симбол';
        +
        +      message += ending(remainingChars, '', 'а', 'а');
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Преузимање још резултата…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Можете изабрати само ' + args.maximum + ' ставк';
        +
        +      message += ending(args.maximum, 'у', 'е', 'и');
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Ништа није пронађено';
        +    },
        +    searching: function () {
        +      return 'Претрага…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/sr.js b/bower_components/select2/src/js/select2/i18n/sr.js
        new file mode 100644
        index 0000000000..7821b2b8e5
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/sr.js
        @@ -0,0 +1,55 @@
        +define(function () {
        +  // Serbian
        +  function ending (count, one, some, many) {
        +    if (count % 10 == 1 && count % 100 != 11) {
        +      return one;
        +    }
        +
        +    if (count % 10 >= 2 && count % 10 <= 4 &&
        +      (count % 100 < 12 || count % 100 > 14)) {
        +        return some;
        +    }
        +
        +    return many;
        +  }
        +
        +  return {
        +    errorLoading: function () {
        +      return 'Preuzimanje nije uspelo.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Obrišite ' + overChars + ' simbol';
        +
        +      message += ending(overChars, '', 'a', 'a');
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Ukucajte bar još ' + remainingChars + ' simbol';
        +
        +      message += ending(remainingChars, '', 'a', 'a');
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Preuzimanje još rezultata…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Možete izabrati samo ' + args.maximum + ' stavk';
        +
        +      message += ending(args.maximum, 'u', 'e', 'i');
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Ništa nije pronađeno';
        +    },
        +    searching: function () {
        +      return 'Pretraga…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/sv.js b/bower_components/select2/src/js/select2/i18n/sv.js
        new file mode 100644
        index 0000000000..42bed7e52d
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/sv.js
        @@ -0,0 +1,37 @@
        +define(function () {
        +  // Swedish
        +  return {
        +    errorLoading: function () {
        +      return 'Resultat kunde inte laddas.';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Vänligen sudda ut ' + overChars + ' tecken';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Vänligen skriv in ' + remainingChars +
        +                    ' eller fler tecken';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Laddar fler resultat…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Du kan max välja ' + args.maximum + ' element';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Inga träffar';
        +    },
        +    searching: function () {
        +      return 'Söker…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/th.js b/bower_components/select2/src/js/select2/i18n/th.js
        new file mode 100644
        index 0000000000..3f6efb7f59
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/th.js
        @@ -0,0 +1,33 @@
        +define(function () {
        +  // Thai
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'โปรดลบออก ' + overChars + ' ตัวอักษร';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'โปรดพิมพ์เพิ่มอีก ' + remainingChars + ' ตัวอักษร';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'กำลังค้นข้อมูลเพิ่ม…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'คุณสามารถเลือกได้ไม่เกิน ' + args.maximum + ' รายการ';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'ไม่พบข้อมูล';
        +    },
        +    searching: function () {
        +      return 'กำลังค้นข้อมูล…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/tr.js b/bower_components/select2/src/js/select2/i18n/tr.js
        new file mode 100644
        index 0000000000..636132f9b4
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/tr.js
        @@ -0,0 +1,33 @@
        +define(function () {
        +  // Turkish
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = overChars + ' karakter daha girmelisiniz';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'En az ' + remainingChars + ' karakter daha girmelisiniz';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Daha fazla…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Sadece ' + args.maximum + ' seçim yapabilirsiniz';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Sonuç bulunamadı';
        +    },
        +    searching: function () {
        +      return 'Aranıyor…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/uk.js b/bower_components/select2/src/js/select2/i18n/uk.js
        new file mode 100644
        index 0000000000..72067c9c7f
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/uk.js
        @@ -0,0 +1,43 @@
        +define(function () {
        +  // Ukranian
        +  function ending (count, one, couple, more) {
        +    if (count % 100 > 10 && count % 100 < 15) {
        +      return more;
        +    }
        +    if (count % 10 === 1) {
        +      return one;
        +    }
        +    if (count % 10 > 1 && count % 10 < 5) {
        +      return couple;
        +    }
        +    return more;
        +  }
        +
        +  return {
        +    errorLoading: function () {
        +      return 'Неможливо завантажити результати';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +      return 'Будь ласка, видаліть ' + overChars + ' ' +
        +        ending(args.maximum, 'літеру', 'літери', 'літер');
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +      return 'Будь ласка, введіть ' + remainingChars + ' або більше літер';
        +    },
        +    loadingMore: function () {
        +      return 'Завантаження інших результатів…';
        +    },
        +    maximumSelected: function (args) {
        +      return 'Ви можете вибрати лише ' + args.maximum + ' ' +
        +        ending(args.maximum, 'пункт', 'пункти', 'пунктів');
        +    },
        +    noResults: function () {
        +      return 'Нічого не знайдено';
        +    },
        +    searching: function () {
        +      return 'Пошук…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/vi.js b/bower_components/select2/src/js/select2/i18n/vi.js
        new file mode 100644
        index 0000000000..f50ff75b5f
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/vi.js
        @@ -0,0 +1,37 @@
        +define(function () {
        +  // Vietnamese
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = 'Vui lòng nhập ít hơn ' + overChars + ' ký tự';
        +
        +      if (overChars != 1) {
        +        message += 's';
        +      }
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = 'Vui lòng nhập nhiều hơn ' + remainingChars + ' ký tự"';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return 'Đang lấy thêm kết quả…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = 'Chỉ có thể chọn được ' + args.maximum + ' lựa chọn';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return 'Không tìm thấy kết quả';
        +    },
        +    searching: function () {
        +      return 'Đang tìm…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/zh-CN.js b/bower_components/select2/src/js/select2/i18n/zh-CN.js
        new file mode 100644
        index 0000000000..4aaec39efd
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/zh-CN.js
        @@ -0,0 +1,36 @@
        +define(function () {
        +  // Chinese (Simplified)
        +  return {
        +    errorLoading: function () {
        +      return '无法载入结果。';
        +    },
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = '请删除' + overChars + '个字符';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = '请再输入至少' + remainingChars + '个字符';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return '载入更多结果…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = '最多只能选择' + args.maximum + '个项目';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return '未找到结果';
        +    },
        +    searching: function () {
        +      return '搜索中…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/i18n/zh-TW.js b/bower_components/select2/src/js/select2/i18n/zh-TW.js
        new file mode 100644
        index 0000000000..80624f1607
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/i18n/zh-TW.js
        @@ -0,0 +1,33 @@
        +define(function () {
        +  // Chinese (Traditional)
        +  return {
        +    inputTooLong: function (args) {
        +      var overChars = args.input.length - args.maximum;
        +
        +      var message = '請刪掉' + overChars + '個字元';
        +
        +      return message;
        +    },
        +    inputTooShort: function (args) {
        +      var remainingChars = args.minimum - args.input.length;
        +
        +      var message = '請再輸入' + remainingChars + '個字元';
        +
        +      return message;
        +    },
        +    loadingMore: function () {
        +      return '載入中…';
        +    },
        +    maximumSelected: function (args) {
        +      var message = '你只能選擇最多' + args.maximum + '項';
        +
        +      return message;
        +    },
        +    noResults: function () {
        +      return '沒有找到相符的項目';
        +    },
        +    searching: function () {
        +      return '搜尋中…';
        +    }
        +  };
        +});
        diff --git a/bower_components/select2/src/js/select2/keys.js b/bower_components/select2/src/js/select2/keys.js
        new file mode 100644
        index 0000000000..f449ba4358
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/keys.js
        @@ -0,0 +1,25 @@
        +define([
        +
        +], function () {
        +  var KEYS = {
        +    BACKSPACE: 8,
        +    TAB: 9,
        +    ENTER: 13,
        +    SHIFT: 16,
        +    CTRL: 17,
        +    ALT: 18,
        +    ESC: 27,
        +    SPACE: 32,
        +    PAGE_UP: 33,
        +    PAGE_DOWN: 34,
        +    END: 35,
        +    HOME: 36,
        +    LEFT: 37,
        +    UP: 38,
        +    RIGHT: 39,
        +    DOWN: 40,
        +    DELETE: 46
        +  };
        +
        +  return KEYS;
        +});
        diff --git a/bower_components/select2/src/js/select2/options.js b/bower_components/select2/src/js/select2/options.js
        new file mode 100644
        index 0000000000..3e48deea50
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/options.js
        @@ -0,0 +1,122 @@
        +define([
        +  'require',
        +  'jquery',
        +  './defaults',
        +  './utils'
        +], function (require, $, Defaults, Utils) {
        +  function Options (options, $element) {
        +    this.options = options;
        +
        +    if ($element != null) {
        +      this.fromElement($element);
        +    }
        +
        +    this.options = Defaults.apply(this.options);
        +
        +    if ($element && $element.is('input')) {
        +      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
        +
        +      this.options.dataAdapter = Utils.Decorate(
        +        this.options.dataAdapter,
        +        InputCompat
        +      );
        +    }
        +  }
        +
        +  Options.prototype.fromElement = function ($e) {
        +    var excludedData = ['select2'];
        +
        +    if (this.options.multiple == null) {
        +      this.options.multiple = $e.prop('multiple');
        +    }
        +
        +    if (this.options.disabled == null) {
        +      this.options.disabled = $e.prop('disabled');
        +    }
        +
        +    if (this.options.language == null) {
        +      if ($e.prop('lang')) {
        +        this.options.language = $e.prop('lang').toLowerCase();
        +      } else if ($e.closest('[lang]').prop('lang')) {
        +        this.options.language = $e.closest('[lang]').prop('lang');
        +      }
        +    }
        +
        +    if (this.options.dir == null) {
        +      if ($e.prop('dir')) {
        +        this.options.dir = $e.prop('dir');
        +      } else if ($e.closest('[dir]').prop('dir')) {
        +        this.options.dir = $e.closest('[dir]').prop('dir');
        +      } else {
        +        this.options.dir = 'ltr';
        +      }
        +    }
        +
        +    $e.prop('disabled', this.options.disabled);
        +    $e.prop('multiple', this.options.multiple);
        +
        +    if ($e.data('select2Tags')) {
        +      if (this.options.debug && window.console && console.warn) {
        +        console.warn(
        +          'Select2: The `data-select2-tags` attribute has been changed to ' +
        +          'use the `data-data` and `data-tags="true"` attributes and will be ' +
        +          'removed in future versions of Select2.'
        +        );
        +      }
        +
        +      $e.data('data', $e.data('select2Tags'));
        +      $e.data('tags', true);
        +    }
        +
        +    if ($e.data('ajaxUrl')) {
        +      if (this.options.debug && window.console && console.warn) {
        +        console.warn(
        +          'Select2: The `data-ajax-url` attribute has been changed to ' +
        +          '`data-ajax--url` and support for the old attribute will be removed' +
        +          ' in future versions of Select2.'
        +        );
        +      }
        +
        +      $e.attr('ajax--url', $e.data('ajaxUrl'));
        +      $e.data('ajax--url', $e.data('ajaxUrl'));
        +    }
        +
        +    var dataset = {};
        +
        +    // Prefer the element's `dataset` attribute if it exists
        +    // jQuery 1.x does not correctly handle data attributes with multiple dashes
        +    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
        +      dataset = $.extend(true, {}, $e[0].dataset, $e.data());
        +    } else {
        +      dataset = $e.data();
        +    }
        +
        +    var data = $.extend(true, {}, dataset);
        +
        +    data = Utils._convertData(data);
        +
        +    for (var key in data) {
        +      if ($.inArray(key, excludedData) > -1) {
        +        continue;
        +      }
        +
        +      if ($.isPlainObject(this.options[key])) {
        +        $.extend(this.options[key], data[key]);
        +      } else {
        +        this.options[key] = data[key];
        +      }
        +    }
        +
        +    return this;
        +  };
        +
        +  Options.prototype.get = function (key) {
        +    return this.options[key];
        +  };
        +
        +  Options.prototype.set = function (key, val) {
        +    this.options[key] = val;
        +  };
        +
        +  return Options;
        +});
        diff --git a/bower_components/select2/src/js/select2/results.js b/bower_components/select2/src/js/select2/results.js
        new file mode 100644
        index 0000000000..a16b65fd0f
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/results.js
        @@ -0,0 +1,523 @@
        +define([
        +  'jquery',
        +  './utils'
        +], function ($, Utils) {
        +  function Results ($element, options, dataAdapter) {
        +    this.$element = $element;
        +    this.data = dataAdapter;
        +    this.options = options;
        +
        +    Results.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(Results, Utils.Observable);
        +
        +  Results.prototype.render = function () {
        +    var $results = $(
        +      '<ul class="select2-results__options" role="tree"></ul>'
        +    );
        +
        +    if (this.options.get('multiple')) {
        +      $results.attr('aria-multiselectable', 'true');
        +    }
        +
        +    this.$results = $results;
        +
        +    return $results;
        +  };
        +
        +  Results.prototype.clear = function () {
        +    this.$results.empty();
        +  };
        +
        +  Results.prototype.displayMessage = function (params) {
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    this.clear();
        +    this.hideLoading();
        +
        +    var $message = $(
        +      '<li role="treeitem" aria-live="assertive"' +
        +      ' class="select2-results__option"></li>'
        +    );
        +
        +    var message = this.options.get('translations').get(params.message);
        +
        +    $message.append(
        +      escapeMarkup(
        +        message(params.args)
        +      )
        +    );
        +
        +    $message[0].className += ' select2-results__message';
        +
        +    this.$results.append($message);
        +  };
        +
        +  Results.prototype.hideMessages = function () {
        +    this.$results.find('.select2-results__message').remove();
        +  };
        +
        +  Results.prototype.append = function (data) {
        +    this.hideLoading();
        +
        +    var $options = [];
        +
        +    if (data.results == null || data.results.length === 0) {
        +      if (this.$results.children().length === 0) {
        +        this.trigger('results:message', {
        +          message: 'noResults'
        +        });
        +      }
        +
        +      return;
        +    }
        +
        +    data.results = this.sort(data.results);
        +
        +    for (var d = 0; d < data.results.length; d++) {
        +      var item = data.results[d];
        +
        +      var $option = this.option(item);
        +
        +      $options.push($option);
        +    }
        +
        +    this.$results.append($options);
        +  };
        +
        +  Results.prototype.position = function ($results, $dropdown) {
        +    var $resultsContainer = $dropdown.find('.select2-results');
        +    $resultsContainer.append($results);
        +  };
        +
        +  Results.prototype.sort = function (data) {
        +    var sorter = this.options.get('sorter');
        +
        +    return sorter(data);
        +  };
        +
        +  Results.prototype.highlightFirstItem = function () {
        +    var $options = this.$results
        +      .find('.select2-results__option[aria-selected]');
        +
        +    var $selected = $options.filter('[aria-selected=true]');
        +
        +    // Check if there are any selected options
        +    if ($selected.length > 0) {
        +      // If there are selected options, highlight the first
        +      $selected.first().trigger('mouseenter');
        +    } else {
        +      // If there are no selected options, highlight the first option
        +      // in the dropdown
        +      $options.first().trigger('mouseenter');
        +    }
        +
        +    this.ensureHighlightVisible();
        +  };
        +
        +  Results.prototype.setClasses = function () {
        +    var self = this;
        +
        +    this.data.current(function (selected) {
        +      var selectedIds = $.map(selected, function (s) {
        +        return s.id.toString();
        +      });
        +
        +      var $options = self.$results
        +        .find('.select2-results__option[aria-selected]');
        +
        +      $options.each(function () {
        +        var $option = $(this);
        +
        +        var item = $.data(this, 'data');
        +
        +        // id needs to be converted to a string when comparing
        +        var id = '' + item.id;
        +
        +        if ((item.element != null && item.element.selected) ||
        +            (item.element == null && $.inArray(id, selectedIds) > -1)) {
        +          $option.attr('aria-selected', 'true');
        +        } else {
        +          $option.attr('aria-selected', 'false');
        +        }
        +      });
        +
        +    });
        +  };
        +
        +  Results.prototype.showLoading = function (params) {
        +    this.hideLoading();
        +
        +    var loadingMore = this.options.get('translations').get('searching');
        +
        +    var loading = {
        +      disabled: true,
        +      loading: true,
        +      text: loadingMore(params)
        +    };
        +    var $loading = this.option(loading);
        +    $loading.className += ' loading-results';
        +
        +    this.$results.prepend($loading);
        +  };
        +
        +  Results.prototype.hideLoading = function () {
        +    this.$results.find('.loading-results').remove();
        +  };
        +
        +  Results.prototype.option = function (data) {
        +    var option = document.createElement('li');
        +    option.className = 'select2-results__option';
        +
        +    var attrs = {
        +      'role': 'treeitem',
        +      'aria-selected': 'false'
        +    };
        +
        +    if (data.disabled) {
        +      delete attrs['aria-selected'];
        +      attrs['aria-disabled'] = 'true';
        +    }
        +
        +    if (data.id == null) {
        +      delete attrs['aria-selected'];
        +    }
        +
        +    if (data._resultId != null) {
        +      option.id = data._resultId;
        +    }
        +
        +    if (data.title) {
        +      option.title = data.title;
        +    }
        +
        +    if (data.children) {
        +      attrs.role = 'group';
        +      attrs['aria-label'] = data.text;
        +      delete attrs['aria-selected'];
        +    }
        +
        +    for (var attr in attrs) {
        +      var val = attrs[attr];
        +
        +      option.setAttribute(attr, val);
        +    }
        +
        +    if (data.children) {
        +      var $option = $(option);
        +
        +      var label = document.createElement('strong');
        +      label.className = 'select2-results__group';
        +
        +      var $label = $(label);
        +      this.template(data, label);
        +
        +      var $children = [];
        +
        +      for (var c = 0; c < data.children.length; c++) {
        +        var child = data.children[c];
        +
        +        var $child = this.option(child);
        +
        +        $children.push($child);
        +      }
        +
        +      var $childrenContainer = $('<ul></ul>', {
        +        'class': 'select2-results__options select2-results__options--nested'
        +      });
        +
        +      $childrenContainer.append($children);
        +
        +      $option.append(label);
        +      $option.append($childrenContainer);
        +    } else {
        +      this.template(data, option);
        +    }
        +
        +    $.data(option, 'data', data);
        +
        +    return option;
        +  };
        +
        +  Results.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    var id = container.id + '-results';
        +
        +    this.$results.attr('id', id);
        +
        +    container.on('results:all', function (params) {
        +      self.clear();
        +      self.append(params.data);
        +
        +      if (container.isOpen()) {
        +        self.setClasses();
        +        self.highlightFirstItem();
        +      }
        +    });
        +
        +    container.on('results:append', function (params) {
        +      self.append(params.data);
        +
        +      if (container.isOpen()) {
        +        self.setClasses();
        +      }
        +    });
        +
        +    container.on('query', function (params) {
        +      self.hideMessages();
        +      self.showLoading(params);
        +    });
        +
        +    container.on('select', function () {
        +      if (!container.isOpen()) {
        +        return;
        +      }
        +
        +      self.setClasses();
        +      self.highlightFirstItem();
        +    });
        +
        +    container.on('unselect', function () {
        +      if (!container.isOpen()) {
        +        return;
        +      }
        +
        +      self.setClasses();
        +      self.highlightFirstItem();
        +    });
        +
        +    container.on('open', function () {
        +      // When the dropdown is open, aria-expended="true"
        +      self.$results.attr('aria-expanded', 'true');
        +      self.$results.attr('aria-hidden', 'false');
        +
        +      self.setClasses();
        +      self.ensureHighlightVisible();
        +    });
        +
        +    container.on('close', function () {
        +      // When the dropdown is closed, aria-expended="false"
        +      self.$results.attr('aria-expanded', 'false');
        +      self.$results.attr('aria-hidden', 'true');
        +      self.$results.removeAttr('aria-activedescendant');
        +    });
        +
        +    container.on('results:toggle', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      if ($highlighted.length === 0) {
        +        return;
        +      }
        +
        +      $highlighted.trigger('mouseup');
        +    });
        +
        +    container.on('results:select', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      if ($highlighted.length === 0) {
        +        return;
        +      }
        +
        +      var data = $highlighted.data('data');
        +
        +      if ($highlighted.attr('aria-selected') == 'true') {
        +        self.trigger('close', {});
        +      } else {
        +        self.trigger('select', {
        +          data: data
        +        });
        +      }
        +    });
        +
        +    container.on('results:previous', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      var $options = self.$results.find('[aria-selected]');
        +
        +      var currentIndex = $options.index($highlighted);
        +
        +      // If we are already at te top, don't move further
        +      if (currentIndex === 0) {
        +        return;
        +      }
        +
        +      var nextIndex = currentIndex - 1;
        +
        +      // If none are highlighted, highlight the first
        +      if ($highlighted.length === 0) {
        +        nextIndex = 0;
        +      }
        +
        +      var $next = $options.eq(nextIndex);
        +
        +      $next.trigger('mouseenter');
        +
        +      var currentOffset = self.$results.offset().top;
        +      var nextTop = $next.offset().top;
        +      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
        +
        +      if (nextIndex === 0) {
        +        self.$results.scrollTop(0);
        +      } else if (nextTop - currentOffset < 0) {
        +        self.$results.scrollTop(nextOffset);
        +      }
        +    });
        +
        +    container.on('results:next', function () {
        +      var $highlighted = self.getHighlightedResults();
        +
        +      var $options = self.$results.find('[aria-selected]');
        +
        +      var currentIndex = $options.index($highlighted);
        +
        +      var nextIndex = currentIndex + 1;
        +
        +      // If we are at the last option, stay there
        +      if (nextIndex >= $options.length) {
        +        return;
        +      }
        +
        +      var $next = $options.eq(nextIndex);
        +
        +      $next.trigger('mouseenter');
        +
        +      var currentOffset = self.$results.offset().top +
        +        self.$results.outerHeight(false);
        +      var nextBottom = $next.offset().top + $next.outerHeight(false);
        +      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
        +
        +      if (nextIndex === 0) {
        +        self.$results.scrollTop(0);
        +      } else if (nextBottom > currentOffset) {
        +        self.$results.scrollTop(nextOffset);
        +      }
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      params.element.addClass('select2-results__option--highlighted');
        +    });
        +
        +    container.on('results:message', function (params) {
        +      self.displayMessage(params);
        +    });
        +
        +    if ($.fn.mousewheel) {
        +      this.$results.on('mousewheel', function (e) {
        +        var top = self.$results.scrollTop();
        +
        +        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
        +
        +        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
        +        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
        +
        +        if (isAtTop) {
        +          self.$results.scrollTop(0);
        +
        +          e.preventDefault();
        +          e.stopPropagation();
        +        } else if (isAtBottom) {
        +          self.$results.scrollTop(
        +            self.$results.get(0).scrollHeight - self.$results.height()
        +          );
        +
        +          e.preventDefault();
        +          e.stopPropagation();
        +        }
        +      });
        +    }
        +
        +    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
        +      function (evt) {
        +      var $this = $(this);
        +
        +      var data = $this.data('data');
        +
        +      if ($this.attr('aria-selected') === 'true') {
        +        if (self.options.get('multiple')) {
        +          self.trigger('unselect', {
        +            originalEvent: evt,
        +            data: data
        +          });
        +        } else {
        +          self.trigger('close', {});
        +        }
        +
        +        return;
        +      }
        +
        +      self.trigger('select', {
        +        originalEvent: evt,
        +        data: data
        +      });
        +    });
        +
        +    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
        +      function (evt) {
        +      var data = $(this).data('data');
        +
        +      self.getHighlightedResults()
        +          .removeClass('select2-results__option--highlighted');
        +
        +      self.trigger('results:focus', {
        +        data: data,
        +        element: $(this)
        +      });
        +    });
        +  };
        +
        +  Results.prototype.getHighlightedResults = function () {
        +    var $highlighted = this.$results
        +    .find('.select2-results__option--highlighted');
        +
        +    return $highlighted;
        +  };
        +
        +  Results.prototype.destroy = function () {
        +    this.$results.remove();
        +  };
        +
        +  Results.prototype.ensureHighlightVisible = function () {
        +    var $highlighted = this.getHighlightedResults();
        +
        +    if ($highlighted.length === 0) {
        +      return;
        +    }
        +
        +    var $options = this.$results.find('[aria-selected]');
        +
        +    var currentIndex = $options.index($highlighted);
        +
        +    var currentOffset = this.$results.offset().top;
        +    var nextTop = $highlighted.offset().top;
        +    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
        +
        +    var offsetDelta = nextTop - currentOffset;
        +    nextOffset -= $highlighted.outerHeight(false) * 2;
        +
        +    if (currentIndex <= 2) {
        +      this.$results.scrollTop(0);
        +    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
        +      this.$results.scrollTop(nextOffset);
        +    }
        +  };
        +
        +  Results.prototype.template = function (result, container) {
        +    var template = this.options.get('templateResult');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    var content = template(result, container);
        +
        +    if (content == null) {
        +      container.style.display = 'none';
        +    } else if (typeof content === 'string') {
        +      container.innerHTML = escapeMarkup(content);
        +    } else {
        +      $(container).append(content);
        +    }
        +  };
        +
        +  return Results;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/allowClear.js b/bower_components/select2/src/js/select2/selection/allowClear.js
        new file mode 100644
        index 0000000000..d3502069f5
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/allowClear.js
        @@ -0,0 +1,97 @@
        +define([
        +  'jquery',
        +  '../keys'
        +], function ($, KEYS) {
        +  function AllowClear () { }
        +
        +  AllowClear.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    if (this.placeholder == null) {
        +      if (this.options.get('debug') && window.console && console.error) {
        +        console.error(
        +          'Select2: The `allowClear` option should be used in combination ' +
        +          'with the `placeholder` option.'
        +        );
        +      }
        +    }
        +
        +    this.$selection.on('mousedown', '.select2-selection__clear',
        +      function (evt) {
        +        self._handleClear(evt);
        +    });
        +
        +    container.on('keypress', function (evt) {
        +      self._handleKeyboardClear(evt, container);
        +    });
        +  };
        +
        +  AllowClear.prototype._handleClear = function (_, evt) {
        +    // Ignore the event if it is disabled
        +    if (this.options.get('disabled')) {
        +      return;
        +    }
        +
        +    var $clear = this.$selection.find('.select2-selection__clear');
        +
        +    // Ignore the event if nothing has been selected
        +    if ($clear.length === 0) {
        +      return;
        +    }
        +
        +    evt.stopPropagation();
        +
        +    var data = $clear.data('data');
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var unselectData = {
        +        data: data[d]
        +      };
        +
        +      // Trigger the `unselect` event, so people can prevent it from being
        +      // cleared.
        +      this.trigger('unselect', unselectData);
        +
        +      // If the event was prevented, don't clear it out.
        +      if (unselectData.prevented) {
        +        return;
        +      }
        +    }
        +
        +    this.$element.val(this.placeholder.id).trigger('change');
        +
        +    this.trigger('toggle', {});
        +  };
        +
        +  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
        +    if (container.isOpen()) {
        +      return;
        +    }
        +
        +    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
        +      this._handleClear(evt);
        +    }
        +  };
        +
        +  AllowClear.prototype.update = function (decorated, data) {
        +    decorated.call(this, data);
        +
        +    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
        +        data.length === 0) {
        +      return;
        +    }
        +
        +    var $remove = $(
        +      '<span class="select2-selection__clear">' +
        +        '&times;' +
        +      '</span>'
        +    );
        +    $remove.data('data', data);
        +
        +    this.$selection.find('.select2-selection__rendered').prepend($remove);
        +  };
        +
        +  return AllowClear;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/base.js b/bower_components/select2/src/js/select2/selection/base.js
        new file mode 100644
        index 0000000000..cd3aafdab7
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/base.js
        @@ -0,0 +1,158 @@
        +define([
        +  'jquery',
        +  '../utils',
        +  '../keys'
        +], function ($, Utils, KEYS) {
        +  function BaseSelection ($element, options) {
        +    this.$element = $element;
        +    this.options = options;
        +
        +    BaseSelection.__super__.constructor.call(this);
        +  }
        +
        +  Utils.Extend(BaseSelection, Utils.Observable);
        +
        +  BaseSelection.prototype.render = function () {
        +    var $selection = $(
        +      '<span class="select2-selection" role="combobox" ' +
        +      ' aria-haspopup="true" aria-expanded="false">' +
        +      '</span>'
        +    );
        +
        +    this._tabindex = 0;
        +
        +    if (this.$element.data('old-tabindex') != null) {
        +      this._tabindex = this.$element.data('old-tabindex');
        +    } else if (this.$element.attr('tabindex') != null) {
        +      this._tabindex = this.$element.attr('tabindex');
        +    }
        +
        +    $selection.attr('title', this.$element.attr('title'));
        +    $selection.attr('tabindex', this._tabindex);
        +
        +    this.$selection = $selection;
        +
        +    return $selection;
        +  };
        +
        +  BaseSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    var id = container.id + '-container';
        +    var resultsId = container.id + '-results';
        +
        +    this.container = container;
        +
        +    this.$selection.on('focus', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this.$selection.on('blur', function (evt) {
        +      self._handleBlur(evt);
        +    });
        +
        +    this.$selection.on('keydown', function (evt) {
        +      self.trigger('keypress', evt);
        +
        +      if (evt.which === KEYS.SPACE) {
        +        evt.preventDefault();
        +      }
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      self.$selection.attr('aria-activedescendant', params.data._resultId);
        +    });
        +
        +    container.on('selection:update', function (params) {
        +      self.update(params.data);
        +    });
        +
        +    container.on('open', function () {
        +      // When the dropdown is open, aria-expanded="true"
        +      self.$selection.attr('aria-expanded', 'true');
        +      self.$selection.attr('aria-owns', resultsId);
        +
        +      self._attachCloseHandler(container);
        +    });
        +
        +    container.on('close', function () {
        +      // When the dropdown is closed, aria-expanded="false"
        +      self.$selection.attr('aria-expanded', 'false');
        +      self.$selection.removeAttr('aria-activedescendant');
        +      self.$selection.removeAttr('aria-owns');
        +
        +      self.$selection.focus();
        +
        +      self._detachCloseHandler(container);
        +    });
        +
        +    container.on('enable', function () {
        +      self.$selection.attr('tabindex', self._tabindex);
        +    });
        +
        +    container.on('disable', function () {
        +      self.$selection.attr('tabindex', '-1');
        +    });
        +  };
        +
        +  BaseSelection.prototype._handleBlur = function (evt) {
        +    var self = this;
        +
        +    // This needs to be delayed as the active element is the body when the tab
        +    // key is pressed, possibly along with others.
        +    window.setTimeout(function () {
        +      // Don't trigger `blur` if the focus is still in the selection
        +      if (
        +        (document.activeElement == self.$selection[0]) ||
        +        ($.contains(self.$selection[0], document.activeElement))
        +      ) {
        +        return;
        +      }
        +
        +      self.trigger('blur', evt);
        +    }, 1);
        +  };
        +
        +  BaseSelection.prototype._attachCloseHandler = function (container) {
        +    var self = this;
        +
        +    $(document.body).on('mousedown.select2.' + container.id, function (e) {
        +      var $target = $(e.target);
        +
        +      var $select = $target.closest('.select2');
        +
        +      var $all = $('.select2.select2-container--open');
        +
        +      $all.each(function () {
        +        var $this = $(this);
        +
        +        if (this == $select[0]) {
        +          return;
        +        }
        +
        +        var $element = $this.data('element');
        +
        +        $element.select2('close');
        +      });
        +    });
        +  };
        +
        +  BaseSelection.prototype._detachCloseHandler = function (container) {
        +    $(document.body).off('mousedown.select2.' + container.id);
        +  };
        +
        +  BaseSelection.prototype.position = function ($selection, $container) {
        +    var $selectionContainer = $container.find('.selection');
        +    $selectionContainer.append($selection);
        +  };
        +
        +  BaseSelection.prototype.destroy = function () {
        +    this._detachCloseHandler(this.container);
        +  };
        +
        +  BaseSelection.prototype.update = function (data) {
        +    throw new Error('The `update` method must be defined in child classes.');
        +  };
        +
        +  return BaseSelection;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/clickMask.js b/bower_components/select2/src/js/select2/selection/clickMask.js
        new file mode 100644
        index 0000000000..2b4ac3076e
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/clickMask.js
        @@ -0,0 +1,29 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function ClickMask () { }
        +
        +  ClickMask.prototype.bind = function (decorate, $container, container) {
        +    var self = this;
        +
        +    decorate.call(this, $container, container);
        +
        +    this.$mask = $(
        +      '<div class="select2-close-mask"></div>'
        +    );
        +
        +    this.$mask.on('mousedown touchstart click', function () {
        +      self.trigger('close', {});
        +    });
        +  };
        +
        +  ClickMask.prototype._attachCloseHandler = function (decorate, container) {
        +    $(document.body).append(this.$mask);
        +  };
        +
        +  ClickMask.prototype._detachCloseHandler = function (deocrate, container) {
        +    this.$mask.detach();
        +  };
        +
        +  return ClickMask;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/eventRelay.js b/bower_components/select2/src/js/select2/selection/eventRelay.js
        new file mode 100644
        index 0000000000..a91e9c5776
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/eventRelay.js
        @@ -0,0 +1,45 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  function EventRelay () { }
        +
        +  EventRelay.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +    var relayEvents = [
        +      'open', 'opening',
        +      'close', 'closing',
        +      'select', 'selecting',
        +      'unselect', 'unselecting'
        +    ];
        +
        +    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('*', function (name, params) {
        +      // Ignore events that should not be relayed
        +      if ($.inArray(name, relayEvents) === -1) {
        +        return;
        +      }
        +
        +      // The parameters should always be an object
        +      params = params || {};
        +
        +      // Generate the jQuery event for the Select2 event
        +      var evt = $.Event('select2:' + name, {
        +        params: params
        +      });
        +
        +      self.$element.trigger(evt);
        +
        +      // Only handle preventable events if it was one
        +      if ($.inArray(name, preventableEvents) === -1) {
        +        return;
        +      }
        +
        +      params.prevented = evt.isDefaultPrevented();
        +    });
        +  };
        +
        +  return EventRelay;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/multiple.js b/bower_components/select2/src/js/select2/selection/multiple.js
        new file mode 100644
        index 0000000000..ae0f7cce7e
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/multiple.js
        @@ -0,0 +1,109 @@
        +define([
        +  'jquery',
        +  './base',
        +  '../utils'
        +], function ($, BaseSelection, Utils) {
        +  function MultipleSelection ($element, options) {
        +    MultipleSelection.__super__.constructor.apply(this, arguments);
        +  }
        +
        +  Utils.Extend(MultipleSelection, BaseSelection);
        +
        +  MultipleSelection.prototype.render = function () {
        +    var $selection = MultipleSelection.__super__.render.call(this);
        +
        +    $selection.addClass('select2-selection--multiple');
        +
        +    $selection.html(
        +      '<ul class="select2-selection__rendered"></ul>'
        +    );
        +
        +    return $selection;
        +  };
        +
        +  MultipleSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    MultipleSelection.__super__.bind.apply(this, arguments);
        +
        +    this.$selection.on('click', function (evt) {
        +      self.trigger('toggle', {
        +        originalEvent: evt
        +      });
        +    });
        +
        +    this.$selection.on(
        +      'click',
        +      '.select2-selection__choice__remove',
        +      function (evt) {
        +        // Ignore the event if it is disabled
        +        if (self.options.get('disabled')) {
        +          return;
        +        }
        +
        +        var $remove = $(this);
        +        var $selection = $remove.parent();
        +
        +        var data = $selection.data('data');
        +
        +        self.trigger('unselect', {
        +          originalEvent: evt,
        +          data: data
        +        });
        +      }
        +    );
        +  };
        +
        +  MultipleSelection.prototype.clear = function () {
        +    this.$selection.find('.select2-selection__rendered').empty();
        +  };
        +
        +  MultipleSelection.prototype.display = function (data, container) {
        +    var template = this.options.get('templateSelection');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    return escapeMarkup(template(data, container));
        +  };
        +
        +  MultipleSelection.prototype.selectionContainer = function () {
        +    var $container = $(
        +      '<li class="select2-selection__choice">' +
        +        '<span class="select2-selection__choice__remove" role="presentation">' +
        +          '&times;' +
        +        '</span>' +
        +      '</li>'
        +    );
        +
        +    return $container;
        +  };
        +
        +  MultipleSelection.prototype.update = function (data) {
        +    this.clear();
        +
        +    if (data.length === 0) {
        +      return;
        +    }
        +
        +    var $selections = [];
        +
        +    for (var d = 0; d < data.length; d++) {
        +      var selection = data[d];
        +
        +      var $selection = this.selectionContainer();
        +      var formatted = this.display(selection, $selection);
        +
        +      $selection.append(formatted);
        +      $selection.prop('title', selection.title || selection.text);
        +
        +      $selection.data('data', selection);
        +
        +      $selections.push($selection);
        +    }
        +
        +    var $rendered = this.$selection.find('.select2-selection__rendered');
        +
        +    Utils.appendMany($rendered, $selections);
        +  };
        +
        +  return MultipleSelection;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/placeholder.js b/bower_components/select2/src/js/select2/selection/placeholder.js
        new file mode 100644
        index 0000000000..87fbedac96
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/placeholder.js
        @@ -0,0 +1,49 @@
        +define([
        +  '../utils'
        +], function (Utils) {
        +  function Placeholder (decorated, $element, options) {
        +    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        +
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
        +    if (typeof placeholder === 'string') {
        +      placeholder = {
        +        id: '',
        +        text: placeholder
        +      };
        +    }
        +
        +    return placeholder;
        +  };
        +
        +  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
        +    var $placeholder = this.selectionContainer();
        +
        +    $placeholder.html(this.display(placeholder));
        +    $placeholder.addClass('select2-selection__placeholder')
        +                .removeClass('select2-selection__choice');
        +
        +    return $placeholder;
        +  };
        +
        +  Placeholder.prototype.update = function (decorated, data) {
        +    var singlePlaceholder = (
        +      data.length == 1 && data[0].id != this.placeholder.id
        +    );
        +    var multipleSelections = data.length > 1;
        +
        +    if (multipleSelections || singlePlaceholder) {
        +      return decorated.call(this, data);
        +    }
        +
        +    this.clear();
        +
        +    var $placeholder = this.createPlaceholder(this.placeholder);
        +
        +    this.$selection.find('.select2-selection__rendered').append($placeholder);
        +  };
        +
        +  return Placeholder;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/search.js b/bower_components/select2/src/js/select2/selection/search.js
        new file mode 100644
        index 0000000000..77c4edca7b
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/search.js
        @@ -0,0 +1,222 @@
        +define([
        +  'jquery',
        +  '../utils',
        +  '../keys'
        +], function ($, Utils, KEYS) {
        +  function Search (decorated, $element, options) {
        +    decorated.call(this, $element, options);
        +  }
        +
        +  Search.prototype.render = function (decorated) {
        +    var $search = $(
        +      '<li class="select2-search select2-search--inline">' +
        +        '<input class="select2-search__field" type="search" tabindex="-1"' +
        +        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        +        ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
        +      '</li>'
        +    );
        +
        +    this.$searchContainer = $search;
        +    this.$search = $search.find('input');
        +
        +    var $rendered = decorated.call(this);
        +
        +    this._transferTabIndex();
        +
        +    return $rendered;
        +  };
        +
        +  Search.prototype.bind = function (decorated, container, $container) {
        +    var self = this;
        +
        +    decorated.call(this, container, $container);
        +
        +    container.on('open', function () {
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('close', function () {
        +      self.$search.val('');
        +      self.$search.removeAttr('aria-activedescendant');
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('enable', function () {
        +      self.$search.prop('disabled', false);
        +
        +      self._transferTabIndex();
        +    });
        +
        +    container.on('disable', function () {
        +      self.$search.prop('disabled', true);
        +    });
        +
        +    container.on('focus', function (evt) {
        +      self.$search.trigger('focus');
        +    });
        +
        +    container.on('results:focus', function (params) {
        +      self.$search.attr('aria-activedescendant', params.id);
        +    });
        +
        +    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
        +      self.trigger('focus', evt);
        +    });
        +
        +    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
        +      self._handleBlur(evt);
        +    });
        +
        +    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
        +      evt.stopPropagation();
        +
        +      self.trigger('keypress', evt);
        +
        +      self._keyUpPrevented = evt.isDefaultPrevented();
        +
        +      var key = evt.which;
        +
        +      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
        +        var $previousChoice = self.$searchContainer
        +          .prev('.select2-selection__choice');
        +
        +        if ($previousChoice.length > 0) {
        +          var item = $previousChoice.data('data');
        +
        +          self.searchRemoveChoice(item);
        +
        +          evt.preventDefault();
        +        }
        +      }
        +    });
        +
        +    // Try to detect the IE version should the `documentMode` property that
        +    // is stored on the document. This is only implemented in IE and is
        +    // slightly cleaner than doing a user agent check.
        +    // This property is not available in Edge, but Edge also doesn't have
        +    // this bug.
        +    var msie = document.documentMode;
        +    var disableInputEvents = msie && msie <= 11;
        +
        +    // Workaround for browsers which do not support the `input` event
        +    // This will prevent double-triggering of events for browsers which support
        +    // both the `keyup` and `input` events.
        +    this.$selection.on(
        +      'input.searchcheck',
        +      '.select2-search--inline',
        +      function (evt) {
        +        // IE will trigger the `input` event when a placeholder is used on a
        +        // search box. To get around this issue, we are forced to ignore all
        +        // `input` events in IE and keep using `keyup`.
        +        if (disableInputEvents) {
        +          self.$selection.off('input.search input.searchcheck');
        +          return;
        +        }
        +
        +        // Unbind the duplicated `keyup` event
        +        self.$selection.off('keyup.search');
        +      }
        +    );
        +
        +    this.$selection.on(
        +      'keyup.search input.search',
        +      '.select2-search--inline',
        +      function (evt) {
        +        // IE will trigger the `input` event when a placeholder is used on a
        +        // search box. To get around this issue, we are forced to ignore all
        +        // `input` events in IE and keep using `keyup`.
        +        if (disableInputEvents && evt.type === 'input') {
        +          self.$selection.off('input.search input.searchcheck');
        +          return;
        +        }
        +
        +        var key = evt.which;
        +
        +        // We can freely ignore events from modifier keys
        +        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
        +          return;
        +        }
        +
        +        // Tabbing will be handled during the `keydown` phase
        +        if (key == KEYS.TAB) {
        +          return;
        +        }
        +
        +        self.handleSearch(evt);
        +      }
        +    );
        +  };
        +
        +  /**
        +   * This method will transfer the tabindex attribute from the rendered
        +   * selection to the search box. This allows for the search box to be used as
        +   * the primary focus instead of the selection container.
        +   *
        +   * @private
        +   */
        +  Search.prototype._transferTabIndex = function (decorated) {
        +    this.$search.attr('tabindex', this.$selection.attr('tabindex'));
        +    this.$selection.attr('tabindex', '-1');
        +  };
        +
        +  Search.prototype.createPlaceholder = function (decorated, placeholder) {
        +    this.$search.attr('placeholder', placeholder.text);
        +  };
        +
        +  Search.prototype.update = function (decorated, data) {
        +    var searchHadFocus = this.$search[0] == document.activeElement;
        +
        +    this.$search.attr('placeholder', '');
        +
        +    decorated.call(this, data);
        +
        +    this.$selection.find('.select2-selection__rendered')
        +                   .append(this.$searchContainer);
        +
        +    this.resizeSearch();
        +    if (searchHadFocus) {
        +      this.$search.focus();
        +    }
        +  };
        +
        +  Search.prototype.handleSearch = function () {
        +    this.resizeSearch();
        +
        +    if (!this._keyUpPrevented) {
        +      var input = this.$search.val();
        +
        +      this.trigger('query', {
        +        term: input
        +      });
        +    }
        +
        +    this._keyUpPrevented = false;
        +  };
        +
        +  Search.prototype.searchRemoveChoice = function (decorated, item) {
        +    this.trigger('unselect', {
        +      data: item
        +    });
        +
        +    this.$search.val(item.text);
        +    this.handleSearch();
        +  };
        +
        +  Search.prototype.resizeSearch = function () {
        +    this.$search.css('width', '25px');
        +
        +    var width = '';
        +
        +    if (this.$search.attr('placeholder') !== '') {
        +      width = this.$selection.find('.select2-selection__rendered').innerWidth();
        +    } else {
        +      var minimumWidth = this.$search.val().length + 1;
        +
        +      width = (minimumWidth * 0.75) + 'em';
        +    }
        +
        +    this.$search.css('width', width);
        +  };
        +
        +  return Search;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/single.js b/bower_components/select2/src/js/select2/selection/single.js
        new file mode 100644
        index 0000000000..89c21dbbf0
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/single.js
        @@ -0,0 +1,99 @@
        +define([
        +  'jquery',
        +  './base',
        +  '../utils',
        +  '../keys'
        +], function ($, BaseSelection, Utils, KEYS) {
        +  function SingleSelection () {
        +    SingleSelection.__super__.constructor.apply(this, arguments);
        +  }
        +
        +  Utils.Extend(SingleSelection, BaseSelection);
        +
        +  SingleSelection.prototype.render = function () {
        +    var $selection = SingleSelection.__super__.render.call(this);
        +
        +    $selection.addClass('select2-selection--single');
        +
        +    $selection.html(
        +      '<span class="select2-selection__rendered"></span>' +
        +      '<span class="select2-selection__arrow" role="presentation">' +
        +        '<b role="presentation"></b>' +
        +      '</span>'
        +    );
        +
        +    return $selection;
        +  };
        +
        +  SingleSelection.prototype.bind = function (container, $container) {
        +    var self = this;
        +
        +    SingleSelection.__super__.bind.apply(this, arguments);
        +
        +    var id = container.id + '-container';
        +
        +    this.$selection.find('.select2-selection__rendered').attr('id', id);
        +    this.$selection.attr('aria-labelledby', id);
        +
        +    this.$selection.on('mousedown', function (evt) {
        +      // Only respond to left clicks
        +      if (evt.which !== 1) {
        +        return;
        +      }
        +
        +      self.trigger('toggle', {
        +        originalEvent: evt
        +      });
        +    });
        +
        +    this.$selection.on('focus', function (evt) {
        +      // User focuses on the container
        +    });
        +
        +    this.$selection.on('blur', function (evt) {
        +      // User exits the container
        +    });
        +
        +    container.on('focus', function (evt) {
        +      if (!container.isOpen()) {
        +        self.$selection.focus();
        +      }
        +    });
        +
        +    container.on('selection:update', function (params) {
        +      self.update(params.data);
        +    });
        +  };
        +
        +  SingleSelection.prototype.clear = function () {
        +    this.$selection.find('.select2-selection__rendered').empty();
        +  };
        +
        +  SingleSelection.prototype.display = function (data, container) {
        +    var template = this.options.get('templateSelection');
        +    var escapeMarkup = this.options.get('escapeMarkup');
        +
        +    return escapeMarkup(template(data, container));
        +  };
        +
        +  SingleSelection.prototype.selectionContainer = function () {
        +    return $('<span></span>');
        +  };
        +
        +  SingleSelection.prototype.update = function (data) {
        +    if (data.length === 0) {
        +      this.clear();
        +      return;
        +    }
        +
        +    var selection = data[0];
        +
        +    var $rendered = this.$selection.find('.select2-selection__rendered');
        +    var formatted = this.display(selection, $rendered);
        +
        +    $rendered.empty().append(formatted);
        +    $rendered.prop('title', selection.title || selection.text);
        +  };
        +
        +  return SingleSelection;
        +});
        diff --git a/bower_components/select2/src/js/select2/selection/stopPropagation.js b/bower_components/select2/src/js/select2/selection/stopPropagation.js
        new file mode 100644
        index 0000000000..382f1e726a
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/selection/stopPropagation.js
        @@ -0,0 +1,38 @@
        +define([
        +
        +], function () {
        +  function StopPropagation () { }
        +
        +  StopPropagation.prototype.bind = function (decorated, container, $container) {
        +    decorated.call(this, container, $container);
        +
        +    var stoppedEvents = [
        +      'blur',
        +      'change',
        +      'click',
        +      'dblclick',
        +      'focus',
        +      'focusin',
        +      'focusout',
        +      'input',
        +      'keydown',
        +      'keyup',
        +      'keypress',
        +      'mousedown',
        +      'mouseenter',
        +      'mouseleave',
        +      'mousemove',
        +      'mouseover',
        +      'mouseup',
        +      'search',
        +      'touchend',
        +      'touchstart'
        +    ];
        +
        +    this.$selection.on(stoppedEvents.join(' '), function (evt) {
        +      evt.stopPropagation();
        +    });
        +  };
        +
        +  return StopPropagation;
        +});
        diff --git a/bower_components/select2/src/js/select2/translation.js b/bower_components/select2/src/js/select2/translation.js
        new file mode 100644
        index 0000000000..5394c18b66
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/translation.js
        @@ -0,0 +1,36 @@
        +define([
        +  'jquery',
        +  'require'
        +], function ($, require) {
        +  function Translation (dict) {
        +    this.dict = dict || {};
        +  }
        +
        +  Translation.prototype.all = function () {
        +    return this.dict;
        +  };
        +
        +  Translation.prototype.get = function (key) {
        +    return this.dict[key];
        +  };
        +
        +  Translation.prototype.extend = function (translation) {
        +    this.dict = $.extend({}, translation.all(), this.dict);
        +  };
        +
        +  // Static functions
        +
        +  Translation._cache = {};
        +
        +  Translation.loadPath = function (path) {
        +    if (!(path in Translation._cache)) {
        +      var translations = require(path);
        +
        +      Translation._cache[path] = translations;
        +    }
        +
        +    return new Translation(Translation._cache[path]);
        +  };
        +
        +  return Translation;
        +});
        diff --git a/bower_components/select2/src/js/select2/utils.js b/bower_components/select2/src/js/select2/utils.js
        new file mode 100644
        index 0000000000..d1a23d293e
        --- /dev/null
        +++ b/bower_components/select2/src/js/select2/utils.js
        @@ -0,0 +1,276 @@
        +define([
        +  'jquery'
        +], function ($) {
        +  var Utils = {};
        +
        +  Utils.Extend = function (ChildClass, SuperClass) {
        +    var __hasProp = {}.hasOwnProperty;
        +
        +    function BaseConstructor () {
        +      this.constructor = ChildClass;
        +    }
        +
        +    for (var key in SuperClass) {
        +      if (__hasProp.call(SuperClass, key)) {
        +        ChildClass[key] = SuperClass[key];
        +      }
        +    }
        +
        +    BaseConstructor.prototype = SuperClass.prototype;
        +    ChildClass.prototype = new BaseConstructor();
        +    ChildClass.__super__ = SuperClass.prototype;
        +
        +    return ChildClass;
        +  };
        +
        +  function getMethods (theClass) {
        +    var proto = theClass.prototype;
        +
        +    var methods = [];
        +
        +    for (var methodName in proto) {
        +      var m = proto[methodName];
        +
        +      if (typeof m !== 'function') {
        +        continue;
        +      }
        +
        +      if (methodName === 'constructor') {
        +        continue;
        +      }
        +
        +      methods.push(methodName);
        +    }
        +
        +    return methods;
        +  }
        +
        +  Utils.Decorate = function (SuperClass, DecoratorClass) {
        +    var decoratedMethods = getMethods(DecoratorClass);
        +    var superMethods = getMethods(SuperClass);
        +
        +    function DecoratedClass () {
        +      var unshift = Array.prototype.unshift;
        +
        +      var argCount = DecoratorClass.prototype.constructor.length;
        +
        +      var calledConstructor = SuperClass.prototype.constructor;
        +
        +      if (argCount > 0) {
        +        unshift.call(arguments, SuperClass.prototype.constructor);
        +
        +        calledConstructor = DecoratorClass.prototype.constructor;
        +      }
        +
        +      calledConstructor.apply(this, arguments);
        +    }
        +
        +    DecoratorClass.displayName = SuperClass.displayName;
        +
        +    function ctr () {
        +      this.constructor = DecoratedClass;
        +    }
        +
        +    DecoratedClass.prototype = new ctr();
        +
        +    for (var m = 0; m < superMethods.length; m++) {
        +        var superMethod = superMethods[m];
        +
        +        DecoratedClass.prototype[superMethod] =
        +          SuperClass.prototype[superMethod];
        +    }
        +
        +    var calledMethod = function (methodName) {
        +      // Stub out the original method if it's not decorating an actual method
        +      var originalMethod = function () {};
        +
        +      if (methodName in DecoratedClass.prototype) {
        +        originalMethod = DecoratedClass.prototype[methodName];
        +      }
        +
        +      var decoratedMethod = DecoratorClass.prototype[methodName];
        +
        +      return function () {
        +        var unshift = Array.prototype.unshift;
        +
        +        unshift.call(arguments, originalMethod);
        +
        +        return decoratedMethod.apply(this, arguments);
        +      };
        +    };
        +
        +    for (var d = 0; d < decoratedMethods.length; d++) {
        +      var decoratedMethod = decoratedMethods[d];
        +
        +      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
        +    }
        +
        +    return DecoratedClass;
        +  };
        +
        +  var Observable = function () {
        +    this.listeners = {};
        +  };
        +
        +  Observable.prototype.on = function (event, callback) {
        +    this.listeners = this.listeners || {};
        +
        +    if (event in this.listeners) {
        +      this.listeners[event].push(callback);
        +    } else {
        +      this.listeners[event] = [callback];
        +    }
        +  };
        +
        +  Observable.prototype.trigger = function (event) {
        +    var slice = Array.prototype.slice;
        +    var params = slice.call(arguments, 1);
        +
        +    this.listeners = this.listeners || {};
        +
        +    // Params should always come in as an array
        +    if (params == null) {
        +      params = [];
        +    }
        +
        +    // If there are no arguments to the event, use a temporary object
        +    if (params.length === 0) {
        +      params.push({});
        +    }
        +
        +    // Set the `_type` of the first object to the event
        +    params[0]._type = event;
        +
        +    if (event in this.listeners) {
        +      this.invoke(this.listeners[event], slice.call(arguments, 1));
        +    }
        +
        +    if ('*' in this.listeners) {
        +      this.invoke(this.listeners['*'], arguments);
        +    }
        +  };
        +
        +  Observable.prototype.invoke = function (listeners, params) {
        +    for (var i = 0, len = listeners.length; i < len; i++) {
        +      listeners[i].apply(this, params);
        +    }
        +  };
        +
        +  Utils.Observable = Observable;
        +
        +  Utils.generateChars = function (length) {
        +    var chars = '';
        +
        +    for (var i = 0; i < length; i++) {
        +      var randomChar = Math.floor(Math.random() * 36);
        +      chars += randomChar.toString(36);
        +    }
        +
        +    return chars;
        +  };
        +
        +  Utils.bind = function (func, context) {
        +    return function () {
        +      func.apply(context, arguments);
        +    };
        +  };
        +
        +  Utils._convertData = function (data) {
        +    for (var originalKey in data) {
        +      var keys = originalKey.split('-');
        +
        +      var dataLevel = data;
        +
        +      if (keys.length === 1) {
        +        continue;
        +      }
        +
        +      for (var k = 0; k < keys.length; k++) {
        +        var key = keys[k];
        +
        +        // Lowercase the first letter
        +        // By default, dash-separated becomes camelCase
        +        key = key.substring(0, 1).toLowerCase() + key.substring(1);
        +
        +        if (!(key in dataLevel)) {
        +          dataLevel[key] = {};
        +        }
        +
        +        if (k == keys.length - 1) {
        +          dataLevel[key] = data[originalKey];
        +        }
        +
        +        dataLevel = dataLevel[key];
        +      }
        +
        +      delete data[originalKey];
        +    }
        +
        +    return data;
        +  };
        +
        +  Utils.hasScroll = function (index, el) {
        +    // Adapted from the function created by @ShadowScripter
        +    // and adapted by @BillBarry on the Stack Exchange Code Review website.
        +    // The original code can be found at
        +    // http://codereview.stackexchange.com/q/13338
        +    // and was designed to be used with the Sizzle selector engine.
        +
        +    var $el = $(el);
        +    var overflowX = el.style.overflowX;
        +    var overflowY = el.style.overflowY;
        +
        +    //Check both x and y declarations
        +    if (overflowX === overflowY &&
        +        (overflowY === 'hidden' || overflowY === 'visible')) {
        +      return false;
        +    }
        +
        +    if (overflowX === 'scroll' || overflowY === 'scroll') {
        +      return true;
        +    }
        +
        +    return ($el.innerHeight() < el.scrollHeight ||
        +      $el.innerWidth() < el.scrollWidth);
        +  };
        +
        +  Utils.escapeMarkup = function (markup) {
        +    var replaceMap = {
        +      '\\': '&#92;',
        +      '&': '&amp;',
        +      '<': '&lt;',
        +      '>': '&gt;',
        +      '"': '&quot;',
        +      '\'': '&#39;',
        +      '/': '&#47;'
        +    };
        +
        +    // Do not try to escape the markup if it's not a string
        +    if (typeof markup !== 'string') {
        +      return markup;
        +    }
        +
        +    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
        +      return replaceMap[match];
        +    });
        +  };
        +
        +  // Append an array of jQuery nodes to a given element.
        +  Utils.appendMany = function ($element, $nodes) {
        +    // jQuery 1.7.x does not support $.fn.append() with an array
        +    // Fall back to a jQuery object collection using $.fn.add()
        +    if ($.fn.jquery.substr(0, 3) === '1.7') {
        +      var $jqNodes = $();
        +
        +      $.map($nodes, function (node) {
        +        $jqNodes = $jqNodes.add(node);
        +      });
        +
        +      $nodes = $jqNodes;
        +    }
        +
        +    $element.append($nodes);
        +  };
        +
        +  return Utils;
        +});
        diff --git a/bower_components/select2/src/js/wrapper.end.js b/bower_components/select2/src/js/wrapper.end.js
        new file mode 100644
        index 0000000000..43678296f4
        --- /dev/null
        +++ b/bower_components/select2/src/js/wrapper.end.js
        @@ -0,0 +1,12 @@
        +  // Autoload the jQuery bindings
        +  // We know that all of the modules exist above this, so we're safe
        +  var select2 = S2.require('jquery.select2');
        +
        +  // Hold the AMD module references on the jQuery function that was just loaded
        +  // This allows Select2 to use the internal loader outside of this file, such
        +  // as in the language files.
        +  jQuery.fn.select2.amd = S2;
        +
        +  // Return the Select2 instance for anyone who is importing it.
        +  return select2;
        +}));
        diff --git a/bower_components/select2/src/js/wrapper.start.js b/bower_components/select2/src/js/wrapper.start.js
        new file mode 100644
        index 0000000000..76caabafb5
        --- /dev/null
        +++ b/bower_components/select2/src/js/wrapper.start.js
        @@ -0,0 +1,23 @@
        +/*!
        + * Select2 <%= package.version %>
        + * https://select2.github.io
        + *
        + * Released under the MIT license
        + * https://github.com/select2/select2/blob/master/LICENSE.md
        + */
        +(function (factory) {
        +  if (typeof define === 'function' && define.amd) {
        +    // AMD. Register as an anonymous module.
        +    define(['jquery'], factory);
        +  } else if (typeof exports === 'object') {
        +    // Node/CommonJS
        +    factory(require('jquery'));
        +  } else {
        +    // Browser globals
        +    factory(jQuery);
        +  }
        +}(function (jQuery) {
        +  // This is needed so we can catch the AMD loader configuration and use it
        +  // The inner file should be wrapped (by `banner.start.js`) in a function that
        +  // returns the AMD loader references.
        +  var S2 =
        diff --git a/bower_components/select2/src/scss/_dropdown.scss b/bower_components/select2/src/scss/_dropdown.scss
        new file mode 100644
        index 0000000000..fb891d31a8
        --- /dev/null
        +++ b/bower_components/select2/src/scss/_dropdown.scss
        @@ -0,0 +1,73 @@
        +.select2-dropdown {
        +  background-color: white;
        +
        +  border: 1px solid #aaa;
        +  border-radius: 4px;
        +
        +  box-sizing: border-box;
        +
        +  display: block;
        +
        +  position: absolute;
        +  left: -100000px;
        +
        +  width: 100%;
        +
        +  z-index: 1051;
        +}
        +
        +.select2-results {
        +  display: block;
        +}
        +
        +.select2-results__options {
        +  list-style: none;
        +  margin: 0;
        +  padding: 0;
        +}
        +
        +.select2-results__option {
        +  padding: 6px;
        +
        +  user-select: none;
        +  -webkit-user-select: none;
        +
        +  &[aria-selected] {
        +    cursor: pointer;
        +  }
        +}
        +
        +.select2-container--open .select2-dropdown {
        +  left: 0;
        +}
        +
        +.select2-container--open .select2-dropdown--above {
        +  border-bottom: none;
        +  border-bottom-left-radius: 0;
        +  border-bottom-right-radius: 0;
        +}
        +
        +.select2-container--open .select2-dropdown--below {
        +  border-top: none;
        +  border-top-left-radius: 0;
        +  border-top-right-radius: 0;
        +}
        +
        +.select2-search--dropdown {
        +  display: block;
        +  padding: 4px;
        +
        +  .select2-search__field {
        +    padding: 4px;
        +    width: 100%;
        +    box-sizing: border-box;
        +
        +    &::-webkit-search-cancel-button {
        +      -webkit-appearance: none;
        +    }
        +  }
        +
        +  &.select2-search--hide {
        +    display: none;
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/_multiple.scss b/bower_components/select2/src/scss/_multiple.scss
        new file mode 100644
        index 0000000000..981d20833f
        --- /dev/null
        +++ b/bower_components/select2/src/scss/_multiple.scss
        @@ -0,0 +1,35 @@
        +.select2-selection--multiple {
        +  box-sizing: border-box;
        +
        +  cursor: pointer;
        +  display: block;
        +
        +  min-height: 32px;
        +
        +  user-select: none;
        +  -webkit-user-select: none;
        +
        +  .select2-selection__rendered {
        +    display: inline-block;
        +    overflow: hidden;
        +    padding-left: 8px;
        +    text-overflow: ellipsis;
        +    white-space: nowrap;
        +  }
        +}
        +
        +.select2-search--inline {
        +  float: left;
        +
        +  .select2-search__field {
        +    box-sizing: border-box;
        +    border: none;
        +    font-size: 100%;
        +    margin-top: 5px;
        +    padding: 0;
        +
        +    &::-webkit-search-cancel-button {
        +      -webkit-appearance: none;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/_single.scss b/bower_components/select2/src/scss/_single.scss
        new file mode 100644
        index 0000000000..6c3418e631
        --- /dev/null
        +++ b/bower_components/select2/src/scss/_single.scss
        @@ -0,0 +1,34 @@
        +.select2-selection--single {
        +  box-sizing: border-box;
        +
        +  cursor: pointer;
        +  display: block;
        +
        +  height: 28px;
        +
        +  user-select: none;
        +  -webkit-user-select: none;
        +
        +  .select2-selection__rendered {
        +    display: block;
        +    padding-left: 8px;
        +    padding-right: 20px;
        +
        +    overflow: hidden;
        +    text-overflow: ellipsis;
        +    white-space: nowrap;
        +  }
        +
        +  .select2-selection__clear {
        +    position: relative;
        +  }
        +}
        +
        +&[dir="rtl"] {
        +  .select2-selection--single {
        +    .select2-selection__rendered {
        +      padding-right: 8px;
        +      padding-left: 20px;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/core.scss b/bower_components/select2/src/scss/core.scss
        new file mode 100644
        index 0000000000..3d695386bb
        --- /dev/null
        +++ b/bower_components/select2/src/scss/core.scss
        @@ -0,0 +1,48 @@
        +.select2-container {
        +  box-sizing: border-box;
        +
        +  display: inline-block;
        +  margin: 0;
        +  position: relative;
        +  vertical-align: middle;
        +
        +  @import "single";
        +  @import "multiple";
        +}
        +
        +@import "dropdown";
        +
        +.select2-close-mask {
        +  border: 0;
        +  margin: 0;
        +  padding: 0;
        +  display: block;
        +  position: fixed;
        +  left: 0;
        +  top: 0;
        +  min-height: 100%;
        +  min-width: 100%;
        +  height: auto;
        +  width: auto;
        +  opacity: 0;
        +  z-index: 99;
        +
        +  // styles required for IE to work
        +
        +  background-color: #fff;
        +  filter: alpha(opacity=0);
        +}
        +
        +.select2-hidden-accessible {
        +  border: 0 !important;
        +  clip: rect(0 0 0 0) !important;
        +  height: 1px !important;
        +  margin: -1px !important;
        +  overflow: hidden !important;
        +  padding: 0 !important;
        +  position: absolute !important;
        +  width: 1px !important;
        +}
        +
        +@import "theme/default/layout";
        +@import "theme/classic/layout";
        diff --git a/bower_components/select2/src/scss/mixins/_gradients.scss b/bower_components/select2/src/scss/mixins/_gradients.scss
        new file mode 100644
        index 0000000000..05a6195c24
        --- /dev/null
        +++ b/bower_components/select2/src/scss/mixins/_gradients.scss
        @@ -0,0 +1,13 @@
        +// https://github.com/twbs/bootstrap-sass/blob/3.3-stable/assets/stylesheets/bootstrap/mixins/_gradients.scss#L17-L27
        +
        +// Vertical gradient, from top to bottom
        +//
        +// Creates two color stops, start and end, by specifying a color and position for each color stop.
        +// Color stops are not available in IE9 and below.
        +@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
        +  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+
        +  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12
        +  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        +  background-repeat: repeat-x;
        +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
        +}
        diff --git a/bower_components/select2/src/scss/theme/classic/_defaults.scss b/bower_components/select2/src/scss/theme/classic/_defaults.scss
        new file mode 100644
        index 0000000000..aa204563db
        --- /dev/null
        +++ b/bower_components/select2/src/scss/theme/classic/_defaults.scss
        @@ -0,0 +1,34 @@
        +$remove-color: #888 !default;
        +$remove-hover-color: #555 !default;
        +$remove-width: 20px !default;
        +
        +$selection-color: #444 !default;
        +
        +$border-color: #aaa !default;
        +$border-radius: 4px !default;
        +
        +$focus-border-color: #5897fb !default;
        +
        +$container-height: 28px !default;
        +
        +$selection-bg-top-color: white !default;
        +$selection-bg-bottom-color: #eeeeee !default;
        +
        +$container-placeholder-color: #999 !default;
        +
        +$container-focus-border-color: blue !default;
        +
        +$selection-opened-bg-top-color: $selection-bg-bottom-color !default;
        +$selection-opened-bg-bottom-color: $selection-bg-top-color !default;
        +
        +$dropdown-z-index: 1 !default;
        +
        +$dropdown-bg-color: $selection-bg-top-color !default;
        +
        +$results-max-height: 200px !default;
        +$results-nested-padding: 20px !default;
        +
        +$results-choice-bg-hover-color: #3875d7 !default;
        +$results-choice-fg-hover-color: white !default;
        +
        +$results-choice-fg-unselectable-color: grey !default;
        diff --git a/bower_components/select2/src/scss/theme/classic/_multiple.scss b/bower_components/select2/src/scss/theme/classic/_multiple.scss
        new file mode 100644
        index 0000000000..e472418b76
        --- /dev/null
        +++ b/bower_components/select2/src/scss/theme/classic/_multiple.scss
        @@ -0,0 +1,93 @@
        +.select2-selection--multiple {
        +  background-color: white;
        +
        +  border: 1px solid $border-color;
        +  border-radius: $border-radius;
        +
        +  cursor: text;
        +
        +  outline: 0;
        +
        +  &:focus {
        +    border: 1px solid $focus-border-color;
        +  }
        +
        +  .select2-selection__rendered {
        +    list-style: none;
        +    margin: 0;
        +    padding: 0 5px;
        +  }
        +
        +  .select2-selection__clear {
        +    display: none;
        +  }
        +
        +  .select2-selection__choice {
        +    background-color: #e4e4e4;
        +
        +    border: 1px solid $border-color;
        +    border-radius: $border-radius;
        +
        +    cursor: default;
        +
        +    float: left;
        +
        +    margin-right: 5px;
        +    margin-top: 5px;
        +    padding: 0 5px;
        +  }
        +
        +  .select2-selection__choice__remove {
        +    color: $remove-color;
        +    cursor: pointer;
        +
        +    display: inline-block;
        +    font-weight: bold;
        +
        +    margin-right: 2px;
        +
        +    &:hover {
        +      color: $remove-hover-color;
        +    }
        +  }
        +}
        +
        +&[dir="rtl"] {
        +  .select2-selection--multiple {
        +    .select2-selection__choice {
        +      float: right;
        +    }
        +
        +    .select2-selection__choice {
        +      margin-left: 5px;
        +      margin-right: auto;
        +    }
        +
        +    .select2-selection__choice__remove {
        +      margin-left: 2px;
        +      margin-right: auto;
        +    }
        +  }
        +}
        +
        +&.select2-container--open {
        +  .select2-selection--multiple {
        +    border: 1px solid $focus-border-color;
        +  }
        +
        +  &.select2-container--above {
        +    .select2-selection--multiple {
        +      border-top: none;
        +      border-top-left-radius: 0;
        +      border-top-right-radius: 0;
        +    }
        +  }
        +
        +  &.select2-container--below {
        +    .select2-selection--multiple {
        +      border-bottom: none;
        +      border-bottom-left-radius: 0;
        +      border-bottom-right-radius: 0;
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/theme/classic/_single.scss b/bower_components/select2/src/scss/theme/classic/_single.scss
        new file mode 100644
        index 0000000000..e21de9a0fa
        --- /dev/null
        +++ b/bower_components/select2/src/scss/theme/classic/_single.scss
        @@ -0,0 +1,124 @@
        +.select2-selection--single {
        +  background-color: mix($selection-bg-top-color, $selection-bg-bottom-color);
        +
        +  border: 1px solid $border-color;
        +  border-radius: $border-radius;
        +
        +  outline: 0;
        +
        +  @include gradient-vertical($selection-bg-top-color, $selection-bg-bottom-color, 50%, 100%);
        +
        +  &:focus {
        +    border: 1px solid $focus-border-color;
        +  }
        +
        +  .select2-selection__rendered {
        +    color: #444;
        +    line-height: 28px;
        +  }
        +
        +  .select2-selection__clear {
        +    cursor: pointer;
        +    float: right;
        +    font-weight: bold;
        +    margin-right: 10px;
        +  }
        +
        +  .select2-selection__placeholder {
        +    color: #999;
        +  }
        +
        +  .select2-selection__arrow {
        +    background-color: #ddd;
        +
        +    border: none;
        +    border-left: 1px solid $border-color;
        +    border-top-right-radius: $border-radius;
        +    border-bottom-right-radius: $border-radius;
        +
        +    height: 26px;
        +
        +    position: absolute;
        +
        +    top: 1px;
        +    right: 1px;
        +
        +    width: 20px;
        +
        +    @include gradient-vertical(#eeeeee, #cccccc, 50%, 100%);
        +
        +    b {
        +      border-color: #888 transparent transparent transparent;
        +      border-style: solid;
        +      border-width: 5px 4px 0 4px;
        +
        +      height: 0;
        +      left: 50%;
        +
        +      margin-left: -4px;
        +      margin-top: -2px;
        +
        +      position: absolute;
        +
        +      top: 50%;
        +      width: 0;
        +    }
        +  }
        +}
        +
        +&[dir="rtl"] {
        +  .select2-selection--single {
        +    .select2-selection__clear {
        +      float: left;
        +    }
        +
        +    .select2-selection__arrow {
        +      border: none;
        +      border-right: 1px solid $border-color;
        +
        +      border-radius: 0;
        +      border-top-left-radius: $border-radius;
        +      border-bottom-left-radius: $border-radius;
        +
        +      left: 1px;
        +      right: auto;
        +    }
        +  }
        +}
        +
        +&.select2-container--open {
        +  .select2-selection--single {
        +    border: 1px solid $focus-border-color;
        +
        +    .select2-selection__arrow {
        +      background: transparent;
        +
        +      border: none;
        +
        +      b {
        +        border-color: transparent transparent #888 transparent;
        +        border-width: 0 4px 5px 4px;
        +      }
        +    }
        +  }
        +
        +  &.select2-container--above {
        +    .select2-selection--single {
        +      border-top: none;
        +      border-top-left-radius: 0;
        +      border-top-right-radius: 0;
        +
        +      @include gradient-vertical($selection-opened-bg-bottom-color, $selection-opened-bg-top-color, 0%, 50%);
        +    }
        +  }
        +
        +  &.select2-container--below {
        +    .select2-selection--single {
        +      border-bottom: none;
        +      border-bottom-left-radius: 0;
        +      border-bottom-right-radius: 0;
        +
        +      @include gradient-vertical($selection-opened-bg-top-color, $selection-opened-bg-bottom-color, 50%, 100%);
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/theme/classic/layout.scss b/bower_components/select2/src/scss/theme/classic/layout.scss
        new file mode 100644
        index 0000000000..d63e1d2128
        --- /dev/null
        +++ b/bower_components/select2/src/scss/theme/classic/layout.scss
        @@ -0,0 +1,64 @@
        +@import "defaults";
        +@import "../../mixins/gradients";
        +
        +.select2-container--classic {
        +  @import "single";
        +  @import "multiple";
        +
        +  .select2-search--dropdown {
        +    .select2-search__field {
        +      border: 1px solid $border-color;
        +      outline: 0;
        +    }
        +  }
        +
        +  .select2-search--inline {
        +    .select2-search__field {
        +      outline: 0;
        +      box-shadow: none;
        +    }
        +  }
        +
        +  .select2-dropdown {
        +    background-color: $dropdown-bg-color;
        +    border: 1px solid transparent;
        +  }
        +
        +  .select2-dropdown--above {
        +    border-bottom: none;
        +  }
        +
        +  .select2-dropdown--below {
        +    border-top: none;
        +  }
        +
        +  .select2-results > .select2-results__options {
        +    max-height: $results-max-height;
        +    overflow-y: auto;
        +  }
        +
        +  .select2-results__option {
        +    &[role=group] {
        +      padding: 0;
        +    }
        +
        +    &[aria-disabled=true] {
        +      color: $results-choice-fg-unselectable-color;
        +    }
        +  }
        +
        +  .select2-results__option--highlighted[aria-selected] {
        +    background-color: $results-choice-bg-hover-color;
        +    color: $results-choice-fg-hover-color;
        +  }
        +
        +  .select2-results__group {
        +    cursor: default;
        +    display: block;
        +    padding: 6px;
        +  }
        +
        +  &.select2-container--open .select2-dropdown {
        +    border-color: $focus-border-color;
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/theme/default/_multiple.scss b/bower_components/select2/src/scss/theme/default/_multiple.scss
        new file mode 100644
        index 0000000000..9e204f3b21
        --- /dev/null
        +++ b/bower_components/select2/src/scss/theme/default/_multiple.scss
        @@ -0,0 +1,98 @@
        +.select2-selection--multiple {
        +  background-color: white;
        +  border: 1px solid #aaa;
        +  border-radius: 4px;
        +  cursor: text;
        +
        +  .select2-selection__rendered {
        +    box-sizing: border-box;
        +    list-style: none;
        +    margin: 0;
        +    padding: 0 5px;
        +    width: 100%;
        +
        +    li {
        +      list-style: none;
        +    }
        +  }
        +
        +  .select2-selection__placeholder {
        +    color: #999;
        +
        +    margin-top: 5px;
        +
        +    float: left;
        +  }
        +
        +  .select2-selection__clear {
        +    cursor: pointer;
        +    float: right;
        +    font-weight: bold;
        +    margin-top: 5px;
        +    margin-right: 10px;
        +  }
        +
        +  .select2-selection__choice {
        +    background-color: #e4e4e4;
        +
        +    border: 1px solid #aaa;
        +    border-radius: 4px;
        +    cursor: default;
        +
        +    float: left;
        +
        +    margin-right: 5px;
        +    margin-top: 5px;
        +    padding: 0 5px;
        +  }
        +
        +  .select2-selection__choice__remove {
        +    color: #999;
        +    cursor: pointer;
        +
        +    display: inline-block;
        +    font-weight: bold;
        +
        +    margin-right: 2px;
        +
        +    &:hover {
        +      color: #333;
        +    }
        +  }
        +}
        +
        +&[dir="rtl"] {
        +  .select2-selection--multiple {
        +    .select2-selection__choice, .select2-selection__placeholder, .select2-search--inline {
        +      float: right;
        +    }
        +
        +    .select2-selection__choice {
        +      margin-left: 5px;
        +      margin-right: auto;
        +    }
        +
        +    .select2-selection__choice__remove {
        +      margin-left: 2px;
        +      margin-right: auto;
        +    }
        +  }
        +}
        +
        +&.select2-container--focus {
        +  .select2-selection--multiple {
        +    border: solid black 1px;
        +    outline: 0;
        +  }
        +}
        +
        +&.select2-container--disabled {
        +  .select2-selection--multiple {
        +    background-color: #eee;
        +    cursor: default;
        +  }
        +
        +  .select2-selection__choice__remove {
        +    display: none;
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/theme/default/_single.scss b/bower_components/select2/src/scss/theme/default/_single.scss
        new file mode 100644
        index 0000000000..1387af000f
        --- /dev/null
        +++ b/bower_components/select2/src/scss/theme/default/_single.scss
        @@ -0,0 +1,83 @@
        +.select2-selection--single {
        +  background-color: #fff;
        +  border: 1px solid #aaa;
        +  border-radius: 4px;
        +
        +  .select2-selection__rendered {
        +    color: #444;
        +    line-height: 28px;
        +  }
        +
        +  .select2-selection__clear {
        +    cursor: pointer;
        +    float: right;
        +    font-weight: bold;
        +  }
        +
        +  .select2-selection__placeholder {
        +    color: #999;
        +  }
        +
        +  .select2-selection__arrow {
        +    height: 26px;
        +
        +    position: absolute;
        +
        +    top: 1px;
        +    right: 1px;
        +
        +    width: 20px;
        +
        +    b {
        +      border-color: #888 transparent transparent transparent;
        +      border-style: solid;
        +      border-width: 5px 4px 0 4px;
        +
        +      height: 0;
        +      left: 50%;
        +
        +      margin-left: -4px;
        +      margin-top: -2px;
        +
        +      position: absolute;
        +
        +      top: 50%;
        +      width: 0;
        +    }
        +  }
        +}
        +
        +&[dir="rtl"] {
        +  .select2-selection--single {
        +    .select2-selection__clear {
        +      float: left;
        +    }
        +
        +    .select2-selection__arrow {
        +      left: 1px;
        +      right: auto;
        +    }
        +  }
        +}
        +
        +&.select2-container--disabled {
        +  .select2-selection--single {
        +    background-color: #eee;
        +    cursor: default;
        +
        +    .select2-selection__clear {
        +      display: none;
        +    }
        +  }
        +}
        +
        +&.select2-container--open {
        +  .select2-selection--single {
        +    .select2-selection__arrow {
        +      b {
        +        border-color: transparent transparent #888 transparent;
        +        border-width: 0 4px 5px 4px;
        +      }
        +    }
        +  }
        +}
        diff --git a/bower_components/select2/src/scss/theme/default/layout.scss b/bower_components/select2/src/scss/theme/default/layout.scss
        new file mode 100644
        index 0000000000..ea3d939972
        --- /dev/null
        +++ b/bower_components/select2/src/scss/theme/default/layout.scss
        @@ -0,0 +1,97 @@
        +.select2-container--default {
        +  @import "single";
        +  @import "multiple";
        +
        +  &.select2-container--open.select2-container--above {
        +    .select2-selection--single, .select2-selection--multiple {
        +      border-top-left-radius: 0;
        +      border-top-right-radius: 0;
        +    }
        +  }
        +
        +  &.select2-container--open.select2-container--below {
        +    .select2-selection--single, .select2-selection--multiple {
        +      border-bottom-left-radius: 0;
        +      border-bottom-right-radius: 0;
        +    }
        +  }
        +
        +  .select2-search--dropdown {
        +    .select2-search__field {
        +      border: 1px solid #aaa;
        +    }
        +  }
        +
        +  .select2-search--inline {
        +    .select2-search__field {
        +      background: transparent;
        +      border: none;
        +      outline: 0;
        +      box-shadow: none;
        +      -webkit-appearance: textfield;
        +    }
        +  }
        +
        +  .select2-results > .select2-results__options {
        +    max-height: 200px;
        +    overflow-y: auto;
        +  }
        +
        +  .select2-results__option {
        +    &[role=group] {
        +      padding: 0;
        +    }
        +
        +    &[aria-disabled=true] {
        +      color: #999;
        +    }
        +
        +    &[aria-selected=true] {
        +      background-color: #ddd;
        +    }
        +
        +    .select2-results__option {
        +      padding-left: 1em;
        +
        +      .select2-results__group {
        +        padding-left: 0;
        +      }
        +
        +      .select2-results__option {
        +        margin-left: -1em;
        +        padding-left: 2em;
        +
        +        .select2-results__option {
        +          margin-left: -2em;
        +          padding-left: 3em;
        +
        +          .select2-results__option {
        +            margin-left: -3em;
        +            padding-left: 4em;
        +
        +            .select2-results__option {
        +              margin-left: -4em;
        +              padding-left: 5em;
        +
        +              .select2-results__option {
        +                margin-left: -5em;
        +                padding-left: 6em;
        +              }
        +            }
        +          }
        +        }
        +      }
        +    }
        +  }
        +
        +  .select2-results__option--highlighted[aria-selected] {
        +    background-color: #5897fb;
        +    color: white;
        +  }
        +
        +  .select2-results__group {
        +    cursor: default;
        +    display: block;
        +    padding: 6px;
        +  }
        +}
        diff --git a/bower_components/select2/tests/a11y/search-tests.js b/bower_components/select2/tests/a11y/search-tests.js
        new file mode 100644
        index 0000000000..58e56492f5
        --- /dev/null
        +++ b/bower_components/select2/tests/a11y/search-tests.js
        @@ -0,0 +1,51 @@
        +module('Accessibility - Search');
        +
        +var MultipleSelection = require('select2/selection/multiple');
        +var InlineSearch = require('select2/selection/search');
        +
        +var $ = require('jquery');
        +
        +var Utils = require('select2/utils');
        +var Options = require('select2/options');
        +var options = new Options({});
        +
        +test('aria-autocomplete attribute is present', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
        +  var selection = new CustomSelection($select, options);
        +  var $selection = selection.render();
        +
        +  // Update the selection so the search is rendered
        +  selection.update([]);
        +
        +  assert.equal(
        +    $selection.find('input').attr('aria-autocomplete'),
        +    'list',
        +    'The search box is marked as autocomplete'
        +  );
        +});
        +
        +test('aria-activedescendant should be removed when closed', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
        +  var selection = new CustomSelection($select, options);
        +  var $selection = selection.render();
        +
        +  var container = new MockContainer();
        +  selection.bind(container, $('<span></span>'));
        +
        +  // Update the selection so the search is rendered
        +  selection.update([]);
        +
        +  var $search = $selection.find('input');
        +  $search.attr('aria-activedescendant', 'something');
        +
        +  container.trigger('close');
        +
        +  assert.ok(
        +    !$search.attr('aria-activedescendant'),
        +    'There is no active descendant when the dropdown is closed'
        +  );
        +});
        diff --git a/bower_components/select2/tests/a11y/selection-tests.js b/bower_components/select2/tests/a11y/selection-tests.js
        new file mode 100644
        index 0000000000..e2c1460274
        --- /dev/null
        +++ b/bower_components/select2/tests/a11y/selection-tests.js
        @@ -0,0 +1,154 @@
        +module('Accessibility - All');
        +
        +var BaseSelection = require('select2/selection/base');
        +var SingleSelection = require('select2/selection/single');
        +var MultipleSelection = require('select2/selection/multiple');
        +
        +var $ = require('jquery');
        +
        +var Options = require('select2/options');
        +var options = new Options({});
        +
        +test('title is carried over from original element', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var selection = new BaseSelection($select, options);
        +  var $selection = selection.render();
        +
        +  assert.equal(
        +    $selection.attr('title'),
        +    $select.attr('title'),
        +    'The title should have been copied over from the original element'
        +  );
        +});
        +
        +test('aria-expanded reflects the state of the container', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var selection = new BaseSelection($select, options);
        +  var $selection = selection.render();
        +
        +  var container = new MockContainer();
        +
        +  selection.bind(container, $('<span></span>'));
        +
        +  assert.equal(
        +    $selection.attr('aria-expanded'),
        +    'false',
        +    'The container should not be expanded when it is closed'
        +  );
        +
        +  container.trigger('open');
        +
        +  assert.equal(
        +    $selection.attr('aria-expanded'),
        +    'true',
        +    'The container should be expanded when it is opened'
        +  );
        +});
        +
        +test('static aria attributes are present', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var selection = new BaseSelection($select, options);
        +  var $selection = selection.render();
        +
        +  assert.equal(
        +    $selection.attr('role'),
        +    'combobox',
        +    'The container should identify as a combobox'
        +  );
        +
        +  assert.equal(
        +    $selection.attr('aria-haspopup'),
        +    'true',
        +    'The dropdown is considered a popup of the container'
        +  );
        +});
        +
        +test('the container should be in the tab order', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var selection = new BaseSelection($select, options);
        +  var $selection = selection.render();
        +
        +  var container = new MockContainer();
        +  selection.bind(container, $('<span></span>'));
        +
        +  assert.equal(
        +    $selection.attr('tabindex'),
        +    '0',
        +    'The tab index should allow it to fit in the natural tab order'
        +  );
        +
        +  container.trigger('disable');
        +
        +  assert.equal(
        +    $selection.attr('tabindex'),
        +    '-1',
        +    'The selection should be dropped out of the tab order when disabled'
        +  );
        +
        +  container.trigger('enable');
        +
        +  assert.equal(
        +    $selection.attr('tabindex'),
        +    '0',
        +    'The tab index should be restored when re-enabled'
        +  );
        +});
        +
        +test('a custom tabindex is copied', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +  $select.attr('tabindex', '999');
        +
        +  var selection = new BaseSelection($select, options);
        +  var $selection = selection.render();
        +
        +  var container = new MockContainer();
        +  selection.bind(container, $('<span></span>'));
        +
        +  assert.equal(
        +    $selection.attr('tabindex'),
        +    '999',
        +    'The tab index should match the original tab index'
        +  );
        +
        +  container.trigger('disable');
        +
        +  assert.equal(
        +    $selection.attr('tabindex'),
        +    '-1',
        +    'The selection should be dropped out of the tab order when disabled'
        +  );
        +
        +  container.trigger('enable');
        +
        +  assert.equal(
        +    $selection.attr('tabindex'),
        +    '999',
        +    'The tab index should be restored when re-enabled'
        +  );
        +});
        +
        +module('Accessibility - Single');
        +
        +test('aria-labelledby should match the rendered container', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var selection = new SingleSelection($select, options);
        +  var $selection = selection.render();
        +
        +  var container = new MockContainer();
        +  selection.bind(container, $('<span></span>'));
        +
        +  var $rendered = $selection.find('.select2-selection__rendered');
        +
        +  assert.equal(
        +    $selection.attr('aria-labelledby'),
        +    $rendered.attr('id'),
        +    'The rendered selection should label the container'
        +  );
        +});
        +
        +module('Accessibility - Multiple');
        diff --git a/bower_components/select2/tests/data/array-tests.js b/bower_components/select2/tests/data/array-tests.js
        new file mode 100644
        index 0000000000..65a6e32c3d
        --- /dev/null
        +++ b/bower_components/select2/tests/data/array-tests.js
        @@ -0,0 +1,318 @@
        +module('Data adapters - Array');
        +
        +var ArrayData = require('select2/data/array');
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +
        +var arrayOptions = new Options({
        +  data: [
        +    {
        +      id: 'default',
        +      text: 'Default'
        +    },
        +    {
        +      id: '1',
        +      text: 'One'
        +    },
        +    {
        +      id: '2',
        +      text: '2'
        +    }
        +  ]
        +});
        +
        +var extraOptions = new Options ({
        +  data: [
        +    {
        +      id: 'default',
        +      text: 'Default',
        +      extra: true
        +    },
        +    {
        +      id: 'One',
        +      text: 'One',
        +      extra: true
        +    }
        +  ]
        +});
        +
        +var nestedOptions = new Options({
        +  data: [
        +    {
        +      text: 'Default',
        +      children: [
        +        {
        +          text: 'Next',
        +          children: [
        +            {
        +              id: 'a',
        +              text: 'Option'
        +            }
        +          ]
        +        }
        +      ]
        +    }
        +  ]
        +});
        +
        +test('current gets default for single', function (assert) {
        +  var $select = $('#qunit-fixture .single-empty');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  data.current(function (val) {
        +    assert.equal(
        +      val.length,
        +      1,
        +      'There should always be a selected item for array data.'
        +    );
        +
        +    var item = val[0];
        +
        +    assert.equal(
        +      item.id,
        +      'default',
        +      'The first item should be selected'
        +    );
        +  });
        +});
        +
        +test('current gets default for multiple', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  data.current(function (val) {
        +    assert.equal(
        +      val.length,
        +      0,
        +      'There should be no default selection.'
        +    );
        +  });
        +});
        +
        +test('current works with existing selections', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  $select.val(['One']);
        +
        +  data.current(function (val) {
        +    assert.equal(
        +      val.length,
        +      1,
        +      'There should only be one existing selection.'
        +    );
        +
        +    var option = val[0];
        +
        +    assert.equal(
        +      option.id,
        +      'One',
        +      'The id should be equal to the value of the option tag.'
        +    );
        +
        +    assert.equal(
        +      option.text,
        +      'One',
        +      'The text should be equal to the text of the option tag.'
        +    );
        +  });
        +});
        +
        +test('current works with selected data', function (assert) {
        +  var $select = $('#qunit-fixture .single-empty');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  data.select({
        +    id: '2',
        +    text: '2'
        +  });
        +
        +  data.current(function (val) {
        +    assert.equal(
        +      val.length,
        +      1,
        +      'There should only be one option selected.'
        +    );
        +
        +    var option = val[0];
        +
        +    assert.equal(
        +      option.id,
        +      '2',
        +      'The id should match the original id from the array.'
        +    );
        +
        +    assert.equal(
        +      option.text,
        +      '2',
        +      'The text should match the original text from the array.'
        +    );
        +  });
        +});
        +
        +test('select works for single', function (assert) {
        +  var $select = $('#qunit-fixture .single-empty');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  assert.equal(
        +    $select.val(),
        +    'default',
        +    'There should already be a selection'
        +  );
        +
        +  data.select({
        +    id: '1',
        +    text: 'One'
        +  });
        +
        +  assert.equal(
        +    $select.val(),
        +    '1',
        +    'The selected value should be the same as the selected id'
        +  );
        +});
        +
        +test('multiple sets the value', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  assert.equal($select.val(), null);
        +
        +  data.select({
        +    id: 'default',
        +    text: 'Default'
        +  });
        +
        +  assert.deepEqual($select.val(), ['default']);
        +});
        +
        +test('multiple adds to the old value', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  $select.val(['One']);
        +
        +  assert.deepEqual($select.val(), ['One']);
        +
        +  data.select({
        +    id: 'default',
        +    text: 'Default'
        +  });
        +
        +  assert.deepEqual($select.val(), ['One', 'default']);
        +});
        +
        +test('option tags are automatically generated', function (assert) {
        +  var $select = $('#qunit-fixture .single-empty');
        +
        +  var data = new ArrayData($select, arrayOptions);
        +
        +  assert.equal(
        +    $select.find('option').length,
        +    3,
        +    'An <option> element should be created for each object'
        +  );
        +});
        +
        +test('option tags can receive new data', function(assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var data = new ArrayData($select, extraOptions);
        +
        +  assert.equal(
        +    $select.find('option').length,
        +    2,
        +    'Only one more <option> element should be created'
        +  );
        +
        +  data.select({
        +    id: 'default'
        +  });
        +
        +  assert.ok(
        +    $select.find(':selected').data('data').extra,
        +    '<option> default should have new data'
        +  );
        +
        +  data.select({
        +    id: 'One'
        +  });
        +
        +  assert.ok(
        +    $select.find(':selected').data('data').extra,
        +    '<option> One should have new data'
        +  );
        +});
        +
        +test('optgroup tags can also be generated', function (assert) {
        +  var $select = $('#qunit-fixture .single-empty');
        +
        +  var data = new ArrayData($select, nestedOptions);
        +
        +  assert.equal(
        +    $select.find('option').length,
        +    1,
        +    'An <option> element should be created for the one selectable object'
        +  );
        +
        +  assert.equal(
        +    $select.find('optgroup').length,
        +    2,
        +    'An <optgroup> element should be created for the two with children'
        +  );
        +});
        +
        +test('optgroup tags have the right properties', function (assert) {
        +  var $select = $('#qunit-fixture .single-empty');
        +
        +  var data = new ArrayData($select, nestedOptions);
        +
        +  var $group = $select.children('optgroup');
        +
        +  assert.equal(
        +    $group.prop('label'),
        +    'Default',
        +    'An `<optgroup>` label should match the text property'
        +  );
        +
        +  assert.equal(
        +    $group.children().length,
        +    1,
        +    'The <optgroup> should have one child under it'
        +  );
        +});
        +
        +test('existing selections are respected on initialization', function (assert) {
        +   var $select = $(
        +     '<select>' +
        +        '<option>First</option>' +
        +        '<option selected>Second</option>' +
        +      '</select>'
        +    );
        +
        +    var options = new Options({
        +      data: [
        +        {
        +          id: 'Second',
        +          text: 'Second'
        +        },
        +        {
        +          id: 'Third',
        +          text: 'Third'
        +        }
        +      ]
        +    });
        +
        +    assert.equal($select.val(), 'Second');
        +
        +    var data = new ArrayData($select, options);
        +
        +    assert.equal($select.val(), 'Second');
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/data/base-tests.js b/bower_components/select2/tests/data/base-tests.js
        new file mode 100644
        index 0000000000..b90158f371
        --- /dev/null
        +++ b/bower_components/select2/tests/data/base-tests.js
        @@ -0,0 +1,29 @@
        +module('Data adapters - Base');
        +
        +var BaseData = require('select2/data/base');
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +
        +var options = new Options({});
        +
        +test('current is required', function (assert) {
        +  var data = new BaseData($('#qunit-fixture select'), options);
        +
        +  assert.throws(
        +    function () {
        +      data.current(function () {});
        +    },
        +    'current has no default implementation'
        +  );
        +});
        +
        +test('query is required', function (assert) {
        +  var data = new BaseData($('#qunit-fixture select'), options);
        +
        +  assert.throws(
        +    function () {
        +      data.query({}, function () {});
        +    },
        +    'query has no default implementation'
        +  );
        +});
        diff --git a/bower_components/select2/tests/data/inputData-tests.js b/bower_components/select2/tests/data/inputData-tests.js
        new file mode 100644
        index 0000000000..f2124efba7
        --- /dev/null
        +++ b/bower_components/select2/tests/data/inputData-tests.js
        @@ -0,0 +1,158 @@
        +module('Data adapters - <input> compatibility');
        +
        +var $ = require('jquery');
        +
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var ArrayData = require('select2/data/array');
        +var InputData = require('select2/compat/inputData');
        +
        +var InputAdapter = Utils.Decorate(ArrayData, InputData);
        +
        +test('test that options can be selected', function (assert) {
        +  var options = new Options({
        +    data: [
        +      {
        +        id: 'test',
        +        text: 'Test'
        +      }
        +    ]
        +  });
        +  var $element = $('<input />');
        +
        +  var adapter = new InputAdapter($element, options);
        +
        +  adapter.select({
        +    id: 'test'
        +  });
        +
        +  assert.equal(
        +    $element.val(),
        +    'test',
        +    'The id of the item should be the value'
        +  );
        +});
        +
        +test('unselect the single selected option clears the value', function (assert) {
        +  var options = new Options({
        +    data: [
        +      {
        +        id: 'test',
        +        text: 'Test',
        +        selected: true
        +      }
        +    ]
        +  });
        +  var $element = $('<input />');
        +
        +  var adapter = new InputAdapter($element, options);
        +
        +  adapter.unselect({
        +    id: 'test'
        +  });
        +
        +  assert.equal(
        +    $element.val(),
        +    '',
        +    'The id should no longer be in the value'
        +  );
        +});
        +
        +test('options can be unselected individually', function (assert) {
        +  var options = new Options({
        +    data: [
        +      {
        +        id: 'test',
        +        text: 'Test'
        +      },
        +      {
        +        id: 'test2',
        +        text: 'Test2'
        +      },
        +      {
        +        id: 'test3',
        +        text: 'Test3'
        +      }
        +    ]
        +  });
        +  var $element = $('<input />');
        +  $element.val('test,test2,test3');
        +
        +  var adapter = new InputAdapter($element, options);
        +
        +  adapter.unselect({
        +    id: 'test2'
        +  });
        +
        +  assert.equal(
        +    $element.val(),
        +    'test,test3',
        +    'The value should contain all the still selected options'
        +  );
        +});
        +
        +test('default values can be set', function (assert) {
        +  assert.expect(4);
        +
        +  var options = new Options({
        +    data: [
        +      {
        +        id: 'test',
        +        text: 'Test'
        +      }
        +    ]
        +  });
        +  var $element = $('<input value="test" />');
        +
        +  var adapter = new InputAdapter($element, options);
        +
        +  adapter.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      1,
        +      'There should only be a single selected option'
        +    );
        +
        +    var item = data[0];
        +
        +    assert.equal(item.id, 'test');
        +    assert.equal(item.text, 'Test');
        +  });
        +
        +  assert.equal(
        +    $element.val(),
        +    'test',
        +    'The value should not have been altered'
        +  );
        +});
        +
        +test('no default value', function (assert) {
        +  assert.expect(2);
        +
        +  var options = new Options({
        +    data: [
        +      {
        +        id: 'test',
        +        text: 'Test'
        +      }
        +    ]
        +  });
        +  var $element = $('<input />');
        +
        +  var adapter = new InputAdapter($element, options);
        +
        +  adapter.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      0,
        +      'There should be no selected options'
        +    );
        +  });
        +
        +  assert.equal(
        +    $element.val(),
        +    '',
        +    'The value should not have been altered'
        +  );
        +});
        diff --git a/bower_components/select2/tests/data/maximumInputLength-tests.js b/bower_components/select2/tests/data/maximumInputLength-tests.js
        new file mode 100644
        index 0000000000..e8557139ae
        --- /dev/null
        +++ b/bower_components/select2/tests/data/maximumInputLength-tests.js
        @@ -0,0 +1,138 @@
        +module('Data adapters - Maximum input length');
        +
        +var MaximumInputLength = require('select2/data/maximumInputLength');
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +function MaximumInputStub () {
        +  this.called = false;
        +}
        +
        +MaximumInputStub.prototype.query = function (params, callback) {
        +  this.called = true;
        +};
        +
        +var MaximumInputData = Utils.Decorate(MaximumInputStub, MaximumInputLength);
        +
        +test('0 never displays the notice', function (assert) {
        +  var zeroOptions = new Options({
        +    maximumInputLength: 0
        +  });
        +
        +  var data = new MaximumInputData(null, zeroOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumInputData(null, zeroOptions);
        +
        +  data.query({
        +    term: 'test'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('< 0 never displays the notice', function (assert) {
        +  var negativeOptions = new Options({
        +    maximumInputLength: -1
        +  });
        +
        +  var data = new MaximumInputData(null, negativeOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumInputData(null, negativeOptions);
        +
        +  data.query({
        +    term: 'test'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('triggers when input is too long', function (assert) {
        +  var options = new Options({
        +    maximumInputLength: 1
        +  });
        +
        +  var data = new MaximumInputData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(true, 'The event should be triggered.');
        +  };
        +
        +  data.query({
        +    term: 'no'
        +  });
        +
        +  assert.ok(!data.called, 'The adapter should not be called');
        +});
        +
        +test('does not trigger when equal', function (assert) {
        +  var options = new Options({
        +    maximumInputLength: 10
        +  });
        +
        +  var data = new MaximumInputData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'The event should not be triggered.');
        +  };
        +
        +  data.query({
        +    term: '1234567890'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('does not trigger when less', function (assert) {
        +  var options = new Options({
        +    maximumInputLength: 10
        +  });
        +
        +  var data = new MaximumInputData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'The event should not be triggered.');
        +  };
        +
        +  data.query({
        +    term: '123'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('works with null term', function (assert) {
        +  var options = new Options({
        +    maximumInputLength: 1
        +  });
        +
        +  var data = new MaximumInputData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'The event should not be triggered');
        +  };
        +
        +  data.query({});
        +
        +  assert.ok(data.called);
        +});
        diff --git a/bower_components/select2/tests/data/maximumSelectionLength-tests.js b/bower_components/select2/tests/data/maximumSelectionLength-tests.js
        new file mode 100644
        index 0000000000..89943b383a
        --- /dev/null
        +++ b/bower_components/select2/tests/data/maximumSelectionLength-tests.js
        @@ -0,0 +1,202 @@
        +module('Data adapters - Maximum selection length');
        +
        +var MaximumSelectionLength = require('select2/data/maximumSelectionLength');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +function MaximumSelectionStub () {
        +  this.called = false;
        +  this.currentData = [];
        +}
        +
        +MaximumSelectionStub.prototype.current = function (callback) {
        +  callback(this.currentData);
        +};
        +
        +MaximumSelectionStub.prototype.val = function (val) {
        +  this.currentData.push(val);
        +};
        +
        +MaximumSelectionStub.prototype.query = function (params, callback) {
        +  this.called = true;
        +};
        +
        +var MaximumSelectionData = Utils.Decorate(
        +  MaximumSelectionStub,
        +  MaximumSelectionLength
        +);
        +
        +test('0 never displays the notice', function (assert) {
        +  var zeroOptions = new Options({
        +    maximumSelectionLength: 0
        +  });
        +
        +  var data = new MaximumSelectionData(null, zeroOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumSelectionData(null, zeroOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.val('1');
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumSelectionData(null, zeroOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.val('1');
        +  data.val('2');
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('< 0 never displays the notice', function (assert) {
        +  var negativeOptions = new Options({
        +    maximumSelectionLength: -1
        +  });
        +
        +  var data = new MaximumSelectionData(null, negativeOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumSelectionData(null, negativeOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.val('1');
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumSelectionData(null, negativeOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.val('1');
        +  data.val('2');
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('triggers when >= 1 selection' , function (assert) {
        +  var maxOfOneOptions = new Options({
        +    maximumSelectionLength: 1
        +  });
        +  var data = new MaximumSelectionData(null, maxOfOneOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumSelectionData(null, maxOfOneOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(true, 'The event should be triggered.');
        +  };
        +
        +  data.val('1');
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(!data.called);
        +
        +});
        +
        +test('triggers when >= 2 selections' , function (assert) {
        +  var maxOfTwoOptions = new Options({
        +    maximumSelectionLength: 2
        +  });
        +  var data = new MaximumSelectionData(null, maxOfTwoOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumSelectionData(null, maxOfTwoOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.val('1');
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MaximumSelectionData(null, maxOfTwoOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(true, 'The event should be triggered.');
        +  };
        +
        +  data.val('1');
        +  data.val('2');
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(!data.called);
        +
        +});
        diff --git a/bower_components/select2/tests/data/minimumInputLength-tests.js b/bower_components/select2/tests/data/minimumInputLength-tests.js
        new file mode 100644
        index 0000000000..a67db08d88
        --- /dev/null
        +++ b/bower_components/select2/tests/data/minimumInputLength-tests.js
        @@ -0,0 +1,138 @@
        +module('Data adapters - Minimum input length');
        +
        +var MinimumInputLength = require('select2/data/minimumInputLength');
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +function StubData () {
        +  this.called = false;
        +}
        +
        +StubData.prototype.query = function (params, callback) {
        +  this.called = true;
        +};
        +
        +var MinimumData = Utils.Decorate(StubData, MinimumInputLength);
        +
        +test('0 never displays the notice', function (assert) {
        +  var zeroOptions = new Options({
        +    minimumInputLength: 0
        +  });
        +
        +  var data = new MinimumData(null, zeroOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MinimumData(null, zeroOptions);
        +
        +  data.query({
        +    term: 'test'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('< 0 never displays the notice', function (assert) {
        +  var negativeOptions = new Options({
        +    minimumInputLength: -1
        +  });
        +
        +  var data = new MinimumData(null, negativeOptions);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'No events should be triggered');
        +  };
        +
        +  data.query({
        +    term: ''
        +  });
        +
        +  assert.ok(data.called);
        +
        +  data = new MinimumData(null, negativeOptions);
        +
        +  data.query({
        +    term: 'test'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('triggers when input is not long enough', function (assert) {
        +  var options = new Options({
        +    minimumInputLength: 10
        +  });
        +
        +  var data = new MinimumData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(true, 'The event should be triggered.');
        +  };
        +
        +  data.query({
        +    term: 'no'
        +  });
        +
        +  assert.ok(!data.called);
        +});
        +
        +test('does not trigger when equal', function (assert) {
        +  var options = new Options({
        +    minimumInputLength: 10
        +  });
        +
        +  var data = new MinimumData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'The event should not be triggered.');
        +  };
        +
        +  data.query({
        +    term: '1234567890'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('does not trigger when greater', function (assert) {
        +  var options = new Options({
        +    minimumInputLength: 10
        +  });
        +
        +  var data = new MinimumData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(false, 'The event should not be triggered.');
        +  };
        +
        +  data.query({
        +    term: '12345678901'
        +  });
        +
        +  assert.ok(data.called);
        +});
        +
        +test('works with null term', function (assert) {
        +  var options = new Options({
        +    minimumInputLength: 1
        +  });
        +
        +  var data = new MinimumData(null, options);
        +
        +  data.trigger = function () {
        +    assert.ok(true, 'The event should be triggered');
        +  };
        +
        +  data.query({});
        +
        +  assert.ok(!data.called);
        +});
        diff --git a/bower_components/select2/tests/data/select-tests.js b/bower_components/select2/tests/data/select-tests.js
        new file mode 100644
        index 0000000000..90d9609089
        --- /dev/null
        +++ b/bower_components/select2/tests/data/select-tests.js
        @@ -0,0 +1,457 @@
        +module('Data adapters - Select - current');
        +
        +var SelectData = require('select2/data/select');
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var selectOptions = new Options({});
        +
        +test('current gets default for single', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      1,
        +      'There should only be one selected option'
        +    );
        +
        +    var option = data[0];
        +
        +    assert.equal(
        +      option.id,
        +      'One',
        +      'The value of the option tag should be the id'
        +    );
        +
        +    assert.equal(
        +      option.text,
        +      'One',
        +      'The text within the option tag should be the text'
        +    );
        +  });
        +});
        +
        +test('current gets default for multiple', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      0,
        +      'Multiple selects have no default selection.'
        +    );
        +  });
        +});
        +
        +test('current gets options with explicit value', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var $option = $('<option value="1">One</option>');
        +  $select.append($option);
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  $select.val('1');
        +
        +  data.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      1,
        +      'There should be one selected option'
        +    );
        +
        +    var option = data[0];
        +
        +    assert.equal(
        +      option.id,
        +      '1',
        +      'The option value should be the selected id'
        +    );
        +
        +    assert.equal(
        +      option.text,
        +      'One',
        +      'The text should match the text for the option tag'
        +    );
        +  });
        +});
        +
        +test('current gets options with implicit value', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  $select.val('One');
        +
        +  data.current(function (val) {
        +    assert.equal(
        +      val.length,
        +      1,
        +      'There should only be one selected value'
        +    );
        +
        +    var option = val[0];
        +
        +    assert.equal(
        +      option.id,
        +      'One',
        +      'The id should be the same as the option text'
        +    );
        +
        +    assert.equal(
        +      option.text,
        +      'One',
        +      'The text should be the same as the option text'
        +    );
        +  });
        +});
        +
        +test('select works for single', function (assert) {
        +  var $select = $('#qunit-fixture .single-with-placeholder');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  assert.equal($select.val(), 'placeholder');
        +
        +  data.select({
        +    id: 'One',
        +    text: 'One'
        +  });
        +
        +  assert.equal($select.val(), 'One');
        +});
        +
        +test('multiple sets the value', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  assert.equal($select.val(), null);
        +
        +  data.select({
        +    id: 'Two',
        +    text: 'Two'
        +  });
        +
        +  assert.deepEqual($select.val(), ['Two']);
        +});
        +
        +test('multiple adds to the old value', function (assert) {
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  $select.val(['Two']);
        +
        +  assert.deepEqual($select.val(), ['Two']);
        +
        +  data.select({
        +    id: 'One',
        +    text: 'One'
        +  });
        +
        +  assert.deepEqual($select.val(), ['One', 'Two']);
        +});
        +
        +test('duplicates - single - same id on select triggers change',
        +  function (assert) {
        +  var $select = $('#qunit-fixture .duplicates');
        +
        +  var data = new SelectData($select, data);
        +  var second = $('#qunit-fixture .duplicates option')[2];
        +
        +  var changeTriggered = false;
        +
        +  assert.equal($select.val(), 'one');
        +
        +  $select.on('change', function () {
        +    changeTriggered = true;
        +  });
        +
        +  data.select({
        +    id: 'one',
        +    text: 'Uno',
        +    element: second
        +  });
        +
        +  assert.equal(
        +    $select.val(),
        +    'one',
        +    'The value never changed'
        +  );
        +
        +  assert.ok(
        +    changeTriggered,
        +    'The change event should be triggered'
        +  );
        +
        +  assert.ok(
        +    second.selected,
        +    'The second duplicate is selected, not the first'
        +  );
        +});
        +
        +test('duplicates - single - different id on select triggers change',
        +  function (assert) {
        +  var $select = $('#qunit-fixture .duplicates');
        +
        +  var data = new SelectData($select, data);
        +  var second = $('#qunit-fixture .duplicates option')[2];
        +
        +  var changeTriggered = false;
        +
        +  $select.val('two');
        +
        +  $select.on('change', function () {
        +    changeTriggered = true;
        +  });
        +
        +  data.select({
        +    id: 'one',
        +    text: 'Uno',
        +    element: second
        +  });
        +
        +  assert.equal(
        +    $select.val(),
        +    'one',
        +    'The value changed to the duplicate id'
        +  );
        +
        +  assert.ok(
        +    changeTriggered,
        +    'The change event should be triggered'
        +  );
        +
        +  assert.ok(
        +    second.selected,
        +    'The second duplicate is selected, not the first'
        +  );
        +});
        +
        +test('duplicates - multiple - same id on select triggers change',
        +function (assert) {
        +  var $select = $('#qunit-fixture .duplicates-multi');
        +
        +  var data = new SelectData($select, data);
        +  var second = $('#qunit-fixture .duplicates-multi option')[2];
        +
        +  var changeTriggered = false;
        +
        +  $select.val(['one']);
        +
        +  $select.on('change', function () {
        +    changeTriggered = true;
        +  });
        +
        +  data.select({
        +    id: 'one',
        +    text: 'Uno',
        +    element: second
        +  });
        +
        +  assert.deepEqual(
        +    $select.val(),
        +    ['one', 'one'],
        +    'The value now has duplicates'
        +  );
        +
        +  assert.ok(
        +    changeTriggered,
        +    'The change event should be triggered'
        +  );
        +
        +  assert.ok(
        +    second.selected,
        +    'The second duplicate is selected, not the first'
        +  );
        +});
        +
        +test('duplicates - multiple - different id on select triggers change',
        +function (assert) {
        +  var $select = $('#qunit-fixture .duplicates-multi');
        +
        +  var data = new SelectData($select, data);
        +  var second = $('#qunit-fixture .duplicates-multi option')[2];
        +
        +  var changeTriggered = false;
        +
        +  $select.val(['two']);
        +
        +  $select.on('change', function () {
        +    changeTriggered = true;
        +  });
        +
        +  data.select({
        +    id: 'one',
        +    text: 'Uno',
        +    element: second
        +  });
        +
        +  assert.deepEqual(
        +    $select.val(),
        +    ['two', 'one'],
        +    'The value has the new id'
        +  );
        +
        +  assert.ok(
        +    changeTriggered,
        +    'The change event should be triggered'
        +  );
        +
        +  assert.ok(
        +    second.selected,
        +    'The second duplicate is selected, not the first'
        +  );
        +});
        +
        +module('Data adapter - Select - query');
        +
        +test('all options are returned with no term', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.query({}, function (data) {
        +    assert.equal(
        +      data.results.length,
        +      1,
        +      'The number of items returned should be equal to the number of options'
        +    );
        +  });
        +});
        +
        +test('the matcher checks the text', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.query({
        +    term: 'One'
        +  }, function (data) {
        +    assert.equal(
        +      data.results.length,
        +      1,
        +      'Only the "One" option should be found'
        +    );
        +  });
        +});
        +
        +test('the matcher ignores case', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.query({
        +    term: 'one'
        +  }, function (data) {
        +    assert.equal(
        +      data.results.length,
        +      1,
        +      'The "One" option should still be found'
        +    );
        +  });
        +});
        +
        +test('no options may be returned with no matches', function (assert) {
        +  var $select = $('#qunit-fixture .single');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.query({
        +    term: 'qwerty'
        +  }, function (data) {
        +    assert.equal(
        +      data.results.length,
        +      0,
        +      'Only matching items should be returned'
        +    );
        +  });
        +});
        +
        +test('optgroup tags are marked with children', function (assert) {
        +  var $select = $('#qunit-fixture .groups');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.query({}, function (data) {
        +    assert.ok(
        +      'children' in data.results[0],
        +      'The optgroup element should have children when queried'
        +    );
        +  });
        +});
        +
        +test('empty optgroups are still shown when queried', function (assert) {
        +  var $select = $('#qunit-fixture .groups');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.query({}, function (data) {
        +    assert.equal(
        +      data.results.length,
        +      2,
        +      'The empty optgroup element should still be returned when queried'
        +    );
        +
        +    var item = data.results[1];
        +
        +    assert.equal(
        +      item.text,
        +      'Empty',
        +      'The text of the empty optgroup should match the label'
        +    );
        +
        +    assert.equal(
        +      item.children.length,
        +      0,
        +      'There should be no children in the empty opgroup'
        +    );
        +  });
        +});
        +
        +test('multiple options with the same value are returned', function (assert) {
        +  var $select = $('#qunit-fixture .duplicates');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  data.query({}, function (data) {
        +    assert.equal(
        +      data.results.length,
        +      3,
        +      'The duplicate option should still be returned when queried'
        +    );
        +
        +    var first = data.results[0];
        +    var duplicate = data.results[2];
        +
        +    assert.equal(
        +      first.id,
        +      duplicate.id,
        +      'The duplicates should have the same id'
        +    );
        +
        +    assert.notEqual(
        +      first.text,
        +      duplicate.text,
        +      'The duplicates do not have the same text'
        +    );
        +  });
        +});
        +
        +test('data objects use the text of the option', function (assert) {
        +  var $select = $('#qunit-fixture .duplicates');
        +
        +  var data = new SelectData($select, selectOptions);
        +
        +  var $option = $('<option>&amp;</option>');
        +
        +  var item = data.item($option);
        +
        +  assert.equal(item.id, '&');
        +  assert.equal(item.text, '&');
        +});
        diff --git a/bower_components/select2/tests/data/tags-tests.js b/bower_components/select2/tests/data/tags-tests.js
        new file mode 100644
        index 0000000000..95b3fdeb7b
        --- /dev/null
        +++ b/bower_components/select2/tests/data/tags-tests.js
        @@ -0,0 +1,261 @@
        +module('Data adapters - Tags');
        +
        +var SelectData = require('select2/data/select');
        +var Tags = require('select2/data/tags');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var SelectTags = Utils.Decorate(SelectData, Tags);
        +var options = new Options({
        +  tags: true
        +});
        +
        +test('does not trigger on blank or null terms', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    term: ''
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 'One');
        +    assert.equal(item.text, 'One');
        +  });
        +
        +  data.query({
        +    term: null
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 'One');
        +    assert.equal(item.text, 'One');
        +  });
        +});
        +
        +test('white space is trimmed by default', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    term: '  '
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 'One');
        +    assert.equal(item.text, 'One');
        +  });
        +
        +  data.query({
        +    term: ' One '
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 'One');
        +    assert.equal(item.text, 'One');
        +  });
        +});
        +
        +test('does not trigger for additional pages', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    page: 2
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 'One');
        +    assert.equal(item.text, 'One');
        +  });
        +});
        +
        +test('creates tag at beginning', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    term: 'o'
        +  }, function (data) {
        +    assert.equal(data.results.length, 2);
        +
        +    var first = data.results[0];
        +
        +    assert.equal(first.id, 'o');
        +    assert.equal(first.text, 'o');
        +  });
        +});
        +
        +test('tags can be the only result', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    term: 'test'
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 'test');
        +    assert.equal(item.text, 'test');
        +  });
        +});
        +
        +test('tags are injected as options', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    term: 'test'
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var $children = $('#qunit-fixture .single option');
        +
        +    assert.equal($children.length, 2);
        +
        +    var $tag = $children.last();
        +
        +    assert.equal($tag.val(), 'test');
        +    assert.equal($tag.text(), 'test');
        +  });
        +});
        +
        +test('old tags are removed automatically', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    term: 'first'
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var $children = $('#qunit-fixture .single option');
        +
        +    assert.equal($children.length, 2);
        +  });
        +
        +  data.query({
        +    term: 'second'
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var $children = $('#qunit-fixture .single option');
        +
        +    assert.equal($children.length, 2);
        +
        +    var $tag = $children.last();
        +
        +    assert.equal($tag.val(), 'second');
        +    assert.equal($tag.text(), 'second');
        +  });
        +});
        +
        +test('insertTag controls the tag location', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.insertTag = function (data, tag) {
        +    data.push(tag);
        +  };
        +
        +  data.query({
        +    term: 'o'
        +  }, function (data) {
        +    assert.equal(data.results.length, 2);
        +
        +    var item = data.results[1];
        +
        +    assert.equal(item.id, 'o');
        +    assert.equal(item.text, 'o');
        +  });
        +});
        +
        +test('insertTag can be controlled through the options', function (assert) {
        +  var options = new Options({
        +    insertTag: function (data, tag) {
        +      data.push(tag);
        +    }
        +  });
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.query({
        +    term: 'o'
        +  }, function (data) {
        +    assert.equal(data.results.length, 2);
        +
        +    var item = data.results[1];
        +
        +    assert.equal(item.id, 'o');
        +    assert.equal(item.text, 'o');
        +  });
        +});
        +
        +test('createTag controls the tag object', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.createTag = function (params) {
        +    return {
        +      id: 0,
        +      text: params.term
        +    };
        +  };
        +
        +  data.query({
        +    term: 'test'
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 0);
        +    assert.equal(item.text, 'test');
        +  });
        +});
        +
        +test('createTag returns null for no tag', function (assert) {
        +  var data = new SelectTags($('#qunit-fixture .single'), options);
        +
        +  data.createTag = function (params) {
        +    return null;
        +  };
        +
        +  data.query({
        +    term: 'o'
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +  });
        +});
        +
        +test('the createTag options customizes the function', function (assert) {
        +  var data = new SelectTags(
        +    $('#qunit-fixture .single'),
        +    new Options({
        +      tags: true,
        +      createTag: function (params) {
        +        return {
        +          id: params.term,
        +          text: params.term,
        +          tag: true
        +        };
        +      }
        +    })
        +  );
        +
        +  data.query({
        +    term: 'test'
        +  }, function (data) {
        +    assert.equal(data.results.length, 1);
        +
        +    var item = data.results[0];
        +
        +    assert.equal(item.id, 'test');
        +    assert.equal(item.text, 'test');
        +    assert.equal(item.tag, true);
        +  });
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/data/tokenizer-tests.js b/bower_components/select2/tests/data/tokenizer-tests.js
        new file mode 100644
        index 0000000000..2fa0121104
        --- /dev/null
        +++ b/bower_components/select2/tests/data/tokenizer-tests.js
        @@ -0,0 +1,219 @@
        +module('Data adaptor - Tokenizer');
        +
        +test('triggers the select event', function (assert) {
        +  assert.expect(2);
        +
        +  var SelectData = require('select2/data/select');
        +  var Tokenizer = require('select2/data/tokenizer');
        +  var Tags = require('select2/data/tags');
        +
        +  var Options = require('select2/options');
        +  var Utils = require('select2/utils');
        +
        +  var $ = require('jquery');
        +
        +  var TokenizedSelect = Utils.Decorate(
        +    Utils.Decorate(SelectData, Tags),
        +    Tokenizer
        +  );
        +  var $select = $('#qunit-fixture .single');
        +
        +  var options = new Options({
        +    tags: true,
        +    tokenSeparators: [',']
        +  });
        +
        +  var container = new MockContainer();
        +  container.dropdown = container.selection = {};
        +
        +  var $container = $('<div></div>');
        +
        +  var data = new TokenizedSelect($select, options);
        +  data.bind(container, $container);
        +
        +  data.on('select', function () {
        +    assert.ok(true, 'The select event should be triggered');
        +  });
        +
        +  data.query({
        +    term: 'first,second'
        +  }, function () {
        +    assert.ok(true, 'The callback should have succeeded');
        +  });
        +});
        +
        +test('createTag can return null', function (assert) {
        +  assert.expect(3);
        +
        +  var SelectData = require('select2/data/select');
        +  var Tokenizer = require('select2/data/tokenizer');
        +  var Tags = require('select2/data/tags');
        +
        +  var Options = require('select2/options');
        +  var Utils = require('select2/utils');
        +
        +  var $ = require('jquery');
        +
        +  var TokenizedSelect = Utils.Decorate(
        +    Utils.Decorate(SelectData, Tags),
        +    Tokenizer
        +  );
        +  var $select = $('#qunit-fixture .single');
        +
        +  var options = new Options({
        +    tags: true,
        +    tokenSeparators: [','],
        +    createTag: function () {
        +      assert.ok(true, 'createTag should have been called');
        +
        +      return null;
        +    }
        +  });
        +
        +  var container = new MockContainer();
        +  container.dropdown = container.selection = {};
        +
        +  var $container = $('<div></div>');
        +
        +  var data = new TokenizedSelect($select, options);
        +  data.bind(container, $container);
        +
        +  data.on('select', function (params) {
        +    if (params.data == null) {
        +      assert.ok(false, 'Null data should never be selected');
        +    }
        +  });
        +
        +  data.query({
        +    term: 'first,second'
        +  }, function () {
        +    assert.ok(true, 'The callback should have succeeded');
        +  });
        +});
        +
        +test('createTag returning null does not cut the term', function (assert) {
        +  assert.expect(4);
        +
        +  var SelectData = require('select2/data/select');
        +  var Tokenizer = require('select2/data/tokenizer');
        +  var Tags = require('select2/data/tags');
        +
        +  var Options = require('select2/options');
        +  var Utils = require('select2/utils');
        +
        +  var $ = require('jquery');
        +
        +  var TokenizedSelect = Utils.Decorate(
        +    Utils.Decorate(SelectData, Tags),
        +    Tokenizer
        +  );
        +  var $select = $('#qunit-fixture .single');
        +
        +  var options = new Options({
        +    tags: true,
        +    tokenSeparators: [',', '"'],
        +    createTag: function (params) {
        +      var term = params.term;
        +
        +      // Ignore blanks
        +      if (term.length === 0) {
        +        return null;
        +      }
        +
        +      // Ignore the leading quote
        +      if (term === '"') {
        +        return null;
        +      }
        +
        +      // If there is a leading quote, check for a second one
        +      if (term[0] === '"' && term[term.length - 1] !== '"') {
        +        return null;
        +      }
        +
        +      var text = term.substr(1, term.length - 2);
        +
        +      return {
        +        id: term,
        +        text: text
        +      };
        +    }
        +  });
        +
        +  var container = new MockContainer();
        +  container.dropdown = container.selection = {};
        +
        +  var $container = $('<div></div>');
        +
        +  var data = new TokenizedSelect($select, options);
        +  data.bind(container, $container);
        +
        +  data.on('select', function (params) {
        +    assert.ok(params.data, 'Data should not be null');
        +
        +    assert.equal(
        +      params.data.id,
        +      '"first, second"',
        +      'The id should have the quotes'
        +    );
        +
        +    assert.equal(
        +      params.data.text,
        +      'first, second',
        +      'The text should not have the quotes'
        +    );
        +  });
        +
        +  data.query({
        +    term: '"first, second",abc'
        +  }, function () {
        +    assert.ok(true, 'The callback should have succeeded');
        +  });
        +});
        +
        +test('works with multiple tokens given', function (assert) {
        +  assert.expect(4);
        +
        +  var SelectData = require('select2/data/select');
        +  var Tokenizer = require('select2/data/tokenizer');
        +  var Tags = require('select2/data/tags');
        +
        +  var Options = require('select2/options');
        +  var Utils = require('select2/utils');
        +
        +  var $ = require('jquery');
        +
        +  var TokenizedSelect = Utils.Decorate(
        +    Utils.Decorate(SelectData, Tags),
        +    Tokenizer
        +  );
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var options = new Options({
        +    tags: true,
        +    tokenSeparators: [',']
        +  });
        +
        +  var container = new MockContainer();
        +  container.dropdown = container.selection = {};
        +
        +  var $container = $('<div></div>');
        +
        +  var data = new TokenizedSelect($select, options);
        +  data.bind(container, $container);
        +
        +  data.on('select', function () {
        +    assert.ok(true, 'The select event should be triggered');
        +  });
        +
        +  data.query({
        +    term: 'first,second,third'
        +  }, function () {
        +    assert.ok(true, 'The callback should have succeeded');
        +  });
        +
        +  assert.equal(
        +    $select.children('option').length,
        +    3,
        +    'The two new tags should have been created'
        +  );
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/dropdown/dropdownCss-tests.js b/bower_components/select2/tests/dropdown/dropdownCss-tests.js
        new file mode 100644
        index 0000000000..9969335e1f
        --- /dev/null
        +++ b/bower_components/select2/tests/dropdown/dropdownCss-tests.js
        @@ -0,0 +1,104 @@
        +module('Dropdown - dropdownCssClass compatibility');
        +
        +var $ = require('jquery');
        +var Utils = require('select2/utils');
        +var Options = require('select2/options');
        +
        +var Dropdown = require('select2/dropdown');
        +var DropdownCSS = Utils.Decorate(
        +  Dropdown,
        +  require('select2/compat/dropdownCss')
        +);
        +
        +test('all classes will be copied if :all: is used', function (assert) {
        +  var $element = $('<select class="test copy works"></select>');
        +  var options = new Options({
        +    dropdownCssClass: ':all:'
        +  });
        +
        +  var select = new DropdownCSS($element, options);
        +  var $dropdown = select.render();
        +
        +  assert.ok($dropdown.hasClass('test'));
        +  assert.ok($dropdown.hasClass('copy'));
        +  assert.ok($dropdown.hasClass('works'));
        +  assert.ok(!$dropdown.hasClass(':all:'));
        +});
        +
        +test(':all: can be used with other classes', function (assert) {
        +  var $element = $('<select class="test copy works"></select>');
        +  var options = new Options({
        +    dropdownCssClass: ':all: other'
        +  });
        +
        +  var select = new DropdownCSS($element, options);
        +  var $dropdown = select.render();
        +
        +  assert.ok($dropdown.hasClass('test'));
        +  assert.ok($dropdown.hasClass('copy'));
        +  assert.ok($dropdown.hasClass('works'));
        +  assert.ok($dropdown.hasClass('other'));
        +  assert.ok(!$dropdown.hasClass(':all:'));
        +});
        +
        +test('classes can be passed in as a string', function (assert) {
        +  var $element = $('<select class="test copy works"></select>');
        +  var options = new Options({
        +    dropdownCssClass: 'other'
        +  });
        +
        +  var select = new DropdownCSS($element, options);
        +  var $dropdown = select.render();
        +
        +  assert.ok($dropdown.hasClass('other'));
        +});
        +
        +test('a function can be used based on the element', function (assert){
        +  var $element = $('<select class="test"></select>');
        +  var options = new Options({
        +    dropdownCssClass: function ($element) {
        +      return 'function';
        +    }
        +  });
        +
        +  var select = new DropdownCSS($element, options);
        +  var $dropdown = select.render();
        +
        +  assert.ok($dropdown.hasClass('function'));
        +  assert.ok(!$dropdown.hasClass('test'));
        +});
        +
        +test(':all: works around custom adapters', function (assert) {
        +  var $element = $('<select class="test"></select>');
        +  var options = new Options({
        +    dropdownCssClass: ':all: something',
        +    adaptDropdownCssClass: function (clazz) {
        +      return clazz + '-modified';
        +    }
        +  });
        +
        +  var select = new DropdownCSS($element, options);
        +  var $dropdown = select.render();
        +
        +  assert.ok($dropdown.hasClass('something'));
        +
        +  assert.ok($dropdown.hasClass('test'));
        +  assert.ok($dropdown.hasClass('test-modified'));
        +});
        +
        +module('Dropdown - adaptDropdownCss compatibility');
        +
        +test('only return when adapted', function (assert) {
        +  var $element = $('<select class="original"></select>');
        +  var options = new Options({
        +    adaptDropdownCssClass: function (clazz) {
        +      return 'modified';
        +    }
        +  });
        +
        +  var select = new DropdownCSS($element, options);
        +  var $dropdown = select.render();
        +
        +  assert.ok(!$dropdown.hasClass('original'));
        +  assert.ok($dropdown.hasClass('modified'));
        +});
        diff --git a/bower_components/select2/tests/dropdown/positioning-tests.js b/bower_components/select2/tests/dropdown/positioning-tests.js
        new file mode 100644
        index 0000000000..37c2b064a1
        --- /dev/null
        +++ b/bower_components/select2/tests/dropdown/positioning-tests.js
        @@ -0,0 +1,177 @@
        +module('Dropdown - attachBody - positioning');
        +
        +test('appends to the dropdown parent', function (assert) {
        +    assert.expect(4);
        +
        +    var $ = require('jquery');
        +
        +    var $select = $('<select></select>');
        +    var $parent = $('<div></div>');
        +
        +    var $container = $('<span></span>');
        +    var container = new MockContainer();
        +
        +    $parent.appendTo($('#qunit-fixture'));
        +    $select.appendTo($parent);
        +
        +    var Utils = require('select2/utils');
        +    var Options = require('select2/options');
        +
        +    var Dropdown = require('select2/dropdown');
        +    var AttachBody = require('select2/dropdown/attachBody');
        +
        +    var DropdownAdapter = Utils.Decorate(Dropdown, AttachBody);
        +
        +    var dropdown = new DropdownAdapter($select, new Options({
        +        dropdownParent: $parent
        +    }));
        +
        +    assert.equal(
        +        $parent.children().length,
        +        1,
        +        'Only the select should be in the container'
        +    );
        +
        +    var $dropdown = dropdown.render();
        +
        +    dropdown.bind(container, $container);
        +
        +    dropdown.position($dropdown, $container);
        +
        +    assert.equal(
        +        $parent.children().length,
        +        1,
        +        'The dropdown should not be placed until after it is opened'
        +    );
        +
        +    dropdown._showDropdown();
        +
        +    assert.equal(
        +        $parent.children().length,
        +        2,
        +        'The dropdown should now be in the container as well'
        +    );
        +
        +    assert.ok(
        +        $.contains($parent[0], $dropdown[0]),
        +        'The dropdown should be contained within the parent container'
        +    );
        +});
        +
        +test('dropdown is positioned down with static margins', function (assert) {
        +    var $ = require('jquery');
        +    var $select = $('<select></select>');
        +    var $parent = $('<div></div>');
        +    $parent.css({
        +        position: 'static',
        +        marginTop: '5px',
        +        marginLeft: '10px'
        +    });
        +
        +    var $container = $('<span>test</span>');
        +    var container = new MockContainer();
        +
        +    $('#qunit-fixture').empty();
        +
        +    $parent.appendTo($('#qunit-fixture'));
        +    $container.appendTo($parent);
        +
        +    var Utils = require('select2/utils');
        +    var Options = require('select2/options');
        +
        +    var Dropdown = require('select2/dropdown');
        +    var AttachBody = require('select2/dropdown/attachBody');
        +
        +    var DropdownAdapter = Utils.Decorate(Dropdown, AttachBody);
        +
        +    var dropdown = new DropdownAdapter($select, new Options({
        +        dropdownParent: $parent
        +    }));
        +
        +    var $dropdown = dropdown.render();
        +
        +    assert.equal(
        +        $dropdown[0].style.top,
        +        0,
        +        'The drodpown should not have any offset before it is displayed'
        +    );
        +
        +    dropdown.bind(container, $container);
        +    dropdown.position($dropdown, $container);
        +    dropdown._showDropdown();
        +
        +    assert.ok(
        +        dropdown.$dropdown.hasClass('select2-dropdown--below'),
        +        'The dropdown should be forced down'
        +    );
        +
        +    assert.equal(
        +        $dropdown.css('top').substring(0, 2),
        +        $container.outerHeight() + 5,
        +        'The offset should be 5px at the top'
        +    );
        +
        +    assert.equal(
        +        $dropdown.css('left'),
        +        '10px',
        +        'The offset should be 10px on the left'
        +    );
        +});
        +
        +test('dropdown is positioned down with absolute offsets', function (assert) {
        +    var $ = require('jquery');
        +    var $select = $('<select></select>');
        +    var $parent = $('<div></div>');
        +    $parent.css({
        +        position: 'absolute',
        +        top: '10px',
        +        left: '5px'
        +    });
        +
        +    var $container = $('<span>test</span>');
        +    var container = new MockContainer();
        +
        +    $parent.appendTo($('#qunit-fixture'));
        +    $container.appendTo($parent);
        +
        +    var Utils = require('select2/utils');
        +    var Options = require('select2/options');
        +
        +    var Dropdown = require('select2/dropdown');
        +    var AttachBody = require('select2/dropdown/attachBody');
        +
        +    var DropdownAdapter = Utils.Decorate(Dropdown, AttachBody);
        +
        +    var dropdown = new DropdownAdapter($select, new Options({
        +        dropdownParent: $parent
        +    }));
        +
        +    var $dropdown = dropdown.render();
        +
        +    assert.equal(
        +        $dropdown[0].style.top,
        +        0,
        +        'The drodpown should not have any offset before it is displayed'
        +    );
        +
        +    dropdown.bind(container, $container);
        +    dropdown.position($dropdown, $container);
        +    dropdown._showDropdown();
        +
        +    assert.ok(
        +        dropdown.$dropdown.hasClass('select2-dropdown--below'),
        +        'The dropdown should be forced down'
        +    );
        +
        +    assert.equal(
        +        $dropdown.css('top').substring(0, 2),
        +        $container.outerHeight(),
        +        'There should not be an extra top offset'
        +    );
        +
        +    assert.equal(
        +        $dropdown.css('left'),
        +        '0px',
        +        'There should not be an extra left offset'
        +    );
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/dropdown/selectOnClose-tests.js b/bower_components/select2/tests/dropdown/selectOnClose-tests.js
        new file mode 100644
        index 0000000000..3f1d1d41a1
        --- /dev/null
        +++ b/bower_components/select2/tests/dropdown/selectOnClose-tests.js
        @@ -0,0 +1,137 @@
        +module('Dropdown - selectOnClose');
        +
        +var $ = require('jquery');
        +
        +var Utils = require('select2/utils');
        +var Options = require('select2/options');
        +
        +var SelectData = require('select2/data/select');
        +
        +var Results = require('select2/results');
        +var SelectOnClose = require('select2/dropdown/selectOnClose');
        +
        +var ModifiedResults = Utils.Decorate(Results, SelectOnClose);
        +
        +var options = new Options({
        +  selectOnClose: true
        +});
        +
        +test('will not trigger if no results were given', function (assert) {
        +  assert.expect(0);
        +
        +  var $element = $('<select></select>');
        +  var select = new ModifiedResults($element, options, new SelectData($element));
        +
        +  var $dropdown = select.render();
        +
        +  var container = new MockContainer();
        +  select.bind(container, $('<div></div>'));
        +
        +  select.on('select', function () {
        +    assert.ok(false, 'The select event should not have been triggered');
        +  });
        +
        +  container.trigger('close');
        +});
        +
        +test('will not trigger if the results list is empty', function (assert) {
        +  assert.expect(1);
        +
        +  var $element = $('<select></select>');
        +  var select = new ModifiedResults($element, options, new SelectData($element));
        +
        +  var $dropdown = select.render();
        +
        +  var container = new MockContainer();
        +  select.bind(container, $('<div></div>'));
        +
        +  select.on('select', function () {
        +    assert.ok(false, 'The select event should not have been triggered');
        +  });
        +
        +  select.append({
        +    results: []
        +  });
        +
        +  assert.equal(
        +    $dropdown.find('li').length,
        +    0,
        +    'There should not be any results in the dropdown'
        +  );
        +
        +  container.trigger('close');
        +});
        +
        +test('will not trigger if no results here highlighted', function (assert) {
        +  assert.expect(2);
        +
        +  var $element = $('<select></select>');
        +  var select = new ModifiedResults($element, options, new SelectData($element));
        +
        +  var $dropdown = select.render();
        +
        +  var container = new MockContainer();
        +  select.bind(container, $('<div></div>'));
        +
        +  select.on('select', function () {
        +    assert.ok(false, 'The select event should not have been triggered');
        +  });
        +
        +  select.append({
        +    results: [
        +      {
        +        id: '1',
        +        text: 'Test'
        +      }
        +    ]
        +  });
        +
        +  assert.equal(
        +    $dropdown.find('li').length,
        +    1,
        +    'There should be one result in the dropdown'
        +  );
        +
        +  assert.equal(
        +    $.trim($dropdown.find('li').text()),
        +    'Test',
        +    'The result should be the same as the one we appended'
        +  );
        +
        +  container.trigger('close');
        +});
        +
        +test('will trigger if there is a highlighted result', function (assert) {
        +  assert.expect(2);
        +
        +  var $element = $('<select></select>');
        +  var select = new ModifiedResults($element, options, new SelectData($element));
        +
        +  var $dropdown = select.render();
        +
        +  var container = new MockContainer();
        +  select.bind(container, $('<div></div>'));
        +
        +  select.on('select', function () {
        +    assert.ok(true, 'The select event should have been triggered');
        +  });
        +
        +  select.append({
        +    results: [
        +      {
        +        id: '1',
        +        text: 'Test'
        +      }
        +    ]
        +  });
        +
        +  assert.equal(
        +    $dropdown.find('li').length,
        +    1,
        +    'There should be one result in the dropdown'
        +  );
        +
        +  $dropdown.find('li').addClass('select2-results__option--highlighted');
        +
        +  container.trigger('close');
        +});
        diff --git a/bower_components/select2/tests/dropdown/stopPropagation-tests.js b/bower_components/select2/tests/dropdown/stopPropagation-tests.js
        new file mode 100644
        index 0000000000..240a3e6684
        --- /dev/null
        +++ b/bower_components/select2/tests/dropdown/stopPropagation-tests.js
        @@ -0,0 +1,33 @@
        +module('Dropdown - Stoping event propagation');
        +
        +var Dropdown = require('select2/dropdown');
        +var StopPropagation = require('select2/dropdown/stopPropagation');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var CustomDropdown = Utils.Decorate(Dropdown, StopPropagation);
        +
        +var options = new Options();
        +
        +test('click event does not propagate', function (assert) {
        +  assert.expect(1);
        +
        +  var $container = $('#qunit-fixture .event-container');
        +  var container = new MockContainer();
        +
        +  var dropdown = new CustomDropdown($('#qunit-fixture select'), options);
        +
        +  var $dropdown = dropdown.render();
        +  dropdown.bind(container, $container);
        +
        +  $container.append($dropdown);
        +  $container.on('click', function () {
        +    assert.ok(false, 'The click event should have been stopped');
        +  });
        +
        +  $dropdown.trigger('click');
        +
        +  assert.ok(true, 'Something went wrong if this failed');
        +});
        diff --git a/bower_components/select2/tests/helpers.js b/bower_components/select2/tests/helpers.js
        new file mode 100644
        index 0000000000..e0c9fa22df
        --- /dev/null
        +++ b/bower_components/select2/tests/helpers.js
        @@ -0,0 +1,46 @@
        +// Restore the require/define
        +var require = $.fn.select2.amd.require;
        +var define = $.fn.select2.amd.define;
        +
        +// Disable jQuery's binding to $
        +jQuery.noConflict();
        +
        +var Utils = require('select2/utils');
        +
        +function MockContainer () {
        +  MockContainer.__super__.constructor.call(this);
        +}
        +
        +Utils.Extend(MockContainer, Utils.Observable);
        +
        +MockContainer.prototype.isOpen = function () {
        +  return this.isOpen;
        +};
        +
        +var log = [];
        +var testName;
        +
        +QUnit.done(function (test_results) {
        +  var tests = [];
        +  for(var i = 0, len = log.length; i < len; i++) {
        +    var details = log[i];
        +    tests.push({
        +      name: details.name,
        +      result: details.result,
        +      expected: details.expected,
        +      actual: details.actual,
        +      source: details.source
        +    });
        +  }
        +  test_results.tests = tests;
        +
        +  window.global_test_results = test_results;
        +});
        +QUnit.testStart(function(testDetails){
        +  QUnit.log(function(details){
        +    if (!details.result) {
        +      details.name = testDetails.name;
        +      log.push(details);
        +    }
        +  });
        +});
        diff --git a/bower_components/select2/tests/integration.html b/bower_components/select2/tests/integration.html
        new file mode 100644
        index 0000000000..d8d0ef556d
        --- /dev/null
        +++ b/bower_components/select2/tests/integration.html
        @@ -0,0 +1,21 @@
        +<!doctype html>
        +<html>
        +  <head>
        +    <link rel="stylesheet" href="vendor/qunit-1.23.1.css" type="text/css" />
        +    <link rel="stylesheet" href="../../dist/css/select2.css" type="text/css" />
        +  </head>
        +  <body>
        +    <div id="qunit"></div>
        +    <div id="qunit-fixture"></div>
        +
        +    <script src="vendor/qunit-1.23.1.js" type="text/javascript"></script>
        +    <script src="vendor/jquery-1.7.2.js" type="text/javascript"></script>
        +    <script src="../dist/js/select2.full.js" type="text/javascript"></script>
        +
        +    <script src="helpers.js" type="text/javascript"></script>
        +
        +    <script src="integration/dom-changes.js" type="text/javascript"></script>
        +    <script src="integration/jquery-calls.js" type="text/javascript"></script>
        +    <script src="integration/select2-methods.js" type="text/javascript"></script>
        +  </body>
        +</html>
        diff --git a/bower_components/select2/tests/integration/dom-changes.js b/bower_components/select2/tests/integration/dom-changes.js
        new file mode 100644
        index 0000000000..2d89ae2acf
        --- /dev/null
        +++ b/bower_components/select2/tests/integration/dom-changes.js
        @@ -0,0 +1,257 @@
        +module('DOM integration');
        +
        +test('adding a new unselected option changes nothing', function (assert) {
        +  // Any browsers which support mutation observers will not trigger the event
        +  var expected = 4;
        +  if (window.MutationObserver) {
        +    expected = 2;
        +  } else if (!window.addEventListener) {
        +    expected = 2;
        +  }
        +
        +  assert.expect(expected);
        +
        +  var asyncDone = null;
        +  var syncDone = assert.async();
        +
        +  if (expected != 2) {
        +    asyncDone = assert.async();
        +  }
        +
        +  var $ = require('jquery');
        +  var Options = require('select2/options');
        +  var Select2 = require('select2/core');
        +
        +  var $select = $(
        +    '<select>' +
        +      '<option>One</option>' +
        +      '<option>Two</option>' +
        +    '</select>'
        +  );
        +
        +  $('#qunit-fixture').append($select);
        +
        +  var select = new Select2($select);
        +
        +  select.on('selection:update', function (args) {
        +    assert.equal(
        +      args.data.length,
        +      1,
        +      'There was more than one selection'
        +    );
        +
        +    assert.equal(
        +      args.data[0].id,
        +      'One',
        +      'The selection changed to something other than One'
        +    );
        +
        +    if (expected != 2) {
        +      asyncDone();
        +    }
        +  });
        +
        +  assert.equal(
        +    $select.val(),
        +    'One'
        +  );
        +
        +  var $option = $('<option>Three</option>');
        +
        +  $select.append($option);
        +
        +  assert.equal(
        +    $select.val(),
        +    'One'
        +  );
        +
        +  syncDone();
        +});
        +
        +test('adding a new selected option changes the value', function (assert) {
        +  // handle IE 8 not being supported
        +  var expected = 4;
        +  if (!window.MutationObserver && !window.addEventListener) {
        +    expected = 2;
        +  }
        +
        +  assert.expect(expected);
        +
        +  var asyncDone = null;
        +  var syncDone = assert.async();
        +
        +  if (expected != 2) {
        +    asyncDone = assert.async();
        +  }
        +
        +  var $ = require('jquery');
        +  var Options = require('select2/options');
        +  var Select2 = require('select2/core');
        +
        +  var $select = $(
        +    '<select>' +
        +      '<option>One</option>' +
        +      '<option>Two</option>' +
        +    '</select>'
        +  );
        +
        +  $('#qunit-fixture').append($select);
        +
        +  var select = new Select2($select);
        +
        +  select.on('selection:update', function (args) {
        +    assert.equal(
        +      args.data.length,
        +      1,
        +      'There was more than one selection'
        +    );
        +
        +    assert.equal(
        +      args.data[0].id,
        +      'Three',
        +      'The selection did not change to Three'
        +    );
        +
        +    if (expected != 2) {
        +      asyncDone();
        +    }
        +  });
        +
        +  assert.equal(
        +    $select.val(),
        +    'One'
        +  );
        +
        +  var $option = $('<option selected>Three</option>');
        +
        +  $select.append($option);
        +
        +  assert.equal(
        +    $select.val(),
        +    'Three'
        +  );
        +
        +  syncDone();
        +});
        +
        +test('removing an unselected option changes nothing', function (assert) {
        +  // Any browsers which support mutation observers will not trigger the event
        +  var expected = 4;
        +  if (!window.MutationObserver && !window.addEventListener) {
        +    expected = 2;
        +  }
        +
        +  assert.expect(expected);
        +
        +  var asyncDone = null;
        +  var syncDone = assert.async();
        +
        +  if (expected != 2) {
        +    asyncDone = assert.async();
        +  }
        +
        +  var $ = require('jquery');
        +  var Options = require('select2/options');
        +  var Select2 = require('select2/core');
        +
        +  var $select = $(
        +    '<select>' +
        +      '<option>One</option>' +
        +      '<option>Two</option>' +
        +    '</select>'
        +  );
        +
        +  $('#qunit-fixture').append($select);
        +
        +  var select = new Select2($select);
        +
        +  select.on('selection:update', function (args) {
        +    assert.equal(
        +      args.data.length,
        +      1,
        +      'There was more than one selection'
        +    );
        +
        +    assert.equal(
        +      args.data[0].id,
        +      'One',
        +      'The selection changed to something other than One'
        +    );
        +
        +    if (expected != 2) {
        +      asyncDone();
        +    }
        +  });
        +
        +  assert.equal(
        +    $select.val(),
        +    'One'
        +  );
        +
        +  $select.children().eq(1).remove();
        +
        +  assert.equal(
        +    $select.val(),
        +    'One'
        +  );
        +
        +  syncDone();
        +});
        +
        +test('removing a selected option changes the value', function (assert) {
        +  // handle IE 8 not being supported
        +  var expected = 3;
        +  if (!window.MutationObserver && !window.addEventListener) {
        +    expected = 2;
        +  }
        +
        +  assert.expect(expected);
        +
        +  var asyncDone = null;
        +  var syncDone = assert.async();
        +
        +  if (expected != 2) {
        +    asyncDone = assert.async();
        +  }
        +
        +  var $ = require('jquery');
        +  var Options = require('select2/options');
        +  var Select2 = require('select2/core');
        +
        +  var $select = $(
        +    '<select>' +
        +      '<option>One</option>' +
        +      '<option>Two</option>' +
        +    '</select>'
        +  );
        +
        +  $('#qunit-fixture').append($select);
        +
        +  var select = new Select2($select);
        +
        +  select.on('selection:update', function (args) {
        +    assert.equal(
        +      args.data.length,
        +      1,
        +      'There was more than one selection'
        +    );
        +
        +    if (expected != 2) {
        +      asyncDone();
        +    }
        +  });
        +
        +  assert.equal(
        +    $select.val(),
        +    'One'
        +  );
        +
        +  $select.children().eq(0).remove();
        +
        +  assert.equal(
        +    $select.val(),
        +    'Two'
        +  );
        +
        +  syncDone();
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/integration/jquery-calls.js b/bower_components/select2/tests/integration/jquery-calls.js
        new file mode 100644
        index 0000000000..6a30137edf
        --- /dev/null
        +++ b/bower_components/select2/tests/integration/jquery-calls.js
        @@ -0,0 +1,30 @@
        +module('select2(val)');
        +
        +test('multiple elements with arguments works', function (assert) {
        +  var $ = require('jquery');
        +  require('jquery.select2');
        +
        +  var $first = $(
        +    '<select>' +
        +      '<option>1</option>' +
        +      '<option>2</option>' +
        +    '</select>'
        +  );
        +  var $second = $first.clone();
        +
        +  var $both = $first.add($second);
        +  $both.select2();
        +
        +  $both.select2('val', '2');
        +
        +  assert.equal(
        +    $first.val(),
        +    '2',
        +    'The call should change the value on the first element'
        +  );
        +  assert.equal(
        +    $second.val(),
        +    '2',
        +    'The call should also change the value on the second element'
        +  );
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/integration/select2-methods.js b/bower_components/select2/tests/integration/select2-methods.js
        new file mode 100644
        index 0000000000..b1e344a567
        --- /dev/null
        +++ b/bower_components/select2/tests/integration/select2-methods.js
        @@ -0,0 +1,139 @@
        +module('select2(data)');
        +
        +var $ = require('jquery');
        +var Select2 = require('select2/core');
        +var Options = require('select2/options');
        +
        +test('single default selection returned', function (assert) {
        +  var $select = $(
        +    '<select>' +
        +      '<option>One</option>' +
        +      '<option>Two</option>' +
        +      '<option value="3" selected>Three</option>' +
        +    '</select>'
        +  );
        +  var options = new Options({});
        +
        +  var select = new Select2($select, options);
        +
        +  var items = select.data();
        +
        +  assert.equal(
        +    items.length,
        +    1,
        +    'The one selected item should be returned'
        +  );
        +
        +  var first = items[0];
        +
        +  assert.equal(
        +    first.id,
        +    '3',
        +    'The first option was correct'
        +  );
        +
        +  assert.equal(
        +    first.text,
        +    'Three',
        +    'The first option was correct'
        +  );
        +});
        +
        +test('multiple default selections returned', function (assert) {
        +  var $select = $(
        +    '<select multiple>' +
        +      '<option selected>One</option>' +
        +      '<option>Two</option>' +
        +      '<option value="3" selected>Three</option>' +
        +    '</select>'
        +  );
        +  var options = new Options({});
        +
        +  var select = new Select2($select, options);
        +
        +  var items = select.data();
        +
        +  assert.equal(
        +    items.length,
        +    2,
        +    'The two selected items should be returned'
        +  );
        +
        +  var first = items[0];
        +
        +  assert.equal(
        +    first.id,
        +    'One',
        +    'The first option was correct'
        +  );
        +
        +  var second = items[1];
        +
        +  assert.equal(
        +    second.id,
        +    '3',
        +    'The option value should be pulled correctly'
        +  );
        +});
        +
        +module('select2(val)');
        +
        +test('single value matches jquery value', function (assert) {
        +  var $select = $(
        +    '<select>' +
        +      '<option>One</option>' +
        +      '<option>Two</option>' +
        +      '<option value="3" selected>Three</option>' +
        +    '</select>'
        +  );
        +  var options = new Options({});
        +
        +  var select = new Select2($select, options);
        +
        +  var value = select.val();
        +
        +  assert.equal(
        +    value,
        +    '3',
        +    'The value should match the option tag attribute'
        +  );
        +
        +  assert.equal(
        +    value,
        +    $select.val(),
        +    'The value should match the jquery value'
        +  );
        +});
        +
        +test('multiple value matches the jquery value', function (assert) {
        +  var $select = $(
        +    '<select multiple>' +
        +      '<option selected>One</option>' +
        +      '<option>Two</option>' +
        +      '<option value="3" selected>Three</option>' +
        +    '</select>'
        +  );
        +  var options = new Options({});
        +
        +  var select = new Select2($select, options);
        +
        +  var value = select.val();
        +
        +  assert.equal(
        +    value.length,
        +    2,
        +    'Two options should be selected'
        +  );
        +
        +  assert.deepEqual(
        +    value,
        +    ['One', '3'],
        +    'The values should match the option tag attribute'
        +  );
        +
        +  assert.deepEqual(
        +    value,
        +    $select.val(),
        +    'The values should match the jquery values'
        +  );
        +});
        diff --git a/bower_components/select2/tests/options/ajax-tests.js b/bower_components/select2/tests/options/ajax-tests.js
        new file mode 100644
        index 0000000000..7d8537ae21
        --- /dev/null
        +++ b/bower_components/select2/tests/options/ajax-tests.js
        @@ -0,0 +1,32 @@
        +module('Defaults - Ajax');
        +
        +test('options are merged recursively with default options', function (assert) {
        +  var defaults = require('select2/defaults');
        +
        +  var ajaxDelay = 250;
        +  var ajaxUrl = 'http://www.test.com';
        +
        +  var mergedOptions;
        +
        +  defaults.set('ajax--delay', ajaxDelay);
        +
        +  mergedOptions = defaults.apply({
        +    ajax: {
        +      url: ajaxUrl
        +    }
        +  });
        +
        +  assert.equal(
        +    mergedOptions.ajax.delay,
        +    ajaxDelay,
        +    'Ajax default options are present on the merged options'
        +  );
        +
        +  assert.equal(
        +    mergedOptions.ajax.url,
        +    ajaxUrl,
        +    'Ajax provided options are present on the merged options'
        +  );
        +
        +  defaults.reset();
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/options/data-tests.js b/bower_components/select2/tests/options/data-tests.js
        new file mode 100644
        index 0000000000..107a2f0c96
        --- /dev/null
        +++ b/bower_components/select2/tests/options/data-tests.js
        @@ -0,0 +1,44 @@
        +module('Options - Attributes');
        +
        +var $ = require('jquery');
        +
        +var Options = require('select2/options');
        +
        +test('no nesting', function (assert) {
        +  var $test = $('<select data-test="test"></select>');
        +
        +  var options = new Options({}, $test);
        +
        +  assert.equal(options.get('test'), 'test');
        +});
        +
        +test('with nesting', function (assert) {
        +  var $test = $('<select data-first--second="test"></select>');
        +
        +  if ($test[0].dataset == null) {
        +    assert.ok(
        +      true,
        +      'We can not run this test with jQuery 1.x if dataset is not implemented'
        +    );
        +
        +    return;
        +  }
        +
        +  var options = new Options({}, $test);
        +
        +  assert.ok(!(options.get('first-Second')));
        +  assert.equal(options.get('first').second, 'test');
        +});
        +
        +test('overrides initialized data', function (assert) {
        +  var $test = $('<select data-override="yes" data-data="yes"></select>');
        +
        +  var options = new Options({
        +    options: 'yes',
        +    override: 'no'
        +  }, $test);
        +
        +  assert.equal(options.get('options'), 'yes');
        +  assert.equal(options.get('override'), 'yes');
        +  assert.equal(options.get('data'), 'yes');
        +});
        diff --git a/bower_components/select2/tests/options/deprecated-tests.js b/bower_components/select2/tests/options/deprecated-tests.js
        new file mode 100644
        index 0000000000..a51bba317a
        --- /dev/null
        +++ b/bower_components/select2/tests/options/deprecated-tests.js
        @@ -0,0 +1,250 @@
        +module('Options - Deprecated - initSelection');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +
        +test('converted into dataAdapter.current', function (assert) {
        +  assert.expect(5);
        +
        +  var $test = $('<select></select>');
        +  var called = false;
        +
        +  var options = new Options({
        +    initSelection: function ($element, callback) {
        +      called = true;
        +
        +      callback([{
        +        id: '1',
        +        text: '2'
        +      }]);
        +    }
        +  }, $test);
        +
        +  assert.ok(!called, 'initSelection should not have been called');
        +
        +  var DataAdapter = options.get('dataAdapter');
        +  var data = new DataAdapter($test, options);
        +
        +  data.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      1,
        +      'There should have only been one object selected'
        +    );
        +
        +    var item = data[0];
        +
        +    assert.equal(
        +      item.id,
        +      '1',
        +      'The id should have been set by initSelection'
        +    );
        +
        +    assert.equal(
        +      item.text,
        +      '2',
        +      'The text should have been set by initSelection'
        +    );
        +  });
        +
        +  assert.ok(called, 'initSelection should have been called');
        +});
        +
        +test('single option converted to array automatically', function (assert) {
        +  assert.expect(2);
        +
        +  var $test = $('<select></select>');
        +  var called = false;
        +
        +  var options = new Options({
        +    initSelection: function ($element, callback) {
        +      called = true;
        +
        +      callback({
        +        id: '1',
        +        text: '2'
        +      });
        +    }
        +  }, $test);
        +
        +  var DataAdapter = options.get('dataAdapter');
        +  var data = new DataAdapter($test, options);
        +
        +  data.current(function (data) {
        +    assert.ok(
        +      $.isArray(data),
        +      'The data should have been converted to an array'
        +    );
        +  });
        +
        +  assert.ok(called, 'initSelection should have been called');
        +});
        +
        +test('only called once', function (assert) {
        +  assert.expect(8);
        +
        +  var $test = $('<select><option value="3" selected>4</option></select>');
        +  var called = 0;
        +
        +  var options = new Options({
        +    initSelection: function ($element, callback) {
        +      called++;
        +
        +      callback([{
        +        id: '1',
        +        text: '2'
        +      }]);
        +    }
        +  }, $test);
        +
        +  var DataAdapter = options.get('dataAdapter');
        +  var data = new DataAdapter($test, options);
        +
        +  data.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      1,
        +      'There should have only been a single option'
        +    );
        +
        +    var item = data[0];
        +
        +    assert.equal(
        +      item.id,
        +      '1',
        +      'The id should match the one given by initSelection'
        +    );
        +
        +    assert.equal(
        +      item.text,
        +      '2',
        +      'The text should match the one given by initSelection'
        +    );
        +  });
        +
        +  assert.equal(
        +    called,
        +    1,
        +    'initSelection should have been called'
        +  );
        +
        +  data.current(function (data) {
        +    assert.equal(
        +      data.length,
        +      1,
        +      'There should have only been a single option'
        +    );
        +
        +    var item = data[0];
        +
        +    assert.equal(
        +      item.id,
        +      '3',
        +      'The id should match the value given in the DOM'
        +    );
        +
        +    assert.equal(
        +      item.text,
        +      '4',
        +      'The text should match the text given in the DOM'
        +    );
        +  });
        +
        +  assert.equal(
        +    called,
        +    1,
        +    'initSelection should have only been called once'
        +  );
        +});
        +
        +module('Options - Deprecated - query');
        +
        +test('converted into dataAdapter.query automatically', function (assert) {
        +  assert.expect(6);
        +
        +  var $test = $('<select></select>');
        +  var called = false;
        +
        +  var options = new Options({
        +    query: function (params) {
        +      called = true;
        +
        +      params.callback({
        +        results: [
        +          {
        +            id: 'test',
        +            text: params.term
        +          }
        +        ]
        +      });
        +    }
        +  }, $test);
        +
        +  assert.ok(!called, 'The query option should not have been called');
        +
        +  var DataAdapter = options.get('dataAdapter');
        +  var data = new DataAdapter($test, options);
        +
        +  data.query({
        +    term: 'term'
        +  }, function (data) {
        +    assert.ok(
        +      'results' in data,
        +      'It should have included the results key'
        +    );
        +
        +    assert.equal(
        +      data.results.length,
        +      1,
        +      'There should have only been a single result returned'
        +    );
        +
        +    var item = data.results[0];
        +
        +    assert.equal(
        +      item.id,
        +      'test',
        +      'The id should have been returned from the query function'
        +    );
        +
        +    assert.equal(
        +      item.text,
        +      'term',
        +      'The text should have matched the term that was passed in'
        +    );
        +  });
        +
        +  assert.ok(called, 'The query function should have been called');
        +});
        +
        +module('Options - deprecated - data-ajax-url');
        +
        +test('converted ajax-url to ajax--url automatically', function (assert) {
        +  var $test = $('<select data-ajax-url="test://url"></select>');
        +  var options = new Options({}, $test);
        +
        +  assert.ok(
        +    options.get('ajax'),
        +    'The `ajax` key was automatically created'
        +  );
        +  assert.equal(
        +    options.get('ajax').url,
        +    'test://url',
        +    'The `url` property for the `ajax` option was filled in correctly'
        +  );
        +});
        +
        +test('converted select2-tags to data/tags automatically', function (assert) {
        +  var $test = $('<select data-select2-tags="original data"></select>');
        +  var options = new Options({}, $test);
        +
        +  assert.ok(
        +    options.get('tags'),
        +    'The `tags` key is automatically set to true'
        +  );
        +  assert.equal(
        +    options.get('data'),
        +    'original data',
        +    'The `data` key is created with the original data'
        +  );
        +});
        diff --git a/bower_components/select2/tests/options/translation-tests.js b/bower_components/select2/tests/options/translation-tests.js
        new file mode 100644
        index 0000000000..ab433b6157
        --- /dev/null
        +++ b/bower_components/select2/tests/options/translation-tests.js
        @@ -0,0 +1,28 @@
        +module('Options - Translations');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +
        +test('partial dictionaries can be passed', function (assert) {
        +  var options = new Options({
        +    language: {
        +      searching: function () {
        +        return 'Something';
        +      }
        +    }
        +  });
        +
        +  var translations = options.get('translations');
        +
        +  assert.equal(
        +    translations.get('searching')(),
        +    'Something',
        +    'The partial dictionary still overrides translations'
        +  );
        +
        +  assert.equal(
        +    translations.get('noResults')(),
        +    'No results found',
        +    'You can still get English translations for keys not passed in'
        +  );
        +});
        diff --git a/bower_components/select2/tests/options/width-tests.js b/bower_components/select2/tests/options/width-tests.js
        new file mode 100644
        index 0000000000..e724034904
        --- /dev/null
        +++ b/bower_components/select2/tests/options/width-tests.js
        @@ -0,0 +1,66 @@
        +module('Options - Width');
        +
        +var $ = require('jquery');
        +
        +var Select2 = require('select2/core');
        +var select = new Select2($('<select></select>'));
        +
        +test('string passed as width', function (assert) {
        +  var $test = $('<select></select>');
        +
        +  var width = select._resolveWidth($test, '80%');
        +
        +  assert.equal(width, '80%');
        +});
        +
        +test('width from style attribute', function (assert) {
        +  var $test = $('<select style="width: 50%;"></selct>');
        +
        +  var width = select._resolveWidth($test, 'style');
        +
        +  assert.equal(width, '50%');
        +});
        +
        +test('width from style returns null if nothing is found', function (assert) {
        +  var $test = $('<select></selct>');
        +
        +  var width = select._resolveWidth($test, 'style');
        +
        +  assert.equal(width, null);
        +});
        +
        +test('width from computed element width', function (assert) {
        +  var $style = $(
        +    '<style type="text/css">.css-set-width { width: 500px; }</style>'
        +  );
        +  var $test = $('<select class="css-set-width"></select>');
        +
        +  $('#qunit-fixture').append($style);
        +  $('#qunit-fixture').append($test);
        +
        +  var width = select._resolveWidth($test, 'element');
        +
        +  assert.equal(width, '500px');
        +});
        +
        +test('resolve gets the style if it is there', function (assert) {
        +  var $test = $('<select style="width: 20%;"></selct>');
        +
        +  var width = select._resolveWidth($test, 'resolve');
        +
        +  assert.equal(width, '20%');
        +});
        +
        +test('resolve falls back to element if there is no style', function (assert) {
        +  var $style = $(
        +    '<style type="text/css">.css-set-width { width: 500px; }</style>'
        +  );
        +  var $test = $('<select class="css-set-width"></select>');
        +
        +  $('#qunit-fixture').append($style);
        +  $('#qunit-fixture').append($test);
        +
        +  var width = select._resolveWidth($test, 'resolve');
        +
        +  assert.equal(width, '500px');
        +});
        diff --git a/bower_components/select2/tests/results/focusing-tests.js b/bower_components/select2/tests/results/focusing-tests.js
        new file mode 100644
        index 0000000000..135d0016d1
        --- /dev/null
        +++ b/bower_components/select2/tests/results/focusing-tests.js
        @@ -0,0 +1,138 @@
        +module('Results - highlighting results');
        +
        +test('results:all with no data skips results:focus', function (assert) {
        +  assert.expect(0);
        +
        +  var $ = require('jquery');
        +
        +  var $select = $('<select></select>');
        +  var $parent = $('<div></div>');
        +
        +  var $container = $('<span></span>');
        +  var container = new MockContainer();
        +
        +  $parent.appendTo($('#qunit-fixture'));
        +  $select.appendTo($parent);
        +
        +  var Utils = require('select2/utils');
        +  var Options = require('select2/options');
        +
        +  var Results = require('select2/results');
        +
        +  var results = new Results($select, new Options({}));
        +
        +  // Fake the data adapter for the `setClasses` method
        +  results.data = {};
        +  results.data.current = function (callback) {
        +    callback([{ id: 'test' }]);
        +  };
        +
        +  results.render();
        +
        +  results.bind(container, $container);
        +
        +  results.on('results:focus', function (params) {
        +    assert.ok(false, 'The results:focus event was triggered');
        +  });
        +
        +  container.trigger('results:all', {
        +    data: {
        +      results: []
        +    }
        +  });
        +});
        +
        +test('results:all triggers results:focus on the first item', function (assert) {
        +  assert.expect(2);
        +
        +  var $ = require('jquery');
        +
        +  var $select = $('<select></select>');
        +  var $parent = $('<div></div>');
        +
        +  var $container = $('<span></span>');
        +  var container = new MockContainer();
        +
        +  $parent.appendTo($('#qunit-fixture'));
        +  $select.appendTo($parent);
        +
        +  var Utils = require('select2/utils');
        +  var Options = require('select2/options');
        +
        +  var Results = require('select2/results');
        +
        +  var results = new Results($select, new Options({}));
        +
        +  // Fake the data adapter for the `setClasses` method
        +  results.data = {};
        +  results.data.current = function (callback) {
        +    callback([{ id: 'test' }]);
        +  };
        +
        +  results.render();
        +
        +  results.bind(container, $container);
        +
        +  results.on('results:focus', function (params) {
        +    assert.equal(params.data.id, 'test');
        +    assert.equal(params.data.text, 'Test');
        +  });
        +
        +  container.trigger('results:all', {
        +    data: {
        +      results: [
        +        {
        +          id: 'test',
        +          text: 'Test'
        +        }
        +      ]
        +    }
        +  });
        +});
        +
        +test('results:append does not trigger results:focus', function (assert) {
        +  assert.expect(0);
        +
        +  var $ = require('jquery');
        +
        +  var $select = $('<select></select>');
        +  var $parent = $('<div></div>');
        +
        +  var $container = $('<span></span>');
        +  var container = new MockContainer();
        +
        +  $parent.appendTo($('#qunit-fixture'));
        +  $select.appendTo($parent);
        +
        +  var Utils = require('select2/utils');
        +  var Options = require('select2/options');
        +
        +  var Results = require('select2/results');
        +
        +  var results = new Results($select, new Options({}));
        +
        +  // Fake the data adapter for the `setClasses` method
        +  results.data = {};
        +  results.data.current = function (callback) {
        +    callback([{ id: 'test' }]);
        +  };
        +
        +  results.render();
        +
        +  results.bind(container, $container);
        +
        +  results.on('results:focus', function () {
        +    assert.ok(false, 'The results:focus event was triggered');
        +  });
        +
        +  container.trigger('results:append', {
        +    data: {
        +      results: [
        +        {
        +          id: 'test',
        +          text: 'Test'
        +        }
        +      ]
        +    }
        +  });
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/selection/allowClear-tests.js b/bower_components/select2/tests/selection/allowClear-tests.js
        new file mode 100644
        index 0000000000..efa132aae3
        --- /dev/null
        +++ b/bower_components/select2/tests/selection/allowClear-tests.js
        @@ -0,0 +1,218 @@
        +module('Selection containers - Placeholders - Allow clear');
        +
        +var Placeholder = require('select2/selection/placeholder');
        +var AllowClear = require('select2/selection/allowClear');
        +
        +var SingleSelection = require('select2/selection/single');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var AllowClearPlaceholder = Utils.Decorate(
        +  Utils.Decorate(SingleSelection, Placeholder),
        +  AllowClear
        +);
        +
        +var allowClearOptions = new Options({
        +  placeholder: {
        +    id: 'placeholder',
        +    text: 'This is the placeholder'
        +  },
        +  allowClear: true
        +});
        +
        +test('clear is not displayed for single placeholder', function (assert) {
        +  var selection = new AllowClearPlaceholder(
        +    $('#qunit-fixture .single-with-placeholder'),
        +    allowClearOptions
        +  );
        +
        +  var $selection = selection.render();
        +
        +  selection.update([{
        +    id: 'placeholder'
        +  }]);
        +
        +  assert.equal(
        +    $selection.find('.select2-selection__clear').length,
        +    0,
        +    'The clear icon should not be displayed'
        +  );
        +});
        +
        +test('clear is not displayed for multiple placeholder', function (assert) {
        +  var selection = new AllowClearPlaceholder(
        +    $('#qunit-fixture .single-with-placeholder'),
        +    allowClearOptions
        +  );
        +
        +  var $selection = selection.render();
        +
        +  selection.update([]);
        +
        +  assert.equal(
        +    $selection.find('.select2-selection__clear').length,
        +    0,
        +    'The clear icon should not be displayed'
        +  );
        +});
        +
        +
        +test('clear is displayed for placeholder', function (assert) {
        +  var selection = new AllowClearPlaceholder(
        +    $('#qunit-fixture .single-with-placeholder'),
        +    allowClearOptions
        +  );
        +
        +  var $selection = selection.render();
        +
        +  selection.update([{
        +    id: 'one',
        +    test: 'one'
        +  }]);
        +
        +  assert.equal(
        +    $selection.find('.select2-selection__clear').length,
        +    1,
        +    'The clear icon should be displayed'
        +  );
        +});
        +
        +test('clicking clear will set the placeholder value', function (assert) {
        +  var $element = $('#qunit-fixture .single-with-placeholder');
        +
        +  var selection = new AllowClearPlaceholder(
        +    $element,
        +    allowClearOptions
        +  );
        +  var container = new MockContainer();
        +
        +  var $selection = selection.render();
        +
        +  selection.bind(container, $('<div></div'));
        +
        +  $element.val('One');
        +  selection.update([{
        +    id: 'One',
        +    text: 'One'
        +  }]);
        +
        +  var $remove = $selection.find('.select2-selection__clear');
        +  $remove.trigger('mousedown');
        +
        +  assert.equal(
        +    $element.val(),
        +    'placeholder',
        +    'The value should have been reset to the placeholder'
        +  );
        +});
        +
        +test('clicking clear will trigger the unselect event', function (assert) {
        +  assert.expect(3);
        +
        +  var $element = $('#qunit-fixture .single-with-placeholder');
        +
        +  var selection = new AllowClearPlaceholder(
        +    $element,
        +    allowClearOptions
        +  );
        +  var container = new MockContainer();
        +
        +  var $selection = selection.render();
        +
        +  selection.bind(container, $('<div></div'));
        +
        +  $element.val('One');
        +  selection.update([{
        +    id: 'One',
        +    text: 'One'
        +  }]);
        +
        +  selection.on('unselect', function (ev) {
        +    assert.ok(
        +      'data' in ev && ev.data,
        +      'The event should have been triggered with the data property'
        +    );
        +
        +    assert.ok(
        +      $.isPlainObject(ev.data),
        +      'The data should be an object'
        +    );
        +
        +    assert.equal(
        +      ev.data.id,
        +      'One',
        +      'The previous object should be unselected'
        +    );
        +  });
        +
        +  var $remove = $selection.find('.select2-selection__clear');
        +  $remove.trigger('mousedown');
        +});
        +
        +
        +
        +test('preventing the unselect event cancels the clearing', function (assert) {
        +  var $element = $('#qunit-fixture .single-with-placeholder');
        +
        +  var selection = new AllowClearPlaceholder(
        +    $element,
        +    allowClearOptions
        +  );
        +  var container = new MockContainer();
        +
        +  var $selection = selection.render();
        +
        +  selection.bind(container, $('<div></div'));
        +
        +  $element.val('One');
        +  selection.update([{
        +    id: 'One',
        +    text: 'One'
        +  }]);
        +
        +  selection.on('unselect', function (ev) {
        +    ev.prevented = true;
        +  });
        +
        +  var $remove = $selection.find('.select2-selection__clear');
        +  $remove.trigger('mousedown');
        +
        +  assert.equal(
        +    $element.val(),
        +    'One',
        +    'The placeholder should not have been set'
        +  );
        +});
        +
        +test('clear does not work when disabled', function (assert) {
        +  var $element = $('#qunit-fixture .single-with-placeholder');
        +
        +  var selection = new AllowClearPlaceholder(
        +    $element,
        +    allowClearOptions
        +  );
        +  var container = new MockContainer();
        +
        +  var $selection = selection.render();
        +
        +  selection.bind(container, $('<div></div'));
        +
        +  selection.update([{
        +    id: 'One',
        +    text: 'One'
        +  }]);
        +
        +  $element.val('One');
        +  selection.options.set('disabled', true);
        +
        +  var $remove = $selection.find('.select2-selection__clear');
        +  $remove.trigger('mousedown');
        +
        +  assert.equal(
        +    $element.val(),
        +    'One',
        +    'The placeholder should not have been set'
        +  );
        +});
        diff --git a/bower_components/select2/tests/selection/containerCss-tests.js b/bower_components/select2/tests/selection/containerCss-tests.js
        new file mode 100644
        index 0000000000..522703a238
        --- /dev/null
        +++ b/bower_components/select2/tests/selection/containerCss-tests.js
        @@ -0,0 +1,104 @@
        +module('Dropdown - containerCssClass compatibility');
        +
        +var $ = require('jquery');
        +var Utils = require('select2/utils');
        +var Options = require('select2/options');
        +
        +var SingleSelection = require('select2/selection/single');
        +var ContainerCSS = Utils.Decorate(
        +  SingleSelection,
        +  require('select2/compat/containerCss')
        +);
        +
        +test('all classes will be copied if :all: is used', function (assert) {
        +  var $element = $('<select class="test copy works"></select>');
        +  var options = new Options({
        +    containerCssClass: ':all:'
        +  });
        +
        +  var select = new ContainerCSS($element, options);
        +  var $container = select.render();
        +
        +  assert.ok($container.hasClass('test'));
        +  assert.ok($container.hasClass('copy'));
        +  assert.ok($container.hasClass('works'));
        +  assert.ok(!$container.hasClass(':all:'));
        +});
        +
        +test(':all: can be used with other classes', function (assert) {
        +  var $element = $('<select class="test copy works"></select>');
        +  var options = new Options({
        +    containerCssClass: ':all: other'
        +  });
        +
        +  var select = new ContainerCSS($element, options);
        +  var $container = select.render();
        +
        +  assert.ok($container.hasClass('test'));
        +  assert.ok($container.hasClass('copy'));
        +  assert.ok($container.hasClass('works'));
        +  assert.ok($container.hasClass('other'));
        +  assert.ok(!$container.hasClass(':all:'));
        +});
        +
        +test('classes can be passed in as a string', function (assert) {
        +  var $element = $('<select class="test copy works"></select>');
        +  var options = new Options({
        +    containerCssClass: 'other'
        +  });
        +
        +  var select = new ContainerCSS($element, options);
        +  var $container = select.render();
        +
        +  assert.ok($container.hasClass('other'));
        +});
        +
        +test('a function can be used based on the element', function (assert){
        +  var $element = $('<select class="test"></select>');
        +  var options = new Options({
        +    containerCssClass: function ($element) {
        +      return 'function';
        +    }
        +  });
        +
        +  var select = new ContainerCSS($element, options);
        +  var $container = select.render();
        +
        +  assert.ok($container.hasClass('function'));
        +  assert.ok(!$container.hasClass('test'));
        +});
        +
        +test(':all: works around custom adapters', function (assert) {
        +  var $element = $('<select class="test"></select>');
        +  var options = new Options({
        +    containerCssClass: ':all: something',
        +    adaptContainerCssClass: function (clazz) {
        +      return clazz + '-modified';
        +    }
        +  });
        +
        +  var select = new ContainerCSS($element, options);
        +  var $container = select.render();
        +
        +  assert.ok($container.hasClass('something'));
        +
        +  assert.ok($container.hasClass('test'));
        +  assert.ok($container.hasClass('test-modified'));
        +});
        +
        +module('Selection - adaptContainerCss compatibility');
        +
        +test('only return when adapted', function (assert) {
        +  var $element = $('<select class="original"></select>');
        +  var options = new Options({
        +    adaptContainerCssClass: function (clazz) {
        +      return 'modified';
        +    }
        +  });
        +
        +  var select = new ContainerCSS($element, options);
        +  var $container = select.render();
        +
        +  assert.ok(!$container.hasClass('original'));
        +  assert.ok($container.hasClass('modified'));
        +});
        diff --git a/bower_components/select2/tests/selection/multiple-tests.js b/bower_components/select2/tests/selection/multiple-tests.js
        new file mode 100644
        index 0000000000..0d0f9c2e63
        --- /dev/null
        +++ b/bower_components/select2/tests/selection/multiple-tests.js
        @@ -0,0 +1,149 @@
        +module('Selection containers - Multiple');
        +
        +var MultipleSelection = require('select2/selection/multiple');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var options = new Options({});
        +
        +test('display uses templateSelection', function (assert) {
        +  var called = false;
        +
        +  var templateOptions = new Options({
        +    templateSelection: function (data) {
        +      called = true;
        +
        +      return data.text;
        +    }
        +  });
        +
        +  var selection = new MultipleSelection(
        +    $('#qunit-fixture .multiple'),
        +    templateOptions
        +  );
        +
        +  var out = selection.display({
        +    text: 'test'
        +  });
        +
        +  assert.ok(called);
        +
        +  assert.equal(out, 'test');
        +});
        +
        +test('templateSelection can addClass', function (assert) {
        +  var called = false;
        +
        +  var templateOptions = new Options({
        +    templateSelection: function (data, container) {
        +      called = true;
        +      container.addClass('testclass');
        +      return data.text;
        +    }
        +  });
        +
        +  var selection = new MultipleSelection(
        +    $('#qunit-fixture .multiple'),
        +    templateOptions
        +  );
        +
        +  var $container = selection.selectionContainer();
        +
        +  var out = selection.display({
        +    text: 'test'
        +  }, $container);
        +
        +  assert.ok(called);
        +
        +  assert.equal(out, 'test');
        +
        +  assert.ok($container.hasClass('testclass'));
        +});
        +
        +test('empty update clears the selection', function (assert) {
        +  var selection = new MultipleSelection(
        +    $('#qunit-fixture .multiple'),
        +    options
        +  );
        +
        +  var $selection = selection.render();
        +  var $rendered = $selection.find('.select2-selection__rendered');
        +
        +  $rendered.text('testing');
        +
        +  selection.update([]);
        +
        +  assert.equal($rendered.text(), '');
        +});
        +
        +test('escapeMarkup is being used', function (assert) {
        +  var selection = new MultipleSelection(
        +    $('#qunit-fixture .multiple'),
        +    options
        +  );
        +
        +  var $selection = selection.render();
        +  var $rendered = $selection.find('.select2-selection__rendered');
        +
        +  var unescapedText = '<script>bad("stuff");</script>';
        +
        +  selection.update([{
        +    text: unescapedText
        +  }]);
        +
        +  assert.equal(
        +    $rendered.text().substr(1),
        +    unescapedText,
        +    'The text should be escaped by default to prevent injection'
        +  );
        +});
        +
        +test('clear button respects the disabled state', function (assert) {
        +  var options = new Options({
        +    disabled: true
        +  });
        +
        +  var $select = $('#qunit-fixture .multiple');
        +
        +  var container = new MockContainer();
        +  var $container = $('<div></div>');
        +
        +  var selection = new MultipleSelection(
        +    $select,
        +    options
        +  );
        +
        +  var $selection = selection.render();
        +  $container.append($selection);
        +
        +  selection.bind(container, $container);
        +
        +  // Select an option
        +  selection.update([{
        +    text: 'Test'
        +  }]);
        +
        +  var $rendered = $selection.find('.select2-selection__rendered');
        +
        +  var $pill = $rendered.find('.select2-selection__choice');
        +
        +  assert.equal($pill.length, 1, 'There should only be one selection');
        +
        +  var $remove = $pill.find('.select2-selection__choice__remove');
        +
        +  assert.equal(
        +    $remove.length,
        +    1,
        +    'The remove icon is displayed for the selection'
        +  );
        +
        +  // Set up the unselect handler
        +  selection.on('unselect', function (params) {
        +    assert.ok(false, 'The unselect handler should not be triggered');
        +  });
        +
        +  // Trigger the handler for the remove icon
        +  $remove.trigger('click');
        +});
        diff --git a/bower_components/select2/tests/selection/placeholder-tests.js b/bower_components/select2/tests/selection/placeholder-tests.js
        new file mode 100644
        index 0000000000..8a436ff338
        --- /dev/null
        +++ b/bower_components/select2/tests/selection/placeholder-tests.js
        @@ -0,0 +1,74 @@
        +module('Selection containers - Placeholders');
        +
        +var Placeholder = require('select2/selection/placeholder');
        +var SingleSelection = require('select2/selection/single');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var SinglePlaceholder = Utils.Decorate(SingleSelection, Placeholder);
        +
        +var placeholderOptions = new Options({
        +  placeholder: {
        +    id: 'placeholder',
        +    text: 'This is the placeholder'
        +  }
        +});
        +
        +test('normalizing placeholder ignores objects', function (assert) {
        +  var selection = new SinglePlaceholder(
        +    $('#qunit-fixture .single'),
        +    placeholderOptions
        +  );
        +
        +  var original = {
        +    id: 'test',
        +    text: 'testing'
        +  };
        +
        +  var normalized = selection.normalizePlaceholder(original);
        +
        +  assert.equal(original, normalized);
        +});
        +
        +test('normalizing placeholder gives object for string', function (assert) {
        +  var selection = new SinglePlaceholder(
        +    $('#qunit-fixture .single'),
        +    placeholderOptions
        +  );
        +
        +  var normalized = selection.normalizePlaceholder('placeholder');
        +
        +  assert.equal(normalized.id, '');
        +  assert.equal(normalized.text, 'placeholder');
        +});
        +
        +
        +test('text is shown for placeholder option on single', function (assert) {
        +  var selection = new SinglePlaceholder(
        +    $('#qunit-fixture .single'),
        +    placeholderOptions
        +  );
        +
        +  var $selection = selection.render();
        +
        +  selection.update([{
        +    id: 'placeholder'
        +  }]);
        +
        +  assert.equal($selection.text(), 'This is the placeholder');
        +});
        +
        +test('placeholder is shown when no options are selected', function (assert) {
        +  var selection = new SinglePlaceholder(
        +    $('#qunit-fixture .multiple'),
        +    placeholderOptions
        +  );
        +
        +  var $selection = selection.render();
        +
        +  selection.update([]);
        +
        +  assert.equal($selection.text(), 'This is the placeholder');
        +});
        diff --git a/bower_components/select2/tests/selection/search-tests.js b/bower_components/select2/tests/selection/search-tests.js
        new file mode 100644
        index 0000000000..43345d72f0
        --- /dev/null
        +++ b/bower_components/select2/tests/selection/search-tests.js
        @@ -0,0 +1,191 @@
        +module('Selection containers - Inline search');
        +
        +var MultipleSelection = require('select2/selection/multiple');
        +var InlineSearch = require('select2/selection/search');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var options = new Options({});
        +
        +test('backspace will remove a choice', function (assert) {
        +  assert.expect(3);
        +
        +  var KEYS = require('select2/keys');
        +
        +  var $container = $('#qunit-fixture .event-container');
        +  var container = new MockContainer();
        +
        +  var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
        +
        +  var $element = $('#qunit-fixture .multiple');
        +  var selection = new CustomSelection($element, options);
        +
        +  var $selection = selection.render();
        +  selection.bind(container, $container);
        +
        +  // The unselect event should be triggered at some point
        +  selection.on('unselect', function () {
        +    assert.ok(true, 'A choice was unselected');
        +  });
        +
        +  // Add some selections and render the search
        +  selection.update([
        +    {
        +      id: '1',
        +      text: 'One'
        +    }
        +  ]);
        +
        +  var $search = $selection.find('input');
        +  var $choices = $selection.find('.select2-selection__choice');
        +
        +  assert.equal($search.length, 1, 'The search was visible');
        +  assert.equal($choices.length, 1, 'The choice was rendered');
        +
        +  // Trigger the backspace on the search
        +  var backspace = $.Event('keydown', {
        +    which: KEYS.BACKSPACE
        +  });
        +  $search.trigger(backspace);
        +});
        +
        +test('backspace will set the search text', function (assert) {
        +  assert.expect(3);
        +
        +  var KEYS = require('select2/keys');
        +
        +  var $container = $('#qunit-fixture .event-container');
        +  var container = new MockContainer();
        +
        +  var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
        +
        +  var $element = $('#qunit-fixture .multiple');
        +  var selection = new CustomSelection($element, options);
        +
        +  var $selection = selection.render();
        +  selection.bind(container, $container);
        +
        +  // Add some selections and render the search
        +  selection.update([
        +    {
        +      id: '1',
        +      text: 'One'
        +    }
        +  ]);
        +
        +  var $search = $selection.find('input');
        +  var $choices = $selection.find('.select2-selection__choice');
        +
        +  assert.equal($search.length, 1, 'The search was visible');
        +  assert.equal($choices.length, 1, 'The choice was rendered');
        +
        +  // Trigger the backspace on the search
        +  var backspace = $.Event('keydown', {
        +    which: KEYS.BACKSPACE
        +  });
        +  $search.trigger(backspace);
        +
        +  assert.equal($search.val(), 'One', 'The search text was set');
        +});
        +
        +test('updating selection does not shift the focus', function (assert) {
        +  // Check for IE 8, which triggers a false negative during testing
        +  if (window.attachEvent && !window.addEventListener) {
        +    // We must expect 0 assertions or the test will fail
        +    assert.expect(0);
        +    return;
        +  }
        +
        +  var $container = $('#qunit-fixture .event-container');
        +  var container = new MockContainer();
        +
        +  var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
        +
        +  var $element = $('#qunit-fixture .multiple');
        +  var selection = new CustomSelection($element, options);
        +
        +  var $selection = selection.render();
        +  selection.bind(container, $container);
        +
        +  // Update the selection so the search is rendered
        +  selection.update([]);
        +
        +  // Make it visible so the browser can place focus on the search
        +  $container.append($selection);
        +
        +  var $search = $selection.find('input');
        +  $search.trigger('focus');
        +
        +  assert.equal($search.length, 1, 'The search was not visible');
        +
        +  assert.equal(
        +    document.activeElement,
        +    $search[0],
        +    'The search did not have focus originally'
        +  );
        +
        +  // Trigger an update, this should redraw the search box
        +  selection.update([]);
        +
        +  assert.equal($search.length, 1, 'The search box disappeared');
        +
        +  assert.equal(
        +    document.activeElement,
        +    $search[0],
        +    'The search did not have focus after the selection was updated'
        +  );
        +});
        +
        +test('the focus event shifts the focus', function (assert) {
        +  // Check for IE 8, which triggers a false negative during testing
        +  if (window.attachEvent && !window.addEventListener) {
        +    // We must expect 0 assertions or the test will fail
        +    assert.expect(0);
        +    return;
        +  }
        +
        +  var $container = $('#qunit-fixture .event-container');
        +  var container = new MockContainer();
        +
        +  var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
        +
        +  var $element = $('#qunit-fixture .multiple');
        +  var selection = new CustomSelection($element, options);
        +
        +  var $selection = selection.render();
        +  selection.bind(container, $container);
        +
        +  // Update the selection so the search is rendered
        +  selection.update([]);
        +
        +  // Make it visible so the browser can place focus on the search
        +  $container.append($selection);
        +
        +  // The search should not be automatically focused
        +
        +  var $search = $selection.find('input');
        +
        +  assert.notEqual(
        +    document.activeElement,
        +    $search[0],
        +    'The search had focus originally'
        +  );
        +
        +  assert.equal($search.length, 1, 'The search was not visible');
        +
        +  // Focus the container
        +
        +  container.trigger('focus');
        +
        +  // Make sure it focuses the search
        +
        +  assert.equal($search.length, 1, 'The search box disappeared');
        +
        +  assert.equal(
        +    document.activeElement,
        +    $search[0],
        +    'The search did not have focus originally'
        +  );
        +});
        \ No newline at end of file
        diff --git a/bower_components/select2/tests/selection/single-tests.js b/bower_components/select2/tests/selection/single-tests.js
        new file mode 100644
        index 0000000000..2731b2a5a1
        --- /dev/null
        +++ b/bower_components/select2/tests/selection/single-tests.js
        @@ -0,0 +1,117 @@
        +module('Selection containers - Single');
        +
        +var SingleSelection = require('select2/selection/single');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var options = new Options({});
        +
        +test('display uses templateSelection', function (assert) {
        +  var called = false;
        +
        +  var templateOptions = new Options({
        +    templateSelection: function (data) {
        +      called = true;
        +
        +      return data.text;
        +    }
        +  });
        +
        +  var selection = new SingleSelection(
        +    $('#qunit-fixture .single'),
        +    templateOptions
        +  );
        +
        +  var out = selection.display({
        +    text: 'test'
        +  });
        +
        +  assert.ok(called);
        +
        +  assert.equal(out, 'test');
        +});
        +
        +test('templateSelection can addClass', function (assert) {
        +  var called = false;
        +
        +  var templateOptions = new Options({
        +    templateSelection: function (data, container) {
        +      called = true;
        +      container.addClass('testclass');
        +      return data.text;
        +    }
        +  });
        +
        +  var selection = new SingleSelection(
        +    $('#qunit-fixture .single'),
        +    templateOptions
        +  );
        +
        +  var $container = selection.selectionContainer();
        +  
        +  var out = selection.display({
        +    text: 'test'
        +  }, $container);
        +
        +  assert.ok(called);
        +
        +  assert.equal(out, 'test');
        +  
        +  assert.ok($container.hasClass('testclass'));
        +});
        +
        +test('empty update clears the selection', function (assert) {
        +  var selection = new SingleSelection(
        +    $('#qunit-fixture .single'),
        +    options
        +  );
        +
        +  var $selection = selection.render();
        +  var $rendered = $selection.find('.select2-selection__rendered');
        +
        +  $rendered.text('testing');
        +
        +  selection.update([]);
        +
        +  assert.equal($rendered.text(), '');
        +});
        +
        +test('update renders the data text', function (assert) {
        +  var selection = new SingleSelection(
        +    $('#qunit-fixture .single'),
        +    options
        +  );
        +
        +  var $selection = selection.render();
        +  var $rendered = $selection.find('.select2-selection__rendered');
        +
        +  selection.update([{
        +    text: 'test'
        +  }]);
        +
        +  assert.equal($rendered.text(), 'test');
        +});
        +
        +test('escapeMarkup is being used', function (assert) {
        +  var selection = new SingleSelection(
        +    $('#qunit-fixture .single'),
        +    options
        +  );
        +
        +  var $selection = selection.render();
        +  var $rendered = $selection.find('.select2-selection__rendered');
        +
        +  var unescapedText = '<script>bad("stuff");</script>';
        +
        +  selection.update([{
        +    text: unescapedText
        +  }]);
        +
        +  assert.equal(
        +    $rendered.text(),
        +    unescapedText,
        +    'The text should be escaped by default to prevent injection'
        +  );
        +});
        diff --git a/bower_components/select2/tests/selection/stopPropagation-tests.js b/bower_components/select2/tests/selection/stopPropagation-tests.js
        new file mode 100644
        index 0000000000..d8d8897b3c
        --- /dev/null
        +++ b/bower_components/select2/tests/selection/stopPropagation-tests.js
        @@ -0,0 +1,33 @@
        +module('Selection containers - Stoping event propagation');
        +
        +var SingleSelection = require('select2/selection/single');
        +var StopPropagation = require('select2/selection/stopPropagation');
        +
        +var $ = require('jquery');
        +var Options = require('select2/options');
        +var Utils = require('select2/utils');
        +
        +var CutomSelection = Utils.Decorate(SingleSelection, StopPropagation);
        +
        +var options = new Options();
        +
        +test('click event does not propagate', function (assert) {
        +  assert.expect(1);
        +
        +  var $container = $('#qunit-fixture .event-container');
        +  var container = new MockContainer();
        +
        +  var selection = new CutomSelection($('#qunit-fixture select'), options);
        +
        +  var $selection = selection.render();
        +  selection.bind(container, $container);
        +
        +  $container.append($selection);
        +  $container.on('click', function () {
        +    assert.ok(false, 'The click event should have been stopped');
        +  });
        +
        +  $selection.trigger('click');
        +
        +  assert.ok(true, 'Something went wrong if this failed');
        +});
        diff --git a/bower_components/select2/tests/unit.html b/bower_components/select2/tests/unit.html
        new file mode 100644
        index 0000000000..384deb2316
        --- /dev/null
        +++ b/bower_components/select2/tests/unit.html
        @@ -0,0 +1,95 @@
        +<!doctype html>
        +<html>
        +  <head>
        +    <link rel="stylesheet" href="vendor/qunit-1.23.1.css" type="text/css" />
        +    <link rel="stylesheet" href="../../dist/css/select2.css" type="text/css" />
        +  </head>
        +  <body>
        +    <div id="qunit"></div>
        +    <div id="qunit-fixture">
        +      <div class="event-container">
        +        <select></select>
        +      </div>
        +
        +      <select class="single">
        +        <option>One</option>
        +      </select>
        +
        +      <select class="single-empty"></select>
        +
        +      <select class="single-with-placeholder">
        +        <option>placeholder</option>
        +        <option>One</option>
        +      </select>
        +
        +      <select class="multiple" multiple="multiple">
        +        <option>One</option>
        +        <option>Two</option>
        +      </select>
        +
        +      <select class="groups">
        +        <optgroup label="Test">
        +          <option value="one">One</option>
        +          <option value="two">Two</option>
        +        </optgroup>
        +        <optgroup label="Empty"></optgroup>
        +      </select>
        +
        +      <select class="duplicates">
        +        <option value="one">One</option>
        +        <option value="two">Two</option>
        +        <option value="one">Uno</option>
        +      </select>
        +
        +      <select class="duplicates-multi" multiple="multiple">
        +        <option value="one">One</option>
        +        <option value="two">Two</option>
        +        <option value="one">Uno</option>
        +      </select>
        +    </div>
        +
        +    <script src="vendor/qunit-1.23.1.js" type="text/javascript"></script>
        +    <script src="vendor/jquery-1.7.2.js" type="text/javascript"></script>
        +    <script src="../dist/js/select2.full.js" type="text/javascript"></script>
        +
        +    <script src="helpers.js" type="text/javascript"></script>
        +
        +    <script src="a11y/selection-tests.js" type="text/javascript"></script>
        +    <script src="a11y/search-tests.js" type="text/javascript"></script>
        +
        +    <script src="data/array-tests.js" type="text/javascript"></script>
        +    <script src="data/base-tests.js" type="text/javascript"></script>
        +    <script src="data/inputData-tests.js" type="text/javascript"></script>
        +    <script src="data/select-tests.js" type="text/javascript"></script>
        +    <script src="data/tags-tests.js" type="text/javascript"></script>
        +    <script src="data/tokenizer-tests.js" type="text/javascript"></script>
        +
        +    <script src="data/maximumInputLength-tests.js" type="text/javascript"></script>
        +    <script src="data/maximumSelectionLength-tests.js" type="text/javascript"></script>
        +    <script src="data/minimumInputLength-tests.js" type="text/javascript"></script>
        +
        +    <script src="dropdown/dropdownCss-tests.js" type="text/javascript"></script>
        +    <script src="dropdown/positioning-tests.js" type="text/javascript"></script>
        +    <script src="dropdown/selectOnClose-tests.js" type="text/javascript"></script>
        +    <script src="dropdown/stopPropagation-tests.js" type="text/javascript"></script>
        +
        +    <script src="options/ajax-tests.js" type="text/javascript"></script>
        +    <script src="options/data-tests.js" type="text/javascript"></script>
        +    <script src="options/deprecated-tests.js" type="text/javascript"></script>
        +    <script src="options/translation-tests.js" type="text/javascript"></script>
        +    <script src="options/width-tests.js" type="text/javascript"></script>
        +
        +    <script src="results/focusing-tests.js" type="text/javascript"></script>
        +
        +    <script src="selection/allowClear-tests.js" type="text/javascript"></script>
        +    <script src="selection/containerCss-tests.js" type="text/javascript"></script>
        +    <script src="selection/multiple-tests.js" type="text/javascript"></script>
        +    <script src="selection/placeholder-tests.js" type="text/javascript"></script>
        +    <script src="selection/search-tests.js" type="text/javascript"></script>
        +    <script src="selection/single-tests.js" type="text/javascript"></script>
        +    <script src="selection/stopPropagation-tests.js" type="text/javascript"></script>
        +
        +    <script src="utils/decorator-tests.js" type="text/javascript"></script>
        +    <script src="utils/escapeMarkup-tests.js" type="text/javascript"></script>
        +  </body>
        +</html>
        diff --git a/bower_components/select2/tests/utils/decorator-tests.js b/bower_components/select2/tests/utils/decorator-tests.js
        new file mode 100644
        index 0000000000..4888991f62
        --- /dev/null
        +++ b/bower_components/select2/tests/utils/decorator-tests.js
        @@ -0,0 +1,189 @@
        +module('Decorators');
        +
        +var Utils = require('select2/utils');
        +
        +test('overridden - method', function (assert) {
        +  function BaseClass () {}
        +
        +  BaseClass.prototype.hello = function () {
        +    return 'A';
        +  };
        +
        +  function DecoratorClass () {}
        +
        +  DecoratorClass.prototype.hello = function () {
        +    return 'B';
        +  };
        +
        +  var DecoratedClass = Utils.Decorate(BaseClass, DecoratorClass);
        +
        +  var inst = new DecoratedClass();
        +
        +  assert.strictEqual(inst.hello(), 'B');
        +});
        +
        +test('overridden - constructor', function (assert) {
        +  function BaseClass () {
        +    this.inherited = true;
        +  }
        +
        +  BaseClass.prototype.hello = function () {
        +    return 'A';
        +  };
        +
        +  function DecoratorClass (decorated) {
        +    this.called = true;
        +  }
        +
        +  DecoratorClass.prototype.other = function () {
        +    return 'B';
        +  };
        +
        +  var DecoratedClass = Utils.Decorate(BaseClass, DecoratorClass);
        +
        +  var inst = new DecoratedClass();
        +
        +  assert.ok(inst.called);
        +  assert.ok(!inst.inherited);
        +});
        +
        +test('not overridden - method', function (assert) {
        +  function BaseClass () {}
        +
        +  BaseClass.prototype.hello = function () {
        +    return 'A';
        +  };
        +
        +  function DecoratorClass () {}
        +
        +  DecoratorClass.prototype.other = function () {
        +    return 'B';
        +  };
        +
        +  var DecoratedClass = Utils.Decorate(BaseClass, DecoratorClass);
        +
        +  var inst = new DecoratedClass();
        +
        +  assert.strictEqual(inst.hello(), 'A');
        +});
        +
        +test('not overridden - constructor', function (assert) {
        +  function BaseClass () {
        +    this.called = true;
        +  }
        +
        +  BaseClass.prototype.hello = function () {
        +    return 'A';
        +  };
        +
        +  function DecoratorClass () {}
        +
        +  DecoratorClass.prototype.other = function () {
        +    return 'B';
        +  };
        +
        +  var DecoratedClass = Utils.Decorate(BaseClass, DecoratorClass);
        +
        +  var inst = new DecoratedClass();
        +
        +  assert.ok(inst.called);
        +});
        +
        +test('inherited - method', function (assert) {
        +  function BaseClass () {}
        +
        +  BaseClass.prototype.hello = function () {
        +    return 'A';
        +  };
        +
        +  function DecoratorClass (decorated) {}
        +
        +  DecoratorClass.prototype.hello = function (decorated) {
        +    return 'B' + decorated.call(this) + 'C';
        +  };
        +
        +  var DecoratedClass = Utils.Decorate(BaseClass, DecoratorClass);
        +
        +  var inst = new DecoratedClass();
        +
        +  assert.strictEqual(inst.hello(), 'BAC');
        +});
        +
        +test('inherited - constructor', function (assert) {
        +  function BaseClass () {
        +    this.inherited = true;
        +  }
        +
        +  BaseClass.prototype.hello = function () {
        +    return 'A';
        +  };
        +
        +  function DecoratorClass (decorated) {
        +    this.called = true;
        +
        +    decorated.call(this);
        +  }
        +
        +  DecoratorClass.prototype.other = function () {
        +    return 'B';
        +  };
        +
        +  var DecoratedClass = Utils.Decorate(BaseClass, DecoratorClass);
        +
        +  var inst = new DecoratedClass();
        +
        +  assert.ok(inst.called);
        +  assert.ok(inst.inherited);
        +});
        +
        +test('inherited - three levels', function (assert) {
        +  function BaseClass (testArgument) {
        +    this.baseCalled = true;
        +    this.baseTestArgument = testArgument;
        +  }
        +
        +  BaseClass.prototype.test = function (a) {
        +    return a + 'c';
        +  };
        +
        +  function MiddleClass (decorated, testArgument) {
        +    this.middleCalled = true;
        +    this.middleTestArgument = testArgument;
        +
        +    decorated.call(this, testArgument);
        +  }
        +
        +  MiddleClass.prototype.test = function (decorated, a) {
        +    return decorated.call(this, a + 'b');
        +  };
        +
        +  function DecoratorClass (decorated, testArgument) {
        +    this.decoratorCalled = true;
        +    this.decoratorTestArgument = testArgument;
        +
        +    decorated.call(this, testArgument);
        +  }
        +
        +  DecoratorClass.prototype.test = function (decorated, a) {
        +    return decorated.call(this, a + 'a');
        +  };
        +
        +  var DecoratedClass = Utils.Decorate(
        +    Utils.Decorate(BaseClass, MiddleClass),
        +    DecoratorClass
        +  );
        +
        +  var inst = new DecoratedClass('test');
        +
        +  assert.ok(inst.baseCalled, 'The base class contructor was called');
        +  assert.ok(inst.middleCalled, 'The middle class constructor was called');
        +  assert.ok(inst.decoratorCalled, 'The decorator constructor was called');
        +
        +  assert.strictEqual(inst.baseTestArgument, 'test');
        +  assert.strictEqual(inst.middleTestArgument, 'test');
        +  assert.strictEqual(inst.decoratorTestArgument, 'test');
        +
        +  var out = inst.test('test');
        +
        +  assert.strictEqual(out, 'testabc');
        +});
        diff --git a/bower_components/select2/tests/utils/escapeMarkup-tests.js b/bower_components/select2/tests/utils/escapeMarkup-tests.js
        new file mode 100644
        index 0000000000..726f09dee0
        --- /dev/null
        +++ b/bower_components/select2/tests/utils/escapeMarkup-tests.js
        @@ -0,0 +1,36 @@
        +module('Utils - escapeMarkup');
        +
        +var Utils = require('select2/utils');
        +
        +test('text passes through', function (assert) {
        +  var text = 'testing this';
        +  var escaped = Utils.escapeMarkup(text);
        +
        +  assert.equal(text, escaped);
        +});
        +
        +test('html tags are escaped', function (assert) {
        +  var text = '<script>alert("bad");</script>';
        +  var escaped = Utils.escapeMarkup(text);
        +
        +  assert.notEqual(text, escaped);
        +  assert.equal(escaped.indexOf('<script>'), -1);
        +});
        +
        +test('quotes are killed as well', function (assert) {
        +  var text = 'testin\' these "quotes"';
        +  var escaped = Utils.escapeMarkup(text);
        +
        +  assert.notEqual(text, escaped);
        +  assert.equal(escaped.indexOf('\''), -1);
        +  assert.equal(escaped.indexOf('"'), -1);
        +});
        +
        +test('DocumentFragment options pass through', function (assert) {
        +  var frag = document.createDocumentFragment();
        +  frag.innerHTML = '<strong>test</strong>';
        +
        +  var escaped = Utils.escapeMarkup(frag);
        +
        +  assert.equal(frag, escaped);
        +});
        diff --git a/bower_components/select2/tests/vendor/jquery-1.7.2.js b/bower_components/select2/tests/vendor/jquery-1.7.2.js
        new file mode 100644
        index 0000000000..ceb681ff9f
        --- /dev/null
        +++ b/bower_components/select2/tests/vendor/jquery-1.7.2.js
        @@ -0,0 +1,9404 @@
        +/*!
        + * jQuery JavaScript Library v1.7.2
        + * http://jquery.com/
        + *
        + * Copyright 2011, John Resig
        + * Dual licensed under the MIT or GPL Version 2 licenses.
        + * http://jquery.org/license
        + *
        + * Includes Sizzle.js
        + * http://sizzlejs.com/
        + * Copyright 2011, The Dojo Foundation
        + * Released under the MIT, BSD, and GPL Licenses.
        + *
        + * Date: Wed Mar 21 12:46:34 2012 -0700
        + */
        +(function( window, undefined ) {
        +
        +// Use the correct document accordingly with window argument (sandbox)
        +var document = window.document,
        +	navigator = window.navigator,
        +	location = window.location;
        +var jQuery = (function() {
        +
        +// Define a local copy of jQuery
        +var jQuery = function( selector, context ) {
        +		// The jQuery object is actually just the init constructor 'enhanced'
        +		return new jQuery.fn.init( selector, context, rootjQuery );
        +	},
        +
        +	// Map over jQuery in case of overwrite
        +	_jQuery = window.jQuery,
        +
        +	// Map over the $ in case of overwrite
        +	_$ = window.$,
        +
        +	// A central reference to the root jQuery(document)
        +	rootjQuery,
        +
        +	// A simple way to check for HTML strings or ID strings
        +	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        +	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
        +
        +	// Check if a string has a non-whitespace character in it
        +	rnotwhite = /\S/,
        +
        +	// Used for trimming whitespace
        +	trimLeft = /^\s+/,
        +	trimRight = /\s+$/,
        +
        +	// Match a standalone tag
        +	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
        +
        +	// JSON RegExp
        +	rvalidchars = /^[\],:{}\s]*$/,
        +	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
        +	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
        +	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
        +
        +	// Useragent RegExp
        +	rwebkit = /(webkit)[ \/]([\w.]+)/,
        +	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
        +	rmsie = /(msie) ([\w.]+)/,
        +	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
        +
        +	// Matches dashed string for camelizing
        +	rdashAlpha = /-([a-z]|[0-9])/ig,
        +	rmsPrefix = /^-ms-/,
        +
        +	// Used by jQuery.camelCase as callback to replace()
        +	fcamelCase = function( all, letter ) {
        +		return ( letter + "" ).toUpperCase();
        +	},
        +
        +	// Keep a UserAgent string for use with jQuery.browser
        +	userAgent = navigator.userAgent,
        +
        +	// For matching the engine and version of the browser
        +	browserMatch,
        +
        +	// The deferred used on DOM ready
        +	readyList,
        +
        +	// The ready event handler
        +	DOMContentLoaded,
        +
        +	// Save a reference to some core methods
        +	toString = Object.prototype.toString,
        +	hasOwn = Object.prototype.hasOwnProperty,
        +	push = Array.prototype.push,
        +	slice = Array.prototype.slice,
        +	trim = String.prototype.trim,
        +	indexOf = Array.prototype.indexOf,
        +
        +	// [[Class]] -> type pairs
        +	class2type = {};
        +
        +jQuery.fn = jQuery.prototype = {
        +	constructor: jQuery,
        +	init: function( selector, context, rootjQuery ) {
        +		var match, elem, ret, doc;
        +
        +		// Handle $(""), $(null), or $(undefined)
        +		if ( !selector ) {
        +			return this;
        +		}
        +
        +		// Handle $(DOMElement)
        +		if ( selector.nodeType ) {
        +			this.context = this[0] = selector;
        +			this.length = 1;
        +			return this;
        +		}
        +
        +		// The body element only exists once, optimize finding it
        +		if ( selector === "body" && !context && document.body ) {
        +			this.context = document;
        +			this[0] = document.body;
        +			this.selector = selector;
        +			this.length = 1;
        +			return this;
        +		}
        +
        +		// Handle HTML strings
        +		if ( typeof selector === "string" ) {
        +			// Are we dealing with HTML string or an ID?
        +			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
        +				// Assume that strings that start and end with <> are HTML and skip the regex check
        +				match = [ null, selector, null ];
        +
        +			} else {
        +				match = quickExpr.exec( selector );
        +			}
        +
        +			// Verify a match, and that no context was specified for #id
        +			if ( match && (match[1] || !context) ) {
        +
        +				// HANDLE: $(html) -> $(array)
        +				if ( match[1] ) {
        +					context = context instanceof jQuery ? context[0] : context;
        +					doc = ( context ? context.ownerDocument || context : document );
        +
        +					// If a single string is passed in and it's a single tag
        +					// just do a createElement and skip the rest
        +					ret = rsingleTag.exec( selector );
        +
        +					if ( ret ) {
        +						if ( jQuery.isPlainObject( context ) ) {
        +							selector = [ document.createElement( ret[1] ) ];
        +							jQuery.fn.attr.call( selector, context, true );
        +
        +						} else {
        +							selector = [ doc.createElement( ret[1] ) ];
        +						}
        +
        +					} else {
        +						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
        +						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
        +					}
        +
        +					return jQuery.merge( this, selector );
        +
        +				// HANDLE: $("#id")
        +				} else {
        +					elem = document.getElementById( match[2] );
        +
        +					// Check parentNode to catch when Blackberry 4.6 returns
        +					// nodes that are no longer in the document #6963
        +					if ( elem && elem.parentNode ) {
        +						// Handle the case where IE and Opera return items
        +						// by name instead of ID
        +						if ( elem.id !== match[2] ) {
        +							return rootjQuery.find( selector );
        +						}
        +
        +						// Otherwise, we inject the element directly into the jQuery object
        +						this.length = 1;
        +						this[0] = elem;
        +					}
        +
        +					this.context = document;
        +					this.selector = selector;
        +					return this;
        +				}
        +
        +			// HANDLE: $(expr, $(...))
        +			} else if ( !context || context.jquery ) {
        +				return ( context || rootjQuery ).find( selector );
        +
        +			// HANDLE: $(expr, context)
        +			// (which is just equivalent to: $(context).find(expr)
        +			} else {
        +				return this.constructor( context ).find( selector );
        +			}
        +
        +		// HANDLE: $(function)
        +		// Shortcut for document ready
        +		} else if ( jQuery.isFunction( selector ) ) {
        +			return rootjQuery.ready( selector );
        +		}
        +
        +		if ( selector.selector !== undefined ) {
        +			this.selector = selector.selector;
        +			this.context = selector.context;
        +		}
        +
        +		return jQuery.makeArray( selector, this );
        +	},
        +
        +	// Start with an empty selector
        +	selector: "",
        +
        +	// The current version of jQuery being used
        +	jquery: "1.7.2",
        +
        +	// The default length of a jQuery object is 0
        +	length: 0,
        +
        +	// The number of elements contained in the matched element set
        +	size: function() {
        +		return this.length;
        +	},
        +
        +	toArray: function() {
        +		return slice.call( this, 0 );
        +	},
        +
        +	// Get the Nth element in the matched element set OR
        +	// Get the whole matched element set as a clean array
        +	get: function( num ) {
        +		return num == null ?
        +
        +			// Return a 'clean' array
        +			this.toArray() :
        +
        +			// Return just the object
        +			( num < 0 ? this[ this.length + num ] : this[ num ] );
        +	},
        +
        +	// Take an array of elements and push it onto the stack
        +	// (returning the new matched element set)
        +	pushStack: function( elems, name, selector ) {
        +		// Build a new jQuery matched element set
        +		var ret = this.constructor();
        +
        +		if ( jQuery.isArray( elems ) ) {
        +			push.apply( ret, elems );
        +
        +		} else {
        +			jQuery.merge( ret, elems );
        +		}
        +
        +		// Add the old object onto the stack (as a reference)
        +		ret.prevObject = this;
        +
        +		ret.context = this.context;
        +
        +		if ( name === "find" ) {
        +			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
        +		} else if ( name ) {
        +			ret.selector = this.selector + "." + name + "(" + selector + ")";
        +		}
        +
        +		// Return the newly-formed element set
        +		return ret;
        +	},
        +
        +	// Execute a callback for every element in the matched set.
        +	// (You can seed the arguments with an array of args, but this is
        +	// only used internally.)
        +	each: function( callback, args ) {
        +		return jQuery.each( this, callback, args );
        +	},
        +
        +	ready: function( fn ) {
        +		// Attach the listeners
        +		jQuery.bindReady();
        +
        +		// Add the callback
        +		readyList.add( fn );
        +
        +		return this;
        +	},
        +
        +	eq: function( i ) {
        +		i = +i;
        +		return i === -1 ?
        +			this.slice( i ) :
        +			this.slice( i, i + 1 );
        +	},
        +
        +	first: function() {
        +		return this.eq( 0 );
        +	},
        +
        +	last: function() {
        +		return this.eq( -1 );
        +	},
        +
        +	slice: function() {
        +		return this.pushStack( slice.apply( this, arguments ),
        +			"slice", slice.call(arguments).join(",") );
        +	},
        +
        +	map: function( callback ) {
        +		return this.pushStack( jQuery.map(this, function( elem, i ) {
        +			return callback.call( elem, i, elem );
        +		}));
        +	},
        +
        +	end: function() {
        +		return this.prevObject || this.constructor(null);
        +	},
        +
        +	// For internal use only.
        +	// Behaves like an Array's method, not like a jQuery method.
        +	push: push,
        +	sort: [].sort,
        +	splice: [].splice
        +};
        +
        +// Give the init function the jQuery prototype for later instantiation
        +jQuery.fn.init.prototype = jQuery.fn;
        +
        +jQuery.extend = jQuery.fn.extend = function() {
        +	var options, name, src, copy, copyIsArray, clone,
        +		target = arguments[0] || {},
        +		i = 1,
        +		length = arguments.length,
        +		deep = false;
        +
        +	// Handle a deep copy situation
        +	if ( typeof target === "boolean" ) {
        +		deep = target;
        +		target = arguments[1] || {};
        +		// skip the boolean and the target
        +		i = 2;
        +	}
        +
        +	// Handle case when target is a string or something (possible in deep copy)
        +	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
        +		target = {};
        +	}
        +
        +	// extend jQuery itself if only one argument is passed
        +	if ( length === i ) {
        +		target = this;
        +		--i;
        +	}
        +
        +	for ( ; i < length; i++ ) {
        +		// Only deal with non-null/undefined values
        +		if ( (options = arguments[ i ]) != null ) {
        +			// Extend the base object
        +			for ( name in options ) {
        +				src = target[ name ];
        +				copy = options[ name ];
        +
        +				// Prevent never-ending loop
        +				if ( target === copy ) {
        +					continue;
        +				}
        +
        +				// Recurse if we're merging plain objects or arrays
        +				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
        +					if ( copyIsArray ) {
        +						copyIsArray = false;
        +						clone = src && jQuery.isArray(src) ? src : [];
        +
        +					} else {
        +						clone = src && jQuery.isPlainObject(src) ? src : {};
        +					}
        +
        +					// Never move original objects, clone them
        +					target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +				// Don't bring in undefined values
        +				} else if ( copy !== undefined ) {
        +					target[ name ] = copy;
        +				}
        +			}
        +		}
        +	}
        +
        +	// Return the modified object
        +	return target;
        +};
        +
        +jQuery.extend({
        +	noConflict: function( deep ) {
        +		if ( window.$ === jQuery ) {
        +			window.$ = _$;
        +		}
        +
        +		if ( deep && window.jQuery === jQuery ) {
        +			window.jQuery = _jQuery;
        +		}
        +
        +		return jQuery;
        +	},
        +
        +	// Is the DOM ready to be used? Set to true once it occurs.
        +	isReady: false,
        +
        +	// A counter to track how many items to wait for before
        +	// the ready event fires. See #6781
        +	readyWait: 1,
        +
        +	// Hold (or release) the ready event
        +	holdReady: function( hold ) {
        +		if ( hold ) {
        +			jQuery.readyWait++;
        +		} else {
        +			jQuery.ready( true );
        +		}
        +	},
        +
        +	// Handle when the DOM is ready
        +	ready: function( wait ) {
        +		// Either a released hold or an DOMready/load event and not yet ready
        +		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
        +			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
        +			if ( !document.body ) {
        +				return setTimeout( jQuery.ready, 1 );
        +			}
        +
        +			// Remember that the DOM is ready
        +			jQuery.isReady = true;
        +
        +			// If a normal DOM Ready event fired, decrement, and wait if need be
        +			if ( wait !== true && --jQuery.readyWait > 0 ) {
        +				return;
        +			}
        +
        +			// If there are functions bound, to execute
        +			readyList.fireWith( document, [ jQuery ] );
        +
        +			// Trigger any bound ready events
        +			if ( jQuery.fn.trigger ) {
        +				jQuery( document ).trigger( "ready" ).off( "ready" );
        +			}
        +		}
        +	},
        +
        +	bindReady: function() {
        +		if ( readyList ) {
        +			return;
        +		}
        +
        +		readyList = jQuery.Callbacks( "once memory" );
        +
        +		// Catch cases where $(document).ready() is called after the
        +		// browser event has already occurred.
        +		if ( document.readyState === "complete" ) {
        +			// Handle it asynchronously to allow scripts the opportunity to delay ready
        +			return setTimeout( jQuery.ready, 1 );
        +		}
        +
        +		// Mozilla, Opera and webkit nightlies currently support this event
        +		if ( document.addEventListener ) {
        +			// Use the handy event callback
        +			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
        +
        +			// A fallback to window.onload, that will always work
        +			window.addEventListener( "load", jQuery.ready, false );
        +
        +		// If IE event model is used
        +		} else if ( document.attachEvent ) {
        +			// ensure firing before onload,
        +			// maybe late but safe also for iframes
        +			document.attachEvent( "onreadystatechange", DOMContentLoaded );
        +
        +			// A fallback to window.onload, that will always work
        +			window.attachEvent( "onload", jQuery.ready );
        +
        +			// If IE and not a frame
        +			// continually check to see if the document is ready
        +			var toplevel = false;
        +
        +			try {
        +				toplevel = window.frameElement == null;
        +			} catch(e) {}
        +
        +			if ( document.documentElement.doScroll && toplevel ) {
        +				doScrollCheck();
        +			}
        +		}
        +	},
        +
        +	// See test/unit/core.js for details concerning isFunction.
        +	// Since version 1.3, DOM methods and functions like alert
        +	// aren't supported. They return false on IE (#2968).
        +	isFunction: function( obj ) {
        +		return jQuery.type(obj) === "function";
        +	},
        +
        +	isArray: Array.isArray || function( obj ) {
        +		return jQuery.type(obj) === "array";
        +	},
        +
        +	isWindow: function( obj ) {
        +		return obj != null && obj == obj.window;
        +	},
        +
        +	isNumeric: function( obj ) {
        +		return !isNaN( parseFloat(obj) ) && isFinite( obj );
        +	},
        +
        +	type: function( obj ) {
        +		return obj == null ?
        +			String( obj ) :
        +			class2type[ toString.call(obj) ] || "object";
        +	},
        +
        +	isPlainObject: function( obj ) {
        +		// Must be an Object.
        +		// Because of IE, we also have to check the presence of the constructor property.
        +		// Make sure that DOM nodes and window objects don't pass through, as well
        +		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
        +			return false;
        +		}
        +
        +		try {
        +			// Not own constructor property must be Object
        +			if ( obj.constructor &&
        +				!hasOwn.call(obj, "constructor") &&
        +				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
        +				return false;
        +			}
        +		} catch ( e ) {
        +			// IE8,9 Will throw exceptions on certain host objects #9897
        +			return false;
        +		}
        +
        +		// Own properties are enumerated firstly, so to speed up,
        +		// if last one is own, then all properties are own.
        +
        +		var key;
        +		for ( key in obj ) {}
        +
        +		return key === undefined || hasOwn.call( obj, key );
        +	},
        +
        +	isEmptyObject: function( obj ) {
        +		for ( var name in obj ) {
        +			return false;
        +		}
        +		return true;
        +	},
        +
        +	error: function( msg ) {
        +		throw new Error( msg );
        +	},
        +
        +	parseJSON: function( data ) {
        +		if ( typeof data !== "string" || !data ) {
        +			return null;
        +		}
        +
        +		// Make sure leading/trailing whitespace is removed (IE can't handle it)
        +		data = jQuery.trim( data );
        +
        +		// Attempt to parse using the native JSON parser first
        +		if ( window.JSON && window.JSON.parse ) {
        +			return window.JSON.parse( data );
        +		}
        +
        +		// Make sure the incoming data is actual JSON
        +		// Logic borrowed from http://json.org/json2.js
        +		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        +			.replace( rvalidtokens, "]" )
        +			.replace( rvalidbraces, "")) ) {
        +
        +			return ( new Function( "return " + data ) )();
        +
        +		}
        +		jQuery.error( "Invalid JSON: " + data );
        +	},
        +
        +	// Cross-browser xml parsing
        +	parseXML: function( data ) {
        +		if ( typeof data !== "string" || !data ) {
        +			return null;
        +		}
        +		var xml, tmp;
        +		try {
        +			if ( window.DOMParser ) { // Standard
        +				tmp = new DOMParser();
        +				xml = tmp.parseFromString( data , "text/xml" );
        +			} else { // IE
        +				xml = new ActiveXObject( "Microsoft.XMLDOM" );
        +				xml.async = "false";
        +				xml.loadXML( data );
        +			}
        +		} catch( e ) {
        +			xml = undefined;
        +		}
        +		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
        +			jQuery.error( "Invalid XML: " + data );
        +		}
        +		return xml;
        +	},
        +
        +	noop: function() {},
        +
        +	// Evaluates a script in a global context
        +	// Workarounds based on findings by Jim Driscoll
        +	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
        +	globalEval: function( data ) {
        +		if ( data && rnotwhite.test( data ) ) {
        +			// We use execScript on Internet Explorer
        +			// We use an anonymous function so that context is window
        +			// rather than jQuery in Firefox
        +			( window.execScript || function( data ) {
        +				window[ "eval" ].call( window, data );
        +			} )( data );
        +		}
        +	},
        +
        +	// Convert dashed to camelCase; used by the css and data modules
        +	// Microsoft forgot to hump their vendor prefix (#9572)
        +	camelCase: function( string ) {
        +		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +	},
        +
        +	nodeName: function( elem, name ) {
        +		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
        +	},
        +
        +	// args is for internal usage only
        +	each: function( object, callback, args ) {
        +		var name, i = 0,
        +			length = object.length,
        +			isObj = length === undefined || jQuery.isFunction( object );
        +
        +		if ( args ) {
        +			if ( isObj ) {
        +				for ( name in object ) {
        +					if ( callback.apply( object[ name ], args ) === false ) {
        +						break;
        +					}
        +				}
        +			} else {
        +				for ( ; i < length; ) {
        +					if ( callback.apply( object[ i++ ], args ) === false ) {
        +						break;
        +					}
        +				}
        +			}
        +
        +		// A special, fast, case for the most common use of each
        +		} else {
        +			if ( isObj ) {
        +				for ( name in object ) {
        +					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
        +						break;
        +					}
        +				}
        +			} else {
        +				for ( ; i < length; ) {
        +					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
        +						break;
        +					}
        +				}
        +			}
        +		}
        +
        +		return object;
        +	},
        +
        +	// Use native String.trim function wherever possible
        +	trim: trim ?
        +		function( text ) {
        +			return text == null ?
        +				"" :
        +				trim.call( text );
        +		} :
        +
        +		// Otherwise use our own trimming functionality
        +		function( text ) {
        +			return text == null ?
        +				"" :
        +				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
        +		},
        +
        +	// results is for internal usage only
        +	makeArray: function( array, results ) {
        +		var ret = results || [];
        +
        +		if ( array != null ) {
        +			// The window, strings (and functions) also have 'length'
        +			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
        +			var type = jQuery.type( array );
        +
        +			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
        +				push.call( ret, array );
        +			} else {
        +				jQuery.merge( ret, array );
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	inArray: function( elem, array, i ) {
        +		var len;
        +
        +		if ( array ) {
        +			if ( indexOf ) {
        +				return indexOf.call( array, elem, i );
        +			}
        +
        +			len = array.length;
        +			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
        +
        +			for ( ; i < len; i++ ) {
        +				// Skip accessing in sparse arrays
        +				if ( i in array && array[ i ] === elem ) {
        +					return i;
        +				}
        +			}
        +		}
        +
        +		return -1;
        +	},
        +
        +	merge: function( first, second ) {
        +		var i = first.length,
        +			j = 0;
        +
        +		if ( typeof second.length === "number" ) {
        +			for ( var l = second.length; j < l; j++ ) {
        +				first[ i++ ] = second[ j ];
        +			}
        +
        +		} else {
        +			while ( second[j] !== undefined ) {
        +				first[ i++ ] = second[ j++ ];
        +			}
        +		}
        +
        +		first.length = i;
        +
        +		return first;
        +	},
        +
        +	grep: function( elems, callback, inv ) {
        +		var ret = [], retVal;
        +		inv = !!inv;
        +
        +		// Go through the array, only saving the items
        +		// that pass the validator function
        +		for ( var i = 0, length = elems.length; i < length; i++ ) {
        +			retVal = !!callback( elems[ i ], i );
        +			if ( inv !== retVal ) {
        +				ret.push( elems[ i ] );
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	// arg is for internal usage only
        +	map: function( elems, callback, arg ) {
        +		var value, key, ret = [],
        +			i = 0,
        +			length = elems.length,
        +			// jquery objects are treated as arrays
        +			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
        +
        +		// Go through the array, translating each of the items to their
        +		if ( isArray ) {
        +			for ( ; i < length; i++ ) {
        +				value = callback( elems[ i ], i, arg );
        +
        +				if ( value != null ) {
        +					ret[ ret.length ] = value;
        +				}
        +			}
        +
        +		// Go through every key on the object,
        +		} else {
        +			for ( key in elems ) {
        +				value = callback( elems[ key ], key, arg );
        +
        +				if ( value != null ) {
        +					ret[ ret.length ] = value;
        +				}
        +			}
        +		}
        +
        +		// Flatten any nested arrays
        +		return ret.concat.apply( [], ret );
        +	},
        +
        +	// A global GUID counter for objects
        +	guid: 1,
        +
        +	// Bind a function to a context, optionally partially applying any
        +	// arguments.
        +	proxy: function( fn, context ) {
        +		if ( typeof context === "string" ) {
        +			var tmp = fn[ context ];
        +			context = fn;
        +			fn = tmp;
        +		}
        +
        +		// Quick check to determine if target is callable, in the spec
        +		// this throws a TypeError, but we will just return undefined.
        +		if ( !jQuery.isFunction( fn ) ) {
        +			return undefined;
        +		}
        +
        +		// Simulated bind
        +		var args = slice.call( arguments, 2 ),
        +			proxy = function() {
        +				return fn.apply( context, args.concat( slice.call( arguments ) ) );
        +			};
        +
        +		// Set the guid of unique handler to the same of original handler, so it can be removed
        +		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
        +
        +		return proxy;
        +	},
        +
        +	// Mutifunctional method to get and set values to a collection
        +	// The value/s can optionally be executed if it's a function
        +	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
        +		var exec,
        +			bulk = key == null,
        +			i = 0,
        +			length = elems.length;
        +
        +		// Sets many values
        +		if ( key && typeof key === "object" ) {
        +			for ( i in key ) {
        +				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
        +			}
        +			chainable = 1;
        +
        +		// Sets one value
        +		} else if ( value !== undefined ) {
        +			// Optionally, function values get executed if exec is true
        +			exec = pass === undefined && jQuery.isFunction( value );
        +
        +			if ( bulk ) {
        +				// Bulk operations only iterate when executing function values
        +				if ( exec ) {
        +					exec = fn;
        +					fn = function( elem, key, value ) {
        +						return exec.call( jQuery( elem ), value );
        +					};
        +
        +				// Otherwise they run against the entire set
        +				} else {
        +					fn.call( elems, value );
        +					fn = null;
        +				}
        +			}
        +
        +			if ( fn ) {
        +				for (; i < length; i++ ) {
        +					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
        +				}
        +			}
        +
        +			chainable = 1;
        +		}
        +
        +		return chainable ?
        +			elems :
        +
        +			// Gets
        +			bulk ?
        +				fn.call( elems ) :
        +				length ? fn( elems[0], key ) : emptyGet;
        +	},
        +
        +	now: function() {
        +		return ( new Date() ).getTime();
        +	},
        +
        +	// Use of jQuery.browser is frowned upon.
        +	// More details: http://docs.jquery.com/Utilities/jQuery.browser
        +	uaMatch: function( ua ) {
        +		ua = ua.toLowerCase();
        +
        +		var match = rwebkit.exec( ua ) ||
        +			ropera.exec( ua ) ||
        +			rmsie.exec( ua ) ||
        +			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
        +			[];
        +
        +		return { browser: match[1] || "", version: match[2] || "0" };
        +	},
        +
        +	sub: function() {
        +		function jQuerySub( selector, context ) {
        +			return new jQuerySub.fn.init( selector, context );
        +		}
        +		jQuery.extend( true, jQuerySub, this );
        +		jQuerySub.superclass = this;
        +		jQuerySub.fn = jQuerySub.prototype = this();
        +		jQuerySub.fn.constructor = jQuerySub;
        +		jQuerySub.sub = this.sub;
        +		jQuerySub.fn.init = function init( selector, context ) {
        +			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
        +				context = jQuerySub( context );
        +			}
        +
        +			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
        +		};
        +		jQuerySub.fn.init.prototype = jQuerySub.fn;
        +		var rootjQuerySub = jQuerySub(document);
        +		return jQuerySub;
        +	},
        +
        +	browser: {}
        +});
        +
        +// Populate the class2type map
        +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
        +	class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +});
        +
        +browserMatch = jQuery.uaMatch( userAgent );
        +if ( browserMatch.browser ) {
        +	jQuery.browser[ browserMatch.browser ] = true;
        +	jQuery.browser.version = browserMatch.version;
        +}
        +
        +// Deprecated, use jQuery.browser.webkit instead
        +if ( jQuery.browser.webkit ) {
        +	jQuery.browser.safari = true;
        +}
        +
        +// IE doesn't match non-breaking spaces with \s
        +if ( rnotwhite.test( "\xA0" ) ) {
        +	trimLeft = /^[\s\xA0]+/;
        +	trimRight = /[\s\xA0]+$/;
        +}
        +
        +// All jQuery objects should point back to these
        +rootjQuery = jQuery(document);
        +
        +// Cleanup functions for the document ready method
        +if ( document.addEventListener ) {
        +	DOMContentLoaded = function() {
        +		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
        +		jQuery.ready();
        +	};
        +
        +} else if ( document.attachEvent ) {
        +	DOMContentLoaded = function() {
        +		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
        +		if ( document.readyState === "complete" ) {
        +			document.detachEvent( "onreadystatechange", DOMContentLoaded );
        +			jQuery.ready();
        +		}
        +	};
        +}
        +
        +// The DOM ready check for Internet Explorer
        +function doScrollCheck() {
        +	if ( jQuery.isReady ) {
        +		return;
        +	}
        +
        +	try {
        +		// If IE is used, use the trick by Diego Perini
        +		// http://javascript.nwbox.com/IEContentLoaded/
        +		document.documentElement.doScroll("left");
        +	} catch(e) {
        +		setTimeout( doScrollCheck, 1 );
        +		return;
        +	}
        +
        +	// and execute any waiting functions
        +	jQuery.ready();
        +}
        +
        +return jQuery;
        +
        +})();
        +
        +
        +// String to Object flags format cache
        +var flagsCache = {};
        +
        +// Convert String-formatted flags into Object-formatted ones and store in cache
        +function createFlags( flags ) {
        +	var object = flagsCache[ flags ] = {},
        +		i, length;
        +	flags = flags.split( /\s+/ );
        +	for ( i = 0, length = flags.length; i < length; i++ ) {
        +		object[ flags[i] ] = true;
        +	}
        +	return object;
        +}
        +
        +/*
        + * Create a callback list using the following parameters:
        + *
        + *	flags:	an optional list of space-separated flags that will change how
        + *			the callback list behaves
        + *
        + * By default a callback list will act like an event callback list and can be
        + * "fired" multiple times.
        + *
        + * Possible flags:
        + *
        + *	once:			will ensure the callback list can only be fired once (like a Deferred)
        + *
        + *	memory:			will keep track of previous values and will call any callback added
        + *					after the list has been fired right away with the latest "memorized"
        + *					values (like a Deferred)
        + *
        + *	unique:			will ensure a callback can only be added once (no duplicate in the list)
        + *
        + *	stopOnFalse:	interrupt callings when a callback returns false
        + *
        + */
        +jQuery.Callbacks = function( flags ) {
        +
        +	// Convert flags from String-formatted to Object-formatted
        +	// (we check in cache first)
        +	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
        +
        +	var // Actual callback list
        +		list = [],
        +		// Stack of fire calls for repeatable lists
        +		stack = [],
        +		// Last fire value (for non-forgettable lists)
        +		memory,
        +		// Flag to know if list was already fired
        +		fired,
        +		// Flag to know if list is currently firing
        +		firing,
        +		// First callback to fire (used internally by add and fireWith)
        +		firingStart,
        +		// End of the loop when firing
        +		firingLength,
        +		// Index of currently firing callback (modified by remove if needed)
        +		firingIndex,
        +		// Add one or several callbacks to the list
        +		add = function( args ) {
        +			var i,
        +				length,
        +				elem,
        +				type,
        +				actual;
        +			for ( i = 0, length = args.length; i < length; i++ ) {
        +				elem = args[ i ];
        +				type = jQuery.type( elem );
        +				if ( type === "array" ) {
        +					// Inspect recursively
        +					add( elem );
        +				} else if ( type === "function" ) {
        +					// Add if not in unique mode and callback is not in
        +					if ( !flags.unique || !self.has( elem ) ) {
        +						list.push( elem );
        +					}
        +				}
        +			}
        +		},
        +		// Fire callbacks
        +		fire = function( context, args ) {
        +			args = args || [];
        +			memory = !flags.memory || [ context, args ];
        +			fired = true;
        +			firing = true;
        +			firingIndex = firingStart || 0;
        +			firingStart = 0;
        +			firingLength = list.length;
        +			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
        +				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
        +					memory = true; // Mark as halted
        +					break;
        +				}
        +			}
        +			firing = false;
        +			if ( list ) {
        +				if ( !flags.once ) {
        +					if ( stack && stack.length ) {
        +						memory = stack.shift();
        +						self.fireWith( memory[ 0 ], memory[ 1 ] );
        +					}
        +				} else if ( memory === true ) {
        +					self.disable();
        +				} else {
        +					list = [];
        +				}
        +			}
        +		},
        +		// Actual Callbacks object
        +		self = {
        +			// Add a callback or a collection of callbacks to the list
        +			add: function() {
        +				if ( list ) {
        +					var length = list.length;
        +					add( arguments );
        +					// Do we need to add the callbacks to the
        +					// current firing batch?
        +					if ( firing ) {
        +						firingLength = list.length;
        +					// With memory, if we're not firing then
        +					// we should call right away, unless previous
        +					// firing was halted (stopOnFalse)
        +					} else if ( memory && memory !== true ) {
        +						firingStart = length;
        +						fire( memory[ 0 ], memory[ 1 ] );
        +					}
        +				}
        +				return this;
        +			},
        +			// Remove a callback from the list
        +			remove: function() {
        +				if ( list ) {
        +					var args = arguments,
        +						argIndex = 0,
        +						argLength = args.length;
        +					for ( ; argIndex < argLength ; argIndex++ ) {
        +						for ( var i = 0; i < list.length; i++ ) {
        +							if ( args[ argIndex ] === list[ i ] ) {
        +								// Handle firingIndex and firingLength
        +								if ( firing ) {
        +									if ( i <= firingLength ) {
        +										firingLength--;
        +										if ( i <= firingIndex ) {
        +											firingIndex--;
        +										}
        +									}
        +								}
        +								// Remove the element
        +								list.splice( i--, 1 );
        +								// If we have some unicity property then
        +								// we only need to do this once
        +								if ( flags.unique ) {
        +									break;
        +								}
        +							}
        +						}
        +					}
        +				}
        +				return this;
        +			},
        +			// Control if a given callback is in the list
        +			has: function( fn ) {
        +				if ( list ) {
        +					var i = 0,
        +						length = list.length;
        +					for ( ; i < length; i++ ) {
        +						if ( fn === list[ i ] ) {
        +							return true;
        +						}
        +					}
        +				}
        +				return false;
        +			},
        +			// Remove all callbacks from the list
        +			empty: function() {
        +				list = [];
        +				return this;
        +			},
        +			// Have the list do nothing anymore
        +			disable: function() {
        +				list = stack = memory = undefined;
        +				return this;
        +			},
        +			// Is it disabled?
        +			disabled: function() {
        +				return !list;
        +			},
        +			// Lock the list in its current state
        +			lock: function() {
        +				stack = undefined;
        +				if ( !memory || memory === true ) {
        +					self.disable();
        +				}
        +				return this;
        +			},
        +			// Is it locked?
        +			locked: function() {
        +				return !stack;
        +			},
        +			// Call all callbacks with the given context and arguments
        +			fireWith: function( context, args ) {
        +				if ( stack ) {
        +					if ( firing ) {
        +						if ( !flags.once ) {
        +							stack.push( [ context, args ] );
        +						}
        +					} else if ( !( flags.once && memory ) ) {
        +						fire( context, args );
        +					}
        +				}
        +				return this;
        +			},
        +			// Call all the callbacks with the given arguments
        +			fire: function() {
        +				self.fireWith( this, arguments );
        +				return this;
        +			},
        +			// To know if the callbacks have already been called at least once
        +			fired: function() {
        +				return !!fired;
        +			}
        +		};
        +
        +	return self;
        +};
        +
        +
        +
        +
        +var // Static reference to slice
        +	sliceDeferred = [].slice;
        +
        +jQuery.extend({
        +
        +	Deferred: function( func ) {
        +		var doneList = jQuery.Callbacks( "once memory" ),
        +			failList = jQuery.Callbacks( "once memory" ),
        +			progressList = jQuery.Callbacks( "memory" ),
        +			state = "pending",
        +			lists = {
        +				resolve: doneList,
        +				reject: failList,
        +				notify: progressList
        +			},
        +			promise = {
        +				done: doneList.add,
        +				fail: failList.add,
        +				progress: progressList.add,
        +
        +				state: function() {
        +					return state;
        +				},
        +
        +				// Deprecated
        +				isResolved: doneList.fired,
        +				isRejected: failList.fired,
        +
        +				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
        +					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
        +					return this;
        +				},
        +				always: function() {
        +					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
        +					return this;
        +				},
        +				pipe: function( fnDone, fnFail, fnProgress ) {
        +					return jQuery.Deferred(function( newDefer ) {
        +						jQuery.each( {
        +							done: [ fnDone, "resolve" ],
        +							fail: [ fnFail, "reject" ],
        +							progress: [ fnProgress, "notify" ]
        +						}, function( handler, data ) {
        +							var fn = data[ 0 ],
        +								action = data[ 1 ],
        +								returned;
        +							if ( jQuery.isFunction( fn ) ) {
        +								deferred[ handler ](function() {
        +									returned = fn.apply( this, arguments );
        +									if ( returned && jQuery.isFunction( returned.promise ) ) {
        +										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
        +									} else {
        +										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
        +									}
        +								});
        +							} else {
        +								deferred[ handler ]( newDefer[ action ] );
        +							}
        +						});
        +					}).promise();
        +				},
        +				// Get a promise for this deferred
        +				// If obj is provided, the promise aspect is added to the object
        +				promise: function( obj ) {
        +					if ( obj == null ) {
        +						obj = promise;
        +					} else {
        +						for ( var key in promise ) {
        +							obj[ key ] = promise[ key ];
        +						}
        +					}
        +					return obj;
        +				}
        +			},
        +			deferred = promise.promise({}),
        +			key;
        +
        +		for ( key in lists ) {
        +			deferred[ key ] = lists[ key ].fire;
        +			deferred[ key + "With" ] = lists[ key ].fireWith;
        +		}
        +
        +		// Handle state
        +		deferred.done( function() {
        +			state = "resolved";
        +		}, failList.disable, progressList.lock ).fail( function() {
        +			state = "rejected";
        +		}, doneList.disable, progressList.lock );
        +
        +		// Call given func if any
        +		if ( func ) {
        +			func.call( deferred, deferred );
        +		}
        +
        +		// All done!
        +		return deferred;
        +	},
        +
        +	// Deferred helper
        +	when: function( firstParam ) {
        +		var args = sliceDeferred.call( arguments, 0 ),
        +			i = 0,
        +			length = args.length,
        +			pValues = new Array( length ),
        +			count = length,
        +			pCount = length,
        +			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
        +				firstParam :
        +				jQuery.Deferred(),
        +			promise = deferred.promise();
        +		function resolveFunc( i ) {
        +			return function( value ) {
        +				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
        +				if ( !( --count ) ) {
        +					deferred.resolveWith( deferred, args );
        +				}
        +			};
        +		}
        +		function progressFunc( i ) {
        +			return function( value ) {
        +				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
        +				deferred.notifyWith( promise, pValues );
        +			};
        +		}
        +		if ( length > 1 ) {
        +			for ( ; i < length; i++ ) {
        +				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
        +					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
        +				} else {
        +					--count;
        +				}
        +			}
        +			if ( !count ) {
        +				deferred.resolveWith( deferred, args );
        +			}
        +		} else if ( deferred !== firstParam ) {
        +			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
        +		}
        +		return promise;
        +	}
        +});
        +
        +
        +
        +
        +jQuery.support = (function() {
        +
        +	var support,
        +		all,
        +		a,
        +		select,
        +		opt,
        +		input,
        +		fragment,
        +		tds,
        +		events,
        +		eventName,
        +		i,
        +		isSupported,
        +		div = document.createElement( "div" ),
        +		documentElement = document.documentElement;
        +
        +	// Preliminary tests
        +	div.setAttribute("className", "t");
        +	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
        +
        +	all = div.getElementsByTagName( "*" );
        +	a = div.getElementsByTagName( "a" )[ 0 ];
        +
        +	// Can't get basic test support
        +	if ( !all || !all.length || !a ) {
        +		return {};
        +	}
        +
        +	// First batch of supports tests
        +	select = document.createElement( "select" );
        +	opt = select.appendChild( document.createElement("option") );
        +	input = div.getElementsByTagName( "input" )[ 0 ];
        +
        +	support = {
        +		// IE strips leading whitespace when .innerHTML is used
        +		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
        +
        +		// Make sure that tbody elements aren't automatically inserted
        +		// IE will insert them into empty tables
        +		tbody: !div.getElementsByTagName("tbody").length,
        +
        +		// Make sure that link elements get serialized correctly by innerHTML
        +		// This requires a wrapper element in IE
        +		htmlSerialize: !!div.getElementsByTagName("link").length,
        +
        +		// Get the style information from getAttribute
        +		// (IE uses .cssText instead)
        +		style: /top/.test( a.getAttribute("style") ),
        +
        +		// Make sure that URLs aren't manipulated
        +		// (IE normalizes it by default)
        +		hrefNormalized: ( a.getAttribute("href") === "/a" ),
        +
        +		// Make sure that element opacity exists
        +		// (IE uses filter instead)
        +		// Use a regex to work around a WebKit issue. See #5145
        +		opacity: /^0.55/.test( a.style.opacity ),
        +
        +		// Verify style float existence
        +		// (IE uses styleFloat instead of cssFloat)
        +		cssFloat: !!a.style.cssFloat,
        +
        +		// Make sure that if no value is specified for a checkbox
        +		// that it defaults to "on".
        +		// (WebKit defaults to "" instead)
        +		checkOn: ( input.value === "on" ),
        +
        +		// Make sure that a selected-by-default option has a working selected property.
        +		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
        +		optSelected: opt.selected,
        +
        +		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
        +		getSetAttribute: div.className !== "t",
        +
        +		// Tests for enctype support on a form(#6743)
        +		enctype: !!document.createElement("form").enctype,
        +
        +		// Makes sure cloning an html5 element does not cause problems
        +		// Where outerHTML is undefined, this still works
        +		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
        +
        +		// Will be defined later
        +		submitBubbles: true,
        +		changeBubbles: true,
        +		focusinBubbles: false,
        +		deleteExpando: true,
        +		noCloneEvent: true,
        +		inlineBlockNeedsLayout: false,
        +		shrinkWrapBlocks: false,
        +		reliableMarginRight: true,
        +		pixelMargin: true
        +	};
        +
        +	// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
        +	jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
        +
        +	// Make sure checked status is properly cloned
        +	input.checked = true;
        +	support.noCloneChecked = input.cloneNode( true ).checked;
        +
        +	// Make sure that the options inside disabled selects aren't marked as disabled
        +	// (WebKit marks them as disabled)
        +	select.disabled = true;
        +	support.optDisabled = !opt.disabled;
        +
        +	// Test to see if it's possible to delete an expando from an element
        +	// Fails in Internet Explorer
        +	try {
        +		delete div.test;
        +	} catch( e ) {
        +		support.deleteExpando = false;
        +	}
        +
        +	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
        +		div.attachEvent( "onclick", function() {
        +			// Cloning a node shouldn't copy over any
        +			// bound event handlers (IE does this)
        +			support.noCloneEvent = false;
        +		});
        +		div.cloneNode( true ).fireEvent( "onclick" );
        +	}
        +
        +	// Check if a radio maintains its value
        +	// after being appended to the DOM
        +	input = document.createElement("input");
        +	input.value = "t";
        +	input.setAttribute("type", "radio");
        +	support.radioValue = input.value === "t";
        +
        +	input.setAttribute("checked", "checked");
        +
        +	// #11217 - WebKit loses check when the name is after the checked attribute
        +	input.setAttribute( "name", "t" );
        +
        +	div.appendChild( input );
        +	fragment = document.createDocumentFragment();
        +	fragment.appendChild( div.lastChild );
        +
        +	// WebKit doesn't clone checked state correctly in fragments
        +	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
        +
        +	// Check if a disconnected checkbox will retain its checked
        +	// value of true after appended to the DOM (IE6/7)
        +	support.appendChecked = input.checked;
        +
        +	fragment.removeChild( input );
        +	fragment.appendChild( div );
        +
        +	// Technique from Juriy Zaytsev
        +	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
        +	// We only care about the case where non-standard event systems
        +	// are used, namely in IE. Short-circuiting here helps us to
        +	// avoid an eval call (in setAttribute) which can cause CSP
        +	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
        +	if ( div.attachEvent ) {
        +		for ( i in {
        +			submit: 1,
        +			change: 1,
        +			focusin: 1
        +		}) {
        +			eventName = "on" + i;
        +			isSupported = ( eventName in div );
        +			if ( !isSupported ) {
        +				div.setAttribute( eventName, "return;" );
        +				isSupported = ( typeof div[ eventName ] === "function" );
        +			}
        +			support[ i + "Bubbles" ] = isSupported;
        +		}
        +	}
        +
        +	fragment.removeChild( div );
        +
        +	// Null elements to avoid leaks in IE
        +	fragment = select = opt = div = input = null;
        +
        +	// Run tests that need a body at doc ready
        +	jQuery(function() {
        +		var container, outer, inner, table, td, offsetSupport,
        +			marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
        +			paddingMarginBorderVisibility, paddingMarginBorder,
        +			body = document.getElementsByTagName("body")[0];
        +
        +		if ( !body ) {
        +			// Return for frameset docs that don't have a body
        +			return;
        +		}
        +
        +		conMarginTop = 1;
        +		paddingMarginBorder = "padding:0;margin:0;border:";
        +		positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
        +		paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
        +		style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
        +		html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
        +			"<table " + style + "' cellpadding='0' cellspacing='0'>" +
        +			"<tr><td></td></tr></table>";
        +
        +		container = document.createElement("div");
        +		container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
        +		body.insertBefore( container, body.firstChild );
        +
        +		// Construct the test element
        +		div = document.createElement("div");
        +		container.appendChild( div );
        +
        +		// Check if table cells still have offsetWidth/Height when they are set
        +		// to display:none and there are still other visible table cells in a
        +		// table row; if so, offsetWidth/Height are not reliable for use when
        +		// determining if an element has been hidden directly using
        +		// display:none (it is still safe to use offsets if a parent element is
        +		// hidden; don safety goggles and see bug #4512 for more information).
        +		// (only IE 8 fails this test)
        +		div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
        +		tds = div.getElementsByTagName( "td" );
        +		isSupported = ( tds[ 0 ].offsetHeight === 0 );
        +
        +		tds[ 0 ].style.display = "";
        +		tds[ 1 ].style.display = "none";
        +
        +		// Check if empty table cells still have offsetWidth/Height
        +		// (IE <= 8 fail this test)
        +		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
        +
        +		// Check if div with explicit width and no margin-right incorrectly
        +		// gets computed margin-right based on width of container. For more
        +		// info see bug #3333
        +		// Fails in WebKit before Feb 2011 nightlies
        +		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +		if ( window.getComputedStyle ) {
        +			div.innerHTML = "";
        +			marginDiv = document.createElement( "div" );
        +			marginDiv.style.width = "0";
        +			marginDiv.style.marginRight = "0";
        +			div.style.width = "2px";
        +			div.appendChild( marginDiv );
        +			support.reliableMarginRight =
        +				( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
        +		}
        +
        +		if ( typeof div.style.zoom !== "undefined" ) {
        +			// Check if natively block-level elements act like inline-block
        +			// elements when setting their display to 'inline' and giving
        +			// them layout
        +			// (IE < 8 does this)
        +			div.innerHTML = "";
        +			div.style.width = div.style.padding = "1px";
        +			div.style.border = 0;
        +			div.style.overflow = "hidden";
        +			div.style.display = "inline";
        +			div.style.zoom = 1;
        +			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
        +
        +			// Check if elements with layout shrink-wrap their children
        +			// (IE 6 does this)
        +			div.style.display = "block";
        +			div.style.overflow = "visible";
        +			div.innerHTML = "<div style='width:5px;'></div>";
        +			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
        +		}
        +
        +		div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
        +		div.innerHTML = html;
        +
        +		outer = div.firstChild;
        +		inner = outer.firstChild;
        +		td = outer.nextSibling.firstChild.firstChild;
        +
        +		offsetSupport = {
        +			doesNotAddBorder: ( inner.offsetTop !== 5 ),
        +			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
        +		};
        +
        +		inner.style.position = "fixed";
        +		inner.style.top = "20px";
        +
        +		// safari subtracts parent border width here which is 5px
        +		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
        +		inner.style.position = inner.style.top = "";
        +
        +		outer.style.overflow = "hidden";
        +		outer.style.position = "relative";
        +
        +		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
        +		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
        +
        +		if ( window.getComputedStyle ) {
        +			div.style.marginTop = "1%";
        +			support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
        +		}
        +
        +		if ( typeof container.style.zoom !== "undefined" ) {
        +			container.style.zoom = 1;
        +		}
        +
        +		body.removeChild( container );
        +		marginDiv = div = container = null;
        +
        +		jQuery.extend( support, offsetSupport );
        +	});
        +
        +	return support;
        +})();
        +
        +
        +
        +
        +var rbrace = /^(?:\{.*\}|\[.*\])$/,
        +	rmultiDash = /([A-Z])/g;
        +
        +jQuery.extend({
        +	cache: {},
        +
        +	// Please use with caution
        +	uuid: 0,
        +
        +	// Unique for each copy of jQuery on the page
        +	// Non-digits removed to match rinlinejQuery
        +	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
        +
        +	// The following elements throw uncatchable exceptions if you
        +	// attempt to add expando properties to them.
        +	noData: {
        +		"embed": true,
        +		// Ban all objects except for Flash (which handle expandos)
        +		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
        +		"applet": true
        +	},
        +
        +	hasData: function( elem ) {
        +		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
        +		return !!elem && !isEmptyDataObject( elem );
        +	},
        +
        +	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
        +		if ( !jQuery.acceptData( elem ) ) {
        +			return;
        +		}
        +
        +		var privateCache, thisCache, ret,
        +			internalKey = jQuery.expando,
        +			getByName = typeof name === "string",
        +
        +			// We have to handle DOM nodes and JS objects differently because IE6-7
        +			// can't GC object references properly across the DOM-JS boundary
        +			isNode = elem.nodeType,
        +
        +			// Only DOM nodes need the global jQuery cache; JS object data is
        +			// attached directly to the object so GC can occur automatically
        +			cache = isNode ? jQuery.cache : elem,
        +
        +			// Only defining an ID for JS objects if its cache already exists allows
        +			// the code to shortcut on the same path as a DOM node with no cache
        +			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
        +			isEvents = name === "events";
        +
        +		// Avoid doing any more work than we need to when trying to get data on an
        +		// object that has no data at all
        +		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
        +			return;
        +		}
        +
        +		if ( !id ) {
        +			// Only DOM nodes need a new unique ID for each element since their data
        +			// ends up in the global cache
        +			if ( isNode ) {
        +				elem[ internalKey ] = id = ++jQuery.uuid;
        +			} else {
        +				id = internalKey;
        +			}
        +		}
        +
        +		if ( !cache[ id ] ) {
        +			cache[ id ] = {};
        +
        +			// Avoids exposing jQuery metadata on plain JS objects when the object
        +			// is serialized using JSON.stringify
        +			if ( !isNode ) {
        +				cache[ id ].toJSON = jQuery.noop;
        +			}
        +		}
        +
        +		// An object can be passed to jQuery.data instead of a key/value pair; this gets
        +		// shallow copied over onto the existing cache
        +		if ( typeof name === "object" || typeof name === "function" ) {
        +			if ( pvt ) {
        +				cache[ id ] = jQuery.extend( cache[ id ], name );
        +			} else {
        +				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
        +			}
        +		}
        +
        +		privateCache = thisCache = cache[ id ];
        +
        +		// jQuery data() is stored in a separate object inside the object's internal data
        +		// cache in order to avoid key collisions between internal data and user-defined
        +		// data.
        +		if ( !pvt ) {
        +			if ( !thisCache.data ) {
        +				thisCache.data = {};
        +			}
        +
        +			thisCache = thisCache.data;
        +		}
        +
        +		if ( data !== undefined ) {
        +			thisCache[ jQuery.camelCase( name ) ] = data;
        +		}
        +
        +		// Users should not attempt to inspect the internal events object using jQuery.data,
        +		// it is undocumented and subject to change. But does anyone listen? No.
        +		if ( isEvents && !thisCache[ name ] ) {
        +			return privateCache.events;
        +		}
        +
        +		// Check for both converted-to-camel and non-converted data property names
        +		// If a data property was specified
        +		if ( getByName ) {
        +
        +			// First Try to find as-is property data
        +			ret = thisCache[ name ];
        +
        +			// Test for null|undefined property data
        +			if ( ret == null ) {
        +
        +				// Try to find the camelCased property
        +				ret = thisCache[ jQuery.camelCase( name ) ];
        +			}
        +		} else {
        +			ret = thisCache;
        +		}
        +
        +		return ret;
        +	},
        +
        +	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
        +		if ( !jQuery.acceptData( elem ) ) {
        +			return;
        +		}
        +
        +		var thisCache, i, l,
        +
        +			// Reference to internal data cache key
        +			internalKey = jQuery.expando,
        +
        +			isNode = elem.nodeType,
        +
        +			// See jQuery.data for more information
        +			cache = isNode ? jQuery.cache : elem,
        +
        +			// See jQuery.data for more information
        +			id = isNode ? elem[ internalKey ] : internalKey;
        +
        +		// If there is already no cache entry for this object, there is no
        +		// purpose in continuing
        +		if ( !cache[ id ] ) {
        +			return;
        +		}
        +
        +		if ( name ) {
        +
        +			thisCache = pvt ? cache[ id ] : cache[ id ].data;
        +
        +			if ( thisCache ) {
        +
        +				// Support array or space separated string names for data keys
        +				if ( !jQuery.isArray( name ) ) {
        +
        +					// try the string as a key before any manipulation
        +					if ( name in thisCache ) {
        +						name = [ name ];
        +					} else {
        +
        +						// split the camel cased version by spaces unless a key with the spaces exists
        +						name = jQuery.camelCase( name );
        +						if ( name in thisCache ) {
        +							name = [ name ];
        +						} else {
        +							name = name.split( " " );
        +						}
        +					}
        +				}
        +
        +				for ( i = 0, l = name.length; i < l; i++ ) {
        +					delete thisCache[ name[i] ];
        +				}
        +
        +				// If there is no data left in the cache, we want to continue
        +				// and let the cache object itself get destroyed
        +				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
        +					return;
        +				}
        +			}
        +		}
        +
        +		// See jQuery.data for more information
        +		if ( !pvt ) {
        +			delete cache[ id ].data;
        +
        +			// Don't destroy the parent cache unless the internal data object
        +			// had been the only thing left in it
        +			if ( !isEmptyDataObject(cache[ id ]) ) {
        +				return;
        +			}
        +		}
        +
        +		// Browsers that fail expando deletion also refuse to delete expandos on
        +		// the window, but it will allow it on all other JS objects; other browsers
        +		// don't care
        +		// Ensure that `cache` is not a window object #10080
        +		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
        +			delete cache[ id ];
        +		} else {
        +			cache[ id ] = null;
        +		}
        +
        +		// We destroyed the cache and need to eliminate the expando on the node to avoid
        +		// false lookups in the cache for entries that no longer exist
        +		if ( isNode ) {
        +			// IE does not allow us to delete expando properties from nodes,
        +			// nor does it have a removeAttribute function on Document nodes;
        +			// we must handle all of these cases
        +			if ( jQuery.support.deleteExpando ) {
        +				delete elem[ internalKey ];
        +			} else if ( elem.removeAttribute ) {
        +				elem.removeAttribute( internalKey );
        +			} else {
        +				elem[ internalKey ] = null;
        +			}
        +		}
        +	},
        +
        +	// For internal use only.
        +	_data: function( elem, name, data ) {
        +		return jQuery.data( elem, name, data, true );
        +	},
        +
        +	// A method for determining if a DOM node can handle the data expando
        +	acceptData: function( elem ) {
        +		if ( elem.nodeName ) {
        +			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
        +
        +			if ( match ) {
        +				return !(match === true || elem.getAttribute("classid") !== match);
        +			}
        +		}
        +
        +		return true;
        +	}
        +});
        +
        +jQuery.fn.extend({
        +	data: function( key, value ) {
        +		var parts, part, attr, name, l,
        +			elem = this[0],
        +			i = 0,
        +			data = null;
        +
        +		// Gets all values
        +		if ( key === undefined ) {
        +			if ( this.length ) {
        +				data = jQuery.data( elem );
        +
        +				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
        +					attr = elem.attributes;
        +					for ( l = attr.length; i < l; i++ ) {
        +						name = attr[i].name;
        +
        +						if ( name.indexOf( "data-" ) === 0 ) {
        +							name = jQuery.camelCase( name.substring(5) );
        +
        +							dataAttr( elem, name, data[ name ] );
        +						}
        +					}
        +					jQuery._data( elem, "parsedAttrs", true );
        +				}
        +			}
        +
        +			return data;
        +		}
        +
        +		// Sets multiple values
        +		if ( typeof key === "object" ) {
        +			return this.each(function() {
        +				jQuery.data( this, key );
        +			});
        +		}
        +
        +		parts = key.split( ".", 2 );
        +		parts[1] = parts[1] ? "." + parts[1] : "";
        +		part = parts[1] + "!";
        +
        +		return jQuery.access( this, function( value ) {
        +
        +			if ( value === undefined ) {
        +				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
        +
        +				// Try to fetch any internally stored data first
        +				if ( data === undefined && elem ) {
        +					data = jQuery.data( elem, key );
        +					data = dataAttr( elem, key, data );
        +				}
        +
        +				return data === undefined && parts[1] ?
        +					this.data( parts[0] ) :
        +					data;
        +			}
        +
        +			parts[1] = value;
        +			this.each(function() {
        +				var self = jQuery( this );
        +
        +				self.triggerHandler( "setData" + part, parts );
        +				jQuery.data( this, key, value );
        +				self.triggerHandler( "changeData" + part, parts );
        +			});
        +		}, null, value, arguments.length > 1, null, false );
        +	},
        +
        +	removeData: function( key ) {
        +		return this.each(function() {
        +			jQuery.removeData( this, key );
        +		});
        +	}
        +});
        +
        +function dataAttr( elem, key, data ) {
        +	// If nothing was found internally, try to fetch any
        +	// data from the HTML5 data-* attribute
        +	if ( data === undefined && elem.nodeType === 1 ) {
        +
        +		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
        +
        +		data = elem.getAttribute( name );
        +
        +		if ( typeof data === "string" ) {
        +			try {
        +				data = data === "true" ? true :
        +				data === "false" ? false :
        +				data === "null" ? null :
        +				jQuery.isNumeric( data ) ? +data :
        +					rbrace.test( data ) ? jQuery.parseJSON( data ) :
        +					data;
        +			} catch( e ) {}
        +
        +			// Make sure we set the data so it isn't changed later
        +			jQuery.data( elem, key, data );
        +
        +		} else {
        +			data = undefined;
        +		}
        +	}
        +
        +	return data;
        +}
        +
        +// checks a cache object for emptiness
        +function isEmptyDataObject( obj ) {
        +	for ( var name in obj ) {
        +
        +		// if the public data object is empty, the private is still empty
        +		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
        +			continue;
        +		}
        +		if ( name !== "toJSON" ) {
        +			return false;
        +		}
        +	}
        +
        +	return true;
        +}
        +
        +
        +
        +
        +function handleQueueMarkDefer( elem, type, src ) {
        +	var deferDataKey = type + "defer",
        +		queueDataKey = type + "queue",
        +		markDataKey = type + "mark",
        +		defer = jQuery._data( elem, deferDataKey );
        +	if ( defer &&
        +		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
        +		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
        +		// Give room for hard-coded callbacks to fire first
        +		// and eventually mark/queue something else on the element
        +		setTimeout( function() {
        +			if ( !jQuery._data( elem, queueDataKey ) &&
        +				!jQuery._data( elem, markDataKey ) ) {
        +				jQuery.removeData( elem, deferDataKey, true );
        +				defer.fire();
        +			}
        +		}, 0 );
        +	}
        +}
        +
        +jQuery.extend({
        +
        +	_mark: function( elem, type ) {
        +		if ( elem ) {
        +			type = ( type || "fx" ) + "mark";
        +			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
        +		}
        +	},
        +
        +	_unmark: function( force, elem, type ) {
        +		if ( force !== true ) {
        +			type = elem;
        +			elem = force;
        +			force = false;
        +		}
        +		if ( elem ) {
        +			type = type || "fx";
        +			var key = type + "mark",
        +				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
        +			if ( count ) {
        +				jQuery._data( elem, key, count );
        +			} else {
        +				jQuery.removeData( elem, key, true );
        +				handleQueueMarkDefer( elem, type, "mark" );
        +			}
        +		}
        +	},
        +
        +	queue: function( elem, type, data ) {
        +		var q;
        +		if ( elem ) {
        +			type = ( type || "fx" ) + "queue";
        +			q = jQuery._data( elem, type );
        +
        +			// Speed up dequeue by getting out quickly if this is just a lookup
        +			if ( data ) {
        +				if ( !q || jQuery.isArray(data) ) {
        +					q = jQuery._data( elem, type, jQuery.makeArray(data) );
        +				} else {
        +					q.push( data );
        +				}
        +			}
        +			return q || [];
        +		}
        +	},
        +
        +	dequeue: function( elem, type ) {
        +		type = type || "fx";
        +
        +		var queue = jQuery.queue( elem, type ),
        +			fn = queue.shift(),
        +			hooks = {};
        +
        +		// If the fx queue is dequeued, always remove the progress sentinel
        +		if ( fn === "inprogress" ) {
        +			fn = queue.shift();
        +		}
        +
        +		if ( fn ) {
        +			// Add a progress sentinel to prevent the fx queue from being
        +			// automatically dequeued
        +			if ( type === "fx" ) {
        +				queue.unshift( "inprogress" );
        +			}
        +
        +			jQuery._data( elem, type + ".run", hooks );
        +			fn.call( elem, function() {
        +				jQuery.dequeue( elem, type );
        +			}, hooks );
        +		}
        +
        +		if ( !queue.length ) {
        +			jQuery.removeData( elem, type + "queue " + type + ".run", true );
        +			handleQueueMarkDefer( elem, type, "queue" );
        +		}
        +	}
        +});
        +
        +jQuery.fn.extend({
        +	queue: function( type, data ) {
        +		var setter = 2;
        +
        +		if ( typeof type !== "string" ) {
        +			data = type;
        +			type = "fx";
        +			setter--;
        +		}
        +
        +		if ( arguments.length < setter ) {
        +			return jQuery.queue( this[0], type );
        +		}
        +
        +		return data === undefined ?
        +			this :
        +			this.each(function() {
        +				var queue = jQuery.queue( this, type, data );
        +
        +				if ( type === "fx" && queue[0] !== "inprogress" ) {
        +					jQuery.dequeue( this, type );
        +				}
        +			});
        +	},
        +	dequeue: function( type ) {
        +		return this.each(function() {
        +			jQuery.dequeue( this, type );
        +		});
        +	},
        +	// Based off of the plugin by Clint Helfers, with permission.
        +	// http://blindsignals.com/index.php/2009/07/jquery-delay/
        +	delay: function( time, type ) {
        +		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
        +		type = type || "fx";
        +
        +		return this.queue( type, function( next, hooks ) {
        +			var timeout = setTimeout( next, time );
        +			hooks.stop = function() {
        +				clearTimeout( timeout );
        +			};
        +		});
        +	},
        +	clearQueue: function( type ) {
        +		return this.queue( type || "fx", [] );
        +	},
        +	// Get a promise resolved when queues of a certain type
        +	// are emptied (fx is the type by default)
        +	promise: function( type, object ) {
        +		if ( typeof type !== "string" ) {
        +			object = type;
        +			type = undefined;
        +		}
        +		type = type || "fx";
        +		var defer = jQuery.Deferred(),
        +			elements = this,
        +			i = elements.length,
        +			count = 1,
        +			deferDataKey = type + "defer",
        +			queueDataKey = type + "queue",
        +			markDataKey = type + "mark",
        +			tmp;
        +		function resolve() {
        +			if ( !( --count ) ) {
        +				defer.resolveWith( elements, [ elements ] );
        +			}
        +		}
        +		while( i-- ) {
        +			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
        +					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
        +						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
        +					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
        +				count++;
        +				tmp.add( resolve );
        +			}
        +		}
        +		resolve();
        +		return defer.promise( object );
        +	}
        +});
        +
        +
        +
        +
        +var rclass = /[\n\t\r]/g,
        +	rspace = /\s+/,
        +	rreturn = /\r/g,
        +	rtype = /^(?:button|input)$/i,
        +	rfocusable = /^(?:button|input|object|select|textarea)$/i,
        +	rclickable = /^a(?:rea)?$/i,
        +	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
        +	getSetAttribute = jQuery.support.getSetAttribute,
        +	nodeHook, boolHook, fixSpecified;
        +
        +jQuery.fn.extend({
        +	attr: function( name, value ) {
        +		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
        +	},
        +
        +	removeAttr: function( name ) {
        +		return this.each(function() {
        +			jQuery.removeAttr( this, name );
        +		});
        +	},
        +
        +	prop: function( name, value ) {
        +		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
        +	},
        +
        +	removeProp: function( name ) {
        +		name = jQuery.propFix[ name ] || name;
        +		return this.each(function() {
        +			// try/catch handles cases where IE balks (such as removing a property on window)
        +			try {
        +				this[ name ] = undefined;
        +				delete this[ name ];
        +			} catch( e ) {}
        +		});
        +	},
        +
        +	addClass: function( value ) {
        +		var classNames, i, l, elem,
        +			setClass, c, cl;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each(function( j ) {
        +				jQuery( this ).addClass( value.call(this, j, this.className) );
        +			});
        +		}
        +
        +		if ( value && typeof value === "string" ) {
        +			classNames = value.split( rspace );
        +
        +			for ( i = 0, l = this.length; i < l; i++ ) {
        +				elem = this[ i ];
        +
        +				if ( elem.nodeType === 1 ) {
        +					if ( !elem.className && classNames.length === 1 ) {
        +						elem.className = value;
        +
        +					} else {
        +						setClass = " " + elem.className + " ";
        +
        +						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
        +							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
        +								setClass += classNames[ c ] + " ";
        +							}
        +						}
        +						elem.className = jQuery.trim( setClass );
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	removeClass: function( value ) {
        +		var classNames, i, l, elem, className, c, cl;
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each(function( j ) {
        +				jQuery( this ).removeClass( value.call(this, j, this.className) );
        +			});
        +		}
        +
        +		if ( (value && typeof value === "string") || value === undefined ) {
        +			classNames = ( value || "" ).split( rspace );
        +
        +			for ( i = 0, l = this.length; i < l; i++ ) {
        +				elem = this[ i ];
        +
        +				if ( elem.nodeType === 1 && elem.className ) {
        +					if ( value ) {
        +						className = (" " + elem.className + " ").replace( rclass, " " );
        +						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
        +							className = className.replace(" " + classNames[ c ] + " ", " ");
        +						}
        +						elem.className = jQuery.trim( className );
        +
        +					} else {
        +						elem.className = "";
        +					}
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	toggleClass: function( value, stateVal ) {
        +		var type = typeof value,
        +			isBool = typeof stateVal === "boolean";
        +
        +		if ( jQuery.isFunction( value ) ) {
        +			return this.each(function( i ) {
        +				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
        +			});
        +		}
        +
        +		return this.each(function() {
        +			if ( type === "string" ) {
        +				// toggle individual class names
        +				var className,
        +					i = 0,
        +					self = jQuery( this ),
        +					state = stateVal,
        +					classNames = value.split( rspace );
        +
        +				while ( (className = classNames[ i++ ]) ) {
        +					// check each className given, space seperated list
        +					state = isBool ? state : !self.hasClass( className );
        +					self[ state ? "addClass" : "removeClass" ]( className );
        +				}
        +
        +			} else if ( type === "undefined" || type === "boolean" ) {
        +				if ( this.className ) {
        +					// store className if set
        +					jQuery._data( this, "__className__", this.className );
        +				}
        +
        +				// toggle whole className
        +				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
        +			}
        +		});
        +	},
        +
        +	hasClass: function( selector ) {
        +		var className = " " + selector + " ",
        +			i = 0,
        +			l = this.length;
        +		for ( ; i < l; i++ ) {
        +			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
        +				return true;
        +			}
        +		}
        +
        +		return false;
        +	},
        +
        +	val: function( value ) {
        +		var hooks, ret, isFunction,
        +			elem = this[0];
        +
        +		if ( !arguments.length ) {
        +			if ( elem ) {
        +				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
        +
        +				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
        +					return ret;
        +				}
        +
        +				ret = elem.value;
        +
        +				return typeof ret === "string" ?
        +					// handle most common string cases
        +					ret.replace(rreturn, "") :
        +					// handle cases where value is null/undef or number
        +					ret == null ? "" : ret;
        +			}
        +
        +			return;
        +		}
        +
        +		isFunction = jQuery.isFunction( value );
        +
        +		return this.each(function( i ) {
        +			var self = jQuery(this), val;
        +
        +			if ( this.nodeType !== 1 ) {
        +				return;
        +			}
        +
        +			if ( isFunction ) {
        +				val = value.call( this, i, self.val() );
        +			} else {
        +				val = value;
        +			}
        +
        +			// Treat null/undefined as ""; convert numbers to string
        +			if ( val == null ) {
        +				val = "";
        +			} else if ( typeof val === "number" ) {
        +				val += "";
        +			} else if ( jQuery.isArray( val ) ) {
        +				val = jQuery.map(val, function ( value ) {
        +					return value == null ? "" : value + "";
        +				});
        +			}
        +
        +			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
        +
        +			// If set returns undefined, fall back to normal setting
        +			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
        +				this.value = val;
        +			}
        +		});
        +	}
        +});
        +
        +jQuery.extend({
        +	valHooks: {
        +		option: {
        +			get: function( elem ) {
        +				// attributes.value is undefined in Blackberry 4.7 but
        +				// uses .value. See #6932
        +				var val = elem.attributes.value;
        +				return !val || val.specified ? elem.value : elem.text;
        +			}
        +		},
        +		select: {
        +			get: function( elem ) {
        +				var value, i, max, option,
        +					index = elem.selectedIndex,
        +					values = [],
        +					options = elem.options,
        +					one = elem.type === "select-one";
        +
        +				// Nothing was selected
        +				if ( index < 0 ) {
        +					return null;
        +				}
        +
        +				// Loop through all the selected options
        +				i = one ? index : 0;
        +				max = one ? index + 1 : options.length;
        +				for ( ; i < max; i++ ) {
        +					option = options[ i ];
        +
        +					// Don't return options that are disabled or in a disabled optgroup
        +					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
        +							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
        +
        +						// Get the specific value for the option
        +						value = jQuery( option ).val();
        +
        +						// We don't need an array for one selects
        +						if ( one ) {
        +							return value;
        +						}
        +
        +						// Multi-Selects return an array
        +						values.push( value );
        +					}
        +				}
        +
        +				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
        +				if ( one && !values.length && options.length ) {
        +					return jQuery( options[ index ] ).val();
        +				}
        +
        +				return values;
        +			},
        +
        +			set: function( elem, value ) {
        +				var values = jQuery.makeArray( value );
        +
        +				jQuery(elem).find("option").each(function() {
        +					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
        +				});
        +
        +				if ( !values.length ) {
        +					elem.selectedIndex = -1;
        +				}
        +				return values;
        +			}
        +		}
        +	},
        +
        +	attrFn: {
        +		val: true,
        +		css: true,
        +		html: true,
        +		text: true,
        +		data: true,
        +		width: true,
        +		height: true,
        +		offset: true
        +	},
        +
        +	attr: function( elem, name, value, pass ) {
        +		var ret, hooks, notxml,
        +			nType = elem.nodeType;
        +
        +		// don't get/set attributes on text, comment and attribute nodes
        +		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		if ( pass && name in jQuery.attrFn ) {
        +			return jQuery( elem )[ name ]( value );
        +		}
        +
        +		// Fallback to prop when attributes are not supported
        +		if ( typeof elem.getAttribute === "undefined" ) {
        +			return jQuery.prop( elem, name, value );
        +		}
        +
        +		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
        +
        +		// All attributes are lowercase
        +		// Grab necessary hook if one is defined
        +		if ( notxml ) {
        +			name = name.toLowerCase();
        +			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
        +		}
        +
        +		if ( value !== undefined ) {
        +
        +			if ( value === null ) {
        +				jQuery.removeAttr( elem, name );
        +				return;
        +
        +			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
        +				return ret;
        +
        +			} else {
        +				elem.setAttribute( name, "" + value );
        +				return value;
        +			}
        +
        +		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
        +			return ret;
        +
        +		} else {
        +
        +			ret = elem.getAttribute( name );
        +
        +			// Non-existent attributes return null, we normalize to undefined
        +			return ret === null ?
        +				undefined :
        +				ret;
        +		}
        +	},
        +
        +	removeAttr: function( elem, value ) {
        +		var propName, attrNames, name, l, isBool,
        +			i = 0;
        +
        +		if ( value && elem.nodeType === 1 ) {
        +			attrNames = value.toLowerCase().split( rspace );
        +			l = attrNames.length;
        +
        +			for ( ; i < l; i++ ) {
        +				name = attrNames[ i ];
        +
        +				if ( name ) {
        +					propName = jQuery.propFix[ name ] || name;
        +					isBool = rboolean.test( name );
        +
        +					// See #9699 for explanation of this approach (setting first, then removal)
        +					// Do not do this for boolean attributes (see #10870)
        +					if ( !isBool ) {
        +						jQuery.attr( elem, name, "" );
        +					}
        +					elem.removeAttribute( getSetAttribute ? name : propName );
        +
        +					// Set corresponding property to false for boolean attributes
        +					if ( isBool && propName in elem ) {
        +						elem[ propName ] = false;
        +					}
        +				}
        +			}
        +		}
        +	},
        +
        +	attrHooks: {
        +		type: {
        +			set: function( elem, value ) {
        +				// We can't allow the type property to be changed (since it causes problems in IE)
        +				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
        +					jQuery.error( "type property can't be changed" );
        +				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
        +					// Setting the type on a radio button after the value resets the value in IE6-9
        +					// Reset value to it's default in case type is set after value
        +					// This is for element creation
        +					var val = elem.value;
        +					elem.setAttribute( "type", value );
        +					if ( val ) {
        +						elem.value = val;
        +					}
        +					return value;
        +				}
        +			}
        +		},
        +		// Use the value property for back compat
        +		// Use the nodeHook for button elements in IE6/7 (#1954)
        +		value: {
        +			get: function( elem, name ) {
        +				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
        +					return nodeHook.get( elem, name );
        +				}
        +				return name in elem ?
        +					elem.value :
        +					null;
        +			},
        +			set: function( elem, value, name ) {
        +				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
        +					return nodeHook.set( elem, value, name );
        +				}
        +				// Does not return so that setAttribute is also used
        +				elem.value = value;
        +			}
        +		}
        +	},
        +
        +	propFix: {
        +		tabindex: "tabIndex",
        +		readonly: "readOnly",
        +		"for": "htmlFor",
        +		"class": "className",
        +		maxlength: "maxLength",
        +		cellspacing: "cellSpacing",
        +		cellpadding: "cellPadding",
        +		rowspan: "rowSpan",
        +		colspan: "colSpan",
        +		usemap: "useMap",
        +		frameborder: "frameBorder",
        +		contenteditable: "contentEditable"
        +	},
        +
        +	prop: function( elem, name, value ) {
        +		var ret, hooks, notxml,
        +			nType = elem.nodeType;
        +
        +		// don't get/set properties on text, comment and attribute nodes
        +		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +			return;
        +		}
        +
        +		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
        +
        +		if ( notxml ) {
        +			// Fix name and attach hooks
        +			name = jQuery.propFix[ name ] || name;
        +			hooks = jQuery.propHooks[ name ];
        +		}
        +
        +		if ( value !== undefined ) {
        +			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
        +				return ret;
        +
        +			} else {
        +				return ( elem[ name ] = value );
        +			}
        +
        +		} else {
        +			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
        +				return ret;
        +
        +			} else {
        +				return elem[ name ];
        +			}
        +		}
        +	},
        +
        +	propHooks: {
        +		tabIndex: {
        +			get: function( elem ) {
        +				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
        +				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
        +				var attributeNode = elem.getAttributeNode("tabindex");
        +
        +				return attributeNode && attributeNode.specified ?
        +					parseInt( attributeNode.value, 10 ) :
        +					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
        +						0 :
        +						undefined;
        +			}
        +		}
        +	}
        +});
        +
        +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
        +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
        +
        +// Hook for boolean attributes
        +boolHook = {
        +	get: function( elem, name ) {
        +		// Align boolean attributes with corresponding properties
        +		// Fall back to attribute presence where some booleans are not supported
        +		var attrNode,
        +			property = jQuery.prop( elem, name );
        +		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
        +			name.toLowerCase() :
        +			undefined;
        +	},
        +	set: function( elem, value, name ) {
        +		var propName;
        +		if ( value === false ) {
        +			// Remove boolean attributes when set to false
        +			jQuery.removeAttr( elem, name );
        +		} else {
        +			// value is true since we know at this point it's type boolean and not false
        +			// Set boolean attributes to the same name and set the DOM property
        +			propName = jQuery.propFix[ name ] || name;
        +			if ( propName in elem ) {
        +				// Only set the IDL specifically if it already exists on the element
        +				elem[ propName ] = true;
        +			}
        +
        +			elem.setAttribute( name, name.toLowerCase() );
        +		}
        +		return name;
        +	}
        +};
        +
        +// IE6/7 do not support getting/setting some attributes with get/setAttribute
        +if ( !getSetAttribute ) {
        +
        +	fixSpecified = {
        +		name: true,
        +		id: true,
        +		coords: true
        +	};
        +
        +	// Use this for any attribute in IE6/7
        +	// This fixes almost every IE6/7 issue
        +	nodeHook = jQuery.valHooks.button = {
        +		get: function( elem, name ) {
        +			var ret;
        +			ret = elem.getAttributeNode( name );
        +			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
        +				ret.nodeValue :
        +				undefined;
        +		},
        +		set: function( elem, value, name ) {
        +			// Set the existing or create a new attribute node
        +			var ret = elem.getAttributeNode( name );
        +			if ( !ret ) {
        +				ret = document.createAttribute( name );
        +				elem.setAttributeNode( ret );
        +			}
        +			return ( ret.nodeValue = value + "" );
        +		}
        +	};
        +
        +	// Apply the nodeHook to tabindex
        +	jQuery.attrHooks.tabindex.set = nodeHook.set;
        +
        +	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
        +	// This is for removals
        +	jQuery.each([ "width", "height" ], function( i, name ) {
        +		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
        +			set: function( elem, value ) {
        +				if ( value === "" ) {
        +					elem.setAttribute( name, "auto" );
        +					return value;
        +				}
        +			}
        +		});
        +	});
        +
        +	// Set contenteditable to false on removals(#10429)
        +	// Setting to empty string throws an error as an invalid value
        +	jQuery.attrHooks.contenteditable = {
        +		get: nodeHook.get,
        +		set: function( elem, value, name ) {
        +			if ( value === "" ) {
        +				value = "false";
        +			}
        +			nodeHook.set( elem, value, name );
        +		}
        +	};
        +}
        +
        +
        +// Some attributes require a special call on IE
        +if ( !jQuery.support.hrefNormalized ) {
        +	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
        +		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
        +			get: function( elem ) {
        +				var ret = elem.getAttribute( name, 2 );
        +				return ret === null ? undefined : ret;
        +			}
        +		});
        +	});
        +}
        +
        +if ( !jQuery.support.style ) {
        +	jQuery.attrHooks.style = {
        +		get: function( elem ) {
        +			// Return undefined in the case of empty string
        +			// Normalize to lowercase since IE uppercases css property names
        +			return elem.style.cssText.toLowerCase() || undefined;
        +		},
        +		set: function( elem, value ) {
        +			return ( elem.style.cssText = "" + value );
        +		}
        +	};
        +}
        +
        +// Safari mis-reports the default selected property of an option
        +// Accessing the parent's selectedIndex property fixes it
        +if ( !jQuery.support.optSelected ) {
        +	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
        +		get: function( elem ) {
        +			var parent = elem.parentNode;
        +
        +			if ( parent ) {
        +				parent.selectedIndex;
        +
        +				// Make sure that it also works with optgroups, see #5701
        +				if ( parent.parentNode ) {
        +					parent.parentNode.selectedIndex;
        +				}
        +			}
        +			return null;
        +		}
        +	});
        +}
        +
        +// IE6/7 call enctype encoding
        +if ( !jQuery.support.enctype ) {
        +	jQuery.propFix.enctype = "encoding";
        +}
        +
        +// Radios and checkboxes getter/setter
        +if ( !jQuery.support.checkOn ) {
        +	jQuery.each([ "radio", "checkbox" ], function() {
        +		jQuery.valHooks[ this ] = {
        +			get: function( elem ) {
        +				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
        +				return elem.getAttribute("value") === null ? "on" : elem.value;
        +			}
        +		};
        +	});
        +}
        +jQuery.each([ "radio", "checkbox" ], function() {
        +	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
        +		set: function( elem, value ) {
        +			if ( jQuery.isArray( value ) ) {
        +				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
        +			}
        +		}
        +	});
        +});
        +
        +
        +
        +
        +var rformElems = /^(?:textarea|input|select)$/i,
        +	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
        +	rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
        +	rkeyEvent = /^key/,
        +	rmouseEvent = /^(?:mouse|contextmenu)|click/,
        +	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
        +	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
        +	quickParse = function( selector ) {
        +		var quick = rquickIs.exec( selector );
        +		if ( quick ) {
        +			//   0  1    2   3
        +			// [ _, tag, id, class ]
        +			quick[1] = ( quick[1] || "" ).toLowerCase();
        +			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
        +		}
        +		return quick;
        +	},
        +	quickIs = function( elem, m ) {
        +		var attrs = elem.attributes || {};
        +		return (
        +			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
        +			(!m[2] || (attrs.id || {}).value === m[2]) &&
        +			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
        +		);
        +	},
        +	hoverHack = function( events ) {
        +		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
        +	};
        +
        +/*
        + * Helper functions for managing events -- not part of the public interface.
        + * Props to Dean Edwards' addEvent library for many of the ideas.
        + */
        +jQuery.event = {
        +
        +	add: function( elem, types, handler, data, selector ) {
        +
        +		var elemData, eventHandle, events,
        +			t, tns, type, namespaces, handleObj,
        +			handleObjIn, quick, handlers, special;
        +
        +		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
        +		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
        +			return;
        +		}
        +
        +		// Caller can pass in an object of custom data in lieu of the handler
        +		if ( handler.handler ) {
        +			handleObjIn = handler;
        +			handler = handleObjIn.handler;
        +			selector = handleObjIn.selector;
        +		}
        +
        +		// Make sure that the handler has a unique ID, used to find/remove it later
        +		if ( !handler.guid ) {
        +			handler.guid = jQuery.guid++;
        +		}
        +
        +		// Init the element's event structure and main handler, if this is the first
        +		events = elemData.events;
        +		if ( !events ) {
        +			elemData.events = events = {};
        +		}
        +		eventHandle = elemData.handle;
        +		if ( !eventHandle ) {
        +			elemData.handle = eventHandle = function( e ) {
        +				// Discard the second event of a jQuery.event.trigger() and
        +				// when an event is called after a page has unloaded
        +				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
        +					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
        +					undefined;
        +			};
        +			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
        +			eventHandle.elem = elem;
        +		}
        +
        +		// Handle multiple events separated by a space
        +		// jQuery(...).bind("mouseover mouseout", fn);
        +		types = jQuery.trim( hoverHack(types) ).split( " " );
        +		for ( t = 0; t < types.length; t++ ) {
        +
        +			tns = rtypenamespace.exec( types[t] ) || [];
        +			type = tns[1];
        +			namespaces = ( tns[2] || "" ).split( "." ).sort();
        +
        +			// If event changes its type, use the special event handlers for the changed type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// If selector defined, determine special event api type, otherwise given type
        +			type = ( selector ? special.delegateType : special.bindType ) || type;
        +
        +			// Update special based on newly reset type
        +			special = jQuery.event.special[ type ] || {};
        +
        +			// handleObj is passed to all event handlers
        +			handleObj = jQuery.extend({
        +				type: type,
        +				origType: tns[1],
        +				data: data,
        +				handler: handler,
        +				guid: handler.guid,
        +				selector: selector,
        +				quick: selector && quickParse( selector ),
        +				namespace: namespaces.join(".")
        +			}, handleObjIn );
        +
        +			// Init the event handler queue if we're the first
        +			handlers = events[ type ];
        +			if ( !handlers ) {
        +				handlers = events[ type ] = [];
        +				handlers.delegateCount = 0;
        +
        +				// Only use addEventListener/attachEvent if the special events handler returns false
        +				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        +					// Bind the global event handler to the element
        +					if ( elem.addEventListener ) {
        +						elem.addEventListener( type, eventHandle, false );
        +
        +					} else if ( elem.attachEvent ) {
        +						elem.attachEvent( "on" + type, eventHandle );
        +					}
        +				}
        +			}
        +
        +			if ( special.add ) {
        +				special.add.call( elem, handleObj );
        +
        +				if ( !handleObj.handler.guid ) {
        +					handleObj.handler.guid = handler.guid;
        +				}
        +			}
        +
        +			// Add to the element's handler list, delegates in front
        +			if ( selector ) {
        +				handlers.splice( handlers.delegateCount++, 0, handleObj );
        +			} else {
        +				handlers.push( handleObj );
        +			}
        +
        +			// Keep track of which events have ever been used, for event optimization
        +			jQuery.event.global[ type ] = true;
        +		}
        +
        +		// Nullify elem to prevent memory leaks in IE
        +		elem = null;
        +	},
        +
        +	global: {},
        +
        +	// Detach an event or set of events from an element
        +	remove: function( elem, types, handler, selector, mappedTypes ) {
        +
        +		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
        +			t, tns, type, origType, namespaces, origCount,
        +			j, events, special, handle, eventType, handleObj;
        +
        +		if ( !elemData || !(events = elemData.events) ) {
        +			return;
        +		}
        +
        +		// Once for each type.namespace in types; type may be omitted
        +		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
        +		for ( t = 0; t < types.length; t++ ) {
        +			tns = rtypenamespace.exec( types[t] ) || [];
        +			type = origType = tns[1];
        +			namespaces = tns[2];
        +
        +			// Unbind all events (on this namespace, if provided) for the element
        +			if ( !type ) {
        +				for ( type in events ) {
        +					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
        +				}
        +				continue;
        +			}
        +
        +			special = jQuery.event.special[ type ] || {};
        +			type = ( selector? special.delegateType : special.bindType ) || type;
        +			eventType = events[ type ] || [];
        +			origCount = eventType.length;
        +			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
        +
        +			// Remove matching events
        +			for ( j = 0; j < eventType.length; j++ ) {
        +				handleObj = eventType[ j ];
        +
        +				if ( ( mappedTypes || origType === handleObj.origType ) &&
        +					 ( !handler || handler.guid === handleObj.guid ) &&
        +					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
        +					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
        +					eventType.splice( j--, 1 );
        +
        +					if ( handleObj.selector ) {
        +						eventType.delegateCount--;
        +					}
        +					if ( special.remove ) {
        +						special.remove.call( elem, handleObj );
        +					}
        +				}
        +			}
        +
        +			// Remove generic event handler if we removed something and no more handlers exist
        +			// (avoids potential for endless recursion during removal of special event handlers)
        +			if ( eventType.length === 0 && origCount !== eventType.length ) {
        +				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
        +					jQuery.removeEvent( elem, type, elemData.handle );
        +				}
        +
        +				delete events[ type ];
        +			}
        +		}
        +
        +		// Remove the expando if it's no longer used
        +		if ( jQuery.isEmptyObject( events ) ) {
        +			handle = elemData.handle;
        +			if ( handle ) {
        +				handle.elem = null;
        +			}
        +
        +			// removeData also checks for emptiness and clears the expando if empty
        +			// so use it instead of delete
        +			jQuery.removeData( elem, [ "events", "handle" ], true );
        +		}
        +	},
        +
        +	// Events that are safe to short-circuit if no handlers are attached.
        +	// Native DOM events should not be added, they may have inline handlers.
        +	customEvent: {
        +		"getData": true,
        +		"setData": true,
        +		"changeData": true
        +	},
        +
        +	trigger: function( event, data, elem, onlyHandlers ) {
        +		// Don't do events on text and comment nodes
        +		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
        +			return;
        +		}
        +
        +		// Event object or event type
        +		var type = event.type || event,
        +			namespaces = [],
        +			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
        +
        +		// focus/blur morphs to focusin/out; ensure we're not firing them right now
        +		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        +			return;
        +		}
        +
        +		if ( type.indexOf( "!" ) >= 0 ) {
        +			// Exclusive events trigger only for the exact event (no namespaces)
        +			type = type.slice(0, -1);
        +			exclusive = true;
        +		}
        +
        +		if ( type.indexOf( "." ) >= 0 ) {
        +			// Namespaced trigger; create a regexp to match event type in handle()
        +			namespaces = type.split(".");
        +			type = namespaces.shift();
        +			namespaces.sort();
        +		}
        +
        +		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
        +			// No jQuery handlers for this event type, and it can't have inline handlers
        +			return;
        +		}
        +
        +		// Caller can pass in an Event, Object, or just an event type string
        +		event = typeof event === "object" ?
        +			// jQuery.Event object
        +			event[ jQuery.expando ] ? event :
        +			// Object literal
        +			new jQuery.Event( type, event ) :
        +			// Just the event type (string)
        +			new jQuery.Event( type );
        +
        +		event.type = type;
        +		event.isTrigger = true;
        +		event.exclusive = exclusive;
        +		event.namespace = namespaces.join( "." );
        +		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
        +		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
        +
        +		// Handle a global trigger
        +		if ( !elem ) {
        +
        +			// TODO: Stop taunting the data cache; remove global events and always attach to document
        +			cache = jQuery.cache;
        +			for ( i in cache ) {
        +				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
        +					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
        +				}
        +			}
        +			return;
        +		}
        +
        +		// Clean up the event in case it is being reused
        +		event.result = undefined;
        +		if ( !event.target ) {
        +			event.target = elem;
        +		}
        +
        +		// Clone any incoming data and prepend the event, creating the handler arg list
        +		data = data != null ? jQuery.makeArray( data ) : [];
        +		data.unshift( event );
        +
        +		// Allow special events to draw outside the lines
        +		special = jQuery.event.special[ type ] || {};
        +		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
        +			return;
        +		}
        +
        +		// Determine event propagation path in advance, per W3C events spec (#9951)
        +		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
        +		eventPath = [[ elem, special.bindType || type ]];
        +		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
        +
        +			bubbleType = special.delegateType || type;
        +			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
        +			old = null;
        +			for ( ; cur; cur = cur.parentNode ) {
        +				eventPath.push([ cur, bubbleType ]);
        +				old = cur;
        +			}
        +
        +			// Only add window if we got to document (e.g., not plain obj or detached DOM)
        +			if ( old && old === elem.ownerDocument ) {
        +				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
        +			}
        +		}
        +
        +		// Fire handlers on the event path
        +		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
        +
        +			cur = eventPath[i][0];
        +			event.type = eventPath[i][1];
        +
        +			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
        +			if ( handle ) {
        +				handle.apply( cur, data );
        +			}
        +			// Note that this is a bare JS function and not a jQuery handler
        +			handle = ontype && cur[ ontype ];
        +			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
        +				event.preventDefault();
        +			}
        +		}
        +		event.type = type;
        +
        +		// If nobody prevented the default action, do it now
        +		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
        +
        +			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
        +				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
        +
        +				// Call a native DOM method on the target with the same name name as the event.
        +				// Can't use an .isFunction() check here because IE6/7 fails that test.
        +				// Don't do default actions on window, that's where global variables be (#6170)
        +				// IE<9 dies on focus/blur to hidden element (#1486)
        +				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
        +
        +					// Don't re-trigger an onFOO event when we call its FOO() method
        +					old = elem[ ontype ];
        +
        +					if ( old ) {
        +						elem[ ontype ] = null;
        +					}
        +
        +					// Prevent re-triggering of the same event, since we already bubbled it above
        +					jQuery.event.triggered = type;
        +					elem[ type ]();
        +					jQuery.event.triggered = undefined;
        +
        +					if ( old ) {
        +						elem[ ontype ] = old;
        +					}
        +				}
        +			}
        +		}
        +
        +		return event.result;
        +	},
        +
        +	dispatch: function( event ) {
        +
        +		// Make a writable jQuery.Event from the native event object
        +		event = jQuery.event.fix( event || window.event );
        +
        +		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
        +			delegateCount = handlers.delegateCount,
        +			args = [].slice.call( arguments, 0 ),
        +			run_all = !event.exclusive && !event.namespace,
        +			special = jQuery.event.special[ event.type ] || {},
        +			handlerQueue = [],
        +			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
        +
        +		// Use the fix-ed jQuery.Event rather than the (read-only) native event
        +		args[0] = event;
        +		event.delegateTarget = this;
        +
        +		// Call the preDispatch hook for the mapped type, and let it bail if desired
        +		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
        +			return;
        +		}
        +
        +		// Determine handlers that should run if there are delegated events
        +		// Avoid non-left-click bubbling in Firefox (#3861)
        +		if ( delegateCount && !(event.button && event.type === "click") ) {
        +
        +			// Pregenerate a single jQuery object for reuse with .is()
        +			jqcur = jQuery(this);
        +			jqcur.context = this.ownerDocument || this;
        +
        +			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
        +
        +				// Don't process events on disabled elements (#6911, #8165)
        +				if ( cur.disabled !== true ) {
        +					selMatch = {};
        +					matches = [];
        +					jqcur[0] = cur;
        +					for ( i = 0; i < delegateCount; i++ ) {
        +						handleObj = handlers[ i ];
        +						sel = handleObj.selector;
        +
        +						if ( selMatch[ sel ] === undefined ) {
        +							selMatch[ sel ] = (
        +								handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
        +							);
        +						}
        +						if ( selMatch[ sel ] ) {
        +							matches.push( handleObj );
        +						}
        +					}
        +					if ( matches.length ) {
        +						handlerQueue.push({ elem: cur, matches: matches });
        +					}
        +				}
        +			}
        +		}
        +
        +		// Add the remaining (directly-bound) handlers
        +		if ( handlers.length > delegateCount ) {
        +			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
        +		}
        +
        +		// Run delegates first; they may want to stop propagation beneath us
        +		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
        +			matched = handlerQueue[ i ];
        +			event.currentTarget = matched.elem;
        +
        +			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
        +				handleObj = matched.matches[ j ];
        +
        +				// Triggered event must either 1) be non-exclusive and have no namespace, or
        +				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
        +				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
        +
        +					event.data = handleObj.data;
        +					event.handleObj = handleObj;
        +
        +					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
        +							.apply( matched.elem, args );
        +
        +					if ( ret !== undefined ) {
        +						event.result = ret;
        +						if ( ret === false ) {
        +							event.preventDefault();
        +							event.stopPropagation();
        +						}
        +					}
        +				}
        +			}
        +		}
        +
        +		// Call the postDispatch hook for the mapped type
        +		if ( special.postDispatch ) {
        +			special.postDispatch.call( this, event );
        +		}
        +
        +		return event.result;
        +	},
        +
        +	// Includes some event props shared by KeyEvent and MouseEvent
        +	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
        +	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
        +
        +	fixHooks: {},
        +
        +	keyHooks: {
        +		props: "char charCode key keyCode".split(" "),
        +		filter: function( event, original ) {
        +
        +			// Add which for key events
        +			if ( event.which == null ) {
        +				event.which = original.charCode != null ? original.charCode : original.keyCode;
        +			}
        +
        +			return event;
        +		}
        +	},
        +
        +	mouseHooks: {
        +		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
        +		filter: function( event, original ) {
        +			var eventDoc, doc, body,
        +				button = original.button,
        +				fromElement = original.fromElement;
        +
        +			// Calculate pageX/Y if missing and clientX/Y available
        +			if ( event.pageX == null && original.clientX != null ) {
        +				eventDoc = event.target.ownerDocument || document;
        +				doc = eventDoc.documentElement;
        +				body = eventDoc.body;
        +
        +				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
        +				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
        +			}
        +
        +			// Add relatedTarget, if necessary
        +			if ( !event.relatedTarget && fromElement ) {
        +				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
        +			}
        +
        +			// Add which for click: 1 === left; 2 === middle; 3 === right
        +			// Note: button is not normalized, so don't use it
        +			if ( !event.which && button !== undefined ) {
        +				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
        +			}
        +
        +			return event;
        +		}
        +	},
        +
        +	fix: function( event ) {
        +		if ( event[ jQuery.expando ] ) {
        +			return event;
        +		}
        +
        +		// Create a writable copy of the event object and normalize some properties
        +		var i, prop,
        +			originalEvent = event,
        +			fixHook = jQuery.event.fixHooks[ event.type ] || {},
        +			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
        +
        +		event = jQuery.Event( originalEvent );
        +
        +		for ( i = copy.length; i; ) {
        +			prop = copy[ --i ];
        +			event[ prop ] = originalEvent[ prop ];
        +		}
        +
        +		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
        +		if ( !event.target ) {
        +			event.target = originalEvent.srcElement || document;
        +		}
        +
        +		// Target should not be a text node (#504, Safari)
        +		if ( event.target.nodeType === 3 ) {
        +			event.target = event.target.parentNode;
        +		}
        +
        +		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
        +		if ( event.metaKey === undefined ) {
        +			event.metaKey = event.ctrlKey;
        +		}
        +
        +		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
        +	},
        +
        +	special: {
        +		ready: {
        +			// Make sure the ready event is setup
        +			setup: jQuery.bindReady
        +		},
        +
        +		load: {
        +			// Prevent triggered image.load events from bubbling to window.load
        +			noBubble: true
        +		},
        +
        +		focus: {
        +			delegateType: "focusin"
        +		},
        +		blur: {
        +			delegateType: "focusout"
        +		},
        +
        +		beforeunload: {
        +			setup: function( data, namespaces, eventHandle ) {
        +				// We only want to do this special case on windows
        +				if ( jQuery.isWindow( this ) ) {
        +					this.onbeforeunload = eventHandle;
        +				}
        +			},
        +
        +			teardown: function( namespaces, eventHandle ) {
        +				if ( this.onbeforeunload === eventHandle ) {
        +					this.onbeforeunload = null;
        +				}
        +			}
        +		}
        +	},
        +
        +	simulate: function( type, elem, event, bubble ) {
        +		// Piggyback on a donor event to simulate a different one.
        +		// Fake originalEvent to avoid donor's stopPropagation, but if the
        +		// simulated event prevents default then we do the same on the donor.
        +		var e = jQuery.extend(
        +			new jQuery.Event(),
        +			event,
        +			{ type: type,
        +				isSimulated: true,
        +				originalEvent: {}
        +			}
        +		);
        +		if ( bubble ) {
        +			jQuery.event.trigger( e, null, elem );
        +		} else {
        +			jQuery.event.dispatch.call( elem, e );
        +		}
        +		if ( e.isDefaultPrevented() ) {
        +			event.preventDefault();
        +		}
        +	}
        +};
        +
        +// Some plugins are using, but it's undocumented/deprecated and will be removed.
        +// The 1.7 special event interface should provide all the hooks needed now.
        +jQuery.event.handle = jQuery.event.dispatch;
        +
        +jQuery.removeEvent = document.removeEventListener ?
        +	function( elem, type, handle ) {
        +		if ( elem.removeEventListener ) {
        +			elem.removeEventListener( type, handle, false );
        +		}
        +	} :
        +	function( elem, type, handle ) {
        +		if ( elem.detachEvent ) {
        +			elem.detachEvent( "on" + type, handle );
        +		}
        +	};
        +
        +jQuery.Event = function( src, props ) {
        +	// Allow instantiation without the 'new' keyword
        +	if ( !(this instanceof jQuery.Event) ) {
        +		return new jQuery.Event( src, props );
        +	}
        +
        +	// Event object
        +	if ( src && src.type ) {
        +		this.originalEvent = src;
        +		this.type = src.type;
        +
        +		// Events bubbling up the document may have been marked as prevented
        +		// by a handler lower down the tree; reflect the correct value.
        +		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
        +			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
        +
        +	// Event type
        +	} else {
        +		this.type = src;
        +	}
        +
        +	// Put explicitly provided properties onto the event object
        +	if ( props ) {
        +		jQuery.extend( this, props );
        +	}
        +
        +	// Create a timestamp if incoming event doesn't have one
        +	this.timeStamp = src && src.timeStamp || jQuery.now();
        +
        +	// Mark it as fixed
        +	this[ jQuery.expando ] = true;
        +};
        +
        +function returnFalse() {
        +	return false;
        +}
        +function returnTrue() {
        +	return true;
        +}
        +
        +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
        +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
        +jQuery.Event.prototype = {
        +	preventDefault: function() {
        +		this.isDefaultPrevented = returnTrue;
        +
        +		var e = this.originalEvent;
        +		if ( !e ) {
        +			return;
        +		}
        +
        +		// if preventDefault exists run it on the original event
        +		if ( e.preventDefault ) {
        +			e.preventDefault();
        +
        +		// otherwise set the returnValue property of the original event to false (IE)
        +		} else {
        +			e.returnValue = false;
        +		}
        +	},
        +	stopPropagation: function() {
        +		this.isPropagationStopped = returnTrue;
        +
        +		var e = this.originalEvent;
        +		if ( !e ) {
        +			return;
        +		}
        +		// if stopPropagation exists run it on the original event
        +		if ( e.stopPropagation ) {
        +			e.stopPropagation();
        +		}
        +		// otherwise set the cancelBubble property of the original event to true (IE)
        +		e.cancelBubble = true;
        +	},
        +	stopImmediatePropagation: function() {
        +		this.isImmediatePropagationStopped = returnTrue;
        +		this.stopPropagation();
        +	},
        +	isDefaultPrevented: returnFalse,
        +	isPropagationStopped: returnFalse,
        +	isImmediatePropagationStopped: returnFalse
        +};
        +
        +// Create mouseenter/leave events using mouseover/out and event-time checks
        +jQuery.each({
        +	mouseenter: "mouseover",
        +	mouseleave: "mouseout"
        +}, function( orig, fix ) {
        +	jQuery.event.special[ orig ] = {
        +		delegateType: fix,
        +		bindType: fix,
        +
        +		handle: function( event ) {
        +			var target = this,
        +				related = event.relatedTarget,
        +				handleObj = event.handleObj,
        +				selector = handleObj.selector,
        +				ret;
        +
        +			// For mousenter/leave call the handler if related is outside the target.
        +			// NB: No relatedTarget if the mouse left/entered the browser window
        +			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
        +				event.type = handleObj.origType;
        +				ret = handleObj.handler.apply( this, arguments );
        +				event.type = fix;
        +			}
        +			return ret;
        +		}
        +	};
        +});
        +
        +// IE submit delegation
        +if ( !jQuery.support.submitBubbles ) {
        +
        +	jQuery.event.special.submit = {
        +		setup: function() {
        +			// Only need this for delegated form submit events
        +			if ( jQuery.nodeName( this, "form" ) ) {
        +				return false;
        +			}
        +
        +			// Lazy-add a submit handler when a descendant form may potentially be submitted
        +			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
        +				// Node name check avoids a VML-related crash in IE (#9807)
        +				var elem = e.target,
        +					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
        +				if ( form && !form._submit_attached ) {
        +					jQuery.event.add( form, "submit._submit", function( event ) {
        +						event._submit_bubble = true;
        +					});
        +					form._submit_attached = true;
        +				}
        +			});
        +			// return undefined since we don't need an event listener
        +		},
        +
        +		postDispatch: function( event ) {
        +			// If form was submitted by the user, bubble the event up the tree
        +			if ( event._submit_bubble ) {
        +				delete event._submit_bubble;
        +				if ( this.parentNode && !event.isTrigger ) {
        +					jQuery.event.simulate( "submit", this.parentNode, event, true );
        +				}
        +			}
        +		},
        +
        +		teardown: function() {
        +			// Only need this for delegated form submit events
        +			if ( jQuery.nodeName( this, "form" ) ) {
        +				return false;
        +			}
        +
        +			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
        +			jQuery.event.remove( this, "._submit" );
        +		}
        +	};
        +}
        +
        +// IE change delegation and checkbox/radio fix
        +if ( !jQuery.support.changeBubbles ) {
        +
        +	jQuery.event.special.change = {
        +
        +		setup: function() {
        +
        +			if ( rformElems.test( this.nodeName ) ) {
        +				// IE doesn't fire change on a check/radio until blur; trigger it on click
        +				// after a propertychange. Eat the blur-change in special.change.handle.
        +				// This still fires onchange a second time for check/radio after blur.
        +				if ( this.type === "checkbox" || this.type === "radio" ) {
        +					jQuery.event.add( this, "propertychange._change", function( event ) {
        +						if ( event.originalEvent.propertyName === "checked" ) {
        +							this._just_changed = true;
        +						}
        +					});
        +					jQuery.event.add( this, "click._change", function( event ) {
        +						if ( this._just_changed && !event.isTrigger ) {
        +							this._just_changed = false;
        +							jQuery.event.simulate( "change", this, event, true );
        +						}
        +					});
        +				}
        +				return false;
        +			}
        +			// Delegated event; lazy-add a change handler on descendant inputs
        +			jQuery.event.add( this, "beforeactivate._change", function( e ) {
        +				var elem = e.target;
        +
        +				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
        +					jQuery.event.add( elem, "change._change", function( event ) {
        +						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
        +							jQuery.event.simulate( "change", this.parentNode, event, true );
        +						}
        +					});
        +					elem._change_attached = true;
        +				}
        +			});
        +		},
        +
        +		handle: function( event ) {
        +			var elem = event.target;
        +
        +			// Swallow native change events from checkbox/radio, we already triggered them above
        +			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
        +				return event.handleObj.handler.apply( this, arguments );
        +			}
        +		},
        +
        +		teardown: function() {
        +			jQuery.event.remove( this, "._change" );
        +
        +			return rformElems.test( this.nodeName );
        +		}
        +	};
        +}
        +
        +// Create "bubbling" focus and blur events
        +if ( !jQuery.support.focusinBubbles ) {
        +	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
        +
        +		// Attach a single capturing handler while someone wants focusin/focusout
        +		var attaches = 0,
        +			handler = function( event ) {
        +				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
        +			};
        +
        +		jQuery.event.special[ fix ] = {
        +			setup: function() {
        +				if ( attaches++ === 0 ) {
        +					document.addEventListener( orig, handler, true );
        +				}
        +			},
        +			teardown: function() {
        +				if ( --attaches === 0 ) {
        +					document.removeEventListener( orig, handler, true );
        +				}
        +			}
        +		};
        +	});
        +}
        +
        +jQuery.fn.extend({
        +
        +	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
        +		var origFn, type;
        +
        +		// Types can be a map of types/handlers
        +		if ( typeof types === "object" ) {
        +			// ( types-Object, selector, data )
        +			if ( typeof selector !== "string" ) { // && selector != null
        +				// ( types-Object, data )
        +				data = data || selector;
        +				selector = undefined;
        +			}
        +			for ( type in types ) {
        +				this.on( type, selector, data, types[ type ], one );
        +			}
        +			return this;
        +		}
        +
        +		if ( data == null && fn == null ) {
        +			// ( types, fn )
        +			fn = selector;
        +			data = selector = undefined;
        +		} else if ( fn == null ) {
        +			if ( typeof selector === "string" ) {
        +				// ( types, selector, fn )
        +				fn = data;
        +				data = undefined;
        +			} else {
        +				// ( types, data, fn )
        +				fn = data;
        +				data = selector;
        +				selector = undefined;
        +			}
        +		}
        +		if ( fn === false ) {
        +			fn = returnFalse;
        +		} else if ( !fn ) {
        +			return this;
        +		}
        +
        +		if ( one === 1 ) {
        +			origFn = fn;
        +			fn = function( event ) {
        +				// Can use an empty set, since event contains the info
        +				jQuery().off( event );
        +				return origFn.apply( this, arguments );
        +			};
        +			// Use same guid so caller can remove using origFn
        +			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        +		}
        +		return this.each( function() {
        +			jQuery.event.add( this, types, fn, data, selector );
        +		});
        +	},
        +	one: function( types, selector, data, fn ) {
        +		return this.on( types, selector, data, fn, 1 );
        +	},
        +	off: function( types, selector, fn ) {
        +		if ( types && types.preventDefault && types.handleObj ) {
        +			// ( event )  dispatched jQuery.Event
        +			var handleObj = types.handleObj;
        +			jQuery( types.delegateTarget ).off(
        +				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
        +				handleObj.selector,
        +				handleObj.handler
        +			);
        +			return this;
        +		}
        +		if ( typeof types === "object" ) {
        +			// ( types-object [, selector] )
        +			for ( var type in types ) {
        +				this.off( type, selector, types[ type ] );
        +			}
        +			return this;
        +		}
        +		if ( selector === false || typeof selector === "function" ) {
        +			// ( types [, fn] )
        +			fn = selector;
        +			selector = undefined;
        +		}
        +		if ( fn === false ) {
        +			fn = returnFalse;
        +		}
        +		return this.each(function() {
        +			jQuery.event.remove( this, types, fn, selector );
        +		});
        +	},
        +
        +	bind: function( types, data, fn ) {
        +		return this.on( types, null, data, fn );
        +	},
        +	unbind: function( types, fn ) {
        +		return this.off( types, null, fn );
        +	},
        +
        +	live: function( types, data, fn ) {
        +		jQuery( this.context ).on( types, this.selector, data, fn );
        +		return this;
        +	},
        +	die: function( types, fn ) {
        +		jQuery( this.context ).off( types, this.selector || "**", fn );
        +		return this;
        +	},
        +
        +	delegate: function( selector, types, data, fn ) {
        +		return this.on( types, selector, data, fn );
        +	},
        +	undelegate: function( selector, types, fn ) {
        +		// ( namespace ) or ( selector, types [, fn] )
        +		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
        +	},
        +
        +	trigger: function( type, data ) {
        +		return this.each(function() {
        +			jQuery.event.trigger( type, data, this );
        +		});
        +	},
        +	triggerHandler: function( type, data ) {
        +		if ( this[0] ) {
        +			return jQuery.event.trigger( type, data, this[0], true );
        +		}
        +	},
        +
        +	toggle: function( fn ) {
        +		// Save reference to arguments for access in closure
        +		var args = arguments,
        +			guid = fn.guid || jQuery.guid++,
        +			i = 0,
        +			toggler = function( event ) {
        +				// Figure out which function to execute
        +				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
        +				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
        +
        +				// Make sure that clicks stop
        +				event.preventDefault();
        +
        +				// and execute the function
        +				return args[ lastToggle ].apply( this, arguments ) || false;
        +			};
        +
        +		// link all the functions, so any of them can unbind this click handler
        +		toggler.guid = guid;
        +		while ( i < args.length ) {
        +			args[ i++ ].guid = guid;
        +		}
        +
        +		return this.click( toggler );
        +	},
        +
        +	hover: function( fnOver, fnOut ) {
        +		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        +	}
        +});
        +
        +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
        +	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
        +	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
        +
        +	// Handle event binding
        +	jQuery.fn[ name ] = function( data, fn ) {
        +		if ( fn == null ) {
        +			fn = data;
        +			data = null;
        +		}
        +
        +		return arguments.length > 0 ?
        +			this.on( name, null, data, fn ) :
        +			this.trigger( name );
        +	};
        +
        +	if ( jQuery.attrFn ) {
        +		jQuery.attrFn[ name ] = true;
        +	}
        +
        +	if ( rkeyEvent.test( name ) ) {
        +		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
        +	}
        +
        +	if ( rmouseEvent.test( name ) ) {
        +		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
        +	}
        +});
        +
        +
        +
        +/*!
        + * Sizzle CSS Selector Engine
        + *  Copyright 2011, The Dojo Foundation
        + *  Released under the MIT, BSD, and GPL Licenses.
        + *  More information: http://sizzlejs.com/
        + */
        +(function(){
        +
        +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
        +	expando = "sizcache" + (Math.random() + '').replace('.', ''),
        +	done = 0,
        +	toString = Object.prototype.toString,
        +	hasDuplicate = false,
        +	baseHasDuplicate = true,
        +	rBackslash = /\\/g,
        +	rReturn = /\r\n/g,
        +	rNonWord = /\W/;
        +
        +// Here we check if the JavaScript engine is using some sort of
        +// optimization where it does not always call our comparision
        +// function. If that is the case, discard the hasDuplicate value.
        +//   Thus far that includes Google Chrome.
        +[0, 0].sort(function() {
        +	baseHasDuplicate = false;
        +	return 0;
        +});
        +
        +var Sizzle = function( selector, context, results, seed ) {
        +	results = results || [];
        +	context = context || document;
        +
        +	var origContext = context;
        +
        +	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
        +		return [];
        +	}
        +
        +	if ( !selector || typeof selector !== "string" ) {
        +		return results;
        +	}
        +
        +	var m, set, checkSet, extra, ret, cur, pop, i,
        +		prune = true,
        +		contextXML = Sizzle.isXML( context ),
        +		parts = [],
        +		soFar = selector;
        +
        +	// Reset the position of the chunker regexp (start from head)
        +	do {
        +		chunker.exec( "" );
        +		m = chunker.exec( soFar );
        +
        +		if ( m ) {
        +			soFar = m[3];
        +
        +			parts.push( m[1] );
        +
        +			if ( m[2] ) {
        +				extra = m[3];
        +				break;
        +			}
        +		}
        +	} while ( m );
        +
        +	if ( parts.length > 1 && origPOS.exec( selector ) ) {
        +
        +		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
        +			set = posProcess( parts[0] + parts[1], context, seed );
        +
        +		} else {
        +			set = Expr.relative[ parts[0] ] ?
        +				[ context ] :
        +				Sizzle( parts.shift(), context );
        +
        +			while ( parts.length ) {
        +				selector = parts.shift();
        +
        +				if ( Expr.relative[ selector ] ) {
        +					selector += parts.shift();
        +				}
        +
        +				set = posProcess( selector, set, seed );
        +			}
        +		}
        +
        +	} else {
        +		// Take a shortcut and set the context if the root selector is an ID
        +		// (but not if it'll be faster if the inner selector is an ID)
        +		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
        +				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
        +
        +			ret = Sizzle.find( parts.shift(), context, contextXML );
        +			context = ret.expr ?
        +				Sizzle.filter( ret.expr, ret.set )[0] :
        +				ret.set[0];
        +		}
        +
        +		if ( context ) {
        +			ret = seed ?
        +				{ expr: parts.pop(), set: makeArray(seed) } :
        +				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
        +
        +			set = ret.expr ?
        +				Sizzle.filter( ret.expr, ret.set ) :
        +				ret.set;
        +
        +			if ( parts.length > 0 ) {
        +				checkSet = makeArray( set );
        +
        +			} else {
        +				prune = false;
        +			}
        +
        +			while ( parts.length ) {
        +				cur = parts.pop();
        +				pop = cur;
        +
        +				if ( !Expr.relative[ cur ] ) {
        +					cur = "";
        +				} else {
        +					pop = parts.pop();
        +				}
        +
        +				if ( pop == null ) {
        +					pop = context;
        +				}
        +
        +				Expr.relative[ cur ]( checkSet, pop, contextXML );
        +			}
        +
        +		} else {
        +			checkSet = parts = [];
        +		}
        +	}
        +
        +	if ( !checkSet ) {
        +		checkSet = set;
        +	}
        +
        +	if ( !checkSet ) {
        +		Sizzle.error( cur || selector );
        +	}
        +
        +	if ( toString.call(checkSet) === "[object Array]" ) {
        +		if ( !prune ) {
        +			results.push.apply( results, checkSet );
        +
        +		} else if ( context && context.nodeType === 1 ) {
        +			for ( i = 0; checkSet[i] != null; i++ ) {
        +				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
        +					results.push( set[i] );
        +				}
        +			}
        +
        +		} else {
        +			for ( i = 0; checkSet[i] != null; i++ ) {
        +				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
        +					results.push( set[i] );
        +				}
        +			}
        +		}
        +
        +	} else {
        +		makeArray( checkSet, results );
        +	}
        +
        +	if ( extra ) {
        +		Sizzle( extra, origContext, results, seed );
        +		Sizzle.uniqueSort( results );
        +	}
        +
        +	return results;
        +};
        +
        +Sizzle.uniqueSort = function( results ) {
        +	if ( sortOrder ) {
        +		hasDuplicate = baseHasDuplicate;
        +		results.sort( sortOrder );
        +
        +		if ( hasDuplicate ) {
        +			for ( var i = 1; i < results.length; i++ ) {
        +				if ( results[i] === results[ i - 1 ] ) {
        +					results.splice( i--, 1 );
        +				}
        +			}
        +		}
        +	}
        +
        +	return results;
        +};
        +
        +Sizzle.matches = function( expr, set ) {
        +	return Sizzle( expr, null, null, set );
        +};
        +
        +Sizzle.matchesSelector = function( node, expr ) {
        +	return Sizzle( expr, null, null, [node] ).length > 0;
        +};
        +
        +Sizzle.find = function( expr, context, isXML ) {
        +	var set, i, len, match, type, left;
        +
        +	if ( !expr ) {
        +		return [];
        +	}
        +
        +	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
        +		type = Expr.order[i];
        +
        +		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
        +			left = match[1];
        +			match.splice( 1, 1 );
        +
        +			if ( left.substr( left.length - 1 ) !== "\\" ) {
        +				match[1] = (match[1] || "").replace( rBackslash, "" );
        +				set = Expr.find[ type ]( match, context, isXML );
        +
        +				if ( set != null ) {
        +					expr = expr.replace( Expr.match[ type ], "" );
        +					break;
        +				}
        +			}
        +		}
        +	}
        +
        +	if ( !set ) {
        +		set = typeof context.getElementsByTagName !== "undefined" ?
        +			context.getElementsByTagName( "*" ) :
        +			[];
        +	}
        +
        +	return { set: set, expr: expr };
        +};
        +
        +Sizzle.filter = function( expr, set, inplace, not ) {
        +	var match, anyFound,
        +		type, found, item, filter, left,
        +		i, pass,
        +		old = expr,
        +		result = [],
        +		curLoop = set,
        +		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
        +
        +	while ( expr && set.length ) {
        +		for ( type in Expr.filter ) {
        +			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
        +				filter = Expr.filter[ type ];
        +				left = match[1];
        +
        +				anyFound = false;
        +
        +				match.splice(1,1);
        +
        +				if ( left.substr( left.length - 1 ) === "\\" ) {
        +					continue;
        +				}
        +
        +				if ( curLoop === result ) {
        +					result = [];
        +				}
        +
        +				if ( Expr.preFilter[ type ] ) {
        +					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
        +
        +					if ( !match ) {
        +						anyFound = found = true;
        +
        +					} else if ( match === true ) {
        +						continue;
        +					}
        +				}
        +
        +				if ( match ) {
        +					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
        +						if ( item ) {
        +							found = filter( item, match, i, curLoop );
        +							pass = not ^ found;
        +
        +							if ( inplace && found != null ) {
        +								if ( pass ) {
        +									anyFound = true;
        +
        +								} else {
        +									curLoop[i] = false;
        +								}
        +
        +							} else if ( pass ) {
        +								result.push( item );
        +								anyFound = true;
        +							}
        +						}
        +					}
        +				}
        +
        +				if ( found !== undefined ) {
        +					if ( !inplace ) {
        +						curLoop = result;
        +					}
        +
        +					expr = expr.replace( Expr.match[ type ], "" );
        +
        +					if ( !anyFound ) {
        +						return [];
        +					}
        +
        +					break;
        +				}
        +			}
        +		}
        +
        +		// Improper expression
        +		if ( expr === old ) {
        +			if ( anyFound == null ) {
        +				Sizzle.error( expr );
        +
        +			} else {
        +				break;
        +			}
        +		}
        +
        +		old = expr;
        +	}
        +
        +	return curLoop;
        +};
        +
        +Sizzle.error = function( msg ) {
        +	throw new Error( "Syntax error, unrecognized expression: " + msg );
        +};
        +
        +/**
        + * Utility function for retreiving the text value of an array of DOM nodes
        + * @param {Array|Element} elem
        + */
        +var getText = Sizzle.getText = function( elem ) {
        +    var i, node,
        +		nodeType = elem.nodeType,
        +		ret = "";
        +
        +	if ( nodeType ) {
        +		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +			// Use textContent || innerText for elements
        +			if ( typeof elem.textContent === 'string' ) {
        +				return elem.textContent;
        +			} else if ( typeof elem.innerText === 'string' ) {
        +				// Replace IE's carriage returns
        +				return elem.innerText.replace( rReturn, '' );
        +			} else {
        +				// Traverse it's children
        +				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
        +					ret += getText( elem );
        +				}
        +			}
        +		} else if ( nodeType === 3 || nodeType === 4 ) {
        +			return elem.nodeValue;
        +		}
        +	} else {
        +
        +		// If no nodeType, this is expected to be an array
        +		for ( i = 0; (node = elem[i]); i++ ) {
        +			// Do not traverse comment nodes
        +			if ( node.nodeType !== 8 ) {
        +				ret += getText( node );
        +			}
        +		}
        +	}
        +	return ret;
        +};
        +
        +var Expr = Sizzle.selectors = {
        +	order: [ "ID", "NAME", "TAG" ],
        +
        +	match: {
        +		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
        +		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
        +		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
        +		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
        +		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
        +		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
        +		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
        +		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
        +	},
        +
        +	leftMatch: {},
        +
        +	attrMap: {
        +		"class": "className",
        +		"for": "htmlFor"
        +	},
        +
        +	attrHandle: {
        +		href: function( elem ) {
        +			return elem.getAttribute( "href" );
        +		},
        +		type: function( elem ) {
        +			return elem.getAttribute( "type" );
        +		}
        +	},
        +
        +	relative: {
        +		"+": function(checkSet, part){
        +			var isPartStr = typeof part === "string",
        +				isTag = isPartStr && !rNonWord.test( part ),
        +				isPartStrNotTag = isPartStr && !isTag;
        +
        +			if ( isTag ) {
        +				part = part.toLowerCase();
        +			}
        +
        +			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
        +				if ( (elem = checkSet[i]) ) {
        +					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
        +
        +					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
        +						elem || false :
        +						elem === part;
        +				}
        +			}
        +
        +			if ( isPartStrNotTag ) {
        +				Sizzle.filter( part, checkSet, true );
        +			}
        +		},
        +
        +		">": function( checkSet, part ) {
        +			var elem,
        +				isPartStr = typeof part === "string",
        +				i = 0,
        +				l = checkSet.length;
        +
        +			if ( isPartStr && !rNonWord.test( part ) ) {
        +				part = part.toLowerCase();
        +
        +				for ( ; i < l; i++ ) {
        +					elem = checkSet[i];
        +
        +					if ( elem ) {
        +						var parent = elem.parentNode;
        +						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
        +					}
        +				}
        +
        +			} else {
        +				for ( ; i < l; i++ ) {
        +					elem = checkSet[i];
        +
        +					if ( elem ) {
        +						checkSet[i] = isPartStr ?
        +							elem.parentNode :
        +							elem.parentNode === part;
        +					}
        +				}
        +
        +				if ( isPartStr ) {
        +					Sizzle.filter( part, checkSet, true );
        +				}
        +			}
        +		},
        +
        +		"": function(checkSet, part, isXML){
        +			var nodeCheck,
        +				doneName = done++,
        +				checkFn = dirCheck;
        +
        +			if ( typeof part === "string" && !rNonWord.test( part ) ) {
        +				part = part.toLowerCase();
        +				nodeCheck = part;
        +				checkFn = dirNodeCheck;
        +			}
        +
        +			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
        +		},
        +
        +		"~": function( checkSet, part, isXML ) {
        +			var nodeCheck,
        +				doneName = done++,
        +				checkFn = dirCheck;
        +
        +			if ( typeof part === "string" && !rNonWord.test( part ) ) {
        +				part = part.toLowerCase();
        +				nodeCheck = part;
        +				checkFn = dirNodeCheck;
        +			}
        +
        +			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
        +		}
        +	},
        +
        +	find: {
        +		ID: function( match, context, isXML ) {
        +			if ( typeof context.getElementById !== "undefined" && !isXML ) {
        +				var m = context.getElementById(match[1]);
        +				// Check parentNode to catch when Blackberry 4.6 returns
        +				// nodes that are no longer in the document #6963
        +				return m && m.parentNode ? [m] : [];
        +			}
        +		},
        +
        +		NAME: function( match, context ) {
        +			if ( typeof context.getElementsByName !== "undefined" ) {
        +				var ret = [],
        +					results = context.getElementsByName( match[1] );
        +
        +				for ( var i = 0, l = results.length; i < l; i++ ) {
        +					if ( results[i].getAttribute("name") === match[1] ) {
        +						ret.push( results[i] );
        +					}
        +				}
        +
        +				return ret.length === 0 ? null : ret;
        +			}
        +		},
        +
        +		TAG: function( match, context ) {
        +			if ( typeof context.getElementsByTagName !== "undefined" ) {
        +				return context.getElementsByTagName( match[1] );
        +			}
        +		}
        +	},
        +	preFilter: {
        +		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
        +			match = " " + match[1].replace( rBackslash, "" ) + " ";
        +
        +			if ( isXML ) {
        +				return match;
        +			}
        +
        +			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
        +				if ( elem ) {
        +					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
        +						if ( !inplace ) {
        +							result.push( elem );
        +						}
        +
        +					} else if ( inplace ) {
        +						curLoop[i] = false;
        +					}
        +				}
        +			}
        +
        +			return false;
        +		},
        +
        +		ID: function( match ) {
        +			return match[1].replace( rBackslash, "" );
        +		},
        +
        +		TAG: function( match, curLoop ) {
        +			return match[1].replace( rBackslash, "" ).toLowerCase();
        +		},
        +
        +		CHILD: function( match ) {
        +			if ( match[1] === "nth" ) {
        +				if ( !match[2] ) {
        +					Sizzle.error( match[0] );
        +				}
        +
        +				match[2] = match[2].replace(/^\+|\s*/g, '');
        +
        +				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
        +				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
        +					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
        +					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
        +
        +				// calculate the numbers (first)n+(last) including if they are negative
        +				match[2] = (test[1] + (test[2] || 1)) - 0;
        +				match[3] = test[3] - 0;
        +			}
        +			else if ( match[2] ) {
        +				Sizzle.error( match[0] );
        +			}
        +
        +			// TODO: Move to normal caching system
        +			match[0] = done++;
        +
        +			return match;
        +		},
        +
        +		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
        +			var name = match[1] = match[1].replace( rBackslash, "" );
        +
        +			if ( !isXML && Expr.attrMap[name] ) {
        +				match[1] = Expr.attrMap[name];
        +			}
        +
        +			// Handle if an un-quoted value was used
        +			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
        +
        +			if ( match[2] === "~=" ) {
        +				match[4] = " " + match[4] + " ";
        +			}
        +
        +			return match;
        +		},
        +
        +		PSEUDO: function( match, curLoop, inplace, result, not ) {
        +			if ( match[1] === "not" ) {
        +				// If we're dealing with a complex expression, or a simple one
        +				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
        +					match[3] = Sizzle(match[3], null, null, curLoop);
        +
        +				} else {
        +					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
        +
        +					if ( !inplace ) {
        +						result.push.apply( result, ret );
        +					}
        +
        +					return false;
        +				}
        +
        +			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
        +				return true;
        +			}
        +
        +			return match;
        +		},
        +
        +		POS: function( match ) {
        +			match.unshift( true );
        +
        +			return match;
        +		}
        +	},
        +
        +	filters: {
        +		enabled: function( elem ) {
        +			return elem.disabled === false && elem.type !== "hidden";
        +		},
        +
        +		disabled: function( elem ) {
        +			return elem.disabled === true;
        +		},
        +
        +		checked: function( elem ) {
        +			return elem.checked === true;
        +		},
        +
        +		selected: function( elem ) {
        +			// Accessing this property makes selected-by-default
        +			// options in Safari work properly
        +			if ( elem.parentNode ) {
        +				elem.parentNode.selectedIndex;
        +			}
        +
        +			return elem.selected === true;
        +		},
        +
        +		parent: function( elem ) {
        +			return !!elem.firstChild;
        +		},
        +
        +		empty: function( elem ) {
        +			return !elem.firstChild;
        +		},
        +
        +		has: function( elem, i, match ) {
        +			return !!Sizzle( match[3], elem ).length;
        +		},
        +
        +		header: function( elem ) {
        +			return (/h\d/i).test( elem.nodeName );
        +		},
        +
        +		text: function( elem ) {
        +			var attr = elem.getAttribute( "type" ), type = elem.type;
        +			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
        +			// use getAttribute instead to test this case
        +			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
        +		},
        +
        +		radio: function( elem ) {
        +			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
        +		},
        +
        +		checkbox: function( elem ) {
        +			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
        +		},
        +
        +		file: function( elem ) {
        +			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
        +		},
        +
        +		password: function( elem ) {
        +			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
        +		},
        +
        +		submit: function( elem ) {
        +			var name = elem.nodeName.toLowerCase();
        +			return (name === "input" || name === "button") && "submit" === elem.type;
        +		},
        +
        +		image: function( elem ) {
        +			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
        +		},
        +
        +		reset: function( elem ) {
        +			var name = elem.nodeName.toLowerCase();
        +			return (name === "input" || name === "button") && "reset" === elem.type;
        +		},
        +
        +		button: function( elem ) {
        +			var name = elem.nodeName.toLowerCase();
        +			return name === "input" && "button" === elem.type || name === "button";
        +		},
        +
        +		input: function( elem ) {
        +			return (/input|select|textarea|button/i).test( elem.nodeName );
        +		},
        +
        +		focus: function( elem ) {
        +			return elem === elem.ownerDocument.activeElement;
        +		}
        +	},
        +	setFilters: {
        +		first: function( elem, i ) {
        +			return i === 0;
        +		},
        +
        +		last: function( elem, i, match, array ) {
        +			return i === array.length - 1;
        +		},
        +
        +		even: function( elem, i ) {
        +			return i % 2 === 0;
        +		},
        +
        +		odd: function( elem, i ) {
        +			return i % 2 === 1;
        +		},
        +
        +		lt: function( elem, i, match ) {
        +			return i < match[3] - 0;
        +		},
        +
        +		gt: function( elem, i, match ) {
        +			return i > match[3] - 0;
        +		},
        +
        +		nth: function( elem, i, match ) {
        +			return match[3] - 0 === i;
        +		},
        +
        +		eq: function( elem, i, match ) {
        +			return match[3] - 0 === i;
        +		}
        +	},
        +	filter: {
        +		PSEUDO: function( elem, match, i, array ) {
        +			var name = match[1],
        +				filter = Expr.filters[ name ];
        +
        +			if ( filter ) {
        +				return filter( elem, i, match, array );
        +
        +			} else if ( name === "contains" ) {
        +				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
        +
        +			} else if ( name === "not" ) {
        +				var not = match[3];
        +
        +				for ( var j = 0, l = not.length; j < l; j++ ) {
        +					if ( not[j] === elem ) {
        +						return false;
        +					}
        +				}
        +
        +				return true;
        +
        +			} else {
        +				Sizzle.error( name );
        +			}
        +		},
        +
        +		CHILD: function( elem, match ) {
        +			var first, last,
        +				doneName, parent, cache,
        +				count, diff,
        +				type = match[1],
        +				node = elem;
        +
        +			switch ( type ) {
        +				case "only":
        +				case "first":
        +					while ( (node = node.previousSibling) ) {
        +						if ( node.nodeType === 1 ) {
        +							return false;
        +						}
        +					}
        +
        +					if ( type === "first" ) {
        +						return true;
        +					}
        +
        +					node = elem;
        +
        +					/* falls through */
        +				case "last":
        +					while ( (node = node.nextSibling) ) {
        +						if ( node.nodeType === 1 ) {
        +							return false;
        +						}
        +					}
        +
        +					return true;
        +
        +				case "nth":
        +					first = match[2];
        +					last = match[3];
        +
        +					if ( first === 1 && last === 0 ) {
        +						return true;
        +					}
        +
        +					doneName = match[0];
        +					parent = elem.parentNode;
        +
        +					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
        +						count = 0;
        +
        +						for ( node = parent.firstChild; node; node = node.nextSibling ) {
        +							if ( node.nodeType === 1 ) {
        +								node.nodeIndex = ++count;
        +							}
        +						}
        +
        +						parent[ expando ] = doneName;
        +					}
        +
        +					diff = elem.nodeIndex - last;
        +
        +					if ( first === 0 ) {
        +						return diff === 0;
        +
        +					} else {
        +						return ( diff % first === 0 && diff / first >= 0 );
        +					}
        +			}
        +		},
        +
        +		ID: function( elem, match ) {
        +			return elem.nodeType === 1 && elem.getAttribute("id") === match;
        +		},
        +
        +		TAG: function( elem, match ) {
        +			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
        +		},
        +
        +		CLASS: function( elem, match ) {
        +			return (" " + (elem.className || elem.getAttribute("class")) + " ")
        +				.indexOf( match ) > -1;
        +		},
        +
        +		ATTR: function( elem, match ) {
        +			var name = match[1],
        +				result = Sizzle.attr ?
        +					Sizzle.attr( elem, name ) :
        +					Expr.attrHandle[ name ] ?
        +					Expr.attrHandle[ name ]( elem ) :
        +					elem[ name ] != null ?
        +						elem[ name ] :
        +						elem.getAttribute( name ),
        +				value = result + "",
        +				type = match[2],
        +				check = match[4];
        +
        +			return result == null ?
        +				type === "!=" :
        +				!type && Sizzle.attr ?
        +				result != null :
        +				type === "=" ?
        +				value === check :
        +				type === "*=" ?
        +				value.indexOf(check) >= 0 :
        +				type === "~=" ?
        +				(" " + value + " ").indexOf(check) >= 0 :
        +				!check ?
        +				value && result !== false :
        +				type === "!=" ?
        +				value !== check :
        +				type === "^=" ?
        +				value.indexOf(check) === 0 :
        +				type === "$=" ?
        +				value.substr(value.length - check.length) === check :
        +				type === "|=" ?
        +				value === check || value.substr(0, check.length + 1) === check + "-" :
        +				false;
        +		},
        +
        +		POS: function( elem, match, i, array ) {
        +			var name = match[2],
        +				filter = Expr.setFilters[ name ];
        +
        +			if ( filter ) {
        +				return filter( elem, i, match, array );
        +			}
        +		}
        +	}
        +};
        +
        +var origPOS = Expr.match.POS,
        +	fescape = function(all, num){
        +		return "\\" + (num - 0 + 1);
        +	};
        +
        +for ( var type in Expr.match ) {
        +	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
        +	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
        +}
        +// Expose origPOS
        +// "global" as in regardless of relation to brackets/parens
        +Expr.match.globalPOS = origPOS;
        +
        +var makeArray = function( array, results ) {
        +	array = Array.prototype.slice.call( array, 0 );
        +
        +	if ( results ) {
        +		results.push.apply( results, array );
        +		return results;
        +	}
        +
        +	return array;
        +};
        +
        +// Perform a simple check to determine if the browser is capable of
        +// converting a NodeList to an array using builtin methods.
        +// Also verifies that the returned array holds DOM nodes
        +// (which is not the case in the Blackberry browser)
        +try {
        +	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
        +
        +// Provide a fallback method if it does not work
        +} catch( e ) {
        +	makeArray = function( array, results ) {
        +		var i = 0,
        +			ret = results || [];
        +
        +		if ( toString.call(array) === "[object Array]" ) {
        +			Array.prototype.push.apply( ret, array );
        +
        +		} else {
        +			if ( typeof array.length === "number" ) {
        +				for ( var l = array.length; i < l; i++ ) {
        +					ret.push( array[i] );
        +				}
        +
        +			} else {
        +				for ( ; array[i]; i++ ) {
        +					ret.push( array[i] );
        +				}
        +			}
        +		}
        +
        +		return ret;
        +	};
        +}
        +
        +var sortOrder, siblingCheck;
        +
        +if ( document.documentElement.compareDocumentPosition ) {
        +	sortOrder = function( a, b ) {
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +		}
        +
        +		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
        +			return a.compareDocumentPosition ? -1 : 1;
        +		}
        +
        +		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
        +	};
        +
        +} else {
        +	sortOrder = function( a, b ) {
        +		// The nodes are identical, we can exit early
        +		if ( a === b ) {
        +			hasDuplicate = true;
        +			return 0;
        +
        +		// Fallback to using sourceIndex (in IE) if it's available on both nodes
        +		} else if ( a.sourceIndex && b.sourceIndex ) {
        +			return a.sourceIndex - b.sourceIndex;
        +		}
        +
        +		var al, bl,
        +			ap = [],
        +			bp = [],
        +			aup = a.parentNode,
        +			bup = b.parentNode,
        +			cur = aup;
        +
        +		// If the nodes are siblings (or identical) we can do a quick check
        +		if ( aup === bup ) {
        +			return siblingCheck( a, b );
        +
        +		// If no parents were found then the nodes are disconnected
        +		} else if ( !aup ) {
        +			return -1;
        +
        +		} else if ( !bup ) {
        +			return 1;
        +		}
        +
        +		// Otherwise they're somewhere else in the tree so we need
        +		// to build up a full list of the parentNodes for comparison
        +		while ( cur ) {
        +			ap.unshift( cur );
        +			cur = cur.parentNode;
        +		}
        +
        +		cur = bup;
        +
        +		while ( cur ) {
        +			bp.unshift( cur );
        +			cur = cur.parentNode;
        +		}
        +
        +		al = ap.length;
        +		bl = bp.length;
        +
        +		// Start walking down the tree looking for a discrepancy
        +		for ( var i = 0; i < al && i < bl; i++ ) {
        +			if ( ap[i] !== bp[i] ) {
        +				return siblingCheck( ap[i], bp[i] );
        +			}
        +		}
        +
        +		// We ended someplace up the tree so do a sibling check
        +		return i === al ?
        +			siblingCheck( a, bp[i], -1 ) :
        +			siblingCheck( ap[i], b, 1 );
        +	};
        +
        +	siblingCheck = function( a, b, ret ) {
        +		if ( a === b ) {
        +			return ret;
        +		}
        +
        +		var cur = a.nextSibling;
        +
        +		while ( cur ) {
        +			if ( cur === b ) {
        +				return -1;
        +			}
        +
        +			cur = cur.nextSibling;
        +		}
        +
        +		return 1;
        +	};
        +}
        +
        +// Check to see if the browser returns elements by name when
        +// querying by getElementById (and provide a workaround)
        +(function(){
        +	// We're going to inject a fake input element with a specified name
        +	var form = document.createElement("div"),
        +		id = "script" + (new Date()).getTime(),
        +		root = document.documentElement;
        +
        +	form.innerHTML = "<a name='" + id + "'/>";
        +
        +	// Inject it into the root element, check its status, and remove it quickly
        +	root.insertBefore( form, root.firstChild );
        +
        +	// The workaround has to do additional checks after a getElementById
        +	// Which slows things down for other browsers (hence the branching)
        +	if ( document.getElementById( id ) ) {
        +		Expr.find.ID = function( match, context, isXML ) {
        +			if ( typeof context.getElementById !== "undefined" && !isXML ) {
        +				var m = context.getElementById(match[1]);
        +
        +				return m ?
        +					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
        +						[m] :
        +						undefined :
        +					[];
        +			}
        +		};
        +
        +		Expr.filter.ID = function( elem, match ) {
        +			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
        +
        +			return elem.nodeType === 1 && node && node.nodeValue === match;
        +		};
        +	}
        +
        +	root.removeChild( form );
        +
        +	// release memory in IE
        +	root = form = null;
        +})();
        +
        +(function(){
        +	// Check to see if the browser returns only elements
        +	// when doing getElementsByTagName("*")
        +
        +	// Create a fake element
        +	var div = document.createElement("div");
        +	div.appendChild( document.createComment("") );
        +
        +	// Make sure no comments are found
        +	if ( div.getElementsByTagName("*").length > 0 ) {
        +		Expr.find.TAG = function( match, context ) {
        +			var results = context.getElementsByTagName( match[1] );
        +
        +			// Filter out possible comments
        +			if ( match[1] === "*" ) {
        +				var tmp = [];
        +
        +				for ( var i = 0; results[i]; i++ ) {
        +					if ( results[i].nodeType === 1 ) {
        +						tmp.push( results[i] );
        +					}
        +				}
        +
        +				results = tmp;
        +			}
        +
        +			return results;
        +		};
        +	}
        +
        +	// Check to see if an attribute returns normalized href attributes
        +	div.innerHTML = "<a href='#'></a>";
        +
        +	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
        +			div.firstChild.getAttribute("href") !== "#" ) {
        +
        +		Expr.attrHandle.href = function( elem ) {
        +			return elem.getAttribute( "href", 2 );
        +		};
        +	}
        +
        +	// release memory in IE
        +	div = null;
        +})();
        +
        +if ( document.querySelectorAll ) {
        +	(function(){
        +		var oldSizzle = Sizzle,
        +			div = document.createElement("div"),
        +			id = "__sizzle__";
        +
        +		div.innerHTML = "<p class='TEST'></p>";
        +
        +		// Safari can't handle uppercase or unicode characters when
        +		// in quirks mode.
        +		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
        +			return;
        +		}
        +
        +		Sizzle = function( query, context, extra, seed ) {
        +			context = context || document;
        +
        +			// Only use querySelectorAll on non-XML documents
        +			// (ID selectors don't work in non-HTML documents)
        +			if ( !seed && !Sizzle.isXML(context) ) {
        +				// See if we find a selector to speed up
        +				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
        +
        +				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
        +					// Speed-up: Sizzle("TAG")
        +					if ( match[1] ) {
        +						return makeArray( context.getElementsByTagName( query ), extra );
        +
        +					// Speed-up: Sizzle(".CLASS")
        +					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
        +						return makeArray( context.getElementsByClassName( match[2] ), extra );
        +					}
        +				}
        +
        +				if ( context.nodeType === 9 ) {
        +					// Speed-up: Sizzle("body")
        +					// The body element only exists once, optimize finding it
        +					if ( query === "body" && context.body ) {
        +						return makeArray( [ context.body ], extra );
        +
        +					// Speed-up: Sizzle("#ID")
        +					} else if ( match && match[3] ) {
        +						var elem = context.getElementById( match[3] );
        +
        +						// Check parentNode to catch when Blackberry 4.6 returns
        +						// nodes that are no longer in the document #6963
        +						if ( elem && elem.parentNode ) {
        +							// Handle the case where IE and Opera return items
        +							// by name instead of ID
        +							if ( elem.id === match[3] ) {
        +								return makeArray( [ elem ], extra );
        +							}
        +
        +						} else {
        +							return makeArray( [], extra );
        +						}
        +					}
        +
        +					try {
        +						return makeArray( context.querySelectorAll(query), extra );
        +					} catch(qsaError) {}
        +
        +				// qSA works strangely on Element-rooted queries
        +				// We can work around this by specifying an extra ID on the root
        +				// and working up from there (Thanks to Andrew Dupont for the technique)
        +				// IE 8 doesn't work on object elements
        +				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
        +					var oldContext = context,
        +						old = context.getAttribute( "id" ),
        +						nid = old || id,
        +						hasParent = context.parentNode,
        +						relativeHierarchySelector = /^\s*[+~]/.test( query );
        +
        +					if ( !old ) {
        +						context.setAttribute( "id", nid );
        +					} else {
        +						nid = nid.replace( /'/g, "\\$&" );
        +					}
        +					if ( relativeHierarchySelector && hasParent ) {
        +						context = context.parentNode;
        +					}
        +
        +					try {
        +						if ( !relativeHierarchySelector || hasParent ) {
        +							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
        +						}
        +
        +					} catch(pseudoError) {
        +					} finally {
        +						if ( !old ) {
        +							oldContext.removeAttribute( "id" );
        +						}
        +					}
        +				}
        +			}
        +
        +			return oldSizzle(query, context, extra, seed);
        +		};
        +
        +		for ( var prop in oldSizzle ) {
        +			Sizzle[ prop ] = oldSizzle[ prop ];
        +		}
        +
        +		// release memory in IE
        +		div = null;
        +	})();
        +}
        +
        +(function(){
        +	var html = document.documentElement,
        +		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
        +
        +	if ( matches ) {
        +		// Check to see if it's possible to do matchesSelector
        +		// on a disconnected node (IE 9 fails this)
        +		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
        +			pseudoWorks = false;
        +
        +		try {
        +			// This should fail with an exception
        +			// Gecko does not error, returns false instead
        +			matches.call( document.documentElement, "[test!='']:sizzle" );
        +
        +		} catch( pseudoError ) {
        +			pseudoWorks = true;
        +		}
        +
        +		Sizzle.matchesSelector = function( node, expr ) {
        +			// Make sure that attribute selectors are quoted
        +			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
        +
        +			if ( !Sizzle.isXML( node ) ) {
        +				try {
        +					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
        +						var ret = matches.call( node, expr );
        +
        +						// IE 9's matchesSelector returns false on disconnected nodes
        +						if ( ret || !disconnectedMatch ||
        +								// As well, disconnected nodes are said to be in a document
        +								// fragment in IE 9, so check for that
        +								node.document && node.document.nodeType !== 11 ) {
        +							return ret;
        +						}
        +					}
        +				} catch(e) {}
        +			}
        +
        +			return Sizzle(expr, null, null, [node]).length > 0;
        +		};
        +	}
        +})();
        +
        +(function(){
        +	var div = document.createElement("div");
        +
        +	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
        +
        +	// Opera can't find a second classname (in 9.6)
        +	// Also, make sure that getElementsByClassName actually exists
        +	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
        +		return;
        +	}
        +
        +	// Safari caches class attributes, doesn't catch changes (in 3.2)
        +	div.lastChild.className = "e";
        +
        +	if ( div.getElementsByClassName("e").length === 1 ) {
        +		return;
        +	}
        +
        +	Expr.order.splice(1, 0, "CLASS");
        +	Expr.find.CLASS = function( match, context, isXML ) {
        +		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
        +			return context.getElementsByClassName(match[1]);
        +		}
        +	};
        +
        +	// release memory in IE
        +	div = null;
        +})();
        +
        +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
        +	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
        +		var elem = checkSet[i];
        +
        +		if ( elem ) {
        +			var match = false;
        +
        +			elem = elem[dir];
        +
        +			while ( elem ) {
        +				if ( elem[ expando ] === doneName ) {
        +					match = checkSet[elem.sizset];
        +					break;
        +				}
        +
        +				if ( elem.nodeType === 1 && !isXML ){
        +					elem[ expando ] = doneName;
        +					elem.sizset = i;
        +				}
        +
        +				if ( elem.nodeName.toLowerCase() === cur ) {
        +					match = elem;
        +					break;
        +				}
        +
        +				elem = elem[dir];
        +			}
        +
        +			checkSet[i] = match;
        +		}
        +	}
        +}
        +
        +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
        +	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
        +		var elem = checkSet[i];
        +
        +		if ( elem ) {
        +			var match = false;
        +
        +			elem = elem[dir];
        +
        +			while ( elem ) {
        +				if ( elem[ expando ] === doneName ) {
        +					match = checkSet[elem.sizset];
        +					break;
        +				}
        +
        +				if ( elem.nodeType === 1 ) {
        +					if ( !isXML ) {
        +						elem[ expando ] = doneName;
        +						elem.sizset = i;
        +					}
        +
        +					if ( typeof cur !== "string" ) {
        +						if ( elem === cur ) {
        +							match = true;
        +							break;
        +						}
        +
        +					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
        +						match = elem;
        +						break;
        +					}
        +				}
        +
        +				elem = elem[dir];
        +			}
        +
        +			checkSet[i] = match;
        +		}
        +	}
        +}
        +
        +if ( document.documentElement.contains ) {
        +	Sizzle.contains = function( a, b ) {
        +		return a !== b && (a.contains ? a.contains(b) : true);
        +	};
        +
        +} else if ( document.documentElement.compareDocumentPosition ) {
        +	Sizzle.contains = function( a, b ) {
        +		return !!(a.compareDocumentPosition(b) & 16);
        +	};
        +
        +} else {
        +	Sizzle.contains = function() {
        +		return false;
        +	};
        +}
        +
        +Sizzle.isXML = function( elem ) {
        +	// documentElement is verified for cases where it doesn't yet exist
        +	// (such as loading iframes in IE - #4833)
        +	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
        +
        +	return documentElement ? documentElement.nodeName !== "HTML" : false;
        +};
        +
        +var posProcess = function( selector, context, seed ) {
        +	var match,
        +		tmpSet = [],
        +		later = "",
        +		root = context.nodeType ? [context] : context;
        +
        +	// Position selectors must be done after the filter
        +	// And so must :not(positional) so we move all PSEUDOs to the end
        +	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
        +		later += match[0];
        +		selector = selector.replace( Expr.match.PSEUDO, "" );
        +	}
        +
        +	selector = Expr.relative[selector] ? selector + "*" : selector;
        +
        +	for ( var i = 0, l = root.length; i < l; i++ ) {
        +		Sizzle( selector, root[i], tmpSet, seed );
        +	}
        +
        +	return Sizzle.filter( later, tmpSet );
        +};
        +
        +// EXPOSE
        +// Override sizzle attribute retrieval
        +Sizzle.attr = jQuery.attr;
        +Sizzle.selectors.attrMap = {};
        +jQuery.find = Sizzle;
        +jQuery.expr = Sizzle.selectors;
        +jQuery.expr[":"] = jQuery.expr.filters;
        +jQuery.unique = Sizzle.uniqueSort;
        +jQuery.text = Sizzle.getText;
        +jQuery.isXMLDoc = Sizzle.isXML;
        +jQuery.contains = Sizzle.contains;
        +
        +
        +})();
        +
        +
        +var runtil = /Until$/,
        +	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
        +	// Note: This RegExp should be improved, or likely pulled from Sizzle
        +	rmultiselector = /,/,
        +	isSimple = /^.[^:#\[\.,]*$/,
        +	slice = Array.prototype.slice,
        +	POS = jQuery.expr.match.globalPOS,
        +	// methods guaranteed to produce a unique set when starting from a unique set
        +	guaranteedUnique = {
        +		children: true,
        +		contents: true,
        +		next: true,
        +		prev: true
        +	};
        +
        +jQuery.fn.extend({
        +	find: function( selector ) {
        +		var self = this,
        +			i, l;
        +
        +		if ( typeof selector !== "string" ) {
        +			return jQuery( selector ).filter(function() {
        +				for ( i = 0, l = self.length; i < l; i++ ) {
        +					if ( jQuery.contains( self[ i ], this ) ) {
        +						return true;
        +					}
        +				}
        +			});
        +		}
        +
        +		var ret = this.pushStack( "", "find", selector ),
        +			length, n, r;
        +
        +		for ( i = 0, l = this.length; i < l; i++ ) {
        +			length = ret.length;
        +			jQuery.find( selector, this[i], ret );
        +
        +			if ( i > 0 ) {
        +				// Make sure that the results are unique
        +				for ( n = length; n < ret.length; n++ ) {
        +					for ( r = 0; r < length; r++ ) {
        +						if ( ret[r] === ret[n] ) {
        +							ret.splice(n--, 1);
        +							break;
        +						}
        +					}
        +				}
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	has: function( target ) {
        +		var targets = jQuery( target );
        +		return this.filter(function() {
        +			for ( var i = 0, l = targets.length; i < l; i++ ) {
        +				if ( jQuery.contains( this, targets[i] ) ) {
        +					return true;
        +				}
        +			}
        +		});
        +	},
        +
        +	not: function( selector ) {
        +		return this.pushStack( winnow(this, selector, false), "not", selector);
        +	},
        +
        +	filter: function( selector ) {
        +		return this.pushStack( winnow(this, selector, true), "filter", selector );
        +	},
        +
        +	is: function( selector ) {
        +		return !!selector && (
        +			typeof selector === "string" ?
        +				// If this is a positional selector, check membership in the returned set
        +				// so $("p:first").is("p:last") won't return true for a doc with two "p".
        +				POS.test( selector ) ?
        +					jQuery( selector, this.context ).index( this[0] ) >= 0 :
        +					jQuery.filter( selector, this ).length > 0 :
        +				this.filter( selector ).length > 0 );
        +	},
        +
        +	closest: function( selectors, context ) {
        +		var ret = [], i, l, cur = this[0];
        +
        +		// Array (deprecated as of jQuery 1.7)
        +		if ( jQuery.isArray( selectors ) ) {
        +			var level = 1;
        +
        +			while ( cur && cur.ownerDocument && cur !== context ) {
        +				for ( i = 0; i < selectors.length; i++ ) {
        +
        +					if ( jQuery( cur ).is( selectors[ i ] ) ) {
        +						ret.push({ selector: selectors[ i ], elem: cur, level: level });
        +					}
        +				}
        +
        +				cur = cur.parentNode;
        +				level++;
        +			}
        +
        +			return ret;
        +		}
        +
        +		// String
        +		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
        +				jQuery( selectors, context || this.context ) :
        +				0;
        +
        +		for ( i = 0, l = this.length; i < l; i++ ) {
        +			cur = this[i];
        +
        +			while ( cur ) {
        +				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
        +					ret.push( cur );
        +					break;
        +
        +				} else {
        +					cur = cur.parentNode;
        +					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
        +						break;
        +					}
        +				}
        +			}
        +		}
        +
        +		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
        +
        +		return this.pushStack( ret, "closest", selectors );
        +	},
        +
        +	// Determine the position of an element within
        +	// the matched set of elements
        +	index: function( elem ) {
        +
        +		// No argument, return index in parent
        +		if ( !elem ) {
        +			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
        +		}
        +
        +		// index in selector
        +		if ( typeof elem === "string" ) {
        +			return jQuery.inArray( this[0], jQuery( elem ) );
        +		}
        +
        +		// Locate the position of the desired element
        +		return jQuery.inArray(
        +			// If it receives a jQuery object, the first element is used
        +			elem.jquery ? elem[0] : elem, this );
        +	},
        +
        +	add: function( selector, context ) {
        +		var set = typeof selector === "string" ?
        +				jQuery( selector, context ) :
        +				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
        +			all = jQuery.merge( this.get(), set );
        +
        +		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
        +			all :
        +			jQuery.unique( all ) );
        +	},
        +
        +	andSelf: function() {
        +		return this.add( this.prevObject );
        +	}
        +});
        +
        +// A painfully simple check to see if an element is disconnected
        +// from a document (should be improved, where feasible).
        +function isDisconnected( node ) {
        +	return !node || !node.parentNode || node.parentNode.nodeType === 11;
        +}
        +
        +jQuery.each({
        +	parent: function( elem ) {
        +		var parent = elem.parentNode;
        +		return parent && parent.nodeType !== 11 ? parent : null;
        +	},
        +	parents: function( elem ) {
        +		return jQuery.dir( elem, "parentNode" );
        +	},
        +	parentsUntil: function( elem, i, until ) {
        +		return jQuery.dir( elem, "parentNode", until );
        +	},
        +	next: function( elem ) {
        +		return jQuery.nth( elem, 2, "nextSibling" );
        +	},
        +	prev: function( elem ) {
        +		return jQuery.nth( elem, 2, "previousSibling" );
        +	},
        +	nextAll: function( elem ) {
        +		return jQuery.dir( elem, "nextSibling" );
        +	},
        +	prevAll: function( elem ) {
        +		return jQuery.dir( elem, "previousSibling" );
        +	},
        +	nextUntil: function( elem, i, until ) {
        +		return jQuery.dir( elem, "nextSibling", until );
        +	},
        +	prevUntil: function( elem, i, until ) {
        +		return jQuery.dir( elem, "previousSibling", until );
        +	},
        +	siblings: function( elem ) {
        +		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
        +	},
        +	children: function( elem ) {
        +		return jQuery.sibling( elem.firstChild );
        +	},
        +	contents: function( elem ) {
        +		return jQuery.nodeName( elem, "iframe" ) ?
        +			elem.contentDocument || elem.contentWindow.document :
        +			jQuery.makeArray( elem.childNodes );
        +	}
        +}, function( name, fn ) {
        +	jQuery.fn[ name ] = function( until, selector ) {
        +		var ret = jQuery.map( this, fn, until );
        +
        +		if ( !runtil.test( name ) ) {
        +			selector = until;
        +		}
        +
        +		if ( selector && typeof selector === "string" ) {
        +			ret = jQuery.filter( selector, ret );
        +		}
        +
        +		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
        +
        +		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
        +			ret = ret.reverse();
        +		}
        +
        +		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
        +	};
        +});
        +
        +jQuery.extend({
        +	filter: function( expr, elems, not ) {
        +		if ( not ) {
        +			expr = ":not(" + expr + ")";
        +		}
        +
        +		return elems.length === 1 ?
        +			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
        +			jQuery.find.matches(expr, elems);
        +	},
        +
        +	dir: function( elem, dir, until ) {
        +		var matched = [],
        +			cur = elem[ dir ];
        +
        +		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
        +			if ( cur.nodeType === 1 ) {
        +				matched.push( cur );
        +			}
        +			cur = cur[dir];
        +		}
        +		return matched;
        +	},
        +
        +	nth: function( cur, result, dir, elem ) {
        +		result = result || 1;
        +		var num = 0;
        +
        +		for ( ; cur; cur = cur[dir] ) {
        +			if ( cur.nodeType === 1 && ++num === result ) {
        +				break;
        +			}
        +		}
        +
        +		return cur;
        +	},
        +
        +	sibling: function( n, elem ) {
        +		var r = [];
        +
        +		for ( ; n; n = n.nextSibling ) {
        +			if ( n.nodeType === 1 && n !== elem ) {
        +				r.push( n );
        +			}
        +		}
        +
        +		return r;
        +	}
        +});
        +
        +// Implement the identical functionality for filter and not
        +function winnow( elements, qualifier, keep ) {
        +
        +	// Can't pass null or undefined to indexOf in Firefox 4
        +	// Set to 0 to skip string check
        +	qualifier = qualifier || 0;
        +
        +	if ( jQuery.isFunction( qualifier ) ) {
        +		return jQuery.grep(elements, function( elem, i ) {
        +			var retVal = !!qualifier.call( elem, i, elem );
        +			return retVal === keep;
        +		});
        +
        +	} else if ( qualifier.nodeType ) {
        +		return jQuery.grep(elements, function( elem, i ) {
        +			return ( elem === qualifier ) === keep;
        +		});
        +
        +	} else if ( typeof qualifier === "string" ) {
        +		var filtered = jQuery.grep(elements, function( elem ) {
        +			return elem.nodeType === 1;
        +		});
        +
        +		if ( isSimple.test( qualifier ) ) {
        +			return jQuery.filter(qualifier, filtered, !keep);
        +		} else {
        +			qualifier = jQuery.filter( qualifier, filtered );
        +		}
        +	}
        +
        +	return jQuery.grep(elements, function( elem, i ) {
        +		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
        +	});
        +}
        +
        +
        +
        +
        +function createSafeFragment( document ) {
        +	var list = nodeNames.split( "|" ),
        +	safeFrag = document.createDocumentFragment();
        +
        +	if ( safeFrag.createElement ) {
        +		while ( list.length ) {
        +			safeFrag.createElement(
        +				list.pop()
        +			);
        +		}
        +	}
        +	return safeFrag;
        +}
        +
        +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
        +		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
        +	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
        +	rleadingWhitespace = /^\s+/,
        +	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
        +	rtagName = /<([\w:]+)/,
        +	rtbody = /<tbody/i,
        +	rhtml = /<|&#?\w+;/,
        +	rnoInnerhtml = /<(?:script|style)/i,
        +	rnocache = /<(?:script|object|embed|option|style)/i,
        +	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
        +	// checked="checked" or checked
        +	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        +	rscriptType = /\/(java|ecma)script/i,
        +	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
        +	wrapMap = {
        +		option: [ 1, "<select multiple='multiple'>", "</select>" ],
        +		legend: [ 1, "<fieldset>", "</fieldset>" ],
        +		thead: [ 1, "<table>", "</table>" ],
        +		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
        +		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
        +		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
        +		area: [ 1, "<map>", "</map>" ],
        +		_default: [ 0, "", "" ]
        +	},
        +	safeFragment = createSafeFragment( document );
        +
        +wrapMap.optgroup = wrapMap.option;
        +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
        +wrapMap.th = wrapMap.td;
        +
        +// IE can't serialize <link> and <script> tags normally
        +if ( !jQuery.support.htmlSerialize ) {
        +	wrapMap._default = [ 1, "div<div>", "</div>" ];
        +}
        +
        +jQuery.fn.extend({
        +	text: function( value ) {
        +		return jQuery.access( this, function( value ) {
        +			return value === undefined ?
        +				jQuery.text( this ) :
        +				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
        +		}, null, value, arguments.length );
        +	},
        +
        +	wrapAll: function( html ) {
        +		if ( jQuery.isFunction( html ) ) {
        +			return this.each(function(i) {
        +				jQuery(this).wrapAll( html.call(this, i) );
        +			});
        +		}
        +
        +		if ( this[0] ) {
        +			// The elements to wrap the target around
        +			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
        +
        +			if ( this[0].parentNode ) {
        +				wrap.insertBefore( this[0] );
        +			}
        +
        +			wrap.map(function() {
        +				var elem = this;
        +
        +				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
        +					elem = elem.firstChild;
        +				}
        +
        +				return elem;
        +			}).append( this );
        +		}
        +
        +		return this;
        +	},
        +
        +	wrapInner: function( html ) {
        +		if ( jQuery.isFunction( html ) ) {
        +			return this.each(function(i) {
        +				jQuery(this).wrapInner( html.call(this, i) );
        +			});
        +		}
        +
        +		return this.each(function() {
        +			var self = jQuery( this ),
        +				contents = self.contents();
        +
        +			if ( contents.length ) {
        +				contents.wrapAll( html );
        +
        +			} else {
        +				self.append( html );
        +			}
        +		});
        +	},
        +
        +	wrap: function( html ) {
        +		var isFunction = jQuery.isFunction( html );
        +
        +		return this.each(function(i) {
        +			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
        +		});
        +	},
        +
        +	unwrap: function() {
        +		return this.parent().each(function() {
        +			if ( !jQuery.nodeName( this, "body" ) ) {
        +				jQuery( this ).replaceWith( this.childNodes );
        +			}
        +		}).end();
        +	},
        +
        +	append: function() {
        +		return this.domManip(arguments, true, function( elem ) {
        +			if ( this.nodeType === 1 ) {
        +				this.appendChild( elem );
        +			}
        +		});
        +	},
        +
        +	prepend: function() {
        +		return this.domManip(arguments, true, function( elem ) {
        +			if ( this.nodeType === 1 ) {
        +				this.insertBefore( elem, this.firstChild );
        +			}
        +		});
        +	},
        +
        +	before: function() {
        +		if ( this[0] && this[0].parentNode ) {
        +			return this.domManip(arguments, false, function( elem ) {
        +				this.parentNode.insertBefore( elem, this );
        +			});
        +		} else if ( arguments.length ) {
        +			var set = jQuery.clean( arguments );
        +			set.push.apply( set, this.toArray() );
        +			return this.pushStack( set, "before", arguments );
        +		}
        +	},
        +
        +	after: function() {
        +		if ( this[0] && this[0].parentNode ) {
        +			return this.domManip(arguments, false, function( elem ) {
        +				this.parentNode.insertBefore( elem, this.nextSibling );
        +			});
        +		} else if ( arguments.length ) {
        +			var set = this.pushStack( this, "after", arguments );
        +			set.push.apply( set, jQuery.clean(arguments) );
        +			return set;
        +		}
        +	},
        +
        +	// keepData is for internal use only--do not document
        +	remove: function( selector, keepData ) {
        +		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
        +			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
        +				if ( !keepData && elem.nodeType === 1 ) {
        +					jQuery.cleanData( elem.getElementsByTagName("*") );
        +					jQuery.cleanData( [ elem ] );
        +				}
        +
        +				if ( elem.parentNode ) {
        +					elem.parentNode.removeChild( elem );
        +				}
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	empty: function() {
        +		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
        +			// Remove element nodes and prevent memory leaks
        +			if ( elem.nodeType === 1 ) {
        +				jQuery.cleanData( elem.getElementsByTagName("*") );
        +			}
        +
        +			// Remove any remaining nodes
        +			while ( elem.firstChild ) {
        +				elem.removeChild( elem.firstChild );
        +			}
        +		}
        +
        +		return this;
        +	},
        +
        +	clone: function( dataAndEvents, deepDataAndEvents ) {
        +		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
        +		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
        +
        +		return this.map( function () {
        +			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
        +		});
        +	},
        +
        +	html: function( value ) {
        +		return jQuery.access( this, function( value ) {
        +			var elem = this[0] || {},
        +				i = 0,
        +				l = this.length;
        +
        +			if ( value === undefined ) {
        +				return elem.nodeType === 1 ?
        +					elem.innerHTML.replace( rinlinejQuery, "" ) :
        +					null;
        +			}
        +
        +
        +			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        +				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
        +				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
        +
        +				value = value.replace( rxhtmlTag, "<$1></$2>" );
        +
        +				try {
        +					for (; i < l; i++ ) {
        +						// Remove element nodes and prevent memory leaks
        +						elem = this[i] || {};
        +						if ( elem.nodeType === 1 ) {
        +							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
        +							elem.innerHTML = value;
        +						}
        +					}
        +
        +					elem = 0;
        +
        +				// If using innerHTML throws an exception, use the fallback method
        +				} catch(e) {}
        +			}
        +
        +			if ( elem ) {
        +				this.empty().append( value );
        +			}
        +		}, null, value, arguments.length );
        +	},
        +
        +	replaceWith: function( value ) {
        +		if ( this[0] && this[0].parentNode ) {
        +			// Make sure that the elements are removed from the DOM before they are inserted
        +			// this can help fix replacing a parent with child elements
        +			if ( jQuery.isFunction( value ) ) {
        +				return this.each(function(i) {
        +					var self = jQuery(this), old = self.html();
        +					self.replaceWith( value.call( this, i, old ) );
        +				});
        +			}
        +
        +			if ( typeof value !== "string" ) {
        +				value = jQuery( value ).detach();
        +			}
        +
        +			return this.each(function() {
        +				var next = this.nextSibling,
        +					parent = this.parentNode;
        +
        +				jQuery( this ).remove();
        +
        +				if ( next ) {
        +					jQuery(next).before( value );
        +				} else {
        +					jQuery(parent).append( value );
        +				}
        +			});
        +		} else {
        +			return this.length ?
        +				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
        +				this;
        +		}
        +	},
        +
        +	detach: function( selector ) {
        +		return this.remove( selector, true );
        +	},
        +
        +	domManip: function( args, table, callback ) {
        +		var results, first, fragment, parent,
        +			value = args[0],
        +			scripts = [];
        +
        +		// We can't cloneNode fragments that contain checked, in WebKit
        +		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
        +			return this.each(function() {
        +				jQuery(this).domManip( args, table, callback, true );
        +			});
        +		}
        +
        +		if ( jQuery.isFunction(value) ) {
        +			return this.each(function(i) {
        +				var self = jQuery(this);
        +				args[0] = value.call(this, i, table ? self.html() : undefined);
        +				self.domManip( args, table, callback );
        +			});
        +		}
        +
        +		if ( this[0] ) {
        +			parent = value && value.parentNode;
        +
        +			// If we're in a fragment, just use that instead of building a new one
        +			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
        +				results = { fragment: parent };
        +
        +			} else {
        +				results = jQuery.buildFragment( args, this, scripts );
        +			}
        +
        +			fragment = results.fragment;
        +
        +			if ( fragment.childNodes.length === 1 ) {
        +				first = fragment = fragment.firstChild;
        +			} else {
        +				first = fragment.firstChild;
        +			}
        +
        +			if ( first ) {
        +				table = table && jQuery.nodeName( first, "tr" );
        +
        +				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
        +					callback.call(
        +						table ?
        +							root(this[i], first) :
        +							this[i],
        +						// Make sure that we do not leak memory by inadvertently discarding
        +						// the original fragment (which might have attached data) instead of
        +						// using it; in addition, use the original fragment object for the last
        +						// item instead of first because it can end up being emptied incorrectly
        +						// in certain situations (Bug #8070).
        +						// Fragments from the fragment cache must always be cloned and never used
        +						// in place.
        +						results.cacheable || ( l > 1 && i < lastIndex ) ?
        +							jQuery.clone( fragment, true, true ) :
        +							fragment
        +					);
        +				}
        +			}
        +
        +			if ( scripts.length ) {
        +				jQuery.each( scripts, function( i, elem ) {
        +					if ( elem.src ) {
        +						jQuery.ajax({
        +							type: "GET",
        +							global: false,
        +							url: elem.src,
        +							async: false,
        +							dataType: "script"
        +						});
        +					} else {
        +						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
        +					}
        +
        +					if ( elem.parentNode ) {
        +						elem.parentNode.removeChild( elem );
        +					}
        +				});
        +			}
        +		}
        +
        +		return this;
        +	}
        +});
        +
        +function root( elem, cur ) {
        +	return jQuery.nodeName(elem, "table") ?
        +		(elem.getElementsByTagName("tbody")[0] ||
        +		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
        +		elem;
        +}
        +
        +function cloneCopyEvent( src, dest ) {
        +
        +	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
        +		return;
        +	}
        +
        +	var type, i, l,
        +		oldData = jQuery._data( src ),
        +		curData = jQuery._data( dest, oldData ),
        +		events = oldData.events;
        +
        +	if ( events ) {
        +		delete curData.handle;
        +		curData.events = {};
        +
        +		for ( type in events ) {
        +			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
        +				jQuery.event.add( dest, type, events[ type ][ i ] );
        +			}
        +		}
        +	}
        +
        +	// make the cloned public data object a copy from the original
        +	if ( curData.data ) {
        +		curData.data = jQuery.extend( {}, curData.data );
        +	}
        +}
        +
        +function cloneFixAttributes( src, dest ) {
        +	var nodeName;
        +
        +	// We do not need to do anything for non-Elements
        +	if ( dest.nodeType !== 1 ) {
        +		return;
        +	}
        +
        +	// clearAttributes removes the attributes, which we don't want,
        +	// but also removes the attachEvent events, which we *do* want
        +	if ( dest.clearAttributes ) {
        +		dest.clearAttributes();
        +	}
        +
        +	// mergeAttributes, in contrast, only merges back on the
        +	// original attributes, not the events
        +	if ( dest.mergeAttributes ) {
        +		dest.mergeAttributes( src );
        +	}
        +
        +	nodeName = dest.nodeName.toLowerCase();
        +
        +	// IE6-8 fail to clone children inside object elements that use
        +	// the proprietary classid attribute value (rather than the type
        +	// attribute) to identify the type of content to display
        +	if ( nodeName === "object" ) {
        +		dest.outerHTML = src.outerHTML;
        +
        +	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
        +		// IE6-8 fails to persist the checked state of a cloned checkbox
        +		// or radio button. Worse, IE6-7 fail to give the cloned element
        +		// a checked appearance if the defaultChecked value isn't also set
        +		if ( src.checked ) {
        +			dest.defaultChecked = dest.checked = src.checked;
        +		}
        +
        +		// IE6-7 get confused and end up setting the value of a cloned
        +		// checkbox/radio button to an empty string instead of "on"
        +		if ( dest.value !== src.value ) {
        +			dest.value = src.value;
        +		}
        +
        +	// IE6-8 fails to return the selected option to the default selected
        +	// state when cloning options
        +	} else if ( nodeName === "option" ) {
        +		dest.selected = src.defaultSelected;
        +
        +	// IE6-8 fails to set the defaultValue to the correct value when
        +	// cloning other types of input fields
        +	} else if ( nodeName === "input" || nodeName === "textarea" ) {
        +		dest.defaultValue = src.defaultValue;
        +
        +	// IE blanks contents when cloning scripts
        +	} else if ( nodeName === "script" && dest.text !== src.text ) {
        +		dest.text = src.text;
        +	}
        +
        +	// Event data gets referenced instead of copied if the expando
        +	// gets copied too
        +	dest.removeAttribute( jQuery.expando );
        +
        +	// Clear flags for bubbling special change/submit events, they must
        +	// be reattached when the newly cloned events are first activated
        +	dest.removeAttribute( "_submit_attached" );
        +	dest.removeAttribute( "_change_attached" );
        +}
        +
        +jQuery.buildFragment = function( args, nodes, scripts ) {
        +	var fragment, cacheable, cacheresults, doc,
        +	first = args[ 0 ];
        +
        +	// nodes may contain either an explicit document object,
        +	// a jQuery collection or context object.
        +	// If nodes[0] contains a valid object to assign to doc
        +	if ( nodes && nodes[0] ) {
        +		doc = nodes[0].ownerDocument || nodes[0];
        +	}
        +
        +	// Ensure that an attr object doesn't incorrectly stand in as a document object
        +	// Chrome and Firefox seem to allow this to occur and will throw exception
        +	// Fixes #8950
        +	if ( !doc.createDocumentFragment ) {
        +		doc = document;
        +	}
        +
        +	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
        +	// Cloning options loses the selected state, so don't cache them
        +	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
        +	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
        +	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
        +	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
        +		first.charAt(0) === "<" && !rnocache.test( first ) &&
        +		(jQuery.support.checkClone || !rchecked.test( first )) &&
        +		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
        +
        +		cacheable = true;
        +
        +		cacheresults = jQuery.fragments[ first ];
        +		if ( cacheresults && cacheresults !== 1 ) {
        +			fragment = cacheresults;
        +		}
        +	}
        +
        +	if ( !fragment ) {
        +		fragment = doc.createDocumentFragment();
        +		jQuery.clean( args, doc, fragment, scripts );
        +	}
        +
        +	if ( cacheable ) {
        +		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
        +	}
        +
        +	return { fragment: fragment, cacheable: cacheable };
        +};
        +
        +jQuery.fragments = {};
        +
        +jQuery.each({
        +	appendTo: "append",
        +	prependTo: "prepend",
        +	insertBefore: "before",
        +	insertAfter: "after",
        +	replaceAll: "replaceWith"
        +}, function( name, original ) {
        +	jQuery.fn[ name ] = function( selector ) {
        +		var ret = [],
        +			insert = jQuery( selector ),
        +			parent = this.length === 1 && this[0].parentNode;
        +
        +		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
        +			insert[ original ]( this[0] );
        +			return this;
        +
        +		} else {
        +			for ( var i = 0, l = insert.length; i < l; i++ ) {
        +				var elems = ( i > 0 ? this.clone(true) : this ).get();
        +				jQuery( insert[i] )[ original ]( elems );
        +				ret = ret.concat( elems );
        +			}
        +
        +			return this.pushStack( ret, name, insert.selector );
        +		}
        +	};
        +});
        +
        +function getAll( elem ) {
        +	if ( typeof elem.getElementsByTagName !== "undefined" ) {
        +		return elem.getElementsByTagName( "*" );
        +
        +	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
        +		return elem.querySelectorAll( "*" );
        +
        +	} else {
        +		return [];
        +	}
        +}
        +
        +// Used in clean, fixes the defaultChecked property
        +function fixDefaultChecked( elem ) {
        +	if ( elem.type === "checkbox" || elem.type === "radio" ) {
        +		elem.defaultChecked = elem.checked;
        +	}
        +}
        +// Finds all inputs and passes them to fixDefaultChecked
        +function findInputs( elem ) {
        +	var nodeName = ( elem.nodeName || "" ).toLowerCase();
        +	if ( nodeName === "input" ) {
        +		fixDefaultChecked( elem );
        +	// Skip scripts, get other children
        +	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
        +		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
        +	}
        +}
        +
        +// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
        +function shimCloneNode( elem ) {
        +	var div = document.createElement( "div" );
        +	safeFragment.appendChild( div );
        +
        +	div.innerHTML = elem.outerHTML;
        +	return div.firstChild;
        +}
        +
        +jQuery.extend({
        +	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
        +		var srcElements,
        +			destElements,
        +			i,
        +			// IE<=8 does not properly clone detached, unknown element nodes
        +			clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
        +				elem.cloneNode( true ) :
        +				shimCloneNode( elem );
        +
        +		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
        +				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
        +			// IE copies events bound via attachEvent when using cloneNode.
        +			// Calling detachEvent on the clone will also remove the events
        +			// from the original. In order to get around this, we use some
        +			// proprietary methods to clear the events. Thanks to MooTools
        +			// guys for this hotness.
        +
        +			cloneFixAttributes( elem, clone );
        +
        +			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
        +			srcElements = getAll( elem );
        +			destElements = getAll( clone );
        +
        +			// Weird iteration because IE will replace the length property
        +			// with an element if you are cloning the body and one of the
        +			// elements on the page has a name or id of "length"
        +			for ( i = 0; srcElements[i]; ++i ) {
        +				// Ensure that the destination node is not null; Fixes #9587
        +				if ( destElements[i] ) {
        +					cloneFixAttributes( srcElements[i], destElements[i] );
        +				}
        +			}
        +		}
        +
        +		// Copy the events from the original to the clone
        +		if ( dataAndEvents ) {
        +			cloneCopyEvent( elem, clone );
        +
        +			if ( deepDataAndEvents ) {
        +				srcElements = getAll( elem );
        +				destElements = getAll( clone );
        +
        +				for ( i = 0; srcElements[i]; ++i ) {
        +					cloneCopyEvent( srcElements[i], destElements[i] );
        +				}
        +			}
        +		}
        +
        +		srcElements = destElements = null;
        +
        +		// Return the cloned set
        +		return clone;
        +	},
        +
        +	clean: function( elems, context, fragment, scripts ) {
        +		var checkScriptType, script, j,
        +				ret = [];
        +
        +		context = context || document;
        +
        +		// !context.createElement fails in IE with an error but returns typeof 'object'
        +		if ( typeof context.createElement === "undefined" ) {
        +			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
        +		}
        +
        +		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
        +			if ( typeof elem === "number" ) {
        +				elem += "";
        +			}
        +
        +			if ( !elem ) {
        +				continue;
        +			}
        +
        +			// Convert html string into DOM nodes
        +			if ( typeof elem === "string" ) {
        +				if ( !rhtml.test( elem ) ) {
        +					elem = context.createTextNode( elem );
        +				} else {
        +					// Fix "XHTML"-style tags in all browsers
        +					elem = elem.replace(rxhtmlTag, "<$1></$2>");
        +
        +					// Trim whitespace, otherwise indexOf won't work as expected
        +					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
        +						wrap = wrapMap[ tag ] || wrapMap._default,
        +						depth = wrap[0],
        +						div = context.createElement("div"),
        +						safeChildNodes = safeFragment.childNodes,
        +						remove;
        +
        +					// Append wrapper element to unknown element safe doc fragment
        +					if ( context === document ) {
        +						// Use the fragment we've already created for this document
        +						safeFragment.appendChild( div );
        +					} else {
        +						// Use a fragment created with the owner document
        +						createSafeFragment( context ).appendChild( div );
        +					}
        +
        +					// Go to html and back, then peel off extra wrappers
        +					div.innerHTML = wrap[1] + elem + wrap[2];
        +
        +					// Move to the right depth
        +					while ( depth-- ) {
        +						div = div.lastChild;
        +					}
        +
        +					// Remove IE's autoinserted <tbody> from table fragments
        +					if ( !jQuery.support.tbody ) {
        +
        +						// String was a <table>, *may* have spurious <tbody>
        +						var hasBody = rtbody.test(elem),
        +							tbody = tag === "table" && !hasBody ?
        +								div.firstChild && div.firstChild.childNodes :
        +
        +								// String was a bare <thead> or <tfoot>
        +								wrap[1] === "<table>" && !hasBody ?
        +									div.childNodes :
        +									[];
        +
        +						for ( j = tbody.length - 1; j >= 0 ; --j ) {
        +							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
        +								tbody[ j ].parentNode.removeChild( tbody[ j ] );
        +							}
        +						}
        +					}
        +
        +					// IE completely kills leading whitespace when innerHTML is used
        +					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
        +						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
        +					}
        +
        +					elem = div.childNodes;
        +
        +					// Clear elements from DocumentFragment (safeFragment or otherwise)
        +					// to avoid hoarding elements. Fixes #11356
        +					if ( div ) {
        +						div.parentNode.removeChild( div );
        +
        +						// Guard against -1 index exceptions in FF3.6
        +						if ( safeChildNodes.length > 0 ) {
        +							remove = safeChildNodes[ safeChildNodes.length - 1 ];
        +
        +							if ( remove && remove.parentNode ) {
        +								remove.parentNode.removeChild( remove );
        +							}
        +						}
        +					}
        +				}
        +			}
        +
        +			// Resets defaultChecked for any radios and checkboxes
        +			// about to be appended to the DOM in IE 6/7 (#8060)
        +			var len;
        +			if ( !jQuery.support.appendChecked ) {
        +				if ( elem[0] && typeof (len = elem.length) === "number" ) {
        +					for ( j = 0; j < len; j++ ) {
        +						findInputs( elem[j] );
        +					}
        +				} else {
        +					findInputs( elem );
        +				}
        +			}
        +
        +			if ( elem.nodeType ) {
        +				ret.push( elem );
        +			} else {
        +				ret = jQuery.merge( ret, elem );
        +			}
        +		}
        +
        +		if ( fragment ) {
        +			checkScriptType = function( elem ) {
        +				return !elem.type || rscriptType.test( elem.type );
        +			};
        +			for ( i = 0; ret[i]; i++ ) {
        +				script = ret[i];
        +				if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
        +					scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
        +
        +				} else {
        +					if ( script.nodeType === 1 ) {
        +						var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
        +
        +						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
        +					}
        +					fragment.appendChild( script );
        +				}
        +			}
        +		}
        +
        +		return ret;
        +	},
        +
        +	cleanData: function( elems ) {
        +		var data, id,
        +			cache = jQuery.cache,
        +			special = jQuery.event.special,
        +			deleteExpando = jQuery.support.deleteExpando;
        +
        +		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
        +			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
        +				continue;
        +			}
        +
        +			id = elem[ jQuery.expando ];
        +
        +			if ( id ) {
        +				data = cache[ id ];
        +
        +				if ( data && data.events ) {
        +					for ( var type in data.events ) {
        +						if ( special[ type ] ) {
        +							jQuery.event.remove( elem, type );
        +
        +						// This is a shortcut to avoid jQuery.event.remove's overhead
        +						} else {
        +							jQuery.removeEvent( elem, type, data.handle );
        +						}
        +					}
        +
        +					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
        +					if ( data.handle ) {
        +						data.handle.elem = null;
        +					}
        +				}
        +
        +				if ( deleteExpando ) {
        +					delete elem[ jQuery.expando ];
        +
        +				} else if ( elem.removeAttribute ) {
        +					elem.removeAttribute( jQuery.expando );
        +				}
        +
        +				delete cache[ id ];
        +			}
        +		}
        +	}
        +});
        +
        +
        +
        +
        +var ralpha = /alpha\([^)]*\)/i,
        +	ropacity = /opacity=([^)]*)/,
        +	// fixed for IE9, see #8346
        +	rupper = /([A-Z]|^ms)/g,
        +	rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
        +	rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
        +	rrelNum = /^([\-+])=([\-+.\de]+)/,
        +	rmargin = /^margin/,
        +
        +	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        +
        +	// order is important!
        +	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
        +
        +	curCSS,
        +
        +	getComputedStyle,
        +	currentStyle;
        +
        +jQuery.fn.css = function( name, value ) {
        +	return jQuery.access( this, function( elem, name, value ) {
        +		return value !== undefined ?
        +			jQuery.style( elem, name, value ) :
        +			jQuery.css( elem, name );
        +	}, name, value, arguments.length > 1 );
        +};
        +
        +jQuery.extend({
        +	// Add in style property hooks for overriding the default
        +	// behavior of getting and setting a style property
        +	cssHooks: {
        +		opacity: {
        +			get: function( elem, computed ) {
        +				if ( computed ) {
        +					// We should always get a number back from opacity
        +					var ret = curCSS( elem, "opacity" );
        +					return ret === "" ? "1" : ret;
        +
        +				} else {
        +					return elem.style.opacity;
        +				}
        +			}
        +		}
        +	},
        +
        +	// Exclude the following css properties to add px
        +	cssNumber: {
        +		"fillOpacity": true,
        +		"fontWeight": true,
        +		"lineHeight": true,
        +		"opacity": true,
        +		"orphans": true,
        +		"widows": true,
        +		"zIndex": true,
        +		"zoom": true
        +	},
        +
        +	// Add in properties whose names you wish to fix before
        +	// setting or getting the value
        +	cssProps: {
        +		// normalize float css property
        +		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
        +	},
        +
        +	// Get and set the style property on a DOM Node
        +	style: function( elem, name, value, extra ) {
        +		// Don't set styles on text and comment nodes
        +		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        +			return;
        +		}
        +
        +		// Make sure that we're working with the right name
        +		var ret, type, origName = jQuery.camelCase( name ),
        +			style = elem.style, hooks = jQuery.cssHooks[ origName ];
        +
        +		name = jQuery.cssProps[ origName ] || origName;
        +
        +		// Check if we're setting a value
        +		if ( value !== undefined ) {
        +			type = typeof value;
        +
        +			// convert relative number strings (+= or -=) to relative numbers. #7345
        +			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
        +				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
        +				// Fixes bug #9237
        +				type = "number";
        +			}
        +
        +			// Make sure that NaN and null values aren't set. See: #7116
        +			if ( value == null || type === "number" && isNaN( value ) ) {
        +				return;
        +			}
        +
        +			// If a number was passed in, add 'px' to the (except for certain CSS properties)
        +			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
        +				value += "px";
        +			}
        +
        +			// If a hook was provided, use that value, otherwise just set the specified value
        +			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
        +				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
        +				// Fixes bug #5509
        +				try {
        +					style[ name ] = value;
        +				} catch(e) {}
        +			}
        +
        +		} else {
        +			// If a hook was provided get the non-computed value from there
        +			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
        +				return ret;
        +			}
        +
        +			// Otherwise just get the value from the style object
        +			return style[ name ];
        +		}
        +	},
        +
        +	css: function( elem, name, extra ) {
        +		var ret, hooks;
        +
        +		// Make sure that we're working with the right name
        +		name = jQuery.camelCase( name );
        +		hooks = jQuery.cssHooks[ name ];
        +		name = jQuery.cssProps[ name ] || name;
        +
        +		// cssFloat needs a special treatment
        +		if ( name === "cssFloat" ) {
        +			name = "float";
        +		}
        +
        +		// If a hook was provided get the computed value from there
        +		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
        +			return ret;
        +
        +		// Otherwise, if a way to get the computed value exists, use that
        +		} else if ( curCSS ) {
        +			return curCSS( elem, name );
        +		}
        +	},
        +
        +	// A method for quickly swapping in/out CSS properties to get correct calculations
        +	swap: function( elem, options, callback ) {
        +		var old = {},
        +			ret, name;
        +
        +		// Remember the old values, and insert the new ones
        +		for ( name in options ) {
        +			old[ name ] = elem.style[ name ];
        +			elem.style[ name ] = options[ name ];
        +		}
        +
        +		ret = callback.call( elem );
        +
        +		// Revert the old values
        +		for ( name in options ) {
        +			elem.style[ name ] = old[ name ];
        +		}
        +
        +		return ret;
        +	}
        +});
        +
        +// DEPRECATED in 1.3, Use jQuery.css() instead
        +jQuery.curCSS = jQuery.css;
        +
        +if ( document.defaultView && document.defaultView.getComputedStyle ) {
        +	getComputedStyle = function( elem, name ) {
        +		var ret, defaultView, computedStyle, width,
        +			style = elem.style;
        +
        +		name = name.replace( rupper, "-$1" ).toLowerCase();
        +
        +		if ( (defaultView = elem.ownerDocument.defaultView) &&
        +				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
        +
        +			ret = computedStyle.getPropertyValue( name );
        +			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
        +				ret = jQuery.style( elem, name );
        +			}
        +		}
        +
        +		// A tribute to the "awesome hack by Dean Edwards"
        +		// WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
        +		// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
        +		if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
        +			width = style.width;
        +			style.width = ret;
        +			ret = computedStyle.width;
        +			style.width = width;
        +		}
        +
        +		return ret;
        +	};
        +}
        +
        +if ( document.documentElement.currentStyle ) {
        +	currentStyle = function( elem, name ) {
        +		var left, rsLeft, uncomputed,
        +			ret = elem.currentStyle && elem.currentStyle[ name ],
        +			style = elem.style;
        +
        +		// Avoid setting ret to empty string here
        +		// so we don't default to auto
        +		if ( ret == null && style && (uncomputed = style[ name ]) ) {
        +			ret = uncomputed;
        +		}
        +
        +		// From the awesome hack by Dean Edwards
        +		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
        +
        +		// If we're not dealing with a regular pixel number
        +		// but a number that has a weird ending, we need to convert it to pixels
        +		if ( rnumnonpx.test( ret ) ) {
        +
        +			// Remember the original values
        +			left = style.left;
        +			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
        +
        +			// Put in the new values to get a computed value out
        +			if ( rsLeft ) {
        +				elem.runtimeStyle.left = elem.currentStyle.left;
        +			}
        +			style.left = name === "fontSize" ? "1em" : ret;
        +			ret = style.pixelLeft + "px";
        +
        +			// Revert the changed values
        +			style.left = left;
        +			if ( rsLeft ) {
        +				elem.runtimeStyle.left = rsLeft;
        +			}
        +		}
        +
        +		return ret === "" ? "auto" : ret;
        +	};
        +}
        +
        +curCSS = getComputedStyle || currentStyle;
        +
        +function getWidthOrHeight( elem, name, extra ) {
        +
        +	// Start with offset property
        +	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
        +		i = name === "width" ? 1 : 0,
        +		len = 4;
        +
        +	if ( val > 0 ) {
        +		if ( extra !== "border" ) {
        +			for ( ; i < len; i += 2 ) {
        +				if ( !extra ) {
        +					val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
        +				}
        +				if ( extra === "margin" ) {
        +					val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
        +				} else {
        +					val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
        +				}
        +			}
        +		}
        +
        +		return val + "px";
        +	}
        +
        +	// Fall back to computed then uncomputed css if necessary
        +	val = curCSS( elem, name );
        +	if ( val < 0 || val == null ) {
        +		val = elem.style[ name ];
        +	}
        +
        +	// Computed unit is not pixels. Stop here and return.
        +	if ( rnumnonpx.test(val) ) {
        +		return val;
        +	}
        +
        +	// Normalize "", auto, and prepare for extra
        +	val = parseFloat( val ) || 0;
        +
        +	// Add padding, border, margin
        +	if ( extra ) {
        +		for ( ; i < len; i += 2 ) {
        +			val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
        +			if ( extra !== "padding" ) {
        +				val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
        +			}
        +			if ( extra === "margin" ) {
        +				val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
        +			}
        +		}
        +	}
        +
        +	return val + "px";
        +}
        +
        +jQuery.each([ "height", "width" ], function( i, name ) {
        +	jQuery.cssHooks[ name ] = {
        +		get: function( elem, computed, extra ) {
        +			if ( computed ) {
        +				if ( elem.offsetWidth !== 0 ) {
        +					return getWidthOrHeight( elem, name, extra );
        +				} else {
        +					return jQuery.swap( elem, cssShow, function() {
        +						return getWidthOrHeight( elem, name, extra );
        +					});
        +				}
        +			}
        +		},
        +
        +		set: function( elem, value ) {
        +			return rnum.test( value ) ?
        +				value + "px" :
        +				value;
        +		}
        +	};
        +});
        +
        +if ( !jQuery.support.opacity ) {
        +	jQuery.cssHooks.opacity = {
        +		get: function( elem, computed ) {
        +			// IE uses filters for opacity
        +			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
        +				( parseFloat( RegExp.$1 ) / 100 ) + "" :
        +				computed ? "1" : "";
        +		},
        +
        +		set: function( elem, value ) {
        +			var style = elem.style,
        +				currentStyle = elem.currentStyle,
        +				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
        +				filter = currentStyle && currentStyle.filter || style.filter || "";
        +
        +			// IE has trouble with opacity if it does not have layout
        +			// Force it by setting the zoom level
        +			style.zoom = 1;
        +
        +			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
        +			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
        +
        +				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
        +				// if "filter:" is present at all, clearType is disabled, we want to avoid this
        +				// style.removeAttribute is IE Only, but so apparently is this code path...
        +				style.removeAttribute( "filter" );
        +
        +				// if there there is no filter style applied in a css rule, we are done
        +				if ( currentStyle && !currentStyle.filter ) {
        +					return;
        +				}
        +			}
        +
        +			// otherwise, set new filter values
        +			style.filter = ralpha.test( filter ) ?
        +				filter.replace( ralpha, opacity ) :
        +				filter + " " + opacity;
        +		}
        +	};
        +}
        +
        +jQuery(function() {
        +	// This hook cannot be added until DOM ready because the support test
        +	// for it is not run until after DOM ready
        +	if ( !jQuery.support.reliableMarginRight ) {
        +		jQuery.cssHooks.marginRight = {
        +			get: function( elem, computed ) {
        +				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +				// Work around by temporarily setting element display to inline-block
        +				return jQuery.swap( elem, { "display": "inline-block" }, function() {
        +					if ( computed ) {
        +						return curCSS( elem, "margin-right" );
        +					} else {
        +						return elem.style.marginRight;
        +					}
        +				});
        +			}
        +		};
        +	}
        +});
        +
        +if ( jQuery.expr && jQuery.expr.filters ) {
        +	jQuery.expr.filters.hidden = function( elem ) {
        +		var width = elem.offsetWidth,
        +			height = elem.offsetHeight;
        +
        +		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
        +	};
        +
        +	jQuery.expr.filters.visible = function( elem ) {
        +		return !jQuery.expr.filters.hidden( elem );
        +	};
        +}
        +
        +// These hooks are used by animate to expand properties
        +jQuery.each({
        +	margin: "",
        +	padding: "",
        +	border: "Width"
        +}, function( prefix, suffix ) {
        +
        +	jQuery.cssHooks[ prefix + suffix ] = {
        +		expand: function( value ) {
        +			var i,
        +
        +				// assumes a single number if not a string
        +				parts = typeof value === "string" ? value.split(" ") : [ value ],
        +				expanded = {};
        +
        +			for ( i = 0; i < 4; i++ ) {
        +				expanded[ prefix + cssExpand[ i ] + suffix ] =
        +					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
        +			}
        +
        +			return expanded;
        +		}
        +	};
        +});
        +
        +
        +
        +
        +var r20 = /%20/g,
        +	rbracket = /\[\]$/,
        +	rCRLF = /\r?\n/g,
        +	rhash = /#.*$/,
        +	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
        +	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
        +	// #7653, #8125, #8152: local protocol detection
        +	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
        +	rnoContent = /^(?:GET|HEAD)$/,
        +	rprotocol = /^\/\//,
        +	rquery = /\?/,
        +	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
        +	rselectTextarea = /^(?:select|textarea)/i,
        +	rspacesAjax = /\s+/,
        +	rts = /([?&])_=[^&]*/,
        +	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
        +
        +	// Keep a copy of the old load method
        +	_load = jQuery.fn.load,
        +
        +	/* Prefilters
        +	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
        +	 * 2) These are called:
        +	 *    - BEFORE asking for a transport
        +	 *    - AFTER param serialization (s.data is a string if s.processData is true)
        +	 * 3) key is the dataType
        +	 * 4) the catchall symbol "*" can be used
        +	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
        +	 */
        +	prefilters = {},
        +
        +	/* Transports bindings
        +	 * 1) key is the dataType
        +	 * 2) the catchall symbol "*" can be used
        +	 * 3) selection will start with transport dataType and THEN go to "*" if needed
        +	 */
        +	transports = {},
        +
        +	// Document location
        +	ajaxLocation,
        +
        +	// Document location segments
        +	ajaxLocParts,
        +
        +	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        +	allTypes = ["*/"] + ["*"];
        +
        +// #8138, IE may throw an exception when accessing
        +// a field from window.location if document.domain has been set
        +try {
        +	ajaxLocation = location.href;
        +} catch( e ) {
        +	// Use the href attribute of an A element
        +	// since IE will modify it given document.location
        +	ajaxLocation = document.createElement( "a" );
        +	ajaxLocation.href = "";
        +	ajaxLocation = ajaxLocation.href;
        +}
        +
        +// Segment location into parts
        +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
        +
        +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
        +function addToPrefiltersOrTransports( structure ) {
        +
        +	// dataTypeExpression is optional and defaults to "*"
        +	return function( dataTypeExpression, func ) {
        +
        +		if ( typeof dataTypeExpression !== "string" ) {
        +			func = dataTypeExpression;
        +			dataTypeExpression = "*";
        +		}
        +
        +		if ( jQuery.isFunction( func ) ) {
        +			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
        +				i = 0,
        +				length = dataTypes.length,
        +				dataType,
        +				list,
        +				placeBefore;
        +
        +			// For each dataType in the dataTypeExpression
        +			for ( ; i < length; i++ ) {
        +				dataType = dataTypes[ i ];
        +				// We control if we're asked to add before
        +				// any existing element
        +				placeBefore = /^\+/.test( dataType );
        +				if ( placeBefore ) {
        +					dataType = dataType.substr( 1 ) || "*";
        +				}
        +				list = structure[ dataType ] = structure[ dataType ] || [];
        +				// then we add to the structure accordingly
        +				list[ placeBefore ? "unshift" : "push" ]( func );
        +			}
        +		}
        +	};
        +}
        +
        +// Base inspection function for prefilters and transports
        +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
        +		dataType /* internal */, inspected /* internal */ ) {
        +
        +	dataType = dataType || options.dataTypes[ 0 ];
        +	inspected = inspected || {};
        +
        +	inspected[ dataType ] = true;
        +
        +	var list = structure[ dataType ],
        +		i = 0,
        +		length = list ? list.length : 0,
        +		executeOnly = ( structure === prefilters ),
        +		selection;
        +
        +	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
        +		selection = list[ i ]( options, originalOptions, jqXHR );
        +		// If we got redirected to another dataType
        +		// we try there if executing only and not done already
        +		if ( typeof selection === "string" ) {
        +			if ( !executeOnly || inspected[ selection ] ) {
        +				selection = undefined;
        +			} else {
        +				options.dataTypes.unshift( selection );
        +				selection = inspectPrefiltersOrTransports(
        +						structure, options, originalOptions, jqXHR, selection, inspected );
        +			}
        +		}
        +	}
        +	// If we're only executing or nothing was selected
        +	// we try the catchall dataType if not done already
        +	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
        +		selection = inspectPrefiltersOrTransports(
        +				structure, options, originalOptions, jqXHR, "*", inspected );
        +	}
        +	// unnecessary when only executing (prefilters)
        +	// but it'll be ignored by the caller in that case
        +	return selection;
        +}
        +
        +// A special extend for ajax options
        +// that takes "flat" options (not to be deep extended)
        +// Fixes #9887
        +function ajaxExtend( target, src ) {
        +	var key, deep,
        +		flatOptions = jQuery.ajaxSettings.flatOptions || {};
        +	for ( key in src ) {
        +		if ( src[ key ] !== undefined ) {
        +			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
        +		}
        +	}
        +	if ( deep ) {
        +		jQuery.extend( true, target, deep );
        +	}
        +}
        +
        +jQuery.fn.extend({
        +	load: function( url, params, callback ) {
        +		if ( typeof url !== "string" && _load ) {
        +			return _load.apply( this, arguments );
        +
        +		// Don't do a request if no elements are being requested
        +		} else if ( !this.length ) {
        +			return this;
        +		}
        +
        +		var off = url.indexOf( " " );
        +		if ( off >= 0 ) {
        +			var selector = url.slice( off, url.length );
        +			url = url.slice( 0, off );
        +		}
        +
        +		// Default to a GET request
        +		var type = "GET";
        +
        +		// If the second parameter was provided
        +		if ( params ) {
        +			// If it's a function
        +			if ( jQuery.isFunction( params ) ) {
        +				// We assume that it's the callback
        +				callback = params;
        +				params = undefined;
        +
        +			// Otherwise, build a param string
        +			} else if ( typeof params === "object" ) {
        +				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
        +				type = "POST";
        +			}
        +		}
        +
        +		var self = this;
        +
        +		// Request the remote document
        +		jQuery.ajax({
        +			url: url,
        +			type: type,
        +			dataType: "html",
        +			data: params,
        +			// Complete callback (responseText is used internally)
        +			complete: function( jqXHR, status, responseText ) {
        +				// Store the response as specified by the jqXHR object
        +				responseText = jqXHR.responseText;
        +				// If successful, inject the HTML into all the matched elements
        +				if ( jqXHR.isResolved() ) {
        +					// #4825: Get the actual response in case
        +					// a dataFilter is present in ajaxSettings
        +					jqXHR.done(function( r ) {
        +						responseText = r;
        +					});
        +					// See if a selector was specified
        +					self.html( selector ?
        +						// Create a dummy div to hold the results
        +						jQuery("<div>")
        +							// inject the contents of the document in, removing the scripts
        +							// to avoid any 'Permission Denied' errors in IE
        +							.append(responseText.replace(rscript, ""))
        +
        +							// Locate the specified elements
        +							.find(selector) :
        +
        +						// If not, just inject the full result
        +						responseText );
        +				}
        +
        +				if ( callback ) {
        +					self.each( callback, [ responseText, status, jqXHR ] );
        +				}
        +			}
        +		});
        +
        +		return this;
        +	},
        +
        +	serialize: function() {
        +		return jQuery.param( this.serializeArray() );
        +	},
        +
        +	serializeArray: function() {
        +		return this.map(function(){
        +			return this.elements ? jQuery.makeArray( this.elements ) : this;
        +		})
        +		.filter(function(){
        +			return this.name && !this.disabled &&
        +				( this.checked || rselectTextarea.test( this.nodeName ) ||
        +					rinput.test( this.type ) );
        +		})
        +		.map(function( i, elem ){
        +			var val = jQuery( this ).val();
        +
        +			return val == null ?
        +				null :
        +				jQuery.isArray( val ) ?
        +					jQuery.map( val, function( val, i ){
        +						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +					}) :
        +					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +		}).get();
        +	}
        +});
        +
        +// Attach a bunch of functions for handling common AJAX events
        +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
        +	jQuery.fn[ o ] = function( f ){
        +		return this.on( o, f );
        +	};
        +});
        +
        +jQuery.each( [ "get", "post" ], function( i, method ) {
        +	jQuery[ method ] = function( url, data, callback, type ) {
        +		// shift arguments if data argument was omitted
        +		if ( jQuery.isFunction( data ) ) {
        +			type = type || callback;
        +			callback = data;
        +			data = undefined;
        +		}
        +
        +		return jQuery.ajax({
        +			type: method,
        +			url: url,
        +			data: data,
        +			success: callback,
        +			dataType: type
        +		});
        +	};
        +});
        +
        +jQuery.extend({
        +
        +	getScript: function( url, callback ) {
        +		return jQuery.get( url, undefined, callback, "script" );
        +	},
        +
        +	getJSON: function( url, data, callback ) {
        +		return jQuery.get( url, data, callback, "json" );
        +	},
        +
        +	// Creates a full fledged settings object into target
        +	// with both ajaxSettings and settings fields.
        +	// If target is omitted, writes into ajaxSettings.
        +	ajaxSetup: function( target, settings ) {
        +		if ( settings ) {
        +			// Building a settings object
        +			ajaxExtend( target, jQuery.ajaxSettings );
        +		} else {
        +			// Extending ajaxSettings
        +			settings = target;
        +			target = jQuery.ajaxSettings;
        +		}
        +		ajaxExtend( target, settings );
        +		return target;
        +	},
        +
        +	ajaxSettings: {
        +		url: ajaxLocation,
        +		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
        +		global: true,
        +		type: "GET",
        +		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        +		processData: true,
        +		async: true,
        +		/*
        +		timeout: 0,
        +		data: null,
        +		dataType: null,
        +		username: null,
        +		password: null,
        +		cache: null,
        +		traditional: false,
        +		headers: {},
        +		*/
        +
        +		accepts: {
        +			xml: "application/xml, text/xml",
        +			html: "text/html",
        +			text: "text/plain",
        +			json: "application/json, text/javascript",
        +			"*": allTypes
        +		},
        +
        +		contents: {
        +			xml: /xml/,
        +			html: /html/,
        +			json: /json/
        +		},
        +
        +		responseFields: {
        +			xml: "responseXML",
        +			text: "responseText"
        +		},
        +
        +		// List of data converters
        +		// 1) key format is "source_type destination_type" (a single space in-between)
        +		// 2) the catchall symbol "*" can be used for source_type
        +		converters: {
        +
        +			// Convert anything to text
        +			"* text": window.String,
        +
        +			// Text to html (true = no transformation)
        +			"text html": true,
        +
        +			// Evaluate text as a json expression
        +			"text json": jQuery.parseJSON,
        +
        +			// Parse text as xml
        +			"text xml": jQuery.parseXML
        +		},
        +
        +		// For options that shouldn't be deep extended:
        +		// you can add your own custom options here if
        +		// and when you create one that shouldn't be
        +		// deep extended (see ajaxExtend)
        +		flatOptions: {
        +			context: true,
        +			url: true
        +		}
        +	},
        +
        +	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        +	ajaxTransport: addToPrefiltersOrTransports( transports ),
        +
        +	// Main method
        +	ajax: function( url, options ) {
        +
        +		// If url is an object, simulate pre-1.5 signature
        +		if ( typeof url === "object" ) {
        +			options = url;
        +			url = undefined;
        +		}
        +
        +		// Force options to be an object
        +		options = options || {};
        +
        +		var // Create the final options object
        +			s = jQuery.ajaxSetup( {}, options ),
        +			// Callbacks context
        +			callbackContext = s.context || s,
        +			// Context for global events
        +			// It's the callbackContext if one was provided in the options
        +			// and if it's a DOM node or a jQuery collection
        +			globalEventContext = callbackContext !== s &&
        +				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
        +						jQuery( callbackContext ) : jQuery.event,
        +			// Deferreds
        +			deferred = jQuery.Deferred(),
        +			completeDeferred = jQuery.Callbacks( "once memory" ),
        +			// Status-dependent callbacks
        +			statusCode = s.statusCode || {},
        +			// ifModified key
        +			ifModifiedKey,
        +			// Headers (they are sent all at once)
        +			requestHeaders = {},
        +			requestHeadersNames = {},
        +			// Response headers
        +			responseHeadersString,
        +			responseHeaders,
        +			// transport
        +			transport,
        +			// timeout handle
        +			timeoutTimer,
        +			// Cross-domain detection vars
        +			parts,
        +			// The jqXHR state
        +			state = 0,
        +			// To know if global events are to be dispatched
        +			fireGlobals,
        +			// Loop variable
        +			i,
        +			// Fake xhr
        +			jqXHR = {
        +
        +				readyState: 0,
        +
        +				// Caches the header
        +				setRequestHeader: function( name, value ) {
        +					if ( !state ) {
        +						var lname = name.toLowerCase();
        +						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
        +						requestHeaders[ name ] = value;
        +					}
        +					return this;
        +				},
        +
        +				// Raw string
        +				getAllResponseHeaders: function() {
        +					return state === 2 ? responseHeadersString : null;
        +				},
        +
        +				// Builds headers hashtable if needed
        +				getResponseHeader: function( key ) {
        +					var match;
        +					if ( state === 2 ) {
        +						if ( !responseHeaders ) {
        +							responseHeaders = {};
        +							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
        +								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
        +							}
        +						}
        +						match = responseHeaders[ key.toLowerCase() ];
        +					}
        +					return match === undefined ? null : match;
        +				},
        +
        +				// Overrides response content-type header
        +				overrideMimeType: function( type ) {
        +					if ( !state ) {
        +						s.mimeType = type;
        +					}
        +					return this;
        +				},
        +
        +				// Cancel the request
        +				abort: function( statusText ) {
        +					statusText = statusText || "abort";
        +					if ( transport ) {
        +						transport.abort( statusText );
        +					}
        +					done( 0, statusText );
        +					return this;
        +				}
        +			};
        +
        +		// Callback for when everything is done
        +		// It is defined here because jslint complains if it is declared
        +		// at the end of the function (which would be more logical and readable)
        +		function done( status, nativeStatusText, responses, headers ) {
        +
        +			// Called once
        +			if ( state === 2 ) {
        +				return;
        +			}
        +
        +			// State is "done" now
        +			state = 2;
        +
        +			// Clear timeout if it exists
        +			if ( timeoutTimer ) {
        +				clearTimeout( timeoutTimer );
        +			}
        +
        +			// Dereference transport for early garbage collection
        +			// (no matter how long the jqXHR object will be used)
        +			transport = undefined;
        +
        +			// Cache response headers
        +			responseHeadersString = headers || "";
        +
        +			// Set readyState
        +			jqXHR.readyState = status > 0 ? 4 : 0;
        +
        +			var isSuccess,
        +				success,
        +				error,
        +				statusText = nativeStatusText,
        +				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
        +				lastModified,
        +				etag;
        +
        +			// If successful, handle type chaining
        +			if ( status >= 200 && status < 300 || status === 304 ) {
        +
        +				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +				if ( s.ifModified ) {
        +
        +					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
        +						jQuery.lastModified[ ifModifiedKey ] = lastModified;
        +					}
        +					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
        +						jQuery.etag[ ifModifiedKey ] = etag;
        +					}
        +				}
        +
        +				// If not modified
        +				if ( status === 304 ) {
        +
        +					statusText = "notmodified";
        +					isSuccess = true;
        +
        +				// If we have data
        +				} else {
        +
        +					try {
        +						success = ajaxConvert( s, response );
        +						statusText = "success";
        +						isSuccess = true;
        +					} catch(e) {
        +						// We have a parsererror
        +						statusText = "parsererror";
        +						error = e;
        +					}
        +				}
        +			} else {
        +				// We extract error from statusText
        +				// then normalize statusText and status for non-aborts
        +				error = statusText;
        +				if ( !statusText || status ) {
        +					statusText = "error";
        +					if ( status < 0 ) {
        +						status = 0;
        +					}
        +				}
        +			}
        +
        +			// Set data for the fake xhr object
        +			jqXHR.status = status;
        +			jqXHR.statusText = "" + ( nativeStatusText || statusText );
        +
        +			// Success/Error
        +			if ( isSuccess ) {
        +				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
        +			} else {
        +				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
        +			}
        +
        +			// Status-dependent callbacks
        +			jqXHR.statusCode( statusCode );
        +			statusCode = undefined;
        +
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
        +						[ jqXHR, s, isSuccess ? success : error ] );
        +			}
        +
        +			// Complete
        +			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
        +
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
        +				// Handle the global AJAX counter
        +				if ( !( --jQuery.active ) ) {
        +					jQuery.event.trigger( "ajaxStop" );
        +				}
        +			}
        +		}
        +
        +		// Attach deferreds
        +		deferred.promise( jqXHR );
        +		jqXHR.success = jqXHR.done;
        +		jqXHR.error = jqXHR.fail;
        +		jqXHR.complete = completeDeferred.add;
        +
        +		// Status-dependent callbacks
        +		jqXHR.statusCode = function( map ) {
        +			if ( map ) {
        +				var tmp;
        +				if ( state < 2 ) {
        +					for ( tmp in map ) {
        +						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
        +					}
        +				} else {
        +					tmp = map[ jqXHR.status ];
        +					jqXHR.then( tmp, tmp );
        +				}
        +			}
        +			return this;
        +		};
        +
        +		// Remove hash character (#7531: and string promotion)
        +		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
        +		// We also use the url parameter if available
        +		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
        +
        +		// Extract dataTypes list
        +		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
        +
        +		// Determine if a cross-domain request is in order
        +		if ( s.crossDomain == null ) {
        +			parts = rurl.exec( s.url.toLowerCase() );
        +			s.crossDomain = !!( parts &&
        +				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
        +					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
        +						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
        +			);
        +		}
        +
        +		// Convert data if not already a string
        +		if ( s.data && s.processData && typeof s.data !== "string" ) {
        +			s.data = jQuery.param( s.data, s.traditional );
        +		}
        +
        +		// Apply prefilters
        +		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
        +
        +		// If request was aborted inside a prefilter, stop there
        +		if ( state === 2 ) {
        +			return false;
        +		}
        +
        +		// We can fire global events as of now if asked to
        +		fireGlobals = s.global;
        +
        +		// Uppercase the type
        +		s.type = s.type.toUpperCase();
        +
        +		// Determine if request has content
        +		s.hasContent = !rnoContent.test( s.type );
        +
        +		// Watch for a new set of requests
        +		if ( fireGlobals && jQuery.active++ === 0 ) {
        +			jQuery.event.trigger( "ajaxStart" );
        +		}
        +
        +		// More options handling for requests with no content
        +		if ( !s.hasContent ) {
        +
        +			// If data is available, append data to url
        +			if ( s.data ) {
        +				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
        +				// #9682: remove data so that it's not used in an eventual retry
        +				delete s.data;
        +			}
        +
        +			// Get ifModifiedKey before adding the anti-cache parameter
        +			ifModifiedKey = s.url;
        +
        +			// Add anti-cache in url if needed
        +			if ( s.cache === false ) {
        +
        +				var ts = jQuery.now(),
        +					// try replacing _= if it is there
        +					ret = s.url.replace( rts, "$1_=" + ts );
        +
        +				// if nothing was replaced, add timestamp to the end
        +				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
        +			}
        +		}
        +
        +		// Set the correct header, if data is being sent
        +		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
        +			jqXHR.setRequestHeader( "Content-Type", s.contentType );
        +		}
        +
        +		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +		if ( s.ifModified ) {
        +			ifModifiedKey = ifModifiedKey || s.url;
        +			if ( jQuery.lastModified[ ifModifiedKey ] ) {
        +				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
        +			}
        +			if ( jQuery.etag[ ifModifiedKey ] ) {
        +				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
        +			}
        +		}
        +
        +		// Set the Accepts header for the server, depending on the dataType
        +		jqXHR.setRequestHeader(
        +			"Accept",
        +			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
        +				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
        +				s.accepts[ "*" ]
        +		);
        +
        +		// Check for headers option
        +		for ( i in s.headers ) {
        +			jqXHR.setRequestHeader( i, s.headers[ i ] );
        +		}
        +
        +		// Allow custom headers/mimetypes and early abort
        +		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
        +				// Abort if not done already
        +				jqXHR.abort();
        +				return false;
        +
        +		}
        +
        +		// Install callbacks on deferreds
        +		for ( i in { success: 1, error: 1, complete: 1 } ) {
        +			jqXHR[ i ]( s[ i ] );
        +		}
        +
        +		// Get transport
        +		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
        +
        +		// If no transport, we auto-abort
        +		if ( !transport ) {
        +			done( -1, "No Transport" );
        +		} else {
        +			jqXHR.readyState = 1;
        +			// Send global event
        +			if ( fireGlobals ) {
        +				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
        +			}
        +			// Timeout
        +			if ( s.async && s.timeout > 0 ) {
        +				timeoutTimer = setTimeout( function(){
        +					jqXHR.abort( "timeout" );
        +				}, s.timeout );
        +			}
        +
        +			try {
        +				state = 1;
        +				transport.send( requestHeaders, done );
        +			} catch (e) {
        +				// Propagate exception as error if not done
        +				if ( state < 2 ) {
        +					done( -1, e );
        +				// Simply rethrow otherwise
        +				} else {
        +					throw e;
        +				}
        +			}
        +		}
        +
        +		return jqXHR;
        +	},
        +
        +	// Serialize an array of form elements or a set of
        +	// key/values into a query string
        +	param: function( a, traditional ) {
        +		var s = [],
        +			add = function( key, value ) {
        +				// If value is a function, invoke it and return its value
        +				value = jQuery.isFunction( value ) ? value() : value;
        +				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
        +			};
        +
        +		// Set traditional to true for jQuery <= 1.3.2 behavior.
        +		if ( traditional === undefined ) {
        +			traditional = jQuery.ajaxSettings.traditional;
        +		}
        +
        +		// If an array was passed in, assume that it is an array of form elements.
        +		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        +			// Serialize the form elements
        +			jQuery.each( a, function() {
        +				add( this.name, this.value );
        +			});
        +
        +		} else {
        +			// If traditional, encode the "old" way (the way 1.3.2 or older
        +			// did it), otherwise encode params recursively.
        +			for ( var prefix in a ) {
        +				buildParams( prefix, a[ prefix ], traditional, add );
        +			}
        +		}
        +
        +		// Return the resulting serialization
        +		return s.join( "&" ).replace( r20, "+" );
        +	}
        +});
        +
        +function buildParams( prefix, obj, traditional, add ) {
        +	if ( jQuery.isArray( obj ) ) {
        +		// Serialize array item.
        +		jQuery.each( obj, function( i, v ) {
        +			if ( traditional || rbracket.test( prefix ) ) {
        +				// Treat each array item as a scalar.
        +				add( prefix, v );
        +
        +			} else {
        +				// If array item is non-scalar (array or object), encode its
        +				// numeric index to resolve deserialization ambiguity issues.
        +				// Note that rack (as of 1.0.0) can't currently deserialize
        +				// nested arrays properly, and attempting to do so may cause
        +				// a server error. Possible fixes are to modify rack's
        +				// deserialization algorithm or to provide an option or flag
        +				// to force array serialization to be shallow.
        +				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
        +			}
        +		});
        +
        +	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
        +		// Serialize object item.
        +		for ( var name in obj ) {
        +			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
        +		}
        +
        +	} else {
        +		// Serialize scalar item.
        +		add( prefix, obj );
        +	}
        +}
        +
        +// This is still on the jQuery object... for now
        +// Want to move this to jQuery.ajax some day
        +jQuery.extend({
        +
        +	// Counter for holding the number of active queries
        +	active: 0,
        +
        +	// Last-Modified header cache for next request
        +	lastModified: {},
        +	etag: {}
        +
        +});
        +
        +/* Handles responses to an ajax request:
        + * - sets all responseXXX fields accordingly
        + * - finds the right dataType (mediates between content-type and expected dataType)
        + * - returns the corresponding response
        + */
        +function ajaxHandleResponses( s, jqXHR, responses ) {
        +
        +	var contents = s.contents,
        +		dataTypes = s.dataTypes,
        +		responseFields = s.responseFields,
        +		ct,
        +		type,
        +		finalDataType,
        +		firstDataType;
        +
        +	// Fill responseXXX fields
        +	for ( type in responseFields ) {
        +		if ( type in responses ) {
        +			jqXHR[ responseFields[type] ] = responses[ type ];
        +		}
        +	}
        +
        +	// Remove auto dataType and get content-type in the process
        +	while( dataTypes[ 0 ] === "*" ) {
        +		dataTypes.shift();
        +		if ( ct === undefined ) {
        +			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
        +		}
        +	}
        +
        +	// Check if we're dealing with a known content-type
        +	if ( ct ) {
        +		for ( type in contents ) {
        +			if ( contents[ type ] && contents[ type ].test( ct ) ) {
        +				dataTypes.unshift( type );
        +				break;
        +			}
        +		}
        +	}
        +
        +	// Check to see if we have a response for the expected dataType
        +	if ( dataTypes[ 0 ] in responses ) {
        +		finalDataType = dataTypes[ 0 ];
        +	} else {
        +		// Try convertible dataTypes
        +		for ( type in responses ) {
        +			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
        +				finalDataType = type;
        +				break;
        +			}
        +			if ( !firstDataType ) {
        +				firstDataType = type;
        +			}
        +		}
        +		// Or just use first one
        +		finalDataType = finalDataType || firstDataType;
        +	}
        +
        +	// If we found a dataType
        +	// We add the dataType to the list if needed
        +	// and return the corresponding response
        +	if ( finalDataType ) {
        +		if ( finalDataType !== dataTypes[ 0 ] ) {
        +			dataTypes.unshift( finalDataType );
        +		}
        +		return responses[ finalDataType ];
        +	}
        +}
        +
        +// Chain conversions given the request and the original response
        +function ajaxConvert( s, response ) {
        +
        +	// Apply the dataFilter if provided
        +	if ( s.dataFilter ) {
        +		response = s.dataFilter( response, s.dataType );
        +	}
        +
        +	var dataTypes = s.dataTypes,
        +		converters = {},
        +		i,
        +		key,
        +		length = dataTypes.length,
        +		tmp,
        +		// Current and previous dataTypes
        +		current = dataTypes[ 0 ],
        +		prev,
        +		// Conversion expression
        +		conversion,
        +		// Conversion function
        +		conv,
        +		// Conversion functions (transitive conversion)
        +		conv1,
        +		conv2;
        +
        +	// For each dataType in the chain
        +	for ( i = 1; i < length; i++ ) {
        +
        +		// Create converters map
        +		// with lowercased keys
        +		if ( i === 1 ) {
        +			for ( key in s.converters ) {
        +				if ( typeof key === "string" ) {
        +					converters[ key.toLowerCase() ] = s.converters[ key ];
        +				}
        +			}
        +		}
        +
        +		// Get the dataTypes
        +		prev = current;
        +		current = dataTypes[ i ];
        +
        +		// If current is auto dataType, update it to prev
        +		if ( current === "*" ) {
        +			current = prev;
        +		// If no auto and dataTypes are actually different
        +		} else if ( prev !== "*" && prev !== current ) {
        +
        +			// Get the converter
        +			conversion = prev + " " + current;
        +			conv = converters[ conversion ] || converters[ "* " + current ];
        +
        +			// If there is no direct converter, search transitively
        +			if ( !conv ) {
        +				conv2 = undefined;
        +				for ( conv1 in converters ) {
        +					tmp = conv1.split( " " );
        +					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
        +						conv2 = converters[ tmp[1] + " " + current ];
        +						if ( conv2 ) {
        +							conv1 = converters[ conv1 ];
        +							if ( conv1 === true ) {
        +								conv = conv2;
        +							} else if ( conv2 === true ) {
        +								conv = conv1;
        +							}
        +							break;
        +						}
        +					}
        +				}
        +			}
        +			// If we found no converter, dispatch an error
        +			if ( !( conv || conv2 ) ) {
        +				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
        +			}
        +			// If found converter is not an equivalence
        +			if ( conv !== true ) {
        +				// Convert with 1 or 2 converters accordingly
        +				response = conv ? conv( response ) : conv2( conv1(response) );
        +			}
        +		}
        +	}
        +	return response;
        +}
        +
        +
        +
        +
        +var jsc = jQuery.now(),
        +	jsre = /(\=)\?(&|$)|\?\?/i;
        +
        +// Default jsonp settings
        +jQuery.ajaxSetup({
        +	jsonp: "callback",
        +	jsonpCallback: function() {
        +		return jQuery.expando + "_" + ( jsc++ );
        +	}
        +});
        +
        +// Detect, normalize options and install callbacks for jsonp requests
        +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
        +
        +	var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
        +
        +	if ( s.dataTypes[ 0 ] === "jsonp" ||
        +		s.jsonp !== false && ( jsre.test( s.url ) ||
        +				inspectData && jsre.test( s.data ) ) ) {
        +
        +		var responseContainer,
        +			jsonpCallback = s.jsonpCallback =
        +				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
        +			previous = window[ jsonpCallback ],
        +			url = s.url,
        +			data = s.data,
        +			replace = "$1" + jsonpCallback + "$2";
        +
        +		if ( s.jsonp !== false ) {
        +			url = url.replace( jsre, replace );
        +			if ( s.url === url ) {
        +				if ( inspectData ) {
        +					data = data.replace( jsre, replace );
        +				}
        +				if ( s.data === data ) {
        +					// Add callback manually
        +					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
        +				}
        +			}
        +		}
        +
        +		s.url = url;
        +		s.data = data;
        +
        +		// Install callback
        +		window[ jsonpCallback ] = function( response ) {
        +			responseContainer = [ response ];
        +		};
        +
        +		// Clean-up function
        +		jqXHR.always(function() {
        +			// Set callback back to previous value
        +			window[ jsonpCallback ] = previous;
        +			// Call if it was a function and we have a response
        +			if ( responseContainer && jQuery.isFunction( previous ) ) {
        +				window[ jsonpCallback ]( responseContainer[ 0 ] );
        +			}
        +		});
        +
        +		// Use data converter to retrieve json after script execution
        +		s.converters["script json"] = function() {
        +			if ( !responseContainer ) {
        +				jQuery.error( jsonpCallback + " was not called" );
        +			}
        +			return responseContainer[ 0 ];
        +		};
        +
        +		// force json dataType
        +		s.dataTypes[ 0 ] = "json";
        +
        +		// Delegate to script
        +		return "script";
        +	}
        +});
        +
        +
        +
        +
        +// Install script dataType
        +jQuery.ajaxSetup({
        +	accepts: {
        +		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        +	},
        +	contents: {
        +		script: /javascript|ecmascript/
        +	},
        +	converters: {
        +		"text script": function( text ) {
        +			jQuery.globalEval( text );
        +			return text;
        +		}
        +	}
        +});
        +
        +// Handle cache's special case and global
        +jQuery.ajaxPrefilter( "script", function( s ) {
        +	if ( s.cache === undefined ) {
        +		s.cache = false;
        +	}
        +	if ( s.crossDomain ) {
        +		s.type = "GET";
        +		s.global = false;
        +	}
        +});
        +
        +// Bind script tag hack transport
        +jQuery.ajaxTransport( "script", function(s) {
        +
        +	// This transport only deals with cross domain requests
        +	if ( s.crossDomain ) {
        +
        +		var script,
        +			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
        +
        +		return {
        +
        +			send: function( _, callback ) {
        +
        +				script = document.createElement( "script" );
        +
        +				script.async = "async";
        +
        +				if ( s.scriptCharset ) {
        +					script.charset = s.scriptCharset;
        +				}
        +
        +				script.src = s.url;
        +
        +				// Attach handlers for all browsers
        +				script.onload = script.onreadystatechange = function( _, isAbort ) {
        +
        +					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
        +
        +						// Handle memory leak in IE
        +						script.onload = script.onreadystatechange = null;
        +
        +						// Remove the script
        +						if ( head && script.parentNode ) {
        +							head.removeChild( script );
        +						}
        +
        +						// Dereference the script
        +						script = undefined;
        +
        +						// Callback if not abort
        +						if ( !isAbort ) {
        +							callback( 200, "success" );
        +						}
        +					}
        +				};
        +				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
        +				// This arises when a base node is used (#2709 and #4378).
        +				head.insertBefore( script, head.firstChild );
        +			},
        +
        +			abort: function() {
        +				if ( script ) {
        +					script.onload( 0, 1 );
        +				}
        +			}
        +		};
        +	}
        +});
        +
        +
        +
        +
        +var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
        +	xhrOnUnloadAbort = window.ActiveXObject ? function() {
        +		// Abort all pending requests
        +		for ( var key in xhrCallbacks ) {
        +			xhrCallbacks[ key ]( 0, 1 );
        +		}
        +	} : false,
        +	xhrId = 0,
        +	xhrCallbacks;
        +
        +// Functions to create xhrs
        +function createStandardXHR() {
        +	try {
        +		return new window.XMLHttpRequest();
        +	} catch( e ) {}
        +}
        +
        +function createActiveXHR() {
        +	try {
        +		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
        +	} catch( e ) {}
        +}
        +
        +// Create the request object
        +// (This is still attached to ajaxSettings for backward compatibility)
        +jQuery.ajaxSettings.xhr = window.ActiveXObject ?
        +	/* Microsoft failed to properly
        +	 * implement the XMLHttpRequest in IE7 (can't request local files),
        +	 * so we use the ActiveXObject when it is available
        +	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
        +	 * we need a fallback.
        +	 */
        +	function() {
        +		return !this.isLocal && createStandardXHR() || createActiveXHR();
        +	} :
        +	// For all other browsers, use the standard XMLHttpRequest object
        +	createStandardXHR;
        +
        +// Determine support properties
        +(function( xhr ) {
        +	jQuery.extend( jQuery.support, {
        +		ajax: !!xhr,
        +		cors: !!xhr && ( "withCredentials" in xhr )
        +	});
        +})( jQuery.ajaxSettings.xhr() );
        +
        +// Create transport if the browser can provide an xhr
        +if ( jQuery.support.ajax ) {
        +
        +	jQuery.ajaxTransport(function( s ) {
        +		// Cross domain only allowed if supported through XMLHttpRequest
        +		if ( !s.crossDomain || jQuery.support.cors ) {
        +
        +			var callback;
        +
        +			return {
        +				send: function( headers, complete ) {
        +
        +					// Get a new xhr
        +					var xhr = s.xhr(),
        +						handle,
        +						i;
        +
        +					// Open the socket
        +					// Passing null username, generates a login popup on Opera (#2865)
        +					if ( s.username ) {
        +						xhr.open( s.type, s.url, s.async, s.username, s.password );
        +					} else {
        +						xhr.open( s.type, s.url, s.async );
        +					}
        +
        +					// Apply custom fields if provided
        +					if ( s.xhrFields ) {
        +						for ( i in s.xhrFields ) {
        +							xhr[ i ] = s.xhrFields[ i ];
        +						}
        +					}
        +
        +					// Override mime type if needed
        +					if ( s.mimeType && xhr.overrideMimeType ) {
        +						xhr.overrideMimeType( s.mimeType );
        +					}
        +
        +					// X-Requested-With header
        +					// For cross-domain requests, seeing as conditions for a preflight are
        +					// akin to a jigsaw puzzle, we simply never set it to be sure.
        +					// (it can always be set on a per-request basis or even using ajaxSetup)
        +					// For same-domain requests, won't change header if already provided.
        +					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
        +						headers[ "X-Requested-With" ] = "XMLHttpRequest";
        +					}
        +
        +					// Need an extra try/catch for cross domain requests in Firefox 3
        +					try {
        +						for ( i in headers ) {
        +							xhr.setRequestHeader( i, headers[ i ] );
        +						}
        +					} catch( _ ) {}
        +
        +					// Do send the request
        +					// This may raise an exception which is actually
        +					// handled in jQuery.ajax (so no try/catch here)
        +					xhr.send( ( s.hasContent && s.data ) || null );
        +
        +					// Listener
        +					callback = function( _, isAbort ) {
        +
        +						var status,
        +							statusText,
        +							responseHeaders,
        +							responses,
        +							xml;
        +
        +						// Firefox throws exceptions when accessing properties
        +						// of an xhr when a network error occured
        +						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
        +						try {
        +
        +							// Was never called and is aborted or complete
        +							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
        +
        +								// Only called once
        +								callback = undefined;
        +
        +								// Do not keep as active anymore
        +								if ( handle ) {
        +									xhr.onreadystatechange = jQuery.noop;
        +									if ( xhrOnUnloadAbort ) {
        +										delete xhrCallbacks[ handle ];
        +									}
        +								}
        +
        +								// If it's an abort
        +								if ( isAbort ) {
        +									// Abort it manually if needed
        +									if ( xhr.readyState !== 4 ) {
        +										xhr.abort();
        +									}
        +								} else {
        +									status = xhr.status;
        +									responseHeaders = xhr.getAllResponseHeaders();
        +									responses = {};
        +									xml = xhr.responseXML;
        +
        +									// Construct response list
        +									if ( xml && xml.documentElement /* #4958 */ ) {
        +										responses.xml = xml;
        +									}
        +
        +									// When requesting binary data, IE6-9 will throw an exception
        +									// on any attempt to access responseText (#11426)
        +									try {
        +										responses.text = xhr.responseText;
        +									} catch( _ ) {
        +									}
        +
        +									// Firefox throws an exception when accessing
        +									// statusText for faulty cross-domain requests
        +									try {
        +										statusText = xhr.statusText;
        +									} catch( e ) {
        +										// We normalize with Webkit giving an empty statusText
        +										statusText = "";
        +									}
        +
        +									// Filter status for non standard behaviors
        +
        +									// If the request is local and we have data: assume a success
        +									// (success with no data won't get notified, that's the best we
        +									// can do given current implementations)
        +									if ( !status && s.isLocal && !s.crossDomain ) {
        +										status = responses.text ? 200 : 404;
        +									// IE - #1450: sometimes returns 1223 when it should be 204
        +									} else if ( status === 1223 ) {
        +										status = 204;
        +									}
        +								}
        +							}
        +						} catch( firefoxAccessException ) {
        +							if ( !isAbort ) {
        +								complete( -1, firefoxAccessException );
        +							}
        +						}
        +
        +						// Call complete if needed
        +						if ( responses ) {
        +							complete( status, statusText, responses, responseHeaders );
        +						}
        +					};
        +
        +					// if we're in sync mode or it's in cache
        +					// and has been retrieved directly (IE6 & IE7)
        +					// we need to manually fire the callback
        +					if ( !s.async || xhr.readyState === 4 ) {
        +						callback();
        +					} else {
        +						handle = ++xhrId;
        +						if ( xhrOnUnloadAbort ) {
        +							// Create the active xhrs callbacks list if needed
        +							// and attach the unload handler
        +							if ( !xhrCallbacks ) {
        +								xhrCallbacks = {};
        +								jQuery( window ).unload( xhrOnUnloadAbort );
        +							}
        +							// Add to list of active xhrs callbacks
        +							xhrCallbacks[ handle ] = callback;
        +						}
        +						xhr.onreadystatechange = callback;
        +					}
        +				},
        +
        +				abort: function() {
        +					if ( callback ) {
        +						callback(0,1);
        +					}
        +				}
        +			};
        +		}
        +	});
        +}
        +
        +
        +
        +
        +var elemdisplay = {},
        +	iframe, iframeDoc,
        +	rfxtypes = /^(?:toggle|show|hide)$/,
        +	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
        +	timerId,
        +	fxAttrs = [
        +		// height animations
        +		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
        +		// width animations
        +		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
        +		// opacity animations
        +		[ "opacity" ]
        +	],
        +	fxNow;
        +
        +jQuery.fn.extend({
        +	show: function( speed, easing, callback ) {
        +		var elem, display;
        +
        +		if ( speed || speed === 0 ) {
        +			return this.animate( genFx("show", 3), speed, easing, callback );
        +
        +		} else {
        +			for ( var i = 0, j = this.length; i < j; i++ ) {
        +				elem = this[ i ];
        +
        +				if ( elem.style ) {
        +					display = elem.style.display;
        +
        +					// Reset the inline display of this element to learn if it is
        +					// being hidden by cascaded rules or not
        +					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
        +						display = elem.style.display = "";
        +					}
        +
        +					// Set elements which have been overridden with display: none
        +					// in a stylesheet to whatever the default browser style is
        +					// for such an element
        +					if ( (display === "" && jQuery.css(elem, "display") === "none") ||
        +						!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
        +						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
        +					}
        +				}
        +			}
        +
        +			// Set the display of most of the elements in a second loop
        +			// to avoid the constant reflow
        +			for ( i = 0; i < j; i++ ) {
        +				elem = this[ i ];
        +
        +				if ( elem.style ) {
        +					display = elem.style.display;
        +
        +					if ( display === "" || display === "none" ) {
        +						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
        +					}
        +				}
        +			}
        +
        +			return this;
        +		}
        +	},
        +
        +	hide: function( speed, easing, callback ) {
        +		if ( speed || speed === 0 ) {
        +			return this.animate( genFx("hide", 3), speed, easing, callback);
        +
        +		} else {
        +			var elem, display,
        +				i = 0,
        +				j = this.length;
        +
        +			for ( ; i < j; i++ ) {
        +				elem = this[i];
        +				if ( elem.style ) {
        +					display = jQuery.css( elem, "display" );
        +
        +					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
        +						jQuery._data( elem, "olddisplay", display );
        +					}
        +				}
        +			}
        +
        +			// Set the display of the elements in a second loop
        +			// to avoid the constant reflow
        +			for ( i = 0; i < j; i++ ) {
        +				if ( this[i].style ) {
        +					this[i].style.display = "none";
        +				}
        +			}
        +
        +			return this;
        +		}
        +	},
        +
        +	// Save the old toggle function
        +	_toggle: jQuery.fn.toggle,
        +
        +	toggle: function( fn, fn2, callback ) {
        +		var bool = typeof fn === "boolean";
        +
        +		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
        +			this._toggle.apply( this, arguments );
        +
        +		} else if ( fn == null || bool ) {
        +			this.each(function() {
        +				var state = bool ? fn : jQuery(this).is(":hidden");
        +				jQuery(this)[ state ? "show" : "hide" ]();
        +			});
        +
        +		} else {
        +			this.animate(genFx("toggle", 3), fn, fn2, callback);
        +		}
        +
        +		return this;
        +	},
        +
        +	fadeTo: function( speed, to, easing, callback ) {
        +		return this.filter(":hidden").css("opacity", 0).show().end()
        +					.animate({opacity: to}, speed, easing, callback);
        +	},
        +
        +	animate: function( prop, speed, easing, callback ) {
        +		var optall = jQuery.speed( speed, easing, callback );
        +
        +		if ( jQuery.isEmptyObject( prop ) ) {
        +			return this.each( optall.complete, [ false ] );
        +		}
        +
        +		// Do not change referenced properties as per-property easing will be lost
        +		prop = jQuery.extend( {}, prop );
        +
        +		function doAnimation() {
        +			// XXX 'this' does not always have a nodeName when running the
        +			// test suite
        +
        +			if ( optall.queue === false ) {
        +				jQuery._mark( this );
        +			}
        +
        +			var opt = jQuery.extend( {}, optall ),
        +				isElement = this.nodeType === 1,
        +				hidden = isElement && jQuery(this).is(":hidden"),
        +				name, val, p, e, hooks, replace,
        +				parts, start, end, unit,
        +				method;
        +
        +			// will store per property easing and be used to determine when an animation is complete
        +			opt.animatedProperties = {};
        +
        +			// first pass over propertys to expand / normalize
        +			for ( p in prop ) {
        +				name = jQuery.camelCase( p );
        +				if ( p !== name ) {
        +					prop[ name ] = prop[ p ];
        +					delete prop[ p ];
        +				}
        +
        +				if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
        +					replace = hooks.expand( prop[ name ] );
        +					delete prop[ name ];
        +
        +					// not quite $.extend, this wont overwrite keys already present.
        +					// also - reusing 'p' from above because we have the correct "name"
        +					for ( p in replace ) {
        +						if ( ! ( p in prop ) ) {
        +							prop[ p ] = replace[ p ];
        +						}
        +					}
        +				}
        +			}
        +
        +			for ( name in prop ) {
        +				val = prop[ name ];
        +				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
        +				if ( jQuery.isArray( val ) ) {
        +					opt.animatedProperties[ name ] = val[ 1 ];
        +					val = prop[ name ] = val[ 0 ];
        +				} else {
        +					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
        +				}
        +
        +				if ( val === "hide" && hidden || val === "show" && !hidden ) {
        +					return opt.complete.call( this );
        +				}
        +
        +				if ( isElement && ( name === "height" || name === "width" ) ) {
        +					// Make sure that nothing sneaks out
        +					// Record all 3 overflow attributes because IE does not
        +					// change the overflow attribute when overflowX and
        +					// overflowY are set to the same value
        +					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
        +
        +					// Set display property to inline-block for height/width
        +					// animations on inline elements that are having width/height animated
        +					if ( jQuery.css( this, "display" ) === "inline" &&
        +							jQuery.css( this, "float" ) === "none" ) {
        +
        +						// inline-level elements accept inline-block;
        +						// block-level elements need to be inline with layout
        +						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
        +							this.style.display = "inline-block";
        +
        +						} else {
        +							this.style.zoom = 1;
        +						}
        +					}
        +				}
        +			}
        +
        +			if ( opt.overflow != null ) {
        +				this.style.overflow = "hidden";
        +			}
        +
        +			for ( p in prop ) {
        +				e = new jQuery.fx( this, opt, p );
        +				val = prop[ p ];
        +
        +				if ( rfxtypes.test( val ) ) {
        +
        +					// Tracks whether to show or hide based on private
        +					// data attached to the element
        +					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
        +					if ( method ) {
        +						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
        +						e[ method ]();
        +					} else {
        +						e[ val ]();
        +					}
        +
        +				} else {
        +					parts = rfxnum.exec( val );
        +					start = e.cur();
        +
        +					if ( parts ) {
        +						end = parseFloat( parts[2] );
        +						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
        +
        +						// We need to compute starting value
        +						if ( unit !== "px" ) {
        +							jQuery.style( this, p, (end || 1) + unit);
        +							start = ( (end || 1) / e.cur() ) * start;
        +							jQuery.style( this, p, start + unit);
        +						}
        +
        +						// If a +=/-= token was provided, we're doing a relative animation
        +						if ( parts[1] ) {
        +							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
        +						}
        +
        +						e.custom( start, end, unit );
        +
        +					} else {
        +						e.custom( start, val, "" );
        +					}
        +				}
        +			}
        +
        +			// For JS strict compliance
        +			return true;
        +		}
        +
        +		return optall.queue === false ?
        +			this.each( doAnimation ) :
        +			this.queue( optall.queue, doAnimation );
        +	},
        +
        +	stop: function( type, clearQueue, gotoEnd ) {
        +		if ( typeof type !== "string" ) {
        +			gotoEnd = clearQueue;
        +			clearQueue = type;
        +			type = undefined;
        +		}
        +		if ( clearQueue && type !== false ) {
        +			this.queue( type || "fx", [] );
        +		}
        +
        +		return this.each(function() {
        +			var index,
        +				hadTimers = false,
        +				timers = jQuery.timers,
        +				data = jQuery._data( this );
        +
        +			// clear marker counters if we know they won't be
        +			if ( !gotoEnd ) {
        +				jQuery._unmark( true, this );
        +			}
        +
        +			function stopQueue( elem, data, index ) {
        +				var hooks = data[ index ];
        +				jQuery.removeData( elem, index, true );
        +				hooks.stop( gotoEnd );
        +			}
        +
        +			if ( type == null ) {
        +				for ( index in data ) {
        +					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
        +						stopQueue( this, data, index );
        +					}
        +				}
        +			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
        +				stopQueue( this, data, index );
        +			}
        +
        +			for ( index = timers.length; index--; ) {
        +				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
        +					if ( gotoEnd ) {
        +
        +						// force the next step to be the last
        +						timers[ index ]( true );
        +					} else {
        +						timers[ index ].saveState();
        +					}
        +					hadTimers = true;
        +					timers.splice( index, 1 );
        +				}
        +			}
        +
        +			// start the next in the queue if the last step wasn't forced
        +			// timers currently will call their complete callbacks, which will dequeue
        +			// but only if they were gotoEnd
        +			if ( !( gotoEnd && hadTimers ) ) {
        +				jQuery.dequeue( this, type );
        +			}
        +		});
        +	}
        +
        +});
        +
        +// Animations created synchronously will run synchronously
        +function createFxNow() {
        +	setTimeout( clearFxNow, 0 );
        +	return ( fxNow = jQuery.now() );
        +}
        +
        +function clearFxNow() {
        +	fxNow = undefined;
        +}
        +
        +// Generate parameters to create a standard animation
        +function genFx( type, num ) {
        +	var obj = {};
        +
        +	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
        +		obj[ this ] = type;
        +	});
        +
        +	return obj;
        +}
        +
        +// Generate shortcuts for custom animations
        +jQuery.each({
        +	slideDown: genFx( "show", 1 ),
        +	slideUp: genFx( "hide", 1 ),
        +	slideToggle: genFx( "toggle", 1 ),
        +	fadeIn: { opacity: "show" },
        +	fadeOut: { opacity: "hide" },
        +	fadeToggle: { opacity: "toggle" }
        +}, function( name, props ) {
        +	jQuery.fn[ name ] = function( speed, easing, callback ) {
        +		return this.animate( props, speed, easing, callback );
        +	};
        +});
        +
        +jQuery.extend({
        +	speed: function( speed, easing, fn ) {
        +		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
        +			complete: fn || !fn && easing ||
        +				jQuery.isFunction( speed ) && speed,
        +			duration: speed,
        +			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
        +		};
        +
        +		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
        +			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
        +
        +		// normalize opt.queue - true/undefined/null -> "fx"
        +		if ( opt.queue == null || opt.queue === true ) {
        +			opt.queue = "fx";
        +		}
        +
        +		// Queueing
        +		opt.old = opt.complete;
        +
        +		opt.complete = function( noUnmark ) {
        +			if ( jQuery.isFunction( opt.old ) ) {
        +				opt.old.call( this );
        +			}
        +
        +			if ( opt.queue ) {
        +				jQuery.dequeue( this, opt.queue );
        +			} else if ( noUnmark !== false ) {
        +				jQuery._unmark( this );
        +			}
        +		};
        +
        +		return opt;
        +	},
        +
        +	easing: {
        +		linear: function( p ) {
        +			return p;
        +		},
        +		swing: function( p ) {
        +			return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
        +		}
        +	},
        +
        +	timers: [],
        +
        +	fx: function( elem, options, prop ) {
        +		this.options = options;
        +		this.elem = elem;
        +		this.prop = prop;
        +
        +		options.orig = options.orig || {};
        +	}
        +
        +});
        +
        +jQuery.fx.prototype = {
        +	// Simple function for setting a style value
        +	update: function() {
        +		if ( this.options.step ) {
        +			this.options.step.call( this.elem, this.now, this );
        +		}
        +
        +		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
        +	},
        +
        +	// Get the current size
        +	cur: function() {
        +		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
        +			return this.elem[ this.prop ];
        +		}
        +
        +		var parsed,
        +			r = jQuery.css( this.elem, this.prop );
        +		// Empty strings, null, undefined and "auto" are converted to 0,
        +		// complex values such as "rotate(1rad)" are returned as is,
        +		// simple values such as "10px" are parsed to Float.
        +		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
        +	},
        +
        +	// Start an animation from one number to another
        +	custom: function( from, to, unit ) {
        +		var self = this,
        +			fx = jQuery.fx;
        +
        +		this.startTime = fxNow || createFxNow();
        +		this.end = to;
        +		this.now = this.start = from;
        +		this.pos = this.state = 0;
        +		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
        +
        +		function t( gotoEnd ) {
        +			return self.step( gotoEnd );
        +		}
        +
        +		t.queue = this.options.queue;
        +		t.elem = this.elem;
        +		t.saveState = function() {
        +			if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
        +				if ( self.options.hide ) {
        +					jQuery._data( self.elem, "fxshow" + self.prop, self.start );
        +				} else if ( self.options.show ) {
        +					jQuery._data( self.elem, "fxshow" + self.prop, self.end );
        +				}
        +			}
        +		};
        +
        +		if ( t() && jQuery.timers.push(t) && !timerId ) {
        +			timerId = setInterval( fx.tick, fx.interval );
        +		}
        +	},
        +
        +	// Simple 'show' function
        +	show: function() {
        +		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
        +
        +		// Remember where we started, so that we can go back to it later
        +		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
        +		this.options.show = true;
        +
        +		// Begin the animation
        +		// Make sure that we start at a small width/height to avoid any flash of content
        +		if ( dataShow !== undefined ) {
        +			// This show is picking up where a previous hide or show left off
        +			this.custom( this.cur(), dataShow );
        +		} else {
        +			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
        +		}
        +
        +		// Start by showing the element
        +		jQuery( this.elem ).show();
        +	},
        +
        +	// Simple 'hide' function
        +	hide: function() {
        +		// Remember where we started, so that we can go back to it later
        +		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
        +		this.options.hide = true;
        +
        +		// Begin the animation
        +		this.custom( this.cur(), 0 );
        +	},
        +
        +	// Each step of an animation
        +	step: function( gotoEnd ) {
        +		var p, n, complete,
        +			t = fxNow || createFxNow(),
        +			done = true,
        +			elem = this.elem,
        +			options = this.options;
        +
        +		if ( gotoEnd || t >= options.duration + this.startTime ) {
        +			this.now = this.end;
        +			this.pos = this.state = 1;
        +			this.update();
        +
        +			options.animatedProperties[ this.prop ] = true;
        +
        +			for ( p in options.animatedProperties ) {
        +				if ( options.animatedProperties[ p ] !== true ) {
        +					done = false;
        +				}
        +			}
        +
        +			if ( done ) {
        +				// Reset the overflow
        +				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
        +
        +					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
        +						elem.style[ "overflow" + value ] = options.overflow[ index ];
        +					});
        +				}
        +
        +				// Hide the element if the "hide" operation was done
        +				if ( options.hide ) {
        +					jQuery( elem ).hide();
        +				}
        +
        +				// Reset the properties, if the item has been hidden or shown
        +				if ( options.hide || options.show ) {
        +					for ( p in options.animatedProperties ) {
        +						jQuery.style( elem, p, options.orig[ p ] );
        +						jQuery.removeData( elem, "fxshow" + p, true );
        +						// Toggle data is no longer needed
        +						jQuery.removeData( elem, "toggle" + p, true );
        +					}
        +				}
        +
        +				// Execute the complete function
        +				// in the event that the complete function throws an exception
        +				// we must ensure it won't be called twice. #5684
        +
        +				complete = options.complete;
        +				if ( complete ) {
        +
        +					options.complete = false;
        +					complete.call( elem );
        +				}
        +			}
        +
        +			return false;
        +
        +		} else {
        +			// classical easing cannot be used with an Infinity duration
        +			if ( options.duration == Infinity ) {
        +				this.now = t;
        +			} else {
        +				n = t - this.startTime;
        +				this.state = n / options.duration;
        +
        +				// Perform the easing function, defaults to swing
        +				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
        +				this.now = this.start + ( (this.end - this.start) * this.pos );
        +			}
        +			// Perform the next step of the animation
        +			this.update();
        +		}
        +
        +		return true;
        +	}
        +};
        +
        +jQuery.extend( jQuery.fx, {
        +	tick: function() {
        +		var timer,
        +			timers = jQuery.timers,
        +			i = 0;
        +
        +		for ( ; i < timers.length; i++ ) {
        +			timer = timers[ i ];
        +			// Checks the timer has not already been removed
        +			if ( !timer() && timers[ i ] === timer ) {
        +				timers.splice( i--, 1 );
        +			}
        +		}
        +
        +		if ( !timers.length ) {
        +			jQuery.fx.stop();
        +		}
        +	},
        +
        +	interval: 13,
        +
        +	stop: function() {
        +		clearInterval( timerId );
        +		timerId = null;
        +	},
        +
        +	speeds: {
        +		slow: 600,
        +		fast: 200,
        +		// Default speed
        +		_default: 400
        +	},
        +
        +	step: {
        +		opacity: function( fx ) {
        +			jQuery.style( fx.elem, "opacity", fx.now );
        +		},
        +
        +		_default: function( fx ) {
        +			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
        +				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
        +			} else {
        +				fx.elem[ fx.prop ] = fx.now;
        +			}
        +		}
        +	}
        +});
        +
        +// Ensure props that can't be negative don't go there on undershoot easing
        +jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
        +	// exclude marginTop, marginLeft, marginBottom and marginRight from this list
        +	if ( prop.indexOf( "margin" ) ) {
        +		jQuery.fx.step[ prop ] = function( fx ) {
        +			jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
        +		};
        +	}
        +});
        +
        +if ( jQuery.expr && jQuery.expr.filters ) {
        +	jQuery.expr.filters.animated = function( elem ) {
        +		return jQuery.grep(jQuery.timers, function( fn ) {
        +			return elem === fn.elem;
        +		}).length;
        +	};
        +}
        +
        +// Try to restore the default display value of an element
        +function defaultDisplay( nodeName ) {
        +
        +	if ( !elemdisplay[ nodeName ] ) {
        +
        +		var body = document.body,
        +			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
        +			display = elem.css( "display" );
        +		elem.remove();
        +
        +		// If the simple way fails,
        +		// get element's real default display by attaching it to a temp iframe
        +		if ( display === "none" || display === "" ) {
        +			// No iframe to use yet, so create it
        +			if ( !iframe ) {
        +				iframe = document.createElement( "iframe" );
        +				iframe.frameBorder = iframe.width = iframe.height = 0;
        +			}
        +
        +			body.appendChild( iframe );
        +
        +			// Create a cacheable copy of the iframe document on first call.
        +			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
        +			// document to it; WebKit & Firefox won't allow reusing the iframe document.
        +			if ( !iframeDoc || !iframe.createElement ) {
        +				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
        +				iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
        +				iframeDoc.close();
        +			}
        +
        +			elem = iframeDoc.createElement( nodeName );
        +
        +			iframeDoc.body.appendChild( elem );
        +
        +			display = jQuery.css( elem, "display" );
        +			body.removeChild( iframe );
        +		}
        +
        +		// Store the correct default display
        +		elemdisplay[ nodeName ] = display;
        +	}
        +
        +	return elemdisplay[ nodeName ];
        +}
        +
        +
        +
        +
        +var getOffset,
        +	rtable = /^t(?:able|d|h)$/i,
        +	rroot = /^(?:body|html)$/i;
        +
        +if ( "getBoundingClientRect" in document.documentElement ) {
        +	getOffset = function( elem, doc, docElem, box ) {
        +		try {
        +			box = elem.getBoundingClientRect();
        +		} catch(e) {}
        +
        +		// Make sure we're not dealing with a disconnected DOM node
        +		if ( !box || !jQuery.contains( docElem, elem ) ) {
        +			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
        +		}
        +
        +		var body = doc.body,
        +			win = getWindow( doc ),
        +			clientTop  = docElem.clientTop  || body.clientTop  || 0,
        +			clientLeft = docElem.clientLeft || body.clientLeft || 0,
        +			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
        +			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
        +			top  = box.top  + scrollTop  - clientTop,
        +			left = box.left + scrollLeft - clientLeft;
        +
        +		return { top: top, left: left };
        +	};
        +
        +} else {
        +	getOffset = function( elem, doc, docElem ) {
        +		var computedStyle,
        +			offsetParent = elem.offsetParent,
        +			prevOffsetParent = elem,
        +			body = doc.body,
        +			defaultView = doc.defaultView,
        +			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
        +			top = elem.offsetTop,
        +			left = elem.offsetLeft;
        +
        +		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
        +			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
        +				break;
        +			}
        +
        +			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
        +			top  -= elem.scrollTop;
        +			left -= elem.scrollLeft;
        +
        +			if ( elem === offsetParent ) {
        +				top  += elem.offsetTop;
        +				left += elem.offsetLeft;
        +
        +				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
        +					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
        +					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
        +				}
        +
        +				prevOffsetParent = offsetParent;
        +				offsetParent = elem.offsetParent;
        +			}
        +
        +			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
        +				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
        +				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
        +			}
        +
        +			prevComputedStyle = computedStyle;
        +		}
        +
        +		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
        +			top  += body.offsetTop;
        +			left += body.offsetLeft;
        +		}
        +
        +		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
        +			top  += Math.max( docElem.scrollTop, body.scrollTop );
        +			left += Math.max( docElem.scrollLeft, body.scrollLeft );
        +		}
        +
        +		return { top: top, left: left };
        +	};
        +}
        +
        +jQuery.fn.offset = function( options ) {
        +	if ( arguments.length ) {
        +		return options === undefined ?
        +			this :
        +			this.each(function( i ) {
        +				jQuery.offset.setOffset( this, options, i );
        +			});
        +	}
        +
        +	var elem = this[0],
        +		doc = elem && elem.ownerDocument;
        +
        +	if ( !doc ) {
        +		return null;
        +	}
        +
        +	if ( elem === doc.body ) {
        +		return jQuery.offset.bodyOffset( elem );
        +	}
        +
        +	return getOffset( elem, doc, doc.documentElement );
        +};
        +
        +jQuery.offset = {
        +
        +	bodyOffset: function( body ) {
        +		var top = body.offsetTop,
        +			left = body.offsetLeft;
        +
        +		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
        +			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
        +			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
        +		}
        +
        +		return { top: top, left: left };
        +	},
        +
        +	setOffset: function( elem, options, i ) {
        +		var position = jQuery.css( elem, "position" );
        +
        +		// set position first, in-case top/left are set even on static elem
        +		if ( position === "static" ) {
        +			elem.style.position = "relative";
        +		}
        +
        +		var curElem = jQuery( elem ),
        +			curOffset = curElem.offset(),
        +			curCSSTop = jQuery.css( elem, "top" ),
        +			curCSSLeft = jQuery.css( elem, "left" ),
        +			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
        +			props = {}, curPosition = {}, curTop, curLeft;
        +
        +		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
        +		if ( calculatePosition ) {
        +			curPosition = curElem.position();
        +			curTop = curPosition.top;
        +			curLeft = curPosition.left;
        +		} else {
        +			curTop = parseFloat( curCSSTop ) || 0;
        +			curLeft = parseFloat( curCSSLeft ) || 0;
        +		}
        +
        +		if ( jQuery.isFunction( options ) ) {
        +			options = options.call( elem, i, curOffset );
        +		}
        +
        +		if ( options.top != null ) {
        +			props.top = ( options.top - curOffset.top ) + curTop;
        +		}
        +		if ( options.left != null ) {
        +			props.left = ( options.left - curOffset.left ) + curLeft;
        +		}
        +
        +		if ( "using" in options ) {
        +			options.using.call( elem, props );
        +		} else {
        +			curElem.css( props );
        +		}
        +	}
        +};
        +
        +
        +jQuery.fn.extend({
        +
        +	position: function() {
        +		if ( !this[0] ) {
        +			return null;
        +		}
        +
        +		var elem = this[0],
        +
        +		// Get *real* offsetParent
        +		offsetParent = this.offsetParent(),
        +
        +		// Get correct offsets
        +		offset       = this.offset(),
        +		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
        +
        +		// Subtract element margins
        +		// note: when an element has margin: auto the offsetLeft and marginLeft
        +		// are the same in Safari causing offset.left to incorrectly be 0
        +		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
        +		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
        +
        +		// Add offsetParent borders
        +		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
        +		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
        +
        +		// Subtract the two offsets
        +		return {
        +			top:  offset.top  - parentOffset.top,
        +			left: offset.left - parentOffset.left
        +		};
        +	},
        +
        +	offsetParent: function() {
        +		return this.map(function() {
        +			var offsetParent = this.offsetParent || document.body;
        +			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
        +				offsetParent = offsetParent.offsetParent;
        +			}
        +			return offsetParent;
        +		});
        +	}
        +});
        +
        +
        +// Create scrollLeft and scrollTop methods
        +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
        +	var top = /Y/.test( prop );
        +
        +	jQuery.fn[ method ] = function( val ) {
        +		return jQuery.access( this, function( elem, method, val ) {
        +			var win = getWindow( elem );
        +
        +			if ( val === undefined ) {
        +				return win ? (prop in win) ? win[ prop ] :
        +					jQuery.support.boxModel && win.document.documentElement[ method ] ||
        +						win.document.body[ method ] :
        +					elem[ method ];
        +			}
        +
        +			if ( win ) {
        +				win.scrollTo(
        +					!top ? val : jQuery( win ).scrollLeft(),
        +					 top ? val : jQuery( win ).scrollTop()
        +				);
        +
        +			} else {
        +				elem[ method ] = val;
        +			}
        +		}, method, val, arguments.length, null );
        +	};
        +});
        +
        +function getWindow( elem ) {
        +	return jQuery.isWindow( elem ) ?
        +		elem :
        +		elem.nodeType === 9 ?
        +			elem.defaultView || elem.parentWindow :
        +			false;
        +}
        +
        +
        +
        +
        +// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
        +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        +	var clientProp = "client" + name,
        +		scrollProp = "scroll" + name,
        +		offsetProp = "offset" + name;
        +
        +	// innerHeight and innerWidth
        +	jQuery.fn[ "inner" + name ] = function() {
        +		var elem = this[0];
        +		return elem ?
        +			elem.style ?
        +			parseFloat( jQuery.css( elem, type, "padding" ) ) :
        +			this[ type ]() :
        +			null;
        +	};
        +
        +	// outerHeight and outerWidth
        +	jQuery.fn[ "outer" + name ] = function( margin ) {
        +		var elem = this[0];
        +		return elem ?
        +			elem.style ?
        +			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
        +			this[ type ]() :
        +			null;
        +	};
        +
        +	jQuery.fn[ type ] = function( value ) {
        +		return jQuery.access( this, function( elem, type, value ) {
        +			var doc, docElemProp, orig, ret;
        +
        +			if ( jQuery.isWindow( elem ) ) {
        +				// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
        +				doc = elem.document;
        +				docElemProp = doc.documentElement[ clientProp ];
        +				return jQuery.support.boxModel && docElemProp ||
        +					doc.body && doc.body[ clientProp ] || docElemProp;
        +			}
        +
        +			// Get document width or height
        +			if ( elem.nodeType === 9 ) {
        +				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
        +				doc = elem.documentElement;
        +
        +				// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
        +				// so we can't use max, as it'll choose the incorrect offset[Width/Height]
        +				// instead we use the correct client[Width/Height]
        +				// support:IE6
        +				if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
        +					return doc[ clientProp ];
        +				}
        +
        +				return Math.max(
        +					elem.body[ scrollProp ], doc[ scrollProp ],
        +					elem.body[ offsetProp ], doc[ offsetProp ]
        +				);
        +			}
        +
        +			// Get width or height on the element
        +			if ( value === undefined ) {
        +				orig = jQuery.css( elem, type );
        +				ret = parseFloat( orig );
        +				return jQuery.isNumeric( ret ) ? ret : orig;
        +			}
        +
        +			// Set the width or height on the element
        +			jQuery( elem ).css( type, value );
        +		}, type, value, arguments.length, null );
        +	};
        +});
        +
        +
        +
        +
        +// Expose jQuery to the global object
        +window.jQuery = window.$ = jQuery;
        +
        +// Expose jQuery as an AMD module, but only for AMD loaders that
        +// understand the issues with loading multiple versions of jQuery
        +// in a page that all might call define(). The loader will indicate
        +// they have special allowances for multiple jQuery versions by
        +// specifying define.amd.jQuery = true. Register as a named module,
        +// since jQuery can be concatenated with other files that may use define,
        +// but not use a proper concatenation script that understands anonymous
        +// AMD modules. A named AMD is safest and most robust way to register.
        +// Lowercase jquery is used because AMD module names are derived from
        +// file names, and jQuery is normally delivered in a lowercase file name.
        +// Do this after creating the global so that if an AMD module wants to call
        +// noConflict to hide this version of jQuery, it will work.
        +if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
        +	define( "jquery", [], function () { return jQuery; } );
        +}
        +
        +
        +
        +})( window );
        diff --git a/bower_components/select2/tests/vendor/qunit-1.23.1.css b/bower_components/select2/tests/vendor/qunit-1.23.1.css
        new file mode 100644
        index 0000000000..ae68fc412e
        --- /dev/null
        +++ b/bower_components/select2/tests/vendor/qunit-1.23.1.css
        @@ -0,0 +1,305 @@
        +/*!
        + * QUnit 1.23.1
        + * https://qunitjs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * https://jquery.org/license
        + *
        + * Date: 2016-04-12T17:29Z
        + */
        +
        +/** Font Family and Sizes */
        +
        +#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {
        +	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
        +}
        +
        +#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
        +#qunit-tests { font-size: smaller; }
        +
        +
        +/** Resets */
        +
        +#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
        +	margin: 0;
        +	padding: 0;
        +}
        +
        +
        +/** Header */
        +
        +#qunit-header {
        +	padding: 0.5em 0 0.5em 1em;
        +
        +	color: #8699A4;
        +	background-color: #0D3349;
        +
        +	font-size: 1.5em;
        +	line-height: 1em;
        +	font-weight: 400;
        +
        +	border-radius: 5px 5px 0 0;
        +}
        +
        +#qunit-header a {
        +	text-decoration: none;
        +	color: #C2CCD1;
        +}
        +
        +#qunit-header a:hover,
        +#qunit-header a:focus {
        +	color: #FFF;
        +}
        +
        +#qunit-testrunner-toolbar label {
        +	display: inline-block;
        +	padding: 0 0.5em 0 0.1em;
        +}
        +
        +#qunit-banner {
        +	height: 5px;
        +}
        +
        +#qunit-testrunner-toolbar {
        +	padding: 0.5em 1em 0.5em 1em;
        +	color: #5E740B;
        +	background-color: #EEE;
        +	overflow: hidden;
        +}
        +
        +#qunit-filteredTest {
        +	padding: 0.5em 1em 0.5em 1em;
        +	background-color: #F4FF77;
        +	color: #366097;
        +}
        +
        +#qunit-userAgent {
        +	padding: 0.5em 1em 0.5em 1em;
        +	background-color: #2B81AF;
        +	color: #FFF;
        +	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
        +}
        +
        +#qunit-modulefilter-container {
        +	float: right;
        +	padding: 0.2em;
        +}
        +
        +.qunit-url-config {
        +	display: inline-block;
        +	padding: 0.1em;
        +}
        +
        +.qunit-filter {
        +	display: block;
        +	float: right;
        +	margin-left: 1em;
        +}
        +
        +/** Tests: Pass/Fail */
        +
        +#qunit-tests {
        +	list-style-position: inside;
        +}
        +
        +#qunit-tests li {
        +	padding: 0.4em 1em 0.4em 1em;
        +	border-bottom: 1px solid #FFF;
        +	list-style-position: inside;
        +}
        +
        +#qunit-tests > li {
        +	display: none;
        +}
        +
        +#qunit-tests li.running,
        +#qunit-tests li.pass,
        +#qunit-tests li.fail,
        +#qunit-tests li.skipped {
        +	display: list-item;
        +}
        +
        +#qunit-tests.hidepass {
        +	position: relative;
        +}
        +
        +#qunit-tests.hidepass li.running,
        +#qunit-tests.hidepass li.pass {
        +	visibility: hidden;
        +	position: absolute;
        +	width:   0;
        +	height:  0;
        +	padding: 0;
        +	border:  0;
        +	margin:  0;
        +}
        +
        +#qunit-tests li strong {
        +	cursor: pointer;
        +}
        +
        +#qunit-tests li.skipped strong {
        +	cursor: default;
        +}
        +
        +#qunit-tests li a {
        +	padding: 0.5em;
        +	color: #C2CCD1;
        +	text-decoration: none;
        +}
        +
        +#qunit-tests li p a {
        +	padding: 0.25em;
        +	color: #6B6464;
        +}
        +#qunit-tests li a:hover,
        +#qunit-tests li a:focus {
        +	color: #000;
        +}
        +
        +#qunit-tests li .runtime {
        +	float: right;
        +	font-size: smaller;
        +}
        +
        +.qunit-assert-list {
        +	margin-top: 0.5em;
        +	padding: 0.5em;
        +
        +	background-color: #FFF;
        +
        +	border-radius: 5px;
        +}
        +
        +.qunit-source {
        +	margin: 0.6em 0 0.3em;
        +}
        +
        +.qunit-collapsed {
        +	display: none;
        +}
        +
        +#qunit-tests table {
        +	border-collapse: collapse;
        +	margin-top: 0.2em;
        +}
        +
        +#qunit-tests th {
        +	text-align: right;
        +	vertical-align: top;
        +	padding: 0 0.5em 0 0;
        +}
        +
        +#qunit-tests td {
        +	vertical-align: top;
        +}
        +
        +#qunit-tests pre {
        +	margin: 0;
        +	white-space: pre-wrap;
        +	word-wrap: break-word;
        +}
        +
        +#qunit-tests del {
        +	background-color: #E0F2BE;
        +	color: #374E0C;
        +	text-decoration: none;
        +}
        +
        +#qunit-tests ins {
        +	background-color: #FFCACA;
        +	color: #500;
        +	text-decoration: none;
        +}
        +
        +/*** Test Counts */
        +
        +#qunit-tests b.counts                       { color: #000; }
        +#qunit-tests b.passed                       { color: #5E740B; }
        +#qunit-tests b.failed                       { color: #710909; }
        +
        +#qunit-tests li li {
        +	padding: 5px;
        +	background-color: #FFF;
        +	border-bottom: none;
        +	list-style-position: inside;
        +}
        +
        +/*** Passing Styles */
        +
        +#qunit-tests li li.pass {
        +	color: #3C510C;
        +	background-color: #FFF;
        +	border-left: 10px solid #C6E746;
        +}
        +
        +#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
        +#qunit-tests .pass .test-name               { color: #366097; }
        +
        +#qunit-tests .pass .test-actual,
        +#qunit-tests .pass .test-expected           { color: #999; }
        +
        +#qunit-banner.qunit-pass                    { background-color: #C6E746; }
        +
        +/*** Failing Styles */
        +
        +#qunit-tests li li.fail {
        +	color: #710909;
        +	background-color: #FFF;
        +	border-left: 10px solid #EE5757;
        +	white-space: pre;
        +}
        +
        +#qunit-tests > li:last-child {
        +	border-radius: 0 0 5px 5px;
        +}
        +
        +#qunit-tests .fail                          { color: #000; background-color: #EE5757; }
        +#qunit-tests .fail .test-name,
        +#qunit-tests .fail .module-name             { color: #000; }
        +
        +#qunit-tests .fail .test-actual             { color: #EE5757; }
        +#qunit-tests .fail .test-expected           { color: #008000; }
        +
        +#qunit-banner.qunit-fail                    { background-color: #EE5757; }
        +
        +/*** Skipped tests */
        +
        +#qunit-tests .skipped {
        +	background-color: #EBECE9;
        +}
        +
        +#qunit-tests .qunit-skipped-label {
        +	background-color: #F4FF77;
        +	display: inline-block;
        +	font-style: normal;
        +	color: #366097;
        +	line-height: 1.8em;
        +	padding: 0 0.5em;
        +	margin: -0.4em 0.4em -0.4em 0;
        +}
        +
        +/** Result */
        +
        +#qunit-testresult {
        +	padding: 0.5em 1em 0.5em 1em;
        +
        +	color: #2B81AF;
        +	background-color: #D2E0E6;
        +
        +	border-bottom: 1px solid #FFF;
        +}
        +#qunit-testresult .module-name {
        +	font-weight: 700;
        +}
        +
        +/** Fixture */
        +
        +#qunit-fixture {
        +	position: absolute;
        +	top: -10000px;
        +	left: -10000px;
        +	width: 1000px;
        +	height: 1000px;
        +}
        diff --git a/bower_components/select2/tests/vendor/qunit-1.23.1.js b/bower_components/select2/tests/vendor/qunit-1.23.1.js
        new file mode 100644
        index 0000000000..5df0822ea4
        --- /dev/null
        +++ b/bower_components/select2/tests/vendor/qunit-1.23.1.js
        @@ -0,0 +1,4334 @@
        +/*!
        + * QUnit 1.23.1
        + * https://qunitjs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * https://jquery.org/license
        + *
        + * Date: 2016-04-12T17:29Z
        + */
        +
        +( function( global ) {
        +
        +var QUnit = {};
        +
        +var Date = global.Date;
        +var now = Date.now || function() {
        +	return new Date().getTime();
        +};
        +
        +var setTimeout = global.setTimeout;
        +var clearTimeout = global.clearTimeout;
        +
        +// Store a local window from the global to allow direct references.
        +var window = global.window;
        +
        +var defined = {
        +	document: window && window.document !== undefined,
        +	setTimeout: setTimeout !== undefined,
        +	sessionStorage: ( function() {
        +		var x = "qunit-test-string";
        +		try {
        +			sessionStorage.setItem( x, x );
        +			sessionStorage.removeItem( x );
        +			return true;
        +		} catch ( e ) {
        +			return false;
        +		}
        +	}() )
        +};
        +
        +var fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" );
        +var globalStartCalled = false;
        +var runStarted = false;
        +
        +var toString = Object.prototype.toString,
        +	hasOwn = Object.prototype.hasOwnProperty;
        +
        +// Returns a new Array with the elements that are in a but not in b
        +function diff( a, b ) {
        +	var i, j,
        +		result = a.slice();
        +
        +	for ( i = 0; i < result.length; i++ ) {
        +		for ( j = 0; j < b.length; j++ ) {
        +			if ( result[ i ] === b[ j ] ) {
        +				result.splice( i, 1 );
        +				i--;
        +				break;
        +			}
        +		}
        +	}
        +	return result;
        +}
        +
        +// From jquery.js
        +function inArray( elem, array ) {
        +	if ( array.indexOf ) {
        +		return array.indexOf( elem );
        +	}
        +
        +	for ( var i = 0, length = array.length; i < length; i++ ) {
        +		if ( array[ i ] === elem ) {
        +			return i;
        +		}
        +	}
        +
        +	return -1;
        +}
        +
        +/**
        + * Makes a clone of an object using only Array or Object as base,
        + * and copies over the own enumerable properties.
        + *
        + * @param {Object} obj
        + * @return {Object} New object with only the own properties (recursively).
        + */
        +function objectValues ( obj ) {
        +	var key, val,
        +		vals = QUnit.is( "array", obj ) ? [] : {};
        +	for ( key in obj ) {
        +		if ( hasOwn.call( obj, key ) ) {
        +			val = obj[ key ];
        +			vals[ key ] = val === Object( val ) ? objectValues( val ) : val;
        +		}
        +	}
        +	return vals;
        +}
        +
        +function extend( a, b, undefOnly ) {
        +	for ( var prop in b ) {
        +		if ( hasOwn.call( b, prop ) ) {
        +
        +			// Avoid "Member not found" error in IE8 caused by messing with window.constructor
        +			// This block runs on every environment, so `global` is being used instead of `window`
        +			// to avoid errors on node.
        +			if ( prop !== "constructor" || a !== global ) {
        +				if ( b[ prop ] === undefined ) {
        +					delete a[ prop ];
        +				} else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
        +					a[ prop ] = b[ prop ];
        +				}
        +			}
        +		}
        +	}
        +
        +	return a;
        +}
        +
        +function objectType( obj ) {
        +	if ( typeof obj === "undefined" ) {
        +		return "undefined";
        +	}
        +
        +	// Consider: typeof null === object
        +	if ( obj === null ) {
        +		return "null";
        +	}
        +
        +	var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
        +		type = match && match[ 1 ];
        +
        +	switch ( type ) {
        +		case "Number":
        +			if ( isNaN( obj ) ) {
        +				return "nan";
        +			}
        +			return "number";
        +		case "String":
        +		case "Boolean":
        +		case "Array":
        +		case "Set":
        +		case "Map":
        +		case "Date":
        +		case "RegExp":
        +		case "Function":
        +		case "Symbol":
        +			return type.toLowerCase();
        +	}
        +	if ( typeof obj === "object" ) {
        +		return "object";
        +	}
        +}
        +
        +// Safe object type checking
        +function is( type, obj ) {
        +	return QUnit.objectType( obj ) === type;
        +}
        +
        +// Doesn't support IE6 to IE9, it will return undefined on these browsers
        +// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
        +function extractStacktrace( e, offset ) {
        +	offset = offset === undefined ? 4 : offset;
        +
        +	var stack, include, i;
        +
        +	if ( e.stack ) {
        +		stack = e.stack.split( "\n" );
        +		if ( /^error$/i.test( stack[ 0 ] ) ) {
        +			stack.shift();
        +		}
        +		if ( fileName ) {
        +			include = [];
        +			for ( i = offset; i < stack.length; i++ ) {
        +				if ( stack[ i ].indexOf( fileName ) !== -1 ) {
        +					break;
        +				}
        +				include.push( stack[ i ] );
        +			}
        +			if ( include.length ) {
        +				return include.join( "\n" );
        +			}
        +		}
        +		return stack[ offset ];
        +
        +	// Support: Safari <=6 only
        +	} else if ( e.sourceURL ) {
        +
        +		// Exclude useless self-reference for generated Error objects
        +		if ( /qunit.js$/.test( e.sourceURL ) ) {
        +			return;
        +		}
        +
        +		// For actual exceptions, this is useful
        +		return e.sourceURL + ":" + e.line;
        +	}
        +}
        +
        +function sourceFromStacktrace( offset ) {
        +	var error = new Error();
        +
        +	// Support: Safari <=7 only, IE <=10 - 11 only
        +	// Not all browsers generate the `stack` property for `new Error()`, see also #636
        +	if ( !error.stack ) {
        +		try {
        +			throw error;
        +		} catch ( err ) {
        +			error = err;
        +		}
        +	}
        +
        +	return extractStacktrace( error, offset );
        +}
        +
        +/**
        + * Config object: Maintain internal state
        + * Later exposed as QUnit.config
        + * `config` initialized at top of scope
        + */
        +var config = {
        +
        +	// The queue of tests to run
        +	queue: [],
        +
        +	// Block until document ready
        +	blocking: true,
        +
        +	// By default, run previously failed tests first
        +	// very useful in combination with "Hide passed tests" checked
        +	reorder: true,
        +
        +	// By default, modify document.title when suite is done
        +	altertitle: true,
        +
        +	// HTML Reporter: collapse every test except the first failing test
        +	// If false, all failing tests will be expanded
        +	collapse: true,
        +
        +	// By default, scroll to top of the page when suite is done
        +	scrolltop: true,
        +
        +	// Depth up-to which object will be dumped
        +	maxDepth: 5,
        +
        +	// When enabled, all tests must call expect()
        +	requireExpects: false,
        +
        +	// Placeholder for user-configurable form-exposed URL parameters
        +	urlConfig: [],
        +
        +	// Set of all modules.
        +	modules: [],
        +
        +	// Stack of nested modules
        +	moduleStack: [],
        +
        +	// The first unnamed module
        +	currentModule: {
        +		name: "",
        +		tests: []
        +	},
        +
        +	callbacks: {}
        +};
        +
        +// Push a loose unnamed module to the modules collection
        +config.modules.push( config.currentModule );
        +
        +var loggingCallbacks = {};
        +
        +// Register logging callbacks
        +function registerLoggingCallbacks( obj ) {
        +	var i, l, key,
        +		callbackNames = [ "begin", "done", "log", "testStart", "testDone",
        +			"moduleStart", "moduleDone" ];
        +
        +	function registerLoggingCallback( key ) {
        +		var loggingCallback = function( callback ) {
        +			if ( objectType( callback ) !== "function" ) {
        +				throw new Error(
        +					"QUnit logging methods require a callback function as their first parameters."
        +				);
        +			}
        +
        +			config.callbacks[ key ].push( callback );
        +		};
        +
        +		// DEPRECATED: This will be removed on QUnit 2.0.0+
        +		// Stores the registered functions allowing restoring
        +		// at verifyLoggingCallbacks() if modified
        +		loggingCallbacks[ key ] = loggingCallback;
        +
        +		return loggingCallback;
        +	}
        +
        +	for ( i = 0, l = callbackNames.length; i < l; i++ ) {
        +		key = callbackNames[ i ];
        +
        +		// Initialize key collection of logging callback
        +		if ( objectType( config.callbacks[ key ] ) === "undefined" ) {
        +			config.callbacks[ key ] = [];
        +		}
        +
        +		obj[ key ] = registerLoggingCallback( key );
        +	}
        +}
        +
        +function runLoggingCallbacks( key, args ) {
        +	var i, l, callbacks;
        +
        +	callbacks = config.callbacks[ key ];
        +	for ( i = 0, l = callbacks.length; i < l; i++ ) {
        +		callbacks[ i ]( args );
        +	}
        +}
        +
        +// DEPRECATED: This will be removed on 2.0.0+
        +// This function verifies if the loggingCallbacks were modified by the user
        +// If so, it will restore it, assign the given callback and print a console warning
        +function verifyLoggingCallbacks() {
        +	var loggingCallback, userCallback;
        +
        +	for ( loggingCallback in loggingCallbacks ) {
        +		if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {
        +
        +			userCallback = QUnit[ loggingCallback ];
        +
        +			// Restore the callback function
        +			QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];
        +
        +			// Assign the deprecated given callback
        +			QUnit[ loggingCallback ]( userCallback );
        +
        +			if ( global.console && global.console.warn ) {
        +				global.console.warn(
        +					"QUnit." + loggingCallback + " was replaced with a new value.\n" +
        +					"Please, check out the documentation on how to apply logging callbacks.\n" +
        +					"Reference: https://api.qunitjs.com/category/callbacks/"
        +				);
        +			}
        +		}
        +	}
        +}
        +
        +( function() {
        +	if ( !defined.document ) {
        +		return;
        +	}
        +
        +	// `onErrorFnPrev` initialized at top of scope
        +	// Preserve other handlers
        +	var onErrorFnPrev = window.onerror;
        +
        +	// Cover uncaught exceptions
        +	// Returning true will suppress the default browser handler,
        +	// returning false will let it run.
        +	window.onerror = function( error, filePath, linerNr ) {
        +		var ret = false;
        +		if ( onErrorFnPrev ) {
        +			ret = onErrorFnPrev( error, filePath, linerNr );
        +		}
        +
        +		// Treat return value as window.onerror itself does,
        +		// Only do our handling if not suppressed.
        +		if ( ret !== true ) {
        +			if ( QUnit.config.current ) {
        +				if ( QUnit.config.current.ignoreGlobalErrors ) {
        +					return true;
        +				}
        +				QUnit.pushFailure( error, filePath + ":" + linerNr );
        +			} else {
        +				QUnit.test( "global failure", extend( function() {
        +					QUnit.pushFailure( error, filePath + ":" + linerNr );
        +				}, { validTest: true } ) );
        +			}
        +			return false;
        +		}
        +
        +		return ret;
        +	};
        +}() );
        +
        +// Figure out if we're running the tests from a server or not
        +QUnit.isLocal = !( defined.document && window.location.protocol !== "file:" );
        +
        +// Expose the current QUnit version
        +QUnit.version = "1.23.1";
        +
        +extend( QUnit, {
        +
        +	// Call on start of module test to prepend name to all tests
        +	module: function( name, testEnvironment, executeNow ) {
        +		var module, moduleFns;
        +		var currentModule = config.currentModule;
        +
        +		if ( arguments.length === 2 ) {
        +			if ( objectType( testEnvironment ) === "function" ) {
        +				executeNow = testEnvironment;
        +				testEnvironment = undefined;
        +			}
        +		}
        +
        +		// DEPRECATED: handles setup/teardown functions,
        +		// beforeEach and afterEach should be used instead
        +		if ( testEnvironment && testEnvironment.setup ) {
        +			testEnvironment.beforeEach = testEnvironment.setup;
        +			delete testEnvironment.setup;
        +		}
        +		if ( testEnvironment && testEnvironment.teardown ) {
        +			testEnvironment.afterEach = testEnvironment.teardown;
        +			delete testEnvironment.teardown;
        +		}
        +
        +		module = createModule();
        +
        +		moduleFns = {
        +			beforeEach: setHook( module, "beforeEach" ),
        +			afterEach: setHook( module, "afterEach" )
        +		};
        +
        +		if ( objectType( executeNow ) === "function" ) {
        +			config.moduleStack.push( module );
        +			setCurrentModule( module );
        +			executeNow.call( module.testEnvironment, moduleFns );
        +			config.moduleStack.pop();
        +			module = module.parentModule || currentModule;
        +		}
        +
        +		setCurrentModule( module );
        +
        +		function createModule() {
        +			var parentModule = config.moduleStack.length ?
        +				config.moduleStack.slice( -1 )[ 0 ] : null;
        +			var moduleName = parentModule !== null ?
        +				[ parentModule.name, name ].join( " > " ) : name;
        +			var module = {
        +				name: moduleName,
        +				parentModule: parentModule,
        +				tests: [],
        +				moduleId: generateHash( moduleName )
        +			};
        +
        +			var env = {};
        +			if ( parentModule ) {
        +				extend( env, parentModule.testEnvironment );
        +				delete env.beforeEach;
        +				delete env.afterEach;
        +			}
        +			extend( env, testEnvironment );
        +			module.testEnvironment = env;
        +
        +			config.modules.push( module );
        +			return module;
        +		}
        +
        +		function setCurrentModule( module ) {
        +			config.currentModule = module;
        +		}
        +
        +	},
        +
        +	// DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.
        +	asyncTest: asyncTest,
        +
        +	test: test,
        +
        +	skip: skip,
        +
        +	only: only,
        +
        +	// DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0.
        +	// In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior.
        +	start: function( count ) {
        +		var globalStartAlreadyCalled = globalStartCalled;
        +
        +		if ( !config.current ) {
        +			globalStartCalled = true;
        +
        +			if ( runStarted ) {
        +				throw new Error( "Called start() outside of a test context while already started" );
        +			} else if ( globalStartAlreadyCalled || count > 1 ) {
        +				throw new Error( "Called start() outside of a test context too many times" );
        +			} else if ( config.autostart ) {
        +				throw new Error( "Called start() outside of a test context when " +
        +					"QUnit.config.autostart was true" );
        +			} else if ( !config.pageLoaded ) {
        +
        +				// The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it
        +				config.autostart = true;
        +				return;
        +			}
        +		} else {
        +
        +			// If a test is running, adjust its semaphore
        +			config.current.semaphore -= count || 1;
        +
        +			// If semaphore is non-numeric, throw error
        +			if ( isNaN( config.current.semaphore ) ) {
        +				config.current.semaphore = 0;
        +
        +				QUnit.pushFailure(
        +					"Called start() with a non-numeric decrement.",
        +					sourceFromStacktrace( 2 )
        +				);
        +				return;
        +			}
        +
        +			// Don't start until equal number of stop-calls
        +			if ( config.current.semaphore > 0 ) {
        +				return;
        +			}
        +
        +			// Throw an Error if start is called more often than stop
        +			if ( config.current.semaphore < 0 ) {
        +				config.current.semaphore = 0;
        +
        +				QUnit.pushFailure(
        +					"Called start() while already started (test's semaphore was 0 already)",
        +					sourceFromStacktrace( 2 )
        +				);
        +				return;
        +			}
        +		}
        +
        +		resumeProcessing();
        +	},
        +
        +	// DEPRECATED: QUnit.stop() will be removed in QUnit 2.0.
        +	stop: function( count ) {
        +
        +		// If there isn't a test running, don't allow QUnit.stop() to be called
        +		if ( !config.current ) {
        +			throw new Error( "Called stop() outside of a test context" );
        +		}
        +
        +		// If a test is running, adjust its semaphore
        +		config.current.semaphore += count || 1;
        +
        +		pauseProcessing();
        +	},
        +
        +	config: config,
        +
        +	is: is,
        +
        +	objectType: objectType,
        +
        +	extend: extend,
        +
        +	load: function() {
        +		config.pageLoaded = true;
        +
        +		// Initialize the configuration options
        +		extend( config, {
        +			stats: { all: 0, bad: 0 },
        +			moduleStats: { all: 0, bad: 0 },
        +			started: 0,
        +			updateRate: 1000,
        +			autostart: true,
        +			filter: ""
        +		}, true );
        +
        +		config.blocking = false;
        +
        +		if ( config.autostart ) {
        +			resumeProcessing();
        +		}
        +	},
        +
        +	stack: function( offset ) {
        +		offset = ( offset || 0 ) + 2;
        +		return sourceFromStacktrace( offset );
        +	}
        +} );
        +
        +registerLoggingCallbacks( QUnit );
        +
        +function begin() {
        +	var i, l,
        +		modulesLog = [];
        +
        +	// If the test run hasn't officially begun yet
        +	if ( !config.started ) {
        +
        +		// Record the time of the test run's beginning
        +		config.started = now();
        +
        +		verifyLoggingCallbacks();
        +
        +		// Delete the loose unnamed module if unused.
        +		if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) {
        +			config.modules.shift();
        +		}
        +
        +		// Avoid unnecessary information by not logging modules' test environments
        +		for ( i = 0, l = config.modules.length; i < l; i++ ) {
        +			modulesLog.push( {
        +				name: config.modules[ i ].name,
        +				tests: config.modules[ i ].tests
        +			} );
        +		}
        +
        +		// The test run is officially beginning now
        +		runLoggingCallbacks( "begin", {
        +			totalTests: Test.count,
        +			modules: modulesLog
        +		} );
        +	}
        +
        +	config.blocking = false;
        +	process( true );
        +}
        +
        +function process( last ) {
        +	function next() {
        +		process( last );
        +	}
        +	var start = now();
        +	config.depth = ( config.depth || 0 ) + 1;
        +
        +	while ( config.queue.length && !config.blocking ) {
        +		if ( !defined.setTimeout || config.updateRate <= 0 ||
        +				( ( now() - start ) < config.updateRate ) ) {
        +			if ( config.current ) {
        +
        +				// Reset async tracking for each phase of the Test lifecycle
        +				config.current.usedAsync = false;
        +			}
        +			config.queue.shift()();
        +		} else {
        +			setTimeout( next, 13 );
        +			break;
        +		}
        +	}
        +	config.depth--;
        +	if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
        +		done();
        +	}
        +}
        +
        +function pauseProcessing() {
        +	config.blocking = true;
        +
        +	if ( config.testTimeout && defined.setTimeout ) {
        +		clearTimeout( config.timeout );
        +		config.timeout = setTimeout( function() {
        +			if ( config.current ) {
        +				config.current.semaphore = 0;
        +				QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
        +			} else {
        +				throw new Error( "Test timed out" );
        +			}
        +			resumeProcessing();
        +		}, config.testTimeout );
        +	}
        +}
        +
        +function resumeProcessing() {
        +	runStarted = true;
        +
        +	// A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)
        +	if ( defined.setTimeout ) {
        +		setTimeout( function() {
        +			if ( config.current && config.current.semaphore > 0 ) {
        +				return;
        +			}
        +			if ( config.timeout ) {
        +				clearTimeout( config.timeout );
        +			}
        +
        +			begin();
        +		}, 13 );
        +	} else {
        +		begin();
        +	}
        +}
        +
        +function done() {
        +	var runtime, passed;
        +
        +	config.autorun = true;
        +
        +	// Log the last module results
        +	if ( config.previousModule ) {
        +		runLoggingCallbacks( "moduleDone", {
        +			name: config.previousModule.name,
        +			tests: config.previousModule.tests,
        +			failed: config.moduleStats.bad,
        +			passed: config.moduleStats.all - config.moduleStats.bad,
        +			total: config.moduleStats.all,
        +			runtime: now() - config.moduleStats.started
        +		} );
        +	}
        +	delete config.previousModule;
        +
        +	runtime = now() - config.started;
        +	passed = config.stats.all - config.stats.bad;
        +
        +	runLoggingCallbacks( "done", {
        +		failed: config.stats.bad,
        +		passed: passed,
        +		total: config.stats.all,
        +		runtime: runtime
        +	} );
        +}
        +
        +function setHook( module, hookName ) {
        +	if ( module.testEnvironment === undefined ) {
        +		module.testEnvironment = {};
        +	}
        +
        +	return function( callback ) {
        +		module.testEnvironment[ hookName ] = callback;
        +	};
        +}
        +
        +var focused = false;
        +var priorityCount = 0;
        +var unitSampler;
        +
        +function Test( settings ) {
        +	var i, l;
        +
        +	++Test.count;
        +
        +	extend( this, settings );
        +	this.assertions = [];
        +	this.semaphore = 0;
        +	this.usedAsync = false;
        +	this.module = config.currentModule;
        +	this.stack = sourceFromStacktrace( 3 );
        +
        +	// Register unique strings
        +	for ( i = 0, l = this.module.tests; i < l.length; i++ ) {
        +		if ( this.module.tests[ i ].name === this.testName ) {
        +			this.testName += " ";
        +		}
        +	}
        +
        +	this.testId = generateHash( this.module.name, this.testName );
        +
        +	this.module.tests.push( {
        +		name: this.testName,
        +		testId: this.testId
        +	} );
        +
        +	if ( settings.skip ) {
        +
        +		// Skipped tests will fully ignore any sent callback
        +		this.callback = function() {};
        +		this.async = false;
        +		this.expected = 0;
        +	} else {
        +		this.assert = new Assert( this );
        +	}
        +}
        +
        +Test.count = 0;
        +
        +Test.prototype = {
        +	before: function() {
        +		if (
        +
        +			// Emit moduleStart when we're switching from one module to another
        +			this.module !== config.previousModule ||
        +
        +				// They could be equal (both undefined) but if the previousModule property doesn't
        +				// yet exist it means this is the first test in a suite that isn't wrapped in a
        +				// module, in which case we'll just emit a moduleStart event for 'undefined'.
        +				// Without this, reporters can get testStart before moduleStart  which is a problem.
        +				!hasOwn.call( config, "previousModule" )
        +		) {
        +			if ( hasOwn.call( config, "previousModule" ) ) {
        +				runLoggingCallbacks( "moduleDone", {
        +					name: config.previousModule.name,
        +					tests: config.previousModule.tests,
        +					failed: config.moduleStats.bad,
        +					passed: config.moduleStats.all - config.moduleStats.bad,
        +					total: config.moduleStats.all,
        +					runtime: now() - config.moduleStats.started
        +				} );
        +			}
        +			config.previousModule = this.module;
        +			config.moduleStats = { all: 0, bad: 0, started: now() };
        +			runLoggingCallbacks( "moduleStart", {
        +				name: this.module.name,
        +				tests: this.module.tests
        +			} );
        +		}
        +
        +		config.current = this;
        +
        +		if ( this.module.testEnvironment ) {
        +			delete this.module.testEnvironment.beforeEach;
        +			delete this.module.testEnvironment.afterEach;
        +		}
        +		this.testEnvironment = extend( {}, this.module.testEnvironment );
        +
        +		this.started = now();
        +		runLoggingCallbacks( "testStart", {
        +			name: this.testName,
        +			module: this.module.name,
        +			testId: this.testId
        +		} );
        +
        +		if ( !config.pollution ) {
        +			saveGlobal();
        +		}
        +	},
        +
        +	run: function() {
        +		var promise;
        +
        +		config.current = this;
        +
        +		if ( this.async ) {
        +			QUnit.stop();
        +		}
        +
        +		this.callbackStarted = now();
        +
        +		if ( config.notrycatch ) {
        +			runTest( this );
        +			return;
        +		}
        +
        +		try {
        +			runTest( this );
        +		} catch ( e ) {
        +			this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " +
        +				this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
        +
        +			// Else next test will carry the responsibility
        +			saveGlobal();
        +
        +			// Restart the tests if they're blocking
        +			if ( config.blocking ) {
        +				QUnit.start();
        +			}
        +		}
        +
        +		function runTest( test ) {
        +			promise = test.callback.call( test.testEnvironment, test.assert );
        +			test.resolvePromise( promise );
        +		}
        +	},
        +
        +	after: function() {
        +		checkPollution();
        +	},
        +
        +	queueHook: function( hook, hookName ) {
        +		var promise,
        +			test = this;
        +		return function runHook() {
        +			config.current = test;
        +			if ( config.notrycatch ) {
        +				callHook();
        +				return;
        +			}
        +			try {
        +				callHook();
        +			} catch ( error ) {
        +				test.pushFailure( hookName + " failed on " + test.testName + ": " +
        +				( error.message || error ), extractStacktrace( error, 0 ) );
        +			}
        +
        +			function callHook() {
        +				promise = hook.call( test.testEnvironment, test.assert );
        +				test.resolvePromise( promise, hookName );
        +			}
        +		};
        +	},
        +
        +	// Currently only used for module level hooks, can be used to add global level ones
        +	hooks: function( handler ) {
        +		var hooks = [];
        +
        +		function processHooks( test, module ) {
        +			if ( module.parentModule ) {
        +				processHooks( test, module.parentModule );
        +			}
        +			if ( module.testEnvironment &&
        +				QUnit.objectType( module.testEnvironment[ handler ] ) === "function" ) {
        +				hooks.push( test.queueHook( module.testEnvironment[ handler ], handler ) );
        +			}
        +		}
        +
        +		// Hooks are ignored on skipped tests
        +		if ( !this.skip ) {
        +			processHooks( this, this.module );
        +		}
        +		return hooks;
        +	},
        +
        +	finish: function() {
        +		config.current = this;
        +		if ( config.requireExpects && this.expected === null ) {
        +			this.pushFailure( "Expected number of assertions to be defined, but expect() was " +
        +				"not called.", this.stack );
        +		} else if ( this.expected !== null && this.expected !== this.assertions.length ) {
        +			this.pushFailure( "Expected " + this.expected + " assertions, but " +
        +				this.assertions.length + " were run", this.stack );
        +		} else if ( this.expected === null && !this.assertions.length ) {
        +			this.pushFailure( "Expected at least one assertion, but none were run - call " +
        +				"expect(0) to accept zero assertions.", this.stack );
        +		}
        +
        +		var i,
        +			bad = 0;
        +
        +		this.runtime = now() - this.started;
        +		config.stats.all += this.assertions.length;
        +		config.moduleStats.all += this.assertions.length;
        +
        +		for ( i = 0; i < this.assertions.length; i++ ) {
        +			if ( !this.assertions[ i ].result ) {
        +				bad++;
        +				config.stats.bad++;
        +				config.moduleStats.bad++;
        +			}
        +		}
        +
        +		runLoggingCallbacks( "testDone", {
        +			name: this.testName,
        +			module: this.module.name,
        +			skipped: !!this.skip,
        +			failed: bad,
        +			passed: this.assertions.length - bad,
        +			total: this.assertions.length,
        +			runtime: this.runtime,
        +
        +			// HTML Reporter use
        +			assertions: this.assertions,
        +			testId: this.testId,
        +
        +			// Source of Test
        +			source: this.stack,
        +
        +			// DEPRECATED: this property will be removed in 2.0.0, use runtime instead
        +			duration: this.runtime
        +		} );
        +
        +		// QUnit.reset() is deprecated and will be replaced for a new
        +		// fixture reset function on QUnit 2.0/2.1.
        +		// It's still called here for backwards compatibility handling
        +		QUnit.reset();
        +
        +		config.current = undefined;
        +	},
        +
        +	queue: function() {
        +		var priority,
        +			test = this;
        +
        +		if ( !this.valid() ) {
        +			return;
        +		}
        +
        +		function run() {
        +
        +			// Each of these can by async
        +			synchronize( [
        +				function() {
        +					test.before();
        +				},
        +
        +				test.hooks( "beforeEach" ),
        +				function() {
        +					test.run();
        +				},
        +
        +				test.hooks( "afterEach" ).reverse(),
        +
        +				function() {
        +					test.after();
        +				},
        +				function() {
        +					test.finish();
        +				}
        +			] );
        +		}
        +
        +		// Prioritize previously failed tests, detected from sessionStorage
        +		priority = QUnit.config.reorder && defined.sessionStorage &&
        +				+sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName );
        +
        +		return synchronize( run, priority, config.seed );
        +	},
        +
        +	pushResult: function( resultInfo ) {
        +
        +		// Destructure of resultInfo = { result, actual, expected, message, negative }
        +		var source,
        +			details = {
        +				module: this.module.name,
        +				name: this.testName,
        +				result: resultInfo.result,
        +				message: resultInfo.message,
        +				actual: resultInfo.actual,
        +				expected: resultInfo.expected,
        +				testId: this.testId,
        +				negative: resultInfo.negative || false,
        +				runtime: now() - this.started
        +			};
        +
        +		if ( !resultInfo.result ) {
        +			source = sourceFromStacktrace();
        +
        +			if ( source ) {
        +				details.source = source;
        +			}
        +		}
        +
        +		runLoggingCallbacks( "log", details );
        +
        +		this.assertions.push( {
        +			result: !!resultInfo.result,
        +			message: resultInfo.message
        +		} );
        +	},
        +
        +	pushFailure: function( message, source, actual ) {
        +		if ( !( this instanceof Test ) ) {
        +			throw new Error( "pushFailure() assertion outside test context, was " +
        +				sourceFromStacktrace( 2 ) );
        +		}
        +
        +		var details = {
        +				module: this.module.name,
        +				name: this.testName,
        +				result: false,
        +				message: message || "error",
        +				actual: actual || null,
        +				testId: this.testId,
        +				runtime: now() - this.started
        +			};
        +
        +		if ( source ) {
        +			details.source = source;
        +		}
        +
        +		runLoggingCallbacks( "log", details );
        +
        +		this.assertions.push( {
        +			result: false,
        +			message: message
        +		} );
        +	},
        +
        +	resolvePromise: function( promise, phase ) {
        +		var then, message,
        +			test = this;
        +		if ( promise != null ) {
        +			then = promise.then;
        +			if ( QUnit.objectType( then ) === "function" ) {
        +				QUnit.stop();
        +				then.call(
        +					promise,
        +					function() { QUnit.start(); },
        +					function( error ) {
        +						message = "Promise rejected " +
        +							( !phase ? "during" : phase.replace( /Each$/, "" ) ) +
        +							" " + test.testName + ": " + ( error.message || error );
        +						test.pushFailure( message, extractStacktrace( error, 0 ) );
        +
        +						// Else next test will carry the responsibility
        +						saveGlobal();
        +
        +						// Unblock
        +						QUnit.start();
        +					}
        +				);
        +			}
        +		}
        +	},
        +
        +	valid: function() {
        +		var filter = config.filter,
        +			regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec( filter ),
        +			module = config.module && config.module.toLowerCase(),
        +			fullName = ( this.module.name + ": " + this.testName );
        +
        +		function moduleChainNameMatch( testModule ) {
        +			var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
        +			if ( testModuleName === module ) {
        +				return true;
        +			} else if ( testModule.parentModule ) {
        +				return moduleChainNameMatch( testModule.parentModule );
        +			} else {
        +				return false;
        +			}
        +		}
        +
        +		function moduleChainIdMatch( testModule ) {
        +			return inArray( testModule.moduleId, config.moduleId ) > -1 ||
        +				testModule.parentModule && moduleChainIdMatch( testModule.parentModule );
        +		}
        +
        +		// Internally-generated tests are always valid
        +		if ( this.callback && this.callback.validTest ) {
        +			return true;
        +		}
        +
        +		if ( config.moduleId && config.moduleId.length > 0 &&
        +			!moduleChainIdMatch( this.module ) ) {
        +
        +			return false;
        +		}
        +
        +		if ( config.testId && config.testId.length > 0 &&
        +			inArray( this.testId, config.testId ) < 0 ) {
        +
        +			return false;
        +		}
        +
        +		if ( module && !moduleChainNameMatch( this.module ) ) {
        +			return false;
        +		}
        +
        +		if ( !filter ) {
        +			return true;
        +		}
        +
        +		return regexFilter ?
        +			this.regexFilter( !!regexFilter[ 1 ], regexFilter[ 2 ], regexFilter[ 3 ], fullName ) :
        +			this.stringFilter( filter, fullName );
        +	},
        +
        +	regexFilter: function( exclude, pattern, flags, fullName ) {
        +		var regex = new RegExp( pattern, flags );
        +		var match = regex.test( fullName );
        +
        +		return match !== exclude;
        +	},
        +
        +	stringFilter: function( filter, fullName ) {
        +		filter = filter.toLowerCase();
        +		fullName = fullName.toLowerCase();
        +
        +		var include = filter.charAt( 0 ) !== "!";
        +		if ( !include ) {
        +			filter = filter.slice( 1 );
        +		}
        +
        +		// If the filter matches, we need to honour include
        +		if ( fullName.indexOf( filter ) !== -1 ) {
        +			return include;
        +		}
        +
        +		// Otherwise, do the opposite
        +		return !include;
        +	}
        +};
        +
        +// Resets the test setup. Useful for tests that modify the DOM.
        +/*
        +DEPRECATED: Use multiple tests instead of resetting inside a test.
        +Use testStart or testDone for custom cleanup.
        +This method will throw an error in 2.0, and will be removed in 2.1
        +*/
        +QUnit.reset = function() {
        +
        +	// Return on non-browser environments
        +	// This is necessary to not break on node tests
        +	if ( !defined.document ) {
        +		return;
        +	}
        +
        +	var fixture = defined.document && document.getElementById &&
        +			document.getElementById( "qunit-fixture" );
        +
        +	if ( fixture ) {
        +		fixture.innerHTML = config.fixture;
        +	}
        +};
        +
        +QUnit.pushFailure = function() {
        +	if ( !QUnit.config.current ) {
        +		throw new Error( "pushFailure() assertion outside test context, in " +
        +			sourceFromStacktrace( 2 ) );
        +	}
        +
        +	// Gets current test obj
        +	var currentTest = QUnit.config.current;
        +
        +	return currentTest.pushFailure.apply( currentTest, arguments );
        +};
        +
        +// Based on Java's String.hashCode, a simple but not
        +// rigorously collision resistant hashing function
        +function generateHash( module, testName ) {
        +	var hex,
        +		i = 0,
        +		hash = 0,
        +		str = module + "\x1C" + testName,
        +		len = str.length;
        +
        +	for ( ; i < len; i++ ) {
        +		hash  = ( ( hash << 5 ) - hash ) + str.charCodeAt( i );
        +		hash |= 0;
        +	}
        +
        +	// Convert the possibly negative integer hash code into an 8 character hex string, which isn't
        +	// strictly necessary but increases user understanding that the id is a SHA-like hash
        +	hex = ( 0x100000000 + hash ).toString( 16 );
        +	if ( hex.length < 8 ) {
        +		hex = "0000000" + hex;
        +	}
        +
        +	return hex.slice( -8 );
        +}
        +
        +function synchronize( callback, priority, seed ) {
        +	var last = !priority,
        +		index;
        +
        +	if ( QUnit.objectType( callback ) === "array" ) {
        +		while ( callback.length ) {
        +			synchronize( callback.shift() );
        +		}
        +		return;
        +	}
        +
        +	if ( priority ) {
        +		config.queue.splice( priorityCount++, 0, callback );
        +	} else if ( seed ) {
        +		if ( !unitSampler ) {
        +			unitSampler = unitSamplerGenerator( seed );
        +		}
        +
        +		// Insert into a random position after all priority items
        +		index = Math.floor( unitSampler() * ( config.queue.length - priorityCount + 1 ) );
        +		config.queue.splice( priorityCount + index, 0, callback );
        +	} else {
        +		config.queue.push( callback );
        +	}
        +
        +	if ( config.autorun && !config.blocking ) {
        +		process( last );
        +	}
        +}
        +
        +function unitSamplerGenerator( seed ) {
        +
        +	// 32-bit xorshift, requires only a nonzero seed
        +	// http://excamera.com/sphinx/article-xorshift.html
        +	var sample = parseInt( generateHash( seed ), 16 ) || -1;
        +	return function() {
        +		sample ^= sample << 13;
        +		sample ^= sample >>> 17;
        +		sample ^= sample << 5;
        +
        +		// ECMAScript has no unsigned number type
        +		if ( sample < 0 ) {
        +			sample += 0x100000000;
        +		}
        +
        +		return sample / 0x100000000;
        +	};
        +}
        +
        +function saveGlobal() {
        +	config.pollution = [];
        +
        +	if ( config.noglobals ) {
        +		for ( var key in global ) {
        +			if ( hasOwn.call( global, key ) ) {
        +
        +				// In Opera sometimes DOM element ids show up here, ignore them
        +				if ( /^qunit-test-output/.test( key ) ) {
        +					continue;
        +				}
        +				config.pollution.push( key );
        +			}
        +		}
        +	}
        +}
        +
        +function checkPollution() {
        +	var newGlobals,
        +		deletedGlobals,
        +		old = config.pollution;
        +
        +	saveGlobal();
        +
        +	newGlobals = diff( config.pollution, old );
        +	if ( newGlobals.length > 0 ) {
        +		QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) );
        +	}
        +
        +	deletedGlobals = diff( old, config.pollution );
        +	if ( deletedGlobals.length > 0 ) {
        +		QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) );
        +	}
        +}
        +
        +// Will be exposed as QUnit.asyncTest
        +function asyncTest( testName, expected, callback ) {
        +	if ( arguments.length === 2 ) {
        +		callback = expected;
        +		expected = null;
        +	}
        +
        +	QUnit.test( testName, expected, callback, true );
        +}
        +
        +// Will be exposed as QUnit.test
        +function test( testName, expected, callback, async ) {
        +	if ( focused )  { return; }
        +
        +	var newTest;
        +
        +	if ( arguments.length === 2 ) {
        +		callback = expected;
        +		expected = null;
        +	}
        +
        +	newTest = new Test( {
        +		testName: testName,
        +		expected: expected,
        +		async: async,
        +		callback: callback
        +	} );
        +
        +	newTest.queue();
        +}
        +
        +// Will be exposed as QUnit.skip
        +function skip( testName ) {
        +	if ( focused )  { return; }
        +
        +	var test = new Test( {
        +		testName: testName,
        +		skip: true
        +	} );
        +
        +	test.queue();
        +}
        +
        +// Will be exposed as QUnit.only
        +function only( testName, expected, callback, async ) {
        +	var newTest;
        +
        +	if ( focused )  { return; }
        +
        +	QUnit.config.queue.length = 0;
        +	focused = true;
        +
        +	if ( arguments.length === 2 ) {
        +		callback = expected;
        +		expected = null;
        +	}
        +
        +	newTest = new Test( {
        +		testName: testName,
        +		expected: expected,
        +		async: async,
        +		callback: callback
        +	} );
        +
        +	newTest.queue();
        +}
        +
        +function Assert( testContext ) {
        +	this.test = testContext;
        +}
        +
        +// Assert helpers
        +QUnit.assert = Assert.prototype = {
        +
        +	// Specify the number of expected assertions to guarantee that failed test
        +	// (no assertions are run at all) don't slip through.
        +	expect: function( asserts ) {
        +		if ( arguments.length === 1 ) {
        +			this.test.expected = asserts;
        +		} else {
        +			return this.test.expected;
        +		}
        +	},
        +
        +	// Increment this Test's semaphore counter, then return a function that
        +	// decrements that counter a maximum of once.
        +	async: function( count ) {
        +		var test = this.test,
        +			popped = false,
        +			acceptCallCount = count;
        +
        +		if ( typeof acceptCallCount === "undefined" ) {
        +			acceptCallCount = 1;
        +		}
        +
        +		test.semaphore += 1;
        +		test.usedAsync = true;
        +		pauseProcessing();
        +
        +		return function done() {
        +
        +			if ( popped ) {
        +				test.pushFailure( "Too many calls to the `assert.async` callback",
        +					sourceFromStacktrace( 2 ) );
        +				return;
        +			}
        +			acceptCallCount -= 1;
        +			if ( acceptCallCount > 0 ) {
        +				return;
        +			}
        +
        +			test.semaphore -= 1;
        +			popped = true;
        +			resumeProcessing();
        +		};
        +	},
        +
        +	// Exports test.push() to the user API
        +	// Alias of pushResult.
        +	push: function( result, actual, expected, message, negative ) {
        +		var currentAssert = this instanceof Assert ? this : QUnit.config.current.assert;
        +		return currentAssert.pushResult( {
        +			result: result,
        +			actual: actual,
        +			expected: expected,
        +			message: message,
        +			negative: negative
        +		} );
        +	},
        +
        +	pushResult: function( resultInfo ) {
        +
        +		// Destructure of resultInfo = { result, actual, expected, message, negative }
        +		var assert = this,
        +			currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;
        +
        +		// Backwards compatibility fix.
        +		// Allows the direct use of global exported assertions and QUnit.assert.*
        +		// Although, it's use is not recommended as it can leak assertions
        +		// to other tests from async tests, because we only get a reference to the current test,
        +		// not exactly the test where assertion were intended to be called.
        +		if ( !currentTest ) {
        +			throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) );
        +		}
        +
        +		if ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) {
        +			currentTest.pushFailure( "Assertion after the final `assert.async` was resolved",
        +				sourceFromStacktrace( 2 ) );
        +
        +			// Allow this assertion to continue running anyway...
        +		}
        +
        +		if ( !( assert instanceof Assert ) ) {
        +			assert = currentTest.assert;
        +		}
        +
        +		return assert.test.pushResult( resultInfo );
        +	},
        +
        +	ok: function( result, message ) {
        +		message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
        +			QUnit.dump.parse( result ) );
        +		this.pushResult( {
        +			result: !!result,
        +			actual: result,
        +			expected: true,
        +			message: message
        +		} );
        +	},
        +
        +	notOk: function( result, message ) {
        +		message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " +
        +			QUnit.dump.parse( result ) );
        +		this.pushResult( {
        +			result: !result,
        +			actual: result,
        +			expected: false,
        +			message: message
        +		} );
        +	},
        +
        +	equal: function( actual, expected, message ) {
        +		/*jshint eqeqeq:false */
        +		this.pushResult( {
        +			result: expected == actual,
        +			actual: actual,
        +			expected: expected,
        +			message: message
        +		} );
        +	},
        +
        +	notEqual: function( actual, expected, message ) {
        +		/*jshint eqeqeq:false */
        +		this.pushResult( {
        +			result: expected != actual,
        +			actual: actual,
        +			expected: expected,
        +			message: message,
        +			negative: true
        +		} );
        +	},
        +
        +	propEqual: function( actual, expected, message ) {
        +		actual = objectValues( actual );
        +		expected = objectValues( expected );
        +		this.pushResult( {
        +			result: QUnit.equiv( actual, expected ),
        +			actual: actual,
        +			expected: expected,
        +			message: message
        +		} );
        +	},
        +
        +	notPropEqual: function( actual, expected, message ) {
        +		actual = objectValues( actual );
        +		expected = objectValues( expected );
        +		this.pushResult( {
        +			result: !QUnit.equiv( actual, expected ),
        +			actual: actual,
        +			expected: expected,
        +			message: message,
        +			negative: true
        +		} );
        +	},
        +
        +	deepEqual: function( actual, expected, message ) {
        +		this.pushResult( {
        +			result: QUnit.equiv( actual, expected ),
        +			actual: actual,
        +			expected: expected,
        +			message: message
        +		} );
        +	},
        +
        +	notDeepEqual: function( actual, expected, message ) {
        +		this.pushResult( {
        +			result: !QUnit.equiv( actual, expected ),
        +			actual: actual,
        +			expected: expected,
        +			message: message,
        +			negative: true
        +		} );
        +	},
        +
        +	strictEqual: function( actual, expected, message ) {
        +		this.pushResult( {
        +			result: expected === actual,
        +			actual: actual,
        +			expected: expected,
        +			message: message
        +		} );
        +	},
        +
        +	notStrictEqual: function( actual, expected, message ) {
        +		this.pushResult( {
        +			result: expected !== actual,
        +			actual: actual,
        +			expected: expected,
        +			message: message,
        +			negative: true
        +		} );
        +	},
        +
        +	"throws": function( block, expected, message ) {
        +		var actual, expectedType,
        +			expectedOutput = expected,
        +			ok = false,
        +			currentTest = ( this instanceof Assert && this.test ) || QUnit.config.current;
        +
        +		// 'expected' is optional unless doing string comparison
        +		if ( message == null && typeof expected === "string" ) {
        +			message = expected;
        +			expected = null;
        +		}
        +
        +		currentTest.ignoreGlobalErrors = true;
        +		try {
        +			block.call( currentTest.testEnvironment );
        +		} catch ( e ) {
        +			actual = e;
        +		}
        +		currentTest.ignoreGlobalErrors = false;
        +
        +		if ( actual ) {
        +			expectedType = QUnit.objectType( expected );
        +
        +			// We don't want to validate thrown error
        +			if ( !expected ) {
        +				ok = true;
        +				expectedOutput = null;
        +
        +			// Expected is a regexp
        +			} else if ( expectedType === "regexp" ) {
        +				ok = expected.test( errorString( actual ) );
        +
        +			// Expected is a string
        +			} else if ( expectedType === "string" ) {
        +				ok = expected === errorString( actual );
        +
        +			// Expected is a constructor, maybe an Error constructor
        +			} else if ( expectedType === "function" && actual instanceof expected ) {
        +				ok = true;
        +
        +			// Expected is an Error object
        +			} else if ( expectedType === "object" ) {
        +				ok = actual instanceof expected.constructor &&
        +					actual.name === expected.name &&
        +					actual.message === expected.message;
        +
        +			// Expected is a validation function which returns true if validation passed
        +			} else if ( expectedType === "function" && expected.call( {}, actual ) === true ) {
        +				expectedOutput = null;
        +				ok = true;
        +			}
        +		}
        +
        +		currentTest.assert.pushResult( {
        +			result: ok,
        +			actual: actual,
        +			expected: expectedOutput,
        +			message: message
        +		} );
        +	}
        +};
        +
        +// Provide an alternative to assert.throws(), for environments that consider throws a reserved word
        +// Known to us are: Closure Compiler, Narwhal
        +( function() {
        +	/*jshint sub:true */
        +	Assert.prototype.raises = Assert.prototype [ "throws" ]; //jscs:ignore requireDotNotation
        +}() );
        +
        +function errorString( error ) {
        +	var name, message,
        +		resultErrorString = error.toString();
        +	if ( resultErrorString.substring( 0, 7 ) === "[object" ) {
        +		name = error.name ? error.name.toString() : "Error";
        +		message = error.message ? error.message.toString() : "";
        +		if ( name && message ) {
        +			return name + ": " + message;
        +		} else if ( name ) {
        +			return name;
        +		} else if ( message ) {
        +			return message;
        +		} else {
        +			return "Error";
        +		}
        +	} else {
        +		return resultErrorString;
        +	}
        +}
        +
        +// Test for equality any JavaScript type.
        +// Author: Philippe Rathé <prathe@gmail.com>
        +QUnit.equiv = ( function() {
        +
        +	// Stack to decide between skip/abort functions
        +	var callers = [];
        +
        +	// Stack to avoiding loops from circular referencing
        +	var parents = [];
        +	var parentsB = [];
        +
        +	var getProto = Object.getPrototypeOf || function( obj ) {
        +
        +		/*jshint proto: true */
        +		return obj.__proto__;
        +	};
        +
        +	function useStrictEquality( b, a ) {
        +
        +		// To catch short annotation VS 'new' annotation of a declaration. e.g.:
        +		// `var i = 1;`
        +		// `var j = new Number(1);`
        +		if ( typeof a === "object" ) {
        +			a = a.valueOf();
        +		}
        +		if ( typeof b === "object" ) {
        +			b = b.valueOf();
        +		}
        +
        +		return a === b;
        +	}
        +
        +	function compareConstructors( a, b ) {
        +		var protoA = getProto( a );
        +		var protoB = getProto( b );
        +
        +		// Comparing constructors is more strict than using `instanceof`
        +		if ( a.constructor === b.constructor ) {
        +			return true;
        +		}
        +
        +		// Ref #851
        +		// If the obj prototype descends from a null constructor, treat it
        +		// as a null prototype.
        +		if ( protoA && protoA.constructor === null ) {
        +			protoA = null;
        +		}
        +		if ( protoB && protoB.constructor === null ) {
        +			protoB = null;
        +		}
        +
        +		// Allow objects with no prototype to be equivalent to
        +		// objects with Object as their constructor.
        +		if ( ( protoA === null && protoB === Object.prototype ) ||
        +				( protoB === null && protoA === Object.prototype ) ) {
        +			return true;
        +		}
        +
        +		return false;
        +	}
        +
        +	function getRegExpFlags( regexp ) {
        +		return "flags" in regexp ? regexp.flags : regexp.toString().match( /[gimuy]*$/ )[ 0 ];
        +	}
        +
        +	var callbacks = {
        +		"string": useStrictEquality,
        +		"boolean": useStrictEquality,
        +		"number": useStrictEquality,
        +		"null": useStrictEquality,
        +		"undefined": useStrictEquality,
        +		"symbol": useStrictEquality,
        +		"date": useStrictEquality,
        +
        +		"nan": function() {
        +			return true;
        +		},
        +
        +		"regexp": function( b, a ) {
        +			return a.source === b.source &&
        +
        +				// Include flags in the comparison
        +				getRegExpFlags( a ) === getRegExpFlags( b );
        +		},
        +
        +		// - skip when the property is a method of an instance (OOP)
        +		// - abort otherwise,
        +		// initial === would have catch identical references anyway
        +		"function": function() {
        +			var caller = callers[ callers.length - 1 ];
        +			return caller !== Object && typeof caller !== "undefined";
        +		},
        +
        +		"array": function( b, a ) {
        +			var i, j, len, loop, aCircular, bCircular;
        +
        +			len = a.length;
        +			if ( len !== b.length ) {
        +
        +				// Safe and faster
        +				return false;
        +			}
        +
        +			// Track reference to avoid circular references
        +			parents.push( a );
        +			parentsB.push( b );
        +			for ( i = 0; i < len; i++ ) {
        +				loop = false;
        +				for ( j = 0; j < parents.length; j++ ) {
        +					aCircular = parents[ j ] === a[ i ];
        +					bCircular = parentsB[ j ] === b[ i ];
        +					if ( aCircular || bCircular ) {
        +						if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
        +							loop = true;
        +						} else {
        +							parents.pop();
        +							parentsB.pop();
        +							return false;
        +						}
        +					}
        +				}
        +				if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
        +					parents.pop();
        +					parentsB.pop();
        +					return false;
        +				}
        +			}
        +			parents.pop();
        +			parentsB.pop();
        +			return true;
        +		},
        +
        +		"set": function( b, a ) {
        +			var innerEq,
        +				outerEq = true;
        +
        +			if ( a.size !== b.size ) {
        +				return false;
        +			}
        +
        +			a.forEach( function( aVal ) {
        +				innerEq = false;
        +
        +				b.forEach( function( bVal ) {
        +					if ( innerEquiv( bVal, aVal ) ) {
        +						innerEq = true;
        +					}
        +				} );
        +
        +				if ( !innerEq ) {
        +					outerEq = false;
        +				}
        +			} );
        +
        +			return outerEq;
        +		},
        +
        +		"map": function( b, a ) {
        +			var innerEq,
        +				outerEq = true;
        +
        +			if ( a.size !== b.size ) {
        +				return false;
        +			}
        +
        +			a.forEach( function( aVal, aKey ) {
        +				innerEq = false;
        +
        +				b.forEach( function( bVal, bKey ) {
        +					if ( innerEquiv( [ bVal, bKey ], [ aVal, aKey ] ) ) {
        +						innerEq = true;
        +					}
        +				} );
        +
        +				if ( !innerEq ) {
        +					outerEq = false;
        +				}
        +			} );
        +
        +			return outerEq;
        +		},
        +
        +		"object": function( b, a ) {
        +			var i, j, loop, aCircular, bCircular;
        +
        +			// Default to true
        +			var eq = true;
        +			var aProperties = [];
        +			var bProperties = [];
        +
        +			if ( compareConstructors( a, b ) === false ) {
        +				return false;
        +			}
        +
        +			// Stack constructor before traversing properties
        +			callers.push( a.constructor );
        +
        +			// Track reference to avoid circular references
        +			parents.push( a );
        +			parentsB.push( b );
        +
        +			// Be strict: don't ensure hasOwnProperty and go deep
        +			for ( i in a ) {
        +				loop = false;
        +				for ( j = 0; j < parents.length; j++ ) {
        +					aCircular = parents[ j ] === a[ i ];
        +					bCircular = parentsB[ j ] === b[ i ];
        +					if ( aCircular || bCircular ) {
        +						if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
        +							loop = true;
        +						} else {
        +							eq = false;
        +							break;
        +						}
        +					}
        +				}
        +				aProperties.push( i );
        +				if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
        +					eq = false;
        +					break;
        +				}
        +			}
        +
        +			parents.pop();
        +			parentsB.pop();
        +
        +			// Unstack, we are done
        +			callers.pop();
        +
        +			for ( i in b ) {
        +
        +				// Collect b's properties
        +				bProperties.push( i );
        +			}
        +
        +			// Ensures identical properties name
        +			return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
        +		}
        +	};
        +
        +	function typeEquiv( a, b ) {
        +		var type = QUnit.objectType( a );
        +		return QUnit.objectType( b ) === type && callbacks[ type ]( b, a );
        +	}
        +
        +	// The real equiv function
        +	function innerEquiv( a, b ) {
        +
        +		// We're done when there's nothing more to compare
        +		if ( arguments.length < 2 ) {
        +			return true;
        +		}
        +
        +		// Require type-specific equality
        +		return ( a === b || typeEquiv( a, b ) ) &&
        +
        +			// ...across all consecutive argument pairs
        +			( arguments.length === 2 || innerEquiv.apply( this, [].slice.call( arguments, 1 ) ) );
        +	}
        +
        +	return innerEquiv;
        +}() );
        +
        +// Based on jsDump by Ariel Flesler
        +// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
        +QUnit.dump = ( function() {
        +	function quote( str ) {
        +		return "\"" + str.toString().replace( /\\/g, "\\\\" ).replace( /"/g, "\\\"" ) + "\"";
        +	}
        +	function literal( o ) {
        +		return o + "";
        +	}
        +	function join( pre, arr, post ) {
        +		var s = dump.separator(),
        +			base = dump.indent(),
        +			inner = dump.indent( 1 );
        +		if ( arr.join ) {
        +			arr = arr.join( "," + s + inner );
        +		}
        +		if ( !arr ) {
        +			return pre + post;
        +		}
        +		return [ pre, inner + arr, base + post ].join( s );
        +	}
        +	function array( arr, stack ) {
        +		var i = arr.length,
        +			ret = new Array( i );
        +
        +		if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
        +			return "[object Array]";
        +		}
        +
        +		this.up();
        +		while ( i-- ) {
        +			ret[ i ] = this.parse( arr[ i ], undefined, stack );
        +		}
        +		this.down();
        +		return join( "[", ret, "]" );
        +	}
        +
        +	var reName = /^function (\w+)/,
        +		dump = {
        +
        +			// The objType is used mostly internally, you can fix a (custom) type in advance
        +			parse: function( obj, objType, stack ) {
        +				stack = stack || [];
        +				var res, parser, parserType,
        +					inStack = inArray( obj, stack );
        +
        +				if ( inStack !== -1 ) {
        +					return "recursion(" + ( inStack - stack.length ) + ")";
        +				}
        +
        +				objType = objType || this.typeOf( obj  );
        +				parser = this.parsers[ objType ];
        +				parserType = typeof parser;
        +
        +				if ( parserType === "function" ) {
        +					stack.push( obj );
        +					res = parser.call( this, obj, stack );
        +					stack.pop();
        +					return res;
        +				}
        +				return ( parserType === "string" ) ? parser : this.parsers.error;
        +			},
        +			typeOf: function( obj ) {
        +				var type;
        +				if ( obj === null ) {
        +					type = "null";
        +				} else if ( typeof obj === "undefined" ) {
        +					type = "undefined";
        +				} else if ( QUnit.is( "regexp", obj ) ) {
        +					type = "regexp";
        +				} else if ( QUnit.is( "date", obj ) ) {
        +					type = "date";
        +				} else if ( QUnit.is( "function", obj ) ) {
        +					type = "function";
        +				} else if ( obj.setInterval !== undefined &&
        +						obj.document !== undefined &&
        +						obj.nodeType === undefined ) {
        +					type = "window";
        +				} else if ( obj.nodeType === 9 ) {
        +					type = "document";
        +				} else if ( obj.nodeType ) {
        +					type = "node";
        +				} else if (
        +
        +					// Native arrays
        +					toString.call( obj ) === "[object Array]" ||
        +
        +					// NodeList objects
        +					( typeof obj.length === "number" && obj.item !== undefined &&
        +					( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null &&
        +					obj[ 0 ] === undefined ) ) )
        +				) {
        +					type = "array";
        +				} else if ( obj.constructor === Error.prototype.constructor ) {
        +					type = "error";
        +				} else {
        +					type = typeof obj;
        +				}
        +				return type;
        +			},
        +
        +			separator: function() {
        +				return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&#160;" : " ";
        +			},
        +
        +			// Extra can be a number, shortcut for increasing-calling-decreasing
        +			indent: function( extra ) {
        +				if ( !this.multiline ) {
        +					return "";
        +				}
        +				var chr = this.indentChar;
        +				if ( this.HTML ) {
        +					chr = chr.replace( /\t/g, "   " ).replace( / /g, "&#160;" );
        +				}
        +				return new Array( this.depth + ( extra || 0 ) ).join( chr );
        +			},
        +			up: function( a ) {
        +				this.depth += a || 1;
        +			},
        +			down: function( a ) {
        +				this.depth -= a || 1;
        +			},
        +			setParser: function( name, parser ) {
        +				this.parsers[ name ] = parser;
        +			},
        +
        +			// The next 3 are exposed so you can use them
        +			quote: quote,
        +			literal: literal,
        +			join: join,
        +			depth: 1,
        +			maxDepth: QUnit.config.maxDepth,
        +
        +			// This is the list of parsers, to modify them, use dump.setParser
        +			parsers: {
        +				window: "[Window]",
        +				document: "[Document]",
        +				error: function( error ) {
        +					return "Error(\"" + error.message + "\")";
        +				},
        +				unknown: "[Unknown]",
        +				"null": "null",
        +				"undefined": "undefined",
        +				"function": function( fn ) {
        +					var ret = "function",
        +
        +						// Functions never have name in IE
        +						name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
        +
        +					if ( name ) {
        +						ret += " " + name;
        +					}
        +					ret += "(";
        +
        +					ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
        +					return join( ret, dump.parse( fn, "functionCode" ), "}" );
        +				},
        +				array: array,
        +				nodelist: array,
        +				"arguments": array,
        +				object: function( map, stack ) {
        +					var keys, key, val, i, nonEnumerableProperties,
        +						ret = [];
        +
        +					if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
        +						return "[object Object]";
        +					}
        +
        +					dump.up();
        +					keys = [];
        +					for ( key in map ) {
        +						keys.push( key );
        +					}
        +
        +					// Some properties are not always enumerable on Error objects.
        +					nonEnumerableProperties = [ "message", "name" ];
        +					for ( i in nonEnumerableProperties ) {
        +						key = nonEnumerableProperties[ i ];
        +						if ( key in map && inArray( key, keys ) < 0 ) {
        +							keys.push( key );
        +						}
        +					}
        +					keys.sort();
        +					for ( i = 0; i < keys.length; i++ ) {
        +						key = keys[ i ];
        +						val = map[ key ];
        +						ret.push( dump.parse( key, "key" ) + ": " +
        +							dump.parse( val, undefined, stack ) );
        +					}
        +					dump.down();
        +					return join( "{", ret, "}" );
        +				},
        +				node: function( node ) {
        +					var len, i, val,
        +						open = dump.HTML ? "&lt;" : "<",
        +						close = dump.HTML ? "&gt;" : ">",
        +						tag = node.nodeName.toLowerCase(),
        +						ret = open + tag,
        +						attrs = node.attributes;
        +
        +					if ( attrs ) {
        +						for ( i = 0, len = attrs.length; i < len; i++ ) {
        +							val = attrs[ i ].nodeValue;
        +
        +							// IE6 includes all attributes in .attributes, even ones not explicitly
        +							// set. Those have values like undefined, null, 0, false, "" or
        +							// "inherit".
        +							if ( val && val !== "inherit" ) {
        +								ret += " " + attrs[ i ].nodeName + "=" +
        +									dump.parse( val, "attribute" );
        +							}
        +						}
        +					}
        +					ret += close;
        +
        +					// Show content of TextNode or CDATASection
        +					if ( node.nodeType === 3 || node.nodeType === 4 ) {
        +						ret += node.nodeValue;
        +					}
        +
        +					return ret + open + "/" + tag + close;
        +				},
        +
        +				// Function calls it internally, it's the arguments part of the function
        +				functionArgs: function( fn ) {
        +					var args,
        +						l = fn.length;
        +
        +					if ( !l ) {
        +						return "";
        +					}
        +
        +					args = new Array( l );
        +					while ( l-- ) {
        +
        +						// 97 is 'a'
        +						args[ l ] = String.fromCharCode( 97 + l );
        +					}
        +					return " " + args.join( ", " ) + " ";
        +				},
        +
        +				// Object calls it internally, the key part of an item in a map
        +				key: quote,
        +
        +				// Function calls it internally, it's the content of the function
        +				functionCode: "[code]",
        +
        +				// Node calls it internally, it's a html attribute value
        +				attribute: quote,
        +				string: quote,
        +				date: quote,
        +				regexp: literal,
        +				number: literal,
        +				"boolean": literal
        +			},
        +
        +			// If true, entities are escaped ( <, >, \t, space and \n )
        +			HTML: false,
        +
        +			// Indentation unit
        +			indentChar: "  ",
        +
        +			// If true, items in a collection, are separated by a \n, else just a space.
        +			multiline: true
        +		};
        +
        +	return dump;
        +}() );
        +
        +// Back compat
        +QUnit.jsDump = QUnit.dump;
        +
        +// Deprecated
        +// Extend assert methods to QUnit for Backwards compatibility
        +( function() {
        +	var i,
        +		assertions = Assert.prototype;
        +
        +	function applyCurrent( current ) {
        +		return function() {
        +			var assert = new Assert( QUnit.config.current );
        +			current.apply( assert, arguments );
        +		};
        +	}
        +
        +	for ( i in assertions ) {
        +		QUnit[ i ] = applyCurrent( assertions[ i ] );
        +	}
        +}() );
        +
        +// For browser, export only select globals
        +if ( defined.document ) {
        +
        +	( function() {
        +		var i, l,
        +			keys = [
        +				"test",
        +				"module",
        +				"expect",
        +				"asyncTest",
        +				"start",
        +				"stop",
        +				"ok",
        +				"notOk",
        +				"equal",
        +				"notEqual",
        +				"propEqual",
        +				"notPropEqual",
        +				"deepEqual",
        +				"notDeepEqual",
        +				"strictEqual",
        +				"notStrictEqual",
        +				"throws",
        +				"raises"
        +			];
        +
        +		for ( i = 0, l = keys.length; i < l; i++ ) {
        +			window[ keys[ i ] ] = QUnit[ keys[ i ] ];
        +		}
        +	}() );
        +
        +	window.QUnit = QUnit;
        +}
        +
        +// For nodejs
        +if ( typeof module !== "undefined" && module && module.exports ) {
        +	module.exports = QUnit;
        +
        +	// For consistency with CommonJS environments' exports
        +	module.exports.QUnit = QUnit;
        +}
        +
        +// For CommonJS with exports, but without module.exports, like Rhino
        +if ( typeof exports !== "undefined" && exports ) {
        +	exports.QUnit = QUnit;
        +}
        +
        +if ( typeof define === "function" && define.amd ) {
        +	define( function() {
        +		return QUnit;
        +	} );
        +	QUnit.config.autostart = false;
        +}
        +
        +// Get a reference to the global object, like window in browsers
        +}( ( function() {
        +	return this;
        +}() ) ) );
        +
        +( function() {
        +
        +// Only interact with URLs via window.location
        +var location = typeof window !== "undefined" && window.location;
        +if ( !location ) {
        +	return;
        +}
        +
        +var urlParams = getUrlParams();
        +
        +QUnit.urlParams = urlParams;
        +
        +// Match module/test by inclusion in an array
        +QUnit.config.moduleId = [].concat( urlParams.moduleId || [] );
        +QUnit.config.testId = [].concat( urlParams.testId || [] );
        +
        +// Exact case-insensitive match of the module name
        +QUnit.config.module = urlParams.module;
        +
        +// Regular expression or case-insenstive substring match against "moduleName: testName"
        +QUnit.config.filter = urlParams.filter;
        +
        +// Test order randomization
        +if ( urlParams.seed === true ) {
        +
        +	// Generate a random seed if the option is specified without a value
        +	QUnit.config.seed = Math.random().toString( 36 ).slice( 2 );
        +} else if ( urlParams.seed ) {
        +	QUnit.config.seed = urlParams.seed;
        +}
        +
        +// Add URL-parameter-mapped config values with UI form rendering data
        +QUnit.config.urlConfig.push(
        +	{
        +		id: "hidepassed",
        +		label: "Hide passed tests",
        +		tooltip: "Only show tests and assertions that fail. Stored as query-strings."
        +	},
        +	{
        +		id: "noglobals",
        +		label: "Check for Globals",
        +		tooltip: "Enabling this will test if any test introduces new properties on the " +
        +			"global object (`window` in Browsers). Stored as query-strings."
        +	},
        +	{
        +		id: "notrycatch",
        +		label: "No try-catch",
        +		tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
        +			"exceptions in IE reasonable. Stored as query-strings."
        +	}
        +);
        +
        +QUnit.begin( function() {
        +	var i, option,
        +		urlConfig = QUnit.config.urlConfig;
        +
        +	for ( i = 0; i < urlConfig.length; i++ ) {
        +
        +		// Options can be either strings or objects with nonempty "id" properties
        +		option = QUnit.config.urlConfig[ i ];
        +		if ( typeof option !== "string" ) {
        +			option = option.id;
        +		}
        +
        +		if ( QUnit.config[ option ] === undefined ) {
        +			QUnit.config[ option ] = urlParams[ option ];
        +		}
        +	}
        +} );
        +
        +function getUrlParams() {
        +	var i, param, name, value;
        +	var urlParams = {};
        +	var params = location.search.slice( 1 ).split( "&" );
        +	var length = params.length;
        +
        +	for ( i = 0; i < length; i++ ) {
        +		if ( params[ i ] ) {
        +			param = params[ i ].split( "=" );
        +			name = decodeURIComponent( param[ 0 ] );
        +
        +			// Allow just a key to turn on a flag, e.g., test.html?noglobals
        +			value = param.length === 1 ||
        +				decodeURIComponent( param.slice( 1 ).join( "=" ) ) ;
        +			if ( urlParams[ name ] ) {
        +				urlParams[ name ] = [].concat( urlParams[ name ], value );
        +			} else {
        +				urlParams[ name ] = value;
        +			}
        +		}
        +	}
        +
        +	return urlParams;
        +}
        +
        +// Don't load the HTML Reporter on non-browser environments
        +if ( typeof window === "undefined" || !window.document ) {
        +	return;
        +}
        +
        +// Deprecated QUnit.init - Ref #530
        +// Re-initialize the configuration options
        +QUnit.init = function() {
        +	var config = QUnit.config;
        +
        +	config.stats = { all: 0, bad: 0 };
        +	config.moduleStats = { all: 0, bad: 0 };
        +	config.started = 0;
        +	config.updateRate = 1000;
        +	config.blocking = false;
        +	config.autostart = true;
        +	config.autorun = false;
        +	config.filter = "";
        +	config.queue = [];
        +
        +	appendInterface();
        +};
        +
        +var config = QUnit.config,
        +	document = window.document,
        +	collapseNext = false,
        +	hasOwn = Object.prototype.hasOwnProperty,
        +	unfilteredUrl = setUrl( { filter: undefined, module: undefined,
        +		moduleId: undefined, testId: undefined } ),
        +	defined = {
        +		sessionStorage: ( function() {
        +			var x = "qunit-test-string";
        +			try {
        +				sessionStorage.setItem( x, x );
        +				sessionStorage.removeItem( x );
        +				return true;
        +			} catch ( e ) {
        +				return false;
        +			}
        +		}() )
        +	},
        +	modulesList = [];
        +
        +/**
        +* Escape text for attribute or text content.
        +*/
        +function escapeText( s ) {
        +	if ( !s ) {
        +		return "";
        +	}
        +	s = s + "";
        +
        +	// Both single quotes and double quotes (for attributes)
        +	return s.replace( /['"<>&]/g, function( s ) {
        +		switch ( s ) {
        +		case "'":
        +			return "&#039;";
        +		case "\"":
        +			return "&quot;";
        +		case "<":
        +			return "&lt;";
        +		case ">":
        +			return "&gt;";
        +		case "&":
        +			return "&amp;";
        +		}
        +	} );
        +}
        +
        +/**
        + * @param {HTMLElement} elem
        + * @param {string} type
        + * @param {Function} fn
        + */
        +function addEvent( elem, type, fn ) {
        +	if ( elem.addEventListener ) {
        +
        +		// Standards-based browsers
        +		elem.addEventListener( type, fn, false );
        +	} else if ( elem.attachEvent ) {
        +
        +		// Support: IE <9
        +		elem.attachEvent( "on" + type, function() {
        +			var event = window.event;
        +			if ( !event.target ) {
        +				event.target = event.srcElement || document;
        +			}
        +
        +			fn.call( elem, event );
        +		} );
        +	}
        +}
        +
        +/**
        + * @param {Array|NodeList} elems
        + * @param {string} type
        + * @param {Function} fn
        + */
        +function addEvents( elems, type, fn ) {
        +	var i = elems.length;
        +	while ( i-- ) {
        +		addEvent( elems[ i ], type, fn );
        +	}
        +}
        +
        +function hasClass( elem, name ) {
        +	return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
        +}
        +
        +function addClass( elem, name ) {
        +	if ( !hasClass( elem, name ) ) {
        +		elem.className += ( elem.className ? " " : "" ) + name;
        +	}
        +}
        +
        +function toggleClass( elem, name, force ) {
        +	if ( force || typeof force === "undefined" && !hasClass( elem, name ) ) {
        +		addClass( elem, name );
        +	} else {
        +		removeClass( elem, name );
        +	}
        +}
        +
        +function removeClass( elem, name ) {
        +	var set = " " + elem.className + " ";
        +
        +	// Class name may appear multiple times
        +	while ( set.indexOf( " " + name + " " ) >= 0 ) {
        +		set = set.replace( " " + name + " ", " " );
        +	}
        +
        +	// Trim for prettiness
        +	elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
        +}
        +
        +function id( name ) {
        +	return document.getElementById && document.getElementById( name );
        +}
        +
        +function getUrlConfigHtml() {
        +	var i, j, val,
        +		escaped, escapedTooltip,
        +		selection = false,
        +		urlConfig = config.urlConfig,
        +		urlConfigHtml = "";
        +
        +	for ( i = 0; i < urlConfig.length; i++ ) {
        +
        +		// Options can be either strings or objects with nonempty "id" properties
        +		val = config.urlConfig[ i ];
        +		if ( typeof val === "string" ) {
        +			val = {
        +				id: val,
        +				label: val
        +			};
        +		}
        +
        +		escaped = escapeText( val.id );
        +		escapedTooltip = escapeText( val.tooltip );
        +
        +		if ( !val.value || typeof val.value === "string" ) {
        +			urlConfigHtml += "<input id='qunit-urlconfig-" + escaped +
        +				"' name='" + escaped + "' type='checkbox'" +
        +				( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
        +				( config[ val.id ] ? " checked='checked'" : "" ) +
        +				" title='" + escapedTooltip + "' /><label for='qunit-urlconfig-" + escaped +
        +				"' title='" + escapedTooltip + "'>" + val.label + "</label>";
        +		} else {
        +			urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
        +				"' title='" + escapedTooltip + "'>" + val.label +
        +				": </label><select id='qunit-urlconfig-" + escaped +
        +				"' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
        +
        +			if ( QUnit.is( "array", val.value ) ) {
        +				for ( j = 0; j < val.value.length; j++ ) {
        +					escaped = escapeText( val.value[ j ] );
        +					urlConfigHtml += "<option value='" + escaped + "'" +
        +						( config[ val.id ] === val.value[ j ] ?
        +							( selection = true ) && " selected='selected'" : "" ) +
        +						">" + escaped + "</option>";
        +				}
        +			} else {
        +				for ( j in val.value ) {
        +					if ( hasOwn.call( val.value, j ) ) {
        +						urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
        +							( config[ val.id ] === j ?
        +								( selection = true ) && " selected='selected'" : "" ) +
        +							">" + escapeText( val.value[ j ] ) + "</option>";
        +					}
        +				}
        +			}
        +			if ( config[ val.id ] && !selection ) {
        +				escaped = escapeText( config[ val.id ] );
        +				urlConfigHtml += "<option value='" + escaped +
        +					"' selected='selected' disabled='disabled'>" + escaped + "</option>";
        +			}
        +			urlConfigHtml += "</select>";
        +		}
        +	}
        +
        +	return urlConfigHtml;
        +}
        +
        +// Handle "click" events on toolbar checkboxes and "change" for select menus.
        +// Updates the URL with the new state of `config.urlConfig` values.
        +function toolbarChanged() {
        +	var updatedUrl, value, tests,
        +		field = this,
        +		params = {};
        +
        +	// Detect if field is a select menu or a checkbox
        +	if ( "selectedIndex" in field ) {
        +		value = field.options[ field.selectedIndex ].value || undefined;
        +	} else {
        +		value = field.checked ? ( field.defaultValue || true ) : undefined;
        +	}
        +
        +	params[ field.name ] = value;
        +	updatedUrl = setUrl( params );
        +
        +	// Check if we can apply the change without a page refresh
        +	if ( "hidepassed" === field.name && "replaceState" in window.history ) {
        +		QUnit.urlParams[ field.name ] = value;
        +		config[ field.name ] = value || false;
        +		tests = id( "qunit-tests" );
        +		if ( tests ) {
        +			toggleClass( tests, "hidepass", value || false );
        +		}
        +		window.history.replaceState( null, "", updatedUrl );
        +	} else {
        +		window.location = updatedUrl;
        +	}
        +}
        +
        +function setUrl( params ) {
        +	var key, arrValue, i,
        +		querystring = "?",
        +		location = window.location;
        +
        +	params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
        +
        +	for ( key in params ) {
        +
        +		// Skip inherited or undefined properties
        +		if ( hasOwn.call( params, key ) && params[ key ] !== undefined ) {
        +
        +			// Output a parameter for each value of this key (but usually just one)
        +			arrValue = [].concat( params[ key ] );
        +			for ( i = 0; i < arrValue.length; i++ ) {
        +				querystring += encodeURIComponent( key );
        +				if ( arrValue[ i ] !== true ) {
        +					querystring += "=" + encodeURIComponent( arrValue[ i ] );
        +				}
        +				querystring += "&";
        +			}
        +		}
        +	}
        +	return location.protocol + "//" + location.host +
        +		location.pathname + querystring.slice( 0, -1 );
        +}
        +
        +function applyUrlParams() {
        +	var selectedModule,
        +		modulesList = id( "qunit-modulefilter" ),
        +		filter = id( "qunit-filter-input" ).value;
        +
        +	selectedModule = modulesList ?
        +		decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :
        +		undefined;
        +
        +	window.location = setUrl( {
        +		module: ( selectedModule === "" ) ? undefined : selectedModule,
        +		filter: ( filter === "" ) ? undefined : filter,
        +
        +		// Remove moduleId and testId filters
        +		moduleId: undefined,
        +		testId: undefined
        +	} );
        +}
        +
        +function toolbarUrlConfigContainer() {
        +	var urlConfigContainer = document.createElement( "span" );
        +
        +	urlConfigContainer.innerHTML = getUrlConfigHtml();
        +	addClass( urlConfigContainer, "qunit-url-config" );
        +
        +	// For oldIE support:
        +	// * Add handlers to the individual elements instead of the container
        +	// * Use "click" instead of "change" for checkboxes
        +	addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
        +	addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
        +
        +	return urlConfigContainer;
        +}
        +
        +function toolbarLooseFilter() {
        +	var filter = document.createElement( "form" ),
        +		label = document.createElement( "label" ),
        +		input = document.createElement( "input" ),
        +		button = document.createElement( "button" );
        +
        +	addClass( filter, "qunit-filter" );
        +
        +	label.innerHTML = "Filter: ";
        +
        +	input.type = "text";
        +	input.value = config.filter || "";
        +	input.name = "filter";
        +	input.id = "qunit-filter-input";
        +
        +	button.innerHTML = "Go";
        +
        +	label.appendChild( input );
        +
        +	filter.appendChild( label );
        +	filter.appendChild( button );
        +	addEvent( filter, "submit", function( ev ) {
        +		applyUrlParams();
        +
        +		if ( ev && ev.preventDefault ) {
        +			ev.preventDefault();
        +		}
        +
        +		return false;
        +	} );
        +
        +	return filter;
        +}
        +
        +function toolbarModuleFilterHtml() {
        +	var i,
        +		moduleFilterHtml = "";
        +
        +	if ( !modulesList.length ) {
        +		return false;
        +	}
        +
        +	moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
        +		"<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
        +		( QUnit.urlParams.module === undefined ? "selected='selected'" : "" ) +
        +		">< All Modules ></option>";
        +
        +	for ( i = 0; i < modulesList.length; i++ ) {
        +		moduleFilterHtml += "<option value='" +
        +			escapeText( encodeURIComponent( modulesList[ i ] ) ) + "' " +
        +			( QUnit.urlParams.module === modulesList[ i ] ? "selected='selected'" : "" ) +
        +			">" + escapeText( modulesList[ i ] ) + "</option>";
        +	}
        +	moduleFilterHtml += "</select>";
        +
        +	return moduleFilterHtml;
        +}
        +
        +function toolbarModuleFilter() {
        +	var toolbar = id( "qunit-testrunner-toolbar" ),
        +		moduleFilter = document.createElement( "span" ),
        +		moduleFilterHtml = toolbarModuleFilterHtml();
        +
        +	if ( !toolbar || !moduleFilterHtml ) {
        +		return false;
        +	}
        +
        +	moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
        +	moduleFilter.innerHTML = moduleFilterHtml;
        +
        +	addEvent( moduleFilter.lastChild, "change", applyUrlParams );
        +
        +	toolbar.appendChild( moduleFilter );
        +}
        +
        +function appendToolbar() {
        +	var toolbar = id( "qunit-testrunner-toolbar" );
        +
        +	if ( toolbar ) {
        +		toolbar.appendChild( toolbarUrlConfigContainer() );
        +		toolbar.appendChild( toolbarLooseFilter() );
        +		toolbarModuleFilter();
        +	}
        +}
        +
        +function appendHeader() {
        +	var header = id( "qunit-header" );
        +
        +	if ( header ) {
        +		header.innerHTML = "<a href='" + escapeText( unfilteredUrl ) + "'>" + header.innerHTML +
        +			"</a> ";
        +	}
        +}
        +
        +function appendBanner() {
        +	var banner = id( "qunit-banner" );
        +
        +	if ( banner ) {
        +		banner.className = "";
        +	}
        +}
        +
        +function appendTestResults() {
        +	var tests = id( "qunit-tests" ),
        +		result = id( "qunit-testresult" );
        +
        +	if ( result ) {
        +		result.parentNode.removeChild( result );
        +	}
        +
        +	if ( tests ) {
        +		tests.innerHTML = "";
        +		result = document.createElement( "p" );
        +		result.id = "qunit-testresult";
        +		result.className = "result";
        +		tests.parentNode.insertBefore( result, tests );
        +		result.innerHTML = "Running...<br />&#160;";
        +	}
        +}
        +
        +function storeFixture() {
        +	var fixture = id( "qunit-fixture" );
        +	if ( fixture ) {
        +		config.fixture = fixture.innerHTML;
        +	}
        +}
        +
        +function appendFilteredTest() {
        +	var testId = QUnit.config.testId;
        +	if ( !testId || testId.length <= 0 ) {
        +		return "";
        +	}
        +	return "<div id='qunit-filteredTest'>Rerunning selected tests: " +
        +		escapeText( testId.join( ", " ) ) +
        +		" <a id='qunit-clearFilter' href='" +
        +		escapeText( unfilteredUrl ) +
        +		"'>Run all tests</a></div>";
        +}
        +
        +function appendUserAgent() {
        +	var userAgent = id( "qunit-userAgent" );
        +
        +	if ( userAgent ) {
        +		userAgent.innerHTML = "";
        +		userAgent.appendChild(
        +			document.createTextNode(
        +				"QUnit " + QUnit.version + "; " + navigator.userAgent
        +			)
        +		);
        +	}
        +}
        +
        +function appendInterface() {
        +	var qunit = id( "qunit" );
        +
        +	if ( qunit ) {
        +		qunit.innerHTML =
        +			"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
        +			"<h2 id='qunit-banner'></h2>" +
        +			"<div id='qunit-testrunner-toolbar'></div>" +
        +			appendFilteredTest() +
        +			"<h2 id='qunit-userAgent'></h2>" +
        +			"<ol id='qunit-tests'></ol>";
        +	}
        +
        +	appendHeader();
        +	appendBanner();
        +	appendTestResults();
        +	appendUserAgent();
        +	appendToolbar();
        +}
        +
        +function appendTestsList( modules ) {
        +	var i, l, x, z, test, moduleObj;
        +
        +	for ( i = 0, l = modules.length; i < l; i++ ) {
        +		moduleObj = modules[ i ];
        +
        +		for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
        +			test = moduleObj.tests[ x ];
        +
        +			appendTest( test.name, test.testId, moduleObj.name );
        +		}
        +	}
        +}
        +
        +function appendTest( name, testId, moduleName ) {
        +	var title, rerunTrigger, testBlock, assertList,
        +		tests = id( "qunit-tests" );
        +
        +	if ( !tests ) {
        +		return;
        +	}
        +
        +	title = document.createElement( "strong" );
        +	title.innerHTML = getNameHtml( name, moduleName );
        +
        +	rerunTrigger = document.createElement( "a" );
        +	rerunTrigger.innerHTML = "Rerun";
        +	rerunTrigger.href = setUrl( { testId: testId } );
        +
        +	testBlock = document.createElement( "li" );
        +	testBlock.appendChild( title );
        +	testBlock.appendChild( rerunTrigger );
        +	testBlock.id = "qunit-test-output-" + testId;
        +
        +	assertList = document.createElement( "ol" );
        +	assertList.className = "qunit-assert-list";
        +
        +	testBlock.appendChild( assertList );
        +
        +	tests.appendChild( testBlock );
        +}
        +
        +// HTML Reporter initialization and load
        +QUnit.begin( function( details ) {
        +	var i, moduleObj, tests;
        +
        +	// Sort modules by name for the picker
        +	for ( i = 0; i < details.modules.length; i++ ) {
        +		moduleObj = details.modules[ i ];
        +		if ( moduleObj.name ) {
        +			modulesList.push( moduleObj.name );
        +		}
        +	}
        +	modulesList.sort( function( a, b ) {
        +		return a.localeCompare( b );
        +	} );
        +
        +	// Capture fixture HTML from the page
        +	storeFixture();
        +
        +	// Initialize QUnit elements
        +	appendInterface();
        +	appendTestsList( details.modules );
        +	tests = id( "qunit-tests" );
        +	if ( tests && config.hidepassed ) {
        +		addClass( tests, "hidepass" );
        +	}
        +} );
        +
        +QUnit.done( function( details ) {
        +	var i, key,
        +		banner = id( "qunit-banner" ),
        +		tests = id( "qunit-tests" ),
        +		html = [
        +			"Tests completed in ",
        +			details.runtime,
        +			" milliseconds.<br />",
        +			"<span class='passed'>",
        +			details.passed,
        +			"</span> assertions of <span class='total'>",
        +			details.total,
        +			"</span> passed, <span class='failed'>",
        +			details.failed,
        +			"</span> failed."
        +		].join( "" );
        +
        +	if ( banner ) {
        +		banner.className = details.failed ? "qunit-fail" : "qunit-pass";
        +	}
        +
        +	if ( tests ) {
        +		id( "qunit-testresult" ).innerHTML = html;
        +	}
        +
        +	if ( config.altertitle && document.title ) {
        +
        +		// Show ✖ for good, ✔ for bad suite result in title
        +		// use escape sequences in case file gets loaded with non-utf-8-charset
        +		document.title = [
        +			( details.failed ? "\u2716" : "\u2714" ),
        +			document.title.replace( /^[\u2714\u2716] /i, "" )
        +		].join( " " );
        +	}
        +
        +	// Clear own sessionStorage items if all tests passed
        +	if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
        +		for ( i = 0; i < sessionStorage.length; i++ ) {
        +			key = sessionStorage.key( i++ );
        +			if ( key.indexOf( "qunit-test-" ) === 0 ) {
        +				sessionStorage.removeItem( key );
        +			}
        +		}
        +	}
        +
        +	// Scroll back to top to show results
        +	if ( config.scrolltop && window.scrollTo ) {
        +		window.scrollTo( 0, 0 );
        +	}
        +} );
        +
        +function getNameHtml( name, module ) {
        +	var nameHtml = "";
        +
        +	if ( module ) {
        +		nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
        +	}
        +
        +	nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
        +
        +	return nameHtml;
        +}
        +
        +QUnit.testStart( function( details ) {
        +	var running, testBlock, bad;
        +
        +	testBlock = id( "qunit-test-output-" + details.testId );
        +	if ( testBlock ) {
        +		testBlock.className = "running";
        +	} else {
        +
        +		// Report later registered tests
        +		appendTest( details.name, details.testId, details.module );
        +	}
        +
        +	running = id( "qunit-testresult" );
        +	if ( running ) {
        +		bad = QUnit.config.reorder && defined.sessionStorage &&
        +			+sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
        +
        +		running.innerHTML = ( bad ?
        +			"Rerunning previously failed test: <br />" :
        +			"Running: <br />" ) +
        +			getNameHtml( details.name, details.module );
        +	}
        +
        +} );
        +
        +function stripHtml( string ) {
        +
        +	// Strip tags, html entity and whitespaces
        +	return string.replace( /<\/?[^>]+(>|$)/g, "" ).replace( /\&quot;/g, "" ).replace( /\s+/g, "" );
        +}
        +
        +QUnit.log( function( details ) {
        +	var assertList, assertLi,
        +		message, expected, actual, diff,
        +		showDiff = false,
        +		testItem = id( "qunit-test-output-" + details.testId );
        +
        +	if ( !testItem ) {
        +		return;
        +	}
        +
        +	message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
        +	message = "<span class='test-message'>" + message + "</span>";
        +	message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
        +
        +	// The pushFailure doesn't provide details.expected
        +	// when it calls, it's implicit to also not show expected and diff stuff
        +	// Also, we need to check details.expected existence, as it can exist and be undefined
        +	if ( !details.result && hasOwn.call( details, "expected" ) ) {
        +		if ( details.negative ) {
        +			expected = "NOT " + QUnit.dump.parse( details.expected );
        +		} else {
        +			expected = QUnit.dump.parse( details.expected );
        +		}
        +
        +		actual = QUnit.dump.parse( details.actual );
        +		message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
        +			escapeText( expected ) +
        +			"</pre></td></tr>";
        +
        +		if ( actual !== expected ) {
        +
        +			message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
        +				escapeText( actual ) + "</pre></td></tr>";
        +
        +			// Don't show diff if actual or expected are booleans
        +			if ( !( /^(true|false)$/.test( actual ) ) &&
        +					!( /^(true|false)$/.test( expected ) ) ) {
        +				diff = QUnit.diff( expected, actual );
        +				showDiff = stripHtml( diff ).length !==
        +					stripHtml( expected ).length +
        +					stripHtml( actual ).length;
        +			}
        +
        +			// Don't show diff if expected and actual are totally different
        +			if ( showDiff ) {
        +				message += "<tr class='test-diff'><th>Diff: </th><td><pre>" +
        +					diff + "</pre></td></tr>";
        +			}
        +		} else if ( expected.indexOf( "[object Array]" ) !== -1 ||
        +				expected.indexOf( "[object Object]" ) !== -1 ) {
        +			message += "<tr class='test-message'><th>Message: </th><td>" +
        +				"Diff suppressed as the depth of object is more than current max depth (" +
        +				QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
        +				" run with a higher max depth or <a href='" +
        +				escapeText( setUrl( { maxDepth: -1 } ) ) + "'>" +
        +				"Rerun</a> without max depth.</p></td></tr>";
        +		} else {
        +			message += "<tr class='test-message'><th>Message: </th><td>" +
        +				"Diff suppressed as the expected and actual results have an equivalent" +
        +				" serialization</td></tr>";
        +		}
        +
        +		if ( details.source ) {
        +			message += "<tr class='test-source'><th>Source: </th><td><pre>" +
        +				escapeText( details.source ) + "</pre></td></tr>";
        +		}
        +
        +		message += "</table>";
        +
        +	// This occurs when pushFailure is set and we have an extracted stack trace
        +	} else if ( !details.result && details.source ) {
        +		message += "<table>" +
        +			"<tr class='test-source'><th>Source: </th><td><pre>" +
        +			escapeText( details.source ) + "</pre></td></tr>" +
        +			"</table>";
        +	}
        +
        +	assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
        +
        +	assertLi = document.createElement( "li" );
        +	assertLi.className = details.result ? "pass" : "fail";
        +	assertLi.innerHTML = message;
        +	assertList.appendChild( assertLi );
        +} );
        +
        +QUnit.testDone( function( details ) {
        +	var testTitle, time, testItem, assertList,
        +		good, bad, testCounts, skipped, sourceName,
        +		tests = id( "qunit-tests" );
        +
        +	if ( !tests ) {
        +		return;
        +	}
        +
        +	testItem = id( "qunit-test-output-" + details.testId );
        +
        +	assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
        +
        +	good = details.passed;
        +	bad = details.failed;
        +
        +	// Store result when possible
        +	if ( config.reorder && defined.sessionStorage ) {
        +		if ( bad ) {
        +			sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
        +		} else {
        +			sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
        +		}
        +	}
        +
        +	if ( bad === 0 ) {
        +
        +		// Collapse the passing tests
        +		addClass( assertList, "qunit-collapsed" );
        +	} else if ( bad && config.collapse && !collapseNext ) {
        +
        +		// Skip collapsing the first failing test
        +		collapseNext = true;
        +	} else {
        +
        +		// Collapse remaining tests
        +		addClass( assertList, "qunit-collapsed" );
        +	}
        +
        +	// The testItem.firstChild is the test name
        +	testTitle = testItem.firstChild;
        +
        +	testCounts = bad ?
        +		"<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
        +		"";
        +
        +	testTitle.innerHTML += " <b class='counts'>(" + testCounts +
        +		details.assertions.length + ")</b>";
        +
        +	if ( details.skipped ) {
        +		testItem.className = "skipped";
        +		skipped = document.createElement( "em" );
        +		skipped.className = "qunit-skipped-label";
        +		skipped.innerHTML = "skipped";
        +		testItem.insertBefore( skipped, testTitle );
        +	} else {
        +		addEvent( testTitle, "click", function() {
        +			toggleClass( assertList, "qunit-collapsed" );
        +		} );
        +
        +		testItem.className = bad ? "fail" : "pass";
        +
        +		time = document.createElement( "span" );
        +		time.className = "runtime";
        +		time.innerHTML = details.runtime + " ms";
        +		testItem.insertBefore( time, assertList );
        +	}
        +
        +	// Show the source of the test when showing assertions
        +	if ( details.source ) {
        +		sourceName = document.createElement( "p" );
        +		sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
        +		addClass( sourceName, "qunit-source" );
        +		if ( bad === 0 ) {
        +			addClass( sourceName, "qunit-collapsed" );
        +		}
        +		addEvent( testTitle, "click", function() {
        +			toggleClass( sourceName, "qunit-collapsed" );
        +		} );
        +		testItem.appendChild( sourceName );
        +	}
        +} );
        +
        +// Avoid readyState issue with phantomjs
        +// Ref: #818
        +var notPhantom = ( function( p ) {
        +	return !( p && p.version && p.version.major > 0 );
        +} )( window.phantom );
        +
        +if ( notPhantom && document.readyState === "complete" ) {
        +	QUnit.load();
        +} else {
        +	addEvent( window, "load", QUnit.load );
        +}
        +
        +/*
        + * This file is a modified version of google-diff-match-patch's JavaScript implementation
        + * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
        + * modifications are licensed as more fully set forth in LICENSE.txt.
        + *
        + * The original source of google-diff-match-patch is attributable and licensed as follows:
        + *
        + * Copyright 2006 Google Inc.
        + * https://code.google.com/p/google-diff-match-patch/
        + *
        + * Licensed under the Apache License, Version 2.0 (the "License");
        + * you may not use this file except in compliance with the License.
        + * You may obtain a copy of the License at
        + *
        + * https://www.apache.org/licenses/LICENSE-2.0
        + *
        + * Unless required by applicable law or agreed to in writing, software
        + * distributed under the License is distributed on an "AS IS" BASIS,
        + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        + * See the License for the specific language governing permissions and
        + * limitations under the License.
        + *
        + * More Info:
        + *  https://code.google.com/p/google-diff-match-patch/
        + *
        + * Usage: QUnit.diff(expected, actual)
        + *
        + */
        +QUnit.diff = ( function() {
        +	function DiffMatchPatch() {
        +	}
        +
        +	//  DIFF FUNCTIONS
        +
        +	/**
        +	 * The data structure representing a diff is an array of tuples:
        +	 * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
        +	 * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
        +	 */
        +	var DIFF_DELETE = -1,
        +		DIFF_INSERT = 1,
        +		DIFF_EQUAL = 0;
        +
        +	/**
        +	 * Find the differences between two texts.  Simplifies the problem by stripping
        +	 * any common prefix or suffix off the texts before diffing.
        +	 * @param {string} text1 Old string to be diffed.
        +	 * @param {string} text2 New string to be diffed.
        +	 * @param {boolean=} optChecklines Optional speedup flag. If present and false,
        +	 *     then don't run a line-level diff first to identify the changed areas.
        +	 *     Defaults to true, which does a faster, slightly less optimal diff.
        +	 * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
        +	 */
        +	DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
        +		var deadline, checklines, commonlength,
        +			commonprefix, commonsuffix, diffs;
        +
        +		// The diff must be complete in up to 1 second.
        +		deadline = ( new Date() ).getTime() + 1000;
        +
        +		// Check for null inputs.
        +		if ( text1 === null || text2 === null ) {
        +			throw new Error( "Null input. (DiffMain)" );
        +		}
        +
        +		// Check for equality (speedup).
        +		if ( text1 === text2 ) {
        +			if ( text1 ) {
        +				return [
        +					[ DIFF_EQUAL, text1 ]
        +				];
        +			}
        +			return [];
        +		}
        +
        +		if ( typeof optChecklines === "undefined" ) {
        +			optChecklines = true;
        +		}
        +
        +		checklines = optChecklines;
        +
        +		// Trim off common prefix (speedup).
        +		commonlength = this.diffCommonPrefix( text1, text2 );
        +		commonprefix = text1.substring( 0, commonlength );
        +		text1 = text1.substring( commonlength );
        +		text2 = text2.substring( commonlength );
        +
        +		// Trim off common suffix (speedup).
        +		commonlength = this.diffCommonSuffix( text1, text2 );
        +		commonsuffix = text1.substring( text1.length - commonlength );
        +		text1 = text1.substring( 0, text1.length - commonlength );
        +		text2 = text2.substring( 0, text2.length - commonlength );
        +
        +		// Compute the diff on the middle block.
        +		diffs = this.diffCompute( text1, text2, checklines, deadline );
        +
        +		// Restore the prefix and suffix.
        +		if ( commonprefix ) {
        +			diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
        +		}
        +		if ( commonsuffix ) {
        +			diffs.push( [ DIFF_EQUAL, commonsuffix ] );
        +		}
        +		this.diffCleanupMerge( diffs );
        +		return diffs;
        +	};
        +
        +	/**
        +	 * Reduce the number of edits by eliminating operationally trivial equalities.
        +	 * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
        +	 */
        +	DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
        +		var changes, equalities, equalitiesLength, lastequality,
        +			pointer, preIns, preDel, postIns, postDel;
        +		changes = false;
        +		equalities = []; // Stack of indices where equalities are found.
        +		equalitiesLength = 0; // Keeping our own length var is faster in JS.
        +		/** @type {?string} */
        +		lastequality = null;
        +
        +		// Always equal to diffs[equalities[equalitiesLength - 1]][1]
        +		pointer = 0; // Index of current position.
        +
        +		// Is there an insertion operation before the last equality.
        +		preIns = false;
        +
        +		// Is there a deletion operation before the last equality.
        +		preDel = false;
        +
        +		// Is there an insertion operation after the last equality.
        +		postIns = false;
        +
        +		// Is there a deletion operation after the last equality.
        +		postDel = false;
        +		while ( pointer < diffs.length ) {
        +
        +			// Equality found.
        +			if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
        +				if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
        +
        +					// Candidate found.
        +					equalities[ equalitiesLength++ ] = pointer;
        +					preIns = postIns;
        +					preDel = postDel;
        +					lastequality = diffs[ pointer ][ 1 ];
        +				} else {
        +
        +					// Not a candidate, and can never become one.
        +					equalitiesLength = 0;
        +					lastequality = null;
        +				}
        +				postIns = postDel = false;
        +
        +			// An insertion or deletion.
        +			} else {
        +
        +				if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
        +					postDel = true;
        +				} else {
        +					postIns = true;
        +				}
        +
        +				/*
        +				 * Five types to be split:
        +				 * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
        +				 * <ins>A</ins>X<ins>C</ins><del>D</del>
        +				 * <ins>A</ins><del>B</del>X<ins>C</ins>
        +				 * <ins>A</del>X<ins>C</ins><del>D</del>
        +				 * <ins>A</ins><del>B</del>X<del>C</del>
        +				 */
        +				if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
        +						( ( lastequality.length < 2 ) &&
        +						( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
        +
        +					// Duplicate record.
        +					diffs.splice(
        +						equalities[ equalitiesLength - 1 ],
        +						0,
        +						[ DIFF_DELETE, lastequality ]
        +					);
        +
        +					// Change second copy to insert.
        +					diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
        +					equalitiesLength--; // Throw away the equality we just deleted;
        +					lastequality = null;
        +					if ( preIns && preDel ) {
        +
        +						// No changes made which could affect previous entry, keep going.
        +						postIns = postDel = true;
        +						equalitiesLength = 0;
        +					} else {
        +						equalitiesLength--; // Throw away the previous equality.
        +						pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
        +						postIns = postDel = false;
        +					}
        +					changes = true;
        +				}
        +			}
        +			pointer++;
        +		}
        +
        +		if ( changes ) {
        +			this.diffCleanupMerge( diffs );
        +		}
        +	};
        +
        +	/**
        +	 * Convert a diff array into a pretty HTML report.
        +	 * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
        +	 * @param {integer} string to be beautified.
        +	 * @return {string} HTML representation.
        +	 */
        +	DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
        +		var op, data, x,
        +			html = [];
        +		for ( x = 0; x < diffs.length; x++ ) {
        +			op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
        +			data = diffs[ x ][ 1 ]; // Text of change.
        +			switch ( op ) {
        +			case DIFF_INSERT:
        +				html[ x ] = "<ins>" + escapeText( data ) + "</ins>";
        +				break;
        +			case DIFF_DELETE:
        +				html[ x ] = "<del>" + escapeText( data ) + "</del>";
        +				break;
        +			case DIFF_EQUAL:
        +				html[ x ] = "<span>" + escapeText( data ) + "</span>";
        +				break;
        +			}
        +		}
        +		return html.join( "" );
        +	};
        +
        +	/**
        +	 * Determine the common prefix of two strings.
        +	 * @param {string} text1 First string.
        +	 * @param {string} text2 Second string.
        +	 * @return {number} The number of characters common to the start of each
        +	 *     string.
        +	 */
        +	DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
        +		var pointermid, pointermax, pointermin, pointerstart;
        +
        +		// Quick check for common null cases.
        +		if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
        +			return 0;
        +		}
        +
        +		// Binary search.
        +		// Performance analysis: https://neil.fraser.name/news/2007/10/09/
        +		pointermin = 0;
        +		pointermax = Math.min( text1.length, text2.length );
        +		pointermid = pointermax;
        +		pointerstart = 0;
        +		while ( pointermin < pointermid ) {
        +			if ( text1.substring( pointerstart, pointermid ) ===
        +					text2.substring( pointerstart, pointermid ) ) {
        +				pointermin = pointermid;
        +				pointerstart = pointermin;
        +			} else {
        +				pointermax = pointermid;
        +			}
        +			pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
        +		}
        +		return pointermid;
        +	};
        +
        +	/**
        +	 * Determine the common suffix of two strings.
        +	 * @param {string} text1 First string.
        +	 * @param {string} text2 Second string.
        +	 * @return {number} The number of characters common to the end of each string.
        +	 */
        +	DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
        +		var pointermid, pointermax, pointermin, pointerend;
        +
        +		// Quick check for common null cases.
        +		if ( !text1 ||
        +				!text2 ||
        +				text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
        +			return 0;
        +		}
        +
        +		// Binary search.
        +		// Performance analysis: https://neil.fraser.name/news/2007/10/09/
        +		pointermin = 0;
        +		pointermax = Math.min( text1.length, text2.length );
        +		pointermid = pointermax;
        +		pointerend = 0;
        +		while ( pointermin < pointermid ) {
        +			if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
        +					text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
        +				pointermin = pointermid;
        +				pointerend = pointermin;
        +			} else {
        +				pointermax = pointermid;
        +			}
        +			pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
        +		}
        +		return pointermid;
        +	};
        +
        +	/**
        +	 * Find the differences between two texts.  Assumes that the texts do not
        +	 * have any common prefix or suffix.
        +	 * @param {string} text1 Old string to be diffed.
        +	 * @param {string} text2 New string to be diffed.
        +	 * @param {boolean} checklines Speedup flag.  If false, then don't run a
        +	 *     line-level diff first to identify the changed areas.
        +	 *     If true, then run a faster, slightly less optimal diff.
        +	 * @param {number} deadline Time when the diff should be complete by.
        +	 * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
        +		var diffs, longtext, shorttext, i, hm,
        +			text1A, text2A, text1B, text2B,
        +			midCommon, diffsA, diffsB;
        +
        +		if ( !text1 ) {
        +
        +			// Just add some text (speedup).
        +			return [
        +				[ DIFF_INSERT, text2 ]
        +			];
        +		}
        +
        +		if ( !text2 ) {
        +
        +			// Just delete some text (speedup).
        +			return [
        +				[ DIFF_DELETE, text1 ]
        +			];
        +		}
        +
        +		longtext = text1.length > text2.length ? text1 : text2;
        +		shorttext = text1.length > text2.length ? text2 : text1;
        +		i = longtext.indexOf( shorttext );
        +		if ( i !== -1 ) {
        +
        +			// Shorter text is inside the longer text (speedup).
        +			diffs = [
        +				[ DIFF_INSERT, longtext.substring( 0, i ) ],
        +				[ DIFF_EQUAL, shorttext ],
        +				[ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
        +			];
        +
        +			// Swap insertions for deletions if diff is reversed.
        +			if ( text1.length > text2.length ) {
        +				diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
        +			}
        +			return diffs;
        +		}
        +
        +		if ( shorttext.length === 1 ) {
        +
        +			// Single character string.
        +			// After the previous speedup, the character can't be an equality.
        +			return [
        +				[ DIFF_DELETE, text1 ],
        +				[ DIFF_INSERT, text2 ]
        +			];
        +		}
        +
        +		// Check to see if the problem can be split in two.
        +		hm = this.diffHalfMatch( text1, text2 );
        +		if ( hm ) {
        +
        +			// A half-match was found, sort out the return data.
        +			text1A = hm[ 0 ];
        +			text1B = hm[ 1 ];
        +			text2A = hm[ 2 ];
        +			text2B = hm[ 3 ];
        +			midCommon = hm[ 4 ];
        +
        +			// Send both pairs off for separate processing.
        +			diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
        +			diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
        +
        +			// Merge the results.
        +			return diffsA.concat( [
        +				[ DIFF_EQUAL, midCommon ]
        +			], diffsB );
        +		}
        +
        +		if ( checklines && text1.length > 100 && text2.length > 100 ) {
        +			return this.diffLineMode( text1, text2, deadline );
        +		}
        +
        +		return this.diffBisect( text1, text2, deadline );
        +	};
        +
        +	/**
        +	 * Do the two texts share a substring which is at least half the length of the
        +	 * longer text?
        +	 * This speedup can produce non-minimal diffs.
        +	 * @param {string} text1 First string.
        +	 * @param {string} text2 Second string.
        +	 * @return {Array.<string>} Five element Array, containing the prefix of
        +	 *     text1, the suffix of text1, the prefix of text2, the suffix of
        +	 *     text2 and the common middle.  Or null if there was no match.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
        +		var longtext, shorttext, dmp,
        +			text1A, text2B, text2A, text1B, midCommon,
        +			hm1, hm2, hm;
        +
        +		longtext = text1.length > text2.length ? text1 : text2;
        +		shorttext = text1.length > text2.length ? text2 : text1;
        +		if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
        +			return null; // Pointless.
        +		}
        +		dmp = this; // 'this' becomes 'window' in a closure.
        +
        +		/**
        +		 * Does a substring of shorttext exist within longtext such that the substring
        +		 * is at least half the length of longtext?
        +		 * Closure, but does not reference any external variables.
        +		 * @param {string} longtext Longer string.
        +		 * @param {string} shorttext Shorter string.
        +		 * @param {number} i Start index of quarter length substring within longtext.
        +		 * @return {Array.<string>} Five element Array, containing the prefix of
        +		 *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
        +		 *     of shorttext and the common middle.  Or null if there was no match.
        +		 * @private
        +		 */
        +		function diffHalfMatchI( longtext, shorttext, i ) {
        +			var seed, j, bestCommon, prefixLength, suffixLength,
        +				bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
        +
        +			// Start with a 1/4 length substring at position i as a seed.
        +			seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
        +			j = -1;
        +			bestCommon = "";
        +			while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
        +				prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
        +					shorttext.substring( j ) );
        +				suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
        +					shorttext.substring( 0, j ) );
        +				if ( bestCommon.length < suffixLength + prefixLength ) {
        +					bestCommon = shorttext.substring( j - suffixLength, j ) +
        +						shorttext.substring( j, j + prefixLength );
        +					bestLongtextA = longtext.substring( 0, i - suffixLength );
        +					bestLongtextB = longtext.substring( i + prefixLength );
        +					bestShorttextA = shorttext.substring( 0, j - suffixLength );
        +					bestShorttextB = shorttext.substring( j + prefixLength );
        +				}
        +			}
        +			if ( bestCommon.length * 2 >= longtext.length ) {
        +				return [ bestLongtextA, bestLongtextB,
        +					bestShorttextA, bestShorttextB, bestCommon
        +				];
        +			} else {
        +				return null;
        +			}
        +		}
        +
        +		// First check if the second quarter is the seed for a half-match.
        +		hm1 = diffHalfMatchI( longtext, shorttext,
        +			Math.ceil( longtext.length / 4 ) );
        +
        +		// Check again based on the third quarter.
        +		hm2 = diffHalfMatchI( longtext, shorttext,
        +			Math.ceil( longtext.length / 2 ) );
        +		if ( !hm1 && !hm2 ) {
        +			return null;
        +		} else if ( !hm2 ) {
        +			hm = hm1;
        +		} else if ( !hm1 ) {
        +			hm = hm2;
        +		} else {
        +
        +			// Both matched.  Select the longest.
        +			hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
        +		}
        +
        +		// A half-match was found, sort out the return data.
        +		text1A, text1B, text2A, text2B;
        +		if ( text1.length > text2.length ) {
        +			text1A = hm[ 0 ];
        +			text1B = hm[ 1 ];
        +			text2A = hm[ 2 ];
        +			text2B = hm[ 3 ];
        +		} else {
        +			text2A = hm[ 0 ];
        +			text2B = hm[ 1 ];
        +			text1A = hm[ 2 ];
        +			text1B = hm[ 3 ];
        +		}
        +		midCommon = hm[ 4 ];
        +		return [ text1A, text1B, text2A, text2B, midCommon ];
        +	};
        +
        +	/**
        +	 * Do a quick line-level diff on both strings, then rediff the parts for
        +	 * greater accuracy.
        +	 * This speedup can produce non-minimal diffs.
        +	 * @param {string} text1 Old string to be diffed.
        +	 * @param {string} text2 New string to be diffed.
        +	 * @param {number} deadline Time when the diff should be complete by.
        +	 * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
        +		var a, diffs, linearray, pointer, countInsert,
        +			countDelete, textInsert, textDelete, j;
        +
        +		// Scan the text on a line-by-line basis first.
        +		a = this.diffLinesToChars( text1, text2 );
        +		text1 = a.chars1;
        +		text2 = a.chars2;
        +		linearray = a.lineArray;
        +
        +		diffs = this.DiffMain( text1, text2, false, deadline );
        +
        +		// Convert the diff back to original text.
        +		this.diffCharsToLines( diffs, linearray );
        +
        +		// Eliminate freak matches (e.g. blank lines)
        +		this.diffCleanupSemantic( diffs );
        +
        +		// Rediff any replacement blocks, this time character-by-character.
        +		// Add a dummy entry at the end.
        +		diffs.push( [ DIFF_EQUAL, "" ] );
        +		pointer = 0;
        +		countDelete = 0;
        +		countInsert = 0;
        +		textDelete = "";
        +		textInsert = "";
        +		while ( pointer < diffs.length ) {
        +			switch ( diffs[ pointer ][ 0 ] ) {
        +			case DIFF_INSERT:
        +				countInsert++;
        +				textInsert += diffs[ pointer ][ 1 ];
        +				break;
        +			case DIFF_DELETE:
        +				countDelete++;
        +				textDelete += diffs[ pointer ][ 1 ];
        +				break;
        +			case DIFF_EQUAL:
        +
        +				// Upon reaching an equality, check for prior redundancies.
        +				if ( countDelete >= 1 && countInsert >= 1 ) {
        +
        +					// Delete the offending records and add the merged ones.
        +					diffs.splice( pointer - countDelete - countInsert,
        +						countDelete + countInsert );
        +					pointer = pointer - countDelete - countInsert;
        +					a = this.DiffMain( textDelete, textInsert, false, deadline );
        +					for ( j = a.length - 1; j >= 0; j-- ) {
        +						diffs.splice( pointer, 0, a[ j ] );
        +					}
        +					pointer = pointer + a.length;
        +				}
        +				countInsert = 0;
        +				countDelete = 0;
        +				textDelete = "";
        +				textInsert = "";
        +				break;
        +			}
        +			pointer++;
        +		}
        +		diffs.pop(); // Remove the dummy entry at the end.
        +
        +		return diffs;
        +	};
        +
        +	/**
        +	 * Find the 'middle snake' of a diff, split the problem in two
        +	 * and return the recursively constructed diff.
        +	 * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
        +	 * @param {string} text1 Old string to be diffed.
        +	 * @param {string} text2 New string to be diffed.
        +	 * @param {number} deadline Time at which to bail if not yet complete.
        +	 * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
        +		var text1Length, text2Length, maxD, vOffset, vLength,
        +			v1, v2, x, delta, front, k1start, k1end, k2start,
        +			k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
        +
        +		// Cache the text lengths to prevent multiple calls.
        +		text1Length = text1.length;
        +		text2Length = text2.length;
        +		maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
        +		vOffset = maxD;
        +		vLength = 2 * maxD;
        +		v1 = new Array( vLength );
        +		v2 = new Array( vLength );
        +
        +		// Setting all elements to -1 is faster in Chrome & Firefox than mixing
        +		// integers and undefined.
        +		for ( x = 0; x < vLength; x++ ) {
        +			v1[ x ] = -1;
        +			v2[ x ] = -1;
        +		}
        +		v1[ vOffset + 1 ] = 0;
        +		v2[ vOffset + 1 ] = 0;
        +		delta = text1Length - text2Length;
        +
        +		// If the total number of characters is odd, then the front path will collide
        +		// with the reverse path.
        +		front = ( delta % 2 !== 0 );
        +
        +		// Offsets for start and end of k loop.
        +		// Prevents mapping of space beyond the grid.
        +		k1start = 0;
        +		k1end = 0;
        +		k2start = 0;
        +		k2end = 0;
        +		for ( d = 0; d < maxD; d++ ) {
        +
        +			// Bail out if deadline is reached.
        +			if ( ( new Date() ).getTime() > deadline ) {
        +				break;
        +			}
        +
        +			// Walk the front path one step.
        +			for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
        +				k1Offset = vOffset + k1;
        +				if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
        +					x1 = v1[ k1Offset + 1 ];
        +				} else {
        +					x1 = v1[ k1Offset - 1 ] + 1;
        +				}
        +				y1 = x1 - k1;
        +				while ( x1 < text1Length && y1 < text2Length &&
        +					text1.charAt( x1 ) === text2.charAt( y1 ) ) {
        +					x1++;
        +					y1++;
        +				}
        +				v1[ k1Offset ] = x1;
        +				if ( x1 > text1Length ) {
        +
        +					// Ran off the right of the graph.
        +					k1end += 2;
        +				} else if ( y1 > text2Length ) {
        +
        +					// Ran off the bottom of the graph.
        +					k1start += 2;
        +				} else if ( front ) {
        +					k2Offset = vOffset + delta - k1;
        +					if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
        +
        +						// Mirror x2 onto top-left coordinate system.
        +						x2 = text1Length - v2[ k2Offset ];
        +						if ( x1 >= x2 ) {
        +
        +							// Overlap detected.
        +							return this.diffBisectSplit( text1, text2, x1, y1, deadline );
        +						}
        +					}
        +				}
        +			}
        +
        +			// Walk the reverse path one step.
        +			for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
        +				k2Offset = vOffset + k2;
        +				if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
        +					x2 = v2[ k2Offset + 1 ];
        +				} else {
        +					x2 = v2[ k2Offset - 1 ] + 1;
        +				}
        +				y2 = x2 - k2;
        +				while ( x2 < text1Length && y2 < text2Length &&
        +					text1.charAt( text1Length - x2 - 1 ) ===
        +					text2.charAt( text2Length - y2 - 1 ) ) {
        +					x2++;
        +					y2++;
        +				}
        +				v2[ k2Offset ] = x2;
        +				if ( x2 > text1Length ) {
        +
        +					// Ran off the left of the graph.
        +					k2end += 2;
        +				} else if ( y2 > text2Length ) {
        +
        +					// Ran off the top of the graph.
        +					k2start += 2;
        +				} else if ( !front ) {
        +					k1Offset = vOffset + delta - k2;
        +					if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
        +						x1 = v1[ k1Offset ];
        +						y1 = vOffset + x1 - k1Offset;
        +
        +						// Mirror x2 onto top-left coordinate system.
        +						x2 = text1Length - x2;
        +						if ( x1 >= x2 ) {
        +
        +							// Overlap detected.
        +							return this.diffBisectSplit( text1, text2, x1, y1, deadline );
        +						}
        +					}
        +				}
        +			}
        +		}
        +
        +		// Diff took too long and hit the deadline or
        +		// number of diffs equals number of characters, no commonality at all.
        +		return [
        +			[ DIFF_DELETE, text1 ],
        +			[ DIFF_INSERT, text2 ]
        +		];
        +	};
        +
        +	/**
        +	 * Given the location of the 'middle snake', split the diff in two parts
        +	 * and recurse.
        +	 * @param {string} text1 Old string to be diffed.
        +	 * @param {string} text2 New string to be diffed.
        +	 * @param {number} x Index of split point in text1.
        +	 * @param {number} y Index of split point in text2.
        +	 * @param {number} deadline Time at which to bail if not yet complete.
        +	 * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
        +		var text1a, text1b, text2a, text2b, diffs, diffsb;
        +		text1a = text1.substring( 0, x );
        +		text2a = text2.substring( 0, y );
        +		text1b = text1.substring( x );
        +		text2b = text2.substring( y );
        +
        +		// Compute both diffs serially.
        +		diffs = this.DiffMain( text1a, text2a, false, deadline );
        +		diffsb = this.DiffMain( text1b, text2b, false, deadline );
        +
        +		return diffs.concat( diffsb );
        +	};
        +
        +	/**
        +	 * Reduce the number of edits by eliminating semantically trivial equalities.
        +	 * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
        +	 */
        +	DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
        +		var changes, equalities, equalitiesLength, lastequality,
        +			pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
        +			lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
        +		changes = false;
        +		equalities = []; // Stack of indices where equalities are found.
        +		equalitiesLength = 0; // Keeping our own length var is faster in JS.
        +		/** @type {?string} */
        +		lastequality = null;
        +
        +		// Always equal to diffs[equalities[equalitiesLength - 1]][1]
        +		pointer = 0; // Index of current position.
        +
        +		// Number of characters that changed prior to the equality.
        +		lengthInsertions1 = 0;
        +		lengthDeletions1 = 0;
        +
        +		// Number of characters that changed after the equality.
        +		lengthInsertions2 = 0;
        +		lengthDeletions2 = 0;
        +		while ( pointer < diffs.length ) {
        +			if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
        +				equalities[ equalitiesLength++ ] = pointer;
        +				lengthInsertions1 = lengthInsertions2;
        +				lengthDeletions1 = lengthDeletions2;
        +				lengthInsertions2 = 0;
        +				lengthDeletions2 = 0;
        +				lastequality = diffs[ pointer ][ 1 ];
        +			} else { // An insertion or deletion.
        +				if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
        +					lengthInsertions2 += diffs[ pointer ][ 1 ].length;
        +				} else {
        +					lengthDeletions2 += diffs[ pointer ][ 1 ].length;
        +				}
        +
        +				// Eliminate an equality that is smaller or equal to the edits on both
        +				// sides of it.
        +				if ( lastequality && ( lastequality.length <=
        +						Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
        +						( lastequality.length <= Math.max( lengthInsertions2,
        +							lengthDeletions2 ) ) ) {
        +
        +					// Duplicate record.
        +					diffs.splice(
        +						equalities[ equalitiesLength - 1 ],
        +						0,
        +						[ DIFF_DELETE, lastequality ]
        +					);
        +
        +					// Change second copy to insert.
        +					diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
        +
        +					// Throw away the equality we just deleted.
        +					equalitiesLength--;
        +
        +					// Throw away the previous equality (it needs to be reevaluated).
        +					equalitiesLength--;
        +					pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
        +
        +					// Reset the counters.
        +					lengthInsertions1 = 0;
        +					lengthDeletions1 = 0;
        +					lengthInsertions2 = 0;
        +					lengthDeletions2 = 0;
        +					lastequality = null;
        +					changes = true;
        +				}
        +			}
        +			pointer++;
        +		}
        +
        +		// Normalize the diff.
        +		if ( changes ) {
        +			this.diffCleanupMerge( diffs );
        +		}
        +
        +		// Find any overlaps between deletions and insertions.
        +		// e.g: <del>abcxxx</del><ins>xxxdef</ins>
        +		//   -> <del>abc</del>xxx<ins>def</ins>
        +		// e.g: <del>xxxabc</del><ins>defxxx</ins>
        +		//   -> <ins>def</ins>xxx<del>abc</del>
        +		// Only extract an overlap if it is as big as the edit ahead or behind it.
        +		pointer = 1;
        +		while ( pointer < diffs.length ) {
        +			if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
        +					diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
        +				deletion = diffs[ pointer - 1 ][ 1 ];
        +				insertion = diffs[ pointer ][ 1 ];
        +				overlapLength1 = this.diffCommonOverlap( deletion, insertion );
        +				overlapLength2 = this.diffCommonOverlap( insertion, deletion );
        +				if ( overlapLength1 >= overlapLength2 ) {
        +					if ( overlapLength1 >= deletion.length / 2 ||
        +							overlapLength1 >= insertion.length / 2 ) {
        +
        +						// Overlap found.  Insert an equality and trim the surrounding edits.
        +						diffs.splice(
        +							pointer,
        +							0,
        +							[ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
        +						);
        +						diffs[ pointer - 1 ][ 1 ] =
        +							deletion.substring( 0, deletion.length - overlapLength1 );
        +						diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
        +						pointer++;
        +					}
        +				} else {
        +					if ( overlapLength2 >= deletion.length / 2 ||
        +							overlapLength2 >= insertion.length / 2 ) {
        +
        +						// Reverse overlap found.
        +						// Insert an equality and swap and trim the surrounding edits.
        +						diffs.splice(
        +							pointer,
        +							0,
        +							[ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
        +						);
        +
        +						diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
        +						diffs[ pointer - 1 ][ 1 ] =
        +							insertion.substring( 0, insertion.length - overlapLength2 );
        +						diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
        +						diffs[ pointer + 1 ][ 1 ] =
        +							deletion.substring( overlapLength2 );
        +						pointer++;
        +					}
        +				}
        +				pointer++;
        +			}
        +			pointer++;
        +		}
        +	};
        +
        +	/**
        +	 * Determine if the suffix of one string is the prefix of another.
        +	 * @param {string} text1 First string.
        +	 * @param {string} text2 Second string.
        +	 * @return {number} The number of characters common to the end of the first
        +	 *     string and the start of the second string.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
        +		var text1Length, text2Length, textLength,
        +			best, length, pattern, found;
        +
        +		// Cache the text lengths to prevent multiple calls.
        +		text1Length = text1.length;
        +		text2Length = text2.length;
        +
        +		// Eliminate the null case.
        +		if ( text1Length === 0 || text2Length === 0 ) {
        +			return 0;
        +		}
        +
        +		// Truncate the longer string.
        +		if ( text1Length > text2Length ) {
        +			text1 = text1.substring( text1Length - text2Length );
        +		} else if ( text1Length < text2Length ) {
        +			text2 = text2.substring( 0, text1Length );
        +		}
        +		textLength = Math.min( text1Length, text2Length );
        +
        +		// Quick check for the worst case.
        +		if ( text1 === text2 ) {
        +			return textLength;
        +		}
        +
        +		// Start by looking for a single character match
        +		// and increase length until no match is found.
        +		// Performance analysis: https://neil.fraser.name/news/2010/11/04/
        +		best = 0;
        +		length = 1;
        +		while ( true ) {
        +			pattern = text1.substring( textLength - length );
        +			found = text2.indexOf( pattern );
        +			if ( found === -1 ) {
        +				return best;
        +			}
        +			length += found;
        +			if ( found === 0 || text1.substring( textLength - length ) ===
        +					text2.substring( 0, length ) ) {
        +				best = length;
        +				length++;
        +			}
        +		}
        +	};
        +
        +	/**
        +	 * Split two texts into an array of strings.  Reduce the texts to a string of
        +	 * hashes where each Unicode character represents one line.
        +	 * @param {string} text1 First string.
        +	 * @param {string} text2 Second string.
        +	 * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
        +	 *     An object containing the encoded text1, the encoded text2 and
        +	 *     the array of unique strings.
        +	 *     The zeroth element of the array of unique strings is intentionally blank.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
        +		var lineArray, lineHash, chars1, chars2;
        +		lineArray = []; // E.g. lineArray[4] === 'Hello\n'
        +		lineHash = {};  // E.g. lineHash['Hello\n'] === 4
        +
        +		// '\x00' is a valid character, but various debuggers don't like it.
        +		// So we'll insert a junk entry to avoid generating a null character.
        +		lineArray[ 0 ] = "";
        +
        +		/**
        +		 * Split a text into an array of strings.  Reduce the texts to a string of
        +		 * hashes where each Unicode character represents one line.
        +		 * Modifies linearray and linehash through being a closure.
        +		 * @param {string} text String to encode.
        +		 * @return {string} Encoded string.
        +		 * @private
        +		 */
        +		function diffLinesToCharsMunge( text ) {
        +			var chars, lineStart, lineEnd, lineArrayLength, line;
        +			chars = "";
        +
        +			// Walk the text, pulling out a substring for each line.
        +			// text.split('\n') would would temporarily double our memory footprint.
        +			// Modifying text would create many large strings to garbage collect.
        +			lineStart = 0;
        +			lineEnd = -1;
        +
        +			// Keeping our own length variable is faster than looking it up.
        +			lineArrayLength = lineArray.length;
        +			while ( lineEnd < text.length - 1 ) {
        +				lineEnd = text.indexOf( "\n", lineStart );
        +				if ( lineEnd === -1 ) {
        +					lineEnd = text.length - 1;
        +				}
        +				line = text.substring( lineStart, lineEnd + 1 );
        +				lineStart = lineEnd + 1;
        +
        +				if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
        +							( lineHash[ line ] !== undefined ) ) {
        +					chars += String.fromCharCode( lineHash[ line ] );
        +				} else {
        +					chars += String.fromCharCode( lineArrayLength );
        +					lineHash[ line ] = lineArrayLength;
        +					lineArray[ lineArrayLength++ ] = line;
        +				}
        +			}
        +			return chars;
        +		}
        +
        +		chars1 = diffLinesToCharsMunge( text1 );
        +		chars2 = diffLinesToCharsMunge( text2 );
        +		return {
        +			chars1: chars1,
        +			chars2: chars2,
        +			lineArray: lineArray
        +		};
        +	};
        +
        +	/**
        +	 * Rehydrate the text in a diff from a string of line hashes to real lines of
        +	 * text.
        +	 * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
        +	 * @param {!Array.<string>} lineArray Array of unique strings.
        +	 * @private
        +	 */
        +	DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
        +		var x, chars, text, y;
        +		for ( x = 0; x < diffs.length; x++ ) {
        +			chars = diffs[ x ][ 1 ];
        +			text = [];
        +			for ( y = 0; y < chars.length; y++ ) {
        +				text[ y ] = lineArray[ chars.charCodeAt( y ) ];
        +			}
        +			diffs[ x ][ 1 ] = text.join( "" );
        +		}
        +	};
        +
        +	/**
        +	 * Reorder and merge like edit sections.  Merge equalities.
        +	 * Any edit section can move as long as it doesn't cross an equality.
        +	 * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
        +	 */
        +	DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
        +		var pointer, countDelete, countInsert, textInsert, textDelete,
        +			commonlength, changes, diffPointer, position;
        +		diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
        +		pointer = 0;
        +		countDelete = 0;
        +		countInsert = 0;
        +		textDelete = "";
        +		textInsert = "";
        +		commonlength;
        +		while ( pointer < diffs.length ) {
        +			switch ( diffs[ pointer ][ 0 ] ) {
        +			case DIFF_INSERT:
        +				countInsert++;
        +				textInsert += diffs[ pointer ][ 1 ];
        +				pointer++;
        +				break;
        +			case DIFF_DELETE:
        +				countDelete++;
        +				textDelete += diffs[ pointer ][ 1 ];
        +				pointer++;
        +				break;
        +			case DIFF_EQUAL:
        +
        +				// Upon reaching an equality, check for prior redundancies.
        +				if ( countDelete + countInsert > 1 ) {
        +					if ( countDelete !== 0 && countInsert !== 0 ) {
        +
        +						// Factor out any common prefixes.
        +						commonlength = this.diffCommonPrefix( textInsert, textDelete );
        +						if ( commonlength !== 0 ) {
        +							if ( ( pointer - countDelete - countInsert ) > 0 &&
        +									diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
        +									DIFF_EQUAL ) {
        +								diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
        +									textInsert.substring( 0, commonlength );
        +							} else {
        +								diffs.splice( 0, 0, [ DIFF_EQUAL,
        +									textInsert.substring( 0, commonlength )
        +								] );
        +								pointer++;
        +							}
        +							textInsert = textInsert.substring( commonlength );
        +							textDelete = textDelete.substring( commonlength );
        +						}
        +
        +						// Factor out any common suffixies.
        +						commonlength = this.diffCommonSuffix( textInsert, textDelete );
        +						if ( commonlength !== 0 ) {
        +							diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
        +									commonlength ) + diffs[ pointer ][ 1 ];
        +							textInsert = textInsert.substring( 0, textInsert.length -
        +								commonlength );
        +							textDelete = textDelete.substring( 0, textDelete.length -
        +								commonlength );
        +						}
        +					}
        +
        +					// Delete the offending records and add the merged ones.
        +					if ( countDelete === 0 ) {
        +						diffs.splice( pointer - countInsert,
        +							countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
        +					} else if ( countInsert === 0 ) {
        +						diffs.splice( pointer - countDelete,
        +							countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
        +					} else {
        +						diffs.splice(
        +							pointer - countDelete - countInsert,
        +							countDelete + countInsert,
        +							[ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
        +						);
        +					}
        +					pointer = pointer - countDelete - countInsert +
        +						( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
        +				} else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
        +
        +					// Merge this equality with the previous one.
        +					diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
        +					diffs.splice( pointer, 1 );
        +				} else {
        +					pointer++;
        +				}
        +				countInsert = 0;
        +				countDelete = 0;
        +				textDelete = "";
        +				textInsert = "";
        +				break;
        +			}
        +		}
        +		if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
        +			diffs.pop(); // Remove the dummy entry at the end.
        +		}
        +
        +		// Second pass: look for single edits surrounded on both sides by equalities
        +		// which can be shifted sideways to eliminate an equality.
        +		// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
        +		changes = false;
        +		pointer = 1;
        +
        +		// Intentionally ignore the first and last element (don't need checking).
        +		while ( pointer < diffs.length - 1 ) {
        +			if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
        +					diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
        +
        +				diffPointer = diffs[ pointer ][ 1 ];
        +				position = diffPointer.substring(
        +					diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
        +				);
        +
        +				// This is a single edit surrounded by equalities.
        +				if ( position === diffs[ pointer - 1 ][ 1 ] ) {
        +
        +					// Shift the edit over the previous equality.
        +					diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
        +						diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
        +							diffs[ pointer - 1 ][ 1 ].length );
        +					diffs[ pointer + 1 ][ 1 ] =
        +						diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
        +					diffs.splice( pointer - 1, 1 );
        +					changes = true;
        +				} else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
        +						diffs[ pointer + 1 ][ 1 ] ) {
        +
        +					// Shift the edit over the next equality.
        +					diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
        +					diffs[ pointer ][ 1 ] =
        +						diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
        +						diffs[ pointer + 1 ][ 1 ];
        +					diffs.splice( pointer + 1, 1 );
        +					changes = true;
        +				}
        +			}
        +			pointer++;
        +		}
        +
        +		// If shifts were made, the diff needs reordering and another shift sweep.
        +		if ( changes ) {
        +			this.diffCleanupMerge( diffs );
        +		}
        +	};
        +
        +	return function( o, n ) {
        +		var diff, output, text;
        +		diff = new DiffMatchPatch();
        +		output = diff.DiffMain( o, n );
        +		diff.diffCleanupEfficiency( output );
        +		text = diff.diffPrettyHtml( output );
        +
        +		return text;
        +	};
        +}() );
        +
        +}() );
        diff --git a/bower_components/select2/vendor/jquery-2.1.0.js b/bower_components/select2/vendor/jquery-2.1.0.js
        new file mode 100644
        index 0000000000..d405ae7b22
        --- /dev/null
        +++ b/bower_components/select2/vendor/jquery-2.1.0.js
        @@ -0,0 +1,9111 @@
        +/*!
        + * jQuery JavaScript Library v2.1.0
        + * http://jquery.com/
        + *
        + * Includes Sizzle.js
        + * http://sizzlejs.com/
        + *
        + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + *
        + * Date: 2014-01-23T21:10Z
        + */
        +
        +(function( global, factory ) {
        +
        +    if ( typeof module === "object" && typeof module.exports === "object" ) {
        +        // For CommonJS and CommonJS-like environments where a proper window is present,
        +        // execute the factory and get jQuery
        +        // For environments that do not inherently posses a window with a document
        +        // (such as Node.js), expose a jQuery-making factory as module.exports
        +        // This accentuates the need for the creation of a real window
        +        // e.g. var jQuery = require("jquery")(window);
        +        // See ticket #14549 for more info
        +        module.exports = global.document ?
        +            factory( global, true ) :
        +            function( w ) {
        +                if ( !w.document ) {
        +                    throw new Error( "jQuery requires a window with a document" );
        +                }
        +                return factory( w );
        +            };
        +    } else {
        +        factory( global );
        +    }
        +
        +// Pass this if window is not defined yet
        +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
        +
        +// Can't do this because several apps including ASP.NET trace
        +// the stack via arguments.caller.callee and Firefox dies if
        +// you try to trace through "use strict" call chains. (#13335)
        +// Support: Firefox 18+
        +//
        +
        +    var arr = [];
        +
        +    var slice = arr.slice;
        +
        +    var concat = arr.concat;
        +
        +    var push = arr.push;
        +
        +    var indexOf = arr.indexOf;
        +
        +    var class2type = {};
        +
        +    var toString = class2type.toString;
        +
        +    var hasOwn = class2type.hasOwnProperty;
        +
        +    var trim = "".trim;
        +
        +    var support = {};
        +
        +
        +
        +    var
        +    // Use the correct document accordingly with window argument (sandbox)
        +        document = window.document,
        +
        +        version = "2.1.0",
        +
        +    // Define a local copy of jQuery
        +        jQuery = function( selector, context ) {
        +            // The jQuery object is actually just the init constructor 'enhanced'
        +            // Need init if jQuery is called (just allow error to be thrown if not included)
        +            return new jQuery.fn.init( selector, context );
        +        },
        +
        +    // Matches dashed string for camelizing
        +        rmsPrefix = /^-ms-/,
        +        rdashAlpha = /-([\da-z])/gi,
        +
        +    // Used by jQuery.camelCase as callback to replace()
        +        fcamelCase = function( all, letter ) {
        +            return letter.toUpperCase();
        +        };
        +
        +    jQuery.fn = jQuery.prototype = {
        +        // The current version of jQuery being used
        +        jquery: version,
        +
        +        constructor: jQuery,
        +
        +        // Start with an empty selector
        +        selector: "",
        +
        +        // The default length of a jQuery object is 0
        +        length: 0,
        +
        +        toArray: function() {
        +            return slice.call( this );
        +        },
        +
        +        // Get the Nth element in the matched element set OR
        +        // Get the whole matched element set as a clean array
        +        get: function( num ) {
        +            return num != null ?
        +
        +                // Return a 'clean' array
        +                ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
        +
        +                // Return just the object
        +                slice.call( this );
        +        },
        +
        +        // Take an array of elements and push it onto the stack
        +        // (returning the new matched element set)
        +        pushStack: function( elems ) {
        +
        +            // Build a new jQuery matched element set
        +            var ret = jQuery.merge( this.constructor(), elems );
        +
        +            // Add the old object onto the stack (as a reference)
        +            ret.prevObject = this;
        +            ret.context = this.context;
        +
        +            // Return the newly-formed element set
        +            return ret;
        +        },
        +
        +        // Execute a callback for every element in the matched set.
        +        // (You can seed the arguments with an array of args, but this is
        +        // only used internally.)
        +        each: function( callback, args ) {
        +            return jQuery.each( this, callback, args );
        +        },
        +
        +        map: function( callback ) {
        +            return this.pushStack( jQuery.map(this, function( elem, i ) {
        +                return callback.call( elem, i, elem );
        +            }));
        +        },
        +
        +        slice: function() {
        +            return this.pushStack( slice.apply( this, arguments ) );
        +        },
        +
        +        first: function() {
        +            return this.eq( 0 );
        +        },
        +
        +        last: function() {
        +            return this.eq( -1 );
        +        },
        +
        +        eq: function( i ) {
        +            var len = this.length,
        +                j = +i + ( i < 0 ? len : 0 );
        +            return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
        +        },
        +
        +        end: function() {
        +            return this.prevObject || this.constructor(null);
        +        },
        +
        +        // For internal use only.
        +        // Behaves like an Array's method, not like a jQuery method.
        +        push: push,
        +        sort: arr.sort,
        +        splice: arr.splice
        +    };
        +
        +    jQuery.extend = jQuery.fn.extend = function() {
        +        var options, name, src, copy, copyIsArray, clone,
        +            target = arguments[0] || {},
        +            i = 1,
        +            length = arguments.length,
        +            deep = false;
        +
        +        // Handle a deep copy situation
        +        if ( typeof target === "boolean" ) {
        +            deep = target;
        +
        +            // skip the boolean and the target
        +            target = arguments[ i ] || {};
        +            i++;
        +        }
        +
        +        // Handle case when target is a string or something (possible in deep copy)
        +        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
        +            target = {};
        +        }
        +
        +        // extend jQuery itself if only one argument is passed
        +        if ( i === length ) {
        +            target = this;
        +            i--;
        +        }
        +
        +        for ( ; i < length; i++ ) {
        +            // Only deal with non-null/undefined values
        +            if ( (options = arguments[ i ]) != null ) {
        +                // Extend the base object
        +                for ( name in options ) {
        +                    src = target[ name ];
        +                    copy = options[ name ];
        +
        +                    // Prevent never-ending loop
        +                    if ( target === copy ) {
        +                        continue;
        +                    }
        +
        +                    // Recurse if we're merging plain objects or arrays
        +                    if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
        +                        if ( copyIsArray ) {
        +                            copyIsArray = false;
        +                            clone = src && jQuery.isArray(src) ? src : [];
        +
        +                        } else {
        +                            clone = src && jQuery.isPlainObject(src) ? src : {};
        +                        }
        +
        +                        // Never move original objects, clone them
        +                        target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +                        // Don't bring in undefined values
        +                    } else if ( copy !== undefined ) {
        +                        target[ name ] = copy;
        +                    }
        +                }
        +            }
        +        }
        +
        +        // Return the modified object
        +        return target;
        +    };
        +
        +    jQuery.extend({
        +        // Unique for each copy of jQuery on the page
        +        expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
        +
        +        // Assume jQuery is ready without the ready module
        +        isReady: true,
        +
        +        error: function( msg ) {
        +            throw new Error( msg );
        +        },
        +
        +        noop: function() {},
        +
        +        // See test/unit/core.js for details concerning isFunction.
        +        // Since version 1.3, DOM methods and functions like alert
        +        // aren't supported. They return false on IE (#2968).
        +        isFunction: function( obj ) {
        +            return jQuery.type(obj) === "function";
        +        },
        +
        +        isArray: Array.isArray,
        +
        +        isWindow: function( obj ) {
        +            return obj != null && obj === obj.window;
        +        },
        +
        +        isNumeric: function( obj ) {
        +            // parseFloat NaNs numeric-cast false positives (null|true|false|"")
        +            // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
        +            // subtraction forces infinities to NaN
        +            return obj - parseFloat( obj ) >= 0;
        +        },
        +
        +        isPlainObject: function( obj ) {
        +            // Not plain objects:
        +            // - Any object or value whose internal [[Class]] property is not "[object Object]"
        +            // - DOM nodes
        +            // - window
        +            if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
        +                return false;
        +            }
        +
        +            // Support: Firefox <20
        +            // The try/catch suppresses exceptions thrown when attempting to access
        +            // the "constructor" property of certain host objects, ie. |window.location|
        +            // https://bugzilla.mozilla.org/show_bug.cgi?id=814622
        +            try {
        +                if ( obj.constructor &&
        +                    !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
        +                    return false;
        +                }
        +            } catch ( e ) {
        +                return false;
        +            }
        +
        +            // If the function hasn't returned already, we're confident that
        +            // |obj| is a plain object, created by {} or constructed with new Object
        +            return true;
        +        },
        +
        +        isEmptyObject: function( obj ) {
        +            var name;
        +            for ( name in obj ) {
        +                return false;
        +            }
        +            return true;
        +        },
        +
        +        type: function( obj ) {
        +            if ( obj == null ) {
        +                return obj + "";
        +            }
        +            // Support: Android < 4.0, iOS < 6 (functionish RegExp)
        +            return typeof obj === "object" || typeof obj === "function" ?
        +                class2type[ toString.call(obj) ] || "object" :
        +                typeof obj;
        +        },
        +
        +        // Evaluates a script in a global context
        +        globalEval: function( code ) {
        +            var script,
        +                indirect = eval;
        +
        +            code = jQuery.trim( code );
        +
        +            if ( code ) {
        +                // If the code includes a valid, prologue position
        +                // strict mode pragma, execute code by injecting a
        +                // script tag into the document.
        +                if ( code.indexOf("use strict") === 1 ) {
        +                    script = document.createElement("script");
        +                    script.text = code;
        +                    document.head.appendChild( script ).parentNode.removeChild( script );
        +                } else {
        +                    // Otherwise, avoid the DOM node creation, insertion
        +                    // and removal by using an indirect global eval
        +                    indirect( code );
        +                }
        +            }
        +        },
        +
        +        // Convert dashed to camelCase; used by the css and data modules
        +        // Microsoft forgot to hump their vendor prefix (#9572)
        +        camelCase: function( string ) {
        +            return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +        },
        +
        +        nodeName: function( elem, name ) {
        +            return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        +        },
        +
        +        // args is for internal usage only
        +        each: function( obj, callback, args ) {
        +            var value,
        +                i = 0,
        +                length = obj.length,
        +                isArray = isArraylike( obj );
        +
        +            if ( args ) {
        +                if ( isArray ) {
        +                    for ( ; i < length; i++ ) {
        +                        value = callback.apply( obj[ i ], args );
        +
        +                        if ( value === false ) {
        +                            break;
        +                        }
        +                    }
        +                } else {
        +                    for ( i in obj ) {
        +                        value = callback.apply( obj[ i ], args );
        +
        +                        if ( value === false ) {
        +                            break;
        +                        }
        +                    }
        +                }
        +
        +                // A special, fast, case for the most common use of each
        +            } else {
        +                if ( isArray ) {
        +                    for ( ; i < length; i++ ) {
        +                        value = callback.call( obj[ i ], i, obj[ i ] );
        +
        +                        if ( value === false ) {
        +                            break;
        +                        }
        +                    }
        +                } else {
        +                    for ( i in obj ) {
        +                        value = callback.call( obj[ i ], i, obj[ i ] );
        +
        +                        if ( value === false ) {
        +                            break;
        +                        }
        +                    }
        +                }
        +            }
        +
        +            return obj;
        +        },
        +
        +        trim: function( text ) {
        +            return text == null ? "" : trim.call( text );
        +        },
        +
        +        // results is for internal usage only
        +        makeArray: function( arr, results ) {
        +            var ret = results || [];
        +
        +            if ( arr != null ) {
        +                if ( isArraylike( Object(arr) ) ) {
        +                    jQuery.merge( ret,
        +                        typeof arr === "string" ?
        +                            [ arr ] : arr
        +                    );
        +                } else {
        +                    push.call( ret, arr );
        +                }
        +            }
        +
        +            return ret;
        +        },
        +
        +        inArray: function( elem, arr, i ) {
        +            return arr == null ? -1 : indexOf.call( arr, elem, i );
        +        },
        +
        +        merge: function( first, second ) {
        +            var len = +second.length,
        +                j = 0,
        +                i = first.length;
        +
        +            for ( ; j < len; j++ ) {
        +                first[ i++ ] = second[ j ];
        +            }
        +
        +            first.length = i;
        +
        +            return first;
        +        },
        +
        +        grep: function( elems, callback, invert ) {
        +            var callbackInverse,
        +                matches = [],
        +                i = 0,
        +                length = elems.length,
        +                callbackExpect = !invert;
        +
        +            // Go through the array, only saving the items
        +            // that pass the validator function
        +            for ( ; i < length; i++ ) {
        +                callbackInverse = !callback( elems[ i ], i );
        +                if ( callbackInverse !== callbackExpect ) {
        +                    matches.push( elems[ i ] );
        +                }
        +            }
        +
        +            return matches;
        +        },
        +
        +        // arg is for internal usage only
        +        map: function( elems, callback, arg ) {
        +            var value,
        +                i = 0,
        +                length = elems.length,
        +                isArray = isArraylike( elems ),
        +                ret = [];
        +
        +            // Go through the array, translating each of the items to their new values
        +            if ( isArray ) {
        +                for ( ; i < length; i++ ) {
        +                    value = callback( elems[ i ], i, arg );
        +
        +                    if ( value != null ) {
        +                        ret.push( value );
        +                    }
        +                }
        +
        +                // Go through every key on the object,
        +            } else {
        +                for ( i in elems ) {
        +                    value = callback( elems[ i ], i, arg );
        +
        +                    if ( value != null ) {
        +                        ret.push( value );
        +                    }
        +                }
        +            }
        +
        +            // Flatten any nested arrays
        +            return concat.apply( [], ret );
        +        },
        +
        +        // A global GUID counter for objects
        +        guid: 1,
        +
        +        // Bind a function to a context, optionally partially applying any
        +        // arguments.
        +        proxy: function( fn, context ) {
        +            var tmp, args, proxy;
        +
        +            if ( typeof context === "string" ) {
        +                tmp = fn[ context ];
        +                context = fn;
        +                fn = tmp;
        +            }
        +
        +            // Quick check to determine if target is callable, in the spec
        +            // this throws a TypeError, but we will just return undefined.
        +            if ( !jQuery.isFunction( fn ) ) {
        +                return undefined;
        +            }
        +
        +            // Simulated bind
        +            args = slice.call( arguments, 2 );
        +            proxy = function() {
        +                return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
        +            };
        +
        +            // Set the guid of unique handler to the same of original handler, so it can be removed
        +            proxy.guid = fn.guid = fn.guid || jQuery.guid++;
        +
        +            return proxy;
        +        },
        +
        +        now: Date.now,
        +
        +        // jQuery.support is not used in Core but other projects attach their
        +        // properties to it so it needs to exist.
        +        support: support
        +    });
        +
        +// Populate the class2type map
        +    jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
        +        class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +    });
        +
        +    function isArraylike( obj ) {
        +        var length = obj.length,
        +            type = jQuery.type( obj );
        +
        +        if ( type === "function" || jQuery.isWindow( obj ) ) {
        +            return false;
        +        }
        +
        +        if ( obj.nodeType === 1 && length ) {
        +            return true;
        +        }
        +
        +        return type === "array" || length === 0 ||
        +            typeof length === "number" && length > 0 && ( length - 1 ) in obj;
        +    }
        +    var Sizzle =
        +        /*!
        +         * Sizzle CSS Selector Engine v1.10.16
        +         * http://sizzlejs.com/
        +         *
        +         * Copyright 2013 jQuery Foundation, Inc. and other contributors
        +         * Released under the MIT license
        +         * http://jquery.org/license
        +         *
        +         * Date: 2014-01-13
        +         */
        +        (function( window ) {
        +
        +            var i,
        +                support,
        +                Expr,
        +                getText,
        +                isXML,
        +                compile,
        +                outermostContext,
        +                sortInput,
        +                hasDuplicate,
        +
        +            // Local document vars
        +                setDocument,
        +                document,
        +                docElem,
        +                documentIsHTML,
        +                rbuggyQSA,
        +                rbuggyMatches,
        +                matches,
        +                contains,
        +
        +            // Instance-specific data
        +                expando = "sizzle" + -(new Date()),
        +                preferredDoc = window.document,
        +                dirruns = 0,
        +                done = 0,
        +                classCache = createCache(),
        +                tokenCache = createCache(),
        +                compilerCache = createCache(),
        +                sortOrder = function( a, b ) {
        +                    if ( a === b ) {
        +                        hasDuplicate = true;
        +                    }
        +                    return 0;
        +                },
        +
        +            // General-purpose constants
        +                strundefined = typeof undefined,
        +                MAX_NEGATIVE = 1 << 31,
        +
        +            // Instance methods
        +                hasOwn = ({}).hasOwnProperty,
        +                arr = [],
        +                pop = arr.pop,
        +                push_native = arr.push,
        +                push = arr.push,
        +                slice = arr.slice,
        +            // Use a stripped-down indexOf if we can't use a native one
        +                indexOf = arr.indexOf || function( elem ) {
        +                    var i = 0,
        +                        len = this.length;
        +                    for ( ; i < len; i++ ) {
        +                        if ( this[i] === elem ) {
        +                            return i;
        +                        }
        +                    }
        +                    return -1;
        +                },
        +
        +                booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
        +
        +            // Regular expressions
        +
        +            // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
        +                whitespace = "[\\x20\\t\\r\\n\\f]",
        +            // http://www.w3.org/TR/css3-syntax/#characters
        +                characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
        +
        +            // Loosely modeled on CSS identifier characters
        +            // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
        +            // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        +                identifier = characterEncoding.replace( "w", "w#" ),
        +
        +            // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
        +                attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
        +                    "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
        +
        +            // Prefer arguments quoted,
        +            //   then not containing pseudos/brackets,
        +            //   then attribute selectors/non-parenthetical expressions,
        +            //   then anything else
        +            // These preferences are here to reduce the number of selectors
        +            //   needing tokenize in the PSEUDO preFilter
        +                pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
        +
        +            // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
        +                rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
        +
        +                rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
        +                rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
        +
        +                rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
        +
        +                rpseudo = new RegExp( pseudos ),
        +                ridentifier = new RegExp( "^" + identifier + "$" ),
        +
        +                matchExpr = {
        +                    "ID": new RegExp( "^#(" + characterEncoding + ")" ),
        +                    "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
        +                    "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
        +                    "ATTR": new RegExp( "^" + attributes ),
        +                    "PSEUDO": new RegExp( "^" + pseudos ),
        +                    "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
        +                        "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
        +                        "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
        +                    "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
        +                    // For use in libraries implementing .is()
        +                    // We use this for POS matching in `select`
        +                    "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
        +                        whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
        +                },
        +
        +                rinputs = /^(?:input|select|textarea|button)$/i,
        +                rheader = /^h\d$/i,
        +
        +                rnative = /^[^{]+\{\s*\[native \w/,
        +
        +            // Easily-parseable/retrievable ID or TAG or CLASS selectors
        +                rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
        +
        +                rsibling = /[+~]/,
        +                rescape = /'|\\/g,
        +
        +            // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
        +                runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
        +                funescape = function( _, escaped, escapedWhitespace ) {
        +                    var high = "0x" + escaped - 0x10000;
        +                    // NaN means non-codepoint
        +                    // Support: Firefox
        +                    // Workaround erroneous numeric interpretation of +"0x"
        +                    return high !== high || escapedWhitespace ?
        +                        escaped :
        +                        high < 0 ?
        +                            // BMP codepoint
        +                            String.fromCharCode( high + 0x10000 ) :
        +                            // Supplemental Plane codepoint (surrogate pair)
        +                            String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
        +                };
        +
        +// Optimize for push.apply( _, NodeList )
        +            try {
        +                push.apply(
        +                    (arr = slice.call( preferredDoc.childNodes )),
        +                    preferredDoc.childNodes
        +                );
        +                // Support: Android<4.0
        +                // Detect silently failing push.apply
        +                arr[ preferredDoc.childNodes.length ].nodeType;
        +            } catch ( e ) {
        +                push = { apply: arr.length ?
        +
        +                    // Leverage slice if possible
        +                    function( target, els ) {
        +                        push_native.apply( target, slice.call(els) );
        +                    } :
        +
        +                    // Support: IE<9
        +                    // Otherwise append directly
        +                    function( target, els ) {
        +                        var j = target.length,
        +                            i = 0;
        +                        // Can't trust NodeList.length
        +                        while ( (target[j++] = els[i++]) ) {}
        +                        target.length = j - 1;
        +                    }
        +                };
        +            }
        +
        +            function Sizzle( selector, context, results, seed ) {
        +                var match, elem, m, nodeType,
        +                // QSA vars
        +                    i, groups, old, nid, newContext, newSelector;
        +
        +                if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
        +                    setDocument( context );
        +                }
        +
        +                context = context || document;
        +                results = results || [];
        +
        +                if ( !selector || typeof selector !== "string" ) {
        +                    return results;
        +                }
        +
        +                if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
        +                    return [];
        +                }
        +
        +                if ( documentIsHTML && !seed ) {
        +
        +                    // Shortcuts
        +                    if ( (match = rquickExpr.exec( selector )) ) {
        +                        // Speed-up: Sizzle("#ID")
        +                        if ( (m = match[1]) ) {
        +                            if ( nodeType === 9 ) {
        +                                elem = context.getElementById( m );
        +                                // Check parentNode to catch when Blackberry 4.6 returns
        +                                // nodes that are no longer in the document (jQuery #6963)
        +                                if ( elem && elem.parentNode ) {
        +                                    // Handle the case where IE, Opera, and Webkit return items
        +                                    // by name instead of ID
        +                                    if ( elem.id === m ) {
        +                                        results.push( elem );
        +                                        return results;
        +                                    }
        +                                } else {
        +                                    return results;
        +                                }
        +                            } else {
        +                                // Context is not a document
        +                                if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
        +                                    contains( context, elem ) && elem.id === m ) {
        +                                    results.push( elem );
        +                                    return results;
        +                                }
        +                            }
        +
        +                            // Speed-up: Sizzle("TAG")
        +                        } else if ( match[2] ) {
        +                            push.apply( results, context.getElementsByTagName( selector ) );
        +                            return results;
        +
        +                            // Speed-up: Sizzle(".CLASS")
        +                        } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
        +                            push.apply( results, context.getElementsByClassName( m ) );
        +                            return results;
        +                        }
        +                    }
        +
        +                    // QSA path
        +                    if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
        +                        nid = old = expando;
        +                        newContext = context;
        +                        newSelector = nodeType === 9 && selector;
        +
        +                        // qSA works strangely on Element-rooted queries
        +                        // We can work around this by specifying an extra ID on the root
        +                        // and working up from there (Thanks to Andrew Dupont for the technique)
        +                        // IE 8 doesn't work on object elements
        +                        if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
        +                            groups = tokenize( selector );
        +
        +                            if ( (old = context.getAttribute("id")) ) {
        +                                nid = old.replace( rescape, "\\$&" );
        +                            } else {
        +                                context.setAttribute( "id", nid );
        +                            }
        +                            nid = "[id='" + nid + "'] ";
        +
        +                            i = groups.length;
        +                            while ( i-- ) {
        +                                groups[i] = nid + toSelector( groups[i] );
        +                            }
        +                            newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
        +                            newSelector = groups.join(",");
        +                        }
        +
        +                        if ( newSelector ) {
        +                            try {
        +                                push.apply( results,
        +                                    newContext.querySelectorAll( newSelector )
        +                                );
        +                                return results;
        +                            } catch(qsaError) {
        +                            } finally {
        +                                if ( !old ) {
        +                                    context.removeAttribute("id");
        +                                }
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                // All others
        +                return select( selector.replace( rtrim, "$1" ), context, results, seed );
        +            }
        +
        +            /**
        +             * Create key-value caches of limited size
        +             * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
        +             *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
        +             *	deleting the oldest entry
        +             */
        +            function createCache() {
        +                var keys = [];
        +
        +                function cache( key, value ) {
        +                    // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        +                    if ( keys.push( key + " " ) > Expr.cacheLength ) {
        +                        // Only keep the most recent entries
        +                        delete cache[ keys.shift() ];
        +                    }
        +                    return (cache[ key + " " ] = value);
        +                }
        +                return cache;
        +            }
        +
        +            /**
        +             * Mark a function for special use by Sizzle
        +             * @param {Function} fn The function to mark
        +             */
        +            function markFunction( fn ) {
        +                fn[ expando ] = true;
        +                return fn;
        +            }
        +
        +            /**
        +             * Support testing using an element
        +             * @param {Function} fn Passed the created div and expects a boolean result
        +             */
        +            function assert( fn ) {
        +                var div = document.createElement("div");
        +
        +                try {
        +                    return !!fn( div );
        +                } catch (e) {
        +                    return false;
        +                } finally {
        +                    // Remove from its parent by default
        +                    if ( div.parentNode ) {
        +                        div.parentNode.removeChild( div );
        +                    }
        +                    // release memory in IE
        +                    div = null;
        +                }
        +            }
        +
        +            /**
        +             * Adds the same handler for all of the specified attrs
        +             * @param {String} attrs Pipe-separated list of attributes
        +             * @param {Function} handler The method that will be applied
        +             */
        +            function addHandle( attrs, handler ) {
        +                var arr = attrs.split("|"),
        +                    i = attrs.length;
        +
        +                while ( i-- ) {
        +                    Expr.attrHandle[ arr[i] ] = handler;
        +                }
        +            }
        +
        +            /**
        +             * Checks document order of two siblings
        +             * @param {Element} a
        +             * @param {Element} b
        +             * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
        +             */
        +            function siblingCheck( a, b ) {
        +                var cur = b && a,
        +                    diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
        +                        ( ~b.sourceIndex || MAX_NEGATIVE ) -
        +                            ( ~a.sourceIndex || MAX_NEGATIVE );
        +
        +                // Use IE sourceIndex if available on both nodes
        +                if ( diff ) {
        +                    return diff;
        +                }
        +
        +                // Check if b follows a
        +                if ( cur ) {
        +                    while ( (cur = cur.nextSibling) ) {
        +                        if ( cur === b ) {
        +                            return -1;
        +                        }
        +                    }
        +                }
        +
        +                return a ? 1 : -1;
        +            }
        +
        +            /**
        +             * Returns a function to use in pseudos for input types
        +             * @param {String} type
        +             */
        +            function createInputPseudo( type ) {
        +                return function( elem ) {
        +                    var name = elem.nodeName.toLowerCase();
        +                    return name === "input" && elem.type === type;
        +                };
        +            }
        +
        +            /**
        +             * Returns a function to use in pseudos for buttons
        +             * @param {String} type
        +             */
        +            function createButtonPseudo( type ) {
        +                return function( elem ) {
        +                    var name = elem.nodeName.toLowerCase();
        +                    return (name === "input" || name === "button") && elem.type === type;
        +                };
        +            }
        +
        +            /**
        +             * Returns a function to use in pseudos for positionals
        +             * @param {Function} fn
        +             */
        +            function createPositionalPseudo( fn ) {
        +                return markFunction(function( argument ) {
        +                    argument = +argument;
        +                    return markFunction(function( seed, matches ) {
        +                        var j,
        +                            matchIndexes = fn( [], seed.length, argument ),
        +                            i = matchIndexes.length;
        +
        +                        // Match elements found at the specified indexes
        +                        while ( i-- ) {
        +                            if ( seed[ (j = matchIndexes[i]) ] ) {
        +                                seed[j] = !(matches[j] = seed[j]);
        +                            }
        +                        }
        +                    });
        +                });
        +            }
        +
        +            /**
        +             * Checks a node for validity as a Sizzle context
        +             * @param {Element|Object=} context
        +             * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
        +             */
        +            function testContext( context ) {
        +                return context && typeof context.getElementsByTagName !== strundefined && context;
        +            }
        +
        +// Expose support vars for convenience
        +            support = Sizzle.support = {};
        +
        +            /**
        +             * Detects XML nodes
        +             * @param {Element|Object} elem An element or a document
        +             * @returns {Boolean} True iff elem is a non-HTML XML node
        +             */
        +            isXML = Sizzle.isXML = function( elem ) {
        +                // documentElement is verified for cases where it doesn't yet exist
        +                // (such as loading iframes in IE - #4833)
        +                var documentElement = elem && (elem.ownerDocument || elem).documentElement;
        +                return documentElement ? documentElement.nodeName !== "HTML" : false;
        +            };
        +
        +            /**
        +             * Sets document-related variables once based on the current document
        +             * @param {Element|Object} [doc] An element or document object to use to set the document
        +             * @returns {Object} Returns the current document
        +             */
        +            setDocument = Sizzle.setDocument = function( node ) {
        +                var hasCompare,
        +                    doc = node ? node.ownerDocument || node : preferredDoc,
        +                    parent = doc.defaultView;
        +
        +                // If no document and documentElement is available, return
        +                if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
        +                    return document;
        +                }
        +
        +                // Set our document
        +                document = doc;
        +                docElem = doc.documentElement;
        +
        +                // Support tests
        +                documentIsHTML = !isXML( doc );
        +
        +                // Support: IE>8
        +                // If iframe document is assigned to "document" variable and if iframe has been reloaded,
        +                // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
        +                // IE6-8 do not support the defaultView property so parent will be undefined
        +                if ( parent && parent !== parent.top ) {
        +                    // IE11 does not have attachEvent, so all must suffer
        +                    if ( parent.addEventListener ) {
        +                        parent.addEventListener( "unload", function() {
        +                            setDocument();
        +                        }, false );
        +                    } else if ( parent.attachEvent ) {
        +                        parent.attachEvent( "onunload", function() {
        +                            setDocument();
        +                        });
        +                    }
        +                }
        +
        +                /* Attributes
        +                 ---------------------------------------------------------------------- */
        +
        +                // Support: IE<8
        +                // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
        +                support.attributes = assert(function( div ) {
        +                    div.className = "i";
        +                    return !div.getAttribute("className");
        +                });
        +
        +                /* getElement(s)By*
        +                 ---------------------------------------------------------------------- */
        +
        +                // Check if getElementsByTagName("*") returns only elements
        +                support.getElementsByTagName = assert(function( div ) {
        +                    div.appendChild( doc.createComment("") );
        +                    return !div.getElementsByTagName("*").length;
        +                });
        +
        +                // Check if getElementsByClassName can be trusted
        +                support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
        +                    div.innerHTML = "<div class='a'></div><div class='a i'></div>";
        +
        +                    // Support: Safari<4
        +                    // Catch class over-caching
        +                    div.firstChild.className = "i";
        +                    // Support: Opera<10
        +                    // Catch gEBCN failure to find non-leading classes
        +                    return div.getElementsByClassName("i").length === 2;
        +                });
        +
        +                // Support: IE<10
        +                // Check if getElementById returns elements by name
        +                // The broken getElementById methods don't pick up programatically-set names,
        +                // so use a roundabout getElementsByName test
        +                support.getById = assert(function( div ) {
        +                    docElem.appendChild( div ).id = expando;
        +                    return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
        +                });
        +
        +                // ID find and filter
        +                if ( support.getById ) {
        +                    Expr.find["ID"] = function( id, context ) {
        +                        if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
        +                            var m = context.getElementById( id );
        +                            // Check parentNode to catch when Blackberry 4.6 returns
        +                            // nodes that are no longer in the document #6963
        +                            return m && m.parentNode ? [m] : [];
        +                        }
        +                    };
        +                    Expr.filter["ID"] = function( id ) {
        +                        var attrId = id.replace( runescape, funescape );
        +                        return function( elem ) {
        +                            return elem.getAttribute("id") === attrId;
        +                        };
        +                    };
        +                } else {
        +                    // Support: IE6/7
        +                    // getElementById is not reliable as a find shortcut
        +                    delete Expr.find["ID"];
        +
        +                    Expr.filter["ID"] =  function( id ) {
        +                        var attrId = id.replace( runescape, funescape );
        +                        return function( elem ) {
        +                            var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
        +                            return node && node.value === attrId;
        +                        };
        +                    };
        +                }
        +
        +                // Tag
        +                Expr.find["TAG"] = support.getElementsByTagName ?
        +                    function( tag, context ) {
        +                        if ( typeof context.getElementsByTagName !== strundefined ) {
        +                            return context.getElementsByTagName( tag );
        +                        }
        +                    } :
        +                    function( tag, context ) {
        +                        var elem,
        +                            tmp = [],
        +                            i = 0,
        +                            results = context.getElementsByTagName( tag );
        +
        +                        // Filter out possible comments
        +                        if ( tag === "*" ) {
        +                            while ( (elem = results[i++]) ) {
        +                                if ( elem.nodeType === 1 ) {
        +                                    tmp.push( elem );
        +                                }
        +                            }
        +
        +                            return tmp;
        +                        }
        +                        return results;
        +                    };
        +
        +                // Class
        +                Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
        +                    if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
        +                        return context.getElementsByClassName( className );
        +                    }
        +                };
        +
        +                /* QSA/matchesSelector
        +                 ---------------------------------------------------------------------- */
        +
        +                // QSA and matchesSelector support
        +
        +                // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
        +                rbuggyMatches = [];
        +
        +                // qSa(:focus) reports false when true (Chrome 21)
        +                // We allow this because of a bug in IE8/9 that throws an error
        +                // whenever `document.activeElement` is accessed on an iframe
        +                // So, we allow :focus to pass through QSA all the time to avoid the IE error
        +                // See http://bugs.jquery.com/ticket/13378
        +                rbuggyQSA = [];
        +
        +                if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
        +                    // Build QSA regex
        +                    // Regex strategy adopted from Diego Perini
        +                    assert(function( div ) {
        +                        // Select is set to empty string on purpose
        +                        // This is to test IE's treatment of not explicitly
        +                        // setting a boolean content attribute,
        +                        // since its presence should be enough
        +                        // http://bugs.jquery.com/ticket/12359
        +                        div.innerHTML = "<select t=''><option selected=''></option></select>";
        +
        +                        // Support: IE8, Opera 10-12
        +                        // Nothing should be selected when empty strings follow ^= or $= or *=
        +                        if ( div.querySelectorAll("[t^='']").length ) {
        +                            rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
        +                        }
        +
        +                        // Support: IE8
        +                        // Boolean attributes and "value" are not treated correctly
        +                        if ( !div.querySelectorAll("[selected]").length ) {
        +                            rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
        +                        }
        +
        +                        // Webkit/Opera - :checked should return selected option elements
        +                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +                        // IE8 throws error here and will not see later tests
        +                        if ( !div.querySelectorAll(":checked").length ) {
        +                            rbuggyQSA.push(":checked");
        +                        }
        +                    });
        +
        +                    assert(function( div ) {
        +                        // Support: Windows 8 Native Apps
        +                        // The type and name attributes are restricted during .innerHTML assignment
        +                        var input = doc.createElement("input");
        +                        input.setAttribute( "type", "hidden" );
        +                        div.appendChild( input ).setAttribute( "name", "D" );
        +
        +                        // Support: IE8
        +                        // Enforce case-sensitivity of name attribute
        +                        if ( div.querySelectorAll("[name=d]").length ) {
        +                            rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
        +                        }
        +
        +                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
        +                        // IE8 throws error here and will not see later tests
        +                        if ( !div.querySelectorAll(":enabled").length ) {
        +                            rbuggyQSA.push( ":enabled", ":disabled" );
        +                        }
        +
        +                        // Opera 10-11 does not throw on post-comma invalid pseudos
        +                        div.querySelectorAll("*,:x");
        +                        rbuggyQSA.push(",.*:");
        +                    });
        +                }
        +
        +                if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
        +                    docElem.mozMatchesSelector ||
        +                    docElem.oMatchesSelector ||
        +                    docElem.msMatchesSelector) )) ) {
        +
        +                    assert(function( div ) {
        +                        // Check to see if it's possible to do matchesSelector
        +                        // on a disconnected node (IE 9)
        +                        support.disconnectedMatch = matches.call( div, "div" );
        +
        +                        // This should fail with an exception
        +                        // Gecko does not error, returns false instead
        +                        matches.call( div, "[s!='']:x" );
        +                        rbuggyMatches.push( "!=", pseudos );
        +                    });
        +                }
        +
        +                rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
        +                rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
        +
        +                /* Contains
        +                 ---------------------------------------------------------------------- */
        +                hasCompare = rnative.test( docElem.compareDocumentPosition );
        +
        +                // Element contains another
        +                // Purposefully does not implement inclusive descendent
        +                // As in, an element does not contain itself
        +                contains = hasCompare || rnative.test( docElem.contains ) ?
        +                    function( a, b ) {
        +                        var adown = a.nodeType === 9 ? a.documentElement : a,
        +                            bup = b && b.parentNode;
        +                        return a === bup || !!( bup && bup.nodeType === 1 && (
        +                            adown.contains ?
        +                                adown.contains( bup ) :
        +                                a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
        +                            ));
        +                    } :
        +                    function( a, b ) {
        +                        if ( b ) {
        +                            while ( (b = b.parentNode) ) {
        +                                if ( b === a ) {
        +                                    return true;
        +                                }
        +                            }
        +                        }
        +                        return false;
        +                    };
        +
        +                /* Sorting
        +                 ---------------------------------------------------------------------- */
        +
        +                // Document order sorting
        +                sortOrder = hasCompare ?
        +                    function( a, b ) {
        +
        +                        // Flag for duplicate removal
        +                        if ( a === b ) {
        +                            hasDuplicate = true;
        +                            return 0;
        +                        }
        +
        +                        // Sort on method existence if only one input has compareDocumentPosition
        +                        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
        +                        if ( compare ) {
        +                            return compare;
        +                        }
        +
        +                        // Calculate position if both inputs belong to the same document
        +                        compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
        +                            a.compareDocumentPosition( b ) :
        +
        +                            // Otherwise we know they are disconnected
        +                            1;
        +
        +                        // Disconnected nodes
        +                        if ( compare & 1 ||
        +                            (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
        +
        +                            // Choose the first element that is related to our preferred document
        +                            if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
        +                                return -1;
        +                            }
        +                            if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
        +                                return 1;
        +                            }
        +
        +                            // Maintain original order
        +                            return sortInput ?
        +                                ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
        +                                0;
        +                        }
        +
        +                        return compare & 4 ? -1 : 1;
        +                    } :
        +                    function( a, b ) {
        +                        // Exit early if the nodes are identical
        +                        if ( a === b ) {
        +                            hasDuplicate = true;
        +                            return 0;
        +                        }
        +
        +                        var cur,
        +                            i = 0,
        +                            aup = a.parentNode,
        +                            bup = b.parentNode,
        +                            ap = [ a ],
        +                            bp = [ b ];
        +
        +                        // Parentless nodes are either documents or disconnected
        +                        if ( !aup || !bup ) {
        +                            return a === doc ? -1 :
        +                                b === doc ? 1 :
        +                                    aup ? -1 :
        +                                        bup ? 1 :
        +                                            sortInput ?
        +                                                ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
        +                                                0;
        +
        +                            // If the nodes are siblings, we can do a quick check
        +                        } else if ( aup === bup ) {
        +                            return siblingCheck( a, b );
        +                        }
        +
        +                        // Otherwise we need full lists of their ancestors for comparison
        +                        cur = a;
        +                        while ( (cur = cur.parentNode) ) {
        +                            ap.unshift( cur );
        +                        }
        +                        cur = b;
        +                        while ( (cur = cur.parentNode) ) {
        +                            bp.unshift( cur );
        +                        }
        +
        +                        // Walk down the tree looking for a discrepancy
        +                        while ( ap[i] === bp[i] ) {
        +                            i++;
        +                        }
        +
        +                        return i ?
        +                            // Do a sibling check if the nodes have a common ancestor
        +                            siblingCheck( ap[i], bp[i] ) :
        +
        +                            // Otherwise nodes in our document sort first
        +                            ap[i] === preferredDoc ? -1 :
        +                                bp[i] === preferredDoc ? 1 :
        +                                    0;
        +                    };
        +
        +                return doc;
        +            };
        +
        +            Sizzle.matches = function( expr, elements ) {
        +                return Sizzle( expr, null, null, elements );
        +            };
        +
        +            Sizzle.matchesSelector = function( elem, expr ) {
        +                // Set document vars if needed
        +                if ( ( elem.ownerDocument || elem ) !== document ) {
        +                    setDocument( elem );
        +                }
        +
        +                // Make sure that attribute selectors are quoted
        +                expr = expr.replace( rattributeQuotes, "='$1']" );
        +
        +                if ( support.matchesSelector && documentIsHTML &&
        +                    ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
        +                    ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
        +
        +                    try {
        +                        var ret = matches.call( elem, expr );
        +
        +                        // IE 9's matchesSelector returns false on disconnected nodes
        +                        if ( ret || support.disconnectedMatch ||
        +                            // As well, disconnected nodes are said to be in a document
        +                            // fragment in IE 9
        +                            elem.document && elem.document.nodeType !== 11 ) {
        +                            return ret;
        +                        }
        +                    } catch(e) {}
        +                }
        +
        +                return Sizzle( expr, document, null, [elem] ).length > 0;
        +            };
        +
        +            Sizzle.contains = function( context, elem ) {
        +                // Set document vars if needed
        +                if ( ( context.ownerDocument || context ) !== document ) {
        +                    setDocument( context );
        +                }
        +                return contains( context, elem );
        +            };
        +
        +            Sizzle.attr = function( elem, name ) {
        +                // Set document vars if needed
        +                if ( ( elem.ownerDocument || elem ) !== document ) {
        +                    setDocument( elem );
        +                }
        +
        +                var fn = Expr.attrHandle[ name.toLowerCase() ],
        +                // Don't get fooled by Object.prototype properties (jQuery #13807)
        +                    val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
        +                        fn( elem, name, !documentIsHTML ) :
        +                        undefined;
        +
        +                return val !== undefined ?
        +                    val :
        +                    support.attributes || !documentIsHTML ?
        +                        elem.getAttribute( name ) :
        +                        (val = elem.getAttributeNode(name)) && val.specified ?
        +                            val.value :
        +                            null;
        +            };
        +
        +            Sizzle.error = function( msg ) {
        +                throw new Error( "Syntax error, unrecognized expression: " + msg );
        +            };
        +
        +            /**
        +             * Document sorting and removing duplicates
        +             * @param {ArrayLike} results
        +             */
        +            Sizzle.uniqueSort = function( results ) {
        +                var elem,
        +                    duplicates = [],
        +                    j = 0,
        +                    i = 0;
        +
        +                // Unless we *know* we can detect duplicates, assume their presence
        +                hasDuplicate = !support.detectDuplicates;
        +                sortInput = !support.sortStable && results.slice( 0 );
        +                results.sort( sortOrder );
        +
        +                if ( hasDuplicate ) {
        +                    while ( (elem = results[i++]) ) {
        +                        if ( elem === results[ i ] ) {
        +                            j = duplicates.push( i );
        +                        }
        +                    }
        +                    while ( j-- ) {
        +                        results.splice( duplicates[ j ], 1 );
        +                    }
        +                }
        +
        +                // Clear input after sorting to release objects
        +                // See https://github.com/jquery/sizzle/pull/225
        +                sortInput = null;
        +
        +                return results;
        +            };
        +
        +            /**
        +             * Utility function for retrieving the text value of an array of DOM nodes
        +             * @param {Array|Element} elem
        +             */
        +            getText = Sizzle.getText = function( elem ) {
        +                var node,
        +                    ret = "",
        +                    i = 0,
        +                    nodeType = elem.nodeType;
        +
        +                if ( !nodeType ) {
        +                    // If no nodeType, this is expected to be an array
        +                    while ( (node = elem[i++]) ) {
        +                        // Do not traverse comment nodes
        +                        ret += getText( node );
        +                    }
        +                } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +                    // Use textContent for elements
        +                    // innerText usage removed for consistency of new lines (jQuery #11153)
        +                    if ( typeof elem.textContent === "string" ) {
        +                        return elem.textContent;
        +                    } else {
        +                        // Traverse its children
        +                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +                            ret += getText( elem );
        +                        }
        +                    }
        +                } else if ( nodeType === 3 || nodeType === 4 ) {
        +                    return elem.nodeValue;
        +                }
        +                // Do not include comment or processing instruction nodes
        +
        +                return ret;
        +            };
        +
        +            Expr = Sizzle.selectors = {
        +
        +                // Can be adjusted by the user
        +                cacheLength: 50,
        +
        +                createPseudo: markFunction,
        +
        +                match: matchExpr,
        +
        +                attrHandle: {},
        +
        +                find: {},
        +
        +                relative: {
        +                    ">": { dir: "parentNode", first: true },
        +                    " ": { dir: "parentNode" },
        +                    "+": { dir: "previousSibling", first: true },
        +                    "~": { dir: "previousSibling" }
        +                },
        +
        +                preFilter: {
        +                    "ATTR": function( match ) {
        +                        match[1] = match[1].replace( runescape, funescape );
        +
        +                        // Move the given value to match[3] whether quoted or unquoted
        +                        match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
        +
        +                        if ( match[2] === "~=" ) {
        +                            match[3] = " " + match[3] + " ";
        +                        }
        +
        +                        return match.slice( 0, 4 );
        +                    },
        +
        +                    "CHILD": function( match ) {
        +                        /* matches from matchExpr["CHILD"]
        +                         1 type (only|nth|...)
        +                         2 what (child|of-type)
        +                         3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
        +                         4 xn-component of xn+y argument ([+-]?\d*n|)
        +                         5 sign of xn-component
        +                         6 x of xn-component
        +                         7 sign of y-component
        +                         8 y of y-component
        +                         */
        +                        match[1] = match[1].toLowerCase();
        +
        +                        if ( match[1].slice( 0, 3 ) === "nth" ) {
        +                            // nth-* requires argument
        +                            if ( !match[3] ) {
        +                                Sizzle.error( match[0] );
        +                            }
        +
        +                            // numeric x and y parameters for Expr.filter.CHILD
        +                            // remember that false/true cast respectively to 0/1
        +                            match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
        +                            match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
        +
        +                            // other types prohibit arguments
        +                        } else if ( match[3] ) {
        +                            Sizzle.error( match[0] );
        +                        }
        +
        +                        return match;
        +                    },
        +
        +                    "PSEUDO": function( match ) {
        +                        var excess,
        +                            unquoted = !match[5] && match[2];
        +
        +                        if ( matchExpr["CHILD"].test( match[0] ) ) {
        +                            return null;
        +                        }
        +
        +                        // Accept quoted arguments as-is
        +                        if ( match[3] && match[4] !== undefined ) {
        +                            match[2] = match[4];
        +
        +                            // Strip excess characters from unquoted arguments
        +                        } else if ( unquoted && rpseudo.test( unquoted ) &&
        +                            // Get excess from tokenize (recursively)
        +                            (excess = tokenize( unquoted, true )) &&
        +                            // advance to the next closing parenthesis
        +                            (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
        +
        +                            // excess is a negative index
        +                            match[0] = match[0].slice( 0, excess );
        +                            match[2] = unquoted.slice( 0, excess );
        +                        }
        +
        +                        // Return only captures needed by the pseudo filter method (type and argument)
        +                        return match.slice( 0, 3 );
        +                    }
        +                },
        +
        +                filter: {
        +
        +                    "TAG": function( nodeNameSelector ) {
        +                        var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
        +                        return nodeNameSelector === "*" ?
        +                            function() { return true; } :
        +                            function( elem ) {
        +                                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
        +                            };
        +                    },
        +
        +                    "CLASS": function( className ) {
        +                        var pattern = classCache[ className + " " ];
        +
        +                        return pattern ||
        +                            (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
        +                                classCache( className, function( elem ) {
        +                                    return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
        +                                });
        +                    },
        +
        +                    "ATTR": function( name, operator, check ) {
        +                        return function( elem ) {
        +                            var result = Sizzle.attr( elem, name );
        +
        +                            if ( result == null ) {
        +                                return operator === "!=";
        +                            }
        +                            if ( !operator ) {
        +                                return true;
        +                            }
        +
        +                            result += "";
        +
        +                            return operator === "=" ? result === check :
        +                                operator === "!=" ? result !== check :
        +                                    operator === "^=" ? check && result.indexOf( check ) === 0 :
        +                                        operator === "*=" ? check && result.indexOf( check ) > -1 :
        +                                            operator === "$=" ? check && result.slice( -check.length ) === check :
        +                                                operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
        +                                                    operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
        +                                                        false;
        +                        };
        +                    },
        +
        +                    "CHILD": function( type, what, argument, first, last ) {
        +                        var simple = type.slice( 0, 3 ) !== "nth",
        +                            forward = type.slice( -4 ) !== "last",
        +                            ofType = what === "of-type";
        +
        +                        return first === 1 && last === 0 ?
        +
        +                            // Shortcut for :nth-*(n)
        +                            function( elem ) {
        +                                return !!elem.parentNode;
        +                            } :
        +
        +                            function( elem, context, xml ) {
        +                                var cache, outerCache, node, diff, nodeIndex, start,
        +                                    dir = simple !== forward ? "nextSibling" : "previousSibling",
        +                                    parent = elem.parentNode,
        +                                    name = ofType && elem.nodeName.toLowerCase(),
        +                                    useCache = !xml && !ofType;
        +
        +                                if ( parent ) {
        +
        +                                    // :(first|last|only)-(child|of-type)
        +                                    if ( simple ) {
        +                                        while ( dir ) {
        +                                            node = elem;
        +                                            while ( (node = node[ dir ]) ) {
        +                                                if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
        +                                                    return false;
        +                                                }
        +                                            }
        +                                            // Reverse direction for :only-* (if we haven't yet done so)
        +                                            start = dir = type === "only" && !start && "nextSibling";
        +                                        }
        +                                        return true;
        +                                    }
        +
        +                                    start = [ forward ? parent.firstChild : parent.lastChild ];
        +
        +                                    // non-xml :nth-child(...) stores cache data on `parent`
        +                                    if ( forward && useCache ) {
        +                                        // Seek `elem` from a previously-cached index
        +                                        outerCache = parent[ expando ] || (parent[ expando ] = {});
        +                                        cache = outerCache[ type ] || [];
        +                                        nodeIndex = cache[0] === dirruns && cache[1];
        +                                        diff = cache[0] === dirruns && cache[2];
        +                                        node = nodeIndex && parent.childNodes[ nodeIndex ];
        +
        +                                        while ( (node = ++nodeIndex && node && node[ dir ] ||
        +
        +                                            // Fallback to seeking `elem` from the start
        +                                            (diff = nodeIndex = 0) || start.pop()) ) {
        +
        +                                            // When found, cache indexes on `parent` and break
        +                                            if ( node.nodeType === 1 && ++diff && node === elem ) {
        +                                                outerCache[ type ] = [ dirruns, nodeIndex, diff ];
        +                                                break;
        +                                            }
        +                                        }
        +
        +                                        // Use previously-cached element index if available
        +                                    } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
        +                                        diff = cache[1];
        +
        +                                        // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
        +                                    } else {
        +                                        // Use the same loop as above to seek `elem` from the start
        +                                        while ( (node = ++nodeIndex && node && node[ dir ] ||
        +                                            (diff = nodeIndex = 0) || start.pop()) ) {
        +
        +                                            if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
        +                                                // Cache the index of each encountered element
        +                                                if ( useCache ) {
        +                                                    (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
        +                                                }
        +
        +                                                if ( node === elem ) {
        +                                                    break;
        +                                                }
        +                                            }
        +                                        }
        +                                    }
        +
        +                                    // Incorporate the offset, then check against cycle size
        +                                    diff -= last;
        +                                    return diff === first || ( diff % first === 0 && diff / first >= 0 );
        +                                }
        +                            };
        +                    },
        +
        +                    "PSEUDO": function( pseudo, argument ) {
        +                        // pseudo-class names are case-insensitive
        +                        // http://www.w3.org/TR/selectors/#pseudo-classes
        +                        // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
        +                        // Remember that setFilters inherits from pseudos
        +                        var args,
        +                            fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
        +                                Sizzle.error( "unsupported pseudo: " + pseudo );
        +
        +                        // The user may use createPseudo to indicate that
        +                        // arguments are needed to create the filter function
        +                        // just as Sizzle does
        +                        if ( fn[ expando ] ) {
        +                            return fn( argument );
        +                        }
        +
        +                        // But maintain support for old signatures
        +                        if ( fn.length > 1 ) {
        +                            args = [ pseudo, pseudo, "", argument ];
        +                            return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
        +                                markFunction(function( seed, matches ) {
        +                                    var idx,
        +                                        matched = fn( seed, argument ),
        +                                        i = matched.length;
        +                                    while ( i-- ) {
        +                                        idx = indexOf.call( seed, matched[i] );
        +                                        seed[ idx ] = !( matches[ idx ] = matched[i] );
        +                                    }
        +                                }) :
        +                                function( elem ) {
        +                                    return fn( elem, 0, args );
        +                                };
        +                        }
        +
        +                        return fn;
        +                    }
        +                },
        +
        +                pseudos: {
        +                    // Potentially complex pseudos
        +                    "not": markFunction(function( selector ) {
        +                        // Trim the selector passed to compile
        +                        // to avoid treating leading and trailing
        +                        // spaces as combinators
        +                        var input = [],
        +                            results = [],
        +                            matcher = compile( selector.replace( rtrim, "$1" ) );
        +
        +                        return matcher[ expando ] ?
        +                            markFunction(function( seed, matches, context, xml ) {
        +                                var elem,
        +                                    unmatched = matcher( seed, null, xml, [] ),
        +                                    i = seed.length;
        +
        +                                // Match elements unmatched by `matcher`
        +                                while ( i-- ) {
        +                                    if ( (elem = unmatched[i]) ) {
        +                                        seed[i] = !(matches[i] = elem);
        +                                    }
        +                                }
        +                            }) :
        +                            function( elem, context, xml ) {
        +                                input[0] = elem;
        +                                matcher( input, null, xml, results );
        +                                return !results.pop();
        +                            };
        +                    }),
        +
        +                    "has": markFunction(function( selector ) {
        +                        return function( elem ) {
        +                            return Sizzle( selector, elem ).length > 0;
        +                        };
        +                    }),
        +
        +                    "contains": markFunction(function( text ) {
        +                        return function( elem ) {
        +                            return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
        +                        };
        +                    }),
        +
        +                    // "Whether an element is represented by a :lang() selector
        +                    // is based solely on the element's language value
        +                    // being equal to the identifier C,
        +                    // or beginning with the identifier C immediately followed by "-".
        +                    // The matching of C against the element's language value is performed case-insensitively.
        +                    // The identifier C does not have to be a valid language name."
        +                    // http://www.w3.org/TR/selectors/#lang-pseudo
        +                    "lang": markFunction( function( lang ) {
        +                        // lang value must be a valid identifier
        +                        if ( !ridentifier.test(lang || "") ) {
        +                            Sizzle.error( "unsupported lang: " + lang );
        +                        }
        +                        lang = lang.replace( runescape, funescape ).toLowerCase();
        +                        return function( elem ) {
        +                            var elemLang;
        +                            do {
        +                                if ( (elemLang = documentIsHTML ?
        +                                    elem.lang :
        +                                    elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
        +
        +                                    elemLang = elemLang.toLowerCase();
        +                                    return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
        +                                }
        +                            } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
        +                            return false;
        +                        };
        +                    }),
        +
        +                    // Miscellaneous
        +                    "target": function( elem ) {
        +                        var hash = window.location && window.location.hash;
        +                        return hash && hash.slice( 1 ) === elem.id;
        +                    },
        +
        +                    "root": function( elem ) {
        +                        return elem === docElem;
        +                    },
        +
        +                    "focus": function( elem ) {
        +                        return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
        +                    },
        +
        +                    // Boolean properties
        +                    "enabled": function( elem ) {
        +                        return elem.disabled === false;
        +                    },
        +
        +                    "disabled": function( elem ) {
        +                        return elem.disabled === true;
        +                    },
        +
        +                    "checked": function( elem ) {
        +                        // In CSS3, :checked should return both checked and selected elements
        +                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +                        var nodeName = elem.nodeName.toLowerCase();
        +                        return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
        +                    },
        +
        +                    "selected": function( elem ) {
        +                        // Accessing this property makes selected-by-default
        +                        // options in Safari work properly
        +                        if ( elem.parentNode ) {
        +                            elem.parentNode.selectedIndex;
        +                        }
        +
        +                        return elem.selected === true;
        +                    },
        +
        +                    // Contents
        +                    "empty": function( elem ) {
        +                        // http://www.w3.org/TR/selectors/#empty-pseudo
        +                        // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
        +                        //   but not by others (comment: 8; processing instruction: 7; etc.)
        +                        // nodeType < 6 works because attributes (2) do not appear as children
        +                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +                            if ( elem.nodeType < 6 ) {
        +                                return false;
        +                            }
        +                        }
        +                        return true;
        +                    },
        +
        +                    "parent": function( elem ) {
        +                        return !Expr.pseudos["empty"]( elem );
        +                    },
        +
        +                    // Element/input types
        +                    "header": function( elem ) {
        +                        return rheader.test( elem.nodeName );
        +                    },
        +
        +                    "input": function( elem ) {
        +                        return rinputs.test( elem.nodeName );
        +                    },
        +
        +                    "button": function( elem ) {
        +                        var name = elem.nodeName.toLowerCase();
        +                        return name === "input" && elem.type === "button" || name === "button";
        +                    },
        +
        +                    "text": function( elem ) {
        +                        var attr;
        +                        return elem.nodeName.toLowerCase() === "input" &&
        +                            elem.type === "text" &&
        +
        +                            // Support: IE<8
        +                            // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
        +                            ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
        +                    },
        +
        +                    // Position-in-collection
        +                    "first": createPositionalPseudo(function() {
        +                        return [ 0 ];
        +                    }),
        +
        +                    "last": createPositionalPseudo(function( matchIndexes, length ) {
        +                        return [ length - 1 ];
        +                    }),
        +
        +                    "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +                        return [ argument < 0 ? argument + length : argument ];
        +                    }),
        +
        +                    "even": createPositionalPseudo(function( matchIndexes, length ) {
        +                        var i = 0;
        +                        for ( ; i < length; i += 2 ) {
        +                            matchIndexes.push( i );
        +                        }
        +                        return matchIndexes;
        +                    }),
        +
        +                    "odd": createPositionalPseudo(function( matchIndexes, length ) {
        +                        var i = 1;
        +                        for ( ; i < length; i += 2 ) {
        +                            matchIndexes.push( i );
        +                        }
        +                        return matchIndexes;
        +                    }),
        +
        +                    "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +                        var i = argument < 0 ? argument + length : argument;
        +                        for ( ; --i >= 0; ) {
        +                            matchIndexes.push( i );
        +                        }
        +                        return matchIndexes;
        +                    }),
        +
        +                    "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +                        var i = argument < 0 ? argument + length : argument;
        +                        for ( ; ++i < length; ) {
        +                            matchIndexes.push( i );
        +                        }
        +                        return matchIndexes;
        +                    })
        +                }
        +            };
        +
        +            Expr.pseudos["nth"] = Expr.pseudos["eq"];
        +
        +// Add button/input type pseudos
        +            for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
        +                Expr.pseudos[ i ] = createInputPseudo( i );
        +            }
        +            for ( i in { submit: true, reset: true } ) {
        +                Expr.pseudos[ i ] = createButtonPseudo( i );
        +            }
        +
        +// Easy API for creating new setFilters
        +            function setFilters() {}
        +            setFilters.prototype = Expr.filters = Expr.pseudos;
        +            Expr.setFilters = new setFilters();
        +
        +            function tokenize( selector, parseOnly ) {
        +                var matched, match, tokens, type,
        +                    soFar, groups, preFilters,
        +                    cached = tokenCache[ selector + " " ];
        +
        +                if ( cached ) {
        +                    return parseOnly ? 0 : cached.slice( 0 );
        +                }
        +
        +                soFar = selector;
        +                groups = [];
        +                preFilters = Expr.preFilter;
        +
        +                while ( soFar ) {
        +
        +                    // Comma and first run
        +                    if ( !matched || (match = rcomma.exec( soFar )) ) {
        +                        if ( match ) {
        +                            // Don't consume trailing commas as valid
        +                            soFar = soFar.slice( match[0].length ) || soFar;
        +                        }
        +                        groups.push( (tokens = []) );
        +                    }
        +
        +                    matched = false;
        +
        +                    // Combinators
        +                    if ( (match = rcombinators.exec( soFar )) ) {
        +                        matched = match.shift();
        +                        tokens.push({
        +                            value: matched,
        +                            // Cast descendant combinators to space
        +                            type: match[0].replace( rtrim, " " )
        +                        });
        +                        soFar = soFar.slice( matched.length );
        +                    }
        +
        +                    // Filters
        +                    for ( type in Expr.filter ) {
        +                        if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
        +                            (match = preFilters[ type ]( match ))) ) {
        +                            matched = match.shift();
        +                            tokens.push({
        +                                value: matched,
        +                                type: type,
        +                                matches: match
        +                            });
        +                            soFar = soFar.slice( matched.length );
        +                        }
        +                    }
        +
        +                    if ( !matched ) {
        +                        break;
        +                    }
        +                }
        +
        +                // Return the length of the invalid excess
        +                // if we're just parsing
        +                // Otherwise, throw an error or return tokens
        +                return parseOnly ?
        +                    soFar.length :
        +                    soFar ?
        +                        Sizzle.error( selector ) :
        +                        // Cache the tokens
        +                        tokenCache( selector, groups ).slice( 0 );
        +            }
        +
        +            function toSelector( tokens ) {
        +                var i = 0,
        +                    len = tokens.length,
        +                    selector = "";
        +                for ( ; i < len; i++ ) {
        +                    selector += tokens[i].value;
        +                }
        +                return selector;
        +            }
        +
        +            function addCombinator( matcher, combinator, base ) {
        +                var dir = combinator.dir,
        +                    checkNonElements = base && dir === "parentNode",
        +                    doneName = done++;
        +
        +                return combinator.first ?
        +                    // Check against closest ancestor/preceding element
        +                    function( elem, context, xml ) {
        +                        while ( (elem = elem[ dir ]) ) {
        +                            if ( elem.nodeType === 1 || checkNonElements ) {
        +                                return matcher( elem, context, xml );
        +                            }
        +                        }
        +                    } :
        +
        +                    // Check against all ancestor/preceding elements
        +                    function( elem, context, xml ) {
        +                        var oldCache, outerCache,
        +                            newCache = [ dirruns, doneName ];
        +
        +                        // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
        +                        if ( xml ) {
        +                            while ( (elem = elem[ dir ]) ) {
        +                                if ( elem.nodeType === 1 || checkNonElements ) {
        +                                    if ( matcher( elem, context, xml ) ) {
        +                                        return true;
        +                                    }
        +                                }
        +                            }
        +                        } else {
        +                            while ( (elem = elem[ dir ]) ) {
        +                                if ( elem.nodeType === 1 || checkNonElements ) {
        +                                    outerCache = elem[ expando ] || (elem[ expando ] = {});
        +                                    if ( (oldCache = outerCache[ dir ]) &&
        +                                        oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
        +
        +                                        // Assign to newCache so results back-propagate to previous elements
        +                                        return (newCache[ 2 ] = oldCache[ 2 ]);
        +                                    } else {
        +                                        // Reuse newcache so results back-propagate to previous elements
        +                                        outerCache[ dir ] = newCache;
        +
        +                                        // A match means we're done; a fail means we have to keep checking
        +                                        if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
        +                                            return true;
        +                                        }
        +                                    }
        +                                }
        +                            }
        +                        }
        +                    };
        +            }
        +
        +            function elementMatcher( matchers ) {
        +                return matchers.length > 1 ?
        +                    function( elem, context, xml ) {
        +                        var i = matchers.length;
        +                        while ( i-- ) {
        +                            if ( !matchers[i]( elem, context, xml ) ) {
        +                                return false;
        +                            }
        +                        }
        +                        return true;
        +                    } :
        +                    matchers[0];
        +            }
        +
        +            function condense( unmatched, map, filter, context, xml ) {
        +                var elem,
        +                    newUnmatched = [],
        +                    i = 0,
        +                    len = unmatched.length,
        +                    mapped = map != null;
        +
        +                for ( ; i < len; i++ ) {
        +                    if ( (elem = unmatched[i]) ) {
        +                        if ( !filter || filter( elem, context, xml ) ) {
        +                            newUnmatched.push( elem );
        +                            if ( mapped ) {
        +                                map.push( i );
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                return newUnmatched;
        +            }
        +
        +            function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
        +                if ( postFilter && !postFilter[ expando ] ) {
        +                    postFilter = setMatcher( postFilter );
        +                }
        +                if ( postFinder && !postFinder[ expando ] ) {
        +                    postFinder = setMatcher( postFinder, postSelector );
        +                }
        +                return markFunction(function( seed, results, context, xml ) {
        +                    var temp, i, elem,
        +                        preMap = [],
        +                        postMap = [],
        +                        preexisting = results.length,
        +
        +                    // Get initial elements from seed or context
        +                        elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
        +
        +                    // Prefilter to get matcher input, preserving a map for seed-results synchronization
        +                        matcherIn = preFilter && ( seed || !selector ) ?
        +                            condense( elems, preMap, preFilter, context, xml ) :
        +                            elems,
        +
        +                        matcherOut = matcher ?
        +                            // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
        +                            postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
        +
        +                                // ...intermediate processing is necessary
        +                                [] :
        +
        +                                // ...otherwise use results directly
        +                                results :
        +                            matcherIn;
        +
        +                    // Find primary matches
        +                    if ( matcher ) {
        +                        matcher( matcherIn, matcherOut, context, xml );
        +                    }
        +
        +                    // Apply postFilter
        +                    if ( postFilter ) {
        +                        temp = condense( matcherOut, postMap );
        +                        postFilter( temp, [], context, xml );
        +
        +                        // Un-match failing elements by moving them back to matcherIn
        +                        i = temp.length;
        +                        while ( i-- ) {
        +                            if ( (elem = temp[i]) ) {
        +                                matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
        +                            }
        +                        }
        +                    }
        +
        +                    if ( seed ) {
        +                        if ( postFinder || preFilter ) {
        +                            if ( postFinder ) {
        +                                // Get the final matcherOut by condensing this intermediate into postFinder contexts
        +                                temp = [];
        +                                i = matcherOut.length;
        +                                while ( i-- ) {
        +                                    if ( (elem = matcherOut[i]) ) {
        +                                        // Restore matcherIn since elem is not yet a final match
        +                                        temp.push( (matcherIn[i] = elem) );
        +                                    }
        +                                }
        +                                postFinder( null, (matcherOut = []), temp, xml );
        +                            }
        +
        +                            // Move matched elements from seed to results to keep them synchronized
        +                            i = matcherOut.length;
        +                            while ( i-- ) {
        +                                if ( (elem = matcherOut[i]) &&
        +                                    (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
        +
        +                                    seed[temp] = !(results[temp] = elem);
        +                                }
        +                            }
        +                        }
        +
        +                        // Add elements to results, through postFinder if defined
        +                    } else {
        +                        matcherOut = condense(
        +                            matcherOut === results ?
        +                                matcherOut.splice( preexisting, matcherOut.length ) :
        +                                matcherOut
        +                        );
        +                        if ( postFinder ) {
        +                            postFinder( null, results, matcherOut, xml );
        +                        } else {
        +                            push.apply( results, matcherOut );
        +                        }
        +                    }
        +                });
        +            }
        +
        +            function matcherFromTokens( tokens ) {
        +                var checkContext, matcher, j,
        +                    len = tokens.length,
        +                    leadingRelative = Expr.relative[ tokens[0].type ],
        +                    implicitRelative = leadingRelative || Expr.relative[" "],
        +                    i = leadingRelative ? 1 : 0,
        +
        +                // The foundational matcher ensures that elements are reachable from top-level context(s)
        +                    matchContext = addCombinator( function( elem ) {
        +                        return elem === checkContext;
        +                    }, implicitRelative, true ),
        +                    matchAnyContext = addCombinator( function( elem ) {
        +                        return indexOf.call( checkContext, elem ) > -1;
        +                    }, implicitRelative, true ),
        +                    matchers = [ function( elem, context, xml ) {
        +                        return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
        +                            (checkContext = context).nodeType ?
        +                                matchContext( elem, context, xml ) :
        +                                matchAnyContext( elem, context, xml ) );
        +                    } ];
        +
        +                for ( ; i < len; i++ ) {
        +                    if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
        +                        matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
        +                    } else {
        +                        matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
        +
        +                        // Return special upon seeing a positional matcher
        +                        if ( matcher[ expando ] ) {
        +                            // Find the next relative operator (if any) for proper handling
        +                            j = ++i;
        +                            for ( ; j < len; j++ ) {
        +                                if ( Expr.relative[ tokens[j].type ] ) {
        +                                    break;
        +                                }
        +                            }
        +                            return setMatcher(
        +                                i > 1 && elementMatcher( matchers ),
        +                                i > 1 && toSelector(
        +                                    // If the preceding token was a descendant combinator, insert an implicit any-element `*`
        +                                    tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
        +                                ).replace( rtrim, "$1" ),
        +                                matcher,
        +                                i < j && matcherFromTokens( tokens.slice( i, j ) ),
        +                                j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
        +                                j < len && toSelector( tokens )
        +                            );
        +                        }
        +                        matchers.push( matcher );
        +                    }
        +                }
        +
        +                return elementMatcher( matchers );
        +            }
        +
        +            function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
        +                var bySet = setMatchers.length > 0,
        +                    byElement = elementMatchers.length > 0,
        +                    superMatcher = function( seed, context, xml, results, outermost ) {
        +                        var elem, j, matcher,
        +                            matchedCount = 0,
        +                            i = "0",
        +                            unmatched = seed && [],
        +                            setMatched = [],
        +                            contextBackup = outermostContext,
        +                        // We must always have either seed elements or outermost context
        +                            elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
        +                        // Use integer dirruns iff this is the outermost matcher
        +                            dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
        +                            len = elems.length;
        +
        +                        if ( outermost ) {
        +                            outermostContext = context !== document && context;
        +                        }
        +
        +                        // Add elements passing elementMatchers directly to results
        +                        // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
        +                        // Support: IE<9, Safari
        +                        // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
        +                        for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
        +                            if ( byElement && elem ) {
        +                                j = 0;
        +                                while ( (matcher = elementMatchers[j++]) ) {
        +                                    if ( matcher( elem, context, xml ) ) {
        +                                        results.push( elem );
        +                                        break;
        +                                    }
        +                                }
        +                                if ( outermost ) {
        +                                    dirruns = dirrunsUnique;
        +                                }
        +                            }
        +
        +                            // Track unmatched elements for set filters
        +                            if ( bySet ) {
        +                                // They will have gone through all possible matchers
        +                                if ( (elem = !matcher && elem) ) {
        +                                    matchedCount--;
        +                                }
        +
        +                                // Lengthen the array for every element, matched or not
        +                                if ( seed ) {
        +                                    unmatched.push( elem );
        +                                }
        +                            }
        +                        }
        +
        +                        // Apply set filters to unmatched elements
        +                        matchedCount += i;
        +                        if ( bySet && i !== matchedCount ) {
        +                            j = 0;
        +                            while ( (matcher = setMatchers[j++]) ) {
        +                                matcher( unmatched, setMatched, context, xml );
        +                            }
        +
        +                            if ( seed ) {
        +                                // Reintegrate element matches to eliminate the need for sorting
        +                                if ( matchedCount > 0 ) {
        +                                    while ( i-- ) {
        +                                        if ( !(unmatched[i] || setMatched[i]) ) {
        +                                            setMatched[i] = pop.call( results );
        +                                        }
        +                                    }
        +                                }
        +
        +                                // Discard index placeholder values to get only actual matches
        +                                setMatched = condense( setMatched );
        +                            }
        +
        +                            // Add matches to results
        +                            push.apply( results, setMatched );
        +
        +                            // Seedless set matches succeeding multiple successful matchers stipulate sorting
        +                            if ( outermost && !seed && setMatched.length > 0 &&
        +                                ( matchedCount + setMatchers.length ) > 1 ) {
        +
        +                                Sizzle.uniqueSort( results );
        +                            }
        +                        }
        +
        +                        // Override manipulation of globals by nested matchers
        +                        if ( outermost ) {
        +                            dirruns = dirrunsUnique;
        +                            outermostContext = contextBackup;
        +                        }
        +
        +                        return unmatched;
        +                    };
        +
        +                return bySet ?
        +                    markFunction( superMatcher ) :
        +                    superMatcher;
        +            }
        +
        +            compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
        +                var i,
        +                    setMatchers = [],
        +                    elementMatchers = [],
        +                    cached = compilerCache[ selector + " " ];
        +
        +                if ( !cached ) {
        +                    // Generate a function of recursive functions that can be used to check each element
        +                    if ( !group ) {
        +                        group = tokenize( selector );
        +                    }
        +                    i = group.length;
        +                    while ( i-- ) {
        +                        cached = matcherFromTokens( group[i] );
        +                        if ( cached[ expando ] ) {
        +                            setMatchers.push( cached );
        +                        } else {
        +                            elementMatchers.push( cached );
        +                        }
        +                    }
        +
        +                    // Cache the compiled function
        +                    cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
        +                }
        +                return cached;
        +            };
        +
        +            function multipleContexts( selector, contexts, results ) {
        +                var i = 0,
        +                    len = contexts.length;
        +                for ( ; i < len; i++ ) {
        +                    Sizzle( selector, contexts[i], results );
        +                }
        +                return results;
        +            }
        +
        +            function select( selector, context, results, seed ) {
        +                var i, tokens, token, type, find,
        +                    match = tokenize( selector );
        +
        +                if ( !seed ) {
        +                    // Try to minimize operations if there is only one group
        +                    if ( match.length === 1 ) {
        +
        +                        // Take a shortcut and set the context if the root selector is an ID
        +                        tokens = match[0] = match[0].slice( 0 );
        +                        if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
        +                            support.getById && context.nodeType === 9 && documentIsHTML &&
        +                            Expr.relative[ tokens[1].type ] ) {
        +
        +                            context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
        +                            if ( !context ) {
        +                                return results;
        +                            }
        +                            selector = selector.slice( tokens.shift().value.length );
        +                        }
        +
        +                        // Fetch a seed set for right-to-left matching
        +                        i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
        +                        while ( i-- ) {
        +                            token = tokens[i];
        +
        +                            // Abort if we hit a combinator
        +                            if ( Expr.relative[ (type = token.type) ] ) {
        +                                break;
        +                            }
        +                            if ( (find = Expr.find[ type ]) ) {
        +                                // Search, expanding context for leading sibling combinators
        +                                if ( (seed = find(
        +                                    token.matches[0].replace( runescape, funescape ),
        +                                    rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
        +                                )) ) {
        +
        +                                    // If seed is empty or no tokens remain, we can return early
        +                                    tokens.splice( i, 1 );
        +                                    selector = seed.length && toSelector( tokens );
        +                                    if ( !selector ) {
        +                                        push.apply( results, seed );
        +                                        return results;
        +                                    }
        +
        +                                    break;
        +                                }
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                // Compile and execute a filtering function
        +                // Provide `match` to avoid retokenization if we modified the selector above
        +                compile( selector, match )(
        +                    seed,
        +                    context,
        +                    !documentIsHTML,
        +                    results,
        +                    rsibling.test( selector ) && testContext( context.parentNode ) || context
        +                );
        +                return results;
        +            }
        +
        +// One-time assignments
        +
        +// Sort stability
        +            support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
        +
        +// Support: Chrome<14
        +// Always assume duplicates if they aren't passed to the comparison function
        +            support.detectDuplicates = !!hasDuplicate;
        +
        +// Initialize against the default document
        +            setDocument();
        +
        +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
        +// Detached nodes confoundingly follow *each other*
        +            support.sortDetached = assert(function( div1 ) {
        +                // Should return 1, but returns 4 (following)
        +                return div1.compareDocumentPosition( document.createElement("div") ) & 1;
        +            });
        +
        +// Support: IE<8
        +// Prevent attribute/property "interpolation"
        +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
        +            if ( !assert(function( div ) {
        +                div.innerHTML = "<a href='#'></a>";
        +                return div.firstChild.getAttribute("href") === "#" ;
        +            }) ) {
        +                addHandle( "type|href|height|width", function( elem, name, isXML ) {
        +                    if ( !isXML ) {
        +                        return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
        +                    }
        +                });
        +            }
        +
        +// Support: IE<9
        +// Use defaultValue in place of getAttribute("value")
        +            if ( !support.attributes || !assert(function( div ) {
        +                div.innerHTML = "<input/>";
        +                div.firstChild.setAttribute( "value", "" );
        +                return div.firstChild.getAttribute( "value" ) === "";
        +            }) ) {
        +                addHandle( "value", function( elem, name, isXML ) {
        +                    if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
        +                        return elem.defaultValue;
        +                    }
        +                });
        +            }
        +
        +// Support: IE<9
        +// Use getAttributeNode to fetch booleans when getAttribute lies
        +            if ( !assert(function( div ) {
        +                return div.getAttribute("disabled") == null;
        +            }) ) {
        +                addHandle( booleans, function( elem, name, isXML ) {
        +                    var val;
        +                    if ( !isXML ) {
        +                        return elem[ name ] === true ? name.toLowerCase() :
        +                            (val = elem.getAttributeNode( name )) && val.specified ?
        +                                val.value :
        +                                null;
        +                    }
        +                });
        +            }
        +
        +            return Sizzle;
        +
        +        })( window );
        +
        +
        +
        +    jQuery.find = Sizzle;
        +    jQuery.expr = Sizzle.selectors;
        +    jQuery.expr[":"] = jQuery.expr.pseudos;
        +    jQuery.unique = Sizzle.uniqueSort;
        +    jQuery.text = Sizzle.getText;
        +    jQuery.isXMLDoc = Sizzle.isXML;
        +    jQuery.contains = Sizzle.contains;
        +
        +
        +
        +    var rneedsContext = jQuery.expr.match.needsContext;
        +
        +    var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
        +
        +
        +
        +    var risSimple = /^.[^:#\[\.,]*$/;
        +
        +// Implement the identical functionality for filter and not
        +    function winnow( elements, qualifier, not ) {
        +        if ( jQuery.isFunction( qualifier ) ) {
        +            return jQuery.grep( elements, function( elem, i ) {
        +                /* jshint -W018 */
        +                return !!qualifier.call( elem, i, elem ) !== not;
        +            });
        +
        +        }
        +
        +        if ( qualifier.nodeType ) {
        +            return jQuery.grep( elements, function( elem ) {
        +                return ( elem === qualifier ) !== not;
        +            });
        +
        +        }
        +
        +        if ( typeof qualifier === "string" ) {
        +            if ( risSimple.test( qualifier ) ) {
        +                return jQuery.filter( qualifier, elements, not );
        +            }
        +
        +            qualifier = jQuery.filter( qualifier, elements );
        +        }
        +
        +        return jQuery.grep( elements, function( elem ) {
        +            return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
        +        });
        +    }
        +
        +    jQuery.filter = function( expr, elems, not ) {
        +        var elem = elems[ 0 ];
        +
        +        if ( not ) {
        +            expr = ":not(" + expr + ")";
        +        }
        +
        +        return elems.length === 1 && elem.nodeType === 1 ?
        +            jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
        +            jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
        +                return elem.nodeType === 1;
        +            }));
        +    };
        +
        +    jQuery.fn.extend({
        +        find: function( selector ) {
        +            var i,
        +                len = this.length,
        +                ret = [],
        +                self = this;
        +
        +            if ( typeof selector !== "string" ) {
        +                return this.pushStack( jQuery( selector ).filter(function() {
        +                    for ( i = 0; i < len; i++ ) {
        +                        if ( jQuery.contains( self[ i ], this ) ) {
        +                            return true;
        +                        }
        +                    }
        +                }) );
        +            }
        +
        +            for ( i = 0; i < len; i++ ) {
        +                jQuery.find( selector, self[ i ], ret );
        +            }
        +
        +            // Needed because $( selector, context ) becomes $( context ).find( selector )
        +            ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
        +            ret.selector = this.selector ? this.selector + " " + selector : selector;
        +            return ret;
        +        },
        +        filter: function( selector ) {
        +            return this.pushStack( winnow(this, selector || [], false) );
        +        },
        +        not: function( selector ) {
        +            return this.pushStack( winnow(this, selector || [], true) );
        +        },
        +        is: function( selector ) {
        +            return !!winnow(
        +                this,
        +
        +                // If this is a positional/relative selector, check membership in the returned set
        +                // so $("p:first").is("p:last") won't return true for a doc with two "p".
        +                typeof selector === "string" && rneedsContext.test( selector ) ?
        +                    jQuery( selector ) :
        +                    selector || [],
        +                false
        +            ).length;
        +        }
        +    });
        +
        +
        +// Initialize a jQuery object
        +
        +
        +// A central reference to the root jQuery(document)
        +    var rootjQuery,
        +
        +    // A simple way to check for HTML strings
        +    // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        +    // Strict HTML recognition (#11290: must start with <)
        +        rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
        +
        +        init = jQuery.fn.init = function( selector, context ) {
        +            var match, elem;
        +
        +            // HANDLE: $(""), $(null), $(undefined), $(false)
        +            if ( !selector ) {
        +                return this;
        +            }
        +
        +            // Handle HTML strings
        +            if ( typeof selector === "string" ) {
        +                if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
        +                    // Assume that strings that start and end with <> are HTML and skip the regex check
        +                    match = [ null, selector, null ];
        +
        +                } else {
        +                    match = rquickExpr.exec( selector );
        +                }
        +
        +                // Match html or make sure no context is specified for #id
        +                if ( match && (match[1] || !context) ) {
        +
        +                    // HANDLE: $(html) -> $(array)
        +                    if ( match[1] ) {
        +                        context = context instanceof jQuery ? context[0] : context;
        +
        +                        // scripts is true for back-compat
        +                        // Intentionally let the error be thrown if parseHTML is not present
        +                        jQuery.merge( this, jQuery.parseHTML(
        +                            match[1],
        +                            context && context.nodeType ? context.ownerDocument || context : document,
        +                            true
        +                        ) );
        +
        +                        // HANDLE: $(html, props)
        +                        if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
        +                            for ( match in context ) {
        +                                // Properties of context are called as methods if possible
        +                                if ( jQuery.isFunction( this[ match ] ) ) {
        +                                    this[ match ]( context[ match ] );
        +
        +                                    // ...and otherwise set as attributes
        +                                } else {
        +                                    this.attr( match, context[ match ] );
        +                                }
        +                            }
        +                        }
        +
        +                        return this;
        +
        +                        // HANDLE: $(#id)
        +                    } else {
        +                        elem = document.getElementById( match[2] );
        +
        +                        // Check parentNode to catch when Blackberry 4.6 returns
        +                        // nodes that are no longer in the document #6963
        +                        if ( elem && elem.parentNode ) {
        +                            // Inject the element directly into the jQuery object
        +                            this.length = 1;
        +                            this[0] = elem;
        +                        }
        +
        +                        this.context = document;
        +                        this.selector = selector;
        +                        return this;
        +                    }
        +
        +                    // HANDLE: $(expr, $(...))
        +                } else if ( !context || context.jquery ) {
        +                    return ( context || rootjQuery ).find( selector );
        +
        +                    // HANDLE: $(expr, context)
        +                    // (which is just equivalent to: $(context).find(expr)
        +                } else {
        +                    return this.constructor( context ).find( selector );
        +                }
        +
        +                // HANDLE: $(DOMElement)
        +            } else if ( selector.nodeType ) {
        +                this.context = this[0] = selector;
        +                this.length = 1;
        +                return this;
        +
        +                // HANDLE: $(function)
        +                // Shortcut for document ready
        +            } else if ( jQuery.isFunction( selector ) ) {
        +                return typeof rootjQuery.ready !== "undefined" ?
        +                    rootjQuery.ready( selector ) :
        +                    // Execute immediately if ready is not present
        +                    selector( jQuery );
        +            }
        +
        +            if ( selector.selector !== undefined ) {
        +                this.selector = selector.selector;
        +                this.context = selector.context;
        +            }
        +
        +            return jQuery.makeArray( selector, this );
        +        };
        +
        +// Give the init function the jQuery prototype for later instantiation
        +    init.prototype = jQuery.fn;
        +
        +// Initialize central reference
        +    rootjQuery = jQuery( document );
        +
        +
        +    var rparentsprev = /^(?:parents|prev(?:Until|All))/,
        +    // methods guaranteed to produce a unique set when starting from a unique set
        +        guaranteedUnique = {
        +            children: true,
        +            contents: true,
        +            next: true,
        +            prev: true
        +        };
        +
        +    jQuery.extend({
        +        dir: function( elem, dir, until ) {
        +            var matched = [],
        +                truncate = until !== undefined;
        +
        +            while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
        +                if ( elem.nodeType === 1 ) {
        +                    if ( truncate && jQuery( elem ).is( until ) ) {
        +                        break;
        +                    }
        +                    matched.push( elem );
        +                }
        +            }
        +            return matched;
        +        },
        +
        +        sibling: function( n, elem ) {
        +            var matched = [];
        +
        +            for ( ; n; n = n.nextSibling ) {
        +                if ( n.nodeType === 1 && n !== elem ) {
        +                    matched.push( n );
        +                }
        +            }
        +
        +            return matched;
        +        }
        +    });
        +
        +    jQuery.fn.extend({
        +        has: function( target ) {
        +            var targets = jQuery( target, this ),
        +                l = targets.length;
        +
        +            return this.filter(function() {
        +                var i = 0;
        +                for ( ; i < l; i++ ) {
        +                    if ( jQuery.contains( this, targets[i] ) ) {
        +                        return true;
        +                    }
        +                }
        +            });
        +        },
        +
        +        closest: function( selectors, context ) {
        +            var cur,
        +                i = 0,
        +                l = this.length,
        +                matched = [],
        +                pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
        +                    jQuery( selectors, context || this.context ) :
        +                    0;
        +
        +            for ( ; i < l; i++ ) {
        +                for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
        +                    // Always skip document fragments
        +                    if ( cur.nodeType < 11 && (pos ?
        +                        pos.index(cur) > -1 :
        +
        +                        // Don't pass non-elements to Sizzle
        +                        cur.nodeType === 1 &&
        +                            jQuery.find.matchesSelector(cur, selectors)) ) {
        +
        +                        matched.push( cur );
        +                        break;
        +                    }
        +                }
        +            }
        +
        +            return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
        +        },
        +
        +        // Determine the position of an element within
        +        // the matched set of elements
        +        index: function( elem ) {
        +
        +            // No argument, return index in parent
        +            if ( !elem ) {
        +                return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
        +            }
        +
        +            // index in selector
        +            if ( typeof elem === "string" ) {
        +                return indexOf.call( jQuery( elem ), this[ 0 ] );
        +            }
        +
        +            // Locate the position of the desired element
        +            return indexOf.call( this,
        +
        +                // If it receives a jQuery object, the first element is used
        +                elem.jquery ? elem[ 0 ] : elem
        +            );
        +        },
        +
        +        add: function( selector, context ) {
        +            return this.pushStack(
        +                jQuery.unique(
        +                    jQuery.merge( this.get(), jQuery( selector, context ) )
        +                )
        +            );
        +        },
        +
        +        addBack: function( selector ) {
        +            return this.add( selector == null ?
        +                this.prevObject : this.prevObject.filter(selector)
        +            );
        +        }
        +    });
        +
        +    function sibling( cur, dir ) {
        +        while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
        +        return cur;
        +    }
        +
        +    jQuery.each({
        +        parent: function( elem ) {
        +            var parent = elem.parentNode;
        +            return parent && parent.nodeType !== 11 ? parent : null;
        +        },
        +        parents: function( elem ) {
        +            return jQuery.dir( elem, "parentNode" );
        +        },
        +        parentsUntil: function( elem, i, until ) {
        +            return jQuery.dir( elem, "parentNode", until );
        +        },
        +        next: function( elem ) {
        +            return sibling( elem, "nextSibling" );
        +        },
        +        prev: function( elem ) {
        +            return sibling( elem, "previousSibling" );
        +        },
        +        nextAll: function( elem ) {
        +            return jQuery.dir( elem, "nextSibling" );
        +        },
        +        prevAll: function( elem ) {
        +            return jQuery.dir( elem, "previousSibling" );
        +        },
        +        nextUntil: function( elem, i, until ) {
        +            return jQuery.dir( elem, "nextSibling", until );
        +        },
        +        prevUntil: function( elem, i, until ) {
        +            return jQuery.dir( elem, "previousSibling", until );
        +        },
        +        siblings: function( elem ) {
        +            return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
        +        },
        +        children: function( elem ) {
        +            return jQuery.sibling( elem.firstChild );
        +        },
        +        contents: function( elem ) {
        +            return elem.contentDocument || jQuery.merge( [], elem.childNodes );
        +        }
        +    }, function( name, fn ) {
        +        jQuery.fn[ name ] = function( until, selector ) {
        +            var matched = jQuery.map( this, fn, until );
        +
        +            if ( name.slice( -5 ) !== "Until" ) {
        +                selector = until;
        +            }
        +
        +            if ( selector && typeof selector === "string" ) {
        +                matched = jQuery.filter( selector, matched );
        +            }
        +
        +            if ( this.length > 1 ) {
        +                // Remove duplicates
        +                if ( !guaranteedUnique[ name ] ) {
        +                    jQuery.unique( matched );
        +                }
        +
        +                // Reverse order for parents* and prev-derivatives
        +                if ( rparentsprev.test( name ) ) {
        +                    matched.reverse();
        +                }
        +            }
        +
        +            return this.pushStack( matched );
        +        };
        +    });
        +    var rnotwhite = (/\S+/g);
        +
        +
        +
        +// String to Object options format cache
        +    var optionsCache = {};
        +
        +// Convert String-formatted options into Object-formatted ones and store in cache
        +    function createOptions( options ) {
        +        var object = optionsCache[ options ] = {};
        +        jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
        +            object[ flag ] = true;
        +        });
        +        return object;
        +    }
        +
        +    /*
        +     * Create a callback list using the following parameters:
        +     *
        +     *	options: an optional list of space-separated options that will change how
        +     *			the callback list behaves or a more traditional option object
        +     *
        +     * By default a callback list will act like an event callback list and can be
        +     * "fired" multiple times.
        +     *
        +     * Possible options:
        +     *
        +     *	once:			will ensure the callback list can only be fired once (like a Deferred)
        +     *
        +     *	memory:			will keep track of previous values and will call any callback added
        +     *					after the list has been fired right away with the latest "memorized"
        +     *					values (like a Deferred)
        +     *
        +     *	unique:			will ensure a callback can only be added once (no duplicate in the list)
        +     *
        +     *	stopOnFalse:	interrupt callings when a callback returns false
        +     *
        +     */
        +    jQuery.Callbacks = function( options ) {
        +
        +        // Convert options from String-formatted to Object-formatted if needed
        +        // (we check in cache first)
        +        options = typeof options === "string" ?
        +            ( optionsCache[ options ] || createOptions( options ) ) :
        +            jQuery.extend( {}, options );
        +
        +        var // Last fire value (for non-forgettable lists)
        +            memory,
        +        // Flag to know if list was already fired
        +            fired,
        +        // Flag to know if list is currently firing
        +            firing,
        +        // First callback to fire (used internally by add and fireWith)
        +            firingStart,
        +        // End of the loop when firing
        +            firingLength,
        +        // Index of currently firing callback (modified by remove if needed)
        +            firingIndex,
        +        // Actual callback list
        +            list = [],
        +        // Stack of fire calls for repeatable lists
        +            stack = !options.once && [],
        +        // Fire callbacks
        +            fire = function( data ) {
        +                memory = options.memory && data;
        +                fired = true;
        +                firingIndex = firingStart || 0;
        +                firingStart = 0;
        +                firingLength = list.length;
        +                firing = true;
        +                for ( ; list && firingIndex < firingLength; firingIndex++ ) {
        +                    if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
        +                        memory = false; // To prevent further calls using add
        +                        break;
        +                    }
        +                }
        +                firing = false;
        +                if ( list ) {
        +                    if ( stack ) {
        +                        if ( stack.length ) {
        +                            fire( stack.shift() );
        +                        }
        +                    } else if ( memory ) {
        +                        list = [];
        +                    } else {
        +                        self.disable();
        +                    }
        +                }
        +            },
        +        // Actual Callbacks object
        +            self = {
        +                // Add a callback or a collection of callbacks to the list
        +                add: function() {
        +                    if ( list ) {
        +                        // First, we save the current length
        +                        var start = list.length;
        +                        (function add( args ) {
        +                            jQuery.each( args, function( _, arg ) {
        +                                var type = jQuery.type( arg );
        +                                if ( type === "function" ) {
        +                                    if ( !options.unique || !self.has( arg ) ) {
        +                                        list.push( arg );
        +                                    }
        +                                } else if ( arg && arg.length && type !== "string" ) {
        +                                    // Inspect recursively
        +                                    add( arg );
        +                                }
        +                            });
        +                        })( arguments );
        +                        // Do we need to add the callbacks to the
        +                        // current firing batch?
        +                        if ( firing ) {
        +                            firingLength = list.length;
        +                            // With memory, if we're not firing then
        +                            // we should call right away
        +                        } else if ( memory ) {
        +                            firingStart = start;
        +                            fire( memory );
        +                        }
        +                    }
        +                    return this;
        +                },
        +                // Remove a callback from the list
        +                remove: function() {
        +                    if ( list ) {
        +                        jQuery.each( arguments, function( _, arg ) {
        +                            var index;
        +                            while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
        +                                list.splice( index, 1 );
        +                                // Handle firing indexes
        +                                if ( firing ) {
        +                                    if ( index <= firingLength ) {
        +                                        firingLength--;
        +                                    }
        +                                    if ( index <= firingIndex ) {
        +                                        firingIndex--;
        +                                    }
        +                                }
        +                            }
        +                        });
        +                    }
        +                    return this;
        +                },
        +                // Check if a given callback is in the list.
        +                // If no argument is given, return whether or not list has callbacks attached.
        +                has: function( fn ) {
        +                    return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
        +                },
        +                // Remove all callbacks from the list
        +                empty: function() {
        +                    list = [];
        +                    firingLength = 0;
        +                    return this;
        +                },
        +                // Have the list do nothing anymore
        +                disable: function() {
        +                    list = stack = memory = undefined;
        +                    return this;
        +                },
        +                // Is it disabled?
        +                disabled: function() {
        +                    return !list;
        +                },
        +                // Lock the list in its current state
        +                lock: function() {
        +                    stack = undefined;
        +                    if ( !memory ) {
        +                        self.disable();
        +                    }
        +                    return this;
        +                },
        +                // Is it locked?
        +                locked: function() {
        +                    return !stack;
        +                },
        +                // Call all callbacks with the given context and arguments
        +                fireWith: function( context, args ) {
        +                    if ( list && ( !fired || stack ) ) {
        +                        args = args || [];
        +                        args = [ context, args.slice ? args.slice() : args ];
        +                        if ( firing ) {
        +                            stack.push( args );
        +                        } else {
        +                            fire( args );
        +                        }
        +                    }
        +                    return this;
        +                },
        +                // Call all the callbacks with the given arguments
        +                fire: function() {
        +                    self.fireWith( this, arguments );
        +                    return this;
        +                },
        +                // To know if the callbacks have already been called at least once
        +                fired: function() {
        +                    return !!fired;
        +                }
        +            };
        +
        +        return self;
        +    };
        +
        +
        +    jQuery.extend({
        +
        +        Deferred: function( func ) {
        +            var tuples = [
        +                    // action, add listener, listener list, final state
        +                    [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
        +                    [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
        +                    [ "notify", "progress", jQuery.Callbacks("memory") ]
        +                ],
        +                state = "pending",
        +                promise = {
        +                    state: function() {
        +                        return state;
        +                    },
        +                    always: function() {
        +                        deferred.done( arguments ).fail( arguments );
        +                        return this;
        +                    },
        +                    then: function( /* fnDone, fnFail, fnProgress */ ) {
        +                        var fns = arguments;
        +                        return jQuery.Deferred(function( newDefer ) {
        +                            jQuery.each( tuples, function( i, tuple ) {
        +                                var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
        +                                // deferred[ done | fail | progress ] for forwarding actions to newDefer
        +                                deferred[ tuple[1] ](function() {
        +                                    var returned = fn && fn.apply( this, arguments );
        +                                    if ( returned && jQuery.isFunction( returned.promise ) ) {
        +                                        returned.promise()
        +                                            .done( newDefer.resolve )
        +                                            .fail( newDefer.reject )
        +                                            .progress( newDefer.notify );
        +                                    } else {
        +                                        newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
        +                                    }
        +                                });
        +                            });
        +                            fns = null;
        +                        }).promise();
        +                    },
        +                    // Get a promise for this deferred
        +                    // If obj is provided, the promise aspect is added to the object
        +                    promise: function( obj ) {
        +                        return obj != null ? jQuery.extend( obj, promise ) : promise;
        +                    }
        +                },
        +                deferred = {};
        +
        +            // Keep pipe for back-compat
        +            promise.pipe = promise.then;
        +
        +            // Add list-specific methods
        +            jQuery.each( tuples, function( i, tuple ) {
        +                var list = tuple[ 2 ],
        +                    stateString = tuple[ 3 ];
        +
        +                // promise[ done | fail | progress ] = list.add
        +                promise[ tuple[1] ] = list.add;
        +
        +                // Handle state
        +                if ( stateString ) {
        +                    list.add(function() {
        +                        // state = [ resolved | rejected ]
        +                        state = stateString;
        +
        +                        // [ reject_list | resolve_list ].disable; progress_list.lock
        +                    }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
        +                }
        +
        +                // deferred[ resolve | reject | notify ]
        +                deferred[ tuple[0] ] = function() {
        +                    deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
        +                    return this;
        +                };
        +                deferred[ tuple[0] + "With" ] = list.fireWith;
        +            });
        +
        +            // Make the deferred a promise
        +            promise.promise( deferred );
        +
        +            // Call given func if any
        +            if ( func ) {
        +                func.call( deferred, deferred );
        +            }
        +
        +            // All done!
        +            return deferred;
        +        },
        +
        +        // Deferred helper
        +        when: function( subordinate /* , ..., subordinateN */ ) {
        +            var i = 0,
        +                resolveValues = slice.call( arguments ),
        +                length = resolveValues.length,
        +
        +            // the count of uncompleted subordinates
        +                remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
        +
        +            // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
        +                deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
        +
        +            // Update function for both resolve and progress values
        +                updateFunc = function( i, contexts, values ) {
        +                    return function( value ) {
        +                        contexts[ i ] = this;
        +                        values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
        +                        if ( values === progressValues ) {
        +                            deferred.notifyWith( contexts, values );
        +                        } else if ( !( --remaining ) ) {
        +                            deferred.resolveWith( contexts, values );
        +                        }
        +                    };
        +                },
        +
        +                progressValues, progressContexts, resolveContexts;
        +
        +            // add listeners to Deferred subordinates; treat others as resolved
        +            if ( length > 1 ) {
        +                progressValues = new Array( length );
        +                progressContexts = new Array( length );
        +                resolveContexts = new Array( length );
        +                for ( ; i < length; i++ ) {
        +                    if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
        +                        resolveValues[ i ].promise()
        +                            .done( updateFunc( i, resolveContexts, resolveValues ) )
        +                            .fail( deferred.reject )
        +                            .progress( updateFunc( i, progressContexts, progressValues ) );
        +                    } else {
        +                        --remaining;
        +                    }
        +                }
        +            }
        +
        +            // if we're not waiting on anything, resolve the master
        +            if ( !remaining ) {
        +                deferred.resolveWith( resolveContexts, resolveValues );
        +            }
        +
        +            return deferred.promise();
        +        }
        +    });
        +
        +
        +// The deferred used on DOM ready
        +    var readyList;
        +
        +    jQuery.fn.ready = function( fn ) {
        +        // Add the callback
        +        jQuery.ready.promise().done( fn );
        +
        +        return this;
        +    };
        +
        +    jQuery.extend({
        +        // Is the DOM ready to be used? Set to true once it occurs.
        +        isReady: false,
        +
        +        // A counter to track how many items to wait for before
        +        // the ready event fires. See #6781
        +        readyWait: 1,
        +
        +        // Hold (or release) the ready event
        +        holdReady: function( hold ) {
        +            if ( hold ) {
        +                jQuery.readyWait++;
        +            } else {
        +                jQuery.ready( true );
        +            }
        +        },
        +
        +        // Handle when the DOM is ready
        +        ready: function( wait ) {
        +
        +            // Abort if there are pending holds or we're already ready
        +            if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
        +                return;
        +            }
        +
        +            // Remember that the DOM is ready
        +            jQuery.isReady = true;
        +
        +            // If a normal DOM Ready event fired, decrement, and wait if need be
        +            if ( wait !== true && --jQuery.readyWait > 0 ) {
        +                return;
        +            }
        +
        +            // If there are functions bound, to execute
        +            readyList.resolveWith( document, [ jQuery ] );
        +
        +            // Trigger any bound ready events
        +            if ( jQuery.fn.trigger ) {
        +                jQuery( document ).trigger("ready").off("ready");
        +            }
        +        }
        +    });
        +
        +    /**
        +     * The ready event handler and self cleanup method
        +     */
        +    function completed() {
        +        document.removeEventListener( "DOMContentLoaded", completed, false );
        +        window.removeEventListener( "load", completed, false );
        +        jQuery.ready();
        +    }
        +
        +    jQuery.ready.promise = function( obj ) {
        +        if ( !readyList ) {
        +
        +            readyList = jQuery.Deferred();
        +
        +            // Catch cases where $(document).ready() is called after the browser event has already occurred.
        +            // we once tried to use readyState "interactive" here, but it caused issues like the one
        +            // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
        +            if ( document.readyState === "complete" ) {
        +                // Handle it asynchronously to allow scripts the opportunity to delay ready
        +                setTimeout( jQuery.ready );
        +
        +            } else {
        +
        +                // Use the handy event callback
        +                document.addEventListener( "DOMContentLoaded", completed, false );
        +
        +                // A fallback to window.onload, that will always work
        +                window.addEventListener( "load", completed, false );
        +            }
        +        }
        +        return readyList.promise( obj );
        +    };
        +
        +// Kick off the DOM ready check even if the user does not
        +    jQuery.ready.promise();
        +
        +
        +
        +
        +// Multifunctional method to get and set values of a collection
        +// The value/s can optionally be executed if it's a function
        +    var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
        +        var i = 0,
        +            len = elems.length,
        +            bulk = key == null;
        +
        +        // Sets many values
        +        if ( jQuery.type( key ) === "object" ) {
        +            chainable = true;
        +            for ( i in key ) {
        +                jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
        +            }
        +
        +            // Sets one value
        +        } else if ( value !== undefined ) {
        +            chainable = true;
        +
        +            if ( !jQuery.isFunction( value ) ) {
        +                raw = true;
        +            }
        +
        +            if ( bulk ) {
        +                // Bulk operations run against the entire set
        +                if ( raw ) {
        +                    fn.call( elems, value );
        +                    fn = null;
        +
        +                    // ...except when executing function values
        +                } else {
        +                    bulk = fn;
        +                    fn = function( elem, key, value ) {
        +                        return bulk.call( jQuery( elem ), value );
        +                    };
        +                }
        +            }
        +
        +            if ( fn ) {
        +                for ( ; i < len; i++ ) {
        +                    fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
        +                }
        +            }
        +        }
        +
        +        return chainable ?
        +            elems :
        +
        +            // Gets
        +            bulk ?
        +                fn.call( elems ) :
        +                len ? fn( elems[0], key ) : emptyGet;
        +    };
        +
        +
        +    /**
        +     * Determines whether an object can have data
        +     */
        +    jQuery.acceptData = function( owner ) {
        +        // Accepts only:
        +        //  - Node
        +        //    - Node.ELEMENT_NODE
        +        //    - Node.DOCUMENT_NODE
        +        //  - Object
        +        //    - Any
        +        /* jshint -W018 */
        +        return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
        +    };
        +
        +
        +    function Data() {
        +        // Support: Android < 4,
        +        // Old WebKit does not have Object.preventExtensions/freeze method,
        +        // return new empty object instead with no [[set]] accessor
        +        Object.defineProperty( this.cache = {}, 0, {
        +            get: function() {
        +                return {};
        +            }
        +        });
        +
        +        this.expando = jQuery.expando + Math.random();
        +    }
        +
        +    Data.uid = 1;
        +    Data.accepts = jQuery.acceptData;
        +
        +    Data.prototype = {
        +        key: function( owner ) {
        +            // We can accept data for non-element nodes in modern browsers,
        +            // but we should not, see #8335.
        +            // Always return the key for a frozen object.
        +            if ( !Data.accepts( owner ) ) {
        +                return 0;
        +            }
        +
        +            var descriptor = {},
        +            // Check if the owner object already has a cache key
        +                unlock = owner[ this.expando ];
        +
        +            // If not, create one
        +            if ( !unlock ) {
        +                unlock = Data.uid++;
        +
        +                // Secure it in a non-enumerable, non-writable property
        +                try {
        +                    descriptor[ this.expando ] = { value: unlock };
        +                    Object.defineProperties( owner, descriptor );
        +
        +                    // Support: Android < 4
        +                    // Fallback to a less secure definition
        +                } catch ( e ) {
        +                    descriptor[ this.expando ] = unlock;
        +                    jQuery.extend( owner, descriptor );
        +                }
        +            }
        +
        +            // Ensure the cache object
        +            if ( !this.cache[ unlock ] ) {
        +                this.cache[ unlock ] = {};
        +            }
        +
        +            return unlock;
        +        },
        +        set: function( owner, data, value ) {
        +            var prop,
        +            // There may be an unlock assigned to this node,
        +            // if there is no entry for this "owner", create one inline
        +            // and set the unlock as though an owner entry had always existed
        +                unlock = this.key( owner ),
        +                cache = this.cache[ unlock ];
        +
        +            // Handle: [ owner, key, value ] args
        +            if ( typeof data === "string" ) {
        +                cache[ data ] = value;
        +
        +                // Handle: [ owner, { properties } ] args
        +            } else {
        +                // Fresh assignments by object are shallow copied
        +                if ( jQuery.isEmptyObject( cache ) ) {
        +                    jQuery.extend( this.cache[ unlock ], data );
        +                    // Otherwise, copy the properties one-by-one to the cache object
        +                } else {
        +                    for ( prop in data ) {
        +                        cache[ prop ] = data[ prop ];
        +                    }
        +                }
        +            }
        +            return cache;
        +        },
        +        get: function( owner, key ) {
        +            // Either a valid cache is found, or will be created.
        +            // New caches will be created and the unlock returned,
        +            // allowing direct access to the newly created
        +            // empty data object. A valid owner object must be provided.
        +            var cache = this.cache[ this.key( owner ) ];
        +
        +            return key === undefined ?
        +                cache : cache[ key ];
        +        },
        +        access: function( owner, key, value ) {
        +            var stored;
        +            // In cases where either:
        +            //
        +            //   1. No key was specified
        +            //   2. A string key was specified, but no value provided
        +            //
        +            // Take the "read" path and allow the get method to determine
        +            // which value to return, respectively either:
        +            //
        +            //   1. The entire cache object
        +            //   2. The data stored at the key
        +            //
        +            if ( key === undefined ||
        +                ((key && typeof key === "string") && value === undefined) ) {
        +
        +                stored = this.get( owner, key );
        +
        +                return stored !== undefined ?
        +                    stored : this.get( owner, jQuery.camelCase(key) );
        +            }
        +
        +            // [*]When the key is not a string, or both a key and value
        +            // are specified, set or extend (existing objects) with either:
        +            //
        +            //   1. An object of properties
        +            //   2. A key and value
        +            //
        +            this.set( owner, key, value );
        +
        +            // Since the "set" path can have two possible entry points
        +            // return the expected data based on which path was taken[*]
        +            return value !== undefined ? value : key;
        +        },
        +        remove: function( owner, key ) {
        +            var i, name, camel,
        +                unlock = this.key( owner ),
        +                cache = this.cache[ unlock ];
        +
        +            if ( key === undefined ) {
        +                this.cache[ unlock ] = {};
        +
        +            } else {
        +                // Support array or space separated string of keys
        +                if ( jQuery.isArray( key ) ) {
        +                    // If "name" is an array of keys...
        +                    // When data is initially created, via ("key", "val") signature,
        +                    // keys will be converted to camelCase.
        +                    // Since there is no way to tell _how_ a key was added, remove
        +                    // both plain key and camelCase key. #12786
        +                    // This will only penalize the array argument path.
        +                    name = key.concat( key.map( jQuery.camelCase ) );
        +                } else {
        +                    camel = jQuery.camelCase( key );
        +                    // Try the string as a key before any manipulation
        +                    if ( key in cache ) {
        +                        name = [ key, camel ];
        +                    } else {
        +                        // If a key with the spaces exists, use it.
        +                        // Otherwise, create an array by matching non-whitespace
        +                        name = camel;
        +                        name = name in cache ?
        +                            [ name ] : ( name.match( rnotwhite ) || [] );
        +                    }
        +                }
        +
        +                i = name.length;
        +                while ( i-- ) {
        +                    delete cache[ name[ i ] ];
        +                }
        +            }
        +        },
        +        hasData: function( owner ) {
        +            return !jQuery.isEmptyObject(
        +                this.cache[ owner[ this.expando ] ] || {}
        +            );
        +        },
        +        discard: function( owner ) {
        +            if ( owner[ this.expando ] ) {
        +                delete this.cache[ owner[ this.expando ] ];
        +            }
        +        }
        +    };
        +    var data_priv = new Data();
        +
        +    var data_user = new Data();
        +
        +
        +
        +    /*
        +     Implementation Summary
        +
        +     1. Enforce API surface and semantic compatibility with 1.9.x branch
        +     2. Improve the module's maintainability by reducing the storage
        +     paths to a single mechanism.
        +     3. Use the same single mechanism to support "private" and "user" data.
        +     4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
        +     5. Avoid exposing implementation details on user objects (eg. expando properties)
        +     6. Provide a clear path for implementation upgrade to WeakMap in 2014
        +     */
        +    var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
        +        rmultiDash = /([A-Z])/g;
        +
        +    function dataAttr( elem, key, data ) {
        +        var name;
        +
        +        // If nothing was found internally, try to fetch any
        +        // data from the HTML5 data-* attribute
        +        if ( data === undefined && elem.nodeType === 1 ) {
        +            name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
        +            data = elem.getAttribute( name );
        +
        +            if ( typeof data === "string" ) {
        +                try {
        +                    data = data === "true" ? true :
        +                        data === "false" ? false :
        +                            data === "null" ? null :
        +                                // Only convert to a number if it doesn't change the string
        +                                +data + "" === data ? +data :
        +                                    rbrace.test( data ) ? jQuery.parseJSON( data ) :
        +                                        data;
        +                } catch( e ) {}
        +
        +                // Make sure we set the data so it isn't changed later
        +                data_user.set( elem, key, data );
        +            } else {
        +                data = undefined;
        +            }
        +        }
        +        return data;
        +    }
        +
        +    jQuery.extend({
        +        hasData: function( elem ) {
        +            return data_user.hasData( elem ) || data_priv.hasData( elem );
        +        },
        +
        +        data: function( elem, name, data ) {
        +            return data_user.access( elem, name, data );
        +        },
        +
        +        removeData: function( elem, name ) {
        +            data_user.remove( elem, name );
        +        },
        +
        +        // TODO: Now that all calls to _data and _removeData have been replaced
        +        // with direct calls to data_priv methods, these can be deprecated.
        +        _data: function( elem, name, data ) {
        +            return data_priv.access( elem, name, data );
        +        },
        +
        +        _removeData: function( elem, name ) {
        +            data_priv.remove( elem, name );
        +        }
        +    });
        +
        +    jQuery.fn.extend({
        +        data: function( key, value ) {
        +            var i, name, data,
        +                elem = this[ 0 ],
        +                attrs = elem && elem.attributes;
        +
        +            // Gets all values
        +            if ( key === undefined ) {
        +                if ( this.length ) {
        +                    data = data_user.get( elem );
        +
        +                    if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
        +                        i = attrs.length;
        +                        while ( i-- ) {
        +                            name = attrs[ i ].name;
        +
        +                            if ( name.indexOf( "data-" ) === 0 ) {
        +                                name = jQuery.camelCase( name.slice(5) );
        +                                dataAttr( elem, name, data[ name ] );
        +                            }
        +                        }
        +                        data_priv.set( elem, "hasDataAttrs", true );
        +                    }
        +                }
        +
        +                return data;
        +            }
        +
        +            // Sets multiple values
        +            if ( typeof key === "object" ) {
        +                return this.each(function() {
        +                    data_user.set( this, key );
        +                });
        +            }
        +
        +            return access( this, function( value ) {
        +                var data,
        +                    camelKey = jQuery.camelCase( key );
        +
        +                // The calling jQuery object (element matches) is not empty
        +                // (and therefore has an element appears at this[ 0 ]) and the
        +                // `value` parameter was not undefined. An empty jQuery object
        +                // will result in `undefined` for elem = this[ 0 ] which will
        +                // throw an exception if an attempt to read a data cache is made.
        +                if ( elem && value === undefined ) {
        +                    // Attempt to get data from the cache
        +                    // with the key as-is
        +                    data = data_user.get( elem, key );
        +                    if ( data !== undefined ) {
        +                        return data;
        +                    }
        +
        +                    // Attempt to get data from the cache
        +                    // with the key camelized
        +                    data = data_user.get( elem, camelKey );
        +                    if ( data !== undefined ) {
        +                        return data;
        +                    }
        +
        +                    // Attempt to "discover" the data in
        +                    // HTML5 custom data-* attrs
        +                    data = dataAttr( elem, camelKey, undefined );
        +                    if ( data !== undefined ) {
        +                        return data;
        +                    }
        +
        +                    // We tried really hard, but the data doesn't exist.
        +                    return;
        +                }
        +
        +                // Set the data...
        +                this.each(function() {
        +                    // First, attempt to store a copy or reference of any
        +                    // data that might've been store with a camelCased key.
        +                    var data = data_user.get( this, camelKey );
        +
        +                    // For HTML5 data-* attribute interop, we have to
        +                    // store property names with dashes in a camelCase form.
        +                    // This might not apply to all properties...*
        +                    data_user.set( this, camelKey, value );
        +
        +                    // *... In the case of properties that might _actually_
        +                    // have dashes, we need to also store a copy of that
        +                    // unchanged property.
        +                    if ( key.indexOf("-") !== -1 && data !== undefined ) {
        +                        data_user.set( this, key, value );
        +                    }
        +                });
        +            }, null, value, arguments.length > 1, null, true );
        +        },
        +
        +        removeData: function( key ) {
        +            return this.each(function() {
        +                data_user.remove( this, key );
        +            });
        +        }
        +    });
        +
        +
        +    jQuery.extend({
        +        queue: function( elem, type, data ) {
        +            var queue;
        +
        +            if ( elem ) {
        +                type = ( type || "fx" ) + "queue";
        +                queue = data_priv.get( elem, type );
        +
        +                // Speed up dequeue by getting out quickly if this is just a lookup
        +                if ( data ) {
        +                    if ( !queue || jQuery.isArray( data ) ) {
        +                        queue = data_priv.access( elem, type, jQuery.makeArray(data) );
        +                    } else {
        +                        queue.push( data );
        +                    }
        +                }
        +                return queue || [];
        +            }
        +        },
        +
        +        dequeue: function( elem, type ) {
        +            type = type || "fx";
        +
        +            var queue = jQuery.queue( elem, type ),
        +                startLength = queue.length,
        +                fn = queue.shift(),
        +                hooks = jQuery._queueHooks( elem, type ),
        +                next = function() {
        +                    jQuery.dequeue( elem, type );
        +                };
        +
        +            // If the fx queue is dequeued, always remove the progress sentinel
        +            if ( fn === "inprogress" ) {
        +                fn = queue.shift();
        +                startLength--;
        +            }
        +
        +            if ( fn ) {
        +
        +                // Add a progress sentinel to prevent the fx queue from being
        +                // automatically dequeued
        +                if ( type === "fx" ) {
        +                    queue.unshift( "inprogress" );
        +                }
        +
        +                // clear up the last queue stop function
        +                delete hooks.stop;
        +                fn.call( elem, next, hooks );
        +            }
        +
        +            if ( !startLength && hooks ) {
        +                hooks.empty.fire();
        +            }
        +        },
        +
        +        // not intended for public consumption - generates a queueHooks object, or returns the current one
        +        _queueHooks: function( elem, type ) {
        +            var key = type + "queueHooks";
        +            return data_priv.get( elem, key ) || data_priv.access( elem, key, {
        +                empty: jQuery.Callbacks("once memory").add(function() {
        +                    data_priv.remove( elem, [ type + "queue", key ] );
        +                })
        +            });
        +        }
        +    });
        +
        +    jQuery.fn.extend({
        +        queue: function( type, data ) {
        +            var setter = 2;
        +
        +            if ( typeof type !== "string" ) {
        +                data = type;
        +                type = "fx";
        +                setter--;
        +            }
        +
        +            if ( arguments.length < setter ) {
        +                return jQuery.queue( this[0], type );
        +            }
        +
        +            return data === undefined ?
        +                this :
        +                this.each(function() {
        +                    var queue = jQuery.queue( this, type, data );
        +
        +                    // ensure a hooks for this queue
        +                    jQuery._queueHooks( this, type );
        +
        +                    if ( type === "fx" && queue[0] !== "inprogress" ) {
        +                        jQuery.dequeue( this, type );
        +                    }
        +                });
        +        },
        +        dequeue: function( type ) {
        +            return this.each(function() {
        +                jQuery.dequeue( this, type );
        +            });
        +        },
        +        clearQueue: function( type ) {
        +            return this.queue( type || "fx", [] );
        +        },
        +        // Get a promise resolved when queues of a certain type
        +        // are emptied (fx is the type by default)
        +        promise: function( type, obj ) {
        +            var tmp,
        +                count = 1,
        +                defer = jQuery.Deferred(),
        +                elements = this,
        +                i = this.length,
        +                resolve = function() {
        +                    if ( !( --count ) ) {
        +                        defer.resolveWith( elements, [ elements ] );
        +                    }
        +                };
        +
        +            if ( typeof type !== "string" ) {
        +                obj = type;
        +                type = undefined;
        +            }
        +            type = type || "fx";
        +
        +            while ( i-- ) {
        +                tmp = data_priv.get( elements[ i ], type + "queueHooks" );
        +                if ( tmp && tmp.empty ) {
        +                    count++;
        +                    tmp.empty.add( resolve );
        +                }
        +            }
        +            resolve();
        +            return defer.promise( obj );
        +        }
        +    });
        +    var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
        +
        +    var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
        +
        +    var isHidden = function( elem, el ) {
        +        // isHidden might be called from jQuery#filter function;
        +        // in that case, element will be second argument
        +        elem = el || elem;
        +        return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
        +    };
        +
        +    var rcheckableType = (/^(?:checkbox|radio)$/i);
        +
        +
        +
        +    (function() {
        +        var fragment = document.createDocumentFragment(),
        +            div = fragment.appendChild( document.createElement( "div" ) );
        +
        +        // #11217 - WebKit loses check when the name is after the checked attribute
        +        div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
        +
        +        // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
        +        // old WebKit doesn't clone checked state correctly in fragments
        +        support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
        +
        +        // Make sure textarea (and checkbox) defaultValue is properly cloned
        +        // Support: IE9-IE11+
        +        div.innerHTML = "<textarea>x</textarea>";
        +        support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
        +    })();
        +    var strundefined = typeof undefined;
        +
        +
        +
        +    support.focusinBubbles = "onfocusin" in window;
        +
        +
        +    var
        +        rkeyEvent = /^key/,
        +        rmouseEvent = /^(?:mouse|contextmenu)|click/,
        +        rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
        +        rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
        +
        +    function returnTrue() {
        +        return true;
        +    }
        +
        +    function returnFalse() {
        +        return false;
        +    }
        +
        +    function safeActiveElement() {
        +        try {
        +            return document.activeElement;
        +        } catch ( err ) { }
        +    }
        +
        +    /*
        +     * Helper functions for managing events -- not part of the public interface.
        +     * Props to Dean Edwards' addEvent library for many of the ideas.
        +     */
        +    jQuery.event = {
        +
        +        global: {},
        +
        +        add: function( elem, types, handler, data, selector ) {
        +
        +            var handleObjIn, eventHandle, tmp,
        +                events, t, handleObj,
        +                special, handlers, type, namespaces, origType,
        +                elemData = data_priv.get( elem );
        +
        +            // Don't attach events to noData or text/comment nodes (but allow plain objects)
        +            if ( !elemData ) {
        +                return;
        +            }
        +
        +            // Caller can pass in an object of custom data in lieu of the handler
        +            if ( handler.handler ) {
        +                handleObjIn = handler;
        +                handler = handleObjIn.handler;
        +                selector = handleObjIn.selector;
        +            }
        +
        +            // Make sure that the handler has a unique ID, used to find/remove it later
        +            if ( !handler.guid ) {
        +                handler.guid = jQuery.guid++;
        +            }
        +
        +            // Init the element's event structure and main handler, if this is the first
        +            if ( !(events = elemData.events) ) {
        +                events = elemData.events = {};
        +            }
        +            if ( !(eventHandle = elemData.handle) ) {
        +                eventHandle = elemData.handle = function( e ) {
        +                    // Discard the second event of a jQuery.event.trigger() and
        +                    // when an event is called after a page has unloaded
        +                    return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
        +                        jQuery.event.dispatch.apply( elem, arguments ) : undefined;
        +                };
        +            }
        +
        +            // Handle multiple events separated by a space
        +            types = ( types || "" ).match( rnotwhite ) || [ "" ];
        +            t = types.length;
        +            while ( t-- ) {
        +                tmp = rtypenamespace.exec( types[t] ) || [];
        +                type = origType = tmp[1];
        +                namespaces = ( tmp[2] || "" ).split( "." ).sort();
        +
        +                // There *must* be a type, no attaching namespace-only handlers
        +                if ( !type ) {
        +                    continue;
        +                }
        +
        +                // If event changes its type, use the special event handlers for the changed type
        +                special = jQuery.event.special[ type ] || {};
        +
        +                // If selector defined, determine special event api type, otherwise given type
        +                type = ( selector ? special.delegateType : special.bindType ) || type;
        +
        +                // Update special based on newly reset type
        +                special = jQuery.event.special[ type ] || {};
        +
        +                // handleObj is passed to all event handlers
        +                handleObj = jQuery.extend({
        +                    type: type,
        +                    origType: origType,
        +                    data: data,
        +                    handler: handler,
        +                    guid: handler.guid,
        +                    selector: selector,
        +                    needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
        +                    namespace: namespaces.join(".")
        +                }, handleObjIn );
        +
        +                // Init the event handler queue if we're the first
        +                if ( !(handlers = events[ type ]) ) {
        +                    handlers = events[ type ] = [];
        +                    handlers.delegateCount = 0;
        +
        +                    // Only use addEventListener if the special events handler returns false
        +                    if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        +                        if ( elem.addEventListener ) {
        +                            elem.addEventListener( type, eventHandle, false );
        +                        }
        +                    }
        +                }
        +
        +                if ( special.add ) {
        +                    special.add.call( elem, handleObj );
        +
        +                    if ( !handleObj.handler.guid ) {
        +                        handleObj.handler.guid = handler.guid;
        +                    }
        +                }
        +
        +                // Add to the element's handler list, delegates in front
        +                if ( selector ) {
        +                    handlers.splice( handlers.delegateCount++, 0, handleObj );
        +                } else {
        +                    handlers.push( handleObj );
        +                }
        +
        +                // Keep track of which events have ever been used, for event optimization
        +                jQuery.event.global[ type ] = true;
        +            }
        +
        +        },
        +
        +        // Detach an event or set of events from an element
        +        remove: function( elem, types, handler, selector, mappedTypes ) {
        +
        +            var j, origCount, tmp,
        +                events, t, handleObj,
        +                special, handlers, type, namespaces, origType,
        +                elemData = data_priv.hasData( elem ) && data_priv.get( elem );
        +
        +            if ( !elemData || !(events = elemData.events) ) {
        +                return;
        +            }
        +
        +            // Once for each type.namespace in types; type may be omitted
        +            types = ( types || "" ).match( rnotwhite ) || [ "" ];
        +            t = types.length;
        +            while ( t-- ) {
        +                tmp = rtypenamespace.exec( types[t] ) || [];
        +                type = origType = tmp[1];
        +                namespaces = ( tmp[2] || "" ).split( "." ).sort();
        +
        +                // Unbind all events (on this namespace, if provided) for the element
        +                if ( !type ) {
        +                    for ( type in events ) {
        +                        jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
        +                    }
        +                    continue;
        +                }
        +
        +                special = jQuery.event.special[ type ] || {};
        +                type = ( selector ? special.delegateType : special.bindType ) || type;
        +                handlers = events[ type ] || [];
        +                tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
        +
        +                // Remove matching events
        +                origCount = j = handlers.length;
        +                while ( j-- ) {
        +                    handleObj = handlers[ j ];
        +
        +                    if ( ( mappedTypes || origType === handleObj.origType ) &&
        +                        ( !handler || handler.guid === handleObj.guid ) &&
        +                        ( !tmp || tmp.test( handleObj.namespace ) ) &&
        +                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
        +                        handlers.splice( j, 1 );
        +
        +                        if ( handleObj.selector ) {
        +                            handlers.delegateCount--;
        +                        }
        +                        if ( special.remove ) {
        +                            special.remove.call( elem, handleObj );
        +                        }
        +                    }
        +                }
        +
        +                // Remove generic event handler if we removed something and no more handlers exist
        +                // (avoids potential for endless recursion during removal of special event handlers)
        +                if ( origCount && !handlers.length ) {
        +                    if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
        +                        jQuery.removeEvent( elem, type, elemData.handle );
        +                    }
        +
        +                    delete events[ type ];
        +                }
        +            }
        +
        +            // Remove the expando if it's no longer used
        +            if ( jQuery.isEmptyObject( events ) ) {
        +                delete elemData.handle;
        +                data_priv.remove( elem, "events" );
        +            }
        +        },
        +
        +        trigger: function( event, data, elem, onlyHandlers ) {
        +
        +            var i, cur, tmp, bubbleType, ontype, handle, special,
        +                eventPath = [ elem || document ],
        +                type = hasOwn.call( event, "type" ) ? event.type : event,
        +                namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
        +
        +            cur = tmp = elem = elem || document;
        +
        +            // Don't do events on text and comment nodes
        +            if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        +                return;
        +            }
        +
        +            // focus/blur morphs to focusin/out; ensure we're not firing them right now
        +            if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        +                return;
        +            }
        +
        +            if ( type.indexOf(".") >= 0 ) {
        +                // Namespaced trigger; create a regexp to match event type in handle()
        +                namespaces = type.split(".");
        +                type = namespaces.shift();
        +                namespaces.sort();
        +            }
        +            ontype = type.indexOf(":") < 0 && "on" + type;
        +
        +            // Caller can pass in a jQuery.Event object, Object, or just an event type string
        +            event = event[ jQuery.expando ] ?
        +                event :
        +                new jQuery.Event( type, typeof event === "object" && event );
        +
        +            // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
        +            event.isTrigger = onlyHandlers ? 2 : 3;
        +            event.namespace = namespaces.join(".");
        +            event.namespace_re = event.namespace ?
        +                new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
        +                null;
        +
        +            // Clean up the event in case it is being reused
        +            event.result = undefined;
        +            if ( !event.target ) {
        +                event.target = elem;
        +            }
        +
        +            // Clone any incoming data and prepend the event, creating the handler arg list
        +            data = data == null ?
        +                [ event ] :
        +                jQuery.makeArray( data, [ event ] );
        +
        +            // Allow special events to draw outside the lines
        +            special = jQuery.event.special[ type ] || {};
        +            if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
        +                return;
        +            }
        +
        +            // Determine event propagation path in advance, per W3C events spec (#9951)
        +            // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
        +            if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
        +
        +                bubbleType = special.delegateType || type;
        +                if ( !rfocusMorph.test( bubbleType + type ) ) {
        +                    cur = cur.parentNode;
        +                }
        +                for ( ; cur; cur = cur.parentNode ) {
        +                    eventPath.push( cur );
        +                    tmp = cur;
        +                }
        +
        +                // Only add window if we got to document (e.g., not plain obj or detached DOM)
        +                if ( tmp === (elem.ownerDocument || document) ) {
        +                    eventPath.push( tmp.defaultView || tmp.parentWindow || window );
        +                }
        +            }
        +
        +            // Fire handlers on the event path
        +            i = 0;
        +            while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
        +
        +                event.type = i > 1 ?
        +                    bubbleType :
        +                    special.bindType || type;
        +
        +                // jQuery handler
        +                handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
        +                if ( handle ) {
        +                    handle.apply( cur, data );
        +                }
        +
        +                // Native handler
        +                handle = ontype && cur[ ontype ];
        +                if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
        +                    event.result = handle.apply( cur, data );
        +                    if ( event.result === false ) {
        +                        event.preventDefault();
        +                    }
        +                }
        +            }
        +            event.type = type;
        +
        +            // If nobody prevented the default action, do it now
        +            if ( !onlyHandlers && !event.isDefaultPrevented() ) {
        +
        +                if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
        +                    jQuery.acceptData( elem ) ) {
        +
        +                    // Call a native DOM method on the target with the same name name as the event.
        +                    // Don't do default actions on window, that's where global variables be (#6170)
        +                    if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
        +
        +                        // Don't re-trigger an onFOO event when we call its FOO() method
        +                        tmp = elem[ ontype ];
        +
        +                        if ( tmp ) {
        +                            elem[ ontype ] = null;
        +                        }
        +
        +                        // Prevent re-triggering of the same event, since we already bubbled it above
        +                        jQuery.event.triggered = type;
        +                        elem[ type ]();
        +                        jQuery.event.triggered = undefined;
        +
        +                        if ( tmp ) {
        +                            elem[ ontype ] = tmp;
        +                        }
        +                    }
        +                }
        +            }
        +
        +            return event.result;
        +        },
        +
        +        dispatch: function( event ) {
        +
        +            // Make a writable jQuery.Event from the native event object
        +            event = jQuery.event.fix( event );
        +
        +            var i, j, ret, matched, handleObj,
        +                handlerQueue = [],
        +                args = slice.call( arguments ),
        +                handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
        +                special = jQuery.event.special[ event.type ] || {};
        +
        +            // Use the fix-ed jQuery.Event rather than the (read-only) native event
        +            args[0] = event;
        +            event.delegateTarget = this;
        +
        +            // Call the preDispatch hook for the mapped type, and let it bail if desired
        +            if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
        +                return;
        +            }
        +
        +            // Determine handlers
        +            handlerQueue = jQuery.event.handlers.call( this, event, handlers );
        +
        +            // Run delegates first; they may want to stop propagation beneath us
        +            i = 0;
        +            while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
        +                event.currentTarget = matched.elem;
        +
        +                j = 0;
        +                while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
        +
        +                    // Triggered event must either 1) have no namespace, or
        +                    // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
        +                    if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
        +
        +                        event.handleObj = handleObj;
        +                        event.data = handleObj.data;
        +
        +                        ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
        +                            .apply( matched.elem, args );
        +
        +                        if ( ret !== undefined ) {
        +                            if ( (event.result = ret) === false ) {
        +                                event.preventDefault();
        +                                event.stopPropagation();
        +                            }
        +                        }
        +                    }
        +                }
        +            }
        +
        +            // Call the postDispatch hook for the mapped type
        +            if ( special.postDispatch ) {
        +                special.postDispatch.call( this, event );
        +            }
        +
        +            return event.result;
        +        },
        +
        +        handlers: function( event, handlers ) {
        +            var i, matches, sel, handleObj,
        +                handlerQueue = [],
        +                delegateCount = handlers.delegateCount,
        +                cur = event.target;
        +
        +            // Find delegate handlers
        +            // Black-hole SVG <use> instance trees (#13180)
        +            // Avoid non-left-click bubbling in Firefox (#3861)
        +            if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
        +
        +                for ( ; cur !== this; cur = cur.parentNode || this ) {
        +
        +                    // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
        +                    if ( cur.disabled !== true || event.type !== "click" ) {
        +                        matches = [];
        +                        for ( i = 0; i < delegateCount; i++ ) {
        +                            handleObj = handlers[ i ];
        +
        +                            // Don't conflict with Object.prototype properties (#13203)
        +                            sel = handleObj.selector + " ";
        +
        +                            if ( matches[ sel ] === undefined ) {
        +                                matches[ sel ] = handleObj.needsContext ?
        +                                    jQuery( sel, this ).index( cur ) >= 0 :
        +                                    jQuery.find( sel, this, null, [ cur ] ).length;
        +                            }
        +                            if ( matches[ sel ] ) {
        +                                matches.push( handleObj );
        +                            }
        +                        }
        +                        if ( matches.length ) {
        +                            handlerQueue.push({ elem: cur, handlers: matches });
        +                        }
        +                    }
        +                }
        +            }
        +
        +            // Add the remaining (directly-bound) handlers
        +            if ( delegateCount < handlers.length ) {
        +                handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
        +            }
        +
        +            return handlerQueue;
        +        },
        +
        +        // Includes some event props shared by KeyEvent and MouseEvent
        +        props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
        +
        +        fixHooks: {},
        +
        +        keyHooks: {
        +            props: "char charCode key keyCode".split(" "),
        +            filter: function( event, original ) {
        +
        +                // Add which for key events
        +                if ( event.which == null ) {
        +                    event.which = original.charCode != null ? original.charCode : original.keyCode;
        +                }
        +
        +                return event;
        +            }
        +        },
        +
        +        mouseHooks: {
        +            props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
        +            filter: function( event, original ) {
        +                var eventDoc, doc, body,
        +                    button = original.button;
        +
        +                // Calculate pageX/Y if missing and clientX/Y available
        +                if ( event.pageX == null && original.clientX != null ) {
        +                    eventDoc = event.target.ownerDocument || document;
        +                    doc = eventDoc.documentElement;
        +                    body = eventDoc.body;
        +
        +                    event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
        +                    event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
        +                }
        +
        +                // Add which for click: 1 === left; 2 === middle; 3 === right
        +                // Note: button is not normalized, so don't use it
        +                if ( !event.which && button !== undefined ) {
        +                    event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
        +                }
        +
        +                return event;
        +            }
        +        },
        +
        +        fix: function( event ) {
        +            if ( event[ jQuery.expando ] ) {
        +                return event;
        +            }
        +
        +            // Create a writable copy of the event object and normalize some properties
        +            var i, prop, copy,
        +                type = event.type,
        +                originalEvent = event,
        +                fixHook = this.fixHooks[ type ];
        +
        +            if ( !fixHook ) {
        +                this.fixHooks[ type ] = fixHook =
        +                    rmouseEvent.test( type ) ? this.mouseHooks :
        +                        rkeyEvent.test( type ) ? this.keyHooks :
        +                        {};
        +            }
        +            copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
        +
        +            event = new jQuery.Event( originalEvent );
        +
        +            i = copy.length;
        +            while ( i-- ) {
        +                prop = copy[ i ];
        +                event[ prop ] = originalEvent[ prop ];
        +            }
        +
        +            // Support: Cordova 2.5 (WebKit) (#13255)
        +            // All events should have a target; Cordova deviceready doesn't
        +            if ( !event.target ) {
        +                event.target = document;
        +            }
        +
        +            // Support: Safari 6.0+, Chrome < 28
        +            // Target should not be a text node (#504, #13143)
        +            if ( event.target.nodeType === 3 ) {
        +                event.target = event.target.parentNode;
        +            }
        +
        +            return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
        +        },
        +
        +        special: {
        +            load: {
        +                // Prevent triggered image.load events from bubbling to window.load
        +                noBubble: true
        +            },
        +            focus: {
        +                // Fire native event if possible so blur/focus sequence is correct
        +                trigger: function() {
        +                    if ( this !== safeActiveElement() && this.focus ) {
        +                        this.focus();
        +                        return false;
        +                    }
        +                },
        +                delegateType: "focusin"
        +            },
        +            blur: {
        +                trigger: function() {
        +                    if ( this === safeActiveElement() && this.blur ) {
        +                        this.blur();
        +                        return false;
        +                    }
        +                },
        +                delegateType: "focusout"
        +            },
        +            click: {
        +                // For checkbox, fire native event so checked state will be right
        +                trigger: function() {
        +                    if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
        +                        this.click();
        +                        return false;
        +                    }
        +                },
        +
        +                // For cross-browser consistency, don't fire native .click() on links
        +                _default: function( event ) {
        +                    return jQuery.nodeName( event.target, "a" );
        +                }
        +            },
        +
        +            beforeunload: {
        +                postDispatch: function( event ) {
        +
        +                    // Support: Firefox 20+
        +                    // Firefox doesn't alert if the returnValue field is not set.
        +                    if ( event.result !== undefined ) {
        +                        event.originalEvent.returnValue = event.result;
        +                    }
        +                }
        +            }
        +        },
        +
        +        simulate: function( type, elem, event, bubble ) {
        +            // Piggyback on a donor event to simulate a different one.
        +            // Fake originalEvent to avoid donor's stopPropagation, but if the
        +            // simulated event prevents default then we do the same on the donor.
        +            var e = jQuery.extend(
        +                new jQuery.Event(),
        +                event,
        +                {
        +                    type: type,
        +                    isSimulated: true,
        +                    originalEvent: {}
        +                }
        +            );
        +            if ( bubble ) {
        +                jQuery.event.trigger( e, null, elem );
        +            } else {
        +                jQuery.event.dispatch.call( elem, e );
        +            }
        +            if ( e.isDefaultPrevented() ) {
        +                event.preventDefault();
        +            }
        +        }
        +    };
        +
        +    jQuery.removeEvent = function( elem, type, handle ) {
        +        if ( elem.removeEventListener ) {
        +            elem.removeEventListener( type, handle, false );
        +        }
        +    };
        +
        +    jQuery.Event = function( src, props ) {
        +        // Allow instantiation without the 'new' keyword
        +        if ( !(this instanceof jQuery.Event) ) {
        +            return new jQuery.Event( src, props );
        +        }
        +
        +        // Event object
        +        if ( src && src.type ) {
        +            this.originalEvent = src;
        +            this.type = src.type;
        +
        +            // Events bubbling up the document may have been marked as prevented
        +            // by a handler lower down the tree; reflect the correct value.
        +            this.isDefaultPrevented = src.defaultPrevented ||
        +                // Support: Android < 4.0
        +                src.defaultPrevented === undefined &&
        +                    src.getPreventDefault && src.getPreventDefault() ?
        +                returnTrue :
        +                returnFalse;
        +
        +            // Event type
        +        } else {
        +            this.type = src;
        +        }
        +
        +        // Put explicitly provided properties onto the event object
        +        if ( props ) {
        +            jQuery.extend( this, props );
        +        }
        +
        +        // Create a timestamp if incoming event doesn't have one
        +        this.timeStamp = src && src.timeStamp || jQuery.now();
        +
        +        // Mark it as fixed
        +        this[ jQuery.expando ] = true;
        +    };
        +
        +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
        +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
        +    jQuery.Event.prototype = {
        +        isDefaultPrevented: returnFalse,
        +        isPropagationStopped: returnFalse,
        +        isImmediatePropagationStopped: returnFalse,
        +
        +        preventDefault: function() {
        +            var e = this.originalEvent;
        +
        +            this.isDefaultPrevented = returnTrue;
        +
        +            if ( e && e.preventDefault ) {
        +                e.preventDefault();
        +            }
        +        },
        +        stopPropagation: function() {
        +            var e = this.originalEvent;
        +
        +            this.isPropagationStopped = returnTrue;
        +
        +            if ( e && e.stopPropagation ) {
        +                e.stopPropagation();
        +            }
        +        },
        +        stopImmediatePropagation: function() {
        +            this.isImmediatePropagationStopped = returnTrue;
        +            this.stopPropagation();
        +        }
        +    };
        +
        +// Create mouseenter/leave events using mouseover/out and event-time checks
        +// Support: Chrome 15+
        +    jQuery.each({
        +        mouseenter: "mouseover",
        +        mouseleave: "mouseout"
        +    }, function( orig, fix ) {
        +        jQuery.event.special[ orig ] = {
        +            delegateType: fix,
        +            bindType: fix,
        +
        +            handle: function( event ) {
        +                var ret,
        +                    target = this,
        +                    related = event.relatedTarget,
        +                    handleObj = event.handleObj;
        +
        +                // For mousenter/leave call the handler if related is outside the target.
        +                // NB: No relatedTarget if the mouse left/entered the browser window
        +                if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
        +                    event.type = handleObj.origType;
        +                    ret = handleObj.handler.apply( this, arguments );
        +                    event.type = fix;
        +                }
        +                return ret;
        +            }
        +        };
        +    });
        +
        +// Create "bubbling" focus and blur events
        +// Support: Firefox, Chrome, Safari
        +    if ( !support.focusinBubbles ) {
        +        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
        +
        +            // Attach a single capturing handler on the document while someone wants focusin/focusout
        +            var handler = function( event ) {
        +                jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
        +            };
        +
        +            jQuery.event.special[ fix ] = {
        +                setup: function() {
        +                    var doc = this.ownerDocument || this,
        +                        attaches = data_priv.access( doc, fix );
        +
        +                    if ( !attaches ) {
        +                        doc.addEventListener( orig, handler, true );
        +                    }
        +                    data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
        +                },
        +                teardown: function() {
        +                    var doc = this.ownerDocument || this,
        +                        attaches = data_priv.access( doc, fix ) - 1;
        +
        +                    if ( !attaches ) {
        +                        doc.removeEventListener( orig, handler, true );
        +                        data_priv.remove( doc, fix );
        +
        +                    } else {
        +                        data_priv.access( doc, fix, attaches );
        +                    }
        +                }
        +            };
        +        });
        +    }
        +
        +    jQuery.fn.extend({
        +
        +        on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
        +            var origFn, type;
        +
        +            // Types can be a map of types/handlers
        +            if ( typeof types === "object" ) {
        +                // ( types-Object, selector, data )
        +                if ( typeof selector !== "string" ) {
        +                    // ( types-Object, data )
        +                    data = data || selector;
        +                    selector = undefined;
        +                }
        +                for ( type in types ) {
        +                    this.on( type, selector, data, types[ type ], one );
        +                }
        +                return this;
        +            }
        +
        +            if ( data == null && fn == null ) {
        +                // ( types, fn )
        +                fn = selector;
        +                data = selector = undefined;
        +            } else if ( fn == null ) {
        +                if ( typeof selector === "string" ) {
        +                    // ( types, selector, fn )
        +                    fn = data;
        +                    data = undefined;
        +                } else {
        +                    // ( types, data, fn )
        +                    fn = data;
        +                    data = selector;
        +                    selector = undefined;
        +                }
        +            }
        +            if ( fn === false ) {
        +                fn = returnFalse;
        +            } else if ( !fn ) {
        +                return this;
        +            }
        +
        +            if ( one === 1 ) {
        +                origFn = fn;
        +                fn = function( event ) {
        +                    // Can use an empty set, since event contains the info
        +                    jQuery().off( event );
        +                    return origFn.apply( this, arguments );
        +                };
        +                // Use same guid so caller can remove using origFn
        +                fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        +            }
        +            return this.each( function() {
        +                jQuery.event.add( this, types, fn, data, selector );
        +            });
        +        },
        +        one: function( types, selector, data, fn ) {
        +            return this.on( types, selector, data, fn, 1 );
        +        },
        +        off: function( types, selector, fn ) {
        +            var handleObj, type;
        +            if ( types && types.preventDefault && types.handleObj ) {
        +                // ( event )  dispatched jQuery.Event
        +                handleObj = types.handleObj;
        +                jQuery( types.delegateTarget ).off(
        +                    handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
        +                    handleObj.selector,
        +                    handleObj.handler
        +                );
        +                return this;
        +            }
        +            if ( typeof types === "object" ) {
        +                // ( types-object [, selector] )
        +                for ( type in types ) {
        +                    this.off( type, selector, types[ type ] );
        +                }
        +                return this;
        +            }
        +            if ( selector === false || typeof selector === "function" ) {
        +                // ( types [, fn] )
        +                fn = selector;
        +                selector = undefined;
        +            }
        +            if ( fn === false ) {
        +                fn = returnFalse;
        +            }
        +            return this.each(function() {
        +                jQuery.event.remove( this, types, fn, selector );
        +            });
        +        },
        +
        +        trigger: function( type, data ) {
        +            return this.each(function() {
        +                jQuery.event.trigger( type, data, this );
        +            });
        +        },
        +        triggerHandler: function( type, data ) {
        +            var elem = this[0];
        +            if ( elem ) {
        +                return jQuery.event.trigger( type, data, elem, true );
        +            }
        +        }
        +    });
        +
        +
        +    var
        +        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
        +        rtagName = /<([\w:]+)/,
        +        rhtml = /<|&#?\w+;/,
        +        rnoInnerhtml = /<(?:script|style|link)/i,
        +    // checked="checked" or checked
        +        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        +        rscriptType = /^$|\/(?:java|ecma)script/i,
        +        rscriptTypeMasked = /^true\/(.*)/,
        +        rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
        +
        +    // We have to close these tags to support XHTML (#13200)
        +        wrapMap = {
        +
        +            // Support: IE 9
        +            option: [ 1, "<select multiple='multiple'>", "</select>" ],
        +
        +            thead: [ 1, "<table>", "</table>" ],
        +            col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
        +            tr: [ 2, "<table><tbody>", "</tbody></table>" ],
        +            td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
        +
        +            _default: [ 0, "", "" ]
        +        };
        +
        +// Support: IE 9
        +    wrapMap.optgroup = wrapMap.option;
        +
        +    wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
        +    wrapMap.th = wrapMap.td;
        +
        +// Support: 1.x compatibility
        +// Manipulating tables requires a tbody
        +    function manipulationTarget( elem, content ) {
        +        return jQuery.nodeName( elem, "table" ) &&
        +            jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
        +
        +            elem.getElementsByTagName("tbody")[0] ||
        +                elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
        +            elem;
        +    }
        +
        +// Replace/restore the type attribute of script elements for safe DOM manipulation
        +    function disableScript( elem ) {
        +        elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
        +        return elem;
        +    }
        +    function restoreScript( elem ) {
        +        var match = rscriptTypeMasked.exec( elem.type );
        +
        +        if ( match ) {
        +            elem.type = match[ 1 ];
        +        } else {
        +            elem.removeAttribute("type");
        +        }
        +
        +        return elem;
        +    }
        +
        +// Mark scripts as having already been evaluated
        +    function setGlobalEval( elems, refElements ) {
        +        var i = 0,
        +            l = elems.length;
        +
        +        for ( ; i < l; i++ ) {
        +            data_priv.set(
        +                elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
        +            );
        +        }
        +    }
        +
        +    function cloneCopyEvent( src, dest ) {
        +        var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
        +
        +        if ( dest.nodeType !== 1 ) {
        +            return;
        +        }
        +
        +        // 1. Copy private data: events, handlers, etc.
        +        if ( data_priv.hasData( src ) ) {
        +            pdataOld = data_priv.access( src );
        +            pdataCur = data_priv.set( dest, pdataOld );
        +            events = pdataOld.events;
        +
        +            if ( events ) {
        +                delete pdataCur.handle;
        +                pdataCur.events = {};
        +
        +                for ( type in events ) {
        +                    for ( i = 0, l = events[ type ].length; i < l; i++ ) {
        +                        jQuery.event.add( dest, type, events[ type ][ i ] );
        +                    }
        +                }
        +            }
        +        }
        +
        +        // 2. Copy user data
        +        if ( data_user.hasData( src ) ) {
        +            udataOld = data_user.access( src );
        +            udataCur = jQuery.extend( {}, udataOld );
        +
        +            data_user.set( dest, udataCur );
        +        }
        +    }
        +
        +    function getAll( context, tag ) {
        +        var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
        +            context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
        +                [];
        +
        +        return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
        +            jQuery.merge( [ context ], ret ) :
        +            ret;
        +    }
        +
        +// Support: IE >= 9
        +    function fixInput( src, dest ) {
        +        var nodeName = dest.nodeName.toLowerCase();
        +
        +        // Fails to persist the checked state of a cloned checkbox or radio button.
        +        if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
        +            dest.checked = src.checked;
        +
        +            // Fails to return the selected option to the default selected state when cloning options
        +        } else if ( nodeName === "input" || nodeName === "textarea" ) {
        +            dest.defaultValue = src.defaultValue;
        +        }
        +    }
        +
        +    jQuery.extend({
        +        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
        +            var i, l, srcElements, destElements,
        +                clone = elem.cloneNode( true ),
        +                inPage = jQuery.contains( elem.ownerDocument, elem );
        +
        +            // Support: IE >= 9
        +            // Fix Cloning issues
        +            if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
        +                !jQuery.isXMLDoc( elem ) ) {
        +
        +                // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
        +                destElements = getAll( clone );
        +                srcElements = getAll( elem );
        +
        +                for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +                    fixInput( srcElements[ i ], destElements[ i ] );
        +                }
        +            }
        +
        +            // Copy the events from the original to the clone
        +            if ( dataAndEvents ) {
        +                if ( deepDataAndEvents ) {
        +                    srcElements = srcElements || getAll( elem );
        +                    destElements = destElements || getAll( clone );
        +
        +                    for ( i = 0, l = srcElements.length; i < l; i++ ) {
        +                        cloneCopyEvent( srcElements[ i ], destElements[ i ] );
        +                    }
        +                } else {
        +                    cloneCopyEvent( elem, clone );
        +                }
        +            }
        +
        +            // Preserve script evaluation history
        +            destElements = getAll( clone, "script" );
        +            if ( destElements.length > 0 ) {
        +                setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
        +            }
        +
        +            // Return the cloned set
        +            return clone;
        +        },
        +
        +        buildFragment: function( elems, context, scripts, selection ) {
        +            var elem, tmp, tag, wrap, contains, j,
        +                fragment = context.createDocumentFragment(),
        +                nodes = [],
        +                i = 0,
        +                l = elems.length;
        +
        +            for ( ; i < l; i++ ) {
        +                elem = elems[ i ];
        +
        +                if ( elem || elem === 0 ) {
        +
        +                    // Add nodes directly
        +                    if ( jQuery.type( elem ) === "object" ) {
        +                        // Support: QtWebKit
        +                        // jQuery.merge because push.apply(_, arraylike) throws
        +                        jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
        +
        +                        // Convert non-html into a text node
        +                    } else if ( !rhtml.test( elem ) ) {
        +                        nodes.push( context.createTextNode( elem ) );
        +
        +                        // Convert html into DOM nodes
        +                    } else {
        +                        tmp = tmp || fragment.appendChild( context.createElement("div") );
        +
        +                        // Deserialize a standard representation
        +                        tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
        +                        wrap = wrapMap[ tag ] || wrapMap._default;
        +                        tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
        +
        +                        // Descend through wrappers to the right content
        +                        j = wrap[ 0 ];
        +                        while ( j-- ) {
        +                            tmp = tmp.lastChild;
        +                        }
        +
        +                        // Support: QtWebKit
        +                        // jQuery.merge because push.apply(_, arraylike) throws
        +                        jQuery.merge( nodes, tmp.childNodes );
        +
        +                        // Remember the top-level container
        +                        tmp = fragment.firstChild;
        +
        +                        // Fixes #12346
        +                        // Support: Webkit, IE
        +                        tmp.textContent = "";
        +                    }
        +                }
        +            }
        +
        +            // Remove wrapper from fragment
        +            fragment.textContent = "";
        +
        +            i = 0;
        +            while ( (elem = nodes[ i++ ]) ) {
        +
        +                // #4087 - If origin and destination elements are the same, and this is
        +                // that element, do not do anything
        +                if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
        +                    continue;
        +                }
        +
        +                contains = jQuery.contains( elem.ownerDocument, elem );
        +
        +                // Append to fragment
        +                tmp = getAll( fragment.appendChild( elem ), "script" );
        +
        +                // Preserve script evaluation history
        +                if ( contains ) {
        +                    setGlobalEval( tmp );
        +                }
        +
        +                // Capture executables
        +                if ( scripts ) {
        +                    j = 0;
        +                    while ( (elem = tmp[ j++ ]) ) {
        +                        if ( rscriptType.test( elem.type || "" ) ) {
        +                            scripts.push( elem );
        +                        }
        +                    }
        +                }
        +            }
        +
        +            return fragment;
        +        },
        +
        +        cleanData: function( elems ) {
        +            var data, elem, events, type, key, j,
        +                special = jQuery.event.special,
        +                i = 0;
        +
        +            for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
        +                if ( jQuery.acceptData( elem ) ) {
        +                    key = elem[ data_priv.expando ];
        +
        +                    if ( key && (data = data_priv.cache[ key ]) ) {
        +                        events = Object.keys( data.events || {} );
        +                        if ( events.length ) {
        +                            for ( j = 0; (type = events[j]) !== undefined; j++ ) {
        +                                if ( special[ type ] ) {
        +                                    jQuery.event.remove( elem, type );
        +
        +                                    // This is a shortcut to avoid jQuery.event.remove's overhead
        +                                } else {
        +                                    jQuery.removeEvent( elem, type, data.handle );
        +                                }
        +                            }
        +                        }
        +                        if ( data_priv.cache[ key ] ) {
        +                            // Discard any remaining `private` data
        +                            delete data_priv.cache[ key ];
        +                        }
        +                    }
        +                }
        +                // Discard any remaining `user` data
        +                delete data_user.cache[ elem[ data_user.expando ] ];
        +            }
        +        }
        +    });
        +
        +    jQuery.fn.extend({
        +        text: function( value ) {
        +            return access( this, function( value ) {
        +                return value === undefined ?
        +                    jQuery.text( this ) :
        +                    this.empty().each(function() {
        +                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +                            this.textContent = value;
        +                        }
        +                    });
        +            }, null, value, arguments.length );
        +        },
        +
        +        append: function() {
        +            return this.domManip( arguments, function( elem ) {
        +                if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +                    var target = manipulationTarget( this, elem );
        +                    target.appendChild( elem );
        +                }
        +            });
        +        },
        +
        +        prepend: function() {
        +            return this.domManip( arguments, function( elem ) {
        +                if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +                    var target = manipulationTarget( this, elem );
        +                    target.insertBefore( elem, target.firstChild );
        +                }
        +            });
        +        },
        +
        +        before: function() {
        +            return this.domManip( arguments, function( elem ) {
        +                if ( this.parentNode ) {
        +                    this.parentNode.insertBefore( elem, this );
        +                }
        +            });
        +        },
        +
        +        after: function() {
        +            return this.domManip( arguments, function( elem ) {
        +                if ( this.parentNode ) {
        +                    this.parentNode.insertBefore( elem, this.nextSibling );
        +                }
        +            });
        +        },
        +
        +        remove: function( selector, keepData /* Internal Use Only */ ) {
        +            var elem,
        +                elems = selector ? jQuery.filter( selector, this ) : this,
        +                i = 0;
        +
        +            for ( ; (elem = elems[i]) != null; i++ ) {
        +                if ( !keepData && elem.nodeType === 1 ) {
        +                    jQuery.cleanData( getAll( elem ) );
        +                }
        +
        +                if ( elem.parentNode ) {
        +                    if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
        +                        setGlobalEval( getAll( elem, "script" ) );
        +                    }
        +                    elem.parentNode.removeChild( elem );
        +                }
        +            }
        +
        +            return this;
        +        },
        +
        +        empty: function() {
        +            var elem,
        +                i = 0;
        +
        +            for ( ; (elem = this[i]) != null; i++ ) {
        +                if ( elem.nodeType === 1 ) {
        +
        +                    // Prevent memory leaks
        +                    jQuery.cleanData( getAll( elem, false ) );
        +
        +                    // Remove any remaining nodes
        +                    elem.textContent = "";
        +                }
        +            }
        +
        +            return this;
        +        },
        +
        +        clone: function( dataAndEvents, deepDataAndEvents ) {
        +            dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
        +            deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
        +
        +            return this.map(function() {
        +                return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
        +            });
        +        },
        +
        +        html: function( value ) {
        +            return access( this, function( value ) {
        +                var elem = this[ 0 ] || {},
        +                    i = 0,
        +                    l = this.length;
        +
        +                if ( value === undefined && elem.nodeType === 1 ) {
        +                    return elem.innerHTML;
        +                }
        +
        +                // See if we can take a shortcut and just use innerHTML
        +                if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        +                    !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
        +
        +                    value = value.replace( rxhtmlTag, "<$1></$2>" );
        +
        +                    try {
        +                        for ( ; i < l; i++ ) {
        +                            elem = this[ i ] || {};
        +
        +                            // Remove element nodes and prevent memory leaks
        +                            if ( elem.nodeType === 1 ) {
        +                                jQuery.cleanData( getAll( elem, false ) );
        +                                elem.innerHTML = value;
        +                            }
        +                        }
        +
        +                        elem = 0;
        +
        +                        // If using innerHTML throws an exception, use the fallback method
        +                    } catch( e ) {}
        +                }
        +
        +                if ( elem ) {
        +                    this.empty().append( value );
        +                }
        +            }, null, value, arguments.length );
        +        },
        +
        +        replaceWith: function() {
        +            var arg = arguments[ 0 ];
        +
        +            // Make the changes, replacing each context element with the new content
        +            this.domManip( arguments, function( elem ) {
        +                arg = this.parentNode;
        +
        +                jQuery.cleanData( getAll( this ) );
        +
        +                if ( arg ) {
        +                    arg.replaceChild( elem, this );
        +                }
        +            });
        +
        +            // Force removal if there was no new content (e.g., from empty arguments)
        +            return arg && (arg.length || arg.nodeType) ? this : this.remove();
        +        },
        +
        +        detach: function( selector ) {
        +            return this.remove( selector, true );
        +        },
        +
        +        domManip: function( args, callback ) {
        +
        +            // Flatten any nested arrays
        +            args = concat.apply( [], args );
        +
        +            var fragment, first, scripts, hasScripts, node, doc,
        +                i = 0,
        +                l = this.length,
        +                set = this,
        +                iNoClone = l - 1,
        +                value = args[ 0 ],
        +                isFunction = jQuery.isFunction( value );
        +
        +            // We can't cloneNode fragments that contain checked, in WebKit
        +            if ( isFunction ||
        +                ( l > 1 && typeof value === "string" &&
        +                    !support.checkClone && rchecked.test( value ) ) ) {
        +                return this.each(function( index ) {
        +                    var self = set.eq( index );
        +                    if ( isFunction ) {
        +                        args[ 0 ] = value.call( this, index, self.html() );
        +                    }
        +                    self.domManip( args, callback );
        +                });
        +            }
        +
        +            if ( l ) {
        +                fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
        +                first = fragment.firstChild;
        +
        +                if ( fragment.childNodes.length === 1 ) {
        +                    fragment = first;
        +                }
        +
        +                if ( first ) {
        +                    scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
        +                    hasScripts = scripts.length;
        +
        +                    // Use the original fragment for the last item instead of the first because it can end up
        +                    // being emptied incorrectly in certain situations (#8070).
        +                    for ( ; i < l; i++ ) {
        +                        node = fragment;
        +
        +                        if ( i !== iNoClone ) {
        +                            node = jQuery.clone( node, true, true );
        +
        +                            // Keep references to cloned scripts for later restoration
        +                            if ( hasScripts ) {
        +                                // Support: QtWebKit
        +                                // jQuery.merge because push.apply(_, arraylike) throws
        +                                jQuery.merge( scripts, getAll( node, "script" ) );
        +                            }
        +                        }
        +
        +                        callback.call( this[ i ], node, i );
        +                    }
        +
        +                    if ( hasScripts ) {
        +                        doc = scripts[ scripts.length - 1 ].ownerDocument;
        +
        +                        // Reenable scripts
        +                        jQuery.map( scripts, restoreScript );
        +
        +                        // Evaluate executable scripts on first document insertion
        +                        for ( i = 0; i < hasScripts; i++ ) {
        +                            node = scripts[ i ];
        +                            if ( rscriptType.test( node.type || "" ) &&
        +                                !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
        +
        +                                if ( node.src ) {
        +                                    // Optional AJAX dependency, but won't run scripts if not present
        +                                    if ( jQuery._evalUrl ) {
        +                                        jQuery._evalUrl( node.src );
        +                                    }
        +                                } else {
        +                                    jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
        +                                }
        +                            }
        +                        }
        +                    }
        +                }
        +            }
        +
        +            return this;
        +        }
        +    });
        +
        +    jQuery.each({
        +        appendTo: "append",
        +        prependTo: "prepend",
        +        insertBefore: "before",
        +        insertAfter: "after",
        +        replaceAll: "replaceWith"
        +    }, function( name, original ) {
        +        jQuery.fn[ name ] = function( selector ) {
        +            var elems,
        +                ret = [],
        +                insert = jQuery( selector ),
        +                last = insert.length - 1,
        +                i = 0;
        +
        +            for ( ; i <= last; i++ ) {
        +                elems = i === last ? this : this.clone( true );
        +                jQuery( insert[ i ] )[ original ]( elems );
        +
        +                // Support: QtWebKit
        +                // .get() because push.apply(_, arraylike) throws
        +                push.apply( ret, elems.get() );
        +            }
        +
        +            return this.pushStack( ret );
        +        };
        +    });
        +
        +
        +    var iframe,
        +        elemdisplay = {};
        +
        +    /**
        +     * Retrieve the actual display of a element
        +     * @param {String} name nodeName of the element
        +     * @param {Object} doc Document object
        +     */
        +// Called only from within defaultDisplay
        +    function actualDisplay( name, doc ) {
        +        var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
        +
        +        // getDefaultComputedStyle might be reliably used only on attached element
        +            display = window.getDefaultComputedStyle ?
        +
        +                // Use of this method is a temporary fix (more like optmization) until something better comes along,
        +                // since it was removed from specification and supported only in FF
        +                window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" );
        +
        +        // We don't have any data stored on the element,
        +        // so use "detach" method as fast way to get rid of the element
        +        elem.detach();
        +
        +        return display;
        +    }
        +
        +    /**
        +     * Try to determine the default display value of an element
        +     * @param {String} nodeName
        +     */
        +    function defaultDisplay( nodeName ) {
        +        var doc = document,
        +            display = elemdisplay[ nodeName ];
        +
        +        if ( !display ) {
        +            display = actualDisplay( nodeName, doc );
        +
        +            // If the simple way fails, read from inside an iframe
        +            if ( display === "none" || !display ) {
        +
        +                // Use the already-created iframe if possible
        +                iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
        +
        +                // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
        +                doc = iframe[ 0 ].contentDocument;
        +
        +                // Support: IE
        +                doc.write();
        +                doc.close();
        +
        +                display = actualDisplay( nodeName, doc );
        +                iframe.detach();
        +            }
        +
        +            // Store the correct default display
        +            elemdisplay[ nodeName ] = display;
        +        }
        +
        +        return display;
        +    }
        +    var rmargin = (/^margin/);
        +
        +    var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
        +
        +    var getStyles = function( elem ) {
        +        return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
        +    };
        +
        +
        +
        +    function curCSS( elem, name, computed ) {
        +        var width, minWidth, maxWidth, ret,
        +            style = elem.style;
        +
        +        computed = computed || getStyles( elem );
        +
        +        // Support: IE9
        +        // getPropertyValue is only needed for .css('filter') in IE9, see #12537
        +        if ( computed ) {
        +            ret = computed.getPropertyValue( name ) || computed[ name ];
        +        }
        +
        +        if ( computed ) {
        +
        +            if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
        +                ret = jQuery.style( elem, name );
        +            }
        +
        +            // Support: iOS < 6
        +            // A tribute to the "awesome hack by Dean Edwards"
        +            // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
        +            // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
        +            if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
        +
        +                // Remember the original values
        +                width = style.width;
        +                minWidth = style.minWidth;
        +                maxWidth = style.maxWidth;
        +
        +                // Put in the new values to get a computed value out
        +                style.minWidth = style.maxWidth = style.width = ret;
        +                ret = computed.width;
        +
        +                // Revert the changed values
        +                style.width = width;
        +                style.minWidth = minWidth;
        +                style.maxWidth = maxWidth;
        +            }
        +        }
        +
        +        return ret !== undefined ?
        +            // Support: IE
        +            // IE returns zIndex value as an integer.
        +            ret + "" :
        +            ret;
        +    }
        +
        +
        +    function addGetHookIf( conditionFn, hookFn ) {
        +        // Define the hook, we'll check on the first run if it's really needed.
        +        return {
        +            get: function() {
        +                if ( conditionFn() ) {
        +                    // Hook not needed (or it's not possible to use it due to missing dependency),
        +                    // remove it.
        +                    // Since there are no other hooks for marginRight, remove the whole object.
        +                    delete this.get;
        +                    return;
        +                }
        +
        +                // Hook needed; redefine it so that the support test is not executed again.
        +
        +                return (this.get = hookFn).apply( this, arguments );
        +            }
        +        };
        +    }
        +
        +
        +    (function() {
        +        var pixelPositionVal, boxSizingReliableVal,
        +        // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
        +            divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;" +
        +                "-moz-box-sizing:content-box;box-sizing:content-box",
        +            docElem = document.documentElement,
        +            container = document.createElement( "div" ),
        +            div = document.createElement( "div" );
        +
        +        div.style.backgroundClip = "content-box";
        +        div.cloneNode( true ).style.backgroundClip = "";
        +        support.clearCloneStyle = div.style.backgroundClip === "content-box";
        +
        +        container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;" +
        +            "margin-top:1px";
        +        container.appendChild( div );
        +
        +        // Executing both pixelPosition & boxSizingReliable tests require only one layout
        +        // so they're executed at the same time to save the second computation.
        +        function computePixelPositionAndBoxSizingReliable() {
        +            // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
        +            div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
        +                "box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;" +
        +                "position:absolute;top:1%";
        +            docElem.appendChild( container );
        +
        +            var divStyle = window.getComputedStyle( div, null );
        +            pixelPositionVal = divStyle.top !== "1%";
        +            boxSizingReliableVal = divStyle.width === "4px";
        +
        +            docElem.removeChild( container );
        +        }
        +
        +        // Use window.getComputedStyle because jsdom on node.js will break without it.
        +        if ( window.getComputedStyle ) {
        +            jQuery.extend(support, {
        +                pixelPosition: function() {
        +                    // This test is executed only once but we still do memoizing
        +                    // since we can use the boxSizingReliable pre-computing.
        +                    // No need to check if the test was already performed, though.
        +                    computePixelPositionAndBoxSizingReliable();
        +                    return pixelPositionVal;
        +                },
        +                boxSizingReliable: function() {
        +                    if ( boxSizingReliableVal == null ) {
        +                        computePixelPositionAndBoxSizingReliable();
        +                    }
        +                    return boxSizingReliableVal;
        +                },
        +                reliableMarginRight: function() {
        +                    // Support: Android 2.3
        +                    // Check if div with explicit width and no margin-right incorrectly
        +                    // gets computed margin-right based on width of container. (#3333)
        +                    // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +                    // This support function is only executed once so no memoizing is needed.
        +                    var ret,
        +                        marginDiv = div.appendChild( document.createElement( "div" ) );
        +                    marginDiv.style.cssText = div.style.cssText = divReset;
        +                    marginDiv.style.marginRight = marginDiv.style.width = "0";
        +                    div.style.width = "1px";
        +                    docElem.appendChild( container );
        +
        +                    ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
        +
        +                    docElem.removeChild( container );
        +
        +                    // Clean up the div for other support tests.
        +                    div.innerHTML = "";
        +
        +                    return ret;
        +                }
        +            });
        +        }
        +    })();
        +
        +
        +// A method for quickly swapping in/out CSS properties to get correct calculations.
        +    jQuery.swap = function( elem, options, callback, args ) {
        +        var ret, name,
        +            old = {};
        +
        +        // Remember the old values, and insert the new ones
        +        for ( name in options ) {
        +            old[ name ] = elem.style[ name ];
        +            elem.style[ name ] = options[ name ];
        +        }
        +
        +        ret = callback.apply( elem, args || [] );
        +
        +        // Revert the old values
        +        for ( name in options ) {
        +            elem.style[ name ] = old[ name ];
        +        }
        +
        +        return ret;
        +    };
        +
        +
        +    var
        +    // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
        +    // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        +        rdisplayswap = /^(none|table(?!-c[ea]).+)/,
        +        rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
        +        rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
        +
        +        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        +        cssNormalTransform = {
        +            letterSpacing: 0,
        +            fontWeight: 400
        +        },
        +
        +        cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
        +
        +// return a css property mapped to a potentially vendor prefixed property
        +    function vendorPropName( style, name ) {
        +
        +        // shortcut for names that are not vendor prefixed
        +        if ( name in style ) {
        +            return name;
        +        }
        +
        +        // check for vendor prefixed names
        +        var capName = name[0].toUpperCase() + name.slice(1),
        +            origName = name,
        +            i = cssPrefixes.length;
        +
        +        while ( i-- ) {
        +            name = cssPrefixes[ i ] + capName;
        +            if ( name in style ) {
        +                return name;
        +            }
        +        }
        +
        +        return origName;
        +    }
        +
        +    function setPositiveNumber( elem, value, subtract ) {
        +        var matches = rnumsplit.exec( value );
        +        return matches ?
        +            // Guard against undefined "subtract", e.g., when used as in cssHooks
        +            Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
        +            value;
        +    }
        +
        +    function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
        +        var i = extra === ( isBorderBox ? "border" : "content" ) ?
        +                // If we already have the right measurement, avoid augmentation
        +                4 :
        +                // Otherwise initialize for horizontal or vertical properties
        +                name === "width" ? 1 : 0,
        +
        +            val = 0;
        +
        +        for ( ; i < 4; i += 2 ) {
        +            // both box models exclude margin, so add it if we want it
        +            if ( extra === "margin" ) {
        +                val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
        +            }
        +
        +            if ( isBorderBox ) {
        +                // border-box includes padding, so remove it if we want content
        +                if ( extra === "content" ) {
        +                    val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +                }
        +
        +                // at this point, extra isn't border nor margin, so remove border
        +                if ( extra !== "margin" ) {
        +                    val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +                }
        +            } else {
        +                // at this point, extra isn't content, so add padding
        +                val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +
        +                // at this point, extra isn't content nor padding, so add border
        +                if ( extra !== "padding" ) {
        +                    val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +                }
        +            }
        +        }
        +
        +        return val;
        +    }
        +
        +    function getWidthOrHeight( elem, name, extra ) {
        +
        +        // Start with offset property, which is equivalent to the border-box value
        +        var valueIsBorderBox = true,
        +            val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
        +            styles = getStyles( elem ),
        +            isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
        +
        +        // some non-html elements return undefined for offsetWidth, so check for null/undefined
        +        // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        +        // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        +        if ( val <= 0 || val == null ) {
        +            // Fall back to computed then uncomputed css if necessary
        +            val = curCSS( elem, name, styles );
        +            if ( val < 0 || val == null ) {
        +                val = elem.style[ name ];
        +            }
        +
        +            // Computed unit is not pixels. Stop here and return.
        +            if ( rnumnonpx.test(val) ) {
        +                return val;
        +            }
        +
        +            // we need the check for style in case a browser which returns unreliable values
        +            // for getComputedStyle silently falls back to the reliable elem.style
        +            valueIsBorderBox = isBorderBox &&
        +                ( support.boxSizingReliable() || val === elem.style[ name ] );
        +
        +            // Normalize "", auto, and prepare for extra
        +            val = parseFloat( val ) || 0;
        +        }
        +
        +        // use the active box-sizing model to add/subtract irrelevant styles
        +        return ( val +
        +            augmentWidthOrHeight(
        +                elem,
        +                name,
        +                extra || ( isBorderBox ? "border" : "content" ),
        +                valueIsBorderBox,
        +                styles
        +            )
        +            ) + "px";
        +    }
        +
        +    function showHide( elements, show ) {
        +        var display, elem, hidden,
        +            values = [],
        +            index = 0,
        +            length = elements.length;
        +
        +        for ( ; index < length; index++ ) {
        +            elem = elements[ index ];
        +            if ( !elem.style ) {
        +                continue;
        +            }
        +
        +            values[ index ] = data_priv.get( elem, "olddisplay" );
        +            display = elem.style.display;
        +            if ( show ) {
        +                // Reset the inline display of this element to learn if it is
        +                // being hidden by cascaded rules or not
        +                if ( !values[ index ] && display === "none" ) {
        +                    elem.style.display = "";
        +                }
        +
        +                // Set elements which have been overridden with display: none
        +                // in a stylesheet to whatever the default browser style is
        +                // for such an element
        +                if ( elem.style.display === "" && isHidden( elem ) ) {
        +                    values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
        +                }
        +            } else {
        +
        +                if ( !values[ index ] ) {
        +                    hidden = isHidden( elem );
        +
        +                    if ( display && display !== "none" || !hidden ) {
        +                        data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") );
        +                    }
        +                }
        +            }
        +        }
        +
        +        // Set the display of most of the elements in a second loop
        +        // to avoid the constant reflow
        +        for ( index = 0; index < length; index++ ) {
        +            elem = elements[ index ];
        +            if ( !elem.style ) {
        +                continue;
        +            }
        +            if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
        +                elem.style.display = show ? values[ index ] || "" : "none";
        +            }
        +        }
        +
        +        return elements;
        +    }
        +
        +    jQuery.extend({
        +        // Add in style property hooks for overriding the default
        +        // behavior of getting and setting a style property
        +        cssHooks: {
        +            opacity: {
        +                get: function( elem, computed ) {
        +                    if ( computed ) {
        +                        // We should always get a number back from opacity
        +                        var ret = curCSS( elem, "opacity" );
        +                        return ret === "" ? "1" : ret;
        +                    }
        +                }
        +            }
        +        },
        +
        +        // Don't automatically add "px" to these possibly-unitless properties
        +        cssNumber: {
        +            "columnCount": true,
        +            "fillOpacity": true,
        +            "fontWeight": true,
        +            "lineHeight": true,
        +            "opacity": true,
        +            "order": true,
        +            "orphans": true,
        +            "widows": true,
        +            "zIndex": true,
        +            "zoom": true
        +        },
        +
        +        // Add in properties whose names you wish to fix before
        +        // setting or getting the value
        +        cssProps: {
        +            // normalize float css property
        +            "float": "cssFloat"
        +        },
        +
        +        // Get and set the style property on a DOM Node
        +        style: function( elem, name, value, extra ) {
        +            // Don't set styles on text and comment nodes
        +            if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        +                return;
        +            }
        +
        +            // Make sure that we're working with the right name
        +            var ret, type, hooks,
        +                origName = jQuery.camelCase( name ),
        +                style = elem.style;
        +
        +            name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
        +
        +            // gets hook for the prefixed version
        +            // followed by the unprefixed version
        +            hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +            // Check if we're setting a value
        +            if ( value !== undefined ) {
        +                type = typeof value;
        +
        +                // convert relative number strings (+= or -=) to relative numbers. #7345
        +                if ( type === "string" && (ret = rrelNum.exec( value )) ) {
        +                    value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
        +                    // Fixes bug #9237
        +                    type = "number";
        +                }
        +
        +                // Make sure that null and NaN values aren't set. See: #7116
        +                if ( value == null || value !== value ) {
        +                    return;
        +                }
        +
        +                // If a number was passed in, add 'px' to the (except for certain CSS properties)
        +                if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
        +                    value += "px";
        +                }
        +
        +                // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
        +                // but it would mean to define eight (for every problematic property) identical functions
        +                if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
        +                    style[ name ] = "inherit";
        +                }
        +
        +                // If a hook was provided, use that value, otherwise just set the specified value
        +                if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
        +                    // Support: Chrome, Safari
        +                    // Setting style to blank string required to delete "style: x !important;"
        +                    style[ name ] = "";
        +                    style[ name ] = value;
        +                }
        +
        +            } else {
        +                // If a hook was provided get the non-computed value from there
        +                if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
        +                    return ret;
        +                }
        +
        +                // Otherwise just get the value from the style object
        +                return style[ name ];
        +            }
        +        },
        +
        +        css: function( elem, name, extra, styles ) {
        +            var val, num, hooks,
        +                origName = jQuery.camelCase( name );
        +
        +            // Make sure that we're working with the right name
        +            name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
        +
        +            // gets hook for the prefixed version
        +            // followed by the unprefixed version
        +            hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +            // If a hook was provided get the computed value from there
        +            if ( hooks && "get" in hooks ) {
        +                val = hooks.get( elem, true, extra );
        +            }
        +
        +            // Otherwise, if a way to get the computed value exists, use that
        +            if ( val === undefined ) {
        +                val = curCSS( elem, name, styles );
        +            }
        +
        +            //convert "normal" to computed value
        +            if ( val === "normal" && name in cssNormalTransform ) {
        +                val = cssNormalTransform[ name ];
        +            }
        +
        +            // Return, converting to number if forced or a qualifier was provided and val looks numeric
        +            if ( extra === "" || extra ) {
        +                num = parseFloat( val );
        +                return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
        +            }
        +            return val;
        +        }
        +    });
        +
        +    jQuery.each([ "height", "width" ], function( i, name ) {
        +        jQuery.cssHooks[ name ] = {
        +            get: function( elem, computed, extra ) {
        +                if ( computed ) {
        +                    // certain elements can have dimension info if we invisibly show them
        +                    // however, it must have a current display style that would benefit from this
        +                    return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
        +                        jQuery.swap( elem, cssShow, function() {
        +                            return getWidthOrHeight( elem, name, extra );
        +                        }) :
        +                        getWidthOrHeight( elem, name, extra );
        +                }
        +            },
        +
        +            set: function( elem, value, extra ) {
        +                var styles = extra && getStyles( elem );
        +                return setPositiveNumber( elem, value, extra ?
        +                    augmentWidthOrHeight(
        +                        elem,
        +                        name,
        +                        extra,
        +                        jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
        +                        styles
        +                    ) : 0
        +                );
        +            }
        +        };
        +    });
        +
        +// Support: Android 2.3
        +    jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
        +        function( elem, computed ) {
        +            if ( computed ) {
        +                // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +                // Work around by temporarily setting element display to inline-block
        +                return jQuery.swap( elem, { "display": "inline-block" },
        +                    curCSS, [ elem, "marginRight" ] );
        +            }
        +        }
        +    );
        +
        +// These hooks are used by animate to expand properties
        +    jQuery.each({
        +        margin: "",
        +        padding: "",
        +        border: "Width"
        +    }, function( prefix, suffix ) {
        +        jQuery.cssHooks[ prefix + suffix ] = {
        +            expand: function( value ) {
        +                var i = 0,
        +                    expanded = {},
        +
        +                // assumes a single number if not a string
        +                    parts = typeof value === "string" ? value.split(" ") : [ value ];
        +
        +                for ( ; i < 4; i++ ) {
        +                    expanded[ prefix + cssExpand[ i ] + suffix ] =
        +                        parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
        +                }
        +
        +                return expanded;
        +            }
        +        };
        +
        +        if ( !rmargin.test( prefix ) ) {
        +            jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
        +        }
        +    });
        +
        +    jQuery.fn.extend({
        +        css: function( name, value ) {
        +            return access( this, function( elem, name, value ) {
        +                var styles, len,
        +                    map = {},
        +                    i = 0;
        +
        +                if ( jQuery.isArray( name ) ) {
        +                    styles = getStyles( elem );
        +                    len = name.length;
        +
        +                    for ( ; i < len; i++ ) {
        +                        map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
        +                    }
        +
        +                    return map;
        +                }
        +
        +                return value !== undefined ?
        +                    jQuery.style( elem, name, value ) :
        +                    jQuery.css( elem, name );
        +            }, name, value, arguments.length > 1 );
        +        },
        +        show: function() {
        +            return showHide( this, true );
        +        },
        +        hide: function() {
        +            return showHide( this );
        +        },
        +        toggle: function( state ) {
        +            if ( typeof state === "boolean" ) {
        +                return state ? this.show() : this.hide();
        +            }
        +
        +            return this.each(function() {
        +                if ( isHidden( this ) ) {
        +                    jQuery( this ).show();
        +                } else {
        +                    jQuery( this ).hide();
        +                }
        +            });
        +        }
        +    });
        +
        +
        +    function Tween( elem, options, prop, end, easing ) {
        +        return new Tween.prototype.init( elem, options, prop, end, easing );
        +    }
        +    jQuery.Tween = Tween;
        +
        +    Tween.prototype = {
        +        constructor: Tween,
        +        init: function( elem, options, prop, end, easing, unit ) {
        +            this.elem = elem;
        +            this.prop = prop;
        +            this.easing = easing || "swing";
        +            this.options = options;
        +            this.start = this.now = this.cur();
        +            this.end = end;
        +            this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        +        },
        +        cur: function() {
        +            var hooks = Tween.propHooks[ this.prop ];
        +
        +            return hooks && hooks.get ?
        +                hooks.get( this ) :
        +                Tween.propHooks._default.get( this );
        +        },
        +        run: function( percent ) {
        +            var eased,
        +                hooks = Tween.propHooks[ this.prop ];
        +
        +            if ( this.options.duration ) {
        +                this.pos = eased = jQuery.easing[ this.easing ](
        +                    percent, this.options.duration * percent, 0, 1, this.options.duration
        +                );
        +            } else {
        +                this.pos = eased = percent;
        +            }
        +            this.now = ( this.end - this.start ) * eased + this.start;
        +
        +            if ( this.options.step ) {
        +                this.options.step.call( this.elem, this.now, this );
        +            }
        +
        +            if ( hooks && hooks.set ) {
        +                hooks.set( this );
        +            } else {
        +                Tween.propHooks._default.set( this );
        +            }
        +            return this;
        +        }
        +    };
        +
        +    Tween.prototype.init.prototype = Tween.prototype;
        +
        +    Tween.propHooks = {
        +        _default: {
        +            get: function( tween ) {
        +                var result;
        +
        +                if ( tween.elem[ tween.prop ] != null &&
        +                    (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
        +                    return tween.elem[ tween.prop ];
        +                }
        +
        +                // passing an empty string as a 3rd parameter to .css will automatically
        +                // attempt a parseFloat and fallback to a string if the parse fails
        +                // so, simple values such as "10px" are parsed to Float.
        +                // complex values such as "rotate(1rad)" are returned as is.
        +                result = jQuery.css( tween.elem, tween.prop, "" );
        +                // Empty strings, null, undefined and "auto" are converted to 0.
        +                return !result || result === "auto" ? 0 : result;
        +            },
        +            set: function( tween ) {
        +                // use step hook for back compat - use cssHook if its there - use .style if its
        +                // available and use plain properties where available
        +                if ( jQuery.fx.step[ tween.prop ] ) {
        +                    jQuery.fx.step[ tween.prop ]( tween );
        +                } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
        +                    jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
        +                } else {
        +                    tween.elem[ tween.prop ] = tween.now;
        +                }
        +            }
        +        }
        +    };
        +
        +// Support: IE9
        +// Panic based approach to setting things on disconnected nodes
        +
        +    Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
        +        set: function( tween ) {
        +            if ( tween.elem.nodeType && tween.elem.parentNode ) {
        +                tween.elem[ tween.prop ] = tween.now;
        +            }
        +        }
        +    };
        +
        +    jQuery.easing = {
        +        linear: function( p ) {
        +            return p;
        +        },
        +        swing: function( p ) {
        +            return 0.5 - Math.cos( p * Math.PI ) / 2;
        +        }
        +    };
        +
        +    jQuery.fx = Tween.prototype.init;
        +
        +// Back Compat <1.8 extension point
        +    jQuery.fx.step = {};
        +
        +
        +
        +
        +    var
        +        fxNow, timerId,
        +        rfxtypes = /^(?:toggle|show|hide)$/,
        +        rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
        +        rrun = /queueHooks$/,
        +        animationPrefilters = [ defaultPrefilter ],
        +        tweeners = {
        +            "*": [ function( prop, value ) {
        +                var tween = this.createTween( prop, value ),
        +                    target = tween.cur(),
        +                    parts = rfxnum.exec( value ),
        +                    unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
        +
        +                // Starting value computation is required for potential unit mismatches
        +                    start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
        +                        rfxnum.exec( jQuery.css( tween.elem, prop ) ),
        +                    scale = 1,
        +                    maxIterations = 20;
        +
        +                if ( start && start[ 3 ] !== unit ) {
        +                    // Trust units reported by jQuery.css
        +                    unit = unit || start[ 3 ];
        +
        +                    // Make sure we update the tween properties later on
        +                    parts = parts || [];
        +
        +                    // Iteratively approximate from a nonzero starting point
        +                    start = +target || 1;
        +
        +                    do {
        +                        // If previous iteration zeroed out, double until we get *something*
        +                        // Use a string for doubling factor so we don't accidentally see scale as unchanged below
        +                        scale = scale || ".5";
        +
        +                        // Adjust and apply
        +                        start = start / scale;
        +                        jQuery.style( tween.elem, prop, start + unit );
        +
        +                        // Update scale, tolerating zero or NaN from tween.cur()
        +                        // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
        +                    } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
        +                }
        +
        +                // Update tween properties
        +                if ( parts ) {
        +                    start = tween.start = +start || +target || 0;
        +                    tween.unit = unit;
        +                    // If a +=/-= token was provided, we're doing a relative animation
        +                    tween.end = parts[ 1 ] ?
        +                        start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
        +                        +parts[ 2 ];
        +                }
        +
        +                return tween;
        +            } ]
        +        };
        +
        +// Animations created synchronously will run synchronously
        +    function createFxNow() {
        +        setTimeout(function() {
        +            fxNow = undefined;
        +        });
        +        return ( fxNow = jQuery.now() );
        +    }
        +
        +// Generate parameters to create a standard animation
        +    function genFx( type, includeWidth ) {
        +        var which,
        +            i = 0,
        +            attrs = { height: type };
        +
        +        // if we include width, step value is 1 to do all cssExpand values,
        +        // if we don't include width, step value is 2 to skip over Left and Right
        +        includeWidth = includeWidth ? 1 : 0;
        +        for ( ; i < 4 ; i += 2 - includeWidth ) {
        +            which = cssExpand[ i ];
        +            attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
        +        }
        +
        +        if ( includeWidth ) {
        +            attrs.opacity = attrs.width = type;
        +        }
        +
        +        return attrs;
        +    }
        +
        +    function createTween( value, prop, animation ) {
        +        var tween,
        +            collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
        +            index = 0,
        +            length = collection.length;
        +        for ( ; index < length; index++ ) {
        +            if ( (tween = collection[ index ].call( animation, prop, value )) ) {
        +
        +                // we're done with this property
        +                return tween;
        +            }
        +        }
        +    }
        +
        +    function defaultPrefilter( elem, props, opts ) {
        +        /* jshint validthis: true */
        +        var prop, value, toggle, tween, hooks, oldfire, display,
        +            anim = this,
        +            orig = {},
        +            style = elem.style,
        +            hidden = elem.nodeType && isHidden( elem ),
        +            dataShow = data_priv.get( elem, "fxshow" );
        +
        +        // handle queue: false promises
        +        if ( !opts.queue ) {
        +            hooks = jQuery._queueHooks( elem, "fx" );
        +            if ( hooks.unqueued == null ) {
        +                hooks.unqueued = 0;
        +                oldfire = hooks.empty.fire;
        +                hooks.empty.fire = function() {
        +                    if ( !hooks.unqueued ) {
        +                        oldfire();
        +                    }
        +                };
        +            }
        +            hooks.unqueued++;
        +
        +            anim.always(function() {
        +                // doing this makes sure that the complete handler will be called
        +                // before this completes
        +                anim.always(function() {
        +                    hooks.unqueued--;
        +                    if ( !jQuery.queue( elem, "fx" ).length ) {
        +                        hooks.empty.fire();
        +                    }
        +                });
        +            });
        +        }
        +
        +        // height/width overflow pass
        +        if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
        +            // Make sure that nothing sneaks out
        +            // Record all 3 overflow attributes because IE9-10 do not
        +            // change the overflow attribute when overflowX and
        +            // overflowY are set to the same value
        +            opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
        +
        +            // Set display property to inline-block for height/width
        +            // animations on inline elements that are having width/height animated
        +            display = jQuery.css( elem, "display" );
        +            // Get default display if display is currently "none"
        +            if ( display === "none" ) {
        +                display = defaultDisplay( elem.nodeName );
        +            }
        +            if ( display === "inline" &&
        +                jQuery.css( elem, "float" ) === "none" ) {
        +
        +                style.display = "inline-block";
        +            }
        +        }
        +
        +        if ( opts.overflow ) {
        +            style.overflow = "hidden";
        +            anim.always(function() {
        +                style.overflow = opts.overflow[ 0 ];
        +                style.overflowX = opts.overflow[ 1 ];
        +                style.overflowY = opts.overflow[ 2 ];
        +            });
        +        }
        +
        +        // show/hide pass
        +        for ( prop in props ) {
        +            value = props[ prop ];
        +            if ( rfxtypes.exec( value ) ) {
        +                delete props[ prop ];
        +                toggle = toggle || value === "toggle";
        +                if ( value === ( hidden ? "hide" : "show" ) ) {
        +
        +                    // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
        +                    if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
        +                        hidden = true;
        +                    } else {
        +                        continue;
        +                    }
        +                }
        +                orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
        +            }
        +        }
        +
        +        if ( !jQuery.isEmptyObject( orig ) ) {
        +            if ( dataShow ) {
        +                if ( "hidden" in dataShow ) {
        +                    hidden = dataShow.hidden;
        +                }
        +            } else {
        +                dataShow = data_priv.access( elem, "fxshow", {} );
        +            }
        +
        +            // store state if its toggle - enables .stop().toggle() to "reverse"
        +            if ( toggle ) {
        +                dataShow.hidden = !hidden;
        +            }
        +            if ( hidden ) {
        +                jQuery( elem ).show();
        +            } else {
        +                anim.done(function() {
        +                    jQuery( elem ).hide();
        +                });
        +            }
        +            anim.done(function() {
        +                var prop;
        +
        +                data_priv.remove( elem, "fxshow" );
        +                for ( prop in orig ) {
        +                    jQuery.style( elem, prop, orig[ prop ] );
        +                }
        +            });
        +            for ( prop in orig ) {
        +                tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
        +
        +                if ( !( prop in dataShow ) ) {
        +                    dataShow[ prop ] = tween.start;
        +                    if ( hidden ) {
        +                        tween.end = tween.start;
        +                        tween.start = prop === "width" || prop === "height" ? 1 : 0;
        +                    }
        +                }
        +            }
        +        }
        +    }
        +
        +    function propFilter( props, specialEasing ) {
        +        var index, name, easing, value, hooks;
        +
        +        // camelCase, specialEasing and expand cssHook pass
        +        for ( index in props ) {
        +            name = jQuery.camelCase( index );
        +            easing = specialEasing[ name ];
        +            value = props[ index ];
        +            if ( jQuery.isArray( value ) ) {
        +                easing = value[ 1 ];
        +                value = props[ index ] = value[ 0 ];
        +            }
        +
        +            if ( index !== name ) {
        +                props[ name ] = value;
        +                delete props[ index ];
        +            }
        +
        +            hooks = jQuery.cssHooks[ name ];
        +            if ( hooks && "expand" in hooks ) {
        +                value = hooks.expand( value );
        +                delete props[ name ];
        +
        +                // not quite $.extend, this wont overwrite keys already present.
        +                // also - reusing 'index' from above because we have the correct "name"
        +                for ( index in value ) {
        +                    if ( !( index in props ) ) {
        +                        props[ index ] = value[ index ];
        +                        specialEasing[ index ] = easing;
        +                    }
        +                }
        +            } else {
        +                specialEasing[ name ] = easing;
        +            }
        +        }
        +    }
        +
        +    function Animation( elem, properties, options ) {
        +        var result,
        +            stopped,
        +            index = 0,
        +            length = animationPrefilters.length,
        +            deferred = jQuery.Deferred().always( function() {
        +                // don't match elem in the :animated selector
        +                delete tick.elem;
        +            }),
        +            tick = function() {
        +                if ( stopped ) {
        +                    return false;
        +                }
        +                var currentTime = fxNow || createFxNow(),
        +                    remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
        +                // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
        +                    temp = remaining / animation.duration || 0,
        +                    percent = 1 - temp,
        +                    index = 0,
        +                    length = animation.tweens.length;
        +
        +                for ( ; index < length ; index++ ) {
        +                    animation.tweens[ index ].run( percent );
        +                }
        +
        +                deferred.notifyWith( elem, [ animation, percent, remaining ]);
        +
        +                if ( percent < 1 && length ) {
        +                    return remaining;
        +                } else {
        +                    deferred.resolveWith( elem, [ animation ] );
        +                    return false;
        +                }
        +            },
        +            animation = deferred.promise({
        +                elem: elem,
        +                props: jQuery.extend( {}, properties ),
        +                opts: jQuery.extend( true, { specialEasing: {} }, options ),
        +                originalProperties: properties,
        +                originalOptions: options,
        +                startTime: fxNow || createFxNow(),
        +                duration: options.duration,
        +                tweens: [],
        +                createTween: function( prop, end ) {
        +                    var tween = jQuery.Tween( elem, animation.opts, prop, end,
        +                        animation.opts.specialEasing[ prop ] || animation.opts.easing );
        +                    animation.tweens.push( tween );
        +                    return tween;
        +                },
        +                stop: function( gotoEnd ) {
        +                    var index = 0,
        +                    // if we are going to the end, we want to run all the tweens
        +                    // otherwise we skip this part
        +                        length = gotoEnd ? animation.tweens.length : 0;
        +                    if ( stopped ) {
        +                        return this;
        +                    }
        +                    stopped = true;
        +                    for ( ; index < length ; index++ ) {
        +                        animation.tweens[ index ].run( 1 );
        +                    }
        +
        +                    // resolve when we played the last frame
        +                    // otherwise, reject
        +                    if ( gotoEnd ) {
        +                        deferred.resolveWith( elem, [ animation, gotoEnd ] );
        +                    } else {
        +                        deferred.rejectWith( elem, [ animation, gotoEnd ] );
        +                    }
        +                    return this;
        +                }
        +            }),
        +            props = animation.props;
        +
        +        propFilter( props, animation.opts.specialEasing );
        +
        +        for ( ; index < length ; index++ ) {
        +            result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
        +            if ( result ) {
        +                return result;
        +            }
        +        }
        +
        +        jQuery.map( props, createTween, animation );
        +
        +        if ( jQuery.isFunction( animation.opts.start ) ) {
        +            animation.opts.start.call( elem, animation );
        +        }
        +
        +        jQuery.fx.timer(
        +            jQuery.extend( tick, {
        +                elem: elem,
        +                anim: animation,
        +                queue: animation.opts.queue
        +            })
        +        );
        +
        +        // attach callbacks from options
        +        return animation.progress( animation.opts.progress )
        +            .done( animation.opts.done, animation.opts.complete )
        +            .fail( animation.opts.fail )
        +            .always( animation.opts.always );
        +    }
        +
        +    jQuery.Animation = jQuery.extend( Animation, {
        +
        +        tweener: function( props, callback ) {
        +            if ( jQuery.isFunction( props ) ) {
        +                callback = props;
        +                props = [ "*" ];
        +            } else {
        +                props = props.split(" ");
        +            }
        +
        +            var prop,
        +                index = 0,
        +                length = props.length;
        +
        +            for ( ; index < length ; index++ ) {
        +                prop = props[ index ];
        +                tweeners[ prop ] = tweeners[ prop ] || [];
        +                tweeners[ prop ].unshift( callback );
        +            }
        +        },
        +
        +        prefilter: function( callback, prepend ) {
        +            if ( prepend ) {
        +                animationPrefilters.unshift( callback );
        +            } else {
        +                animationPrefilters.push( callback );
        +            }
        +        }
        +    });
        +
        +    jQuery.speed = function( speed, easing, fn ) {
        +        var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
        +            complete: fn || !fn && easing ||
        +                jQuery.isFunction( speed ) && speed,
        +            duration: speed,
        +            easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
        +        };
        +
        +        opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
        +            opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
        +
        +        // normalize opt.queue - true/undefined/null -> "fx"
        +        if ( opt.queue == null || opt.queue === true ) {
        +            opt.queue = "fx";
        +        }
        +
        +        // Queueing
        +        opt.old = opt.complete;
        +
        +        opt.complete = function() {
        +            if ( jQuery.isFunction( opt.old ) ) {
        +                opt.old.call( this );
        +            }
        +
        +            if ( opt.queue ) {
        +                jQuery.dequeue( this, opt.queue );
        +            }
        +        };
        +
        +        return opt;
        +    };
        +
        +    jQuery.fn.extend({
        +        fadeTo: function( speed, to, easing, callback ) {
        +
        +            // show any hidden elements after setting opacity to 0
        +            return this.filter( isHidden ).css( "opacity", 0 ).show()
        +
        +                // animate to the value specified
        +                .end().animate({ opacity: to }, speed, easing, callback );
        +        },
        +        animate: function( prop, speed, easing, callback ) {
        +            var empty = jQuery.isEmptyObject( prop ),
        +                optall = jQuery.speed( speed, easing, callback ),
        +                doAnimation = function() {
        +                    // Operate on a copy of prop so per-property easing won't be lost
        +                    var anim = Animation( this, jQuery.extend( {}, prop ), optall );
        +
        +                    // Empty animations, or finishing resolves immediately
        +                    if ( empty || data_priv.get( this, "finish" ) ) {
        +                        anim.stop( true );
        +                    }
        +                };
        +            doAnimation.finish = doAnimation;
        +
        +            return empty || optall.queue === false ?
        +                this.each( doAnimation ) :
        +                this.queue( optall.queue, doAnimation );
        +        },
        +        stop: function( type, clearQueue, gotoEnd ) {
        +            var stopQueue = function( hooks ) {
        +                var stop = hooks.stop;
        +                delete hooks.stop;
        +                stop( gotoEnd );
        +            };
        +
        +            if ( typeof type !== "string" ) {
        +                gotoEnd = clearQueue;
        +                clearQueue = type;
        +                type = undefined;
        +            }
        +            if ( clearQueue && type !== false ) {
        +                this.queue( type || "fx", [] );
        +            }
        +
        +            return this.each(function() {
        +                var dequeue = true,
        +                    index = type != null && type + "queueHooks",
        +                    timers = jQuery.timers,
        +                    data = data_priv.get( this );
        +
        +                if ( index ) {
        +                    if ( data[ index ] && data[ index ].stop ) {
        +                        stopQueue( data[ index ] );
        +                    }
        +                } else {
        +                    for ( index in data ) {
        +                        if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
        +                            stopQueue( data[ index ] );
        +                        }
        +                    }
        +                }
        +
        +                for ( index = timers.length; index--; ) {
        +                    if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
        +                        timers[ index ].anim.stop( gotoEnd );
        +                        dequeue = false;
        +                        timers.splice( index, 1 );
        +                    }
        +                }
        +
        +                // start the next in the queue if the last step wasn't forced
        +                // timers currently will call their complete callbacks, which will dequeue
        +                // but only if they were gotoEnd
        +                if ( dequeue || !gotoEnd ) {
        +                    jQuery.dequeue( this, type );
        +                }
        +            });
        +        },
        +        finish: function( type ) {
        +            if ( type !== false ) {
        +                type = type || "fx";
        +            }
        +            return this.each(function() {
        +                var index,
        +                    data = data_priv.get( this ),
        +                    queue = data[ type + "queue" ],
        +                    hooks = data[ type + "queueHooks" ],
        +                    timers = jQuery.timers,
        +                    length = queue ? queue.length : 0;
        +
        +                // enable finishing flag on private data
        +                data.finish = true;
        +
        +                // empty the queue first
        +                jQuery.queue( this, type, [] );
        +
        +                if ( hooks && hooks.stop ) {
        +                    hooks.stop.call( this, true );
        +                }
        +
        +                // look for any active animations, and finish them
        +                for ( index = timers.length; index--; ) {
        +                    if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
        +                        timers[ index ].anim.stop( true );
        +                        timers.splice( index, 1 );
        +                    }
        +                }
        +
        +                // look for any animations in the old queue and finish them
        +                for ( index = 0; index < length; index++ ) {
        +                    if ( queue[ index ] && queue[ index ].finish ) {
        +                        queue[ index ].finish.call( this );
        +                    }
        +                }
        +
        +                // turn off finishing flag
        +                delete data.finish;
        +            });
        +        }
        +    });
        +
        +    jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
        +        var cssFn = jQuery.fn[ name ];
        +        jQuery.fn[ name ] = function( speed, easing, callback ) {
        +            return speed == null || typeof speed === "boolean" ?
        +                cssFn.apply( this, arguments ) :
        +                this.animate( genFx( name, true ), speed, easing, callback );
        +        };
        +    });
        +
        +// Generate shortcuts for custom animations
        +    jQuery.each({
        +        slideDown: genFx("show"),
        +        slideUp: genFx("hide"),
        +        slideToggle: genFx("toggle"),
        +        fadeIn: { opacity: "show" },
        +        fadeOut: { opacity: "hide" },
        +        fadeToggle: { opacity: "toggle" }
        +    }, function( name, props ) {
        +        jQuery.fn[ name ] = function( speed, easing, callback ) {
        +            return this.animate( props, speed, easing, callback );
        +        };
        +    });
        +
        +    jQuery.timers = [];
        +    jQuery.fx.tick = function() {
        +        var timer,
        +            i = 0,
        +            timers = jQuery.timers;
        +
        +        fxNow = jQuery.now();
        +
        +        for ( ; i < timers.length; i++ ) {
        +            timer = timers[ i ];
        +            // Checks the timer has not already been removed
        +            if ( !timer() && timers[ i ] === timer ) {
        +                timers.splice( i--, 1 );
        +            }
        +        }
        +
        +        if ( !timers.length ) {
        +            jQuery.fx.stop();
        +        }
        +        fxNow = undefined;
        +    };
        +
        +    jQuery.fx.timer = function( timer ) {
        +        jQuery.timers.push( timer );
        +        if ( timer() ) {
        +            jQuery.fx.start();
        +        } else {
        +            jQuery.timers.pop();
        +        }
        +    };
        +
        +    jQuery.fx.interval = 13;
        +
        +    jQuery.fx.start = function() {
        +        if ( !timerId ) {
        +            timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
        +        }
        +    };
        +
        +    jQuery.fx.stop = function() {
        +        clearInterval( timerId );
        +        timerId = null;
        +    };
        +
        +    jQuery.fx.speeds = {
        +        slow: 600,
        +        fast: 200,
        +        // Default speed
        +        _default: 400
        +    };
        +
        +
        +// Based off of the plugin by Clint Helfers, with permission.
        +// http://blindsignals.com/index.php/2009/07/jquery-delay/
        +    jQuery.fn.delay = function( time, type ) {
        +        time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
        +        type = type || "fx";
        +
        +        return this.queue( type, function( next, hooks ) {
        +            var timeout = setTimeout( next, time );
        +            hooks.stop = function() {
        +                clearTimeout( timeout );
        +            };
        +        });
        +    };
        +
        +
        +    (function() {
        +        var input = document.createElement( "input" ),
        +            select = document.createElement( "select" ),
        +            opt = select.appendChild( document.createElement( "option" ) );
        +
        +        input.type = "checkbox";
        +
        +        // Support: iOS 5.1, Android 4.x, Android 2.3
        +        // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
        +        support.checkOn = input.value !== "";
        +
        +        // Must access the parent to make an option select properly
        +        // Support: IE9, IE10
        +        support.optSelected = opt.selected;
        +
        +        // Make sure that the options inside disabled selects aren't marked as disabled
        +        // (WebKit marks them as disabled)
        +        select.disabled = true;
        +        support.optDisabled = !opt.disabled;
        +
        +        // Check if an input maintains its value after becoming a radio
        +        // Support: IE9, IE10
        +        input = document.createElement( "input" );
        +        input.value = "t";
        +        input.type = "radio";
        +        support.radioValue = input.value === "t";
        +    })();
        +
        +
        +    var nodeHook, boolHook,
        +        attrHandle = jQuery.expr.attrHandle;
        +
        +    jQuery.fn.extend({
        +        attr: function( name, value ) {
        +            return access( this, jQuery.attr, name, value, arguments.length > 1 );
        +        },
        +
        +        removeAttr: function( name ) {
        +            return this.each(function() {
        +                jQuery.removeAttr( this, name );
        +            });
        +        }
        +    });
        +
        +    jQuery.extend({
        +        attr: function( elem, name, value ) {
        +            var hooks, ret,
        +                nType = elem.nodeType;
        +
        +            // don't get/set attributes on text, comment and attribute nodes
        +            if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +                return;
        +            }
        +
        +            // Fallback to prop when attributes are not supported
        +            if ( typeof elem.getAttribute === strundefined ) {
        +                return jQuery.prop( elem, name, value );
        +            }
        +
        +            // All attributes are lowercase
        +            // Grab necessary hook if one is defined
        +            if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
        +                name = name.toLowerCase();
        +                hooks = jQuery.attrHooks[ name ] ||
        +                    ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
        +            }
        +
        +            if ( value !== undefined ) {
        +
        +                if ( value === null ) {
        +                    jQuery.removeAttr( elem, name );
        +
        +                } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
        +                    return ret;
        +
        +                } else {
        +                    elem.setAttribute( name, value + "" );
        +                    return value;
        +                }
        +
        +            } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
        +                return ret;
        +
        +            } else {
        +                ret = jQuery.find.attr( elem, name );
        +
        +                // Non-existent attributes return null, we normalize to undefined
        +                return ret == null ?
        +                    undefined :
        +                    ret;
        +            }
        +        },
        +
        +        removeAttr: function( elem, value ) {
        +            var name, propName,
        +                i = 0,
        +                attrNames = value && value.match( rnotwhite );
        +
        +            if ( attrNames && elem.nodeType === 1 ) {
        +                while ( (name = attrNames[i++]) ) {
        +                    propName = jQuery.propFix[ name ] || name;
        +
        +                    // Boolean attributes get special treatment (#10870)
        +                    if ( jQuery.expr.match.bool.test( name ) ) {
        +                        // Set corresponding property to false
        +                        elem[ propName ] = false;
        +                    }
        +
        +                    elem.removeAttribute( name );
        +                }
        +            }
        +        },
        +
        +        attrHooks: {
        +            type: {
        +                set: function( elem, value ) {
        +                    if ( !support.radioValue && value === "radio" &&
        +                        jQuery.nodeName( elem, "input" ) ) {
        +                        // Setting the type on a radio button after the value resets the value in IE6-9
        +                        // Reset value to default in case type is set after value during creation
        +                        var val = elem.value;
        +                        elem.setAttribute( "type", value );
        +                        if ( val ) {
        +                            elem.value = val;
        +                        }
        +                        return value;
        +                    }
        +                }
        +            }
        +        }
        +    });
        +
        +// Hooks for boolean attributes
        +    boolHook = {
        +        set: function( elem, value, name ) {
        +            if ( value === false ) {
        +                // Remove boolean attributes when set to false
        +                jQuery.removeAttr( elem, name );
        +            } else {
        +                elem.setAttribute( name, name );
        +            }
        +            return name;
        +        }
        +    };
        +    jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
        +        var getter = attrHandle[ name ] || jQuery.find.attr;
        +
        +        attrHandle[ name ] = function( elem, name, isXML ) {
        +            var ret, handle;
        +            if ( !isXML ) {
        +                // Avoid an infinite loop by temporarily removing this function from the getter
        +                handle = attrHandle[ name ];
        +                attrHandle[ name ] = ret;
        +                ret = getter( elem, name, isXML ) != null ?
        +                    name.toLowerCase() :
        +                    null;
        +                attrHandle[ name ] = handle;
        +            }
        +            return ret;
        +        };
        +    });
        +
        +
        +
        +
        +    var rfocusable = /^(?:input|select|textarea|button)$/i;
        +
        +    jQuery.fn.extend({
        +        prop: function( name, value ) {
        +            return access( this, jQuery.prop, name, value, arguments.length > 1 );
        +        },
        +
        +        removeProp: function( name ) {
        +            return this.each(function() {
        +                delete this[ jQuery.propFix[ name ] || name ];
        +            });
        +        }
        +    });
        +
        +    jQuery.extend({
        +        propFix: {
        +            "for": "htmlFor",
        +            "class": "className"
        +        },
        +
        +        prop: function( elem, name, value ) {
        +            var ret, hooks, notxml,
        +                nType = elem.nodeType;
        +
        +            // don't get/set properties on text, comment and attribute nodes
        +            if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +                return;
        +            }
        +
        +            notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
        +
        +            if ( notxml ) {
        +                // Fix name and attach hooks
        +                name = jQuery.propFix[ name ] || name;
        +                hooks = jQuery.propHooks[ name ];
        +            }
        +
        +            if ( value !== undefined ) {
        +                return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
        +                    ret :
        +                    ( elem[ name ] = value );
        +
        +            } else {
        +                return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
        +                    ret :
        +                    elem[ name ];
        +            }
        +        },
        +
        +        propHooks: {
        +            tabIndex: {
        +                get: function( elem ) {
        +                    return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
        +                        elem.tabIndex :
        +                        -1;
        +                }
        +            }
        +        }
        +    });
        +
        +// Support: IE9+
        +// Selectedness for an option in an optgroup can be inaccurate
        +    if ( !support.optSelected ) {
        +        jQuery.propHooks.selected = {
        +            get: function( elem ) {
        +                var parent = elem.parentNode;
        +                if ( parent && parent.parentNode ) {
        +                    parent.parentNode.selectedIndex;
        +                }
        +                return null;
        +            }
        +        };
        +    }
        +
        +    jQuery.each([
        +        "tabIndex",
        +        "readOnly",
        +        "maxLength",
        +        "cellSpacing",
        +        "cellPadding",
        +        "rowSpan",
        +        "colSpan",
        +        "useMap",
        +        "frameBorder",
        +        "contentEditable"
        +    ], function() {
        +        jQuery.propFix[ this.toLowerCase() ] = this;
        +    });
        +
        +
        +
        +
        +    var rclass = /[\t\r\n\f]/g;
        +
        +    jQuery.fn.extend({
        +        addClass: function( value ) {
        +            var classes, elem, cur, clazz, j, finalValue,
        +                proceed = typeof value === "string" && value,
        +                i = 0,
        +                len = this.length;
        +
        +            if ( jQuery.isFunction( value ) ) {
        +                return this.each(function( j ) {
        +                    jQuery( this ).addClass( value.call( this, j, this.className ) );
        +                });
        +            }
        +
        +            if ( proceed ) {
        +                // The disjunction here is for better compressibility (see removeClass)
        +                classes = ( value || "" ).match( rnotwhite ) || [];
        +
        +                for ( ; i < len; i++ ) {
        +                    elem = this[ i ];
        +                    cur = elem.nodeType === 1 && ( elem.className ?
        +                        ( " " + elem.className + " " ).replace( rclass, " " ) :
        +                        " "
        +                        );
        +
        +                    if ( cur ) {
        +                        j = 0;
        +                        while ( (clazz = classes[j++]) ) {
        +                            if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
        +                                cur += clazz + " ";
        +                            }
        +                        }
        +
        +                        // only assign if different to avoid unneeded rendering.
        +                        finalValue = jQuery.trim( cur );
        +                        if ( elem.className !== finalValue ) {
        +                            elem.className = finalValue;
        +                        }
        +                    }
        +                }
        +            }
        +
        +            return this;
        +        },
        +
        +        removeClass: function( value ) {
        +            var classes, elem, cur, clazz, j, finalValue,
        +                proceed = arguments.length === 0 || typeof value === "string" && value,
        +                i = 0,
        +                len = this.length;
        +
        +            if ( jQuery.isFunction( value ) ) {
        +                return this.each(function( j ) {
        +                    jQuery( this ).removeClass( value.call( this, j, this.className ) );
        +                });
        +            }
        +            if ( proceed ) {
        +                classes = ( value || "" ).match( rnotwhite ) || [];
        +
        +                for ( ; i < len; i++ ) {
        +                    elem = this[ i ];
        +                    // This expression is here for better compressibility (see addClass)
        +                    cur = elem.nodeType === 1 && ( elem.className ?
        +                        ( " " + elem.className + " " ).replace( rclass, " " ) :
        +                        ""
        +                        );
        +
        +                    if ( cur ) {
        +                        j = 0;
        +                        while ( (clazz = classes[j++]) ) {
        +                            // Remove *all* instances
        +                            while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
        +                                cur = cur.replace( " " + clazz + " ", " " );
        +                            }
        +                        }
        +
        +                        // only assign if different to avoid unneeded rendering.
        +                        finalValue = value ? jQuery.trim( cur ) : "";
        +                        if ( elem.className !== finalValue ) {
        +                            elem.className = finalValue;
        +                        }
        +                    }
        +                }
        +            }
        +
        +            return this;
        +        },
        +
        +        toggleClass: function( value, stateVal ) {
        +            var type = typeof value;
        +
        +            if ( typeof stateVal === "boolean" && type === "string" ) {
        +                return stateVal ? this.addClass( value ) : this.removeClass( value );
        +            }
        +
        +            if ( jQuery.isFunction( value ) ) {
        +                return this.each(function( i ) {
        +                    jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
        +                });
        +            }
        +
        +            return this.each(function() {
        +                if ( type === "string" ) {
        +                    // toggle individual class names
        +                    var className,
        +                        i = 0,
        +                        self = jQuery( this ),
        +                        classNames = value.match( rnotwhite ) || [];
        +
        +                    while ( (className = classNames[ i++ ]) ) {
        +                        // check each className given, space separated list
        +                        if ( self.hasClass( className ) ) {
        +                            self.removeClass( className );
        +                        } else {
        +                            self.addClass( className );
        +                        }
        +                    }
        +
        +                    // Toggle whole class name
        +                } else if ( type === strundefined || type === "boolean" ) {
        +                    if ( this.className ) {
        +                        // store className if set
        +                        data_priv.set( this, "__className__", this.className );
        +                    }
        +
        +                    // If the element has a class name or if we're passed "false",
        +                    // then remove the whole classname (if there was one, the above saved it).
        +                    // Otherwise bring back whatever was previously saved (if anything),
        +                    // falling back to the empty string if nothing was stored.
        +                    this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
        +                }
        +            });
        +        },
        +
        +        hasClass: function( selector ) {
        +            var className = " " + selector + " ",
        +                i = 0,
        +                l = this.length;
        +            for ( ; i < l; i++ ) {
        +                if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
        +                    return true;
        +                }
        +            }
        +
        +            return false;
        +        }
        +    });
        +
        +
        +
        +
        +    var rreturn = /\r/g;
        +
        +    jQuery.fn.extend({
        +        val: function( value ) {
        +            var hooks, ret, isFunction,
        +                elem = this[0];
        +
        +            if ( !arguments.length ) {
        +                if ( elem ) {
        +                    hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
        +
        +                    if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
        +                        return ret;
        +                    }
        +
        +                    ret = elem.value;
        +
        +                    return typeof ret === "string" ?
        +                        // handle most common string cases
        +                        ret.replace(rreturn, "") :
        +                        // handle cases where value is null/undef or number
        +                        ret == null ? "" : ret;
        +                }
        +
        +                return;
        +            }
        +
        +            isFunction = jQuery.isFunction( value );
        +
        +            return this.each(function( i ) {
        +                var val;
        +
        +                if ( this.nodeType !== 1 ) {
        +                    return;
        +                }
        +
        +                if ( isFunction ) {
        +                    val = value.call( this, i, jQuery( this ).val() );
        +                } else {
        +                    val = value;
        +                }
        +
        +                // Treat null/undefined as ""; convert numbers to string
        +                if ( val == null ) {
        +                    val = "";
        +
        +                } else if ( typeof val === "number" ) {
        +                    val += "";
        +
        +                } else if ( jQuery.isArray( val ) ) {
        +                    val = jQuery.map( val, function( value ) {
        +                        return value == null ? "" : value + "";
        +                    });
        +                }
        +
        +                hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
        +
        +                // If set returns undefined, fall back to normal setting
        +                if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
        +                    this.value = val;
        +                }
        +            });
        +        }
        +    });
        +
        +    jQuery.extend({
        +        valHooks: {
        +            select: {
        +                get: function( elem ) {
        +                    var value, option,
        +                        options = elem.options,
        +                        index = elem.selectedIndex,
        +                        one = elem.type === "select-one" || index < 0,
        +                        values = one ? null : [],
        +                        max = one ? index + 1 : options.length,
        +                        i = index < 0 ?
        +                            max :
        +                            one ? index : 0;
        +
        +                    // Loop through all the selected options
        +                    for ( ; i < max; i++ ) {
        +                        option = options[ i ];
        +
        +                        // IE6-9 doesn't update selected after form reset (#2551)
        +                        if ( ( option.selected || i === index ) &&
        +                            // Don't return options that are disabled or in a disabled optgroup
        +                            ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
        +                            ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
        +
        +                            // Get the specific value for the option
        +                            value = jQuery( option ).val();
        +
        +                            // We don't need an array for one selects
        +                            if ( one ) {
        +                                return value;
        +                            }
        +
        +                            // Multi-Selects return an array
        +                            values.push( value );
        +                        }
        +                    }
        +
        +                    return values;
        +                },
        +
        +                set: function( elem, value ) {
        +                    var optionSet, option,
        +                        options = elem.options,
        +                        values = jQuery.makeArray( value ),
        +                        i = options.length;
        +
        +                    while ( i-- ) {
        +                        option = options[ i ];
        +                        if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
        +                            optionSet = true;
        +                        }
        +                    }
        +
        +                    // force browsers to behave consistently when non-matching value is set
        +                    if ( !optionSet ) {
        +                        elem.selectedIndex = -1;
        +                    }
        +                    return values;
        +                }
        +            }
        +        }
        +    });
        +
        +// Radios and checkboxes getter/setter
        +    jQuery.each([ "radio", "checkbox" ], function() {
        +        jQuery.valHooks[ this ] = {
        +            set: function( elem, value ) {
        +                if ( jQuery.isArray( value ) ) {
        +                    return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
        +                }
        +            }
        +        };
        +        if ( !support.checkOn ) {
        +            jQuery.valHooks[ this ].get = function( elem ) {
        +                // Support: Webkit
        +                // "" is returned instead of "on" if a value isn't specified
        +                return elem.getAttribute("value") === null ? "on" : elem.value;
        +            };
        +        }
        +    });
        +
        +
        +
        +
        +// Return jQuery for attributes-only inclusion
        +
        +
        +    jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
        +        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
        +        "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
        +
        +        // Handle event binding
        +        jQuery.fn[ name ] = function( data, fn ) {
        +            return arguments.length > 0 ?
        +                this.on( name, null, data, fn ) :
        +                this.trigger( name );
        +        };
        +    });
        +
        +    jQuery.fn.extend({
        +        hover: function( fnOver, fnOut ) {
        +            return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        +        },
        +
        +        bind: function( types, data, fn ) {
        +            return this.on( types, null, data, fn );
        +        },
        +        unbind: function( types, fn ) {
        +            return this.off( types, null, fn );
        +        },
        +
        +        delegate: function( selector, types, data, fn ) {
        +            return this.on( types, selector, data, fn );
        +        },
        +        undelegate: function( selector, types, fn ) {
        +            // ( namespace ) or ( selector, types [, fn] )
        +            return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
        +        }
        +    });
        +
        +
        +    var nonce = jQuery.now();
        +
        +    var rquery = (/\?/);
        +
        +
        +
        +// Support: Android 2.3
        +// Workaround failure to string-cast null input
        +    jQuery.parseJSON = function( data ) {
        +        return JSON.parse( data + "" );
        +    };
        +
        +
        +// Cross-browser xml parsing
        +    jQuery.parseXML = function( data ) {
        +        var xml, tmp;
        +        if ( !data || typeof data !== "string" ) {
        +            return null;
        +        }
        +
        +        // Support: IE9
        +        try {
        +            tmp = new DOMParser();
        +            xml = tmp.parseFromString( data, "text/xml" );
        +        } catch ( e ) {
        +            xml = undefined;
        +        }
        +
        +        if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
        +            jQuery.error( "Invalid XML: " + data );
        +        }
        +        return xml;
        +    };
        +
        +
        +    var
        +    // Document location
        +        ajaxLocParts,
        +        ajaxLocation,
        +
        +        rhash = /#.*$/,
        +        rts = /([?&])_=[^&]*/,
        +        rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
        +    // #7653, #8125, #8152: local protocol detection
        +        rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        +        rnoContent = /^(?:GET|HEAD)$/,
        +        rprotocol = /^\/\//,
        +        rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
        +
        +    /* Prefilters
        +     * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
        +     * 2) These are called:
        +     *    - BEFORE asking for a transport
        +     *    - AFTER param serialization (s.data is a string if s.processData is true)
        +     * 3) key is the dataType
        +     * 4) the catchall symbol "*" can be used
        +     * 5) execution will start with transport dataType and THEN continue down to "*" if needed
        +     */
        +        prefilters = {},
        +
        +    /* Transports bindings
        +     * 1) key is the dataType
        +     * 2) the catchall symbol "*" can be used
        +     * 3) selection will start with transport dataType and THEN go to "*" if needed
        +     */
        +        transports = {},
        +
        +    // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        +        allTypes = "*/".concat("*");
        +
        +// #8138, IE may throw an exception when accessing
        +// a field from window.location if document.domain has been set
        +    try {
        +        ajaxLocation = location.href;
        +    } catch( e ) {
        +        // Use the href attribute of an A element
        +        // since IE will modify it given document.location
        +        ajaxLocation = document.createElement( "a" );
        +        ajaxLocation.href = "";
        +        ajaxLocation = ajaxLocation.href;
        +    }
        +
        +// Segment location into parts
        +    ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
        +
        +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
        +    function addToPrefiltersOrTransports( structure ) {
        +
        +        // dataTypeExpression is optional and defaults to "*"
        +        return function( dataTypeExpression, func ) {
        +
        +            if ( typeof dataTypeExpression !== "string" ) {
        +                func = dataTypeExpression;
        +                dataTypeExpression = "*";
        +            }
        +
        +            var dataType,
        +                i = 0,
        +                dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
        +
        +            if ( jQuery.isFunction( func ) ) {
        +                // For each dataType in the dataTypeExpression
        +                while ( (dataType = dataTypes[i++]) ) {
        +                    // Prepend if requested
        +                    if ( dataType[0] === "+" ) {
        +                        dataType = dataType.slice( 1 ) || "*";
        +                        (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
        +
        +                        // Otherwise append
        +                    } else {
        +                        (structure[ dataType ] = structure[ dataType ] || []).push( func );
        +                    }
        +                }
        +            }
        +        };
        +    }
        +
        +// Base inspection function for prefilters and transports
        +    function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
        +
        +        var inspected = {},
        +            seekingTransport = ( structure === transports );
        +
        +        function inspect( dataType ) {
        +            var selected;
        +            inspected[ dataType ] = true;
        +            jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
        +                var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
        +                if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
        +                    options.dataTypes.unshift( dataTypeOrTransport );
        +                    inspect( dataTypeOrTransport );
        +                    return false;
        +                } else if ( seekingTransport ) {
        +                    return !( selected = dataTypeOrTransport );
        +                }
        +            });
        +            return selected;
        +        }
        +
        +        return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
        +    }
        +
        +// A special extend for ajax options
        +// that takes "flat" options (not to be deep extended)
        +// Fixes #9887
        +    function ajaxExtend( target, src ) {
        +        var key, deep,
        +            flatOptions = jQuery.ajaxSettings.flatOptions || {};
        +
        +        for ( key in src ) {
        +            if ( src[ key ] !== undefined ) {
        +                ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
        +            }
        +        }
        +        if ( deep ) {
        +            jQuery.extend( true, target, deep );
        +        }
        +
        +        return target;
        +    }
        +
        +    /* Handles responses to an ajax request:
        +     * - finds the right dataType (mediates between content-type and expected dataType)
        +     * - returns the corresponding response
        +     */
        +    function ajaxHandleResponses( s, jqXHR, responses ) {
        +
        +        var ct, type, finalDataType, firstDataType,
        +            contents = s.contents,
        +            dataTypes = s.dataTypes;
        +
        +        // Remove auto dataType and get content-type in the process
        +        while ( dataTypes[ 0 ] === "*" ) {
        +            dataTypes.shift();
        +            if ( ct === undefined ) {
        +                ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
        +            }
        +        }
        +
        +        // Check if we're dealing with a known content-type
        +        if ( ct ) {
        +            for ( type in contents ) {
        +                if ( contents[ type ] && contents[ type ].test( ct ) ) {
        +                    dataTypes.unshift( type );
        +                    break;
        +                }
        +            }
        +        }
        +
        +        // Check to see if we have a response for the expected dataType
        +        if ( dataTypes[ 0 ] in responses ) {
        +            finalDataType = dataTypes[ 0 ];
        +        } else {
        +            // Try convertible dataTypes
        +            for ( type in responses ) {
        +                if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
        +                    finalDataType = type;
        +                    break;
        +                }
        +                if ( !firstDataType ) {
        +                    firstDataType = type;
        +                }
        +            }
        +            // Or just use first one
        +            finalDataType = finalDataType || firstDataType;
        +        }
        +
        +        // If we found a dataType
        +        // We add the dataType to the list if needed
        +        // and return the corresponding response
        +        if ( finalDataType ) {
        +            if ( finalDataType !== dataTypes[ 0 ] ) {
        +                dataTypes.unshift( finalDataType );
        +            }
        +            return responses[ finalDataType ];
        +        }
        +    }
        +
        +    /* Chain conversions given the request and the original response
        +     * Also sets the responseXXX fields on the jqXHR instance
        +     */
        +    function ajaxConvert( s, response, jqXHR, isSuccess ) {
        +        var conv2, current, conv, tmp, prev,
        +            converters = {},
        +        // Work with a copy of dataTypes in case we need to modify it for conversion
        +            dataTypes = s.dataTypes.slice();
        +
        +        // Create converters map with lowercased keys
        +        if ( dataTypes[ 1 ] ) {
        +            for ( conv in s.converters ) {
        +                converters[ conv.toLowerCase() ] = s.converters[ conv ];
        +            }
        +        }
        +
        +        current = dataTypes.shift();
        +
        +        // Convert to each sequential dataType
        +        while ( current ) {
        +
        +            if ( s.responseFields[ current ] ) {
        +                jqXHR[ s.responseFields[ current ] ] = response;
        +            }
        +
        +            // Apply the dataFilter if provided
        +            if ( !prev && isSuccess && s.dataFilter ) {
        +                response = s.dataFilter( response, s.dataType );
        +            }
        +
        +            prev = current;
        +            current = dataTypes.shift();
        +
        +            if ( current ) {
        +
        +                // There's only work to do if current dataType is non-auto
        +                if ( current === "*" ) {
        +
        +                    current = prev;
        +
        +                    // Convert response if prev dataType is non-auto and differs from current
        +                } else if ( prev !== "*" && prev !== current ) {
        +
        +                    // Seek a direct converter
        +                    conv = converters[ prev + " " + current ] || converters[ "* " + current ];
        +
        +                    // If none found, seek a pair
        +                    if ( !conv ) {
        +                        for ( conv2 in converters ) {
        +
        +                            // If conv2 outputs current
        +                            tmp = conv2.split( " " );
        +                            if ( tmp[ 1 ] === current ) {
        +
        +                                // If prev can be converted to accepted input
        +                                conv = converters[ prev + " " + tmp[ 0 ] ] ||
        +                                    converters[ "* " + tmp[ 0 ] ];
        +                                if ( conv ) {
        +                                    // Condense equivalence converters
        +                                    if ( conv === true ) {
        +                                        conv = converters[ conv2 ];
        +
        +                                        // Otherwise, insert the intermediate dataType
        +                                    } else if ( converters[ conv2 ] !== true ) {
        +                                        current = tmp[ 0 ];
        +                                        dataTypes.unshift( tmp[ 1 ] );
        +                                    }
        +                                    break;
        +                                }
        +                            }
        +                        }
        +                    }
        +
        +                    // Apply converter (if not an equivalence)
        +                    if ( conv !== true ) {
        +
        +                        // Unless errors are allowed to bubble, catch and return them
        +                        if ( conv && s[ "throws" ] ) {
        +                            response = conv( response );
        +                        } else {
        +                            try {
        +                                response = conv( response );
        +                            } catch ( e ) {
        +                                return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
        +                            }
        +                        }
        +                    }
        +                }
        +            }
        +        }
        +
        +        return { state: "success", data: response };
        +    }
        +
        +    jQuery.extend({
        +
        +        // Counter for holding the number of active queries
        +        active: 0,
        +
        +        // Last-Modified header cache for next request
        +        lastModified: {},
        +        etag: {},
        +
        +        ajaxSettings: {
        +            url: ajaxLocation,
        +            type: "GET",
        +            isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
        +            global: true,
        +            processData: true,
        +            async: true,
        +            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        +            /*
        +             timeout: 0,
        +             data: null,
        +             dataType: null,
        +             username: null,
        +             password: null,
        +             cache: null,
        +             throws: false,
        +             traditional: false,
        +             headers: {},
        +             */
        +
        +            accepts: {
        +                "*": allTypes,
        +                text: "text/plain",
        +                html: "text/html",
        +                xml: "application/xml, text/xml",
        +                json: "application/json, text/javascript"
        +            },
        +
        +            contents: {
        +                xml: /xml/,
        +                html: /html/,
        +                json: /json/
        +            },
        +
        +            responseFields: {
        +                xml: "responseXML",
        +                text: "responseText",
        +                json: "responseJSON"
        +            },
        +
        +            // Data converters
        +            // Keys separate source (or catchall "*") and destination types with a single space
        +            converters: {
        +
        +                // Convert anything to text
        +                "* text": String,
        +
        +                // Text to html (true = no transformation)
        +                "text html": true,
        +
        +                // Evaluate text as a json expression
        +                "text json": jQuery.parseJSON,
        +
        +                // Parse text as xml
        +                "text xml": jQuery.parseXML
        +            },
        +
        +            // For options that shouldn't be deep extended:
        +            // you can add your own custom options here if
        +            // and when you create one that shouldn't be
        +            // deep extended (see ajaxExtend)
        +            flatOptions: {
        +                url: true,
        +                context: true
        +            }
        +        },
        +
        +        // Creates a full fledged settings object into target
        +        // with both ajaxSettings and settings fields.
        +        // If target is omitted, writes into ajaxSettings.
        +        ajaxSetup: function( target, settings ) {
        +            return settings ?
        +
        +                // Building a settings object
        +                ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
        +
        +                // Extending ajaxSettings
        +                ajaxExtend( jQuery.ajaxSettings, target );
        +        },
        +
        +        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        +        ajaxTransport: addToPrefiltersOrTransports( transports ),
        +
        +        // Main method
        +        ajax: function( url, options ) {
        +
        +            // If url is an object, simulate pre-1.5 signature
        +            if ( typeof url === "object" ) {
        +                options = url;
        +                url = undefined;
        +            }
        +
        +            // Force options to be an object
        +            options = options || {};
        +
        +            var transport,
        +            // URL without anti-cache param
        +                cacheURL,
        +            // Response headers
        +                responseHeadersString,
        +                responseHeaders,
        +            // timeout handle
        +                timeoutTimer,
        +            // Cross-domain detection vars
        +                parts,
        +            // To know if global events are to be dispatched
        +                fireGlobals,
        +            // Loop variable
        +                i,
        +            // Create the final options object
        +                s = jQuery.ajaxSetup( {}, options ),
        +            // Callbacks context
        +                callbackContext = s.context || s,
        +            // Context for global events is callbackContext if it is a DOM node or jQuery collection
        +                globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
        +                    jQuery( callbackContext ) :
        +                    jQuery.event,
        +            // Deferreds
        +                deferred = jQuery.Deferred(),
        +                completeDeferred = jQuery.Callbacks("once memory"),
        +            // Status-dependent callbacks
        +                statusCode = s.statusCode || {},
        +            // Headers (they are sent all at once)
        +                requestHeaders = {},
        +                requestHeadersNames = {},
        +            // The jqXHR state
        +                state = 0,
        +            // Default abort message
        +                strAbort = "canceled",
        +            // Fake xhr
        +                jqXHR = {
        +                    readyState: 0,
        +
        +                    // Builds headers hashtable if needed
        +                    getResponseHeader: function( key ) {
        +                        var match;
        +                        if ( state === 2 ) {
        +                            if ( !responseHeaders ) {
        +                                responseHeaders = {};
        +                                while ( (match = rheaders.exec( responseHeadersString )) ) {
        +                                    responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
        +                                }
        +                            }
        +                            match = responseHeaders[ key.toLowerCase() ];
        +                        }
        +                        return match == null ? null : match;
        +                    },
        +
        +                    // Raw string
        +                    getAllResponseHeaders: function() {
        +                        return state === 2 ? responseHeadersString : null;
        +                    },
        +
        +                    // Caches the header
        +                    setRequestHeader: function( name, value ) {
        +                        var lname = name.toLowerCase();
        +                        if ( !state ) {
        +                            name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
        +                            requestHeaders[ name ] = value;
        +                        }
        +                        return this;
        +                    },
        +
        +                    // Overrides response content-type header
        +                    overrideMimeType: function( type ) {
        +                        if ( !state ) {
        +                            s.mimeType = type;
        +                        }
        +                        return this;
        +                    },
        +
        +                    // Status-dependent callbacks
        +                    statusCode: function( map ) {
        +                        var code;
        +                        if ( map ) {
        +                            if ( state < 2 ) {
        +                                for ( code in map ) {
        +                                    // Lazy-add the new callback in a way that preserves old ones
        +                                    statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
        +                                }
        +                            } else {
        +                                // Execute the appropriate callbacks
        +                                jqXHR.always( map[ jqXHR.status ] );
        +                            }
        +                        }
        +                        return this;
        +                    },
        +
        +                    // Cancel the request
        +                    abort: function( statusText ) {
        +                        var finalText = statusText || strAbort;
        +                        if ( transport ) {
        +                            transport.abort( finalText );
        +                        }
        +                        done( 0, finalText );
        +                        return this;
        +                    }
        +                };
        +
        +            // Attach deferreds
        +            deferred.promise( jqXHR ).complete = completeDeferred.add;
        +            jqXHR.success = jqXHR.done;
        +            jqXHR.error = jqXHR.fail;
        +
        +            // Remove hash character (#7531: and string promotion)
        +            // Add protocol if not provided (prefilters might expect it)
        +            // Handle falsy url in the settings object (#10093: consistency with old signature)
        +            // We also use the url parameter if available
        +            s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
        +                .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
        +
        +            // Alias method option to type as per ticket #12004
        +            s.type = options.method || options.type || s.method || s.type;
        +
        +            // Extract dataTypes list
        +            s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
        +
        +            // A cross-domain request is in order when we have a protocol:host:port mismatch
        +            if ( s.crossDomain == null ) {
        +                parts = rurl.exec( s.url.toLowerCase() );
        +                s.crossDomain = !!( parts &&
        +                    ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
        +                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
        +                            ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
        +                    );
        +            }
        +
        +            // Convert data if not already a string
        +            if ( s.data && s.processData && typeof s.data !== "string" ) {
        +                s.data = jQuery.param( s.data, s.traditional );
        +            }
        +
        +            // Apply prefilters
        +            inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
        +
        +            // If request was aborted inside a prefilter, stop there
        +            if ( state === 2 ) {
        +                return jqXHR;
        +            }
        +
        +            // We can fire global events as of now if asked to
        +            fireGlobals = s.global;
        +
        +            // Watch for a new set of requests
        +            if ( fireGlobals && jQuery.active++ === 0 ) {
        +                jQuery.event.trigger("ajaxStart");
        +            }
        +
        +            // Uppercase the type
        +            s.type = s.type.toUpperCase();
        +
        +            // Determine if request has content
        +            s.hasContent = !rnoContent.test( s.type );
        +
        +            // Save the URL in case we're toying with the If-Modified-Since
        +            // and/or If-None-Match header later on
        +            cacheURL = s.url;
        +
        +            // More options handling for requests with no content
        +            if ( !s.hasContent ) {
        +
        +                // If data is available, append data to url
        +                if ( s.data ) {
        +                    cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
        +                    // #9682: remove data so that it's not used in an eventual retry
        +                    delete s.data;
        +                }
        +
        +                // Add anti-cache in url if needed
        +                if ( s.cache === false ) {
        +                    s.url = rts.test( cacheURL ) ?
        +
        +                        // If there is already a '_' parameter, set its value
        +                        cacheURL.replace( rts, "$1_=" + nonce++ ) :
        +
        +                        // Otherwise add one to the end
        +                        cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
        +                }
        +            }
        +
        +            // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +            if ( s.ifModified ) {
        +                if ( jQuery.lastModified[ cacheURL ] ) {
        +                    jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
        +                }
        +                if ( jQuery.etag[ cacheURL ] ) {
        +                    jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
        +                }
        +            }
        +
        +            // Set the correct header, if data is being sent
        +            if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
        +                jqXHR.setRequestHeader( "Content-Type", s.contentType );
        +            }
        +
        +            // Set the Accepts header for the server, depending on the dataType
        +            jqXHR.setRequestHeader(
        +                "Accept",
        +                s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
        +                    s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
        +                    s.accepts[ "*" ]
        +            );
        +
        +            // Check for headers option
        +            for ( i in s.headers ) {
        +                jqXHR.setRequestHeader( i, s.headers[ i ] );
        +            }
        +
        +            // Allow custom headers/mimetypes and early abort
        +            if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
        +                // Abort if not done already and return
        +                return jqXHR.abort();
        +            }
        +
        +            // aborting is no longer a cancellation
        +            strAbort = "abort";
        +
        +            // Install callbacks on deferreds
        +            for ( i in { success: 1, error: 1, complete: 1 } ) {
        +                jqXHR[ i ]( s[ i ] );
        +            }
        +
        +            // Get transport
        +            transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
        +
        +            // If no transport, we auto-abort
        +            if ( !transport ) {
        +                done( -1, "No Transport" );
        +            } else {
        +                jqXHR.readyState = 1;
        +
        +                // Send global event
        +                if ( fireGlobals ) {
        +                    globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
        +                }
        +                // Timeout
        +                if ( s.async && s.timeout > 0 ) {
        +                    timeoutTimer = setTimeout(function() {
        +                        jqXHR.abort("timeout");
        +                    }, s.timeout );
        +                }
        +
        +                try {
        +                    state = 1;
        +                    transport.send( requestHeaders, done );
        +                } catch ( e ) {
        +                    // Propagate exception as error if not done
        +                    if ( state < 2 ) {
        +                        done( -1, e );
        +                        // Simply rethrow otherwise
        +                    } else {
        +                        throw e;
        +                    }
        +                }
        +            }
        +
        +            // Callback for when everything is done
        +            function done( status, nativeStatusText, responses, headers ) {
        +                var isSuccess, success, error, response, modified,
        +                    statusText = nativeStatusText;
        +
        +                // Called once
        +                if ( state === 2 ) {
        +                    return;
        +                }
        +
        +                // State is "done" now
        +                state = 2;
        +
        +                // Clear timeout if it exists
        +                if ( timeoutTimer ) {
        +                    clearTimeout( timeoutTimer );
        +                }
        +
        +                // Dereference transport for early garbage collection
        +                // (no matter how long the jqXHR object will be used)
        +                transport = undefined;
        +
        +                // Cache response headers
        +                responseHeadersString = headers || "";
        +
        +                // Set readyState
        +                jqXHR.readyState = status > 0 ? 4 : 0;
        +
        +                // Determine if successful
        +                isSuccess = status >= 200 && status < 300 || status === 304;
        +
        +                // Get response data
        +                if ( responses ) {
        +                    response = ajaxHandleResponses( s, jqXHR, responses );
        +                }
        +
        +                // Convert no matter what (that way responseXXX fields are always set)
        +                response = ajaxConvert( s, response, jqXHR, isSuccess );
        +
        +                // If successful, handle type chaining
        +                if ( isSuccess ) {
        +
        +                    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +                    if ( s.ifModified ) {
        +                        modified = jqXHR.getResponseHeader("Last-Modified");
        +                        if ( modified ) {
        +                            jQuery.lastModified[ cacheURL ] = modified;
        +                        }
        +                        modified = jqXHR.getResponseHeader("etag");
        +                        if ( modified ) {
        +                            jQuery.etag[ cacheURL ] = modified;
        +                        }
        +                    }
        +
        +                    // if no content
        +                    if ( status === 204 || s.type === "HEAD" ) {
        +                        statusText = "nocontent";
        +
        +                        // if not modified
        +                    } else if ( status === 304 ) {
        +                        statusText = "notmodified";
        +
        +                        // If we have data, let's convert it
        +                    } else {
        +                        statusText = response.state;
        +                        success = response.data;
        +                        error = response.error;
        +                        isSuccess = !error;
        +                    }
        +                } else {
        +                    // We extract error from statusText
        +                    // then normalize statusText and status for non-aborts
        +                    error = statusText;
        +                    if ( status || !statusText ) {
        +                        statusText = "error";
        +                        if ( status < 0 ) {
        +                            status = 0;
        +                        }
        +                    }
        +                }
        +
        +                // Set data for the fake xhr object
        +                jqXHR.status = status;
        +                jqXHR.statusText = ( nativeStatusText || statusText ) + "";
        +
        +                // Success/Error
        +                if ( isSuccess ) {
        +                    deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
        +                } else {
        +                    deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
        +                }
        +
        +                // Status-dependent callbacks
        +                jqXHR.statusCode( statusCode );
        +                statusCode = undefined;
        +
        +                if ( fireGlobals ) {
        +                    globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
        +                        [ jqXHR, s, isSuccess ? success : error ] );
        +                }
        +
        +                // Complete
        +                completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
        +
        +                if ( fireGlobals ) {
        +                    globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
        +                    // Handle the global AJAX counter
        +                    if ( !( --jQuery.active ) ) {
        +                        jQuery.event.trigger("ajaxStop");
        +                    }
        +                }
        +            }
        +
        +            return jqXHR;
        +        },
        +
        +        getJSON: function( url, data, callback ) {
        +            return jQuery.get( url, data, callback, "json" );
        +        },
        +
        +        getScript: function( url, callback ) {
        +            return jQuery.get( url, undefined, callback, "script" );
        +        }
        +    });
        +
        +    jQuery.each( [ "get", "post" ], function( i, method ) {
        +        jQuery[ method ] = function( url, data, callback, type ) {
        +            // shift arguments if data argument was omitted
        +            if ( jQuery.isFunction( data ) ) {
        +                type = type || callback;
        +                callback = data;
        +                data = undefined;
        +            }
        +
        +            return jQuery.ajax({
        +                url: url,
        +                type: method,
        +                dataType: type,
        +                data: data,
        +                success: callback
        +            });
        +        };
        +    });
        +
        +// Attach a bunch of functions for handling common AJAX events
        +    jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
        +        jQuery.fn[ type ] = function( fn ) {
        +            return this.on( type, fn );
        +        };
        +    });
        +
        +
        +    jQuery._evalUrl = function( url ) {
        +        return jQuery.ajax({
        +            url: url,
        +            type: "GET",
        +            dataType: "script",
        +            async: false,
        +            global: false,
        +            "throws": true
        +        });
        +    };
        +
        +
        +    jQuery.fn.extend({
        +        wrapAll: function( html ) {
        +            var wrap;
        +
        +            if ( jQuery.isFunction( html ) ) {
        +                return this.each(function( i ) {
        +                    jQuery( this ).wrapAll( html.call(this, i) );
        +                });
        +            }
        +
        +            if ( this[ 0 ] ) {
        +
        +                // The elements to wrap the target around
        +                wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
        +
        +                if ( this[ 0 ].parentNode ) {
        +                    wrap.insertBefore( this[ 0 ] );
        +                }
        +
        +                wrap.map(function() {
        +                    var elem = this;
        +
        +                    while ( elem.firstElementChild ) {
        +                        elem = elem.firstElementChild;
        +                    }
        +
        +                    return elem;
        +                }).append( this );
        +            }
        +
        +            return this;
        +        },
        +
        +        wrapInner: function( html ) {
        +            if ( jQuery.isFunction( html ) ) {
        +                return this.each(function( i ) {
        +                    jQuery( this ).wrapInner( html.call(this, i) );
        +                });
        +            }
        +
        +            return this.each(function() {
        +                var self = jQuery( this ),
        +                    contents = self.contents();
        +
        +                if ( contents.length ) {
        +                    contents.wrapAll( html );
        +
        +                } else {
        +                    self.append( html );
        +                }
        +            });
        +        },
        +
        +        wrap: function( html ) {
        +            var isFunction = jQuery.isFunction( html );
        +
        +            return this.each(function( i ) {
        +                jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
        +            });
        +        },
        +
        +        unwrap: function() {
        +            return this.parent().each(function() {
        +                if ( !jQuery.nodeName( this, "body" ) ) {
        +                    jQuery( this ).replaceWith( this.childNodes );
        +                }
        +            }).end();
        +        }
        +    });
        +
        +
        +    jQuery.expr.filters.hidden = function( elem ) {
        +        // Support: Opera <= 12.12
        +        // Opera reports offsetWidths and offsetHeights less than zero on some elements
        +        return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
        +    };
        +    jQuery.expr.filters.visible = function( elem ) {
        +        return !jQuery.expr.filters.hidden( elem );
        +    };
        +
        +
        +
        +
        +    var r20 = /%20/g,
        +        rbracket = /\[\]$/,
        +        rCRLF = /\r?\n/g,
        +        rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
        +        rsubmittable = /^(?:input|select|textarea|keygen)/i;
        +
        +    function buildParams( prefix, obj, traditional, add ) {
        +        var name;
        +
        +        if ( jQuery.isArray( obj ) ) {
        +            // Serialize array item.
        +            jQuery.each( obj, function( i, v ) {
        +                if ( traditional || rbracket.test( prefix ) ) {
        +                    // Treat each array item as a scalar.
        +                    add( prefix, v );
        +
        +                } else {
        +                    // Item is non-scalar (array or object), encode its numeric index.
        +                    buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
        +                }
        +            });
        +
        +        } else if ( !traditional && jQuery.type( obj ) === "object" ) {
        +            // Serialize object item.
        +            for ( name in obj ) {
        +                buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
        +            }
        +
        +        } else {
        +            // Serialize scalar item.
        +            add( prefix, obj );
        +        }
        +    }
        +
        +// Serialize an array of form elements or a set of
        +// key/values into a query string
        +    jQuery.param = function( a, traditional ) {
        +        var prefix,
        +            s = [],
        +            add = function( key, value ) {
        +                // If value is a function, invoke it and return its value
        +                value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
        +                s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
        +            };
        +
        +        // Set traditional to true for jQuery <= 1.3.2 behavior.
        +        if ( traditional === undefined ) {
        +            traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
        +        }
        +
        +        // If an array was passed in, assume that it is an array of form elements.
        +        if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        +            // Serialize the form elements
        +            jQuery.each( a, function() {
        +                add( this.name, this.value );
        +            });
        +
        +        } else {
        +            // If traditional, encode the "old" way (the way 1.3.2 or older
        +            // did it), otherwise encode params recursively.
        +            for ( prefix in a ) {
        +                buildParams( prefix, a[ prefix ], traditional, add );
        +            }
        +        }
        +
        +        // Return the resulting serialization
        +        return s.join( "&" ).replace( r20, "+" );
        +    };
        +
        +    jQuery.fn.extend({
        +        serialize: function() {
        +            return jQuery.param( this.serializeArray() );
        +        },
        +        serializeArray: function() {
        +            return this.map(function() {
        +                // Can add propHook for "elements" to filter or add form elements
        +                var elements = jQuery.prop( this, "elements" );
        +                return elements ? jQuery.makeArray( elements ) : this;
        +            })
        +                .filter(function() {
        +                    var type = this.type;
        +
        +                    // Use .is( ":disabled" ) so that fieldset[disabled] works
        +                    return this.name && !jQuery( this ).is( ":disabled" ) &&
        +                        rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
        +                        ( this.checked || !rcheckableType.test( type ) );
        +                })
        +                .map(function( i, elem ) {
        +                    var val = jQuery( this ).val();
        +
        +                    return val == null ?
        +                        null :
        +                        jQuery.isArray( val ) ?
        +                            jQuery.map( val, function( val ) {
        +                                return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +                            }) :
        +                        { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +                }).get();
        +        }
        +    });
        +
        +
        +    jQuery.ajaxSettings.xhr = function() {
        +        try {
        +            return new XMLHttpRequest();
        +        } catch( e ) {}
        +    };
        +
        +    var xhrId = 0,
        +        xhrCallbacks = {},
        +        xhrSuccessStatus = {
        +            // file protocol always yields status code 0, assume 200
        +            0: 200,
        +            // Support: IE9
        +            // #1450: sometimes IE returns 1223 when it should be 204
        +            1223: 204
        +        },
        +        xhrSupported = jQuery.ajaxSettings.xhr();
        +
        +// Support: IE9
        +// Open requests must be manually aborted on unload (#5280)
        +    if ( window.ActiveXObject ) {
        +        jQuery( window ).on( "unload", function() {
        +            for ( var key in xhrCallbacks ) {
        +                xhrCallbacks[ key ]();
        +            }
        +        });
        +    }
        +
        +    support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
        +    support.ajax = xhrSupported = !!xhrSupported;
        +
        +    jQuery.ajaxTransport(function( options ) {
        +        var callback;
        +
        +        // Cross domain only allowed if supported through XMLHttpRequest
        +        if ( support.cors || xhrSupported && !options.crossDomain ) {
        +            return {
        +                send: function( headers, complete ) {
        +                    var i,
        +                        xhr = options.xhr(),
        +                        id = ++xhrId;
        +
        +                    xhr.open( options.type, options.url, options.async, options.username, options.password );
        +
        +                    // Apply custom fields if provided
        +                    if ( options.xhrFields ) {
        +                        for ( i in options.xhrFields ) {
        +                            xhr[ i ] = options.xhrFields[ i ];
        +                        }
        +                    }
        +
        +                    // Override mime type if needed
        +                    if ( options.mimeType && xhr.overrideMimeType ) {
        +                        xhr.overrideMimeType( options.mimeType );
        +                    }
        +
        +                    // X-Requested-With header
        +                    // For cross-domain requests, seeing as conditions for a preflight are
        +                    // akin to a jigsaw puzzle, we simply never set it to be sure.
        +                    // (it can always be set on a per-request basis or even using ajaxSetup)
        +                    // For same-domain requests, won't change header if already provided.
        +                    if ( !options.crossDomain && !headers["X-Requested-With"] ) {
        +                        headers["X-Requested-With"] = "XMLHttpRequest";
        +                    }
        +
        +                    // Set headers
        +                    for ( i in headers ) {
        +                        xhr.setRequestHeader( i, headers[ i ] );
        +                    }
        +
        +                    // Callback
        +                    callback = function( type ) {
        +                        return function() {
        +                            if ( callback ) {
        +                                delete xhrCallbacks[ id ];
        +                                callback = xhr.onload = xhr.onerror = null;
        +
        +                                if ( type === "abort" ) {
        +                                    xhr.abort();
        +                                } else if ( type === "error" ) {
        +                                    complete(
        +                                        // file: protocol always yields status 0; see #8605, #14207
        +                                        xhr.status,
        +                                        xhr.statusText
        +                                    );
        +                                } else {
        +                                    complete(
        +                                        xhrSuccessStatus[ xhr.status ] || xhr.status,
        +                                        xhr.statusText,
        +                                        // Support: IE9
        +                                        // Accessing binary-data responseText throws an exception
        +                                        // (#11426)
        +                                        typeof xhr.responseText === "string" ? {
        +                                            text: xhr.responseText
        +                                        } : undefined,
        +                                        xhr.getAllResponseHeaders()
        +                                    );
        +                                }
        +                            }
        +                        };
        +                    };
        +
        +                    // Listen to events
        +                    xhr.onload = callback();
        +                    xhr.onerror = callback("error");
        +
        +                    // Create the abort callback
        +                    callback = xhrCallbacks[ id ] = callback("abort");
        +
        +                    // Do send the request
        +                    // This may raise an exception which is actually
        +                    // handled in jQuery.ajax (so no try/catch here)
        +                    xhr.send( options.hasContent && options.data || null );
        +                },
        +
        +                abort: function() {
        +                    if ( callback ) {
        +                        callback();
        +                    }
        +                }
        +            };
        +        }
        +    });
        +
        +
        +
        +
        +// Install script dataType
        +    jQuery.ajaxSetup({
        +        accepts: {
        +            script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        +        },
        +        contents: {
        +            script: /(?:java|ecma)script/
        +        },
        +        converters: {
        +            "text script": function( text ) {
        +                jQuery.globalEval( text );
        +                return text;
        +            }
        +        }
        +    });
        +
        +// Handle cache's special case and crossDomain
        +    jQuery.ajaxPrefilter( "script", function( s ) {
        +        if ( s.cache === undefined ) {
        +            s.cache = false;
        +        }
        +        if ( s.crossDomain ) {
        +            s.type = "GET";
        +        }
        +    });
        +
        +// Bind script tag hack transport
        +    jQuery.ajaxTransport( "script", function( s ) {
        +        // This transport only deals with cross domain requests
        +        if ( s.crossDomain ) {
        +            var script, callback;
        +            return {
        +                send: function( _, complete ) {
        +                    script = jQuery("<script>").prop({
        +                        async: true,
        +                        charset: s.scriptCharset,
        +                        src: s.url
        +                    }).on(
        +                            "load error",
        +                            callback = function( evt ) {
        +                                script.remove();
        +                                callback = null;
        +                                if ( evt ) {
        +                                    complete( evt.type === "error" ? 404 : 200, evt.type );
        +                                }
        +                            }
        +                        );
        +                    document.head.appendChild( script[ 0 ] );
        +                },
        +                abort: function() {
        +                    if ( callback ) {
        +                        callback();
        +                    }
        +                }
        +            };
        +        }
        +    });
        +
        +
        +
        +
        +    var oldCallbacks = [],
        +        rjsonp = /(=)\?(?=&|$)|\?\?/;
        +
        +// Default jsonp settings
        +    jQuery.ajaxSetup({
        +        jsonp: "callback",
        +        jsonpCallback: function() {
        +            var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
        +            this[ callback ] = true;
        +            return callback;
        +        }
        +    });
        +
        +// Detect, normalize options and install callbacks for jsonp requests
        +    jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
        +
        +        var callbackName, overwritten, responseContainer,
        +            jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
        +                "url" :
        +                typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
        +                );
        +
        +        // Handle iff the expected data type is "jsonp" or we have a parameter to set
        +        if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
        +
        +            // Get callback name, remembering preexisting value associated with it
        +            callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
        +                s.jsonpCallback() :
        +                s.jsonpCallback;
        +
        +            // Insert callback into url or form data
        +            if ( jsonProp ) {
        +                s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
        +            } else if ( s.jsonp !== false ) {
        +                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
        +            }
        +
        +            // Use data converter to retrieve json after script execution
        +            s.converters["script json"] = function() {
        +                if ( !responseContainer ) {
        +                    jQuery.error( callbackName + " was not called" );
        +                }
        +                return responseContainer[ 0 ];
        +            };
        +
        +            // force json dataType
        +            s.dataTypes[ 0 ] = "json";
        +
        +            // Install callback
        +            overwritten = window[ callbackName ];
        +            window[ callbackName ] = function() {
        +                responseContainer = arguments;
        +            };
        +
        +            // Clean-up function (fires after converters)
        +            jqXHR.always(function() {
        +                // Restore preexisting value
        +                window[ callbackName ] = overwritten;
        +
        +                // Save back as free
        +                if ( s[ callbackName ] ) {
        +                    // make sure that re-using the options doesn't screw things around
        +                    s.jsonpCallback = originalSettings.jsonpCallback;
        +
        +                    // save the callback name for future use
        +                    oldCallbacks.push( callbackName );
        +                }
        +
        +                // Call if it was a function and we have a response
        +                if ( responseContainer && jQuery.isFunction( overwritten ) ) {
        +                    overwritten( responseContainer[ 0 ] );
        +                }
        +
        +                responseContainer = overwritten = undefined;
        +            });
        +
        +            // Delegate to script
        +            return "script";
        +        }
        +    });
        +
        +
        +
        +
        +// data: string of html
        +// context (optional): If specified, the fragment will be created in this context, defaults to document
        +// keepScripts (optional): If true, will include scripts passed in the html string
        +    jQuery.parseHTML = function( data, context, keepScripts ) {
        +        if ( !data || typeof data !== "string" ) {
        +            return null;
        +        }
        +        if ( typeof context === "boolean" ) {
        +            keepScripts = context;
        +            context = false;
        +        }
        +        context = context || document;
        +
        +        var parsed = rsingleTag.exec( data ),
        +            scripts = !keepScripts && [];
        +
        +        // Single tag
        +        if ( parsed ) {
        +            return [ context.createElement( parsed[1] ) ];
        +        }
        +
        +        parsed = jQuery.buildFragment( [ data ], context, scripts );
        +
        +        if ( scripts && scripts.length ) {
        +            jQuery( scripts ).remove();
        +        }
        +
        +        return jQuery.merge( [], parsed.childNodes );
        +    };
        +
        +
        +// Keep a copy of the old load method
        +    var _load = jQuery.fn.load;
        +
        +    /**
        +     * Load a url into a page
        +     */
        +    jQuery.fn.load = function( url, params, callback ) {
        +        if ( typeof url !== "string" && _load ) {
        +            return _load.apply( this, arguments );
        +        }
        +
        +        var selector, type, response,
        +            self = this,
        +            off = url.indexOf(" ");
        +
        +        if ( off >= 0 ) {
        +            selector = url.slice( off );
        +            url = url.slice( 0, off );
        +        }
        +
        +        // If it's a function
        +        if ( jQuery.isFunction( params ) ) {
        +
        +            // We assume that it's the callback
        +            callback = params;
        +            params = undefined;
        +
        +            // Otherwise, build a param string
        +        } else if ( params && typeof params === "object" ) {
        +            type = "POST";
        +        }
        +
        +        // If we have elements to modify, make the request
        +        if ( self.length > 0 ) {
        +            jQuery.ajax({
        +                url: url,
        +
        +                // if "type" variable is undefined, then "GET" method will be used
        +                type: type,
        +                dataType: "html",
        +                data: params
        +            }).done(function( responseText ) {
        +
        +                    // Save response for use in complete callback
        +                    response = arguments;
        +
        +                    self.html( selector ?
        +
        +                        // If a selector was specified, locate the right elements in a dummy div
        +                        // Exclude scripts to avoid IE 'Permission Denied' errors
        +                        jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
        +
        +                        // Otherwise use the full result
        +                        responseText );
        +
        +                }).complete( callback && function( jqXHR, status ) {
        +                    self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
        +                });
        +        }
        +
        +        return this;
        +    };
        +
        +
        +
        +
        +    jQuery.expr.filters.animated = function( elem ) {
        +        return jQuery.grep(jQuery.timers, function( fn ) {
        +            return elem === fn.elem;
        +        }).length;
        +    };
        +
        +
        +
        +
        +    var docElem = window.document.documentElement;
        +
        +    /**
        +     * Gets a window from an element
        +     */
        +    function getWindow( elem ) {
        +        return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
        +    }
        +
        +    jQuery.offset = {
        +        setOffset: function( elem, options, i ) {
        +            var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
        +                position = jQuery.css( elem, "position" ),
        +                curElem = jQuery( elem ),
        +                props = {};
        +
        +            // Set position first, in-case top/left are set even on static elem
        +            if ( position === "static" ) {
        +                elem.style.position = "relative";
        +            }
        +
        +            curOffset = curElem.offset();
        +            curCSSTop = jQuery.css( elem, "top" );
        +            curCSSLeft = jQuery.css( elem, "left" );
        +            calculatePosition = ( position === "absolute" || position === "fixed" ) &&
        +                ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
        +
        +            // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
        +            if ( calculatePosition ) {
        +                curPosition = curElem.position();
        +                curTop = curPosition.top;
        +                curLeft = curPosition.left;
        +
        +            } else {
        +                curTop = parseFloat( curCSSTop ) || 0;
        +                curLeft = parseFloat( curCSSLeft ) || 0;
        +            }
        +
        +            if ( jQuery.isFunction( options ) ) {
        +                options = options.call( elem, i, curOffset );
        +            }
        +
        +            if ( options.top != null ) {
        +                props.top = ( options.top - curOffset.top ) + curTop;
        +            }
        +            if ( options.left != null ) {
        +                props.left = ( options.left - curOffset.left ) + curLeft;
        +            }
        +
        +            if ( "using" in options ) {
        +                options.using.call( elem, props );
        +
        +            } else {
        +                curElem.css( props );
        +            }
        +        }
        +    };
        +
        +    jQuery.fn.extend({
        +        offset: function( options ) {
        +            if ( arguments.length ) {
        +                return options === undefined ?
        +                    this :
        +                    this.each(function( i ) {
        +                        jQuery.offset.setOffset( this, options, i );
        +                    });
        +            }
        +
        +            var docElem, win,
        +                elem = this[ 0 ],
        +                box = { top: 0, left: 0 },
        +                doc = elem && elem.ownerDocument;
        +
        +            if ( !doc ) {
        +                return;
        +            }
        +
        +            docElem = doc.documentElement;
        +
        +            // Make sure it's not a disconnected DOM node
        +            if ( !jQuery.contains( docElem, elem ) ) {
        +                return box;
        +            }
        +
        +            // If we don't have gBCR, just use 0,0 rather than error
        +            // BlackBerry 5, iOS 3 (original iPhone)
        +            if ( typeof elem.getBoundingClientRect !== strundefined ) {
        +                box = elem.getBoundingClientRect();
        +            }
        +            win = getWindow( doc );
        +            return {
        +                top: box.top + win.pageYOffset - docElem.clientTop,
        +                left: box.left + win.pageXOffset - docElem.clientLeft
        +            };
        +        },
        +
        +        position: function() {
        +            if ( !this[ 0 ] ) {
        +                return;
        +            }
        +
        +            var offsetParent, offset,
        +                elem = this[ 0 ],
        +                parentOffset = { top: 0, left: 0 };
        +
        +            // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
        +            if ( jQuery.css( elem, "position" ) === "fixed" ) {
        +                // We assume that getBoundingClientRect is available when computed position is fixed
        +                offset = elem.getBoundingClientRect();
        +
        +            } else {
        +                // Get *real* offsetParent
        +                offsetParent = this.offsetParent();
        +
        +                // Get correct offsets
        +                offset = this.offset();
        +                if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
        +                    parentOffset = offsetParent.offset();
        +                }
        +
        +                // Add offsetParent borders
        +                parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
        +                parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
        +            }
        +
        +            // Subtract parent offsets and element margins
        +            return {
        +                top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
        +                left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
        +            };
        +        },
        +
        +        offsetParent: function() {
        +            return this.map(function() {
        +                var offsetParent = this.offsetParent || docElem;
        +
        +                while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
        +                    offsetParent = offsetParent.offsetParent;
        +                }
        +
        +                return offsetParent || docElem;
        +            });
        +        }
        +    });
        +
        +// Create scrollLeft and scrollTop methods
        +    jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
        +        var top = "pageYOffset" === prop;
        +
        +        jQuery.fn[ method ] = function( val ) {
        +            return access( this, function( elem, method, val ) {
        +                var win = getWindow( elem );
        +
        +                if ( val === undefined ) {
        +                    return win ? win[ prop ] : elem[ method ];
        +                }
        +
        +                if ( win ) {
        +                    win.scrollTo(
        +                        !top ? val : window.pageXOffset,
        +                        top ? val : window.pageYOffset
        +                    );
        +
        +                } else {
        +                    elem[ method ] = val;
        +                }
        +            }, method, val, arguments.length, null );
        +        };
        +    });
        +
        +// Add the top/left cssHooks using jQuery.fn.position
        +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
        +// getComputedStyle returns percent when specified for top/left/bottom/right
        +// rather than make the css module depend on the offset module, we just check for it here
        +    jQuery.each( [ "top", "left" ], function( i, prop ) {
        +        jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
        +            function( elem, computed ) {
        +                if ( computed ) {
        +                    computed = curCSS( elem, prop );
        +                    // if curCSS returns percentage, fallback to offset
        +                    return rnumnonpx.test( computed ) ?
        +                        jQuery( elem ).position()[ prop ] + "px" :
        +                        computed;
        +                }
        +            }
        +        );
        +    });
        +
        +
        +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
        +    jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        +        jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
        +            // margin is only for outerHeight, outerWidth
        +            jQuery.fn[ funcName ] = function( margin, value ) {
        +                var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
        +                    extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
        +
        +                return access( this, function( elem, type, value ) {
        +                    var doc;
        +
        +                    if ( jQuery.isWindow( elem ) ) {
        +                        // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
        +                        // isn't a whole lot we can do. See pull request at this URL for discussion:
        +                        // https://github.com/jquery/jquery/pull/764
        +                        return elem.document.documentElement[ "client" + name ];
        +                    }
        +
        +                    // Get document width or height
        +                    if ( elem.nodeType === 9 ) {
        +                        doc = elem.documentElement;
        +
        +                        // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
        +                        // whichever is greatest
        +                        return Math.max(
        +                            elem.body[ "scroll" + name ], doc[ "scroll" + name ],
        +                            elem.body[ "offset" + name ], doc[ "offset" + name ],
        +                            doc[ "client" + name ]
        +                        );
        +                    }
        +
        +                    return value === undefined ?
        +                        // Get width or height on the element, requesting but not forcing parseFloat
        +                        jQuery.css( elem, type, extra ) :
        +
        +                        // Set width or height on the element
        +                        jQuery.style( elem, type, value, extra );
        +                }, type, chainable ? margin : undefined, chainable, null );
        +            };
        +        });
        +    });
        +
        +
        +// The number of elements contained in the matched element set
        +    jQuery.fn.size = function() {
        +        return this.length;
        +    };
        +
        +    jQuery.fn.andSelf = jQuery.fn.addBack;
        +
        +
        +
        +
        +// Register as a named AMD module, since jQuery can be concatenated with other
        +// files that may use define, but not via a proper concatenation script that
        +// understands anonymous AMD modules. A named AMD is safest and most robust
        +// way to register. Lowercase jquery is used because AMD module names are
        +// derived from file names, and jQuery is normally delivered in a lowercase
        +// file name. Do this after creating the global so that if an AMD module wants
        +// to call noConflict to hide this version of jQuery, it will work.
        +    if ( typeof define === "function" && define.amd ) {
        +        define( "jquery", [], function() {
        +            return jQuery;
        +        });
        +    }
        +
        +
        +
        +
        +    var
        +    // Map over jQuery in case of overwrite
        +        _jQuery = window.jQuery,
        +
        +    // Map over the $ in case of overwrite
        +        _$ = window.$;
        +
        +    jQuery.noConflict = function( deep ) {
        +        if ( window.$ === jQuery ) {
        +            window.$ = _$;
        +        }
        +
        +        if ( deep && window.jQuery === jQuery ) {
        +            window.jQuery = _jQuery;
        +        }
        +
        +        return jQuery;
        +    };
        +
        +// Expose jQuery and $ identifiers, even in
        +// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
        +// and CommonJS for browser emulators (#13566)
        +    if ( typeof noGlobal === strundefined ) {
        +        window.jQuery = window.$ = jQuery;
        +    }
        +
        +
        +
        +
        +    return jQuery;
        +
        +}));
        \ No newline at end of file
        diff --git a/bower_components/tether/.bower.json b/bower_components/tether/.bower.json
        new file mode 100644
        index 0000000000..f336b8ad8e
        --- /dev/null
        +++ b/bower_components/tether/.bower.json
        @@ -0,0 +1,35 @@
        +{
        +  "name": "tether",
        +  "version": "1.4.0",
        +  "homepage": "http://github.hubspot.com/tether",
        +  "authors": [
        +    "Zack Bloom <zackbloom@gmail.com>",
        +    "Adam Schwartz <adam.flynn.schwartz@gmail.com>"
        +  ],
        +  "maintainers": [
        +    "Nicholas Hwang <nick.joosung.hwang@gmail.com>",
        +    "Trevor Burnham <trevorburnham@gmail.com>"
        +  ],
        +  "description": "A client-side library to make absolutely positioned elements attach to elements in the page efficiently.",
        +  "keywords": [
        +    "javascript"
        +  ],
        +  "license": "MIT",
        +  "main": "dist/js/tether.js",
        +  "ignore": [
        +    "**/.*",
        +    "node_modules",
        +    "bower_components",
        +    "test",
        +    "tests"
        +  ],
        +  "_release": "1.4.0",
        +  "_resolution": {
        +    "type": "version",
        +    "tag": "v1.4.0",
        +    "commit": "3d7119e590661f8c9e9e566c8a7640c189687215"
        +  },
        +  "_source": "https://github.com/HubSpot/tether.git",
        +  "_target": "^1.4.0",
        +  "_originalSource": "tether"
        +}
        \ No newline at end of file
        diff --git a/bower_components/tether/CHANGELOG.md b/bower_components/tether/CHANGELOG.md
        new file mode 100644
        index 0000000000..d5a8047ff7
        --- /dev/null
        +++ b/bower_components/tether/CHANGELOG.md
        @@ -0,0 +1,13 @@
        +## v1.3.0
        +- Tether instances now fire an 'update' event when attachments change due to constraints (#119)
        +
        +## v1.0.1
        +- Update arrow mixin to change arrow pointer event
        +
        +
        +## v1.0.0
        +- Coffeescript -> ES6
        +- Proper UMD Wrapper
        +- Update build steps
        +- Add changelog
        +- Provide minified CSS
        diff --git a/bower_components/tether/CONTRIBUTING.md b/bower_components/tether/CONTRIBUTING.md
        new file mode 100644
        index 0000000000..8e4b9c542f
        --- /dev/null
        +++ b/bower_components/tether/CONTRIBUTING.md
        @@ -0,0 +1,59 @@
        +# Contributing Guide
        +
        +You will need:
        +
        +- Node.js/io.js & npm
        +- Bower
        +- Gulp
        +
        +
        +## Getting started
        +
        +1. Fork the project
        +2. Clone your forked project by running `git clone git@github.com:{
        +   YOUR_USERNAME }/tether.git`
        +3. Run `npm install` to install both node modules and bower components
        +4. Test that you can build the source by moving/renaming the existing `dist`
        +   directory and running `npm run build`
        +5. Assuming everything went well, you should now have a `dist` directory that
        +   matches the one you moved in step 4
        +
        +
        +## Writing code!
        +
        +We use `gulp` to facilitate things like transpilation, minification, etc. so
        +can you focus on writing relevant code. If there is a fix or feature you would like
        +to contribute, we ask that you take the following steps:
        +
        +1. Most of the _editable_ code lives in the `src` directory while built code
        +   will end up in the `dist` directory upon running `npm run build`.
        +
        +2. Depending on how big your changes are, bump the version numbers appropriately
        +   in `bower.json` and `package.json`. We try to follow semver, so a good rule
        +   of thumb for how to bump the version is:
        +   - A fix to existing code, perform a patch bump e.g. x.x.0 -> x.x.1
        +   - New feature, perform a minor bump e.g. x.0.x -> x.1.x
        +   - Breaking changes such a rewrite, perform a major bump e.g.
        +     1.x.x -> 2.x.x
        +
        +   Versioning is hard, so just use good judgement and we'll be more than happy
        +   to help out.
        +
        +   __NOTE__: There is a `gulp` task that will automate some of the versioning.
        +   You can run `gulp version:{type}` where type is `patch|minor|major` to
        +   update both `bower.json` and `package.json` as well as add the appropriate
        +   git tag.
        +
        +3. Provide a thoughtful commit message and push your changes to your fork using
        +   `git push origin master` (assuming your forked project is using `origin` for
        +   the remote name and you are on the `master` branch).
        +
        +4. Open a Pull Request on GitHub with a description of your changes.
        +
        +
        +## Testing
        +
        +Work in progress. We are hoping to add some tests, so if you would like to help
        +us get started, feel free to contact us through the Issues or open a Pull
        +Request.
        +
        diff --git a/bower_components/tether/LICENSE b/bower_components/tether/LICENSE
        new file mode 100644
        index 0000000000..0e08c0a565
        --- /dev/null
        +++ b/bower_components/tether/LICENSE
        @@ -0,0 +1,8 @@
        +Copyright (c) 2014-2016 HubSpot, Inc.
        +
        +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
        +
        +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
        +
        +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        +
        diff --git a/bower_components/tether/README.md b/bower_components/tether/README.md
        new file mode 100644
        index 0000000000..e7db89361e
        --- /dev/null
        +++ b/bower_components/tether/README.md
        @@ -0,0 +1,106 @@
        +## Tether
        +
        +[![GitHub
        +version](https://badge.fury.io/gh/HubSpot%2Ftether.svg)](http://badge.fury.io/gh/HubSpot%2Ftether)
        +
        +[Tether](http://github.hubspot.com/tether/) is a small, focused JavaScript library for defining and managing the position of user interface (UI) elements in relation to one another on a web page. It is a tool for web developers building features that require certain UI elements to be precisely positioned based on the location of another UI element.
        +
        +There are often situations in UI development where elements need to be attached to other elements, but placing them right next to each other in the [DOM tree](https://en.wikipedia.org/wiki/Document_Object_Model) can be problematic based on the context. For example, what happens if the element we’re attaching other elements to is fixed to the center of the screen? Or what if the element is inside a scrollable container? How can we prevent the attached element from being clipped as it disappears from view while a user is scrolling? Tether can solve all of these problems and more.
        +
        +Some common UI elements that have been built with Tether are [tooltips](http://github.hubspot.com/tooltip/docs/welcome), [select menus](http://github.hubspot.com/select/docs/welcome), [dropdown menus](http://github.hubspot.com/drop/docs/welcome), and [guided tours](http://github.hubspot.com/shepherd/docs/welcome). Tether is flexible and can be used to [solve](http://github.hubspot.com/tether/examples/out-of-bounds/) [all](http://github.hubspot.com/tether/examples/content-visible) [kinds](http://github.hubspot.com/tether/examples/element-scroll) [of](http://github.hubspot.com/tether/examples/enable-disable) interesting [problems](http://github.hubspot.com/tether/examples/viewport); it ensures UI elements stay where they need to be, based on the various user interactions (click, scroll, etc) and layout contexts (fixed positioning, inside scrollable containers, etc).
        +
        +Please have a look at the [documentation](http://github.hubspot.com/tether/) for a more detailed explanation of why you might need Tether for your next project.
        +
        +## What to Use Tether for and When to Use It
        +
        +Tether is a small, focused JavaScript library. For those who might be new to JavaScript, a library is simply a JavaScript file (or files) that contain useful JavaScript code to help achieve tasks easier and faster. Since Tether is a JavaScript user interface (**UI**) library, it contains code to help you to manage the way your website or web app appears.
        +
        +Tether’s goal to is to help you position your elements side-by-side when needed.
        +
        +Let’s say you’ve started working on your dream project&mdash;a fancy web app that’s sure to become the next big thing! An important feature of your new app is to allow users to comment on shared photos. However, due to limited vertical space and the overall layout of your new app, you’d like to display the comments **next** to the image, similar to how Instagram does it.
        +
        +Your HTML code might look something like this:
        +
        +```html
        +<div class="container">
        +  <img src="awesome-picture.jpg" alt="Awesome Picture" class="picture">
        +  <div class="comments">
        +    ...
        +  </div>
        +</div>
        +```
        +
        +Now, you could achieve this with some CSS using its `position` property, but going this route can be problematic since many of `position`’s values take elements **out** of the natural DOM flow. For example, if you have an element at the bottom of your HTML document, using `position: absolute` or `position: fixed` might could move it all the way to the top of your website in the browser.
        +
        +Not only that, but you also have to make manual adjustments to ensure **other** elements aren’t negatively affected by the positioned elements. Not to mention, you probably want your comment box to be **responsive**, and look good across different device sizes. Coding a solution for this manually is a challenge all on its own.
        +
        +**Enter Tether!**
        +
        +After installing Tether and including it in your project, you can begin using it!
        +
        +1. In your JavaScript file, create a new instance (or constructor function) of the `Tether` object:
        +
        +    ```javascript
        +    new Tether({});
        +    ```
        +
        +2. Within the curly braces (`{}`) you can configure the library’s options. Tether’s extensive list of options can be found in the [Tether documentation](http://github.hubspot.com/tether/).
        +
        +    ```javascript
        +    new Tether({
        +      element: '.comments',
        +      target: '.picture',
        +      attachment: 'top right'
        +      targetAttachment: 'top left'
        +    });
        +    ```
        +
        +Now you have a perfectly placed comment section to go with your awesome picture! It’ll even stay attached to the element when a user resizes their browser window.
        +
        +There are tons of other useful features of Tether as well, instead of “comment boxes” you could also build:
        +
        +* Tooltips for useful hints and tricks,
        +* Dropdown menus,
        +* Autocomplete popups for forms,
        +* and [more](http://github.hubspot.com/tether/examples/list_of_examples/)!
        +
        +## Install
        +
        +__npm__
        +```sh
        +$ npm install tether
        +```
        +
        +__bower__
        +```sh
        +$ bower install tether
        +```
        +
        +__download__
        +
        +Or just download from the [releases](https://github.com/HubSpot/tether/releases).
        +
        +## Usage
        +You only need to include [tether.min.js](https://github.com/HubSpot/tether/blob/master/dist/js/tether.min.js) in your page:
        +```
        +<script src="path/to/dist/js/tether.min.js"></script>
        +```
        +Or just use a CDN:
        +```
        +<script src="//cdnjs.cloudflare.com/ajax/libs/tether/1.3.1/js/tether.min.js"></script>
        +```
        +
        +The css files in the [dist/css](https://github.com/HubSpot/tether/tree/master/dist/css) folder are not required to get tether running.
        +
        +For more details jump straight in to the detailed [Usage](http://github.hubspot.com/tether/#usage) page.
        +
        +[![Tether Docs](http://i.imgur.com/YCx8cLr.png)](http://github.hubspot.com/tether/#usage)
        +
        +[Demo & API Documentation](http://github.hubspot.com/tether/)
        +
        +## Contributing
        +
        +We encourage contributions of all kinds. If you would like to contribute in some way, please review our [guidelines for contributing](CONTRIBUTING.md).
        +
        +## License
        +Copyright &copy; 2014-2016 HubSpot - [MIT License](LICENSE)
        diff --git a/bower_components/tether/bower.json b/bower_components/tether/bower.json
        new file mode 100644
        index 0000000000..ea9b6b759e
        --- /dev/null
        +++ b/bower_components/tether/bower.json
        @@ -0,0 +1,26 @@
        +{
        +  "name": "tether",
        +  "version": "1.4.0",
        +  "homepage": "http://github.hubspot.com/tether",
        +  "authors": [
        +    "Zack Bloom <zackbloom@gmail.com>",
        +    "Adam Schwartz <adam.flynn.schwartz@gmail.com>"
        +  ],
        +  "maintainers": [
        +    "Nicholas Hwang <nick.joosung.hwang@gmail.com>",
        +    "Trevor Burnham <trevorburnham@gmail.com>"
        +  ],
        +  "description": "A client-side library to make absolutely positioned elements attach to elements in the page efficiently.",
        +  "keywords": [
        +    "javascript"
        +  ],
        +  "license": "MIT",
        +  "main": "dist/js/tether.js",
        +  "ignore": [
        +    "**/.*",
        +    "node_modules",
        +    "bower_components",
        +    "test",
        +    "tests"
        +  ]
        +}
        diff --git a/bower_components/tether/component.json b/bower_components/tether/component.json
        new file mode 100644
        index 0000000000..1e81c50db0
        --- /dev/null
        +++ b/bower_components/tether/component.json
        @@ -0,0 +1,22 @@
        +{
        +  "name": "tether",
        +  "repo": "HubSpot/tether",
        +  "version": "1.3.9",
        +  "description": "A client-side library to make absolutely positioned elements attach to elements in the page efficiently.",
        +  "authors": [
        +    "Zack Bloom <zackbloom@gmail.com>",
        +    "Adam Schwartz <adam.flynn.schwartz@gmail.com>"
        +  ],
        +  "maintainers": [
        +    "Nicholas Hwang <nick.joosung.hwang@gmail.com>"
        +  ],
        +  "license": "MIT",
        +  "demo": "http://github.hubspot.com/tether/docs/welcome/",
        +  "main": "dist/js/tether.js",
        +  "styles": [
        +    "dist/css/tether.css"
        +  ],
        +  "scripts": [
        +    "dist/js/tether.js"
        +  ]
        +}
        diff --git a/bower_components/tether/dist/css/tether-theme-arrows-dark.css b/bower_components/tether/dist/css/tether-theme-arrows-dark.css
        new file mode 100644
        index 0000000000..c000dd7400
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether-theme-arrows-dark.css
        @@ -0,0 +1,150 @@
        +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
        +  box-sizing: border-box; }
        +
        +.tether-element {
        +  position: absolute;
        +  display: none; }
        +  .tether-element.tether-open {
        +    display: block; }
        +
        +.tether-element.tether-theme-arrows-dark {
        +  max-width: 100%;
        +  max-height: 100%; }
        +  .tether-element.tether-theme-arrows-dark .tether-content {
        +    border-radius: 5px;
        +    position: relative;
        +    font-family: inherit;
        +    background: #000;
        +    color: #fff;
        +    padding: 1em;
        +    font-size: 1.1em;
        +    line-height: 1.5em; }
        +    .tether-element.tether-theme-arrows-dark .tether-content:before {
        +      content: "";
        +      display: block;
        +      position: absolute;
        +      width: 0;
        +      height: 0;
        +      border-color: transparent;
        +      border-width: 16px;
        +      border-style: solid; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before {
        +      top: 100%;
        +      left: 50%;
        +      margin-left: -16px;
        +      border-top-color: #000;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before {
        +      bottom: 100%;
        +      left: 50%;
        +      margin-left: -16px;
        +      border-bottom-color: #000;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content {
        +    margin-right: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
        +      left: 100%;
        +      top: 50%;
        +      margin-top: -16px;
        +      border-left-color: #000;
        +      border-right: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content {
        +    margin-left: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
        +      right: 100%;
        +      top: 50%;
        +      margin-top: -16px;
        +      border-right-color: #000;
        +      border-left: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content {
        +    left: -32px; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content {
        +    left: 32px; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
        +      bottom: 100%;
        +      left: 16px;
        +      border-bottom-color: #000;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
        +      bottom: 100%;
        +      right: 16px;
        +      border-bottom-color: #000;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
        +      top: 100%;
        +      left: 16px;
        +      border-top-color: #000;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
        +      top: 100%;
        +      right: 16px;
        +      border-top-color: #000;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
        +      bottom: 100%;
        +      left: 16px;
        +      border-bottom-color: #000;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
        +      bottom: 100%;
        +      right: 16px;
        +      border-bottom-color: #000;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
        +      top: 100%;
        +      left: 16px;
        +      border-top-color: #000;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
        +      top: 100%;
        +      right: 16px;
        +      border-top-color: #000;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
        +    margin-right: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
        +      top: 16px;
        +      left: 100%;
        +      border-left-color: #000;
        +      border-right: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
        +    margin-left: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
        +      top: 16px;
        +      right: 100%;
        +      border-right-color: #000;
        +      border-left: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
        +    margin-right: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
        +      bottom: 16px;
        +      left: 100%;
        +      border-left-color: #000;
        +      border-right: 0; }
        +  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
        +    margin-left: 16px; }
        +    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
        +      bottom: 16px;
        +      right: 100%;
        +      border-right-color: #000;
        +      border-left: 0; }
        diff --git a/bower_components/tether/dist/css/tether-theme-arrows-dark.min.css b/bower_components/tether/dist/css/tether-theme-arrows-dark.min.css
        new file mode 100644
        index 0000000000..73d263e98d
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether-theme-arrows-dark.min.css
        @@ -0,0 +1 @@
        +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows-dark{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows-dark .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#000;color:#fff;padding:1em;font-size:1.1em;line-height:1.5em}.tether-element.tether-theme-arrows-dark .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#000;border-left:0}
        \ No newline at end of file
        diff --git a/bower_components/tether/dist/css/tether-theme-arrows.css b/bower_components/tether/dist/css/tether-theme-arrows.css
        new file mode 100644
        index 0000000000..e9e3bbfabf
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether-theme-arrows.css
        @@ -0,0 +1,154 @@
        +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
        +  box-sizing: border-box; }
        +
        +.tether-element {
        +  position: absolute;
        +  display: none; }
        +  .tether-element.tether-open {
        +    display: block; }
        +
        +.tether-element.tether-theme-arrows {
        +  max-width: 100%;
        +  max-height: 100%; }
        +  .tether-element.tether-theme-arrows .tether-content {
        +    border-radius: 5px;
        +    position: relative;
        +    font-family: inherit;
        +    background: #fff;
        +    color: inherit;
        +    padding: 1em;
        +    font-size: 1.1em;
        +    line-height: 1.5em;
        +    -webkit-transform: translateZ(0);
        +            transform: translateZ(0);
        +    -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
        +            filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); }
        +    .tether-element.tether-theme-arrows .tether-content:before {
        +      content: "";
        +      display: block;
        +      position: absolute;
        +      width: 0;
        +      height: 0;
        +      border-color: transparent;
        +      border-width: 16px;
        +      border-style: solid; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before {
        +      top: 100%;
        +      left: 50%;
        +      margin-left: -16px;
        +      border-top-color: #fff;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before {
        +      bottom: 100%;
        +      left: 50%;
        +      margin-left: -16px;
        +      border-bottom-color: #fff;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content {
        +    margin-right: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
        +      left: 100%;
        +      top: 50%;
        +      margin-top: -16px;
        +      border-left-color: #fff;
        +      border-right: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content {
        +    margin-left: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
        +      right: 100%;
        +      top: 50%;
        +      margin-top: -16px;
        +      border-right-color: #fff;
        +      border-left: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content {
        +    left: -32px; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content {
        +    left: 32px; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
        +      bottom: 100%;
        +      left: 16px;
        +      border-bottom-color: #fff;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
        +      bottom: 100%;
        +      right: 16px;
        +      border-bottom-color: #fff;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
        +      top: 100%;
        +      left: 16px;
        +      border-top-color: #fff;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
        +      top: 100%;
        +      right: 16px;
        +      border-top-color: #fff;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
        +      bottom: 100%;
        +      left: 16px;
        +      border-bottom-color: #fff;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
        +    margin-top: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
        +      bottom: 100%;
        +      right: 16px;
        +      border-bottom-color: #fff;
        +      border-top: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
        +      top: 100%;
        +      left: 16px;
        +      border-top-color: #fff;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
        +    margin-bottom: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
        +      top: 100%;
        +      right: 16px;
        +      border-top-color: #fff;
        +      border-bottom: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
        +    margin-right: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
        +      top: 16px;
        +      left: 100%;
        +      border-left-color: #fff;
        +      border-right: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
        +    margin-left: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
        +      top: 16px;
        +      right: 100%;
        +      border-right-color: #fff;
        +      border-left: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
        +    margin-right: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
        +      bottom: 16px;
        +      left: 100%;
        +      border-left-color: #fff;
        +      border-right: 0; }
        +  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
        +    margin-left: 16px; }
        +    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
        +      bottom: 16px;
        +      right: 100%;
        +      border-right-color: #fff;
        +      border-left: 0; }
        diff --git a/bower_components/tether/dist/css/tether-theme-arrows.min.css b/bower_components/tether/dist/css/tether-theme-arrows.min.css
        new file mode 100644
        index 0000000000..61994a9c4b
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether-theme-arrows.min.css
        @@ -0,0 +1 @@
        +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2));filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2))}.tether-element.tether-theme-arrows .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#fff;border-left:0}
        \ No newline at end of file
        diff --git a/bower_components/tether/dist/css/tether-theme-basic.css b/bower_components/tether/dist/css/tether-theme-basic.css
        new file mode 100644
        index 0000000000..f2b3b5c6a2
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether-theme-basic.css
        @@ -0,0 +1,21 @@
        +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
        +  box-sizing: border-box; }
        +
        +.tether-element {
        +  position: absolute;
        +  display: none; }
        +  .tether-element.tether-open {
        +    display: block; }
        +
        +.tether-element.tether-theme-basic {
        +  max-width: 100%;
        +  max-height: 100%; }
        +  .tether-element.tether-theme-basic .tether-content {
        +    border-radius: 5px;
        +    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
        +    font-family: inherit;
        +    background: #fff;
        +    color: inherit;
        +    padding: 1em;
        +    font-size: 1.1em;
        +    line-height: 1.5em; }
        diff --git a/bower_components/tether/dist/css/tether-theme-basic.min.css b/bower_components/tether/dist/css/tether-theme-basic.min.css
        new file mode 100644
        index 0000000000..f117c4799a
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether-theme-basic.min.css
        @@ -0,0 +1 @@
        +.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-basic{max-width:100%;max-height:100%}.tether-element.tether-theme-basic .tether-content{border-radius:5px;box-shadow:0 2px 8px rgba(0,0,0,.2);font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em}
        \ No newline at end of file
        diff --git a/bower_components/tether/dist/css/tether.css b/bower_components/tether/dist/css/tether.css
        new file mode 100644
        index 0000000000..fc30f56745
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether.css
        @@ -0,0 +1,8 @@
        +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
        +  box-sizing: border-box; }
        +
        +.tether-element {
        +  position: absolute;
        +  display: none; }
        +  .tether-element.tether-open {
        +    display: block; }
        diff --git a/bower_components/tether/dist/css/tether.min.css b/bower_components/tether/dist/css/tether.min.css
        new file mode 100644
        index 0000000000..328251c90c
        --- /dev/null
        +++ b/bower_components/tether/dist/css/tether.min.css
        @@ -0,0 +1 @@
        +.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}
        \ No newline at end of file
        diff --git a/bower_components/tether/dist/js/tether.js b/bower_components/tether/dist/js/tether.js
        new file mode 100644
        index 0000000000..ea141f01d0
        --- /dev/null
        +++ b/bower_components/tether/dist/js/tether.js
        @@ -0,0 +1,1811 @@
        +/*! tether 1.4.0 */
        +
        +(function(root, factory) {
        +  if (typeof define === 'function' && define.amd) {
        +    define(factory);
        +  } else if (typeof exports === 'object') {
        +    module.exports = factory(require, exports, module);
        +  } else {
        +    root.Tether = factory();
        +  }
        +}(this, function(require, exports, module) {
        +
        +'use strict';
        +
        +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
        +
        +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
        +
        +var TetherBase = undefined;
        +if (typeof TetherBase === 'undefined') {
        +  TetherBase = { modules: [] };
        +}
        +
        +var zeroElement = null;
        +
        +// Same as native getBoundingClientRect, except it takes into account parent <frame> offsets
        +// if the element lies within a nested document (<frame> or <iframe>-like).
        +function getActualBoundingClientRect(node) {
        +  var boundingRect = node.getBoundingClientRect();
        +
        +  // The original object returned by getBoundingClientRect is immutable, so we clone it
        +  // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9
        +  var rect = {};
        +  for (var k in boundingRect) {
        +    rect[k] = boundingRect[k];
        +  }
        +
        +  if (node.ownerDocument !== document) {
        +    var _frameElement = node.ownerDocument.defaultView.frameElement;
        +    if (_frameElement) {
        +      var frameRect = getActualBoundingClientRect(_frameElement);
        +      rect.top += frameRect.top;
        +      rect.bottom += frameRect.top;
        +      rect.left += frameRect.left;
        +      rect.right += frameRect.left;
        +    }
        +  }
        +
        +  return rect;
        +}
        +
        +function getScrollParents(el) {
        +  // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;
        +  // https://bugzilla.mozilla.org/show_bug.cgi?id=548397
        +  var computedStyle = getComputedStyle(el) || {};
        +  var position = computedStyle.position;
        +  var parents = [];
        +
        +  if (position === 'fixed') {
        +    return [el];
        +  }
        +
        +  var parent = el;
        +  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {
        +    var style = undefined;
        +    try {
        +      style = getComputedStyle(parent);
        +    } catch (err) {}
        +
        +    if (typeof style === 'undefined' || style === null) {
        +      parents.push(parent);
        +      return parents;
        +    }
        +
        +    var _style = style;
        +    var overflow = _style.overflow;
        +    var overflowX = _style.overflowX;
        +    var overflowY = _style.overflowY;
        +
        +    if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {
        +      if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {
        +        parents.push(parent);
        +      }
        +    }
        +  }
        +
        +  parents.push(el.ownerDocument.body);
        +
        +  // If the node is within a frame, account for the parent window scroll
        +  if (el.ownerDocument !== document) {
        +    parents.push(el.ownerDocument.defaultView);
        +  }
        +
        +  return parents;
        +}
        +
        +var uniqueId = (function () {
        +  var id = 0;
        +  return function () {
        +    return ++id;
        +  };
        +})();
        +
        +var zeroPosCache = {};
        +var getOrigin = function getOrigin() {
        +  // getBoundingClientRect is unfortunately too accurate.  It introduces a pixel or two of
        +  // jitter as the user scrolls that messes with our ability to detect if two positions
        +  // are equivilant or not.  We place an element at the top left of the page that will
        +  // get the same jitter, so we can cancel the two out.
        +  var node = zeroElement;
        +  if (!node || !document.body.contains(node)) {
        +    node = document.createElement('div');
        +    node.setAttribute('data-tether-id', uniqueId());
        +    extend(node.style, {
        +      top: 0,
        +      left: 0,
        +      position: 'absolute'
        +    });
        +
        +    document.body.appendChild(node);
        +
        +    zeroElement = node;
        +  }
        +
        +  var id = node.getAttribute('data-tether-id');
        +  if (typeof zeroPosCache[id] === 'undefined') {
        +    zeroPosCache[id] = getActualBoundingClientRect(node);
        +
        +    // Clear the cache when this position call is done
        +    defer(function () {
        +      delete zeroPosCache[id];
        +    });
        +  }
        +
        +  return zeroPosCache[id];
        +};
        +
        +function removeUtilElements() {
        +  if (zeroElement) {
        +    document.body.removeChild(zeroElement);
        +  }
        +  zeroElement = null;
        +};
        +
        +function getBounds(el) {
        +  var doc = undefined;
        +  if (el === document) {
        +    doc = document;
        +    el = document.documentElement;
        +  } else {
        +    doc = el.ownerDocument;
        +  }
        +
        +  var docEl = doc.documentElement;
        +
        +  var box = getActualBoundingClientRect(el);
        +
        +  var origin = getOrigin();
        +
        +  box.top -= origin.top;
        +  box.left -= origin.left;
        +
        +  if (typeof box.width === 'undefined') {
        +    box.width = document.body.scrollWidth - box.left - box.right;
        +  }
        +  if (typeof box.height === 'undefined') {
        +    box.height = document.body.scrollHeight - box.top - box.bottom;
        +  }
        +
        +  box.top = box.top - docEl.clientTop;
        +  box.left = box.left - docEl.clientLeft;
        +  box.right = doc.body.clientWidth - box.width - box.left;
        +  box.bottom = doc.body.clientHeight - box.height - box.top;
        +
        +  return box;
        +}
        +
        +function getOffsetParent(el) {
        +  return el.offsetParent || document.documentElement;
        +}
        +
        +var _scrollBarSize = null;
        +function getScrollBarSize() {
        +  if (_scrollBarSize) {
        +    return _scrollBarSize;
        +  }
        +  var inner = document.createElement('div');
        +  inner.style.width = '100%';
        +  inner.style.height = '200px';
        +
        +  var outer = document.createElement('div');
        +  extend(outer.style, {
        +    position: 'absolute',
        +    top: 0,
        +    left: 0,
        +    pointerEvents: 'none',
        +    visibility: 'hidden',
        +    width: '200px',
        +    height: '150px',
        +    overflow: 'hidden'
        +  });
        +
        +  outer.appendChild(inner);
        +
        +  document.body.appendChild(outer);
        +
        +  var widthContained = inner.offsetWidth;
        +  outer.style.overflow = 'scroll';
        +  var widthScroll = inner.offsetWidth;
        +
        +  if (widthContained === widthScroll) {
        +    widthScroll = outer.clientWidth;
        +  }
        +
        +  document.body.removeChild(outer);
        +
        +  var width = widthContained - widthScroll;
        +
        +  _scrollBarSize = { width: width, height: width };
        +  return _scrollBarSize;
        +}
        +
        +function extend() {
        +  var out = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
        +
        +  var args = [];
        +
        +  Array.prototype.push.apply(args, arguments);
        +
        +  args.slice(1).forEach(function (obj) {
        +    if (obj) {
        +      for (var key in obj) {
        +        if (({}).hasOwnProperty.call(obj, key)) {
        +          out[key] = obj[key];
        +        }
        +      }
        +    }
        +  });
        +
        +  return out;
        +}
        +
        +function removeClass(el, name) {
        +  if (typeof el.classList !== 'undefined') {
        +    name.split(' ').forEach(function (cls) {
        +      if (cls.trim()) {
        +        el.classList.remove(cls);
        +      }
        +    });
        +  } else {
        +    var regex = new RegExp('(^| )' + name.split(' ').join('|') + '( |$)', 'gi');
        +    var className = getClassName(el).replace(regex, ' ');
        +    setClassName(el, className);
        +  }
        +}
        +
        +function addClass(el, name) {
        +  if (typeof el.classList !== 'undefined') {
        +    name.split(' ').forEach(function (cls) {
        +      if (cls.trim()) {
        +        el.classList.add(cls);
        +      }
        +    });
        +  } else {
        +    removeClass(el, name);
        +    var cls = getClassName(el) + (' ' + name);
        +    setClassName(el, cls);
        +  }
        +}
        +
        +function hasClass(el, name) {
        +  if (typeof el.classList !== 'undefined') {
        +    return el.classList.contains(name);
        +  }
        +  var className = getClassName(el);
        +  return new RegExp('(^| )' + name + '( |$)', 'gi').test(className);
        +}
        +
        +function getClassName(el) {
        +  // Can't use just SVGAnimatedString here since nodes within a Frame in IE have
        +  // completely separately SVGAnimatedString base classes
        +  if (el.className instanceof el.ownerDocument.defaultView.SVGAnimatedString) {
        +    return el.className.baseVal;
        +  }
        +  return el.className;
        +}
        +
        +function setClassName(el, className) {
        +  el.setAttribute('class', className);
        +}
        +
        +function updateClasses(el, add, all) {
        +  // Of the set of 'all' classes, we need the 'add' classes, and only the
        +  // 'add' classes to be set.
        +  all.forEach(function (cls) {
        +    if (add.indexOf(cls) === -1 && hasClass(el, cls)) {
        +      removeClass(el, cls);
        +    }
        +  });
        +
        +  add.forEach(function (cls) {
        +    if (!hasClass(el, cls)) {
        +      addClass(el, cls);
        +    }
        +  });
        +}
        +
        +var deferred = [];
        +
        +var defer = function defer(fn) {
        +  deferred.push(fn);
        +};
        +
        +var flush = function flush() {
        +  var fn = undefined;
        +  while (fn = deferred.pop()) {
        +    fn();
        +  }
        +};
        +
        +var Evented = (function () {
        +  function Evented() {
        +    _classCallCheck(this, Evented);
        +  }
        +
        +  _createClass(Evented, [{
        +    key: 'on',
        +    value: function on(event, handler, ctx) {
        +      var once = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];
        +
        +      if (typeof this.bindings === 'undefined') {
        +        this.bindings = {};
        +      }
        +      if (typeof this.bindings[event] === 'undefined') {
        +        this.bindings[event] = [];
        +      }
        +      this.bindings[event].push({ handler: handler, ctx: ctx, once: once });
        +    }
        +  }, {
        +    key: 'once',
        +    value: function once(event, handler, ctx) {
        +      this.on(event, handler, ctx, true);
        +    }
        +  }, {
        +    key: 'off',
        +    value: function off(event, handler) {
        +      if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') {
        +        return;
        +      }
        +
        +      if (typeof handler === 'undefined') {
        +        delete this.bindings[event];
        +      } else {
        +        var i = 0;
        +        while (i < this.bindings[event].length) {
        +          if (this.bindings[event][i].handler === handler) {
        +            this.bindings[event].splice(i, 1);
        +          } else {
        +            ++i;
        +          }
        +        }
        +      }
        +    }
        +  }, {
        +    key: 'trigger',
        +    value: function trigger(event) {
        +      if (typeof this.bindings !== 'undefined' && this.bindings[event]) {
        +        var i = 0;
        +
        +        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        +          args[_key - 1] = arguments[_key];
        +        }
        +
        +        while (i < this.bindings[event].length) {
        +          var _bindings$event$i = this.bindings[event][i];
        +          var handler = _bindings$event$i.handler;
        +          var ctx = _bindings$event$i.ctx;
        +          var once = _bindings$event$i.once;
        +
        +          var context = ctx;
        +          if (typeof context === 'undefined') {
        +            context = this;
        +          }
        +
        +          handler.apply(context, args);
        +
        +          if (once) {
        +            this.bindings[event].splice(i, 1);
        +          } else {
        +            ++i;
        +          }
        +        }
        +      }
        +    }
        +  }]);
        +
        +  return Evented;
        +})();
        +
        +TetherBase.Utils = {
        +  getActualBoundingClientRect: getActualBoundingClientRect,
        +  getScrollParents: getScrollParents,
        +  getBounds: getBounds,
        +  getOffsetParent: getOffsetParent,
        +  extend: extend,
        +  addClass: addClass,
        +  removeClass: removeClass,
        +  hasClass: hasClass,
        +  updateClasses: updateClasses,
        +  defer: defer,
        +  flush: flush,
        +  uniqueId: uniqueId,
        +  Evented: Evented,
        +  getScrollBarSize: getScrollBarSize,
        +  removeUtilElements: removeUtilElements
        +};
        +/* globals TetherBase, performance */
        +
        +'use strict';
        +
        +var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
        +
        +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
        +
        +var _get = function get(_x6, _x7, _x8) { var _again = true; _function: while (_again) { var object = _x6, property = _x7, receiver = _x8; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x6 = parent; _x7 = property; _x8 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
        +
        +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
        +
        +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
        +
        +if (typeof TetherBase === 'undefined') {
        +  throw new Error('You must include the utils.js file before tether.js');
        +}
        +
        +var _TetherBase$Utils = TetherBase.Utils;
        +var getScrollParents = _TetherBase$Utils.getScrollParents;
        +var getBounds = _TetherBase$Utils.getBounds;
        +var getOffsetParent = _TetherBase$Utils.getOffsetParent;
        +var extend = _TetherBase$Utils.extend;
        +var addClass = _TetherBase$Utils.addClass;
        +var removeClass = _TetherBase$Utils.removeClass;
        +var updateClasses = _TetherBase$Utils.updateClasses;
        +var defer = _TetherBase$Utils.defer;
        +var flush = _TetherBase$Utils.flush;
        +var getScrollBarSize = _TetherBase$Utils.getScrollBarSize;
        +var removeUtilElements = _TetherBase$Utils.removeUtilElements;
        +
        +function within(a, b) {
        +  var diff = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2];
        +
        +  return a + diff >= b && b >= a - diff;
        +}
        +
        +var transformKey = (function () {
        +  if (typeof document === 'undefined') {
        +    return '';
        +  }
        +  var el = document.createElement('div');
        +
        +  var transforms = ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'];
        +  for (var i = 0; i < transforms.length; ++i) {
        +    var key = transforms[i];
        +    if (el.style[key] !== undefined) {
        +      return key;
        +    }
        +  }
        +})();
        +
        +var tethers = [];
        +
        +var position = function position() {
        +  tethers.forEach(function (tether) {
        +    tether.position(false);
        +  });
        +  flush();
        +};
        +
        +function now() {
        +  if (typeof performance !== 'undefined' && typeof performance.now !== 'undefined') {
        +    return performance.now();
        +  }
        +  return +new Date();
        +}
        +
        +(function () {
        +  var lastCall = null;
        +  var lastDuration = null;
        +  var pendingTimeout = null;
        +
        +  var tick = function tick() {
        +    if (typeof lastDuration !== 'undefined' && lastDuration > 16) {
        +      // We voluntarily throttle ourselves if we can't manage 60fps
        +      lastDuration = Math.min(lastDuration - 16, 250);
        +
        +      // Just in case this is the last event, remember to position just once more
        +      pendingTimeout = setTimeout(tick, 250);
        +      return;
        +    }
        +
        +    if (typeof lastCall !== 'undefined' && now() - lastCall < 10) {
        +      // Some browsers call events a little too frequently, refuse to run more than is reasonable
        +      return;
        +    }
        +
        +    if (pendingTimeout != null) {
        +      clearTimeout(pendingTimeout);
        +      pendingTimeout = null;
        +    }
        +
        +    lastCall = now();
        +    position();
        +    lastDuration = now() - lastCall;
        +  };
        +
        +  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {
        +    ['resize', 'scroll', 'touchmove'].forEach(function (event) {
        +      window.addEventListener(event, tick);
        +    });
        +  }
        +})();
        +
        +var MIRROR_LR = {
        +  center: 'center',
        +  left: 'right',
        +  right: 'left'
        +};
        +
        +var MIRROR_TB = {
        +  middle: 'middle',
        +  top: 'bottom',
        +  bottom: 'top'
        +};
        +
        +var OFFSET_MAP = {
        +  top: 0,
        +  left: 0,
        +  middle: '50%',
        +  center: '50%',
        +  bottom: '100%',
        +  right: '100%'
        +};
        +
        +var autoToFixedAttachment = function autoToFixedAttachment(attachment, relativeToAttachment) {
        +  var left = attachment.left;
        +  var top = attachment.top;
        +
        +  if (left === 'auto') {
        +    left = MIRROR_LR[relativeToAttachment.left];
        +  }
        +
        +  if (top === 'auto') {
        +    top = MIRROR_TB[relativeToAttachment.top];
        +  }
        +
        +  return { left: left, top: top };
        +};
        +
        +var attachmentToOffset = function attachmentToOffset(attachment) {
        +  var left = attachment.left;
        +  var top = attachment.top;
        +
        +  if (typeof OFFSET_MAP[attachment.left] !== 'undefined') {
        +    left = OFFSET_MAP[attachment.left];
        +  }
        +
        +  if (typeof OFFSET_MAP[attachment.top] !== 'undefined') {
        +    top = OFFSET_MAP[attachment.top];
        +  }
        +
        +  return { left: left, top: top };
        +};
        +
        +function addOffset() {
        +  var out = { top: 0, left: 0 };
        +
        +  for (var _len = arguments.length, offsets = Array(_len), _key = 0; _key < _len; _key++) {
        +    offsets[_key] = arguments[_key];
        +  }
        +
        +  offsets.forEach(function (_ref) {
        +    var top = _ref.top;
        +    var left = _ref.left;
        +
        +    if (typeof top === 'string') {
        +      top = parseFloat(top, 10);
        +    }
        +    if (typeof left === 'string') {
        +      left = parseFloat(left, 10);
        +    }
        +
        +    out.top += top;
        +    out.left += left;
        +  });
        +
        +  return out;
        +}
        +
        +function offsetToPx(offset, size) {
        +  if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {
        +    offset.left = parseFloat(offset.left, 10) / 100 * size.width;
        +  }
        +  if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {
        +    offset.top = parseFloat(offset.top, 10) / 100 * size.height;
        +  }
        +
        +  return offset;
        +}
        +
        +var parseOffset = function parseOffset(value) {
        +  var _value$split = value.split(' ');
        +
        +  var _value$split2 = _slicedToArray(_value$split, 2);
        +
        +  var top = _value$split2[0];
        +  var left = _value$split2[1];
        +
        +  return { top: top, left: left };
        +};
        +var parseAttachment = parseOffset;
        +
        +var TetherClass = (function (_Evented) {
        +  _inherits(TetherClass, _Evented);
        +
        +  function TetherClass(options) {
        +    var _this = this;
        +
        +    _classCallCheck(this, TetherClass);
        +
        +    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);
        +    this.position = this.position.bind(this);
        +
        +    tethers.push(this);
        +
        +    this.history = [];
        +
        +    this.setOptions(options, false);
        +
        +    TetherBase.modules.forEach(function (module) {
        +      if (typeof module.initialize !== 'undefined') {
        +        module.initialize.call(_this);
        +      }
        +    });
        +
        +    this.position();
        +  }
        +
        +  _createClass(TetherClass, [{
        +    key: 'getClass',
        +    value: function getClass() {
        +      var key = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
        +      var classes = this.options.classes;
        +
        +      if (typeof classes !== 'undefined' && classes[key]) {
        +        return this.options.classes[key];
        +      } else if (this.options.classPrefix) {
        +        return this.options.classPrefix + '-' + key;
        +      } else {
        +        return key;
        +      }
        +    }
        +  }, {
        +    key: 'setOptions',
        +    value: function setOptions(options) {
        +      var _this2 = this;
        +
        +      var pos = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];
        +
        +      var defaults = {
        +        offset: '0 0',
        +        targetOffset: '0 0',
        +        targetAttachment: 'auto auto',
        +        classPrefix: 'tether'
        +      };
        +
        +      this.options = extend(defaults, options);
        +
        +      var _options = this.options;
        +      var element = _options.element;
        +      var target = _options.target;
        +      var targetModifier = _options.targetModifier;
        +
        +      this.element = element;
        +      this.target = target;
        +      this.targetModifier = targetModifier;
        +
        +      if (this.target === 'viewport') {
        +        this.target = document.body;
        +        this.targetModifier = 'visible';
        +      } else if (this.target === 'scroll-handle') {
        +        this.target = document.body;
        +        this.targetModifier = 'scroll-handle';
        +      }
        +
        +      ['element', 'target'].forEach(function (key) {
        +        if (typeof _this2[key] === 'undefined') {
        +          throw new Error('Tether Error: Both element and target must be defined');
        +        }
        +
        +        if (typeof _this2[key].jquery !== 'undefined') {
        +          _this2[key] = _this2[key][0];
        +        } else if (typeof _this2[key] === 'string') {
        +          _this2[key] = document.querySelector(_this2[key]);
        +        }
        +      });
        +
        +      addClass(this.element, this.getClass('element'));
        +      if (!(this.options.addTargetClasses === false)) {
        +        addClass(this.target, this.getClass('target'));
        +      }
        +
        +      if (!this.options.attachment) {
        +        throw new Error('Tether Error: You must provide an attachment');
        +      }
        +
        +      this.targetAttachment = parseAttachment(this.options.targetAttachment);
        +      this.attachment = parseAttachment(this.options.attachment);
        +      this.offset = parseOffset(this.options.offset);
        +      this.targetOffset = parseOffset(this.options.targetOffset);
        +
        +      if (typeof this.scrollParents !== 'undefined') {
        +        this.disable();
        +      }
        +
        +      if (this.targetModifier === 'scroll-handle') {
        +        this.scrollParents = [this.target];
        +      } else {
        +        this.scrollParents = getScrollParents(this.target);
        +      }
        +
        +      if (!(this.options.enabled === false)) {
        +        this.enable(pos);
        +      }
        +    }
        +  }, {
        +    key: 'getTargetBounds',
        +    value: function getTargetBounds() {
        +      if (typeof this.targetModifier !== 'undefined') {
        +        if (this.targetModifier === 'visible') {
        +          if (this.target === document.body) {
        +            return { top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth };
        +          } else {
        +            var bounds = getBounds(this.target);
        +
        +            var out = {
        +              height: bounds.height,
        +              width: bounds.width,
        +              top: bounds.top,
        +              left: bounds.left
        +            };
        +
        +            out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));
        +            out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight)));
        +            out.height = Math.min(innerHeight, out.height);
        +            out.height -= 2;
        +
        +            out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));
        +            out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth)));
        +            out.width = Math.min(innerWidth, out.width);
        +            out.width -= 2;
        +
        +            if (out.top < pageYOffset) {
        +              out.top = pageYOffset;
        +            }
        +            if (out.left < pageXOffset) {
        +              out.left = pageXOffset;
        +            }
        +
        +            return out;
        +          }
        +        } else if (this.targetModifier === 'scroll-handle') {
        +          var bounds = undefined;
        +          var target = this.target;
        +          if (target === document.body) {
        +            target = document.documentElement;
        +
        +            bounds = {
        +              left: pageXOffset,
        +              top: pageYOffset,
        +              height: innerHeight,
        +              width: innerWidth
        +            };
        +          } else {
        +            bounds = getBounds(target);
        +          }
        +
        +          var style = getComputedStyle(target);
        +
        +          var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || this.target !== document.body;
        +
        +          var scrollBottom = 0;
        +          if (hasBottomScroll) {
        +            scrollBottom = 15;
        +          }
        +
        +          var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;
        +
        +          var out = {
        +            width: 15,
        +            height: height * 0.975 * (height / target.scrollHeight),
        +            left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15
        +          };
        +
        +          var fitAdj = 0;
        +          if (height < 408 && this.target === document.body) {
        +            fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;
        +          }
        +
        +          if (this.target !== document.body) {
        +            out.height = Math.max(out.height, 24);
        +          }
        +
        +          var scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);
        +          out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);
        +
        +          if (this.target === document.body) {
        +            out.height = Math.max(out.height, 24);
        +          }
        +
        +          return out;
        +        }
        +      } else {
        +        return getBounds(this.target);
        +      }
        +    }
        +  }, {
        +    key: 'clearCache',
        +    value: function clearCache() {
        +      this._cache = {};
        +    }
        +  }, {
        +    key: 'cache',
        +    value: function cache(k, getter) {
        +      // More than one module will often need the same DOM info, so
        +      // we keep a cache which is cleared on each position call
        +      if (typeof this._cache === 'undefined') {
        +        this._cache = {};
        +      }
        +
        +      if (typeof this._cache[k] === 'undefined') {
        +        this._cache[k] = getter.call(this);
        +      }
        +
        +      return this._cache[k];
        +    }
        +  }, {
        +    key: 'enable',
        +    value: function enable() {
        +      var _this3 = this;
        +
        +      var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
        +
        +      if (!(this.options.addTargetClasses === false)) {
        +        addClass(this.target, this.getClass('enabled'));
        +      }
        +      addClass(this.element, this.getClass('enabled'));
        +      this.enabled = true;
        +
        +      this.scrollParents.forEach(function (parent) {
        +        if (parent !== _this3.target.ownerDocument) {
        +          parent.addEventListener('scroll', _this3.position);
        +        }
        +      });
        +
        +      if (pos) {
        +        this.position();
        +      }
        +    }
        +  }, {
        +    key: 'disable',
        +    value: function disable() {
        +      var _this4 = this;
        +
        +      removeClass(this.target, this.getClass('enabled'));
        +      removeClass(this.element, this.getClass('enabled'));
        +      this.enabled = false;
        +
        +      if (typeof this.scrollParents !== 'undefined') {
        +        this.scrollParents.forEach(function (parent) {
        +          parent.removeEventListener('scroll', _this4.position);
        +        });
        +      }
        +    }
        +  }, {
        +    key: 'destroy',
        +    value: function destroy() {
        +      var _this5 = this;
        +
        +      this.disable();
        +
        +      tethers.forEach(function (tether, i) {
        +        if (tether === _this5) {
        +          tethers.splice(i, 1);
        +        }
        +      });
        +
        +      // Remove any elements we were using for convenience from the DOM
        +      if (tethers.length === 0) {
        +        removeUtilElements();
        +      }
        +    }
        +  }, {
        +    key: 'updateAttachClasses',
        +    value: function updateAttachClasses(elementAttach, targetAttach) {
        +      var _this6 = this;
        +
        +      elementAttach = elementAttach || this.attachment;
        +      targetAttach = targetAttach || this.targetAttachment;
        +      var sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];
        +
        +      if (typeof this._addAttachClasses !== 'undefined' && this._addAttachClasses.length) {
        +        // updateAttachClasses can be called more than once in a position call, so
        +        // we need to clean up after ourselves such that when the last defer gets
        +        // ran it doesn't add any extra classes from previous calls.
        +        this._addAttachClasses.splice(0, this._addAttachClasses.length);
        +      }
        +
        +      if (typeof this._addAttachClasses === 'undefined') {
        +        this._addAttachClasses = [];
        +      }
        +      var add = this._addAttachClasses;
        +
        +      if (elementAttach.top) {
        +        add.push(this.getClass('element-attached') + '-' + elementAttach.top);
        +      }
        +      if (elementAttach.left) {
        +        add.push(this.getClass('element-attached') + '-' + elementAttach.left);
        +      }
        +      if (targetAttach.top) {
        +        add.push(this.getClass('target-attached') + '-' + targetAttach.top);
        +      }
        +      if (targetAttach.left) {
        +        add.push(this.getClass('target-attached') + '-' + targetAttach.left);
        +      }
        +
        +      var all = [];
        +      sides.forEach(function (side) {
        +        all.push(_this6.getClass('element-attached') + '-' + side);
        +        all.push(_this6.getClass('target-attached') + '-' + side);
        +      });
        +
        +      defer(function () {
        +        if (!(typeof _this6._addAttachClasses !== 'undefined')) {
        +          return;
        +        }
        +
        +        updateClasses(_this6.element, _this6._addAttachClasses, all);
        +        if (!(_this6.options.addTargetClasses === false)) {
        +          updateClasses(_this6.target, _this6._addAttachClasses, all);
        +        }
        +
        +        delete _this6._addAttachClasses;
        +      });
        +    }
        +  }, {
        +    key: 'position',
        +    value: function position() {
        +      var _this7 = this;
        +
        +      var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
        +
        +      // flushChanges commits the changes immediately, leave true unless you are positioning multiple
        +      // tethers (in which case call Tether.Utils.flush yourself when you're done)
        +
        +      if (!this.enabled) {
        +        return;
        +      }
        +
        +      this.clearCache();
        +
        +      // Turn 'auto' attachments into the appropriate corner or edge
        +      var targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);
        +
        +      this.updateAttachClasses(this.attachment, targetAttachment);
        +
        +      var elementPos = this.cache('element-bounds', function () {
        +        return getBounds(_this7.element);
        +      });
        +
        +      var width = elementPos.width;
        +      var height = elementPos.height;
        +
        +      if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {
        +        var _lastSize = this.lastSize;
        +
        +        // We cache the height and width to make it possible to position elements that are
        +        // getting hidden.
        +        width = _lastSize.width;
        +        height = _lastSize.height;
        +      } else {
        +        this.lastSize = { width: width, height: height };
        +      }
        +
        +      var targetPos = this.cache('target-bounds', function () {
        +        return _this7.getTargetBounds();
        +      });
        +      var targetSize = targetPos;
        +
        +      // Get an actual px offset from the attachment
        +      var offset = offsetToPx(attachmentToOffset(this.attachment), { width: width, height: height });
        +      var targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);
        +
        +      var manualOffset = offsetToPx(this.offset, { width: width, height: height });
        +      var manualTargetOffset = offsetToPx(this.targetOffset, targetSize);
        +
        +      // Add the manually provided offset
        +      offset = addOffset(offset, manualOffset);
        +      targetOffset = addOffset(targetOffset, manualTargetOffset);
        +
        +      // It's now our goal to make (element position + offset) == (target position + target offset)
        +      var left = targetPos.left + targetOffset.left - offset.left;
        +      var top = targetPos.top + targetOffset.top - offset.top;
        +
        +      for (var i = 0; i < TetherBase.modules.length; ++i) {
        +        var _module2 = TetherBase.modules[i];
        +        var ret = _module2.position.call(this, {
        +          left: left,
        +          top: top,
        +          targetAttachment: targetAttachment,
        +          targetPos: targetPos,
        +          elementPos: elementPos,
        +          offset: offset,
        +          targetOffset: targetOffset,
        +          manualOffset: manualOffset,
        +          manualTargetOffset: manualTargetOffset,
        +          scrollbarSize: scrollbarSize,
        +          attachment: this.attachment
        +        });
        +
        +        if (ret === false) {
        +          return false;
        +        } else if (typeof ret === 'undefined' || typeof ret !== 'object') {
        +          continue;
        +        } else {
        +          top = ret.top;
        +          left = ret.left;
        +        }
        +      }
        +
        +      // We describe the position three different ways to give the optimizer
        +      // a chance to decide the best possible way to position the element
        +      // with the fewest repaints.
        +      var next = {
        +        // It's position relative to the page (absolute positioning when
        +        // the element is a child of the body)
        +        page: {
        +          top: top,
        +          left: left
        +        },
        +
        +        // It's position relative to the viewport (fixed positioning)
        +        viewport: {
        +          top: top - pageYOffset,
        +          bottom: pageYOffset - top - height + innerHeight,
        +          left: left - pageXOffset,
        +          right: pageXOffset - left - width + innerWidth
        +        }
        +      };
        +
        +      var doc = this.target.ownerDocument;
        +      var win = doc.defaultView;
        +
        +      var scrollbarSize = undefined;
        +      if (win.innerHeight > doc.documentElement.clientHeight) {
        +        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
        +        next.viewport.bottom -= scrollbarSize.height;
        +      }
        +
        +      if (win.innerWidth > doc.documentElement.clientWidth) {
        +        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
        +        next.viewport.right -= scrollbarSize.width;
        +      }
        +
        +      if (['', 'static'].indexOf(doc.body.style.position) === -1 || ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1) {
        +        // Absolute positioning in the body will be relative to the page, not the 'initial containing block'
        +        next.page.bottom = doc.body.scrollHeight - top - height;
        +        next.page.right = doc.body.scrollWidth - left - width;
        +      }
        +
        +      if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {
        +        (function () {
        +          var offsetParent = _this7.cache('target-offsetparent', function () {
        +            return getOffsetParent(_this7.target);
        +          });
        +          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {
        +            return getBounds(offsetParent);
        +          });
        +          var offsetParentStyle = getComputedStyle(offsetParent);
        +          var offsetParentSize = offsetPosition;
        +
        +          var offsetBorder = {};
        +          ['Top', 'Left', 'Bottom', 'Right'].forEach(function (side) {
        +            offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle['border' + side + 'Width']);
        +          });
        +
        +          offsetPosition.right = doc.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;
        +          offsetPosition.bottom = doc.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;
        +
        +          if (next.page.top >= offsetPosition.top + offsetBorder.top && next.page.bottom >= offsetPosition.bottom) {
        +            if (next.page.left >= offsetPosition.left + offsetBorder.left && next.page.right >= offsetPosition.right) {
        +              // We're within the visible part of the target's scroll parent
        +              var scrollTop = offsetParent.scrollTop;
        +              var scrollLeft = offsetParent.scrollLeft;
        +
        +              // It's position relative to the target's offset parent (absolute positioning when
        +              // the element is moved to be a child of the target's offset parent).
        +              next.offset = {
        +                top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,
        +                left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left
        +              };
        +            }
        +          }
        +        })();
        +      }
        +
        +      // We could also travel up the DOM and try each containing context, rather than only
        +      // looking at the body, but we're gonna get diminishing returns.
        +
        +      this.move(next);
        +
        +      this.history.unshift(next);
        +
        +      if (this.history.length > 3) {
        +        this.history.pop();
        +      }
        +
        +      if (flushChanges) {
        +        flush();
        +      }
        +
        +      return true;
        +    }
        +
        +    // THE ISSUE
        +  }, {
        +    key: 'move',
        +    value: function move(pos) {
        +      var _this8 = this;
        +
        +      if (!(typeof this.element.parentNode !== 'undefined')) {
        +        return;
        +      }
        +
        +      var same = {};
        +
        +      for (var type in pos) {
        +        same[type] = {};
        +
        +        for (var key in pos[type]) {
        +          var found = false;
        +
        +          for (var i = 0; i < this.history.length; ++i) {
        +            var point = this.history[i];
        +            if (typeof point[type] !== 'undefined' && !within(point[type][key], pos[type][key])) {
        +              found = true;
        +              break;
        +            }
        +          }
        +
        +          if (!found) {
        +            same[type][key] = true;
        +          }
        +        }
        +      }
        +
        +      var css = { top: '', left: '', right: '', bottom: '' };
        +
        +      var transcribe = function transcribe(_same, _pos) {
        +        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';
        +        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;
        +        if (gpu !== false) {
        +          var yPos = undefined,
        +              xPos = undefined;
        +          if (_same.top) {
        +            css.top = 0;
        +            yPos = _pos.top;
        +          } else {
        +            css.bottom = 0;
        +            yPos = -_pos.bottom;
        +          }
        +
        +          if (_same.left) {
        +            css.left = 0;
        +            xPos = _pos.left;
        +          } else {
        +            css.right = 0;
        +            xPos = -_pos.right;
        +          }
        +
        +          if (window.matchMedia) {
        +            // HubSpot/tether#207
        +            var retina = window.matchMedia('only screen and (min-resolution: 1.3dppx)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3)').matches;
        +            if (!retina) {
        +              xPos = Math.round(xPos);
        +              yPos = Math.round(yPos);
        +            }
        +          }
        +
        +          css[transformKey] = 'translateX(' + xPos + 'px) translateY(' + yPos + 'px)';
        +
        +          if (transformKey !== 'msTransform') {
        +            // The Z transform will keep this in the GPU (faster, and prevents artifacts),
        +            // but IE9 doesn't support 3d transforms and will choke.
        +            css[transformKey] += " translateZ(0)";
        +          }
        +        } else {
        +          if (_same.top) {
        +            css.top = _pos.top + 'px';
        +          } else {
        +            css.bottom = _pos.bottom + 'px';
        +          }
        +
        +          if (_same.left) {
        +            css.left = _pos.left + 'px';
        +          } else {
        +            css.right = _pos.right + 'px';
        +          }
        +        }
        +      };
        +
        +      var moved = false;
        +      if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {
        +        css.position = 'absolute';
        +        transcribe(same.page, pos.page);
        +      } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {
        +        css.position = 'fixed';
        +        transcribe(same.viewport, pos.viewport);
        +      } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {
        +        (function () {
        +          css.position = 'absolute';
        +          var offsetParent = _this8.cache('target-offsetparent', function () {
        +            return getOffsetParent(_this8.target);
        +          });
        +
        +          if (getOffsetParent(_this8.element) !== offsetParent) {
        +            defer(function () {
        +              _this8.element.parentNode.removeChild(_this8.element);
        +              offsetParent.appendChild(_this8.element);
        +            });
        +          }
        +
        +          transcribe(same.offset, pos.offset);
        +          moved = true;
        +        })();
        +      } else {
        +        css.position = 'absolute';
        +        transcribe({ top: true, left: true }, pos.page);
        +      }
        +
        +      if (!moved) {
        +        if (this.options.bodyElement) {
        +          this.options.bodyElement.appendChild(this.element);
        +        } else {
        +          var offsetParentIsBody = true;
        +          var currentNode = this.element.parentNode;
        +          while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {
        +            if (getComputedStyle(currentNode).position !== 'static') {
        +              offsetParentIsBody = false;
        +              break;
        +            }
        +
        +            currentNode = currentNode.parentNode;
        +          }
        +
        +          if (!offsetParentIsBody) {
        +            this.element.parentNode.removeChild(this.element);
        +            this.element.ownerDocument.body.appendChild(this.element);
        +          }
        +        }
        +      }
        +
        +      // Any css change will trigger a repaint, so let's avoid one if nothing changed
        +      var writeCSS = {};
        +      var write = false;
        +      for (var key in css) {
        +        var val = css[key];
        +        var elVal = this.element.style[key];
        +
        +        if (elVal !== val) {
        +          write = true;
        +          writeCSS[key] = val;
        +        }
        +      }
        +
        +      if (write) {
        +        defer(function () {
        +          extend(_this8.element.style, writeCSS);
        +          _this8.trigger('repositioned');
        +        });
        +      }
        +    }
        +  }]);
        +
        +  return TetherClass;
        +})(Evented);
        +
        +TetherClass.modules = [];
        +
        +TetherBase.position = position;
        +
        +var Tether = extend(TetherClass, TetherBase);
        +/* globals TetherBase */
        +
        +'use strict';
        +
        +var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
        +
        +var _TetherBase$Utils = TetherBase.Utils;
        +var getBounds = _TetherBase$Utils.getBounds;
        +var extend = _TetherBase$Utils.extend;
        +var updateClasses = _TetherBase$Utils.updateClasses;
        +var defer = _TetherBase$Utils.defer;
        +
        +var BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];
        +
        +function getBoundingRect(tether, to) {
        +  if (to === 'scrollParent') {
        +    to = tether.scrollParents[0];
        +  } else if (to === 'window') {
        +    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];
        +  }
        +
        +  if (to === document) {
        +    to = to.documentElement;
        +  }
        +
        +  if (typeof to.nodeType !== 'undefined') {
        +    (function () {
        +      var node = to;
        +      var size = getBounds(to);
        +      var pos = size;
        +      var style = getComputedStyle(to);
        +
        +      to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];
        +
        +      // Account any parent Frames scroll offset
        +      if (node.ownerDocument !== document) {
        +        var win = node.ownerDocument.defaultView;
        +        to[0] += win.pageXOffset;
        +        to[1] += win.pageYOffset;
        +        to[2] += win.pageXOffset;
        +        to[3] += win.pageYOffset;
        +      }
        +
        +      BOUNDS_FORMAT.forEach(function (side, i) {
        +        side = side[0].toUpperCase() + side.substr(1);
        +        if (side === 'Top' || side === 'Left') {
        +          to[i] += parseFloat(style['border' + side + 'Width']);
        +        } else {
        +          to[i] -= parseFloat(style['border' + side + 'Width']);
        +        }
        +      });
        +    })();
        +  }
        +
        +  return to;
        +}
        +
        +TetherBase.modules.push({
        +  position: function position(_ref) {
        +    var _this = this;
        +
        +    var top = _ref.top;
        +    var left = _ref.left;
        +    var targetAttachment = _ref.targetAttachment;
        +
        +    if (!this.options.constraints) {
        +      return true;
        +    }
        +
        +    var _cache = this.cache('element-bounds', function () {
        +      return getBounds(_this.element);
        +    });
        +
        +    var height = _cache.height;
        +    var width = _cache.width;
        +
        +    if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {
        +      var _lastSize = this.lastSize;
        +
        +      // Handle the item getting hidden as a result of our positioning without glitching
        +      // the classes in and out
        +      width = _lastSize.width;
        +      height = _lastSize.height;
        +    }
        +
        +    var targetSize = this.cache('target-bounds', function () {
        +      return _this.getTargetBounds();
        +    });
        +
        +    var targetHeight = targetSize.height;
        +    var targetWidth = targetSize.width;
        +
        +    var allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];
        +
        +    this.options.constraints.forEach(function (constraint) {
        +      var outOfBoundsClass = constraint.outOfBoundsClass;
        +      var pinnedClass = constraint.pinnedClass;
        +
        +      if (outOfBoundsClass) {
        +        allClasses.push(outOfBoundsClass);
        +      }
        +      if (pinnedClass) {
        +        allClasses.push(pinnedClass);
        +      }
        +    });
        +
        +    allClasses.forEach(function (cls) {
        +      ['left', 'top', 'right', 'bottom'].forEach(function (side) {
        +        allClasses.push(cls + '-' + side);
        +      });
        +    });
        +
        +    var addClasses = [];
        +
        +    var tAttachment = extend({}, targetAttachment);
        +    var eAttachment = extend({}, this.attachment);
        +
        +    this.options.constraints.forEach(function (constraint) {
        +      var to = constraint.to;
        +      var attachment = constraint.attachment;
        +      var pin = constraint.pin;
        +
        +      if (typeof attachment === 'undefined') {
        +        attachment = '';
        +      }
        +
        +      var changeAttachX = undefined,
        +          changeAttachY = undefined;
        +      if (attachment.indexOf(' ') >= 0) {
        +        var _attachment$split = attachment.split(' ');
        +
        +        var _attachment$split2 = _slicedToArray(_attachment$split, 2);
        +
        +        changeAttachY = _attachment$split2[0];
        +        changeAttachX = _attachment$split2[1];
        +      } else {
        +        changeAttachX = changeAttachY = attachment;
        +      }
        +
        +      var bounds = getBoundingRect(_this, to);
        +
        +      if (changeAttachY === 'target' || changeAttachY === 'both') {
        +        if (top < bounds[1] && tAttachment.top === 'top') {
        +          top += targetHeight;
        +          tAttachment.top = 'bottom';
        +        }
        +
        +        if (top + height > bounds[3] && tAttachment.top === 'bottom') {
        +          top -= targetHeight;
        +          tAttachment.top = 'top';
        +        }
        +      }
        +
        +      if (changeAttachY === 'together') {
        +        if (tAttachment.top === 'top') {
        +          if (eAttachment.top === 'bottom' && top < bounds[1]) {
        +            top += targetHeight;
        +            tAttachment.top = 'bottom';
        +
        +            top += height;
        +            eAttachment.top = 'top';
        +          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {
        +            top -= height - targetHeight;
        +            tAttachment.top = 'bottom';
        +
        +            eAttachment.top = 'bottom';
        +          }
        +        }
        +
        +        if (tAttachment.top === 'bottom') {
        +          if (eAttachment.top === 'top' && top + height > bounds[3]) {
        +            top -= targetHeight;
        +            tAttachment.top = 'top';
        +
        +            top -= height;
        +            eAttachment.top = 'bottom';
        +          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {
        +            top += height - targetHeight;
        +            tAttachment.top = 'top';
        +
        +            eAttachment.top = 'top';
        +          }
        +        }
        +
        +        if (tAttachment.top === 'middle') {
        +          if (top + height > bounds[3] && eAttachment.top === 'top') {
        +            top -= height;
        +            eAttachment.top = 'bottom';
        +          } else if (top < bounds[1] && eAttachment.top === 'bottom') {
        +            top += height;
        +            eAttachment.top = 'top';
        +          }
        +        }
        +      }
        +
        +      if (changeAttachX === 'target' || changeAttachX === 'both') {
        +        if (left < bounds[0] && tAttachment.left === 'left') {
        +          left += targetWidth;
        +          tAttachment.left = 'right';
        +        }
        +
        +        if (left + width > bounds[2] && tAttachment.left === 'right') {
        +          left -= targetWidth;
        +          tAttachment.left = 'left';
        +        }
        +      }
        +
        +      if (changeAttachX === 'together') {
        +        if (left < bounds[0] && tAttachment.left === 'left') {
        +          if (eAttachment.left === 'right') {
        +            left += targetWidth;
        +            tAttachment.left = 'right';
        +
        +            left += width;
        +            eAttachment.left = 'left';
        +          } else if (eAttachment.left === 'left') {
        +            left += targetWidth;
        +            tAttachment.left = 'right';
        +
        +            left -= width;
        +            eAttachment.left = 'right';
        +          }
        +        } else if (left + width > bounds[2] && tAttachment.left === 'right') {
        +          if (eAttachment.left === 'left') {
        +            left -= targetWidth;
        +            tAttachment.left = 'left';
        +
        +            left -= width;
        +            eAttachment.left = 'right';
        +          } else if (eAttachment.left === 'right') {
        +            left -= targetWidth;
        +            tAttachment.left = 'left';
        +
        +            left += width;
        +            eAttachment.left = 'left';
        +          }
        +        } else if (tAttachment.left === 'center') {
        +          if (left + width > bounds[2] && eAttachment.left === 'left') {
        +            left -= width;
        +            eAttachment.left = 'right';
        +          } else if (left < bounds[0] && eAttachment.left === 'right') {
        +            left += width;
        +            eAttachment.left = 'left';
        +          }
        +        }
        +      }
        +
        +      if (changeAttachY === 'element' || changeAttachY === 'both') {
        +        if (top < bounds[1] && eAttachment.top === 'bottom') {
        +          top += height;
        +          eAttachment.top = 'top';
        +        }
        +
        +        if (top + height > bounds[3] && eAttachment.top === 'top') {
        +          top -= height;
        +          eAttachment.top = 'bottom';
        +        }
        +      }
        +
        +      if (changeAttachX === 'element' || changeAttachX === 'both') {
        +        if (left < bounds[0]) {
        +          if (eAttachment.left === 'right') {
        +            left += width;
        +            eAttachment.left = 'left';
        +          } else if (eAttachment.left === 'center') {
        +            left += width / 2;
        +            eAttachment.left = 'left';
        +          }
        +        }
        +
        +        if (left + width > bounds[2]) {
        +          if (eAttachment.left === 'left') {
        +            left -= width;
        +            eAttachment.left = 'right';
        +          } else if (eAttachment.left === 'center') {
        +            left -= width / 2;
        +            eAttachment.left = 'right';
        +          }
        +        }
        +      }
        +
        +      if (typeof pin === 'string') {
        +        pin = pin.split(',').map(function (p) {
        +          return p.trim();
        +        });
        +      } else if (pin === true) {
        +        pin = ['top', 'left', 'right', 'bottom'];
        +      }
        +
        +      pin = pin || [];
        +
        +      var pinned = [];
        +      var oob = [];
        +
        +      if (top < bounds[1]) {
        +        if (pin.indexOf('top') >= 0) {
        +          top = bounds[1];
        +          pinned.push('top');
        +        } else {
        +          oob.push('top');
        +        }
        +      }
        +
        +      if (top + height > bounds[3]) {
        +        if (pin.indexOf('bottom') >= 0) {
        +          top = bounds[3] - height;
        +          pinned.push('bottom');
        +        } else {
        +          oob.push('bottom');
        +        }
        +      }
        +
        +      if (left < bounds[0]) {
        +        if (pin.indexOf('left') >= 0) {
        +          left = bounds[0];
        +          pinned.push('left');
        +        } else {
        +          oob.push('left');
        +        }
        +      }
        +
        +      if (left + width > bounds[2]) {
        +        if (pin.indexOf('right') >= 0) {
        +          left = bounds[2] - width;
        +          pinned.push('right');
        +        } else {
        +          oob.push('right');
        +        }
        +      }
        +
        +      if (pinned.length) {
        +        (function () {
        +          var pinnedClass = undefined;
        +          if (typeof _this.options.pinnedClass !== 'undefined') {
        +            pinnedClass = _this.options.pinnedClass;
        +          } else {
        +            pinnedClass = _this.getClass('pinned');
        +          }
        +
        +          addClasses.push(pinnedClass);
        +          pinned.forEach(function (side) {
        +            addClasses.push(pinnedClass + '-' + side);
        +          });
        +        })();
        +      }
        +
        +      if (oob.length) {
        +        (function () {
        +          var oobClass = undefined;
        +          if (typeof _this.options.outOfBoundsClass !== 'undefined') {
        +            oobClass = _this.options.outOfBoundsClass;
        +          } else {
        +            oobClass = _this.getClass('out-of-bounds');
        +          }
        +
        +          addClasses.push(oobClass);
        +          oob.forEach(function (side) {
        +            addClasses.push(oobClass + '-' + side);
        +          });
        +        })();
        +      }
        +
        +      if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {
        +        eAttachment.left = tAttachment.left = false;
        +      }
        +      if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {
        +        eAttachment.top = tAttachment.top = false;
        +      }
        +
        +      if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {
        +        _this.updateAttachClasses(eAttachment, tAttachment);
        +        _this.trigger('update', {
        +          attachment: eAttachment,
        +          targetAttachment: tAttachment
        +        });
        +      }
        +    });
        +
        +    defer(function () {
        +      if (!(_this.options.addTargetClasses === false)) {
        +        updateClasses(_this.target, addClasses, allClasses);
        +      }
        +      updateClasses(_this.element, addClasses, allClasses);
        +    });
        +
        +    return { top: top, left: left };
        +  }
        +});
        +/* globals TetherBase */
        +
        +'use strict';
        +
        +var _TetherBase$Utils = TetherBase.Utils;
        +var getBounds = _TetherBase$Utils.getBounds;
        +var updateClasses = _TetherBase$Utils.updateClasses;
        +var defer = _TetherBase$Utils.defer;
        +
        +TetherBase.modules.push({
        +  position: function position(_ref) {
        +    var _this = this;
        +
        +    var top = _ref.top;
        +    var left = _ref.left;
        +
        +    var _cache = this.cache('element-bounds', function () {
        +      return getBounds(_this.element);
        +    });
        +
        +    var height = _cache.height;
        +    var width = _cache.width;
        +
        +    var targetPos = this.getTargetBounds();
        +
        +    var bottom = top + height;
        +    var right = left + width;
        +
        +    var abutted = [];
        +    if (top <= targetPos.bottom && bottom >= targetPos.top) {
        +      ['left', 'right'].forEach(function (side) {
        +        var targetPosSide = targetPos[side];
        +        if (targetPosSide === left || targetPosSide === right) {
        +          abutted.push(side);
        +        }
        +      });
        +    }
        +
        +    if (left <= targetPos.right && right >= targetPos.left) {
        +      ['top', 'bottom'].forEach(function (side) {
        +        var targetPosSide = targetPos[side];
        +        if (targetPosSide === top || targetPosSide === bottom) {
        +          abutted.push(side);
        +        }
        +      });
        +    }
        +
        +    var allClasses = [];
        +    var addClasses = [];
        +
        +    var sides = ['left', 'top', 'right', 'bottom'];
        +    allClasses.push(this.getClass('abutted'));
        +    sides.forEach(function (side) {
        +      allClasses.push(_this.getClass('abutted') + '-' + side);
        +    });
        +
        +    if (abutted.length) {
        +      addClasses.push(this.getClass('abutted'));
        +    }
        +
        +    abutted.forEach(function (side) {
        +      addClasses.push(_this.getClass('abutted') + '-' + side);
        +    });
        +
        +    defer(function () {
        +      if (!(_this.options.addTargetClasses === false)) {
        +        updateClasses(_this.target, addClasses, allClasses);
        +      }
        +      updateClasses(_this.element, addClasses, allClasses);
        +    });
        +
        +    return true;
        +  }
        +});
        +/* globals TetherBase */
        +
        +'use strict';
        +
        +var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
        +
        +TetherBase.modules.push({
        +  position: function position(_ref) {
        +    var top = _ref.top;
        +    var left = _ref.left;
        +
        +    if (!this.options.shift) {
        +      return;
        +    }
        +
        +    var shift = this.options.shift;
        +    if (typeof this.options.shift === 'function') {
        +      shift = this.options.shift.call(this, { top: top, left: left });
        +    }
        +
        +    var shiftTop = undefined,
        +        shiftLeft = undefined;
        +    if (typeof shift === 'string') {
        +      shift = shift.split(' ');
        +      shift[1] = shift[1] || shift[0];
        +
        +      var _shift = shift;
        +
        +      var _shift2 = _slicedToArray(_shift, 2);
        +
        +      shiftTop = _shift2[0];
        +      shiftLeft = _shift2[1];
        +
        +      shiftTop = parseFloat(shiftTop, 10);
        +      shiftLeft = parseFloat(shiftLeft, 10);
        +    } else {
        +      shiftTop = shift.top;
        +      shiftLeft = shift.left;
        +    }
        +
        +    top += shiftTop;
        +    left += shiftLeft;
        +
        +    return { top: top, left: left };
        +  }
        +});
        +return Tether;
        +
        +}));
        diff --git a/bower_components/tether/dist/js/tether.min.js b/bower_components/tether/dist/js/tether.min.js
        new file mode 100644
        index 0000000000..d16b9b14eb
        --- /dev/null
        +++ b/bower_components/tether/dist/js/tether.min.js
        @@ -0,0 +1 @@
        +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=t.getBoundingClientRect(),o={};for(var i in e)o[i]=e[i];if(t.ownerDocument!==document){var r=t.ownerDocument.defaultView.frameElement;if(r){var s=n(r);o.top+=s.top,o.bottom+=s.top,o.left+=s.left,o.right+=s.left}}return o}function r(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;(n=n.parentNode)&&n&&1===n.nodeType;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function s(){A&&document.body.removeChild(A),A=null}function a(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i=n(t),r=P();return i.top-=r.top,i.left-=r.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function f(t){return t.offsetParent||document.documentElement}function l(){if(M)return M;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");h(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return M={width:n,height:n}}function h(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function d(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=c(t).replace(o," ");g(t,i)}}function p(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{d(t,e);var o=c(t)+(" "+e);g(t,o)}}function u(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=c(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function c(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function g(t,e){t.setAttribute("class",e)}function m(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&u(t,o)&&d(t,o)}),e.forEach(function(e){u(t,e)||p(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function y(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function b(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function w(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i<e;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function C(t,e){return"string"==typeof t.left&&t.left.indexOf("%")!==-1&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&t.top.indexOf("%")!==-1&&(t.top=parseFloat(t.top,10)/100*e.height),t}function O(t,e){return"scrollParent"===e?e=t.scrollParents[0]:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=e,o=a(e),i=o,n=getComputedStyle(e);if(e=[i.left,i.top,o.width+i.left,o.height+i.top],t.ownerDocument!==document){var r=t.ownerDocument.defaultView;e[0]+=r.pageXOffset,e[1]+=r.pageYOffset,e[2]+=r.pageXOffset,e[3]+=r.pageYOffset}G.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),x=void 0;"undefined"==typeof x&&(x={modules:[]});var A=null,T=function(){var t=0;return function(){return++t}}(),S={},P=function(){var t=A;t&&document.body.contains(t)||(t=document.createElement("div"),t.setAttribute("data-tether-id",T()),h(t.style,{top:0,left:0,position:"absolute"}),document.body.appendChild(t),A=t);var e=t.getAttribute("data-tether-id");return"undefined"==typeof S[e]&&(S[e]=n(t),k(function(){delete S[e]})),S[e]},M=null,W=[],k=function(t){W.push(t)},_=function(){for(var t=void 0;t=W.pop();)t()},B=function(){function t(){i(this,t)}return E(t,[{key:"on",value:function(t,e,o){var i=!(arguments.length<=3||void 0===arguments[3])&&arguments[3];"undefined"==typeof this.bindings&&(this.bindings={}),"undefined"==typeof this.bindings[t]&&(this.bindings[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})}},{key:"once",value:function(t,e,o){this.on(t,e,o,!0)}},{key:"off",value:function(t,e){if("undefined"!=typeof this.bindings&&"undefined"!=typeof this.bindings[t])if("undefined"==typeof e)delete this.bindings[t];else for(var o=0;o<this.bindings[t].length;)this.bindings[t][o].handler===e?this.bindings[t].splice(o,1):++o}},{key:"trigger",value:function(t){if("undefined"!=typeof this.bindings&&this.bindings[t]){for(var e=0,o=arguments.length,i=Array(o>1?o-1:0),n=1;n<o;n++)i[n-1]=arguments[n];for(;e<this.bindings[t].length;){var r=this.bindings[t][e],s=r.handler,a=r.ctx,f=r.once,l=a;"undefined"==typeof l&&(l=this),s.apply(l,i),f?this.bindings[t].splice(e,1):++e}}}}]),t}();x.Utils={getActualBoundingClientRect:n,getScrollParents:r,getBounds:a,getOffsetParent:f,extend:h,addClass:p,removeClass:d,hasClass:u,updateClasses:m,defer:k,flush:_,uniqueId:T,Evented:B,getScrollBarSize:l,removeUtilElements:s};var z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),j=function(t,e,o){for(var i=!0;i;){var n=t,r=e,s=o;i=!1,null===n&&(n=Function.prototype);var a=Object.getOwnPropertyDescriptor(n,r);if(void 0!==a){if("value"in a)return a.value;var f=a.get;if(void 0===f)return;return f.call(s)}var l=Object.getPrototypeOf(n);if(null===l)return;t=l,e=r,o=s,i=!0,a=l=void 0}};if("undefined"==typeof x)throw new Error("You must include the utils.js file before tether.js");var Y=x.Utils,r=Y.getScrollParents,a=Y.getBounds,f=Y.getOffsetParent,h=Y.extend,p=Y.addClass,d=Y.removeClass,m=Y.updateClasses,k=Y.defer,_=Y.flush,l=Y.getScrollBarSize,s=Y.removeUtilElements,L=function(){if("undefined"==typeof document)return"";for(var t=document.createElement("div"),e=["transform","WebkitTransform","OTransform","MozTransform","msTransform"],o=0;o<e.length;++o){var i=e[o];if(void 0!==t.style[i])return i}}(),D=[],X=function(){D.forEach(function(t){t.position(!1)}),_()};!function(){var t=null,e=null,o=null,i=function n(){return"undefined"!=typeof e&&e>16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&b()-t<10||(null!=o&&(clearTimeout(o),o=null),t=b(),X(),e=b()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var F={center:"center",left:"right",right:"left"},H={middle:"middle",top:"bottom",bottom:"top"},N={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},U=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=F[e.left]),"auto"===i&&(i=H[e.top]),{left:o,top:i}},V=function(t){var e=t.left,o=t.top;return"undefined"!=typeof N[t.left]&&(e=N[t.left]),"undefined"!=typeof N[t.top]&&(o=N[t.top]),{left:e,top:o}},R=function(t){var e=t.split(" "),o=z(e,2),i=o[0],n=o[1];return{top:i,left:n}},q=R,I=function(t){function e(t){var o=this;i(this,e),j(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),D.push(this),this.history=[],this.setOptions(t,!1),x.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return v(e,t),E(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]||arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=h(i,t);var n=this.options,s=n.element,a=n.target,f=n.targetModifier;if(this.element=s,this.target=a,this.targetModifier=f,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),p(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&p(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=q(this.options.targetAttachment),this.attachment=q(this.options.attachment),this.offset=R(this.options.offset),this.targetOffset=R(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=r(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return a(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=a(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.top<pageYOffset&&(e.top=pageYOffset),e.left<pageXOffset&&(e.left=pageXOffset),e}if("scroll-handle"===this.targetModifier){var t=void 0,o=this.target;o===document.body?(o=document.documentElement,t={left:pageXOffset,top:pageYOffset,height:innerHeight,width:innerWidth}):t=a(o);var i=getComputedStyle(o),n=o.scrollWidth>o.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,r=0;n&&(r=15);var s=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-r,e={width:15,height:.975*s*(s/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;s<408&&this.target===document.body&&(f=-11e-5*Math.pow(s,2)-.00727*s+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-s);return e.top=l*(s-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];this.options.addTargetClasses!==!1&&p(this.target,this.getClass("enabled")),p(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;d(this.target,this.getClass("enabled")),d(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),D.forEach(function(e,o){e===t&&D.splice(o,1)}),0===D.length&&s()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),k(function(){"undefined"!=typeof o._addAttachClasses&&(m(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&m(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=U(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return a(t.element)}),n=i.width,r=i.height;if(0===n&&0===r&&"undefined"!=typeof this.lastSize){var s=this.lastSize;n=s.width,r=s.height}else this.lastSize={width:n,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,p=C(V(this.attachment),{width:n,height:r}),u=C(V(o),d),c=C(this.offset,{width:n,height:r}),g=C(this.targetOffset,d);p=w(p,c),u=w(u,g);for(var m=h.left+u.left-p.left,v=h.top+u.top-p.top,y=0;y<x.modules.length;++y){var b=x.modules[y],O=b.position.call(this,{left:m,top:v,targetAttachment:o,targetPos:h,elementPos:i,offset:p,targetOffset:u,manualOffset:c,manualTargetOffset:g,scrollbarSize:S,attachment:this.attachment});if(O===!1)return!1;"undefined"!=typeof O&&"object"==typeof O&&(v=O.top,m=O.left)}var E={page:{top:v,left:m},viewport:{top:v-pageYOffset,bottom:pageYOffset-v-r+innerHeight,left:m-pageXOffset,right:pageXOffset-m-n+innerWidth}},A=this.target.ownerDocument,T=A.defaultView,S=void 0;return T.innerHeight>A.documentElement.clientHeight&&(S=this.cache("scrollbar-size",l),E.viewport.bottom-=S.height),T.innerWidth>A.documentElement.clientWidth&&(S=this.cache("scrollbar-size",l),E.viewport.right-=S.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(E.page.bottom=A.body.scrollHeight-v-r,E.page.right=A.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return f(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return a(e)}),i=getComputedStyle(e),n=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-n.width+r.right,o.bottom=A.body.scrollHeight-o.top-n.height+r.bottom,E.page.top>=o.top+r.top&&E.page.bottom>=o.bottom&&E.page.left>=o.left+r.left&&E.page.right>=o.right){var s=e.scrollTop,l=e.scrollLeft;E.offset={top:E.page.top-o.top+s-r.top,left:E.page.left-o.left+l-r.left}}}(),this.move(E),this.history.unshift(E),this.history.length>3&&this.history.pop(),e&&_(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,s=0;s<this.history.length;++s){var a=this.history[s];if("undefined"!=typeof a[i]&&!y(a[i][n],t[i][n])){r=!0;break}}r||(o[i][n]=!0)}}var l={top:"",left:"",right:"",bottom:""},d=function(t,o){var i="undefined"!=typeof e.options.optimizations,n=i?e.options.optimizations.gpu:null;if(n!==!1){var r=void 0,s=void 0;if(t.top?(l.top=0,r=o.top):(l.bottom=0,r=-o.bottom),t.left?(l.left=0,s=o.left):(l.right=0,s=-o.right),window.matchMedia){var a=window.matchMedia("only screen and (min-resolution: 1.3dppx)").matches||window.matchMedia("only screen and (-webkit-min-device-pixel-ratio: 1.3)").matches;a||(s=Math.round(s),r=Math.round(r))}l[L]="translateX("+s+"px) translateY("+r+"px)","msTransform"!==L&&(l[L]+=" translateZ(0)")}else t.top?l.top=o.top+"px":l.bottom=o.bottom+"px",t.left?l.left=o.left+"px":l.right=o.right+"px"},p=!1;if((o.page.top||o.page.bottom)&&(o.page.left||o.page.right)?(l.position="absolute",d(o.page,t.page)):(o.viewport.top||o.viewport.bottom)&&(o.viewport.left||o.viewport.right)?(l.position="fixed",d(o.viewport,t.viewport)):"undefined"!=typeof o.offset&&o.offset.top&&o.offset.left?!function(){l.position="absolute";var i=e.cache("target-offsetparent",function(){return f(e.target)});f(e.element)!==i&&k(function(){e.element.parentNode.removeChild(e.element),i.appendChild(e.element)}),d(o.offset,t.offset),p=!0}():(l.position="absolute",d({top:!0,left:!0},t.page)),!p)if(this.options.bodyElement)this.options.bodyElement.appendChild(this.element);else{for(var u=!0,c=this.element.parentNode;c&&1===c.nodeType&&"BODY"!==c.tagName;){if("static"!==getComputedStyle(c).position){u=!1;break}c=c.parentNode}u||(this.element.parentNode.removeChild(this.element),this.element.ownerDocument.body.appendChild(this.element))}var g={},m=!1;for(var n in l){var v=l[n],b=this.element.style[n];b!==v&&(m=!0,g[n]=v)}m&&k(function(){h(e.element.style,g),e.trigger("repositioned")})}}}]),e}(B);I.modules=[],x.position=X;var $=h(I,x),z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),Y=x.Utils,a=Y.getBounds,h=Y.extend,m=Y.updateClasses,k=Y.defer,G=["left","top","right","bottom"];x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var r=this.cache("element-bounds",function(){return a(e.element)}),s=r.height,f=r.width;if(0===f&&0===s&&"undefined"!=typeof this.lastSize){var l=this.lastSize;f=l.width,s=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),p=d.height,u=d.width,c=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&c.push(e),o&&c.push(o)}),c.forEach(function(t){["left","top","right","bottom"].forEach(function(e){c.push(t+"-"+e)})});var g=[],v=h({},n),y=h({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,a=t.attachment,l=t.pin;"undefined"==typeof a&&(a="");var h=void 0,d=void 0;if(a.indexOf(" ")>=0){var c=a.split(" "),m=z(c,2);d=m[0],h=m[1]}else h=d=a;var b=O(e,r);"target"!==d&&"both"!==d||(o<b[1]&&"top"===v.top&&(o+=p,v.top="bottom"),o+s>b[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&o<b[1]?(o+=p,v.top="bottom",o+=s,y.top="top"):"top"===y.top&&o+s>b[3]&&o-(s-p)>=b[1]&&(o-=s-p,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+s>b[3]?(o-=p,v.top="top",o-=s,y.top="bottom"):"bottom"===y.top&&o<b[1]&&o+(2*s-p)<=b[3]&&(o+=s-p,v.top="top",y.top="top")),"middle"===v.top&&(o+s>b[3]&&"top"===y.top?(o-=s,y.top="bottom"):o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"))),"target"!==h&&"both"!==h||(i<b[0]&&"left"===v.left&&(i+=u,v.left="right"),i+f>b[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===h&&(i<b[0]&&"left"===v.left?"right"===y.left?(i+=u,v.left="right",i+=f,y.left="left"):"left"===y.left&&(i+=u,v.left="right",i-=f,y.left="right"):i+f>b[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=f,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=f,y.left="left"):"center"===v.left&&(i+f>b[2]&&"left"===y.left?(i-=f,y.left="right"):i<b[0]&&"right"===y.left&&(i+=f,y.left="left"))),"element"!==d&&"both"!==d||(o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"),o+s>b[3]&&"top"===y.top&&(o-=s,y.top="bottom")),"element"!==h&&"both"!==h||(i<b[0]&&("right"===y.left?(i+=f,y.left="left"):"center"===y.left&&(i+=f/2,y.left="left")),i+f>b[2]&&("left"===y.left?(i-=f,y.left="right"):"center"===y.left&&(i-=f/2,y.left="right"))),"string"==typeof l?l=l.split(",").map(function(t){return t.trim()}):l===!0&&(l=["top","left","right","bottom"]),l=l||[];var w=[],C=[];o<b[1]&&(l.indexOf("top")>=0?(o=b[1],w.push("top")):C.push("top")),o+s>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-s,w.push("bottom")):C.push("bottom")),i<b[0]&&(l.indexOf("left")>=0?(i=b[0],w.push("left")):C.push("left")),i+f>b[2]&&(l.indexOf("right")>=0?(i=b[2]-f,w.push("right")):C.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),g.push(t),w.forEach(function(e){g.push(t+"-"+e)})}(),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),g.push(t),C.forEach(function(e){g.push(t+"-"+e)})}(),(w.indexOf("left")>=0||w.indexOf("right")>=0)&&(y.left=v.left=!1),(w.indexOf("top")>=0||w.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,g,c),m(e.element,g,c)}),{top:o,left:i}}});var Y=x.Utils,a=Y.getBounds,m=Y.updateClasses,k=Y.defer;x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return a(e.element)}),r=n.height,s=n.width,f=this.getTargetBounds(),l=o+r,h=i+s,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var p=[],u=[],c=["left","top","right","bottom"];return p.push(this.getClass("abutted")),c.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&u.push(this.getClass("abutted")),d.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,u,p),m(e.element,u,p)}),!0}});var z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return x.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=z(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),$});
        \ No newline at end of file
        diff --git a/bower_components/tether/docs/1-Overview/1-why_you_should_use_tether.md b/bower_components/tether/docs/1-Overview/1-why_you_should_use_tether.md
        new file mode 100644
        index 0000000000..6147d25fde
        --- /dev/null
        +++ b/bower_components/tether/docs/1-Overview/1-why_you_should_use_tether.md
        @@ -0,0 +1,43 @@
        +## Why You Should Use Tether
        +
        +Virtually every app includes some sort of overlay attached to an element on the page.
        +Things like [tooltips](http://github.hubspot.com/tooltip/docs/welcome),
        +[dropdowns](http://github.hubspot.com/select/docs/welcome), [hover-activated info boxes](http://github.hubspot.com/drop/docs/welcome), etc.
        +
        +Those elements need to be attached to something on the page.  Actually placing them next to
        +the element in the DOM causes problems though, if any parent element is anything
        +but `overflow: visible`, the element gets cut off.  So you need absolute positioning
        +in the body.
        +
        +Some of the time absolute positioning is right, but what about if the thing we're
        +attached to is fixed to the center of the screen?  We'll have to move it every
        +time the user scrolls.  What about if the element is in a scrollable container,
        +if the overlay is inside of it (so no clipping), it would be cool if the code
        +were smart enough to move it inside when that area is scrolled.  That way we
        +need to reposition it even less.
        +
        +It would also be nice if the code could somehow figure out whether positioning it
        +from the top, bottom, left, or right would result in the fewest repositionings
        +as the user scrolls or resizes.
        +
        +Most of the time you're building these elements it would be nice for the element to
        +flip to the other side of the element if it hits the edge of the screen, or a scrollable
        +container it might be in.  It would be nice if we could confine the element
        +to within some area, or even hide it when it leaves.
        +
        +It would be nice for the element to be repositioned with CSS transforms
        +rather than top and left when possible, to allow the positioning to be done entirely
        +in the GPU.
        +
        +Now that the positioning is so fancy, you're going to use it for more and more
        +elements.  It would be cool if the library could optimize all of their repositioning
        +into a single repaint.
        +
        +All of that is baked into Tether.
        +
        +### tl;dr
        +
        +- Optimized GPU-accelerated repositioning for 60fps scrolling
        +- Reliable positioning on any possible corner, edge or point in between.
        +- Support for repositioning or pinning the element when it would be offscreen
        +- Designed to be embeddable in other libraries
        diff --git a/bower_components/tether/docs/1-Overview/2-repositioning.md b/bower_components/tether/docs/1-Overview/2-repositioning.md
        new file mode 100644
        index 0000000000..6c02483f11
        --- /dev/null
        +++ b/bower_components/tether/docs/1-Overview/2-repositioning.md
        @@ -0,0 +1,46 @@
        +Repositioning
        +-----
        +
        +Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled.
        +If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.
        +
        +#### Manually Repositioning
        +
        +The simplest way to reposition every Tether on the page is to call `Tether.position()`.  It will efficiently reposition every
        +Tether in a single repaint, making it more efficient than manually repositioning many Tethers individually.
        +
        +```javascript
        +Tether.position()
        +```
        +
        +#### Repositioning a Single Tether
        +
        +If you have many Tethers on screen, it may be more efficient to just reposition the tether that needs it.  You can do this
        +by calling the `.position` method on the Tether instance:
        +
        +```javascript
        +tether = new Tether({ ... })
        +
        +// Later:
        +tether.position()
        +```
        +
        +#### Tethering Hidden Elements
        +
        +If you are creating a tether involving elements which are `display: none`, or not actually in the DOM, 
        +your Tether may not be able to position itself properly.  One way around this is to
        +ensure that a position call happens after all layouts have finished:
        +
        +```javascript
        +myElement.style.display = 'block'
        +
        +tether = new Tether({ ... })
        +
        +setTimeout(function(){
        +  tether.position();
        +})
        +```
        +
        +In general however, you shouldn't have any trouble if both the element and the target are visible and in the DOM when you
        +create the Tether.  If that is not the case, create the Tether disabled (option `enabled`: `false`), and enable it when
        +the elements are ready.
        diff --git a/bower_components/tether/docs/1-Overview/3-why_we_dont_support_IE_8.md b/bower_components/tether/docs/1-Overview/3-why_we_dont_support_IE_8.md
        new file mode 100644
        index 0000000000..841de9ec56
        --- /dev/null
        +++ b/bower_components/tether/docs/1-Overview/3-why_we_dont_support_IE_8.md
        @@ -0,0 +1,47 @@
        +Why we don't support IE 8
        +-------------------------
        +
        +We've been living in 2007 for a while now, pretending that new browser features don't
        +exist because they aren't in IE8.  You might not even know about some of these features,
        +or think they are only enabled by jQuery or underscore, simply because it hasn't
        +been an option to rely upon them.
        +
        +Here is the list of features you don't have if you choose to support IE 8:
        +
        +- HTML5 audio and video
        +- SVG
        +- Canvas
        +- TrueType fonts
        +- Media Queries
        +- CSS Transforms
        +- Multiple Backgrounds
        +- CSS3 Units (vh, vw, rem)
        +- Custom DOM events
        +- Hardware accelerated graphics
        +- The DOMContentLoaded event
        +- addEventListener
        +- Object.create, .seal, .freeze, .defineProperty
        +- Array.isArray, .indexOf, .every, .some, .forEach, .map, .filter, .reduce
        +- A modern JavaScript engine
        +- A real developer tools
        +- A consistent box model
        +- jQuery 2
        +- Google Apps
        +- Tether
        +
        +It's true that IE 8 still holds a big chunk of the browsing population, but the reasons
        +why they can't update are dwindling.  There are two big reasons for continuing IE 8 support.
        +
        +#### Enterprises
        +
        +  Microsoft is dropping support for XP in April, organizations who want security updates will have to upgrade.
        +
        +#### China uses XP
        +
        +  Chrome, Firefox and Opera all support XP.  Nothing prevents users from upgrading, except the inertia of
        +  organizations who still support IE 8.
        +
        +#### The Future
        +
        +We are skating towards where the puck will be, and we hope that as you decide to drop IE 8 support,
        +you choose to add Tether to the list of awesome things you can do.
        diff --git a/bower_components/tether/docs/2-Examples/1-list_of_examples.md b/bower_components/tether/docs/2-Examples/1-list_of_examples.md
        new file mode 100644
        index 0000000000..bbb7fd5169
        --- /dev/null
        +++ b/bower_components/tether/docs/2-Examples/1-list_of_examples.md
        @@ -0,0 +1,27 @@
        +### Examples
        +
        +It's our goal to create a wide variety of example of how Tether
        +can be used.  Here's what we have so far, please send a PR with
        +any examples you might create.
        +
        +#### Beginner
        +
        +- [simple](../../examples/simple): A simple example to get you started
        +- [out-of-bounds](../../examples/out-of-bounds): How to hide the element when it would
        +otherwise be offscreen
        +- [pin](../../examples/pin): How to pin the element so it never goes offscreen
        +- [enable-disable](../../examples/enable-disable): How to enable and disable the Tether
        +in JavaScript
        +
        +#### Advanced
        +
        +- [content-visible](../../examples/content-visible): Demonstrates using the `'visible'`
        +`targetModifier` to align an element with the visible portion of another.
        +- [dolls](../../examples/dolls): A performance test to show several dozen elements,
        +each tethered to the previous.  Try dragging the top left tether.
        +- [element-scroll](../../examples/element-scroll): Demonstrates using the `'scroll-handle'`
        +`targetModifier` to align an element with the scrollbar of an element.
        +- [scroll](../../examples/scroll): Demonstrates using the `'scroll-handle'` `targetModifier`
        +to align an element with the body's scroll handle.
        +- [viewport](../../examples/viewport): Demonstrates aligning an element with the
        +viewport by using the `'visible'` `targetModifier` when tethered to the body.
        diff --git a/bower_components/tether/docs/2-Examples/2-projects_using_tether.md b/bower_components/tether/docs/2-Examples/2-projects_using_tether.md
        new file mode 100644
        index 0000000000..b9086b2802
        --- /dev/null
        +++ b/bower_components/tether/docs/2-Examples/2-projects_using_tether.md
        @@ -0,0 +1,37 @@
        +## Projects Using Tether
        +
        +Here at HubSpot we have built a bunch of libraries on top of Tether,
        +both because we wanted Tether-performance, and because we saw opportunities
        +to improve on what was available in the client-side ecosystem.
        +
        +### [Select](http://github.hubspot.com/select/docs/welcome)
        +
        +Select is a replacement for native browser select elements that is fully stylable.
        +
        +### [Shepherd](http://github.hubspot.com/shepherd/docs/welcome)
        +
        +Shepherd is a library for making tours of your app to help onboard users and show off
        +new features.
        +
        +### [Tooltip](http://github.hubspot.com/tooltip/docs/welcome)
        +
        +A simple, easy-to-use implementation of tooltips that works well.
        +
        +### [Drop](http://github.hubspot.com/drop/docs/welcome)
        +
        +Where Tether does general-purpose positioning, Drop assumes that you are interested
        +in making something which pops up next to something the user clicks or hovers on.
        +
        +If you're building something that fits that pattern, Drop can make things a little easier.
        +
        +### [React Datepicker](https://github.com/Hacker0x01/react-datepicker)
        +
        +A simple and reusable datepicker component for React
        +
        +### [ember-tether](https://github.com/yapplabs/ember-tether)
        +
        +An Ember.js-friendly interface for tether.
        +
        +### Your Project Here
        +
        +If you have a cool open-source library built on Tether, PR this doc.
        diff --git a/bower_components/tether/docs/3-Advanced/1-embedding_tether.md b/bower_components/tether/docs/3-Advanced/1-embedding_tether.md
        new file mode 100644
        index 0000000000..f47be16e14
        --- /dev/null
        +++ b/bower_components/tether/docs/3-Advanced/1-embedding_tether.md
        @@ -0,0 +1,9 @@
        +## Embedding Tether
        +
        +Tether is designed to be embeddable in other libraries.
        +
        +There is one thing you should think about doing to create an embedded Tether:
        +
        +- Set the `classPrefix` of the tethers you create.  That prefix will replace `'tether'` in
        +all of the classes.  You can also disable classes you don't intend on using with the `classes`
        +option.
        diff --git a/bower_components/tether/docs/3-Advanced/2-extending_tether.md b/bower_components/tether/docs/3-Advanced/2-extending_tether.md
        new file mode 100644
        index 0000000000..fa357b211b
        --- /dev/null
        +++ b/bower_components/tether/docs/3-Advanced/2-extending_tether.md
        @@ -0,0 +1,54 @@
        +Extending Tether
        +-----
        +
        +Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.
        +
        +Tether has an array called `Tether.modules`, push onto it to add a module:
        +
        +```coffeescript
        +Tether.modules.push
        +  position: ({top, left}) ->
        +    top += 10
        +
        +    {top, left}
        +```
        +
        +#### Position
        +
        +Your position function can either return a new object with `top` and `left`, `null`/`undefined` to leave the coordinates unchanged, or
        +`false` to cancel the positioning.
        +
        +The position function is passed an object with the following elements:
        +
        +```javascript
        +{
        +  left, // The element's new position, from the top left corner of the page
        +  top,
        +  targetAttachment, // The targetAttachment, with 'auto' resolved to an actual attachment
        +  targetPos, // The coordinates of the target
        +  attachment, // The attachment, as passed in the option
        +  elementPos, // The coordinates of the element
        +  offset, // The offset, after it's converted into pixels and the manual offset is added
        +  targetOffset, // The attachment is converted into an offset and is included in these values
        +  manualOffset, // The manual offset, in pixels
        +  manualTargetOffset
        +}
        +```
        +
        +It is called with the Tether instance as its context (`this`).
        +
        +#### Initialize
        +
        +Modules can also have an `initialize` function which will be called when a new tether is created.  The initialize function
        +is also called with the Tether instance as its context.
        +
        +```coffeescript
        +Tether.modules.push
        +  initialize: ->
        +    console.log "New Tether Created!", @
        +```
        +
        +#### Examples
        +
        +[Constraints](https://github.com/HubSpot/tether/blob/master/src/js/constraint.js) and [shift](https://github.com/HubSpot/tether/blob/master/src/js/shift.js) are both implemented as modules.
        +[Mark Attachment](https://github.com/HubSpot/tether/blob/master/src/js/markAttachment.js) is used by the docs.
        diff --git a/bower_components/tether/docs/coffee/intro.coffee b/bower_components/tether/docs/coffee/intro.coffee
        new file mode 100644
        index 0000000000..52a305df9a
        --- /dev/null
        +++ b/bower_components/tether/docs/coffee/intro.coffee
        @@ -0,0 +1,113 @@
        +{uniqueId} = Tether.Utils
        +
        +SETUP_JS = """
        +yellowBox = $('.yellow-box', $output);
        +greenBox = $('.green-box', $output);
        +scrollBox = $('.scroll-box', $output);
        +"""
        +
        +OUTPUT_HTML = (key) -> """
        +<div class="scroll-box">
        +  <div class="scroll-content">
        +    <div class="yellow-box" data-example="#{ key }"></div>
        +    <div class="green-box" data-example="#{ key }"></div>
        +  </div>
        +</div>
        +"""
        +
        +tethers = {}
        +
        +getOutput = ($block) ->
        +  key = $block.data('example')
        +  if key and typeof key is 'string'
        +    return $("output[data-example='#{ key }']")
        +  else
        +    return $block.parents('pre').nextAll('output').first()
        +
        +run = (key) ->
        +  if typeof key is 'string'
        +    $block = $("code[data-example='#{ key }']")
        +  else
        +    $block = key
        +
        +  key = $block.attr('data-example')
        +
        +  $output = getOutput $block
        +
        +  code = $block.text()
        +  code = SETUP_JS + code
        +
        +  window.$output = $output
        +  tethers[key] = eval code
        +
        +setupBlock = ($block) ->
        +  key = $block.data('example')
        +
        +  $output = getOutput $block
        +
        +  if not key
        +    key = uniqueId()
        +    $block.attr('data-example', key)
        +    $output.attr('data-example', key)
        +    $output.find('.tether-element').attr('data-example', key)
        +
        +  $output.html OUTPUT_HTML(key)
        +
        +  $scrollBox = $output.find('.scroll-box')
        +  $scrollContent = $scrollBox.find('.scroll-content')
        +  $scrollBox.scrollTop(parseInt($scrollContent.css('height')) / 2 - $scrollBox.height() / 2)
        +  $scrollBox.scrollLeft(parseInt($scrollContent.css('width')) / 2 - $scrollBox.width() / 2)
        +  setTimeout ->
        +    $scrollBox.on 'scroll', ->
        +      $output.addClass 'scrolled'
        +
        +  $scrollBox.css 'height', "#{ $block.parent().outerHeight() }px"
        +
        +  if not $output.attr('deactivated')?
        +    run $block
        +
        +$(document.body).on 'click', (e) ->
        +  if $(e.target).is('output[deactivated]')
        +    activate $(e.target)
        +    false
        +  else if $(e.target).is('output[activated]')
        +    deactivate $(e.target)
        +    false
        +
        +activate = ($output) ->
        +  $block = $output.prev().find('code')
        +
        +  run $block
        +
        +  $output.find('.tether-element').show()
        +
        +  key = $output.data('example')
        +  $(tethers[key].element).show()
        +  tethers[key].enable()
        +
        +  $output.removeAttr('deactivated')
        +  $output.attr('activated', true)
        +
        +deactivate = ($output) ->
        +  $block = $output.prev().find('code')
        +  key = $output.data('example')
        +
        +  tethers[key].disable()
        +
        +  $el = $(tethers[key].element)
        +  $el.detach()
        +  $output.find('.scroll-content').append $el
        +  $el.hide()
        +
        +  $output.removeAttr('activated')
        +  $output.attr('deactivated', true)
        +
        +init = ->
        +  $blocks = $('code[data-example]')
        +
        +  setupBlock($ block) for block in $blocks
        +
        +window.EXECUTR_OPTIONS =
        +  codeSelector: 'code[executable]'
        +
        +$ init
        diff --git a/bower_components/tether/docs/css/intro.css b/bower_components/tether/docs/css/intro.css
        new file mode 100644
        index 0000000000..44303fd99c
        --- /dev/null
        +++ b/bower_components/tether/docs/css/intro.css
        @@ -0,0 +1,218 @@
        +@charset "UTF-8";
        +*, *:after, *:before {
        +  box-sizing: border-box; }
        +
        +body {
        +  position: relative; }
        +
        +.yellow-box {
        +  width: 100px;
        +  height: 100px;
        +  background-color: #fe8;
        +  pointer-events: none; }
        +
        +.green-box {
        +  margin-top: 65px;
        +  margin-left: 100px;
        +  width: 200px;
        +  height: 50px;
        +  background-color: #4e9; }
        +  .no-green .green-box {
        +    display: none; }
        +
        +.scroll-box {
        +  height: 150px;
        +  border: 10px solid #eee;
        +  background: #fbfbfb;
        +  overflow: auto;
        +  position: relative; }
        +
        +.scroll-content {
        +  height: 2000px;
        +  width: 2000px;
        +  padding: 910px 809px; }
        +
        +pre.pre-with-output {
        +  margin: 0;
        +  width: 50%;
        +  float: left; }
        +  pre.pre-with-output code mark {
        +    background: #b8daff;
        +    color: #000; }
        +
        +p, h2, h3 {
        +  clear: both; }
        +
        +output {
        +  display: block;
        +  position: relative;
        +  width: 50%;
        +  float: right;
        +  margin-bottom: 15px; }
        +  output.scroll-page .scroll-box {
        +    overflow: hidden; }
        +  output.scroll-page:after {
        +    content: "↕ scroll the page ↕"; }
        +  output:after {
        +    content: "↕ scroll this area ↕";
        +    position: absolute;
        +    bottom: 25px;
        +    width: 100%;
        +    text-align: center;
        +    font-size: 16px;
        +    font-variant: small-caps;
        +    color: #777;
        +    opacity: 1;
        +    -webkit-transition: opacity 0.2s;
        +            transition: opacity 0.2s; }
        +  output.scrolled:after {
        +    opacity: 0; }
        +  output[deactivated], output[activated] {
        +    cursor: pointer; }
        +    output[deactivated] .scroll-box, output[activated] .scroll-box {
        +      pointer-events: none; }
        +    output[deactivated]:after, output[activated]:after {
        +      position: absolute;
        +      top: 0;
        +      left: 0;
        +      right: 0;
        +      bottom: 0;
        +      opacity: 1;
        +      content: "Click To Show";
        +      background-color: #AAA;
        +      border-left: 10px solid #EEE;
        +      color: white;
        +      font-size: 24px;
        +      font-variant: normal;
        +      padding-top: 80px; }
        +  output[activated]:after {
        +    content: "Click To Hide"; }
        +  output[activated].visible-enabled:after {
        +    height: 35px;
        +    padding-top: 5px; }
        +
        +.attachment-mark, .tether-marker-dot {
        +  position: relative; }
        +  .attachment-mark:after, .tether-marker-dot:after {
        +    content: "A";
        +    width: 10px;
        +    height: 10px;
        +    background-color: red;
        +    display: inline-block;
        +    line-height: 10px;
        +    font-size: 9px;
        +    color: white;
        +    text-align: center;
        +    position: absolute; }
        +
        +span.attachment-mark:after, span.tether-marker-dot:after {
        +  position: relative;
        +  top: -1px;
        +  margin-right: 1px; }
        +
        +.tether-marker-dot {
        +  position: absolute; }
        +  .tether-marker-dot:after {
        +    top: -5px;
        +    left: -5px; }
        +
        +.tether-target-marker {
        +  position: absolute; }
        +  div.tether-target-attached-left .tether-target-marker {
        +    left: 0; }
        +  div.tether-target-attached-top .tether-target-marker {
        +    top: 0; }
        +  div.tether-target-attached-bottom .tether-target-marker {
        +    bottom: 0; }
        +  div.tether-target-attached-right .tether-target-marker {
        +    right: 0; }
        +  div.tether-target-attached-center .tether-target-marker {
        +    left: 50%; }
        +
        +.tether-element-marker {
        +  position: absolute; }
        +  div.tether-element-attached-left .tether-element-marker {
        +    left: 0; }
        +  div.tether-element-attached-top .tether-element-marker {
        +    top: 0; }
        +  div.tether-element-attached-bottom .tether-element-marker {
        +    bottom: 0; }
        +  div.tether-element-attached-right .tether-element-marker {
        +    right: 0; }
        +  div.tether-element-attached-center .tether-element-marker {
        +    left: 50%; }
        +
        +.tether-element-attached-middle .tether-element-marker {
        +  top: 50px; }
        +
        +.tether-target-attached-middle .tether-target-marker {
        +  top: 25px; }
        +
        +.tether-element {
        +  position: relative; }
        +  .tether-element.tether-pinned-left {
        +    box-shadow: inset 2px 0 0 0 red; }
        +  .tether-element.tether-pinned-right {
        +    box-shadow: inset -2px 0 0 0 red; }
        +  .tether-element.tether-pinned-top {
        +    box-shadow: inset 0 2px 0 0 red; }
        +  .tether-element.tether-pinned-bottom {
        +    box-shadow: inset 0 -2px 0 0 red; }
        +
        +.tether-target {
        +  position: relative; }
        +
        +.tether-element.tether-out-of-bounds[data-example="hide"] {
        +  display: none; }
        +
        +[data-example^="optimizer"].lang-javascript {
        +  /* This should just be a `code` selector, but sass doesn't allow that with & */
        +  min-height: 220px; }
        +
        +[data-example^="optimizer"].tether-element:before {
        +  margin-top: 26px;
        +  display: block;
        +  text-align: center;
        +  content: "I'm in the body";
        +  line-height: 1.2;
        +  font-size: 15px;
        +  padding: 4px;
        +  color: #666; }
        +
        +[data-example^="optimizer"] .scroll-box .tether-element:before {
        +  content: "I'm in my scroll parent!"; }
        +
        +.tether-element[data-example="scroll-visible"] {
        +  height: 30px; }
        +  .tether-element[data-example="scroll-visible"] .tether-marker-dot {
        +    display: none; }
        +
        +.hs-doc-content h2.projects-header {
        +  text-align: center;
        +  font-weight: 300; }
        +
        +.projects-paragraph {
        +  text-align: center; }
        +  .projects-paragraph a {
        +    display: inline-block;
        +    vertical-align: middle;
        +    *vertical-align: auto;
        +    *zoom: 1;
        +    *display: inline;
        +    text-align: center;
        +    margin-right: 30px;
        +    color: inherit; }
        +    .projects-paragraph a span {
        +      display: inline-block;
        +      vertical-align: middle;
        +      *vertical-align: auto;
        +      *zoom: 1;
        +      *display: inline;
        +      margin-bottom: 20px;
        +      font-size: 20px;
        +      color: inherit;
        +      font-weight: 300; }
        +    .projects-paragraph a img {
        +      display: block;
        +      max-width: 100%;
        +      width: 100px; }
        diff --git a/bower_components/tether/docs/intro.md b/bower_components/tether/docs/intro.md
        new file mode 100644
        index 0000000000..aaf5ab5bc8
        --- /dev/null
        +++ b/bower_components/tether/docs/intro.md
        @@ -0,0 +1,591 @@
        +<script src="dist/js/tether.js"></script>
        +<script src="docs/js/markAttachment.js"></script>
        +<script src="docs/js/intro.js"></script>
        +<link rel="stylesheet" href="docs/css/intro.css"></link>
        +
        +Tether
        +======
        +
        +Tether is a JavaScript library for efficiently making an absolutely positioned
        +element stay next to another element on the page. For example, you might
        +want a tooltip or dialog to open, and remain, next to the relevant item
        +on the page.
        +
        +Tether includes the ability to constrain the element within the viewport, its
        +scroll parent, any other element on the page, or a fixed bounding box.  When it
        +exceeds those constraints it can be pinned to the edge, flip to the other
        +side of its target, or hide itself.
        +
        +Tether optimizes its location placement to result in the minimum amount of
        +'jankyness' as the page is scrolled and resized.  The page can maintain 60fps
        +scrolling even with dozens or hundreds of tethers on screen (pop open the
        +devtools timeline as you scroll this page).
        +
        +Tether is 5kb minified and gzipped, and supports IE9+, and all modern
        +browsers.
        +
        +<h2 class="projects-header">Projects Built With Tether</h2>
        +<p class="projects-paragraph">
        +<a href="http://github.hubspot.com/select/docs/welcome"><span>Select</span><img src="http://github.hubspot.com/os-icons/select-icon.png" /></a>
        +<a href="http://github.hubspot.com/drop/docs/welcome"><span>Drop</span><img src="http://github.hubspot.com/os-icons/drop-icon.png" /></a>
        +<a href="http://github.hubspot.com/tooltip/docs/welcome"><span>Tooltip</span><img src="http://github.hubspot.com/os-icons/tooltip-icon.png" /></a>
        +<a href="http://github.hubspot.com/shepherd/docs/welcome"><span>Shepherd</span><img src="http://github.hubspot.com/os-icons/shepherd-icon.png" /></a>
        +</p>
        +
        +Usage
        +-----
        +
        +The element to be moved is called the 'element'.
        +The element in the page it's to be attached to is called the 'target'.
        +
        +To use Tether, you define a point on the target and a point on the element.
        +Tether moves the element to keep those two points on top of each other.
        +
        +That point is called the attachment (we've marked it in the examples with
        +a red <span class="attachment-mark"></span>).  For example, if you'd like
        +the element to sit on the left of the target:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example='usage'>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top right',
        +  targetAttachment: 'top left'
        +});
        +</code></pre><output data-example='usage'></output>
        +
        +Attachment
        +----------
        +
        +You can move the attachment points of both the element and the target.
        +
        +For example, lets move the element's attachment:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: <mark>'bottom left'</mark>,
        +  targetAttachment: 'top left'
        +});
        +</code></pre><output></output>
        +
        +We can also change the target's attachment point:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'bottom left',
        +  targetAttachment: <mark>'bottom right'</mark>
        +});
        +</code></pre><output></output>
        +
        +There are two more attachment points we haven't seen yet, center and middle:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: <mark>'middle center'</mark>,
        +  targetAttachment: <mark>'middle center'</mark>
        +});
        +</code></pre><output></output>
        +
        +All told, Tether provides six built in attachment positions:
        +
        +- left
        +- center
        +- right
        +- top
        +- middle
        +- bottom
        +
        +The syntax of the attachment properties is: `"vertical-attachment horizontal-attachment"`.
        +
        +You must always supply an `attachment`.  If you don't supply a `target-attachment`, it is
        +assumed to be the mirror image of `attachment`.
        +
        +### Offset
        +
        +The six attachment points we provide are not always enough to place the element
        +exactly where you want it.  To correct this, we provide two more properties,
        +`offset` and `targetOffset`.
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top right',
        +  targetAttachment: 'top left',
        +  <mark>offset: '0 10px'</mark>
        +});
        +</code></pre><output></output>
        +
        +As you can see, we've moved the attachment point of the element 10px to the right.
        +We can also move the attachment point of the target:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top right',
        +  targetAttachment: 'top left',
        +  offset: '0 10px',
        +  <mark>targetOffset: '20px 0'</mark>
        +});
        +</code></pre><output></output>
        +
        +The offset properties also accept percentages. Percentages in `offset` refer to
        +the height and width of the element, `targetOffset` the height and width of
        +the target.
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top right',
        +  targetAttachment: 'top left',
        +  targetOffset: <mark>'0 75%'</mark>
        +});
        +</code></pre><output></output>
        +
        +The syntax of the offset properties is `"vertical-offset horizontal-offset"`
        +
        +Tether offers a couple of special attachments, using the `targetModifier`
        +option:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: scrollBox,
        +  attachment: 'middle right',
        +  targetAttachment: 'middle left',
        +  targetModifier: 'scroll-handle'
        +});
        +</code></pre><output></output>
        +
        +Set the target to `document.body` to have the element follow the page's scroll bar.
        +
        +The `targetModifier` `visible` can be used to attach an element to the visible part
        +of an element:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: document.body,
        +  attachment: 'middle center',
        +  targetAttachment: 'middle center',
        +  <mark>targetModifier: 'visible'</mark>
        +});
        +</code></pre><output deactivated></output>
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example="scroll-visible">new Tether({
        +  element: yellowBox,
        +  <mark>target: scrollBox</mark>,
        +  attachment: 'middle center',
        +  targetAttachment: 'middle center',
        +  targetModifier: 'visible'
        +});
        +</code></pre><output class="no-green scroll-page" data-example="scroll-visible"></output>
        +
        +Constraints
        +-----------
        +
        +If you have tried any of the previous examples, you'll notice that it's pretty
        +easy to scroll the regions in such a way that the element is hanging out on
        +its own, with no target in sight.
        +
        +Constraints allow you to control what happens when the tethered element would
        +have to fall outside of a defined region to maintain the attachment.
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'middle left',
        +  targetAttachment: 'middle left',
        +  <mark>constraints</mark>: [
        +    {
        +      to: 'scrollParent',
        +      pin: true
        +    }
        +  ]
        +});
        +</code></pre><output></output>
        +
        +We've created a constraint which will keep the element within its scroll
        +parent by 'pinning' it to the edges if it tries to escape.  For the sake
        +of the example, we're also highlighting the pinned edge in red.
        +
        +Specify an array of sides if you'd only like to pin those edges:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'middle left',
        +  targetAttachment: 'middle left',
        +  constraints: [
        +    {
        +      to: 'scrollParent',
        +      pin: <mark>['top']</mark>
        +    }
        +  ]
        +});
        +</code></pre><output></output>
        +
        +You might want to allow the element to change its attachment, if doing so
        +would keep more of it within its assigned region:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left',
        +  constraints: [
        +    {
        +      to: 'scrollParent',
        +      <mark>attachment: 'together'</mark>
        +    }
        +  ]
        +});
        +</code></pre><output></output>
        +
        +If you scroll the example a bit, you'll see it flip the attachment when necessary.
        +You can combine `pin` and `attachment` as well:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left',
        +  constraints: [
        +    {
        +      to: 'scrollParent',
        +      attachment: 'together',
        +      <mark>pin: true</mark>
        +    }
        +  ]
        +});
        +</code></pre><output></output>
        +
        +Attachment will accept any of these values:
        +
        +- `element`: Only change the element's attachment
        +- `target`: Only change the target's attachment
        +- `both`: Change either's attachment (or both), as needed
        +- `together`: Change both the element's and target's attachment at the same time (to
        +'flip' the element to the other side of the attachment)
        +- `none`: Don't allow changes to attachment (the default)
        +
        +Together is the option you will use most commonly:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top right',
        +  targetAttachment: 'bottom left',
        +  constraints: [
        +    {
        +      to: 'scrollParent',
        +      attachment: <mark>'together'</mark>
        +    }
        +  ]
        +});
        +</code></pre><output></output>
        +
        +You can also provide different settings for the vertical and horizontal attachments:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left',
        +  constraints: [
        +    {
        +      to: 'scrollParent',
        +      attachment: <mark>'together none'</mark>
        +    }
        +  ]
        +});
        +</code></pre><output></output>
        +
        +Whenever the element is out of the constrained area, we add the `tether-out-of-bounds`
        +class to it.  If you add some CSS to make items with that class `display: none`, the
        +tether will hide.
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example="hide">new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'middle center',
        +  targetAttachment: 'middle center',
        +  constraints: [
        +    {
        +      to: 'scrollParent'
        +    }
        +  ]
        +});
        +</code></pre><output data-example="hide"></output>
        +
        +You can also constrain the element to the viewport, you'll have to scroll the
        +page to see this one.
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example="window">new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left',
        +  constraints: [
        +    {
        +      to: <mark>'window'</mark>,
        +      attachment: 'together'
        +    }
        +  ]
        +});
        +</code></pre><output data-example="window" class="scroll-page"></output>
        +
        +You can, of course, use pin with the window as well to
        +make it always visible no matter where the user scrolls:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left',
        +  constraints: [
        +    {
        +      to: 'window',
        +      attachment: 'together',
        +      <mark>pin: true</mark>
        +    }
        +  ]
        +});
        +</code></pre><output deactivated class="scroll-page visible-enabled"></output>
        +
        +`to` can be any of:
        +
        +- `'scrollParent'`
        +- `'window'`
        +- any DOM element
        +- an array of bound points relative to the body `[X1, Y1, X2, Y2]`
        +
        +You can also provide multiple constraints, keeping in mind that they are
        +processed in the order supplied (the last one always has the final word).
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left',
        +  constraints: [
        +    {
        +      to: <mark>'scrollParent'</mark>,
        +      pin: true
        +    },
        +    {
        +      to: <mark>'window'</mark>,
        +      attachment: 'together'
        +    }
        +  ]
        +});
        +</code></pre><output></output>
        +
        +Optimization
        +------------
        +
        +### Element Moving
        +
        +The goal of Tether's optimizer is to not have to change the positioning
        +CSS as the page is scrolled or resized.  To accomplish this it looks at the
        +last few positions, finds commonalities, and uses them to decide whether to
        +position the element absolutely or with fixed positioning.
        +
        +If the element is fully contained within its scroll parent, its DOM node
        +can also be moved inside the scroll parent, to avoid repaints as the
        +container is scrolled.
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example="optimizer">new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left'
        +});
        +</code></pre><output data-example="optimizer"></output>
        +
        +We are moving where the DOM node is, so if you have CSS which styles elements
        +within the offset parent, you may see some rendering changes.  Also note
        +that this optimization works best if the scroll parent is the offset parent.
        +In other words, **the scroll parent should be made position relative, fixed or
        +absolute to enable this optimization.**
        +
        +If you do see stylistic changes occur when the element is moved,
        +you might want to disable this optimization.  You can do that by
        +setting `optimizations.moveElement` to false.
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example="optimizer2">new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  targetAttachment: 'bottom left',
        +  optimizations: {
        +    <mark>moveElement: false</mark>
        +  }
        +});
        +</code></pre><output data-example="optimizer2"></output>
        +
        +### GPU
        +
        +By default tether positions elements using CSS transforms.  These transforms allow the
        +tethered element to be moved as its own layer to not force a repaint of the underlying
        +page.
        +
        +This method of positioning can cause some issues however, including color shifts and artifacts.
        +
        +If you experience these issues, you can disable this optimization by setting `optimizations.gpu`
        +to false:
        +
        +<pre class="pre-with-output"><code class="lang-javascript" data-example>new Tether({
        +  element: yellowBox,
        +  target: greenBox,
        +  attachment: 'top left',
        +  optimizations: {
        +    <mark>gpu: false</mark>
        +  }
        +});
        +</code></pre><output></output>
        +
        +Methods
        +-------
        +
        +The `Tether` constructor we've been using in these examples returns us a
        +`Tether` object.
        +
        +The `Tether` object has these methods:
        +
        +- `setOptions({ options })` - Update any of the options (such as attachment)
        +- `disable()` - Disable the tethering
        +- `enable()` - Enable the tethering
        +- `destroy()` - Disable and remove all references
        +- `position()` - Manually trigger a repositioning
        +
        +Options
        +-------
        +
        +The full list of options which can be passed to the `Tether` constructor and
        +`setOptions`:
        +
        +- `element`: The DOM element, jQuery element, or a selector string of an element which will be moved
        +- `target`: The DOM element, jQuery element, or a selector string of an element which the `element` will be attached to
        +- `attachment`: A string of the form `'vert-attachment horiz-attachment'`
        +  - `vert-attachment` can be any of `'top'`, `'middle'`, `'bottom'`
        +  - `horiz-attachment` can be any of `'left'`, `'center'`, `'right'`
        +- `targetAttachment`: A string similar to `attachment`.
        +  The one difference is that, if it's not provided, targetAttachment will assume the mirror
        +  image of `attachment`.
        +- `offset`: A string of the form `'vert-offset horiz-offset'`
        +  - `vert-offset` and `horiz-offset` can be of the form `"20px"` or `"55%"`
        +- `targetOffset`: A string similar to `offset`, but refering to the offset of the target
        +- `targetModifier`: Can be set to `'visible'` or `'scroll-handle'`
        +- `enabled`: Should the tether be enabled initially? Defaults to `true`.
        +- `classes`: A hash of classes which should be changed or disabled
        +- `classPrefix`: The prefix placed at the beginning of the default classes, defaults to `'tether'`
        +- `optimizations`: A hash of optimizations, used to disable them
        +- `constraints`: An array of constraint definition objects.  Each definition is of the form:
        +  - `to`: A DOM element, bounding box, the string `'window'`, or the string `'scrollParent'`
        +  - `pin`: `true` or an array of strings representing the sides of the constraint
        +  - `attachment`: A string of the form `"vert-modifier horiz-modifier"`, or a single value
        +  representing both
        +    - Each modifier should be one of `"none"`, `"together"`, `"element"`, `"target"`, or `"both"`.
        +  - `outOfBoundsClass`: An alternative to `"tether-out-of-bounds"`, useful if the class
        +  needs to be differentiated from that of another constraint.
        +  - `pinnedClass`: An alternative to `"tether-pinned"`, similar to `outOfBoundsClass`.
        +
        +Classes
        +-------
        +
        +Tether adds a variety of classes to the element and target to allow you to style
        +them based on their tethering.
        +
        +You can change the prefix of the classes with the `classPrefix` option.  It is `'tether'` by
        +default, but you could, for example, change it to be `'bill'` if you were building the bill
        +library and all the classes would be `'bill-*'`.
        +
        +```javascript
        +new Tether({
        +  classPrefix: 'bill'
        +});
        +```
        +
        +The sass/css is similarily configurable, see
        +[tooltip](https://github.com/HubSpot/tooltip/blob/master/sass/tooltip-theme-arrows.sass#L14) for
        +an example of how to make your own prefixed css file.
        +
        +All classes can be changed or disabled with the `classes` option.  For example, to change the
        +`tether-element` class to be `my-box`:
        +
        +```javascript
        +new Tether({
        +  classes: {
        +    element: 'my-box'
        +  }
        +});
        +```
        +
        +You can also disable classes you're not going to use:
        +
        +```javascript
        +new Tether({
        +  classes: {
        +    out-of-bounds: false
        +  }
        +});
        +```
        +
        +- `tether-element` is added to the element
        +- `tether-target` is added to the target
        +- `tether-enabled` is added to both elements when tether is not disabled
        +- `tether-element-attached-[left,right,top,bottom,middle,center]` is added to both
        +elements based on the elements attachment, if the element becomes detached (for
        +example, if it's pinned), that class is removed.  The class reflects how the
        +element is actually attached, so if a constraint changes the attachment, that
        +change will be reflected in the class.
        +- `tether-target-attached-[left,right,top,bottom,middle,center]` is added to both
        +elements based on the target's attachment.  All of the characteristics are the
        +same as for element-attached.
        +
        +### Constraint-related Classes
        +
        +- `tether-out-of-bounds`, `tether-out-of-bounds-[side]` are added to both the element and the target
        +when the element is placed outside of its constraint.
        +- `tether-pinned`, `tether-pinned-[side]` are added to both the element and target when a constraint
        +has pinned the element to the [side] of the container.
        +
        +Browser Support
        +---------------
        +
        +Tether supports IE9+, and all modern browsers.
        +
        +Google doesn't support IE8, Microsoft is dropping support in a few months, and not supporting it saves
        +us a whole lot of trouble.  If you are interested in adding support, get in touch, we're happy to accept
        +a PR.
        +
        +Contributing
        +------------
        +
        +Please contribute! Tether is developed in Coffeescript, but if that's problematic for you, feel free
        +to submit pull requests which just change the JavaScript files, we can adapt them as needed.
        +
        +To build Tether, you need:
        +
        +- Node.js
        +
        +#### Instructions
        +
        +- Install the build tool
        +
        +```bash
        +npm install -g gulp
        +```
        +
        +- Install the project
        +
        +```bash
        +# In the project directory
        +npm install
        +```
        +
        +- Build / Watch
        +
        +```bash
        +gulp
        +```
        diff --git a/bower_components/tether/docs/js/intro.js b/bower_components/tether/docs/js/intro.js
        new file mode 100644
        index 0000000000..47ed6e5b3a
        --- /dev/null
        +++ b/bower_components/tether/docs/js/intro.js
        @@ -0,0 +1,117 @@
        +(function() {
        +  var OUTPUT_HTML, SETUP_JS, activate, deactivate, getOutput, init, run, setupBlock, tethers, uniqueId;
        +
        +  uniqueId = Tether.Utils.uniqueId;
        +
        +  SETUP_JS = "yellowBox = $('.yellow-box', $output);\ngreenBox = $('.green-box', $output);\nscrollBox = $('.scroll-box', $output);";
        +
        +  OUTPUT_HTML = function(key) {
        +    return "<div class=\"scroll-box\">\n  <div class=\"scroll-content\">\n    <div class=\"yellow-box\" data-example=\"" + key + "\"></div>\n    <div class=\"green-box\" data-example=\"" + key + "\"></div>\n  </div>\n</div>";
        +  };
        +
        +  tethers = {};
        +
        +  getOutput = function($block) {
        +    var key;
        +    key = $block.data('example');
        +    if (key && typeof key === 'string') {
        +      return $("output[data-example='" + key + "']");
        +    } else {
        +      return $block.parents('pre').nextAll('output').first();
        +    }
        +  };
        +
        +  run = function(key) {
        +    var $block, $output, code;
        +    if (typeof key === 'string') {
        +      $block = $("code[data-example='" + key + "']");
        +    } else {
        +      $block = key;
        +    }
        +    key = $block.attr('data-example');
        +    $output = getOutput($block);
        +    code = $block.text();
        +    code = SETUP_JS + code;
        +    window.$output = $output;
        +    return tethers[key] = eval(code);
        +  };
        +
        +  setupBlock = function($block) {
        +    var $output, $scrollBox, $scrollContent, key;
        +    key = $block.data('example');
        +    $output = getOutput($block);
        +    if (!key) {
        +      key = uniqueId();
        +      $block.attr('data-example', key);
        +      $output.attr('data-example', key);
        +      $output.find('.tether-element').attr('data-example', key);
        +    }
        +    $output.html(OUTPUT_HTML(key));
        +    $scrollBox = $output.find('.scroll-box');
        +    $scrollContent = $scrollBox.find('.scroll-content');
        +    $scrollBox.scrollTop(parseInt($scrollContent.css('height')) / 2 - $scrollBox.height() / 2);
        +    $scrollBox.scrollLeft(parseInt($scrollContent.css('width')) / 2 - $scrollBox.width() / 2);
        +    setTimeout(function() {
        +      return $scrollBox.on('scroll', function() {
        +        return $output.addClass('scrolled');
        +      });
        +    });
        +    $scrollBox.css('height', "" + ($block.parent().outerHeight()) + "px");
        +    if ($output.attr('deactivated') == null) {
        +      return run($block);
        +    }
        +  };
        +
        +  $(document.body).on('click', function(e) {
        +    if ($(e.target).is('output[deactivated]')) {
        +      activate($(e.target));
        +      return false;
        +    } else if ($(e.target).is('output[activated]')) {
        +      deactivate($(e.target));
        +      return false;
        +    }
        +  });
        +
        +  activate = function($output) {
        +    var $block, key;
        +    $block = $output.prev().find('code');
        +    run($block);
        +    $output.find('.tether-element').show();
        +    key = $output.data('example');
        +    $(tethers[key].element).show();
        +    tethers[key].enable();
        +    $output.removeAttr('deactivated');
        +    return $output.attr('activated', true);
        +  };
        +
        +  deactivate = function($output) {
        +    var $block, $el, key;
        +    $block = $output.prev().find('code');
        +    key = $output.data('example');
        +    tethers[key].disable();
        +    $el = $(tethers[key].element);
        +    $el.detach();
        +    $output.find('.scroll-content').append($el);
        +    $el.hide();
        +    $output.removeAttr('activated');
        +    return $output.attr('deactivated', true);
        +  };
        +
        +  init = function() {
        +    var $blocks, block, _i, _len, _results;
        +    $blocks = $('code[data-example]');
        +    _results = [];
        +    for (_i = 0, _len = $blocks.length; _i < _len; _i++) {
        +      block = $blocks[_i];
        +      _results.push(setupBlock($(block)));
        +    }
        +    return _results;
        +  };
        +
        +  window.EXECUTR_OPTIONS = {
        +    codeSelector: 'code[executable]'
        +  };
        +
        +  $(init);
        +
        +}).call(this);
        diff --git a/bower_components/tether/docs/js/markAttachment.js b/bower_components/tether/docs/js/markAttachment.js
        new file mode 100644
        index 0000000000..c7d34f0885
        --- /dev/null
        +++ b/bower_components/tether/docs/js/markAttachment.js
        @@ -0,0 +1,51 @@
        +/* globals Tether */
        +
        +'use strict';
        +
        +Tether.modules.push({
        +  initialize: function initialize() {
        +    var _this = this;
        +
        +    this.markers = {};
        +
        +    ['target', 'element'].forEach(function (type) {
        +      var el = document.createElement('div');
        +      el.className = _this.getClass('' + type + '-marker');
        +
        +      var dot = document.createElement('div');
        +      dot.className = _this.getClass('marker-dot');
        +      el.appendChild(dot);
        +
        +      _this[type].appendChild(el);
        +
        +      _this.markers[type] = { dot: dot, el: el };
        +    });
        +  },
        +
        +  position: function position(_ref) {
        +    var manualOffset = _ref.manualOffset;
        +    var manualTargetOffset = _ref.manualTargetOffset;
        +
        +    var offsets = {
        +      element: manualOffset,
        +      target: manualTargetOffset
        +    };
        +
        +    for (var type in offsets) {
        +      var offset = offsets[type];
        +      for (var side in offset) {
        +        var val = offset[side];
        +        var notString = typeof val !== 'string';
        +        if (notString || val.indexOf('%') === -1 && val.indexOf('px') === -1) {
        +          val += 'px';
        +        }
        +
        +        if (this.markers[type].dot.style[side] !== val) {
        +          this.markers[type].dot.style[side] = val;
        +        }
        +      }
        +    }
        +
        +    return true;
        +  }
        +});
        diff --git a/bower_components/tether/docs/sass/intro.sass b/bower_components/tether/docs/sass/intro.sass
        new file mode 100644
        index 0000000000..8456a20943
        --- /dev/null
        +++ b/bower_components/tether/docs/sass/intro.sass
        @@ -0,0 +1,233 @@
        +$scrollableArea: 2000px
        +$exampleWidth: 400px
        +$exampleHeight: 180px
        +
        +@mixin inline-block
        +  display: inline-block
        +  vertical-align: middle
        +  *vertical-align: auto
        +  *zoom: 1
        +  *display: inline
        +
        +*, *:after, *:before
        +  box-sizing: border-box
        +
        +body
        +  position: relative
        +
        +.yellow-box
        +  width: 100px
        +  height: 100px
        +  background-color: #fe8
        +  pointer-events: none
        +
        +.green-box
        +  margin-top: ($exampleHeight - 50px) / 2
        +  margin-left: ($exampleWidth - 200px) / 2
        +  width: 200px
        +  height: 50px
        +  background-color: #4e9
        +
        +  .no-green &
        +    display: none
        +
        +.scroll-box
        +  height: 150px
        +  border: 10px solid #eee
        +  background: #fbfbfb
        +  overflow: auto
        +  position: relative
        +
        +.scroll-content
        +  height: $scrollableArea
        +  width: $scrollableArea
        +  padding: ($scrollableArea - $exampleHeight)/2 ($scrollableArea - $exampleWidth)/2 + 9
        +
        +pre.pre-with-output
        +  margin: 0
        +  width: 50%
        +  float: left
        +
        +  code mark
        +    background: #b8daff
        +    color: #000
        +
        +p, h2, h3
        +  clear: both
        +
        +output
        +  display: block
        +  position: relative
        +  width: 50%
        +  float: right
        +  margin-bottom: 15px
        +
        +  &.scroll-page
        +    .scroll-box
        +      overflow: hidden
        +
        +    &:after
        +      content: "↕ scroll the page ↕"
        +
        +  &:after
        +    content: "↕ scroll this area ↕"
        +    position: absolute
        +    bottom: 25px
        +    width: 100%
        +    text-align: center
        +    font-size: 16px
        +    font-variant: small-caps
        +    color: #777
        +    opacity: 1
        +    transition: opacity 0.2s
        +
        +  &.scrolled:after
        +    opacity: 0
        +
        +  &[deactivated], &[activated]
        +    .scroll-box
        +      pointer-events: none
        +
        +    cursor: pointer
        +
        +    &:after
        +      position: absolute
        +      top: 0
        +      left: 0
        +      right: 0
        +      bottom: 0
        +      opacity: 1
        +      content: "Click To Show"
        +      background-color: #AAA
        +      border-left: 10px solid #EEE
        +      color: white
        +      font-size: 24px
        +      font-variant: normal
        +      padding-top: 80px
        +
        +  &[activated]
        +    &:after
        +      content: "Click To Hide"
        +
        +    &.visible-enabled
        +      &:after
        +        height: 35px
        +        padding-top: 5px
        +
        +.attachment-mark
        +  position: relative
        +
        +  &:after
        +    content: "A"
        +    width: 10px
        +    height: 10px
        +    background-color: red
        +    display: inline-block
        +
        +    line-height: 10px
        +    font-size: 9px
        +    color: white
        +    text-align: center
        +
        +    position: absolute
        +
        +span.attachment-mark
        +  &:after
        +    position: relative
        +    top: -1px
        +    margin-right: 1px
        +
        +.tether-marker-dot
        +  @extend .attachment-mark
        +
        +  position: absolute
        +
        +  &:after
        +    top: -5px
        +    left: -5px
        +
        +@each $type in target, element
        +  .tether-#{ $type }-marker
        +    position: absolute
        +
        +    @each $side in left, top, bottom, right
        +      div.tether-#{ $type }-attached-#{ $side } &
        +        #{ $side }: 0
        +
        +    div.tether-#{ $type }-attached-center &
        +      left: 50%
        +
        +.tether-element-attached-middle .tether-element-marker
        +  top: 50px
        +
        +.tether-target-attached-middle .tether-target-marker
        +  top: 25px
        +
        +.tether-element
        +  position: relative
        +
        +  &.tether-pinned-left
        +    box-shadow: inset 2px 0 0 0 red
        +  &.tether-pinned-right
        +    box-shadow: inset -2px 0 0 0 red
        +  &.tether-pinned-top
        +    box-shadow: inset 0 2px 0 0 red
        +  &.tether-pinned-bottom
        +    box-shadow: inset 0 -2px 0 0 red
        +
        +.tether-target
        +  position: relative
        +
        +.tether-element.tether-out-of-bounds[data-example="hide"]
        +  display: none
        +
        +[data-example^="optimizer"]
        +  &.lang-javascript
        +    /* This should just be a `code` selector, but sass doesn't allow that with & */
        +    min-height: 220px
        +
        +  &.tether-element
        +
        +    &:before
        +      margin-top: 26px
        +      display: block
        +      text-align: center
        +      content: "I'm in the body"
        +      line-height: 1.2
        +      font-size: 15px
        +      padding: 4px
        +      color: #666
        +
        +  .scroll-box .tether-element:before
        +    content: "I'm in my scroll parent!"
        +
        +.tether-element[data-example="scroll-visible"]
        +  height: 30px
        +
        +  .tether-marker-dot
        +    display: none
        +
        +.hs-doc-content h2.projects-header
        +  text-align: center
        +  font-weight: 300
        +
        +.projects-paragraph
        +  text-align: center
        +
        +  a
        +    +inline-block
        +    text-align: center
        +    margin-right: 30px
        +    color: inherit
        +
        +    span
        +      +inline-block
        +      margin-bottom: 20px
        +      font-size: 20px
        +      color: inherit
        +      font-weight: 300
        +
        +    img
        +      display: block
        +      max-width: 100%
        +      width: 100px
        diff --git a/bower_components/tether/docs/welcome/browser-demo.html b/bower_components/tether/docs/welcome/browser-demo.html
        new file mode 100644
        index 0000000000..6c175bc19e
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/browser-demo.html
        @@ -0,0 +1,76 @@
        +<!doctype html>
        +<head>
        +    <meta charset="utf-8">
        +    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        +    <title>Drop – Browser Demo</title>
        +    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +    <link rel="icon" href="http://static.hubspot.com/favicon.ico">
        +
        +    <script type="text/javascript" src="//use.typekit.net/ghy0wve.js"></script>
        +    <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
        +
        +    <!-- Drop themes -->
        +    <link rel="stylesheet" href="//github.hubspot.com/tether/dist/css/tether-theme-arrows-dark.css" />
        +
        +    <!-- Browser demo styles -->
        +    <link rel="stylesheet" href="//github.hubspot.com/tether/docs/welcome/css/browser-demo.css" />
        +</head>
        +<body>
        +    <div class="browser-demo">
        +        <div class="top"><div class="title"></div></div>
        +        <div class="bottom">
        +            <div class="left">
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +                <div class="item"></div>
        +            </div>
        +            <div class="right">
        +                <div class="title"></div>
        +                <p>
        +                    <div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div>
        +                </p>
        +                <p>
        +                    <div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div><div class="word"></div>
        +                </p>
        +            </div>
        +        </div>
        +    </div>
        +
        +    <!-- Tether javascript -->
        +    <script src="//github.hubspot.com/tether/dist/js/tether.min.js"></script>
        +
        +    <!-- Welcome docs javascript -->
        +    <script src="//github.hubspot.com/tether/docs/welcome/js/log.js"></script>
        +    <script src="//github.hubspot.com/tether/docs/welcome/js/jquery.js"></script>
        +    <script src="//github.hubspot.com/tether/docs/welcome/js/drop.js"></script>
        +</body>
        +</html>
        diff --git a/bower_components/tether/docs/welcome/coffee/welcome.coffee b/bower_components/tether/docs/welcome/coffee/welcome.coffee
        new file mode 100644
        index 0000000000..a43160214c
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/coffee/welcome.coffee
        @@ -0,0 +1,212 @@
        +_Drop = Drop.createContext classPrefix: 'tether'
        +
        +isMobile = $(window).width() < 567
        +
        +init = ->
        +    setupHero()
        +    setupBrowserDemo()
        +
        +setupHero = ->
        +    $target = $('.tether-target-demo')
        +
        +    positions = [
        +        'top left'
        +        'left top'
        +        'left middle'
        +        'left bottom'
        +        'bottom left'
        +        'bottom center'
        +        'bottom right'
        +        'right bottom'
        +        'right middle'
        +        'right top'
        +        'top right'
        +        'top center'
        +    ]
        +
        +    if isMobile
        +        positions = [
        +            'top left'
        +            'bottom left'
        +            'bottom right'
        +            'top right'
        +        ]
        +
        +    window.drops = {}
        +
        +    for position in positions
        +        drops[position] = new _Drop
        +            target: $target[0]
        +            classes: 'tether-theme-arrows-dark'
        +            position: position
        +            constrainToWindow: false
        +            openOn: ''
        +            content: '<div style="height: 50px; width: 50px"></div>'
        +
        +    openIndex = 0
        +    frames = 0
        +    frameLengthMS = 10
        +
        +    openAllDrops = ->
        +        for position, drop of drops
        +            drop.open()
        +
        +    openNextDrop = ->
        +        for position, drop of drops
        +            drop.close()
        +
        +        drops[positions[openIndex]].open()
        +        drops[positions[(openIndex + 6) % positions.length]].open()
        +
        +        openIndex = (openIndex + 1) % positions.length
        +
        +        if frames > 5
        +            finalDropState()
        +            return
        +
        +        frames += 1
        +
        +        setTimeout openNextDrop, frameLengthMS * frames
        +
        +    finalDropState = ->
        +        $(drops['top left'].dropContent).html('Marrying DOM elements for life.')
        +        $(drops['bottom right'].dropContent).html('<a class="button" href="http://github.com/HubSpot/tether">★ On Github</a>')
        +        drops['top left'].open()
        +        drops['bottom right'].open()
        +
        +    if true or isMobile
        +        drops['top left'].open()
        +        drops['top left'].tether.position()
        +        drops['bottom right'].open()
        +        drops['bottom right'].tether.position()
        +        finalDropState()
        +
        +    else
        +        openNextDrop()
        +
        +setupBrowserDemo = ->
        +    $browserDemo = $('.browser-demo.showcase')
        +
        +    $startPoint = $('.browser-demo-start-point')
        +    $stopPoint = $('.browser-demo-stop-point')
        +
        +    $iframe = $('.browser-window iframe')
        +    $browserContents = $('.browser-content .browser-demo-inner')
        +
        +    $sections = $('.browser-demo-section')
        +
        +    $('body').append """
        +        <style>
        +            table.showcase.browser-demo.fixed-bottom {
        +                top: #{ $sections.length }00%
        +            }
        +        </style>
        +    """
        +
        +    $(window).scroll ->
        +        scrollTop = $(window).scrollTop()
        +
        +        if $startPoint.position().top < scrollTop and scrollTop + window.innerHeight < $stopPoint.position().top
        +            $browserDemo.removeClass('fixed-bottom')
        +            $browserDemo.addClass('fixed')
        +
        +            $sections.each ->
        +                $section = $ @
        +
        +                if $section.position().top < scrollTop < $section.position().top + $section.outerHeight()
        +                    setSection $section.data('section')
        +
        +                return true
        +
        +        else
        +            $browserDemo.removeAttr('data-section')
        +            $browserDemo.removeClass('fixed')
        +
        +            if scrollTop + window.innerHeight > $stopPoint.position().top
        +                $browserDemo.addClass('fixed-bottom')
        +            else
        +                $browserDemo.removeClass('fixed-bottom')
        +
        +    $iframe.load ->
        +        iframeWindow = $iframe[0].contentWindow
        +
        +        $items = $iframe.contents().find('.item')
        +
        +        $items.each (i) ->
        +            $item = $(@)
        +
        +            _iframeWindowDrop = iframeWindow.Drop.createContext classPrefix: 'tether'
        +
        +            drop = new _iframeWindowDrop
        +                target: $item[0]
        +                classes: 'tether-theme-arrows-dark'
        +                position: 'right top'
        +                constrainToWindow: true
        +                openOn: 'click'
        +                content: '''
        +                    <ul>
        +                        <li>Action&nbsp;1</li>
        +                        <li>Action&nbsp;2</li>
        +                        <li>Action&nbsp;3</li>
        +                    </ul>
        +                '''
        +
        +            $item.data('drop', drop)
        +
        +    scrollInterval = undefined
        +    scrollTop = 0
        +    scrollTopDirection = 1
        +
        +    setSection = (section) ->
        +        $browserDemo.attr('data-section', section)
        +
        +        $('.section-copy').removeClass('active')
        +        $(""".section-copy[data-section="#{ section }"]""").addClass('active')
        +
        +        openExampleItem = ->
        +            if isMobile
        +                $iframe.contents().find('.item:first').data().drop.open()
        +            else
        +                $iframe.contents().find('.item:eq(2)').data().drop.open()
        +
        +        closeAllItems = ->
        +            $iframe.contents().find('.item').each -> $(@).data().drop.close() or true
        +
        +        scrollLeftSection = ->
        +            scrollInterval = setInterval ->
        +                $iframe.contents().find('.left').scrollTop scrollTop
        +                scrollTop += scrollTopDirection
        +                if scrollTop > 50
        +                    scrollTopDirection = -1
        +                if scrollTop < 0
        +                    scrollTopDirection = 1
        +            , 30
        +
        +        stopScrollingLeftSection = ->
        +            clearInterval scrollInterval
        +
        +        switch section
        +
        +            when 'what'
        +                closeAllItems()
        +                openExampleItem()
        +                stopScrollingLeftSection()
        +
        +            when 'how'
        +                closeAllItems()
        +                openExampleItem()
        +                stopScrollingLeftSection()
        +                scrollLeftSection()
        +
        +            when 'why'
        +                closeAllItems()
        +                openExampleItem()
        +                stopScrollingLeftSection()
        +                scrollLeftSection()
        +
        +            when 'outro'
        +                closeAllItems()
        +                openExampleItem()
        +                stopScrollingLeftSection()
        +
        +init()
        \ No newline at end of file
        diff --git a/bower_components/tether/docs/welcome/css/browser-demo.css b/bower_components/tether/docs/welcome/css/browser-demo.css
        new file mode 100644
        index 0000000000..0bd007b8f8
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/css/browser-demo.css
        @@ -0,0 +1,86 @@
        +html, body {
        +  height: 100%;
        +  overflow: hidden;
        +  font-family: "proxima-nova", sans-serif; }
        +
        +.tether.tether-theme-arrows-dark .tether-content {
        +  -webkit-filter: none;
        +          filter: none;
        +  background: #000; }
        +  .tether.tether-theme-arrows-dark .tether-content ul {
        +    color: #fff;
        +    list-style: none;
        +    padding: 0;
        +    margin: 0; }
        +
        +.tether.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
        +  border-right-color: #000; }
        +
        +.browser-demo {
        +  position: absolute;
        +  top: 0;
        +  left: 0;
        +  bottom: 0;
        +  right: 0; }
        +  .browser-demo *, .browser-demo *:after, .browser-demo *:before {
        +    box-sizing: border-box; }
        +  .browser-demo .top {
        +    position: absolute;
        +    height: 60px;
        +    padding: 20px;
        +    line-height: 40px;
        +    width: 100%;
        +    border-bottom: 1px solid rgba(0, 0, 0, 0.1); }
        +  .browser-demo .bottom {
        +    position: absolute;
        +    top: 60px;
        +    bottom: 0;
        +    width: 100%; }
        +    .browser-demo .bottom .left {
        +      border-right: 1px solid rgba(0, 0, 0, 0.1);
        +      position: absolute;
        +      width: 30%;
        +      height: 100%;
        +      overflow: auto; }
        +      .browser-demo .bottom .left .item {
        +        height: 64px;
        +        border-bottom: 1px solid rgba(0, 0, 0, 0.1);
        +        cursor: pointer; }
        +        .browser-demo .bottom .left .item:hover, .browser-demo .bottom .left .item.tether-open {
        +          background: rgba(0, 0, 0, 0.1);
        +          border-bottom: 1px solid transparent; }
        +        .browser-demo .bottom .left .item:last-child {
        +          border-bottom: 0; }
        +    .browser-demo .bottom .right {
        +      position: absolute;
        +      width: 70%;
        +      right: 0;
        +      height: 100%;
        +      padding: 20px; }
        +  .browser-demo .title {
        +    display: inline-block;
        +    vertical-align: middle;
        +    *vertical-align: auto;
        +    *zoom: 1;
        +    *display: inline;
        +    background: rgba(0, 0, 0, 0.1);
        +    width: 150px;
        +    height: 15px;
        +    margin-bottom: 20px; }
        +  .browser-demo .word {
        +    display: inline-block;
        +    vertical-align: middle;
        +    *vertical-align: auto;
        +    *zoom: 1;
        +    *display: inline;
        +    background: rgba(0, 0, 0, 0.1);
        +    width: 50px;
        +    height: 8px;
        +    margin-right: 5px;
        +    margin-bottom: 5px; }
        +    .browser-demo .word:nth-last-child(4n+1) {
        +      width: 73px; }
        +    .browser-demo .word:nth-last-child(10n+1) {
        +      width: 14px; }
        +    .browser-demo .word:nth-last-child(9n+1) {
        +      width: 80px; }
        diff --git a/bower_components/tether/docs/welcome/css/prism.css b/bower_components/tether/docs/welcome/css/prism.css
        new file mode 100644
        index 0000000000..b86d1c2a19
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/css/prism.css
        @@ -0,0 +1,2 @@
        +/* Prism.js */
        +code[class*="language-"], pre[class*="language-"] {color: black; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] {padding: 1em; margin: .5em 0; overflow: auto; font-size: 14px; } :not(pre) > code[class*="language-"], pre[class*="language-"] {background: rgba(0, 0, 0, .05); } /* Inline code */ :not(pre) > code[class*="language-"] {padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata {color: slategray; } .token.punctuation {color: #999; } .namespace {opacity: .7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol {color: #905; } .token.selector, .token.attr-name, .token.string, .token.builtin {color: #690; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable {color: #a67f59; } .token.atrule, .token.attr-value, .token.keyword {color: #07a; } .token.regex, .token.important {color: #e90; } .token.important {font-weight: bold; } .token.entity {cursor: help; }
        \ No newline at end of file
        diff --git a/bower_components/tether/docs/welcome/css/welcome.css b/bower_components/tether/docs/welcome/css/welcome.css
        new file mode 100644
        index 0000000000..8b7a6ad89d
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/css/welcome.css
        @@ -0,0 +1,247 @@
        +html, body {
        +  height: 100%; }
        +
        +body {
        +  margin: 0;
        +  font-family: "proxima-nova", "Helvetica Neue", sans-serif; }
        +
        +.button {
        +  display: inline-block;
        +  border: 2px solid #333;
        +  color: #333;
        +  padding: 1em 1.25em;
        +  font-weight: 500;
        +  text-transform: uppercase;
        +  letter-spacing: 3px;
        +  text-decoration: none;
        +  cursor: pointer;
        +  width: 140px;
        +  font-size: .8em;
        +  line-height: 1.3em;
        +  text-align: center; }
        +
        +.tether-element.tether-theme-arrows-dark .tether-content {
        +  padding: 1em;
        +  font-size: 1.1em; }
        +  .tether-element.tether-theme-arrows-dark .tether-content .button {
        +    border-color: #fff;
        +    color: #fff;
        +    width: 170px;
        +    pointer-events: all; }
        +
        +.mobile-copy {
        +  display: none; }
        +  @media (max-width: 568px) {
        +    .mobile-copy {
        +      display: block; } }
        +
        +.button.dark {
        +  background: #333;
        +  color: #fff; }
        +
        +.hero-wrap {
        +  height: 100%;
        +  overflow: hidden; }
        +
        +table.showcase {
        +  height: 100%;
        +  width: 100%;
        +  position: relative; }
        +  table.showcase:after {
        +    content: "";
        +    display: block;
        +    position: absolute;
        +    left: 0;
        +    right: 0;
        +    bottom: 20px;
        +    margin: auto;
        +    height: 0;
        +    width: 0;
        +    border-width: 18px;
        +    border-style: solid;
        +    border-color: transparent;
        +    border-top-color: rgba(0, 0, 0, 0.2); }
        +  table.showcase.no-next-arrow:after {
        +    display: none; }
        +  table.showcase .showcase-inner {
        +    margin: 40px auto 60px;
        +    padding: 10px; }
        +    table.showcase .showcase-inner h1 {
        +      font-size: 50px;
        +      text-align: center;
        +      font-weight: 300; }
        +      @media (max-width: 567px) {
        +        table.showcase .showcase-inner h1 {
        +          font-size: 40px; } }
        +    table.showcase .showcase-inner h2 {
        +      font-size: 24px;
        +      text-align: center;
        +      font-weight: 300;
        +      margin: 1em 0 1em; }
        +      @media (max-width: 567px) {
        +        table.showcase .showcase-inner h2 {
        +          font-size: 14px; } }
        +    table.showcase .showcase-inner p {
        +      text-align: center; }
        +  table.showcase.hero {
        +    text-align: center; }
        +    table.showcase.hero .tether-target-demo {
        +      display: inline-block;
        +      vertical-align: middle;
        +      *vertical-align: auto;
        +      *zoom: 1;
        +      *display: inline;
        +      border: 2px dotted #000;
        +      margin: 5rem auto;
        +      padding: 5rem; }
        +      @media (max-width: 567px) {
        +        table.showcase.hero .tether-target-demo {
        +          padding: 1rem; } }
        +  table.showcase.share {
        +    background: #f3f3f3; }
        +  table.showcase.projects-showcase .showcase-inner .projects-list {
        +    width: 80%;
        +    max-width: 1200px;
        +    margin: 0 auto; }
        +    table.showcase.projects-showcase .showcase-inner .projects-list .project {
        +      color: inherit;
        +      text-decoration: none;
        +      position: relative;
        +      width: 50%;
        +      float: left;
        +      text-align: center;
        +      margin-bottom: 2rem; }
        +      table.showcase.projects-showcase .showcase-inner .projects-list .project:nth-child(odd) {
        +        clear: left; }
        +    table.showcase.projects-showcase .showcase-inner .projects-list .os-icon {
        +      width: 8rem;
        +      height: 8rem;
        +      margin-bottom: 1rem;
        +      background-size: 100%; }
        +    table.showcase.projects-showcase .showcase-inner .projects-list h1 {
        +      font-size: 2.5rem; }
        +    table.showcase.projects-showcase .showcase-inner .projects-list p {
        +      font-size: 1.3rem; }
        +  table.showcase.browser-demo {
        +    background-image: -webkit-linear-gradient(top left, #723362 0%, #9d223c 100%);
        +    background-image: linear-gradient(top left, #723362 0%, #9d223c 100%);
        +    background-color: #9d223c;
        +    position: absolute;
        +    top: 100%; }
        +    table.showcase.browser-demo.fixed {
        +      position: fixed;
        +      top: 0;
        +      bottom: 0;
        +      left: 0;
        +      right: 0;
        +      z-index: 1; }
        +      table.showcase.browser-demo.fixed .browser-demo-inner {
        +        -webkit-transition: width 2s ease-in-out, height 2s ease-in-out;
        +                transition: width 2s ease-in-out, height 2s ease-in-out; }
        +      table.showcase.browser-demo.fixed[data-section="what"] {
        +        box-shadow: 0 0 0 0; }
        +      table.showcase.browser-demo.fixed[data-section="why"] .browser-demo-inner {
        +        width: 70%; }
        +      table.showcase.browser-demo.fixed[data-section="outro"] .showcase-inner {
        +        pointer-events: all; }
        +    table.showcase.browser-demo .showcase-inner {
        +      pointer-events: none;
        +      position: absolute;
        +      left: 10%;
        +      right: 40%;
        +      top: 220px;
        +      bottom: 120px;
        +      margin: 0;
        +      padding: 0; }
        +      @media (max-width: 567px) {
        +        table.showcase.browser-demo .showcase-inner {
        +          bottom: 90px;
        +          top: 180px; } }
        +    table.showcase.browser-demo .browser-demo-inner {
        +      height: 100%;
        +      width: 100%; }
        +    table.showcase.browser-demo .section-copy {
        +      -webkit-transition: opacity 0.5s ease-in-out, top 0.5s ease-in-out;
        +              transition: opacity 0.5s ease-in-out, top 0.5s ease-in-out;
        +      opacity: 0;
        +      position: absolute;
        +      top: 0;
        +      position: absolute;
        +      height: 200px;
        +      color: #fff;
        +      text-align: center;
        +      width: 100%; }
        +      table.showcase.browser-demo .section-copy.active {
        +        opacity: 1;
        +        top: -150px; }
        +        @media (max-width: 567px) {
        +          table.showcase.browser-demo .section-copy.active {
        +            top: -130px; } }
        +      table.showcase.browser-demo .section-copy h2 {
        +        font-size: 40px;
        +        font-weight: bold;
        +        line-height: 1;
        +        margin: 25px 0 15px; }
        +        @media (max-width: 567px) {
        +          table.showcase.browser-demo .section-copy h2 {
        +            font-size: 30px; } }
        +    table.showcase.browser-demo .browser-window {
        +      border-radius: 4px;
        +      background: #fff;
        +      position: relative;
        +      height: 100%;
        +      width: 100%;
        +      max-width: 1200px;
        +      margin: 0 auto; }
        +      table.showcase.browser-demo .browser-window .browser-titlebar {
        +        position: absolute;
        +        top: 0;
        +        left: 0;
        +        right: 0;
        +        border-bottom: 1px solid #eee;
        +        height: 55px; }
        +        table.showcase.browser-demo .browser-window .browser-titlebar .browser-dots {
        +          padding: 16px; }
        +          table.showcase.browser-demo .browser-window .browser-titlebar .browser-dots b {
        +            display: inline-block;
        +            vertical-align: middle;
        +            *vertical-align: auto;
        +            *zoom: 1;
        +            *display: inline;
        +            border-radius: 50%;
        +            width: 10px;
        +            height: 10px;
        +            margin-right: 7px;
        +            background: rgba(0, 0, 0, 0.1); }
        +      table.showcase.browser-demo .browser-window .browser-frame {
        +        position: absolute;
        +        top: 55px;
        +        left: 0;
        +        right: 0;
        +        bottom: 0; }
        +        table.showcase.browser-demo .browser-window .browser-frame iframe {
        +          border-radius: 0 0 4px 4px;
        +          border: 0;
        +          width: 100%;
        +          height: 100%; }
        +  table.showcase.browser-demo-section .section-scroll-copy {
        +    position: relative;
        +    z-index: 10;
        +    color: #fff;
        +    width: 100%;
        +    font-size: 22px; }
        +    table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner {
        +      position: absolute;
        +      z-index: 10;
        +      color: #fff;
        +      right: 10%;
        +      width: 23%; }
        +      table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner a {
        +        color: inherit; }
        +      table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner .example-paragraph {
        +        border-radius: 4px;
        +        background: #000;
        +        padding: 1rem; }
        +
        +.browser-content {
        +  display: none; }
        diff --git a/bower_components/tether/docs/welcome/index.html b/bower_components/tether/docs/welcome/index.html
        new file mode 100644
        index 0000000000..d70d00d5e3
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/index.html
        @@ -0,0 +1,226 @@
        +<!doctype html>
        +<head>
        +    <meta charset="utf-8">
        +    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        +    <title>Tether – Marrying elements for life</title>
        +    <meta name="description" content="Tether is a JavaScript and CSS library. It is free and open source and was developed by HubSpot developers Adam Schwartz (@adamfschwartz) and Zack Bloom (@zackbloom).">
        +    <link rel="icon" href="http://static.hubspot.com/favicon.ico">
        +
        +    <script type="text/javascript" src="//use.typekit.net/ghy0wve.js"></script>
        +    <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
        +
        +    <!-- Tether themes -->
        +    <link rel="stylesheet" href="//github.hubspot.com/tether/dist/css/tether-theme-arrows-dark.css" />
        +
        +    <!-- Welcome docs styles -->
        +    <link rel="stylesheet" href="//github.hubspot.com/tether/docs/welcome/css/prism.css" />
        +    <link rel="stylesheet" href="//github.hubspot.com/tether/docs/welcome/css/welcome.css" />
        +
        +    <!-- OS icons -->
        +    <link rel="stylesheet" href="http://github.hubspot.com/os-icons/os-icons.css" />
        +</head>
        +<body>
        +    <div class="hero-wrap">
        +        <table class="showcase hero"><tr><td>
        +            <div class="showcase-inner">
        +                <div class="tether-target-demo">
        +                    <h1>Tether</h1>
        +                    <div class="mobile-copy">
        +                        <h2>Marrying elements for life</h2>
        +                        <p>
        +                            <a class="button" href="http://github.com/HubSpot/tether">★ On Github</a>
        +                        </p>
        +                    </div>
        +                </div>
        +            </div>
        +        </td></tr></table>
        +    </div>
        +
        +    <div class="browser-demo-start-point"></div>
        +
        +    <table class="showcase browser-demo"><tr><td>
        +        <div class="showcase-inner">
        +            <div class="section-copy" data-section="what">
        +                <h2>What is Tether?</h2>
        +            </div>
        +            <div class="section-copy" data-section="how">
        +                <h2>How Tether works.</h2>
        +            </div>
        +            <div class="section-copy" data-section="why">
        +                <h2>Tether is powerful.</h2>
        +            </div>
        +            <div class="section-copy" data-section="outro">
        +                <h2>Play with Tether</h2>
        +            </div>
        +            <div class="browser-demo-inner">
        +                <div class="browser-window">
        +                    <div class="browser-titlebar">
        +                        <div class="browser-dots"><b></b><b></b><b></b></div>
        +                    </div>
        +                    <div class="browser-frame">
        +                        <iframe src="browser-demo.html"></iframe>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </td></tr></table>
        +
        +    <table class="showcase browser-demo-section no-next-arrow" data-section="what"><tr><td>
        +        <div class="section-scroll-copy">
        +            <div class="section-scroll-copy-inner">
        +                <p>Tether is a low-level UI library that can be used to position any element on a page <i>next to any other element</i>.</p>
        +                <p>It can be used for dropdown menus, tooltips, popovers, tours, help information, scroll guides, autocompletes, etc. The possibilities are endless.</p>
        +                <p class="example-paragraph">In this example we're showing an action menu <em>tethered</em> to a list item.</p>
        +            </div>
        +        </div>
        +    </td></tr></table>
        +
        +    <table class="showcase browser-demo-section no-next-arrow" data-section="how"><tr><td>
        +        <div class="section-scroll-copy">
        +            <div class="section-scroll-copy-inner">
        +                <p>Tether works by creating an absolutely positioned element and meticulously tracking the movements of a <i>target</i> which you specify.</p>
        +                <p>The <i>target</i> and <i>element</i> can be tethered together in a variety of different ways.</p>
        +                <p class="example-paragraph">Notice how the <i>tethered element</i> stays tethered to its <i>target</i> list item even as the left pane is scrolled up and down.</p>
        +            </div>
        +        </div>
        +    </td></tr></table>
        +
        +    <table class="showcase browser-demo-section no-next-arrow" data-section="why"><tr><td>
        +        <div class="section-scroll-copy">
        +            <div class="section-scroll-copy-inner">
        +                <p>Tether can keep your element positioned properly even in some tough situations.</p>
        +                <p>Tether handles all of the common pain points:</p>
        +                <ul>
        +                    <li>Automatically detect collisions with the edge of the page or edge of the scrollParent</li>
        +                    <li>Automatically reposition on browser resize, scroll, and other events,</li>
        +                    <li>Constrain the position to any bounding box,</li>
        +                </ul>
        +                <p>...and a lot more.</p>
        +            </div>
        +        </div>
        +    </td></tr></table>
        +
        +    <table class="showcase browser-demo-section no-next-arrow" data-section="outro"><tr><td>
        +        <div class="section-scroll-copy">
        +            <div class="section-scroll-copy-inner">
        +                <p class="example-paragraph">Interact with this demo.</p>
        +                <p>&nbsp;</p>
        +                <p>To learn more, check out our <a href="/">documentation</a>.</p>
        +            </div>
        +        </div>
        +    </td></tr></table>
        +
        +    <table class="showcase browser-demo-section no-next-arrow" data-section="__empty"><tr><td></td></tr></table>
        +
        +    <div class="browser-demo-stop-point"></div>
        +
        +    <table class="showcase projects-showcase no-next-arrow"><tr><td>
        +        <div class="showcase-inner">
        +            <h1>Tether Family</h1>
        +            <h2>These projects are all powered by Tether's positioning engine.</h2>
        +            <div class="projects-list">
        +                <a href="//github.hubspot.com/drop/docs/welcome" class="project">
        +                    <h1>Drop</h1>
        +                    <span class="os-icon drop-icon"></span>
        +                    <p>Create dropdowns, popovers, and more.</p>
        +                </a>
        +                <a href="//github.hubspot.com/tooltip/docs/welcome" class="project">
        +                    <h1>Tooltip</h1>
        +                    <span class="os-icon tooltip-icon"></span>
        +                    <p>Stylable tooltips built on Tether.</p>
        +                </a>
        +                <a href="//github.hubspot.com/select/docs/welcome" class="project">
        +                    <h1>Select</h1>
        +                    <span class="os-icon select-icon"></span>
        +                    <p>Stylable select elements built on Tether.</p>
        +                </a>
        +                <a href="//github.hubspot.com/shepherd/docs/welcome" class="project">
        +                    <h1>Shepherd</h1>
        +                    <span class="os-icon shepherd-icon"></span>
        +                    <p>Guide your users through a tour of your app.</p>
        +                </a>
        +            </div>
        +        </div>
        +    </td></tr></table>
        +
        +    <table class="showcase last-showcase no-next-arrow share"><tr><td>
        +        <div class="showcase-inner">
        +            <h1>Share</h1>
        +            <h2>Help us spread the word.</h2>
        +            <!-- Share -->
        +            <style>
        +                .share-buttons {
        +                    margin: 4em auto;
        +                    text-align: center;
        +                }
        +                .share-button {
        +                    display: inline-block;
        +                }
        +                .retweet-button {
        +                    width: 100px;
        +                    margin-left: 20px;
        +                }
        +                .github-stars {
        +                    width: 100px;
        +                }
        +            </style>
        +            <div class="share-buttons">
        +                <div class="share-button retweet-button">
        +                    <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://github.hubspot.com/tether/docs/welcome" data-text="Tether.js - A positioning engine for JavaScript" data-count="horizontal" data-via="HubSpotDev">Tweet</a>
        +                    <script>
        +                        (function(){
        +                            var recommends, button;
        +
        +                            if (Math.random() >= 0.5) {
        +                                recommends = ['hubspotdev', 'zackbloom', 'adamfschwartz'];
        +                            } else {
        +                                recommends = ['hubspotdev', 'adamfschwartz', 'zackbloom'];
        +                            }
        +
        +                            button = document.querySelector('.twitter-share-button');
        +
        +                            if (button) {
        +                                button.setAttribute('data-related', recommends.join(','));
        +                            }
        +                        })();
        +                    </script>
        +                    <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
        +                </div>
        +                <div class="share-button github-stars-button">
        +                    <iframe src="http://ghbtns.com/github-btn.html?user=HubSpot&amp;repo=tether&amp;type=watch&amp;count=true&amp;size=small" allowtransparency="true" frameborder="0" scrolling="0" width="100" height="20"></iframe>
        +                </div>
        +            </p>
        +        </div>
        +    </td></tr></table>
        +
        +    <!-- Tether javascript -->
        +    <script src="//github.hubspot.com/tether/dist/js/tether.min.js"></script>
        +
        +    <!-- Welcome docs javascript -->
        +    <script src="//github.hubspot.com/tether/docs/welcome/js/log.js"></script>
        +    <script src="//github.hubspot.com/tether/docs/welcome/js/jquery.js"></script>
        +    <script src="//github.hubspot.com/tether/docs/welcome/js/drop.js"></script>
        +    <script src="//github.hubspot.com/tether/docs/welcome/js/welcome.js"></script>
        +
        +    <!-- HubSpot analytics -->
        +    <script type="text/javascript">
        +        (function(d,s,i,r) {
        +            if (d.getElementById(i)){return;}
        +            var n=d.createElement(s),e=d.getElementsByTagName(s)[0];
        +            n.id=i;n.src='//js.hubspot.com/analytics/'+(Math.ceil(new Date()/r)*r)+'/51294.js';
        +            e.parentNode.insertBefore(n, e);
        +        })(document,"script","hs-analytics",300000);
        +    </script>
        +
        +    <!-- Google analytics -->
        +    <script>
        +        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        +        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        +        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        +        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
        +
        +        ga('create', 'UA-45159009-1', 'auto');
        +        ga('send', 'pageview');
        +    </script>
        +</body>
        +</html>
        diff --git a/bower_components/tether/docs/welcome/js/drop.js b/bower_components/tether/docs/welcome/js/drop.js
        new file mode 100644
        index 0000000000..0058819408
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/js/drop.js
        @@ -0,0 +1,239 @@
        +(function() {
        +  var Evented, MIRROR_ATTACH, addClass, allDrops, clickEvent, createContext, extend, hasClass, removeClass, sortAttach, touchDevice, _ref,
        +    __hasProp = {}.hasOwnProperty,
        +    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
        +    __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
        +
        +  _ref = Tether.Utils, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, hasClass = _ref.hasClass, Evented = _ref.Evented;
        +
        +  touchDevice = 'ontouchstart' in document.documentElement;
        +
        +  clickEvent = touchDevice ? 'touchstart' : 'click';
        +
        +  sortAttach = function(str) {
        +    var first, second, _ref1, _ref2;
        +    _ref1 = str.split(' '), first = _ref1[0], second = _ref1[1];
        +    if (first === 'left' || first === 'right') {
        +      _ref2 = [second, first], first = _ref2[0], second = _ref2[1];
        +    }
        +    return [first, second].join(' ');
        +  };
        +
        +  MIRROR_ATTACH = {
        +    left: 'right',
        +    right: 'left',
        +    top: 'bottom',
        +    bottom: 'top',
        +    middle: 'middle',
        +    center: 'center'
        +  };
        +
        +  allDrops = {};
        +
        +  createContext = function(options) {
        +    var DropInstance, defaultOptions, drop, _name;
        +    if (options == null) {
        +      options = {};
        +    }
        +    drop = function() {
        +      return (function(func, args, ctor) {
        +        ctor.prototype = func.prototype;
        +        var child = new ctor, result = func.apply(child, args);
        +        return Object(result) === result ? result : child;
        +      })(DropInstance, arguments, function(){});
        +    };
        +    extend(drop, {
        +      createContext: createContext,
        +      drops: [],
        +      defaults: {}
        +    });
        +    defaultOptions = {
        +      classPrefix: 'drop',
        +      defaults: {
        +        attach: 'bottom left',
        +        openOn: 'click',
        +        constrainToScrollParent: true,
        +        constrainToWindow: true,
        +        classes: '',
        +        tetherOptions: {}
        +      }
        +    };
        +    extend(drop, defaultOptions, options);
        +    extend(drop.defaults, defaultOptions.defaults, options.defaults);
        +    if (allDrops[_name = drop.classPrefix] == null) {
        +      allDrops[_name] = [];
        +    }
        +    drop.updateBodyClasses = function() {
        +      var anyOpen, _drop, _i, _len, _ref1;
        +      anyOpen = false;
        +      _ref1 = allDrops[drop.classPrefix];
        +      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
        +        _drop = _ref1[_i];
        +        if (!(_drop.isOpened())) {
        +          continue;
        +        }
        +        anyOpen = true;
        +        break;
        +      }
        +      if (anyOpen) {
        +        return addClass(document.body, "" + drop.classPrefix + "-open");
        +      } else {
        +        return removeClass(document.body, "" + drop.classPrefix + "-open");
        +      }
        +    };
        +    DropInstance = (function(_super) {
        +      __extends(DropInstance, _super);
        +
        +      function DropInstance(options) {
        +        this.options = options;
        +        this.options = extend({}, drop.defaults, this.options);
        +        this.target = this.options.target;
        +        if (this.target == null) {
        +          throw new Error('Drop Error: You must provide a target.');
        +        }
        +        drop.drops.push(this);
        +        allDrops[drop.classPrefix].push(this);
        +        this.setupElements();
        +        this.setupEvents();
        +        this.setupTether();
        +      }
        +
        +      DropInstance.prototype.setupElements = function() {
        +        this.drop = document.createElement('div');
        +        addClass(this.drop, drop.classPrefix);
        +        if (this.options.classes) {
        +          addClass(this.drop, this.options.classes);
        +        }
        +        this.dropContent = document.createElement('div');
        +        addClass(this.dropContent, "" + drop.classPrefix + "-content");
        +        if (typeof this.options.content === 'object') {
        +          this.dropContent.appendChild(this.options.content);
        +        } else {
        +          this.dropContent.innerHTML = this.options.content;
        +        }
        +        return this.drop.appendChild(this.dropContent);
        +      };
        +
        +      DropInstance.prototype.setupTether = function() {
        +        var constraints, dropAttach;
        +        dropAttach = this.options.position.split(' ');
        +        dropAttach[0] = MIRROR_ATTACH[dropAttach[0]];
        +        dropAttach = dropAttach.join(' ');
        +        constraints = [];
        +        if (this.options.constrainToScrollParent) {
        +          constraints.push({
        +            to: 'scrollParent',
        +            pin: 'top, bottom',
        +            attachment: 'together none'
        +          });
        +        }
        +        if (this.options.constrainToWindow !== false) {
        +          constraints.push({
        +            to: 'window',
        +            pin: true,
        +            attachment: 'together'
        +          });
        +        }
        +        constraints.push({
        +          to: 'scrollParent'
        +        });
        +        options = {
        +          element: this.drop,
        +          target: this.target,
        +          attachment: sortAttach(dropAttach),
        +          targetAttachment: sortAttach(this.options.position),
        +          classPrefix: drop.classPrefix,
        +          offset: '0 0',
        +          targetOffset: '0 0',
        +          enabled: false,
        +          constraints: constraints
        +        };
        +        if (this.options.tether !== false) {
        +          return this.tether = new Tether(extend({}, options, this.options.tether));
        +        }
        +      };
        +
        +      DropInstance.prototype.setupEvents = function() {
        +        var events,
        +          _this = this;
        +        if (!this.options.openOn) {
        +          return;
        +        }
        +        events = this.options.openOn.split(' ');
        +        if (__indexOf.call(events, 'click') >= 0) {
        +          this.target.addEventListener(clickEvent, function() {
        +            return _this.toggle();
        +          });
        +          document.addEventListener(clickEvent, function(event) {
        +            if (!_this.isOpened()) {
        +              return;
        +            }
        +            if (event.target === _this.drop || _this.drop.contains(event.target)) {
        +              return;
        +            }
        +            if (event.target === _this.target || _this.target.contains(event.target)) {
        +              return;
        +            }
        +            return _this.close();
        +          });
        +        }
        +        if (__indexOf.call(events, 'hover') >= 0) {
        +          this.target.addEventListener('mouseover', function() {
        +            return _this.open();
        +          });
        +          return this.target.addEventListener('mouseout', function() {
        +            return _this.close();
        +          });
        +        }
        +      };
        +
        +      DropInstance.prototype.isOpened = function() {
        +        return hasClass(this.drop, "" + drop.classPrefix + "-open");
        +      };
        +
        +      DropInstance.prototype.toggle = function() {
        +        if (this.isOpened()) {
        +          return this.close();
        +        } else {
        +          return this.open();
        +        }
        +      };
        +
        +      DropInstance.prototype.open = function() {
        +        var _ref1;
        +        if (!this.drop.parentNode) {
        +          document.body.appendChild(this.drop);
        +        }
        +        addClass(this.target, "" + drop.classPrefix + "-open");
        +        addClass(this.drop, "" + drop.classPrefix + "-open");
        +        if ((_ref1 = this.tether) != null) {
        +          _ref1.enable();
        +        }
        +        this.trigger('open');
        +        return drop.updateBodyClasses();
        +      };
        +
        +      DropInstance.prototype.close = function() {
        +        var _ref1;
        +        removeClass(this.target, "" + drop.classPrefix + "-open");
        +        removeClass(this.drop, "" + drop.classPrefix + "-open");
        +        this.trigger('close');
        +        if ((_ref1 = this.tether) != null) {
        +          _ref1.disable();
        +        }
        +        return drop.updateBodyClasses();
        +      };
        +
        +      return DropInstance;
        +
        +    })(Evented);
        +    return drop;
        +  };
        +
        +  window.Drop = createContext();
        +
        +  document.addEventListener('DOMContentLoaded', function() {
        +    return Drop.updateBodyClasses();
        +  });
        +
        +}).call(this);
        \ No newline at end of file
        diff --git a/bower_components/tether/docs/welcome/js/jquery.js b/bower_components/tether/docs/welcome/js/jquery.js
        new file mode 100644
        index 0000000000..dfdf619cc7
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/js/jquery.js
        @@ -0,0 +1,9597 @@
        +/*!
        + * jQuery JavaScript Library v1.9.1
        + * http://jquery.com/
        + *
        + * Includes Sizzle.js
        + * http://sizzlejs.com/
        + *
        + * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + *
        + * Date: 2013-2-4
        + */
        +(function( window, undefined ) {
        +
        +// Can't do this because several apps including ASP.NET trace
        +// the stack via arguments.caller.callee and Firefox dies if
        +// you try to trace through "use strict" call chains. (#13335)
        +// Support: Firefox 18+
        +//"use strict";
        +var
        +    // The deferred used on DOM ready
        +    readyList,
        +
        +    // A central reference to the root jQuery(document)
        +    rootjQuery,
        +
        +    // Support: IE<9
        +    // For `typeof node.method` instead of `node.method !== undefined`
        +    core_strundefined = typeof undefined,
        +
        +    // Use the correct document accordingly with window argument (sandbox)
        +    document = window.document,
        +    location = window.location,
        +
        +    // Map over jQuery in case of overwrite
        +    _jQuery = window.jQuery,
        +
        +    // Map over the $ in case of overwrite
        +    _$ = window.$,
        +
        +    // [[Class]] -> type pairs
        +    class2type = {},
        +
        +    // List of deleted data cache ids, so we can reuse them
        +    core_deletedIds = [],
        +
        +    core_version = "1.9.1",
        +
        +    // Save a reference to some core methods
        +    core_concat = core_deletedIds.concat,
        +    core_push = core_deletedIds.push,
        +    core_slice = core_deletedIds.slice,
        +    core_indexOf = core_deletedIds.indexOf,
        +    core_toString = class2type.toString,
        +    core_hasOwn = class2type.hasOwnProperty,
        +    core_trim = core_version.trim,
        +
        +    // Define a local copy of jQuery
        +    jQuery = function( selector, context ) {
        +        // The jQuery object is actually just the init constructor 'enhanced'
        +        return new jQuery.fn.init( selector, context, rootjQuery );
        +    },
        +
        +    // Used for matching numbers
        +    core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
        +
        +    // Used for splitting on whitespace
        +    core_rnotwhite = /\S+/g,
        +
        +    // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
        +    rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
        +
        +    // A simple way to check for HTML strings
        +    // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        +    // Strict HTML recognition (#11290: must start with <)
        +    rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
        +
        +    // Match a standalone tag
        +    rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
        +
        +    // JSON RegExp
        +    rvalidchars = /^[\],:{}\s]*$/,
        +    rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
        +    rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
        +    rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
        +
        +    // Matches dashed string for camelizing
        +    rmsPrefix = /^-ms-/,
        +    rdashAlpha = /-([\da-z])/gi,
        +
        +    // Used by jQuery.camelCase as callback to replace()
        +    fcamelCase = function( all, letter ) {
        +        return letter.toUpperCase();
        +    },
        +
        +    // The ready event handler
        +    completed = function( event ) {
        +
        +        // readyState === "complete" is good enough for us to call the dom ready in oldIE
        +        if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
        +            detach();
        +            jQuery.ready();
        +        }
        +    },
        +    // Clean-up method for dom ready events
        +    detach = function() {
        +        if ( document.addEventListener ) {
        +            document.removeEventListener( "DOMContentLoaded", completed, false );
        +            window.removeEventListener( "load", completed, false );
        +
        +        } else {
        +            document.detachEvent( "onreadystatechange", completed );
        +            window.detachEvent( "onload", completed );
        +        }
        +    };
        +
        +jQuery.fn = jQuery.prototype = {
        +    // The current version of jQuery being used
        +    jquery: core_version,
        +
        +    constructor: jQuery,
        +    init: function( selector, context, rootjQuery ) {
        +        var match, elem;
        +
        +        // HANDLE: $(""), $(null), $(undefined), $(false)
        +        if ( !selector ) {
        +            return this;
        +        }
        +
        +        // Handle HTML strings
        +        if ( typeof selector === "string" ) {
        +            if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
        +                // Assume that strings that start and end with <> are HTML and skip the regex check
        +                match = [ null, selector, null ];
        +
        +            } else {
        +                match = rquickExpr.exec( selector );
        +            }
        +
        +            // Match html or make sure no context is specified for #id
        +            if ( match && (match[1] || !context) ) {
        +
        +                // HANDLE: $(html) -> $(array)
        +                if ( match[1] ) {
        +                    context = context instanceof jQuery ? context[0] : context;
        +
        +                    // scripts is true for back-compat
        +                    jQuery.merge( this, jQuery.parseHTML(
        +                        match[1],
        +                        context && context.nodeType ? context.ownerDocument || context : document,
        +                        true
        +                    ) );
        +
        +                    // HANDLE: $(html, props)
        +                    if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
        +                        for ( match in context ) {
        +                            // Properties of context are called as methods if possible
        +                            if ( jQuery.isFunction( this[ match ] ) ) {
        +                                this[ match ]( context[ match ] );
        +
        +                            // ...and otherwise set as attributes
        +                            } else {
        +                                this.attr( match, context[ match ] );
        +                            }
        +                        }
        +                    }
        +
        +                    return this;
        +
        +                // HANDLE: $(#id)
        +                } else {
        +                    elem = document.getElementById( match[2] );
        +
        +                    // Check parentNode to catch when Blackberry 4.6 returns
        +                    // nodes that are no longer in the document #6963
        +                    if ( elem && elem.parentNode ) {
        +                        // Handle the case where IE and Opera return items
        +                        // by name instead of ID
        +                        if ( elem.id !== match[2] ) {
        +                            return rootjQuery.find( selector );
        +                        }
        +
        +                        // Otherwise, we inject the element directly into the jQuery object
        +                        this.length = 1;
        +                        this[0] = elem;
        +                    }
        +
        +                    this.context = document;
        +                    this.selector = selector;
        +                    return this;
        +                }
        +
        +            // HANDLE: $(expr, $(...))
        +            } else if ( !context || context.jquery ) {
        +                return ( context || rootjQuery ).find( selector );
        +
        +            // HANDLE: $(expr, context)
        +            // (which is just equivalent to: $(context).find(expr)
        +            } else {
        +                return this.constructor( context ).find( selector );
        +            }
        +
        +        // HANDLE: $(DOMElement)
        +        } else if ( selector.nodeType ) {
        +            this.context = this[0] = selector;
        +            this.length = 1;
        +            return this;
        +
        +        // HANDLE: $(function)
        +        // Shortcut for document ready
        +        } else if ( jQuery.isFunction( selector ) ) {
        +            return rootjQuery.ready( selector );
        +        }
        +
        +        if ( selector.selector !== undefined ) {
        +            this.selector = selector.selector;
        +            this.context = selector.context;
        +        }
        +
        +        return jQuery.makeArray( selector, this );
        +    },
        +
        +    // Start with an empty selector
        +    selector: "",
        +
        +    // The default length of a jQuery object is 0
        +    length: 0,
        +
        +    // The number of elements contained in the matched element set
        +    size: function() {
        +        return this.length;
        +    },
        +
        +    toArray: function() {
        +        return core_slice.call( this );
        +    },
        +
        +    // Get the Nth element in the matched element set OR
        +    // Get the whole matched element set as a clean array
        +    get: function( num ) {
        +        return num == null ?
        +
        +            // Return a 'clean' array
        +            this.toArray() :
        +
        +            // Return just the object
        +            ( num < 0 ? this[ this.length + num ] : this[ num ] );
        +    },
        +
        +    // Take an array of elements and push it onto the stack
        +    // (returning the new matched element set)
        +    pushStack: function( elems ) {
        +
        +        // Build a new jQuery matched element set
        +        var ret = jQuery.merge( this.constructor(), elems );
        +
        +        // Add the old object onto the stack (as a reference)
        +        ret.prevObject = this;
        +        ret.context = this.context;
        +
        +        // Return the newly-formed element set
        +        return ret;
        +    },
        +
        +    // Execute a callback for every element in the matched set.
        +    // (You can seed the arguments with an array of args, but this is
        +    // only used internally.)
        +    each: function( callback, args ) {
        +        return jQuery.each( this, callback, args );
        +    },
        +
        +    ready: function( fn ) {
        +        // Add the callback
        +        jQuery.ready.promise().done( fn );
        +
        +        return this;
        +    },
        +
        +    slice: function() {
        +        return this.pushStack( core_slice.apply( this, arguments ) );
        +    },
        +
        +    first: function() {
        +        return this.eq( 0 );
        +    },
        +
        +    last: function() {
        +        return this.eq( -1 );
        +    },
        +
        +    eq: function( i ) {
        +        var len = this.length,
        +            j = +i + ( i < 0 ? len : 0 );
        +        return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
        +    },
        +
        +    map: function( callback ) {
        +        return this.pushStack( jQuery.map(this, function( elem, i ) {
        +            return callback.call( elem, i, elem );
        +        }));
        +    },
        +
        +    end: function() {
        +        return this.prevObject || this.constructor(null);
        +    },
        +
        +    // For internal use only.
        +    // Behaves like an Array's method, not like a jQuery method.
        +    push: core_push,
        +    sort: [].sort,
        +    splice: [].splice
        +};
        +
        +// Give the init function the jQuery prototype for later instantiation
        +jQuery.fn.init.prototype = jQuery.fn;
        +
        +jQuery.extend = jQuery.fn.extend = function() {
        +    var src, copyIsArray, copy, name, options, clone,
        +        target = arguments[0] || {},
        +        i = 1,
        +        length = arguments.length,
        +        deep = false;
        +
        +    // Handle a deep copy situation
        +    if ( typeof target === "boolean" ) {
        +        deep = target;
        +        target = arguments[1] || {};
        +        // skip the boolean and the target
        +        i = 2;
        +    }
        +
        +    // Handle case when target is a string or something (possible in deep copy)
        +    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
        +        target = {};
        +    }
        +
        +    // extend jQuery itself if only one argument is passed
        +    if ( length === i ) {
        +        target = this;
        +        --i;
        +    }
        +
        +    for ( ; i < length; i++ ) {
        +        // Only deal with non-null/undefined values
        +        if ( (options = arguments[ i ]) != null ) {
        +            // Extend the base object
        +            for ( name in options ) {
        +                src = target[ name ];
        +                copy = options[ name ];
        +
        +                // Prevent never-ending loop
        +                if ( target === copy ) {
        +                    continue;
        +                }
        +
        +                // Recurse if we're merging plain objects or arrays
        +                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
        +                    if ( copyIsArray ) {
        +                        copyIsArray = false;
        +                        clone = src && jQuery.isArray(src) ? src : [];
        +
        +                    } else {
        +                        clone = src && jQuery.isPlainObject(src) ? src : {};
        +                    }
        +
        +                    // Never move original objects, clone them
        +                    target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +                // Don't bring in undefined values
        +                } else if ( copy !== undefined ) {
        +                    target[ name ] = copy;
        +                }
        +            }
        +        }
        +    }
        +
        +    // Return the modified object
        +    return target;
        +};
        +
        +jQuery.extend({
        +    noConflict: function( deep ) {
        +        if ( window.$ === jQuery ) {
        +            window.$ = _$;
        +        }
        +
        +        if ( deep && window.jQuery === jQuery ) {
        +            window.jQuery = _jQuery;
        +        }
        +
        +        return jQuery;
        +    },
        +
        +    // Is the DOM ready to be used? Set to true once it occurs.
        +    isReady: false,
        +
        +    // A counter to track how many items to wait for before
        +    // the ready event fires. See #6781
        +    readyWait: 1,
        +
        +    // Hold (or release) the ready event
        +    holdReady: function( hold ) {
        +        if ( hold ) {
        +            jQuery.readyWait++;
        +        } else {
        +            jQuery.ready( true );
        +        }
        +    },
        +
        +    // Handle when the DOM is ready
        +    ready: function( wait ) {
        +
        +        // Abort if there are pending holds or we're already ready
        +        if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
        +            return;
        +        }
        +
        +        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
        +        if ( !document.body ) {
        +            return setTimeout( jQuery.ready );
        +        }
        +
        +        // Remember that the DOM is ready
        +        jQuery.isReady = true;
        +
        +        // If a normal DOM Ready event fired, decrement, and wait if need be
        +        if ( wait !== true && --jQuery.readyWait > 0 ) {
        +            return;
        +        }
        +
        +        // If there are functions bound, to execute
        +        readyList.resolveWith( document, [ jQuery ] );
        +
        +        // Trigger any bound ready events
        +        if ( jQuery.fn.trigger ) {
        +            jQuery( document ).trigger("ready").off("ready");
        +        }
        +    },
        +
        +    // See test/unit/core.js for details concerning isFunction.
        +    // Since version 1.3, DOM methods and functions like alert
        +    // aren't supported. They return false on IE (#2968).
        +    isFunction: function( obj ) {
        +        return jQuery.type(obj) === "function";
        +    },
        +
        +    isArray: Array.isArray || function( obj ) {
        +        return jQuery.type(obj) === "array";
        +    },
        +
        +    isWindow: function( obj ) {
        +        return obj != null && obj == obj.window;
        +    },
        +
        +    isNumeric: function( obj ) {
        +        return !isNaN( parseFloat(obj) ) && isFinite( obj );
        +    },
        +
        +    type: function( obj ) {
        +        if ( obj == null ) {
        +            return String( obj );
        +        }
        +        return typeof obj === "object" || typeof obj === "function" ?
        +            class2type[ core_toString.call(obj) ] || "object" :
        +            typeof obj;
        +    },
        +
        +    isPlainObject: function( obj ) {
        +        // Must be an Object.
        +        // Because of IE, we also have to check the presence of the constructor property.
        +        // Make sure that DOM nodes and window objects don't pass through, as well
        +        if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
        +            return false;
        +        }
        +
        +        try {
        +            // Not own constructor property must be Object
        +            if ( obj.constructor &&
        +                !core_hasOwn.call(obj, "constructor") &&
        +                !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
        +                return false;
        +            }
        +        } catch ( e ) {
        +            // IE8,9 Will throw exceptions on certain host objects #9897
        +            return false;
        +        }
        +
        +        // Own properties are enumerated firstly, so to speed up,
        +        // if last one is own, then all properties are own.
        +
        +        var key;
        +        for ( key in obj ) {}
        +
        +        return key === undefined || core_hasOwn.call( obj, key );
        +    },
        +
        +    isEmptyObject: function( obj ) {
        +        var name;
        +        for ( name in obj ) {
        +            return false;
        +        }
        +        return true;
        +    },
        +
        +    error: function( msg ) {
        +        throw new Error( msg );
        +    },
        +
        +    // data: string of html
        +    // context (optional): If specified, the fragment will be created in this context, defaults to document
        +    // keepScripts (optional): If true, will include scripts passed in the html string
        +    parseHTML: function( data, context, keepScripts ) {
        +        if ( !data || typeof data !== "string" ) {
        +            return null;
        +        }
        +        if ( typeof context === "boolean" ) {
        +            keepScripts = context;
        +            context = false;
        +        }
        +        context = context || document;
        +
        +        var parsed = rsingleTag.exec( data ),
        +            scripts = !keepScripts && [];
        +
        +        // Single tag
        +        if ( parsed ) {
        +            return [ context.createElement( parsed[1] ) ];
        +        }
        +
        +        parsed = jQuery.buildFragment( [ data ], context, scripts );
        +        if ( scripts ) {
        +            jQuery( scripts ).remove();
        +        }
        +        return jQuery.merge( [], parsed.childNodes );
        +    },
        +
        +    parseJSON: function( data ) {
        +        // Attempt to parse using the native JSON parser first
        +        if ( window.JSON && window.JSON.parse ) {
        +            return window.JSON.parse( data );
        +        }
        +
        +        if ( data === null ) {
        +            return data;
        +        }
        +
        +        if ( typeof data === "string" ) {
        +
        +            // Make sure leading/trailing whitespace is removed (IE can't handle it)
        +            data = jQuery.trim( data );
        +
        +            if ( data ) {
        +                // Make sure the incoming data is actual JSON
        +                // Logic borrowed from http://json.org/json2.js
        +                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        +                    .replace( rvalidtokens, "]" )
        +                    .replace( rvalidbraces, "")) ) {
        +
        +                    return ( new Function( "return " + data ) )();
        +                }
        +            }
        +        }
        +
        +        jQuery.error( "Invalid JSON: " + data );
        +    },
        +
        +    // Cross-browser xml parsing
        +    parseXML: function( data ) {
        +        var xml, tmp;
        +        if ( !data || typeof data !== "string" ) {
        +            return null;
        +        }
        +        try {
        +            if ( window.DOMParser ) { // Standard
        +                tmp = new DOMParser();
        +                xml = tmp.parseFromString( data , "text/xml" );
        +            } else { // IE
        +                xml = new ActiveXObject( "Microsoft.XMLDOM" );
        +                xml.async = "false";
        +                xml.loadXML( data );
        +            }
        +        } catch( e ) {
        +            xml = undefined;
        +        }
        +        if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
        +            jQuery.error( "Invalid XML: " + data );
        +        }
        +        return xml;
        +    },
        +
        +    noop: function() {},
        +
        +    // Evaluates a script in a global context
        +    // Workarounds based on findings by Jim Driscoll
        +    // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
        +    globalEval: function( data ) {
        +        if ( data && jQuery.trim( data ) ) {
        +            // We use execScript on Internet Explorer
        +            // We use an anonymous function so that context is window
        +            // rather than jQuery in Firefox
        +            ( window.execScript || function( data ) {
        +                window[ "eval" ].call( window, data );
        +            } )( data );
        +        }
        +    },
        +
        +    // Convert dashed to camelCase; used by the css and data modules
        +    // Microsoft forgot to hump their vendor prefix (#9572)
        +    camelCase: function( string ) {
        +        return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +    },
        +
        +    nodeName: function( elem, name ) {
        +        return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        +    },
        +
        +    // args is for internal usage only
        +    each: function( obj, callback, args ) {
        +        var value,
        +            i = 0,
        +            length = obj.length,
        +            isArray = isArraylike( obj );
        +
        +        if ( args ) {
        +            if ( isArray ) {
        +                for ( ; i < length; i++ ) {
        +                    value = callback.apply( obj[ i ], args );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            } else {
        +                for ( i in obj ) {
        +                    value = callback.apply( obj[ i ], args );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            }
        +
        +        // A special, fast, case for the most common use of each
        +        } else {
        +            if ( isArray ) {
        +                for ( ; i < length; i++ ) {
        +                    value = callback.call( obj[ i ], i, obj[ i ] );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            } else {
        +                for ( i in obj ) {
        +                    value = callback.call( obj[ i ], i, obj[ i ] );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            }
        +        }
        +
        +        return obj;
        +    },
        +
        +    // Use native String.trim function wherever possible
        +    trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
        +        function( text ) {
        +            return text == null ?
        +                "" :
        +                core_trim.call( text );
        +        } :
        +
        +        // Otherwise use our own trimming functionality
        +        function( text ) {
        +            return text == null ?
        +                "" :
        +                ( text + "" ).replace( rtrim, "" );
        +        },
        +
        +    // results is for internal usage only
        +    makeArray: function( arr, results ) {
        +        var ret = results || [];
        +
        +        if ( arr != null ) {
        +            if ( isArraylike( Object(arr) ) ) {
        +                jQuery.merge( ret,
        +                    typeof arr === "string" ?
        +                    [ arr ] : arr
        +                );
        +            } else {
        +                core_push.call( ret, arr );
        +            }
        +        }
        +
        +        return ret;
        +    },
        +
        +    inArray: function( elem, arr, i ) {
        +        var len;
        +
        +        if ( arr ) {
        +            if ( core_indexOf ) {
        +                return core_indexOf.call( arr, elem, i );
        +            }
        +
        +            len = arr.length;
        +            i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
        +
        +            for ( ; i < len; i++ ) {
        +                // Skip accessing in sparse arrays
        +                if ( i in arr && arr[ i ] === elem ) {
        +                    return i;
        +                }
        +            }
        +        }
        +
        +        return -1;
        +    },
        +
        +    merge: function( first, second ) {
        +        var l = second.length,
        +            i = first.length,
        +            j = 0;
        +
        +        if ( typeof l === "number" ) {
        +            for ( ; j < l; j++ ) {
        +                first[ i++ ] = second[ j ];
        +            }
        +        } else {
        +            while ( second[j] !== undefined ) {
        +                first[ i++ ] = second[ j++ ];
        +            }
        +        }
        +
        +        first.length = i;
        +
        +        return first;
        +    },
        +
        +    grep: function( elems, callback, inv ) {
        +        var retVal,
        +            ret = [],
        +            i = 0,
        +            length = elems.length;
        +        inv = !!inv;
        +
        +        // Go through the array, only saving the items
        +        // that pass the validator function
        +        for ( ; i < length; i++ ) {
        +            retVal = !!callback( elems[ i ], i );
        +            if ( inv !== retVal ) {
        +                ret.push( elems[ i ] );
        +            }
        +        }
        +
        +        return ret;
        +    },
        +
        +    // arg is for internal usage only
        +    map: function( elems, callback, arg ) {
        +        var value,
        +            i = 0,
        +            length = elems.length,
        +            isArray = isArraylike( elems ),
        +            ret = [];
        +
        +        // Go through the array, translating each of the items to their
        +        if ( isArray ) {
        +            for ( ; i < length; i++ ) {
        +                value = callback( elems[ i ], i, arg );
        +
        +                if ( value != null ) {
        +                    ret[ ret.length ] = value;
        +                }
        +            }
        +
        +        // Go through every key on the object,
        +        } else {
        +            for ( i in elems ) {
        +                value = callback( elems[ i ], i, arg );
        +
        +                if ( value != null ) {
        +                    ret[ ret.length ] = value;
        +                }
        +            }
        +        }
        +
        +        // Flatten any nested arrays
        +        return core_concat.apply( [], ret );
        +    },
        +
        +    // A global GUID counter for objects
        +    guid: 1,
        +
        +    // Bind a function to a context, optionally partially applying any
        +    // arguments.
        +    proxy: function( fn, context ) {
        +        var args, proxy, tmp;
        +
        +        if ( typeof context === "string" ) {
        +            tmp = fn[ context ];
        +            context = fn;
        +            fn = tmp;
        +        }
        +
        +        // Quick check to determine if target is callable, in the spec
        +        // this throws a TypeError, but we will just return undefined.
        +        if ( !jQuery.isFunction( fn ) ) {
        +            return undefined;
        +        }
        +
        +        // Simulated bind
        +        args = core_slice.call( arguments, 2 );
        +        proxy = function() {
        +            return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
        +        };
        +
        +        // Set the guid of unique handler to the same of original handler, so it can be removed
        +        proxy.guid = fn.guid = fn.guid || jQuery.guid++;
        +
        +        return proxy;
        +    },
        +
        +    // Multifunctional method to get and set values of a collection
        +    // The value/s can optionally be executed if it's a function
        +    access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
        +        var i = 0,
        +            length = elems.length,
        +            bulk = key == null;
        +
        +        // Sets many values
        +        if ( jQuery.type( key ) === "object" ) {
        +            chainable = true;
        +            for ( i in key ) {
        +                jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
        +            }
        +
        +        // Sets one value
        +        } else if ( value !== undefined ) {
        +            chainable = true;
        +
        +            if ( !jQuery.isFunction( value ) ) {
        +                raw = true;
        +            }
        +
        +            if ( bulk ) {
        +                // Bulk operations run against the entire set
        +                if ( raw ) {
        +                    fn.call( elems, value );
        +                    fn = null;
        +
        +                // ...except when executing function values
        +                } else {
        +                    bulk = fn;
        +                    fn = function( elem, key, value ) {
        +                        return bulk.call( jQuery( elem ), value );
        +                    };
        +                }
        +            }
        +
        +            if ( fn ) {
        +                for ( ; i < length; i++ ) {
        +                    fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
        +                }
        +            }
        +        }
        +
        +        return chainable ?
        +            elems :
        +
        +            // Gets
        +            bulk ?
        +                fn.call( elems ) :
        +                length ? fn( elems[0], key ) : emptyGet;
        +    },
        +
        +    now: function() {
        +        return ( new Date() ).getTime();
        +    }
        +});
        +
        +jQuery.ready.promise = function( obj ) {
        +    if ( !readyList ) {
        +
        +        readyList = jQuery.Deferred();
        +
        +        // Catch cases where $(document).ready() is called after the browser event has already occurred.
        +        // we once tried to use readyState "interactive" here, but it caused issues like the one
        +        // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
        +        if ( document.readyState === "complete" ) {
        +            // Handle it asynchronously to allow scripts the opportunity to delay ready
        +            setTimeout( jQuery.ready );
        +
        +        // Standards-based browsers support DOMContentLoaded
        +        } else if ( document.addEventListener ) {
        +            // Use the handy event callback
        +            document.addEventListener( "DOMContentLoaded", completed, false );
        +
        +            // A fallback to window.onload, that will always work
        +            window.addEventListener( "load", completed, false );
        +
        +        // If IE event model is used
        +        } else {
        +            // Ensure firing before onload, maybe late but safe also for iframes
        +            document.attachEvent( "onreadystatechange", completed );
        +
        +            // A fallback to window.onload, that will always work
        +            window.attachEvent( "onload", completed );
        +
        +            // If IE and not a frame
        +            // continually check to see if the document is ready
        +            var top = false;
        +
        +            try {
        +                top = window.frameElement == null && document.documentElement;
        +            } catch(e) {}
        +
        +            if ( top && top.doScroll ) {
        +                (function doScrollCheck() {
        +                    if ( !jQuery.isReady ) {
        +
        +                        try {
        +                            // Use the trick by Diego Perini
        +                            // http://javascript.nwbox.com/IEContentLoaded/
        +                            top.doScroll("left");
        +                        } catch(e) {
        +                            return setTimeout( doScrollCheck, 50 );
        +                        }
        +
        +                        // detach all dom ready events
        +                        detach();
        +
        +                        // and execute any waiting functions
        +                        jQuery.ready();
        +                    }
        +                })();
        +            }
        +        }
        +    }
        +    return readyList.promise( obj );
        +};
        +
        +// Populate the class2type map
        +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
        +    class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +});
        +
        +function isArraylike( obj ) {
        +    var length = obj.length,
        +        type = jQuery.type( obj );
        +
        +    if ( jQuery.isWindow( obj ) ) {
        +        return false;
        +    }
        +
        +    if ( obj.nodeType === 1 && length ) {
        +        return true;
        +    }
        +
        +    return type === "array" || type !== "function" &&
        +        ( length === 0 ||
        +        typeof length === "number" && length > 0 && ( length - 1 ) in obj );
        +}
        +
        +// All jQuery objects should point back to these
        +rootjQuery = jQuery(document);
        +// String to Object options format cache
        +var optionsCache = {};
        +
        +// Convert String-formatted options into Object-formatted ones and store in cache
        +function createOptions( options ) {
        +    var object = optionsCache[ options ] = {};
        +    jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
        +        object[ flag ] = true;
        +    });
        +    return object;
        +}
        +
        +/*
        + * Create a callback list using the following parameters:
        + *
        + *  options: an optional list of space-separated options that will change how
        + *          the callback list behaves or a more traditional option object
        + *
        + * By default a callback list will act like an event callback list and can be
        + * "fired" multiple times.
        + *
        + * Possible options:
        + *
        + *  once:           will ensure the callback list can only be fired once (like a Deferred)
        + *
        + *  memory:         will keep track of previous values and will call any callback added
        + *                  after the list has been fired right away with the latest "memorized"
        + *                  values (like a Deferred)
        + *
        + *  unique:         will ensure a callback can only be added once (no duplicate in the list)
        + *
        + *  stopOnFalse:    interrupt callings when a callback returns false
        + *
        + */
        +jQuery.Callbacks = function( options ) {
        +
        +    // Convert options from String-formatted to Object-formatted if needed
        +    // (we check in cache first)
        +    options = typeof options === "string" ?
        +        ( optionsCache[ options ] || createOptions( options ) ) :
        +        jQuery.extend( {}, options );
        +
        +    var // Flag to know if list is currently firing
        +        firing,
        +        // Last fire value (for non-forgettable lists)
        +        memory,
        +        // Flag to know if list was already fired
        +        fired,
        +        // End of the loop when firing
        +        firingLength,
        +        // Index of currently firing callback (modified by remove if needed)
        +        firingIndex,
        +        // First callback to fire (used internally by add and fireWith)
        +        firingStart,
        +        // Actual callback list
        +        list = [],
        +        // Stack of fire calls for repeatable lists
        +        stack = !options.once && [],
        +        // Fire callbacks
        +        fire = function( data ) {
        +            memory = options.memory && data;
        +            fired = true;
        +            firingIndex = firingStart || 0;
        +            firingStart = 0;
        +            firingLength = list.length;
        +            firing = true;
        +            for ( ; list && firingIndex < firingLength; firingIndex++ ) {
        +                if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
        +                    memory = false; // To prevent further calls using add
        +                    break;
        +                }
        +            }
        +            firing = false;
        +            if ( list ) {
        +                if ( stack ) {
        +                    if ( stack.length ) {
        +                        fire( stack.shift() );
        +                    }
        +                } else if ( memory ) {
        +                    list = [];
        +                } else {
        +                    self.disable();
        +                }
        +            }
        +        },
        +        // Actual Callbacks object
        +        self = {
        +            // Add a callback or a collection of callbacks to the list
        +            add: function() {
        +                if ( list ) {
        +                    // First, we save the current length
        +                    var start = list.length;
        +                    (function add( args ) {
        +                        jQuery.each( args, function( _, arg ) {
        +                            var type = jQuery.type( arg );
        +                            if ( type === "function" ) {
        +                                if ( !options.unique || !self.has( arg ) ) {
        +                                    list.push( arg );
        +                                }
        +                            } else if ( arg && arg.length && type !== "string" ) {
        +                                // Inspect recursively
        +                                add( arg );
        +                            }
        +                        });
        +                    })( arguments );
        +                    // Do we need to add the callbacks to the
        +                    // current firing batch?
        +                    if ( firing ) {
        +                        firingLength = list.length;
        +                    // With memory, if we're not firing then
        +                    // we should call right away
        +                    } else if ( memory ) {
        +                        firingStart = start;
        +                        fire( memory );
        +                    }
        +                }
        +                return this;
        +            },
        +            // Remove a callback from the list
        +            remove: function() {
        +                if ( list ) {
        +                    jQuery.each( arguments, function( _, arg ) {
        +                        var index;
        +                        while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
        +                            list.splice( index, 1 );
        +                            // Handle firing indexes
        +                            if ( firing ) {
        +                                if ( index <= firingLength ) {
        +                                    firingLength--;
        +                                }
        +                                if ( index <= firingIndex ) {
        +                                    firingIndex--;
        +                                }
        +                            }
        +                        }
        +                    });
        +                }
        +                return this;
        +            },
        +            // Check if a given callback is in the list.
        +            // If no argument is given, return whether or not list has callbacks attached.
        +            has: function( fn ) {
        +                return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
        +            },
        +            // Remove all callbacks from the list
        +            empty: function() {
        +                list = [];
        +                return this;
        +            },
        +            // Have the list do nothing anymore
        +            disable: function() {
        +                list = stack = memory = undefined;
        +                return this;
        +            },
        +            // Is it disabled?
        +            disabled: function() {
        +                return !list;
        +            },
        +            // Lock the list in its current state
        +            lock: function() {
        +                stack = undefined;
        +                if ( !memory ) {
        +                    self.disable();
        +                }
        +                return this;
        +            },
        +            // Is it locked?
        +            locked: function() {
        +                return !stack;
        +            },
        +            // Call all callbacks with the given context and arguments
        +            fireWith: function( context, args ) {
        +                args = args || [];
        +                args = [ context, args.slice ? args.slice() : args ];
        +                if ( list && ( !fired || stack ) ) {
        +                    if ( firing ) {
        +                        stack.push( args );
        +                    } else {
        +                        fire( args );
        +                    }
        +                }
        +                return this;
        +            },
        +            // Call all the callbacks with the given arguments
        +            fire: function() {
        +                self.fireWith( this, arguments );
        +                return this;
        +            },
        +            // To know if the callbacks have already been called at least once
        +            fired: function() {
        +                return !!fired;
        +            }
        +        };
        +
        +    return self;
        +};
        +jQuery.extend({
        +
        +    Deferred: function( func ) {
        +        var tuples = [
        +                // action, add listener, listener list, final state
        +                [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
        +                [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
        +                [ "notify", "progress", jQuery.Callbacks("memory") ]
        +            ],
        +            state = "pending",
        +            promise = {
        +                state: function() {
        +                    return state;
        +                },
        +                always: function() {
        +                    deferred.done( arguments ).fail( arguments );
        +                    return this;
        +                },
        +                then: function( /* fnDone, fnFail, fnProgress */ ) {
        +                    var fns = arguments;
        +                    return jQuery.Deferred(function( newDefer ) {
        +                        jQuery.each( tuples, function( i, tuple ) {
        +                            var action = tuple[ 0 ],
        +                                fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
        +                            // deferred[ done | fail | progress ] for forwarding actions to newDefer
        +                            deferred[ tuple[1] ](function() {
        +                                var returned = fn && fn.apply( this, arguments );
        +                                if ( returned && jQuery.isFunction( returned.promise ) ) {
        +                                    returned.promise()
        +                                        .done( newDefer.resolve )
        +                                        .fail( newDefer.reject )
        +                                        .progress( newDefer.notify );
        +                                } else {
        +                                    newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
        +                                }
        +                            });
        +                        });
        +                        fns = null;
        +                    }).promise();
        +                },
        +                // Get a promise for this deferred
        +                // If obj is provided, the promise aspect is added to the object
        +                promise: function( obj ) {
        +                    return obj != null ? jQuery.extend( obj, promise ) : promise;
        +                }
        +            },
        +            deferred = {};
        +
        +        // Keep pipe for back-compat
        +        promise.pipe = promise.then;
        +
        +        // Add list-specific methods
        +        jQuery.each( tuples, function( i, tuple ) {
        +            var list = tuple[ 2 ],
        +                stateString = tuple[ 3 ];
        +
        +            // promise[ done | fail | progress ] = list.add
        +            promise[ tuple[1] ] = list.add;
        +
        +            // Handle state
        +            if ( stateString ) {
        +                list.add(function() {
        +                    // state = [ resolved | rejected ]
        +                    state = stateString;
        +
        +                // [ reject_list | resolve_list ].disable; progress_list.lock
        +                }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
        +            }
        +
        +            // deferred[ resolve | reject | notify ]
        +            deferred[ tuple[0] ] = function() {
        +                deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
        +                return this;
        +            };
        +            deferred[ tuple[0] + "With" ] = list.fireWith;
        +        });
        +
        +        // Make the deferred a promise
        +        promise.promise( deferred );
        +
        +        // Call given func if any
        +        if ( func ) {
        +            func.call( deferred, deferred );
        +        }
        +
        +        // All done!
        +        return deferred;
        +    },
        +
        +    // Deferred helper
        +    when: function( subordinate /* , ..., subordinateN */ ) {
        +        var i = 0,
        +            resolveValues = core_slice.call( arguments ),
        +            length = resolveValues.length,
        +
        +            // the count of uncompleted subordinates
        +            remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
        +
        +            // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
        +            deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
        +
        +            // Update function for both resolve and progress values
        +            updateFunc = function( i, contexts, values ) {
        +                return function( value ) {
        +                    contexts[ i ] = this;
        +                    values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
        +                    if( values === progressValues ) {
        +                        deferred.notifyWith( contexts, values );
        +                    } else if ( !( --remaining ) ) {
        +                        deferred.resolveWith( contexts, values );
        +                    }
        +                };
        +            },
        +
        +            progressValues, progressContexts, resolveContexts;
        +
        +        // add listeners to Deferred subordinates; treat others as resolved
        +        if ( length > 1 ) {
        +            progressValues = new Array( length );
        +            progressContexts = new Array( length );
        +            resolveContexts = new Array( length );
        +            for ( ; i < length; i++ ) {
        +                if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
        +                    resolveValues[ i ].promise()
        +                        .done( updateFunc( i, resolveContexts, resolveValues ) )
        +                        .fail( deferred.reject )
        +                        .progress( updateFunc( i, progressContexts, progressValues ) );
        +                } else {
        +                    --remaining;
        +                }
        +            }
        +        }
        +
        +        // if we're not waiting on anything, resolve the master
        +        if ( !remaining ) {
        +            deferred.resolveWith( resolveContexts, resolveValues );
        +        }
        +
        +        return deferred.promise();
        +    }
        +});
        +jQuery.support = (function() {
        +
        +    var support, all, a,
        +        input, select, fragment,
        +        opt, eventName, isSupported, i,
        +        div = document.createElement("div");
        +
        +    // Setup
        +    div.setAttribute( "className", "t" );
        +    div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
        +
        +    // Support tests won't run in some limited or non-browser environments
        +    all = div.getElementsByTagName("*");
        +    a = div.getElementsByTagName("a")[ 0 ];
        +    if ( !all || !a || !all.length ) {
        +        return {};
        +    }
        +
        +    // First batch of tests
        +    select = document.createElement("select");
        +    opt = select.appendChild( document.createElement("option") );
        +    input = div.getElementsByTagName("input")[ 0 ];
        +
        +    a.style.cssText = "top:1px;float:left;opacity:.5";
        +    support = {
        +        // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
        +        getSetAttribute: div.className !== "t",
        +
        +        // IE strips leading whitespace when .innerHTML is used
        +        leadingWhitespace: div.firstChild.nodeType === 3,
        +
        +        // Make sure that tbody elements aren't automatically inserted
        +        // IE will insert them into empty tables
        +        tbody: !div.getElementsByTagName("tbody").length,
        +
        +        // Make sure that link elements get serialized correctly by innerHTML
        +        // This requires a wrapper element in IE
        +        htmlSerialize: !!div.getElementsByTagName("link").length,
        +
        +        // Get the style information from getAttribute
        +        // (IE uses .cssText instead)
        +        style: /top/.test( a.getAttribute("style") ),
        +
        +        // Make sure that URLs aren't manipulated
        +        // (IE normalizes it by default)
        +        hrefNormalized: a.getAttribute("href") === "/a",
        +
        +        // Make sure that element opacity exists
        +        // (IE uses filter instead)
        +        // Use a regex to work around a WebKit issue. See #5145
        +        opacity: /^0.5/.test( a.style.opacity ),
        +
        +        // Verify style float existence
        +        // (IE uses styleFloat instead of cssFloat)
        +        cssFloat: !!a.style.cssFloat,
        +
        +        // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
        +        checkOn: !!input.value,
        +
        +        // Make sure that a selected-by-default option has a working selected property.
        +        // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
        +        optSelected: opt.selected,
        +
        +        // Tests for enctype support on a form (#6743)
        +        enctype: !!document.createElement("form").enctype,
        +
        +        // Makes sure cloning an html5 element does not cause problems
        +        // Where outerHTML is undefined, this still works
        +        html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
        +
        +        // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
        +        boxModel: document.compatMode === "CSS1Compat",
        +
        +        // Will be defined later
        +        deleteExpando: true,
        +        noCloneEvent: true,
        +        inlineBlockNeedsLayout: false,
        +        shrinkWrapBlocks: false,
        +        reliableMarginRight: true,
        +        boxSizingReliable: true,
        +        pixelPosition: false
        +    };
        +
        +    // Make sure checked status is properly cloned
        +    input.checked = true;
        +    support.noCloneChecked = input.cloneNode( true ).checked;
        +
        +    // Make sure that the options inside disabled selects aren't marked as disabled
        +    // (WebKit marks them as disabled)
        +    select.disabled = true;
        +    support.optDisabled = !opt.disabled;
        +
        +    // Support: IE<9
        +    try {
        +        delete div.test;
        +    } catch( e ) {
        +        support.deleteExpando = false;
        +    }
        +
        +    // Check if we can trust getAttribute("value")
        +    input = document.createElement("input");
        +    input.setAttribute( "value", "" );
        +    support.input = input.getAttribute( "value" ) === "";
        +
        +    // Check if an input maintains its value after becoming a radio
        +    input.value = "t";
        +    input.setAttribute( "type", "radio" );
        +    support.radioValue = input.value === "t";
        +
        +    // #11217 - WebKit loses check when the name is after the checked attribute
        +    input.setAttribute( "checked", "t" );
        +    input.setAttribute( "name", "t" );
        +
        +    fragment = document.createDocumentFragment();
        +    fragment.appendChild( input );
        +
        +    // Check if a disconnected checkbox will retain its checked
        +    // value of true after appended to the DOM (IE6/7)
        +    support.appendChecked = input.checked;
        +
        +    // WebKit doesn't clone checked state correctly in fragments
        +    support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
        +
        +    // Support: IE<9
        +    // Opera does not clone events (and typeof div.attachEvent === undefined).
        +    // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
        +    if ( div.attachEvent ) {
        +        div.attachEvent( "onclick", function() {
        +            support.noCloneEvent = false;
        +        });
        +
        +        div.cloneNode( true ).click();
        +    }
        +
        +    // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
        +    // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
        +    for ( i in { submit: true, change: true, focusin: true }) {
        +        div.setAttribute( eventName = "on" + i, "t" );
        +
        +        support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
        +    }
        +
        +    div.style.backgroundClip = "content-box";
        +    div.cloneNode( true ).style.backgroundClip = "";
        +    support.clearCloneStyle = div.style.backgroundClip === "content-box";
        +
        +    // Run tests that need a body at doc ready
        +    jQuery(function() {
        +        var container, marginDiv, tds,
        +            divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
        +            body = document.getElementsByTagName("body")[0];
        +
        +        if ( !body ) {
        +            // Return for frameset docs that don't have a body
        +            return;
        +        }
        +
        +        container = document.createElement("div");
        +        container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
        +
        +        body.appendChild( container ).appendChild( div );
        +
        +        // Support: IE8
        +        // Check if table cells still have offsetWidth/Height when they are set
        +        // to display:none and there are still other visible table cells in a
        +        // table row; if so, offsetWidth/Height are not reliable for use when
        +        // determining if an element has been hidden directly using
        +        // display:none (it is still safe to use offsets if a parent element is
        +        // hidden; don safety goggles and see bug #4512 for more information).
        +        div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
        +        tds = div.getElementsByTagName("td");
        +        tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
        +        isSupported = ( tds[ 0 ].offsetHeight === 0 );
        +
        +        tds[ 0 ].style.display = "";
        +        tds[ 1 ].style.display = "none";
        +
        +        // Support: IE8
        +        // Check if empty table cells still have offsetWidth/Height
        +        support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
        +
        +        // Check box-sizing and margin behavior
        +        div.innerHTML = "";
        +        div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
        +        support.boxSizing = ( div.offsetWidth === 4 );
        +        support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
        +
        +        // Use window.getComputedStyle because jsdom on node.js will break without it.
        +        if ( window.getComputedStyle ) {
        +            support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
        +            support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
        +
        +            // Check if div with explicit width and no margin-right incorrectly
        +            // gets computed margin-right based on width of container. (#3333)
        +            // Fails in WebKit before Feb 2011 nightlies
        +            // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +            marginDiv = div.appendChild( document.createElement("div") );
        +            marginDiv.style.cssText = div.style.cssText = divReset;
        +            marginDiv.style.marginRight = marginDiv.style.width = "0";
        +            div.style.width = "1px";
        +
        +            support.reliableMarginRight =
        +                !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
        +        }
        +
        +        if ( typeof div.style.zoom !== core_strundefined ) {
        +            // Support: IE<8
        +            // Check if natively block-level elements act like inline-block
        +            // elements when setting their display to 'inline' and giving
        +            // them layout
        +            div.innerHTML = "";
        +            div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
        +            support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
        +
        +            // Support: IE6
        +            // Check if elements with layout shrink-wrap their children
        +            div.style.display = "block";
        +            div.innerHTML = "<div></div>";
        +            div.firstChild.style.width = "5px";
        +            support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
        +
        +            if ( support.inlineBlockNeedsLayout ) {
        +                // Prevent IE 6 from affecting layout for positioned elements #11048
        +                // Prevent IE from shrinking the body in IE 7 mode #12869
        +                // Support: IE<8
        +                body.style.zoom = 1;
        +            }
        +        }
        +
        +        body.removeChild( container );
        +
        +        // Null elements to avoid leaks in IE
        +        container = div = tds = marginDiv = null;
        +    });
        +
        +    // Null elements to avoid leaks in IE
        +    all = select = fragment = opt = a = input = null;
        +
        +    return support;
        +})();
        +
        +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
        +    rmultiDash = /([A-Z])/g;
        +
        +function internalData( elem, name, data, pvt /* Internal Use Only */ ){
        +    if ( !jQuery.acceptData( elem ) ) {
        +        return;
        +    }
        +
        +    var thisCache, ret,
        +        internalKey = jQuery.expando,
        +        getByName = typeof name === "string",
        +
        +        // We have to handle DOM nodes and JS objects differently because IE6-7
        +        // can't GC object references properly across the DOM-JS boundary
        +        isNode = elem.nodeType,
        +
        +        // Only DOM nodes need the global jQuery cache; JS object data is
        +        // attached directly to the object so GC can occur automatically
        +        cache = isNode ? jQuery.cache : elem,
        +
        +        // Only defining an ID for JS objects if its cache already exists allows
        +        // the code to shortcut on the same path as a DOM node with no cache
        +        id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
        +
        +    // Avoid doing any more work than we need to when trying to get data on an
        +    // object that has no data at all
        +    if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
        +        return;
        +    }
        +
        +    if ( !id ) {
        +        // Only DOM nodes need a new unique ID for each element since their data
        +        // ends up in the global cache
        +        if ( isNode ) {
        +            elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
        +        } else {
        +            id = internalKey;
        +        }
        +    }
        +
        +    if ( !cache[ id ] ) {
        +        cache[ id ] = {};
        +
        +        // Avoids exposing jQuery metadata on plain JS objects when the object
        +        // is serialized using JSON.stringify
        +        if ( !isNode ) {
        +            cache[ id ].toJSON = jQuery.noop;
        +        }
        +    }
        +
        +    // An object can be passed to jQuery.data instead of a key/value pair; this gets
        +    // shallow copied over onto the existing cache
        +    if ( typeof name === "object" || typeof name === "function" ) {
        +        if ( pvt ) {
        +            cache[ id ] = jQuery.extend( cache[ id ], name );
        +        } else {
        +            cache[ id ].data = jQuery.extend( cache[ id ].data, name );
        +        }
        +    }
        +
        +    thisCache = cache[ id ];
        +
        +    // jQuery data() is stored in a separate object inside the object's internal data
        +    // cache in order to avoid key collisions between internal data and user-defined
        +    // data.
        +    if ( !pvt ) {
        +        if ( !thisCache.data ) {
        +            thisCache.data = {};
        +        }
        +
        +        thisCache = thisCache.data;
        +    }
        +
        +    if ( data !== undefined ) {
        +        thisCache[ jQuery.camelCase( name ) ] = data;
        +    }
        +
        +    // Check for both converted-to-camel and non-converted data property names
        +    // If a data property was specified
        +    if ( getByName ) {
        +
        +        // First Try to find as-is property data
        +        ret = thisCache[ name ];
        +
        +        // Test for null|undefined property data
        +        if ( ret == null ) {
        +
        +            // Try to find the camelCased property
        +            ret = thisCache[ jQuery.camelCase( name ) ];
        +        }
        +    } else {
        +        ret = thisCache;
        +    }
        +
        +    return ret;
        +}
        +
        +function internalRemoveData( elem, name, pvt ) {
        +    if ( !jQuery.acceptData( elem ) ) {
        +        return;
        +    }
        +
        +    var i, l, thisCache,
        +        isNode = elem.nodeType,
        +
        +        // See jQuery.data for more information
        +        cache = isNode ? jQuery.cache : elem,
        +        id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
        +
        +    // If there is already no cache entry for this object, there is no
        +    // purpose in continuing
        +    if ( !cache[ id ] ) {
        +        return;
        +    }
        +
        +    if ( name ) {
        +
        +        thisCache = pvt ? cache[ id ] : cache[ id ].data;
        +
        +        if ( thisCache ) {
        +
        +            // Support array or space separated string names for data keys
        +            if ( !jQuery.isArray( name ) ) {
        +
        +                // try the string as a key before any manipulation
        +                if ( name in thisCache ) {
        +                    name = [ name ];
        +                } else {
        +
        +                    // split the camel cased version by spaces unless a key with the spaces exists
        +                    name = jQuery.camelCase( name );
        +                    if ( name in thisCache ) {
        +                        name = [ name ];
        +                    } else {
        +                        name = name.split(" ");
        +                    }
        +                }
        +            } else {
        +                // If "name" is an array of keys...
        +                // When data is initially created, via ("key", "val") signature,
        +                // keys will be converted to camelCase.
        +                // Since there is no way to tell _how_ a key was added, remove
        +                // both plain key and camelCase key. #12786
        +                // This will only penalize the array argument path.
        +                name = name.concat( jQuery.map( name, jQuery.camelCase ) );
        +            }
        +
        +            for ( i = 0, l = name.length; i < l; i++ ) {
        +                delete thisCache[ name[i] ];
        +            }
        +
        +            // If there is no data left in the cache, we want to continue
        +            // and let the cache object itself get destroyed
        +            if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
        +                return;
        +            }
        +        }
        +    }
        +
        +    // See jQuery.data for more information
        +    if ( !pvt ) {
        +        delete cache[ id ].data;
        +
        +        // Don't destroy the parent cache unless the internal data object
        +        // had been the only thing left in it
        +        if ( !isEmptyDataObject( cache[ id ] ) ) {
        +            return;
        +        }
        +    }
        +
        +    // Destroy the cache
        +    if ( isNode ) {
        +        jQuery.cleanData( [ elem ], true );
        +
        +    // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
        +    } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
        +        delete cache[ id ];
        +
        +    // When all else fails, null
        +    } else {
        +        cache[ id ] = null;
        +    }
        +}
        +
        +jQuery.extend({
        +    cache: {},
        +
        +    // Unique for each copy of jQuery on the page
        +    // Non-digits removed to match rinlinejQuery
        +    expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
        +
        +    // The following elements throw uncatchable exceptions if you
        +    // attempt to add expando properties to them.
        +    noData: {
        +        "embed": true,
        +        // Ban all objects except for Flash (which handle expandos)
        +        "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
        +        "applet": true
        +    },
        +
        +    hasData: function( elem ) {
        +        elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
        +        return !!elem && !isEmptyDataObject( elem );
        +    },
        +
        +    data: function( elem, name, data ) {
        +        return internalData( elem, name, data );
        +    },
        +
        +    removeData: function( elem, name ) {
        +        return internalRemoveData( elem, name );
        +    },
        +
        +    // For internal use only.
        +    _data: function( elem, name, data ) {
        +        return internalData( elem, name, data, true );
        +    },
        +
        +    _removeData: function( elem, name ) {
        +        return internalRemoveData( elem, name, true );
        +    },
        +
        +    // A method for determining if a DOM node can handle the data expando
        +    acceptData: function( elem ) {
        +        // Do not set data on non-element because it will not be cleared (#8335).
        +        if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
        +            return false;
        +        }
        +
        +        var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
        +
        +        // nodes accept data unless otherwise specified; rejection can be conditional
        +        return !noData || noData !== true && elem.getAttribute("classid") === noData;
        +    }
        +});
        +
        +jQuery.fn.extend({
        +    data: function( key, value ) {
        +        var attrs, name,
        +            elem = this[0],
        +            i = 0,
        +            data = null;
        +
        +        // Gets all values
        +        if ( key === undefined ) {
        +            if ( this.length ) {
        +                data = jQuery.data( elem );
        +
        +                if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
        +                    attrs = elem.attributes;
        +                    for ( ; i < attrs.length; i++ ) {
        +                        name = attrs[i].name;
        +
        +                        if ( !name.indexOf( "data-" ) ) {
        +                            name = jQuery.camelCase( name.slice(5) );
        +
        +                            dataAttr( elem, name, data[ name ] );
        +                        }
        +                    }
        +                    jQuery._data( elem, "parsedAttrs", true );
        +                }
        +            }
        +
        +            return data;
        +        }
        +
        +        // Sets multiple values
        +        if ( typeof key === "object" ) {
        +            return this.each(function() {
        +                jQuery.data( this, key );
        +            });
        +        }
        +
        +        return jQuery.access( this, function( value ) {
        +
        +            if ( value === undefined ) {
        +                // Try to fetch any internally stored data first
        +                return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
        +            }
        +
        +            this.each(function() {
        +                jQuery.data( this, key, value );
        +            });
        +        }, null, value, arguments.length > 1, null, true );
        +    },
        +
        +    removeData: function( key ) {
        +        return this.each(function() {
        +            jQuery.removeData( this, key );
        +        });
        +    }
        +});
        +
        +function dataAttr( elem, key, data ) {
        +    // If nothing was found internally, try to fetch any
        +    // data from the HTML5 data-* attribute
        +    if ( data === undefined && elem.nodeType === 1 ) {
        +
        +        var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
        +
        +        data = elem.getAttribute( name );
        +
        +        if ( typeof data === "string" ) {
        +            try {
        +                data = data === "true" ? true :
        +                    data === "false" ? false :
        +                    data === "null" ? null :
        +                    // Only convert to a number if it doesn't change the string
        +                    +data + "" === data ? +data :
        +                    rbrace.test( data ) ? jQuery.parseJSON( data ) :
        +                        data;
        +            } catch( e ) {}
        +
        +            // Make sure we set the data so it isn't changed later
        +            jQuery.data( elem, key, data );
        +
        +        } else {
        +            data = undefined;
        +        }
        +    }
        +
        +    return data;
        +}
        +
        +// checks a cache object for emptiness
        +function isEmptyDataObject( obj ) {
        +    var name;
        +    for ( name in obj ) {
        +
        +        // if the public data object is empty, the private is still empty
        +        if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
        +            continue;
        +        }
        +        if ( name !== "toJSON" ) {
        +            return false;
        +        }
        +    }
        +
        +    return true;
        +}
        +jQuery.extend({
        +    queue: function( elem, type, data ) {
        +        var queue;
        +
        +        if ( elem ) {
        +            type = ( type || "fx" ) + "queue";
        +            queue = jQuery._data( elem, type );
        +
        +            // Speed up dequeue by getting out quickly if this is just a lookup
        +            if ( data ) {
        +                if ( !queue || jQuery.isArray(data) ) {
        +                    queue = jQuery._data( elem, type, jQuery.makeArray(data) );
        +                } else {
        +                    queue.push( data );
        +                }
        +            }
        +            return queue || [];
        +        }
        +    },
        +
        +    dequeue: function( elem, type ) {
        +        type = type || "fx";
        +
        +        var queue = jQuery.queue( elem, type ),
        +            startLength = queue.length,
        +            fn = queue.shift(),
        +            hooks = jQuery._queueHooks( elem, type ),
        +            next = function() {
        +                jQuery.dequeue( elem, type );
        +            };
        +
        +        // If the fx queue is dequeued, always remove the progress sentinel
        +        if ( fn === "inprogress" ) {
        +            fn = queue.shift();
        +            startLength--;
        +        }
        +
        +        hooks.cur = fn;
        +        if ( fn ) {
        +
        +            // Add a progress sentinel to prevent the fx queue from being
        +            // automatically dequeued
        +            if ( type === "fx" ) {
        +                queue.unshift( "inprogress" );
        +            }
        +
        +            // clear up the last queue stop function
        +            delete hooks.stop;
        +            fn.call( elem, next, hooks );
        +        }
        +
        +        if ( !startLength && hooks ) {
        +            hooks.empty.fire();
        +        }
        +    },
        +
        +    // not intended for public consumption - generates a queueHooks object, or returns the current one
        +    _queueHooks: function( elem, type ) {
        +        var key = type + "queueHooks";
        +        return jQuery._data( elem, key ) || jQuery._data( elem, key, {
        +            empty: jQuery.Callbacks("once memory").add(function() {
        +                jQuery._removeData( elem, type + "queue" );
        +                jQuery._removeData( elem, key );
        +            })
        +        });
        +    }
        +});
        +
        +jQuery.fn.extend({
        +    queue: function( type, data ) {
        +        var setter = 2;
        +
        +        if ( typeof type !== "string" ) {
        +            data = type;
        +            type = "fx";
        +            setter--;
        +        }
        +
        +        if ( arguments.length < setter ) {
        +            return jQuery.queue( this[0], type );
        +        }
        +
        +        return data === undefined ?
        +            this :
        +            this.each(function() {
        +                var queue = jQuery.queue( this, type, data );
        +
        +                // ensure a hooks for this queue
        +                jQuery._queueHooks( this, type );
        +
        +                if ( type === "fx" && queue[0] !== "inprogress" ) {
        +                    jQuery.dequeue( this, type );
        +                }
        +            });
        +    },
        +    dequeue: function( type ) {
        +        return this.each(function() {
        +            jQuery.dequeue( this, type );
        +        });
        +    },
        +    // Based off of the plugin by Clint Helfers, with permission.
        +    // http://blindsignals.com/index.php/2009/07/jquery-delay/
        +    delay: function( time, type ) {
        +        time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
        +        type = type || "fx";
        +
        +        return this.queue( type, function( next, hooks ) {
        +            var timeout = setTimeout( next, time );
        +            hooks.stop = function() {
        +                clearTimeout( timeout );
        +            };
        +        });
        +    },
        +    clearQueue: function( type ) {
        +        return this.queue( type || "fx", [] );
        +    },
        +    // Get a promise resolved when queues of a certain type
        +    // are emptied (fx is the type by default)
        +    promise: function( type, obj ) {
        +        var tmp,
        +            count = 1,
        +            defer = jQuery.Deferred(),
        +            elements = this,
        +            i = this.length,
        +            resolve = function() {
        +                if ( !( --count ) ) {
        +                    defer.resolveWith( elements, [ elements ] );
        +                }
        +            };
        +
        +        if ( typeof type !== "string" ) {
        +            obj = type;
        +            type = undefined;
        +        }
        +        type = type || "fx";
        +
        +        while( i-- ) {
        +            tmp = jQuery._data( elements[ i ], type + "queueHooks" );
        +            if ( tmp && tmp.empty ) {
        +                count++;
        +                tmp.empty.add( resolve );
        +            }
        +        }
        +        resolve();
        +        return defer.promise( obj );
        +    }
        +});
        +var nodeHook, boolHook,
        +    rclass = /[\t\r\n]/g,
        +    rreturn = /\r/g,
        +    rfocusable = /^(?:input|select|textarea|button|object)$/i,
        +    rclickable = /^(?:a|area)$/i,
        +    rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
        +    ruseDefault = /^(?:checked|selected)$/i,
        +    getSetAttribute = jQuery.support.getSetAttribute,
        +    getSetInput = jQuery.support.input;
        +
        +jQuery.fn.extend({
        +    attr: function( name, value ) {
        +        return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
        +    },
        +
        +    removeAttr: function( name ) {
        +        return this.each(function() {
        +            jQuery.removeAttr( this, name );
        +        });
        +    },
        +
        +    prop: function( name, value ) {
        +        return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
        +    },
        +
        +    removeProp: function( name ) {
        +        name = jQuery.propFix[ name ] || name;
        +        return this.each(function() {
        +            // try/catch handles cases where IE balks (such as removing a property on window)
        +            try {
        +                this[ name ] = undefined;
        +                delete this[ name ];
        +            } catch( e ) {}
        +        });
        +    },
        +
        +    addClass: function( value ) {
        +        var classes, elem, cur, clazz, j,
        +            i = 0,
        +            len = this.length,
        +            proceed = typeof value === "string" && value;
        +
        +        if ( jQuery.isFunction( value ) ) {
        +            return this.each(function( j ) {
        +                jQuery( this ).addClass( value.call( this, j, this.className ) );
        +            });
        +        }
        +
        +        if ( proceed ) {
        +            // The disjunction here is for better compressibility (see removeClass)
        +            classes = ( value || "" ).match( core_rnotwhite ) || [];
        +
        +            for ( ; i < len; i++ ) {
        +                elem = this[ i ];
        +                cur = elem.nodeType === 1 && ( elem.className ?
        +                    ( " " + elem.className + " " ).replace( rclass, " " ) :
        +                    " "
        +                );
        +
        +                if ( cur ) {
        +                    j = 0;
        +                    while ( (clazz = classes[j++]) ) {
        +                        if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
        +                            cur += clazz + " ";
        +                        }
        +                    }
        +                    elem.className = jQuery.trim( cur );
        +
        +                }
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    removeClass: function( value ) {
        +        var classes, elem, cur, clazz, j,
        +            i = 0,
        +            len = this.length,
        +            proceed = arguments.length === 0 || typeof value === "string" && value;
        +
        +        if ( jQuery.isFunction( value ) ) {
        +            return this.each(function( j ) {
        +                jQuery( this ).removeClass( value.call( this, j, this.className ) );
        +            });
        +        }
        +        if ( proceed ) {
        +            classes = ( value || "" ).match( core_rnotwhite ) || [];
        +
        +            for ( ; i < len; i++ ) {
        +                elem = this[ i ];
        +                // This expression is here for better compressibility (see addClass)
        +                cur = elem.nodeType === 1 && ( elem.className ?
        +                    ( " " + elem.className + " " ).replace( rclass, " " ) :
        +                    ""
        +                );
        +
        +                if ( cur ) {
        +                    j = 0;
        +                    while ( (clazz = classes[j++]) ) {
        +                        // Remove *all* instances
        +                        while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
        +                            cur = cur.replace( " " + clazz + " ", " " );
        +                        }
        +                    }
        +                    elem.className = value ? jQuery.trim( cur ) : "";
        +                }
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    toggleClass: function( value, stateVal ) {
        +        var type = typeof value,
        +            isBool = typeof stateVal === "boolean";
        +
        +        if ( jQuery.isFunction( value ) ) {
        +            return this.each(function( i ) {
        +                jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
        +            });
        +        }
        +
        +        return this.each(function() {
        +            if ( type === "string" ) {
        +                // toggle individual class names
        +                var className,
        +                    i = 0,
        +                    self = jQuery( this ),
        +                    state = stateVal,
        +                    classNames = value.match( core_rnotwhite ) || [];
        +
        +                while ( (className = classNames[ i++ ]) ) {
        +                    // check each className given, space separated list
        +                    state = isBool ? state : !self.hasClass( className );
        +                    self[ state ? "addClass" : "removeClass" ]( className );
        +                }
        +
        +            // Toggle whole class name
        +            } else if ( type === core_strundefined || type === "boolean" ) {
        +                if ( this.className ) {
        +                    // store className if set
        +                    jQuery._data( this, "__className__", this.className );
        +                }
        +
        +                // If the element has a class name or if we're passed "false",
        +                // then remove the whole classname (if there was one, the above saved it).
        +                // Otherwise bring back whatever was previously saved (if anything),
        +                // falling back to the empty string if nothing was stored.
        +                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
        +            }
        +        });
        +    },
        +
        +    hasClass: function( selector ) {
        +        var className = " " + selector + " ",
        +            i = 0,
        +            l = this.length;
        +        for ( ; i < l; i++ ) {
        +            if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
        +                return true;
        +            }
        +        }
        +
        +        return false;
        +    },
        +
        +    val: function( value ) {
        +        var ret, hooks, isFunction,
        +            elem = this[0];
        +
        +        if ( !arguments.length ) {
        +            if ( elem ) {
        +                hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
        +
        +                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
        +                    return ret;
        +                }
        +
        +                ret = elem.value;
        +
        +                return typeof ret === "string" ?
        +                    // handle most common string cases
        +                    ret.replace(rreturn, "") :
        +                    // handle cases where value is null/undef or number
        +                    ret == null ? "" : ret;
        +            }
        +
        +            return;
        +        }
        +
        +        isFunction = jQuery.isFunction( value );
        +
        +        return this.each(function( i ) {
        +            var val,
        +                self = jQuery(this);
        +
        +            if ( this.nodeType !== 1 ) {
        +                return;
        +            }
        +
        +            if ( isFunction ) {
        +                val = value.call( this, i, self.val() );
        +            } else {
        +                val = value;
        +            }
        +
        +            // Treat null/undefined as ""; convert numbers to string
        +            if ( val == null ) {
        +                val = "";
        +            } else if ( typeof val === "number" ) {
        +                val += "";
        +            } else if ( jQuery.isArray( val ) ) {
        +                val = jQuery.map(val, function ( value ) {
        +                    return value == null ? "" : value + "";
        +                });
        +            }
        +
        +            hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
        +
        +            // If set returns undefined, fall back to normal setting
        +            if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
        +                this.value = val;
        +            }
        +        });
        +    }
        +});
        +
        +jQuery.extend({
        +    valHooks: {
        +        option: {
        +            get: function( elem ) {
        +                // attributes.value is undefined in Blackberry 4.7 but
        +                // uses .value. See #6932
        +                var val = elem.attributes.value;
        +                return !val || val.specified ? elem.value : elem.text;
        +            }
        +        },
        +        select: {
        +            get: function( elem ) {
        +                var value, option,
        +                    options = elem.options,
        +                    index = elem.selectedIndex,
        +                    one = elem.type === "select-one" || index < 0,
        +                    values = one ? null : [],
        +                    max = one ? index + 1 : options.length,
        +                    i = index < 0 ?
        +                        max :
        +                        one ? index : 0;
        +
        +                // Loop through all the selected options
        +                for ( ; i < max; i++ ) {
        +                    option = options[ i ];
        +
        +                    // oldIE doesn't update selected after form reset (#2551)
        +                    if ( ( option.selected || i === index ) &&
        +                            // Don't return options that are disabled or in a disabled optgroup
        +                            ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
        +                            ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
        +
        +                        // Get the specific value for the option
        +                        value = jQuery( option ).val();
        +
        +                        // We don't need an array for one selects
        +                        if ( one ) {
        +                            return value;
        +                        }
        +
        +                        // Multi-Selects return an array
        +                        values.push( value );
        +                    }
        +                }
        +
        +                return values;
        +            },
        +
        +            set: function( elem, value ) {
        +                var values = jQuery.makeArray( value );
        +
        +                jQuery(elem).find("option").each(function() {
        +                    this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
        +                });
        +
        +                if ( !values.length ) {
        +                    elem.selectedIndex = -1;
        +                }
        +                return values;
        +            }
        +        }
        +    },
        +
        +    attr: function( elem, name, value ) {
        +        var hooks, notxml, ret,
        +            nType = elem.nodeType;
        +
        +        // don't get/set attributes on text, comment and attribute nodes
        +        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +            return;
        +        }
        +
        +        // Fallback to prop when attributes are not supported
        +        if ( typeof elem.getAttribute === core_strundefined ) {
        +            return jQuery.prop( elem, name, value );
        +        }
        +
        +        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
        +
        +        // All attributes are lowercase
        +        // Grab necessary hook if one is defined
        +        if ( notxml ) {
        +            name = name.toLowerCase();
        +            hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
        +        }
        +
        +        if ( value !== undefined ) {
        +
        +            if ( value === null ) {
        +                jQuery.removeAttr( elem, name );
        +
        +            } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
        +                return ret;
        +
        +            } else {
        +                elem.setAttribute( name, value + "" );
        +                return value;
        +            }
        +
        +        } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
        +            return ret;
        +
        +        } else {
        +
        +            // In IE9+, Flash objects don't have .getAttribute (#12945)
        +            // Support: IE9+
        +            if ( typeof elem.getAttribute !== core_strundefined ) {
        +                ret =  elem.getAttribute( name );
        +            }
        +
        +            // Non-existent attributes return null, we normalize to undefined
        +            return ret == null ?
        +                undefined :
        +                ret;
        +        }
        +    },
        +
        +    removeAttr: function( elem, value ) {
        +        var name, propName,
        +            i = 0,
        +            attrNames = value && value.match( core_rnotwhite );
        +
        +        if ( attrNames && elem.nodeType === 1 ) {
        +            while ( (name = attrNames[i++]) ) {
        +                propName = jQuery.propFix[ name ] || name;
        +
        +                // Boolean attributes get special treatment (#10870)
        +                if ( rboolean.test( name ) ) {
        +                    // Set corresponding property to false for boolean attributes
        +                    // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
        +                    if ( !getSetAttribute && ruseDefault.test( name ) ) {
        +                        elem[ jQuery.camelCase( "default-" + name ) ] =
        +                            elem[ propName ] = false;
        +                    } else {
        +                        elem[ propName ] = false;
        +                    }
        +
        +                // See #9699 for explanation of this approach (setting first, then removal)
        +                } else {
        +                    jQuery.attr( elem, name, "" );
        +                }
        +
        +                elem.removeAttribute( getSetAttribute ? name : propName );
        +            }
        +        }
        +    },
        +
        +    attrHooks: {
        +        type: {
        +            set: function( elem, value ) {
        +                if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
        +                    // Setting the type on a radio button after the value resets the value in IE6-9
        +                    // Reset value to default in case type is set after value during creation
        +                    var val = elem.value;
        +                    elem.setAttribute( "type", value );
        +                    if ( val ) {
        +                        elem.value = val;
        +                    }
        +                    return value;
        +                }
        +            }
        +        }
        +    },
        +
        +    propFix: {
        +        tabindex: "tabIndex",
        +        readonly: "readOnly",
        +        "for": "htmlFor",
        +        "class": "className",
        +        maxlength: "maxLength",
        +        cellspacing: "cellSpacing",
        +        cellpadding: "cellPadding",
        +        rowspan: "rowSpan",
        +        colspan: "colSpan",
        +        usemap: "useMap",
        +        frameborder: "frameBorder",
        +        contenteditable: "contentEditable"
        +    },
        +
        +    prop: function( elem, name, value ) {
        +        var ret, hooks, notxml,
        +            nType = elem.nodeType;
        +
        +        // don't get/set properties on text, comment and attribute nodes
        +        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +            return;
        +        }
        +
        +        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
        +
        +        if ( notxml ) {
        +            // Fix name and attach hooks
        +            name = jQuery.propFix[ name ] || name;
        +            hooks = jQuery.propHooks[ name ];
        +        }
        +
        +        if ( value !== undefined ) {
        +            if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
        +                return ret;
        +
        +            } else {
        +                return ( elem[ name ] = value );
        +            }
        +
        +        } else {
        +            if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
        +                return ret;
        +
        +            } else {
        +                return elem[ name ];
        +            }
        +        }
        +    },
        +
        +    propHooks: {
        +        tabIndex: {
        +            get: function( elem ) {
        +                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
        +                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
        +                var attributeNode = elem.getAttributeNode("tabindex");
        +
        +                return attributeNode && attributeNode.specified ?
        +                    parseInt( attributeNode.value, 10 ) :
        +                    rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
        +                        0 :
        +                        undefined;
        +            }
        +        }
        +    }
        +});
        +
        +// Hook for boolean attributes
        +boolHook = {
        +    get: function( elem, name ) {
        +        var
        +            // Use .prop to determine if this attribute is understood as boolean
        +            prop = jQuery.prop( elem, name ),
        +
        +            // Fetch it accordingly
        +            attr = typeof prop === "boolean" && elem.getAttribute( name ),
        +            detail = typeof prop === "boolean" ?
        +
        +                getSetInput && getSetAttribute ?
        +                    attr != null :
        +                    // oldIE fabricates an empty string for missing boolean attributes
        +                    // and conflates checked/selected into attroperties
        +                    ruseDefault.test( name ) ?
        +                        elem[ jQuery.camelCase( "default-" + name ) ] :
        +                        !!attr :
        +
        +                // fetch an attribute node for properties not recognized as boolean
        +                elem.getAttributeNode( name );
        +
        +        return detail && detail.value !== false ?
        +            name.toLowerCase() :
        +            undefined;
        +    },
        +    set: function( elem, value, name ) {
        +        if ( value === false ) {
        +            // Remove boolean attributes when set to false
        +            jQuery.removeAttr( elem, name );
        +        } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
        +            // IE<8 needs the *property* name
        +            elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
        +
        +        // Use defaultChecked and defaultSelected for oldIE
        +        } else {
        +            elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
        +        }
        +
        +        return name;
        +    }
        +};
        +
        +// fix oldIE value attroperty
        +if ( !getSetInput || !getSetAttribute ) {
        +    jQuery.attrHooks.value = {
        +        get: function( elem, name ) {
        +            var ret = elem.getAttributeNode( name );
        +            return jQuery.nodeName( elem, "input" ) ?
        +
        +                // Ignore the value *property* by using defaultValue
        +                elem.defaultValue :
        +
        +                ret && ret.specified ? ret.value : undefined;
        +        },
        +        set: function( elem, value, name ) {
        +            if ( jQuery.nodeName( elem, "input" ) ) {
        +                // Does not return so that setAttribute is also used
        +                elem.defaultValue = value;
        +            } else {
        +                // Use nodeHook if defined (#1954); otherwise setAttribute is fine
        +                return nodeHook && nodeHook.set( elem, value, name );
        +            }
        +        }
        +    };
        +}
        +
        +// IE6/7 do not support getting/setting some attributes with get/setAttribute
        +if ( !getSetAttribute ) {
        +
        +    // Use this for any attribute in IE6/7
        +    // This fixes almost every IE6/7 issue
        +    nodeHook = jQuery.valHooks.button = {
        +        get: function( elem, name ) {
        +            var ret = elem.getAttributeNode( name );
        +            return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
        +                ret.value :
        +                undefined;
        +        },
        +        set: function( elem, value, name ) {
        +            // Set the existing or create a new attribute node
        +            var ret = elem.getAttributeNode( name );
        +            if ( !ret ) {
        +                elem.setAttributeNode(
        +                    (ret = elem.ownerDocument.createAttribute( name ))
        +                );
        +            }
        +
        +            ret.value = value += "";
        +
        +            // Break association with cloned elements by also using setAttribute (#9646)
        +            return name === "value" || value === elem.getAttribute( name ) ?
        +                value :
        +                undefined;
        +        }
        +    };
        +
        +    // Set contenteditable to false on removals(#10429)
        +    // Setting to empty string throws an error as an invalid value
        +    jQuery.attrHooks.contenteditable = {
        +        get: nodeHook.get,
        +        set: function( elem, value, name ) {
        +            nodeHook.set( elem, value === "" ? false : value, name );
        +        }
        +    };
        +
        +    // Set width and height to auto instead of 0 on empty string( Bug #8150 )
        +    // This is for removals
        +    jQuery.each([ "width", "height" ], function( i, name ) {
        +        jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
        +            set: function( elem, value ) {
        +                if ( value === "" ) {
        +                    elem.setAttribute( name, "auto" );
        +                    return value;
        +                }
        +            }
        +        });
        +    });
        +}
        +
        +
        +// Some attributes require a special call on IE
        +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
        +if ( !jQuery.support.hrefNormalized ) {
        +    jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
        +        jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
        +            get: function( elem ) {
        +                var ret = elem.getAttribute( name, 2 );
        +                return ret == null ? undefined : ret;
        +            }
        +        });
        +    });
        +
        +    // href/src property should get the full normalized URL (#10299/#12915)
        +    jQuery.each([ "href", "src" ], function( i, name ) {
        +        jQuery.propHooks[ name ] = {
        +            get: function( elem ) {
        +                return elem.getAttribute( name, 4 );
        +            }
        +        };
        +    });
        +}
        +
        +if ( !jQuery.support.style ) {
        +    jQuery.attrHooks.style = {
        +        get: function( elem ) {
        +            // Return undefined in the case of empty string
        +            // Note: IE uppercases css property names, but if we were to .toLowerCase()
        +            // .cssText, that would destroy case senstitivity in URL's, like in "background"
        +            return elem.style.cssText || undefined;
        +        },
        +        set: function( elem, value ) {
        +            return ( elem.style.cssText = value + "" );
        +        }
        +    };
        +}
        +
        +// Safari mis-reports the default selected property of an option
        +// Accessing the parent's selectedIndex property fixes it
        +if ( !jQuery.support.optSelected ) {
        +    jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
        +        get: function( elem ) {
        +            var parent = elem.parentNode;
        +
        +            if ( parent ) {
        +                parent.selectedIndex;
        +
        +                // Make sure that it also works with optgroups, see #5701
        +                if ( parent.parentNode ) {
        +                    parent.parentNode.selectedIndex;
        +                }
        +            }
        +            return null;
        +        }
        +    });
        +}
        +
        +// IE6/7 call enctype encoding
        +if ( !jQuery.support.enctype ) {
        +    jQuery.propFix.enctype = "encoding";
        +}
        +
        +// Radios and checkboxes getter/setter
        +if ( !jQuery.support.checkOn ) {
        +    jQuery.each([ "radio", "checkbox" ], function() {
        +        jQuery.valHooks[ this ] = {
        +            get: function( elem ) {
        +                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
        +                return elem.getAttribute("value") === null ? "on" : elem.value;
        +            }
        +        };
        +    });
        +}
        +jQuery.each([ "radio", "checkbox" ], function() {
        +    jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
        +        set: function( elem, value ) {
        +            if ( jQuery.isArray( value ) ) {
        +                return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
        +            }
        +        }
        +    });
        +});
        +var rformElems = /^(?:input|select|textarea)$/i,
        +    rkeyEvent = /^key/,
        +    rmouseEvent = /^(?:mouse|contextmenu)|click/,
        +    rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
        +    rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
        +
        +function returnTrue() {
        +    return true;
        +}
        +
        +function returnFalse() {
        +    return false;
        +}
        +
        +/*
        + * Helper functions for managing events -- not part of the public interface.
        + * Props to Dean Edwards' addEvent library for many of the ideas.
        + */
        +jQuery.event = {
        +
        +    global: {},
        +
        +    add: function( elem, types, handler, data, selector ) {
        +        var tmp, events, t, handleObjIn,
        +            special, eventHandle, handleObj,
        +            handlers, type, namespaces, origType,
        +            elemData = jQuery._data( elem );
        +
        +        // Don't attach events to noData or text/comment nodes (but allow plain objects)
        +        if ( !elemData ) {
        +            return;
        +        }
        +
        +        // Caller can pass in an object of custom data in lieu of the handler
        +        if ( handler.handler ) {
        +            handleObjIn = handler;
        +            handler = handleObjIn.handler;
        +            selector = handleObjIn.selector;
        +        }
        +
        +        // Make sure that the handler has a unique ID, used to find/remove it later
        +        if ( !handler.guid ) {
        +            handler.guid = jQuery.guid++;
        +        }
        +
        +        // Init the element's event structure and main handler, if this is the first
        +        if ( !(events = elemData.events) ) {
        +            events = elemData.events = {};
        +        }
        +        if ( !(eventHandle = elemData.handle) ) {
        +            eventHandle = elemData.handle = function( e ) {
        +                // Discard the second event of a jQuery.event.trigger() and
        +                // when an event is called after a page has unloaded
        +                return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
        +                    jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
        +                    undefined;
        +            };
        +            // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
        +            eventHandle.elem = elem;
        +        }
        +
        +        // Handle multiple events separated by a space
        +        // jQuery(...).bind("mouseover mouseout", fn);
        +        types = ( types || "" ).match( core_rnotwhite ) || [""];
        +        t = types.length;
        +        while ( t-- ) {
        +            tmp = rtypenamespace.exec( types[t] ) || [];
        +            type = origType = tmp[1];
        +            namespaces = ( tmp[2] || "" ).split( "." ).sort();
        +
        +            // If event changes its type, use the special event handlers for the changed type
        +            special = jQuery.event.special[ type ] || {};
        +
        +            // If selector defined, determine special event api type, otherwise given type
        +            type = ( selector ? special.delegateType : special.bindType ) || type;
        +
        +            // Update special based on newly reset type
        +            special = jQuery.event.special[ type ] || {};
        +
        +            // handleObj is passed to all event handlers
        +            handleObj = jQuery.extend({
        +                type: type,
        +                origType: origType,
        +                data: data,
        +                handler: handler,
        +                guid: handler.guid,
        +                selector: selector,
        +                needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
        +                namespace: namespaces.join(".")
        +            }, handleObjIn );
        +
        +            // Init the event handler queue if we're the first
        +            if ( !(handlers = events[ type ]) ) {
        +                handlers = events[ type ] = [];
        +                handlers.delegateCount = 0;
        +
        +                // Only use addEventListener/attachEvent if the special events handler returns false
        +                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        +                    // Bind the global event handler to the element
        +                    if ( elem.addEventListener ) {
        +                        elem.addEventListener( type, eventHandle, false );
        +
        +                    } else if ( elem.attachEvent ) {
        +                        elem.attachEvent( "on" + type, eventHandle );
        +                    }
        +                }
        +            }
        +
        +            if ( special.add ) {
        +                special.add.call( elem, handleObj );
        +
        +                if ( !handleObj.handler.guid ) {
        +                    handleObj.handler.guid = handler.guid;
        +                }
        +            }
        +
        +            // Add to the element's handler list, delegates in front
        +            if ( selector ) {
        +                handlers.splice( handlers.delegateCount++, 0, handleObj );
        +            } else {
        +                handlers.push( handleObj );
        +            }
        +
        +            // Keep track of which events have ever been used, for event optimization
        +            jQuery.event.global[ type ] = true;
        +        }
        +
        +        // Nullify elem to prevent memory leaks in IE
        +        elem = null;
        +    },
        +
        +    // Detach an event or set of events from an element
        +    remove: function( elem, types, handler, selector, mappedTypes ) {
        +        var j, handleObj, tmp,
        +            origCount, t, events,
        +            special, handlers, type,
        +            namespaces, origType,
        +            elemData = jQuery.hasData( elem ) && jQuery._data( elem );
        +
        +        if ( !elemData || !(events = elemData.events) ) {
        +            return;
        +        }
        +
        +        // Once for each type.namespace in types; type may be omitted
        +        types = ( types || "" ).match( core_rnotwhite ) || [""];
        +        t = types.length;
        +        while ( t-- ) {
        +            tmp = rtypenamespace.exec( types[t] ) || [];
        +            type = origType = tmp[1];
        +            namespaces = ( tmp[2] || "" ).split( "." ).sort();
        +
        +            // Unbind all events (on this namespace, if provided) for the element
        +            if ( !type ) {
        +                for ( type in events ) {
        +                    jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
        +                }
        +                continue;
        +            }
        +
        +            special = jQuery.event.special[ type ] || {};
        +            type = ( selector ? special.delegateType : special.bindType ) || type;
        +            handlers = events[ type ] || [];
        +            tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
        +
        +            // Remove matching events
        +            origCount = j = handlers.length;
        +            while ( j-- ) {
        +                handleObj = handlers[ j ];
        +
        +                if ( ( mappedTypes || origType === handleObj.origType ) &&
        +                    ( !handler || handler.guid === handleObj.guid ) &&
        +                    ( !tmp || tmp.test( handleObj.namespace ) ) &&
        +                    ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
        +                    handlers.splice( j, 1 );
        +
        +                    if ( handleObj.selector ) {
        +                        handlers.delegateCount--;
        +                    }
        +                    if ( special.remove ) {
        +                        special.remove.call( elem, handleObj );
        +                    }
        +                }
        +            }
        +
        +            // Remove generic event handler if we removed something and no more handlers exist
        +            // (avoids potential for endless recursion during removal of special event handlers)
        +            if ( origCount && !handlers.length ) {
        +                if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
        +                    jQuery.removeEvent( elem, type, elemData.handle );
        +                }
        +
        +                delete events[ type ];
        +            }
        +        }
        +
        +        // Remove the expando if it's no longer used
        +        if ( jQuery.isEmptyObject( events ) ) {
        +            delete elemData.handle;
        +
        +            // removeData also checks for emptiness and clears the expando if empty
        +            // so use it instead of delete
        +            jQuery._removeData( elem, "events" );
        +        }
        +    },
        +
        +    trigger: function( event, data, elem, onlyHandlers ) {
        +        var handle, ontype, cur,
        +            bubbleType, special, tmp, i,
        +            eventPath = [ elem || document ],
        +            type = core_hasOwn.call( event, "type" ) ? event.type : event,
        +            namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
        +
        +        cur = tmp = elem = elem || document;
        +
        +        // Don't do events on text and comment nodes
        +        if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        +            return;
        +        }
        +
        +        // focus/blur morphs to focusin/out; ensure we're not firing them right now
        +        if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        +            return;
        +        }
        +
        +        if ( type.indexOf(".") >= 0 ) {
        +            // Namespaced trigger; create a regexp to match event type in handle()
        +            namespaces = type.split(".");
        +            type = namespaces.shift();
        +            namespaces.sort();
        +        }
        +        ontype = type.indexOf(":") < 0 && "on" + type;
        +
        +        // Caller can pass in a jQuery.Event object, Object, or just an event type string
        +        event = event[ jQuery.expando ] ?
        +            event :
        +            new jQuery.Event( type, typeof event === "object" && event );
        +
        +        event.isTrigger = true;
        +        event.namespace = namespaces.join(".");
        +        event.namespace_re = event.namespace ?
        +            new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
        +            null;
        +
        +        // Clean up the event in case it is being reused
        +        event.result = undefined;
        +        if ( !event.target ) {
        +            event.target = elem;
        +        }
        +
        +        // Clone any incoming data and prepend the event, creating the handler arg list
        +        data = data == null ?
        +            [ event ] :
        +            jQuery.makeArray( data, [ event ] );
        +
        +        // Allow special events to draw outside the lines
        +        special = jQuery.event.special[ type ] || {};
        +        if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
        +            return;
        +        }
        +
        +        // Determine event propagation path in advance, per W3C events spec (#9951)
        +        // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
        +        if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
        +
        +            bubbleType = special.delegateType || type;
        +            if ( !rfocusMorph.test( bubbleType + type ) ) {
        +                cur = cur.parentNode;
        +            }
        +            for ( ; cur; cur = cur.parentNode ) {
        +                eventPath.push( cur );
        +                tmp = cur;
        +            }
        +
        +            // Only add window if we got to document (e.g., not plain obj or detached DOM)
        +            if ( tmp === (elem.ownerDocument || document) ) {
        +                eventPath.push( tmp.defaultView || tmp.parentWindow || window );
        +            }
        +        }
        +
        +        // Fire handlers on the event path
        +        i = 0;
        +        while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
        +
        +            event.type = i > 1 ?
        +                bubbleType :
        +                special.bindType || type;
        +
        +            // jQuery handler
        +            handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
        +            if ( handle ) {
        +                handle.apply( cur, data );
        +            }
        +
        +            // Native handler
        +            handle = ontype && cur[ ontype ];
        +            if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
        +                event.preventDefault();
        +            }
        +        }
        +        event.type = type;
        +
        +        // If nobody prevented the default action, do it now
        +        if ( !onlyHandlers && !event.isDefaultPrevented() ) {
        +
        +            if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
        +                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
        +
        +                // Call a native DOM method on the target with the same name name as the event.
        +                // Can't use an .isFunction() check here because IE6/7 fails that test.
        +                // Don't do default actions on window, that's where global variables be (#6170)
        +                if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
        +
        +                    // Don't re-trigger an onFOO event when we call its FOO() method
        +                    tmp = elem[ ontype ];
        +
        +                    if ( tmp ) {
        +                        elem[ ontype ] = null;
        +                    }
        +
        +                    // Prevent re-triggering of the same event, since we already bubbled it above
        +                    jQuery.event.triggered = type;
        +                    try {
        +                        elem[ type ]();
        +                    } catch ( e ) {
        +                        // IE<9 dies on focus/blur to hidden element (#1486,#12518)
        +                        // only reproducible on winXP IE8 native, not IE9 in IE8 mode
        +                    }
        +                    jQuery.event.triggered = undefined;
        +
        +                    if ( tmp ) {
        +                        elem[ ontype ] = tmp;
        +                    }
        +                }
        +            }
        +        }
        +
        +        return event.result;
        +    },
        +
        +    dispatch: function( event ) {
        +
        +        // Make a writable jQuery.Event from the native event object
        +        event = jQuery.event.fix( event );
        +
        +        var i, ret, handleObj, matched, j,
        +            handlerQueue = [],
        +            args = core_slice.call( arguments ),
        +            handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
        +            special = jQuery.event.special[ event.type ] || {};
        +
        +        // Use the fix-ed jQuery.Event rather than the (read-only) native event
        +        args[0] = event;
        +        event.delegateTarget = this;
        +
        +        // Call the preDispatch hook for the mapped type, and let it bail if desired
        +        if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
        +            return;
        +        }
        +
        +        // Determine handlers
        +        handlerQueue = jQuery.event.handlers.call( this, event, handlers );
        +
        +        // Run delegates first; they may want to stop propagation beneath us
        +        i = 0;
        +        while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
        +            event.currentTarget = matched.elem;
        +
        +            j = 0;
        +            while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
        +
        +                // Triggered event must either 1) have no namespace, or
        +                // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
        +                if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
        +
        +                    event.handleObj = handleObj;
        +                    event.data = handleObj.data;
        +
        +                    ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
        +                            .apply( matched.elem, args );
        +
        +                    if ( ret !== undefined ) {
        +                        if ( (event.result = ret) === false ) {
        +                            event.preventDefault();
        +                            event.stopPropagation();
        +                        }
        +                    }
        +                }
        +            }
        +        }
        +
        +        // Call the postDispatch hook for the mapped type
        +        if ( special.postDispatch ) {
        +            special.postDispatch.call( this, event );
        +        }
        +
        +        return event.result;
        +    },
        +
        +    handlers: function( event, handlers ) {
        +        var sel, handleObj, matches, i,
        +            handlerQueue = [],
        +            delegateCount = handlers.delegateCount,
        +            cur = event.target;
        +
        +        // Find delegate handlers
        +        // Black-hole SVG <use> instance trees (#13180)
        +        // Avoid non-left-click bubbling in Firefox (#3861)
        +        if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
        +
        +            for ( ; cur != this; cur = cur.parentNode || this ) {
        +
        +                // Don't check non-elements (#13208)
        +                // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
        +                if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
        +                    matches = [];
        +                    for ( i = 0; i < delegateCount; i++ ) {
        +                        handleObj = handlers[ i ];
        +
        +                        // Don't conflict with Object.prototype properties (#13203)
        +                        sel = handleObj.selector + " ";
        +
        +                        if ( matches[ sel ] === undefined ) {
        +                            matches[ sel ] = handleObj.needsContext ?
        +                                jQuery( sel, this ).index( cur ) >= 0 :
        +                                jQuery.find( sel, this, null, [ cur ] ).length;
        +                        }
        +                        if ( matches[ sel ] ) {
        +                            matches.push( handleObj );
        +                        }
        +                    }
        +                    if ( matches.length ) {
        +                        handlerQueue.push({ elem: cur, handlers: matches });
        +                    }
        +                }
        +            }
        +        }
        +
        +        // Add the remaining (directly-bound) handlers
        +        if ( delegateCount < handlers.length ) {
        +            handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
        +        }
        +
        +        return handlerQueue;
        +    },
        +
        +    fix: function( event ) {
        +        if ( event[ jQuery.expando ] ) {
        +            return event;
        +        }
        +
        +        // Create a writable copy of the event object and normalize some properties
        +        var i, prop, copy,
        +            type = event.type,
        +            originalEvent = event,
        +            fixHook = this.fixHooks[ type ];
        +
        +        if ( !fixHook ) {
        +            this.fixHooks[ type ] = fixHook =
        +                rmouseEvent.test( type ) ? this.mouseHooks :
        +                rkeyEvent.test( type ) ? this.keyHooks :
        +                {};
        +        }
        +        copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
        +
        +        event = new jQuery.Event( originalEvent );
        +
        +        i = copy.length;
        +        while ( i-- ) {
        +            prop = copy[ i ];
        +            event[ prop ] = originalEvent[ prop ];
        +        }
        +
        +        // Support: IE<9
        +        // Fix target property (#1925)
        +        if ( !event.target ) {
        +            event.target = originalEvent.srcElement || document;
        +        }
        +
        +        // Support: Chrome 23+, Safari?
        +        // Target should not be a text node (#504, #13143)
        +        if ( event.target.nodeType === 3 ) {
        +            event.target = event.target.parentNode;
        +        }
        +
        +        // Support: IE<9
        +        // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
        +        event.metaKey = !!event.metaKey;
        +
        +        return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
        +    },
        +
        +    // Includes some event props shared by KeyEvent and MouseEvent
        +    props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
        +
        +    fixHooks: {},
        +
        +    keyHooks: {
        +        props: "char charCode key keyCode".split(" "),
        +        filter: function( event, original ) {
        +
        +            // Add which for key events
        +            if ( event.which == null ) {
        +                event.which = original.charCode != null ? original.charCode : original.keyCode;
        +            }
        +
        +            return event;
        +        }
        +    },
        +
        +    mouseHooks: {
        +        props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
        +        filter: function( event, original ) {
        +            var body, eventDoc, doc,
        +                button = original.button,
        +                fromElement = original.fromElement;
        +
        +            // Calculate pageX/Y if missing and clientX/Y available
        +            if ( event.pageX == null && original.clientX != null ) {
        +                eventDoc = event.target.ownerDocument || document;
        +                doc = eventDoc.documentElement;
        +                body = eventDoc.body;
        +
        +                event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
        +                event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
        +            }
        +
        +            // Add relatedTarget, if necessary
        +            if ( !event.relatedTarget && fromElement ) {
        +                event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
        +            }
        +
        +            // Add which for click: 1 === left; 2 === middle; 3 === right
        +            // Note: button is not normalized, so don't use it
        +            if ( !event.which && button !== undefined ) {
        +                event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
        +            }
        +
        +            return event;
        +        }
        +    },
        +
        +    special: {
        +        load: {
        +            // Prevent triggered image.load events from bubbling to window.load
        +            noBubble: true
        +        },
        +        click: {
        +            // For checkbox, fire native event so checked state will be right
        +            trigger: function() {
        +                if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
        +                    this.click();
        +                    return false;
        +                }
        +            }
        +        },
        +        focus: {
        +            // Fire native event if possible so blur/focus sequence is correct
        +            trigger: function() {
        +                if ( this !== document.activeElement && this.focus ) {
        +                    try {
        +                        this.focus();
        +                        return false;
        +                    } catch ( e ) {
        +                        // Support: IE<9
        +                        // If we error on focus to hidden element (#1486, #12518),
        +                        // let .trigger() run the handlers
        +                    }
        +                }
        +            },
        +            delegateType: "focusin"
        +        },
        +        blur: {
        +            trigger: function() {
        +                if ( this === document.activeElement && this.blur ) {
        +                    this.blur();
        +                    return false;
        +                }
        +            },
        +            delegateType: "focusout"
        +        },
        +
        +        beforeunload: {
        +            postDispatch: function( event ) {
        +
        +                // Even when returnValue equals to undefined Firefox will still show alert
        +                if ( event.result !== undefined ) {
        +                    event.originalEvent.returnValue = event.result;
        +                }
        +            }
        +        }
        +    },
        +
        +    simulate: function( type, elem, event, bubble ) {
        +        // Piggyback on a donor event to simulate a different one.
        +        // Fake originalEvent to avoid donor's stopPropagation, but if the
        +        // simulated event prevents default then we do the same on the donor.
        +        var e = jQuery.extend(
        +            new jQuery.Event(),
        +            event,
        +            { type: type,
        +                isSimulated: true,
        +                originalEvent: {}
        +            }
        +        );
        +        if ( bubble ) {
        +            jQuery.event.trigger( e, null, elem );
        +        } else {
        +            jQuery.event.dispatch.call( elem, e );
        +        }
        +        if ( e.isDefaultPrevented() ) {
        +            event.preventDefault();
        +        }
        +    }
        +};
        +
        +jQuery.removeEvent = document.removeEventListener ?
        +    function( elem, type, handle ) {
        +        if ( elem.removeEventListener ) {
        +            elem.removeEventListener( type, handle, false );
        +        }
        +    } :
        +    function( elem, type, handle ) {
        +        var name = "on" + type;
        +
        +        if ( elem.detachEvent ) {
        +
        +            // #8545, #7054, preventing memory leaks for custom events in IE6-8
        +            // detachEvent needed property on element, by name of that event, to properly expose it to GC
        +            if ( typeof elem[ name ] === core_strundefined ) {
        +                elem[ name ] = null;
        +            }
        +
        +            elem.detachEvent( name, handle );
        +        }
        +    };
        +
        +jQuery.Event = function( src, props ) {
        +    // Allow instantiation without the 'new' keyword
        +    if ( !(this instanceof jQuery.Event) ) {
        +        return new jQuery.Event( src, props );
        +    }
        +
        +    // Event object
        +    if ( src && src.type ) {
        +        this.originalEvent = src;
        +        this.type = src.type;
        +
        +        // Events bubbling up the document may have been marked as prevented
        +        // by a handler lower down the tree; reflect the correct value.
        +        this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
        +            src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
        +
        +    // Event type
        +    } else {
        +        this.type = src;
        +    }
        +
        +    // Put explicitly provided properties onto the event object
        +    if ( props ) {
        +        jQuery.extend( this, props );
        +    }
        +
        +    // Create a timestamp if incoming event doesn't have one
        +    this.timeStamp = src && src.timeStamp || jQuery.now();
        +
        +    // Mark it as fixed
        +    this[ jQuery.expando ] = true;
        +};
        +
        +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
        +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
        +jQuery.Event.prototype = {
        +    isDefaultPrevented: returnFalse,
        +    isPropagationStopped: returnFalse,
        +    isImmediatePropagationStopped: returnFalse,
        +
        +    preventDefault: function() {
        +        var e = this.originalEvent;
        +
        +        this.isDefaultPrevented = returnTrue;
        +        if ( !e ) {
        +            return;
        +        }
        +
        +        // If preventDefault exists, run it on the original event
        +        if ( e.preventDefault ) {
        +            e.preventDefault();
        +
        +        // Support: IE
        +        // Otherwise set the returnValue property of the original event to false
        +        } else {
        +            e.returnValue = false;
        +        }
        +    },
        +    stopPropagation: function() {
        +        var e = this.originalEvent;
        +
        +        this.isPropagationStopped = returnTrue;
        +        if ( !e ) {
        +            return;
        +        }
        +        // If stopPropagation exists, run it on the original event
        +        if ( e.stopPropagation ) {
        +            e.stopPropagation();
        +        }
        +
        +        // Support: IE
        +        // Set the cancelBubble property of the original event to true
        +        e.cancelBubble = true;
        +    },
        +    stopImmediatePropagation: function() {
        +        this.isImmediatePropagationStopped = returnTrue;
        +        this.stopPropagation();
        +    }
        +};
        +
        +// Create mouseenter/leave events using mouseover/out and event-time checks
        +jQuery.each({
        +    mouseenter: "mouseover",
        +    mouseleave: "mouseout"
        +}, function( orig, fix ) {
        +    jQuery.event.special[ orig ] = {
        +        delegateType: fix,
        +        bindType: fix,
        +
        +        handle: function( event ) {
        +            var ret,
        +                target = this,
        +                related = event.relatedTarget,
        +                handleObj = event.handleObj;
        +
        +            // For mousenter/leave call the handler if related is outside the target.
        +            // NB: No relatedTarget if the mouse left/entered the browser window
        +            if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
        +                event.type = handleObj.origType;
        +                ret = handleObj.handler.apply( this, arguments );
        +                event.type = fix;
        +            }
        +            return ret;
        +        }
        +    };
        +});
        +
        +// IE submit delegation
        +if ( !jQuery.support.submitBubbles ) {
        +
        +    jQuery.event.special.submit = {
        +        setup: function() {
        +            // Only need this for delegated form submit events
        +            if ( jQuery.nodeName( this, "form" ) ) {
        +                return false;
        +            }
        +
        +            // Lazy-add a submit handler when a descendant form may potentially be submitted
        +            jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
        +                // Node name check avoids a VML-related crash in IE (#9807)
        +                var elem = e.target,
        +                    form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
        +                if ( form && !jQuery._data( form, "submitBubbles" ) ) {
        +                    jQuery.event.add( form, "submit._submit", function( event ) {
        +                        event._submit_bubble = true;
        +                    });
        +                    jQuery._data( form, "submitBubbles", true );
        +                }
        +            });
        +            // return undefined since we don't need an event listener
        +        },
        +
        +        postDispatch: function( event ) {
        +            // If form was submitted by the user, bubble the event up the tree
        +            if ( event._submit_bubble ) {
        +                delete event._submit_bubble;
        +                if ( this.parentNode && !event.isTrigger ) {
        +                    jQuery.event.simulate( "submit", this.parentNode, event, true );
        +                }
        +            }
        +        },
        +
        +        teardown: function() {
        +            // Only need this for delegated form submit events
        +            if ( jQuery.nodeName( this, "form" ) ) {
        +                return false;
        +            }
        +
        +            // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
        +            jQuery.event.remove( this, "._submit" );
        +        }
        +    };
        +}
        +
        +// IE change delegation and checkbox/radio fix
        +if ( !jQuery.support.changeBubbles ) {
        +
        +    jQuery.event.special.change = {
        +
        +        setup: function() {
        +
        +            if ( rformElems.test( this.nodeName ) ) {
        +                // IE doesn't fire change on a check/radio until blur; trigger it on click
        +                // after a propertychange. Eat the blur-change in special.change.handle.
        +                // This still fires onchange a second time for check/radio after blur.
        +                if ( this.type === "checkbox" || this.type === "radio" ) {
        +                    jQuery.event.add( this, "propertychange._change", function( event ) {
        +                        if ( event.originalEvent.propertyName === "checked" ) {
        +                            this._just_changed = true;
        +                        }
        +                    });
        +                    jQuery.event.add( this, "click._change", function( event ) {
        +                        if ( this._just_changed && !event.isTrigger ) {
        +                            this._just_changed = false;
        +                        }
        +                        // Allow triggered, simulated change events (#11500)
        +                        jQuery.event.simulate( "change", this, event, true );
        +                    });
        +                }
        +                return false;
        +            }
        +            // Delegated event; lazy-add a change handler on descendant inputs
        +            jQuery.event.add( this, "beforeactivate._change", function( e ) {
        +                var elem = e.target;
        +
        +                if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
        +                    jQuery.event.add( elem, "change._change", function( event ) {
        +                        if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
        +                            jQuery.event.simulate( "change", this.parentNode, event, true );
        +                        }
        +                    });
        +                    jQuery._data( elem, "changeBubbles", true );
        +                }
        +            });
        +        },
        +
        +        handle: function( event ) {
        +            var elem = event.target;
        +
        +            // Swallow native change events from checkbox/radio, we already triggered them above
        +            if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
        +                return event.handleObj.handler.apply( this, arguments );
        +            }
        +        },
        +
        +        teardown: function() {
        +            jQuery.event.remove( this, "._change" );
        +
        +            return !rformElems.test( this.nodeName );
        +        }
        +    };
        +}
        +
        +// Create "bubbling" focus and blur events
        +if ( !jQuery.support.focusinBubbles ) {
        +    jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
        +
        +        // Attach a single capturing handler while someone wants focusin/focusout
        +        var attaches = 0,
        +            handler = function( event ) {
        +                jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
        +            };
        +
        +        jQuery.event.special[ fix ] = {
        +            setup: function() {
        +                if ( attaches++ === 0 ) {
        +                    document.addEventListener( orig, handler, true );
        +                }
        +            },
        +            teardown: function() {
        +                if ( --attaches === 0 ) {
        +                    document.removeEventListener( orig, handler, true );
        +                }
        +            }
        +        };
        +    });
        +}
        +
        +jQuery.fn.extend({
        +
        +    on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
        +        var type, origFn;
        +
        +        // Types can be a map of types/handlers
        +        if ( typeof types === "object" ) {
        +            // ( types-Object, selector, data )
        +            if ( typeof selector !== "string" ) {
        +                // ( types-Object, data )
        +                data = data || selector;
        +                selector = undefined;
        +            }
        +            for ( type in types ) {
        +                this.on( type, selector, data, types[ type ], one );
        +            }
        +            return this;
        +        }
        +
        +        if ( data == null && fn == null ) {
        +            // ( types, fn )
        +            fn = selector;
        +            data = selector = undefined;
        +        } else if ( fn == null ) {
        +            if ( typeof selector === "string" ) {
        +                // ( types, selector, fn )
        +                fn = data;
        +                data = undefined;
        +            } else {
        +                // ( types, data, fn )
        +                fn = data;
        +                data = selector;
        +                selector = undefined;
        +            }
        +        }
        +        if ( fn === false ) {
        +            fn = returnFalse;
        +        } else if ( !fn ) {
        +            return this;
        +        }
        +
        +        if ( one === 1 ) {
        +            origFn = fn;
        +            fn = function( event ) {
        +                // Can use an empty set, since event contains the info
        +                jQuery().off( event );
        +                return origFn.apply( this, arguments );
        +            };
        +            // Use same guid so caller can remove using origFn
        +            fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        +        }
        +        return this.each( function() {
        +            jQuery.event.add( this, types, fn, data, selector );
        +        });
        +    },
        +    one: function( types, selector, data, fn ) {
        +        return this.on( types, selector, data, fn, 1 );
        +    },
        +    off: function( types, selector, fn ) {
        +        var handleObj, type;
        +        if ( types && types.preventDefault && types.handleObj ) {
        +            // ( event )  dispatched jQuery.Event
        +            handleObj = types.handleObj;
        +            jQuery( types.delegateTarget ).off(
        +                handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
        +                handleObj.selector,
        +                handleObj.handler
        +            );
        +            return this;
        +        }
        +        if ( typeof types === "object" ) {
        +            // ( types-object [, selector] )
        +            for ( type in types ) {
        +                this.off( type, selector, types[ type ] );
        +            }
        +            return this;
        +        }
        +        if ( selector === false || typeof selector === "function" ) {
        +            // ( types [, fn] )
        +            fn = selector;
        +            selector = undefined;
        +        }
        +        if ( fn === false ) {
        +            fn = returnFalse;
        +        }
        +        return this.each(function() {
        +            jQuery.event.remove( this, types, fn, selector );
        +        });
        +    },
        +
        +    bind: function( types, data, fn ) {
        +        return this.on( types, null, data, fn );
        +    },
        +    unbind: function( types, fn ) {
        +        return this.off( types, null, fn );
        +    },
        +
        +    delegate: function( selector, types, data, fn ) {
        +        return this.on( types, selector, data, fn );
        +    },
        +    undelegate: function( selector, types, fn ) {
        +        // ( namespace ) or ( selector, types [, fn] )
        +        return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
        +    },
        +
        +    trigger: function( type, data ) {
        +        return this.each(function() {
        +            jQuery.event.trigger( type, data, this );
        +        });
        +    },
        +    triggerHandler: function( type, data ) {
        +        var elem = this[0];
        +        if ( elem ) {
        +            return jQuery.event.trigger( type, data, elem, true );
        +        }
        +    }
        +});
        +/*!
        + * Sizzle CSS Selector Engine
        + * Copyright 2012 jQuery Foundation and other contributors
        + * Released under the MIT license
        + * http://sizzlejs.com/
        + */
        +(function( window, undefined ) {
        +
        +var i,
        +    cachedruns,
        +    Expr,
        +    getText,
        +    isXML,
        +    compile,
        +    hasDuplicate,
        +    outermostContext,
        +
        +    // Local document vars
        +    setDocument,
        +    document,
        +    docElem,
        +    documentIsXML,
        +    rbuggyQSA,
        +    rbuggyMatches,
        +    matches,
        +    contains,
        +    sortOrder,
        +
        +    // Instance-specific data
        +    expando = "sizzle" + -(new Date()),
        +    preferredDoc = window.document,
        +    support = {},
        +    dirruns = 0,
        +    done = 0,
        +    classCache = createCache(),
        +    tokenCache = createCache(),
        +    compilerCache = createCache(),
        +
        +    // General-purpose constants
        +    strundefined = typeof undefined,
        +    MAX_NEGATIVE = 1 << 31,
        +
        +    // Array methods
        +    arr = [],
        +    pop = arr.pop,
        +    push = arr.push,
        +    slice = arr.slice,
        +    // Use a stripped-down indexOf if we can't use a native one
        +    indexOf = arr.indexOf || function( elem ) {
        +        var i = 0,
        +            len = this.length;
        +        for ( ; i < len; i++ ) {
        +            if ( this[i] === elem ) {
        +                return i;
        +            }
        +        }
        +        return -1;
        +    },
        +
        +
        +    // Regular expressions
        +
        +    // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
        +    whitespace = "[\\x20\\t\\r\\n\\f]",
        +    // http://www.w3.org/TR/css3-syntax/#characters
        +    characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
        +
        +    // Loosely modeled on CSS identifier characters
        +    // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
        +    // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        +    identifier = characterEncoding.replace( "w", "w#" ),
        +
        +    // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
        +    operators = "([*^$|!~]?=)",
        +    attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
        +        "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
        +
        +    // Prefer arguments quoted,
        +    //   then not containing pseudos/brackets,
        +    //   then attribute selectors/non-parenthetical expressions,
        +    //   then anything else
        +    // These preferences are here to reduce the number of selectors
        +    //   needing tokenize in the PSEUDO preFilter
        +    pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
        +
        +    // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
        +    rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
        +
        +    rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
        +    rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
        +    rpseudo = new RegExp( pseudos ),
        +    ridentifier = new RegExp( "^" + identifier + "$" ),
        +
        +    matchExpr = {
        +        "ID": new RegExp( "^#(" + characterEncoding + ")" ),
        +        "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
        +        "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
        +        "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
        +        "ATTR": new RegExp( "^" + attributes ),
        +        "PSEUDO": new RegExp( "^" + pseudos ),
        +        "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
        +            "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
        +            "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
        +        // For use in libraries implementing .is()
        +        // We use this for POS matching in `select`
        +        "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
        +            whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
        +    },
        +
        +    rsibling = /[\x20\t\r\n\f]*[+~]/,
        +
        +    rnative = /^[^{]+\{\s*\[native code/,
        +
        +    // Easily-parseable/retrievable ID or TAG or CLASS selectors
        +    rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
        +
        +    rinputs = /^(?:input|select|textarea|button)$/i,
        +    rheader = /^h\d$/i,
        +
        +    rescape = /'|\\/g,
        +    rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
        +
        +    // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
        +    runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
        +    funescape = function( _, escaped ) {
        +        var high = "0x" + escaped - 0x10000;
        +        // NaN means non-codepoint
        +        return high !== high ?
        +            escaped :
        +            // BMP codepoint
        +            high < 0 ?
        +                String.fromCharCode( high + 0x10000 ) :
        +                // Supplemental Plane codepoint (surrogate pair)
        +                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
        +    };
        +
        +// Use a stripped-down slice if we can't use a native one
        +try {
        +    slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
        +} catch ( e ) {
        +    slice = function( i ) {
        +        var elem,
        +            results = [];
        +        while ( (elem = this[i++]) ) {
        +            results.push( elem );
        +        }
        +        return results;
        +    };
        +}
        +
        +/**
        + * For feature detection
        + * @param {Function} fn The function to test for native support
        + */
        +function isNative( fn ) {
        +    return rnative.test( fn + "" );
        +}
        +
        +/**
        + * Create key-value caches of limited size
        + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
        + *  property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
        + *  deleting the oldest entry
        + */
        +function createCache() {
        +    var cache,
        +        keys = [];
        +
        +    return (cache = function( key, value ) {
        +        // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        +        if ( keys.push( key += " " ) > Expr.cacheLength ) {
        +            // Only keep the most recent entries
        +            delete cache[ keys.shift() ];
        +        }
        +        return (cache[ key ] = value);
        +    });
        +}
        +
        +/**
        + * Mark a function for special use by Sizzle
        + * @param {Function} fn The function to mark
        + */
        +function markFunction( fn ) {
        +    fn[ expando ] = true;
        +    return fn;
        +}
        +
        +/**
        + * Support testing using an element
        + * @param {Function} fn Passed the created div and expects a boolean result
        + */
        +function assert( fn ) {
        +    var div = document.createElement("div");
        +
        +    try {
        +        return fn( div );
        +    } catch (e) {
        +        return false;
        +    } finally {
        +        // release memory in IE
        +        div = null;
        +    }
        +}
        +
        +function Sizzle( selector, context, results, seed ) {
        +    var match, elem, m, nodeType,
        +        // QSA vars
        +        i, groups, old, nid, newContext, newSelector;
        +
        +    if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
        +        setDocument( context );
        +    }
        +
        +    context = context || document;
        +    results = results || [];
        +
        +    if ( !selector || typeof selector !== "string" ) {
        +        return results;
        +    }
        +
        +    if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
        +        return [];
        +    }
        +
        +    if ( !documentIsXML && !seed ) {
        +
        +        // Shortcuts
        +        if ( (match = rquickExpr.exec( selector )) ) {
        +            // Speed-up: Sizzle("#ID")
        +            if ( (m = match[1]) ) {
        +                if ( nodeType === 9 ) {
        +                    elem = context.getElementById( m );
        +                    // Check parentNode to catch when Blackberry 4.6 returns
        +                    // nodes that are no longer in the document #6963
        +                    if ( elem && elem.parentNode ) {
        +                        // Handle the case where IE, Opera, and Webkit return items
        +                        // by name instead of ID
        +                        if ( elem.id === m ) {
        +                            results.push( elem );
        +                            return results;
        +                        }
        +                    } else {
        +                        return results;
        +                    }
        +                } else {
        +                    // Context is not a document
        +                    if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
        +                        contains( context, elem ) && elem.id === m ) {
        +                        results.push( elem );
        +                        return results;
        +                    }
        +                }
        +
        +            // Speed-up: Sizzle("TAG")
        +            } else if ( match[2] ) {
        +                push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
        +                return results;
        +
        +            // Speed-up: Sizzle(".CLASS")
        +            } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
        +                push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
        +                return results;
        +            }
        +        }
        +
        +        // QSA path
        +        if ( support.qsa && !rbuggyQSA.test(selector) ) {
        +            old = true;
        +            nid = expando;
        +            newContext = context;
        +            newSelector = nodeType === 9 && selector;
        +
        +            // qSA works strangely on Element-rooted queries
        +            // We can work around this by specifying an extra ID on the root
        +            // and working up from there (Thanks to Andrew Dupont for the technique)
        +            // IE 8 doesn't work on object elements
        +            if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
        +                groups = tokenize( selector );
        +
        +                if ( (old = context.getAttribute("id")) ) {
        +                    nid = old.replace( rescape, "\\$&" );
        +                } else {
        +                    context.setAttribute( "id", nid );
        +                }
        +                nid = "[id='" + nid + "'] ";
        +
        +                i = groups.length;
        +                while ( i-- ) {
        +                    groups[i] = nid + toSelector( groups[i] );
        +                }
        +                newContext = rsibling.test( selector ) && context.parentNode || context;
        +                newSelector = groups.join(",");
        +            }
        +
        +            if ( newSelector ) {
        +                try {
        +                    push.apply( results, slice.call( newContext.querySelectorAll(
        +                        newSelector
        +                    ), 0 ) );
        +                    return results;
        +                } catch(qsaError) {
        +                } finally {
        +                    if ( !old ) {
        +                        context.removeAttribute("id");
        +                    }
        +                }
        +            }
        +        }
        +    }
        +
        +    // All others
        +    return select( selector.replace( rtrim, "$1" ), context, results, seed );
        +}
        +
        +/**
        + * Detect xml
        + * @param {Element|Object} elem An element or a document
        + */
        +isXML = Sizzle.isXML = function( elem ) {
        +    // documentElement is verified for cases where it doesn't yet exist
        +    // (such as loading iframes in IE - #4833)
        +    var documentElement = elem && (elem.ownerDocument || elem).documentElement;
        +    return documentElement ? documentElement.nodeName !== "HTML" : false;
        +};
        +
        +/**
        + * Sets document-related variables once based on the current document
        + * @param {Element|Object} [doc] An element or document object to use to set the document
        + * @returns {Object} Returns the current document
        + */
        +setDocument = Sizzle.setDocument = function( node ) {
        +    var doc = node ? node.ownerDocument || node : preferredDoc;
        +
        +    // If no document and documentElement is available, return
        +    if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
        +        return document;
        +    }
        +
        +    // Set our document
        +    document = doc;
        +    docElem = doc.documentElement;
        +
        +    // Support tests
        +    documentIsXML = isXML( doc );
        +
        +    // Check if getElementsByTagName("*") returns only elements
        +    support.tagNameNoComments = assert(function( div ) {
        +        div.appendChild( doc.createComment("") );
        +        return !div.getElementsByTagName("*").length;
        +    });
        +
        +    // Check if attributes should be retrieved by attribute nodes
        +    support.attributes = assert(function( div ) {
        +        div.innerHTML = "<select></select>";
        +        var type = typeof div.lastChild.getAttribute("multiple");
        +        // IE8 returns a string for some attributes even when not present
        +        return type !== "boolean" && type !== "string";
        +    });
        +
        +    // Check if getElementsByClassName can be trusted
        +    support.getByClassName = assert(function( div ) {
        +        // Opera can't find a second classname (in 9.6)
        +        div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
        +        if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
        +            return false;
        +        }
        +
        +        // Safari 3.2 caches class attributes and doesn't catch changes
        +        div.lastChild.className = "e";
        +        return div.getElementsByClassName("e").length === 2;
        +    });
        +
        +    // Check if getElementById returns elements by name
        +    // Check if getElementsByName privileges form controls or returns elements by ID
        +    support.getByName = assert(function( div ) {
        +        // Inject content
        +        div.id = expando + 0;
        +        div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
        +        docElem.insertBefore( div, docElem.firstChild );
        +
        +        // Test
        +        var pass = doc.getElementsByName &&
        +            // buggy browsers will return fewer than the correct 2
        +            doc.getElementsByName( expando ).length === 2 +
        +            // buggy browsers will return more than the correct 0
        +            doc.getElementsByName( expando + 0 ).length;
        +        support.getIdNotName = !doc.getElementById( expando );
        +
        +        // Cleanup
        +        docElem.removeChild( div );
        +
        +        return pass;
        +    });
        +
        +    // IE6/7 return modified attributes
        +    Expr.attrHandle = assert(function( div ) {
        +        div.innerHTML = "<a href='#'></a>";
        +        return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
        +            div.firstChild.getAttribute("href") === "#";
        +    }) ?
        +        {} :
        +        {
        +            "href": function( elem ) {
        +                return elem.getAttribute( "href", 2 );
        +            },
        +            "type": function( elem ) {
        +                return elem.getAttribute("type");
        +            }
        +        };
        +
        +    // ID find and filter
        +    if ( support.getIdNotName ) {
        +        Expr.find["ID"] = function( id, context ) {
        +            if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
        +                var m = context.getElementById( id );
        +                // Check parentNode to catch when Blackberry 4.6 returns
        +                // nodes that are no longer in the document #6963
        +                return m && m.parentNode ? [m] : [];
        +            }
        +        };
        +        Expr.filter["ID"] = function( id ) {
        +            var attrId = id.replace( runescape, funescape );
        +            return function( elem ) {
        +                return elem.getAttribute("id") === attrId;
        +            };
        +        };
        +    } else {
        +        Expr.find["ID"] = function( id, context ) {
        +            if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
        +                var m = context.getElementById( id );
        +
        +                return m ?
        +                    m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
        +                        [m] :
        +                        undefined :
        +                    [];
        +            }
        +        };
        +        Expr.filter["ID"] =  function( id ) {
        +            var attrId = id.replace( runescape, funescape );
        +            return function( elem ) {
        +                var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
        +                return node && node.value === attrId;
        +            };
        +        };
        +    }
        +
        +    // Tag
        +    Expr.find["TAG"] = support.tagNameNoComments ?
        +        function( tag, context ) {
        +            if ( typeof context.getElementsByTagName !== strundefined ) {
        +                return context.getElementsByTagName( tag );
        +            }
        +        } :
        +        function( tag, context ) {
        +            var elem,
        +                tmp = [],
        +                i = 0,
        +                results = context.getElementsByTagName( tag );
        +
        +            // Filter out possible comments
        +            if ( tag === "*" ) {
        +                while ( (elem = results[i++]) ) {
        +                    if ( elem.nodeType === 1 ) {
        +                        tmp.push( elem );
        +                    }
        +                }
        +
        +                return tmp;
        +            }
        +            return results;
        +        };
        +
        +    // Name
        +    Expr.find["NAME"] = support.getByName && function( tag, context ) {
        +        if ( typeof context.getElementsByName !== strundefined ) {
        +            return context.getElementsByName( name );
        +        }
        +    };
        +
        +    // Class
        +    Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
        +        if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
        +            return context.getElementsByClassName( className );
        +        }
        +    };
        +
        +    // QSA and matchesSelector support
        +
        +    // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
        +    rbuggyMatches = [];
        +
        +    // qSa(:focus) reports false when true (Chrome 21),
        +    // no need to also add to buggyMatches since matches checks buggyQSA
        +    // A support test would require too much code (would include document ready)
        +    rbuggyQSA = [ ":focus" ];
        +
        +    if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
        +        // Build QSA regex
        +        // Regex strategy adopted from Diego Perini
        +        assert(function( div ) {
        +            // Select is set to empty string on purpose
        +            // This is to test IE's treatment of not explictly
        +            // setting a boolean content attribute,
        +            // since its presence should be enough
        +            // http://bugs.jquery.com/ticket/12359
        +            div.innerHTML = "<select><option selected=''></option></select>";
        +
        +            // IE8 - Some boolean attributes are not treated correctly
        +            if ( !div.querySelectorAll("[selected]").length ) {
        +                rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
        +            }
        +
        +            // Webkit/Opera - :checked should return selected option elements
        +            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +            // IE8 throws error here and will not see later tests
        +            if ( !div.querySelectorAll(":checked").length ) {
        +                rbuggyQSA.push(":checked");
        +            }
        +        });
        +
        +        assert(function( div ) {
        +
        +            // Opera 10-12/IE8 - ^= $= *= and empty values
        +            // Should not select anything
        +            div.innerHTML = "<input type='hidden' i=''/>";
        +            if ( div.querySelectorAll("[i^='']").length ) {
        +                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
        +            }
        +
        +            // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
        +            // IE8 throws error here and will not see later tests
        +            if ( !div.querySelectorAll(":enabled").length ) {
        +                rbuggyQSA.push( ":enabled", ":disabled" );
        +            }
        +
        +            // Opera 10-11 does not throw on post-comma invalid pseudos
        +            div.querySelectorAll("*,:x");
        +            rbuggyQSA.push(",.*:");
        +        });
        +    }
        +
        +    if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
        +        docElem.mozMatchesSelector ||
        +        docElem.webkitMatchesSelector ||
        +        docElem.oMatchesSelector ||
        +        docElem.msMatchesSelector) )) ) {
        +
        +        assert(function( div ) {
        +            // Check to see if it's possible to do matchesSelector
        +            // on a disconnected node (IE 9)
        +            support.disconnectedMatch = matches.call( div, "div" );
        +
        +            // This should fail with an exception
        +            // Gecko does not error, returns false instead
        +            matches.call( div, "[s!='']:x" );
        +            rbuggyMatches.push( "!=", pseudos );
        +        });
        +    }
        +
        +    rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
        +    rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
        +
        +    // Element contains another
        +    // Purposefully does not implement inclusive descendent
        +    // As in, an element does not contain itself
        +    contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
        +        function( a, b ) {
        +            var adown = a.nodeType === 9 ? a.documentElement : a,
        +                bup = b && b.parentNode;
        +            return a === bup || !!( bup && bup.nodeType === 1 && (
        +                adown.contains ?
        +                    adown.contains( bup ) :
        +                    a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
        +            ));
        +        } :
        +        function( a, b ) {
        +            if ( b ) {
        +                while ( (b = b.parentNode) ) {
        +                    if ( b === a ) {
        +                        return true;
        +                    }
        +                }
        +            }
        +            return false;
        +        };
        +
        +    // Document order sorting
        +    sortOrder = docElem.compareDocumentPosition ?
        +    function( a, b ) {
        +        var compare;
        +
        +        if ( a === b ) {
        +            hasDuplicate = true;
        +            return 0;
        +        }
        +
        +        if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
        +            if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
        +                if ( a === doc || contains( preferredDoc, a ) ) {
        +                    return -1;
        +                }
        +                if ( b === doc || contains( preferredDoc, b ) ) {
        +                    return 1;
        +                }
        +                return 0;
        +            }
        +            return compare & 4 ? -1 : 1;
        +        }
        +
        +        return a.compareDocumentPosition ? -1 : 1;
        +    } :
        +    function( a, b ) {
        +        var cur,
        +            i = 0,
        +            aup = a.parentNode,
        +            bup = b.parentNode,
        +            ap = [ a ],
        +            bp = [ b ];
        +
        +        // Exit early if the nodes are identical
        +        if ( a === b ) {
        +            hasDuplicate = true;
        +            return 0;
        +
        +        // Parentless nodes are either documents or disconnected
        +        } else if ( !aup || !bup ) {
        +            return a === doc ? -1 :
        +                b === doc ? 1 :
        +                aup ? -1 :
        +                bup ? 1 :
        +                0;
        +
        +        // If the nodes are siblings, we can do a quick check
        +        } else if ( aup === bup ) {
        +            return siblingCheck( a, b );
        +        }
        +
        +        // Otherwise we need full lists of their ancestors for comparison
        +        cur = a;
        +        while ( (cur = cur.parentNode) ) {
        +            ap.unshift( cur );
        +        }
        +        cur = b;
        +        while ( (cur = cur.parentNode) ) {
        +            bp.unshift( cur );
        +        }
        +
        +        // Walk down the tree looking for a discrepancy
        +        while ( ap[i] === bp[i] ) {
        +            i++;
        +        }
        +
        +        return i ?
        +            // Do a sibling check if the nodes have a common ancestor
        +            siblingCheck( ap[i], bp[i] ) :
        +
        +            // Otherwise nodes in our document sort first
        +            ap[i] === preferredDoc ? -1 :
        +            bp[i] === preferredDoc ? 1 :
        +            0;
        +    };
        +
        +    // Always assume the presence of duplicates if sort doesn't
        +    // pass them to our comparison function (as in Google Chrome).
        +    hasDuplicate = false;
        +    [0, 0].sort( sortOrder );
        +    support.detectDuplicates = hasDuplicate;
        +
        +    return document;
        +};
        +
        +Sizzle.matches = function( expr, elements ) {
        +    return Sizzle( expr, null, null, elements );
        +};
        +
        +Sizzle.matchesSelector = function( elem, expr ) {
        +    // Set document vars if needed
        +    if ( ( elem.ownerDocument || elem ) !== document ) {
        +        setDocument( elem );
        +    }
        +
        +    // Make sure that attribute selectors are quoted
        +    expr = expr.replace( rattributeQuotes, "='$1']" );
        +
        +    // rbuggyQSA always contains :focus, so no need for an existence check
        +    if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
        +        try {
        +            var ret = matches.call( elem, expr );
        +
        +            // IE 9's matchesSelector returns false on disconnected nodes
        +            if ( ret || support.disconnectedMatch ||
        +                    // As well, disconnected nodes are said to be in a document
        +                    // fragment in IE 9
        +                    elem.document && elem.document.nodeType !== 11 ) {
        +                return ret;
        +            }
        +        } catch(e) {}
        +    }
        +
        +    return Sizzle( expr, document, null, [elem] ).length > 0;
        +};
        +
        +Sizzle.contains = function( context, elem ) {
        +    // Set document vars if needed
        +    if ( ( context.ownerDocument || context ) !== document ) {
        +        setDocument( context );
        +    }
        +    return contains( context, elem );
        +};
        +
        +Sizzle.attr = function( elem, name ) {
        +    var val;
        +
        +    // Set document vars if needed
        +    if ( ( elem.ownerDocument || elem ) !== document ) {
        +        setDocument( elem );
        +    }
        +
        +    if ( !documentIsXML ) {
        +        name = name.toLowerCase();
        +    }
        +    if ( (val = Expr.attrHandle[ name ]) ) {
        +        return val( elem );
        +    }
        +    if ( documentIsXML || support.attributes ) {
        +        return elem.getAttribute( name );
        +    }
        +    return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
        +        name :
        +        val && val.specified ? val.value : null;
        +};
        +
        +Sizzle.error = function( msg ) {
        +    throw new Error( "Syntax error, unrecognized expression: " + msg );
        +};
        +
        +// Document sorting and removing duplicates
        +Sizzle.uniqueSort = function( results ) {
        +    var elem,
        +        duplicates = [],
        +        i = 1,
        +        j = 0;
        +
        +    // Unless we *know* we can detect duplicates, assume their presence
        +    hasDuplicate = !support.detectDuplicates;
        +    results.sort( sortOrder );
        +
        +    if ( hasDuplicate ) {
        +        for ( ; (elem = results[i]); i++ ) {
        +            if ( elem === results[ i - 1 ] ) {
        +                j = duplicates.push( i );
        +            }
        +        }
        +        while ( j-- ) {
        +            results.splice( duplicates[ j ], 1 );
        +        }
        +    }
        +
        +    return results;
        +};
        +
        +function siblingCheck( a, b ) {
        +    var cur = b && a,
        +        diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
        +
        +    // Use IE sourceIndex if available on both nodes
        +    if ( diff ) {
        +        return diff;
        +    }
        +
        +    // Check if b follows a
        +    if ( cur ) {
        +        while ( (cur = cur.nextSibling) ) {
        +            if ( cur === b ) {
        +                return -1;
        +            }
        +        }
        +    }
        +
        +    return a ? 1 : -1;
        +}
        +
        +// Returns a function to use in pseudos for input types
        +function createInputPseudo( type ) {
        +    return function( elem ) {
        +        var name = elem.nodeName.toLowerCase();
        +        return name === "input" && elem.type === type;
        +    };
        +}
        +
        +// Returns a function to use in pseudos for buttons
        +function createButtonPseudo( type ) {
        +    return function( elem ) {
        +        var name = elem.nodeName.toLowerCase();
        +        return (name === "input" || name === "button") && elem.type === type;
        +    };
        +}
        +
        +// Returns a function to use in pseudos for positionals
        +function createPositionalPseudo( fn ) {
        +    return markFunction(function( argument ) {
        +        argument = +argument;
        +        return markFunction(function( seed, matches ) {
        +            var j,
        +                matchIndexes = fn( [], seed.length, argument ),
        +                i = matchIndexes.length;
        +
        +            // Match elements found at the specified indexes
        +            while ( i-- ) {
        +                if ( seed[ (j = matchIndexes[i]) ] ) {
        +                    seed[j] = !(matches[j] = seed[j]);
        +                }
        +            }
        +        });
        +    });
        +}
        +
        +/**
        + * Utility function for retrieving the text value of an array of DOM nodes
        + * @param {Array|Element} elem
        + */
        +getText = Sizzle.getText = function( elem ) {
        +    var node,
        +        ret = "",
        +        i = 0,
        +        nodeType = elem.nodeType;
        +
        +    if ( !nodeType ) {
        +        // If no nodeType, this is expected to be an array
        +        for ( ; (node = elem[i]); i++ ) {
        +            // Do not traverse comment nodes
        +            ret += getText( node );
        +        }
        +    } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +        // Use textContent for elements
        +        // innerText usage removed for consistency of new lines (see #11153)
        +        if ( typeof elem.textContent === "string" ) {
        +            return elem.textContent;
        +        } else {
        +            // Traverse its children
        +            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +                ret += getText( elem );
        +            }
        +        }
        +    } else if ( nodeType === 3 || nodeType === 4 ) {
        +        return elem.nodeValue;
        +    }
        +    // Do not include comment or processing instruction nodes
        +
        +    return ret;
        +};
        +
        +Expr = Sizzle.selectors = {
        +
        +    // Can be adjusted by the user
        +    cacheLength: 50,
        +
        +    createPseudo: markFunction,
        +
        +    match: matchExpr,
        +
        +    find: {},
        +
        +    relative: {
        +        ">": { dir: "parentNode", first: true },
        +        " ": { dir: "parentNode" },
        +        "+": { dir: "previousSibling", first: true },
        +        "~": { dir: "previousSibling" }
        +    },
        +
        +    preFilter: {
        +        "ATTR": function( match ) {
        +            match[1] = match[1].replace( runescape, funescape );
        +
        +            // Move the given value to match[3] whether quoted or unquoted
        +            match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
        +
        +            if ( match[2] === "~=" ) {
        +                match[3] = " " + match[3] + " ";
        +            }
        +
        +            return match.slice( 0, 4 );
        +        },
        +
        +        "CHILD": function( match ) {
        +            /* matches from matchExpr["CHILD"]
        +                1 type (only|nth|...)
        +                2 what (child|of-type)
        +                3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
        +                4 xn-component of xn+y argument ([+-]?\d*n|)
        +                5 sign of xn-component
        +                6 x of xn-component
        +                7 sign of y-component
        +                8 y of y-component
        +            */
        +            match[1] = match[1].toLowerCase();
        +
        +            if ( match[1].slice( 0, 3 ) === "nth" ) {
        +                // nth-* requires argument
        +                if ( !match[3] ) {
        +                    Sizzle.error( match[0] );
        +                }
        +
        +                // numeric x and y parameters for Expr.filter.CHILD
        +                // remember that false/true cast respectively to 0/1
        +                match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
        +                match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
        +
        +            // other types prohibit arguments
        +            } else if ( match[3] ) {
        +                Sizzle.error( match[0] );
        +            }
        +
        +            return match;
        +        },
        +
        +        "PSEUDO": function( match ) {
        +            var excess,
        +                unquoted = !match[5] && match[2];
        +
        +            if ( matchExpr["CHILD"].test( match[0] ) ) {
        +                return null;
        +            }
        +
        +            // Accept quoted arguments as-is
        +            if ( match[4] ) {
        +                match[2] = match[4];
        +
        +            // Strip excess characters from unquoted arguments
        +            } else if ( unquoted && rpseudo.test( unquoted ) &&
        +                // Get excess from tokenize (recursively)
        +                (excess = tokenize( unquoted, true )) &&
        +                // advance to the next closing parenthesis
        +                (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
        +
        +                // excess is a negative index
        +                match[0] = match[0].slice( 0, excess );
        +                match[2] = unquoted.slice( 0, excess );
        +            }
        +
        +            // Return only captures needed by the pseudo filter method (type and argument)
        +            return match.slice( 0, 3 );
        +        }
        +    },
        +
        +    filter: {
        +
        +        "TAG": function( nodeName ) {
        +            if ( nodeName === "*" ) {
        +                return function() { return true; };
        +            }
        +
        +            nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
        +            return function( elem ) {
        +                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
        +            };
        +        },
        +
        +        "CLASS": function( className ) {
        +            var pattern = classCache[ className + " " ];
        +
        +            return pattern ||
        +                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
        +                classCache( className, function( elem ) {
        +                    return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
        +                });
        +        },
        +
        +        "ATTR": function( name, operator, check ) {
        +            return function( elem ) {
        +                var result = Sizzle.attr( elem, name );
        +
        +                if ( result == null ) {
        +                    return operator === "!=";
        +                }
        +                if ( !operator ) {
        +                    return true;
        +                }
        +
        +                result += "";
        +
        +                return operator === "=" ? result === check :
        +                    operator === "!=" ? result !== check :
        +                    operator === "^=" ? check && result.indexOf( check ) === 0 :
        +                    operator === "*=" ? check && result.indexOf( check ) > -1 :
        +                    operator === "$=" ? check && result.slice( -check.length ) === check :
        +                    operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
        +                    operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
        +                    false;
        +            };
        +        },
        +
        +        "CHILD": function( type, what, argument, first, last ) {
        +            var simple = type.slice( 0, 3 ) !== "nth",
        +                forward = type.slice( -4 ) !== "last",
        +                ofType = what === "of-type";
        +
        +            return first === 1 && last === 0 ?
        +
        +                // Shortcut for :nth-*(n)
        +                function( elem ) {
        +                    return !!elem.parentNode;
        +                } :
        +
        +                function( elem, context, xml ) {
        +                    var cache, outerCache, node, diff, nodeIndex, start,
        +                        dir = simple !== forward ? "nextSibling" : "previousSibling",
        +                        parent = elem.parentNode,
        +                        name = ofType && elem.nodeName.toLowerCase(),
        +                        useCache = !xml && !ofType;
        +
        +                    if ( parent ) {
        +
        +                        // :(first|last|only)-(child|of-type)
        +                        if ( simple ) {
        +                            while ( dir ) {
        +                                node = elem;
        +                                while ( (node = node[ dir ]) ) {
        +                                    if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
        +                                        return false;
        +                                    }
        +                                }
        +                                // Reverse direction for :only-* (if we haven't yet done so)
        +                                start = dir = type === "only" && !start && "nextSibling";
        +                            }
        +                            return true;
        +                        }
        +
        +                        start = [ forward ? parent.firstChild : parent.lastChild ];
        +
        +                        // non-xml :nth-child(...) stores cache data on `parent`
        +                        if ( forward && useCache ) {
        +                            // Seek `elem` from a previously-cached index
        +                            outerCache = parent[ expando ] || (parent[ expando ] = {});
        +                            cache = outerCache[ type ] || [];
        +                            nodeIndex = cache[0] === dirruns && cache[1];
        +                            diff = cache[0] === dirruns && cache[2];
        +                            node = nodeIndex && parent.childNodes[ nodeIndex ];
        +
        +                            while ( (node = ++nodeIndex && node && node[ dir ] ||
        +
        +                                // Fallback to seeking `elem` from the start
        +                                (diff = nodeIndex = 0) || start.pop()) ) {
        +
        +                                // When found, cache indexes on `parent` and break
        +                                if ( node.nodeType === 1 && ++diff && node === elem ) {
        +                                    outerCache[ type ] = [ dirruns, nodeIndex, diff ];
        +                                    break;
        +                                }
        +                            }
        +
        +                        // Use previously-cached element index if available
        +                        } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
        +                            diff = cache[1];
        +
        +                        // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
        +                        } else {
        +                            // Use the same loop as above to seek `elem` from the start
        +                            while ( (node = ++nodeIndex && node && node[ dir ] ||
        +                                (diff = nodeIndex = 0) || start.pop()) ) {
        +
        +                                if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
        +                                    // Cache the index of each encountered element
        +                                    if ( useCache ) {
        +                                        (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
        +                                    }
        +
        +                                    if ( node === elem ) {
        +                                        break;
        +                                    }
        +                                }
        +                            }
        +                        }
        +
        +                        // Incorporate the offset, then check against cycle size
        +                        diff -= last;
        +                        return diff === first || ( diff % first === 0 && diff / first >= 0 );
        +                    }
        +                };
        +        },
        +
        +        "PSEUDO": function( pseudo, argument ) {
        +            // pseudo-class names are case-insensitive
        +            // http://www.w3.org/TR/selectors/#pseudo-classes
        +            // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
        +            // Remember that setFilters inherits from pseudos
        +            var args,
        +                fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
        +                    Sizzle.error( "unsupported pseudo: " + pseudo );
        +
        +            // The user may use createPseudo to indicate that
        +            // arguments are needed to create the filter function
        +            // just as Sizzle does
        +            if ( fn[ expando ] ) {
        +                return fn( argument );
        +            }
        +
        +            // But maintain support for old signatures
        +            if ( fn.length > 1 ) {
        +                args = [ pseudo, pseudo, "", argument ];
        +                return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
        +                    markFunction(function( seed, matches ) {
        +                        var idx,
        +                            matched = fn( seed, argument ),
        +                            i = matched.length;
        +                        while ( i-- ) {
        +                            idx = indexOf.call( seed, matched[i] );
        +                            seed[ idx ] = !( matches[ idx ] = matched[i] );
        +                        }
        +                    }) :
        +                    function( elem ) {
        +                        return fn( elem, 0, args );
        +                    };
        +            }
        +
        +            return fn;
        +        }
        +    },
        +
        +    pseudos: {
        +        // Potentially complex pseudos
        +        "not": markFunction(function( selector ) {
        +            // Trim the selector passed to compile
        +            // to avoid treating leading and trailing
        +            // spaces as combinators
        +            var input = [],
        +                results = [],
        +                matcher = compile( selector.replace( rtrim, "$1" ) );
        +
        +            return matcher[ expando ] ?
        +                markFunction(function( seed, matches, context, xml ) {
        +                    var elem,
        +                        unmatched = matcher( seed, null, xml, [] ),
        +                        i = seed.length;
        +
        +                    // Match elements unmatched by `matcher`
        +                    while ( i-- ) {
        +                        if ( (elem = unmatched[i]) ) {
        +                            seed[i] = !(matches[i] = elem);
        +                        }
        +                    }
        +                }) :
        +                function( elem, context, xml ) {
        +                    input[0] = elem;
        +                    matcher( input, null, xml, results );
        +                    return !results.pop();
        +                };
        +        }),
        +
        +        "has": markFunction(function( selector ) {
        +            return function( elem ) {
        +                return Sizzle( selector, elem ).length > 0;
        +            };
        +        }),
        +
        +        "contains": markFunction(function( text ) {
        +            return function( elem ) {
        +                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
        +            };
        +        }),
        +
        +        // "Whether an element is represented by a :lang() selector
        +        // is based solely on the element's language value
        +        // being equal to the identifier C,
        +        // or beginning with the identifier C immediately followed by "-".
        +        // The matching of C against the element's language value is performed case-insensitively.
        +        // The identifier C does not have to be a valid language name."
        +        // http://www.w3.org/TR/selectors/#lang-pseudo
        +        "lang": markFunction( function( lang ) {
        +            // lang value must be a valid identifider
        +            if ( !ridentifier.test(lang || "") ) {
        +                Sizzle.error( "unsupported lang: " + lang );
        +            }
        +            lang = lang.replace( runescape, funescape ).toLowerCase();
        +            return function( elem ) {
        +                var elemLang;
        +                do {
        +                    if ( (elemLang = documentIsXML ?
        +                        elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
        +                        elem.lang) ) {
        +
        +                        elemLang = elemLang.toLowerCase();
        +                        return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
        +                    }
        +                } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
        +                return false;
        +            };
        +        }),
        +
        +        // Miscellaneous
        +        "target": function( elem ) {
        +            var hash = window.location && window.location.hash;
        +            return hash && hash.slice( 1 ) === elem.id;
        +        },
        +
        +        "root": function( elem ) {
        +            return elem === docElem;
        +        },
        +
        +        "focus": function( elem ) {
        +            return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
        +        },
        +
        +        // Boolean properties
        +        "enabled": function( elem ) {
        +            return elem.disabled === false;
        +        },
        +
        +        "disabled": function( elem ) {
        +            return elem.disabled === true;
        +        },
        +
        +        "checked": function( elem ) {
        +            // In CSS3, :checked should return both checked and selected elements
        +            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +            var nodeName = elem.nodeName.toLowerCase();
        +            return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
        +        },
        +
        +        "selected": function( elem ) {
        +            // Accessing this property makes selected-by-default
        +            // options in Safari work properly
        +            if ( elem.parentNode ) {
        +                elem.parentNode.selectedIndex;
        +            }
        +
        +            return elem.selected === true;
        +        },
        +
        +        // Contents
        +        "empty": function( elem ) {
        +            // http://www.w3.org/TR/selectors/#empty-pseudo
        +            // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
        +            //   not comment, processing instructions, or others
        +            // Thanks to Diego Perini for the nodeName shortcut
        +            //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
        +            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +                if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
        +                    return false;
        +                }
        +            }
        +            return true;
        +        },
        +
        +        "parent": function( elem ) {
        +            return !Expr.pseudos["empty"]( elem );
        +        },
        +
        +        // Element/input types
        +        "header": function( elem ) {
        +            return rheader.test( elem.nodeName );
        +        },
        +
        +        "input": function( elem ) {
        +            return rinputs.test( elem.nodeName );
        +        },
        +
        +        "button": function( elem ) {
        +            var name = elem.nodeName.toLowerCase();
        +            return name === "input" && elem.type === "button" || name === "button";
        +        },
        +
        +        "text": function( elem ) {
        +            var attr;
        +            // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
        +            // use getAttribute instead to test this case
        +            return elem.nodeName.toLowerCase() === "input" &&
        +                elem.type === "text" &&
        +                ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
        +        },
        +
        +        // Position-in-collection
        +        "first": createPositionalPseudo(function() {
        +            return [ 0 ];
        +        }),
        +
        +        "last": createPositionalPseudo(function( matchIndexes, length ) {
        +            return [ length - 1 ];
        +        }),
        +
        +        "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +            return [ argument < 0 ? argument + length : argument ];
        +        }),
        +
        +        "even": createPositionalPseudo(function( matchIndexes, length ) {
        +            var i = 0;
        +            for ( ; i < length; i += 2 ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        }),
        +
        +        "odd": createPositionalPseudo(function( matchIndexes, length ) {
        +            var i = 1;
        +            for ( ; i < length; i += 2 ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        }),
        +
        +        "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +            var i = argument < 0 ? argument + length : argument;
        +            for ( ; --i >= 0; ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        }),
        +
        +        "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +            var i = argument < 0 ? argument + length : argument;
        +            for ( ; ++i < length; ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        })
        +    }
        +};
        +
        +// Add button/input type pseudos
        +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
        +    Expr.pseudos[ i ] = createInputPseudo( i );
        +}
        +for ( i in { submit: true, reset: true } ) {
        +    Expr.pseudos[ i ] = createButtonPseudo( i );
        +}
        +
        +function tokenize( selector, parseOnly ) {
        +    var matched, match, tokens, type,
        +        soFar, groups, preFilters,
        +        cached = tokenCache[ selector + " " ];
        +
        +    if ( cached ) {
        +        return parseOnly ? 0 : cached.slice( 0 );
        +    }
        +
        +    soFar = selector;
        +    groups = [];
        +    preFilters = Expr.preFilter;
        +
        +    while ( soFar ) {
        +
        +        // Comma and first run
        +        if ( !matched || (match = rcomma.exec( soFar )) ) {
        +            if ( match ) {
        +                // Don't consume trailing commas as valid
        +                soFar = soFar.slice( match[0].length ) || soFar;
        +            }
        +            groups.push( tokens = [] );
        +        }
        +
        +        matched = false;
        +
        +        // Combinators
        +        if ( (match = rcombinators.exec( soFar )) ) {
        +            matched = match.shift();
        +            tokens.push( {
        +                value: matched,
        +                // Cast descendant combinators to space
        +                type: match[0].replace( rtrim, " " )
        +            } );
        +            soFar = soFar.slice( matched.length );
        +        }
        +
        +        // Filters
        +        for ( type in Expr.filter ) {
        +            if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
        +                (match = preFilters[ type ]( match ))) ) {
        +                matched = match.shift();
        +                tokens.push( {
        +                    value: matched,
        +                    type: type,
        +                    matches: match
        +                } );
        +                soFar = soFar.slice( matched.length );
        +            }
        +        }
        +
        +        if ( !matched ) {
        +            break;
        +        }
        +    }
        +
        +    // Return the length of the invalid excess
        +    // if we're just parsing
        +    // Otherwise, throw an error or return tokens
        +    return parseOnly ?
        +        soFar.length :
        +        soFar ?
        +            Sizzle.error( selector ) :
        +            // Cache the tokens
        +            tokenCache( selector, groups ).slice( 0 );
        +}
        +
        +function toSelector( tokens ) {
        +    var i = 0,
        +        len = tokens.length,
        +        selector = "";
        +    for ( ; i < len; i++ ) {
        +        selector += tokens[i].value;
        +    }
        +    return selector;
        +}
        +
        +function addCombinator( matcher, combinator, base ) {
        +    var dir = combinator.dir,
        +        checkNonElements = base && dir === "parentNode",
        +        doneName = done++;
        +
        +    return combinator.first ?
        +        // Check against closest ancestor/preceding element
        +        function( elem, context, xml ) {
        +            while ( (elem = elem[ dir ]) ) {
        +                if ( elem.nodeType === 1 || checkNonElements ) {
        +                    return matcher( elem, context, xml );
        +                }
        +            }
        +        } :
        +
        +        // Check against all ancestor/preceding elements
        +        function( elem, context, xml ) {
        +            var data, cache, outerCache,
        +                dirkey = dirruns + " " + doneName;
        +
        +            // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
        +            if ( xml ) {
        +                while ( (elem = elem[ dir ]) ) {
        +                    if ( elem.nodeType === 1 || checkNonElements ) {
        +                        if ( matcher( elem, context, xml ) ) {
        +                            return true;
        +                        }
        +                    }
        +                }
        +            } else {
        +                while ( (elem = elem[ dir ]) ) {
        +                    if ( elem.nodeType === 1 || checkNonElements ) {
        +                        outerCache = elem[ expando ] || (elem[ expando ] = {});
        +                        if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
        +                            if ( (data = cache[1]) === true || data === cachedruns ) {
        +                                return data === true;
        +                            }
        +                        } else {
        +                            cache = outerCache[ dir ] = [ dirkey ];
        +                            cache[1] = matcher( elem, context, xml ) || cachedruns;
        +                            if ( cache[1] === true ) {
        +                                return true;
        +                            }
        +                        }
        +                    }
        +                }
        +            }
        +        };
        +}
        +
        +function elementMatcher( matchers ) {
        +    return matchers.length > 1 ?
        +        function( elem, context, xml ) {
        +            var i = matchers.length;
        +            while ( i-- ) {
        +                if ( !matchers[i]( elem, context, xml ) ) {
        +                    return false;
        +                }
        +            }
        +            return true;
        +        } :
        +        matchers[0];
        +}
        +
        +function condense( unmatched, map, filter, context, xml ) {
        +    var elem,
        +        newUnmatched = [],
        +        i = 0,
        +        len = unmatched.length,
        +        mapped = map != null;
        +
        +    for ( ; i < len; i++ ) {
        +        if ( (elem = unmatched[i]) ) {
        +            if ( !filter || filter( elem, context, xml ) ) {
        +                newUnmatched.push( elem );
        +                if ( mapped ) {
        +                    map.push( i );
        +                }
        +            }
        +        }
        +    }
        +
        +    return newUnmatched;
        +}
        +
        +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
        +    if ( postFilter && !postFilter[ expando ] ) {
        +        postFilter = setMatcher( postFilter );
        +    }
        +    if ( postFinder && !postFinder[ expando ] ) {
        +        postFinder = setMatcher( postFinder, postSelector );
        +    }
        +    return markFunction(function( seed, results, context, xml ) {
        +        var temp, i, elem,
        +            preMap = [],
        +            postMap = [],
        +            preexisting = results.length,
        +
        +            // Get initial elements from seed or context
        +            elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
        +
        +            // Prefilter to get matcher input, preserving a map for seed-results synchronization
        +            matcherIn = preFilter && ( seed || !selector ) ?
        +                condense( elems, preMap, preFilter, context, xml ) :
        +                elems,
        +
        +            matcherOut = matcher ?
        +                // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
        +                postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
        +
        +                    // ...intermediate processing is necessary
        +                    [] :
        +
        +                    // ...otherwise use results directly
        +                    results :
        +                matcherIn;
        +
        +        // Find primary matches
        +        if ( matcher ) {
        +            matcher( matcherIn, matcherOut, context, xml );
        +        }
        +
        +        // Apply postFilter
        +        if ( postFilter ) {
        +            temp = condense( matcherOut, postMap );
        +            postFilter( temp, [], context, xml );
        +
        +            // Un-match failing elements by moving them back to matcherIn
        +            i = temp.length;
        +            while ( i-- ) {
        +                if ( (elem = temp[i]) ) {
        +                    matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
        +                }
        +            }
        +        }
        +
        +        if ( seed ) {
        +            if ( postFinder || preFilter ) {
        +                if ( postFinder ) {
        +                    // Get the final matcherOut by condensing this intermediate into postFinder contexts
        +                    temp = [];
        +                    i = matcherOut.length;
        +                    while ( i-- ) {
        +                        if ( (elem = matcherOut[i]) ) {
        +                            // Restore matcherIn since elem is not yet a final match
        +                            temp.push( (matcherIn[i] = elem) );
        +                        }
        +                    }
        +                    postFinder( null, (matcherOut = []), temp, xml );
        +                }
        +
        +                // Move matched elements from seed to results to keep them synchronized
        +                i = matcherOut.length;
        +                while ( i-- ) {
        +                    if ( (elem = matcherOut[i]) &&
        +                        (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
        +
        +                        seed[temp] = !(results[temp] = elem);
        +                    }
        +                }
        +            }
        +
        +        // Add elements to results, through postFinder if defined
        +        } else {
        +            matcherOut = condense(
        +                matcherOut === results ?
        +                    matcherOut.splice( preexisting, matcherOut.length ) :
        +                    matcherOut
        +            );
        +            if ( postFinder ) {
        +                postFinder( null, results, matcherOut, xml );
        +            } else {
        +                push.apply( results, matcherOut );
        +            }
        +        }
        +    });
        +}
        +
        +function matcherFromTokens( tokens ) {
        +    var checkContext, matcher, j,
        +        len = tokens.length,
        +        leadingRelative = Expr.relative[ tokens[0].type ],
        +        implicitRelative = leadingRelative || Expr.relative[" "],
        +        i = leadingRelative ? 1 : 0,
        +
        +        // The foundational matcher ensures that elements are reachable from top-level context(s)
        +        matchContext = addCombinator( function( elem ) {
        +            return elem === checkContext;
        +        }, implicitRelative, true ),
        +        matchAnyContext = addCombinator( function( elem ) {
        +            return indexOf.call( checkContext, elem ) > -1;
        +        }, implicitRelative, true ),
        +        matchers = [ function( elem, context, xml ) {
        +            return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
        +                (checkContext = context).nodeType ?
        +                    matchContext( elem, context, xml ) :
        +                    matchAnyContext( elem, context, xml ) );
        +        } ];
        +
        +    for ( ; i < len; i++ ) {
        +        if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
        +            matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
        +        } else {
        +            matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
        +
        +            // Return special upon seeing a positional matcher
        +            if ( matcher[ expando ] ) {
        +                // Find the next relative operator (if any) for proper handling
        +                j = ++i;
        +                for ( ; j < len; j++ ) {
        +                    if ( Expr.relative[ tokens[j].type ] ) {
        +                        break;
        +                    }
        +                }
        +                return setMatcher(
        +                    i > 1 && elementMatcher( matchers ),
        +                    i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
        +                    matcher,
        +                    i < j && matcherFromTokens( tokens.slice( i, j ) ),
        +                    j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
        +                    j < len && toSelector( tokens )
        +                );
        +            }
        +            matchers.push( matcher );
        +        }
        +    }
        +
        +    return elementMatcher( matchers );
        +}
        +
        +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
        +    // A counter to specify which element is currently being matched
        +    var matcherCachedRuns = 0,
        +        bySet = setMatchers.length > 0,
        +        byElement = elementMatchers.length > 0,
        +        superMatcher = function( seed, context, xml, results, expandContext ) {
        +            var elem, j, matcher,
        +                setMatched = [],
        +                matchedCount = 0,
        +                i = "0",
        +                unmatched = seed && [],
        +                outermost = expandContext != null,
        +                contextBackup = outermostContext,
        +                // We must always have either seed elements or context
        +                elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
        +                // Use integer dirruns iff this is the outermost matcher
        +                dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
        +
        +            if ( outermost ) {
        +                outermostContext = context !== document && context;
        +                cachedruns = matcherCachedRuns;
        +            }
        +
        +            // Add elements passing elementMatchers directly to results
        +            // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
        +            for ( ; (elem = elems[i]) != null; i++ ) {
        +                if ( byElement && elem ) {
        +                    j = 0;
        +                    while ( (matcher = elementMatchers[j++]) ) {
        +                        if ( matcher( elem, context, xml ) ) {
        +                            results.push( elem );
        +                            break;
        +                        }
        +                    }
        +                    if ( outermost ) {
        +                        dirruns = dirrunsUnique;
        +                        cachedruns = ++matcherCachedRuns;
        +                    }
        +                }
        +
        +                // Track unmatched elements for set filters
        +                if ( bySet ) {
        +                    // They will have gone through all possible matchers
        +                    if ( (elem = !matcher && elem) ) {
        +                        matchedCount--;
        +                    }
        +
        +                    // Lengthen the array for every element, matched or not
        +                    if ( seed ) {
        +                        unmatched.push( elem );
        +                    }
        +                }
        +            }
        +
        +            // Apply set filters to unmatched elements
        +            matchedCount += i;
        +            if ( bySet && i !== matchedCount ) {
        +                j = 0;
        +                while ( (matcher = setMatchers[j++]) ) {
        +                    matcher( unmatched, setMatched, context, xml );
        +                }
        +
        +                if ( seed ) {
        +                    // Reintegrate element matches to eliminate the need for sorting
        +                    if ( matchedCount > 0 ) {
        +                        while ( i-- ) {
        +                            if ( !(unmatched[i] || setMatched[i]) ) {
        +                                setMatched[i] = pop.call( results );
        +                            }
        +                        }
        +                    }
        +
        +                    // Discard index placeholder values to get only actual matches
        +                    setMatched = condense( setMatched );
        +                }
        +
        +                // Add matches to results
        +                push.apply( results, setMatched );
        +
        +                // Seedless set matches succeeding multiple successful matchers stipulate sorting
        +                if ( outermost && !seed && setMatched.length > 0 &&
        +                    ( matchedCount + setMatchers.length ) > 1 ) {
        +
        +                    Sizzle.uniqueSort( results );
        +                }
        +            }
        +
        +            // Override manipulation of globals by nested matchers
        +            if ( outermost ) {
        +                dirruns = dirrunsUnique;
        +                outermostContext = contextBackup;
        +            }
        +
        +            return unmatched;
        +        };
        +
        +    return bySet ?
        +        markFunction( superMatcher ) :
        +        superMatcher;
        +}
        +
        +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
        +    var i,
        +        setMatchers = [],
        +        elementMatchers = [],
        +        cached = compilerCache[ selector + " " ];
        +
        +    if ( !cached ) {
        +        // Generate a function of recursive functions that can be used to check each element
        +        if ( !group ) {
        +            group = tokenize( selector );
        +        }
        +        i = group.length;
        +        while ( i-- ) {
        +            cached = matcherFromTokens( group[i] );
        +            if ( cached[ expando ] ) {
        +                setMatchers.push( cached );
        +            } else {
        +                elementMatchers.push( cached );
        +            }
        +        }
        +
        +        // Cache the compiled function
        +        cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
        +    }
        +    return cached;
        +};
        +
        +function multipleContexts( selector, contexts, results ) {
        +    var i = 0,
        +        len = contexts.length;
        +    for ( ; i < len; i++ ) {
        +        Sizzle( selector, contexts[i], results );
        +    }
        +    return results;
        +}
        +
        +function select( selector, context, results, seed ) {
        +    var i, tokens, token, type, find,
        +        match = tokenize( selector );
        +
        +    if ( !seed ) {
        +        // Try to minimize operations if there is only one group
        +        if ( match.length === 1 ) {
        +
        +            // Take a shortcut and set the context if the root selector is an ID
        +            tokens = match[0] = match[0].slice( 0 );
        +            if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
        +                    context.nodeType === 9 && !documentIsXML &&
        +                    Expr.relative[ tokens[1].type ] ) {
        +
        +                context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
        +                if ( !context ) {
        +                    return results;
        +                }
        +
        +                selector = selector.slice( tokens.shift().value.length );
        +            }
        +
        +            // Fetch a seed set for right-to-left matching
        +            i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
        +            while ( i-- ) {
        +                token = tokens[i];
        +
        +                // Abort if we hit a combinator
        +                if ( Expr.relative[ (type = token.type) ] ) {
        +                    break;
        +                }
        +                if ( (find = Expr.find[ type ]) ) {
        +                    // Search, expanding context for leading sibling combinators
        +                    if ( (seed = find(
        +                        token.matches[0].replace( runescape, funescape ),
        +                        rsibling.test( tokens[0].type ) && context.parentNode || context
        +                    )) ) {
        +
        +                        // If seed is empty or no tokens remain, we can return early
        +                        tokens.splice( i, 1 );
        +                        selector = seed.length && toSelector( tokens );
        +                        if ( !selector ) {
        +                            push.apply( results, slice.call( seed, 0 ) );
        +                            return results;
        +                        }
        +
        +                        break;
        +                    }
        +                }
        +            }
        +        }
        +    }
        +
        +    // Compile and execute a filtering function
        +    // Provide `match` to avoid retokenization if we modified the selector above
        +    compile( selector, match )(
        +        seed,
        +        context,
        +        documentIsXML,
        +        results,
        +        rsibling.test( selector )
        +    );
        +    return results;
        +}
        +
        +// Deprecated
        +Expr.pseudos["nth"] = Expr.pseudos["eq"];
        +
        +// Easy API for creating new setFilters
        +function setFilters() {}
        +Expr.filters = setFilters.prototype = Expr.pseudos;
        +Expr.setFilters = new setFilters();
        +
        +// Initialize with the default document
        +setDocument();
        +
        +// Override sizzle attribute retrieval
        +Sizzle.attr = jQuery.attr;
        +jQuery.find = Sizzle;
        +jQuery.expr = Sizzle.selectors;
        +jQuery.expr[":"] = jQuery.expr.pseudos;
        +jQuery.unique = Sizzle.uniqueSort;
        +jQuery.text = Sizzle.getText;
        +jQuery.isXMLDoc = Sizzle.isXML;
        +jQuery.contains = Sizzle.contains;
        +
        +
        +})( window );
        +var runtil = /Until$/,
        +    rparentsprev = /^(?:parents|prev(?:Until|All))/,
        +    isSimple = /^.[^:#\[\.,]*$/,
        +    rneedsContext = jQuery.expr.match.needsContext,
        +    // methods guaranteed to produce a unique set when starting from a unique set
        +    guaranteedUnique = {
        +        children: true,
        +        contents: true,
        +        next: true,
        +        prev: true
        +    };
        +
        +jQuery.fn.extend({
        +    find: function( selector ) {
        +        var i, ret, self,
        +            len = this.length;
        +
        +        if ( typeof selector !== "string" ) {
        +            self = this;
        +            return this.pushStack( jQuery( selector ).filter(function() {
        +                for ( i = 0; i < len; i++ ) {
        +                    if ( jQuery.contains( self[ i ], this ) ) {
        +                        return true;
        +                    }
        +                }
        +            }) );
        +        }
        +
        +        ret = [];
        +        for ( i = 0; i < len; i++ ) {
        +            jQuery.find( selector, this[ i ], ret );
        +        }
        +
        +        // Needed because $( selector, context ) becomes $( context ).find( selector )
        +        ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
        +        ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
        +        return ret;
        +    },
        +
        +    has: function( target ) {
        +        var i,
        +            targets = jQuery( target, this ),
        +            len = targets.length;
        +
        +        return this.filter(function() {
        +            for ( i = 0; i < len; i++ ) {
        +                if ( jQuery.contains( this, targets[i] ) ) {
        +                    return true;
        +                }
        +            }
        +        });
        +    },
        +
        +    not: function( selector ) {
        +        return this.pushStack( winnow(this, selector, false) );
        +    },
        +
        +    filter: function( selector ) {
        +        return this.pushStack( winnow(this, selector, true) );
        +    },
        +
        +    is: function( selector ) {
        +        return !!selector && (
        +            typeof selector === "string" ?
        +                // If this is a positional/relative selector, check membership in the returned set
        +                // so $("p:first").is("p:last") won't return true for a doc with two "p".
        +                rneedsContext.test( selector ) ?
        +                    jQuery( selector, this.context ).index( this[0] ) >= 0 :
        +                    jQuery.filter( selector, this ).length > 0 :
        +                this.filter( selector ).length > 0 );
        +    },
        +
        +    closest: function( selectors, context ) {
        +        var cur,
        +            i = 0,
        +            l = this.length,
        +            ret = [],
        +            pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
        +                jQuery( selectors, context || this.context ) :
        +                0;
        +
        +        for ( ; i < l; i++ ) {
        +            cur = this[i];
        +
        +            while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
        +                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
        +                    ret.push( cur );
        +                    break;
        +                }
        +                cur = cur.parentNode;
        +            }
        +        }
        +
        +        return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
        +    },
        +
        +    // Determine the position of an element within
        +    // the matched set of elements
        +    index: function( elem ) {
        +
        +        // No argument, return index in parent
        +        if ( !elem ) {
        +            return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
        +        }
        +
        +        // index in selector
        +        if ( typeof elem === "string" ) {
        +            return jQuery.inArray( this[0], jQuery( elem ) );
        +        }
        +
        +        // Locate the position of the desired element
        +        return jQuery.inArray(
        +            // If it receives a jQuery object, the first element is used
        +            elem.jquery ? elem[0] : elem, this );
        +    },
        +
        +    add: function( selector, context ) {
        +        var set = typeof selector === "string" ?
        +                jQuery( selector, context ) :
        +                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
        +            all = jQuery.merge( this.get(), set );
        +
        +        return this.pushStack( jQuery.unique(all) );
        +    },
        +
        +    addBack: function( selector ) {
        +        return this.add( selector == null ?
        +            this.prevObject : this.prevObject.filter(selector)
        +        );
        +    }
        +});
        +
        +jQuery.fn.andSelf = jQuery.fn.addBack;
        +
        +function sibling( cur, dir ) {
        +    do {
        +        cur = cur[ dir ];
        +    } while ( cur && cur.nodeType !== 1 );
        +
        +    return cur;
        +}
        +
        +jQuery.each({
        +    parent: function( elem ) {
        +        var parent = elem.parentNode;
        +        return parent && parent.nodeType !== 11 ? parent : null;
        +    },
        +    parents: function( elem ) {
        +        return jQuery.dir( elem, "parentNode" );
        +    },
        +    parentsUntil: function( elem, i, until ) {
        +        return jQuery.dir( elem, "parentNode", until );
        +    },
        +    next: function( elem ) {
        +        return sibling( elem, "nextSibling" );
        +    },
        +    prev: function( elem ) {
        +        return sibling( elem, "previousSibling" );
        +    },
        +    nextAll: function( elem ) {
        +        return jQuery.dir( elem, "nextSibling" );
        +    },
        +    prevAll: function( elem ) {
        +        return jQuery.dir( elem, "previousSibling" );
        +    },
        +    nextUntil: function( elem, i, until ) {
        +        return jQuery.dir( elem, "nextSibling", until );
        +    },
        +    prevUntil: function( elem, i, until ) {
        +        return jQuery.dir( elem, "previousSibling", until );
        +    },
        +    siblings: function( elem ) {
        +        return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
        +    },
        +    children: function( elem ) {
        +        return jQuery.sibling( elem.firstChild );
        +    },
        +    contents: function( elem ) {
        +        return jQuery.nodeName( elem, "iframe" ) ?
        +            elem.contentDocument || elem.contentWindow.document :
        +            jQuery.merge( [], elem.childNodes );
        +    }
        +}, function( name, fn ) {
        +    jQuery.fn[ name ] = function( until, selector ) {
        +        var ret = jQuery.map( this, fn, until );
        +
        +        if ( !runtil.test( name ) ) {
        +            selector = until;
        +        }
        +
        +        if ( selector && typeof selector === "string" ) {
        +            ret = jQuery.filter( selector, ret );
        +        }
        +
        +        ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
        +
        +        if ( this.length > 1 && rparentsprev.test( name ) ) {
        +            ret = ret.reverse();
        +        }
        +
        +        return this.pushStack( ret );
        +    };
        +});
        +
        +jQuery.extend({
        +    filter: function( expr, elems, not ) {
        +        if ( not ) {
        +            expr = ":not(" + expr + ")";
        +        }
        +
        +        return elems.length === 1 ?
        +            jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
        +            jQuery.find.matches(expr, elems);
        +    },
        +
        +    dir: function( elem, dir, until ) {
        +        var matched = [],
        +            cur = elem[ dir ];
        +
        +        while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
        +            if ( cur.nodeType === 1 ) {
        +                matched.push( cur );
        +            }
        +            cur = cur[dir];
        +        }
        +        return matched;
        +    },
        +
        +    sibling: function( n, elem ) {
        +        var r = [];
        +
        +        for ( ; n; n = n.nextSibling ) {
        +            if ( n.nodeType === 1 && n !== elem ) {
        +                r.push( n );
        +            }
        +        }
        +
        +        return r;
        +    }
        +});
        +
        +// Implement the identical functionality for filter and not
        +function winnow( elements, qualifier, keep ) {
        +
        +    // Can't pass null or undefined to indexOf in Firefox 4
        +    // Set to 0 to skip string check
        +    qualifier = qualifier || 0;
        +
        +    if ( jQuery.isFunction( qualifier ) ) {
        +        return jQuery.grep(elements, function( elem, i ) {
        +            var retVal = !!qualifier.call( elem, i, elem );
        +            return retVal === keep;
        +        });
        +
        +    } else if ( qualifier.nodeType ) {
        +        return jQuery.grep(elements, function( elem ) {
        +            return ( elem === qualifier ) === keep;
        +        });
        +
        +    } else if ( typeof qualifier === "string" ) {
        +        var filtered = jQuery.grep(elements, function( elem ) {
        +            return elem.nodeType === 1;
        +        });
        +
        +        if ( isSimple.test( qualifier ) ) {
        +            return jQuery.filter(qualifier, filtered, !keep);
        +        } else {
        +            qualifier = jQuery.filter( qualifier, filtered );
        +        }
        +    }
        +
        +    return jQuery.grep(elements, function( elem ) {
        +        return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
        +    });
        +}
        +function createSafeFragment( document ) {
        +    var list = nodeNames.split( "|" ),
        +        safeFrag = document.createDocumentFragment();
        +
        +    if ( safeFrag.createElement ) {
        +        while ( list.length ) {
        +            safeFrag.createElement(
        +                list.pop()
        +            );
        +        }
        +    }
        +    return safeFrag;
        +}
        +
        +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
        +        "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
        +    rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
        +    rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
        +    rleadingWhitespace = /^\s+/,
        +    rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
        +    rtagName = /<([\w:]+)/,
        +    rtbody = /<tbody/i,
        +    rhtml = /<|&#?\w+;/,
        +    rnoInnerhtml = /<(?:script|style|link)/i,
        +    manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
        +    // checked="checked" or checked
        +    rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        +    rscriptType = /^$|\/(?:java|ecma)script/i,
        +    rscriptTypeMasked = /^true\/(.*)/,
        +    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
        +
        +    // We have to close these tags to support XHTML (#13200)
        +    wrapMap = {
        +        option: [ 1, "<select multiple='multiple'>", "</select>" ],
        +        legend: [ 1, "<fieldset>", "</fieldset>" ],
        +        area: [ 1, "<map>", "</map>" ],
        +        param: [ 1, "<object>", "</object>" ],
        +        thead: [ 1, "<table>", "</table>" ],
        +        tr: [ 2, "<table><tbody>", "</tbody></table>" ],
        +        col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
        +        td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
        +
        +        // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
        +        // unless wrapped in a div with non-breaking characters in front of it.
        +        _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
        +    },
        +    safeFragment = createSafeFragment( document ),
        +    fragmentDiv = safeFragment.appendChild( document.createElement("div") );
        +
        +wrapMap.optgroup = wrapMap.option;
        +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
        +wrapMap.th = wrapMap.td;
        +
        +jQuery.fn.extend({
        +    text: function( value ) {
        +        return jQuery.access( this, function( value ) {
        +            return value === undefined ?
        +                jQuery.text( this ) :
        +                this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
        +        }, null, value, arguments.length );
        +    },
        +
        +    wrapAll: function( html ) {
        +        if ( jQuery.isFunction( html ) ) {
        +            return this.each(function(i) {
        +                jQuery(this).wrapAll( html.call(this, i) );
        +            });
        +        }
        +
        +        if ( this[0] ) {
        +            // The elements to wrap the target around
        +            var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
        +
        +            if ( this[0].parentNode ) {
        +                wrap.insertBefore( this[0] );
        +            }
        +
        +            wrap.map(function() {
        +                var elem = this;
        +
        +                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
        +                    elem = elem.firstChild;
        +                }
        +
        +                return elem;
        +            }).append( this );
        +        }
        +
        +        return this;
        +    },
        +
        +    wrapInner: function( html ) {
        +        if ( jQuery.isFunction( html ) ) {
        +            return this.each(function(i) {
        +                jQuery(this).wrapInner( html.call(this, i) );
        +            });
        +        }
        +
        +        return this.each(function() {
        +            var self = jQuery( this ),
        +                contents = self.contents();
        +
        +            if ( contents.length ) {
        +                contents.wrapAll( html );
        +
        +            } else {
        +                self.append( html );
        +            }
        +        });
        +    },
        +
        +    wrap: function( html ) {
        +        var isFunction = jQuery.isFunction( html );
        +
        +        return this.each(function(i) {
        +            jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
        +        });
        +    },
        +
        +    unwrap: function() {
        +        return this.parent().each(function() {
        +            if ( !jQuery.nodeName( this, "body" ) ) {
        +                jQuery( this ).replaceWith( this.childNodes );
        +            }
        +        }).end();
        +    },
        +
        +    append: function() {
        +        return this.domManip(arguments, true, function( elem ) {
        +            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +                this.appendChild( elem );
        +            }
        +        });
        +    },
        +
        +    prepend: function() {
        +        return this.domManip(arguments, true, function( elem ) {
        +            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +                this.insertBefore( elem, this.firstChild );
        +            }
        +        });
        +    },
        +
        +    before: function() {
        +        return this.domManip( arguments, false, function( elem ) {
        +            if ( this.parentNode ) {
        +                this.parentNode.insertBefore( elem, this );
        +            }
        +        });
        +    },
        +
        +    after: function() {
        +        return this.domManip( arguments, false, function( elem ) {
        +            if ( this.parentNode ) {
        +                this.parentNode.insertBefore( elem, this.nextSibling );
        +            }
        +        });
        +    },
        +
        +    // keepData is for internal use only--do not document
        +    remove: function( selector, keepData ) {
        +        var elem,
        +            i = 0;
        +
        +        for ( ; (elem = this[i]) != null; i++ ) {
        +            if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
        +                if ( !keepData && elem.nodeType === 1 ) {
        +                    jQuery.cleanData( getAll( elem ) );
        +                }
        +
        +                if ( elem.parentNode ) {
        +                    if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
        +                        setGlobalEval( getAll( elem, "script" ) );
        +                    }
        +                    elem.parentNode.removeChild( elem );
        +                }
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    empty: function() {
        +        var elem,
        +            i = 0;
        +
        +        for ( ; (elem = this[i]) != null; i++ ) {
        +            // Remove element nodes and prevent memory leaks
        +            if ( elem.nodeType === 1 ) {
        +                jQuery.cleanData( getAll( elem, false ) );
        +            }
        +
        +            // Remove any remaining nodes
        +            while ( elem.firstChild ) {
        +                elem.removeChild( elem.firstChild );
        +            }
        +
        +            // If this is a select, ensure that it displays empty (#12336)
        +            // Support: IE<9
        +            if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
        +                elem.options.length = 0;
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    clone: function( dataAndEvents, deepDataAndEvents ) {
        +        dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
        +        deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
        +
        +        return this.map( function () {
        +            return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
        +        });
        +    },
        +
        +    html: function( value ) {
        +        return jQuery.access( this, function( value ) {
        +            var elem = this[0] || {},
        +                i = 0,
        +                l = this.length;
        +
        +            if ( value === undefined ) {
        +                return elem.nodeType === 1 ?
        +                    elem.innerHTML.replace( rinlinejQuery, "" ) :
        +                    undefined;
        +            }
        +
        +            // See if we can take a shortcut and just use innerHTML
        +            if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        +                ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
        +                ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
        +                !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
        +
        +                value = value.replace( rxhtmlTag, "<$1></$2>" );
        +
        +                try {
        +                    for (; i < l; i++ ) {
        +                        // Remove element nodes and prevent memory leaks
        +                        elem = this[i] || {};
        +                        if ( elem.nodeType === 1 ) {
        +                            jQuery.cleanData( getAll( elem, false ) );
        +                            elem.innerHTML = value;
        +                        }
        +                    }
        +
        +                    elem = 0;
        +
        +                // If using innerHTML throws an exception, use the fallback method
        +                } catch(e) {}
        +            }
        +
        +            if ( elem ) {
        +                this.empty().append( value );
        +            }
        +        }, null, value, arguments.length );
        +    },
        +
        +    replaceWith: function( value ) {
        +        var isFunc = jQuery.isFunction( value );
        +
        +        // Make sure that the elements are removed from the DOM before they are inserted
        +        // this can help fix replacing a parent with child elements
        +        if ( !isFunc && typeof value !== "string" ) {
        +            value = jQuery( value ).not( this ).detach();
        +        }
        +
        +        return this.domManip( [ value ], true, function( elem ) {
        +            var next = this.nextSibling,
        +                parent = this.parentNode;
        +
        +            if ( parent ) {
        +                jQuery( this ).remove();
        +                parent.insertBefore( elem, next );
        +            }
        +        });
        +    },
        +
        +    detach: function( selector ) {
        +        return this.remove( selector, true );
        +    },
        +
        +    domManip: function( args, table, callback ) {
        +
        +        // Flatten any nested arrays
        +        args = core_concat.apply( [], args );
        +
        +        var first, node, hasScripts,
        +            scripts, doc, fragment,
        +            i = 0,
        +            l = this.length,
        +            set = this,
        +            iNoClone = l - 1,
        +            value = args[0],
        +            isFunction = jQuery.isFunction( value );
        +
        +        // We can't cloneNode fragments that contain checked, in WebKit
        +        if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
        +            return this.each(function( index ) {
        +                var self = set.eq( index );
        +                if ( isFunction ) {
        +                    args[0] = value.call( this, index, table ? self.html() : undefined );
        +                }
        +                self.domManip( args, table, callback );
        +            });
        +        }
        +
        +        if ( l ) {
        +            fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
        +            first = fragment.firstChild;
        +
        +            if ( fragment.childNodes.length === 1 ) {
        +                fragment = first;
        +            }
        +
        +            if ( first ) {
        +                table = table && jQuery.nodeName( first, "tr" );
        +                scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
        +                hasScripts = scripts.length;
        +
        +                // Use the original fragment for the last item instead of the first because it can end up
        +                // being emptied incorrectly in certain situations (#8070).
        +                for ( ; i < l; i++ ) {
        +                    node = fragment;
        +
        +                    if ( i !== iNoClone ) {
        +                        node = jQuery.clone( node, true, true );
        +
        +                        // Keep references to cloned scripts for later restoration
        +                        if ( hasScripts ) {
        +                            jQuery.merge( scripts, getAll( node, "script" ) );
        +                        }
        +                    }
        +
        +                    callback.call(
        +                        table && jQuery.nodeName( this[i], "table" ) ?
        +                            findOrAppend( this[i], "tbody" ) :
        +                            this[i],
        +                        node,
        +                        i
        +                    );
        +                }
        +
        +                if ( hasScripts ) {
        +                    doc = scripts[ scripts.length - 1 ].ownerDocument;
        +
        +                    // Reenable scripts
        +                    jQuery.map( scripts, restoreScript );
        +
        +                    // Evaluate executable scripts on first document insertion
        +                    for ( i = 0; i < hasScripts; i++ ) {
        +                        node = scripts[ i ];
        +                        if ( rscriptType.test( node.type || "" ) &&
        +                            !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
        +
        +                            if ( node.src ) {
        +                                // Hope ajax is available...
        +                                jQuery.ajax({
        +                                    url: node.src,
        +                                    type: "GET",
        +                                    dataType: "script",
        +                                    async: false,
        +                                    global: false,
        +                                    "throws": true
        +                                });
        +                            } else {
        +                                jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                // Fix #11809: Avoid leaking memory
        +                fragment = first = null;
        +            }
        +        }
        +
        +        return this;
        +    }
        +});
        +
        +function findOrAppend( elem, tag ) {
        +    return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
        +}
        +
        +// Replace/restore the type attribute of script elements for safe DOM manipulation
        +function disableScript( elem ) {
        +    var attr = elem.getAttributeNode("type");
        +    elem.type = ( attr && attr.specified ) + "/" + elem.type;
        +    return elem;
        +}
        +function restoreScript( elem ) {
        +    var match = rscriptTypeMasked.exec( elem.type );
        +    if ( match ) {
        +        elem.type = match[1];
        +    } else {
        +        elem.removeAttribute("type");
        +    }
        +    return elem;
        +}
        +
        +// Mark scripts as having already been evaluated
        +function setGlobalEval( elems, refElements ) {
        +    var elem,
        +        i = 0;
        +    for ( ; (elem = elems[i]) != null; i++ ) {
        +        jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
        +    }
        +}
        +
        +function cloneCopyEvent( src, dest ) {
        +
        +    if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
        +        return;
        +    }
        +
        +    var type, i, l,
        +        oldData = jQuery._data( src ),
        +        curData = jQuery._data( dest, oldData ),
        +        events = oldData.events;
        +
        +    if ( events ) {
        +        delete curData.handle;
        +        curData.events = {};
        +
        +        for ( type in events ) {
        +            for ( i = 0, l = events[ type ].length; i < l; i++ ) {
        +                jQuery.event.add( dest, type, events[ type ][ i ] );
        +            }
        +        }
        +    }
        +
        +    // make the cloned public data object a copy from the original
        +    if ( curData.data ) {
        +        curData.data = jQuery.extend( {}, curData.data );
        +    }
        +}
        +
        +function fixCloneNodeIssues( src, dest ) {
        +    var nodeName, e, data;
        +
        +    // We do not need to do anything for non-Elements
        +    if ( dest.nodeType !== 1 ) {
        +        return;
        +    }
        +
        +    nodeName = dest.nodeName.toLowerCase();
        +
        +    // IE6-8 copies events bound via attachEvent when using cloneNode.
        +    if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
        +        data = jQuery._data( dest );
        +
        +        for ( e in data.events ) {
        +            jQuery.removeEvent( dest, e, data.handle );
        +        }
        +
        +        // Event data gets referenced instead of copied if the expando gets copied too
        +        dest.removeAttribute( jQuery.expando );
        +    }
        +
        +    // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
        +    if ( nodeName === "script" && dest.text !== src.text ) {
        +        disableScript( dest ).text = src.text;
        +        restoreScript( dest );
        +
        +    // IE6-10 improperly clones children of object elements using classid.
        +    // IE10 throws NoModificationAllowedError if parent is null, #12132.
        +    } else if ( nodeName === "object" ) {
        +        if ( dest.parentNode ) {
        +            dest.outerHTML = src.outerHTML;
        +        }
        +
        +        // This path appears unavoidable for IE9. When cloning an object
        +        // element in IE9, the outerHTML strategy above is not sufficient.
        +        // If the src has innerHTML and the destination does not,
        +        // copy the src.innerHTML into the dest.innerHTML. #10324
        +        if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
        +            dest.innerHTML = src.innerHTML;
        +        }
        +
        +    } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
        +        // IE6-8 fails to persist the checked state of a cloned checkbox
        +        // or radio button. Worse, IE6-7 fail to give the cloned element
        +        // a checked appearance if the defaultChecked value isn't also set
        +
        +        dest.defaultChecked = dest.checked = src.checked;
        +
        +        // IE6-7 get confused and end up setting the value of a cloned
        +        // checkbox/radio button to an empty string instead of "on"
        +        if ( dest.value !== src.value ) {
        +            dest.value = src.value;
        +        }
        +
        +    // IE6-8 fails to return the selected option to the default selected
        +    // state when cloning options
        +    } else if ( nodeName === "option" ) {
        +        dest.defaultSelected = dest.selected = src.defaultSelected;
        +
        +    // IE6-8 fails to set the defaultValue to the correct value when
        +    // cloning other types of input fields
        +    } else if ( nodeName === "input" || nodeName === "textarea" ) {
        +        dest.defaultValue = src.defaultValue;
        +    }
        +}
        +
        +jQuery.each({
        +    appendTo: "append",
        +    prependTo: "prepend",
        +    insertBefore: "before",
        +    insertAfter: "after",
        +    replaceAll: "replaceWith"
        +}, function( name, original ) {
        +    jQuery.fn[ name ] = function( selector ) {
        +        var elems,
        +            i = 0,
        +            ret = [],
        +            insert = jQuery( selector ),
        +            last = insert.length - 1;
        +
        +        for ( ; i <= last; i++ ) {
        +            elems = i === last ? this : this.clone(true);
        +            jQuery( insert[i] )[ original ]( elems );
        +
        +            // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
        +            core_push.apply( ret, elems.get() );
        +        }
        +
        +        return this.pushStack( ret );
        +    };
        +});
        +
        +function getAll( context, tag ) {
        +    var elems, elem,
        +        i = 0,
        +        found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
        +            typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
        +            undefined;
        +
        +    if ( !found ) {
        +        for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
        +            if ( !tag || jQuery.nodeName( elem, tag ) ) {
        +                found.push( elem );
        +            } else {
        +                jQuery.merge( found, getAll( elem, tag ) );
        +            }
        +        }
        +    }
        +
        +    return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
        +        jQuery.merge( [ context ], found ) :
        +        found;
        +}
        +
        +// Used in buildFragment, fixes the defaultChecked property
        +function fixDefaultChecked( elem ) {
        +    if ( manipulation_rcheckableType.test( elem.type ) ) {
        +        elem.defaultChecked = elem.checked;
        +    }
        +}
        +
        +jQuery.extend({
        +    clone: function( elem, dataAndEvents, deepDataAndEvents ) {
        +        var destElements, node, clone, i, srcElements,
        +            inPage = jQuery.contains( elem.ownerDocument, elem );
        +
        +        if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
        +            clone = elem.cloneNode( true );
        +
        +        // IE<=8 does not properly clone detached, unknown element nodes
        +        } else {
        +            fragmentDiv.innerHTML = elem.outerHTML;
        +            fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
        +        }
        +
        +        if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
        +                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
        +
        +            // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
        +            destElements = getAll( clone );
        +            srcElements = getAll( elem );
        +
        +            // Fix all IE cloning issues
        +            for ( i = 0; (node = srcElements[i]) != null; ++i ) {
        +                // Ensure that the destination node is not null; Fixes #9587
        +                if ( destElements[i] ) {
        +                    fixCloneNodeIssues( node, destElements[i] );
        +                }
        +            }
        +        }
        +
        +        // Copy the events from the original to the clone
        +        if ( dataAndEvents ) {
        +            if ( deepDataAndEvents ) {
        +                srcElements = srcElements || getAll( elem );
        +                destElements = destElements || getAll( clone );
        +
        +                for ( i = 0; (node = srcElements[i]) != null; i++ ) {
        +                    cloneCopyEvent( node, destElements[i] );
        +                }
        +            } else {
        +                cloneCopyEvent( elem, clone );
        +            }
        +        }
        +
        +        // Preserve script evaluation history
        +        destElements = getAll( clone, "script" );
        +        if ( destElements.length > 0 ) {
        +            setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
        +        }
        +
        +        destElements = srcElements = node = null;
        +
        +        // Return the cloned set
        +        return clone;
        +    },
        +
        +    buildFragment: function( elems, context, scripts, selection ) {
        +        var j, elem, contains,
        +            tmp, tag, tbody, wrap,
        +            l = elems.length,
        +
        +            // Ensure a safe fragment
        +            safe = createSafeFragment( context ),
        +
        +            nodes = [],
        +            i = 0;
        +
        +        for ( ; i < l; i++ ) {
        +            elem = elems[ i ];
        +
        +            if ( elem || elem === 0 ) {
        +
        +                // Add nodes directly
        +                if ( jQuery.type( elem ) === "object" ) {
        +                    jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
        +
        +                // Convert non-html into a text node
        +                } else if ( !rhtml.test( elem ) ) {
        +                    nodes.push( context.createTextNode( elem ) );
        +
        +                // Convert html into DOM nodes
        +                } else {
        +                    tmp = tmp || safe.appendChild( context.createElement("div") );
        +
        +                    // Deserialize a standard representation
        +                    tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
        +                    wrap = wrapMap[ tag ] || wrapMap._default;
        +
        +                    tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
        +
        +                    // Descend through wrappers to the right content
        +                    j = wrap[0];
        +                    while ( j-- ) {
        +                        tmp = tmp.lastChild;
        +                    }
        +
        +                    // Manually add leading whitespace removed by IE
        +                    if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
        +                        nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
        +                    }
        +
        +                    // Remove IE's autoinserted <tbody> from table fragments
        +                    if ( !jQuery.support.tbody ) {
        +
        +                        // String was a <table>, *may* have spurious <tbody>
        +                        elem = tag === "table" && !rtbody.test( elem ) ?
        +                            tmp.firstChild :
        +
        +                            // String was a bare <thead> or <tfoot>
        +                            wrap[1] === "<table>" && !rtbody.test( elem ) ?
        +                                tmp :
        +                                0;
        +
        +                        j = elem && elem.childNodes.length;
        +                        while ( j-- ) {
        +                            if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
        +                                elem.removeChild( tbody );
        +                            }
        +                        }
        +                    }
        +
        +                    jQuery.merge( nodes, tmp.childNodes );
        +
        +                    // Fix #12392 for WebKit and IE > 9
        +                    tmp.textContent = "";
        +
        +                    // Fix #12392 for oldIE
        +                    while ( tmp.firstChild ) {
        +                        tmp.removeChild( tmp.firstChild );
        +                    }
        +
        +                    // Remember the top-level container for proper cleanup
        +                    tmp = safe.lastChild;
        +                }
        +            }
        +        }
        +
        +        // Fix #11356: Clear elements from fragment
        +        if ( tmp ) {
        +            safe.removeChild( tmp );
        +        }
        +
        +        // Reset defaultChecked for any radios and checkboxes
        +        // about to be appended to the DOM in IE 6/7 (#8060)
        +        if ( !jQuery.support.appendChecked ) {
        +            jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
        +        }
        +
        +        i = 0;
        +        while ( (elem = nodes[ i++ ]) ) {
        +
        +            // #4087 - If origin and destination elements are the same, and this is
        +            // that element, do not do anything
        +            if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
        +                continue;
        +            }
        +
        +            contains = jQuery.contains( elem.ownerDocument, elem );
        +
        +            // Append to fragment
        +            tmp = getAll( safe.appendChild( elem ), "script" );
        +
        +            // Preserve script evaluation history
        +            if ( contains ) {
        +                setGlobalEval( tmp );
        +            }
        +
        +            // Capture executables
        +            if ( scripts ) {
        +                j = 0;
        +                while ( (elem = tmp[ j++ ]) ) {
        +                    if ( rscriptType.test( elem.type || "" ) ) {
        +                        scripts.push( elem );
        +                    }
        +                }
        +            }
        +        }
        +
        +        tmp = null;
        +
        +        return safe;
        +    },
        +
        +    cleanData: function( elems, /* internal */ acceptData ) {
        +        var elem, type, id, data,
        +            i = 0,
        +            internalKey = jQuery.expando,
        +            cache = jQuery.cache,
        +            deleteExpando = jQuery.support.deleteExpando,
        +            special = jQuery.event.special;
        +
        +        for ( ; (elem = elems[i]) != null; i++ ) {
        +
        +            if ( acceptData || jQuery.acceptData( elem ) ) {
        +
        +                id = elem[ internalKey ];
        +                data = id && cache[ id ];
        +
        +                if ( data ) {
        +                    if ( data.events ) {
        +                        for ( type in data.events ) {
        +                            if ( special[ type ] ) {
        +                                jQuery.event.remove( elem, type );
        +
        +                            // This is a shortcut to avoid jQuery.event.remove's overhead
        +                            } else {
        +                                jQuery.removeEvent( elem, type, data.handle );
        +                            }
        +                        }
        +                    }
        +
        +                    // Remove cache only if it was not already removed by jQuery.event.remove
        +                    if ( cache[ id ] ) {
        +
        +                        delete cache[ id ];
        +
        +                        // IE does not allow us to delete expando properties from nodes,
        +                        // nor does it have a removeAttribute function on Document nodes;
        +                        // we must handle all of these cases
        +                        if ( deleteExpando ) {
        +                            delete elem[ internalKey ];
        +
        +                        } else if ( typeof elem.removeAttribute !== core_strundefined ) {
        +                            elem.removeAttribute( internalKey );
        +
        +                        } else {
        +                            elem[ internalKey ] = null;
        +                        }
        +
        +                        core_deletedIds.push( id );
        +                    }
        +                }
        +            }
        +        }
        +    }
        +});
        +var iframe, getStyles, curCSS,
        +    ralpha = /alpha\([^)]*\)/i,
        +    ropacity = /opacity\s*=\s*([^)]*)/,
        +    rposition = /^(top|right|bottom|left)$/,
        +    // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
        +    // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        +    rdisplayswap = /^(none|table(?!-c[ea]).+)/,
        +    rmargin = /^margin/,
        +    rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
        +    rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
        +    rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
        +    elemdisplay = { BODY: "block" },
        +
        +    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        +    cssNormalTransform = {
        +        letterSpacing: 0,
        +        fontWeight: 400
        +    },
        +
        +    cssExpand = [ "Top", "Right", "Bottom", "Left" ],
        +    cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
        +
        +// return a css property mapped to a potentially vendor prefixed property
        +function vendorPropName( style, name ) {
        +
        +    // shortcut for names that are not vendor prefixed
        +    if ( name in style ) {
        +        return name;
        +    }
        +
        +    // check for vendor prefixed names
        +    var capName = name.charAt(0).toUpperCase() + name.slice(1),
        +        origName = name,
        +        i = cssPrefixes.length;
        +
        +    while ( i-- ) {
        +        name = cssPrefixes[ i ] + capName;
        +        if ( name in style ) {
        +            return name;
        +        }
        +    }
        +
        +    return origName;
        +}
        +
        +function isHidden( elem, el ) {
        +    // isHidden might be called from jQuery#filter function;
        +    // in that case, element will be second argument
        +    elem = el || elem;
        +    return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
        +}
        +
        +function showHide( elements, show ) {
        +    var display, elem, hidden,
        +        values = [],
        +        index = 0,
        +        length = elements.length;
        +
        +    for ( ; index < length; index++ ) {
        +        elem = elements[ index ];
        +        if ( !elem.style ) {
        +            continue;
        +        }
        +
        +        values[ index ] = jQuery._data( elem, "olddisplay" );
        +        display = elem.style.display;
        +        if ( show ) {
        +            // Reset the inline display of this element to learn if it is
        +            // being hidden by cascaded rules or not
        +            if ( !values[ index ] && display === "none" ) {
        +                elem.style.display = "";
        +            }
        +
        +            // Set elements which have been overridden with display: none
        +            // in a stylesheet to whatever the default browser style is
        +            // for such an element
        +            if ( elem.style.display === "" && isHidden( elem ) ) {
        +                values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
        +            }
        +        } else {
        +
        +            if ( !values[ index ] ) {
        +                hidden = isHidden( elem );
        +
        +                if ( display && display !== "none" || !hidden ) {
        +                    jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
        +                }
        +            }
        +        }
        +    }
        +
        +    // Set the display of most of the elements in a second loop
        +    // to avoid the constant reflow
        +    for ( index = 0; index < length; index++ ) {
        +        elem = elements[ index ];
        +        if ( !elem.style ) {
        +            continue;
        +        }
        +        if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
        +            elem.style.display = show ? values[ index ] || "" : "none";
        +        }
        +    }
        +
        +    return elements;
        +}
        +
        +jQuery.fn.extend({
        +    css: function( name, value ) {
        +        return jQuery.access( this, function( elem, name, value ) {
        +            var len, styles,
        +                map = {},
        +                i = 0;
        +
        +            if ( jQuery.isArray( name ) ) {
        +                styles = getStyles( elem );
        +                len = name.length;
        +
        +                for ( ; i < len; i++ ) {
        +                    map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
        +                }
        +
        +                return map;
        +            }
        +
        +            return value !== undefined ?
        +                jQuery.style( elem, name, value ) :
        +                jQuery.css( elem, name );
        +        }, name, value, arguments.length > 1 );
        +    },
        +    show: function() {
        +        return showHide( this, true );
        +    },
        +    hide: function() {
        +        return showHide( this );
        +    },
        +    toggle: function( state ) {
        +        var bool = typeof state === "boolean";
        +
        +        return this.each(function() {
        +            if ( bool ? state : isHidden( this ) ) {
        +                jQuery( this ).show();
        +            } else {
        +                jQuery( this ).hide();
        +            }
        +        });
        +    }
        +});
        +
        +jQuery.extend({
        +    // Add in style property hooks for overriding the default
        +    // behavior of getting and setting a style property
        +    cssHooks: {
        +        opacity: {
        +            get: function( elem, computed ) {
        +                if ( computed ) {
        +                    // We should always get a number back from opacity
        +                    var ret = curCSS( elem, "opacity" );
        +                    return ret === "" ? "1" : ret;
        +                }
        +            }
        +        }
        +    },
        +
        +    // Exclude the following css properties to add px
        +    cssNumber: {
        +        "columnCount": true,
        +        "fillOpacity": true,
        +        "fontWeight": true,
        +        "lineHeight": true,
        +        "opacity": true,
        +        "orphans": true,
        +        "widows": true,
        +        "zIndex": true,
        +        "zoom": true
        +    },
        +
        +    // Add in properties whose names you wish to fix before
        +    // setting or getting the value
        +    cssProps: {
        +        // normalize float css property
        +        "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
        +    },
        +
        +    // Get and set the style property on a DOM Node
        +    style: function( elem, name, value, extra ) {
        +        // Don't set styles on text and comment nodes
        +        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        +            return;
        +        }
        +
        +        // Make sure that we're working with the right name
        +        var ret, type, hooks,
        +            origName = jQuery.camelCase( name ),
        +            style = elem.style;
        +
        +        name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
        +
        +        // gets hook for the prefixed version
        +        // followed by the unprefixed version
        +        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +        // Check if we're setting a value
        +        if ( value !== undefined ) {
        +            type = typeof value;
        +
        +            // convert relative number strings (+= or -=) to relative numbers. #7345
        +            if ( type === "string" && (ret = rrelNum.exec( value )) ) {
        +                value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
        +                // Fixes bug #9237
        +                type = "number";
        +            }
        +
        +            // Make sure that NaN and null values aren't set. See: #7116
        +            if ( value == null || type === "number" && isNaN( value ) ) {
        +                return;
        +            }
        +
        +            // If a number was passed in, add 'px' to the (except for certain CSS properties)
        +            if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
        +                value += "px";
        +            }
        +
        +            // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
        +            // but it would mean to define eight (for every problematic property) identical functions
        +            if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
        +                style[ name ] = "inherit";
        +            }
        +
        +            // If a hook was provided, use that value, otherwise just set the specified value
        +            if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
        +
        +                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
        +                // Fixes bug #5509
        +                try {
        +                    style[ name ] = value;
        +                } catch(e) {}
        +            }
        +
        +        } else {
        +            // If a hook was provided get the non-computed value from there
        +            if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
        +                return ret;
        +            }
        +
        +            // Otherwise just get the value from the style object
        +            return style[ name ];
        +        }
        +    },
        +
        +    css: function( elem, name, extra, styles ) {
        +        var num, val, hooks,
        +            origName = jQuery.camelCase( name );
        +
        +        // Make sure that we're working with the right name
        +        name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
        +
        +        // gets hook for the prefixed version
        +        // followed by the unprefixed version
        +        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +        // If a hook was provided get the computed value from there
        +        if ( hooks && "get" in hooks ) {
        +            val = hooks.get( elem, true, extra );
        +        }
        +
        +        // Otherwise, if a way to get the computed value exists, use that
        +        if ( val === undefined ) {
        +            val = curCSS( elem, name, styles );
        +        }
        +
        +        //convert "normal" to computed value
        +        if ( val === "normal" && name in cssNormalTransform ) {
        +            val = cssNormalTransform[ name ];
        +        }
        +
        +        // Return, converting to number if forced or a qualifier was provided and val looks numeric
        +        if ( extra === "" || extra ) {
        +            num = parseFloat( val );
        +            return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
        +        }
        +        return val;
        +    },
        +
        +    // A method for quickly swapping in/out CSS properties to get correct calculations
        +    swap: function( elem, options, callback, args ) {
        +        var ret, name,
        +            old = {};
        +
        +        // Remember the old values, and insert the new ones
        +        for ( name in options ) {
        +            old[ name ] = elem.style[ name ];
        +            elem.style[ name ] = options[ name ];
        +        }
        +
        +        ret = callback.apply( elem, args || [] );
        +
        +        // Revert the old values
        +        for ( name in options ) {
        +            elem.style[ name ] = old[ name ];
        +        }
        +
        +        return ret;
        +    }
        +});
        +
        +// NOTE: we've included the "window" in window.getComputedStyle
        +// because jsdom on node.js will break without it.
        +if ( window.getComputedStyle ) {
        +    getStyles = function( elem ) {
        +        return window.getComputedStyle( elem, null );
        +    };
        +
        +    curCSS = function( elem, name, _computed ) {
        +        var width, minWidth, maxWidth,
        +            computed = _computed || getStyles( elem ),
        +
        +            // getPropertyValue is only needed for .css('filter') in IE9, see #12537
        +            ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
        +            style = elem.style;
        +
        +        if ( computed ) {
        +
        +            if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
        +                ret = jQuery.style( elem, name );
        +            }
        +
        +            // A tribute to the "awesome hack by Dean Edwards"
        +            // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
        +            // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
        +            // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
        +            if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
        +
        +                // Remember the original values
        +                width = style.width;
        +                minWidth = style.minWidth;
        +                maxWidth = style.maxWidth;
        +
        +                // Put in the new values to get a computed value out
        +                style.minWidth = style.maxWidth = style.width = ret;
        +                ret = computed.width;
        +
        +                // Revert the changed values
        +                style.width = width;
        +                style.minWidth = minWidth;
        +                style.maxWidth = maxWidth;
        +            }
        +        }
        +
        +        return ret;
        +    };
        +} else if ( document.documentElement.currentStyle ) {
        +    getStyles = function( elem ) {
        +        return elem.currentStyle;
        +    };
        +
        +    curCSS = function( elem, name, _computed ) {
        +        var left, rs, rsLeft,
        +            computed = _computed || getStyles( elem ),
        +            ret = computed ? computed[ name ] : undefined,
        +            style = elem.style;
        +
        +        // Avoid setting ret to empty string here
        +        // so we don't default to auto
        +        if ( ret == null && style && style[ name ] ) {
        +            ret = style[ name ];
        +        }
        +
        +        // From the awesome hack by Dean Edwards
        +        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
        +
        +        // If we're not dealing with a regular pixel number
        +        // but a number that has a weird ending, we need to convert it to pixels
        +        // but not position css attributes, as those are proportional to the parent element instead
        +        // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
        +        if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
        +
        +            // Remember the original values
        +            left = style.left;
        +            rs = elem.runtimeStyle;
        +            rsLeft = rs && rs.left;
        +
        +            // Put in the new values to get a computed value out
        +            if ( rsLeft ) {
        +                rs.left = elem.currentStyle.left;
        +            }
        +            style.left = name === "fontSize" ? "1em" : ret;
        +            ret = style.pixelLeft + "px";
        +
        +            // Revert the changed values
        +            style.left = left;
        +            if ( rsLeft ) {
        +                rs.left = rsLeft;
        +            }
        +        }
        +
        +        return ret === "" ? "auto" : ret;
        +    };
        +}
        +
        +function setPositiveNumber( elem, value, subtract ) {
        +    var matches = rnumsplit.exec( value );
        +    return matches ?
        +        // Guard against undefined "subtract", e.g., when used as in cssHooks
        +        Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
        +        value;
        +}
        +
        +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
        +    var i = extra === ( isBorderBox ? "border" : "content" ) ?
        +        // If we already have the right measurement, avoid augmentation
        +        4 :
        +        // Otherwise initialize for horizontal or vertical properties
        +        name === "width" ? 1 : 0,
        +
        +        val = 0;
        +
        +    for ( ; i < 4; i += 2 ) {
        +        // both box models exclude margin, so add it if we want it
        +        if ( extra === "margin" ) {
        +            val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
        +        }
        +
        +        if ( isBorderBox ) {
        +            // border-box includes padding, so remove it if we want content
        +            if ( extra === "content" ) {
        +                val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +            }
        +
        +            // at this point, extra isn't border nor margin, so remove border
        +            if ( extra !== "margin" ) {
        +                val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +            }
        +        } else {
        +            // at this point, extra isn't content, so add padding
        +            val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +
        +            // at this point, extra isn't content nor padding, so add border
        +            if ( extra !== "padding" ) {
        +                val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +            }
        +        }
        +    }
        +
        +    return val;
        +}
        +
        +function getWidthOrHeight( elem, name, extra ) {
        +
        +    // Start with offset property, which is equivalent to the border-box value
        +    var valueIsBorderBox = true,
        +        val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
        +        styles = getStyles( elem ),
        +        isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
        +
        +    // some non-html elements return undefined for offsetWidth, so check for null/undefined
        +    // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        +    // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        +    if ( val <= 0 || val == null ) {
        +        // Fall back to computed then uncomputed css if necessary
        +        val = curCSS( elem, name, styles );
        +        if ( val < 0 || val == null ) {
        +            val = elem.style[ name ];
        +        }
        +
        +        // Computed unit is not pixels. Stop here and return.
        +        if ( rnumnonpx.test(val) ) {
        +            return val;
        +        }
        +
        +        // we need the check for style in case a browser which returns unreliable values
        +        // for getComputedStyle silently falls back to the reliable elem.style
        +        valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
        +
        +        // Normalize "", auto, and prepare for extra
        +        val = parseFloat( val ) || 0;
        +    }
        +
        +    // use the active box-sizing model to add/subtract irrelevant styles
        +    return ( val +
        +        augmentWidthOrHeight(
        +            elem,
        +            name,
        +            extra || ( isBorderBox ? "border" : "content" ),
        +            valueIsBorderBox,
        +            styles
        +        )
        +    ) + "px";
        +}
        +
        +// Try to determine the default display value of an element
        +function css_defaultDisplay( nodeName ) {
        +    var doc = document,
        +        display = elemdisplay[ nodeName ];
        +
        +    if ( !display ) {
        +        display = actualDisplay( nodeName, doc );
        +
        +        // If the simple way fails, read from inside an iframe
        +        if ( display === "none" || !display ) {
        +            // Use the already-created iframe if possible
        +            iframe = ( iframe ||
        +                jQuery("<iframe frameborder='0' width='0' height='0'/>")
        +                .css( "cssText", "display:block !important" )
        +            ).appendTo( doc.documentElement );
        +
        +            // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
        +            doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
        +            doc.write("<!doctype html><html><body>");
        +            doc.close();
        +
        +            display = actualDisplay( nodeName, doc );
        +            iframe.detach();
        +        }
        +
        +        // Store the correct default display
        +        elemdisplay[ nodeName ] = display;
        +    }
        +
        +    return display;
        +}
        +
        +// Called ONLY from within css_defaultDisplay
        +function actualDisplay( name, doc ) {
        +    var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
        +        display = jQuery.css( elem[0], "display" );
        +    elem.remove();
        +    return display;
        +}
        +
        +jQuery.each([ "height", "width" ], function( i, name ) {
        +    jQuery.cssHooks[ name ] = {
        +        get: function( elem, computed, extra ) {
        +            if ( computed ) {
        +                // certain elements can have dimension info if we invisibly show them
        +                // however, it must have a current display style that would benefit from this
        +                return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
        +                    jQuery.swap( elem, cssShow, function() {
        +                        return getWidthOrHeight( elem, name, extra );
        +                    }) :
        +                    getWidthOrHeight( elem, name, extra );
        +            }
        +        },
        +
        +        set: function( elem, value, extra ) {
        +            var styles = extra && getStyles( elem );
        +            return setPositiveNumber( elem, value, extra ?
        +                augmentWidthOrHeight(
        +                    elem,
        +                    name,
        +                    extra,
        +                    jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
        +                    styles
        +                ) : 0
        +            );
        +        }
        +    };
        +});
        +
        +if ( !jQuery.support.opacity ) {
        +    jQuery.cssHooks.opacity = {
        +        get: function( elem, computed ) {
        +            // IE uses filters for opacity
        +            return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
        +                ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
        +                computed ? "1" : "";
        +        },
        +
        +        set: function( elem, value ) {
        +            var style = elem.style,
        +                currentStyle = elem.currentStyle,
        +                opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
        +                filter = currentStyle && currentStyle.filter || style.filter || "";
        +
        +            // IE has trouble with opacity if it does not have layout
        +            // Force it by setting the zoom level
        +            style.zoom = 1;
        +
        +            // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
        +            // if value === "", then remove inline opacity #12685
        +            if ( ( value >= 1 || value === "" ) &&
        +                    jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
        +                    style.removeAttribute ) {
        +
        +                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
        +                // if "filter:" is present at all, clearType is disabled, we want to avoid this
        +                // style.removeAttribute is IE Only, but so apparently is this code path...
        +                style.removeAttribute( "filter" );
        +
        +                // if there is no filter style applied in a css rule or unset inline opacity, we are done
        +                if ( value === "" || currentStyle && !currentStyle.filter ) {
        +                    return;
        +                }
        +            }
        +
        +            // otherwise, set new filter values
        +            style.filter = ralpha.test( filter ) ?
        +                filter.replace( ralpha, opacity ) :
        +                filter + " " + opacity;
        +        }
        +    };
        +}
        +
        +// These hooks cannot be added until DOM ready because the support test
        +// for it is not run until after DOM ready
        +jQuery(function() {
        +    if ( !jQuery.support.reliableMarginRight ) {
        +        jQuery.cssHooks.marginRight = {
        +            get: function( elem, computed ) {
        +                if ( computed ) {
        +                    // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +                    // Work around by temporarily setting element display to inline-block
        +                    return jQuery.swap( elem, { "display": "inline-block" },
        +                        curCSS, [ elem, "marginRight" ] );
        +                }
        +            }
        +        };
        +    }
        +
        +    // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
        +    // getComputedStyle returns percent when specified for top/left/bottom/right
        +    // rather than make the css module depend on the offset module, we just check for it here
        +    if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
        +        jQuery.each( [ "top", "left" ], function( i, prop ) {
        +            jQuery.cssHooks[ prop ] = {
        +                get: function( elem, computed ) {
        +                    if ( computed ) {
        +                        computed = curCSS( elem, prop );
        +                        // if curCSS returns percentage, fallback to offset
        +                        return rnumnonpx.test( computed ) ?
        +                            jQuery( elem ).position()[ prop ] + "px" :
        +                            computed;
        +                    }
        +                }
        +            };
        +        });
        +    }
        +
        +});
        +
        +if ( jQuery.expr && jQuery.expr.filters ) {
        +    jQuery.expr.filters.hidden = function( elem ) {
        +        // Support: Opera <= 12.12
        +        // Opera reports offsetWidths and offsetHeights less than zero on some elements
        +        return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
        +            (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
        +    };
        +
        +    jQuery.expr.filters.visible = function( elem ) {
        +        return !jQuery.expr.filters.hidden( elem );
        +    };
        +}
        +
        +// These hooks are used by animate to expand properties
        +jQuery.each({
        +    margin: "",
        +    padding: "",
        +    border: "Width"
        +}, function( prefix, suffix ) {
        +    jQuery.cssHooks[ prefix + suffix ] = {
        +        expand: function( value ) {
        +            var i = 0,
        +                expanded = {},
        +
        +                // assumes a single number if not a string
        +                parts = typeof value === "string" ? value.split(" ") : [ value ];
        +
        +            for ( ; i < 4; i++ ) {
        +                expanded[ prefix + cssExpand[ i ] + suffix ] =
        +                    parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
        +            }
        +
        +            return expanded;
        +        }
        +    };
        +
        +    if ( !rmargin.test( prefix ) ) {
        +        jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
        +    }
        +});
        +var r20 = /%20/g,
        +    rbracket = /\[\]$/,
        +    rCRLF = /\r?\n/g,
        +    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
        +    rsubmittable = /^(?:input|select|textarea|keygen)/i;
        +
        +jQuery.fn.extend({
        +    serialize: function() {
        +        return jQuery.param( this.serializeArray() );
        +    },
        +    serializeArray: function() {
        +        return this.map(function(){
        +            // Can add propHook for "elements" to filter or add form elements
        +            var elements = jQuery.prop( this, "elements" );
        +            return elements ? jQuery.makeArray( elements ) : this;
        +        })
        +        .filter(function(){
        +            var type = this.type;
        +            // Use .is(":disabled") so that fieldset[disabled] works
        +            return this.name && !jQuery( this ).is( ":disabled" ) &&
        +                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
        +                ( this.checked || !manipulation_rcheckableType.test( type ) );
        +        })
        +        .map(function( i, elem ){
        +            var val = jQuery( this ).val();
        +
        +            return val == null ?
        +                null :
        +                jQuery.isArray( val ) ?
        +                    jQuery.map( val, function( val ){
        +                        return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +                    }) :
        +                    { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +        }).get();
        +    }
        +});
        +
        +//Serialize an array of form elements or a set of
        +//key/values into a query string
        +jQuery.param = function( a, traditional ) {
        +    var prefix,
        +        s = [],
        +        add = function( key, value ) {
        +            // If value is a function, invoke it and return its value
        +            value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
        +            s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
        +        };
        +
        +    // Set traditional to true for jQuery <= 1.3.3 behavior.
        +    if ( traditional === undefined ) {
        +        traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
        +    }
        +
        +    // If an array was passed in, assume that it is an array of form elements.
        +    if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        +        // Serialize the form elements
        +        jQuery.each( a, function() {
        +            add( this.name, this.value );
        +        });
        +
        +    } else {
        +        // If traditional, encode the "old" way (the way 1.3.3 or older
        +        // did it), otherwise encode params recursively.
        +        for ( prefix in a ) {
        +            buildParams( prefix, a[ prefix ], traditional, add );
        +        }
        +    }
        +
        +    // Return the resulting serialization
        +    return s.join( "&" ).replace( r20, "+" );
        +};
        +
        +function buildParams( prefix, obj, traditional, add ) {
        +    var name;
        +
        +    if ( jQuery.isArray( obj ) ) {
        +        // Serialize array item.
        +        jQuery.each( obj, function( i, v ) {
        +            if ( traditional || rbracket.test( prefix ) ) {
        +                // Treat each array item as a scalar.
        +                add( prefix, v );
        +
        +            } else {
        +                // Item is non-scalar (array or object), encode its numeric index.
        +                buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
        +            }
        +        });
        +
        +    } else if ( !traditional && jQuery.type( obj ) === "object" ) {
        +        // Serialize object item.
        +        for ( name in obj ) {
        +            buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
        +        }
        +
        +    } else {
        +        // Serialize scalar item.
        +        add( prefix, obj );
        +    }
        +}
        +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
        +    "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
        +    "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
        +
        +    // Handle event binding
        +    jQuery.fn[ name ] = function( data, fn ) {
        +        return arguments.length > 0 ?
        +            this.on( name, null, data, fn ) :
        +            this.trigger( name );
        +    };
        +});
        +
        +jQuery.fn.hover = function( fnOver, fnOut ) {
        +    return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        +};
        +var
        +    // Document location
        +    ajaxLocParts,
        +    ajaxLocation,
        +    ajax_nonce = jQuery.now(),
        +
        +    ajax_rquery = /\?/,
        +    rhash = /#.*$/,
        +    rts = /([?&])_=[^&]*/,
        +    rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
        +    // #7653, #8125, #8152: local protocol detection
        +    rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        +    rnoContent = /^(?:GET|HEAD)$/,
        +    rprotocol = /^\/\//,
        +    rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
        +
        +    // Keep a copy of the old load method
        +    _load = jQuery.fn.load,
        +
        +    /* Prefilters
        +     * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
        +     * 2) These are called:
        +     *    - BEFORE asking for a transport
        +     *    - AFTER param serialization (s.data is a string if s.processData is true)
        +     * 3) key is the dataType
        +     * 4) the catchall symbol "*" can be used
        +     * 5) execution will start with transport dataType and THEN continue down to "*" if needed
        +     */
        +    prefilters = {},
        +
        +    /* Transports bindings
        +     * 1) key is the dataType
        +     * 2) the catchall symbol "*" can be used
        +     * 3) selection will start with transport dataType and THEN go to "*" if needed
        +     */
        +    transports = {},
        +
        +    // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        +    allTypes = "*/".concat("*");
        +
        +// #8138, IE may throw an exception when accessing
        +// a field from window.location if document.domain has been set
        +try {
        +    ajaxLocation = location.href;
        +} catch( e ) {
        +    // Use the href attribute of an A element
        +    // since IE will modify it given document.location
        +    ajaxLocation = document.createElement( "a" );
        +    ajaxLocation.href = "";
        +    ajaxLocation = ajaxLocation.href;
        +}
        +
        +// Segment location into parts
        +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
        +
        +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
        +function addToPrefiltersOrTransports( structure ) {
        +
        +    // dataTypeExpression is optional and defaults to "*"
        +    return function( dataTypeExpression, func ) {
        +
        +        if ( typeof dataTypeExpression !== "string" ) {
        +            func = dataTypeExpression;
        +            dataTypeExpression = "*";
        +        }
        +
        +        var dataType,
        +            i = 0,
        +            dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
        +
        +        if ( jQuery.isFunction( func ) ) {
        +            // For each dataType in the dataTypeExpression
        +            while ( (dataType = dataTypes[i++]) ) {
        +                // Prepend if requested
        +                if ( dataType[0] === "+" ) {
        +                    dataType = dataType.slice( 1 ) || "*";
        +                    (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
        +
        +                // Otherwise append
        +                } else {
        +                    (structure[ dataType ] = structure[ dataType ] || []).push( func );
        +                }
        +            }
        +        }
        +    };
        +}
        +
        +// Base inspection function for prefilters and transports
        +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
        +
        +    var inspected = {},
        +        seekingTransport = ( structure === transports );
        +
        +    function inspect( dataType ) {
        +        var selected;
        +        inspected[ dataType ] = true;
        +        jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
        +            var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
        +            if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
        +                options.dataTypes.unshift( dataTypeOrTransport );
        +                inspect( dataTypeOrTransport );
        +                return false;
        +            } else if ( seekingTransport ) {
        +                return !( selected = dataTypeOrTransport );
        +            }
        +        });
        +        return selected;
        +    }
        +
        +    return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
        +}
        +
        +// A special extend for ajax options
        +// that takes "flat" options (not to be deep extended)
        +// Fixes #9887
        +function ajaxExtend( target, src ) {
        +    var deep, key,
        +        flatOptions = jQuery.ajaxSettings.flatOptions || {};
        +
        +    for ( key in src ) {
        +        if ( src[ key ] !== undefined ) {
        +            ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
        +        }
        +    }
        +    if ( deep ) {
        +        jQuery.extend( true, target, deep );
        +    }
        +
        +    return target;
        +}
        +
        +jQuery.fn.load = function( url, params, callback ) {
        +    if ( typeof url !== "string" && _load ) {
        +        return _load.apply( this, arguments );
        +    }
        +
        +    var selector, response, type,
        +        self = this,
        +        off = url.indexOf(" ");
        +
        +    if ( off >= 0 ) {
        +        selector = url.slice( off, url.length );
        +        url = url.slice( 0, off );
        +    }
        +
        +    // If it's a function
        +    if ( jQuery.isFunction( params ) ) {
        +
        +        // We assume that it's the callback
        +        callback = params;
        +        params = undefined;
        +
        +    // Otherwise, build a param string
        +    } else if ( params && typeof params === "object" ) {
        +        type = "POST";
        +    }
        +
        +    // If we have elements to modify, make the request
        +    if ( self.length > 0 ) {
        +        jQuery.ajax({
        +            url: url,
        +
        +            // if "type" variable is undefined, then "GET" method will be used
        +            type: type,
        +            dataType: "html",
        +            data: params
        +        }).done(function( responseText ) {
        +
        +            // Save response for use in complete callback
        +            response = arguments;
        +
        +            self.html( selector ?
        +
        +                // If a selector was specified, locate the right elements in a dummy div
        +                // Exclude scripts to avoid IE 'Permission Denied' errors
        +                jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
        +
        +                // Otherwise use the full result
        +                responseText );
        +
        +        }).complete( callback && function( jqXHR, status ) {
        +            self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
        +        });
        +    }
        +
        +    return this;
        +};
        +
        +// Attach a bunch of functions for handling common AJAX events
        +jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
        +    jQuery.fn[ type ] = function( fn ){
        +        return this.on( type, fn );
        +    };
        +});
        +
        +jQuery.each( [ "get", "post" ], function( i, method ) {
        +    jQuery[ method ] = function( url, data, callback, type ) {
        +        // shift arguments if data argument was omitted
        +        if ( jQuery.isFunction( data ) ) {
        +            type = type || callback;
        +            callback = data;
        +            data = undefined;
        +        }
        +
        +        return jQuery.ajax({
        +            url: url,
        +            type: method,
        +            dataType: type,
        +            data: data,
        +            success: callback
        +        });
        +    };
        +});
        +
        +jQuery.extend({
        +
        +    // Counter for holding the number of active queries
        +    active: 0,
        +
        +    // Last-Modified header cache for next request
        +    lastModified: {},
        +    etag: {},
        +
        +    ajaxSettings: {
        +        url: ajaxLocation,
        +        type: "GET",
        +        isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
        +        global: true,
        +        processData: true,
        +        async: true,
        +        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        +        /*
        +        timeout: 0,
        +        data: null,
        +        dataType: null,
        +        username: null,
        +        password: null,
        +        cache: null,
        +        throws: false,
        +        traditional: false,
        +        headers: {},
        +        */
        +
        +        accepts: {
        +            "*": allTypes,
        +            text: "text/plain",
        +            html: "text/html",
        +            xml: "application/xml, text/xml",
        +            json: "application/json, text/javascript"
        +        },
        +
        +        contents: {
        +            xml: /xml/,
        +            html: /html/,
        +            json: /json/
        +        },
        +
        +        responseFields: {
        +            xml: "responseXML",
        +            text: "responseText"
        +        },
        +
        +        // Data converters
        +        // Keys separate source (or catchall "*") and destination types with a single space
        +        converters: {
        +
        +            // Convert anything to text
        +            "* text": window.String,
        +
        +            // Text to html (true = no transformation)
        +            "text html": true,
        +
        +            // Evaluate text as a json expression
        +            "text json": jQuery.parseJSON,
        +
        +            // Parse text as xml
        +            "text xml": jQuery.parseXML
        +        },
        +
        +        // For options that shouldn't be deep extended:
        +        // you can add your own custom options here if
        +        // and when you create one that shouldn't be
        +        // deep extended (see ajaxExtend)
        +        flatOptions: {
        +            url: true,
        +            context: true
        +        }
        +    },
        +
        +    // Creates a full fledged settings object into target
        +    // with both ajaxSettings and settings fields.
        +    // If target is omitted, writes into ajaxSettings.
        +    ajaxSetup: function( target, settings ) {
        +        return settings ?
        +
        +            // Building a settings object
        +            ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
        +
        +            // Extending ajaxSettings
        +            ajaxExtend( jQuery.ajaxSettings, target );
        +    },
        +
        +    ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        +    ajaxTransport: addToPrefiltersOrTransports( transports ),
        +
        +    // Main method
        +    ajax: function( url, options ) {
        +
        +        // If url is an object, simulate pre-1.5 signature
        +        if ( typeof url === "object" ) {
        +            options = url;
        +            url = undefined;
        +        }
        +
        +        // Force options to be an object
        +        options = options || {};
        +
        +        var // Cross-domain detection vars
        +            parts,
        +            // Loop variable
        +            i,
        +            // URL without anti-cache param
        +            cacheURL,
        +            // Response headers as string
        +            responseHeadersString,
        +            // timeout handle
        +            timeoutTimer,
        +
        +            // To know if global events are to be dispatched
        +            fireGlobals,
        +
        +            transport,
        +            // Response headers
        +            responseHeaders,
        +            // Create the final options object
        +            s = jQuery.ajaxSetup( {}, options ),
        +            // Callbacks context
        +            callbackContext = s.context || s,
        +            // Context for global events is callbackContext if it is a DOM node or jQuery collection
        +            globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
        +                jQuery( callbackContext ) :
        +                jQuery.event,
        +            // Deferreds
        +            deferred = jQuery.Deferred(),
        +            completeDeferred = jQuery.Callbacks("once memory"),
        +            // Status-dependent callbacks
        +            statusCode = s.statusCode || {},
        +            // Headers (they are sent all at once)
        +            requestHeaders = {},
        +            requestHeadersNames = {},
        +            // The jqXHR state
        +            state = 0,
        +            // Default abort message
        +            strAbort = "canceled",
        +            // Fake xhr
        +            jqXHR = {
        +                readyState: 0,
        +
        +                // Builds headers hashtable if needed
        +                getResponseHeader: function( key ) {
        +                    var match;
        +                    if ( state === 2 ) {
        +                        if ( !responseHeaders ) {
        +                            responseHeaders = {};
        +                            while ( (match = rheaders.exec( responseHeadersString )) ) {
        +                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
        +                            }
        +                        }
        +                        match = responseHeaders[ key.toLowerCase() ];
        +                    }
        +                    return match == null ? null : match;
        +                },
        +
        +                // Raw string
        +                getAllResponseHeaders: function() {
        +                    return state === 2 ? responseHeadersString : null;
        +                },
        +
        +                // Caches the header
        +                setRequestHeader: function( name, value ) {
        +                    var lname = name.toLowerCase();
        +                    if ( !state ) {
        +                        name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
        +                        requestHeaders[ name ] = value;
        +                    }
        +                    return this;
        +                },
        +
        +                // Overrides response content-type header
        +                overrideMimeType: function( type ) {
        +                    if ( !state ) {
        +                        s.mimeType = type;
        +                    }
        +                    return this;
        +                },
        +
        +                // Status-dependent callbacks
        +                statusCode: function( map ) {
        +                    var code;
        +                    if ( map ) {
        +                        if ( state < 2 ) {
        +                            for ( code in map ) {
        +                                // Lazy-add the new callback in a way that preserves old ones
        +                                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
        +                            }
        +                        } else {
        +                            // Execute the appropriate callbacks
        +                            jqXHR.always( map[ jqXHR.status ] );
        +                        }
        +                    }
        +                    return this;
        +                },
        +
        +                // Cancel the request
        +                abort: function( statusText ) {
        +                    var finalText = statusText || strAbort;
        +                    if ( transport ) {
        +                        transport.abort( finalText );
        +                    }
        +                    done( 0, finalText );
        +                    return this;
        +                }
        +            };
        +
        +        // Attach deferreds
        +        deferred.promise( jqXHR ).complete = completeDeferred.add;
        +        jqXHR.success = jqXHR.done;
        +        jqXHR.error = jqXHR.fail;
        +
        +        // Remove hash character (#7531: and string promotion)
        +        // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
        +        // Handle falsy url in the settings object (#10093: consistency with old signature)
        +        // We also use the url parameter if available
        +        s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
        +
        +        // Alias method option to type as per ticket #12004
        +        s.type = options.method || options.type || s.method || s.type;
        +
        +        // Extract dataTypes list
        +        s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
        +
        +        // A cross-domain request is in order when we have a protocol:host:port mismatch
        +        if ( s.crossDomain == null ) {
        +            parts = rurl.exec( s.url.toLowerCase() );
        +            s.crossDomain = !!( parts &&
        +                ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
        +                    ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
        +                        ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
        +            );
        +        }
        +
        +        // Convert data if not already a string
        +        if ( s.data && s.processData && typeof s.data !== "string" ) {
        +            s.data = jQuery.param( s.data, s.traditional );
        +        }
        +
        +        // Apply prefilters
        +        inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
        +
        +        // If request was aborted inside a prefilter, stop there
        +        if ( state === 2 ) {
        +            return jqXHR;
        +        }
        +
        +        // We can fire global events as of now if asked to
        +        fireGlobals = s.global;
        +
        +        // Watch for a new set of requests
        +        if ( fireGlobals && jQuery.active++ === 0 ) {
        +            jQuery.event.trigger("ajaxStart");
        +        }
        +
        +        // Uppercase the type
        +        s.type = s.type.toUpperCase();
        +
        +        // Determine if request has content
        +        s.hasContent = !rnoContent.test( s.type );
        +
        +        // Save the URL in case we're toying with the If-Modified-Since
        +        // and/or If-None-Match header later on
        +        cacheURL = s.url;
        +
        +        // More options handling for requests with no content
        +        if ( !s.hasContent ) {
        +
        +            // If data is available, append data to url
        +            if ( s.data ) {
        +                cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
        +                // #9682: remove data so that it's not used in an eventual retry
        +                delete s.data;
        +            }
        +
        +            // Add anti-cache in url if needed
        +            if ( s.cache === false ) {
        +                s.url = rts.test( cacheURL ) ?
        +
        +                    // If there is already a '_' parameter, set its value
        +                    cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
        +
        +                    // Otherwise add one to the end
        +                    cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
        +            }
        +        }
        +
        +        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +        if ( s.ifModified ) {
        +            if ( jQuery.lastModified[ cacheURL ] ) {
        +                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
        +            }
        +            if ( jQuery.etag[ cacheURL ] ) {
        +                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
        +            }
        +        }
        +
        +        // Set the correct header, if data is being sent
        +        if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
        +            jqXHR.setRequestHeader( "Content-Type", s.contentType );
        +        }
        +
        +        // Set the Accepts header for the server, depending on the dataType
        +        jqXHR.setRequestHeader(
        +            "Accept",
        +            s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
        +                s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
        +                s.accepts[ "*" ]
        +        );
        +
        +        // Check for headers option
        +        for ( i in s.headers ) {
        +            jqXHR.setRequestHeader( i, s.headers[ i ] );
        +        }
        +
        +        // Allow custom headers/mimetypes and early abort
        +        if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
        +            // Abort if not done already and return
        +            return jqXHR.abort();
        +        }
        +
        +        // aborting is no longer a cancellation
        +        strAbort = "abort";
        +
        +        // Install callbacks on deferreds
        +        for ( i in { success: 1, error: 1, complete: 1 } ) {
        +            jqXHR[ i ]( s[ i ] );
        +        }
        +
        +        // Get transport
        +        transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
        +
        +        // If no transport, we auto-abort
        +        if ( !transport ) {
        +            done( -1, "No Transport" );
        +        } else {
        +            jqXHR.readyState = 1;
        +
        +            // Send global event
        +            if ( fireGlobals ) {
        +                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
        +            }
        +            // Timeout
        +            if ( s.async && s.timeout > 0 ) {
        +                timeoutTimer = setTimeout(function() {
        +                    jqXHR.abort("timeout");
        +                }, s.timeout );
        +            }
        +
        +            try {
        +                state = 1;
        +                transport.send( requestHeaders, done );
        +            } catch ( e ) {
        +                // Propagate exception as error if not done
        +                if ( state < 2 ) {
        +                    done( -1, e );
        +                // Simply rethrow otherwise
        +                } else {
        +                    throw e;
        +                }
        +            }
        +        }
        +
        +        // Callback for when everything is done
        +        function done( status, nativeStatusText, responses, headers ) {
        +            var isSuccess, success, error, response, modified,
        +                statusText = nativeStatusText;
        +
        +            // Called once
        +            if ( state === 2 ) {
        +                return;
        +            }
        +
        +            // State is "done" now
        +            state = 2;
        +
        +            // Clear timeout if it exists
        +            if ( timeoutTimer ) {
        +                clearTimeout( timeoutTimer );
        +            }
        +
        +            // Dereference transport for early garbage collection
        +            // (no matter how long the jqXHR object will be used)
        +            transport = undefined;
        +
        +            // Cache response headers
        +            responseHeadersString = headers || "";
        +
        +            // Set readyState
        +            jqXHR.readyState = status > 0 ? 4 : 0;
        +
        +            // Get response data
        +            if ( responses ) {
        +                response = ajaxHandleResponses( s, jqXHR, responses );
        +            }
        +
        +            // If successful, handle type chaining
        +            if ( status >= 200 && status < 300 || status === 304 ) {
        +
        +                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +                if ( s.ifModified ) {
        +                    modified = jqXHR.getResponseHeader("Last-Modified");
        +                    if ( modified ) {
        +                        jQuery.lastModified[ cacheURL ] = modified;
        +                    }
        +                    modified = jqXHR.getResponseHeader("etag");
        +                    if ( modified ) {
        +                        jQuery.etag[ cacheURL ] = modified;
        +                    }
        +                }
        +
        +                // if no content
        +                if ( status === 204 ) {
        +                    isSuccess = true;
        +                    statusText = "nocontent";
        +
        +                // if not modified
        +                } else if ( status === 304 ) {
        +                    isSuccess = true;
        +                    statusText = "notmodified";
        +
        +                // If we have data, let's convert it
        +                } else {
        +                    isSuccess = ajaxConvert( s, response );
        +                    statusText = isSuccess.state;
        +                    success = isSuccess.data;
        +                    error = isSuccess.error;
        +                    isSuccess = !error;
        +                }
        +            } else {
        +                // We extract error from statusText
        +                // then normalize statusText and status for non-aborts
        +                error = statusText;
        +                if ( status || !statusText ) {
        +                    statusText = "error";
        +                    if ( status < 0 ) {
        +                        status = 0;
        +                    }
        +                }
        +            }
        +
        +            // Set data for the fake xhr object
        +            jqXHR.status = status;
        +            jqXHR.statusText = ( nativeStatusText || statusText ) + "";
        +
        +            // Success/Error
        +            if ( isSuccess ) {
        +                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
        +            } else {
        +                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
        +            }
        +
        +            // Status-dependent callbacks
        +            jqXHR.statusCode( statusCode );
        +            statusCode = undefined;
        +
        +            if ( fireGlobals ) {
        +                globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
        +                    [ jqXHR, s, isSuccess ? success : error ] );
        +            }
        +
        +            // Complete
        +            completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
        +
        +            if ( fireGlobals ) {
        +                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
        +                // Handle the global AJAX counter
        +                if ( !( --jQuery.active ) ) {
        +                    jQuery.event.trigger("ajaxStop");
        +                }
        +            }
        +        }
        +
        +        return jqXHR;
        +    },
        +
        +    getScript: function( url, callback ) {
        +        return jQuery.get( url, undefined, callback, "script" );
        +    },
        +
        +    getJSON: function( url, data, callback ) {
        +        return jQuery.get( url, data, callback, "json" );
        +    }
        +});
        +
        +/* Handles responses to an ajax request:
        + * - sets all responseXXX fields accordingly
        + * - finds the right dataType (mediates between content-type and expected dataType)
        + * - returns the corresponding response
        + */
        +function ajaxHandleResponses( s, jqXHR, responses ) {
        +    var firstDataType, ct, finalDataType, type,
        +        contents = s.contents,
        +        dataTypes = s.dataTypes,
        +        responseFields = s.responseFields;
        +
        +    // Fill responseXXX fields
        +    for ( type in responseFields ) {
        +        if ( type in responses ) {
        +            jqXHR[ responseFields[type] ] = responses[ type ];
        +        }
        +    }
        +
        +    // Remove auto dataType and get content-type in the process
        +    while( dataTypes[ 0 ] === "*" ) {
        +        dataTypes.shift();
        +        if ( ct === undefined ) {
        +            ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
        +        }
        +    }
        +
        +    // Check if we're dealing with a known content-type
        +    if ( ct ) {
        +        for ( type in contents ) {
        +            if ( contents[ type ] && contents[ type ].test( ct ) ) {
        +                dataTypes.unshift( type );
        +                break;
        +            }
        +        }
        +    }
        +
        +    // Check to see if we have a response for the expected dataType
        +    if ( dataTypes[ 0 ] in responses ) {
        +        finalDataType = dataTypes[ 0 ];
        +    } else {
        +        // Try convertible dataTypes
        +        for ( type in responses ) {
        +            if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
        +                finalDataType = type;
        +                break;
        +            }
        +            if ( !firstDataType ) {
        +                firstDataType = type;
        +            }
        +        }
        +        // Or just use first one
        +        finalDataType = finalDataType || firstDataType;
        +    }
        +
        +    // If we found a dataType
        +    // We add the dataType to the list if needed
        +    // and return the corresponding response
        +    if ( finalDataType ) {
        +        if ( finalDataType !== dataTypes[ 0 ] ) {
        +            dataTypes.unshift( finalDataType );
        +        }
        +        return responses[ finalDataType ];
        +    }
        +}
        +
        +// Chain conversions given the request and the original response
        +function ajaxConvert( s, response ) {
        +    var conv2, current, conv, tmp,
        +        converters = {},
        +        i = 0,
        +        // Work with a copy of dataTypes in case we need to modify it for conversion
        +        dataTypes = s.dataTypes.slice(),
        +        prev = dataTypes[ 0 ];
        +
        +    // Apply the dataFilter if provided
        +    if ( s.dataFilter ) {
        +        response = s.dataFilter( response, s.dataType );
        +    }
        +
        +    // Create converters map with lowercased keys
        +    if ( dataTypes[ 1 ] ) {
        +        for ( conv in s.converters ) {
        +            converters[ conv.toLowerCase() ] = s.converters[ conv ];
        +        }
        +    }
        +
        +    // Convert to each sequential dataType, tolerating list modification
        +    for ( ; (current = dataTypes[++i]); ) {
        +
        +        // There's only work to do if current dataType is non-auto
        +        if ( current !== "*" ) {
        +
        +            // Convert response if prev dataType is non-auto and differs from current
        +            if ( prev !== "*" && prev !== current ) {
        +
        +                // Seek a direct converter
        +                conv = converters[ prev + " " + current ] || converters[ "* " + current ];
        +
        +                // If none found, seek a pair
        +                if ( !conv ) {
        +                    for ( conv2 in converters ) {
        +
        +                        // If conv2 outputs current
        +                        tmp = conv2.split(" ");
        +                        if ( tmp[ 1 ] === current ) {
        +
        +                            // If prev can be converted to accepted input
        +                            conv = converters[ prev + " " + tmp[ 0 ] ] ||
        +                                converters[ "* " + tmp[ 0 ] ];
        +                            if ( conv ) {
        +                                // Condense equivalence converters
        +                                if ( conv === true ) {
        +                                    conv = converters[ conv2 ];
        +
        +                                // Otherwise, insert the intermediate dataType
        +                                } else if ( converters[ conv2 ] !== true ) {
        +                                    current = tmp[ 0 ];
        +                                    dataTypes.splice( i--, 0, current );
        +                                }
        +
        +                                break;
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                // Apply converter (if not an equivalence)
        +                if ( conv !== true ) {
        +
        +                    // Unless errors are allowed to bubble, catch and return them
        +                    if ( conv && s["throws"] ) {
        +                        response = conv( response );
        +                    } else {
        +                        try {
        +                            response = conv( response );
        +                        } catch ( e ) {
        +                            return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
        +                        }
        +                    }
        +                }
        +            }
        +
        +            // Update prev for next iteration
        +            prev = current;
        +        }
        +    }
        +
        +    return { state: "success", data: response };
        +}
        +// Install script dataType
        +jQuery.ajaxSetup({
        +    accepts: {
        +        script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        +    },
        +    contents: {
        +        script: /(?:java|ecma)script/
        +    },
        +    converters: {
        +        "text script": function( text ) {
        +            jQuery.globalEval( text );
        +            return text;
        +        }
        +    }
        +});
        +
        +// Handle cache's special case and global
        +jQuery.ajaxPrefilter( "script", function( s ) {
        +    if ( s.cache === undefined ) {
        +        s.cache = false;
        +    }
        +    if ( s.crossDomain ) {
        +        s.type = "GET";
        +        s.global = false;
        +    }
        +});
        +
        +// Bind script tag hack transport
        +jQuery.ajaxTransport( "script", function(s) {
        +
        +    // This transport only deals with cross domain requests
        +    if ( s.crossDomain ) {
        +
        +        var script,
        +            head = document.head || jQuery("head")[0] || document.documentElement;
        +
        +        return {
        +
        +            send: function( _, callback ) {
        +
        +                script = document.createElement("script");
        +
        +                script.async = true;
        +
        +                if ( s.scriptCharset ) {
        +                    script.charset = s.scriptCharset;
        +                }
        +
        +                script.src = s.url;
        +
        +                // Attach handlers for all browsers
        +                script.onload = script.onreadystatechange = function( _, isAbort ) {
        +
        +                    if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
        +
        +                        // Handle memory leak in IE
        +                        script.onload = script.onreadystatechange = null;
        +
        +                        // Remove the script
        +                        if ( script.parentNode ) {
        +                            script.parentNode.removeChild( script );
        +                        }
        +
        +                        // Dereference the script
        +                        script = null;
        +
        +                        // Callback if not abort
        +                        if ( !isAbort ) {
        +                            callback( 200, "success" );
        +                        }
        +                    }
        +                };
        +
        +                // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
        +                // Use native DOM manipulation to avoid our domManip AJAX trickery
        +                head.insertBefore( script, head.firstChild );
        +            },
        +
        +            abort: function() {
        +                if ( script ) {
        +                    script.onload( undefined, true );
        +                }
        +            }
        +        };
        +    }
        +});
        +var oldCallbacks = [],
        +    rjsonp = /(=)\?(?=&|$)|\?\?/;
        +
        +// Default jsonp settings
        +jQuery.ajaxSetup({
        +    jsonp: "callback",
        +    jsonpCallback: function() {
        +        var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
        +        this[ callback ] = true;
        +        return callback;
        +    }
        +});
        +
        +// Detect, normalize options and install callbacks for jsonp requests
        +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
        +
        +    var callbackName, overwritten, responseContainer,
        +        jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
        +            "url" :
        +            typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
        +        );
        +
        +    // Handle iff the expected data type is "jsonp" or we have a parameter to set
        +    if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
        +
        +        // Get callback name, remembering preexisting value associated with it
        +        callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
        +            s.jsonpCallback() :
        +            s.jsonpCallback;
        +
        +        // Insert callback into url or form data
        +        if ( jsonProp ) {
        +            s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
        +        } else if ( s.jsonp !== false ) {
        +            s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
        +        }
        +
        +        // Use data converter to retrieve json after script execution
        +        s.converters["script json"] = function() {
        +            if ( !responseContainer ) {
        +                jQuery.error( callbackName + " was not called" );
        +            }
        +            return responseContainer[ 0 ];
        +        };
        +
        +        // force json dataType
        +        s.dataTypes[ 0 ] = "json";
        +
        +        // Install callback
        +        overwritten = window[ callbackName ];
        +        window[ callbackName ] = function() {
        +            responseContainer = arguments;
        +        };
        +
        +        // Clean-up function (fires after converters)
        +        jqXHR.always(function() {
        +            // Restore preexisting value
        +            window[ callbackName ] = overwritten;
        +
        +            // Save back as free
        +            if ( s[ callbackName ] ) {
        +                // make sure that re-using the options doesn't screw things around
        +                s.jsonpCallback = originalSettings.jsonpCallback;
        +
        +                // save the callback name for future use
        +                oldCallbacks.push( callbackName );
        +            }
        +
        +            // Call if it was a function and we have a response
        +            if ( responseContainer && jQuery.isFunction( overwritten ) ) {
        +                overwritten( responseContainer[ 0 ] );
        +            }
        +
        +            responseContainer = overwritten = undefined;
        +        });
        +
        +        // Delegate to script
        +        return "script";
        +    }
        +});
        +var xhrCallbacks, xhrSupported,
        +    xhrId = 0,
        +    // #5280: Internet Explorer will keep connections alive if we don't abort on unload
        +    xhrOnUnloadAbort = window.ActiveXObject && function() {
        +        // Abort all pending requests
        +        var key;
        +        for ( key in xhrCallbacks ) {
        +            xhrCallbacks[ key ]( undefined, true );
        +        }
        +    };
        +
        +// Functions to create xhrs
        +function createStandardXHR() {
        +    try {
        +        return new window.XMLHttpRequest();
        +    } catch( e ) {}
        +}
        +
        +function createActiveXHR() {
        +    try {
        +        return new window.ActiveXObject("Microsoft.XMLHTTP");
        +    } catch( e ) {}
        +}
        +
        +// Create the request object
        +// (This is still attached to ajaxSettings for backward compatibility)
        +jQuery.ajaxSettings.xhr = window.ActiveXObject ?
        +    /* Microsoft failed to properly
        +     * implement the XMLHttpRequest in IE7 (can't request local files),
        +     * so we use the ActiveXObject when it is available
        +     * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
        +     * we need a fallback.
        +     */
        +    function() {
        +        return !this.isLocal && createStandardXHR() || createActiveXHR();
        +    } :
        +    // For all other browsers, use the standard XMLHttpRequest object
        +    createStandardXHR;
        +
        +// Determine support properties
        +xhrSupported = jQuery.ajaxSettings.xhr();
        +jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
        +xhrSupported = jQuery.support.ajax = !!xhrSupported;
        +
        +// Create transport if the browser can provide an xhr
        +if ( xhrSupported ) {
        +
        +    jQuery.ajaxTransport(function( s ) {
        +        // Cross domain only allowed if supported through XMLHttpRequest
        +        if ( !s.crossDomain || jQuery.support.cors ) {
        +
        +            var callback;
        +
        +            return {
        +                send: function( headers, complete ) {
        +
        +                    // Get a new xhr
        +                    var handle, i,
        +                        xhr = s.xhr();
        +
        +                    // Open the socket
        +                    // Passing null username, generates a login popup on Opera (#2865)
        +                    if ( s.username ) {
        +                        xhr.open( s.type, s.url, s.async, s.username, s.password );
        +                    } else {
        +                        xhr.open( s.type, s.url, s.async );
        +                    }
        +
        +                    // Apply custom fields if provided
        +                    if ( s.xhrFields ) {
        +                        for ( i in s.xhrFields ) {
        +                            xhr[ i ] = s.xhrFields[ i ];
        +                        }
        +                    }
        +
        +                    // Override mime type if needed
        +                    if ( s.mimeType && xhr.overrideMimeType ) {
        +                        xhr.overrideMimeType( s.mimeType );
        +                    }
        +
        +                    // X-Requested-With header
        +                    // For cross-domain requests, seeing as conditions for a preflight are
        +                    // akin to a jigsaw puzzle, we simply never set it to be sure.
        +                    // (it can always be set on a per-request basis or even using ajaxSetup)
        +                    // For same-domain requests, won't change header if already provided.
        +                    if ( !s.crossDomain && !headers["X-Requested-With"] ) {
        +                        headers["X-Requested-With"] = "XMLHttpRequest";
        +                    }
        +
        +                    // Need an extra try/catch for cross domain requests in Firefox 3
        +                    try {
        +                        for ( i in headers ) {
        +                            xhr.setRequestHeader( i, headers[ i ] );
        +                        }
        +                    } catch( err ) {}
        +
        +                    // Do send the request
        +                    // This may raise an exception which is actually
        +                    // handled in jQuery.ajax (so no try/catch here)
        +                    xhr.send( ( s.hasContent && s.data ) || null );
        +
        +                    // Listener
        +                    callback = function( _, isAbort ) {
        +                        var status, responseHeaders, statusText, responses;
        +
        +                        // Firefox throws exceptions when accessing properties
        +                        // of an xhr when a network error occurred
        +                        // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
        +                        try {
        +
        +                            // Was never called and is aborted or complete
        +                            if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
        +
        +                                // Only called once
        +                                callback = undefined;
        +
        +                                // Do not keep as active anymore
        +                                if ( handle ) {
        +                                    xhr.onreadystatechange = jQuery.noop;
        +                                    if ( xhrOnUnloadAbort ) {
        +                                        delete xhrCallbacks[ handle ];
        +                                    }
        +                                }
        +
        +                                // If it's an abort
        +                                if ( isAbort ) {
        +                                    // Abort it manually if needed
        +                                    if ( xhr.readyState !== 4 ) {
        +                                        xhr.abort();
        +                                    }
        +                                } else {
        +                                    responses = {};
        +                                    status = xhr.status;
        +                                    responseHeaders = xhr.getAllResponseHeaders();
        +
        +                                    // When requesting binary data, IE6-9 will throw an exception
        +                                    // on any attempt to access responseText (#11426)
        +                                    if ( typeof xhr.responseText === "string" ) {
        +                                        responses.text = xhr.responseText;
        +                                    }
        +
        +                                    // Firefox throws an exception when accessing
        +                                    // statusText for faulty cross-domain requests
        +                                    try {
        +                                        statusText = xhr.statusText;
        +                                    } catch( e ) {
        +                                        // We normalize with Webkit giving an empty statusText
        +                                        statusText = "";
        +                                    }
        +
        +                                    // Filter status for non standard behaviors
        +
        +                                    // If the request is local and we have data: assume a success
        +                                    // (success with no data won't get notified, that's the best we
        +                                    // can do given current implementations)
        +                                    if ( !status && s.isLocal && !s.crossDomain ) {
        +                                        status = responses.text ? 200 : 404;
        +                                    // IE - #1450: sometimes returns 1223 when it should be 204
        +                                    } else if ( status === 1223 ) {
        +                                        status = 204;
        +                                    }
        +                                }
        +                            }
        +                        } catch( firefoxAccessException ) {
        +                            if ( !isAbort ) {
        +                                complete( -1, firefoxAccessException );
        +                            }
        +                        }
        +
        +                        // Call complete if needed
        +                        if ( responses ) {
        +                            complete( status, statusText, responses, responseHeaders );
        +                        }
        +                    };
        +
        +                    if ( !s.async ) {
        +                        // if we're in sync mode we fire the callback
        +                        callback();
        +                    } else if ( xhr.readyState === 4 ) {
        +                        // (IE6 & IE7) if it's in cache and has been
        +                        // retrieved directly we need to fire the callback
        +                        setTimeout( callback );
        +                    } else {
        +                        handle = ++xhrId;
        +                        if ( xhrOnUnloadAbort ) {
        +                            // Create the active xhrs callbacks list if needed
        +                            // and attach the unload handler
        +                            if ( !xhrCallbacks ) {
        +                                xhrCallbacks = {};
        +                                jQuery( window ).unload( xhrOnUnloadAbort );
        +                            }
        +                            // Add to list of active xhrs callbacks
        +                            xhrCallbacks[ handle ] = callback;
        +                        }
        +                        xhr.onreadystatechange = callback;
        +                    }
        +                },
        +
        +                abort: function() {
        +                    if ( callback ) {
        +                        callback( undefined, true );
        +                    }
        +                }
        +            };
        +        }
        +    });
        +}
        +var fxNow, timerId,
        +    rfxtypes = /^(?:toggle|show|hide)$/,
        +    rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
        +    rrun = /queueHooks$/,
        +    animationPrefilters = [ defaultPrefilter ],
        +    tweeners = {
        +        "*": [function( prop, value ) {
        +            var end, unit,
        +                tween = this.createTween( prop, value ),
        +                parts = rfxnum.exec( value ),
        +                target = tween.cur(),
        +                start = +target || 0,
        +                scale = 1,
        +                maxIterations = 20;
        +
        +            if ( parts ) {
        +                end = +parts[2];
        +                unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        +
        +                // We need to compute starting value
        +                if ( unit !== "px" && start ) {
        +                    // Iteratively approximate from a nonzero starting point
        +                    // Prefer the current property, because this process will be trivial if it uses the same units
        +                    // Fallback to end or a simple constant
        +                    start = jQuery.css( tween.elem, prop, true ) || end || 1;
        +
        +                    do {
        +                        // If previous iteration zeroed out, double until we get *something*
        +                        // Use a string for doubling factor so we don't accidentally see scale as unchanged below
        +                        scale = scale || ".5";
        +
        +                        // Adjust and apply
        +                        start = start / scale;
        +                        jQuery.style( tween.elem, prop, start + unit );
        +
        +                    // Update scale, tolerating zero or NaN from tween.cur()
        +                    // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
        +                    } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
        +                }
        +
        +                tween.unit = unit;
        +                tween.start = start;
        +                // If a +=/-= token was provided, we're doing a relative animation
        +                tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
        +            }
        +            return tween;
        +        }]
        +    };
        +
        +// Animations created synchronously will run synchronously
        +function createFxNow() {
        +    setTimeout(function() {
        +        fxNow = undefined;
        +    });
        +    return ( fxNow = jQuery.now() );
        +}
        +
        +function createTweens( animation, props ) {
        +    jQuery.each( props, function( prop, value ) {
        +        var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
        +            index = 0,
        +            length = collection.length;
        +        for ( ; index < length; index++ ) {
        +            if ( collection[ index ].call( animation, prop, value ) ) {
        +
        +                // we're done with this property
        +                return;
        +            }
        +        }
        +    });
        +}
        +
        +function Animation( elem, properties, options ) {
        +    var result,
        +        stopped,
        +        index = 0,
        +        length = animationPrefilters.length,
        +        deferred = jQuery.Deferred().always( function() {
        +            // don't match elem in the :animated selector
        +            delete tick.elem;
        +        }),
        +        tick = function() {
        +            if ( stopped ) {
        +                return false;
        +            }
        +            var currentTime = fxNow || createFxNow(),
        +                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
        +                // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
        +                temp = remaining / animation.duration || 0,
        +                percent = 1 - temp,
        +                index = 0,
        +                length = animation.tweens.length;
        +
        +            for ( ; index < length ; index++ ) {
        +                animation.tweens[ index ].run( percent );
        +            }
        +
        +            deferred.notifyWith( elem, [ animation, percent, remaining ]);
        +
        +            if ( percent < 1 && length ) {
        +                return remaining;
        +            } else {
        +                deferred.resolveWith( elem, [ animation ] );
        +                return false;
        +            }
        +        },
        +        animation = deferred.promise({
        +            elem: elem,
        +            props: jQuery.extend( {}, properties ),
        +            opts: jQuery.extend( true, { specialEasing: {} }, options ),
        +            originalProperties: properties,
        +            originalOptions: options,
        +            startTime: fxNow || createFxNow(),
        +            duration: options.duration,
        +            tweens: [],
        +            createTween: function( prop, end ) {
        +                var tween = jQuery.Tween( elem, animation.opts, prop, end,
        +                        animation.opts.specialEasing[ prop ] || animation.opts.easing );
        +                animation.tweens.push( tween );
        +                return tween;
        +            },
        +            stop: function( gotoEnd ) {
        +                var index = 0,
        +                    // if we are going to the end, we want to run all the tweens
        +                    // otherwise we skip this part
        +                    length = gotoEnd ? animation.tweens.length : 0;
        +                if ( stopped ) {
        +                    return this;
        +                }
        +                stopped = true;
        +                for ( ; index < length ; index++ ) {
        +                    animation.tweens[ index ].run( 1 );
        +                }
        +
        +                // resolve when we played the last frame
        +                // otherwise, reject
        +                if ( gotoEnd ) {
        +                    deferred.resolveWith( elem, [ animation, gotoEnd ] );
        +                } else {
        +                    deferred.rejectWith( elem, [ animation, gotoEnd ] );
        +                }
        +                return this;
        +            }
        +        }),
        +        props = animation.props;
        +
        +    propFilter( props, animation.opts.specialEasing );
        +
        +    for ( ; index < length ; index++ ) {
        +        result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
        +        if ( result ) {
        +            return result;
        +        }
        +    }
        +
        +    createTweens( animation, props );
        +
        +    if ( jQuery.isFunction( animation.opts.start ) ) {
        +        animation.opts.start.call( elem, animation );
        +    }
        +
        +    jQuery.fx.timer(
        +        jQuery.extend( tick, {
        +            elem: elem,
        +            anim: animation,
        +            queue: animation.opts.queue
        +        })
        +    );
        +
        +    // attach callbacks from options
        +    return animation.progress( animation.opts.progress )
        +        .done( animation.opts.done, animation.opts.complete )
        +        .fail( animation.opts.fail )
        +        .always( animation.opts.always );
        +}
        +
        +function propFilter( props, specialEasing ) {
        +    var value, name, index, easing, hooks;
        +
        +    // camelCase, specialEasing and expand cssHook pass
        +    for ( index in props ) {
        +        name = jQuery.camelCase( index );
        +        easing = specialEasing[ name ];
        +        value = props[ index ];
        +        if ( jQuery.isArray( value ) ) {
        +            easing = value[ 1 ];
        +            value = props[ index ] = value[ 0 ];
        +        }
        +
        +        if ( index !== name ) {
        +            props[ name ] = value;
        +            delete props[ index ];
        +        }
        +
        +        hooks = jQuery.cssHooks[ name ];
        +        if ( hooks && "expand" in hooks ) {
        +            value = hooks.expand( value );
        +            delete props[ name ];
        +
        +            // not quite $.extend, this wont overwrite keys already present.
        +            // also - reusing 'index' from above because we have the correct "name"
        +            for ( index in value ) {
        +                if ( !( index in props ) ) {
        +                    props[ index ] = value[ index ];
        +                    specialEasing[ index ] = easing;
        +                }
        +            }
        +        } else {
        +            specialEasing[ name ] = easing;
        +        }
        +    }
        +}
        +
        +jQuery.Animation = jQuery.extend( Animation, {
        +
        +    tweener: function( props, callback ) {
        +        if ( jQuery.isFunction( props ) ) {
        +            callback = props;
        +            props = [ "*" ];
        +        } else {
        +            props = props.split(" ");
        +        }
        +
        +        var prop,
        +            index = 0,
        +            length = props.length;
        +
        +        for ( ; index < length ; index++ ) {
        +            prop = props[ index ];
        +            tweeners[ prop ] = tweeners[ prop ] || [];
        +            tweeners[ prop ].unshift( callback );
        +        }
        +    },
        +
        +    prefilter: function( callback, prepend ) {
        +        if ( prepend ) {
        +            animationPrefilters.unshift( callback );
        +        } else {
        +            animationPrefilters.push( callback );
        +        }
        +    }
        +});
        +
        +function defaultPrefilter( elem, props, opts ) {
        +    /*jshint validthis:true */
        +    var prop, index, length,
        +        value, dataShow, toggle,
        +        tween, hooks, oldfire,
        +        anim = this,
        +        style = elem.style,
        +        orig = {},
        +        handled = [],
        +        hidden = elem.nodeType && isHidden( elem );
        +
        +    // handle queue: false promises
        +    if ( !opts.queue ) {
        +        hooks = jQuery._queueHooks( elem, "fx" );
        +        if ( hooks.unqueued == null ) {
        +            hooks.unqueued = 0;
        +            oldfire = hooks.empty.fire;
        +            hooks.empty.fire = function() {
        +                if ( !hooks.unqueued ) {
        +                    oldfire();
        +                }
        +            };
        +        }
        +        hooks.unqueued++;
        +
        +        anim.always(function() {
        +            // doing this makes sure that the complete handler will be called
        +            // before this completes
        +            anim.always(function() {
        +                hooks.unqueued--;
        +                if ( !jQuery.queue( elem, "fx" ).length ) {
        +                    hooks.empty.fire();
        +                }
        +            });
        +        });
        +    }
        +
        +    // height/width overflow pass
        +    if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
        +        // Make sure that nothing sneaks out
        +        // Record all 3 overflow attributes because IE does not
        +        // change the overflow attribute when overflowX and
        +        // overflowY are set to the same value
        +        opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
        +
        +        // Set display property to inline-block for height/width
        +        // animations on inline elements that are having width/height animated
        +        if ( jQuery.css( elem, "display" ) === "inline" &&
        +                jQuery.css( elem, "float" ) === "none" ) {
        +
        +            // inline-level elements accept inline-block;
        +            // block-level elements need to be inline with layout
        +            if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
        +                style.display = "inline-block";
        +
        +            } else {
        +                style.zoom = 1;
        +            }
        +        }
        +    }
        +
        +    if ( opts.overflow ) {
        +        style.overflow = "hidden";
        +        if ( !jQuery.support.shrinkWrapBlocks ) {
        +            anim.always(function() {
        +                style.overflow = opts.overflow[ 0 ];
        +                style.overflowX = opts.overflow[ 1 ];
        +                style.overflowY = opts.overflow[ 2 ];
        +            });
        +        }
        +    }
        +
        +
        +    // show/hide pass
        +    for ( index in props ) {
        +        value = props[ index ];
        +        if ( rfxtypes.exec( value ) ) {
        +            delete props[ index ];
        +            toggle = toggle || value === "toggle";
        +            if ( value === ( hidden ? "hide" : "show" ) ) {
        +                continue;
        +            }
        +            handled.push( index );
        +        }
        +    }
        +
        +    length = handled.length;
        +    if ( length ) {
        +        dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
        +        if ( "hidden" in dataShow ) {
        +            hidden = dataShow.hidden;
        +        }
        +
        +        // store state if its toggle - enables .stop().toggle() to "reverse"
        +        if ( toggle ) {
        +            dataShow.hidden = !hidden;
        +        }
        +        if ( hidden ) {
        +            jQuery( elem ).show();
        +        } else {
        +            anim.done(function() {
        +                jQuery( elem ).hide();
        +            });
        +        }
        +        anim.done(function() {
        +            var prop;
        +            jQuery._removeData( elem, "fxshow" );
        +            for ( prop in orig ) {
        +                jQuery.style( elem, prop, orig[ prop ] );
        +            }
        +        });
        +        for ( index = 0 ; index < length ; index++ ) {
        +            prop = handled[ index ];
        +            tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
        +            orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
        +
        +            if ( !( prop in dataShow ) ) {
        +                dataShow[ prop ] = tween.start;
        +                if ( hidden ) {
        +                    tween.end = tween.start;
        +                    tween.start = prop === "width" || prop === "height" ? 1 : 0;
        +                }
        +            }
        +        }
        +    }
        +}
        +
        +function Tween( elem, options, prop, end, easing ) {
        +    return new Tween.prototype.init( elem, options, prop, end, easing );
        +}
        +jQuery.Tween = Tween;
        +
        +Tween.prototype = {
        +    constructor: Tween,
        +    init: function( elem, options, prop, end, easing, unit ) {
        +        this.elem = elem;
        +        this.prop = prop;
        +        this.easing = easing || "swing";
        +        this.options = options;
        +        this.start = this.now = this.cur();
        +        this.end = end;
        +        this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        +    },
        +    cur: function() {
        +        var hooks = Tween.propHooks[ this.prop ];
        +
        +        return hooks && hooks.get ?
        +            hooks.get( this ) :
        +            Tween.propHooks._default.get( this );
        +    },
        +    run: function( percent ) {
        +        var eased,
        +            hooks = Tween.propHooks[ this.prop ];
        +
        +        if ( this.options.duration ) {
        +            this.pos = eased = jQuery.easing[ this.easing ](
        +                percent, this.options.duration * percent, 0, 1, this.options.duration
        +            );
        +        } else {
        +            this.pos = eased = percent;
        +        }
        +        this.now = ( this.end - this.start ) * eased + this.start;
        +
        +        if ( this.options.step ) {
        +            this.options.step.call( this.elem, this.now, this );
        +        }
        +
        +        if ( hooks && hooks.set ) {
        +            hooks.set( this );
        +        } else {
        +            Tween.propHooks._default.set( this );
        +        }
        +        return this;
        +    }
        +};
        +
        +Tween.prototype.init.prototype = Tween.prototype;
        +
        +Tween.propHooks = {
        +    _default: {
        +        get: function( tween ) {
        +            var result;
        +
        +            if ( tween.elem[ tween.prop ] != null &&
        +                (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
        +                return tween.elem[ tween.prop ];
        +            }
        +
        +            // passing an empty string as a 3rd parameter to .css will automatically
        +            // attempt a parseFloat and fallback to a string if the parse fails
        +            // so, simple values such as "10px" are parsed to Float.
        +            // complex values such as "rotate(1rad)" are returned as is.
        +            result = jQuery.css( tween.elem, tween.prop, "" );
        +            // Empty strings, null, undefined and "auto" are converted to 0.
        +            return !result || result === "auto" ? 0 : result;
        +        },
        +        set: function( tween ) {
        +            // use step hook for back compat - use cssHook if its there - use .style if its
        +            // available and use plain properties where available
        +            if ( jQuery.fx.step[ tween.prop ] ) {
        +                jQuery.fx.step[ tween.prop ]( tween );
        +            } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
        +                jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
        +            } else {
        +                tween.elem[ tween.prop ] = tween.now;
        +            }
        +        }
        +    }
        +};
        +
        +// Remove in 2.0 - this supports IE8's panic based approach
        +// to setting things on disconnected nodes
        +
        +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
        +    set: function( tween ) {
        +        if ( tween.elem.nodeType && tween.elem.parentNode ) {
        +            tween.elem[ tween.prop ] = tween.now;
        +        }
        +    }
        +};
        +
        +jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
        +    var cssFn = jQuery.fn[ name ];
        +    jQuery.fn[ name ] = function( speed, easing, callback ) {
        +        return speed == null || typeof speed === "boolean" ?
        +            cssFn.apply( this, arguments ) :
        +            this.animate( genFx( name, true ), speed, easing, callback );
        +    };
        +});
        +
        +jQuery.fn.extend({
        +    fadeTo: function( speed, to, easing, callback ) {
        +
        +        // show any hidden elements after setting opacity to 0
        +        return this.filter( isHidden ).css( "opacity", 0 ).show()
        +
        +            // animate to the value specified
        +            .end().animate({ opacity: to }, speed, easing, callback );
        +    },
        +    animate: function( prop, speed, easing, callback ) {
        +        var empty = jQuery.isEmptyObject( prop ),
        +            optall = jQuery.speed( speed, easing, callback ),
        +            doAnimation = function() {
        +                // Operate on a copy of prop so per-property easing won't be lost
        +                var anim = Animation( this, jQuery.extend( {}, prop ), optall );
        +                doAnimation.finish = function() {
        +                    anim.stop( true );
        +                };
        +                // Empty animations, or finishing resolves immediately
        +                if ( empty || jQuery._data( this, "finish" ) ) {
        +                    anim.stop( true );
        +                }
        +            };
        +            doAnimation.finish = doAnimation;
        +
        +        return empty || optall.queue === false ?
        +            this.each( doAnimation ) :
        +            this.queue( optall.queue, doAnimation );
        +    },
        +    stop: function( type, clearQueue, gotoEnd ) {
        +        var stopQueue = function( hooks ) {
        +            var stop = hooks.stop;
        +            delete hooks.stop;
        +            stop( gotoEnd );
        +        };
        +
        +        if ( typeof type !== "string" ) {
        +            gotoEnd = clearQueue;
        +            clearQueue = type;
        +            type = undefined;
        +        }
        +        if ( clearQueue && type !== false ) {
        +            this.queue( type || "fx", [] );
        +        }
        +
        +        return this.each(function() {
        +            var dequeue = true,
        +                index = type != null && type + "queueHooks",
        +                timers = jQuery.timers,
        +                data = jQuery._data( this );
        +
        +            if ( index ) {
        +                if ( data[ index ] && data[ index ].stop ) {
        +                    stopQueue( data[ index ] );
        +                }
        +            } else {
        +                for ( index in data ) {
        +                    if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
        +                        stopQueue( data[ index ] );
        +                    }
        +                }
        +            }
        +
        +            for ( index = timers.length; index--; ) {
        +                if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
        +                    timers[ index ].anim.stop( gotoEnd );
        +                    dequeue = false;
        +                    timers.splice( index, 1 );
        +                }
        +            }
        +
        +            // start the next in the queue if the last step wasn't forced
        +            // timers currently will call their complete callbacks, which will dequeue
        +            // but only if they were gotoEnd
        +            if ( dequeue || !gotoEnd ) {
        +                jQuery.dequeue( this, type );
        +            }
        +        });
        +    },
        +    finish: function( type ) {
        +        if ( type !== false ) {
        +            type = type || "fx";
        +        }
        +        return this.each(function() {
        +            var index,
        +                data = jQuery._data( this ),
        +                queue = data[ type + "queue" ],
        +                hooks = data[ type + "queueHooks" ],
        +                timers = jQuery.timers,
        +                length = queue ? queue.length : 0;
        +
        +            // enable finishing flag on private data
        +            data.finish = true;
        +
        +            // empty the queue first
        +            jQuery.queue( this, type, [] );
        +
        +            if ( hooks && hooks.cur && hooks.cur.finish ) {
        +                hooks.cur.finish.call( this );
        +            }
        +
        +            // look for any active animations, and finish them
        +            for ( index = timers.length; index--; ) {
        +                if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
        +                    timers[ index ].anim.stop( true );
        +                    timers.splice( index, 1 );
        +                }
        +            }
        +
        +            // look for any animations in the old queue and finish them
        +            for ( index = 0; index < length; index++ ) {
        +                if ( queue[ index ] && queue[ index ].finish ) {
        +                    queue[ index ].finish.call( this );
        +                }
        +            }
        +
        +            // turn off finishing flag
        +            delete data.finish;
        +        });
        +    }
        +});
        +
        +// Generate parameters to create a standard animation
        +function genFx( type, includeWidth ) {
        +    var which,
        +        attrs = { height: type },
        +        i = 0;
        +
        +    // if we include width, step value is 1 to do all cssExpand values,
        +    // if we don't include width, step value is 2 to skip over Left and Right
        +    includeWidth = includeWidth? 1 : 0;
        +    for( ; i < 4 ; i += 2 - includeWidth ) {
        +        which = cssExpand[ i ];
        +        attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
        +    }
        +
        +    if ( includeWidth ) {
        +        attrs.opacity = attrs.width = type;
        +    }
        +
        +    return attrs;
        +}
        +
        +// Generate shortcuts for custom animations
        +jQuery.each({
        +    slideDown: genFx("show"),
        +    slideUp: genFx("hide"),
        +    slideToggle: genFx("toggle"),
        +    fadeIn: { opacity: "show" },
        +    fadeOut: { opacity: "hide" },
        +    fadeToggle: { opacity: "toggle" }
        +}, function( name, props ) {
        +    jQuery.fn[ name ] = function( speed, easing, callback ) {
        +        return this.animate( props, speed, easing, callback );
        +    };
        +});
        +
        +jQuery.speed = function( speed, easing, fn ) {
        +    var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
        +        complete: fn || !fn && easing ||
        +            jQuery.isFunction( speed ) && speed,
        +        duration: speed,
        +        easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
        +    };
        +
        +    opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
        +        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
        +
        +    // normalize opt.queue - true/undefined/null -> "fx"
        +    if ( opt.queue == null || opt.queue === true ) {
        +        opt.queue = "fx";
        +    }
        +
        +    // Queueing
        +    opt.old = opt.complete;
        +
        +    opt.complete = function() {
        +        if ( jQuery.isFunction( opt.old ) ) {
        +            opt.old.call( this );
        +        }
        +
        +        if ( opt.queue ) {
        +            jQuery.dequeue( this, opt.queue );
        +        }
        +    };
        +
        +    return opt;
        +};
        +
        +jQuery.easing = {
        +    linear: function( p ) {
        +        return p;
        +    },
        +    swing: function( p ) {
        +        return 0.5 - Math.cos( p*Math.PI ) / 2;
        +    }
        +};
        +
        +jQuery.timers = [];
        +jQuery.fx = Tween.prototype.init;
        +jQuery.fx.tick = function() {
        +    var timer,
        +        timers = jQuery.timers,
        +        i = 0;
        +
        +    fxNow = jQuery.now();
        +
        +    for ( ; i < timers.length; i++ ) {
        +        timer = timers[ i ];
        +        // Checks the timer has not already been removed
        +        if ( !timer() && timers[ i ] === timer ) {
        +            timers.splice( i--, 1 );
        +        }
        +    }
        +
        +    if ( !timers.length ) {
        +        jQuery.fx.stop();
        +    }
        +    fxNow = undefined;
        +};
        +
        +jQuery.fx.timer = function( timer ) {
        +    if ( timer() && jQuery.timers.push( timer ) ) {
        +        jQuery.fx.start();
        +    }
        +};
        +
        +jQuery.fx.interval = 13;
        +
        +jQuery.fx.start = function() {
        +    if ( !timerId ) {
        +        timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
        +    }
        +};
        +
        +jQuery.fx.stop = function() {
        +    clearInterval( timerId );
        +    timerId = null;
        +};
        +
        +jQuery.fx.speeds = {
        +    slow: 600,
        +    fast: 200,
        +    // Default speed
        +    _default: 400
        +};
        +
        +// Back Compat <1.8 extension point
        +jQuery.fx.step = {};
        +
        +if ( jQuery.expr && jQuery.expr.filters ) {
        +    jQuery.expr.filters.animated = function( elem ) {
        +        return jQuery.grep(jQuery.timers, function( fn ) {
        +            return elem === fn.elem;
        +        }).length;
        +    };
        +}
        +jQuery.fn.offset = function( options ) {
        +    if ( arguments.length ) {
        +        return options === undefined ?
        +            this :
        +            this.each(function( i ) {
        +                jQuery.offset.setOffset( this, options, i );
        +            });
        +    }
        +
        +    var docElem, win,
        +        box = { top: 0, left: 0 },
        +        elem = this[ 0 ],
        +        doc = elem && elem.ownerDocument;
        +
        +    if ( !doc ) {
        +        return;
        +    }
        +
        +    docElem = doc.documentElement;
        +
        +    // Make sure it's not a disconnected DOM node
        +    if ( !jQuery.contains( docElem, elem ) ) {
        +        return box;
        +    }
        +
        +    // If we don't have gBCR, just use 0,0 rather than error
        +    // BlackBerry 5, iOS 3 (original iPhone)
        +    if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
        +        box = elem.getBoundingClientRect();
        +    }
        +    win = getWindow( doc );
        +    return {
        +        top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
        +        left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
        +    };
        +};
        +
        +jQuery.offset = {
        +
        +    setOffset: function( elem, options, i ) {
        +        var position = jQuery.css( elem, "position" );
        +
        +        // set position first, in-case top/left are set even on static elem
        +        if ( position === "static" ) {
        +            elem.style.position = "relative";
        +        }
        +
        +        var curElem = jQuery( elem ),
        +            curOffset = curElem.offset(),
        +            curCSSTop = jQuery.css( elem, "top" ),
        +            curCSSLeft = jQuery.css( elem, "left" ),
        +            calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
        +            props = {}, curPosition = {}, curTop, curLeft;
        +
        +        // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
        +        if ( calculatePosition ) {
        +            curPosition = curElem.position();
        +            curTop = curPosition.top;
        +            curLeft = curPosition.left;
        +        } else {
        +            curTop = parseFloat( curCSSTop ) || 0;
        +            curLeft = parseFloat( curCSSLeft ) || 0;
        +        }
        +
        +        if ( jQuery.isFunction( options ) ) {
        +            options = options.call( elem, i, curOffset );
        +        }
        +
        +        if ( options.top != null ) {
        +            props.top = ( options.top - curOffset.top ) + curTop;
        +        }
        +        if ( options.left != null ) {
        +            props.left = ( options.left - curOffset.left ) + curLeft;
        +        }
        +
        +        if ( "using" in options ) {
        +            options.using.call( elem, props );
        +        } else {
        +            curElem.css( props );
        +        }
        +    }
        +};
        +
        +
        +jQuery.fn.extend({
        +
        +    position: function() {
        +        if ( !this[ 0 ] ) {
        +            return;
        +        }
        +
        +        var offsetParent, offset,
        +            parentOffset = { top: 0, left: 0 },
        +            elem = this[ 0 ];
        +
        +        // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
        +        if ( jQuery.css( elem, "position" ) === "fixed" ) {
        +            // we assume that getBoundingClientRect is available when computed position is fixed
        +            offset = elem.getBoundingClientRect();
        +        } else {
        +            // Get *real* offsetParent
        +            offsetParent = this.offsetParent();
        +
        +            // Get correct offsets
        +            offset = this.offset();
        +            if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
        +                parentOffset = offsetParent.offset();
        +            }
        +
        +            // Add offsetParent borders
        +            parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
        +            parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
        +        }
        +
        +        // Subtract parent offsets and element margins
        +        // note: when an element has margin: auto the offsetLeft and marginLeft
        +        // are the same in Safari causing offset.left to incorrectly be 0
        +        return {
        +            top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
        +            left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
        +        };
        +    },
        +
        +    offsetParent: function() {
        +        return this.map(function() {
        +            var offsetParent = this.offsetParent || document.documentElement;
        +            while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
        +                offsetParent = offsetParent.offsetParent;
        +            }
        +            return offsetParent || document.documentElement;
        +        });
        +    }
        +});
        +
        +
        +// Create scrollLeft and scrollTop methods
        +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
        +    var top = /Y/.test( prop );
        +
        +    jQuery.fn[ method ] = function( val ) {
        +        return jQuery.access( this, function( elem, method, val ) {
        +            var win = getWindow( elem );
        +
        +            if ( val === undefined ) {
        +                return win ? (prop in win) ? win[ prop ] :
        +                    win.document.documentElement[ method ] :
        +                    elem[ method ];
        +            }
        +
        +            if ( win ) {
        +                win.scrollTo(
        +                    !top ? val : jQuery( win ).scrollLeft(),
        +                    top ? val : jQuery( win ).scrollTop()
        +                );
        +
        +            } else {
        +                elem[ method ] = val;
        +            }
        +        }, method, val, arguments.length, null );
        +    };
        +});
        +
        +function getWindow( elem ) {
        +    return jQuery.isWindow( elem ) ?
        +        elem :
        +        elem.nodeType === 9 ?
        +            elem.defaultView || elem.parentWindow :
        +            false;
        +}
        +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
        +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        +    jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
        +        // margin is only for outerHeight, outerWidth
        +        jQuery.fn[ funcName ] = function( margin, value ) {
        +            var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
        +                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
        +
        +            return jQuery.access( this, function( elem, type, value ) {
        +                var doc;
        +
        +                if ( jQuery.isWindow( elem ) ) {
        +                    // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
        +                    // isn't a whole lot we can do. See pull request at this URL for discussion:
        +                    // https://github.com/jquery/jquery/pull/764
        +                    return elem.document.documentElement[ "client" + name ];
        +                }
        +
        +                // Get document width or height
        +                if ( elem.nodeType === 9 ) {
        +                    doc = elem.documentElement;
        +
        +                    // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
        +                    // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
        +                    return Math.max(
        +                        elem.body[ "scroll" + name ], doc[ "scroll" + name ],
        +                        elem.body[ "offset" + name ], doc[ "offset" + name ],
        +                        doc[ "client" + name ]
        +                    );
        +                }
        +
        +                return value === undefined ?
        +                    // Get width or height on the element, requesting but not forcing parseFloat
        +                    jQuery.css( elem, type, extra ) :
        +
        +                    // Set width or height on the element
        +                    jQuery.style( elem, type, value, extra );
        +            }, type, chainable ? margin : undefined, chainable, null );
        +        };
        +    });
        +});
        +// Limit scope pollution from any deprecated API
        +// (function() {
        +
        +// })();
        +// Expose jQuery to the global object
        +window.jQuery = window.$ = jQuery;
        +
        +// Expose jQuery as an AMD module, but only for AMD loaders that
        +// understand the issues with loading multiple versions of jQuery
        +// in a page that all might call define(). The loader will indicate
        +// they have special allowances for multiple jQuery versions by
        +// specifying define.amd.jQuery = true. Register as a named module,
        +// since jQuery can be concatenated with other files that may use define,
        +// but not use a proper concatenation script that understands anonymous
        +// AMD modules. A named AMD is safest and most robust way to register.
        +// Lowercase jquery is used because AMD module names are derived from
        +// file names, and jQuery is normally delivered in a lowercase file name.
        +// Do this after creating the global so that if an AMD module wants to call
        +// noConflict to hide this version of jQuery, it will work.
        +if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
        +    define( "jquery", [], function () { return jQuery; } );
        +}
        +
        +})( window );
        \ No newline at end of file
        diff --git a/bower_components/tether/docs/welcome/js/log.js b/bower_components/tether/docs/welcome/js/log.js
        new file mode 100644
        index 0000000000..6acd4fd9ef
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/js/log.js
        @@ -0,0 +1,134 @@
        +(function() {
        +  var ffSupport, formats, getOrderedMatches, hasMatches, isFF, isIE, isOpera, isSafari, log, makeArray, operaSupport, safariSupport, stringToArgs, _log;
        +  if (!(window.console && window.console.log)) {
        +    return;
        +  }
        +  log = function() {
        +    var args;
        +    args = [];
        +    makeArray(arguments).forEach(function(arg) {
        +      if (typeof arg === 'string') {
        +        return args = args.concat(stringToArgs(arg));
        +      } else {
        +        return args.push(arg);
        +      }
        +    });
        +    return _log.apply(window, args);
        +  };
        +  _log = function() {
        +    return console.log.apply(console, makeArray(arguments));
        +  };
        +  makeArray = function(arrayLikeThing) {
        +    return Array.prototype.slice.call(arrayLikeThing);
        +  };
        +  formats = [
        +    {
        +      regex: /\*([^\*]+)\*/,
        +      replacer: function(m, p1) {
        +        return "%c" + p1 + "%c";
        +      },
        +      styles: function() {
        +        return ['font-style: italic', ''];
        +      }
        +    }, {
        +      regex: /\_([^\_]+)\_/,
        +      replacer: function(m, p1) {
        +        return "%c" + p1 + "%c";
        +      },
        +      styles: function() {
        +        return ['font-weight: bold', ''];
        +      }
        +    }, {
        +      regex: /\`([^\`]+)\`/,
        +      replacer: function(m, p1) {
        +        return "%c" + p1 + "%c";
        +      },
        +      styles: function() {
        +        return ['background: rgb(255, 255, 219); padding: 1px 5px; border: 1px solid rgba(0, 0, 0, 0.1)', ''];
        +      }
        +    }, {
        +      regex: /\[c\=(?:\"|\')?((?:(?!(?:\"|\')\]).)*)(?:\"|\')?\]((?:(?!\[c\]).)*)\[c\]/,
        +      replacer: function(m, p1, p2) {
        +        return "%c" + p2 + "%c";
        +      },
        +      styles: function(match) {
        +        return [match[1], ''];
        +      }
        +    }
        +  ];
        +  hasMatches = function(str) {
        +    var _hasMatches;
        +    _hasMatches = false;
        +    formats.forEach(function(format) {
        +      if (format.regex.test(str)) {
        +        return _hasMatches = true;
        +      }
        +    });
        +    return _hasMatches;
        +  };
        +  getOrderedMatches = function(str) {
        +    var matches;
        +    matches = [];
        +    formats.forEach(function(format) {
        +      var match;
        +      match = str.match(format.regex);
        +      if (match) {
        +        return matches.push({
        +          format: format,
        +          match: match
        +        });
        +      }
        +    });
        +    return matches.sort(function(a, b) {
        +      return a.match.index - b.match.index;
        +    });
        +  };
        +  stringToArgs = function(str) {
        +    var firstMatch, matches, styles;
        +    styles = [];
        +    while (hasMatches(str)) {
        +      matches = getOrderedMatches(str);
        +      firstMatch = matches[0];
        +      str = str.replace(firstMatch.format.regex, firstMatch.format.replacer);
        +      styles = styles.concat(firstMatch.format.styles(firstMatch.match));
        +    }
        +    return [str].concat(styles);
        +  };
        +  isSafari = function() {
        +    return /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
        +  };
        +  isOpera = function() {
        +    return /OPR/.test(navigator.userAgent) && /Opera/.test(navigator.vendor);
        +  };
        +  isFF = function() {
        +    return /Firefox/.test(navigator.userAgent);
        +  };
        +  isIE = function() {
        +    return /MSIE/.test(navigator.userAgent);
        +  };
        +  safariSupport = function() {
        +    var m;
        +    m = navigator.userAgent.match(/AppleWebKit\/(\d+)\.(\d+)(\.|\+|\s)/);
        +    if (!m) {
        +      return false;
        +    }
        +    return 537.38 <= parseInt(m[1], 10) + (parseInt(m[2], 10) / 100);
        +  };
        +  operaSupport = function() {
        +    var m;
        +    m = navigator.userAgent.match(/OPR\/(\d+)\./);
        +    if (!m) {
        +      return false;
        +    }
        +    return 15 <= parseInt(m[1], 10);
        +  };
        +  ffSupport = function() {
        +    return window.console.firebug || window.console.exception;
        +  };
        +  if (isIE() || (isFF() && !ffSupport()) || (isOpera() && !operaSupport()) || (isSafari() && !safariSupport())) {
        +    window.log = _log;
        +  } else {
        +    window.log = log;
        +  }
        +  window.log.l = _log;
        +}).call(this);
        \ No newline at end of file
        diff --git a/bower_components/tether/docs/welcome/js/tether-v0.1.3.js b/bower_components/tether/docs/welcome/js/tether-v0.1.3.js
        new file mode 100644
        index 0000000000..98af16f1b0
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/js/tether-v0.1.3.js
        @@ -0,0 +1,2 @@
        +/*! tether.js 0.1.3 */
        +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r=[].slice,s=function(a,b){return function(){return a.apply(b,arguments)}};a=jQuery,l=/msie [\w.]+/.test(navigator.userAgent.toLowerCase()),k=function(b){var c,d;return c=b.css("position"),"fixed"===c?b:(d=void 0,d="absolute"===c||l&&("static"===c||"relative"===c)?b.parents().filter(function(){var b;return("relative"===(b=a.css(this,"position"))||"absolute"===b||"fixed"===b)&&/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).first():b.parents().filter(function(){return/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).first(),d.length?d:a("html"))},b=16,j=function(a,c){var d;return null==c&&(c=b),d=!1,function(){var b,e=this;if(!d)return b=arguments,d=!0,setTimeout(function(){return d=!1,a.apply(e,b)},c),!0}},q=[],p=function(){var a,b,c;for(b=0,c=q.length;c>b;b++)a=q[b],a.position();return!0},l&&(p=j(p)),a(window).on("resize scroll",p),c={center:"center",left:"right",right:"left"},d={middle:"middle",top:"bottom",bottom:"top"},e={top:"0",left:"0",middle:"50%",center:"50%",bottom:"100%",right:"100%"},i=function(a,b){var e,f;return e=a.left,f=a.top,"auto"===e&&(e=c[b.left]),"auto"===f&&(f=d[b.top]),{left:e,top:f}},h=function(a){var b,c;return{left:null!=(b=e[a.left])?b:a.left,top:null!=(c=e[a.top])?c:a.top}},g=function(){var a,b,c,d,e,f,g;for(b=1<=arguments.length?r.call(arguments,0):[],c={top:0,left:0},e=0,f=b.length;f>e;e++)g=b[e],d=g.top,a=g.left,"string"==typeof d&&(d=parseFloat(d,10)),"string"==typeof a&&(a=parseFloat(a,10)),c.top+=d,c.left+=a;return c},m=function(b,c){return"string"==typeof b.left&&-1!==b.left.indexOf("%")&&(b.left=parseFloat(b.left,10)/100*a(c).outerWidth()),"string"==typeof b.top&&-1!==b.top.indexOf("%")&&(b.top=parseFloat(b.top,10)/100*a(c).outerHeight()),b},n=o=function(a){var b,c,d;return d=a.split(" "),c=d[0],b=d[1],{top:c,left:b}},f=function(){function b(a){this.position=s(this.position,this);var c,d,e,f,g;for(q.push(this),this.history=[],this.setOptions(a,!1),f=b.modules,d=0,e=f.length;e>d;d++)c=f[d],null!=(g=c.initialize)&&g.call(this);this.position()}return b.modules=[],b.prototype.setOptions=function(b,c){var d,e;return this.options=b,null==c&&(c=!0),d={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto"},this.options=a.extend(d,this.options),e=this.options,this.element=e.element,this.target=e.target,this.element.jquery&&(this.$element=this.element,this.element=this.element[0]),this.target.jquery&&(this.$target=this.target,this.target=this.target[0]),null==this.$element&&(this.$element=a(this.element)),null==this.$target&&(this.$target=a(this.target)),this.$element.addClass("tether-element"),this.$target.addClass("tether-target"),this.targetAttachment=n(this.options.targetAttachment),this.attachment=n(this.options.attachment),this.offset=o(this.options.offset),this.targetOffset=o(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent=k(a(this.target)),this.options.enabled!==!1?this.enable(c):void 0},b.prototype.enable=function(a){return null==a&&(a=!0),this.addClass("tether-enabled"),this.enabled=!0,this.scrollParent.on("scroll",this.position),a?this.position():void 0},b.prototype.disable=function(){return this.removeClass("tether-enabled"),this.enabled=!1,null!=this.scrollParent?this.scrollParent.off("scroll",this.position):void 0},b.prototype.destroy=function(){var a,b,c,d,e;for(this.disable(),e=[],a=c=0,d=q.length;d>c;a=++c){if(b=q[a],b===this){q.splice(a,1);break}e.push(void 0)}return e},b.prototype.updateAttachClasses=function(a,b){var c,d,e,f,g,h;for(null==a&&(a=this.attachment),null==b&&(b=this.targetAttachment),d=["left","top","bottom","right","middle","center"],e=0,g=d.length;g>e;e++)c=d[e],this.removeClass("tether-element-attached-"+c);for(a.top&&this.addClass("tether-element-attached-"+a.top),a.left&&this.addClass("tether-element-attached-"+a.left),f=0,h=d.length;h>f;f++)c=d[f],this.removeClass("tether-target-attached-"+c);return b.top&&this.addClass("tether-target-attached-"+b.top),b.left?this.addClass("tether-target-attached-"+b.left):void 0},b.prototype.addClass=function(a){return this.$element.addClass(a),this.$target.addClass(a)},b.prototype.removeClass=function(a){return this.$element.removeClass(a),this.$target.removeClass(a)},b.prototype.position=function(){var a,c,d,e,f,j,k,l,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F;if(this.enabled){for(u=i(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,u),n=m(h(this.attachment),this.element),v=m(h(u),this.target),f=m(this.offset,this.element),j=m(this.targetOffset,this.target),n=g(n,f),v=g(v,j),w=this.$target.offset(),c=this.$element.offset(),e=w.left+v.left-n.left,x=w.top+v.top-n.top,D=b.modules,z=0,B=D.length;B>z;z++)if(k=D[z],q=k.position.call(this,{left:e,top:x,targetAttachment:u,targetPos:w,elementPos:c,offset:n,targetOffset:v,manualOffset:f,manualTargetOffset:j}),null!=q&&"object"==typeof q){if(q===!1)return!1;x=q.top,e=q.left}if(y=this.$element.outerWidth(),d=this.$element.outerHeight(),l={page:{top:x,bottom:document.body.scrollHeight-x-d,left:e,right:document.body.scrollWidth-e-y},viewport:{top:x-pageYOffset,bottom:pageYOffset-x-d+innerHeight,left:e-pageXOffset,right:pageXOffset-e-y+innerWidth}},(null!=(E=this.options.optimizations)?E.moveElement:void 0)!==!1){for(a=this.$target.offsetParent(),p=a.offset(),o={},F=["top","left","bottom","right"],A=0,C=F.length;C>A;A++)t=F[A],o[t]=parseFloat(a.css("border-"+t+"-width"));p.left+=o.left,p.top+=o.top,p.right=document.body.scrollWidth-p.left-a.width(),p.bottom=document.body.scrollHeight-p.top-a.height(),l.page.top>=p.top&&l.page.bottom>=p.bottom&&l.page.left>=p.left&&l.page.right>=p.right&&(s=a.scrollTop(),r=a.scrollLeft(),l.offset={top:l.page.top-p.top+s+o.top,left:l.page.left-p.left+r+o.left,right:l.page.right-p.right-r+o.right,bottom:l.page.bottom-p.bottom-s+o.bottom})}return this.move(l),this.history.unshift(l),this.history.length>3&&this.history.pop(),!0}},b.prototype.move=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;j={};for(m in b){j[m]={};for(f in b[m]){for(e=!1,t=this.history,p=0,r=t.length;r>p;p++)if(i=t[p],(null!=(u=i[m])?u[f]:void 0)!==b[m][f]){e=!0;break}e||(j[m][f]=!0)}}if(d={top:"",left:"",right:"",bottom:""},l=function(a,b){return a.top?d.top=""+b.top+"px":d.bottom=""+b.bottom+"px",a.left?d.left=""+b.left+"px":d.right=""+b.right+"px"},g=!1,(j.page.top||j.page.bottom)&&(j.page.left||j.page.right))d.position="absolute",l(j.page,b.page);else if((j.viewport.top||j.viewport.bottom)&&(j.viewport.left||j.viewport.right))d.position="fixed",l(j.viewport,b.viewport);else if(null!=j.offset&&(j.offset.top||j.offset.bottom)&&(j.offset.left||j.offset.right)){for(d.position="absolute",c=this.$target.offsetParent(),this.$element.offsetParent()[0]!==c[0]&&(this.$element.detach(),c.append(this.$element)),h=a.extend({},b.offset),v=["top","left","bottom","right"],q=0,s=v.length;s>q;q++)k=v[q],h[k]-=parseFloat(c.css("border-"+k+"-width"),10);l(j.offset,h),g=!0}else d.position="absolute",d.top=""+b.page.top+"px",d.left=""+b.page.left+"px";g||this.$element.parent().is("body")||(this.$element.detach(),a(document.body).append(this.$element)),o=!1;for(f in d)if(n=d[f],this.$element.css(f)!==n){o=!0;break}return o?this.$element.css(d):void 0},b}(),window.Tether=f}).call(this),function(){var a,b,c,d,e=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};a=jQuery,c={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},b=["left","top","right","bottom"],d=function(c,d){var e,f,g,h,i,j;if("scrollParent"===d?d=c.scrollParent[0]:"window"===d&&(d=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),null!=d.nodeType)for(e=a(d),g=e.offset(),d=[g.left,g.top,e.width()+g.left,e.height()+g.top],f=i=0,j=b.length;j>i;f=++i)h=b[f],d[f]+=parseFloat(e.css("border-"+h+"-width"),10);return d},Tether.modules.push({position:function(c){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T=this;if(C=c.top,n=c.left,y=c.targetAttachment,this.options.constraints){for(u=function(a){var c,d,e,f;for(T.removeClass(a),f=[],d=0,e=b.length;e>d;d++)c=b[d],f.push(T.removeClass(""+a+"-"+c));return f},m=this.$element.outerHeight(),D=this.$element.outerWidth(),z=this.$target.outerHeight(),A=this.$target.outerWidth(),x={},l={},v=["tether-pinned","tether-out-of-bounds"],O=this.options.constraints,E=0,I=O.length;I>E;E++)k=O[E],k.outOfBoundsClass&&v.push(k.outOfBoundsClass),k.pinnedClass&&v.push(k.pinnedClass);for(F=0,J=v.length;J>F;F++)j=v[F],u(j);for(x=a.extend({},y),l=a.extend({},this.attachment),P=this.options.constraints,G=0,K=P.length;K>G;G++){if(k=P[G],B=k.to,f=k.attachment,r=k.pin,null==f&&(f=""),e.call(f," ")>=0?(Q=f.split(" "),i=Q[0],h=Q[1]):h=i=f,g=d(this,B),("target"===i||"both"===i)&&(C<g[1]&&"top"===x.top&&(C+=z,x.top="bottom"),C+m>g[3]&&"bottom"===x.top&&(C-=z,x.top="top")),"together"===i&&(C<g[1]&&"top"===x.top&&("bottom"===l.top?(C+=z,x.top="bottom",C+=m,l.top="top"):"top"===l.top&&(C+=z,x.top="bottom",C-=m,l.top="bottom")),C+m>g[3]&&"bottom"===x.top&&("top"===l.top?(C-=z,x.top="top",C-=m,l.top="bottom"):"bottom"===l.top&&(C-=z,x.top="top",C+=m,l.top="top"))),("target"===h||"both"===h)&&(n<g[0]&&"left"===x.left&&(n+=A,x.left="right"),n+D>g[2]&&"right"===x.left&&(n-=A,x.left="left")),"together"===h&&(n<g[0]&&"left"===x.left?"right"===l.left?(n+=A,x.left="right",n+=D,l.left="left"):"left"===l.left&&(n+=A,x.left="right",n-=D,l.left="right"):n+D>g[2]&&"right"===x.left&&("left"===l.left?(n-=A,x.left="left",n-=D,l.left="right"):"right"===l.left&&(n-=A,x.left="left",n+=D,l.left="left"))),("element"===i||"both"===i)&&(C<g[1]&&"bottom"===l.top&&(C+=m,l.top="top"),C+m>g[3]&&"top"===l.top&&(C-=m,l.top="bottom")),("element"===h||"both"===h)&&(n<g[0]&&"right"===l.left&&(n+=D,l.left="left"),n+D>g[2]&&"left"===l.left&&(n-=D,l.left="right")),"string"==typeof r?r=function(){var a,b,c,d;for(c=r.split(","),d=[],a=0,b=c.length;b>a;a++)q=c[a],d.push(q.trim());return d}():r===!0&&(r=["top","left","right","bottom"]),r||(r=[]),s=[],o=[],C<g[1]&&(e.call(r,"top")>=0?(C=g[1],s.push("top")):o.push("top")),C+m>g[3]&&(e.call(r,"bottom")>=0?(C=g[3]-m,s.push("bottom")):o.push("bottom")),n<g[0]&&(e.call(r,"left")>=0?(n=g[0],s.push("left")):o.push("left")),n+D>g[2]&&(e.call(r,"right")>=0?(n=g[2]-D,s.push("right")):o.push("right")),s.length)for(t=null!=(R=this.options.pinnedClass)?R:"tether-pinned",this.addClass(t),H=0,L=s.length;L>H;H++)w=s[H],this.addClass(""+t+"-"+w);if(o.length)for(p=null!=(S=this.options.outOfBoundsClass)?S:"tether-out-of-bounds",this.addClass(p),N=0,M=o.length;M>N;N++)w=o[N],this.addClass(""+p+"-"+w);(e.call(s,"left")>=0||e.call(s,"right")>=0)&&(l.left=x.left=!1),(e.call(s,"top")>=0||e.call(s,"bottom")>=0)&&(l.top=x.top=!1),(x.top!==y.top||x.left!==y.left||l.top!==this.attachment.top||l.left!==this.attachment.left)&&this.updateAttachClasses(l,x)}return{top:C,left:n}}}})}.call(this),function(){var a;a=jQuery,Tether.modules.push({position:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y;if(l=a.top,e=a.left,d=this.$element.outerHeight(),m=this.$element.outerWidth(),i=this.$target.outerHeight(),k=this.$target.outerWidth(),j=this.$target.offset(),j.bottom=j.top+i,j.right=j.left+k,c=l+d,f=e+m,b=[],l<=j.bottom&&c>=j.top)for(v=["left","right"],n=0,r=v.length;r>n;n++)g=v[n],((w=j[g])===e||w===f)&&b.push(g);if(e<=j.right&&f>=j.left)for(x=["top","bottom"],o=0,s=x.length;s>o;o++)g=x[o],((y=j[g])===l||y===c)&&b.push(g);for(h=["left","top","right","bottom"],this.removeClass("tether-abutted"),p=0,t=h.length;t>p;p++)g=h[p],this.removeClass("tether-abutted-"+g);for(b.length&&this.addClass("tether-abutted"),q=0,u=b.length;u>q;q++)g=b[q],this.addClass("tether-abutted-"+g);return!0}})}.call(this),function(){Tether.modules.push({position:function(a){var b,c,d,e,f,g,h;return g=a.top,b=a.left,this.options.shift?(c=function(a){return"function"==typeof a?a.call(this,{top:g,left:b}):a},d=c(this.options.shift),"string"==typeof d?(d=d.split(" "),d[1]||(d[1]=d[0]),f=d[0],e=d[1],f=parseFloat(f,10),e=parseFloat(e,10)):(h=[d.top,d.left],f=h[0],e=h[1]),g+=f,b+=e,{top:g,left:b}):void 0}})}.call(this);
        \ No newline at end of file
        diff --git a/bower_components/tether/docs/welcome/js/welcome.js b/bower_components/tether/docs/welcome/js/welcome.js
        new file mode 100644
        index 0000000000..6f587e61b8
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/js/welcome.js
        @@ -0,0 +1,193 @@
        +(function() {
        +  var init, isMobile, setupBrowserDemo, setupHero, _Drop;
        +
        +  _Drop = Drop.createContext({
        +    classPrefix: 'tether'
        +  });
        +
        +  isMobile = $(window).width() < 567;
        +
        +  init = function() {
        +    setupHero();
        +    return setupBrowserDemo();
        +  };
        +
        +  setupHero = function() {
        +    var $target, finalDropState, frameLengthMS, frames, openAllDrops, openIndex, openNextDrop, position, positions, _i, _len;
        +    $target = $('.tether-target-demo');
        +    positions = ['top left', 'left top', 'left middle', 'left bottom', 'bottom left', 'bottom center', 'bottom right', 'right bottom', 'right middle', 'right top', 'top right', 'top center'];
        +    if (isMobile) {
        +      positions = ['top left', 'bottom left', 'bottom right', 'top right'];
        +    }
        +    window.drops = {};
        +    for (_i = 0, _len = positions.length; _i < _len; _i++) {
        +      position = positions[_i];
        +      drops[position] = new _Drop({
        +        target: $target[0],
        +        classes: 'tether-theme-arrows-dark',
        +        position: position,
        +        constrainToWindow: false,
        +        openOn: '',
        +        content: '<div style="height: 50px; width: 50px"></div>'
        +      });
        +    }
        +    openIndex = 0;
        +    frames = 0;
        +    frameLengthMS = 10;
        +    openAllDrops = function() {
        +      var drop, _results;
        +      _results = [];
        +      for (position in drops) {
        +        drop = drops[position];
        +        _results.push(drop.open());
        +      }
        +      return _results;
        +    };
        +    openNextDrop = function() {
        +      var drop;
        +      for (position in drops) {
        +        drop = drops[position];
        +        drop.close();
        +      }
        +      drops[positions[openIndex]].open();
        +      drops[positions[(openIndex + 6) % positions.length]].open();
        +      openIndex = (openIndex + 1) % positions.length;
        +      if (frames > 5) {
        +        finalDropState();
        +        return;
        +      }
        +      frames += 1;
        +      return setTimeout(openNextDrop, frameLengthMS * frames);
        +    };
        +    finalDropState = function() {
        +      $(drops['top left'].dropContent).html('Marrying DOM elements for life.');
        +      $(drops['bottom right'].dropContent).html('<a class="button" href="http://github.com/HubSpot/tether">★ On Github</a>');
        +      drops['top left'].open();
        +      return drops['bottom right'].open();
        +    };
        +    if (true || isMobile) {
        +      drops['top left'].open();
        +      drops['top left'].tether.position();
        +      drops['bottom right'].open();
        +      drops['bottom right'].tether.position();
        +      return finalDropState();
        +    } else {
        +      return openNextDrop();
        +    }
        +  };
        +
        +  setupBrowserDemo = function() {
        +    var $browserContents, $browserDemo, $iframe, $sections, $startPoint, $stopPoint, scrollInterval, scrollTop, scrollTopDirection, setSection;
        +    $browserDemo = $('.browser-demo.showcase');
        +    $startPoint = $('.browser-demo-start-point');
        +    $stopPoint = $('.browser-demo-stop-point');
        +    $iframe = $('.browser-window iframe');
        +    $browserContents = $('.browser-content .browser-demo-inner');
        +    $sections = $('.browser-demo-section');
        +    $('body').append("<style>\n    table.showcase.browser-demo.fixed-bottom {\n        top: " + $sections.length + "00%\n    }\n</style>");
        +    $(window).scroll(function() {
        +      var scrollTop;
        +      scrollTop = $(window).scrollTop();
        +      if ($startPoint.position().top < scrollTop && scrollTop + window.innerHeight < $stopPoint.position().top) {
        +        $browserDemo.removeClass('fixed-bottom');
        +        $browserDemo.addClass('fixed');
        +        return $sections.each(function() {
        +          var $section;
        +          $section = $(this);
        +          if (($section.position().top < scrollTop && scrollTop < $section.position().top + $section.outerHeight())) {
        +            setSection($section.data('section'));
        +          }
        +          return true;
        +        });
        +      } else {
        +        $browserDemo.removeAttr('data-section');
        +        $browserDemo.removeClass('fixed');
        +        if (scrollTop + window.innerHeight > $stopPoint.position().top) {
        +          return $browserDemo.addClass('fixed-bottom');
        +        } else {
        +          return $browserDemo.removeClass('fixed-bottom');
        +        }
        +      }
        +    });
        +    $iframe.load(function() {
        +      var $items, iframeWindow;
        +      iframeWindow = $iframe[0].contentWindow;
        +      $items = $iframe.contents().find('.item');
        +      return $items.each(function(i) {
        +        var $item, drop, _iframeWindowDrop;
        +        $item = $(this);
        +        _iframeWindowDrop = iframeWindow.Drop.createContext({
        +          classPrefix: 'tether'
        +        });
        +        drop = new _iframeWindowDrop({
        +          target: $item[0],
        +          classes: 'tether-theme-arrows-dark',
        +          position: 'right top',
        +          constrainToWindow: true,
        +          openOn: 'click',
        +          content: '<ul>\n    <li>Action&nbsp;1</li>\n    <li>Action&nbsp;2</li>\n    <li>Action&nbsp;3</li>\n</ul>'
        +        });
        +        return $item.data('drop', drop);
        +      });
        +    });
        +    scrollInterval = void 0;
        +    scrollTop = 0;
        +    scrollTopDirection = 1;
        +    return setSection = function(section) {
        +      var closeAllItems, openExampleItem, scrollLeftSection, stopScrollingLeftSection;
        +      $browserDemo.attr('data-section', section);
        +      $('.section-copy').removeClass('active');
        +      $(".section-copy[data-section=\"" + section + "\"]").addClass('active');
        +      openExampleItem = function() {
        +        if (isMobile) {
        +          return $iframe.contents().find('.item:first').data().drop.open();
        +        } else {
        +          return $iframe.contents().find('.item:eq(2)').data().drop.open();
        +        }
        +      };
        +      closeAllItems = function() {
        +        return $iframe.contents().find('.item').each(function() {
        +          return $(this).data().drop.close() || true;
        +        });
        +      };
        +      scrollLeftSection = function() {
        +        return scrollInterval = setInterval(function() {
        +          $iframe.contents().find('.left').scrollTop(scrollTop);
        +          scrollTop += scrollTopDirection;
        +          if (scrollTop > 50) {
        +            scrollTopDirection = -1;
        +          }
        +          if (scrollTop < 0) {
        +            return scrollTopDirection = 1;
        +          }
        +        }, 30);
        +      };
        +      stopScrollingLeftSection = function() {
        +        return clearInterval(scrollInterval);
        +      };
        +      switch (section) {
        +        case 'what':
        +          closeAllItems();
        +          openExampleItem();
        +          return stopScrollingLeftSection();
        +        case 'how':
        +          closeAllItems();
        +          openExampleItem();
        +          stopScrollingLeftSection();
        +          return scrollLeftSection();
        +        case 'why':
        +          closeAllItems();
        +          openExampleItem();
        +          stopScrollingLeftSection();
        +          return scrollLeftSection();
        +        case 'outro':
        +          closeAllItems();
        +          openExampleItem();
        +          return stopScrollingLeftSection();
        +      }
        +    };
        +  };
        +
        +  init();
        +
        +}).call(this);
        diff --git a/bower_components/tether/docs/welcome/sass/_inline-block.sass b/bower_components/tether/docs/welcome/sass/_inline-block.sass
        new file mode 100644
        index 0000000000..544a085d64
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/sass/_inline-block.sass
        @@ -0,0 +1,6 @@
        +@mixin inline-block
        +    display: inline-block
        +    vertical-align: middle
        +    *vertical-align: auto
        +    *zoom: 1
        +    *display: inline
        diff --git a/bower_components/tether/docs/welcome/sass/browser-demo.sass b/bower_components/tether/docs/welcome/sass/browser-demo.sass
        new file mode 100644
        index 0000000000..2073798cd8
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/sass/browser-demo.sass
        @@ -0,0 +1,93 @@
        +@import inline-block
        +
        +html, body
        +    height: 100%
        +    overflow: hidden
        +    font-family: "proxima-nova", sans-serif
        +
        +.tether.tether-theme-arrows-dark .tether-content
        +    filter: none
        +    background: #000
        +
        +    ul
        +        color: #fff
        +        list-style: none
        +        padding: 0
        +        margin: 0
        +
        +.tether.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before
        +    border-right-color: #000
        +
        +.browser-demo
        +    position: absolute
        +    top: 0
        +    left: 0
        +    bottom: 0
        +    right: 0
        +
        +    *, *:after, *:before
        +        box-sizing: border-box
        +
        +    .top
        +        position: absolute
        +        height: 60px
        +        padding: 20px
        +        line-height: 40px
        +        width: 100%
        +        border-bottom: 1px solid rgba(0, 0, 0, .1)
        +
        +    .bottom
        +        position: absolute
        +        top: 60px
        +        bottom: 0
        +        width: 100%
        +
        +        .left
        +            border-right: 1px solid rgba(0, 0, 0, .1)
        +            position: absolute
        +            width: 30%
        +            height: 100%
        +            overflow: auto
        +
        +            .item
        +                height: 64px
        +                border-bottom: 1px solid rgba(0, 0, 0, .1)
        +                cursor: pointer
        +
        +                &:hover, &.tether-open
        +                    background: rgba(0, 0, 0, .1)
        +                    border-bottom: 1px solid rgba(0, 0, 0, 0)
        +
        +                &:last-child
        +                    border-bottom: 0
        +
        +        .right
        +            position: absolute
        +            width: 70%
        +            right: 0
        +            height: 100%
        +            padding: 20px
        +
        +    .title
        +        +inline-block
        +        background: rgba(0, 0, 0, .1)
        +        width: 150px
        +        height: 15px
        +        margin-bottom: 20px
        +
        +    .word
        +        +inline-block
        +        background: rgba(0, 0, 0, .1)
        +        width: 50px
        +        height: 8px
        +        margin-right: 5px
        +        margin-bottom: 5px
        +
        +        &:nth-last-child(4n+1)
        +            width: 73px
        +
        +        &:nth-last-child(10n+1)
        +            width: 14px
        +
        +        &:nth-last-child(9n+1)
        +            width: 80px
        diff --git a/bower_components/tether/docs/welcome/sass/welcome.sass b/bower_components/tether/docs/welcome/sass/welcome.sass
        new file mode 100644
        index 0000000000..92992123ba
        --- /dev/null
        +++ b/bower_components/tether/docs/welcome/sass/welcome.sass
        @@ -0,0 +1,285 @@
        +@import inline-block
        +
        +html, body
        +    height: 100%
        +
        +body
        +    margin: 0
        +    font-family: "proxima-nova", "Helvetica Neue", sans-serif
        +
        +.button
        +    display: inline-block
        +    border: 2px solid #333
        +    color: #333
        +    padding: 1em 1.25em
        +    font-weight: 500
        +    text-transform: uppercase
        +    letter-spacing: 3px
        +    text-decoration: none
        +    cursor: pointer
        +    width: 140px
        +    font-size: .8em
        +    line-height: 1.3em
        +    text-align: center
        +
        +.tether-element.tether-theme-arrows-dark .tether-content
        +    padding: 1em
        +    font-size: 1.1em
        +
        +    .button
        +        border-color: #fff
        +        color: #fff
        +        width: 170px
        +        pointer-events: all
        +
        +.mobile-copy
        +    display: none
        +
        +    @media (max-width: 568px)
        +        display: block
        +
        +.button.dark
        +    background: #333
        +    color: #fff
        +
        +.hero-wrap
        +    height: 100%
        +    overflow: hidden
        +
        +table.showcase
        +    height: 100%
        +    width: 100%
        +    position: relative
        +
        +    &:after
        +        content: ""
        +        display: block
        +        position: absolute
        +        left: 0
        +        right: 0
        +        bottom: 20px
        +        margin: auto
        +        height: 0
        +        width: 0
        +        border-width: 18px
        +        border-style: solid
        +        border-color: transparent
        +        border-top-color: rgba(0, 0, 0, 0.2)
        +
        +    &.no-next-arrow:after
        +        display: none
        +
        +    .showcase-inner
        +        margin: 40px auto 60px
        +        padding: 10px
        +
        +        h1
        +            font-size: 50px
        +            text-align: center
        +            font-weight: 300
        +
        +            @media (max-width: 567px)
        +                font-size: 40px
        +
        +        h2
        +            font-size: 24px
        +            text-align: center
        +            font-weight: 300
        +            margin: 1em 0 1em
        +
        +            @media (max-width: 567px)
        +                font-size: 14px
        +
        +        p
        +            text-align: center
        +
        +    &.hero
        +        text-align: center
        +
        +        .tether-target-demo
        +            +inline-block
        +            border: 2px dotted #000
        +            margin: 5rem auto
        +            padding: 5rem
        +
        +            @media (max-width: 567px)
        +                padding: 1rem
        +
        +    &.share
        +        background: #f3f3f3
        +
        +    &.projects-showcase .showcase-inner
        +
        +        .projects-list
        +            width: 80%
        +            max-width: 1200px
        +            margin: 0 auto
        +
        +            .project
        +                color: inherit
        +                text-decoration: none
        +                position: relative
        +                width: 50%
        +                float: left
        +                text-align: center
        +                margin-bottom: 2rem
        +
        +                &:nth-child(odd)
        +                    clear: left
        +
        +            .os-icon
        +                width: 8rem
        +                height: 8rem
        +                margin-bottom: 1rem
        +                background-size: 100%
        +
        +            h1
        +                font-size: 2.5rem
        +
        +            p
        +                font-size: 1.3rem
        +
        +    &.browser-demo
        +        background-image: linear-gradient(top left, #723362 0%, #9d223c 100%)
        +        background-color: #9d223c
        +        position: absolute
        +        top: 100%
        +
        +        &.fixed
        +            position: fixed
        +            top: 0
        +            bottom: 0
        +            left: 0
        +            right: 0
        +            z-index: 1
        +
        +            .browser-demo-inner
        +                transition: width 2s ease-in-out, height 2s ease-in-out
        +
        +            // Sections
        +
        +            &[data-section="what"]
        +                box-shadow: 0 0 0 0
        +
        +            &[data-section="why"]
        +
        +                .browser-demo-inner
        +                    width: 70%
        +
        +            &[data-section="outro"]
        +
        +                .showcase-inner
        +                    pointer-events: all
        +
        +        .showcase-inner
        +            pointer-events: none
        +            position: absolute
        +            left: 10%
        +            right: 40%
        +            top: 220px
        +            bottom: 120px
        +            margin: 0
        +            padding: 0
        +
        +            @media (max-width: 567px)
        +                bottom: 90px
        +                top: 180px
        +
        +        .browser-demo-inner
        +            height: 100%
        +            width: 100%
        +
        +        .section-copy
        +            transition: opacity .5s ease-in-out, top .5s ease-in-out
        +            opacity: 0
        +            position: absolute
        +            top: 0
        +            position: absolute
        +            height: 200px
        +            color: #fff
        +            text-align: center
        +            width: 100%
        +
        +            &.active
        +                opacity: 1
        +                top: -150px
        +
        +                @media (max-width: 567px)
        +                    top: -130px
        +
        +            h2
        +                font-size: 40px
        +                font-weight: bold
        +                line-height: 1
        +                margin: 25px 0 15px
        +
        +                @media (max-width: 567px)
        +                    font-size: 30px
        +
        +        .browser-window
        +            border-radius: 4px
        +            background: #fff
        +            position: relative
        +            height: 100%
        +            width: 100%
        +            max-width: 1200px
        +            margin: 0 auto
        +
        +            .browser-titlebar
        +                position: absolute
        +                top: 0
        +                left: 0
        +                right: 0
        +                border-bottom: 1px solid #eee
        +                height: 55px
        +
        +                .browser-dots
        +                    padding: 16px
        +
        +                    b
        +                        +inline-block
        +                        border-radius: 50%
        +                        width: 10px
        +                        height: 10px
        +                        margin-right: 7px
        +                        background: rgba(0, 0, 0, .1)
        +
        +            .browser-frame
        +                position: absolute
        +                top: 55px
        +                left: 0
        +                right: 0
        +                bottom: 0
        +
        +                iframe
        +                    border-radius: 0 0 4px 4px
        +                    border: 0
        +                    width: 100%
        +                    height: 100%
        +
        +    &.browser-demo-section
        +
        +        .section-scroll-copy
        +            position: relative
        +            z-index: 10
        +            color: #fff
        +            width: 100%
        +            font-size: 22px
        +
        +            .section-scroll-copy-inner
        +                position: absolute
        +                z-index: 10
        +                color: #fff
        +                right: 10%
        +                width: 23%
        +
        +                a
        +                    color: inherit
        +
        +                .example-paragraph
        +                    border-radius: 4px
        +                    background: #000
        +                    padding: 1rem
        +
        +.browser-content
        +    display: none
        diff --git a/bower_components/tether/examples/chosen/chosen-sprite.png b/bower_components/tether/examples/chosen/chosen-sprite.png
        new file mode 100644
        index 0000000000..3611ae4ace
        Binary files /dev/null and b/bower_components/tether/examples/chosen/chosen-sprite.png differ
        diff --git a/bower_components/tether/examples/chosen/chosen-sprite@2x.png b/bower_components/tether/examples/chosen/chosen-sprite@2x.png
        new file mode 100644
        index 0000000000..6b50545202
        Binary files /dev/null and b/bower_components/tether/examples/chosen/chosen-sprite@2x.png differ
        diff --git a/bower_components/tether/examples/chosen/chosen.css b/bower_components/tether/examples/chosen/chosen.css
        new file mode 100644
        index 0000000000..828fe1f1ae
        --- /dev/null
        +++ b/bower_components/tether/examples/chosen/chosen.css
        @@ -0,0 +1,430 @@
        +/* @group Base */
        +.chosen-container {
        +  position: relative;
        +  display: inline-block;
        +  vertical-align: middle;
        +  font-size: 13px;
        +  zoom: 1;
        +  *display: inline;
        +  -webkit-user-select: none;
        +  -moz-user-select: none;
        +  user-select: none;
        +}
        +.chosen-container .chosen-drop {
        +  position: absolute;
        +  top: 100%;
        +  left: -9999px;
        +  z-index: 1010;
        +  -webkit-box-sizing: border-box;
        +  -moz-box-sizing: border-box;
        +  box-sizing: border-box;
        +  width: 100%;
        +  border: 1px solid #aaa;
        +  border-top: 0;
        +  background: #fff;
        +  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
        +}
        +.chosen-container.chosen-with-drop .chosen-drop {
        +  left: 0;
        +}
        +.chosen-container a {
        +  cursor: pointer;
        +}
        +
        +/* @end */
        +/* @group Single Chosen */
        +.chosen-container-single .chosen-single {
        +  position: relative;
        +  display: block;
        +  overflow: hidden;
        +  padding: 0 0 0 8px;
        +  height: 23px;
        +  border: 1px solid #aaa;
        +  border-radius: 5px;
        +  background-color: #fff;
        +  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
        +  background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
        +  background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
        +  background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
        +  background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
        +  background-clip: padding-box;
        +  box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
        +  color: #444;
        +  text-decoration: none;
        +  white-space: nowrap;
        +  line-height: 24px;
        +}
        +.chosen-container-single .chosen-default {
        +  color: #999;
        +}
        +.chosen-container-single .chosen-single span {
        +  display: block;
        +  overflow: hidden;
        +  margin-right: 26px;
        +  text-overflow: ellipsis;
        +  white-space: nowrap;
        +}
        +.chosen-container-single .chosen-single-with-deselect span {
        +  margin-right: 38px;
        +}
        +.chosen-container-single .chosen-single abbr {
        +  position: absolute;
        +  top: 6px;
        +  right: 26px;
        +  display: block;
        +  width: 12px;
        +  height: 12px;
        +  background: url('chosen-sprite.png') -42px 1px no-repeat;
        +  font-size: 1px;
        +}
        +.chosen-container-single .chosen-single abbr:hover {
        +  background-position: -42px -10px;
        +}
        +.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
        +  background-position: -42px -10px;
        +}
        +.chosen-container-single .chosen-single div {
        +  position: absolute;
        +  top: 0;
        +  right: 0;
        +  display: block;
        +  width: 18px;
        +  height: 100%;
        +}
        +.chosen-container-single .chosen-single div b {
        +  display: block;
        +  width: 100%;
        +  height: 100%;
        +  background: url('chosen-sprite.png') no-repeat 0px 2px;
        +}
        +.chosen-container-single .chosen-search {
        +  position: relative;
        +  z-index: 1010;
        +  margin: 0;
        +  padding: 3px 4px;
        +  white-space: nowrap;
        +}
        +.chosen-container-single .chosen-search input[type="text"] {
        +  -webkit-box-sizing: border-box;
        +  -moz-box-sizing: border-box;
        +  box-sizing: border-box;
        +  margin: 1px 0;
        +  padding: 4px 20px 4px 5px;
        +  width: 100%;
        +  height: auto;
        +  outline: 0;
        +  border: 1px solid #aaa;
        +  background: white url('chosen-sprite.png') no-repeat 100% -20px;
        +  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
        +  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  font-size: 1em;
        +  font-family: sans-serif;
        +  line-height: normal;
        +  border-radius: 0;
        +}
        +.chosen-container-single .chosen-drop {
        +  margin-top: -1px;
        +  border-radius: 0 0 4px 4px;
        +  background-clip: padding-box;
        +}
        +.chosen-container-single.chosen-container-single-nosearch .chosen-search {
        +  position: absolute;
        +  left: -9999px;
        +}
        +
        +/* @end */
        +/* @group Results */
        +.chosen-container .chosen-results {
        +  position: relative;
        +  overflow-x: hidden;
        +  overflow-y: auto;
        +  margin: 0 4px 4px 0;
        +  padding: 0 0 0 4px;
        +  max-height: 240px;
        +  -webkit-overflow-scrolling: touch;
        +}
        +.chosen-container .chosen-results li {
        +  display: none;
        +  margin: 0;
        +  padding: 5px 6px;
        +  list-style: none;
        +  line-height: 15px;
        +}
        +.chosen-container .chosen-results li.active-result {
        +  display: list-item;
        +  cursor: pointer;
        +}
        +.chosen-container .chosen-results li.disabled-result {
        +  display: list-item;
        +  color: #ccc;
        +  cursor: default;
        +}
        +.chosen-container .chosen-results li.highlighted {
        +  background-color: #3875d7;
        +  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
        +  background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
        +  background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
        +  background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
        +  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
        +  color: #fff;
        +}
        +.chosen-container .chosen-results li.no-results {
        +  display: list-item;
        +  background: #f4f4f4;
        +}
        +.chosen-container .chosen-results li.group-result {
        +  display: list-item;
        +  font-weight: bold;
        +  cursor: default;
        +}
        +.chosen-container .chosen-results li.group-option {
        +  padding-left: 15px;
        +}
        +.chosen-container .chosen-results li em {
        +  font-style: normal;
        +  text-decoration: underline;
        +}
        +
        +/* @end */
        +/* @group Multi Chosen */
        +.chosen-container-multi .chosen-choices {
        +  position: relative;
        +  overflow: hidden;
        +  -webkit-box-sizing: border-box;
        +  -moz-box-sizing: border-box;
        +  box-sizing: border-box;
        +  margin: 0;
        +  padding: 0;
        +  width: 100%;
        +  height: auto !important;
        +  height: 1%;
        +  border: 1px solid #aaa;
        +  background-color: #fff;
        +  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
        +  background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  cursor: text;
        +}
        +.chosen-container-multi .chosen-choices li {
        +  float: left;
        +  list-style: none;
        +}
        +.chosen-container-multi .chosen-choices li.search-field {
        +  margin: 0;
        +  padding: 0;
        +  white-space: nowrap;
        +}
        +.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
        +  margin: 1px 0;
        +  padding: 5px;
        +  height: 15px;
        +  outline: 0;
        +  border: 0 !important;
        +  background: transparent !important;
        +  box-shadow: none;
        +  color: #666;
        +  font-size: 100%;
        +  font-family: sans-serif;
        +  line-height: normal;
        +  border-radius: 0;
        +}
        +.chosen-container-multi .chosen-choices li.search-field .default {
        +  color: #999;
        +}
        +.chosen-container-multi .chosen-choices li.search-choice {
        +  position: relative;
        +  margin: 3px 0 3px 5px;
        +  padding: 3px 20px 3px 5px;
        +  border: 1px solid #aaa;
        +  border-radius: 3px;
        +  background-color: #e4e4e4;
        +  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
        +  background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  background-clip: padding-box;
        +  box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
        +  color: #333;
        +  line-height: 13px;
        +  cursor: default;
        +}
        +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
        +  position: absolute;
        +  top: 4px;
        +  right: 3px;
        +  display: block;
        +  width: 12px;
        +  height: 12px;
        +  background: url('chosen-sprite.png') -42px 1px no-repeat;
        +  font-size: 1px;
        +}
        +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
        +  background-position: -42px -10px;
        +}
        +.chosen-container-multi .chosen-choices li.search-choice-disabled {
        +  padding-right: 5px;
        +  border: 1px solid #ccc;
        +  background-color: #e4e4e4;
        +  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
        +  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
        +  color: #666;
        +}
        +.chosen-container-multi .chosen-choices li.search-choice-focus {
        +  background: #d4d4d4;
        +}
        +.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
        +  background-position: -42px -10px;
        +}
        +.chosen-container-multi .chosen-results {
        +  margin: 0;
        +  padding: 0;
        +}
        +.chosen-container-multi .chosen-drop .result-selected {
        +  display: list-item;
        +  color: #ccc;
        +  cursor: default;
        +}
        +
        +/* @end */
        +/* @group Active  */
        +.chosen-container-active .chosen-single {
        +  border: 1px solid #5897fb;
        +  box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
        +}
        +.chosen-container-active.chosen-with-drop .chosen-single {
        +  border: 1px solid #aaa;
        +  -moz-border-radius-bottomright: 0;
        +  border-bottom-right-radius: 0;
        +  -moz-border-radius-bottomleft: 0;
        +  border-bottom-left-radius: 0;
        +  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
        +  background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);
        +  background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);
        +  background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);
        +  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
        +  box-shadow: 0 1px 0 #fff inset;
        +}
        +.chosen-container-active.chosen-with-drop .chosen-single div {
        +  border-left: none;
        +  background: transparent;
        +}
        +.chosen-container-active.chosen-with-drop .chosen-single div b {
        +  background-position: -18px 2px;
        +}
        +.chosen-container-active .chosen-choices {
        +  border: 1px solid #5897fb;
        +  box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
        +}
        +.chosen-container-active .chosen-choices li.search-field input[type="text"] {
        +  color: #111 !important;
        +}
        +
        +/* @end */
        +/* @group Disabled Support */
        +.chosen-disabled {
        +  opacity: 0.5 !important;
        +  cursor: default;
        +}
        +.chosen-disabled .chosen-single {
        +  cursor: default;
        +}
        +.chosen-disabled .chosen-choices .search-choice .search-choice-close {
        +  cursor: default;
        +}
        +
        +/* @end */
        +/* @group Right to Left */
        +.chosen-rtl {
        +  text-align: right;
        +}
        +.chosen-rtl .chosen-single {
        +  overflow: visible;
        +  padding: 0 8px 0 0;
        +}
        +.chosen-rtl .chosen-single span {
        +  margin-right: 0;
        +  margin-left: 26px;
        +  direction: rtl;
        +}
        +.chosen-rtl .chosen-single-with-deselect span {
        +  margin-left: 38px;
        +}
        +.chosen-rtl .chosen-single div {
        +  right: auto;
        +  left: 3px;
        +}
        +.chosen-rtl .chosen-single abbr {
        +  right: auto;
        +  left: 26px;
        +}
        +.chosen-rtl .chosen-choices li {
        +  float: right;
        +}
        +.chosen-rtl .chosen-choices li.search-field input[type="text"] {
        +  direction: rtl;
        +}
        +.chosen-rtl .chosen-choices li.search-choice {
        +  margin: 3px 5px 3px 0;
        +  padding: 3px 5px 3px 19px;
        +}
        +.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
        +  right: auto;
        +  left: 4px;
        +}
        +.chosen-rtl.chosen-container-single-nosearch .chosen-search,
        +.chosen-rtl .chosen-drop {
        +  left: 9999px;
        +}
        +.chosen-rtl.chosen-container-single .chosen-results {
        +  margin: 0 0 4px 4px;
        +  padding: 0 4px 0 0;
        +}
        +.chosen-rtl .chosen-results li.group-option {
        +  padding-right: 15px;
        +  padding-left: 0;
        +}
        +.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
        +  border-right: none;
        +}
        +.chosen-rtl .chosen-search input[type="text"] {
        +  padding: 4px 5px 4px 20px;
        +  background: white url('chosen-sprite.png') no-repeat -30px -20px;
        +  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
        +  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
        +  direction: rtl;
        +}
        +.chosen-rtl.chosen-container-single .chosen-single div b {
        +  background-position: 6px 2px;
        +}
        +.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
        +  background-position: -12px 2px;
        +}
        +
        +/* @end */
        +/* @group Retina compatibility */
        +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
        +  .chosen-rtl .chosen-search input[type="text"],
        +  .chosen-container-single .chosen-single abbr,
        +  .chosen-container-single .chosen-single div b,
        +  .chosen-container-single .chosen-search input[type="text"],
        +  .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
        +  .chosen-container .chosen-results-scroll-down span,
        +  .chosen-container .chosen-results-scroll-up span {
        +    background-image: url('chosen-sprite@2x.png') !important;
        +    background-size: 52px 37px !important;
        +    background-repeat: no-repeat !important;
        +  }
        +}
        +/* @end */
        \ No newline at end of file
        diff --git a/bower_components/tether/examples/chosen/chosen.js b/bower_components/tether/examples/chosen/chosen.js
        new file mode 100644
        index 0000000000..521556ba53
        --- /dev/null
        +++ b/bower_components/tether/examples/chosen/chosen.js
        @@ -0,0 +1,1166 @@
        +// Chosen, a Select Box Enhancer for jQuery and Prototype
        +// by Patrick Filler for Harvest, http://getharvest.com
        +//
        +// Version 1.0.0
        +// Full source at https://github.com/harvesthq/chosen
        +// Copyright (c) 2011 Harvest http://getharvest.com
        +
        +// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
        +// This file is generated by `grunt build`, do not edit it by hand.
        +(function() {
        +  var $, AbstractChosen, Chosen, SelectParser, _ref,
        +    __hasProp = {}.hasOwnProperty,
        +    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
        +
        +  SelectParser = (function() {
        +    function SelectParser() {
        +      this.options_index = 0;
        +      this.parsed = [];
        +    }
        +
        +    SelectParser.prototype.add_node = function(child) {
        +      if (child.nodeName.toUpperCase() === "OPTGROUP") {
        +        return this.add_group(child);
        +      } else {
        +        return this.add_option(child);
        +      }
        +    };
        +
        +    SelectParser.prototype.add_group = function(group) {
        +      var group_position, option, _i, _len, _ref, _results;
        +
        +      group_position = this.parsed.length;
        +      this.parsed.push({
        +        array_index: group_position,
        +        group: true,
        +        label: this.escapeExpression(group.label),
        +        children: 0,
        +        disabled: group.disabled
        +      });
        +      _ref = group.childNodes;
        +      _results = [];
        +      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        +        option = _ref[_i];
        +        _results.push(this.add_option(option, group_position, group.disabled));
        +      }
        +      return _results;
        +    };
        +
        +    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
        +      if (option.nodeName.toUpperCase() === "OPTION") {
        +        if (option.text !== "") {
        +          if (group_position != null) {
        +            this.parsed[group_position].children += 1;
        +          }
        +          this.parsed.push({
        +            array_index: this.parsed.length,
        +            options_index: this.options_index,
        +            value: option.value,
        +            text: option.text,
        +            html: option.innerHTML,
        +            selected: option.selected,
        +            disabled: group_disabled === true ? group_disabled : option.disabled,
        +            group_array_index: group_position,
        +            classes: option.className,
        +            style: option.style.cssText
        +          });
        +        } else {
        +          this.parsed.push({
        +            array_index: this.parsed.length,
        +            options_index: this.options_index,
        +            empty: true
        +          });
        +        }
        +        return this.options_index += 1;
        +      }
        +    };
        +
        +    SelectParser.prototype.escapeExpression = function(text) {
        +      var map, unsafe_chars;
        +
        +      if ((text == null) || text === false) {
        +        return "";
        +      }
        +      if (!/[\&\<\>\"\'\`]/.test(text)) {
        +        return text;
        +      }
        +      map = {
        +        "<": "&lt;",
        +        ">": "&gt;",
        +        '"': "&quot;",
        +        "'": "&#x27;",
        +        "`": "&#x60;"
        +      };
        +      unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
        +      return text.replace(unsafe_chars, function(chr) {
        +        return map[chr] || "&amp;";
        +      });
        +    };
        +
        +    return SelectParser;
        +
        +  })();
        +
        +  SelectParser.select_to_array = function(select) {
        +    var child, parser, _i, _len, _ref;
        +
        +    parser = new SelectParser();
        +    _ref = select.childNodes;
        +    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        +      child = _ref[_i];
        +      parser.add_node(child);
        +    }
        +    return parser.parsed;
        +  };
        +
        +  AbstractChosen = (function() {
        +    function AbstractChosen(form_field, options) {
        +      this.form_field = form_field;
        +      this.options = options != null ? options : {};
        +      if (!AbstractChosen.browser_is_supported()) {
        +        return;
        +      }
        +      this.is_multiple = this.form_field.multiple;
        +      this.set_default_text();
        +      this.set_default_values();
        +      this.setup();
        +      this.set_up_html();
        +      this.register_observers();
        +    }
        +
        +    AbstractChosen.prototype.set_default_values = function() {
        +      var _this = this;
        +
        +      this.click_test_action = function(evt) {
        +        return _this.test_active_click(evt);
        +      };
        +      this.activate_action = function(evt) {
        +        return _this.activate_field(evt);
        +      };
        +      this.active_field = false;
        +      this.mouse_on_container = false;
        +      this.results_showing = false;
        +      this.result_highlighted = null;
        +      this.result_single_selected = null;
        +      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
        +      this.disable_search_threshold = this.options.disable_search_threshold || 0;
        +      this.disable_search = this.options.disable_search || false;
        +      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
        +      this.group_search = this.options.group_search != null ? this.options.group_search : true;
        +      this.search_contains = this.options.search_contains || false;
        +      this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
        +      this.max_selected_options = this.options.max_selected_options || Infinity;
        +      this.inherit_select_classes = this.options.inherit_select_classes || false;
        +      this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
        +      return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
        +    };
        +
        +    AbstractChosen.prototype.set_default_text = function() {
        +      if (this.form_field.getAttribute("data-placeholder")) {
        +        this.default_text = this.form_field.getAttribute("data-placeholder");
        +      } else if (this.is_multiple) {
        +        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
        +      } else {
        +        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
        +      }
        +      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
        +    };
        +
        +    AbstractChosen.prototype.mouse_enter = function() {
        +      return this.mouse_on_container = true;
        +    };
        +
        +    AbstractChosen.prototype.mouse_leave = function() {
        +      return this.mouse_on_container = false;
        +    };
        +
        +    AbstractChosen.prototype.input_focus = function(evt) {
        +      var _this = this;
        +
        +      if (this.is_multiple) {
        +        if (!this.active_field) {
        +          return setTimeout((function() {
        +            return _this.container_mousedown();
        +          }), 50);
        +        }
        +      } else {
        +        if (!this.active_field) {
        +          return this.activate_field();
        +        }
        +      }
        +    };
        +
        +    AbstractChosen.prototype.input_blur = function(evt) {
        +      var _this = this;
        +
        +      if (!this.mouse_on_container) {
        +        this.active_field = false;
        +        return setTimeout((function() {
        +          return _this.blur_test();
        +        }), 100);
        +      }
        +    };
        +
        +    AbstractChosen.prototype.results_option_build = function(options) {
        +      var content, data, _i, _len, _ref;
        +
        +      content = '';
        +      _ref = this.results_data;
        +      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        +        data = _ref[_i];
        +        if (data.group) {
        +          content += this.result_add_group(data);
        +        } else {
        +          content += this.result_add_option(data);
        +        }
        +        if (options != null ? options.first : void 0) {
        +          if (data.selected && this.is_multiple) {
        +            this.choice_build(data);
        +          } else if (data.selected && !this.is_multiple) {
        +            this.single_set_selected_text(data.text);
        +          }
        +        }
        +      }
        +      return content;
        +    };
        +
        +    AbstractChosen.prototype.result_add_option = function(option) {
        +      var classes, style;
        +
        +      if (!option.search_match) {
        +        return '';
        +      }
        +      if (!this.include_option_in_results(option)) {
        +        return '';
        +      }
        +      classes = [];
        +      if (!option.disabled && !(option.selected && this.is_multiple)) {
        +        classes.push("active-result");
        +      }
        +      if (option.disabled && !(option.selected && this.is_multiple)) {
        +        classes.push("disabled-result");
        +      }
        +      if (option.selected) {
        +        classes.push("result-selected");
        +      }
        +      if (option.group_array_index != null) {
        +        classes.push("group-option");
        +      }
        +      if (option.classes !== "") {
        +        classes.push(option.classes);
        +      }
        +      style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
        +      return "<li class=\"" + (classes.join(' ')) + "\"" + style + " data-option-array-index=\"" + option.array_index + "\">" + option.search_text + "</li>";
        +    };
        +
        +    AbstractChosen.prototype.result_add_group = function(group) {
        +      if (!(group.search_match || group.group_match)) {
        +        return '';
        +      }
        +      if (!(group.active_options > 0)) {
        +        return '';
        +      }
        +      return "<li class=\"group-result\">" + group.search_text + "</li>";
        +    };
        +
        +    AbstractChosen.prototype.results_update_field = function() {
        +      this.set_default_text();
        +      if (!this.is_multiple) {
        +        this.results_reset_cleanup();
        +      }
        +      this.result_clear_highlight();
        +      this.result_single_selected = null;
        +      this.results_build();
        +      if (this.results_showing) {
        +        return this.winnow_results();
        +      }
        +    };
        +
        +    AbstractChosen.prototype.results_toggle = function() {
        +      if (this.results_showing) {
        +        return this.results_hide();
        +      } else {
        +        return this.results_show();
        +      }
        +    };
        +
        +    AbstractChosen.prototype.results_search = function(evt) {
        +      if (this.results_showing) {
        +        return this.winnow_results();
        +      } else {
        +        return this.results_show();
        +      }
        +    };
        +
        +    AbstractChosen.prototype.winnow_results = function() {
        +      var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
        +
        +      this.no_results_clear();
        +      results = 0;
        +      searchText = this.get_search_text();
        +      escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
        +      regexAnchor = this.search_contains ? "" : "^";
        +      regex = new RegExp(regexAnchor + escapedSearchText, 'i');
        +      zregex = new RegExp(escapedSearchText, 'i');
        +      _ref = this.results_data;
        +      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        +        option = _ref[_i];
        +        option.search_match = false;
        +        results_group = null;
        +        if (this.include_option_in_results(option)) {
        +          if (option.group) {
        +            option.group_match = false;
        +            option.active_options = 0;
        +          }
        +          if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
        +            results_group = this.results_data[option.group_array_index];
        +            if (results_group.active_options === 0 && results_group.search_match) {
        +              results += 1;
        +            }
        +            results_group.active_options += 1;
        +          }
        +          if (!(option.group && !this.group_search)) {
        +            option.search_text = option.group ? option.label : option.html;
        +            option.search_match = this.search_string_match(option.search_text, regex);
        +            if (option.search_match && !option.group) {
        +              results += 1;
        +            }
        +            if (option.search_match) {
        +              if (searchText.length) {
        +                startpos = option.search_text.search(zregex);
        +                text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
        +                option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
        +              }
        +              if (results_group != null) {
        +                results_group.group_match = true;
        +              }
        +            } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
        +              option.search_match = true;
        +            }
        +          }
        +        }
        +      }
        +      this.result_clear_highlight();
        +      if (results < 1 && searchText.length) {
        +        this.update_results_content("");
        +        return this.no_results(searchText);
        +      } else {
        +        this.update_results_content(this.results_option_build());
        +        return this.winnow_results_set_highlight();
        +      }
        +    };
        +
        +    AbstractChosen.prototype.search_string_match = function(search_string, regex) {
        +      var part, parts, _i, _len;
        +
        +      if (regex.test(search_string)) {
        +        return true;
        +      } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
        +        parts = search_string.replace(/\[|\]/g, "").split(" ");
        +        if (parts.length) {
        +          for (_i = 0, _len = parts.length; _i < _len; _i++) {
        +            part = parts[_i];
        +            if (regex.test(part)) {
        +              return true;
        +            }
        +          }
        +        }
        +      }
        +    };
        +
        +    AbstractChosen.prototype.choices_count = function() {
        +      var option, _i, _len, _ref;
        +
        +      if (this.selected_option_count != null) {
        +        return this.selected_option_count;
        +      }
        +      this.selected_option_count = 0;
        +      _ref = this.form_field.options;
        +      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        +        option = _ref[_i];
        +        if (option.selected) {
        +          this.selected_option_count += 1;
        +        }
        +      }
        +      return this.selected_option_count;
        +    };
        +
        +    AbstractChosen.prototype.choices_click = function(evt) {
        +      evt.preventDefault();
        +      if (!(this.results_showing || this.is_disabled)) {
        +        return this.results_show();
        +      }
        +    };
        +
        +    AbstractChosen.prototype.keyup_checker = function(evt) {
        +      var stroke, _ref;
        +
        +      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
        +      this.search_field_scale();
        +      switch (stroke) {
        +        case 8:
        +          if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
        +            return this.keydown_backstroke();
        +          } else if (!this.pending_backstroke) {
        +            this.result_clear_highlight();
        +            return this.results_search();
        +          }
        +          break;
        +        case 13:
        +          evt.preventDefault();
        +          if (this.results_showing) {
        +            return this.result_select(evt);
        +          }
        +          break;
        +        case 27:
        +          if (this.results_showing) {
        +            this.results_hide();
        +          }
        +          return true;
        +        case 9:
        +        case 38:
        +        case 40:
        +        case 16:
        +        case 91:
        +        case 17:
        +          break;
        +        default:
        +          return this.results_search();
        +      }
        +    };
        +
        +    AbstractChosen.prototype.container_width = function() {
        +      if (this.options.width != null) {
        +        return this.options.width;
        +      } else {
        +        return "" + this.form_field.offsetWidth + "px";
        +      }
        +    };
        +
        +    AbstractChosen.prototype.include_option_in_results = function(option) {
        +      if (this.is_multiple && (!this.display_selected_options && option.selected)) {
        +        return false;
        +      }
        +      if (!this.display_disabled_options && option.disabled) {
        +        return false;
        +      }
        +      if (option.empty) {
        +        return false;
        +      }
        +      return true;
        +    };
        +
        +    AbstractChosen.browser_is_supported = function() {
        +      if (window.navigator.appName === "Microsoft Internet Explorer") {
        +        return document.documentMode >= 8;
        +      }
        +      if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
        +        return false;
        +      }
        +      if (/Android/i.test(window.navigator.userAgent)) {
        +        if (/Mobile/i.test(window.navigator.userAgent)) {
        +          return false;
        +        }
        +      }
        +      return true;
        +    };
        +
        +    AbstractChosen.default_multiple_text = "Select Some Options";
        +
        +    AbstractChosen.default_single_text = "Select an Option";
        +
        +    AbstractChosen.default_no_result_text = "No results match";
        +
        +    return AbstractChosen;
        +
        +  })();
        +
        +  $ = jQuery;
        +
        +  $.fn.extend({
        +    chosen: function(options) {
        +      if (!AbstractChosen.browser_is_supported()) {
        +        return this;
        +      }
        +      return this.each(function(input_field) {
        +        var $this, chosen;
        +
        +        $this = $(this);
        +        chosen = $this.data('chosen');
        +        if (options === 'destroy' && chosen) {
        +          chosen.destroy();
        +        } else if (!chosen) {
        +          $this.data('chosen', new Chosen(this, options));
        +        }
        +      });
        +    }
        +  });
        +
        +  Chosen = (function(_super) {
        +    __extends(Chosen, _super);
        +
        +    function Chosen() {
        +      _ref = Chosen.__super__.constructor.apply(this, arguments);
        +      return _ref;
        +    }
        +
        +    Chosen.prototype.setup = function() {
        +      this.form_field_jq = $(this.form_field);
        +      this.current_selectedIndex = this.form_field.selectedIndex;
        +      return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl");
        +    };
        +
        +    Chosen.prototype.set_up_html = function() {
        +      var container_classes, container_props;
        +
        +      container_classes = ["chosen-container"];
        +      container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
        +      if (this.inherit_select_classes && this.form_field.className) {
        +        container_classes.push(this.form_field.className);
        +      }
        +      if (this.is_rtl) {
        +        container_classes.push("chosen-rtl");
        +      }
        +      container_props = {
        +        'class': container_classes.join(' '),
        +        'style': "width: " + (this.container_width()) + ";",
        +        'title': this.form_field.title
        +      };
        +      if (this.form_field.id.length) {
        +        container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
        +      }
        +      this.container = $("<div />", container_props);
        +      if (this.is_multiple) {
        +        this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
        +      } else {
        +        this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
        +      }
        +      this.form_field_jq.hide().after(this.container);
        +      this.dropdown = this.container.find('div.chosen-drop').first();
        +      this.search_field = this.container.find('input').first();
        +      this.search_results = this.container.find('ul.chosen-results').first();
        +      this.search_field_scale();
        +      this.search_no_results = this.container.find('li.no-results').first();
        +      if (this.is_multiple) {
        +        this.search_choices = this.container.find('ul.chosen-choices').first();
        +        this.search_container = this.container.find('li.search-field').first();
        +      } else {
        +        this.search_container = this.container.find('div.chosen-search').first();
        +        this.selected_item = this.container.find('.chosen-single').first();
        +      }
        +      this.results_build();
        +      this.set_tab_index();
        +      this.set_label_behavior();
        +      return this.form_field_jq.trigger("chosen:ready", {
        +        chosen: this
        +      });
        +    };
        +
        +    Chosen.prototype.register_observers = function() {
        +      var _this = this;
        +
        +      this.container.bind('mousedown.chosen', function(evt) {
        +        _this.container_mousedown(evt);
        +      });
        +      this.container.bind('mouseup.chosen', function(evt) {
        +        _this.container_mouseup(evt);
        +      });
        +      this.container.bind('mouseenter.chosen', function(evt) {
        +        _this.mouse_enter(evt);
        +      });
        +      this.container.bind('mouseleave.chosen', function(evt) {
        +        _this.mouse_leave(evt);
        +      });
        +      this.search_results.bind('mouseup.chosen', function(evt) {
        +        _this.search_results_mouseup(evt);
        +      });
        +      this.search_results.bind('mouseover.chosen', function(evt) {
        +        _this.search_results_mouseover(evt);
        +      });
        +      this.search_results.bind('mouseout.chosen', function(evt) {
        +        _this.search_results_mouseout(evt);
        +      });
        +      this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {
        +        _this.search_results_mousewheel(evt);
        +      });
        +      this.form_field_jq.bind("chosen:updated.chosen", function(evt) {
        +        _this.results_update_field(evt);
        +      });
        +      this.form_field_jq.bind("chosen:activate.chosen", function(evt) {
        +        _this.activate_field(evt);
        +      });
        +      this.form_field_jq.bind("chosen:open.chosen", function(evt) {
        +        _this.container_mousedown(evt);
        +      });
        +      this.search_field.bind('blur.chosen', function(evt) {
        +        _this.input_blur(evt);
        +      });
        +      this.search_field.bind('keyup.chosen', function(evt) {
        +        _this.keyup_checker(evt);
        +      });
        +      this.search_field.bind('keydown.chosen', function(evt) {
        +        _this.keydown_checker(evt);
        +      });
        +      this.search_field.bind('focus.chosen', function(evt) {
        +        _this.input_focus(evt);
        +      });
        +      if (this.is_multiple) {
        +        return this.search_choices.bind('click.chosen', function(evt) {
        +          _this.choices_click(evt);
        +        });
        +      } else {
        +        return this.container.bind('click.chosen', function(evt) {
        +          evt.preventDefault();
        +        });
        +      }
        +    };
        +
        +    Chosen.prototype.destroy = function() {
        +      $(document).unbind("click.chosen", this.click_test_action);
        +      if (this.search_field[0].tabIndex) {
        +        this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
        +      }
        +      this.container.remove();
        +      this.form_field_jq.removeData('chosen');
        +      return this.form_field_jq.show();
        +    };
        +
        +    Chosen.prototype.search_field_disabled = function() {
        +      this.is_disabled = this.form_field_jq[0].disabled;
        +      if (this.is_disabled) {
        +        this.container.addClass('chosen-disabled');
        +        this.search_field[0].disabled = true;
        +        if (!this.is_multiple) {
        +          this.selected_item.unbind("focus.chosen", this.activate_action);
        +        }
        +        return this.close_field();
        +      } else {
        +        this.container.removeClass('chosen-disabled');
        +        this.search_field[0].disabled = false;
        +        if (!this.is_multiple) {
        +          return this.selected_item.bind("focus.chosen", this.activate_action);
        +        }
        +      }
        +    };
        +
        +    Chosen.prototype.container_mousedown = function(evt) {
        +      if (!this.is_disabled) {
        +        if (evt && evt.type === "mousedown" && !this.results_showing) {
        +          evt.preventDefault();
        +        }
        +        if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
        +          if (!this.active_field) {
        +            if (this.is_multiple) {
        +              this.search_field.val("");
        +            }
        +            $(document).bind('click.chosen', this.click_test_action);
        +            this.results_show();
        +          } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
        +            evt.preventDefault();
        +            this.results_toggle();
        +          }
        +          return this.activate_field();
        +        }
        +      }
        +    };
        +
        +    Chosen.prototype.container_mouseup = function(evt) {
        +      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
        +        return this.results_reset(evt);
        +      }
        +    };
        +
        +    Chosen.prototype.search_results_mousewheel = function(evt) {
        +      var delta, _ref1, _ref2;
        +
        +      delta = -((_ref1 = evt.originalEvent) != null ? _ref1.wheelDelta : void 0) || ((_ref2 = evt.originialEvent) != null ? _ref2.detail : void 0);
        +      if (delta != null) {
        +        evt.preventDefault();
        +        if (evt.type === 'DOMMouseScroll') {
        +          delta = delta * 40;
        +        }
        +        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
        +      }
        +    };
        +
        +    Chosen.prototype.blur_test = function(evt) {
        +      if (!this.active_field && this.container.hasClass("chosen-container-active")) {
        +        return this.close_field();
        +      }
        +    };
        +
        +    Chosen.prototype.close_field = function() {
        +      $(document).unbind("click.chosen", this.click_test_action);
        +      this.active_field = false;
        +      this.results_hide();
        +      this.container.removeClass("chosen-container-active");
        +      this.clear_backstroke();
        +      this.show_search_field_default();
        +      return this.search_field_scale();
        +    };
        +
        +    Chosen.prototype.activate_field = function() {
        +      this.container.addClass("chosen-container-active");
        +      this.active_field = true;
        +      this.search_field.val(this.search_field.val());
        +      return this.search_field.focus();
        +    };
        +
        +    Chosen.prototype.test_active_click = function(evt) {
        +      if (this.container.is($(evt.target).closest('.chosen-container'))) {
        +        return this.active_field = true;
        +      } else {
        +        return this.close_field();
        +      }
        +    };
        +
        +    Chosen.prototype.results_build = function() {
        +      this.parsing = true;
        +      this.selected_option_count = null;
        +      this.results_data = SelectParser.select_to_array(this.form_field);
        +      if (this.is_multiple) {
        +        this.search_choices.find("li.search-choice").remove();
        +      } else if (!this.is_multiple) {
        +        this.single_set_selected_text();
        +        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
        +          this.search_field[0].readOnly = true;
        +          this.container.addClass("chosen-container-single-nosearch");
        +        } else {
        +          this.search_field[0].readOnly = false;
        +          this.container.removeClass("chosen-container-single-nosearch");
        +        }
        +      }
        +      this.update_results_content(this.results_option_build({
        +        first: true
        +      }));
        +      this.search_field_disabled();
        +      this.show_search_field_default();
        +      this.search_field_scale();
        +      return this.parsing = false;
        +    };
        +
        +    Chosen.prototype.result_do_highlight = function(el) {
        +      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
        +
        +      if (el.length) {
        +        this.result_clear_highlight();
        +        this.result_highlight = el;
        +        this.result_highlight.addClass("highlighted");
        +        maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
        +        visible_top = this.search_results.scrollTop();
        +        visible_bottom = maxHeight + visible_top;
        +        high_top = this.result_highlight.position().top + this.search_results.scrollTop();
        +        high_bottom = high_top + this.result_highlight.outerHeight();
        +        if (high_bottom >= visible_bottom) {
        +          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
        +        } else if (high_top < visible_top) {
        +          return this.search_results.scrollTop(high_top);
        +        }
        +      }
        +    };
        +
        +    Chosen.prototype.result_clear_highlight = function() {
        +      if (this.result_highlight) {
        +        this.result_highlight.removeClass("highlighted");
        +      }
        +      return this.result_highlight = null;
        +    };
        +
        +    Chosen.prototype.results_show = function() {
        +      if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
        +        this.form_field_jq.trigger("chosen:maxselected", {
        +          chosen: this
        +        });
        +        return false;
        +      }
        +      this.container.addClass("chosen-with-drop");
        +      this.form_field_jq.trigger("chosen:showing_dropdown", {
        +        chosen: this
        +      });
        +      this.results_showing = true;
        +      this.search_field.focus();
        +      this.search_field.val(this.search_field.val());
        +      return this.winnow_results();
        +    };
        +
        +    Chosen.prototype.update_results_content = function(content) {
        +      return this.search_results.html(content);
        +    };
        +
        +    Chosen.prototype.results_hide = function() {
        +      if (this.results_showing) {
        +        this.result_clear_highlight();
        +        this.container.removeClass("chosen-with-drop");
        +        this.form_field_jq.trigger("chosen:hiding_dropdown", {
        +          chosen: this
        +        });
        +      }
        +      return this.results_showing = false;
        +    };
        +
        +    Chosen.prototype.set_tab_index = function(el) {
        +      var ti;
        +
        +      if (this.form_field.tabIndex) {
        +        ti = this.form_field.tabIndex;
        +        this.form_field.tabIndex = -1;
        +        return this.search_field[0].tabIndex = ti;
        +      }
        +    };
        +
        +    Chosen.prototype.set_label_behavior = function() {
        +      var _this = this;
        +
        +      this.form_field_label = this.form_field_jq.parents("label");
        +      if (!this.form_field_label.length && this.form_field.id.length) {
        +        this.form_field_label = $("label[for='" + this.form_field.id + "']");
        +      }
        +      if (this.form_field_label.length > 0) {
        +        return this.form_field_label.bind('click.chosen', function(evt) {
        +          if (_this.is_multiple) {
        +            return _this.container_mousedown(evt);
        +          } else {
        +            return _this.activate_field();
        +          }
        +        });
        +      }
        +    };
        +
        +    Chosen.prototype.show_search_field_default = function() {
        +      if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
        +        this.search_field.val(this.default_text);
        +        return this.search_field.addClass("default");
        +      } else {
        +        this.search_field.val("");
        +        return this.search_field.removeClass("default");
        +      }
        +    };
        +
        +    Chosen.prototype.search_results_mouseup = function(evt) {
        +      var target;
        +
        +      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
        +      if (target.length) {
        +        this.result_highlight = target;
        +        this.result_select(evt);
        +        return this.search_field.focus();
        +      }
        +    };
        +
        +    Chosen.prototype.search_results_mouseover = function(evt) {
        +      var target;
        +
        +      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
        +      if (target) {
        +        return this.result_do_highlight(target);
        +      }
        +    };
        +
        +    Chosen.prototype.search_results_mouseout = function(evt) {
        +      if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
        +        return this.result_clear_highlight();
        +      }
        +    };
        +
        +    Chosen.prototype.choice_build = function(item) {
        +      var choice, close_link,
        +        _this = this;
        +
        +      choice = $('<li />', {
        +        "class": "search-choice"
        +      }).html("<span>" + item.html + "</span>");
        +      if (item.disabled) {
        +        choice.addClass('search-choice-disabled');
        +      } else {
        +        close_link = $('<a />', {
        +          "class": 'search-choice-close',
        +          'data-option-array-index': item.array_index
        +        });
        +        close_link.bind('click.chosen', function(evt) {
        +          return _this.choice_destroy_link_click(evt);
        +        });
        +        choice.append(close_link);
        +      }
        +      return this.search_container.before(choice);
        +    };
        +
        +    Chosen.prototype.choice_destroy_link_click = function(evt) {
        +      evt.preventDefault();
        +      evt.stopPropagation();
        +      if (!this.is_disabled) {
        +        return this.choice_destroy($(evt.target));
        +      }
        +    };
        +
        +    Chosen.prototype.choice_destroy = function(link) {
        +      if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
        +        this.show_search_field_default();
        +        if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {
        +          this.results_hide();
        +        }
        +        link.parents('li').first().remove();
        +        return this.search_field_scale();
        +      }
        +    };
        +
        +    Chosen.prototype.results_reset = function() {
        +      this.form_field.options[0].selected = true;
        +      this.selected_option_count = null;
        +      this.single_set_selected_text();
        +      this.show_search_field_default();
        +      this.results_reset_cleanup();
        +      this.form_field_jq.trigger("change");
        +      if (this.active_field) {
        +        return this.results_hide();
        +      }
        +    };
        +
        +    Chosen.prototype.results_reset_cleanup = function() {
        +      this.current_selectedIndex = this.form_field.selectedIndex;
        +      return this.selected_item.find("abbr").remove();
        +    };
        +
        +    Chosen.prototype.result_select = function(evt) {
        +      var high, item, selected_index;
        +
        +      if (this.result_highlight) {
        +        high = this.result_highlight;
        +        this.result_clear_highlight();
        +        if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
        +          this.form_field_jq.trigger("chosen:maxselected", {
        +            chosen: this
        +          });
        +          return false;
        +        }
        +        if (this.is_multiple) {
        +          high.removeClass("active-result");
        +        } else {
        +          if (this.result_single_selected) {
        +            this.result_single_selected.removeClass("result-selected");
        +            selected_index = this.result_single_selected[0].getAttribute('data-option-array-index');
        +            this.results_data[selected_index].selected = false;
        +          }
        +          this.result_single_selected = high;
        +        }
        +        high.addClass("result-selected");
        +        item = this.results_data[high[0].getAttribute("data-option-array-index")];
        +        item.selected = true;
        +        this.form_field.options[item.options_index].selected = true;
        +        this.selected_option_count = null;
        +        if (this.is_multiple) {
        +          this.choice_build(item);
        +        } else {
        +          this.single_set_selected_text(item.text);
        +        }
        +        if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
        +          this.results_hide();
        +        }
        +        this.search_field.val("");
        +        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
        +          this.form_field_jq.trigger("change", {
        +            'selected': this.form_field.options[item.options_index].value
        +          });
        +        }
        +        this.current_selectedIndex = this.form_field.selectedIndex;
        +        return this.search_field_scale();
        +      }
        +    };
        +
        +    Chosen.prototype.single_set_selected_text = function(text) {
        +      if (text == null) {
        +        text = this.default_text;
        +      }
        +      if (text === this.default_text) {
        +        this.selected_item.addClass("chosen-default");
        +      } else {
        +        this.single_deselect_control_build();
        +        this.selected_item.removeClass("chosen-default");
        +      }
        +      return this.selected_item.find("span").text(text);
        +    };
        +
        +    Chosen.prototype.result_deselect = function(pos) {
        +      var result_data;
        +
        +      result_data = this.results_data[pos];
        +      if (!this.form_field.options[result_data.options_index].disabled) {
        +        result_data.selected = false;
        +        this.form_field.options[result_data.options_index].selected = false;
        +        this.selected_option_count = null;
        +        this.result_clear_highlight();
        +        if (this.results_showing) {
        +          this.winnow_results();
        +        }
        +        this.form_field_jq.trigger("change", {
        +          deselected: this.form_field.options[result_data.options_index].value
        +        });
        +        this.search_field_scale();
        +        return true;
        +      } else {
        +        return false;
        +      }
        +    };
        +
        +    Chosen.prototype.single_deselect_control_build = function() {
        +      if (!this.allow_single_deselect) {
        +        return;
        +      }
        +      if (!this.selected_item.find("abbr").length) {
        +        this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
        +      }
        +      return this.selected_item.addClass("chosen-single-with-deselect");
        +    };
        +
        +    Chosen.prototype.get_search_text = function() {
        +      if (this.search_field.val() === this.default_text) {
        +        return "";
        +      } else {
        +        return $('<div/>').text($.trim(this.search_field.val())).html();
        +      }
        +    };
        +
        +    Chosen.prototype.winnow_results_set_highlight = function() {
        +      var do_high, selected_results;
        +
        +      selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
        +      do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
        +      if (do_high != null) {
        +        return this.result_do_highlight(do_high);
        +      }
        +    };
        +
        +    Chosen.prototype.no_results = function(terms) {
        +      var no_results_html;
        +
        +      no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
        +      no_results_html.find("span").first().html(terms);
        +      return this.search_results.append(no_results_html);
        +    };
        +
        +    Chosen.prototype.no_results_clear = function() {
        +      return this.search_results.find(".no-results").remove();
        +    };
        +
        +    Chosen.prototype.keydown_arrow = function() {
        +      var next_sib;
        +
        +      if (this.results_showing && this.result_highlight) {
        +        next_sib = this.result_highlight.nextAll("li.active-result").first();
        +        if (next_sib) {
        +          return this.result_do_highlight(next_sib);
        +        }
        +      } else {
        +        return this.results_show();
        +      }
        +    };
        +
        +    Chosen.prototype.keyup_arrow = function() {
        +      var prev_sibs;
        +
        +      if (!this.results_showing && !this.is_multiple) {
        +        return this.results_show();
        +      } else if (this.result_highlight) {
        +        prev_sibs = this.result_highlight.prevAll("li.active-result");
        +        if (prev_sibs.length) {
        +          return this.result_do_highlight(prev_sibs.first());
        +        } else {
        +          if (this.choices_count() > 0) {
        +            this.results_hide();
        +          }
        +          return this.result_clear_highlight();
        +        }
        +      }
        +    };
        +
        +    Chosen.prototype.keydown_backstroke = function() {
        +      var next_available_destroy;
        +
        +      if (this.pending_backstroke) {
        +        this.choice_destroy(this.pending_backstroke.find("a").first());
        +        return this.clear_backstroke();
        +      } else {
        +        next_available_destroy = this.search_container.siblings("li.search-choice").last();
        +        if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
        +          this.pending_backstroke = next_available_destroy;
        +          if (this.single_backstroke_delete) {
        +            return this.keydown_backstroke();
        +          } else {
        +            return this.pending_backstroke.addClass("search-choice-focus");
        +          }
        +        }
        +      }
        +    };
        +
        +    Chosen.prototype.clear_backstroke = function() {
        +      if (this.pending_backstroke) {
        +        this.pending_backstroke.removeClass("search-choice-focus");
        +      }
        +      return this.pending_backstroke = null;
        +    };
        +
        +    Chosen.prototype.keydown_checker = function(evt) {
        +      var stroke, _ref1;
        +
        +      stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;
        +      this.search_field_scale();
        +      if (stroke !== 8 && this.pending_backstroke) {
        +        this.clear_backstroke();
        +      }
        +      switch (stroke) {
        +        case 8:
        +          this.backstroke_length = this.search_field.val().length;
        +          break;
        +        case 9:
        +          if (this.results_showing && !this.is_multiple) {
        +            this.result_select(evt);
        +          }
        +          this.mouse_on_container = false;
        +          break;
        +        case 13:
        +          evt.preventDefault();
        +          break;
        +        case 38:
        +          evt.preventDefault();
        +          this.keyup_arrow();
        +          break;
        +        case 40:
        +          evt.preventDefault();
        +          this.keydown_arrow();
        +          break;
        +      }
        +    };
        +
        +    Chosen.prototype.search_field_scale = function() {
        +      var div, f_width, h, style, style_block, styles, w, _i, _len;
        +
        +      if (this.is_multiple) {
        +        h = 0;
        +        w = 0;
        +        style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
        +        styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
        +        for (_i = 0, _len = styles.length; _i < _len; _i++) {
        +          style = styles[_i];
        +          style_block += style + ":" + this.search_field.css(style) + ";";
        +        }
        +        div = $('<div />', {
        +          'style': style_block
        +        });
        +        div.text(this.search_field.val());
        +        $('body').append(div);
        +        w = div.width() + 25;
        +        div.remove();
        +        f_width = this.container.outerWidth();
        +        if (w > f_width - 10) {
        +          w = f_width - 10;
        +        }
        +        return this.search_field.css({
        +          'width': w + 'px'
        +        });
        +      }
        +    };
        +
        +    return Chosen;
        +
        +  })(AbstractChosen);
        +
        +}).call(this);
        \ No newline at end of file
        diff --git a/bower_components/tether/examples/chosen/index.html b/bower_components/tether/examples/chosen/index.html
        new file mode 100644
        index 0000000000..cf5b49011d
        --- /dev/null
        +++ b/bower_components/tether/examples/chosen/index.html
        @@ -0,0 +1,110 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <link rel="stylesheet" href="../../css/drop.css" />
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="chosen.css" />
        +    </head>
        +    <body>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        <br/>
        +        Favorite pizza style: <br/>
        +        <div class="drop-chosen-target chosen-container chosen-container-single chosen-with-drop" style="width: 350px">
        +            <a class="chosen-single chosen-default" tabindex="-1"><span>Choose a style...</span><div><b></b></div></a>
        +        </div>
        +        <br/>
        +        <br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        text<br/>
        +        <script src="../resources/js/log.js"></script>
        +        <script src="../resources/js/jquery.js"></script>
        +        <script src="chosen.js"></script>
        +        <script src="../../drop.js"></script>
        +        <script>
        +            $(function(){
        +                var $target, $drop;
        +
        +                $target = $('.drop-chosen-target').drop({
        +                    className: 'drop-chosen',
        +                    attach: 'bottom-left',
        +                    content: ''
        +                });
        +
        +                $drop = $target.data().drop.$drop;
        +
        +                $drop.append('<select><option>Plain</option><option>Pepperoni</option><option>Supreme</option></select>');
        +
        +                $drop.on('openDrop', function(event){
        +                    $target.addClass('chosen-container-active');
        +                }).on('closeDrop', function(event){
        +                    $target.removeClass('chosen-container-active');
        +                });
        +
        +                $drop.on('openDrop', function(event) {
        +                    var $select = $drop.find('select');
        +
        +                    if (!$drop.find('.chosen-container').length) {
        +                        $select
        +                            .css('width', $target.outerWidth())
        +                            .chosen({
        +                                allow_single_deselect: true,
        +                                disable_search_threshold: 0
        +                            })
        +                        ;
        +                    }
        +
        +                    setTimeout(function(){
        +                        $drop.find('.chosen-search input').click().focus().keyup();
        +                        $target.drop('positionDrop');
        +                    }, 0);
        +                });
        +            });
        +        </script>
        +        <style>
        +            .drop-chosen-target > a {
        +                outline: none;
        +            }
        +
        +            .drop.drop-chosen {
        +                background: transparent;
        +            }
        +
        +            .drop.drop-chosen .chosen-container > .chosen-single {
        +                display: none;
        +            }
        +
        +            .drop.drop-chosen .chosen-container .chosen-drop {
        +                position: static;
        +            }
        +        </style>
        +    </body>
        +</html>
        \ No newline at end of file
        diff --git a/bower_components/tether/examples/common/css/style.css b/bower_components/tether/examples/common/css/style.css
        new file mode 100644
        index 0000000000..2d82380779
        --- /dev/null
        +++ b/bower_components/tether/examples/common/css/style.css
        @@ -0,0 +1,48 @@
        +body {
        +    min-height: 3000px;
        +}
        +.element {
        +    width: 200px;
        +    height: 200px;
        +    background-color: #fe8;
        +    position: absolute;
        +    z-index: 6;
        +}
        +
        +.target {
        +    width: 300px;
        +    height: 50px;
        +    margin: 0 35%;
        +    background-color: #4e9;
        +}
        +
        +.container {
        +    height: 600px;
        +    overflow: scroll;
        +    width: 600px;
        +    border: 20px solid #CCC;
        +    margin-top: 100px;
        +}
        +
        +body {
        +    padding: 15px;
        +}
        +
        +body > .container {
        +    margin: 0 auto;
        +}
        +
        +.pad {
        +    height: 400px;
        +    width: 100px;
        +}
        +
        +.instructions {
        +    width: 100%;
        +    text-align: center;
        +    font-size: 24px;
        +    padding: 15px;
        +    background-color: rgba(210, 180, 140, 0.4);
        +    margin: -15px -15px 0 -15px;
        +}
        +
        diff --git a/bower_components/tether/examples/content-visible/index.html b/bower_components/tether/examples/content-visible/index.html
        new file mode 100644
        index 0000000000..fd1559162b
        --- /dev/null
        +++ b/bower_components/tether/examples/content-visible/index.html
        @@ -0,0 +1,64 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +    </head>
        +    <body>
        +
        +    <div class="instructions">Scroll the page</div>
        +
        +    <style>
        +      .instructions {
        +        width: 100%;
        +        text-align: center;
        +        font-size: 24px;
        +        padding: 15px;
        +        background-color: rgba(210, 180, 140, 0.4);
        +      }
        +
        +      * {
        +        box-sizing: border-box;
        +      }
        +      body {
        +        min-height: 1200vh;
        +        height: 100%;
        +      }
        +
        +      .content-box {
        +        width: 600px;
        +        border: 10px solid #999;
        +        height: 600vh;
        +        background-color: #439CCC;
        +        margin: 200vh auto;
        +      }
        +      .element {
        +        border: 10px solid #999;
        +        background-color: #FFDC00;
        +        width: 300px;
        +        height: 200px;
        +        padding: 0 15px;
        +        font-size: 20px;
        +        font-weight: bold;
        +      }
        +    </style>
        +
        +    <div class="content-box">
        +      <div class="element">
        +        <p>This is some sort of crazy dialog.</p>
        +
        +        <p>It's setup to align with the center of the visible part of the blue area.</p>
        +      </div>
        +    </div>
        +
        +    <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +    <script>
        +      new Tether({
        +        element: '.element',
        +        target: '.content-box',
        +        attachment: 'middle center',
        +        targetAttachment: 'middle center',
        +        targetModifier: 'visible'
        +      });
        +    </script>
        +  </body>
        +</html>
        diff --git a/bower_components/tether/examples/dolls/dolls.css b/bower_components/tether/examples/dolls/dolls.css
        new file mode 100644
        index 0000000000..931c0de252
        --- /dev/null
        +++ b/bower_components/tether/examples/dolls/dolls.css
        @@ -0,0 +1,18 @@
        +.tether-element, .tether-target {
        +  width: 200px;
        +  height: 50px;
        +  background-color: #4cc;
        +  position: absolute;
        +}
        +body {
        +  width: 100%;
        +  height: 100%;
        +  overflow: scroll;
        +}
        +.scroll {
        +  width: 400%;
        +  height: 400%;
        +}
        +.tether-target:not(.tether-element) {
        +  cursor: move;
        +}
        diff --git a/bower_components/tether/examples/dolls/dolls.js b/bower_components/tether/examples/dolls/dolls.js
        new file mode 100644
        index 0000000000..5d0b06b2c1
        --- /dev/null
        +++ b/bower_components/tether/examples/dolls/dolls.js
        @@ -0,0 +1,83 @@
        +var tethers = [];
        +
        +document.addEventListener('DOMContentLoaded', function(){
        +  dragging = null;
        +
        +  document.body.addEventListener('mouseup', function(){
        +    dragging = null;
        +  });
        +
        +  document.body.addEventListener('mousemove', function(e){
        +    if (dragging){
        +      dragging.style.top = e.clientY + 'px';
        +      dragging.style.left = e.clientX + 'px';
        +
        +      Tether.position()
        +    }
        +  });
        +
        +  document.body.addEventListener('mousedown', function(e){
        +    if (e.target.getAttribute('data-index'))
        +      dragging = e.target;
        +  })
        +
        +  var count = 60;
        +  var parent = null;
        +  var dir = 'left';
        +  var first = null;
        +
        +  while (count--){
        +    var el = document.createElement('div');
        +    el.setAttribute('data-index', count);
        +    document.querySelector('.scroll').appendChild(el);
        +
        +    if (!first)
        +      first = el;
        + 
        +    if (count % 10 === 0)
        +      dir = dir == 'right' ? 'left' : 'right';
        +
        +    if (parent){
        +      tethers.push(new Tether({
        +        element: el,
        +        target: parent,
        +        attachment: 'middle ' + dir,
        +        targetOffset: (dir == 'left' ? '10px 10px' : '10px -10px')
        +      }));
        +
        +    }
        +
        +    parent = el;
        +  }
        +
        +  initAnim(first);
        +});
        +
        +function initAnim(el){
        +  var start = performance.now()
        +  var last = 0;
        +  var lastTop = 0;
        +  var tick = function(){
        +    var diff = performance.now() - last;
        +
        +    if (!last || diff > 50){
        +      last = performance.now();
        +
        +      var nextTop = 50 * Math.sin((last - start) / 1000);
        +
        +      var curTop = parseFloat(el.style.top || 0);
        +      var topChange = nextTop - lastTop;
        +      lastTop = nextTop;
        +
        +      var top = curTop + topChange;
        +
        +      el.style.top = top + 'px';
        +
        +      Tether.position();
        +    }
        +
        +    requestAnimationFrame(tick);
        +  };
        +
        +  tick();
        +}
        diff --git a/bower_components/tether/examples/dolls/index.html b/bower_components/tether/examples/dolls/index.html
        new file mode 100644
        index 0000000000..8f0167f11a
        --- /dev/null
        +++ b/bower_components/tether/examples/dolls/index.html
        @@ -0,0 +1,7 @@
        +<link rel="stylesheet" href="./dolls.css" />
        +<script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +<script src="./dolls.js"></script>
        +<body>
        +  <div class="scroll">
        +  </div>
        +</body>
        diff --git a/bower_components/tether/examples/element-scroll/index.html b/bower_components/tether/examples/element-scroll/index.html
        new file mode 100644
        index 0000000000..e93181aed0
        --- /dev/null
        +++ b/bower_components/tether/examples/element-scroll/index.html
        @@ -0,0 +1,499 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +      <link rel="stylesheet" href="../resources/css/base.css" />
        +    </head>
        +    <body>
        +
        +    <div class="scroll">
        +      <p>For a long time after the course of the steamer <em>Sofala</em> had been
        +      altered for the land, the low swampy coast had retained its appearance
        +      of a mere smudge of darkness beyond a belt of glitter. The sunrays
        +      seemed to fall violently upon the calm sea--seemed to shatter themselves
        +      upon an adamantine surface into sparkling dust, into a dazzling vapor
        +      of light that blinded the eye and wearied the brain with its unsteady
        +      brightness.</p>
        +
        +      <p>Captain Whalley did not look at it. When his Serang, approaching the
        +      roomy cane arm-chair which he filled capably, had informed him in a low
        +      voice that the course was to be altered, he had risen at once and had
        +      remained on his feet, face forward, while the head of his ship swung
        +      through a quarter of a circle. He had not uttered a single word, not
        +      even the word to steady the helm. It was the Serang, an elderly, alert,
        +      little Malay, with a very dark skin, who murmured the order to the
        +      helmsman. And then slowly Captain Whalley sat down again in the
        +      arm-chair on the bridge and fixed his eyes on the deck between his feet.</p>
        +
        +      <p>He could not hope to see anything new upon this lane of the sea. He had
        +      been on these coasts for the last three years. From Low Cape to Malantan
        +      the distance was fifty miles, six hours' steaming for the old ship with
        +      the tide, or seven against. Then you steered straight for the land, and
        +      by-and-by three palms would appear on the sky, tall and slim, and with
        +      their disheveled heads in a bunch, as if in confidential criticism of
        +      the dark mangroves. The Sofala would be headed towards the somber
        +      strip of the coast, which at a given moment, as the ship closed with
        +      it obliquely, would show several clean shining fractures--the brimful
        +      estuary of a river. Then on through a brown liquid, three parts water
        +      and one part black earth, on and on between the low shores, three parts
        +      black earth and one part brackish water, the Sofala would plow her way
        +      up-stream, as she had done once every month for these seven years or
        +      more, long before he was aware of her existence, long before he had ever
        +      thought of having anything to do with her and her invariable voyages.
        +      The old ship ought to have known the road better than her men, who had
        +      not been kept so long at it without a change; better than the faithful
        +      Serang, whom he had brought over from his last ship to keep the
        +      captain's watch; better than he himself, who had been her captain for
        +      the last three years only. She could always be depended upon to make her
        +      courses. Her compasses were never out. She was no trouble at all to
        +      take about, as if her great age had given her knowledge, wisdom, and
        +      steadiness. She made her landfalls to a degree of the bearing, and
        +      almost to a minute of her allowed time. At any moment, as he sat on
        +      the bridge without looking up, or lay sleepless in his bed, simply by
        +      reckoning the days and the hours he could tell where he was--the precise
        +      spot of the beat. He knew it well too, this monotonous huckster's
        +      round, up and down the Straits; he knew its order and its sights and its
        +      people. Malacca to begin with, in at daylight and out at dusk, to cross
        +      over with a rigid phosphorescent wake this highway of the Far East.
        +      Darkness and gleams on the water, clear stars on a black sky, perhaps
        +      the lights of a home steamer keeping her unswerving course in the
        +      middle, or maybe the elusive shadow of a native craft with her mat sails
        +      flitting by silently--and the low land on the other side in sight
        +      at daylight. At noon the three palms of the next place of call, up a
        +      sluggish river. The only white man residing there was a retired young
        +      sailor, with whom he had become friendly in the course of many voyages.
        +      Sixty miles farther on there was another place of call, a deep bay with
        +      only a couple of houses on the beach. And so on, in and out, picking
        +      up coastwise cargo here and there, and finishing with a hundred miles'
        +      steady steaming through the maze of an archipelago of small islands up
        +      to a large native town at the end of the beat. There was a three days'
        +      rest for the old ship before he started her again in inverse order,
        +      seeing the same shores from another bearing, hearing the same voices
        +      in the same places, back again to the Sofala's port of registry on
        +      the great highway to the East, where he would take up a berth nearly
        +      opposite the big stone pile of the harbor office till it was time to
        +      start again on the old round of 1600 miles and thirty days. Not a very
        +      enterprising life, this, for Captain Whalley, Henry Whalley, otherwise
        +      Dare-devil Harry--Whalley of the Condor, a famous clipper in her day.
        +      No. Not a very enterprising life for a man who had served famous firms,
        +      who had sailed famous ships (more than one or two of them his own); who
        +      had made famous passages, had been the pioneer of new routes and new
        +      trades; who had steered across the unsurveyed tracts of the South Seas,
        +      and had seen the sun rise on uncharted islands. Fifty years at sea, and
        +      forty out in the East ("a pretty thorough apprenticeship," he used
        +      to remark smilingly), had made him honorably known to a generation of
        +      shipowners and merchants in all the ports from Bombay clear over to
        +      where the East merges into the West upon the coast of the two Americas.
        +      His fame remained writ, not very large but plain enough, on the
        +      Admiralty charts. Was there not somewhere between Australia and China a
        +      Whalley Island and a Condor Reef? On that dangerous coral formation the
        +      celebrated clipper had hung stranded for three days, her captain and
        +      crew throwing her cargo overboard with one hand and with the other, as
        +      it were, keeping off her a flotilla of savage war-canoes. At that time
        +      neither the island nor the reef had any official existence. Later the
        +      officers of her Majesty's steam vessel Fusilier, dispatched to make a
        +      survey of the route, recognized in the adoption of these two names the
        +      enterprise of the man and the solidity of the ship. Besides, as anyone
        +      who cares may see, the "General Directory," vol. ii. p. 410, begins the
        +      description of the "Malotu or Whalley Passage" with the words: "This
        +      advantageous route, first discovered in 1850 by Captain Whalley in the
        +      ship Condor," &amp;c., and ends by recommending it warmly to sailing vessels
        +      leaving the China ports for the south in the months from December to
        +      April inclusive.</p>
        +
        +      <p>This was the clearest gain he had out of life. Nothing could rob him
        +      of this kind of fame. The piercing of the Isthmus of Suez, like the
        +      breaking of a dam, had let in upon the East a flood of new ships, new
        +      men, new methods of trade. It had changed the face of the Eastern seas
        +      and the very spirit of their life; so that his early experiences meant
        +      nothing whatever to the new generation of seamen.</p>
        +
        +      <p>In those bygone days he had handled many thousands of pounds of his
        +      employers' money and of his own; he had attended faithfully, as by law
        +      a shipmaster is expected to do, to the conflicting interests of owners,
        +      charterers, and underwriters. He had never lost a ship or consented to
        +      a shady transaction; and he had lasted well, outlasting in the end the
        +      conditions that had gone to the making of his name. He had buried his
        +      wife (in the Gulf of Petchili), had married off his daughter to the man
        +      of her unlucky choice, and had lost more than an ample competence in the
        +      crash of the notorious Travancore and Deccan Banking Corporation, whose
        +      downfall had shaken the East like an earthquake. And he was sixty-five
        +      years old.</p>
        +
        +      <p>His age sat lightly enough on him; and of his ruin he was not ashamed.
        +      He had not been alone to believe in the stability of the Banking
        +      Corporation. Men whose judgment in matters of finance was as expert as
        +      his seamanship had commended the prudence of his investments, and had
        +      themselves lost much money in the great failure. The only difference
        +      between him and them was that he had lost his all. And yet not his all.
        +      There had remained to him from his lost fortune a very pretty little
        +      bark, Fair Maid, which he had bought to occupy his leisure of a retired
        +      sailor--"to play with," as he expressed it himself.</p>
        +
        +      <p>He had formally declared himself tired of the sea the year preceding his
        +      daughter's marriage. But after the young couple had gone to settle in
        +      Melbourne he found out that he could not make himself happy on shore. He
        +      was too much of a merchant sea-captain for mere yachting to satisfy him.
        +      He wanted the illusion of affairs; and his acquisition of the Fair
        +      Maid preserved the continuity of his life. He introduced her to his
        +      acquaintances in various ports as "my last command." When he grew too
        +      old to be trusted with a ship, he would lay her up and go ashore to be
        +      buried, leaving directions in his will to have the bark towed out and
        +      scuttled decently in deep water on the day of the funeral. His daughter
        +      would not grudge him the satisfaction of knowing that no stranger would
        +      handle his last command after him. With the fortune he was able to leave
        +      her, the value of a 500-ton bark was neither here nor there. All this
        +      would be said with a jocular twinkle in his eye: the vigorous old man
        +      had too much vitality for the sentimentalism of regret; and a little
        +      wistfully withal, because he was at home in life, taking a genuine
        +      pleasure in its feelings and its possessions; in the dignity of his
        +      reputation and his wealth, in his love for his daughter, and in his
        +      satisfaction with the ship--the plaything of his lonely leisure.</p>
        +
        +      <p>He had the cabin arranged in accordance with his simple ideal of comfort
        +      at sea. A big bookcase (he was a great reader) occupied one side of his
        +      stateroom; the portrait of his late wife, a flat bituminous oil-painting
        +      representing the profile and one long black ringlet of a young woman,
        +      faced his bed-place. Three chronometers ticked him to sleep and greeted
        +      him on waking with the tiny competition of their beats. He rose at five
        +      every day. The officer of the morning watch, drinking his early cup
        +      of coffee aft by the wheel, would hear through the wide orifice of the
        +      copper ventilators all the splashings, blowings, and splutterings of
        +      his captain's toilet. These noises would be followed by a sustained
        +      deep murmur of the Lord's Prayer recited in a loud earnest voice. Five
        +      minutes afterwards the head and shoulders of Captain Whalley emerged
        +      out of the companion-hatchway. Invariably he paused for a while on the
        +      stairs, looking all round at the horizon; upwards at the trim of the
        +      sails; inhaling deep draughts of the fresh air. Only then he would step
        +      out on the poop, acknowledging the hand raised to the peak of the cap
        +      with a majestic and benign "Good morning to you." He walked the deck
        +      till eight scrupulously. Sometimes, not above twice a year, he had to
        +      use a thick cudgel-like stick on account of a stiffness in the hip--a
        +      slight touch of rheumatism, he supposed. Otherwise he knew nothing of
        +      the ills of the flesh. At the ringing of the breakfast bell he went
        +      below to feed his canaries, wind up the chronometers, and take the
        +      head of the table. From there he had before his eyes the big carbon
        +      photographs of his daughter, her husband, and two fat-legged babies
        +      --his grandchildren--set in black frames into the maplewood bulkheads
        +      of the cuddy. After breakfast he dusted the glass over these portraits
        +      himself with a cloth, and brushed the oil painting of his wife with a
        +      plumate kept suspended from a small brass hook by the side of the heavy
        +      gold frame. Then with the door of his stateroom shut, he would sit down
        +      on the couch under the portrait to read a chapter out of a thick pocket
        +      Bible--her Bible. But on some days he only sat there for half an hour
        +      with his finger between the leaves and the closed book resting on his
        +      knees. Perhaps he had remembered suddenly how fond of boat-sailing she
        +      used to be.</p>
        +
        +      <p>She had been a real shipmate and a true woman too. It was like an
        +      article of faith with him that there never had been, and never could be,
        +      a brighter, cheerier home anywhere afloat or ashore than his home under
        +      the poop-deck of the Condor, with the big main cabin all white and gold,
        +      garlanded as if for a perpetual festival with an unfading wreath. She
        +      had decorated the center of every panel with a cluster of home flowers.
        +      It took her a twelvemonth to go round the cuddy with this labor of love.
        +      To him it had remained a marvel of painting, the highest achievement of
        +      taste and skill; and as to old Swinburne, his mate, every time he
        +      came down to his meals he stood transfixed with admiration before the
        +      progress of the work. You could almost smell these roses, he declared,
        +      sniffing the faint flavor of turpentine which at that time pervaded the
        +      saloon, and (as he confessed afterwards) made him somewhat less hearty
        +      than usual in tackling his food. But there was nothing of the sort to
        +      interfere with his enjoyment of her singing. "Mrs. Whalley is a regular
        +      out-and-out nightingale, sir," he would pronounce with a judicial air
        +      after listening profoundly over the skylight to the very end of the
        +      piece. In fine weather, in the second dog-watch, the two men could hear
        +      her trills and roulades going on to the accompaniment of the piano in
        +      the cabin. On the very day they got engaged he had written to London
        +      for the instrument; but they had been married for over a year before it
        +      reached them, coming out round the Cape. The big case made part of the
        +      first direct general cargo landed in Hong-kong harbor--an event that to
        +      the men who walked the busy quays of to-day seemed as hazily remote as
        +      the dark ages of history. But Captain Whalley could in a half hour of
        +      solitude live again all his life, with its romance, its idyl, and its
        +      sorrow. He had to close her eyes himself. She went away from under the
        +      ensign like a sailor's wife, a sailor herself at heart. He had read
        +      the service over her, out of her own prayer-book, without a break in his
        +      voice. When he raised his eyes he could see old Swinburne facing him
        +      with his cap pressed to his breast, and his rugged, weather-beaten,
        +      impassive face streaming with drops of water like a lump of chipped red
        +      granite in a shower. It was all very well for that old sea-dog to cry.
        +      He had to read on to the end; but after the splash he did not remember
        +      much of what happened for the next few days. An elderly sailor of the
        +      crew, deft at needlework, put together a mourning frock for the child
        +      out of one of her black skirts.</p>
        +
        +      <p>He was not likely to forget; but you cannot dam up life like a sluggish
        +      stream. It will break out and flow over a man's troubles, it will close
        +      upon a sorrow like the sea upon a dead body, no matter how much love has
        +      gone to the bottom. And the world is not bad. People had been very
        +      kind to him; especially Mrs. Gardner, the wife of the senior partner
        +      in Gardner, Patteson, &amp; Co., the owners of the Condor. It was she who
        +      volunteered to look after the little one, and in due course took her to
        +      England (something of a journey in those days, even by the overland
        +      mail route) with her own girls to finish her education. It was ten years
        +      before he saw her again.</p>
        +
        +      <p>As a little child she had never been frightened of bad weather; she
        +      would beg to be taken up on deck in the bosom of his oilskin coat to
        +      watch the big seas hurling themselves upon the Condor. The swirl and
        +      crash of the waves seemed to fill her small soul with a breathless
        +      delight. "A good boy spoiled," he used to say of her in joke. He had
        +      named her Ivy because of the sound of the word, and obscurely fascinated
        +      by a vague association of ideas. She had twined herself tightly round
        +      his heart, and he intended her to cling close to her father as to a
        +      tower of strength; forgetting, while she was little, that in the nature
        +      of things she would probably elect to cling to someone else. But
        +      he loved life well enough for even that event to give him a certain
        +      satisfaction, apart from his more intimate feeling of loss.</p>
        +
        +      <p>After he had purchased the Fair Maid to occupy his loneliness, he
        +      hastened to accept a rather unprofitable freight to Australia simply for
        +      the opportunity of seeing his daughter in her own home. What made him
        +      dissatisfied there was not to see that she clung now to somebody else,
        +      but that the prop she had selected seemed on closer examination "a
        +      rather poor stick"--even in the matter of health. He disliked his
        +      son-in-law's studied civility perhaps more than his method of
        +      handling the sum of money he had given Ivy at her marriage. But of his
        +      apprehensions he said nothing. Only on the day of his departure, with
        +      the hall-door open already, holding her hands and looking steadily into
        +      her eyes, he had said, "You know, my dear, all I have is for you and the
        +      chicks. Mind you write to me openly." She had answered him by an almost
        +      imperceptible movement of her head. She resembled her mother in
        +      the color of her eyes, and in character--and also in this, that she
        +      understood him without many words.</p>
        +
        +      <p>Sure enough she had to write; and some of these letters made Captain
        +      Whalley lift his white eye-brows. For the rest he considered he was
        +      reaping the true reward of his life by being thus able to produce on
        +      demand whatever was needed. He had not enjoyed himself so much in a
        +      way since his wife had died. Characteristically enough his son-in-law's
        +      punctuality in failure caused him at a distance to feel a sort of
        +      kindness towards the man. The fellow was so perpetually being jammed on
        +      a lee shore that to charge it all to his reckless navigation would be
        +      manifestly unfair. No, no! He knew well what that meant. It was bad
        +      luck. His own had been simply marvelous, but he had seen in his life too
        +      many good men--seamen and others--go under with the sheer weight of bad
        +      luck not to recognize the fatal signs. For all that, he was cogitating
        +      on the best way of tying up very strictly every penny he had to leave,
        +      when, with a preliminary rumble of rumors (whose first sound reached
        +      him in Shanghai as it happened), the shock of the big failure came;
        +      and, after passing through the phases of stupor, of incredulity, of
        +      indignation, he had to accept the fact that he had nothing to speak of
        +      to leave.</p>
        +
        +      <p>Upon that, as if he had only waited for this catastrophe, the unlucky
        +      man, away there in Melbourne, gave up his unprofitable game, and sat
        +      down--in an invalid's bath-chair at that too. "He will never walk
        +      again," wrote the wife. For the first time in his life Captain Whalley
        +      was a bit staggered.</p>
        +
        +      <p>The Fair Maid had to go to work in bitter earnest now. It was no longer
        +      a matter of preserving alive the memory of Dare-devil Harry Whalley in
        +      the Eastern Seas, or of keeping an old man in pocket-money and clothes,
        +      with, perhaps, a bill for a few hundred first-class cigars thrown in at
        +      the end of the year. He would have to buckle-to, and keep her going hard
        +      on a scant allowance of gilt for the ginger-bread scrolls at her stem
        +      and stern.</p>
        +
        +      <p>This necessity opened his eyes to the fundamental changes of the world.
        +      Of his past only the familiar names remained, here and there, but
        +      the things and the men, as he had known them, were gone. The name of
        +      Gardner, Patteson, &amp; Co. was still displayed on the walls of warehouses
        +      by the waterside, on the brass plates and window-panes in the business
        +      quarters of more than one Eastern port, but there was no longer a
        +      Gardner or a Patteson in the firm. There was no longer for Captain
        +      Whalley an arm-chair and a welcome in the private office, with a bit of
        +      business ready to be put in the way of an old friend, for the sake of
        +      bygone services. The husbands of the Gardner girls sat behind the desks
        +      in that room where, long after he had left the employ, he had kept his
        +      right of entrance in the old man's time. Their ships now had yellow
        +      funnels with black tops, and a time-table of appointed routes like a
        +      confounded service of tramways. The winds of December and June were all
        +      one to them; their captains (excellent young men he doubted not) were,
        +      to be sure, familiar with Whalley Island, because of late years the
        +      Government had established a white fixed light on the north end (with
        +      a red danger sector over the Condor Reef), but most of them would have
        +      been extremely surprised to hear that a flesh-and-blood Whalley still
        +      existed--an old man going about the world trying to pick up a cargo here
        +      and there for his little bark.</p>
        +
        +      <p>And everywhere it was the same. Departed the men who would have nodded
        +      appreciatively at the mention of his name, and would have thought
        +      themselves bound in honor to do something for Dare-devil Harry Whalley.
        +      Departed the opportunities which he would have known how to seize; and
        +      gone with them the white-winged flock of clippers that lived in the
        +      boisterous uncertain life of the winds, skimming big fortunes out of
        +      the foam of the sea. In a world that pared down the profits to an
        +      irreducible minimum, in a world that was able to count its disengaged
        +      tonnage twice over every day, and in which lean charters were snapped up
        +      by cable three months in advance, there were no chances of fortune for
        +      an individual wandering haphazard with a little bark--hardly indeed any
        +      room to exist.</p>
        +
        +      <p>He found it more difficult from year to year. He suffered greatly from
        +      the smallness of remittances he was able to send his daughter. Meantime
        +      he had given up good cigars, and even in the matter of inferior cheroots
        +      limited himself to six a day. He never told her of his difficulties, and
        +      she never enlarged upon her struggle to live. Their confidence in each
        +      other needed no explanations, and their perfect understanding endured
        +      without protestations of gratitude or regret. He would have been shocked
        +      if she had taken it into her head to thank him in so many words, but
        +      he found it perfectly natural that she should tell him she needed two
        +      hundred pounds.</p>
        +
        +      <p>He had come in with the Fair Maid in ballast to look for a freight in
        +      the Sofala's port of registry, and her letter met him there. Its tenor
        +      was that it was no use mincing matters. Her only resource was in opening
        +      a boarding-house, for which the prospects, she judged, were good. Good
        +      enough, at any rate, to make her tell him frankly that with two hundred
        +      pounds she could make a start. He had torn the envelope open, hastily,
        +      on deck, where it was handed to him by the ship-chandler's runner, who
        +      had brought his mail at the moment of anchoring. For the second time
        +      in his life he was appalled, and remained stock-still at the cabin door
        +      with the paper trembling between his fingers. Open a boarding-house! Two
        +      hundred pounds for a start! The only resource! And he did not know where
        +      to lay his hands on two hundred pence.</p>
        +
        +      <p>All that night Captain Whalley walked the poop of his anchored ship, as
        +      though he had been about to close with the land in thick weather, and
        +      uncertain of his position after a run of many gray days without a sight
        +      of sun, moon, or stars. The black night twinkled with the guiding lights
        +      of seamen and the steady straight lines of lights on shore; and all
        +      around the Fair Maid the riding lights of ships cast trembling trails
        +      upon the water of the roadstead. Captain Whalley saw not a gleam
        +      anywhere till the dawn broke and he found out that his clothing was
        +      soaked through with the heavy dew.</p>
        +
        +      <p>His ship was awake. He stopped short, stroked his wet beard, and
        +      descended the poop ladder backwards, with tired feet. At the sight
        +      of him the chief officer, lounging about sleepily on the quarterdeck,
        +      remained open-mouthed in the middle of a great early-morning yawn.</p>
        +
        +      <p>"Good morning to you," pronounced Captain Whalley solemnly, passing into
        +      the cabin. But he checked himself in the doorway, and without looking
        +      back, "By the bye," he said, "there should be an empty wooden case put
        +      away in the lazarette. It has not been broken up--has it?"</p>
        +
        +      <p>The mate shut his mouth, and then asked as if dazed, "What empty case,
        +      sir?"</p>
        +
        +      <p>"A big flat packing-case belonging to that painting in my room. Let it
        +      be taken up on deck and tell the carpenter to look it over. I may want
        +      to use it before long."</p>
        +
        +      <p>The chief officer did not stir a limb till he had heard the door of the
        +      captain's state-room slam within the cuddy. Then he beckoned aft the
        +      second mate with his forefinger to tell him that there was something "in
        +      the wind."</p>
        +
        +      <p>When the bell rang Captain Whalley's authoritative voice boomed out
        +      through a closed door, "Sit down and don't wait for me." And his
        +      impressed officers took their places, exchanging looks and whispers
        +      across the table. What! No breakfast? And after apparently knocking
        +      about all night on deck, too! Clearly, there was something in the wind.
        +      In the skylight above their heads, bowed earnestly over the plates,
        +      three wire cages rocked and rattled to the restless jumping of the
        +      hungry canaries; and they could detect the sounds of their "old
        +      man's" deliberate movements within his state-room. Captain Whalley was
        +      methodically winding up the chronometers, dusting the portrait of
        +      his late wife, getting a clean white shirt out of the drawers, making
        +      himself ready in his punctilious unhurried manner to go ashore. He could
        +      not have swallowed a single mouthful of food that morning. He had made
        +      up his mind to sell the Fair Maid.</p>
        +    </div>
        +
        +    <div class="pointer"></div>
        +
        +    <style>
        +      body {
        +        cursor: pointer;
        +      }
        +      .scroll {
        +        height: 80vh;
        +        width: 80vw;
        +        max-height: 600px;
        +        position: fixed;
        +        top: 5em;
        +        left: 10vw;
        +
        +        overflow-y: scroll;
        +        padding: 4em;
        +        box-sizing: border-box;
        +        line-height: 1.2;
        +      }
        +      .scroll::-webkit-scrollbar, .scroll::-webkit-scrollbar-track, .scroll::-webkit-scrollbar-thumb {
        +        display: none;
        +      }
        +
        +      .pointer {
        +        height: 3.6em;
        +        width: 77vw;
        +        border: 5px solid #CCC;
        +        border-radius: 15px;
        +        background-color: rgba(0, 0, 0, 0.05);
        +        pointer-events: none;
        +      }
        +      .highlight {
        +        background-color: rgba(255, 255, 0, 0.3);
        +      }
        +      .hover {
        +        background-color: rgba(0, 255, 255, 0.2);
        +      }
        +    </style>
        +
        +    <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +    <script>
        +      var pointer = document.querySelector('.pointer');
        +      var scroll = document.querySelector('.scroll');
        +
        +      // This creates the pointer tether and links it up
        +      // with the scroll handle
        +      new Tether({
        +        element: pointer,
        +        target: scroll,
        +        attachment: 'middle right',
        +        targetAttachment: 'middle left',
        +        targetModifier: 'scroll-handle'
        +      });
        +
        +      // Everything after this is for the highlighting effect
        +      var paras = document.querySelectorAll('p');
        +      for(var i=paras.length; i--;){
        +        var sents = paras[i].innerHTML.split('.');
        +        for (var j=sents.length; j--;){
        +          if (sents[j].trim().length)
        +            sents[j] = '<span>' + sents[j] + '.</span>';
        +        }
        +        paras[i].innerHTML = sents.join('');
        +      }
        +
        +      var spans = document.querySelectorAll('p span');
        +
        +      function highlight(){
        +        if (!spans) return;
        +
        +        var bar = pointer.getBoundingClientRect();
        +
        +        for (var i=spans.length; i--;){
        +          var coord = spans[i].getBoundingClientRect();
        +
        +          if (bar.top < coord.top && bar.bottom > coord.top){
        +            spans[i].classList.add('hover');
        +          } else if (spans[i].classList.contains('hover')) {
        +            spans[i].classList.remove('hover');
        +          }
        +        }
        +
        +        requestAnimationFrame(highlight);
        +      }
        +
        +      highlight();
        +
        +      document.body.addEventListener('click', function(){
        +        var els = document.querySelectorAll('.hover');
        +        for (var i=els.length; i--;)
        +          els[i].classList.toggle('highlight');
        +      });
        +    </script>
        +  </body>
        +</html>
        diff --git a/bower_components/tether/examples/enable-disable/index.html b/bower_components/tether/examples/enable-disable/index.html
        new file mode 100644
        index 0000000000..00036d4c24
        --- /dev/null
        +++ b/bower_components/tether/examples/enable-disable/index.html
        @@ -0,0 +1,37 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="../common/css/style.css" />
        +    </head>
        +    <body>
        +        <div class="instructions">Click the green target to enable/disable the tethering.</div>
        +
        +        <div class="element"></div>
        +        <div class="container">
        +            <div class="pad"></div>
        +            <div class="target"></div>
        +            <div class="pad"></div>
        +        </div>
        +
        +        <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +        <script>
        +            var tether = new Tether({
        +                element: '.element',
        +                target: '.target',
        +                attachment: 'top left',
        +                targetAttachment: 'top right'
        +            });
        +
        +            document.querySelector('.target').addEventListener('click', function(){
        +                if (tether.enabled)
        +                    tether.disable();
        +                else
        +                    tether.enable();
        +            });
        +        </script>
        +    </body>
        +</html>
        diff --git a/bower_components/tether/examples/facebook/facebook.css b/bower_components/tether/examples/facebook/facebook.css
        new file mode 100644
        index 0000000000..eae1508801
        --- /dev/null
        +++ b/bower_components/tether/examples/facebook/facebook.css
        @@ -0,0 +1,86 @@
        +.drop-target.drop-open {
        +    outline: 2px solid;
        +}
        +
        +.body {
        +    position: relative;
        +    margin-right: 300px;
        +}
        +
        +.page {
        +    max-width: 100%;
        +    width: 1080px;
        +    padding: 0 10px;
        +    box-sizing: border-box;
        +    margin: 0 auto;
        +}
        +
        +.navigation {
        +    background: blue;
        +    color: #fff;
        +    margin-right: 300px;
        +    margin-bottom: 30px;
        +}
        +
        +.navigation .item a {
        +    padding: 30px 20px;
        +    display: inline-block;
        +}
        +
        +.navigation .item a {
        +    color: inherit;
        +}
        +
        +.navigation .drop-target.drop-open {
        +    background: #fff;
        +    color: blue;
        +    outline: none;
        +}
        +
        +.right-sidebar {
        +    position: fixed;
        +    height: 50%;
        +    width: 300px;
        +    background: #eee;
        +    overflow: auto;
        +    right: 0;
        +}
        +
        +.right-sidebar .drop-target.drop-open {
        +    background: blue;
        +    color: #fff;
        +    outline: none;
        +}
        +
        +.right-sidebar .item a {
        +    display: block;
        +    padding: 20px;
        +    margin-bottom: 10px;
        +    background: rgba(0, 0, 0, .1);
        +}
        +
        +.right-sidebar-top {
        +    top: 0;
        +}
        +
        +.right-sidebar-bottom {
        +    top: 50%;
        +    background: #ccc;
        +}
        +
        +.scroll-container {
        +    position: relative; 
        +    overflow: auto;
        +    background: #eee;
        +    padding: 20px;
        +    margin-bottom: 20px;
        +    margin-right: 20px;
        +    height: 200px;
        +    width: 200px;
        +}
        +
        +.absolute-container {
        +    position: absolute;
        +    top: 20px;
        +    right: 300px;
        +}
        diff --git a/bower_components/tether/examples/facebook/index.html b/bower_components/tether/examples/facebook/index.html
        new file mode 100644
        index 0000000000..d4bcf8e0b2
        --- /dev/null
        +++ b/bower_components/tether/examples/facebook/index.html
        @@ -0,0 +1,209 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <link rel="stylesheet" href="../../css/drop.css" />
        +        <link rel="stylesheet" href="../../css/drop-theme-default.css" />
        +        <link rel="stylesheet" href="../../css/drop-theme-arrows.css" />
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="facebook.css" />
        +    </head>
        +    <body>
        +        <div class="navigation">
        +            <div class="page">
        +                <span class="item">DROPBOOK</span>
        +                <span class="item">
        +                    <a class="drop-target" data-constrain="false" data-attach="bottom left">DROP</a>
        +                </span>
        +                <span class="item">
        +                    <a class="drop-target" data-constrain="false" data-attach="bottom left">DROP</a>
        +                </span>
        +                <span class="item">
        +                    <a class="drop-target" data-constrain="false" data-attach="bottom left">DROP</a>
        +                </span>
        +            </div>
        +        </div>
        +        <div class="right-sidebar right-sidebar-top">
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="true" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left top">DROP</a>
        +            </div>
        +        </div>
        +        <div class="right-sidebar right-sidebar-bottom">
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="true" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +            <div class="item">
        +                <a class="drop-target" data-constrain="false" data-class="drop-theme-arrows" data-attach="left bottom">DROP</a>
        +            </div>
        +        </div>
        +        <div class="body">
        +            <div class="page">
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor<br/>
        +                incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud<br/>
        +                exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/><br/>
        +
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor<br/>
        +                incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud<br/>
        +                exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/><br/>
        +
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor<br/>
        +                incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud<br/>
        +                exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/><br/>
        +
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor<br/>
        +                incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud<br/>
        +                exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/><br/>
        +
        +                <a class="drop-target" data-constrain="true" data-attach="bottom left">DROP</a><br/><br/>
        +                <div class="scroll-container">
        +                  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        +                  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        +                  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        +                  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        +                  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        +                  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        +                  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        +                  <br/><br/><a class="drop-target" data-constrain="true" data-attach="bottom left">DROP</a><br/><br/> sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br/>
        +                </div>
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br/><br/>
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br/><br/>
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br/><br/>
        +                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br/><br/>
        +                <div class="scroll-container">
        +                    <br/>
        +                    <a class="drop-target" data-constrain="true" data-attach="bottom left">DROP</a><br/>
        +                    <br/>
        +                    <div style="width: 150%; background: #ccc; height: 1px"></div>
        +                </div>
        +                <div class="scroll-container">
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    <br/><br/>
        +                    <div style="width: 150%; background: #ccc; height: 1px">
        +                        <div style="margin-left: 100%">
        +                            <a class="drop-target" data-constrain="true" data-attach="bottom left">DROP</a>
        +                        </div>
        +                    </div>
        +                    <br/><br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br/>
        +                </div>
        +                <div class="scroll-container absolute-container">
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, <br/><br/><a class="drop-target" data-constrain="false" data-attach="left top">DROP</a><br/><br/> sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<br/>
        +                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br/>
        +                </div>
        +            </div>
        +        </div>
        +
        +        <script src="../resources/js/log.js"></script>
        +        <script src="../resources/js/jquery.js"></script>
        +        <script src="../../utils.js"></script>
        +        <script src="../../tether.js"></script>
        +        <script src="../../drop.js"></script>
        +        <script src="../../constraint.js"></script>
        +        <style>
        +            .drop .drop-content {
        +                min-height: 100px;
        +                min-width: 100px;
        +            }
        +        </style>
        +        <script>
        +            $('.drop-target').each(function(){
        +                new Drop({
        +                    target: this,
        +                    className: $(this).data().class || 'drop-theme-default',
        +                    attach: $(this).data().attach,
        +                    constrainToScrollParent: $(this).data().constrain,
        +                    openOn: 'click'
        +                });
        +            });
        +        </script>
        +    </body>
        +</html>
        diff --git a/bower_components/tether/examples/out-of-bounds/index.html b/bower_components/tether/examples/out-of-bounds/index.html
        new file mode 100644
        index 0000000000..c2a8c6d032
        --- /dev/null
        +++ b/bower_components/tether/examples/out-of-bounds/index.html
        @@ -0,0 +1,38 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="../common/css/style.css" />
        +        <style>
        +            .tether-element.tether-out-of-bounds {
        +                display: none;
        +            }
        +        </style>
        +    </head>
        +    <body>
        +        <div class="instructions">Resize the screen to see the tethered element disappear when it can't fit.</div>
        +
        +        <div class="element"></div>
        +        <div class="target"></div>
        +
        +        <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +        <script>
        +            var tether = new Tether({
        +                element: '.element',
        +                target: '.target',
        +                attachment: 'top left',
        +                targetAttachment: 'top right',
        +                constraints: [{
        +                    to: 'window',
        +                    attachment: 'together'
        +                }]
        +            });
        +            tether.on('update', function(event) {
        +                console.log(event);
        +            });
        +        </script>
        +    </body>
        +</html>
        diff --git a/bower_components/tether/examples/pin/index.html b/bower_components/tether/examples/pin/index.html
        new file mode 100644
        index 0000000000..cd040ab9af
        --- /dev/null
        +++ b/bower_components/tether/examples/pin/index.html
        @@ -0,0 +1,30 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="../common/css/style.css" />
        +    </head>
        +    <body>
        +        <div class="instructions">Resize the screen to see the tethered element stick to the edges of the screen when it's resized.</div>
        +
        +        <div class="element"></div>
        +        <div class="target"></div>
        +
        +        <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +        <script>
        +            new Tether({
        +                element: '.element',
        +                target: '.target',
        +                attachment: 'top left',
        +                targetAttachment: 'top right',
        +                constraints: [{
        +                    to: 'window',
        +                    pin: true
        +                }]
        +            });
        +        </script>
        +    </body>
        +</html>
        diff --git a/bower_components/tether/examples/resources/css/base.css b/bower_components/tether/examples/resources/css/base.css
        new file mode 100644
        index 0000000000..8006e9d80e
        --- /dev/null
        +++ b/bower_components/tether/examples/resources/css/base.css
        @@ -0,0 +1,10 @@
        +body {
        +    font-family: "Helvetica Neue", sans-serif;
        +    color: #444;
        +    margin: 0px;
        +}
        +
        +a {
        +    cursor: pointer;
        +    color: blue;
        +}
        \ No newline at end of file
        diff --git a/bower_components/tether/examples/resources/js/jquery.js b/bower_components/tether/examples/resources/js/jquery.js
        new file mode 100644
        index 0000000000..a4faed1200
        --- /dev/null
        +++ b/bower_components/tether/examples/resources/js/jquery.js
        @@ -0,0 +1,9597 @@
        +/*!
        + * jQuery JavaScript Library v1.9.1
        + * http://jquery.com/
        + *
        + * Includes Sizzle.js
        + * http://sizzlejs.com/
        + *
        + * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + *
        + * Date: 2013-2-4
        + */
        +(function( window, undefined ) {
        +
        +// Can't do this because several apps including ASP.NET trace
        +// the stack via arguments.caller.callee and Firefox dies if
        +// you try to trace through "use strict" call chains. (#13335)
        +// Support: Firefox 18+
        +//"use strict";
        +var
        +    // The deferred used on DOM ready
        +    readyList,
        +
        +    // A central reference to the root jQuery(document)
        +    rootjQuery,
        +
        +    // Support: IE<9
        +    // For `typeof node.method` instead of `node.method !== undefined`
        +    core_strundefined = typeof undefined,
        +
        +    // Use the correct document accordingly with window argument (sandbox)
        +    document = window.document,
        +    location = window.location,
        +
        +    // Map over jQuery in case of overwrite
        +    _jQuery = window.jQuery,
        +
        +    // Map over the $ in case of overwrite
        +    _$ = window.$,
        +
        +    // [[Class]] -> type pairs
        +    class2type = {},
        +
        +    // List of deleted data cache ids, so we can reuse them
        +    core_deletedIds = [],
        +
        +    core_version = "1.9.1",
        +
        +    // Save a reference to some core methods
        +    core_concat = core_deletedIds.concat,
        +    core_push = core_deletedIds.push,
        +    core_slice = core_deletedIds.slice,
        +    core_indexOf = core_deletedIds.indexOf,
        +    core_toString = class2type.toString,
        +    core_hasOwn = class2type.hasOwnProperty,
        +    core_trim = core_version.trim,
        +
        +    // Define a local copy of jQuery
        +    jQuery = function( selector, context ) {
        +        // The jQuery object is actually just the init constructor 'enhanced'
        +        return new jQuery.fn.init( selector, context, rootjQuery );
        +    },
        +
        +    // Used for matching numbers
        +    core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
        +
        +    // Used for splitting on whitespace
        +    core_rnotwhite = /\S+/g,
        +
        +    // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
        +    rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
        +
        +    // A simple way to check for HTML strings
        +    // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        +    // Strict HTML recognition (#11290: must start with <)
        +    rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
        +
        +    // Match a standalone tag
        +    rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
        +
        +    // JSON RegExp
        +    rvalidchars = /^[\],:{}\s]*$/,
        +    rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
        +    rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
        +    rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
        +
        +    // Matches dashed string for camelizing
        +    rmsPrefix = /^-ms-/,
        +    rdashAlpha = /-([\da-z])/gi,
        +
        +    // Used by jQuery.camelCase as callback to replace()
        +    fcamelCase = function( all, letter ) {
        +        return letter.toUpperCase();
        +    },
        +
        +    // The ready event handler
        +    completed = function( event ) {
        +
        +        // readyState === "complete" is good enough for us to call the dom ready in oldIE
        +        if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
        +            detach();
        +            jQuery.ready();
        +        }
        +    },
        +    // Clean-up method for dom ready events
        +    detach = function() {
        +        if ( document.addEventListener ) {
        +            document.removeEventListener( "DOMContentLoaded", completed, false );
        +            window.removeEventListener( "load", completed, false );
        +
        +        } else {
        +            document.detachEvent( "onreadystatechange", completed );
        +            window.detachEvent( "onload", completed );
        +        }
        +    };
        +
        +jQuery.fn = jQuery.prototype = {
        +    // The current version of jQuery being used
        +    jquery: core_version,
        +
        +    constructor: jQuery,
        +    init: function( selector, context, rootjQuery ) {
        +        var match, elem;
        +
        +        // HANDLE: $(""), $(null), $(undefined), $(false)
        +        if ( !selector ) {
        +            return this;
        +        }
        +
        +        // Handle HTML strings
        +        if ( typeof selector === "string" ) {
        +            if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
        +                // Assume that strings that start and end with <> are HTML and skip the regex check
        +                match = [ null, selector, null ];
        +
        +            } else {
        +                match = rquickExpr.exec( selector );
        +            }
        +
        +            // Match html or make sure no context is specified for #id
        +            if ( match && (match[1] || !context) ) {
        +
        +                // HANDLE: $(html) -> $(array)
        +                if ( match[1] ) {
        +                    context = context instanceof jQuery ? context[0] : context;
        +
        +                    // scripts is true for back-compat
        +                    jQuery.merge( this, jQuery.parseHTML(
        +                        match[1],
        +                        context && context.nodeType ? context.ownerDocument || context : document,
        +                        true
        +                    ) );
        +
        +                    // HANDLE: $(html, props)
        +                    if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
        +                        for ( match in context ) {
        +                            // Properties of context are called as methods if possible
        +                            if ( jQuery.isFunction( this[ match ] ) ) {
        +                                this[ match ]( context[ match ] );
        +
        +                            // ...and otherwise set as attributes
        +                            } else {
        +                                this.attr( match, context[ match ] );
        +                            }
        +                        }
        +                    }
        +
        +                    return this;
        +
        +                // HANDLE: $(#id)
        +                } else {
        +                    elem = document.getElementById( match[2] );
        +
        +                    // Check parentNode to catch when Blackberry 4.6 returns
        +                    // nodes that are no longer in the document #6963
        +                    if ( elem && elem.parentNode ) {
        +                        // Handle the case where IE and Opera return items
        +                        // by name instead of ID
        +                        if ( elem.id !== match[2] ) {
        +                            return rootjQuery.find( selector );
        +                        }
        +
        +                        // Otherwise, we inject the element directly into the jQuery object
        +                        this.length = 1;
        +                        this[0] = elem;
        +                    }
        +
        +                    this.context = document;
        +                    this.selector = selector;
        +                    return this;
        +                }
        +
        +            // HANDLE: $(expr, $(...))
        +            } else if ( !context || context.jquery ) {
        +                return ( context || rootjQuery ).find( selector );
        +
        +            // HANDLE: $(expr, context)
        +            // (which is just equivalent to: $(context).find(expr)
        +            } else {
        +                return this.constructor( context ).find( selector );
        +            }
        +
        +        // HANDLE: $(DOMElement)
        +        } else if ( selector.nodeType ) {
        +            this.context = this[0] = selector;
        +            this.length = 1;
        +            return this;
        +
        +        // HANDLE: $(function)
        +        // Shortcut for document ready
        +        } else if ( jQuery.isFunction( selector ) ) {
        +            return rootjQuery.ready( selector );
        +        }
        +
        +        if ( selector.selector !== undefined ) {
        +            this.selector = selector.selector;
        +            this.context = selector.context;
        +        }
        +
        +        return jQuery.makeArray( selector, this );
        +    },
        +
        +    // Start with an empty selector
        +    selector: "",
        +
        +    // The default length of a jQuery object is 0
        +    length: 0,
        +
        +    // The number of elements contained in the matched element set
        +    size: function() {
        +        return this.length;
        +    },
        +
        +    toArray: function() {
        +        return core_slice.call( this );
        +    },
        +
        +    // Get the Nth element in the matched element set OR
        +    // Get the whole matched element set as a clean array
        +    get: function( num ) {
        +        return num == null ?
        +
        +            // Return a 'clean' array
        +            this.toArray() :
        +
        +            // Return just the object
        +            ( num < 0 ? this[ this.length + num ] : this[ num ] );
        +    },
        +
        +    // Take an array of elements and push it onto the stack
        +    // (returning the new matched element set)
        +    pushStack: function( elems ) {
        +
        +        // Build a new jQuery matched element set
        +        var ret = jQuery.merge( this.constructor(), elems );
        +
        +        // Add the old object onto the stack (as a reference)
        +        ret.prevObject = this;
        +        ret.context = this.context;
        +
        +        // Return the newly-formed element set
        +        return ret;
        +    },
        +
        +    // Execute a callback for every element in the matched set.
        +    // (You can seed the arguments with an array of args, but this is
        +    // only used internally.)
        +    each: function( callback, args ) {
        +        return jQuery.each( this, callback, args );
        +    },
        +
        +    ready: function( fn ) {
        +        // Add the callback
        +        jQuery.ready.promise().done( fn );
        +
        +        return this;
        +    },
        +
        +    slice: function() {
        +        return this.pushStack( core_slice.apply( this, arguments ) );
        +    },
        +
        +    first: function() {
        +        return this.eq( 0 );
        +    },
        +
        +    last: function() {
        +        return this.eq( -1 );
        +    },
        +
        +    eq: function( i ) {
        +        var len = this.length,
        +            j = +i + ( i < 0 ? len : 0 );
        +        return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
        +    },
        +
        +    map: function( callback ) {
        +        return this.pushStack( jQuery.map(this, function( elem, i ) {
        +            return callback.call( elem, i, elem );
        +        }));
        +    },
        +
        +    end: function() {
        +        return this.prevObject || this.constructor(null);
        +    },
        +
        +    // For internal use only.
        +    // Behaves like an Array's method, not like a jQuery method.
        +    push: core_push,
        +    sort: [].sort,
        +    splice: [].splice
        +};
        +
        +// Give the init function the jQuery prototype for later instantiation
        +jQuery.fn.init.prototype = jQuery.fn;
        +
        +jQuery.extend = jQuery.fn.extend = function() {
        +    var src, copyIsArray, copy, name, options, clone,
        +        target = arguments[0] || {},
        +        i = 1,
        +        length = arguments.length,
        +        deep = false;
        +
        +    // Handle a deep copy situation
        +    if ( typeof target === "boolean" ) {
        +        deep = target;
        +        target = arguments[1] || {};
        +        // skip the boolean and the target
        +        i = 2;
        +    }
        +
        +    // Handle case when target is a string or something (possible in deep copy)
        +    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
        +        target = {};
        +    }
        +
        +    // extend jQuery itself if only one argument is passed
        +    if ( length === i ) {
        +        target = this;
        +        --i;
        +    }
        +
        +    for ( ; i < length; i++ ) {
        +        // Only deal with non-null/undefined values
        +        if ( (options = arguments[ i ]) != null ) {
        +            // Extend the base object
        +            for ( name in options ) {
        +                src = target[ name ];
        +                copy = options[ name ];
        +
        +                // Prevent never-ending loop
        +                if ( target === copy ) {
        +                    continue;
        +                }
        +
        +                // Recurse if we're merging plain objects or arrays
        +                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
        +                    if ( copyIsArray ) {
        +                        copyIsArray = false;
        +                        clone = src && jQuery.isArray(src) ? src : [];
        +
        +                    } else {
        +                        clone = src && jQuery.isPlainObject(src) ? src : {};
        +                    }
        +
        +                    // Never move original objects, clone them
        +                    target[ name ] = jQuery.extend( deep, clone, copy );
        +
        +                // Don't bring in undefined values
        +                } else if ( copy !== undefined ) {
        +                    target[ name ] = copy;
        +                }
        +            }
        +        }
        +    }
        +
        +    // Return the modified object
        +    return target;
        +};
        +
        +jQuery.extend({
        +    noConflict: function( deep ) {
        +        if ( window.$ === jQuery ) {
        +            window.$ = _$;
        +        }
        +
        +        if ( deep && window.jQuery === jQuery ) {
        +            window.jQuery = _jQuery;
        +        }
        +
        +        return jQuery;
        +    },
        +
        +    // Is the DOM ready to be used? Set to true once it occurs.
        +    isReady: false,
        +
        +    // A counter to track how many items to wait for before
        +    // the ready event fires. See #6781
        +    readyWait: 1,
        +
        +    // Hold (or release) the ready event
        +    holdReady: function( hold ) {
        +        if ( hold ) {
        +            jQuery.readyWait++;
        +        } else {
        +            jQuery.ready( true );
        +        }
        +    },
        +
        +    // Handle when the DOM is ready
        +    ready: function( wait ) {
        +
        +        // Abort if there are pending holds or we're already ready
        +        if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
        +            return;
        +        }
        +
        +        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
        +        if ( !document.body ) {
        +            return setTimeout( jQuery.ready );
        +        }
        +
        +        // Remember that the DOM is ready
        +        jQuery.isReady = true;
        +
        +        // If a normal DOM Ready event fired, decrement, and wait if need be
        +        if ( wait !== true && --jQuery.readyWait > 0 ) {
        +            return;
        +        }
        +
        +        // If there are functions bound, to execute
        +        readyList.resolveWith( document, [ jQuery ] );
        +
        +        // Trigger any bound ready events
        +        if ( jQuery.fn.trigger ) {
        +            jQuery( document ).trigger("ready").off("ready");
        +        }
        +    },
        +
        +    // See test/unit/core.js for details concerning isFunction.
        +    // Since version 1.3, DOM methods and functions like alert
        +    // aren't supported. They return false on IE (#2968).
        +    isFunction: function( obj ) {
        +        return jQuery.type(obj) === "function";
        +    },
        +
        +    isArray: Array.isArray || function( obj ) {
        +        return jQuery.type(obj) === "array";
        +    },
        +
        +    isWindow: function( obj ) {
        +        return obj != null && obj == obj.window;
        +    },
        +
        +    isNumeric: function( obj ) {
        +        return !isNaN( parseFloat(obj) ) && isFinite( obj );
        +    },
        +
        +    type: function( obj ) {
        +        if ( obj == null ) {
        +            return String( obj );
        +        }
        +        return typeof obj === "object" || typeof obj === "function" ?
        +            class2type[ core_toString.call(obj) ] || "object" :
        +            typeof obj;
        +    },
        +
        +    isPlainObject: function( obj ) {
        +        // Must be an Object.
        +        // Because of IE, we also have to check the presence of the constructor property.
        +        // Make sure that DOM nodes and window objects don't pass through, as well
        +        if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
        +            return false;
        +        }
        +
        +        try {
        +            // Not own constructor property must be Object
        +            if ( obj.constructor &&
        +                !core_hasOwn.call(obj, "constructor") &&
        +                !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
        +                return false;
        +            }
        +        } catch ( e ) {
        +            // IE8,9 Will throw exceptions on certain host objects #9897
        +            return false;
        +        }
        +
        +        // Own properties are enumerated firstly, so to speed up,
        +        // if last one is own, then all properties are own.
        +
        +        var key;
        +        for ( key in obj ) {}
        +
        +        return key === undefined || core_hasOwn.call( obj, key );
        +    },
        +
        +    isEmptyObject: function( obj ) {
        +        var name;
        +        for ( name in obj ) {
        +            return false;
        +        }
        +        return true;
        +    },
        +
        +    error: function( msg ) {
        +        throw new Error( msg );
        +    },
        +
        +    // data: string of html
        +    // context (optional): If specified, the fragment will be created in this context, defaults to document
        +    // keepScripts (optional): If true, will include scripts passed in the html string
        +    parseHTML: function( data, context, keepScripts ) {
        +        if ( !data || typeof data !== "string" ) {
        +            return null;
        +        }
        +        if ( typeof context === "boolean" ) {
        +            keepScripts = context;
        +            context = false;
        +        }
        +        context = context || document;
        +
        +        var parsed = rsingleTag.exec( data ),
        +            scripts = !keepScripts && [];
        +
        +        // Single tag
        +        if ( parsed ) {
        +            return [ context.createElement( parsed[1] ) ];
        +        }
        +
        +        parsed = jQuery.buildFragment( [ data ], context, scripts );
        +        if ( scripts ) {
        +            jQuery( scripts ).remove();
        +        }
        +        return jQuery.merge( [], parsed.childNodes );
        +    },
        +
        +    parseJSON: function( data ) {
        +        // Attempt to parse using the native JSON parser first
        +        if ( window.JSON && window.JSON.parse ) {
        +            return window.JSON.parse( data );
        +        }
        +
        +        if ( data === null ) {
        +            return data;
        +        }
        +
        +        if ( typeof data === "string" ) {
        +
        +            // Make sure leading/trailing whitespace is removed (IE can't handle it)
        +            data = jQuery.trim( data );
        +
        +            if ( data ) {
        +                // Make sure the incoming data is actual JSON
        +                // Logic borrowed from http://json.org/json2.js
        +                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        +                    .replace( rvalidtokens, "]" )
        +                    .replace( rvalidbraces, "")) ) {
        +
        +                    return ( new Function( "return " + data ) )();
        +                }
        +            }
        +        }
        +
        +        jQuery.error( "Invalid JSON: " + data );
        +    },
        +
        +    // Cross-browser xml parsing
        +    parseXML: function( data ) {
        +        var xml, tmp;
        +        if ( !data || typeof data !== "string" ) {
        +            return null;
        +        }
        +        try {
        +            if ( window.DOMParser ) { // Standard
        +                tmp = new DOMParser();
        +                xml = tmp.parseFromString( data , "text/xml" );
        +            } else { // IE
        +                xml = new ActiveXObject( "Microsoft.XMLDOM" );
        +                xml.async = "false";
        +                xml.loadXML( data );
        +            }
        +        } catch( e ) {
        +            xml = undefined;
        +        }
        +        if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
        +            jQuery.error( "Invalid XML: " + data );
        +        }
        +        return xml;
        +    },
        +
        +    noop: function() {},
        +
        +    // Evaluates a script in a global context
        +    // Workarounds based on findings by Jim Driscoll
        +    // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
        +    globalEval: function( data ) {
        +        if ( data && jQuery.trim( data ) ) {
        +            // We use execScript on Internet Explorer
        +            // We use an anonymous function so that context is window
        +            // rather than jQuery in Firefox
        +            ( window.execScript || function( data ) {
        +                window[ "eval" ].call( window, data );
        +            } )( data );
        +        }
        +    },
        +
        +    // Convert dashed to camelCase; used by the css and data modules
        +    // Microsoft forgot to hump their vendor prefix (#9572)
        +    camelCase: function( string ) {
        +        return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
        +    },
        +
        +    nodeName: function( elem, name ) {
        +        return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        +    },
        +
        +    // args is for internal usage only
        +    each: function( obj, callback, args ) {
        +        var value,
        +            i = 0,
        +            length = obj.length,
        +            isArray = isArraylike( obj );
        +
        +        if ( args ) {
        +            if ( isArray ) {
        +                for ( ; i < length; i++ ) {
        +                    value = callback.apply( obj[ i ], args );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            } else {
        +                for ( i in obj ) {
        +                    value = callback.apply( obj[ i ], args );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            }
        +
        +        // A special, fast, case for the most common use of each
        +        } else {
        +            if ( isArray ) {
        +                for ( ; i < length; i++ ) {
        +                    value = callback.call( obj[ i ], i, obj[ i ] );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            } else {
        +                for ( i in obj ) {
        +                    value = callback.call( obj[ i ], i, obj[ i ] );
        +
        +                    if ( value === false ) {
        +                        break;
        +                    }
        +                }
        +            }
        +        }
        +
        +        return obj;
        +    },
        +
        +    // Use native String.trim function wherever possible
        +    trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
        +        function( text ) {
        +            return text == null ?
        +                "" :
        +                core_trim.call( text );
        +        } :
        +
        +        // Otherwise use our own trimming functionality
        +        function( text ) {
        +            return text == null ?
        +                "" :
        +                ( text + "" ).replace( rtrim, "" );
        +        },
        +
        +    // results is for internal usage only
        +    makeArray: function( arr, results ) {
        +        var ret = results || [];
        +
        +        if ( arr != null ) {
        +            if ( isArraylike( Object(arr) ) ) {
        +                jQuery.merge( ret,
        +                    typeof arr === "string" ?
        +                    [ arr ] : arr
        +                );
        +            } else {
        +                core_push.call( ret, arr );
        +            }
        +        }
        +
        +        return ret;
        +    },
        +
        +    inArray: function( elem, arr, i ) {
        +        var len;
        +
        +        if ( arr ) {
        +            if ( core_indexOf ) {
        +                return core_indexOf.call( arr, elem, i );
        +            }
        +
        +            len = arr.length;
        +            i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
        +
        +            for ( ; i < len; i++ ) {
        +                // Skip accessing in sparse arrays
        +                if ( i in arr && arr[ i ] === elem ) {
        +                    return i;
        +                }
        +            }
        +        }
        +
        +        return -1;
        +    },
        +
        +    merge: function( first, second ) {
        +        var l = second.length,
        +            i = first.length,
        +            j = 0;
        +
        +        if ( typeof l === "number" ) {
        +            for ( ; j < l; j++ ) {
        +                first[ i++ ] = second[ j ];
        +            }
        +        } else {
        +            while ( second[j] !== undefined ) {
        +                first[ i++ ] = second[ j++ ];
        +            }
        +        }
        +
        +        first.length = i;
        +
        +        return first;
        +    },
        +
        +    grep: function( elems, callback, inv ) {
        +        var retVal,
        +            ret = [],
        +            i = 0,
        +            length = elems.length;
        +        inv = !!inv;
        +
        +        // Go through the array, only saving the items
        +        // that pass the validator function
        +        for ( ; i < length; i++ ) {
        +            retVal = !!callback( elems[ i ], i );
        +            if ( inv !== retVal ) {
        +                ret.push( elems[ i ] );
        +            }
        +        }
        +
        +        return ret;
        +    },
        +
        +    // arg is for internal usage only
        +    map: function( elems, callback, arg ) {
        +        var value,
        +            i = 0,
        +            length = elems.length,
        +            isArray = isArraylike( elems ),
        +            ret = [];
        +
        +        // Go through the array, translating each of the items to their
        +        if ( isArray ) {
        +            for ( ; i < length; i++ ) {
        +                value = callback( elems[ i ], i, arg );
        +
        +                if ( value != null ) {
        +                    ret[ ret.length ] = value;
        +                }
        +            }
        +
        +        // Go through every key on the object,
        +        } else {
        +            for ( i in elems ) {
        +                value = callback( elems[ i ], i, arg );
        +
        +                if ( value != null ) {
        +                    ret[ ret.length ] = value;
        +                }
        +            }
        +        }
        +
        +        // Flatten any nested arrays
        +        return core_concat.apply( [], ret );
        +    },
        +
        +    // A global GUID counter for objects
        +    guid: 1,
        +
        +    // Bind a function to a context, optionally partially applying any
        +    // arguments.
        +    proxy: function( fn, context ) {
        +        var args, proxy, tmp;
        +
        +        if ( typeof context === "string" ) {
        +            tmp = fn[ context ];
        +            context = fn;
        +            fn = tmp;
        +        }
        +
        +        // Quick check to determine if target is callable, in the spec
        +        // this throws a TypeError, but we will just return undefined.
        +        if ( !jQuery.isFunction( fn ) ) {
        +            return undefined;
        +        }
        +
        +        // Simulated bind
        +        args = core_slice.call( arguments, 2 );
        +        proxy = function() {
        +            return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
        +        };
        +
        +        // Set the guid of unique handler to the same of original handler, so it can be removed
        +        proxy.guid = fn.guid = fn.guid || jQuery.guid++;
        +
        +        return proxy;
        +    },
        +
        +    // Multifunctional method to get and set values of a collection
        +    // The value/s can optionally be executed if it's a function
        +    access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
        +        var i = 0,
        +            length = elems.length,
        +            bulk = key == null;
        +
        +        // Sets many values
        +        if ( jQuery.type( key ) === "object" ) {
        +            chainable = true;
        +            for ( i in key ) {
        +                jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
        +            }
        +
        +        // Sets one value
        +        } else if ( value !== undefined ) {
        +            chainable = true;
        +
        +            if ( !jQuery.isFunction( value ) ) {
        +                raw = true;
        +            }
        +
        +            if ( bulk ) {
        +                // Bulk operations run against the entire set
        +                if ( raw ) {
        +                    fn.call( elems, value );
        +                    fn = null;
        +
        +                // ...except when executing function values
        +                } else {
        +                    bulk = fn;
        +                    fn = function( elem, key, value ) {
        +                        return bulk.call( jQuery( elem ), value );
        +                    };
        +                }
        +            }
        +
        +            if ( fn ) {
        +                for ( ; i < length; i++ ) {
        +                    fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
        +                }
        +            }
        +        }
        +
        +        return chainable ?
        +            elems :
        +
        +            // Gets
        +            bulk ?
        +                fn.call( elems ) :
        +                length ? fn( elems[0], key ) : emptyGet;
        +    },
        +
        +    now: function() {
        +        return ( new Date() ).getTime();
        +    }
        +});
        +
        +jQuery.ready.promise = function( obj ) {
        +    if ( !readyList ) {
        +
        +        readyList = jQuery.Deferred();
        +
        +        // Catch cases where $(document).ready() is called after the browser event has already occurred.
        +        // we once tried to use readyState "interactive" here, but it caused issues like the one
        +        // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
        +        if ( document.readyState === "complete" ) {
        +            // Handle it asynchronously to allow scripts the opportunity to delay ready
        +            setTimeout( jQuery.ready );
        +
        +        // Standards-based browsers support DOMContentLoaded
        +        } else if ( document.addEventListener ) {
        +            // Use the handy event callback
        +            document.addEventListener( "DOMContentLoaded", completed, false );
        +
        +            // A fallback to window.onload, that will always work
        +            window.addEventListener( "load", completed, false );
        +
        +        // If IE event model is used
        +        } else {
        +            // Ensure firing before onload, maybe late but safe also for iframes
        +            document.attachEvent( "onreadystatechange", completed );
        +
        +            // A fallback to window.onload, that will always work
        +            window.attachEvent( "onload", completed );
        +
        +            // If IE and not a frame
        +            // continually check to see if the document is ready
        +            var top = false;
        +
        +            try {
        +                top = window.frameElement == null && document.documentElement;
        +            } catch(e) {}
        +
        +            if ( top && top.doScroll ) {
        +                (function doScrollCheck() {
        +                    if ( !jQuery.isReady ) {
        +
        +                        try {
        +                            // Use the trick by Diego Perini
        +                            // http://javascript.nwbox.com/IEContentLoaded/
        +                            top.doScroll("left");
        +                        } catch(e) {
        +                            return setTimeout( doScrollCheck, 50 );
        +                        }
        +
        +                        // detach all dom ready events
        +                        detach();
        +
        +                        // and execute any waiting functions
        +                        jQuery.ready();
        +                    }
        +                })();
        +            }
        +        }
        +    }
        +    return readyList.promise( obj );
        +};
        +
        +// Populate the class2type map
        +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
        +    class2type[ "[object " + name + "]" ] = name.toLowerCase();
        +});
        +
        +function isArraylike( obj ) {
        +    var length = obj.length,
        +        type = jQuery.type( obj );
        +
        +    if ( jQuery.isWindow( obj ) ) {
        +        return false;
        +    }
        +
        +    if ( obj.nodeType === 1 && length ) {
        +        return true;
        +    }
        +
        +    return type === "array" || type !== "function" &&
        +        ( length === 0 ||
        +        typeof length === "number" && length > 0 && ( length - 1 ) in obj );
        +}
        +
        +// All jQuery objects should point back to these
        +rootjQuery = jQuery(document);
        +// String to Object options format cache
        +var optionsCache = {};
        +
        +// Convert String-formatted options into Object-formatted ones and store in cache
        +function createOptions( options ) {
        +    var object = optionsCache[ options ] = {};
        +    jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
        +        object[ flag ] = true;
        +    });
        +    return object;
        +}
        +
        +/*
        + * Create a callback list using the following parameters:
        + *
        + *  options: an optional list of space-separated options that will change how
        + *          the callback list behaves or a more traditional option object
        + *
        + * By default a callback list will act like an event callback list and can be
        + * "fired" multiple times.
        + *
        + * Possible options:
        + *
        + *  once:           will ensure the callback list can only be fired once (like a Deferred)
        + *
        + *  memory:         will keep track of previous values and will call any callback added
        + *                  after the list has been fired right away with the latest "memorized"
        + *                  values (like a Deferred)
        + *
        + *  unique:         will ensure a callback can only be added once (no duplicate in the list)
        + *
        + *  stopOnFalse:    interrupt callings when a callback returns false
        + *
        + */
        +jQuery.Callbacks = function( options ) {
        +
        +    // Convert options from String-formatted to Object-formatted if needed
        +    // (we check in cache first)
        +    options = typeof options === "string" ?
        +        ( optionsCache[ options ] || createOptions( options ) ) :
        +        jQuery.extend( {}, options );
        +
        +    var // Flag to know if list is currently firing
        +        firing,
        +        // Last fire value (for non-forgettable lists)
        +        memory,
        +        // Flag to know if list was already fired
        +        fired,
        +        // End of the loop when firing
        +        firingLength,
        +        // Index of currently firing callback (modified by remove if needed)
        +        firingIndex,
        +        // First callback to fire (used internally by add and fireWith)
        +        firingStart,
        +        // Actual callback list
        +        list = [],
        +        // Stack of fire calls for repeatable lists
        +        stack = !options.once && [],
        +        // Fire callbacks
        +        fire = function( data ) {
        +            memory = options.memory && data;
        +            fired = true;
        +            firingIndex = firingStart || 0;
        +            firingStart = 0;
        +            firingLength = list.length;
        +            firing = true;
        +            for ( ; list && firingIndex < firingLength; firingIndex++ ) {
        +                if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
        +                    memory = false; // To prevent further calls using add
        +                    break;
        +                }
        +            }
        +            firing = false;
        +            if ( list ) {
        +                if ( stack ) {
        +                    if ( stack.length ) {
        +                        fire( stack.shift() );
        +                    }
        +                } else if ( memory ) {
        +                    list = [];
        +                } else {
        +                    self.disable();
        +                }
        +            }
        +        },
        +        // Actual Callbacks object
        +        self = {
        +            // Add a callback or a collection of callbacks to the list
        +            add: function() {
        +                if ( list ) {
        +                    // First, we save the current length
        +                    var start = list.length;
        +                    (function add( args ) {
        +                        jQuery.each( args, function( _, arg ) {
        +                            var type = jQuery.type( arg );
        +                            if ( type === "function" ) {
        +                                if ( !options.unique || !self.has( arg ) ) {
        +                                    list.push( arg );
        +                                }
        +                            } else if ( arg && arg.length && type !== "string" ) {
        +                                // Inspect recursively
        +                                add( arg );
        +                            }
        +                        });
        +                    })( arguments );
        +                    // Do we need to add the callbacks to the
        +                    // current firing batch?
        +                    if ( firing ) {
        +                        firingLength = list.length;
        +                    // With memory, if we're not firing then
        +                    // we should call right away
        +                    } else if ( memory ) {
        +                        firingStart = start;
        +                        fire( memory );
        +                    }
        +                }
        +                return this;
        +            },
        +            // Remove a callback from the list
        +            remove: function() {
        +                if ( list ) {
        +                    jQuery.each( arguments, function( _, arg ) {
        +                        var index;
        +                        while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
        +                            list.splice( index, 1 );
        +                            // Handle firing indexes
        +                            if ( firing ) {
        +                                if ( index <= firingLength ) {
        +                                    firingLength--;
        +                                }
        +                                if ( index <= firingIndex ) {
        +                                    firingIndex--;
        +                                }
        +                            }
        +                        }
        +                    });
        +                }
        +                return this;
        +            },
        +            // Check if a given callback is in the list.
        +            // If no argument is given, return whether or not list has callbacks attached.
        +            has: function( fn ) {
        +                return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
        +            },
        +            // Remove all callbacks from the list
        +            empty: function() {
        +                list = [];
        +                return this;
        +            },
        +            // Have the list do nothing anymore
        +            disable: function() {
        +                list = stack = memory = undefined;
        +                return this;
        +            },
        +            // Is it disabled?
        +            disabled: function() {
        +                return !list;
        +            },
        +            // Lock the list in its current state
        +            lock: function() {
        +                stack = undefined;
        +                if ( !memory ) {
        +                    self.disable();
        +                }
        +                return this;
        +            },
        +            // Is it locked?
        +            locked: function() {
        +                return !stack;
        +            },
        +            // Call all callbacks with the given context and arguments
        +            fireWith: function( context, args ) {
        +                args = args || [];
        +                args = [ context, args.slice ? args.slice() : args ];
        +                if ( list && ( !fired || stack ) ) {
        +                    if ( firing ) {
        +                        stack.push( args );
        +                    } else {
        +                        fire( args );
        +                    }
        +                }
        +                return this;
        +            },
        +            // Call all the callbacks with the given arguments
        +            fire: function() {
        +                self.fireWith( this, arguments );
        +                return this;
        +            },
        +            // To know if the callbacks have already been called at least once
        +            fired: function() {
        +                return !!fired;
        +            }
        +        };
        +
        +    return self;
        +};
        +jQuery.extend({
        +
        +    Deferred: function( func ) {
        +        var tuples = [
        +                // action, add listener, listener list, final state
        +                [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
        +                [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
        +                [ "notify", "progress", jQuery.Callbacks("memory") ]
        +            ],
        +            state = "pending",
        +            promise = {
        +                state: function() {
        +                    return state;
        +                },
        +                always: function() {
        +                    deferred.done( arguments ).fail( arguments );
        +                    return this;
        +                },
        +                then: function( /* fnDone, fnFail, fnProgress */ ) {
        +                    var fns = arguments;
        +                    return jQuery.Deferred(function( newDefer ) {
        +                        jQuery.each( tuples, function( i, tuple ) {
        +                            var action = tuple[ 0 ],
        +                                fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
        +                            // deferred[ done | fail | progress ] for forwarding actions to newDefer
        +                            deferred[ tuple[1] ](function() {
        +                                var returned = fn && fn.apply( this, arguments );
        +                                if ( returned && jQuery.isFunction( returned.promise ) ) {
        +                                    returned.promise()
        +                                        .done( newDefer.resolve )
        +                                        .fail( newDefer.reject )
        +                                        .progress( newDefer.notify );
        +                                } else {
        +                                    newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
        +                                }
        +                            });
        +                        });
        +                        fns = null;
        +                    }).promise();
        +                },
        +                // Get a promise for this deferred
        +                // If obj is provided, the promise aspect is added to the object
        +                promise: function( obj ) {
        +                    return obj != null ? jQuery.extend( obj, promise ) : promise;
        +                }
        +            },
        +            deferred = {};
        +
        +        // Keep pipe for back-compat
        +        promise.pipe = promise.then;
        +
        +        // Add list-specific methods
        +        jQuery.each( tuples, function( i, tuple ) {
        +            var list = tuple[ 2 ],
        +                stateString = tuple[ 3 ];
        +
        +            // promise[ done | fail | progress ] = list.add
        +            promise[ tuple[1] ] = list.add;
        +
        +            // Handle state
        +            if ( stateString ) {
        +                list.add(function() {
        +                    // state = [ resolved | rejected ]
        +                    state = stateString;
        +
        +                // [ reject_list | resolve_list ].disable; progress_list.lock
        +                }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
        +            }
        +
        +            // deferred[ resolve | reject | notify ]
        +            deferred[ tuple[0] ] = function() {
        +                deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
        +                return this;
        +            };
        +            deferred[ tuple[0] + "With" ] = list.fireWith;
        +        });
        +
        +        // Make the deferred a promise
        +        promise.promise( deferred );
        +
        +        // Call given func if any
        +        if ( func ) {
        +            func.call( deferred, deferred );
        +        }
        +
        +        // All done!
        +        return deferred;
        +    },
        +
        +    // Deferred helper
        +    when: function( subordinate /* , ..., subordinateN */ ) {
        +        var i = 0,
        +            resolveValues = core_slice.call( arguments ),
        +            length = resolveValues.length,
        +
        +            // the count of uncompleted subordinates
        +            remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
        +
        +            // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
        +            deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
        +
        +            // Update function for both resolve and progress values
        +            updateFunc = function( i, contexts, values ) {
        +                return function( value ) {
        +                    contexts[ i ] = this;
        +                    values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
        +                    if( values === progressValues ) {
        +                        deferred.notifyWith( contexts, values );
        +                    } else if ( !( --remaining ) ) {
        +                        deferred.resolveWith( contexts, values );
        +                    }
        +                };
        +            },
        +
        +            progressValues, progressContexts, resolveContexts;
        +
        +        // add listeners to Deferred subordinates; treat others as resolved
        +        if ( length > 1 ) {
        +            progressValues = new Array( length );
        +            progressContexts = new Array( length );
        +            resolveContexts = new Array( length );
        +            for ( ; i < length; i++ ) {
        +                if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
        +                    resolveValues[ i ].promise()
        +                        .done( updateFunc( i, resolveContexts, resolveValues ) )
        +                        .fail( deferred.reject )
        +                        .progress( updateFunc( i, progressContexts, progressValues ) );
        +                } else {
        +                    --remaining;
        +                }
        +            }
        +        }
        +
        +        // if we're not waiting on anything, resolve the master
        +        if ( !remaining ) {
        +            deferred.resolveWith( resolveContexts, resolveValues );
        +        }
        +
        +        return deferred.promise();
        +    }
        +});
        +jQuery.support = (function() {
        +
        +    var support, all, a,
        +        input, select, fragment,
        +        opt, eventName, isSupported, i,
        +        div = document.createElement("div");
        +
        +    // Setup
        +    div.setAttribute( "className", "t" );
        +    div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
        +
        +    // Support tests won't run in some limited or non-browser environments
        +    all = div.getElementsByTagName("*");
        +    a = div.getElementsByTagName("a")[ 0 ];
        +    if ( !all || !a || !all.length ) {
        +        return {};
        +    }
        +
        +    // First batch of tests
        +    select = document.createElement("select");
        +    opt = select.appendChild( document.createElement("option") );
        +    input = div.getElementsByTagName("input")[ 0 ];
        +
        +    a.style.cssText = "top:1px;float:left;opacity:.5";
        +    support = {
        +        // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
        +        getSetAttribute: div.className !== "t",
        +
        +        // IE strips leading whitespace when .innerHTML is used
        +        leadingWhitespace: div.firstChild.nodeType === 3,
        +
        +        // Make sure that tbody elements aren't automatically inserted
        +        // IE will insert them into empty tables
        +        tbody: !div.getElementsByTagName("tbody").length,
        +
        +        // Make sure that link elements get serialized correctly by innerHTML
        +        // This requires a wrapper element in IE
        +        htmlSerialize: !!div.getElementsByTagName("link").length,
        +
        +        // Get the style information from getAttribute
        +        // (IE uses .cssText instead)
        +        style: /top/.test( a.getAttribute("style") ),
        +
        +        // Make sure that URLs aren't manipulated
        +        // (IE normalizes it by default)
        +        hrefNormalized: a.getAttribute("href") === "/a",
        +
        +        // Make sure that element opacity exists
        +        // (IE uses filter instead)
        +        // Use a regex to work around a WebKit issue. See #5145
        +        opacity: /^0.5/.test( a.style.opacity ),
        +
        +        // Verify style float existence
        +        // (IE uses styleFloat instead of cssFloat)
        +        cssFloat: !!a.style.cssFloat,
        +
        +        // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
        +        checkOn: !!input.value,
        +
        +        // Make sure that a selected-by-default option has a working selected property.
        +        // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
        +        optSelected: opt.selected,
        +
        +        // Tests for enctype support on a form (#6743)
        +        enctype: !!document.createElement("form").enctype,
        +
        +        // Makes sure cloning an html5 element does not cause problems
        +        // Where outerHTML is undefined, this still works
        +        html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
        +
        +        // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
        +        boxModel: document.compatMode === "CSS1Compat",
        +
        +        // Will be defined later
        +        deleteExpando: true,
        +        noCloneEvent: true,
        +        inlineBlockNeedsLayout: false,
        +        shrinkWrapBlocks: false,
        +        reliableMarginRight: true,
        +        boxSizingReliable: true,
        +        pixelPosition: false
        +    };
        +
        +    // Make sure checked status is properly cloned
        +    input.checked = true;
        +    support.noCloneChecked = input.cloneNode( true ).checked;
        +
        +    // Make sure that the options inside disabled selects aren't marked as disabled
        +    // (WebKit marks them as disabled)
        +    select.disabled = true;
        +    support.optDisabled = !opt.disabled;
        +
        +    // Support: IE<9
        +    try {
        +        delete div.test;
        +    } catch( e ) {
        +        support.deleteExpando = false;
        +    }
        +
        +    // Check if we can trust getAttribute("value")
        +    input = document.createElement("input");
        +    input.setAttribute( "value", "" );
        +    support.input = input.getAttribute( "value" ) === "";
        +
        +    // Check if an input maintains its value after becoming a radio
        +    input.value = "t";
        +    input.setAttribute( "type", "radio" );
        +    support.radioValue = input.value === "t";
        +
        +    // #11217 - WebKit loses check when the name is after the checked attribute
        +    input.setAttribute( "checked", "t" );
        +    input.setAttribute( "name", "t" );
        +
        +    fragment = document.createDocumentFragment();
        +    fragment.appendChild( input );
        +
        +    // Check if a disconnected checkbox will retain its checked
        +    // value of true after appended to the DOM (IE6/7)
        +    support.appendChecked = input.checked;
        +
        +    // WebKit doesn't clone checked state correctly in fragments
        +    support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
        +
        +    // Support: IE<9
        +    // Opera does not clone events (and typeof div.attachEvent === undefined).
        +    // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
        +    if ( div.attachEvent ) {
        +        div.attachEvent( "onclick", function() {
        +            support.noCloneEvent = false;
        +        });
        +
        +        div.cloneNode( true ).click();
        +    }
        +
        +    // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
        +    // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
        +    for ( i in { submit: true, change: true, focusin: true }) {
        +        div.setAttribute( eventName = "on" + i, "t" );
        +
        +        support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
        +    }
        +
        +    div.style.backgroundClip = "content-box";
        +    div.cloneNode( true ).style.backgroundClip = "";
        +    support.clearCloneStyle = div.style.backgroundClip === "content-box";
        +
        +    // Run tests that need a body at doc ready
        +    jQuery(function() {
        +        var container, marginDiv, tds,
        +            divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
        +            body = document.getElementsByTagName("body")[0];
        +
        +        if ( !body ) {
        +            // Return for frameset docs that don't have a body
        +            return;
        +        }
        +
        +        container = document.createElement("div");
        +        container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
        +
        +        body.appendChild( container ).appendChild( div );
        +
        +        // Support: IE8
        +        // Check if table cells still have offsetWidth/Height when they are set
        +        // to display:none and there are still other visible table cells in a
        +        // table row; if so, offsetWidth/Height are not reliable for use when
        +        // determining if an element has been hidden directly using
        +        // display:none (it is still safe to use offsets if a parent element is
        +        // hidden; don safety goggles and see bug #4512 for more information).
        +        div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
        +        tds = div.getElementsByTagName("td");
        +        tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
        +        isSupported = ( tds[ 0 ].offsetHeight === 0 );
        +
        +        tds[ 0 ].style.display = "";
        +        tds[ 1 ].style.display = "none";
        +
        +        // Support: IE8
        +        // Check if empty table cells still have offsetWidth/Height
        +        support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
        +
        +        // Check box-sizing and margin behavior
        +        div.innerHTML = "";
        +        div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
        +        support.boxSizing = ( div.offsetWidth === 4 );
        +        support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
        +
        +        // Use window.getComputedStyle because jsdom on node.js will break without it.
        +        if ( window.getComputedStyle ) {
        +            support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
        +            support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
        +
        +            // Check if div with explicit width and no margin-right incorrectly
        +            // gets computed margin-right based on width of container. (#3333)
        +            // Fails in WebKit before Feb 2011 nightlies
        +            // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +            marginDiv = div.appendChild( document.createElement("div") );
        +            marginDiv.style.cssText = div.style.cssText = divReset;
        +            marginDiv.style.marginRight = marginDiv.style.width = "0";
        +            div.style.width = "1px";
        +
        +            support.reliableMarginRight =
        +                !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
        +        }
        +
        +        if ( typeof div.style.zoom !== core_strundefined ) {
        +            // Support: IE<8
        +            // Check if natively block-level elements act like inline-block
        +            // elements when setting their display to 'inline' and giving
        +            // them layout
        +            div.innerHTML = "";
        +            div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
        +            support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
        +
        +            // Support: IE6
        +            // Check if elements with layout shrink-wrap their children
        +            div.style.display = "block";
        +            div.innerHTML = "<div></div>";
        +            div.firstChild.style.width = "5px";
        +            support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
        +
        +            if ( support.inlineBlockNeedsLayout ) {
        +                // Prevent IE 6 from affecting layout for positioned elements #11048
        +                // Prevent IE from shrinking the body in IE 7 mode #12869
        +                // Support: IE<8
        +                body.style.zoom = 1;
        +            }
        +        }
        +
        +        body.removeChild( container );
        +
        +        // Null elements to avoid leaks in IE
        +        container = div = tds = marginDiv = null;
        +    });
        +
        +    // Null elements to avoid leaks in IE
        +    all = select = fragment = opt = a = input = null;
        +
        +    return support;
        +})();
        +
        +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
        +    rmultiDash = /([A-Z])/g;
        +
        +function internalData( elem, name, data, pvt /* Internal Use Only */ ){
        +    if ( !jQuery.acceptData( elem ) ) {
        +        return;
        +    }
        +
        +    var thisCache, ret,
        +        internalKey = jQuery.expando,
        +        getByName = typeof name === "string",
        +
        +        // We have to handle DOM nodes and JS objects differently because IE6-7
        +        // can't GC object references properly across the DOM-JS boundary
        +        isNode = elem.nodeType,
        +
        +        // Only DOM nodes need the global jQuery cache; JS object data is
        +        // attached directly to the object so GC can occur automatically
        +        cache = isNode ? jQuery.cache : elem,
        +
        +        // Only defining an ID for JS objects if its cache already exists allows
        +        // the code to shortcut on the same path as a DOM node with no cache
        +        id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
        +
        +    // Avoid doing any more work than we need to when trying to get data on an
        +    // object that has no data at all
        +    if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
        +        return;
        +    }
        +
        +    if ( !id ) {
        +        // Only DOM nodes need a new unique ID for each element since their data
        +        // ends up in the global cache
        +        if ( isNode ) {
        +            elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
        +        } else {
        +            id = internalKey;
        +        }
        +    }
        +
        +    if ( !cache[ id ] ) {
        +        cache[ id ] = {};
        +
        +        // Avoids exposing jQuery metadata on plain JS objects when the object
        +        // is serialized using JSON.stringify
        +        if ( !isNode ) {
        +            cache[ id ].toJSON = jQuery.noop;
        +        }
        +    }
        +
        +    // An object can be passed to jQuery.data instead of a key/value pair; this gets
        +    // shallow copied over onto the existing cache
        +    if ( typeof name === "object" || typeof name === "function" ) {
        +        if ( pvt ) {
        +            cache[ id ] = jQuery.extend( cache[ id ], name );
        +        } else {
        +            cache[ id ].data = jQuery.extend( cache[ id ].data, name );
        +        }
        +    }
        +
        +    thisCache = cache[ id ];
        +
        +    // jQuery data() is stored in a separate object inside the object's internal data
        +    // cache in order to avoid key collisions between internal data and user-defined
        +    // data.
        +    if ( !pvt ) {
        +        if ( !thisCache.data ) {
        +            thisCache.data = {};
        +        }
        +
        +        thisCache = thisCache.data;
        +    }
        +
        +    if ( data !== undefined ) {
        +        thisCache[ jQuery.camelCase( name ) ] = data;
        +    }
        +
        +    // Check for both converted-to-camel and non-converted data property names
        +    // If a data property was specified
        +    if ( getByName ) {
        +
        +        // First Try to find as-is property data
        +        ret = thisCache[ name ];
        +
        +        // Test for null|undefined property data
        +        if ( ret == null ) {
        +
        +            // Try to find the camelCased property
        +            ret = thisCache[ jQuery.camelCase( name ) ];
        +        }
        +    } else {
        +        ret = thisCache;
        +    }
        +
        +    return ret;
        +}
        +
        +function internalRemoveData( elem, name, pvt ) {
        +    if ( !jQuery.acceptData( elem ) ) {
        +        return;
        +    }
        +
        +    var i, l, thisCache,
        +        isNode = elem.nodeType,
        +
        +        // See jQuery.data for more information
        +        cache = isNode ? jQuery.cache : elem,
        +        id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
        +
        +    // If there is already no cache entry for this object, there is no
        +    // purpose in continuing
        +    if ( !cache[ id ] ) {
        +        return;
        +    }
        +
        +    if ( name ) {
        +
        +        thisCache = pvt ? cache[ id ] : cache[ id ].data;
        +
        +        if ( thisCache ) {
        +
        +            // Support array or space separated string names for data keys
        +            if ( !jQuery.isArray( name ) ) {
        +
        +                // try the string as a key before any manipulation
        +                if ( name in thisCache ) {
        +                    name = [ name ];
        +                } else {
        +
        +                    // split the camel cased version by spaces unless a key with the spaces exists
        +                    name = jQuery.camelCase( name );
        +                    if ( name in thisCache ) {
        +                        name = [ name ];
        +                    } else {
        +                        name = name.split(" ");
        +                    }
        +                }
        +            } else {
        +                // If "name" is an array of keys...
        +                // When data is initially created, via ("key", "val") signature,
        +                // keys will be converted to camelCase.
        +                // Since there is no way to tell _how_ a key was added, remove
        +                // both plain key and camelCase key. #12786
        +                // This will only penalize the array argument path.
        +                name = name.concat( jQuery.map( name, jQuery.camelCase ) );
        +            }
        +
        +            for ( i = 0, l = name.length; i < l; i++ ) {
        +                delete thisCache[ name[i] ];
        +            }
        +
        +            // If there is no data left in the cache, we want to continue
        +            // and let the cache object itself get destroyed
        +            if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
        +                return;
        +            }
        +        }
        +    }
        +
        +    // See jQuery.data for more information
        +    if ( !pvt ) {
        +        delete cache[ id ].data;
        +
        +        // Don't destroy the parent cache unless the internal data object
        +        // had been the only thing left in it
        +        if ( !isEmptyDataObject( cache[ id ] ) ) {
        +            return;
        +        }
        +    }
        +
        +    // Destroy the cache
        +    if ( isNode ) {
        +        jQuery.cleanData( [ elem ], true );
        +
        +    // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
        +    } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
        +        delete cache[ id ];
        +
        +    // When all else fails, null
        +    } else {
        +        cache[ id ] = null;
        +    }
        +}
        +
        +jQuery.extend({
        +    cache: {},
        +
        +    // Unique for each copy of jQuery on the page
        +    // Non-digits removed to match rinlinejQuery
        +    expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
        +
        +    // The following elements throw uncatchable exceptions if you
        +    // attempt to add expando properties to them.
        +    noData: {
        +        "embed": true,
        +        // Ban all objects except for Flash (which handle expandos)
        +        "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
        +        "applet": true
        +    },
        +
        +    hasData: function( elem ) {
        +        elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
        +        return !!elem && !isEmptyDataObject( elem );
        +    },
        +
        +    data: function( elem, name, data ) {
        +        return internalData( elem, name, data );
        +    },
        +
        +    removeData: function( elem, name ) {
        +        return internalRemoveData( elem, name );
        +    },
        +
        +    // For internal use only.
        +    _data: function( elem, name, data ) {
        +        return internalData( elem, name, data, true );
        +    },
        +
        +    _removeData: function( elem, name ) {
        +        return internalRemoveData( elem, name, true );
        +    },
        +
        +    // A method for determining if a DOM node can handle the data expando
        +    acceptData: function( elem ) {
        +        // Do not set data on non-element because it will not be cleared (#8335).
        +        if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
        +            return false;
        +        }
        +
        +        var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
        +
        +        // nodes accept data unless otherwise specified; rejection can be conditional
        +        return !noData || noData !== true && elem.getAttribute("classid") === noData;
        +    }
        +});
        +
        +jQuery.fn.extend({
        +    data: function( key, value ) {
        +        var attrs, name,
        +            elem = this[0],
        +            i = 0,
        +            data = null;
        +
        +        // Gets all values
        +        if ( key === undefined ) {
        +            if ( this.length ) {
        +                data = jQuery.data( elem );
        +
        +                if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
        +                    attrs = elem.attributes;
        +                    for ( ; i < attrs.length; i++ ) {
        +                        name = attrs[i].name;
        +
        +                        if ( !name.indexOf( "data-" ) ) {
        +                            name = jQuery.camelCase( name.slice(5) );
        +
        +                            dataAttr( elem, name, data[ name ] );
        +                        }
        +                    }
        +                    jQuery._data( elem, "parsedAttrs", true );
        +                }
        +            }
        +
        +            return data;
        +        }
        +
        +        // Sets multiple values
        +        if ( typeof key === "object" ) {
        +            return this.each(function() {
        +                jQuery.data( this, key );
        +            });
        +        }
        +
        +        return jQuery.access( this, function( value ) {
        +
        +            if ( value === undefined ) {
        +                // Try to fetch any internally stored data first
        +                return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
        +            }
        +
        +            this.each(function() {
        +                jQuery.data( this, key, value );
        +            });
        +        }, null, value, arguments.length > 1, null, true );
        +    },
        +
        +    removeData: function( key ) {
        +        return this.each(function() {
        +            jQuery.removeData( this, key );
        +        });
        +    }
        +});
        +
        +function dataAttr( elem, key, data ) {
        +    // If nothing was found internally, try to fetch any
        +    // data from the HTML5 data-* attribute
        +    if ( data === undefined && elem.nodeType === 1 ) {
        +
        +        var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
        +
        +        data = elem.getAttribute( name );
        +
        +        if ( typeof data === "string" ) {
        +            try {
        +                data = data === "true" ? true :
        +                    data === "false" ? false :
        +                    data === "null" ? null :
        +                    // Only convert to a number if it doesn't change the string
        +                    +data + "" === data ? +data :
        +                    rbrace.test( data ) ? jQuery.parseJSON( data ) :
        +                        data;
        +            } catch( e ) {}
        +
        +            // Make sure we set the data so it isn't changed later
        +            jQuery.data( elem, key, data );
        +
        +        } else {
        +            data = undefined;
        +        }
        +    }
        +
        +    return data;
        +}
        +
        +// checks a cache object for emptiness
        +function isEmptyDataObject( obj ) {
        +    var name;
        +    for ( name in obj ) {
        +
        +        // if the public data object is empty, the private is still empty
        +        if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
        +            continue;
        +        }
        +        if ( name !== "toJSON" ) {
        +            return false;
        +        }
        +    }
        +
        +    return true;
        +}
        +jQuery.extend({
        +    queue: function( elem, type, data ) {
        +        var queue;
        +
        +        if ( elem ) {
        +            type = ( type || "fx" ) + "queue";
        +            queue = jQuery._data( elem, type );
        +
        +            // Speed up dequeue by getting out quickly if this is just a lookup
        +            if ( data ) {
        +                if ( !queue || jQuery.isArray(data) ) {
        +                    queue = jQuery._data( elem, type, jQuery.makeArray(data) );
        +                } else {
        +                    queue.push( data );
        +                }
        +            }
        +            return queue || [];
        +        }
        +    },
        +
        +    dequeue: function( elem, type ) {
        +        type = type || "fx";
        +
        +        var queue = jQuery.queue( elem, type ),
        +            startLength = queue.length,
        +            fn = queue.shift(),
        +            hooks = jQuery._queueHooks( elem, type ),
        +            next = function() {
        +                jQuery.dequeue( elem, type );
        +            };
        +
        +        // If the fx queue is dequeued, always remove the progress sentinel
        +        if ( fn === "inprogress" ) {
        +            fn = queue.shift();
        +            startLength--;
        +        }
        +
        +        hooks.cur = fn;
        +        if ( fn ) {
        +
        +            // Add a progress sentinel to prevent the fx queue from being
        +            // automatically dequeued
        +            if ( type === "fx" ) {
        +                queue.unshift( "inprogress" );
        +            }
        +
        +            // clear up the last queue stop function
        +            delete hooks.stop;
        +            fn.call( elem, next, hooks );
        +        }
        +
        +        if ( !startLength && hooks ) {
        +            hooks.empty.fire();
        +        }
        +    },
        +
        +    // not intended for public consumption - generates a queueHooks object, or returns the current one
        +    _queueHooks: function( elem, type ) {
        +        var key = type + "queueHooks";
        +        return jQuery._data( elem, key ) || jQuery._data( elem, key, {
        +            empty: jQuery.Callbacks("once memory").add(function() {
        +                jQuery._removeData( elem, type + "queue" );
        +                jQuery._removeData( elem, key );
        +            })
        +        });
        +    }
        +});
        +
        +jQuery.fn.extend({
        +    queue: function( type, data ) {
        +        var setter = 2;
        +
        +        if ( typeof type !== "string" ) {
        +            data = type;
        +            type = "fx";
        +            setter--;
        +        }
        +
        +        if ( arguments.length < setter ) {
        +            return jQuery.queue( this[0], type );
        +        }
        +
        +        return data === undefined ?
        +            this :
        +            this.each(function() {
        +                var queue = jQuery.queue( this, type, data );
        +
        +                // ensure a hooks for this queue
        +                jQuery._queueHooks( this, type );
        +
        +                if ( type === "fx" && queue[0] !== "inprogress" ) {
        +                    jQuery.dequeue( this, type );
        +                }
        +            });
        +    },
        +    dequeue: function( type ) {
        +        return this.each(function() {
        +            jQuery.dequeue( this, type );
        +        });
        +    },
        +    // Based off of the plugin by Clint Helfers, with permission.
        +    // http://blindsignals.com/index.php/2009/07/jquery-delay/
        +    delay: function( time, type ) {
        +        time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
        +        type = type || "fx";
        +
        +        return this.queue( type, function( next, hooks ) {
        +            var timeout = setTimeout( next, time );
        +            hooks.stop = function() {
        +                clearTimeout( timeout );
        +            };
        +        });
        +    },
        +    clearQueue: function( type ) {
        +        return this.queue( type || "fx", [] );
        +    },
        +    // Get a promise resolved when queues of a certain type
        +    // are emptied (fx is the type by default)
        +    promise: function( type, obj ) {
        +        var tmp,
        +            count = 1,
        +            defer = jQuery.Deferred(),
        +            elements = this,
        +            i = this.length,
        +            resolve = function() {
        +                if ( !( --count ) ) {
        +                    defer.resolveWith( elements, [ elements ] );
        +                }
        +            };
        +
        +        if ( typeof type !== "string" ) {
        +            obj = type;
        +            type = undefined;
        +        }
        +        type = type || "fx";
        +
        +        while( i-- ) {
        +            tmp = jQuery._data( elements[ i ], type + "queueHooks" );
        +            if ( tmp && tmp.empty ) {
        +                count++;
        +                tmp.empty.add( resolve );
        +            }
        +        }
        +        resolve();
        +        return defer.promise( obj );
        +    }
        +});
        +var nodeHook, boolHook,
        +    rclass = /[\t\r\n]/g,
        +    rreturn = /\r/g,
        +    rfocusable = /^(?:input|select|textarea|button|object)$/i,
        +    rclickable = /^(?:a|area)$/i,
        +    rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
        +    ruseDefault = /^(?:checked|selected)$/i,
        +    getSetAttribute = jQuery.support.getSetAttribute,
        +    getSetInput = jQuery.support.input;
        +
        +jQuery.fn.extend({
        +    attr: function( name, value ) {
        +        return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
        +    },
        +
        +    removeAttr: function( name ) {
        +        return this.each(function() {
        +            jQuery.removeAttr( this, name );
        +        });
        +    },
        +
        +    prop: function( name, value ) {
        +        return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
        +    },
        +
        +    removeProp: function( name ) {
        +        name = jQuery.propFix[ name ] || name;
        +        return this.each(function() {
        +            // try/catch handles cases where IE balks (such as removing a property on window)
        +            try {
        +                this[ name ] = undefined;
        +                delete this[ name ];
        +            } catch( e ) {}
        +        });
        +    },
        +
        +    addClass: function( value ) {
        +        var classes, elem, cur, clazz, j,
        +            i = 0,
        +            len = this.length,
        +            proceed = typeof value === "string" && value;
        +
        +        if ( jQuery.isFunction( value ) ) {
        +            return this.each(function( j ) {
        +                jQuery( this ).addClass( value.call( this, j, this.className ) );
        +            });
        +        }
        +
        +        if ( proceed ) {
        +            // The disjunction here is for better compressibility (see removeClass)
        +            classes = ( value || "" ).match( core_rnotwhite ) || [];
        +
        +            for ( ; i < len; i++ ) {
        +                elem = this[ i ];
        +                cur = elem.nodeType === 1 && ( elem.className ?
        +                    ( " " + elem.className + " " ).replace( rclass, " " ) :
        +                    " "
        +                );
        +
        +                if ( cur ) {
        +                    j = 0;
        +                    while ( (clazz = classes[j++]) ) {
        +                        if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
        +                            cur += clazz + " ";
        +                        }
        +                    }
        +                    elem.className = jQuery.trim( cur );
        +
        +                }
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    removeClass: function( value ) {
        +        var classes, elem, cur, clazz, j,
        +            i = 0,
        +            len = this.length,
        +            proceed = arguments.length === 0 || typeof value === "string" && value;
        +
        +        if ( jQuery.isFunction( value ) ) {
        +            return this.each(function( j ) {
        +                jQuery( this ).removeClass( value.call( this, j, this.className ) );
        +            });
        +        }
        +        if ( proceed ) {
        +            classes = ( value || "" ).match( core_rnotwhite ) || [];
        +
        +            for ( ; i < len; i++ ) {
        +                elem = this[ i ];
        +                // This expression is here for better compressibility (see addClass)
        +                cur = elem.nodeType === 1 && ( elem.className ?
        +                    ( " " + elem.className + " " ).replace( rclass, " " ) :
        +                    ""
        +                );
        +
        +                if ( cur ) {
        +                    j = 0;
        +                    while ( (clazz = classes[j++]) ) {
        +                        // Remove *all* instances
        +                        while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
        +                            cur = cur.replace( " " + clazz + " ", " " );
        +                        }
        +                    }
        +                    elem.className = value ? jQuery.trim( cur ) : "";
        +                }
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    toggleClass: function( value, stateVal ) {
        +        var type = typeof value,
        +            isBool = typeof stateVal === "boolean";
        +
        +        if ( jQuery.isFunction( value ) ) {
        +            return this.each(function( i ) {
        +                jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
        +            });
        +        }
        +
        +        return this.each(function() {
        +            if ( type === "string" ) {
        +                // toggle individual class names
        +                var className,
        +                    i = 0,
        +                    self = jQuery( this ),
        +                    state = stateVal,
        +                    classNames = value.match( core_rnotwhite ) || [];
        +
        +                while ( (className = classNames[ i++ ]) ) {
        +                    // check each className given, space separated list
        +                    state = isBool ? state : !self.hasClass( className );
        +                    self[ state ? "addClass" : "removeClass" ]( className );
        +                }
        +
        +            // Toggle whole class name
        +            } else if ( type === core_strundefined || type === "boolean" ) {
        +                if ( this.className ) {
        +                    // store className if set
        +                    jQuery._data( this, "__className__", this.className );
        +                }
        +
        +                // If the element has a class name or if we're passed "false",
        +                // then remove the whole classname (if there was one, the above saved it).
        +                // Otherwise bring back whatever was previously saved (if anything),
        +                // falling back to the empty string if nothing was stored.
        +                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
        +            }
        +        });
        +    },
        +
        +    hasClass: function( selector ) {
        +        var className = " " + selector + " ",
        +            i = 0,
        +            l = this.length;
        +        for ( ; i < l; i++ ) {
        +            if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
        +                return true;
        +            }
        +        }
        +
        +        return false;
        +    },
        +
        +    val: function( value ) {
        +        var ret, hooks, isFunction,
        +            elem = this[0];
        +
        +        if ( !arguments.length ) {
        +            if ( elem ) {
        +                hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
        +
        +                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
        +                    return ret;
        +                }
        +
        +                ret = elem.value;
        +
        +                return typeof ret === "string" ?
        +                    // handle most common string cases
        +                    ret.replace(rreturn, "") :
        +                    // handle cases where value is null/undef or number
        +                    ret == null ? "" : ret;
        +            }
        +
        +            return;
        +        }
        +
        +        isFunction = jQuery.isFunction( value );
        +
        +        return this.each(function( i ) {
        +            var val,
        +                self = jQuery(this);
        +
        +            if ( this.nodeType !== 1 ) {
        +                return;
        +            }
        +
        +            if ( isFunction ) {
        +                val = value.call( this, i, self.val() );
        +            } else {
        +                val = value;
        +            }
        +
        +            // Treat null/undefined as ""; convert numbers to string
        +            if ( val == null ) {
        +                val = "";
        +            } else if ( typeof val === "number" ) {
        +                val += "";
        +            } else if ( jQuery.isArray( val ) ) {
        +                val = jQuery.map(val, function ( value ) {
        +                    return value == null ? "" : value + "";
        +                });
        +            }
        +
        +            hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
        +
        +            // If set returns undefined, fall back to normal setting
        +            if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
        +                this.value = val;
        +            }
        +        });
        +    }
        +});
        +
        +jQuery.extend({
        +    valHooks: {
        +        option: {
        +            get: function( elem ) {
        +                // attributes.value is undefined in Blackberry 4.7 but
        +                // uses .value. See #6932
        +                var val = elem.attributes.value;
        +                return !val || val.specified ? elem.value : elem.text;
        +            }
        +        },
        +        select: {
        +            get: function( elem ) {
        +                var value, option,
        +                    options = elem.options,
        +                    index = elem.selectedIndex,
        +                    one = elem.type === "select-one" || index < 0,
        +                    values = one ? null : [],
        +                    max = one ? index + 1 : options.length,
        +                    i = index < 0 ?
        +                        max :
        +                        one ? index : 0;
        +
        +                // Loop through all the selected options
        +                for ( ; i < max; i++ ) {
        +                    option = options[ i ];
        +
        +                    // oldIE doesn't update selected after form reset (#2551)
        +                    if ( ( option.selected || i === index ) &&
        +                            // Don't return options that are disabled or in a disabled optgroup
        +                            ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
        +                            ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
        +
        +                        // Get the specific value for the option
        +                        value = jQuery( option ).val();
        +
        +                        // We don't need an array for one selects
        +                        if ( one ) {
        +                            return value;
        +                        }
        +
        +                        // Multi-Selects return an array
        +                        values.push( value );
        +                    }
        +                }
        +
        +                return values;
        +            },
        +
        +            set: function( elem, value ) {
        +                var values = jQuery.makeArray( value );
        +
        +                jQuery(elem).find("option").each(function() {
        +                    this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
        +                });
        +
        +                if ( !values.length ) {
        +                    elem.selectedIndex = -1;
        +                }
        +                return values;
        +            }
        +        }
        +    },
        +
        +    attr: function( elem, name, value ) {
        +        var hooks, notxml, ret,
        +            nType = elem.nodeType;
        +
        +        // don't get/set attributes on text, comment and attribute nodes
        +        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +            return;
        +        }
        +
        +        // Fallback to prop when attributes are not supported
        +        if ( typeof elem.getAttribute === core_strundefined ) {
        +            return jQuery.prop( elem, name, value );
        +        }
        +
        +        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
        +
        +        // All attributes are lowercase
        +        // Grab necessary hook if one is defined
        +        if ( notxml ) {
        +            name = name.toLowerCase();
        +            hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
        +        }
        +
        +        if ( value !== undefined ) {
        +
        +            if ( value === null ) {
        +                jQuery.removeAttr( elem, name );
        +
        +            } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
        +                return ret;
        +
        +            } else {
        +                elem.setAttribute( name, value + "" );
        +                return value;
        +            }
        +
        +        } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
        +            return ret;
        +
        +        } else {
        +
        +            // In IE9+, Flash objects don't have .getAttribute (#12945)
        +            // Support: IE9+
        +            if ( typeof elem.getAttribute !== core_strundefined ) {
        +                ret =  elem.getAttribute( name );
        +            }
        +
        +            // Non-existent attributes return null, we normalize to undefined
        +            return ret == null ?
        +                undefined :
        +                ret;
        +        }
        +    },
        +
        +    removeAttr: function( elem, value ) {
        +        var name, propName,
        +            i = 0,
        +            attrNames = value && value.match( core_rnotwhite );
        +
        +        if ( attrNames && elem.nodeType === 1 ) {
        +            while ( (name = attrNames[i++]) ) {
        +                propName = jQuery.propFix[ name ] || name;
        +
        +                // Boolean attributes get special treatment (#10870)
        +                if ( rboolean.test( name ) ) {
        +                    // Set corresponding property to false for boolean attributes
        +                    // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
        +                    if ( !getSetAttribute && ruseDefault.test( name ) ) {
        +                        elem[ jQuery.camelCase( "default-" + name ) ] =
        +                            elem[ propName ] = false;
        +                    } else {
        +                        elem[ propName ] = false;
        +                    }
        +
        +                // See #9699 for explanation of this approach (setting first, then removal)
        +                } else {
        +                    jQuery.attr( elem, name, "" );
        +                }
        +
        +                elem.removeAttribute( getSetAttribute ? name : propName );
        +            }
        +        }
        +    },
        +
        +    attrHooks: {
        +        type: {
        +            set: function( elem, value ) {
        +                if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
        +                    // Setting the type on a radio button after the value resets the value in IE6-9
        +                    // Reset value to default in case type is set after value during creation
        +                    var val = elem.value;
        +                    elem.setAttribute( "type", value );
        +                    if ( val ) {
        +                        elem.value = val;
        +                    }
        +                    return value;
        +                }
        +            }
        +        }
        +    },
        +
        +    propFix: {
        +        tabindex: "tabIndex",
        +        readonly: "readOnly",
        +        "for": "htmlFor",
        +        "class": "className",
        +        maxlength: "maxLength",
        +        cellspacing: "cellSpacing",
        +        cellpadding: "cellPadding",
        +        rowspan: "rowSpan",
        +        colspan: "colSpan",
        +        usemap: "useMap",
        +        frameborder: "frameBorder",
        +        contenteditable: "contentEditable"
        +    },
        +
        +    prop: function( elem, name, value ) {
        +        var ret, hooks, notxml,
        +            nType = elem.nodeType;
        +
        +        // don't get/set properties on text, comment and attribute nodes
        +        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
        +            return;
        +        }
        +
        +        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
        +
        +        if ( notxml ) {
        +            // Fix name and attach hooks
        +            name = jQuery.propFix[ name ] || name;
        +            hooks = jQuery.propHooks[ name ];
        +        }
        +
        +        if ( value !== undefined ) {
        +            if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
        +                return ret;
        +
        +            } else {
        +                return ( elem[ name ] = value );
        +            }
        +
        +        } else {
        +            if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
        +                return ret;
        +
        +            } else {
        +                return elem[ name ];
        +            }
        +        }
        +    },
        +
        +    propHooks: {
        +        tabIndex: {
        +            get: function( elem ) {
        +                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
        +                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
        +                var attributeNode = elem.getAttributeNode("tabindex");
        +
        +                return attributeNode && attributeNode.specified ?
        +                    parseInt( attributeNode.value, 10 ) :
        +                    rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
        +                        0 :
        +                        undefined;
        +            }
        +        }
        +    }
        +});
        +
        +// Hook for boolean attributes
        +boolHook = {
        +    get: function( elem, name ) {
        +        var
        +            // Use .prop to determine if this attribute is understood as boolean
        +            prop = jQuery.prop( elem, name ),
        +
        +            // Fetch it accordingly
        +            attr = typeof prop === "boolean" && elem.getAttribute( name ),
        +            detail = typeof prop === "boolean" ?
        +
        +                getSetInput && getSetAttribute ?
        +                    attr != null :
        +                    // oldIE fabricates an empty string for missing boolean attributes
        +                    // and conflates checked/selected into attroperties
        +                    ruseDefault.test( name ) ?
        +                        elem[ jQuery.camelCase( "default-" + name ) ] :
        +                        !!attr :
        +
        +                // fetch an attribute node for properties not recognized as boolean
        +                elem.getAttributeNode( name );
        +
        +        return detail && detail.value !== false ?
        +            name.toLowerCase() :
        +            undefined;
        +    },
        +    set: function( elem, value, name ) {
        +        if ( value === false ) {
        +            // Remove boolean attributes when set to false
        +            jQuery.removeAttr( elem, name );
        +        } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
        +            // IE<8 needs the *property* name
        +            elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
        +
        +        // Use defaultChecked and defaultSelected for oldIE
        +        } else {
        +            elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
        +        }
        +
        +        return name;
        +    }
        +};
        +
        +// fix oldIE value attroperty
        +if ( !getSetInput || !getSetAttribute ) {
        +    jQuery.attrHooks.value = {
        +        get: function( elem, name ) {
        +            var ret = elem.getAttributeNode( name );
        +            return jQuery.nodeName( elem, "input" ) ?
        +
        +                // Ignore the value *property* by using defaultValue
        +                elem.defaultValue :
        +
        +                ret && ret.specified ? ret.value : undefined;
        +        },
        +        set: function( elem, value, name ) {
        +            if ( jQuery.nodeName( elem, "input" ) ) {
        +                // Does not return so that setAttribute is also used
        +                elem.defaultValue = value;
        +            } else {
        +                // Use nodeHook if defined (#1954); otherwise setAttribute is fine
        +                return nodeHook && nodeHook.set( elem, value, name );
        +            }
        +        }
        +    };
        +}
        +
        +// IE6/7 do not support getting/setting some attributes with get/setAttribute
        +if ( !getSetAttribute ) {
        +
        +    // Use this for any attribute in IE6/7
        +    // This fixes almost every IE6/7 issue
        +    nodeHook = jQuery.valHooks.button = {
        +        get: function( elem, name ) {
        +            var ret = elem.getAttributeNode( name );
        +            return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
        +                ret.value :
        +                undefined;
        +        },
        +        set: function( elem, value, name ) {
        +            // Set the existing or create a new attribute node
        +            var ret = elem.getAttributeNode( name );
        +            if ( !ret ) {
        +                elem.setAttributeNode(
        +                    (ret = elem.ownerDocument.createAttribute( name ))
        +                );
        +            }
        +
        +            ret.value = value += "";
        +
        +            // Break association with cloned elements by also using setAttribute (#9646)
        +            return name === "value" || value === elem.getAttribute( name ) ?
        +                value :
        +                undefined;
        +        }
        +    };
        +
        +    // Set contenteditable to false on removals(#10429)
        +    // Setting to empty string throws an error as an invalid value
        +    jQuery.attrHooks.contenteditable = {
        +        get: nodeHook.get,
        +        set: function( elem, value, name ) {
        +            nodeHook.set( elem, value === "" ? false : value, name );
        +        }
        +    };
        +
        +    // Set width and height to auto instead of 0 on empty string( Bug #8150 )
        +    // This is for removals
        +    jQuery.each([ "width", "height" ], function( i, name ) {
        +        jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
        +            set: function( elem, value ) {
        +                if ( value === "" ) {
        +                    elem.setAttribute( name, "auto" );
        +                    return value;
        +                }
        +            }
        +        });
        +    });
        +}
        +
        +
        +// Some attributes require a special call on IE
        +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
        +if ( !jQuery.support.hrefNormalized ) {
        +    jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
        +        jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
        +            get: function( elem ) {
        +                var ret = elem.getAttribute( name, 2 );
        +                return ret == null ? undefined : ret;
        +            }
        +        });
        +    });
        +
        +    // href/src property should get the full normalized URL (#10299/#12915)
        +    jQuery.each([ "href", "src" ], function( i, name ) {
        +        jQuery.propHooks[ name ] = {
        +            get: function( elem ) {
        +                return elem.getAttribute( name, 4 );
        +            }
        +        };
        +    });
        +}
        +
        +if ( !jQuery.support.style ) {
        +    jQuery.attrHooks.style = {
        +        get: function( elem ) {
        +            // Return undefined in the case of empty string
        +            // Note: IE uppercases css property names, but if we were to .toLowerCase()
        +            // .cssText, that would destroy case senstitivity in URL's, like in "background"
        +            return elem.style.cssText || undefined;
        +        },
        +        set: function( elem, value ) {
        +            return ( elem.style.cssText = value + "" );
        +        }
        +    };
        +}
        +
        +// Safari mis-reports the default selected property of an option
        +// Accessing the parent's selectedIndex property fixes it
        +if ( !jQuery.support.optSelected ) {
        +    jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
        +        get: function( elem ) {
        +            var parent = elem.parentNode;
        +
        +            if ( parent ) {
        +                parent.selectedIndex;
        +
        +                // Make sure that it also works with optgroups, see #5701
        +                if ( parent.parentNode ) {
        +                    parent.parentNode.selectedIndex;
        +                }
        +            }
        +            return null;
        +        }
        +    });
        +}
        +
        +// IE6/7 call enctype encoding
        +if ( !jQuery.support.enctype ) {
        +    jQuery.propFix.enctype = "encoding";
        +}
        +
        +// Radios and checkboxes getter/setter
        +if ( !jQuery.support.checkOn ) {
        +    jQuery.each([ "radio", "checkbox" ], function() {
        +        jQuery.valHooks[ this ] = {
        +            get: function( elem ) {
        +                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
        +                return elem.getAttribute("value") === null ? "on" : elem.value;
        +            }
        +        };
        +    });
        +}
        +jQuery.each([ "radio", "checkbox" ], function() {
        +    jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
        +        set: function( elem, value ) {
        +            if ( jQuery.isArray( value ) ) {
        +                return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
        +            }
        +        }
        +    });
        +});
        +var rformElems = /^(?:input|select|textarea)$/i,
        +    rkeyEvent = /^key/,
        +    rmouseEvent = /^(?:mouse|contextmenu)|click/,
        +    rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
        +    rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
        +
        +function returnTrue() {
        +    return true;
        +}
        +
        +function returnFalse() {
        +    return false;
        +}
        +
        +/*
        + * Helper functions for managing events -- not part of the public interface.
        + * Props to Dean Edwards' addEvent library for many of the ideas.
        + */
        +jQuery.event = {
        +
        +    global: {},
        +
        +    add: function( elem, types, handler, data, selector ) {
        +        var tmp, events, t, handleObjIn,
        +            special, eventHandle, handleObj,
        +            handlers, type, namespaces, origType,
        +            elemData = jQuery._data( elem );
        +
        +        // Don't attach events to noData or text/comment nodes (but allow plain objects)
        +        if ( !elemData ) {
        +            return;
        +        }
        +
        +        // Caller can pass in an object of custom data in lieu of the handler
        +        if ( handler.handler ) {
        +            handleObjIn = handler;
        +            handler = handleObjIn.handler;
        +            selector = handleObjIn.selector;
        +        }
        +
        +        // Make sure that the handler has a unique ID, used to find/remove it later
        +        if ( !handler.guid ) {
        +            handler.guid = jQuery.guid++;
        +        }
        +
        +        // Init the element's event structure and main handler, if this is the first
        +        if ( !(events = elemData.events) ) {
        +            events = elemData.events = {};
        +        }
        +        if ( !(eventHandle = elemData.handle) ) {
        +            eventHandle = elemData.handle = function( e ) {
        +                // Discard the second event of a jQuery.event.trigger() and
        +                // when an event is called after a page has unloaded
        +                return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
        +                    jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
        +                    undefined;
        +            };
        +            // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
        +            eventHandle.elem = elem;
        +        }
        +
        +        // Handle multiple events separated by a space
        +        // jQuery(...).bind("mouseover mouseout", fn);
        +        types = ( types || "" ).match( core_rnotwhite ) || [""];
        +        t = types.length;
        +        while ( t-- ) {
        +            tmp = rtypenamespace.exec( types[t] ) || [];
        +            type = origType = tmp[1];
        +            namespaces = ( tmp[2] || "" ).split( "." ).sort();
        +
        +            // If event changes its type, use the special event handlers for the changed type
        +            special = jQuery.event.special[ type ] || {};
        +
        +            // If selector defined, determine special event api type, otherwise given type
        +            type = ( selector ? special.delegateType : special.bindType ) || type;
        +
        +            // Update special based on newly reset type
        +            special = jQuery.event.special[ type ] || {};
        +
        +            // handleObj is passed to all event handlers
        +            handleObj = jQuery.extend({
        +                type: type,
        +                origType: origType,
        +                data: data,
        +                handler: handler,
        +                guid: handler.guid,
        +                selector: selector,
        +                needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
        +                namespace: namespaces.join(".")
        +            }, handleObjIn );
        +
        +            // Init the event handler queue if we're the first
        +            if ( !(handlers = events[ type ]) ) {
        +                handlers = events[ type ] = [];
        +                handlers.delegateCount = 0;
        +
        +                // Only use addEventListener/attachEvent if the special events handler returns false
        +                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        +                    // Bind the global event handler to the element
        +                    if ( elem.addEventListener ) {
        +                        elem.addEventListener( type, eventHandle, false );
        +
        +                    } else if ( elem.attachEvent ) {
        +                        elem.attachEvent( "on" + type, eventHandle );
        +                    }
        +                }
        +            }
        +
        +            if ( special.add ) {
        +                special.add.call( elem, handleObj );
        +
        +                if ( !handleObj.handler.guid ) {
        +                    handleObj.handler.guid = handler.guid;
        +                }
        +            }
        +
        +            // Add to the element's handler list, delegates in front
        +            if ( selector ) {
        +                handlers.splice( handlers.delegateCount++, 0, handleObj );
        +            } else {
        +                handlers.push( handleObj );
        +            }
        +
        +            // Keep track of which events have ever been used, for event optimization
        +            jQuery.event.global[ type ] = true;
        +        }
        +
        +        // Nullify elem to prevent memory leaks in IE
        +        elem = null;
        +    },
        +
        +    // Detach an event or set of events from an element
        +    remove: function( elem, types, handler, selector, mappedTypes ) {
        +        var j, handleObj, tmp,
        +            origCount, t, events,
        +            special, handlers, type,
        +            namespaces, origType,
        +            elemData = jQuery.hasData( elem ) && jQuery._data( elem );
        +
        +        if ( !elemData || !(events = elemData.events) ) {
        +            return;
        +        }
        +
        +        // Once for each type.namespace in types; type may be omitted
        +        types = ( types || "" ).match( core_rnotwhite ) || [""];
        +        t = types.length;
        +        while ( t-- ) {
        +            tmp = rtypenamespace.exec( types[t] ) || [];
        +            type = origType = tmp[1];
        +            namespaces = ( tmp[2] || "" ).split( "." ).sort();
        +
        +            // Unbind all events (on this namespace, if provided) for the element
        +            if ( !type ) {
        +                for ( type in events ) {
        +                    jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
        +                }
        +                continue;
        +            }
        +
        +            special = jQuery.event.special[ type ] || {};
        +            type = ( selector ? special.delegateType : special.bindType ) || type;
        +            handlers = events[ type ] || [];
        +            tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
        +
        +            // Remove matching events
        +            origCount = j = handlers.length;
        +            while ( j-- ) {
        +                handleObj = handlers[ j ];
        +
        +                if ( ( mappedTypes || origType === handleObj.origType ) &&
        +                    ( !handler || handler.guid === handleObj.guid ) &&
        +                    ( !tmp || tmp.test( handleObj.namespace ) ) &&
        +                    ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
        +                    handlers.splice( j, 1 );
        +
        +                    if ( handleObj.selector ) {
        +                        handlers.delegateCount--;
        +                    }
        +                    if ( special.remove ) {
        +                        special.remove.call( elem, handleObj );
        +                    }
        +                }
        +            }
        +
        +            // Remove generic event handler if we removed something and no more handlers exist
        +            // (avoids potential for endless recursion during removal of special event handlers)
        +            if ( origCount && !handlers.length ) {
        +                if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
        +                    jQuery.removeEvent( elem, type, elemData.handle );
        +                }
        +
        +                delete events[ type ];
        +            }
        +        }
        +
        +        // Remove the expando if it's no longer used
        +        if ( jQuery.isEmptyObject( events ) ) {
        +            delete elemData.handle;
        +
        +            // removeData also checks for emptiness and clears the expando if empty
        +            // so use it instead of delete
        +            jQuery._removeData( elem, "events" );
        +        }
        +    },
        +
        +    trigger: function( event, data, elem, onlyHandlers ) {
        +        var handle, ontype, cur,
        +            bubbleType, special, tmp, i,
        +            eventPath = [ elem || document ],
        +            type = core_hasOwn.call( event, "type" ) ? event.type : event,
        +            namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
        +
        +        cur = tmp = elem = elem || document;
        +
        +        // Don't do events on text and comment nodes
        +        if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        +            return;
        +        }
        +
        +        // focus/blur morphs to focusin/out; ensure we're not firing them right now
        +        if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        +            return;
        +        }
        +
        +        if ( type.indexOf(".") >= 0 ) {
        +            // Namespaced trigger; create a regexp to match event type in handle()
        +            namespaces = type.split(".");
        +            type = namespaces.shift();
        +            namespaces.sort();
        +        }
        +        ontype = type.indexOf(":") < 0 && "on" + type;
        +
        +        // Caller can pass in a jQuery.Event object, Object, or just an event type string
        +        event = event[ jQuery.expando ] ?
        +            event :
        +            new jQuery.Event( type, typeof event === "object" && event );
        +
        +        event.isTrigger = true;
        +        event.namespace = namespaces.join(".");
        +        event.namespace_re = event.namespace ?
        +            new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
        +            null;
        +
        +        // Clean up the event in case it is being reused
        +        event.result = undefined;
        +        if ( !event.target ) {
        +            event.target = elem;
        +        }
        +
        +        // Clone any incoming data and prepend the event, creating the handler arg list
        +        data = data == null ?
        +            [ event ] :
        +            jQuery.makeArray( data, [ event ] );
        +
        +        // Allow special events to draw outside the lines
        +        special = jQuery.event.special[ type ] || {};
        +        if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
        +            return;
        +        }
        +
        +        // Determine event propagation path in advance, per W3C events spec (#9951)
        +        // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
        +        if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
        +
        +            bubbleType = special.delegateType || type;
        +            if ( !rfocusMorph.test( bubbleType + type ) ) {
        +                cur = cur.parentNode;
        +            }
        +            for ( ; cur; cur = cur.parentNode ) {
        +                eventPath.push( cur );
        +                tmp = cur;
        +            }
        +
        +            // Only add window if we got to document (e.g., not plain obj or detached DOM)
        +            if ( tmp === (elem.ownerDocument || document) ) {
        +                eventPath.push( tmp.defaultView || tmp.parentWindow || window );
        +            }
        +        }
        +
        +        // Fire handlers on the event path
        +        i = 0;
        +        while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
        +
        +            event.type = i > 1 ?
        +                bubbleType :
        +                special.bindType || type;
        +
        +            // jQuery handler
        +            handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
        +            if ( handle ) {
        +                handle.apply( cur, data );
        +            }
        +
        +            // Native handler
        +            handle = ontype && cur[ ontype ];
        +            if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
        +                event.preventDefault();
        +            }
        +        }
        +        event.type = type;
        +
        +        // If nobody prevented the default action, do it now
        +        if ( !onlyHandlers && !event.isDefaultPrevented() ) {
        +
        +            if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
        +                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
        +
        +                // Call a native DOM method on the target with the same name name as the event.
        +                // Can't use an .isFunction() check here because IE6/7 fails that test.
        +                // Don't do default actions on window, that's where global variables be (#6170)
        +                if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
        +
        +                    // Don't re-trigger an onFOO event when we call its FOO() method
        +                    tmp = elem[ ontype ];
        +
        +                    if ( tmp ) {
        +                        elem[ ontype ] = null;
        +                    }
        +
        +                    // Prevent re-triggering of the same event, since we already bubbled it above
        +                    jQuery.event.triggered = type;
        +                    try {
        +                        elem[ type ]();
        +                    } catch ( e ) {
        +                        // IE<9 dies on focus/blur to hidden element (#1486,#12518)
        +                        // only reproducible on winXP IE8 native, not IE9 in IE8 mode
        +                    }
        +                    jQuery.event.triggered = undefined;
        +
        +                    if ( tmp ) {
        +                        elem[ ontype ] = tmp;
        +                    }
        +                }
        +            }
        +        }
        +
        +        return event.result;
        +    },
        +
        +    dispatch: function( event ) {
        +
        +        // Make a writable jQuery.Event from the native event object
        +        event = jQuery.event.fix( event );
        +
        +        var i, ret, handleObj, matched, j,
        +            handlerQueue = [],
        +            args = core_slice.call( arguments ),
        +            handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
        +            special = jQuery.event.special[ event.type ] || {};
        +
        +        // Use the fix-ed jQuery.Event rather than the (read-only) native event
        +        args[0] = event;
        +        event.delegateTarget = this;
        +
        +        // Call the preDispatch hook for the mapped type, and let it bail if desired
        +        if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
        +            return;
        +        }
        +
        +        // Determine handlers
        +        handlerQueue = jQuery.event.handlers.call( this, event, handlers );
        +
        +        // Run delegates first; they may want to stop propagation beneath us
        +        i = 0;
        +        while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
        +            event.currentTarget = matched.elem;
        +
        +            j = 0;
        +            while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
        +
        +                // Triggered event must either 1) have no namespace, or
        +                // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
        +                if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
        +
        +                    event.handleObj = handleObj;
        +                    event.data = handleObj.data;
        +
        +                    ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
        +                            .apply( matched.elem, args );
        +
        +                    if ( ret !== undefined ) {
        +                        if ( (event.result = ret) === false ) {
        +                            event.preventDefault();
        +                            event.stopPropagation();
        +                        }
        +                    }
        +                }
        +            }
        +        }
        +
        +        // Call the postDispatch hook for the mapped type
        +        if ( special.postDispatch ) {
        +            special.postDispatch.call( this, event );
        +        }
        +
        +        return event.result;
        +    },
        +
        +    handlers: function( event, handlers ) {
        +        var sel, handleObj, matches, i,
        +            handlerQueue = [],
        +            delegateCount = handlers.delegateCount,
        +            cur = event.target;
        +
        +        // Find delegate handlers
        +        // Black-hole SVG <use> instance trees (#13180)
        +        // Avoid non-left-click bubbling in Firefox (#3861)
        +        if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
        +
        +            for ( ; cur != this; cur = cur.parentNode || this ) {
        +
        +                // Don't check non-elements (#13208)
        +                // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
        +                if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
        +                    matches = [];
        +                    for ( i = 0; i < delegateCount; i++ ) {
        +                        handleObj = handlers[ i ];
        +
        +                        // Don't conflict with Object.prototype properties (#13203)
        +                        sel = handleObj.selector + " ";
        +
        +                        if ( matches[ sel ] === undefined ) {
        +                            matches[ sel ] = handleObj.needsContext ?
        +                                jQuery( sel, this ).index( cur ) >= 0 :
        +                                jQuery.find( sel, this, null, [ cur ] ).length;
        +                        }
        +                        if ( matches[ sel ] ) {
        +                            matches.push( handleObj );
        +                        }
        +                    }
        +                    if ( matches.length ) {
        +                        handlerQueue.push({ elem: cur, handlers: matches });
        +                    }
        +                }
        +            }
        +        }
        +
        +        // Add the remaining (directly-bound) handlers
        +        if ( delegateCount < handlers.length ) {
        +            handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
        +        }
        +
        +        return handlerQueue;
        +    },
        +
        +    fix: function( event ) {
        +        if ( event[ jQuery.expando ] ) {
        +            return event;
        +        }
        +
        +        // Create a writable copy of the event object and normalize some properties
        +        var i, prop, copy,
        +            type = event.type,
        +            originalEvent = event,
        +            fixHook = this.fixHooks[ type ];
        +
        +        if ( !fixHook ) {
        +            this.fixHooks[ type ] = fixHook =
        +                rmouseEvent.test( type ) ? this.mouseHooks :
        +                rkeyEvent.test( type ) ? this.keyHooks :
        +                {};
        +        }
        +        copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
        +
        +        event = new jQuery.Event( originalEvent );
        +
        +        i = copy.length;
        +        while ( i-- ) {
        +            prop = copy[ i ];
        +            event[ prop ] = originalEvent[ prop ];
        +        }
        +
        +        // Support: IE<9
        +        // Fix target property (#1925)
        +        if ( !event.target ) {
        +            event.target = originalEvent.srcElement || document;
        +        }
        +
        +        // Support: Chrome 23+, Safari?
        +        // Target should not be a text node (#504, #13143)
        +        if ( event.target.nodeType === 3 ) {
        +            event.target = event.target.parentNode;
        +        }
        +
        +        // Support: IE<9
        +        // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
        +        event.metaKey = !!event.metaKey;
        +
        +        return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
        +    },
        +
        +    // Includes some event props shared by KeyEvent and MouseEvent
        +    props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
        +
        +    fixHooks: {},
        +
        +    keyHooks: {
        +        props: "char charCode key keyCode".split(" "),
        +        filter: function( event, original ) {
        +
        +            // Add which for key events
        +            if ( event.which == null ) {
        +                event.which = original.charCode != null ? original.charCode : original.keyCode;
        +            }
        +
        +            return event;
        +        }
        +    },
        +
        +    mouseHooks: {
        +        props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
        +        filter: function( event, original ) {
        +            var body, eventDoc, doc,
        +                button = original.button,
        +                fromElement = original.fromElement;
        +
        +            // Calculate pageX/Y if missing and clientX/Y available
        +            if ( event.pageX == null && original.clientX != null ) {
        +                eventDoc = event.target.ownerDocument || document;
        +                doc = eventDoc.documentElement;
        +                body = eventDoc.body;
        +
        +                event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
        +                event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
        +            }
        +
        +            // Add relatedTarget, if necessary
        +            if ( !event.relatedTarget && fromElement ) {
        +                event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
        +            }
        +
        +            // Add which for click: 1 === left; 2 === middle; 3 === right
        +            // Note: button is not normalized, so don't use it
        +            if ( !event.which && button !== undefined ) {
        +                event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
        +            }
        +
        +            return event;
        +        }
        +    },
        +
        +    special: {
        +        load: {
        +            // Prevent triggered image.load events from bubbling to window.load
        +            noBubble: true
        +        },
        +        click: {
        +            // For checkbox, fire native event so checked state will be right
        +            trigger: function() {
        +                if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
        +                    this.click();
        +                    return false;
        +                }
        +            }
        +        },
        +        focus: {
        +            // Fire native event if possible so blur/focus sequence is correct
        +            trigger: function() {
        +                if ( this !== document.activeElement && this.focus ) {
        +                    try {
        +                        this.focus();
        +                        return false;
        +                    } catch ( e ) {
        +                        // Support: IE<9
        +                        // If we error on focus to hidden element (#1486, #12518),
        +                        // let .trigger() run the handlers
        +                    }
        +                }
        +            },
        +            delegateType: "focusin"
        +        },
        +        blur: {
        +            trigger: function() {
        +                if ( this === document.activeElement && this.blur ) {
        +                    this.blur();
        +                    return false;
        +                }
        +            },
        +            delegateType: "focusout"
        +        },
        +
        +        beforeunload: {
        +            postDispatch: function( event ) {
        +
        +                // Even when returnValue equals to undefined Firefox will still show alert
        +                if ( event.result !== undefined ) {
        +                    event.originalEvent.returnValue = event.result;
        +                }
        +            }
        +        }
        +    },
        +
        +    simulate: function( type, elem, event, bubble ) {
        +        // Piggyback on a donor event to simulate a different one.
        +        // Fake originalEvent to avoid donor's stopPropagation, but if the
        +        // simulated event prevents default then we do the same on the donor.
        +        var e = jQuery.extend(
        +            new jQuery.Event(),
        +            event,
        +            { type: type,
        +                isSimulated: true,
        +                originalEvent: {}
        +            }
        +        );
        +        if ( bubble ) {
        +            jQuery.event.trigger( e, null, elem );
        +        } else {
        +            jQuery.event.dispatch.call( elem, e );
        +        }
        +        if ( e.isDefaultPrevented() ) {
        +            event.preventDefault();
        +        }
        +    }
        +};
        +
        +jQuery.removeEvent = document.removeEventListener ?
        +    function( elem, type, handle ) {
        +        if ( elem.removeEventListener ) {
        +            elem.removeEventListener( type, handle, false );
        +        }
        +    } :
        +    function( elem, type, handle ) {
        +        var name = "on" + type;
        +
        +        if ( elem.detachEvent ) {
        +
        +            // #8545, #7054, preventing memory leaks for custom events in IE6-8
        +            // detachEvent needed property on element, by name of that event, to properly expose it to GC
        +            if ( typeof elem[ name ] === core_strundefined ) {
        +                elem[ name ] = null;
        +            }
        +
        +            elem.detachEvent( name, handle );
        +        }
        +    };
        +
        +jQuery.Event = function( src, props ) {
        +    // Allow instantiation without the 'new' keyword
        +    if ( !(this instanceof jQuery.Event) ) {
        +        return new jQuery.Event( src, props );
        +    }
        +
        +    // Event object
        +    if ( src && src.type ) {
        +        this.originalEvent = src;
        +        this.type = src.type;
        +
        +        // Events bubbling up the document may have been marked as prevented
        +        // by a handler lower down the tree; reflect the correct value.
        +        this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
        +            src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
        +
        +    // Event type
        +    } else {
        +        this.type = src;
        +    }
        +
        +    // Put explicitly provided properties onto the event object
        +    if ( props ) {
        +        jQuery.extend( this, props );
        +    }
        +
        +    // Create a timestamp if incoming event doesn't have one
        +    this.timeStamp = src && src.timeStamp || jQuery.now();
        +
        +    // Mark it as fixed
        +    this[ jQuery.expando ] = true;
        +};
        +
        +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
        +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
        +jQuery.Event.prototype = {
        +    isDefaultPrevented: returnFalse,
        +    isPropagationStopped: returnFalse,
        +    isImmediatePropagationStopped: returnFalse,
        +
        +    preventDefault: function() {
        +        var e = this.originalEvent;
        +
        +        this.isDefaultPrevented = returnTrue;
        +        if ( !e ) {
        +            return;
        +        }
        +
        +        // If preventDefault exists, run it on the original event
        +        if ( e.preventDefault ) {
        +            e.preventDefault();
        +
        +        // Support: IE
        +        // Otherwise set the returnValue property of the original event to false
        +        } else {
        +            e.returnValue = false;
        +        }
        +    },
        +    stopPropagation: function() {
        +        var e = this.originalEvent;
        +
        +        this.isPropagationStopped = returnTrue;
        +        if ( !e ) {
        +            return;
        +        }
        +        // If stopPropagation exists, run it on the original event
        +        if ( e.stopPropagation ) {
        +            e.stopPropagation();
        +        }
        +
        +        // Support: IE
        +        // Set the cancelBubble property of the original event to true
        +        e.cancelBubble = true;
        +    },
        +    stopImmediatePropagation: function() {
        +        this.isImmediatePropagationStopped = returnTrue;
        +        this.stopPropagation();
        +    }
        +};
        +
        +// Create mouseenter/leave events using mouseover/out and event-time checks
        +jQuery.each({
        +    mouseenter: "mouseover",
        +    mouseleave: "mouseout"
        +}, function( orig, fix ) {
        +    jQuery.event.special[ orig ] = {
        +        delegateType: fix,
        +        bindType: fix,
        +
        +        handle: function( event ) {
        +            var ret,
        +                target = this,
        +                related = event.relatedTarget,
        +                handleObj = event.handleObj;
        +
        +            // For mousenter/leave call the handler if related is outside the target.
        +            // NB: No relatedTarget if the mouse left/entered the browser window
        +            if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
        +                event.type = handleObj.origType;
        +                ret = handleObj.handler.apply( this, arguments );
        +                event.type = fix;
        +            }
        +            return ret;
        +        }
        +    };
        +});
        +
        +// IE submit delegation
        +if ( !jQuery.support.submitBubbles ) {
        +
        +    jQuery.event.special.submit = {
        +        setup: function() {
        +            // Only need this for delegated form submit events
        +            if ( jQuery.nodeName( this, "form" ) ) {
        +                return false;
        +            }
        +
        +            // Lazy-add a submit handler when a descendant form may potentially be submitted
        +            jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
        +                // Node name check avoids a VML-related crash in IE (#9807)
        +                var elem = e.target,
        +                    form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
        +                if ( form && !jQuery._data( form, "submitBubbles" ) ) {
        +                    jQuery.event.add( form, "submit._submit", function( event ) {
        +                        event._submit_bubble = true;
        +                    });
        +                    jQuery._data( form, "submitBubbles", true );
        +                }
        +            });
        +            // return undefined since we don't need an event listener
        +        },
        +
        +        postDispatch: function( event ) {
        +            // If form was submitted by the user, bubble the event up the tree
        +            if ( event._submit_bubble ) {
        +                delete event._submit_bubble;
        +                if ( this.parentNode && !event.isTrigger ) {
        +                    jQuery.event.simulate( "submit", this.parentNode, event, true );
        +                }
        +            }
        +        },
        +
        +        teardown: function() {
        +            // Only need this for delegated form submit events
        +            if ( jQuery.nodeName( this, "form" ) ) {
        +                return false;
        +            }
        +
        +            // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
        +            jQuery.event.remove( this, "._submit" );
        +        }
        +    };
        +}
        +
        +// IE change delegation and checkbox/radio fix
        +if ( !jQuery.support.changeBubbles ) {
        +
        +    jQuery.event.special.change = {
        +
        +        setup: function() {
        +
        +            if ( rformElems.test( this.nodeName ) ) {
        +                // IE doesn't fire change on a check/radio until blur; trigger it on click
        +                // after a propertychange. Eat the blur-change in special.change.handle.
        +                // This still fires onchange a second time for check/radio after blur.
        +                if ( this.type === "checkbox" || this.type === "radio" ) {
        +                    jQuery.event.add( this, "propertychange._change", function( event ) {
        +                        if ( event.originalEvent.propertyName === "checked" ) {
        +                            this._just_changed = true;
        +                        }
        +                    });
        +                    jQuery.event.add( this, "click._change", function( event ) {
        +                        if ( this._just_changed && !event.isTrigger ) {
        +                            this._just_changed = false;
        +                        }
        +                        // Allow triggered, simulated change events (#11500)
        +                        jQuery.event.simulate( "change", this, event, true );
        +                    });
        +                }
        +                return false;
        +            }
        +            // Delegated event; lazy-add a change handler on descendant inputs
        +            jQuery.event.add( this, "beforeactivate._change", function( e ) {
        +                var elem = e.target;
        +
        +                if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
        +                    jQuery.event.add( elem, "change._change", function( event ) {
        +                        if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
        +                            jQuery.event.simulate( "change", this.parentNode, event, true );
        +                        }
        +                    });
        +                    jQuery._data( elem, "changeBubbles", true );
        +                }
        +            });
        +        },
        +
        +        handle: function( event ) {
        +            var elem = event.target;
        +
        +            // Swallow native change events from checkbox/radio, we already triggered them above
        +            if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
        +                return event.handleObj.handler.apply( this, arguments );
        +            }
        +        },
        +
        +        teardown: function() {
        +            jQuery.event.remove( this, "._change" );
        +
        +            return !rformElems.test( this.nodeName );
        +        }
        +    };
        +}
        +
        +// Create "bubbling" focus and blur events
        +if ( !jQuery.support.focusinBubbles ) {
        +    jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
        +
        +        // Attach a single capturing handler while someone wants focusin/focusout
        +        var attaches = 0,
        +            handler = function( event ) {
        +                jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
        +            };
        +
        +        jQuery.event.special[ fix ] = {
        +            setup: function() {
        +                if ( attaches++ === 0 ) {
        +                    document.addEventListener( orig, handler, true );
        +                }
        +            },
        +            teardown: function() {
        +                if ( --attaches === 0 ) {
        +                    document.removeEventListener( orig, handler, true );
        +                }
        +            }
        +        };
        +    });
        +}
        +
        +jQuery.fn.extend({
        +
        +    on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
        +        var type, origFn;
        +
        +        // Types can be a map of types/handlers
        +        if ( typeof types === "object" ) {
        +            // ( types-Object, selector, data )
        +            if ( typeof selector !== "string" ) {
        +                // ( types-Object, data )
        +                data = data || selector;
        +                selector = undefined;
        +            }
        +            for ( type in types ) {
        +                this.on( type, selector, data, types[ type ], one );
        +            }
        +            return this;
        +        }
        +
        +        if ( data == null && fn == null ) {
        +            // ( types, fn )
        +            fn = selector;
        +            data = selector = undefined;
        +        } else if ( fn == null ) {
        +            if ( typeof selector === "string" ) {
        +                // ( types, selector, fn )
        +                fn = data;
        +                data = undefined;
        +            } else {
        +                // ( types, data, fn )
        +                fn = data;
        +                data = selector;
        +                selector = undefined;
        +            }
        +        }
        +        if ( fn === false ) {
        +            fn = returnFalse;
        +        } else if ( !fn ) {
        +            return this;
        +        }
        +
        +        if ( one === 1 ) {
        +            origFn = fn;
        +            fn = function( event ) {
        +                // Can use an empty set, since event contains the info
        +                jQuery().off( event );
        +                return origFn.apply( this, arguments );
        +            };
        +            // Use same guid so caller can remove using origFn
        +            fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        +        }
        +        return this.each( function() {
        +            jQuery.event.add( this, types, fn, data, selector );
        +        });
        +    },
        +    one: function( types, selector, data, fn ) {
        +        return this.on( types, selector, data, fn, 1 );
        +    },
        +    off: function( types, selector, fn ) {
        +        var handleObj, type;
        +        if ( types && types.preventDefault && types.handleObj ) {
        +            // ( event )  dispatched jQuery.Event
        +            handleObj = types.handleObj;
        +            jQuery( types.delegateTarget ).off(
        +                handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
        +                handleObj.selector,
        +                handleObj.handler
        +            );
        +            return this;
        +        }
        +        if ( typeof types === "object" ) {
        +            // ( types-object [, selector] )
        +            for ( type in types ) {
        +                this.off( type, selector, types[ type ] );
        +            }
        +            return this;
        +        }
        +        if ( selector === false || typeof selector === "function" ) {
        +            // ( types [, fn] )
        +            fn = selector;
        +            selector = undefined;
        +        }
        +        if ( fn === false ) {
        +            fn = returnFalse;
        +        }
        +        return this.each(function() {
        +            jQuery.event.remove( this, types, fn, selector );
        +        });
        +    },
        +
        +    bind: function( types, data, fn ) {
        +        return this.on( types, null, data, fn );
        +    },
        +    unbind: function( types, fn ) {
        +        return this.off( types, null, fn );
        +    },
        +
        +    delegate: function( selector, types, data, fn ) {
        +        return this.on( types, selector, data, fn );
        +    },
        +    undelegate: function( selector, types, fn ) {
        +        // ( namespace ) or ( selector, types [, fn] )
        +        return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
        +    },
        +
        +    trigger: function( type, data ) {
        +        return this.each(function() {
        +            jQuery.event.trigger( type, data, this );
        +        });
        +    },
        +    triggerHandler: function( type, data ) {
        +        var elem = this[0];
        +        if ( elem ) {
        +            return jQuery.event.trigger( type, data, elem, true );
        +        }
        +    }
        +});
        +/*!
        + * Sizzle CSS Selector Engine
        + * Copyright 2012 jQuery Foundation and other contributors
        + * Released under the MIT license
        + * http://sizzlejs.com/
        + */
        +(function( window, undefined ) {
        +
        +var i,
        +    cachedruns,
        +    Expr,
        +    getText,
        +    isXML,
        +    compile,
        +    hasDuplicate,
        +    outermostContext,
        +
        +    // Local document vars
        +    setDocument,
        +    document,
        +    docElem,
        +    documentIsXML,
        +    rbuggyQSA,
        +    rbuggyMatches,
        +    matches,
        +    contains,
        +    sortOrder,
        +
        +    // Instance-specific data
        +    expando = "sizzle" + -(new Date()),
        +    preferredDoc = window.document,
        +    support = {},
        +    dirruns = 0,
        +    done = 0,
        +    classCache = createCache(),
        +    tokenCache = createCache(),
        +    compilerCache = createCache(),
        +
        +    // General-purpose constants
        +    strundefined = typeof undefined,
        +    MAX_NEGATIVE = 1 << 31,
        +
        +    // Array methods
        +    arr = [],
        +    pop = arr.pop,
        +    push = arr.push,
        +    slice = arr.slice,
        +    // Use a stripped-down indexOf if we can't use a native one
        +    indexOf = arr.indexOf || function( elem ) {
        +        var i = 0,
        +            len = this.length;
        +        for ( ; i < len; i++ ) {
        +            if ( this[i] === elem ) {
        +                return i;
        +            }
        +        }
        +        return -1;
        +    },
        +
        +
        +    // Regular expressions
        +
        +    // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
        +    whitespace = "[\\x20\\t\\r\\n\\f]",
        +    // http://www.w3.org/TR/css3-syntax/#characters
        +    characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
        +
        +    // Loosely modeled on CSS identifier characters
        +    // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
        +    // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        +    identifier = characterEncoding.replace( "w", "w#" ),
        +
        +    // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
        +    operators = "([*^$|!~]?=)",
        +    attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
        +        "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
        +
        +    // Prefer arguments quoted,
        +    //   then not containing pseudos/brackets,
        +    //   then attribute selectors/non-parenthetical expressions,
        +    //   then anything else
        +    // These preferences are here to reduce the number of selectors
        +    //   needing tokenize in the PSEUDO preFilter
        +    pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
        +
        +    // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
        +    rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
        +
        +    rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
        +    rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
        +    rpseudo = new RegExp( pseudos ),
        +    ridentifier = new RegExp( "^" + identifier + "$" ),
        +
        +    matchExpr = {
        +        "ID": new RegExp( "^#(" + characterEncoding + ")" ),
        +        "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
        +        "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
        +        "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
        +        "ATTR": new RegExp( "^" + attributes ),
        +        "PSEUDO": new RegExp( "^" + pseudos ),
        +        "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
        +            "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
        +            "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
        +        // For use in libraries implementing .is()
        +        // We use this for POS matching in `select`
        +        "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
        +            whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
        +    },
        +
        +    rsibling = /[\x20\t\r\n\f]*[+~]/,
        +
        +    rnative = /^[^{]+\{\s*\[native code/,
        +
        +    // Easily-parseable/retrievable ID or TAG or CLASS selectors
        +    rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
        +
        +    rinputs = /^(?:input|select|textarea|button)$/i,
        +    rheader = /^h\d$/i,
        +
        +    rescape = /'|\\/g,
        +    rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
        +
        +    // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
        +    runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
        +    funescape = function( _, escaped ) {
        +        var high = "0x" + escaped - 0x10000;
        +        // NaN means non-codepoint
        +        return high !== high ?
        +            escaped :
        +            // BMP codepoint
        +            high < 0 ?
        +                String.fromCharCode( high + 0x10000 ) :
        +                // Supplemental Plane codepoint (surrogate pair)
        +                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
        +    };
        +
        +// Use a stripped-down slice if we can't use a native one
        +try {
        +    slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
        +} catch ( e ) {
        +    slice = function( i ) {
        +        var elem,
        +            results = [];
        +        while ( (elem = this[i++]) ) {
        +            results.push( elem );
        +        }
        +        return results;
        +    };
        +}
        +
        +/**
        + * For feature detection
        + * @param {Function} fn The function to test for native support
        + */
        +function isNative( fn ) {
        +    return rnative.test( fn + "" );
        +}
        +
        +/**
        + * Create key-value caches of limited size
        + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
        + *  property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
        + *  deleting the oldest entry
        + */
        +function createCache() {
        +    var cache,
        +        keys = [];
        +
        +    return (cache = function( key, value ) {
        +        // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        +        if ( keys.push( key += " " ) > Expr.cacheLength ) {
        +            // Only keep the most recent entries
        +            delete cache[ keys.shift() ];
        +        }
        +        return (cache[ key ] = value);
        +    });
        +}
        +
        +/**
        + * Mark a function for special use by Sizzle
        + * @param {Function} fn The function to mark
        + */
        +function markFunction( fn ) {
        +    fn[ expando ] = true;
        +    return fn;
        +}
        +
        +/**
        + * Support testing using an element
        + * @param {Function} fn Passed the created div and expects a boolean result
        + */
        +function assert( fn ) {
        +    var div = document.createElement("div");
        +
        +    try {
        +        return fn( div );
        +    } catch (e) {
        +        return false;
        +    } finally {
        +        // release memory in IE
        +        div = null;
        +    }
        +}
        +
        +function Sizzle( selector, context, results, seed ) {
        +    var match, elem, m, nodeType,
        +        // QSA vars
        +        i, groups, old, nid, newContext, newSelector;
        +
        +    if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
        +        setDocument( context );
        +    }
        +
        +    context = context || document;
        +    results = results || [];
        +
        +    if ( !selector || typeof selector !== "string" ) {
        +        return results;
        +    }
        +
        +    if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
        +        return [];
        +    }
        +
        +    if ( !documentIsXML && !seed ) {
        +
        +        // Shortcuts
        +        if ( (match = rquickExpr.exec( selector )) ) {
        +            // Speed-up: Sizzle("#ID")
        +            if ( (m = match[1]) ) {
        +                if ( nodeType === 9 ) {
        +                    elem = context.getElementById( m );
        +                    // Check parentNode to catch when Blackberry 4.6 returns
        +                    // nodes that are no longer in the document #6963
        +                    if ( elem && elem.parentNode ) {
        +                        // Handle the case where IE, Opera, and Webkit return items
        +                        // by name instead of ID
        +                        if ( elem.id === m ) {
        +                            results.push( elem );
        +                            return results;
        +                        }
        +                    } else {
        +                        return results;
        +                    }
        +                } else {
        +                    // Context is not a document
        +                    if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
        +                        contains( context, elem ) && elem.id === m ) {
        +                        results.push( elem );
        +                        return results;
        +                    }
        +                }
        +
        +            // Speed-up: Sizzle("TAG")
        +            } else if ( match[2] ) {
        +                push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
        +                return results;
        +
        +            // Speed-up: Sizzle(".CLASS")
        +            } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
        +                push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
        +                return results;
        +            }
        +        }
        +
        +        // QSA path
        +        if ( support.qsa && !rbuggyQSA.test(selector) ) {
        +            old = true;
        +            nid = expando;
        +            newContext = context;
        +            newSelector = nodeType === 9 && selector;
        +
        +            // qSA works strangely on Element-rooted queries
        +            // We can work around this by specifying an extra ID on the root
        +            // and working up from there (Thanks to Andrew Dupont for the technique)
        +            // IE 8 doesn't work on object elements
        +            if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
        +                groups = tokenize( selector );
        +
        +                if ( (old = context.getAttribute("id")) ) {
        +                    nid = old.replace( rescape, "\\$&" );
        +                } else {
        +                    context.setAttribute( "id", nid );
        +                }
        +                nid = "[id='" + nid + "'] ";
        +
        +                i = groups.length;
        +                while ( i-- ) {
        +                    groups[i] = nid + toSelector( groups[i] );
        +                }
        +                newContext = rsibling.test( selector ) && context.parentNode || context;
        +                newSelector = groups.join(",");
        +            }
        +
        +            if ( newSelector ) {
        +                try {
        +                    push.apply( results, slice.call( newContext.querySelectorAll(
        +                        newSelector
        +                    ), 0 ) );
        +                    return results;
        +                } catch(qsaError) {
        +                } finally {
        +                    if ( !old ) {
        +                        context.removeAttribute("id");
        +                    }
        +                }
        +            }
        +        }
        +    }
        +
        +    // All others
        +    return select( selector.replace( rtrim, "$1" ), context, results, seed );
        +}
        +
        +/**
        + * Detect xml
        + * @param {Element|Object} elem An element or a document
        + */
        +isXML = Sizzle.isXML = function( elem ) {
        +    // documentElement is verified for cases where it doesn't yet exist
        +    // (such as loading iframes in IE - #4833)
        +    var documentElement = elem && (elem.ownerDocument || elem).documentElement;
        +    return documentElement ? documentElement.nodeName !== "HTML" : false;
        +};
        +
        +/**
        + * Sets document-related variables once based on the current document
        + * @param {Element|Object} [doc] An element or document object to use to set the document
        + * @returns {Object} Returns the current document
        + */
        +setDocument = Sizzle.setDocument = function( node ) {
        +    var doc = node ? node.ownerDocument || node : preferredDoc;
        +
        +    // If no document and documentElement is available, return
        +    if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
        +        return document;
        +    }
        +
        +    // Set our document
        +    document = doc;
        +    docElem = doc.documentElement;
        +
        +    // Support tests
        +    documentIsXML = isXML( doc );
        +
        +    // Check if getElementsByTagName("*") returns only elements
        +    support.tagNameNoComments = assert(function( div ) {
        +        div.appendChild( doc.createComment("") );
        +        return !div.getElementsByTagName("*").length;
        +    });
        +
        +    // Check if attributes should be retrieved by attribute nodes
        +    support.attributes = assert(function( div ) {
        +        div.innerHTML = "<select></select>";
        +        var type = typeof div.lastChild.getAttribute("multiple");
        +        // IE8 returns a string for some attributes even when not present
        +        return type !== "boolean" && type !== "string";
        +    });
        +
        +    // Check if getElementsByClassName can be trusted
        +    support.getByClassName = assert(function( div ) {
        +        // Opera can't find a second classname (in 9.6)
        +        div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
        +        if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
        +            return false;
        +        }
        +
        +        // Safari 3.2 caches class attributes and doesn't catch changes
        +        div.lastChild.className = "e";
        +        return div.getElementsByClassName("e").length === 2;
        +    });
        +
        +    // Check if getElementById returns elements by name
        +    // Check if getElementsByName privileges form controls or returns elements by ID
        +    support.getByName = assert(function( div ) {
        +        // Inject content
        +        div.id = expando + 0;
        +        div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
        +        docElem.insertBefore( div, docElem.firstChild );
        +
        +        // Test
        +        var pass = doc.getElementsByName &&
        +            // buggy browsers will return fewer than the correct 2
        +            doc.getElementsByName( expando ).length === 2 +
        +            // buggy browsers will return more than the correct 0
        +            doc.getElementsByName( expando + 0 ).length;
        +        support.getIdNotName = !doc.getElementById( expando );
        +
        +        // Cleanup
        +        docElem.removeChild( div );
        +
        +        return pass;
        +    });
        +
        +    // IE6/7 return modified attributes
        +    Expr.attrHandle = assert(function( div ) {
        +        div.innerHTML = "<a href='#'></a>";
        +        return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
        +            div.firstChild.getAttribute("href") === "#";
        +    }) ?
        +        {} :
        +        {
        +            "href": function( elem ) {
        +                return elem.getAttribute( "href", 2 );
        +            },
        +            "type": function( elem ) {
        +                return elem.getAttribute("type");
        +            }
        +        };
        +
        +    // ID find and filter
        +    if ( support.getIdNotName ) {
        +        Expr.find["ID"] = function( id, context ) {
        +            if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
        +                var m = context.getElementById( id );
        +                // Check parentNode to catch when Blackberry 4.6 returns
        +                // nodes that are no longer in the document #6963
        +                return m && m.parentNode ? [m] : [];
        +            }
        +        };
        +        Expr.filter["ID"] = function( id ) {
        +            var attrId = id.replace( runescape, funescape );
        +            return function( elem ) {
        +                return elem.getAttribute("id") === attrId;
        +            };
        +        };
        +    } else {
        +        Expr.find["ID"] = function( id, context ) {
        +            if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
        +                var m = context.getElementById( id );
        +
        +                return m ?
        +                    m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
        +                        [m] :
        +                        undefined :
        +                    [];
        +            }
        +        };
        +        Expr.filter["ID"] =  function( id ) {
        +            var attrId = id.replace( runescape, funescape );
        +            return function( elem ) {
        +                var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
        +                return node && node.value === attrId;
        +            };
        +        };
        +    }
        +
        +    // Tag
        +    Expr.find["TAG"] = support.tagNameNoComments ?
        +        function( tag, context ) {
        +            if ( typeof context.getElementsByTagName !== strundefined ) {
        +                return context.getElementsByTagName( tag );
        +            }
        +        } :
        +        function( tag, context ) {
        +            var elem,
        +                tmp = [],
        +                i = 0,
        +                results = context.getElementsByTagName( tag );
        +
        +            // Filter out possible comments
        +            if ( tag === "*" ) {
        +                while ( (elem = results[i++]) ) {
        +                    if ( elem.nodeType === 1 ) {
        +                        tmp.push( elem );
        +                    }
        +                }
        +
        +                return tmp;
        +            }
        +            return results;
        +        };
        +
        +    // Name
        +    Expr.find["NAME"] = support.getByName && function( tag, context ) {
        +        if ( typeof context.getElementsByName !== strundefined ) {
        +            return context.getElementsByName( name );
        +        }
        +    };
        +
        +    // Class
        +    Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
        +        if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
        +            return context.getElementsByClassName( className );
        +        }
        +    };
        +
        +    // QSA and matchesSelector support
        +
        +    // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
        +    rbuggyMatches = [];
        +
        +    // qSa(:focus) reports false when true (Chrome 21),
        +    // no need to also add to buggyMatches since matches checks buggyQSA
        +    // A support test would require too much code (would include document ready)
        +    rbuggyQSA = [ ":focus" ];
        +
        +    if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
        +        // Build QSA regex
        +        // Regex strategy adopted from Diego Perini
        +        assert(function( div ) {
        +            // Select is set to empty string on purpose
        +            // This is to test IE's treatment of not explictly
        +            // setting a boolean content attribute,
        +            // since its presence should be enough
        +            // http://bugs.jquery.com/ticket/12359
        +            div.innerHTML = "<select><option selected=''></option></select>";
        +
        +            // IE8 - Some boolean attributes are not treated correctly
        +            if ( !div.querySelectorAll("[selected]").length ) {
        +                rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
        +            }
        +
        +            // Webkit/Opera - :checked should return selected option elements
        +            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +            // IE8 throws error here and will not see later tests
        +            if ( !div.querySelectorAll(":checked").length ) {
        +                rbuggyQSA.push(":checked");
        +            }
        +        });
        +
        +        assert(function( div ) {
        +
        +            // Opera 10-12/IE8 - ^= $= *= and empty values
        +            // Should not select anything
        +            div.innerHTML = "<input type='hidden' i=''/>";
        +            if ( div.querySelectorAll("[i^='']").length ) {
        +                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
        +            }
        +
        +            // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
        +            // IE8 throws error here and will not see later tests
        +            if ( !div.querySelectorAll(":enabled").length ) {
        +                rbuggyQSA.push( ":enabled", ":disabled" );
        +            }
        +
        +            // Opera 10-11 does not throw on post-comma invalid pseudos
        +            div.querySelectorAll("*,:x");
        +            rbuggyQSA.push(",.*:");
        +        });
        +    }
        +
        +    if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
        +        docElem.mozMatchesSelector ||
        +        docElem.webkitMatchesSelector ||
        +        docElem.oMatchesSelector ||
        +        docElem.msMatchesSelector) )) ) {
        +
        +        assert(function( div ) {
        +            // Check to see if it's possible to do matchesSelector
        +            // on a disconnected node (IE 9)
        +            support.disconnectedMatch = matches.call( div, "div" );
        +
        +            // This should fail with an exception
        +            // Gecko does not error, returns false instead
        +            matches.call( div, "[s!='']:x" );
        +            rbuggyMatches.push( "!=", pseudos );
        +        });
        +    }
        +
        +    rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
        +    rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
        +
        +    // Element contains another
        +    // Purposefully does not implement inclusive descendent
        +    // As in, an element does not contain itself
        +    contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
        +        function( a, b ) {
        +            var adown = a.nodeType === 9 ? a.documentElement : a,
        +                bup = b && b.parentNode;
        +            return a === bup || !!( bup && bup.nodeType === 1 && (
        +                adown.contains ?
        +                    adown.contains( bup ) :
        +                    a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
        +            ));
        +        } :
        +        function( a, b ) {
        +            if ( b ) {
        +                while ( (b = b.parentNode) ) {
        +                    if ( b === a ) {
        +                        return true;
        +                    }
        +                }
        +            }
        +            return false;
        +        };
        +
        +    // Document order sorting
        +    sortOrder = docElem.compareDocumentPosition ?
        +    function( a, b ) {
        +        var compare;
        +
        +        if ( a === b ) {
        +            hasDuplicate = true;
        +            return 0;
        +        }
        +
        +        if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
        +            if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
        +                if ( a === doc || contains( preferredDoc, a ) ) {
        +                    return -1;
        +                }
        +                if ( b === doc || contains( preferredDoc, b ) ) {
        +                    return 1;
        +                }
        +                return 0;
        +            }
        +            return compare & 4 ? -1 : 1;
        +        }
        +
        +        return a.compareDocumentPosition ? -1 : 1;
        +    } :
        +    function( a, b ) {
        +        var cur,
        +            i = 0,
        +            aup = a.parentNode,
        +            bup = b.parentNode,
        +            ap = [ a ],
        +            bp = [ b ];
        +
        +        // Exit early if the nodes are identical
        +        if ( a === b ) {
        +            hasDuplicate = true;
        +            return 0;
        +
        +        // Parentless nodes are either documents or disconnected
        +        } else if ( !aup || !bup ) {
        +            return a === doc ? -1 :
        +                b === doc ? 1 :
        +                aup ? -1 :
        +                bup ? 1 :
        +                0;
        +
        +        // If the nodes are siblings, we can do a quick check
        +        } else if ( aup === bup ) {
        +            return siblingCheck( a, b );
        +        }
        +
        +        // Otherwise we need full lists of their ancestors for comparison
        +        cur = a;
        +        while ( (cur = cur.parentNode) ) {
        +            ap.unshift( cur );
        +        }
        +        cur = b;
        +        while ( (cur = cur.parentNode) ) {
        +            bp.unshift( cur );
        +        }
        +
        +        // Walk down the tree looking for a discrepancy
        +        while ( ap[i] === bp[i] ) {
        +            i++;
        +        }
        +
        +        return i ?
        +            // Do a sibling check if the nodes have a common ancestor
        +            siblingCheck( ap[i], bp[i] ) :
        +
        +            // Otherwise nodes in our document sort first
        +            ap[i] === preferredDoc ? -1 :
        +            bp[i] === preferredDoc ? 1 :
        +            0;
        +    };
        +
        +    // Always assume the presence of duplicates if sort doesn't
        +    // pass them to our comparison function (as in Google Chrome).
        +    hasDuplicate = false;
        +    [0, 0].sort( sortOrder );
        +    support.detectDuplicates = hasDuplicate;
        +
        +    return document;
        +};
        +
        +Sizzle.matches = function( expr, elements ) {
        +    return Sizzle( expr, null, null, elements );
        +};
        +
        +Sizzle.matchesSelector = function( elem, expr ) {
        +    // Set document vars if needed
        +    if ( ( elem.ownerDocument || elem ) !== document ) {
        +        setDocument( elem );
        +    }
        +
        +    // Make sure that attribute selectors are quoted
        +    expr = expr.replace( rattributeQuotes, "='$1']" );
        +
        +    // rbuggyQSA always contains :focus, so no need for an existence check
        +    if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
        +        try {
        +            var ret = matches.call( elem, expr );
        +
        +            // IE 9's matchesSelector returns false on disconnected nodes
        +            if ( ret || support.disconnectedMatch ||
        +                    // As well, disconnected nodes are said to be in a document
        +                    // fragment in IE 9
        +                    elem.document && elem.document.nodeType !== 11 ) {
        +                return ret;
        +            }
        +        } catch(e) {}
        +    }
        +
        +    return Sizzle( expr, document, null, [elem] ).length > 0;
        +};
        +
        +Sizzle.contains = function( context, elem ) {
        +    // Set document vars if needed
        +    if ( ( context.ownerDocument || context ) !== document ) {
        +        setDocument( context );
        +    }
        +    return contains( context, elem );
        +};
        +
        +Sizzle.attr = function( elem, name ) {
        +    var val;
        +
        +    // Set document vars if needed
        +    if ( ( elem.ownerDocument || elem ) !== document ) {
        +        setDocument( elem );
        +    }
        +
        +    if ( !documentIsXML ) {
        +        name = name.toLowerCase();
        +    }
        +    if ( (val = Expr.attrHandle[ name ]) ) {
        +        return val( elem );
        +    }
        +    if ( documentIsXML || support.attributes ) {
        +        return elem.getAttribute( name );
        +    }
        +    return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
        +        name :
        +        val && val.specified ? val.value : null;
        +};
        +
        +Sizzle.error = function( msg ) {
        +    throw new Error( "Syntax error, unrecognized expression: " + msg );
        +};
        +
        +// Document sorting and removing duplicates
        +Sizzle.uniqueSort = function( results ) {
        +    var elem,
        +        duplicates = [],
        +        i = 1,
        +        j = 0;
        +
        +    // Unless we *know* we can detect duplicates, assume their presence
        +    hasDuplicate = !support.detectDuplicates;
        +    results.sort( sortOrder );
        +
        +    if ( hasDuplicate ) {
        +        for ( ; (elem = results[i]); i++ ) {
        +            if ( elem === results[ i - 1 ] ) {
        +                j = duplicates.push( i );
        +            }
        +        }
        +        while ( j-- ) {
        +            results.splice( duplicates[ j ], 1 );
        +        }
        +    }
        +
        +    return results;
        +};
        +
        +function siblingCheck( a, b ) {
        +    var cur = b && a,
        +        diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
        +
        +    // Use IE sourceIndex if available on both nodes
        +    if ( diff ) {
        +        return diff;
        +    }
        +
        +    // Check if b follows a
        +    if ( cur ) {
        +        while ( (cur = cur.nextSibling) ) {
        +            if ( cur === b ) {
        +                return -1;
        +            }
        +        }
        +    }
        +
        +    return a ? 1 : -1;
        +}
        +
        +// Returns a function to use in pseudos for input types
        +function createInputPseudo( type ) {
        +    return function( elem ) {
        +        var name = elem.nodeName.toLowerCase();
        +        return name === "input" && elem.type === type;
        +    };
        +}
        +
        +// Returns a function to use in pseudos for buttons
        +function createButtonPseudo( type ) {
        +    return function( elem ) {
        +        var name = elem.nodeName.toLowerCase();
        +        return (name === "input" || name === "button") && elem.type === type;
        +    };
        +}
        +
        +// Returns a function to use in pseudos for positionals
        +function createPositionalPseudo( fn ) {
        +    return markFunction(function( argument ) {
        +        argument = +argument;
        +        return markFunction(function( seed, matches ) {
        +            var j,
        +                matchIndexes = fn( [], seed.length, argument ),
        +                i = matchIndexes.length;
        +
        +            // Match elements found at the specified indexes
        +            while ( i-- ) {
        +                if ( seed[ (j = matchIndexes[i]) ] ) {
        +                    seed[j] = !(matches[j] = seed[j]);
        +                }
        +            }
        +        });
        +    });
        +}
        +
        +/**
        + * Utility function for retrieving the text value of an array of DOM nodes
        + * @param {Array|Element} elem
        + */
        +getText = Sizzle.getText = function( elem ) {
        +    var node,
        +        ret = "",
        +        i = 0,
        +        nodeType = elem.nodeType;
        +
        +    if ( !nodeType ) {
        +        // If no nodeType, this is expected to be an array
        +        for ( ; (node = elem[i]); i++ ) {
        +            // Do not traverse comment nodes
        +            ret += getText( node );
        +        }
        +    } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        +        // Use textContent for elements
        +        // innerText usage removed for consistency of new lines (see #11153)
        +        if ( typeof elem.textContent === "string" ) {
        +            return elem.textContent;
        +        } else {
        +            // Traverse its children
        +            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +                ret += getText( elem );
        +            }
        +        }
        +    } else if ( nodeType === 3 || nodeType === 4 ) {
        +        return elem.nodeValue;
        +    }
        +    // Do not include comment or processing instruction nodes
        +
        +    return ret;
        +};
        +
        +Expr = Sizzle.selectors = {
        +
        +    // Can be adjusted by the user
        +    cacheLength: 50,
        +
        +    createPseudo: markFunction,
        +
        +    match: matchExpr,
        +
        +    find: {},
        +
        +    relative: {
        +        ">": { dir: "parentNode", first: true },
        +        " ": { dir: "parentNode" },
        +        "+": { dir: "previousSibling", first: true },
        +        "~": { dir: "previousSibling" }
        +    },
        +
        +    preFilter: {
        +        "ATTR": function( match ) {
        +            match[1] = match[1].replace( runescape, funescape );
        +
        +            // Move the given value to match[3] whether quoted or unquoted
        +            match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
        +
        +            if ( match[2] === "~=" ) {
        +                match[3] = " " + match[3] + " ";
        +            }
        +
        +            return match.slice( 0, 4 );
        +        },
        +
        +        "CHILD": function( match ) {
        +            /* matches from matchExpr["CHILD"]
        +                1 type (only|nth|...)
        +                2 what (child|of-type)
        +                3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
        +                4 xn-component of xn+y argument ([+-]?\d*n|)
        +                5 sign of xn-component
        +                6 x of xn-component
        +                7 sign of y-component
        +                8 y of y-component
        +            */
        +            match[1] = match[1].toLowerCase();
        +
        +            if ( match[1].slice( 0, 3 ) === "nth" ) {
        +                // nth-* requires argument
        +                if ( !match[3] ) {
        +                    Sizzle.error( match[0] );
        +                }
        +
        +                // numeric x and y parameters for Expr.filter.CHILD
        +                // remember that false/true cast respectively to 0/1
        +                match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
        +                match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
        +
        +            // other types prohibit arguments
        +            } else if ( match[3] ) {
        +                Sizzle.error( match[0] );
        +            }
        +
        +            return match;
        +        },
        +
        +        "PSEUDO": function( match ) {
        +            var excess,
        +                unquoted = !match[5] && match[2];
        +
        +            if ( matchExpr["CHILD"].test( match[0] ) ) {
        +                return null;
        +            }
        +
        +            // Accept quoted arguments as-is
        +            if ( match[4] ) {
        +                match[2] = match[4];
        +
        +            // Strip excess characters from unquoted arguments
        +            } else if ( unquoted && rpseudo.test( unquoted ) &&
        +                // Get excess from tokenize (recursively)
        +                (excess = tokenize( unquoted, true )) &&
        +                // advance to the next closing parenthesis
        +                (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
        +
        +                // excess is a negative index
        +                match[0] = match[0].slice( 0, excess );
        +                match[2] = unquoted.slice( 0, excess );
        +            }
        +
        +            // Return only captures needed by the pseudo filter method (type and argument)
        +            return match.slice( 0, 3 );
        +        }
        +    },
        +
        +    filter: {
        +
        +        "TAG": function( nodeName ) {
        +            if ( nodeName === "*" ) {
        +                return function() { return true; };
        +            }
        +
        +            nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
        +            return function( elem ) {
        +                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
        +            };
        +        },
        +
        +        "CLASS": function( className ) {
        +            var pattern = classCache[ className + " " ];
        +
        +            return pattern ||
        +                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
        +                classCache( className, function( elem ) {
        +                    return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
        +                });
        +        },
        +
        +        "ATTR": function( name, operator, check ) {
        +            return function( elem ) {
        +                var result = Sizzle.attr( elem, name );
        +
        +                if ( result == null ) {
        +                    return operator === "!=";
        +                }
        +                if ( !operator ) {
        +                    return true;
        +                }
        +
        +                result += "";
        +
        +                return operator === "=" ? result === check :
        +                    operator === "!=" ? result !== check :
        +                    operator === "^=" ? check && result.indexOf( check ) === 0 :
        +                    operator === "*=" ? check && result.indexOf( check ) > -1 :
        +                    operator === "$=" ? check && result.slice( -check.length ) === check :
        +                    operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
        +                    operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
        +                    false;
        +            };
        +        },
        +
        +        "CHILD": function( type, what, argument, first, last ) {
        +            var simple = type.slice( 0, 3 ) !== "nth",
        +                forward = type.slice( -4 ) !== "last",
        +                ofType = what === "of-type";
        +
        +            return first === 1 && last === 0 ?
        +
        +                // Shortcut for :nth-*(n)
        +                function( elem ) {
        +                    return !!elem.parentNode;
        +                } :
        +
        +                function( elem, context, xml ) {
        +                    var cache, outerCache, node, diff, nodeIndex, start,
        +                        dir = simple !== forward ? "nextSibling" : "previousSibling",
        +                        parent = elem.parentNode,
        +                        name = ofType && elem.nodeName.toLowerCase(),
        +                        useCache = !xml && !ofType;
        +
        +                    if ( parent ) {
        +
        +                        // :(first|last|only)-(child|of-type)
        +                        if ( simple ) {
        +                            while ( dir ) {
        +                                node = elem;
        +                                while ( (node = node[ dir ]) ) {
        +                                    if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
        +                                        return false;
        +                                    }
        +                                }
        +                                // Reverse direction for :only-* (if we haven't yet done so)
        +                                start = dir = type === "only" && !start && "nextSibling";
        +                            }
        +                            return true;
        +                        }
        +
        +                        start = [ forward ? parent.firstChild : parent.lastChild ];
        +
        +                        // non-xml :nth-child(...) stores cache data on `parent`
        +                        if ( forward && useCache ) {
        +                            // Seek `elem` from a previously-cached index
        +                            outerCache = parent[ expando ] || (parent[ expando ] = {});
        +                            cache = outerCache[ type ] || [];
        +                            nodeIndex = cache[0] === dirruns && cache[1];
        +                            diff = cache[0] === dirruns && cache[2];
        +                            node = nodeIndex && parent.childNodes[ nodeIndex ];
        +
        +                            while ( (node = ++nodeIndex && node && node[ dir ] ||
        +
        +                                // Fallback to seeking `elem` from the start
        +                                (diff = nodeIndex = 0) || start.pop()) ) {
        +
        +                                // When found, cache indexes on `parent` and break
        +                                if ( node.nodeType === 1 && ++diff && node === elem ) {
        +                                    outerCache[ type ] = [ dirruns, nodeIndex, diff ];
        +                                    break;
        +                                }
        +                            }
        +
        +                        // Use previously-cached element index if available
        +                        } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
        +                            diff = cache[1];
        +
        +                        // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
        +                        } else {
        +                            // Use the same loop as above to seek `elem` from the start
        +                            while ( (node = ++nodeIndex && node && node[ dir ] ||
        +                                (diff = nodeIndex = 0) || start.pop()) ) {
        +
        +                                if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
        +                                    // Cache the index of each encountered element
        +                                    if ( useCache ) {
        +                                        (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
        +                                    }
        +
        +                                    if ( node === elem ) {
        +                                        break;
        +                                    }
        +                                }
        +                            }
        +                        }
        +
        +                        // Incorporate the offset, then check against cycle size
        +                        diff -= last;
        +                        return diff === first || ( diff % first === 0 && diff / first >= 0 );
        +                    }
        +                };
        +        },
        +
        +        "PSEUDO": function( pseudo, argument ) {
        +            // pseudo-class names are case-insensitive
        +            // http://www.w3.org/TR/selectors/#pseudo-classes
        +            // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
        +            // Remember that setFilters inherits from pseudos
        +            var args,
        +                fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
        +                    Sizzle.error( "unsupported pseudo: " + pseudo );
        +
        +            // The user may use createPseudo to indicate that
        +            // arguments are needed to create the filter function
        +            // just as Sizzle does
        +            if ( fn[ expando ] ) {
        +                return fn( argument );
        +            }
        +
        +            // But maintain support for old signatures
        +            if ( fn.length > 1 ) {
        +                args = [ pseudo, pseudo, "", argument ];
        +                return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
        +                    markFunction(function( seed, matches ) {
        +                        var idx,
        +                            matched = fn( seed, argument ),
        +                            i = matched.length;
        +                        while ( i-- ) {
        +                            idx = indexOf.call( seed, matched[i] );
        +                            seed[ idx ] = !( matches[ idx ] = matched[i] );
        +                        }
        +                    }) :
        +                    function( elem ) {
        +                        return fn( elem, 0, args );
        +                    };
        +            }
        +
        +            return fn;
        +        }
        +    },
        +
        +    pseudos: {
        +        // Potentially complex pseudos
        +        "not": markFunction(function( selector ) {
        +            // Trim the selector passed to compile
        +            // to avoid treating leading and trailing
        +            // spaces as combinators
        +            var input = [],
        +                results = [],
        +                matcher = compile( selector.replace( rtrim, "$1" ) );
        +
        +            return matcher[ expando ] ?
        +                markFunction(function( seed, matches, context, xml ) {
        +                    var elem,
        +                        unmatched = matcher( seed, null, xml, [] ),
        +                        i = seed.length;
        +
        +                    // Match elements unmatched by `matcher`
        +                    while ( i-- ) {
        +                        if ( (elem = unmatched[i]) ) {
        +                            seed[i] = !(matches[i] = elem);
        +                        }
        +                    }
        +                }) :
        +                function( elem, context, xml ) {
        +                    input[0] = elem;
        +                    matcher( input, null, xml, results );
        +                    return !results.pop();
        +                };
        +        }),
        +
        +        "has": markFunction(function( selector ) {
        +            return function( elem ) {
        +                return Sizzle( selector, elem ).length > 0;
        +            };
        +        }),
        +
        +        "contains": markFunction(function( text ) {
        +            return function( elem ) {
        +                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
        +            };
        +        }),
        +
        +        // "Whether an element is represented by a :lang() selector
        +        // is based solely on the element's language value
        +        // being equal to the identifier C,
        +        // or beginning with the identifier C immediately followed by "-".
        +        // The matching of C against the element's language value is performed case-insensitively.
        +        // The identifier C does not have to be a valid language name."
        +        // http://www.w3.org/TR/selectors/#lang-pseudo
        +        "lang": markFunction( function( lang ) {
        +            // lang value must be a valid identifider
        +            if ( !ridentifier.test(lang || "") ) {
        +                Sizzle.error( "unsupported lang: " + lang );
        +            }
        +            lang = lang.replace( runescape, funescape ).toLowerCase();
        +            return function( elem ) {
        +                var elemLang;
        +                do {
        +                    if ( (elemLang = documentIsXML ?
        +                        elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
        +                        elem.lang) ) {
        +
        +                        elemLang = elemLang.toLowerCase();
        +                        return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
        +                    }
        +                } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
        +                return false;
        +            };
        +        }),
        +
        +        // Miscellaneous
        +        "target": function( elem ) {
        +            var hash = window.location && window.location.hash;
        +            return hash && hash.slice( 1 ) === elem.id;
        +        },
        +
        +        "root": function( elem ) {
        +            return elem === docElem;
        +        },
        +
        +        "focus": function( elem ) {
        +            return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
        +        },
        +
        +        // Boolean properties
        +        "enabled": function( elem ) {
        +            return elem.disabled === false;
        +        },
        +
        +        "disabled": function( elem ) {
        +            return elem.disabled === true;
        +        },
        +
        +        "checked": function( elem ) {
        +            // In CSS3, :checked should return both checked and selected elements
        +            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
        +            var nodeName = elem.nodeName.toLowerCase();
        +            return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
        +        },
        +
        +        "selected": function( elem ) {
        +            // Accessing this property makes selected-by-default
        +            // options in Safari work properly
        +            if ( elem.parentNode ) {
        +                elem.parentNode.selectedIndex;
        +            }
        +
        +            return elem.selected === true;
        +        },
        +
        +        // Contents
        +        "empty": function( elem ) {
        +            // http://www.w3.org/TR/selectors/#empty-pseudo
        +            // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
        +            //   not comment, processing instructions, or others
        +            // Thanks to Diego Perini for the nodeName shortcut
        +            //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
        +            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
        +                if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
        +                    return false;
        +                }
        +            }
        +            return true;
        +        },
        +
        +        "parent": function( elem ) {
        +            return !Expr.pseudos["empty"]( elem );
        +        },
        +
        +        // Element/input types
        +        "header": function( elem ) {
        +            return rheader.test( elem.nodeName );
        +        },
        +
        +        "input": function( elem ) {
        +            return rinputs.test( elem.nodeName );
        +        },
        +
        +        "button": function( elem ) {
        +            var name = elem.nodeName.toLowerCase();
        +            return name === "input" && elem.type === "button" || name === "button";
        +        },
        +
        +        "text": function( elem ) {
        +            var attr;
        +            // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
        +            // use getAttribute instead to test this case
        +            return elem.nodeName.toLowerCase() === "input" &&
        +                elem.type === "text" &&
        +                ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
        +        },
        +
        +        // Position-in-collection
        +        "first": createPositionalPseudo(function() {
        +            return [ 0 ];
        +        }),
        +
        +        "last": createPositionalPseudo(function( matchIndexes, length ) {
        +            return [ length - 1 ];
        +        }),
        +
        +        "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +            return [ argument < 0 ? argument + length : argument ];
        +        }),
        +
        +        "even": createPositionalPseudo(function( matchIndexes, length ) {
        +            var i = 0;
        +            for ( ; i < length; i += 2 ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        }),
        +
        +        "odd": createPositionalPseudo(function( matchIndexes, length ) {
        +            var i = 1;
        +            for ( ; i < length; i += 2 ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        }),
        +
        +        "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +            var i = argument < 0 ? argument + length : argument;
        +            for ( ; --i >= 0; ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        }),
        +
        +        "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
        +            var i = argument < 0 ? argument + length : argument;
        +            for ( ; ++i < length; ) {
        +                matchIndexes.push( i );
        +            }
        +            return matchIndexes;
        +        })
        +    }
        +};
        +
        +// Add button/input type pseudos
        +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
        +    Expr.pseudos[ i ] = createInputPseudo( i );
        +}
        +for ( i in { submit: true, reset: true } ) {
        +    Expr.pseudos[ i ] = createButtonPseudo( i );
        +}
        +
        +function tokenize( selector, parseOnly ) {
        +    var matched, match, tokens, type,
        +        soFar, groups, preFilters,
        +        cached = tokenCache[ selector + " " ];
        +
        +    if ( cached ) {
        +        return parseOnly ? 0 : cached.slice( 0 );
        +    }
        +
        +    soFar = selector;
        +    groups = [];
        +    preFilters = Expr.preFilter;
        +
        +    while ( soFar ) {
        +
        +        // Comma and first run
        +        if ( !matched || (match = rcomma.exec( soFar )) ) {
        +            if ( match ) {
        +                // Don't consume trailing commas as valid
        +                soFar = soFar.slice( match[0].length ) || soFar;
        +            }
        +            groups.push( tokens = [] );
        +        }
        +
        +        matched = false;
        +
        +        // Combinators
        +        if ( (match = rcombinators.exec( soFar )) ) {
        +            matched = match.shift();
        +            tokens.push( {
        +                value: matched,
        +                // Cast descendant combinators to space
        +                type: match[0].replace( rtrim, " " )
        +            } );
        +            soFar = soFar.slice( matched.length );
        +        }
        +
        +        // Filters
        +        for ( type in Expr.filter ) {
        +            if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
        +                (match = preFilters[ type ]( match ))) ) {
        +                matched = match.shift();
        +                tokens.push( {
        +                    value: matched,
        +                    type: type,
        +                    matches: match
        +                } );
        +                soFar = soFar.slice( matched.length );
        +            }
        +        }
        +
        +        if ( !matched ) {
        +            break;
        +        }
        +    }
        +
        +    // Return the length of the invalid excess
        +    // if we're just parsing
        +    // Otherwise, throw an error or return tokens
        +    return parseOnly ?
        +        soFar.length :
        +        soFar ?
        +            Sizzle.error( selector ) :
        +            // Cache the tokens
        +            tokenCache( selector, groups ).slice( 0 );
        +}
        +
        +function toSelector( tokens ) {
        +    var i = 0,
        +        len = tokens.length,
        +        selector = "";
        +    for ( ; i < len; i++ ) {
        +        selector += tokens[i].value;
        +    }
        +    return selector;
        +}
        +
        +function addCombinator( matcher, combinator, base ) {
        +    var dir = combinator.dir,
        +        checkNonElements = base && dir === "parentNode",
        +        doneName = done++;
        +
        +    return combinator.first ?
        +        // Check against closest ancestor/preceding element
        +        function( elem, context, xml ) {
        +            while ( (elem = elem[ dir ]) ) {
        +                if ( elem.nodeType === 1 || checkNonElements ) {
        +                    return matcher( elem, context, xml );
        +                }
        +            }
        +        } :
        +
        +        // Check against all ancestor/preceding elements
        +        function( elem, context, xml ) {
        +            var data, cache, outerCache,
        +                dirkey = dirruns + " " + doneName;
        +
        +            // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
        +            if ( xml ) {
        +                while ( (elem = elem[ dir ]) ) {
        +                    if ( elem.nodeType === 1 || checkNonElements ) {
        +                        if ( matcher( elem, context, xml ) ) {
        +                            return true;
        +                        }
        +                    }
        +                }
        +            } else {
        +                while ( (elem = elem[ dir ]) ) {
        +                    if ( elem.nodeType === 1 || checkNonElements ) {
        +                        outerCache = elem[ expando ] || (elem[ expando ] = {});
        +                        if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
        +                            if ( (data = cache[1]) === true || data === cachedruns ) {
        +                                return data === true;
        +                            }
        +                        } else {
        +                            cache = outerCache[ dir ] = [ dirkey ];
        +                            cache[1] = matcher( elem, context, xml ) || cachedruns;
        +                            if ( cache[1] === true ) {
        +                                return true;
        +                            }
        +                        }
        +                    }
        +                }
        +            }
        +        };
        +}
        +
        +function elementMatcher( matchers ) {
        +    return matchers.length > 1 ?
        +        function( elem, context, xml ) {
        +            var i = matchers.length;
        +            while ( i-- ) {
        +                if ( !matchers[i]( elem, context, xml ) ) {
        +                    return false;
        +                }
        +            }
        +            return true;
        +        } :
        +        matchers[0];
        +}
        +
        +function condense( unmatched, map, filter, context, xml ) {
        +    var elem,
        +        newUnmatched = [],
        +        i = 0,
        +        len = unmatched.length,
        +        mapped = map != null;
        +
        +    for ( ; i < len; i++ ) {
        +        if ( (elem = unmatched[i]) ) {
        +            if ( !filter || filter( elem, context, xml ) ) {
        +                newUnmatched.push( elem );
        +                if ( mapped ) {
        +                    map.push( i );
        +                }
        +            }
        +        }
        +    }
        +
        +    return newUnmatched;
        +}
        +
        +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
        +    if ( postFilter && !postFilter[ expando ] ) {
        +        postFilter = setMatcher( postFilter );
        +    }
        +    if ( postFinder && !postFinder[ expando ] ) {
        +        postFinder = setMatcher( postFinder, postSelector );
        +    }
        +    return markFunction(function( seed, results, context, xml ) {
        +        var temp, i, elem,
        +            preMap = [],
        +            postMap = [],
        +            preexisting = results.length,
        +
        +            // Get initial elements from seed or context
        +            elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
        +
        +            // Prefilter to get matcher input, preserving a map for seed-results synchronization
        +            matcherIn = preFilter && ( seed || !selector ) ?
        +                condense( elems, preMap, preFilter, context, xml ) :
        +                elems,
        +
        +            matcherOut = matcher ?
        +                // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
        +                postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
        +
        +                    // ...intermediate processing is necessary
        +                    [] :
        +
        +                    // ...otherwise use results directly
        +                    results :
        +                matcherIn;
        +
        +        // Find primary matches
        +        if ( matcher ) {
        +            matcher( matcherIn, matcherOut, context, xml );
        +        }
        +
        +        // Apply postFilter
        +        if ( postFilter ) {
        +            temp = condense( matcherOut, postMap );
        +            postFilter( temp, [], context, xml );
        +
        +            // Un-match failing elements by moving them back to matcherIn
        +            i = temp.length;
        +            while ( i-- ) {
        +                if ( (elem = temp[i]) ) {
        +                    matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
        +                }
        +            }
        +        }
        +
        +        if ( seed ) {
        +            if ( postFinder || preFilter ) {
        +                if ( postFinder ) {
        +                    // Get the final matcherOut by condensing this intermediate into postFinder contexts
        +                    temp = [];
        +                    i = matcherOut.length;
        +                    while ( i-- ) {
        +                        if ( (elem = matcherOut[i]) ) {
        +                            // Restore matcherIn since elem is not yet a final match
        +                            temp.push( (matcherIn[i] = elem) );
        +                        }
        +                    }
        +                    postFinder( null, (matcherOut = []), temp, xml );
        +                }
        +
        +                // Move matched elements from seed to results to keep them synchronized
        +                i = matcherOut.length;
        +                while ( i-- ) {
        +                    if ( (elem = matcherOut[i]) &&
        +                        (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
        +
        +                        seed[temp] = !(results[temp] = elem);
        +                    }
        +                }
        +            }
        +
        +        // Add elements to results, through postFinder if defined
        +        } else {
        +            matcherOut = condense(
        +                matcherOut === results ?
        +                    matcherOut.splice( preexisting, matcherOut.length ) :
        +                    matcherOut
        +            );
        +            if ( postFinder ) {
        +                postFinder( null, results, matcherOut, xml );
        +            } else {
        +                push.apply( results, matcherOut );
        +            }
        +        }
        +    });
        +}
        +
        +function matcherFromTokens( tokens ) {
        +    var checkContext, matcher, j,
        +        len = tokens.length,
        +        leadingRelative = Expr.relative[ tokens[0].type ],
        +        implicitRelative = leadingRelative || Expr.relative[" "],
        +        i = leadingRelative ? 1 : 0,
        +
        +        // The foundational matcher ensures that elements are reachable from top-level context(s)
        +        matchContext = addCombinator( function( elem ) {
        +            return elem === checkContext;
        +        }, implicitRelative, true ),
        +        matchAnyContext = addCombinator( function( elem ) {
        +            return indexOf.call( checkContext, elem ) > -1;
        +        }, implicitRelative, true ),
        +        matchers = [ function( elem, context, xml ) {
        +            return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
        +                (checkContext = context).nodeType ?
        +                    matchContext( elem, context, xml ) :
        +                    matchAnyContext( elem, context, xml ) );
        +        } ];
        +
        +    for ( ; i < len; i++ ) {
        +        if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
        +            matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
        +        } else {
        +            matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
        +
        +            // Return special upon seeing a positional matcher
        +            if ( matcher[ expando ] ) {
        +                // Find the next relative operator (if any) for proper handling
        +                j = ++i;
        +                for ( ; j < len; j++ ) {
        +                    if ( Expr.relative[ tokens[j].type ] ) {
        +                        break;
        +                    }
        +                }
        +                return setMatcher(
        +                    i > 1 && elementMatcher( matchers ),
        +                    i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
        +                    matcher,
        +                    i < j && matcherFromTokens( tokens.slice( i, j ) ),
        +                    j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
        +                    j < len && toSelector( tokens )
        +                );
        +            }
        +            matchers.push( matcher );
        +        }
        +    }
        +
        +    return elementMatcher( matchers );
        +}
        +
        +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
        +    // A counter to specify which element is currently being matched
        +    var matcherCachedRuns = 0,
        +        bySet = setMatchers.length > 0,
        +        byElement = elementMatchers.length > 0,
        +        superMatcher = function( seed, context, xml, results, expandContext ) {
        +            var elem, j, matcher,
        +                setMatched = [],
        +                matchedCount = 0,
        +                i = "0",
        +                unmatched = seed && [],
        +                outermost = expandContext != null,
        +                contextBackup = outermostContext,
        +                // We must always have either seed elements or context
        +                elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
        +                // Use integer dirruns iff this is the outermost matcher
        +                dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
        +
        +            if ( outermost ) {
        +                outermostContext = context !== document && context;
        +                cachedruns = matcherCachedRuns;
        +            }
        +
        +            // Add elements passing elementMatchers directly to results
        +            // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
        +            for ( ; (elem = elems[i]) != null; i++ ) {
        +                if ( byElement && elem ) {
        +                    j = 0;
        +                    while ( (matcher = elementMatchers[j++]) ) {
        +                        if ( matcher( elem, context, xml ) ) {
        +                            results.push( elem );
        +                            break;
        +                        }
        +                    }
        +                    if ( outermost ) {
        +                        dirruns = dirrunsUnique;
        +                        cachedruns = ++matcherCachedRuns;
        +                    }
        +                }
        +
        +                // Track unmatched elements for set filters
        +                if ( bySet ) {
        +                    // They will have gone through all possible matchers
        +                    if ( (elem = !matcher && elem) ) {
        +                        matchedCount--;
        +                    }
        +
        +                    // Lengthen the array for every element, matched or not
        +                    if ( seed ) {
        +                        unmatched.push( elem );
        +                    }
        +                }
        +            }
        +
        +            // Apply set filters to unmatched elements
        +            matchedCount += i;
        +            if ( bySet && i !== matchedCount ) {
        +                j = 0;
        +                while ( (matcher = setMatchers[j++]) ) {
        +                    matcher( unmatched, setMatched, context, xml );
        +                }
        +
        +                if ( seed ) {
        +                    // Reintegrate element matches to eliminate the need for sorting
        +                    if ( matchedCount > 0 ) {
        +                        while ( i-- ) {
        +                            if ( !(unmatched[i] || setMatched[i]) ) {
        +                                setMatched[i] = pop.call( results );
        +                            }
        +                        }
        +                    }
        +
        +                    // Discard index placeholder values to get only actual matches
        +                    setMatched = condense( setMatched );
        +                }
        +
        +                // Add matches to results
        +                push.apply( results, setMatched );
        +
        +                // Seedless set matches succeeding multiple successful matchers stipulate sorting
        +                if ( outermost && !seed && setMatched.length > 0 &&
        +                    ( matchedCount + setMatchers.length ) > 1 ) {
        +
        +                    Sizzle.uniqueSort( results );
        +                }
        +            }
        +
        +            // Override manipulation of globals by nested matchers
        +            if ( outermost ) {
        +                dirruns = dirrunsUnique;
        +                outermostContext = contextBackup;
        +            }
        +
        +            return unmatched;
        +        };
        +
        +    return bySet ?
        +        markFunction( superMatcher ) :
        +        superMatcher;
        +}
        +
        +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
        +    var i,
        +        setMatchers = [],
        +        elementMatchers = [],
        +        cached = compilerCache[ selector + " " ];
        +
        +    if ( !cached ) {
        +        // Generate a function of recursive functions that can be used to check each element
        +        if ( !group ) {
        +            group = tokenize( selector );
        +        }
        +        i = group.length;
        +        while ( i-- ) {
        +            cached = matcherFromTokens( group[i] );
        +            if ( cached[ expando ] ) {
        +                setMatchers.push( cached );
        +            } else {
        +                elementMatchers.push( cached );
        +            }
        +        }
        +
        +        // Cache the compiled function
        +        cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
        +    }
        +    return cached;
        +};
        +
        +function multipleContexts( selector, contexts, results ) {
        +    var i = 0,
        +        len = contexts.length;
        +    for ( ; i < len; i++ ) {
        +        Sizzle( selector, contexts[i], results );
        +    }
        +    return results;
        +}
        +
        +function select( selector, context, results, seed ) {
        +    var i, tokens, token, type, find,
        +        match = tokenize( selector );
        +
        +    if ( !seed ) {
        +        // Try to minimize operations if there is only one group
        +        if ( match.length === 1 ) {
        +
        +            // Take a shortcut and set the context if the root selector is an ID
        +            tokens = match[0] = match[0].slice( 0 );
        +            if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
        +                    context.nodeType === 9 && !documentIsXML &&
        +                    Expr.relative[ tokens[1].type ] ) {
        +
        +                context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
        +                if ( !context ) {
        +                    return results;
        +                }
        +
        +                selector = selector.slice( tokens.shift().value.length );
        +            }
        +
        +            // Fetch a seed set for right-to-left matching
        +            i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
        +            while ( i-- ) {
        +                token = tokens[i];
        +
        +                // Abort if we hit a combinator
        +                if ( Expr.relative[ (type = token.type) ] ) {
        +                    break;
        +                }
        +                if ( (find = Expr.find[ type ]) ) {
        +                    // Search, expanding context for leading sibling combinators
        +                    if ( (seed = find(
        +                        token.matches[0].replace( runescape, funescape ),
        +                        rsibling.test( tokens[0].type ) && context.parentNode || context
        +                    )) ) {
        +
        +                        // If seed is empty or no tokens remain, we can return early
        +                        tokens.splice( i, 1 );
        +                        selector = seed.length && toSelector( tokens );
        +                        if ( !selector ) {
        +                            push.apply( results, slice.call( seed, 0 ) );
        +                            return results;
        +                        }
        +
        +                        break;
        +                    }
        +                }
        +            }
        +        }
        +    }
        +
        +    // Compile and execute a filtering function
        +    // Provide `match` to avoid retokenization if we modified the selector above
        +    compile( selector, match )(
        +        seed,
        +        context,
        +        documentIsXML,
        +        results,
        +        rsibling.test( selector )
        +    );
        +    return results;
        +}
        +
        +// Deprecated
        +Expr.pseudos["nth"] = Expr.pseudos["eq"];
        +
        +// Easy API for creating new setFilters
        +function setFilters() {}
        +Expr.filters = setFilters.prototype = Expr.pseudos;
        +Expr.setFilters = new setFilters();
        +
        +// Initialize with the default document
        +setDocument();
        +
        +// Override sizzle attribute retrieval
        +Sizzle.attr = jQuery.attr;
        +jQuery.find = Sizzle;
        +jQuery.expr = Sizzle.selectors;
        +jQuery.expr[":"] = jQuery.expr.pseudos;
        +jQuery.unique = Sizzle.uniqueSort;
        +jQuery.text = Sizzle.getText;
        +jQuery.isXMLDoc = Sizzle.isXML;
        +jQuery.contains = Sizzle.contains;
        +
        +
        +})( window );
        +var runtil = /Until$/,
        +    rparentsprev = /^(?:parents|prev(?:Until|All))/,
        +    isSimple = /^.[^:#\[\.,]*$/,
        +    rneedsContext = jQuery.expr.match.needsContext,
        +    // methods guaranteed to produce a unique set when starting from a unique set
        +    guaranteedUnique = {
        +        children: true,
        +        contents: true,
        +        next: true,
        +        prev: true
        +    };
        +
        +jQuery.fn.extend({
        +    find: function( selector ) {
        +        var i, ret, self,
        +            len = this.length;
        +
        +        if ( typeof selector !== "string" ) {
        +            self = this;
        +            return this.pushStack( jQuery( selector ).filter(function() {
        +                for ( i = 0; i < len; i++ ) {
        +                    if ( jQuery.contains( self[ i ], this ) ) {
        +                        return true;
        +                    }
        +                }
        +            }) );
        +        }
        +
        +        ret = [];
        +        for ( i = 0; i < len; i++ ) {
        +            jQuery.find( selector, this[ i ], ret );
        +        }
        +
        +        // Needed because $( selector, context ) becomes $( context ).find( selector )
        +        ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
        +        ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
        +        return ret;
        +    },
        +
        +    has: function( target ) {
        +        var i,
        +            targets = jQuery( target, this ),
        +            len = targets.length;
        +
        +        return this.filter(function() {
        +            for ( i = 0; i < len; i++ ) {
        +                if ( jQuery.contains( this, targets[i] ) ) {
        +                    return true;
        +                }
        +            }
        +        });
        +    },
        +
        +    not: function( selector ) {
        +        return this.pushStack( winnow(this, selector, false) );
        +    },
        +
        +    filter: function( selector ) {
        +        return this.pushStack( winnow(this, selector, true) );
        +    },
        +
        +    is: function( selector ) {
        +        return !!selector && (
        +            typeof selector === "string" ?
        +                // If this is a positional/relative selector, check membership in the returned set
        +                // so $("p:first").is("p:last") won't return true for a doc with two "p".
        +                rneedsContext.test( selector ) ?
        +                    jQuery( selector, this.context ).index( this[0] ) >= 0 :
        +                    jQuery.filter( selector, this ).length > 0 :
        +                this.filter( selector ).length > 0 );
        +    },
        +
        +    closest: function( selectors, context ) {
        +        var cur,
        +            i = 0,
        +            l = this.length,
        +            ret = [],
        +            pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
        +                jQuery( selectors, context || this.context ) :
        +                0;
        +
        +        for ( ; i < l; i++ ) {
        +            cur = this[i];
        +
        +            while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
        +                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
        +                    ret.push( cur );
        +                    break;
        +                }
        +                cur = cur.parentNode;
        +            }
        +        }
        +
        +        return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
        +    },
        +
        +    // Determine the position of an element within
        +    // the matched set of elements
        +    index: function( elem ) {
        +
        +        // No argument, return index in parent
        +        if ( !elem ) {
        +            return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
        +        }
        +
        +        // index in selector
        +        if ( typeof elem === "string" ) {
        +            return jQuery.inArray( this[0], jQuery( elem ) );
        +        }
        +
        +        // Locate the position of the desired element
        +        return jQuery.inArray(
        +            // If it receives a jQuery object, the first element is used
        +            elem.jquery ? elem[0] : elem, this );
        +    },
        +
        +    add: function( selector, context ) {
        +        var set = typeof selector === "string" ?
        +                jQuery( selector, context ) :
        +                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
        +            all = jQuery.merge( this.get(), set );
        +
        +        return this.pushStack( jQuery.unique(all) );
        +    },
        +
        +    addBack: function( selector ) {
        +        return this.add( selector == null ?
        +            this.prevObject : this.prevObject.filter(selector)
        +        );
        +    }
        +});
        +
        +jQuery.fn.andSelf = jQuery.fn.addBack;
        +
        +function sibling( cur, dir ) {
        +    do {
        +        cur = cur[ dir ];
        +    } while ( cur && cur.nodeType !== 1 );
        +
        +    return cur;
        +}
        +
        +jQuery.each({
        +    parent: function( elem ) {
        +        var parent = elem.parentNode;
        +        return parent && parent.nodeType !== 11 ? parent : null;
        +    },
        +    parents: function( elem ) {
        +        return jQuery.dir( elem, "parentNode" );
        +    },
        +    parentsUntil: function( elem, i, until ) {
        +        return jQuery.dir( elem, "parentNode", until );
        +    },
        +    next: function( elem ) {
        +        return sibling( elem, "nextSibling" );
        +    },
        +    prev: function( elem ) {
        +        return sibling( elem, "previousSibling" );
        +    },
        +    nextAll: function( elem ) {
        +        return jQuery.dir( elem, "nextSibling" );
        +    },
        +    prevAll: function( elem ) {
        +        return jQuery.dir( elem, "previousSibling" );
        +    },
        +    nextUntil: function( elem, i, until ) {
        +        return jQuery.dir( elem, "nextSibling", until );
        +    },
        +    prevUntil: function( elem, i, until ) {
        +        return jQuery.dir( elem, "previousSibling", until );
        +    },
        +    siblings: function( elem ) {
        +        return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
        +    },
        +    children: function( elem ) {
        +        return jQuery.sibling( elem.firstChild );
        +    },
        +    contents: function( elem ) {
        +        return jQuery.nodeName( elem, "iframe" ) ?
        +            elem.contentDocument || elem.contentWindow.document :
        +            jQuery.merge( [], elem.childNodes );
        +    }
        +}, function( name, fn ) {
        +    jQuery.fn[ name ] = function( until, selector ) {
        +        var ret = jQuery.map( this, fn, until );
        +
        +        if ( !runtil.test( name ) ) {
        +            selector = until;
        +        }
        +
        +        if ( selector && typeof selector === "string" ) {
        +            ret = jQuery.filter( selector, ret );
        +        }
        +
        +        ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
        +
        +        if ( this.length > 1 && rparentsprev.test( name ) ) {
        +            ret = ret.reverse();
        +        }
        +
        +        return this.pushStack( ret );
        +    };
        +});
        +
        +jQuery.extend({
        +    filter: function( expr, elems, not ) {
        +        if ( not ) {
        +            expr = ":not(" + expr + ")";
        +        }
        +
        +        return elems.length === 1 ?
        +            jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
        +            jQuery.find.matches(expr, elems);
        +    },
        +
        +    dir: function( elem, dir, until ) {
        +        var matched = [],
        +            cur = elem[ dir ];
        +
        +        while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
        +            if ( cur.nodeType === 1 ) {
        +                matched.push( cur );
        +            }
        +            cur = cur[dir];
        +        }
        +        return matched;
        +    },
        +
        +    sibling: function( n, elem ) {
        +        var r = [];
        +
        +        for ( ; n; n = n.nextSibling ) {
        +            if ( n.nodeType === 1 && n !== elem ) {
        +                r.push( n );
        +            }
        +        }
        +
        +        return r;
        +    }
        +});
        +
        +// Implement the identical functionality for filter and not
        +function winnow( elements, qualifier, keep ) {
        +
        +    // Can't pass null or undefined to indexOf in Firefox 4
        +    // Set to 0 to skip string check
        +    qualifier = qualifier || 0;
        +
        +    if ( jQuery.isFunction( qualifier ) ) {
        +        return jQuery.grep(elements, function( elem, i ) {
        +            var retVal = !!qualifier.call( elem, i, elem );
        +            return retVal === keep;
        +        });
        +
        +    } else if ( qualifier.nodeType ) {
        +        return jQuery.grep(elements, function( elem ) {
        +            return ( elem === qualifier ) === keep;
        +        });
        +
        +    } else if ( typeof qualifier === "string" ) {
        +        var filtered = jQuery.grep(elements, function( elem ) {
        +            return elem.nodeType === 1;
        +        });
        +
        +        if ( isSimple.test( qualifier ) ) {
        +            return jQuery.filter(qualifier, filtered, !keep);
        +        } else {
        +            qualifier = jQuery.filter( qualifier, filtered );
        +        }
        +    }
        +
        +    return jQuery.grep(elements, function( elem ) {
        +        return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
        +    });
        +}
        +function createSafeFragment( document ) {
        +    var list = nodeNames.split( "|" ),
        +        safeFrag = document.createDocumentFragment();
        +
        +    if ( safeFrag.createElement ) {
        +        while ( list.length ) {
        +            safeFrag.createElement(
        +                list.pop()
        +            );
        +        }
        +    }
        +    return safeFrag;
        +}
        +
        +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
        +        "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
        +    rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
        +    rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
        +    rleadingWhitespace = /^\s+/,
        +    rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
        +    rtagName = /<([\w:]+)/,
        +    rtbody = /<tbody/i,
        +    rhtml = /<|&#?\w+;/,
        +    rnoInnerhtml = /<(?:script|style|link)/i,
        +    manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
        +    // checked="checked" or checked
        +    rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        +    rscriptType = /^$|\/(?:java|ecma)script/i,
        +    rscriptTypeMasked = /^true\/(.*)/,
        +    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
        +
        +    // We have to close these tags to support XHTML (#13200)
        +    wrapMap = {
        +        option: [ 1, "<select multiple='multiple'>", "</select>" ],
        +        legend: [ 1, "<fieldset>", "</fieldset>" ],
        +        area: [ 1, "<map>", "</map>" ],
        +        param: [ 1, "<object>", "</object>" ],
        +        thead: [ 1, "<table>", "</table>" ],
        +        tr: [ 2, "<table><tbody>", "</tbody></table>" ],
        +        col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
        +        td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
        +
        +        // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
        +        // unless wrapped in a div with non-breaking characters in front of it.
        +        _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
        +    },
        +    safeFragment = createSafeFragment( document ),
        +    fragmentDiv = safeFragment.appendChild( document.createElement("div") );
        +
        +wrapMap.optgroup = wrapMap.option;
        +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
        +wrapMap.th = wrapMap.td;
        +
        +jQuery.fn.extend({
        +    text: function( value ) {
        +        return jQuery.access( this, function( value ) {
        +            return value === undefined ?
        +                jQuery.text( this ) :
        +                this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
        +        }, null, value, arguments.length );
        +    },
        +
        +    wrapAll: function( html ) {
        +        if ( jQuery.isFunction( html ) ) {
        +            return this.each(function(i) {
        +                jQuery(this).wrapAll( html.call(this, i) );
        +            });
        +        }
        +
        +        if ( this[0] ) {
        +            // The elements to wrap the target around
        +            var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
        +
        +            if ( this[0].parentNode ) {
        +                wrap.insertBefore( this[0] );
        +            }
        +
        +            wrap.map(function() {
        +                var elem = this;
        +
        +                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
        +                    elem = elem.firstChild;
        +                }
        +
        +                return elem;
        +            }).append( this );
        +        }
        +
        +        return this;
        +    },
        +
        +    wrapInner: function( html ) {
        +        if ( jQuery.isFunction( html ) ) {
        +            return this.each(function(i) {
        +                jQuery(this).wrapInner( html.call(this, i) );
        +            });
        +        }
        +
        +        return this.each(function() {
        +            var self = jQuery( this ),
        +                contents = self.contents();
        +
        +            if ( contents.length ) {
        +                contents.wrapAll( html );
        +
        +            } else {
        +                self.append( html );
        +            }
        +        });
        +    },
        +
        +    wrap: function( html ) {
        +        var isFunction = jQuery.isFunction( html );
        +
        +        return this.each(function(i) {
        +            jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
        +        });
        +    },
        +
        +    unwrap: function() {
        +        return this.parent().each(function() {
        +            if ( !jQuery.nodeName( this, "body" ) ) {
        +                jQuery( this ).replaceWith( this.childNodes );
        +            }
        +        }).end();
        +    },
        +
        +    append: function() {
        +        return this.domManip(arguments, true, function( elem ) {
        +            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +                this.appendChild( elem );
        +            }
        +        });
        +    },
        +
        +    prepend: function() {
        +        return this.domManip(arguments, true, function( elem ) {
        +            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
        +                this.insertBefore( elem, this.firstChild );
        +            }
        +        });
        +    },
        +
        +    before: function() {
        +        return this.domManip( arguments, false, function( elem ) {
        +            if ( this.parentNode ) {
        +                this.parentNode.insertBefore( elem, this );
        +            }
        +        });
        +    },
        +
        +    after: function() {
        +        return this.domManip( arguments, false, function( elem ) {
        +            if ( this.parentNode ) {
        +                this.parentNode.insertBefore( elem, this.nextSibling );
        +            }
        +        });
        +    },
        +
        +    // keepData is for internal use only--do not document
        +    remove: function( selector, keepData ) {
        +        var elem,
        +            i = 0;
        +
        +        for ( ; (elem = this[i]) != null; i++ ) {
        +            if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
        +                if ( !keepData && elem.nodeType === 1 ) {
        +                    jQuery.cleanData( getAll( elem ) );
        +                }
        +
        +                if ( elem.parentNode ) {
        +                    if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
        +                        setGlobalEval( getAll( elem, "script" ) );
        +                    }
        +                    elem.parentNode.removeChild( elem );
        +                }
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    empty: function() {
        +        var elem,
        +            i = 0;
        +
        +        for ( ; (elem = this[i]) != null; i++ ) {
        +            // Remove element nodes and prevent memory leaks
        +            if ( elem.nodeType === 1 ) {
        +                jQuery.cleanData( getAll( elem, false ) );
        +            }
        +
        +            // Remove any remaining nodes
        +            while ( elem.firstChild ) {
        +                elem.removeChild( elem.firstChild );
        +            }
        +
        +            // If this is a select, ensure that it displays empty (#12336)
        +            // Support: IE<9
        +            if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
        +                elem.options.length = 0;
        +            }
        +        }
        +
        +        return this;
        +    },
        +
        +    clone: function( dataAndEvents, deepDataAndEvents ) {
        +        dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
        +        deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
        +
        +        return this.map( function () {
        +            return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
        +        });
        +    },
        +
        +    html: function( value ) {
        +        return jQuery.access( this, function( value ) {
        +            var elem = this[0] || {},
        +                i = 0,
        +                l = this.length;
        +
        +            if ( value === undefined ) {
        +                return elem.nodeType === 1 ?
        +                    elem.innerHTML.replace( rinlinejQuery, "" ) :
        +                    undefined;
        +            }
        +
        +            // See if we can take a shortcut and just use innerHTML
        +            if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        +                ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
        +                ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
        +                !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
        +
        +                value = value.replace( rxhtmlTag, "<$1></$2>" );
        +
        +                try {
        +                    for (; i < l; i++ ) {
        +                        // Remove element nodes and prevent memory leaks
        +                        elem = this[i] || {};
        +                        if ( elem.nodeType === 1 ) {
        +                            jQuery.cleanData( getAll( elem, false ) );
        +                            elem.innerHTML = value;
        +                        }
        +                    }
        +
        +                    elem = 0;
        +
        +                // If using innerHTML throws an exception, use the fallback method
        +                } catch(e) {}
        +            }
        +
        +            if ( elem ) {
        +                this.empty().append( value );
        +            }
        +        }, null, value, arguments.length );
        +    },
        +
        +    replaceWith: function( value ) {
        +        var isFunc = jQuery.isFunction( value );
        +
        +        // Make sure that the elements are removed from the DOM before they are inserted
        +        // this can help fix replacing a parent with child elements
        +        if ( !isFunc && typeof value !== "string" ) {
        +            value = jQuery( value ).not( this ).detach();
        +        }
        +
        +        return this.domManip( [ value ], true, function( elem ) {
        +            var next = this.nextSibling,
        +                parent = this.parentNode;
        +
        +            if ( parent ) {
        +                jQuery( this ).remove();
        +                parent.insertBefore( elem, next );
        +            }
        +        });
        +    },
        +
        +    detach: function( selector ) {
        +        return this.remove( selector, true );
        +    },
        +
        +    domManip: function( args, table, callback ) {
        +
        +        // Flatten any nested arrays
        +        args = core_concat.apply( [], args );
        +
        +        var first, node, hasScripts,
        +            scripts, doc, fragment,
        +            i = 0,
        +            l = this.length,
        +            set = this,
        +            iNoClone = l - 1,
        +            value = args[0],
        +            isFunction = jQuery.isFunction( value );
        +
        +        // We can't cloneNode fragments that contain checked, in WebKit
        +        if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
        +            return this.each(function( index ) {
        +                var self = set.eq( index );
        +                if ( isFunction ) {
        +                    args[0] = value.call( this, index, table ? self.html() : undefined );
        +                }
        +                self.domManip( args, table, callback );
        +            });
        +        }
        +
        +        if ( l ) {
        +            fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
        +            first = fragment.firstChild;
        +
        +            if ( fragment.childNodes.length === 1 ) {
        +                fragment = first;
        +            }
        +
        +            if ( first ) {
        +                table = table && jQuery.nodeName( first, "tr" );
        +                scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
        +                hasScripts = scripts.length;
        +
        +                // Use the original fragment for the last item instead of the first because it can end up
        +                // being emptied incorrectly in certain situations (#8070).
        +                for ( ; i < l; i++ ) {
        +                    node = fragment;
        +
        +                    if ( i !== iNoClone ) {
        +                        node = jQuery.clone( node, true, true );
        +
        +                        // Keep references to cloned scripts for later restoration
        +                        if ( hasScripts ) {
        +                            jQuery.merge( scripts, getAll( node, "script" ) );
        +                        }
        +                    }
        +
        +                    callback.call(
        +                        table && jQuery.nodeName( this[i], "table" ) ?
        +                            findOrAppend( this[i], "tbody" ) :
        +                            this[i],
        +                        node,
        +                        i
        +                    );
        +                }
        +
        +                if ( hasScripts ) {
        +                    doc = scripts[ scripts.length - 1 ].ownerDocument;
        +
        +                    // Reenable scripts
        +                    jQuery.map( scripts, restoreScript );
        +
        +                    // Evaluate executable scripts on first document insertion
        +                    for ( i = 0; i < hasScripts; i++ ) {
        +                        node = scripts[ i ];
        +                        if ( rscriptType.test( node.type || "" ) &&
        +                            !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
        +
        +                            if ( node.src ) {
        +                                // Hope ajax is available...
        +                                jQuery.ajax({
        +                                    url: node.src,
        +                                    type: "GET",
        +                                    dataType: "script",
        +                                    async: false,
        +                                    global: false,
        +                                    "throws": true
        +                                });
        +                            } else {
        +                                jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                // Fix #11809: Avoid leaking memory
        +                fragment = first = null;
        +            }
        +        }
        +
        +        return this;
        +    }
        +});
        +
        +function findOrAppend( elem, tag ) {
        +    return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
        +}
        +
        +// Replace/restore the type attribute of script elements for safe DOM manipulation
        +function disableScript( elem ) {
        +    var attr = elem.getAttributeNode("type");
        +    elem.type = ( attr && attr.specified ) + "/" + elem.type;
        +    return elem;
        +}
        +function restoreScript( elem ) {
        +    var match = rscriptTypeMasked.exec( elem.type );
        +    if ( match ) {
        +        elem.type = match[1];
        +    } else {
        +        elem.removeAttribute("type");
        +    }
        +    return elem;
        +}
        +
        +// Mark scripts as having already been evaluated
        +function setGlobalEval( elems, refElements ) {
        +    var elem,
        +        i = 0;
        +    for ( ; (elem = elems[i]) != null; i++ ) {
        +        jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
        +    }
        +}
        +
        +function cloneCopyEvent( src, dest ) {
        +
        +    if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
        +        return;
        +    }
        +
        +    var type, i, l,
        +        oldData = jQuery._data( src ),
        +        curData = jQuery._data( dest, oldData ),
        +        events = oldData.events;
        +
        +    if ( events ) {
        +        delete curData.handle;
        +        curData.events = {};
        +
        +        for ( type in events ) {
        +            for ( i = 0, l = events[ type ].length; i < l; i++ ) {
        +                jQuery.event.add( dest, type, events[ type ][ i ] );
        +            }
        +        }
        +    }
        +
        +    // make the cloned public data object a copy from the original
        +    if ( curData.data ) {
        +        curData.data = jQuery.extend( {}, curData.data );
        +    }
        +}
        +
        +function fixCloneNodeIssues( src, dest ) {
        +    var nodeName, e, data;
        +
        +    // We do not need to do anything for non-Elements
        +    if ( dest.nodeType !== 1 ) {
        +        return;
        +    }
        +
        +    nodeName = dest.nodeName.toLowerCase();
        +
        +    // IE6-8 copies events bound via attachEvent when using cloneNode.
        +    if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
        +        data = jQuery._data( dest );
        +
        +        for ( e in data.events ) {
        +            jQuery.removeEvent( dest, e, data.handle );
        +        }
        +
        +        // Event data gets referenced instead of copied if the expando gets copied too
        +        dest.removeAttribute( jQuery.expando );
        +    }
        +
        +    // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
        +    if ( nodeName === "script" && dest.text !== src.text ) {
        +        disableScript( dest ).text = src.text;
        +        restoreScript( dest );
        +
        +    // IE6-10 improperly clones children of object elements using classid.
        +    // IE10 throws NoModificationAllowedError if parent is null, #12132.
        +    } else if ( nodeName === "object" ) {
        +        if ( dest.parentNode ) {
        +            dest.outerHTML = src.outerHTML;
        +        }
        +
        +        // This path appears unavoidable for IE9. When cloning an object
        +        // element in IE9, the outerHTML strategy above is not sufficient.
        +        // If the src has innerHTML and the destination does not,
        +        // copy the src.innerHTML into the dest.innerHTML. #10324
        +        if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
        +            dest.innerHTML = src.innerHTML;
        +        }
        +
        +    } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
        +        // IE6-8 fails to persist the checked state of a cloned checkbox
        +        // or radio button. Worse, IE6-7 fail to give the cloned element
        +        // a checked appearance if the defaultChecked value isn't also set
        +
        +        dest.defaultChecked = dest.checked = src.checked;
        +
        +        // IE6-7 get confused and end up setting the value of a cloned
        +        // checkbox/radio button to an empty string instead of "on"
        +        if ( dest.value !== src.value ) {
        +            dest.value = src.value;
        +        }
        +
        +    // IE6-8 fails to return the selected option to the default selected
        +    // state when cloning options
        +    } else if ( nodeName === "option" ) {
        +        dest.defaultSelected = dest.selected = src.defaultSelected;
        +
        +    // IE6-8 fails to set the defaultValue to the correct value when
        +    // cloning other types of input fields
        +    } else if ( nodeName === "input" || nodeName === "textarea" ) {
        +        dest.defaultValue = src.defaultValue;
        +    }
        +}
        +
        +jQuery.each({
        +    appendTo: "append",
        +    prependTo: "prepend",
        +    insertBefore: "before",
        +    insertAfter: "after",
        +    replaceAll: "replaceWith"
        +}, function( name, original ) {
        +    jQuery.fn[ name ] = function( selector ) {
        +        var elems,
        +            i = 0,
        +            ret = [],
        +            insert = jQuery( selector ),
        +            last = insert.length - 1;
        +
        +        for ( ; i <= last; i++ ) {
        +            elems = i === last ? this : this.clone(true);
        +            jQuery( insert[i] )[ original ]( elems );
        +
        +            // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
        +            core_push.apply( ret, elems.get() );
        +        }
        +
        +        return this.pushStack( ret );
        +    };
        +});
        +
        +function getAll( context, tag ) {
        +    var elems, elem,
        +        i = 0,
        +        found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
        +            typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
        +            undefined;
        +
        +    if ( !found ) {
        +        for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
        +            if ( !tag || jQuery.nodeName( elem, tag ) ) {
        +                found.push( elem );
        +            } else {
        +                jQuery.merge( found, getAll( elem, tag ) );
        +            }
        +        }
        +    }
        +
        +    return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
        +        jQuery.merge( [ context ], found ) :
        +        found;
        +}
        +
        +// Used in buildFragment, fixes the defaultChecked property
        +function fixDefaultChecked( elem ) {
        +    if ( manipulation_rcheckableType.test( elem.type ) ) {
        +        elem.defaultChecked = elem.checked;
        +    }
        +}
        +
        +jQuery.extend({
        +    clone: function( elem, dataAndEvents, deepDataAndEvents ) {
        +        var destElements, node, clone, i, srcElements,
        +            inPage = jQuery.contains( elem.ownerDocument, elem );
        +
        +        if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
        +            clone = elem.cloneNode( true );
        +
        +        // IE<=8 does not properly clone detached, unknown element nodes
        +        } else {
        +            fragmentDiv.innerHTML = elem.outerHTML;
        +            fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
        +        }
        +
        +        if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
        +                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
        +
        +            // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
        +            destElements = getAll( clone );
        +            srcElements = getAll( elem );
        +
        +            // Fix all IE cloning issues
        +            for ( i = 0; (node = srcElements[i]) != null; ++i ) {
        +                // Ensure that the destination node is not null; Fixes #9587
        +                if ( destElements[i] ) {
        +                    fixCloneNodeIssues( node, destElements[i] );
        +                }
        +            }
        +        }
        +
        +        // Copy the events from the original to the clone
        +        if ( dataAndEvents ) {
        +            if ( deepDataAndEvents ) {
        +                srcElements = srcElements || getAll( elem );
        +                destElements = destElements || getAll( clone );
        +
        +                for ( i = 0; (node = srcElements[i]) != null; i++ ) {
        +                    cloneCopyEvent( node, destElements[i] );
        +                }
        +            } else {
        +                cloneCopyEvent( elem, clone );
        +            }
        +        }
        +
        +        // Preserve script evaluation history
        +        destElements = getAll( clone, "script" );
        +        if ( destElements.length > 0 ) {
        +            setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
        +        }
        +
        +        destElements = srcElements = node = null;
        +
        +        // Return the cloned set
        +        return clone;
        +    },
        +
        +    buildFragment: function( elems, context, scripts, selection ) {
        +        var j, elem, contains,
        +            tmp, tag, tbody, wrap,
        +            l = elems.length,
        +
        +            // Ensure a safe fragment
        +            safe = createSafeFragment( context ),
        +
        +            nodes = [],
        +            i = 0;
        +
        +        for ( ; i < l; i++ ) {
        +            elem = elems[ i ];
        +
        +            if ( elem || elem === 0 ) {
        +
        +                // Add nodes directly
        +                if ( jQuery.type( elem ) === "object" ) {
        +                    jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
        +
        +                // Convert non-html into a text node
        +                } else if ( !rhtml.test( elem ) ) {
        +                    nodes.push( context.createTextNode( elem ) );
        +
        +                // Convert html into DOM nodes
        +                } else {
        +                    tmp = tmp || safe.appendChild( context.createElement("div") );
        +
        +                    // Deserialize a standard representation
        +                    tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
        +                    wrap = wrapMap[ tag ] || wrapMap._default;
        +
        +                    tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
        +
        +                    // Descend through wrappers to the right content
        +                    j = wrap[0];
        +                    while ( j-- ) {
        +                        tmp = tmp.lastChild;
        +                    }
        +
        +                    // Manually add leading whitespace removed by IE
        +                    if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
        +                        nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
        +                    }
        +
        +                    // Remove IE's autoinserted <tbody> from table fragments
        +                    if ( !jQuery.support.tbody ) {
        +
        +                        // String was a <table>, *may* have spurious <tbody>
        +                        elem = tag === "table" && !rtbody.test( elem ) ?
        +                            tmp.firstChild :
        +
        +                            // String was a bare <thead> or <tfoot>
        +                            wrap[1] === "<table>" && !rtbody.test( elem ) ?
        +                                tmp :
        +                                0;
        +
        +                        j = elem && elem.childNodes.length;
        +                        while ( j-- ) {
        +                            if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
        +                                elem.removeChild( tbody );
        +                            }
        +                        }
        +                    }
        +
        +                    jQuery.merge( nodes, tmp.childNodes );
        +
        +                    // Fix #12392 for WebKit and IE > 9
        +                    tmp.textContent = "";
        +
        +                    // Fix #12392 for oldIE
        +                    while ( tmp.firstChild ) {
        +                        tmp.removeChild( tmp.firstChild );
        +                    }
        +
        +                    // Remember the top-level container for proper cleanup
        +                    tmp = safe.lastChild;
        +                }
        +            }
        +        }
        +
        +        // Fix #11356: Clear elements from fragment
        +        if ( tmp ) {
        +            safe.removeChild( tmp );
        +        }
        +
        +        // Reset defaultChecked for any radios and checkboxes
        +        // about to be appended to the DOM in IE 6/7 (#8060)
        +        if ( !jQuery.support.appendChecked ) {
        +            jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
        +        }
        +
        +        i = 0;
        +        while ( (elem = nodes[ i++ ]) ) {
        +
        +            // #4087 - If origin and destination elements are the same, and this is
        +            // that element, do not do anything
        +            if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
        +                continue;
        +            }
        +
        +            contains = jQuery.contains( elem.ownerDocument, elem );
        +
        +            // Append to fragment
        +            tmp = getAll( safe.appendChild( elem ), "script" );
        +
        +            // Preserve script evaluation history
        +            if ( contains ) {
        +                setGlobalEval( tmp );
        +            }
        +
        +            // Capture executables
        +            if ( scripts ) {
        +                j = 0;
        +                while ( (elem = tmp[ j++ ]) ) {
        +                    if ( rscriptType.test( elem.type || "" ) ) {
        +                        scripts.push( elem );
        +                    }
        +                }
        +            }
        +        }
        +
        +        tmp = null;
        +
        +        return safe;
        +    },
        +
        +    cleanData: function( elems, /* internal */ acceptData ) {
        +        var elem, type, id, data,
        +            i = 0,
        +            internalKey = jQuery.expando,
        +            cache = jQuery.cache,
        +            deleteExpando = jQuery.support.deleteExpando,
        +            special = jQuery.event.special;
        +
        +        for ( ; (elem = elems[i]) != null; i++ ) {
        +
        +            if ( acceptData || jQuery.acceptData( elem ) ) {
        +
        +                id = elem[ internalKey ];
        +                data = id && cache[ id ];
        +
        +                if ( data ) {
        +                    if ( data.events ) {
        +                        for ( type in data.events ) {
        +                            if ( special[ type ] ) {
        +                                jQuery.event.remove( elem, type );
        +
        +                            // This is a shortcut to avoid jQuery.event.remove's overhead
        +                            } else {
        +                                jQuery.removeEvent( elem, type, data.handle );
        +                            }
        +                        }
        +                    }
        +
        +                    // Remove cache only if it was not already removed by jQuery.event.remove
        +                    if ( cache[ id ] ) {
        +
        +                        delete cache[ id ];
        +
        +                        // IE does not allow us to delete expando properties from nodes,
        +                        // nor does it have a removeAttribute function on Document nodes;
        +                        // we must handle all of these cases
        +                        if ( deleteExpando ) {
        +                            delete elem[ internalKey ];
        +
        +                        } else if ( typeof elem.removeAttribute !== core_strundefined ) {
        +                            elem.removeAttribute( internalKey );
        +
        +                        } else {
        +                            elem[ internalKey ] = null;
        +                        }
        +
        +                        core_deletedIds.push( id );
        +                    }
        +                }
        +            }
        +        }
        +    }
        +});
        +var iframe, getStyles, curCSS,
        +    ralpha = /alpha\([^)]*\)/i,
        +    ropacity = /opacity\s*=\s*([^)]*)/,
        +    rposition = /^(top|right|bottom|left)$/,
        +    // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
        +    // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        +    rdisplayswap = /^(none|table(?!-c[ea]).+)/,
        +    rmargin = /^margin/,
        +    rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
        +    rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
        +    rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
        +    elemdisplay = { BODY: "block" },
        +
        +    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        +    cssNormalTransform = {
        +        letterSpacing: 0,
        +        fontWeight: 400
        +    },
        +
        +    cssExpand = [ "Top", "Right", "Bottom", "Left" ],
        +    cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
        +
        +// return a css property mapped to a potentially vendor prefixed property
        +function vendorPropName( style, name ) {
        +
        +    // shortcut for names that are not vendor prefixed
        +    if ( name in style ) {
        +        return name;
        +    }
        +
        +    // check for vendor prefixed names
        +    var capName = name.charAt(0).toUpperCase() + name.slice(1),
        +        origName = name,
        +        i = cssPrefixes.length;
        +
        +    while ( i-- ) {
        +        name = cssPrefixes[ i ] + capName;
        +        if ( name in style ) {
        +            return name;
        +        }
        +    }
        +
        +    return origName;
        +}
        +
        +function isHidden( elem, el ) {
        +    // isHidden might be called from jQuery#filter function;
        +    // in that case, element will be second argument
        +    elem = el || elem;
        +    return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
        +}
        +
        +function showHide( elements, show ) {
        +    var display, elem, hidden,
        +        values = [],
        +        index = 0,
        +        length = elements.length;
        +
        +    for ( ; index < length; index++ ) {
        +        elem = elements[ index ];
        +        if ( !elem.style ) {
        +            continue;
        +        }
        +
        +        values[ index ] = jQuery._data( elem, "olddisplay" );
        +        display = elem.style.display;
        +        if ( show ) {
        +            // Reset the inline display of this element to learn if it is
        +            // being hidden by cascaded rules or not
        +            if ( !values[ index ] && display === "none" ) {
        +                elem.style.display = "";
        +            }
        +
        +            // Set elements which have been overridden with display: none
        +            // in a stylesheet to whatever the default browser style is
        +            // for such an element
        +            if ( elem.style.display === "" && isHidden( elem ) ) {
        +                values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
        +            }
        +        } else {
        +
        +            if ( !values[ index ] ) {
        +                hidden = isHidden( elem );
        +
        +                if ( display && display !== "none" || !hidden ) {
        +                    jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
        +                }
        +            }
        +        }
        +    }
        +
        +    // Set the display of most of the elements in a second loop
        +    // to avoid the constant reflow
        +    for ( index = 0; index < length; index++ ) {
        +        elem = elements[ index ];
        +        if ( !elem.style ) {
        +            continue;
        +        }
        +        if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
        +            elem.style.display = show ? values[ index ] || "" : "none";
        +        }
        +    }
        +
        +    return elements;
        +}
        +
        +jQuery.fn.extend({
        +    css: function( name, value ) {
        +        return jQuery.access( this, function( elem, name, value ) {
        +            var len, styles,
        +                map = {},
        +                i = 0;
        +
        +            if ( jQuery.isArray( name ) ) {
        +                styles = getStyles( elem );
        +                len = name.length;
        +
        +                for ( ; i < len; i++ ) {
        +                    map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
        +                }
        +
        +                return map;
        +            }
        +
        +            return value !== undefined ?
        +                jQuery.style( elem, name, value ) :
        +                jQuery.css( elem, name );
        +        }, name, value, arguments.length > 1 );
        +    },
        +    show: function() {
        +        return showHide( this, true );
        +    },
        +    hide: function() {
        +        return showHide( this );
        +    },
        +    toggle: function( state ) {
        +        var bool = typeof state === "boolean";
        +
        +        return this.each(function() {
        +            if ( bool ? state : isHidden( this ) ) {
        +                jQuery( this ).show();
        +            } else {
        +                jQuery( this ).hide();
        +            }
        +        });
        +    }
        +});
        +
        +jQuery.extend({
        +    // Add in style property hooks for overriding the default
        +    // behavior of getting and setting a style property
        +    cssHooks: {
        +        opacity: {
        +            get: function( elem, computed ) {
        +                if ( computed ) {
        +                    // We should always get a number back from opacity
        +                    var ret = curCSS( elem, "opacity" );
        +                    return ret === "" ? "1" : ret;
        +                }
        +            }
        +        }
        +    },
        +
        +    // Exclude the following css properties to add px
        +    cssNumber: {
        +        "columnCount": true,
        +        "fillOpacity": true,
        +        "fontWeight": true,
        +        "lineHeight": true,
        +        "opacity": true,
        +        "orphans": true,
        +        "widows": true,
        +        "zIndex": true,
        +        "zoom": true
        +    },
        +
        +    // Add in properties whose names you wish to fix before
        +    // setting or getting the value
        +    cssProps: {
        +        // normalize float css property
        +        "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
        +    },
        +
        +    // Get and set the style property on a DOM Node
        +    style: function( elem, name, value, extra ) {
        +        // Don't set styles on text and comment nodes
        +        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        +            return;
        +        }
        +
        +        // Make sure that we're working with the right name
        +        var ret, type, hooks,
        +            origName = jQuery.camelCase( name ),
        +            style = elem.style;
        +
        +        name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
        +
        +        // gets hook for the prefixed version
        +        // followed by the unprefixed version
        +        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +        // Check if we're setting a value
        +        if ( value !== undefined ) {
        +            type = typeof value;
        +
        +            // convert relative number strings (+= or -=) to relative numbers. #7345
        +            if ( type === "string" && (ret = rrelNum.exec( value )) ) {
        +                value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
        +                // Fixes bug #9237
        +                type = "number";
        +            }
        +
        +            // Make sure that NaN and null values aren't set. See: #7116
        +            if ( value == null || type === "number" && isNaN( value ) ) {
        +                return;
        +            }
        +
        +            // If a number was passed in, add 'px' to the (except for certain CSS properties)
        +            if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
        +                value += "px";
        +            }
        +
        +            // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
        +            // but it would mean to define eight (for every problematic property) identical functions
        +            if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
        +                style[ name ] = "inherit";
        +            }
        +
        +            // If a hook was provided, use that value, otherwise just set the specified value
        +            if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
        +
        +                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
        +                // Fixes bug #5509
        +                try {
        +                    style[ name ] = value;
        +                } catch(e) {}
        +            }
        +
        +        } else {
        +            // If a hook was provided get the non-computed value from there
        +            if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
        +                return ret;
        +            }
        +
        +            // Otherwise just get the value from the style object
        +            return style[ name ];
        +        }
        +    },
        +
        +    css: function( elem, name, extra, styles ) {
        +        var num, val, hooks,
        +            origName = jQuery.camelCase( name );
        +
        +        // Make sure that we're working with the right name
        +        name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
        +
        +        // gets hook for the prefixed version
        +        // followed by the unprefixed version
        +        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
        +
        +        // If a hook was provided get the computed value from there
        +        if ( hooks && "get" in hooks ) {
        +            val = hooks.get( elem, true, extra );
        +        }
        +
        +        // Otherwise, if a way to get the computed value exists, use that
        +        if ( val === undefined ) {
        +            val = curCSS( elem, name, styles );
        +        }
        +
        +        //convert "normal" to computed value
        +        if ( val === "normal" && name in cssNormalTransform ) {
        +            val = cssNormalTransform[ name ];
        +        }
        +
        +        // Return, converting to number if forced or a qualifier was provided and val looks numeric
        +        if ( extra === "" || extra ) {
        +            num = parseFloat( val );
        +            return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
        +        }
        +        return val;
        +    },
        +
        +    // A method for quickly swapping in/out CSS properties to get correct calculations
        +    swap: function( elem, options, callback, args ) {
        +        var ret, name,
        +            old = {};
        +
        +        // Remember the old values, and insert the new ones
        +        for ( name in options ) {
        +            old[ name ] = elem.style[ name ];
        +            elem.style[ name ] = options[ name ];
        +        }
        +
        +        ret = callback.apply( elem, args || [] );
        +
        +        // Revert the old values
        +        for ( name in options ) {
        +            elem.style[ name ] = old[ name ];
        +        }
        +
        +        return ret;
        +    }
        +});
        +
        +// NOTE: we've included the "window" in window.getComputedStyle
        +// because jsdom on node.js will break without it.
        +if ( window.getComputedStyle ) {
        +    getStyles = function( elem ) {
        +        return window.getComputedStyle( elem, null );
        +    };
        +
        +    curCSS = function( elem, name, _computed ) {
        +        var width, minWidth, maxWidth,
        +            computed = _computed || getStyles( elem ),
        +
        +            // getPropertyValue is only needed for .css('filter') in IE9, see #12537
        +            ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
        +            style = elem.style;
        +
        +        if ( computed ) {
        +
        +            if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
        +                ret = jQuery.style( elem, name );
        +            }
        +
        +            // A tribute to the "awesome hack by Dean Edwards"
        +            // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
        +            // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
        +            // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
        +            if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
        +
        +                // Remember the original values
        +                width = style.width;
        +                minWidth = style.minWidth;
        +                maxWidth = style.maxWidth;
        +
        +                // Put in the new values to get a computed value out
        +                style.minWidth = style.maxWidth = style.width = ret;
        +                ret = computed.width;
        +
        +                // Revert the changed values
        +                style.width = width;
        +                style.minWidth = minWidth;
        +                style.maxWidth = maxWidth;
        +            }
        +        }
        +
        +        return ret;
        +    };
        +} else if ( document.documentElement.currentStyle ) {
        +    getStyles = function( elem ) {
        +        return elem.currentStyle;
        +    };
        +
        +    curCSS = function( elem, name, _computed ) {
        +        var left, rs, rsLeft,
        +            computed = _computed || getStyles( elem ),
        +            ret = computed ? computed[ name ] : undefined,
        +            style = elem.style;
        +
        +        // Avoid setting ret to empty string here
        +        // so we don't default to auto
        +        if ( ret == null && style && style[ name ] ) {
        +            ret = style[ name ];
        +        }
        +
        +        // From the awesome hack by Dean Edwards
        +        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
        +
        +        // If we're not dealing with a regular pixel number
        +        // but a number that has a weird ending, we need to convert it to pixels
        +        // but not position css attributes, as those are proportional to the parent element instead
        +        // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
        +        if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
        +
        +            // Remember the original values
        +            left = style.left;
        +            rs = elem.runtimeStyle;
        +            rsLeft = rs && rs.left;
        +
        +            // Put in the new values to get a computed value out
        +            if ( rsLeft ) {
        +                rs.left = elem.currentStyle.left;
        +            }
        +            style.left = name === "fontSize" ? "1em" : ret;
        +            ret = style.pixelLeft + "px";
        +
        +            // Revert the changed values
        +            style.left = left;
        +            if ( rsLeft ) {
        +                rs.left = rsLeft;
        +            }
        +        }
        +
        +        return ret === "" ? "auto" : ret;
        +    };
        +}
        +
        +function setPositiveNumber( elem, value, subtract ) {
        +    var matches = rnumsplit.exec( value );
        +    return matches ?
        +        // Guard against undefined "subtract", e.g., when used as in cssHooks
        +        Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
        +        value;
        +}
        +
        +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
        +    var i = extra === ( isBorderBox ? "border" : "content" ) ?
        +        // If we already have the right measurement, avoid augmentation
        +        4 :
        +        // Otherwise initialize for horizontal or vertical properties
        +        name === "width" ? 1 : 0,
        +
        +        val = 0;
        +
        +    for ( ; i < 4; i += 2 ) {
        +        // both box models exclude margin, so add it if we want it
        +        if ( extra === "margin" ) {
        +            val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
        +        }
        +
        +        if ( isBorderBox ) {
        +            // border-box includes padding, so remove it if we want content
        +            if ( extra === "content" ) {
        +                val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +            }
        +
        +            // at this point, extra isn't border nor margin, so remove border
        +            if ( extra !== "margin" ) {
        +                val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +            }
        +        } else {
        +            // at this point, extra isn't content, so add padding
        +            val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
        +
        +            // at this point, extra isn't content nor padding, so add border
        +            if ( extra !== "padding" ) {
        +                val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
        +            }
        +        }
        +    }
        +
        +    return val;
        +}
        +
        +function getWidthOrHeight( elem, name, extra ) {
        +
        +    // Start with offset property, which is equivalent to the border-box value
        +    var valueIsBorderBox = true,
        +        val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
        +        styles = getStyles( elem ),
        +        isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
        +
        +    // some non-html elements return undefined for offsetWidth, so check for null/undefined
        +    // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        +    // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        +    if ( val <= 0 || val == null ) {
        +        // Fall back to computed then uncomputed css if necessary
        +        val = curCSS( elem, name, styles );
        +        if ( val < 0 || val == null ) {
        +            val = elem.style[ name ];
        +        }
        +
        +        // Computed unit is not pixels. Stop here and return.
        +        if ( rnumnonpx.test(val) ) {
        +            return val;
        +        }
        +
        +        // we need the check for style in case a browser which returns unreliable values
        +        // for getComputedStyle silently falls back to the reliable elem.style
        +        valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
        +
        +        // Normalize "", auto, and prepare for extra
        +        val = parseFloat( val ) || 0;
        +    }
        +
        +    // use the active box-sizing model to add/subtract irrelevant styles
        +    return ( val +
        +        augmentWidthOrHeight(
        +            elem,
        +            name,
        +            extra || ( isBorderBox ? "border" : "content" ),
        +            valueIsBorderBox,
        +            styles
        +        )
        +    ) + "px";
        +}
        +
        +// Try to determine the default display value of an element
        +function css_defaultDisplay( nodeName ) {
        +    var doc = document,
        +        display = elemdisplay[ nodeName ];
        +
        +    if ( !display ) {
        +        display = actualDisplay( nodeName, doc );
        +
        +        // If the simple way fails, read from inside an iframe
        +        if ( display === "none" || !display ) {
        +            // Use the already-created iframe if possible
        +            iframe = ( iframe ||
        +                jQuery("<iframe frameborder='0' width='0' height='0'/>")
        +                .css( "cssText", "display:block !important" )
        +            ).appendTo( doc.documentElement );
        +
        +            // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
        +            doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
        +            doc.write("<!doctype html><html><body>");
        +            doc.close();
        +
        +            display = actualDisplay( nodeName, doc );
        +            iframe.detach();
        +        }
        +
        +        // Store the correct default display
        +        elemdisplay[ nodeName ] = display;
        +    }
        +
        +    return display;
        +}
        +
        +// Called ONLY from within css_defaultDisplay
        +function actualDisplay( name, doc ) {
        +    var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
        +        display = jQuery.css( elem[0], "display" );
        +    elem.remove();
        +    return display;
        +}
        +
        +jQuery.each([ "height", "width" ], function( i, name ) {
        +    jQuery.cssHooks[ name ] = {
        +        get: function( elem, computed, extra ) {
        +            if ( computed ) {
        +                // certain elements can have dimension info if we invisibly show them
        +                // however, it must have a current display style that would benefit from this
        +                return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
        +                    jQuery.swap( elem, cssShow, function() {
        +                        return getWidthOrHeight( elem, name, extra );
        +                    }) :
        +                    getWidthOrHeight( elem, name, extra );
        +            }
        +        },
        +
        +        set: function( elem, value, extra ) {
        +            var styles = extra && getStyles( elem );
        +            return setPositiveNumber( elem, value, extra ?
        +                augmentWidthOrHeight(
        +                    elem,
        +                    name,
        +                    extra,
        +                    jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
        +                    styles
        +                ) : 0
        +            );
        +        }
        +    };
        +});
        +
        +if ( !jQuery.support.opacity ) {
        +    jQuery.cssHooks.opacity = {
        +        get: function( elem, computed ) {
        +            // IE uses filters for opacity
        +            return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
        +                ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
        +                computed ? "1" : "";
        +        },
        +
        +        set: function( elem, value ) {
        +            var style = elem.style,
        +                currentStyle = elem.currentStyle,
        +                opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
        +                filter = currentStyle && currentStyle.filter || style.filter || "";
        +
        +            // IE has trouble with opacity if it does not have layout
        +            // Force it by setting the zoom level
        +            style.zoom = 1;
        +
        +            // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
        +            // if value === "", then remove inline opacity #12685
        +            if ( ( value >= 1 || value === "" ) &&
        +                    jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
        +                    style.removeAttribute ) {
        +
        +                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
        +                // if "filter:" is present at all, clearType is disabled, we want to avoid this
        +                // style.removeAttribute is IE Only, but so apparently is this code path...
        +                style.removeAttribute( "filter" );
        +
        +                // if there is no filter style applied in a css rule or unset inline opacity, we are done
        +                if ( value === "" || currentStyle && !currentStyle.filter ) {
        +                    return;
        +                }
        +            }
        +
        +            // otherwise, set new filter values
        +            style.filter = ralpha.test( filter ) ?
        +                filter.replace( ralpha, opacity ) :
        +                filter + " " + opacity;
        +        }
        +    };
        +}
        +
        +// These hooks cannot be added until DOM ready because the support test
        +// for it is not run until after DOM ready
        +jQuery(function() {
        +    if ( !jQuery.support.reliableMarginRight ) {
        +        jQuery.cssHooks.marginRight = {
        +            get: function( elem, computed ) {
        +                if ( computed ) {
        +                    // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
        +                    // Work around by temporarily setting element display to inline-block
        +                    return jQuery.swap( elem, { "display": "inline-block" },
        +                        curCSS, [ elem, "marginRight" ] );
        +                }
        +            }
        +        };
        +    }
        +
        +    // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
        +    // getComputedStyle returns percent when specified for top/left/bottom/right
        +    // rather than make the css module depend on the offset module, we just check for it here
        +    if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
        +        jQuery.each( [ "top", "left" ], function( i, prop ) {
        +            jQuery.cssHooks[ prop ] = {
        +                get: function( elem, computed ) {
        +                    if ( computed ) {
        +                        computed = curCSS( elem, prop );
        +                        // if curCSS returns percentage, fallback to offset
        +                        return rnumnonpx.test( computed ) ?
        +                            jQuery( elem ).position()[ prop ] + "px" :
        +                            computed;
        +                    }
        +                }
        +            };
        +        });
        +    }
        +
        +});
        +
        +if ( jQuery.expr && jQuery.expr.filters ) {
        +    jQuery.expr.filters.hidden = function( elem ) {
        +        // Support: Opera <= 12.12
        +        // Opera reports offsetWidths and offsetHeights less than zero on some elements
        +        return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
        +            (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
        +    };
        +
        +    jQuery.expr.filters.visible = function( elem ) {
        +        return !jQuery.expr.filters.hidden( elem );
        +    };
        +}
        +
        +// These hooks are used by animate to expand properties
        +jQuery.each({
        +    margin: "",
        +    padding: "",
        +    border: "Width"
        +}, function( prefix, suffix ) {
        +    jQuery.cssHooks[ prefix + suffix ] = {
        +        expand: function( value ) {
        +            var i = 0,
        +                expanded = {},
        +
        +                // assumes a single number if not a string
        +                parts = typeof value === "string" ? value.split(" ") : [ value ];
        +
        +            for ( ; i < 4; i++ ) {
        +                expanded[ prefix + cssExpand[ i ] + suffix ] =
        +                    parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
        +            }
        +
        +            return expanded;
        +        }
        +    };
        +
        +    if ( !rmargin.test( prefix ) ) {
        +        jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
        +    }
        +});
        +var r20 = /%20/g,
        +    rbracket = /\[\]$/,
        +    rCRLF = /\r?\n/g,
        +    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
        +    rsubmittable = /^(?:input|select|textarea|keygen)/i;
        +
        +jQuery.fn.extend({
        +    serialize: function() {
        +        return jQuery.param( this.serializeArray() );
        +    },
        +    serializeArray: function() {
        +        return this.map(function(){
        +            // Can add propHook for "elements" to filter or add form elements
        +            var elements = jQuery.prop( this, "elements" );
        +            return elements ? jQuery.makeArray( elements ) : this;
        +        })
        +        .filter(function(){
        +            var type = this.type;
        +            // Use .is(":disabled") so that fieldset[disabled] works
        +            return this.name && !jQuery( this ).is( ":disabled" ) &&
        +                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
        +                ( this.checked || !manipulation_rcheckableType.test( type ) );
        +        })
        +        .map(function( i, elem ){
        +            var val = jQuery( this ).val();
        +
        +            return val == null ?
        +                null :
        +                jQuery.isArray( val ) ?
        +                    jQuery.map( val, function( val ){
        +                        return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +                    }) :
        +                    { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        +        }).get();
        +    }
        +});
        +
        +//Serialize an array of form elements or a set of
        +//key/values into a query string
        +jQuery.param = function( a, traditional ) {
        +    var prefix,
        +        s = [],
        +        add = function( key, value ) {
        +            // If value is a function, invoke it and return its value
        +            value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
        +            s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
        +        };
        +
        +    // Set traditional to true for jQuery <= 1.3.3 behavior.
        +    if ( traditional === undefined ) {
        +        traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
        +    }
        +
        +    // If an array was passed in, assume that it is an array of form elements.
        +    if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        +        // Serialize the form elements
        +        jQuery.each( a, function() {
        +            add( this.name, this.value );
        +        });
        +
        +    } else {
        +        // If traditional, encode the "old" way (the way 1.3.3 or older
        +        // did it), otherwise encode params recursively.
        +        for ( prefix in a ) {
        +            buildParams( prefix, a[ prefix ], traditional, add );
        +        }
        +    }
        +
        +    // Return the resulting serialization
        +    return s.join( "&" ).replace( r20, "+" );
        +};
        +
        +function buildParams( prefix, obj, traditional, add ) {
        +    var name;
        +
        +    if ( jQuery.isArray( obj ) ) {
        +        // Serialize array item.
        +        jQuery.each( obj, function( i, v ) {
        +            if ( traditional || rbracket.test( prefix ) ) {
        +                // Treat each array item as a scalar.
        +                add( prefix, v );
        +
        +            } else {
        +                // Item is non-scalar (array or object), encode its numeric index.
        +                buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
        +            }
        +        });
        +
        +    } else if ( !traditional && jQuery.type( obj ) === "object" ) {
        +        // Serialize object item.
        +        for ( name in obj ) {
        +            buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
        +        }
        +
        +    } else {
        +        // Serialize scalar item.
        +        add( prefix, obj );
        +    }
        +}
        +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
        +    "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
        +    "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
        +
        +    // Handle event binding
        +    jQuery.fn[ name ] = function( data, fn ) {
        +        return arguments.length > 0 ?
        +            this.on( name, null, data, fn ) :
        +            this.trigger( name );
        +    };
        +});
        +
        +jQuery.fn.hover = function( fnOver, fnOut ) {
        +    return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        +};
        +var
        +    // Document location
        +    ajaxLocParts,
        +    ajaxLocation,
        +    ajax_nonce = jQuery.now(),
        +
        +    ajax_rquery = /\?/,
        +    rhash = /#.*$/,
        +    rts = /([?&])_=[^&]*/,
        +    rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
        +    // #7653, #8125, #8152: local protocol detection
        +    rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        +    rnoContent = /^(?:GET|HEAD)$/,
        +    rprotocol = /^\/\//,
        +    rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
        +
        +    // Keep a copy of the old load method
        +    _load = jQuery.fn.load,
        +
        +    /* Prefilters
        +     * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
        +     * 2) These are called:
        +     *    - BEFORE asking for a transport
        +     *    - AFTER param serialization (s.data is a string if s.processData is true)
        +     * 3) key is the dataType
        +     * 4) the catchall symbol "*" can be used
        +     * 5) execution will start with transport dataType and THEN continue down to "*" if needed
        +     */
        +    prefilters = {},
        +
        +    /* Transports bindings
        +     * 1) key is the dataType
        +     * 2) the catchall symbol "*" can be used
        +     * 3) selection will start with transport dataType and THEN go to "*" if needed
        +     */
        +    transports = {},
        +
        +    // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        +    allTypes = "*/".concat("*");
        +
        +// #8138, IE may throw an exception when accessing
        +// a field from window.location if document.domain has been set
        +try {
        +    ajaxLocation = location.href;
        +} catch( e ) {
        +    // Use the href attribute of an A element
        +    // since IE will modify it given document.location
        +    ajaxLocation = document.createElement( "a" );
        +    ajaxLocation.href = "";
        +    ajaxLocation = ajaxLocation.href;
        +}
        +
        +// Segment location into parts
        +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
        +
        +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
        +function addToPrefiltersOrTransports( structure ) {
        +
        +    // dataTypeExpression is optional and defaults to "*"
        +    return function( dataTypeExpression, func ) {
        +
        +        if ( typeof dataTypeExpression !== "string" ) {
        +            func = dataTypeExpression;
        +            dataTypeExpression = "*";
        +        }
        +
        +        var dataType,
        +            i = 0,
        +            dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
        +
        +        if ( jQuery.isFunction( func ) ) {
        +            // For each dataType in the dataTypeExpression
        +            while ( (dataType = dataTypes[i++]) ) {
        +                // Prepend if requested
        +                if ( dataType[0] === "+" ) {
        +                    dataType = dataType.slice( 1 ) || "*";
        +                    (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
        +
        +                // Otherwise append
        +                } else {
        +                    (structure[ dataType ] = structure[ dataType ] || []).push( func );
        +                }
        +            }
        +        }
        +    };
        +}
        +
        +// Base inspection function for prefilters and transports
        +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
        +
        +    var inspected = {},
        +        seekingTransport = ( structure === transports );
        +
        +    function inspect( dataType ) {
        +        var selected;
        +        inspected[ dataType ] = true;
        +        jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
        +            var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
        +            if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
        +                options.dataTypes.unshift( dataTypeOrTransport );
        +                inspect( dataTypeOrTransport );
        +                return false;
        +            } else if ( seekingTransport ) {
        +                return !( selected = dataTypeOrTransport );
        +            }
        +        });
        +        return selected;
        +    }
        +
        +    return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
        +}
        +
        +// A special extend for ajax options
        +// that takes "flat" options (not to be deep extended)
        +// Fixes #9887
        +function ajaxExtend( target, src ) {
        +    var deep, key,
        +        flatOptions = jQuery.ajaxSettings.flatOptions || {};
        +
        +    for ( key in src ) {
        +        if ( src[ key ] !== undefined ) {
        +            ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
        +        }
        +    }
        +    if ( deep ) {
        +        jQuery.extend( true, target, deep );
        +    }
        +
        +    return target;
        +}
        +
        +jQuery.fn.load = function( url, params, callback ) {
        +    if ( typeof url !== "string" && _load ) {
        +        return _load.apply( this, arguments );
        +    }
        +
        +    var selector, response, type,
        +        self = this,
        +        off = url.indexOf(" ");
        +
        +    if ( off >= 0 ) {
        +        selector = url.slice( off, url.length );
        +        url = url.slice( 0, off );
        +    }
        +
        +    // If it's a function
        +    if ( jQuery.isFunction( params ) ) {
        +
        +        // We assume that it's the callback
        +        callback = params;
        +        params = undefined;
        +
        +    // Otherwise, build a param string
        +    } else if ( params && typeof params === "object" ) {
        +        type = "POST";
        +    }
        +
        +    // If we have elements to modify, make the request
        +    if ( self.length > 0 ) {
        +        jQuery.ajax({
        +            url: url,
        +
        +            // if "type" variable is undefined, then "GET" method will be used
        +            type: type,
        +            dataType: "html",
        +            data: params
        +        }).done(function( responseText ) {
        +
        +            // Save response for use in complete callback
        +            response = arguments;
        +
        +            self.html( selector ?
        +
        +                // If a selector was specified, locate the right elements in a dummy div
        +                // Exclude scripts to avoid IE 'Permission Denied' errors
        +                jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
        +
        +                // Otherwise use the full result
        +                responseText );
        +
        +        }).complete( callback && function( jqXHR, status ) {
        +            self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
        +        });
        +    }
        +
        +    return this;
        +};
        +
        +// Attach a bunch of functions for handling common AJAX events
        +jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
        +    jQuery.fn[ type ] = function( fn ){
        +        return this.on( type, fn );
        +    };
        +});
        +
        +jQuery.each( [ "get", "post" ], function( i, method ) {
        +    jQuery[ method ] = function( url, data, callback, type ) {
        +        // shift arguments if data argument was omitted
        +        if ( jQuery.isFunction( data ) ) {
        +            type = type || callback;
        +            callback = data;
        +            data = undefined;
        +        }
        +
        +        return jQuery.ajax({
        +            url: url,
        +            type: method,
        +            dataType: type,
        +            data: data,
        +            success: callback
        +        });
        +    };
        +});
        +
        +jQuery.extend({
        +
        +    // Counter for holding the number of active queries
        +    active: 0,
        +
        +    // Last-Modified header cache for next request
        +    lastModified: {},
        +    etag: {},
        +
        +    ajaxSettings: {
        +        url: ajaxLocation,
        +        type: "GET",
        +        isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
        +        global: true,
        +        processData: true,
        +        async: true,
        +        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        +        /*
        +        timeout: 0,
        +        data: null,
        +        dataType: null,
        +        username: null,
        +        password: null,
        +        cache: null,
        +        throws: false,
        +        traditional: false,
        +        headers: {},
        +        */
        +
        +        accepts: {
        +            "*": allTypes,
        +            text: "text/plain",
        +            html: "text/html",
        +            xml: "application/xml, text/xml",
        +            json: "application/json, text/javascript"
        +        },
        +
        +        contents: {
        +            xml: /xml/,
        +            html: /html/,
        +            json: /json/
        +        },
        +
        +        responseFields: {
        +            xml: "responseXML",
        +            text: "responseText"
        +        },
        +
        +        // Data converters
        +        // Keys separate source (or catchall "*") and destination types with a single space
        +        converters: {
        +
        +            // Convert anything to text
        +            "* text": window.String,
        +
        +            // Text to html (true = no transformation)
        +            "text html": true,
        +
        +            // Evaluate text as a json expression
        +            "text json": jQuery.parseJSON,
        +
        +            // Parse text as xml
        +            "text xml": jQuery.parseXML
        +        },
        +
        +        // For options that shouldn't be deep extended:
        +        // you can add your own custom options here if
        +        // and when you create one that shouldn't be
        +        // deep extended (see ajaxExtend)
        +        flatOptions: {
        +            url: true,
        +            context: true
        +        }
        +    },
        +
        +    // Creates a full fledged settings object into target
        +    // with both ajaxSettings and settings fields.
        +    // If target is omitted, writes into ajaxSettings.
        +    ajaxSetup: function( target, settings ) {
        +        return settings ?
        +
        +            // Building a settings object
        +            ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
        +
        +            // Extending ajaxSettings
        +            ajaxExtend( jQuery.ajaxSettings, target );
        +    },
        +
        +    ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        +    ajaxTransport: addToPrefiltersOrTransports( transports ),
        +
        +    // Main method
        +    ajax: function( url, options ) {
        +
        +        // If url is an object, simulate pre-1.5 signature
        +        if ( typeof url === "object" ) {
        +            options = url;
        +            url = undefined;
        +        }
        +
        +        // Force options to be an object
        +        options = options || {};
        +
        +        var // Cross-domain detection vars
        +            parts,
        +            // Loop variable
        +            i,
        +            // URL without anti-cache param
        +            cacheURL,
        +            // Response headers as string
        +            responseHeadersString,
        +            // timeout handle
        +            timeoutTimer,
        +
        +            // To know if global events are to be dispatched
        +            fireGlobals,
        +
        +            transport,
        +            // Response headers
        +            responseHeaders,
        +            // Create the final options object
        +            s = jQuery.ajaxSetup( {}, options ),
        +            // Callbacks context
        +            callbackContext = s.context || s,
        +            // Context for global events is callbackContext if it is a DOM node or jQuery collection
        +            globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
        +                jQuery( callbackContext ) :
        +                jQuery.event,
        +            // Deferreds
        +            deferred = jQuery.Deferred(),
        +            completeDeferred = jQuery.Callbacks("once memory"),
        +            // Status-dependent callbacks
        +            statusCode = s.statusCode || {},
        +            // Headers (they are sent all at once)
        +            requestHeaders = {},
        +            requestHeadersNames = {},
        +            // The jqXHR state
        +            state = 0,
        +            // Default abort message
        +            strAbort = "canceled",
        +            // Fake xhr
        +            jqXHR = {
        +                readyState: 0,
        +
        +                // Builds headers hashtable if needed
        +                getResponseHeader: function( key ) {
        +                    var match;
        +                    if ( state === 2 ) {
        +                        if ( !responseHeaders ) {
        +                            responseHeaders = {};
        +                            while ( (match = rheaders.exec( responseHeadersString )) ) {
        +                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
        +                            }
        +                        }
        +                        match = responseHeaders[ key.toLowerCase() ];
        +                    }
        +                    return match == null ? null : match;
        +                },
        +
        +                // Raw string
        +                getAllResponseHeaders: function() {
        +                    return state === 2 ? responseHeadersString : null;
        +                },
        +
        +                // Caches the header
        +                setRequestHeader: function( name, value ) {
        +                    var lname = name.toLowerCase();
        +                    if ( !state ) {
        +                        name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
        +                        requestHeaders[ name ] = value;
        +                    }
        +                    return this;
        +                },
        +
        +                // Overrides response content-type header
        +                overrideMimeType: function( type ) {
        +                    if ( !state ) {
        +                        s.mimeType = type;
        +                    }
        +                    return this;
        +                },
        +
        +                // Status-dependent callbacks
        +                statusCode: function( map ) {
        +                    var code;
        +                    if ( map ) {
        +                        if ( state < 2 ) {
        +                            for ( code in map ) {
        +                                // Lazy-add the new callback in a way that preserves old ones
        +                                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
        +                            }
        +                        } else {
        +                            // Execute the appropriate callbacks
        +                            jqXHR.always( map[ jqXHR.status ] );
        +                        }
        +                    }
        +                    return this;
        +                },
        +
        +                // Cancel the request
        +                abort: function( statusText ) {
        +                    var finalText = statusText || strAbort;
        +                    if ( transport ) {
        +                        transport.abort( finalText );
        +                    }
        +                    done( 0, finalText );
        +                    return this;
        +                }
        +            };
        +
        +        // Attach deferreds
        +        deferred.promise( jqXHR ).complete = completeDeferred.add;
        +        jqXHR.success = jqXHR.done;
        +        jqXHR.error = jqXHR.fail;
        +
        +        // Remove hash character (#7531: and string promotion)
        +        // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
        +        // Handle falsy url in the settings object (#10093: consistency with old signature)
        +        // We also use the url parameter if available
        +        s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
        +
        +        // Alias method option to type as per ticket #12004
        +        s.type = options.method || options.type || s.method || s.type;
        +
        +        // Extract dataTypes list
        +        s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
        +
        +        // A cross-domain request is in order when we have a protocol:host:port mismatch
        +        if ( s.crossDomain == null ) {
        +            parts = rurl.exec( s.url.toLowerCase() );
        +            s.crossDomain = !!( parts &&
        +                ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
        +                    ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
        +                        ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
        +            );
        +        }
        +
        +        // Convert data if not already a string
        +        if ( s.data && s.processData && typeof s.data !== "string" ) {
        +            s.data = jQuery.param( s.data, s.traditional );
        +        }
        +
        +        // Apply prefilters
        +        inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
        +
        +        // If request was aborted inside a prefilter, stop there
        +        if ( state === 2 ) {
        +            return jqXHR;
        +        }
        +
        +        // We can fire global events as of now if asked to
        +        fireGlobals = s.global;
        +
        +        // Watch for a new set of requests
        +        if ( fireGlobals && jQuery.active++ === 0 ) {
        +            jQuery.event.trigger("ajaxStart");
        +        }
        +
        +        // Uppercase the type
        +        s.type = s.type.toUpperCase();
        +
        +        // Determine if request has content
        +        s.hasContent = !rnoContent.test( s.type );
        +
        +        // Save the URL in case we're toying with the If-Modified-Since
        +        // and/or If-None-Match header later on
        +        cacheURL = s.url;
        +
        +        // More options handling for requests with no content
        +        if ( !s.hasContent ) {
        +
        +            // If data is available, append data to url
        +            if ( s.data ) {
        +                cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
        +                // #9682: remove data so that it's not used in an eventual retry
        +                delete s.data;
        +            }
        +
        +            // Add anti-cache in url if needed
        +            if ( s.cache === false ) {
        +                s.url = rts.test( cacheURL ) ?
        +
        +                    // If there is already a '_' parameter, set its value
        +                    cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
        +
        +                    // Otherwise add one to the end
        +                    cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
        +            }
        +        }
        +
        +        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +        if ( s.ifModified ) {
        +            if ( jQuery.lastModified[ cacheURL ] ) {
        +                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
        +            }
        +            if ( jQuery.etag[ cacheURL ] ) {
        +                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
        +            }
        +        }
        +
        +        // Set the correct header, if data is being sent
        +        if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
        +            jqXHR.setRequestHeader( "Content-Type", s.contentType );
        +        }
        +
        +        // Set the Accepts header for the server, depending on the dataType
        +        jqXHR.setRequestHeader(
        +            "Accept",
        +            s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
        +                s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
        +                s.accepts[ "*" ]
        +        );
        +
        +        // Check for headers option
        +        for ( i in s.headers ) {
        +            jqXHR.setRequestHeader( i, s.headers[ i ] );
        +        }
        +
        +        // Allow custom headers/mimetypes and early abort
        +        if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
        +            // Abort if not done already and return
        +            return jqXHR.abort();
        +        }
        +
        +        // aborting is no longer a cancellation
        +        strAbort = "abort";
        +
        +        // Install callbacks on deferreds
        +        for ( i in { success: 1, error: 1, complete: 1 } ) {
        +            jqXHR[ i ]( s[ i ] );
        +        }
        +
        +        // Get transport
        +        transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
        +
        +        // If no transport, we auto-abort
        +        if ( !transport ) {
        +            done( -1, "No Transport" );
        +        } else {
        +            jqXHR.readyState = 1;
        +
        +            // Send global event
        +            if ( fireGlobals ) {
        +                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
        +            }
        +            // Timeout
        +            if ( s.async && s.timeout > 0 ) {
        +                timeoutTimer = setTimeout(function() {
        +                    jqXHR.abort("timeout");
        +                }, s.timeout );
        +            }
        +
        +            try {
        +                state = 1;
        +                transport.send( requestHeaders, done );
        +            } catch ( e ) {
        +                // Propagate exception as error if not done
        +                if ( state < 2 ) {
        +                    done( -1, e );
        +                // Simply rethrow otherwise
        +                } else {
        +                    throw e;
        +                }
        +            }
        +        }
        +
        +        // Callback for when everything is done
        +        function done( status, nativeStatusText, responses, headers ) {
        +            var isSuccess, success, error, response, modified,
        +                statusText = nativeStatusText;
        +
        +            // Called once
        +            if ( state === 2 ) {
        +                return;
        +            }
        +
        +            // State is "done" now
        +            state = 2;
        +
        +            // Clear timeout if it exists
        +            if ( timeoutTimer ) {
        +                clearTimeout( timeoutTimer );
        +            }
        +
        +            // Dereference transport for early garbage collection
        +            // (no matter how long the jqXHR object will be used)
        +            transport = undefined;
        +
        +            // Cache response headers
        +            responseHeadersString = headers || "";
        +
        +            // Set readyState
        +            jqXHR.readyState = status > 0 ? 4 : 0;
        +
        +            // Get response data
        +            if ( responses ) {
        +                response = ajaxHandleResponses( s, jqXHR, responses );
        +            }
        +
        +            // If successful, handle type chaining
        +            if ( status >= 200 && status < 300 || status === 304 ) {
        +
        +                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
        +                if ( s.ifModified ) {
        +                    modified = jqXHR.getResponseHeader("Last-Modified");
        +                    if ( modified ) {
        +                        jQuery.lastModified[ cacheURL ] = modified;
        +                    }
        +                    modified = jqXHR.getResponseHeader("etag");
        +                    if ( modified ) {
        +                        jQuery.etag[ cacheURL ] = modified;
        +                    }
        +                }
        +
        +                // if no content
        +                if ( status === 204 ) {
        +                    isSuccess = true;
        +                    statusText = "nocontent";
        +
        +                // if not modified
        +                } else if ( status === 304 ) {
        +                    isSuccess = true;
        +                    statusText = "notmodified";
        +
        +                // If we have data, let's convert it
        +                } else {
        +                    isSuccess = ajaxConvert( s, response );
        +                    statusText = isSuccess.state;
        +                    success = isSuccess.data;
        +                    error = isSuccess.error;
        +                    isSuccess = !error;
        +                }
        +            } else {
        +                // We extract error from statusText
        +                // then normalize statusText and status for non-aborts
        +                error = statusText;
        +                if ( status || !statusText ) {
        +                    statusText = "error";
        +                    if ( status < 0 ) {
        +                        status = 0;
        +                    }
        +                }
        +            }
        +
        +            // Set data for the fake xhr object
        +            jqXHR.status = status;
        +            jqXHR.statusText = ( nativeStatusText || statusText ) + "";
        +
        +            // Success/Error
        +            if ( isSuccess ) {
        +                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
        +            } else {
        +                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
        +            }
        +
        +            // Status-dependent callbacks
        +            jqXHR.statusCode( statusCode );
        +            statusCode = undefined;
        +
        +            if ( fireGlobals ) {
        +                globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
        +                    [ jqXHR, s, isSuccess ? success : error ] );
        +            }
        +
        +            // Complete
        +            completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
        +
        +            if ( fireGlobals ) {
        +                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
        +                // Handle the global AJAX counter
        +                if ( !( --jQuery.active ) ) {
        +                    jQuery.event.trigger("ajaxStop");
        +                }
        +            }
        +        }
        +
        +        return jqXHR;
        +    },
        +
        +    getScript: function( url, callback ) {
        +        return jQuery.get( url, undefined, callback, "script" );
        +    },
        +
        +    getJSON: function( url, data, callback ) {
        +        return jQuery.get( url, data, callback, "json" );
        +    }
        +});
        +
        +/* Handles responses to an ajax request:
        + * - sets all responseXXX fields accordingly
        + * - finds the right dataType (mediates between content-type and expected dataType)
        + * - returns the corresponding response
        + */
        +function ajaxHandleResponses( s, jqXHR, responses ) {
        +    var firstDataType, ct, finalDataType, type,
        +        contents = s.contents,
        +        dataTypes = s.dataTypes,
        +        responseFields = s.responseFields;
        +
        +    // Fill responseXXX fields
        +    for ( type in responseFields ) {
        +        if ( type in responses ) {
        +            jqXHR[ responseFields[type] ] = responses[ type ];
        +        }
        +    }
        +
        +    // Remove auto dataType and get content-type in the process
        +    while( dataTypes[ 0 ] === "*" ) {
        +        dataTypes.shift();
        +        if ( ct === undefined ) {
        +            ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
        +        }
        +    }
        +
        +    // Check if we're dealing with a known content-type
        +    if ( ct ) {
        +        for ( type in contents ) {
        +            if ( contents[ type ] && contents[ type ].test( ct ) ) {
        +                dataTypes.unshift( type );
        +                break;
        +            }
        +        }
        +    }
        +
        +    // Check to see if we have a response for the expected dataType
        +    if ( dataTypes[ 0 ] in responses ) {
        +        finalDataType = dataTypes[ 0 ];
        +    } else {
        +        // Try convertible dataTypes
        +        for ( type in responses ) {
        +            if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
        +                finalDataType = type;
        +                break;
        +            }
        +            if ( !firstDataType ) {
        +                firstDataType = type;
        +            }
        +        }
        +        // Or just use first one
        +        finalDataType = finalDataType || firstDataType;
        +    }
        +
        +    // If we found a dataType
        +    // We add the dataType to the list if needed
        +    // and return the corresponding response
        +    if ( finalDataType ) {
        +        if ( finalDataType !== dataTypes[ 0 ] ) {
        +            dataTypes.unshift( finalDataType );
        +        }
        +        return responses[ finalDataType ];
        +    }
        +}
        +
        +// Chain conversions given the request and the original response
        +function ajaxConvert( s, response ) {
        +    var conv2, current, conv, tmp,
        +        converters = {},
        +        i = 0,
        +        // Work with a copy of dataTypes in case we need to modify it for conversion
        +        dataTypes = s.dataTypes.slice(),
        +        prev = dataTypes[ 0 ];
        +
        +    // Apply the dataFilter if provided
        +    if ( s.dataFilter ) {
        +        response = s.dataFilter( response, s.dataType );
        +    }
        +
        +    // Create converters map with lowercased keys
        +    if ( dataTypes[ 1 ] ) {
        +        for ( conv in s.converters ) {
        +            converters[ conv.toLowerCase() ] = s.converters[ conv ];
        +        }
        +    }
        +
        +    // Convert to each sequential dataType, tolerating list modification
        +    for ( ; (current = dataTypes[++i]); ) {
        +
        +        // There's only work to do if current dataType is non-auto
        +        if ( current !== "*" ) {
        +
        +            // Convert response if prev dataType is non-auto and differs from current
        +            if ( prev !== "*" && prev !== current ) {
        +
        +                // Seek a direct converter
        +                conv = converters[ prev + " " + current ] || converters[ "* " + current ];
        +
        +                // If none found, seek a pair
        +                if ( !conv ) {
        +                    for ( conv2 in converters ) {
        +
        +                        // If conv2 outputs current
        +                        tmp = conv2.split(" ");
        +                        if ( tmp[ 1 ] === current ) {
        +
        +                            // If prev can be converted to accepted input
        +                            conv = converters[ prev + " " + tmp[ 0 ] ] ||
        +                                converters[ "* " + tmp[ 0 ] ];
        +                            if ( conv ) {
        +                                // Condense equivalence converters
        +                                if ( conv === true ) {
        +                                    conv = converters[ conv2 ];
        +
        +                                // Otherwise, insert the intermediate dataType
        +                                } else if ( converters[ conv2 ] !== true ) {
        +                                    current = tmp[ 0 ];
        +                                    dataTypes.splice( i--, 0, current );
        +                                }
        +
        +                                break;
        +                            }
        +                        }
        +                    }
        +                }
        +
        +                // Apply converter (if not an equivalence)
        +                if ( conv !== true ) {
        +
        +                    // Unless errors are allowed to bubble, catch and return them
        +                    if ( conv && s["throws"] ) {
        +                        response = conv( response );
        +                    } else {
        +                        try {
        +                            response = conv( response );
        +                        } catch ( e ) {
        +                            return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
        +                        }
        +                    }
        +                }
        +            }
        +
        +            // Update prev for next iteration
        +            prev = current;
        +        }
        +    }
        +
        +    return { state: "success", data: response };
        +}
        +// Install script dataType
        +jQuery.ajaxSetup({
        +    accepts: {
        +        script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        +    },
        +    contents: {
        +        script: /(?:java|ecma)script/
        +    },
        +    converters: {
        +        "text script": function( text ) {
        +            jQuery.globalEval( text );
        +            return text;
        +        }
        +    }
        +});
        +
        +// Handle cache's special case and global
        +jQuery.ajaxPrefilter( "script", function( s ) {
        +    if ( s.cache === undefined ) {
        +        s.cache = false;
        +    }
        +    if ( s.crossDomain ) {
        +        s.type = "GET";
        +        s.global = false;
        +    }
        +});
        +
        +// Bind script tag hack transport
        +jQuery.ajaxTransport( "script", function(s) {
        +
        +    // This transport only deals with cross domain requests
        +    if ( s.crossDomain ) {
        +
        +        var script,
        +            head = document.head || jQuery("head")[0] || document.documentElement;
        +
        +        return {
        +
        +            send: function( _, callback ) {
        +
        +                script = document.createElement("script");
        +
        +                script.async = true;
        +
        +                if ( s.scriptCharset ) {
        +                    script.charset = s.scriptCharset;
        +                }
        +
        +                script.src = s.url;
        +
        +                // Attach handlers for all browsers
        +                script.onload = script.onreadystatechange = function( _, isAbort ) {
        +
        +                    if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
        +
        +                        // Handle memory leak in IE
        +                        script.onload = script.onreadystatechange = null;
        +
        +                        // Remove the script
        +                        if ( script.parentNode ) {
        +                            script.parentNode.removeChild( script );
        +                        }
        +
        +                        // Dereference the script
        +                        script = null;
        +
        +                        // Callback if not abort
        +                        if ( !isAbort ) {
        +                            callback( 200, "success" );
        +                        }
        +                    }
        +                };
        +
        +                // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
        +                // Use native DOM manipulation to avoid our domManip AJAX trickery
        +                head.insertBefore( script, head.firstChild );
        +            },
        +
        +            abort: function() {
        +                if ( script ) {
        +                    script.onload( undefined, true );
        +                }
        +            }
        +        };
        +    }
        +});
        +var oldCallbacks = [],
        +    rjsonp = /(=)\?(?=&|$)|\?\?/;
        +
        +// Default jsonp settings
        +jQuery.ajaxSetup({
        +    jsonp: "callback",
        +    jsonpCallback: function() {
        +        var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
        +        this[ callback ] = true;
        +        return callback;
        +    }
        +});
        +
        +// Detect, normalize options and install callbacks for jsonp requests
        +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
        +
        +    var callbackName, overwritten, responseContainer,
        +        jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
        +            "url" :
        +            typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
        +        );
        +
        +    // Handle iff the expected data type is "jsonp" or we have a parameter to set
        +    if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
        +
        +        // Get callback name, remembering preexisting value associated with it
        +        callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
        +            s.jsonpCallback() :
        +            s.jsonpCallback;
        +
        +        // Insert callback into url or form data
        +        if ( jsonProp ) {
        +            s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
        +        } else if ( s.jsonp !== false ) {
        +            s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
        +        }
        +
        +        // Use data converter to retrieve json after script execution
        +        s.converters["script json"] = function() {
        +            if ( !responseContainer ) {
        +                jQuery.error( callbackName + " was not called" );
        +            }
        +            return responseContainer[ 0 ];
        +        };
        +
        +        // force json dataType
        +        s.dataTypes[ 0 ] = "json";
        +
        +        // Install callback
        +        overwritten = window[ callbackName ];
        +        window[ callbackName ] = function() {
        +            responseContainer = arguments;
        +        };
        +
        +        // Clean-up function (fires after converters)
        +        jqXHR.always(function() {
        +            // Restore preexisting value
        +            window[ callbackName ] = overwritten;
        +
        +            // Save back as free
        +            if ( s[ callbackName ] ) {
        +                // make sure that re-using the options doesn't screw things around
        +                s.jsonpCallback = originalSettings.jsonpCallback;
        +
        +                // save the callback name for future use
        +                oldCallbacks.push( callbackName );
        +            }
        +
        +            // Call if it was a function and we have a response
        +            if ( responseContainer && jQuery.isFunction( overwritten ) ) {
        +                overwritten( responseContainer[ 0 ] );
        +            }
        +
        +            responseContainer = overwritten = undefined;
        +        });
        +
        +        // Delegate to script
        +        return "script";
        +    }
        +});
        +var xhrCallbacks, xhrSupported,
        +    xhrId = 0,
        +    // #5280: Internet Explorer will keep connections alive if we don't abort on unload
        +    xhrOnUnloadAbort = window.ActiveXObject && function() {
        +        // Abort all pending requests
        +        var key;
        +        for ( key in xhrCallbacks ) {
        +            xhrCallbacks[ key ]( undefined, true );
        +        }
        +    };
        +
        +// Functions to create xhrs
        +function createStandardXHR() {
        +    try {
        +        return new window.XMLHttpRequest();
        +    } catch( e ) {}
        +}
        +
        +function createActiveXHR() {
        +    try {
        +        return new window.ActiveXObject("Microsoft.XMLHTTP");
        +    } catch( e ) {}
        +}
        +
        +// Create the request object
        +// (This is still attached to ajaxSettings for backward compatibility)
        +jQuery.ajaxSettings.xhr = window.ActiveXObject ?
        +    /* Microsoft failed to properly
        +     * implement the XMLHttpRequest in IE7 (can't request local files),
        +     * so we use the ActiveXObject when it is available
        +     * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
        +     * we need a fallback.
        +     */
        +    function() {
        +        return !this.isLocal && createStandardXHR() || createActiveXHR();
        +    } :
        +    // For all other browsers, use the standard XMLHttpRequest object
        +    createStandardXHR;
        +
        +// Determine support properties
        +xhrSupported = jQuery.ajaxSettings.xhr();
        +jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
        +xhrSupported = jQuery.support.ajax = !!xhrSupported;
        +
        +// Create transport if the browser can provide an xhr
        +if ( xhrSupported ) {
        +
        +    jQuery.ajaxTransport(function( s ) {
        +        // Cross domain only allowed if supported through XMLHttpRequest
        +        if ( !s.crossDomain || jQuery.support.cors ) {
        +
        +            var callback;
        +
        +            return {
        +                send: function( headers, complete ) {
        +
        +                    // Get a new xhr
        +                    var handle, i,
        +                        xhr = s.xhr();
        +
        +                    // Open the socket
        +                    // Passing null username, generates a login popup on Opera (#2865)
        +                    if ( s.username ) {
        +                        xhr.open( s.type, s.url, s.async, s.username, s.password );
        +                    } else {
        +                        xhr.open( s.type, s.url, s.async );
        +                    }
        +
        +                    // Apply custom fields if provided
        +                    if ( s.xhrFields ) {
        +                        for ( i in s.xhrFields ) {
        +                            xhr[ i ] = s.xhrFields[ i ];
        +                        }
        +                    }
        +
        +                    // Override mime type if needed
        +                    if ( s.mimeType && xhr.overrideMimeType ) {
        +                        xhr.overrideMimeType( s.mimeType );
        +                    }
        +
        +                    // X-Requested-With header
        +                    // For cross-domain requests, seeing as conditions for a preflight are
        +                    // akin to a jigsaw puzzle, we simply never set it to be sure.
        +                    // (it can always be set on a per-request basis or even using ajaxSetup)
        +                    // For same-domain requests, won't change header if already provided.
        +                    if ( !s.crossDomain && !headers["X-Requested-With"] ) {
        +                        headers["X-Requested-With"] = "XMLHttpRequest";
        +                    }
        +
        +                    // Need an extra try/catch for cross domain requests in Firefox 3
        +                    try {
        +                        for ( i in headers ) {
        +                            xhr.setRequestHeader( i, headers[ i ] );
        +                        }
        +                    } catch( err ) {}
        +
        +                    // Do send the request
        +                    // This may raise an exception which is actually
        +                    // handled in jQuery.ajax (so no try/catch here)
        +                    xhr.send( ( s.hasContent && s.data ) || null );
        +
        +                    // Listener
        +                    callback = function( _, isAbort ) {
        +                        var status, responseHeaders, statusText, responses;
        +
        +                        // Firefox throws exceptions when accessing properties
        +                        // of an xhr when a network error occurred
        +                        // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
        +                        try {
        +
        +                            // Was never called and is aborted or complete
        +                            if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
        +
        +                                // Only called once
        +                                callback = undefined;
        +
        +                                // Do not keep as active anymore
        +                                if ( handle ) {
        +                                    xhr.onreadystatechange = jQuery.noop;
        +                                    if ( xhrOnUnloadAbort ) {
        +                                        delete xhrCallbacks[ handle ];
        +                                    }
        +                                }
        +
        +                                // If it's an abort
        +                                if ( isAbort ) {
        +                                    // Abort it manually if needed
        +                                    if ( xhr.readyState !== 4 ) {
        +                                        xhr.abort();
        +                                    }
        +                                } else {
        +                                    responses = {};
        +                                    status = xhr.status;
        +                                    responseHeaders = xhr.getAllResponseHeaders();
        +
        +                                    // When requesting binary data, IE6-9 will throw an exception
        +                                    // on any attempt to access responseText (#11426)
        +                                    if ( typeof xhr.responseText === "string" ) {
        +                                        responses.text = xhr.responseText;
        +                                    }
        +
        +                                    // Firefox throws an exception when accessing
        +                                    // statusText for faulty cross-domain requests
        +                                    try {
        +                                        statusText = xhr.statusText;
        +                                    } catch( e ) {
        +                                        // We normalize with Webkit giving an empty statusText
        +                                        statusText = "";
        +                                    }
        +
        +                                    // Filter status for non standard behaviors
        +
        +                                    // If the request is local and we have data: assume a success
        +                                    // (success with no data won't get notified, that's the best we
        +                                    // can do given current implementations)
        +                                    if ( !status && s.isLocal && !s.crossDomain ) {
        +                                        status = responses.text ? 200 : 404;
        +                                    // IE - #1450: sometimes returns 1223 when it should be 204
        +                                    } else if ( status === 1223 ) {
        +                                        status = 204;
        +                                    }
        +                                }
        +                            }
        +                        } catch( firefoxAccessException ) {
        +                            if ( !isAbort ) {
        +                                complete( -1, firefoxAccessException );
        +                            }
        +                        }
        +
        +                        // Call complete if needed
        +                        if ( responses ) {
        +                            complete( status, statusText, responses, responseHeaders );
        +                        }
        +                    };
        +
        +                    if ( !s.async ) {
        +                        // if we're in sync mode we fire the callback
        +                        callback();
        +                    } else if ( xhr.readyState === 4 ) {
        +                        // (IE6 & IE7) if it's in cache and has been
        +                        // retrieved directly we need to fire the callback
        +                        setTimeout( callback );
        +                    } else {
        +                        handle = ++xhrId;
        +                        if ( xhrOnUnloadAbort ) {
        +                            // Create the active xhrs callbacks list if needed
        +                            // and attach the unload handler
        +                            if ( !xhrCallbacks ) {
        +                                xhrCallbacks = {};
        +                                jQuery( window ).unload( xhrOnUnloadAbort );
        +                            }
        +                            // Add to list of active xhrs callbacks
        +                            xhrCallbacks[ handle ] = callback;
        +                        }
        +                        xhr.onreadystatechange = callback;
        +                    }
        +                },
        +
        +                abort: function() {
        +                    if ( callback ) {
        +                        callback( undefined, true );
        +                    }
        +                }
        +            };
        +        }
        +    });
        +}
        +var fxNow, timerId,
        +    rfxtypes = /^(?:toggle|show|hide)$/,
        +    rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
        +    rrun = /queueHooks$/,
        +    animationPrefilters = [ defaultPrefilter ],
        +    tweeners = {
        +        "*": [function( prop, value ) {
        +            var end, unit,
        +                tween = this.createTween( prop, value ),
        +                parts = rfxnum.exec( value ),
        +                target = tween.cur(),
        +                start = +target || 0,
        +                scale = 1,
        +                maxIterations = 20;
        +
        +            if ( parts ) {
        +                end = +parts[2];
        +                unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        +
        +                // We need to compute starting value
        +                if ( unit !== "px" && start ) {
        +                    // Iteratively approximate from a nonzero starting point
        +                    // Prefer the current property, because this process will be trivial if it uses the same units
        +                    // Fallback to end or a simple constant
        +                    start = jQuery.css( tween.elem, prop, true ) || end || 1;
        +
        +                    do {
        +                        // If previous iteration zeroed out, double until we get *something*
        +                        // Use a string for doubling factor so we don't accidentally see scale as unchanged below
        +                        scale = scale || ".5";
        +
        +                        // Adjust and apply
        +                        start = start / scale;
        +                        jQuery.style( tween.elem, prop, start + unit );
        +
        +                    // Update scale, tolerating zero or NaN from tween.cur()
        +                    // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
        +                    } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
        +                }
        +
        +                tween.unit = unit;
        +                tween.start = start;
        +                // If a +=/-= token was provided, we're doing a relative animation
        +                tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
        +            }
        +            return tween;
        +        }]
        +    };
        +
        +// Animations created synchronously will run synchronously
        +function createFxNow() {
        +    setTimeout(function() {
        +        fxNow = undefined;
        +    });
        +    return ( fxNow = jQuery.now() );
        +}
        +
        +function createTweens( animation, props ) {
        +    jQuery.each( props, function( prop, value ) {
        +        var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
        +            index = 0,
        +            length = collection.length;
        +        for ( ; index < length; index++ ) {
        +            if ( collection[ index ].call( animation, prop, value ) ) {
        +
        +                // we're done with this property
        +                return;
        +            }
        +        }
        +    });
        +}
        +
        +function Animation( elem, properties, options ) {
        +    var result,
        +        stopped,
        +        index = 0,
        +        length = animationPrefilters.length,
        +        deferred = jQuery.Deferred().always( function() {
        +            // don't match elem in the :animated selector
        +            delete tick.elem;
        +        }),
        +        tick = function() {
        +            if ( stopped ) {
        +                return false;
        +            }
        +            var currentTime = fxNow || createFxNow(),
        +                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
        +                // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
        +                temp = remaining / animation.duration || 0,
        +                percent = 1 - temp,
        +                index = 0,
        +                length = animation.tweens.length;
        +
        +            for ( ; index < length ; index++ ) {
        +                animation.tweens[ index ].run( percent );
        +            }
        +
        +            deferred.notifyWith( elem, [ animation, percent, remaining ]);
        +
        +            if ( percent < 1 && length ) {
        +                return remaining;
        +            } else {
        +                deferred.resolveWith( elem, [ animation ] );
        +                return false;
        +            }
        +        },
        +        animation = deferred.promise({
        +            elem: elem,
        +            props: jQuery.extend( {}, properties ),
        +            opts: jQuery.extend( true, { specialEasing: {} }, options ),
        +            originalProperties: properties,
        +            originalOptions: options,
        +            startTime: fxNow || createFxNow(),
        +            duration: options.duration,
        +            tweens: [],
        +            createTween: function( prop, end ) {
        +                var tween = jQuery.Tween( elem, animation.opts, prop, end,
        +                        animation.opts.specialEasing[ prop ] || animation.opts.easing );
        +                animation.tweens.push( tween );
        +                return tween;
        +            },
        +            stop: function( gotoEnd ) {
        +                var index = 0,
        +                    // if we are going to the end, we want to run all the tweens
        +                    // otherwise we skip this part
        +                    length = gotoEnd ? animation.tweens.length : 0;
        +                if ( stopped ) {
        +                    return this;
        +                }
        +                stopped = true;
        +                for ( ; index < length ; index++ ) {
        +                    animation.tweens[ index ].run( 1 );
        +                }
        +
        +                // resolve when we played the last frame
        +                // otherwise, reject
        +                if ( gotoEnd ) {
        +                    deferred.resolveWith( elem, [ animation, gotoEnd ] );
        +                } else {
        +                    deferred.rejectWith( elem, [ animation, gotoEnd ] );
        +                }
        +                return this;
        +            }
        +        }),
        +        props = animation.props;
        +
        +    propFilter( props, animation.opts.specialEasing );
        +
        +    for ( ; index < length ; index++ ) {
        +        result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
        +        if ( result ) {
        +            return result;
        +        }
        +    }
        +
        +    createTweens( animation, props );
        +
        +    if ( jQuery.isFunction( animation.opts.start ) ) {
        +        animation.opts.start.call( elem, animation );
        +    }
        +
        +    jQuery.fx.timer(
        +        jQuery.extend( tick, {
        +            elem: elem,
        +            anim: animation,
        +            queue: animation.opts.queue
        +        })
        +    );
        +
        +    // attach callbacks from options
        +    return animation.progress( animation.opts.progress )
        +        .done( animation.opts.done, animation.opts.complete )
        +        .fail( animation.opts.fail )
        +        .always( animation.opts.always );
        +}
        +
        +function propFilter( props, specialEasing ) {
        +    var value, name, index, easing, hooks;
        +
        +    // camelCase, specialEasing and expand cssHook pass
        +    for ( index in props ) {
        +        name = jQuery.camelCase( index );
        +        easing = specialEasing[ name ];
        +        value = props[ index ];
        +        if ( jQuery.isArray( value ) ) {
        +            easing = value[ 1 ];
        +            value = props[ index ] = value[ 0 ];
        +        }
        +
        +        if ( index !== name ) {
        +            props[ name ] = value;
        +            delete props[ index ];
        +        }
        +
        +        hooks = jQuery.cssHooks[ name ];
        +        if ( hooks && "expand" in hooks ) {
        +            value = hooks.expand( value );
        +            delete props[ name ];
        +
        +            // not quite $.extend, this wont overwrite keys already present.
        +            // also - reusing 'index' from above because we have the correct "name"
        +            for ( index in value ) {
        +                if ( !( index in props ) ) {
        +                    props[ index ] = value[ index ];
        +                    specialEasing[ index ] = easing;
        +                }
        +            }
        +        } else {
        +            specialEasing[ name ] = easing;
        +        }
        +    }
        +}
        +
        +jQuery.Animation = jQuery.extend( Animation, {
        +
        +    tweener: function( props, callback ) {
        +        if ( jQuery.isFunction( props ) ) {
        +            callback = props;
        +            props = [ "*" ];
        +        } else {
        +            props = props.split(" ");
        +        }
        +
        +        var prop,
        +            index = 0,
        +            length = props.length;
        +
        +        for ( ; index < length ; index++ ) {
        +            prop = props[ index ];
        +            tweeners[ prop ] = tweeners[ prop ] || [];
        +            tweeners[ prop ].unshift( callback );
        +        }
        +    },
        +
        +    prefilter: function( callback, prepend ) {
        +        if ( prepend ) {
        +            animationPrefilters.unshift( callback );
        +        } else {
        +            animationPrefilters.push( callback );
        +        }
        +    }
        +});
        +
        +function defaultPrefilter( elem, props, opts ) {
        +    /*jshint validthis:true */
        +    var prop, index, length,
        +        value, dataShow, toggle,
        +        tween, hooks, oldfire,
        +        anim = this,
        +        style = elem.style,
        +        orig = {},
        +        handled = [],
        +        hidden = elem.nodeType && isHidden( elem );
        +
        +    // handle queue: false promises
        +    if ( !opts.queue ) {
        +        hooks = jQuery._queueHooks( elem, "fx" );
        +        if ( hooks.unqueued == null ) {
        +            hooks.unqueued = 0;
        +            oldfire = hooks.empty.fire;
        +            hooks.empty.fire = function() {
        +                if ( !hooks.unqueued ) {
        +                    oldfire();
        +                }
        +            };
        +        }
        +        hooks.unqueued++;
        +
        +        anim.always(function() {
        +            // doing this makes sure that the complete handler will be called
        +            // before this completes
        +            anim.always(function() {
        +                hooks.unqueued--;
        +                if ( !jQuery.queue( elem, "fx" ).length ) {
        +                    hooks.empty.fire();
        +                }
        +            });
        +        });
        +    }
        +
        +    // height/width overflow pass
        +    if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
        +        // Make sure that nothing sneaks out
        +        // Record all 3 overflow attributes because IE does not
        +        // change the overflow attribute when overflowX and
        +        // overflowY are set to the same value
        +        opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
        +
        +        // Set display property to inline-block for height/width
        +        // animations on inline elements that are having width/height animated
        +        if ( jQuery.css( elem, "display" ) === "inline" &&
        +                jQuery.css( elem, "float" ) === "none" ) {
        +
        +            // inline-level elements accept inline-block;
        +            // block-level elements need to be inline with layout
        +            if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
        +                style.display = "inline-block";
        +
        +            } else {
        +                style.zoom = 1;
        +            }
        +        }
        +    }
        +
        +    if ( opts.overflow ) {
        +        style.overflow = "hidden";
        +        if ( !jQuery.support.shrinkWrapBlocks ) {
        +            anim.always(function() {
        +                style.overflow = opts.overflow[ 0 ];
        +                style.overflowX = opts.overflow[ 1 ];
        +                style.overflowY = opts.overflow[ 2 ];
        +            });
        +        }
        +    }
        +
        +
        +    // show/hide pass
        +    for ( index in props ) {
        +        value = props[ index ];
        +        if ( rfxtypes.exec( value ) ) {
        +            delete props[ index ];
        +            toggle = toggle || value === "toggle";
        +            if ( value === ( hidden ? "hide" : "show" ) ) {
        +                continue;
        +            }
        +            handled.push( index );
        +        }
        +    }
        +
        +    length = handled.length;
        +    if ( length ) {
        +        dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
        +        if ( "hidden" in dataShow ) {
        +            hidden = dataShow.hidden;
        +        }
        +
        +        // store state if its toggle - enables .stop().toggle() to "reverse"
        +        if ( toggle ) {
        +            dataShow.hidden = !hidden;
        +        }
        +        if ( hidden ) {
        +            jQuery( elem ).show();
        +        } else {
        +            anim.done(function() {
        +                jQuery( elem ).hide();
        +            });
        +        }
        +        anim.done(function() {
        +            var prop;
        +            jQuery._removeData( elem, "fxshow" );
        +            for ( prop in orig ) {
        +                jQuery.style( elem, prop, orig[ prop ] );
        +            }
        +        });
        +        for ( index = 0 ; index < length ; index++ ) {
        +            prop = handled[ index ];
        +            tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
        +            orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
        +
        +            if ( !( prop in dataShow ) ) {
        +                dataShow[ prop ] = tween.start;
        +                if ( hidden ) {
        +                    tween.end = tween.start;
        +                    tween.start = prop === "width" || prop === "height" ? 1 : 0;
        +                }
        +            }
        +        }
        +    }
        +}
        +
        +function Tween( elem, options, prop, end, easing ) {
        +    return new Tween.prototype.init( elem, options, prop, end, easing );
        +}
        +jQuery.Tween = Tween;
        +
        +Tween.prototype = {
        +    constructor: Tween,
        +    init: function( elem, options, prop, end, easing, unit ) {
        +        this.elem = elem;
        +        this.prop = prop;
        +        this.easing = easing || "swing";
        +        this.options = options;
        +        this.start = this.now = this.cur();
        +        this.end = end;
        +        this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        +    },
        +    cur: function() {
        +        var hooks = Tween.propHooks[ this.prop ];
        +
        +        return hooks && hooks.get ?
        +            hooks.get( this ) :
        +            Tween.propHooks._default.get( this );
        +    },
        +    run: function( percent ) {
        +        var eased,
        +            hooks = Tween.propHooks[ this.prop ];
        +
        +        if ( this.options.duration ) {
        +            this.pos = eased = jQuery.easing[ this.easing ](
        +                percent, this.options.duration * percent, 0, 1, this.options.duration
        +            );
        +        } else {
        +            this.pos = eased = percent;
        +        }
        +        this.now = ( this.end - this.start ) * eased + this.start;
        +
        +        if ( this.options.step ) {
        +            this.options.step.call( this.elem, this.now, this );
        +        }
        +
        +        if ( hooks && hooks.set ) {
        +            hooks.set( this );
        +        } else {
        +            Tween.propHooks._default.set( this );
        +        }
        +        return this;
        +    }
        +};
        +
        +Tween.prototype.init.prototype = Tween.prototype;
        +
        +Tween.propHooks = {
        +    _default: {
        +        get: function( tween ) {
        +            var result;
        +
        +            if ( tween.elem[ tween.prop ] != null &&
        +                (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
        +                return tween.elem[ tween.prop ];
        +            }
        +
        +            // passing an empty string as a 3rd parameter to .css will automatically
        +            // attempt a parseFloat and fallback to a string if the parse fails
        +            // so, simple values such as "10px" are parsed to Float.
        +            // complex values such as "rotate(1rad)" are returned as is.
        +            result = jQuery.css( tween.elem, tween.prop, "" );
        +            // Empty strings, null, undefined and "auto" are converted to 0.
        +            return !result || result === "auto" ? 0 : result;
        +        },
        +        set: function( tween ) {
        +            // use step hook for back compat - use cssHook if its there - use .style if its
        +            // available and use plain properties where available
        +            if ( jQuery.fx.step[ tween.prop ] ) {
        +                jQuery.fx.step[ tween.prop ]( tween );
        +            } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
        +                jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
        +            } else {
        +                tween.elem[ tween.prop ] = tween.now;
        +            }
        +        }
        +    }
        +};
        +
        +// Remove in 2.0 - this supports IE8's panic based approach
        +// to setting things on disconnected nodes
        +
        +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
        +    set: function( tween ) {
        +        if ( tween.elem.nodeType && tween.elem.parentNode ) {
        +            tween.elem[ tween.prop ] = tween.now;
        +        }
        +    }
        +};
        +
        +jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
        +    var cssFn = jQuery.fn[ name ];
        +    jQuery.fn[ name ] = function( speed, easing, callback ) {
        +        return speed == null || typeof speed === "boolean" ?
        +            cssFn.apply( this, arguments ) :
        +            this.animate( genFx( name, true ), speed, easing, callback );
        +    };
        +});
        +
        +jQuery.fn.extend({
        +    fadeTo: function( speed, to, easing, callback ) {
        +
        +        // show any hidden elements after setting opacity to 0
        +        return this.filter( isHidden ).css( "opacity", 0 ).show()
        +
        +            // animate to the value specified
        +            .end().animate({ opacity: to }, speed, easing, callback );
        +    },
        +    animate: function( prop, speed, easing, callback ) {
        +        var empty = jQuery.isEmptyObject( prop ),
        +            optall = jQuery.speed( speed, easing, callback ),
        +            doAnimation = function() {
        +                // Operate on a copy of prop so per-property easing won't be lost
        +                var anim = Animation( this, jQuery.extend( {}, prop ), optall );
        +                doAnimation.finish = function() {
        +                    anim.stop( true );
        +                };
        +                // Empty animations, or finishing resolves immediately
        +                if ( empty || jQuery._data( this, "finish" ) ) {
        +                    anim.stop( true );
        +                }
        +            };
        +            doAnimation.finish = doAnimation;
        +
        +        return empty || optall.queue === false ?
        +            this.each( doAnimation ) :
        +            this.queue( optall.queue, doAnimation );
        +    },
        +    stop: function( type, clearQueue, gotoEnd ) {
        +        var stopQueue = function( hooks ) {
        +            var stop = hooks.stop;
        +            delete hooks.stop;
        +            stop( gotoEnd );
        +        };
        +
        +        if ( typeof type !== "string" ) {
        +            gotoEnd = clearQueue;
        +            clearQueue = type;
        +            type = undefined;
        +        }
        +        if ( clearQueue && type !== false ) {
        +            this.queue( type || "fx", [] );
        +        }
        +
        +        return this.each(function() {
        +            var dequeue = true,
        +                index = type != null && type + "queueHooks",
        +                timers = jQuery.timers,
        +                data = jQuery._data( this );
        +
        +            if ( index ) {
        +                if ( data[ index ] && data[ index ].stop ) {
        +                    stopQueue( data[ index ] );
        +                }
        +            } else {
        +                for ( index in data ) {
        +                    if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
        +                        stopQueue( data[ index ] );
        +                    }
        +                }
        +            }
        +
        +            for ( index = timers.length; index--; ) {
        +                if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
        +                    timers[ index ].anim.stop( gotoEnd );
        +                    dequeue = false;
        +                    timers.splice( index, 1 );
        +                }
        +            }
        +
        +            // start the next in the queue if the last step wasn't forced
        +            // timers currently will call their complete callbacks, which will dequeue
        +            // but only if they were gotoEnd
        +            if ( dequeue || !gotoEnd ) {
        +                jQuery.dequeue( this, type );
        +            }
        +        });
        +    },
        +    finish: function( type ) {
        +        if ( type !== false ) {
        +            type = type || "fx";
        +        }
        +        return this.each(function() {
        +            var index,
        +                data = jQuery._data( this ),
        +                queue = data[ type + "queue" ],
        +                hooks = data[ type + "queueHooks" ],
        +                timers = jQuery.timers,
        +                length = queue ? queue.length : 0;
        +
        +            // enable finishing flag on private data
        +            data.finish = true;
        +
        +            // empty the queue first
        +            jQuery.queue( this, type, [] );
        +
        +            if ( hooks && hooks.cur && hooks.cur.finish ) {
        +                hooks.cur.finish.call( this );
        +            }
        +
        +            // look for any active animations, and finish them
        +            for ( index = timers.length; index--; ) {
        +                if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
        +                    timers[ index ].anim.stop( true );
        +                    timers.splice( index, 1 );
        +                }
        +            }
        +
        +            // look for any animations in the old queue and finish them
        +            for ( index = 0; index < length; index++ ) {
        +                if ( queue[ index ] && queue[ index ].finish ) {
        +                    queue[ index ].finish.call( this );
        +                }
        +            }
        +
        +            // turn off finishing flag
        +            delete data.finish;
        +        });
        +    }
        +});
        +
        +// Generate parameters to create a standard animation
        +function genFx( type, includeWidth ) {
        +    var which,
        +        attrs = { height: type },
        +        i = 0;
        +
        +    // if we include width, step value is 1 to do all cssExpand values,
        +    // if we don't include width, step value is 2 to skip over Left and Right
        +    includeWidth = includeWidth? 1 : 0;
        +    for( ; i < 4 ; i += 2 - includeWidth ) {
        +        which = cssExpand[ i ];
        +        attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
        +    }
        +
        +    if ( includeWidth ) {
        +        attrs.opacity = attrs.width = type;
        +    }
        +
        +    return attrs;
        +}
        +
        +// Generate shortcuts for custom animations
        +jQuery.each({
        +    slideDown: genFx("show"),
        +    slideUp: genFx("hide"),
        +    slideToggle: genFx("toggle"),
        +    fadeIn: { opacity: "show" },
        +    fadeOut: { opacity: "hide" },
        +    fadeToggle: { opacity: "toggle" }
        +}, function( name, props ) {
        +    jQuery.fn[ name ] = function( speed, easing, callback ) {
        +        return this.animate( props, speed, easing, callback );
        +    };
        +});
        +
        +jQuery.speed = function( speed, easing, fn ) {
        +    var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
        +        complete: fn || !fn && easing ||
        +            jQuery.isFunction( speed ) && speed,
        +        duration: speed,
        +        easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
        +    };
        +
        +    opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
        +        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
        +
        +    // normalize opt.queue - true/undefined/null -> "fx"
        +    if ( opt.queue == null || opt.queue === true ) {
        +        opt.queue = "fx";
        +    }
        +
        +    // Queueing
        +    opt.old = opt.complete;
        +
        +    opt.complete = function() {
        +        if ( jQuery.isFunction( opt.old ) ) {
        +            opt.old.call( this );
        +        }
        +
        +        if ( opt.queue ) {
        +            jQuery.dequeue( this, opt.queue );
        +        }
        +    };
        +
        +    return opt;
        +};
        +
        +jQuery.easing = {
        +    linear: function( p ) {
        +        return p;
        +    },
        +    swing: function( p ) {
        +        return 0.5 - Math.cos( p*Math.PI ) / 2;
        +    }
        +};
        +
        +jQuery.timers = [];
        +jQuery.fx = Tween.prototype.init;
        +jQuery.fx.tick = function() {
        +    var timer,
        +        timers = jQuery.timers,
        +        i = 0;
        +
        +    fxNow = jQuery.now();
        +
        +    for ( ; i < timers.length; i++ ) {
        +        timer = timers[ i ];
        +        // Checks the timer has not already been removed
        +        if ( !timer() && timers[ i ] === timer ) {
        +            timers.splice( i--, 1 );
        +        }
        +    }
        +
        +    if ( !timers.length ) {
        +        jQuery.fx.stop();
        +    }
        +    fxNow = undefined;
        +};
        +
        +jQuery.fx.timer = function( timer ) {
        +    if ( timer() && jQuery.timers.push( timer ) ) {
        +        jQuery.fx.start();
        +    }
        +};
        +
        +jQuery.fx.interval = 13;
        +
        +jQuery.fx.start = function() {
        +    if ( !timerId ) {
        +        timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
        +    }
        +};
        +
        +jQuery.fx.stop = function() {
        +    clearInterval( timerId );
        +    timerId = null;
        +};
        +
        +jQuery.fx.speeds = {
        +    slow: 600,
        +    fast: 200,
        +    // Default speed
        +    _default: 400
        +};
        +
        +// Back Compat <1.8 extension point
        +jQuery.fx.step = {};
        +
        +if ( jQuery.expr && jQuery.expr.filters ) {
        +    jQuery.expr.filters.animated = function( elem ) {
        +        return jQuery.grep(jQuery.timers, function( fn ) {
        +            return elem === fn.elem;
        +        }).length;
        +    };
        +}
        +jQuery.fn.offset = function( options ) {
        +    if ( arguments.length ) {
        +        return options === undefined ?
        +            this :
        +            this.each(function( i ) {
        +                jQuery.offset.setOffset( this, options, i );
        +            });
        +    }
        +
        +    var docElem, win,
        +        box = { top: 0, left: 0 },
        +        elem = this[ 0 ],
        +        doc = elem && elem.ownerDocument;
        +
        +    if ( !doc ) {
        +        return;
        +    }
        +
        +    docElem = doc.documentElement;
        +
        +    // Make sure it's not a disconnected DOM node
        +    if ( !jQuery.contains( docElem, elem ) ) {
        +        return box;
        +    }
        +
        +    // If we don't have gBCR, just use 0,0 rather than error
        +    // BlackBerry 5, iOS 3 (original iPhone)
        +    if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
        +        box = elem.getBoundingClientRect();
        +    }
        +    win = getWindow( doc );
        +    return {
        +        top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
        +        left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
        +    };
        +};
        +
        +jQuery.offset = {
        +
        +    setOffset: function( elem, options, i ) {
        +        var position = jQuery.css( elem, "position" );
        +
        +        // set position first, in-case top/left are set even on static elem
        +        if ( position === "static" ) {
        +            elem.style.position = "relative";
        +        }
        +
        +        var curElem = jQuery( elem ),
        +            curOffset = curElem.offset(),
        +            curCSSTop = jQuery.css( elem, "top" ),
        +            curCSSLeft = jQuery.css( elem, "left" ),
        +            calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
        +            props = {}, curPosition = {}, curTop, curLeft;
        +
        +        // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
        +        if ( calculatePosition ) {
        +            curPosition = curElem.position();
        +            curTop = curPosition.top;
        +            curLeft = curPosition.left;
        +        } else {
        +            curTop = parseFloat( curCSSTop ) || 0;
        +            curLeft = parseFloat( curCSSLeft ) || 0;
        +        }
        +
        +        if ( jQuery.isFunction( options ) ) {
        +            options = options.call( elem, i, curOffset );
        +        }
        +
        +        if ( options.top != null ) {
        +            props.top = ( options.top - curOffset.top ) + curTop;
        +        }
        +        if ( options.left != null ) {
        +            props.left = ( options.left - curOffset.left ) + curLeft;
        +        }
        +
        +        if ( "using" in options ) {
        +            options.using.call( elem, props );
        +        } else {
        +            curElem.css( props );
        +        }
        +    }
        +};
        +
        +
        +jQuery.fn.extend({
        +
        +    position: function() {
        +        if ( !this[ 0 ] ) {
        +            return;
        +        }
        +
        +        var offsetParent, offset,
        +            parentOffset = { top: 0, left: 0 },
        +            elem = this[ 0 ];
        +
        +        // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
        +        if ( jQuery.css( elem, "position" ) === "fixed" ) {
        +            // we assume that getBoundingClientRect is available when computed position is fixed
        +            offset = elem.getBoundingClientRect();
        +        } else {
        +            // Get *real* offsetParent
        +            offsetParent = this.offsetParent();
        +
        +            // Get correct offsets
        +            offset = this.offset();
        +            if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
        +                parentOffset = offsetParent.offset();
        +            }
        +
        +            // Add offsetParent borders
        +            parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
        +            parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
        +        }
        +
        +        // Subtract parent offsets and element margins
        +        // note: when an element has margin: auto the offsetLeft and marginLeft
        +        // are the same in Safari causing offset.left to incorrectly be 0
        +        return {
        +            top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
        +            left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
        +        };
        +    },
        +
        +    offsetParent: function() {
        +        return this.map(function() {
        +            var offsetParent = this.offsetParent || document.documentElement;
        +            while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
        +                offsetParent = offsetParent.offsetParent;
        +            }
        +            return offsetParent || document.documentElement;
        +        });
        +    }
        +});
        +
        +
        +// Create scrollLeft and scrollTop methods
        +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
        +    var top = /Y/.test( prop );
        +
        +    jQuery.fn[ method ] = function( val ) {
        +        return jQuery.access( this, function( elem, method, val ) {
        +            var win = getWindow( elem );
        +
        +            if ( val === undefined ) {
        +                return win ? (prop in win) ? win[ prop ] :
        +                    win.document.documentElement[ method ] :
        +                    elem[ method ];
        +            }
        +
        +            if ( win ) {
        +                win.scrollTo(
        +                    !top ? val : jQuery( win ).scrollLeft(),
        +                    top ? val : jQuery( win ).scrollTop()
        +                );
        +
        +            } else {
        +                elem[ method ] = val;
        +            }
        +        }, method, val, arguments.length, null );
        +    };
        +});
        +
        +function getWindow( elem ) {
        +    return jQuery.isWindow( elem ) ?
        +        elem :
        +        elem.nodeType === 9 ?
        +            elem.defaultView || elem.parentWindow :
        +            false;
        +}
        +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
        +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        +    jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
        +        // margin is only for outerHeight, outerWidth
        +        jQuery.fn[ funcName ] = function( margin, value ) {
        +            var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
        +                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
        +
        +            return jQuery.access( this, function( elem, type, value ) {
        +                var doc;
        +
        +                if ( jQuery.isWindow( elem ) ) {
        +                    // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
        +                    // isn't a whole lot we can do. See pull request at this URL for discussion:
        +                    // https://github.com/jquery/jquery/pull/764
        +                    return elem.document.documentElement[ "client" + name ];
        +                }
        +
        +                // Get document width or height
        +                if ( elem.nodeType === 9 ) {
        +                    doc = elem.documentElement;
        +
        +                    // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
        +                    // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
        +                    return Math.max(
        +                        elem.body[ "scroll" + name ], doc[ "scroll" + name ],
        +                        elem.body[ "offset" + name ], doc[ "offset" + name ],
        +                        doc[ "client" + name ]
        +                    );
        +                }
        +
        +                return value === undefined ?
        +                    // Get width or height on the element, requesting but not forcing parseFloat
        +                    jQuery.css( elem, type, extra ) :
        +
        +                    // Set width or height on the element
        +                    jQuery.style( elem, type, value, extra );
        +            }, type, chainable ? margin : undefined, chainable, null );
        +        };
        +    });
        +});
        +// Limit scope pollution from any deprecated API
        +// (function() {
        +
        +// })();
        +// Expose jQuery to the global object
        +window.jQuery = window.$ = jQuery;
        +
        +// Expose jQuery as an AMD module, but only for AMD loaders that
        +// understand the issues with loading multiple versions of jQuery
        +// in a page that all might call define(). The loader will indicate
        +// they have special allowances for multiple jQuery versions by
        +// specifying define.amd.jQuery = true. Register as a named module,
        +// since jQuery can be concatenated with other files that may use define,
        +// but not use a proper concatenation script that understands anonymous
        +// AMD modules. A named AMD is safest and most robust way to register.
        +// Lowercase jquery is used because AMD module names are derived from
        +// file names, and jQuery is normally delivered in a lowercase file name.
        +// Do this after creating the global so that if an AMD module wants to call
        +// noConflict to hide this version of jQuery, it will work.
        +if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
        +    define( "jquery", [], function () { return jQuery; } );
        +}
        +
        +})( window );
        \ No newline at end of file
        diff --git a/bower_components/tether/examples/resources/js/log.js b/bower_components/tether/examples/resources/js/log.js
        new file mode 100644
        index 0000000000..6acd4fd9ef
        --- /dev/null
        +++ b/bower_components/tether/examples/resources/js/log.js
        @@ -0,0 +1,134 @@
        +(function() {
        +  var ffSupport, formats, getOrderedMatches, hasMatches, isFF, isIE, isOpera, isSafari, log, makeArray, operaSupport, safariSupport, stringToArgs, _log;
        +  if (!(window.console && window.console.log)) {
        +    return;
        +  }
        +  log = function() {
        +    var args;
        +    args = [];
        +    makeArray(arguments).forEach(function(arg) {
        +      if (typeof arg === 'string') {
        +        return args = args.concat(stringToArgs(arg));
        +      } else {
        +        return args.push(arg);
        +      }
        +    });
        +    return _log.apply(window, args);
        +  };
        +  _log = function() {
        +    return console.log.apply(console, makeArray(arguments));
        +  };
        +  makeArray = function(arrayLikeThing) {
        +    return Array.prototype.slice.call(arrayLikeThing);
        +  };
        +  formats = [
        +    {
        +      regex: /\*([^\*]+)\*/,
        +      replacer: function(m, p1) {
        +        return "%c" + p1 + "%c";
        +      },
        +      styles: function() {
        +        return ['font-style: italic', ''];
        +      }
        +    }, {
        +      regex: /\_([^\_]+)\_/,
        +      replacer: function(m, p1) {
        +        return "%c" + p1 + "%c";
        +      },
        +      styles: function() {
        +        return ['font-weight: bold', ''];
        +      }
        +    }, {
        +      regex: /\`([^\`]+)\`/,
        +      replacer: function(m, p1) {
        +        return "%c" + p1 + "%c";
        +      },
        +      styles: function() {
        +        return ['background: rgb(255, 255, 219); padding: 1px 5px; border: 1px solid rgba(0, 0, 0, 0.1)', ''];
        +      }
        +    }, {
        +      regex: /\[c\=(?:\"|\')?((?:(?!(?:\"|\')\]).)*)(?:\"|\')?\]((?:(?!\[c\]).)*)\[c\]/,
        +      replacer: function(m, p1, p2) {
        +        return "%c" + p2 + "%c";
        +      },
        +      styles: function(match) {
        +        return [match[1], ''];
        +      }
        +    }
        +  ];
        +  hasMatches = function(str) {
        +    var _hasMatches;
        +    _hasMatches = false;
        +    formats.forEach(function(format) {
        +      if (format.regex.test(str)) {
        +        return _hasMatches = true;
        +      }
        +    });
        +    return _hasMatches;
        +  };
        +  getOrderedMatches = function(str) {
        +    var matches;
        +    matches = [];
        +    formats.forEach(function(format) {
        +      var match;
        +      match = str.match(format.regex);
        +      if (match) {
        +        return matches.push({
        +          format: format,
        +          match: match
        +        });
        +      }
        +    });
        +    return matches.sort(function(a, b) {
        +      return a.match.index - b.match.index;
        +    });
        +  };
        +  stringToArgs = function(str) {
        +    var firstMatch, matches, styles;
        +    styles = [];
        +    while (hasMatches(str)) {
        +      matches = getOrderedMatches(str);
        +      firstMatch = matches[0];
        +      str = str.replace(firstMatch.format.regex, firstMatch.format.replacer);
        +      styles = styles.concat(firstMatch.format.styles(firstMatch.match));
        +    }
        +    return [str].concat(styles);
        +  };
        +  isSafari = function() {
        +    return /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
        +  };
        +  isOpera = function() {
        +    return /OPR/.test(navigator.userAgent) && /Opera/.test(navigator.vendor);
        +  };
        +  isFF = function() {
        +    return /Firefox/.test(navigator.userAgent);
        +  };
        +  isIE = function() {
        +    return /MSIE/.test(navigator.userAgent);
        +  };
        +  safariSupport = function() {
        +    var m;
        +    m = navigator.userAgent.match(/AppleWebKit\/(\d+)\.(\d+)(\.|\+|\s)/);
        +    if (!m) {
        +      return false;
        +    }
        +    return 537.38 <= parseInt(m[1], 10) + (parseInt(m[2], 10) / 100);
        +  };
        +  operaSupport = function() {
        +    var m;
        +    m = navigator.userAgent.match(/OPR\/(\d+)\./);
        +    if (!m) {
        +      return false;
        +    }
        +    return 15 <= parseInt(m[1], 10);
        +  };
        +  ffSupport = function() {
        +    return window.console.firebug || window.console.exception;
        +  };
        +  if (isIE() || (isFF() && !ffSupport()) || (isOpera() && !operaSupport()) || (isSafari() && !safariSupport())) {
        +    window.log = _log;
        +  } else {
        +    window.log = log;
        +  }
        +  window.log.l = _log;
        +}).call(this);
        \ No newline at end of file
        diff --git a/bower_components/tether/examples/scroll/index.html b/bower_components/tether/examples/scroll/index.html
        new file mode 100644
        index 0000000000..4d4fd64a09
        --- /dev/null
        +++ b/bower_components/tether/examples/scroll/index.html
        @@ -0,0 +1,922 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="../common/css/style.css" />
        +    </head>
        +    <body>
        +
        +    <div class="instructions">Scroll the page</div>
        +
        +    <h2>THE END OF THE TETHER</h2>
        +
        +    <p>By Joseph Conrad</p>
        +
        +    <h3>Chapter I</h3>
        +
        +    <p>For a long time after the course of the steamer <em>Sofala</em> had been
        +    altered for the land, the low swampy coast had retained its appearance
        +    of a mere smudge of darkness beyond a belt of glitter. The sunrays
        +    seemed to fall violently upon the calm sea--seemed to shatter themselves
        +    upon an adamantine surface into sparkling dust, into a dazzling vapor
        +    of light that blinded the eye and wearied the brain with its unsteady
        +    brightness.</p>
        +
        +    <p>Captain Whalley did not look at it. When his Serang, approaching the
        +    roomy cane arm-chair which he filled capably, had informed him in a low
        +    voice that the course was to be altered, he had risen at once and had
        +    remained on his feet, face forward, while the head of his ship swung
        +    through a quarter of a circle. He had not uttered a single word, not
        +    even the word to steady the helm. It was the Serang, an elderly, alert,
        +    little Malay, with a very dark skin, who murmured the order to the
        +    helmsman. And then slowly Captain Whalley sat down again in the
        +    arm-chair on the bridge and fixed his eyes on the deck between his feet.</p>
        +
        +    <p>He could not hope to see anything new upon this lane of the sea. He had
        +    been on these coasts for the last three years. From Low Cape to Malantan
        +    the distance was fifty miles, six hours' steaming for the old ship with
        +    the tide, or seven against. Then you steered straight for the land, and
        +    by-and-by three palms would appear on the sky, tall and slim, and with
        +    their disheveled heads in a bunch, as if in confidential criticism of
        +    the dark mangroves. The Sofala would be headed towards the somber
        +    strip of the coast, which at a given moment, as the ship closed with
        +    it obliquely, would show several clean shining fractures--the brimful
        +    estuary of a river. Then on through a brown liquid, three parts water
        +    and one part black earth, on and on between the low shores, three parts
        +    black earth and one part brackish water, the Sofala would plow her way
        +    up-stream, as she had done once every month for these seven years or
        +    more, long before he was aware of her existence, long before he had ever
        +    thought of having anything to do with her and her invariable voyages.
        +    The old ship ought to have known the road better than her men, who had
        +    not been kept so long at it without a change; better than the faithful
        +    Serang, whom he had brought over from his last ship to keep the
        +    captain's watch; better than he himself, who had been her captain for
        +    the last three years only. She could always be depended upon to make her
        +    courses. Her compasses were never out. She was no trouble at all to
        +    take about, as if her great age had given her knowledge, wisdom, and
        +    steadiness. She made her landfalls to a degree of the bearing, and
        +    almost to a minute of her allowed time. At any moment, as he sat on
        +    the bridge without looking up, or lay sleepless in his bed, simply by
        +    reckoning the days and the hours he could tell where he was--the precise
        +    spot of the beat. He knew it well too, this monotonous huckster's
        +    round, up and down the Straits; he knew its order and its sights and its
        +    people. Malacca to begin with, in at daylight and out at dusk, to cross
        +    over with a rigid phosphorescent wake this highway of the Far East.
        +    Darkness and gleams on the water, clear stars on a black sky, perhaps
        +    the lights of a home steamer keeping her unswerving course in the
        +    middle, or maybe the elusive shadow of a native craft with her mat sails
        +    flitting by silently--and the low land on the other side in sight
        +    at daylight. At noon the three palms of the next place of call, up a
        +    sluggish river. The only white man residing there was a retired young
        +    sailor, with whom he had become friendly in the course of many voyages.
        +    Sixty miles farther on there was another place of call, a deep bay with
        +    only a couple of houses on the beach. And so on, in and out, picking
        +    up coastwise cargo here and there, and finishing with a hundred miles'
        +    steady steaming through the maze of an archipelago of small islands up
        +    to a large native town at the end of the beat. There was a three days'
        +    rest for the old ship before he started her again in inverse order,
        +    seeing the same shores from another bearing, hearing the same voices
        +    in the same places, back again to the Sofala's port of registry on
        +    the great highway to the East, where he would take up a berth nearly
        +    opposite the big stone pile of the harbor office till it was time to
        +    start again on the old round of 1600 miles and thirty days. Not a very
        +    enterprising life, this, for Captain Whalley, Henry Whalley, otherwise
        +    Dare-devil Harry--Whalley of the Condor, a famous clipper in her day.
        +    No. Not a very enterprising life for a man who had served famous firms,
        +    who had sailed famous ships (more than one or two of them his own); who
        +    had made famous passages, had been the pioneer of new routes and new
        +    trades; who had steered across the unsurveyed tracts of the South Seas,
        +    and had seen the sun rise on uncharted islands. Fifty years at sea, and
        +    forty out in the East ("a pretty thorough apprenticeship," he used
        +    to remark smilingly), had made him honorably known to a generation of
        +    shipowners and merchants in all the ports from Bombay clear over to
        +    where the East merges into the West upon the coast of the two Americas.
        +    His fame remained writ, not very large but plain enough, on the
        +    Admiralty charts. Was there not somewhere between Australia and China a
        +    Whalley Island and a Condor Reef? On that dangerous coral formation the
        +    celebrated clipper had hung stranded for three days, her captain and
        +    crew throwing her cargo overboard with one hand and with the other, as
        +    it were, keeping off her a flotilla of savage war-canoes. At that time
        +    neither the island nor the reef had any official existence. Later the
        +    officers of her Majesty's steam vessel Fusilier, dispatched to make a
        +    survey of the route, recognized in the adoption of these two names the
        +    enterprise of the man and the solidity of the ship. Besides, as anyone
        +    who cares may see, the "General Directory," vol. ii. p. 410, begins the
        +    description of the "Malotu or Whalley Passage" with the words: "This
        +    advantageous route, first discovered in 1850 by Captain Whalley in the
        +    ship Condor," &amp;c., and ends by recommending it warmly to sailing vessels
        +    leaving the China ports for the south in the months from December to
        +    April inclusive.</p>
        +
        +    <p>This was the clearest gain he had out of life. Nothing could rob him
        +    of this kind of fame. The piercing of the Isthmus of Suez, like the
        +    breaking of a dam, had let in upon the East a flood of new ships, new
        +    men, new methods of trade. It had changed the face of the Eastern seas
        +    and the very spirit of their life; so that his early experiences meant
        +    nothing whatever to the new generation of seamen.</p>
        +
        +    <p>In those bygone days he had handled many thousands of pounds of his
        +    employers' money and of his own; he had attended faithfully, as by law
        +    a shipmaster is expected to do, to the conflicting interests of owners,
        +    charterers, and underwriters. He had never lost a ship or consented to
        +    a shady transaction; and he had lasted well, outlasting in the end the
        +    conditions that had gone to the making of his name. He had buried his
        +    wife (in the Gulf of Petchili), had married off his daughter to the man
        +    of her unlucky choice, and had lost more than an ample competence in the
        +    crash of the notorious Travancore and Deccan Banking Corporation, whose
        +    downfall had shaken the East like an earthquake. And he was sixty-five
        +    years old.</p>
        +
        +    <h3>Chapter II</h3>
        +
        +    <p>His age sat lightly enough on him; and of his ruin he was not ashamed.
        +    He had not been alone to believe in the stability of the Banking
        +    Corporation. Men whose judgment in matters of finance was as expert as
        +    his seamanship had commended the prudence of his investments, and had
        +    themselves lost much money in the great failure. The only difference
        +    between him and them was that he had lost his all. And yet not his all.
        +    There had remained to him from his lost fortune a very pretty little
        +    bark, Fair Maid, which he had bought to occupy his leisure of a retired
        +    sailor--"to play with," as he expressed it himself.</p>
        +
        +    <p>He had formally declared himself tired of the sea the year preceding his
        +    daughter's marriage. But after the young couple had gone to settle in
        +    Melbourne he found out that he could not make himself happy on shore. He
        +    was too much of a merchant sea-captain for mere yachting to satisfy him.
        +    He wanted the illusion of affairs; and his acquisition of the Fair
        +    Maid preserved the continuity of his life. He introduced her to his
        +    acquaintances in various ports as "my last command." When he grew too
        +    old to be trusted with a ship, he would lay her up and go ashore to be
        +    buried, leaving directions in his will to have the bark towed out and
        +    scuttled decently in deep water on the day of the funeral. His daughter
        +    would not grudge him the satisfaction of knowing that no stranger would
        +    handle his last command after him. With the fortune he was able to leave
        +    her, the value of a 500-ton bark was neither here nor there. All this
        +    would be said with a jocular twinkle in his eye: the vigorous old man
        +    had too much vitality for the sentimentalism of regret; and a little
        +    wistfully withal, because he was at home in life, taking a genuine
        +    pleasure in its feelings and its possessions; in the dignity of his
        +    reputation and his wealth, in his love for his daughter, and in his
        +    satisfaction with the ship--the plaything of his lonely leisure.</p>
        +
        +    <p>He had the cabin arranged in accordance with his simple ideal of comfort
        +    at sea. A big bookcase (he was a great reader) occupied one side of his
        +    stateroom; the portrait of his late wife, a flat bituminous oil-painting
        +    representing the profile and one long black ringlet of a young woman,
        +    faced his bed-place. Three chronometers ticked him to sleep and greeted
        +    him on waking with the tiny competition of their beats. He rose at five
        +    every day. The officer of the morning watch, drinking his early cup
        +    of coffee aft by the wheel, would hear through the wide orifice of the
        +    copper ventilators all the splashings, blowings, and splutterings of
        +    his captain's toilet. These noises would be followed by a sustained
        +    deep murmur of the Lord's Prayer recited in a loud earnest voice. Five
        +    minutes afterwards the head and shoulders of Captain Whalley emerged
        +    out of the companion-hatchway. Invariably he paused for a while on the
        +    stairs, looking all round at the horizon; upwards at the trim of the
        +    sails; inhaling deep draughts of the fresh air. Only then he would step
        +    out on the poop, acknowledging the hand raised to the peak of the cap
        +    with a majestic and benign "Good morning to you." He walked the deck
        +    till eight scrupulously. Sometimes, not above twice a year, he had to
        +    use a thick cudgel-like stick on account of a stiffness in the hip--a
        +    slight touch of rheumatism, he supposed. Otherwise he knew nothing of
        +    the ills of the flesh. At the ringing of the breakfast bell he went
        +    below to feed his canaries, wind up the chronometers, and take the
        +    head of the table. From there he had before his eyes the big carbon
        +    photographs of his daughter, her husband, and two fat-legged babies
        +    --his grandchildren--set in black frames into the maplewood bulkheads
        +    of the cuddy. After breakfast he dusted the glass over these portraits
        +    himself with a cloth, and brushed the oil painting of his wife with a
        +    plumate kept suspended from a small brass hook by the side of the heavy
        +    gold frame. Then with the door of his stateroom shut, he would sit down
        +    on the couch under the portrait to read a chapter out of a thick pocket
        +    Bible--her Bible. But on some days he only sat there for half an hour
        +    with his finger between the leaves and the closed book resting on his
        +    knees. Perhaps he had remembered suddenly how fond of boat-sailing she
        +    used to be.</p>
        +
        +    <p>She had been a real shipmate and a true woman too. It was like an
        +    article of faith with him that there never had been, and never could be,
        +    a brighter, cheerier home anywhere afloat or ashore than his home under
        +    the poop-deck of the Condor, with the big main cabin all white and gold,
        +    garlanded as if for a perpetual festival with an unfading wreath. She
        +    had decorated the center of every panel with a cluster of home flowers.
        +    It took her a twelvemonth to go round the cuddy with this labor of love.
        +    To him it had remained a marvel of painting, the highest achievement of
        +    taste and skill; and as to old Swinburne, his mate, every time he
        +    came down to his meals he stood transfixed with admiration before the
        +    progress of the work. You could almost smell these roses, he declared,
        +    sniffing the faint flavor of turpentine which at that time pervaded the
        +    saloon, and (as he confessed afterwards) made him somewhat less hearty
        +    than usual in tackling his food. But there was nothing of the sort to
        +    interfere with his enjoyment of her singing. "Mrs. Whalley is a regular
        +    out-and-out nightingale, sir," he would pronounce with a judicial air
        +    after listening profoundly over the skylight to the very end of the
        +    piece. In fine weather, in the second dog-watch, the two men could hear
        +    her trills and roulades going on to the accompaniment of the piano in
        +    the cabin. On the very day they got engaged he had written to London
        +    for the instrument; but they had been married for over a year before it
        +    reached them, coming out round the Cape. The big case made part of the
        +    first direct general cargo landed in Hong-kong harbor--an event that to
        +    the men who walked the busy quays of to-day seemed as hazily remote as
        +    the dark ages of history. But Captain Whalley could in a half hour of
        +    solitude live again all his life, with its romance, its idyl, and its
        +    sorrow. He had to close her eyes himself. She went away from under the
        +    ensign like a sailor's wife, a sailor herself at heart. He had read
        +    the service over her, out of her own prayer-book, without a break in his
        +    voice. When he raised his eyes he could see old Swinburne facing him
        +    with his cap pressed to his breast, and his rugged, weather-beaten,
        +    impassive face streaming with drops of water like a lump of chipped red
        +    granite in a shower. It was all very well for that old sea-dog to cry.
        +    He had to read on to the end; but after the splash he did not remember
        +    much of what happened for the next few days. An elderly sailor of the
        +    crew, deft at needlework, put together a mourning frock for the child
        +    out of one of her black skirts.</p>
        +
        +    <p>He was not likely to forget; but you cannot dam up life like a sluggish
        +    stream. It will break out and flow over a man's troubles, it will close
        +    upon a sorrow like the sea upon a dead body, no matter how much love has
        +    gone to the bottom. And the world is not bad. People had been very
        +    kind to him; especially Mrs. Gardner, the wife of the senior partner
        +    in Gardner, Patteson, &amp; Co., the owners of the Condor. It was she who
        +    volunteered to look after the little one, and in due course took her to
        +    England (something of a journey in those days, even by the overland
        +    mail route) with her own girls to finish her education. It was ten years
        +    before he saw her again.</p>
        +
        +    <p>As a little child she had never been frightened of bad weather; she
        +    would beg to be taken up on deck in the bosom of his oilskin coat to
        +    watch the big seas hurling themselves upon the Condor. The swirl and
        +    crash of the waves seemed to fill her small soul with a breathless
        +    delight. "A good boy spoiled," he used to say of her in joke. He had
        +    named her Ivy because of the sound of the word, and obscurely fascinated
        +    by a vague association of ideas. She had twined herself tightly round
        +    his heart, and he intended her to cling close to her father as to a
        +    tower of strength; forgetting, while she was little, that in the nature
        +    of things she would probably elect to cling to someone else. But
        +    he loved life well enough for even that event to give him a certain
        +    satisfaction, apart from his more intimate feeling of loss.</p>
        +
        +    <p>After he had purchased the Fair Maid to occupy his loneliness, he
        +    hastened to accept a rather unprofitable freight to Australia simply for
        +    the opportunity of seeing his daughter in her own home. What made him
        +    dissatisfied there was not to see that she clung now to somebody else,
        +    but that the prop she had selected seemed on closer examination "a
        +    rather poor stick"--even in the matter of health. He disliked his
        +    son-in-law's studied civility perhaps more than his method of
        +    handling the sum of money he had given Ivy at her marriage. But of his
        +    apprehensions he said nothing. Only on the day of his departure, with
        +    the hall-door open already, holding her hands and looking steadily into
        +    her eyes, he had said, "You know, my dear, all I have is for you and the
        +    chicks. Mind you write to me openly." She had answered him by an almost
        +    imperceptible movement of her head. She resembled her mother in
        +    the color of her eyes, and in character--and also in this, that she
        +    understood him without many words.</p>
        +
        +    <p>Sure enough she had to write; and some of these letters made Captain
        +    Whalley lift his white eye-brows. For the rest he considered he was
        +    reaping the true reward of his life by being thus able to produce on
        +    demand whatever was needed. He had not enjoyed himself so much in a
        +    way since his wife had died. Characteristically enough his son-in-law's
        +    punctuality in failure caused him at a distance to feel a sort of
        +    kindness towards the man. The fellow was so perpetually being jammed on
        +    a lee shore that to charge it all to his reckless navigation would be
        +    manifestly unfair. No, no! He knew well what that meant. It was bad
        +    luck. His own had been simply marvelous, but he had seen in his life too
        +    many good men--seamen and others--go under with the sheer weight of bad
        +    luck not to recognize the fatal signs. For all that, he was cogitating
        +    on the best way of tying up very strictly every penny he had to leave,
        +    when, with a preliminary rumble of rumors (whose first sound reached
        +    him in Shanghai as it happened), the shock of the big failure came;
        +    and, after passing through the phases of stupor, of incredulity, of
        +    indignation, he had to accept the fact that he had nothing to speak of
        +    to leave.</p>
        +
        +    <p>Upon that, as if he had only waited for this catastrophe, the unlucky
        +    man, away there in Melbourne, gave up his unprofitable game, and sat
        +    down--in an invalid's bath-chair at that too. "He will never walk
        +    again," wrote the wife. For the first time in his life Captain Whalley
        +    was a bit staggered.</p>
        +
        +    <p>The Fair Maid had to go to work in bitter earnest now. It was no longer
        +    a matter of preserving alive the memory of Dare-devil Harry Whalley in
        +    the Eastern Seas, or of keeping an old man in pocket-money and clothes,
        +    with, perhaps, a bill for a few hundred first-class cigars thrown in at
        +    the end of the year. He would have to buckle-to, and keep her going hard
        +    on a scant allowance of gilt for the ginger-bread scrolls at her stem
        +    and stern.</p>
        +
        +    <p>This necessity opened his eyes to the fundamental changes of the world.
        +    Of his past only the familiar names remained, here and there, but
        +    the things and the men, as he had known them, were gone. The name of
        +    Gardner, Patteson, &amp; Co. was still displayed on the walls of warehouses
        +    by the waterside, on the brass plates and window-panes in the business
        +    quarters of more than one Eastern port, but there was no longer a
        +    Gardner or a Patteson in the firm. There was no longer for Captain
        +    Whalley an arm-chair and a welcome in the private office, with a bit of
        +    business ready to be put in the way of an old friend, for the sake of
        +    bygone services. The husbands of the Gardner girls sat behind the desks
        +    in that room where, long after he had left the employ, he had kept his
        +    right of entrance in the old man's time. Their ships now had yellow
        +    funnels with black tops, and a time-table of appointed routes like a
        +    confounded service of tramways. The winds of December and June were all
        +    one to them; their captains (excellent young men he doubted not) were,
        +    to be sure, familiar with Whalley Island, because of late years the
        +    Government had established a white fixed light on the north end (with
        +    a red danger sector over the Condor Reef), but most of them would have
        +    been extremely surprised to hear that a flesh-and-blood Whalley still
        +    existed--an old man going about the world trying to pick up a cargo here
        +    and there for his little bark.</p>
        +
        +    <p>And everywhere it was the same. Departed the men who would have nodded
        +    appreciatively at the mention of his name, and would have thought
        +    themselves bound in honor to do something for Dare-devil Harry Whalley.
        +    Departed the opportunities which he would have known how to seize; and
        +    gone with them the white-winged flock of clippers that lived in the
        +    boisterous uncertain life of the winds, skimming big fortunes out of
        +    the foam of the sea. In a world that pared down the profits to an
        +    irreducible minimum, in a world that was able to count its disengaged
        +    tonnage twice over every day, and in which lean charters were snapped up
        +    by cable three months in advance, there were no chances of fortune for
        +    an individual wandering haphazard with a little bark--hardly indeed any
        +    room to exist.</p>
        +
        +    <p>He found it more difficult from year to year. He suffered greatly from
        +    the smallness of remittances he was able to send his daughter. Meantime
        +    he had given up good cigars, and even in the matter of inferior cheroots
        +    limited himself to six a day. He never told her of his difficulties, and
        +    she never enlarged upon her struggle to live. Their confidence in each
        +    other needed no explanations, and their perfect understanding endured
        +    without protestations of gratitude or regret. He would have been shocked
        +    if she had taken it into her head to thank him in so many words, but
        +    he found it perfectly natural that she should tell him she needed two
        +    hundred pounds.</p>
        +
        +    <p>He had come in with the Fair Maid in ballast to look for a freight in
        +    the Sofala's port of registry, and her letter met him there. Its tenor
        +    was that it was no use mincing matters. Her only resource was in opening
        +    a boarding-house, for which the prospects, she judged, were good. Good
        +    enough, at any rate, to make her tell him frankly that with two hundred
        +    pounds she could make a start. He had torn the envelope open, hastily,
        +    on deck, where it was handed to him by the ship-chandler's runner, who
        +    had brought his mail at the moment of anchoring. For the second time
        +    in his life he was appalled, and remained stock-still at the cabin door
        +    with the paper trembling between his fingers. Open a boarding-house! Two
        +    hundred pounds for a start! The only resource! And he did not know where
        +    to lay his hands on two hundred pence.</p>
        +
        +    <p>All that night Captain Whalley walked the poop of his anchored ship, as
        +    though he had been about to close with the land in thick weather, and
        +    uncertain of his position after a run of many gray days without a sight
        +    of sun, moon, or stars. The black night twinkled with the guiding lights
        +    of seamen and the steady straight lines of lights on shore; and all
        +    around the Fair Maid the riding lights of ships cast trembling trails
        +    upon the water of the roadstead. Captain Whalley saw not a gleam
        +    anywhere till the dawn broke and he found out that his clothing was
        +    soaked through with the heavy dew.</p>
        +
        +    <p>His ship was awake. He stopped short, stroked his wet beard, and
        +    descended the poop ladder backwards, with tired feet. At the sight
        +    of him the chief officer, lounging about sleepily on the quarterdeck,
        +    remained open-mouthed in the middle of a great early-morning yawn.</p>
        +
        +    <p>"Good morning to you," pronounced Captain Whalley solemnly, passing into
        +    the cabin. But he checked himself in the doorway, and without looking
        +    back, "By the bye," he said, "there should be an empty wooden case put
        +    away in the lazarette. It has not been broken up--has it?"</p>
        +
        +    <p>The mate shut his mouth, and then asked as if dazed, "What empty case,
        +    sir?"</p>
        +
        +    <p>"A big flat packing-case belonging to that painting in my room. Let it
        +    be taken up on deck and tell the carpenter to look it over. I may want
        +    to use it before long."</p>
        +
        +    <p>The chief officer did not stir a limb till he had heard the door of the
        +    captain's state-room slam within the cuddy. Then he beckoned aft the
        +    second mate with his forefinger to tell him that there was something "in
        +    the wind."</p>
        +
        +    <p>When the bell rang Captain Whalley's authoritative voice boomed out
        +    through a closed door, "Sit down and don't wait for me." And his
        +    impressed officers took their places, exchanging looks and whispers
        +    across the table. What! No breakfast? And after apparently knocking
        +    about all night on deck, too! Clearly, there was something in the wind.
        +    In the skylight above their heads, bowed earnestly over the plates,
        +    three wire cages rocked and rattled to the restless jumping of the
        +    hungry canaries; and they could detect the sounds of their "old
        +    man's" deliberate movements within his state-room. Captain Whalley was
        +    methodically winding up the chronometers, dusting the portrait of
        +    his late wife, getting a clean white shirt out of the drawers, making
        +    himself ready in his punctilious unhurried manner to go ashore. He could
        +    not have swallowed a single mouthful of food that morning. He had made
        +    up his mind to sell the Fair Maid.</p>
        +
        +    <h3>Chapter III</h3>
        +
        +    <p>Just at that time the Japanese were casting far and wide for ships
        +    of European build, and he had no difficulty in finding a purchaser, a
        +    speculator who drove a hard bargain, but paid cash down for the Fair
        +    Maid, with a view to a profitable resale. Thus it came about that
        +    Captain Whalley found himself on a certain afternoon descending the
        +    steps of one of the most important post-offices of the East with a slip
        +    of bluish paper in his hand. This was the receipt of a registered letter
        +    enclosing a draft for two hundred pounds, and addressed to Melbourne.
        +    Captain Whalley pushed the paper into his waistcoat-pocket, took his
        +    stick from under his arm, and walked down the street.</p>
        +
        +    <p>It was a recently opened and untidy thoroughfare with rudimentary
        +    side-walks and a soft layer of dust cushioning the whole width of
        +    the road. One end touched the slummy street of Chinese shops near the
        +    harbor, the other drove straight on, without houses, for a couple of
        +    miles, through patches of jungle-like vegetation, to the yard gates
        +    of the new Consolidated Docks Company. The crude frontages of the new
        +    Government buildings alternated with the blank fencing of vacant plots,
        +    and the view of the sky seemed to give an added spaciousness to the
        +    broad vista. It was empty and shunned by natives after business
        +    hours, as though they had expected to see one of the tigers from the
        +    neighborhood of the New Waterworks on the hill coming at a loping canter
        +    down the middle to get a Chinese shopkeeper for supper. Captain Whalley
        +    was not dwarfed by the solitude of the grandly planned street. He
        +    had too fine a presence for that. He was only a lonely figure walking
        +    purposefully, with a great white beard like a pilgrim, and with a thick
        +    stick that resembled a weapon. On one side the new Courts of Justice had
        +    a low and unadorned portico of squat columns half concealed by a few old
        +    trees left in the approach. On the other the pavilion wings of the
        +    new Colonial Treasury came out to the line of the street. But Captain
        +    Whalley, who had now no ship and no home, remembered in passing that
        +    on that very site when he first came out from England there had stood a
        +    fishing village, a few mat huts erected on piles between a muddy tidal
        +    creek and a miry pathway that went writhing into a tangled wilderness
        +    without any docks or waterworks.</p>
        +
        +    <p>No ship--no home. And his poor Ivy away there had no home either. A
        +    boarding-house is no sort of home though it may get you a living. His
        +    feelings were horribly rasped by the idea of the boarding-house. In his
        +    rank of life he had that truly aristocratic temperament characterized by
        +    a scorn of vulgar gentility and by prejudiced views as to the derogatory
        +    nature of certain occupations. For his own part he had always preferred
        +    sailing merchant ships (which is a straightforward occupation) to buying
        +    and selling merchandise, of which the essence is to get the better of
        +    somebody in a bargain--an undignified trial of wits at best. His father
        +    had been Colonel Whalley (retired) of the H. E. I. Company's service,
        +    with very slender means besides his pension, but with distinguished
        +    connections. He could remember as a boy how frequently waiters at the
        +    inns, country tradesmen and small people of that sort, used to "My lord"
        +    the old warrior on the strength of his appearance.</p>
        +
        +    <p>Captain Whalley himself (he would have entered the Navy if his father
        +    had not died before he was fourteen) had something of a grand air which
        +    would have suited an old and glorious admiral; but he became lost like
        +    a straw in the eddy of a brook amongst the swarm of brown and yellow
        +    humanity filling a thoroughfare, that by contrast with the vast and
        +    empty avenue he had left seemed as narrow as a lane and absolutely
        +    riotous with life. The walls of the houses were blue; the shops of the
        +    Chinamen yawned like cavernous lairs; heaps of nondescript merchandise
        +    overflowed the gloom of the long range of arcades, and the fiery
        +    serenity of sunset took the middle of the street from end to end with a
        +    glow like the reflection of a fire. It fell on the bright colors and the
        +    dark faces of the bare-footed crowd, on the pallid yellow backs of the
        +    half-naked jostling coolies, on the accouterments of a tall Sikh trooper
        +    with a parted beard and fierce mustaches on sentry before the gate of
        +    the police compound. Looming very big above the heads in a red haze of
        +    dust, the tightly packed car of the cable tramway navigated cautiously
        +    up the human stream, with the incessant blare of its horn, in the manner
        +    of a steamer groping in a fog.</p>
        +
        +    <p>Captain Whalley emerged like a diver on the other side, and in the
        +    desert shade between the walls of closed warehouses removed his hat to
        +    cool his brow. A certain disrepute attached to the calling of a
        +    landlady of a boarding-house. These women were said to be rapacious,
        +    unscrupulous, untruthful; and though he contemned no class of his
        +    fellow-creatures--God forbid!--these were suspicions to which it was
        +    unseemly that a Whalley should lay herself open. He had not expostulated
        +    with her, however. He was confident she shared his feelings; he was
        +    sorry for her; he trusted her judgment; he considered it a merciful
        +    dispensation that he could help her once more,--but in his aristocratic
        +    heart of hearts he would have found it more easy to reconcile himself to
        +    the idea of her turning seamstress. Vaguely he remembered reading years
        +    ago a touching piece called the "Song of the Shirt." It was all very
        +    well making songs about poor women. The granddaughter of Colonel
        +    Whalley, the landlady of a boarding-house! Pooh! He replaced his hat,
        +    dived into two pockets, and stopping a moment to apply a flaring match
        +    to the end of a cheap cheroot, blew an embittered cloud of smoke at a
        +    world that could hold such surprises.</p>
        +
        +    <p>Of one thing he was certain--that she was the own child of a clever
        +    mother. Now he had got over the wrench of parting with his ship, he
        +    perceived clearly that such a step had been unavoidable. Perhaps he had
        +    been growing aware of it all along with an unconfessed knowledge. But
        +    she, far away there, must have had an intuitive perception of it, with
        +    the pluck to face that truth and the courage to speak out--all the
        +    qualities which had made her mother a woman of such excellent counsel.</p>
        +
        +    <p>It would have had to come to that in the end! It was fortunate she had
        +    forced his hand. In another year or two it would have been an utterly
        +    barren sale. To keep the ship going he had been involving himself deeper
        +    every year. He was defenseless before the insidious work of adversity,
        +    to whose more open assaults he could present a firm front; like a
        +    cliff that stands unmoved the open battering of the sea, with a lofty
        +    ignorance of the treacherous backwash undermining its base. As it was,
        +    every liability satisfied, her request answered, and owing no man a
        +    penny, there remained to him from the proceeds a sum of five hundred
        +    pounds put away safely. In addition he had upon his person some forty
        +    odd dollars--enough to pay his hotel bill, providing he did not linger
        +    too long in the modest bedroom where he had taken refuge.</p>
        +
        +    <p>Scantily furnished, and with a waxed floor, it opened into one of
        +    the side-verandas. The straggling building of bricks, as airy as a
        +    bird-cage, resounded with the incessant flapping of rattan screens
        +    worried by the wind between the white-washed square pillars of the
        +    sea-front. The rooms were lofty, a ripple of sunshine flowed over the
        +    ceilings; and the periodical invasions of tourists from some passenger
        +    steamer in the harbor flitted through the wind-swept dusk of the
        +    apartments with the tumult of their unfamiliar voices and impermanent
        +    presences, like relays of migratory shades condemned to speed headlong
        +    round the earth without leaving a trace. The babble of their irruptions
        +    ebbed out as suddenly as it had arisen; the draughty corridors and
        +    the long chairs of the verandas knew their sight-seeing hurry or
        +    their prostrate repose no more; and Captain Whalley, substantial and
        +    dignified, left well-nigh alone in the vast hotel by each light-hearted
        +    skurry, felt more and more like a stranded tourist with no aim in view,
        +    like a forlorn traveler without a home. In the solitude of his room he
        +    smoked thoughtfully, gazing at the two sea-chests which held all that he
        +    could call his own in this world. A thick roll of charts in a sheath
        +    of sailcloth leaned in a corner; the flat packing-case containing the
        +    portrait in oils and the three carbon photographs had been pushed under
        +    the bed. He was tired of discussing terms, of assisting at surveys, of
        +    all the routine of the business. What to the other parties was merely
        +    the sale of a ship was to him a momentous event involving a radically
        +    new view of existence. He knew that after this ship there would be no
        +    other; and the hopes of his youth, the exercise of his abilities, every
        +    feeling and achievement of his manhood, had been indissolubly connected
        +    with ships. He had served ships; he had owned ships; and even the years
        +    of his actual retirement from the sea had been made bearable by the idea
        +    that he had only to stretch out his hand full of money to get a ship. He
        +    had been at liberty to feel as though he were the owner of all the
        +    ships in the world. The selling of this one was weary work; but when
        +    she passed from him at last, when he signed the last receipt, it was as
        +    though all the ships had gone out of the world together, leaving him on
        +    the shore of inaccessible oceans with seven hundred pounds in his hands.</p>
        +
        +    <p>Striding firmly, without haste, along the quay, Captain Whalley averted
        +    his glances from the familiar roadstead. Two generations of seamen born
        +    since his first day at sea stood between him and all these ships at the
        +    anchorage. His own was sold, and he had been asking himself, What next?</p>
        +
        +    <p>From the feeling of loneliness, of inward emptiness,--and of loss
        +    too, as if his very soul had been taken out of him forcibly,--there had
        +    sprung at first a desire to start right off and join his daughter.
        +    "Here are the last pence," he would say to her; "take them, my dear. And
        +    here's your old father: you must take him too."</p>
        +
        +    <p>His soul recoiled, as if afraid of what lay hidden at the bottom of
        +    this impulse. Give up! Never! When one is thoroughly weary all sorts of
        +    nonsense come into one's head. A pretty gift it would have been for a
        +    poor woman--this seven hundred pounds with the incumbrance of a hale old
        +    fellow more than likely to last for years and years to come. Was he not
        +    as fit to die in harness as any of the youngsters in charge of these
        +    anchored ships out yonder? He was as solid now as ever he had been. But
        +    as to who would give him work to do, that was another matter. Were he,
        +    with his appearance and antecedents, to go about looking for a junior's
        +    berth, people, he was afraid, would not take him seriously; or else if
        +    he succeeded in impressing them, he would maybe obtain their pity, which
        +    would be like stripping yourself naked to be kicked. He was not anxious
        +    to give himself away for less than nothing. He had no use for anybody's
        +    pity. On the other hand, a command--the only thing he could try for with
        +    due regard for common decency--was not likely to be lying in wait
        +    for him at the corner of the next street. Commands don't go a-begging
        +    nowadays. Ever since he had come ashore to carry out the business of
        +    the sale he had kept his ears open, but had heard no hint of one being
        +    vacant in the port. And even if there had been one, his successful past
        +    itself stood in his way. He had been his own employer too long. The only
        +    credential he could produce was the testimony of his whole life. What
        +    better recommendation could anyone require? But vaguely he felt that
        +    the unique document would be looked upon as an archaic curiosity of the
        +    Eastern waters, a screed traced in obsolete words--in a half-forgotten
        +    language.</p>
        +
        +    <h3>Chapter IV</h3>
        +
        +    <p>Revolving these thoughts, he strolled on near the railings of the quay,
        +    broad-chested, without a stoop, as though his big shoulders had never
        +    felt the burden of the loads that must be carried between the cradle
        +    and the grave. No single betraying fold or line of care disfigured the
        +    reposeful modeling of his face. It was full and untanned; and the upper
        +    part emerged, massively quiet, out of the downward flow of silvery hair,
        +    with the striking delicacy of its clear complexion and the powerful
        +    width of the forehead. The first cast of his glance fell on you candid
        +    and swift, like a boy's; but because of the ragged snowy thatch of the
        +    eyebrows the affability of his attention acquired the character of a
        +    dark and searching scrutiny. With age he had put on flesh a little, had
        +    increased his girth like an old tree presenting no symptoms of decay;
        +    and even the opulent, lustrous ripple of white hairs upon his chest
        +    seemed an attribute of unquenchable vitality and vigor.</p>
        +
        +    <p>Once rather proud of his great bodily strength, and even of his personal
        +    appearance, conscious of his worth, and firm in his rectitude, there had
        +    remained to him, like the heritage of departed prosperity, the tranquil
        +    bearing of a man who had proved himself fit in every sort of way for the
        +    life of his choice. He strode on squarely under the projecting brim of
        +    an ancient Panama hat. It had a low crown, a crease through its whole
        +    diameter, a narrow black ribbon. Imperishable and a little discolored,
        +    this headgear made it easy to pick him out from afar on thronged wharves
        +    and in the busy streets. He had never adopted the comparatively modern
        +    fashion of pipeclayed cork helmets. He disliked the form; and he hoped
        +    he could manage to keep a cool head to the end of his life without all
        +    these contrivances for hygienic ventilation. His hair was cropped close,
        +    his linen always of immaculate whiteness; a suit of thin gray flannel,
        +    worn threadbare but scrupulously brushed, floated about his burly limbs,
        +    adding to his bulk by the looseness of its cut. The years had mellowed
        +    the good-humored, imperturbable audacity of his prime into a temper
        +    carelessly serene; and the leisurely tapping of his iron-shod stick
        +    accompanied his footfalls with a self-confident sound on the flagstones.
        +    It was impossible to connect such a fine presence and this unruffled
        +    aspect with the belittling troubles of poverty; the man's whole
        +    existence appeared to pass before you, facile and large, in the freedom
        +    of means as ample as the clothing of his body.</p>
        +
        +    <p>The irrational dread of having to break into his five hundred pounds for
        +    personal expenses in the hotel disturbed the steady poise of his mind.
        +    There was no time to lose. The bill was running up. He nourished the
        +    hope that this five hundred would perhaps be the means, if everything
        +    else failed, of obtaining some work which, keeping his body and soul
        +    together (not a matter of great outlay), would enable him to be of use
        +    to his daughter. To his mind it was her own money which he employed, as
        +    it were, in backing her father and solely for her benefit. Once at work,
        +    he would help her with the greater part of his earnings; he was good for
        +    many years yet, and this boarding-house business, he argued to himself,
        +    whatever the prospects, could not be much of a gold-mine from the first
        +    start. But what work? He was ready to lay hold of anything in an honest
        +    way so that it came quickly to his hand; because the five hundred pounds
        +    must be preserved intact for eventual use. That was the great point.
        +    With the entire five hundred one felt a substance at one's back; but
        +    it seemed to him that should he let it dwindle to four-fifty or even
        +    four-eighty, all the efficiency would be gone out of the money, as though
        +    there were some magic power in the round figure. But what sort of work?</p>
        +
        +    <p>Confronted by that haunting question as by an uneasy ghost, for whom he
        +    had no exorcising formula, Captain Whalley stopped short on the apex
        +    of a small bridge spanning steeply the bed of a canalized creek with
        +    granite shores. Moored between the square blocks a seagoing Malay prau
        +    floated half hidden under the arch of masonry, with her spars lowered
        +    down, without a sound of life on board, and covered from stem to stern
        +    with a ridge of palm-leaf mats. He had left behind him the overheated
        +    pavements bordered by the stone frontages that, like the sheer face of
        +    cliffs, followed the sweep of the quays; and an unconfined spaciousness
        +    of orderly and sylvan aspect opened before him its wide plots of rolled
        +    grass, like pieces of green carpet smoothly pegged out, its long ranges
        +    of trees lined up in colossal porticos of dark shafts roofed with a
        +    vault of branches.</p>
        +
        +    <p>Some of these avenues ended at the sea. It was a terraced shore; and
        +    beyond, upon the level expanse, profound and glistening like the gaze
        +    of a dark-blue eye, an oblique band of stippled purple lengthened itself
        +    indefinitely through the gap between a couple of verdant twin islets.
        +    The masts and spars of a few ships far away, hull down in the outer
        +    roads, sprang straight from the water in a fine maze of rosy lines
        +    penciled on the clear shadow of the eastern board. Captain Whalley gave
        +    them a long glance. The ship, once his own, was anchored out there. It
        +    was staggering to think that it was open to him no longer to take a boat
        +    at the jetty and get himself pulled off to her when the evening came. To
        +    no ship. Perhaps never more. Before the sale was concluded, and till the
        +    purchase-money had been paid, he had spent daily some time on board the
        +    Fair Maid. The money had been paid this very morning, and now, all at
        +    once, there was positively no ship that he could go on board of when he
        +    liked; no ship that would need his presence in order to do her work--to
        +    live. It seemed an incredible state of affairs, something too bizarre
        +    to last. And the sea was full of craft of all sorts. There was that prau
        +    lying so still swathed in her shroud of sewn palm-leaves--she too had
        +    her indispensable man. They lived through each other, this Malay he had
        +    never seen, and this high-sterned thing of no size that seemed to be
        +    resting after a long journey. And of all the ships in sight, near and
        +    far, each was provided with a man, the man without whom the finest ship
        +    is a dead thing, a floating and purposeless log.</p>
        +
        +    <p>After his one glance at the roadstead he went on, since there was
        +    nothing to turn back for, and the time must be got through somehow. The
        +    avenues of big trees ran straight over the Esplanade, cutting each other
        +    at diverse angles, columnar below and luxuriant above. The interlaced
        +    boughs high up there seemed to slumber; not a leaf stirred overhead:
        +    and the reedy cast-iron lampposts in the middle of the road, gilt like
        +    scepters, diminished in a long perspective, with their globes of white
        +    porcelain atop, resembling a barbarous decoration of ostriches' eggs
        +    displayed in a row. The flaming sky kindled a tiny crimson spark upon
        +    the glistening surface of each glassy shell.</p>
        +
        +    <p>With his chin sunk a little, his hands behind his back, and the end of
        +    his stick marking the gravel with a faint wavering line at his heels,
        +    Captain Whalley reflected that if a ship without a man was like a body
        +    without a soul, a sailor without a ship was of not much more account
        +    in this world than an aimless log adrift upon the sea. The log might be
        +    sound enough by itself, tough of fiber, and hard to destroy--but what of
        +    that! And a sudden sense of irremediable idleness weighted his feet like
        +    a great fatigue.</p>
        +
        +    <p>A succession of open carriages came bowling along the newly opened
        +    sea-road. You could see across the wide grass-plots the discs of
        +    vibration made by the spokes. The bright domes of the parasols swayed
        +    lightly outwards like full-blown blossoms on the rim of a vase; and
        +    the quiet sheet of dark-blue water, crossed by a bar of purple, made a
        +    background for the spinning wheels and the high action of the horses,
        +    whilst the turbaned heads of the Indian servants elevated above the line
        +    of the sea horizon glided rapidly on the paler blue of the sky. In an
        +    open space near the little bridge each turn-out trotted smartly in a
        +    wide curve away from the sunset; then pulling up sharp, entered the main
        +    alley in a long slow-moving file with the great red stillness of the sky
        +    at the back. The trunks of mighty trees stood all touched with red on
        +    the same side, the air seemed aflame under the high foliage, the
        +    very ground under the hoofs of the horses was red. The wheels turned
        +    solemnly; one after another the sunshades drooped, folding their colors
        +    like gorgeous flowers shutting their petals at the end of the day. In
        +    the whole half-mile of human beings no voice uttered a distinct word,
        +    only a faint thudding noise went on mingled with slight jingling sounds,
        +    and the motionless heads and shoulders of men and women sitting in
        +    couples emerged stolidly above the lowered hoods--as if wooden. But one
        +    carriage and pair coming late did not join the line.</p>
        +
        +    <p>It fled along in a noiseless roll; but on entering the avenue one of the
        +    dark bays snorted, arching his neck and shying against the steel-tipped
        +    pole; a flake of foam fell from the bit upon the point of a satiny
        +    shoulder, and the dusky face of the coachman leaned forward at once over
        +    the hands taking a fresh grip of the reins. It was a long dark-green
        +    landau, having a dignified and buoyant motion between the sharply
        +    curved C-springs, and a sort of strictly official majesty in its supreme
        +    elegance. It seemed more roomy than is usual, its horses seemed slightly
        +    bigger, the appointments a shade more perfect, the servants perched
        +    somewhat higher on the box. The dresses of three women--two young
        +    and pretty, and one, handsome, large, of mature age--seemed to fill
        +    completely the shallow body of the carriage. The fourth face was that
        +    of a man, heavy lidded, distinguished and sallow, with a somber, thick,
        +    iron-gray imperial and mustaches, which somehow had the air of solid
        +    appendages. His Excellency--</p>
        +
        +    <p>The rapid motion of that one equipage made all the others appear utterly
        +    inferior, blighted, and reduced to crawl painfully at a snail's pace.
        +    The landau distanced the whole file in a sort of sustained rush; the
        +    features of the occupant whirling out of sight left behind an impression
        +    of fixed stares and impassive vacancy; and after it had vanished in full
        +    flight as it were, notwithstanding the long line of vehicles hugging the
        +    curb at a walk, the whole lofty vista of the avenue seemed to lie open
        +    and emptied of life in the enlarged impression of an august solitude.</p>
        +
        +    <p>Captain Whalley had lifted his head to look, and his mind, disturbed in
        +    its meditation, turned with wonder (as men's minds will do) to matters
        +    of no importance. It struck him that it was to this port, where he had
        +    just sold his last ship, that he had come with the very first he had
        +    ever owned, and with his head full of a plan for opening a new trade
        +    with a distant part of the Archipelago. The then governor had given
        +    him no end of encouragement. No Excellency he--this Mr. Denham--this
        +    governor with his jacket off; a man who tended night and day, so to
        +    speak, the growing prosperity of the settlement with the self-forgetful
        +    devotion of a nurse for a child she loves; a lone bachelor who lived as
        +    in a camp with the few servants and his three dogs in what was called
        +    then the Government Bungalow: a low-roofed structure on the half-cleared
        +    slope of a hill, with a new flagstaff in front and a police orderly on
        +    the veranda. He remembered toiling up that hill under a heavy sun for
        +    his audience; the unfurnished aspect of the cool shaded room; the long
        +    table covered at one end with piles of papers, and with two guns, a
        +    brass telescope, a small bottle of oil with a feather stuck in the neck
        +    at the other--and the flattering attention given to him by the man in
        +    power. It was an undertaking full of risk he had come to expound, but a
        +    twenty minutes' talk in the Government Bungalow on the hill had made it
        +    go smoothly from the start. And as he was retiring Mr. Denham, already
        +    seated before the papers, called out after him, "Next month the Dido
        +    starts for a cruise that way, and I shall request her captain officially
        +    to give you a look in and see how you get on." The Dido was one of the
        +    smart frigates on the China station--and five-and-thirty years make a
        +    big slice of time. Five-and-thirty years ago an enterprise like his had
        +    for the colony enough importance to be looked after by a Queen's ship.
        +    A big slice of time. Individuals were of some account then. Men like
        +    himself; men, too, like poor Evans, for instance, with his red face,
        +    his coal-black whiskers, and his restless eyes, who had set up the first
        +    patent slip for repairing small ships, on the edge of the forest, in
        +    a lonely bay three miles up the coast. Mr. Denham had encouraged that
        +    enterprise too, and yet somehow poor Evans had ended by dying at
        +    home deucedly hard up. His son, they said, was squeezing oil out of
        +    cocoa-nuts for a living on some God-forsaken islet of the Indian Ocean;
        +    but it was from that patent slip in a lonely wooded bay that had sprung
        +    the workshops of the Consolidated Docks Company, with its three
        +    graving basins carved out of solid rock, its wharves, its jetties,
        +    its electric-light plant, its steam-power houses--with its gigantic
        +    sheer-legs, fit to lift the heaviest weight ever carried afloat, and
        +    whose head could be seen like the top of a queer white monument peeping
        +    over bushy points of land and sandy promontories, as you approached the
        +    New Harbor from the west.</p>
        +
        +    <p>There had been a time when men counted: there were not so many carriages
        +    in the colony then, though Mr. Denham, he fancied, had a buggy. And
        +    Captain Whalley seemed to be swept out of the great avenue by the swirl
        +    of a mental backwash. He remembered muddy shores, a harbor without
        +    quays, the one solitary wooden pier (but that was a public work) jutting
        +    out crookedly, the first coal-sheds erected on Monkey Point, that caught
        +    fire mysteriously and smoldered for days, so that amazed ships came
        +    into a roadstead full of sulphurous smoke, and the sun hung blood-red
        +    at midday. He remembered the things, the faces, and something more
        +    besides--like the faint flavor of a cup quaffed to the bottom, like a
        +    subtle sparkle of the air that was not to be found in the atmosphere of
        +    to-day.</p>
        +
        +    <p>In this evocation, swift and full of detail like a flash of magnesium
        +    light into the niches of a dark memorial hall, Captain Whalley
        +    contemplated things once important, the efforts of small men, the growth
        +    of a great place, but now robbed of all consequence by the greatness
        +    of accomplished facts, by hopes greater still; and they gave him for a
        +    moment such an almost physical grip upon time, such a comprehension of
        +    our unchangeable feelings, that he stopped short, struck the ground with
        +    his stick, and ejaculated mentally, "What the devil am I doing here!" He
        +    seemed lost in a sort of surprise; but he heard his name called out in
        +    wheezy tones once, twice--and turned on his heels slowly.</p>
        +
        +    <p>He beheld then, waddling towards him autocratically, a man of an
        +    old-fashioned and gouty aspect, with hair as white as his own, but with
        +    shaved, florid cheeks, wearing a necktie--almost a neckcloth--whose
        +    stiff ends projected far beyond his chin; with round legs, round arms,
        +    a round body, a round face--generally producing the effect of his short
        +    figure having been distended by means of an air-pump as much as the
        +    seams of his clothing would stand. This was the Master-Attendant of the
        +    port. A master-attendant is a superior sort of harbor-master; a person,
        +    out in the East, of some consequence in his sphere; a Government
        +    official, a magistrate for the waters of the port, and possessed of vast
        +    but ill-defined disciplinary authority over seamen of all classes.
        +    This particular Master-Attendant was reported to consider it miserably
        +    inadequate, on the ground that it did not include the power of life
        +    and death. This was a jocular exaggeration. Captain Eliott was fairly
        +    satisfied with his position, and nursed no inconsiderable sense of such
        +    power as he had. His conceited and tyrannical disposition did not allow
        +    him to let it dwindle in his hands for want of use. The uproarious,
        +    choleric frankness of his comments on people's character and conduct
        +    caused him to be feared at bottom; though in conversation many pretended
        +    not to mind him in the least, others would only smile sourly at the
        +    mention of his name, and there were even some who dared to pronounce him
        +    "a meddlesome old ruffian." But for almost all of them one of Captain
        +    Eliott's outbreaks was nearly as distasteful to face as a chance of
        +    annihilation.</p>
        +
        +      <style>
        +        body {
        +          padding: 15px;
        +        }
        +
        +        .pointer {
        +          padding: 15px;
        +          background-color: rgba(0, 0, 0, 0.4);
        +          color: white;
        +          border-radius: 10px;
        +          pointer-events: none;
        +          opacity: 0;
        +
        +          transition: opacity 300ms;
        +          -webkit-transition: opacity 300ms;
        +        }
        +
        +        .pointer.show {
        +          opacity: 1;
        +        }
        +      </style>
        +
        +
        +      <div class="pointer"></div>
        +
        +      <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +      <script>
        +        new Tether({
        +          element: '.pointer',
        +          attachment: 'middle right',
        +          targetAttachment: 'middle left',
        +          targetModifier: 'scroll-handle',
        +          target: document.body
        +        });
        +
        +        var headers = document.querySelectorAll('h1,h2,h3,h4,h5,h6');
        +        var hideTimeout = null;
        +        var pointer = document.querySelector('.pointer')
        +
        +        var getSection = function(){
        +          var closest, closestTop;
        +          for (var i=0; i < headers.length; i++){
        +            var rect = headers[i].getBoundingClientRect();
        +
        +            if (closestTop === undefined || (rect.top < 0 && rect.top > closestTop)){
        +              closestTop = rect.top;
        +              closest = headers[i];
        +            }
        +          }
        +          return closest.innerHTML;
        +        }
        +
        +        document.addEventListener('scroll', function(){
        +          var percentage = Math.floor((100 * Math.max(0, pageYOffset)) / (document.body.scrollHeight - innerHeight)) + '%'
        +          pointer.innerHTML = getSection() + ' - ' + percentage
        +
        +          pointer.classList.add('show');
        +
        +          if (hideTimeout)
        +            clearTimeout(hideTimeout);
        +  
        +          hideTimeout = setTimeout(function(){
        +            pointer.classList.remove('show');
        +          }, 1000);
        +        });
        +    </script>
        +  </body>
        +</html>
        diff --git a/bower_components/tether/examples/simple/index.html b/bower_components/tether/examples/simple/index.html
        new file mode 100644
        index 0000000000..c648c648c8
        --- /dev/null
        +++ b/bower_components/tether/examples/simple/index.html
        @@ -0,0 +1,30 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="../common/css/style.css" />
        +    </head>
        +    <body>
        +        <div class="instructions">Resize the page to see the Tether flip.</div>
        +
        +        <div class="element"></div>
        +        <div class="target"></div>
        +
        +        <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +        <script>
        +            new Tether({
        +                element: '.element',
        +                target: '.target',
        +                attachment: 'top left',
        +                targetAttachment: 'top right',
        +                constraints: [{
        +                    to: 'window',
        +                    attachment: 'together'
        +                }]
        +            });
        +        </script>
        +    </body>
        +</html>
        diff --git a/bower_components/tether/examples/testbed/index.html b/bower_components/tether/examples/testbed/index.html
        new file mode 100644
        index 0000000000..1a39445936
        --- /dev/null
        +++ b/bower_components/tether/examples/testbed/index.html
        @@ -0,0 +1,36 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <link rel="stylesheet" href="../resources/css/base.css" />
        +        <link rel="stylesheet" href="../common/css/style.css" />
        +    </head>
        +    <body>
        +
        +        <div class="element">
        +        </div>
        +
        +        <div class="container">
        +            <div class="pad"></div>
        +            <div class="target"></div>
        +            <div class="pad"></div>
        +            <div class="pad"></div>
        +        </div>
        +
        +        <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +        <script>
        +            new Tether({
        +                element: '.element',
        +                target: '.target',
        +                attachment: 'top center',
        +                targetAttachment: 'bottom center',
        +                constraints: [{
        +                  to: 'scrollParent',
        +                  attachment: 'together'
        +                }]
        +            });
        +        </script>
        +    </body>
        +  </html>
        diff --git a/bower_components/tether/examples/tooltip/index.html b/bower_components/tether/examples/tooltip/index.html
        new file mode 100644
        index 0000000000..fbf247f4df
        --- /dev/null
        +++ b/bower_components/tether/examples/tooltip/index.html
        @@ -0,0 +1,86 @@
        +<!DOCTYPE html>
        +<html>
        +    <head>
        +        <meta charset="utf-8">
        +        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        +        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        +        <script type="text/javascript" src="//use.typekit.net/jbn8qxr.js"></script>
        +        <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
        +        <link rel="stylesheet" href="../../css/drop.css" />
        +        <link rel="stylesheet" href="../../css/drop-tooltip-theme-arrows.css" />
        +        <style>
        +            body {
        +                font-family: "proxima-nova", "Helvetica Neue", sans-serif;
        +                color: #444;
        +            }
        +
        +            .scroll-parent {
        +                margin: 200px;
        +                height: 300px;
        +                width: 300px;
        +                display: inline-block;
        +                overflow: auto;
        +                border: 2px solid #eee;
        +                padding: 40px;
        +            }
        +        </style>
        +    </head>
        +    <body>
        +        <div class="scroll-parent">
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="top center">Tooltip on Top</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="bottom center">Tooltip on Bottom</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="left middle">Tooltip on Left</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="right middle">Tooltip on Right</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="bottom left">Tooltip on Bottom Left</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="bottom right">Tooltip on Bottom Right</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="top left">Tooltip on Top Left</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="top right">Tooltip on Top Right</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="left bottom">Tooltip on Left Bottom</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="left top">Tooltip on Left Top</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="right bottom">Tooltip on Right Bottom</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +            <p><a href="javascript:;" class="drop-tooltip" data-tooltip-content="Whoa, I'm a tooltip" data-attach="right top">Tooltip on Right Top</a></p>
        +            <p>This is a paragraph of text</p>
        +            <p>This is a paragraph of text</p>
        +        </div>
        +
        +        <script src="../resources/js/log.js"></script>
        +        <script src="../resources/js/jquery.js"></script>
        +        <script src="../../utils.js"></script>
        +        <script src="../../tether.js"></script>
        +        <script src="/drop/drop.min.js"></script>
        +        <script src="../../tooltip.js"></script>
        +        <script src="../../constraint.js"></script>
        +        <script>
        +            $('.drop-tooltip').each(function(){
        +                new Tooltip({
        +                    el: this,
        +                    attach: $(this).data('attach')
        +                });
        +            });
        +        </script>
        +    </body>
        +</html>
        diff --git a/bower_components/tether/examples/viewport/colors.css b/bower_components/tether/examples/viewport/colors.css
        new file mode 100644
        index 0000000000..64f8c1ca90
        --- /dev/null
        +++ b/bower_components/tether/examples/viewport/colors.css
        @@ -0,0 +1,145 @@
        +@charset "UTF-8";
        +/****
        +
        +   colors.css v1.0 For a friendlier looking web
        +   MIT License • http://clrs.cc • http://github.com/mrmrs/colors
        +
        +   Author: mrmrs
        +           http://mrmrs.cc
        +           @mrmrs_
        +
        +****/
        +/*
        +
        +   SKINS
        +   • Backgrounds
        +   • Colors
        +
        +*/
        +/* Backgrounds */
        +.bg-navy {
        +  background-color: #001f3f; }
        +
        +.bg-blue {
        +  background-color: #0074d9; }
        +
        +.bg-aqua {
        +  background-color: #7fdbff; }
        +
        +.bg-teal {
        +  background-color: #39cccc; }
        +
        +.bg-olive {
        +  background-color: #3d9970; }
        +
        +.bg-green {
        +  background-color: #2ecc40; }
        +
        +.bg-lime {
        +  background-color: #01ff70; }
        +
        +.bg-yellow {
        +  background-color: #ffdc00; }
        +
        +.bg-orange {
        +  background-color: #ff851b; }
        +
        +.bg-red {
        +  background-color: #ff4136; }
        +
        +.bg-fuchsia {
        +  background-color: #f012be; }
        +
        +.bg-purple {
        +  background-color: #b10dc9; }
        +
        +.bg-maroon {
        +  background-color: #85144b; }
        +
        +.bg-white {
        +  background-color: white; }
        +
        +.bg-gray {
        +  background-color: #aaaaaa; }
        +
        +.bg-silver {
        +  background-color: #dddddd; }
        +
        +.bg-black {
        +  background-color: #111111; }
        +
        +/* Colors */
        +.navy {
        +  color: #001f3f; }
        +
        +.blue {
        +  color: #0074d9; }
        +
        +.aqua {
        +  color: #7fdbff; }
        +
        +.teal {
        +  color: #39cccc; }
        +
        +.olive {
        +  color: #3d9970; }
        +
        +.green {
        +  color: #2ecc40; }
        +
        +.lime {
        +  color: #01ff70; }
        +
        +.yellow {
        +  color: #ffdc00; }
        +
        +.orange {
        +  color: #ff851b; }
        +
        +.red {
        +  color: #ff4136; }
        +
        +.fuchsia {
        +  color: #f012be; }
        +
        +.purple {
        +  color: #b10dc9; }
        +
        +.maroon {
        +  color: #85144b; }
        +
        +.white {
        +  color: white; }
        +
        +.silver {
        +  color: #dddddd; }
        +
        +.gray {
        +  color: #aaaaaa; }
        +
        +.black {
        +  color: #111111; }
        +
        +/* PRETTIER LINKS */
        +a {
        +  text-decoration: none;
        +  -webkit-transition: color .3s ease-in-out;
        +  transition: color .3s ease-in-out; }
        +
        +a:link {
        +  color: #0074d9;
        +  -webkit-transition: color .3s ease-in-out;
        +  transition: color .3s ease-in-out; }
        +
        +a:visited {
        +  color: #b10dc9; }
        +
        +a:hover {
        +  color: #7fdbff;
        +  -webkit-transition: color .3s ease-in-out;
        +  transition: color .3s ease-in-out; }
        +
        +a:active {
        +  color: #ff851b;
        +  -webkit-transition: color .3s ease-in-out;
        +  transition: color .3s ease-in-out; }
        diff --git a/bower_components/tether/examples/viewport/index.html b/bower_components/tether/examples/viewport/index.html
        new file mode 100644
        index 0000000000..742daa6b91
        --- /dev/null
        +++ b/bower_components/tether/examples/viewport/index.html
        @@ -0,0 +1,70 @@
        +<!DOCTYPE html>
        +<html>
        +  <head>
        +    <link rel="stylesheet" href="../resources/css/base.css" />
        +    <link rel="stylesheet" href="./colors.css" />
        +    <style>
        +      * {
        +        box-sizing: border-box;
        +      }
        +
        +      .element {
        +        background-color: #FFDC00;
        +        width: 80%;
        +        max-width: 300px;
        +        padding: 0 15px;
        +        font-size: 20px;
        +        box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.3);
        +      }
        +
        +      @media (max-width: 380px) {
        +        .element {
        +          font-size: 16px;
        +        }
        +      }
        +
        +      .bit {
        +        width: 10vw;
        +        height: 10vw;
        +        float: left;
        +      }
        +    </style>
        +  </head>
        +  <body>
        +    <div class="element">
        +      <p>This element is tethered to the middle of the visible part of the body.</p>
        +
        +      <p>Inspect the element to see how Tether decided
        +      to use <code>position: fixed</code>.</p>
        +    </div>
        +
        +    <script src="//github.hubspot.com/tether/dist/js/tether.js"></script>
        +    <script>
        +      new Tether({
        +        element: '.element',
        +        target: document.body,
        +        attachment: 'middle center',
        +        targetAttachment: 'middle center',
        +        targetModifier: 'visible'
        +      });
        +    </script>
        +
        +    <script>
        +      // Random colors bit, don't mind this
        +      colors = ['navy', 'blue', 'aqua', 'teal', 'olive', 'green', 'lime',
        +        'yellow', 'orange', 'red', 'fuchsia', 'purple', 'maroon'];
        +
        +      curColors = null;
        +      for(var i=300; i--;){
        +        if (!curColors || !curColors.length)
        +          curColors = colors.slice(0);
        +
        +        var bit = document.createElement('div')
        +        var index = (Math.random() * curColors.length)|0;
        +        bit.className = 'bit bg-' + curColors[index]
        +        curColors.splice(index, 1);
        +        document.body.appendChild(bit);
        +      }
        +    </script>
        +  </body>
        +</html>
        diff --git a/bower_components/tether/gulpfile.js b/bower_components/tether/gulpfile.js
        new file mode 100644
        index 0000000000..8b5e4305ee
        --- /dev/null
        +++ b/bower_components/tether/gulpfile.js
        @@ -0,0 +1,96 @@
        +var del         = require('del');
        +var gulp        = require('gulp');
        +var babel       = require('gulp-babel');
        +var bump        = require('gulp-bump');
        +var concat      = require('gulp-concat');
        +var header      = require('gulp-header');
        +var minify      = require('gulp-minify-css');
        +var plumber     = require('gulp-plumber');
        +var prefixer    = require('gulp-autoprefixer');
        +var rename      = require('gulp-rename');
        +var uglify      = require('gulp-uglify');
        +var sass        = require('gulp-sass');
        +var umd         = require('gulp-wrap-umd');
        +
        +// Variables
        +var distDir = './dist';
        +var pkg = require('./package.json');
        +var banner = ['/*!', pkg.name, pkg.version, '*/\n'].join(' ');
        +var umdOptions = {
        +  exports: 'Tether',
        +  namespace: 'Tether'
        +};
        +
        +
        +// Clean
        +gulp.task('clean', function() {
        +  del.sync([distDir]);
        +});
        +
        +
        +// Javascript
        +gulp.task('js', function() {
        +  gulp.src([
        +    './src/js/utils.js',
        +    './src/js/tether.js',
        +    './src/js/constraint.js',
        +    './src/js/abutment.js',
        +    './src/js/shift.js'
        +  ])
        +    .pipe(plumber())
        +    .pipe(babel())
        +    .pipe(concat('tether.js'))
        +    .pipe(umd(umdOptions))
        +    .pipe(header(banner))
        +
        +    // Original
        +    .pipe(gulp.dest(distDir + '/js'))
        +
        +    // Minified
        +    .pipe(uglify())
        +    .pipe(rename({suffix: '.min'}))
        +    .pipe(gulp.dest(distDir + '/js'));
        +});
        +
        +
        +// CSS
        +gulp.task('css', function() {
        +  gulp.src('./src/css/**/*.sass')
        +    .pipe(plumber())
        +    .pipe(sass())
        +    .pipe(prefixer())
        +
        +    // Original
        +    .pipe(gulp.dest(distDir + '/css'))
        +
        +    // Minified
        +    .pipe(minify())
        +    .pipe(rename({suffix: '.min'}))
        +    .pipe(gulp.dest(distDir + '/css'));
        +});
        +
        +
        +// Version bump
        +var VERSIONS = ['patch', 'minor', 'major'];
        +for (var i = 0; i < VERSIONS.length; ++i){
        +  (function(version) {
        +    gulp.task('version:' + version, function() {
        +      gulp.src(['package.json', 'bower.json', 'component.json'])
        +        .pipe(bump({type: version}))
        +        .pipe(gulp.dest('.'));
        +    });
        +  })(VERSIONS[i]);
        +}
        +
        +
        +// Watch
        +gulp.task('watch', ['js', 'css'], function() {
        +  gulp.watch('./src/js/**/*', ['js']);
        +  gulp.watch('./src/css/**/*', ['css']);
        +});
        +
        +
        +// Defaults
        +gulp.task('build', ['js', 'css']);
        +gulp.task('default', ['build']);
        +
        diff --git a/bower_components/tether/package.json b/bower_components/tether/package.json
        new file mode 100644
        index 0000000000..15f28d587a
        --- /dev/null
        +++ b/bower_components/tether/package.json
        @@ -0,0 +1,40 @@
        +{
        +  "name": "tether",
        +  "version": "1.4.0",
        +  "description": "A client-side library to make absolutely positioned elements attach to elements in the page efficiently.",
        +  "authors": [
        +    "Zack Bloom <zackbloom@gmail.com>",
        +    "Adam Schwartz <adam.flynn.schwartz@gmail.com>"
        +  ],
        +  "maintainers": [
        +    "Nicholas Hwang <nick.joosung.hwang@gmail.com>",
        +    "Trevor Burnham <trevorburnham@gmail.com>"
        +  ],
        +  "scripts": {
        +    "reinstall": "del node_modules && npm install",
        +    "watch": "gulp watch",
        +    "build": "gulp build"
        +  },
        +  "repository": {
        +    "type": "git",
        +    "url": "https://github.com/HubSpot/tether.git"
        +  },
        +  "license": "MIT",
        +  "main": "dist/js/tether.js",
        +  "devDependencies": {
        +    "del": "^2.0.2",
        +    "del-cli": "^0.2.0",
        +    "gulp": "^3.9.0",
        +    "gulp-autoprefixer": "^3.0.1",
        +    "gulp-babel": "^5.2.1",
        +    "gulp-bump": "^0.3.1",
        +    "gulp-concat": "^2.6.0",
        +    "gulp-header": "^1.7.1",
        +    "gulp-minify-css": "^1.2.1",
        +    "gulp-plumber": "^1.0.1",
        +    "gulp-rename": "^1.2.2",
        +    "gulp-sass": "^2.0.4",
        +    "gulp-uglify": "^1.4.1",
        +    "gulp-wrap-umd": "^0.2.1"
        +  }
        +}
        diff --git a/bower_components/tether/src/css/helpers/_tether-theme-arrows.sass b/bower_components/tether/src/css/helpers/_tether-theme-arrows.sass
        new file mode 100644
        index 0000000000..55f2463e8a
        --- /dev/null
        +++ b/bower_components/tether/src/css/helpers/_tether-theme-arrows.sass
        @@ -0,0 +1,192 @@
        +=tether-theme-arrows($themePrefix: "tether", $themeName: "arrows", $arrowSize: 16px, $arrowPointerEvents: null, $backgroundColor: #fff, $color: inherit, $useDropShadow: false)
        +    .#{ $themePrefix }-element.#{ $themePrefix }-theme-#{ $themeName }
        +        max-width: 100%
        +        max-height: 100%
        +
        +        .#{ $themePrefix }-content
        +            border-radius: 5px
        +            position: relative
        +            font-family: inherit
        +            background: $backgroundColor
        +            color: $color
        +            padding: 1em
        +            font-size: 1.1em
        +            line-height: 1.5em
        +
        +            @if $useDropShadow
        +                transform: translateZ(0)
        +                filter: drop-shadow(0 1px 4px rgba(0, 0, 0, .2))
        +
        +            &:before
        +                content: ""
        +                display: block
        +                position: absolute
        +                width: 0
        +                height: 0
        +                border-color: transparent
        +                border-width: $arrowSize
        +                border-style: solid
        +                pointer-events: $arrowPointerEvents
        +
        +        // Centers and middles
        +
        +        &.#{ $themePrefix }-element-attached-bottom.#{ $themePrefix }-element-attached-center .#{ $themePrefix }-content
        +            margin-bottom: $arrowSize
        +
        +            &:before
        +                top: 100%
        +                left: 50%
        +                margin-left: - $arrowSize
        +                border-top-color: $backgroundColor
        +                border-bottom: 0
        +
        +        &.#{ $themePrefix }-element-attached-top.#{ $themePrefix }-element-attached-center .#{ $themePrefix }-content
        +            margin-top: $arrowSize
        +
        +            &:before
        +                bottom: 100%
        +                left: 50%
        +                margin-left: - $arrowSize
        +                border-bottom-color: $backgroundColor
        +                border-top: 0
        +
        +        &.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-element-attached-middle .#{ $themePrefix }-content
        +            margin-right: $arrowSize
        +
        +            &:before
        +                left: 100%
        +                top: 50%
        +                margin-top: - $arrowSize
        +                border-left-color: $backgroundColor
        +                border-right: 0
        +
        +        &.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-element-attached-middle .#{ $themePrefix }-content
        +            margin-left: $arrowSize
        +
        +            &:before
        +                right: 100%
        +                top: 50%
        +                margin-top: - $arrowSize
        +                border-right-color: $backgroundColor
        +                border-left: 0
        +
        +        // Target middle/center, element corner
        +
        +        &.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-target-attached-center .#{ $themePrefix }-content
        +            left: - $arrowSize * 2
        +
        +        &.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-target-attached-center .#{ $themePrefix }-content
        +            left: $arrowSize * 2
        +
        +        &.#{ $themePrefix }-element-attached-top.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-target-attached-middle .#{ $themePrefix }-content
        +            margin-top: $arrowSize
        +
        +            &:before
        +                bottom: 100%
        +                left: $arrowSize
        +                border-bottom-color: $backgroundColor
        +                border-top: 0
        +
        +        &.#{ $themePrefix }-element-attached-top.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-target-attached-middle .#{ $themePrefix }-content
        +            margin-top: $arrowSize
        +
        +            &:before
        +                bottom: 100%
        +                right: $arrowSize
        +                border-bottom-color: $backgroundColor
        +                border-top: 0
        +
        +        &.#{ $themePrefix }-element-attached-bottom.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-target-attached-middle .#{ $themePrefix }-content
        +            margin-bottom: $arrowSize
        +
        +            &:before
        +                top: 100%
        +                left: $arrowSize
        +                border-top-color: $backgroundColor
        +                border-bottom: 0
        +
        +        &.#{ $themePrefix }-element-attached-bottom.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-target-attached-middle .#{ $themePrefix }-content
        +            margin-bottom: $arrowSize
        +
        +            &:before
        +                top: 100%
        +                right: $arrowSize
        +                border-top-color: $backgroundColor
        +                border-bottom: 0
        +
        +
        +        // Top and bottom corners
        +
        +        &.#{ $themePrefix }-element-attached-top.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-target-attached-bottom .#{ $themePrefix }-content
        +            margin-top: $arrowSize
        +
        +            &:before
        +                bottom: 100%
        +                left: $arrowSize
        +                border-bottom-color: $backgroundColor
        +                border-top: 0
        +
        +        &.#{ $themePrefix }-element-attached-top.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-target-attached-bottom .#{ $themePrefix }-content
        +            margin-top: $arrowSize
        +
        +            &:before
        +                bottom: 100%
        +                right: $arrowSize
        +                border-bottom-color: $backgroundColor
        +                border-top: 0
        +
        +        &.#{ $themePrefix }-element-attached-bottom.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-target-attached-top .#{ $themePrefix }-content
        +            margin-bottom: $arrowSize
        +
        +            &:before
        +                top: 100%
        +                left: $arrowSize
        +                border-top-color: $backgroundColor
        +                border-bottom: 0
        +
        +        &.#{ $themePrefix }-element-attached-bottom.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-target-attached-top .#{ $themePrefix }-content
        +            margin-bottom: $arrowSize
        +
        +            &:before
        +                top: 100%
        +                right: $arrowSize
        +                border-top-color: $backgroundColor
        +                border-bottom: 0
        +
        +        // Side corners
        +
        +        &.#{ $themePrefix }-element-attached-top.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-target-attached-left .#{ $themePrefix }-content
        +            margin-right: $arrowSize
        +
        +            &:before
        +                top: $arrowSize
        +                left: 100%
        +                border-left-color: $backgroundColor
        +                border-right: 0
        +
        +        &.#{ $themePrefix }-element-attached-top.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-target-attached-right .#{ $themePrefix }-content
        +            margin-left: $arrowSize
        +
        +            &:before
        +                top: $arrowSize
        +                right: 100%
        +                border-right-color: $backgroundColor
        +                border-left: 0
        +
        +        &.#{ $themePrefix }-element-attached-bottom.#{ $themePrefix }-element-attached-right.#{ $themePrefix }-target-attached-left .#{ $themePrefix }-content
        +            margin-right: $arrowSize
        +
        +            &:before
        +                bottom: $arrowSize
        +                left: 100%
        +                border-left-color: $backgroundColor
        +                border-right: 0
        +
        +        &.#{ $themePrefix }-element-attached-bottom.#{ $themePrefix }-element-attached-left.#{ $themePrefix }-target-attached-right .#{ $themePrefix }-content
        +            margin-left: $arrowSize
        +
        +            &:before
        +                bottom: $arrowSize
        +                right: 100%
        +                border-right-color: $backgroundColor
        +                border-left: 0
        diff --git a/bower_components/tether/src/css/helpers/_tether-theme-basic.sass b/bower_components/tether/src/css/helpers/_tether-theme-basic.sass
        new file mode 100644
        index 0000000000..f7e9fb761f
        --- /dev/null
        +++ b/bower_components/tether/src/css/helpers/_tether-theme-basic.sass
        @@ -0,0 +1,14 @@
        +=tether-theme-basic($themePrefix: "tether", $themeName: "basic", $backgroundColor: #fff, $color: inherit)
        +    .#{ $themePrefix }-element.#{ $themePrefix }-theme-#{ $themeName }
        +        max-width: 100%
        +        max-height: 100%
        +
        +        .#{ $themePrefix }-content
        +            border-radius: 5px
        +            box-shadow: 0 2px 8px rgba(0, 0, 0, .2)
        +            font-family: inherit
        +            background: $backgroundColor
        +            color: $color
        +            padding: 1em
        +            font-size: 1.1em
        +            line-height: 1.5em
        diff --git a/bower_components/tether/src/css/helpers/_tether.sass b/bower_components/tether/src/css/helpers/_tether.sass
        new file mode 100644
        index 0000000000..a6d8e506c7
        --- /dev/null
        +++ b/bower_components/tether/src/css/helpers/_tether.sass
        @@ -0,0 +1,12 @@
        +=tether($themePrefix: "tether")
        +    .#{ $themePrefix }-element, .#{ $themePrefix }-element *
        +
        +        &, &:after, &:before
        +            box-sizing: border-box
        +
        +    .#{ $themePrefix }-element
        +        position: absolute
        +        display: none
        +
        +        &.#{ $themePrefix }-open
        +            display: block
        diff --git a/bower_components/tether/src/css/mixins/_inline-block.sass b/bower_components/tether/src/css/mixins/_inline-block.sass
        new file mode 100644
        index 0000000000..0e9814386f
        --- /dev/null
        +++ b/bower_components/tether/src/css/mixins/_inline-block.sass
        @@ -0,0 +1,6 @@
        +@mixin inline-block
        +  display: inline-block
        +  vertical-align: middle
        +  *vertical-align: auto
        +  *zoom: 1
        +  *display: inline
        diff --git a/bower_components/tether/src/css/mixins/_pie-clearfix.sass b/bower_components/tether/src/css/mixins/_pie-clearfix.sass
        new file mode 100644
        index 0000000000..ef8c9c48ff
        --- /dev/null
        +++ b/bower_components/tether/src/css/mixins/_pie-clearfix.sass
        @@ -0,0 +1,7 @@
        +@mixin pie-clearfix
        +  *zoom: 1
        +
        +  &:after
        +    content: ""
        +    display: table
        +    clear: both
        diff --git a/bower_components/tether/src/css/tether-theme-arrows-dark.sass b/bower_components/tether/src/css/tether-theme-arrows-dark.sass
        new file mode 100644
        index 0000000000..ad1caf0160
        --- /dev/null
        +++ b/bower_components/tether/src/css/tether-theme-arrows-dark.sass
        @@ -0,0 +1,12 @@
        +@import helpers/tether
        +@import helpers/tether-theme-arrows
        +
        +$themePrefix: "tether"
        +$themeName: "arrows-dark"
        +$arrowSize: 16px
        +$backgroundColor: #000
        +$color: #fff
        +$useDropShadow: false
        +
        ++tether($themePrefix: $themePrefix)
        ++tether-theme-arrows($themePrefix: $themePrefix, $themeName: $themeName, $arrowSize: $arrowSize, $backgroundColor: $backgroundColor, $color: $color, $useDropShadow: $useDropShadow)
        diff --git a/bower_components/tether/src/css/tether-theme-arrows.sass b/bower_components/tether/src/css/tether-theme-arrows.sass
        new file mode 100644
        index 0000000000..87765b2232
        --- /dev/null
        +++ b/bower_components/tether/src/css/tether-theme-arrows.sass
        @@ -0,0 +1,12 @@
        +@import helpers/tether
        +@import helpers/tether-theme-arrows
        +
        +$themePrefix: "tether"
        +$themeName: "arrows"
        +$arrowSize: 16px
        +$backgroundColor: #fff
        +$color: inherit
        +$useDropShadow: true
        +
        ++tether($themePrefix: $themePrefix)
        ++tether-theme-arrows($themePrefix: $themePrefix, $themeName: $themeName, $arrowSize: $arrowSize, $backgroundColor: $backgroundColor, $color: $color, $useDropShadow: $useDropShadow)
        diff --git a/bower_components/tether/src/css/tether-theme-basic.sass b/bower_components/tether/src/css/tether-theme-basic.sass
        new file mode 100644
        index 0000000000..9a2be063df
        --- /dev/null
        +++ b/bower_components/tether/src/css/tether-theme-basic.sass
        @@ -0,0 +1,10 @@
        +@import helpers/tether
        +@import helpers/tether-theme-basic
        +
        +$themePrefix: "tether"
        +$themeName: "basic"
        +$backgroundColor: #fff
        +$color: inherit
        +
        ++tether($themePrefix: $themePrefix)
        ++tether-theme-basic($themePrefix: $themePrefix, $themeName: $themeName, $backgroundColor: $backgroundColor, $color: $color)
        \ No newline at end of file
        diff --git a/bower_components/tether/src/css/tether.sass b/bower_components/tether/src/css/tether.sass
        new file mode 100644
        index 0000000000..64210164d2
        --- /dev/null
        +++ b/bower_components/tether/src/css/tether.sass
        @@ -0,0 +1,5 @@
        +@import helpers/tether
        +
        +$themePrefix: "tether"
        +
        ++tether($themePrefix: $themePrefix)
        \ No newline at end of file
        diff --git a/bower_components/tether/src/js/abutment.js b/bower_components/tether/src/js/abutment.js
        new file mode 100644
        index 0000000000..960563534c
        --- /dev/null
        +++ b/bower_components/tether/src/js/abutment.js
        @@ -0,0 +1,61 @@
        +/* globals TetherBase */
        +
        +const {getBounds, updateClasses, defer} = TetherBase.Utils;
        +
        +TetherBase.modules.push({
        +  position({top, left}) {
        +    const {height, width} = this.cache('element-bounds', () => {
        +      return getBounds(this.element);
        +    });
        +
        +    const targetPos = this.getTargetBounds();
        +
        +    const bottom = top + height;
        +    const right = left + width;
        +
        +    const abutted = [];
        +    if (top <= targetPos.bottom && bottom >= targetPos.top) {
        +      ['left', 'right'].forEach(side => {
        +        const targetPosSide = targetPos[side];
        +        if (targetPosSide === left || targetPosSide === right) {
        +          abutted.push(side);
        +        }
        +      });
        +    }
        +
        +    if (left <= targetPos.right && right >= targetPos.left) {
        +      ['top', 'bottom'].forEach(side => {
        +        const targetPosSide = targetPos[side];
        +        if (targetPosSide === top || targetPosSide === bottom) {
        +          abutted.push(side);
        +        }
        +      });
        +    }
        +
        +    const allClasses = [];
        +    const addClasses = [];
        +
        +    const sides = ['left', 'top', 'right', 'bottom'];
        +    allClasses.push(this.getClass('abutted'));
        +    sides.forEach(side => {
        +      allClasses.push(`${ this.getClass('abutted') }-${ side }`);
        +    });
        +
        +    if (abutted.length) {
        +      addClasses.push(this.getClass('abutted'));
        +    }
        +
        +    abutted.forEach(side => {
        +      addClasses.push(`${ this.getClass('abutted') }-${ side }`);
        +    });
        +
        +    defer(() => {
        +      if (!(this.options.addTargetClasses === false)) {
        +        updateClasses(this.target, addClasses, allClasses);
        +      }
        +      updateClasses(this.element, addClasses, allClasses);
        +    });
        +
        +    return true;
        +  }
        +});
        diff --git a/bower_components/tether/src/js/constraint.js b/bower_components/tether/src/js/constraint.js
        new file mode 100644
        index 0000000000..1717149cff
        --- /dev/null
        +++ b/bower_components/tether/src/js/constraint.js
        @@ -0,0 +1,366 @@
        +/* globals TetherBase */
        +
        +const {
        +  getBounds,
        +  extend,
        +  updateClasses,
        +  defer
        +} = TetherBase.Utils;
        +
        +const BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];
        +
        +function getBoundingRect(tether, to) {
        +  if (to === 'scrollParent') {
        +    to = tether.scrollParents[0];
        +  } else if (to === 'window') {
        +    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];
        +  }
        +
        +  if (to === document) {
        +    to = to.documentElement;
        +  }
        +
        +  if (typeof to.nodeType !== 'undefined') {
        +    const node = to;
        +    const size = getBounds(to);
        +    const pos = size;
        +    const style = getComputedStyle(to);
        +
        +    to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];
        +  
        +    // Account any parent Frames scroll offset
        +    if (node.ownerDocument !== document) {
        +      let win = node.ownerDocument.defaultView;
        +      to[0] += win.pageXOffset;
        +      to[1] += win.pageYOffset;
        +      to[2] += win.pageXOffset;
        +      to[3] += win.pageYOffset;
        +    }
        +  
        +    BOUNDS_FORMAT.forEach((side, i) => {
        +      side = side[0].toUpperCase() + side.substr(1);
        +      if (side === 'Top' || side === 'Left') {
        +        to[i] += parseFloat(style[`border${ side }Width`]);
        +      } else {
        +        to[i] -= parseFloat(style[`border${ side }Width`]);
        +      }
        +    });
        +  }
        +
        +  return to;
        +}
        +
        +TetherBase.modules.push({
        +  position({top, left, targetAttachment}) {
        +    if (!this.options.constraints) {
        +      return true;
        +    }
        +
        +    let {height, width} = this.cache('element-bounds', () => {
        +      return getBounds(this.element);
        +    });
        +
        +    if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {
        +      // Handle the item getting hidden as a result of our positioning without glitching
        +      // the classes in and out
        +      ({width, height} = this.lastSize);
        +    }
        +
        +    const targetSize = this.cache('target-bounds', () => {
        +      return this.getTargetBounds();
        +    });
        +
        +    const {height: targetHeight, width: targetWidth} = targetSize;
        +
        +    const allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];
        +
        +    this.options.constraints.forEach(constraint => {
        +      const {outOfBoundsClass, pinnedClass} = constraint;
        +      if (outOfBoundsClass) {
        +        allClasses.push(outOfBoundsClass);
        +      }
        +      if (pinnedClass) {
        +        allClasses.push(pinnedClass);
        +      }
        +    });
        +
        +    allClasses.forEach(cls => {
        +      ['left', 'top', 'right', 'bottom'].forEach(side => {
        +        allClasses.push(`${ cls }-${ side }`);
        +      });
        +    });
        +
        +    const addClasses = [];
        +
        +    const tAttachment = extend({}, targetAttachment);
        +    const eAttachment = extend({}, this.attachment);
        +
        +    this.options.constraints.forEach(constraint => {
        +      let {to, attachment, pin} = constraint;
        +
        +      if (typeof attachment === 'undefined') {
        +        attachment = '';
        +      }
        +
        +      let changeAttachX, changeAttachY;
        +      if (attachment.indexOf(' ') >= 0) {
        +        [changeAttachY, changeAttachX] = attachment.split(' ');
        +      } else {
        +        changeAttachX = changeAttachY = attachment;
        +      }
        +
        +      const bounds = getBoundingRect(this, to);
        +
        +      if (changeAttachY === 'target' || changeAttachY === 'both') {
        +        if (top < bounds[1] && tAttachment.top === 'top') {
        +          top += targetHeight;
        +          tAttachment.top = 'bottom';
        +        }
        +
        +        if (top + height > bounds[3] && tAttachment.top === 'bottom') {
        +          top -= targetHeight;
        +          tAttachment.top = 'top';
        +        }
        +      }
        +
        +      if (changeAttachY === 'together') {
        +        if (tAttachment.top === 'top') {
        +          if (eAttachment.top === 'bottom' && top < bounds[1]) {
        +            top += targetHeight;
        +            tAttachment.top = 'bottom';
        +
        +            top += height;
        +            eAttachment.top = 'top';
        +
        +          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {
        +            top -= height - targetHeight;
        +            tAttachment.top = 'bottom';
        +
        +            eAttachment.top = 'bottom';
        +          }
        +        }
        +
        +        if (tAttachment.top === 'bottom') {
        +          if (eAttachment.top === 'top' && top + height > bounds[3]) {
        +            top -= targetHeight;
        +            tAttachment.top = 'top';
        +
        +            top -= height;
        +            eAttachment.top = 'bottom';
        +
        +          } else if (eAttachment.top === 'bottom'&& top < bounds[1] && top + (height*2 - targetHeight) <= bounds[3]) {
        +            top += height - targetHeight;
        +            tAttachment.top = 'top';
        +
        +            eAttachment.top = 'top';
        +
        +          }
        +        }
        +
        +        if (tAttachment.top === 'middle') {
        +          if (top + height > bounds[3] && eAttachment.top === 'top') {
        +            top -= height;
        +            eAttachment.top = 'bottom';
        +
        +          } else if (top < bounds[1] && eAttachment.top === 'bottom') {
        +            top += height;
        +            eAttachment.top = 'top';
        +          }
        +        }
        +      }
        +
        +      if (changeAttachX === 'target' || changeAttachX === 'both') {
        +        if (left < bounds[0] && tAttachment.left === 'left') {
        +          left += targetWidth;
        +          tAttachment.left = 'right';
        +        }
        +
        +        if (left + width > bounds[2] && tAttachment.left === 'right') {
        +          left -= targetWidth;
        +          tAttachment.left = 'left';
        +        }
        +      }
        +
        +      if (changeAttachX === 'together') {
        +        if (left < bounds[0] && tAttachment.left === 'left') {
        +          if (eAttachment.left === 'right') {
        +            left += targetWidth;
        +            tAttachment.left = 'right';
        +
        +            left += width;
        +            eAttachment.left = 'left';
        +
        +          } else if (eAttachment.left === 'left') {
        +            left += targetWidth;
        +            tAttachment.left = 'right';
        +
        +            left -= width;
        +            eAttachment.left = 'right';
        +          }
        +
        +        } else if (left + width > bounds[2] && tAttachment.left === 'right') {
        +          if (eAttachment.left === 'left') {
        +            left -= targetWidth;
        +            tAttachment.left = 'left';
        +
        +            left -= width;
        +            eAttachment.left = 'right';
        +
        +          } else if (eAttachment.left === 'right') {
        +            left -= targetWidth;
        +            tAttachment.left = 'left';
        +
        +            left += width;
        +            eAttachment.left = 'left';
        +          }
        +
        +        } else if (tAttachment.left === 'center') {
        +          if (left + width > bounds[2] && eAttachment.left === 'left') {
        +            left -= width;
        +            eAttachment.left = 'right';
        +
        +          } else if (left < bounds[0] && eAttachment.left === 'right') {
        +            left += width;
        +            eAttachment.left = 'left';
        +          }
        +        }
        +      }
        +
        +      if (changeAttachY === 'element' || changeAttachY === 'both') {
        +        if (top < bounds[1] && eAttachment.top === 'bottom') {
        +          top += height;
        +          eAttachment.top = 'top';
        +        }
        +
        +        if (top + height > bounds[3] && eAttachment.top === 'top') {
        +          top -= height;
        +          eAttachment.top = 'bottom';
        +        }
        +      }
        +
        +      if (changeAttachX === 'element' || changeAttachX === 'both') {
        +        if (left < bounds[0]) {
        +          if (eAttachment.left === 'right') {
        +            left += width;
        +            eAttachment.left = 'left';
        +          } else if (eAttachment.left === 'center') {
        +            left += (width / 2);
        +            eAttachment.left = 'left';
        +          }
        +        }
        +
        +        if (left + width > bounds[2]) {
        +          if (eAttachment.left === 'left') {
        +            left -= width;
        +            eAttachment.left = 'right';
        +          } else if (eAttachment.left === 'center') {
        +            left -= (width / 2);
        +            eAttachment.left = 'right';
        +          }
        +        }
        +      }
        +
        +      if (typeof pin === 'string') {
        +        pin = pin.split(',').map(p => p.trim());
        +      } else if (pin === true) {
        +        pin = ['top', 'left', 'right', 'bottom'];
        +      }
        +
        +      pin = pin || [];
        +
        +      const pinned = [];
        +      const oob = [];
        +
        +      if (top < bounds[1]) {
        +        if (pin.indexOf('top') >= 0) {
        +          top = bounds[1];
        +          pinned.push('top');
        +        } else {
        +          oob.push('top');
        +        }
        +      }
        +
        +      if (top + height > bounds[3]) {
        +        if (pin.indexOf('bottom') >= 0) {
        +          top = bounds[3] - height;
        +          pinned.push('bottom');
        +        } else {
        +          oob.push('bottom');
        +        }
        +      }
        +
        +      if (left < bounds[0]) {
        +        if (pin.indexOf('left') >= 0) {
        +          left = bounds[0];
        +          pinned.push('left');
        +        } else {
        +          oob.push('left');
        +        }
        +      }
        +
        +      if (left + width > bounds[2]) {
        +        if (pin.indexOf('right') >= 0) {
        +          left = bounds[2] - width;
        +          pinned.push('right');
        +        } else {
        +          oob.push('right');
        +        }
        +      }
        +
        +      if (pinned.length) {
        +        let pinnedClass;
        +        if (typeof this.options.pinnedClass !== 'undefined') {
        +          pinnedClass = this.options.pinnedClass;
        +        } else {
        +          pinnedClass = this.getClass('pinned');
        +        }
        +
        +        addClasses.push(pinnedClass);
        +        pinned.forEach(side => {
        +          addClasses.push(`${ pinnedClass }-${ side }`);
        +        });
        +      }
        +
        +      if (oob.length) {
        +        let oobClass;
        +        if (typeof this.options.outOfBoundsClass !== 'undefined') {
        +          oobClass = this.options.outOfBoundsClass;
        +        } else {
        +          oobClass = this.getClass('out-of-bounds');
        +        }
        +
        +        addClasses.push(oobClass);
        +        oob.forEach(side => {
        +          addClasses.push(`${ oobClass }-${ side }`);
        +        });
        +      }
        +
        +      if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {
        +        eAttachment.left = tAttachment.left = false;
        +      }
        +      if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {
        +        eAttachment.top = tAttachment.top = false;
        +      }
        +
        +      if (tAttachment.top !== targetAttachment.top ||
        +          tAttachment.left !== targetAttachment.left ||
        +          eAttachment.top !== this.attachment.top ||
        +          eAttachment.left !== this.attachment.left) {
        +        this.updateAttachClasses(eAttachment, tAttachment);
        +        this.trigger('update', {
        +          attachment: eAttachment,
        +          targetAttachment: tAttachment,
        +        });
        +      }
        +    });
        +
        +    defer(() => {
        +      if (!(this.options.addTargetClasses === false)) {
        +        updateClasses(this.target, addClasses, allClasses);
        +      }
        +      updateClasses(this.element, addClasses, allClasses);
        +    });
        +
        +    return {top, left};
        +  }
        +});
        diff --git a/bower_components/tether/src/js/markAttachment.js b/bower_components/tether/src/js/markAttachment.js
        new file mode 100644
        index 0000000000..edcc79a187
        --- /dev/null
        +++ b/bower_components/tether/src/js/markAttachment.js
        @@ -0,0 +1,46 @@
        +/* globals Tether */
        +
        +Tether.modules.push({
        +  initialize() {
        +    this.markers = {};
        +
        +    ['target', 'element'].forEach(type => {
        +      const el = document.createElement('div');
        +      el.className = this.getClass(`${ type }-marker`);
        +
        +      const dot = document.createElement('div');
        +      dot.className = this.getClass('marker-dot');
        +      el.appendChild(dot);
        +
        +      this[type].appendChild(el);
        +
        +      this.markers[type] = {dot, el};
        +    });
        +  },
        +
        +  position({manualOffset, manualTargetOffset}) {
        +    const offsets = {
        +      element: manualOffset,
        +      target: manualTargetOffset
        +    };
        +
        +    for (let type in offsets) {
        +      const offset = offsets[type];
        +      for (let side in offset) {
        +        let val = offset[side];
        +        const notString = typeof val !== 'string';
        +        if (notString ||
        +            val.indexOf('%') === -1 &&
        +            val.indexOf('px') === -1) {
        +          val += 'px';
        +        }
        +
        +        if (this.markers[type].dot.style[side] !== val) {
        +          this.markers[type].dot.style[side] = val;
        +        }
        +      }
        +    }
        +
        +    return true;
        +  }
        +});
        diff --git a/bower_components/tether/src/js/shift.js b/bower_components/tether/src/js/shift.js
        new file mode 100644
        index 0000000000..ecc872d27b
        --- /dev/null
        +++ b/bower_components/tether/src/js/shift.js
        @@ -0,0 +1,32 @@
        +/* globals TetherBase */
        +
        +TetherBase.modules.push({
        +  position({top, left}) {
        +    if (!this.options.shift) {
        +      return;
        +    }
        +
        +    let shift = this.options.shift;
        +    if (typeof this.options.shift === 'function') {
        +      shift = this.options.shift.call(this, {top, left});
        +    }
        +
        +    let shiftTop, shiftLeft;
        +    if (typeof shift === 'string') {
        +      shift = shift.split(' ');
        +      shift[1] = shift[1] || shift[0];
        +
        +      ([shiftTop, shiftLeft] = shift);
        +
        +      shiftTop = parseFloat(shiftTop, 10);
        +      shiftLeft = parseFloat(shiftLeft, 10);
        +    } else {
        +      ([shiftTop, shiftLeft] = [shift.top, shift.left]);
        +    }
        +
        +    top += shiftTop;
        +    left += shiftLeft;
        +
        +    return {top, left};
        +  }
        +});
        diff --git a/bower_components/tether/src/js/tether.js b/bower_components/tether/src/js/tether.js
        new file mode 100644
        index 0000000000..5ebc84fad1
        --- /dev/null
        +++ b/bower_components/tether/src/js/tether.js
        @@ -0,0 +1,809 @@
        +/* globals TetherBase, performance */
        +
        +if (typeof TetherBase === 'undefined') {
        +  throw new Error('You must include the utils.js file before tether.js');
        +}
        +
        +const {
        +  getScrollParents,
        +  getBounds,
        +  getOffsetParent,
        +  extend,
        +  addClass,
        +  removeClass,
        +  updateClasses,
        +  defer,
        +  flush,
        +  getScrollBarSize,
        +  removeUtilElements
        +} = TetherBase.Utils;
        +
        +function within(a, b, diff=1) {
        +  return (a + diff >= b && b >= a - diff);
        +}
        +
        +const transformKey = (() => {
        +  if(typeof document === 'undefined') {
        +    return '';
        +  }
        +  const el = document.createElement('div');
        +
        +  const transforms = ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'];
        +  for (let i = 0; i < transforms.length; ++i) {
        +    const key = transforms[i];
        +    if (el.style[key] !== undefined) {
        +      return key;
        +    }
        +  }
        +})();
        +
        +const tethers = [];
        +
        +const position = () => {
        +  tethers.forEach(tether => {
        +    tether.position(false);
        +  });
        +  flush();
        +};
        +
        +function now() {
        +  if (typeof performance !== 'undefined' && typeof performance.now !== 'undefined') {
        +    return performance.now();
        +  }
        +  return +new Date;
        +}
        +
        +(() => {
        +  let lastCall = null;
        +  let lastDuration = null;
        +  let pendingTimeout = null;
        +
        +  const tick = () => {
        +    if (typeof lastDuration !== 'undefined' && lastDuration > 16) {
        +      // We voluntarily throttle ourselves if we can't manage 60fps
        +      lastDuration = Math.min(lastDuration - 16, 250);
        +
        +      // Just in case this is the last event, remember to position just once more
        +      pendingTimeout = setTimeout(tick, 250);
        +      return;
        +    }
        +
        +    if (typeof lastCall !== 'undefined' && (now() - lastCall) < 10) {
        +      // Some browsers call events a little too frequently, refuse to run more than is reasonable
        +      return;
        +    }
        +
        +    if (pendingTimeout != null) {
        +      clearTimeout(pendingTimeout);
        +      pendingTimeout = null;
        +    }
        +
        +    lastCall = now();
        +    position();
        +    lastDuration = now() - lastCall;
        +  };
        +
        +  if(typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {
        +    ['resize', 'scroll', 'touchmove'].forEach(event => {
        +      window.addEventListener(event, tick);
        +    });
        +  }
        +})();
        +
        +const MIRROR_LR = {
        +  center: 'center',
        +  left: 'right',
        +  right: 'left'
        +};
        +
        +const MIRROR_TB = {
        +  middle: 'middle',
        +  top: 'bottom',
        +  bottom: 'top'
        +};
        +
        +const OFFSET_MAP = {
        +  top: 0,
        +  left: 0,
        +  middle: '50%',
        +  center: '50%',
        +  bottom: '100%',
        +  right: '100%'
        +};
        +
        +const autoToFixedAttachment = (attachment, relativeToAttachment) => {
        +  let {left, top} = attachment;
        +
        +  if (left === 'auto') {
        +    left = MIRROR_LR[relativeToAttachment.left];
        +  }
        +
        +  if (top === 'auto') {
        +    top = MIRROR_TB[relativeToAttachment.top];
        +  }
        +
        +  return {left, top};
        +};
        +
        +const attachmentToOffset = (attachment) => {
        +  let left = attachment.left;
        +  let top = attachment.top;
        +
        +  if (typeof OFFSET_MAP[attachment.left] !== 'undefined') {
        +    left = OFFSET_MAP[attachment.left];
        +  }
        +
        +  if (typeof OFFSET_MAP[attachment.top] !== 'undefined') {
        +    top = OFFSET_MAP[attachment.top];
        +  }
        +
        +  return {left, top};
        +};
        +
        +function addOffset(...offsets) {
        +  const out = {top: 0, left: 0};
        +
        +  offsets.forEach(({top, left}) => {
        +    if (typeof top === 'string') {
        +      top = parseFloat(top, 10);
        +    }
        +    if (typeof left === 'string') {
        +      left = parseFloat(left, 10);
        +    }
        +
        +    out.top += top;
        +    out.left += left;
        +  });
        +
        +  return out;
        +}
        +
        +function offsetToPx(offset, size) {
        +  if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {
        +    offset.left = parseFloat(offset.left, 10) / 100 * size.width;
        +  }
        +  if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {
        +    offset.top = parseFloat(offset.top, 10) / 100 * size.height;
        +  }
        +
        +  return offset;
        +}
        +
        +const parseOffset = (value) => {
        +  const [top, left] = value.split(' ');
        +  return {top, left};
        +};
        +const parseAttachment = parseOffset;
        +
        +class TetherClass extends Evented {
        +
        +  constructor(options) {
        +    super();
        +    this.position = this.position.bind(this);
        +
        +    tethers.push(this);
        +
        +    this.history = [];
        +
        +    this.setOptions(options, false);
        +
        +    TetherBase.modules.forEach(module => {
        +      if (typeof module.initialize !== 'undefined') {
        +        module.initialize.call(this);
        +      }
        +    });
        +
        +    this.position();
        +  }
        +
        +  getClass(key='') {
        +    const {classes} = this.options;
        +    if (typeof classes !== 'undefined' && classes[key]) {
        +      return this.options.classes[key];
        +    } else if (this.options.classPrefix) {
        +      return `${ this.options.classPrefix }-${ key }`;
        +    } else {
        +      return key;
        +    }
        +  }
        +
        +  setOptions(options, pos=true) {
        +    const defaults = {
        +      offset: '0 0',
        +      targetOffset: '0 0',
        +      targetAttachment: 'auto auto',
        +      classPrefix: 'tether'
        +    };
        +
        +    this.options = extend(defaults, options);
        +
        +    let {element, target, targetModifier} = this.options;
        +    this.element = element;
        +    this.target = target;
        +    this.targetModifier = targetModifier;
        +
        +    if (this.target === 'viewport') {
        +      this.target = document.body;
        +      this.targetModifier = 'visible';
        +    } else if (this.target === 'scroll-handle') {
        +      this.target = document.body;
        +      this.targetModifier = 'scroll-handle';
        +    }
        +
        +    ['element', 'target'].forEach(key => {
        +      if (typeof this[key] === 'undefined') {
        +        throw new Error('Tether Error: Both element and target must be defined');
        +      }
        +
        +      if (typeof this[key].jquery !== 'undefined') {
        +        this[key] = this[key][0];
        +      } else if (typeof this[key] === 'string') {
        +        this[key] = document.querySelector(this[key]);
        +      }
        +    });
        +
        +    addClass(this.element, this.getClass('element'));
        +    if (!(this.options.addTargetClasses === false)) {
        +      addClass(this.target, this.getClass('target'));
        +    }
        +
        +    if (!this.options.attachment) {
        +      throw new Error('Tether Error: You must provide an attachment');
        +    }
        +
        +    this.targetAttachment = parseAttachment(this.options.targetAttachment);
        +    this.attachment = parseAttachment(this.options.attachment);
        +    this.offset = parseOffset(this.options.offset);
        +    this.targetOffset = parseOffset(this.options.targetOffset);
        +
        +    if (typeof this.scrollParents !== 'undefined') {
        +      this.disable();
        +    }
        +
        +    if (this.targetModifier === 'scroll-handle') {
        +      this.scrollParents = [this.target];
        +    } else {
        +      this.scrollParents = getScrollParents(this.target);
        +    }
        +
        +    if(!(this.options.enabled === false)) {
        +      this.enable(pos);
        +    }
        +  }
        +
        +  getTargetBounds() {
        +    if (typeof this.targetModifier !== 'undefined') {
        +      if (this.targetModifier === 'visible') {
        +        if (this.target === document.body) {
        +          return {top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth};
        +        } else {
        +          const bounds = getBounds(this.target);
        +
        +          const out = {
        +            height: bounds.height,
        +            width: bounds.width,
        +            top: bounds.top,
        +            left: bounds.left
        +          };
        +
        +          out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));
        +          out.height = Math.min(out.height, bounds.height - ((bounds.top + bounds.height) - (pageYOffset + innerHeight)));
        +          out.height = Math.min(innerHeight, out.height);
        +          out.height -= 2;
        +
        +          out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));
        +          out.width = Math.min(out.width, bounds.width - ((bounds.left + bounds.width) - (pageXOffset + innerWidth)));
        +          out.width = Math.min(innerWidth, out.width);
        +          out.width -= 2;
        +
        +          if (out.top < pageYOffset) {
        +            out.top = pageYOffset;
        +          }
        +          if (out.left < pageXOffset) {
        +            out.left = pageXOffset;
        +          }
        +
        +          return out;
        +        }
        +      } else if (this.targetModifier === 'scroll-handle') {
        +        let bounds;
        +        let target = this.target;
        +        if (target === document.body) {
        +          target = document.documentElement;
        +
        +          bounds = {
        +            left: pageXOffset,
        +            top: pageYOffset,
        +            height: innerHeight,
        +            width: innerWidth
        +          };
        +        } else {
        +          bounds = getBounds(target);
        +        }
        +
        +        const style = getComputedStyle(target);
        +
        +        const hasBottomScroll = (
        +          target.scrollWidth > target.clientWidth ||
        +          [style.overflow, style.overflowX].indexOf('scroll') >= 0 ||
        +          this.target !== document.body
        +        );
        +
        +        let scrollBottom = 0;
        +        if (hasBottomScroll) {
        +          scrollBottom = 15;
        +        }
        +
        +        const height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;
        +
        +        const out = {
        +          width: 15,
        +          height: height * 0.975 * (height / target.scrollHeight),
        +          left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15
        +        };
        +
        +        let fitAdj = 0;
        +        if (height < 408 && this.target === document.body) {
        +          fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;
        +        }
        +
        +        if (this.target !== document.body) {
        +          out.height = Math.max(out.height, 24);
        +        }
        +
        +        const scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);
        +        out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);
        +
        +        if (this.target === document.body) {
        +          out.height = Math.max(out.height, 24);
        +        }
        +
        +        return out;
        +      }
        +    } else {
        +      return getBounds(this.target);
        +    }
        +  }
        +
        +  clearCache() {
        +    this._cache = {};
        +  }
        +
        +  cache(k, getter) {
        +    // More than one module will often need the same DOM info, so
        +    // we keep a cache which is cleared on each position call
        +    if (typeof this._cache === 'undefined') {
        +      this._cache = {};
        +    }
        +
        +    if (typeof this._cache[k] === 'undefined') {
        +      this._cache[k] = getter.call(this);
        +    }
        +
        +    return this._cache[k];
        +  }
        +
        +  enable(pos=true) {
        +    if (!(this.options.addTargetClasses === false)) {
        +      addClass(this.target, this.getClass('enabled'));
        +    }
        +    addClass(this.element, this.getClass('enabled'));
        +    this.enabled = true;
        +
        +    this.scrollParents.forEach((parent) => {
        +      if (parent !== this.target.ownerDocument) {
        +        parent.addEventListener('scroll', this.position);
        +      }
        +    })
        +
        +    if (pos) {
        +      this.position();
        +    }
        +  }
        +
        +  disable() {
        +    removeClass(this.target, this.getClass('enabled'));
        +    removeClass(this.element, this.getClass('enabled'));
        +    this.enabled = false;
        +
        +    if (typeof this.scrollParents !== 'undefined') {
        +      this.scrollParents.forEach((parent) => {
        +        parent.removeEventListener('scroll', this.position);
        +      })
        +    }
        +  }
        +
        +  destroy() {
        +    this.disable();
        +
        +    tethers.forEach((tether, i) => {
        +      if (tether === this) {
        +        tethers.splice(i, 1);
        +      }
        +    });
        +
        +    // Remove any elements we were using for convenience from the DOM
        +    if (tethers.length === 0) {
        +      removeUtilElements();
        +    }
        +  }
        +
        +  updateAttachClasses(elementAttach, targetAttach) {
        +    elementAttach = elementAttach || this.attachment;
        +    targetAttach = targetAttach || this.targetAttachment;
        +    const sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];
        +
        +    if (typeof this._addAttachClasses !== 'undefined' && this._addAttachClasses.length) {
        +      // updateAttachClasses can be called more than once in a position call, so
        +      // we need to clean up after ourselves such that when the last defer gets
        +      // ran it doesn't add any extra classes from previous calls.
        +      this._addAttachClasses.splice(0, this._addAttachClasses.length);
        +    }
        +
        +    if (typeof this._addAttachClasses === 'undefined') {
        +      this._addAttachClasses = [];
        +    }
        +    const add = this._addAttachClasses;
        +
        +    if (elementAttach.top) {
        +      add.push(`${ this.getClass('element-attached') }-${ elementAttach.top }`);
        +    }
        +    if (elementAttach.left) {
        +      add.push(`${ this.getClass('element-attached') }-${ elementAttach.left }`);
        +    }
        +    if (targetAttach.top) {
        +      add.push(`${ this.getClass('target-attached') }-${ targetAttach.top }`);
        +    }
        +    if (targetAttach.left) {
        +      add.push(`${ this.getClass('target-attached') }-${ targetAttach.left }`);
        +    }
        +
        +    const all = [];
        +    sides.forEach(side => {
        +      all.push(`${ this.getClass('element-attached') }-${ side }`);
        +      all.push(`${ this.getClass('target-attached') }-${ side }`);
        +    });
        +
        +    defer(() => {
        +      if (!(typeof this._addAttachClasses !== 'undefined')) {
        +        return;
        +      }
        +
        +      updateClasses(this.element, this._addAttachClasses, all);
        +      if (!(this.options.addTargetClasses === false)) {
        +        updateClasses(this.target, this._addAttachClasses, all);
        +      }
        +
        +      delete this._addAttachClasses;
        +    });
        +  }
        +
        +  position(flushChanges=true) {
        +    // flushChanges commits the changes immediately, leave true unless you are positioning multiple
        +    // tethers (in which case call Tether.Utils.flush yourself when you're done)
        +
        +    if (!this.enabled) {
        +      return;
        +    }
        +
        +    this.clearCache();
        +
        +    // Turn 'auto' attachments into the appropriate corner or edge
        +    const targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);
        +
        +    this.updateAttachClasses(this.attachment, targetAttachment);
        +
        +    const elementPos = this.cache('element-bounds', () => {
        +      return getBounds(this.element);
        +    });
        +
        +    let {width, height} = elementPos;
        +
        +    if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {
        +      // We cache the height and width to make it possible to position elements that are
        +      // getting hidden.
        +      ({width, height} = this.lastSize);
        +    } else {
        +      this.lastSize = {width, height};
        +    }
        +
        +    const targetPos = this.cache('target-bounds', () => {
        +      return this.getTargetBounds();
        +    });
        +    const targetSize = targetPos;
        +
        +    // Get an actual px offset from the attachment
        +    let offset = offsetToPx(attachmentToOffset(this.attachment), {width, height});
        +    let targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);
        +
        +    const manualOffset = offsetToPx(this.offset, {width, height});
        +    const manualTargetOffset = offsetToPx(this.targetOffset, targetSize);
        +
        +    // Add the manually provided offset
        +    offset = addOffset(offset, manualOffset);
        +    targetOffset = addOffset(targetOffset, manualTargetOffset);
        +
        +    // It's now our goal to make (element position + offset) == (target position + target offset)
        +    let left = targetPos.left + targetOffset.left - offset.left;
        +    let top = targetPos.top + targetOffset.top - offset.top;
        +
        +    for (let i = 0; i < TetherBase.modules.length; ++i) {
        +      const module = TetherBase.modules[i];
        +      const ret = module.position.call(this, {
        +        left,
        +        top,
        +        targetAttachment,
        +        targetPos,
        +        elementPos,
        +        offset,
        +        targetOffset,
        +        manualOffset,
        +        manualTargetOffset,
        +        scrollbarSize,
        +        attachment: this.attachment
        +      });
        +
        +      if (ret === false) {
        +        return false;
        +      } else if (typeof ret === 'undefined' || typeof ret !== 'object') {
        +        continue;
        +      } else {
        +        ({top, left} = ret);
        +      }
        +    }
        +
        +    // We describe the position three different ways to give the optimizer
        +    // a chance to decide the best possible way to position the element
        +    // with the fewest repaints.
        +    const next = {
        +      // It's position relative to the page (absolute positioning when
        +      // the element is a child of the body)
        +      page: {
        +        top: top,
        +        left: left
        +      },
        +
        +      // It's position relative to the viewport (fixed positioning)
        +      viewport: {
        +        top: top - pageYOffset,
        +        bottom: pageYOffset - top - height + innerHeight,
        +        left: left - pageXOffset,
        +        right: pageXOffset - left - width + innerWidth
        +      }
        +    };
        +
        +    var doc = this.target.ownerDocument;
        +    var win = doc.defaultView;
        +
        +    let scrollbarSize;
        +    if (win.innerHeight > doc.documentElement.clientHeight) {
        +      scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
        +      next.viewport.bottom -= scrollbarSize.height;
        +    }
        +
        +    if (win.innerWidth > doc.documentElement.clientWidth) {
        +      scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
        +      next.viewport.right -= scrollbarSize.width;
        +    }
        +
        +    if (['', 'static'].indexOf(doc.body.style.position) === -1 ||
        +        ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1) {
        +      // Absolute positioning in the body will be relative to the page, not the 'initial containing block'
        +      next.page.bottom = doc.body.scrollHeight - top - height;
        +      next.page.right = doc.body.scrollWidth - left - width;
        +    }
        +
        +    if (typeof this.options.optimizations !== 'undefined' &&
        +        this.options.optimizations.moveElement !== false &&
        +        !(typeof this.targetModifier !== 'undefined')) {
        +      const offsetParent = this.cache('target-offsetparent', () => getOffsetParent(this.target));
        +      const offsetPosition = this.cache('target-offsetparent-bounds', () => getBounds(offsetParent));
        +      const offsetParentStyle = getComputedStyle(offsetParent);
        +      const offsetParentSize = offsetPosition;
        +
        +      const offsetBorder = {};
        +      ['Top', 'Left', 'Bottom', 'Right'].forEach(side => {
        +        offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle[`border${ side }Width`]);
        +      });
        +
        +      offsetPosition.right = doc.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;
        +      offsetPosition.bottom = doc.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;
        +
        +      if (next.page.top >= (offsetPosition.top + offsetBorder.top) && next.page.bottom >= offsetPosition.bottom) {
        +        if (next.page.left >= (offsetPosition.left + offsetBorder.left) && next.page.right >= offsetPosition.right) {
        +          // We're within the visible part of the target's scroll parent
        +          const scrollTop = offsetParent.scrollTop;
        +          const scrollLeft = offsetParent.scrollLeft;
        +
        +          // It's position relative to the target's offset parent (absolute positioning when
        +          // the element is moved to be a child of the target's offset parent).
        +          next.offset = {
        +            top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,
        +            left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left
        +          };
        +        }
        +      }
        +    }
        +
        +
        +    // We could also travel up the DOM and try each containing context, rather than only
        +    // looking at the body, but we're gonna get diminishing returns.
        +
        +    this.move(next);
        +
        +    this.history.unshift(next);
        +
        +    if (this.history.length > 3) {
        +      this.history.pop();
        +    }
        +
        +    if (flushChanges) {
        +      flush();
        +    }
        +
        +    return true;
        +  }
        +
        +  // THE ISSUE
        +  move(pos) {
        +    if (!(typeof this.element.parentNode !== 'undefined')) {
        +      return;
        +    }
        +
        +    const same = {};
        +
        +    for (let type in pos) {
        +      same[type] = {};
        +
        +      for (let key in pos[type]) {
        +        let found = false;
        +
        +        for (let i = 0; i < this.history.length; ++i) {
        +          const point = this.history[i];
        +          if (typeof point[type] !== 'undefined' &&
        +              !within(point[type][key], pos[type][key])) {
        +            found = true;
        +            break;
        +          }
        +
        +        }
        +
        +        if (!found) {
        +          same[type][key] = true;
        +        }
        +      }
        +    }
        +
        +    let css = {top: '', left: '', right: '', bottom: ''};
        +
        +    const transcribe = (_same, _pos) => {
        +      const hasOptimizations = typeof this.options.optimizations !== 'undefined';
        +      const gpu = hasOptimizations ? this.options.optimizations.gpu : null;
        +      if (gpu !== false) {
        +        let yPos, xPos;
        +        if (_same.top) {
        +          css.top = 0;
        +          yPos = _pos.top;
        +        } else {
        +          css.bottom = 0;
        +          yPos = -_pos.bottom;
        +        }
        +
        +        if (_same.left) {
        +          css.left = 0;
        +          xPos = _pos.left;
        +        } else {
        +          css.right = 0;
        +          xPos = -_pos.right;
        +        }
        +
        +        if (window.matchMedia) {
        +          // HubSpot/tether#207
        +          const retina = window.matchMedia('only screen and (min-resolution: 1.3dppx)').matches ||
        +                         window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3)').matches;
        +          if (!retina) {
        +            xPos = Math.round(xPos);
        +            yPos = Math.round(yPos);
        +          }
        +        }
        +
        +        css[transformKey] = `translateX(${ xPos }px) translateY(${ yPos }px)`;
        +
        +        if (transformKey !== 'msTransform') {
        +          // The Z transform will keep this in the GPU (faster, and prevents artifacts),
        +          // but IE9 doesn't support 3d transforms and will choke.
        +          css[transformKey] += " translateZ(0)";
        +        }
        +
        +      } else {
        +        if (_same.top) {
        +          css.top = `${ _pos.top }px`;
        +        } else {
        +          css.bottom = `${ _pos.bottom }px`;
        +        }
        +
        +        if (_same.left) {
        +          css.left = `${ _pos.left }px`;
        +        } else {
        +          css.right = `${ _pos.right }px`;
        +        }
        +      }
        +    };
        +
        +    let moved = false;
        +    if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {
        +      css.position = 'absolute';
        +      transcribe(same.page, pos.page);
        +
        +    } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {
        +      css.position = 'fixed';
        +      transcribe(same.viewport, pos.viewport);
        +
        +    } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {
        +      css.position = 'absolute';
        +      const offsetParent = this.cache('target-offsetparent', () => getOffsetParent(this.target));
        +
        +      if (getOffsetParent(this.element) !== offsetParent) {
        +        defer(() => {
        +          this.element.parentNode.removeChild(this.element);
        +          offsetParent.appendChild(this.element);
        +        });
        +      }
        +
        +      transcribe(same.offset, pos.offset);
        +      moved = true;
        +
        +    } else {
        +      css.position = 'absolute';
        +      transcribe({top: true, left: true}, pos.page);
        +    }
        +
        +    if (!moved) {
        +      if (this.options.bodyElement) {
        +        this.options.bodyElement.appendChild(this.element);
        +      } else {
        +        let offsetParentIsBody = true;
        +        let currentNode = this.element.parentNode;
        +        while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {
        +          if (getComputedStyle(currentNode).position !== 'static') {
        +            offsetParentIsBody = false;
        +            break;
        +          }
        +
        +          currentNode = currentNode.parentNode;
        +        }
        +
        +        if (!offsetParentIsBody) {
        +          this.element.parentNode.removeChild(this.element);
        +          this.element.ownerDocument.body.appendChild(this.element);
        +        }
        +      }
        +    }
        +
        +    // Any css change will trigger a repaint, so let's avoid one if nothing changed
        +    const writeCSS = {};
        +    let write = false;
        +    for (let key in css) {
        +      let val = css[key];
        +      let elVal = this.element.style[key];
        +
        +      if (elVal !== val) {
        +        write = true;
        +        writeCSS[key] = val;
        +      }
        +    }
        +
        +    if (write) {
        +      defer(() => {
        +        extend(this.element.style, writeCSS);
        +        this.trigger('repositioned');
        +      });
        +    }
        +  }
        +}
        +
        +TetherClass.modules = [];
        +
        +TetherBase.position = position;
        +
        +let Tether = extend(TetherClass, TetherBase);
        diff --git a/bower_components/tether/src/js/utils.js b/bower_components/tether/src/js/utils.js
        new file mode 100644
        index 0000000000..19ba7fe212
        --- /dev/null
        +++ b/bower_components/tether/src/js/utils.js
        @@ -0,0 +1,370 @@
        +let TetherBase;
        +if (typeof TetherBase === 'undefined') {
        +  TetherBase = {modules: []};
        +}
        +
        +let zeroElement = null;
        +
        +// Same as native getBoundingClientRect, except it takes into account parent <frame> offsets
        +// if the element lies within a nested document (<frame> or <iframe>-like).
        +function getActualBoundingClientRect(node) {
        +  let boundingRect = node.getBoundingClientRect();
        +
        +  // The original object returned by getBoundingClientRect is immutable, so we clone it
        +  // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9
        +  let rect = {};
        +  for (var k in boundingRect) {
        +    rect[k] = boundingRect[k];
        +  }
        +
        +  if (node.ownerDocument !== document) {
        +    let frameElement = node.ownerDocument.defaultView.frameElement;
        +    if (frameElement) {
        +      let frameRect = getActualBoundingClientRect(frameElement);
        +      rect.top += frameRect.top;
        +      rect.bottom += frameRect.top;
        +      rect.left += frameRect.left;
        +      rect.right += frameRect.left;
        +    }
        +  }
        +
        +  return rect;
        +}
        +
        +function getScrollParents(el) {
        +  // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;
        +  // https://bugzilla.mozilla.org/show_bug.cgi?id=548397
        +  const computedStyle = getComputedStyle(el) || {};
        +  const position = computedStyle.position;
        +  let parents = [];
        +
        +  if (position === 'fixed') {
        +    return [el];
        +  }
        +
        +  let parent = el;
        +  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {
        +    let style;
        +    try {
        +      style = getComputedStyle(parent);
        +    } catch (err) {}
        +
        +    if (typeof style === 'undefined' || style === null) {
        +      parents.push(parent);
        +      return parents;
        +    }
        +
        +    const {overflow, overflowX, overflowY} = style;
        +    if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {
        +      if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {
        +        parents.push(parent)
        +      }
        +    }
        +  }
        +
        +  parents.push(el.ownerDocument.body);
        +
        +  // If the node is within a frame, account for the parent window scroll
        +  if (el.ownerDocument !== document) {
        +    parents.push(el.ownerDocument.defaultView);
        +  }
        +
        +  return parents;
        +}
        +
        +const uniqueId = (() => {
        +  let id = 0;
        +  return () => ++id;
        +})();
        +
        +const zeroPosCache = {};
        +const getOrigin = () => {
        +  // getBoundingClientRect is unfortunately too accurate.  It introduces a pixel or two of
        +  // jitter as the user scrolls that messes with our ability to detect if two positions
        +  // are equivilant or not.  We place an element at the top left of the page that will
        +  // get the same jitter, so we can cancel the two out.
        +  let node = zeroElement;
        +  if (!node || !document.body.contains(node)) {
        +    node = document.createElement('div');
        +    node.setAttribute('data-tether-id', uniqueId());
        +    extend(node.style, {
        +      top: 0,
        +      left: 0,
        +      position: 'absolute'
        +    });
        +
        +    document.body.appendChild(node);
        +
        +    zeroElement = node;
        +  }
        +
        +  const id = node.getAttribute('data-tether-id');
        +  if (typeof zeroPosCache[id] === 'undefined') {
        +    zeroPosCache[id] = getActualBoundingClientRect(node);
        +
        +    // Clear the cache when this position call is done
        +    defer(() => {
        +      delete zeroPosCache[id];
        +    });
        +  }
        +
        +  return zeroPosCache[id];
        +};
        +
        +function removeUtilElements() {
        +  if (zeroElement) {
        +    document.body.removeChild(zeroElement);
        +  }
        +  zeroElement = null;
        +};
        +
        +function getBounds(el) {
        +  let doc;
        +  if (el === document) {
        +    doc = document;
        +    el = document.documentElement;
        +  } else {
        +    doc = el.ownerDocument;
        +  }
        +
        +  const docEl = doc.documentElement;
        +
        +  const box = getActualBoundingClientRect(el);
        +
        +  const origin = getOrigin();
        +
        +  box.top -= origin.top;
        +  box.left -= origin.left;
        +
        +  if (typeof box.width === 'undefined') {
        +    box.width = document.body.scrollWidth - box.left - box.right;
        +  }
        +  if (typeof box.height === 'undefined') {
        +    box.height = document.body.scrollHeight - box.top - box.bottom;
        +  }
        +
        +  box.top = box.top - docEl.clientTop;
        +  box.left = box.left - docEl.clientLeft;
        +  box.right = doc.body.clientWidth - box.width - box.left;
        +  box.bottom = doc.body.clientHeight - box.height - box.top;
        +
        +  return box;
        +}
        +
        +function getOffsetParent(el) {
        +  return el.offsetParent || document.documentElement;
        +}
        +
        +let _scrollBarSize = null;
        +function getScrollBarSize() {
        +  if (_scrollBarSize) {
        +    return _scrollBarSize;
        +  }
        +  const inner = document.createElement('div');
        +  inner.style.width = '100%';
        +  inner.style.height = '200px';
        +
        +  const outer = document.createElement('div');
        +  extend(outer.style, {
        +    position: 'absolute',
        +    top: 0,
        +    left: 0,
        +    pointerEvents: 'none',
        +    visibility: 'hidden',
        +    width: '200px',
        +    height: '150px',
        +    overflow: 'hidden'
        +  });
        +
        +  outer.appendChild(inner);
        +
        +  document.body.appendChild(outer);
        +
        +  const widthContained = inner.offsetWidth;
        +  outer.style.overflow = 'scroll';
        +  let widthScroll = inner.offsetWidth;
        +
        +  if (widthContained === widthScroll) {
        +    widthScroll = outer.clientWidth;
        +  }
        +
        +  document.body.removeChild(outer);
        +
        +  const width = widthContained - widthScroll;
        +
        +  _scrollBarSize = {width, height: width};
        +  return _scrollBarSize;
        +}
        +
        +function extend(out={}) {
        +  const args = [];
        +
        +  Array.prototype.push.apply(args, arguments);
        +
        +  args.slice(1).forEach(obj => {
        +    if (obj) {
        +      for (let key in obj) {
        +        if ({}.hasOwnProperty.call(obj, key)) {
        +          out[key] = obj[key];
        +        }
        +      }
        +    }
        +  });
        +
        +  return out;
        +}
        +
        +function removeClass(el, name) {
        +  if (typeof el.classList !== 'undefined') {
        +    name.split(' ').forEach(cls => {
        +      if (cls.trim()) {
        +        el.classList.remove(cls);
        +      }
        +    });
        +  } else {
        +    const regex = new RegExp(`(^| )${ name.split(' ').join('|') }( |$)`, 'gi');
        +    const className = getClassName(el).replace(regex, ' ');
        +    setClassName(el, className);
        +  }
        +}
        +
        +function addClass(el, name) {
        +  if (typeof el.classList !== 'undefined') {
        +    name.split(' ').forEach(cls => {
        +      if (cls.trim()) {
        +        el.classList.add(cls);
        +      }
        +    });
        +  } else {
        +    removeClass(el, name);
        +    const cls = getClassName(el) + ` ${name}`;
        +    setClassName(el, cls);
        +  }
        +}
        +
        +function hasClass(el, name) {
        +  if (typeof el.classList !== 'undefined') {
        +    return el.classList.contains(name);
        +  }
        +  const className = getClassName(el);
        +  return new RegExp(`(^| )${ name }( |$)`, 'gi').test(className);
        +}
        +
        +function getClassName(el) {
        +  // Can't use just SVGAnimatedString here since nodes within a Frame in IE have
        +  // completely separately SVGAnimatedString base classes
        +  if (el.className instanceof el.ownerDocument.defaultView.SVGAnimatedString) {
        +    return el.className.baseVal;
        +  }
        +  return el.className;
        +}
        +
        +function setClassName(el, className) {
        +  el.setAttribute('class', className);
        +}
        +
        +
        +function updateClasses(el, add, all) {
        +  // Of the set of 'all' classes, we need the 'add' classes, and only the
        +  // 'add' classes to be set.
        +  all.forEach(cls => {
        +    if (add.indexOf(cls) === -1 && hasClass(el, cls)) {
        +      removeClass(el, cls);
        +    }
        +  });
        +
        +  add.forEach(cls => {
        +    if (!hasClass(el, cls)) {
        +      addClass(el, cls);
        +    }
        +  });
        +}
        +
        +const deferred = [];
        +
        +const defer = (fn) => {
        +  deferred.push(fn);
        +};
        +
        +const flush = () => {
        +  let fn;
        +  while(fn = deferred.pop()) {
        +    fn();
        +  }
        +};
        +
        +class Evented {
        +  on(event, handler, ctx, once=false) {
        +    if (typeof this.bindings === 'undefined') {
        +      this.bindings = {};
        +    }
        +    if (typeof this.bindings[event] === 'undefined') {
        +      this.bindings[event] = [];
        +    }
        +    this.bindings[event].push({handler, ctx, once});
        +  }
        +
        +  once(event, handler, ctx) {
        +    this.on(event, handler, ctx, true);
        +  }
        +
        +  off(event, handler) {
        +    if (typeof this.bindings === 'undefined' ||
        +        typeof this.bindings[event] === 'undefined') {
        +      return;
        +    }
        +
        +    if (typeof handler === 'undefined') {
        +      delete this.bindings[event];
        +    } else {
        +      let i = 0;
        +      while (i < this.bindings[event].length) {
        +        if (this.bindings[event][i].handler === handler) {
        +          this.bindings[event].splice(i, 1);
        +        } else {
        +          ++i;
        +        }
        +      }
        +    }
        +  }
        +
        +  trigger(event, ...args) {
        +    if (typeof this.bindings !== 'undefined' && this.bindings[event]) {
        +      let i = 0;
        +      while (i < this.bindings[event].length) {
        +        const {handler, ctx, once} = this.bindings[event][i];
        +
        +        let context = ctx;
        +        if (typeof context === 'undefined') {
        +          context = this;
        +        }
        +
        +        handler.apply(context, args);
        +
        +        if (once) {
        +          this.bindings[event].splice(i, 1);
        +        } else {
        +          ++i;
        +        }
        +      }
        +    }
        +  }
        +}
        +
        +TetherBase.Utils = {
        +  getActualBoundingClientRect,
        +  getScrollParents,
        +  getBounds,
        +  getOffsetParent,
        +  extend,
        +  addClass,
        +  removeClass,
        +  hasClass,
        +  updateClasses,
        +  defer,
        +  flush,
        +  uniqueId,
        +  Evented,
        +  getScrollBarSize,
        +  removeUtilElements
        +};
        diff --git a/build/css/AdminLTE.css b/build/css/AdminLTE.css
        new file mode 100644
        index 0000000000..0134bf2539
        --- /dev/null
        +++ b/build/css/AdminLTE.css
        @@ -0,0 +1,8 @@
        +/*!
        + *   AdminLTE v2.3.0
        + *   Author: Almsaeed Studio
        + *	 Website: Almsaeed Studio <http://almsaeedstudio.com>
        + *   License: Open source - MIT
        + *           Please visit http://opensource.org/licenses/MIT for more information
        +!*/.layout-boxed .wrapper,.wrapper,body,html{min-height:100%}.btn.uppercase,.description-block>.description-text,.info-box-text,.nav-stacked>li.header{text-transform:uppercase}.box-body:after,.box-comments .box-comment:after,.box-footer:after,.box-header:after,.chat .item:after,.chat .item>.attachment:after,.control-sidebar-menu>li>a:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after,.user-block:after,.user-panel:after,.wrapper:after{clear:both}.layout-boxed body,.layout-boxed html{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{position:static;overflow:hidden}.wrapper:after,.wrapper:before{content:" ";display:table}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;box-shadow:0 0 8px rgba(0,0,0,.5);position:relative}.layout-boxed{background:url(../img/boxed-bg.jpg) fixed}.content-wrapper,.main-footer,.right-side{transition:margin .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out,-webkit-transform .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer,.layout-top-nav .right-side{margin-left:0}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer,.sidebar-collapse .right-side{margin-left:0}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .left-side,.fixed .main-header,.fixed .main-sidebar{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.content-wrapper,.main-footer,.right-side{margin-left:0}.sidebar-open .content-wrapper,.sidebar-open .main-footer,.sidebar-open .right-side{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .left-side,body.hold-transition .main-footer,body.hold-transition .main-header .logo,body.hold-transition .main-header>.navbar,body.hold-transition .main-sidebar,body.hold-transition .right-side{transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:active,a:focus,a:hover{outline:0;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header>.navbar{transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header>.navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,.2);border-color:transparent}.main-header #navbar-search-input.form-control:active,.main-header #navbar-search-input.form-control:focus{border-color:rgba(0,0,0,.1);background:rgba(255,255,255,.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:0 0}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .navbar-brand,.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:active,.main-header .sidebar-toggle:focus{background:0 0}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.content-header{position:relative;padding:15px 15px 0}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:0 0;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}.content-header{padding-top:110px}ul.sidebar-menu{padding-top:120px}.sidebar-toggle-mobile a{color:#fff}}.left-side,.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;transition:width .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out,-webkit-transform .3s ease-in-out}@media (max-width:767px){.left-side,.main-sidebar{padding-top:100px;-webkit-transform:translate(-230px,0);transform:translate(-230px,0)}}@media (min-width:768px){.sidebar-collapse .left-side,.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px,0);transform:translate(-230px,0)}}@media (max-width:767px){.sidebar-open .left-side,.sidebar-open .main-sidebar{-webkit-transform:translate(0,0);transform:translate(0,0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:after,.user-panel:before{content:" ";display:table}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.glyphicon,.user-panel>.info>a>.ion{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .badge,.sidebar-menu>li .label{margin-top:3px;margin-right:5px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;margin-top:3px}.sidebar-menu li.active>a>.fa-angle-left{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0 0 0 5px;margin:0}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.fa-angle-down,.sidebar-menu .treeview-menu>li>a>.fa-angle-left{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .main-footer,.sidebar-mini.sidebar-collapse .right-side{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0,0);transform:translate(0,0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right){display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu li.header,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}.control-sidebar-open .content-wrapper,.control-sidebar-open .main-footer,.control-sidebar-open .right-side{margin-right:230px}}.main-sidebar .user-panel,.sidebar-menu,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right{position:absolute;top:50%;right:10px;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar,.control-sidebar-bg{top:0;right:-230px;width:230px;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar-open .control-sidebar,.control-sidebar-open .control-sidebar-bg,.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:active,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:hover{border-top:none;border-right:none;border-bottom:none}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:after,.control-sidebar-menu>li>a:before{content:" ";display:table}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading,.control-sidebar-menu .progress{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0;margin:0;top:100%}.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{background-color:#fff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444;font-size:14px;border-radius:4px 4px 0 0}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eee;color:#444!important;text-align:center;border-radius:0 0 4px 4px}@media (max-width:991px){.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:400}.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before{content:" ";display:table}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px;color:#666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid transparent;border-color:rgba(255,255,255,.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after,.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before{display:table;content:" "}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #ddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444!important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#444!important}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type,.form-control{border-radius:0}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-danger,.progress-striped .progress-bar-green,.progress-striped .progress-bar-info,.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary,.progress-striped .progress-bar-red,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning,.progress-striped .progress-bar-yellow{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.form-control{box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control:-ms-input-placeholder,.form-control::-moz-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control{border-color:#00a65a;box-shadow:none}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control{border-color:#f39c12;box-shadow:none}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control{border-color:#dd4b39;box-shadow:none}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.progress,.progress .progress-bar,.progress-sm,.progress-sm .progress-bar,.progress-xs,.progress-xs .progress-bar,.progress-xxs,.progress-xxs .progress-bar,.progress.sm,.progress.sm .progress-bar,.progress.xs,.progress.xs .progress-bar,.progress.xxs,.progress.xxs .progress-bar,.progress>.progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.form-group-lg .form-control+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.input-lg+.form-control-feedback.fa{line-height:46px}.form-group-sm .form-control+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.input-sm+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{box-shadow:none}.box,.small-box{box-shadow:0 1px 1px rgba(0,0,0,.1)}.progress-sm,.progress.sm{height:10px}.progress-xs,.progress.xs{height:7px}.progress-xxs,.progress.xxs{height:3px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.progress-sm,.progress.vertical.sm{width:20px}.progress.vertical.progress-xs,.progress.vertical.xs{width:10px}.progress.vertical.progress-xxs,.progress.vertical.xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-bar-warning,.progress-bar-yellow{background-color:#f39c12}.progress-bar-danger,.progress-bar-red{background-color:#dd4b39}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,.8);display:block;z-index:10;background:rgba(0,0,0,.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,.15)}.small-box h3{font-size:38px;font-weight:700;margin:0 0 10px;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5px}.small-box .icon{transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#fff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:0 0}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de}.box.box-solid.box-default>.box-header .btn,.box.box-solid.box-default>.box-header a{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc}.box.box-solid.box-primary>.box-header .btn,.box.box-solid.box-primary>.box-header a{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef}.box.box-solid.box-info>.box-header .btn,.box.box-solid.box-info>.box-header a{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39}.box.box-solid.box-danger>.box-header .btn,.box.box-solid.box-danger>.box-header a{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12}.box.box-solid.box-warning>.box-header .btn,.box.box-solid.box-warning>.box-header a{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a}.box.box-solid.box-success>.box-header .btn,.box.box-solid.box-success>.box-header a{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*=bg]>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:.3em}.box>.loading-img,.box>.overlay,.overlay-wrapper>.loading-img,.overlay-wrapper>.overlay{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,.5)}.box-body:after,.box-body:before,.box-footer:after,.box-footer:before,.box-header:after,.box-header:before{content:" ";display:table}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header .box-title,.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle=tooltip],.btn.btn-file{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.btn-box-tool{padding:5px;font-size:12px;background:0 0;color:#97a0b3}.btn-box-tool:hover,.open .btn-box-tool{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{padding:10px;border-radius:0 0 3px 3px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-radius:0 0 0 3px}.box-body .box-pane-right{border-radius:0 0 3px}.box-footer{border-top:1px solid #f4f4f4;padding:10px;background-color:#fff;border-radius:0 0 3px 3px}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:after,.box-comments .box-comment:before{content:" ";display:table}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type=checkbox]{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list .handle,.todo-list>li:hover .tools{display:inline-block}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.alert a,.callout a{text-decoration:underline}.todo-list>li.done .label{background:#d2d6de!important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:after,.chat .item:before{content:" ";display:table}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px;font-weight:600;font-size:14px}.chat .item>.attachment>.filename,.chat .item>.attachment>p{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:after,.chat .item>.attachment:before{content:" ";display:table}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,.2);margin:5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,.2);border-radius:2px 0 0 2px}.btn,.btn-app{border-radius:3px}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:700;font-size:18px}.info-box-text,.progress-description{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-more{display:block}.progress-description{margin:0}.btn{box-shadow:none;border:1px solid transparent}.btn.btn-flat{border-radius:0;box-shadow:none;border-width:1px}.btn:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:focus{outline:0}.btn.btn-file{overflow:hidden}.btn.btn-file>input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:0;background:#fff;cursor:inherit;display:block}.btn-app,table.text-center,table.text-center td,table.text-center th{text-align:center}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default.hover,.btn-default:active,.btn-default:hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary.hover,.btn-primary:active,.btn-primary:hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success.hover,.btn-success:active,.btn-success:hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info.hover,.btn-info:active,.btn-info:hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger.hover,.btn-danger:active,.btn-danger:hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning.hover,.btn-warning:active,.btn-warning:hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:0 0;color:#fff}.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:rgba(255,255,255,.7);border-color:rgba(255,255,255,.7)}.btn-link{box-shadow:none}.btn[class*=bg-]:hover{box-shadow:inset 0 0 100px rgba(0,0,0,.2)}.btn-app{position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.alert,.callout{border-radius:3px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.alert h4,.callout h4,.nav-pills>li.active>a{font-weight:600}.callout{margin:0 0 20px;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff}.callout a:hover{color:#eee}.callout h4{margin-top:0}.callout p:last-child{margin-bottom:0}.callout .highlight,.callout code{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:active,.nav>li>a:focus,.nav>li>a:hover{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{border-top-color:#3c8dbc}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:0 0;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted,.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:0 0;margin:0}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active:hover>a,.nav-tabs-custom>.nav-tabs>li.active>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:0 0;color:#999}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0!important}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #f4f4f4}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.modal{background:rgba(0,0,0,.3)}.modal-content{border-radius:0;box-shadow:0 2px 3px rgba(0,0,0,.125);border:0}@media (min-width:768px){.modal-content{box-shadow:0 2px 3px rgba(0,0,0,.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-footer,.modal-primary .modal-header{border-color:#307095}.modal-warning .modal-footer,.modal-warning .modal-header{border-color:#c87f0a}.modal-info .modal-footer,.modal-info .modal-header{border-color:#0097bc}.modal-success .modal-footer,.modal-success .modal-header{border-color:#00733e}.modal-danger .modal-footer,.modal-danger .modal-header{border-color:#c23321}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px}.social-auth-links{margin:10px 0}.select2-container--default.select2-container--focus,.select2-container--default:active,.select2-container--default:focus,.select2-selection.select2-container--focus,.select2-selection:active,.select2-selection:focus{outline:0}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:#fff}.select2-results__option{padding:6px 12px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;height:auto;margin-top:-4px}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:0;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.list-header,.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header{color:#fff!important}.bg-gray{color:#000;background-color:#d2d6de!important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111!important}.alert-danger,.alert-error,.bg-red,.callout.callout-danger,.label-danger,.modal-danger .modal-body{background-color:#dd4b39!important}.alert-warning,.bg-yellow,.callout.callout-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12!important}.alert-info,.bg-aqua,.callout.callout-info,.label-info,.modal-info .modal-body{background-color:#00c0ef!important}.bg-blue{background-color:#0073b7!important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc!important}.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body{background-color:#00a65a!important}.bg-navy{background-color:#001F3F!important}.bg-teal{background-color:#39CCCC!important}.bg-olive{background-color:#3D9970!important}.bg-lime{background-color:#01FF70!important}.bg-orange{background-color:#FF851B!important}.bg-fuchsia{background-color:#F012BE!important}.bg-purple{background-color:#605ca8!important}.bg-maroon{background-color:#D81B60!important}.bg-gray-active{color:#000;background-color:#b5bbc8!important}.bg-black-active{background-color:#000!important}.bg-red-active,.modal-danger .modal-footer,.modal-danger .modal-header{background-color:#d33724!important}.bg-yellow-active,.modal-warning .modal-footer,.modal-warning .modal-header{background-color:#db8b0b!important}.bg-aqua-active,.modal-info .modal-footer,.modal-info .modal-header{background-color:#00a7d0!important}.bg-blue-active{background-color:#005384!important}.bg-light-blue-active,.modal-primary .modal-footer,.modal-primary .modal-header{background-color:#357ca5!important}.bg-green-active,.modal-success .modal-footer,.modal-success .modal-header{background-color:#008d4c!important}.bg-navy-active{background-color:#001a35!important}.bg-teal-active{background-color:#30bbbb!important}.bg-olive-active{background-color:#368763!important}.bg-lime-active{background-color:#00e765!important}.bg-orange-active{background-color:#ff7701!important}.bg-fuchsia-active{background-color:#db0ead!important}.bg-purple-active{background-color:#555299!important}.bg-maroon-active{background-color:#ca195a!important}[class^=bg-].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39!important}.text-yellow{color:#f39c12!important}.text-aqua{color:#00c0ef!important}.text-blue{color:#0073b7!important}.text-black{color:#111!important}.text-light-blue{color:#3c8dbc!important}.text-green{color:#00a65a!important}.text-gray{color:#d2d6de!important}.text-navy{color:#001F3F!important}.text-teal{color:#39CCCC!important}.text-olive{color:#3D9970!important}.text-lime{color:#01FF70!important}.text-orange{color:#FF851B!important}.text-fuchsia{color:#F012BE!important}.text-purple{color:#605ca8!important}.text-maroon{color:#D81B60!important}.link-muted{color:#7a869d}.link-muted:focus,.link-muted:hover{color:#606c84}.link-black{color:#666}.link-black:focus,.link-black:hover{color:#999}.hide{display:none!important}.no-border{border:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-shadow{box-shadow:none!important}.chart-legend,.list-unstyled{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0!important}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39CCCC!important;background:-o-linear-gradient(#7adddd,#39CCCC)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39CCCC', GradientType=0)!important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc!important;background:-o-linear-gradient(#67a8ce,#3c8dbc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0)!important;color:#fff}.bg-blue-gradient{background:#0073b7!important;background:-o-linear-gradient(#0089db,#0073b7)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0)!important;color:#fff}.bg-aqua-gradient{background:#00c0ef!important;background:-o-linear-gradient(#14d1ff,#00c0ef)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0)!important;color:#fff}.bg-yellow-gradient{background:#f39c12!important;background:-o-linear-gradient(#f7bc60,#f39c12)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0)!important;color:#fff}.bg-purple-gradient{background:#605ca8!important;background:-o-linear-gradient(#9491c4,#605ca8)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0)!important;color:#fff}.bg-green-gradient{background:#00a65a!important;background:-o-linear-gradient(#00ca6d,#00a65a)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0)!important;color:#fff}.bg-red-gradient{background:#dd4b39!important;background:-o-linear-gradient(#e47365,#dd4b39)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0)!important;color:#fff}.bg-black-gradient{background:#111!important;background:-o-linear-gradient(#2b2b2b,#111)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111', GradientType=0)!important;color:#fff}.bg-maroon-gradient{background:#D81B60!important;background:-o-linear-gradient(#e73f7c,#D81B60)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#D81B60', GradientType=0)!important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:after,.user-block:before{content:" ";display:table}.user-block img{width:40px;height:40px;float:left}.user-block .comment,.user-block .description,.user-block .username{display:block;margin-left:50px}.img-sm+.img-push,.user-block.user-block-sm .comment,.user-block.user-block-sm .description,.user-block.user-block-sm .username{margin-left:40px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username{font-size:14px}.box-comments .box-comment img,.img-lg,.img-md,.img-sm,.user-block.user-block-sm img{float:left}.box-comments .box-comment img,.img-sm,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.attachment-block .attachment-pushed,.img-lg+.img-push{margin-left:110px}.img-lg{width:100px;height:100px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart canvas,.chart svg{width:100%!important}@media print{.content-header,.left-side,.main-header,.main-sidebar,.no-print{display:none!important}.content-wrapper,.main-footer,.right-side{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0,0)!important;transform:translate(0,0)!important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr td,.table-responsive>.table tr th{white-space:normal!important}}.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav>.active>a,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav>li>a:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,.1);background-color:#367fa9}.skin-blue .main-header .navbar .sidebar-toggle,.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:0 0}.skin-blue .left-side,.skin-blue .main-sidebar,.skin-blue .wrapper{background-color:#222d32}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li:hover>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-blue .sidebar-form .btn,.skin-blue .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type=text]{color:#666;border-radius:2px 0 0 2px}.skin-blue .sidebar-form input[type=text]:focus,.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-radius:0 2px 2px 0}.skin-blue.layout-top-nav .main-header>.logo .logo-variant{background-color:none}
        +/*# sourceMappingURL=AdminLTE.css.map*/
        \ No newline at end of file
        diff --git a/build/css/AdminLTE.css.map b/build/css/AdminLTE.css.map
        new file mode 100644
        index 0000000000..50115ac4b1
        --- /dev/null
        +++ b/build/css/AdminLTE.css.map
        @@ -0,0 +1 @@
        +{"version":3,"file":"css/AdminLTE.css","sources":[],"mappings":";;;;;;","sourceRoot":""}
        \ No newline at end of file
        diff --git a/build/css/app.css b/build/css/app.css
        new file mode 100644
        index 0000000000..d4fe89baeb
        --- /dev/null
        +++ b/build/css/app.css
        @@ -0,0 +1,10 @@
        +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */hr,img{border:0}body,figure{margin:0}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.dropdown-menu{float:left}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.glyphicon,address{font-style:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-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:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}@font-face{font-family:'Glyphicons Halflings';src:url(../../../node_modules/bootstrap-less/fonts/glyphicons-halflings-regular.eot);src:url(../../../node_modules/bootstrap-less/fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../../../node_modules/bootstrap-less/fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../../../node_modules/bootstrap-less/fonts/glyphicons-halflings-regular.woff) format('woff'),url(../../../node_modules/bootstrap-less/fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../../../node_modules/bootstrap-less/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.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"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .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:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;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>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-group-sm .form-control,.input-sm{font-size:12px;border-radius:3px;padding:5px 10px}.form-control:focus{border-color:#66afe9;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;transition-property:height,visibility;transition-duration:.35s;transition-timing-function:ease}.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-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover,.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.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:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.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{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-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:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-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>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn-lg .caret{border-width:5px 5px 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>.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}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group,.input-group-btn>.btn+.btn{margin-left:-1px}.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-bottom-left-radius:4px;border-top-right-radius:0;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:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;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:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,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}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,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 .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn: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:6px 12px;font-size:14px;font-weight:400;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:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{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>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-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:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.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.42857143;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:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{text-align:center;margin-bottom:5px}.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:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.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:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.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-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;visibility:visible!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.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;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.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 .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-danger,.progress-striped .progress-bar-info,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;box-shadow:none}}.breadcrumb>li,.pagination{display:inline-block}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.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{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.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-left:15px;margin-right:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.badge,.label{font-weight:700;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center}.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-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 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-bottom-right-radius:6px;border-top-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-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:focus,.pager li>a:hover{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:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-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;background-color:#f5f5f5;border-radius:4px;box-shadow:inset 0 1px 2px rgba(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:#337ab7;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-bar-info{background-color:#5bc0de}.progress-bar-warning{background-color:#f0ad4e}.progress-bar-danger{background-color:#d9534f}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.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}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.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;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.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:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.carousel-caption,.carousel-control{text-shadow:0 1px 2px rgba(0,0,0,.6)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.43px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px}.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;line-height:1.42857143;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;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}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center}.carousel-control.left{background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;line-height:1;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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.hidden{visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!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}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!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}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.ekko-lightbox-container{position:relative}.ekko-lightbox-container>div.ekko-lightbox-item{position:absolute;top:0;left:0;bottom:0;right:0;width:100%}.ekko-lightbox iframe{width:100%;height:100%}.ekko-lightbox-nav-overlay{z-index:100;position:absolute;top:0;left:0;width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.ekko-lightbox-nav-overlay a{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;opacity:0;transition:opacity .5s;color:#fff;font-size:30px;z-index:100}.ekko-lightbox-nav-overlay a>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.ekko-lightbox-nav-overlay a>:focus{outline:0}.ekko-lightbox-nav-overlay a span{padding:0 30px}.ekko-lightbox-nav-overlay a:last-child span{text-align:right}.ekko-lightbox-nav-overlay a:hover{text-decoration:none}.ekko-lightbox-nav-overlay a:focus{outline:0}.ekko-lightbox a:hover{opacity:1;text-decoration:none}.ekko-lightbox .modal-dialog{display:none}.ekko-lightbox .modal-footer{text-align:left}.ekko-lightbox-loader{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ekko-lightbox-loader>div{width:40px;height:40px;position:relative;text-align:center}.ekko-lightbox-loader>div>div{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.ekko-lightbox-loader>div>div:last-child{-webkit-animation-delay:-1s;animation-delay:-1s}.modal-dialog .ekko-lightbox-loader>div>div{background-color:#333}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}/*!
        + * Bootstrap Colorpicker v2.5.1
        + * https://itsjavi.com/bootstrap-colorpicker/
        + *
        + * Originally written by (c) 2012 Stefan Petre
        + * Licensed under the Apache License v2.0
        + * http://www.apache.org/licenses/LICENSE-2.0.txt
        + *
        + */.colorpicker-saturation{width:100px;height:100px;background-image:url(../../../node_modules/bootstrap-colorpicker/src/img/bootstrap-colorpicker/saturation.png);cursor:crosshair;float:left}.colorpicker-saturation i{display:block;height:5px;width:5px;border:1px solid #000;border-radius:5px;position:absolute;top:0;left:0;margin:-4px 0 0 -4px}.colorpicker-saturation i b{display:block;height:5px;width:5px;border:1px solid #fff;border-radius:5px}.colorpicker-alpha,.colorpicker-hue{width:15px;height:100px;float:left;cursor:row-resize;margin-left:4px;margin-bottom:4px}.colorpicker-alpha i,.colorpicker-hue i{display:block;height:1px;background:#000;border-top:1px solid #fff;position:absolute;top:0;left:0;width:100%;margin-top:-1px}.colorpicker-hue{background-image:url(../../../node_modules/bootstrap-colorpicker/src/img/bootstrap-colorpicker/hue.png)}.colorpicker-alpha,.colorpicker-color{background-image:url(../../../node_modules/bootstrap-colorpicker/src/img/bootstrap-colorpicker/alpha.png)}.colorpicker-alpha{display:none}.colorpicker:after,.colorpicker:before{content:'';display:inline-block;position:absolute}.colorpicker-alpha,.colorpicker-hue,.colorpicker-saturation{background-size:contain}.colorpicker{padding:4px;min-width:130px;margin-top:1px;border-radius:4px;z-index:2500}.colorpicker:after,.colorpicker:before{line-height:0}.colorpicker:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:6px}.colorpicker:after{clear:both;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;top:-6px;left:7px}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{cursor:pointer;float:left;height:10px;width:10px}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .add-on i,.colorpicker-element .input-group-addon i{display:inline-block;cursor:pointer;height:16px;vertical-align:text-top;width:16px}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none;z-index:auto}.colorpicker.colorpicker-horizontal{width:110px;min-width:110px;height:auto}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-alpha,.colorpicker.colorpicker-horizontal .colorpicker-hue{width:100px;height:15px;float:left;cursor:col-resize;margin-left:0;margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-alpha i,.colorpicker.colorpicker-horizontal .colorpicker-hue i{display:block;height:15px;background:#fff;position:absolute;top:0;left:0;width:1px;border:none;margin-top:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../../../node_modules/bootstrap-colorpicker/src/img/bootstrap-colorpicker/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../../../node_modules/bootstrap-colorpicker/src/img/bootstrap-colorpicker/alpha-horizontal.png)}.colorpicker-right:before{left:auto;right:6px}.colorpicker-right:after{left:auto;right:7px}.colorpicker-no-arrow:after,.colorpicker-no-arrow:before{border-right:0;border-left:0}.colorpicker-alpha.colorpicker-visible,.colorpicker-hue.colorpicker-visible,.colorpicker-saturation.colorpicker-visible,.colorpicker-selectors.colorpicker-visible,.colorpicker.colorpicker-visible{display:block}.colorpicker-alpha.colorpicker-hidden,.colorpicker-hue.colorpicker-hidden,.colorpicker-saturation.colorpicker-hidden,.colorpicker-selectors.colorpicker-hidden,.colorpicker.colorpicker-hidden{display:none}.colorpicker-inline.colorpicker-visible{display:inline-block}
        +/*# sourceMappingURL=app.css.map*/
        \ No newline at end of file
        diff --git a/build/css/app.css.map b/build/css/app.css.map
        new file mode 100644
        index 0000000000..7117b5081a
        --- /dev/null
        +++ b/build/css/app.css.map
        @@ -0,0 +1 @@
        +{"version":3,"file":"css/app.css","sources":[],"mappings":";;;;;;;;","sourceRoot":""}
        \ No newline at end of file
        diff --git a/build/css/overrides.css b/build/css/overrides.css
        new file mode 100644
        index 0000000000..cc9d1e2f2f
        --- /dev/null
        +++ b/build/css/overrides.css
        @@ -0,0 +1,2 @@
        +.skin-blue .main-header .logo{background-color:inherit}.main-header .logo{width:100%!important;white-space:nowrap;text-align:left;display:block;clear:both}.huge{font-size:40px}.btn-file{position:relative;overflow:hidden}.dropdown-menu>li>a{color:#354044}#sort tr.cansort{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:3px;border-left:2px solid #e6e7e8;color:#444;cursor:move}.user-image-inline{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px}.input-group .input-group-addon{background-color:#f4f4f4}a.accordion-header{color:#333}.dynamic-form-row{padding:10px;margin:20px}.handle{padding-left:10px}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;outline:0;background:#fff;cursor:inherit;display:block}.main-footer{font-size:13px}.main-header{max-height:150px}.navbar-brand-img{float:left;padding:5px 5px 5px 0}.navbar-nav>.user-menu>.dropdown-menu{width:inherit}.main-header .logo{padding:0 5px 0 15px}.sidebar-toggle{margin-left:-48px;z-index:100;background-color:inherit}.sidebar-toggle-mobile{z-index:100;width:50px;padding-top:10px}.main-header .sidebar-toggle:before{content:"\f0c9"}.direct-chat-contacts{padding:10px;height:150px}.select2-container{width:100%}.error input{color:#dd4b39;border:2px solid #dd4b39!important}.alert-msg,.error label{color:#dd4b39;display:block}.input-group[class*=col-]{padding-right:15px;padding-left:15px}.control-label.multiline{padding-top:10px}.btn-outline{color:inherit;background-color:transparent;transition:all .5s}.btn-primary.btn-outline{color:#428bca}.btn-success.btn-outline{color:#5cb85c}.btn-info.btn-outline{color:#5bc0de}.btn-warning.btn-outline{color:#f0ad4e}.btn-danger.btn-outline{color:#d9534f}.btn-danger.btn-outline:hover,.btn-info.btn-outline:hover,.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-warning.btn-outline:hover{color:#fff}.slideout-menu{position:fixed;top:0;right:-250px;width:250px;height:100%;background:#333;z-index:100;margin-top:100px;color:#fff;padding:10px}.slideout-menu h3{position:relative;padding:5px;color:#fff;font-size:1.2em;font-weight:400;border-bottom:4px solid #222}.slideout-menu .slideout-menu-toggle{position:absolute;top:12px;right:10px;display:inline-block;padding:6px 9px 5px;font-family:Arial,sans-serif;font-weight:700;line-height:1;background:#222;color:#999;text-decoration:none;vertical-align:top}.slideout-menu .slideout-menu-toggle:hover{color:#fff}.slideout-menu ul{list-style:none;font-weight:300;border-top:1px solid #151515;border-bottom:1px solid #454545}.slideout-menu ul li{border-top:1px solid #454545;border-bottom:1px solid #151515}.slideout-menu ul li a{position:relative;display:block;padding:10px;color:#999;text-decoration:none}.slideout-menu ul li a:hover{background:#000;color:#fff}.slideout-menu ul li a i{position:absolute;top:15px;right:10px;opacity:.5}.btn-box-tool-lg{font-size:16px;color:orange}.bs-wizard{margin-top:20px;border-bottom:solid 1px #e0e0e0;padding:0 0 10px}.bs-wizard>.bs-wizard-step{padding:0;position:relative}.bs-wizard>.bs-wizard-step .bs-wizard-stepnum{color:#595959;font-size:16px;margin-bottom:5px}.bs-wizard>.bs-wizard-step .bs-wizard-info{color:#999;font-size:14px}.bs-wizard>.bs-wizard-step>.bs-wizard-dot{position:absolute;width:30px;height:30px;display:block;background:#fbe8aa;top:45px;left:50%;margin-top:-15px;margin-left:-15px;border-radius:50%}.bs-wizard>.bs-wizard-step>.bs-wizard-dot:after{content:' ';width:14px;height:14px;background:#fbbd19;border-radius:50px;position:absolute;top:8px;left:8px}.bs-wizard>.bs-wizard-step>.progress{position:relative;border-radius:0;height:8px;box-shadow:none;margin:20px 0}.bs-wizard>.bs-wizard-step>.progress>.progress-bar{width:0;box-shadow:none;background:#fbe8aa}.bs-wizard>.bs-wizard-step.complete>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.active>.progress>.progress-bar{width:50%}.bs-wizard>.bs-wizard-step:first-child.active>.progress>.progress-bar{width:0}.bs-wizard>.bs-wizard-step:last-child.active>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot{background-color:#f5f5f5}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot:after{opacity:0}.bs-wizard>.bs-wizard-step:first-child>.progress{left:50%;width:50%}.bs-wizard>.bs-wizard-step:last-child>.progress{width:50%}.bs-wizard>.bs-wizard-step.disabled a.bs-wizard-dot{pointer-events:none}.left-navblock{display:inline-block;float:left;text-align:left;color:#fff;padding:0}.skin-blue .main-header .navbar .dropdown-menu li a{color:#333}a.logo.no-hover a:hover{background-color:transparent}.required{border-right:6px solid orange}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:13px}.sidebar-menu{font-size:14px;white-space:normal}@media print{a[href]:after{content:none}.tab-content>.tab-pane{display:block!important;opacity:1!important;visibility:visible!important}}
        +/*# sourceMappingURL=overrides.css.map*/
        \ No newline at end of file
        diff --git a/build/css/overrides.css.map b/build/css/overrides.css.map
        new file mode 100644
        index 0000000000..7c74906ef6
        --- /dev/null
        +++ b/build/css/overrides.css.map
        @@ -0,0 +1 @@
        +{"version":3,"file":"css/overrides.css","sources":[],"mappings":"","sourceRoot":""}
        \ No newline at end of file
        diff --git a/build/mix-manifest.json b/build/mix-manifest.json
        new file mode 100644
        index 0000000000..a87d68690e
        --- /dev/null
        +++ b/build/mix-manifest.json
        @@ -0,0 +1,23 @@
        +{
        +  "/build/vue.js": "/build/vue.js",
        +  "/mix.js": "/mix.js",
        +  "/build/app.css": "/build/app.535d8af1016a2377e449920c617f0197.css",
        +  "/build/AdminLTE.css": "/build/AdminLTE.3d8a2b2e33baa060b1b324363ad5e1c2.css",
        +  "/build/overrides.css": "/build/overrides.617623c6a96be3e0cbd11c5d4039ec10.css",
        +  "/css/all.css": "/css/all.css",
        +  "/js/all.js": "/js/all.js",
        +  "/css/app.css": "/css/app.css",
        +  "/css/dist/all.css": "/css/dist/all.css",
        +  "/js/dist/all.js": "/js/dist/all.js",
        +  "/css/AdminLTE.css": "/css/AdminLTE.css",
        +  "/css/overrides.css": "/css/overrides.css",
        +  "/css/skin-blue.css": "/css/skin-blue.css",
        +  "/vue.js": "/vue.js",
        +  "/vue.js.map": "/vue.js.map",
        +  "/mix.js.map": "/mix.js.map",
        +  "/css/AdminLTE.css.map": "/css/AdminLTE.css.map",
        +  "/css/app.css.map": "/css/app.css.map",
        +  "/css/overrides.css.map": "/css/overrides.css.map",
        +  "public/css/dist/all.css": "public/css/dist/all.css",
        +  "public/js/dist/all.js": "public/js/dist/all.js"
        +}
        \ No newline at end of file
        diff --git a/build/mix.js b/build/mix.js
        new file mode 100644
        index 0000000000..63deebd17d
        --- /dev/null
        +++ b/build/mix.js
        @@ -0,0 +1,2 @@
        +!function(n){function t(e){if(r[e])return r[e].exports;var o=r[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};t.m=n,t.c=r,t.i=function(n){return n},t.d=function(n,r,e){t.o(n,r)||Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:e})},t.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(r,"a",r),r},t.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},t.p="",t(t.s=62)}({6:function(n,t){},62:function(n,t,r){r(9),r(7),r(8),n.exports=r(6)},7:function(n,t){},8:function(n,t){},9:function(n,t){}});
        +//# sourceMappingURL=mix.js.map
        \ No newline at end of file
        diff --git a/build/mix.js.map b/build/mix.js.map
        new file mode 100644
        index 0000000000..bd69599ae6
        --- /dev/null
        +++ b/build/mix.js.map
        @@ -0,0 +1 @@
        +{"version":3,"file":"mix.js","sources":["webpack:///mix.js"],"sourcesContent":["!function(n){function t(e){if(r[e])return r[e].exports;var o=r[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};t.m=n,t.c=r,t.i=function(n){return n},t.d=function(n,r,e){t.o(n,r)||Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:e})},t.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(r,\"a\",r),r},t.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},t.p=\"\",t(t.s=62)}({6:function(n,t){},62:function(n,t,r){r(9),r(7),r(8),n.exports=r(6)},7:function(n,t){},8:function(n,t){},9:function(n,t){}});\n\n\n// WEBPACK FOOTER //\n// mix.js"],"mappings":"AAAA","sourceRoot":""}
        \ No newline at end of file
        diff --git a/build/vue.js b/build/vue.js
        new file mode 100644
        index 0000000000..32e2f55db3
        --- /dev/null
        +++ b/build/vue.js
        @@ -0,0 +1,64 @@
        +!function(t){function e(n){if(i[n])return i[n].exports;var r=i[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var i={};e.m=t,e.c=i,e.i=function(t){return t},e.d=function(t,i,n){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=63)}([function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e<this.length;e++){var i=this[e];i[2]?t.push("@media "+i[2]+"{"+i[1]+"}"):t.push(i[1])}return t.join("")},t.i=function(e,i){"string"==typeof e&&(e=[[null,e,""]]);for(var n={},r=0;r<this.length;r++){var s=this[r][0];"number"==typeof s&&(n[s]=!0)}for(r=0;r<e.length;r++){var o=e[r];"number"==typeof o[0]&&n[o[0]]||(i&&!o[2]?o[2]=i:i&&(o[2]="("+o[2]+") and ("+i+")"),t.push(o))}},t}},function(t,e){t.exports=function(t,e,i,n){var r,s=t=t||{},o=typeof t.default;"object"!==o&&"function"!==o||(r=t,s=t.default);var a="function"==typeof s?s.options:s;if(e&&(a.render=e.render,a.staticRenderFns=e.staticRenderFns),i&&(a._scopeId=i),n){var l=Object.create(a.computed||null);Object.keys(n).forEach(function(t){var e=n[t];l[t]=function(){return e}}),a.computed=l}return{esModule:r,exports:s,options:a}}},function(t,e,i){function n(t){for(var e=0;e<t.length;e++){var i=t[e],n=c[i.id];if(n){n.refs++;for(var r=0;r<n.parts.length;r++)n.parts[r](i.parts[r]);for(;r<i.parts.length;r++)n.parts.push(s(i.parts[r]));n.parts.length>i.parts.length&&(n.parts.length=i.parts.length)}else{for(var o=[],r=0;r<i.parts.length;r++)o.push(s(i.parts[r]));c[i.id]={id:i.id,refs:1,parts:o}}}}function r(){var t=document.createElement("style");return t.type="text/css",h.appendChild(t),t}function s(t){var e,i,n=document.querySelector('style[data-vue-ssr-id~="'+t.id+'"]');if(n){if(f)return g;n.parentNode.removeChild(n)}if(m){var s=p++;n=d||(d=r()),e=o.bind(null,n,s,!1),i=o.bind(null,n,s,!0)}else n=r(),e=a.bind(null,n),i=function(){n.parentNode.removeChild(n)};return e(t),function(n){if(n){if(n.css===t.css&&n.media===t.media&&n.sourceMap===t.sourceMap)return;e(t=n)}else i()}}function o(t,e,i,n){var r=i?"":n.css;if(t.styleSheet)t.styleSheet.cssText=v(e,r);else{var s=document.createTextNode(r),o=t.childNodes;o[e]&&t.removeChild(o[e]),o.length?t.insertBefore(s,o[e]):t.appendChild(s)}}function a(t,e){var i=e.css,n=e.media,r=e.sourceMap;if(n&&t.setAttribute("media",n),r&&(i+="\n/*# sourceURL="+r.sources[0]+" */",i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */"),t.styleSheet)t.styleSheet.cssText=i;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(i))}}var l="undefined"!=typeof document;if("undefined"!=typeof DEBUG&&DEBUG&&!l)throw new Error("vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.");var u=i(58),c={},h=l&&(document.head||document.getElementsByTagName("head")[0]),d=null,p=0,f=!1,g=function(){},m="undefined"!=typeof navigator&&/msie [6-9]\b/.test(navigator.userAgent.toLowerCase());t.exports=function(t,e,i){f=i;var r=u(t,e);return n(r),function(e){for(var i=[],s=0;s<r.length;s++){var o=r[s],a=c[o.id];a.refs--,i.push(a)}e?(r=u(t,e),n(r)):r=[];for(var s=0;s<i.length;s++){var a=i[s];if(0===a.refs){for(var l=0;l<a.parts.length;l++)a.parts[l]();delete c[a.id]}}}};var v=function(){var t=[];return function(e,i){return t[e]=i,t.filter(Boolean).join("\n")}}()},function(t,e,i){var n,r;/*!
        + * jQuery JavaScript Library v3.2.1
        + * https://jquery.com/
        + *
        + * Includes Sizzle.js
        + * https://sizzlejs.com/
        + *
        + * Copyright JS Foundation and other contributors
        + * Released under the MIT license
        + * https://jquery.org/license
        + *
        + * Date: 2017-03-20T18:59Z
        + */
        +!function(e,i){"use strict";"object"==typeof t&&"object"==typeof t.exports?t.exports=e.document?i(e,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return i(t)}:i(e)}("undefined"!=typeof window?window:this,function(i,s){"use strict";function o(t,e){e=e||ot;var i=e.createElement("script");i.text=t,e.head.appendChild(i).parentNode.removeChild(i)}function a(t){var e=!!t&&"length"in t&&t.length,i=_t.type(t);return"function"!==i&&!_t.isWindow(t)&&("array"===i||0===e||"number"==typeof e&&e>0&&e-1 in t)}function l(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}function u(t,e,i){return _t.isFunction(e)?_t.grep(t,function(t,n){return!!e.call(t,n,t)!==i}):e.nodeType?_t.grep(t,function(t){return t===e!==i}):"string"!=typeof e?_t.grep(t,function(t){return ht.call(e,t)>-1!==i}):At.test(e)?_t.filter(e,t,i):(e=_t.filter(e,t),_t.grep(t,function(t){return ht.call(e,t)>-1!==i&&1===t.nodeType}))}function c(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}function h(t){var e={};return _t.each(t.match(Pt)||[],function(t,i){e[i]=!0}),e}function d(t){return t}function p(t){throw t}function f(t,e,i,n){var r;try{t&&_t.isFunction(r=t.promise)?r.call(t).done(e).fail(i):t&&_t.isFunction(r=t.then)?r.call(t,e,i):e.apply(void 0,[t].slice(n))}catch(t){i.apply(void 0,[t])}}function g(){ot.removeEventListener("DOMContentLoaded",g),i.removeEventListener("load",g),_t.ready()}function m(){this.expando=_t.expando+m.uid++}function v(t){return"true"===t||"false"!==t&&("null"===t?null:t===+t+""?+t:Ft.test(t)?JSON.parse(t):t)}function _(t,e,i){var n;if(void 0===i&&1===t.nodeType)if(n="data-"+e.replace(zt,"-$&").toLowerCase(),"string"==typeof(i=t.getAttribute(n))){try{i=v(i)}catch(t){}Lt.set(t,e,i)}else i=void 0;return i}function y(t,e,i,n){var r,s=1,o=20,a=n?function(){return n.cur()}:function(){return _t.css(t,e,"")},l=a(),u=i&&i[3]||(_t.cssNumber[e]?"":"px"),c=(_t.cssNumber[e]||"px"!==u&&+l)&&qt.exec(_t.css(t,e));if(c&&c[3]!==u){u=u||c[3],i=i||[],c=+l||1;do{s=s||".5",c/=s,_t.style(t,e,c+u)}while(s!==(s=a()/l)&&1!==s&&--o)}return i&&(c=+c||+l||0,r=i[1]?c+(i[1]+1)*i[2]:+i[2],n&&(n.unit=u,n.start=c,n.end=r)),r}function b(t){var e,i=t.ownerDocument,n=t.nodeName,r=Vt[n];return r||(e=i.body.appendChild(i.createElement(n)),r=_t.css(e,"display"),e.parentNode.removeChild(e),"none"===r&&(r="block"),Vt[n]=r,r)}function w(t,e){for(var i,n,r=[],s=0,o=t.length;s<o;s++)n=t[s],n.style&&(i=n.style.display,e?("none"===i&&(r[s]=Rt.get(n,"display")||null,r[s]||(n.style.display="")),""===n.style.display&&Ut(n)&&(r[s]=b(n))):"none"!==i&&(r[s]="none",Rt.set(n,"display",i)));for(s=0;s<o;s++)null!=r[s]&&(t[s].style.display=r[s]);return t}function x(t,e){var i;return i=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&l(t,e)?_t.merge([t],i):i}function C(t,e){for(var i=0,n=t.length;i<n;i++)Rt.set(t[i],"globalEval",!e||Rt.get(e[i],"globalEval"))}function k(t,e,i,n,r){for(var s,o,a,l,u,c,h=e.createDocumentFragment(),d=[],p=0,f=t.length;p<f;p++)if((s=t[p])||0===s)if("object"===_t.type(s))_t.merge(d,s.nodeType?[s]:s);else if(Jt.test(s)){for(o=o||h.appendChild(e.createElement("div")),a=(Xt.exec(s)||["",""])[1].toLowerCase(),l=Zt[a]||Zt._default,o.innerHTML=l[1]+_t.htmlPrefilter(s)+l[2],c=l[0];c--;)o=o.lastChild;_t.merge(d,o.childNodes),o=h.firstChild,o.textContent=""}else d.push(e.createTextNode(s));for(h.textContent="",p=0;s=d[p++];)if(n&&_t.inArray(s,n)>-1)r&&r.push(s);else if(u=_t.contains(s.ownerDocument,s),o=x(h.appendChild(s),"script"),u&&C(o),i)for(c=0;s=o[c++];)Gt.test(s.type||"")&&i.push(s);return h}function T(){return!0}function D(){return!1}function S(){try{return ot.activeElement}catch(t){}}function A(t,e,i,n,r,s){var o,a;if("object"==typeof e){"string"!=typeof i&&(n=n||i,i=void 0);for(a in e)A(t,a,i,n,e[a],s);return t}if(null==n&&null==r?(r=i,n=i=void 0):null==r&&("string"==typeof i?(r=n,n=void 0):(r=n,n=i,i=void 0)),!1===r)r=D;else if(!r)return t;return 1===s&&(o=r,r=function(t){return _t().off(t),o.apply(this,arguments)},r.guid=o.guid||(o.guid=_t.guid++)),t.each(function(){_t.event.add(this,e,r,n,i)})}function E(t,e){return l(t,"table")&&l(11!==e.nodeType?e:e.firstChild,"tr")?_t(">tbody",t)[0]||t:t}function I(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function $(t){var e=oe.exec(t.type);return e?t.type=e[1]:t.removeAttribute("type"),t}function O(t,e){var i,n,r,s,o,a,l,u;if(1===e.nodeType){if(Rt.hasData(t)&&(s=Rt.access(t),o=Rt.set(e,s),u=s.events)){delete o.handle,o.events={};for(r in u)for(i=0,n=u[r].length;i<n;i++)_t.event.add(e,r,u[r][i])}Lt.hasData(t)&&(a=Lt.access(t),l=_t.extend({},a),Lt.set(e,l))}}function P(t,e){var i=e.nodeName.toLowerCase();"input"===i&&Kt.test(t.type)?e.checked=t.checked:"input"!==i&&"textarea"!==i||(e.defaultValue=t.defaultValue)}function N(t,e,i,n){e=ut.apply([],e);var r,s,a,l,u,c,h=0,d=t.length,p=d-1,f=e[0],g=_t.isFunction(f);if(g||d>1&&"string"==typeof f&&!vt.checkClone&&se.test(f))return t.each(function(r){var s=t.eq(r);g&&(e[0]=f.call(this,r,s.html())),N(s,e,i,n)});if(d&&(r=k(e,t[0].ownerDocument,!1,t,n),s=r.firstChild,1===r.childNodes.length&&(r=s),s||n)){for(a=_t.map(x(r,"script"),I),l=a.length;h<d;h++)u=r,h!==p&&(u=_t.clone(u,!0,!0),l&&_t.merge(a,x(u,"script"))),i.call(t[h],u,h);if(l)for(c=a[a.length-1].ownerDocument,_t.map(a,$),h=0;h<l;h++)u=a[h],Gt.test(u.type||"")&&!Rt.access(u,"globalEval")&&_t.contains(c,u)&&(u.src?_t._evalUrl&&_t._evalUrl(u.src):o(u.textContent.replace(ae,""),c))}return t}function M(t,e,i){for(var n,r=e?_t.filter(e,t):t,s=0;null!=(n=r[s]);s++)i||1!==n.nodeType||_t.cleanData(x(n)),n.parentNode&&(i&&_t.contains(n.ownerDocument,n)&&C(x(n,"script")),n.parentNode.removeChild(n));return t}function j(t,e,i){var n,r,s,o,a=t.style;return i=i||ce(t),i&&(o=i.getPropertyValue(e)||i[e],""!==o||_t.contains(t.ownerDocument,t)||(o=_t.style(t,e)),!vt.pixelMarginRight()&&ue.test(o)&&le.test(e)&&(n=a.width,r=a.minWidth,s=a.maxWidth,a.minWidth=a.maxWidth=a.width=o,o=i.width,a.width=n,a.minWidth=r,a.maxWidth=s)),void 0!==o?o+"":o}function H(t,e){return{get:function(){return t()?void delete this.get:(this.get=e).apply(this,arguments)}}}function R(t){if(t in me)return t;for(var e=t[0].toUpperCase()+t.slice(1),i=ge.length;i--;)if((t=ge[i]+e)in me)return t}function L(t){var e=_t.cssProps[t];return e||(e=_t.cssProps[t]=R(t)||t),e}function F(t,e,i){var n=qt.exec(e);return n?Math.max(0,n[2]-(i||0))+(n[3]||"px"):e}function z(t,e,i,n,r){var s,o=0;for(s=i===(n?"border":"content")?4:"width"===e?1:0;s<4;s+=2)"margin"===i&&(o+=_t.css(t,i+Bt[s],!0,r)),n?("content"===i&&(o-=_t.css(t,"padding"+Bt[s],!0,r)),"margin"!==i&&(o-=_t.css(t,"border"+Bt[s]+"Width",!0,r))):(o+=_t.css(t,"padding"+Bt[s],!0,r),"padding"!==i&&(o+=_t.css(t,"border"+Bt[s]+"Width",!0,r)));return o}function W(t,e,i){var n,r=ce(t),s=j(t,e,r),o="border-box"===_t.css(t,"boxSizing",!1,r);return ue.test(s)?s:(n=o&&(vt.boxSizingReliable()||s===t.style[e]),"auto"===s&&(s=t["offset"+e[0].toUpperCase()+e.slice(1)]),(s=parseFloat(s)||0)+z(t,e,i||(o?"border":"content"),n,r)+"px")}function q(t,e,i,n,r){return new q.prototype.init(t,e,i,n,r)}function B(){_e&&(!1===ot.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(B):i.setTimeout(B,_t.fx.interval),_t.fx.tick())}function U(){return i.setTimeout(function(){ve=void 0}),ve=_t.now()}function Y(t,e){var i,n=0,r={height:t};for(e=e?1:0;n<4;n+=2-e)i=Bt[n],r["margin"+i]=r["padding"+i]=t;return e&&(r.opacity=r.width=t),r}function V(t,e,i){for(var n,r=(G.tweeners[e]||[]).concat(G.tweeners["*"]),s=0,o=r.length;s<o;s++)if(n=r[s].call(i,e,t))return n}function K(t,e,i){var n,r,s,o,a,l,u,c,h="width"in e||"height"in e,d=this,p={},f=t.style,g=t.nodeType&&Ut(t),m=Rt.get(t,"fxshow");i.queue||(o=_t._queueHooks(t,"fx"),null==o.unqueued&&(o.unqueued=0,a=o.empty.fire,o.empty.fire=function(){o.unqueued||a()}),o.unqueued++,d.always(function(){d.always(function(){o.unqueued--,_t.queue(t,"fx").length||o.empty.fire()})}));for(n in e)if(r=e[n],ye.test(r)){if(delete e[n],s=s||"toggle"===r,r===(g?"hide":"show")){if("show"!==r||!m||void 0===m[n])continue;g=!0}p[n]=m&&m[n]||_t.style(t,n)}if((l=!_t.isEmptyObject(e))||!_t.isEmptyObject(p)){h&&1===t.nodeType&&(i.overflow=[f.overflow,f.overflowX,f.overflowY],u=m&&m.display,null==u&&(u=Rt.get(t,"display")),c=_t.css(t,"display"),"none"===c&&(u?c=u:(w([t],!0),u=t.style.display||u,c=_t.css(t,"display"),w([t]))),("inline"===c||"inline-block"===c&&null!=u)&&"none"===_t.css(t,"float")&&(l||(d.done(function(){f.display=u}),null==u&&(c=f.display,u="none"===c?"":c)),f.display="inline-block")),i.overflow&&(f.overflow="hidden",d.always(function(){f.overflow=i.overflow[0],f.overflowX=i.overflow[1],f.overflowY=i.overflow[2]})),l=!1;for(n in p)l||(m?"hidden"in m&&(g=m.hidden):m=Rt.access(t,"fxshow",{display:u}),s&&(m.hidden=!g),g&&w([t],!0),d.done(function(){g||w([t]),Rt.remove(t,"fxshow");for(n in p)_t.style(t,n,p[n])})),l=V(g?m[n]:0,n,d),n in m||(m[n]=l.start,g&&(l.end=l.start,l.start=0))}}function X(t,e){var i,n,r,s,o;for(i in t)if(n=_t.camelCase(i),r=e[n],s=t[i],Array.isArray(s)&&(r=s[1],s=t[i]=s[0]),i!==n&&(t[n]=s,delete t[i]),(o=_t.cssHooks[n])&&"expand"in o){s=o.expand(s),delete t[n];for(i in s)i in t||(t[i]=s[i],e[i]=r)}else e[n]=r}function G(t,e,i){var n,r,s=0,o=G.prefilters.length,a=_t.Deferred().always(function(){delete l.elem}),l=function(){if(r)return!1;for(var e=ve||U(),i=Math.max(0,u.startTime+u.duration-e),n=i/u.duration||0,s=1-n,o=0,l=u.tweens.length;o<l;o++)u.tweens[o].run(s);return a.notifyWith(t,[u,s,i]),s<1&&l?i:(l||a.notifyWith(t,[u,1,0]),a.resolveWith(t,[u]),!1)},u=a.promise({elem:t,props:_t.extend({},e),opts:_t.extend(!0,{specialEasing:{},easing:_t.easing._default},i),originalProperties:e,originalOptions:i,startTime:ve||U(),duration:i.duration,tweens:[],createTween:function(e,i){var n=_t.Tween(t,u.opts,e,i,u.opts.specialEasing[e]||u.opts.easing);return u.tweens.push(n),n},stop:function(e){var i=0,n=e?u.tweens.length:0;if(r)return this;for(r=!0;i<n;i++)u.tweens[i].run(1);return e?(a.notifyWith(t,[u,1,0]),a.resolveWith(t,[u,e])):a.rejectWith(t,[u,e]),this}}),c=u.props;for(X(c,u.opts.specialEasing);s<o;s++)if(n=G.prefilters[s].call(u,t,c,u.opts))return _t.isFunction(n.stop)&&(_t._queueHooks(u.elem,u.opts.queue).stop=_t.proxy(n.stop,n)),n;return _t.map(c,V,u),_t.isFunction(u.opts.start)&&u.opts.start.call(t,u),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always),_t.fx.timer(_t.extend(l,{elem:t,anim:u,queue:u.opts.queue})),u}function Z(t){return(t.match(Pt)||[]).join(" ")}function J(t){return t.getAttribute&&t.getAttribute("class")||""}function Q(t,e,i,n){var r;if(Array.isArray(e))_t.each(e,function(e,r){i||Ie.test(t)?n(t,r):Q(t+"["+("object"==typeof r&&null!=r?e:"")+"]",r,i,n)});else if(i||"object"!==_t.type(e))n(t,e);else for(r in e)Q(t+"["+r+"]",e[r],i,n)}function tt(t){return function(e,i){"string"!=typeof e&&(i=e,e="*");var n,r=0,s=e.toLowerCase().match(Pt)||[];if(_t.isFunction(i))for(;n=s[r++];)"+"===n[0]?(n=n.slice(1)||"*",(t[n]=t[n]||[]).unshift(i)):(t[n]=t[n]||[]).push(i)}}function et(t,e,i,n){function r(a){var l;return s[a]=!0,_t.each(t[a]||[],function(t,a){var u=a(e,i,n);return"string"!=typeof u||o||s[u]?o?!(l=u):void 0:(e.dataTypes.unshift(u),r(u),!1)}),l}var s={},o=t===We;return r(e.dataTypes[0])||!s["*"]&&r("*")}function it(t,e){var i,n,r=_t.ajaxSettings.flatOptions||{};for(i in e)void 0!==e[i]&&((r[i]?t:n||(n={}))[i]=e[i]);return n&&_t.extend(!0,t,n),t}function nt(t,e,i){for(var n,r,s,o,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===n&&(n=t.mimeType||e.getResponseHeader("Content-Type"));if(n)for(r in a)if(a[r]&&a[r].test(n)){l.unshift(r);break}if(l[0]in i)s=l[0];else{for(r in i){if(!l[0]||t.converters[r+" "+l[0]]){s=r;break}o||(o=r)}s=s||o}if(s)return s!==l[0]&&l.unshift(s),i[s]}function rt(t,e,i,n){var r,s,o,a,l,u={},c=t.dataTypes.slice();if(c[1])for(o in t.converters)u[o.toLowerCase()]=t.converters[o];for(s=c.shift();s;)if(t.responseFields[s]&&(i[t.responseFields[s]]=e),!l&&n&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=s,s=c.shift())if("*"===s)s=l;else if("*"!==l&&l!==s){if(!(o=u[l+" "+s]||u["* "+s]))for(r in u)if(a=r.split(" "),a[1]===s&&(o=u[l+" "+a[0]]||u["* "+a[0]])){!0===o?o=u[r]:!0!==u[r]&&(s=a[0],c.unshift(a[1]));break}if(!0!==o)if(o&&t.throws)e=o(e);else try{e=o(e)}catch(t){return{state:"parsererror",error:o?t:"No conversion from "+l+" to "+s}}}return{state:"success",data:e}}var st=[],ot=i.document,at=Object.getPrototypeOf,lt=st.slice,ut=st.concat,ct=st.push,ht=st.indexOf,dt={},pt=dt.toString,ft=dt.hasOwnProperty,gt=ft.toString,mt=gt.call(Object),vt={},_t=function(t,e){return new _t.fn.init(t,e)},yt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bt=/^-ms-/,wt=/-([a-z])/g,xt=function(t,e){return e.toUpperCase()};_t.fn=_t.prototype={jquery:"3.2.1",constructor:_t,length:0,toArray:function(){return lt.call(this)},get:function(t){return null==t?lt.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=_t.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return _t.each(this,t)},map:function(t){return this.pushStack(_t.map(this,function(e,i){return t.call(e,i,e)}))},slice:function(){return this.pushStack(lt.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){var e=this.length,i=+t+(t<0?e:0);return this.pushStack(i>=0&&i<e?[this[i]]:[])},end:function(){return this.prevObject||this.constructor()},push:ct,sort:st.sort,splice:st.splice},_t.extend=_t.fn.extend=function(){var t,e,i,n,r,s,o=arguments[0]||{},a=1,l=arguments.length,u=!1;for("boolean"==typeof o&&(u=o,o=arguments[a]||{},a++),"object"==typeof o||_t.isFunction(o)||(o={}),a===l&&(o=this,a--);a<l;a++)if(null!=(t=arguments[a]))for(e in t)i=o[e],n=t[e],o!==n&&(u&&n&&(_t.isPlainObject(n)||(r=Array.isArray(n)))?(r?(r=!1,s=i&&Array.isArray(i)?i:[]):s=i&&_t.isPlainObject(i)?i:{},o[e]=_t.extend(u,s,n)):void 0!==n&&(o[e]=n));return o},_t.extend({expando:"jQuery"+("3.2.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(t){throw new Error(t)},noop:function(){},isFunction:function(t){return"function"===_t.type(t)},isWindow:function(t){return null!=t&&t===t.window},isNumeric:function(t){var e=_t.type(t);return("number"===e||"string"===e)&&!isNaN(t-parseFloat(t))},isPlainObject:function(t){var e,i;return!(!t||"[object Object]"!==pt.call(t))&&(!(e=at(t))||"function"==typeof(i=ft.call(e,"constructor")&&e.constructor)&&gt.call(i)===mt)},isEmptyObject:function(t){var e;for(e in t)return!1;return!0},type:function(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?dt[pt.call(t)]||"object":typeof t},globalEval:function(t){o(t)},camelCase:function(t){return t.replace(bt,"ms-").replace(wt,xt)},each:function(t,e){var i,n=0;if(a(t))for(i=t.length;n<i&&!1!==e.call(t[n],n,t[n]);n++);else for(n in t)if(!1===e.call(t[n],n,t[n]))break;return t},trim:function(t){return null==t?"":(t+"").replace(yt,"")},makeArray:function(t,e){var i=e||[];return null!=t&&(a(Object(t))?_t.merge(i,"string"==typeof t?[t]:t):ct.call(i,t)),i},inArray:function(t,e,i){return null==e?-1:ht.call(e,t,i)},merge:function(t,e){for(var i=+e.length,n=0,r=t.length;n<i;n++)t[r++]=e[n];return t.length=r,t},grep:function(t,e,i){for(var n=[],r=0,s=t.length,o=!i;r<s;r++)!e(t[r],r)!==o&&n.push(t[r]);return n},map:function(t,e,i){var n,r,s=0,o=[];if(a(t))for(n=t.length;s<n;s++)null!=(r=e(t[s],s,i))&&o.push(r);else for(s in t)null!=(r=e(t[s],s,i))&&o.push(r);return ut.apply([],o)},guid:1,proxy:function(t,e){var i,n,r;if("string"==typeof e&&(i=t[e],e=t,t=i),_t.isFunction(t))return n=lt.call(arguments,2),r=function(){return t.apply(e||this,n.concat(lt.call(arguments)))},r.guid=t.guid=t.guid||_t.guid++,r},now:Date.now,support:vt}),"function"==typeof Symbol&&(_t.fn[Symbol.iterator]=st[Symbol.iterator]),_t.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(t,e){dt["[object "+e+"]"]=e.toLowerCase()});var Ct=/*!
        + * Sizzle CSS Selector Engine v2.3.3
        + * https://sizzlejs.com/
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license
        + * http://jquery.org/license
        + *
        + * Date: 2016-08-08
        + */
        +function(t){function e(t,e,i,n){var r,s,o,a,l,c,d,p=e&&e.ownerDocument,f=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==f&&9!==f&&11!==f)return i;if(!n&&((e?e.ownerDocument||e:L)!==$&&I(e),e=e||$,P)){if(11!==f&&(l=gt.exec(t)))if(r=l[1]){if(9===f){if(!(o=e.getElementById(r)))return i;if(o.id===r)return i.push(o),i}else if(p&&(o=p.getElementById(r))&&H(e,o)&&o.id===r)return i.push(o),i}else{if(l[2])return G.apply(i,e.getElementsByTagName(t)),i;if((r=l[3])&&b.getElementsByClassName&&e.getElementsByClassName)return G.apply(i,e.getElementsByClassName(r)),i}if(b.qsa&&!B[t+" "]&&(!N||!N.test(t))){if(1!==f)p=e,d=t;else if("object"!==e.nodeName.toLowerCase()){for((a=e.getAttribute("id"))?a=a.replace(yt,bt):e.setAttribute("id",a=R),c=k(t),s=c.length;s--;)c[s]="#"+a+" "+h(c[s]);d=c.join(","),p=mt.test(t)&&u(e.parentNode)||e}if(d)try{return G.apply(i,p.querySelectorAll(d)),i}catch(t){}finally{a===R&&e.removeAttribute("id")}}}return D(t.replace(st,"$1"),e,i,n)}function i(){function t(i,n){return e.push(i+" ")>w.cacheLength&&delete t[e.shift()],t[i+" "]=n}var e=[];return t}function n(t){return t[R]=!0,t}function r(t){var e=$.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function s(t,e){for(var i=t.split("|"),n=i.length;n--;)w.attrHandle[i[n]]=e}function o(t,e){var i=e&&t,n=i&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(n)return n;if(i)for(;i=i.nextSibling;)if(i===e)return-1;return t?1:-1}function a(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&xt(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function l(t){return n(function(e){return e=+e,n(function(i,n){for(var r,s=t([],i.length,e),o=s.length;o--;)i[r=s[o]]&&(i[r]=!(n[r]=i[r]))})})}function u(t){return t&&void 0!==t.getElementsByTagName&&t}function c(){}function h(t){for(var e=0,i=t.length,n="";e<i;e++)n+=t[e].value;return n}function d(t,e,i){var n=e.dir,r=e.next,s=r||n,o=i&&"parentNode"===s,a=z++;return e.first?function(e,i,r){for(;e=e[n];)if(1===e.nodeType||o)return t(e,i,r);return!1}:function(e,i,l){var u,c,h,d=[F,a];if(l){for(;e=e[n];)if((1===e.nodeType||o)&&t(e,i,l))return!0}else for(;e=e[n];)if(1===e.nodeType||o)if(h=e[R]||(e[R]={}),c=h[e.uniqueID]||(h[e.uniqueID]={}),r&&r===e.nodeName.toLowerCase())e=e[n]||e;else{if((u=c[s])&&u[0]===F&&u[1]===a)return d[2]=u[2];if(c[s]=d,d[2]=t(e,i,l))return!0}return!1}}function p(t){return t.length>1?function(e,i,n){for(var r=t.length;r--;)if(!t[r](e,i,n))return!1;return!0}:t[0]}function f(t,i,n){for(var r=0,s=i.length;r<s;r++)e(t,i[r],n);return n}function g(t,e,i,n,r){for(var s,o=[],a=0,l=t.length,u=null!=e;a<l;a++)(s=t[a])&&(i&&!i(s,n,r)||(o.push(s),u&&e.push(a)));return o}function m(t,e,i,r,s,o){return r&&!r[R]&&(r=m(r)),s&&!s[R]&&(s=m(s,o)),n(function(n,o,a,l){var u,c,h,d=[],p=[],m=o.length,v=n||f(e||"*",a.nodeType?[a]:a,[]),_=!t||!n&&e?v:g(v,d,t,a,l),y=i?s||(n?t:m||r)?[]:o:_;if(i&&i(_,y,a,l),r)for(u=g(y,p),r(u,[],a,l),c=u.length;c--;)(h=u[c])&&(y[p[c]]=!(_[p[c]]=h));if(n){if(s||t){if(s){for(u=[],c=y.length;c--;)(h=y[c])&&u.push(_[c]=h);s(null,y=[],u,l)}for(c=y.length;c--;)(h=y[c])&&(u=s?J(n,h):d[c])>-1&&(n[u]=!(o[u]=h))}}else y=g(y===o?y.splice(m,y.length):y),s?s(null,o,y,l):G.apply(o,y)})}function v(t){for(var e,i,n,r=t.length,s=w.relative[t[0].type],o=s||w.relative[" "],a=s?1:0,l=d(function(t){return t===e},o,!0),u=d(function(t){return J(e,t)>-1},o,!0),c=[function(t,i,n){var r=!s&&(n||i!==S)||((e=i).nodeType?l(t,i,n):u(t,i,n));return e=null,r}];a<r;a++)if(i=w.relative[t[a].type])c=[d(p(c),i)];else{if(i=w.filter[t[a].type].apply(null,t[a].matches),i[R]){for(n=++a;n<r&&!w.relative[t[n].type];n++);return m(a>1&&p(c),a>1&&h(t.slice(0,a-1).concat({value:" "===t[a-2].type?"*":""})).replace(st,"$1"),i,a<n&&v(t.slice(a,n)),n<r&&v(t=t.slice(n)),n<r&&h(t))}c.push(i)}return p(c)}function _(t,i){var r=i.length>0,s=t.length>0,o=function(n,o,a,l,u){var c,h,d,p=0,f="0",m=n&&[],v=[],_=S,y=n||s&&w.find.TAG("*",u),b=F+=null==_?1:Math.random()||.1,x=y.length;for(u&&(S=o===$||o||u);f!==x&&null!=(c=y[f]);f++){if(s&&c){for(h=0,o||c.ownerDocument===$||(I(c),a=!P);d=t[h++];)if(d(c,o||$,a)){l.push(c);break}u&&(F=b)}r&&((c=!d&&c)&&p--,n&&m.push(c))}if(p+=f,r&&f!==p){for(h=0;d=i[h++];)d(m,v,o,a);if(n){if(p>0)for(;f--;)m[f]||v[f]||(v[f]=K.call(l));v=g(v)}G.apply(l,v),u&&!n&&v.length>0&&p+i.length>1&&e.uniqueSort(l)}return u&&(F=b,S=_),m};return r?n(o):o}var y,b,w,x,C,k,T,D,S,A,E,I,$,O,P,N,M,j,H,R="sizzle"+1*new Date,L=t.document,F=0,z=0,W=i(),q=i(),B=i(),U=function(t,e){return t===e&&(E=!0),0},Y={}.hasOwnProperty,V=[],K=V.pop,X=V.push,G=V.push,Z=V.slice,J=function(t,e){for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i;return-1},Q="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",tt="[\\x20\\t\\r\\n\\f]",et="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",it="\\["+tt+"*("+et+")(?:"+tt+"*([*^$|!~]?=)"+tt+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+et+"))|)"+tt+"*\\]",nt=":("+et+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+it+")*)|.*)\\)|)",rt=new RegExp(tt+"+","g"),st=new RegExp("^"+tt+"+|((?:^|[^\\\\])(?:\\\\.)*)"+tt+"+$","g"),ot=new RegExp("^"+tt+"*,"+tt+"*"),at=new RegExp("^"+tt+"*([>+~]|"+tt+")"+tt+"*"),lt=new RegExp("="+tt+"*([^\\]'\"]*?)"+tt+"*\\]","g"),ut=new RegExp(nt),ct=new RegExp("^"+et+"$"),ht={ID:new RegExp("^#("+et+")"),CLASS:new RegExp("^\\.("+et+")"),TAG:new RegExp("^("+et+"|[*])"),ATTR:new RegExp("^"+it),PSEUDO:new RegExp("^"+nt),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+tt+"*(even|odd|(([+-]|)(\\d*)n|)"+tt+"*(?:([+-]|)"+tt+"*(\\d+)|))"+tt+"*\\)|)","i"),bool:new RegExp("^(?:"+Q+")$","i"),needsContext:new RegExp("^"+tt+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+tt+"*((?:-\\d)?\\d*)"+tt+"*\\)|)(?=[^-]|$)","i")},dt=/^(?:input|select|textarea|button)$/i,pt=/^h\d$/i,ft=/^[^{]+\{\s*\[native \w/,gt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,mt=/[+~]/,vt=new RegExp("\\\\([\\da-f]{1,6}"+tt+"?|("+tt+")|.)","ig"),_t=function(t,e,i){var n="0x"+e-65536;return n!==n||i?e:n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320)},yt=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,bt=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},wt=function(){I()},xt=d(function(t){return!0===t.disabled&&("form"in t||"label"in t)},{dir:"parentNode",next:"legend"});try{G.apply(V=Z.call(L.childNodes),L.childNodes),V[L.childNodes.length].nodeType}catch(t){G={apply:V.length?function(t,e){X.apply(t,Z.call(e))}:function(t,e){for(var i=t.length,n=0;t[i++]=e[n++];);t.length=i-1}}}b=e.support={},C=e.isXML=function(t){var e=t&&(t.ownerDocument||t).documentElement;return!!e&&"HTML"!==e.nodeName},I=e.setDocument=function(t){var e,i,n=t?t.ownerDocument||t:L;return n!==$&&9===n.nodeType&&n.documentElement?($=n,O=$.documentElement,P=!C($),L!==$&&(i=$.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",wt,!1):i.attachEvent&&i.attachEvent("onunload",wt)),b.attributes=r(function(t){return t.className="i",!t.getAttribute("className")}),b.getElementsByTagName=r(function(t){return t.appendChild($.createComment("")),!t.getElementsByTagName("*").length}),b.getElementsByClassName=ft.test($.getElementsByClassName),b.getById=r(function(t){return O.appendChild(t).id=R,!$.getElementsByName||!$.getElementsByName(R).length}),b.getById?(w.filter.ID=function(t){var e=t.replace(vt,_t);return function(t){return t.getAttribute("id")===e}},w.find.ID=function(t,e){if(void 0!==e.getElementById&&P){var i=e.getElementById(t);return i?[i]:[]}}):(w.filter.ID=function(t){var e=t.replace(vt,_t);return function(t){var i=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return i&&i.value===e}},w.find.ID=function(t,e){if(void 0!==e.getElementById&&P){var i,n,r,s=e.getElementById(t);if(s){if((i=s.getAttributeNode("id"))&&i.value===t)return[s];for(r=e.getElementsByName(t),n=0;s=r[n++];)if((i=s.getAttributeNode("id"))&&i.value===t)return[s]}return[]}}),w.find.TAG=b.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):b.qsa?e.querySelectorAll(t):void 0}:function(t,e){var i,n=[],r=0,s=e.getElementsByTagName(t);if("*"===t){for(;i=s[r++];)1===i.nodeType&&n.push(i);return n}return s},w.find.CLASS=b.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&P)return e.getElementsByClassName(t)},M=[],N=[],(b.qsa=ft.test($.querySelectorAll))&&(r(function(t){O.appendChild(t).innerHTML="<a id='"+R+"'></a><select id='"+R+"-\r\\' msallowcapture=''><option selected=''></option></select>",t.querySelectorAll("[msallowcapture^='']").length&&N.push("[*^$]="+tt+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||N.push("\\["+tt+"*(?:value|"+Q+")"),t.querySelectorAll("[id~="+R+"-]").length||N.push("~="),t.querySelectorAll(":checked").length||N.push(":checked"),t.querySelectorAll("a#"+R+"+*").length||N.push(".#.+[+~]")}),r(function(t){t.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var e=$.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&N.push("name"+tt+"*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&N.push(":enabled",":disabled"),O.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&N.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),N.push(",.*:")})),(b.matchesSelector=ft.test(j=O.matches||O.webkitMatchesSelector||O.mozMatchesSelector||O.oMatchesSelector||O.msMatchesSelector))&&r(function(t){b.disconnectedMatch=j.call(t,"*"),j.call(t,"[s!='']:x"),M.push("!=",nt)}),N=N.length&&new RegExp(N.join("|")),M=M.length&&new RegExp(M.join("|")),e=ft.test(O.compareDocumentPosition),H=e||ft.test(O.contains)?function(t,e){var i=9===t.nodeType?t.documentElement:t,n=e&&e.parentNode;return t===n||!(!n||1!==n.nodeType||!(i.contains?i.contains(n):t.compareDocumentPosition&&16&t.compareDocumentPosition(n)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},U=e?function(t,e){if(t===e)return E=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(i=(t.ownerDocument||t)===(e.ownerDocument||e)?t.compareDocumentPosition(e):1,1&i||!b.sortDetached&&e.compareDocumentPosition(t)===i?t===$||t.ownerDocument===L&&H(L,t)?-1:e===$||e.ownerDocument===L&&H(L,e)?1:A?J(A,t)-J(A,e):0:4&i?-1:1)}:function(t,e){if(t===e)return E=!0,0;var i,n=0,r=t.parentNode,s=e.parentNode,a=[t],l=[e];if(!r||!s)return t===$?-1:e===$?1:r?-1:s?1:A?J(A,t)-J(A,e):0;if(r===s)return o(t,e);for(i=t;i=i.parentNode;)a.unshift(i);for(i=e;i=i.parentNode;)l.unshift(i);for(;a[n]===l[n];)n++;return n?o(a[n],l[n]):a[n]===L?-1:l[n]===L?1:0},$):$},e.matches=function(t,i){return e(t,null,null,i)},e.matchesSelector=function(t,i){if((t.ownerDocument||t)!==$&&I(t),i=i.replace(lt,"='$1']"),b.matchesSelector&&P&&!B[i+" "]&&(!M||!M.test(i))&&(!N||!N.test(i)))try{var n=j.call(t,i);if(n||b.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){}return e(i,$,null,[t]).length>0},e.contains=function(t,e){return(t.ownerDocument||t)!==$&&I(t),H(t,e)},e.attr=function(t,e){(t.ownerDocument||t)!==$&&I(t);var i=w.attrHandle[e.toLowerCase()],n=i&&Y.call(w.attrHandle,e.toLowerCase())?i(t,e,!P):void 0;return void 0!==n?n:b.attributes||!P?t.getAttribute(e):(n=t.getAttributeNode(e))&&n.specified?n.value:null},e.escape=function(t){return(t+"").replace(yt,bt)},e.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},e.uniqueSort=function(t){var e,i=[],n=0,r=0;if(E=!b.detectDuplicates,A=!b.sortStable&&t.slice(0),t.sort(U),E){for(;e=t[r++];)e===t[r]&&(n=i.push(r));for(;n--;)t.splice(i[n],1)}return A=null,t},x=e.getText=function(t){var e,i="",n=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)i+=x(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[n++];)i+=x(e);return i},w=e.selectors={cacheLength:50,createPseudo:n,match:ht,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(vt,_t),t[3]=(t[3]||t[4]||t[5]||"").replace(vt,_t),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||e.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&e.error(t[0]),t},PSEUDO:function(t){var e,i=!t[6]&&t[2];return ht.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":i&&ut.test(i)&&(e=k(i,!0))&&(e=i.indexOf(")",i.length-e)-i.length)&&(t[0]=t[0].slice(0,e),t[2]=i.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(vt,_t).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=W[t+" "];return e||(e=new RegExp("(^|"+tt+")"+t+"("+tt+"|$)"))&&W(t,function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")})},ATTR:function(t,i,n){return function(r){var s=e.attr(r,t);return null==s?"!="===i:!i||(s+="","="===i?s===n:"!="===i?s!==n:"^="===i?n&&0===s.indexOf(n):"*="===i?n&&s.indexOf(n)>-1:"$="===i?n&&s.slice(-n.length)===n:"~="===i?(" "+s.replace(rt," ")+" ").indexOf(n)>-1:"|="===i&&(s===n||s.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,i,n,r){var s="nth"!==t.slice(0,3),o="last"!==t.slice(-4),a="of-type"===e;return 1===n&&0===r?function(t){return!!t.parentNode}:function(e,i,l){var u,c,h,d,p,f,g=s!==o?"nextSibling":"previousSibling",m=e.parentNode,v=a&&e.nodeName.toLowerCase(),_=!l&&!a,y=!1;if(m){if(s){for(;g;){for(d=e;d=d[g];)if(a?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;f=g="only"===t&&!f&&"nextSibling"}return!0}if(f=[o?m.firstChild:m.lastChild],o&&_){for(d=m,h=d[R]||(d[R]={}),c=h[d.uniqueID]||(h[d.uniqueID]={}),u=c[t]||[],p=u[0]===F&&u[1],y=p&&u[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(y=p=0)||f.pop();)if(1===d.nodeType&&++y&&d===e){c[t]=[F,p,y];break}}else if(_&&(d=e,h=d[R]||(d[R]={}),c=h[d.uniqueID]||(h[d.uniqueID]={}),u=c[t]||[],p=u[0]===F&&u[1],y=p),!1===y)for(;(d=++p&&d&&d[g]||(y=p=0)||f.pop())&&((a?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++y||(_&&(h=d[R]||(d[R]={}),c=h[d.uniqueID]||(h[d.uniqueID]={}),c[t]=[F,y]),d!==e)););return(y-=r)===n||y%n==0&&y/n>=0}}},PSEUDO:function(t,i){var r,s=w.pseudos[t]||w.setFilters[t.toLowerCase()]||e.error("unsupported pseudo: "+t);return s[R]?s(i):s.length>1?(r=[t,t,"",i],w.setFilters.hasOwnProperty(t.toLowerCase())?n(function(t,e){for(var n,r=s(t,i),o=r.length;o--;)n=J(t,r[o]),t[n]=!(e[n]=r[o])}):function(t){return s(t,0,r)}):s}},pseudos:{not:n(function(t){var e=[],i=[],r=T(t.replace(st,"$1"));return r[R]?n(function(t,e,i,n){for(var s,o=r(t,null,n,[]),a=t.length;a--;)(s=o[a])&&(t[a]=!(e[a]=s))}):function(t,n,s){return e[0]=t,r(e,null,s,i),e[0]=null,!i.pop()}}),has:n(function(t){return function(i){return e(t,i).length>0}}),contains:n(function(t){return t=t.replace(vt,_t),function(e){return(e.textContent||e.innerText||x(e)).indexOf(t)>-1}}),lang:n(function(t){return ct.test(t||"")||e.error("unsupported lang: "+t),t=t.replace(vt,_t).toLowerCase(),function(e){var i;do{if(i=P?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(i=i.toLowerCase())===t||0===i.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var i=t.location&&t.location.hash;return i&&i.slice(1)===e.id},root:function(t){return t===O},focus:function(t){return t===$.activeElement&&(!$.hasFocus||$.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:a(!1),disabled:a(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!w.pseudos.empty(t)},header:function(t){return pt.test(t.nodeName)},input:function(t){return dt.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:l(function(){return[0]}),last:l(function(t,e){return[e-1]}),eq:l(function(t,e,i){return[i<0?i+e:i]}),even:l(function(t,e){for(var i=0;i<e;i+=2)t.push(i);return t}),odd:l(function(t,e){for(var i=1;i<e;i+=2)t.push(i);return t}),lt:l(function(t,e,i){for(var n=i<0?i+e:i;--n>=0;)t.push(n);return t}),gt:l(function(t,e,i){for(var n=i<0?i+e:i;++n<e;)t.push(n);return t})}},w.pseudos.nth=w.pseudos.eq;for(y in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[y]=function(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}(y);for(y in{submit:!0,reset:!0})w.pseudos[y]=function(t){return function(e){var i=e.nodeName.toLowerCase();return("input"===i||"button"===i)&&e.type===t}}(y);return c.prototype=w.filters=w.pseudos,w.setFilters=new c,k=e.tokenize=function(t,i){var n,r,s,o,a,l,u,c=q[t+" "];if(c)return i?0:c.slice(0);for(a=t,l=[],u=w.preFilter;a;){n&&!(r=ot.exec(a))||(r&&(a=a.slice(r[0].length)||a),l.push(s=[])),n=!1,(r=at.exec(a))&&(n=r.shift(),s.push({value:n,type:r[0].replace(st," ")}),a=a.slice(n.length));for(o in w.filter)!(r=ht[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),s.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return i?a.length:a?e.error(t):q(t,l).slice(0)},T=e.compile=function(t,e){var i,n=[],r=[],s=B[t+" "];if(!s){for(e||(e=k(t)),i=e.length;i--;)s=v(e[i]),s[R]?n.push(s):r.push(s);s=B(t,_(r,n)),s.selector=t}return s},D=e.select=function(t,e,i,n){var r,s,o,a,l,c="function"==typeof t&&t,d=!n&&k(t=c.selector||t);if(i=i||[],1===d.length){if(s=d[0]=d[0].slice(0),s.length>2&&"ID"===(o=s[0]).type&&9===e.nodeType&&P&&w.relative[s[1].type]){if(!(e=(w.find.ID(o.matches[0].replace(vt,_t),e)||[])[0]))return i;c&&(e=e.parentNode),t=t.slice(s.shift().value.length)}for(r=ht.needsContext.test(t)?0:s.length;r--&&(o=s[r],!w.relative[a=o.type]);)if((l=w.find[a])&&(n=l(o.matches[0].replace(vt,_t),mt.test(s[0].type)&&u(e.parentNode)||e))){if(s.splice(r,1),!(t=n.length&&h(s)))return G.apply(i,n),i;break}}return(c||T(t,d))(n,e,!P,i,!e||mt.test(t)&&u(e.parentNode)||e),i},b.sortStable=R.split("").sort(U).join("")===R,b.detectDuplicates=!!E,I(),b.sortDetached=r(function(t){return 1&t.compareDocumentPosition($.createElement("fieldset"))}),r(function(t){return t.innerHTML="<a href='#'></a>","#"===t.firstChild.getAttribute("href")})||s("type|href|height|width",function(t,e,i){if(!i)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)}),b.attributes&&r(function(t){return t.innerHTML="<input/>",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")})||s("value",function(t,e,i){if(!i&&"input"===t.nodeName.toLowerCase())return t.defaultValue}),r(function(t){return null==t.getAttribute("disabled")})||s(Q,function(t,e,i){var n;if(!i)return!0===t[e]?e.toLowerCase():(n=t.getAttributeNode(e))&&n.specified?n.value:null}),e}(i);_t.find=Ct,_t.expr=Ct.selectors,_t.expr[":"]=_t.expr.pseudos,_t.uniqueSort=_t.unique=Ct.uniqueSort,_t.text=Ct.getText,_t.isXMLDoc=Ct.isXML,_t.contains=Ct.contains,_t.escapeSelector=Ct.escape;var kt=function(t,e,i){for(var n=[],r=void 0!==i;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(r&&_t(t).is(i))break;n.push(t)}return n},Tt=function(t,e){for(var i=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&i.push(t);return i},Dt=_t.expr.match.needsContext,St=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,At=/^.[^:#\[\.,]*$/;_t.filter=function(t,e,i){var n=e[0];return i&&(t=":not("+t+")"),1===e.length&&1===n.nodeType?_t.find.matchesSelector(n,t)?[n]:[]:_t.find.matches(t,_t.grep(e,function(t){return 1===t.nodeType}))},_t.fn.extend({find:function(t){var e,i,n=this.length,r=this;if("string"!=typeof t)return this.pushStack(_t(t).filter(function(){for(e=0;e<n;e++)if(_t.contains(r[e],this))return!0}));for(i=this.pushStack([]),e=0;e<n;e++)_t.find(t,r[e],i);return n>1?_t.uniqueSort(i):i},filter:function(t){return this.pushStack(u(this,t||[],!1))},not:function(t){return this.pushStack(u(this,t||[],!0))},is:function(t){return!!u(this,"string"==typeof t&&Dt.test(t)?_t(t):t||[],!1).length}});var Et,It=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(_t.fn.init=function(t,e,i){var n,r;if(!t)return this;if(i=i||Et,"string"==typeof t){if(!(n="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:It.exec(t))||!n[1]&&e)return!e||e.jquery?(e||i).find(t):this.constructor(e).find(t);if(n[1]){if(e=e instanceof _t?e[0]:e,_t.merge(this,_t.parseHTML(n[1],e&&e.nodeType?e.ownerDocument||e:ot,!0)),St.test(n[1])&&_t.isPlainObject(e))for(n in e)_t.isFunction(this[n])?this[n](e[n]):this.attr(n,e[n]);return this}return r=ot.getElementById(n[2]),r&&(this[0]=r,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):_t.isFunction(t)?void 0!==i.ready?i.ready(t):t(_t):_t.makeArray(t,this)}).prototype=_t.fn,Et=_t(ot);var $t=/^(?:parents|prev(?:Until|All))/,Ot={children:!0,contents:!0,next:!0,prev:!0};_t.fn.extend({has:function(t){var e=_t(t,this),i=e.length;return this.filter(function(){for(var t=0;t<i;t++)if(_t.contains(this,e[t]))return!0})},closest:function(t,e){var i,n=0,r=this.length,s=[],o="string"!=typeof t&&_t(t);if(!Dt.test(t))for(;n<r;n++)for(i=this[n];i&&i!==e;i=i.parentNode)if(i.nodeType<11&&(o?o.index(i)>-1:1===i.nodeType&&_t.find.matchesSelector(i,t))){s.push(i);break}return this.pushStack(s.length>1?_t.uniqueSort(s):s)},index:function(t){return t?"string"==typeof t?ht.call(_t(t),this[0]):ht.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(_t.uniqueSort(_t.merge(this.get(),_t(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),_t.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return kt(t,"parentNode")},parentsUntil:function(t,e,i){return kt(t,"parentNode",i)},next:function(t){return c(t,"nextSibling")},prev:function(t){return c(t,"previousSibling")},nextAll:function(t){return kt(t,"nextSibling")},prevAll:function(t){return kt(t,"previousSibling")},nextUntil:function(t,e,i){return kt(t,"nextSibling",i)},prevUntil:function(t,e,i){return kt(t,"previousSibling",i)},siblings:function(t){return Tt((t.parentNode||{}).firstChild,t)},children:function(t){return Tt(t.firstChild)},contents:function(t){return l(t,"iframe")?t.contentDocument:(l(t,"template")&&(t=t.content||t),_t.merge([],t.childNodes))}},function(t,e){_t.fn[t]=function(i,n){var r=_t.map(this,e,i);return"Until"!==t.slice(-5)&&(n=i),n&&"string"==typeof n&&(r=_t.filter(n,r)),this.length>1&&(Ot[t]||_t.uniqueSort(r),$t.test(t)&&r.reverse()),this.pushStack(r)}});var Pt=/[^\x20\t\r\n\f]+/g;_t.Callbacks=function(t){t="string"==typeof t?h(t):_t.extend({},t);var e,i,n,r,s=[],o=[],a=-1,l=function(){for(r=r||t.once,n=e=!0;o.length;a=-1)for(i=o.shift();++a<s.length;)!1===s[a].apply(i[0],i[1])&&t.stopOnFalse&&(a=s.length,i=!1);t.memory||(i=!1),e=!1,r&&(s=i?[]:"")},u={add:function(){return s&&(i&&!e&&(a=s.length-1,o.push(i)),function e(i){_t.each(i,function(i,n){_t.isFunction(n)?t.unique&&u.has(n)||s.push(n):n&&n.length&&"string"!==_t.type(n)&&e(n)})}(arguments),i&&!e&&l()),this},remove:function(){return _t.each(arguments,function(t,e){for(var i;(i=_t.inArray(e,s,i))>-1;)s.splice(i,1),i<=a&&a--}),this},has:function(t){return t?_t.inArray(t,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return r=o=[],s=i="",this},disabled:function(){return!s},lock:function(){return r=o=[],i||e||(s=i=""),this},locked:function(){return!!r},fireWith:function(t,i){return r||(i=i||[],i=[t,i.slice?i.slice():i],o.push(i),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!n}};return u},_t.extend({Deferred:function(t){var e=[["notify","progress",_t.Callbacks("memory"),_t.Callbacks("memory"),2],["resolve","done",_t.Callbacks("once memory"),_t.Callbacks("once memory"),0,"resolved"],["reject","fail",_t.Callbacks("once memory"),_t.Callbacks("once memory"),1,"rejected"]],n="pending",r={state:function(){return n},always:function(){return s.done(arguments).fail(arguments),this},catch:function(t){return r.then(null,t)},pipe:function(){var t=arguments;return _t.Deferred(function(i){_t.each(e,function(e,n){var r=_t.isFunction(t[n[4]])&&t[n[4]];s[n[1]](function(){var t=r&&r.apply(this,arguments);t&&_t.isFunction(t.promise)?t.promise().progress(i.notify).done(i.resolve).fail(i.reject):i[n[0]+"With"](this,r?[t]:arguments)})}),t=null}).promise()},then:function(t,n,r){function s(t,e,n,r){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t<o)){if((i=n.apply(a,l))===e.promise())throw new TypeError("Thenable self-resolution");u=i&&("object"==typeof i||"function"==typeof i)&&i.then,_t.isFunction(u)?r?u.call(i,s(o,e,d,r),s(o,e,p,r)):(o++,u.call(i,s(o,e,d,r),s(o,e,p,r),s(o,e,d,e.notifyWith))):(n!==d&&(a=void 0,l=[i]),(r||e.resolveWith)(a,l))}},c=r?u:function(){try{u()}catch(i){_t.Deferred.exceptionHook&&_t.Deferred.exceptionHook(i,c.stackTrace),t+1>=o&&(n!==p&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(_t.Deferred.getStackHook&&(c.stackTrace=_t.Deferred.getStackHook()),i.setTimeout(c))}}var o=0;return _t.Deferred(function(i){e[0][3].add(s(0,i,_t.isFunction(r)?r:d,i.notifyWith)),e[1][3].add(s(0,i,_t.isFunction(t)?t:d)),e[2][3].add(s(0,i,_t.isFunction(n)?n:p))}).promise()},promise:function(t){return null!=t?_t.extend(t,r):r}},s={};return _t.each(e,function(t,i){var o=i[2],a=i[5];r[i[1]]=o.add,a&&o.add(function(){n=a},e[3-t][2].disable,e[0][2].lock),o.add(i[3].fire),s[i[0]]=function(){return s[i[0]+"With"](this===s?void 0:this,arguments),this},s[i[0]+"With"]=o.fireWith}),r.promise(s),t&&t.call(s,s),s},when:function(t){var e=arguments.length,i=e,n=Array(i),r=lt.call(arguments),s=_t.Deferred(),o=function(t){return function(i){n[t]=this,r[t]=arguments.length>1?lt.call(arguments):i,--e||s.resolveWith(n,r)}};if(e<=1&&(f(t,s.done(o(i)).resolve,s.reject,!e),"pending"===s.state()||_t.isFunction(r[i]&&r[i].then)))return s.then();for(;i--;)f(r[i],o(i),s.reject);return s.promise()}});var Nt=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;_t.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&Nt.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},_t.readyException=function(t){i.setTimeout(function(){throw t})};var Mt=_t.Deferred();_t.fn.ready=function(t){return Mt.then(t).catch(function(t){_t.readyException(t)}),this},_t.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--_t.readyWait:_t.isReady)||(_t.isReady=!0,!0!==t&&--_t.readyWait>0||Mt.resolveWith(ot,[_t]))}}),_t.ready.then=Mt.then,"complete"===ot.readyState||"loading"!==ot.readyState&&!ot.documentElement.doScroll?i.setTimeout(_t.ready):(ot.addEventListener("DOMContentLoaded",g),i.addEventListener("load",g));var jt=function(t,e,i,n,r,s,o){var a=0,l=t.length,u=null==i;if("object"===_t.type(i)){r=!0;for(a in i)jt(t,e,a,i[a],!0,s,o)}else if(void 0!==n&&(r=!0,_t.isFunction(n)||(o=!0),u&&(o?(e.call(t,n),e=null):(u=e,e=function(t,e,i){return u.call(_t(t),i)})),e))for(;a<l;a++)e(t[a],i,o?n:n.call(t[a],a,e(t[a],i)));return r?t:u?e.call(t):l?e(t[0],i):s},Ht=function(t){return 1===t.nodeType||9===t.nodeType||!+t.nodeType};m.uid=1,m.prototype={cache:function(t){var e=t[this.expando];return e||(e={},Ht(t)&&(t.nodeType?t[this.expando]=e:Object.defineProperty(t,this.expando,{value:e,configurable:!0}))),e},set:function(t,e,i){var n,r=this.cache(t);if("string"==typeof e)r[_t.camelCase(e)]=i;else for(n in e)r[_t.camelCase(n)]=e[n];return r},get:function(t,e){return void 0===e?this.cache(t):t[this.expando]&&t[this.expando][_t.camelCase(e)]},access:function(t,e,i){return void 0===e||e&&"string"==typeof e&&void 0===i?this.get(t,e):(this.set(t,e,i),void 0!==i?i:e)},remove:function(t,e){var i,n=t[this.expando];if(void 0!==n){if(void 0!==e){Array.isArray(e)?e=e.map(_t.camelCase):(e=_t.camelCase(e),e=e in n?[e]:e.match(Pt)||[]),i=e.length;for(;i--;)delete n[e[i]]}(void 0===e||_t.isEmptyObject(n))&&(t.nodeType?t[this.expando]=void 0:delete t[this.expando])}},hasData:function(t){var e=t[this.expando];return void 0!==e&&!_t.isEmptyObject(e)}};var Rt=new m,Lt=new m,Ft=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,zt=/[A-Z]/g;_t.extend({hasData:function(t){return Lt.hasData(t)||Rt.hasData(t)},data:function(t,e,i){return Lt.access(t,e,i)},removeData:function(t,e){Lt.remove(t,e)},_data:function(t,e,i){return Rt.access(t,e,i)},_removeData:function(t,e){Rt.remove(t,e)}}),_t.fn.extend({data:function(t,e){var i,n,r,s=this[0],o=s&&s.attributes;if(void 0===t){if(this.length&&(r=Lt.get(s),1===s.nodeType&&!Rt.get(s,"hasDataAttrs"))){for(i=o.length;i--;)o[i]&&(n=o[i].name,0===n.indexOf("data-")&&(n=_t.camelCase(n.slice(5)),_(s,n,r[n])));Rt.set(s,"hasDataAttrs",!0)}return r}return"object"==typeof t?this.each(function(){Lt.set(this,t)}):jt(this,function(e){var i;if(s&&void 0===e){if(void 0!==(i=Lt.get(s,t)))return i;if(void 0!==(i=_(s,t)))return i}else this.each(function(){Lt.set(this,t,e)})},null,e,arguments.length>1,null,!0)},removeData:function(t){return this.each(function(){Lt.remove(this,t)})}}),_t.extend({queue:function(t,e,i){var n;if(t)return e=(e||"fx")+"queue",n=Rt.get(t,e),i&&(!n||Array.isArray(i)?n=Rt.access(t,e,_t.makeArray(i)):n.push(i)),n||[]},dequeue:function(t,e){e=e||"fx";var i=_t.queue(t,e),n=i.length,r=i.shift(),s=_t._queueHooks(t,e),o=function(){_t.dequeue(t,e)};"inprogress"===r&&(r=i.shift(),n--),r&&("fx"===e&&i.unshift("inprogress"),delete s.stop,r.call(t,o,s)),!n&&s&&s.empty.fire()},_queueHooks:function(t,e){var i=e+"queueHooks";return Rt.get(t,i)||Rt.access(t,i,{empty:_t.Callbacks("once memory").add(function(){Rt.remove(t,[e+"queue",i])})})}}),_t.fn.extend({queue:function(t,e){var i=2;return"string"!=typeof t&&(e=t,t="fx",i--),arguments.length<i?_t.queue(this[0],t):void 0===e?this:this.each(function(){var i=_t.queue(this,t,e);_t._queueHooks(this,t),"fx"===t&&"inprogress"!==i[0]&&_t.dequeue(this,t)})},dequeue:function(t){return this.each(function(){_t.dequeue(this,t)})},clearQueue:function(t){return this.queue(t||"fx",[])},promise:function(t,e){var i,n=1,r=_t.Deferred(),s=this,o=this.length,a=function(){--n||r.resolveWith(s,[s])};for("string"!=typeof t&&(e=t,t=void 0),t=t||"fx";o--;)(i=Rt.get(s[o],t+"queueHooks"))&&i.empty&&(n++,i.empty.add(a));return a(),r.promise(e)}});var Wt=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,qt=new RegExp("^(?:([+-])=|)("+Wt+")([a-z%]*)$","i"),Bt=["Top","Right","Bottom","Left"],Ut=function(t,e){return t=e||t,"none"===t.style.display||""===t.style.display&&_t.contains(t.ownerDocument,t)&&"none"===_t.css(t,"display")},Yt=function(t,e,i,n){var r,s,o={};for(s in e)o[s]=t.style[s],t.style[s]=e[s];r=i.apply(t,n||[]);for(s in e)t.style[s]=o[s];return r},Vt={};_t.fn.extend({show:function(){return w(this,!0)},hide:function(){return w(this)},toggle:function(t){return"boolean"==typeof t?t?this.show():this.hide():this.each(function(){Ut(this)?_t(this).show():_t(this).hide()})}});var Kt=/^(?:checkbox|radio)$/i,Xt=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,Gt=/^$|\/(?:java|ecma)script/i,Zt={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Zt.optgroup=Zt.option,Zt.tbody=Zt.tfoot=Zt.colgroup=Zt.caption=Zt.thead,Zt.th=Zt.td;var Jt=/<|&#?\w+;/;!function(){var t=ot.createDocumentFragment(),e=t.appendChild(ot.createElement("div")),i=ot.createElement("input");i.setAttribute("type","radio"),i.setAttribute("checked","checked"),i.setAttribute("name","t"),e.appendChild(i),vt.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",vt.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var Qt=ot.documentElement,te=/^key/,ee=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ie=/^([^.]*)(?:\.(.+)|)/;_t.event={global:{},add:function(t,e,i,n,r){var s,o,a,l,u,c,h,d,p,f,g,m=Rt.get(t);if(m)for(i.handler&&(s=i,i=s.handler,r=s.selector),r&&_t.find.matchesSelector(Qt,r),i.guid||(i.guid=_t.guid++),(l=m.events)||(l=m.events={}),(o=m.handle)||(o=m.handle=function(e){return void 0!==_t&&_t.event.triggered!==e.type?_t.event.dispatch.apply(t,arguments):void 0}),e=(e||"").match(Pt)||[""],u=e.length;u--;)a=ie.exec(e[u])||[],p=g=a[1],f=(a[2]||"").split(".").sort(),p&&(h=_t.event.special[p]||{},p=(r?h.delegateType:h.bindType)||p,h=_t.event.special[p]||{},c=_t.extend({type:p,origType:g,data:n,handler:i,guid:i.guid,selector:r,needsContext:r&&_t.expr.match.needsContext.test(r),namespace:f.join(".")},s),(d=l[p])||(d=l[p]=[],d.delegateCount=0,h.setup&&!1!==h.setup.call(t,n,f,o)||t.addEventListener&&t.addEventListener(p,o)),h.add&&(h.add.call(t,c),c.handler.guid||(c.handler.guid=i.guid)),r?d.splice(d.delegateCount++,0,c):d.push(c),_t.event.global[p]=!0)},remove:function(t,e,i,n,r){var s,o,a,l,u,c,h,d,p,f,g,m=Rt.hasData(t)&&Rt.get(t);if(m&&(l=m.events)){for(e=(e||"").match(Pt)||[""],u=e.length;u--;)if(a=ie.exec(e[u])||[],p=g=a[1],f=(a[2]||"").split(".").sort(),p){for(h=_t.event.special[p]||{},p=(n?h.delegateType:h.bindType)||p,d=l[p]||[],a=a[2]&&new RegExp("(^|\\.)"+f.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=s=d.length;s--;)c=d[s],!r&&g!==c.origType||i&&i.guid!==c.guid||a&&!a.test(c.namespace)||n&&n!==c.selector&&("**"!==n||!c.selector)||(d.splice(s,1),c.selector&&d.delegateCount--,h.remove&&h.remove.call(t,c));o&&!d.length&&(h.teardown&&!1!==h.teardown.call(t,f,m.handle)||_t.removeEvent(t,p,m.handle),delete l[p])}else for(p in l)_t.event.remove(t,p+e[u],i,n,!0);_t.isEmptyObject(l)&&Rt.remove(t,"handle events")}},dispatch:function(t){var e,i,n,r,s,o,a=_t.event.fix(t),l=new Array(arguments.length),u=(Rt.get(this,"events")||{})[a.type]||[],c=_t.event.special[a.type]||{};for(l[0]=a,e=1;e<arguments.length;e++)l[e]=arguments[e];if(a.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,a)){for(o=_t.event.handlers.call(this,a,u),e=0;(r=o[e++])&&!a.isPropagationStopped();)for(a.currentTarget=r.elem,i=0;(s=r.handlers[i++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!a.rnamespace.test(s.namespace)||(a.handleObj=s,a.data=s.data,void 0!==(n=((_t.event.special[s.origType]||{}).handle||s.handler).apply(r.elem,l))&&!1===(a.result=n)&&(a.preventDefault(),a.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,a),a.result}},handlers:function(t,e){var i,n,r,s,o,a=[],l=e.delegateCount,u=t.target;if(l&&u.nodeType&&!("click"===t.type&&t.button>=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(s=[],o={},i=0;i<l;i++)n=e[i],r=n.selector+" ",void 0===o[r]&&(o[r]=n.needsContext?_t(r,this).index(u)>-1:_t.find(r,this,null,[u]).length),o[r]&&s.push(n);s.length&&a.push({elem:u,handlers:s})}return u=this,l<e.length&&a.push({elem:u,handlers:e.slice(l)}),a},addProp:function(t,e){Object.defineProperty(_t.Event.prototype,t,{enumerable:!0,configurable:!0,get:_t.isFunction(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(t){return t[_t.expando]?t:new _t.Event(t)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==S()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===S()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&l(this,"input"))return this.click(),!1},_default:function(t){return l(t.target,"a")}},beforeunload:{postDispatch:function(t){void 0!==t.result&&t.originalEvent&&(t.originalEvent.returnValue=t.result)}}}},_t.removeEvent=function(t,e,i){t.removeEventListener&&t.removeEventListener(e,i)},_t.Event=function(t,e){if(!(this instanceof _t.Event))return new _t.Event(t,e);t&&t.type?(this.originalEvent=t,this.type=t.type,this.isDefaultPrevented=t.defaultPrevented||void 0===t.defaultPrevented&&!1===t.returnValue?T:D,this.target=t.target&&3===t.target.nodeType?t.target.parentNode:t.target,this.currentTarget=t.currentTarget,this.relatedTarget=t.relatedTarget):this.type=t,e&&_t.extend(this,e),this.timeStamp=t&&t.timeStamp||_t.now(),this[_t.expando]=!0},_t.Event.prototype={constructor:_t.Event,isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D,isSimulated:!1,preventDefault:function(){var t=this.originalEvent;this.isDefaultPrevented=T,t&&!this.isSimulated&&t.preventDefault()},stopPropagation:function(){var t=this.originalEvent;this.isPropagationStopped=T,t&&!this.isSimulated&&t.stopPropagation()},stopImmediatePropagation:function(){var t=this.originalEvent;this.isImmediatePropagationStopped=T,t&&!this.isSimulated&&t.stopImmediatePropagation(),this.stopPropagation()}},_t.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(t){var e=t.button;return null==t.which&&te.test(t.type)?null!=t.charCode?t.charCode:t.keyCode:!t.which&&void 0!==e&&ee.test(t.type)?1&e?1:2&e?3:4&e?2:0:t.which}},_t.event.addProp),_t.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(t,e){_t.event.special[t]={delegateType:e,bindType:e,handle:function(t){var i,n=this,r=t.relatedTarget,s=t.handleObj;return r&&(r===n||_t.contains(n,r))||(t.type=s.origType,i=s.handler.apply(this,arguments),t.type=e),i}}}),_t.fn.extend({on:function(t,e,i,n){return A(this,t,e,i,n)},one:function(t,e,i,n){return A(this,t,e,i,n,1)},off:function(t,e,i){var n,r;if(t&&t.preventDefault&&t.handleObj)return n=t.handleObj,_t(t.delegateTarget).off(n.namespace?n.origType+"."+n.namespace:n.origType,n.selector,n.handler),this;if("object"==typeof t){for(r in t)this.off(r,e,t[r]);return this}return!1!==e&&"function"!=typeof e||(i=e,e=void 0),!1===i&&(i=D),this.each(function(){_t.event.remove(this,t,i,e)})}});var ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,re=/<script|<style|<link/i,se=/checked\s*(?:[^=]|=\s*.checked.)/i,oe=/^true\/(.*)/,ae=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;_t.extend({htmlPrefilter:function(t){return t.replace(ne,"<$1></$2>")},clone:function(t,e,i){var n,r,s,o,a=t.cloneNode(!0),l=_t.contains(t.ownerDocument,t);if(!(vt.noCloneChecked||1!==t.nodeType&&11!==t.nodeType||_t.isXMLDoc(t)))for(o=x(a),s=x(t),n=0,r=s.length;n<r;n++)P(s[n],o[n]);if(e)if(i)for(s=s||x(t),o=o||x(a),n=0,r=s.length;n<r;n++)O(s[n],o[n]);else O(t,a);return o=x(a,"script"),o.length>0&&C(o,!l&&x(t,"script")),a},cleanData:function(t){for(var e,i,n,r=_t.event.special,s=0;void 0!==(i=t[s]);s++)if(Ht(i)){if(e=i[Rt.expando]){if(e.events)for(n in e.events)r[n]?_t.event.remove(i,n):_t.removeEvent(i,n,e.handle);i[Rt.expando]=void 0}i[Lt.expando]&&(i[Lt.expando]=void 0)}}}),_t.fn.extend({detach:function(t){return M(this,t,!0)},remove:function(t){return M(this,t)},text:function(t){return jt(this,function(t){return void 0===t?_t.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)})},null,t,arguments.length)},append:function(){return N(this,arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){E(this,t).appendChild(t)}})},prepend:function(){return N(this,arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=E(this,t);e.insertBefore(t,e.firstChild)}})},before:function(){return N(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this)})},after:function(){return N(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)})},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(_t.cleanData(x(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map(function(){return _t.clone(this,t,e)})},html:function(t){return jt(this,function(t){var e=this[0]||{},i=0,n=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!re.test(t)&&!Zt[(Xt.exec(t)||["",""])[1].toLowerCase()]){t=_t.htmlPrefilter(t);try{for(;i<n;i++)e=this[i]||{},1===e.nodeType&&(_t.cleanData(x(e,!1)),e.innerHTML=t);e=0}catch(t){}}e&&this.empty().append(t)},null,t,arguments.length)},replaceWith:function(){var t=[];return N(this,arguments,function(e){var i=this.parentNode;_t.inArray(this,t)<0&&(_t.cleanData(x(this)),i&&i.replaceChild(e,this))},t)}}),_t.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(t,e){_t.fn[t]=function(t){for(var i,n=[],r=_t(t),s=r.length-1,o=0;o<=s;o++)i=o===s?this:this.clone(!0),_t(r[o])[e](i),ct.apply(n,i.get());return this.pushStack(n)}});var le=/^margin/,ue=new RegExp("^("+Wt+")(?!px)[a-z%]+$","i"),ce=function(t){var e=t.ownerDocument.defaultView;return e&&e.opener||(e=i),e.getComputedStyle(t)};!function(){function t(){if(a){a.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",a.innerHTML="",Qt.appendChild(o);var t=i.getComputedStyle(a);e="1%"!==t.top,s="2px"===t.marginLeft,n="4px"===t.width,a.style.marginRight="50%",r="4px"===t.marginRight,Qt.removeChild(o),a=null}}var e,n,r,s,o=ot.createElement("div"),a=ot.createElement("div");a.style&&(a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",vt.clearCloneStyle="content-box"===a.style.backgroundClip,o.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",o.appendChild(a),_t.extend(vt,{pixelPosition:function(){return t(),e},boxSizingReliable:function(){return t(),n},pixelMarginRight:function(){return t(),r},reliableMarginLeft:function(){return t(),s}}))}();var he=/^(none|table(?!-c[ea]).+)/,de=/^--/,pe={position:"absolute",visibility:"hidden",display:"block"},fe={letterSpacing:"0",fontWeight:"400"},ge=["Webkit","Moz","ms"],me=ot.createElement("div").style;_t.extend({cssHooks:{opacity:{get:function(t,e){if(e){var i=j(t,"opacity");return""===i?"1":i}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:"cssFloat"},style:function(t,e,i,n){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var r,s,o,a=_t.camelCase(e),l=de.test(e),u=t.style;if(l||(e=L(a)),o=_t.cssHooks[e]||_t.cssHooks[a],void 0===i)return o&&"get"in o&&void 0!==(r=o.get(t,!1,n))?r:u[e];s=typeof i,"string"===s&&(r=qt.exec(i))&&r[1]&&(i=y(t,e,r),s="number"),null!=i&&i===i&&("number"===s&&(i+=r&&r[3]||(_t.cssNumber[a]?"":"px")),vt.clearCloneStyle||""!==i||0!==e.indexOf("background")||(u[e]="inherit"),o&&"set"in o&&void 0===(i=o.set(t,i,n))||(l?u.setProperty(e,i):u[e]=i))}},css:function(t,e,i,n){var r,s,o,a=_t.camelCase(e);return de.test(e)||(e=L(a)),o=_t.cssHooks[e]||_t.cssHooks[a],o&&"get"in o&&(r=o.get(t,!0,i)),void 0===r&&(r=j(t,e,n)),"normal"===r&&e in fe&&(r=fe[e]),""===i||i?(s=parseFloat(r),!0===i||isFinite(s)?s||0:r):r}}),_t.each(["height","width"],function(t,e){_t.cssHooks[e]={get:function(t,i,n){if(i)return!he.test(_t.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?W(t,e,n):Yt(t,pe,function(){return W(t,e,n)})},set:function(t,i,n){var r,s=n&&ce(t),o=n&&z(t,e,n,"border-box"===_t.css(t,"boxSizing",!1,s),s);return o&&(r=qt.exec(i))&&"px"!==(r[3]||"px")&&(t.style[e]=i,i=_t.css(t,e)),F(t,i,o)}}}),_t.cssHooks.marginLeft=H(vt.reliableMarginLeft,function(t,e){if(e)return(parseFloat(j(t,"marginLeft"))||t.getBoundingClientRect().left-Yt(t,{marginLeft:0},function(){return t.getBoundingClientRect().left}))+"px"}),_t.each({margin:"",padding:"",border:"Width"},function(t,e){_t.cssHooks[t+e]={expand:function(i){for(var n=0,r={},s="string"==typeof i?i.split(" "):[i];n<4;n++)r[t+Bt[n]+e]=s[n]||s[n-2]||s[0];return r}},le.test(t)||(_t.cssHooks[t+e].set=F)}),_t.fn.extend({css:function(t,e){return jt(this,function(t,e,i){var n,r,s={},o=0;if(Array.isArray(e)){for(n=ce(t),r=e.length;o<r;o++)s[e[o]]=_t.css(t,e[o],!1,n);return s}return void 0!==i?_t.style(t,e,i):_t.css(t,e)},t,e,arguments.length>1)}}),_t.Tween=q,q.prototype={constructor:q,init:function(t,e,i,n,r,s){this.elem=t,this.prop=i,this.easing=r||_t.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=n,this.unit=s||(_t.cssNumber[i]?"":"px")},cur:function(){var t=q.propHooks[this.prop];return t&&t.get?t.get(this):q.propHooks._default.get(this)},run:function(t){var e,i=q.propHooks[this.prop];return this.options.duration?this.pos=e=_t.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),i&&i.set?i.set(this):q.propHooks._default.set(this),this}},q.prototype.init.prototype=q.prototype,q.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=_t.css(t.elem,t.prop,""),e&&"auto"!==e?e:0)},set:function(t){_t.fx.step[t.prop]?_t.fx.step[t.prop](t):1!==t.elem.nodeType||null==t.elem.style[_t.cssProps[t.prop]]&&!_t.cssHooks[t.prop]?t.elem[t.prop]=t.now:_t.style(t.elem,t.prop,t.now+t.unit)}}},q.propHooks.scrollTop=q.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},_t.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},_t.fx=q.prototype.init,_t.fx.step={};var ve,_e,ye=/^(?:toggle|show|hide)$/,be=/queueHooks$/;_t.Animation=_t.extend(G,{tweeners:{"*":[function(t,e){var i=this.createTween(t,e);return y(i.elem,t,qt.exec(e),i),i}]},tweener:function(t,e){_t.isFunction(t)?(e=t,t=["*"]):t=t.match(Pt);for(var i,n=0,r=t.length;n<r;n++)i=t[n],G.tweeners[i]=G.tweeners[i]||[],G.tweeners[i].unshift(e)},prefilters:[K],prefilter:function(t,e){e?G.prefilters.unshift(t):G.prefilters.push(t)}}),_t.speed=function(t,e,i){var n=t&&"object"==typeof t?_t.extend({},t):{complete:i||!i&&e||_t.isFunction(t)&&t,duration:t,easing:i&&e||e&&!_t.isFunction(e)&&e};return _t.fx.off?n.duration=0:"number"!=typeof n.duration&&(n.duration in _t.fx.speeds?n.duration=_t.fx.speeds[n.duration]:n.duration=_t.fx.speeds._default),null!=n.queue&&!0!==n.queue||(n.queue="fx"),n.old=n.complete,n.complete=function(){_t.isFunction(n.old)&&n.old.call(this),n.queue&&_t.dequeue(this,n.queue)},n},_t.fn.extend({fadeTo:function(t,e,i,n){return this.filter(Ut).css("opacity",0).show().end().animate({opacity:e},t,i,n)},animate:function(t,e,i,n){var r=_t.isEmptyObject(t),s=_t.speed(e,i,n),o=function(){var e=G(this,_t.extend({},t),s);(r||Rt.get(this,"finish"))&&e.stop(!0)};return o.finish=o,r||!1===s.queue?this.each(o):this.queue(s.queue,o)},stop:function(t,e,i){var n=function(t){var e=t.stop;delete t.stop,e(i)};return"string"!=typeof t&&(i=e,e=t,t=void 0),e&&!1!==t&&this.queue(t||"fx",[]),this.each(function(){var e=!0,r=null!=t&&t+"queueHooks",s=_t.timers,o=Rt.get(this);if(r)o[r]&&o[r].stop&&n(o[r]);else for(r in o)o[r]&&o[r].stop&&be.test(r)&&n(o[r]);for(r=s.length;r--;)s[r].elem!==this||null!=t&&s[r].queue!==t||(s[r].anim.stop(i),e=!1,s.splice(r,1));!e&&i||_t.dequeue(this,t)})},finish:function(t){return!1!==t&&(t=t||"fx"),this.each(function(){var e,i=Rt.get(this),n=i[t+"queue"],r=i[t+"queueHooks"],s=_t.timers,o=n?n.length:0;for(i.finish=!0,_t.queue(this,t,[]),r&&r.stop&&r.stop.call(this,!0),e=s.length;e--;)s[e].elem===this&&s[e].queue===t&&(s[e].anim.stop(!0),s.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete i.finish})}}),_t.each(["toggle","show","hide"],function(t,e){var i=_t.fn[e];_t.fn[e]=function(t,n,r){return null==t||"boolean"==typeof t?i.apply(this,arguments):this.animate(Y(e,!0),t,n,r)}}),_t.each({slideDown:Y("show"),slideUp:Y("hide"),slideToggle:Y("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(t,e){_t.fn[t]=function(t,i,n){return this.animate(e,t,i,n)}}),_t.timers=[],_t.fx.tick=function(){var t,e=0,i=_t.timers;for(ve=_t.now();e<i.length;e++)(t=i[e])()||i[e]!==t||i.splice(e--,1);i.length||_t.fx.stop(),ve=void 0},_t.fx.timer=function(t){_t.timers.push(t),_t.fx.start()},_t.fx.interval=13,_t.fx.start=function(){_e||(_e=!0,B())},_t.fx.stop=function(){_e=null},_t.fx.speeds={slow:600,fast:200,_default:400},_t.fn.delay=function(t,e){return t=_t.fx?_t.fx.speeds[t]||t:t,e=e||"fx",this.queue(e,function(e,n){var r=i.setTimeout(e,t);n.stop=function(){i.clearTimeout(r)}})},function(){var t=ot.createElement("input"),e=ot.createElement("select"),i=e.appendChild(ot.createElement("option"));t.type="checkbox",vt.checkOn=""!==t.value,vt.optSelected=i.selected,t=ot.createElement("input"),t.value="t",t.type="radio",vt.radioValue="t"===t.value}();var we,xe=_t.expr.attrHandle;_t.fn.extend({attr:function(t,e){return jt(this,_t.attr,t,e,arguments.length>1)},removeAttr:function(t){return this.each(function(){_t.removeAttr(this,t)})}}),_t.extend({attr:function(t,e,i){var n,r,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return void 0===t.getAttribute?_t.prop(t,e,i):(1===s&&_t.isXMLDoc(t)||(r=_t.attrHooks[e.toLowerCase()]||(_t.expr.match.bool.test(e)?we:void 0)),void 0!==i?null===i?void _t.removeAttr(t,e):r&&"set"in r&&void 0!==(n=r.set(t,i,e))?n:(t.setAttribute(e,i+""),i):r&&"get"in r&&null!==(n=r.get(t,e))?n:(n=_t.find.attr(t,e),null==n?void 0:n))},attrHooks:{type:{set:function(t,e){if(!vt.radioValue&&"radio"===e&&l(t,"input")){var i=t.value;return t.setAttribute("type",e),i&&(t.value=i),e}}}},removeAttr:function(t,e){var i,n=0,r=e&&e.match(Pt);if(r&&1===t.nodeType)for(;i=r[n++];)t.removeAttribute(i)}}),we={set:function(t,e,i){return!1===e?_t.removeAttr(t,i):t.setAttribute(i,i),i}},_t.each(_t.expr.match.bool.source.match(/\w+/g),function(t,e){var i=xe[e]||_t.find.attr;xe[e]=function(t,e,n){var r,s,o=e.toLowerCase();return n||(s=xe[o],xe[o]=r,r=null!=i(t,e,n)?o:null,xe[o]=s),r}});var Ce=/^(?:input|select|textarea|button)$/i,ke=/^(?:a|area)$/i;_t.fn.extend({prop:function(t,e){return jt(this,_t.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each(function(){delete this[_t.propFix[t]||t]})}}),_t.extend({prop:function(t,e,i){var n,r,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return 1===s&&_t.isXMLDoc(t)||(e=_t.propFix[e]||e,r=_t.propHooks[e]),void 0!==i?r&&"set"in r&&void 0!==(n=r.set(t,i,e))?n:t[e]=i:r&&"get"in r&&null!==(n=r.get(t,e))?n:t[e]},propHooks:{tabIndex:{get:function(t){var e=_t.find.attr(t,"tabindex");return e?parseInt(e,10):Ce.test(t.nodeName)||ke.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),vt.optSelected||(_t.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),_t.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_t.propFix[this.toLowerCase()]=this}),_t.fn.extend({addClass:function(t){var e,i,n,r,s,o,a,l=0;if(_t.isFunction(t))return this.each(function(e){_t(this).addClass(t.call(this,e,J(this)))});if("string"==typeof t&&t)for(e=t.match(Pt)||[];i=this[l++];)if(r=J(i),n=1===i.nodeType&&" "+Z(r)+" "){for(o=0;s=e[o++];)n.indexOf(" "+s+" ")<0&&(n+=s+" ");a=Z(n),r!==a&&i.setAttribute("class",a)}return this},removeClass:function(t){var e,i,n,r,s,o,a,l=0;if(_t.isFunction(t))return this.each(function(e){_t(this).removeClass(t.call(this,e,J(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof t&&t)for(e=t.match(Pt)||[];i=this[l++];)if(r=J(i),n=1===i.nodeType&&" "+Z(r)+" "){for(o=0;s=e[o++];)for(;n.indexOf(" "+s+" ")>-1;)n=n.replace(" "+s+" "," ");a=Z(n),r!==a&&i.setAttribute("class",a)}return this},toggleClass:function(t,e){var i=typeof t;return"boolean"==typeof e&&"string"===i?e?this.addClass(t):this.removeClass(t):_t.isFunction(t)?this.each(function(i){_t(this).toggleClass(t.call(this,i,J(this),e),e)}):this.each(function(){var e,n,r,s;if("string"===i)for(n=0,r=_t(this),s=t.match(Pt)||[];e=s[n++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==i||(e=J(this),e&&Rt.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Rt.get(this,"__className__")||""))})},hasClass:function(t){var e,i,n=0;for(e=" "+t+" ";i=this[n++];)if(1===i.nodeType&&(" "+Z(J(i))+" ").indexOf(e)>-1)return!0;return!1}});var Te=/\r/g;_t.fn.extend({val:function(t){var e,i,n,r=this[0];{if(arguments.length)return n=_t.isFunction(t),this.each(function(i){var r;1===this.nodeType&&(r=n?t.call(this,i,_t(this).val()):t,null==r?r="":"number"==typeof r?r+="":Array.isArray(r)&&(r=_t.map(r,function(t){return null==t?"":t+""})),(e=_t.valHooks[this.type]||_t.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,r,"value")||(this.value=r))});if(r)return(e=_t.valHooks[r.type]||_t.valHooks[r.nodeName.toLowerCase()])&&"get"in e&&void 0!==(i=e.get(r,"value"))?i:(i=r.value,"string"==typeof i?i.replace(Te,""):null==i?"":i)}}}),_t.extend({valHooks:{option:{get:function(t){var e=_t.find.attr(t,"value");return null!=e?e:Z(_t.text(t))}},select:{get:function(t){var e,i,n,r=t.options,s=t.selectedIndex,o="select-one"===t.type,a=o?null:[],u=o?s+1:r.length;for(n=s<0?u:o?s:0;n<u;n++)if(i=r[n],(i.selected||n===s)&&!i.disabled&&(!i.parentNode.disabled||!l(i.parentNode,"optgroup"))){if(e=_t(i).val(),o)return e;a.push(e)}return a},set:function(t,e){for(var i,n,r=t.options,s=_t.makeArray(e),o=r.length;o--;)n=r[o],(n.selected=_t.inArray(_t.valHooks.option.get(n),s)>-1)&&(i=!0);return i||(t.selectedIndex=-1),s}}}}),_t.each(["radio","checkbox"],function(){_t.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=_t.inArray(_t(t).val(),e)>-1}},vt.checkOn||(_t.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})});var De=/^(?:focusinfocus|focusoutblur)$/;_t.extend(_t.event,{trigger:function(t,e,n,r){var s,o,a,l,u,c,h,d=[n||ot],p=ft.call(t,"type")?t.type:t,f=ft.call(t,"namespace")?t.namespace.split("."):[];if(o=a=n=n||ot,3!==n.nodeType&&8!==n.nodeType&&!De.test(p+_t.event.triggered)&&(p.indexOf(".")>-1&&(f=p.split("."),p=f.shift(),f.sort()),u=p.indexOf(":")<0&&"on"+p,t=t[_t.expando]?t:new _t.Event(p,"object"==typeof t&&t),t.isTrigger=r?2:3,t.namespace=f.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+f.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:_t.makeArray(e,[t]),h=_t.event.special[p]||{},r||!h.trigger||!1!==h.trigger.apply(n,e))){if(!r&&!h.noBubble&&!_t.isWindow(n)){for(l=h.delegateType||p,De.test(l+p)||(o=o.parentNode);o;o=o.parentNode)d.push(o),a=o;a===(n.ownerDocument||ot)&&d.push(a.defaultView||a.parentWindow||i)}for(s=0;(o=d[s++])&&!t.isPropagationStopped();)t.type=s>1?l:h.bindType||p,c=(Rt.get(o,"events")||{})[t.type]&&Rt.get(o,"handle"),c&&c.apply(o,e),(c=u&&o[u])&&c.apply&&Ht(o)&&(t.result=c.apply(o,e),!1===t.result&&t.preventDefault());return t.type=p,r||t.isDefaultPrevented()||h._default&&!1!==h._default.apply(d.pop(),e)||!Ht(n)||u&&_t.isFunction(n[p])&&!_t.isWindow(n)&&(a=n[u],a&&(n[u]=null),_t.event.triggered=p,n[p](),_t.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,i){var n=_t.extend(new _t.Event,i,{type:t,isSimulated:!0});_t.event.trigger(n,null,e)}}),_t.fn.extend({trigger:function(t,e){return this.each(function(){_t.event.trigger(t,e,this)})},triggerHandler:function(t,e){var i=this[0];if(i)return _t.event.trigger(t,e,i,!0)}}),_t.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(t,e){_t.fn[e]=function(t,i){return arguments.length>0?this.on(e,null,t,i):this.trigger(e)}}),_t.fn.extend({hover:function(t,e){return this.mouseenter(t).mouseleave(e||t)}}),vt.focusin="onfocusin"in i,vt.focusin||_t.each({focus:"focusin",blur:"focusout"},function(t,e){var i=function(t){_t.event.simulate(e,t.target,_t.event.fix(t))};_t.event.special[e]={setup:function(){var n=this.ownerDocument||this,r=Rt.access(n,e);r||n.addEventListener(t,i,!0),Rt.access(n,e,(r||0)+1)},teardown:function(){var n=this.ownerDocument||this,r=Rt.access(n,e)-1;r?Rt.access(n,e,r):(n.removeEventListener(t,i,!0),Rt.remove(n,e))}}});var Se=i.location,Ae=_t.now(),Ee=/\?/;_t.parseXML=function(t){var e;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){e=void 0}return e&&!e.getElementsByTagName("parsererror").length||_t.error("Invalid XML: "+t),e};var Ie=/\[\]$/,$e=/\r?\n/g,Oe=/^(?:submit|button|image|reset|file)$/i,Pe=/^(?:input|select|textarea|keygen)/i;_t.param=function(t,e){var i,n=[],r=function(t,e){var i=_t.isFunction(e)?e():e;n[n.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==i?"":i)};if(Array.isArray(t)||t.jquery&&!_t.isPlainObject(t))_t.each(t,function(){r(this.name,this.value)});else for(i in t)Q(i,t[i],e,r);return n.join("&")},_t.fn.extend({serialize:function(){return _t.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var t=_t.prop(this,"elements");return t?_t.makeArray(t):this}).filter(function(){var t=this.type;return this.name&&!_t(this).is(":disabled")&&Pe.test(this.nodeName)&&!Oe.test(t)&&(this.checked||!Kt.test(t))}).map(function(t,e){var i=_t(this).val();return null==i?null:Array.isArray(i)?_t.map(i,function(t){return{name:e.name,value:t.replace($e,"\r\n")}}):{name:e.name,value:i.replace($e,"\r\n")}}).get()}});var Ne=/%20/g,Me=/#.*$/,je=/([?&])_=[^&]*/,He=/^(.*?):[ \t]*([^\r\n]*)$/gm,Re=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Le=/^(?:GET|HEAD)$/,Fe=/^\/\//,ze={},We={},qe="*/".concat("*"),Be=ot.createElement("a");Be.href=Se.href,_t.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:Re.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":_t.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?it(it(t,_t.ajaxSettings),e):it(_t.ajaxSettings,t)},ajaxPrefilter:tt(ze),ajaxTransport:tt(We),ajax:function(t,e){function n(t,e,n,a){var u,d,p,b,w,x=e;c||(c=!0,l&&i.clearTimeout(l),r=void 0,o=a||"",C.readyState=t>0?4:0,u=t>=200&&t<300||304===t,n&&(b=nt(f,C,n)),b=rt(f,b,C,u),u?(f.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(_t.lastModified[s]=w),(w=C.getResponseHeader("etag"))&&(_t.etag[s]=w)),204===t||"HEAD"===f.type?x="nocontent":304===t?x="notmodified":(x=b.state,d=b.data,p=b.error,u=!p)):(p=x,!t&&x||(x="error",t<0&&(t=0))),C.status=t,C.statusText=(e||x)+"",u?v.resolveWith(g,[d,x,C]):v.rejectWith(g,[C,x,p]),C.statusCode(y),y=void 0,h&&m.trigger(u?"ajaxSuccess":"ajaxError",[C,f,u?d:p]),_.fireWith(g,[C,x]),h&&(m.trigger("ajaxComplete",[C,f]),--_t.active||_t.event.trigger("ajaxStop")))}"object"==typeof t&&(e=t,t=void 0),e=e||{};var r,s,o,a,l,u,c,h,d,p,f=_t.ajaxSetup({},e),g=f.context||f,m=f.context&&(g.nodeType||g.jquery)?_t(g):_t.event,v=_t.Deferred(),_=_t.Callbacks("once memory"),y=f.statusCode||{},b={},w={},x="canceled",C={readyState:0,getResponseHeader:function(t){var e;if(c){if(!a)for(a={};e=He.exec(o);)a[e[1].toLowerCase()]=e[2];e=a[t.toLowerCase()]}return null==e?null:e},getAllResponseHeaders:function(){return c?o:null},setRequestHeader:function(t,e){return null==c&&(t=w[t.toLowerCase()]=w[t.toLowerCase()]||t,b[t]=e),this},overrideMimeType:function(t){return null==c&&(f.mimeType=t),this},statusCode:function(t){var e;if(t)if(c)C.always(t[C.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||x;return r&&r.abort(e),n(0,e),this}};if(v.promise(C),f.url=((t||f.url||Se.href)+"").replace(Fe,Se.protocol+"//"),f.type=e.method||e.type||f.method||f.type,f.dataTypes=(f.dataType||"*").toLowerCase().match(Pt)||[""],null==f.crossDomain){u=ot.createElement("a");try{u.href=f.url,u.href=u.href,f.crossDomain=Be.protocol+"//"+Be.host!=u.protocol+"//"+u.host}catch(t){f.crossDomain=!0}}if(f.data&&f.processData&&"string"!=typeof f.data&&(f.data=_t.param(f.data,f.traditional)),et(ze,f,e,C),c)return C;h=_t.event&&f.global,h&&0==_t.active++&&_t.event.trigger("ajaxStart"),f.type=f.type.toUpperCase(),f.hasContent=!Le.test(f.type),s=f.url.replace(Me,""),f.hasContent?f.data&&f.processData&&0===(f.contentType||"").indexOf("application/x-www-form-urlencoded")&&(f.data=f.data.replace(Ne,"+")):(p=f.url.slice(s.length),f.data&&(s+=(Ee.test(s)?"&":"?")+f.data,delete f.data),!1===f.cache&&(s=s.replace(je,"$1"),p=(Ee.test(s)?"&":"?")+"_="+Ae+++p),f.url=s+p),f.ifModified&&(_t.lastModified[s]&&C.setRequestHeader("If-Modified-Since",_t.lastModified[s]),_t.etag[s]&&C.setRequestHeader("If-None-Match",_t.etag[s])),(f.data&&f.hasContent&&!1!==f.contentType||e.contentType)&&C.setRequestHeader("Content-Type",f.contentType),C.setRequestHeader("Accept",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+("*"!==f.dataTypes[0]?", "+qe+"; q=0.01":""):f.accepts["*"]);for(d in f.headers)C.setRequestHeader(d,f.headers[d]);if(f.beforeSend&&(!1===f.beforeSend.call(g,C,f)||c))return C.abort();if(x="abort",_.add(f.complete),C.done(f.success),C.fail(f.error),r=et(We,f,e,C)){if(C.readyState=1,h&&m.trigger("ajaxSend",[C,f]),c)return C;f.async&&f.timeout>0&&(l=i.setTimeout(function(){C.abort("timeout")},f.timeout));try{c=!1,r.send(b,n)}catch(t){if(c)throw t;n(-1,t)}}else n(-1,"No Transport");return C},getJSON:function(t,e,i){return _t.get(t,e,i,"json")},getScript:function(t,e){return _t.get(t,void 0,e,"script")}}),_t.each(["get","post"],function(t,e){_t[e]=function(t,i,n,r){return _t.isFunction(i)&&(r=r||n,n=i,i=void 0),_t.ajax(_t.extend({url:t,type:e,dataType:r,data:i,success:n},_t.isPlainObject(t)&&t))}}),_t._evalUrl=function(t){return _t.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},_t.fn.extend({wrapAll:function(t){var e;return this[0]&&(_t.isFunction(t)&&(t=t.call(this[0])),e=_t(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t}).append(this)),this},wrapInner:function(t){return _t.isFunction(t)?this.each(function(e){_t(this).wrapInner(t.call(this,e))}):this.each(function(){var e=_t(this),i=e.contents();i.length?i.wrapAll(t):e.append(t)})},wrap:function(t){var e=_t.isFunction(t);return this.each(function(i){_t(this).wrapAll(e?t.call(this,i):t)})},unwrap:function(t){return this.parent(t).not("body").each(function(){_t(this).replaceWith(this.childNodes)}),this}}),_t.expr.pseudos.hidden=function(t){return!_t.expr.pseudos.visible(t)},_t.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},_t.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ue={0:200,1223:204},Ye=_t.ajaxSettings.xhr();vt.cors=!!Ye&&"withCredentials"in Ye,vt.ajax=Ye=!!Ye,_t.ajaxTransport(function(t){var e,n;if(vt.cors||Ye&&!t.crossDomain)return{send:function(r,s){var o,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)a.setRequestHeader(o,r[o]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?s(0,"error"):s(a.status,a.statusText):s(Ue[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout(function(){e&&n()})},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}}),_t.ajaxPrefilter(function(t){t.crossDomain&&(t.contents.script=!1)}),_t.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return _t.globalEval(t),t}}}),_t.ajaxPrefilter("script",function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")}),_t.ajaxTransport("script",function(t){if(t.crossDomain){var e,i;return{send:function(n,r){e=_t("<script>").prop({charset:t.scriptCharset,src:t.url}).on("load error",i=function(t){e.remove(),i=null,t&&r("error"===t.type?404:200,t.type)}),ot.head.appendChild(e[0])},abort:function(){i&&i()}}}});var Ve=[],Ke=/(=)\?(?=&|$)|\?\?/;_t.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var t=Ve.pop()||_t.expando+"_"+Ae++;return this[t]=!0,t}}),_t.ajaxPrefilter("json jsonp",function(t,e,n){var r,s,o,a=!1!==t.jsonp&&(Ke.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ke.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return r=t.jsonpCallback=_t.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ke,"$1"+r):!1!==t.jsonp&&(t.url+=(Ee.test(t.url)?"&":"?")+t.jsonp+"="+r),t.converters["script json"]=function(){return o||_t.error(r+" was not called"),o[0]},t.dataTypes[0]="json",s=i[r],i[r]=function(){o=arguments},n.always(function(){void 0===s?_t(i).removeProp(r):i[r]=s,t[r]&&(t.jsonpCallback=e.jsonpCallback,Ve.push(r)),o&&_t.isFunction(s)&&s(o[0]),o=s=void 0}),"script"}),vt.createHTMLDocument=function(){var t=ot.implementation.createHTMLDocument("").body;return t.innerHTML="<form></form><form></form>",2===t.childNodes.length}(),_t.parseHTML=function(t,e,i){if("string"!=typeof t)return[];"boolean"==typeof e&&(i=e,e=!1);var n,r,s;return e||(vt.createHTMLDocument?(e=ot.implementation.createHTMLDocument(""),n=e.createElement("base"),n.href=ot.location.href,e.head.appendChild(n)):e=ot),r=St.exec(t),s=!i&&[],r?[e.createElement(r[1])]:(r=k([t],e,s),s&&s.length&&_t(s).remove(),_t.merge([],r.childNodes))},_t.fn.load=function(t,e,i){var n,r,s,o=this,a=t.indexOf(" ");return a>-1&&(n=Z(t.slice(a)),t=t.slice(0,a)),_t.isFunction(e)?(i=e,e=void 0):e&&"object"==typeof e&&(r="POST"),o.length>0&&_t.ajax({url:t,type:r||"GET",dataType:"html",data:e}).done(function(t){s=arguments,o.html(n?_t("<div>").append(_t.parseHTML(t)).find(n):t)}).always(i&&function(t,e){o.each(function(){i.apply(this,s||[t.responseText,e,t])})}),this},_t.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(t,e){_t.fn[e]=function(t){return this.on(e,t)}}),_t.expr.pseudos.animated=function(t){return _t.grep(_t.timers,function(e){return t===e.elem}).length},_t.offset={setOffset:function(t,e,i){var n,r,s,o,a,l,u,c=_t.css(t,"position"),h=_t(t),d={};"static"===c&&(t.style.position="relative"),a=h.offset(),s=_t.css(t,"top"),l=_t.css(t,"left"),u=("absolute"===c||"fixed"===c)&&(s+l).indexOf("auto")>-1,u?(n=h.position(),o=n.top,r=n.left):(o=parseFloat(s)||0,r=parseFloat(l)||0),_t.isFunction(e)&&(e=e.call(t,i,_t.extend({},a))),null!=e.top&&(d.top=e.top-a.top+o),null!=e.left&&(d.left=e.left-a.left+r),"using"in e?e.using.call(t,d):h.css(d)}},_t.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){_t.offset.setOffset(this,t,e)});var e,i,n,r,s=this[0];if(s)return s.getClientRects().length?(n=s.getBoundingClientRect(),e=s.ownerDocument,i=e.documentElement,r=e.defaultView,{top:n.top+r.pageYOffset-i.clientTop,left:n.left+r.pageXOffset-i.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var t,e,i=this[0],n={top:0,left:0};return"fixed"===_t.css(i,"position")?e=i.getBoundingClientRect():(t=this.offsetParent(),e=this.offset(),l(t[0],"html")||(n=t.offset()),n={top:n.top+_t.css(t[0],"borderTopWidth",!0),left:n.left+_t.css(t[0],"borderLeftWidth",!0)}),{top:e.top-n.top-_t.css(i,"marginTop",!0),left:e.left-n.left-_t.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent;t&&"static"===_t.css(t,"position");)t=t.offsetParent;return t||Qt})}}),_t.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,e){var i="pageYOffset"===e;_t.fn[t]=function(n){return jt(this,function(t,n,r){var s;if(_t.isWindow(t)?s=t:9===t.nodeType&&(s=t.defaultView),void 0===r)return s?s[e]:t[n];s?s.scrollTo(i?s.pageXOffset:r,i?r:s.pageYOffset):t[n]=r},t,n,arguments.length)}}),_t.each(["top","left"],function(t,e){_t.cssHooks[e]=H(vt.pixelPosition,function(t,i){if(i)return i=j(t,e),ue.test(i)?_t(t).position()[e]+"px":i})}),_t.each({Height:"height",Width:"width"},function(t,e){_t.each({padding:"inner"+t,content:e,"":"outer"+t},function(i,n){_t.fn[n]=function(r,s){var o=arguments.length&&(i||"boolean"!=typeof r),a=i||(!0===r||!0===s?"margin":"border");return jt(this,function(e,i,r){var s;return _t.isWindow(e)?0===n.indexOf("outer")?e["inner"+t]:e.document.documentElement["client"+t]:9===e.nodeType?(s=e.documentElement,Math.max(e.body["scroll"+t],s["scroll"+t],e.body["offset"+t],s["offset"+t],s["client"+t])):void 0===r?_t.css(e,i,a):_t.style(e,i,r,a)},e,o?r:void 0,o)}})}),_t.fn.extend({bind:function(t,e,i){return this.on(t,null,e,i)},unbind:function(t,e){return this.off(t,null,e)},delegate:function(t,e,i,n){return this.on(e,t,i,n)},undelegate:function(t,e,i){return 1===arguments.length?this.off(t,"**"):this.off(e,t||"**",i)}}),_t.holdReady=function(t){t?_t.readyWait++:_t.ready(!0)},_t.isArray=Array.isArray,_t.parseJSON=JSON.parse,_t.nodeName=l,n=[],void 0!==(r=function(){return _t}.apply(e,n))&&(t.exports=r);var Xe=i.jQuery,Ge=i.$;return _t.noConflict=function(t){return i.$===_t&&(i.$=Ge),t&&i.jQuery===_t&&(i.jQuery=Xe),_t},s||(i.jQuery=i.$=_t),_t})},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){i(29),i(18),Vue.component("passport-clients",i(39)),Vue.component("passport-authorized-clients",i(38)),Vue.component("passport-personal-access-tokens",i(40)),Vue.component("importer",i(37))},,,,,function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={props:["alertType","title"],computed:{alertClassName:function(){return"alert-"+this.alertType}},methods:{hideEvent:function(){this.$emit("hide")}}}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={props:["errors"]}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={props:["file"],data:function(){return{activeFile:this.file,processDetail:!1,statusText:null,options:{importType:this.file.import_type,update:!1,importTypes:[{id:"asset",text:"Assets"},{id:"accessory",text:"Accessories"},{id:"consumable",text:"Consumables"},{id:"component",text:"Components"},{id:"license",text:"Licenses"},{id:"user",text:"Users"}],statusText:null},columnOptions:{general:[{id:"category",text:"Category"},{id:"company",text:"Company"},{id:"checkout_to",text:"Checked out to"},{id:"email",text:"Email"},{id:"first_name",text:"First Name"},{id:"item_name",text:"Item Name"},{id:"last_name",text:"Last Name"},{id:"location",text:"Location"},{id:"maintained",text:"Maintained"},{id:"manufacturer",text:"Manufacturer"},{id:"notes",text:"Notes"},{id:"order_number",text:"Order Number"},{id:"purchase_cost",text:"Purchase Cost"},{id:"purchase_date",text:"Purchase Date"},{id:"quantity",text:"Quantity"},{id:"requestable",text:"Requestable"},{id:"serial",text:"Serial Number"},{id:"supplier",text:"Supplier"},{id:"username",text:"Username"}],assets:[{id:"asset_tag",text:"Asset Tag"},{id:"asset_model",text:"Model Name"},{id:"image",text:"Image Filename"},{id:"model_number",text:"Model Number"},{id:"name",text:"Full Name"},{id:"status",text:"Status"},{id:"warranty_months",text:"Warranty Months"}],licenses:[{id:"expiration_date",text:"Expiration Date"},{id:"license_email",text:"Licensed To Email"},{id:"license_name",text:"Licensed To Name"},{id:"purchase_order",text:"Purchase Order"},{id:"reassignable",text:"Reassignable"},{id:"seats",text:"Seats"}],users:[{id:"employee_num",text:"Employee Number"},{id:"jobtitle",text:"Job Title"},{id:"phone_number",text:"Phone Number"}],customFields:[]},columnMappings:this.file.field_map||{},activeColumn:null}},created:function(){this.fetchCustomFields(),window.eventHub.$on("showDetails",this.toggleExtendedDisplay),this.populateSelect2ActiveItems()},computed:{columns:function(){switch(this.options.importType){case"asset":return this.columnOptions.general.concat(this.columnOptions.assets).concat(this.columnOptions.customFields);case"license":return this.columnOptions.general.concat(this.columnOptions.licenses);case"user":return this.columnOptions.general.concat(this.columnOptions.users)}return this.columnOptions.general}},methods:{fetchCustomFields:function(){var t=this;this.$http.get("/api/v1/fields").then(function(e){var i=e.data;i=i.rows,i.forEach(function(e){t.columnOptions.customFields.push({id:e.db_column_name,text:e.name})})})},postSave:function(){var t=this;this.statusText="Processing...",this.$http.post("/api/v1/imports/process/"+this.file.id,{"import-update":this.options.update,"import-type":this.options.importType,"column-mappings":this.columnMappings}).then(function(e){t.statusText="Success... Redirecting.",window.location.href=e.body.messages.redirect_url},function(e){"import-errors"==e.body.status?(window.eventHub.$emit("importErrors",e.body.messages),t.statusText="Error"):t.$emit("alert",{message:e.body.messages,type:"danger",visible:!0}),t.displayImportModal=!1})},populateSelect2ActiveItems:function(){if(null==this.file.field_map){for(var t=0;t<this.file.header_row.length;t++)this.$set(this.columnMappings,this.file.header_row[t],null);for(var e=0;e<this.columns.length;e++){var i=this.columns[e],n=this.file.header_row.indexOf(i.text);-1!=n&&this.$set(this.columnMappings,this.file.header_row[n],i.id)}}},toggleExtendedDisplay:function(t){t==this.file.id&&(this.processDetail=!this.processDetail)},updateModel:function(t,e){this.columnMappings[t]=e}},components:{select2:i(41)}}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),i(19),e.default={data:function(){return{files:[],displayImportModal:!1,activeFile:null,alert:{type:null,message:null,visible:!1},importErrors:null,progress:{currentClass:"progress-bar-warning",currentPercent:"0",statusText:"",visible:!1}}},mounted:function(){window.eventHub.$on("importErrors",this.updateImportErrors),this.fetchFiles();var t=this;$("#fileupload").fileupload({dataType:"json",done:function(e,i){t.progress.currentClass="progress-bar-success",t.progress.statusText="Success!",t.files=i.result.files.concat(t.files)},add:function(e,i){i.headers={"X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":Laravel.csrfToken},i.process().done(function(){i.submit()}),t.progress.visible=!0},progress:function(e,i){var n=parseInt((i.loaded,i.total,10));t.progress.currentPercent=n,t.progress.statusText=n+"% Complete"},fail:function(e,i){t.progress.currentClass="progress-bar-danger",t.progress.statusText=i.jqXHR.responseJSON.messages}})},methods:{fetchFiles:function(){var t=this;this.$http.get("/api/v1/imports").then(function(e){var i=e.data;return t.files=i},function(e){t.alert.type="danger",t.alert.visible=!0,t.alert.message="Something went wrong fetching files..."})},deleteFile:function(t,e){var i=this;this.$http.delete("/api/v1/imports/"+t.id).then(function(t){return i.files.splice(e,1)},function(t){i.alert.type="danger",i.alert.visible=!0,i.alert.message=t.body.messages})},toggleEvent:function(t){window.eventHub.$emit("showDetails",t)},updateAlert:function(t){this.alert=t},updateImportErrors:function(t){this.importErrors=t}},computed:{progressWidth:function(){return"width: "+10*this.progress.currentPercent+"%"}},components:{alert:i(34),errors:i(35),importFile:i(36)}}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={data:function(){return{tokens:[]}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens()},getTokens:function(){var t=this;this.$http.get("/oauth/tokens").then(function(e){t.tokens=e.data})},revoke:function(t){var e=this;this.$http.delete("/oauth/tokens/"+t.id).then(function(t){e.getTokens()})}}}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};e.default={data:function(){return{clients:[],createForm:{errors:[],name:"",redirect:""},editForm:{errors:[],name:"",redirect:""}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getClients(),$("#modal-create-client").on("shown.bs.modal",function(){$("#create-client-name").focus()}),$("#modal-edit-client").on("shown.bs.modal",function(){$("#edit-client-name").focus()})},getClients:function(){var t=this;this.$http.get("/oauth/clients").then(function(e){t.clients=e.data})},showCreateClientForm:function(){$("#modal-create-client").modal("show")},store:function(){this.persistClient("post","/oauth/clients",this.createForm,"#modal-create-client")},edit:function(t){this.editForm.id=t.id,this.editForm.name=t.name,this.editForm.redirect=t.redirect,$("#modal-edit-client").modal("show")},update:function(){this.persistClient("put","/oauth/clients/"+this.editForm.id,this.editForm,"#modal-edit-client")},persistClient:function(t,e,i,r){var s=this;i.errors=[],this.$http[t](e,i).then(function(t){s.getClients(),i.name="",i.redirect="",i.errors=[],$(r).modal("hide")}).catch(function(t){"object"===n(t.data)?i.errors=_.flatten(_.toArray(t.data)):i.errors=["Something went wrong. Please try again."]})},destroy:function(t){var e=this;this.$http.delete("/oauth/clients/"+t.id).then(function(t){e.getClients()})}}}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};e.default={data:function(){return{accessToken:null,tokens:[],scopes:[],form:{name:"",scopes:[],errors:[]}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens(),this.getScopes(),$("#modal-create-token").on("shown.bs.modal",function(){$("#create-token-name").focus()})},getTokens:function(){var t=this;this.$http.get("/oauth/personal-access-tokens").then(function(e){t.tokens=e.data})},getScopes:function(){var t=this;this.$http.get("/oauth/scopes").then(function(e){t.scopes=e.data})},showCreateTokenForm:function(){$("#modal-create-token").modal("show")},store:function(){var t=this;this.accessToken=null,this.form.errors=[],this.$http.post("/oauth/personal-access-tokens",this.form).then(function(e){t.form.name="",t.form.scopes=[],t.form.errors=[],t.tokens.push(e.data.token),t.showAccessToken(e.data.accessToken)}).catch(function(e){"object"===n(e.data)?t.form.errors=_.flatten(_.toArray(e.data)):t.form.errors=["Something went wrong. Please try again."]})},toggleScope:function(t){this.scopeIsAssigned(t)?this.form.scopes=_.reject(this.form.scopes,function(e){return e==t}):this.form.scopes.push(t)},scopeIsAssigned:function(t){return _.indexOf(this.form.scopes,t)>=0},showAccessToken:function(t){$("#modal-create-token").modal("hide"),this.accessToken=t,$("#modal-access-token").modal("show")},revoke:function(t){var e=this;this.$http.delete("/oauth/personal-access-tokens/"+t.id).then(function(t){e.getTokens()})}}}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),i(33),e.default={props:["options","value"],mounted:function(){var t=this;$(this.$el).select2({data:this.options}).on("change",function(){t.$emit("input",this.value)}).val(this.value).trigger("change")},watch:{value:function(t){$(this.$el).val(t)},options:function(t){var e=this;$(this.$el).select2("destroy").empty().select2({data:t}).on("change",function(){e.$emit("input",this.value)}).val(this.value).trigger("change")},destroyed:function(){$(this.$el).off().select2("destroy")}}}},function(t,e,i){window._=i(32),window.$=window.jQuery=i(3),i(20),window.Vue=i(59),window.eventHub=new Vue,i(49),Vue.http.interceptors.push(function(t,e){t.headers.set("X-CSRF-TOKEN",Laravel.csrfToken),e()})},function(t,e,i){var n,r,s;!function(o){"use strict";r=[i(3),i(31)],n=o,void 0!==(s="function"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){"use strict";function e(e){var i="dragover"===e;return function(n){n.dataTransfer=n.originalEvent&&n.originalEvent.dataTransfer;var r=n.dataTransfer;r&&-1!==t.inArray("Files",r.types)&&!1!==this._trigger(e,t.Event(e,{delegatedEvent:n}))&&(n.preventDefault(),i&&(r.dropEffect="copy"))}}t.support.fileInput=!(new RegExp("(Android (1\\.[0156]|2\\.[01]))|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)|(w(eb)?OSBrowser)|(webOS)|(Kindle/(1\\.0|2\\.[05]|3\\.0))").test(window.navigator.userAgent)||t('<input type="file">').prop("disabled")),t.support.xhrFileUpload=!(!window.ProgressEvent||!window.FileReader),t.support.xhrFormDataFileUpload=!!window.FormData,t.support.blobSlice=window.Blob&&(Blob.prototype.slice||Blob.prototype.webkitSlice||Blob.prototype.mozSlice),t.widget("blueimp.fileupload",{options:{dropZone:t(document),pasteZone:void 0,fileInput:void 0,replaceFileInput:!0,paramName:void 0,singleFileUploads:!0,limitMultiFileUploads:void 0,limitMultiFileUploadSize:void 0,limitMultiFileUploadSizeOverhead:512,sequentialUploads:!1,limitConcurrentUploads:void 0,forceIframeTransport:!1,redirect:void 0,redirectParamName:void 0,postMessage:void 0,multipart:!0,maxChunkSize:void 0,uploadedBytes:void 0,recalculateProgress:!0,progressInterval:100,bitrateInterval:500,autoUpload:!0,messages:{uploadedBytes:"Uploaded bytes exceed file size"},i18n:function(e,i){return e=this.messages[e]||e.toString(),i&&t.each(i,function(t,i){e=e.replace("{"+t+"}",i)}),e},formData:function(t){return t.serializeArray()},add:function(e,i){if(e.isDefaultPrevented())return!1;(i.autoUpload||!1!==i.autoUpload&&t(this).fileupload("option","autoUpload"))&&i.process().done(function(){i.submit()})},processData:!1,contentType:!1,cache:!1,timeout:0},_specialOptions:["fileInput","dropZone","pasteZone","multipart","forceIframeTransport"],_blobSlice:t.support.blobSlice&&function(){return(this.slice||this.webkitSlice||this.mozSlice).apply(this,arguments)},_BitrateTimer:function(){this.timestamp=Date.now?Date.now():(new Date).getTime(),this.loaded=0,this.bitrate=0,this.getBitrate=function(t,e,i){var n=t-this.timestamp;return(!this.bitrate||!i||n>i)&&(this.bitrate=(e-this.loaded)*(1e3/n)*8,this.loaded=e,this.timestamp=t),this.bitrate}},_isXHRUpload:function(e){return!e.forceIframeTransport&&(!e.multipart&&t.support.xhrFileUpload||t.support.xhrFormDataFileUpload)},_getFormData:function(e){var i;return"function"===t.type(e.formData)?e.formData(e.form):t.isArray(e.formData)?e.formData:"object"===t.type(e.formData)?(i=[],t.each(e.formData,function(t,e){i.push({name:t,value:e})}),i):[]},_getTotal:function(e){var i=0;return t.each(e,function(t,e){i+=e.size||1}),i},_initProgressObject:function(e){var i={loaded:0,total:0,bitrate:0};e._progress?t.extend(e._progress,i):e._progress=i},_initResponseObject:function(t){var e;if(t._response)for(e in t._response)t._response.hasOwnProperty(e)&&delete t._response[e];else t._response={}},_onProgress:function(e,i){if(e.lengthComputable){var n,r=Date.now?Date.now():(new Date).getTime();if(i._time&&i.progressInterval&&r-i._time<i.progressInterval&&e.loaded!==e.total)return;i._time=r,n=Math.floor(e.loaded/e.total*(i.chunkSize||i._progress.total))+(i.uploadedBytes||0),this._progress.loaded+=n-i._progress.loaded,this._progress.bitrate=this._bitrateTimer.getBitrate(r,this._progress.loaded,i.bitrateInterval),i._progress.loaded=i.loaded=n,i._progress.bitrate=i.bitrate=i._bitrateTimer.getBitrate(r,n,i.bitrateInterval),this._trigger("progress",t.Event("progress",{delegatedEvent:e}),i),this._trigger("progressall",t.Event("progressall",{delegatedEvent:e}),this._progress)}},_initProgressListener:function(e){var i=this,n=e.xhr?e.xhr():t.ajaxSettings.xhr();n.upload&&(t(n.upload).bind("progress",function(t){var n=t.originalEvent;t.lengthComputable=n.lengthComputable,t.loaded=n.loaded,t.total=n.total,i._onProgress(t,e)}),e.xhr=function(){return n})},_isInstanceOf:function(t,e){return Object.prototype.toString.call(e)==="[object "+t+"]"},_initXHRData:function(e){var i,n=this,r=e.files[0],s=e.multipart||!t.support.xhrFileUpload,o="array"===t.type(e.paramName)?e.paramName[0]:e.paramName;e.headers=t.extend({},e.headers),e.contentRange&&(e.headers["Content-Range"]=e.contentRange),s&&!e.blob&&this._isInstanceOf("File",r)||(e.headers["Content-Disposition"]='attachment; filename="'+encodeURI(r.name)+'"'),s?t.support.xhrFormDataFileUpload&&(e.postMessage?(i=this._getFormData(e),e.blob?i.push({name:o,value:e.blob}):t.each(e.files,function(n,r){i.push({name:"array"===t.type(e.paramName)&&e.paramName[n]||o,value:r})})):(n._isInstanceOf("FormData",e.formData)?i=e.formData:(i=new FormData,t.each(this._getFormData(e),function(t,e){i.append(e.name,e.value)})),e.blob?i.append(o,e.blob,r.name):t.each(e.files,function(r,s){(n._isInstanceOf("File",s)||n._isInstanceOf("Blob",s))&&i.append("array"===t.type(e.paramName)&&e.paramName[r]||o,s,s.uploadName||s.name)})),e.data=i):(e.contentType=r.type||"application/octet-stream",e.data=e.blob||r),e.blob=null},_initIframeSettings:function(e){var i=t("<a></a>").prop("href",e.url).prop("host");e.dataType="iframe "+(e.dataType||""),e.formData=this._getFormData(e),e.redirect&&i&&i!==location.host&&e.formData.push({name:e.redirectParamName||"redirect",value:e.redirect})},_initDataSettings:function(t){this._isXHRUpload(t)?(this._chunkedUpload(t,!0)||(t.data||this._initXHRData(t),this._initProgressListener(t)),t.postMessage&&(t.dataType="postmessage "+(t.dataType||""))):this._initIframeSettings(t)},_getParamName:function(e){var i=t(e.fileInput),n=e.paramName;return n?t.isArray(n)||(n=[n]):(n=[],i.each(function(){for(var e=t(this),i=e.prop("name")||"files[]",r=(e.prop("files")||[1]).length;r;)n.push(i),r-=1}),n.length||(n=[i.prop("name")||"files[]"])),n},_initFormSettings:function(e){e.form&&e.form.length||(e.form=t(e.fileInput.prop("form")),e.form.length||(e.form=t(this.options.fileInput.prop("form")))),e.paramName=this._getParamName(e),e.url||(e.url=e.form.prop("action")||location.href),e.type=(e.type||"string"===t.type(e.form.prop("method"))&&e.form.prop("method")||"").toUpperCase(),"POST"!==e.type&&"PUT"!==e.type&&"PATCH"!==e.type&&(e.type="POST"),e.formAcceptCharset||(e.formAcceptCharset=e.form.attr("accept-charset"))},_getAJAXSettings:function(e){var i=t.extend({},this.options,e);return this._initFormSettings(i),this._initDataSettings(i),i},_getDeferredState:function(t){return t.state?t.state():t.isResolved()?"resolved":t.isRejected()?"rejected":"pending"},_enhancePromise:function(t){return t.success=t.done,t.error=t.fail,t.complete=t.always,t},_getXHRPromise:function(e,i,n){var r=t.Deferred(),s=r.promise();return i=i||this.options.context||s,!0===e?r.resolveWith(i,n):!1===e&&r.rejectWith(i,n),s.abort=r.promise,this._enhancePromise(s)},_addConvenienceMethods:function(e,i){var n=this,r=function(e){return t.Deferred().resolveWith(n,e).promise()};i.process=function(e,s){return(e||s)&&(i._processQueue=this._processQueue=(this._processQueue||r([this])).then(function(){return i.errorThrown?t.Deferred().rejectWith(n,[i]).promise():r(arguments)}).then(e,s)),this._processQueue||r([this])},i.submit=function(){return"pending"!==this.state()&&(i.jqXHR=this.jqXHR=!1!==n._trigger("submit",t.Event("submit",{delegatedEvent:e}),this)&&n._onSend(e,this)),this.jqXHR||n._getXHRPromise()},i.abort=function(){return this.jqXHR?this.jqXHR.abort():(this.errorThrown="abort",n._trigger("fail",null,this),n._getXHRPromise(!1))},i.state=function(){return this.jqXHR?n._getDeferredState(this.jqXHR):this._processQueue?n._getDeferredState(this._processQueue):void 0},i.processing=function(){return!this.jqXHR&&this._processQueue&&"pending"===n._getDeferredState(this._processQueue)},i.progress=function(){return this._progress},i.response=function(){return this._response}},_getUploadedBytes:function(t){var e=t.getResponseHeader("Range"),i=e&&e.split("-"),n=i&&i.length>1&&parseInt(i[1],10);return n&&n+1},_chunkedUpload:function(e,i){e.uploadedBytes=e.uploadedBytes||0;var n,r,s=this,o=e.files[0],a=o.size,l=e.uploadedBytes,u=e.maxChunkSize||a,c=this._blobSlice,h=t.Deferred(),d=h.promise();return!(!(this._isXHRUpload(e)&&c&&(l||u<a))||e.data)&&(!!i||(l>=a?(o.error=e.i18n("uploadedBytes"),this._getXHRPromise(!1,e.context,[null,"error",o.error])):(r=function(){var i=t.extend({},e),d=i._progress.loaded;i.blob=c.call(o,l,l+u,o.type),i.chunkSize=i.blob.size,i.contentRange="bytes "+l+"-"+(l+i.chunkSize-1)+"/"+a,s._initXHRData(i),s._initProgressListener(i),n=(!1!==s._trigger("chunksend",null,i)&&t.ajax(i)||s._getXHRPromise(!1,i.context)).done(function(n,o,u){l=s._getUploadedBytes(u)||l+i.chunkSize,d+i.chunkSize-i._progress.loaded&&s._onProgress(t.Event("progress",{lengthComputable:!0,loaded:l-i.uploadedBytes,total:l-i.uploadedBytes}),i),e.uploadedBytes=i.uploadedBytes=l,i.result=n,i.textStatus=o,i.jqXHR=u,s._trigger("chunkdone",null,i),s._trigger("chunkalways",null,i),l<a?r():h.resolveWith(i.context,[n,o,u])}).fail(function(t,e,n){i.jqXHR=t,i.textStatus=e,i.errorThrown=n,s._trigger("chunkfail",null,i),s._trigger("chunkalways",null,i),h.rejectWith(i.context,[t,e,n])})},this._enhancePromise(d),d.abort=function(){return n.abort()},r(),d)))},_beforeSend:function(t,e){0===this._active&&(this._trigger("start"),this._bitrateTimer=new this._BitrateTimer,this._progress.loaded=this._progress.total=0,this._progress.bitrate=0),this._initResponseObject(e),this._initProgressObject(e),e._progress.loaded=e.loaded=e.uploadedBytes||0,e._progress.total=e.total=this._getTotal(e.files)||1,e._progress.bitrate=e.bitrate=0,this._active+=1,this._progress.loaded+=e.loaded,this._progress.total+=e.total},_onDone:function(e,i,n,r){var s=r._progress.total,o=r._response;r._progress.loaded<s&&this._onProgress(t.Event("progress",{lengthComputable:!0,loaded:s,total:s}),r),o.result=r.result=e,o.textStatus=r.textStatus=i,o.jqXHR=r.jqXHR=n,this._trigger("done",null,r)},_onFail:function(t,e,i,n){var r=n._response;n.recalculateProgress&&(this._progress.loaded-=n._progress.loaded,this._progress.total-=n._progress.total),r.jqXHR=n.jqXHR=t,r.textStatus=n.textStatus=e,r.errorThrown=n.errorThrown=i,this._trigger("fail",null,n)},_onAlways:function(t,e,i,n){this._trigger("always",null,n)},_onSend:function(e,i){i.submit||this._addConvenienceMethods(e,i);var n,r,s,o,a=this,l=a._getAJAXSettings(i),u=function(){return a._sending+=1,l._bitrateTimer=new a._BitrateTimer,n=n||((r||!1===a._trigger("send",t.Event("send",{delegatedEvent:e}),l))&&a._getXHRPromise(!1,l.context,r)||a._chunkedUpload(l)||t.ajax(l)).done(function(t,e,i){a._onDone(t,e,i,l)}).fail(function(t,e,i){a._onFail(t,e,i,l)}).always(function(t,e,i){if(a._onAlways(t,e,i,l),a._sending-=1,a._active-=1,l.limitConcurrentUploads&&l.limitConcurrentUploads>a._sending)for(var n=a._slots.shift();n;){if("pending"===a._getDeferredState(n)){n.resolve();break}n=a._slots.shift()}0===a._active&&a._trigger("stop")})};return this._beforeSend(e,l),this.options.sequentialUploads||this.options.limitConcurrentUploads&&this.options.limitConcurrentUploads<=this._sending?(this.options.limitConcurrentUploads>1?(s=t.Deferred(),this._slots.push(s),o=s.then(u)):(this._sequence=this._sequence.then(u,u),o=this._sequence),o.abort=function(){return r=[void 0,"abort","abort"],n?n.abort():(s&&s.rejectWith(l.context,r),u())},this._enhancePromise(o)):u()},_onAdd:function(e,i){var n,r,s,o,a=this,l=!0,u=t.extend({},this.options,i),c=i.files,h=c.length,d=u.limitMultiFileUploads,p=u.limitMultiFileUploadSize,f=u.limitMultiFileUploadSizeOverhead,g=0,m=this._getParamName(u),v=0;if(!h)return!1;if(p&&void 0===c[0].size&&(p=void 0),(u.singleFileUploads||d||p)&&this._isXHRUpload(u))if(u.singleFileUploads||p||!d)if(!u.singleFileUploads&&p)for(s=[],n=[],o=0;o<h;o+=1)g+=c[o].size+f,(o+1===h||g+c[o+1].size+f>p||d&&o+1-v>=d)&&(s.push(c.slice(v,o+1)),r=m.slice(v,o+1),r.length||(r=m),n.push(r),v=o+1,g=0);else n=m;else for(s=[],n=[],o=0;o<h;o+=d)s.push(c.slice(o,o+d)),r=m.slice(o,o+d),r.length||(r=m),n.push(r);else s=[c],n=[m];return i.originalFiles=c,t.each(s||c,function(r,o){var u=t.extend({},i);return u.files=s?o:[o],u.paramName=n[r],a._initResponseObject(u),a._initProgressObject(u),a._addConvenienceMethods(e,u),l=a._trigger("add",t.Event("add",{delegatedEvent:e}),u)}),l},_replaceFileInput:function(e){var i=e.fileInput,n=i.clone(!0),r=i.is(document.activeElement);e.fileInputClone=n,t("<form></form>").append(n)[0].reset(),i.after(n).detach(),r&&n.focus(),t.cleanData(i.unbind("remove")),this.options.fileInput=this.options.fileInput.map(function(t,e){return e===i[0]?n[0]:e}),i[0]===this.element[0]&&(this.element=n)},_handleFileTreeEntry:function(e,i){var n,r=this,s=t.Deferred(),o=[],a=function(t){t&&!t.entry&&(t.entry=e),s.resolve([t])},l=function(t){r._handleFileTreeEntries(t,i+e.name+"/").done(function(t){s.resolve(t)}).fail(a)},u=function(){n.readEntries(function(t){t.length?(o=o.concat(t),u()):l(o)},a)};return i=i||"",e.isFile?e._file?(e._file.relativePath=i,s.resolve(e._file)):e.file(function(t){t.relativePath=i,s.resolve(t)},a):e.isDirectory?(n=e.createReader(),u()):s.resolve([]),s.promise()},_handleFileTreeEntries:function(e,i){var n=this;return t.when.apply(t,t.map(e,function(t){return n._handleFileTreeEntry(t,i)})).then(function(){return Array.prototype.concat.apply([],arguments)})},_getDroppedFiles:function(e){e=e||{};var i=e.items;return i&&i.length&&(i[0].webkitGetAsEntry||i[0].getAsEntry)?this._handleFileTreeEntries(t.map(i,function(t){var e;return t.webkitGetAsEntry?(e=t.webkitGetAsEntry(),e&&(e._file=t.getAsFile()),e):t.getAsEntry()})):t.Deferred().resolve(t.makeArray(e.files)).promise()},_getSingleFileInputFiles:function(e){e=t(e);var i,n,r=e.prop("webkitEntries")||e.prop("entries");if(r&&r.length)return this._handleFileTreeEntries(r);if(i=t.makeArray(e.prop("files")),i.length)void 0===i[0].name&&i[0].fileName&&t.each(i,function(t,e){e.name=e.fileName,e.size=e.fileSize});else{if(!(n=e.prop("value")))return t.Deferred().resolve([]).promise();i=[{name:n.replace(/^.*\\/,"")}]}return t.Deferred().resolve(i).promise()},_getFileInputFiles:function(e){return e instanceof t&&1!==e.length?t.when.apply(t,t.map(e,this._getSingleFileInputFiles)).then(function(){return Array.prototype.concat.apply([],arguments)}):this._getSingleFileInputFiles(e)},_onChange:function(e){var i=this,n={fileInput:t(e.target),form:t(e.target.form)};this._getFileInputFiles(n.fileInput).always(function(r){n.files=r,i.options.replaceFileInput&&i._replaceFileInput(n),!1!==i._trigger("change",t.Event("change",{delegatedEvent:e}),n)&&i._onAdd(e,n)})},_onPaste:function(e){var i=e.originalEvent&&e.originalEvent.clipboardData&&e.originalEvent.clipboardData.items,n={files:[]};i&&i.length&&(t.each(i,function(t,e){var i=e.getAsFile&&e.getAsFile();i&&n.files.push(i)}),!1!==this._trigger("paste",t.Event("paste",{delegatedEvent:e}),n)&&this._onAdd(e,n))},_onDrop:function(e){e.dataTransfer=e.originalEvent&&e.originalEvent.dataTransfer;var i=this,n=e.dataTransfer,r={};n&&n.files&&n.files.length&&(e.preventDefault(),this._getDroppedFiles(n).always(function(n){r.files=n,!1!==i._trigger("drop",t.Event("drop",{delegatedEvent:e}),r)&&i._onAdd(e,r)}))},_onDragOver:e("dragover"),_onDragEnter:e("dragenter"),_onDragLeave:e("dragleave"),_initEventHandlers:function(){this._isXHRUpload(this.options)&&(this._on(this.options.dropZone,{dragover:this._onDragOver,drop:this._onDrop,dragenter:this._onDragEnter,dragleave:this._onDragLeave}),this._on(this.options.pasteZone,{paste:this._onPaste})),t.support.fileInput&&this._on(this.options.fileInput,{change:this._onChange})},_destroyEventHandlers:function(){this._off(this.options.dropZone,"dragenter dragleave dragover drop"),this._off(this.options.pasteZone,"paste"),this._off(this.options.fileInput,"change")},_destroy:function(){this._destroyEventHandlers()},_setOption:function(e,i){var n=-1!==t.inArray(e,this._specialOptions);n&&this._destroyEventHandlers(),this._super(e,i),n&&(this._initSpecialOptions(),this._initEventHandlers())},_initSpecialOptions:function(){var e=this.options;void 0===e.fileInput?e.fileInput=this.element.is('input[type="file"]')?this.element:this.element.find('input[type="file"]'):e.fileInput instanceof t||(e.fileInput=t(e.fileInput)),e.dropZone instanceof t||(e.dropZone=t(e.dropZone)),e.pasteZone instanceof t||(e.pasteZone=t(e.pasteZone))},_getRegExp:function(t){var e=t.split("/"),i=e.pop();return e.shift(),new RegExp(e.join("/"),i)},_isRegExpOption:function(e,i){return"url"!==e&&"string"===t.type(i)&&/^\/.*\/[igm]{0,3}$/.test(i)},_initDataAttributes:function(){var e=this,i=this.options,n=this.element.data();t.each(this.element[0].attributes,function(t,r){var s,o=r.name.toLowerCase();/^data-/.test(o)&&(o=o.slice(5).replace(/-[a-z]/g,function(t){return t.charAt(1).toUpperCase()}),s=n[o],e._isRegExpOption(o,s)&&(s=e._getRegExp(s)),i[o]=s)})},_create:function(){this._initDataAttributes(),this._initSpecialOptions(),this._slots=[],this._sequence=this._getXHRPromise(!0),this._sending=this._active=0,this._initProgressObject(this),this._initEventHandlers()},active:function(){return this._active},progress:function(){return this._progress},add:function(e){var i=this;e&&!this.options.disabled&&(e.fileInput&&!e.files?this._getFileInputFiles(e.fileInput).always(function(t){e.files=t,i._onAdd(null,e)}):(e.files=t.makeArray(e.files),this._onAdd(null,e)))},send:function(e){if(e&&!this.options.disabled){if(e.fileInput&&!e.files){var i,n,r=this,s=t.Deferred(),o=s.promise();return o.abort=function(){return n=!0,i?i.abort():(s.reject(null,"abort","abort"),o)},this._getFileInputFiles(e.fileInput).always(function(t){if(!n){if(!t.length)return void s.reject();e.files=t,i=r._onSend(null,e),i.then(function(t,e,i){s.resolve(t,e,i)},function(t,e,i){s.reject(t,e,i)})}}),this._enhancePromise(o)}if(e.files=t.makeArray(e.files),e.files.length)return this._onSend(null,e)}return this._getXHRPromise(!1,e&&e.context)}})})},function(t,e){"format global";"deps jquery";"exports $";/*!
        + * Bootstrap v3.3.4 (http://getbootstrap.com)
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + */
        +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]};return!1}t.fn.emulateTransitionEnd=function(e){var i=!1,n=this;t(this).one("bsTransitionEnd",function(){i=!0});var r=function(){i||t(n).trigger(t.support.transition.end)};return setTimeout(r,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}})})}(jQuery),function(t){"use strict";function e(e){return this.each(function(){var i=t(this),r=i.data("bs.alert");r||i.data("bs.alert",r=new n(this)),"string"==typeof e&&r[e].call(i)})}var i='[data-dismiss="alert"]',n=function(e){t(e).on("click",i,this.close)};n.VERSION="3.3.4",n.TRANSITION_DURATION=150,n.prototype.close=function(e){function i(){o.detach().trigger("closed.bs.alert").remove()}var r=t(this),s=r.attr("data-target");s||(s=r.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var o=t(s);e&&e.preventDefault(),o.length||(o=r.closest(".alert")),o.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(o.removeClass("in"),t.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",i).emulateTransitionEnd(n.TRANSITION_DURATION):i())};var r=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=n,t.fn.alert.noConflict=function(){return t.fn.alert=r,this},t(document).on("click.bs.alert.data-api",i,n.prototype.close)}(jQuery),function(t){"use strict";function e(e){return this.each(function(){var n=t(this),r=n.data("bs.button"),s="object"==typeof e&&e;r||n.data("bs.button",r=new i(this,s)),"toggle"==e?r.toggle():e&&r.setState(e)})}var i=function(e,n){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,n),this.isLoading=!1};i.VERSION="3.3.4",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",n=this.$element,r=n.is("input")?"val":"html",s=n.data();e+="Text",null==s.resetText&&n.data("resetText",n[r]()),setTimeout(t.proxy(function(){n[r](null==s[e]?this.options[e]:s[e]),"loadingText"==e?(this.isLoading=!0,n.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,n.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")&&(i.prop("checked")&&this.$element.hasClass("active")?t=!1:e.find(".active").removeClass("active")),t&&i.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));t&&this.$element.toggleClass("active")};var n=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=n,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var n=t(i.target);n.hasClass("btn")||(n=n.closest(".btn")),e.call(n,"toggle"),i.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){t(e.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(e.type))})}(jQuery),function(t){"use strict";function e(e){return this.each(function(){var n=t(this),r=n.data("bs.carousel"),s=t.extend({},i.DEFAULTS,n.data(),"object"==typeof e&&e),o="string"==typeof e?e:s.slide;r||n.data("bs.carousel",r=new i(this,s)),"number"==typeof e?r.to(e):o?r[o]():s.interval&&r.pause().cycle()})}var i=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",t.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.3.4",i.TRANSITION_DURATION=600,i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},i.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e);if(("prev"==t&&0===i||"next"==t&&i==this.$items.length-1)&&!this.options.wrap)return e;var n="prev"==t?-1:1,r=(i+n)%this.$items.length;return this.$items.eq(r)},i.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(t>this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",this.$items.eq(t))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){if(!this.sliding)return this.slide("next")},i.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},i.prototype.slide=function(e,n){var r=this.$element.find(".item.active"),s=n||this.getItemForDirection(e,r),o=this.interval,a="next"==e?"left":"right",l=this;if(s.hasClass("active"))return this.sliding=!1;var u=s[0],c=t.Event("slide.bs.carousel",{relatedTarget:u,direction:a});if(this.$element.trigger(c),!c.isDefaultPrevented()){if(this.sliding=!0,o&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var h=t(this.$indicators.children()[this.getItemIndex(s)]);h&&h.addClass("active")}var d=t.Event("slid.bs.carousel",{relatedTarget:u,direction:a});return t.support.transition&&this.$element.hasClass("slide")?(s.addClass(e),s[0].offsetWidth,r.addClass(a),s.addClass(a),r.one("bsTransitionEnd",function(){s.removeClass([e,a].join(" ")).addClass("active"),r.removeClass(["active",a].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(d)},0)}).emulateTransitionEnd(i.TRANSITION_DURATION)):(r.removeClass("active"),s.addClass("active"),this.sliding=!1,this.$element.trigger(d)),o&&this.cycle(),this}};var n=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=n,this};var r=function(i){var n,r=t(this),s=t(r.attr("data-target")||(n=r.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,""));if(s.hasClass("carousel")){var o=t.extend({},s.data(),r.data()),a=r.attr("data-slide-to");a&&(o.interval=!1),e.call(s,o),a&&s.data("bs.carousel").to(a),i.preventDefault()}};t(document).on("click.bs.carousel.data-api","[data-slide]",r).on("click.bs.carousel.data-api","[data-slide-to]",r),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),function(t){"use strict";function e(e){var i,n=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(n)}function i(e){return this.each(function(){var i=t(this),r=i.data("bs.collapse"),s=t.extend({},n.DEFAULTS,i.data(),"object"==typeof e&&e);!r&&s.toggle&&/show|hide/.test(e)&&(s.toggle=!1),r||i.data("bs.collapse",r=new n(this,s)),"string"==typeof e&&r[e]()})}var n=function(e,i){this.$element=t(e),this.options=t.extend({},n.DEFAULTS,i),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};n.VERSION="3.3.4",n.TRANSITION_DURATION=350,n.DEFAULTS={toggle:!0},n.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"},n.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,r=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(r&&r.length&&(e=r.data("bs.collapse"))&&e.transitioning)){var s=t.Event("show.bs.collapse");if(this.$element.trigger(s),!s.isDefaultPrevented()){r&&r.length&&(i.call(r,"hide"),e||r.data("bs.collapse",null));var o=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[o](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[o](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return a.call(this);var l=t.camelCase(["scroll",o].join("-"));this.$element.one("bsTransitionEnd",t.proxy(a,this)).emulateTransitionEnd(n.TRANSITION_DURATION)[o](this.$element[0][l])}}}},n.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var r=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!t.support.transition)return r.call(this);this.$element[i](0).one("bsTransitionEnd",t.proxy(r,this)).emulateTransitionEnd(n.TRANSITION_DURATION)}}},n.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},n.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,n){var r=t(n);this.addAriaAndCollapsedClass(e(r),r)},this)).end()},n.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var r=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=n,t.fn.collapse.noConflict=function(){return t.fn.collapse=r,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(n){var r=t(this);r.attr("data-target")||n.preventDefault();var s=e(r),o=s.data("bs.collapse"),a=o?"toggle":r.data();i.call(s,a)})}(jQuery),function(t){"use strict";function e(e){e&&3===e.which||(t(r).remove(),t(s).each(function(){var n=t(this),r=i(n),s={relatedTarget:this};r.hasClass("open")&&(r.trigger(e=t.Event("hide.bs.dropdown",s)),e.isDefaultPrevented()||(n.attr("aria-expanded","false"),r.removeClass("open").trigger("hidden.bs.dropdown",s)))}))}function i(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var n=i&&t(i);return n&&n.length?n:e.parent()}function n(e){return this.each(function(){var i=t(this),n=i.data("bs.dropdown");n||i.data("bs.dropdown",n=new o(this)),"string"==typeof e&&n[e].call(i)})}var r=".dropdown-backdrop",s='[data-toggle="dropdown"]',o=function(e){t(e).on("click.bs.dropdown",this.toggle)};o.VERSION="3.3.4",o.prototype.toggle=function(n){var r=t(this);if(!r.is(".disabled, :disabled")){var s=i(r),o=s.hasClass("open");if(e(),!o){"ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t('<div class="dropdown-backdrop"/>').insertAfter(t(this)).on("click",e);var a={relatedTarget:this};if(s.trigger(n=t.Event("show.bs.dropdown",a)),n.isDefaultPrevented())return;r.trigger("focus").attr("aria-expanded","true"),s.toggleClass("open").trigger("shown.bs.dropdown",a)}return!1}},o.prototype.keydown=function(e){if(/(38|40|27|32)/.test(e.which)&&!/input|textarea/i.test(e.target.tagName)){var n=t(this);if(e.preventDefault(),e.stopPropagation(),!n.is(".disabled, :disabled")){var r=i(n),o=r.hasClass("open");if(!o&&27!=e.which||o&&27==e.which)return 27==e.which&&r.find(s).trigger("focus"),n.trigger("click");var a=" li:not(.disabled):visible a",l=r.find('[role="menu"]'+a+', [role="listbox"]'+a);if(l.length){var u=l.index(e.target);38==e.which&&u>0&&u--,40==e.which&&u<l.length-1&&u++,~u||(u=0),l.eq(u).trigger("focus")}}}};var a=t.fn.dropdown;t.fn.dropdown=n,t.fn.dropdown.Constructor=o,t.fn.dropdown.noConflict=function(){return t.fn.dropdown=a,this},t(document).on("click.bs.dropdown.data-api",e).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",s,o.prototype.toggle).on("keydown.bs.dropdown.data-api",s,o.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',o.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',o.prototype.keydown)}(jQuery),function(t){"use strict";function e(e,n){return this.each(function(){var r=t(this),s=r.data("bs.modal"),o=t.extend({},i.DEFAULTS,r.data(),"object"==typeof e&&e);s||r.data("bs.modal",s=new i(this,o)),"string"==typeof e?s[e](n):o.show&&s.show(n)})}var i=function(e,i){this.options=i,this.$body=t(document.body),this.$element=t(e),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};i.VERSION="3.3.4",i.TRANSITION_DURATION=300,i.BACKDROP_TRANSITION_DURATION=150,i.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},i.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},i.prototype.show=function(e){var n=this,r=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(r),this.isShown||r.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){n.$element.one("mouseup.dismiss.bs.modal",function(e){t(e.target).is(n.$element)&&(n.ignoreBackdropClick=!0)})}),this.backdrop(function(){var r=t.support.transition&&n.$element.hasClass("fade");n.$element.parent().length||n.$element.appendTo(n.$body),n.$element.show().scrollTop(0),n.adjustDialog(),r&&n.$element[0].offsetWidth,n.$element.addClass("in").attr("aria-hidden",!1),n.enforceFocus();var s=t.Event("shown.bs.modal",{relatedTarget:e});r?n.$dialog.one("bsTransitionEnd",function(){n.$element.trigger("focus").trigger(s)}).emulateTransitionEnd(i.TRANSITION_DURATION):n.$element.trigger("focus").trigger(s)}))},i.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(i.TRANSITION_DURATION):this.hideModal())},i.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},i.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},i.prototype.resize=function(){this.isShown?t(window).on("resize.bs.modal",t.proxy(this.handleUpdate,this)):t(window).off("resize.bs.modal")},i.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},i.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},i.prototype.backdrop=function(e){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&r;if(this.$backdrop=t('<div class="modal-backdrop '+r+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){if(this.ignoreBackdropClick)return void(this.ignoreBackdropClick=!1);t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide())},this)),s&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;s?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var o=function(){n.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",o).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):o()}else e&&e()},i.prototype.handleUpdate=function(){this.adjustDialog()},i.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},i.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},i.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},i.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",t+this.scrollbarWidth)},i.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},i.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var n=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=i,t.fn.modal.noConflict=function(){return t.fn.modal=n,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(i){var n=t(this),r=n.attr("href"),s=t(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),o=s.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(r)&&r},s.data(),n.data());n.is("a")&&i.preventDefault(),s.one("show.bs.modal",function(t){t.isDefaultPrevented()||s.one("hidden.bs.modal",function(){n.is(":visible")&&n.trigger("focus")})}),e.call(s,o,this)})}(jQuery),function(t){"use strict";function e(e){return this.each(function(){var n=t(this),r=n.data("bs.tooltip"),s="object"==typeof e&&e;!r&&/destroy|hide/.test(e)||(r||n.data("bs.tooltip",r=new i(this,s)),"string"==typeof e&&r[e]())})}var i=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",t,e)};i.VERSION="3.3.4",i.TRANSITION_DURATION=150,i.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,n){if(this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(n),this.$viewport=this.options.viewport&&t(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var r=this.options.trigger.split(" "),s=r.length;s--;){var o=r[s];if("click"==o)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=o){var a="hover"==o?"mouseenter":"focusin",l="hover"==o?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,n){i[t]!=n&&(e[t]=n)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i&&i.$tip&&i.$tip.is(":visible")?void(i.hoverState="in"):(i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);if(i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),clearTimeout(i.timeout),i.hoverState="out",!i.options.delay||!i.options.delay.hide)return i.hide();i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var n=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!n)return;var r=this,s=this.tip(),o=this.getUID(this.type);this.setContent(),s.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&s.addClass("fade");var a="function"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,u=l.test(a);u&&(a=a.replace(l,"")||"top"),s.detach().css({top:0,left:0,display:"block"}).addClass(a).data("bs."+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element);var c=this.getPosition(),h=s[0].offsetWidth,d=s[0].offsetHeight;if(u){var p=a,f=this.options.container?t(this.options.container):this.$element.parent(),g=this.getPosition(f);a="bottom"==a&&c.bottom+d>g.bottom?"top":"top"==a&&c.top-d<g.top?"bottom":"right"==a&&c.right+h>g.width?"left":"left"==a&&c.left-h<g.left?"right":a,s.removeClass(p).addClass(a)}var m=this.getCalculatedOffset(a,c,h,d);this.applyPlacement(m,a);var v=function(){var t=r.hoverState;r.$element.trigger("shown.bs."+r.type),r.hoverState=null,"out"==t&&r.leave(r)};t.support.transition&&this.$tip.hasClass("fade")?s.one("bsTransitionEnd",v).emulateTransitionEnd(i.TRANSITION_DURATION):v()}},i.prototype.applyPlacement=function(e,i){var n=this.tip(),r=n[0].offsetWidth,s=n[0].offsetHeight,o=parseInt(n.css("margin-top"),10),a=parseInt(n.css("margin-left"),10);isNaN(o)&&(o=0),isNaN(a)&&(a=0),e.top=e.top+o,e.left=e.left+a,t.offset.setOffset(n[0],t.extend({using:function(t){n.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),n.addClass("in");var l=n[0].offsetWidth,u=n[0].offsetHeight;"top"==i&&u!=s&&(e.top=e.top+s-u);var c=this.getViewportAdjustedDelta(i,e,l,u);c.left?e.left+=c.left:e.top+=c.top;var h=/top|bottom/.test(i),d=h?2*c.left-r+l:2*c.top-s+u,p=h?"offsetWidth":"offsetHeight";n.offset(e),this.replaceArrow(d,n[0][p],h)},i.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?"left":"top",50*(1-t/e)+"%").css(i?"top":"left","")},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},i.prototype.hide=function(e){function n(){"in"!=r.hoverState&&s.detach(),r.$element.removeAttr("aria-describedby").trigger("hidden.bs."+r.type),e&&e()}var r=this,s=t(this.$tip),o=t.Event("hide.bs."+this.type);if(this.$element.trigger(o),!o.isDefaultPrevented())return s.removeClass("in"),t.support.transition&&s.hasClass("fade")?s.one("bsTransitionEnd",n).emulateTransitionEnd(i.TRANSITION_DURATION):n(),this.hoverState=null,this},i.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},i.prototype.hasContent=function(){return this.getTitle()},i.prototype.getPosition=function(e){e=e||this.$element;var i=e[0],n="BODY"==i.tagName,r=i.getBoundingClientRect();null==r.width&&(r=t.extend({},r,{width:r.right-r.left,height:r.bottom-r.top}));var s=n?{top:0,left:0}:e.offset(),o={scroll:n?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop()},a=n?{width:t(window).width(),height:t(window).height()}:null;return t.extend({},r,o,a,s)},i.prototype.getCalculatedOffset=function(t,e,i,n){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:"top"==t?{top:e.top-n,left:e.left+e.width/2-i/2}:"left"==t?{top:e.top+e.height/2-n/2,left:e.left-i}:{top:e.top+e.height/2-n/2,left:e.left+e.width}},i.prototype.getViewportAdjustedDelta=function(t,e,i,n){var r={top:0,left:0};if(!this.$viewport)return r;var s=this.options.viewport&&this.options.viewport.padding||0,o=this.getPosition(this.$viewport);if(/right|left/.test(t)){var a=e.top-s-o.scroll,l=e.top+s-o.scroll+n;a<o.top?r.top=o.top-a:l>o.top+o.height&&(r.top=o.top+o.height-l)}else{var u=e.left-s,c=e.left+s+i;u<o.left?r.left=o.left-u:c>o.width&&(r.left=o.left+o.width-c)}return r},i.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},i.prototype.getUID=function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},i.prototype.tip=function(){return this.$tip=this.$tip||t(this.options.template)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&((i=t(e.currentTarget).data("bs."+this.type))||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type)})};var n=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=n,this}}(jQuery),function(t){"use strict";function e(e){return this.each(function(){var n=t(this),r=n.data("bs.popover"),s="object"==typeof e&&e;!r&&/destroy|hide/.test(e)||(r||n.data("bs.popover",r=new i(this,s)),"string"==typeof e&&r[e]())})}var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.3.4",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var n=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=n,this}}(jQuery),function(t){"use strict";function e(i,n){this.$body=t(document.body),this.$scrollElement=t(t(i).is(document.body)?window:i),this.options=t.extend({},e.DEFAULTS,n),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",t.proxy(this.process,this)),this.refresh(),this.process()}function i(i){return this.each(function(){var n=t(this),r=n.data("bs.scrollspy"),s="object"==typeof i&&i;r||n.data("bs.scrollspy",r=new e(this,s)),"string"==typeof i&&r[i]()})}e.VERSION="3.3.4",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,i="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(i="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),r=e.data("target")||e.attr("href"),s=/^#./.test(r)&&t(r);return s&&s.length&&s.is(":visible")&&[[s[i]().top+n,r]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),n=this.options.offset+i-this.$scrollElement.height(),r=this.offsets,s=this.targets,o=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=n)return o!=(t=s[s.length-1])&&this.activate(t);if(o&&e<r[0])return this.activeTarget=null,this.clear();for(t=r.length;t--;)o!=s[t]&&e>=r[t]&&(void 0===r[t+1]||e<r[t+1])&&this.activate(s[t])},e.prototype.activate=function(e){this.activeTarget=e,this.clear();var i=this.selector+'[data-target="'+e+'"],'+this.selector+'[href="'+e+'"]',n=t(i).parents("li").addClass("active");n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate.bs.scrollspy")},e.prototype.clear=function(){t(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var n=t.fn.scrollspy;t.fn.scrollspy=i,t.fn.scrollspy.Constructor=e,t.fn.scrollspy.noConflict=function(){return t.fn.scrollspy=n,this},t(window).on("load.bs.scrollspy.data-api",function(){t('[data-spy="scroll"]').each(function(){var e=t(this);i.call(e,e.data())})})}(jQuery),function(t){"use strict";function e(e){return this.each(function(){var n=t(this),r=n.data("bs.tab");r||n.data("bs.tab",r=new i(this)),"string"==typeof e&&r[e]()})}var i=function(e){this.element=t(e)};i.VERSION="3.3.4",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),n=e.data("target");if(n||(n=e.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var r=i.find(".active:last a"),s=t.Event("hide.bs.tab",{relatedTarget:e[0]}),o=t.Event("show.bs.tab",{relatedTarget:r[0]});if(r.trigger(s),e.trigger(o),!o.isDefaultPrevented()&&!s.isDefaultPrevented()){var a=t(n);this.activate(e.closest("li"),i),this.activate(a,a.parent(),function(){r.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:r[0]})})}}},i.prototype.activate=function(e,n,r){function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),a?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),r&&r()}var o=n.find("> .active"),a=r&&t.support.transition&&(o.length&&o.hasClass("fade")||!!n.find("> .fade").length);o.length&&a?o.one("bsTransitionEnd",s).emulateTransitionEnd(i.TRANSITION_DURATION):s(),o.removeClass("in")};var n=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=n,this};var r=function(i){i.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',r).on("click.bs.tab.data-api",'[data-toggle="pill"]',r)}(jQuery),function(t){"use strict";function e(e){return this.each(function(){var n=t(this),r=n.data("bs.affix"),s="object"==typeof e&&e;r||n.data("bs.affix",r=new i(this,s)),"string"==typeof e&&r[e]()})}var i=function(e,n){this.options=t.extend({},i.DEFAULTS,n),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};i.VERSION="3.3.4",i.RESET="affix affix-top affix-bottom",i.DEFAULTS={offset:0,target:window},i.prototype.getState=function(t,e,i,n){var r=this.$target.scrollTop(),s=this.$element.offset(),o=this.$target.height();if(null!=i&&"top"==this.affixed)return r<i&&"top";if("bottom"==this.affixed)return null!=i?!(r+this.unpin<=s.top)&&"bottom":!(r+o<=t-n)&&"bottom";var a=null==this.affixed,l=a?r:s.top,u=a?o:e;return null!=i&&r<=i?"top":null!=n&&l+u>=t-n&&"bottom"},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=this.$element.height(),n=this.options.offset,r=n.top,s=n.bottom,o=t(document.body).height();"object"!=typeof n&&(s=r=n),"function"==typeof r&&(r=n.top(this.$element)),"function"==typeof s&&(s=n.bottom(this.$element));var a=this.getState(o,e,r,s);if(this.affixed!=a){null!=this.unpin&&this.$element.css("top","");var l="affix"+(a?"-"+a:""),u=t.Event(l+".bs.affix");if(this.$element.trigger(u),u.isDefaultPrevented())return;this.affixed=a,this.unpin="bottom"==a?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==a&&this.$element.offset({top:o-e-s})}};var n=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=n,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var i=t(this),n=i.data();n.offset=n.offset||{},null!=n.offsetBottom&&(n.offset.bottom=n.offsetBottom),null!=n.offsetTop&&(n.offset.top=n.offsetTop),e.call(i,n)})})}(jQuery)},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,".action-link[data-v-225778c2]{cursor:pointer}.m-b-none[data-v-225778c2]{margin-bottom:0}",""])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,"",""])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,"td[data-v-5301a236],th[data-v-5301a236]{font-size:13px}",""])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,"",""])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,"tr{padding-left:30px}",""])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,".action-link[data-v-de0d0e4e]{cursor:pointer}.m-b-none[data-v-de0d0e4e]{margin-bottom:0}",""])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,".action-link[data-v-e9c80318]{cursor:pointer}.m-b-none[data-v-e9c80318]{margin-bottom:0}",""])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,".select2-dropdown[data-v-ff564a86]{z-index:9999}",""])},function(t,e,i){var n,r,s;/*! jQuery UI - v1.12.1 - 2017-03-19
        +* http://jqueryui.com
        +* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js
        +* Copyright jQuery Foundation and other contributors; Licensed MIT */
        +!function(o){r=[i(3)],n=o,void 0!==(s="function"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(("absolute"===(e=t.css("position"))||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=r(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function r(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,s)}function s(){t.datepicker._isDisabledDatepicker(p.inline?p.dpDiv.parent()[0]:p.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function o(e,i){t.extend(e,i);for(var n in i)null==i[n]&&(e[n]=i[n]);return e}function a(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var l=0,u=Array.prototype.slice;t.cleanData=function(e){return function(i){var n,r,s;for(s=0;null!=(r=i[s]);s++)try{(n=t._data(r,"events"))&&n.remove&&t(r).triggerHandler("remove")}catch(t){}e(i)}}(t.cleanData),t.widget=function(e,i,n){var r,s,o,a={},l=e.split(".")[0];e=e.split(".")[1];var u=l+"-"+e;return n||(n=i,i=t.Widget),t.isArray(n)&&(n=t.extend.apply(null,[{}].concat(n))),t.expr[":"][u.toLowerCase()]=function(e){return!!t.data(e,u)},t[l]=t[l]||{},r=t[l][e],s=t[l][e]=function(t,e){return this._createWidget?void(arguments.length&&this._createWidget(t,e)):new s(t,e)},t.extend(s,r,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),o=new i,o.options=t.widget.extend({},o.options),t.each(n,function(e,n){return t.isFunction(n)?void(a[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function r(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,s=this._superApply;return this._super=t,this._superApply=r,e=n.apply(this,arguments),this._super=i,this._superApply=s,e}}()):void(a[e]=n)}),s.prototype=t.widget.extend(o,{widgetEventPrefix:r?o.widgetEventPrefix||e:e},a,{constructor:s,namespace:l,widgetName:e,widgetFullName:u}),r?(t.each(r._childConstructors,function(e,i){var n=i.prototype;t.widget(n.namespace+"."+n.widgetName,s,i._proto)}),delete r._childConstructors):i._childConstructors.push(s),t.widget.bridge(e,s),s},t.widget.extend=function(e){for(var i,n,r=u.call(arguments,1),s=0,o=r.length;o>s;s++)for(i in r[s])n=r[s][i],r[s].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(r){var s="string"==typeof r,o=u.call(arguments,1),a=this;return s?this.length||"instance"!==r?this.each(function(){var i,s=t.data(this,n);return"instance"===r?(a=s,!1):s?t.isFunction(s[r])&&"_"!==r.charAt(0)?(i=s[r].apply(s,o),i!==s&&void 0!==i?(a=i&&i.jquery?a.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+r+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; attempted to call method '"+r+"'")}):a=void 0:(o.length&&(r=t.widget.extend.apply(null,[r].concat(o))),this.each(function(){var e=t.data(this,n);e?(e.option(r||{}),e._init&&e._init()):t.data(this,n,new i(r,this))})),a}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var n,r,s,o=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(o={},n=e.split("."),e=n.shift(),n.length){for(r=o[e]=t.widget.extend({},this.options[e]),s=0;n.length-1>s;s++)r[n[s]]=r[n[s]]||{},r=r[n[s]];if(e=n.pop(),1===arguments.length)return void 0===r[e]?null:r[e];r[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];o[e]=i}return this._setOptions(o),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,n,r;for(i in e)r=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&r&&r.length&&(n=t(r.get()),this._removeClass(r,i),n.addClass(this._classes({element:n,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,s){var o,a;for(a=0;i.length>a;a++)o=r.classesElementLookup[i[a]]||t(),o=t(e.add?t.unique(o.get().concat(e.element.get())):o.not(e.element).get()),r.classesElementLookup[i[a]]=o,n.push(i[a]),s&&e.classes[i[a]]&&n.push(e.classes[i[a]])}var n=[],r=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),n.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(n,r){-1!==t.inArray(e.target,r)&&(i.classesElementLookup[n]=t(r.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,n){n="boolean"==typeof n?n:i;var r="string"==typeof t||null===t,s={extra:r?e:i,keys:r?t:e,element:r?this.element:t,add:n};return s.element.toggleClass(this._classes(s),n),this},_on:function(e,i,n){var r,s=this;"boolean"!=typeof e&&(n=i,i=e,e=!1),n?(i=r=t(i),this.bindings=this.bindings.add(i)):(n=i,i=this.element,r=this.widget()),t.each(n,function(n,o){function a(){return e||!0!==s.options.disabled&&!t(this).hasClass("ui-state-disabled")?("string"==typeof o?s[o]:o).apply(s,arguments):void 0}"string"!=typeof o&&(a.guid=o.guid=o.guid||a.guid||t.guid++);var l=n.match(/^([\w:-]*)\s*(.*)$/),u=l[1]+s.eventNamespace,c=l[2];c?r.on(u,c,a):i.on(u,a)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?n[t]:t).apply(n,arguments)}var n=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,n){var r,s,o=this.options[e];if(n=n||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],s=i.originalEvent)for(r in s)r in i||(i[r]=s[r]);return this.element.trigger(i,n),!(t.isFunction(o)&&!1===o.apply(this.element[0],[i].concat(n))||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(n,r,s){"string"==typeof r&&(r={effect:r});var o,a=r?!0===r||"number"==typeof r?i:r.effect||i:e;r=r||{},"number"==typeof r&&(r={duration:r}),o=!t.isEmptyObject(r),r.complete=s,r.delay&&n.delay(r.delay),o&&t.effects&&t.effects.effect[a]?n[e](r):a!==e&&n[a]?n[a](r.duration,r.easing,s):n.queue(function(i){t(this)[e](),s&&s.call(n[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(h.test(t[0])?e/100:1),parseFloat(t[1])*(h.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var r,s=Math.max,o=Math.abs,a=/left|center|right/,l=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,h=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==r)return r;var e,i,n=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),s=n.children()[0];return t("body").append(n),e=s.offsetWidth,n.css("overflow","scroll"),i=s.offsetWidth,e===i&&(i=n[0].clientWidth),n.remove(),r=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),n=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),r="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth;return{width:"scroll"===n||"auto"===n&&e.height<e.element[0].scrollHeight?t.position.scrollbarWidth():0,height:r?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),n=t.isWindow(i[0]),r=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:n,isDocument:r,offset:n||r?{left:0,top:0}:t(e).offset(),scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(r){if(!r||!r.of)return d.apply(this,arguments);r=t.extend({},r);var h,p,f,g,m,v,_=t(r.of),y=t.position.getWithinInfo(r.within),b=t.position.getScrollInfo(y),w=(r.collision||"flip").split(" "),x={};return v=n(_),_[0].preventDefault&&(r.at="left top"),p=v.width,f=v.height,g=v.offset,m=t.extend({},g),t.each(["my","at"],function(){var t,e,i=(r[this]||"").split(" ");1===i.length&&(i=a.test(i[0])?i.concat(["center"]):l.test(i[0])?["center"].concat(i):["center","center"]),i[0]=a.test(i[0])?i[0]:"center",i[1]=l.test(i[1])?i[1]:"center",t=u.exec(i[0]),e=u.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],r[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===r.at[0]?m.left+=p:"center"===r.at[0]&&(m.left+=p/2),"bottom"===r.at[1]?m.top+=f:"center"===r.at[1]&&(m.top+=f/2),h=e(x.at,p,f),m.left+=h[0],m.top+=h[1],this.each(function(){var n,a,l=t(this),u=l.outerWidth(),c=l.outerHeight(),d=i(this,"marginLeft"),v=i(this,"marginTop"),C=u+d+i(this,"marginRight")+b.width,k=c+v+i(this,"marginBottom")+b.height,T=t.extend({},m),D=e(x.my,l.outerWidth(),l.outerHeight());"right"===r.my[0]?T.left-=u:"center"===r.my[0]&&(T.left-=u/2),"bottom"===r.my[1]?T.top-=c:"center"===r.my[1]&&(T.top-=c/2),T.left+=D[0],T.top+=D[1],n={marginLeft:d,marginTop:v},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](T,{targetWidth:p,targetHeight:f,elemWidth:u,elemHeight:c,collisionPosition:n,collisionWidth:C,collisionHeight:k,offset:[h[0]+D[0],h[1]+D[1]],my:r.my,at:r.at,within:y,elem:l})}),r.using&&(a=function(t){var e=g.left-T.left,i=e+p-u,n=g.top-T.top,a=n+f-c,h={target:{element:_,left:g.left,top:g.top,width:p,height:f},element:{element:l,left:T.left,top:T.top,width:u,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>a?"top":n>0?"bottom":"middle"};u>p&&p>o(e+i)&&(h.horizontal="center"),c>f&&f>o(n+a)&&(h.vertical="middle"),h.important=s(o(e),o(i))>s(o(n),o(a))?"horizontal":"vertical",r.using.call(this,t,h)}),l.offset(t.extend(T,{using:a}))})},t.ui.position={fit:{left:function(t,e){var i,n=e.within,r=n.isWindow?n.scrollLeft:n.offset.left,o=n.width,a=t.left-e.collisionPosition.marginLeft,l=r-a,u=a+e.collisionWidth-o-r;e.collisionWidth>o?l>0&&0>=u?(i=t.left+l+e.collisionWidth-o-r,t.left+=l-i):t.left=u>0&&0>=l?r:l>u?r+o-e.collisionWidth:r:l>0?t.left+=l:u>0?t.left-=u:t.left=s(t.left-a,t.left)},top:function(t,e){var i,n=e.within,r=n.isWindow?n.scrollTop:n.offset.top,o=e.within.height,a=t.top-e.collisionPosition.marginTop,l=r-a,u=a+e.collisionHeight-o-r;e.collisionHeight>o?l>0&&0>=u?(i=t.top+l+e.collisionHeight-o-r,t.top+=l-i):t.top=u>0&&0>=l?r:l>u?r+o-e.collisionHeight:r:l>0?t.top+=l:u>0?t.top-=u:t.top=s(t.top-a,t.top)}},flip:{left:function(t,e){var i,n,r=e.within,s=r.offset.left+r.scrollLeft,a=r.width,l=r.isWindow?r.scrollLeft:r.offset.left,u=t.left-e.collisionPosition.marginLeft,c=u-l,h=u+e.collisionWidth-a-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(0>(i=t.left+d+p+f+e.collisionWidth-a-s)||o(c)>i)&&(t.left+=d+p+f):h>0&&((n=t.left-e.collisionPosition.marginLeft+d+p+f-l)>0||h>o(n))&&(t.left+=d+p+f)},top:function(t,e){var i,n,r=e.within,s=r.offset.top+r.scrollTop,a=r.height,l=r.isWindow?r.scrollTop:r.offset.top,u=t.top-e.collisionPosition.marginTop,c=u-l,h=u+e.collisionHeight-a-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(0>(n=t.top+p+f+g+e.collisionHeight-a-s)||o(c)>n)&&(t.top+=p+f+g):h>0&&((i=t.top-e.collisionPosition.marginTop+p+f+g-l)>0||h>o(i))&&(t.top+=p+f+g)}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,n){return!!t.data(e,n[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,n){var r,s,o,a,l,u=i.nodeName.toLowerCase();return"area"===u?(r=i.parentNode,s=r.name,!(!i.href||!s||"map"!==r.nodeName.toLowerCase())&&(o=t("img[usemap='#"+s+"']"),o.length>0&&o.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(u)?(a=!i.disabled)&&(l=t(i).closest("fieldset")[0])&&(a=!l.disabled):a="a"===u?i.href||n:n,a&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function n(e,i,n,s){return t.each(r,function(){i-=parseFloat(t.css(e,"padding"+this))||0,n&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),s&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var r="Width"===i?["Left","Right"]:["Top","Bottom"],s=i.toLowerCase(),o={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?o["inner"+i].call(this):this.each(function(){t(this).css(s,n(this,e)+"px")})},t.fn["outer"+i]=function(e,r){return"number"!=typeof e?o["outer"+i].call(this,e):this.each(function(){t(this).css(s,n(this,e,!0,r)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,n,r,s;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(r=this.eq(0).parents("label"),n=this.attr("id"),n&&(e=this.eq(0).parents().last(),s=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(n)+"']",r=r.add(s.find(i).addBack(i))),this.pushStack(r))},t.fn.scrollParent=function(e){var i=this.css("position"),n="absolute"===i,r=e?/(auto|scroll|hidden)/:/(auto|scroll)/,s=this.parents().filter(function(){var e=t(this);return(!n||"static"!==e.css("position"))&&r.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&s.length?s:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),n=null!=i;return(!n||i>=0)&&t.ui.focusable(e,n)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c=!1;t(document).on("mouseup",function(){c=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!c){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,n=1===e.which,r=!("string"!=typeof this.options.cancel||!e.target.nodeName)&&t(e.target).closest(this.options.cancel).length;return!(n&&!r&&this._mouseCapture(e))||(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=!1!==this._mouseStart(e),!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),c=!0,!0))}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,e),this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,c=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,n){var r,s=t.ui[e].prototype;for(r in n)s.plugins[r]=s.plugins[r]||[],s.plugins[r].push([i,n[r]])},call:function(t,e,i,n){var r,s=t.plugins[e];if(s&&(n||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(r=0;s.length>r;r++)t.options[s[r][0]]&&s[r][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?void(this.destroyOnClear=!0):(this._removeHandleClassName(),void this._mouseDestroy())},_mouseCapture:function(e){var i=this.options;return!(this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0)&&(this.handle=this._getHandle(e),!!this.handle&&(this._blurActiveElement(e),this._blockFrames(!0===i.iframeFix?"iframe":i.iframeFix),!0))},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("<div>").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]);t(e.target).closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),!1===this._trigger("start",e)?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var n=this._uiHash();if(!1===this._trigger("drag",e,n))return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=n.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,n=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(n=t.ui.ddmanager.drop(this,e)),this.dropped&&(n=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!n||"valid"===this.options.revert&&n||!0===this.options.revert||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,n)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){!1!==i._trigger("stop",e)&&i._clear()}):!1!==this._trigger("stop",e)&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return!this.options.handle||!!t(e.target).closest(this.element.find(this.options.handle)).length},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,n=t.isFunction(i.helper),r=n?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return r.parents("body").length||r.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),n&&r[0]===this.element[0]&&this._setPositionRelative(),r[0]===this.element[0]||/(fixed|absolute)/.test(r.css("position"))||r.css("position","absolute"),r},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,n,r=this.options,s=this.document[0];return this.relativeContainer=null,r.containment?"window"===r.containment?void(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||s.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]):"document"===r.containment?void(this.containment=[0,0,t(s).width()-this.helperProportions.width-this.margins.left,(t(s).height()||s.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]):r.containment.constructor===Array?void(this.containment=r.containment):("parent"===r.containment&&(r.containment=this.helper[0].parentNode),i=t(r.containment),void((n=i[0])&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(n.scrollWidth,n.offsetWidth):n.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(n.scrollHeight,n.offsetHeight):n.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i))):void(this.containment=null)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,n=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:n?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:n?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,n,r,s,o=this.options,a=this._isRootNode(this.scrollParent[0]),l=t.pageX,u=t.pageY;return a&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(n=this.relativeContainer.offset(),i=[this.containment[0]+n.left,this.containment[1]+n.top,this.containment[2]+n.left,this.containment[3]+n.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(l=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(u=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(u=i[3]+this.offset.click.top)),o.grid&&(r=o.grid[1]?this.originalPageY+Math.round((u-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,u=i?r-this.offset.click.top>=i[1]||r-this.offset.click.top>i[3]?r:r-this.offset.click.top>=i[1]?r-o.grid[1]:r+o.grid[1]:r,s=o.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,l=i?s-this.offset.click.left>=i[0]||s-this.offset.click.left>i[2]?s:s-this.offset.click.left>=i[0]?s-o.grid[0]:s+o.grid[0]:s),"y"===o.axis&&(l=this.originalPageX),"x"===o.axis&&(u=this.originalPageY)),{top:u-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:a?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:a?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,n){return n=n||this._uiHash(),t.ui.plugin.call(this,e,[i,n,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),n.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,n)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,n){var r=t.extend({},i,{item:n.element});n.sortables=[],t(n.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(n.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,r))})},stop:function(e,i,n){var r=t.extend({},i,{item:n.element});n.cancelHelperRemoval=!1,t.each(n.sortables,function(){var t=this;t.isOver?(t.isOver=0,n.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,r))})},drag:function(e,i,n){t.each(n.sortables,function(){var r=!1,s=this;s.positionAbs=n.positionAbs,s.helperProportions=n.helperProportions,s.offset.click=n.offset.click,s._intersectsWith(s.containerCache)&&(r=!0,t.each(n.sortables,function(){return this.positionAbs=n.positionAbs,this.helperProportions=n.helperProportions,this.offset.click=n.offset.click,this!==s&&this._intersectsWith(this.containerCache)&&t.contains(s.element[0],this.element[0])&&(r=!1),r})),r?(s.isOver||(s.isOver=1,n._parent=i.helper.parent(),s.currentItem=i.helper.appendTo(s.element).data("ui-sortable-item",!0),s.options._helper=s.options.helper,s.options.helper=function(){return i.helper[0]},e.target=s.currentItem[0],s._mouseCapture(e,!0),s._mouseStart(e,!0,!0),s.offset.click.top=n.offset.click.top,s.offset.click.left=n.offset.click.left,s.offset.parent.left-=n.offset.parent.left-s.offset.parent.left,s.offset.parent.top-=n.offset.parent.top-s.offset.parent.top,n._trigger("toSortable",e),n.dropped=s.element,t.each(n.sortables,function(){this.refreshPositions()}),n.currentItem=n.element,s.fromOutside=n),s.currentItem&&(s._mouseDrag(e),i.position=s.position)):s.isOver&&(s.isOver=0,s.cancelHelperRemoval=!0,s.options._revert=s.options.revert,s.options.revert=!1,s._trigger("out",e,s._uiHash(s)),s._mouseStop(e,!0),s.options.revert=s.options._revert,s.options.helper=s.options._helper,s.placeholder&&s.placeholder.remove(),i.helper.appendTo(n._parent),n._refreshOffsets(e),i.position=n._generatePosition(e,!0),n._trigger("fromSortable",e),n.dropped=!1,t.each(n.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,n){var r=t("body"),s=n.options;r.css("cursor")&&(s._cursor=r.css("cursor")),r.css("cursor",s.cursor)},stop:function(e,i,n){var r=n.options;r._cursor&&t("body").css("cursor",r._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,n){var r=t(i.helper),s=n.options;r.css("opacity")&&(s._opacity=r.css("opacity")),r.css("opacity",s.opacity)},stop:function(e,i,n){var r=n.options;r._opacity&&t(i.helper).css("opacity",r._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,n){var r=n.options,s=!1,o=n.scrollParentNotHidden[0],a=n.document[0];o!==a&&"HTML"!==o.tagName?(r.axis&&"x"===r.axis||(n.overflowOffset.top+o.offsetHeight-e.pageY<r.scrollSensitivity?o.scrollTop=s=o.scrollTop+r.scrollSpeed:e.pageY-n.overflowOffset.top<r.scrollSensitivity&&(o.scrollTop=s=o.scrollTop-r.scrollSpeed)),r.axis&&"y"===r.axis||(n.overflowOffset.left+o.offsetWidth-e.pageX<r.scrollSensitivity?o.scrollLeft=s=o.scrollLeft+r.scrollSpeed:e.pageX-n.overflowOffset.left<r.scrollSensitivity&&(o.scrollLeft=s=o.scrollLeft-r.scrollSpeed))):(r.axis&&"x"===r.axis||(e.pageY-t(a).scrollTop()<r.scrollSensitivity?s=t(a).scrollTop(t(a).scrollTop()-r.scrollSpeed):t(window).height()-(e.pageY-t(a).scrollTop())<r.scrollSensitivity&&(s=t(a).scrollTop(t(a).scrollTop()+r.scrollSpeed))),r.axis&&"y"===r.axis||(e.pageX-t(a).scrollLeft()<r.scrollSensitivity?s=t(a).scrollLeft(t(a).scrollLeft()-r.scrollSpeed):t(window).width()-(e.pageX-t(a).scrollLeft())<r.scrollSensitivity&&(s=t(a).scrollLeft(t(a).scrollLeft()+r.scrollSpeed)))),!1!==s&&t.ui.ddmanager&&!r.dropBehaviour&&t.ui.ddmanager.prepareOffsets(n,e)}}),t.ui.plugin.add("draggable","snap",{start:function(e,i,n){var r=n.options;n.snapElements=[],t(r.snap.constructor!==String?r.snap.items||":data(ui-draggable)":r.snap).each(function(){var e=t(this),i=e.offset();this!==n.element[0]&&n.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,n){var r,s,o,a,l,u,c,h,d,p,f=n.options,g=f.snapTolerance,m=i.offset.left,v=m+n.helperProportions.width,_=i.offset.top,y=_+n.helperProportions.height;for(d=n.snapElements.length-1;d>=0;d--)l=n.snapElements[d].left-n.margins.left,u=l+n.snapElements[d].width,c=n.snapElements[d].top-n.margins.top,h=c+n.snapElements[d].height,l-g>v||m>u+g||c-g>y||_>h+g||!t.contains(n.snapElements[d].item.ownerDocument,n.snapElements[d].item)?(n.snapElements[d].snapping&&n.options.snap.release&&n.options.snap.release.call(n.element,e,t.extend(n._uiHash(),{snapItem:n.snapElements[d].item})),n.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(r=g>=Math.abs(c-y),s=g>=Math.abs(h-_),o=g>=Math.abs(l-v),a=g>=Math.abs(u-m),r&&(i.position.top=n._convertPositionTo("relative",{top:c-n.helperProportions.height,left:0}).top),s&&(i.position.top=n._convertPositionTo("relative",{top:h,left:0}).top),o&&(i.position.left=n._convertPositionTo("relative",{top:0,left:l-n.helperProportions.width}).left),a&&(i.position.left=n._convertPositionTo("relative",{top:0,left:u}).left)),p=r||s||o||a,"outer"!==f.snapMode&&(r=g>=Math.abs(c-_),s=g>=Math.abs(h-y),o=g>=Math.abs(l-m),a=g>=Math.abs(u-v),r&&(i.position.top=n._convertPositionTo("relative",{top:c,left:0}).top),s&&(i.position.top=n._convertPositionTo("relative",{top:h-n.helperProportions.height,left:0}).top),o&&(i.position.left=n._convertPositionTo("relative",{top:0,left:l}).left),a&&(i.position.left=n._convertPositionTo("relative",{top:0,left:u-n.helperProportions.width}).left)),!n.snapElements[d].snapping&&(r||s||o||a||p)&&n.options.snap.snap&&n.options.snap.snap.call(n.element,e,t.extend(n._uiHash(),{snapItem:n.snapElements[d].item})),n.snapElements[d].snapping=r||s||o||a||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,n){var r,s=n.options,o=t.makeArray(t(s.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});o.length&&(r=parseInt(t(o[0]).css("zIndex"),10)||0,t(o).each(function(e){t(this).css("zIndex",r+e)}),this.css("zIndex",r+o.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,n){var r=t(i.helper),s=n.options;r.css("zIndex")&&(s._zIndex=r.css("zIndex")),r.css("zIndex",s.zIndex)},stop:function(e,i,n){var r=n.options;r._zIndex&&t(i.helper).css("zIndex",r._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,n=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(n)?n:function(t){return t.is(n)},this.proportions=function(){return arguments.length?void(e=arguments[0]):e||(e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight})},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var n=t.ui.ddmanager.droppables[this.options.scope];this._splice(n),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var n=i||t.ui.ddmanager.current,r=!1;return!(!n||(n.currentItem||n.element)[0]===this.element[0])&&(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===n.options.scope&&i.accept.call(i.element[0],n.currentItem||n.element)&&h(n,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(r=!0,!1):void 0}),!r&&(!!this.accept.call(this.element[0],n.currentItem||n.element)&&(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(n)),this.element)))},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var h=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,n,r){if(!i.offset)return!1;var s=(e.positionAbs||e.position.absolute).left+e.margins.left,o=(e.positionAbs||e.position.absolute).top+e.margins.top,a=s+e.helperProportions.width,l=o+e.helperProportions.height,u=i.offset.left,c=i.offset.top,h=u+i.proportions().width,d=c+i.proportions().height;switch(n){case"fit":return s>=u&&h>=a&&o>=c&&d>=l;case"intersect":return s+e.helperProportions.width/2>u&&h>a-e.helperProportions.width/2&&o+e.helperProportions.height/2>c&&d>l-e.helperProportions.height/2;case"pointer":return t(r.pageY,c,i.proportions().height)&&t(r.pageX,u,i.proportions().width);case"touch":return(o>=c&&d>=o||l>=c&&d>=l||c>o&&l>d)&&(s>=u&&h>=s||a>=u&&h>=a||u>s&&a>h);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{default:[]},prepareOffsets:function(e,i){var n,r,s=t.ui.ddmanager.droppables[e.options.scope]||[],o=i?i.type:null,a=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(n=0;s.length>n;n++)if(!(s[n].options.disabled||e&&!s[n].accept.call(s[n].element[0],e.currentItem||e.element))){for(r=0;a.length>r;r++)if(a[r]===s[n].element[0]){s[n].proportions().height=0;continue t}s[n].visible="none"!==s[n].element.css("display"),s[n].visible&&("mousedown"===o&&s[n]._activate.call(s[n],i),s[n].offset=s[n].element.offset(),s[n].proportions({width:s[n].element[0].offsetWidth,height:s[n].element[0].offsetHeight}))}},drop:function(e,i){var n=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&h(e,this,this.options.tolerance,i)&&(n=this._drop.call(this,i)||n),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),n},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var n,r,s,o=h(e,this,this.options.tolerance,i),a=!o&&this.isover?"isout":o&&!this.isover?"isover":null;a&&(this.options.greedy&&(r=this.options.scope,s=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===r}),s.length&&(n=t(s[0]).droppable("instance"),n.greedyChild="isover"===a)),n&&"isover"===a&&(n.isover=!1,n.isout=!0,n._out.call(n,i)),this[a]=!0,this["isout"===a?"isover":"isout"]=!1,this["isover"===a?"_over":"_out"].call(this,i),n&&"isout"===a&&(n.isout=!1,n.isover=!0,n._over.call(n,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},!1!==t.uiBackCompat&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var n=i&&"left"===i?"scrollLeft":"scrollTop",r=!1;return e[n]>0||(e[n]=1,r=e[n]>0,e[n]=0,r)},_create:function(){var e,i=this.options,n=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(n._removeClass("ui-resizable-autohide"),n._handles.show())}).on("mouseleave",function(){i.disabled||n.resizing||(n._addClass("ui-resizable-autohide"),n._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles()}},_setupHandles:function(){var e,i,n,r,s,o=this.options,a=this;if(this.handles=o.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),n=this.handles.split(","),this.handles={},i=0;n.length>i;i++)e=t.trim(n[i]),r="ui-resizable-"+e,s=t("<div>"),this._addClass(s,"ui-resizable-handle "+r),s.css({zIndex:o.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(s);this._renderAxis=function(e){var i,n,r,s;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:a._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(n=t(this.handles[i],this.element),s=/sw|ne|nw|se|n|s/.test(i)?n.outerHeight():n.outerWidth(),r=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(r,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){a.resizing||(this.className&&(s=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=s&&s[1]?s[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,n,r=!1;for(i in this.handles)((n=t(this.handles[i])[0])===e.target||t.contains(n,e.target))&&(r=!0);return!this.options.disabled&&r},_mouseStart:function(e){var i,n,r,s=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),n=this._num(this.helper.css("top")),s.containment&&(i+=t(s.containment).scrollLeft()||0,n+=t(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:n},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:n},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,r=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===r?this.axis+"-resize":r),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,n,r=this.originalMousePosition,s=this.axis,o=e.pageX-r.left||0,a=e.pageY-r.top||0,l=this._change[s];return this._updatePrevProperties(),!!l&&(i=l.apply(this,[e,o,a]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),n=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(n)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1)},_mouseStop:function(e){this.resizing=!1;var i,n,r,s,o,a,l,u=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,n=i.length&&/textarea/i.test(i[0].nodeName),r=n&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,s=n?0:c.sizeDiff.width,o={width:c.helper.width()-s,height:c.helper.height()-r},a=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,l=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,u.animate||this.element.css(t.extend(o,{top:l,left:a})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!u.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,n,r,s,o=this.options;s={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||t)&&(e=s.minHeight*this.aspectRatio,n=s.minWidth/this.aspectRatio,i=s.maxHeight*this.aspectRatio,r=s.maxWidth/this.aspectRatio,e>s.minWidth&&(s.minWidth=e),n>s.minHeight&&(s.minHeight=n),s.maxWidth>i&&(s.maxWidth=i),s.maxHeight>r&&(s.maxHeight=r)),this._vBoundaries=s},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,n=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===n&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===n&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,n=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,r=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,s=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,o=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,u=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return s&&(t.width=e.minWidth),o&&(t.height=e.minHeight),n&&(t.width=e.maxWidth),r&&(t.height=e.maxHeight),s&&u&&(t.left=a-e.minWidth),n&&u&&(t.left=a-e.maxWidth),o&&c&&(t.top=l-e.minHeight),r&&c&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],n=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],r=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(n[e])||0,i[e]+=parseFloat(r[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var n=this.originalSize;return{top:this.originalPosition.top+i,height:n.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,n){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,n]))},sw:function(e,i,n){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,n]))},ne:function(e,i,n){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,n]))},nw:function(e,i,n){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,n]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),n=i.options,r=i._proportionallyResizeElements,s=r.length&&/textarea/i.test(r[0].nodeName),o=s&&i._hasScroll(r[0],"left")?0:i.sizeDiff.height,a=s?0:i.sizeDiff.width,l={width:i.size.width-a,height:i.size.height-o},u=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(l,c&&u?{top:c,left:u}:{}),{duration:n.animateDuration,easing:n.animateEasing,step:function(){var n={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};r&&r.length&&t(r[0]).css({width:n.width,height:n.height}),i._updateCache(n),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,n,r,s,o,a,l=t(this).resizable("instance"),u=l.options,c=l.element,h=u.containment,d=h instanceof t?h.get(0):/parent/.test(h)?c.parent().get(0):h;d&&(l.containerElement=t(d),/document/.test(h)||h===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,n){i[t]=l._num(e.css("padding"+n))}),l.containerOffset=e.offset(),l.containerPosition=e.position(),l.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},n=l.containerOffset,r=l.containerSize.height,s=l.containerSize.width,o=l._hasScroll(d,"left")?d.scrollWidth:s,a=l._hasScroll(d)?d.scrollHeight:r,l.parentData={element:d,left:n.left,top:n.top,width:o,height:a}))},resize:function(e){var i,n,r,s,o=t(this).resizable("instance"),a=o.options,l=o.containerOffset,u=o.position,c=o._aspectRatio||e.shiftKey,h={top:0,left:0},d=o.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(h=l),u.left<(o._helper?l.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-l.left:o.position.left-h.left),c&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=a.helper?l.left:0),u.top<(o._helper?l.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-l.top:o.position.top),c&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?l.top:0),r=o.containerElement.get(0)===o.element.parent().get(0),s=/relative|absolute/.test(o.containerElement.css("position")),r&&s?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-h.left:o.offset.left-l.left)),n=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-h.top:o.offset.top-l.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,c&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),n+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-n,c&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,n=e.containerOffset,r=e.containerPosition,s=e.containerElement,o=t(e.helper),a=o.offset(),l=o.outerWidth()-e.sizeDiff.width,u=o.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(s.css("position"))&&t(this).css({left:a.left-r.left-n.left,width:l,height:u}),e._helper&&!i.animate&&/static/.test(s.css("position"))&&t(this).css({left:a.left-r.left-n.left,width:l,height:u})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var n=t(this).resizable("instance"),r=n.options,s=n.originalSize,o=n.originalPosition,a={height:n.size.height-s.height||0,width:n.size.width-s.width||0,top:n.position.top-o.top||0,left:n.position.left-o.left||0};t(r.alsoResize).each(function(){var e=t(this),n=t(this).data("ui-resizable-alsoresize"),r={},s=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(s,function(t,e){var i=(n[e]||0)+(a[e]||0);i&&i>=0&&(r[e]=i||null)}),e.css(r)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),!1!==t.uiBackCompat&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),n=i.options,r=i.size,s=i.originalSize,o=i.originalPosition,a=i.axis,l="number"==typeof n.grid?[n.grid,n.grid]:n.grid,u=l[0]||1,c=l[1]||1,h=Math.round((r.width-s.width)/u)*u,d=Math.round((r.height-s.height)/c)*c,p=s.width+h,f=s.height+d,g=n.maxWidth&&p>n.maxWidth,m=n.maxHeight&&f>n.maxHeight,v=n.minWidth&&n.minWidth>p,_=n.minHeight&&n.minHeight>f;n.grid=l,v&&(p+=u),_&&(f+=c),g&&(p-=u),m&&(f-=c),/^(se|s|e)$/.test(a)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(a)?(i.size.width=p,i.size.height=f,i.position.top=o.top-d):/^(sw)$/.test(a)?(i.size.width=p,i.size.height=f,i.position.left=o.left-h):((0>=f-c||0>=p-u)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=o.top-d):(f=c-e.height,i.size.height=f,i.position.top=o.top+s.height-f),p-u>0?(i.size.width=p,i.position.left=o.left-h):(p=u-e.width,i.size.width=p,i.position.left=o.left+s.width-p))}}),t.ui.resizable,t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),n=i.offset(),r={left:n.left-e.elementPos.left,top:n.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:r.left,top:r.top,right:r.left+i.outerWidth(),bottom:r.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("<div>"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,n=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(n.filter,this.element[0]),this._trigger("start",e),t(n.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),n.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var n=t.data(this,"selectable-item");n.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(n.$element,"ui-selected"),n.selected=!1,i._addClass(n.$element,"ui-unselecting"),n.unselecting=!0,i._trigger("unselecting",e,{unselecting:n.element}))}),t(e.target).parents().addBack().each(function(){var n,r=t.data(this,"selectable-item");return r?(n=!e.metaKey&&!e.ctrlKey||!r.$element.hasClass("ui-selected"),i._removeClass(r.$element,n?"ui-unselecting":"ui-selected")._addClass(r.$element,n?"ui-selecting":"ui-unselecting"),r.unselecting=!n,r.selecting=n,r.selected=n,n?i._trigger("selecting",e,{selecting:r.element}):i._trigger("unselecting",e,{unselecting:r.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,n=this,r=this.options,s=this.opos[0],o=this.opos[1],a=e.pageX,l=e.pageY;return s>a&&(i=a,a=s,s=i),o>l&&(i=l,l=o,o=i),this.helper.css({left:s,top:o,width:a-s,height:l-o}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),u=!1,c={};i&&i.element!==n.element[0]&&(c.left=i.left+n.elementPos.left,c.right=i.right+n.elementPos.left,c.top=i.top+n.elementPos.top,c.bottom=i.bottom+n.elementPos.top,"touch"===r.tolerance?u=!(c.left>a||s>c.right||c.top>l||o>c.bottom):"fit"===r.tolerance&&(u=c.left>s&&a>c.right&&c.top>o&&l>c.bottom),u?(i.selected&&(n._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(n._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(n._addClass(i.$element,"ui-selecting"),i.selecting=!0,n._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(n._removeClass(i.$element,"ui-selecting"),i.selecting=!1,n._addClass(i.$element,"ui-selected"),i.selected=!0):(n._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(n._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),n._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(n._removeClass(i.$element,"ui-selected"),i.selected=!1,n._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,n._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var n=t.data(this,"selectable-item");i._removeClass(n.$element,"ui-unselecting"),n.unselecting=!1,n.startselected=!1,i._trigger("unselected",e,{unselected:n.element})}),t(".ui-selecting",this.element[0]).each(function(){var n=t.data(this,"selectable-item");i._removeClass(n.$element,"ui-selecting")._addClass(n.$element,"ui-selected"),n.selecting=!1,n.selected=!0,n.startselected=!0,i._trigger("selected",e,{selected:n.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var n=null,r=!1,s=this;return!this.reverting&&(!this.options.disabled&&"static"!==this.options.type&&(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,s.widgetName+"-item")===s?(n=t(this),!1):void 0}),t.data(e.target,s.widgetName+"-item")===s&&(n=t(e.target)),!!n&&(!(this.options.handle&&!i&&(t(this.options.handle,n).find("*").addBack().each(function(){this===e.target&&(r=!0)}),!r))&&(this.currentItem=n,this._removeCurrentsFromItems(),!0))))},_mouseStart:function(e,i,n){var r,s,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(s=this.document.find("body"),this.storedCursor=s.css("cursor"),s.css("cursor",o.cursor),this.storedStylesheet=t("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(s)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!n)for(r=this.containers.length-1;r>=0;r--)this.containers[r]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!o.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,n,r,s,o=this.options,a=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=a=this.scrollParent[0].scrollTop+o.scrollSpeed:e.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=a=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=a=this.scrollParent[0].scrollLeft+o.scrollSpeed:e.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=a=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(e.pageY-this.document.scrollTop()<o.scrollSensitivity?a=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(e.pageY-this.document.scrollTop())<o.scrollSensitivity&&(a=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),e.pageX-this.document.scrollLeft()<o.scrollSensitivity?a=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(e.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(a=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),!1!==a&&t.ui.ddmanager&&!o.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(n=this.items[i],r=n.item[0],(s=this._intersectsWithPointer(n))&&n.instance===this.currentContainer&&r!==this.currentItem[0]&&this.placeholder[1===s?"next":"prev"]()[0]!==r&&!t.contains(this.placeholder[0],r)&&("semi-dynamic"!==this.options.type||!t.contains(this.element[0],r))){if(this.direction=1===s?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(n))break;this._rearrange(e,n),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var n=this,r=this.placeholder.offset(),s=this.options.axis,o={};s&&"x"!==s||(o.left=r.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),s&&"y"!==s||(o.top=r.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){n._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),n=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&n.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!n.length&&e.key&&n.push(e.key+"="),n.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),n=[];return e=e||{},i.each(function(){n.push(t(e.item||this).attr(e.attribute||"id")||"")}),n},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,n=this.positionAbs.top,r=n+this.helperProportions.height,s=t.left,o=s+t.width,a=t.top,l=a+t.height,u=this.offset.click.top,c=this.offset.click.left,h="x"===this.options.axis||n+u>a&&l>n+u,d="y"===this.options.axis||e+c>s&&o>e+c,p=h&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>s&&o>i-this.helperProportions.width/2&&n+this.helperProportions.height/2>a&&l>r-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,n="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),r="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width);return!(!n||!r)&&(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1))},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),r=this._getDragHorizontalDirection();return this.floating&&r?"right"===r&&i||"left"===r&&!i:n&&("down"===n&&e||"up"===n&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){a.push(this)}var n,r,s,o,a=[],l=[],u=this._connectWith();if(u&&e)for(n=u.length-1;n>=0;n--)for(s=t(u[n],this.document[0]),r=s.length-1;r>=0;r--)(o=t.data(s[r],this.widgetFullName))&&o!==this&&!o.options.disabled&&l.push([t.isFunction(o.options.items)?o.options.items.call(o.element):t(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),n=l.length-1;n>=0;n--)l[n][0].each(i);return t(a)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,n,r,s,o,a,l,u,c=this.items,h=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(r=t(d[i],this.document[0]),n=r.length-1;n>=0;n--)(s=t.data(r[n],this.widgetFullName))&&s!==this&&!s.options.disabled&&(h.push([t.isFunction(s.options.items)?s.options.items.call(s.element[0],e,{item:this.currentItem}):t(s.options.items,s.element),s]),this.containers.push(s));for(i=h.length-1;i>=0;i--)for(o=h[i][1],a=h[i][0],n=0,u=a.length;u>n;n++)l=t(a[n]),l.data(this.widgetName+"-item",o),c.push({item:l,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=!!this.items.length&&("x"===this.options.axis||this._isFloating(this.items[0].item)),this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,n,r,s;for(i=this.items.length-1;i>=0;i--)n=this.items[i],n.instance!==this.currentContainer&&this.currentContainer&&n.item[0]!==this.currentItem[0]||(r=this.options.toleranceElement?t(this.options.toleranceElement,n.item):n.item,e||(n.width=r.outerWidth(),n.height=r.outerHeight()),s=r.offset(),n.left=s.left,n.top=s.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)s=this.containers[i].element.offset(),this.containers[i].containerCache.left=s.left,this.containers[i].containerCache.top=s.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,n=e.options;n.placeholder&&n.placeholder.constructor!==String||(i=n.placeholder,n.placeholder={element:function(){var n=e.currentItem[0].nodeName.toLowerCase(),r=t("<"+n+">",e.document[0]);return e._addClass(r,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(r,"ui-sortable-helper"),"tbody"===n?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("<tr>",e.document[0]).appendTo(r)):"tr"===n?e._createTrPlaceholder(e.currentItem,r):"img"===n&&r.attr("src",e.currentItem.attr("src")),i||r.css("visibility","hidden"),r},update:function(t,r){(!i||n.forcePlaceholderSize)&&(r.height()||r.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),r.width()||r.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(n.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),n.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var n=this;e.children().each(function(){t("<td>&#160;</td>",n.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,n,r,s,o,a,l,u,c,h,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(r=1e4,s=null,c=d.floating||this._isFloating(this.currentItem),o=c?"left":"top",a=c?"width":"height",h=c?"pageX":"pageY",n=this.items.length-1;n>=0;n--)t.contains(this.containers[p].element[0],this.items[n].item[0])&&this.items[n].item[0]!==this.currentItem[0]&&(l=this.items[n].item.offset()[o],u=!1,e[h]-l>this.items[n][a]/2&&(u=!0),r>Math.abs(e[h]-l)&&(r=Math.abs(e[h]-l),s=this.items[n],this.direction=u?"up":"down"));if(!s&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return void(this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1));s?this._rearrange(e,s,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,n=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return n.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(n[0]),n[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!n[0].style.width||i.forceHelperSize)&&n.width(this.currentItem.width()),(!n[0].style.height||i.forceHelperSize)&&n.height(this.currentItem.height()),n},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,n,r=this.options;"parent"===r.containment&&(r.containment=this.helper[0].parentNode),("document"===r.containment||"window"===r.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===r.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===r.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(r.containment)||(e=t(r.containment)[0],i=t(r.containment).offset(),n="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(n?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(n?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var n="absolute"===e?1:-1,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,s=/(html|body)/i.test(r[0].tagName);return{top:i.top+this.offset.relative.top*n+this.offset.parent.top*n-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():s?0:r.scrollTop())*n,left:i.left+this.offset.relative.left*n+this.offset.parent.left*n-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():s?0:r.scrollLeft())*n}},_generatePosition:function(e){var i,n,r=this.options,s=e.pageX,o=e.pageY,a="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(a[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(s=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(s=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),r.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/r.grid[1])*r.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-r.grid[1]:i+r.grid[1]:i,n=this.originalPageX+Math.round((s-this.originalPageX)/r.grid[0])*r.grid[0],s=this.containment?n-this.offset.click.left>=this.containment[0]&&n-this.offset.click.left<=this.containment[2]?n:n-this.offset.click.left>=this.containment[0]?n-r.grid[0]:n+r.grid[0]:n)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:a.scrollTop()),left:s-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:a.scrollLeft())}},_rearrange:function(t,e,i,n){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var r=this.counter;this._delay(function(){r===this.counter&&this.refreshPositions(!n)})},_clear:function(t,e){function i(t,e,i){return function(n){i._trigger(t,n,e._uiHash(e))}}this.reverting=!1;var n,r=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(n in this._storedCSS)("auto"===this._storedCSS[n]||"static"===this._storedCSS[n])&&(this._storedCSS[n]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&r.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||r.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(r.push(function(t){this._trigger("remove",t,this._uiHash())}),r.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),r.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),n=this.containers.length-1;n>=0;n--)e||r.push(i("deactivate",this,this.containers[n])),this.containers[n].containerCache.over&&(r.push(i("out",this,this.containers[n])),this.containers[n].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(n=0;r.length>n;n++)r[n].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){!1===t.Widget.prototype._trigger.apply(this,arguments)&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||!1!==e.active&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,n=this.options.icons;n&&(e=t("<span>"),this._addClass(e,"ui-accordion-header-icon","ui-icon "+n.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,n.header)._addClass(i,null,n.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?void this._activate(e):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||!1!==this.options.active||this._activate(0),void("icons"===t&&(this._destroyIcons(),e&&this._createIcons())))},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,n=this.headers.length,r=this.headers.index(e.target),s=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:s=this.headers[(r+1)%n];break;case i.LEFT:case i.UP:s=this.headers[(r-1+n)%n];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:s=this.headers[0];break;case i.END:s=this.headers[n-1]}s&&(t(e.target).attr("tabIndex",-1),t(s).attr("tabIndex",0),t(s).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),!1===e.active&&!0===e.collapsible||!this.headers.length?(e.active=!1,this.active=t()):!1===e.active?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,n=i.heightStyle,r=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),n=e.next(),r=n.uniqueId().attr("id");e.attr("aria-controls",r),n.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===n?(e=r.height(),this.element.siblings(":visible").each(function(){var i=t(this),n=i.css("position");"absolute"!==n&&"fixed"!==n&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===n&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,n,r=this.options,s=this.active,o=t(e.currentTarget),a=o[0]===s[0],l=a&&r.collapsible,u=l?t():o.next(),c=s.next(),h={oldHeader:s,oldPanel:c,newHeader:l?t():o,newPanel:u};e.preventDefault(),a&&!r.collapsible||!1===this._trigger("beforeActivate",e,h)||(r.active=!l&&this.headers.index(o),this.active=a?t():o,this._toggle(h),this._removeClass(s,"ui-accordion-header-active","ui-state-active"),r.icons&&(i=s.children(".ui-accordion-header-icon"),this._removeClass(i,null,r.icons.activeHeader)._addClass(i,null,r.icons.header)),a||(this._removeClass(o,"ui-accordion-header-collapsed")._addClass(o,"ui-accordion-header-active","ui-state-active"),r.icons&&(n=o.children(".ui-accordion-header-icon"),this._removeClass(n,null,r.icons.header)._addClass(n,null,r.icons.activeHeader)),this._addClass(o.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,n=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=n,this.options.animate?this._animate(i,n,e):(n.hide(),i.show(),this._toggleComplete(e)),n.attr({"aria-hidden":"true"}),n.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&n.length?n.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var n,r,s,o=this,a=0,l=t.css("box-sizing"),u=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},h=u&&c.down||c,d=function(){o._toggleComplete(i)};return"number"==typeof h&&(s=h),"string"==typeof h&&(r=h),r=r||h.easing||c.easing,s=s||h.duration||c.duration,e.length?t.length?(n=t.show().outerHeight(),e.animate(this.hideProps,{duration:s,easing:r,step:function(t,e){e.now=Math.round(t)}}),void t.hide().animate(this.showProps,{duration:s,easing:r,complete:d,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?"content-box"===l&&(a+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(n-e.outerHeight()-a),a=0)}})):e.animate(this.hideProps,s,r,d):t.animate(this.showProps,s,r,d)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,"ui-accordion-content-active"),this._removeClass(i,"ui-accordion-header-active")._addClass(i,"ui-accordion-header-collapsed"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}}),t.widget("ui.menu",{version:"1.12.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),n=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&n.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),n=t(e.currentTarget);i[0]===n[0]&&(this._removeClass(n.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,n))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]))&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,n,r,s,o=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:o=!1,n=this.previousFilter||"",s=!1,r=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),r===n?s=!0:r=n+r,i=this._filterMenuItems(r),i=s&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(r=String.fromCharCode(e.keyCode),i=this._filterMenuItems(r)),i.length?(this.focus(e,i),this.previousFilter=r,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,n,r,s,o=this,a=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),n=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),n=t("<span>").data("ui-menu-submenu-caret",!0);o._addClass(n,"ui-menu-icon","ui-icon "+a),i.attr("aria-haspopup","true").prepend(n),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(n,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);o._isDivider(e)&&o._addClass(e,"ui-menu-divider","ui-widget-content")}),r=i.not(".ui-menu-item, .ui-menu-divider"),s=r.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(r,"ui-menu-item")._addClass(s,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,n,r;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),n=this.active.children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",n.attr("id")),r=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(r,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,n,r,s,o,a;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,n=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,r=e.offset().top-this.activeMenu.offset().top-i-n,s=this.activeMenu.scrollTop(),o=this.activeMenu.height(),a=e.outerHeight(),0>r?this.activeMenu.scrollTop(s+r):r+a>o&&this.activeMenu.scrollTop(s+r-o+a))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var n=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));n.length||(n=this.element),this._close(n),this.blur(e),this._removeClass(n.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=n},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var n;this.active&&(n="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),n&&n.length&&this.active||(n=this.activeMenu.find(this.options.items)[e]()),this.focus(i,n)},nextPage:function(e){var i,n,r;return this.active?void(this.isLastItem()||(this._hasScroll()?(n=this.active.offset().top,r=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-n-r}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]()))):void this.next(e)},previousPage:function(e){var i,n,r;return this.active?void(this.isFirstItem()||(this._hasScroll()?(n=this.active.offset().top,r=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-n+r>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first()))):void this.next(e)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)},_filterMenuItems:function(e){var i=e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),n=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return n.test(t.trim(t(this).children(".ui-menu-item-wrapper").text()))})}}),t.widget("ui.autocomplete",{version:"1.12.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,n,r=this.element[0].nodeName.toLowerCase(),s="textarea"===r,o="input"===r;this.isMultiLine=s||!o&&this._isContentEditable(this.element),this.valueMethod=this.element[s||o?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(r){if(this.element.prop("readOnly"))return e=!0,n=!0,void(i=!0);e=!1,n=!1,i=!1;var s=t.ui.keyCode;switch(r.keyCode){case s.PAGE_UP:e=!0,this._move("previousPage",r);break;case s.PAGE_DOWN:e=!0,this._move("nextPage",r);break;case s.UP:e=!0,this._keyEvent("previous",r);break;case s.DOWN:e=!0,this._keyEvent("next",r);break;case s.ENTER:this.menu.active&&(e=!0,r.preventDefault(),this.menu.select(r));break;case s.TAB:this.menu.active&&this.menu.select(r);break;case s.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(r),r.preventDefault());break;default:i=!0,this._searchTimeout(r)}},keypress:function(n){if(e)return e=!1,void((!this.isMultiLine||this.menu.element.is(":visible"))&&n.preventDefault());if(!i){var r=t.ui.keyCode;switch(n.keyCode){case r.PAGE_UP:this._move("previousPage",n);break;case r.PAGE_DOWN:this._move("nextPage",n);break;case r.UP:this._keyEvent("previous",n);break;case r.DOWN:this._keyEvent("next",n)}}},input:function(t){return n?(n=!1,void t.preventDefault()):void this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?void delete this.cancelBlur:(clearTimeout(this.searching),this.close(t),void this._change(t))}}),this._initSource(),this.menu=t("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var n,r;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),void this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)})):(r=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:r})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(r.value),void((n=i.item.attr("aria-label")||r.value)&&t.trim(n).length&&(this.liveRegion.children().hide(),t("<div>").text(n).appendTo(this.liveRegion))))},menuselect:function(e,i){var n=i.item.data("ui-autocomplete-item"),r=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger("select",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=t("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,n=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,n){n(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,r){n.xhr&&n.xhr.abort(),n.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){r(t)},error:function(){r([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),n=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!n)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):!1!==this._trigger("search",e)?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return t.proxy(function(t){e===this.requestIndex&&this.__response(t),--this.pending||this._removeClass("ui-autocomplete-loading")},this)},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({},e,{label:e.label||e.value,value:e.value||e.label})})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var n=this;t.each(i,function(t,i){n._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<div>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e):void this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var n=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return n.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("<div>").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var d=/ui-corner-([a-z]){2,6}/g;t.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"<div>",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(n,r){var s,o={};return r?"controlgroupLabel"===n?(s=e.element.find(r),s.each(function(){var e=t(this);e.children(".ui-controlgroup-label-contents").length||e.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>")}),e._addClass(s,null,"ui-widget ui-widget-content ui-state-default"),void(i=i.concat(s.get()))):void(t.fn[n]&&(o=e["_"+n+"Options"]?e["_"+n+"Options"]("middle"):{classes:{}},e.element.find(r).each(function(){var r=t(this),s=r[n]("instance"),a=t.widget.extend({},o);if("button"!==n||!r.parent(".ui-spinner").length){s||(s=r[n]()[n]("instance")),s&&(a.classes=e._resolveClassesValues(a.classes,s)),r[n](a);var l=r[n]("widget");t.data(l[0],"ui-controlgroup-data",s||r[n]("instance")),i.push(l[0])}}))):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),n=i.data("ui-controlgroup-data");n&&n[e]&&n[e]()})},_updateCornerClass:function(t,e){var i=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all"),this._addClass(t,null,i)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,n={classes:{}};return n.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],n},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,"ui-spinner");return e.classes["ui-spinner-up"]="",e.classes["ui-spinner-down"]="",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:!!e&&"auto",classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(e,i){var n={};return t.each(e,function(r){var s=i.options.classes[r]||"";s=t.trim(s.replace(d,"")),n[r]=(s+" "+e[r]).replace(/\s+/g," ")}),n},_setOption:function(t,e){return"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"===t?void this._callChildMethod(e?"disable":"enable"):void this.refresh()},refresh:function(){var e,i=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(":visible")),e.length&&(t.each(["first","last"],function(t,n){var r=e[n]().data("ui-controlgroup-data");if(r&&i["_"+r.widgetName+"Options"]){var s=i["_"+r.widgetName+"Options"](1===e.length?"only":n);s.classes=i._resolveClassesValues(s.classes,r),r.element[r.widgetName](s)}else i._updateCornerClass(e[n](),n)}),this._callChildMethod("refresh"))}}),t.widget("ui.checkboxradio",[t.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var e,i,n=this,r=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){n.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(r.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(r.disabled=e),r},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===e&&/radio|checkbox/.test(this.type)||t.error("Can't create checkboxradio on element.nodeName="+e+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,n="input[name='"+t.ui.escapeSelector(i)+"']";return i?(e=this.form.length?t(this.form[0].elements).filter(n):t(n).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",e),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",e)._toggleClass(this.icon,null,"ui-icon-blank",!e),"radio"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio("instance");e&&e._removeClass(e.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return"label"!==t||e?(this._super(t,e),"disabled"===t?(this._toggleClass(this.label,null,"ui-state-disabled",e),void(this.element[0].disabled=e)):void this.refresh()):void 0},_updateIcon:function(e){var i="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=t("<span>"),this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(i+=e?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,e?"ui-icon-blank":"ui-icon-check")):i+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",i),e||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget("ui.button",{version:"1.12.1",defaultElement:"<button>",options:{classes:{"ui-button":"ui-corner-all"},disabled:null,icon:null,iconPosition:"beginning",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is("input"),t=this.element[0].disabled,null!=t&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr("title"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass("ui-button","ui-widget"),this._setOption("disabled",this.options.disabled),this._enhance(),this.element.is("a")&&this._on({keyup:function(e){e.keyCode===t.ui.keyCode.SPACE&&(e.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger("click"))}})},_enhance:function(){this.element.is("button")||this.element.attr("role","button"),this.options.icon&&(this._updateIcon("icon",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr("title"),this.options.showLabel||this.title||this.element.attr("title",this.options.label)},_updateIcon:function(e,i){var n="iconPosition"!==e,r=n?this.options.iconPosition:i,s="top"===r||"bottom"===r;this.icon?n&&this._removeClass(this.icon,null,this.options.icon):(this.icon=t("<span>"),this._addClass(this.icon,"ui-button-icon","ui-icon"),this.options.showLabel||this._addClass("ui-button-icon-only")),n&&this._addClass(this.icon,null,i),this._attachIcon(r),s?(this._addClass(this.icon,null,"ui-widget-icon-block"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-button-icon-space")),this._removeClass(this.icon,null,"ui-wiget-icon-block"),this._attachIconSpace(r))},_destroy:function(){this.element.removeAttr("role"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr("title")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?"before":"after"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?"append":"prepend"](this.icon)},_setOptions:function(t){var e=void 0===t.showLabel?this.options.showLabel:t.showLabel,i=void 0===t.icon?this.options.icon:t.icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){"icon"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),"iconPosition"===t&&this._updateIcon(t,e),"showLabel"===t&&(this._toggleClass("ui-button-icon-only",null,!e),this._updateTooltip()),"label"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),"disabled"===t&&(this._toggleClass(null,"ui-state-disabled",e),this.element[0].disabled=e,e&&this.element.blur())},refresh:function(){var t=this.element.is("input, button")?this.element[0].disabled:this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),!1!==t.uiBackCompat&&(t.widget("ui.button",t.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition="end"),this._super()},_setOption:function(t,e){return"text"===t?void this._super("showLabel",e):("showLabel"===t&&(this.options.text=e),"icon"===t&&(this.options.icons.primary=e),"icons"===t&&(e.primary?(this._super("icon",e.primary),this._super("iconPosition","beginning")):e.secondary&&(this._super("icon",e.secondary),this._super("iconPosition","end"))),void this._superApply(arguments))}}),t.fn.button=function(e){return function(){return!this.length||this.length&&"INPUT"!==this[0].tagName||this.length&&"INPUT"===this[0].tagName&&"checkbox"!==this.attr("type")&&"radio"!==this.attr("type")?e.apply(this,arguments):(t.ui.checkboxradio||t.error("Checkboxradio widget missing"),0===arguments.length?this.checkboxradio({icon:!1}):this.checkboxradio.apply(this,arguments))}}(t.fn.button),t.fn.buttonset=function(){return t.ui.controlgroup||t.error("Controlgroup widget missing"),"option"===arguments[0]&&"items"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],"items.button",arguments[2]]):"option"===arguments[0]&&"items"===arguments[1]?this.controlgroup.apply(this,[arguments[0],"items.button"]):("object"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))}),t.ui.button,t.extend(t.ui,{datepicker:{version:"1.12.1"}});var p;t.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return o(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var n,r,s;n=e.nodeName.toLowerCase(),r="div"===n||"span"===n,e.id||(this.uuid+=1,e.id="dp"+this.uuid),s=this._newInst(t(e),r),s.settings=t.extend({},i||{}),"input"===n?this._connectDatepicker(e,s):r&&this._inlineDatepicker(e,s)},_newInst:function(e,i){return{id:e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1"),input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?r(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var n=t(e);i.append=t([]),i.trigger=t([]),n.hasClass(this.markerClassName)||(this._attachments(n,i),n.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(i),t.data(e,"datepicker",i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var n,r,s,o=this._get(i,"appendText"),a=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=t("<span class='"+this._appendClass+"'>"+o+"</span>"),e[a?"before":"after"](i.append)),e.off("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),n=this._get(i,"showOn"),("focus"===n||"both"===n)&&e.on("focus",this._showDatepicker),("button"===n||"both"===n)&&(r=this._get(i,"buttonText"),s=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:s,alt:r,title:r}):t("<button type='button'></button>").addClass(this._triggerClass).html(s?t("<img/>").attr({src:s,alt:r,title:r}):r)),e[a?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,n,r,s=new Date(2009,11,20),o=this._get(t,"dateFormat");o.match(/[DM]/)&&(e=function(t){for(i=0,n=0,r=0;t.length>r;r++)t[r].length>i&&(i=t[r].length,n=r);return n},s.setMonth(e(this._get(t,o.match(/MM/)?"monthNames":"monthNamesShort"))),s.setDate(e(this._get(t,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-s.getDay())),t.input.attr("size",this._formatDate(t,s).length)}},_inlineDatepicker:function(e,i){var n=t(e);n.hasClass(this.markerClassName)||(n.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,n,r,s){var a,l,u,c,h,d=this._dialogInst;return d||(this.uuid+=1,a="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+a+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),o(d.settings,r||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=s?s.length?s:[s.pageX,s.pageY]:null,this._pos||(l=document.documentElement.clientWidth,u=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,h=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+c,u/2-150+h]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=n,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,n=t(e),r=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(r.append.remove(),r.trigger.remove(),n.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&n.removeClass(this.markerClassName).empty(),p===r&&(p=null))},_enableDatepicker:function(e){var i,n,r=t(e),s=t.data(e,"datepicker");r.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,s.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(n=r.children("."+this._inlineClass),n.children().removeClass("ui-state-disabled"),n.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,n,r=t(e),s=t.data(e,"datepicker");r.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,s.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(n=r.children("."+this._inlineClass),n.children().addClass("ui-state-disabled"),n.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(t){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,n){var r,s,a,l,u=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):u?"all"===i?t.extend({},u.settings):this._get(u,i):null:(r=i||{},"string"==typeof i&&(r={},r[i]=n),void(u&&(this._curInst===u&&this._hideDatepicker(),s=this._getDateDatepicker(e,!0),a=this._getMinMaxDate(u,"min"),l=this._getMinMaxDate(u,"max"),o(u.settings,r),null!==a&&void 0!==r.dateFormat&&void 0===r.minDate&&(u.settings.minDate=this._formatDate(u,a)),null!==l&&void 0!==r.dateFormat&&void 0===r.maxDate&&(u.settings.maxDate=this._formatDate(u,l)),"disabled"in r&&(r.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),u),this._autoSize(u),this._setDate(u,s),this._updateAlternate(u),this._updateDatepicker(u))))},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,n,r,s=t.datepicker._getInst(e.target),o=!0,a=s.dpDiv.is(".ui-datepicker-rtl");if(s._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),o=!1;break;case 13:return r=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",s.dpDiv),r[0]&&t.datepicker._selectDay(e.target,s.selectedMonth,s.selectedYear,r[0]),i=t.datepicker._get(s,"onSelect"),i?(n=t.datepicker._formatDate(s),i.apply(s.input?s.input[0]:null,[n,s])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(s,"stepBigMonths"):-t.datepicker._get(s,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(s,"stepBigMonths"):+t.datepicker._get(s,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),o=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),o=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,a?1:-1,"D"),o=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(s,"stepBigMonths"):-t.datepicker._get(s,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),o=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,a?-1:1,"D"),o=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(s,"stepBigMonths"):+t.datepicker._get(s,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),o=e.ctrlKey||e.metaKey;break;default:o=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):o=!1;o&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,n,r=t.datepicker._getInst(e.target);return t.datepicker._get(r,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(r,"dateFormat")),n=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">n||!i||i.indexOf(n)>-1):void 0},_doKeyUp:function(e){var i=t.datepicker._getInst(e.target);if(i.input.val()!==i.lastVal)try{t.datepicker.parseDate(t.datepicker._get(i,"dateFormat"),i.input?i.input.val():null,t.datepicker._getFormatConfig(i))&&(t.datepicker._setDateFromField(i),t.datepicker._updateAlternate(i),t.datepicker._updateDatepicker(i))}catch(t){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var n,r,s,a,l,u,c;n=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==n&&(t.datepicker._curInst.dpDiv.stop(!0,!0),n&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),r=t.datepicker._get(n,"beforeShow"),!1!==(s=r?r.apply(e,[e,n]):{})&&(o(n.settings,s),n.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(n),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),a=!1,t(e).parents().each(function(){return!(a|="fixed"===t(this).css("position"))}),l={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,n.dpDiv.empty(),n.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(n),l=t.datepicker._checkOffset(n,l,a),n.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":a?"fixed":"absolute",display:"none",left:l.left+"px",top:l.top+"px"}),n.inline||(u=t.datepicker._get(n,"showAnim"),c=t.datepicker._get(n,"duration"),n.dpDiv.css("z-index",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[u]?n.dpDiv.show(u,t.datepicker._get(n,"showOptions"),c):n.dpDiv[u||"show"](u?c:null),t.datepicker._shouldFocusInput(n)&&n.input.trigger("focus"),t.datepicker._curInst=n))}},_updateDatepicker:function(e){this.maxRows=4,p=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,n=this._getNumberOfMonths(e),r=n[1],o=e.dpDiv.find("."+this._dayOverClass+" a");o.length>0&&s.apply(o.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),r>1&&e.dpDiv.addClass("ui-datepicker-multi-"+r).css("width",17*r+"em"),e.dpDiv[(1!==n[0]||1!==n[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,n){var r=e.dpDiv.outerWidth(),s=e.dpDiv.outerHeight(),o=e.input?e.input.outerWidth():0,a=e.input?e.input.outerHeight():0,l=document.documentElement.clientWidth+(n?0:t(document).scrollLeft()),u=document.documentElement.clientHeight+(n?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?r-o:0,i.left-=n&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=n&&i.top===e.input.offset().top+a?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+r>l&&l>r?Math.abs(i.left+r-l):0),i.top-=Math.min(i.top,i.top+s>u&&u>s?Math.abs(s+a):0),i},_findPos:function(e){for(var i,n=this._getInst(e),r=this._get(n,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[r?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,n,r,s,o=this._curInst;!o||e&&o!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),n=this._get(o,"duration"),r=function(){t.datepicker._tidyDialog(o)},t.effects&&(t.effects.effect[i]||t.effects[i])?o.dpDiv.hide(i,t.datepicker._get(o,"showOptions"),n,r):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?n:null,r),i||r(),this._datepickerShowing=!1,s=this._get(o,"onClose"),s&&s.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),n=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==n)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,n){var r=t(e),s=this._getInst(r[0]);this._isDisabledDatepicker(r[0])||(this._adjustInstDate(s,i+("M"===n?this._get(s,"showCurrentAtPos"):0),n),this._updateDatepicker(s))},_gotoToday:function(e){var i,n=t(e),r=this._getInst(n[0]);this._get(r,"gotoCurrent")&&r.currentDay?(r.selectedDay=r.currentDay,r.drawMonth=r.selectedMonth=r.currentMonth,r.drawYear=r.selectedYear=r.currentYear):(i=new Date,r.selectedDay=i.getDate(),r.drawMonth=r.selectedMonth=i.getMonth(),r.drawYear=r.selectedYear=i.getFullYear()),this._notifyChange(r),this._adjustDate(n)},_selectMonthYear:function(e,i,n){var r=t(e),s=this._getInst(r[0]);s["selected"+("M"===n?"Month":"Year")]=s["draw"+("M"===n?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(s),this._adjustDate(r)},_selectDay:function(e,i,n,r){var s,o=t(e);t(r).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(s=this._getInst(o[0]),s.selectedDay=s.currentDay=t("a",r).html(),s.selectedMonth=s.currentMonth=i,s.selectedYear=s.currentYear=n,this._selectDate(e,this._formatDate(s,s.currentDay,s.currentMonth,s.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var n,r=t(e),s=this._getInst(r[0]);i=null!=i?i:this._formatDate(s),s.input&&s.input.val(i),this._updateAlternate(s),n=this._get(s,"onSelect"),n?n.apply(s.input?s.input[0]:null,[i,s]):s.input&&s.input.trigger("change"),s.inline?this._updateDatepicker(s):(this._hideDatepicker(),this._lastInput=s.input[0],"object"!=typeof s.input[0]&&s.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,n,r,s=this._get(e,"altField");s&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),n=this._getDate(e),r=this.formatDate(i,n,this._getFormatConfig(e)),t(s).val(r))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,n){if(null==e||null==i)throw"Invalid arguments";if(""===(i="object"==typeof i?""+i:i+""))return null;var r,s,o,a,l=0,u=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof u?u:(new Date).getFullYear()%100+parseInt(u,10),h=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,d=(n?n.dayNames:null)||this._defaults.dayNames,p=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,f=(n?n.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,v=-1,_=-1,y=!1,b=function(t){var i=e.length>r+1&&e.charAt(r+1)===t;return i&&r++,i},w=function(t){var e=b(t),n="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,r="y"===t?n:1,s=RegExp("^\\d{"+r+","+n+"}"),o=i.substring(l).match(s);if(!o)throw"Missing number at position "+l;return l+=o[0].length,parseInt(o[0],10)},x=function(e,n,r){var s=-1,o=t.map(b(e)?r:n,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(o,function(t,e){var n=e[1];return i.substr(l,n.length).toLowerCase()===n.toLowerCase()?(s=e[0],l+=n.length,!1):void 0}),-1!==s)return s+1;throw"Unknown name at position "+l},C=function(){if(i.charAt(l)!==e.charAt(r))throw"Unexpected literal at position "+l;l++};for(r=0;e.length>r;r++)if(y)"'"!==e.charAt(r)||b("'")?C():y=!1;else switch(e.charAt(r)){case"d":v=w("d");break;case"D":x("D",h,d);break;case"o":_=w("o");break;case"m":m=w("m");break;case"M":m=x("M",p,f);break;case"y":g=w("y");break;case"@":a=new Date(w("@")),g=a.getFullYear(),m=a.getMonth()+1,v=a.getDate();break;case"!":a=new Date((w("!")-this._ticksTo1970)/1e4),g=a.getFullYear(),m=a.getMonth()+1,v=a.getDate();break;case"'":b("'")?C():y=!0;break;default:C()}if(i.length>l&&(o=i.substr(l),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),_>-1)for(m=1,v=_;!((s=this._getDaysInMonth(g,m-1))>=v);)m++,v-=s;if(a=this._daylightSavingAdjust(new Date(g,m-1,v)),a.getFullYear()!==g||a.getMonth()+1!==m||a.getDate()!==v)throw"Invalid date";return a},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:864e9*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var n,r=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,s=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,a=(i?i.monthNames:null)||this._defaults.monthNames,l=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},u=function(t,e,i){var n=""+e;if(l(t))for(;i>n.length;)n="0"+n;return n},c=function(t,e,i,n){return l(t)?n[e]:i[e]},h="",d=!1;if(e)for(n=0;t.length>n;n++)if(d)"'"!==t.charAt(n)||l("'")?h+=t.charAt(n):d=!1;else switch(t.charAt(n)){case"d":h+=u("d",e.getDate(),2);break;case"D":h+=c("D",e.getDay(),r,s);break;case"o":h+=u("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":h+=u("m",e.getMonth()+1,2);break;case"M":h+=c("M",e.getMonth(),o,a);break;case"y":h+=l("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":h+=e.getTime();break;case"!":h+=1e4*e.getTime()+this._ticksTo1970;break;case"'":l("'")?h+="'":d=!0;break;default:h+=t.charAt(n)}return h},_possibleChars:function(t){var e,i="",n=!1,r=function(i){var n=t.length>e+1&&t.charAt(e+1)===i;return n&&e++,n};for(e=0;t.length>e;e++)if(n)"'"!==t.charAt(e)||r("'")?i+=t.charAt(e):n=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":r("'")?i+="'":n=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),n=t.lastVal=t.input?t.input.val():null,r=this._getDefaultDate(t),s=r,o=this._getFormatConfig(t);try{s=this.parseDate(i,n,o)||r}catch(t){n=e?"":n}t.selectedDay=s.getDate(),t.drawMonth=t.selectedMonth=s.getMonth(),t.drawYear=t.selectedYear=s.getFullYear(),t.currentDay=n?s.getDate():0,t.currentMonth=n?s.getMonth():0,t.currentYear=n?s.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,n){var r=null==i||""===i?n:"string"==typeof i?function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(t){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,r=n.getFullYear(),s=n.getMonth(),o=n.getDate(),a=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=a.exec(i);l;){switch(l[2]||"d"){case"d":case"D":o+=parseInt(l[1],10);break;case"w":case"W":o+=7*parseInt(l[1],10);break;case"m":case"M":s+=parseInt(l[1],10),o=Math.min(o,t.datepicker._getDaysInMonth(r,s));break;case"y":case"Y":r+=parseInt(l[1],10),o=Math.min(o,t.datepicker._getDaysInMonth(r,s))}l=a.exec(i)}return new Date(r,s,o)}(i):"number"==typeof i?isNaN(i)?n:function(t){var e=new Date;return e.setDate(e.getDate()+t),e}(i):new Date(i.getTime());return r=r&&"Invalid Date"==""+r?n:r,r&&(r.setHours(0),r.setMinutes(0),r.setSeconds(0),r.setMilliseconds(0)),this._daylightSavingAdjust(r)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var n=!e,r=t.selectedMonth,s=t.selectedYear,o=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=o.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=o.getMonth(),t.drawYear=t.selectedYear=t.currentYear=o.getFullYear(),r===t.selectedMonth&&s===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(n?"":this._formatDate(t))},_getDate:function(t){return!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay))},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),n="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(n,-i,"M")},next:function(){t.datepicker._adjustDate(n,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(n)},selectDay:function(){return t.datepicker._selectDay(n,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(n,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(n,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,n,r,s,o,a,l,u,c,h,d,p,f,g,m,v,_,y,b,w,x,C,k,T,D,S,A,E,I,$,O,P,N,M,j,H,R,L,F=new Date,z=this._daylightSavingAdjust(new Date(F.getFullYear(),F.getMonth(),F.getDate())),W=this._get(t,"isRTL"),q=this._get(t,"showButtonPanel"),B=this._get(t,"hideIfNoPrevNext"),U=this._get(t,"navigationAsDateFormat"),Y=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),K=this._get(t,"stepMonths"),X=1!==Y[0]||1!==Y[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Z=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Q=t.drawMonth-V,tt=t.drawYear;if(0>Q&&(Q+=12,tt--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-Y[0]*Y[1]+1,J.getDate())),e=Z&&Z>e?Z:e;this._daylightSavingAdjust(new Date(tt,Q,1))>e;)0>--Q&&(Q=11,tt--);for(t.drawMonth=Q,t.drawYear=tt,i=this._get(t,"prevText"),i=U?this.formatDate(i,this._daylightSavingAdjust(new Date(tt,Q-K,1)),this._getFormatConfig(t)):i,n=this._canAdjustMonth(t,-1,tt,Q)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(W?"e":"w")+"'>"+i+"</span></a>":B?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(W?"e":"w")+"'>"+i+"</span></a>",r=this._get(t,"nextText"),r=U?this.formatDate(r,this._daylightSavingAdjust(new Date(tt,Q+K,1)),this._getFormatConfig(t)):r,s=this._canAdjustMonth(t,1,tt,Q)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+r+"'><span class='ui-icon ui-icon-circle-triangle-"+(W?"w":"e")+"'>"+r+"</span></a>":B?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+r+"'><span class='ui-icon ui-icon-circle-triangle-"+(W?"w":"e")+"'>"+r+"</span></a>",o=this._get(t,"currentText"),a=this._get(t,"gotoCurrent")&&t.currentDay?G:z,o=U?this.formatDate(o,a,this._getFormatConfig(t)):o,l=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",u=q?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(W?l:"")+(this._isInRange(t,a)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(W?"":l)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,h=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),v=this._get(t,"showOtherMonths"),_=this._get(t,"selectOtherMonths"),y=this._getDefaultDate(t),b="",x=0;Y[0]>x;x++){for(C="",this.maxRows=4,k=0;Y[1]>k;k++){if(T=this._daylightSavingAdjust(new Date(tt,Q,t.selectedDay)),D=" ui-corner-all",S="",X){if(S+="<div class='ui-datepicker-group",Y[1]>1)switch(k){case 0:S+=" ui-datepicker-group-first",D=" ui-corner-"+(W?"right":"left");break;case Y[1]-1:S+=" ui-datepicker-group-last",D=" ui-corner-"+(W?"left":"right");break;default:S+=" ui-datepicker-group-middle",D=""}S+="'>"}for(S+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+D+"'>"+(/all|left/.test(D)&&0===x?W?s:n:"")+(/all|right/.test(D)&&0===x?W?n:s:"")+this._generateMonthYearHeader(t,Q,tt,Z,J,x>0||k>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead><tr>",A=h?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)E=(w+c)%7,A+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+"><span title='"+d[E]+"'>"+p[E]+"</span></th>";for(S+=A+"</tr></thead><tbody>",I=this._getDaysInMonth(tt,Q),tt===t.selectedYear&&Q===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,I)),$=(this._getFirstDayOfMonth(tt,Q)-c+7)%7,O=Math.ceil(($+I)/7),P=X&&this.maxRows>O?this.maxRows:O,this.maxRows=P,N=this._daylightSavingAdjust(new Date(tt,Q,1-$)),M=0;P>M;M++){for(S+="<tr>",j=h?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(N)+"</td>":"",w=0;7>w;w++)H=m?m.apply(t.input?t.input[0]:null,[N]):[!0,""],R=N.getMonth()!==Q,L=R&&!_||!H[0]||Z&&Z>N||J&&N>J,j+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(R?" ui-datepicker-other-month":"")+(N.getTime()===T.getTime()&&Q===t.selectedMonth&&t._keyEvent||y.getTime()===N.getTime()&&y.getTime()===T.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(R&&!v?"":" "+H[1]+(N.getTime()===G.getTime()?" "+this._currentClass:"")+(N.getTime()===z.getTime()?" ui-datepicker-today":""))+"'"+(R&&!v||!H[2]?"":" title='"+H[2].replace(/'/g,"&#39;")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+N.getMonth()+"' data-year='"+N.getFullYear()+"'")+">"+(R&&!v?"&#xa0;":L?"<span class='ui-state-default'>"+N.getDate()+"</span>":"<a class='ui-state-default"+(N.getTime()===z.getTime()?" ui-state-highlight":"")+(N.getTime()===G.getTime()?" ui-state-active":"")+(R?" ui-priority-secondary":"")+"' href='#'>"+N.getDate()+"</a>")+"</td>",N.setDate(N.getDate()+1),N=this._daylightSavingAdjust(N);S+=j+"</tr>"}Q++,Q>11&&(Q=0,tt++),S+="</tbody></table>"+(X?"</div>"+(Y[0]>0&&k===Y[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),C+=S}b+=C}return b+=u,t._keyEvent=!1,b},_generateMonthYearHeader:function(t,e,i,n,r,s,o,a){var l,u,c,h,d,p,f,g,m=this._get(t,"changeMonth"),v=this._get(t,"changeYear"),_=this._get(t,"showMonthAfterYear"),y="<div class='ui-datepicker-title'>",b="";if(s||!m)b+="<span class='ui-datepicker-month'>"+o[e]+"</span>";else{for(l=n&&n.getFullYear()===i,u=r&&r.getFullYear()===i,b+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!l||c>=n.getMonth())&&(!u||r.getMonth()>=c)&&(b+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+a[c]+"</option>");b+="</select>"}if(_||(y+=b+(!s&&m&&v?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",s||!v)y+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(h=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(h[0]),g=Math.max(f,p(h[1]||"")),f=n?Math.max(f,n.getFullYear()):f,g=r?Math.min(g,r.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",y+=t.yearshtml,t.yearshtml=null}return y+=this._get(t,"yearSuffix"),_&&(y+=(!s&&m&&v?"":"&#xa0;")+b),y+="</div>"},_adjustInstDate:function(t,e,i){var n=t.selectedYear+("Y"===i?e:0),r=t.selectedMonth+("M"===i?e:0),s=Math.min(t.selectedDay,this._getDaysInMonth(n,r))+("D"===i?e:0),o=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(n,r,s)));t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),n=this._getMinMaxDate(t,"max"),r=i&&i>e?i:e;return n&&r>n?n:r},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,n){var r=this._getNumberOfMonths(t),s=this._daylightSavingAdjust(new Date(i,n+(0>e?e:r[0]*r[1]),1));return 0>e&&s.setDate(this._getDaysInMonth(s.getFullYear(),s.getMonth())),this._isInRange(t,s)},_isInRange:function(t,e){var i,n,r=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),o=null,a=null,l=this._get(t,"yearRange");return l&&(i=l.split(":"),n=(new Date).getFullYear(),o=parseInt(i[0],10),a=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=n),i[1].match(/[+\-].*/)&&(a+=n)),(!r||e.getTime()>=r.getTime())&&(!s||e.getTime()<=s.getTime())&&(!o||e.getFullYear()>=o)&&(!a||a>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,n){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var r=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(n,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),r,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new n,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.1",t.datepicker,t.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&!1!==this._trigger("beforeClose",e)&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var n=!1,r=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),s=Math.max.apply(null,r);return s>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",s+1),n=!0),n&&!i&&this._trigger("focus",e),n},open:function(){var e=this;return this._isOpen?void(this._moveToTop()&&this._focusTabbable()):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),void this._trigger("open"))},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]);this.uiDialog[0]===e||t.contains(this.uiDialog[0],e)||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),void this.close(e);if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),n=i.filter(":first"),r=i.filter(":last");e.target!==r[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==n[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){r.trigger("focus")}),e.preventDefault()):(this._delay(function(){n.trigger("focus")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=t("<button type='button'></button>").button({label:t("<a>").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html("&#160;")},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?void this._removeClass(this.uiDialog,"ui-dialog-buttons"):(t.each(i,function(i,n){var r,s;n=t.isFunction(n)?{click:n,text:i}:n,n=t.extend({type:"button"},n),r=n.click,s={icon:n.icon,iconPosition:n.iconPosition,showLabel:n.showLabel,icons:n.icons,text:n.text},delete n.click,delete n.icon,delete n.iconPosition,delete n.showLabel,delete n.icons,"boolean"==typeof n.text&&delete n.text,t("<button></button>",n).button(s).appendTo(e.uiButtonSet).on("click",function(){r.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),void this.uiDialogButtonPane.appendTo(this.uiDialog))},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,n=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(n,r){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",n,e(r))},drag:function(t,n){i._trigger("drag",t,e(n))},stop:function(r,s){var o=s.offset.left-i.document.scrollLeft(),a=s.offset.top-i.document.scrollTop();n.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" top"+(a>=0?"+":"")+a,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",r,e(s))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,n=this.options,r=n.resizable,s=this.uiDialog.css("position"),o="string"==typeof r?r:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:n.maxWidth,maxHeight:n.maxHeight,minWidth:n.minWidth,minHeight:this._minHeight(),handles:o,start:function(n,r){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",n,e(r))},resize:function(t,n){i._trigger("resize",t,e(n))},stop:function(r,s){var o=i.uiDialog.offset(),a=o.left-i.document.scrollLeft(),l=o.top-i.document.scrollTop();n.height=i.uiDialog.height(),n.width=i.uiDialog.width(),n.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" top"+(l>=0?"+":"")+l,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",r,e(s))}}).css("position",s)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,n=!1,r={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(n=!0),t in i.resizableRelatedOptions&&(r[t]=e)}),n&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",r)},_setOption:function(e,i){var n,r,s=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("<a>").text(""+this.options.closeText).html()}),"draggable"===e&&(n=s.is(":data(ui-draggable)"),n&&!i&&s.draggable("destroy"),!n&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(r=s.is(":data(ui-resizable)"),r&&!i&&s.resizable("destroy"),r&&"string"==typeof i&&s.resizable("option","handles",i),r||!1===i||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,n=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),n.minWidth>n.width&&(n.width=n.minWidth),t=this.uiDialog.css({height:"auto",width:n.width}).outerHeight(),e=Math.max(0,n.minHeight-t),i="number"==typeof n.maxHeight?Math.max(0,n.maxHeight-t):"none","auto"===n.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,n.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return!!t(e.target).closest(".ui-dialog").length||!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("<div>").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),!1!==t.uiBackCompat&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("<div>").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),void this._refreshValue())},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=!1===t,"number"!=typeof t&&(t=0),!this.indeterminate&&Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div>").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"<select>",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=t()},_drawButton:function(){var e,i=this,n=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.focus(),t.preventDefault()}}),this.element.hide(),this.button=t("<span>",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),e=t("<span>").appendTo(this.button),this._addClass(e,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(n).appendTo(this.button),!1!==this.options.width&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){i._rendered||i._refreshMenu()})},_drawMenu:function(){var e=this;this.menu=t("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=t("<div>").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,i){t.preventDefault(),e._setSelection(),e._select(i.item.data("ui-selectmenu-item"),t)},focus:function(t,i){var n=i.item.data("ui-selectmenu-item");null!=e.focusIndex&&n.index!==e.focusIndex&&(e._trigger("focus",t,{item:n}),e.isOpen||e._select(n,t)),e.focusIndex=n.index,e.button.attr("aria-activedescendant",e.menuItems.eq(n.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t,e=this.element.find("option");this.menu.empty(),this._parseOptions(e),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,e.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(t.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(e){var i=t("<span>");return this._setText(i,e.label),this._addClass(i,"ui-selectmenu-text"),i},_renderMenu:function(e,i){var n=this,r="";t.each(i,function(i,s){var o;s.optgroup!==r&&(o=t("<li>",{text:s.optgroup}),n._addClass(o,"ui-selectmenu-optgroup","ui-menu-divider"+(s.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),o.appendTo(e),r=s.optgroup),n._renderItemData(e,s)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(e,i){var n=t("<li>"),r=t("<div>",{title:i.element.attr("title")});return i.disabled&&this._addClass(n,null,"ui-state-disabled"),this._setText(r,i.label),n.append(r).appendTo(e)},_setText:function(t,e){e?t.text(e):t.html("&#160;")},_move:function(t,e){var i,n,r=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),r+=":not(.ui-state-disabled)"),n="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](r).eq(-1):i[t+"All"](r).eq(0),n.length&&this.menuInstance.focus(e,n)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?(t=window.getSelection(),t.removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(e){this.isOpen&&(t(e.target).closest(".ui-selectmenu-menu, #"+t.ui.escapeSelector(this.ids.button)).length||this.close(e))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection(),t.rangeCount&&(this.range=t.getRangeAt(0))):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(e){var i=!0;switch(e.keyCode){case t.ui.keyCode.TAB:case t.ui.keyCode.ESCAPE:this.close(e),i=!1;break;case t.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(e);break;case t.ui.keyCode.UP:e.altKey?this._toggle(e):this._move("prev",e);break;case t.ui.keyCode.DOWN:e.altKey?this._toggle(e):this._move("next",e);break;case t.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(e):this._toggle(e);break;case t.ui.keyCode.LEFT:this._move("prev",e);break;case t.ui.keyCode.RIGHT:this._move("next",e);break;case t.ui.keyCode.HOME:case t.ui.keyCode.PAGE_UP:this._move("first",e);break;case t.ui.keyCode.END:case t.ui.keyCode.PAGE_DOWN:this._move("last",e);break;default:this.menu.trigger(e),i=!1}i&&e.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){var e=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":e,"aria-activedescendant":e}),this.menu.attr("aria-activedescendant",e)},_setOption:function(t,e){if("icons"===t){var i=this.button.find("span.ui-icon");this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)}this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;return!1===t?void this.button.css("width",""):(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),void this.button.outerWidth(t))},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(e){var i=this,n=[];e.each(function(e,r){n.push(i._parseOption(t(r),e))}),this.items=n},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),t.widget("ui.slider",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,n=this.options,r=this.element.find(".ui-slider-handle"),s=[];for(i=n.values&&n.values.length||1,r.length>i&&(r.slice(i).remove(),r=r.slice(0,i)),e=r.length;i>e;e++)s.push("<span tabindex='0'></span>");this.handles=r.add(t(s.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e).attr("tabIndex",0)})},_createRange:function(){var e=this.options;e.range?(!0===e.range&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=t("<div>").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),("min"===e.range||"max"===e.range)&&this._addClass(this.range,"ui-slider-range-"+e.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,n,r,s,o,a,l,u=this,c=this.options;return!c.disabled&&(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},n=this._normValueFromMouse(i),r=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(n-u.values(e));(r>i||r===i&&(e===u._lastChangedValue||u.values(e)===c.min))&&(r=i,s=t(this),o=e)}),!1!==this._start(e,o)&&(this._mouseSliding=!0,this._handleIndex=o,this._addClass(s,null,"ui-state-active"),s.trigger("focus"),a=s.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-a.left-s.width()/2,top:e.pageY-a.top-s.height()/2-(parseInt(s.css("borderTopWidth"),10)||0)-(parseInt(s.css("borderBottomWidth"),10)||0)+(parseInt(s.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,o,n),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,n,r,s;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),n=i/e,n>1&&(n=1),0>n&&(n=0),"vertical"===this.orientation&&(n=1-n),r=this._valueMax()-this._valueMin(),s=this._valueMin()+n*r,this._trimAlignValue(s)},_uiHash:function(t,e,i){var n={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(n.value=void 0!==e?e:this.values(t),n.values=i||this.values()),n},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var n,r=this.value(),s=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),r=this.values(e),2===this.options.values.length&&!0===this.options.range&&(i=0===e?Math.min(n,i):Math.max(n,i)),s[e]=i),i!==r&&!1!==this._trigger("slide",t,this._uiHash(e,i,s))&&(this._hasMultipleValues()?this.values(e,i):this.value(i))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),void this._change(null,0)):this._value()},values:function(e,i){var n,r,s;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),void this._change(null,e);if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(n=this.options.values,r=arguments[0],s=0;n.length>s;s+=1)n[s]=this._trimAlignValue(r[s]),this._change(null,s);this._refreshValue()},_setOption:function(e,i){var n,r=0;switch("range"===e&&!0===this.options.range&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(r=this.options.values.length),this._super(e,i),e){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),n=r-1;n>=0;n--)this._change(null,n);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,n;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),n=0;i.length>n;n+=1)i[n]=this._trimAlignValue(i[n]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,n=t-i;return 2*Math.abs(i)>=e&&(n+=i>0?e:-e),parseFloat(n.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step;t=Math.round((t-e)/i)*i+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,n,r,s,o=this.options.range,a=this.options,l=this,u=!this._animateOff&&a.animate,c={};this._hasMultipleValues()?this.handles.each(function(n){i=(l.values(n)-l._valueMin())/(l._valueMax()-l._valueMin())*100,c["horizontal"===l.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[u?"animate":"css"](c,a.animate),!0===l.options.range&&("horizontal"===l.orientation?(0===n&&l.range.stop(1,1)[u?"animate":"css"]({left:i+"%"},a.animate),1===n&&l.range[u?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:a.animate})):(0===n&&l.range.stop(1,1)[u?"animate":"css"]({bottom:i+"%"},a.animate),1===n&&l.range[u?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:a.animate}))),e=i}):(n=this.value(),r=this._valueMin(),s=this._valueMax(),i=s!==r?(n-r)/(s-r)*100:0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[u?"animate":"css"](c,a.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[u?"animate":"css"]({width:i+"%"},a.animate),"max"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[u?"animate":"css"]({width:100-i+"%"},a.animate),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[u?"animate":"css"]({height:i+"%"},a.animate),"max"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[u?"animate":"css"]({height:100-i+"%"},a.animate))},_handleEvents:{keydown:function(e){var i,n,r,s=t(e.target).data("ui-slider-handle-index");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,"ui-state-active"),!1===this._start(e,s)))return}switch(r=this.options.step,i=n=this._hasMultipleValues()?this.values(s):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(i+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(i-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(i===this._valueMax())return;n=this._trimAlignValue(i+r);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(i===this._valueMin())return;n=this._trimAlignValue(i-r)}this._slide(e,s,n)},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,"ui-state-active"))}}}),t.widget("ui.spinner",{version:"1.12.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,n){var r=i.attr(n);null!=r&&r.length&&(e[n]=r)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?void delete this.cancelBlur:(this._stop(),this._refresh(),void(this.previous!==this.element.val()&&this._trigger("change",t)))},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){this.element[0]===t.ui.safeActiveElement(this.document[0])||(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n}))}var n;n=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),!1!==this._start(e)&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?!1!==this._start(e)&&void this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("<span>").parent().append("<a></a><a></a>")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,n=t.ui.keyCode;switch(e.keyCode){case n.UP:return this._repeat(null,1,e),!0;case n.DOWN:return this._repeat(null,-1,e),!0;case n.PAGE_UP:return this._repeat(null,i.page,e),!0;case n.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return!(!this.spinning&&!1===this._trigger("start",t))&&(this.counter||(this.counter=1),this.spinning=!0,!0)},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&!1===this._trigger("spin",e,{value:i})||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,n=this.options;return e=null!==n.min?n.min:0,i=t-e,i=Math.round(i/n.step)*n.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==n.max&&t>n.max?n.max:null!==n.min&&n.min>t?n.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,n,r;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,void this.element.val(this._format(i))):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(n=this.buttons.first().find(".ui-icon"),this._removeClass(n,null,this.options.icons.up),this._addClass(n,null,e.up),r=this.buttons.last().find(".ui-icon"),this._removeClass(r,null,this.options.icons.down),this._addClass(r,null,e.down)),void this._super(t,e))},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:a(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null!==t&&t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&null!==(i=this._parse(t))&&(e||(i=this._adjustValue(i)),t=this._format(i)),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:a(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:a(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:a(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:a(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?void a(this._value).call(this,t):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),!1!==t.uiBackCompat&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return"<span>"},_buttonHtml:function(){return"<a></a><a></a>"}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,n;i=e.href.replace(t,""),n=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(t){}try{n=decodeURIComponent(n)}catch(t){}return e.hash.length>1&&i===n}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=!1!==this.options.active&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,n=location.hash.substring(1);return null===e&&(n&&this.tabs.each(function(i,r){return t(r).attr("aria-controls")===n?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=!!this.tabs.length&&0)),!1!==e&&-1===(e=this.tabs.index(this.tabs.eq(e)))&&(e=!i&&0),!i&&!1===e&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),n=this.tabs.index(i),r=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:n++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:r=!1,n--;break;case t.ui.keyCode.END:n=this.anchors.length-1;break;case t.ui.keyCode.HOME:n=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),void this._activate(n);case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),void this._activate(n!==this.options.active&&n);default:return}e.preventDefault(),clearTimeout(this.activating),n=this._focusNextTab(n,r),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(n).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",n)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){for(var n=this.tabs.length-1;-1!==t.inArray(function(){return e>n&&(e=0),0>e&&(e=n),e}(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?void this._activate(e):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||!1!==this.options.active||this._activate(0)),"event"===t&&this._setupEvents(e),void("heightStyle"===t&&this._setupHeightStyle(e)))},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),!1!==e.active&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,n=this.anchors,r=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,n){var r,s,o,a=t(n).uniqueId().attr("id"),l=t(n).closest("li"),u=l.attr("aria-controls");e._isLocal(n)?(r=n.hash,o=r.substring(1),s=e.element.find(e._sanitizeSelector(r))):(o=l.attr("aria-controls")||t({}).uniqueId()[0].id,r="#"+o,s=e.element.find(r),s.length||(s=e._createPanel(o),s.insertAfter(e.panels[i-1]||e.tablist)),s.attr("aria-live","polite")),s.length&&(e.panels=e.panels.add(s)),u&&l.data("ui-tabs-aria-controls",u),l.attr({"aria-controls":o,"aria-labelledby":a}),s.attr("aria-labelledby",a)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(n.not(this.anchors)),this._off(r.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,n,r;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),r=0;n=this.tabs[r];r++)i=t(n),!0===e||-1!==t.inArray(r,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!0===e)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,n=this.element.parent();"fill"===e?(i=n.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),n=e.css("position");"absolute"!==n&&"fixed"!==n&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,n=this.active,r=t(e.currentTarget),s=r.closest("li"),o=s[0]===n[0],a=o&&i.collapsible,l=a?t():this._getPanelForTab(s),u=n.length?this._getPanelForTab(n):t(),c={oldTab:n,oldPanel:u,newTab:a?t():s,newPanel:l};e.preventDefault(),s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||!1===this._trigger("beforeActivate",e,c)||(i.active=!a&&this.tabs.index(s),this.active=o?t():s,this.xhr&&this.xhr.abort(),u.length||l.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),l.length&&this.load(this.tabs.index(s),e),this._toggle(e,c))},_toggle:function(e,i){function n(){s.running=!1,s._trigger("activate",e,i)}function r(){s._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),o.length&&s.options.show?s._show(o,s.options.show,n):(o.show(),n())}var s=this,o=i.newPanel,a=i.oldPanel;this.running=!0,a.length&&this.options.hide?this._hide(a,this.options.hide,function(){s._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),a.hide(),r()),a.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&a.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,n=this._findActive(e);n[0]!==this.active[0]&&(n.length||(n=this.active),i=n.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return!1===e?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;!1!==i&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(!0!==i){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var n=this,r=this.tabs.eq(e),s=r.find(".ui-tabs-anchor"),o=this._getPanelForTab(r),a={tab:r,panel:o},l=function(t,e){"abort"===e&&n.panels.stop(!1,!0),n._removeClass(r,"ui-tabs-loading"),o.removeAttr("aria-busy"),t===n.xhr&&delete n.xhr};this._isLocal(s[0])||(this.xhr=t.ajax(this._ajaxSettings(s,i,a)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(r,"ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(t,e,r){setTimeout(function(){o.html(t),n._trigger("load",i,a),l(r,e)},1)}).fail(function(t,e){setTimeout(function(){l(t,e)},1)})))},_ajaxSettings:function(e,i,n){var r=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,s){return r._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:s},n))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),!1!==t.uiBackCompat&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var n=(e.attr("aria-describedby")||"").split(/\s+/);n.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(n.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),n=(e.attr("aria-describedby")||"").split(/\s+/),r=t.inArray(i,n);-1!==r&&n.splice(r,1),e.removeData("ui-tooltip-id"),n=t.trim(n.join(" ")),n?e.attr("aria-describedby",n):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var n=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){n._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,n){var r=t.Event("blur");r.target=r.currentTarget=n.element[0],e.close(r,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,n=t(e?e.target:this.element).closest(this.options.items);n.length&&!n.data("ui-tooltip-id")&&(n.attr("title")&&n.data("ui-tooltip-title",n.attr("title")),n.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&n.parents().each(function(){var e,n=t(this);n.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),n.attr("title")&&(n.uniqueId(),i.parents[this.id]={element:this,title:n.attr("title")},n.attr("title",""))}),this._registerCloseHandlers(e,n),this._updateContent(n,e))},_updateContent:function(t,e){var i,n=this.options.content,r=this,s=e?e.type:null;return"string"==typeof n||n.nodeType||n.jquery?this._open(e,t,n):void((i=n.call(t[0],function(i){r._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=s),this._open(e,t,i))})}))&&this._open(e,t,i))},_open:function(e,i,n){function r(t){u.of=t,o.is(":hidden")||o.position(u)}var s,o,a,l,u=t.extend({},this.options.position);if(n){if(s=this._find(i))return void s.tooltip.find(".ui-tooltip-content").html(n);i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),s=this._tooltip(i),o=s.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(n),this.liveRegion.children().hide(),l=t("<div>").html(o.find(".ui-tooltip-content").html()),l.removeAttr("name").find("[name]").removeAttr("name"),l.removeAttr("id").find("[id]").removeAttr("id"),l.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:r}),r(e)):o.position(t.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(a=this.delayedShow=setInterval(function(){o.is(":visible")&&(r(u.of),clearInterval(a))},t.fx.interval)),this._trigger("open",e,{tooltip:o})}},_registerCloseHandlers:function(e,i){var n={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var n=t.Event(e);n.currentTarget=i[0],this.close(n,!0)}}};i[0]!==this.element[0]&&(n.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(n.mouseleave="close"),e&&"focusin"!==e.type||(n.focusout="close"),this._on(!0,i,n)},close:function(e){var i,n=this,r=t(e?e.currentTarget:this.element),s=this._find(r);return s?(i=s.tooltip,void(s.closing||(clearInterval(this.delayedShow),r.data("ui-tooltip-title")&&!r.attr("title")&&r.attr("title",r.data("ui-tooltip-title")),this._removeDescribedBy(r),s.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){n._removeTooltip(t(this))}),r.removeData("ui-tooltip-open"),this._off(r,"mouseleave focusout keyup"),r[0]!==this.element[0]&&this._off(r,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete n.parents[e]}),s.closing=!0,this._trigger("close",e,{tooltip:i}),s.hiding||(s.closing=!1)))):void r.removeData("ui-tooltip-open")},_tooltip:function(e){var i=t("<div>").attr("role","tooltip"),n=t("<div>").appendTo(i),r=i.uniqueId().attr("id");return this._addClass(n,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[r]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,n){var r=t.Event("blur"),s=n.element;r.target=r.currentTarget=s[0],e.close(r,!0),t("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title")||s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),!1!==t.uiBackCompat&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip;var f="ui-effects-",g="ui-effects-style",m="ui-effects-animated",v=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var n=c[e.type]||{};return null==t?i||!e.def?null:e.def:(t=n.floor?~~t:parseFloat(t),isNaN(t)?e.def:n.mod?(t+n.mod)%n.mod:0>t?0:t>n.max?n.max:t)}function n(i){var n=l(),r=n._rgba=[];return i=i.toLowerCase(),p(a,function(t,s){var o,a=s.re.exec(i),l=a&&s.parse(a),c=s.space||"rgba";return l?(o=n[c](l),n[u[c].cache]=o[u[c].cache],r=n._rgba=o._rgba,!1):e}),r.length?("0,0,0,0"===r.join()&&t.extend(r,s.transparent),n):s[i]}function r(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var s,o=/^([\-+])=\s*(\d+\.?\d*)/,a=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,n,r){return new t.Color.fn.parse(e,i,n,r)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},c={byte:{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},h=l.support={},d=t("<p>")[0],p=t.each;d.style.cssText="background-color:rgba(1,1,1,.5)",h.rgba=d.style.backgroundColor.indexOf("rgba")>-1,p(u,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(r,o,a,c){if(r===e)return this._rgba=[null,null,null,null],this;(r.jquery||r.nodeType)&&(r=t(r).css(o),o=e);var h=this,d=t.type(r),f=this._rgba=[];return o!==e&&(r=[r,o,a,c],d="array"),"string"===d?this.parse(n(r)||s._default):"array"===d?(p(u.rgba.props,function(t,e){f[e.idx]=i(r[e.idx],e)}),this):"object"===d?(r instanceof l?p(u,function(t,e){r[e.cache]&&(h[e.cache]=r[e.cache].slice())}):p(u,function(e,n){var s=n.cache;p(n.props,function(t,e){if(!h[s]&&n.to){if("alpha"===t||null==r[t])return;h[s]=n.to(h._rgba)}h[s][e.idx]=i(r[t],e,!0)}),h[s]&&0>t.inArray(null,h[s].slice(0,3))&&(h[s][3]=1,n.from&&(h._rgba=n.from(h[s])))}),this):e},is:function(t){var i=l(t),n=!0,r=this;return p(u,function(t,s){var o,a=i[s.cache];return a&&(o=r[s.cache]||s.to&&s.to(r._rgba)||[],p(s.props,function(t,i){return null!=a[i.idx]?n=a[i.idx]===o[i.idx]:e})),n}),n},_space:function(){var t=[],e=this;return p(u,function(i,n){e[n.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var n=l(t),r=n._space(),s=u[r],o=0===this.alpha()?l("transparent"):this,a=o[s.cache]||s.to(o._rgba),h=a.slice();return n=n[s.cache],p(s.props,function(t,r){var s=r.idx,o=a[s],l=n[s],u=c[r.type]||{};null!==l&&(null===o?h[s]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[s]=i((l-o)*e+o,r)))}),this[r](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),n=i.pop(),r=l(e)._rgba;return l(t.map(i,function(t,e){return(1-n)*r[e]+n*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),n=i.pop();return e&&i.push(~~(255*n)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,n=t[0]/255,r=t[1]/255,s=t[2]/255,o=t[3],a=Math.max(n,r,s),l=Math.min(n,r,s),u=a-l,c=a+l,h=.5*c;return e=l===a?0:n===a?60*(r-s)/u+360:r===a?60*(s-n)/u+120:60*(n-r)/u+240,i=0===u?0:.5>=h?u/c:u/(2-c),[Math.round(e)%360,i,h,null==o?1:o]},u.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],n=t[2],s=t[3],o=.5>=n?n*(1+i):n+i-n*i,a=2*n-o;return[Math.round(255*r(a,o,e+1/3)),Math.round(255*r(a,o,e)),Math.round(255*r(a,o,e-1/3)),s]},p(u,function(n,r){var s=r.props,a=r.cache,u=r.to,c=r.from;l.fn[n]=function(n){if(u&&!this[a]&&(this[a]=u(this._rgba)),n===e)return this[a].slice();var r,o=t.type(n),h="array"===o||"object"===o?n:arguments,d=this[a].slice();return p(s,function(t,e){var n=h["object"===o?t:e.idx];null==n&&(n=d[e.idx]),d[e.idx]=i(n,e)}),c?(r=l(c(d)),r[a]=d,r):l(d)},p(s,function(e,i){l.fn[e]||(l.fn[e]=function(r){var s,a=t.type(r),l="alpha"===e?this._hsla?"hsla":"rgba":n,u=this[l](),c=u[i.idx];return"undefined"===a?c:("function"===a&&(r=r.call(this,c),a=t.type(r)),null==r&&i.empty?this:("string"===a&&(s=o.exec(r))&&(r=c+parseFloat(s[2])*("+"===s[1]?1:-1)),u[i.idx]=r,this[l](u)))})})}),l.hook=function(e){var i=e.split(" ");p(i,function(e,i){t.cssHooks[i]={set:function(e,r){var s,o,a="";if("transparent"!==r&&("string"!==t.type(r)||(s=n(r)))){if(r=l(s||r),!h.rgba&&1!==r._rgba[3]){for(o="backgroundColor"===i?e.parentNode:e;(""===a||"transparent"===a)&&o&&o.style;)try{a=t.css(o,"backgroundColor"),o=o.parentNode}catch(t){}r=r.blend(a&&"transparent"!==a?a:"_default")}r=r.toRgbaString()}try{e.style[i]=r}catch(t){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook("backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor"),t.cssHooks.borderColor={expand:function(t){var e={};return p(["Top","Right","Bottom","Left"],function(i,n){e["border"+n+"Color"]=t}),e}},s=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(v),function(){function e(e){var i,n,r=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,s={};if(r&&r.length&&r[0]&&r[r[0]])for(n=r.length;n--;)i=r[n],"string"==typeof r[i]&&(s[t.camelCase(i)]=r[i]);else for(i in r)"string"==typeof r[i]&&(s[i]=r[i]);return s}function i(e,i){var n,s,o={};for(n in i)s=i[n],e[n]!==s&&(r[n]||(t.fx.step[n]||!isNaN(parseFloat(s)))&&(o[n]=s));return o}var n=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(v.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(r,s,o,a){var l=t.speed(s,o,a);return this.queue(function(){var s,o=t(this),a=o.attr("class")||"",u=l.children?o.find("*").addBack():o;u=u.map(function(){return{el:t(this),start:e(this)}}),s=function(){t.each(n,function(t,e){r[e]&&o[e+"Class"](r[e])})},s(),u=u.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",a),u=u.map(function(){var e=this,i=t.Deferred(),n=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,n),i.promise()}),t.when.apply(t,u.get()).done(function(){s(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),l.complete.call(o[0])})})},t.fn.extend({addClass:function(e){return function(i,n,r,s){return n?t.effects.animateClass.call(this,{add:i},n,r,s):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,n,r,s){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},n,r,s):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,n,r,s,o){return"boolean"==typeof n||void 0===n?r?t.effects.animateClass.call(this,n?{add:i}:{remove:i},r,s,o):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},n,r,s)}}(t.fn.toggleClass),switchClass:function(e,i,n,r,s){return t.effects.animateClass.call(this,{add:i,remove:e},n,r,s)}})}(),function(){function e(e,i,n,r){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(r=i,n=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(r=n,n=i,i={}),t.isFunction(n)&&(r=n,n=null),i&&t.extend(e,i),n=n||i.duration,e.duration=t.fx.off?0:"number"==typeof n?n:n in t.fx.speeds?t.fx.speeds[n]:t.fx.speeds._default,e.complete=r||i.complete,e}function i(e){return!(e&&"number"!=typeof e&&!t.fx.speeds[e])||("string"==typeof e&&!t.effects.effect[e]||(!!t.isFunction(e)||"object"==typeof e&&!e.effect))}function n(t,e){var i=e.outerWidth(),n=e.outerHeight(),r=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,s=r.exec(t)||["",0,i,n,0];return{top:parseFloat(s[1])||0,right:"auto"===s[2]?i:parseFloat(s[2]),bottom:"auto"===s[3]?n:parseFloat(s[3]),left:parseFloat(s[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(m)||e(i)}}(t.expr.filters.animated)),!1!==t.uiBackCompat&&t.extend(t.effects,{save:function(t,e){for(var i=0,n=e.length;n>i;i++)null!==e[i]&&t.data(f+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,n=0,r=e.length;r>n;n++)null!==e[n]&&(i=t.data(f+e[n]),t.css(e[n],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),float:e.css("float")},n=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),r={width:e.width(),height:e.height()},s=document.activeElement;try{s.id}catch(t){s=document.body}return e.wrap(n),(e[0]===s||t.contains(e[0],s))&&t(s).trigger("focus"),n=e.parent(),"static"===e.css("position")?(n.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,n){i[n]=e.css(n),isNaN(parseInt(i[n],10))&&(i[n]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(r),n.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,n){return n||(n=i,i="effect"),t.effects.effect[e]=n,t.effects.effect[e].mode=i,n},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var n="horizontal"!==i?(e||100)/100:1,r="vertical"!==i?(e||100)/100:1;return{height:t.height()*r,width:t.width()*n,outerHeight:t.outerHeight()*r,outerWidth:t.outerWidth()*n}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var n=t.queue();e>1&&n.splice.apply(n,[1,0].concat(n.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(g,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(g)||"",t.removeData(g)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,n;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":n=0;break;case"center":n=.5;break;case"right":n=1;break;default:n=t[1]/e.width}return{x:n,y:i}},createPlaceholder:function(e){var i,n=e.css("position"),r=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(n)&&(n="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),float:e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(f+"placeholder",i)),e.css({position:n,left:r.left,top:r.top}),i},removePlaceholder:function(t){var e=f+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,n,r){return r=r||{},t.each(i,function(t,i){var s=e.cssUnit(i);s[0]>0&&(r[i]=s[0]*n+s[1])}),r}}),t.fn.extend({effect:function(){function i(e){function i(){a.removeData(m),t.effects.cleanUp(a),"hide"===n.mode&&a.hide(),o()}function o(){t.isFunction(l)&&l.call(a[0]),t.isFunction(e)&&e()}var a=t(this);n.mode=c.shift(),!1===t.uiBackCompat||s?"none"===n.mode?(a[u](),o()):r.call(a[0],n,i):(a.is(":hidden")?"hide"===u:"show"===u)?(a[u](),o()):r.call(a[0],n,o)}var n=e.apply(this,arguments),r=t.effects.effect[n.effect],s=r.mode,o=n.queue,a=o||"fx",l=n.complete,u=n.mode,c=[],h=function(e){var i=t(this),n=t.effects.mode(i,u)||s;i.data(m,!0),c.push(n),s&&("show"===n||n===s&&"hide"===n)&&i.show(),s&&"none"===n||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!r?u?this[u](n.duration,l):this.each(function(){l&&l.call(this)}):!1===o?this.each(h).each(i):this.queue(a,h).queue(a,i)},show:function(t){return function(n){if(i(n))return t.apply(this,arguments);var r=e.apply(this,arguments);return r.mode="show",this.effect.call(this,r)}}(t.fn.show),hide:function(t){return function(n){if(i(n))return t.apply(this,arguments);var r=e.apply(this,arguments);return r.mode="hide",this.effect.call(this,r)}}(t.fn.hide),toggle:function(t){return function(n){if(i(n)||"boolean"==typeof n)return t.apply(this,arguments);var r=e.apply(this,arguments);return r.mode="toggle",this.effect.call(this,r)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),n=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(n=[parseFloat(i),e])}),n},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):n(this.css("clip"),this)},transfer:function(e,i){var n=t(this),r=t(e.to),s="fixed"===r.css("position"),o=t("body"),a=s?o.scrollTop():0,l=s?o.scrollLeft():0,u=r.offset(),c={top:u.top-a,left:u.left-l,height:r.innerHeight(),width:r.innerWidth()},h=n.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(e.className).css({top:h.top-a,left:h.left-l,height:n.innerHeight(),width:n.innerWidth(),position:s?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=n(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();t.effects;t.effects.define("blind","hide",function(e,i){var n={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},r=t(this),s=e.direction||"up",o=r.cssClip(),a={clip:t.extend({},o)},l=t.effects.createPlaceholder(r);a.clip[n[s][0]]=a.clip[n[s][1]],"show"===e.mode&&(r.cssClip(a.clip),l&&l.css(t.effects.clipToBox(a)),a.clip=o),l&&l.animate(t.effects.clipToBox(a),e.duration,e.easing),r.animate(a,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var n,r,s,o=t(this),a=e.mode,l="hide"===a,u="show"===a,c=e.direction||"up",h=e.distance,d=e.times||5,p=2*d+(u||l?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",v="up"===c||"left"===c,_=0,y=o.queue().length;for(t.effects.createPlaceholder(o),s=o.css(m),h||(h=o["top"===m?"outerHeight":"outerWidth"]()/3),u&&(r={opacity:1},r[m]=s,o.css("opacity",0).css(m,v?2*-h:2*h).animate(r,f,g)),l&&(h/=Math.pow(2,d-1)),r={},r[m]=s;d>_;_++)n={},n[m]=(v?"-=":"+=")+h,o.animate(n,f,g).animate(r,f,g),h=l?2*h:h/2;l&&(n={opacity:0},n[m]=(v?"-=":"+=")+h,o.animate(n,f,g)),o.queue(i),t.effects.unshift(o,y,p+1)}),t.effects.define("clip","hide",function(e,i){var n,r={},s=t(this),o=e.direction||"vertical",a="both"===o,l=a||"horizontal"===o,u=a||"vertical"===o;n=s.cssClip(),r.clip={top:u?(n.bottom-n.top)/2:n.top,right:l?(n.right-n.left)/2:n.right,bottom:u?(n.bottom-n.top)/2:n.bottom,left:l?(n.right-n.left)/2:n.left},t.effects.createPlaceholder(s),"show"===e.mode&&(s.cssClip(r.clip),r.clip=n),s.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var n,r=t(this),s=e.mode,o="show"===s,a=e.direction||"left",l="up"===a||"down"===a?"top":"left",u="up"===a||"left"===a?"-=":"+=",c="+="===u?"-=":"+=",h={opacity:0};t.effects.createPlaceholder(r),n=e.distance||r["top"===l?"outerHeight":"outerWidth"](!0)/2,h[l]=u+n,o&&(r.css(h),h[l]=c+n,h.opacity=1),r.animate(h,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function n(){y.push(this),y.length===h*d&&r()}function r(){p.css({visibility:"visible"}),t(y).remove(),i()}var s,o,a,l,u,c,h=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=h,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/d),_=Math.ceil(p.outerHeight()/h),y=[];for(s=0;h>s;s++)for(l=m.top+s*_,c=s-(h-1)/2,o=0;d>o;o++)a=m.left+o*v,u=o-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-s*_}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:_,left:a+(g?u*v:0),top:l+(g?c*_:0),opacity:g?0:1}).animate({left:a+(g?0:u*v),top:l+(g?0:c*_),opacity:g?1:0},e.duration||500,e.easing,n)}),t.effects.define("fade","toggle",function(e,i){var n="show"===e.mode;t(this).css("opacity",n?0:1).animate({opacity:n?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var n=t(this),r=e.mode,s="show"===r,o="hide"===r,a=e.size||15,l=/([0-9]+)%/.exec(a),u=!!e.horizFirst,c=u?["right","bottom"]:["bottom","right"],h=e.duration/2,d=t.effects.createPlaceholder(n),p=n.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],v=n.queue().length;l&&(a=parseInt(l[1],10)/100*m[o?0:1]),f.clip[c[0]]=a,g.clip[c[0]]=a,g.clip[c[1]]=0,s&&(n.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),n.queue(function(i){d&&d.animate(t.effects.clipToBox(f),h,e.easing).animate(t.effects.clipToBox(g),h,e.easing),i()}).animate(f,h,e.easing).animate(g,h,e.easing).queue(i),t.effects.unshift(n,v,4)}),t.effects.define("highlight","show",function(e,i){var n=t(this),r={backgroundColor:n.css("backgroundColor")};"hide"===e.mode&&(r.opacity=0),t.effects.saveStyle(n),n.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var n,r,s,o=t(this),a=["fontSize"],l=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],u=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,h="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=o.css("position"),g=o.position(),m=t.effects.scaledDimensions(o),v=e.from||m,_=e.to||t.effects.scaledDimensions(o,0);t.effects.createPlaceholder(o),"show"===c&&(s=v,v=_,_=s),r={from:{y:v.height/m.height,x:v.width/m.width},to:{y:_.height/m.height,x:_.width/m.width}},("box"===d||"both"===d)&&(r.from.y!==r.to.y&&(v=t.effects.setTransition(o,l,r.from.y,v),_=t.effects.setTransition(o,l,r.to.y,_)),r.from.x!==r.to.x&&(v=t.effects.setTransition(o,u,r.from.x,v),_=t.effects.setTransition(o,u,r.to.x,_))),("content"===d||"both"===d)&&r.from.y!==r.to.y&&(v=t.effects.setTransition(o,a,r.from.y,v),_=t.effects.setTransition(o,a,r.to.y,_)),p&&(n=t.effects.getBaseline(p,m),v.top=(m.outerHeight-v.outerHeight)*n.y+g.top,v.left=(m.outerWidth-v.outerWidth)*n.x+g.left,_.top=(m.outerHeight-_.outerHeight)*n.y+g.top,_.left=(m.outerWidth-_.outerWidth)*n.x+g.left),o.css(v),("content"===d||"both"===d)&&(l=l.concat(["marginTop","marginBottom"]).concat(a),u=u.concat(["marginLeft","marginRight"]),o.find("*[width]").each(function(){var i=t(this),n=t.effects.scaledDimensions(i),s={height:n.height*r.from.y,width:n.width*r.from.x,outerHeight:n.outerHeight*r.from.y,outerWidth:n.outerWidth*r.from.x},o={height:n.height*r.to.y,width:n.width*r.to.x,outerHeight:n.height*r.to.y,outerWidth:n.width*r.to.x};r.from.y!==r.to.y&&(s=t.effects.setTransition(i,l,r.from.y,s),o=t.effects.setTransition(i,l,r.to.y,o)),r.from.x!==r.to.x&&(s=t.effects.setTransition(i,u,r.from.x,s),o=t.effects.setTransition(i,u,r.to.x,o)),h&&t.effects.saveStyle(i),i.css(s),i.animate(o,e.duration,e.easing,function(){h&&t.effects.restoreStyle(i)})})),o.animate(_,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=o.offset();0===_.opacity&&o.css("opacity",v.opacity),h||(o.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(o)),i()}})}),t.effects.define("scale",function(e,i){var n=t(this),r=e.mode,s=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==r?0:100),o=t.extend(!0,{from:t.effects.scaledDimensions(n),to:t.effects.scaledDimensions(n,s,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(o.from.opacity=1,o.to.opacity=0),t.effects.effect.size.call(this,o,i)}),t.effects.define("puff","hide",function(e,i){var n=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,n,i)}),t.effects.define("pulsate","show",function(e,i){var n=t(this),r=e.mode,s="show"===r,o="hide"===r,a=s||o,l=2*(e.times||5)+(a?1:0),u=e.duration/l,c=0,h=1,d=n.queue().length;for((s||!n.is(":visible"))&&(n.css("opacity",0).show(),c=1);l>h;h++)n.animate({opacity:c},u,e.easing),c=1-c;n.animate({opacity:c},u,e.easing),n.queue(i),t.effects.unshift(n,d,l+1)}),t.effects.define("shake",function(e,i){var n=1,r=t(this),s=e.direction||"left",o=e.distance||20,a=e.times||3,l=2*a+1,u=Math.round(e.duration/l),c="up"===s||"down"===s?"top":"left",h="up"===s||"left"===s,d={},p={},f={},g=r.queue().length;for(t.effects.createPlaceholder(r),d[c]=(h?"-=":"+=")+o,p[c]=(h?"+=":"-=")+2*o,f[c]=(h?"-=":"+=")+2*o,r.animate(d,u,e.easing);a>n;n++)r.animate(p,u,e.easing).animate(f,u,e.easing);r.animate(p,u,e.easing).animate(d,u/2,e.easing).queue(i),t.effects.unshift(r,g,l+1)}),t.effects.define("slide","show",function(e,i){var n,r,s=t(this),o={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},a=e.mode,l=e.direction||"left",u="up"===l||"down"===l?"top":"left",c="up"===l||"left"===l,h=e.distance||s["top"===u?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(s),n=s.cssClip(),r=s.position()[u],d[u]=(c?-1:1)*h+r,d.clip=s.cssClip(),d.clip[o[l][1]]=d.clip[o[l][0]],"show"===a&&(s.cssClip(d.clip),s.css(u,d[u]),d.clip=n,d[u]=r),s.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});!1!==t.uiBackCompat&&t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})})},function(t,e,i){var n,r,s;!function(o){r=[i(3)],n=o,void 0!==(s="function"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){return t.ui=t.ui||{},t.ui.version="1.12.1"})},function(t,e,i){var n,r,s;/*!
        + * jQuery UI Widget 1.12.1
        + * http://jqueryui.com
        + *
        + * Copyright jQuery Foundation and other contributors
        + * Released under the MIT license.
        + * http://jquery.org/license
        + */
        +!function(o){r=[i(3),i(30)],n=o,void 0!==(s="function"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){var e=0,i=Array.prototype.slice;return t.cleanData=function(e){return function(i){var n,r,s;for(s=0;null!=(r=i[s]);s++)try{n=t._data(r,"events"),n&&n.remove&&t(r).triggerHandler("remove")}catch(t){}e(i)}}(t.cleanData),t.widget=function(e,i,n){var r,s,o,a={},l=e.split(".")[0];e=e.split(".")[1];var u=l+"-"+e;return n||(n=i,i=t.Widget),t.isArray(n)&&(n=t.extend.apply(null,[{}].concat(n))),t.expr[":"][u.toLowerCase()]=function(e){return!!t.data(e,u)},t[l]=t[l]||{},r=t[l][e],s=t[l][e]=function(t,e){if(!this._createWidget)return new s(t,e);arguments.length&&this._createWidget(t,e)},t.extend(s,r,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),o=new i,o.options=t.widget.extend({},o.options),t.each(n,function(e,n){if(!t.isFunction(n))return void(a[e]=n);a[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function r(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,s=this._superApply;return this._super=t,this._superApply=r,e=n.apply(this,arguments),this._super=i,this._superApply=s,e}}()}),s.prototype=t.widget.extend(o,{widgetEventPrefix:r?o.widgetEventPrefix||e:e},a,{constructor:s,namespace:l,widgetName:e,widgetFullName:u}),r?(t.each(r._childConstructors,function(e,i){var n=i.prototype;t.widget(n.namespace+"."+n.widgetName,s,i._proto)}),delete r._childConstructors):i._childConstructors.push(s),t.widget.bridge(e,s),s},t.widget.extend=function(e){for(var n,r,s=i.call(arguments,1),o=0,a=s.length;o<a;o++)for(n in s[o])r=s[o][n],s[o].hasOwnProperty(n)&&void 0!==r&&(t.isPlainObject(r)?e[n]=t.isPlainObject(e[n])?t.widget.extend({},e[n],r):t.widget.extend({},r):e[n]=r);return e},t.widget.bridge=function(e,n){var r=n.prototype.widgetFullName||e;t.fn[e]=function(s){var o="string"==typeof s,a=i.call(arguments,1),l=this;return o?this.length||"instance"!==s?this.each(function(){var i,n=t.data(this,r);return"instance"===s?(l=n,!1):n?t.isFunction(n[s])&&"_"!==s.charAt(0)?(i=n[s].apply(n,a),i!==n&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+s+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; attempted to call method '"+s+"'")}):l=void 0:(a.length&&(s=t.widget.extend.apply(null,[s].concat(a))),this.each(function(){var e=t.data(this,r);e?(e.option(s||{}),e._init&&e._init()):t.data(this,r,new n(s,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,n){n=t(n||this.defaultElement||this)[0],this.element=t(n),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},n!==this&&(t.data(n,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===n&&this.destroy()}}),this.document=t(n.style?n.ownerDocument:n.document||n),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var n,r,s,o=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(o={},n=e.split("."),e=n.shift(),n.length){for(r=o[e]=t.widget.extend({},this.options[e]),s=0;s<n.length-1;s++)r[n[s]]=r[n[s]]||{},r=r[n[s]];if(e=n.pop(),1===arguments.length)return void 0===r[e]?null:r[e];r[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];o[e]=i}return this._setOptions(o),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,n,r;for(i in e)r=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&r&&r.length&&(n=t(r.get()),this._removeClass(r,i),n.addClass(this._classes({element:n,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,s){var o,a;for(a=0;a<i.length;a++)o=r.classesElementLookup[i[a]]||t(),o=t(e.add?t.unique(o.get().concat(e.element.get())):o.not(e.element).get()),r.classesElementLookup[i[a]]=o,n.push(i[a]),s&&e.classes[i[a]]&&n.push(e.classes[i[a]])}var n=[],r=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),n.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(n,r){-1!==t.inArray(e.target,r)&&(i.classesElementLookup[n]=t(r.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,n){n="boolean"==typeof n?n:i;var r="string"==typeof t||null===t,s={extra:r?e:i,keys:r?t:e,element:r?this.element:t,add:n};return s.element.toggleClass(this._classes(s),n),this},_on:function(e,i,n){var r,s=this;"boolean"!=typeof e&&(n=i,i=e,e=!1),n?(i=r=t(i),this.bindings=this.bindings.add(i)):(n=i,i=this.element,r=this.widget()),t.each(n,function(n,o){function a(){if(e||!0!==s.options.disabled&&!t(this).hasClass("ui-state-disabled"))return("string"==typeof o?s[o]:o).apply(s,arguments)}"string"!=typeof o&&(a.guid=o.guid=o.guid||a.guid||t.guid++);var l=n.match(/^([\w:-]*)\s*(.*)$/),u=l[1]+s.eventNamespace,c=l[2];c?r.on(u,c,a):i.on(u,a)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?n[t]:t).apply(n,arguments)}var n=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,n){var r,s,o=this.options[e];if(n=n||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],s=i.originalEvent)for(r in s)r in i||(i[r]=s[r]);return this.element.trigger(i,n),!(t.isFunction(o)&&!1===o.apply(this.element[0],[i].concat(n))||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(n,r,s){"string"==typeof r&&(r={effect:r});var o,a=r?!0===r||"number"==typeof r?i:r.effect||i:e;r=r||{},"number"==typeof r&&(r={duration:r}),o=!t.isEmptyObject(r),r.complete=s,r.delay&&n.delay(r.delay),o&&t.effects&&t.effects.effect[a]?n[e](r):a!==e&&n[a]?n[a](r.duration,r.easing,s):n.queue(function(i){t(this)[e](),s&&s.call(n[0]),i()})}}),t.widget})},function(t,e,i){(function(t,n){var r;(function(){function s(t,e){return t.set(e[0],e[1]),t}function o(t,e){return t.add(e),t}function a(t,e,i){switch(i.length){case 0:return t.call(e);case 1:return t.call(e,i[0]);case 2:return t.call(e,i[0],i[1]);case 3:return t.call(e,i[0],i[1],i[2])}return t.apply(e,i)}function l(t,e,i,n){for(var r=-1,s=null==t?0:t.length;++r<s;){var o=t[r];e(n,o,i(o),t)}return n}function u(t,e){for(var i=-1,n=null==t?0:t.length;++i<n&&!1!==e(t[i],i,t););return t}function c(t,e){for(var i=null==t?0:t.length;i--&&!1!==e(t[i],i,t););return t}function h(t,e){for(var i=-1,n=null==t?0:t.length;++i<n;)if(!e(t[i],i,t))return!1;return!0}function d(t,e){for(var i=-1,n=null==t?0:t.length,r=0,s=[];++i<n;){var o=t[i];e(o,i,t)&&(s[r++]=o)}return s}function p(t,e){return!!(null==t?0:t.length)&&k(t,e,0)>-1}function f(t,e,i){for(var n=-1,r=null==t?0:t.length;++n<r;)if(i(e,t[n]))return!0;return!1}function g(t,e){for(var i=-1,n=null==t?0:t.length,r=Array(n);++i<n;)r[i]=e(t[i],i,t);return r}function m(t,e){for(var i=-1,n=e.length,r=t.length;++i<n;)t[r+i]=e[i];return t}function v(t,e,i,n){var r=-1,s=null==t?0:t.length;for(n&&s&&(i=t[++r]);++r<s;)i=e(i,t[r],r,t);return i}function _(t,e,i,n){var r=null==t?0:t.length;for(n&&r&&(i=t[--r]);r--;)i=e(i,t[r],r,t);return i}function y(t,e){for(var i=-1,n=null==t?0:t.length;++i<n;)if(e(t[i],i,t))return!0;return!1}function b(t){return t.split("")}function w(t){return t.match(Fe)||[]}function x(t,e,i){var n;return i(t,function(t,i,r){if(e(t,i,r))return n=i,!1}),n}function C(t,e,i,n){for(var r=t.length,s=i+(n?1:-1);n?s--:++s<r;)if(e(t[s],s,t))return s;return-1}function k(t,e,i){return e===e?Z(t,e,i):C(t,D,i)}function T(t,e,i,n){for(var r=i-1,s=t.length;++r<s;)if(n(t[r],e))return r;return-1}function D(t){return t!==t}function S(t,e){var i=null==t?0:t.length;return i?O(t,e)/i:Mt}function A(t){return function(e){return null==e?rt:e[t]}}function E(t){return function(e){return null==t?rt:t[e]}}function I(t,e,i,n,r){return r(t,function(t,r,s){i=n?(n=!1,t):e(i,t,r,s)}),i}function $(t,e){var i=t.length;for(t.sort(e);i--;)t[i]=t[i].value;return t}function O(t,e){for(var i,n=-1,r=t.length;++n<r;){var s=e(t[n]);s!==rt&&(i=i===rt?s:i+s)}return i}function P(t,e){for(var i=-1,n=Array(t);++i<t;)n[i]=e(i);return n}function N(t,e){return g(e,function(e){return[e,t[e]]})}function M(t){return function(e){return t(e)}}function j(t,e){return g(e,function(e){return t[e]})}function H(t,e){return t.has(e)}function R(t,e){for(var i=-1,n=t.length;++i<n&&k(e,t[i],0)>-1;);return i}function L(t,e){for(var i=t.length;i--&&k(e,t[i],0)>-1;);return i}function F(t,e){for(var i=t.length,n=0;i--;)t[i]===e&&++n;return n}function z(t){return"\\"+Si[t]}function W(t,e){return null==t?rt:t[e]}function q(t){return _i.test(t)}function B(t){return yi.test(t)}function U(t){for(var e,i=[];!(e=t.next()).done;)i.push(e.value);return i}function Y(t){var e=-1,i=Array(t.size);return t.forEach(function(t,n){i[++e]=[n,t]}),i}function V(t,e){return function(i){return t(e(i))}}function K(t,e){for(var i=-1,n=t.length,r=0,s=[];++i<n;){var o=t[i];o!==e&&o!==ct||(t[i]=ct,s[r++]=i)}return s}function X(t){var e=-1,i=Array(t.size);return t.forEach(function(t){i[++e]=t}),i}function G(t){var e=-1,i=Array(t.size);return t.forEach(function(t){i[++e]=[t,t]}),i}function Z(t,e,i){for(var n=i-1,r=t.length;++n<r;)if(t[n]===e)return n;return-1}function J(t,e,i){for(var n=i+1;n--;)if(t[n]===e)return n;return n}function Q(t){return q(t)?et(t):Bi(t)}function tt(t){return q(t)?it(t):b(t)}function et(t){for(var e=mi.lastIndex=0;mi.test(t);)++e;return e}function it(t){return t.match(mi)||[]}function nt(t){return t.match(vi)||[]}var rt,st=200,ot="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",at="Expected a function",lt="__lodash_hash_undefined__",ut=500,ct="__lodash_placeholder__",ht=1,dt=2,pt=4,ft=1,gt=2,mt=1,vt=2,_t=4,yt=8,bt=16,wt=32,xt=64,Ct=128,kt=256,Tt=512,Dt=30,St="...",At=800,Et=16,It=1,$t=2,Ot=1/0,Pt=9007199254740991,Nt=1.7976931348623157e308,Mt=NaN,jt=4294967295,Ht=jt-1,Rt=jt>>>1,Lt=[["ary",Ct],["bind",mt],["bindKey",vt],["curry",yt],["curryRight",bt],["flip",Tt],["partial",wt],["partialRight",xt],["rearg",kt]],Ft="[object Arguments]",zt="[object Array]",Wt="[object AsyncFunction]",qt="[object Boolean]",Bt="[object Date]",Ut="[object DOMException]",Yt="[object Error]",Vt="[object Function]",Kt="[object GeneratorFunction]",Xt="[object Map]",Gt="[object Number]",Zt="[object Null]",Jt="[object Object]",Qt="[object Proxy]",te="[object RegExp]",ee="[object Set]",ie="[object String]",ne="[object Symbol]",re="[object Undefined]",se="[object WeakMap]",oe="[object WeakSet]",ae="[object ArrayBuffer]",le="[object DataView]",ue="[object Float32Array]",ce="[object Float64Array]",he="[object Int8Array]",de="[object Int16Array]",pe="[object Int32Array]",fe="[object Uint8Array]",ge="[object Uint8ClampedArray]",me="[object Uint16Array]",ve="[object Uint32Array]",_e=/\b__p \+= '';/g,ye=/\b(__p \+=) '' \+/g,be=/(__e\(.*?\)|\b__t\)) \+\n'';/g,we=/&(?:amp|lt|gt|quot|#39);/g,xe=/[&<>"']/g,Ce=RegExp(we.source),ke=RegExp(xe.source),Te=/<%-([\s\S]+?)%>/g,De=/<%([\s\S]+?)%>/g,Se=/<%=([\s\S]+?)%>/g,Ae=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ee=/^\w*$/,Ie=/^\./,$e=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Oe=/[\\^$.*+?()[\]{}|]/g,Pe=RegExp(Oe.source),Ne=/^\s+|\s+$/g,Me=/^\s+/,je=/\s+$/,He=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Re=/\{\n\/\* \[wrapped with (.+)\] \*/,Le=/,? & /,Fe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ze=/\\(\\)?/g,We=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,qe=/\w*$/,Be=/^[-+]0x[0-9a-f]+$/i,Ue=/^0b[01]+$/i,Ye=/^\[object .+?Constructor\]$/,Ve=/^0o[0-7]+$/i,Ke=/^(?:0|[1-9]\d*)$/,Xe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ge=/($^)/,Ze=/['\n\r\u2028\u2029\\]/g,Je="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Qe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",ti="["+Qe+"]",ei="["+Je+"]",ii="[a-z\\xdf-\\xf6\\xf8-\\xff]",ni="[^\\ud800-\\udfff"+Qe+"\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ri="\\ud83c[\\udffb-\\udfff]",si="(?:\\ud83c[\\udde6-\\uddff]){2}",oi="[\\ud800-\\udbff][\\udc00-\\udfff]",ai="[A-Z\\xc0-\\xd6\\xd8-\\xde]",li="(?:"+ii+"|"+ni+")",ui="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",ci="(?:\\u200d(?:"+["[^\\ud800-\\udfff]",si,oi].join("|")+")[\\ufe0e\\ufe0f]?"+ui+")*",hi="[\\ufe0e\\ufe0f]?"+ui+ci,di="(?:"+["[\\u2700-\\u27bf]",si,oi].join("|")+")"+hi,pi="(?:"+["[^\\ud800-\\udfff]"+ei+"?",ei,si,oi,"[\\ud800-\\udfff]"].join("|")+")",fi=RegExp("['’]","g"),gi=RegExp(ei,"g"),mi=RegExp(ri+"(?="+ri+")|"+pi+hi,"g"),vi=RegExp([ai+"?"+ii+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[ti,ai,"$"].join("|")+")","(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[ti,ai+li,"$"].join("|")+")",ai+"?"+li+"+(?:['’](?:d|ll|m|re|s|t|ve))?",ai+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)","\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)","\\d+",di].join("|"),"g"),_i=RegExp("[\\u200d\\ud800-\\udfff"+Je+"\\ufe0e\\ufe0f]"),yi=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,bi=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],wi=-1,xi={};xi[ue]=xi[ce]=xi[he]=xi[de]=xi[pe]=xi[fe]=xi[ge]=xi[me]=xi[ve]=!0,xi[Ft]=xi[zt]=xi[ae]=xi[qt]=xi[le]=xi[Bt]=xi[Yt]=xi[Vt]=xi[Xt]=xi[Gt]=xi[Jt]=xi[te]=xi[ee]=xi[ie]=xi[se]=!1;var Ci={};Ci[Ft]=Ci[zt]=Ci[ae]=Ci[le]=Ci[qt]=Ci[Bt]=Ci[ue]=Ci[ce]=Ci[he]=Ci[de]=Ci[pe]=Ci[Xt]=Ci[Gt]=Ci[Jt]=Ci[te]=Ci[ee]=Ci[ie]=Ci[ne]=Ci[fe]=Ci[ge]=Ci[me]=Ci[ve]=!0,Ci[Yt]=Ci[Vt]=Ci[se]=!1;var ki={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},Ti={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Di={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"},Si={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ai=parseFloat,Ei=parseInt,Ii="object"==typeof t&&t&&t.Object===Object&&t,$i="object"==typeof self&&self&&self.Object===Object&&self,Oi=Ii||$i||Function("return this")(),Pi="object"==typeof e&&e&&!e.nodeType&&e,Ni=Pi&&"object"==typeof n&&n&&!n.nodeType&&n,Mi=Ni&&Ni.exports===Pi,ji=Mi&&Ii.process,Hi=function(){try{return ji&&ji.binding&&ji.binding("util")}catch(t){}}(),Ri=Hi&&Hi.isArrayBuffer,Li=Hi&&Hi.isDate,Fi=Hi&&Hi.isMap,zi=Hi&&Hi.isRegExp,Wi=Hi&&Hi.isSet,qi=Hi&&Hi.isTypedArray,Bi=A("length"),Ui=E(ki),Yi=E(Ti),Vi=E(Di),Ki=function t(e){function i(t){if(sl(t)&&!md(t)&&!(t instanceof b)){if(t instanceof r)return t;if(mc.call(t,"__wrapped__"))return eo(t)}return new r(t)}function n(){}function r(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=rt}function b(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=jt,this.__views__=[]}function E(){var t=new b(this.__wrapped__);return t.__actions__=Hr(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Hr(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Hr(this.__views__),t}function Z(){if(this.__filtered__){var t=new b(this);t.__dir__=-1,t.__filtered__=!0}else t=this.clone(),t.__dir__*=-1;return t}function et(){var t=this.__wrapped__.value(),e=this.__dir__,i=md(t),n=e<0,r=i?t.length:0,s=Ds(0,r,this.__views__),o=s.start,a=s.end,l=a-o,u=n?a:o-1,c=this.__iteratees__,h=c.length,d=0,p=Yc(l,this.__takeCount__);if(!i||!n&&r==l&&p==l)return _r(t,this.__actions__);var f=[];t:for(;l--&&d<p;){u+=e;for(var g=-1,m=t[u];++g<h;){var v=c[g],_=v.iteratee,y=v.type,b=_(m);if(y==$t)m=b;else if(!b){if(y==It)continue t;break t}}f[d++]=m}return f}function it(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}function Fe(){this.__data__=ih?ih(null):{},this.size=0}function Je(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}function Qe(t){var e=this.__data__;if(ih){var i=e[t];return i===lt?rt:i}return mc.call(e,t)?e[t]:rt}function ti(t){var e=this.__data__;return ih?e[t]!==rt:mc.call(e,t)}function ei(t,e){var i=this.__data__;return this.size+=this.has(t)?0:1,i[t]=ih&&e===rt?lt:e,this}function ii(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}function ni(){this.__data__=[],this.size=0}function ri(t){var e=this.__data__,i=Xi(e,t);return!(i<0)&&(i==e.length-1?e.pop():Ic.call(e,i,1),--this.size,!0)}function si(t){var e=this.__data__,i=Xi(e,t);return i<0?rt:e[i][1]}function oi(t){return Xi(this.__data__,t)>-1}function ai(t,e){var i=this.__data__,n=Xi(i,t);return n<0?(++this.size,i.push([t,e])):i[n][1]=e,this}function li(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}function ui(){this.size=0,this.__data__={hash:new it,map:new(Jc||ii),string:new it}}function ci(t){var e=xs(this,t).delete(t);return this.size-=e?1:0,e}function hi(t){return xs(this,t).get(t)}function di(t){return xs(this,t).has(t)}function pi(t,e){var i=xs(this,t),n=i.size;return i.set(t,e),this.size+=i.size==n?0:1,this}function mi(t){var e=-1,i=null==t?0:t.length;for(this.__data__=new li;++e<i;)this.add(t[e])}function vi(t){return this.__data__.set(t,lt),this}function _i(t){return this.__data__.has(t)}function yi(t){var e=this.__data__=new ii(t);this.size=e.size}function ki(){this.__data__=new ii,this.size=0}function Ti(t){var e=this.__data__,i=e.delete(t);return this.size=e.size,i}function Di(t){return this.__data__.get(t)}function Si(t){return this.__data__.has(t)}function Ii(t,e){var i=this.__data__;if(i instanceof ii){var n=i.__data__;if(!Jc||n.length<st-1)return n.push([t,e]),this.size=++i.size,this;i=this.__data__=new li(n)}return i.set(t,e),this.size=i.size,this}function $i(t,e){var i=md(t),n=!i&&gd(t),r=!i&&!n&&_d(t),s=!i&&!n&&!r&&Cd(t),o=i||n||r||s,a=o?P(t.length,uc):[],l=a.length;for(var u in t)!e&&!mc.call(t,u)||o&&("length"==u||r&&("offset"==u||"parent"==u)||s&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||Ns(u,l))||a.push(u);return a}function Pi(t){var e=t.length;return e?t[Qn(0,e-1)]:rt}function Ni(t,e){return Zs(Hr(t),en(e,0,t.length))}function ji(t){return Zs(Hr(t))}function Hi(t,e,i){(i===rt||Ua(t[e],i))&&(i!==rt||e in t)||Qi(t,e,i)}function Bi(t,e,i){var n=t[e];mc.call(t,e)&&Ua(n,i)&&(i!==rt||e in t)||Qi(t,e,i)}function Xi(t,e){for(var i=t.length;i--;)if(Ua(t[i][0],e))return i;return-1}function Gi(t,e,i,n){return fh(t,function(t,r,s){e(n,t,i(t),s)}),n}function Zi(t,e){return t&&Rr(e,Fl(e),t)}function Ji(t,e){return t&&Rr(e,zl(e),t)}function Qi(t,e,i){"__proto__"==e&&Nc?Nc(t,e,{configurable:!0,enumerable:!0,value:i,writable:!0}):t[e]=i}function tn(t,e){for(var i=-1,n=e.length,r=ic(n),s=null==t;++i<n;)r[i]=s?rt:Hl(t,e[i]);return r}function en(t,e,i){return t===t&&(i!==rt&&(t=t<=i?t:i),e!==rt&&(t=t>=e?t:e)),t}function nn(t,e,i,n,r,s){var o,a=e&ht,l=e&dt,c=e&pt;if(i&&(o=r?i(t,n,r,s):i(t)),o!==rt)return o;if(!rl(t))return t;var h=md(t);if(h){if(o=Es(t),!a)return Hr(t,o)}else{var d=Dh(t),p=d==Vt||d==Kt;if(_d(t))return Tr(t,a);if(d==Jt||d==Ft||p&&!r){if(o=l||p?{}:Is(t),!a)return l?Fr(t,Ji(o,t)):Lr(t,Zi(o,t))}else{if(!Ci[d])return r?t:{};o=$s(t,d,nn,a)}}s||(s=new yi);var f=s.get(t);if(f)return f;s.set(t,o);var g=c?l?_s:vs:l?zl:Fl,m=h?rt:g(t);return u(m||t,function(n,r){m&&(r=n,n=t[r]),Bi(o,r,nn(n,e,i,r,t,s))}),o}function rn(t){var e=Fl(t);return function(i){return sn(i,t,e)}}function sn(t,e,i){var n=i.length;if(null==t)return!n;for(t=ac(t);n--;){var r=i[n],s=e[r],o=t[r];if(o===rt&&!(r in t)||!s(o))return!1}return!0}function on(t,e,i){if("function"!=typeof t)throw new cc(at);return Eh(function(){t.apply(rt,i)},e)}function an(t,e,i,n){var r=-1,s=p,o=!0,a=t.length,l=[],u=e.length;if(!a)return l;i&&(e=g(e,M(i))),n?(s=f,o=!1):e.length>=st&&(s=H,o=!1,e=new mi(e));t:for(;++r<a;){var c=t[r],h=null==i?c:i(c);if(c=n||0!==c?c:0,o&&h===h){for(var d=u;d--;)if(e[d]===h)continue t;l.push(c)}else s(e,h,n)||l.push(c)}return l}function ln(t,e){var i=!0;return fh(t,function(t,n,r){return i=!!e(t,n,r)}),i}function un(t,e,i){for(var n=-1,r=t.length;++n<r;){var s=t[n],o=e(s);if(null!=o&&(a===rt?o===o&&!ml(o):i(o,a)))var a=o,l=s}return l}function cn(t,e,i,n){var r=t.length;for(i=xl(i),i<0&&(i=-i>r?0:r+i),n=n===rt||n>r?r:xl(n),n<0&&(n+=r),n=i>n?0:Cl(n);i<n;)t[i++]=e;return t}function hn(t,e){var i=[];return fh(t,function(t,n,r){e(t,n,r)&&i.push(t)}),i}function dn(t,e,i,n,r){var s=-1,o=t.length;for(i||(i=Ps),r||(r=[]);++s<o;){var a=t[s];e>0&&i(a)?e>1?dn(a,e-1,i,n,r):m(r,a):n||(r[r.length]=a)}return r}function pn(t,e){return t&&mh(t,e,Fl)}function fn(t,e){return t&&vh(t,e,Fl)}function gn(t,e){return d(e,function(e){return el(t[e])})}function mn(t,e){e=Cr(e,t);for(var i=0,n=e.length;null!=t&&i<n;)t=t[Js(e[i++])];return i&&i==n?t:rt}function vn(t,e,i){var n=e(t);return md(t)?n:m(n,i(t))}function _n(t){return null==t?t===rt?re:Zt:Pc&&Pc in ac(t)?Ts(t):Us(t)}function yn(t,e){return t>e}function bn(t,e){return null!=t&&mc.call(t,e)}function wn(t,e){return null!=t&&e in ac(t)}function xn(t,e,i){return t>=Yc(e,i)&&t<Uc(e,i)}function Cn(t,e,i){for(var n=i?f:p,r=t[0].length,s=t.length,o=s,a=ic(s),l=1/0,u=[];o--;){var c=t[o];o&&e&&(c=g(c,M(e))),l=Yc(c.length,l),a[o]=!i&&(e||r>=120&&c.length>=120)?new mi(o&&c):rt}c=t[0];var h=-1,d=a[0];t:for(;++h<r&&u.length<l;){var m=c[h],v=e?e(m):m;if(m=i||0!==m?m:0,!(d?H(d,v):n(u,v,i))){for(o=s;--o;){var _=a[o];if(!(_?H(_,v):n(t[o],v,i)))continue t}d&&d.push(v),u.push(m)}}return u}function kn(t,e,i,n){return pn(t,function(t,r,s){e(n,i(t),r,s)}),n}function Tn(t,e,i){e=Cr(e,t),t=Vs(t,e);var n=null==t?t:t[Js(wo(e))];return null==n?rt:a(n,t,i)}function Dn(t){return sl(t)&&_n(t)==Ft}function Sn(t){return sl(t)&&_n(t)==ae}function An(t){return sl(t)&&_n(t)==Bt}function En(t,e,i,n,r){return t===e||(null==t||null==e||!sl(t)&&!sl(e)?t!==t&&e!==e:In(t,e,i,n,En,r))}function In(t,e,i,n,r,s){var o=md(t),a=md(e),l=o?zt:Dh(t),u=a?zt:Dh(e);l=l==Ft?Jt:l,u=u==Ft?Jt:u;var c=l==Jt,h=u==Jt,d=l==u;if(d&&_d(t)){if(!_d(e))return!1;o=!0,c=!1}if(d&&!c)return s||(s=new yi),o||Cd(t)?ps(t,e,i,n,r,s):fs(t,e,l,i,n,r,s);if(!(i&ft)){var p=c&&mc.call(t,"__wrapped__"),f=h&&mc.call(e,"__wrapped__");if(p||f){var g=p?t.value():t,m=f?e.value():e;return s||(s=new yi),r(g,m,i,n,s)}}return!!d&&(s||(s=new yi),gs(t,e,i,n,r,s))}function $n(t){return sl(t)&&Dh(t)==Xt}function On(t,e,i,n){var r=i.length,s=r,o=!n;if(null==t)return!s;for(t=ac(t);r--;){var a=i[r];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++r<s;){a=i[r];var l=a[0],u=t[l],c=a[1];if(o&&a[2]){if(u===rt&&!(l in t))return!1}else{var h=new yi;if(n)var d=n(u,c,l,t,e,h);if(!(d===rt?En(c,u,ft|gt,n,h):d))return!1}}return!0}function Pn(t){return!(!rl(t)||Ls(t))&&(el(t)?xc:Ye).test(Qs(t))}function Nn(t){return sl(t)&&_n(t)==te}function Mn(t){return sl(t)&&Dh(t)==ee}function jn(t){return sl(t)&&nl(t.length)&&!!xi[_n(t)]}function Hn(t){return"function"==typeof t?t:null==t?Iu:"object"==typeof t?md(t)?qn(t[0],t[1]):Wn(t):Ru(t)}function Rn(t){if(!Fs(t))return Bc(t);var e=[];for(var i in ac(t))mc.call(t,i)&&"constructor"!=i&&e.push(i);return e}function Ln(t){if(!rl(t))return Bs(t);var e=Fs(t),i=[];for(var n in t)("constructor"!=n||!e&&mc.call(t,n))&&i.push(n);return i}function Fn(t,e){return t<e}function zn(t,e){var i=-1,n=Ya(t)?ic(t.length):[];return fh(t,function(t,r,s){n[++i]=e(t,r,s)}),n}function Wn(t){var e=Cs(t);return 1==e.length&&e[0][2]?Ws(e[0][0],e[0][1]):function(i){return i===t||On(i,t,e)}}function qn(t,e){return js(t)&&zs(e)?Ws(Js(t),e):function(i){var n=Hl(i,t);return n===rt&&n===e?Ll(i,t):En(e,n,ft|gt)}}function Bn(t,e,i,n,r){t!==e&&mh(e,function(s,o){if(rl(s))r||(r=new yi),Un(t,e,o,i,Bn,n,r);else{var a=n?n(t[o],s,o+"",t,e,r):rt;a===rt&&(a=s),Hi(t,o,a)}},zl)}function Un(t,e,i,n,r,s,o){var a=t[i],l=e[i],u=o.get(l);if(u)return void Hi(t,i,u);var c=s?s(a,l,i+"",t,e,o):rt,h=c===rt;if(h){var d=md(l),p=!d&&_d(l),f=!d&&!p&&Cd(l);c=l,d||p||f?md(a)?c=a:Va(a)?c=Hr(a):p?(h=!1,c=Tr(l,!0)):f?(h=!1,c=Or(l,!0)):c=[]:pl(l)||gd(l)?(c=a,gd(a)?c=Tl(a):(!rl(a)||n&&el(a))&&(c=Is(l))):h=!1}h&&(o.set(l,c),r(c,l,n,s,o),o.delete(l)),Hi(t,i,c)}function Yn(t,e){var i=t.length;if(i)return e+=e<0?i:0,Ns(e,i)?t[e]:rt}function Vn(t,e,i){var n=-1;return e=g(e.length?e:[Iu],M(ws())),$(zn(t,function(t,i,r){return{criteria:g(e,function(e){return e(t)}),index:++n,value:t}}),function(t,e){return Nr(t,e,i)})}function Kn(t,e){return Xn(t,e,function(e,i){return Ll(t,i)})}function Xn(t,e,i){for(var n=-1,r=e.length,s={};++n<r;){var o=e[n],a=mn(t,o);i(a,o)&&sr(s,Cr(o,t),a)}return s}function Gn(t){return function(e){return mn(e,t)}}function Zn(t,e,i,n){var r=n?T:k,s=-1,o=e.length,a=t;for(t===e&&(e=Hr(e)),i&&(a=g(t,M(i)));++s<o;)for(var l=0,u=e[s],c=i?i(u):u;(l=r(a,c,l,n))>-1;)a!==t&&Ic.call(a,l,1),Ic.call(t,l,1);return t}function Jn(t,e){for(var i=t?e.length:0,n=i-1;i--;){var r=e[i];if(i==n||r!==s){var s=r;Ns(r)?Ic.call(t,r,1):gr(t,r)}}return t}function Qn(t,e){return t+Lc(Xc()*(e-t+1))}function tr(t,e,i,n){for(var r=-1,s=Uc(Rc((e-t)/(i||1)),0),o=ic(s);s--;)o[n?s:++r]=t,t+=i;return o}function er(t,e){var i="";if(!t||e<1||e>Pt)return i;do{e%2&&(i+=t),(e=Lc(e/2))&&(t+=t)}while(e);return i}function ir(t,e){return Ih(Ys(t,e,Iu),t+"")}function nr(t){return Pi(Ql(t))}function rr(t,e){var i=Ql(t);return Zs(i,en(e,0,i.length))}function sr(t,e,i,n){if(!rl(t))return t;e=Cr(e,t);for(var r=-1,s=e.length,o=s-1,a=t;null!=a&&++r<s;){var l=Js(e[r]),u=i;if(r!=o){var c=a[l];u=n?n(c,l,a):rt,u===rt&&(u=rl(c)?c:Ns(e[r+1])?[]:{})}Bi(a,l,u),a=a[l]}return t}function or(t){return Zs(Ql(t))}function ar(t,e,i){var n=-1,r=t.length;e<0&&(e=-e>r?0:r+e),i=i>r?r:i,i<0&&(i+=r),r=e>i?0:i-e>>>0,e>>>=0;for(var s=ic(r);++n<r;)s[n]=t[n+e];return s}function lr(t,e){var i;return fh(t,function(t,n,r){return!(i=e(t,n,r))}),!!i}function ur(t,e,i){var n=0,r=null==t?n:t.length;if("number"==typeof e&&e===e&&r<=Rt){for(;n<r;){var s=n+r>>>1,o=t[s];null!==o&&!ml(o)&&(i?o<=e:o<e)?n=s+1:r=s}return r}return cr(t,e,Iu,i)}function cr(t,e,i,n){e=i(e);for(var r=0,s=null==t?0:t.length,o=e!==e,a=null===e,l=ml(e),u=e===rt;r<s;){var c=Lc((r+s)/2),h=i(t[c]),d=h!==rt,p=null===h,f=h===h,g=ml(h);if(o)var m=n||f;else m=u?f&&(n||d):a?f&&d&&(n||!p):l?f&&d&&!p&&(n||!g):!p&&!g&&(n?h<=e:h<e);m?r=c+1:s=c}return Yc(s,Ht)}function hr(t,e){for(var i=-1,n=t.length,r=0,s=[];++i<n;){var o=t[i],a=e?e(o):o;if(!i||!Ua(a,l)){var l=a;s[r++]=0===o?0:o}}return s}function dr(t){return"number"==typeof t?t:ml(t)?Mt:+t}function pr(t){if("string"==typeof t)return t;if(md(t))return g(t,pr)+"";if(ml(t))return dh?dh.call(t):"";var e=t+"";return"0"==e&&1/t==-Ot?"-0":e}function fr(t,e,i){var n=-1,r=p,s=t.length,o=!0,a=[],l=a;if(i)o=!1,r=f;else if(s>=st){var u=e?null:xh(t);if(u)return X(u);o=!1,r=H,l=new mi}else l=e?[]:a;t:for(;++n<s;){var c=t[n],h=e?e(c):c;if(c=i||0!==c?c:0,o&&h===h){for(var d=l.length;d--;)if(l[d]===h)continue t;e&&l.push(h),a.push(c)}else r(l,h,i)||(l!==a&&l.push(h),a.push(c))}return a}function gr(t,e){return e=Cr(e,t),null==(t=Vs(t,e))||delete t[Js(wo(e))]}function mr(t,e,i,n){return sr(t,e,i(mn(t,e)),n)}function vr(t,e,i,n){for(var r=t.length,s=n?r:-1;(n?s--:++s<r)&&e(t[s],s,t););return i?ar(t,n?0:s,n?s+1:r):ar(t,n?s+1:0,n?r:s)}function _r(t,e){var i=t;return i instanceof b&&(i=i.value()),v(e,function(t,e){return e.func.apply(e.thisArg,m([t],e.args))},i)}function yr(t,e,i){var n=t.length;if(n<2)return n?fr(t[0]):[];for(var r=-1,s=ic(n);++r<n;)for(var o=t[r],a=-1;++a<n;)a!=r&&(s[r]=an(s[r]||o,t[a],e,i));return fr(dn(s,1),e,i)}function br(t,e,i){for(var n=-1,r=t.length,s=e.length,o={};++n<r;){var a=n<s?e[n]:rt;i(o,t[n],a)}return o}function wr(t){return Va(t)?t:[]}function xr(t){return"function"==typeof t?t:Iu}function Cr(t,e){return md(t)?t:js(t,e)?[t]:$h(Sl(t))}function kr(t,e,i){var n=t.length;return i=i===rt?n:i,!e&&i>=n?t:ar(t,e,i)}function Tr(t,e){if(e)return t.slice();var i=t.length,n=Dc?Dc(i):new t.constructor(i);return t.copy(n),n}function Dr(t){var e=new t.constructor(t.byteLength);return new Tc(e).set(new Tc(t)),e}function Sr(t,e){var i=e?Dr(t.buffer):t.buffer;return new t.constructor(i,t.byteOffset,t.byteLength)}function Ar(t,e,i){return v(e?i(Y(t),ht):Y(t),s,new t.constructor)}function Er(t){var e=new t.constructor(t.source,qe.exec(t));return e.lastIndex=t.lastIndex,e}function Ir(t,e,i){return v(e?i(X(t),ht):X(t),o,new t.constructor)}function $r(t){return hh?ac(hh.call(t)):{}}function Or(t,e){var i=e?Dr(t.buffer):t.buffer;return new t.constructor(i,t.byteOffset,t.length)}function Pr(t,e){if(t!==e){var i=t!==rt,n=null===t,r=t===t,s=ml(t),o=e!==rt,a=null===e,l=e===e,u=ml(e);if(!a&&!u&&!s&&t>e||s&&o&&l&&!a&&!u||n&&o&&l||!i&&l||!r)return 1;if(!n&&!s&&!u&&t<e||u&&i&&r&&!n&&!s||a&&i&&r||!o&&r||!l)return-1}return 0}function Nr(t,e,i){for(var n=-1,r=t.criteria,s=e.criteria,o=r.length,a=i.length;++n<o;){var l=Pr(r[n],s[n]);if(l){if(n>=a)return l;return l*("desc"==i[n]?-1:1)}}return t.index-e.index}function Mr(t,e,i,n){for(var r=-1,s=t.length,o=i.length,a=-1,l=e.length,u=Uc(s-o,0),c=ic(l+u),h=!n;++a<l;)c[a]=e[a];for(;++r<o;)(h||r<s)&&(c[i[r]]=t[r]);for(;u--;)c[a++]=t[r++];return c}function jr(t,e,i,n){for(var r=-1,s=t.length,o=-1,a=i.length,l=-1,u=e.length,c=Uc(s-a,0),h=ic(c+u),d=!n;++r<c;)h[r]=t[r];for(var p=r;++l<u;)h[p+l]=e[l];for(;++o<a;)(d||r<s)&&(h[p+i[o]]=t[r++]);return h}function Hr(t,e){var i=-1,n=t.length;for(e||(e=ic(n));++i<n;)e[i]=t[i];return e}function Rr(t,e,i,n){var r=!i;i||(i={});for(var s=-1,o=e.length;++s<o;){var a=e[s],l=n?n(i[a],t[a],a,i,t):rt;l===rt&&(l=t[a]),r?Qi(i,a,l):Bi(i,a,l)}return i}function Lr(t,e){return Rr(t,kh(t),e)}function Fr(t,e){return Rr(t,Th(t),e)}function zr(t,e){return function(i,n){var r=md(i)?l:Gi,s=e?e():{};return r(i,t,ws(n,2),s)}}function Wr(t){return ir(function(e,i){var n=-1,r=i.length,s=r>1?i[r-1]:rt,o=r>2?i[2]:rt;for(s=t.length>3&&"function"==typeof s?(r--,s):rt,o&&Ms(i[0],i[1],o)&&(s=r<3?rt:s,r=1),e=ac(e);++n<r;){var a=i[n];a&&t(e,a,n,s)}return e})}function qr(t,e){return function(i,n){if(null==i)return i;if(!Ya(i))return t(i,n);for(var r=i.length,s=e?r:-1,o=ac(i);(e?s--:++s<r)&&!1!==n(o[s],s,o););return i}}function Br(t){return function(e,i,n){for(var r=-1,s=ac(e),o=n(e),a=o.length;a--;){var l=o[t?a:++r];if(!1===i(s[l],l,s))break}return e}}function Ur(t,e,i){function n(){return(this&&this!==Oi&&this instanceof n?s:t).apply(r?i:this,arguments)}var r=e&mt,s=Kr(t);return n}function Yr(t){return function(e){e=Sl(e);var i=q(e)?tt(e):rt,n=i?i[0]:e.charAt(0),r=i?kr(i,1).join(""):e.slice(1);return n[t]()+r}}function Vr(t){return function(e){return v(Tu(su(e).replace(fi,"")),t,"")}}function Kr(t){return function(){var e=arguments;switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3]);case 5:return new t(e[0],e[1],e[2],e[3],e[4]);case 6:return new t(e[0],e[1],e[2],e[3],e[4],e[5]);case 7:return new t(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}var i=ph(t.prototype),n=t.apply(i,e);return rl(n)?n:i}}function Xr(t,e,i){function n(){for(var s=arguments.length,o=ic(s),l=s,u=bs(n);l--;)o[l]=arguments[l];var c=s<3&&o[0]!==u&&o[s-1]!==u?[]:K(o,u);return(s-=c.length)<i?os(t,e,Jr,n.placeholder,rt,o,c,rt,rt,i-s):a(this&&this!==Oi&&this instanceof n?r:t,this,o)}var r=Kr(t);return n}function Gr(t){return function(e,i,n){var r=ac(e);if(!Ya(e)){var s=ws(i,3);e=Fl(e),i=function(t){return s(r[t],t,r)}}var o=t(e,i,n);return o>-1?r[s?e[o]:o]:rt}}function Zr(t){return ms(function(e){var i=e.length,n=i,s=r.prototype.thru;for(t&&e.reverse();n--;){var o=e[n];if("function"!=typeof o)throw new cc(at);if(s&&!a&&"wrapper"==ys(o))var a=new r([],!0)}for(n=a?n:i;++n<i;){o=e[n];var l=ys(o),u="wrapper"==l?Ch(o):rt;a=u&&Rs(u[0])&&u[1]==(Ct|yt|wt|kt)&&!u[4].length&&1==u[9]?a[ys(u[0])].apply(a,u[3]):1==o.length&&Rs(o)?a[l]():a.thru(o)}return function(){var t=arguments,n=t[0];if(a&&1==t.length&&md(n))return a.plant(n).value();for(var r=0,s=i?e[r].apply(this,t):n;++r<i;)s=e[r].call(this,s);return s}})}function Jr(t,e,i,n,r,s,o,a,l,u){function c(){for(var v=arguments.length,_=ic(v),y=v;y--;)_[y]=arguments[y];if(f)var b=bs(c),w=F(_,b);if(n&&(_=Mr(_,n,r,f)),s&&(_=jr(_,s,o,f)),v-=w,f&&v<u){var x=K(_,b);return os(t,e,Jr,c.placeholder,i,_,x,a,l,u-v)}var C=d?i:this,k=p?C[t]:t;return v=_.length,a?_=Ks(_,a):g&&v>1&&_.reverse(),h&&l<v&&(_.length=l),this&&this!==Oi&&this instanceof c&&(k=m||Kr(k)),k.apply(C,_)}var h=e&Ct,d=e&mt,p=e&vt,f=e&(yt|bt),g=e&Tt,m=p?rt:Kr(t);return c}function Qr(t,e){return function(i,n){return kn(i,t,e(n),{})}}function ts(t,e){return function(i,n){var r;if(i===rt&&n===rt)return e;if(i!==rt&&(r=i),n!==rt){if(r===rt)return n;"string"==typeof i||"string"==typeof n?(i=pr(i),n=pr(n)):(i=dr(i),n=dr(n)),r=t(i,n)}return r}}function es(t){return ms(function(e){return e=g(e,M(ws())),ir(function(i){var n=this;return t(e,function(t){return a(t,n,i)})})})}function is(t,e){e=e===rt?" ":pr(e);var i=e.length;if(i<2)return i?er(e,t):e;var n=er(e,Rc(t/Q(e)));return q(e)?kr(tt(n),0,t).join(""):n.slice(0,t)}function ns(t,e,i,n){function r(){for(var e=-1,l=arguments.length,u=-1,c=n.length,h=ic(c+l),d=this&&this!==Oi&&this instanceof r?o:t;++u<c;)h[u]=n[u];for(;l--;)h[u++]=arguments[++e];return a(d,s?i:this,h)}var s=e&mt,o=Kr(t);return r}function rs(t){return function(e,i,n){return n&&"number"!=typeof n&&Ms(e,i,n)&&(i=n=rt),e=wl(e),i===rt?(i=e,e=0):i=wl(i),n=n===rt?e<i?1:-1:wl(n),tr(e,i,n,t)}}function ss(t){return function(e,i){return"string"==typeof e&&"string"==typeof i||(e=kl(e),i=kl(i)),t(e,i)}}function os(t,e,i,n,r,s,o,a,l,u){var c=e&yt,h=c?o:rt,d=c?rt:o,p=c?s:rt,f=c?rt:s;e|=c?wt:xt,(e&=~(c?xt:wt))&_t||(e&=~(mt|vt));var g=[t,e,r,p,h,f,d,a,l,u],m=i.apply(rt,g);return Rs(t)&&Ah(m,g),m.placeholder=n,Xs(m,t,e)}function as(t){var e=oc[t];return function(t,i){if(t=kl(t),i=null==i?0:Yc(xl(i),292)){var n=(Sl(t)+"e").split("e");return n=(Sl(e(n[0]+"e"+(+n[1]+i)))+"e").split("e"),+(n[0]+"e"+(+n[1]-i))}return e(t)}}function ls(t){return function(e){var i=Dh(e);return i==Xt?Y(e):i==ee?G(e):N(e,t(e))}}function us(t,e,i,n,r,s,o,a){var l=e&vt;if(!l&&"function"!=typeof t)throw new cc(at);var u=n?n.length:0;if(u||(e&=~(wt|xt),n=r=rt),o=o===rt?o:Uc(xl(o),0),a=a===rt?a:xl(a),u-=r?r.length:0,e&xt){var c=n,h=r;n=r=rt}var d=l?rt:Ch(t),p=[t,e,i,n,r,c,h,s,o,a];if(d&&qs(p,d),t=p[0],e=p[1],i=p[2],n=p[3],r=p[4],a=p[9]=p[9]===rt?l?0:t.length:Uc(p[9]-u,0),!a&&e&(yt|bt)&&(e&=~(yt|bt)),e&&e!=mt)f=e==yt||e==bt?Xr(t,e,a):e!=wt&&e!=(mt|wt)||r.length?Jr.apply(rt,p):ns(t,e,i,n);else var f=Ur(t,e,i);return Xs((d?_h:Ah)(f,p),t,e)}function cs(t,e,i,n){return t===rt||Ua(t,pc[i])&&!mc.call(n,i)?e:t}function hs(t,e,i,n,r,s){return rl(t)&&rl(e)&&(s.set(e,t),Bn(t,e,rt,hs,s),s.delete(e)),t}function ds(t){return pl(t)?rt:t}function ps(t,e,i,n,r,s){var o=i&ft,a=t.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var u=s.get(t);if(u&&s.get(e))return u==e;var c=-1,h=!0,d=i&gt?new mi:rt;for(s.set(t,e),s.set(e,t);++c<a;){var p=t[c],f=e[c];if(n)var g=o?n(f,p,c,e,t,s):n(p,f,c,t,e,s);if(g!==rt){if(g)continue;h=!1;break}if(d){if(!y(e,function(t,e){if(!H(d,e)&&(p===t||r(p,t,i,n,s)))return d.push(e)})){h=!1;break}}else if(p!==f&&!r(p,f,i,n,s)){h=!1;break}}return s.delete(t),s.delete(e),h}function fs(t,e,i,n,r,s,o){switch(i){case le:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ae:return!(t.byteLength!=e.byteLength||!s(new Tc(t),new Tc(e)));case qt:case Bt:case Gt:return Ua(+t,+e);case Yt:return t.name==e.name&&t.message==e.message;case te:case ie:return t==e+"";case Xt:var a=Y;case ee:var l=n&ft;if(a||(a=X),t.size!=e.size&&!l)return!1;var u=o.get(t);if(u)return u==e;n|=gt,o.set(t,e);var c=ps(a(t),a(e),n,r,s,o);return o.delete(t),c;case ne:if(hh)return hh.call(t)==hh.call(e)}return!1}function gs(t,e,i,n,r,s){var o=i&ft,a=vs(t),l=a.length;if(l!=vs(e).length&&!o)return!1;for(var u=l;u--;){var c=a[u];if(!(o?c in e:mc.call(e,c)))return!1}var h=s.get(t);if(h&&s.get(e))return h==e;var d=!0;s.set(t,e),s.set(e,t);for(var p=o;++u<l;){c=a[u];var f=t[c],g=e[c];if(n)var m=o?n(g,f,c,e,t,s):n(f,g,c,t,e,s);if(!(m===rt?f===g||r(f,g,i,n,s):m)){d=!1;break}p||(p="constructor"==c)}if(d&&!p){var v=t.constructor,_=e.constructor;v!=_&&"constructor"in t&&"constructor"in e&&!("function"==typeof v&&v instanceof v&&"function"==typeof _&&_ instanceof _)&&(d=!1)}return s.delete(t),s.delete(e),d}function ms(t){return Ih(Ys(t,rt,po),t+"")}function vs(t){return vn(t,Fl,kh)}function _s(t){return vn(t,zl,Th)}function ys(t){for(var e=t.name+"",i=rh[e],n=mc.call(rh,e)?i.length:0;n--;){var r=i[n],s=r.func;if(null==s||s==t)return r.name}return e}function bs(t){return(mc.call(i,"placeholder")?i:t).placeholder}function ws(){var t=i.iteratee||$u;return t=t===$u?Hn:t,arguments.length?t(arguments[0],arguments[1]):t}function xs(t,e){var i=t.__data__;return Hs(e)?i["string"==typeof e?"string":"hash"]:i.map}function Cs(t){for(var e=Fl(t),i=e.length;i--;){var n=e[i],r=t[n];e[i]=[n,r,zs(r)]}return e}function ks(t,e){var i=W(t,e);return Pn(i)?i:rt}function Ts(t){var e=mc.call(t,Pc),i=t[Pc];try{t[Pc]=rt;var n=!0}catch(t){}var r=yc.call(t);return n&&(e?t[Pc]=i:delete t[Pc]),r}function Ds(t,e,i){for(var n=-1,r=i.length;++n<r;){var s=i[n],o=s.size;switch(s.type){case"drop":t+=o;break;case"dropRight":e-=o;break;case"take":e=Yc(e,t+o);break;case"takeRight":t=Uc(t,e-o)}}return{start:t,end:e}}function Ss(t){var e=t.match(Re);return e?e[1].split(Le):[]}function As(t,e,i){e=Cr(e,t);for(var n=-1,r=e.length,s=!1;++n<r;){var o=Js(e[n]);if(!(s=null!=t&&i(t,o)))break;t=t[o]}return s||++n!=r?s:!!(r=null==t?0:t.length)&&nl(r)&&Ns(o,r)&&(md(t)||gd(t))}function Es(t){var e=t.length,i=t.constructor(e);return e&&"string"==typeof t[0]&&mc.call(t,"index")&&(i.index=t.index,i.input=t.input),i}function Is(t){return"function"!=typeof t.constructor||Fs(t)?{}:ph(Sc(t))}function $s(t,e,i,n){var r=t.constructor;switch(e){case ae:return Dr(t);case qt:case Bt:return new r(+t);case le:return Sr(t,n);case ue:case ce:case he:case de:case pe:case fe:case ge:case me:case ve:return Or(t,n);case Xt:return Ar(t,n,i);case Gt:case ie:return new r(t);case te:return Er(t);case ee:return Ir(t,n,i);case ne:return $r(t)}}function Os(t,e){var i=e.length;if(!i)return t;var n=i-1;return e[n]=(i>1?"& ":"")+e[n],e=e.join(i>2?", ":" "),t.replace(He,"{\n/* [wrapped with "+e+"] */\n")}function Ps(t){return md(t)||gd(t)||!!($c&&t&&t[$c])}function Ns(t,e){return!!(e=null==e?Pt:e)&&("number"==typeof t||Ke.test(t))&&t>-1&&t%1==0&&t<e}function Ms(t,e,i){if(!rl(i))return!1;var n=typeof e;return!!("number"==n?Ya(i)&&Ns(e,i.length):"string"==n&&e in i)&&Ua(i[e],t)}function js(t,e){if(md(t))return!1;var i=typeof t;return!("number"!=i&&"symbol"!=i&&"boolean"!=i&&null!=t&&!ml(t))||(Ee.test(t)||!Ae.test(t)||null!=e&&t in ac(e))}function Hs(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}function Rs(t){var e=ys(t),n=i[e];if("function"!=typeof n||!(e in b.prototype))return!1;if(t===n)return!0;var r=Ch(n);return!!r&&t===r[0]}function Ls(t){return!!_c&&_c in t}function Fs(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||pc)}function zs(t){return t===t&&!rl(t)}function Ws(t,e){return function(i){return null!=i&&(i[t]===e&&(e!==rt||t in ac(i)))}}function qs(t,e){var i=t[1],n=e[1],r=i|n,s=r<(mt|vt|Ct),o=n==Ct&&i==yt||n==Ct&&i==kt&&t[7].length<=e[8]||n==(Ct|kt)&&e[7].length<=e[8]&&i==yt;if(!s&&!o)return t;n&mt&&(t[2]=e[2],r|=i&mt?0:_t);var a=e[3];if(a){var l=t[3];t[3]=l?Mr(l,a,e[4]):a,t[4]=l?K(t[3],ct):e[4]}return a=e[5],a&&(l=t[5],t[5]=l?jr(l,a,e[6]):a,t[6]=l?K(t[5],ct):e[6]),a=e[7],a&&(t[7]=a),n&Ct&&(t[8]=null==t[8]?e[8]:Yc(t[8],e[8])),null==t[9]&&(t[9]=e[9]),t[0]=e[0],t[1]=r,t}function Bs(t){var e=[];if(null!=t)for(var i in ac(t))e.push(i);return e}function Us(t){return yc.call(t)}function Ys(t,e,i){return e=Uc(e===rt?t.length-1:e,0),function(){for(var n=arguments,r=-1,s=Uc(n.length-e,0),o=ic(s);++r<s;)o[r]=n[e+r];r=-1;for(var l=ic(e+1);++r<e;)l[r]=n[r];return l[e]=i(o),a(t,this,l)}}function Vs(t,e){return e.length<2?t:mn(t,ar(e,0,-1))}function Ks(t,e){for(var i=t.length,n=Yc(e.length,i),r=Hr(t);n--;){var s=e[n];t[n]=Ns(s,i)?r[s]:rt}return t}function Xs(t,e,i){var n=e+"";return Ih(t,Os(n,to(Ss(n),i)))}function Gs(t){var e=0,i=0;return function(){var n=Vc(),r=Et-(n-i);if(i=n,r>0){if(++e>=At)return arguments[0]}else e=0;return t.apply(rt,arguments)}}function Zs(t,e){var i=-1,n=t.length,r=n-1;for(e=e===rt?n:e;++i<e;){var s=Qn(i,r),o=t[s];t[s]=t[i],t[i]=o}return t.length=e,t}function Js(t){if("string"==typeof t||ml(t))return t;var e=t+"";return"0"==e&&1/t==-Ot?"-0":e}function Qs(t){if(null!=t){try{return gc.call(t)}catch(t){}try{return t+""}catch(t){}}return""}function to(t,e){return u(Lt,function(i){var n="_."+i[0];e&i[1]&&!p(t,n)&&t.push(n)}),t.sort()}function eo(t){if(t instanceof b)return t.clone();var e=new r(t.__wrapped__,t.__chain__);return e.__actions__=Hr(t.__actions__),e.__index__=t.__index__,e.__values__=t.__values__,e}function io(t,e,i){e=(i?Ms(t,e,i):e===rt)?1:Uc(xl(e),0);var n=null==t?0:t.length;if(!n||e<1)return[];for(var r=0,s=0,o=ic(Rc(n/e));r<n;)o[s++]=ar(t,r,r+=e);return o}function no(t){for(var e=-1,i=null==t?0:t.length,n=0,r=[];++e<i;){var s=t[e];s&&(r[n++]=s)}return r}function ro(){var t=arguments.length;if(!t)return[];for(var e=ic(t-1),i=arguments[0],n=t;n--;)e[n-1]=arguments[n];return m(md(i)?Hr(i):[i],dn(e,1))}function so(t,e,i){var n=null==t?0:t.length;return n?(e=i||e===rt?1:xl(e),ar(t,e<0?0:e,n)):[]}function oo(t,e,i){var n=null==t?0:t.length;return n?(e=i||e===rt?1:xl(e),e=n-e,ar(t,0,e<0?0:e)):[]}function ao(t,e){return t&&t.length?vr(t,ws(e,3),!0,!0):[]}function lo(t,e){return t&&t.length?vr(t,ws(e,3),!0):[]}function uo(t,e,i,n){var r=null==t?0:t.length;return r?(i&&"number"!=typeof i&&Ms(t,e,i)&&(i=0,n=r),cn(t,e,i,n)):[]}function co(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=null==i?0:xl(i);return r<0&&(r=Uc(n+r,0)),C(t,ws(e,3),r)}function ho(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=n-1;return i!==rt&&(r=xl(i),r=i<0?Uc(n+r,0):Yc(r,n-1)),C(t,ws(e,3),r,!0)}function po(t){return(null==t?0:t.length)?dn(t,1):[]}function fo(t){return(null==t?0:t.length)?dn(t,Ot):[]}function go(t,e){return(null==t?0:t.length)?(e=e===rt?1:xl(e),dn(t,e)):[]}function mo(t){for(var e=-1,i=null==t?0:t.length,n={};++e<i;){var r=t[e];n[r[0]]=r[1]}return n}function vo(t){return t&&t.length?t[0]:rt}function _o(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=null==i?0:xl(i);return r<0&&(r=Uc(n+r,0)),k(t,e,r)}function yo(t){return(null==t?0:t.length)?ar(t,0,-1):[]}function bo(t,e){return null==t?"":qc.call(t,e)}function wo(t){var e=null==t?0:t.length;return e?t[e-1]:rt}function xo(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=n;return i!==rt&&(r=xl(i),r=r<0?Uc(n+r,0):Yc(r,n-1)),e===e?J(t,e,r):C(t,D,r,!0)}function Co(t,e){return t&&t.length?Yn(t,xl(e)):rt}function ko(t,e){return t&&t.length&&e&&e.length?Zn(t,e):t}function To(t,e,i){return t&&t.length&&e&&e.length?Zn(t,e,ws(i,2)):t}function Do(t,e,i){return t&&t.length&&e&&e.length?Zn(t,e,rt,i):t}function So(t,e){var i=[];if(!t||!t.length)return i;var n=-1,r=[],s=t.length;for(e=ws(e,3);++n<s;){var o=t[n];e(o,n,t)&&(i.push(o),r.push(n))}return Jn(t,r),i}function Ao(t){return null==t?t:Gc.call(t)}function Eo(t,e,i){var n=null==t?0:t.length;return n?(i&&"number"!=typeof i&&Ms(t,e,i)?(e=0,i=n):(e=null==e?0:xl(e),i=i===rt?n:xl(i)),ar(t,e,i)):[]}function Io(t,e){return ur(t,e)}function $o(t,e,i){return cr(t,e,ws(i,2))}function Oo(t,e){var i=null==t?0:t.length;if(i){var n=ur(t,e);if(n<i&&Ua(t[n],e))return n}return-1}function Po(t,e){return ur(t,e,!0)}function No(t,e,i){return cr(t,e,ws(i,2),!0)}function Mo(t,e){if(null==t?0:t.length){var i=ur(t,e,!0)-1;if(Ua(t[i],e))return i}return-1}function jo(t){return t&&t.length?hr(t):[]}function Ho(t,e){return t&&t.length?hr(t,ws(e,2)):[]}function Ro(t){var e=null==t?0:t.length;return e?ar(t,1,e):[]}function Lo(t,e,i){return t&&t.length?(e=i||e===rt?1:xl(e),ar(t,0,e<0?0:e)):[]}function Fo(t,e,i){var n=null==t?0:t.length;return n?(e=i||e===rt?1:xl(e),e=n-e,ar(t,e<0?0:e,n)):[]}function zo(t,e){return t&&t.length?vr(t,ws(e,3),!1,!0):[]}function Wo(t,e){return t&&t.length?vr(t,ws(e,3)):[]}function qo(t){return t&&t.length?fr(t):[]}function Bo(t,e){return t&&t.length?fr(t,ws(e,2)):[]}function Uo(t,e){return e="function"==typeof e?e:rt,t&&t.length?fr(t,rt,e):[]}function Yo(t){if(!t||!t.length)return[];var e=0;return t=d(t,function(t){if(Va(t))return e=Uc(t.length,e),!0}),P(e,function(e){return g(t,A(e))})}function Vo(t,e){if(!t||!t.length)return[];var i=Yo(t);return null==e?i:g(i,function(t){return a(e,rt,t)})}function Ko(t,e){return br(t||[],e||[],Bi)}function Xo(t,e){return br(t||[],e||[],sr)}function Go(t){var e=i(t);return e.__chain__=!0,e}function Zo(t,e){return e(t),t}function Jo(t,e){return e(t)}function Qo(){return Go(this)}function ta(){return new r(this.value(),this.__chain__)}function ea(){this.__values__===rt&&(this.__values__=bl(this.value()));var t=this.__index__>=this.__values__.length;return{done:t,value:t?rt:this.__values__[this.__index__++]}}function ia(){return this}function na(t){for(var e,i=this;i instanceof n;){var r=eo(i);r.__index__=0,r.__values__=rt,e?s.__wrapped__=r:e=r;var s=r;i=i.__wrapped__}return s.__wrapped__=t,e}function ra(){var t=this.__wrapped__;if(t instanceof b){var e=t;return this.__actions__.length&&(e=new b(this)),e=e.reverse(),e.__actions__.push({func:Jo,args:[Ao],thisArg:rt}),new r(e,this.__chain__)}return this.thru(Ao)}function sa(){return _r(this.__wrapped__,this.__actions__)}function oa(t,e,i){var n=md(t)?h:ln;return i&&Ms(t,e,i)&&(e=rt),n(t,ws(e,3))}function aa(t,e){return(md(t)?d:hn)(t,ws(e,3))}function la(t,e){return dn(fa(t,e),1)}function ua(t,e){return dn(fa(t,e),Ot)}function ca(t,e,i){return i=i===rt?1:xl(i),dn(fa(t,e),i)}function ha(t,e){return(md(t)?u:fh)(t,ws(e,3))}function da(t,e){return(md(t)?c:gh)(t,ws(e,3))}function pa(t,e,i,n){t=Ya(t)?t:Ql(t),i=i&&!n?xl(i):0;var r=t.length;return i<0&&(i=Uc(r+i,0)),gl(t)?i<=r&&t.indexOf(e,i)>-1:!!r&&k(t,e,i)>-1}function fa(t,e){return(md(t)?g:zn)(t,ws(e,3))}function ga(t,e,i,n){return null==t?[]:(md(e)||(e=null==e?[]:[e]),i=n?rt:i,md(i)||(i=null==i?[]:[i]),Vn(t,e,i))}function ma(t,e,i){var n=md(t)?v:I,r=arguments.length<3;return n(t,ws(e,4),i,r,fh)}function va(t,e,i){var n=md(t)?_:I,r=arguments.length<3;return n(t,ws(e,4),i,r,gh)}function _a(t,e){return(md(t)?d:hn)(t,Oa(ws(e,3)))}function ya(t){return(md(t)?Pi:nr)(t)}function ba(t,e,i){return e=(i?Ms(t,e,i):e===rt)?1:xl(e),(md(t)?Ni:rr)(t,e)}function wa(t){return(md(t)?ji:or)(t)}function xa(t){if(null==t)return 0;if(Ya(t))return gl(t)?Q(t):t.length;var e=Dh(t);return e==Xt||e==ee?t.size:Rn(t).length}function Ca(t,e,i){var n=md(t)?y:lr;return i&&Ms(t,e,i)&&(e=rt),n(t,ws(e,3))}function ka(t,e){if("function"!=typeof e)throw new cc(at);return t=xl(t),function(){if(--t<1)return e.apply(this,arguments)}}function Ta(t,e,i){return e=i?rt:e,e=t&&null==e?t.length:e,us(t,Ct,rt,rt,rt,rt,e)}function Da(t,e){var i;if("function"!=typeof e)throw new cc(at);return t=xl(t),function(){return--t>0&&(i=e.apply(this,arguments)),t<=1&&(e=rt),i}}function Sa(t,e,i){e=i?rt:e;var n=us(t,yt,rt,rt,rt,rt,rt,e);return n.placeholder=Sa.placeholder,n}function Aa(t,e,i){e=i?rt:e;var n=us(t,bt,rt,rt,rt,rt,rt,e);return n.placeholder=Aa.placeholder,n}function Ea(t,e,i){function n(e){var i=d,n=p;return d=p=rt,_=e,g=t.apply(n,i)}function r(t){return _=t,m=Eh(a,e),y?n(t):g}function s(t){var i=t-v,n=t-_,r=e-i;return b?Yc(r,f-n):r}function o(t){var i=t-v,n=t-_;return v===rt||i>=e||i<0||b&&n>=f}function a(){var t=rd();if(o(t))return l(t);m=Eh(a,s(t))}function l(t){return m=rt,w&&d?n(t):(d=p=rt,g)}function u(){m!==rt&&wh(m),_=0,d=v=p=m=rt}function c(){return m===rt?g:l(rd())}function h(){var t=rd(),i=o(t);if(d=arguments,p=this,v=t,i){if(m===rt)return r(v);if(b)return m=Eh(a,e),n(v)}return m===rt&&(m=Eh(a,e)),g}var d,p,f,g,m,v,_=0,y=!1,b=!1,w=!0;if("function"!=typeof t)throw new cc(at);return e=kl(e)||0,rl(i)&&(y=!!i.leading,b="maxWait"in i,f=b?Uc(kl(i.maxWait)||0,e):f,w="trailing"in i?!!i.trailing:w),h.cancel=u,h.flush=c,h}function Ia(t){return us(t,Tt)}function $a(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new cc(at);var i=function(){var n=arguments,r=e?e.apply(this,n):n[0],s=i.cache;if(s.has(r))return s.get(r);var o=t.apply(this,n);return i.cache=s.set(r,o)||s,o};return i.cache=new($a.Cache||li),i}function Oa(t){if("function"!=typeof t)throw new cc(at);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}function Pa(t){return Da(2,t)}function Na(t,e){if("function"!=typeof t)throw new cc(at);return e=e===rt?e:xl(e),ir(t,e)}function Ma(t,e){if("function"!=typeof t)throw new cc(at);return e=null==e?0:Uc(xl(e),0),ir(function(i){var n=i[e],r=kr(i,0,e);return n&&m(r,n),a(t,this,r)})}function ja(t,e,i){var n=!0,r=!0;if("function"!=typeof t)throw new cc(at);return rl(i)&&(n="leading"in i?!!i.leading:n,r="trailing"in i?!!i.trailing:r),Ea(t,e,{leading:n,maxWait:e,trailing:r})}function Ha(t){return Ta(t,1)}function Ra(t,e){return cd(xr(e),t)}function La(){if(!arguments.length)return[];var t=arguments[0];return md(t)?t:[t]}function Fa(t){return nn(t,pt)}function za(t,e){return e="function"==typeof e?e:rt,nn(t,pt,e)}function Wa(t){return nn(t,ht|pt)}function qa(t,e){return e="function"==typeof e?e:rt,nn(t,ht|pt,e)}function Ba(t,e){return null==e||sn(t,e,Fl(e))}function Ua(t,e){return t===e||t!==t&&e!==e}function Ya(t){return null!=t&&nl(t.length)&&!el(t)}function Va(t){return sl(t)&&Ya(t)}function Ka(t){return!0===t||!1===t||sl(t)&&_n(t)==qt}function Xa(t){return sl(t)&&1===t.nodeType&&!pl(t)}function Ga(t){if(null==t)return!0;if(Ya(t)&&(md(t)||"string"==typeof t||"function"==typeof t.splice||_d(t)||Cd(t)||gd(t)))return!t.length;var e=Dh(t);if(e==Xt||e==ee)return!t.size;if(Fs(t))return!Rn(t).length;for(var i in t)if(mc.call(t,i))return!1;return!0}function Za(t,e){return En(t,e)}function Ja(t,e,i){i="function"==typeof i?i:rt;var n=i?i(t,e):rt;return n===rt?En(t,e,rt,i):!!n}function Qa(t){if(!sl(t))return!1;var e=_n(t);return e==Yt||e==Ut||"string"==typeof t.message&&"string"==typeof t.name&&!pl(t)}function tl(t){return"number"==typeof t&&Wc(t)}function el(t){if(!rl(t))return!1;var e=_n(t);return e==Vt||e==Kt||e==Wt||e==Qt}function il(t){return"number"==typeof t&&t==xl(t)}function nl(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=Pt}function rl(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function sl(t){return null!=t&&"object"==typeof t}function ol(t,e){return t===e||On(t,e,Cs(e))}function al(t,e,i){return i="function"==typeof i?i:rt,On(t,e,Cs(e),i)}function ll(t){return dl(t)&&t!=+t}function ul(t){if(Sh(t))throw new rc(ot);return Pn(t)}function cl(t){return null===t}function hl(t){return null==t}function dl(t){return"number"==typeof t||sl(t)&&_n(t)==Gt}function pl(t){if(!sl(t)||_n(t)!=Jt)return!1;var e=Sc(t);if(null===e)return!0;var i=mc.call(e,"constructor")&&e.constructor;return"function"==typeof i&&i instanceof i&&gc.call(i)==bc}function fl(t){return il(t)&&t>=-Pt&&t<=Pt}function gl(t){return"string"==typeof t||!md(t)&&sl(t)&&_n(t)==ie}function ml(t){return"symbol"==typeof t||sl(t)&&_n(t)==ne}function vl(t){return t===rt}function _l(t){return sl(t)&&Dh(t)==se}function yl(t){return sl(t)&&_n(t)==oe}function bl(t){if(!t)return[];if(Ya(t))return gl(t)?tt(t):Hr(t);if(Oc&&t[Oc])return U(t[Oc]());var e=Dh(t);return(e==Xt?Y:e==ee?X:Ql)(t)}function wl(t){if(!t)return 0===t?t:0;if((t=kl(t))===Ot||t===-Ot){return(t<0?-1:1)*Nt}return t===t?t:0}function xl(t){var e=wl(t),i=e%1;return e===e?i?e-i:e:0}function Cl(t){return t?en(xl(t),0,jt):0}function kl(t){if("number"==typeof t)return t;if(ml(t))return Mt;if(rl(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=rl(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Ne,"");var i=Ue.test(t);return i||Ve.test(t)?Ei(t.slice(2),i?2:8):Be.test(t)?Mt:+t}function Tl(t){return Rr(t,zl(t))}function Dl(t){return t?en(xl(t),-Pt,Pt):0===t?t:0}function Sl(t){return null==t?"":pr(t)}function Al(t,e){var i=ph(t);return null==e?i:Zi(i,e)}function El(t,e){return x(t,ws(e,3),pn)}function Il(t,e){return x(t,ws(e,3),fn)}function $l(t,e){return null==t?t:mh(t,ws(e,3),zl)}function Ol(t,e){return null==t?t:vh(t,ws(e,3),zl)}function Pl(t,e){return t&&pn(t,ws(e,3))}function Nl(t,e){return t&&fn(t,ws(e,3))}function Ml(t){return null==t?[]:gn(t,Fl(t))}function jl(t){return null==t?[]:gn(t,zl(t))}function Hl(t,e,i){var n=null==t?rt:mn(t,e);return n===rt?i:n}function Rl(t,e){return null!=t&&As(t,e,bn)}function Ll(t,e){return null!=t&&As(t,e,wn)}function Fl(t){return Ya(t)?$i(t):Rn(t)}function zl(t){return Ya(t)?$i(t,!0):Ln(t)}function Wl(t,e){var i={};return e=ws(e,3),pn(t,function(t,n,r){Qi(i,e(t,n,r),t)}),i}function ql(t,e){var i={};return e=ws(e,3),pn(t,function(t,n,r){Qi(i,n,e(t,n,r))}),i}function Bl(t,e){return Ul(t,Oa(ws(e)))}function Ul(t,e){if(null==t)return{};var i=g(_s(t),function(t){return[t]});return e=ws(e),Xn(t,i,function(t,i){return e(t,i[0])})}function Yl(t,e,i){e=Cr(e,t);var n=-1,r=e.length;for(r||(r=1,t=rt);++n<r;){var s=null==t?rt:t[Js(e[n])];s===rt&&(n=r,s=i),t=el(s)?s.call(t):s}return t}function Vl(t,e,i){return null==t?t:sr(t,e,i)}function Kl(t,e,i,n){return n="function"==typeof n?n:rt,null==t?t:sr(t,e,i,n)}function Xl(t,e,i){var n=md(t),r=n||_d(t)||Cd(t);if(e=ws(e,4),null==i){var s=t&&t.constructor;i=r?n?new s:[]:rl(t)&&el(s)?ph(Sc(t)):{}}return(r?u:pn)(t,function(t,n,r){return e(i,t,n,r)}),i}function Gl(t,e){return null==t||gr(t,e)}function Zl(t,e,i){return null==t?t:mr(t,e,xr(i))}function Jl(t,e,i,n){return n="function"==typeof n?n:rt,null==t?t:mr(t,e,xr(i),n)}function Ql(t){return null==t?[]:j(t,Fl(t))}function tu(t){return null==t?[]:j(t,zl(t))}function eu(t,e,i){return i===rt&&(i=e,e=rt),i!==rt&&(i=kl(i),i=i===i?i:0),e!==rt&&(e=kl(e),e=e===e?e:0),en(kl(t),e,i)}function iu(t,e,i){return e=wl(e),i===rt?(i=e,e=0):i=wl(i),t=kl(t),xn(t,e,i)}function nu(t,e,i){if(i&&"boolean"!=typeof i&&Ms(t,e,i)&&(e=i=rt),i===rt&&("boolean"==typeof e?(i=e,e=rt):"boolean"==typeof t&&(i=t,t=rt)),t===rt&&e===rt?(t=0,e=1):(t=wl(t),e===rt?(e=t,t=0):e=wl(e)),t>e){var n=t;t=e,e=n}if(i||t%1||e%1){var r=Xc();return Yc(t+r*(e-t+Ai("1e-"+((r+"").length-1))),e)}return Qn(t,e)}function ru(t){return Xd(Sl(t).toLowerCase())}function su(t){return(t=Sl(t))&&t.replace(Xe,Ui).replace(gi,"")}function ou(t,e,i){t=Sl(t),e=pr(e);var n=t.length;i=i===rt?n:en(xl(i),0,n);var r=i;return(i-=e.length)>=0&&t.slice(i,r)==e}function au(t){return t=Sl(t),t&&ke.test(t)?t.replace(xe,Yi):t}function lu(t){return t=Sl(t),t&&Pe.test(t)?t.replace(Oe,"\\$&"):t}function uu(t,e,i){t=Sl(t),e=xl(e);var n=e?Q(t):0;if(!e||n>=e)return t;var r=(e-n)/2;return is(Lc(r),i)+t+is(Rc(r),i)}function cu(t,e,i){t=Sl(t),e=xl(e);var n=e?Q(t):0;return e&&n<e?t+is(e-n,i):t}function hu(t,e,i){t=Sl(t),e=xl(e);var n=e?Q(t):0;return e&&n<e?is(e-n,i)+t:t}function du(t,e,i){return i||null==e?e=0:e&&(e=+e),Kc(Sl(t).replace(Me,""),e||0)}function pu(t,e,i){return e=(i?Ms(t,e,i):e===rt)?1:xl(e),er(Sl(t),e)}function fu(){var t=arguments,e=Sl(t[0]);return t.length<3?e:e.replace(t[1],t[2])}function gu(t,e,i){return i&&"number"!=typeof i&&Ms(t,e,i)&&(e=i=rt),(i=i===rt?jt:i>>>0)?(t=Sl(t),t&&("string"==typeof e||null!=e&&!wd(e))&&!(e=pr(e))&&q(t)?kr(tt(t),0,i):t.split(e,i)):[]}function mu(t,e,i){return t=Sl(t),i=null==i?0:en(xl(i),0,t.length),e=pr(e),t.slice(i,i+e.length)==e}function vu(t,e,n){var r=i.templateSettings;n&&Ms(t,e,n)&&(e=rt),t=Sl(t),e=Ad({},e,r,cs);var s,o,a=Ad({},e.imports,r.imports,cs),l=Fl(a),u=j(a,l),c=0,h=e.interpolate||Ge,d="__p += '",p=lc((e.escape||Ge).source+"|"+h.source+"|"+(h===Se?We:Ge).source+"|"+(e.evaluate||Ge).source+"|$","g"),f="//# sourceURL="+("sourceURL"in e?e.sourceURL:"lodash.templateSources["+ ++wi+"]")+"\n";t.replace(p,function(e,i,n,r,a,l){return n||(n=r),d+=t.slice(c,l).replace(Ze,z),i&&(s=!0,d+="' +\n__e("+i+") +\n'"),a&&(o=!0,d+="';\n"+a+";\n__p += '"),n&&(d+="' +\n((__t = ("+n+")) == null ? '' : __t) +\n'"),c=l+e.length,e}),d+="';\n";var g=e.variable;g||(d="with (obj) {\n"+d+"\n}\n"),d=(o?d.replace(_e,""):d).replace(ye,"$1").replace(be,"$1;"),d="function("+(g||"obj")+") {\n"+(g?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(s?", __e = _.escape":"")+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+d+"return __p\n}";var m=Gd(function(){return sc(l,f+"return "+d).apply(rt,u)});if(m.source=d,Qa(m))throw m;return m}function _u(t){return Sl(t).toLowerCase()}function yu(t){return Sl(t).toUpperCase()}function bu(t,e,i){if((t=Sl(t))&&(i||e===rt))return t.replace(Ne,"");if(!t||!(e=pr(e)))return t;var n=tt(t),r=tt(e);return kr(n,R(n,r),L(n,r)+1).join("")}function wu(t,e,i){if((t=Sl(t))&&(i||e===rt))return t.replace(je,"");if(!t||!(e=pr(e)))return t;var n=tt(t);return kr(n,0,L(n,tt(e))+1).join("")}function xu(t,e,i){if((t=Sl(t))&&(i||e===rt))return t.replace(Me,"");if(!t||!(e=pr(e)))return t;var n=tt(t);return kr(n,R(n,tt(e))).join("")}function Cu(t,e){var i=Dt,n=St;if(rl(e)){var r="separator"in e?e.separator:r;i="length"in e?xl(e.length):i,n="omission"in e?pr(e.omission):n}t=Sl(t);var s=t.length;if(q(t)){var o=tt(t);s=o.length}if(i>=s)return t;var a=i-Q(n);if(a<1)return n;var l=o?kr(o,0,a).join(""):t.slice(0,a);if(r===rt)return l+n;if(o&&(a+=l.length-a),wd(r)){if(t.slice(a).search(r)){var u,c=l;for(r.global||(r=lc(r.source,Sl(qe.exec(r))+"g")),r.lastIndex=0;u=r.exec(c);)var h=u.index;l=l.slice(0,h===rt?a:h)}}else if(t.indexOf(pr(r),a)!=a){var d=l.lastIndexOf(r);d>-1&&(l=l.slice(0,d))}return l+n}function ku(t){return t=Sl(t),t&&Ce.test(t)?t.replace(we,Vi):t}function Tu(t,e,i){return t=Sl(t),e=i?rt:e,e===rt?B(t)?nt(t):w(t):t.match(e)||[]}function Du(t){var e=null==t?0:t.length,i=ws();return t=e?g(t,function(t){if("function"!=typeof t[1])throw new cc(at);return[i(t[0]),t[1]]}):[],ir(function(i){for(var n=-1;++n<e;){var r=t[n];if(a(r[0],this,i))return a(r[1],this,i)}})}function Su(t){return rn(nn(t,ht))}function Au(t){return function(){return t}}function Eu(t,e){return null==t||t!==t?e:t}function Iu(t){return t}function $u(t){return Hn("function"==typeof t?t:nn(t,ht))}function Ou(t){return Wn(nn(t,ht))}function Pu(t,e){return qn(t,nn(e,ht))}function Nu(t,e,i){var n=Fl(e),r=gn(e,n);null!=i||rl(e)&&(r.length||!n.length)||(i=e,e=t,t=this,r=gn(e,Fl(e)));var s=!(rl(i)&&"chain"in i&&!i.chain),o=el(t);return u(r,function(i){var n=e[i];t[i]=n,o&&(t.prototype[i]=function(){var e=this.__chain__;if(s||e){var i=t(this.__wrapped__);return(i.__actions__=Hr(this.__actions__)).push({func:n,args:arguments,thisArg:t}),i.__chain__=e,i}return n.apply(t,m([this.value()],arguments))})}),t}function Mu(){return Oi._===this&&(Oi._=wc),this}function ju(){}function Hu(t){return t=xl(t),ir(function(e){return Yn(e,t)})}function Ru(t){return js(t)?A(Js(t)):Gn(t)}function Lu(t){return function(e){return null==t?rt:mn(t,e)}}function Fu(){return[]}function zu(){return!1}function Wu(){return{}}function qu(){return""}function Bu(){return!0}function Uu(t,e){if((t=xl(t))<1||t>Pt)return[];var i=jt,n=Yc(t,jt);e=ws(e),t-=jt;for(var r=P(n,e);++i<t;)e(i);return r}function Yu(t){return md(t)?g(t,Js):ml(t)?[t]:Hr($h(Sl(t)))}function Vu(t){var e=++vc;return Sl(t)+e}function Ku(t){return t&&t.length?un(t,Iu,yn):rt}function Xu(t,e){return t&&t.length?un(t,ws(e,2),yn):rt}function Gu(t){return S(t,Iu)}function Zu(t,e){return S(t,ws(e,2))}function Ju(t){return t&&t.length?un(t,Iu,Fn):rt}function Qu(t,e){return t&&t.length?un(t,ws(e,2),Fn):rt}function tc(t){return t&&t.length?O(t,Iu):0}function ec(t,e){return t&&t.length?O(t,ws(e,2)):0}e=null==e?Oi:Ki.defaults(Oi.Object(),e,Ki.pick(Oi,bi));var ic=e.Array,nc=e.Date,rc=e.Error,sc=e.Function,oc=e.Math,ac=e.Object,lc=e.RegExp,uc=e.String,cc=e.TypeError,hc=ic.prototype,dc=sc.prototype,pc=ac.prototype,fc=e["__core-js_shared__"],gc=dc.toString,mc=pc.hasOwnProperty,vc=0,_c=function(){var t=/[^.]+$/.exec(fc&&fc.keys&&fc.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),yc=pc.toString,bc=gc.call(ac),wc=Oi._,xc=lc("^"+gc.call(mc).replace(Oe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Cc=Mi?e.Buffer:rt,kc=e.Symbol,Tc=e.Uint8Array,Dc=Cc?Cc.allocUnsafe:rt,Sc=V(ac.getPrototypeOf,ac),Ac=ac.create,Ec=pc.propertyIsEnumerable,Ic=hc.splice,$c=kc?kc.isConcatSpreadable:rt,Oc=kc?kc.iterator:rt,Pc=kc?kc.toStringTag:rt,Nc=function(){try{var t=ks(ac,"defineProperty");return t({},"",{}),t}catch(t){}}(),Mc=e.clearTimeout!==Oi.clearTimeout&&e.clearTimeout,jc=nc&&nc.now!==Oi.Date.now&&nc.now,Hc=e.setTimeout!==Oi.setTimeout&&e.setTimeout,Rc=oc.ceil,Lc=oc.floor,Fc=ac.getOwnPropertySymbols,zc=Cc?Cc.isBuffer:rt,Wc=e.isFinite,qc=hc.join,Bc=V(ac.keys,ac),Uc=oc.max,Yc=oc.min,Vc=nc.now,Kc=e.parseInt,Xc=oc.random,Gc=hc.reverse,Zc=ks(e,"DataView"),Jc=ks(e,"Map"),Qc=ks(e,"Promise"),th=ks(e,"Set"),eh=ks(e,"WeakMap"),ih=ks(ac,"create"),nh=eh&&new eh,rh={},sh=Qs(Zc),oh=Qs(Jc),ah=Qs(Qc),lh=Qs(th),uh=Qs(eh),ch=kc?kc.prototype:rt,hh=ch?ch.valueOf:rt,dh=ch?ch.toString:rt,ph=function(){function t(){}return function(e){if(!rl(e))return{};if(Ac)return Ac(e);t.prototype=e;var i=new t;return t.prototype=rt,i}}();i.templateSettings={escape:Te,evaluate:De,interpolate:Se,variable:"",imports:{_:i}},i.prototype=n.prototype,i.prototype.constructor=i,r.prototype=ph(n.prototype),r.prototype.constructor=r,b.prototype=ph(n.prototype),b.prototype.constructor=b,it.prototype.clear=Fe,it.prototype.delete=Je,it.prototype.get=Qe,it.prototype.has=ti,it.prototype.set=ei,ii.prototype.clear=ni,ii.prototype.delete=ri,ii.prototype.get=si,ii.prototype.has=oi,ii.prototype.set=ai,li.prototype.clear=ui,li.prototype.delete=ci,li.prototype.get=hi,li.prototype.has=di,li.prototype.set=pi,mi.prototype.add=mi.prototype.push=vi,mi.prototype.has=_i,yi.prototype.clear=ki,yi.prototype.delete=Ti,yi.prototype.get=Di,yi.prototype.has=Si,yi.prototype.set=Ii;var fh=qr(pn),gh=qr(fn,!0),mh=Br(),vh=Br(!0),_h=nh?function(t,e){return nh.set(t,e),t}:Iu,yh=Nc?function(t,e){return Nc(t,"toString",{configurable:!0,enumerable:!1,value:Au(e),writable:!0})}:Iu,bh=ir,wh=Mc||function(t){return Oi.clearTimeout(t)},xh=th&&1/X(new th([,-0]))[1]==Ot?function(t){return new th(t)}:ju,Ch=nh?function(t){return nh.get(t)}:ju,kh=Fc?function(t){return null==t?[]:(t=ac(t),d(Fc(t),function(e){return Ec.call(t,e)}))}:Fu,Th=Fc?function(t){for(var e=[];t;)m(e,kh(t)),t=Sc(t);return e}:Fu,Dh=_n;(Zc&&Dh(new Zc(new ArrayBuffer(1)))!=le||Jc&&Dh(new Jc)!=Xt||Qc&&"[object Promise]"!=Dh(Qc.resolve())||th&&Dh(new th)!=ee||eh&&Dh(new eh)!=se)&&(Dh=function(t){var e=_n(t),i=e==Jt?t.constructor:rt,n=i?Qs(i):"";if(n)switch(n){case sh:return le;case oh:return Xt;case ah:return"[object Promise]";case lh:return ee;case uh:return se}return e});var Sh=fc?el:zu,Ah=Gs(_h),Eh=Hc||function(t,e){return Oi.setTimeout(t,e)},Ih=Gs(yh),$h=function(t){var e=$a(t,function(t){return i.size===ut&&i.clear(),t}),i=e.cache;return e}(function(t){var e=[];return Ie.test(t)&&e.push(""),t.replace($e,function(t,i,n,r){e.push(n?r.replace(ze,"$1"):i||t)}),e}),Oh=ir(function(t,e){return Va(t)?an(t,dn(e,1,Va,!0)):[]}),Ph=ir(function(t,e){var i=wo(e);return Va(i)&&(i=rt),Va(t)?an(t,dn(e,1,Va,!0),ws(i,2)):[]}),Nh=ir(function(t,e){var i=wo(e);return Va(i)&&(i=rt),Va(t)?an(t,dn(e,1,Va,!0),rt,i):[]}),Mh=ir(function(t){var e=g(t,wr);return e.length&&e[0]===t[0]?Cn(e):[]}),jh=ir(function(t){var e=wo(t),i=g(t,wr);return e===wo(i)?e=rt:i.pop(),i.length&&i[0]===t[0]?Cn(i,ws(e,2)):[]}),Hh=ir(function(t){var e=wo(t),i=g(t,wr);return e="function"==typeof e?e:rt,e&&i.pop(),i.length&&i[0]===t[0]?Cn(i,rt,e):[]}),Rh=ir(ko),Lh=ms(function(t,e){var i=null==t?0:t.length,n=tn(t,e);return Jn(t,g(e,function(t){return Ns(t,i)?+t:t}).sort(Pr)),n}),Fh=ir(function(t){return fr(dn(t,1,Va,!0))}),zh=ir(function(t){var e=wo(t);return Va(e)&&(e=rt),fr(dn(t,1,Va,!0),ws(e,2))}),Wh=ir(function(t){var e=wo(t);return e="function"==typeof e?e:rt,fr(dn(t,1,Va,!0),rt,e)}),qh=ir(function(t,e){return Va(t)?an(t,e):[]}),Bh=ir(function(t){return yr(d(t,Va))}),Uh=ir(function(t){var e=wo(t);return Va(e)&&(e=rt),yr(d(t,Va),ws(e,2))}),Yh=ir(function(t){var e=wo(t);return e="function"==typeof e?e:rt,yr(d(t,Va),rt,e)}),Vh=ir(Yo),Kh=ir(function(t){var e=t.length,i=e>1?t[e-1]:rt;return i="function"==typeof i?(t.pop(),i):rt,Vo(t,i)}),Xh=ms(function(t){var e=t.length,i=e?t[0]:0,n=this.__wrapped__,s=function(e){return tn(e,t)};return!(e>1||this.__actions__.length)&&n instanceof b&&Ns(i)?(n=n.slice(i,+i+(e?1:0)),n.__actions__.push({func:Jo,args:[s],thisArg:rt}),new r(n,this.__chain__).thru(function(t){return e&&!t.length&&t.push(rt),t})):this.thru(s)}),Gh=zr(function(t,e,i){mc.call(t,i)?++t[i]:Qi(t,i,1)}),Zh=Gr(co),Jh=Gr(ho),Qh=zr(function(t,e,i){mc.call(t,i)?t[i].push(e):Qi(t,i,[e])}),td=ir(function(t,e,i){var n=-1,r="function"==typeof e,s=Ya(t)?ic(t.length):[];return fh(t,function(t){s[++n]=r?a(e,t,i):Tn(t,e,i)}),s}),ed=zr(function(t,e,i){Qi(t,i,e)}),id=zr(function(t,e,i){t[i?0:1].push(e)},function(){return[[],[]]}),nd=ir(function(t,e){if(null==t)return[];var i=e.length;return i>1&&Ms(t,e[0],e[1])?e=[]:i>2&&Ms(e[0],e[1],e[2])&&(e=[e[0]]),Vn(t,dn(e,1),[])}),rd=jc||function(){return Oi.Date.now()},sd=ir(function(t,e,i){var n=mt;if(i.length){var r=K(i,bs(sd));n|=wt}return us(t,n,e,i,r)}),od=ir(function(t,e,i){var n=mt|vt;if(i.length){var r=K(i,bs(od));n|=wt}return us(e,n,t,i,r)}),ad=ir(function(t,e){return on(t,1,e)}),ld=ir(function(t,e,i){return on(t,kl(e)||0,i)});$a.Cache=li;var ud=bh(function(t,e){e=1==e.length&&md(e[0])?g(e[0],M(ws())):g(dn(e,1),M(ws()));var i=e.length;return ir(function(n){for(var r=-1,s=Yc(n.length,i);++r<s;)n[r]=e[r].call(this,n[r]);return a(t,this,n)})}),cd=ir(function(t,e){var i=K(e,bs(cd));return us(t,wt,rt,e,i)}),hd=ir(function(t,e){var i=K(e,bs(hd));return us(t,xt,rt,e,i)}),dd=ms(function(t,e){return us(t,kt,rt,rt,rt,e)}),pd=ss(yn),fd=ss(function(t,e){return t>=e}),gd=Dn(function(){return arguments}())?Dn:function(t){return sl(t)&&mc.call(t,"callee")&&!Ec.call(t,"callee")},md=ic.isArray,vd=Ri?M(Ri):Sn,_d=zc||zu,yd=Li?M(Li):An,bd=Fi?M(Fi):$n,wd=zi?M(zi):Nn,xd=Wi?M(Wi):Mn,Cd=qi?M(qi):jn,kd=ss(Fn),Td=ss(function(t,e){return t<=e}),Dd=Wr(function(t,e){if(Fs(e)||Ya(e))return void Rr(e,Fl(e),t);for(var i in e)mc.call(e,i)&&Bi(t,i,e[i])}),Sd=Wr(function(t,e){Rr(e,zl(e),t)}),Ad=Wr(function(t,e,i,n){Rr(e,zl(e),t,n)}),Ed=Wr(function(t,e,i,n){Rr(e,Fl(e),t,n)}),Id=ms(tn),$d=ir(function(t){return t.push(rt,cs),a(Ad,rt,t)}),Od=ir(function(t){return t.push(rt,hs),a(Hd,rt,t)}),Pd=Qr(function(t,e,i){t[e]=i},Au(Iu)),Nd=Qr(function(t,e,i){mc.call(t,e)?t[e].push(i):t[e]=[i]},ws),Md=ir(Tn),jd=Wr(function(t,e,i){Bn(t,e,i)}),Hd=Wr(function(t,e,i,n){Bn(t,e,i,n)}),Rd=ms(function(t,e){var i={};if(null==t)return i;var n=!1;e=g(e,function(e){return e=Cr(e,t),n||(n=e.length>1),e}),Rr(t,_s(t),i),n&&(i=nn(i,ht|dt|pt,ds));for(var r=e.length;r--;)gr(i,e[r]);return i}),Ld=ms(function(t,e){return null==t?{}:Kn(t,e)}),Fd=ls(Fl),zd=ls(zl),Wd=Vr(function(t,e,i){return e=e.toLowerCase(),t+(i?ru(e):e)}),qd=Vr(function(t,e,i){return t+(i?"-":"")+e.toLowerCase()}),Bd=Vr(function(t,e,i){return t+(i?" ":"")+e.toLowerCase()}),Ud=Yr("toLowerCase"),Yd=Vr(function(t,e,i){return t+(i?"_":"")+e.toLowerCase()}),Vd=Vr(function(t,e,i){return t+(i?" ":"")+Xd(e)}),Kd=Vr(function(t,e,i){return t+(i?" ":"")+e.toUpperCase()}),Xd=Yr("toUpperCase"),Gd=ir(function(t,e){try{return a(t,rt,e)}catch(t){return Qa(t)?t:new rc(t)}}),Zd=ms(function(t,e){return u(e,function(e){e=Js(e),Qi(t,e,sd(t[e],t))}),t}),Jd=Zr(),Qd=Zr(!0),tp=ir(function(t,e){return function(i){return Tn(i,t,e)}}),ep=ir(function(t,e){return function(i){return Tn(t,i,e)}}),ip=es(g),np=es(h),rp=es(y),sp=rs(),op=rs(!0),ap=ts(function(t,e){return t+e},0),lp=as("ceil"),up=ts(function(t,e){return t/e},1),cp=as("floor"),hp=ts(function(t,e){return t*e},1),dp=as("round"),pp=ts(function(t,e){return t-e},0);return i.after=ka,i.ary=Ta,i.assign=Dd,i.assignIn=Sd,i.assignInWith=Ad,i.assignWith=Ed,i.at=Id,i.before=Da,i.bind=sd,i.bindAll=Zd,i.bindKey=od,i.castArray=La,i.chain=Go,i.chunk=io,i.compact=no,i.concat=ro,i.cond=Du,i.conforms=Su,i.constant=Au,i.countBy=Gh,i.create=Al,i.curry=Sa,i.curryRight=Aa,i.debounce=Ea,i.defaults=$d,i.defaultsDeep=Od,i.defer=ad,i.delay=ld,i.difference=Oh,i.differenceBy=Ph,i.differenceWith=Nh,i.drop=so,i.dropRight=oo,i.dropRightWhile=ao,i.dropWhile=lo,i.fill=uo,i.filter=aa,i.flatMap=la,i.flatMapDeep=ua,i.flatMapDepth=ca,i.flatten=po,i.flattenDeep=fo,i.flattenDepth=go,i.flip=Ia,i.flow=Jd,i.flowRight=Qd,i.fromPairs=mo,i.functions=Ml,i.functionsIn=jl,i.groupBy=Qh,i.initial=yo,i.intersection=Mh,i.intersectionBy=jh,i.intersectionWith=Hh,i.invert=Pd,i.invertBy=Nd,i.invokeMap=td,i.iteratee=$u,i.keyBy=ed,i.keys=Fl,i.keysIn=zl,i.map=fa,i.mapKeys=Wl,i.mapValues=ql,i.matches=Ou,i.matchesProperty=Pu,i.memoize=$a,i.merge=jd,i.mergeWith=Hd,i.method=tp,i.methodOf=ep,i.mixin=Nu,i.negate=Oa,i.nthArg=Hu,i.omit=Rd,i.omitBy=Bl,i.once=Pa,i.orderBy=ga,i.over=ip,i.overArgs=ud,i.overEvery=np,i.overSome=rp,i.partial=cd,i.partialRight=hd,i.partition=id,i.pick=Ld,i.pickBy=Ul,i.property=Ru,i.propertyOf=Lu,i.pull=Rh,i.pullAll=ko,i.pullAllBy=To,i.pullAllWith=Do,i.pullAt=Lh,i.range=sp,i.rangeRight=op,i.rearg=dd,i.reject=_a,i.remove=So,i.rest=Na,i.reverse=Ao,i.sampleSize=ba,i.set=Vl,i.setWith=Kl,i.shuffle=wa,i.slice=Eo,i.sortBy=nd,i.sortedUniq=jo,i.sortedUniqBy=Ho,i.split=gu,i.spread=Ma,i.tail=Ro,i.take=Lo,i.takeRight=Fo,i.takeRightWhile=zo,i.takeWhile=Wo,i.tap=Zo,i.throttle=ja,i.thru=Jo,i.toArray=bl,i.toPairs=Fd,i.toPairsIn=zd,i.toPath=Yu,i.toPlainObject=Tl,i.transform=Xl,i.unary=Ha,i.union=Fh,i.unionBy=zh,i.unionWith=Wh,i.uniq=qo,i.uniqBy=Bo,i.uniqWith=Uo,i.unset=Gl,i.unzip=Yo,i.unzipWith=Vo,i.update=Zl,i.updateWith=Jl,i.values=Ql,i.valuesIn=tu,i.without=qh,i.words=Tu,i.wrap=Ra,i.xor=Bh,i.xorBy=Uh,i.xorWith=Yh,i.zip=Vh,i.zipObject=Ko,i.zipObjectDeep=Xo,i.zipWith=Kh,i.entries=Fd,i.entriesIn=zd,i.extend=Sd,i.extendWith=Ad,Nu(i,i),i.add=ap,i.attempt=Gd,i.camelCase=Wd,i.capitalize=ru,i.ceil=lp,i.clamp=eu,i.clone=Fa,i.cloneDeep=Wa,i.cloneDeepWith=qa,i.cloneWith=za,i.conformsTo=Ba,i.deburr=su,i.defaultTo=Eu,i.divide=up,i.endsWith=ou,i.eq=Ua,i.escape=au,i.escapeRegExp=lu,i.every=oa,i.find=Zh,i.findIndex=co,i.findKey=El,i.findLast=Jh,i.findLastIndex=ho,i.findLastKey=Il,i.floor=cp,i.forEach=ha,i.forEachRight=da,i.forIn=$l,i.forInRight=Ol,i.forOwn=Pl,i.forOwnRight=Nl,i.get=Hl,i.gt=pd,i.gte=fd,i.has=Rl,i.hasIn=Ll,i.head=vo,i.identity=Iu,i.includes=pa,i.indexOf=_o,i.inRange=iu,i.invoke=Md,i.isArguments=gd,i.isArray=md,i.isArrayBuffer=vd,i.isArrayLike=Ya,i.isArrayLikeObject=Va,i.isBoolean=Ka,i.isBuffer=_d,i.isDate=yd,i.isElement=Xa,i.isEmpty=Ga,i.isEqual=Za,i.isEqualWith=Ja,i.isError=Qa,i.isFinite=tl,i.isFunction=el,i.isInteger=il,i.isLength=nl,i.isMap=bd,i.isMatch=ol,i.isMatchWith=al,i.isNaN=ll,i.isNative=ul,i.isNil=hl,i.isNull=cl,i.isNumber=dl,i.isObject=rl,i.isObjectLike=sl,i.isPlainObject=pl,i.isRegExp=wd,i.isSafeInteger=fl,i.isSet=xd,i.isString=gl,i.isSymbol=ml,i.isTypedArray=Cd,i.isUndefined=vl,i.isWeakMap=_l,i.isWeakSet=yl,i.join=bo,i.kebabCase=qd,i.last=wo,i.lastIndexOf=xo,i.lowerCase=Bd,i.lowerFirst=Ud,i.lt=kd,i.lte=Td,i.max=Ku,i.maxBy=Xu,i.mean=Gu,i.meanBy=Zu,i.min=Ju,i.minBy=Qu,i.stubArray=Fu,i.stubFalse=zu,i.stubObject=Wu,i.stubString=qu,i.stubTrue=Bu,i.multiply=hp,i.nth=Co,i.noConflict=Mu,i.noop=ju,i.now=rd,i.pad=uu,i.padEnd=cu,i.padStart=hu,i.parseInt=du,i.random=nu,i.reduce=ma,i.reduceRight=va,i.repeat=pu,i.replace=fu,i.result=Yl,i.round=dp,i.runInContext=t,i.sample=ya,i.size=xa,i.snakeCase=Yd,i.some=Ca,i.sortedIndex=Io,i.sortedIndexBy=$o,i.sortedIndexOf=Oo,i.sortedLastIndex=Po,i.sortedLastIndexBy=No,i.sortedLastIndexOf=Mo,i.startCase=Vd,i.startsWith=mu,i.subtract=pp,i.sum=tc,i.sumBy=ec,i.template=vu,i.times=Uu,i.toFinite=wl,i.toInteger=xl,i.toLength=Cl,i.toLower=_u,i.toNumber=kl,i.toSafeInteger=Dl,i.toString=Sl,i.toUpper=yu,i.trim=bu,i.trimEnd=wu,i.trimStart=xu,i.truncate=Cu,i.unescape=ku,i.uniqueId=Vu,i.upperCase=Kd,i.upperFirst=Xd,i.each=ha,i.eachRight=da,i.first=vo,Nu(i,function(){var t={};return pn(i,function(e,n){mc.call(i.prototype,n)||(t[n]=e)}),t}(),{chain:!1}),i.VERSION="4.17.4",u(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){i[t].placeholder=i}),u(["drop","take"],function(t,e){b.prototype[t]=function(i){i=i===rt?1:Uc(xl(i),0);var n=this.__filtered__&&!e?new b(this):this.clone();return n.__filtered__?n.__takeCount__=Yc(i,n.__takeCount__):n.__views__.push({size:Yc(i,jt),type:t+(n.__dir__<0?"Right":"")}),n},b.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),u(["filter","map","takeWhile"],function(t,e){var i=e+1,n=i==It||3==i;b.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:ws(t,3),type:i}),e.__filtered__=e.__filtered__||n,e}}),u(["head","last"],function(t,e){var i="take"+(e?"Right":"");b.prototype[t]=function(){return this[i](1).value()[0]}}),u(["initial","tail"],function(t,e){var i="drop"+(e?"":"Right");b.prototype[t]=function(){return this.__filtered__?new b(this):this[i](1)}}),b.prototype.compact=function(){return this.filter(Iu)},b.prototype.find=function(t){return this.filter(t).head()},b.prototype.findLast=function(t){return this.reverse().find(t)},b.prototype.invokeMap=ir(function(t,e){return"function"==typeof t?new b(this):this.map(function(i){return Tn(i,t,e)})}),b.prototype.reject=function(t){return this.filter(Oa(ws(t)))},b.prototype.slice=function(t,e){t=xl(t);var i=this;return i.__filtered__&&(t>0||e<0)?new b(i):(t<0?i=i.takeRight(-t):t&&(i=i.drop(t)),e!==rt&&(e=xl(e),i=e<0?i.dropRight(-e):i.take(e-t)),i)},b.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},b.prototype.toArray=function(){return this.take(jt)},pn(b.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),s=/^(?:head|last)$/.test(e),o=i[s?"take"+("last"==e?"Right":""):e],a=s||/^find/.test(e);o&&(i.prototype[e]=function(){var e=this.__wrapped__,l=s?[1]:arguments,u=e instanceof b,c=l[0],h=u||md(e),d=function(t){var e=o.apply(i,m([t],l));return s&&p?e[0]:e};h&&n&&"function"==typeof c&&1!=c.length&&(u=h=!1);var p=this.__chain__,f=!!this.__actions__.length,g=a&&!p,v=u&&!f;if(!a&&h){e=v?e:new b(this);var _=t.apply(e,l);return _.__actions__.push({func:Jo,args:[d],thisArg:rt}),new r(_,p)}return g&&v?t.apply(this,l):(_=this.thru(d),g?s?_.value()[0]:_.value():_)})}),u(["pop","push","shift","sort","splice","unshift"],function(t){var e=hc[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);i.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(md(i)?i:[],t)}return this[n](function(i){return e.apply(md(i)?i:[],t)})}}),pn(b.prototype,function(t,e){var n=i[e];if(n){var r=n.name+"";(rh[r]||(rh[r]=[])).push({name:e,func:n})}}),rh[Jr(rt,vt).name]=[{name:"wrapper",func:rt}],b.prototype.clone=E,b.prototype.reverse=Z,b.prototype.value=et,i.prototype.at=Xh,i.prototype.chain=Qo,i.prototype.commit=ta,i.prototype.next=ea,i.prototype.plant=na,i.prototype.reverse=ra,i.prototype.toJSON=i.prototype.valueOf=i.prototype.value=sa,i.prototype.first=i.prototype.head,Oc&&(i.prototype[Oc]=ia),i}();Oi._=Ki,(r=function(){return Ki}.call(e,i,e,n))!==rt&&(n.exports=r)}).call(this)}).call(e,i(4),i(60)(t))},function(t,e,i){var n,r,s;/*!
        + * Select2 4.0.3
        + * https://select2.github.io
        + *
        + * Released under the MIT license
        + * https://github.com/select2/select2/blob/master/LICENSE.md
        + */
        +!function(o){r=[i(3)],n=o,void 0!==(s="function"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){var e=function(){if(t&&t.fn&&t.fn.select2&&t.fn.select2.amd)var e=t.fn.select2.amd;var e;return function(){if(!e||!e.requirejs){e?i=e:e={};/**
        + * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
        + * Available via the MIT or new BSD license.
        + * see: http://github.com/jrburke/almond for details
        + */
        +var t,i,n;!function(e){function r(t,e){return b.call(t,e)}function s(t,e){var i,n,r,s,o,a,l,u,c,h,d,p=e&&e.split("/"),f=_.map,g=f&&f["*"]||{};if(t&&"."===t.charAt(0))if(e){for(t=t.split("/"),o=t.length-1,_.nodeIdCompat&&x.test(t[o])&&(t[o]=t[o].replace(x,"")),t=p.slice(0,p.length-1).concat(t),c=0;c<t.length;c+=1)if("."===(d=t[c]))t.splice(c,1),c-=1;else if(".."===d){if(1===c&&(".."===t[2]||".."===t[0]))break;c>0&&(t.splice(c-1,2),c-=2)}t=t.join("/")}else 0===t.indexOf("./")&&(t=t.substring(2));if((p||g)&&f){for(i=t.split("/"),c=i.length;c>0;c-=1){if(n=i.slice(0,c).join("/"),p)for(h=p.length;h>0;h-=1)if((r=f[p.slice(0,h).join("/")])&&(r=r[n])){s=r,a=c;break}if(s)break;!l&&g&&g[n]&&(l=g[n],u=c)}!s&&l&&(s=l,a=u),s&&(i.splice(0,a,s),t=i.join("/"))}return t}function o(t,i){return function(){var n=w.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),p.apply(e,n.concat([t,i]))}}function a(t){return function(e){return s(e,t)}}function l(t){return function(e){m[t]=e}}function u(t){if(r(v,t)){var i=v[t];delete v[t],y[t]=!0,d.apply(e,i)}if(!r(m,t)&&!r(y,t))throw new Error("No "+t);return m[t]}function c(t){var e,i=t?t.indexOf("!"):-1;return i>-1&&(e=t.substring(0,i),t=t.substring(i+1,t.length)),[e,t]}function h(t){return function(){return _&&_.config&&_.config[t]||{}}}var d,p,f,g,m={},v={},_={},y={},b=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;f=function(t,e){var i,n=c(t),r=n[0];return t=n[1],r&&(r=s(r,e),i=u(r)),r?t=i&&i.normalize?i.normalize(t,a(e)):s(t,e):(t=s(t,e),n=c(t),r=n[0],t=n[1],r&&(i=u(r))),{f:r?r+"!"+t:t,n:t,pr:r,p:i}},g={require:function(t){return o(t)},exports:function(t){var e=m[t];return void 0!==e?e:m[t]={}},module:function(t){return{id:t,uri:"",exports:m[t],config:h(t)}}},d=function(t,i,n,s){var a,c,h,d,p,_,b=[],w=typeof n;if(s=s||t,"undefined"===w||"function"===w){for(i=!i.length&&n.length?["require","exports","module"]:i,p=0;p<i.length;p+=1)if(d=f(i[p],s),"require"===(c=d.f))b[p]=g.require(t);else if("exports"===c)b[p]=g.exports(t),_=!0;else if("module"===c)a=b[p]=g.module(t);else if(r(m,c)||r(v,c)||r(y,c))b[p]=u(c);else{if(!d.p)throw new Error(t+" missing "+c);d.p.load(d.n,o(s,!0),l(c),{}),b[p]=m[c]}h=n?n.apply(m[t],b):void 0,t&&(a&&a.exports!==e&&a.exports!==m[t]?m[t]=a.exports:h===e&&_||(m[t]=h))}else t&&(m[t]=n)},t=i=p=function(t,i,n,r,s){if("string"==typeof t)return g[t]?g[t](i):u(f(t,i).f);if(!t.splice){if(_=t,_.deps&&p(_.deps,_.callback),!i)return;i.splice?(t=i,i=n,n=null):t=e}return i=i||function(){},"function"==typeof n&&(n=r,r=s),r?d(e,t,i,n):setTimeout(function(){d(e,t,i,n)},4),p},p.config=function(t){return p(t)},t._defined=m,n=function(t,e,i){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(i=e,e=[]),r(m,t)||r(v,t)||(v[t]=[t,e,i])},n.amd={jQuery:!0}}(),e.requirejs=t,e.require=i,e.define=n}}(),e.define("almond",function(){}),e.define("jquery",[],function(){var e=t||$;return null==e&&console&&console.error,e}),e.define("select2/utils",["jquery"],function(t){function e(t){var e=t.prototype,i=[];for(var n in e){"function"==typeof e[n]&&("constructor"!==n&&i.push(n))}return i}var i={};i.Extend=function(t,e){function i(){this.constructor=t}var n={}.hasOwnProperty;for(var r in e)n.call(e,r)&&(t[r]=e[r]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},i.Decorate=function(t,i){function n(){var e=Array.prototype.unshift,n=i.prototype.constructor.length,r=t.prototype.constructor;n>0&&(e.call(arguments,t.prototype.constructor),r=i.prototype.constructor),r.apply(this,arguments)}function r(){this.constructor=n}var s=e(i),o=e(t);i.displayName=t.displayName,n.prototype=new r;for(var a=0;a<o.length;a++){var l=o[a];n.prototype[l]=t.prototype[l]}for(var u=0;u<s.length;u++){var c=s[u];n.prototype[c]=function(t){var e=function(){};t in n.prototype&&(e=n.prototype[t]);var r=i.prototype[t];return function(){return Array.prototype.unshift.call(arguments,e),r.apply(this,arguments)}}(c)}return n};var n=function(){this.listeners={}};return n.prototype.on=function(t,e){this.listeners=this.listeners||{},t in this.listeners?this.listeners[t].push(e):this.listeners[t]=[e]},n.prototype.trigger=function(t){var e=Array.prototype.slice,i=e.call(arguments,1);this.listeners=this.listeners||{},null==i&&(i=[]),0===i.length&&i.push({}),i[0]._type=t,t in this.listeners&&this.invoke(this.listeners[t],e.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},n.prototype.invoke=function(t,e){for(var i=0,n=t.length;i<n;i++)t[i].apply(this,e)},i.Observable=n,i.generateChars=function(t){for(var e="",i=0;i<t;i++){e+=Math.floor(36*Math.random()).toString(36)}return e},i.bind=function(t,e){return function(){t.apply(e,arguments)}},i._convertData=function(t){for(var e in t){var i=e.split("-"),n=t;if(1!==i.length){for(var r=0;r<i.length;r++){var s=i[r];s=s.substring(0,1).toLowerCase()+s.substring(1),s in n||(n[s]={}),r==i.length-1&&(n[s]=t[e]),n=n[s]}delete t[e]}}return t},i.hasScroll=function(e,i){var n=t(i),r=i.style.overflowX,s=i.style.overflowY;return(r!==s||"hidden"!==s&&"visible"!==s)&&("scroll"===r||"scroll"===s||(n.innerHeight()<i.scrollHeight||n.innerWidth()<i.scrollWidth))},i.escapeMarkup=function(t){var e={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof t?t:String(t).replace(/[&<>"'\/\\]/g,function(t){return e[t]})},i.appendMany=function(e,i){if("1.7"===t.fn.jquery.substr(0,3)){var n=t();t.map(i,function(t){n=n.add(t)}),i=n}e.append(i)},i}),e.define("select2/results",["jquery","./utils"],function(t,e){function i(t,e,n){this.$element=t,this.data=n,this.options=e,i.__super__.constructor.call(this)}return e.Extend(i,e.Observable),i.prototype.render=function(){var e=t('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e,e},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(e){var i=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=t('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),r=this.options.get("translations").get(e.message);n.append(i(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(t){this.hideLoading();var e=[];if(null==t.results||0===t.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));t.results=this.sort(t.results);for(var i=0;i<t.results.length;i++){var n=t.results[i],r=this.option(n);e.push(r)}this.$results.append(e)},i.prototype.position=function(t,e){e.find(".select2-results").append(t)},i.prototype.sort=function(t){return this.options.get("sorter")(t)},i.prototype.highlightFirstItem=function(){var t=this.$results.find(".select2-results__option[aria-selected]"),e=t.filter("[aria-selected=true]");e.length>0?e.first().trigger("mouseenter"):t.first().trigger("mouseenter"),this.ensureHighlightVisible()},i.prototype.setClasses=function(){var e=this;this.data.current(function(i){var n=t.map(i,function(t){return t.id.toString()});e.$results.find(".select2-results__option[aria-selected]").each(function(){var e=t(this),i=t.data(this,"data"),r=""+i.id;null!=i.element&&i.element.selected||null==i.element&&t.inArray(r,n)>-1?e.attr("aria-selected","true"):e.attr("aria-selected","false")})})},i.prototype.showLoading=function(t){this.hideLoading();var e=this.options.get("translations").get("searching"),i={disabled:!0,loading:!0,text:e(t)},n=this.option(i);n.className+=" loading-results",this.$results.prepend(n)},i.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},i.prototype.option=function(e){var i=document.createElement("li");i.className="select2-results__option";var n={role:"treeitem","aria-selected":"false"};e.disabled&&(delete n["aria-selected"],n["aria-disabled"]="true"),null==e.id&&delete n["aria-selected"],null!=e._resultId&&(i.id=e._resultId),e.title&&(i.title=e.title),e.children&&(n.role="group",n["aria-label"]=e.text,delete n["aria-selected"]);for(var r in n){var s=n[r];i.setAttribute(r,s)}if(e.children){var o=t(i),a=document.createElement("strong");a.className="select2-results__group";t(a);this.template(e,a);for(var l=[],u=0;u<e.children.length;u++){var c=e.children[u],h=this.option(c);l.push(h)}var d=t("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});d.append(l),o.append(a),o.append(d)}else this.template(e,i);return t.data(i,"data",e),i},i.prototype.bind=function(e,i){var n=this,r=e.id+"-results";this.$results.attr("id",r),e.on("results:all",function(t){n.clear(),n.append(t.data),e.isOpen()&&(n.setClasses(),n.highlightFirstItem())}),e.on("results:append",function(t){n.append(t.data),e.isOpen()&&n.setClasses()}),e.on("query",function(t){n.hideMessages(),n.showLoading(t)}),e.on("select",function(){e.isOpen()&&(n.setClasses(),n.highlightFirstItem())}),e.on("unselect",function(){e.isOpen()&&(n.setClasses(),n.highlightFirstItem())}),e.on("open",function(){n.$results.attr("aria-expanded","true"),n.$results.attr("aria-hidden","false"),n.setClasses(),n.ensureHighlightVisible()}),e.on("close",function(){n.$results.attr("aria-expanded","false"),n.$results.attr("aria-hidden","true"),n.$results.removeAttr("aria-activedescendant")}),e.on("results:toggle",function(){var t=n.getHighlightedResults();0!==t.length&&t.trigger("mouseup")}),e.on("results:select",function(){var t=n.getHighlightedResults();if(0!==t.length){var e=t.data("data");"true"==t.attr("aria-selected")?n.trigger("close",{}):n.trigger("select",{data:e})}}),e.on("results:previous",function(){var t=n.getHighlightedResults(),e=n.$results.find("[aria-selected]"),i=e.index(t);if(0!==i){var r=i-1;0===t.length&&(r=0);var s=e.eq(r);s.trigger("mouseenter");var o=n.$results.offset().top,a=s.offset().top,l=n.$results.scrollTop()+(a-o);0===r?n.$results.scrollTop(0):a-o<0&&n.$results.scrollTop(l)}}),e.on("results:next",function(){var t=n.getHighlightedResults(),e=n.$results.find("[aria-selected]"),i=e.index(t),r=i+1;if(!(r>=e.length)){var s=e.eq(r);s.trigger("mouseenter");var o=n.$results.offset().top+n.$results.outerHeight(!1),a=s.offset().top+s.outerHeight(!1),l=n.$results.scrollTop()+a-o;0===r?n.$results.scrollTop(0):a>o&&n.$results.scrollTop(l)}}),e.on("results:focus",function(t){t.element.addClass("select2-results__option--highlighted")}),e.on("results:message",function(t){n.displayMessage(t)}),t.fn.mousewheel&&this.$results.on("mousewheel",function(t){var e=n.$results.scrollTop(),i=n.$results.get(0).scrollHeight-e+t.deltaY,r=t.deltaY>0&&e-t.deltaY<=0,s=t.deltaY<0&&i<=n.$results.height();r?(n.$results.scrollTop(0),t.preventDefault(),t.stopPropagation()):s&&(n.$results.scrollTop(n.$results.get(0).scrollHeight-n.$results.height()),t.preventDefault(),t.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(e){var i=t(this),r=i.data("data");if("true"===i.attr("aria-selected"))return void(n.options.get("multiple")?n.trigger("unselect",{originalEvent:e,data:r}):n.trigger("close",{}));n.trigger("select",{originalEvent:e,data:r})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(e){var i=t(this).data("data");n.getHighlightedResults().removeClass("select2-results__option--highlighted"),n.trigger("results:focus",{data:i,element:t(this)})})},i.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},i.prototype.destroy=function(){this.$results.remove()},i.prototype.ensureHighlightVisible=function(){var t=this.getHighlightedResults();if(0!==t.length){var e=this.$results.find("[aria-selected]"),i=e.index(t),n=this.$results.offset().top,r=t.offset().top,s=this.$results.scrollTop()+(r-n),o=r-n;s-=2*t.outerHeight(!1),i<=2?this.$results.scrollTop(0):(o>this.$results.outerHeight()||o<0)&&this.$results.scrollTop(s)}},i.prototype.template=function(e,i){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),s=n(e,i);null==s?i.style.display="none":"string"==typeof s?i.innerHTML=r(s):t(i).append(s)},i}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(t,e,i){function n(t,e){this.$element=t,this.options=e,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),this.$selection=e,e},n.prototype.bind=function(t,e){var n=this,r=(t.id,t.id+"-results");this.container=t,this.$selection.on("focus",function(t){n.trigger("focus",t)}),this.$selection.on("blur",function(t){n._handleBlur(t)}),this.$selection.on("keydown",function(t){n.trigger("keypress",t),t.which===i.SPACE&&t.preventDefault()}),t.on("results:focus",function(t){n.$selection.attr("aria-activedescendant",t.data._resultId)}),t.on("selection:update",function(t){n.update(t.data)}),t.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(t)}),t.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.focus(),n._detachCloseHandler(t)}),t.on("enable",function(){n.$selection.attr("tabindex",n._tabindex)}),t.on("disable",function(){n.$selection.attr("tabindex","-1")})},n.prototype._handleBlur=function(e){var i=this;window.setTimeout(function(){document.activeElement==i.$selection[0]||t.contains(i.$selection[0],document.activeElement)||i.trigger("blur",e)},1)},n.prototype._attachCloseHandler=function(e){t(document.body).on("mousedown.select2."+e.id,function(e){var i=t(e.target),n=i.closest(".select2");t(".select2.select2-container--open").each(function(){var e=t(this);this!=n[0]&&e.data("element").select2("close")})})},n.prototype._detachCloseHandler=function(e){t(document.body).off("mousedown.select2."+e.id)},n.prototype.position=function(t,e){e.find(".selection").append(t)},n.prototype.destroy=function(){this._detachCloseHandler(this.container)},n.prototype.update=function(t){throw new Error("The `update` method must be defined in child classes.")},n}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(t,e,i,n){function r(){r.__super__.constructor.apply(this,arguments)}return i.Extend(r,e),r.prototype.render=function(){var t=r.__super__.render.call(this);return t.addClass("select2-selection--single"),t.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),t},r.prototype.bind=function(t,e){var i=this;r.__super__.bind.apply(this,arguments);var n=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",n),this.$selection.attr("aria-labelledby",n),this.$selection.on("mousedown",function(t){1===t.which&&i.trigger("toggle",{originalEvent:t})}),this.$selection.on("focus",function(t){}),this.$selection.on("blur",function(t){}),t.on("focus",function(e){t.isOpen()||i.$selection.focus()}),t.on("selection:update",function(t){i.update(t.data)})},r.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},r.prototype.display=function(t,e){var i=this.options.get("templateSelection");return this.options.get("escapeMarkup")(i(t,e))},r.prototype.selectionContainer=function(){return t("<span></span>")},r.prototype.update=function(t){if(0===t.length)return void this.clear();var e=t[0],i=this.$selection.find(".select2-selection__rendered"),n=this.display(e,i);i.empty().append(n),i.prop("title",e.title||e.text)},r}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(t,e,i){function n(t,e){n.__super__.constructor.apply(this,arguments)}return i.Extend(n,e),n.prototype.render=function(){var t=n.__super__.render.call(this);return t.addClass("select2-selection--multiple"),t.html('<ul class="select2-selection__rendered"></ul>'),t},n.prototype.bind=function(e,i){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(t){r.trigger("toggle",{originalEvent:t})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.options.get("disabled")){var i=t(this),n=i.parent(),s=n.data("data");r.trigger("unselect",{originalEvent:e,data:s})}})},n.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},n.prototype.display=function(t,e){var i=this.options.get("templateSelection");return this.options.get("escapeMarkup")(i(t,e))},n.prototype.selectionContainer=function(){return t('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>')},n.prototype.update=function(t){if(this.clear(),0!==t.length){for(var e=[],n=0;n<t.length;n++){var r=t[n],s=this.selectionContainer(),o=this.display(r,s);s.append(o),s.prop("title",r.title||r.text),s.data("data",r),e.push(s)}var a=this.$selection.find(".select2-selection__rendered");i.appendMany(a,e)}},n}),e.define("select2/selection/placeholder",["../utils"],function(t){function e(t,e,i){this.placeholder=this.normalizePlaceholder(i.get("placeholder")),t.call(this,e,i)}return e.prototype.normalizePlaceholder=function(t,e){return"string"==typeof e&&(e={id:"",text:e}),e},e.prototype.createPlaceholder=function(t,e){var i=this.selectionContainer();return i.html(this.display(e)),i.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),i},e.prototype.update=function(t,e){var i=1==e.length&&e[0].id!=this.placeholder.id;if(e.length>1||i)return t.call(this,e);this.clear();var n=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(n)},e}),e.define("select2/selection/allowClear",["jquery","../keys"],function(t,e){function i(){}return i.prototype.bind=function(t,e,i){var n=this;t.call(this,e,i),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error,this.$selection.on("mousedown",".select2-selection__clear",function(t){n._handleClear(t)}),e.on("keypress",function(t){n._handleKeyboardClear(t,e)})},i.prototype._handleClear=function(t,e){if(!this.options.get("disabled")){var i=this.$selection.find(".select2-selection__clear");if(0!==i.length){e.stopPropagation();for(var n=i.data("data"),r=0;r<n.length;r++){var s={data:n[r]};if(this.trigger("unselect",s),s.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},i.prototype._handleKeyboardClear=function(t,i,n){n.isOpen()||i.which!=e.DELETE&&i.which!=e.BACKSPACE||this._handleClear(i)},i.prototype.update=function(e,i){if(e.call(this,i),!(this.$selection.find(".select2-selection__placeholder").length>0||0===i.length)){var n=t('<span class="select2-selection__clear">&times;</span>');n.data("data",i),this.$selection.find(".select2-selection__rendered").prepend(n)}},i}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(t,e,i){function n(t,e,i){t.call(this,e,i)}return n.prototype.render=function(e){var i=t('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=i,this.$search=i.find("input");var n=e.call(this);return this._transferTabIndex(),n},n.prototype.bind=function(t,e,n){var r=this;t.call(this,e,n),e.on("open",function(){r.$search.trigger("focus")}),e.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),e.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),e.on("disable",function(){r.$search.prop("disabled",!0)}),e.on("focus",function(t){r.$search.trigger("focus")}),e.on("results:focus",function(t){r.$search.attr("aria-activedescendant",t.id)}),this.$selection.on("focusin",".select2-search--inline",function(t){r.trigger("focus",t)}),this.$selection.on("focusout",".select2-search--inline",function(t){r._handleBlur(t)}),this.$selection.on("keydown",".select2-search--inline",function(t){if(t.stopPropagation(),r.trigger("keypress",t),r._keyUpPrevented=t.isDefaultPrevented(),t.which===i.BACKSPACE&&""===r.$search.val()){var e=r.$searchContainer.prev(".select2-selection__choice");if(e.length>0){var n=e.data("data");r.searchRemoveChoice(n),t.preventDefault()}}});var s=document.documentMode,o=s&&s<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(t){if(o)return void r.$selection.off("input.search input.searchcheck");r.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(t){if(o&&"input"===t.type)return void r.$selection.off("input.search input.searchcheck");var e=t.which;e!=i.SHIFT&&e!=i.CTRL&&e!=i.ALT&&e!=i.TAB&&r.handleSearch(t)})},n.prototype._transferTabIndex=function(t){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},n.prototype.createPlaceholder=function(t,e){this.$search.attr("placeholder",e.text)},n.prototype.update=function(t,e){var i=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),t.call(this,e),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),i&&this.$search.focus()},n.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},n.prototype.searchRemoveChoice=function(t,e){this.trigger("unselect",{data:e}),this.$search.val(e.text),this.handleSearch()},n.prototype.resizeSearch=function(){this.$search.css("width","25px");var t="";if(""!==this.$search.attr("placeholder"))t=this.$selection.find(".select2-selection__rendered").innerWidth();else{t=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",t)},n}),e.define("select2/selection/eventRelay",["jquery"],function(t){function e(){}return e.prototype.bind=function(e,i,n){var r=this,s=["open","opening","close","closing","select","selecting","unselect","unselecting"],o=["opening","closing","selecting","unselecting"];e.call(this,i,n),i.on("*",function(e,i){if(-1!==t.inArray(e,s)){i=i||{};var n=t.Event("select2:"+e,{params:i});r.$element.trigger(n),-1!==t.inArray(e,o)&&(i.prevented=n.isDefaultPrevented())}})},e}),e.define("select2/translation",["jquery","require"],function(t,e){function i(t){this.dict=t||{}}return i.prototype.all=function(){return this.dict},i.prototype.get=function(t){return this.dict[t]},i.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},i._cache={},i.loadPath=function(t){if(!(t in i._cache)){var n=e(t);i._cache[t]=n}return new i(i._cache[t])},i}),e.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),e.define("select2/data/base",["../utils"],function(t){function e(t,i){e.__super__.constructor.call(this)}return t.Extend(e,t.Observable),e.prototype.current=function(t){throw new Error("The `current` method must be defined in child classes.")},e.prototype.query=function(t,e){throw new Error("The `query` method must be defined in child classes.")},e.prototype.bind=function(t,e){},e.prototype.destroy=function(){},e.prototype.generateResultId=function(e,i){var n=e.id+"-result-";return n+=t.generateChars(4),null!=i.id?n+="-"+i.id.toString():n+="-"+t.generateChars(4),n},e}),e.define("select2/data/select",["./base","../utils","jquery"],function(t,e,i){function n(t,e){this.$element=t,this.options=e,n.__super__.constructor.call(this)}return e.Extend(n,t),n.prototype.current=function(t){var e=[],n=this;this.$element.find(":selected").each(function(){var t=i(this),r=n.item(t);e.push(r)}),t(e)},n.prototype.select=function(t){var e=this;if(t.selected=!0,i(t.element).is("option"))return t.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(n){var r=[];t=[t],t.push.apply(t,n);for(var s=0;s<t.length;s++){var o=t[s].id;-1===i.inArray(o,r)&&r.push(o)}e.$element.val(r),e.$element.trigger("change")});else{var n=t.id;this.$element.val(n),this.$element.trigger("change")}},n.prototype.unselect=function(t){var e=this;if(this.$element.prop("multiple")){if(t.selected=!1,i(t.element).is("option"))return t.element.selected=!1,void this.$element.trigger("change");this.current(function(n){for(var r=[],s=0;s<n.length;s++){var o=n[s].id;o!==t.id&&-1===i.inArray(o,r)&&r.push(o)}e.$element.val(r),e.$element.trigger("change")})}},n.prototype.bind=function(t,e){var i=this;this.container=t,t.on("select",function(t){i.select(t.data)}),t.on("unselect",function(t){i.unselect(t.data)})},n.prototype.destroy=function(){this.$element.find("*").each(function(){i.removeData(this,"data")})},n.prototype.query=function(t,e){var n=[],r=this;this.$element.children().each(function(){var e=i(this);if(e.is("option")||e.is("optgroup")){var s=r.item(e),o=r.matches(t,s);null!==o&&n.push(o)}}),e({results:n})},n.prototype.addOptions=function(t){e.appendMany(this.$element,t)},n.prototype.option=function(t){var e;t.children?(e=document.createElement("optgroup"),e.label=t.text):(e=document.createElement("option"),void 0!==e.textContent?e.textContent=t.text:e.innerText=t.text),t.id&&(e.value=t.id),t.disabled&&(e.disabled=!0),t.selected&&(e.selected=!0),t.title&&(e.title=t.title);var n=i(e),r=this._normalizeItem(t);return r.element=e,i.data(e,"data",r),n},n.prototype.item=function(t){var e={};if(null!=(e=i.data(t[0],"data")))return e;if(t.is("option"))e={id:t.val(),text:t.text(),disabled:t.prop("disabled"),selected:t.prop("selected"),title:t.prop("title")};else if(t.is("optgroup")){e={text:t.prop("label"),children:[],title:t.prop("title")};for(var n=t.children("option"),r=[],s=0;s<n.length;s++){var o=i(n[s]),a=this.item(o);r.push(a)}e.children=r}return e=this._normalizeItem(e),e.element=t[0],i.data(t[0],"data",e),e},n.prototype._normalizeItem=function(t){i.isPlainObject(t)||(t={id:t,text:t}),t=i.extend({},{text:""},t);var e={selected:!1,disabled:!1};return null!=t.id&&(t.id=t.id.toString()),null!=t.text&&(t.text=t.text.toString()),null==t._resultId&&t.id&&null!=this.container&&(t._resultId=this.generateResultId(this.container,t)),i.extend({},e,t)},n.prototype.matches=function(t,e){return this.options.get("matcher")(t,e)},n}),e.define("select2/data/array",["./select","../utils","jquery"],function(t,e,i){function n(t,e){var i=e.get("data")||[];n.__super__.constructor.call(this,t,e),this.addOptions(this.convertToOptions(i))}return e.Extend(n,t),n.prototype.select=function(t){var e=this.$element.find("option").filter(function(e,i){return i.value==t.id.toString()});0===e.length&&(e=this.option(t),this.addOptions(e)),n.__super__.select.call(this,t)},n.prototype.convertToOptions=function(t){for(var n=this,r=this.$element.find("option"),s=r.map(function(){return n.item(i(this)).id}).get(),o=[],a=0;a<t.length;a++){var l=this._normalizeItem(t[a]);if(i.inArray(l.id,s)>=0){var u=r.filter(function(t){return function(){return i(this).val()==t.id}}(l)),c=this.item(u),h=i.extend(!0,{},l,c),d=this.option(h);u.replaceWith(d)}else{var p=this.option(l);if(l.children){var f=this.convertToOptions(l.children);e.appendMany(p,f)}o.push(p)}}return o},n}),e.define("select2/data/ajax",["./array","../utils","jquery"],function(t,e,i){function n(t,e){this.ajaxOptions=this._applyDefaults(e.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,t,e)}return e.Extend(n,t),n.prototype._applyDefaults=function(t){var e={data:function(t){return i.extend({},t,{q:t.term})},transport:function(t,e,n){var r=i.ajax(t);return r.then(e),r.fail(n),r}};return i.extend({},e,t,!0)},n.prototype.processResults=function(t){return t},n.prototype.query=function(t,e){function n(){var n=s.transport(s,function(n){var s=r.processResults(n,t);r.options.get("debug")&&window.console&&console.error&&(!s||!s.results||i.isArray(s.results)),e(s)},function(){n.status&&"0"===n.status||r.trigger("results:message",{message:"errorLoading"})});r._request=n}var r=this;null!=this._request&&(i.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var s=i.extend({type:"GET"},this.ajaxOptions);"function"==typeof s.url&&(s.url=s.url.call(this.$element,t)),"function"==typeof s.data&&(s.data=s.data.call(this.$element,t)),this.ajaxOptions.delay&&null!=t.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(n,this.ajaxOptions.delay)):n()},n}),e.define("select2/data/tags",["jquery"],function(t){function e(e,i,n){var r=n.get("tags"),s=n.get("createTag");void 0!==s&&(this.createTag=s);var o=n.get("insertTag");if(void 0!==o&&(this.insertTag=o),e.call(this,i,n),t.isArray(r))for(var a=0;a<r.length;a++){var l=r[a],u=this._normalizeItem(l),c=this.option(u);this.$element.append(c)}}return e.prototype.query=function(t,e,i){function n(t,s){for(var o=t.results,a=0;a<o.length;a++){var l=o[a],u=null!=l.children&&!n({results:l.children},!0);if(l.text===e.term||u)return!s&&(t.data=o,void i(t))}if(s)return!0;var c=r.createTag(e);if(null!=c){var h=r.option(c);h.attr("data-select2-tag",!0),r.addOptions([h]),r.insertTag(o,c)}t.results=o,i(t)}var r=this;if(this._removeOldTags(),null==e.term||null!=e.page)return void t.call(this,e,i);t.call(this,e,n)},e.prototype.createTag=function(e,i){var n=t.trim(i.term);return""===n?null:{id:n,text:n}},e.prototype.insertTag=function(t,e,i){e.unshift(i)},e.prototype._removeOldTags=function(e){this._lastTag;this.$element.find("option[data-select2-tag]").each(function(){this.selected||t(this).remove()})},e}),e.define("select2/data/tokenizer",["jquery"],function(t){function e(t,e,i){var n=i.get("tokenizer");void 0!==n&&(this.tokenizer=n),t.call(this,e,i)}return e.prototype.bind=function(t,e,i){t.call(this,e,i),this.$search=e.dropdown.$search||e.selection.$search||i.find(".select2-search__field")},e.prototype.query=function(e,i,n){function r(e){var i=o._normalizeItem(e);if(!o.$element.find("option").filter(function(){return t(this).val()===i.id}).length){var n=o.option(i);n.attr("data-select2-tag",!0),o._removeOldTags(),o.addOptions([n])}s(i)}function s(t){o.trigger("select",{data:t})}var o=this;i.term=i.term||"";var a=this.tokenizer(i,this.options,r);a.term!==i.term&&(this.$search.length&&(this.$search.val(a.term),this.$search.focus()),i.term=a.term),e.call(this,i,n)},e.prototype.tokenizer=function(e,i,n,r){for(var s=n.get("tokenSeparators")||[],o=i.term,a=0,l=this.createTag||function(t){return{id:t.term,text:t.term}};a<o.length;){var u=o[a];if(-1!==t.inArray(u,s)){var c=o.substr(0,a),h=t.extend({},i,{term:c}),d=l(h);null!=d?(r(d),o=o.substr(a+1)||"",a=0):a++}else a++}return{term:o}},e}),e.define("select2/data/minimumInputLength",[],function(){function t(t,e,i){this.minimumInputLength=i.get("minimumInputLength"),t.call(this,e,i)}return t.prototype.query=function(t,e,i){if(e.term=e.term||"",e.term.length<this.minimumInputLength)return void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:e.term,params:e}});t.call(this,e,i)},t}),e.define("select2/data/maximumInputLength",[],function(){function t(t,e,i){this.maximumInputLength=i.get("maximumInputLength"),t.call(this,e,i)}return t.prototype.query=function(t,e,i){if(e.term=e.term||"",this.maximumInputLength>0&&e.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:e.term,params:e}});t.call(this,e,i)},t}),e.define("select2/data/maximumSelectionLength",[],function(){function t(t,e,i){this.maximumSelectionLength=i.get("maximumSelectionLength"),t.call(this,e,i)}return t.prototype.query=function(t,e,i){var n=this;this.current(function(r){var s=null!=r?r.length:0;if(n.maximumSelectionLength>0&&s>=n.maximumSelectionLength)return void n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}});t.call(n,e,i)})},t}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function i(t,e){this.$element=t,this.options=e,i.__super__.constructor.call(this)}return e.Extend(i,e.Observable),i.prototype.render=function(){var e=t('<span class="select2-dropdown"><span class="select2-results"></span></span>');return e.attr("dir",this.options.get("dir")),this.$dropdown=e,e},i.prototype.bind=function(){},i.prototype.position=function(t,e){},i.prototype.destroy=function(){this.$dropdown.remove()},i}),e.define("select2/dropdown/search",["jquery","../utils"],function(t,e){function i(){}return i.prototype.render=function(e){var i=e.call(this),n=t('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=n,this.$search=n.find("input"),i.prepend(n),i},i.prototype.bind=function(e,i,n){var r=this;e.call(this,i,n),this.$search.on("keydown",function(t){r.trigger("keypress",t),r._keyUpPrevented=t.isDefaultPrevented()}),this.$search.on("input",function(e){t(this).off("keyup")}),this.$search.on("keyup input",function(t){r.handleSearch(t)}),i.on("open",function(){r.$search.attr("tabindex",0),r.$search.focus(),window.setTimeout(function(){r.$search.focus()},0)}),i.on("close",function(){r.$search.attr("tabindex",-1),r.$search.val("")}),i.on("focus",function(){i.isOpen()&&r.$search.focus()}),i.on("results:all",function(t){if(null==t.query.term||""===t.query.term){r.showSearch(t)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide")}})},i.prototype.handleSearch=function(t){if(!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},i.prototype.showSearch=function(t,e){return!0},i}),e.define("select2/dropdown/hidePlaceholder",[],function(){function t(t,e,i,n){this.placeholder=this.normalizePlaceholder(i.get("placeholder")),t.call(this,e,i,n)}return t.prototype.append=function(t,e){e.results=this.removePlaceholder(e.results),t.call(this,e)},t.prototype.normalizePlaceholder=function(t,e){return"string"==typeof e&&(e={id:"",text:e}),e},t.prototype.removePlaceholder=function(t,e){for(var i=e.slice(0),n=e.length-1;n>=0;n--){var r=e[n];this.placeholder.id===r.id&&i.splice(n,1)}return i},t}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(t){function e(t,e,i,n){this.lastParams={},t.call(this,e,i,n),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(t,e){this.$loadingMore.remove(),this.loading=!1,t.call(this,e),this.showLoadingMore(e)&&this.$results.append(this.$loadingMore)},e.prototype.bind=function(e,i,n){var r=this;e.call(this,i,n),i.on("query",function(t){r.lastParams=t,r.loading=!0}),i.on("query:append",function(t){r.lastParams=t,r.loading=!0}),this.$results.on("scroll",function(){var e=t.contains(document.documentElement,r.$loadingMore[0]);if(!r.loading&&e){r.$results.offset().top+r.$results.outerHeight(!1)+50>=r.$loadingMore.offset().top+r.$loadingMore.outerHeight(!1)&&r.loadMore()}})},e.prototype.loadMore=function(){this.loading=!0;var e=t.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(t,e){return e.pagination&&e.pagination.more},e.prototype.createLoadingMore=function(){var e=t('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),i=this.options.get("translations").get("loadingMore");return e.html(i(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(t,e){function i(e,i,n){this.$dropdownParent=n.get("dropdownParent")||t(document.body),e.call(this,i,n)}return i.prototype.bind=function(t,e,i){var n=this,r=!1;t.call(this,e,i),e.on("open",function(){n._showDropdown(),n._attachPositioningHandler(e),r||(r=!0,e.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),e.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}))}),e.on("close",function(){n._hideDropdown(),n._detachPositioningHandler(e)}),this.$dropdownContainer.on("mousedown",function(t){t.stopPropagation()})},i.prototype.destroy=function(t){t.call(this),this.$dropdownContainer.remove()},i.prototype.position=function(t,e,i){e.attr("class",i.attr("class")),e.removeClass("select2"),e.addClass("select2-container--open"),e.css({position:"absolute",top:-999999}),this.$container=i},i.prototype.render=function(e){var i=t("<span></span>"),n=e.call(this);return i.append(n),this.$dropdownContainer=i,i},i.prototype._hideDropdown=function(t){this.$dropdownContainer.detach()},i.prototype._attachPositioningHandler=function(i,n){var r=this,s="scroll.select2."+n.id,o="resize.select2."+n.id,a="orientationchange.select2."+n.id,l=this.$container.parents().filter(e.hasScroll);l.each(function(){t(this).data("select2-scroll-position",{x:t(this).scrollLeft(),y:t(this).scrollTop()})}),l.on(s,function(e){var i=t(this).data("select2-scroll-position");t(this).scrollTop(i.y)}),t(window).on(s+" "+o+" "+a,function(t){r._positionDropdown(),r._resizeDropdown()})},i.prototype._detachPositioningHandler=function(i,n){var r="scroll.select2."+n.id,s="resize.select2."+n.id,o="orientationchange.select2."+n.id;this.$container.parents().filter(e.hasScroll).off(r),t(window).off(r+" "+s+" "+o)},i.prototype._positionDropdown=function(){var e=t(window),i=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,s=this.$container.offset();s.bottom=s.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=s.top,o.bottom=s.top+o.height;var a={height:this.$dropdown.outerHeight(!1)},l={top:e.scrollTop(),bottom:e.scrollTop()+e.height()},u=l.top<s.top-a.height,c=l.bottom>s.bottom+a.height,h={left:s.left,top:o.bottom},d=this.$dropdownParent;"static"===d.css("position")&&(d=d.offsetParent());var p=d.offset();h.top-=p.top,h.left-=p.left,i||n||(r="below"),c||!u||i?!u&&c&&i&&(r="below"):r="above",("above"==r||i&&"below"!==r)&&(h.top=o.top-p.top-a.height),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(h)},i.prototype._resizeDropdown=function(){var t={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(t.minWidth=t.width,t.position="relative",t.width="auto"),this.$dropdown.css(t)},i.prototype._showDropdown=function(t){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},i}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function t(e){for(var i=0,n=0;n<e.length;n++){var r=e[n];r.children?i+=t(r.children):i++}return i}function e(t,e,i,n){this.minimumResultsForSearch=i.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),t.call(this,e,i,n)}return e.prototype.showSearch=function(e,i){return!(t(i.data.results)<this.minimumResultsForSearch)&&e.call(this,i)},e}),e.define("select2/dropdown/selectOnClose",[],function(){function t(){}return t.prototype.bind=function(t,e,i){var n=this;t.call(this,e,i),e.on("close",function(t){n._handleSelectOnClose(t)})},t.prototype._handleSelectOnClose=function(t,e){if(e&&null!=e.originalSelect2Event){var i=e.originalSelect2Event;if("select"===i._type||"unselect"===i._type)return}var n=this.getHighlightedResults();if(!(n.length<1)){var r=n.data("data");null!=r.element&&r.element.selected||null==r.element&&r.selected||this.trigger("select",{data:r})}},t}),e.define("select2/dropdown/closeOnSelect",[],function(){function t(){}return t.prototype.bind=function(t,e,i){var n=this;t.call(this,e,i),e.on("select",function(t){n._selectTriggered(t)}),e.on("unselect",function(t){n._selectTriggered(t)})},t.prototype._selectTriggered=function(t,e){var i=e.originalEvent;i&&i.ctrlKey||this.trigger("close",{originalEvent:i,originalSelect2Event:e})},t}),e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(t){var e=t.input.length-t.maximum,i="Please delete "+e+" character";return 1!=e&&(i+="s"),i},inputTooShort:function(t){return"Please enter "+(t.minimum-t.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){var e="You can only select "+t.maximum+" item";return 1!=t.maximum&&(e+="s"),e},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),e.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(t,e,i,n,r,s,o,a,l,u,c,h,d,p,f,g,m,v,_,y,b,w,x,C,k,T,D,S,A){function E(){this.reset()}return E.prototype.apply=function(h){if(h=t.extend(!0,{},this.defaults,h),null==h.dataAdapter){if(null!=h.ajax?h.dataAdapter=f:null!=h.data?h.dataAdapter=p:h.dataAdapter=d,h.minimumInputLength>0&&(h.dataAdapter=u.Decorate(h.dataAdapter,v)),h.maximumInputLength>0&&(h.dataAdapter=u.Decorate(h.dataAdapter,_)),h.maximumSelectionLength>0&&(h.dataAdapter=u.Decorate(h.dataAdapter,y)),h.tags&&(h.dataAdapter=u.Decorate(h.dataAdapter,g)),null==h.tokenSeparators&&null==h.tokenizer||(h.dataAdapter=u.Decorate(h.dataAdapter,m)),null!=h.query){var A=e(h.amdBase+"compat/query");h.dataAdapter=u.Decorate(h.dataAdapter,A)}if(null!=h.initSelection){var E=e(h.amdBase+"compat/initSelection");h.dataAdapter=u.Decorate(h.dataAdapter,E)}}if(null==h.resultsAdapter&&(h.resultsAdapter=i,null!=h.ajax&&(h.resultsAdapter=u.Decorate(h.resultsAdapter,C)),null!=h.placeholder&&(h.resultsAdapter=u.Decorate(h.resultsAdapter,x)),h.selectOnClose&&(h.resultsAdapter=u.Decorate(h.resultsAdapter,D))),null==h.dropdownAdapter){if(h.multiple)h.dropdownAdapter=b;else{var I=u.Decorate(b,w);h.dropdownAdapter=I}if(0!==h.minimumResultsForSearch&&(h.dropdownAdapter=u.Decorate(h.dropdownAdapter,T)),h.closeOnSelect&&(h.dropdownAdapter=u.Decorate(h.dropdownAdapter,S)),null!=h.dropdownCssClass||null!=h.dropdownCss||null!=h.adaptDropdownCssClass){var $=e(h.amdBase+"compat/dropdownCss");h.dropdownAdapter=u.Decorate(h.dropdownAdapter,$)}h.dropdownAdapter=u.Decorate(h.dropdownAdapter,k)}if(null==h.selectionAdapter){if(h.multiple?h.selectionAdapter=r:h.selectionAdapter=n,null!=h.placeholder&&(h.selectionAdapter=u.Decorate(h.selectionAdapter,s)),h.allowClear&&(h.selectionAdapter=u.Decorate(h.selectionAdapter,o)),h.multiple&&(h.selectionAdapter=u.Decorate(h.selectionAdapter,a)),null!=h.containerCssClass||null!=h.containerCss||null!=h.adaptContainerCssClass){var O=e(h.amdBase+"compat/containerCss");h.selectionAdapter=u.Decorate(h.selectionAdapter,O)}h.selectionAdapter=u.Decorate(h.selectionAdapter,l)}if("string"==typeof h.language)if(h.language.indexOf("-")>0){var P=h.language.split("-"),N=P[0];h.language=[h.language,N]}else h.language=[h.language];if(t.isArray(h.language)){var M=new c;h.language.push("en");for(var j=h.language,H=0;H<j.length;H++){var R=j[H],L={};try{L=c.loadPath(R)}catch(t){try{R=this.defaults.amdLanguageBase+R,L=c.loadPath(R)}catch(t){h.debug&&window.console&&console.warn;continue}}M.extend(L)}h.translations=M}else{var F=c.loadPath(this.defaults.amdLanguageBase+"en"),z=new c(h.language);z.extend(F),h.translations=z}return h},E.prototype.reset=function(){function e(t){function e(t){return h[t]||t}return t.replace(/[^\u0000-\u007E]/g,e)}function i(n,r){if(""===t.trim(n.term))return r;if(r.children&&r.children.length>0){for(var s=t.extend(!0,{},r),o=r.children.length-1;o>=0;o--){null==i(n,r.children[o])&&s.children.splice(o,1)}return s.children.length>0?s:i(n,s)}var a=e(r.text).toUpperCase(),l=e(n.term).toUpperCase();return a.indexOf(l)>-1?r:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:u.escapeMarkup,language:A,matcher:i,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(t){return t},templateResult:function(t){return t.text},templateSelection:function(t){return t.text},theme:"default",width:"resolve"}},E.prototype.set=function(e,i){var n=t.camelCase(e),r={};r[n]=i;var s=u._convertData(r);t.extend(this.defaults,s)},new E}),e.define("select2/options",["require","jquery","./defaults","./utils"],function(t,e,i,n){function r(e,r){if(this.options=e,null!=r&&this.fromElement(r),this.options=i.apply(this.options),r&&r.is("input")){var s=t(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=n.Decorate(this.options.dataAdapter,s)}}return r.prototype.fromElement=function(t){var i=["select2"];null==this.options.multiple&&(this.options.multiple=t.prop("multiple")),null==this.options.disabled&&(this.options.disabled=t.prop("disabled")),null==this.options.language&&(t.prop("lang")?this.options.language=t.prop("lang").toLowerCase():t.closest("[lang]").prop("lang")&&(this.options.language=t.closest("[lang]").prop("lang"))),null==this.options.dir&&(t.prop("dir")?this.options.dir=t.prop("dir"):t.closest("[dir]").prop("dir")?this.options.dir=t.closest("[dir]").prop("dir"):this.options.dir="ltr"),t.prop("disabled",this.options.disabled),t.prop("multiple",this.options.multiple),t.data("select2Tags")&&(this.options.debug&&window.console&&console.warn,t.data("data",t.data("select2Tags")),t.data("tags",!0)),t.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn,t.attr("ajax--url",t.data("ajaxUrl")),t.data("ajax--url",t.data("ajaxUrl")));var r={};r=e.fn.jquery&&"1."==e.fn.jquery.substr(0,2)&&t[0].dataset?e.extend(!0,{},t[0].dataset,t.data()):t.data();var s=e.extend(!0,{},r);s=n._convertData(s);for(var o in s)e.inArray(o,i)>-1||(e.isPlainObject(this.options[o])?e.extend(this.options[o],s[o]):this.options[o]=s[o]);return this},r.prototype.get=function(t){return this.options[t]},r.prototype.set=function(t,e){this.options[t]=e},r}),e.define("select2/core",["jquery","./options","./utils","./keys"],function(t,e,i,n){var r=function(t,i){null!=t.data("select2")&&t.data("select2").destroy(),this.$element=t,this.id=this._generateId(t),i=i||{},this.options=new e(i,t),r.__super__.constructor.call(this);var n=t.attr("tabindex")||0;t.data("old-tabindex",n),t.attr("tabindex","-1");var s=this.options.get("dataAdapter");this.dataAdapter=new s(t,this.options);var o=this.render();this._placeContainer(o);var a=this.options.get("selectionAdapter");this.selection=new a(t,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,o);var l=this.options.get("dropdownAdapter");this.dropdown=new l(t,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,o);var u=this.options.get("resultsAdapter");this.results=new u(t,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var c=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(t){c.trigger("selection:update",{data:t})}),t.addClass("select2-hidden-accessible"),t.attr("aria-hidden","true"),this._syncAttributes(),t.data("select2",this)};return i.Extend(r,i.Observable),r.prototype._generateId=function(t){var e="";return e=null!=t.attr("id")?t.attr("id"):null!=t.attr("name")?t.attr("name")+"-"+i.generateChars(2):i.generateChars(4),e=e.replace(/(:|\.|\[|\]|,)/g,""),e="select2-"+e},r.prototype._placeContainer=function(t){t.insertAfter(this.$element);var e=this._resolveWidth(this.$element,this.options.get("width"));null!=e&&t.css("width",e)},r.prototype._resolveWidth=function(t,e){var i=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==e){var n=this._resolveWidth(t,"style");return null!=n?n:this._resolveWidth(t,"element")}if("element"==e){var r=t.outerWidth(!1);return r<=0?"auto":r+"px"}if("style"==e){var s=t.attr("style");if("string"!=typeof s)return null;for(var o=s.split(";"),a=0,l=o.length;a<l;a+=1){var u=o[a].replace(/\s/g,""),c=u.match(i);if(null!==c&&c.length>=1)return c[1]}return null}return e},r.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},r.prototype._registerDomEvents=function(){var e=this;this.$element.on("change.select2",function(){e.dataAdapter.current(function(t){e.trigger("selection:update",{data:t})})}),this.$element.on("focus.select2",function(t){e.trigger("focus",t)}),this._syncA=i.bind(this._syncAttributes,this),this._syncS=i.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var n=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=n?(this._observer=new n(function(i){t.each(i,e._syncA),t.each(i,e._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",e._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",e._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",e._syncS,!1))},r.prototype._registerDataEvents=function(){var t=this;this.dataAdapter.on("*",function(e,i){t.trigger(e,i)})},r.prototype._registerSelectionEvents=function(){var e=this,i=["toggle","focus"];this.selection.on("toggle",function(){e.toggleDropdown()}),this.selection.on("focus",function(t){e.focus(t)}),this.selection.on("*",function(n,r){-1===t.inArray(n,i)&&e.trigger(n,r)})},r.prototype._registerDropdownEvents=function(){var t=this;this.dropdown.on("*",function(e,i){t.trigger(e,i)})},r.prototype._registerResultsEvents=function(){var t=this;this.results.on("*",function(e,i){t.trigger(e,i)})},r.prototype._registerEvents=function(){var t=this;this.on("open",function(){t.$container.addClass("select2-container--open")}),this.on("close",function(){t.$container.removeClass("select2-container--open")}),this.on("enable",function(){t.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){t.$container.addClass("select2-container--disabled")}),this.on("blur",function(){t.$container.removeClass("select2-container--focus")}),this.on("query",function(e){t.isOpen()||t.trigger("open",{}),this.dataAdapter.query(e,function(i){t.trigger("results:all",{data:i,query:e})})}),this.on("query:append",function(e){this.dataAdapter.query(e,function(i){t.trigger("results:append",{data:i,query:e})})}),this.on("keypress",function(e){var i=e.which;t.isOpen()?i===n.ESC||i===n.TAB||i===n.UP&&e.altKey?(t.close(),e.preventDefault()):i===n.ENTER?(t.trigger("results:select",{}),e.preventDefault()):i===n.SPACE&&e.ctrlKey?(t.trigger("results:toggle",{}),e.preventDefault()):i===n.UP?(t.trigger("results:previous",{}),e.preventDefault()):i===n.DOWN&&(t.trigger("results:next",{}),e.preventDefault()):(i===n.ENTER||i===n.SPACE||i===n.DOWN&&e.altKey)&&(t.open(),e.preventDefault())})},r.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},r.prototype._syncSubtree=function(t,e){var i=!1,n=this;if(!t||!t.target||"OPTION"===t.target.nodeName||"OPTGROUP"===t.target.nodeName){if(e)if(e.addedNodes&&e.addedNodes.length>0)for(var r=0;r<e.addedNodes.length;r++){var s=e.addedNodes[r];s.selected&&(i=!0)}else e.removedNodes&&e.removedNodes.length>0&&(i=!0);else i=!0;i&&this.dataAdapter.current(function(t){n.trigger("selection:update",{data:t})})}},r.prototype.trigger=function(t,e){var i=r.__super__.trigger,n={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===e&&(e={}),t in n){var s=n[t],o={prevented:!1,name:t,args:e};if(i.call(this,s,o),o.prevented)return void(e.prevented=!0)}i.call(this,t,e)},r.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},r.prototype.open=function(){this.isOpen()||this.trigger("query",{})},r.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},r.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},r.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},r.prototype.focus=function(t){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},r.prototype.enable=function(t){this.options.get("debug")&&window.console&&console.warn,null!=t&&0!==t.length||(t=[!0]);var e=!t[0];this.$element.prop("disabled",e)},r.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn;var t=[];return this.dataAdapter.current(function(e){t=e}),t},r.prototype.val=function(e){if(this.options.get("debug")&&window.console&&console.warn,null==e||0===e.length)return this.$element.val();var i=e[0];t.isArray(i)&&(i=t.map(i,function(t){return t.toString()})),this.$element.val(i).trigger("change")},r.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},r.prototype.render=function(){var e=t('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),e.data("element",this.$element),e},r}),e.define("jquery-mousewheel",["jquery"],function(t){return t}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(t,e,i,n){if(null==t.fn.select2){var r=["open","close","destroy"];t.fn.select2=function(e){if("object"==typeof(e=e||{}))return this.each(function(){var n=t.extend(!0,{},e);new i(t(this),n)}),this;if("string"==typeof e){var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var i=t(this).data("select2");null==i&&window.console&&console.error,n=i[e].apply(i,s)}),t.inArray(e,r)>-1?this:n}throw new Error("Invalid arguments for Select2: "+e)}}return null==t.fn.select2.defaults&&(t.fn.select2.defaults=n),i}),{define:e.define,require:e.require}}(),i=e.require("jquery.select2");return t.fn.select2.amd=e,i})},function(t,e,i){i(51);var n=i(1)(i(10),i(43),"data-v-3edef3ba",null);t.exports=n.exports},function(t,e,i){i(53);var n=i(1)(i(11),i(44),"data-v-5667c312",null);t.exports=n.exports},function(t,e,i){i(54);var n=i(1)(i(12),i(45),null,null);t.exports=n.exports},function(t,e,i){i(52);var n=i(1)(i(13),null,"data-v-5301a236",null);t.exports=n.exports},function(t,e,i){i(55);var n=i(1)(i(14),i(46),"data-v-de0d0e4e",null);t.exports=n.exports},function(t,e,i){i(56);var n=i(1)(i(15),i(47),"data-v-e9c80318",null);t.exports=n.exports},function(t,e,i){i(50);var n=i(1)(i(16),i(42),"data-v-225778c2",null);t.exports=n.exports},function(t,e,i){i(57);var n=i(1)(i(17),i(48),"data-v-ff564a86",null);t.exports=n.exports},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[i("div",[i("div",{staticClass:"panel panel-default"},[i("div",{staticClass:"panel-heading"},[i("div",{staticStyle:{display:"flex","justify-content":"space-between","align-items":"center"}},[i("span",[t._v("\n                        Personal Access Tokens\n                    ")]),t._v(" "),i("a",{staticClass:"action-link",on:{click:t.showCreateTokenForm}},[t._v("\n                        Create New Token\n                    ")])])]),t._v(" "),i("div",{staticClass:"panel-body"},[0===t.tokens.length?i("p",{staticClass:"m-b-none"},[t._v("\n                    You have not created any personal access tokens.\n                ")]):t._e(),t._v(" "),t.tokens.length>0?i("table",{staticClass:"table table-borderless m-b-none"},[t._m(0),t._v(" "),i("tbody",t._l(t.tokens,function(e){return i("tr",[i("td",{staticStyle:{"vertical-align":"middle"}},[t._v("\n                                "+t._s(e.name)+"\n                            ")]),t._v(" "),i("td",{staticStyle:{"vertical-align":"middle"}},[i("a",{staticClass:"action-link text-danger",on:{click:function(i){t.revoke(e)}}},[t._v("\n                                    Delete\n                                ")])])])}))]):t._e()])])]),t._v(" "),i("div",{staticClass:"modal fade",attrs:{id:"modal-create-token",tabindex:"-1",role:"dialog"}},[i("div",{staticClass:"modal-dialog"},[i("div",{staticClass:"modal-content"},[t._m(1),t._v(" "),i("div",{staticClass:"modal-body"},[t.form.errors.length>0?i("div",{staticClass:"alert alert-danger"},[t._m(2),t._v(" "),i("br"),t._v(" "),i("ul",t._l(t.form.errors,function(e){return i("li",[t._v("\n                                "+t._s(e)+"\n                            ")])}))]):t._e(),t._v(" "),i("form",{staticClass:"form-horizontal",attrs:{role:"form"},on:{submit:function(e){e.preventDefault(),t.store(e)}}},[i("div",{staticClass:"form-group"},[i("label",{staticClass:"col-md-4 control-label"},[t._v("Name")]),t._v(" "),i("div",{staticClass:"col-md-6"},[i("input",{directives:[{name:"model",rawName:"v-model",value:t.form.name,expression:"form.name"}],staticClass:"form-control",attrs:{id:"create-token-name",type:"text",name:"name"},domProps:{value:t.form.name},on:{input:function(e){e.target.composing||(t.form.name=e.target.value)}}})])]),t._v(" "),t.scopes.length>0?i("div",{staticClass:"form-group"},[i("label",{staticClass:"col-md-4 control-label"},[t._v("Scopes")]),t._v(" "),i("div",{staticClass:"col-md-6"},t._l(t.scopes,function(e){return i("div",[i("div",{staticClass:"checkbox"},[i("label",[i("input",{attrs:{type:"checkbox"},domProps:{checked:t.scopeIsAssigned(e.id)},on:{click:function(i){t.toggleScope(e.id)}}}),t._v("\n\n                                                "+t._s(e.id)+"\n                                        ")])])])}))]):t._e()])]),t._v(" "),i("div",{staticClass:"modal-footer"},[i("button",{staticClass:"btn btn-default",attrs:{type:"button","data-dismiss":"modal"}},[t._v("Close")]),t._v(" "),i("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:t.store}},[t._v("\n                        Create\n                    ")])])])])]),t._v(" "),i("div",{staticClass:"modal fade",attrs:{id:"modal-access-token",tabindex:"-1",role:"dialog"}},[i("div",{staticClass:"modal-dialog"},[i("div",{staticClass:"modal-content"},[t._m(3),t._v(" "),i("div",{staticClass:"modal-body"},[i("p",[t._v("\n                        Here is your new personal access token. This is the only time it will be shown so don't lose it!\n                        You may now use this token to make API requests.\n                    ")]),t._v(" "),i("pre",[i("code",[t._v(t._s(t.accessToken))])])]),t._v(" "),t._m(4)])])])])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("thead",[i("tr",[i("th",[t._v("Name")]),t._v(" "),i("th")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"modal-header"},[i("button",{staticClass:"close",attrs:{type:"button ","data-dismiss":"modal","aria-hidden":"true"}},[t._v("×")]),t._v(" "),i("h4",{staticClass:"modal-title"},[t._v("\n                        Create Token\n                    ")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[i("strong",[t._v("Whoops!")]),t._v(" Something went wrong!")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"modal-header"},[i("button",{staticClass:"close",attrs:{type:"button ","data-dismiss":"modal","aria-hidden":"true"}},[t._v("×")]),t._v(" "),i("h4",{staticClass:"modal-title"},[t._v("\n                        Personal Access Token\n                    ")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"modal-footer"},[i("button",{staticClass:"btn btn-default",attrs:{type:"button","data-dismiss":"modal"}},[t._v("Close")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"col-md-12",class:t.alertType},[i("div",{staticClass:"alert",class:t.alertClassName},[i("button",{staticClass:"close",attrs:{type:"button"},on:{click:t.hideEvent}},[t._v("×")]),t._v(" "),i("i",{directives:[{name:"show",rawName:"v-show",value:"success"==t.alertType,expression:"alertType == 'success'"}],staticClass:"fa fa-check faa-pulse animated"}),t._v(" "),i("strong",[t._v(t._s(t.title)+" ")]),t._v(" "),t._t("default")],2)])},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.errors?i("div",{staticClass:"box"},[i("div",{staticClass:"box-body"},[t._m(0),t._v(" "),i("div",{staticClass:"errors-table"},[i("table",{staticClass:"table table-striped table-bordered",attrs:{id:"errors-table"}},[t._m(1),t._v(" "),i("tbody",t._l(t.errors,function(e,n){return i("tr",[i("td",[t._v(t._s(n))]),t._v(" "),t._l(e,function(e,n){return i("td",[i("b",[t._v(t._s(n)+":")]),t._v(" "),t._l(e,function(e){return i("span",[t._v(t._s(e[0]))])}),t._v(" "),i("br")],2)})],2)}))])])])]):t._e()},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"alert alert-warning"},[i("strong",[t._v("Warning")]),t._v(" Some Errors occured while importing\n    ")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("thead",[i("th",[t._v("Item")]),t._v(" "),i("th",[t._v("Errors")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("tr",{directives:[{name:"show",rawName:"v-show",value:t.processDetail,expression:"processDetail"}]},[i("td",{attrs:{colspan:"3"}},[i("h4",{staticClass:"modal-title"},[t._v("Import File:")]),t._v(" "),i("div",{staticClass:"dynamic-form-row"},[t._m(0),t._v(" "),i("div",{staticClass:"col-md-4 col-xs-12"},[i("select2",{attrs:{options:t.options.importTypes},model:{value:t.options.importType,callback:function(e){t.options.importType=e},expression:"options.importType"}},[i("option",{attrs:{disabled:"",value:"0"}})])],1)]),t._v(" "),i("div",{staticClass:"dynamic-form-row"},[t._m(1),t._v(" "),i("div",{staticClass:"col-md-4 col-xs-12"},[i("input",{directives:[{name:"model",rawName:"v-model",value:t.options.update,expression:"options.update"}],attrs:{type:"checkbox",name:"import-update"},domProps:{checked:Array.isArray(t.options.update)?t._i(t.options.update,null)>-1:t.options.update},on:{__c:function(e){var i=t.options.update,n=e.target,r=!!n.checked;if(Array.isArray(i)){var s=t._i(i,null);r?s<0&&(t.options.update=i.concat(null)):s>-1&&(t.options.update=i.slice(0,s).concat(i.slice(s+1)))}else t.options.update=r}}})])]),t._v(" "),i("div",{staticClass:"col-md-12",staticStyle:{"padding-top":"30px"}},[i("table",{staticClass:"table"},[t._m(2),t._v(" "),i("tbody",[t._l(t.file.header_row,function(e,n){return[i("tr",[i("td",[i("label",{staticClass:"controllabel",attrs:{for:e}},[t._v(t._s(e))])]),t._v(" "),i("td",[i("div",{attrs:{required:""}},[i("select2",{attrs:{options:t.columns},model:{value:t.columnMappings[e],callback:function(i){var n=t.columnMappings,r=e;Array.isArray(n)?n.splice(r,1,i):t.columnMappings[e]=i},expression:"columnMappings[header]"}},[i("option",{attrs:{value:"0"}},[t._v("Do Not Import")])])],1)]),t._v(" "),i("td",[i("div",[t._v(t._s(t.activeFile.first_row[n]))])])])]})],2)])])]),t._v(" "),i("td",[i("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:function(e){t.processDetail=!1}}},[t._v("Cancel")]),t._v(" "),i("button",{staticClass:"btn btn-primary",attrs:{type:"submit"},on:{click:t.postSave}},[t._v("Import")]),t._v(" "),t.statusText?i("div",{staticClass:"alert alert-success col-md-5 col-md-offset-1",staticStyle:{"text-align":"left"}},[t._v(t._s(this.statusText))]):t._e()])])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"col-md-4 col-xs-12"},[i("label",{attrs:{for:"import-type"}},[t._v("Import Type:")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"col-md-4 col-xs-12"},[i("label",{attrs:{for:"import-update"}},[t._v("Update Existing Values?:")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("thead",[i("th",[t._v("Header Field")]),t._v(" "),i("th",[t._v("Import Field")]),t._v(" "),i("th",[t._v("Sample Value")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[t.tokens.length>0?i("div",[i("div",{staticClass:"panel panel-default"},[i("div",{staticClass:"panel-heading"},[t._v("Authorized Applications")]),t._v(" "),i("div",{staticClass:"panel-body"},[i("table",{staticClass:"table table-borderless m-b-none"},[t._m(0),t._v(" "),i("tbody",t._l(t.tokens,function(e){return i("tr",[i("td",{staticStyle:{"vertical-align":"middle"}},[t._v("\n                                "+t._s(e.client.name)+"\n                            ")]),t._v(" "),i("td",{staticStyle:{"vertical-align":"middle"}},[e.scopes.length>0?i("span",[t._v("\n                                    "+t._s(e.scopes.join(", "))+"\n                                ")]):t._e()]),t._v(" "),i("td",{staticStyle:{"vertical-align":"middle"}},[i("a",{staticClass:"action-link text-danger",on:{click:function(i){t.revoke(e)}}},[t._v("\n                                    Revoke\n                                ")])])])}))])])])]):t._e()])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("thead",[i("tr",[i("th",[t._v("Name")]),t._v(" "),i("th",[t._v("Scopes")]),t._v(" "),i("th")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[i("div",{staticClass:"panel panel-default"},[i("div",{staticClass:"panel-heading"},[i("div",{staticStyle:{display:"flex","justify-content":"space-between","align-items":"center"}},[i("span",[t._v("\n                    OAuth Clients\n                ")]),t._v(" "),i("a",{staticClass:"action-link",on:{click:t.showCreateClientForm}},[t._v("\n                    Create New Client\n                ")])])]),t._v(" "),i("div",{staticClass:"panel-body"},[0===t.clients.length?i("p",{staticClass:"m-b-none"},[t._v("\n                You have not created any OAuth clients.\n            ")]):t._e(),t._v(" "),t.clients.length>0?i("table",{staticClass:"table table-borderless m-b-none"},[t._m(0),t._v(" "),i("tbody",t._l(t.clients,function(e){return i("tr",[i("td",{staticStyle:{"vertical-align":"middle"}},[t._v("\n                            "+t._s(e.id)+"\n                        ")]),t._v(" "),i("td",{staticStyle:{"vertical-align":"middle"}},[t._v("\n                            "+t._s(e.name)+"\n                        ")]),t._v(" "),i("td",{staticStyle:{"vertical-align":"middle"}},[i("code",[t._v(t._s(e.secret))])]),t._v(" "),i("td",{staticStyle:{"vertical-align":"middle"}},[i("a",{staticClass:"action-link",on:{click:function(i){t.edit(e)}}},[t._v("\n                                Edit\n                            ")])]),t._v(" "),i("td",{staticStyle:{"vertical-align":"middle"}},[i("a",{staticClass:"action-link text-danger",on:{click:function(i){t.destroy(e)}}},[t._v("\n                                Delete\n                            ")])])])}))]):t._e()])]),t._v(" "),i("div",{staticClass:"modal fade",attrs:{id:"modal-create-client",tabindex:"-1",role:"dialog"}},[i("div",{staticClass:"modal-dialog"},[i("div",{staticClass:"modal-content"},[t._m(1),t._v(" "),i("div",{staticClass:"modal-body"},[t.createForm.errors.length>0?i("div",{staticClass:"alert alert-danger"},[t._m(2),t._v(" "),i("br"),t._v(" "),i("ul",t._l(t.createForm.errors,function(e){return i("li",[t._v("\n                                "+t._s(e)+"\n                            ")])}))]):t._e(),t._v(" "),i("form",{staticClass:"form-horizontal",attrs:{role:"form"}},[i("div",{staticClass:"form-group"},[i("label",{staticClass:"col-md-3 control-label"},[t._v("Name")]),t._v(" "),i("div",{staticClass:"col-md-7"},[i("input",{directives:[{name:"model",rawName:"v-model",value:t.createForm.name,expression:"createForm.name"}],staticClass:"form-control",attrs:{id:"create-client-name",type:"text"},domProps:{value:t.createForm.name},on:{keyup:function(e){if(!("button"in e)&&t._k(e.keyCode,"enter",13))return null;t.store(e)},input:function(e){e.target.composing||(t.createForm.name=e.target.value)}}}),t._v(" "),i("span",{staticClass:"help-block"},[t._v("\n                                    Something your users will recognize and trust.\n                                ")])])]),t._v(" "),i("div",{staticClass:"form-group"},[i("label",{staticClass:"col-md-3 control-label"},[t._v("Redirect URL")]),t._v(" "),i("div",{staticClass:"col-md-7"},[i("input",{directives:[{name:"model",rawName:"v-model",value:t.createForm.redirect,expression:"createForm.redirect"}],staticClass:"form-control",attrs:{type:"text",name:"redirect"},domProps:{value:t.createForm.redirect},on:{keyup:function(e){if(!("button"in e)&&t._k(e.keyCode,"enter",13))return null;t.store(e)},input:function(e){e.target.composing||(t.createForm.redirect=e.target.value)}}}),t._v(" "),i("span",{staticClass:"help-block"},[t._v("\n                                    Your application's authorization callback URL.\n                                ")])])])])]),t._v(" "),i("div",{staticClass:"modal-footer"},[i("button",{staticClass:"btn btn-default",attrs:{type:"button","data-dismiss":"modal"}},[t._v("Close")]),t._v(" "),i("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:t.store}},[t._v("\n                        Create\n                    ")])])])])]),t._v(" "),i("div",{staticClass:"modal fade",attrs:{id:"modal-edit-client",tabindex:"-1",role:"dialog"}},[i("div",{staticClass:"modal-dialog"},[i("div",{staticClass:"modal-content"},[t._m(3),t._v(" "),i("div",{staticClass:"modal-body"},[t.editForm.errors.length>0?i("div",{staticClass:"alert alert-danger"},[t._m(4),t._v(" "),i("br"),t._v(" "),i("ul",t._l(t.editForm.errors,function(e){return i("li",[t._v("\n                                "+t._s(e)+"\n                            ")])}))]):t._e(),t._v(" "),i("form",{staticClass:"form-horizontal",attrs:{role:"form"}},[i("div",{staticClass:"form-group"},[i("label",{staticClass:"col-md-3 control-label"},[t._v("Name")]),t._v(" "),i("div",{staticClass:"col-md-7"},[i("input",{directives:[{name:"model",rawName:"v-model",value:t.editForm.name,expression:"editForm.name"}],staticClass:"form-control",attrs:{id:"edit-client-name",type:"text"},domProps:{value:t.editForm.name},on:{keyup:function(e){if(!("button"in e)&&t._k(e.keyCode,"enter",13))return null;t.update(e)},input:function(e){e.target.composing||(t.editForm.name=e.target.value)}}}),t._v(" "),i("span",{staticClass:"help-block"},[t._v("\n                                    Something your users will recognize and trust.\n                                ")])])]),t._v(" "),i("div",{staticClass:"form-group"},[i("label",{staticClass:"col-md-3 control-label"},[t._v("Redirect URL")]),t._v(" "),i("div",{staticClass:"col-md-7"},[i("input",{directives:[{name:"model",rawName:"v-model",value:t.editForm.redirect,expression:"editForm.redirect"}],staticClass:"form-control",attrs:{type:"text",name:"redirect"},domProps:{value:t.editForm.redirect},on:{keyup:function(e){if(!("button"in e)&&t._k(e.keyCode,"enter",13))return null;t.update(e)},input:function(e){e.target.composing||(t.editForm.redirect=e.target.value)}}}),t._v(" "),i("span",{staticClass:"help-block"},[t._v("\n                                    Your application's authorization callback URL.\n                                ")])])])])]),t._v(" "),i("div",{staticClass:"modal-footer"},[i("button",{staticClass:"btn btn-default",attrs:{type:"button","data-dismiss":"modal"}},[t._v("Close")]),t._v(" "),i("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:t.update}},[t._v("\n                        Save Changes\n                    ")])])])])])])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("thead",[i("tr",[i("th",[t._v("Client ID")]),t._v(" "),i("th",[t._v("Name")]),t._v(" "),i("th",[t._v("Secret")]),t._v(" "),i("th"),t._v(" "),i("th")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"modal-header"},[i("button",{staticClass:"close",attrs:{type:"button ","data-dismiss":"modal","aria-hidden":"true"}},[t._v("×")]),t._v(" "),i("h4",{staticClass:"modal-title"},[t._v("\n                        Create Client\n                    ")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[i("strong",[t._v("Whoops!")]),t._v(" Something went wrong!")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"modal-header"},[i("button",{staticClass:"close",attrs:{type:"button ","data-dismiss":"modal","aria-hidden":"true"}},[t._v("×")]),t._v(" "),i("h4",{staticClass:"modal-title"},[t._v("\n                        Edit Client\n                    ")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[i("strong",[t._v("Whoops!")]),t._v(" Something went wrong!")])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement;return(t._self._c||e)("select",{staticStyle:{width:"100%"}},[t._t("default")],2)},staticRenderFns:[]}},function(t,e,i){"use strict";function n(t){this.state=U,this.value=void 0,this.deferred=[];var e=this;try{t(function(t){e.resolve(t)},function(t){e.reject(t)})}catch(t){e.reject(t)}}function r(t,e){t instanceof Promise?this.promise=t:this.promise=new Promise(t.bind(e)),this.context=e}function s(t){}function o(t){}function a(t,e){return K(t,e)}function l(t){return t?t.replace(/^\s*|\s*$/g,""):""}function u(t,e){return t&&void 0===e?t.replace(/\s+$/,""):t&&e?t.replace(new RegExp("["+e+"]+$"),""):t}function c(t){return t?t.toLowerCase():""}function h(t){return t?t.toUpperCase():""}function d(t){return"string"==typeof t}function p(t){return"function"==typeof t}function f(t){return null!==t&&"object"==typeof t}function g(t){return f(t)&&Object.getPrototypeOf(t)==Object.prototype}function m(t){return"undefined"!=typeof Blob&&t instanceof Blob}function v(t){return"undefined"!=typeof FormData&&t instanceof FormData}function _(t,e,i){var n=r.resolve(t);return arguments.length<2?n:n.then(e,i)}function y(t,e,i){return i=i||{},p(i)&&(i=i.call(e)),w(t.bind({$vm:e,$options:i}),t,{$options:i})}function b(t,e){var i,n;if(it(t))for(i=0;i<t.length;i++)e.call(t[i],t[i],i);else if(f(t))for(n in t)G.call(t,n)&&e.call(t[n],t[n],n);return t}function w(t){return J.call(arguments,1).forEach(function(e){k(t,e,!0)}),t}function x(t){return J.call(arguments,1).forEach(function(e){for(var i in e)void 0===t[i]&&(t[i]=e[i])}),t}function C(t){return J.call(arguments,1).forEach(function(e){k(t,e)}),t}function k(t,e,i){for(var n in e)i&&(g(e[n])||it(e[n]))?(g(e[n])&&!g(t[n])&&(t[n]={}),it(e[n])&&!it(t[n])&&(t[n]=[]),k(t[n],e[n],i)):void 0!==e[n]&&(t[n]=e[n])}function T(t,e,i){var n=D(t),r=n.expand(e);return i&&i.push.apply(i,n.vars),r}function D(t){var e=["+","#",".","/",";","?","&"],i=[];return{vars:i,expand:function(n){return t.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g,function(t,r,s){if(r){var o=null,a=[];if(-1!==e.indexOf(r.charAt(0))&&(o=r.charAt(0),r=r.substr(1)),r.split(/,/g).forEach(function(t){var e=/([^:\*]*)(?::(\d+)|(\*))?/.exec(t);a.push.apply(a,S(n,o,e[1],e[2]||e[3])),i.push(e[1])}),o&&"+"!==o){var l=",";return"?"===o?l="&":"#"!==o&&(l=o),(0!==a.length?o:"")+a.join(l)}return a.join(",")}return $(s)})}}}function S(t,e,i,n){var r=t[i],s=[];if(A(r)&&""!==r)if("string"==typeof r||"number"==typeof r||"boolean"==typeof r)r=r.toString(),n&&"*"!==n&&(r=r.substring(0,parseInt(n,10))),s.push(I(e,r,E(e)?i:null));else if("*"===n)Array.isArray(r)?r.filter(A).forEach(function(t){s.push(I(e,t,E(e)?i:null))}):Object.keys(r).forEach(function(t){A(r[t])&&s.push(I(e,r[t],t))});else{var o=[];Array.isArray(r)?r.filter(A).forEach(function(t){o.push(I(e,t))}):Object.keys(r).forEach(function(t){A(r[t])&&(o.push(encodeURIComponent(t)),o.push(I(e,r[t].toString())))}),E(e)?s.push(encodeURIComponent(i)+"="+o.join(",")):0!==o.length&&s.push(o.join(","))}else";"===e?s.push(encodeURIComponent(i)):""!==r||"&"!==e&&"?"!==e?""===r&&s.push(""):s.push(encodeURIComponent(i)+"=");return s}function A(t){return void 0!==t&&null!==t}function E(t){return";"===t||"&"===t||"?"===t}function I(t,e,i){return e="+"===t||"#"===t?$(e):encodeURIComponent(e),i?encodeURIComponent(i)+"="+e:e}function $(t){return t.split(/(%[0-9A-Fa-f]{2})/g).map(function(t){return/%[0-9A-Fa-f]/.test(t)||(t=encodeURI(t)),t}).join("")}function O(t,e){var i,n=this||{},r=t;return d(t)&&(r={url:t,params:e}),r=w({},O.options,n.$options,r),O.transforms.forEach(function(t){d(t)&&(t=O.transform[t]),p(t)&&(i=P(t,i,n.$vm))}),i(r)}function P(t,e,i){return function(n){return t.call(i,n,e)}}function N(t,e,i){var n,r=it(e),s=g(e);b(e,function(e,o){n=f(e)||it(e),i&&(o=i+"["+(s||n?o:"")+"]"),!i&&r?t.add(e.name,e.value):n?N(t,e,o):t.add(o,e)})}function M(t){var e=t.match(/^\[|^\{(?!\{)/),i={"[":/]$/,"{":/}$/};return e&&i[e[0]].test(t)}function j(t,e){e((t.client||(tt?vt:_t))(t))}function H(t,e){return Object.keys(t).reduce(function(t,i){return c(e)===c(i)?i:t},null)}function R(t){if(/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return l(t)}function L(t){return new r(function(e){var i=new FileReader;i.readAsText(t),i.onload=function(){e(i.result)}})}function F(t){return 0===t.type.indexOf("text")||-1!==t.type.indexOf("json")}function z(t){var e=this||{},i=yt(e.$vm);return x(t||{},e.$options,z.options),z.interceptors.forEach(function(t){d(t)&&(t=z.interceptor[t]),p(t)&&i.use(t)}),i(new xt(t)).then(function(t){return t.ok?t:r.reject(t)},function(t){return t instanceof Error&&o(t),r.reject(t)})}function W(t,e,i,n){var r=this||{},s={};return i=nt({},W.actions,i),b(i,function(i,o){i=w({url:t,params:nt({},e)},n,i),s[o]=function(){return(r.$http||z)(q(i,arguments))}}),s}function q(t,e){var i,n=nt({},t),r={};switch(e.length){case 2:r=e[0],i=e[1];break;case 1:/^(POST|PUT|PATCH)$/i.test(n.method)?i=e[0]:r=e[0];break;case 0:break;default:throw"Expected up to 2 arguments [params, body], got "+e.length+" arguments"}return n.body=i,n.params=nt({},n.params,r),n}function B(t){B.installed||(et(t),t.url=O,t.http=z,t.resource=W,t.Promise=r,Object.defineProperties(t.prototype,{$url:{get:function(){return y(t.url,this,this.$options.url)}},$http:{get:function(){return y(t.http,this,this.$options.http)}},$resource:{get:function(){return t.resource.bind(this)}},$promise:{get:function(){var e=this;return function(i){return new t.Promise(i,e)}}}}))}Object.defineProperty(e,"__esModule",{value:!0}),i.d(e,"Url",function(){return O}),i.d(e,"Http",function(){return z}),i.d(e,"Resource",function(){return W});/*!
        + * vue-resource v1.3.3
        + * https://github.com/pagekit/vue-resource
        + * Released under the MIT License.
        + */
        +var U=2;n.reject=function(t){return new n(function(e,i){i(t)})},n.resolve=function(t){return new n(function(e,i){e(t)})},n.all=function(t){return new n(function(e,i){var r=0,s=[];0===t.length&&e(s);for(var o=0;o<t.length;o+=1)n.resolve(t[o]).then(function(i){return function(n){s[i]=n,(r+=1)===t.length&&e(s)}}(o),i)})},n.race=function(t){return new n(function(e,i){for(var r=0;r<t.length;r+=1)n.resolve(t[r]).then(e,i)})};var Y=n.prototype;Y.resolve=function(t){var e=this;if(e.state===U){if(t===e)throw new TypeError("Promise settled with itself.");var i=!1;try{var n=t&&t.then;if(null!==t&&"object"==typeof t&&"function"==typeof n)return void n.call(t,function(t){i||e.resolve(t),i=!0},function(t){i||e.reject(t),i=!0})}catch(t){return void(i||e.reject(t))}e.state=0,e.value=t,e.notify()}},Y.reject=function(t){var e=this;if(e.state===U){if(t===e)throw new TypeError("Promise settled with itself.");e.state=1,e.value=t,e.notify()}},Y.notify=function(){var t=this;a(function(){if(t.state!==U)for(;t.deferred.length;){var e=t.deferred.shift(),i=e[0],n=e[1],r=e[2],s=e[3];try{0===t.state?r("function"==typeof i?i.call(void 0,t.value):t.value):1===t.state&&("function"==typeof n?r(n.call(void 0,t.value)):s(t.value))}catch(t){s(t)}}})},Y.then=function(t,e){var i=this;return new n(function(n,r){i.deferred.push([t,e,n,r]),i.notify()})},Y.catch=function(t){return this.then(void 0,t)},"undefined"==typeof Promise&&(window.Promise=n),r.all=function(t,e){return new r(Promise.all(t),e)},r.resolve=function(t,e){return new r(Promise.resolve(t),e)},r.reject=function(t,e){return new r(Promise.reject(t),e)},r.race=function(t,e){return new r(Promise.race(t),e)};var V=r.prototype;V.bind=function(t){return this.context=t,this},V.then=function(t,e){return t&&t.bind&&this.context&&(t=t.bind(this.context)),e&&e.bind&&this.context&&(e=e.bind(this.context)),new r(this.promise.then(t,e),this.context)},V.catch=function(t){return t&&t.bind&&this.context&&(t=t.bind(this.context)),new r(this.promise.catch(t),this.context)},V.finally=function(t){return this.then(function(e){return t.call(this),e},function(e){return t.call(this),Promise.reject(e)})};var K,X={},G=X.hasOwnProperty,Z=[],J=Z.slice,Q=!1,tt="undefined"!=typeof window,et=function(t){var e=t.config,i=t.nextTick;K=i,Q=e.debug||!e.silent},it=Array.isArray,nt=Object.assign||C,rt=function(t,e){var i=e(t);return d(t.root)&&!/^(https?:)?\//.test(i)&&(i=u(t.root,"/")+"/"+i),i},st=function(t,e){var i=Object.keys(O.options.params),n={},r=e(t);return b(t.params,function(t,e){-1===i.indexOf(e)&&(n[e]=t)}),n=O.params(n),n&&(r+=(-1==r.indexOf("?")?"?":"&")+n),r},ot=function(t){var e=[],i=T(t.url,t.params,e);return e.forEach(function(e){delete t.params[e]}),i};O.options={url:"",root:null,params:{}},O.transform={template:ot,query:st,root:rt},O.transforms=["template","query","root"],O.params=function(t){var e=[],i=encodeURIComponent;return e.add=function(t,e){p(e)&&(e=e()),null===e&&(e=""),this.push(i(t)+"="+i(e))},N(e,t),e.join("&").replace(/%20/g,"+")},O.parse=function(t){var e=document.createElement("a");return document.documentMode&&(e.href=t,t=e.href),e.href=t,{href:e.href,protocol:e.protocol?e.protocol.replace(/:$/,""):"",port:e.port,host:e.host,hostname:e.hostname,pathname:"/"===e.pathname.charAt(0)?e.pathname:"/"+e.pathname,search:e.search?e.search.replace(/^\?/,""):"",hash:e.hash?e.hash.replace(/^#/,""):""}};var at=function(t){return new r(function(e){var i=new XDomainRequest,n=function(n){var r=n.type,s=0;"load"===r?s=200:"error"===r&&(s=500),e(t.respondWith(i.responseText,{status:s}))};t.abort=function(){return i.abort()},i.open(t.method,t.getUrl()),t.timeout&&(i.timeout=t.timeout),i.onload=n,i.onabort=n,i.onerror=n,i.ontimeout=n,i.onprogress=function(){},i.send(t.getBody())})},lt=tt&&"withCredentials"in new XMLHttpRequest,ut=function(t,e){if(tt){var i=O.parse(location.href),n=O.parse(t.getUrl());n.protocol===i.protocol&&n.host===i.host||(t.crossOrigin=!0,t.emulateHTTP=!1,lt||(t.client=at))}e()},ct=function(t,e){v(t.body)?t.headers.delete("Content-Type"):f(t.body)&&t.emulateJSON&&(t.body=O.params(t.body),t.headers.set("Content-Type","application/x-www-form-urlencoded")),e()},ht=function(t,e){var i=t.headers.get("Content-Type")||"";f(t.body)&&0===i.indexOf("application/json")&&(t.body=JSON.stringify(t.body)),e(function(t){return t.bodyText?_(t.text(),function(e){if(i=t.headers.get("Content-Type")||"",0===i.indexOf("application/json")||M(e))try{t.body=JSON.parse(e)}catch(e){t.body=null}else t.body=e;return t}):t})},dt=function(t){return new r(function(e){var i,n,r=t.jsonp||"callback",s=t.jsonpCallback||"_jsonp"+Math.random().toString(36).substr(2),o=null;i=function(i){var r=i.type,a=0;"load"===r&&null!==o?a=200:"error"===r&&(a=500),a&&window[s]&&(delete window[s],document.body.removeChild(n)),e(t.respondWith(o,{status:a}))},window[s]=function(t){o=JSON.stringify(t)},t.abort=function(){i({type:"abort"})},t.params[r]=s,t.timeout&&setTimeout(t.abort,t.timeout),n=document.createElement("script"),n.src=t.getUrl(),n.type="text/javascript",n.async=!0,n.onload=i,n.onerror=i,document.body.appendChild(n)})},pt=function(t,e){"JSONP"==t.method&&(t.client=dt),e()},ft=function(t,e){p(t.before)&&t.before.call(this,t),e()},gt=function(t,e){t.emulateHTTP&&/^(PUT|PATCH|DELETE)$/i.test(t.method)&&(t.headers.set("X-HTTP-Method-Override",t.method),t.method="POST"),e()},mt=function(t,e){b(nt({},z.headers.common,t.crossOrigin?{}:z.headers.custom,z.headers[c(t.method)]),function(e,i){t.headers.has(i)||t.headers.set(i,e)}),e()},vt=function(t){return new r(function(e){var i=new XMLHttpRequest,n=function(n){var r=t.respondWith("response"in i?i.response:i.responseText,{status:1223===i.status?204:i.status,statusText:1223===i.status?"No Content":l(i.statusText)});b(l(i.getAllResponseHeaders()).split("\n"),function(t){r.headers.append(t.slice(0,t.indexOf(":")),t.slice(t.indexOf(":")+1))}),e(r)};t.abort=function(){return i.abort()},t.progress&&("GET"===t.method?i.addEventListener("progress",t.progress):/^(POST|PUT)$/i.test(t.method)&&i.upload.addEventListener("progress",t.progress)),i.open(t.method,t.getUrl(),!0),t.timeout&&(i.timeout=t.timeout),t.responseType&&"responseType"in i&&(i.responseType=t.responseType),(t.withCredentials||t.credentials)&&(i.withCredentials=!0),t.crossOrigin||t.headers.set("X-Requested-With","XMLHttpRequest"),t.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),i.onload=n,i.onabort=n,i.onerror=n,i.ontimeout=n,i.send(t.getBody())})},_t=function(t){var e=i(61);return new r(function(i){var n,r=t.getUrl(),s=t.getBody(),o=t.method,a={};t.headers.forEach(function(t,e){a[e]=t}),e(r,{body:s,method:o,headers:a}).then(n=function(e){var n=t.respondWith(e.body,{status:e.statusCode,statusText:l(e.statusMessage)});b(e.headers,function(t,e){n.headers.set(e,t)}),i(n)},function(t){return n(t.response)})})},yt=function(t){function e(e){return new r(function(r){function a(){i=n.pop(),p(i)?i.call(t,e,l):(s("Invalid interceptor of type "+typeof i+", must be a function"),l())}function l(e){if(p(e))o.unshift(e);else if(f(e))return o.forEach(function(i){e=_(e,function(e){return i.call(t,e)||e})}),void _(e,r);a()}a()},t)}var i,n=[j],o=[];return f(t)||(t=null),e.use=function(t){n.push(t)},e},bt=function(t){var e=this;this.map={},b(t,function(t,i){return e.append(i,t)})};bt.prototype.has=function(t){return null!==H(this.map,t)},bt.prototype.get=function(t){var e=this.map[H(this.map,t)];return e?e.join():null},bt.prototype.getAll=function(t){return this.map[H(this.map,t)]||[]},bt.prototype.set=function(t,e){this.map[R(H(this.map,t)||t)]=[l(e)]},bt.prototype.append=function(t,e){var i=this.map[H(this.map,t)];i?i.push(l(e)):this.set(t,e)},bt.prototype.delete=function(t){delete this.map[H(this.map,t)]},bt.prototype.deleteAll=function(){this.map={}},bt.prototype.forEach=function(t,e){var i=this;b(this.map,function(n,r){b(n,function(n){return t.call(e,n,r,i)})})};var wt=function(t,e){var i=e.url,n=e.headers,r=e.status,s=e.statusText;this.url=i,this.ok=r>=200&&r<300,this.status=r||0,this.statusText=s||"",this.headers=new bt(n),this.body=t,d(t)?this.bodyText=t:m(t)&&(this.bodyBlob=t,F(t)&&(this.bodyText=L(t)))};wt.prototype.blob=function(){return _(this.bodyBlob)},wt.prototype.text=function(){return _(this.bodyText)},wt.prototype.json=function(){return _(this.text(),function(t){return JSON.parse(t)})},Object.defineProperty(wt.prototype,"data",{get:function(){return this.body},set:function(t){this.body=t}});var xt=function(t){this.body=null,this.params={},nt(this,t,{method:h(t.method||"GET")}),this.headers instanceof bt||(this.headers=new bt(this.headers))};xt.prototype.getUrl=function(){return O(this)},xt.prototype.getBody=function(){return this.body},xt.prototype.respondWith=function(t,e){return new wt(t,nt(e||{},{url:this.getUrl()}))};var Ct={Accept:"application/json, text/plain, */*"},kt={"Content-Type":"application/json;charset=utf-8"};z.options={},z.headers={put:kt,post:kt,patch:kt,delete:kt,common:Ct,custom:{}},z.interceptor={before:ft,method:gt,jsonp:pt,json:ht,form:ct,header:mt,cors:ut},z.interceptors=["before","method","jsonp","json","form","header","cors"],["get","delete","head","jsonp"].forEach(function(t){z[t]=function(e,i){return this(nt(i||{},{url:e,method:t}))}}),["post","put","patch"].forEach(function(t){z[t]=function(e,i,n){return this(nt(n||{},{url:e,method:t,body:i}))}}),W.actions={get:{method:"GET"},save:{method:"POST"},query:{method:"GET"},update:{method:"PUT"},remove:{method:"DELETE"},delete:{method:"DELETE"}},"undefined"!=typeof window&&window.Vue&&window.Vue.use(B),e.default=B},function(t,e,i){var n=i(21);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("8f4ff93a",n,!0)},function(t,e,i){var n=i(22);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("7c4ed951",n,!0)},function(t,e,i){var n=i(23);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("717c9dce",n,!0)},function(t,e,i){var n=i(24);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("1dd8eaae",n,!0)},function(t,e,i){var n=i(25);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("26b4c516",n,!0)},function(t,e,i){var n=i(26);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("1789f86f",n,!0)},function(t,e,i){var n=i(27);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("73719aac",n,!0)},function(t,e,i){var n=i(28);"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i(2)("664d54ac",n,!0)},function(t,e){t.exports=function(t,e){for(var i=[],n={},r=0;r<e.length;r++){var s=e[r],o=s[0],a=s[1],l=s[2],u=s[3],c={id:t+":"+r,css:a,media:l,sourceMap:u};n[o]?n[o].parts.push(c):i.push(n[o]={id:o,parts:[c]})}return i}},function(t,e,i){"use strict";(function(e){/*!
        + * Vue.js v2.3.3
        + * (c) 2014-2017 Evan You
        + * Released under the MIT License.
        + */
        +function i(t){return void 0===t||null===t}function n(t){return void 0!==t&&null!==t}function r(t){return!0===t}function s(t){return!1===t}function o(t){return"string"==typeof t||"number"==typeof t}function a(t){return null!==t&&"object"==typeof t}function l(t){return"[object Object]"===$r.call(t)}function u(t){return"[object RegExp]"===$r.call(t)}function c(t){return null==t?"":"object"==typeof t?JSON.stringify(t,null,2):String(t)}function h(t){var e=parseFloat(t);return isNaN(e)?t:e}function d(t,e){for(var i=Object.create(null),n=t.split(","),r=0;r<n.length;r++)i[n[r]]=!0;return e?function(t){return i[t.toLowerCase()]}:function(t){return i[t]}}function p(t,e){if(t.length){var i=t.indexOf(e);if(i>-1)return t.splice(i,1)}}function f(t,e){return Pr.call(t,e)}function g(t){var e=Object.create(null);return function(i){return e[i]||(e[i]=t(i))}}function m(t,e){function i(i){var n=arguments.length;return n?n>1?t.apply(e,arguments):t.call(e,i):t.call(e)}return i._length=t.length,i}function v(t,e){e=e||0;for(var i=t.length-e,n=new Array(i);i--;)n[i]=t[i+e];return n}function _(t,e){for(var i in e)t[i]=e[i];return t}function y(t){for(var e={},i=0;i<t.length;i++)t[i]&&_(e,t[i]);return e}function b(){}function w(t,e){var i=a(t),n=a(e);if(!i||!n)return!i&&!n&&String(t)===String(e);try{return JSON.stringify(t)===JSON.stringify(e)}catch(i){return t===e}}function x(t,e){for(var i=0;i<t.length;i++)if(w(t[i],e))return i;return-1}function C(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments))}}function k(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}function T(t,e,i,n){Object.defineProperty(t,e,{value:i,enumerable:!!n,writable:!0,configurable:!0})}function D(t){if(!Yr.test(t)){var e=t.split(".");return function(t){for(var i=0;i<e.length;i++){if(!t)return;t=t[e[i]]}return t}}}function S(t,e,i){if(Br.errorHandler)Br.errorHandler.call(null,t,e,i);else if(!Xr||"undefined"==typeof console)throw t}function A(t){return"function"==typeof t&&/native code/.test(t.toString())}function E(t){ds.target&&ps.push(ds.target),ds.target=t}function I(){ds.target=ps.pop()}function $(t,e){t.__proto__=e}function O(t,e,i){for(var n=0,r=i.length;n<r;n++){var s=i[n];T(t,s,e[s])}}function P(t,e){if(a(t)){var i;return f(t,"__ob__")&&t.__ob__ instanceof _s?i=t.__ob__:vs.shouldConvert&&!as()&&(Array.isArray(t)||l(t))&&Object.isExtensible(t)&&!t._isVue&&(i=new _s(t)),e&&i&&i.vmCount++,i}}function N(t,e,i,n){var r=new ds,s=Object.getOwnPropertyDescriptor(t,e);if(!s||!1!==s.configurable){var o=s&&s.get,a=s&&s.set,l=P(i);Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){var e=o?o.call(t):i;return ds.target&&(r.depend(),l&&l.dep.depend(),Array.isArray(e)&&H(e)),e},set:function(e){var n=o?o.call(t):i;e===n||e!==e&&n!==n||(a?a.call(t,e):i=e,l=P(e),r.notify())}})}}function M(t,e,i){if(Array.isArray(t)&&"number"==typeof e)return t.length=Math.max(t.length,e),t.splice(e,1,i),i;if(f(t,e))return t[e]=i,i;var n=t.__ob__;return t._isVue||n&&n.vmCount?i:n?(N(n.value,e,i),n.dep.notify(),i):(t[e]=i,i)}function j(t,e){if(Array.isArray(t)&&"number"==typeof e)return void t.splice(e,1);var i=t.__ob__;t._isVue||i&&i.vmCount||f(t,e)&&(delete t[e],i&&i.dep.notify())}function H(t){for(var e=void 0,i=0,n=t.length;i<n;i++)e=t[i],e&&e.__ob__&&e.__ob__.dep.depend(),Array.isArray(e)&&H(e)}function R(t,e){if(!e)return t;for(var i,n,r,s=Object.keys(e),o=0;o<s.length;o++)i=s[o],n=t[i],r=e[i],f(t,i)?l(n)&&l(r)&&R(n,r):M(t,i,r);return t}function L(t,e){return e?t?t.concat(e):Array.isArray(e)?e:[e]:t}function F(t,e){var i=Object.create(t||null);return e?_(i,e):i}function z(t){var e=t.props;if(e){var i,n,r,s={};if(Array.isArray(e))for(i=e.length;i--;)"string"==typeof(n=e[i])&&(r=Mr(n),s[r]={type:null});else if(l(e))for(var o in e)n=e[o],r=Mr(o),s[r]=l(n)?n:{type:n};t.props=s}}function W(t){var e=t.directives;if(e)for(var i in e){var n=e[i];"function"==typeof n&&(e[i]={bind:n,update:n})}}function q(t,e,i){function n(n){var r=ys[n]||bs;l[n]=r(t[n],e[n],i,n)}"function"==typeof e&&(e=e.options),z(e),W(e);var r=e.extends;if(r&&(t=q(t,r,i)),e.mixins)for(var s=0,o=e.mixins.length;s<o;s++)t=q(t,e.mixins[s],i);var a,l={};for(a in t)n(a);for(a in e)f(t,a)||n(a);return l}function B(t,e,i,n){if("string"==typeof i){var r=t[e];if(f(r,i))return r[i];var s=Mr(i);if(f(r,s))return r[s];var o=jr(s);if(f(r,o))return r[o];return r[i]||r[s]||r[o]}}function U(t,e,i,n){var r=e[t],s=!f(i,t),o=i[t];if(K(Boolean,r.type)&&(s&&!f(r,"default")?o=!1:K(String,r.type)||""!==o&&o!==Rr(t)||(o=!0)),void 0===o){o=Y(n,r,t);var a=vs.shouldConvert;vs.shouldConvert=!0,P(o),vs.shouldConvert=a}return o}function Y(t,e,i){if(f(e,"default")){var n=e.default;return t&&t.$options.propsData&&void 0===t.$options.propsData[i]&&void 0!==t._props[i]?t._props[i]:"function"==typeof n&&"Function"!==V(e.type)?n.call(t):n}}function V(t){var e=t&&t.toString().match(/^\s*function (\w+)/);return e?e[1]:""}function K(t,e){if(!Array.isArray(e))return V(e)===V(t);for(var i=0,n=e.length;i<n;i++)if(V(e[i])===V(t))return!0;return!1}function X(t){return new ws(void 0,void 0,void 0,String(t))}function G(t){var e=new ws(t.tag,t.data,t.children,t.text,t.elm,t.context,t.componentOptions);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.isCloned=!0,e}function Z(t){for(var e=t.length,i=new Array(e),n=0;n<e;n++)i[n]=G(t[n]);return i}function J(t){function e(){var t=arguments,i=e.fns;if(!Array.isArray(i))return i.apply(null,arguments);for(var n=0;n<i.length;n++)i[n].apply(null,t)}return e.fns=t,e}function Q(t,e,n,r,s){var o,a,l,u;for(o in t)a=t[o],l=e[o],u=Ts(o),i(a)||(i(l)?(i(a.fns)&&(a=t[o]=J(a)),n(u.name,a,u.once,u.capture,u.passive)):a!==l&&(l.fns=a,t[o]=l));for(o in e)i(t[o])&&(u=Ts(o),r(u.name,e[o],u.capture))}function tt(t,e,s){function o(){s.apply(this,arguments),p(a.fns,o)}var a,l=t[e];i(l)?a=J([o]):n(l.fns)&&r(l.merged)?(a=l,a.fns.push(o)):a=J([l,o]),a.merged=!0,t[e]=a}function et(t,e,r){var s=e.options.props;if(!i(s)){var o={},a=t.attrs,l=t.props;if(n(a)||n(l))for(var u in s){var c=Rr(u);it(o,l,u,c,!0)||it(o,a,u,c,!1)}return o}}function it(t,e,i,r,s){if(n(e)){if(f(e,i))return t[i]=e[i],s||delete e[i],!0;if(f(e,r))return t[i]=e[r],s||delete e[r],!0}return!1}function nt(t){for(var e=0;e<t.length;e++)if(Array.isArray(t[e]))return Array.prototype.concat.apply([],t);return t}function rt(t){return o(t)?[X(t)]:Array.isArray(t)?ot(t):void 0}function st(t){return n(t)&&n(t.text)&&s(t.isComment)}function ot(t,e){var s,a,l,u=[];for(s=0;s<t.length;s++)a=t[s],i(a)||"boolean"==typeof a||(l=u[u.length-1],Array.isArray(a)?u.push.apply(u,ot(a,(e||"")+"_"+s)):o(a)?st(l)?l.text+=String(a):""!==a&&u.push(X(a)):st(a)&&st(l)?u[u.length-1]=X(l.text+a.text):(r(t._isVList)&&n(a.tag)&&i(a.key)&&n(e)&&(a.key="__vlist"+e+"_"+s+"__"),u.push(a)));return u}function at(t,e){return a(t)?e.extend(t):t}function lt(t,e,s){if(r(t.error)&&n(t.errorComp))return t.errorComp;if(n(t.resolved))return t.resolved;if(r(t.loading)&&n(t.loadingComp))return t.loadingComp;if(!n(t.contexts)){var o=t.contexts=[s],l=!0,u=function(){for(var t=0,e=o.length;t<e;t++)o[t].$forceUpdate()},c=C(function(i){t.resolved=at(i,e),l||u()}),h=C(function(e){n(t.errorComp)&&(t.error=!0,u())}),d=t(c,h);return a(d)&&("function"==typeof d.then?i(t.resolved)&&d.then(c,h):n(d.component)&&"function"==typeof d.component.then&&(d.component.then(c,h),n(d.error)&&(t.errorComp=at(d.error,e)),n(d.loading)&&(t.loadingComp=at(d.loading,e),0===d.delay?t.loading=!0:setTimeout(function(){i(t.resolved)&&i(t.error)&&(t.loading=!0,u())},d.delay||200)),n(d.timeout)&&setTimeout(function(){i(t.resolved)&&h(null)},d.timeout))),l=!1,t.loading?t.loadingComp:t.resolved}t.contexts.push(s)}function ut(t){if(Array.isArray(t))for(var e=0;e<t.length;e++){var i=t[e];if(n(i)&&n(i.componentOptions))return i}}function ct(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&pt(t,e)}function ht(t,e,i){i?Cs.$once(t,e):Cs.$on(t,e)}function dt(t,e){Cs.$off(t,e)}function pt(t,e,i){Cs=t,Q(e,i||{},ht,dt,t)}function ft(t,e){var i={};if(!t)return i;for(var n=[],r=0,s=t.length;r<s;r++){var o=t[r];if(o.context!==e&&o.functionalContext!==e||!o.data||null==o.data.slot)n.push(o);else{var a=o.data.slot,l=i[a]||(i[a]=[]);"template"===o.tag?l.push.apply(l,o.children):l.push(o)}}return n.every(gt)||(i.default=n),i}function gt(t){return t.isComment||" "===t.text}function mt(t,e){e=e||{};for(var i=0;i<t.length;i++)Array.isArray(t[i])?mt(t[i],e):e[t[i].key]=t[i].fn;return e}function vt(t){var e=t.$options,i=e.parent;if(i&&!e.abstract){for(;i.$options.abstract&&i.$parent;)i=i.$parent;i.$children.push(t)}t.$parent=i,t.$root=i?i.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}function _t(t,e,i){t.$el=e,t.$options.render||(t.$options.render=ks),Ct(t,"beforeMount");var n;return n=function(){t._update(t._render(),i)},t._watcher=new Ns(t,n,b),i=!1,null==t.$vnode&&(t._isMounted=!0,Ct(t,"mounted")),t}function yt(t,e,i,n,r){var s=!!(r||t.$options._renderChildren||n.data.scopedSlots||t.$scopedSlots!==Ur);if(t.$options._parentVnode=n,t.$vnode=n,t._vnode&&(t._vnode.parent=n),t.$options._renderChildren=r,e&&t.$options.props){vs.shouldConvert=!1;for(var o=t._props,a=t.$options._propKeys||[],l=0;l<a.length;l++){var u=a[l];o[u]=U(u,t.$options.props,e,t)}vs.shouldConvert=!0,t.$options.propsData=e}if(i){var c=t.$options._parentListeners;t.$options._parentListeners=i,pt(t,i,c)}s&&(t.$slots=ft(r,n.context),t.$forceUpdate())}function bt(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}function wt(t,e){if(e){if(t._directInactive=!1,bt(t))return}else if(t._directInactive)return;if(t._inactive||null===t._inactive){t._inactive=!1;for(var i=0;i<t.$children.length;i++)wt(t.$children[i]);Ct(t,"activated")}}function xt(t,e){if(!(e&&(t._directInactive=!0,bt(t))||t._inactive)){t._inactive=!0;for(var i=0;i<t.$children.length;i++)xt(t.$children[i]);Ct(t,"deactivated")}}function Ct(t,e){var i=t.$options[e];if(i)for(var n=0,r=i.length;n<r;n++)try{i[n].call(t)}catch(i){S(i,t,e+" hook")}t._hasHookEvent&&t.$emit("hook:"+e)}function kt(){Os=Ss.length=As.length=0,Es={},Is=$s=!1}function Tt(){$s=!0;var t,e;for(Ss.sort(function(t,e){return t.id-e.id}),Os=0;Os<Ss.length;Os++)t=Ss[Os],e=t.id,Es[e]=null,t.run();var i=As.slice(),n=Ss.slice();kt(),At(i),Dt(n),ls&&Br.devtools&&ls.emit("flush")}function Dt(t){for(var e=t.length;e--;){var i=t[e],n=i.vm;n._watcher===i&&n._isMounted&&Ct(n,"updated")}}function St(t){t._inactive=!1,As.push(t)}function At(t){for(var e=0;e<t.length;e++)t[e]._inactive=!0,wt(t[e],!0)}function Et(t){var e=t.id;if(null==Es[e]){if(Es[e]=!0,$s){for(var i=Ss.length-1;i>Os&&Ss[i].id>t.id;)i--;Ss.splice(i+1,0,t)}else Ss.push(t);Is||(Is=!0,cs(Tt))}}function It(t){Ms.clear(),$t(t,Ms)}function $t(t,e){var i,n,r=Array.isArray(t);if((r||a(t))&&Object.isExtensible(t)){if(t.__ob__){var s=t.__ob__.dep.id;if(e.has(s))return;e.add(s)}if(r)for(i=t.length;i--;)$t(t[i],e);else for(n=Object.keys(t),i=n.length;i--;)$t(t[n[i]],e)}}function Ot(t,e,i){js.get=function(){return this[e][i]},js.set=function(t){this[e][i]=t},Object.defineProperty(t,i,js)}function Pt(t){t._watchers=[];var e=t.$options;e.props&&Nt(t,e.props),e.methods&&Ft(t,e.methods),e.data?Mt(t):P(t._data={},!0),e.computed&&Ht(t,e.computed),e.watch&&zt(t,e.watch)}function Nt(t,e){var i=t.$options.propsData||{},n=t._props={},r=t.$options._propKeys=[],s=!t.$parent;vs.shouldConvert=s;for(var o in e)!function(s){r.push(s);var o=U(s,e,i,t);N(n,s,o),s in t||Ot(t,"_props",s)}(o);vs.shouldConvert=!0}function Mt(t){var e=t.$options.data;e=t._data="function"==typeof e?jt(e,t):e||{},l(e)||(e={});for(var i=Object.keys(e),n=t.$options.props,r=i.length;r--;)n&&f(n,i[r])||k(i[r])||Ot(t,"_data",i[r]);P(e,!0)}function jt(t,e){try{return t.call(e)}catch(t){return S(t,e,"data()"),{}}}function Ht(t,e){var i=t._computedWatchers=Object.create(null);for(var n in e){var r=e[n],s="function"==typeof r?r:r.get;i[n]=new Ns(t,s,b,Hs),n in t||Rt(t,n,r)}}function Rt(t,e,i){"function"==typeof i?(js.get=Lt(e),js.set=b):(js.get=i.get?!1!==i.cache?Lt(e):i.get:b,js.set=i.set?i.set:b),Object.defineProperty(t,e,js)}function Lt(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),ds.target&&e.depend(),e.value}}function Ft(t,e){t.$options.props;for(var i in e)t[i]=null==e[i]?b:m(e[i],t)}function zt(t,e){for(var i in e){var n=e[i];if(Array.isArray(n))for(var r=0;r<n.length;r++)Wt(t,i,n[r]);else Wt(t,i,n)}}function Wt(t,e,i){var n;l(i)&&(n=i,i=i.handler),"string"==typeof i&&(i=t[i]),t.$watch(e,i,n)}function qt(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}function Bt(t){var e=Ut(t.$options.inject,t);e&&Object.keys(e).forEach(function(i){N(t,i,e[i])})}function Ut(t,e){if(t){for(var i=Array.isArray(t),n=Object.create(null),r=i?t:us?Reflect.ownKeys(t):Object.keys(t),s=0;s<r.length;s++)for(var o=r[s],a=i?o:t[o],l=e;l;){if(l._provided&&a in l._provided){n[o]=l._provided[a];break}l=l.$parent}return n}}function Yt(t,e,i,r,s){var o={},a=t.options.props;if(n(a))for(var l in a)o[l]=U(l,a,e||{});else n(i.attrs)&&Vt(o,i.attrs),n(i.props)&&Vt(o,i.props);var u=Object.create(r),c=function(t,e,i,n){return Qt(u,t,e,i,n,!0)},h=t.options.render.call(null,c,{data:i,props:o,children:s,parent:r,listeners:i.on||{},injections:Ut(t.options.inject,r),slots:function(){return ft(s,r)}});return h instanceof ws&&(h.functionalContext=r,h.functionalOptions=t.options,i.slot&&((h.data||(h.data={})).slot=i.slot)),h}function Vt(t,e){for(var i in e)t[Mr(i)]=e[i]}function Kt(t,e,s,o,l){if(!i(t)){var u=s.$options._base;if(a(t)&&(t=u.extend(t)),"function"==typeof t&&(!i(t.cid)||void 0!==(t=lt(t,u,s)))){pe(t),e=e||{},n(e.model)&&Jt(t.options,e);var c=et(e,t,l);if(r(t.options.functional))return Yt(t,c,e,s,o);var h=e.on;e.on=e.nativeOn,r(t.options.abstract)&&(e={}),Gt(e);var d=t.options.name||l;return new ws("vue-component-"+t.cid+(d?"-"+d:""),e,void 0,void 0,void 0,s,{Ctor:t,propsData:c,listeners:h,tag:l,children:o})}}}function Xt(t,e,i,r){var s=t.componentOptions,o={_isComponent:!0,parent:e,propsData:s.propsData,_componentTag:s.tag,_parentVnode:t,_parentListeners:s.listeners,_renderChildren:s.children,_parentElm:i||null,_refElm:r||null},a=t.data.inlineTemplate;return n(a)&&(o.render=a.render,o.staticRenderFns=a.staticRenderFns),new s.Ctor(o)}function Gt(t){t.hook||(t.hook={});for(var e=0;e<Ls.length;e++){var i=Ls[e],n=t.hook[i],r=Rs[i];t.hook[i]=n?Zt(r,n):r}}function Zt(t,e){return function(i,n,r,s){t(i,n,r,s),e(i,n,r,s)}}function Jt(t,e){var i=t.model&&t.model.prop||"value",r=t.model&&t.model.event||"input";(e.props||(e.props={}))[i]=e.model.value;var s=e.on||(e.on={});n(s[r])?s[r]=[e.model.callback].concat(s[r]):s[r]=e.model.callback}function Qt(t,e,i,n,s,a){return(Array.isArray(i)||o(i))&&(s=n,n=i,i=void 0),r(a)&&(s=zs),te(t,e,i,n,s)}function te(t,e,i,r,s){if(n(i)&&n(i.__ob__))return ks();if(!e)return ks();Array.isArray(r)&&"function"==typeof r[0]&&(i=i||{},i.scopedSlots={default:r[0]},r.length=0),s===zs?r=rt(r):s===Fs&&(r=nt(r));var o,a;if("string"==typeof e){var l;a=Br.getTagNamespace(e),o=Br.isReservedTag(e)?new ws(Br.parsePlatformTagName(e),i,r,void 0,void 0,t):n(l=B(t.$options,"components",e))?Kt(l,i,t,r,e):new ws(e,i,r,void 0,void 0,t)}else o=Kt(e,i,t,r);return n(o)?(a&&ee(o,a),o):ks()}function ee(t,e){if(t.ns=e,"foreignObject"!==t.tag&&n(t.children))for(var r=0,s=t.children.length;r<s;r++){var o=t.children[r];n(o.tag)&&i(o.ns)&&ee(o,e)}}function ie(t,e){var i,r,s,o,l;if(Array.isArray(t)||"string"==typeof t)for(i=new Array(t.length),r=0,s=t.length;r<s;r++)i[r]=e(t[r],r);else if("number"==typeof t)for(i=new Array(t),r=0;r<t;r++)i[r]=e(r+1,r);else if(a(t))for(o=Object.keys(t),i=new Array(o.length),r=0,s=o.length;r<s;r++)l=o[r],i[r]=e(t[l],l,r);return n(i)&&(i._isVList=!0),i}function ne(t,e,i,n){var r=this.$scopedSlots[t];if(r)return i=i||{},n&&_(i,n),r(i)||e;var s=this.$slots[t];return s||e}function re(t){return B(this.$options,"filters",t,!0)||Fr}function se(t,e,i){var n=Br.keyCodes[e]||i;return Array.isArray(n)?-1===n.indexOf(t):n!==t}function oe(t,e,i,n){if(i)if(a(i)){Array.isArray(i)&&(i=y(i));var r;for(var s in i){if("class"===s||"style"===s)r=t;else{var o=t.attrs&&t.attrs.type;r=n||Br.mustUseProp(e,o,s)?t.domProps||(t.domProps={}):t.attrs||(t.attrs={})}s in r||(r[s]=i[s])}}else;return t}function ae(t,e){var i=this._staticTrees[t];return i&&!e?Array.isArray(i)?Z(i):G(i):(i=this._staticTrees[t]=this.$options.staticRenderFns[t].call(this._renderProxy),ue(i,"__static__"+t,!1),i)}function le(t,e,i){return ue(t,"__once__"+e+(i?"_"+i:""),!0),t}function ue(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)t[n]&&"string"!=typeof t[n]&&ce(t[n],e+"_"+n,i);else ce(t,e,i)}function ce(t,e,i){t.isStatic=!0,t.key=e,t.isOnce=i}function he(t){t._vnode=null,t._staticTrees=null;var e=t.$vnode=t.$options._parentVnode,i=e&&e.context;t.$slots=ft(t.$options._renderChildren,i),t.$scopedSlots=Ur,t._c=function(e,i,n,r){return Qt(t,e,i,n,r,!1)},t.$createElement=function(e,i,n,r){return Qt(t,e,i,n,r,!0)}}function de(t,e){var i=t.$options=Object.create(t.constructor.options);i.parent=e.parent,i.propsData=e.propsData,i._parentVnode=e._parentVnode,i._parentListeners=e._parentListeners,i._renderChildren=e._renderChildren,i._componentTag=e._componentTag,i._parentElm=e._parentElm,i._refElm=e._refElm,e.render&&(i.render=e.render,i.staticRenderFns=e.staticRenderFns)}function pe(t){var e=t.options;if(t.super){var i=pe(t.super);if(i!==t.superOptions){t.superOptions=i;var n=fe(t);n&&_(t.extendOptions,n),e=t.options=q(i,t.extendOptions),e.name&&(e.components[e.name]=t)}}return e}function fe(t){var e,i=t.options,n=t.extendOptions,r=t.sealedOptions;for(var s in i)i[s]!==r[s]&&(e||(e={}),e[s]=ge(i[s],n[s],r[s]));return e}function ge(t,e,i){if(Array.isArray(t)){var n=[];i=Array.isArray(i)?i:[i],e=Array.isArray(e)?e:[e];for(var r=0;r<t.length;r++)(e.indexOf(t[r])>=0||i.indexOf(t[r])<0)&&n.push(t[r]);return n}return t}function me(t){this._init(t)}function ve(t){t.use=function(t){if(t.installed)return this;var e=v(arguments,1);return e.unshift(this),"function"==typeof t.install?t.install.apply(t,e):"function"==typeof t&&t.apply(null,e),t.installed=!0,this}}function _e(t){t.mixin=function(t){return this.options=q(this.options,t),this}}function ye(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var i=this,n=i.cid,r=t._Ctor||(t._Ctor={});if(r[n])return r[n];var s=t.name||i.options.name,o=function(t){this._init(t)};return o.prototype=Object.create(i.prototype),o.prototype.constructor=o,o.cid=e++,o.options=q(i.options,t),o.super=i,o.options.props&&be(o),o.options.computed&&we(o),o.extend=i.extend,o.mixin=i.mixin,o.use=i.use,Wr.forEach(function(t){o[t]=i[t]}),s&&(o.options.components[s]=o),o.superOptions=i.options,o.extendOptions=t,o.sealedOptions=_({},o.options),r[n]=o,o}}function be(t){var e=t.options.props;for(var i in e)Ot(t.prototype,"_props",i)}function we(t){var e=t.options.computed;for(var i in e)Rt(t.prototype,i,e[i])}function xe(t){Wr.forEach(function(e){t[e]=function(t,i){return i?("component"===e&&l(i)&&(i.name=i.name||t,i=this.options._base.extend(i)),"directive"===e&&"function"==typeof i&&(i={bind:i,update:i}),this.options[e+"s"][t]=i,i):this.options[e+"s"][t]}})}function Ce(t){return t&&(t.Ctor.options.name||t.tag)}function ke(t,e){return"string"==typeof t?t.split(",").indexOf(e)>-1:!!u(t)&&t.test(e)}function Te(t,e,i){for(var n in t){var r=t[n];if(r){var s=Ce(r.componentOptions);s&&!i(s)&&(r!==e&&De(r),t[n]=null)}}}function De(t){t&&t.componentInstance.$destroy()}function Se(t){for(var e=t.data,i=t,r=t;n(r.componentInstance);)r=r.componentInstance._vnode,r.data&&(e=Ae(r.data,e));for(;n(i=i.parent);)i.data&&(e=Ae(e,i.data));return Ee(e)}function Ae(t,e){return{staticClass:Ie(t.staticClass,e.staticClass),class:n(t.class)?[t.class,e.class]:e.class}}function Ee(t){var e=t.class,i=t.staticClass;return n(i)||n(e)?Ie(i,$e(e)):""}function Ie(t,e){return t?e?t+" "+e:t:e||""}function $e(t){if(i(t))return"";if("string"==typeof t)return t;var e="";if(Array.isArray(t)){for(var r,s=0,o=t.length;s<o;s++)n(t[s])&&n(r=$e(t[s]))&&""!==r&&(e+=r+" ");return e.slice(0,-1)}if(a(t)){for(var l in t)t[l]&&(e+=l+" ");return e.slice(0,-1)}return e}function Oe(t){return po(t)?"svg":"math"===t?"math":void 0}function Pe(t){if(!Xr)return!0;if(go(t))return!1;if(t=t.toLowerCase(),null!=mo[t])return mo[t];var e=document.createElement(t);return t.indexOf("-")>-1?mo[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:mo[t]=/HTMLUnknownElement/.test(e.toString())}function Ne(t){if("string"==typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}function Me(t,e){var i=document.createElement(t);return"select"!==t?i:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&i.setAttribute("multiple","multiple"),i)}function je(t,e){return document.createElementNS(co[t],e)}function He(t){return document.createTextNode(t)}function Re(t){return document.createComment(t)}function Le(t,e,i){t.insertBefore(e,i)}function Fe(t,e){t.removeChild(e)}function ze(t,e){t.appendChild(e)}function We(t){return t.parentNode}function qe(t){return t.nextSibling}function Be(t){return t.tagName}function Ue(t,e){t.textContent=e}function Ye(t,e,i){t.setAttribute(e,i)}function Ve(t,e){var i=t.data.ref;if(i){var n=t.context,r=t.componentInstance||t.elm,s=n.$refs;e?Array.isArray(s[i])?p(s[i],r):s[i]===r&&(s[i]=void 0):t.data.refInFor?Array.isArray(s[i])&&s[i].indexOf(r)<0?s[i].push(r):s[i]=[r]:s[i]=r}}function Ke(t,e){return t.key===e.key&&t.tag===e.tag&&t.isComment===e.isComment&&n(t.data)===n(e.data)&&Xe(t,e)}function Xe(t,e){if("input"!==t.tag)return!0;var i;return(n(i=t.data)&&n(i=i.attrs)&&i.type)===(n(i=e.data)&&n(i=i.attrs)&&i.type)}function Ge(t,e,i){var r,s,o={};for(r=e;r<=i;++r)s=t[r].key,n(s)&&(o[s]=r);return o}function Ze(t,e){(t.data.directives||e.data.directives)&&Je(t,e)}function Je(t,e){var i,n,r,s=t===yo,o=e===yo,a=Qe(t.data.directives,t.context),l=Qe(e.data.directives,e.context),u=[],c=[];for(i in l)n=a[i],r=l[i],n?(r.oldValue=n.value,ei(r,"update",e,t),r.def&&r.def.componentUpdated&&c.push(r)):(ei(r,"bind",e,t),r.def&&r.def.inserted&&u.push(r));if(u.length){var h=function(){for(var i=0;i<u.length;i++)ei(u[i],"inserted",e,t)};s?tt(e.data.hook||(e.data.hook={}),"insert",h):h()}if(c.length&&tt(e.data.hook||(e.data.hook={}),"postpatch",function(){for(var i=0;i<c.length;i++)ei(c[i],"componentUpdated",e,t)}),!s)for(i in a)l[i]||ei(a[i],"unbind",t,t,o)}function Qe(t,e){var i=Object.create(null);if(!t)return i;var n,r;for(n=0;n<t.length;n++)r=t[n],r.modifiers||(r.modifiers=xo),i[ti(r)]=r,r.def=B(e.$options,"directives",r.name,!0);return i}function ti(t){return t.rawName||t.name+"."+Object.keys(t.modifiers||{}).join(".")}function ei(t,e,i,n,r){var s=t.def&&t.def[e];if(s)try{s(i.elm,t,i,n,r)}catch(n){S(n,i.context,"directive "+t.name+" "+e+" hook")}}function ii(t,e){if(!i(t.data.attrs)||!i(e.data.attrs)){var r,s,o=e.elm,a=t.data.attrs||{},l=e.data.attrs||{};n(l.__ob__)&&(l=e.data.attrs=_({},l));for(r in l)s=l[r],a[r]!==s&&ni(o,r,s);Jr&&l.value!==a.value&&ni(o,"value",l.value);for(r in a)i(l[r])&&(ao(r)?o.removeAttributeNS(oo,lo(r)):ro(r)||o.removeAttribute(r))}}function ni(t,e,i){so(e)?uo(i)?t.removeAttribute(e):t.setAttribute(e,e):ro(e)?t.setAttribute(e,uo(i)||"false"===i?"false":"true"):ao(e)?uo(i)?t.removeAttributeNS(oo,lo(e)):t.setAttributeNS(oo,e,i):uo(i)?t.removeAttribute(e):t.setAttribute(e,i)}function ri(t,e){var r=e.elm,s=e.data,o=t.data;if(!(i(s.staticClass)&&i(s.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var a=Se(e),l=r._transitionClasses;n(l)&&(a=Ie(a,$e(l))),a!==r._prevClass&&(r.setAttribute("class",a),r._prevClass=a)}}function si(t){function e(){(o||(o=[])).push(t.slice(f,r).trim()),f=r+1}var i,n,r,s,o,a=!1,l=!1,u=!1,c=!1,h=0,d=0,p=0,f=0;for(r=0;r<t.length;r++)if(n=i,i=t.charCodeAt(r),a)39===i&&92!==n&&(a=!1);else if(l)34===i&&92!==n&&(l=!1);else if(u)96===i&&92!==n&&(u=!1);else if(c)47===i&&92!==n&&(c=!1);else if(124!==i||124===t.charCodeAt(r+1)||124===t.charCodeAt(r-1)||h||d||p){switch(i){case 34:l=!0;break;case 39:a=!0;break;case 96:u=!0;break;case 40:p++;break;case 41:p--;break;case 91:d++;break;case 93:d--;break;case 123:h++;break;case 125:h--}if(47===i){for(var g=r-1,m=void 0;g>=0&&" "===(m=t.charAt(g));g--);m&&Do.test(m)||(c=!0)}}else void 0===s?(f=r+1,s=t.slice(0,r).trim()):e();if(void 0===s?s=t.slice(0,r).trim():0!==f&&e(),o)for(r=0;r<o.length;r++)s=oi(s,o[r]);return s}function oi(t,e){var i=e.indexOf("(");return i<0?'_f("'+e+'")('+t+")":'_f("'+e.slice(0,i)+'")('+t+","+e.slice(i+1)}function ai(t){}function li(t,e){return t?t.map(function(t){return t[e]}).filter(function(t){return t}):[]}function ui(t,e,i){(t.props||(t.props=[])).push({name:e,value:i})}function ci(t,e,i){(t.attrs||(t.attrs=[])).push({name:e,value:i})}function hi(t,e,i,n,r,s){(t.directives||(t.directives=[])).push({name:e,rawName:i,value:n,arg:r,modifiers:s})}function di(t,e,i,n,r,s){n&&n.capture&&(delete n.capture,e="!"+e),n&&n.once&&(delete n.once,e="~"+e),n&&n.passive&&(delete n.passive,e="&"+e);var o;n&&n.native?(delete n.native,o=t.nativeEvents||(t.nativeEvents={})):o=t.events||(t.events={});var a={value:i,modifiers:n},l=o[e];Array.isArray(l)?r?l.unshift(a):l.push(a):o[e]=l?r?[a,l]:[l,a]:a}function pi(t,e,i){var n=fi(t,":"+e)||fi(t,"v-bind:"+e);if(null!=n)return si(n);if(!1!==i){var r=fi(t,e);if(null!=r)return JSON.stringify(r)}}function fi(t,e){var i;if(null!=(i=t.attrsMap[e]))for(var n=t.attrsList,r=0,s=n.length;r<s;r++)if(n[r].name===e){n.splice(r,1);break}return i}function gi(t,e,i){var n=i||{},r=n.number,s=n.trim,o="$$v";s&&(o="(typeof $$v === 'string'? $$v.trim(): $$v)"),r&&(o="_n("+o+")");var a=mi(e,o);t.model={value:"("+e+")",expression:'"'+e+'"',callback:"function ($$v) {"+a+"}"}}function mi(t,e){var i=vi(t);return null===i.idx?t+"="+e:"var $$exp = "+i.exp+", $$idx = "+i.idx+";if (!Array.isArray($$exp)){"+t+"="+e+"}else{$$exp.splice($$idx, 1, "+e+")}"}function vi(t){if(Vs=t,Ys=Vs.length,Xs=Gs=Zs=0,t.indexOf("[")<0||t.lastIndexOf("]")<Ys-1)return{exp:t,idx:null};for(;!yi();)Ks=_i(),bi(Ks)?xi(Ks):91===Ks&&wi(Ks);return{exp:t.substring(0,Gs),idx:t.substring(Gs+1,Zs)}}function _i(){return Vs.charCodeAt(++Xs)}function yi(){return Xs>=Ys}function bi(t){return 34===t||39===t}function wi(t){var e=1;for(Gs=Xs;!yi();)if(t=_i(),bi(t))xi(t);else if(91===t&&e++,93===t&&e--,0===e){Zs=Xs;break}}function xi(t){for(var e=t;!yi()&&(t=_i())!==e;);}function Ci(t,e,i){Js=i;var n=e.value,r=e.modifiers,s=t.tag,o=t.attrsMap.type;if("select"===s)Di(t,n,r);else if("input"===s&&"checkbox"===o)ki(t,n,r);else if("input"===s&&"radio"===o)Ti(t,n,r);else if("input"===s||"textarea"===s)Si(t,n,r);else if(!Br.isReservedTag(s))return gi(t,n,r),!1;return!0}function ki(t,e,i){var n=i&&i.number,r=pi(t,"value")||"null",s=pi(t,"true-value")||"true",o=pi(t,"false-value")||"false";ui(t,"checked","Array.isArray("+e+")?_i("+e+","+r+")>-1"+("true"===s?":("+e+")":":_q("+e+","+s+")")),di(t,Ao,"var $$a="+e+",$$el=$event.target,$$c=$$el.checked?("+s+"):("+o+");if(Array.isArray($$a)){var $$v="+(n?"_n("+r+")":r)+",$$i=_i($$a,$$v);if($$c){$$i<0&&("+e+"=$$a.concat($$v))}else{$$i>-1&&("+e+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+mi(e,"$$c")+"}",null,!0)}function Ti(t,e,i){var n=i&&i.number,r=pi(t,"value")||"null";r=n?"_n("+r+")":r,ui(t,"checked","_q("+e+","+r+")"),di(t,Ao,mi(e,r),null,!0)}function Di(t,e,i){var n=i&&i.number,r='Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(n?"_n(val)":"val")+"})",s="var $$selectedVal = "+r+";";s=s+" "+mi(e,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),di(t,"change",s,null,!0)}function Si(t,e,i){var n=t.attrsMap.type,r=i||{},s=r.lazy,o=r.number,a=r.trim,l=!s&&"range"!==n,u=s?"change":"range"===n?So:"input",c="$event.target.value";a&&(c="$event.target.value.trim()"),o&&(c="_n("+c+")");var h=mi(e,c);l&&(h="if($event.target.composing)return;"+h),ui(t,"value","("+e+")"),di(t,u,h,null,!0),(a||o||"number"===n)&&di(t,"blur","$forceUpdate()")}function Ai(t){var e;n(t[So])&&(e=Zr?"change":"input",t[e]=[].concat(t[So],t[e]||[]),delete t[So]),n(t[Ao])&&(e=is?"click":"change",t[e]=[].concat(t[Ao],t[e]||[]),delete t[Ao])}function Ei(t,e,i,n,r){if(i){var s=e,o=Qs;e=function(i){null!==(1===arguments.length?s(i):s.apply(null,arguments))&&Ii(t,e,n,o)}}Qs.addEventListener(t,e,ns?{capture:n,passive:r}:n)}function Ii(t,e,i,n){(n||Qs).removeEventListener(t,e,i)}function $i(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Qs=e.elm,Ai(n),Q(n,r,Ei,Ii,e.context)}}function Oi(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var r,s,o=e.elm,a=t.data.domProps||{},l=e.data.domProps||{};n(l.__ob__)&&(l=e.data.domProps=_({},l));for(r in a)i(l[r])&&(o[r]="");for(r in l)if(s=l[r],"textContent"!==r&&"innerHTML"!==r||(e.children&&(e.children.length=0),s!==a[r]))if("value"===r){o._value=s;var u=i(s)?"":String(s);Pi(o,e,u)&&(o.value=u)}else o[r]=s}}function Pi(t,e,i){return!t.composing&&("option"===e.tag||Ni(t,i)||Mi(t,i))}function Ni(t,e){return document.activeElement!==t&&t.value!==e}function Mi(t,e){var i=t.value,r=t._vModifiers;return n(r)&&r.number||"number"===t.type?h(i)!==h(e):n(r)&&r.trim?i.trim()!==e.trim():i!==e}function ji(t){var e=Hi(t.style);return t.staticStyle?_(t.staticStyle,e):e}function Hi(t){return Array.isArray(t)?y(t):"string"==typeof t?$o(t):t}function Ri(t,e){var i,n={};if(e)for(var r=t;r.componentInstance;)r=r.componentInstance._vnode,r.data&&(i=ji(r.data))&&_(n,i);(i=ji(t.data))&&_(n,i);for(var s=t;s=s.parent;)s.data&&(i=ji(s.data))&&_(n,i);return n}function Li(t,e){var r=e.data,s=t.data;if(!(i(r.staticStyle)&&i(r.style)&&i(s.staticStyle)&&i(s.style))){var o,a,l=e.elm,u=s.staticStyle,c=s.normalizedStyle||s.style||{},h=u||c,d=Hi(e.data.style)||{};e.data.normalizedStyle=n(d.__ob__)?_({},d):d;var p=Ri(e,!0);for(a in h)i(p[a])&&No(l,a,"");for(a in p)(o=p[a])!==h[a]&&No(l,a,null==o?"":o)}}function Fi(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var i=" "+(t.getAttribute("class")||"")+" ";i.indexOf(" "+e+" ")<0&&t.setAttribute("class",(i+e).trim())}}function zi(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e);else{for(var i=" "+(t.getAttribute("class")||"")+" ",n=" "+e+" ";i.indexOf(n)>=0;)i=i.replace(n," ");t.setAttribute("class",i.trim())}}function Wi(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&_(e,Ro(t.name||"v")),_(e,t),e}return"string"==typeof t?Ro(t):void 0}}function qi(t){Yo(function(){Yo(t)})}function Bi(t,e){(t._transitionClasses||(t._transitionClasses=[])).push(e),Fi(t,e)}function Ui(t,e){t._transitionClasses&&p(t._transitionClasses,e),zi(t,e)}function Yi(t,e,i){var n=Vi(t,e),r=n.type,s=n.timeout,o=n.propCount;if(!r)return i();var a=r===Fo?qo:Uo,l=0,u=function(){t.removeEventListener(a,c),i()},c=function(e){e.target===t&&++l>=o&&u()};setTimeout(function(){l<o&&u()},s+1),t.addEventListener(a,c)}function Vi(t,e){var i,n=window.getComputedStyle(t),r=n[Wo+"Delay"].split(", "),s=n[Wo+"Duration"].split(", "),o=Ki(r,s),a=n[Bo+"Delay"].split(", "),l=n[Bo+"Duration"].split(", "),u=Ki(a,l),c=0,h=0;return e===Fo?o>0&&(i=Fo,c=o,h=s.length):e===zo?u>0&&(i=zo,c=u,h=l.length):(c=Math.max(o,u),i=c>0?o>u?Fo:zo:null,h=i?i===Fo?s.length:l.length:0),{type:i,timeout:c,propCount:h,hasTransform:i===Fo&&Vo.test(n[Wo+"Property"])}}function Ki(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.apply(null,e.map(function(e,i){return Xi(e)+Xi(t[i])}))}function Xi(t){return 1e3*Number(t.slice(0,-1))}function Gi(t,e){var r=t.elm;n(r._leaveCb)&&(r._leaveCb.cancelled=!0,r._leaveCb());var s=Wi(t.data.transition);if(!i(s)&&!n(r._enterCb)&&1===r.nodeType){for(var o=s.css,l=s.type,u=s.enterClass,c=s.enterToClass,d=s.enterActiveClass,p=s.appearClass,f=s.appearToClass,g=s.appearActiveClass,m=s.beforeEnter,v=s.enter,_=s.afterEnter,y=s.enterCancelled,b=s.beforeAppear,w=s.appear,x=s.afterAppear,k=s.appearCancelled,T=s.duration,D=Ds,S=Ds.$vnode;S&&S.parent;)S=S.parent,D=S.context;var A=!D._isMounted||!t.isRootInsert;if(!A||w||""===w){var E=A&&p?p:u,I=A&&g?g:d,$=A&&f?f:c,O=A?b||m:m,P=A&&"function"==typeof w?w:v,N=A?x||_:_,M=A?k||y:y,j=h(a(T)?T.enter:T),H=!1!==o&&!Jr,R=Qi(P),L=r._enterCb=C(function(){H&&(Ui(r,$),Ui(r,I)),L.cancelled?(H&&Ui(r,E),M&&M(r)):N&&N(r),r._enterCb=null});t.data.show||tt(t.data.hook||(t.data.hook={}),"insert",function(){var e=r.parentNode,i=e&&e._pending&&e._pending[t.key];i&&i.tag===t.tag&&i.elm._leaveCb&&i.elm._leaveCb(),P&&P(r,L)}),O&&O(r),H&&(Bi(r,E),Bi(r,I),qi(function(){Bi(r,$),Ui(r,E),L.cancelled||R||(Ji(j)?setTimeout(L,j):Yi(r,l,L))})),t.data.show&&(e&&e(),P&&P(r,L)),H||R||L()}}}function Zi(t,e){function r(){k.cancelled||(t.data.show||((s.parentNode._pending||(s.parentNode._pending={}))[t.key]=t),f&&f(s),b&&(Bi(s,c),Bi(s,p),qi(function(){Bi(s,d),Ui(s,c),k.cancelled||w||(Ji(x)?setTimeout(k,x):Yi(s,u,k))})),g&&g(s,k),b||w||k())}var s=t.elm;n(s._enterCb)&&(s._enterCb.cancelled=!0,s._enterCb());var o=Wi(t.data.transition);if(i(o))return e();if(!n(s._leaveCb)&&1===s.nodeType){var l=o.css,u=o.type,c=o.leaveClass,d=o.leaveToClass,p=o.leaveActiveClass,f=o.beforeLeave,g=o.leave,m=o.afterLeave,v=o.leaveCancelled,_=o.delayLeave,y=o.duration,b=!1!==l&&!Jr,w=Qi(g),x=h(a(y)?y.leave:y),k=s._leaveCb=C(function(){s.parentNode&&s.parentNode._pending&&(s.parentNode._pending[t.key]=null),b&&(Ui(s,d),Ui(s,p)),k.cancelled?(b&&Ui(s,c),v&&v(s)):(e(),m&&m(s)),s._leaveCb=null});_?_(r):r()}}function Ji(t){return"number"==typeof t&&!isNaN(t)}function Qi(t){if(i(t))return!1;var e=t.fns;return n(e)?Qi(Array.isArray(e)?e[0]:e):(t._length||t.length)>1}function tn(t,e){!0!==e.data.show&&Gi(e)}function en(t,e,i){var n=e.value,r=t.multiple;if(!r||Array.isArray(n)){for(var s,o,a=0,l=t.options.length;a<l;a++)if(o=t.options[a],r)s=x(n,rn(o))>-1,o.selected!==s&&(o.selected=s);else if(w(rn(o),n))return void(t.selectedIndex!==a&&(t.selectedIndex=a));r||(t.selectedIndex=-1)}}function nn(t,e){for(var i=0,n=e.length;i<n;i++)if(w(rn(e[i]),t))return!1;return!0}function rn(t){return"_value"in t?t._value:t.value}function sn(t){t.target.composing=!0}function on(t){t.target.composing&&(t.target.composing=!1,an(t.target,"input"))}function an(t,e){var i=document.createEvent("HTMLEvents");i.initEvent(e,!0,!0),t.dispatchEvent(i)}function ln(t){return!t.componentInstance||t.data&&t.data.transition?t:ln(t.componentInstance._vnode)}function un(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?un(ut(e.children)):t}function cn(t){var e={},i=t.$options;for(var n in i.propsData)e[n]=t[n];var r=i._parentListeners;for(var s in r)e[Mr(s)]=r[s];return e}function hn(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function dn(t){for(;t=t.parent;)if(t.data.transition)return!0}function pn(t,e){return e.key===t.key&&e.tag===t.tag}function fn(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function gn(t){t.data.newPos=t.elm.getBoundingClientRect()}function mn(t){var e=t.data.pos,i=t.data.newPos,n=e.left-i.left,r=e.top-i.top;if(n||r){t.data.moved=!0;var s=t.elm.style;s.transform=s.WebkitTransform="translate("+n+"px,"+r+"px)",s.transitionDuration="0s"}}function vn(t){return oa=oa||document.createElement("div"),oa.innerHTML=t,oa.textContent}function _n(t,e){var i=e?Ya:Ua;return t.replace(i,function(t){return Ba[t]})}function yn(t,e){function i(e){c+=e,t=t.substring(e)}function n(t,i,n){var r,a;if(null==i&&(i=c),null==n&&(n=c),t&&(a=t.toLowerCase()),t)for(r=o.length-1;r>=0&&o[r].lowerCasedTag!==a;r--);else r=0;if(r>=0){for(var l=o.length-1;l>=r;l--)e.end&&e.end(o[l].tag,i,n);o.length=r,s=r&&o[r-1].tag}else"br"===a?e.start&&e.start(t,[],!0,i,n):"p"===a&&(e.start&&e.start(t,[],!1,i,n),e.end&&e.end(t,i,n))}for(var r,s,o=[],a=e.expectHTML,l=e.isUnaryTag||Lr,u=e.canBeLeftOpenTag||Lr,c=0;t;){if(r=t,s&&Wa(s)){var h=s.toLowerCase(),d=qa[h]||(qa[h]=new RegExp("([\\s\\S]*?)(</"+h+"[^>]*>)","i")),p=0,f=t.replace(d,function(t,i,n){return p=n.length,Wa(h)||"noscript"===h||(i=i.replace(/<!--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)]]>/g,"$1")),e.chars&&e.chars(i),""});c+=t.length-f.length,t=f,n(h,c-p,c)}else{var g=t.indexOf("<");if(0===g){if(wa.test(t)){var m=t.indexOf("--\x3e");if(m>=0){i(m+3);continue}}if(xa.test(t)){var v=t.indexOf("]>");if(v>=0){i(v+2);continue}}var _=t.match(ba);if(_){i(_[0].length);continue}var y=t.match(ya);if(y){var b=c;i(y[0].length),n(y[1],b,c);continue}var w=function(){var e=t.match(va);if(e){var n={tagName:e[1],attrs:[],start:c};i(e[0].length);for(var r,s;!(r=t.match(_a))&&(s=t.match(fa));)i(s[0].length),n.attrs.push(s);if(r)return n.unarySlash=r[1],i(r[0].length),n.end=c,n}}();if(w){!function(t){var i=t.tagName,r=t.unarySlash;a&&("p"===s&&ca(i)&&n(s),u(i)&&s===i&&n(i));for(var c=l(i)||"html"===i&&"head"===s||!!r,h=t.attrs.length,d=new Array(h),p=0;p<h;p++){var f=t.attrs[p];Ca&&-1===f[0].indexOf('""')&&(""===f[3]&&delete f[3],""===f[4]&&delete f[4],""===f[5]&&delete f[5]);var g=f[3]||f[4]||f[5]||"";d[p]={name:f[1],value:_n(g,e.shouldDecodeNewlines)}}c||(o.push({tag:i,lowerCasedTag:i.toLowerCase(),attrs:d}),s=i),e.start&&e.start(i,d,c,t.start,t.end)}(w);continue}}var x=void 0,C=void 0,k=void 0;if(g>=0){for(C=t.slice(g);!(ya.test(C)||va.test(C)||wa.test(C)||xa.test(C)||(k=C.indexOf("<",1))<0);)g+=k,C=t.slice(g);x=t.substring(0,g),i(g)}g<0&&(x=t,t=""),e.chars&&x&&e.chars(x)}if(t===r){e.chars&&e.chars(t);break}}n()}function bn(t,e){var i=e?Xa(e):Va;if(i.test(t)){for(var n,r,s=[],o=i.lastIndex=0;n=i.exec(t);){r=n.index,r>o&&s.push(JSON.stringify(t.slice(o,r)));var a=si(n[1].trim());s.push("_s("+a+")"),o=r+n[0].length}return o<t.length&&s.push(JSON.stringify(t.slice(o))),s.join("+")}}function wn(t,e){function i(t){t.pre&&(a=!1),Ea(t.tag)&&(l=!1)}ka=e.warn||ai,$a=e.getTagNamespace||Lr,Ia=e.mustUseProp||Lr,Ea=e.isPreTag||Lr,Sa=li(e.modules,"preTransformNode"),Da=li(e.modules,"transformNode"),Aa=li(e.modules,"postTransformNode"),Ta=e.delimiters;var n,r,s=[],o=!1!==e.preserveWhitespace,a=!1,l=!1;return yn(t,{warn:ka,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,start:function(t,o,u){var c=r&&r.ns||$a(t);Zr&&"svg"===c&&(o=Fn(o));var h={type:1,tag:t,attrsList:o,attrsMap:Hn(o),parent:r,children:[]};c&&(h.ns=c),Ln(h)&&!as()&&(h.forbidden=!0);for(var d=0;d<Sa.length;d++)Sa[d](h,e);if(a||(xn(h),h.pre&&(a=!0)),Ea(h.tag)&&(l=!0),a)Cn(h);else{Dn(h),Sn(h),$n(h),kn(h),h.plain=!h.key&&!o.length,Tn(h),On(h),Pn(h);for(var p=0;p<Da.length;p++)Da[p](h,e);Nn(h)}if(n?s.length||n.if&&(h.elseif||h.else)&&In(n,{exp:h.elseif,block:h}):n=h,r&&!h.forbidden)if(h.elseif||h.else)An(h,r);else if(h.slotScope){r.plain=!1;var f=h.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[f]=h}else r.children.push(h),h.parent=r;u?i(h):(r=h,s.push(h));for(var g=0;g<Aa.length;g++)Aa[g](h,e)},end:function(){var t=s[s.length-1],e=t.children[t.children.length-1];e&&3===e.type&&" "===e.text&&!l&&t.children.pop(),s.length-=1,r=s[s.length-1],i(t)},chars:function(t){if(r&&(!Zr||"textarea"!==r.tag||r.attrsMap.placeholder!==t)){var e=r.children;if(t=l||t.trim()?Rn(r)?t:nl(t):o&&e.length?" ":""){var i;!a&&" "!==t&&(i=bn(t,Ta))?e.push({type:2,expression:i,text:t}):" "===t&&e.length&&" "===e[e.length-1].text||e.push({type:3,text:t})}}}}),n}function xn(t){null!=fi(t,"v-pre")&&(t.pre=!0)}function Cn(t){var e=t.attrsList.length;if(e)for(var i=t.attrs=new Array(e),n=0;n<e;n++)i[n]={name:t.attrsList[n].name,value:JSON.stringify(t.attrsList[n].value)};else t.pre||(t.plain=!0)}function kn(t){var e=pi(t,"key");e&&(t.key=e)}function Tn(t){var e=pi(t,"ref");e&&(t.ref=e,t.refInFor=Mn(t))}function Dn(t){var e;if(e=fi(t,"v-for")){var i=e.match(Ja);if(!i)return;t.for=i[2].trim();var n=i[1].trim(),r=n.match(Qa);r?(t.alias=r[1].trim(),t.iterator1=r[2].trim(),r[3]&&(t.iterator2=r[3].trim())):t.alias=n}}function Sn(t){var e=fi(t,"v-if");if(e)t.if=e,In(t,{exp:e,block:t});else{null!=fi(t,"v-else")&&(t.else=!0);var i=fi(t,"v-else-if");i&&(t.elseif=i)}}function An(t,e){var i=En(e.children);i&&i.if&&In(i,{exp:t.elseif,block:t})}function En(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}function In(t,e){t.ifConditions||(t.ifConditions=[]),t.ifConditions.push(e)}function $n(t){null!=fi(t,"v-once")&&(t.once=!0)}function On(t){if("slot"===t.tag)t.slotName=pi(t,"name");else{var e=pi(t,"slot");e&&(t.slotTarget='""'===e?'"default"':e),"template"===t.tag&&(t.slotScope=fi(t,"scope"))}}function Pn(t){var e;(e=pi(t,"is"))&&(t.component=e),null!=fi(t,"inline-template")&&(t.inlineTemplate=!0)}function Nn(t){var e,i,n,r,s,o,a,l=t.attrsList;for(e=0,i=l.length;e<i;e++)if(n=r=l[e].name,s=l[e].value,Za.test(n))if(t.hasBindings=!0,o=jn(n),o&&(n=n.replace(il,"")),el.test(n))n=n.replace(el,""),s=si(s),a=!1,o&&(o.prop&&(a=!0,"innerHtml"===(n=Mr(n))&&(n="innerHTML")),o.camel&&(n=Mr(n)),o.sync&&di(t,"update:"+Mr(n),mi(s,"$event"))),a||Ia(t.tag,t.attrsMap.type,n)?ui(t,n,s):ci(t,n,s);else if(Ga.test(n))n=n.replace(Ga,""),di(t,n,s,o,!1,ka);else{n=n.replace(Za,"");var u=n.match(tl),c=u&&u[1];c&&(n=n.slice(0,-(c.length+1))),hi(t,n,r,s,c,o)}else{ci(t,n,JSON.stringify(s))}}function Mn(t){for(var e=t;e;){if(void 0!==e.for)return!0;e=e.parent}return!1}function jn(t){var e=t.match(il);if(e){var i={};return e.forEach(function(t){i[t.slice(1)]=!0}),i}}function Hn(t){for(var e={},i=0,n=t.length;i<n;i++)e[t[i].name]=t[i].value;return e}function Rn(t){return"script"===t.tag||"style"===t.tag}function Ln(t){return"style"===t.tag||"script"===t.tag&&(!t.attrsMap.type||"text/javascript"===t.attrsMap.type)}function Fn(t){for(var e=[],i=0;i<t.length;i++){var n=t[i];rl.test(n.name)||(n.name=n.name.replace(sl,""),e.push(n))}return e}function zn(t,e){t&&(Oa=ol(e.staticKeys||""),Pa=e.isReservedTag||Lr,qn(t),Bn(t,!1))}function Wn(t){return d("type,tag,attrsList,attrsMap,plain,parent,children,attrs"+(t?","+t:""))}function qn(t){if(t.static=Yn(t),1===t.type){if(!Pa(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var e=0,i=t.children.length;e<i;e++){var n=t.children[e];qn(n),n.static||(t.static=!1)}}}function Bn(t,e){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=e),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var i=0,n=t.children.length;i<n;i++)Bn(t.children[i],e||!!t.for);t.ifConditions&&Un(t.ifConditions,e)}}function Un(t,e){for(var i=1,n=t.length;i<n;i++)Bn(t[i].block,e)}function Yn(t){return 2!==t.type&&(3===t.type||!(!t.pre&&(t.hasBindings||t.if||t.for||Or(t.tag)||!Pa(t.tag)||Vn(t)||!Object.keys(t).every(Oa))))}function Vn(t){for(;t.parent;){if(t=t.parent,"template"!==t.tag)return!1;if(t.for)return!0}return!1}function Kn(t,e,i){var n=e?"nativeOn:{":"on:{";for(var r in t){n+='"'+r+'":'+Xn(r,t[r])+","}return n.slice(0,-1)+"}"}function Xn(t,e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return Xn(t,e)}).join(",")+"]";var i=ll.test(e.value),n=al.test(e.value);if(e.modifiers){var r="",s="",o=[];for(var a in e.modifiers)hl[a]?(s+=hl[a],ul[a]&&o.push(a)):o.push(a);o.length&&(r+=Gn(o)),s&&(r+=s);return"function($event){"+r+(i?e.value+"($event)":n?"("+e.value+")($event)":e.value)+"}"}return i||n?e.value:"function($event){"+e.value+"}"}function Gn(t){return"if(!('button' in $event)&&"+t.map(Zn).join("&&")+")return null;"}function Zn(t){var e=parseInt(t,10);if(e)return"$event.keyCode!=="+e;var i=ul[t];return"_k($event.keyCode,"+JSON.stringify(t)+(i?","+JSON.stringify(i):"")+")"}function Jn(t,e){t.wrapData=function(i){return"_b("+i+",'"+t.tag+"',"+e.value+(e.modifiers&&e.modifiers.prop?",true":"")+")"}}function Qn(t,e){var i=La,n=La=[],r=Fa;Fa=0,za=e,Na=e.warn||ai,Ma=li(e.modules,"transformCode"),ja=li(e.modules,"genData"),Ha=e.directives||{},Ra=e.isReservedTag||Lr;var s=t?tr(t):'_c("div")';return La=i,Fa=r,{render:"with(this){return "+s+"}",staticRenderFns:n}}function tr(t){if(t.staticRoot&&!t.staticProcessed)return er(t);if(t.once&&!t.onceProcessed)return ir(t);if(t.for&&!t.forProcessed)return sr(t);if(t.if&&!t.ifProcessed)return nr(t);if("template"!==t.tag||t.slotTarget){if("slot"===t.tag)return _r(t);var e;if(t.component)e=yr(t.component,t);else{var i=t.plain?void 0:or(t),n=t.inlineTemplate?null:dr(t,!0);e="_c('"+t.tag+"'"+(i?","+i:"")+(n?","+n:"")+")"}for(var r=0;r<Ma.length;r++)e=Ma[r](t,e);return e}return dr(t)||"void 0"}function er(t){return t.staticProcessed=!0,La.push("with(this){return "+tr(t)+"}"),"_m("+(La.length-1)+(t.staticInFor?",true":"")+")"}function ir(t){if(t.onceProcessed=!0,t.if&&!t.ifProcessed)return nr(t);if(t.staticInFor){for(var e="",i=t.parent;i;){if(i.for){e=i.key;break}i=i.parent}return e?"_o("+tr(t)+","+Fa+++(e?","+e:"")+")":tr(t)}return er(t)}function nr(t){return t.ifProcessed=!0,rr(t.ifConditions.slice())}function rr(t){function e(t){return t.once?ir(t):tr(t)}if(!t.length)return"_e()";var i=t.shift();return i.exp?"("+i.exp+")?"+e(i.block)+":"+rr(t):""+e(i.block)}function sr(t){var e=t.for,i=t.alias,n=t.iterator1?","+t.iterator1:"",r=t.iterator2?","+t.iterator2:"";return t.forProcessed=!0,"_l(("+e+"),function("+i+n+r+"){return "+tr(t)+"})"}function or(t){var e="{",i=ar(t);i&&(e+=i+","),t.key&&(e+="key:"+t.key+","),t.ref&&(e+="ref:"+t.ref+","),t.refInFor&&(e+="refInFor:true,"),t.pre&&(e+="pre:true,"),t.component&&(e+='tag:"'+t.tag+'",');for(var n=0;n<ja.length;n++)e+=ja[n](t);if(t.attrs&&(e+="attrs:{"+br(t.attrs)+"},"),t.props&&(e+="domProps:{"+br(t.props)+"},"),t.events&&(e+=Kn(t.events,!1,Na)+","),t.nativeEvents&&(e+=Kn(t.nativeEvents,!0,Na)+","),t.slotTarget&&(e+="slot:"+t.slotTarget+","),t.scopedSlots&&(e+=ur(t.scopedSlots)+","),t.model&&(e+="model:{value:"+t.model.value+",callback:"+t.model.callback+",expression:"+t.model.expression+"},"),t.inlineTemplate){var r=lr(t);r&&(e+=r+",")}return e=e.replace(/,$/,"")+"}",t.wrapData&&(e=t.wrapData(e)),e}function ar(t){var e=t.directives;if(e){var i,n,r,s,o="directives:[",a=!1;for(i=0,n=e.length;i<n;i++){r=e[i],s=!0;var l=Ha[r.name]||dl[r.name];l&&(s=!!l(t,r,Na)),s&&(a=!0,o+='{name:"'+r.name+'",rawName:"'+r.rawName+'"'+(r.value?",value:("+r.value+"),expression:"+JSON.stringify(r.value):"")+(r.arg?',arg:"'+r.arg+'"':"")+(r.modifiers?",modifiers:"+JSON.stringify(r.modifiers):"")+"},")}return a?o.slice(0,-1)+"]":void 0}}function lr(t){var e=t.children[0];if(1===e.type){var i=Qn(e,za);return"inlineTemplate:{render:function(){"+i.render+"},staticRenderFns:["+i.staticRenderFns.map(function(t){return"function(){"+t+"}"}).join(",")+"]}"}}function ur(t){return"scopedSlots:_u(["+Object.keys(t).map(function(e){return cr(e,t[e])}).join(",")+"])"}function cr(t,e){return e.for&&!e.forProcessed?hr(t,e):"{key:"+t+",fn:function("+String(e.attrsMap.scope)+"){return "+("template"===e.tag?dr(e)||"void 0":tr(e))+"}}"}function hr(t,e){var i=e.for,n=e.alias,r=e.iterator1?","+e.iterator1:"",s=e.iterator2?","+e.iterator2:"";return e.forProcessed=!0,"_l(("+i+"),function("+n+r+s+"){return "+cr(t,e)+"})"}function dr(t,e){var i=t.children;if(i.length){var n=i[0];if(1===i.length&&n.for&&"template"!==n.tag&&"slot"!==n.tag)return tr(n);var r=e?pr(i):0;return"["+i.map(mr).join(",")+"]"+(r?","+r:"")}}function pr(t){for(var e=0,i=0;i<t.length;i++){var n=t[i];if(1===n.type){if(fr(n)||n.ifConditions&&n.ifConditions.some(function(t){return fr(t.block)})){e=2;break}(gr(n)||n.ifConditions&&n.ifConditions.some(function(t){return gr(t.block)}))&&(e=1)}}return e}function fr(t){return void 0!==t.for||"template"===t.tag||"slot"===t.tag}function gr(t){return!Ra(t.tag)}function mr(t){return 1===t.type?tr(t):vr(t)}function vr(t){return"_v("+(2===t.type?t.expression:wr(JSON.stringify(t.text)))+")"}function _r(t){var e=t.slotName||'"default"',i=dr(t),n="_t("+e+(i?","+i:""),r=t.attrs&&"{"+t.attrs.map(function(t){return Mr(t.name)+":"+t.value}).join(",")+"}",s=t.attrsMap["v-bind"];return!r&&!s||i||(n+=",null"),r&&(n+=","+r),s&&(n+=(r?"":",null")+","+s),n+")"}function yr(t,e){var i=e.inlineTemplate?null:dr(e,!0);return"_c("+t+","+or(e)+(i?","+i:"")+")"}function br(t){for(var e="",i=0;i<t.length;i++){var n=t[i];e+='"'+n.name+'":'+wr(n.value)+","}return e.slice(0,-1)}function wr(t){return t.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function xr(t,e){var i=wn(t.trim(),e);zn(i,e);var n=Qn(i,e);return{ast:i,render:n.render,staticRenderFns:n.staticRenderFns}}function Cr(t,e){try{return new Function(t)}catch(i){return e.push({err:i,code:t}),b}}function kr(t,e){var i=(e.warn,fi(t,"class"));i&&(t.staticClass=JSON.stringify(i));var n=pi(t,"class",!1);n&&(t.classBinding=n)}function Tr(t){var e="";return t.staticClass&&(e+="staticClass:"+t.staticClass+","),t.classBinding&&(e+="class:"+t.classBinding+","),e}function Dr(t,e){var i=(e.warn,fi(t,"style"));if(i){t.staticStyle=JSON.stringify($o(i))}var n=pi(t,"style",!1);n&&(t.styleBinding=n)}function Sr(t){var e="";return t.staticStyle&&(e+="staticStyle:"+t.staticStyle+","),t.styleBinding&&(e+="style:("+t.styleBinding+"),"),e}function Ar(t,e){e.value&&ui(t,"textContent","_s("+e.value+")")}function Er(t,e){e.value&&ui(t,"innerHTML","_s("+e.value+")")}function Ir(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}var $r=Object.prototype.toString,Or=d("slot,component",!0),Pr=Object.prototype.hasOwnProperty,Nr=/-(\w)/g,Mr=g(function(t){return t.replace(Nr,function(t,e){return e?e.toUpperCase():""})}),jr=g(function(t){return t.charAt(0).toUpperCase()+t.slice(1)}),Hr=/([^-])([A-Z])/g,Rr=g(function(t){return t.replace(Hr,"$1-$2").replace(Hr,"$1-$2").toLowerCase()}),Lr=function(){return!1},Fr=function(t){return t},zr="data-server-rendered",Wr=["component","directive","filter"],qr=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated"],Br={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:Lr,isReservedAttr:Lr,isUnknownElement:Lr,getTagNamespace:b,parsePlatformTagName:Fr,mustUseProp:Lr,_lifecycleHooks:qr},Ur=Object.freeze({}),Yr=/[^\w.$]/,Vr=b,Kr="__proto__"in{},Xr="undefined"!=typeof window,Gr=Xr&&window.navigator.userAgent.toLowerCase(),Zr=Gr&&/msie|trident/.test(Gr),Jr=Gr&&Gr.indexOf("msie 9.0")>0,Qr=Gr&&Gr.indexOf("edge/")>0,ts=Gr&&Gr.indexOf("android")>0,es=Gr&&/iphone|ipad|ipod|ios/.test(Gr),is=Gr&&/chrome\/\d+/.test(Gr)&&!Qr,ns=!1;if(Xr)try{var rs={};Object.defineProperty(rs,"passive",{get:function(){ns=!0}}),window.addEventListener("test-passive",null,rs)}catch(t){}var ss,os,as=function(){return void 0===ss&&(ss=!Xr&&void 0!==e&&"server"===e.process.env.VUE_ENV),ss},ls=Xr&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,us="undefined"!=typeof Symbol&&A(Symbol)&&"undefined"!=typeof Reflect&&A(Reflect.ownKeys),cs=function(){function t(){n=!1;var t=i.slice(0);i.length=0;for(var e=0;e<t.length;e++)t[e]()}var e,i=[],n=!1;if("undefined"!=typeof Promise&&A(Promise)){var r=Promise.resolve(),s=function(t){};e=function(){r.then(t).catch(s),es&&setTimeout(b)}}else if("undefined"==typeof MutationObserver||!A(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())e=function(){setTimeout(t,0)};else{var o=1,a=new MutationObserver(t),l=document.createTextNode(String(o));a.observe(l,{characterData:!0}),e=function(){o=(o+1)%2,l.data=String(o)}}return function(t,r){var s;if(i.push(function(){if(t)try{t.call(r)}catch(t){S(t,r,"nextTick")}else s&&s(r)}),n||(n=!0,e()),!t&&"undefined"!=typeof Promise)return new Promise(function(t,e){s=t})}}();os="undefined"!=typeof Set&&A(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var hs=0,ds=function(){this.id=hs++,this.subs=[]};ds.prototype.addSub=function(t){this.subs.push(t)},ds.prototype.removeSub=function(t){p(this.subs,t)},ds.prototype.depend=function(){ds.target&&ds.target.addDep(this)},ds.prototype.notify=function(){for(var t=this.subs.slice(),e=0,i=t.length;e<i;e++)t[e].update()},ds.target=null;var ps=[],fs=Array.prototype,gs=Object.create(fs);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(t){var e=fs[t];T(gs,t,function(){for(var i=arguments,n=arguments.length,r=new Array(n);n--;)r[n]=i[n];var s,o=e.apply(this,r),a=this.__ob__;switch(t){case"push":case"unshift":s=r;break;case"splice":s=r.slice(2)}return s&&a.observeArray(s),a.dep.notify(),o})});var ms=Object.getOwnPropertyNames(gs),vs={shouldConvert:!0,isSettingProps:!1},_s=function(t){if(this.value=t,this.dep=new ds,this.vmCount=0,T(t,"__ob__",this),Array.isArray(t)){(Kr?$:O)(t,gs,ms),this.observeArray(t)}else this.walk(t)};_s.prototype.walk=function(t){for(var e=Object.keys(t),i=0;i<e.length;i++)N(t,e[i],t[e[i]])},_s.prototype.observeArray=function(t){for(var e=0,i=t.length;e<i;e++)P(t[e])};var ys=Br.optionMergeStrategies;ys.data=function(t,e,i){return i?t||e?function(){var n="function"==typeof e?e.call(i):e,r="function"==typeof t?t.call(i):void 0;return n?R(n,r):r}:void 0:e?"function"!=typeof e?t:t?function(){return R(e.call(this),t.call(this))}:e:t},qr.forEach(function(t){ys[t]=L}),Wr.forEach(function(t){ys[t+"s"]=F}),ys.watch=function(t,e){if(!e)return Object.create(t||null);if(!t)return e;var i={};_(i,t);for(var n in e){var r=i[n],s=e[n];r&&!Array.isArray(r)&&(r=[r]),i[n]=r?r.concat(s):[s]}return i},ys.props=ys.methods=ys.computed=function(t,e){if(!e)return Object.create(t||null);if(!t)return e;var i=Object.create(null);return _(i,t),_(i,e),i};var bs=function(t,e){return void 0===e?t:e},ws=function(t,e,i,n,r,s,o){this.tag=t,this.data=e,this.children=i,this.text=n,this.elm=r,this.ns=void 0,this.context=s,this.functionalContext=void 0,this.key=e&&e.key,this.componentOptions=o,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1},xs={child:{}};xs.child.get=function(){return this.componentInstance},Object.defineProperties(ws.prototype,xs);var Cs,ks=function(){var t=new ws;return t.text="",t.isComment=!0,t},Ts=g(function(t){var e="&"===t.charAt(0);t=e?t.slice(1):t;var i="~"===t.charAt(0);t=i?t.slice(1):t;var n="!"===t.charAt(0);return t=n?t.slice(1):t,{name:t,once:i,capture:n,passive:e}}),Ds=null,Ss=[],As=[],Es={},Is=!1,$s=!1,Os=0,Ps=0,Ns=function(t,e,i,n){this.vm=t,t._watchers.push(this),n?(this.deep=!!n.deep,this.user=!!n.user,this.lazy=!!n.lazy,this.sync=!!n.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=i,this.id=++Ps,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new os,this.newDepIds=new os,this.expression="","function"==typeof e?this.getter=e:(this.getter=D(e),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};Ns.prototype.get=function(){E(this);var t,e=this.vm;if(this.user)try{t=this.getter.call(e,e)}catch(t){S(t,e,'getter for watcher "'+this.expression+'"')}else t=this.getter.call(e,e);return this.deep&&It(t),I(),this.cleanupDeps(),t},Ns.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},Ns.prototype.cleanupDeps=function(){for(var t=this,e=this.deps.length;e--;){var i=t.deps[e];t.newDepIds.has(i.id)||i.removeSub(t)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},Ns.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():Et(this)},Ns.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||a(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){S(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},Ns.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Ns.prototype.depend=function(){for(var t=this,e=this.deps.length;e--;)t.deps[e].depend()},Ns.prototype.teardown=function(){var t=this;if(this.active){this.vm._isBeingDestroyed||p(this.vm._watchers,this);for(var e=this.deps.length;e--;)t.deps[e].removeSub(t);this.active=!1}};var Ms=new os,js={enumerable:!0,configurable:!0,get:b,set:b},Hs={lazy:!0},Rs={init:function(t,e,i,n){if(!t.componentInstance||t.componentInstance._isDestroyed){(t.componentInstance=Xt(t,Ds,i,n)).$mount(e?t.elm:void 0,e)}else if(t.data.keepAlive){var r=t;Rs.prepatch(r,r)}},prepatch:function(t,e){var i=e.componentOptions;yt(e.componentInstance=t.componentInstance,i.propsData,i.listeners,e,i.children)},insert:function(t){var e=t.context,i=t.componentInstance;i._isMounted||(i._isMounted=!0,Ct(i,"mounted")),t.data.keepAlive&&(e._isMounted?St(i):wt(i,!0))},destroy:function(t){var e=t.componentInstance;e._isDestroyed||(t.data.keepAlive?xt(e,!0):e.$destroy())}},Ls=Object.keys(Rs),Fs=1,zs=2,Ws=0;!function(t){t.prototype._init=function(t){var e=this;e._uid=Ws++,e._isVue=!0,t&&t._isComponent?de(e,t):e.$options=q(pe(e.constructor),t||{},e),e._renderProxy=e,e._self=e,vt(e),ct(e),he(e),Ct(e,"beforeCreate"),Bt(e),Pt(e),qt(e),Ct(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(me),function(t){var e={};e.get=function(){return this._data};var i={};i.get=function(){return this._props},Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",i),t.prototype.$set=M,t.prototype.$delete=j,t.prototype.$watch=function(t,e,i){var n=this;i=i||{},i.user=!0;var r=new Ns(n,t,e,i);return i.immediate&&e.call(n,r.value),function(){r.teardown()}}}(me),function(t){var e=/^hook:/;t.prototype.$on=function(t,i){var n=this,r=this;if(Array.isArray(t))for(var s=0,o=t.length;s<o;s++)n.$on(t[s],i);else(r._events[t]||(r._events[t]=[])).push(i),e.test(t)&&(r._hasHookEvent=!0);return r},t.prototype.$once=function(t,e){function i(){n.$off(t,i),e.apply(n,arguments)}var n=this;return i.fn=e,n.$on(t,i),n},t.prototype.$off=function(t,e){var i=this,n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(t)){for(var r=0,s=t.length;r<s;r++)i.$off(t[r],e);return n}var o=n._events[t];if(!o)return n;if(1===arguments.length)return n._events[t]=null,n;for(var a,l=o.length;l--;)if((a=o[l])===e||a.fn===e){o.splice(l,1);break}return n},t.prototype.$emit=function(t){var e=this,i=e._events[t];if(i){i=i.length>1?v(i):i;for(var n=v(arguments,1),r=0,s=i.length;r<s;r++)i[r].apply(e,n)}return e}}(me),function(t){t.prototype._update=function(t,e){var i=this;i._isMounted&&Ct(i,"beforeUpdate");var n=i.$el,r=i._vnode,s=Ds;Ds=i,i._vnode=t,i.$el=r?i.__patch__(r,t):i.__patch__(i.$el,t,e,!1,i.$options._parentElm,i.$options._refElm),Ds=s,n&&(n.__vue__=null),i.$el&&(i.$el.__vue__=i),i.$vnode&&i.$parent&&i.$vnode===i.$parent._vnode&&(i.$parent.$el=i.$el)},t.prototype.$forceUpdate=function(){var t=this;t._watcher&&t._watcher.update()},t.prototype.$destroy=function(){var t=this;if(!t._isBeingDestroyed){Ct(t,"beforeDestroy"),t._isBeingDestroyed=!0;var e=t.$parent;!e||e._isBeingDestroyed||t.$options.abstract||p(e.$children,t),t._watcher&&t._watcher.teardown();for(var i=t._watchers.length;i--;)t._watchers[i].teardown();t._data.__ob__&&t._data.__ob__.vmCount--,t._isDestroyed=!0,t.__patch__(t._vnode,null),Ct(t,"destroyed"),t.$off(),t.$el&&(t.$el.__vue__=null),t.$options._parentElm=t.$options._refElm=null}}}(me),function(t){t.prototype.$nextTick=function(t){return cs(t,this)},t.prototype._render=function(){var t=this,e=t.$options,i=e.render,n=e.staticRenderFns,r=e._parentVnode;if(t._isMounted)for(var s in t.$slots)t.$slots[s]=Z(t.$slots[s]);t.$scopedSlots=r&&r.data.scopedSlots||Ur,n&&!t._staticTrees&&(t._staticTrees=[]),t.$vnode=r;var o;try{o=i.call(t._renderProxy,t.$createElement)}catch(e){S(e,t,"render function"),o=t._vnode}return o instanceof ws||(o=ks()),o.parent=r,o},t.prototype._o=le,t.prototype._n=h,t.prototype._s=c,t.prototype._l=ie,t.prototype._t=ne,t.prototype._q=w,t.prototype._i=x,t.prototype._m=ae,t.prototype._f=re,t.prototype._k=se,t.prototype._b=oe,t.prototype._v=X,t.prototype._e=ks,t.prototype._u=mt}(me);var qs=[String,RegExp],Bs={name:"keep-alive",abstract:!0,props:{include:qs,exclude:qs},created:function(){this.cache=Object.create(null)},destroyed:function(){var t=this;for(var e in t.cache)De(t.cache[e])},watch:{include:function(t){Te(this.cache,this._vnode,function(e){return ke(t,e)})},exclude:function(t){Te(this.cache,this._vnode,function(e){return!ke(t,e)})}},render:function(){var t=ut(this.$slots.default),e=t&&t.componentOptions;if(e){var i=Ce(e);if(i&&(this.include&&!ke(this.include,i)||this.exclude&&ke(this.exclude,i)))return t;var n=null==t.key?e.Ctor.cid+(e.tag?"::"+e.tag:""):t.key;this.cache[n]?t.componentInstance=this.cache[n].componentInstance:this.cache[n]=t,t.data.keepAlive=!0}return t}},Us={KeepAlive:Bs};!function(t){var e={};e.get=function(){return Br},Object.defineProperty(t,"config",e),t.util={warn:Vr,extend:_,mergeOptions:q,defineReactive:N},t.set=M,t.delete=j,t.nextTick=cs,t.options=Object.create(null),Wr.forEach(function(e){t.options[e+"s"]=Object.create(null)}),t.options._base=t,_(t.options.components,Us),ve(t),_e(t),ye(t),xe(t)}(me),Object.defineProperty(me.prototype,"$isServer",{get:as}),Object.defineProperty(me.prototype,"$ssrContext",{get:function(){return this.$vnode.ssrContext}}),me.version="2.3.3";var Ys,Vs,Ks,Xs,Gs,Zs,Js,Qs,to,eo=d("style,class"),io=d("input,textarea,option,select"),no=function(t,e,i){return"value"===i&&io(t)&&"button"!==e||"selected"===i&&"option"===t||"checked"===i&&"input"===t||"muted"===i&&"video"===t},ro=d("contenteditable,draggable,spellcheck"),so=d("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),oo="http://www.w3.org/1999/xlink",ao=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},lo=function(t){return ao(t)?t.slice(6,t.length):""},uo=function(t){return null==t||!1===t},co={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},ho=d("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template"),po=d("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),fo=function(t){return"pre"===t},go=function(t){return ho(t)||po(t)},mo=Object.create(null),vo=Object.freeze({createElement:Me,createElementNS:je,createTextNode:He,createComment:Re,insertBefore:Le,removeChild:Fe,appendChild:ze,parentNode:We,nextSibling:qe,tagName:Be,setTextContent:Ue,setAttribute:Ye}),_o={create:function(t,e){Ve(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Ve(t,!0),Ve(e))},destroy:function(t){Ve(t,!0)}},yo=new ws("",{},[]),bo=["create","activate","update","remove","destroy"],wo={create:Ze,update:Ze,destroy:function(t){Ze(t,yo)}},xo=Object.create(null),Co=[_o,wo],ko={create:ii,update:ii},To={create:ri,update:ri},Do=/[\w).+\-_$\]]/,So="__r",Ao="__c",Eo={create:$i,update:$i},Io={create:Oi,update:Oi},$o=g(function(t){var e={},i=/;(?![^(]*\))/g,n=/:(.+)/;return t.split(i).forEach(function(t){if(t){var i=t.split(n);i.length>1&&(e[i[0].trim()]=i[1].trim())}}),e}),Oo=/^--/,Po=/\s*!important$/,No=function(t,e,i){if(Oo.test(e))t.style.setProperty(e,i);else if(Po.test(i))t.style.setProperty(e,i.replace(Po,""),"important");else{var n=jo(e);if(Array.isArray(i))for(var r=0,s=i.length;r<s;r++)t.style[n]=i[r];else t.style[n]=i}},Mo=["Webkit","Moz","ms"],jo=g(function(t){if(to=to||document.createElement("div"),"filter"!==(t=Mr(t))&&t in to.style)return t;for(var e=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<Mo.length;i++){var n=Mo[i]+e;if(n in to.style)return n}}),Ho={create:Li,update:Li},Ro=g(function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}}),Lo=Xr&&!Jr,Fo="transition",zo="animation",Wo="transition",qo="transitionend",Bo="animation",Uo="animationend";Lo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Wo="WebkitTransition",qo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Bo="WebkitAnimation",Uo="webkitAnimationEnd"));var Yo=Xr&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout,Vo=/\b(transform|all)(,|$)/,Ko=Xr?{create:tn,activate:tn,remove:function(t,e){!0!==t.data.show?Zi(t,e):e()}}:{},Xo=[ko,To,Eo,Io,Ho,Ko],Go=Xo.concat(Co),Zo=function(t){function e(t){return new ws(I.tagName(t).toLowerCase(),{},[],void 0,t)}function s(t,e){function i(){0==--i.listeners&&a(t)}return i.listeners=e,i}function a(t){var e=I.parentNode(t);n(e)&&I.removeChild(e,t)}function l(t,e,i,s,o){if(t.isRootInsert=!o,!u(t,e,i,s)){var a=t.data,l=t.children,c=t.tag;n(c)?(t.elm=t.ns?I.createElementNS(t.ns,c):I.createElement(c,t),v(t),f(t,l,e),n(a)&&m(t,e),p(i,t.elm,s)):r(t.isComment)?(t.elm=I.createComment(t.text),p(i,t.elm,s)):(t.elm=I.createTextNode(t.text),p(i,t.elm,s))}}function u(t,e,i,s){var o=t.data;if(n(o)){var a=n(t.componentInstance)&&o.keepAlive;if(n(o=o.hook)&&n(o=o.init)&&o(t,!1,i,s),n(t.componentInstance))return c(t,e),r(a)&&h(t,e,i,s),!0}}function c(t,e){n(t.data.pendingInsert)&&e.push.apply(e,t.data.pendingInsert),t.elm=t.componentInstance.$el,g(t)?(m(t,e),v(t)):(Ve(t),e.push(t))}function h(t,e,i,r){for(var s,o=t;o.componentInstance;)if(o=o.componentInstance._vnode,n(s=o.data)&&n(s=s.transition)){for(s=0;s<A.activate.length;++s)A.activate[s](yo,o);e.push(o);break}p(i,t.elm,r)}function p(t,e,i){n(t)&&(n(i)?i.parentNode===t&&I.insertBefore(t,e,i):I.appendChild(t,e))}function f(t,e,i){if(Array.isArray(e))for(var n=0;n<e.length;++n)l(e[n],i,t.elm,null,!0);else o(t.text)&&I.appendChild(t.elm,I.createTextNode(t.text))}function g(t){for(;t.componentInstance;)t=t.componentInstance._vnode;return n(t.tag)}function m(t,e){for(var i=0;i<A.create.length;++i)A.create[i](yo,t);D=t.data.hook,n(D)&&(n(D.create)&&D.create(yo,t),n(D.insert)&&e.push(t))}function v(t){for(var e,i=t;i;)n(e=i.context)&&n(e=e.$options._scopeId)&&I.setAttribute(t.elm,e,""),i=i.parent;n(e=Ds)&&e!==t.context&&n(e=e.$options._scopeId)&&I.setAttribute(t.elm,e,"")}function _(t,e,i,n,r,s){for(;n<=r;++n)l(i[n],s,t,e)}function y(t){var e,i,r=t.data;if(n(r))for(n(e=r.hook)&&n(e=e.destroy)&&e(t),e=0;e<A.destroy.length;++e)A.destroy[e](t);if(n(e=t.children))for(i=0;i<t.children.length;++i)y(t.children[i])}function b(t,e,i,r){for(;i<=r;++i){var s=e[i];n(s)&&(n(s.tag)?(w(s),y(s)):a(s.elm))}}function w(t,e){if(n(e)||n(t.data)){var i,r=A.remove.length+1;for(n(e)?e.listeners+=r:e=s(t.elm,r),n(i=t.componentInstance)&&n(i=i._vnode)&&n(i.data)&&w(i,e),i=0;i<A.remove.length;++i)A.remove[i](t,e);n(i=t.data.hook)&&n(i=i.remove)?i(t,e):e()}else a(t.elm)}function x(t,e,r,s,o){for(var a,u,c,h,d=0,p=0,f=e.length-1,g=e[0],m=e[f],v=r.length-1,y=r[0],w=r[v],x=!o;d<=f&&p<=v;)i(g)?g=e[++d]:i(m)?m=e[--f]:Ke(g,y)?(C(g,y,s),g=e[++d],y=r[++p]):Ke(m,w)?(C(m,w,s),m=e[--f],w=r[--v]):Ke(g,w)?(C(g,w,s),x&&I.insertBefore(t,g.elm,I.nextSibling(m.elm)),g=e[++d],w=r[--v]):Ke(m,y)?(C(m,y,s),x&&I.insertBefore(t,m.elm,g.elm),m=e[--f],y=r[++p]):(i(a)&&(a=Ge(e,d,f)),u=n(y.key)?a[y.key]:null,i(u)?(l(y,s,t,g.elm),y=r[++p]):(c=e[u],Ke(c,y)?(C(c,y,s),e[u]=void 0,x&&I.insertBefore(t,y.elm,g.elm),y=r[++p]):(l(y,s,t,g.elm),y=r[++p])));d>f?(h=i(r[v+1])?null:r[v+1].elm,_(t,h,r,p,v,s)):p>v&&b(t,e,d,f)}function C(t,e,s,o){if(t!==e){if(r(e.isStatic)&&r(t.isStatic)&&e.key===t.key&&(r(e.isCloned)||r(e.isOnce)))return e.elm=t.elm,void(e.componentInstance=t.componentInstance);var a,l=e.data;n(l)&&n(a=l.hook)&&n(a=a.prepatch)&&a(t,e);var u=e.elm=t.elm,c=t.children,h=e.children;if(n(l)&&g(e)){for(a=0;a<A.update.length;++a)A.update[a](t,e);n(a=l.hook)&&n(a=a.update)&&a(t,e)}i(e.text)?n(c)&&n(h)?c!==h&&x(u,c,h,s,o):n(h)?(n(t.text)&&I.setTextContent(u,""),_(u,null,h,0,h.length-1,s)):n(c)?b(u,c,0,c.length-1):n(t.text)&&I.setTextContent(u,""):t.text!==e.text&&I.setTextContent(u,e.text),n(l)&&n(a=l.hook)&&n(a=a.postpatch)&&a(t,e)}}function k(t,e,i){if(r(i)&&n(t.parent))t.parent.data.pendingInsert=e;else for(var s=0;s<e.length;++s)e[s].data.hook.insert(e[s])}function T(t,e,i){e.elm=t;var r=e.tag,s=e.data,o=e.children;if(n(s)&&(n(D=s.hook)&&n(D=D.init)&&D(e,!0),n(D=e.componentInstance)))return c(e,i),!0;if(n(r)){if(n(o))if(t.hasChildNodes()){for(var a=!0,l=t.firstChild,u=0;u<o.length;u++){if(!l||!T(l,o[u],i)){a=!1;break}l=l.nextSibling}if(!a||l)return!1}else f(e,o,i);if(n(s))for(var h in s)if(!$(h)){m(e,i);break}}else t.data!==e.text&&(t.data=e.text);return!0}var D,S,A={},E=t.modules,I=t.nodeOps;for(D=0;D<bo.length;++D)for(A[bo[D]]=[],S=0;S<E.length;++S)n(E[S][bo[D]])&&A[bo[D]].push(E[S][bo[D]]);var $=d("attrs,style,class,staticClass,staticStyle,key");return function(t,s,o,a,u,c){if(i(s))return void(n(t)&&y(t));var h=!1,d=[];if(i(t))h=!0,l(s,d,u,c);else{var p=n(t.nodeType);if(!p&&Ke(t,s))C(t,s,d,a);else{if(p){if(1===t.nodeType&&t.hasAttribute(zr)&&(t.removeAttribute(zr),o=!0),r(o)&&T(t,s,d))return k(s,d,!0),t;t=e(t)}var f=t.elm,m=I.parentNode(f);if(l(s,d,f._leaveCb?null:m,I.nextSibling(f)),n(s.parent)){for(var v=s.parent;v;)v.elm=s.elm,v=v.parent;if(g(s))for(var _=0;_<A.create.length;++_)A.create[_](yo,s.parent)}n(m)?b(m,[t],0,0):n(t.tag)&&y(t)}}return k(s,d,h),s.elm}}({nodeOps:vo,modules:Go});Jr&&document.addEventListener("selectionchange",function(){var t=document.activeElement;t&&t.vmodel&&an(t,"input")});var Jo={inserted:function(t,e,i){if("select"===i.tag){var n=function(){en(t,e,i.context)};n(),(Zr||Qr)&&setTimeout(n,0)}else"textarea"!==i.tag&&"text"!==t.type&&"password"!==t.type||(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener("change",on),ts||(t.addEventListener("compositionstart",sn),t.addEventListener("compositionend",on)),Jr&&(t.vmodel=!0)))},componentUpdated:function(t,e,i){if("select"===i.tag){en(t,e,i.context);(t.multiple?e.value.some(function(e){return nn(e,t.options)}):e.value!==e.oldValue&&nn(e.value,t.options))&&an(t,"change")}}},Qo={bind:function(t,e,i){var n=e.value;i=ln(i);var r=i.data&&i.data.transition,s=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;n&&r&&!Jr?(i.data.show=!0,Gi(i,function(){t.style.display=s})):t.style.display=n?s:"none"},update:function(t,e,i){var n=e.value;n!==e.oldValue&&(i=ln(i),i.data&&i.data.transition&&!Jr?(i.data.show=!0,n?Gi(i,function(){t.style.display=t.__vOriginalDisplay}):Zi(i,function(){t.style.display="none"})):t.style.display=n?t.__vOriginalDisplay:"none")},unbind:function(t,e,i,n,r){r||(t.style.display=t.__vOriginalDisplay)}},ta={model:Jo,show:Qo},ea={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]},ia={name:"transition",props:ea,abstract:!0,render:function(t){var e=this,i=this.$slots.default;if(i&&(i=i.filter(function(t){return t.tag}),i.length)){var n=this.mode,r=i[0];if(dn(this.$vnode))return r;var s=un(r);if(!s)return r;if(this._leaving)return hn(t,r);var a="__transition-"+this._uid+"-";s.key=null==s.key?a+s.tag:o(s.key)?0===String(s.key).indexOf(a)?s.key:a+s.key:s.key;var l=(s.data||(s.data={})).transition=cn(this),u=this._vnode,c=un(u);if(s.data.directives&&s.data.directives.some(function(t){return"show"===t.name})&&(s.data.show=!0),c&&c.data&&!pn(s,c)){var h=c&&(c.data.transition=_({},l));if("out-in"===n)return this._leaving=!0,tt(h,"afterLeave",function(){e._leaving=!1,e.$forceUpdate()}),hn(t,r);if("in-out"===n){var d,p=function(){d()};tt(l,"afterEnter",p),tt(l,"enterCancelled",p),tt(h,"delayLeave",function(t){d=t})}}return r}}},na=_({tag:String,moveClass:String},ea);delete na.mode;var ra={props:na,render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",i=Object.create(null),n=this.prevChildren=this.children,r=this.$slots.default||[],s=this.children=[],o=cn(this),a=0;a<r.length;a++){var l=r[a];if(l.tag)if(null!=l.key&&0!==String(l.key).indexOf("__vlist"))s.push(l),i[l.key]=l,(l.data||(l.data={})).transition=o;else;}if(n){for(var u=[],c=[],h=0;h<n.length;h++){var d=n[h];d.data.transition=o,d.data.pos=d.elm.getBoundingClientRect(),i[d.key]?u.push(d):c.push(d)}this.kept=t(e,null,u),this.removed=c}return t(e,null,s)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var t=this.prevChildren,e=this.moveClass||(this.name||"v")+"-move";if(t.length&&this.hasMove(t[0].elm,e)){t.forEach(fn),t.forEach(gn),t.forEach(mn);var i=document.body;i.offsetHeight;t.forEach(function(t){if(t.data.moved){var i=t.elm,n=i.style;Bi(i,e),n.transform=n.WebkitTransform=n.transitionDuration="",i.addEventListener(qo,i._moveCb=function t(n){n&&!/transform$/.test(n.propertyName)||(i.removeEventListener(qo,t),i._moveCb=null,Ui(i,e))})}})}},methods:{hasMove:function(t,e){if(!Lo)return!1;if(null!=this._hasMove)return this._hasMove;var i=t.cloneNode();t._transitionClasses&&t._transitionClasses.forEach(function(t){zi(i,t)}),Fi(i,e),i.style.display="none",this.$el.appendChild(i);var n=Vi(i);return this.$el.removeChild(i),this._hasMove=n.hasTransform}}},sa={Transition:ia,TransitionGroup:ra};me.config.mustUseProp=no,me.config.isReservedTag=go,me.config.isReservedAttr=eo,me.config.getTagNamespace=Oe,me.config.isUnknownElement=Pe,_(me.options.directives,ta),_(me.options.components,sa),me.prototype.__patch__=Xr?Zo:b,me.prototype.$mount=function(t,e){return t=t&&Xr?Ne(t):void 0,_t(this,t,e)},setTimeout(function(){Br.devtools&&ls&&ls.emit("init",me)},0);var oa,aa=!!Xr&&function(t,e){var i=document.createElement("div");return i.innerHTML='<div a="'+t+'">',i.innerHTML.indexOf(e)>0}("\n","&#10;"),la=d("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),ua=d("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),ca=d("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),ha=/([^\s"'<>\/=]+)/,da=/(?:=)/,pa=[/"([^"]*)"+/.source,/'([^']*)'+/.source,/([^\s"'=<>`]+)/.source],fa=new RegExp("^\\s*"+ha.source+"(?:\\s*("+da.source+")\\s*(?:"+pa.join("|")+"))?"),ga="[a-zA-Z_][\\w\\-\\.]*",ma="((?:"+ga+"\\:)?"+ga+")",va=new RegExp("^<"+ma),_a=/^\s*(\/?)>/,ya=new RegExp("^<\\/"+ma+"[^>]*>"),ba=/^<!DOCTYPE [^>]+>/i,wa=/^<!--/,xa=/^<!\[/,Ca=!1;"x".replace(/x(.)?/g,function(t,e){Ca=""===e});var ka,Ta,Da,Sa,Aa,Ea,Ia,$a,Oa,Pa,Na,Ma,ja,Ha,Ra,La,Fa,za,Wa=d("script,style,textarea",!0),qa={},Ba={"&lt;":"<","&gt;":">","&quot;":'"',"&amp;":"&","&#10;":"\n"},Ua=/&(?:lt|gt|quot|amp);/g,Ya=/&(?:lt|gt|quot|amp|#10);/g,Va=/\{\{((?:.|\n)+?)\}\}/g,Ka=/[-.*+?^${}()|[\]\/\\]/g,Xa=g(function(t){var e=t[0].replace(Ka,"\\$&"),i=t[1].replace(Ka,"\\$&");return new RegExp(e+"((?:.|\\n)+?)"+i,"g")}),Ga=/^@|^v-on:/,Za=/^v-|^@|^:/,Ja=/(.*?)\s+(?:in|of)\s+(.*)/,Qa=/\((\{[^}]*\}|[^,]*),([^,]*)(?:,([^,]*))?\)/,tl=/:(.*)$/,el=/^:|^v-bind:/,il=/\.[^.]+/g,nl=g(vn),rl=/^xmlns:NS\d+/,sl=/^NS\d+:/,ol=g(Wn),al=/^\s*([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/,ll=/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?']|\[".*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*\s*$/,ul={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},cl=function(t){return"if("+t+")return null;"},hl={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:cl("$event.target !== $event.currentTarget"),ctrl:cl("!$event.ctrlKey"),shift:cl("!$event.shiftKey"),alt:cl("!$event.altKey"),meta:cl("!$event.metaKey"),left:cl("'button' in $event && $event.button !== 0"),middle:cl("'button' in $event && $event.button !== 1"),right:cl("'button' in $event && $event.button !== 2")},dl={bind:Jn,cloak:b},pl=(new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),new RegExp("\\b"+"delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b")+"\\s*\\([^\\)]*\\)"),{staticKeys:["staticClass"],transformNode:kr,genData:Tr}),fl={staticKeys:["staticStyle"],transformNode:Dr,genData:Sr},gl=[pl,fl],ml={model:Ci,text:Ar,html:Er},vl={expectHTML:!0,modules:gl,directives:ml,isPreTag:fo,isUnaryTag:la,mustUseProp:no,canBeLeftOpenTag:ua,isReservedTag:go,getTagNamespace:Oe,staticKeys:function(t){return t.reduce(function(t,e){return t.concat(e.staticKeys||[])},[]).join(",")}(gl)},_l=function(t){function e(e,i){var n=Object.create(t),r=[],s=[];if(n.warn=function(t,e){(e?s:r).push(t)},i){i.modules&&(n.modules=(t.modules||[]).concat(i.modules)),i.directives&&(n.directives=_(Object.create(t.directives),i.directives));for(var o in i)"modules"!==o&&"directives"!==o&&(n[o]=i[o])}var a=xr(e,n);return a.errors=r,a.tips=s,a}function i(t,i,r){i=i||{};var s=i.delimiters?String(i.delimiters)+t:t;if(n[s])return n[s];var o=e(t,i),a={},l=[];a.render=Cr(o.render,l);var u=o.staticRenderFns.length;a.staticRenderFns=new Array(u);for(var c=0;c<u;c++)a.staticRenderFns[c]=Cr(o.staticRenderFns[c],l);return n[s]=a}var n=Object.create(null);return{compile:e,compileToFunctions:i}}(vl),yl=_l.compileToFunctions,bl=g(function(t){var e=Ne(t);return e&&e.innerHTML}),wl=me.prototype.$mount;me.prototype.$mount=function(t,e){if((t=t&&Ne(t))===document.body||t===document.documentElement)return this;var i=this.$options;if(!i.render){var n=i.template;if(n)if("string"==typeof n)"#"===n.charAt(0)&&(n=bl(n));else{if(!n.nodeType)return this;n=n.innerHTML}else t&&(n=Ir(t));if(n){var r=yl(n,{shouldDecodeNewlines:aa,delimiters:i.delimiters},this),s=r.render,o=r.staticRenderFns;i.render=s,i.staticRenderFns=o}}return wl.call(this,t,e)},me.compile=yl,t.exports=me}).call(e,i(4))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){},,function(t,e,i){t.exports=i(5)}]);
        +//# sourceMappingURL=vue.js.map
        \ No newline at end of file
        diff --git a/build/vue.js.map b/build/vue.js.map
        new file mode 100644
        index 0000000000..1ed2822c41
        --- /dev/null
        +++ b/build/vue.js.map
        @@ -0,0 +1 @@
        +{"version":3,"file":"/vue.js","sources":["webpack:////vue.js"],"sourcesContent":["!function(t){function e(n){if(i[n])return i[n].exports;var r=i[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var i={};e.m=t,e.c=i,e.i=function(t){return t},e.d=function(t,i,n){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,\"a\",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=63)}([function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e<this.length;e++){var i=this[e];i[2]?t.push(\"@media \"+i[2]+\"{\"+i[1]+\"}\"):t.push(i[1])}return t.join(\"\")},t.i=function(e,i){\"string\"==typeof e&&(e=[[null,e,\"\"]]);for(var n={},r=0;r<this.length;r++){var s=this[r][0];\"number\"==typeof s&&(n[s]=!0)}for(r=0;r<e.length;r++){var o=e[r];\"number\"==typeof o[0]&&n[o[0]]||(i&&!o[2]?o[2]=i:i&&(o[2]=\"(\"+o[2]+\") and (\"+i+\")\"),t.push(o))}},t}},function(t,e){t.exports=function(t,e,i,n){var r,s=t=t||{},o=typeof t.default;\"object\"!==o&&\"function\"!==o||(r=t,s=t.default);var a=\"function\"==typeof s?s.options:s;if(e&&(a.render=e.render,a.staticRenderFns=e.staticRenderFns),i&&(a._scopeId=i),n){var l=Object.create(a.computed||null);Object.keys(n).forEach(function(t){var e=n[t];l[t]=function(){return e}}),a.computed=l}return{esModule:r,exports:s,options:a}}},function(t,e,i){function n(t){for(var e=0;e<t.length;e++){var i=t[e],n=c[i.id];if(n){n.refs++;for(var r=0;r<n.parts.length;r++)n.parts[r](i.parts[r]);for(;r<i.parts.length;r++)n.parts.push(s(i.parts[r]));n.parts.length>i.parts.length&&(n.parts.length=i.parts.length)}else{for(var o=[],r=0;r<i.parts.length;r++)o.push(s(i.parts[r]));c[i.id]={id:i.id,refs:1,parts:o}}}}function r(){var t=document.createElement(\"style\");return t.type=\"text/css\",h.appendChild(t),t}function s(t){var e,i,n=document.querySelector('style[data-vue-ssr-id~=\"'+t.id+'\"]');if(n){if(f)return g;n.parentNode.removeChild(n)}if(m){var s=p++;n=d||(d=r()),e=o.bind(null,n,s,!1),i=o.bind(null,n,s,!0)}else n=r(),e=a.bind(null,n),i=function(){n.parentNode.removeChild(n)};return e(t),function(n){if(n){if(n.css===t.css&&n.media===t.media&&n.sourceMap===t.sourceMap)return;e(t=n)}else i()}}function o(t,e,i,n){var r=i?\"\":n.css;if(t.styleSheet)t.styleSheet.cssText=v(e,r);else{var s=document.createTextNode(r),o=t.childNodes;o[e]&&t.removeChild(o[e]),o.length?t.insertBefore(s,o[e]):t.appendChild(s)}}function a(t,e){var i=e.css,n=e.media,r=e.sourceMap;if(n&&t.setAttribute(\"media\",n),r&&(i+=\"\\n/*# sourceURL=\"+r.sources[0]+\" */\",i+=\"\\n/*# sourceMappingURL=data:application/json;base64,\"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+\" */\"),t.styleSheet)t.styleSheet.cssText=i;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(i))}}var l=\"undefined\"!=typeof document;if(\"undefined\"!=typeof DEBUG&&DEBUG&&!l)throw new Error(\"vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\");var u=i(58),c={},h=l&&(document.head||document.getElementsByTagName(\"head\")[0]),d=null,p=0,f=!1,g=function(){},m=\"undefined\"!=typeof navigator&&/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());t.exports=function(t,e,i){f=i;var r=u(t,e);return n(r),function(e){for(var i=[],s=0;s<r.length;s++){var o=r[s],a=c[o.id];a.refs--,i.push(a)}e?(r=u(t,e),n(r)):r=[];for(var s=0;s<i.length;s++){var a=i[s];if(0===a.refs){for(var l=0;l<a.parts.length;l++)a.parts[l]();delete c[a.id]}}}};var v=function(){var t=[];return function(e,i){return t[e]=i,t.filter(Boolean).join(\"\\n\")}}()},function(t,e,i){var n,r;/*!\n * jQuery JavaScript Library v3.2.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2017-03-20T18:59Z\n */\n!function(e,i){\"use strict\";\"object\"==typeof t&&\"object\"==typeof t.exports?t.exports=e.document?i(e,!0):function(t){if(!t.document)throw new Error(\"jQuery requires a window with a document\");return i(t)}:i(e)}(\"undefined\"!=typeof window?window:this,function(i,s){\"use strict\";function o(t,e){e=e||ot;var i=e.createElement(\"script\");i.text=t,e.head.appendChild(i).parentNode.removeChild(i)}function a(t){var e=!!t&&\"length\"in t&&t.length,i=_t.type(t);return\"function\"!==i&&!_t.isWindow(t)&&(\"array\"===i||0===e||\"number\"==typeof e&&e>0&&e-1 in t)}function l(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}function u(t,e,i){return _t.isFunction(e)?_t.grep(t,function(t,n){return!!e.call(t,n,t)!==i}):e.nodeType?_t.grep(t,function(t){return t===e!==i}):\"string\"!=typeof e?_t.grep(t,function(t){return ht.call(e,t)>-1!==i}):At.test(e)?_t.filter(e,t,i):(e=_t.filter(e,t),_t.grep(t,function(t){return ht.call(e,t)>-1!==i&&1===t.nodeType}))}function c(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}function h(t){var e={};return _t.each(t.match(Pt)||[],function(t,i){e[i]=!0}),e}function d(t){return t}function p(t){throw t}function f(t,e,i,n){var r;try{t&&_t.isFunction(r=t.promise)?r.call(t).done(e).fail(i):t&&_t.isFunction(r=t.then)?r.call(t,e,i):e.apply(void 0,[t].slice(n))}catch(t){i.apply(void 0,[t])}}function g(){ot.removeEventListener(\"DOMContentLoaded\",g),i.removeEventListener(\"load\",g),_t.ready()}function m(){this.expando=_t.expando+m.uid++}function v(t){return\"true\"===t||\"false\"!==t&&(\"null\"===t?null:t===+t+\"\"?+t:Ft.test(t)?JSON.parse(t):t)}function _(t,e,i){var n;if(void 0===i&&1===t.nodeType)if(n=\"data-\"+e.replace(zt,\"-$&\").toLowerCase(),\"string\"==typeof(i=t.getAttribute(n))){try{i=v(i)}catch(t){}Lt.set(t,e,i)}else i=void 0;return i}function y(t,e,i,n){var r,s=1,o=20,a=n?function(){return n.cur()}:function(){return _t.css(t,e,\"\")},l=a(),u=i&&i[3]||(_t.cssNumber[e]?\"\":\"px\"),c=(_t.cssNumber[e]||\"px\"!==u&&+l)&&qt.exec(_t.css(t,e));if(c&&c[3]!==u){u=u||c[3],i=i||[],c=+l||1;do{s=s||\".5\",c/=s,_t.style(t,e,c+u)}while(s!==(s=a()/l)&&1!==s&&--o)}return i&&(c=+c||+l||0,r=i[1]?c+(i[1]+1)*i[2]:+i[2],n&&(n.unit=u,n.start=c,n.end=r)),r}function b(t){var e,i=t.ownerDocument,n=t.nodeName,r=Vt[n];return r||(e=i.body.appendChild(i.createElement(n)),r=_t.css(e,\"display\"),e.parentNode.removeChild(e),\"none\"===r&&(r=\"block\"),Vt[n]=r,r)}function w(t,e){for(var i,n,r=[],s=0,o=t.length;s<o;s++)n=t[s],n.style&&(i=n.style.display,e?(\"none\"===i&&(r[s]=Rt.get(n,\"display\")||null,r[s]||(n.style.display=\"\")),\"\"===n.style.display&&Ut(n)&&(r[s]=b(n))):\"none\"!==i&&(r[s]=\"none\",Rt.set(n,\"display\",i)));for(s=0;s<o;s++)null!=r[s]&&(t[s].style.display=r[s]);return t}function x(t,e){var i;return i=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||\"*\"):void 0!==t.querySelectorAll?t.querySelectorAll(e||\"*\"):[],void 0===e||e&&l(t,e)?_t.merge([t],i):i}function C(t,e){for(var i=0,n=t.length;i<n;i++)Rt.set(t[i],\"globalEval\",!e||Rt.get(e[i],\"globalEval\"))}function k(t,e,i,n,r){for(var s,o,a,l,u,c,h=e.createDocumentFragment(),d=[],p=0,f=t.length;p<f;p++)if((s=t[p])||0===s)if(\"object\"===_t.type(s))_t.merge(d,s.nodeType?[s]:s);else if(Jt.test(s)){for(o=o||h.appendChild(e.createElement(\"div\")),a=(Xt.exec(s)||[\"\",\"\"])[1].toLowerCase(),l=Zt[a]||Zt._default,o.innerHTML=l[1]+_t.htmlPrefilter(s)+l[2],c=l[0];c--;)o=o.lastChild;_t.merge(d,o.childNodes),o=h.firstChild,o.textContent=\"\"}else d.push(e.createTextNode(s));for(h.textContent=\"\",p=0;s=d[p++];)if(n&&_t.inArray(s,n)>-1)r&&r.push(s);else if(u=_t.contains(s.ownerDocument,s),o=x(h.appendChild(s),\"script\"),u&&C(o),i)for(c=0;s=o[c++];)Gt.test(s.type||\"\")&&i.push(s);return h}function T(){return!0}function D(){return!1}function S(){try{return ot.activeElement}catch(t){}}function A(t,e,i,n,r,s){var o,a;if(\"object\"==typeof e){\"string\"!=typeof i&&(n=n||i,i=void 0);for(a in e)A(t,a,i,n,e[a],s);return t}if(null==n&&null==r?(r=i,n=i=void 0):null==r&&(\"string\"==typeof i?(r=n,n=void 0):(r=n,n=i,i=void 0)),!1===r)r=D;else if(!r)return t;return 1===s&&(o=r,r=function(t){return _t().off(t),o.apply(this,arguments)},r.guid=o.guid||(o.guid=_t.guid++)),t.each(function(){_t.event.add(this,e,r,n,i)})}function E(t,e){return l(t,\"table\")&&l(11!==e.nodeType?e:e.firstChild,\"tr\")?_t(\">tbody\",t)[0]||t:t}function I(t){return t.type=(null!==t.getAttribute(\"type\"))+\"/\"+t.type,t}function $(t){var e=oe.exec(t.type);return e?t.type=e[1]:t.removeAttribute(\"type\"),t}function O(t,e){var i,n,r,s,o,a,l,u;if(1===e.nodeType){if(Rt.hasData(t)&&(s=Rt.access(t),o=Rt.set(e,s),u=s.events)){delete o.handle,o.events={};for(r in u)for(i=0,n=u[r].length;i<n;i++)_t.event.add(e,r,u[r][i])}Lt.hasData(t)&&(a=Lt.access(t),l=_t.extend({},a),Lt.set(e,l))}}function P(t,e){var i=e.nodeName.toLowerCase();\"input\"===i&&Kt.test(t.type)?e.checked=t.checked:\"input\"!==i&&\"textarea\"!==i||(e.defaultValue=t.defaultValue)}function N(t,e,i,n){e=ut.apply([],e);var r,s,a,l,u,c,h=0,d=t.length,p=d-1,f=e[0],g=_t.isFunction(f);if(g||d>1&&\"string\"==typeof f&&!vt.checkClone&&se.test(f))return t.each(function(r){var s=t.eq(r);g&&(e[0]=f.call(this,r,s.html())),N(s,e,i,n)});if(d&&(r=k(e,t[0].ownerDocument,!1,t,n),s=r.firstChild,1===r.childNodes.length&&(r=s),s||n)){for(a=_t.map(x(r,\"script\"),I),l=a.length;h<d;h++)u=r,h!==p&&(u=_t.clone(u,!0,!0),l&&_t.merge(a,x(u,\"script\"))),i.call(t[h],u,h);if(l)for(c=a[a.length-1].ownerDocument,_t.map(a,$),h=0;h<l;h++)u=a[h],Gt.test(u.type||\"\")&&!Rt.access(u,\"globalEval\")&&_t.contains(c,u)&&(u.src?_t._evalUrl&&_t._evalUrl(u.src):o(u.textContent.replace(ae,\"\"),c))}return t}function M(t,e,i){for(var n,r=e?_t.filter(e,t):t,s=0;null!=(n=r[s]);s++)i||1!==n.nodeType||_t.cleanData(x(n)),n.parentNode&&(i&&_t.contains(n.ownerDocument,n)&&C(x(n,\"script\")),n.parentNode.removeChild(n));return t}function j(t,e,i){var n,r,s,o,a=t.style;return i=i||ce(t),i&&(o=i.getPropertyValue(e)||i[e],\"\"!==o||_t.contains(t.ownerDocument,t)||(o=_t.style(t,e)),!vt.pixelMarginRight()&&ue.test(o)&&le.test(e)&&(n=a.width,r=a.minWidth,s=a.maxWidth,a.minWidth=a.maxWidth=a.width=o,o=i.width,a.width=n,a.minWidth=r,a.maxWidth=s)),void 0!==o?o+\"\":o}function H(t,e){return{get:function(){return t()?void delete this.get:(this.get=e).apply(this,arguments)}}}function R(t){if(t in me)return t;for(var e=t[0].toUpperCase()+t.slice(1),i=ge.length;i--;)if((t=ge[i]+e)in me)return t}function L(t){var e=_t.cssProps[t];return e||(e=_t.cssProps[t]=R(t)||t),e}function F(t,e,i){var n=qt.exec(e);return n?Math.max(0,n[2]-(i||0))+(n[3]||\"px\"):e}function z(t,e,i,n,r){var s,o=0;for(s=i===(n?\"border\":\"content\")?4:\"width\"===e?1:0;s<4;s+=2)\"margin\"===i&&(o+=_t.css(t,i+Bt[s],!0,r)),n?(\"content\"===i&&(o-=_t.css(t,\"padding\"+Bt[s],!0,r)),\"margin\"!==i&&(o-=_t.css(t,\"border\"+Bt[s]+\"Width\",!0,r))):(o+=_t.css(t,\"padding\"+Bt[s],!0,r),\"padding\"!==i&&(o+=_t.css(t,\"border\"+Bt[s]+\"Width\",!0,r)));return o}function W(t,e,i){var n,r=ce(t),s=j(t,e,r),o=\"border-box\"===_t.css(t,\"boxSizing\",!1,r);return ue.test(s)?s:(n=o&&(vt.boxSizingReliable()||s===t.style[e]),\"auto\"===s&&(s=t[\"offset\"+e[0].toUpperCase()+e.slice(1)]),(s=parseFloat(s)||0)+z(t,e,i||(o?\"border\":\"content\"),n,r)+\"px\")}function q(t,e,i,n,r){return new q.prototype.init(t,e,i,n,r)}function B(){_e&&(!1===ot.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(B):i.setTimeout(B,_t.fx.interval),_t.fx.tick())}function U(){return i.setTimeout(function(){ve=void 0}),ve=_t.now()}function Y(t,e){var i,n=0,r={height:t};for(e=e?1:0;n<4;n+=2-e)i=Bt[n],r[\"margin\"+i]=r[\"padding\"+i]=t;return e&&(r.opacity=r.width=t),r}function V(t,e,i){for(var n,r=(G.tweeners[e]||[]).concat(G.tweeners[\"*\"]),s=0,o=r.length;s<o;s++)if(n=r[s].call(i,e,t))return n}function K(t,e,i){var n,r,s,o,a,l,u,c,h=\"width\"in e||\"height\"in e,d=this,p={},f=t.style,g=t.nodeType&&Ut(t),m=Rt.get(t,\"fxshow\");i.queue||(o=_t._queueHooks(t,\"fx\"),null==o.unqueued&&(o.unqueued=0,a=o.empty.fire,o.empty.fire=function(){o.unqueued||a()}),o.unqueued++,d.always(function(){d.always(function(){o.unqueued--,_t.queue(t,\"fx\").length||o.empty.fire()})}));for(n in e)if(r=e[n],ye.test(r)){if(delete e[n],s=s||\"toggle\"===r,r===(g?\"hide\":\"show\")){if(\"show\"!==r||!m||void 0===m[n])continue;g=!0}p[n]=m&&m[n]||_t.style(t,n)}if((l=!_t.isEmptyObject(e))||!_t.isEmptyObject(p)){h&&1===t.nodeType&&(i.overflow=[f.overflow,f.overflowX,f.overflowY],u=m&&m.display,null==u&&(u=Rt.get(t,\"display\")),c=_t.css(t,\"display\"),\"none\"===c&&(u?c=u:(w([t],!0),u=t.style.display||u,c=_t.css(t,\"display\"),w([t]))),(\"inline\"===c||\"inline-block\"===c&&null!=u)&&\"none\"===_t.css(t,\"float\")&&(l||(d.done(function(){f.display=u}),null==u&&(c=f.display,u=\"none\"===c?\"\":c)),f.display=\"inline-block\")),i.overflow&&(f.overflow=\"hidden\",d.always(function(){f.overflow=i.overflow[0],f.overflowX=i.overflow[1],f.overflowY=i.overflow[2]})),l=!1;for(n in p)l||(m?\"hidden\"in m&&(g=m.hidden):m=Rt.access(t,\"fxshow\",{display:u}),s&&(m.hidden=!g),g&&w([t],!0),d.done(function(){g||w([t]),Rt.remove(t,\"fxshow\");for(n in p)_t.style(t,n,p[n])})),l=V(g?m[n]:0,n,d),n in m||(m[n]=l.start,g&&(l.end=l.start,l.start=0))}}function X(t,e){var i,n,r,s,o;for(i in t)if(n=_t.camelCase(i),r=e[n],s=t[i],Array.isArray(s)&&(r=s[1],s=t[i]=s[0]),i!==n&&(t[n]=s,delete t[i]),(o=_t.cssHooks[n])&&\"expand\"in o){s=o.expand(s),delete t[n];for(i in s)i in t||(t[i]=s[i],e[i]=r)}else e[n]=r}function G(t,e,i){var n,r,s=0,o=G.prefilters.length,a=_t.Deferred().always(function(){delete l.elem}),l=function(){if(r)return!1;for(var e=ve||U(),i=Math.max(0,u.startTime+u.duration-e),n=i/u.duration||0,s=1-n,o=0,l=u.tweens.length;o<l;o++)u.tweens[o].run(s);return a.notifyWith(t,[u,s,i]),s<1&&l?i:(l||a.notifyWith(t,[u,1,0]),a.resolveWith(t,[u]),!1)},u=a.promise({elem:t,props:_t.extend({},e),opts:_t.extend(!0,{specialEasing:{},easing:_t.easing._default},i),originalProperties:e,originalOptions:i,startTime:ve||U(),duration:i.duration,tweens:[],createTween:function(e,i){var n=_t.Tween(t,u.opts,e,i,u.opts.specialEasing[e]||u.opts.easing);return u.tweens.push(n),n},stop:function(e){var i=0,n=e?u.tweens.length:0;if(r)return this;for(r=!0;i<n;i++)u.tweens[i].run(1);return e?(a.notifyWith(t,[u,1,0]),a.resolveWith(t,[u,e])):a.rejectWith(t,[u,e]),this}}),c=u.props;for(X(c,u.opts.specialEasing);s<o;s++)if(n=G.prefilters[s].call(u,t,c,u.opts))return _t.isFunction(n.stop)&&(_t._queueHooks(u.elem,u.opts.queue).stop=_t.proxy(n.stop,n)),n;return _t.map(c,V,u),_t.isFunction(u.opts.start)&&u.opts.start.call(t,u),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always),_t.fx.timer(_t.extend(l,{elem:t,anim:u,queue:u.opts.queue})),u}function Z(t){return(t.match(Pt)||[]).join(\" \")}function J(t){return t.getAttribute&&t.getAttribute(\"class\")||\"\"}function Q(t,e,i,n){var r;if(Array.isArray(e))_t.each(e,function(e,r){i||Ie.test(t)?n(t,r):Q(t+\"[\"+(\"object\"==typeof r&&null!=r?e:\"\")+\"]\",r,i,n)});else if(i||\"object\"!==_t.type(e))n(t,e);else for(r in e)Q(t+\"[\"+r+\"]\",e[r],i,n)}function tt(t){return function(e,i){\"string\"!=typeof e&&(i=e,e=\"*\");var n,r=0,s=e.toLowerCase().match(Pt)||[];if(_t.isFunction(i))for(;n=s[r++];)\"+\"===n[0]?(n=n.slice(1)||\"*\",(t[n]=t[n]||[]).unshift(i)):(t[n]=t[n]||[]).push(i)}}function et(t,e,i,n){function r(a){var l;return s[a]=!0,_t.each(t[a]||[],function(t,a){var u=a(e,i,n);return\"string\"!=typeof u||o||s[u]?o?!(l=u):void 0:(e.dataTypes.unshift(u),r(u),!1)}),l}var s={},o=t===We;return r(e.dataTypes[0])||!s[\"*\"]&&r(\"*\")}function it(t,e){var i,n,r=_t.ajaxSettings.flatOptions||{};for(i in e)void 0!==e[i]&&((r[i]?t:n||(n={}))[i]=e[i]);return n&&_t.extend(!0,t,n),t}function nt(t,e,i){for(var n,r,s,o,a=t.contents,l=t.dataTypes;\"*\"===l[0];)l.shift(),void 0===n&&(n=t.mimeType||e.getResponseHeader(\"Content-Type\"));if(n)for(r in a)if(a[r]&&a[r].test(n)){l.unshift(r);break}if(l[0]in i)s=l[0];else{for(r in i){if(!l[0]||t.converters[r+\" \"+l[0]]){s=r;break}o||(o=r)}s=s||o}if(s)return s!==l[0]&&l.unshift(s),i[s]}function rt(t,e,i,n){var r,s,o,a,l,u={},c=t.dataTypes.slice();if(c[1])for(o in t.converters)u[o.toLowerCase()]=t.converters[o];for(s=c.shift();s;)if(t.responseFields[s]&&(i[t.responseFields[s]]=e),!l&&n&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=s,s=c.shift())if(\"*\"===s)s=l;else if(\"*\"!==l&&l!==s){if(!(o=u[l+\" \"+s]||u[\"* \"+s]))for(r in u)if(a=r.split(\" \"),a[1]===s&&(o=u[l+\" \"+a[0]]||u[\"* \"+a[0]])){!0===o?o=u[r]:!0!==u[r]&&(s=a[0],c.unshift(a[1]));break}if(!0!==o)if(o&&t.throws)e=o(e);else try{e=o(e)}catch(t){return{state:\"parsererror\",error:o?t:\"No conversion from \"+l+\" to \"+s}}}return{state:\"success\",data:e}}var st=[],ot=i.document,at=Object.getPrototypeOf,lt=st.slice,ut=st.concat,ct=st.push,ht=st.indexOf,dt={},pt=dt.toString,ft=dt.hasOwnProperty,gt=ft.toString,mt=gt.call(Object),vt={},_t=function(t,e){return new _t.fn.init(t,e)},yt=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,bt=/^-ms-/,wt=/-([a-z])/g,xt=function(t,e){return e.toUpperCase()};_t.fn=_t.prototype={jquery:\"3.2.1\",constructor:_t,length:0,toArray:function(){return lt.call(this)},get:function(t){return null==t?lt.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=_t.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return _t.each(this,t)},map:function(t){return this.pushStack(_t.map(this,function(e,i){return t.call(e,i,e)}))},slice:function(){return this.pushStack(lt.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){var e=this.length,i=+t+(t<0?e:0);return this.pushStack(i>=0&&i<e?[this[i]]:[])},end:function(){return this.prevObject||this.constructor()},push:ct,sort:st.sort,splice:st.splice},_t.extend=_t.fn.extend=function(){var t,e,i,n,r,s,o=arguments[0]||{},a=1,l=arguments.length,u=!1;for(\"boolean\"==typeof o&&(u=o,o=arguments[a]||{},a++),\"object\"==typeof o||_t.isFunction(o)||(o={}),a===l&&(o=this,a--);a<l;a++)if(null!=(t=arguments[a]))for(e in t)i=o[e],n=t[e],o!==n&&(u&&n&&(_t.isPlainObject(n)||(r=Array.isArray(n)))?(r?(r=!1,s=i&&Array.isArray(i)?i:[]):s=i&&_t.isPlainObject(i)?i:{},o[e]=_t.extend(u,s,n)):void 0!==n&&(o[e]=n));return o},_t.extend({expando:\"jQuery\"+(\"3.2.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(t){throw new Error(t)},noop:function(){},isFunction:function(t){return\"function\"===_t.type(t)},isWindow:function(t){return null!=t&&t===t.window},isNumeric:function(t){var e=_t.type(t);return(\"number\"===e||\"string\"===e)&&!isNaN(t-parseFloat(t))},isPlainObject:function(t){var e,i;return!(!t||\"[object Object]\"!==pt.call(t))&&(!(e=at(t))||\"function\"==typeof(i=ft.call(e,\"constructor\")&&e.constructor)&&gt.call(i)===mt)},isEmptyObject:function(t){var e;for(e in t)return!1;return!0},type:function(t){return null==t?t+\"\":\"object\"==typeof t||\"function\"==typeof t?dt[pt.call(t)]||\"object\":typeof t},globalEval:function(t){o(t)},camelCase:function(t){return t.replace(bt,\"ms-\").replace(wt,xt)},each:function(t,e){var i,n=0;if(a(t))for(i=t.length;n<i&&!1!==e.call(t[n],n,t[n]);n++);else for(n in t)if(!1===e.call(t[n],n,t[n]))break;return t},trim:function(t){return null==t?\"\":(t+\"\").replace(yt,\"\")},makeArray:function(t,e){var i=e||[];return null!=t&&(a(Object(t))?_t.merge(i,\"string\"==typeof t?[t]:t):ct.call(i,t)),i},inArray:function(t,e,i){return null==e?-1:ht.call(e,t,i)},merge:function(t,e){for(var i=+e.length,n=0,r=t.length;n<i;n++)t[r++]=e[n];return t.length=r,t},grep:function(t,e,i){for(var n=[],r=0,s=t.length,o=!i;r<s;r++)!e(t[r],r)!==o&&n.push(t[r]);return n},map:function(t,e,i){var n,r,s=0,o=[];if(a(t))for(n=t.length;s<n;s++)null!=(r=e(t[s],s,i))&&o.push(r);else for(s in t)null!=(r=e(t[s],s,i))&&o.push(r);return ut.apply([],o)},guid:1,proxy:function(t,e){var i,n,r;if(\"string\"==typeof e&&(i=t[e],e=t,t=i),_t.isFunction(t))return n=lt.call(arguments,2),r=function(){return t.apply(e||this,n.concat(lt.call(arguments)))},r.guid=t.guid=t.guid||_t.guid++,r},now:Date.now,support:vt}),\"function\"==typeof Symbol&&(_t.fn[Symbol.iterator]=st[Symbol.iterator]),_t.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(t,e){dt[\"[object \"+e+\"]\"]=e.toLowerCase()});var Ct=/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\nfunction(t){function e(t,e,i,n){var r,s,o,a,l,c,d,p=e&&e.ownerDocument,f=e?e.nodeType:9;if(i=i||[],\"string\"!=typeof t||!t||1!==f&&9!==f&&11!==f)return i;if(!n&&((e?e.ownerDocument||e:L)!==$&&I(e),e=e||$,P)){if(11!==f&&(l=gt.exec(t)))if(r=l[1]){if(9===f){if(!(o=e.getElementById(r)))return i;if(o.id===r)return i.push(o),i}else if(p&&(o=p.getElementById(r))&&H(e,o)&&o.id===r)return i.push(o),i}else{if(l[2])return G.apply(i,e.getElementsByTagName(t)),i;if((r=l[3])&&b.getElementsByClassName&&e.getElementsByClassName)return G.apply(i,e.getElementsByClassName(r)),i}if(b.qsa&&!B[t+\" \"]&&(!N||!N.test(t))){if(1!==f)p=e,d=t;else if(\"object\"!==e.nodeName.toLowerCase()){for((a=e.getAttribute(\"id\"))?a=a.replace(yt,bt):e.setAttribute(\"id\",a=R),c=k(t),s=c.length;s--;)c[s]=\"#\"+a+\" \"+h(c[s]);d=c.join(\",\"),p=mt.test(t)&&u(e.parentNode)||e}if(d)try{return G.apply(i,p.querySelectorAll(d)),i}catch(t){}finally{a===R&&e.removeAttribute(\"id\")}}}return D(t.replace(st,\"$1\"),e,i,n)}function i(){function t(i,n){return e.push(i+\" \")>w.cacheLength&&delete t[e.shift()],t[i+\" \"]=n}var e=[];return t}function n(t){return t[R]=!0,t}function r(t){var e=$.createElement(\"fieldset\");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function s(t,e){for(var i=t.split(\"|\"),n=i.length;n--;)w.attrHandle[i[n]]=e}function o(t,e){var i=e&&t,n=i&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(n)return n;if(i)for(;i=i.nextSibling;)if(i===e)return-1;return t?1:-1}function a(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&xt(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function l(t){return n(function(e){return e=+e,n(function(i,n){for(var r,s=t([],i.length,e),o=s.length;o--;)i[r=s[o]]&&(i[r]=!(n[r]=i[r]))})})}function u(t){return t&&void 0!==t.getElementsByTagName&&t}function c(){}function h(t){for(var e=0,i=t.length,n=\"\";e<i;e++)n+=t[e].value;return n}function d(t,e,i){var n=e.dir,r=e.next,s=r||n,o=i&&\"parentNode\"===s,a=z++;return e.first?function(e,i,r){for(;e=e[n];)if(1===e.nodeType||o)return t(e,i,r);return!1}:function(e,i,l){var u,c,h,d=[F,a];if(l){for(;e=e[n];)if((1===e.nodeType||o)&&t(e,i,l))return!0}else for(;e=e[n];)if(1===e.nodeType||o)if(h=e[R]||(e[R]={}),c=h[e.uniqueID]||(h[e.uniqueID]={}),r&&r===e.nodeName.toLowerCase())e=e[n]||e;else{if((u=c[s])&&u[0]===F&&u[1]===a)return d[2]=u[2];if(c[s]=d,d[2]=t(e,i,l))return!0}return!1}}function p(t){return t.length>1?function(e,i,n){for(var r=t.length;r--;)if(!t[r](e,i,n))return!1;return!0}:t[0]}function f(t,i,n){for(var r=0,s=i.length;r<s;r++)e(t,i[r],n);return n}function g(t,e,i,n,r){for(var s,o=[],a=0,l=t.length,u=null!=e;a<l;a++)(s=t[a])&&(i&&!i(s,n,r)||(o.push(s),u&&e.push(a)));return o}function m(t,e,i,r,s,o){return r&&!r[R]&&(r=m(r)),s&&!s[R]&&(s=m(s,o)),n(function(n,o,a,l){var u,c,h,d=[],p=[],m=o.length,v=n||f(e||\"*\",a.nodeType?[a]:a,[]),_=!t||!n&&e?v:g(v,d,t,a,l),y=i?s||(n?t:m||r)?[]:o:_;if(i&&i(_,y,a,l),r)for(u=g(y,p),r(u,[],a,l),c=u.length;c--;)(h=u[c])&&(y[p[c]]=!(_[p[c]]=h));if(n){if(s||t){if(s){for(u=[],c=y.length;c--;)(h=y[c])&&u.push(_[c]=h);s(null,y=[],u,l)}for(c=y.length;c--;)(h=y[c])&&(u=s?J(n,h):d[c])>-1&&(n[u]=!(o[u]=h))}}else y=g(y===o?y.splice(m,y.length):y),s?s(null,o,y,l):G.apply(o,y)})}function v(t){for(var e,i,n,r=t.length,s=w.relative[t[0].type],o=s||w.relative[\" \"],a=s?1:0,l=d(function(t){return t===e},o,!0),u=d(function(t){return J(e,t)>-1},o,!0),c=[function(t,i,n){var r=!s&&(n||i!==S)||((e=i).nodeType?l(t,i,n):u(t,i,n));return e=null,r}];a<r;a++)if(i=w.relative[t[a].type])c=[d(p(c),i)];else{if(i=w.filter[t[a].type].apply(null,t[a].matches),i[R]){for(n=++a;n<r&&!w.relative[t[n].type];n++);return m(a>1&&p(c),a>1&&h(t.slice(0,a-1).concat({value:\" \"===t[a-2].type?\"*\":\"\"})).replace(st,\"$1\"),i,a<n&&v(t.slice(a,n)),n<r&&v(t=t.slice(n)),n<r&&h(t))}c.push(i)}return p(c)}function _(t,i){var r=i.length>0,s=t.length>0,o=function(n,o,a,l,u){var c,h,d,p=0,f=\"0\",m=n&&[],v=[],_=S,y=n||s&&w.find.TAG(\"*\",u),b=F+=null==_?1:Math.random()||.1,x=y.length;for(u&&(S=o===$||o||u);f!==x&&null!=(c=y[f]);f++){if(s&&c){for(h=0,o||c.ownerDocument===$||(I(c),a=!P);d=t[h++];)if(d(c,o||$,a)){l.push(c);break}u&&(F=b)}r&&((c=!d&&c)&&p--,n&&m.push(c))}if(p+=f,r&&f!==p){for(h=0;d=i[h++];)d(m,v,o,a);if(n){if(p>0)for(;f--;)m[f]||v[f]||(v[f]=K.call(l));v=g(v)}G.apply(l,v),u&&!n&&v.length>0&&p+i.length>1&&e.uniqueSort(l)}return u&&(F=b,S=_),m};return r?n(o):o}var y,b,w,x,C,k,T,D,S,A,E,I,$,O,P,N,M,j,H,R=\"sizzle\"+1*new Date,L=t.document,F=0,z=0,W=i(),q=i(),B=i(),U=function(t,e){return t===e&&(E=!0),0},Y={}.hasOwnProperty,V=[],K=V.pop,X=V.push,G=V.push,Z=V.slice,J=function(t,e){for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i;return-1},Q=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",tt=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",et=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",it=\"\\\\[\"+tt+\"*(\"+et+\")(?:\"+tt+\"*([*^$|!~]?=)\"+tt+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+et+\"))|)\"+tt+\"*\\\\]\",nt=\":(\"+et+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+it+\")*)|.*)\\\\)|)\",rt=new RegExp(tt+\"+\",\"g\"),st=new RegExp(\"^\"+tt+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+tt+\"+$\",\"g\"),ot=new RegExp(\"^\"+tt+\"*,\"+tt+\"*\"),at=new RegExp(\"^\"+tt+\"*([>+~]|\"+tt+\")\"+tt+\"*\"),lt=new RegExp(\"=\"+tt+\"*([^\\\\]'\\\"]*?)\"+tt+\"*\\\\]\",\"g\"),ut=new RegExp(nt),ct=new RegExp(\"^\"+et+\"$\"),ht={ID:new RegExp(\"^#(\"+et+\")\"),CLASS:new RegExp(\"^\\\\.(\"+et+\")\"),TAG:new RegExp(\"^(\"+et+\"|[*])\"),ATTR:new RegExp(\"^\"+it),PSEUDO:new RegExp(\"^\"+nt),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+tt+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+tt+\"*(?:([+-]|)\"+tt+\"*(\\\\d+)|))\"+tt+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+Q+\")$\",\"i\"),needsContext:new RegExp(\"^\"+tt+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+tt+\"*((?:-\\\\d)?\\\\d*)\"+tt+\"*\\\\)|)(?=[^-]|$)\",\"i\")},dt=/^(?:input|select|textarea|button)$/i,pt=/^h\\d$/i,ft=/^[^{]+\\{\\s*\\[native \\w/,gt=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,mt=/[+~]/,vt=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+tt+\"?|(\"+tt+\")|.)\",\"ig\"),_t=function(t,e,i){var n=\"0x\"+e-65536;return n!==n||i?e:n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320)},yt=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,bt=function(t,e){return e?\"\\0\"===t?\"�\":t.slice(0,-1)+\"\\\\\"+t.charCodeAt(t.length-1).toString(16)+\" \":\"\\\\\"+t},wt=function(){I()},xt=d(function(t){return!0===t.disabled&&(\"form\"in t||\"label\"in t)},{dir:\"parentNode\",next:\"legend\"});try{G.apply(V=Z.call(L.childNodes),L.childNodes),V[L.childNodes.length].nodeType}catch(t){G={apply:V.length?function(t,e){X.apply(t,Z.call(e))}:function(t,e){for(var i=t.length,n=0;t[i++]=e[n++];);t.length=i-1}}}b=e.support={},C=e.isXML=function(t){var e=t&&(t.ownerDocument||t).documentElement;return!!e&&\"HTML\"!==e.nodeName},I=e.setDocument=function(t){var e,i,n=t?t.ownerDocument||t:L;return n!==$&&9===n.nodeType&&n.documentElement?($=n,O=$.documentElement,P=!C($),L!==$&&(i=$.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener(\"unload\",wt,!1):i.attachEvent&&i.attachEvent(\"onunload\",wt)),b.attributes=r(function(t){return t.className=\"i\",!t.getAttribute(\"className\")}),b.getElementsByTagName=r(function(t){return t.appendChild($.createComment(\"\")),!t.getElementsByTagName(\"*\").length}),b.getElementsByClassName=ft.test($.getElementsByClassName),b.getById=r(function(t){return O.appendChild(t).id=R,!$.getElementsByName||!$.getElementsByName(R).length}),b.getById?(w.filter.ID=function(t){var e=t.replace(vt,_t);return function(t){return t.getAttribute(\"id\")===e}},w.find.ID=function(t,e){if(void 0!==e.getElementById&&P){var i=e.getElementById(t);return i?[i]:[]}}):(w.filter.ID=function(t){var e=t.replace(vt,_t);return function(t){var i=void 0!==t.getAttributeNode&&t.getAttributeNode(\"id\");return i&&i.value===e}},w.find.ID=function(t,e){if(void 0!==e.getElementById&&P){var i,n,r,s=e.getElementById(t);if(s){if((i=s.getAttributeNode(\"id\"))&&i.value===t)return[s];for(r=e.getElementsByName(t),n=0;s=r[n++];)if((i=s.getAttributeNode(\"id\"))&&i.value===t)return[s]}return[]}}),w.find.TAG=b.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):b.qsa?e.querySelectorAll(t):void 0}:function(t,e){var i,n=[],r=0,s=e.getElementsByTagName(t);if(\"*\"===t){for(;i=s[r++];)1===i.nodeType&&n.push(i);return n}return s},w.find.CLASS=b.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&P)return e.getElementsByClassName(t)},M=[],N=[],(b.qsa=ft.test($.querySelectorAll))&&(r(function(t){O.appendChild(t).innerHTML=\"<a id='\"+R+\"'></a><select id='\"+R+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",t.querySelectorAll(\"[msallowcapture^='']\").length&&N.push(\"[*^$]=\"+tt+\"*(?:''|\\\"\\\")\"),t.querySelectorAll(\"[selected]\").length||N.push(\"\\\\[\"+tt+\"*(?:value|\"+Q+\")\"),t.querySelectorAll(\"[id~=\"+R+\"-]\").length||N.push(\"~=\"),t.querySelectorAll(\":checked\").length||N.push(\":checked\"),t.querySelectorAll(\"a#\"+R+\"+*\").length||N.push(\".#.+[+~]\")}),r(function(t){t.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var e=$.createElement(\"input\");e.setAttribute(\"type\",\"hidden\"),t.appendChild(e).setAttribute(\"name\",\"D\"),t.querySelectorAll(\"[name=d]\").length&&N.push(\"name\"+tt+\"*[*^$|!~]?=\"),2!==t.querySelectorAll(\":enabled\").length&&N.push(\":enabled\",\":disabled\"),O.appendChild(t).disabled=!0,2!==t.querySelectorAll(\":disabled\").length&&N.push(\":enabled\",\":disabled\"),t.querySelectorAll(\"*,:x\"),N.push(\",.*:\")})),(b.matchesSelector=ft.test(j=O.matches||O.webkitMatchesSelector||O.mozMatchesSelector||O.oMatchesSelector||O.msMatchesSelector))&&r(function(t){b.disconnectedMatch=j.call(t,\"*\"),j.call(t,\"[s!='']:x\"),M.push(\"!=\",nt)}),N=N.length&&new RegExp(N.join(\"|\")),M=M.length&&new RegExp(M.join(\"|\")),e=ft.test(O.compareDocumentPosition),H=e||ft.test(O.contains)?function(t,e){var i=9===t.nodeType?t.documentElement:t,n=e&&e.parentNode;return t===n||!(!n||1!==n.nodeType||!(i.contains?i.contains(n):t.compareDocumentPosition&&16&t.compareDocumentPosition(n)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},U=e?function(t,e){if(t===e)return E=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(i=(t.ownerDocument||t)===(e.ownerDocument||e)?t.compareDocumentPosition(e):1,1&i||!b.sortDetached&&e.compareDocumentPosition(t)===i?t===$||t.ownerDocument===L&&H(L,t)?-1:e===$||e.ownerDocument===L&&H(L,e)?1:A?J(A,t)-J(A,e):0:4&i?-1:1)}:function(t,e){if(t===e)return E=!0,0;var i,n=0,r=t.parentNode,s=e.parentNode,a=[t],l=[e];if(!r||!s)return t===$?-1:e===$?1:r?-1:s?1:A?J(A,t)-J(A,e):0;if(r===s)return o(t,e);for(i=t;i=i.parentNode;)a.unshift(i);for(i=e;i=i.parentNode;)l.unshift(i);for(;a[n]===l[n];)n++;return n?o(a[n],l[n]):a[n]===L?-1:l[n]===L?1:0},$):$},e.matches=function(t,i){return e(t,null,null,i)},e.matchesSelector=function(t,i){if((t.ownerDocument||t)!==$&&I(t),i=i.replace(lt,\"='$1']\"),b.matchesSelector&&P&&!B[i+\" \"]&&(!M||!M.test(i))&&(!N||!N.test(i)))try{var n=j.call(t,i);if(n||b.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){}return e(i,$,null,[t]).length>0},e.contains=function(t,e){return(t.ownerDocument||t)!==$&&I(t),H(t,e)},e.attr=function(t,e){(t.ownerDocument||t)!==$&&I(t);var i=w.attrHandle[e.toLowerCase()],n=i&&Y.call(w.attrHandle,e.toLowerCase())?i(t,e,!P):void 0;return void 0!==n?n:b.attributes||!P?t.getAttribute(e):(n=t.getAttributeNode(e))&&n.specified?n.value:null},e.escape=function(t){return(t+\"\").replace(yt,bt)},e.error=function(t){throw new Error(\"Syntax error, unrecognized expression: \"+t)},e.uniqueSort=function(t){var e,i=[],n=0,r=0;if(E=!b.detectDuplicates,A=!b.sortStable&&t.slice(0),t.sort(U),E){for(;e=t[r++];)e===t[r]&&(n=i.push(r));for(;n--;)t.splice(i[n],1)}return A=null,t},x=e.getText=function(t){var e,i=\"\",n=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if(\"string\"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)i+=x(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[n++];)i+=x(e);return i},w=e.selectors={cacheLength:50,createPseudo:n,match:ht,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(vt,_t),t[3]=(t[3]||t[4]||t[5]||\"\").replace(vt,_t),\"~=\"===t[2]&&(t[3]=\" \"+t[3]+\" \"),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),\"nth\"===t[1].slice(0,3)?(t[3]||e.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*(\"even\"===t[3]||\"odd\"===t[3])),t[5]=+(t[7]+t[8]||\"odd\"===t[3])):t[3]&&e.error(t[0]),t},PSEUDO:function(t){var e,i=!t[6]&&t[2];return ht.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||\"\":i&&ut.test(i)&&(e=k(i,!0))&&(e=i.indexOf(\")\",i.length-e)-i.length)&&(t[0]=t[0].slice(0,e),t[2]=i.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(vt,_t).toLowerCase();return\"*\"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=W[t+\" \"];return e||(e=new RegExp(\"(^|\"+tt+\")\"+t+\"(\"+tt+\"|$)\"))&&W(t,function(t){return e.test(\"string\"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute(\"class\")||\"\")})},ATTR:function(t,i,n){return function(r){var s=e.attr(r,t);return null==s?\"!=\"===i:!i||(s+=\"\",\"=\"===i?s===n:\"!=\"===i?s!==n:\"^=\"===i?n&&0===s.indexOf(n):\"*=\"===i?n&&s.indexOf(n)>-1:\"$=\"===i?n&&s.slice(-n.length)===n:\"~=\"===i?(\" \"+s.replace(rt,\" \")+\" \").indexOf(n)>-1:\"|=\"===i&&(s===n||s.slice(0,n.length+1)===n+\"-\"))}},CHILD:function(t,e,i,n,r){var s=\"nth\"!==t.slice(0,3),o=\"last\"!==t.slice(-4),a=\"of-type\"===e;return 1===n&&0===r?function(t){return!!t.parentNode}:function(e,i,l){var u,c,h,d,p,f,g=s!==o?\"nextSibling\":\"previousSibling\",m=e.parentNode,v=a&&e.nodeName.toLowerCase(),_=!l&&!a,y=!1;if(m){if(s){for(;g;){for(d=e;d=d[g];)if(a?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;f=g=\"only\"===t&&!f&&\"nextSibling\"}return!0}if(f=[o?m.firstChild:m.lastChild],o&&_){for(d=m,h=d[R]||(d[R]={}),c=h[d.uniqueID]||(h[d.uniqueID]={}),u=c[t]||[],p=u[0]===F&&u[1],y=p&&u[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(y=p=0)||f.pop();)if(1===d.nodeType&&++y&&d===e){c[t]=[F,p,y];break}}else if(_&&(d=e,h=d[R]||(d[R]={}),c=h[d.uniqueID]||(h[d.uniqueID]={}),u=c[t]||[],p=u[0]===F&&u[1],y=p),!1===y)for(;(d=++p&&d&&d[g]||(y=p=0)||f.pop())&&((a?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++y||(_&&(h=d[R]||(d[R]={}),c=h[d.uniqueID]||(h[d.uniqueID]={}),c[t]=[F,y]),d!==e)););return(y-=r)===n||y%n==0&&y/n>=0}}},PSEUDO:function(t,i){var r,s=w.pseudos[t]||w.setFilters[t.toLowerCase()]||e.error(\"unsupported pseudo: \"+t);return s[R]?s(i):s.length>1?(r=[t,t,\"\",i],w.setFilters.hasOwnProperty(t.toLowerCase())?n(function(t,e){for(var n,r=s(t,i),o=r.length;o--;)n=J(t,r[o]),t[n]=!(e[n]=r[o])}):function(t){return s(t,0,r)}):s}},pseudos:{not:n(function(t){var e=[],i=[],r=T(t.replace(st,\"$1\"));return r[R]?n(function(t,e,i,n){for(var s,o=r(t,null,n,[]),a=t.length;a--;)(s=o[a])&&(t[a]=!(e[a]=s))}):function(t,n,s){return e[0]=t,r(e,null,s,i),e[0]=null,!i.pop()}}),has:n(function(t){return function(i){return e(t,i).length>0}}),contains:n(function(t){return t=t.replace(vt,_t),function(e){return(e.textContent||e.innerText||x(e)).indexOf(t)>-1}}),lang:n(function(t){return ct.test(t||\"\")||e.error(\"unsupported lang: \"+t),t=t.replace(vt,_t).toLowerCase(),function(e){var i;do{if(i=P?e.lang:e.getAttribute(\"xml:lang\")||e.getAttribute(\"lang\"))return(i=i.toLowerCase())===t||0===i.indexOf(t+\"-\")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var i=t.location&&t.location.hash;return i&&i.slice(1)===e.id},root:function(t){return t===O},focus:function(t){return t===$.activeElement&&(!$.hasFocus||$.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:a(!1),disabled:a(!0),checked:function(t){var e=t.nodeName.toLowerCase();return\"input\"===e&&!!t.checked||\"option\"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!w.pseudos.empty(t)},header:function(t){return pt.test(t.nodeName)},input:function(t){return dt.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return\"input\"===e&&\"button\"===t.type||\"button\"===e},text:function(t){var e;return\"input\"===t.nodeName.toLowerCase()&&\"text\"===t.type&&(null==(e=t.getAttribute(\"type\"))||\"text\"===e.toLowerCase())},first:l(function(){return[0]}),last:l(function(t,e){return[e-1]}),eq:l(function(t,e,i){return[i<0?i+e:i]}),even:l(function(t,e){for(var i=0;i<e;i+=2)t.push(i);return t}),odd:l(function(t,e){for(var i=1;i<e;i+=2)t.push(i);return t}),lt:l(function(t,e,i){for(var n=i<0?i+e:i;--n>=0;)t.push(n);return t}),gt:l(function(t,e,i){for(var n=i<0?i+e:i;++n<e;)t.push(n);return t})}},w.pseudos.nth=w.pseudos.eq;for(y in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[y]=function(t){return function(e){return\"input\"===e.nodeName.toLowerCase()&&e.type===t}}(y);for(y in{submit:!0,reset:!0})w.pseudos[y]=function(t){return function(e){var i=e.nodeName.toLowerCase();return(\"input\"===i||\"button\"===i)&&e.type===t}}(y);return c.prototype=w.filters=w.pseudos,w.setFilters=new c,k=e.tokenize=function(t,i){var n,r,s,o,a,l,u,c=q[t+\" \"];if(c)return i?0:c.slice(0);for(a=t,l=[],u=w.preFilter;a;){n&&!(r=ot.exec(a))||(r&&(a=a.slice(r[0].length)||a),l.push(s=[])),n=!1,(r=at.exec(a))&&(n=r.shift(),s.push({value:n,type:r[0].replace(st,\" \")}),a=a.slice(n.length));for(o in w.filter)!(r=ht[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),s.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return i?a.length:a?e.error(t):q(t,l).slice(0)},T=e.compile=function(t,e){var i,n=[],r=[],s=B[t+\" \"];if(!s){for(e||(e=k(t)),i=e.length;i--;)s=v(e[i]),s[R]?n.push(s):r.push(s);s=B(t,_(r,n)),s.selector=t}return s},D=e.select=function(t,e,i,n){var r,s,o,a,l,c=\"function\"==typeof t&&t,d=!n&&k(t=c.selector||t);if(i=i||[],1===d.length){if(s=d[0]=d[0].slice(0),s.length>2&&\"ID\"===(o=s[0]).type&&9===e.nodeType&&P&&w.relative[s[1].type]){if(!(e=(w.find.ID(o.matches[0].replace(vt,_t),e)||[])[0]))return i;c&&(e=e.parentNode),t=t.slice(s.shift().value.length)}for(r=ht.needsContext.test(t)?0:s.length;r--&&(o=s[r],!w.relative[a=o.type]);)if((l=w.find[a])&&(n=l(o.matches[0].replace(vt,_t),mt.test(s[0].type)&&u(e.parentNode)||e))){if(s.splice(r,1),!(t=n.length&&h(s)))return G.apply(i,n),i;break}}return(c||T(t,d))(n,e,!P,i,!e||mt.test(t)&&u(e.parentNode)||e),i},b.sortStable=R.split(\"\").sort(U).join(\"\")===R,b.detectDuplicates=!!E,I(),b.sortDetached=r(function(t){return 1&t.compareDocumentPosition($.createElement(\"fieldset\"))}),r(function(t){return t.innerHTML=\"<a href='#'></a>\",\"#\"===t.firstChild.getAttribute(\"href\")})||s(\"type|href|height|width\",function(t,e,i){if(!i)return t.getAttribute(e,\"type\"===e.toLowerCase()?1:2)}),b.attributes&&r(function(t){return t.innerHTML=\"<input/>\",t.firstChild.setAttribute(\"value\",\"\"),\"\"===t.firstChild.getAttribute(\"value\")})||s(\"value\",function(t,e,i){if(!i&&\"input\"===t.nodeName.toLowerCase())return t.defaultValue}),r(function(t){return null==t.getAttribute(\"disabled\")})||s(Q,function(t,e,i){var n;if(!i)return!0===t[e]?e.toLowerCase():(n=t.getAttributeNode(e))&&n.specified?n.value:null}),e}(i);_t.find=Ct,_t.expr=Ct.selectors,_t.expr[\":\"]=_t.expr.pseudos,_t.uniqueSort=_t.unique=Ct.uniqueSort,_t.text=Ct.getText,_t.isXMLDoc=Ct.isXML,_t.contains=Ct.contains,_t.escapeSelector=Ct.escape;var kt=function(t,e,i){for(var n=[],r=void 0!==i;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(r&&_t(t).is(i))break;n.push(t)}return n},Tt=function(t,e){for(var i=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&i.push(t);return i},Dt=_t.expr.match.needsContext,St=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i,At=/^.[^:#\\[\\.,]*$/;_t.filter=function(t,e,i){var n=e[0];return i&&(t=\":not(\"+t+\")\"),1===e.length&&1===n.nodeType?_t.find.matchesSelector(n,t)?[n]:[]:_t.find.matches(t,_t.grep(e,function(t){return 1===t.nodeType}))},_t.fn.extend({find:function(t){var e,i,n=this.length,r=this;if(\"string\"!=typeof t)return this.pushStack(_t(t).filter(function(){for(e=0;e<n;e++)if(_t.contains(r[e],this))return!0}));for(i=this.pushStack([]),e=0;e<n;e++)_t.find(t,r[e],i);return n>1?_t.uniqueSort(i):i},filter:function(t){return this.pushStack(u(this,t||[],!1))},not:function(t){return this.pushStack(u(this,t||[],!0))},is:function(t){return!!u(this,\"string\"==typeof t&&Dt.test(t)?_t(t):t||[],!1).length}});var Et,It=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(_t.fn.init=function(t,e,i){var n,r;if(!t)return this;if(i=i||Et,\"string\"==typeof t){if(!(n=\"<\"===t[0]&&\">\"===t[t.length-1]&&t.length>=3?[null,t,null]:It.exec(t))||!n[1]&&e)return!e||e.jquery?(e||i).find(t):this.constructor(e).find(t);if(n[1]){if(e=e instanceof _t?e[0]:e,_t.merge(this,_t.parseHTML(n[1],e&&e.nodeType?e.ownerDocument||e:ot,!0)),St.test(n[1])&&_t.isPlainObject(e))for(n in e)_t.isFunction(this[n])?this[n](e[n]):this.attr(n,e[n]);return this}return r=ot.getElementById(n[2]),r&&(this[0]=r,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):_t.isFunction(t)?void 0!==i.ready?i.ready(t):t(_t):_t.makeArray(t,this)}).prototype=_t.fn,Et=_t(ot);var $t=/^(?:parents|prev(?:Until|All))/,Ot={children:!0,contents:!0,next:!0,prev:!0};_t.fn.extend({has:function(t){var e=_t(t,this),i=e.length;return this.filter(function(){for(var t=0;t<i;t++)if(_t.contains(this,e[t]))return!0})},closest:function(t,e){var i,n=0,r=this.length,s=[],o=\"string\"!=typeof t&&_t(t);if(!Dt.test(t))for(;n<r;n++)for(i=this[n];i&&i!==e;i=i.parentNode)if(i.nodeType<11&&(o?o.index(i)>-1:1===i.nodeType&&_t.find.matchesSelector(i,t))){s.push(i);break}return this.pushStack(s.length>1?_t.uniqueSort(s):s)},index:function(t){return t?\"string\"==typeof t?ht.call(_t(t),this[0]):ht.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(_t.uniqueSort(_t.merge(this.get(),_t(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),_t.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return kt(t,\"parentNode\")},parentsUntil:function(t,e,i){return kt(t,\"parentNode\",i)},next:function(t){return c(t,\"nextSibling\")},prev:function(t){return c(t,\"previousSibling\")},nextAll:function(t){return kt(t,\"nextSibling\")},prevAll:function(t){return kt(t,\"previousSibling\")},nextUntil:function(t,e,i){return kt(t,\"nextSibling\",i)},prevUntil:function(t,e,i){return kt(t,\"previousSibling\",i)},siblings:function(t){return Tt((t.parentNode||{}).firstChild,t)},children:function(t){return Tt(t.firstChild)},contents:function(t){return l(t,\"iframe\")?t.contentDocument:(l(t,\"template\")&&(t=t.content||t),_t.merge([],t.childNodes))}},function(t,e){_t.fn[t]=function(i,n){var r=_t.map(this,e,i);return\"Until\"!==t.slice(-5)&&(n=i),n&&\"string\"==typeof n&&(r=_t.filter(n,r)),this.length>1&&(Ot[t]||_t.uniqueSort(r),$t.test(t)&&r.reverse()),this.pushStack(r)}});var Pt=/[^\\x20\\t\\r\\n\\f]+/g;_t.Callbacks=function(t){t=\"string\"==typeof t?h(t):_t.extend({},t);var e,i,n,r,s=[],o=[],a=-1,l=function(){for(r=r||t.once,n=e=!0;o.length;a=-1)for(i=o.shift();++a<s.length;)!1===s[a].apply(i[0],i[1])&&t.stopOnFalse&&(a=s.length,i=!1);t.memory||(i=!1),e=!1,r&&(s=i?[]:\"\")},u={add:function(){return s&&(i&&!e&&(a=s.length-1,o.push(i)),function e(i){_t.each(i,function(i,n){_t.isFunction(n)?t.unique&&u.has(n)||s.push(n):n&&n.length&&\"string\"!==_t.type(n)&&e(n)})}(arguments),i&&!e&&l()),this},remove:function(){return _t.each(arguments,function(t,e){for(var i;(i=_t.inArray(e,s,i))>-1;)s.splice(i,1),i<=a&&a--}),this},has:function(t){return t?_t.inArray(t,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return r=o=[],s=i=\"\",this},disabled:function(){return!s},lock:function(){return r=o=[],i||e||(s=i=\"\"),this},locked:function(){return!!r},fireWith:function(t,i){return r||(i=i||[],i=[t,i.slice?i.slice():i],o.push(i),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!n}};return u},_t.extend({Deferred:function(t){var e=[[\"notify\",\"progress\",_t.Callbacks(\"memory\"),_t.Callbacks(\"memory\"),2],[\"resolve\",\"done\",_t.Callbacks(\"once memory\"),_t.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",_t.Callbacks(\"once memory\"),_t.Callbacks(\"once memory\"),1,\"rejected\"]],n=\"pending\",r={state:function(){return n},always:function(){return s.done(arguments).fail(arguments),this},catch:function(t){return r.then(null,t)},pipe:function(){var t=arguments;return _t.Deferred(function(i){_t.each(e,function(e,n){var r=_t.isFunction(t[n[4]])&&t[n[4]];s[n[1]](function(){var t=r&&r.apply(this,arguments);t&&_t.isFunction(t.promise)?t.promise().progress(i.notify).done(i.resolve).fail(i.reject):i[n[0]+\"With\"](this,r?[t]:arguments)})}),t=null}).promise()},then:function(t,n,r){function s(t,e,n,r){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t<o)){if((i=n.apply(a,l))===e.promise())throw new TypeError(\"Thenable self-resolution\");u=i&&(\"object\"==typeof i||\"function\"==typeof i)&&i.then,_t.isFunction(u)?r?u.call(i,s(o,e,d,r),s(o,e,p,r)):(o++,u.call(i,s(o,e,d,r),s(o,e,p,r),s(o,e,d,e.notifyWith))):(n!==d&&(a=void 0,l=[i]),(r||e.resolveWith)(a,l))}},c=r?u:function(){try{u()}catch(i){_t.Deferred.exceptionHook&&_t.Deferred.exceptionHook(i,c.stackTrace),t+1>=o&&(n!==p&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(_t.Deferred.getStackHook&&(c.stackTrace=_t.Deferred.getStackHook()),i.setTimeout(c))}}var o=0;return _t.Deferred(function(i){e[0][3].add(s(0,i,_t.isFunction(r)?r:d,i.notifyWith)),e[1][3].add(s(0,i,_t.isFunction(t)?t:d)),e[2][3].add(s(0,i,_t.isFunction(n)?n:p))}).promise()},promise:function(t){return null!=t?_t.extend(t,r):r}},s={};return _t.each(e,function(t,i){var o=i[2],a=i[5];r[i[1]]=o.add,a&&o.add(function(){n=a},e[3-t][2].disable,e[0][2].lock),o.add(i[3].fire),s[i[0]]=function(){return s[i[0]+\"With\"](this===s?void 0:this,arguments),this},s[i[0]+\"With\"]=o.fireWith}),r.promise(s),t&&t.call(s,s),s},when:function(t){var e=arguments.length,i=e,n=Array(i),r=lt.call(arguments),s=_t.Deferred(),o=function(t){return function(i){n[t]=this,r[t]=arguments.length>1?lt.call(arguments):i,--e||s.resolveWith(n,r)}};if(e<=1&&(f(t,s.done(o(i)).resolve,s.reject,!e),\"pending\"===s.state()||_t.isFunction(r[i]&&r[i].then)))return s.then();for(;i--;)f(r[i],o(i),s.reject);return s.promise()}});var Nt=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;_t.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&Nt.test(t.name)&&i.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,e)},_t.readyException=function(t){i.setTimeout(function(){throw t})};var Mt=_t.Deferred();_t.fn.ready=function(t){return Mt.then(t).catch(function(t){_t.readyException(t)}),this},_t.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--_t.readyWait:_t.isReady)||(_t.isReady=!0,!0!==t&&--_t.readyWait>0||Mt.resolveWith(ot,[_t]))}}),_t.ready.then=Mt.then,\"complete\"===ot.readyState||\"loading\"!==ot.readyState&&!ot.documentElement.doScroll?i.setTimeout(_t.ready):(ot.addEventListener(\"DOMContentLoaded\",g),i.addEventListener(\"load\",g));var jt=function(t,e,i,n,r,s,o){var a=0,l=t.length,u=null==i;if(\"object\"===_t.type(i)){r=!0;for(a in i)jt(t,e,a,i[a],!0,s,o)}else if(void 0!==n&&(r=!0,_t.isFunction(n)||(o=!0),u&&(o?(e.call(t,n),e=null):(u=e,e=function(t,e,i){return u.call(_t(t),i)})),e))for(;a<l;a++)e(t[a],i,o?n:n.call(t[a],a,e(t[a],i)));return r?t:u?e.call(t):l?e(t[0],i):s},Ht=function(t){return 1===t.nodeType||9===t.nodeType||!+t.nodeType};m.uid=1,m.prototype={cache:function(t){var e=t[this.expando];return e||(e={},Ht(t)&&(t.nodeType?t[this.expando]=e:Object.defineProperty(t,this.expando,{value:e,configurable:!0}))),e},set:function(t,e,i){var n,r=this.cache(t);if(\"string\"==typeof e)r[_t.camelCase(e)]=i;else for(n in e)r[_t.camelCase(n)]=e[n];return r},get:function(t,e){return void 0===e?this.cache(t):t[this.expando]&&t[this.expando][_t.camelCase(e)]},access:function(t,e,i){return void 0===e||e&&\"string\"==typeof e&&void 0===i?this.get(t,e):(this.set(t,e,i),void 0!==i?i:e)},remove:function(t,e){var i,n=t[this.expando];if(void 0!==n){if(void 0!==e){Array.isArray(e)?e=e.map(_t.camelCase):(e=_t.camelCase(e),e=e in n?[e]:e.match(Pt)||[]),i=e.length;for(;i--;)delete n[e[i]]}(void 0===e||_t.isEmptyObject(n))&&(t.nodeType?t[this.expando]=void 0:delete t[this.expando])}},hasData:function(t){var e=t[this.expando];return void 0!==e&&!_t.isEmptyObject(e)}};var Rt=new m,Lt=new m,Ft=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,zt=/[A-Z]/g;_t.extend({hasData:function(t){return Lt.hasData(t)||Rt.hasData(t)},data:function(t,e,i){return Lt.access(t,e,i)},removeData:function(t,e){Lt.remove(t,e)},_data:function(t,e,i){return Rt.access(t,e,i)},_removeData:function(t,e){Rt.remove(t,e)}}),_t.fn.extend({data:function(t,e){var i,n,r,s=this[0],o=s&&s.attributes;if(void 0===t){if(this.length&&(r=Lt.get(s),1===s.nodeType&&!Rt.get(s,\"hasDataAttrs\"))){for(i=o.length;i--;)o[i]&&(n=o[i].name,0===n.indexOf(\"data-\")&&(n=_t.camelCase(n.slice(5)),_(s,n,r[n])));Rt.set(s,\"hasDataAttrs\",!0)}return r}return\"object\"==typeof t?this.each(function(){Lt.set(this,t)}):jt(this,function(e){var i;if(s&&void 0===e){if(void 0!==(i=Lt.get(s,t)))return i;if(void 0!==(i=_(s,t)))return i}else this.each(function(){Lt.set(this,t,e)})},null,e,arguments.length>1,null,!0)},removeData:function(t){return this.each(function(){Lt.remove(this,t)})}}),_t.extend({queue:function(t,e,i){var n;if(t)return e=(e||\"fx\")+\"queue\",n=Rt.get(t,e),i&&(!n||Array.isArray(i)?n=Rt.access(t,e,_t.makeArray(i)):n.push(i)),n||[]},dequeue:function(t,e){e=e||\"fx\";var i=_t.queue(t,e),n=i.length,r=i.shift(),s=_t._queueHooks(t,e),o=function(){_t.dequeue(t,e)};\"inprogress\"===r&&(r=i.shift(),n--),r&&(\"fx\"===e&&i.unshift(\"inprogress\"),delete s.stop,r.call(t,o,s)),!n&&s&&s.empty.fire()},_queueHooks:function(t,e){var i=e+\"queueHooks\";return Rt.get(t,i)||Rt.access(t,i,{empty:_t.Callbacks(\"once memory\").add(function(){Rt.remove(t,[e+\"queue\",i])})})}}),_t.fn.extend({queue:function(t,e){var i=2;return\"string\"!=typeof t&&(e=t,t=\"fx\",i--),arguments.length<i?_t.queue(this[0],t):void 0===e?this:this.each(function(){var i=_t.queue(this,t,e);_t._queueHooks(this,t),\"fx\"===t&&\"inprogress\"!==i[0]&&_t.dequeue(this,t)})},dequeue:function(t){return this.each(function(){_t.dequeue(this,t)})},clearQueue:function(t){return this.queue(t||\"fx\",[])},promise:function(t,e){var i,n=1,r=_t.Deferred(),s=this,o=this.length,a=function(){--n||r.resolveWith(s,[s])};for(\"string\"!=typeof t&&(e=t,t=void 0),t=t||\"fx\";o--;)(i=Rt.get(s[o],t+\"queueHooks\"))&&i.empty&&(n++,i.empty.add(a));return a(),r.promise(e)}});var Wt=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,qt=new RegExp(\"^(?:([+-])=|)(\"+Wt+\")([a-z%]*)$\",\"i\"),Bt=[\"Top\",\"Right\",\"Bottom\",\"Left\"],Ut=function(t,e){return t=e||t,\"none\"===t.style.display||\"\"===t.style.display&&_t.contains(t.ownerDocument,t)&&\"none\"===_t.css(t,\"display\")},Yt=function(t,e,i,n){var r,s,o={};for(s in e)o[s]=t.style[s],t.style[s]=e[s];r=i.apply(t,n||[]);for(s in e)t.style[s]=o[s];return r},Vt={};_t.fn.extend({show:function(){return w(this,!0)},hide:function(){return w(this)},toggle:function(t){return\"boolean\"==typeof t?t?this.show():this.hide():this.each(function(){Ut(this)?_t(this).show():_t(this).hide()})}});var Kt=/^(?:checkbox|radio)$/i,Xt=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,Gt=/^$|\\/(?:java|ecma)script/i,Zt={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Zt.optgroup=Zt.option,Zt.tbody=Zt.tfoot=Zt.colgroup=Zt.caption=Zt.thead,Zt.th=Zt.td;var Jt=/<|&#?\\w+;/;!function(){var t=ot.createDocumentFragment(),e=t.appendChild(ot.createElement(\"div\")),i=ot.createElement(\"input\");i.setAttribute(\"type\",\"radio\"),i.setAttribute(\"checked\",\"checked\"),i.setAttribute(\"name\",\"t\"),e.appendChild(i),vt.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML=\"<textarea>x</textarea>\",vt.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var Qt=ot.documentElement,te=/^key/,ee=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ie=/^([^.]*)(?:\\.(.+)|)/;_t.event={global:{},add:function(t,e,i,n,r){var s,o,a,l,u,c,h,d,p,f,g,m=Rt.get(t);if(m)for(i.handler&&(s=i,i=s.handler,r=s.selector),r&&_t.find.matchesSelector(Qt,r),i.guid||(i.guid=_t.guid++),(l=m.events)||(l=m.events={}),(o=m.handle)||(o=m.handle=function(e){return void 0!==_t&&_t.event.triggered!==e.type?_t.event.dispatch.apply(t,arguments):void 0}),e=(e||\"\").match(Pt)||[\"\"],u=e.length;u--;)a=ie.exec(e[u])||[],p=g=a[1],f=(a[2]||\"\").split(\".\").sort(),p&&(h=_t.event.special[p]||{},p=(r?h.delegateType:h.bindType)||p,h=_t.event.special[p]||{},c=_t.extend({type:p,origType:g,data:n,handler:i,guid:i.guid,selector:r,needsContext:r&&_t.expr.match.needsContext.test(r),namespace:f.join(\".\")},s),(d=l[p])||(d=l[p]=[],d.delegateCount=0,h.setup&&!1!==h.setup.call(t,n,f,o)||t.addEventListener&&t.addEventListener(p,o)),h.add&&(h.add.call(t,c),c.handler.guid||(c.handler.guid=i.guid)),r?d.splice(d.delegateCount++,0,c):d.push(c),_t.event.global[p]=!0)},remove:function(t,e,i,n,r){var s,o,a,l,u,c,h,d,p,f,g,m=Rt.hasData(t)&&Rt.get(t);if(m&&(l=m.events)){for(e=(e||\"\").match(Pt)||[\"\"],u=e.length;u--;)if(a=ie.exec(e[u])||[],p=g=a[1],f=(a[2]||\"\").split(\".\").sort(),p){for(h=_t.event.special[p]||{},p=(n?h.delegateType:h.bindType)||p,d=l[p]||[],a=a[2]&&new RegExp(\"(^|\\\\.)\"+f.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),o=s=d.length;s--;)c=d[s],!r&&g!==c.origType||i&&i.guid!==c.guid||a&&!a.test(c.namespace)||n&&n!==c.selector&&(\"**\"!==n||!c.selector)||(d.splice(s,1),c.selector&&d.delegateCount--,h.remove&&h.remove.call(t,c));o&&!d.length&&(h.teardown&&!1!==h.teardown.call(t,f,m.handle)||_t.removeEvent(t,p,m.handle),delete l[p])}else for(p in l)_t.event.remove(t,p+e[u],i,n,!0);_t.isEmptyObject(l)&&Rt.remove(t,\"handle events\")}},dispatch:function(t){var e,i,n,r,s,o,a=_t.event.fix(t),l=new Array(arguments.length),u=(Rt.get(this,\"events\")||{})[a.type]||[],c=_t.event.special[a.type]||{};for(l[0]=a,e=1;e<arguments.length;e++)l[e]=arguments[e];if(a.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,a)){for(o=_t.event.handlers.call(this,a,u),e=0;(r=o[e++])&&!a.isPropagationStopped();)for(a.currentTarget=r.elem,i=0;(s=r.handlers[i++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!a.rnamespace.test(s.namespace)||(a.handleObj=s,a.data=s.data,void 0!==(n=((_t.event.special[s.origType]||{}).handle||s.handler).apply(r.elem,l))&&!1===(a.result=n)&&(a.preventDefault(),a.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,a),a.result}},handlers:function(t,e){var i,n,r,s,o,a=[],l=e.delegateCount,u=t.target;if(l&&u.nodeType&&!(\"click\"===t.type&&t.button>=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&(\"click\"!==t.type||!0!==u.disabled)){for(s=[],o={},i=0;i<l;i++)n=e[i],r=n.selector+\" \",void 0===o[r]&&(o[r]=n.needsContext?_t(r,this).index(u)>-1:_t.find(r,this,null,[u]).length),o[r]&&s.push(n);s.length&&a.push({elem:u,handlers:s})}return u=this,l<e.length&&a.push({elem:u,handlers:e.slice(l)}),a},addProp:function(t,e){Object.defineProperty(_t.Event.prototype,t,{enumerable:!0,configurable:!0,get:_t.isFunction(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(t){return t[_t.expando]?t:new _t.Event(t)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==S()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===S()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&l(this,\"input\"))return this.click(),!1},_default:function(t){return l(t.target,\"a\")}},beforeunload:{postDispatch:function(t){void 0!==t.result&&t.originalEvent&&(t.originalEvent.returnValue=t.result)}}}},_t.removeEvent=function(t,e,i){t.removeEventListener&&t.removeEventListener(e,i)},_t.Event=function(t,e){if(!(this instanceof _t.Event))return new _t.Event(t,e);t&&t.type?(this.originalEvent=t,this.type=t.type,this.isDefaultPrevented=t.defaultPrevented||void 0===t.defaultPrevented&&!1===t.returnValue?T:D,this.target=t.target&&3===t.target.nodeType?t.target.parentNode:t.target,this.currentTarget=t.currentTarget,this.relatedTarget=t.relatedTarget):this.type=t,e&&_t.extend(this,e),this.timeStamp=t&&t.timeStamp||_t.now(),this[_t.expando]=!0},_t.Event.prototype={constructor:_t.Event,isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D,isSimulated:!1,preventDefault:function(){var t=this.originalEvent;this.isDefaultPrevented=T,t&&!this.isSimulated&&t.preventDefault()},stopPropagation:function(){var t=this.originalEvent;this.isPropagationStopped=T,t&&!this.isSimulated&&t.stopPropagation()},stopImmediatePropagation:function(){var t=this.originalEvent;this.isImmediatePropagationStopped=T,t&&!this.isSimulated&&t.stopImmediatePropagation(),this.stopPropagation()}},_t.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(t){var e=t.button;return null==t.which&&te.test(t.type)?null!=t.charCode?t.charCode:t.keyCode:!t.which&&void 0!==e&&ee.test(t.type)?1&e?1:2&e?3:4&e?2:0:t.which}},_t.event.addProp),_t.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(t,e){_t.event.special[t]={delegateType:e,bindType:e,handle:function(t){var i,n=this,r=t.relatedTarget,s=t.handleObj;return r&&(r===n||_t.contains(n,r))||(t.type=s.origType,i=s.handler.apply(this,arguments),t.type=e),i}}}),_t.fn.extend({on:function(t,e,i,n){return A(this,t,e,i,n)},one:function(t,e,i,n){return A(this,t,e,i,n,1)},off:function(t,e,i){var n,r;if(t&&t.preventDefault&&t.handleObj)return n=t.handleObj,_t(t.delegateTarget).off(n.namespace?n.origType+\".\"+n.namespace:n.origType,n.selector,n.handler),this;if(\"object\"==typeof t){for(r in t)this.off(r,e,t[r]);return this}return!1!==e&&\"function\"!=typeof e||(i=e,e=void 0),!1===i&&(i=D),this.each(function(){_t.event.remove(this,t,i,e)})}});var ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,re=/<script|<style|<link/i,se=/checked\\s*(?:[^=]|=\\s*.checked.)/i,oe=/^true\\/(.*)/,ae=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;_t.extend({htmlPrefilter:function(t){return t.replace(ne,\"<$1></$2>\")},clone:function(t,e,i){var n,r,s,o,a=t.cloneNode(!0),l=_t.contains(t.ownerDocument,t);if(!(vt.noCloneChecked||1!==t.nodeType&&11!==t.nodeType||_t.isXMLDoc(t)))for(o=x(a),s=x(t),n=0,r=s.length;n<r;n++)P(s[n],o[n]);if(e)if(i)for(s=s||x(t),o=o||x(a),n=0,r=s.length;n<r;n++)O(s[n],o[n]);else O(t,a);return o=x(a,\"script\"),o.length>0&&C(o,!l&&x(t,\"script\")),a},cleanData:function(t){for(var e,i,n,r=_t.event.special,s=0;void 0!==(i=t[s]);s++)if(Ht(i)){if(e=i[Rt.expando]){if(e.events)for(n in e.events)r[n]?_t.event.remove(i,n):_t.removeEvent(i,n,e.handle);i[Rt.expando]=void 0}i[Lt.expando]&&(i[Lt.expando]=void 0)}}}),_t.fn.extend({detach:function(t){return M(this,t,!0)},remove:function(t){return M(this,t)},text:function(t){return jt(this,function(t){return void 0===t?_t.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)})},null,t,arguments.length)},append:function(){return N(this,arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){E(this,t).appendChild(t)}})},prepend:function(){return N(this,arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=E(this,t);e.insertBefore(t,e.firstChild)}})},before:function(){return N(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this)})},after:function(){return N(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)})},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(_t.cleanData(x(t,!1)),t.textContent=\"\");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map(function(){return _t.clone(this,t,e)})},html:function(t){return jt(this,function(t){var e=this[0]||{},i=0,n=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if(\"string\"==typeof t&&!re.test(t)&&!Zt[(Xt.exec(t)||[\"\",\"\"])[1].toLowerCase()]){t=_t.htmlPrefilter(t);try{for(;i<n;i++)e=this[i]||{},1===e.nodeType&&(_t.cleanData(x(e,!1)),e.innerHTML=t);e=0}catch(t){}}e&&this.empty().append(t)},null,t,arguments.length)},replaceWith:function(){var t=[];return N(this,arguments,function(e){var i=this.parentNode;_t.inArray(this,t)<0&&(_t.cleanData(x(this)),i&&i.replaceChild(e,this))},t)}}),_t.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(t,e){_t.fn[t]=function(t){for(var i,n=[],r=_t(t),s=r.length-1,o=0;o<=s;o++)i=o===s?this:this.clone(!0),_t(r[o])[e](i),ct.apply(n,i.get());return this.pushStack(n)}});var le=/^margin/,ue=new RegExp(\"^(\"+Wt+\")(?!px)[a-z%]+$\",\"i\"),ce=function(t){var e=t.ownerDocument.defaultView;return e&&e.opener||(e=i),e.getComputedStyle(t)};!function(){function t(){if(a){a.style.cssText=\"box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%\",a.innerHTML=\"\",Qt.appendChild(o);var t=i.getComputedStyle(a);e=\"1%\"!==t.top,s=\"2px\"===t.marginLeft,n=\"4px\"===t.width,a.style.marginRight=\"50%\",r=\"4px\"===t.marginRight,Qt.removeChild(o),a=null}}var e,n,r,s,o=ot.createElement(\"div\"),a=ot.createElement(\"div\");a.style&&(a.style.backgroundClip=\"content-box\",a.cloneNode(!0).style.backgroundClip=\"\",vt.clearCloneStyle=\"content-box\"===a.style.backgroundClip,o.style.cssText=\"border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute\",o.appendChild(a),_t.extend(vt,{pixelPosition:function(){return t(),e},boxSizingReliable:function(){return t(),n},pixelMarginRight:function(){return t(),r},reliableMarginLeft:function(){return t(),s}}))}();var he=/^(none|table(?!-c[ea]).+)/,de=/^--/,pe={position:\"absolute\",visibility:\"hidden\",display:\"block\"},fe={letterSpacing:\"0\",fontWeight:\"400\"},ge=[\"Webkit\",\"Moz\",\"ms\"],me=ot.createElement(\"div\").style;_t.extend({cssHooks:{opacity:{get:function(t,e){if(e){var i=j(t,\"opacity\");return\"\"===i?\"1\":i}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:\"cssFloat\"},style:function(t,e,i,n){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var r,s,o,a=_t.camelCase(e),l=de.test(e),u=t.style;if(l||(e=L(a)),o=_t.cssHooks[e]||_t.cssHooks[a],void 0===i)return o&&\"get\"in o&&void 0!==(r=o.get(t,!1,n))?r:u[e];s=typeof i,\"string\"===s&&(r=qt.exec(i))&&r[1]&&(i=y(t,e,r),s=\"number\"),null!=i&&i===i&&(\"number\"===s&&(i+=r&&r[3]||(_t.cssNumber[a]?\"\":\"px\")),vt.clearCloneStyle||\"\"!==i||0!==e.indexOf(\"background\")||(u[e]=\"inherit\"),o&&\"set\"in o&&void 0===(i=o.set(t,i,n))||(l?u.setProperty(e,i):u[e]=i))}},css:function(t,e,i,n){var r,s,o,a=_t.camelCase(e);return de.test(e)||(e=L(a)),o=_t.cssHooks[e]||_t.cssHooks[a],o&&\"get\"in o&&(r=o.get(t,!0,i)),void 0===r&&(r=j(t,e,n)),\"normal\"===r&&e in fe&&(r=fe[e]),\"\"===i||i?(s=parseFloat(r),!0===i||isFinite(s)?s||0:r):r}}),_t.each([\"height\",\"width\"],function(t,e){_t.cssHooks[e]={get:function(t,i,n){if(i)return!he.test(_t.css(t,\"display\"))||t.getClientRects().length&&t.getBoundingClientRect().width?W(t,e,n):Yt(t,pe,function(){return W(t,e,n)})},set:function(t,i,n){var r,s=n&&ce(t),o=n&&z(t,e,n,\"border-box\"===_t.css(t,\"boxSizing\",!1,s),s);return o&&(r=qt.exec(i))&&\"px\"!==(r[3]||\"px\")&&(t.style[e]=i,i=_t.css(t,e)),F(t,i,o)}}}),_t.cssHooks.marginLeft=H(vt.reliableMarginLeft,function(t,e){if(e)return(parseFloat(j(t,\"marginLeft\"))||t.getBoundingClientRect().left-Yt(t,{marginLeft:0},function(){return t.getBoundingClientRect().left}))+\"px\"}),_t.each({margin:\"\",padding:\"\",border:\"Width\"},function(t,e){_t.cssHooks[t+e]={expand:function(i){for(var n=0,r={},s=\"string\"==typeof i?i.split(\" \"):[i];n<4;n++)r[t+Bt[n]+e]=s[n]||s[n-2]||s[0];return r}},le.test(t)||(_t.cssHooks[t+e].set=F)}),_t.fn.extend({css:function(t,e){return jt(this,function(t,e,i){var n,r,s={},o=0;if(Array.isArray(e)){for(n=ce(t),r=e.length;o<r;o++)s[e[o]]=_t.css(t,e[o],!1,n);return s}return void 0!==i?_t.style(t,e,i):_t.css(t,e)},t,e,arguments.length>1)}}),_t.Tween=q,q.prototype={constructor:q,init:function(t,e,i,n,r,s){this.elem=t,this.prop=i,this.easing=r||_t.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=n,this.unit=s||(_t.cssNumber[i]?\"\":\"px\")},cur:function(){var t=q.propHooks[this.prop];return t&&t.get?t.get(this):q.propHooks._default.get(this)},run:function(t){var e,i=q.propHooks[this.prop];return this.options.duration?this.pos=e=_t.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),i&&i.set?i.set(this):q.propHooks._default.set(this),this}},q.prototype.init.prototype=q.prototype,q.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=_t.css(t.elem,t.prop,\"\"),e&&\"auto\"!==e?e:0)},set:function(t){_t.fx.step[t.prop]?_t.fx.step[t.prop](t):1!==t.elem.nodeType||null==t.elem.style[_t.cssProps[t.prop]]&&!_t.cssHooks[t.prop]?t.elem[t.prop]=t.now:_t.style(t.elem,t.prop,t.now+t.unit)}}},q.propHooks.scrollTop=q.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},_t.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:\"swing\"},_t.fx=q.prototype.init,_t.fx.step={};var ve,_e,ye=/^(?:toggle|show|hide)$/,be=/queueHooks$/;_t.Animation=_t.extend(G,{tweeners:{\"*\":[function(t,e){var i=this.createTween(t,e);return y(i.elem,t,qt.exec(e),i),i}]},tweener:function(t,e){_t.isFunction(t)?(e=t,t=[\"*\"]):t=t.match(Pt);for(var i,n=0,r=t.length;n<r;n++)i=t[n],G.tweeners[i]=G.tweeners[i]||[],G.tweeners[i].unshift(e)},prefilters:[K],prefilter:function(t,e){e?G.prefilters.unshift(t):G.prefilters.push(t)}}),_t.speed=function(t,e,i){var n=t&&\"object\"==typeof t?_t.extend({},t):{complete:i||!i&&e||_t.isFunction(t)&&t,duration:t,easing:i&&e||e&&!_t.isFunction(e)&&e};return _t.fx.off?n.duration=0:\"number\"!=typeof n.duration&&(n.duration in _t.fx.speeds?n.duration=_t.fx.speeds[n.duration]:n.duration=_t.fx.speeds._default),null!=n.queue&&!0!==n.queue||(n.queue=\"fx\"),n.old=n.complete,n.complete=function(){_t.isFunction(n.old)&&n.old.call(this),n.queue&&_t.dequeue(this,n.queue)},n},_t.fn.extend({fadeTo:function(t,e,i,n){return this.filter(Ut).css(\"opacity\",0).show().end().animate({opacity:e},t,i,n)},animate:function(t,e,i,n){var r=_t.isEmptyObject(t),s=_t.speed(e,i,n),o=function(){var e=G(this,_t.extend({},t),s);(r||Rt.get(this,\"finish\"))&&e.stop(!0)};return o.finish=o,r||!1===s.queue?this.each(o):this.queue(s.queue,o)},stop:function(t,e,i){var n=function(t){var e=t.stop;delete t.stop,e(i)};return\"string\"!=typeof t&&(i=e,e=t,t=void 0),e&&!1!==t&&this.queue(t||\"fx\",[]),this.each(function(){var e=!0,r=null!=t&&t+\"queueHooks\",s=_t.timers,o=Rt.get(this);if(r)o[r]&&o[r].stop&&n(o[r]);else for(r in o)o[r]&&o[r].stop&&be.test(r)&&n(o[r]);for(r=s.length;r--;)s[r].elem!==this||null!=t&&s[r].queue!==t||(s[r].anim.stop(i),e=!1,s.splice(r,1));!e&&i||_t.dequeue(this,t)})},finish:function(t){return!1!==t&&(t=t||\"fx\"),this.each(function(){var e,i=Rt.get(this),n=i[t+\"queue\"],r=i[t+\"queueHooks\"],s=_t.timers,o=n?n.length:0;for(i.finish=!0,_t.queue(this,t,[]),r&&r.stop&&r.stop.call(this,!0),e=s.length;e--;)s[e].elem===this&&s[e].queue===t&&(s[e].anim.stop(!0),s.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete i.finish})}}),_t.each([\"toggle\",\"show\",\"hide\"],function(t,e){var i=_t.fn[e];_t.fn[e]=function(t,n,r){return null==t||\"boolean\"==typeof t?i.apply(this,arguments):this.animate(Y(e,!0),t,n,r)}}),_t.each({slideDown:Y(\"show\"),slideUp:Y(\"hide\"),slideToggle:Y(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(t,e){_t.fn[t]=function(t,i,n){return this.animate(e,t,i,n)}}),_t.timers=[],_t.fx.tick=function(){var t,e=0,i=_t.timers;for(ve=_t.now();e<i.length;e++)(t=i[e])()||i[e]!==t||i.splice(e--,1);i.length||_t.fx.stop(),ve=void 0},_t.fx.timer=function(t){_t.timers.push(t),_t.fx.start()},_t.fx.interval=13,_t.fx.start=function(){_e||(_e=!0,B())},_t.fx.stop=function(){_e=null},_t.fx.speeds={slow:600,fast:200,_default:400},_t.fn.delay=function(t,e){return t=_t.fx?_t.fx.speeds[t]||t:t,e=e||\"fx\",this.queue(e,function(e,n){var r=i.setTimeout(e,t);n.stop=function(){i.clearTimeout(r)}})},function(){var t=ot.createElement(\"input\"),e=ot.createElement(\"select\"),i=e.appendChild(ot.createElement(\"option\"));t.type=\"checkbox\",vt.checkOn=\"\"!==t.value,vt.optSelected=i.selected,t=ot.createElement(\"input\"),t.value=\"t\",t.type=\"radio\",vt.radioValue=\"t\"===t.value}();var we,xe=_t.expr.attrHandle;_t.fn.extend({attr:function(t,e){return jt(this,_t.attr,t,e,arguments.length>1)},removeAttr:function(t){return this.each(function(){_t.removeAttr(this,t)})}}),_t.extend({attr:function(t,e,i){var n,r,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return void 0===t.getAttribute?_t.prop(t,e,i):(1===s&&_t.isXMLDoc(t)||(r=_t.attrHooks[e.toLowerCase()]||(_t.expr.match.bool.test(e)?we:void 0)),void 0!==i?null===i?void _t.removeAttr(t,e):r&&\"set\"in r&&void 0!==(n=r.set(t,i,e))?n:(t.setAttribute(e,i+\"\"),i):r&&\"get\"in r&&null!==(n=r.get(t,e))?n:(n=_t.find.attr(t,e),null==n?void 0:n))},attrHooks:{type:{set:function(t,e){if(!vt.radioValue&&\"radio\"===e&&l(t,\"input\")){var i=t.value;return t.setAttribute(\"type\",e),i&&(t.value=i),e}}}},removeAttr:function(t,e){var i,n=0,r=e&&e.match(Pt);if(r&&1===t.nodeType)for(;i=r[n++];)t.removeAttribute(i)}}),we={set:function(t,e,i){return!1===e?_t.removeAttr(t,i):t.setAttribute(i,i),i}},_t.each(_t.expr.match.bool.source.match(/\\w+/g),function(t,e){var i=xe[e]||_t.find.attr;xe[e]=function(t,e,n){var r,s,o=e.toLowerCase();return n||(s=xe[o],xe[o]=r,r=null!=i(t,e,n)?o:null,xe[o]=s),r}});var Ce=/^(?:input|select|textarea|button)$/i,ke=/^(?:a|area)$/i;_t.fn.extend({prop:function(t,e){return jt(this,_t.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each(function(){delete this[_t.propFix[t]||t]})}}),_t.extend({prop:function(t,e,i){var n,r,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return 1===s&&_t.isXMLDoc(t)||(e=_t.propFix[e]||e,r=_t.propHooks[e]),void 0!==i?r&&\"set\"in r&&void 0!==(n=r.set(t,i,e))?n:t[e]=i:r&&\"get\"in r&&null!==(n=r.get(t,e))?n:t[e]},propHooks:{tabIndex:{get:function(t){var e=_t.find.attr(t,\"tabindex\");return e?parseInt(e,10):Ce.test(t.nodeName)||ke.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),vt.optSelected||(_t.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),_t.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){_t.propFix[this.toLowerCase()]=this}),_t.fn.extend({addClass:function(t){var e,i,n,r,s,o,a,l=0;if(_t.isFunction(t))return this.each(function(e){_t(this).addClass(t.call(this,e,J(this)))});if(\"string\"==typeof t&&t)for(e=t.match(Pt)||[];i=this[l++];)if(r=J(i),n=1===i.nodeType&&\" \"+Z(r)+\" \"){for(o=0;s=e[o++];)n.indexOf(\" \"+s+\" \")<0&&(n+=s+\" \");a=Z(n),r!==a&&i.setAttribute(\"class\",a)}return this},removeClass:function(t){var e,i,n,r,s,o,a,l=0;if(_t.isFunction(t))return this.each(function(e){_t(this).removeClass(t.call(this,e,J(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if(\"string\"==typeof t&&t)for(e=t.match(Pt)||[];i=this[l++];)if(r=J(i),n=1===i.nodeType&&\" \"+Z(r)+\" \"){for(o=0;s=e[o++];)for(;n.indexOf(\" \"+s+\" \")>-1;)n=n.replace(\" \"+s+\" \",\" \");a=Z(n),r!==a&&i.setAttribute(\"class\",a)}return this},toggleClass:function(t,e){var i=typeof t;return\"boolean\"==typeof e&&\"string\"===i?e?this.addClass(t):this.removeClass(t):_t.isFunction(t)?this.each(function(i){_t(this).toggleClass(t.call(this,i,J(this),e),e)}):this.each(function(){var e,n,r,s;if(\"string\"===i)for(n=0,r=_t(this),s=t.match(Pt)||[];e=s[n++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&\"boolean\"!==i||(e=J(this),e&&Rt.set(this,\"__className__\",e),this.setAttribute&&this.setAttribute(\"class\",e||!1===t?\"\":Rt.get(this,\"__className__\")||\"\"))})},hasClass:function(t){var e,i,n=0;for(e=\" \"+t+\" \";i=this[n++];)if(1===i.nodeType&&(\" \"+Z(J(i))+\" \").indexOf(e)>-1)return!0;return!1}});var Te=/\\r/g;_t.fn.extend({val:function(t){var e,i,n,r=this[0];{if(arguments.length)return n=_t.isFunction(t),this.each(function(i){var r;1===this.nodeType&&(r=n?t.call(this,i,_t(this).val()):t,null==r?r=\"\":\"number\"==typeof r?r+=\"\":Array.isArray(r)&&(r=_t.map(r,function(t){return null==t?\"\":t+\"\"})),(e=_t.valHooks[this.type]||_t.valHooks[this.nodeName.toLowerCase()])&&\"set\"in e&&void 0!==e.set(this,r,\"value\")||(this.value=r))});if(r)return(e=_t.valHooks[r.type]||_t.valHooks[r.nodeName.toLowerCase()])&&\"get\"in e&&void 0!==(i=e.get(r,\"value\"))?i:(i=r.value,\"string\"==typeof i?i.replace(Te,\"\"):null==i?\"\":i)}}}),_t.extend({valHooks:{option:{get:function(t){var e=_t.find.attr(t,\"value\");return null!=e?e:Z(_t.text(t))}},select:{get:function(t){var e,i,n,r=t.options,s=t.selectedIndex,o=\"select-one\"===t.type,a=o?null:[],u=o?s+1:r.length;for(n=s<0?u:o?s:0;n<u;n++)if(i=r[n],(i.selected||n===s)&&!i.disabled&&(!i.parentNode.disabled||!l(i.parentNode,\"optgroup\"))){if(e=_t(i).val(),o)return e;a.push(e)}return a},set:function(t,e){for(var i,n,r=t.options,s=_t.makeArray(e),o=r.length;o--;)n=r[o],(n.selected=_t.inArray(_t.valHooks.option.get(n),s)>-1)&&(i=!0);return i||(t.selectedIndex=-1),s}}}}),_t.each([\"radio\",\"checkbox\"],function(){_t.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=_t.inArray(_t(t).val(),e)>-1}},vt.checkOn||(_t.valHooks[this].get=function(t){return null===t.getAttribute(\"value\")?\"on\":t.value})});var De=/^(?:focusinfocus|focusoutblur)$/;_t.extend(_t.event,{trigger:function(t,e,n,r){var s,o,a,l,u,c,h,d=[n||ot],p=ft.call(t,\"type\")?t.type:t,f=ft.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(o=a=n=n||ot,3!==n.nodeType&&8!==n.nodeType&&!De.test(p+_t.event.triggered)&&(p.indexOf(\".\")>-1&&(f=p.split(\".\"),p=f.shift(),f.sort()),u=p.indexOf(\":\")<0&&\"on\"+p,t=t[_t.expando]?t:new _t.Event(p,\"object\"==typeof t&&t),t.isTrigger=r?2:3,t.namespace=f.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+f.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:_t.makeArray(e,[t]),h=_t.event.special[p]||{},r||!h.trigger||!1!==h.trigger.apply(n,e))){if(!r&&!h.noBubble&&!_t.isWindow(n)){for(l=h.delegateType||p,De.test(l+p)||(o=o.parentNode);o;o=o.parentNode)d.push(o),a=o;a===(n.ownerDocument||ot)&&d.push(a.defaultView||a.parentWindow||i)}for(s=0;(o=d[s++])&&!t.isPropagationStopped();)t.type=s>1?l:h.bindType||p,c=(Rt.get(o,\"events\")||{})[t.type]&&Rt.get(o,\"handle\"),c&&c.apply(o,e),(c=u&&o[u])&&c.apply&&Ht(o)&&(t.result=c.apply(o,e),!1===t.result&&t.preventDefault());return t.type=p,r||t.isDefaultPrevented()||h._default&&!1!==h._default.apply(d.pop(),e)||!Ht(n)||u&&_t.isFunction(n[p])&&!_t.isWindow(n)&&(a=n[u],a&&(n[u]=null),_t.event.triggered=p,n[p](),_t.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,i){var n=_t.extend(new _t.Event,i,{type:t,isSimulated:!0});_t.event.trigger(n,null,e)}}),_t.fn.extend({trigger:function(t,e){return this.each(function(){_t.event.trigger(t,e,this)})},triggerHandler:function(t,e){var i=this[0];if(i)return _t.event.trigger(t,e,i,!0)}}),_t.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(t,e){_t.fn[e]=function(t,i){return arguments.length>0?this.on(e,null,t,i):this.trigger(e)}}),_t.fn.extend({hover:function(t,e){return this.mouseenter(t).mouseleave(e||t)}}),vt.focusin=\"onfocusin\"in i,vt.focusin||_t.each({focus:\"focusin\",blur:\"focusout\"},function(t,e){var i=function(t){_t.event.simulate(e,t.target,_t.event.fix(t))};_t.event.special[e]={setup:function(){var n=this.ownerDocument||this,r=Rt.access(n,e);r||n.addEventListener(t,i,!0),Rt.access(n,e,(r||0)+1)},teardown:function(){var n=this.ownerDocument||this,r=Rt.access(n,e)-1;r?Rt.access(n,e,r):(n.removeEventListener(t,i,!0),Rt.remove(n,e))}}});var Se=i.location,Ae=_t.now(),Ee=/\\?/;_t.parseXML=function(t){var e;if(!t||\"string\"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,\"text/xml\")}catch(t){e=void 0}return e&&!e.getElementsByTagName(\"parsererror\").length||_t.error(\"Invalid XML: \"+t),e};var Ie=/\\[\\]$/,$e=/\\r?\\n/g,Oe=/^(?:submit|button|image|reset|file)$/i,Pe=/^(?:input|select|textarea|keygen)/i;_t.param=function(t,e){var i,n=[],r=function(t,e){var i=_t.isFunction(e)?e():e;n[n.length]=encodeURIComponent(t)+\"=\"+encodeURIComponent(null==i?\"\":i)};if(Array.isArray(t)||t.jquery&&!_t.isPlainObject(t))_t.each(t,function(){r(this.name,this.value)});else for(i in t)Q(i,t[i],e,r);return n.join(\"&\")},_t.fn.extend({serialize:function(){return _t.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var t=_t.prop(this,\"elements\");return t?_t.makeArray(t):this}).filter(function(){var t=this.type;return this.name&&!_t(this).is(\":disabled\")&&Pe.test(this.nodeName)&&!Oe.test(t)&&(this.checked||!Kt.test(t))}).map(function(t,e){var i=_t(this).val();return null==i?null:Array.isArray(i)?_t.map(i,function(t){return{name:e.name,value:t.replace($e,\"\\r\\n\")}}):{name:e.name,value:i.replace($e,\"\\r\\n\")}}).get()}});var Ne=/%20/g,Me=/#.*$/,je=/([?&])_=[^&]*/,He=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Re=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Le=/^(?:GET|HEAD)$/,Fe=/^\\/\\//,ze={},We={},qe=\"*/\".concat(\"*\"),Be=ot.createElement(\"a\");Be.href=Se.href,_t.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:\"GET\",isLocal:Re.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":qe,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":_t.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?it(it(t,_t.ajaxSettings),e):it(_t.ajaxSettings,t)},ajaxPrefilter:tt(ze),ajaxTransport:tt(We),ajax:function(t,e){function n(t,e,n,a){var u,d,p,b,w,x=e;c||(c=!0,l&&i.clearTimeout(l),r=void 0,o=a||\"\",C.readyState=t>0?4:0,u=t>=200&&t<300||304===t,n&&(b=nt(f,C,n)),b=rt(f,b,C,u),u?(f.ifModified&&(w=C.getResponseHeader(\"Last-Modified\"),w&&(_t.lastModified[s]=w),(w=C.getResponseHeader(\"etag\"))&&(_t.etag[s]=w)),204===t||\"HEAD\"===f.type?x=\"nocontent\":304===t?x=\"notmodified\":(x=b.state,d=b.data,p=b.error,u=!p)):(p=x,!t&&x||(x=\"error\",t<0&&(t=0))),C.status=t,C.statusText=(e||x)+\"\",u?v.resolveWith(g,[d,x,C]):v.rejectWith(g,[C,x,p]),C.statusCode(y),y=void 0,h&&m.trigger(u?\"ajaxSuccess\":\"ajaxError\",[C,f,u?d:p]),_.fireWith(g,[C,x]),h&&(m.trigger(\"ajaxComplete\",[C,f]),--_t.active||_t.event.trigger(\"ajaxStop\")))}\"object\"==typeof t&&(e=t,t=void 0),e=e||{};var r,s,o,a,l,u,c,h,d,p,f=_t.ajaxSetup({},e),g=f.context||f,m=f.context&&(g.nodeType||g.jquery)?_t(g):_t.event,v=_t.Deferred(),_=_t.Callbacks(\"once memory\"),y=f.statusCode||{},b={},w={},x=\"canceled\",C={readyState:0,getResponseHeader:function(t){var e;if(c){if(!a)for(a={};e=He.exec(o);)a[e[1].toLowerCase()]=e[2];e=a[t.toLowerCase()]}return null==e?null:e},getAllResponseHeaders:function(){return c?o:null},setRequestHeader:function(t,e){return null==c&&(t=w[t.toLowerCase()]=w[t.toLowerCase()]||t,b[t]=e),this},overrideMimeType:function(t){return null==c&&(f.mimeType=t),this},statusCode:function(t){var e;if(t)if(c)C.always(t[C.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||x;return r&&r.abort(e),n(0,e),this}};if(v.promise(C),f.url=((t||f.url||Se.href)+\"\").replace(Fe,Se.protocol+\"//\"),f.type=e.method||e.type||f.method||f.type,f.dataTypes=(f.dataType||\"*\").toLowerCase().match(Pt)||[\"\"],null==f.crossDomain){u=ot.createElement(\"a\");try{u.href=f.url,u.href=u.href,f.crossDomain=Be.protocol+\"//\"+Be.host!=u.protocol+\"//\"+u.host}catch(t){f.crossDomain=!0}}if(f.data&&f.processData&&\"string\"!=typeof f.data&&(f.data=_t.param(f.data,f.traditional)),et(ze,f,e,C),c)return C;h=_t.event&&f.global,h&&0==_t.active++&&_t.event.trigger(\"ajaxStart\"),f.type=f.type.toUpperCase(),f.hasContent=!Le.test(f.type),s=f.url.replace(Me,\"\"),f.hasContent?f.data&&f.processData&&0===(f.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(f.data=f.data.replace(Ne,\"+\")):(p=f.url.slice(s.length),f.data&&(s+=(Ee.test(s)?\"&\":\"?\")+f.data,delete f.data),!1===f.cache&&(s=s.replace(je,\"$1\"),p=(Ee.test(s)?\"&\":\"?\")+\"_=\"+Ae+++p),f.url=s+p),f.ifModified&&(_t.lastModified[s]&&C.setRequestHeader(\"If-Modified-Since\",_t.lastModified[s]),_t.etag[s]&&C.setRequestHeader(\"If-None-Match\",_t.etag[s])),(f.data&&f.hasContent&&!1!==f.contentType||e.contentType)&&C.setRequestHeader(\"Content-Type\",f.contentType),C.setRequestHeader(\"Accept\",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+(\"*\"!==f.dataTypes[0]?\", \"+qe+\"; q=0.01\":\"\"):f.accepts[\"*\"]);for(d in f.headers)C.setRequestHeader(d,f.headers[d]);if(f.beforeSend&&(!1===f.beforeSend.call(g,C,f)||c))return C.abort();if(x=\"abort\",_.add(f.complete),C.done(f.success),C.fail(f.error),r=et(We,f,e,C)){if(C.readyState=1,h&&m.trigger(\"ajaxSend\",[C,f]),c)return C;f.async&&f.timeout>0&&(l=i.setTimeout(function(){C.abort(\"timeout\")},f.timeout));try{c=!1,r.send(b,n)}catch(t){if(c)throw t;n(-1,t)}}else n(-1,\"No Transport\");return C},getJSON:function(t,e,i){return _t.get(t,e,i,\"json\")},getScript:function(t,e){return _t.get(t,void 0,e,\"script\")}}),_t.each([\"get\",\"post\"],function(t,e){_t[e]=function(t,i,n,r){return _t.isFunction(i)&&(r=r||n,n=i,i=void 0),_t.ajax(_t.extend({url:t,type:e,dataType:r,data:i,success:n},_t.isPlainObject(t)&&t))}}),_t._evalUrl=function(t){return _t.ajax({url:t,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,throws:!0})},_t.fn.extend({wrapAll:function(t){var e;return this[0]&&(_t.isFunction(t)&&(t=t.call(this[0])),e=_t(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t}).append(this)),this},wrapInner:function(t){return _t.isFunction(t)?this.each(function(e){_t(this).wrapInner(t.call(this,e))}):this.each(function(){var e=_t(this),i=e.contents();i.length?i.wrapAll(t):e.append(t)})},wrap:function(t){var e=_t.isFunction(t);return this.each(function(i){_t(this).wrapAll(e?t.call(this,i):t)})},unwrap:function(t){return this.parent(t).not(\"body\").each(function(){_t(this).replaceWith(this.childNodes)}),this}}),_t.expr.pseudos.hidden=function(t){return!_t.expr.pseudos.visible(t)},_t.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},_t.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ue={0:200,1223:204},Ye=_t.ajaxSettings.xhr();vt.cors=!!Ye&&\"withCredentials\"in Ye,vt.ajax=Ye=!!Ye,_t.ajaxTransport(function(t){var e,n;if(vt.cors||Ye&&!t.crossDomain)return{send:function(r,s){var o,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r[\"X-Requested-With\"]||(r[\"X-Requested-With\"]=\"XMLHttpRequest\");for(o in r)a.setRequestHeader(o,r[o]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,\"abort\"===t?a.abort():\"error\"===t?\"number\"!=typeof a.status?s(0,\"error\"):s(a.status,a.statusText):s(Ue[a.status]||a.status,a.statusText,\"text\"!==(a.responseType||\"text\")||\"string\"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=e(\"error\"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout(function(){e&&n()})},e=e(\"abort\");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}}),_t.ajaxPrefilter(function(t){t.crossDomain&&(t.contents.script=!1)}),_t.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(t){return _t.globalEval(t),t}}}),_t.ajaxPrefilter(\"script\",function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type=\"GET\")}),_t.ajaxTransport(\"script\",function(t){if(t.crossDomain){var e,i;return{send:function(n,r){e=_t(\"<script>\").prop({charset:t.scriptCharset,src:t.url}).on(\"load error\",i=function(t){e.remove(),i=null,t&&r(\"error\"===t.type?404:200,t.type)}),ot.head.appendChild(e[0])},abort:function(){i&&i()}}}});var Ve=[],Ke=/(=)\\?(?=&|$)|\\?\\?/;_t.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var t=Ve.pop()||_t.expando+\"_\"+Ae++;return this[t]=!0,t}}),_t.ajaxPrefilter(\"json jsonp\",function(t,e,n){var r,s,o,a=!1!==t.jsonp&&(Ke.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ke.test(t.data)&&\"data\");if(a||\"jsonp\"===t.dataTypes[0])return r=t.jsonpCallback=_t.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ke,\"$1\"+r):!1!==t.jsonp&&(t.url+=(Ee.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+r),t.converters[\"script json\"]=function(){return o||_t.error(r+\" was not called\"),o[0]},t.dataTypes[0]=\"json\",s=i[r],i[r]=function(){o=arguments},n.always(function(){void 0===s?_t(i).removeProp(r):i[r]=s,t[r]&&(t.jsonpCallback=e.jsonpCallback,Ve.push(r)),o&&_t.isFunction(s)&&s(o[0]),o=s=void 0}),\"script\"}),vt.createHTMLDocument=function(){var t=ot.implementation.createHTMLDocument(\"\").body;return t.innerHTML=\"<form></form><form></form>\",2===t.childNodes.length}(),_t.parseHTML=function(t,e,i){if(\"string\"!=typeof t)return[];\"boolean\"==typeof e&&(i=e,e=!1);var n,r,s;return e||(vt.createHTMLDocument?(e=ot.implementation.createHTMLDocument(\"\"),n=e.createElement(\"base\"),n.href=ot.location.href,e.head.appendChild(n)):e=ot),r=St.exec(t),s=!i&&[],r?[e.createElement(r[1])]:(r=k([t],e,s),s&&s.length&&_t(s).remove(),_t.merge([],r.childNodes))},_t.fn.load=function(t,e,i){var n,r,s,o=this,a=t.indexOf(\" \");return a>-1&&(n=Z(t.slice(a)),t=t.slice(0,a)),_t.isFunction(e)?(i=e,e=void 0):e&&\"object\"==typeof e&&(r=\"POST\"),o.length>0&&_t.ajax({url:t,type:r||\"GET\",dataType:\"html\",data:e}).done(function(t){s=arguments,o.html(n?_t(\"<div>\").append(_t.parseHTML(t)).find(n):t)}).always(i&&function(t,e){o.each(function(){i.apply(this,s||[t.responseText,e,t])})}),this},_t.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(t,e){_t.fn[e]=function(t){return this.on(e,t)}}),_t.expr.pseudos.animated=function(t){return _t.grep(_t.timers,function(e){return t===e.elem}).length},_t.offset={setOffset:function(t,e,i){var n,r,s,o,a,l,u,c=_t.css(t,\"position\"),h=_t(t),d={};\"static\"===c&&(t.style.position=\"relative\"),a=h.offset(),s=_t.css(t,\"top\"),l=_t.css(t,\"left\"),u=(\"absolute\"===c||\"fixed\"===c)&&(s+l).indexOf(\"auto\")>-1,u?(n=h.position(),o=n.top,r=n.left):(o=parseFloat(s)||0,r=parseFloat(l)||0),_t.isFunction(e)&&(e=e.call(t,i,_t.extend({},a))),null!=e.top&&(d.top=e.top-a.top+o),null!=e.left&&(d.left=e.left-a.left+r),\"using\"in e?e.using.call(t,d):h.css(d)}},_t.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){_t.offset.setOffset(this,t,e)});var e,i,n,r,s=this[0];if(s)return s.getClientRects().length?(n=s.getBoundingClientRect(),e=s.ownerDocument,i=e.documentElement,r=e.defaultView,{top:n.top+r.pageYOffset-i.clientTop,left:n.left+r.pageXOffset-i.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var t,e,i=this[0],n={top:0,left:0};return\"fixed\"===_t.css(i,\"position\")?e=i.getBoundingClientRect():(t=this.offsetParent(),e=this.offset(),l(t[0],\"html\")||(n=t.offset()),n={top:n.top+_t.css(t[0],\"borderTopWidth\",!0),left:n.left+_t.css(t[0],\"borderLeftWidth\",!0)}),{top:e.top-n.top-_t.css(i,\"marginTop\",!0),left:e.left-n.left-_t.css(i,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent;t&&\"static\"===_t.css(t,\"position\");)t=t.offsetParent;return t||Qt})}}),_t.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,e){var i=\"pageYOffset\"===e;_t.fn[t]=function(n){return jt(this,function(t,n,r){var s;if(_t.isWindow(t)?s=t:9===t.nodeType&&(s=t.defaultView),void 0===r)return s?s[e]:t[n];s?s.scrollTo(i?s.pageXOffset:r,i?r:s.pageYOffset):t[n]=r},t,n,arguments.length)}}),_t.each([\"top\",\"left\"],function(t,e){_t.cssHooks[e]=H(vt.pixelPosition,function(t,i){if(i)return i=j(t,e),ue.test(i)?_t(t).position()[e]+\"px\":i})}),_t.each({Height:\"height\",Width:\"width\"},function(t,e){_t.each({padding:\"inner\"+t,content:e,\"\":\"outer\"+t},function(i,n){_t.fn[n]=function(r,s){var o=arguments.length&&(i||\"boolean\"!=typeof r),a=i||(!0===r||!0===s?\"margin\":\"border\");return jt(this,function(e,i,r){var s;return _t.isWindow(e)?0===n.indexOf(\"outer\")?e[\"inner\"+t]:e.document.documentElement[\"client\"+t]:9===e.nodeType?(s=e.documentElement,Math.max(e.body[\"scroll\"+t],s[\"scroll\"+t],e.body[\"offset\"+t],s[\"offset\"+t],s[\"client\"+t])):void 0===r?_t.css(e,i,a):_t.style(e,i,r,a)},e,o?r:void 0,o)}})}),_t.fn.extend({bind:function(t,e,i){return this.on(t,null,e,i)},unbind:function(t,e){return this.off(t,null,e)},delegate:function(t,e,i,n){return this.on(e,t,i,n)},undelegate:function(t,e,i){return 1===arguments.length?this.off(t,\"**\"):this.off(e,t||\"**\",i)}}),_t.holdReady=function(t){t?_t.readyWait++:_t.ready(!0)},_t.isArray=Array.isArray,_t.parseJSON=JSON.parse,_t.nodeName=l,n=[],void 0!==(r=function(){return _t}.apply(e,n))&&(t.exports=r);var Xe=i.jQuery,Ge=i.$;return _t.noConflict=function(t){return i.$===_t&&(i.$=Ge),t&&i.jQuery===_t&&(i.jQuery=Xe),_t},s||(i.jQuery=i.$=_t),_t})},function(t,e){var i;i=function(){return this}();try{i=i||Function(\"return this\")()||(0,eval)(\"this\")}catch(t){\"object\"==typeof window&&(i=window)}t.exports=i},function(t,e,i){i(29),i(18),Vue.component(\"passport-clients\",i(39)),Vue.component(\"passport-authorized-clients\",i(38)),Vue.component(\"passport-personal-access-tokens\",i(40)),Vue.component(\"importer\",i(37))},,,,,function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.default={props:[\"alertType\",\"title\"],computed:{alertClassName:function(){return\"alert-\"+this.alertType}},methods:{hideEvent:function(){this.$emit(\"hide\")}}}},function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.default={props:[\"errors\"]}},function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.default={props:[\"file\"],data:function(){return{activeFile:this.file,processDetail:!1,statusText:null,options:{importType:this.file.import_type,update:!1,importTypes:[{id:\"asset\",text:\"Assets\"},{id:\"accessory\",text:\"Accessories\"},{id:\"consumable\",text:\"Consumables\"},{id:\"component\",text:\"Components\"},{id:\"license\",text:\"Licenses\"},{id:\"user\",text:\"Users\"}],statusText:null},columnOptions:{general:[{id:\"category\",text:\"Category\"},{id:\"company\",text:\"Company\"},{id:\"checkout_to\",text:\"Checked out to\"},{id:\"email\",text:\"Email\"},{id:\"first_name\",text:\"First Name\"},{id:\"item_name\",text:\"Item Name\"},{id:\"last_name\",text:\"Last Name\"},{id:\"location\",text:\"Location\"},{id:\"maintained\",text:\"Maintained\"},{id:\"manufacturer\",text:\"Manufacturer\"},{id:\"notes\",text:\"Notes\"},{id:\"order_number\",text:\"Order Number\"},{id:\"purchase_cost\",text:\"Purchase Cost\"},{id:\"purchase_date\",text:\"Purchase Date\"},{id:\"quantity\",text:\"Quantity\"},{id:\"requestable\",text:\"Requestable\"},{id:\"serial\",text:\"Serial Number\"},{id:\"supplier\",text:\"Supplier\"},{id:\"username\",text:\"Username\"}],assets:[{id:\"asset_tag\",text:\"Asset Tag\"},{id:\"asset_model\",text:\"Model Name\"},{id:\"image\",text:\"Image Filename\"},{id:\"model_number\",text:\"Model Number\"},{id:\"name\",text:\"Full Name\"},{id:\"status\",text:\"Status\"},{id:\"warranty_months\",text:\"Warranty Months\"}],licenses:[{id:\"expiration_date\",text:\"Expiration Date\"},{id:\"license_email\",text:\"Licensed To Email\"},{id:\"license_name\",text:\"Licensed To Name\"},{id:\"purchase_order\",text:\"Purchase Order\"},{id:\"reassignable\",text:\"Reassignable\"},{id:\"seats\",text:\"Seats\"}],users:[{id:\"employee_num\",text:\"Employee Number\"},{id:\"jobtitle\",text:\"Job Title\"},{id:\"phone_number\",text:\"Phone Number\"}],customFields:[]},columnMappings:this.file.field_map||{},activeColumn:null}},created:function(){this.fetchCustomFields(),window.eventHub.$on(\"showDetails\",this.toggleExtendedDisplay),this.populateSelect2ActiveItems()},computed:{columns:function(){switch(this.options.importType){case\"asset\":return this.columnOptions.general.concat(this.columnOptions.assets).concat(this.columnOptions.customFields);case\"license\":return this.columnOptions.general.concat(this.columnOptions.licenses);case\"user\":return this.columnOptions.general.concat(this.columnOptions.users)}return this.columnOptions.general}},methods:{fetchCustomFields:function(){var t=this;this.$http.get(\"/api/v1/fields\").then(function(e){var i=e.data;i=i.rows,i.forEach(function(e){t.columnOptions.customFields.push({id:e.db_column_name,text:e.name})})})},postSave:function(){var t=this;this.statusText=\"Processing...\",this.$http.post(\"/api/v1/imports/process/\"+this.file.id,{\"import-update\":this.options.update,\"import-type\":this.options.importType,\"column-mappings\":this.columnMappings}).then(function(e){t.statusText=\"Success... Redirecting.\",window.location.href=e.body.messages.redirect_url},function(e){\"import-errors\"==e.body.status?(window.eventHub.$emit(\"importErrors\",e.body.messages),t.statusText=\"Error\"):t.$emit(\"alert\",{message:e.body.messages,type:\"danger\",visible:!0}),t.displayImportModal=!1})},populateSelect2ActiveItems:function(){if(null==this.file.field_map){for(var t=0;t<this.file.header_row.length;t++)this.$set(this.columnMappings,this.file.header_row[t],null);for(var e=0;e<this.columns.length;e++){var i=this.columns[e],n=this.file.header_row.indexOf(i.text);-1!=n&&this.$set(this.columnMappings,this.file.header_row[n],i.id)}}},toggleExtendedDisplay:function(t){t==this.file.id&&(this.processDetail=!this.processDetail)},updateModel:function(t,e){this.columnMappings[t]=e}},components:{select2:i(41)}}},function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),i(19),e.default={data:function(){return{files:[],displayImportModal:!1,activeFile:null,alert:{type:null,message:null,visible:!1},importErrors:null,progress:{currentClass:\"progress-bar-warning\",currentPercent:\"0\",statusText:\"\",visible:!1}}},mounted:function(){window.eventHub.$on(\"importErrors\",this.updateImportErrors),this.fetchFiles();var t=this;$(\"#fileupload\").fileupload({dataType:\"json\",done:function(e,i){t.progress.currentClass=\"progress-bar-success\",t.progress.statusText=\"Success!\",t.files=i.result.files.concat(t.files)},add:function(e,i){i.headers={\"X-Requested-With\":\"XMLHttpRequest\",\"X-CSRF-TOKEN\":Laravel.csrfToken},i.process().done(function(){i.submit()}),t.progress.visible=!0},progress:function(e,i){var n=parseInt((i.loaded,i.total,10));t.progress.currentPercent=n,t.progress.statusText=n+\"% Complete\"},fail:function(e,i){t.progress.currentClass=\"progress-bar-danger\",t.progress.statusText=i.jqXHR.responseJSON.messages}})},methods:{fetchFiles:function(){var t=this;this.$http.get(\"/api/v1/imports\").then(function(e){var i=e.data;return t.files=i},function(e){t.alert.type=\"danger\",t.alert.visible=!0,t.alert.message=\"Something went wrong fetching files...\"})},deleteFile:function(t,e){var i=this;this.$http.delete(\"/api/v1/imports/\"+t.id).then(function(t){return i.files.splice(e,1)},function(t){i.alert.type=\"danger\",i.alert.visible=!0,i.alert.message=t.body.messages})},toggleEvent:function(t){window.eventHub.$emit(\"showDetails\",t)},updateAlert:function(t){this.alert=t},updateImportErrors:function(t){this.importErrors=t}},computed:{progressWidth:function(){return\"width: \"+10*this.progress.currentPercent+\"%\"}},components:{alert:i(34),errors:i(35),importFile:i(36)}}},function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.default={data:function(){return{tokens:[]}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens()},getTokens:function(){var t=this;this.$http.get(\"/oauth/tokens\").then(function(e){t.tokens=e.data})},revoke:function(t){var e=this;this.$http.delete(\"/oauth/tokens/\"+t.id).then(function(t){e.getTokens()})}}}},function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t};e.default={data:function(){return{clients:[],createForm:{errors:[],name:\"\",redirect:\"\"},editForm:{errors:[],name:\"\",redirect:\"\"}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getClients(),$(\"#modal-create-client\").on(\"shown.bs.modal\",function(){$(\"#create-client-name\").focus()}),$(\"#modal-edit-client\").on(\"shown.bs.modal\",function(){$(\"#edit-client-name\").focus()})},getClients:function(){var t=this;this.$http.get(\"/oauth/clients\").then(function(e){t.clients=e.data})},showCreateClientForm:function(){$(\"#modal-create-client\").modal(\"show\")},store:function(){this.persistClient(\"post\",\"/oauth/clients\",this.createForm,\"#modal-create-client\")},edit:function(t){this.editForm.id=t.id,this.editForm.name=t.name,this.editForm.redirect=t.redirect,$(\"#modal-edit-client\").modal(\"show\")},update:function(){this.persistClient(\"put\",\"/oauth/clients/\"+this.editForm.id,this.editForm,\"#modal-edit-client\")},persistClient:function(t,e,i,r){var s=this;i.errors=[],this.$http[t](e,i).then(function(t){s.getClients(),i.name=\"\",i.redirect=\"\",i.errors=[],$(r).modal(\"hide\")}).catch(function(t){\"object\"===n(t.data)?i.errors=_.flatten(_.toArray(t.data)):i.errors=[\"Something went wrong. Please try again.\"]})},destroy:function(t){var e=this;this.$http.delete(\"/oauth/clients/\"+t.id).then(function(t){e.getClients()})}}}},function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t};e.default={data:function(){return{accessToken:null,tokens:[],scopes:[],form:{name:\"\",scopes:[],errors:[]}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens(),this.getScopes(),$(\"#modal-create-token\").on(\"shown.bs.modal\",function(){$(\"#create-token-name\").focus()})},getTokens:function(){var t=this;this.$http.get(\"/oauth/personal-access-tokens\").then(function(e){t.tokens=e.data})},getScopes:function(){var t=this;this.$http.get(\"/oauth/scopes\").then(function(e){t.scopes=e.data})},showCreateTokenForm:function(){$(\"#modal-create-token\").modal(\"show\")},store:function(){var t=this;this.accessToken=null,this.form.errors=[],this.$http.post(\"/oauth/personal-access-tokens\",this.form).then(function(e){t.form.name=\"\",t.form.scopes=[],t.form.errors=[],t.tokens.push(e.data.token),t.showAccessToken(e.data.accessToken)}).catch(function(e){\"object\"===n(e.data)?t.form.errors=_.flatten(_.toArray(e.data)):t.form.errors=[\"Something went wrong. Please try again.\"]})},toggleScope:function(t){this.scopeIsAssigned(t)?this.form.scopes=_.reject(this.form.scopes,function(e){return e==t}):this.form.scopes.push(t)},scopeIsAssigned:function(t){return _.indexOf(this.form.scopes,t)>=0},showAccessToken:function(t){$(\"#modal-create-token\").modal(\"hide\"),this.accessToken=t,$(\"#modal-access-token\").modal(\"show\")},revoke:function(t){var e=this;this.$http.delete(\"/oauth/personal-access-tokens/\"+t.id).then(function(t){e.getTokens()})}}}},function(t,e,i){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),i(33),e.default={props:[\"options\",\"value\"],mounted:function(){var t=this;$(this.$el).select2({data:this.options}).on(\"change\",function(){t.$emit(\"input\",this.value)}).val(this.value).trigger(\"change\")},watch:{value:function(t){$(this.$el).val(t)},options:function(t){var e=this;$(this.$el).select2(\"destroy\").empty().select2({data:t}).on(\"change\",function(){e.$emit(\"input\",this.value)}).val(this.value).trigger(\"change\")},destroyed:function(){$(this.$el).off().select2(\"destroy\")}}}},function(t,e,i){window._=i(32),window.$=window.jQuery=i(3),i(20),window.Vue=i(59),window.eventHub=new Vue,i(49),Vue.http.interceptors.push(function(t,e){t.headers.set(\"X-CSRF-TOKEN\",Laravel.csrfToken),e()})},function(t,e,i){var n,r,s;!function(o){\"use strict\";r=[i(3),i(31)],n=o,void 0!==(s=\"function\"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){\"use strict\";function e(e){var i=\"dragover\"===e;return function(n){n.dataTransfer=n.originalEvent&&n.originalEvent.dataTransfer;var r=n.dataTransfer;r&&-1!==t.inArray(\"Files\",r.types)&&!1!==this._trigger(e,t.Event(e,{delegatedEvent:n}))&&(n.preventDefault(),i&&(r.dropEffect=\"copy\"))}}t.support.fileInput=!(new RegExp(\"(Android (1\\\\.[0156]|2\\\\.[01]))|(Windows Phone (OS 7|8\\\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)|(w(eb)?OSBrowser)|(webOS)|(Kindle/(1\\\\.0|2\\\\.[05]|3\\\\.0))\").test(window.navigator.userAgent)||t('<input type=\"file\">').prop(\"disabled\")),t.support.xhrFileUpload=!(!window.ProgressEvent||!window.FileReader),t.support.xhrFormDataFileUpload=!!window.FormData,t.support.blobSlice=window.Blob&&(Blob.prototype.slice||Blob.prototype.webkitSlice||Blob.prototype.mozSlice),t.widget(\"blueimp.fileupload\",{options:{dropZone:t(document),pasteZone:void 0,fileInput:void 0,replaceFileInput:!0,paramName:void 0,singleFileUploads:!0,limitMultiFileUploads:void 0,limitMultiFileUploadSize:void 0,limitMultiFileUploadSizeOverhead:512,sequentialUploads:!1,limitConcurrentUploads:void 0,forceIframeTransport:!1,redirect:void 0,redirectParamName:void 0,postMessage:void 0,multipart:!0,maxChunkSize:void 0,uploadedBytes:void 0,recalculateProgress:!0,progressInterval:100,bitrateInterval:500,autoUpload:!0,messages:{uploadedBytes:\"Uploaded bytes exceed file size\"},i18n:function(e,i){return e=this.messages[e]||e.toString(),i&&t.each(i,function(t,i){e=e.replace(\"{\"+t+\"}\",i)}),e},formData:function(t){return t.serializeArray()},add:function(e,i){if(e.isDefaultPrevented())return!1;(i.autoUpload||!1!==i.autoUpload&&t(this).fileupload(\"option\",\"autoUpload\"))&&i.process().done(function(){i.submit()})},processData:!1,contentType:!1,cache:!1,timeout:0},_specialOptions:[\"fileInput\",\"dropZone\",\"pasteZone\",\"multipart\",\"forceIframeTransport\"],_blobSlice:t.support.blobSlice&&function(){return(this.slice||this.webkitSlice||this.mozSlice).apply(this,arguments)},_BitrateTimer:function(){this.timestamp=Date.now?Date.now():(new Date).getTime(),this.loaded=0,this.bitrate=0,this.getBitrate=function(t,e,i){var n=t-this.timestamp;return(!this.bitrate||!i||n>i)&&(this.bitrate=(e-this.loaded)*(1e3/n)*8,this.loaded=e,this.timestamp=t),this.bitrate}},_isXHRUpload:function(e){return!e.forceIframeTransport&&(!e.multipart&&t.support.xhrFileUpload||t.support.xhrFormDataFileUpload)},_getFormData:function(e){var i;return\"function\"===t.type(e.formData)?e.formData(e.form):t.isArray(e.formData)?e.formData:\"object\"===t.type(e.formData)?(i=[],t.each(e.formData,function(t,e){i.push({name:t,value:e})}),i):[]},_getTotal:function(e){var i=0;return t.each(e,function(t,e){i+=e.size||1}),i},_initProgressObject:function(e){var i={loaded:0,total:0,bitrate:0};e._progress?t.extend(e._progress,i):e._progress=i},_initResponseObject:function(t){var e;if(t._response)for(e in t._response)t._response.hasOwnProperty(e)&&delete t._response[e];else t._response={}},_onProgress:function(e,i){if(e.lengthComputable){var n,r=Date.now?Date.now():(new Date).getTime();if(i._time&&i.progressInterval&&r-i._time<i.progressInterval&&e.loaded!==e.total)return;i._time=r,n=Math.floor(e.loaded/e.total*(i.chunkSize||i._progress.total))+(i.uploadedBytes||0),this._progress.loaded+=n-i._progress.loaded,this._progress.bitrate=this._bitrateTimer.getBitrate(r,this._progress.loaded,i.bitrateInterval),i._progress.loaded=i.loaded=n,i._progress.bitrate=i.bitrate=i._bitrateTimer.getBitrate(r,n,i.bitrateInterval),this._trigger(\"progress\",t.Event(\"progress\",{delegatedEvent:e}),i),this._trigger(\"progressall\",t.Event(\"progressall\",{delegatedEvent:e}),this._progress)}},_initProgressListener:function(e){var i=this,n=e.xhr?e.xhr():t.ajaxSettings.xhr();n.upload&&(t(n.upload).bind(\"progress\",function(t){var n=t.originalEvent;t.lengthComputable=n.lengthComputable,t.loaded=n.loaded,t.total=n.total,i._onProgress(t,e)}),e.xhr=function(){return n})},_isInstanceOf:function(t,e){return Object.prototype.toString.call(e)===\"[object \"+t+\"]\"},_initXHRData:function(e){var i,n=this,r=e.files[0],s=e.multipart||!t.support.xhrFileUpload,o=\"array\"===t.type(e.paramName)?e.paramName[0]:e.paramName;e.headers=t.extend({},e.headers),e.contentRange&&(e.headers[\"Content-Range\"]=e.contentRange),s&&!e.blob&&this._isInstanceOf(\"File\",r)||(e.headers[\"Content-Disposition\"]='attachment; filename=\"'+encodeURI(r.name)+'\"'),s?t.support.xhrFormDataFileUpload&&(e.postMessage?(i=this._getFormData(e),e.blob?i.push({name:o,value:e.blob}):t.each(e.files,function(n,r){i.push({name:\"array\"===t.type(e.paramName)&&e.paramName[n]||o,value:r})})):(n._isInstanceOf(\"FormData\",e.formData)?i=e.formData:(i=new FormData,t.each(this._getFormData(e),function(t,e){i.append(e.name,e.value)})),e.blob?i.append(o,e.blob,r.name):t.each(e.files,function(r,s){(n._isInstanceOf(\"File\",s)||n._isInstanceOf(\"Blob\",s))&&i.append(\"array\"===t.type(e.paramName)&&e.paramName[r]||o,s,s.uploadName||s.name)})),e.data=i):(e.contentType=r.type||\"application/octet-stream\",e.data=e.blob||r),e.blob=null},_initIframeSettings:function(e){var i=t(\"<a></a>\").prop(\"href\",e.url).prop(\"host\");e.dataType=\"iframe \"+(e.dataType||\"\"),e.formData=this._getFormData(e),e.redirect&&i&&i!==location.host&&e.formData.push({name:e.redirectParamName||\"redirect\",value:e.redirect})},_initDataSettings:function(t){this._isXHRUpload(t)?(this._chunkedUpload(t,!0)||(t.data||this._initXHRData(t),this._initProgressListener(t)),t.postMessage&&(t.dataType=\"postmessage \"+(t.dataType||\"\"))):this._initIframeSettings(t)},_getParamName:function(e){var i=t(e.fileInput),n=e.paramName;return n?t.isArray(n)||(n=[n]):(n=[],i.each(function(){for(var e=t(this),i=e.prop(\"name\")||\"files[]\",r=(e.prop(\"files\")||[1]).length;r;)n.push(i),r-=1}),n.length||(n=[i.prop(\"name\")||\"files[]\"])),n},_initFormSettings:function(e){e.form&&e.form.length||(e.form=t(e.fileInput.prop(\"form\")),e.form.length||(e.form=t(this.options.fileInput.prop(\"form\")))),e.paramName=this._getParamName(e),e.url||(e.url=e.form.prop(\"action\")||location.href),e.type=(e.type||\"string\"===t.type(e.form.prop(\"method\"))&&e.form.prop(\"method\")||\"\").toUpperCase(),\"POST\"!==e.type&&\"PUT\"!==e.type&&\"PATCH\"!==e.type&&(e.type=\"POST\"),e.formAcceptCharset||(e.formAcceptCharset=e.form.attr(\"accept-charset\"))},_getAJAXSettings:function(e){var i=t.extend({},this.options,e);return this._initFormSettings(i),this._initDataSettings(i),i},_getDeferredState:function(t){return t.state?t.state():t.isResolved()?\"resolved\":t.isRejected()?\"rejected\":\"pending\"},_enhancePromise:function(t){return t.success=t.done,t.error=t.fail,t.complete=t.always,t},_getXHRPromise:function(e,i,n){var r=t.Deferred(),s=r.promise();return i=i||this.options.context||s,!0===e?r.resolveWith(i,n):!1===e&&r.rejectWith(i,n),s.abort=r.promise,this._enhancePromise(s)},_addConvenienceMethods:function(e,i){var n=this,r=function(e){return t.Deferred().resolveWith(n,e).promise()};i.process=function(e,s){return(e||s)&&(i._processQueue=this._processQueue=(this._processQueue||r([this])).then(function(){return i.errorThrown?t.Deferred().rejectWith(n,[i]).promise():r(arguments)}).then(e,s)),this._processQueue||r([this])},i.submit=function(){return\"pending\"!==this.state()&&(i.jqXHR=this.jqXHR=!1!==n._trigger(\"submit\",t.Event(\"submit\",{delegatedEvent:e}),this)&&n._onSend(e,this)),this.jqXHR||n._getXHRPromise()},i.abort=function(){return this.jqXHR?this.jqXHR.abort():(this.errorThrown=\"abort\",n._trigger(\"fail\",null,this),n._getXHRPromise(!1))},i.state=function(){return this.jqXHR?n._getDeferredState(this.jqXHR):this._processQueue?n._getDeferredState(this._processQueue):void 0},i.processing=function(){return!this.jqXHR&&this._processQueue&&\"pending\"===n._getDeferredState(this._processQueue)},i.progress=function(){return this._progress},i.response=function(){return this._response}},_getUploadedBytes:function(t){var e=t.getResponseHeader(\"Range\"),i=e&&e.split(\"-\"),n=i&&i.length>1&&parseInt(i[1],10);return n&&n+1},_chunkedUpload:function(e,i){e.uploadedBytes=e.uploadedBytes||0;var n,r,s=this,o=e.files[0],a=o.size,l=e.uploadedBytes,u=e.maxChunkSize||a,c=this._blobSlice,h=t.Deferred(),d=h.promise();return!(!(this._isXHRUpload(e)&&c&&(l||u<a))||e.data)&&(!!i||(l>=a?(o.error=e.i18n(\"uploadedBytes\"),this._getXHRPromise(!1,e.context,[null,\"error\",o.error])):(r=function(){var i=t.extend({},e),d=i._progress.loaded;i.blob=c.call(o,l,l+u,o.type),i.chunkSize=i.blob.size,i.contentRange=\"bytes \"+l+\"-\"+(l+i.chunkSize-1)+\"/\"+a,s._initXHRData(i),s._initProgressListener(i),n=(!1!==s._trigger(\"chunksend\",null,i)&&t.ajax(i)||s._getXHRPromise(!1,i.context)).done(function(n,o,u){l=s._getUploadedBytes(u)||l+i.chunkSize,d+i.chunkSize-i._progress.loaded&&s._onProgress(t.Event(\"progress\",{lengthComputable:!0,loaded:l-i.uploadedBytes,total:l-i.uploadedBytes}),i),e.uploadedBytes=i.uploadedBytes=l,i.result=n,i.textStatus=o,i.jqXHR=u,s._trigger(\"chunkdone\",null,i),s._trigger(\"chunkalways\",null,i),l<a?r():h.resolveWith(i.context,[n,o,u])}).fail(function(t,e,n){i.jqXHR=t,i.textStatus=e,i.errorThrown=n,s._trigger(\"chunkfail\",null,i),s._trigger(\"chunkalways\",null,i),h.rejectWith(i.context,[t,e,n])})},this._enhancePromise(d),d.abort=function(){return n.abort()},r(),d)))},_beforeSend:function(t,e){0===this._active&&(this._trigger(\"start\"),this._bitrateTimer=new this._BitrateTimer,this._progress.loaded=this._progress.total=0,this._progress.bitrate=0),this._initResponseObject(e),this._initProgressObject(e),e._progress.loaded=e.loaded=e.uploadedBytes||0,e._progress.total=e.total=this._getTotal(e.files)||1,e._progress.bitrate=e.bitrate=0,this._active+=1,this._progress.loaded+=e.loaded,this._progress.total+=e.total},_onDone:function(e,i,n,r){var s=r._progress.total,o=r._response;r._progress.loaded<s&&this._onProgress(t.Event(\"progress\",{lengthComputable:!0,loaded:s,total:s}),r),o.result=r.result=e,o.textStatus=r.textStatus=i,o.jqXHR=r.jqXHR=n,this._trigger(\"done\",null,r)},_onFail:function(t,e,i,n){var r=n._response;n.recalculateProgress&&(this._progress.loaded-=n._progress.loaded,this._progress.total-=n._progress.total),r.jqXHR=n.jqXHR=t,r.textStatus=n.textStatus=e,r.errorThrown=n.errorThrown=i,this._trigger(\"fail\",null,n)},_onAlways:function(t,e,i,n){this._trigger(\"always\",null,n)},_onSend:function(e,i){i.submit||this._addConvenienceMethods(e,i);var n,r,s,o,a=this,l=a._getAJAXSettings(i),u=function(){return a._sending+=1,l._bitrateTimer=new a._BitrateTimer,n=n||((r||!1===a._trigger(\"send\",t.Event(\"send\",{delegatedEvent:e}),l))&&a._getXHRPromise(!1,l.context,r)||a._chunkedUpload(l)||t.ajax(l)).done(function(t,e,i){a._onDone(t,e,i,l)}).fail(function(t,e,i){a._onFail(t,e,i,l)}).always(function(t,e,i){if(a._onAlways(t,e,i,l),a._sending-=1,a._active-=1,l.limitConcurrentUploads&&l.limitConcurrentUploads>a._sending)for(var n=a._slots.shift();n;){if(\"pending\"===a._getDeferredState(n)){n.resolve();break}n=a._slots.shift()}0===a._active&&a._trigger(\"stop\")})};return this._beforeSend(e,l),this.options.sequentialUploads||this.options.limitConcurrentUploads&&this.options.limitConcurrentUploads<=this._sending?(this.options.limitConcurrentUploads>1?(s=t.Deferred(),this._slots.push(s),o=s.then(u)):(this._sequence=this._sequence.then(u,u),o=this._sequence),o.abort=function(){return r=[void 0,\"abort\",\"abort\"],n?n.abort():(s&&s.rejectWith(l.context,r),u())},this._enhancePromise(o)):u()},_onAdd:function(e,i){var n,r,s,o,a=this,l=!0,u=t.extend({},this.options,i),c=i.files,h=c.length,d=u.limitMultiFileUploads,p=u.limitMultiFileUploadSize,f=u.limitMultiFileUploadSizeOverhead,g=0,m=this._getParamName(u),v=0;if(!h)return!1;if(p&&void 0===c[0].size&&(p=void 0),(u.singleFileUploads||d||p)&&this._isXHRUpload(u))if(u.singleFileUploads||p||!d)if(!u.singleFileUploads&&p)for(s=[],n=[],o=0;o<h;o+=1)g+=c[o].size+f,(o+1===h||g+c[o+1].size+f>p||d&&o+1-v>=d)&&(s.push(c.slice(v,o+1)),r=m.slice(v,o+1),r.length||(r=m),n.push(r),v=o+1,g=0);else n=m;else for(s=[],n=[],o=0;o<h;o+=d)s.push(c.slice(o,o+d)),r=m.slice(o,o+d),r.length||(r=m),n.push(r);else s=[c],n=[m];return i.originalFiles=c,t.each(s||c,function(r,o){var u=t.extend({},i);return u.files=s?o:[o],u.paramName=n[r],a._initResponseObject(u),a._initProgressObject(u),a._addConvenienceMethods(e,u),l=a._trigger(\"add\",t.Event(\"add\",{delegatedEvent:e}),u)}),l},_replaceFileInput:function(e){var i=e.fileInput,n=i.clone(!0),r=i.is(document.activeElement);e.fileInputClone=n,t(\"<form></form>\").append(n)[0].reset(),i.after(n).detach(),r&&n.focus(),t.cleanData(i.unbind(\"remove\")),this.options.fileInput=this.options.fileInput.map(function(t,e){return e===i[0]?n[0]:e}),i[0]===this.element[0]&&(this.element=n)},_handleFileTreeEntry:function(e,i){var n,r=this,s=t.Deferred(),o=[],a=function(t){t&&!t.entry&&(t.entry=e),s.resolve([t])},l=function(t){r._handleFileTreeEntries(t,i+e.name+\"/\").done(function(t){s.resolve(t)}).fail(a)},u=function(){n.readEntries(function(t){t.length?(o=o.concat(t),u()):l(o)},a)};return i=i||\"\",e.isFile?e._file?(e._file.relativePath=i,s.resolve(e._file)):e.file(function(t){t.relativePath=i,s.resolve(t)},a):e.isDirectory?(n=e.createReader(),u()):s.resolve([]),s.promise()},_handleFileTreeEntries:function(e,i){var n=this;return t.when.apply(t,t.map(e,function(t){return n._handleFileTreeEntry(t,i)})).then(function(){return Array.prototype.concat.apply([],arguments)})},_getDroppedFiles:function(e){e=e||{};var i=e.items;return i&&i.length&&(i[0].webkitGetAsEntry||i[0].getAsEntry)?this._handleFileTreeEntries(t.map(i,function(t){var e;return t.webkitGetAsEntry?(e=t.webkitGetAsEntry(),e&&(e._file=t.getAsFile()),e):t.getAsEntry()})):t.Deferred().resolve(t.makeArray(e.files)).promise()},_getSingleFileInputFiles:function(e){e=t(e);var i,n,r=e.prop(\"webkitEntries\")||e.prop(\"entries\");if(r&&r.length)return this._handleFileTreeEntries(r);if(i=t.makeArray(e.prop(\"files\")),i.length)void 0===i[0].name&&i[0].fileName&&t.each(i,function(t,e){e.name=e.fileName,e.size=e.fileSize});else{if(!(n=e.prop(\"value\")))return t.Deferred().resolve([]).promise();i=[{name:n.replace(/^.*\\\\/,\"\")}]}return t.Deferred().resolve(i).promise()},_getFileInputFiles:function(e){return e instanceof t&&1!==e.length?t.when.apply(t,t.map(e,this._getSingleFileInputFiles)).then(function(){return Array.prototype.concat.apply([],arguments)}):this._getSingleFileInputFiles(e)},_onChange:function(e){var i=this,n={fileInput:t(e.target),form:t(e.target.form)};this._getFileInputFiles(n.fileInput).always(function(r){n.files=r,i.options.replaceFileInput&&i._replaceFileInput(n),!1!==i._trigger(\"change\",t.Event(\"change\",{delegatedEvent:e}),n)&&i._onAdd(e,n)})},_onPaste:function(e){var i=e.originalEvent&&e.originalEvent.clipboardData&&e.originalEvent.clipboardData.items,n={files:[]};i&&i.length&&(t.each(i,function(t,e){var i=e.getAsFile&&e.getAsFile();i&&n.files.push(i)}),!1!==this._trigger(\"paste\",t.Event(\"paste\",{delegatedEvent:e}),n)&&this._onAdd(e,n))},_onDrop:function(e){e.dataTransfer=e.originalEvent&&e.originalEvent.dataTransfer;var i=this,n=e.dataTransfer,r={};n&&n.files&&n.files.length&&(e.preventDefault(),this._getDroppedFiles(n).always(function(n){r.files=n,!1!==i._trigger(\"drop\",t.Event(\"drop\",{delegatedEvent:e}),r)&&i._onAdd(e,r)}))},_onDragOver:e(\"dragover\"),_onDragEnter:e(\"dragenter\"),_onDragLeave:e(\"dragleave\"),_initEventHandlers:function(){this._isXHRUpload(this.options)&&(this._on(this.options.dropZone,{dragover:this._onDragOver,drop:this._onDrop,dragenter:this._onDragEnter,dragleave:this._onDragLeave}),this._on(this.options.pasteZone,{paste:this._onPaste})),t.support.fileInput&&this._on(this.options.fileInput,{change:this._onChange})},_destroyEventHandlers:function(){this._off(this.options.dropZone,\"dragenter dragleave dragover drop\"),this._off(this.options.pasteZone,\"paste\"),this._off(this.options.fileInput,\"change\")},_destroy:function(){this._destroyEventHandlers()},_setOption:function(e,i){var n=-1!==t.inArray(e,this._specialOptions);n&&this._destroyEventHandlers(),this._super(e,i),n&&(this._initSpecialOptions(),this._initEventHandlers())},_initSpecialOptions:function(){var e=this.options;void 0===e.fileInput?e.fileInput=this.element.is('input[type=\"file\"]')?this.element:this.element.find('input[type=\"file\"]'):e.fileInput instanceof t||(e.fileInput=t(e.fileInput)),e.dropZone instanceof t||(e.dropZone=t(e.dropZone)),e.pasteZone instanceof t||(e.pasteZone=t(e.pasteZone))},_getRegExp:function(t){var e=t.split(\"/\"),i=e.pop();return e.shift(),new RegExp(e.join(\"/\"),i)},_isRegExpOption:function(e,i){return\"url\"!==e&&\"string\"===t.type(i)&&/^\\/.*\\/[igm]{0,3}$/.test(i)},_initDataAttributes:function(){var e=this,i=this.options,n=this.element.data();t.each(this.element[0].attributes,function(t,r){var s,o=r.name.toLowerCase();/^data-/.test(o)&&(o=o.slice(5).replace(/-[a-z]/g,function(t){return t.charAt(1).toUpperCase()}),s=n[o],e._isRegExpOption(o,s)&&(s=e._getRegExp(s)),i[o]=s)})},_create:function(){this._initDataAttributes(),this._initSpecialOptions(),this._slots=[],this._sequence=this._getXHRPromise(!0),this._sending=this._active=0,this._initProgressObject(this),this._initEventHandlers()},active:function(){return this._active},progress:function(){return this._progress},add:function(e){var i=this;e&&!this.options.disabled&&(e.fileInput&&!e.files?this._getFileInputFiles(e.fileInput).always(function(t){e.files=t,i._onAdd(null,e)}):(e.files=t.makeArray(e.files),this._onAdd(null,e)))},send:function(e){if(e&&!this.options.disabled){if(e.fileInput&&!e.files){var i,n,r=this,s=t.Deferred(),o=s.promise();return o.abort=function(){return n=!0,i?i.abort():(s.reject(null,\"abort\",\"abort\"),o)},this._getFileInputFiles(e.fileInput).always(function(t){if(!n){if(!t.length)return void s.reject();e.files=t,i=r._onSend(null,e),i.then(function(t,e,i){s.resolve(t,e,i)},function(t,e,i){s.reject(t,e,i)})}}),this._enhancePromise(o)}if(e.files=t.makeArray(e.files),e.files.length)return this._onSend(null,e)}return this._getXHRPromise(!1,e&&e.context)}})})},function(t,e){\"format global\";\"deps jquery\";\"exports $\";/*!\n * Bootstrap v3.3.4 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nif(\"undefined\"==typeof jQuery)throw new Error(\"Bootstrap's JavaScript requires jQuery\");+function(t){\"use strict\";var e=t.fn.jquery.split(\" \")[0].split(\".\");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1)throw new Error(\"Bootstrap's JavaScript requires jQuery version 1.9.1 or higher\")}(jQuery),function(t){\"use strict\";function e(){var t=document.createElement(\"bootstrap\"),e={WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"transitionend\",OTransition:\"oTransitionEnd otransitionend\",transition:\"transitionend\"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]};return!1}t.fn.emulateTransitionEnd=function(e){var i=!1,n=this;t(this).one(\"bsTransitionEnd\",function(){i=!0});var r=function(){i||t(n).trigger(t.support.transition.end)};return setTimeout(r,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}})})}(jQuery),function(t){\"use strict\";function e(e){return this.each(function(){var i=t(this),r=i.data(\"bs.alert\");r||i.data(\"bs.alert\",r=new n(this)),\"string\"==typeof e&&r[e].call(i)})}var i='[data-dismiss=\"alert\"]',n=function(e){t(e).on(\"click\",i,this.close)};n.VERSION=\"3.3.4\",n.TRANSITION_DURATION=150,n.prototype.close=function(e){function i(){o.detach().trigger(\"closed.bs.alert\").remove()}var r=t(this),s=r.attr(\"data-target\");s||(s=r.attr(\"href\"),s=s&&s.replace(/.*(?=#[^\\s]*$)/,\"\"));var o=t(s);e&&e.preventDefault(),o.length||(o=r.closest(\".alert\")),o.trigger(e=t.Event(\"close.bs.alert\")),e.isDefaultPrevented()||(o.removeClass(\"in\"),t.support.transition&&o.hasClass(\"fade\")?o.one(\"bsTransitionEnd\",i).emulateTransitionEnd(n.TRANSITION_DURATION):i())};var r=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=n,t.fn.alert.noConflict=function(){return t.fn.alert=r,this},t(document).on(\"click.bs.alert.data-api\",i,n.prototype.close)}(jQuery),function(t){\"use strict\";function e(e){return this.each(function(){var n=t(this),r=n.data(\"bs.button\"),s=\"object\"==typeof e&&e;r||n.data(\"bs.button\",r=new i(this,s)),\"toggle\"==e?r.toggle():e&&r.setState(e)})}var i=function(e,n){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,n),this.isLoading=!1};i.VERSION=\"3.3.4\",i.DEFAULTS={loadingText:\"loading...\"},i.prototype.setState=function(e){var i=\"disabled\",n=this.$element,r=n.is(\"input\")?\"val\":\"html\",s=n.data();e+=\"Text\",null==s.resetText&&n.data(\"resetText\",n[r]()),setTimeout(t.proxy(function(){n[r](null==s[e]?this.options[e]:s[e]),\"loadingText\"==e?(this.isLoading=!0,n.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,n.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle=\"buttons\"]');if(e.length){var i=this.$element.find(\"input\");\"radio\"==i.prop(\"type\")&&(i.prop(\"checked\")&&this.$element.hasClass(\"active\")?t=!1:e.find(\".active\").removeClass(\"active\")),t&&i.prop(\"checked\",!this.$element.hasClass(\"active\")).trigger(\"change\")}else this.$element.attr(\"aria-pressed\",!this.$element.hasClass(\"active\"));t&&this.$element.toggleClass(\"active\")};var n=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=n,this},t(document).on(\"click.bs.button.data-api\",'[data-toggle^=\"button\"]',function(i){var n=t(i.target);n.hasClass(\"btn\")||(n=n.closest(\".btn\")),e.call(n,\"toggle\"),i.preventDefault()}).on(\"focus.bs.button.data-api blur.bs.button.data-api\",'[data-toggle^=\"button\"]',function(e){t(e.target).closest(\".btn\").toggleClass(\"focus\",/^focus(in)?$/.test(e.type))})}(jQuery),function(t){\"use strict\";function e(e){return this.each(function(){var n=t(this),r=n.data(\"bs.carousel\"),s=t.extend({},i.DEFAULTS,n.data(),\"object\"==typeof e&&e),o=\"string\"==typeof e?e:s.slide;r||n.data(\"bs.carousel\",r=new i(this,s)),\"number\"==typeof e?r.to(e):o?r[o]():s.interval&&r.pause().cycle()})}var i=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(\".carousel-indicators\"),this.options=i,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on(\"keydown.bs.carousel\",t.proxy(this.keydown,this)),\"hover\"==this.options.pause&&!(\"ontouchstart\"in document.documentElement)&&this.$element.on(\"mouseenter.bs.carousel\",t.proxy(this.pause,this)).on(\"mouseleave.bs.carousel\",t.proxy(this.cycle,this))};i.VERSION=\"3.3.4\",i.TRANSITION_DURATION=600,i.DEFAULTS={interval:5e3,pause:\"hover\",wrap:!0,keyboard:!0},i.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(\".item\"),this.$items.index(t||this.$active)},i.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e);if((\"prev\"==t&&0===i||\"next\"==t&&i==this.$items.length-1)&&!this.options.wrap)return e;var n=\"prev\"==t?-1:1,r=(i+n)%this.$items.length;return this.$items.eq(r)},i.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(\".item.active\"));if(!(t>this.$items.length-1||t<0))return this.sliding?this.$element.one(\"slid.bs.carousel\",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(t>i?\"next\":\"prev\",this.$items.eq(t))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(\".next, .prev\").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){if(!this.sliding)return this.slide(\"next\")},i.prototype.prev=function(){if(!this.sliding)return this.slide(\"prev\")},i.prototype.slide=function(e,n){var r=this.$element.find(\".item.active\"),s=n||this.getItemForDirection(e,r),o=this.interval,a=\"next\"==e?\"left\":\"right\",l=this;if(s.hasClass(\"active\"))return this.sliding=!1;var u=s[0],c=t.Event(\"slide.bs.carousel\",{relatedTarget:u,direction:a});if(this.$element.trigger(c),!c.isDefaultPrevented()){if(this.sliding=!0,o&&this.pause(),this.$indicators.length){this.$indicators.find(\".active\").removeClass(\"active\");var h=t(this.$indicators.children()[this.getItemIndex(s)]);h&&h.addClass(\"active\")}var d=t.Event(\"slid.bs.carousel\",{relatedTarget:u,direction:a});return t.support.transition&&this.$element.hasClass(\"slide\")?(s.addClass(e),s[0].offsetWidth,r.addClass(a),s.addClass(a),r.one(\"bsTransitionEnd\",function(){s.removeClass([e,a].join(\" \")).addClass(\"active\"),r.removeClass([\"active\",a].join(\" \")),l.sliding=!1,setTimeout(function(){l.$element.trigger(d)},0)}).emulateTransitionEnd(i.TRANSITION_DURATION)):(r.removeClass(\"active\"),s.addClass(\"active\"),this.sliding=!1,this.$element.trigger(d)),o&&this.cycle(),this}};var n=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=n,this};var r=function(i){var n,r=t(this),s=t(r.attr(\"data-target\")||(n=r.attr(\"href\"))&&n.replace(/.*(?=#[^\\s]+$)/,\"\"));if(s.hasClass(\"carousel\")){var o=t.extend({},s.data(),r.data()),a=r.attr(\"data-slide-to\");a&&(o.interval=!1),e.call(s,o),a&&s.data(\"bs.carousel\").to(a),i.preventDefault()}};t(document).on(\"click.bs.carousel.data-api\",\"[data-slide]\",r).on(\"click.bs.carousel.data-api\",\"[data-slide-to]\",r),t(window).on(\"load\",function(){t('[data-ride=\"carousel\"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),function(t){\"use strict\";function e(e){var i,n=e.attr(\"data-target\")||(i=e.attr(\"href\"))&&i.replace(/.*(?=#[^\\s]+$)/,\"\");return t(n)}function i(e){return this.each(function(){var i=t(this),r=i.data(\"bs.collapse\"),s=t.extend({},n.DEFAULTS,i.data(),\"object\"==typeof e&&e);!r&&s.toggle&&/show|hide/.test(e)&&(s.toggle=!1),r||i.data(\"bs.collapse\",r=new n(this,s)),\"string\"==typeof e&&r[e]()})}var n=function(e,i){this.$element=t(e),this.options=t.extend({},n.DEFAULTS,i),this.$trigger=t('[data-toggle=\"collapse\"][href=\"#'+e.id+'\"],[data-toggle=\"collapse\"][data-target=\"#'+e.id+'\"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};n.VERSION=\"3.3.4\",n.TRANSITION_DURATION=350,n.DEFAULTS={toggle:!0},n.prototype.dimension=function(){return this.$element.hasClass(\"width\")?\"width\":\"height\"},n.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass(\"in\")){var e,r=this.$parent&&this.$parent.children(\".panel\").children(\".in, .collapsing\");if(!(r&&r.length&&(e=r.data(\"bs.collapse\"))&&e.transitioning)){var s=t.Event(\"show.bs.collapse\");if(this.$element.trigger(s),!s.isDefaultPrevented()){r&&r.length&&(i.call(r,\"hide\"),e||r.data(\"bs.collapse\",null));var o=this.dimension();this.$element.removeClass(\"collapse\").addClass(\"collapsing\")[o](0).attr(\"aria-expanded\",!0),this.$trigger.removeClass(\"collapsed\").attr(\"aria-expanded\",!0),this.transitioning=1;var a=function(){this.$element.removeClass(\"collapsing\").addClass(\"collapse in\")[o](\"\"),this.transitioning=0,this.$element.trigger(\"shown.bs.collapse\")};if(!t.support.transition)return a.call(this);var l=t.camelCase([\"scroll\",o].join(\"-\"));this.$element.one(\"bsTransitionEnd\",t.proxy(a,this)).emulateTransitionEnd(n.TRANSITION_DURATION)[o](this.$element[0][l])}}}},n.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass(\"in\")){var e=t.Event(\"hide.bs.collapse\");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass(\"collapsing\").removeClass(\"collapse in\").attr(\"aria-expanded\",!1),this.$trigger.addClass(\"collapsed\").attr(\"aria-expanded\",!1),this.transitioning=1;var r=function(){this.transitioning=0,this.$element.removeClass(\"collapsing\").addClass(\"collapse\").trigger(\"hidden.bs.collapse\")};if(!t.support.transition)return r.call(this);this.$element[i](0).one(\"bsTransitionEnd\",t.proxy(r,this)).emulateTransitionEnd(n.TRANSITION_DURATION)}}},n.prototype.toggle=function(){this[this.$element.hasClass(\"in\")?\"hide\":\"show\"]()},n.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle=\"collapse\"][data-parent=\"'+this.options.parent+'\"]').each(t.proxy(function(i,n){var r=t(n);this.addAriaAndCollapsedClass(e(r),r)},this)).end()},n.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass(\"in\");t.attr(\"aria-expanded\",i),e.toggleClass(\"collapsed\",!i).attr(\"aria-expanded\",i)};var r=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=n,t.fn.collapse.noConflict=function(){return t.fn.collapse=r,this},t(document).on(\"click.bs.collapse.data-api\",'[data-toggle=\"collapse\"]',function(n){var r=t(this);r.attr(\"data-target\")||n.preventDefault();var s=e(r),o=s.data(\"bs.collapse\"),a=o?\"toggle\":r.data();i.call(s,a)})}(jQuery),function(t){\"use strict\";function e(e){e&&3===e.which||(t(r).remove(),t(s).each(function(){var n=t(this),r=i(n),s={relatedTarget:this};r.hasClass(\"open\")&&(r.trigger(e=t.Event(\"hide.bs.dropdown\",s)),e.isDefaultPrevented()||(n.attr(\"aria-expanded\",\"false\"),r.removeClass(\"open\").trigger(\"hidden.bs.dropdown\",s)))}))}function i(e){var i=e.attr(\"data-target\");i||(i=e.attr(\"href\"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\\s]*$)/,\"\"));var n=i&&t(i);return n&&n.length?n:e.parent()}function n(e){return this.each(function(){var i=t(this),n=i.data(\"bs.dropdown\");n||i.data(\"bs.dropdown\",n=new o(this)),\"string\"==typeof e&&n[e].call(i)})}var r=\".dropdown-backdrop\",s='[data-toggle=\"dropdown\"]',o=function(e){t(e).on(\"click.bs.dropdown\",this.toggle)};o.VERSION=\"3.3.4\",o.prototype.toggle=function(n){var r=t(this);if(!r.is(\".disabled, :disabled\")){var s=i(r),o=s.hasClass(\"open\");if(e(),!o){\"ontouchstart\"in document.documentElement&&!s.closest(\".navbar-nav\").length&&t('<div class=\"dropdown-backdrop\"/>').insertAfter(t(this)).on(\"click\",e);var a={relatedTarget:this};if(s.trigger(n=t.Event(\"show.bs.dropdown\",a)),n.isDefaultPrevented())return;r.trigger(\"focus\").attr(\"aria-expanded\",\"true\"),s.toggleClass(\"open\").trigger(\"shown.bs.dropdown\",a)}return!1}},o.prototype.keydown=function(e){if(/(38|40|27|32)/.test(e.which)&&!/input|textarea/i.test(e.target.tagName)){var n=t(this);if(e.preventDefault(),e.stopPropagation(),!n.is(\".disabled, :disabled\")){var r=i(n),o=r.hasClass(\"open\");if(!o&&27!=e.which||o&&27==e.which)return 27==e.which&&r.find(s).trigger(\"focus\"),n.trigger(\"click\");var a=\" li:not(.disabled):visible a\",l=r.find('[role=\"menu\"]'+a+', [role=\"listbox\"]'+a);if(l.length){var u=l.index(e.target);38==e.which&&u>0&&u--,40==e.which&&u<l.length-1&&u++,~u||(u=0),l.eq(u).trigger(\"focus\")}}}};var a=t.fn.dropdown;t.fn.dropdown=n,t.fn.dropdown.Constructor=o,t.fn.dropdown.noConflict=function(){return t.fn.dropdown=a,this},t(document).on(\"click.bs.dropdown.data-api\",e).on(\"click.bs.dropdown.data-api\",\".dropdown form\",function(t){t.stopPropagation()}).on(\"click.bs.dropdown.data-api\",s,o.prototype.toggle).on(\"keydown.bs.dropdown.data-api\",s,o.prototype.keydown).on(\"keydown.bs.dropdown.data-api\",'[role=\"menu\"]',o.prototype.keydown).on(\"keydown.bs.dropdown.data-api\",'[role=\"listbox\"]',o.prototype.keydown)}(jQuery),function(t){\"use strict\";function e(e,n){return this.each(function(){var r=t(this),s=r.data(\"bs.modal\"),o=t.extend({},i.DEFAULTS,r.data(),\"object\"==typeof e&&e);s||r.data(\"bs.modal\",s=new i(this,o)),\"string\"==typeof e?s[e](n):o.show&&s.show(n)})}var i=function(e,i){this.options=i,this.$body=t(document.body),this.$element=t(e),this.$dialog=this.$element.find(\".modal-dialog\"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(\".modal-content\").load(this.options.remote,t.proxy(function(){this.$element.trigger(\"loaded.bs.modal\")},this))};i.VERSION=\"3.3.4\",i.TRANSITION_DURATION=300,i.BACKDROP_TRANSITION_DURATION=150,i.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},i.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},i.prototype.show=function(e){var n=this,r=t.Event(\"show.bs.modal\",{relatedTarget:e});this.$element.trigger(r),this.isShown||r.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass(\"modal-open\"),this.escape(),this.resize(),this.$element.on(\"click.dismiss.bs.modal\",'[data-dismiss=\"modal\"]',t.proxy(this.hide,this)),this.$dialog.on(\"mousedown.dismiss.bs.modal\",function(){n.$element.one(\"mouseup.dismiss.bs.modal\",function(e){t(e.target).is(n.$element)&&(n.ignoreBackdropClick=!0)})}),this.backdrop(function(){var r=t.support.transition&&n.$element.hasClass(\"fade\");n.$element.parent().length||n.$element.appendTo(n.$body),n.$element.show().scrollTop(0),n.adjustDialog(),r&&n.$element[0].offsetWidth,n.$element.addClass(\"in\").attr(\"aria-hidden\",!1),n.enforceFocus();var s=t.Event(\"shown.bs.modal\",{relatedTarget:e});r?n.$dialog.one(\"bsTransitionEnd\",function(){n.$element.trigger(\"focus\").trigger(s)}).emulateTransitionEnd(i.TRANSITION_DURATION):n.$element.trigger(\"focus\").trigger(s)}))},i.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event(\"hide.bs.modal\"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),t(document).off(\"focusin.bs.modal\"),this.$element.removeClass(\"in\").attr(\"aria-hidden\",!0).off(\"click.dismiss.bs.modal\").off(\"mouseup.dismiss.bs.modal\"),this.$dialog.off(\"mousedown.dismiss.bs.modal\"),t.support.transition&&this.$element.hasClass(\"fade\")?this.$element.one(\"bsTransitionEnd\",t.proxy(this.hideModal,this)).emulateTransitionEnd(i.TRANSITION_DURATION):this.hideModal())},i.prototype.enforceFocus=function(){t(document).off(\"focusin.bs.modal\").on(\"focusin.bs.modal\",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger(\"focus\")},this))},i.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on(\"keydown.dismiss.bs.modal\",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off(\"keydown.dismiss.bs.modal\")},i.prototype.resize=function(){this.isShown?t(window).on(\"resize.bs.modal\",t.proxy(this.handleUpdate,this)):t(window).off(\"resize.bs.modal\")},i.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass(\"modal-open\"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger(\"hidden.bs.modal\")})},i.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},i.prototype.backdrop=function(e){var n=this,r=this.$element.hasClass(\"fade\")?\"fade\":\"\";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&r;if(this.$backdrop=t('<div class=\"modal-backdrop '+r+'\" />').appendTo(this.$body),this.$element.on(\"click.dismiss.bs.modal\",t.proxy(function(t){if(this.ignoreBackdropClick)return void(this.ignoreBackdropClick=!1);t.target===t.currentTarget&&(\"static\"==this.options.backdrop?this.$element[0].focus():this.hide())},this)),s&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass(\"in\"),!e)return;s?this.$backdrop.one(\"bsTransitionEnd\",e).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass(\"in\");var o=function(){n.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass(\"fade\")?this.$backdrop.one(\"bsTransitionEnd\",o).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):o()}else e&&e()},i.prototype.handleUpdate=function(){this.adjustDialog()},i.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:\"\",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:\"\"})},i.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:\"\",paddingRight:\"\"})},i.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},i.prototype.setScrollbar=function(){var t=parseInt(this.$body.css(\"padding-right\")||0,10);this.originalBodyPad=document.body.style.paddingRight||\"\",this.bodyIsOverflowing&&this.$body.css(\"padding-right\",t+this.scrollbarWidth)},i.prototype.resetScrollbar=function(){this.$body.css(\"padding-right\",this.originalBodyPad)},i.prototype.measureScrollbar=function(){var t=document.createElement(\"div\");t.className=\"modal-scrollbar-measure\",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var n=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=i,t.fn.modal.noConflict=function(){return t.fn.modal=n,this},t(document).on(\"click.bs.modal.data-api\",'[data-toggle=\"modal\"]',function(i){var n=t(this),r=n.attr(\"href\"),s=t(n.attr(\"data-target\")||r&&r.replace(/.*(?=#[^\\s]+$)/,\"\")),o=s.data(\"bs.modal\")?\"toggle\":t.extend({remote:!/#/.test(r)&&r},s.data(),n.data());n.is(\"a\")&&i.preventDefault(),s.one(\"show.bs.modal\",function(t){t.isDefaultPrevented()||s.one(\"hidden.bs.modal\",function(){n.is(\":visible\")&&n.trigger(\"focus\")})}),e.call(s,o,this)})}(jQuery),function(t){\"use strict\";function e(e){return this.each(function(){var n=t(this),r=n.data(\"bs.tooltip\"),s=\"object\"==typeof e&&e;!r&&/destroy|hide/.test(e)||(r||n.data(\"bs.tooltip\",r=new i(this,s)),\"string\"==typeof e&&r[e]())})}var i=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init(\"tooltip\",t,e)};i.VERSION=\"3.3.4\",i.TRANSITION_DURATION=150,i.DEFAULTS={animation:!0,placement:\"top\",selector:!1,template:'<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!1,container:!1,viewport:{selector:\"body\",padding:0}},i.prototype.init=function(e,i,n){if(this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(n),this.$viewport=this.options.viewport&&t(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error(\"`selector` option must be specified when initializing \"+this.type+\" on the window.document object!\");for(var r=this.options.trigger.split(\" \"),s=r.length;s--;){var o=r[s];if(\"click\"==o)this.$element.on(\"click.\"+this.type,this.options.selector,t.proxy(this.toggle,this));else if(\"manual\"!=o){var a=\"hover\"==o?\"mouseenter\":\"focusin\",l=\"hover\"==o?\"mouseleave\":\"focusout\";this.$element.on(a+\".\"+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+\".\"+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:\"manual\",selector:\"\"}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&\"number\"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,n){i[t]!=n&&(e[t]=n)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data(\"bs.\"+this.type);return i&&i.$tip&&i.$tip.is(\":visible\")?void(i.hoverState=\"in\"):(i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data(\"bs.\"+this.type,i)),clearTimeout(i.timeout),i.hoverState=\"in\",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){\"in\"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data(\"bs.\"+this.type);if(i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data(\"bs.\"+this.type,i)),clearTimeout(i.timeout),i.hoverState=\"out\",!i.options.delay||!i.options.delay.hide)return i.hide();i.timeout=setTimeout(function(){\"out\"==i.hoverState&&i.hide()},i.options.delay.hide)},i.prototype.show=function(){var e=t.Event(\"show.bs.\"+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var n=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!n)return;var r=this,s=this.tip(),o=this.getUID(this.type);this.setContent(),s.attr(\"id\",o),this.$element.attr(\"aria-describedby\",o),this.options.animation&&s.addClass(\"fade\");var a=\"function\"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,l=/\\s?auto?\\s?/i,u=l.test(a);u&&(a=a.replace(l,\"\")||\"top\"),s.detach().css({top:0,left:0,display:\"block\"}).addClass(a).data(\"bs.\"+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element);var c=this.getPosition(),h=s[0].offsetWidth,d=s[0].offsetHeight;if(u){var p=a,f=this.options.container?t(this.options.container):this.$element.parent(),g=this.getPosition(f);a=\"bottom\"==a&&c.bottom+d>g.bottom?\"top\":\"top\"==a&&c.top-d<g.top?\"bottom\":\"right\"==a&&c.right+h>g.width?\"left\":\"left\"==a&&c.left-h<g.left?\"right\":a,s.removeClass(p).addClass(a)}var m=this.getCalculatedOffset(a,c,h,d);this.applyPlacement(m,a);var v=function(){var t=r.hoverState;r.$element.trigger(\"shown.bs.\"+r.type),r.hoverState=null,\"out\"==t&&r.leave(r)};t.support.transition&&this.$tip.hasClass(\"fade\")?s.one(\"bsTransitionEnd\",v).emulateTransitionEnd(i.TRANSITION_DURATION):v()}},i.prototype.applyPlacement=function(e,i){var n=this.tip(),r=n[0].offsetWidth,s=n[0].offsetHeight,o=parseInt(n.css(\"margin-top\"),10),a=parseInt(n.css(\"margin-left\"),10);isNaN(o)&&(o=0),isNaN(a)&&(a=0),e.top=e.top+o,e.left=e.left+a,t.offset.setOffset(n[0],t.extend({using:function(t){n.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),n.addClass(\"in\");var l=n[0].offsetWidth,u=n[0].offsetHeight;\"top\"==i&&u!=s&&(e.top=e.top+s-u);var c=this.getViewportAdjustedDelta(i,e,l,u);c.left?e.left+=c.left:e.top+=c.top;var h=/top|bottom/.test(i),d=h?2*c.left-r+l:2*c.top-s+u,p=h?\"offsetWidth\":\"offsetHeight\";n.offset(e),this.replaceArrow(d,n[0][p],h)},i.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?\"left\":\"top\",50*(1-t/e)+\"%\").css(i?\"top\":\"left\",\"\")},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(\".tooltip-inner\")[this.options.html?\"html\":\"text\"](e),t.removeClass(\"fade in top bottom left right\")},i.prototype.hide=function(e){function n(){\"in\"!=r.hoverState&&s.detach(),r.$element.removeAttr(\"aria-describedby\").trigger(\"hidden.bs.\"+r.type),e&&e()}var r=this,s=t(this.$tip),o=t.Event(\"hide.bs.\"+this.type);if(this.$element.trigger(o),!o.isDefaultPrevented())return s.removeClass(\"in\"),t.support.transition&&s.hasClass(\"fade\")?s.one(\"bsTransitionEnd\",n).emulateTransitionEnd(i.TRANSITION_DURATION):n(),this.hoverState=null,this},i.prototype.fixTitle=function(){var t=this.$element;(t.attr(\"title\")||\"string\"!=typeof t.attr(\"data-original-title\"))&&t.attr(\"data-original-title\",t.attr(\"title\")||\"\").attr(\"title\",\"\")},i.prototype.hasContent=function(){return this.getTitle()},i.prototype.getPosition=function(e){e=e||this.$element;var i=e[0],n=\"BODY\"==i.tagName,r=i.getBoundingClientRect();null==r.width&&(r=t.extend({},r,{width:r.right-r.left,height:r.bottom-r.top}));var s=n?{top:0,left:0}:e.offset(),o={scroll:n?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop()},a=n?{width:t(window).width(),height:t(window).height()}:null;return t.extend({},r,o,a,s)},i.prototype.getCalculatedOffset=function(t,e,i,n){return\"bottom\"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:\"top\"==t?{top:e.top-n,left:e.left+e.width/2-i/2}:\"left\"==t?{top:e.top+e.height/2-n/2,left:e.left-i}:{top:e.top+e.height/2-n/2,left:e.left+e.width}},i.prototype.getViewportAdjustedDelta=function(t,e,i,n){var r={top:0,left:0};if(!this.$viewport)return r;var s=this.options.viewport&&this.options.viewport.padding||0,o=this.getPosition(this.$viewport);if(/right|left/.test(t)){var a=e.top-s-o.scroll,l=e.top+s-o.scroll+n;a<o.top?r.top=o.top-a:l>o.top+o.height&&(r.top=o.top+o.height-l)}else{var u=e.left-s,c=e.left+s+i;u<o.left?r.left=o.left-u:c>o.width&&(r.left=o.left+o.width-c)}return r},i.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr(\"data-original-title\")||(\"function\"==typeof e.title?e.title.call(t[0]):e.title)},i.prototype.getUID=function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},i.prototype.tip=function(){return this.$tip=this.$tip||t(this.options.template)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".tooltip-arrow\")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&((i=t(e.currentTarget).data(\"bs.\"+this.type))||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data(\"bs.\"+this.type,i))),i.tip().hasClass(\"in\")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off(\".\"+t.type).removeData(\"bs.\"+t.type)})};var n=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=n,this}}(jQuery),function(t){\"use strict\";function e(e){return this.each(function(){var n=t(this),r=n.data(\"bs.popover\"),s=\"object\"==typeof e&&e;!r&&/destroy|hide/.test(e)||(r||n.data(\"bs.popover\",r=new i(this,s)),\"string\"==typeof e&&r[e]())})}var i=function(t,e){this.init(\"popover\",t,e)};if(!t.fn.tooltip)throw new Error(\"Popover requires tooltip.js\");i.VERSION=\"3.3.4\",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(\".popover-title\")[this.options.html?\"html\":\"text\"](e),t.find(\".popover-content\").children().detach().end()[this.options.html?\"string\"==typeof i?\"html\":\"append\":\"text\"](i),t.removeClass(\"fade top bottom left right in\"),t.find(\".popover-title\").html()||t.find(\".popover-title\").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr(\"data-content\")||(\"function\"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".arrow\")};var n=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=n,this}}(jQuery),function(t){\"use strict\";function e(i,n){this.$body=t(document.body),this.$scrollElement=t(t(i).is(document.body)?window:i),this.options=t.extend({},e.DEFAULTS,n),this.selector=(this.options.target||\"\")+\" .nav li > a\",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on(\"scroll.bs.scrollspy\",t.proxy(this.process,this)),this.refresh(),this.process()}function i(i){return this.each(function(){var n=t(this),r=n.data(\"bs.scrollspy\"),s=\"object\"==typeof i&&i;r||n.data(\"bs.scrollspy\",r=new e(this,s)),\"string\"==typeof i&&r[i]()})}e.VERSION=\"3.3.4\",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,i=\"offset\",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(i=\"position\",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),r=e.data(\"target\")||e.attr(\"href\"),s=/^#./.test(r)&&t(r);return s&&s.length&&s.is(\":visible\")&&[[s[i]().top+n,r]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),n=this.options.offset+i-this.$scrollElement.height(),r=this.offsets,s=this.targets,o=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=n)return o!=(t=s[s.length-1])&&this.activate(t);if(o&&e<r[0])return this.activeTarget=null,this.clear();for(t=r.length;t--;)o!=s[t]&&e>=r[t]&&(void 0===r[t+1]||e<r[t+1])&&this.activate(s[t])},e.prototype.activate=function(e){this.activeTarget=e,this.clear();var i=this.selector+'[data-target=\"'+e+'\"],'+this.selector+'[href=\"'+e+'\"]',n=t(i).parents(\"li\").addClass(\"active\");n.parent(\".dropdown-menu\").length&&(n=n.closest(\"li.dropdown\").addClass(\"active\")),n.trigger(\"activate.bs.scrollspy\")},e.prototype.clear=function(){t(this.selector).parentsUntil(this.options.target,\".active\").removeClass(\"active\")};var n=t.fn.scrollspy;t.fn.scrollspy=i,t.fn.scrollspy.Constructor=e,t.fn.scrollspy.noConflict=function(){return t.fn.scrollspy=n,this},t(window).on(\"load.bs.scrollspy.data-api\",function(){t('[data-spy=\"scroll\"]').each(function(){var e=t(this);i.call(e,e.data())})})}(jQuery),function(t){\"use strict\";function e(e){return this.each(function(){var n=t(this),r=n.data(\"bs.tab\");r||n.data(\"bs.tab\",r=new i(this)),\"string\"==typeof e&&r[e]()})}var i=function(e){this.element=t(e)};i.VERSION=\"3.3.4\",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest(\"ul:not(.dropdown-menu)\"),n=e.data(\"target\");if(n||(n=e.attr(\"href\"),n=n&&n.replace(/.*(?=#[^\\s]*$)/,\"\")),!e.parent(\"li\").hasClass(\"active\")){var r=i.find(\".active:last a\"),s=t.Event(\"hide.bs.tab\",{relatedTarget:e[0]}),o=t.Event(\"show.bs.tab\",{relatedTarget:r[0]});if(r.trigger(s),e.trigger(o),!o.isDefaultPrevented()&&!s.isDefaultPrevented()){var a=t(n);this.activate(e.closest(\"li\"),i),this.activate(a,a.parent(),function(){r.trigger({type:\"hidden.bs.tab\",relatedTarget:e[0]}),e.trigger({type:\"shown.bs.tab\",relatedTarget:r[0]})})}}},i.prototype.activate=function(e,n,r){function s(){o.removeClass(\"active\").find(\"> .dropdown-menu > .active\").removeClass(\"active\").end().find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!1),e.addClass(\"active\").find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!0),a?(e[0].offsetWidth,e.addClass(\"in\")):e.removeClass(\"fade\"),e.parent(\".dropdown-menu\").length&&e.closest(\"li.dropdown\").addClass(\"active\").end().find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!0),r&&r()}var o=n.find(\"> .active\"),a=r&&t.support.transition&&(o.length&&o.hasClass(\"fade\")||!!n.find(\"> .fade\").length);o.length&&a?o.one(\"bsTransitionEnd\",s).emulateTransitionEnd(i.TRANSITION_DURATION):s(),o.removeClass(\"in\")};var n=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=n,this};var r=function(i){i.preventDefault(),e.call(t(this),\"show\")};t(document).on(\"click.bs.tab.data-api\",'[data-toggle=\"tab\"]',r).on(\"click.bs.tab.data-api\",'[data-toggle=\"pill\"]',r)}(jQuery),function(t){\"use strict\";function e(e){return this.each(function(){var n=t(this),r=n.data(\"bs.affix\"),s=\"object\"==typeof e&&e;r||n.data(\"bs.affix\",r=new i(this,s)),\"string\"==typeof e&&r[e]()})}var i=function(e,n){this.options=t.extend({},i.DEFAULTS,n),this.$target=t(this.options.target).on(\"scroll.bs.affix.data-api\",t.proxy(this.checkPosition,this)).on(\"click.bs.affix.data-api\",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};i.VERSION=\"3.3.4\",i.RESET=\"affix affix-top affix-bottom\",i.DEFAULTS={offset:0,target:window},i.prototype.getState=function(t,e,i,n){var r=this.$target.scrollTop(),s=this.$element.offset(),o=this.$target.height();if(null!=i&&\"top\"==this.affixed)return r<i&&\"top\";if(\"bottom\"==this.affixed)return null!=i?!(r+this.unpin<=s.top)&&\"bottom\":!(r+o<=t-n)&&\"bottom\";var a=null==this.affixed,l=a?r:s.top,u=a?o:e;return null!=i&&r<=i?\"top\":null!=n&&l+u>=t-n&&\"bottom\"},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass(\"affix\");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(\":visible\")){var e=this.$element.height(),n=this.options.offset,r=n.top,s=n.bottom,o=t(document.body).height();\"object\"!=typeof n&&(s=r=n),\"function\"==typeof r&&(r=n.top(this.$element)),\"function\"==typeof s&&(s=n.bottom(this.$element));var a=this.getState(o,e,r,s);if(this.affixed!=a){null!=this.unpin&&this.$element.css(\"top\",\"\");var l=\"affix\"+(a?\"-\"+a:\"\"),u=t.Event(l+\".bs.affix\");if(this.$element.trigger(u),u.isDefaultPrevented())return;this.affixed=a,this.unpin=\"bottom\"==a?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(l).trigger(l.replace(\"affix\",\"affixed\")+\".bs.affix\")}\"bottom\"==a&&this.$element.offset({top:o-e-s})}};var n=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=n,this},t(window).on(\"load\",function(){t('[data-spy=\"affix\"]').each(function(){var i=t(this),n=i.data();n.offset=n.offset||{},null!=n.offsetBottom&&(n.offset.bottom=n.offsetBottom),null!=n.offsetTop&&(n.offset.top=n.offsetTop),e.call(i,n)})})}(jQuery)},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\".action-link[data-v-225778c2]{cursor:pointer}.m-b-none[data-v-225778c2]{margin-bottom:0}\",\"\"])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\"\",\"\"])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\"td[data-v-5301a236],th[data-v-5301a236]{font-size:13px}\",\"\"])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\"\",\"\"])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\"tr{padding-left:30px}\",\"\"])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\".action-link[data-v-de0d0e4e]{cursor:pointer}.m-b-none[data-v-de0d0e4e]{margin-bottom:0}\",\"\"])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\".action-link[data-v-e9c80318]{cursor:pointer}.m-b-none[data-v-e9c80318]{margin-bottom:0}\",\"\"])},function(t,e,i){e=t.exports=i(0)(),e.push([t.i,\".select2-dropdown[data-v-ff564a86]{z-index:9999}\",\"\"])},function(t,e,i){var n,r,s;/*! jQuery UI - v1.12.1 - 2017-03-19\n* http://jqueryui.com\n* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n!function(o){r=[i(3)],n=o,void 0!==(s=\"function\"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){function e(t){for(var e=t.css(\"visibility\");\"inherit\"===e;)t=t.parent(),e=t.css(\"visibility\");return\"hidden\"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if((\"absolute\"===(e=t.css(\"position\"))||\"relative\"===e||\"fixed\"===e)&&(i=parseInt(t.css(\"zIndex\"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId=\"ui-datepicker-div\",this._inlineClass=\"ui-datepicker-inline\",this._appendClass=\"ui-datepicker-append\",this._triggerClass=\"ui-datepicker-trigger\",this._dialogClass=\"ui-datepicker-dialog\",this._disableClass=\"ui-datepicker-disabled\",this._unselectableClass=\"ui-datepicker-unselectable\",this._currentClass=\"ui-datepicker-current-day\",this._dayOverClass=\"ui-datepicker-days-cell-over\",this.regional=[],this.regional[\"\"]={closeText:\"Done\",prevText:\"Prev\",nextText:\"Next\",currentText:\"Today\",monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],weekHeader:\"Wk\",dateFormat:\"mm/dd/yy\",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:\"\"},this._defaults={showOn:\"focus\",showAnim:\"fadeIn\",showOptions:{},defaultDate:null,appendText:\"\",buttonText:\"...\",buttonImage:\"\",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:\"c-10:c+10\",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:\"+10\",minDate:null,maxDate:null,duration:\"fast\",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:\"\",altFormat:\"\",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[\"\"]),this.regional.en=t.extend(!0,{},this.regional[\"\"]),this.regional[\"en-US\"]=t.extend(!0,{},this.regional.en),this.dpDiv=r(t(\"<div id='\"+this._mainDivId+\"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\"))}function r(e){var i=\"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";return e.on(\"mouseout\",i,function(){t(this).removeClass(\"ui-state-hover\"),-1!==this.className.indexOf(\"ui-datepicker-prev\")&&t(this).removeClass(\"ui-datepicker-prev-hover\"),-1!==this.className.indexOf(\"ui-datepicker-next\")&&t(this).removeClass(\"ui-datepicker-next-hover\")}).on(\"mouseover\",i,s)}function s(){t.datepicker._isDisabledDatepicker(p.inline?p.dpDiv.parent()[0]:p.input[0])||(t(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\"),t(this).addClass(\"ui-state-hover\"),-1!==this.className.indexOf(\"ui-datepicker-prev\")&&t(this).addClass(\"ui-datepicker-prev-hover\"),-1!==this.className.indexOf(\"ui-datepicker-next\")&&t(this).addClass(\"ui-datepicker-next-hover\"))}function o(e,i){t.extend(e,i);for(var n in i)null==i[n]&&(e[n]=i[n]);return e}function a(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger(\"change\")}}t.ui=t.ui||{},t.ui.version=\"1.12.1\";var l=0,u=Array.prototype.slice;t.cleanData=function(e){return function(i){var n,r,s;for(s=0;null!=(r=i[s]);s++)try{(n=t._data(r,\"events\"))&&n.remove&&t(r).triggerHandler(\"remove\")}catch(t){}e(i)}}(t.cleanData),t.widget=function(e,i,n){var r,s,o,a={},l=e.split(\".\")[0];e=e.split(\".\")[1];var u=l+\"-\"+e;return n||(n=i,i=t.Widget),t.isArray(n)&&(n=t.extend.apply(null,[{}].concat(n))),t.expr[\":\"][u.toLowerCase()]=function(e){return!!t.data(e,u)},t[l]=t[l]||{},r=t[l][e],s=t[l][e]=function(t,e){return this._createWidget?void(arguments.length&&this._createWidget(t,e)):new s(t,e)},t.extend(s,r,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),o=new i,o.options=t.widget.extend({},o.options),t.each(n,function(e,n){return t.isFunction(n)?void(a[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function r(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,s=this._superApply;return this._super=t,this._superApply=r,e=n.apply(this,arguments),this._super=i,this._superApply=s,e}}()):void(a[e]=n)}),s.prototype=t.widget.extend(o,{widgetEventPrefix:r?o.widgetEventPrefix||e:e},a,{constructor:s,namespace:l,widgetName:e,widgetFullName:u}),r?(t.each(r._childConstructors,function(e,i){var n=i.prototype;t.widget(n.namespace+\".\"+n.widgetName,s,i._proto)}),delete r._childConstructors):i._childConstructors.push(s),t.widget.bridge(e,s),s},t.widget.extend=function(e){for(var i,n,r=u.call(arguments,1),s=0,o=r.length;o>s;s++)for(i in r[s])n=r[s][i],r[s].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(r){var s=\"string\"==typeof r,o=u.call(arguments,1),a=this;return s?this.length||\"instance\"!==r?this.each(function(){var i,s=t.data(this,n);return\"instance\"===r?(a=s,!1):s?t.isFunction(s[r])&&\"_\"!==r.charAt(0)?(i=s[r].apply(s,o),i!==s&&void 0!==i?(a=i&&i.jquery?a.pushStack(i.get()):i,!1):void 0):t.error(\"no such method '\"+r+\"' for \"+e+\" widget instance\"):t.error(\"cannot call methods on \"+e+\" prior to initialization; attempted to call method '\"+r+\"'\")}):a=void 0:(o.length&&(r=t.widget.extend.apply(null,[r].concat(o))),this.each(function(){var e=t.data(this,n);e?(e.option(r||{}),e._init&&e._init()):t.data(this,n,new i(r,this))})),a}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",defaultElement:\"<div>\",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=l++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr(\"aria-disabled\"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var n,r,s,o=e;if(0===arguments.length)return t.widget.extend({},this.options);if(\"string\"==typeof e)if(o={},n=e.split(\".\"),e=n.shift(),n.length){for(r=o[e]=t.widget.extend({},this.options[e]),s=0;n.length-1>s;s++)r[n[s]]=r[n[s]]||{},r=r[n[s]];if(e=n.pop(),1===arguments.length)return void 0===r[e]?null:r[e];r[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];o[e]=i}return this._setOptions(o),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return\"classes\"===t&&this._setOptionClasses(e),this.options[t]=e,\"disabled\"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,n,r;for(i in e)r=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&r&&r.length&&(n=t(r.get()),this._removeClass(r,i),n.addClass(this._classes({element:n,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+\"-disabled\",null,!!t),t&&(this._removeClass(this.hoverable,null,\"ui-state-hover\"),this._removeClass(this.focusable,null,\"ui-state-focus\"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,s){var o,a;for(a=0;i.length>a;a++)o=r.classesElementLookup[i[a]]||t(),o=t(e.add?t.unique(o.get().concat(e.element.get())):o.not(e.element).get()),r.classesElementLookup[i[a]]=o,n.push(i[a]),s&&e.classes[i[a]]&&n.push(e.classes[i[a]])}var n=[],r=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:\"_untrackClassesElement\"}),e.keys&&i(e.keys.match(/\\S+/g)||[],!0),e.extra&&i(e.extra.match(/\\S+/g)||[]),n.join(\" \")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(n,r){-1!==t.inArray(e.target,r)&&(i.classesElementLookup[n]=t(r.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,n){n=\"boolean\"==typeof n?n:i;var r=\"string\"==typeof t||null===t,s={extra:r?e:i,keys:r?t:e,element:r?this.element:t,add:n};return s.element.toggleClass(this._classes(s),n),this},_on:function(e,i,n){var r,s=this;\"boolean\"!=typeof e&&(n=i,i=e,e=!1),n?(i=r=t(i),this.bindings=this.bindings.add(i)):(n=i,i=this.element,r=this.widget()),t.each(n,function(n,o){function a(){return e||!0!==s.options.disabled&&!t(this).hasClass(\"ui-state-disabled\")?(\"string\"==typeof o?s[o]:o).apply(s,arguments):void 0}\"string\"!=typeof o&&(a.guid=o.guid=o.guid||a.guid||t.guid++);var l=n.match(/^([\\w:-]*)\\s*(.*)$/),u=l[1]+s.eventNamespace,c=l[2];c?r.on(u,c,a):i.on(u,a)})},_off:function(e,i){i=(i||\"\").split(\" \").join(this.eventNamespace+\" \")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return(\"string\"==typeof t?n[t]:t).apply(n,arguments)}var n=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,\"ui-state-hover\")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,\"ui-state-hover\")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,\"ui-state-focus\")},focusout:function(e){this._removeClass(t(e.currentTarget),null,\"ui-state-focus\")}})},_trigger:function(e,i,n){var r,s,o=this.options[e];if(n=n||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],s=i.originalEvent)for(r in s)r in i||(i[r]=s[r]);return this.element.trigger(i,n),!(t.isFunction(o)&&!1===o.apply(this.element[0],[i].concat(n))||i.isDefaultPrevented())}},t.each({show:\"fadeIn\",hide:\"fadeOut\"},function(e,i){t.Widget.prototype[\"_\"+e]=function(n,r,s){\"string\"==typeof r&&(r={effect:r});var o,a=r?!0===r||\"number\"==typeof r?i:r.effect||i:e;r=r||{},\"number\"==typeof r&&(r={duration:r}),o=!t.isEmptyObject(r),r.complete=s,r.delay&&n.delay(r.delay),o&&t.effects&&t.effects.effect[a]?n[e](r):a!==e&&n[a]?n[a](r.duration,r.easing,s):n.queue(function(i){t(this)[e](),s&&s.call(n[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(h.test(t[0])?e/100:1),parseFloat(t[1])*(h.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var r,s=Math.max,o=Math.abs,a=/left|center|right/,l=/top|center|bottom/,u=/[\\+\\-]\\d+(\\.[\\d]+)?%?/,c=/^\\w+/,h=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==r)return r;var e,i,n=t(\"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\"),s=n.children()[0];return t(\"body\").append(n),e=s.offsetWidth,n.css(\"overflow\",\"scroll\"),i=s.offsetWidth,e===i&&(i=n[0].clientWidth),n.remove(),r=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?\"\":e.element.css(\"overflow-x\"),n=e.isWindow||e.isDocument?\"\":e.element.css(\"overflow-y\"),r=\"scroll\"===i||\"auto\"===i&&e.width<e.element[0].scrollWidth;return{width:\"scroll\"===n||\"auto\"===n&&e.height<e.element[0].scrollHeight?t.position.scrollbarWidth():0,height:r?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),n=t.isWindow(i[0]),r=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:n,isDocument:r,offset:n||r?{left:0,top:0}:t(e).offset(),scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(r){if(!r||!r.of)return d.apply(this,arguments);r=t.extend({},r);var h,p,f,g,m,v,_=t(r.of),y=t.position.getWithinInfo(r.within),b=t.position.getScrollInfo(y),w=(r.collision||\"flip\").split(\" \"),x={};return v=n(_),_[0].preventDefault&&(r.at=\"left top\"),p=v.width,f=v.height,g=v.offset,m=t.extend({},g),t.each([\"my\",\"at\"],function(){var t,e,i=(r[this]||\"\").split(\" \");1===i.length&&(i=a.test(i[0])?i.concat([\"center\"]):l.test(i[0])?[\"center\"].concat(i):[\"center\",\"center\"]),i[0]=a.test(i[0])?i[0]:\"center\",i[1]=l.test(i[1])?i[1]:\"center\",t=u.exec(i[0]),e=u.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],r[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),\"right\"===r.at[0]?m.left+=p:\"center\"===r.at[0]&&(m.left+=p/2),\"bottom\"===r.at[1]?m.top+=f:\"center\"===r.at[1]&&(m.top+=f/2),h=e(x.at,p,f),m.left+=h[0],m.top+=h[1],this.each(function(){var n,a,l=t(this),u=l.outerWidth(),c=l.outerHeight(),d=i(this,\"marginLeft\"),v=i(this,\"marginTop\"),C=u+d+i(this,\"marginRight\")+b.width,k=c+v+i(this,\"marginBottom\")+b.height,T=t.extend({},m),D=e(x.my,l.outerWidth(),l.outerHeight());\"right\"===r.my[0]?T.left-=u:\"center\"===r.my[0]&&(T.left-=u/2),\"bottom\"===r.my[1]?T.top-=c:\"center\"===r.my[1]&&(T.top-=c/2),T.left+=D[0],T.top+=D[1],n={marginLeft:d,marginTop:v},t.each([\"left\",\"top\"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](T,{targetWidth:p,targetHeight:f,elemWidth:u,elemHeight:c,collisionPosition:n,collisionWidth:C,collisionHeight:k,offset:[h[0]+D[0],h[1]+D[1]],my:r.my,at:r.at,within:y,elem:l})}),r.using&&(a=function(t){var e=g.left-T.left,i=e+p-u,n=g.top-T.top,a=n+f-c,h={target:{element:_,left:g.left,top:g.top,width:p,height:f},element:{element:l,left:T.left,top:T.top,width:u,height:c},horizontal:0>i?\"left\":e>0?\"right\":\"center\",vertical:0>a?\"top\":n>0?\"bottom\":\"middle\"};u>p&&p>o(e+i)&&(h.horizontal=\"center\"),c>f&&f>o(n+a)&&(h.vertical=\"middle\"),h.important=s(o(e),o(i))>s(o(n),o(a))?\"horizontal\":\"vertical\",r.using.call(this,t,h)}),l.offset(t.extend(T,{using:a}))})},t.ui.position={fit:{left:function(t,e){var i,n=e.within,r=n.isWindow?n.scrollLeft:n.offset.left,o=n.width,a=t.left-e.collisionPosition.marginLeft,l=r-a,u=a+e.collisionWidth-o-r;e.collisionWidth>o?l>0&&0>=u?(i=t.left+l+e.collisionWidth-o-r,t.left+=l-i):t.left=u>0&&0>=l?r:l>u?r+o-e.collisionWidth:r:l>0?t.left+=l:u>0?t.left-=u:t.left=s(t.left-a,t.left)},top:function(t,e){var i,n=e.within,r=n.isWindow?n.scrollTop:n.offset.top,o=e.within.height,a=t.top-e.collisionPosition.marginTop,l=r-a,u=a+e.collisionHeight-o-r;e.collisionHeight>o?l>0&&0>=u?(i=t.top+l+e.collisionHeight-o-r,t.top+=l-i):t.top=u>0&&0>=l?r:l>u?r+o-e.collisionHeight:r:l>0?t.top+=l:u>0?t.top-=u:t.top=s(t.top-a,t.top)}},flip:{left:function(t,e){var i,n,r=e.within,s=r.offset.left+r.scrollLeft,a=r.width,l=r.isWindow?r.scrollLeft:r.offset.left,u=t.left-e.collisionPosition.marginLeft,c=u-l,h=u+e.collisionWidth-a-l,d=\"left\"===e.my[0]?-e.elemWidth:\"right\"===e.my[0]?e.elemWidth:0,p=\"left\"===e.at[0]?e.targetWidth:\"right\"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(0>(i=t.left+d+p+f+e.collisionWidth-a-s)||o(c)>i)&&(t.left+=d+p+f):h>0&&((n=t.left-e.collisionPosition.marginLeft+d+p+f-l)>0||h>o(n))&&(t.left+=d+p+f)},top:function(t,e){var i,n,r=e.within,s=r.offset.top+r.scrollTop,a=r.height,l=r.isWindow?r.scrollTop:r.offset.top,u=t.top-e.collisionPosition.marginTop,c=u-l,h=u+e.collisionHeight-a-l,d=\"top\"===e.my[1],p=d?-e.elemHeight:\"bottom\"===e.my[1]?e.elemHeight:0,f=\"top\"===e.at[1]?e.targetHeight:\"bottom\"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(0>(n=t.top+p+f+g+e.collisionHeight-a-s)||o(c)>n)&&(t.top+=p+f+g):h>0&&((i=t.top-e.collisionPosition.marginTop+p+f+g-l)>0||h>o(i))&&(t.top+=p+f+g)}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[\":\"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,n){return!!t.data(e,n[3])}}),t.fn.extend({disableSelection:function(){var t=\"onselectstart\"in document.createElement(\"div\")?\"selectstart\":\"mousedown\";return function(){return this.on(t+\".ui-disableSelection\",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(\".ui-disableSelection\")}}),t.ui.focusable=function(i,n){var r,s,o,a,l,u=i.nodeName.toLowerCase();return\"area\"===u?(r=i.parentNode,s=r.name,!(!i.href||!s||\"map\"!==r.nodeName.toLowerCase())&&(o=t(\"img[usemap='#\"+s+\"']\"),o.length>0&&o.is(\":visible\"))):(/^(input|select|textarea|button|object)$/.test(u)?(a=!i.disabled)&&(l=t(i).closest(\"fieldset\")[0])&&(a=!l.disabled):a=\"a\"===u?i.href||n:n,a&&t(i).is(\":visible\")&&e(t(i)))},t.extend(t.expr[\":\"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,\"tabindex\"))}}),t.ui.focusable,t.fn.form=function(){return\"string\"==typeof this[0].form?this.closest(\"form\"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data(\"ui-form-reset-instances\");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data(\"ui-form-reset-instances\")||[];t.length||this.form.on(\"reset.ui-form-reset\",this._formResetHandler),t.push(this),this.form.data(\"ui-form-reset-instances\",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data(\"ui-form-reset-instances\");e.splice(t.inArray(this,e),1),e.length?this.form.data(\"ui-form-reset-instances\",e):this.form.removeData(\"ui-form-reset-instances\").off(\"reset.ui-form-reset\")}}},\"1.7\"===t.fn.jquery.substring(0,3)&&(t.each([\"Width\",\"Height\"],function(e,i){function n(e,i,n,s){return t.each(r,function(){i-=parseFloat(t.css(e,\"padding\"+this))||0,n&&(i-=parseFloat(t.css(e,\"border\"+this+\"Width\"))||0),s&&(i-=parseFloat(t.css(e,\"margin\"+this))||0)}),i}var r=\"Width\"===i?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],s=i.toLowerCase(),o={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn[\"inner\"+i]=function(e){return void 0===e?o[\"inner\"+i].call(this):this.each(function(){t(this).css(s,n(this,e)+\"px\")})},t.fn[\"outer\"+i]=function(e,r){return\"number\"!=typeof e?o[\"outer\"+i].call(this,e):this.each(function(){t(this).css(s,n(this,e,!0,r)+\"px\")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!\"#$%&'()*+,.\\/:;<=>?@[\\]^`{|}~])/g;return function(e){return e.replace(t,\"\\\\$1\")}}(),t.fn.labels=function(){var e,i,n,r,s;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(r=this.eq(0).parents(\"label\"),n=this.attr(\"id\"),n&&(e=this.eq(0).parents().last(),s=e.add(e.length?e.siblings():this.siblings()),i=\"label[for='\"+t.ui.escapeSelector(n)+\"']\",r=r.add(s.find(i).addBack(i))),this.pushStack(r))},t.fn.scrollParent=function(e){var i=this.css(\"position\"),n=\"absolute\"===i,r=e?/(auto|scroll|hidden)/:/(auto|scroll)/,s=this.parents().filter(function(){var e=t(this);return(!n||\"static\"!==e.css(\"position\"))&&r.test(e.css(\"overflow\")+e.css(\"overflow-y\")+e.css(\"overflow-x\"))}).eq(0);return\"fixed\"!==i&&s.length?s:t(this[0].ownerDocument||document)},t.extend(t.expr[\":\"],{tabbable:function(e){var i=t.attr(e,\"tabindex\"),n=null!=i;return(!n||i>=0)&&t.ui.focusable(e,n)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id=\"ui-id-\"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\\d+$/.test(this.id)&&t(this).removeAttr(\"id\")})}}),t.ui.ie=!!/msie [\\w.]+/.exec(navigator.userAgent.toLowerCase());var c=!1;t(document).on(\"mouseup\",function(){c=!1}),t.widget(\"ui.mouse\",{version:\"1.12.1\",options:{cancel:\"input, textarea, button, select, option\",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on(\"mousedown.\"+this.widgetName,function(t){return e._mouseDown(t)}).on(\"click.\"+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+\".preventClickEvent\")?(t.removeData(i.target,e.widgetName+\".preventClickEvent\"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off(\".\"+this.widgetName),this._mouseMoveDelegate&&this.document.off(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).off(\"mouseup.\"+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!c){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,n=1===e.which,r=!(\"string\"!=typeof this.options.cancel||!e.target.nodeName)&&t(e.target).closest(this.options.cancel).length;return!(n&&!r&&this._mouseCapture(e))||(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=!1!==this._mouseStart(e),!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+\".preventClickEvent\")&&t.removeData(e.target,this.widgetName+\".preventClickEvent\"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).on(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),e.preventDefault(),c=!0,!0))}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,e),this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).off(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,c=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,n){var r,s=t.ui[e].prototype;for(r in n)s.plugins[r]=s.plugins[r]||[],s.plugins[r].push([i,n[r]])},call:function(t,e,i,n){var r,s=t.plugins[e];if(s&&(n||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(r=0;s.length>r;r++)t.options[s[r][0]]&&s[r][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&\"body\"!==e.nodeName.toLowerCase()&&t(e).trigger(\"blur\")},t.widget(\"ui.draggable\",t.ui.mouse,{version:\"1.12.1\",widgetEventPrefix:\"drag\",options:{addClasses:!0,appendTo:\"parent\",axis:!1,connectToSortable:!1,containment:!1,cursor:\"auto\",cursorAt:!1,grid:!1,handle:!1,helper:\"original\",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:\"default\",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:\"both\",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){\"original\"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass(\"ui-draggable\"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),\"handle\"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(\".ui-draggable-dragging\")?void(this.destroyOnClear=!0):(this._removeHandleClassName(),void this._mouseDestroy())},_mouseCapture:function(e){var i=this.options;return!(this.helper||i.disabled||t(e.target).closest(\".ui-resizable-handle\").length>0)&&(this.handle=this._getHandle(e),!!this.handle&&(this._blurActiveElement(e),this._blockFrames(!0===i.iframeFix?\"iframe\":i.iframeFix),!0))},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t(\"<div>\").css(\"position\",\"absolute\").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]);t(e.target).closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,\"ui-draggable-dragging\"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css(\"position\"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return\"fixed\"===t(this).css(\"position\")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),!1===this._trigger(\"start\",e)?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo(\"absolute\"),!i){var n=this._uiHash();if(!1===this._trigger(\"drag\",e,n))return this._mouseUp(new t.Event(\"mouseup\",e)),!1;this.position=n.position}return this.helper[0].style.left=this.position.left+\"px\",this.helper[0].style.top=this.position.top+\"px\",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,n=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(n=t.ui.ddmanager.drop(this,e)),this.dropped&&(n=this.dropped,this.dropped=!1),\"invalid\"===this.options.revert&&!n||\"valid\"===this.options.revert&&n||!0===this.options.revert||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,n)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){!1!==i._trigger(\"stop\",e)&&i._clear()}):!1!==this._trigger(\"stop\",e)&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger(\"focus\"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(\".ui-draggable-dragging\")?this._mouseUp(new t.Event(\"mouseup\",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return!this.options.handle||!!t(e.target).closest(this.element.find(this.options.handle)).length},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,\"ui-draggable-handle\")},_removeHandleClassName:function(){this._removeClass(this.handleElement,\"ui-draggable-handle\")},_createHelper:function(e){var i=this.options,n=t.isFunction(i.helper),r=n?t(i.helper.apply(this.element[0],[e])):\"clone\"===i.helper?this.element.clone().removeAttr(\"id\"):this.element;return r.parents(\"body\").length||r.appendTo(\"parent\"===i.appendTo?this.element[0].parentNode:i.appendTo),n&&r[0]===this.element[0]&&this._setPositionRelative(),r[0]===this.element[0]||/(fixed|absolute)/.test(r.css(\"position\"))||r.css(\"position\",\"absolute\"),r},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css(\"position\"))||(this.element[0].style.position=\"relative\")},_adjustOffsetFromHelper:function(e){\"string\"==typeof e&&(e=e.split(\" \")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),\"left\"in e&&(this.offset.click.left=e.left+this.margins.left),\"right\"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),\"top\"in e&&(this.offset.click.top=e.top+this.margins.top),\"bottom\"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return\"absolute\"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css(\"borderTopWidth\"),10)||0),left:e.left+(parseInt(this.offsetParent.css(\"borderLeftWidth\"),10)||0)}},_getRelativeOffset:function(){if(\"relative\"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css(\"top\"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css(\"left\"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css(\"marginLeft\"),10)||0,top:parseInt(this.element.css(\"marginTop\"),10)||0,right:parseInt(this.element.css(\"marginRight\"),10)||0,bottom:parseInt(this.element.css(\"marginBottom\"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,n,r=this.options,s=this.document[0];return this.relativeContainer=null,r.containment?\"window\"===r.containment?void(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||s.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]):\"document\"===r.containment?void(this.containment=[0,0,t(s).width()-this.helperProportions.width-this.margins.left,(t(s).height()||s.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]):r.containment.constructor===Array?void(this.containment=r.containment):(\"parent\"===r.containment&&(r.containment=this.helper[0].parentNode),i=t(r.containment),void((n=i[0])&&(e=/(scroll|auto)/.test(i.css(\"overflow\")),this.containment=[(parseInt(i.css(\"borderLeftWidth\"),10)||0)+(parseInt(i.css(\"paddingLeft\"),10)||0),(parseInt(i.css(\"borderTopWidth\"),10)||0)+(parseInt(i.css(\"paddingTop\"),10)||0),(e?Math.max(n.scrollWidth,n.offsetWidth):n.offsetWidth)-(parseInt(i.css(\"borderRightWidth\"),10)||0)-(parseInt(i.css(\"paddingRight\"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(n.scrollHeight,n.offsetHeight):n.offsetHeight)-(parseInt(i.css(\"borderBottomWidth\"),10)||0)-(parseInt(i.css(\"paddingBottom\"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i))):void(this.containment=null)},_convertPositionTo:function(t,e){e||(e=this.position);var i=\"absolute\"===t?1:-1,n=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-(\"fixed\"===this.cssPosition?-this.offset.scroll.top:n?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-(\"fixed\"===this.cssPosition?-this.offset.scroll.left:n?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,n,r,s,o=this.options,a=this._isRootNode(this.scrollParent[0]),l=t.pageX,u=t.pageY;return a&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(n=this.relativeContainer.offset(),i=[this.containment[0]+n.left,this.containment[1]+n.top,this.containment[2]+n.left,this.containment[3]+n.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(l=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(u=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(u=i[3]+this.offset.click.top)),o.grid&&(r=o.grid[1]?this.originalPageY+Math.round((u-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,u=i?r-this.offset.click.top>=i[1]||r-this.offset.click.top>i[3]?r:r-this.offset.click.top>=i[1]?r-o.grid[1]:r+o.grid[1]:r,s=o.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,l=i?s-this.offset.click.left>=i[0]||s-this.offset.click.left>i[2]?s:s-this.offset.click.left>=i[0]?s-o.grid[0]:s+o.grid[0]:s),\"y\"===o.axis&&(l=this.originalPageX),\"x\"===o.axis&&(u=this.originalPageY)),{top:u-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(\"fixed\"===this.cssPosition?-this.offset.scroll.top:a?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(\"fixed\"===this.cssPosition?-this.offset.scroll.left:a?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,\"ui-draggable-dragging\"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,n){return n=n||this._uiHash(),t.ui.plugin.call(this,e,[i,n,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo(\"absolute\"),n.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,n)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add(\"draggable\",\"connectToSortable\",{start:function(e,i,n){var r=t.extend({},i,{item:n.element});n.sortables=[],t(n.options.connectToSortable).each(function(){var i=t(this).sortable(\"instance\");i&&!i.options.disabled&&(n.sortables.push(i),i.refreshPositions(),i._trigger(\"activate\",e,r))})},stop:function(e,i,n){var r=t.extend({},i,{item:n.element});n.cancelHelperRemoval=!1,t.each(n.sortables,function(){var t=this;t.isOver?(t.isOver=0,n.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css(\"position\"),top:t.placeholder.css(\"top\"),left:t.placeholder.css(\"left\")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger(\"deactivate\",e,r))})},drag:function(e,i,n){t.each(n.sortables,function(){var r=!1,s=this;s.positionAbs=n.positionAbs,s.helperProportions=n.helperProportions,s.offset.click=n.offset.click,s._intersectsWith(s.containerCache)&&(r=!0,t.each(n.sortables,function(){return this.positionAbs=n.positionAbs,this.helperProportions=n.helperProportions,this.offset.click=n.offset.click,this!==s&&this._intersectsWith(this.containerCache)&&t.contains(s.element[0],this.element[0])&&(r=!1),r})),r?(s.isOver||(s.isOver=1,n._parent=i.helper.parent(),s.currentItem=i.helper.appendTo(s.element).data(\"ui-sortable-item\",!0),s.options._helper=s.options.helper,s.options.helper=function(){return i.helper[0]},e.target=s.currentItem[0],s._mouseCapture(e,!0),s._mouseStart(e,!0,!0),s.offset.click.top=n.offset.click.top,s.offset.click.left=n.offset.click.left,s.offset.parent.left-=n.offset.parent.left-s.offset.parent.left,s.offset.parent.top-=n.offset.parent.top-s.offset.parent.top,n._trigger(\"toSortable\",e),n.dropped=s.element,t.each(n.sortables,function(){this.refreshPositions()}),n.currentItem=n.element,s.fromOutside=n),s.currentItem&&(s._mouseDrag(e),i.position=s.position)):s.isOver&&(s.isOver=0,s.cancelHelperRemoval=!0,s.options._revert=s.options.revert,s.options.revert=!1,s._trigger(\"out\",e,s._uiHash(s)),s._mouseStop(e,!0),s.options.revert=s.options._revert,s.options.helper=s.options._helper,s.placeholder&&s.placeholder.remove(),i.helper.appendTo(n._parent),n._refreshOffsets(e),i.position=n._generatePosition(e,!0),n._trigger(\"fromSortable\",e),n.dropped=!1,t.each(n.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add(\"draggable\",\"cursor\",{start:function(e,i,n){var r=t(\"body\"),s=n.options;r.css(\"cursor\")&&(s._cursor=r.css(\"cursor\")),r.css(\"cursor\",s.cursor)},stop:function(e,i,n){var r=n.options;r._cursor&&t(\"body\").css(\"cursor\",r._cursor)}}),t.ui.plugin.add(\"draggable\",\"opacity\",{start:function(e,i,n){var r=t(i.helper),s=n.options;r.css(\"opacity\")&&(s._opacity=r.css(\"opacity\")),r.css(\"opacity\",s.opacity)},stop:function(e,i,n){var r=n.options;r._opacity&&t(i.helper).css(\"opacity\",r._opacity)}}),t.ui.plugin.add(\"draggable\",\"scroll\",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&\"HTML\"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,n){var r=n.options,s=!1,o=n.scrollParentNotHidden[0],a=n.document[0];o!==a&&\"HTML\"!==o.tagName?(r.axis&&\"x\"===r.axis||(n.overflowOffset.top+o.offsetHeight-e.pageY<r.scrollSensitivity?o.scrollTop=s=o.scrollTop+r.scrollSpeed:e.pageY-n.overflowOffset.top<r.scrollSensitivity&&(o.scrollTop=s=o.scrollTop-r.scrollSpeed)),r.axis&&\"y\"===r.axis||(n.overflowOffset.left+o.offsetWidth-e.pageX<r.scrollSensitivity?o.scrollLeft=s=o.scrollLeft+r.scrollSpeed:e.pageX-n.overflowOffset.left<r.scrollSensitivity&&(o.scrollLeft=s=o.scrollLeft-r.scrollSpeed))):(r.axis&&\"x\"===r.axis||(e.pageY-t(a).scrollTop()<r.scrollSensitivity?s=t(a).scrollTop(t(a).scrollTop()-r.scrollSpeed):t(window).height()-(e.pageY-t(a).scrollTop())<r.scrollSensitivity&&(s=t(a).scrollTop(t(a).scrollTop()+r.scrollSpeed))),r.axis&&\"y\"===r.axis||(e.pageX-t(a).scrollLeft()<r.scrollSensitivity?s=t(a).scrollLeft(t(a).scrollLeft()-r.scrollSpeed):t(window).width()-(e.pageX-t(a).scrollLeft())<r.scrollSensitivity&&(s=t(a).scrollLeft(t(a).scrollLeft()+r.scrollSpeed)))),!1!==s&&t.ui.ddmanager&&!r.dropBehaviour&&t.ui.ddmanager.prepareOffsets(n,e)}}),t.ui.plugin.add(\"draggable\",\"snap\",{start:function(e,i,n){var r=n.options;n.snapElements=[],t(r.snap.constructor!==String?r.snap.items||\":data(ui-draggable)\":r.snap).each(function(){var e=t(this),i=e.offset();this!==n.element[0]&&n.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,n){var r,s,o,a,l,u,c,h,d,p,f=n.options,g=f.snapTolerance,m=i.offset.left,v=m+n.helperProportions.width,_=i.offset.top,y=_+n.helperProportions.height;for(d=n.snapElements.length-1;d>=0;d--)l=n.snapElements[d].left-n.margins.left,u=l+n.snapElements[d].width,c=n.snapElements[d].top-n.margins.top,h=c+n.snapElements[d].height,l-g>v||m>u+g||c-g>y||_>h+g||!t.contains(n.snapElements[d].item.ownerDocument,n.snapElements[d].item)?(n.snapElements[d].snapping&&n.options.snap.release&&n.options.snap.release.call(n.element,e,t.extend(n._uiHash(),{snapItem:n.snapElements[d].item})),n.snapElements[d].snapping=!1):(\"inner\"!==f.snapMode&&(r=g>=Math.abs(c-y),s=g>=Math.abs(h-_),o=g>=Math.abs(l-v),a=g>=Math.abs(u-m),r&&(i.position.top=n._convertPositionTo(\"relative\",{top:c-n.helperProportions.height,left:0}).top),s&&(i.position.top=n._convertPositionTo(\"relative\",{top:h,left:0}).top),o&&(i.position.left=n._convertPositionTo(\"relative\",{top:0,left:l-n.helperProportions.width}).left),a&&(i.position.left=n._convertPositionTo(\"relative\",{top:0,left:u}).left)),p=r||s||o||a,\"outer\"!==f.snapMode&&(r=g>=Math.abs(c-_),s=g>=Math.abs(h-y),o=g>=Math.abs(l-m),a=g>=Math.abs(u-v),r&&(i.position.top=n._convertPositionTo(\"relative\",{top:c,left:0}).top),s&&(i.position.top=n._convertPositionTo(\"relative\",{top:h-n.helperProportions.height,left:0}).top),o&&(i.position.left=n._convertPositionTo(\"relative\",{top:0,left:l}).left),a&&(i.position.left=n._convertPositionTo(\"relative\",{top:0,left:u-n.helperProportions.width}).left)),!n.snapElements[d].snapping&&(r||s||o||a||p)&&n.options.snap.snap&&n.options.snap.snap.call(n.element,e,t.extend(n._uiHash(),{snapItem:n.snapElements[d].item})),n.snapElements[d].snapping=r||s||o||a||p)}}),t.ui.plugin.add(\"draggable\",\"stack\",{start:function(e,i,n){var r,s=n.options,o=t.makeArray(t(s.stack)).sort(function(e,i){return(parseInt(t(e).css(\"zIndex\"),10)||0)-(parseInt(t(i).css(\"zIndex\"),10)||0)});o.length&&(r=parseInt(t(o[0]).css(\"zIndex\"),10)||0,t(o).each(function(e){t(this).css(\"zIndex\",r+e)}),this.css(\"zIndex\",r+o.length))}}),t.ui.plugin.add(\"draggable\",\"zIndex\",{start:function(e,i,n){var r=t(i.helper),s=n.options;r.css(\"zIndex\")&&(s._zIndex=r.css(\"zIndex\")),r.css(\"zIndex\",s.zIndex)},stop:function(e,i,n){var r=n.options;r._zIndex&&t(i.helper).css(\"zIndex\",r._zIndex)}}),t.ui.draggable,t.widget(\"ui.droppable\",{version:\"1.12.1\",widgetEventPrefix:\"drop\",options:{accept:\"*\",addClasses:!0,greedy:!1,scope:\"default\",tolerance:\"intersect\",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,n=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(n)?n:function(t){return t.is(n)},this.proportions=function(){return arguments.length?void(e=arguments[0]):e||(e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight})},this._addToManager(i.scope),i.addClasses&&this._addClass(\"ui-droppable\")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if(\"accept\"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if(\"scope\"===e){var n=t.ui.ddmanager.droppables[this.options.scope];this._splice(n),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger(\"activate\",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger(\"deactivate\",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger(\"over\",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger(\"out\",e,this.ui(i)))},_drop:function(e,i){var n=i||t.ui.ddmanager.current,r=!1;return!(!n||(n.currentItem||n.element)[0]===this.element[0])&&(this.element.find(\":data(ui-droppable)\").not(\".ui-draggable-dragging\").each(function(){var i=t(this).droppable(\"instance\");return i.options.greedy&&!i.options.disabled&&i.options.scope===n.options.scope&&i.accept.call(i.element[0],n.currentItem||n.element)&&h(n,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(r=!0,!1):void 0}),!r&&(!!this.accept.call(this.element[0],n.currentItem||n.element)&&(this._removeActiveClass(),this._removeHoverClass(),this._trigger(\"drop\",e,this.ui(n)),this.element)))},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass(\"ui-droppable-hover\")},_removeHoverClass:function(){this._removeClass(\"ui-droppable-hover\")},_addActiveClass:function(){this._addClass(\"ui-droppable-active\")},_removeActiveClass:function(){this._removeClass(\"ui-droppable-active\")}});var h=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,n,r){if(!i.offset)return!1;var s=(e.positionAbs||e.position.absolute).left+e.margins.left,o=(e.positionAbs||e.position.absolute).top+e.margins.top,a=s+e.helperProportions.width,l=o+e.helperProportions.height,u=i.offset.left,c=i.offset.top,h=u+i.proportions().width,d=c+i.proportions().height;switch(n){case\"fit\":return s>=u&&h>=a&&o>=c&&d>=l;case\"intersect\":return s+e.helperProportions.width/2>u&&h>a-e.helperProportions.width/2&&o+e.helperProportions.height/2>c&&d>l-e.helperProportions.height/2;case\"pointer\":return t(r.pageY,c,i.proportions().height)&&t(r.pageX,u,i.proportions().width);case\"touch\":return(o>=c&&d>=o||l>=c&&d>=l||c>o&&l>d)&&(s>=u&&h>=s||a>=u&&h>=a||u>s&&a>h);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{default:[]},prepareOffsets:function(e,i){var n,r,s=t.ui.ddmanager.droppables[e.options.scope]||[],o=i?i.type:null,a=(e.currentItem||e.element).find(\":data(ui-droppable)\").addBack();t:for(n=0;s.length>n;n++)if(!(s[n].options.disabled||e&&!s[n].accept.call(s[n].element[0],e.currentItem||e.element))){for(r=0;a.length>r;r++)if(a[r]===s[n].element[0]){s[n].proportions().height=0;continue t}s[n].visible=\"none\"!==s[n].element.css(\"display\"),s[n].visible&&(\"mousedown\"===o&&s[n]._activate.call(s[n],i),s[n].offset=s[n].element.offset(),s[n].proportions({width:s[n].element[0].offsetWidth,height:s[n].element[0].offsetHeight}))}},drop:function(e,i){var n=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&h(e,this,this.options.tolerance,i)&&(n=this._drop.call(this,i)||n),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),n},dragStart:function(e,i){e.element.parentsUntil(\"body\").on(\"scroll.droppable\",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var n,r,s,o=h(e,this,this.options.tolerance,i),a=!o&&this.isover?\"isout\":o&&!this.isover?\"isover\":null;a&&(this.options.greedy&&(r=this.options.scope,s=this.element.parents(\":data(ui-droppable)\").filter(function(){return t(this).droppable(\"instance\").options.scope===r}),s.length&&(n=t(s[0]).droppable(\"instance\"),n.greedyChild=\"isover\"===a)),n&&\"isover\"===a&&(n.isover=!1,n.isout=!0,n._out.call(n,i)),this[a]=!0,this[\"isout\"===a?\"isover\":\"isout\"]=!1,this[\"isover\"===a?\"_over\":\"_out\"].call(this,i),n&&\"isout\"===a&&(n.isout=!1,n.isover=!0,n._over.call(n,i)))}})},dragStop:function(e,i){e.element.parentsUntil(\"body\").off(\"scroll.droppable\"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},!1!==t.uiBackCompat&&t.widget(\"ui.droppable\",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget(\"ui.resizable\",t.ui.mouse,{version:\"1.12.1\",widgetEventPrefix:\"resize\",options:{alsoResize:!1,animate:!1,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:!1,autoHide:!1,classes:{\"ui-resizable-se\":\"ui-icon ui-icon-gripsmall-diagonal-se\"},containment:!1,ghost:!1,grid:!1,handles:\"e,s,se\",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if(\"hidden\"===t(e).css(\"overflow\"))return!1;var n=i&&\"left\"===i?\"scrollLeft\":\"scrollTop\",r=!1;return e[n]>0||(e[n]=1,r=e[n]>0,e[n]=0,r)},_create:function(){var e,i=this.options,n=this;this._addClass(\"ui-resizable\"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||\"ui-resizable-helper\":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t(\"<div class='ui-wrapper' style='overflow: hidden;'></div>\").css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")})),this.element=this.element.parent().data(\"ui-resizable\",this.element.resizable(\"instance\")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\"),marginLeft:this.originalElement.css(\"marginLeft\")},this.element.css(e),this.originalElement.css(\"margin\",0),this.originalResizeStyle=this.originalElement.css(\"resize\"),this.originalElement.css(\"resize\",\"none\"),this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on(\"mouseenter\",function(){i.disabled||(n._removeClass(\"ui-resizable-autohide\"),n._handles.show())}).on(\"mouseleave\",function(){i.disabled||n.resizing||(n._addClass(\"ui-resizable-autohide\"),n._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData(\"resizable\").removeData(\"ui-resizable\").off(\".resizable\").find(\".ui-resizable-handle\").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css(\"position\"),width:e.outerWidth(),height:e.outerHeight(),top:e.css(\"top\"),left:e.css(\"left\")}).insertAfter(e),e.remove()),this.originalElement.css(\"resize\",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case\"handles\":this._removeHandles(),this._setupHandles()}},_setupHandles:function(){var e,i,n,r,s,o=this.options,a=this;if(this.handles=o.handles||(t(\".ui-resizable-handle\",this.element).length?{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"}:\"e,s,se\"),this._handles=t(),this.handles.constructor===String)for(\"all\"===this.handles&&(this.handles=\"n,e,s,w,se,sw,ne,nw\"),n=this.handles.split(\",\"),this.handles={},i=0;n.length>i;i++)e=t.trim(n[i]),r=\"ui-resizable-\"+e,s=t(\"<div>\"),this._addClass(s,\"ui-resizable-handle \"+r),s.css({zIndex:o.zIndex}),this.handles[e]=\".ui-resizable-\"+e,this.element.append(s);this._renderAxis=function(e){var i,n,r,s;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:a._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(n=t(this.handles[i],this.element),s=/sw|ne|nw|se|n|s/.test(i)?n.outerHeight():n.outerWidth(),r=[\"padding\",/ne|nw|n/.test(i)?\"Top\":/se|sw|s/.test(i)?\"Bottom\":/^e$/.test(i)?\"Right\":\"Left\"].join(\"\"),e.css(r,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(\".ui-resizable-handle\")),this._handles.disableSelection(),this._handles.on(\"mouseover\",function(){a.resizing||(this.className&&(s=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=s&&s[1]?s[1]:\"se\")}),o.autoHide&&(this._handles.hide(),this._addClass(\"ui-resizable-autohide\"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,n,r=!1;for(i in this.handles)((n=t(this.handles[i])[0])===e.target||t.contains(n,e.target))&&(r=!0);return!this.options.disabled&&r},_mouseStart:function(e){var i,n,r,s=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css(\"left\")),n=this._num(this.helper.css(\"top\")),s.containment&&(i+=t(s.containment).scrollLeft()||0,n+=t(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:n},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:n},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio=\"number\"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,r=t(\".ui-resizable-\"+this.axis).css(\"cursor\"),t(\"body\").css(\"cursor\",\"auto\"===r?this.axis+\"-resize\":r),this._addClass(\"ui-resizable-resizing\"),this._propagate(\"start\",e),!0},_mouseDrag:function(e){var i,n,r=this.originalMousePosition,s=this.axis,o=e.pageX-r.left||0,a=e.pageY-r.top||0,l=this._change[s];return this._updatePrevProperties(),!!l&&(i=l.apply(this,[e,o,a]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate(\"resize\",e),n=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(n)||(this._updatePrevProperties(),this._trigger(\"resize\",e,this.ui()),this._applyChanges()),!1)},_mouseStop:function(e){this.resizing=!1;var i,n,r,s,o,a,l,u=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,n=i.length&&/textarea/i.test(i[0].nodeName),r=n&&this._hasScroll(i[0],\"left\")?0:c.sizeDiff.height,s=n?0:c.sizeDiff.width,o={width:c.helper.width()-s,height:c.helper.height()-r},a=parseFloat(c.element.css(\"left\"))+(c.position.left-c.originalPosition.left)||null,l=parseFloat(c.element.css(\"top\"))+(c.position.top-c.originalPosition.top)||null,u.animate||this.element.css(t.extend(o,{top:l,left:a})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!u.animate&&this._proportionallyResize()),t(\"body\").css(\"cursor\",\"auto\"),this._removeClass(\"ui-resizable-resizing\"),this._propagate(\"stop\",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+\"px\"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+\"px\"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+\"px\"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+\"px\"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,n,r,s,o=this.options;s={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||t)&&(e=s.minHeight*this.aspectRatio,n=s.minWidth/this.aspectRatio,i=s.maxHeight*this.aspectRatio,r=s.maxWidth/this.aspectRatio,e>s.minWidth&&(s.minWidth=e),n>s.minHeight&&(s.minHeight=n),s.maxWidth>i&&(s.maxWidth=i),s.maxHeight>r&&(s.maxHeight=r)),this._vBoundaries=s},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,n=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),\"sw\"===n&&(t.left=e.left+(i.width-t.width),t.top=null),\"nw\"===n&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,n=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,r=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,s=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,o=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,u=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return s&&(t.width=e.minWidth),o&&(t.height=e.minHeight),n&&(t.width=e.maxWidth),r&&(t.height=e.maxHeight),s&&u&&(t.left=a-e.minWidth),n&&u&&(t.left=a-e.maxWidth),o&&c&&(t.top=l-e.minHeight),r&&c&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],n=[t.css(\"borderTopWidth\"),t.css(\"borderRightWidth\"),t.css(\"borderBottomWidth\"),t.css(\"borderLeftWidth\")],r=[t.css(\"paddingTop\"),t.css(\"paddingRight\"),t.css(\"paddingBottom\"),t.css(\"paddingLeft\")];4>e;e++)i[e]=parseFloat(n[e])||0,i[e]+=parseFloat(r[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t(\"<div style='overflow:hidden;'></div>\"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:\"absolute\",left:this.elementOffset.left+\"px\",top:this.elementOffset.top+\"px\",zIndex:++i.zIndex}),this.helper.appendTo(\"body\").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var n=this.originalSize;return{top:this.originalPosition.top+i,height:n.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,n){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,n]))},sw:function(e,i,n){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,n]))},ne:function(e,i,n){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,n]))},nw:function(e,i,n){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,n]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),\"resize\"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add(\"resizable\",\"animate\",{stop:function(e){var i=t(this).resizable(\"instance\"),n=i.options,r=i._proportionallyResizeElements,s=r.length&&/textarea/i.test(r[0].nodeName),o=s&&i._hasScroll(r[0],\"left\")?0:i.sizeDiff.height,a=s?0:i.sizeDiff.width,l={width:i.size.width-a,height:i.size.height-o},u=parseFloat(i.element.css(\"left\"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css(\"top\"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(l,c&&u?{top:c,left:u}:{}),{duration:n.animateDuration,easing:n.animateEasing,step:function(){var n={width:parseFloat(i.element.css(\"width\")),height:parseFloat(i.element.css(\"height\")),top:parseFloat(i.element.css(\"top\")),left:parseFloat(i.element.css(\"left\"))};r&&r.length&&t(r[0]).css({width:n.width,height:n.height}),i._updateCache(n),i._propagate(\"resize\",e)}})}}),t.ui.plugin.add(\"resizable\",\"containment\",{start:function(){var e,i,n,r,s,o,a,l=t(this).resizable(\"instance\"),u=l.options,c=l.element,h=u.containment,d=h instanceof t?h.get(0):/parent/.test(h)?c.parent().get(0):h;d&&(l.containerElement=t(d),/document/.test(h)||h===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(t,n){i[t]=l._num(e.css(\"padding\"+n))}),l.containerOffset=e.offset(),l.containerPosition=e.position(),l.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},n=l.containerOffset,r=l.containerSize.height,s=l.containerSize.width,o=l._hasScroll(d,\"left\")?d.scrollWidth:s,a=l._hasScroll(d)?d.scrollHeight:r,l.parentData={element:d,left:n.left,top:n.top,width:o,height:a}))},resize:function(e){var i,n,r,s,o=t(this).resizable(\"instance\"),a=o.options,l=o.containerOffset,u=o.position,c=o._aspectRatio||e.shiftKey,h={top:0,left:0},d=o.containerElement,p=!0;d[0]!==document&&/static/.test(d.css(\"position\"))&&(h=l),u.left<(o._helper?l.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-l.left:o.position.left-h.left),c&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=a.helper?l.left:0),u.top<(o._helper?l.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-l.top:o.position.top),c&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?l.top:0),r=o.containerElement.get(0)===o.element.parent().get(0),s=/relative|absolute/.test(o.containerElement.css(\"position\")),r&&s?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-h.left:o.offset.left-l.left)),n=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-h.top:o.offset.top-l.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,c&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),n+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-n,c&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var e=t(this).resizable(\"instance\"),i=e.options,n=e.containerOffset,r=e.containerPosition,s=e.containerElement,o=t(e.helper),a=o.offset(),l=o.outerWidth()-e.sizeDiff.width,u=o.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(s.css(\"position\"))&&t(this).css({left:a.left-r.left-n.left,width:l,height:u}),e._helper&&!i.animate&&/static/.test(s.css(\"position\"))&&t(this).css({left:a.left-r.left-n.left,width:l,height:u})}}),t.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(){var e=t(this).resizable(\"instance\"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data(\"ui-resizable-alsoresize\",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css(\"left\")),top:parseFloat(e.css(\"top\"))})})},resize:function(e,i){var n=t(this).resizable(\"instance\"),r=n.options,s=n.originalSize,o=n.originalPosition,a={height:n.size.height-s.height||0,width:n.size.width-s.width||0,top:n.position.top-o.top||0,left:n.position.left-o.left||0};t(r.alsoResize).each(function(){var e=t(this),n=t(this).data(\"ui-resizable-alsoresize\"),r={},s=e.parents(i.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];t.each(s,function(t,e){var i=(n[e]||0)+(a[e]||0);i&&i>=0&&(r[e]=i||null)}),e.css(r)})},stop:function(){t(this).removeData(\"ui-resizable-alsoresize\")}}),t.ui.plugin.add(\"resizable\",\"ghost\",{start:function(){var e=t(this).resizable(\"instance\"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:\"block\",position:\"relative\",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,\"ui-resizable-ghost\"),!1!==t.uiBackCompat&&\"string\"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable(\"instance\");e.ghost&&e.ghost.css({position:\"relative\",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable(\"instance\");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add(\"resizable\",\"grid\",{resize:function(){var e,i=t(this).resizable(\"instance\"),n=i.options,r=i.size,s=i.originalSize,o=i.originalPosition,a=i.axis,l=\"number\"==typeof n.grid?[n.grid,n.grid]:n.grid,u=l[0]||1,c=l[1]||1,h=Math.round((r.width-s.width)/u)*u,d=Math.round((r.height-s.height)/c)*c,p=s.width+h,f=s.height+d,g=n.maxWidth&&p>n.maxWidth,m=n.maxHeight&&f>n.maxHeight,v=n.minWidth&&n.minWidth>p,_=n.minHeight&&n.minHeight>f;n.grid=l,v&&(p+=u),_&&(f+=c),g&&(p-=u),m&&(f-=c),/^(se|s|e)$/.test(a)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(a)?(i.size.width=p,i.size.height=f,i.position.top=o.top-d):/^(sw)$/.test(a)?(i.size.width=p,i.size.height=f,i.position.left=o.left-h):((0>=f-c||0>=p-u)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=o.top-d):(f=c-e.height,i.size.height=f,i.position.top=o.top+s.height-f),p-u>0?(i.size.width=p,i.position.left=o.left-h):(p=u-e.width,i.size.width=p,i.position.left=o.left+s.width-p))}}),t.ui.resizable,t.widget(\"ui.selectable\",t.ui.mouse,{version:\"1.12.1\",options:{appendTo:\"body\",autoRefresh:!0,distance:0,filter:\"*\",tolerance:\"touch\",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass(\"ui-selectable\"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,\"ui-selectee\"),e.selectees.each(function(){var i=t(this),n=i.offset(),r={left:n.left-e.elementPos.left,top:n.top-e.elementPos.top};t.data(this,\"selectable-item\",{element:this,$element:i,left:r.left,top:r.top,right:r.left+i.outerWidth(),bottom:r.top+i.outerHeight(),startselected:!1,selected:i.hasClass(\"ui-selected\"),selecting:i.hasClass(\"ui-selecting\"),unselecting:i.hasClass(\"ui-unselecting\")})})},this.refresh(),this._mouseInit(),this.helper=t(\"<div>\"),this._addClass(this.helper,\"ui-selectable-helper\")},_destroy:function(){this.selectees.removeData(\"selectable-item\"),this._mouseDestroy()},_mouseStart:function(e){var i=this,n=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(n.filter,this.element[0]),this._trigger(\"start\",e),t(n.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),n.autoRefresh&&this.refresh(),this.selectees.filter(\".ui-selected\").each(function(){var n=t.data(this,\"selectable-item\");n.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(n.$element,\"ui-selected\"),n.selected=!1,i._addClass(n.$element,\"ui-unselecting\"),n.unselecting=!0,i._trigger(\"unselecting\",e,{unselecting:n.element}))}),t(e.target).parents().addBack().each(function(){var n,r=t.data(this,\"selectable-item\");return r?(n=!e.metaKey&&!e.ctrlKey||!r.$element.hasClass(\"ui-selected\"),i._removeClass(r.$element,n?\"ui-unselecting\":\"ui-selected\")._addClass(r.$element,n?\"ui-selecting\":\"ui-unselecting\"),r.unselecting=!n,r.selecting=n,r.selected=n,n?i._trigger(\"selecting\",e,{selecting:r.element}):i._trigger(\"unselecting\",e,{unselecting:r.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,n=this,r=this.options,s=this.opos[0],o=this.opos[1],a=e.pageX,l=e.pageY;return s>a&&(i=a,a=s,s=i),o>l&&(i=l,l=o,o=i),this.helper.css({left:s,top:o,width:a-s,height:l-o}),this.selectees.each(function(){var i=t.data(this,\"selectable-item\"),u=!1,c={};i&&i.element!==n.element[0]&&(c.left=i.left+n.elementPos.left,c.right=i.right+n.elementPos.left,c.top=i.top+n.elementPos.top,c.bottom=i.bottom+n.elementPos.top,\"touch\"===r.tolerance?u=!(c.left>a||s>c.right||c.top>l||o>c.bottom):\"fit\"===r.tolerance&&(u=c.left>s&&a>c.right&&c.top>o&&l>c.bottom),u?(i.selected&&(n._removeClass(i.$element,\"ui-selected\"),i.selected=!1),i.unselecting&&(n._removeClass(i.$element,\"ui-unselecting\"),i.unselecting=!1),i.selecting||(n._addClass(i.$element,\"ui-selecting\"),i.selecting=!0,n._trigger(\"selecting\",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(n._removeClass(i.$element,\"ui-selecting\"),i.selecting=!1,n._addClass(i.$element,\"ui-selected\"),i.selected=!0):(n._removeClass(i.$element,\"ui-selecting\"),i.selecting=!1,i.startselected&&(n._addClass(i.$element,\"ui-unselecting\"),i.unselecting=!0),n._trigger(\"unselecting\",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(n._removeClass(i.$element,\"ui-selected\"),i.selected=!1,n._addClass(i.$element,\"ui-unselecting\"),i.unselecting=!0,n._trigger(\"unselecting\",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(\".ui-unselecting\",this.element[0]).each(function(){var n=t.data(this,\"selectable-item\");i._removeClass(n.$element,\"ui-unselecting\"),n.unselecting=!1,n.startselected=!1,i._trigger(\"unselected\",e,{unselected:n.element})}),t(\".ui-selecting\",this.element[0]).each(function(){var n=t.data(this,\"selectable-item\");i._removeClass(n.$element,\"ui-selecting\")._addClass(n.$element,\"ui-selected\"),n.selecting=!1,n.selected=!0,n.startselected=!0,i._trigger(\"selected\",e,{selected:n.element})}),this._trigger(\"stop\",e),this.helper.remove(),!1}}),t.widget(\"ui.sortable\",t.ui.mouse,{version:\"1.12.1\",widgetEventPrefix:\"sort\",ready:!1,options:{appendTo:\"parent\",axis:!1,connectWith:!1,containment:!1,cursor:\"auto\",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:\"original\",items:\"> *\",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:\"default\",tolerance:\"intersect\",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css(\"float\"))||/inline|table-cell/.test(t.css(\"display\"))},_create:function(){this.containerCache={},this._addClass(\"ui-sortable\"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),\"handle\"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(\".ui-sortable-handle\"),\"ui-sortable-handle\"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,\"ui-sortable-handle\")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+\"-item\");return this},_mouseCapture:function(e,i){var n=null,r=!1,s=this;return!this.reverting&&(!this.options.disabled&&\"static\"!==this.options.type&&(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,s.widgetName+\"-item\")===s?(n=t(this),!1):void 0}),t.data(e.target,s.widgetName+\"-item\")===s&&(n=t(e.target)),!!n&&(!(this.options.handle&&!i&&(t(this.options.handle,n).find(\"*\").addBack().each(function(){this===e.target&&(r=!0)}),!r))&&(this.currentItem=n,this._removeCurrentsFromItems(),!0))))},_mouseStart:function(e,i,n){var r,s,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css(\"position\",\"absolute\"),this.cssPosition=this.helper.css(\"position\"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&\"auto\"!==o.cursor&&(s=this.document.find(\"body\"),this.storedCursor=s.css(\"cursor\"),s.css(\"cursor\",o.cursor),this.storedStylesheet=t(\"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\").appendTo(s)),o.opacity&&(this.helper.css(\"opacity\")&&(this._storedOpacity=this.helper.css(\"opacity\")),this.helper.css(\"opacity\",o.opacity)),o.zIndex&&(this.helper.css(\"zIndex\")&&(this._storedZIndex=this.helper.css(\"zIndex\")),this.helper.css(\"zIndex\",o.zIndex)),this.scrollParent[0]!==this.document[0]&&\"HTML\"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger(\"start\",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!n)for(r=this.containers.length-1;r>=0;r--)this.containers[r]._trigger(\"activate\",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!o.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,\"ui-sortable-helper\"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,n,r,s,o=this.options,a=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo(\"absolute\"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&\"HTML\"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=a=this.scrollParent[0].scrollTop+o.scrollSpeed:e.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=a=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=a=this.scrollParent[0].scrollLeft+o.scrollSpeed:e.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=a=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(e.pageY-this.document.scrollTop()<o.scrollSensitivity?a=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(e.pageY-this.document.scrollTop())<o.scrollSensitivity&&(a=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),e.pageX-this.document.scrollLeft()<o.scrollSensitivity?a=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(e.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(a=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),!1!==a&&t.ui.ddmanager&&!o.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo(\"absolute\"),this.options.axis&&\"y\"===this.options.axis||(this.helper[0].style.left=this.position.left+\"px\"),this.options.axis&&\"x\"===this.options.axis||(this.helper[0].style.top=this.position.top+\"px\"),i=this.items.length-1;i>=0;i--)if(n=this.items[i],r=n.item[0],(s=this._intersectsWithPointer(n))&&n.instance===this.currentContainer&&r!==this.currentItem[0]&&this.placeholder[1===s?\"next\":\"prev\"]()[0]!==r&&!t.contains(this.placeholder[0],r)&&(\"semi-dynamic\"!==this.options.type||!t.contains(this.element[0],r))){if(this.direction=1===s?\"down\":\"up\",\"pointer\"!==this.options.tolerance&&!this._intersectsWithSides(n))break;this._rearrange(e,n),this._trigger(\"change\",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger(\"sort\",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var n=this,r=this.placeholder.offset(),s=this.options.axis,o={};s&&\"x\"!==s||(o.left=r.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),s&&\"y\"!==s||(o.top=r.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){n._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event(\"mouseup\",{target:null})),\"original\"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,\"ui-sortable-helper\")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger(\"deactivate\",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger(\"out\",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),\"original\"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),n=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||\"id\")||\"\").match(e.expression||/(.+)[\\-=_](.+)/);i&&n.push((e.key||i[1]+\"[]\")+\"=\"+(e.key&&e.expression?i[1]:i[2]))}),!n.length&&e.key&&n.push(e.key+\"=\"),n.join(\"&\")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),n=[];return e=e||{},i.each(function(){n.push(t(e.item||this).attr(e.attribute||\"id\")||\"\")}),n},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,n=this.positionAbs.top,r=n+this.helperProportions.height,s=t.left,o=s+t.width,a=t.top,l=a+t.height,u=this.offset.click.top,c=this.offset.click.left,h=\"x\"===this.options.axis||n+u>a&&l>n+u,d=\"y\"===this.options.axis||e+c>s&&o>e+c,p=h&&d;return\"pointer\"===this.options.tolerance||this.options.forcePointerForContainers||\"pointer\"!==this.options.tolerance&&this.helperProportions[this.floating?\"width\":\"height\"]>t[this.floating?\"width\":\"height\"]?p:e+this.helperProportions.width/2>s&&o>i-this.helperProportions.width/2&&n+this.helperProportions.height/2>a&&l>r-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,n=\"x\"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),r=\"y\"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width);return!(!n||!r)&&(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?\"right\"===i||\"down\"===e?2:1:e&&(\"down\"===e?2:1))},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),r=this._getDragHorizontalDirection();return this.floating&&r?\"right\"===r&&i||\"left\"===r&&!i:n&&(\"down\"===n&&e||\"up\"===n&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?\"down\":\"up\")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?\"right\":\"left\")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){a.push(this)}var n,r,s,o,a=[],l=[],u=this._connectWith();if(u&&e)for(n=u.length-1;n>=0;n--)for(s=t(u[n],this.document[0]),r=s.length-1;r>=0;r--)(o=t.data(s[r],this.widgetFullName))&&o!==this&&!o.options.disabled&&l.push([t.isFunction(o.options.items)?o.options.items.call(o.element):t(o.options.items,o.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"),o]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"),this]),n=l.length-1;n>=0;n--)l[n][0].each(i);return t(a)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(\":data(\"+this.widgetName+\"-item)\");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,n,r,s,o,a,l,u,c=this.items,h=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(r=t(d[i],this.document[0]),n=r.length-1;n>=0;n--)(s=t.data(r[n],this.widgetFullName))&&s!==this&&!s.options.disabled&&(h.push([t.isFunction(s.options.items)?s.options.items.call(s.element[0],e,{item:this.currentItem}):t(s.options.items,s.element),s]),this.containers.push(s));for(i=h.length-1;i>=0;i--)for(o=h[i][1],a=h[i][0],n=0,u=a.length;u>n;n++)l=t(a[n]),l.data(this.widgetName+\"-item\",o),c.push({item:l,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=!!this.items.length&&(\"x\"===this.options.axis||this._isFloating(this.items[0].item)),this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,n,r,s;for(i=this.items.length-1;i>=0;i--)n=this.items[i],n.instance!==this.currentContainer&&this.currentContainer&&n.item[0]!==this.currentItem[0]||(r=this.options.toleranceElement?t(this.options.toleranceElement,n.item):n.item,e||(n.width=r.outerWidth(),n.height=r.outerHeight()),s=r.offset(),n.left=s.left,n.top=s.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)s=this.containers[i].element.offset(),this.containers[i].containerCache.left=s.left,this.containers[i].containerCache.top=s.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,n=e.options;n.placeholder&&n.placeholder.constructor!==String||(i=n.placeholder,n.placeholder={element:function(){var n=e.currentItem[0].nodeName.toLowerCase(),r=t(\"<\"+n+\">\",e.document[0]);return e._addClass(r,\"ui-sortable-placeholder\",i||e.currentItem[0].className)._removeClass(r,\"ui-sortable-helper\"),\"tbody\"===n?e._createTrPlaceholder(e.currentItem.find(\"tr\").eq(0),t(\"<tr>\",e.document[0]).appendTo(r)):\"tr\"===n?e._createTrPlaceholder(e.currentItem,r):\"img\"===n&&r.attr(\"src\",e.currentItem.attr(\"src\")),i||r.css(\"visibility\",\"hidden\"),r},update:function(t,r){(!i||n.forcePlaceholderSize)&&(r.height()||r.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css(\"paddingTop\")||0,10)-parseInt(e.currentItem.css(\"paddingBottom\")||0,10)),r.width()||r.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css(\"paddingLeft\")||0,10)-parseInt(e.currentItem.css(\"paddingRight\")||0,10)))}}),e.placeholder=t(n.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),n.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var n=this;e.children().each(function(){t(\"<td>&#160;</td>\",n.document[0]).attr(\"colspan\",t(this).attr(\"colspan\")||1).appendTo(i)})},_contactContainers:function(e){var i,n,r,s,o,a,l,u,c,h,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger(\"out\",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger(\"over\",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(r=1e4,s=null,c=d.floating||this._isFloating(this.currentItem),o=c?\"left\":\"top\",a=c?\"width\":\"height\",h=c?\"pageX\":\"pageY\",n=this.items.length-1;n>=0;n--)t.contains(this.containers[p].element[0],this.items[n].item[0])&&this.items[n].item[0]!==this.currentItem[0]&&(l=this.items[n].item.offset()[o],u=!1,e[h]-l>this.items[n][a]/2&&(u=!0),r>Math.abs(e[h]-l)&&(r=Math.abs(e[h]-l),s=this.items[n],this.direction=u?\"up\":\"down\"));if(!s&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return void(this.currentContainer.containerCache.over||(this.containers[p]._trigger(\"over\",e,this._uiHash()),this.currentContainer.containerCache.over=1));s?this._rearrange(e,s,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger(\"change\",e,this._uiHash()),this.containers[p]._trigger(\"change\",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger(\"over\",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,n=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):\"clone\"===i.helper?this.currentItem.clone():this.currentItem;return n.parents(\"body\").length||t(\"parent\"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(n[0]),n[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css(\"position\"),top:this.currentItem.css(\"top\"),left:this.currentItem.css(\"left\")}),(!n[0].style.width||i.forceHelperSize)&&n.width(this.currentItem.width()),(!n[0].style.height||i.forceHelperSize)&&n.height(this.currentItem.height()),n},_adjustOffsetFromHelper:function(e){\"string\"==typeof e&&(e=e.split(\" \")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),\"left\"in e&&(this.offset.click.left=e.left+this.margins.left),\"right\"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),\"top\"in e&&(this.offset.click.top=e.top+this.margins.top),\"bottom\"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return\"absolute\"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&\"html\"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css(\"borderTopWidth\"),10)||0),left:e.left+(parseInt(this.offsetParent.css(\"borderLeftWidth\"),10)||0)}},_getRelativeOffset:function(){if(\"relative\"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css(\"top\"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css(\"left\"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css(\"marginLeft\"),10)||0,top:parseInt(this.currentItem.css(\"marginTop\"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,n,r=this.options;\"parent\"===r.containment&&(r.containment=this.helper[0].parentNode),(\"document\"===r.containment||\"window\"===r.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,\"document\"===r.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,(\"document\"===r.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(r.containment)||(e=t(r.containment)[0],i=t(r.containment).offset(),n=\"hidden\"!==t(e).css(\"overflow\"),this.containment=[i.left+(parseInt(t(e).css(\"borderLeftWidth\"),10)||0)+(parseInt(t(e).css(\"paddingLeft\"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css(\"borderTopWidth\"),10)||0)+(parseInt(t(e).css(\"paddingTop\"),10)||0)-this.margins.top,i.left+(n?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css(\"borderLeftWidth\"),10)||0)-(parseInt(t(e).css(\"paddingRight\"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(n?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css(\"borderTopWidth\"),10)||0)-(parseInt(t(e).css(\"paddingBottom\"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var n=\"absolute\"===e?1:-1,r=\"absolute\"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,s=/(html|body)/i.test(r[0].tagName);return{top:i.top+this.offset.relative.top*n+this.offset.parent.top*n-(\"fixed\"===this.cssPosition?-this.scrollParent.scrollTop():s?0:r.scrollTop())*n,left:i.left+this.offset.relative.left*n+this.offset.parent.left*n-(\"fixed\"===this.cssPosition?-this.scrollParent.scrollLeft():s?0:r.scrollLeft())*n}},_generatePosition:function(e){var i,n,r=this.options,s=e.pageX,o=e.pageY,a=\"absolute\"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(a[0].tagName);return\"relative\"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(s=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(s=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),r.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/r.grid[1])*r.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-r.grid[1]:i+r.grid[1]:i,n=this.originalPageX+Math.round((s-this.originalPageX)/r.grid[0])*r.grid[0],s=this.containment?n-this.offset.click.left>=this.containment[0]&&n-this.offset.click.left<=this.containment[2]?n:n-this.offset.click.left>=this.containment[0]?n-r.grid[0]:n+r.grid[0]:n)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(\"fixed\"===this.cssPosition?-this.scrollParent.scrollTop():l?0:a.scrollTop()),left:s-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(\"fixed\"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:a.scrollLeft())}},_rearrange:function(t,e,i,n){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],\"down\"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var r=this.counter;this._delay(function(){r===this.counter&&this.refreshPositions(!n)})},_clear:function(t,e){function i(t,e,i){return function(n){i._trigger(t,n,e._uiHash(e))}}this.reverting=!1;var n,r=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(n in this._storedCSS)(\"auto\"===this._storedCSS[n]||\"static\"===this._storedCSS[n])&&(this._storedCSS[n]=\"\");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,\"ui-sortable-helper\")}else this.currentItem.show();for(this.fromOutside&&!e&&r.push(function(t){this._trigger(\"receive\",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(\".ui-sortable-helper\")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||r.push(function(t){this._trigger(\"update\",t,this._uiHash())}),this!==this.currentContainer&&(e||(r.push(function(t){this._trigger(\"remove\",t,this._uiHash())}),r.push(function(t){return function(e){t._trigger(\"receive\",e,this._uiHash(this))}}.call(this,this.currentContainer)),r.push(function(t){return function(e){t._trigger(\"update\",e,this._uiHash(this))}}.call(this,this.currentContainer)))),n=this.containers.length-1;n>=0;n--)e||r.push(i(\"deactivate\",this,this.containers[n])),this.containers[n].containerCache.over&&(r.push(i(\"out\",this,this.containers[n])),this.containers[n].containerCache.over=0);if(this.storedCursor&&(this.document.find(\"body\").css(\"cursor\",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css(\"opacity\",this._storedOpacity),this._storedZIndex&&this.helper.css(\"zIndex\",\"auto\"===this._storedZIndex?\"\":this._storedZIndex),this.dragging=!1,e||this._trigger(\"beforeStop\",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(n=0;r.length>n;n++)r[n].call(this,t);this._trigger(\"stop\",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){!1===t.Widget.prototype._trigger.apply(this,arguments)&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget(\"ui.accordion\",{version:\"1.12.1\",options:{active:0,animate:{},classes:{\"ui-accordion-header\":\"ui-corner-top\",\"ui-accordion-header-collapsed\":\"ui-corner-all\",\"ui-accordion-content\":\"ui-corner-bottom\"},collapsible:!1,event:\"click\",header:\"> li > :first-child, > :not(li):even\",heightStyle:\"auto\",icons:{activeHeader:\"ui-icon-triangle-1-s\",header:\"ui-icon-triangle-1-e\"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:\"hide\",borderBottomWidth:\"hide\",paddingTop:\"hide\",paddingBottom:\"hide\",height:\"hide\"},showProps:{borderTopWidth:\"show\",borderBottomWidth:\"show\",paddingTop:\"show\",paddingBottom:\"show\",height:\"show\"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass(\"ui-accordion\",\"ui-widget ui-helper-reset\"),this.element.attr(\"role\",\"tablist\"),e.collapsible||!1!==e.active&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,n=this.options.icons;n&&(e=t(\"<span>\"),this._addClass(e,\"ui-accordion-header-icon\",\"ui-icon \"+n.header),e.prependTo(this.headers),i=this.active.children(\".ui-accordion-header-icon\"),this._removeClass(i,n.header)._addClass(i,null,n.activeHeader)._addClass(this.headers,\"ui-accordion-icons\"))},_destroyIcons:function(){this._removeClass(this.headers,\"ui-accordion-icons\"),this.headers.children(\".ui-accordion-header-icon\").remove()},_destroy:function(){var t;this.element.removeAttr(\"role\"),this.headers.removeAttr(\"role aria-expanded aria-selected aria-controls tabIndex\").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css(\"display\",\"\").removeAttr(\"role aria-hidden aria-labelledby\").removeUniqueId(),\"content\"!==this.options.heightStyle&&t.css(\"height\",\"\")},_setOption:function(t,e){return\"active\"===t?void this._activate(e):(\"event\"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),\"collapsible\"!==t||e||!1!==this.options.active||this._activate(0),void(\"icons\"===t&&(this._destroyIcons(),e&&this._createIcons())))},_setOptionDisabled:function(t){this._super(t),this.element.attr(\"aria-disabled\",t),this._toggleClass(null,\"ui-state-disabled\",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,\"ui-state-disabled\",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,n=this.headers.length,r=this.headers.index(e.target),s=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:s=this.headers[(r+1)%n];break;case i.LEFT:case i.UP:s=this.headers[(r-1+n)%n];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:s=this.headers[0];break;case i.END:s=this.headers[n-1]}s&&(t(e.target).attr(\"tabIndex\",-1),t(s).attr(\"tabIndex\",0),t(s).trigger(\"focus\"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger(\"focus\")},refresh:function(){var e=this.options;this._processPanels(),!1===e.active&&!0===e.collapsible||!this.headers.length?(e.active=!1,this.active=t()):!1===e.active?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(\".ui-state-disabled\").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,\"ui-accordion-header ui-accordion-header-collapsed\",\"ui-state-default\"),this.panels=this.headers.next().filter(\":not(.ui-accordion-content-active)\").hide(),this._addClass(this.panels,\"ui-accordion-content\",\"ui-helper-reset ui-widget-content\"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,n=i.heightStyle,r=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,\"ui-accordion-header-active\",\"ui-state-active\")._removeClass(this.active,\"ui-accordion-header-collapsed\"),this._addClass(this.active.next(),\"ui-accordion-content-active\"),this.active.next().show(),this.headers.attr(\"role\",\"tab\").each(function(){var e=t(this),i=e.uniqueId().attr(\"id\"),n=e.next(),r=n.uniqueId().attr(\"id\");e.attr(\"aria-controls\",r),n.attr(\"aria-labelledby\",i)}).next().attr(\"role\",\"tabpanel\"),this.headers.not(this.active).attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\",tabIndex:-1}).next().attr({\"aria-hidden\":\"true\"}).hide(),this.active.length?this.active.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0}).next().attr({\"aria-hidden\":\"false\"}):this.headers.eq(0).attr(\"tabIndex\",0),this._createIcons(),this._setupEvents(i.event),\"fill\"===n?(e=r.height(),this.element.siblings(\":visible\").each(function(){var i=t(this),n=i.css(\"position\");\"absolute\"!==n&&\"fixed\"!==n&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css(\"overflow\",\"auto\")):\"auto\"===n&&(e=0,this.headers.next().each(function(){var i=t(this).is(\":visible\");i||t(this).show(),e=Math.max(e,t(this).css(\"height\",\"\").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return\"number\"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:\"_keydown\"};e&&t.each(e.split(\" \"),function(t,e){i[e]=\"_eventHandler\"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:\"_panelKeyDown\"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,n,r=this.options,s=this.active,o=t(e.currentTarget),a=o[0]===s[0],l=a&&r.collapsible,u=l?t():o.next(),c=s.next(),h={oldHeader:s,oldPanel:c,newHeader:l?t():o,newPanel:u};e.preventDefault(),a&&!r.collapsible||!1===this._trigger(\"beforeActivate\",e,h)||(r.active=!l&&this.headers.index(o),this.active=a?t():o,this._toggle(h),this._removeClass(s,\"ui-accordion-header-active\",\"ui-state-active\"),r.icons&&(i=s.children(\".ui-accordion-header-icon\"),this._removeClass(i,null,r.icons.activeHeader)._addClass(i,null,r.icons.header)),a||(this._removeClass(o,\"ui-accordion-header-collapsed\")._addClass(o,\"ui-accordion-header-active\",\"ui-state-active\"),r.icons&&(n=o.children(\".ui-accordion-header-icon\"),this._removeClass(n,null,r.icons.header)._addClass(n,null,r.icons.activeHeader)),this._addClass(o.next(),\"ui-accordion-content-active\")))},_toggle:function(e){var i=e.newPanel,n=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=n,this.options.animate?this._animate(i,n,e):(n.hide(),i.show(),this._toggleComplete(e)),n.attr({\"aria-hidden\":\"true\"}),n.prev().attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\"}),i.length&&n.length?n.prev().attr({tabIndex:-1,\"aria-expanded\":\"false\"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr(\"tabIndex\"),10)}).attr(\"tabIndex\",-1),i.attr(\"aria-hidden\",\"false\").prev().attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0})},_animate:function(t,e,i){var n,r,s,o=this,a=0,l=t.css(\"box-sizing\"),u=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},h=u&&c.down||c,d=function(){o._toggleComplete(i)};return\"number\"==typeof h&&(s=h),\"string\"==typeof h&&(r=h),r=r||h.easing||c.easing,s=s||h.duration||c.duration,e.length?t.length?(n=t.show().outerHeight(),e.animate(this.hideProps,{duration:s,easing:r,step:function(t,e){e.now=Math.round(t)}}),void t.hide().animate(this.showProps,{duration:s,easing:r,complete:d,step:function(t,i){i.now=Math.round(t),\"height\"!==i.prop?\"content-box\"===l&&(a+=i.now):\"content\"!==o.options.heightStyle&&(i.now=Math.round(n-e.outerHeight()-a),a=0)}})):e.animate(this.hideProps,s,r,d):t.animate(this.showProps,s,r,d)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,\"ui-accordion-content-active\"),this._removeClass(i,\"ui-accordion-header-active\")._addClass(i,\"ui-accordion-header-collapsed\"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger(\"activate\",null,t)}}),t.widget(\"ui.menu\",{version:\"1.12.1\",defaultElement:\"<ul>\",delay:300,options:{icons:{submenu:\"ui-icon-caret-1-e\"},items:\"> *\",menus:\"ul\",position:{my:\"left top\",at:\"right top\"},role:\"menu\",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass(\"ui-menu\",\"ui-widget ui-widget-content\"),this._on({\"mousedown .ui-menu-item\":function(t){t.preventDefault()},\"click .ui-menu-item\":function(e){var i=t(e.target),n=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(\".ui-state-disabled\").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(\".ui-menu\").length?this.expand(e):!this.element.is(\":focus\")&&n.closest(\".ui-menu\").length&&(this.element.trigger(\"focus\",[!0]),this.active&&1===this.active.parents(\".ui-menu\").length&&clearTimeout(this.timer)))},\"mouseenter .ui-menu-item\":function(e){if(!this.previousFilter){var i=t(e.target).closest(\".ui-menu-item\"),n=t(e.currentTarget);i[0]===n[0]&&(this._removeClass(n.siblings().children(\".ui-state-active\"),null,\"ui-state-active\"),this.focus(e,n))}},mouseleave:\"collapseAll\",\"mouseleave .ui-menu\":\"collapseAll\",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]))&&this.collapseAll(e)})},keydown:\"_keydown\"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(\".ui-menu-item\").removeAttr(\"role aria-disabled\"),i=e.children(\".ui-menu-item-wrapper\").removeUniqueId().removeAttr(\"tabIndex role aria-haspopup\");this.element.removeAttr(\"aria-activedescendant\").find(\".ui-menu\").addBack().removeAttr(\"role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex\").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data(\"ui-menu-submenu-caret\")&&e.remove()})},_keydown:function(e){var i,n,r,s,o=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move(\"first\",\"first\",e);break;case t.ui.keyCode.END:this._move(\"last\",\"last\",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(\".ui-state-disabled\")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:o=!1,n=this.previousFilter||\"\",s=!1,r=e.keyCode>=96&&105>=e.keyCode?\"\"+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),r===n?s=!0:r=n+r,i=this._filterMenuItems(r),i=s&&-1!==i.index(this.active.next())?this.active.nextAll(\".ui-menu-item\"):i,i.length||(r=String.fromCharCode(e.keyCode),i=this._filterMenuItems(r)),i.length?(this.focus(e,i),this.previousFilter=r,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(\".ui-state-disabled\")&&(this.active.children(\"[aria-haspopup='true']\").length?this.expand(t):this.select(t))},refresh:function(){var e,i,n,r,s,o=this,a=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass(\"ui-menu-icons\",null,!!this.element.find(\".ui-icon\").length),n=l.filter(\":not(.ui-menu)\").hide().attr({role:this.options.role,\"aria-hidden\":\"true\",\"aria-expanded\":\"false\"}).each(function(){var e=t(this),i=e.prev(),n=t(\"<span>\").data(\"ui-menu-submenu-caret\",!0);o._addClass(n,\"ui-menu-icon\",\"ui-icon \"+a),i.attr(\"aria-haspopup\",\"true\").prepend(n),e.attr(\"aria-labelledby\",i.attr(\"id\"))}),this._addClass(n,\"ui-menu\",\"ui-widget ui-widget-content ui-front\"),e=l.add(this.element),i=e.find(this.options.items),i.not(\".ui-menu-item\").each(function(){var e=t(this);o._isDivider(e)&&o._addClass(e,\"ui-menu-divider\",\"ui-widget-content\")}),r=i.not(\".ui-menu-item, .ui-menu-divider\"),s=r.children().not(\".ui-menu\").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(r,\"ui-menu-item\")._addClass(s,\"ui-menu-item-wrapper\"),i.filter(\".ui-state-disabled\").attr(\"aria-disabled\",\"true\"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:\"menuitem\",listbox:\"option\"}[this.options.role]},_setOption:function(t,e){if(\"icons\"===t){var i=this.element.find(\".ui-menu-icon\");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr(\"aria-disabled\",t+\"\"),this._toggleClass(null,\"ui-state-disabled\",!!t)},focus:function(t,e){var i,n,r;this.blur(t,t&&\"focus\"===t.type),this._scrollIntoView(e),this.active=e.first(),n=this.active.children(\".ui-menu-item-wrapper\"),this._addClass(n,null,\"ui-state-active\"),this.options.role&&this.element.attr(\"aria-activedescendant\",n.attr(\"id\")),r=this.active.parent().closest(\".ui-menu-item\").children(\".ui-menu-item-wrapper\"),this._addClass(r,null,\"ui-state-active\"),t&&\"keydown\"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(\".ui-menu\"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger(\"focus\",t,{item:e})},_scrollIntoView:function(e){var i,n,r,s,o,a;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],\"borderTopWidth\"))||0,n=parseFloat(t.css(this.activeMenu[0],\"paddingTop\"))||0,r=e.offset().top-this.activeMenu.offset().top-i-n,s=this.activeMenu.scrollTop(),o=this.activeMenu.height(),a=e.outerHeight(),0>r?this.activeMenu.scrollTop(s+r):r+a>o&&this.activeMenu.scrollTop(s+r-o+a))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(\".ui-menu-item-wrapper\"),null,\"ui-state-active\"),this._trigger(\"blur\",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),\"true\"===t.attr(\"aria-hidden\")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(\".ui-menu\").not(e.parents(\".ui-menu\")).hide().attr(\"aria-hidden\",\"true\"),e.show().removeAttr(\"aria-hidden\").attr(\"aria-expanded\",\"true\").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var n=i?this.element:t(e&&e.target).closest(this.element.find(\".ui-menu\"));n.length||(n=this.element),this._close(n),this.blur(e),this._removeClass(n.find(\".ui-state-active\"),null,\"ui-state-active\"),this.activeMenu=n},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(\".ui-menu\").hide().attr(\"aria-hidden\",\"true\").attr(\"aria-expanded\",\"false\")},_closeOnDocumentClick:function(e){return!t(e.target).closest(\".ui-menu\").length},_isDivider:function(t){return!/[^\\-\\u2014\\u2013\\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(\".ui-menu-item\",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(\".ui-menu \").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move(\"next\",\"first\",t)},previous:function(t){this._move(\"prev\",\"last\",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(\".ui-menu-item\").length},isLastItem:function(){return this.active&&!this.active.nextAll(\".ui-menu-item\").length},_move:function(t,e,i){var n;this.active&&(n=\"first\"===t||\"last\"===t?this.active[\"first\"===t?\"prevAll\":\"nextAll\"](\".ui-menu-item\").eq(-1):this.active[t+\"All\"](\".ui-menu-item\").eq(0)),n&&n.length&&this.active||(n=this.activeMenu.find(this.options.items)[e]()),this.focus(i,n)},nextPage:function(e){var i,n,r;return this.active?void(this.isLastItem()||(this._hasScroll()?(n=this.active.offset().top,r=this.element.height(),this.active.nextAll(\".ui-menu-item\").each(function(){return i=t(this),0>i.offset().top-n-r}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?\"last\":\"first\"]()))):void this.next(e)},previousPage:function(e){var i,n,r;return this.active?void(this.isFirstItem()||(this._hasScroll()?(n=this.active.offset().top,r=this.element.height(),this.active.prevAll(\".ui-menu-item\").each(function(){return i=t(this),i.offset().top-n+r>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first()))):void this.next(e)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop(\"scrollHeight\")},select:function(e){this.active=this.active||t(e.target).closest(\".ui-menu-item\");var i={item:this.active};this.active.has(\".ui-menu\").length||this.collapseAll(e,!0),this._trigger(\"select\",e,i)},_filterMenuItems:function(e){var i=e.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\"),n=RegExp(\"^\"+i,\"i\");return this.activeMenu.find(this.options.items).filter(\".ui-menu-item\").filter(function(){return n.test(t.trim(t(this).children(\".ui-menu-item-wrapper\").text()))})}}),t.widget(\"ui.autocomplete\",{version:\"1.12.1\",defaultElement:\"<input>\",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,n,r=this.element[0].nodeName.toLowerCase(),s=\"textarea\"===r,o=\"input\"===r;this.isMultiLine=s||!o&&this._isContentEditable(this.element),this.valueMethod=this.element[s||o?\"val\":\"text\"],this.isNewMenu=!0,this._addClass(\"ui-autocomplete-input\"),this.element.attr(\"autocomplete\",\"off\"),this._on(this.element,{keydown:function(r){if(this.element.prop(\"readOnly\"))return e=!0,n=!0,void(i=!0);e=!1,n=!1,i=!1;var s=t.ui.keyCode;switch(r.keyCode){case s.PAGE_UP:e=!0,this._move(\"previousPage\",r);break;case s.PAGE_DOWN:e=!0,this._move(\"nextPage\",r);break;case s.UP:e=!0,this._keyEvent(\"previous\",r);break;case s.DOWN:e=!0,this._keyEvent(\"next\",r);break;case s.ENTER:this.menu.active&&(e=!0,r.preventDefault(),this.menu.select(r));break;case s.TAB:this.menu.active&&this.menu.select(r);break;case s.ESCAPE:this.menu.element.is(\":visible\")&&(this.isMultiLine||this._value(this.term),this.close(r),r.preventDefault());break;default:i=!0,this._searchTimeout(r)}},keypress:function(n){if(e)return e=!1,void((!this.isMultiLine||this.menu.element.is(\":visible\"))&&n.preventDefault());if(!i){var r=t.ui.keyCode;switch(n.keyCode){case r.PAGE_UP:this._move(\"previousPage\",n);break;case r.PAGE_DOWN:this._move(\"nextPage\",n);break;case r.UP:this._keyEvent(\"previous\",n);break;case r.DOWN:this._keyEvent(\"next\",n)}}},input:function(t){return n?(n=!1,void t.preventDefault()):void this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?void delete this.cancelBlur:(clearTimeout(this.searching),this.close(t),void this._change(t))}}),this._initSource(),this.menu=t(\"<ul>\").appendTo(this._appendTo()).menu({role:null}).hide().menu(\"instance\"),this._addClass(this.menu.element,\"ui-autocomplete\",\"ui-front\"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger(\"focus\")})},menufocus:function(e,i){var n,r;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),void this.document.one(\"mousemove\",function(){t(e.target).trigger(e.originalEvent)})):(r=i.item.data(\"ui-autocomplete-item\"),!1!==this._trigger(\"focus\",e,{item:r})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(r.value),void((n=i.item.attr(\"aria-label\")||r.value)&&t.trim(n).length&&(this.liveRegion.children().hide(),t(\"<div>\").text(n).appendTo(this.liveRegion))))},menuselect:function(e,i){var n=i.item.data(\"ui-autocomplete-item\"),r=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger(\"focus\"),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger(\"select\",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=t(\"<div>\",{role:\"status\",\"aria-live\":\"assertive\",\"aria-relevant\":\"additions\"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,\"ui-helper-hidden-accessible\"),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr(\"autocomplete\"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),\"source\"===t&&this._initSource(),\"appendTo\"===t&&this.menu.element.appendTo(this._appendTo()),\"disabled\"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(\".ui-front, dialog\")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,n=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,n){n(t.ui.autocomplete.filter(e,i.term))}):\"string\"==typeof this.options.source?(i=this.options.source,this.source=function(e,r){n.xhr&&n.xhr.abort(),n.xhr=t.ajax({url:i,data:e,dataType:\"json\",success:function(t){r(t)},error:function(){r([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(\":visible\"),n=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!n)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):!1!==this._trigger(\"search\",e)?this._search(t):void 0},_search:function(t){this.pending++,this._addClass(\"ui-autocomplete-loading\"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return t.proxy(function(t){e===this.requestIndex&&this.__response(t),--this.pending||this._removeClass(\"ui-autocomplete-loading\")},this)},__response:function(t){t&&(t=this._normalize(t)),this._trigger(\"response\",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger(\"open\")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,\"mousedown\"),this.menu.element.is(\":visible\")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger(\"close\",t))},_change:function(t){this.previous!==this._value()&&this._trigger(\"change\",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return\"string\"==typeof e?{label:e,value:e}:t.extend({},e,{label:e.label||e.value,value:e.value||e.label})})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:\"_closeOnClickOutside\"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width(\"\").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var n=this;t.each(i,function(t,i){n._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data(\"ui-autocomplete-item\",e)},_renderItem:function(e,i){return t(\"<li>\").append(t(\"<div>\").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(\":visible\")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e):void this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(\":visible\"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop(\"contentEditable\");return\"inherit\"===e?this._isContentEditable(t.parent()):\"true\"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")},filter:function(e,i){var n=RegExp(t.ui.autocomplete.escapeRegex(i),\"i\");return t.grep(e,function(t){return n.test(t.label||t.value||t)})}}),t.widget(\"ui.autocomplete\",t.ui.autocomplete,{options:{messages:{noResults:\"No search results.\",results:function(t){return t+(t>1?\" results are\":\" result is\")+\" available, use up and down arrow keys to navigate.\"}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t(\"<div>\").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var d=/ui-corner-([a-z]){2,6}/g;t.widget(\"ui.controlgroup\",{version:\"1.12.1\",defaultElement:\"<div>\",options:{direction:\"horizontal\",disabled:null,onlyVisible:!0,items:{button:\"input[type=button], input[type=submit], input[type=reset], button, a\",controlgroupLabel:\".ui-controlgroup-label\",checkboxradio:\"input[type='checkbox'], input[type='radio']\",selectmenu:\"select\",spinner:\".ui-spinner-input\"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr(\"role\",\"toolbar\"),this.refresh()},_destroy:function(){this._callChildMethod(\"destroy\"),this.childWidgets.removeData(\"ui-controlgroup-data\"),this.element.removeAttr(\"role\"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(\".ui-controlgroup-label-contents\").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(n,r){var s,o={};return r?\"controlgroupLabel\"===n?(s=e.element.find(r),s.each(function(){var e=t(this);e.children(\".ui-controlgroup-label-contents\").length||e.contents().wrapAll(\"<span class='ui-controlgroup-label-contents'></span>\")}),e._addClass(s,null,\"ui-widget ui-widget-content ui-state-default\"),void(i=i.concat(s.get()))):void(t.fn[n]&&(o=e[\"_\"+n+\"Options\"]?e[\"_\"+n+\"Options\"](\"middle\"):{classes:{}},e.element.find(r).each(function(){var r=t(this),s=r[n](\"instance\"),a=t.widget.extend({},o);if(\"button\"!==n||!r.parent(\".ui-spinner\").length){s||(s=r[n]()[n](\"instance\")),s&&(a.classes=e._resolveClassesValues(a.classes,s)),r[n](a);var l=r[n](\"widget\");t.data(l[0],\"ui-controlgroup-data\",s||r[n](\"instance\")),i.push(l[0])}}))):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,\"ui-controlgroup-item\")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),n=i.data(\"ui-controlgroup-data\");n&&n[e]&&n[e]()})},_updateCornerClass:function(t,e){var i=this._buildSimpleOptions(e,\"label\").classes.label;this._removeClass(t,null,\"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all\"),this._addClass(t,null,i)},_buildSimpleOptions:function(t,e){var i=\"vertical\"===this.options.direction,n={classes:{}};return n.classes[e]={middle:\"\",first:\"ui-corner-\"+(i?\"top\":\"left\"),last:\"ui-corner-\"+(i?\"bottom\":\"right\"),only:\"ui-corner-all\"}[t],n},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,\"ui-spinner\");return e.classes[\"ui-spinner-up\"]=\"\",e.classes[\"ui-spinner-down\"]=\"\",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,\"ui-button\")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,\"ui-checkboxradio-label\")},_selectmenuOptions:function(t){var e=\"vertical\"===this.options.direction;return{width:!!e&&\"auto\",classes:{middle:{\"ui-selectmenu-button-open\":\"\",\"ui-selectmenu-button-closed\":\"\"},first:{\"ui-selectmenu-button-open\":\"ui-corner-\"+(e?\"top\":\"tl\"),\"ui-selectmenu-button-closed\":\"ui-corner-\"+(e?\"top\":\"left\")},last:{\"ui-selectmenu-button-open\":e?\"\":\"ui-corner-tr\",\"ui-selectmenu-button-closed\":\"ui-corner-\"+(e?\"bottom\":\"right\")},only:{\"ui-selectmenu-button-open\":\"ui-corner-top\",\"ui-selectmenu-button-closed\":\"ui-corner-all\"}}[t]}},_resolveClassesValues:function(e,i){var n={};return t.each(e,function(r){var s=i.options.classes[r]||\"\";s=t.trim(s.replace(d,\"\")),n[r]=(s+\" \"+e[r]).replace(/\\s+/g,\" \")}),n},_setOption:function(t,e){return\"direction\"===t&&this._removeClass(\"ui-controlgroup-\"+this.options.direction),this._super(t,e),\"disabled\"===t?void this._callChildMethod(e?\"disable\":\"enable\"):void this.refresh()},refresh:function(){var e,i=this;this._addClass(\"ui-controlgroup ui-controlgroup-\"+this.options.direction),\"horizontal\"===this.options.direction&&this._addClass(null,\"ui-helper-clearfix\"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(\":visible\")),e.length&&(t.each([\"first\",\"last\"],function(t,n){var r=e[n]().data(\"ui-controlgroup-data\");if(r&&i[\"_\"+r.widgetName+\"Options\"]){var s=i[\"_\"+r.widgetName+\"Options\"](1===e.length?\"only\":n);s.classes=i._resolveClassesValues(s.classes,r),r.element[r.widgetName](s)}else i._updateCornerClass(e[n](),n)}),this._callChildMethod(\"refresh\"))}}),t.widget(\"ui.checkboxradio\",[t.ui.formResetMixin,{version:\"1.12.1\",options:{disabled:null,label:null,icon:!0,classes:{\"ui-checkboxradio-label\":\"ui-corner-all\",\"ui-checkboxradio-icon\":\"ui-corner-all\"}},_getCreateOptions:function(){var e,i,n=this,r=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error(\"No label found for checkboxradio widget\"),this.originalLabel=\"\",this.label.contents().not(this.element[0]).each(function(){n.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(r.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(r.disabled=e),r},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption(\"disabled\",this.options.disabled),this._addClass(\"ui-checkboxradio\",\"ui-helper-hidden-accessible\"),this._addClass(this.label,\"ui-checkboxradio-label\",\"ui-button ui-widget\"),\"radio\"===this.type&&this._addClass(this.label,\"ui-checkboxradio-radio-label\"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,\"ui-checkboxradio-checked\",\"ui-state-active\"),this.icon&&this._addClass(this.icon,null,\"ui-state-hover\")),this._on({change:\"_toggleClasses\",focus:function(){this._addClass(this.label,null,\"ui-state-focus ui-visual-focus\")},blur:function(){this._removeClass(this.label,null,\"ui-state-focus ui-visual-focus\")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,\"input\"===e&&/radio|checkbox/.test(this.type)||t.error(\"Can't create checkboxradio on element.nodeName=\"+e+\" and element.type=\"+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,n=\"input[name='\"+t.ui.escapeSelector(i)+\"']\";return i?(e=this.form.length?t(this.form[0].elements).filter(n):t(n).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,\"ui-checkboxradio-checked\",\"ui-state-active\",e),this.options.icon&&\"checkbox\"===this.type&&this._toggleClass(this.icon,null,\"ui-icon-check ui-state-checked\",e)._toggleClass(this.icon,null,\"ui-icon-blank\",!e),\"radio\"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio(\"instance\");e&&e._removeClass(e.label,\"ui-checkboxradio-checked\",\"ui-state-active\")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return\"label\"!==t||e?(this._super(t,e),\"disabled\"===t?(this._toggleClass(this.label,null,\"ui-state-disabled\",e),void(this.element[0].disabled=e)):void this.refresh()):void 0},_updateIcon:function(e){var i=\"ui-icon ui-icon-background \";this.options.icon?(this.icon||(this.icon=t(\"<span>\"),this.iconSpace=t(\"<span> </span>\"),this._addClass(this.iconSpace,\"ui-checkboxradio-icon-space\")),\"checkbox\"===this.type?(i+=e?\"ui-icon-check ui-state-checked\":\"ui-icon-blank\",this._removeClass(this.icon,null,e?\"ui-icon-blank\":\"ui-icon-check\")):i+=\"ui-icon-blank\",this._addClass(this.icon,\"ui-checkboxradio-icon\",i),e||this._removeClass(this.icon,null,\"ui-icon-check ui-state-checked\"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,\"ui-checkboxradio-checked\",\"ui-state-active\",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget(\"ui.button\",{version:\"1.12.1\",defaultElement:\"<button>\",options:{classes:{\"ui-button\":\"ui-corner-all\"},disabled:null,icon:null,iconPosition:\"beginning\",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is(\"input\"),t=this.element[0].disabled,null!=t&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr(\"title\"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass(\"ui-button\",\"ui-widget\"),this._setOption(\"disabled\",this.options.disabled),this._enhance(),this.element.is(\"a\")&&this._on({keyup:function(e){e.keyCode===t.ui.keyCode.SPACE&&(e.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger(\"click\"))}})},_enhance:function(){this.element.is(\"button\")||this.element.attr(\"role\",\"button\"),this.options.icon&&(this._updateIcon(\"icon\",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr(\"title\"),this.options.showLabel||this.title||this.element.attr(\"title\",this.options.label)},_updateIcon:function(e,i){var n=\"iconPosition\"!==e,r=n?this.options.iconPosition:i,s=\"top\"===r||\"bottom\"===r;this.icon?n&&this._removeClass(this.icon,null,this.options.icon):(this.icon=t(\"<span>\"),this._addClass(this.icon,\"ui-button-icon\",\"ui-icon\"),this.options.showLabel||this._addClass(\"ui-button-icon-only\")),n&&this._addClass(this.icon,null,i),this._attachIcon(r),s?(this._addClass(this.icon,null,\"ui-widget-icon-block\"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=t(\"<span> </span>\"),this._addClass(this.iconSpace,\"ui-button-icon-space\")),this._removeClass(this.icon,null,\"ui-wiget-icon-block\"),this._attachIconSpace(r))},_destroy:function(){this.element.removeAttr(\"role\"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr(\"title\")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?\"before\":\"after\"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?\"append\":\"prepend\"](this.icon)},_setOptions:function(t){var e=void 0===t.showLabel?this.options.showLabel:t.showLabel,i=void 0===t.icon?this.options.icon:t.icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){\"icon\"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),\"iconPosition\"===t&&this._updateIcon(t,e),\"showLabel\"===t&&(this._toggleClass(\"ui-button-icon-only\",null,!e),this._updateTooltip()),\"label\"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),\"disabled\"===t&&(this._toggleClass(null,\"ui-state-disabled\",e),this.element[0].disabled=e,e&&this.element.blur())},refresh:function(){var t=this.element.is(\"input, button\")?this.element[0].disabled:this.element.hasClass(\"ui-button-disabled\");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),!1!==t.uiBackCompat&&(t.widget(\"ui.button\",t.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition=\"end\"),this._super()},_setOption:function(t,e){return\"text\"===t?void this._super(\"showLabel\",e):(\"showLabel\"===t&&(this.options.text=e),\"icon\"===t&&(this.options.icons.primary=e),\"icons\"===t&&(e.primary?(this._super(\"icon\",e.primary),this._super(\"iconPosition\",\"beginning\")):e.secondary&&(this._super(\"icon\",e.secondary),this._super(\"iconPosition\",\"end\"))),void this._superApply(arguments))}}),t.fn.button=function(e){return function(){return!this.length||this.length&&\"INPUT\"!==this[0].tagName||this.length&&\"INPUT\"===this[0].tagName&&\"checkbox\"!==this.attr(\"type\")&&\"radio\"!==this.attr(\"type\")?e.apply(this,arguments):(t.ui.checkboxradio||t.error(\"Checkboxradio widget missing\"),0===arguments.length?this.checkboxradio({icon:!1}):this.checkboxradio.apply(this,arguments))}}(t.fn.button),t.fn.buttonset=function(){return t.ui.controlgroup||t.error(\"Controlgroup widget missing\"),\"option\"===arguments[0]&&\"items\"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],\"items.button\",arguments[2]]):\"option\"===arguments[0]&&\"items\"===arguments[1]?this.controlgroup.apply(this,[arguments[0],\"items.button\"]):(\"object\"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))}),t.ui.button,t.extend(t.ui,{datepicker:{version:\"1.12.1\"}});var p;t.extend(n.prototype,{markerClassName:\"hasDatepicker\",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return o(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var n,r,s;n=e.nodeName.toLowerCase(),r=\"div\"===n||\"span\"===n,e.id||(this.uuid+=1,e.id=\"dp\"+this.uuid),s=this._newInst(t(e),r),s.settings=t.extend({},i||{}),\"input\"===n?this._connectDatepicker(e,s):r&&this._inlineDatepicker(e,s)},_newInst:function(e,i){return{id:e[0].id.replace(/([^A-Za-z0-9_\\-])/g,\"\\\\\\\\$1\"),input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?r(t(\"<div class='\"+this._inlineClass+\" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\")):this.dpDiv}},_connectDatepicker:function(e,i){var n=t(e);i.append=t([]),i.trigger=t([]),n.hasClass(this.markerClassName)||(this._attachments(n,i),n.addClass(this.markerClassName).on(\"keydown\",this._doKeyDown).on(\"keypress\",this._doKeyPress).on(\"keyup\",this._doKeyUp),this._autoSize(i),t.data(e,\"datepicker\",i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var n,r,s,o=this._get(i,\"appendText\"),a=this._get(i,\"isRTL\");i.append&&i.append.remove(),o&&(i.append=t(\"<span class='\"+this._appendClass+\"'>\"+o+\"</span>\"),e[a?\"before\":\"after\"](i.append)),e.off(\"focus\",this._showDatepicker),i.trigger&&i.trigger.remove(),n=this._get(i,\"showOn\"),(\"focus\"===n||\"both\"===n)&&e.on(\"focus\",this._showDatepicker),(\"button\"===n||\"both\"===n)&&(r=this._get(i,\"buttonText\"),s=this._get(i,\"buttonImage\"),i.trigger=t(this._get(i,\"buttonImageOnly\")?t(\"<img/>\").addClass(this._triggerClass).attr({src:s,alt:r,title:r}):t(\"<button type='button'></button>\").addClass(this._triggerClass).html(s?t(\"<img/>\").attr({src:s,alt:r,title:r}):r)),e[a?\"before\":\"after\"](i.trigger),i.trigger.on(\"click\",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,\"autoSize\")&&!t.inline){var e,i,n,r,s=new Date(2009,11,20),o=this._get(t,\"dateFormat\");o.match(/[DM]/)&&(e=function(t){for(i=0,n=0,r=0;t.length>r;r++)t[r].length>i&&(i=t[r].length,n=r);return n},s.setMonth(e(this._get(t,o.match(/MM/)?\"monthNames\":\"monthNamesShort\"))),s.setDate(e(this._get(t,o.match(/DD/)?\"dayNames\":\"dayNamesShort\"))+20-s.getDay())),t.input.attr(\"size\",this._formatDate(t,s).length)}},_inlineDatepicker:function(e,i){var n=t(e);n.hasClass(this.markerClassName)||(n.addClass(this.markerClassName).append(i.dpDiv),t.data(e,\"datepicker\",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css(\"display\",\"block\"))},_dialogDatepicker:function(e,i,n,r,s){var a,l,u,c,h,d=this._dialogInst;return d||(this.uuid+=1,a=\"dp\"+this.uuid,this._dialogInput=t(\"<input type='text' id='\"+a+\"' style='position: absolute; top: -100px; width: 0px;'/>\"),this._dialogInput.on(\"keydown\",this._doKeyDown),t(\"body\").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],\"datepicker\",d)),o(d.settings,r||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=s?s.length?s:[s.pageX,s.pageY]:null,this._pos||(l=document.documentElement.clientWidth,u=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,h=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+c,u/2-150+h]),this._dialogInput.css(\"left\",this._pos[0]+20+\"px\").css(\"top\",this._pos[1]+\"px\"),d.settings.onSelect=n,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],\"datepicker\",d),this},_destroyDatepicker:function(e){var i,n=t(e),r=t.data(e,\"datepicker\");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,\"datepicker\"),\"input\"===i?(r.append.remove(),r.trigger.remove(),n.removeClass(this.markerClassName).off(\"focus\",this._showDatepicker).off(\"keydown\",this._doKeyDown).off(\"keypress\",this._doKeyPress).off(\"keyup\",this._doKeyUp)):(\"div\"===i||\"span\"===i)&&n.removeClass(this.markerClassName).empty(),p===r&&(p=null))},_enableDatepicker:function(e){var i,n,r=t(e),s=t.data(e,\"datepicker\");r.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),\"input\"===i?(e.disabled=!1,s.trigger.filter(\"button\").each(function(){this.disabled=!1}).end().filter(\"img\").css({opacity:\"1.0\",cursor:\"\"})):(\"div\"===i||\"span\"===i)&&(n=r.children(\".\"+this._inlineClass),n.children().removeClass(\"ui-state-disabled\"),n.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,n,r=t(e),s=t.data(e,\"datepicker\");r.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),\"input\"===i?(e.disabled=!0,s.trigger.filter(\"button\").each(function(){this.disabled=!0}).end().filter(\"img\").css({opacity:\"0.5\",cursor:\"default\"})):(\"div\"===i||\"span\"===i)&&(n=r.children(\".\"+this._inlineClass),n.children().addClass(\"ui-state-disabled\"),n.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,\"datepicker\")}catch(t){throw\"Missing instance data for this datepicker\"}},_optionDatepicker:function(e,i,n){var r,s,a,l,u=this._getInst(e);return 2===arguments.length&&\"string\"==typeof i?\"defaults\"===i?t.extend({},t.datepicker._defaults):u?\"all\"===i?t.extend({},u.settings):this._get(u,i):null:(r=i||{},\"string\"==typeof i&&(r={},r[i]=n),void(u&&(this._curInst===u&&this._hideDatepicker(),s=this._getDateDatepicker(e,!0),a=this._getMinMaxDate(u,\"min\"),l=this._getMinMaxDate(u,\"max\"),o(u.settings,r),null!==a&&void 0!==r.dateFormat&&void 0===r.minDate&&(u.settings.minDate=this._formatDate(u,a)),null!==l&&void 0!==r.dateFormat&&void 0===r.maxDate&&(u.settings.maxDate=this._formatDate(u,l)),\"disabled\"in r&&(r.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),u),this._autoSize(u),this._setDate(u,s),this._updateAlternate(u),this._updateDatepicker(u))))},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,n,r,s=t.datepicker._getInst(e.target),o=!0,a=s.dpDiv.is(\".ui-datepicker-rtl\");if(s._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),o=!1;break;case 13:return r=t(\"td.\"+t.datepicker._dayOverClass+\":not(.\"+t.datepicker._currentClass+\")\",s.dpDiv),r[0]&&t.datepicker._selectDay(e.target,s.selectedMonth,s.selectedYear,r[0]),i=t.datepicker._get(s,\"onSelect\"),i?(n=t.datepicker._formatDate(s),i.apply(s.input?s.input[0]:null,[n,s])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(s,\"stepBigMonths\"):-t.datepicker._get(s,\"stepMonths\"),\"M\");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(s,\"stepBigMonths\"):+t.datepicker._get(s,\"stepMonths\"),\"M\");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),o=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),o=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,a?1:-1,\"D\"),o=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(s,\"stepBigMonths\"):-t.datepicker._get(s,\"stepMonths\"),\"M\");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,\"D\"),o=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,a?-1:1,\"D\"),o=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(s,\"stepBigMonths\"):+t.datepicker._get(s,\"stepMonths\"),\"M\");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,\"D\"),o=e.ctrlKey||e.metaKey;break;default:o=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):o=!1;o&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,n,r=t.datepicker._getInst(e.target);return t.datepicker._get(r,\"constrainInput\")?(i=t.datepicker._possibleChars(t.datepicker._get(r,\"dateFormat\")),n=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||\" \">n||!i||i.indexOf(n)>-1):void 0},_doKeyUp:function(e){var i=t.datepicker._getInst(e.target);if(i.input.val()!==i.lastVal)try{t.datepicker.parseDate(t.datepicker._get(i,\"dateFormat\"),i.input?i.input.val():null,t.datepicker._getFormatConfig(i))&&(t.datepicker._setDateFromField(i),t.datepicker._updateAlternate(i),t.datepicker._updateDatepicker(i))}catch(t){}return!0},_showDatepicker:function(e){if(e=e.target||e,\"input\"!==e.nodeName.toLowerCase()&&(e=t(\"input\",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var n,r,s,a,l,u,c;n=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==n&&(t.datepicker._curInst.dpDiv.stop(!0,!0),n&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),r=t.datepicker._get(n,\"beforeShow\"),!1!==(s=r?r.apply(e,[e,n]):{})&&(o(n.settings,s),n.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(n),t.datepicker._inDialog&&(e.value=\"\"),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),a=!1,t(e).parents().each(function(){return!(a|=\"fixed\"===t(this).css(\"position\"))}),l={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,n.dpDiv.empty(),n.dpDiv.css({position:\"absolute\",display:\"block\",top:\"-1000px\"}),t.datepicker._updateDatepicker(n),l=t.datepicker._checkOffset(n,l,a),n.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?\"static\":a?\"fixed\":\"absolute\",display:\"none\",left:l.left+\"px\",top:l.top+\"px\"}),n.inline||(u=t.datepicker._get(n,\"showAnim\"),c=t.datepicker._get(n,\"duration\"),n.dpDiv.css(\"z-index\",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[u]?n.dpDiv.show(u,t.datepicker._get(n,\"showOptions\"),c):n.dpDiv[u||\"show\"](u?c:null),t.datepicker._shouldFocusInput(n)&&n.input.trigger(\"focus\"),t.datepicker._curInst=n))}},_updateDatepicker:function(e){this.maxRows=4,p=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,n=this._getNumberOfMonths(e),r=n[1],o=e.dpDiv.find(\".\"+this._dayOverClass+\" a\");o.length>0&&s.apply(o.get(0)),e.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\"),r>1&&e.dpDiv.addClass(\"ui-datepicker-multi-\"+r).css(\"width\",17*r+\"em\"),e.dpDiv[(1!==n[0]||1!==n[1]?\"add\":\"remove\")+\"Class\"](\"ui-datepicker-multi\"),e.dpDiv[(this._get(e,\"isRTL\")?\"add\":\"remove\")+\"Class\"](\"ui-datepicker-rtl\"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger(\"focus\"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find(\"select.ui-datepicker-year:first\").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(\":visible\")&&!t.input.is(\":disabled\")&&!t.input.is(\":focus\")},_checkOffset:function(e,i,n){var r=e.dpDiv.outerWidth(),s=e.dpDiv.outerHeight(),o=e.input?e.input.outerWidth():0,a=e.input?e.input.outerHeight():0,l=document.documentElement.clientWidth+(n?0:t(document).scrollLeft()),u=document.documentElement.clientHeight+(n?0:t(document).scrollTop());return i.left-=this._get(e,\"isRTL\")?r-o:0,i.left-=n&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=n&&i.top===e.input.offset().top+a?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+r>l&&l>r?Math.abs(i.left+r-l):0),i.top-=Math.min(i.top,i.top+s>u&&u>s?Math.abs(s+a):0),i},_findPos:function(e){for(var i,n=this._getInst(e),r=this._get(n,\"isRTL\");e&&(\"hidden\"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[r?\"previousSibling\":\"nextSibling\"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,n,r,s,o=this._curInst;!o||e&&o!==t.data(e,\"datepicker\")||this._datepickerShowing&&(i=this._get(o,\"showAnim\"),n=this._get(o,\"duration\"),r=function(){t.datepicker._tidyDialog(o)},t.effects&&(t.effects.effect[i]||t.effects[i])?o.dpDiv.hide(i,t.datepicker._get(o,\"showOptions\"),n,r):o.dpDiv[\"slideDown\"===i?\"slideUp\":\"fadeIn\"===i?\"fadeOut\":\"hide\"](i?n:null,r),i||r(),this._datepickerShowing=!1,s=this._get(o,\"onClose\"),s&&s.apply(o.input?o.input[0]:null,[o.input?o.input.val():\"\",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:\"absolute\",left:\"0\",top:\"-100px\"}),t.blockUI&&(t.unblockUI(),t(\"body\").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(\".ui-datepicker-calendar\")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),n=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents(\"#\"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest(\".\"+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==n)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,n){var r=t(e),s=this._getInst(r[0]);this._isDisabledDatepicker(r[0])||(this._adjustInstDate(s,i+(\"M\"===n?this._get(s,\"showCurrentAtPos\"):0),n),this._updateDatepicker(s))},_gotoToday:function(e){var i,n=t(e),r=this._getInst(n[0]);this._get(r,\"gotoCurrent\")&&r.currentDay?(r.selectedDay=r.currentDay,r.drawMonth=r.selectedMonth=r.currentMonth,r.drawYear=r.selectedYear=r.currentYear):(i=new Date,r.selectedDay=i.getDate(),r.drawMonth=r.selectedMonth=i.getMonth(),r.drawYear=r.selectedYear=i.getFullYear()),this._notifyChange(r),this._adjustDate(n)},_selectMonthYear:function(e,i,n){var r=t(e),s=this._getInst(r[0]);s[\"selected\"+(\"M\"===n?\"Month\":\"Year\")]=s[\"draw\"+(\"M\"===n?\"Month\":\"Year\")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(s),this._adjustDate(r)},_selectDay:function(e,i,n,r){var s,o=t(e);t(r).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(s=this._getInst(o[0]),s.selectedDay=s.currentDay=t(\"a\",r).html(),s.selectedMonth=s.currentMonth=i,s.selectedYear=s.currentYear=n,this._selectDate(e,this._formatDate(s,s.currentDay,s.currentMonth,s.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,\"\")},_selectDate:function(e,i){var n,r=t(e),s=this._getInst(r[0]);i=null!=i?i:this._formatDate(s),s.input&&s.input.val(i),this._updateAlternate(s),n=this._get(s,\"onSelect\"),n?n.apply(s.input?s.input[0]:null,[i,s]):s.input&&s.input.trigger(\"change\"),s.inline?this._updateDatepicker(s):(this._hideDatepicker(),this._lastInput=s.input[0],\"object\"!=typeof s.input[0]&&s.input.trigger(\"focus\"),this._lastInput=null)},_updateAlternate:function(e){var i,n,r,s=this._get(e,\"altField\");s&&(i=this._get(e,\"altFormat\")||this._get(e,\"dateFormat\"),n=this._getDate(e),r=this.formatDate(i,n,this._getFormatConfig(e)),t(s).val(r))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,\"\"]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,n){if(null==e||null==i)throw\"Invalid arguments\";if(\"\"===(i=\"object\"==typeof i?\"\"+i:i+\"\"))return null;var r,s,o,a,l=0,u=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff,c=\"string\"!=typeof u?u:(new Date).getFullYear()%100+parseInt(u,10),h=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,d=(n?n.dayNames:null)||this._defaults.dayNames,p=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,f=(n?n.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,v=-1,_=-1,y=!1,b=function(t){var i=e.length>r+1&&e.charAt(r+1)===t;return i&&r++,i},w=function(t){var e=b(t),n=\"@\"===t?14:\"!\"===t?20:\"y\"===t&&e?4:\"o\"===t?3:2,r=\"y\"===t?n:1,s=RegExp(\"^\\\\d{\"+r+\",\"+n+\"}\"),o=i.substring(l).match(s);if(!o)throw\"Missing number at position \"+l;return l+=o[0].length,parseInt(o[0],10)},x=function(e,n,r){var s=-1,o=t.map(b(e)?r:n,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(o,function(t,e){var n=e[1];return i.substr(l,n.length).toLowerCase()===n.toLowerCase()?(s=e[0],l+=n.length,!1):void 0}),-1!==s)return s+1;throw\"Unknown name at position \"+l},C=function(){if(i.charAt(l)!==e.charAt(r))throw\"Unexpected literal at position \"+l;l++};for(r=0;e.length>r;r++)if(y)\"'\"!==e.charAt(r)||b(\"'\")?C():y=!1;else switch(e.charAt(r)){case\"d\":v=w(\"d\");break;case\"D\":x(\"D\",h,d);break;case\"o\":_=w(\"o\");break;case\"m\":m=w(\"m\");break;case\"M\":m=x(\"M\",p,f);break;case\"y\":g=w(\"y\");break;case\"@\":a=new Date(w(\"@\")),g=a.getFullYear(),m=a.getMonth()+1,v=a.getDate();break;case\"!\":a=new Date((w(\"!\")-this._ticksTo1970)/1e4),g=a.getFullYear(),m=a.getMonth()+1,v=a.getDate();break;case\"'\":b(\"'\")?C():y=!0;break;default:C()}if(i.length>l&&(o=i.substr(l),!/^\\s+/.test(o)))throw\"Extra/unparsed characters found in date: \"+o;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),_>-1)for(m=1,v=_;!((s=this._getDaysInMonth(g,m-1))>=v);)m++,v-=s;if(a=this._daylightSavingAdjust(new Date(g,m-1,v)),a.getFullYear()!==g||a.getMonth()+1!==m||a.getDate()!==v)throw\"Invalid date\";return a},ATOM:\"yy-mm-dd\",COOKIE:\"D, dd M yy\",ISO_8601:\"yy-mm-dd\",RFC_822:\"D, d M y\",RFC_850:\"DD, dd-M-y\",RFC_1036:\"D, d M y\",RFC_1123:\"D, d M yy\",RFC_2822:\"D, d M yy\",RSS:\"D, d M y\",TICKS:\"!\",TIMESTAMP:\"@\",W3C:\"yy-mm-dd\",_ticksTo1970:864e9*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return\"\";var n,r=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,s=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,a=(i?i.monthNames:null)||this._defaults.monthNames,l=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},u=function(t,e,i){var n=\"\"+e;if(l(t))for(;i>n.length;)n=\"0\"+n;return n},c=function(t,e,i,n){return l(t)?n[e]:i[e]},h=\"\",d=!1;if(e)for(n=0;t.length>n;n++)if(d)\"'\"!==t.charAt(n)||l(\"'\")?h+=t.charAt(n):d=!1;else switch(t.charAt(n)){case\"d\":h+=u(\"d\",e.getDate(),2);break;case\"D\":h+=c(\"D\",e.getDay(),r,s);break;case\"o\":h+=u(\"o\",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case\"m\":h+=u(\"m\",e.getMonth()+1,2);break;case\"M\":h+=c(\"M\",e.getMonth(),o,a);break;case\"y\":h+=l(\"y\")?e.getFullYear():(10>e.getFullYear()%100?\"0\":\"\")+e.getFullYear()%100;break;case\"@\":h+=e.getTime();break;case\"!\":h+=1e4*e.getTime()+this._ticksTo1970;break;case\"'\":l(\"'\")?h+=\"'\":d=!0;break;default:h+=t.charAt(n)}return h},_possibleChars:function(t){var e,i=\"\",n=!1,r=function(i){var n=t.length>e+1&&t.charAt(e+1)===i;return n&&e++,n};for(e=0;t.length>e;e++)if(n)\"'\"!==t.charAt(e)||r(\"'\")?i+=t.charAt(e):n=!1;else switch(t.charAt(e)){case\"d\":case\"m\":case\"y\":case\"@\":i+=\"0123456789\";break;case\"D\":case\"M\":return null;case\"'\":r(\"'\")?i+=\"'\":n=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,\"dateFormat\"),n=t.lastVal=t.input?t.input.val():null,r=this._getDefaultDate(t),s=r,o=this._getFormatConfig(t);try{s=this.parseDate(i,n,o)||r}catch(t){n=e?\"\":n}t.selectedDay=s.getDate(),t.drawMonth=t.selectedMonth=s.getMonth(),t.drawYear=t.selectedYear=s.getFullYear(),t.currentDay=n?s.getDate():0,t.currentMonth=n?s.getMonth():0,t.currentYear=n?s.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,\"defaultDate\"),new Date))},_determineDate:function(e,i,n){var r=null==i||\"\"===i?n:\"string\"==typeof i?function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,\"dateFormat\"),i,t.datepicker._getFormatConfig(e))}catch(t){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,r=n.getFullYear(),s=n.getMonth(),o=n.getDate(),a=/([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,l=a.exec(i);l;){switch(l[2]||\"d\"){case\"d\":case\"D\":o+=parseInt(l[1],10);break;case\"w\":case\"W\":o+=7*parseInt(l[1],10);break;case\"m\":case\"M\":s+=parseInt(l[1],10),o=Math.min(o,t.datepicker._getDaysInMonth(r,s));break;case\"y\":case\"Y\":r+=parseInt(l[1],10),o=Math.min(o,t.datepicker._getDaysInMonth(r,s))}l=a.exec(i)}return new Date(r,s,o)}(i):\"number\"==typeof i?isNaN(i)?n:function(t){var e=new Date;return e.setDate(e.getDate()+t),e}(i):new Date(i.getTime());return r=r&&\"Invalid Date\"==\"\"+r?n:r,r&&(r.setHours(0),r.setMinutes(0),r.setSeconds(0),r.setMilliseconds(0)),this._daylightSavingAdjust(r)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var n=!e,r=t.selectedMonth,s=t.selectedYear,o=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=o.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=o.getMonth(),t.drawYear=t.selectedYear=t.currentYear=o.getFullYear(),r===t.selectedMonth&&s===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(n?\"\":this._formatDate(t))},_getDate:function(t){return!t.currentYear||t.input&&\"\"===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay))},_attachHandlers:function(e){var i=this._get(e,\"stepMonths\"),n=\"#\"+e.id.replace(/\\\\\\\\/g,\"\\\\\");e.dpDiv.find(\"[data-handler]\").map(function(){var e={prev:function(){t.datepicker._adjustDate(n,-i,\"M\")},next:function(){t.datepicker._adjustDate(n,+i,\"M\")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(n)},selectDay:function(){return t.datepicker._selectDay(n,+this.getAttribute(\"data-month\"),+this.getAttribute(\"data-year\"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(n,this,\"M\"),!1},selectYear:function(){return t.datepicker._selectMonthYear(n,this,\"Y\"),!1}};t(this).on(this.getAttribute(\"data-event\"),e[this.getAttribute(\"data-handler\")])})},_generateHTML:function(t){var e,i,n,r,s,o,a,l,u,c,h,d,p,f,g,m,v,_,y,b,w,x,C,k,T,D,S,A,E,I,$,O,P,N,M,j,H,R,L,F=new Date,z=this._daylightSavingAdjust(new Date(F.getFullYear(),F.getMonth(),F.getDate())),W=this._get(t,\"isRTL\"),q=this._get(t,\"showButtonPanel\"),B=this._get(t,\"hideIfNoPrevNext\"),U=this._get(t,\"navigationAsDateFormat\"),Y=this._getNumberOfMonths(t),V=this._get(t,\"showCurrentAtPos\"),K=this._get(t,\"stepMonths\"),X=1!==Y[0]||1!==Y[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Z=this._getMinMaxDate(t,\"min\"),J=this._getMinMaxDate(t,\"max\"),Q=t.drawMonth-V,tt=t.drawYear;if(0>Q&&(Q+=12,tt--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-Y[0]*Y[1]+1,J.getDate())),e=Z&&Z>e?Z:e;this._daylightSavingAdjust(new Date(tt,Q,1))>e;)0>--Q&&(Q=11,tt--);for(t.drawMonth=Q,t.drawYear=tt,i=this._get(t,\"prevText\"),i=U?this.formatDate(i,this._daylightSavingAdjust(new Date(tt,Q-K,1)),this._getFormatConfig(t)):i,n=this._canAdjustMonth(t,-1,tt,Q)?\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='\"+i+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(W?\"e\":\"w\")+\"'>\"+i+\"</span></a>\":B?\"\":\"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\"+i+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(W?\"e\":\"w\")+\"'>\"+i+\"</span></a>\",r=this._get(t,\"nextText\"),r=U?this.formatDate(r,this._daylightSavingAdjust(new Date(tt,Q+K,1)),this._getFormatConfig(t)):r,s=this._canAdjustMonth(t,1,tt,Q)?\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='\"+r+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(W?\"w\":\"e\")+\"'>\"+r+\"</span></a>\":B?\"\":\"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\"+r+\"'><span class='ui-icon ui-icon-circle-triangle-\"+(W?\"w\":\"e\")+\"'>\"+r+\"</span></a>\",o=this._get(t,\"currentText\"),a=this._get(t,\"gotoCurrent\")&&t.currentDay?G:z,o=U?this.formatDate(o,a,this._getFormatConfig(t)):o,l=t.inline?\"\":\"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\"+this._get(t,\"closeText\")+\"</button>\",u=q?\"<div class='ui-datepicker-buttonpane ui-widget-content'>\"+(W?l:\"\")+(this._isInRange(t,a)?\"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>\"+o+\"</button>\":\"\")+(W?\"\":l)+\"</div>\":\"\",c=parseInt(this._get(t,\"firstDay\"),10),c=isNaN(c)?0:c,h=this._get(t,\"showWeek\"),d=this._get(t,\"dayNames\"),p=this._get(t,\"dayNamesMin\"),f=this._get(t,\"monthNames\"),g=this._get(t,\"monthNamesShort\"),m=this._get(t,\"beforeShowDay\"),v=this._get(t,\"showOtherMonths\"),_=this._get(t,\"selectOtherMonths\"),y=this._getDefaultDate(t),b=\"\",x=0;Y[0]>x;x++){for(C=\"\",this.maxRows=4,k=0;Y[1]>k;k++){if(T=this._daylightSavingAdjust(new Date(tt,Q,t.selectedDay)),D=\" ui-corner-all\",S=\"\",X){if(S+=\"<div class='ui-datepicker-group\",Y[1]>1)switch(k){case 0:S+=\" ui-datepicker-group-first\",D=\" ui-corner-\"+(W?\"right\":\"left\");break;case Y[1]-1:S+=\" ui-datepicker-group-last\",D=\" ui-corner-\"+(W?\"left\":\"right\");break;default:S+=\" ui-datepicker-group-middle\",D=\"\"}S+=\"'>\"}for(S+=\"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\"+D+\"'>\"+(/all|left/.test(D)&&0===x?W?s:n:\"\")+(/all|right/.test(D)&&0===x?W?n:s:\"\")+this._generateMonthYearHeader(t,Q,tt,Z,J,x>0||k>0,f,g)+\"</div><table class='ui-datepicker-calendar'><thead><tr>\",A=h?\"<th class='ui-datepicker-week-col'>\"+this._get(t,\"weekHeader\")+\"</th>\":\"\",w=0;7>w;w++)E=(w+c)%7,A+=\"<th scope='col'\"+((w+c+6)%7>=5?\" class='ui-datepicker-week-end'\":\"\")+\"><span title='\"+d[E]+\"'>\"+p[E]+\"</span></th>\";for(S+=A+\"</tr></thead><tbody>\",I=this._getDaysInMonth(tt,Q),tt===t.selectedYear&&Q===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,I)),$=(this._getFirstDayOfMonth(tt,Q)-c+7)%7,O=Math.ceil(($+I)/7),P=X&&this.maxRows>O?this.maxRows:O,this.maxRows=P,N=this._daylightSavingAdjust(new Date(tt,Q,1-$)),M=0;P>M;M++){for(S+=\"<tr>\",j=h?\"<td class='ui-datepicker-week-col'>\"+this._get(t,\"calculateWeek\")(N)+\"</td>\":\"\",w=0;7>w;w++)H=m?m.apply(t.input?t.input[0]:null,[N]):[!0,\"\"],R=N.getMonth()!==Q,L=R&&!_||!H[0]||Z&&Z>N||J&&N>J,j+=\"<td class='\"+((w+c+6)%7>=5?\" ui-datepicker-week-end\":\"\")+(R?\" ui-datepicker-other-month\":\"\")+(N.getTime()===T.getTime()&&Q===t.selectedMonth&&t._keyEvent||y.getTime()===N.getTime()&&y.getTime()===T.getTime()?\" \"+this._dayOverClass:\"\")+(L?\" \"+this._unselectableClass+\" ui-state-disabled\":\"\")+(R&&!v?\"\":\" \"+H[1]+(N.getTime()===G.getTime()?\" \"+this._currentClass:\"\")+(N.getTime()===z.getTime()?\" ui-datepicker-today\":\"\"))+\"'\"+(R&&!v||!H[2]?\"\":\" title='\"+H[2].replace(/'/g,\"&#39;\")+\"'\")+(L?\"\":\" data-handler='selectDay' data-event='click' data-month='\"+N.getMonth()+\"' data-year='\"+N.getFullYear()+\"'\")+\">\"+(R&&!v?\"&#xa0;\":L?\"<span class='ui-state-default'>\"+N.getDate()+\"</span>\":\"<a class='ui-state-default\"+(N.getTime()===z.getTime()?\" ui-state-highlight\":\"\")+(N.getTime()===G.getTime()?\" ui-state-active\":\"\")+(R?\" ui-priority-secondary\":\"\")+\"' href='#'>\"+N.getDate()+\"</a>\")+\"</td>\",N.setDate(N.getDate()+1),N=this._daylightSavingAdjust(N);S+=j+\"</tr>\"}Q++,Q>11&&(Q=0,tt++),S+=\"</tbody></table>\"+(X?\"</div>\"+(Y[0]>0&&k===Y[1]-1?\"<div class='ui-datepicker-row-break'></div>\":\"\"):\"\"),C+=S}b+=C}return b+=u,t._keyEvent=!1,b},_generateMonthYearHeader:function(t,e,i,n,r,s,o,a){var l,u,c,h,d,p,f,g,m=this._get(t,\"changeMonth\"),v=this._get(t,\"changeYear\"),_=this._get(t,\"showMonthAfterYear\"),y=\"<div class='ui-datepicker-title'>\",b=\"\";if(s||!m)b+=\"<span class='ui-datepicker-month'>\"+o[e]+\"</span>\";else{for(l=n&&n.getFullYear()===i,u=r&&r.getFullYear()===i,b+=\"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\",c=0;12>c;c++)(!l||c>=n.getMonth())&&(!u||r.getMonth()>=c)&&(b+=\"<option value='\"+c+\"'\"+(c===e?\" selected='selected'\":\"\")+\">\"+a[c]+\"</option>\");b+=\"</select>\"}if(_||(y+=b+(!s&&m&&v?\"\":\"&#xa0;\")),!t.yearshtml)if(t.yearshtml=\"\",s||!v)y+=\"<span class='ui-datepicker-year'>\"+i+\"</span>\";else{for(h=this._get(t,\"yearRange\").split(\":\"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(h[0]),g=Math.max(f,p(h[1]||\"\")),f=n?Math.max(f,n.getFullYear()):f,g=r?Math.min(g,r.getFullYear()):g,t.yearshtml+=\"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";g>=f;f++)t.yearshtml+=\"<option value='\"+f+\"'\"+(f===i?\" selected='selected'\":\"\")+\">\"+f+\"</option>\";t.yearshtml+=\"</select>\",y+=t.yearshtml,t.yearshtml=null}return y+=this._get(t,\"yearSuffix\"),_&&(y+=(!s&&m&&v?\"\":\"&#xa0;\")+b),y+=\"</div>\"},_adjustInstDate:function(t,e,i){var n=t.selectedYear+(\"Y\"===i?e:0),r=t.selectedMonth+(\"M\"===i?e:0),s=Math.min(t.selectedDay,this._getDaysInMonth(n,r))+(\"D\"===i?e:0),o=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(n,r,s)));t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),(\"M\"===i||\"Y\"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,\"min\"),n=this._getMinMaxDate(t,\"max\"),r=i&&i>e?i:e;return n&&r>n?n:r},_notifyChange:function(t){var e=this._get(t,\"onChangeMonthYear\");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,\"numberOfMonths\");return null==e?[1,1]:\"number\"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+\"Date\"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,n){var r=this._getNumberOfMonths(t),s=this._daylightSavingAdjust(new Date(i,n+(0>e?e:r[0]*r[1]),1));return 0>e&&s.setDate(this._getDaysInMonth(s.getFullYear(),s.getMonth())),this._isInRange(t,s)},_isInRange:function(t,e){var i,n,r=this._getMinMaxDate(t,\"min\"),s=this._getMinMaxDate(t,\"max\"),o=null,a=null,l=this._get(t,\"yearRange\");return l&&(i=l.split(\":\"),n=(new Date).getFullYear(),o=parseInt(i[0],10),a=parseInt(i[1],10),i[0].match(/[+\\-].*/)&&(o+=n),i[1].match(/[+\\-].*/)&&(a+=n)),(!r||e.getTime()>=r.getTime())&&(!s||e.getTime()<=s.getTime())&&(!o||e.getFullYear()>=o)&&(!a||a>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,\"shortYearCutoff\");return e=\"string\"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,\"dayNamesShort\"),dayNames:this._get(t,\"dayNames\"),monthNamesShort:this._get(t,\"monthNamesShort\"),monthNames:this._get(t,\"monthNames\")}},_formatDate:function(t,e,i,n){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var r=e?\"object\"==typeof e?e:this._daylightSavingAdjust(new Date(n,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,\"dateFormat\"),r,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on(\"mousedown\",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t(\"#\"+t.datepicker._mainDivId).length&&t(\"body\").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return\"string\"!=typeof e||\"isDisabled\"!==e&&\"getDate\"!==e&&\"widget\"!==e?\"option\"===e&&2===arguments.length&&\"string\"==typeof arguments[1]?t.datepicker[\"_\"+e+\"Datepicker\"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){\"string\"==typeof e?t.datepicker[\"_\"+e+\"Datepicker\"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker[\"_\"+e+\"Datepicker\"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new n,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version=\"1.12.1\",t.datepicker,t.widget(\"ui.dialog\",{version:\"1.12.1\",options:{appendTo:\"body\",autoOpen:!0,buttons:[],classes:{\"ui-dialog\":\"ui-corner-all\",\"ui-dialog-titlebar\":\"ui-corner-all\"},closeOnEscape:!0,closeText:\"Close\",draggable:!0,hide:null,height:\"auto\",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:\"center\",at:\"center\",of:window,collision:\"fit\",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css(\"top\",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr(\"title\"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr(\"title\").appendTo(this.uiDialog),this._addClass(\"ui-dialog-content\",\"ui-widget-content\"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||\"body\").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr(\"title\",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&!1!==this._trigger(\"beforeClose\",e)&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(\":focusable\").trigger(\"focus\").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger(\"close\",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var n=!1,r=this.uiDialog.siblings(\".ui-front:visible\").map(function(){return+t(this).css(\"z-index\")}).get(),s=Math.max.apply(null,r);return s>=+this.uiDialog.css(\"z-index\")&&(this.uiDialog.css(\"z-index\",s+1),n=!0),n&&!i&&this._trigger(\"focus\",e),n},open:function(){var e=this;return this._isOpen?void(this._moveToTop()&&this._focusTabbable()):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css(\"z-index\",this.uiDialog.css(\"z-index\")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger(\"focus\")}),this._makeFocusTarget(),void this._trigger(\"open\"))},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find(\"[autofocus]\")),t.length||(t=this.element.find(\":tabbable\")),t.length||(t=this.uiDialogButtonPane.find(\":tabbable\")),t.length||(t=this.uiDialogTitlebarClose.filter(\":tabbable\")),t.length||(t=this.uiDialog),t.eq(0).trigger(\"focus\")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]);this.uiDialog[0]===e||t.contains(this.uiDialog[0],e)||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t(\"<div>\").hide().attr({tabIndex:-1,role:\"dialog\"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,\"ui-dialog\",\"ui-widget ui-widget-content ui-front\"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),void this.close(e);if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(\":tabbable\"),n=i.filter(\":first\"),r=i.filter(\":last\");e.target!==r[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==n[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){r.trigger(\"focus\")}),e.preventDefault()):(this._delay(function(){n.trigger(\"focus\")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find(\"[aria-describedby]\").length||this.uiDialog.attr({\"aria-describedby\":this.element.uniqueId().attr(\"id\")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t(\"<div>\"),this._addClass(this.uiDialogTitlebar,\"ui-dialog-titlebar\",\"ui-widget-header ui-helper-clearfix\"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(\".ui-dialog-titlebar-close\")||this.uiDialog.trigger(\"focus\")}}),this.uiDialogTitlebarClose=t(\"<button type='button'></button>\").button({label:t(\"<a>\").text(this.options.closeText).html(),icon:\"ui-icon-closethick\",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,\"ui-dialog-titlebar-close\"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t(\"<span>\").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,\"ui-dialog-title\"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({\"aria-labelledby\":e.attr(\"id\")})},_title:function(t){this.options.title?t.text(this.options.title):t.html(\"&#160;\")},_createButtonPane:function(){this.uiDialogButtonPane=t(\"<div>\"),this._addClass(this.uiDialogButtonPane,\"ui-dialog-buttonpane\",\"ui-widget-content ui-helper-clearfix\"),this.uiButtonSet=t(\"<div>\").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,\"ui-dialog-buttonset\"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?void this._removeClass(this.uiDialog,\"ui-dialog-buttons\"):(t.each(i,function(i,n){var r,s;n=t.isFunction(n)?{click:n,text:i}:n,n=t.extend({type:\"button\"},n),r=n.click,s={icon:n.icon,iconPosition:n.iconPosition,showLabel:n.showLabel,icons:n.icons,text:n.text},delete n.click,delete n.icon,delete n.iconPosition,delete n.showLabel,delete n.icons,\"boolean\"==typeof n.text&&delete n.text,t(\"<button></button>\",n).button(s).appendTo(e.uiButtonSet).on(\"click\",function(){r.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,\"ui-dialog-buttons\"),void this.uiDialogButtonPane.appendTo(this.uiDialog))},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,n=this.options;this.uiDialog.draggable({cancel:\".ui-dialog-content, .ui-dialog-titlebar-close\",handle:\".ui-dialog-titlebar\",containment:\"document\",start:function(n,r){i._addClass(t(this),\"ui-dialog-dragging\"),i._blockFrames(),i._trigger(\"dragStart\",n,e(r))},drag:function(t,n){i._trigger(\"drag\",t,e(n))},stop:function(r,s){var o=s.offset.left-i.document.scrollLeft(),a=s.offset.top-i.document.scrollTop();n.position={my:\"left top\",at:\"left\"+(o>=0?\"+\":\"\")+o+\" top\"+(a>=0?\"+\":\"\")+a,of:i.window},i._removeClass(t(this),\"ui-dialog-dragging\"),i._unblockFrames(),i._trigger(\"dragStop\",r,e(s))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,n=this.options,r=n.resizable,s=this.uiDialog.css(\"position\"),o=\"string\"==typeof r?r:\"n,e,s,w,se,sw,ne,nw\";this.uiDialog.resizable({cancel:\".ui-dialog-content\",containment:\"document\",alsoResize:this.element,maxWidth:n.maxWidth,maxHeight:n.maxHeight,minWidth:n.minWidth,minHeight:this._minHeight(),handles:o,start:function(n,r){i._addClass(t(this),\"ui-dialog-resizing\"),i._blockFrames(),i._trigger(\"resizeStart\",n,e(r))},resize:function(t,n){i._trigger(\"resize\",t,e(n))},stop:function(r,s){var o=i.uiDialog.offset(),a=o.left-i.document.scrollLeft(),l=o.top-i.document.scrollTop();n.height=i.uiDialog.height(),n.width=i.uiDialog.width(),n.position={my:\"left top\",at:\"left\"+(a>=0?\"+\":\"\")+a+\" top\"+(l>=0?\"+\":\"\")+l,of:i.window},i._removeClass(t(this),\"ui-dialog-resizing\"),i._unblockFrames(),i._trigger(\"resizeStop\",r,e(s))}}).css(\"position\",s)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data(\"ui-dialog-instances\");return t||(t=[],this.document.data(\"ui-dialog-instances\",t)),t},_minHeight:function(){var t=this.options;return\"auto\"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(\":visible\");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,n=!1,r={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(n=!0),t in i.resizableRelatedOptions&&(r[t]=e)}),n&&(this._size(),this._position()),this.uiDialog.is(\":data(ui-resizable)\")&&this.uiDialog.resizable(\"option\",r)},_setOption:function(e,i){var n,r,s=this.uiDialog;\"disabled\"!==e&&(this._super(e,i),\"appendTo\"===e&&this.uiDialog.appendTo(this._appendTo()),\"buttons\"===e&&this._createButtons(),\"closeText\"===e&&this.uiDialogTitlebarClose.button({label:t(\"<a>\").text(\"\"+this.options.closeText).html()}),\"draggable\"===e&&(n=s.is(\":data(ui-draggable)\"),n&&!i&&s.draggable(\"destroy\"),!n&&i&&this._makeDraggable()),\"position\"===e&&this._position(),\"resizable\"===e&&(r=s.is(\":data(ui-resizable)\"),r&&!i&&s.resizable(\"destroy\"),r&&\"string\"==typeof i&&s.resizable(\"option\",\"handles\",i),r||!1===i||this._makeResizable()),\"title\"===e&&this._title(this.uiDialogTitlebar.find(\".ui-dialog-title\")))},_size:function(){var t,e,i,n=this.options;this.element.show().css({width:\"auto\",minHeight:0,maxHeight:\"none\",height:0}),n.minWidth>n.width&&(n.width=n.minWidth),t=this.uiDialog.css({height:\"auto\",width:n.width}).outerHeight(),e=Math.max(0,n.minHeight-t),i=\"number\"==typeof n.maxHeight?Math.max(0,n.maxHeight-t):\"none\",\"auto\"===n.height?this.element.css({minHeight:e,maxHeight:i,height:\"auto\"}):this.element.height(Math.max(0,n.height-t)),this.uiDialog.is(\":data(ui-resizable)\")&&this.uiDialog.resizable(\"option\",\"minHeight\",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find(\"iframe\").map(function(){var e=t(this);return t(\"<div>\").css({position:\"absolute\",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return!!t(e.target).closest(\".ui-dialog\").length||!!t(e.target).closest(\".ui-datepicker\").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data(\"ui-dialog-overlays\")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t(\"<div>\").appendTo(this._appendTo()),this._addClass(this.overlay,null,\"ui-widget-overlay ui-front\"),this._on(this.overlay,{mousedown:\"_keepFocus\"}),this.document.data(\"ui-dialog-overlays\",(this.document.data(\"ui-dialog-overlays\")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data(\"ui-dialog-overlays\")-1;t?this.document.data(\"ui-dialog-overlays\",t):(this._off(this.document,\"focusin\"),this.document.removeData(\"ui-dialog-overlays\")),this.overlay.remove(),this.overlay=null}}}),!1!==t.uiBackCompat&&t.widget(\"ui.dialog\",t.ui.dialog,{options:{dialogClass:\"\"},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){\"dialogClass\"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget(\"ui.progressbar\",{version:\"1.12.1\",options:{classes:{\"ui-progressbar\":\"ui-corner-all\",\"ui-progressbar-value\":\"ui-corner-left\",\"ui-progressbar-complete\":\"ui-corner-right\"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:\"progressbar\",\"aria-valuemin\":this.min}),this._addClass(\"ui-progressbar\",\"ui-widget ui-widget-content\"),this.valueDiv=t(\"<div>\").appendTo(this.element),this._addClass(this.valueDiv,\"ui-progressbar-value\",\"ui-widget-header\"),this._refreshValue()},_destroy:function(){this.element.removeAttr(\"role aria-valuemin aria-valuemax aria-valuenow\"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),void this._refreshValue())},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=!1===t,\"number\"!=typeof t&&(t=0),!this.indeterminate&&Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){\"max\"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr(\"aria-disabled\",t),this._toggleClass(null,\"ui-state-disabled\",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+\"%\"),this._toggleClass(this.valueDiv,\"ui-progressbar-complete\",null,e===this.options.max)._toggleClass(\"ui-progressbar-indeterminate\",null,this.indeterminate),this.indeterminate?(this.element.removeAttr(\"aria-valuenow\"),this.overlayDiv||(this.overlayDiv=t(\"<div>\").appendTo(this.valueDiv),this._addClass(this.overlayDiv,\"ui-progressbar-overlay\"))):(this.element.attr({\"aria-valuemax\":this.options.max,\"aria-valuenow\":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger(\"change\")),e===this.options.max&&this._trigger(\"complete\")}}),t.widget(\"ui.selectmenu\",[t.ui.formResetMixin,{version:\"1.12.1\",defaultElement:\"<select>\",options:{appendTo:null,classes:{\"ui-selectmenu-button-open\":\"ui-corner-top\",\"ui-selectmenu-button-closed\":\"ui-corner-all\"},disabled:null,icons:{button:\"ui-icon-triangle-1-s\"},position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr(\"id\");this.ids={element:e,button:e+\"-button\",menu:e+\"-menu\"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=t()},_drawButton:function(){var e,i=this,n=this._parseOption(this.element.find(\"option:selected\"),this.element[0].selectedIndex);this.labels=this.element.labels().attr(\"for\",this.ids.button),this._on(this.labels,{click:function(t){this.button.focus(),t.preventDefault()}}),this.element.hide(),this.button=t(\"<span>\",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:\"combobox\",\"aria-expanded\":\"false\",\"aria-autocomplete\":\"list\",\"aria-owns\":this.ids.menu,\"aria-haspopup\":\"true\",title:this.element.attr(\"title\")}).insertAfter(this.element),this._addClass(this.button,\"ui-selectmenu-button ui-selectmenu-button-closed\",\"ui-button ui-widget\"),e=t(\"<span>\").appendTo(this.button),this._addClass(e,\"ui-selectmenu-icon\",\"ui-icon \"+this.options.icons.button),this.buttonItem=this._renderButtonItem(n).appendTo(this.button),!1!==this.options.width&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one(\"focusin\",function(){i._rendered||i._refreshMenu()})},_drawMenu:function(){var e=this;this.menu=t(\"<ul>\",{\"aria-hidden\":\"true\",\"aria-labelledby\":this.ids.button,id:this.ids.menu}),this.menuWrap=t(\"<div>\").append(this.menu),this._addClass(this.menuWrap,\"ui-selectmenu-menu\",\"ui-front\"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{\"ui-menu\":\"ui-corner-bottom\"},role:\"listbox\",select:function(t,i){t.preventDefault(),e._setSelection(),e._select(i.item.data(\"ui-selectmenu-item\"),t)},focus:function(t,i){var n=i.item.data(\"ui-selectmenu-item\");null!=e.focusIndex&&n.index!==e.focusIndex&&(e._trigger(\"focus\",t,{item:n}),e.isOpen||e._select(n,t)),e.focusIndex=n.index,e.button.attr(\"aria-activedescendant\",e.menuItems.eq(n.index).attr(\"id\"))}}).menu(\"instance\"),this.menuInstance._off(this.menu,\"mouseleave\"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data(\"ui-selectmenu-item\")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t,e=this.element.find(\"option\");this.menu.empty(),this._parseOptions(e),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find(\"li\").not(\".ui-selectmenu-optgroup\").find(\".ui-menu-item-wrapper\"),this._rendered=!0,e.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data(\"ui-selectmenu-item\")),this._setOption(\"disabled\",this.element.prop(\"disabled\")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(\".ui-state-active\"),null,\"ui-state-active\"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger(\"open\",t)))},_position:function(){this.menuWrap.position(t.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger(\"close\",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(e){var i=t(\"<span>\");return this._setText(i,e.label),this._addClass(i,\"ui-selectmenu-text\"),i},_renderMenu:function(e,i){var n=this,r=\"\";t.each(i,function(i,s){var o;s.optgroup!==r&&(o=t(\"<li>\",{text:s.optgroup}),n._addClass(o,\"ui-selectmenu-optgroup\",\"ui-menu-divider\"+(s.element.parent(\"optgroup\").prop(\"disabled\")?\" ui-state-disabled\":\"\")),o.appendTo(e),r=s.optgroup),n._renderItemData(e,s)})},_renderItemData:function(t,e){return this._renderItem(t,e).data(\"ui-selectmenu-item\",e)},_renderItem:function(e,i){var n=t(\"<li>\"),r=t(\"<div>\",{title:i.element.attr(\"title\")});return i.disabled&&this._addClass(n,null,\"ui-state-disabled\"),this._setText(r,i.label),n.append(r).appendTo(e)},_setText:function(t,e){e?t.text(e):t.html(\"&#160;\")},_move:function(t,e){var i,n,r=\".ui-menu-item\";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent(\"li\"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent(\"li\"),r+=\":not(.ui-state-disabled)\"),n=\"first\"===t||\"last\"===t?i[\"first\"===t?\"prevAll\":\"nextAll\"](r).eq(-1):i[t+\"All\"](r).eq(0),n.length&&this.menuInstance.focus(e,n)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent(\"li\")},_toggle:function(t){this[this.isOpen?\"close\":\"open\"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?(t=window.getSelection(),t.removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(e){this.isOpen&&(t(e.target).closest(\".ui-selectmenu-menu, #\"+t.ui.escapeSelector(this.ids.button)).length||this.close(e))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection(),t.rangeCount&&(this.range=t.getRangeAt(0))):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(e){var i=!0;switch(e.keyCode){case t.ui.keyCode.TAB:case t.ui.keyCode.ESCAPE:this.close(e),i=!1;break;case t.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(e);break;case t.ui.keyCode.UP:e.altKey?this._toggle(e):this._move(\"prev\",e);break;case t.ui.keyCode.DOWN:e.altKey?this._toggle(e):this._move(\"next\",e);break;case t.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(e):this._toggle(e);break;case t.ui.keyCode.LEFT:this._move(\"prev\",e);break;case t.ui.keyCode.RIGHT:this._move(\"next\",e);break;case t.ui.keyCode.HOME:case t.ui.keyCode.PAGE_UP:this._move(\"first\",e);break;case t.ui.keyCode.END:case t.ui.keyCode.PAGE_DOWN:this._move(\"last\",e);break;default:this.menu.trigger(e),i=!1}i&&e.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent(\"li\");e.hasClass(\"ui-state-disabled\")||this._select(e.data(\"ui-selectmenu-item\"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger(\"select\",e,{item:t}),t.index!==i&&this._trigger(\"change\",e,{item:t}),this.close(e)},_setAria:function(t){var e=this.menuItems.eq(t.index).attr(\"id\");this.button.attr({\"aria-labelledby\":e,\"aria-activedescendant\":e}),this.menu.attr(\"aria-activedescendant\",e)},_setOption:function(t,e){if(\"icons\"===t){var i=this.button.find(\"span.ui-icon\");this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)}this._super(t,e),\"appendTo\"===t&&this.menuWrap.appendTo(this._appendTo()),\"width\"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option(\"disabled\",t),this.button.attr(\"aria-disabled\",t),this._toggleClass(this.button,null,\"ui-state-disabled\",t),this.element.prop(\"disabled\",t),t?(this.button.attr(\"tabindex\",-1),this.close()):this.button.attr(\"tabindex\",0)},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(\".ui-front, dialog\")),e.length||(e=this.document[0].body),e},_toggleAttr:function(){this.button.attr(\"aria-expanded\",this.isOpen),this._removeClass(this.button,\"ui-selectmenu-button-\"+(this.isOpen?\"closed\":\"open\"))._addClass(this.button,\"ui-selectmenu-button-\"+(this.isOpen?\"open\":\"closed\"))._toggleClass(this.menuWrap,\"ui-selectmenu-open\",null,this.isOpen),this.menu.attr(\"aria-hidden\",!this.isOpen)},_resizeButton:function(){var t=this.options.width;return!1===t?void this.button.css(\"width\",\"\"):(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),void this.button.outerWidth(t))},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width(\"\").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop(\"disabled\"),t},_parseOptions:function(e){var i=this,n=[];e.each(function(e,r){n.push(i._parseOption(t(r),e))}),this.items=n},_parseOption:function(t,e){var i=t.parent(\"optgroup\");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr(\"label\")||\"\",disabled:i.prop(\"disabled\")||t.prop(\"disabled\")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr(\"for\",this.ids.element)}}]),t.widget(\"ui.slider\",t.ui.mouse,{version:\"1.12.1\",widgetEventPrefix:\"slide\",options:{animate:!1,classes:{\"ui-slider\":\"ui-corner-all\",\"ui-slider-handle\":\"ui-corner-all\",\"ui-slider-range\":\"ui-corner-all ui-widget-header\"},distance:0,max:100,min:0,orientation:\"horizontal\",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass(\"ui-slider ui-slider-\"+this.orientation,\"ui-widget ui-widget-content\"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,n=this.options,r=this.element.find(\".ui-slider-handle\"),s=[];for(i=n.values&&n.values.length||1,r.length>i&&(r.slice(i).remove(),r=r.slice(0,i)),e=r.length;i>e;e++)s.push(\"<span tabindex='0'></span>\");this.handles=r.add(t(s.join(\"\")).appendTo(this.element)),this._addClass(this.handles,\"ui-slider-handle\",\"ui-state-default\"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data(\"ui-slider-handle-index\",e).attr(\"tabIndex\",0)})},_createRange:function(){var e=this.options;e.range?(!0===e.range&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,\"ui-slider-range-min ui-slider-range-max\"),this.range.css({left:\"\",bottom:\"\"})):(this.range=t(\"<div>\").appendTo(this.element),this._addClass(this.range,\"ui-slider-range\")),(\"min\"===e.range||\"max\"===e.range)&&this._addClass(this.range,\"ui-slider-range-\"+e.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,n,r,s,o,a,l,u=this,c=this.options;return!c.disabled&&(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},n=this._normValueFromMouse(i),r=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(n-u.values(e));(r>i||r===i&&(e===u._lastChangedValue||u.values(e)===c.min))&&(r=i,s=t(this),o=e)}),!1!==this._start(e,o)&&(this._mouseSliding=!0,this._handleIndex=o,this._addClass(s,null,\"ui-state-active\"),s.trigger(\"focus\"),a=s.offset(),l=!t(e.target).parents().addBack().is(\".ui-slider-handle\"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-a.left-s.width()/2,top:e.pageY-a.top-s.height()/2-(parseInt(s.css(\"borderTopWidth\"),10)||0)-(parseInt(s.css(\"borderBottomWidth\"),10)||0)+(parseInt(s.css(\"marginTop\"),10)||0)},this.handles.hasClass(\"ui-state-hover\")||this._slide(e,o,n),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,\"ui-state-active\"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=\"vertical\"===this.options.orientation?\"vertical\":\"horizontal\"},_normValueFromMouse:function(t){var e,i,n,r,s;return\"horizontal\"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),n=i/e,n>1&&(n=1),0>n&&(n=0),\"vertical\"===this.orientation&&(n=1-n),r=this._valueMax()-this._valueMin(),s=this._valueMin()+n*r,this._trimAlignValue(s)},_uiHash:function(t,e,i){var n={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(n.value=void 0!==e?e:this.values(t),n.values=i||this.values()),n},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger(\"start\",t,this._uiHash(e))},_slide:function(t,e,i){var n,r=this.value(),s=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),r=this.values(e),2===this.options.values.length&&!0===this.options.range&&(i=0===e?Math.min(n,i):Math.max(n,i)),s[e]=i),i!==r&&!1!==this._trigger(\"slide\",t,this._uiHash(e,i,s))&&(this._hasMultipleValues()?this.values(e,i):this.value(i))},_stop:function(t,e){this._trigger(\"stop\",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger(\"change\",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),void this._change(null,0)):this._value()},values:function(e,i){var n,r,s;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),void this._change(null,e);if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(n=this.options.values,r=arguments[0],s=0;n.length>s;s+=1)n[s]=this._trimAlignValue(r[s]),this._change(null,s);this._refreshValue()},_setOption:function(e,i){var n,r=0;switch(\"range\"===e&&!0===this.options.range&&(\"min\"===i?(this.options.value=this._values(0),this.options.values=null):\"max\"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(r=this.options.values.length),this._super(e,i),e){case\"orientation\":this._detectOrientation(),this._removeClass(\"ui-slider-horizontal ui-slider-vertical\")._addClass(\"ui-slider-\"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css(\"horizontal\"===i?\"bottom\":\"left\",\"\");break;case\"value\":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case\"values\":for(this._animateOff=!0,this._refreshValue(),n=r-1;n>=0;n--)this._change(null,n);this._animateOff=!1;break;case\"step\":case\"min\":case\"max\":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case\"range\":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,\"ui-state-disabled\",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,n;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),n=0;i.length>n;n+=1)i[n]=this._trimAlignValue(i[n]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,n=t-i;return 2*Math.abs(i)>=e&&(n+=i>0?e:-e),parseFloat(n.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step;t=Math.round((t-e)/i)*i+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=\"\"+t,i=e.indexOf(\".\");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){\"vertical\"===t&&this.range.css({width:\"\",left:\"\"}),\"horizontal\"===t&&this.range.css({height:\"\",bottom:\"\"})},_refreshValue:function(){var e,i,n,r,s,o=this.options.range,a=this.options,l=this,u=!this._animateOff&&a.animate,c={};this._hasMultipleValues()?this.handles.each(function(n){i=(l.values(n)-l._valueMin())/(l._valueMax()-l._valueMin())*100,c[\"horizontal\"===l.orientation?\"left\":\"bottom\"]=i+\"%\",t(this).stop(1,1)[u?\"animate\":\"css\"](c,a.animate),!0===l.options.range&&(\"horizontal\"===l.orientation?(0===n&&l.range.stop(1,1)[u?\"animate\":\"css\"]({left:i+\"%\"},a.animate),1===n&&l.range[u?\"animate\":\"css\"]({width:i-e+\"%\"},{queue:!1,duration:a.animate})):(0===n&&l.range.stop(1,1)[u?\"animate\":\"css\"]({bottom:i+\"%\"},a.animate),1===n&&l.range[u?\"animate\":\"css\"]({height:i-e+\"%\"},{queue:!1,duration:a.animate}))),e=i}):(n=this.value(),r=this._valueMin(),s=this._valueMax(),i=s!==r?(n-r)/(s-r)*100:0,c[\"horizontal\"===this.orientation?\"left\":\"bottom\"]=i+\"%\",this.handle.stop(1,1)[u?\"animate\":\"css\"](c,a.animate),\"min\"===o&&\"horizontal\"===this.orientation&&this.range.stop(1,1)[u?\"animate\":\"css\"]({width:i+\"%\"},a.animate),\"max\"===o&&\"horizontal\"===this.orientation&&this.range.stop(1,1)[u?\"animate\":\"css\"]({width:100-i+\"%\"},a.animate),\"min\"===o&&\"vertical\"===this.orientation&&this.range.stop(1,1)[u?\"animate\":\"css\"]({height:i+\"%\"},a.animate),\"max\"===o&&\"vertical\"===this.orientation&&this.range.stop(1,1)[u?\"animate\":\"css\"]({height:100-i+\"%\"},a.animate))},_handleEvents:{keydown:function(e){var i,n,r,s=t(e.target).data(\"ui-slider-handle-index\");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,\"ui-state-active\"),!1===this._start(e,s)))return}switch(r=this.options.step,i=n=this._hasMultipleValues()?this.values(s):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(i+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(i-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(i===this._valueMax())return;n=this._trimAlignValue(i+r);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(i===this._valueMin())return;n=this._trimAlignValue(i-r)}this._slide(e,s,n)},keyup:function(e){var i=t(e.target).data(\"ui-slider-handle-index\");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,\"ui-state-active\"))}}}),t.widget(\"ui.spinner\",{version:\"1.12.1\",defaultElement:\"<input>\",widgetEventPrefix:\"spin\",options:{classes:{\"ui-spinner\":\"ui-corner-all\",\"ui-spinner-down\":\"ui-corner-br\",\"ui-spinner-up\":\"ui-corner-tr\"},culture:null,icons:{down:\"ui-icon-triangle-1-s\",up:\"ui-icon-triangle-1-n\"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption(\"max\",this.options.max),this._setOption(\"min\",this.options.min),this._setOption(\"step\",this.options.step),\"\"!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each([\"min\",\"max\",\"step\"],function(t,n){var r=i.attr(n);null!=r&&r.length&&(e[n]=r)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:\"_stop\",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?void delete this.cancelBlur:(this._stop(),this._refresh(),void(this.previous!==this.element.val()&&this._trigger(\"change\",t)))},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},\"mousedown .ui-spinner-button\":function(e){function i(){this.element[0]===t.ui.safeActiveElement(this.document[0])||(this.element.trigger(\"focus\"),this.previous=n,this._delay(function(){this.previous=n}))}var n;n=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),!1!==this._start(e)&&this._repeat(null,t(e.currentTarget).hasClass(\"ui-spinner-up\")?1:-1,e)},\"mouseup .ui-spinner-button\":\"_stop\",\"mouseenter .ui-spinner-button\":function(e){return t(e.currentTarget).hasClass(\"ui-state-active\")?!1!==this._start(e)&&void this._repeat(null,t(e.currentTarget).hasClass(\"ui-spinner-up\")?1:-1,e):void 0},\"mouseleave .ui-spinner-button\":\"_stop\"},_enhance:function(){this.uiSpinner=this.element.attr(\"autocomplete\",\"off\").wrap(\"<span>\").parent().append(\"<a></a><a></a>\")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,\"ui-spinner\",\"ui-widget ui-widget-content\"),this._addClass(\"ui-spinner-input\"),this.element.attr(\"role\",\"spinbutton\"),this.buttons=this.uiSpinner.children(\"a\").attr(\"tabIndex\",-1).attr(\"aria-hidden\",!0).button({classes:{\"ui-button\":\"\"}}),this._removeClass(this.buttons,\"ui-corner-all\"),this._addClass(this.buttons.first(),\"ui-spinner-button ui-spinner-up\"),this._addClass(this.buttons.last(),\"ui-spinner-button ui-spinner-down\"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,n=t.ui.keyCode;switch(e.keyCode){case n.UP:return this._repeat(null,1,e),!0;case n.DOWN:return this._repeat(null,-1,e),!0;case n.PAGE_UP:return this._repeat(null,i.page,e),!0;case n.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return!(!this.spinning&&!1===this._trigger(\"start\",t))&&(this.counter||(this.counter=1),this.spinning=!0,!0)},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&!1===this._trigger(\"spin\",e,{value:i})||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=\"\"+t,i=e.indexOf(\".\");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,n=this.options;return e=null!==n.min?n.min:0,i=t-e,i=Math.round(i/n.step)*n.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==n.max&&t>n.max?n.max:null!==n.min&&n.min>t?n.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger(\"stop\",t))},_setOption:function(t,e){var i,n,r;return\"culture\"===t||\"numberFormat\"===t?(i=this._parse(this.element.val()),this.options[t]=e,void this.element.val(this._format(i))):((\"max\"===t||\"min\"===t||\"step\"===t)&&\"string\"==typeof e&&(e=this._parse(e)),\"icons\"===t&&(n=this.buttons.first().find(\".ui-icon\"),this._removeClass(n,null,this.options.icons.up),this._addClass(n,null,e.up),r=this.buttons.last().find(\".ui-icon\"),this._removeClass(r,null,this.options.icons.down),this._addClass(r,null,e.down)),void this._super(t,e))},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,\"ui-state-disabled\",!!t),this.element.prop(\"disabled\",!!t),this.buttons.button(t?\"disable\":\"enable\")},_setOptions:a(function(t){this._super(t)}),_parse:function(t){return\"string\"==typeof t&&\"\"!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),\"\"===t||isNaN(t)?null:t},_format:function(t){return\"\"===t?\"\":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({\"aria-valuemin\":this.options.min,\"aria-valuemax\":this.options.max,\"aria-valuenow\":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null!==t&&t===this._adjustValue(t)},_value:function(t,e){var i;\"\"!==t&&null!==(i=this._parse(t))&&(e||(i=this._adjustValue(i)),t=this._format(i)),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop(\"disabled\",!1).removeAttr(\"autocomplete role aria-valuemin aria-valuemax aria-valuenow\"),this.uiSpinner.replaceWith(this.element)},stepUp:a(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:a(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:a(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:a(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?void a(this._value).call(this,t):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),!1!==t.uiBackCompat&&t.widget(\"ui.spinner\",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr(\"autocomplete\",\"off\").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return\"<span>\"},_buttonHtml:function(){return\"<a></a><a></a>\"}}),t.ui.spinner,t.widget(\"ui.tabs\",{version:\"1.12.1\",delay:300,options:{active:null,classes:{\"ui-tabs\":\"ui-corner-all\",\"ui-tabs-nav\":\"ui-corner-all\",\"ui-tabs-panel\":\"ui-corner-bottom\",\"ui-tabs-tab\":\"ui-corner-top\"},collapsible:!1,event:\"click\",heightStyle:\"content\",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,n;i=e.href.replace(t,\"\"),n=location.href.replace(t,\"\");try{i=decodeURIComponent(i)}catch(t){}try{n=decodeURIComponent(n)}catch(t){}return e.hash.length>1&&i===n}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass(\"ui-tabs\",\"ui-widget ui-widget-content\"),this._toggleClass(\"ui-tabs-collapsible\",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(\".ui-state-disabled\"),function(t){return e.tabs.index(t)}))).sort()),this.active=!1!==this.options.active&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,n=location.hash.substring(1);return null===e&&(n&&this.tabs.each(function(i,r){return t(r).attr(\"aria-controls\")===n?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(\".ui-tabs-active\"))),(null===e||-1===e)&&(e=!!this.tabs.length&&0)),!1!==e&&-1===(e=this.tabs.index(this.tabs.eq(e)))&&(e=!i&&0),!i&&!1===e&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest(\"li\"),n=this.tabs.index(i),r=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:n++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:r=!1,n--;break;case t.ui.keyCode.END:n=this.anchors.length-1;break;case t.ui.keyCode.HOME:n=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),void this._activate(n);case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),void this._activate(n!==this.options.active&&n);default:return}e.preventDefault(),clearTimeout(this.activating),n=this._focusNextTab(n,r),e.ctrlKey||e.metaKey||(i.attr(\"aria-selected\",\"false\"),this.tabs.eq(n).attr(\"aria-selected\",\"true\"),this.activating=this._delay(function(){this.option(\"active\",n)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger(\"focus\"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){for(var n=this.tabs.length-1;-1!==t.inArray(function(){return e>n&&(e=0),0>e&&(e=n),e}(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger(\"focus\"),t},_setOption:function(t,e){return\"active\"===t?void this._activate(e):(this._super(t,e),\"collapsible\"===t&&(this._toggleClass(\"ui-tabs-collapsible\",null,e),e||!1!==this.options.active||this._activate(0)),\"event\"===t&&this._setupEvents(e),void(\"heightStyle\"===t&&this._setupHeightStyle(e)))},_sanitizeSelector:function(t){return t?t.replace(/[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g,\"\\\\$&\"):\"\"},refresh:function(){var e=this.options,i=this.tablist.children(\":has(a[href])\");e.disabled=t.map(i.filter(\".ui-state-disabled\"),function(t){return i.index(t)}),this._processTabs(),!1!==e.active&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({\"aria-hidden\":\"true\"}),this.active.length?(this.active.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0}),this._addClass(this.active,\"ui-tabs-active\",\"ui-state-active\"),this._getPanelForTab(this.active).show().attr({\"aria-hidden\":\"false\"})):this.tabs.eq(0).attr(\"tabIndex\",0)},_processTabs:function(){var e=this,i=this.tabs,n=this.anchors,r=this.panels;this.tablist=this._getList().attr(\"role\",\"tablist\"),this._addClass(this.tablist,\"ui-tabs-nav\",\"ui-helper-reset ui-helper-clearfix ui-widget-header\"),this.tablist.on(\"mousedown\"+this.eventNamespace,\"> li\",function(e){t(this).is(\".ui-state-disabled\")&&e.preventDefault()}).on(\"focus\"+this.eventNamespace,\".ui-tabs-anchor\",function(){t(this).closest(\"li\").is(\".ui-state-disabled\")&&this.blur()}),this.tabs=this.tablist.find(\"> li:has(a[href])\").attr({role:\"tab\",tabIndex:-1}),this._addClass(this.tabs,\"ui-tabs-tab\",\"ui-state-default\"),this.anchors=this.tabs.map(function(){return t(\"a\",this)[0]}).attr({role:\"presentation\",tabIndex:-1}),this._addClass(this.anchors,\"ui-tabs-anchor\"),this.panels=t(),this.anchors.each(function(i,n){var r,s,o,a=t(n).uniqueId().attr(\"id\"),l=t(n).closest(\"li\"),u=l.attr(\"aria-controls\");e._isLocal(n)?(r=n.hash,o=r.substring(1),s=e.element.find(e._sanitizeSelector(r))):(o=l.attr(\"aria-controls\")||t({}).uniqueId()[0].id,r=\"#\"+o,s=e.element.find(r),s.length||(s=e._createPanel(o),s.insertAfter(e.panels[i-1]||e.tablist)),s.attr(\"aria-live\",\"polite\")),s.length&&(e.panels=e.panels.add(s)),u&&l.data(\"ui-tabs-aria-controls\",u),l.attr({\"aria-controls\":o,\"aria-labelledby\":a}),s.attr(\"aria-labelledby\",a)}),this.panels.attr(\"role\",\"tabpanel\"),this._addClass(this.panels,\"ui-tabs-panel\",\"ui-widget-content\"),i&&(this._off(i.not(this.tabs)),this._off(n.not(this.anchors)),this._off(r.not(this.panels)))},_getList:function(){return this.tablist||this.element.find(\"ol, ul\").eq(0)},_createPanel:function(e){return t(\"<div>\").attr(\"id\",e).data(\"ui-tabs-destroy\",!0)},_setOptionDisabled:function(e){var i,n,r;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),r=0;n=this.tabs[r];r++)i=t(n),!0===e||-1!==t.inArray(r,e)?(i.attr(\"aria-disabled\",\"true\"),this._addClass(i,null,\"ui-state-disabled\")):(i.removeAttr(\"aria-disabled\"),this._removeClass(i,null,\"ui-state-disabled\"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+\"-disabled\",null,!0===e)},_setupEvents:function(e){var i={};e&&t.each(e.split(\" \"),function(t,e){i[e]=\"_eventHandler\"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:\"_tabKeydown\"}),this._on(this.panels,{keydown:\"_panelKeydown\"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,n=this.element.parent();\"fill\"===e?(i=n.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(\":visible\").each(function(){var e=t(this),n=e.css(\"position\");\"absolute\"!==n&&\"fixed\"!==n&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css(\"overflow\",\"auto\")):\"auto\"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height(\"\").height())}).height(i))},_eventHandler:function(e){var i=this.options,n=this.active,r=t(e.currentTarget),s=r.closest(\"li\"),o=s[0]===n[0],a=o&&i.collapsible,l=a?t():this._getPanelForTab(s),u=n.length?this._getPanelForTab(n):t(),c={oldTab:n,oldPanel:u,newTab:a?t():s,newPanel:l};e.preventDefault(),s.hasClass(\"ui-state-disabled\")||s.hasClass(\"ui-tabs-loading\")||this.running||o&&!i.collapsible||!1===this._trigger(\"beforeActivate\",e,c)||(i.active=!a&&this.tabs.index(s),this.active=o?t():s,this.xhr&&this.xhr.abort(),u.length||l.length||t.error(\"jQuery UI Tabs: Mismatching fragment identifier.\"),l.length&&this.load(this.tabs.index(s),e),this._toggle(e,c))},_toggle:function(e,i){function n(){s.running=!1,s._trigger(\"activate\",e,i)}function r(){s._addClass(i.newTab.closest(\"li\"),\"ui-tabs-active\",\"ui-state-active\"),o.length&&s.options.show?s._show(o,s.options.show,n):(o.show(),n())}var s=this,o=i.newPanel,a=i.oldPanel;this.running=!0,a.length&&this.options.hide?this._hide(a,this.options.hide,function(){s._removeClass(i.oldTab.closest(\"li\"),\"ui-tabs-active\",\"ui-state-active\"),r()}):(this._removeClass(i.oldTab.closest(\"li\"),\"ui-tabs-active\",\"ui-state-active\"),a.hide(),r()),a.attr(\"aria-hidden\",\"true\"),i.oldTab.attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\"}),o.length&&a.length?i.oldTab.attr(\"tabIndex\",-1):o.length&&this.tabs.filter(function(){return 0===t(this).attr(\"tabIndex\")}).attr(\"tabIndex\",-1),o.attr(\"aria-hidden\",\"false\"),i.newTab.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0})},_activate:function(e){var i,n=this._findActive(e);n[0]!==this.active[0]&&(n.length||(n=this.active),i=n.find(\".ui-tabs-anchor\")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return!1===e?t():this.tabs.eq(e)},_getIndex:function(e){return\"string\"==typeof e&&(e=this.anchors.index(this.anchors.filter(\"[href$='\"+t.ui.escapeSelector(e)+\"']\"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr(\"role\").off(this.eventNamespace),this.anchors.removeAttr(\"role tabIndex\").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,\"ui-tabs-destroy\")?t(this).remove():t(this).removeAttr(\"role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\")}),this.tabs.each(function(){var e=t(this),i=e.data(\"ui-tabs-aria-controls\");i?e.attr(\"aria-controls\",i).removeData(\"ui-tabs-aria-controls\"):e.removeAttr(\"aria-controls\")}),this.panels.show(),\"content\"!==this.options.heightStyle&&this.panels.css(\"height\",\"\")},enable:function(e){var i=this.options.disabled;!1!==i&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(!0!==i){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var n=this,r=this.tabs.eq(e),s=r.find(\".ui-tabs-anchor\"),o=this._getPanelForTab(r),a={tab:r,panel:o},l=function(t,e){\"abort\"===e&&n.panels.stop(!1,!0),n._removeClass(r,\"ui-tabs-loading\"),o.removeAttr(\"aria-busy\"),t===n.xhr&&delete n.xhr};this._isLocal(s[0])||(this.xhr=t.ajax(this._ajaxSettings(s,i,a)),this.xhr&&\"canceled\"!==this.xhr.statusText&&(this._addClass(r,\"ui-tabs-loading\"),o.attr(\"aria-busy\",\"true\"),this.xhr.done(function(t,e,r){setTimeout(function(){o.html(t),n._trigger(\"load\",i,a),l(r,e)},1)}).fail(function(t,e){setTimeout(function(){l(t,e)},1)})))},_ajaxSettings:function(e,i,n){var r=this;return{url:e.attr(\"href\").replace(/#.*$/,\"\"),beforeSend:function(e,s){return r._trigger(\"beforeLoad\",i,t.extend({jqXHR:e,ajaxSettings:s},n))}}},_getPanelForTab:function(e){var i=t(e).attr(\"aria-controls\");return this.element.find(this._sanitizeSelector(\"#\"+i))}}),!1!==t.uiBackCompat&&t.widget(\"ui.tabs\",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,\"ui-tab\")}}),t.ui.tabs,t.widget(\"ui.tooltip\",{version:\"1.12.1\",options:{classes:{\"ui-tooltip\":\"ui-corner-all ui-widget-shadow\"},content:function(){var e=t(this).attr(\"title\")||\"\";return t(\"<a>\").text(e).html()},hide:!0,items:\"[title]:not([disabled])\",position:{my:\"left top+15\",at:\"left bottom\",collision:\"flipfit flip\"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var n=(e.attr(\"aria-describedby\")||\"\").split(/\\s+/);n.push(i),e.data(\"ui-tooltip-id\",i).attr(\"aria-describedby\",t.trim(n.join(\" \")))},_removeDescribedBy:function(e){var i=e.data(\"ui-tooltip-id\"),n=(e.attr(\"aria-describedby\")||\"\").split(/\\s+/),r=t.inArray(i,n);-1!==r&&n.splice(r,1),e.removeData(\"ui-tooltip-id\"),n=t.trim(n.join(\" \")),n?e.attr(\"aria-describedby\",n):e.removeAttr(\"aria-describedby\")},_create:function(){this._on({mouseover:\"open\",focusin:\"open\"}),this.tooltips={},this.parents={},this.liveRegion=t(\"<div>\").attr({role:\"log\",\"aria-live\":\"assertive\",\"aria-relevant\":\"additions\"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,\"ui-helper-hidden-accessible\"),this.disabledTitles=t([])},_setOption:function(e,i){var n=this;this._super(e,i),\"content\"===e&&t.each(this.tooltips,function(t,e){n._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?\"_disable\":\"_enable\"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,n){var r=t.Event(\"blur\");r.target=r.currentTarget=n.element[0],e.close(r,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is(\"[title]\")?e.data(\"ui-tooltip-title\",e.attr(\"title\")).removeAttr(\"title\"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data(\"ui-tooltip-title\")&&e.attr(\"title\",e.data(\"ui-tooltip-title\"))}),this.disabledTitles=t([])},open:function(e){var i=this,n=t(e?e.target:this.element).closest(this.options.items);n.length&&!n.data(\"ui-tooltip-id\")&&(n.attr(\"title\")&&n.data(\"ui-tooltip-title\",n.attr(\"title\")),n.data(\"ui-tooltip-open\",!0),e&&\"mouseover\"===e.type&&n.parents().each(function(){var e,n=t(this);n.data(\"ui-tooltip-open\")&&(e=t.Event(\"blur\"),e.target=e.currentTarget=this,i.close(e,!0)),n.attr(\"title\")&&(n.uniqueId(),i.parents[this.id]={element:this,title:n.attr(\"title\")},n.attr(\"title\",\"\"))}),this._registerCloseHandlers(e,n),this._updateContent(n,e))},_updateContent:function(t,e){var i,n=this.options.content,r=this,s=e?e.type:null;return\"string\"==typeof n||n.nodeType||n.jquery?this._open(e,t,n):void((i=n.call(t[0],function(i){r._delay(function(){t.data(\"ui-tooltip-open\")&&(e&&(e.type=s),this._open(e,t,i))})}))&&this._open(e,t,i))},_open:function(e,i,n){function r(t){u.of=t,o.is(\":hidden\")||o.position(u)}var s,o,a,l,u=t.extend({},this.options.position);if(n){if(s=this._find(i))return void s.tooltip.find(\".ui-tooltip-content\").html(n);i.is(\"[title]\")&&(e&&\"mouseover\"===e.type?i.attr(\"title\",\"\"):i.removeAttr(\"title\")),s=this._tooltip(i),o=s.tooltip,this._addDescribedBy(i,o.attr(\"id\")),o.find(\".ui-tooltip-content\").html(n),this.liveRegion.children().hide(),l=t(\"<div>\").html(o.find(\".ui-tooltip-content\").html()),l.removeAttr(\"name\").find(\"[name]\").removeAttr(\"name\"),l.removeAttr(\"id\").find(\"[id]\").removeAttr(\"id\"),l.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:r}),r(e)):o.position(t.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(a=this.delayedShow=setInterval(function(){o.is(\":visible\")&&(r(u.of),clearInterval(a))},t.fx.interval)),this._trigger(\"open\",e,{tooltip:o})}},_registerCloseHandlers:function(e,i){var n={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var n=t.Event(e);n.currentTarget=i[0],this.close(n,!0)}}};i[0]!==this.element[0]&&(n.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&\"mouseover\"!==e.type||(n.mouseleave=\"close\"),e&&\"focusin\"!==e.type||(n.focusout=\"close\"),this._on(!0,i,n)},close:function(e){var i,n=this,r=t(e?e.currentTarget:this.element),s=this._find(r);return s?(i=s.tooltip,void(s.closing||(clearInterval(this.delayedShow),r.data(\"ui-tooltip-title\")&&!r.attr(\"title\")&&r.attr(\"title\",r.data(\"ui-tooltip-title\")),this._removeDescribedBy(r),s.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){n._removeTooltip(t(this))}),r.removeData(\"ui-tooltip-open\"),this._off(r,\"mouseleave focusout keyup\"),r[0]!==this.element[0]&&this._off(r,\"remove\"),this._off(this.document,\"mousemove\"),e&&\"mouseleave\"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr(\"title\",i.title),delete n.parents[e]}),s.closing=!0,this._trigger(\"close\",e,{tooltip:i}),s.hiding||(s.closing=!1)))):void r.removeData(\"ui-tooltip-open\")},_tooltip:function(e){var i=t(\"<div>\").attr(\"role\",\"tooltip\"),n=t(\"<div>\").appendTo(i),r=i.uniqueId().attr(\"id\");return this._addClass(n,\"ui-tooltip-content\"),this._addClass(i,\"ui-tooltip\",\"ui-widget ui-widget-content\"),i.appendTo(this._appendTo(e)),this.tooltips[r]={element:e,tooltip:i}},_find:function(t){var e=t.data(\"ui-tooltip-id\");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr(\"id\")]},_appendTo:function(t){var e=t.closest(\".ui-front, dialog\");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,n){var r=t.Event(\"blur\"),s=n.element;r.target=r.currentTarget=s[0],e.close(r,!0),t(\"#\"+i).remove(),s.data(\"ui-tooltip-title\")&&(s.attr(\"title\")||s.attr(\"title\",s.data(\"ui-tooltip-title\")),s.removeData(\"ui-tooltip-title\"))}),this.liveRegion.remove()}}),!1!==t.uiBackCompat&&t.widget(\"ui.tooltip\",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip;var f=\"ui-effects-\",g=\"ui-effects-style\",m=\"ui-effects-animated\",v=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var n=c[e.type]||{};return null==t?i||!e.def?null:e.def:(t=n.floor?~~t:parseFloat(t),isNaN(t)?e.def:n.mod?(t+n.mod)%n.mod:0>t?0:t>n.max?n.max:t)}function n(i){var n=l(),r=n._rgba=[];return i=i.toLowerCase(),p(a,function(t,s){var o,a=s.re.exec(i),l=a&&s.parse(a),c=s.space||\"rgba\";return l?(o=n[c](l),n[u[c].cache]=o[u[c].cache],r=n._rgba=o._rgba,!1):e}),r.length?(\"0,0,0,0\"===r.join()&&t.extend(r,s.transparent),n):s[i]}function r(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var s,o=/^([\\-+])=\\s*(\\d+\\.?\\d*)/,a=[{re:/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,space:\"hsla\",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,n,r){return new t.Color.fn.parse(e,i,n,r)},u={rgba:{props:{red:{idx:0,type:\"byte\"},green:{idx:1,type:\"byte\"},blue:{idx:2,type:\"byte\"}}},hsla:{props:{hue:{idx:0,type:\"degrees\"},saturation:{idx:1,type:\"percent\"},lightness:{idx:2,type:\"percent\"}}}},c={byte:{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},h=l.support={},d=t(\"<p>\")[0],p=t.each;d.style.cssText=\"background-color:rgba(1,1,1,.5)\",h.rgba=d.style.backgroundColor.indexOf(\"rgba\")>-1,p(u,function(t,e){e.cache=\"_\"+t,e.props.alpha={idx:3,type:\"percent\",def:1}}),l.fn=t.extend(l.prototype,{parse:function(r,o,a,c){if(r===e)return this._rgba=[null,null,null,null],this;(r.jquery||r.nodeType)&&(r=t(r).css(o),o=e);var h=this,d=t.type(r),f=this._rgba=[];return o!==e&&(r=[r,o,a,c],d=\"array\"),\"string\"===d?this.parse(n(r)||s._default):\"array\"===d?(p(u.rgba.props,function(t,e){f[e.idx]=i(r[e.idx],e)}),this):\"object\"===d?(r instanceof l?p(u,function(t,e){r[e.cache]&&(h[e.cache]=r[e.cache].slice())}):p(u,function(e,n){var s=n.cache;p(n.props,function(t,e){if(!h[s]&&n.to){if(\"alpha\"===t||null==r[t])return;h[s]=n.to(h._rgba)}h[s][e.idx]=i(r[t],e,!0)}),h[s]&&0>t.inArray(null,h[s].slice(0,3))&&(h[s][3]=1,n.from&&(h._rgba=n.from(h[s])))}),this):e},is:function(t){var i=l(t),n=!0,r=this;return p(u,function(t,s){var o,a=i[s.cache];return a&&(o=r[s.cache]||s.to&&s.to(r._rgba)||[],p(s.props,function(t,i){return null!=a[i.idx]?n=a[i.idx]===o[i.idx]:e})),n}),n},_space:function(){var t=[],e=this;return p(u,function(i,n){e[n.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var n=l(t),r=n._space(),s=u[r],o=0===this.alpha()?l(\"transparent\"):this,a=o[s.cache]||s.to(o._rgba),h=a.slice();return n=n[s.cache],p(s.props,function(t,r){var s=r.idx,o=a[s],l=n[s],u=c[r.type]||{};null!==l&&(null===o?h[s]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[s]=i((l-o)*e+o,r)))}),this[r](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),n=i.pop(),r=l(e)._rgba;return l(t.map(i,function(t,e){return(1-n)*r[e]+n*t}))},toRgbaString:function(){var e=\"rgba(\",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e=\"rgb(\"),e+i.join()+\")\"},toHslaString:function(){var e=\"hsla(\",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+\"%\"),t});return 1===i[3]&&(i.pop(),e=\"hsl(\"),e+i.join()+\")\"},toHexString:function(e){var i=this._rgba.slice(),n=i.pop();return e&&i.push(~~(255*n)),\"#\"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?\"0\"+t:t}).join(\"\")},toString:function(){return 0===this._rgba[3]?\"transparent\":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,n=t[0]/255,r=t[1]/255,s=t[2]/255,o=t[3],a=Math.max(n,r,s),l=Math.min(n,r,s),u=a-l,c=a+l,h=.5*c;return e=l===a?0:n===a?60*(r-s)/u+360:r===a?60*(s-n)/u+120:60*(n-r)/u+240,i=0===u?0:.5>=h?u/c:u/(2-c),[Math.round(e)%360,i,h,null==o?1:o]},u.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],n=t[2],s=t[3],o=.5>=n?n*(1+i):n+i-n*i,a=2*n-o;return[Math.round(255*r(a,o,e+1/3)),Math.round(255*r(a,o,e)),Math.round(255*r(a,o,e-1/3)),s]},p(u,function(n,r){var s=r.props,a=r.cache,u=r.to,c=r.from;l.fn[n]=function(n){if(u&&!this[a]&&(this[a]=u(this._rgba)),n===e)return this[a].slice();var r,o=t.type(n),h=\"array\"===o||\"object\"===o?n:arguments,d=this[a].slice();return p(s,function(t,e){var n=h[\"object\"===o?t:e.idx];null==n&&(n=d[e.idx]),d[e.idx]=i(n,e)}),c?(r=l(c(d)),r[a]=d,r):l(d)},p(s,function(e,i){l.fn[e]||(l.fn[e]=function(r){var s,a=t.type(r),l=\"alpha\"===e?this._hsla?\"hsla\":\"rgba\":n,u=this[l](),c=u[i.idx];return\"undefined\"===a?c:(\"function\"===a&&(r=r.call(this,c),a=t.type(r)),null==r&&i.empty?this:(\"string\"===a&&(s=o.exec(r))&&(r=c+parseFloat(s[2])*(\"+\"===s[1]?1:-1)),u[i.idx]=r,this[l](u)))})})}),l.hook=function(e){var i=e.split(\" \");p(i,function(e,i){t.cssHooks[i]={set:function(e,r){var s,o,a=\"\";if(\"transparent\"!==r&&(\"string\"!==t.type(r)||(s=n(r)))){if(r=l(s||r),!h.rgba&&1!==r._rgba[3]){for(o=\"backgroundColor\"===i?e.parentNode:e;(\"\"===a||\"transparent\"===a)&&o&&o.style;)try{a=t.css(o,\"backgroundColor\"),o=o.parentNode}catch(t){}r=r.blend(a&&\"transparent\"!==a?a:\"_default\")}r=r.toRgbaString()}try{e.style[i]=r}catch(t){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(\"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\"),t.cssHooks.borderColor={expand:function(t){var e={};return p([\"Top\",\"Right\",\"Bottom\",\"Left\"],function(i,n){e[\"border\"+n+\"Color\"]=t}),e}},s=t.Color.names={aqua:\"#00ffff\",black:\"#000000\",blue:\"#0000ff\",fuchsia:\"#ff00ff\",gray:\"#808080\",green:\"#008000\",lime:\"#00ff00\",maroon:\"#800000\",navy:\"#000080\",olive:\"#808000\",purple:\"#800080\",red:\"#ff0000\",silver:\"#c0c0c0\",teal:\"#008080\",white:\"#ffffff\",yellow:\"#ffff00\",transparent:[null,null,null,0],_default:\"#ffffff\"}}(v),function(){function e(e){var i,n,r=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,s={};if(r&&r.length&&r[0]&&r[r[0]])for(n=r.length;n--;)i=r[n],\"string\"==typeof r[i]&&(s[t.camelCase(i)]=r[i]);else for(i in r)\"string\"==typeof r[i]&&(s[i]=r[i]);return s}function i(e,i){var n,s,o={};for(n in i)s=i[n],e[n]!==s&&(r[n]||(t.fx.step[n]||!isNaN(parseFloat(s)))&&(o[n]=s));return o}var n=[\"add\",\"remove\",\"toggle\"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each([\"borderLeftStyle\",\"borderRightStyle\",\"borderBottomStyle\",\"borderTopStyle\"],function(e,i){t.fx.step[i]=function(t){(\"none\"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(v.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(r,s,o,a){var l=t.speed(s,o,a);return this.queue(function(){var s,o=t(this),a=o.attr(\"class\")||\"\",u=l.children?o.find(\"*\").addBack():o;u=u.map(function(){return{el:t(this),start:e(this)}}),s=function(){t.each(n,function(t,e){r[e]&&o[e+\"Class\"](r[e])})},s(),u=u.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr(\"class\",a),u=u.map(function(){var e=this,i=t.Deferred(),n=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,n),i.promise()}),t.when.apply(t,u.get()).done(function(){s(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,\"\")})}),l.complete.call(o[0])})})},t.fn.extend({addClass:function(e){return function(i,n,r,s){return n?t.effects.animateClass.call(this,{add:i},n,r,s):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,n,r,s){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},n,r,s):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,n,r,s,o){return\"boolean\"==typeof n||void 0===n?r?t.effects.animateClass.call(this,n?{add:i}:{remove:i},r,s,o):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},n,r,s)}}(t.fn.toggleClass),switchClass:function(e,i,n,r,s){return t.effects.animateClass.call(this,{add:i,remove:e},n,r,s)}})}(),function(){function e(e,i,n,r){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(r=i,n=null,i={}),(\"number\"==typeof i||t.fx.speeds[i])&&(r=n,n=i,i={}),t.isFunction(n)&&(r=n,n=null),i&&t.extend(e,i),n=n||i.duration,e.duration=t.fx.off?0:\"number\"==typeof n?n:n in t.fx.speeds?t.fx.speeds[n]:t.fx.speeds._default,e.complete=r||i.complete,e}function i(e){return!(e&&\"number\"!=typeof e&&!t.fx.speeds[e])||(\"string\"==typeof e&&!t.effects.effect[e]||(!!t.isFunction(e)||\"object\"==typeof e&&!e.effect))}function n(t,e){var i=e.outerWidth(),n=e.outerHeight(),r=/^rect\\((-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto)\\)$/,s=r.exec(t)||[\"\",0,i,n,0];return{top:parseFloat(s[1])||0,right:\"auto\"===s[2]?i:parseFloat(s[2]),bottom:\"auto\"===s[3]?n:parseFloat(s[3]),left:parseFloat(s[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(m)||e(i)}}(t.expr.filters.animated)),!1!==t.uiBackCompat&&t.extend(t.effects,{save:function(t,e){for(var i=0,n=e.length;n>i;i++)null!==e[i]&&t.data(f+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,n=0,r=e.length;r>n;n++)null!==e[n]&&(i=t.data(f+e[n]),t.css(e[n],i))},setMode:function(t,e){return\"toggle\"===e&&(e=t.is(\":hidden\")?\"show\":\"hide\"),e},createWrapper:function(e){if(e.parent().is(\".ui-effects-wrapper\"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),float:e.css(\"float\")},n=t(\"<div></div>\").addClass(\"ui-effects-wrapper\").css({fontSize:\"100%\",background:\"transparent\",border:\"none\",margin:0,padding:0}),r={width:e.width(),height:e.height()},s=document.activeElement;try{s.id}catch(t){s=document.body}return e.wrap(n),(e[0]===s||t.contains(e[0],s))&&t(s).trigger(\"focus\"),n=e.parent(),\"static\"===e.css(\"position\")?(n.css({position:\"relative\"}),e.css({position:\"relative\"})):(t.extend(i,{position:e.css(\"position\"),zIndex:e.css(\"z-index\")}),t.each([\"top\",\"left\",\"bottom\",\"right\"],function(t,n){i[n]=e.css(n),isNaN(parseInt(i[n],10))&&(i[n]=\"auto\")}),e.css({position:\"relative\",top:0,left:0,right:\"auto\",bottom:\"auto\"})),e.css(r),n.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(\".ui-effects-wrapper\")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger(\"focus\")),e}}),t.extend(t.effects,{version:\"1.12.1\",define:function(e,i,n){return n||(n=i,i=\"effect\"),t.effects.effect[e]=n,t.effects.effect[e].mode=i,n},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var n=\"horizontal\"!==i?(e||100)/100:1,r=\"vertical\"!==i?(e||100)/100:1;return{height:t.height()*r,width:t.width()*n,outerHeight:t.outerHeight()*r,outerWidth:t.outerWidth()*n}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var n=t.queue();e>1&&n.splice.apply(n,[1,0].concat(n.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(g,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(g)||\"\",t.removeData(g)},mode:function(t,e){var i=t.is(\":hidden\");return\"toggle\"===e&&(e=i?\"show\":\"hide\"),(i?\"hide\"===e:\"show\"===e)&&(e=\"none\"),e},getBaseline:function(t,e){var i,n;switch(t[0]){case\"top\":i=0;break;case\"middle\":i=.5;break;case\"bottom\":i=1;break;default:i=t[0]/e.height}switch(t[1]){case\"left\":n=0;break;case\"center\":n=.5;break;case\"right\":n=1;break;default:n=t[1]/e.width}return{x:n,y:i}},createPlaceholder:function(e){var i,n=e.css(\"position\"),r=e.position();return e.css({marginTop:e.css(\"marginTop\"),marginBottom:e.css(\"marginBottom\"),marginLeft:e.css(\"marginLeft\"),marginRight:e.css(\"marginRight\")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(n)&&(n=\"absolute\",i=t(\"<\"+e[0].nodeName+\">\").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css(\"display\"))?\"inline-block\":\"block\",visibility:\"hidden\",marginTop:e.css(\"marginTop\"),marginBottom:e.css(\"marginBottom\"),marginLeft:e.css(\"marginLeft\"),marginRight:e.css(\"marginRight\"),float:e.css(\"float\")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass(\"ui-effects-placeholder\"),e.data(f+\"placeholder\",i)),e.css({position:n,left:r.left,top:r.top}),i},removePlaceholder:function(t){var e=f+\"placeholder\",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,n,r){return r=r||{},t.each(i,function(t,i){var s=e.cssUnit(i);s[0]>0&&(r[i]=s[0]*n+s[1])}),r}}),t.fn.extend({effect:function(){function i(e){function i(){a.removeData(m),t.effects.cleanUp(a),\"hide\"===n.mode&&a.hide(),o()}function o(){t.isFunction(l)&&l.call(a[0]),t.isFunction(e)&&e()}var a=t(this);n.mode=c.shift(),!1===t.uiBackCompat||s?\"none\"===n.mode?(a[u](),o()):r.call(a[0],n,i):(a.is(\":hidden\")?\"hide\"===u:\"show\"===u)?(a[u](),o()):r.call(a[0],n,o)}var n=e.apply(this,arguments),r=t.effects.effect[n.effect],s=r.mode,o=n.queue,a=o||\"fx\",l=n.complete,u=n.mode,c=[],h=function(e){var i=t(this),n=t.effects.mode(i,u)||s;i.data(m,!0),c.push(n),s&&(\"show\"===n||n===s&&\"hide\"===n)&&i.show(),s&&\"none\"===n||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!r?u?this[u](n.duration,l):this.each(function(){l&&l.call(this)}):!1===o?this.each(h).each(i):this.queue(a,h).queue(a,i)},show:function(t){return function(n){if(i(n))return t.apply(this,arguments);var r=e.apply(this,arguments);return r.mode=\"show\",this.effect.call(this,r)}}(t.fn.show),hide:function(t){return function(n){if(i(n))return t.apply(this,arguments);var r=e.apply(this,arguments);return r.mode=\"hide\",this.effect.call(this,r)}}(t.fn.hide),toggle:function(t){return function(n){if(i(n)||\"boolean\"==typeof n)return t.apply(this,arguments);var r=e.apply(this,arguments);return r.mode=\"toggle\",this.effect.call(this,r)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),n=[];return t.each([\"em\",\"px\",\"%\",\"pt\"],function(t,e){i.indexOf(e)>0&&(n=[parseFloat(i),e])}),n},cssClip:function(t){return t?this.css(\"clip\",\"rect(\"+t.top+\"px \"+t.right+\"px \"+t.bottom+\"px \"+t.left+\"px)\"):n(this.css(\"clip\"),this)},transfer:function(e,i){var n=t(this),r=t(e.to),s=\"fixed\"===r.css(\"position\"),o=t(\"body\"),a=s?o.scrollTop():0,l=s?o.scrollLeft():0,u=r.offset(),c={top:u.top-a,left:u.left-l,height:r.innerHeight(),width:r.innerWidth()},h=n.offset(),d=t(\"<div class='ui-effects-transfer'></div>\").appendTo(\"body\").addClass(e.className).css({top:h.top-a,left:h.left-l,height:n.innerHeight(),width:n.innerWidth(),position:s?\"fixed\":\"absolute\"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),\"string\"==typeof e.end&&(e.end=n(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each([\"Quad\",\"Cubic\",\"Quart\",\"Quint\",\"Expo\"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing[\"easeIn\"+e]=i,t.easing[\"easeOut\"+e]=function(t){return 1-i(1-t)},t.easing[\"easeInOut\"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();t.effects;t.effects.define(\"blind\",\"hide\",function(e,i){var n={up:[\"bottom\",\"top\"],vertical:[\"bottom\",\"top\"],down:[\"top\",\"bottom\"],left:[\"right\",\"left\"],horizontal:[\"right\",\"left\"],right:[\"left\",\"right\"]},r=t(this),s=e.direction||\"up\",o=r.cssClip(),a={clip:t.extend({},o)},l=t.effects.createPlaceholder(r);a.clip[n[s][0]]=a.clip[n[s][1]],\"show\"===e.mode&&(r.cssClip(a.clip),l&&l.css(t.effects.clipToBox(a)),a.clip=o),l&&l.animate(t.effects.clipToBox(a),e.duration,e.easing),r.animate(a,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define(\"bounce\",function(e,i){var n,r,s,o=t(this),a=e.mode,l=\"hide\"===a,u=\"show\"===a,c=e.direction||\"up\",h=e.distance,d=e.times||5,p=2*d+(u||l?1:0),f=e.duration/p,g=e.easing,m=\"up\"===c||\"down\"===c?\"top\":\"left\",v=\"up\"===c||\"left\"===c,_=0,y=o.queue().length;for(t.effects.createPlaceholder(o),s=o.css(m),h||(h=o[\"top\"===m?\"outerHeight\":\"outerWidth\"]()/3),u&&(r={opacity:1},r[m]=s,o.css(\"opacity\",0).css(m,v?2*-h:2*h).animate(r,f,g)),l&&(h/=Math.pow(2,d-1)),r={},r[m]=s;d>_;_++)n={},n[m]=(v?\"-=\":\"+=\")+h,o.animate(n,f,g).animate(r,f,g),h=l?2*h:h/2;l&&(n={opacity:0},n[m]=(v?\"-=\":\"+=\")+h,o.animate(n,f,g)),o.queue(i),t.effects.unshift(o,y,p+1)}),t.effects.define(\"clip\",\"hide\",function(e,i){var n,r={},s=t(this),o=e.direction||\"vertical\",a=\"both\"===o,l=a||\"horizontal\"===o,u=a||\"vertical\"===o;n=s.cssClip(),r.clip={top:u?(n.bottom-n.top)/2:n.top,right:l?(n.right-n.left)/2:n.right,bottom:u?(n.bottom-n.top)/2:n.bottom,left:l?(n.right-n.left)/2:n.left},t.effects.createPlaceholder(s),\"show\"===e.mode&&(s.cssClip(r.clip),r.clip=n),s.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define(\"drop\",\"hide\",function(e,i){var n,r=t(this),s=e.mode,o=\"show\"===s,a=e.direction||\"left\",l=\"up\"===a||\"down\"===a?\"top\":\"left\",u=\"up\"===a||\"left\"===a?\"-=\":\"+=\",c=\"+=\"===u?\"-=\":\"+=\",h={opacity:0};t.effects.createPlaceholder(r),n=e.distance||r[\"top\"===l?\"outerHeight\":\"outerWidth\"](!0)/2,h[l]=u+n,o&&(r.css(h),h[l]=c+n,h.opacity=1),r.animate(h,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define(\"explode\",\"hide\",function(e,i){function n(){y.push(this),y.length===h*d&&r()}function r(){p.css({visibility:\"visible\"}),t(y).remove(),i()}var s,o,a,l,u,c,h=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=h,p=t(this),f=e.mode,g=\"show\"===f,m=p.show().css(\"visibility\",\"hidden\").offset(),v=Math.ceil(p.outerWidth()/d),_=Math.ceil(p.outerHeight()/h),y=[];for(s=0;h>s;s++)for(l=m.top+s*_,c=s-(h-1)/2,o=0;d>o;o++)a=m.left+o*v,u=o-(d-1)/2,p.clone().appendTo(\"body\").wrap(\"<div></div>\").css({position:\"absolute\",visibility:\"visible\",left:-o*v,top:-s*_}).parent().addClass(\"ui-effects-explode\").css({position:\"absolute\",overflow:\"hidden\",width:v,height:_,left:a+(g?u*v:0),top:l+(g?c*_:0),opacity:g?0:1}).animate({left:a+(g?0:u*v),top:l+(g?0:c*_),opacity:g?1:0},e.duration||500,e.easing,n)}),t.effects.define(\"fade\",\"toggle\",function(e,i){var n=\"show\"===e.mode;t(this).css(\"opacity\",n?0:1).animate({opacity:n?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define(\"fold\",\"hide\",function(e,i){var n=t(this),r=e.mode,s=\"show\"===r,o=\"hide\"===r,a=e.size||15,l=/([0-9]+)%/.exec(a),u=!!e.horizFirst,c=u?[\"right\",\"bottom\"]:[\"bottom\",\"right\"],h=e.duration/2,d=t.effects.createPlaceholder(n),p=n.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],v=n.queue().length;l&&(a=parseInt(l[1],10)/100*m[o?0:1]),f.clip[c[0]]=a,g.clip[c[0]]=a,g.clip[c[1]]=0,s&&(n.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),n.queue(function(i){d&&d.animate(t.effects.clipToBox(f),h,e.easing).animate(t.effects.clipToBox(g),h,e.easing),i()}).animate(f,h,e.easing).animate(g,h,e.easing).queue(i),t.effects.unshift(n,v,4)}),t.effects.define(\"highlight\",\"show\",function(e,i){var n=t(this),r={backgroundColor:n.css(\"backgroundColor\")};\"hide\"===e.mode&&(r.opacity=0),t.effects.saveStyle(n),n.css({backgroundImage:\"none\",backgroundColor:e.color||\"#ffff99\"}).animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define(\"size\",function(e,i){var n,r,s,o=t(this),a=[\"fontSize\"],l=[\"borderTopWidth\",\"borderBottomWidth\",\"paddingTop\",\"paddingBottom\"],u=[\"borderLeftWidth\",\"borderRightWidth\",\"paddingLeft\",\"paddingRight\"],c=e.mode,h=\"effect\"!==c,d=e.scale||\"both\",p=e.origin||[\"middle\",\"center\"],f=o.css(\"position\"),g=o.position(),m=t.effects.scaledDimensions(o),v=e.from||m,_=e.to||t.effects.scaledDimensions(o,0);t.effects.createPlaceholder(o),\"show\"===c&&(s=v,v=_,_=s),r={from:{y:v.height/m.height,x:v.width/m.width},to:{y:_.height/m.height,x:_.width/m.width}},(\"box\"===d||\"both\"===d)&&(r.from.y!==r.to.y&&(v=t.effects.setTransition(o,l,r.from.y,v),_=t.effects.setTransition(o,l,r.to.y,_)),r.from.x!==r.to.x&&(v=t.effects.setTransition(o,u,r.from.x,v),_=t.effects.setTransition(o,u,r.to.x,_))),(\"content\"===d||\"both\"===d)&&r.from.y!==r.to.y&&(v=t.effects.setTransition(o,a,r.from.y,v),_=t.effects.setTransition(o,a,r.to.y,_)),p&&(n=t.effects.getBaseline(p,m),v.top=(m.outerHeight-v.outerHeight)*n.y+g.top,v.left=(m.outerWidth-v.outerWidth)*n.x+g.left,_.top=(m.outerHeight-_.outerHeight)*n.y+g.top,_.left=(m.outerWidth-_.outerWidth)*n.x+g.left),o.css(v),(\"content\"===d||\"both\"===d)&&(l=l.concat([\"marginTop\",\"marginBottom\"]).concat(a),u=u.concat([\"marginLeft\",\"marginRight\"]),o.find(\"*[width]\").each(function(){var i=t(this),n=t.effects.scaledDimensions(i),s={height:n.height*r.from.y,width:n.width*r.from.x,outerHeight:n.outerHeight*r.from.y,outerWidth:n.outerWidth*r.from.x},o={height:n.height*r.to.y,width:n.width*r.to.x,outerHeight:n.height*r.to.y,outerWidth:n.width*r.to.x};r.from.y!==r.to.y&&(s=t.effects.setTransition(i,l,r.from.y,s),o=t.effects.setTransition(i,l,r.to.y,o)),r.from.x!==r.to.x&&(s=t.effects.setTransition(i,u,r.from.x,s),o=t.effects.setTransition(i,u,r.to.x,o)),h&&t.effects.saveStyle(i),i.css(s),i.animate(o,e.duration,e.easing,function(){h&&t.effects.restoreStyle(i)})})),o.animate(_,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=o.offset();0===_.opacity&&o.css(\"opacity\",v.opacity),h||(o.css(\"position\",\"static\"===f?\"relative\":f).offset(e),t.effects.saveStyle(o)),i()}})}),t.effects.define(\"scale\",function(e,i){var n=t(this),r=e.mode,s=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:\"effect\"!==r?0:100),o=t.extend(!0,{from:t.effects.scaledDimensions(n),to:t.effects.scaledDimensions(n,s,e.direction||\"both\"),origin:e.origin||[\"middle\",\"center\"]},e);e.fade&&(o.from.opacity=1,o.to.opacity=0),t.effects.effect.size.call(this,o,i)}),t.effects.define(\"puff\",\"hide\",function(e,i){var n=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,n,i)}),t.effects.define(\"pulsate\",\"show\",function(e,i){var n=t(this),r=e.mode,s=\"show\"===r,o=\"hide\"===r,a=s||o,l=2*(e.times||5)+(a?1:0),u=e.duration/l,c=0,h=1,d=n.queue().length;for((s||!n.is(\":visible\"))&&(n.css(\"opacity\",0).show(),c=1);l>h;h++)n.animate({opacity:c},u,e.easing),c=1-c;n.animate({opacity:c},u,e.easing),n.queue(i),t.effects.unshift(n,d,l+1)}),t.effects.define(\"shake\",function(e,i){var n=1,r=t(this),s=e.direction||\"left\",o=e.distance||20,a=e.times||3,l=2*a+1,u=Math.round(e.duration/l),c=\"up\"===s||\"down\"===s?\"top\":\"left\",h=\"up\"===s||\"left\"===s,d={},p={},f={},g=r.queue().length;for(t.effects.createPlaceholder(r),d[c]=(h?\"-=\":\"+=\")+o,p[c]=(h?\"+=\":\"-=\")+2*o,f[c]=(h?\"-=\":\"+=\")+2*o,r.animate(d,u,e.easing);a>n;n++)r.animate(p,u,e.easing).animate(f,u,e.easing);r.animate(p,u,e.easing).animate(d,u/2,e.easing).queue(i),t.effects.unshift(r,g,l+1)}),t.effects.define(\"slide\",\"show\",function(e,i){var n,r,s=t(this),o={up:[\"bottom\",\"top\"],down:[\"top\",\"bottom\"],left:[\"right\",\"left\"],right:[\"left\",\"right\"]},a=e.mode,l=e.direction||\"left\",u=\"up\"===l||\"down\"===l?\"top\":\"left\",c=\"up\"===l||\"left\"===l,h=e.distance||s[\"top\"===u?\"outerHeight\":\"outerWidth\"](!0),d={};t.effects.createPlaceholder(s),n=s.cssClip(),r=s.position()[u],d[u]=(c?-1:1)*h+r,d.clip=s.cssClip(),d.clip[o[l][1]]=d.clip[o[l][0]],\"show\"===a&&(s.cssClip(d.clip),s.css(u,d[u]),d.clip=n,d[u]=r),s.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});!1!==t.uiBackCompat&&t.effects.define(\"transfer\",function(e,i){t(this).transfer(e,i)})})},function(t,e,i){var n,r,s;!function(o){r=[i(3)],n=o,void 0!==(s=\"function\"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){return t.ui=t.ui||{},t.ui.version=\"1.12.1\"})},function(t,e,i){var n,r,s;/*!\n * jQuery UI Widget 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n!function(o){r=[i(3),i(30)],n=o,void 0!==(s=\"function\"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){var e=0,i=Array.prototype.slice;return t.cleanData=function(e){return function(i){var n,r,s;for(s=0;null!=(r=i[s]);s++)try{n=t._data(r,\"events\"),n&&n.remove&&t(r).triggerHandler(\"remove\")}catch(t){}e(i)}}(t.cleanData),t.widget=function(e,i,n){var r,s,o,a={},l=e.split(\".\")[0];e=e.split(\".\")[1];var u=l+\"-\"+e;return n||(n=i,i=t.Widget),t.isArray(n)&&(n=t.extend.apply(null,[{}].concat(n))),t.expr[\":\"][u.toLowerCase()]=function(e){return!!t.data(e,u)},t[l]=t[l]||{},r=t[l][e],s=t[l][e]=function(t,e){if(!this._createWidget)return new s(t,e);arguments.length&&this._createWidget(t,e)},t.extend(s,r,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),o=new i,o.options=t.widget.extend({},o.options),t.each(n,function(e,n){if(!t.isFunction(n))return void(a[e]=n);a[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function r(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,s=this._superApply;return this._super=t,this._superApply=r,e=n.apply(this,arguments),this._super=i,this._superApply=s,e}}()}),s.prototype=t.widget.extend(o,{widgetEventPrefix:r?o.widgetEventPrefix||e:e},a,{constructor:s,namespace:l,widgetName:e,widgetFullName:u}),r?(t.each(r._childConstructors,function(e,i){var n=i.prototype;t.widget(n.namespace+\".\"+n.widgetName,s,i._proto)}),delete r._childConstructors):i._childConstructors.push(s),t.widget.bridge(e,s),s},t.widget.extend=function(e){for(var n,r,s=i.call(arguments,1),o=0,a=s.length;o<a;o++)for(n in s[o])r=s[o][n],s[o].hasOwnProperty(n)&&void 0!==r&&(t.isPlainObject(r)?e[n]=t.isPlainObject(e[n])?t.widget.extend({},e[n],r):t.widget.extend({},r):e[n]=r);return e},t.widget.bridge=function(e,n){var r=n.prototype.widgetFullName||e;t.fn[e]=function(s){var o=\"string\"==typeof s,a=i.call(arguments,1),l=this;return o?this.length||\"instance\"!==s?this.each(function(){var i,n=t.data(this,r);return\"instance\"===s?(l=n,!1):n?t.isFunction(n[s])&&\"_\"!==s.charAt(0)?(i=n[s].apply(n,a),i!==n&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error(\"no such method '\"+s+\"' for \"+e+\" widget instance\"):t.error(\"cannot call methods on \"+e+\" prior to initialization; attempted to call method '\"+s+\"'\")}):l=void 0:(a.length&&(s=t.widget.extend.apply(null,[s].concat(a))),this.each(function(){var e=t.data(this,r);e?(e.option(s||{}),e._init&&e._init()):t.data(this,r,new n(s,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",defaultElement:\"<div>\",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,n){n=t(n||this.defaultElement||this)[0],this.element=t(n),this.uuid=e++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},n!==this&&(t.data(n,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===n&&this.destroy()}}),this.document=t(n.style?n.ownerDocument:n.document||n),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr(\"aria-disabled\"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var n,r,s,o=e;if(0===arguments.length)return t.widget.extend({},this.options);if(\"string\"==typeof e)if(o={},n=e.split(\".\"),e=n.shift(),n.length){for(r=o[e]=t.widget.extend({},this.options[e]),s=0;s<n.length-1;s++)r[n[s]]=r[n[s]]||{},r=r[n[s]];if(e=n.pop(),1===arguments.length)return void 0===r[e]?null:r[e];r[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];o[e]=i}return this._setOptions(o),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return\"classes\"===t&&this._setOptionClasses(e),this.options[t]=e,\"disabled\"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,n,r;for(i in e)r=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&r&&r.length&&(n=t(r.get()),this._removeClass(r,i),n.addClass(this._classes({element:n,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+\"-disabled\",null,!!t),t&&(this._removeClass(this.hoverable,null,\"ui-state-hover\"),this._removeClass(this.focusable,null,\"ui-state-focus\"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,s){var o,a;for(a=0;a<i.length;a++)o=r.classesElementLookup[i[a]]||t(),o=t(e.add?t.unique(o.get().concat(e.element.get())):o.not(e.element).get()),r.classesElementLookup[i[a]]=o,n.push(i[a]),s&&e.classes[i[a]]&&n.push(e.classes[i[a]])}var n=[],r=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:\"_untrackClassesElement\"}),e.keys&&i(e.keys.match(/\\S+/g)||[],!0),e.extra&&i(e.extra.match(/\\S+/g)||[]),n.join(\" \")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(n,r){-1!==t.inArray(e.target,r)&&(i.classesElementLookup[n]=t(r.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,n){n=\"boolean\"==typeof n?n:i;var r=\"string\"==typeof t||null===t,s={extra:r?e:i,keys:r?t:e,element:r?this.element:t,add:n};return s.element.toggleClass(this._classes(s),n),this},_on:function(e,i,n){var r,s=this;\"boolean\"!=typeof e&&(n=i,i=e,e=!1),n?(i=r=t(i),this.bindings=this.bindings.add(i)):(n=i,i=this.element,r=this.widget()),t.each(n,function(n,o){function a(){if(e||!0!==s.options.disabled&&!t(this).hasClass(\"ui-state-disabled\"))return(\"string\"==typeof o?s[o]:o).apply(s,arguments)}\"string\"!=typeof o&&(a.guid=o.guid=o.guid||a.guid||t.guid++);var l=n.match(/^([\\w:-]*)\\s*(.*)$/),u=l[1]+s.eventNamespace,c=l[2];c?r.on(u,c,a):i.on(u,a)})},_off:function(e,i){i=(i||\"\").split(\" \").join(this.eventNamespace+\" \")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return(\"string\"==typeof t?n[t]:t).apply(n,arguments)}var n=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,\"ui-state-hover\")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,\"ui-state-hover\")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,\"ui-state-focus\")},focusout:function(e){this._removeClass(t(e.currentTarget),null,\"ui-state-focus\")}})},_trigger:function(e,i,n){var r,s,o=this.options[e];if(n=n||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],s=i.originalEvent)for(r in s)r in i||(i[r]=s[r]);return this.element.trigger(i,n),!(t.isFunction(o)&&!1===o.apply(this.element[0],[i].concat(n))||i.isDefaultPrevented())}},t.each({show:\"fadeIn\",hide:\"fadeOut\"},function(e,i){t.Widget.prototype[\"_\"+e]=function(n,r,s){\"string\"==typeof r&&(r={effect:r});var o,a=r?!0===r||\"number\"==typeof r?i:r.effect||i:e;r=r||{},\"number\"==typeof r&&(r={duration:r}),o=!t.isEmptyObject(r),r.complete=s,r.delay&&n.delay(r.delay),o&&t.effects&&t.effects.effect[a]?n[e](r):a!==e&&n[a]?n[a](r.duration,r.easing,s):n.queue(function(i){t(this)[e](),s&&s.call(n[0]),i()})}}),t.widget})},function(t,e,i){(function(t,n){var r;(function(){function s(t,e){return t.set(e[0],e[1]),t}function o(t,e){return t.add(e),t}function a(t,e,i){switch(i.length){case 0:return t.call(e);case 1:return t.call(e,i[0]);case 2:return t.call(e,i[0],i[1]);case 3:return t.call(e,i[0],i[1],i[2])}return t.apply(e,i)}function l(t,e,i,n){for(var r=-1,s=null==t?0:t.length;++r<s;){var o=t[r];e(n,o,i(o),t)}return n}function u(t,e){for(var i=-1,n=null==t?0:t.length;++i<n&&!1!==e(t[i],i,t););return t}function c(t,e){for(var i=null==t?0:t.length;i--&&!1!==e(t[i],i,t););return t}function h(t,e){for(var i=-1,n=null==t?0:t.length;++i<n;)if(!e(t[i],i,t))return!1;return!0}function d(t,e){for(var i=-1,n=null==t?0:t.length,r=0,s=[];++i<n;){var o=t[i];e(o,i,t)&&(s[r++]=o)}return s}function p(t,e){return!!(null==t?0:t.length)&&k(t,e,0)>-1}function f(t,e,i){for(var n=-1,r=null==t?0:t.length;++n<r;)if(i(e,t[n]))return!0;return!1}function g(t,e){for(var i=-1,n=null==t?0:t.length,r=Array(n);++i<n;)r[i]=e(t[i],i,t);return r}function m(t,e){for(var i=-1,n=e.length,r=t.length;++i<n;)t[r+i]=e[i];return t}function v(t,e,i,n){var r=-1,s=null==t?0:t.length;for(n&&s&&(i=t[++r]);++r<s;)i=e(i,t[r],r,t);return i}function _(t,e,i,n){var r=null==t?0:t.length;for(n&&r&&(i=t[--r]);r--;)i=e(i,t[r],r,t);return i}function y(t,e){for(var i=-1,n=null==t?0:t.length;++i<n;)if(e(t[i],i,t))return!0;return!1}function b(t){return t.split(\"\")}function w(t){return t.match(Fe)||[]}function x(t,e,i){var n;return i(t,function(t,i,r){if(e(t,i,r))return n=i,!1}),n}function C(t,e,i,n){for(var r=t.length,s=i+(n?1:-1);n?s--:++s<r;)if(e(t[s],s,t))return s;return-1}function k(t,e,i){return e===e?Z(t,e,i):C(t,D,i)}function T(t,e,i,n){for(var r=i-1,s=t.length;++r<s;)if(n(t[r],e))return r;return-1}function D(t){return t!==t}function S(t,e){var i=null==t?0:t.length;return i?O(t,e)/i:Mt}function A(t){return function(e){return null==e?rt:e[t]}}function E(t){return function(e){return null==t?rt:t[e]}}function I(t,e,i,n,r){return r(t,function(t,r,s){i=n?(n=!1,t):e(i,t,r,s)}),i}function $(t,e){var i=t.length;for(t.sort(e);i--;)t[i]=t[i].value;return t}function O(t,e){for(var i,n=-1,r=t.length;++n<r;){var s=e(t[n]);s!==rt&&(i=i===rt?s:i+s)}return i}function P(t,e){for(var i=-1,n=Array(t);++i<t;)n[i]=e(i);return n}function N(t,e){return g(e,function(e){return[e,t[e]]})}function M(t){return function(e){return t(e)}}function j(t,e){return g(e,function(e){return t[e]})}function H(t,e){return t.has(e)}function R(t,e){for(var i=-1,n=t.length;++i<n&&k(e,t[i],0)>-1;);return i}function L(t,e){for(var i=t.length;i--&&k(e,t[i],0)>-1;);return i}function F(t,e){for(var i=t.length,n=0;i--;)t[i]===e&&++n;return n}function z(t){return\"\\\\\"+Si[t]}function W(t,e){return null==t?rt:t[e]}function q(t){return _i.test(t)}function B(t){return yi.test(t)}function U(t){for(var e,i=[];!(e=t.next()).done;)i.push(e.value);return i}function Y(t){var e=-1,i=Array(t.size);return t.forEach(function(t,n){i[++e]=[n,t]}),i}function V(t,e){return function(i){return t(e(i))}}function K(t,e){for(var i=-1,n=t.length,r=0,s=[];++i<n;){var o=t[i];o!==e&&o!==ct||(t[i]=ct,s[r++]=i)}return s}function X(t){var e=-1,i=Array(t.size);return t.forEach(function(t){i[++e]=t}),i}function G(t){var e=-1,i=Array(t.size);return t.forEach(function(t){i[++e]=[t,t]}),i}function Z(t,e,i){for(var n=i-1,r=t.length;++n<r;)if(t[n]===e)return n;return-1}function J(t,e,i){for(var n=i+1;n--;)if(t[n]===e)return n;return n}function Q(t){return q(t)?et(t):Bi(t)}function tt(t){return q(t)?it(t):b(t)}function et(t){for(var e=mi.lastIndex=0;mi.test(t);)++e;return e}function it(t){return t.match(mi)||[]}function nt(t){return t.match(vi)||[]}var rt,st=200,ot=\"Unsupported core-js use. Try https://npms.io/search?q=ponyfill.\",at=\"Expected a function\",lt=\"__lodash_hash_undefined__\",ut=500,ct=\"__lodash_placeholder__\",ht=1,dt=2,pt=4,ft=1,gt=2,mt=1,vt=2,_t=4,yt=8,bt=16,wt=32,xt=64,Ct=128,kt=256,Tt=512,Dt=30,St=\"...\",At=800,Et=16,It=1,$t=2,Ot=1/0,Pt=9007199254740991,Nt=1.7976931348623157e308,Mt=NaN,jt=4294967295,Ht=jt-1,Rt=jt>>>1,Lt=[[\"ary\",Ct],[\"bind\",mt],[\"bindKey\",vt],[\"curry\",yt],[\"curryRight\",bt],[\"flip\",Tt],[\"partial\",wt],[\"partialRight\",xt],[\"rearg\",kt]],Ft=\"[object Arguments]\",zt=\"[object Array]\",Wt=\"[object AsyncFunction]\",qt=\"[object Boolean]\",Bt=\"[object Date]\",Ut=\"[object DOMException]\",Yt=\"[object Error]\",Vt=\"[object Function]\",Kt=\"[object GeneratorFunction]\",Xt=\"[object Map]\",Gt=\"[object Number]\",Zt=\"[object Null]\",Jt=\"[object Object]\",Qt=\"[object Proxy]\",te=\"[object RegExp]\",ee=\"[object Set]\",ie=\"[object String]\",ne=\"[object Symbol]\",re=\"[object Undefined]\",se=\"[object WeakMap]\",oe=\"[object WeakSet]\",ae=\"[object ArrayBuffer]\",le=\"[object DataView]\",ue=\"[object Float32Array]\",ce=\"[object Float64Array]\",he=\"[object Int8Array]\",de=\"[object Int16Array]\",pe=\"[object Int32Array]\",fe=\"[object Uint8Array]\",ge=\"[object Uint8ClampedArray]\",me=\"[object Uint16Array]\",ve=\"[object Uint32Array]\",_e=/\\b__p \\+= '';/g,ye=/\\b(__p \\+=) '' \\+/g,be=/(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g,we=/&(?:amp|lt|gt|quot|#39);/g,xe=/[&<>\"']/g,Ce=RegExp(we.source),ke=RegExp(xe.source),Te=/<%-([\\s\\S]+?)%>/g,De=/<%([\\s\\S]+?)%>/g,Se=/<%=([\\s\\S]+?)%>/g,Ae=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,Ee=/^\\w*$/,Ie=/^\\./,$e=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,Oe=/[\\\\^$.*+?()[\\]{}|]/g,Pe=RegExp(Oe.source),Ne=/^\\s+|\\s+$/g,Me=/^\\s+/,je=/\\s+$/,He=/\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,Re=/\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,Le=/,? & /,Fe=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g,ze=/\\\\(\\\\)?/g,We=/\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g,qe=/\\w*$/,Be=/^[-+]0x[0-9a-f]+$/i,Ue=/^0b[01]+$/i,Ye=/^\\[object .+?Constructor\\]$/,Ve=/^0o[0-7]+$/i,Ke=/^(?:0|[1-9]\\d*)$/,Xe=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,Ge=/($^)/,Ze=/['\\n\\r\\u2028\\u2029\\\\]/g,Je=\"\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\",Qe=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",ti=\"[\"+Qe+\"]\",ei=\"[\"+Je+\"]\",ii=\"[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]\",ni=\"[^\\\\ud800-\\\\udfff\"+Qe+\"\\\\d+\\\\u2700-\\\\u27bfa-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xffA-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]\",ri=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",si=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",oi=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",ai=\"[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]\",li=\"(?:\"+ii+\"|\"+ni+\")\",ui=\"(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?\",ci=\"(?:\\\\u200d(?:\"+[\"[^\\\\ud800-\\\\udfff]\",si,oi].join(\"|\")+\")[\\\\ufe0e\\\\ufe0f]?\"+ui+\")*\",hi=\"[\\\\ufe0e\\\\ufe0f]?\"+ui+ci,di=\"(?:\"+[\"[\\\\u2700-\\\\u27bf]\",si,oi].join(\"|\")+\")\"+hi,pi=\"(?:\"+[\"[^\\\\ud800-\\\\udfff]\"+ei+\"?\",ei,si,oi,\"[\\\\ud800-\\\\udfff]\"].join(\"|\")+\")\",fi=RegExp(\"['’]\",\"g\"),gi=RegExp(ei,\"g\"),mi=RegExp(ri+\"(?=\"+ri+\")|\"+pi+hi,\"g\"),vi=RegExp([ai+\"?\"+ii+\"+(?:['’](?:d|ll|m|re|s|t|ve))?(?=\"+[ti,ai,\"$\"].join(\"|\")+\")\",\"(?:[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]|[^\\\\ud800-\\\\udfff\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\d+\\\\u2700-\\\\u27bfa-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xffA-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde])+(?:['’](?:D|LL|M|RE|S|T|VE))?(?=\"+[ti,ai+li,\"$\"].join(\"|\")+\")\",ai+\"?\"+li+\"+(?:['’](?:d|ll|m|re|s|t|ve))?\",ai+\"+(?:['’](?:D|LL|M|RE|S|T|VE))?\",\"\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\dTH)\\\\b)\",\"\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\dth)\\\\b)\",\"\\\\d+\",di].join(\"|\"),\"g\"),_i=RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\"+Je+\"\\\\ufe0e\\\\ufe0f]\"),yi=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,bi=[\"Array\",\"Buffer\",\"DataView\",\"Date\",\"Error\",\"Float32Array\",\"Float64Array\",\"Function\",\"Int8Array\",\"Int16Array\",\"Int32Array\",\"Map\",\"Math\",\"Object\",\"Promise\",\"RegExp\",\"Set\",\"String\",\"Symbol\",\"TypeError\",\"Uint8Array\",\"Uint8ClampedArray\",\"Uint16Array\",\"Uint32Array\",\"WeakMap\",\"_\",\"clearTimeout\",\"isFinite\",\"parseInt\",\"setTimeout\"],wi=-1,xi={};xi[ue]=xi[ce]=xi[he]=xi[de]=xi[pe]=xi[fe]=xi[ge]=xi[me]=xi[ve]=!0,xi[Ft]=xi[zt]=xi[ae]=xi[qt]=xi[le]=xi[Bt]=xi[Yt]=xi[Vt]=xi[Xt]=xi[Gt]=xi[Jt]=xi[te]=xi[ee]=xi[ie]=xi[se]=!1;var Ci={};Ci[Ft]=Ci[zt]=Ci[ae]=Ci[le]=Ci[qt]=Ci[Bt]=Ci[ue]=Ci[ce]=Ci[he]=Ci[de]=Ci[pe]=Ci[Xt]=Ci[Gt]=Ci[Jt]=Ci[te]=Ci[ee]=Ci[ie]=Ci[ne]=Ci[fe]=Ci[ge]=Ci[me]=Ci[ve]=!0,Ci[Yt]=Ci[Vt]=Ci[se]=!1;var ki={\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ą\":\"A\",\"ā\":\"a\",\"ă\":\"a\",\"ą\":\"a\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"Ď\":\"D\",\"Đ\":\"D\",\"ď\":\"d\",\"đ\":\"d\",\"Ē\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ę\":\"E\",\"Ě\":\"E\",\"ē\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ę\":\"e\",\"ě\":\"e\",\"Ĝ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ģ\":\"G\",\"ĝ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ģ\":\"g\",\"Ĥ\":\"H\",\"Ħ\":\"H\",\"ĥ\":\"h\",\"ħ\":\"h\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"Į\":\"I\",\"İ\":\"I\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"į\":\"i\",\"ı\":\"i\",\"Ĵ\":\"J\",\"ĵ\":\"j\",\"Ķ\":\"K\",\"ķ\":\"k\",\"ĸ\":\"k\",\"Ĺ\":\"L\",\"Ļ\":\"L\",\"Ľ\":\"L\",\"Ŀ\":\"L\",\"Ł\":\"L\",\"ĺ\":\"l\",\"ļ\":\"l\",\"ľ\":\"l\",\"ŀ\":\"l\",\"ł\":\"l\",\"Ń\":\"N\",\"Ņ\":\"N\",\"Ň\":\"N\",\"Ŋ\":\"N\",\"ń\":\"n\",\"ņ\":\"n\",\"ň\":\"n\",\"ŋ\":\"n\",\"Ō\":\"O\",\"Ŏ\":\"O\",\"Ő\":\"O\",\"ō\":\"o\",\"ŏ\":\"o\",\"ő\":\"o\",\"Ŕ\":\"R\",\"Ŗ\":\"R\",\"Ř\":\"R\",\"ŕ\":\"r\",\"ŗ\":\"r\",\"ř\":\"r\",\"Ś\":\"S\",\"Ŝ\":\"S\",\"Ş\":\"S\",\"Š\":\"S\",\"ś\":\"s\",\"ŝ\":\"s\",\"ş\":\"s\",\"š\":\"s\",\"Ţ\":\"T\",\"Ť\":\"T\",\"Ŧ\":\"T\",\"ţ\":\"t\",\"ť\":\"t\",\"ŧ\":\"t\",\"Ũ\":\"U\",\"Ū\":\"U\",\"Ŭ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ų\":\"U\",\"ũ\":\"u\",\"ū\":\"u\",\"ŭ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ų\":\"u\",\"Ŵ\":\"W\",\"ŵ\":\"w\",\"Ŷ\":\"Y\",\"ŷ\":\"y\",\"Ÿ\":\"Y\",\"Ź\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"ź\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"IJ\":\"IJ\",\"ij\":\"ij\",\"Œ\":\"Oe\",\"œ\":\"oe\",\"ʼn\":\"'n\",\"ſ\":\"s\"},Ti={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},Di={\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&#39;\":\"'\"},Si={\"\\\\\":\"\\\\\",\"'\":\"'\",\"\\n\":\"n\",\"\\r\":\"r\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},Ai=parseFloat,Ei=parseInt,Ii=\"object\"==typeof t&&t&&t.Object===Object&&t,$i=\"object\"==typeof self&&self&&self.Object===Object&&self,Oi=Ii||$i||Function(\"return this\")(),Pi=\"object\"==typeof e&&e&&!e.nodeType&&e,Ni=Pi&&\"object\"==typeof n&&n&&!n.nodeType&&n,Mi=Ni&&Ni.exports===Pi,ji=Mi&&Ii.process,Hi=function(){try{return ji&&ji.binding&&ji.binding(\"util\")}catch(t){}}(),Ri=Hi&&Hi.isArrayBuffer,Li=Hi&&Hi.isDate,Fi=Hi&&Hi.isMap,zi=Hi&&Hi.isRegExp,Wi=Hi&&Hi.isSet,qi=Hi&&Hi.isTypedArray,Bi=A(\"length\"),Ui=E(ki),Yi=E(Ti),Vi=E(Di),Ki=function t(e){function i(t){if(sl(t)&&!md(t)&&!(t instanceof b)){if(t instanceof r)return t;if(mc.call(t,\"__wrapped__\"))return eo(t)}return new r(t)}function n(){}function r(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=rt}function b(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=jt,this.__views__=[]}function E(){var t=new b(this.__wrapped__);return t.__actions__=Hr(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Hr(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Hr(this.__views__),t}function Z(){if(this.__filtered__){var t=new b(this);t.__dir__=-1,t.__filtered__=!0}else t=this.clone(),t.__dir__*=-1;return t}function et(){var t=this.__wrapped__.value(),e=this.__dir__,i=md(t),n=e<0,r=i?t.length:0,s=Ds(0,r,this.__views__),o=s.start,a=s.end,l=a-o,u=n?a:o-1,c=this.__iteratees__,h=c.length,d=0,p=Yc(l,this.__takeCount__);if(!i||!n&&r==l&&p==l)return _r(t,this.__actions__);var f=[];t:for(;l--&&d<p;){u+=e;for(var g=-1,m=t[u];++g<h;){var v=c[g],_=v.iteratee,y=v.type,b=_(m);if(y==$t)m=b;else if(!b){if(y==It)continue t;break t}}f[d++]=m}return f}function it(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}function Fe(){this.__data__=ih?ih(null):{},this.size=0}function Je(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}function Qe(t){var e=this.__data__;if(ih){var i=e[t];return i===lt?rt:i}return mc.call(e,t)?e[t]:rt}function ti(t){var e=this.__data__;return ih?e[t]!==rt:mc.call(e,t)}function ei(t,e){var i=this.__data__;return this.size+=this.has(t)?0:1,i[t]=ih&&e===rt?lt:e,this}function ii(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}function ni(){this.__data__=[],this.size=0}function ri(t){var e=this.__data__,i=Xi(e,t);return!(i<0)&&(i==e.length-1?e.pop():Ic.call(e,i,1),--this.size,!0)}function si(t){var e=this.__data__,i=Xi(e,t);return i<0?rt:e[i][1]}function oi(t){return Xi(this.__data__,t)>-1}function ai(t,e){var i=this.__data__,n=Xi(i,t);return n<0?(++this.size,i.push([t,e])):i[n][1]=e,this}function li(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}function ui(){this.size=0,this.__data__={hash:new it,map:new(Jc||ii),string:new it}}function ci(t){var e=xs(this,t).delete(t);return this.size-=e?1:0,e}function hi(t){return xs(this,t).get(t)}function di(t){return xs(this,t).has(t)}function pi(t,e){var i=xs(this,t),n=i.size;return i.set(t,e),this.size+=i.size==n?0:1,this}function mi(t){var e=-1,i=null==t?0:t.length;for(this.__data__=new li;++e<i;)this.add(t[e])}function vi(t){return this.__data__.set(t,lt),this}function _i(t){return this.__data__.has(t)}function yi(t){var e=this.__data__=new ii(t);this.size=e.size}function ki(){this.__data__=new ii,this.size=0}function Ti(t){var e=this.__data__,i=e.delete(t);return this.size=e.size,i}function Di(t){return this.__data__.get(t)}function Si(t){return this.__data__.has(t)}function Ii(t,e){var i=this.__data__;if(i instanceof ii){var n=i.__data__;if(!Jc||n.length<st-1)return n.push([t,e]),this.size=++i.size,this;i=this.__data__=new li(n)}return i.set(t,e),this.size=i.size,this}function $i(t,e){var i=md(t),n=!i&&gd(t),r=!i&&!n&&_d(t),s=!i&&!n&&!r&&Cd(t),o=i||n||r||s,a=o?P(t.length,uc):[],l=a.length;for(var u in t)!e&&!mc.call(t,u)||o&&(\"length\"==u||r&&(\"offset\"==u||\"parent\"==u)||s&&(\"buffer\"==u||\"byteLength\"==u||\"byteOffset\"==u)||Ns(u,l))||a.push(u);return a}function Pi(t){var e=t.length;return e?t[Qn(0,e-1)]:rt}function Ni(t,e){return Zs(Hr(t),en(e,0,t.length))}function ji(t){return Zs(Hr(t))}function Hi(t,e,i){(i===rt||Ua(t[e],i))&&(i!==rt||e in t)||Qi(t,e,i)}function Bi(t,e,i){var n=t[e];mc.call(t,e)&&Ua(n,i)&&(i!==rt||e in t)||Qi(t,e,i)}function Xi(t,e){for(var i=t.length;i--;)if(Ua(t[i][0],e))return i;return-1}function Gi(t,e,i,n){return fh(t,function(t,r,s){e(n,t,i(t),s)}),n}function Zi(t,e){return t&&Rr(e,Fl(e),t)}function Ji(t,e){return t&&Rr(e,zl(e),t)}function Qi(t,e,i){\"__proto__\"==e&&Nc?Nc(t,e,{configurable:!0,enumerable:!0,value:i,writable:!0}):t[e]=i}function tn(t,e){for(var i=-1,n=e.length,r=ic(n),s=null==t;++i<n;)r[i]=s?rt:Hl(t,e[i]);return r}function en(t,e,i){return t===t&&(i!==rt&&(t=t<=i?t:i),e!==rt&&(t=t>=e?t:e)),t}function nn(t,e,i,n,r,s){var o,a=e&ht,l=e&dt,c=e&pt;if(i&&(o=r?i(t,n,r,s):i(t)),o!==rt)return o;if(!rl(t))return t;var h=md(t);if(h){if(o=Es(t),!a)return Hr(t,o)}else{var d=Dh(t),p=d==Vt||d==Kt;if(_d(t))return Tr(t,a);if(d==Jt||d==Ft||p&&!r){if(o=l||p?{}:Is(t),!a)return l?Fr(t,Ji(o,t)):Lr(t,Zi(o,t))}else{if(!Ci[d])return r?t:{};o=$s(t,d,nn,a)}}s||(s=new yi);var f=s.get(t);if(f)return f;s.set(t,o);var g=c?l?_s:vs:l?zl:Fl,m=h?rt:g(t);return u(m||t,function(n,r){m&&(r=n,n=t[r]),Bi(o,r,nn(n,e,i,r,t,s))}),o}function rn(t){var e=Fl(t);return function(i){return sn(i,t,e)}}function sn(t,e,i){var n=i.length;if(null==t)return!n;for(t=ac(t);n--;){var r=i[n],s=e[r],o=t[r];if(o===rt&&!(r in t)||!s(o))return!1}return!0}function on(t,e,i){if(\"function\"!=typeof t)throw new cc(at);return Eh(function(){t.apply(rt,i)},e)}function an(t,e,i,n){var r=-1,s=p,o=!0,a=t.length,l=[],u=e.length;if(!a)return l;i&&(e=g(e,M(i))),n?(s=f,o=!1):e.length>=st&&(s=H,o=!1,e=new mi(e));t:for(;++r<a;){var c=t[r],h=null==i?c:i(c);if(c=n||0!==c?c:0,o&&h===h){for(var d=u;d--;)if(e[d]===h)continue t;l.push(c)}else s(e,h,n)||l.push(c)}return l}function ln(t,e){var i=!0;return fh(t,function(t,n,r){return i=!!e(t,n,r)}),i}function un(t,e,i){for(var n=-1,r=t.length;++n<r;){var s=t[n],o=e(s);if(null!=o&&(a===rt?o===o&&!ml(o):i(o,a)))var a=o,l=s}return l}function cn(t,e,i,n){var r=t.length;for(i=xl(i),i<0&&(i=-i>r?0:r+i),n=n===rt||n>r?r:xl(n),n<0&&(n+=r),n=i>n?0:Cl(n);i<n;)t[i++]=e;return t}function hn(t,e){var i=[];return fh(t,function(t,n,r){e(t,n,r)&&i.push(t)}),i}function dn(t,e,i,n,r){var s=-1,o=t.length;for(i||(i=Ps),r||(r=[]);++s<o;){var a=t[s];e>0&&i(a)?e>1?dn(a,e-1,i,n,r):m(r,a):n||(r[r.length]=a)}return r}function pn(t,e){return t&&mh(t,e,Fl)}function fn(t,e){return t&&vh(t,e,Fl)}function gn(t,e){return d(e,function(e){return el(t[e])})}function mn(t,e){e=Cr(e,t);for(var i=0,n=e.length;null!=t&&i<n;)t=t[Js(e[i++])];return i&&i==n?t:rt}function vn(t,e,i){var n=e(t);return md(t)?n:m(n,i(t))}function _n(t){return null==t?t===rt?re:Zt:Pc&&Pc in ac(t)?Ts(t):Us(t)}function yn(t,e){return t>e}function bn(t,e){return null!=t&&mc.call(t,e)}function wn(t,e){return null!=t&&e in ac(t)}function xn(t,e,i){return t>=Yc(e,i)&&t<Uc(e,i)}function Cn(t,e,i){for(var n=i?f:p,r=t[0].length,s=t.length,o=s,a=ic(s),l=1/0,u=[];o--;){var c=t[o];o&&e&&(c=g(c,M(e))),l=Yc(c.length,l),a[o]=!i&&(e||r>=120&&c.length>=120)?new mi(o&&c):rt}c=t[0];var h=-1,d=a[0];t:for(;++h<r&&u.length<l;){var m=c[h],v=e?e(m):m;if(m=i||0!==m?m:0,!(d?H(d,v):n(u,v,i))){for(o=s;--o;){var _=a[o];if(!(_?H(_,v):n(t[o],v,i)))continue t}d&&d.push(v),u.push(m)}}return u}function kn(t,e,i,n){return pn(t,function(t,r,s){e(n,i(t),r,s)}),n}function Tn(t,e,i){e=Cr(e,t),t=Vs(t,e);var n=null==t?t:t[Js(wo(e))];return null==n?rt:a(n,t,i)}function Dn(t){return sl(t)&&_n(t)==Ft}function Sn(t){return sl(t)&&_n(t)==ae}function An(t){return sl(t)&&_n(t)==Bt}function En(t,e,i,n,r){return t===e||(null==t||null==e||!sl(t)&&!sl(e)?t!==t&&e!==e:In(t,e,i,n,En,r))}function In(t,e,i,n,r,s){var o=md(t),a=md(e),l=o?zt:Dh(t),u=a?zt:Dh(e);l=l==Ft?Jt:l,u=u==Ft?Jt:u;var c=l==Jt,h=u==Jt,d=l==u;if(d&&_d(t)){if(!_d(e))return!1;o=!0,c=!1}if(d&&!c)return s||(s=new yi),o||Cd(t)?ps(t,e,i,n,r,s):fs(t,e,l,i,n,r,s);if(!(i&ft)){var p=c&&mc.call(t,\"__wrapped__\"),f=h&&mc.call(e,\"__wrapped__\");if(p||f){var g=p?t.value():t,m=f?e.value():e;return s||(s=new yi),r(g,m,i,n,s)}}return!!d&&(s||(s=new yi),gs(t,e,i,n,r,s))}function $n(t){return sl(t)&&Dh(t)==Xt}function On(t,e,i,n){var r=i.length,s=r,o=!n;if(null==t)return!s;for(t=ac(t);r--;){var a=i[r];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++r<s;){a=i[r];var l=a[0],u=t[l],c=a[1];if(o&&a[2]){if(u===rt&&!(l in t))return!1}else{var h=new yi;if(n)var d=n(u,c,l,t,e,h);if(!(d===rt?En(c,u,ft|gt,n,h):d))return!1}}return!0}function Pn(t){return!(!rl(t)||Ls(t))&&(el(t)?xc:Ye).test(Qs(t))}function Nn(t){return sl(t)&&_n(t)==te}function Mn(t){return sl(t)&&Dh(t)==ee}function jn(t){return sl(t)&&nl(t.length)&&!!xi[_n(t)]}function Hn(t){return\"function\"==typeof t?t:null==t?Iu:\"object\"==typeof t?md(t)?qn(t[0],t[1]):Wn(t):Ru(t)}function Rn(t){if(!Fs(t))return Bc(t);var e=[];for(var i in ac(t))mc.call(t,i)&&\"constructor\"!=i&&e.push(i);return e}function Ln(t){if(!rl(t))return Bs(t);var e=Fs(t),i=[];for(var n in t)(\"constructor\"!=n||!e&&mc.call(t,n))&&i.push(n);return i}function Fn(t,e){return t<e}function zn(t,e){var i=-1,n=Ya(t)?ic(t.length):[];return fh(t,function(t,r,s){n[++i]=e(t,r,s)}),n}function Wn(t){var e=Cs(t);return 1==e.length&&e[0][2]?Ws(e[0][0],e[0][1]):function(i){return i===t||On(i,t,e)}}function qn(t,e){return js(t)&&zs(e)?Ws(Js(t),e):function(i){var n=Hl(i,t);return n===rt&&n===e?Ll(i,t):En(e,n,ft|gt)}}function Bn(t,e,i,n,r){t!==e&&mh(e,function(s,o){if(rl(s))r||(r=new yi),Un(t,e,o,i,Bn,n,r);else{var a=n?n(t[o],s,o+\"\",t,e,r):rt;a===rt&&(a=s),Hi(t,o,a)}},zl)}function Un(t,e,i,n,r,s,o){var a=t[i],l=e[i],u=o.get(l);if(u)return void Hi(t,i,u);var c=s?s(a,l,i+\"\",t,e,o):rt,h=c===rt;if(h){var d=md(l),p=!d&&_d(l),f=!d&&!p&&Cd(l);c=l,d||p||f?md(a)?c=a:Va(a)?c=Hr(a):p?(h=!1,c=Tr(l,!0)):f?(h=!1,c=Or(l,!0)):c=[]:pl(l)||gd(l)?(c=a,gd(a)?c=Tl(a):(!rl(a)||n&&el(a))&&(c=Is(l))):h=!1}h&&(o.set(l,c),r(c,l,n,s,o),o.delete(l)),Hi(t,i,c)}function Yn(t,e){var i=t.length;if(i)return e+=e<0?i:0,Ns(e,i)?t[e]:rt}function Vn(t,e,i){var n=-1;return e=g(e.length?e:[Iu],M(ws())),$(zn(t,function(t,i,r){return{criteria:g(e,function(e){return e(t)}),index:++n,value:t}}),function(t,e){return Nr(t,e,i)})}function Kn(t,e){return Xn(t,e,function(e,i){return Ll(t,i)})}function Xn(t,e,i){for(var n=-1,r=e.length,s={};++n<r;){var o=e[n],a=mn(t,o);i(a,o)&&sr(s,Cr(o,t),a)}return s}function Gn(t){return function(e){return mn(e,t)}}function Zn(t,e,i,n){var r=n?T:k,s=-1,o=e.length,a=t;for(t===e&&(e=Hr(e)),i&&(a=g(t,M(i)));++s<o;)for(var l=0,u=e[s],c=i?i(u):u;(l=r(a,c,l,n))>-1;)a!==t&&Ic.call(a,l,1),Ic.call(t,l,1);return t}function Jn(t,e){for(var i=t?e.length:0,n=i-1;i--;){var r=e[i];if(i==n||r!==s){var s=r;Ns(r)?Ic.call(t,r,1):gr(t,r)}}return t}function Qn(t,e){return t+Lc(Xc()*(e-t+1))}function tr(t,e,i,n){for(var r=-1,s=Uc(Rc((e-t)/(i||1)),0),o=ic(s);s--;)o[n?s:++r]=t,t+=i;return o}function er(t,e){var i=\"\";if(!t||e<1||e>Pt)return i;do{e%2&&(i+=t),(e=Lc(e/2))&&(t+=t)}while(e);return i}function ir(t,e){return Ih(Ys(t,e,Iu),t+\"\")}function nr(t){return Pi(Ql(t))}function rr(t,e){var i=Ql(t);return Zs(i,en(e,0,i.length))}function sr(t,e,i,n){if(!rl(t))return t;e=Cr(e,t);for(var r=-1,s=e.length,o=s-1,a=t;null!=a&&++r<s;){var l=Js(e[r]),u=i;if(r!=o){var c=a[l];u=n?n(c,l,a):rt,u===rt&&(u=rl(c)?c:Ns(e[r+1])?[]:{})}Bi(a,l,u),a=a[l]}return t}function or(t){return Zs(Ql(t))}function ar(t,e,i){var n=-1,r=t.length;e<0&&(e=-e>r?0:r+e),i=i>r?r:i,i<0&&(i+=r),r=e>i?0:i-e>>>0,e>>>=0;for(var s=ic(r);++n<r;)s[n]=t[n+e];return s}function lr(t,e){var i;return fh(t,function(t,n,r){return!(i=e(t,n,r))}),!!i}function ur(t,e,i){var n=0,r=null==t?n:t.length;if(\"number\"==typeof e&&e===e&&r<=Rt){for(;n<r;){var s=n+r>>>1,o=t[s];null!==o&&!ml(o)&&(i?o<=e:o<e)?n=s+1:r=s}return r}return cr(t,e,Iu,i)}function cr(t,e,i,n){e=i(e);for(var r=0,s=null==t?0:t.length,o=e!==e,a=null===e,l=ml(e),u=e===rt;r<s;){var c=Lc((r+s)/2),h=i(t[c]),d=h!==rt,p=null===h,f=h===h,g=ml(h);if(o)var m=n||f;else m=u?f&&(n||d):a?f&&d&&(n||!p):l?f&&d&&!p&&(n||!g):!p&&!g&&(n?h<=e:h<e);m?r=c+1:s=c}return Yc(s,Ht)}function hr(t,e){for(var i=-1,n=t.length,r=0,s=[];++i<n;){var o=t[i],a=e?e(o):o;if(!i||!Ua(a,l)){var l=a;s[r++]=0===o?0:o}}return s}function dr(t){return\"number\"==typeof t?t:ml(t)?Mt:+t}function pr(t){if(\"string\"==typeof t)return t;if(md(t))return g(t,pr)+\"\";if(ml(t))return dh?dh.call(t):\"\";var e=t+\"\";return\"0\"==e&&1/t==-Ot?\"-0\":e}function fr(t,e,i){var n=-1,r=p,s=t.length,o=!0,a=[],l=a;if(i)o=!1,r=f;else if(s>=st){var u=e?null:xh(t);if(u)return X(u);o=!1,r=H,l=new mi}else l=e?[]:a;t:for(;++n<s;){var c=t[n],h=e?e(c):c;if(c=i||0!==c?c:0,o&&h===h){for(var d=l.length;d--;)if(l[d]===h)continue t;e&&l.push(h),a.push(c)}else r(l,h,i)||(l!==a&&l.push(h),a.push(c))}return a}function gr(t,e){return e=Cr(e,t),null==(t=Vs(t,e))||delete t[Js(wo(e))]}function mr(t,e,i,n){return sr(t,e,i(mn(t,e)),n)}function vr(t,e,i,n){for(var r=t.length,s=n?r:-1;(n?s--:++s<r)&&e(t[s],s,t););return i?ar(t,n?0:s,n?s+1:r):ar(t,n?s+1:0,n?r:s)}function _r(t,e){var i=t;return i instanceof b&&(i=i.value()),v(e,function(t,e){return e.func.apply(e.thisArg,m([t],e.args))},i)}function yr(t,e,i){var n=t.length;if(n<2)return n?fr(t[0]):[];for(var r=-1,s=ic(n);++r<n;)for(var o=t[r],a=-1;++a<n;)a!=r&&(s[r]=an(s[r]||o,t[a],e,i));return fr(dn(s,1),e,i)}function br(t,e,i){for(var n=-1,r=t.length,s=e.length,o={};++n<r;){var a=n<s?e[n]:rt;i(o,t[n],a)}return o}function wr(t){return Va(t)?t:[]}function xr(t){return\"function\"==typeof t?t:Iu}function Cr(t,e){return md(t)?t:js(t,e)?[t]:$h(Sl(t))}function kr(t,e,i){var n=t.length;return i=i===rt?n:i,!e&&i>=n?t:ar(t,e,i)}function Tr(t,e){if(e)return t.slice();var i=t.length,n=Dc?Dc(i):new t.constructor(i);return t.copy(n),n}function Dr(t){var e=new t.constructor(t.byteLength);return new Tc(e).set(new Tc(t)),e}function Sr(t,e){var i=e?Dr(t.buffer):t.buffer;return new t.constructor(i,t.byteOffset,t.byteLength)}function Ar(t,e,i){return v(e?i(Y(t),ht):Y(t),s,new t.constructor)}function Er(t){var e=new t.constructor(t.source,qe.exec(t));return e.lastIndex=t.lastIndex,e}function Ir(t,e,i){return v(e?i(X(t),ht):X(t),o,new t.constructor)}function $r(t){return hh?ac(hh.call(t)):{}}function Or(t,e){var i=e?Dr(t.buffer):t.buffer;return new t.constructor(i,t.byteOffset,t.length)}function Pr(t,e){if(t!==e){var i=t!==rt,n=null===t,r=t===t,s=ml(t),o=e!==rt,a=null===e,l=e===e,u=ml(e);if(!a&&!u&&!s&&t>e||s&&o&&l&&!a&&!u||n&&o&&l||!i&&l||!r)return 1;if(!n&&!s&&!u&&t<e||u&&i&&r&&!n&&!s||a&&i&&r||!o&&r||!l)return-1}return 0}function Nr(t,e,i){for(var n=-1,r=t.criteria,s=e.criteria,o=r.length,a=i.length;++n<o;){var l=Pr(r[n],s[n]);if(l){if(n>=a)return l;return l*(\"desc\"==i[n]?-1:1)}}return t.index-e.index}function Mr(t,e,i,n){for(var r=-1,s=t.length,o=i.length,a=-1,l=e.length,u=Uc(s-o,0),c=ic(l+u),h=!n;++a<l;)c[a]=e[a];for(;++r<o;)(h||r<s)&&(c[i[r]]=t[r]);for(;u--;)c[a++]=t[r++];return c}function jr(t,e,i,n){for(var r=-1,s=t.length,o=-1,a=i.length,l=-1,u=e.length,c=Uc(s-a,0),h=ic(c+u),d=!n;++r<c;)h[r]=t[r];for(var p=r;++l<u;)h[p+l]=e[l];for(;++o<a;)(d||r<s)&&(h[p+i[o]]=t[r++]);return h}function Hr(t,e){var i=-1,n=t.length;for(e||(e=ic(n));++i<n;)e[i]=t[i];return e}function Rr(t,e,i,n){var r=!i;i||(i={});for(var s=-1,o=e.length;++s<o;){var a=e[s],l=n?n(i[a],t[a],a,i,t):rt;l===rt&&(l=t[a]),r?Qi(i,a,l):Bi(i,a,l)}return i}function Lr(t,e){return Rr(t,kh(t),e)}function Fr(t,e){return Rr(t,Th(t),e)}function zr(t,e){return function(i,n){var r=md(i)?l:Gi,s=e?e():{};return r(i,t,ws(n,2),s)}}function Wr(t){return ir(function(e,i){var n=-1,r=i.length,s=r>1?i[r-1]:rt,o=r>2?i[2]:rt;for(s=t.length>3&&\"function\"==typeof s?(r--,s):rt,o&&Ms(i[0],i[1],o)&&(s=r<3?rt:s,r=1),e=ac(e);++n<r;){var a=i[n];a&&t(e,a,n,s)}return e})}function qr(t,e){return function(i,n){if(null==i)return i;if(!Ya(i))return t(i,n);for(var r=i.length,s=e?r:-1,o=ac(i);(e?s--:++s<r)&&!1!==n(o[s],s,o););return i}}function Br(t){return function(e,i,n){for(var r=-1,s=ac(e),o=n(e),a=o.length;a--;){var l=o[t?a:++r];if(!1===i(s[l],l,s))break}return e}}function Ur(t,e,i){function n(){return(this&&this!==Oi&&this instanceof n?s:t).apply(r?i:this,arguments)}var r=e&mt,s=Kr(t);return n}function Yr(t){return function(e){e=Sl(e);var i=q(e)?tt(e):rt,n=i?i[0]:e.charAt(0),r=i?kr(i,1).join(\"\"):e.slice(1);return n[t]()+r}}function Vr(t){return function(e){return v(Tu(su(e).replace(fi,\"\")),t,\"\")}}function Kr(t){return function(){var e=arguments;switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3]);case 5:return new t(e[0],e[1],e[2],e[3],e[4]);case 6:return new t(e[0],e[1],e[2],e[3],e[4],e[5]);case 7:return new t(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}var i=ph(t.prototype),n=t.apply(i,e);return rl(n)?n:i}}function Xr(t,e,i){function n(){for(var s=arguments.length,o=ic(s),l=s,u=bs(n);l--;)o[l]=arguments[l];var c=s<3&&o[0]!==u&&o[s-1]!==u?[]:K(o,u);return(s-=c.length)<i?os(t,e,Jr,n.placeholder,rt,o,c,rt,rt,i-s):a(this&&this!==Oi&&this instanceof n?r:t,this,o)}var r=Kr(t);return n}function Gr(t){return function(e,i,n){var r=ac(e);if(!Ya(e)){var s=ws(i,3);e=Fl(e),i=function(t){return s(r[t],t,r)}}var o=t(e,i,n);return o>-1?r[s?e[o]:o]:rt}}function Zr(t){return ms(function(e){var i=e.length,n=i,s=r.prototype.thru;for(t&&e.reverse();n--;){var o=e[n];if(\"function\"!=typeof o)throw new cc(at);if(s&&!a&&\"wrapper\"==ys(o))var a=new r([],!0)}for(n=a?n:i;++n<i;){o=e[n];var l=ys(o),u=\"wrapper\"==l?Ch(o):rt;a=u&&Rs(u[0])&&u[1]==(Ct|yt|wt|kt)&&!u[4].length&&1==u[9]?a[ys(u[0])].apply(a,u[3]):1==o.length&&Rs(o)?a[l]():a.thru(o)}return function(){var t=arguments,n=t[0];if(a&&1==t.length&&md(n))return a.plant(n).value();for(var r=0,s=i?e[r].apply(this,t):n;++r<i;)s=e[r].call(this,s);return s}})}function Jr(t,e,i,n,r,s,o,a,l,u){function c(){for(var v=arguments.length,_=ic(v),y=v;y--;)_[y]=arguments[y];if(f)var b=bs(c),w=F(_,b);if(n&&(_=Mr(_,n,r,f)),s&&(_=jr(_,s,o,f)),v-=w,f&&v<u){var x=K(_,b);return os(t,e,Jr,c.placeholder,i,_,x,a,l,u-v)}var C=d?i:this,k=p?C[t]:t;return v=_.length,a?_=Ks(_,a):g&&v>1&&_.reverse(),h&&l<v&&(_.length=l),this&&this!==Oi&&this instanceof c&&(k=m||Kr(k)),k.apply(C,_)}var h=e&Ct,d=e&mt,p=e&vt,f=e&(yt|bt),g=e&Tt,m=p?rt:Kr(t);return c}function Qr(t,e){return function(i,n){return kn(i,t,e(n),{})}}function ts(t,e){return function(i,n){var r;if(i===rt&&n===rt)return e;if(i!==rt&&(r=i),n!==rt){if(r===rt)return n;\"string\"==typeof i||\"string\"==typeof n?(i=pr(i),n=pr(n)):(i=dr(i),n=dr(n)),r=t(i,n)}return r}}function es(t){return ms(function(e){return e=g(e,M(ws())),ir(function(i){var n=this;return t(e,function(t){return a(t,n,i)})})})}function is(t,e){e=e===rt?\" \":pr(e);var i=e.length;if(i<2)return i?er(e,t):e;var n=er(e,Rc(t/Q(e)));return q(e)?kr(tt(n),0,t).join(\"\"):n.slice(0,t)}function ns(t,e,i,n){function r(){for(var e=-1,l=arguments.length,u=-1,c=n.length,h=ic(c+l),d=this&&this!==Oi&&this instanceof r?o:t;++u<c;)h[u]=n[u];for(;l--;)h[u++]=arguments[++e];return a(d,s?i:this,h)}var s=e&mt,o=Kr(t);return r}function rs(t){return function(e,i,n){return n&&\"number\"!=typeof n&&Ms(e,i,n)&&(i=n=rt),e=wl(e),i===rt?(i=e,e=0):i=wl(i),n=n===rt?e<i?1:-1:wl(n),tr(e,i,n,t)}}function ss(t){return function(e,i){return\"string\"==typeof e&&\"string\"==typeof i||(e=kl(e),i=kl(i)),t(e,i)}}function os(t,e,i,n,r,s,o,a,l,u){var c=e&yt,h=c?o:rt,d=c?rt:o,p=c?s:rt,f=c?rt:s;e|=c?wt:xt,(e&=~(c?xt:wt))&_t||(e&=~(mt|vt));var g=[t,e,r,p,h,f,d,a,l,u],m=i.apply(rt,g);return Rs(t)&&Ah(m,g),m.placeholder=n,Xs(m,t,e)}function as(t){var e=oc[t];return function(t,i){if(t=kl(t),i=null==i?0:Yc(xl(i),292)){var n=(Sl(t)+\"e\").split(\"e\");return n=(Sl(e(n[0]+\"e\"+(+n[1]+i)))+\"e\").split(\"e\"),+(n[0]+\"e\"+(+n[1]-i))}return e(t)}}function ls(t){return function(e){var i=Dh(e);return i==Xt?Y(e):i==ee?G(e):N(e,t(e))}}function us(t,e,i,n,r,s,o,a){var l=e&vt;if(!l&&\"function\"!=typeof t)throw new cc(at);var u=n?n.length:0;if(u||(e&=~(wt|xt),n=r=rt),o=o===rt?o:Uc(xl(o),0),a=a===rt?a:xl(a),u-=r?r.length:0,e&xt){var c=n,h=r;n=r=rt}var d=l?rt:Ch(t),p=[t,e,i,n,r,c,h,s,o,a];if(d&&qs(p,d),t=p[0],e=p[1],i=p[2],n=p[3],r=p[4],a=p[9]=p[9]===rt?l?0:t.length:Uc(p[9]-u,0),!a&&e&(yt|bt)&&(e&=~(yt|bt)),e&&e!=mt)f=e==yt||e==bt?Xr(t,e,a):e!=wt&&e!=(mt|wt)||r.length?Jr.apply(rt,p):ns(t,e,i,n);else var f=Ur(t,e,i);return Xs((d?_h:Ah)(f,p),t,e)}function cs(t,e,i,n){return t===rt||Ua(t,pc[i])&&!mc.call(n,i)?e:t}function hs(t,e,i,n,r,s){return rl(t)&&rl(e)&&(s.set(e,t),Bn(t,e,rt,hs,s),s.delete(e)),t}function ds(t){return pl(t)?rt:t}function ps(t,e,i,n,r,s){var o=i&ft,a=t.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var u=s.get(t);if(u&&s.get(e))return u==e;var c=-1,h=!0,d=i&gt?new mi:rt;for(s.set(t,e),s.set(e,t);++c<a;){var p=t[c],f=e[c];if(n)var g=o?n(f,p,c,e,t,s):n(p,f,c,t,e,s);if(g!==rt){if(g)continue;h=!1;break}if(d){if(!y(e,function(t,e){if(!H(d,e)&&(p===t||r(p,t,i,n,s)))return d.push(e)})){h=!1;break}}else if(p!==f&&!r(p,f,i,n,s)){h=!1;break}}return s.delete(t),s.delete(e),h}function fs(t,e,i,n,r,s,o){switch(i){case le:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ae:return!(t.byteLength!=e.byteLength||!s(new Tc(t),new Tc(e)));case qt:case Bt:case Gt:return Ua(+t,+e);case Yt:return t.name==e.name&&t.message==e.message;case te:case ie:return t==e+\"\";case Xt:var a=Y;case ee:var l=n&ft;if(a||(a=X),t.size!=e.size&&!l)return!1;var u=o.get(t);if(u)return u==e;n|=gt,o.set(t,e);var c=ps(a(t),a(e),n,r,s,o);return o.delete(t),c;case ne:if(hh)return hh.call(t)==hh.call(e)}return!1}function gs(t,e,i,n,r,s){var o=i&ft,a=vs(t),l=a.length;if(l!=vs(e).length&&!o)return!1;for(var u=l;u--;){var c=a[u];if(!(o?c in e:mc.call(e,c)))return!1}var h=s.get(t);if(h&&s.get(e))return h==e;var d=!0;s.set(t,e),s.set(e,t);for(var p=o;++u<l;){c=a[u];var f=t[c],g=e[c];if(n)var m=o?n(g,f,c,e,t,s):n(f,g,c,t,e,s);if(!(m===rt?f===g||r(f,g,i,n,s):m)){d=!1;break}p||(p=\"constructor\"==c)}if(d&&!p){var v=t.constructor,_=e.constructor;v!=_&&\"constructor\"in t&&\"constructor\"in e&&!(\"function\"==typeof v&&v instanceof v&&\"function\"==typeof _&&_ instanceof _)&&(d=!1)}return s.delete(t),s.delete(e),d}function ms(t){return Ih(Ys(t,rt,po),t+\"\")}function vs(t){return vn(t,Fl,kh)}function _s(t){return vn(t,zl,Th)}function ys(t){for(var e=t.name+\"\",i=rh[e],n=mc.call(rh,e)?i.length:0;n--;){var r=i[n],s=r.func;if(null==s||s==t)return r.name}return e}function bs(t){return(mc.call(i,\"placeholder\")?i:t).placeholder}function ws(){var t=i.iteratee||$u;return t=t===$u?Hn:t,arguments.length?t(arguments[0],arguments[1]):t}function xs(t,e){var i=t.__data__;return Hs(e)?i[\"string\"==typeof e?\"string\":\"hash\"]:i.map}function Cs(t){for(var e=Fl(t),i=e.length;i--;){var n=e[i],r=t[n];e[i]=[n,r,zs(r)]}return e}function ks(t,e){var i=W(t,e);return Pn(i)?i:rt}function Ts(t){var e=mc.call(t,Pc),i=t[Pc];try{t[Pc]=rt;var n=!0}catch(t){}var r=yc.call(t);return n&&(e?t[Pc]=i:delete t[Pc]),r}function Ds(t,e,i){for(var n=-1,r=i.length;++n<r;){var s=i[n],o=s.size;switch(s.type){case\"drop\":t+=o;break;case\"dropRight\":e-=o;break;case\"take\":e=Yc(e,t+o);break;case\"takeRight\":t=Uc(t,e-o)}}return{start:t,end:e}}function Ss(t){var e=t.match(Re);return e?e[1].split(Le):[]}function As(t,e,i){e=Cr(e,t);for(var n=-1,r=e.length,s=!1;++n<r;){var o=Js(e[n]);if(!(s=null!=t&&i(t,o)))break;t=t[o]}return s||++n!=r?s:!!(r=null==t?0:t.length)&&nl(r)&&Ns(o,r)&&(md(t)||gd(t))}function Es(t){var e=t.length,i=t.constructor(e);return e&&\"string\"==typeof t[0]&&mc.call(t,\"index\")&&(i.index=t.index,i.input=t.input),i}function Is(t){return\"function\"!=typeof t.constructor||Fs(t)?{}:ph(Sc(t))}function $s(t,e,i,n){var r=t.constructor;switch(e){case ae:return Dr(t);case qt:case Bt:return new r(+t);case le:return Sr(t,n);case ue:case ce:case he:case de:case pe:case fe:case ge:case me:case ve:return Or(t,n);case Xt:return Ar(t,n,i);case Gt:case ie:return new r(t);case te:return Er(t);case ee:return Ir(t,n,i);case ne:return $r(t)}}function Os(t,e){var i=e.length;if(!i)return t;var n=i-1;return e[n]=(i>1?\"& \":\"\")+e[n],e=e.join(i>2?\", \":\" \"),t.replace(He,\"{\\n/* [wrapped with \"+e+\"] */\\n\")}function Ps(t){return md(t)||gd(t)||!!($c&&t&&t[$c])}function Ns(t,e){return!!(e=null==e?Pt:e)&&(\"number\"==typeof t||Ke.test(t))&&t>-1&&t%1==0&&t<e}function Ms(t,e,i){if(!rl(i))return!1;var n=typeof e;return!!(\"number\"==n?Ya(i)&&Ns(e,i.length):\"string\"==n&&e in i)&&Ua(i[e],t)}function js(t,e){if(md(t))return!1;var i=typeof t;return!(\"number\"!=i&&\"symbol\"!=i&&\"boolean\"!=i&&null!=t&&!ml(t))||(Ee.test(t)||!Ae.test(t)||null!=e&&t in ac(e))}function Hs(t){var e=typeof t;return\"string\"==e||\"number\"==e||\"symbol\"==e||\"boolean\"==e?\"__proto__\"!==t:null===t}function Rs(t){var e=ys(t),n=i[e];if(\"function\"!=typeof n||!(e in b.prototype))return!1;if(t===n)return!0;var r=Ch(n);return!!r&&t===r[0]}function Ls(t){return!!_c&&_c in t}function Fs(t){var e=t&&t.constructor;return t===(\"function\"==typeof e&&e.prototype||pc)}function zs(t){return t===t&&!rl(t)}function Ws(t,e){return function(i){return null!=i&&(i[t]===e&&(e!==rt||t in ac(i)))}}function qs(t,e){var i=t[1],n=e[1],r=i|n,s=r<(mt|vt|Ct),o=n==Ct&&i==yt||n==Ct&&i==kt&&t[7].length<=e[8]||n==(Ct|kt)&&e[7].length<=e[8]&&i==yt;if(!s&&!o)return t;n&mt&&(t[2]=e[2],r|=i&mt?0:_t);var a=e[3];if(a){var l=t[3];t[3]=l?Mr(l,a,e[4]):a,t[4]=l?K(t[3],ct):e[4]}return a=e[5],a&&(l=t[5],t[5]=l?jr(l,a,e[6]):a,t[6]=l?K(t[5],ct):e[6]),a=e[7],a&&(t[7]=a),n&Ct&&(t[8]=null==t[8]?e[8]:Yc(t[8],e[8])),null==t[9]&&(t[9]=e[9]),t[0]=e[0],t[1]=r,t}function Bs(t){var e=[];if(null!=t)for(var i in ac(t))e.push(i);return e}function Us(t){return yc.call(t)}function Ys(t,e,i){return e=Uc(e===rt?t.length-1:e,0),function(){for(var n=arguments,r=-1,s=Uc(n.length-e,0),o=ic(s);++r<s;)o[r]=n[e+r];r=-1;for(var l=ic(e+1);++r<e;)l[r]=n[r];return l[e]=i(o),a(t,this,l)}}function Vs(t,e){return e.length<2?t:mn(t,ar(e,0,-1))}function Ks(t,e){for(var i=t.length,n=Yc(e.length,i),r=Hr(t);n--;){var s=e[n];t[n]=Ns(s,i)?r[s]:rt}return t}function Xs(t,e,i){var n=e+\"\";return Ih(t,Os(n,to(Ss(n),i)))}function Gs(t){var e=0,i=0;return function(){var n=Vc(),r=Et-(n-i);if(i=n,r>0){if(++e>=At)return arguments[0]}else e=0;return t.apply(rt,arguments)}}function Zs(t,e){var i=-1,n=t.length,r=n-1;for(e=e===rt?n:e;++i<e;){var s=Qn(i,r),o=t[s];t[s]=t[i],t[i]=o}return t.length=e,t}function Js(t){if(\"string\"==typeof t||ml(t))return t;var e=t+\"\";return\"0\"==e&&1/t==-Ot?\"-0\":e}function Qs(t){if(null!=t){try{return gc.call(t)}catch(t){}try{return t+\"\"}catch(t){}}return\"\"}function to(t,e){return u(Lt,function(i){var n=\"_.\"+i[0];e&i[1]&&!p(t,n)&&t.push(n)}),t.sort()}function eo(t){if(t instanceof b)return t.clone();var e=new r(t.__wrapped__,t.__chain__);return e.__actions__=Hr(t.__actions__),e.__index__=t.__index__,e.__values__=t.__values__,e}function io(t,e,i){e=(i?Ms(t,e,i):e===rt)?1:Uc(xl(e),0);var n=null==t?0:t.length;if(!n||e<1)return[];for(var r=0,s=0,o=ic(Rc(n/e));r<n;)o[s++]=ar(t,r,r+=e);return o}function no(t){for(var e=-1,i=null==t?0:t.length,n=0,r=[];++e<i;){var s=t[e];s&&(r[n++]=s)}return r}function ro(){var t=arguments.length;if(!t)return[];for(var e=ic(t-1),i=arguments[0],n=t;n--;)e[n-1]=arguments[n];return m(md(i)?Hr(i):[i],dn(e,1))}function so(t,e,i){var n=null==t?0:t.length;return n?(e=i||e===rt?1:xl(e),ar(t,e<0?0:e,n)):[]}function oo(t,e,i){var n=null==t?0:t.length;return n?(e=i||e===rt?1:xl(e),e=n-e,ar(t,0,e<0?0:e)):[]}function ao(t,e){return t&&t.length?vr(t,ws(e,3),!0,!0):[]}function lo(t,e){return t&&t.length?vr(t,ws(e,3),!0):[]}function uo(t,e,i,n){var r=null==t?0:t.length;return r?(i&&\"number\"!=typeof i&&Ms(t,e,i)&&(i=0,n=r),cn(t,e,i,n)):[]}function co(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=null==i?0:xl(i);return r<0&&(r=Uc(n+r,0)),C(t,ws(e,3),r)}function ho(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=n-1;return i!==rt&&(r=xl(i),r=i<0?Uc(n+r,0):Yc(r,n-1)),C(t,ws(e,3),r,!0)}function po(t){return(null==t?0:t.length)?dn(t,1):[]}function fo(t){return(null==t?0:t.length)?dn(t,Ot):[]}function go(t,e){return(null==t?0:t.length)?(e=e===rt?1:xl(e),dn(t,e)):[]}function mo(t){for(var e=-1,i=null==t?0:t.length,n={};++e<i;){var r=t[e];n[r[0]]=r[1]}return n}function vo(t){return t&&t.length?t[0]:rt}function _o(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=null==i?0:xl(i);return r<0&&(r=Uc(n+r,0)),k(t,e,r)}function yo(t){return(null==t?0:t.length)?ar(t,0,-1):[]}function bo(t,e){return null==t?\"\":qc.call(t,e)}function wo(t){var e=null==t?0:t.length;return e?t[e-1]:rt}function xo(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=n;return i!==rt&&(r=xl(i),r=r<0?Uc(n+r,0):Yc(r,n-1)),e===e?J(t,e,r):C(t,D,r,!0)}function Co(t,e){return t&&t.length?Yn(t,xl(e)):rt}function ko(t,e){return t&&t.length&&e&&e.length?Zn(t,e):t}function To(t,e,i){return t&&t.length&&e&&e.length?Zn(t,e,ws(i,2)):t}function Do(t,e,i){return t&&t.length&&e&&e.length?Zn(t,e,rt,i):t}function So(t,e){var i=[];if(!t||!t.length)return i;var n=-1,r=[],s=t.length;for(e=ws(e,3);++n<s;){var o=t[n];e(o,n,t)&&(i.push(o),r.push(n))}return Jn(t,r),i}function Ao(t){return null==t?t:Gc.call(t)}function Eo(t,e,i){var n=null==t?0:t.length;return n?(i&&\"number\"!=typeof i&&Ms(t,e,i)?(e=0,i=n):(e=null==e?0:xl(e),i=i===rt?n:xl(i)),ar(t,e,i)):[]}function Io(t,e){return ur(t,e)}function $o(t,e,i){return cr(t,e,ws(i,2))}function Oo(t,e){var i=null==t?0:t.length;if(i){var n=ur(t,e);if(n<i&&Ua(t[n],e))return n}return-1}function Po(t,e){return ur(t,e,!0)}function No(t,e,i){return cr(t,e,ws(i,2),!0)}function Mo(t,e){if(null==t?0:t.length){var i=ur(t,e,!0)-1;if(Ua(t[i],e))return i}return-1}function jo(t){return t&&t.length?hr(t):[]}function Ho(t,e){return t&&t.length?hr(t,ws(e,2)):[]}function Ro(t){var e=null==t?0:t.length;return e?ar(t,1,e):[]}function Lo(t,e,i){return t&&t.length?(e=i||e===rt?1:xl(e),ar(t,0,e<0?0:e)):[]}function Fo(t,e,i){var n=null==t?0:t.length;return n?(e=i||e===rt?1:xl(e),e=n-e,ar(t,e<0?0:e,n)):[]}function zo(t,e){return t&&t.length?vr(t,ws(e,3),!1,!0):[]}function Wo(t,e){return t&&t.length?vr(t,ws(e,3)):[]}function qo(t){return t&&t.length?fr(t):[]}function Bo(t,e){return t&&t.length?fr(t,ws(e,2)):[]}function Uo(t,e){return e=\"function\"==typeof e?e:rt,t&&t.length?fr(t,rt,e):[]}function Yo(t){if(!t||!t.length)return[];var e=0;return t=d(t,function(t){if(Va(t))return e=Uc(t.length,e),!0}),P(e,function(e){return g(t,A(e))})}function Vo(t,e){if(!t||!t.length)return[];var i=Yo(t);return null==e?i:g(i,function(t){return a(e,rt,t)})}function Ko(t,e){return br(t||[],e||[],Bi)}function Xo(t,e){return br(t||[],e||[],sr)}function Go(t){var e=i(t);return e.__chain__=!0,e}function Zo(t,e){return e(t),t}function Jo(t,e){return e(t)}function Qo(){return Go(this)}function ta(){return new r(this.value(),this.__chain__)}function ea(){this.__values__===rt&&(this.__values__=bl(this.value()));var t=this.__index__>=this.__values__.length;return{done:t,value:t?rt:this.__values__[this.__index__++]}}function ia(){return this}function na(t){for(var e,i=this;i instanceof n;){var r=eo(i);r.__index__=0,r.__values__=rt,e?s.__wrapped__=r:e=r;var s=r;i=i.__wrapped__}return s.__wrapped__=t,e}function ra(){var t=this.__wrapped__;if(t instanceof b){var e=t;return this.__actions__.length&&(e=new b(this)),e=e.reverse(),e.__actions__.push({func:Jo,args:[Ao],thisArg:rt}),new r(e,this.__chain__)}return this.thru(Ao)}function sa(){return _r(this.__wrapped__,this.__actions__)}function oa(t,e,i){var n=md(t)?h:ln;return i&&Ms(t,e,i)&&(e=rt),n(t,ws(e,3))}function aa(t,e){return(md(t)?d:hn)(t,ws(e,3))}function la(t,e){return dn(fa(t,e),1)}function ua(t,e){return dn(fa(t,e),Ot)}function ca(t,e,i){return i=i===rt?1:xl(i),dn(fa(t,e),i)}function ha(t,e){return(md(t)?u:fh)(t,ws(e,3))}function da(t,e){return(md(t)?c:gh)(t,ws(e,3))}function pa(t,e,i,n){t=Ya(t)?t:Ql(t),i=i&&!n?xl(i):0;var r=t.length;return i<0&&(i=Uc(r+i,0)),gl(t)?i<=r&&t.indexOf(e,i)>-1:!!r&&k(t,e,i)>-1}function fa(t,e){return(md(t)?g:zn)(t,ws(e,3))}function ga(t,e,i,n){return null==t?[]:(md(e)||(e=null==e?[]:[e]),i=n?rt:i,md(i)||(i=null==i?[]:[i]),Vn(t,e,i))}function ma(t,e,i){var n=md(t)?v:I,r=arguments.length<3;return n(t,ws(e,4),i,r,fh)}function va(t,e,i){var n=md(t)?_:I,r=arguments.length<3;return n(t,ws(e,4),i,r,gh)}function _a(t,e){return(md(t)?d:hn)(t,Oa(ws(e,3)))}function ya(t){return(md(t)?Pi:nr)(t)}function ba(t,e,i){return e=(i?Ms(t,e,i):e===rt)?1:xl(e),(md(t)?Ni:rr)(t,e)}function wa(t){return(md(t)?ji:or)(t)}function xa(t){if(null==t)return 0;if(Ya(t))return gl(t)?Q(t):t.length;var e=Dh(t);return e==Xt||e==ee?t.size:Rn(t).length}function Ca(t,e,i){var n=md(t)?y:lr;return i&&Ms(t,e,i)&&(e=rt),n(t,ws(e,3))}function ka(t,e){if(\"function\"!=typeof e)throw new cc(at);return t=xl(t),function(){if(--t<1)return e.apply(this,arguments)}}function Ta(t,e,i){return e=i?rt:e,e=t&&null==e?t.length:e,us(t,Ct,rt,rt,rt,rt,e)}function Da(t,e){var i;if(\"function\"!=typeof e)throw new cc(at);return t=xl(t),function(){return--t>0&&(i=e.apply(this,arguments)),t<=1&&(e=rt),i}}function Sa(t,e,i){e=i?rt:e;var n=us(t,yt,rt,rt,rt,rt,rt,e);return n.placeholder=Sa.placeholder,n}function Aa(t,e,i){e=i?rt:e;var n=us(t,bt,rt,rt,rt,rt,rt,e);return n.placeholder=Aa.placeholder,n}function Ea(t,e,i){function n(e){var i=d,n=p;return d=p=rt,_=e,g=t.apply(n,i)}function r(t){return _=t,m=Eh(a,e),y?n(t):g}function s(t){var i=t-v,n=t-_,r=e-i;return b?Yc(r,f-n):r}function o(t){var i=t-v,n=t-_;return v===rt||i>=e||i<0||b&&n>=f}function a(){var t=rd();if(o(t))return l(t);m=Eh(a,s(t))}function l(t){return m=rt,w&&d?n(t):(d=p=rt,g)}function u(){m!==rt&&wh(m),_=0,d=v=p=m=rt}function c(){return m===rt?g:l(rd())}function h(){var t=rd(),i=o(t);if(d=arguments,p=this,v=t,i){if(m===rt)return r(v);if(b)return m=Eh(a,e),n(v)}return m===rt&&(m=Eh(a,e)),g}var d,p,f,g,m,v,_=0,y=!1,b=!1,w=!0;if(\"function\"!=typeof t)throw new cc(at);return e=kl(e)||0,rl(i)&&(y=!!i.leading,b=\"maxWait\"in i,f=b?Uc(kl(i.maxWait)||0,e):f,w=\"trailing\"in i?!!i.trailing:w),h.cancel=u,h.flush=c,h}function Ia(t){return us(t,Tt)}function $a(t,e){if(\"function\"!=typeof t||null!=e&&\"function\"!=typeof e)throw new cc(at);var i=function(){var n=arguments,r=e?e.apply(this,n):n[0],s=i.cache;if(s.has(r))return s.get(r);var o=t.apply(this,n);return i.cache=s.set(r,o)||s,o};return i.cache=new($a.Cache||li),i}function Oa(t){if(\"function\"!=typeof t)throw new cc(at);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}function Pa(t){return Da(2,t)}function Na(t,e){if(\"function\"!=typeof t)throw new cc(at);return e=e===rt?e:xl(e),ir(t,e)}function Ma(t,e){if(\"function\"!=typeof t)throw new cc(at);return e=null==e?0:Uc(xl(e),0),ir(function(i){var n=i[e],r=kr(i,0,e);return n&&m(r,n),a(t,this,r)})}function ja(t,e,i){var n=!0,r=!0;if(\"function\"!=typeof t)throw new cc(at);return rl(i)&&(n=\"leading\"in i?!!i.leading:n,r=\"trailing\"in i?!!i.trailing:r),Ea(t,e,{leading:n,maxWait:e,trailing:r})}function Ha(t){return Ta(t,1)}function Ra(t,e){return cd(xr(e),t)}function La(){if(!arguments.length)return[];var t=arguments[0];return md(t)?t:[t]}function Fa(t){return nn(t,pt)}function za(t,e){return e=\"function\"==typeof e?e:rt,nn(t,pt,e)}function Wa(t){return nn(t,ht|pt)}function qa(t,e){return e=\"function\"==typeof e?e:rt,nn(t,ht|pt,e)}function Ba(t,e){return null==e||sn(t,e,Fl(e))}function Ua(t,e){return t===e||t!==t&&e!==e}function Ya(t){return null!=t&&nl(t.length)&&!el(t)}function Va(t){return sl(t)&&Ya(t)}function Ka(t){return!0===t||!1===t||sl(t)&&_n(t)==qt}function Xa(t){return sl(t)&&1===t.nodeType&&!pl(t)}function Ga(t){if(null==t)return!0;if(Ya(t)&&(md(t)||\"string\"==typeof t||\"function\"==typeof t.splice||_d(t)||Cd(t)||gd(t)))return!t.length;var e=Dh(t);if(e==Xt||e==ee)return!t.size;if(Fs(t))return!Rn(t).length;for(var i in t)if(mc.call(t,i))return!1;return!0}function Za(t,e){return En(t,e)}function Ja(t,e,i){i=\"function\"==typeof i?i:rt;var n=i?i(t,e):rt;return n===rt?En(t,e,rt,i):!!n}function Qa(t){if(!sl(t))return!1;var e=_n(t);return e==Yt||e==Ut||\"string\"==typeof t.message&&\"string\"==typeof t.name&&!pl(t)}function tl(t){return\"number\"==typeof t&&Wc(t)}function el(t){if(!rl(t))return!1;var e=_n(t);return e==Vt||e==Kt||e==Wt||e==Qt}function il(t){return\"number\"==typeof t&&t==xl(t)}function nl(t){return\"number\"==typeof t&&t>-1&&t%1==0&&t<=Pt}function rl(t){var e=typeof t;return null!=t&&(\"object\"==e||\"function\"==e)}function sl(t){return null!=t&&\"object\"==typeof t}function ol(t,e){return t===e||On(t,e,Cs(e))}function al(t,e,i){return i=\"function\"==typeof i?i:rt,On(t,e,Cs(e),i)}function ll(t){return dl(t)&&t!=+t}function ul(t){if(Sh(t))throw new rc(ot);return Pn(t)}function cl(t){return null===t}function hl(t){return null==t}function dl(t){return\"number\"==typeof t||sl(t)&&_n(t)==Gt}function pl(t){if(!sl(t)||_n(t)!=Jt)return!1;var e=Sc(t);if(null===e)return!0;var i=mc.call(e,\"constructor\")&&e.constructor;return\"function\"==typeof i&&i instanceof i&&gc.call(i)==bc}function fl(t){return il(t)&&t>=-Pt&&t<=Pt}function gl(t){return\"string\"==typeof t||!md(t)&&sl(t)&&_n(t)==ie}function ml(t){return\"symbol\"==typeof t||sl(t)&&_n(t)==ne}function vl(t){return t===rt}function _l(t){return sl(t)&&Dh(t)==se}function yl(t){return sl(t)&&_n(t)==oe}function bl(t){if(!t)return[];if(Ya(t))return gl(t)?tt(t):Hr(t);if(Oc&&t[Oc])return U(t[Oc]());var e=Dh(t);return(e==Xt?Y:e==ee?X:Ql)(t)}function wl(t){if(!t)return 0===t?t:0;if((t=kl(t))===Ot||t===-Ot){return(t<0?-1:1)*Nt}return t===t?t:0}function xl(t){var e=wl(t),i=e%1;return e===e?i?e-i:e:0}function Cl(t){return t?en(xl(t),0,jt):0}function kl(t){if(\"number\"==typeof t)return t;if(ml(t))return Mt;if(rl(t)){var e=\"function\"==typeof t.valueOf?t.valueOf():t;t=rl(e)?e+\"\":e}if(\"string\"!=typeof t)return 0===t?t:+t;t=t.replace(Ne,\"\");var i=Ue.test(t);return i||Ve.test(t)?Ei(t.slice(2),i?2:8):Be.test(t)?Mt:+t}function Tl(t){return Rr(t,zl(t))}function Dl(t){return t?en(xl(t),-Pt,Pt):0===t?t:0}function Sl(t){return null==t?\"\":pr(t)}function Al(t,e){var i=ph(t);return null==e?i:Zi(i,e)}function El(t,e){return x(t,ws(e,3),pn)}function Il(t,e){return x(t,ws(e,3),fn)}function $l(t,e){return null==t?t:mh(t,ws(e,3),zl)}function Ol(t,e){return null==t?t:vh(t,ws(e,3),zl)}function Pl(t,e){return t&&pn(t,ws(e,3))}function Nl(t,e){return t&&fn(t,ws(e,3))}function Ml(t){return null==t?[]:gn(t,Fl(t))}function jl(t){return null==t?[]:gn(t,zl(t))}function Hl(t,e,i){var n=null==t?rt:mn(t,e);return n===rt?i:n}function Rl(t,e){return null!=t&&As(t,e,bn)}function Ll(t,e){return null!=t&&As(t,e,wn)}function Fl(t){return Ya(t)?$i(t):Rn(t)}function zl(t){return Ya(t)?$i(t,!0):Ln(t)}function Wl(t,e){var i={};return e=ws(e,3),pn(t,function(t,n,r){Qi(i,e(t,n,r),t)}),i}function ql(t,e){var i={};return e=ws(e,3),pn(t,function(t,n,r){Qi(i,n,e(t,n,r))}),i}function Bl(t,e){return Ul(t,Oa(ws(e)))}function Ul(t,e){if(null==t)return{};var i=g(_s(t),function(t){return[t]});return e=ws(e),Xn(t,i,function(t,i){return e(t,i[0])})}function Yl(t,e,i){e=Cr(e,t);var n=-1,r=e.length;for(r||(r=1,t=rt);++n<r;){var s=null==t?rt:t[Js(e[n])];s===rt&&(n=r,s=i),t=el(s)?s.call(t):s}return t}function Vl(t,e,i){return null==t?t:sr(t,e,i)}function Kl(t,e,i,n){return n=\"function\"==typeof n?n:rt,null==t?t:sr(t,e,i,n)}function Xl(t,e,i){var n=md(t),r=n||_d(t)||Cd(t);if(e=ws(e,4),null==i){var s=t&&t.constructor;i=r?n?new s:[]:rl(t)&&el(s)?ph(Sc(t)):{}}return(r?u:pn)(t,function(t,n,r){return e(i,t,n,r)}),i}function Gl(t,e){return null==t||gr(t,e)}function Zl(t,e,i){return null==t?t:mr(t,e,xr(i))}function Jl(t,e,i,n){return n=\"function\"==typeof n?n:rt,null==t?t:mr(t,e,xr(i),n)}function Ql(t){return null==t?[]:j(t,Fl(t))}function tu(t){return null==t?[]:j(t,zl(t))}function eu(t,e,i){return i===rt&&(i=e,e=rt),i!==rt&&(i=kl(i),i=i===i?i:0),e!==rt&&(e=kl(e),e=e===e?e:0),en(kl(t),e,i)}function iu(t,e,i){return e=wl(e),i===rt?(i=e,e=0):i=wl(i),t=kl(t),xn(t,e,i)}function nu(t,e,i){if(i&&\"boolean\"!=typeof i&&Ms(t,e,i)&&(e=i=rt),i===rt&&(\"boolean\"==typeof e?(i=e,e=rt):\"boolean\"==typeof t&&(i=t,t=rt)),t===rt&&e===rt?(t=0,e=1):(t=wl(t),e===rt?(e=t,t=0):e=wl(e)),t>e){var n=t;t=e,e=n}if(i||t%1||e%1){var r=Xc();return Yc(t+r*(e-t+Ai(\"1e-\"+((r+\"\").length-1))),e)}return Qn(t,e)}function ru(t){return Xd(Sl(t).toLowerCase())}function su(t){return(t=Sl(t))&&t.replace(Xe,Ui).replace(gi,\"\")}function ou(t,e,i){t=Sl(t),e=pr(e);var n=t.length;i=i===rt?n:en(xl(i),0,n);var r=i;return(i-=e.length)>=0&&t.slice(i,r)==e}function au(t){return t=Sl(t),t&&ke.test(t)?t.replace(xe,Yi):t}function lu(t){return t=Sl(t),t&&Pe.test(t)?t.replace(Oe,\"\\\\$&\"):t}function uu(t,e,i){t=Sl(t),e=xl(e);var n=e?Q(t):0;if(!e||n>=e)return t;var r=(e-n)/2;return is(Lc(r),i)+t+is(Rc(r),i)}function cu(t,e,i){t=Sl(t),e=xl(e);var n=e?Q(t):0;return e&&n<e?t+is(e-n,i):t}function hu(t,e,i){t=Sl(t),e=xl(e);var n=e?Q(t):0;return e&&n<e?is(e-n,i)+t:t}function du(t,e,i){return i||null==e?e=0:e&&(e=+e),Kc(Sl(t).replace(Me,\"\"),e||0)}function pu(t,e,i){return e=(i?Ms(t,e,i):e===rt)?1:xl(e),er(Sl(t),e)}function fu(){var t=arguments,e=Sl(t[0]);return t.length<3?e:e.replace(t[1],t[2])}function gu(t,e,i){return i&&\"number\"!=typeof i&&Ms(t,e,i)&&(e=i=rt),(i=i===rt?jt:i>>>0)?(t=Sl(t),t&&(\"string\"==typeof e||null!=e&&!wd(e))&&!(e=pr(e))&&q(t)?kr(tt(t),0,i):t.split(e,i)):[]}function mu(t,e,i){return t=Sl(t),i=null==i?0:en(xl(i),0,t.length),e=pr(e),t.slice(i,i+e.length)==e}function vu(t,e,n){var r=i.templateSettings;n&&Ms(t,e,n)&&(e=rt),t=Sl(t),e=Ad({},e,r,cs);var s,o,a=Ad({},e.imports,r.imports,cs),l=Fl(a),u=j(a,l),c=0,h=e.interpolate||Ge,d=\"__p += '\",p=lc((e.escape||Ge).source+\"|\"+h.source+\"|\"+(h===Se?We:Ge).source+\"|\"+(e.evaluate||Ge).source+\"|$\",\"g\"),f=\"//# sourceURL=\"+(\"sourceURL\"in e?e.sourceURL:\"lodash.templateSources[\"+ ++wi+\"]\")+\"\\n\";t.replace(p,function(e,i,n,r,a,l){return n||(n=r),d+=t.slice(c,l).replace(Ze,z),i&&(s=!0,d+=\"' +\\n__e(\"+i+\") +\\n'\"),a&&(o=!0,d+=\"';\\n\"+a+\";\\n__p += '\"),n&&(d+=\"' +\\n((__t = (\"+n+\")) == null ? '' : __t) +\\n'\"),c=l+e.length,e}),d+=\"';\\n\";var g=e.variable;g||(d=\"with (obj) {\\n\"+d+\"\\n}\\n\"),d=(o?d.replace(_e,\"\"):d).replace(ye,\"$1\").replace(be,\"$1;\"),d=\"function(\"+(g||\"obj\")+\") {\\n\"+(g?\"\":\"obj || (obj = {});\\n\")+\"var __t, __p = ''\"+(s?\", __e = _.escape\":\"\")+(o?\", __j = Array.prototype.join;\\nfunction print() { __p += __j.call(arguments, '') }\\n\":\";\\n\")+d+\"return __p\\n}\";var m=Gd(function(){return sc(l,f+\"return \"+d).apply(rt,u)});if(m.source=d,Qa(m))throw m;return m}function _u(t){return Sl(t).toLowerCase()}function yu(t){return Sl(t).toUpperCase()}function bu(t,e,i){if((t=Sl(t))&&(i||e===rt))return t.replace(Ne,\"\");if(!t||!(e=pr(e)))return t;var n=tt(t),r=tt(e);return kr(n,R(n,r),L(n,r)+1).join(\"\")}function wu(t,e,i){if((t=Sl(t))&&(i||e===rt))return t.replace(je,\"\");if(!t||!(e=pr(e)))return t;var n=tt(t);return kr(n,0,L(n,tt(e))+1).join(\"\")}function xu(t,e,i){if((t=Sl(t))&&(i||e===rt))return t.replace(Me,\"\");if(!t||!(e=pr(e)))return t;var n=tt(t);return kr(n,R(n,tt(e))).join(\"\")}function Cu(t,e){var i=Dt,n=St;if(rl(e)){var r=\"separator\"in e?e.separator:r;i=\"length\"in e?xl(e.length):i,n=\"omission\"in e?pr(e.omission):n}t=Sl(t);var s=t.length;if(q(t)){var o=tt(t);s=o.length}if(i>=s)return t;var a=i-Q(n);if(a<1)return n;var l=o?kr(o,0,a).join(\"\"):t.slice(0,a);if(r===rt)return l+n;if(o&&(a+=l.length-a),wd(r)){if(t.slice(a).search(r)){var u,c=l;for(r.global||(r=lc(r.source,Sl(qe.exec(r))+\"g\")),r.lastIndex=0;u=r.exec(c);)var h=u.index;l=l.slice(0,h===rt?a:h)}}else if(t.indexOf(pr(r),a)!=a){var d=l.lastIndexOf(r);d>-1&&(l=l.slice(0,d))}return l+n}function ku(t){return t=Sl(t),t&&Ce.test(t)?t.replace(we,Vi):t}function Tu(t,e,i){return t=Sl(t),e=i?rt:e,e===rt?B(t)?nt(t):w(t):t.match(e)||[]}function Du(t){var e=null==t?0:t.length,i=ws();return t=e?g(t,function(t){if(\"function\"!=typeof t[1])throw new cc(at);return[i(t[0]),t[1]]}):[],ir(function(i){for(var n=-1;++n<e;){var r=t[n];if(a(r[0],this,i))return a(r[1],this,i)}})}function Su(t){return rn(nn(t,ht))}function Au(t){return function(){return t}}function Eu(t,e){return null==t||t!==t?e:t}function Iu(t){return t}function $u(t){return Hn(\"function\"==typeof t?t:nn(t,ht))}function Ou(t){return Wn(nn(t,ht))}function Pu(t,e){return qn(t,nn(e,ht))}function Nu(t,e,i){var n=Fl(e),r=gn(e,n);null!=i||rl(e)&&(r.length||!n.length)||(i=e,e=t,t=this,r=gn(e,Fl(e)));var s=!(rl(i)&&\"chain\"in i&&!i.chain),o=el(t);return u(r,function(i){var n=e[i];t[i]=n,o&&(t.prototype[i]=function(){var e=this.__chain__;if(s||e){var i=t(this.__wrapped__);return(i.__actions__=Hr(this.__actions__)).push({func:n,args:arguments,thisArg:t}),i.__chain__=e,i}return n.apply(t,m([this.value()],arguments))})}),t}function Mu(){return Oi._===this&&(Oi._=wc),this}function ju(){}function Hu(t){return t=xl(t),ir(function(e){return Yn(e,t)})}function Ru(t){return js(t)?A(Js(t)):Gn(t)}function Lu(t){return function(e){return null==t?rt:mn(t,e)}}function Fu(){return[]}function zu(){return!1}function Wu(){return{}}function qu(){return\"\"}function Bu(){return!0}function Uu(t,e){if((t=xl(t))<1||t>Pt)return[];var i=jt,n=Yc(t,jt);e=ws(e),t-=jt;for(var r=P(n,e);++i<t;)e(i);return r}function Yu(t){return md(t)?g(t,Js):ml(t)?[t]:Hr($h(Sl(t)))}function Vu(t){var e=++vc;return Sl(t)+e}function Ku(t){return t&&t.length?un(t,Iu,yn):rt}function Xu(t,e){return t&&t.length?un(t,ws(e,2),yn):rt}function Gu(t){return S(t,Iu)}function Zu(t,e){return S(t,ws(e,2))}function Ju(t){return t&&t.length?un(t,Iu,Fn):rt}function Qu(t,e){return t&&t.length?un(t,ws(e,2),Fn):rt}function tc(t){return t&&t.length?O(t,Iu):0}function ec(t,e){return t&&t.length?O(t,ws(e,2)):0}e=null==e?Oi:Ki.defaults(Oi.Object(),e,Ki.pick(Oi,bi));var ic=e.Array,nc=e.Date,rc=e.Error,sc=e.Function,oc=e.Math,ac=e.Object,lc=e.RegExp,uc=e.String,cc=e.TypeError,hc=ic.prototype,dc=sc.prototype,pc=ac.prototype,fc=e[\"__core-js_shared__\"],gc=dc.toString,mc=pc.hasOwnProperty,vc=0,_c=function(){var t=/[^.]+$/.exec(fc&&fc.keys&&fc.keys.IE_PROTO||\"\");return t?\"Symbol(src)_1.\"+t:\"\"}(),yc=pc.toString,bc=gc.call(ac),wc=Oi._,xc=lc(\"^\"+gc.call(mc).replace(Oe,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),Cc=Mi?e.Buffer:rt,kc=e.Symbol,Tc=e.Uint8Array,Dc=Cc?Cc.allocUnsafe:rt,Sc=V(ac.getPrototypeOf,ac),Ac=ac.create,Ec=pc.propertyIsEnumerable,Ic=hc.splice,$c=kc?kc.isConcatSpreadable:rt,Oc=kc?kc.iterator:rt,Pc=kc?kc.toStringTag:rt,Nc=function(){try{var t=ks(ac,\"defineProperty\");return t({},\"\",{}),t}catch(t){}}(),Mc=e.clearTimeout!==Oi.clearTimeout&&e.clearTimeout,jc=nc&&nc.now!==Oi.Date.now&&nc.now,Hc=e.setTimeout!==Oi.setTimeout&&e.setTimeout,Rc=oc.ceil,Lc=oc.floor,Fc=ac.getOwnPropertySymbols,zc=Cc?Cc.isBuffer:rt,Wc=e.isFinite,qc=hc.join,Bc=V(ac.keys,ac),Uc=oc.max,Yc=oc.min,Vc=nc.now,Kc=e.parseInt,Xc=oc.random,Gc=hc.reverse,Zc=ks(e,\"DataView\"),Jc=ks(e,\"Map\"),Qc=ks(e,\"Promise\"),th=ks(e,\"Set\"),eh=ks(e,\"WeakMap\"),ih=ks(ac,\"create\"),nh=eh&&new eh,rh={},sh=Qs(Zc),oh=Qs(Jc),ah=Qs(Qc),lh=Qs(th),uh=Qs(eh),ch=kc?kc.prototype:rt,hh=ch?ch.valueOf:rt,dh=ch?ch.toString:rt,ph=function(){function t(){}return function(e){if(!rl(e))return{};if(Ac)return Ac(e);t.prototype=e;var i=new t;return t.prototype=rt,i}}();i.templateSettings={escape:Te,evaluate:De,interpolate:Se,variable:\"\",imports:{_:i}},i.prototype=n.prototype,i.prototype.constructor=i,r.prototype=ph(n.prototype),r.prototype.constructor=r,b.prototype=ph(n.prototype),b.prototype.constructor=b,it.prototype.clear=Fe,it.prototype.delete=Je,it.prototype.get=Qe,it.prototype.has=ti,it.prototype.set=ei,ii.prototype.clear=ni,ii.prototype.delete=ri,ii.prototype.get=si,ii.prototype.has=oi,ii.prototype.set=ai,li.prototype.clear=ui,li.prototype.delete=ci,li.prototype.get=hi,li.prototype.has=di,li.prototype.set=pi,mi.prototype.add=mi.prototype.push=vi,mi.prototype.has=_i,yi.prototype.clear=ki,yi.prototype.delete=Ti,yi.prototype.get=Di,yi.prototype.has=Si,yi.prototype.set=Ii;var fh=qr(pn),gh=qr(fn,!0),mh=Br(),vh=Br(!0),_h=nh?function(t,e){return nh.set(t,e),t}:Iu,yh=Nc?function(t,e){return Nc(t,\"toString\",{configurable:!0,enumerable:!1,value:Au(e),writable:!0})}:Iu,bh=ir,wh=Mc||function(t){return Oi.clearTimeout(t)},xh=th&&1/X(new th([,-0]))[1]==Ot?function(t){return new th(t)}:ju,Ch=nh?function(t){return nh.get(t)}:ju,kh=Fc?function(t){return null==t?[]:(t=ac(t),d(Fc(t),function(e){return Ec.call(t,e)}))}:Fu,Th=Fc?function(t){for(var e=[];t;)m(e,kh(t)),t=Sc(t);return e}:Fu,Dh=_n;(Zc&&Dh(new Zc(new ArrayBuffer(1)))!=le||Jc&&Dh(new Jc)!=Xt||Qc&&\"[object Promise]\"!=Dh(Qc.resolve())||th&&Dh(new th)!=ee||eh&&Dh(new eh)!=se)&&(Dh=function(t){var e=_n(t),i=e==Jt?t.constructor:rt,n=i?Qs(i):\"\";if(n)switch(n){case sh:return le;case oh:return Xt;case ah:return\"[object Promise]\";case lh:return ee;case uh:return se}return e});var Sh=fc?el:zu,Ah=Gs(_h),Eh=Hc||function(t,e){return Oi.setTimeout(t,e)},Ih=Gs(yh),$h=function(t){var e=$a(t,function(t){return i.size===ut&&i.clear(),t}),i=e.cache;return e}(function(t){var e=[];return Ie.test(t)&&e.push(\"\"),t.replace($e,function(t,i,n,r){e.push(n?r.replace(ze,\"$1\"):i||t)}),e}),Oh=ir(function(t,e){return Va(t)?an(t,dn(e,1,Va,!0)):[]}),Ph=ir(function(t,e){var i=wo(e);return Va(i)&&(i=rt),Va(t)?an(t,dn(e,1,Va,!0),ws(i,2)):[]}),Nh=ir(function(t,e){var i=wo(e);return Va(i)&&(i=rt),Va(t)?an(t,dn(e,1,Va,!0),rt,i):[]}),Mh=ir(function(t){var e=g(t,wr);return e.length&&e[0]===t[0]?Cn(e):[]}),jh=ir(function(t){var e=wo(t),i=g(t,wr);return e===wo(i)?e=rt:i.pop(),i.length&&i[0]===t[0]?Cn(i,ws(e,2)):[]}),Hh=ir(function(t){var e=wo(t),i=g(t,wr);return e=\"function\"==typeof e?e:rt,e&&i.pop(),i.length&&i[0]===t[0]?Cn(i,rt,e):[]}),Rh=ir(ko),Lh=ms(function(t,e){var i=null==t?0:t.length,n=tn(t,e);return Jn(t,g(e,function(t){return Ns(t,i)?+t:t}).sort(Pr)),n}),Fh=ir(function(t){return fr(dn(t,1,Va,!0))}),zh=ir(function(t){var e=wo(t);return Va(e)&&(e=rt),fr(dn(t,1,Va,!0),ws(e,2))}),Wh=ir(function(t){var e=wo(t);return e=\"function\"==typeof e?e:rt,fr(dn(t,1,Va,!0),rt,e)}),qh=ir(function(t,e){return Va(t)?an(t,e):[]}),Bh=ir(function(t){return yr(d(t,Va))}),Uh=ir(function(t){var e=wo(t);return Va(e)&&(e=rt),yr(d(t,Va),ws(e,2))}),Yh=ir(function(t){var e=wo(t);return e=\"function\"==typeof e?e:rt,yr(d(t,Va),rt,e)}),Vh=ir(Yo),Kh=ir(function(t){var e=t.length,i=e>1?t[e-1]:rt;return i=\"function\"==typeof i?(t.pop(),i):rt,Vo(t,i)}),Xh=ms(function(t){var e=t.length,i=e?t[0]:0,n=this.__wrapped__,s=function(e){return tn(e,t)};return!(e>1||this.__actions__.length)&&n instanceof b&&Ns(i)?(n=n.slice(i,+i+(e?1:0)),n.__actions__.push({func:Jo,args:[s],thisArg:rt}),new r(n,this.__chain__).thru(function(t){return e&&!t.length&&t.push(rt),t})):this.thru(s)}),Gh=zr(function(t,e,i){mc.call(t,i)?++t[i]:Qi(t,i,1)}),Zh=Gr(co),Jh=Gr(ho),Qh=zr(function(t,e,i){mc.call(t,i)?t[i].push(e):Qi(t,i,[e])}),td=ir(function(t,e,i){var n=-1,r=\"function\"==typeof e,s=Ya(t)?ic(t.length):[];return fh(t,function(t){s[++n]=r?a(e,t,i):Tn(t,e,i)}),s}),ed=zr(function(t,e,i){Qi(t,i,e)}),id=zr(function(t,e,i){t[i?0:1].push(e)},function(){return[[],[]]}),nd=ir(function(t,e){if(null==t)return[];var i=e.length;return i>1&&Ms(t,e[0],e[1])?e=[]:i>2&&Ms(e[0],e[1],e[2])&&(e=[e[0]]),Vn(t,dn(e,1),[])}),rd=jc||function(){return Oi.Date.now()},sd=ir(function(t,e,i){var n=mt;if(i.length){var r=K(i,bs(sd));n|=wt}return us(t,n,e,i,r)}),od=ir(function(t,e,i){var n=mt|vt;if(i.length){var r=K(i,bs(od));n|=wt}return us(e,n,t,i,r)}),ad=ir(function(t,e){return on(t,1,e)}),ld=ir(function(t,e,i){return on(t,kl(e)||0,i)});$a.Cache=li;var ud=bh(function(t,e){e=1==e.length&&md(e[0])?g(e[0],M(ws())):g(dn(e,1),M(ws()));var i=e.length;return ir(function(n){for(var r=-1,s=Yc(n.length,i);++r<s;)n[r]=e[r].call(this,n[r]);return a(t,this,n)})}),cd=ir(function(t,e){var i=K(e,bs(cd));return us(t,wt,rt,e,i)}),hd=ir(function(t,e){var i=K(e,bs(hd));return us(t,xt,rt,e,i)}),dd=ms(function(t,e){return us(t,kt,rt,rt,rt,e)}),pd=ss(yn),fd=ss(function(t,e){return t>=e}),gd=Dn(function(){return arguments}())?Dn:function(t){return sl(t)&&mc.call(t,\"callee\")&&!Ec.call(t,\"callee\")},md=ic.isArray,vd=Ri?M(Ri):Sn,_d=zc||zu,yd=Li?M(Li):An,bd=Fi?M(Fi):$n,wd=zi?M(zi):Nn,xd=Wi?M(Wi):Mn,Cd=qi?M(qi):jn,kd=ss(Fn),Td=ss(function(t,e){return t<=e}),Dd=Wr(function(t,e){if(Fs(e)||Ya(e))return void Rr(e,Fl(e),t);for(var i in e)mc.call(e,i)&&Bi(t,i,e[i])}),Sd=Wr(function(t,e){Rr(e,zl(e),t)}),Ad=Wr(function(t,e,i,n){Rr(e,zl(e),t,n)}),Ed=Wr(function(t,e,i,n){Rr(e,Fl(e),t,n)}),Id=ms(tn),$d=ir(function(t){return t.push(rt,cs),a(Ad,rt,t)}),Od=ir(function(t){return t.push(rt,hs),a(Hd,rt,t)}),Pd=Qr(function(t,e,i){t[e]=i},Au(Iu)),Nd=Qr(function(t,e,i){mc.call(t,e)?t[e].push(i):t[e]=[i]},ws),Md=ir(Tn),jd=Wr(function(t,e,i){Bn(t,e,i)}),Hd=Wr(function(t,e,i,n){Bn(t,e,i,n)}),Rd=ms(function(t,e){var i={};if(null==t)return i;var n=!1;e=g(e,function(e){return e=Cr(e,t),n||(n=e.length>1),e}),Rr(t,_s(t),i),n&&(i=nn(i,ht|dt|pt,ds));for(var r=e.length;r--;)gr(i,e[r]);return i}),Ld=ms(function(t,e){return null==t?{}:Kn(t,e)}),Fd=ls(Fl),zd=ls(zl),Wd=Vr(function(t,e,i){return e=e.toLowerCase(),t+(i?ru(e):e)}),qd=Vr(function(t,e,i){return t+(i?\"-\":\"\")+e.toLowerCase()}),Bd=Vr(function(t,e,i){return t+(i?\" \":\"\")+e.toLowerCase()}),Ud=Yr(\"toLowerCase\"),Yd=Vr(function(t,e,i){return t+(i?\"_\":\"\")+e.toLowerCase()}),Vd=Vr(function(t,e,i){return t+(i?\" \":\"\")+Xd(e)}),Kd=Vr(function(t,e,i){return t+(i?\" \":\"\")+e.toUpperCase()}),Xd=Yr(\"toUpperCase\"),Gd=ir(function(t,e){try{return a(t,rt,e)}catch(t){return Qa(t)?t:new rc(t)}}),Zd=ms(function(t,e){return u(e,function(e){e=Js(e),Qi(t,e,sd(t[e],t))}),t}),Jd=Zr(),Qd=Zr(!0),tp=ir(function(t,e){return function(i){return Tn(i,t,e)}}),ep=ir(function(t,e){return function(i){return Tn(t,i,e)}}),ip=es(g),np=es(h),rp=es(y),sp=rs(),op=rs(!0),ap=ts(function(t,e){return t+e},0),lp=as(\"ceil\"),up=ts(function(t,e){return t/e},1),cp=as(\"floor\"),hp=ts(function(t,e){return t*e},1),dp=as(\"round\"),pp=ts(function(t,e){return t-e},0);return i.after=ka,i.ary=Ta,i.assign=Dd,i.assignIn=Sd,i.assignInWith=Ad,i.assignWith=Ed,i.at=Id,i.before=Da,i.bind=sd,i.bindAll=Zd,i.bindKey=od,i.castArray=La,i.chain=Go,i.chunk=io,i.compact=no,i.concat=ro,i.cond=Du,i.conforms=Su,i.constant=Au,i.countBy=Gh,i.create=Al,i.curry=Sa,i.curryRight=Aa,i.debounce=Ea,i.defaults=$d,i.defaultsDeep=Od,i.defer=ad,i.delay=ld,i.difference=Oh,i.differenceBy=Ph,i.differenceWith=Nh,i.drop=so,i.dropRight=oo,i.dropRightWhile=ao,i.dropWhile=lo,i.fill=uo,i.filter=aa,i.flatMap=la,i.flatMapDeep=ua,i.flatMapDepth=ca,i.flatten=po,i.flattenDeep=fo,i.flattenDepth=go,i.flip=Ia,i.flow=Jd,i.flowRight=Qd,i.fromPairs=mo,i.functions=Ml,i.functionsIn=jl,i.groupBy=Qh,i.initial=yo,i.intersection=Mh,i.intersectionBy=jh,i.intersectionWith=Hh,i.invert=Pd,i.invertBy=Nd,i.invokeMap=td,i.iteratee=$u,i.keyBy=ed,i.keys=Fl,i.keysIn=zl,i.map=fa,i.mapKeys=Wl,i.mapValues=ql,i.matches=Ou,i.matchesProperty=Pu,i.memoize=$a,i.merge=jd,i.mergeWith=Hd,i.method=tp,i.methodOf=ep,i.mixin=Nu,i.negate=Oa,i.nthArg=Hu,i.omit=Rd,i.omitBy=Bl,i.once=Pa,i.orderBy=ga,i.over=ip,i.overArgs=ud,i.overEvery=np,i.overSome=rp,i.partial=cd,i.partialRight=hd,i.partition=id,i.pick=Ld,i.pickBy=Ul,i.property=Ru,i.propertyOf=Lu,i.pull=Rh,i.pullAll=ko,i.pullAllBy=To,i.pullAllWith=Do,i.pullAt=Lh,i.range=sp,i.rangeRight=op,i.rearg=dd,i.reject=_a,i.remove=So,i.rest=Na,i.reverse=Ao,i.sampleSize=ba,i.set=Vl,i.setWith=Kl,i.shuffle=wa,i.slice=Eo,i.sortBy=nd,i.sortedUniq=jo,i.sortedUniqBy=Ho,i.split=gu,i.spread=Ma,i.tail=Ro,i.take=Lo,i.takeRight=Fo,i.takeRightWhile=zo,i.takeWhile=Wo,i.tap=Zo,i.throttle=ja,i.thru=Jo,i.toArray=bl,i.toPairs=Fd,i.toPairsIn=zd,i.toPath=Yu,i.toPlainObject=Tl,i.transform=Xl,i.unary=Ha,i.union=Fh,i.unionBy=zh,i.unionWith=Wh,i.uniq=qo,i.uniqBy=Bo,i.uniqWith=Uo,i.unset=Gl,i.unzip=Yo,i.unzipWith=Vo,i.update=Zl,i.updateWith=Jl,i.values=Ql,i.valuesIn=tu,i.without=qh,i.words=Tu,i.wrap=Ra,i.xor=Bh,i.xorBy=Uh,i.xorWith=Yh,i.zip=Vh,i.zipObject=Ko,i.zipObjectDeep=Xo,i.zipWith=Kh,i.entries=Fd,i.entriesIn=zd,i.extend=Sd,i.extendWith=Ad,Nu(i,i),i.add=ap,i.attempt=Gd,i.camelCase=Wd,i.capitalize=ru,i.ceil=lp,i.clamp=eu,i.clone=Fa,i.cloneDeep=Wa,i.cloneDeepWith=qa,i.cloneWith=za,i.conformsTo=Ba,i.deburr=su,i.defaultTo=Eu,i.divide=up,i.endsWith=ou,i.eq=Ua,i.escape=au,i.escapeRegExp=lu,i.every=oa,i.find=Zh,i.findIndex=co,i.findKey=El,i.findLast=Jh,i.findLastIndex=ho,i.findLastKey=Il,i.floor=cp,i.forEach=ha,i.forEachRight=da,i.forIn=$l,i.forInRight=Ol,i.forOwn=Pl,i.forOwnRight=Nl,i.get=Hl,i.gt=pd,i.gte=fd,i.has=Rl,i.hasIn=Ll,i.head=vo,i.identity=Iu,i.includes=pa,i.indexOf=_o,i.inRange=iu,i.invoke=Md,i.isArguments=gd,i.isArray=md,i.isArrayBuffer=vd,i.isArrayLike=Ya,i.isArrayLikeObject=Va,i.isBoolean=Ka,i.isBuffer=_d,i.isDate=yd,i.isElement=Xa,i.isEmpty=Ga,i.isEqual=Za,i.isEqualWith=Ja,i.isError=Qa,i.isFinite=tl,i.isFunction=el,i.isInteger=il,i.isLength=nl,i.isMap=bd,i.isMatch=ol,i.isMatchWith=al,i.isNaN=ll,i.isNative=ul,i.isNil=hl,i.isNull=cl,i.isNumber=dl,i.isObject=rl,i.isObjectLike=sl,i.isPlainObject=pl,i.isRegExp=wd,i.isSafeInteger=fl,i.isSet=xd,i.isString=gl,i.isSymbol=ml,i.isTypedArray=Cd,i.isUndefined=vl,i.isWeakMap=_l,i.isWeakSet=yl,i.join=bo,i.kebabCase=qd,i.last=wo,i.lastIndexOf=xo,i.lowerCase=Bd,i.lowerFirst=Ud,i.lt=kd,i.lte=Td,i.max=Ku,i.maxBy=Xu,i.mean=Gu,i.meanBy=Zu,i.min=Ju,i.minBy=Qu,i.stubArray=Fu,i.stubFalse=zu,i.stubObject=Wu,i.stubString=qu,i.stubTrue=Bu,i.multiply=hp,i.nth=Co,i.noConflict=Mu,i.noop=ju,i.now=rd,i.pad=uu,i.padEnd=cu,i.padStart=hu,i.parseInt=du,i.random=nu,i.reduce=ma,i.reduceRight=va,i.repeat=pu,i.replace=fu,i.result=Yl,i.round=dp,i.runInContext=t,i.sample=ya,i.size=xa,i.snakeCase=Yd,i.some=Ca,i.sortedIndex=Io,i.sortedIndexBy=$o,i.sortedIndexOf=Oo,i.sortedLastIndex=Po,i.sortedLastIndexBy=No,i.sortedLastIndexOf=Mo,i.startCase=Vd,i.startsWith=mu,i.subtract=pp,i.sum=tc,i.sumBy=ec,i.template=vu,i.times=Uu,i.toFinite=wl,i.toInteger=xl,i.toLength=Cl,i.toLower=_u,i.toNumber=kl,i.toSafeInteger=Dl,i.toString=Sl,i.toUpper=yu,i.trim=bu,i.trimEnd=wu,i.trimStart=xu,i.truncate=Cu,i.unescape=ku,i.uniqueId=Vu,i.upperCase=Kd,i.upperFirst=Xd,i.each=ha,i.eachRight=da,i.first=vo,Nu(i,function(){var t={};return pn(i,function(e,n){mc.call(i.prototype,n)||(t[n]=e)}),t}(),{chain:!1}),i.VERSION=\"4.17.4\",u([\"bind\",\"bindKey\",\"curry\",\"curryRight\",\"partial\",\"partialRight\"],function(t){i[t].placeholder=i}),u([\"drop\",\"take\"],function(t,e){b.prototype[t]=function(i){i=i===rt?1:Uc(xl(i),0);var n=this.__filtered__&&!e?new b(this):this.clone();return n.__filtered__?n.__takeCount__=Yc(i,n.__takeCount__):n.__views__.push({size:Yc(i,jt),type:t+(n.__dir__<0?\"Right\":\"\")}),n},b.prototype[t+\"Right\"]=function(e){return this.reverse()[t](e).reverse()}}),u([\"filter\",\"map\",\"takeWhile\"],function(t,e){var i=e+1,n=i==It||3==i;b.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:ws(t,3),type:i}),e.__filtered__=e.__filtered__||n,e}}),u([\"head\",\"last\"],function(t,e){var i=\"take\"+(e?\"Right\":\"\");b.prototype[t]=function(){return this[i](1).value()[0]}}),u([\"initial\",\"tail\"],function(t,e){var i=\"drop\"+(e?\"\":\"Right\");b.prototype[t]=function(){return this.__filtered__?new b(this):this[i](1)}}),b.prototype.compact=function(){return this.filter(Iu)},b.prototype.find=function(t){return this.filter(t).head()},b.prototype.findLast=function(t){return this.reverse().find(t)},b.prototype.invokeMap=ir(function(t,e){return\"function\"==typeof t?new b(this):this.map(function(i){return Tn(i,t,e)})}),b.prototype.reject=function(t){return this.filter(Oa(ws(t)))},b.prototype.slice=function(t,e){t=xl(t);var i=this;return i.__filtered__&&(t>0||e<0)?new b(i):(t<0?i=i.takeRight(-t):t&&(i=i.drop(t)),e!==rt&&(e=xl(e),i=e<0?i.dropRight(-e):i.take(e-t)),i)},b.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},b.prototype.toArray=function(){return this.take(jt)},pn(b.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),s=/^(?:head|last)$/.test(e),o=i[s?\"take\"+(\"last\"==e?\"Right\":\"\"):e],a=s||/^find/.test(e);o&&(i.prototype[e]=function(){var e=this.__wrapped__,l=s?[1]:arguments,u=e instanceof b,c=l[0],h=u||md(e),d=function(t){var e=o.apply(i,m([t],l));return s&&p?e[0]:e};h&&n&&\"function\"==typeof c&&1!=c.length&&(u=h=!1);var p=this.__chain__,f=!!this.__actions__.length,g=a&&!p,v=u&&!f;if(!a&&h){e=v?e:new b(this);var _=t.apply(e,l);return _.__actions__.push({func:Jo,args:[d],thisArg:rt}),new r(_,p)}return g&&v?t.apply(this,l):(_=this.thru(d),g?s?_.value()[0]:_.value():_)})}),u([\"pop\",\"push\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(t){var e=hc[t],n=/^(?:push|sort|unshift)$/.test(t)?\"tap\":\"thru\",r=/^(?:pop|shift)$/.test(t);i.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(md(i)?i:[],t)}return this[n](function(i){return e.apply(md(i)?i:[],t)})}}),pn(b.prototype,function(t,e){var n=i[e];if(n){var r=n.name+\"\";(rh[r]||(rh[r]=[])).push({name:e,func:n})}}),rh[Jr(rt,vt).name]=[{name:\"wrapper\",func:rt}],b.prototype.clone=E,b.prototype.reverse=Z,b.prototype.value=et,i.prototype.at=Xh,i.prototype.chain=Qo,i.prototype.commit=ta,i.prototype.next=ea,i.prototype.plant=na,i.prototype.reverse=ra,i.prototype.toJSON=i.prototype.valueOf=i.prototype.value=sa,i.prototype.first=i.prototype.head,Oc&&(i.prototype[Oc]=ia),i}();Oi._=Ki,(r=function(){return Ki}.call(e,i,e,n))!==rt&&(n.exports=r)}).call(this)}).call(e,i(4),i(60)(t))},function(t,e,i){var n,r,s;/*!\n * Select2 4.0.3\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\n */\n!function(o){r=[i(3)],n=o,void 0!==(s=\"function\"==typeof n?n.apply(e,r):n)&&(t.exports=s)}(function(t){var e=function(){if(t&&t.fn&&t.fn.select2&&t.fn.select2.amd)var e=t.fn.select2.amd;var e;return function(){if(!e||!e.requirejs){e?i=e:e={};/**\n * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/almond for details\n */\nvar t,i,n;!function(e){function r(t,e){return b.call(t,e)}function s(t,e){var i,n,r,s,o,a,l,u,c,h,d,p=e&&e.split(\"/\"),f=_.map,g=f&&f[\"*\"]||{};if(t&&\".\"===t.charAt(0))if(e){for(t=t.split(\"/\"),o=t.length-1,_.nodeIdCompat&&x.test(t[o])&&(t[o]=t[o].replace(x,\"\")),t=p.slice(0,p.length-1).concat(t),c=0;c<t.length;c+=1)if(\".\"===(d=t[c]))t.splice(c,1),c-=1;else if(\"..\"===d){if(1===c&&(\"..\"===t[2]||\"..\"===t[0]))break;c>0&&(t.splice(c-1,2),c-=2)}t=t.join(\"/\")}else 0===t.indexOf(\"./\")&&(t=t.substring(2));if((p||g)&&f){for(i=t.split(\"/\"),c=i.length;c>0;c-=1){if(n=i.slice(0,c).join(\"/\"),p)for(h=p.length;h>0;h-=1)if((r=f[p.slice(0,h).join(\"/\")])&&(r=r[n])){s=r,a=c;break}if(s)break;!l&&g&&g[n]&&(l=g[n],u=c)}!s&&l&&(s=l,a=u),s&&(i.splice(0,a,s),t=i.join(\"/\"))}return t}function o(t,i){return function(){var n=w.call(arguments,0);return\"string\"!=typeof n[0]&&1===n.length&&n.push(null),p.apply(e,n.concat([t,i]))}}function a(t){return function(e){return s(e,t)}}function l(t){return function(e){m[t]=e}}function u(t){if(r(v,t)){var i=v[t];delete v[t],y[t]=!0,d.apply(e,i)}if(!r(m,t)&&!r(y,t))throw new Error(\"No \"+t);return m[t]}function c(t){var e,i=t?t.indexOf(\"!\"):-1;return i>-1&&(e=t.substring(0,i),t=t.substring(i+1,t.length)),[e,t]}function h(t){return function(){return _&&_.config&&_.config[t]||{}}}var d,p,f,g,m={},v={},_={},y={},b=Object.prototype.hasOwnProperty,w=[].slice,x=/\\.js$/;f=function(t,e){var i,n=c(t),r=n[0];return t=n[1],r&&(r=s(r,e),i=u(r)),r?t=i&&i.normalize?i.normalize(t,a(e)):s(t,e):(t=s(t,e),n=c(t),r=n[0],t=n[1],r&&(i=u(r))),{f:r?r+\"!\"+t:t,n:t,pr:r,p:i}},g={require:function(t){return o(t)},exports:function(t){var e=m[t];return void 0!==e?e:m[t]={}},module:function(t){return{id:t,uri:\"\",exports:m[t],config:h(t)}}},d=function(t,i,n,s){var a,c,h,d,p,_,b=[],w=typeof n;if(s=s||t,\"undefined\"===w||\"function\"===w){for(i=!i.length&&n.length?[\"require\",\"exports\",\"module\"]:i,p=0;p<i.length;p+=1)if(d=f(i[p],s),\"require\"===(c=d.f))b[p]=g.require(t);else if(\"exports\"===c)b[p]=g.exports(t),_=!0;else if(\"module\"===c)a=b[p]=g.module(t);else if(r(m,c)||r(v,c)||r(y,c))b[p]=u(c);else{if(!d.p)throw new Error(t+\" missing \"+c);d.p.load(d.n,o(s,!0),l(c),{}),b[p]=m[c]}h=n?n.apply(m[t],b):void 0,t&&(a&&a.exports!==e&&a.exports!==m[t]?m[t]=a.exports:h===e&&_||(m[t]=h))}else t&&(m[t]=n)},t=i=p=function(t,i,n,r,s){if(\"string\"==typeof t)return g[t]?g[t](i):u(f(t,i).f);if(!t.splice){if(_=t,_.deps&&p(_.deps,_.callback),!i)return;i.splice?(t=i,i=n,n=null):t=e}return i=i||function(){},\"function\"==typeof n&&(n=r,r=s),r?d(e,t,i,n):setTimeout(function(){d(e,t,i,n)},4),p},p.config=function(t){return p(t)},t._defined=m,n=function(t,e,i){if(\"string\"!=typeof t)throw new Error(\"See almond README: incorrect module build, no module name\");e.splice||(i=e,e=[]),r(m,t)||r(v,t)||(v[t]=[t,e,i])},n.amd={jQuery:!0}}(),e.requirejs=t,e.require=i,e.define=n}}(),e.define(\"almond\",function(){}),e.define(\"jquery\",[],function(){var e=t||$;return null==e&&console&&console.error,e}),e.define(\"select2/utils\",[\"jquery\"],function(t){function e(t){var e=t.prototype,i=[];for(var n in e){\"function\"==typeof e[n]&&(\"constructor\"!==n&&i.push(n))}return i}var i={};i.Extend=function(t,e){function i(){this.constructor=t}var n={}.hasOwnProperty;for(var r in e)n.call(e,r)&&(t[r]=e[r]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},i.Decorate=function(t,i){function n(){var e=Array.prototype.unshift,n=i.prototype.constructor.length,r=t.prototype.constructor;n>0&&(e.call(arguments,t.prototype.constructor),r=i.prototype.constructor),r.apply(this,arguments)}function r(){this.constructor=n}var s=e(i),o=e(t);i.displayName=t.displayName,n.prototype=new r;for(var a=0;a<o.length;a++){var l=o[a];n.prototype[l]=t.prototype[l]}for(var u=0;u<s.length;u++){var c=s[u];n.prototype[c]=function(t){var e=function(){};t in n.prototype&&(e=n.prototype[t]);var r=i.prototype[t];return function(){return Array.prototype.unshift.call(arguments,e),r.apply(this,arguments)}}(c)}return n};var n=function(){this.listeners={}};return n.prototype.on=function(t,e){this.listeners=this.listeners||{},t in this.listeners?this.listeners[t].push(e):this.listeners[t]=[e]},n.prototype.trigger=function(t){var e=Array.prototype.slice,i=e.call(arguments,1);this.listeners=this.listeners||{},null==i&&(i=[]),0===i.length&&i.push({}),i[0]._type=t,t in this.listeners&&this.invoke(this.listeners[t],e.call(arguments,1)),\"*\"in this.listeners&&this.invoke(this.listeners[\"*\"],arguments)},n.prototype.invoke=function(t,e){for(var i=0,n=t.length;i<n;i++)t[i].apply(this,e)},i.Observable=n,i.generateChars=function(t){for(var e=\"\",i=0;i<t;i++){e+=Math.floor(36*Math.random()).toString(36)}return e},i.bind=function(t,e){return function(){t.apply(e,arguments)}},i._convertData=function(t){for(var e in t){var i=e.split(\"-\"),n=t;if(1!==i.length){for(var r=0;r<i.length;r++){var s=i[r];s=s.substring(0,1).toLowerCase()+s.substring(1),s in n||(n[s]={}),r==i.length-1&&(n[s]=t[e]),n=n[s]}delete t[e]}}return t},i.hasScroll=function(e,i){var n=t(i),r=i.style.overflowX,s=i.style.overflowY;return(r!==s||\"hidden\"!==s&&\"visible\"!==s)&&(\"scroll\"===r||\"scroll\"===s||(n.innerHeight()<i.scrollHeight||n.innerWidth()<i.scrollWidth))},i.escapeMarkup=function(t){var e={\"\\\\\":\"&#92;\",\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"/\":\"&#47;\"};return\"string\"!=typeof t?t:String(t).replace(/[&<>\"'\\/\\\\]/g,function(t){return e[t]})},i.appendMany=function(e,i){if(\"1.7\"===t.fn.jquery.substr(0,3)){var n=t();t.map(i,function(t){n=n.add(t)}),i=n}e.append(i)},i}),e.define(\"select2/results\",[\"jquery\",\"./utils\"],function(t,e){function i(t,e,n){this.$element=t,this.data=n,this.options=e,i.__super__.constructor.call(this)}return e.Extend(i,e.Observable),i.prototype.render=function(){var e=t('<ul class=\"select2-results__options\" role=\"tree\"></ul>');return this.options.get(\"multiple\")&&e.attr(\"aria-multiselectable\",\"true\"),this.$results=e,e},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(e){var i=this.options.get(\"escapeMarkup\");this.clear(),this.hideLoading();var n=t('<li role=\"treeitem\" aria-live=\"assertive\" class=\"select2-results__option\"></li>'),r=this.options.get(\"translations\").get(e.message);n.append(i(r(e.args))),n[0].className+=\" select2-results__message\",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(\".select2-results__message\").remove()},i.prototype.append=function(t){this.hideLoading();var e=[];if(null==t.results||0===t.results.length)return void(0===this.$results.children().length&&this.trigger(\"results:message\",{message:\"noResults\"}));t.results=this.sort(t.results);for(var i=0;i<t.results.length;i++){var n=t.results[i],r=this.option(n);e.push(r)}this.$results.append(e)},i.prototype.position=function(t,e){e.find(\".select2-results\").append(t)},i.prototype.sort=function(t){return this.options.get(\"sorter\")(t)},i.prototype.highlightFirstItem=function(){var t=this.$results.find(\".select2-results__option[aria-selected]\"),e=t.filter(\"[aria-selected=true]\");e.length>0?e.first().trigger(\"mouseenter\"):t.first().trigger(\"mouseenter\"),this.ensureHighlightVisible()},i.prototype.setClasses=function(){var e=this;this.data.current(function(i){var n=t.map(i,function(t){return t.id.toString()});e.$results.find(\".select2-results__option[aria-selected]\").each(function(){var e=t(this),i=t.data(this,\"data\"),r=\"\"+i.id;null!=i.element&&i.element.selected||null==i.element&&t.inArray(r,n)>-1?e.attr(\"aria-selected\",\"true\"):e.attr(\"aria-selected\",\"false\")})})},i.prototype.showLoading=function(t){this.hideLoading();var e=this.options.get(\"translations\").get(\"searching\"),i={disabled:!0,loading:!0,text:e(t)},n=this.option(i);n.className+=\" loading-results\",this.$results.prepend(n)},i.prototype.hideLoading=function(){this.$results.find(\".loading-results\").remove()},i.prototype.option=function(e){var i=document.createElement(\"li\");i.className=\"select2-results__option\";var n={role:\"treeitem\",\"aria-selected\":\"false\"};e.disabled&&(delete n[\"aria-selected\"],n[\"aria-disabled\"]=\"true\"),null==e.id&&delete n[\"aria-selected\"],null!=e._resultId&&(i.id=e._resultId),e.title&&(i.title=e.title),e.children&&(n.role=\"group\",n[\"aria-label\"]=e.text,delete n[\"aria-selected\"]);for(var r in n){var s=n[r];i.setAttribute(r,s)}if(e.children){var o=t(i),a=document.createElement(\"strong\");a.className=\"select2-results__group\";t(a);this.template(e,a);for(var l=[],u=0;u<e.children.length;u++){var c=e.children[u],h=this.option(c);l.push(h)}var d=t(\"<ul></ul>\",{class:\"select2-results__options select2-results__options--nested\"});d.append(l),o.append(a),o.append(d)}else this.template(e,i);return t.data(i,\"data\",e),i},i.prototype.bind=function(e,i){var n=this,r=e.id+\"-results\";this.$results.attr(\"id\",r),e.on(\"results:all\",function(t){n.clear(),n.append(t.data),e.isOpen()&&(n.setClasses(),n.highlightFirstItem())}),e.on(\"results:append\",function(t){n.append(t.data),e.isOpen()&&n.setClasses()}),e.on(\"query\",function(t){n.hideMessages(),n.showLoading(t)}),e.on(\"select\",function(){e.isOpen()&&(n.setClasses(),n.highlightFirstItem())}),e.on(\"unselect\",function(){e.isOpen()&&(n.setClasses(),n.highlightFirstItem())}),e.on(\"open\",function(){n.$results.attr(\"aria-expanded\",\"true\"),n.$results.attr(\"aria-hidden\",\"false\"),n.setClasses(),n.ensureHighlightVisible()}),e.on(\"close\",function(){n.$results.attr(\"aria-expanded\",\"false\"),n.$results.attr(\"aria-hidden\",\"true\"),n.$results.removeAttr(\"aria-activedescendant\")}),e.on(\"results:toggle\",function(){var t=n.getHighlightedResults();0!==t.length&&t.trigger(\"mouseup\")}),e.on(\"results:select\",function(){var t=n.getHighlightedResults();if(0!==t.length){var e=t.data(\"data\");\"true\"==t.attr(\"aria-selected\")?n.trigger(\"close\",{}):n.trigger(\"select\",{data:e})}}),e.on(\"results:previous\",function(){var t=n.getHighlightedResults(),e=n.$results.find(\"[aria-selected]\"),i=e.index(t);if(0!==i){var r=i-1;0===t.length&&(r=0);var s=e.eq(r);s.trigger(\"mouseenter\");var o=n.$results.offset().top,a=s.offset().top,l=n.$results.scrollTop()+(a-o);0===r?n.$results.scrollTop(0):a-o<0&&n.$results.scrollTop(l)}}),e.on(\"results:next\",function(){var t=n.getHighlightedResults(),e=n.$results.find(\"[aria-selected]\"),i=e.index(t),r=i+1;if(!(r>=e.length)){var s=e.eq(r);s.trigger(\"mouseenter\");var o=n.$results.offset().top+n.$results.outerHeight(!1),a=s.offset().top+s.outerHeight(!1),l=n.$results.scrollTop()+a-o;0===r?n.$results.scrollTop(0):a>o&&n.$results.scrollTop(l)}}),e.on(\"results:focus\",function(t){t.element.addClass(\"select2-results__option--highlighted\")}),e.on(\"results:message\",function(t){n.displayMessage(t)}),t.fn.mousewheel&&this.$results.on(\"mousewheel\",function(t){var e=n.$results.scrollTop(),i=n.$results.get(0).scrollHeight-e+t.deltaY,r=t.deltaY>0&&e-t.deltaY<=0,s=t.deltaY<0&&i<=n.$results.height();r?(n.$results.scrollTop(0),t.preventDefault(),t.stopPropagation()):s&&(n.$results.scrollTop(n.$results.get(0).scrollHeight-n.$results.height()),t.preventDefault(),t.stopPropagation())}),this.$results.on(\"mouseup\",\".select2-results__option[aria-selected]\",function(e){var i=t(this),r=i.data(\"data\");if(\"true\"===i.attr(\"aria-selected\"))return void(n.options.get(\"multiple\")?n.trigger(\"unselect\",{originalEvent:e,data:r}):n.trigger(\"close\",{}));n.trigger(\"select\",{originalEvent:e,data:r})}),this.$results.on(\"mouseenter\",\".select2-results__option[aria-selected]\",function(e){var i=t(this).data(\"data\");n.getHighlightedResults().removeClass(\"select2-results__option--highlighted\"),n.trigger(\"results:focus\",{data:i,element:t(this)})})},i.prototype.getHighlightedResults=function(){return this.$results.find(\".select2-results__option--highlighted\")},i.prototype.destroy=function(){this.$results.remove()},i.prototype.ensureHighlightVisible=function(){var t=this.getHighlightedResults();if(0!==t.length){var e=this.$results.find(\"[aria-selected]\"),i=e.index(t),n=this.$results.offset().top,r=t.offset().top,s=this.$results.scrollTop()+(r-n),o=r-n;s-=2*t.outerHeight(!1),i<=2?this.$results.scrollTop(0):(o>this.$results.outerHeight()||o<0)&&this.$results.scrollTop(s)}},i.prototype.template=function(e,i){var n=this.options.get(\"templateResult\"),r=this.options.get(\"escapeMarkup\"),s=n(e,i);null==s?i.style.display=\"none\":\"string\"==typeof s?i.innerHTML=r(s):t(i).append(s)},i}),e.define(\"select2/keys\",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define(\"select2/selection/base\",[\"jquery\",\"../utils\",\"../keys\"],function(t,e,i){function n(t,e){this.$element=t,this.options=e,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('<span class=\"select2-selection\" role=\"combobox\"  aria-haspopup=\"true\" aria-expanded=\"false\"></span>');return this._tabindex=0,null!=this.$element.data(\"old-tabindex\")?this._tabindex=this.$element.data(\"old-tabindex\"):null!=this.$element.attr(\"tabindex\")&&(this._tabindex=this.$element.attr(\"tabindex\")),e.attr(\"title\",this.$element.attr(\"title\")),e.attr(\"tabindex\",this._tabindex),this.$selection=e,e},n.prototype.bind=function(t,e){var n=this,r=(t.id,t.id+\"-results\");this.container=t,this.$selection.on(\"focus\",function(t){n.trigger(\"focus\",t)}),this.$selection.on(\"blur\",function(t){n._handleBlur(t)}),this.$selection.on(\"keydown\",function(t){n.trigger(\"keypress\",t),t.which===i.SPACE&&t.preventDefault()}),t.on(\"results:focus\",function(t){n.$selection.attr(\"aria-activedescendant\",t.data._resultId)}),t.on(\"selection:update\",function(t){n.update(t.data)}),t.on(\"open\",function(){n.$selection.attr(\"aria-expanded\",\"true\"),n.$selection.attr(\"aria-owns\",r),n._attachCloseHandler(t)}),t.on(\"close\",function(){n.$selection.attr(\"aria-expanded\",\"false\"),n.$selection.removeAttr(\"aria-activedescendant\"),n.$selection.removeAttr(\"aria-owns\"),n.$selection.focus(),n._detachCloseHandler(t)}),t.on(\"enable\",function(){n.$selection.attr(\"tabindex\",n._tabindex)}),t.on(\"disable\",function(){n.$selection.attr(\"tabindex\",\"-1\")})},n.prototype._handleBlur=function(e){var i=this;window.setTimeout(function(){document.activeElement==i.$selection[0]||t.contains(i.$selection[0],document.activeElement)||i.trigger(\"blur\",e)},1)},n.prototype._attachCloseHandler=function(e){t(document.body).on(\"mousedown.select2.\"+e.id,function(e){var i=t(e.target),n=i.closest(\".select2\");t(\".select2.select2-container--open\").each(function(){var e=t(this);this!=n[0]&&e.data(\"element\").select2(\"close\")})})},n.prototype._detachCloseHandler=function(e){t(document.body).off(\"mousedown.select2.\"+e.id)},n.prototype.position=function(t,e){e.find(\".selection\").append(t)},n.prototype.destroy=function(){this._detachCloseHandler(this.container)},n.prototype.update=function(t){throw new Error(\"The `update` method must be defined in child classes.\")},n}),e.define(\"select2/selection/single\",[\"jquery\",\"./base\",\"../utils\",\"../keys\"],function(t,e,i,n){function r(){r.__super__.constructor.apply(this,arguments)}return i.Extend(r,e),r.prototype.render=function(){var t=r.__super__.render.call(this);return t.addClass(\"select2-selection--single\"),t.html('<span class=\"select2-selection__rendered\"></span><span class=\"select2-selection__arrow\" role=\"presentation\"><b role=\"presentation\"></b></span>'),t},r.prototype.bind=function(t,e){var i=this;r.__super__.bind.apply(this,arguments);var n=t.id+\"-container\";this.$selection.find(\".select2-selection__rendered\").attr(\"id\",n),this.$selection.attr(\"aria-labelledby\",n),this.$selection.on(\"mousedown\",function(t){1===t.which&&i.trigger(\"toggle\",{originalEvent:t})}),this.$selection.on(\"focus\",function(t){}),this.$selection.on(\"blur\",function(t){}),t.on(\"focus\",function(e){t.isOpen()||i.$selection.focus()}),t.on(\"selection:update\",function(t){i.update(t.data)})},r.prototype.clear=function(){this.$selection.find(\".select2-selection__rendered\").empty()},r.prototype.display=function(t,e){var i=this.options.get(\"templateSelection\");return this.options.get(\"escapeMarkup\")(i(t,e))},r.prototype.selectionContainer=function(){return t(\"<span></span>\")},r.prototype.update=function(t){if(0===t.length)return void this.clear();var e=t[0],i=this.$selection.find(\".select2-selection__rendered\"),n=this.display(e,i);i.empty().append(n),i.prop(\"title\",e.title||e.text)},r}),e.define(\"select2/selection/multiple\",[\"jquery\",\"./base\",\"../utils\"],function(t,e,i){function n(t,e){n.__super__.constructor.apply(this,arguments)}return i.Extend(n,e),n.prototype.render=function(){var t=n.__super__.render.call(this);return t.addClass(\"select2-selection--multiple\"),t.html('<ul class=\"select2-selection__rendered\"></ul>'),t},n.prototype.bind=function(e,i){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on(\"click\",function(t){r.trigger(\"toggle\",{originalEvent:t})}),this.$selection.on(\"click\",\".select2-selection__choice__remove\",function(e){if(!r.options.get(\"disabled\")){var i=t(this),n=i.parent(),s=n.data(\"data\");r.trigger(\"unselect\",{originalEvent:e,data:s})}})},n.prototype.clear=function(){this.$selection.find(\".select2-selection__rendered\").empty()},n.prototype.display=function(t,e){var i=this.options.get(\"templateSelection\");return this.options.get(\"escapeMarkup\")(i(t,e))},n.prototype.selectionContainer=function(){return t('<li class=\"select2-selection__choice\"><span class=\"select2-selection__choice__remove\" role=\"presentation\">&times;</span></li>')},n.prototype.update=function(t){if(this.clear(),0!==t.length){for(var e=[],n=0;n<t.length;n++){var r=t[n],s=this.selectionContainer(),o=this.display(r,s);s.append(o),s.prop(\"title\",r.title||r.text),s.data(\"data\",r),e.push(s)}var a=this.$selection.find(\".select2-selection__rendered\");i.appendMany(a,e)}},n}),e.define(\"select2/selection/placeholder\",[\"../utils\"],function(t){function e(t,e,i){this.placeholder=this.normalizePlaceholder(i.get(\"placeholder\")),t.call(this,e,i)}return e.prototype.normalizePlaceholder=function(t,e){return\"string\"==typeof e&&(e={id:\"\",text:e}),e},e.prototype.createPlaceholder=function(t,e){var i=this.selectionContainer();return i.html(this.display(e)),i.addClass(\"select2-selection__placeholder\").removeClass(\"select2-selection__choice\"),i},e.prototype.update=function(t,e){var i=1==e.length&&e[0].id!=this.placeholder.id;if(e.length>1||i)return t.call(this,e);this.clear();var n=this.createPlaceholder(this.placeholder);this.$selection.find(\".select2-selection__rendered\").append(n)},e}),e.define(\"select2/selection/allowClear\",[\"jquery\",\"../keys\"],function(t,e){function i(){}return i.prototype.bind=function(t,e,i){var n=this;t.call(this,e,i),null==this.placeholder&&this.options.get(\"debug\")&&window.console&&console.error,this.$selection.on(\"mousedown\",\".select2-selection__clear\",function(t){n._handleClear(t)}),e.on(\"keypress\",function(t){n._handleKeyboardClear(t,e)})},i.prototype._handleClear=function(t,e){if(!this.options.get(\"disabled\")){var i=this.$selection.find(\".select2-selection__clear\");if(0!==i.length){e.stopPropagation();for(var n=i.data(\"data\"),r=0;r<n.length;r++){var s={data:n[r]};if(this.trigger(\"unselect\",s),s.prevented)return}this.$element.val(this.placeholder.id).trigger(\"change\"),this.trigger(\"toggle\",{})}}},i.prototype._handleKeyboardClear=function(t,i,n){n.isOpen()||i.which!=e.DELETE&&i.which!=e.BACKSPACE||this._handleClear(i)},i.prototype.update=function(e,i){if(e.call(this,i),!(this.$selection.find(\".select2-selection__placeholder\").length>0||0===i.length)){var n=t('<span class=\"select2-selection__clear\">&times;</span>');n.data(\"data\",i),this.$selection.find(\".select2-selection__rendered\").prepend(n)}},i}),e.define(\"select2/selection/search\",[\"jquery\",\"../utils\",\"../keys\"],function(t,e,i){function n(t,e,i){t.call(this,e,i)}return n.prototype.render=function(e){var i=t('<li class=\"select2-search select2-search--inline\"><input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"textbox\" aria-autocomplete=\"list\" /></li>');this.$searchContainer=i,this.$search=i.find(\"input\");var n=e.call(this);return this._transferTabIndex(),n},n.prototype.bind=function(t,e,n){var r=this;t.call(this,e,n),e.on(\"open\",function(){r.$search.trigger(\"focus\")}),e.on(\"close\",function(){r.$search.val(\"\"),r.$search.removeAttr(\"aria-activedescendant\"),r.$search.trigger(\"focus\")}),e.on(\"enable\",function(){r.$search.prop(\"disabled\",!1),r._transferTabIndex()}),e.on(\"disable\",function(){r.$search.prop(\"disabled\",!0)}),e.on(\"focus\",function(t){r.$search.trigger(\"focus\")}),e.on(\"results:focus\",function(t){r.$search.attr(\"aria-activedescendant\",t.id)}),this.$selection.on(\"focusin\",\".select2-search--inline\",function(t){r.trigger(\"focus\",t)}),this.$selection.on(\"focusout\",\".select2-search--inline\",function(t){r._handleBlur(t)}),this.$selection.on(\"keydown\",\".select2-search--inline\",function(t){if(t.stopPropagation(),r.trigger(\"keypress\",t),r._keyUpPrevented=t.isDefaultPrevented(),t.which===i.BACKSPACE&&\"\"===r.$search.val()){var e=r.$searchContainer.prev(\".select2-selection__choice\");if(e.length>0){var n=e.data(\"data\");r.searchRemoveChoice(n),t.preventDefault()}}});var s=document.documentMode,o=s&&s<=11;this.$selection.on(\"input.searchcheck\",\".select2-search--inline\",function(t){if(o)return void r.$selection.off(\"input.search input.searchcheck\");r.$selection.off(\"keyup.search\")}),this.$selection.on(\"keyup.search input.search\",\".select2-search--inline\",function(t){if(o&&\"input\"===t.type)return void r.$selection.off(\"input.search input.searchcheck\");var e=t.which;e!=i.SHIFT&&e!=i.CTRL&&e!=i.ALT&&e!=i.TAB&&r.handleSearch(t)})},n.prototype._transferTabIndex=function(t){this.$search.attr(\"tabindex\",this.$selection.attr(\"tabindex\")),this.$selection.attr(\"tabindex\",\"-1\")},n.prototype.createPlaceholder=function(t,e){this.$search.attr(\"placeholder\",e.text)},n.prototype.update=function(t,e){var i=this.$search[0]==document.activeElement;this.$search.attr(\"placeholder\",\"\"),t.call(this,e),this.$selection.find(\".select2-selection__rendered\").append(this.$searchContainer),this.resizeSearch(),i&&this.$search.focus()},n.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var t=this.$search.val();this.trigger(\"query\",{term:t})}this._keyUpPrevented=!1},n.prototype.searchRemoveChoice=function(t,e){this.trigger(\"unselect\",{data:e}),this.$search.val(e.text),this.handleSearch()},n.prototype.resizeSearch=function(){this.$search.css(\"width\",\"25px\");var t=\"\";if(\"\"!==this.$search.attr(\"placeholder\"))t=this.$selection.find(\".select2-selection__rendered\").innerWidth();else{t=.75*(this.$search.val().length+1)+\"em\"}this.$search.css(\"width\",t)},n}),e.define(\"select2/selection/eventRelay\",[\"jquery\"],function(t){function e(){}return e.prototype.bind=function(e,i,n){var r=this,s=[\"open\",\"opening\",\"close\",\"closing\",\"select\",\"selecting\",\"unselect\",\"unselecting\"],o=[\"opening\",\"closing\",\"selecting\",\"unselecting\"];e.call(this,i,n),i.on(\"*\",function(e,i){if(-1!==t.inArray(e,s)){i=i||{};var n=t.Event(\"select2:\"+e,{params:i});r.$element.trigger(n),-1!==t.inArray(e,o)&&(i.prevented=n.isDefaultPrevented())}})},e}),e.define(\"select2/translation\",[\"jquery\",\"require\"],function(t,e){function i(t){this.dict=t||{}}return i.prototype.all=function(){return this.dict},i.prototype.get=function(t){return this.dict[t]},i.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},i._cache={},i.loadPath=function(t){if(!(t in i._cache)){var n=e(t);i._cache[t]=n}return new i(i._cache[t])},i}),e.define(\"select2/diacritics\",[],function(){return{\"Ⓐ\":\"A\",\"A\":\"A\",\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ầ\":\"A\",\"Ấ\":\"A\",\"Ẫ\":\"A\",\"Ẩ\":\"A\",\"Ã\":\"A\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ằ\":\"A\",\"Ắ\":\"A\",\"Ẵ\":\"A\",\"Ẳ\":\"A\",\"Ȧ\":\"A\",\"Ǡ\":\"A\",\"Ä\":\"A\",\"Ǟ\":\"A\",\"Ả\":\"A\",\"Å\":\"A\",\"Ǻ\":\"A\",\"Ǎ\":\"A\",\"Ȁ\":\"A\",\"Ȃ\":\"A\",\"Ạ\":\"A\",\"Ậ\":\"A\",\"Ặ\":\"A\",\"Ḁ\":\"A\",\"Ą\":\"A\",\"Ⱥ\":\"A\",\"Ɐ\":\"A\",\"Ꜳ\":\"AA\",\"Æ\":\"AE\",\"Ǽ\":\"AE\",\"Ǣ\":\"AE\",\"Ꜵ\":\"AO\",\"Ꜷ\":\"AU\",\"Ꜹ\":\"AV\",\"Ꜻ\":\"AV\",\"Ꜽ\":\"AY\",\"Ⓑ\":\"B\",\"B\":\"B\",\"Ḃ\":\"B\",\"Ḅ\":\"B\",\"Ḇ\":\"B\",\"Ƀ\":\"B\",\"Ƃ\":\"B\",\"Ɓ\":\"B\",\"Ⓒ\":\"C\",\"C\":\"C\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"Ç\":\"C\",\"Ḉ\":\"C\",\"Ƈ\":\"C\",\"Ȼ\":\"C\",\"Ꜿ\":\"C\",\"Ⓓ\":\"D\",\"D\":\"D\",\"Ḋ\":\"D\",\"Ď\":\"D\",\"Ḍ\":\"D\",\"Ḑ\":\"D\",\"Ḓ\":\"D\",\"Ḏ\":\"D\",\"Đ\":\"D\",\"Ƌ\":\"D\",\"Ɗ\":\"D\",\"Ɖ\":\"D\",\"Ꝺ\":\"D\",\"DZ\":\"DZ\",\"DŽ\":\"DZ\",\"Dz\":\"Dz\",\"Dž\":\"Dz\",\"Ⓔ\":\"E\",\"E\":\"E\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ề\":\"E\",\"Ế\":\"E\",\"Ễ\":\"E\",\"Ể\":\"E\",\"Ẽ\":\"E\",\"Ē\":\"E\",\"Ḕ\":\"E\",\"Ḗ\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ë\":\"E\",\"Ẻ\":\"E\",\"Ě\":\"E\",\"Ȅ\":\"E\",\"Ȇ\":\"E\",\"Ẹ\":\"E\",\"Ệ\":\"E\",\"Ȩ\":\"E\",\"Ḝ\":\"E\",\"Ę\":\"E\",\"Ḙ\":\"E\",\"Ḛ\":\"E\",\"Ɛ\":\"E\",\"Ǝ\":\"E\",\"Ⓕ\":\"F\",\"F\":\"F\",\"Ḟ\":\"F\",\"Ƒ\":\"F\",\"Ꝼ\":\"F\",\"Ⓖ\":\"G\",\"G\":\"G\",\"Ǵ\":\"G\",\"Ĝ\":\"G\",\"Ḡ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ǧ\":\"G\",\"Ģ\":\"G\",\"Ǥ\":\"G\",\"Ɠ\":\"G\",\"Ꞡ\":\"G\",\"Ᵹ\":\"G\",\"Ꝿ\":\"G\",\"Ⓗ\":\"H\",\"H\":\"H\",\"Ĥ\":\"H\",\"Ḣ\":\"H\",\"Ḧ\":\"H\",\"Ȟ\":\"H\",\"Ḥ\":\"H\",\"Ḩ\":\"H\",\"Ḫ\":\"H\",\"Ħ\":\"H\",\"Ⱨ\":\"H\",\"Ⱶ\":\"H\",\"Ɥ\":\"H\",\"Ⓘ\":\"I\",\"I\":\"I\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"İ\":\"I\",\"Ï\":\"I\",\"Ḯ\":\"I\",\"Ỉ\":\"I\",\"Ǐ\":\"I\",\"Ȉ\":\"I\",\"Ȋ\":\"I\",\"Ị\":\"I\",\"Į\":\"I\",\"Ḭ\":\"I\",\"Ɨ\":\"I\",\"Ⓙ\":\"J\",\"J\":\"J\",\"Ĵ\":\"J\",\"Ɉ\":\"J\",\"Ⓚ\":\"K\",\"K\":\"K\",\"Ḱ\":\"K\",\"Ǩ\":\"K\",\"Ḳ\":\"K\",\"Ķ\":\"K\",\"Ḵ\":\"K\",\"Ƙ\":\"K\",\"Ⱪ\":\"K\",\"Ꝁ\":\"K\",\"Ꝃ\":\"K\",\"Ꝅ\":\"K\",\"Ꞣ\":\"K\",\"Ⓛ\":\"L\",\"L\":\"L\",\"Ŀ\":\"L\",\"Ĺ\":\"L\",\"Ľ\":\"L\",\"Ḷ\":\"L\",\"Ḹ\":\"L\",\"Ļ\":\"L\",\"Ḽ\":\"L\",\"Ḻ\":\"L\",\"Ł\":\"L\",\"Ƚ\":\"L\",\"Ɫ\":\"L\",\"Ⱡ\":\"L\",\"Ꝉ\":\"L\",\"Ꝇ\":\"L\",\"Ꞁ\":\"L\",\"LJ\":\"LJ\",\"Lj\":\"Lj\",\"Ⓜ\":\"M\",\"M\":\"M\",\"Ḿ\":\"M\",\"Ṁ\":\"M\",\"Ṃ\":\"M\",\"Ɱ\":\"M\",\"Ɯ\":\"M\",\"Ⓝ\":\"N\",\"N\":\"N\",\"Ǹ\":\"N\",\"Ń\":\"N\",\"Ñ\":\"N\",\"Ṅ\":\"N\",\"Ň\":\"N\",\"Ṇ\":\"N\",\"Ņ\":\"N\",\"Ṋ\":\"N\",\"Ṉ\":\"N\",\"Ƞ\":\"N\",\"Ɲ\":\"N\",\"Ꞑ\":\"N\",\"Ꞥ\":\"N\",\"NJ\":\"NJ\",\"Nj\":\"Nj\",\"Ⓞ\":\"O\",\"O\":\"O\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Ồ\":\"O\",\"Ố\":\"O\",\"Ỗ\":\"O\",\"Ổ\":\"O\",\"Õ\":\"O\",\"Ṍ\":\"O\",\"Ȭ\":\"O\",\"Ṏ\":\"O\",\"Ō\":\"O\",\"Ṑ\":\"O\",\"Ṓ\":\"O\",\"Ŏ\":\"O\",\"Ȯ\":\"O\",\"Ȱ\":\"O\",\"Ö\":\"O\",\"Ȫ\":\"O\",\"Ỏ\":\"O\",\"Ő\":\"O\",\"Ǒ\":\"O\",\"Ȍ\":\"O\",\"Ȏ\":\"O\",\"Ơ\":\"O\",\"Ờ\":\"O\",\"Ớ\":\"O\",\"Ỡ\":\"O\",\"Ở\":\"O\",\"Ợ\":\"O\",\"Ọ\":\"O\",\"Ộ\":\"O\",\"Ǫ\":\"O\",\"Ǭ\":\"O\",\"Ø\":\"O\",\"Ǿ\":\"O\",\"Ɔ\":\"O\",\"Ɵ\":\"O\",\"Ꝋ\":\"O\",\"Ꝍ\":\"O\",\"Ƣ\":\"OI\",\"Ꝏ\":\"OO\",\"Ȣ\":\"OU\",\"Ⓟ\":\"P\",\"P\":\"P\",\"Ṕ\":\"P\",\"Ṗ\":\"P\",\"Ƥ\":\"P\",\"Ᵽ\":\"P\",\"Ꝑ\":\"P\",\"Ꝓ\":\"P\",\"Ꝕ\":\"P\",\"Ⓠ\":\"Q\",\"Q\":\"Q\",\"Ꝗ\":\"Q\",\"Ꝙ\":\"Q\",\"Ɋ\":\"Q\",\"Ⓡ\":\"R\",\"R\":\"R\",\"Ŕ\":\"R\",\"Ṙ\":\"R\",\"Ř\":\"R\",\"Ȑ\":\"R\",\"Ȓ\":\"R\",\"Ṛ\":\"R\",\"Ṝ\":\"R\",\"Ŗ\":\"R\",\"Ṟ\":\"R\",\"Ɍ\":\"R\",\"Ɽ\":\"R\",\"Ꝛ\":\"R\",\"Ꞧ\":\"R\",\"Ꞃ\":\"R\",\"Ⓢ\":\"S\",\"S\":\"S\",\"ẞ\":\"S\",\"Ś\":\"S\",\"Ṥ\":\"S\",\"Ŝ\":\"S\",\"Ṡ\":\"S\",\"Š\":\"S\",\"Ṧ\":\"S\",\"Ṣ\":\"S\",\"Ṩ\":\"S\",\"Ș\":\"S\",\"Ş\":\"S\",\"Ȿ\":\"S\",\"Ꞩ\":\"S\",\"Ꞅ\":\"S\",\"Ⓣ\":\"T\",\"T\":\"T\",\"Ṫ\":\"T\",\"Ť\":\"T\",\"Ṭ\":\"T\",\"Ț\":\"T\",\"Ţ\":\"T\",\"Ṱ\":\"T\",\"Ṯ\":\"T\",\"Ŧ\":\"T\",\"Ƭ\":\"T\",\"Ʈ\":\"T\",\"Ⱦ\":\"T\",\"Ꞇ\":\"T\",\"Ꜩ\":\"TZ\",\"Ⓤ\":\"U\",\"U\":\"U\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ũ\":\"U\",\"Ṹ\":\"U\",\"Ū\":\"U\",\"Ṻ\":\"U\",\"Ŭ\":\"U\",\"Ü\":\"U\",\"Ǜ\":\"U\",\"Ǘ\":\"U\",\"Ǖ\":\"U\",\"Ǚ\":\"U\",\"Ủ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ǔ\":\"U\",\"Ȕ\":\"U\",\"Ȗ\":\"U\",\"Ư\":\"U\",\"Ừ\":\"U\",\"Ứ\":\"U\",\"Ữ\":\"U\",\"Ử\":\"U\",\"Ự\":\"U\",\"Ụ\":\"U\",\"Ṳ\":\"U\",\"Ų\":\"U\",\"Ṷ\":\"U\",\"Ṵ\":\"U\",\"Ʉ\":\"U\",\"Ⓥ\":\"V\",\"V\":\"V\",\"Ṽ\":\"V\",\"Ṿ\":\"V\",\"Ʋ\":\"V\",\"Ꝟ\":\"V\",\"Ʌ\":\"V\",\"Ꝡ\":\"VY\",\"Ⓦ\":\"W\",\"W\":\"W\",\"Ẁ\":\"W\",\"Ẃ\":\"W\",\"Ŵ\":\"W\",\"Ẇ\":\"W\",\"Ẅ\":\"W\",\"Ẉ\":\"W\",\"Ⱳ\":\"W\",\"Ⓧ\":\"X\",\"X\":\"X\",\"Ẋ\":\"X\",\"Ẍ\":\"X\",\"Ⓨ\":\"Y\",\"Y\":\"Y\",\"Ỳ\":\"Y\",\"Ý\":\"Y\",\"Ŷ\":\"Y\",\"Ỹ\":\"Y\",\"Ȳ\":\"Y\",\"Ẏ\":\"Y\",\"Ÿ\":\"Y\",\"Ỷ\":\"Y\",\"Ỵ\":\"Y\",\"Ƴ\":\"Y\",\"Ɏ\":\"Y\",\"Ỿ\":\"Y\",\"Ⓩ\":\"Z\",\"Z\":\"Z\",\"Ź\":\"Z\",\"Ẑ\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"Ẓ\":\"Z\",\"Ẕ\":\"Z\",\"Ƶ\":\"Z\",\"Ȥ\":\"Z\",\"Ɀ\":\"Z\",\"Ⱬ\":\"Z\",\"Ꝣ\":\"Z\",\"ⓐ\":\"a\",\"a\":\"a\",\"ẚ\":\"a\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ầ\":\"a\",\"ấ\":\"a\",\"ẫ\":\"a\",\"ẩ\":\"a\",\"ã\":\"a\",\"ā\":\"a\",\"ă\":\"a\",\"ằ\":\"a\",\"ắ\":\"a\",\"ẵ\":\"a\",\"ẳ\":\"a\",\"ȧ\":\"a\",\"ǡ\":\"a\",\"ä\":\"a\",\"ǟ\":\"a\",\"ả\":\"a\",\"å\":\"a\",\"ǻ\":\"a\",\"ǎ\":\"a\",\"ȁ\":\"a\",\"ȃ\":\"a\",\"ạ\":\"a\",\"ậ\":\"a\",\"ặ\":\"a\",\"ḁ\":\"a\",\"ą\":\"a\",\"ⱥ\":\"a\",\"ɐ\":\"a\",\"ꜳ\":\"aa\",\"æ\":\"ae\",\"ǽ\":\"ae\",\"ǣ\":\"ae\",\"ꜵ\":\"ao\",\"ꜷ\":\"au\",\"ꜹ\":\"av\",\"ꜻ\":\"av\",\"ꜽ\":\"ay\",\"ⓑ\":\"b\",\"b\":\"b\",\"ḃ\":\"b\",\"ḅ\":\"b\",\"ḇ\":\"b\",\"ƀ\":\"b\",\"ƃ\":\"b\",\"ɓ\":\"b\",\"ⓒ\":\"c\",\"c\":\"c\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"ç\":\"c\",\"ḉ\":\"c\",\"ƈ\":\"c\",\"ȼ\":\"c\",\"ꜿ\":\"c\",\"ↄ\":\"c\",\"ⓓ\":\"d\",\"d\":\"d\",\"ḋ\":\"d\",\"ď\":\"d\",\"ḍ\":\"d\",\"ḑ\":\"d\",\"ḓ\":\"d\",\"ḏ\":\"d\",\"đ\":\"d\",\"ƌ\":\"d\",\"ɖ\":\"d\",\"ɗ\":\"d\",\"ꝺ\":\"d\",\"dz\":\"dz\",\"dž\":\"dz\",\"ⓔ\":\"e\",\"e\":\"e\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ề\":\"e\",\"ế\":\"e\",\"ễ\":\"e\",\"ể\":\"e\",\"ẽ\":\"e\",\"ē\":\"e\",\"ḕ\":\"e\",\"ḗ\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ë\":\"e\",\"ẻ\":\"e\",\"ě\":\"e\",\"ȅ\":\"e\",\"ȇ\":\"e\",\"ẹ\":\"e\",\"ệ\":\"e\",\"ȩ\":\"e\",\"ḝ\":\"e\",\"ę\":\"e\",\"ḙ\":\"e\",\"ḛ\":\"e\",\"ɇ\":\"e\",\"ɛ\":\"e\",\"ǝ\":\"e\",\"ⓕ\":\"f\",\"f\":\"f\",\"ḟ\":\"f\",\"ƒ\":\"f\",\"ꝼ\":\"f\",\"ⓖ\":\"g\",\"g\":\"g\",\"ǵ\":\"g\",\"ĝ\":\"g\",\"ḡ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ǧ\":\"g\",\"ģ\":\"g\",\"ǥ\":\"g\",\"ɠ\":\"g\",\"ꞡ\":\"g\",\"ᵹ\":\"g\",\"ꝿ\":\"g\",\"ⓗ\":\"h\",\"h\":\"h\",\"ĥ\":\"h\",\"ḣ\":\"h\",\"ḧ\":\"h\",\"ȟ\":\"h\",\"ḥ\":\"h\",\"ḩ\":\"h\",\"ḫ\":\"h\",\"ẖ\":\"h\",\"ħ\":\"h\",\"ⱨ\":\"h\",\"ⱶ\":\"h\",\"ɥ\":\"h\",\"ƕ\":\"hv\",\"ⓘ\":\"i\",\"i\":\"i\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"ï\":\"i\",\"ḯ\":\"i\",\"ỉ\":\"i\",\"ǐ\":\"i\",\"ȉ\":\"i\",\"ȋ\":\"i\",\"ị\":\"i\",\"į\":\"i\",\"ḭ\":\"i\",\"ɨ\":\"i\",\"ı\":\"i\",\"ⓙ\":\"j\",\"j\":\"j\",\"ĵ\":\"j\",\"ǰ\":\"j\",\"ɉ\":\"j\",\"ⓚ\":\"k\",\"k\":\"k\",\"ḱ\":\"k\",\"ǩ\":\"k\",\"ḳ\":\"k\",\"ķ\":\"k\",\"ḵ\":\"k\",\"ƙ\":\"k\",\"ⱪ\":\"k\",\"ꝁ\":\"k\",\"ꝃ\":\"k\",\"ꝅ\":\"k\",\"ꞣ\":\"k\",\"ⓛ\":\"l\",\"l\":\"l\",\"ŀ\":\"l\",\"ĺ\":\"l\",\"ľ\":\"l\",\"ḷ\":\"l\",\"ḹ\":\"l\",\"ļ\":\"l\",\"ḽ\":\"l\",\"ḻ\":\"l\",\"ſ\":\"l\",\"ł\":\"l\",\"ƚ\":\"l\",\"ɫ\":\"l\",\"ⱡ\":\"l\",\"ꝉ\":\"l\",\"ꞁ\":\"l\",\"ꝇ\":\"l\",\"lj\":\"lj\",\"ⓜ\":\"m\",\"m\":\"m\",\"ḿ\":\"m\",\"ṁ\":\"m\",\"ṃ\":\"m\",\"ɱ\":\"m\",\"ɯ\":\"m\",\"ⓝ\":\"n\",\"n\":\"n\",\"ǹ\":\"n\",\"ń\":\"n\",\"ñ\":\"n\",\"ṅ\":\"n\",\"ň\":\"n\",\"ṇ\":\"n\",\"ņ\":\"n\",\"ṋ\":\"n\",\"ṉ\":\"n\",\"ƞ\":\"n\",\"ɲ\":\"n\",\"ʼn\":\"n\",\"ꞑ\":\"n\",\"ꞥ\":\"n\",\"nj\":\"nj\",\"ⓞ\":\"o\",\"o\":\"o\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"ồ\":\"o\",\"ố\":\"o\",\"ỗ\":\"o\",\"ổ\":\"o\",\"õ\":\"o\",\"ṍ\":\"o\",\"ȭ\":\"o\",\"ṏ\":\"o\",\"ō\":\"o\",\"ṑ\":\"o\",\"ṓ\":\"o\",\"ŏ\":\"o\",\"ȯ\":\"o\",\"ȱ\":\"o\",\"ö\":\"o\",\"ȫ\":\"o\",\"ỏ\":\"o\",\"ő\":\"o\",\"ǒ\":\"o\",\"ȍ\":\"o\",\"ȏ\":\"o\",\"ơ\":\"o\",\"ờ\":\"o\",\"ớ\":\"o\",\"ỡ\":\"o\",\"ở\":\"o\",\"ợ\":\"o\",\"ọ\":\"o\",\"ộ\":\"o\",\"ǫ\":\"o\",\"ǭ\":\"o\",\"ø\":\"o\",\"ǿ\":\"o\",\"ɔ\":\"o\",\"ꝋ\":\"o\",\"ꝍ\":\"o\",\"ɵ\":\"o\",\"ƣ\":\"oi\",\"ȣ\":\"ou\",\"ꝏ\":\"oo\",\"ⓟ\":\"p\",\"p\":\"p\",\"ṕ\":\"p\",\"ṗ\":\"p\",\"ƥ\":\"p\",\"ᵽ\":\"p\",\"ꝑ\":\"p\",\"ꝓ\":\"p\",\"ꝕ\":\"p\",\"ⓠ\":\"q\",\"q\":\"q\",\"ɋ\":\"q\",\"ꝗ\":\"q\",\"ꝙ\":\"q\",\"ⓡ\":\"r\",\"r\":\"r\",\"ŕ\":\"r\",\"ṙ\":\"r\",\"ř\":\"r\",\"ȑ\":\"r\",\"ȓ\":\"r\",\"ṛ\":\"r\",\"ṝ\":\"r\",\"ŗ\":\"r\",\"ṟ\":\"r\",\"ɍ\":\"r\",\"ɽ\":\"r\",\"ꝛ\":\"r\",\"ꞧ\":\"r\",\"ꞃ\":\"r\",\"ⓢ\":\"s\",\"s\":\"s\",\"ß\":\"s\",\"ś\":\"s\",\"ṥ\":\"s\",\"ŝ\":\"s\",\"ṡ\":\"s\",\"š\":\"s\",\"ṧ\":\"s\",\"ṣ\":\"s\",\"ṩ\":\"s\",\"ș\":\"s\",\"ş\":\"s\",\"ȿ\":\"s\",\"ꞩ\":\"s\",\"ꞅ\":\"s\",\"ẛ\":\"s\",\"ⓣ\":\"t\",\"t\":\"t\",\"ṫ\":\"t\",\"ẗ\":\"t\",\"ť\":\"t\",\"ṭ\":\"t\",\"ț\":\"t\",\"ţ\":\"t\",\"ṱ\":\"t\",\"ṯ\":\"t\",\"ŧ\":\"t\",\"ƭ\":\"t\",\"ʈ\":\"t\",\"ⱦ\":\"t\",\"ꞇ\":\"t\",\"ꜩ\":\"tz\",\"ⓤ\":\"u\",\"u\":\"u\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ũ\":\"u\",\"ṹ\":\"u\",\"ū\":\"u\",\"ṻ\":\"u\",\"ŭ\":\"u\",\"ü\":\"u\",\"ǜ\":\"u\",\"ǘ\":\"u\",\"ǖ\":\"u\",\"ǚ\":\"u\",\"ủ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ǔ\":\"u\",\"ȕ\":\"u\",\"ȗ\":\"u\",\"ư\":\"u\",\"ừ\":\"u\",\"ứ\":\"u\",\"ữ\":\"u\",\"ử\":\"u\",\"ự\":\"u\",\"ụ\":\"u\",\"ṳ\":\"u\",\"ų\":\"u\",\"ṷ\":\"u\",\"ṵ\":\"u\",\"ʉ\":\"u\",\"ⓥ\":\"v\",\"v\":\"v\",\"ṽ\":\"v\",\"ṿ\":\"v\",\"ʋ\":\"v\",\"ꝟ\":\"v\",\"ʌ\":\"v\",\"ꝡ\":\"vy\",\"ⓦ\":\"w\",\"w\":\"w\",\"ẁ\":\"w\",\"ẃ\":\"w\",\"ŵ\":\"w\",\"ẇ\":\"w\",\"ẅ\":\"w\",\"ẘ\":\"w\",\"ẉ\":\"w\",\"ⱳ\":\"w\",\"ⓧ\":\"x\",\"x\":\"x\",\"ẋ\":\"x\",\"ẍ\":\"x\",\"ⓨ\":\"y\",\"y\":\"y\",\"ỳ\":\"y\",\"ý\":\"y\",\"ŷ\":\"y\",\"ỹ\":\"y\",\"ȳ\":\"y\",\"ẏ\":\"y\",\"ÿ\":\"y\",\"ỷ\":\"y\",\"ẙ\":\"y\",\"ỵ\":\"y\",\"ƴ\":\"y\",\"ɏ\":\"y\",\"ỿ\":\"y\",\"ⓩ\":\"z\",\"z\":\"z\",\"ź\":\"z\",\"ẑ\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"ẓ\":\"z\",\"ẕ\":\"z\",\"ƶ\":\"z\",\"ȥ\":\"z\",\"ɀ\":\"z\",\"ⱬ\":\"z\",\"ꝣ\":\"z\",\"Ά\":\"Α\",\"Έ\":\"Ε\",\"Ή\":\"Η\",\"Ί\":\"Ι\",\"Ϊ\":\"Ι\",\"Ό\":\"Ο\",\"Ύ\":\"Υ\",\"Ϋ\":\"Υ\",\"Ώ\":\"Ω\",\"ά\":\"α\",\"έ\":\"ε\",\"ή\":\"η\",\"ί\":\"ι\",\"ϊ\":\"ι\",\"ΐ\":\"ι\",\"ό\":\"ο\",\"ύ\":\"υ\",\"ϋ\":\"υ\",\"ΰ\":\"υ\",\"ω\":\"ω\",\"ς\":\"σ\"}}),e.define(\"select2/data/base\",[\"../utils\"],function(t){function e(t,i){e.__super__.constructor.call(this)}return t.Extend(e,t.Observable),e.prototype.current=function(t){throw new Error(\"The `current` method must be defined in child classes.\")},e.prototype.query=function(t,e){throw new Error(\"The `query` method must be defined in child classes.\")},e.prototype.bind=function(t,e){},e.prototype.destroy=function(){},e.prototype.generateResultId=function(e,i){var n=e.id+\"-result-\";return n+=t.generateChars(4),null!=i.id?n+=\"-\"+i.id.toString():n+=\"-\"+t.generateChars(4),n},e}),e.define(\"select2/data/select\",[\"./base\",\"../utils\",\"jquery\"],function(t,e,i){function n(t,e){this.$element=t,this.options=e,n.__super__.constructor.call(this)}return e.Extend(n,t),n.prototype.current=function(t){var e=[],n=this;this.$element.find(\":selected\").each(function(){var t=i(this),r=n.item(t);e.push(r)}),t(e)},n.prototype.select=function(t){var e=this;if(t.selected=!0,i(t.element).is(\"option\"))return t.element.selected=!0,void this.$element.trigger(\"change\");if(this.$element.prop(\"multiple\"))this.current(function(n){var r=[];t=[t],t.push.apply(t,n);for(var s=0;s<t.length;s++){var o=t[s].id;-1===i.inArray(o,r)&&r.push(o)}e.$element.val(r),e.$element.trigger(\"change\")});else{var n=t.id;this.$element.val(n),this.$element.trigger(\"change\")}},n.prototype.unselect=function(t){var e=this;if(this.$element.prop(\"multiple\")){if(t.selected=!1,i(t.element).is(\"option\"))return t.element.selected=!1,void this.$element.trigger(\"change\");this.current(function(n){for(var r=[],s=0;s<n.length;s++){var o=n[s].id;o!==t.id&&-1===i.inArray(o,r)&&r.push(o)}e.$element.val(r),e.$element.trigger(\"change\")})}},n.prototype.bind=function(t,e){var i=this;this.container=t,t.on(\"select\",function(t){i.select(t.data)}),t.on(\"unselect\",function(t){i.unselect(t.data)})},n.prototype.destroy=function(){this.$element.find(\"*\").each(function(){i.removeData(this,\"data\")})},n.prototype.query=function(t,e){var n=[],r=this;this.$element.children().each(function(){var e=i(this);if(e.is(\"option\")||e.is(\"optgroup\")){var s=r.item(e),o=r.matches(t,s);null!==o&&n.push(o)}}),e({results:n})},n.prototype.addOptions=function(t){e.appendMany(this.$element,t)},n.prototype.option=function(t){var e;t.children?(e=document.createElement(\"optgroup\"),e.label=t.text):(e=document.createElement(\"option\"),void 0!==e.textContent?e.textContent=t.text:e.innerText=t.text),t.id&&(e.value=t.id),t.disabled&&(e.disabled=!0),t.selected&&(e.selected=!0),t.title&&(e.title=t.title);var n=i(e),r=this._normalizeItem(t);return r.element=e,i.data(e,\"data\",r),n},n.prototype.item=function(t){var e={};if(null!=(e=i.data(t[0],\"data\")))return e;if(t.is(\"option\"))e={id:t.val(),text:t.text(),disabled:t.prop(\"disabled\"),selected:t.prop(\"selected\"),title:t.prop(\"title\")};else if(t.is(\"optgroup\")){e={text:t.prop(\"label\"),children:[],title:t.prop(\"title\")};for(var n=t.children(\"option\"),r=[],s=0;s<n.length;s++){var o=i(n[s]),a=this.item(o);r.push(a)}e.children=r}return e=this._normalizeItem(e),e.element=t[0],i.data(t[0],\"data\",e),e},n.prototype._normalizeItem=function(t){i.isPlainObject(t)||(t={id:t,text:t}),t=i.extend({},{text:\"\"},t);var e={selected:!1,disabled:!1};return null!=t.id&&(t.id=t.id.toString()),null!=t.text&&(t.text=t.text.toString()),null==t._resultId&&t.id&&null!=this.container&&(t._resultId=this.generateResultId(this.container,t)),i.extend({},e,t)},n.prototype.matches=function(t,e){return this.options.get(\"matcher\")(t,e)},n}),e.define(\"select2/data/array\",[\"./select\",\"../utils\",\"jquery\"],function(t,e,i){function n(t,e){var i=e.get(\"data\")||[];n.__super__.constructor.call(this,t,e),this.addOptions(this.convertToOptions(i))}return e.Extend(n,t),n.prototype.select=function(t){var e=this.$element.find(\"option\").filter(function(e,i){return i.value==t.id.toString()});0===e.length&&(e=this.option(t),this.addOptions(e)),n.__super__.select.call(this,t)},n.prototype.convertToOptions=function(t){for(var n=this,r=this.$element.find(\"option\"),s=r.map(function(){return n.item(i(this)).id}).get(),o=[],a=0;a<t.length;a++){var l=this._normalizeItem(t[a]);if(i.inArray(l.id,s)>=0){var u=r.filter(function(t){return function(){return i(this).val()==t.id}}(l)),c=this.item(u),h=i.extend(!0,{},l,c),d=this.option(h);u.replaceWith(d)}else{var p=this.option(l);if(l.children){var f=this.convertToOptions(l.children);e.appendMany(p,f)}o.push(p)}}return o},n}),e.define(\"select2/data/ajax\",[\"./array\",\"../utils\",\"jquery\"],function(t,e,i){function n(t,e){this.ajaxOptions=this._applyDefaults(e.get(\"ajax\")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,t,e)}return e.Extend(n,t),n.prototype._applyDefaults=function(t){var e={data:function(t){return i.extend({},t,{q:t.term})},transport:function(t,e,n){var r=i.ajax(t);return r.then(e),r.fail(n),r}};return i.extend({},e,t,!0)},n.prototype.processResults=function(t){return t},n.prototype.query=function(t,e){function n(){var n=s.transport(s,function(n){var s=r.processResults(n,t);r.options.get(\"debug\")&&window.console&&console.error&&(!s||!s.results||i.isArray(s.results)),e(s)},function(){n.status&&\"0\"===n.status||r.trigger(\"results:message\",{message:\"errorLoading\"})});r._request=n}var r=this;null!=this._request&&(i.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var s=i.extend({type:\"GET\"},this.ajaxOptions);\"function\"==typeof s.url&&(s.url=s.url.call(this.$element,t)),\"function\"==typeof s.data&&(s.data=s.data.call(this.$element,t)),this.ajaxOptions.delay&&null!=t.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(n,this.ajaxOptions.delay)):n()},n}),e.define(\"select2/data/tags\",[\"jquery\"],function(t){function e(e,i,n){var r=n.get(\"tags\"),s=n.get(\"createTag\");void 0!==s&&(this.createTag=s);var o=n.get(\"insertTag\");if(void 0!==o&&(this.insertTag=o),e.call(this,i,n),t.isArray(r))for(var a=0;a<r.length;a++){var l=r[a],u=this._normalizeItem(l),c=this.option(u);this.$element.append(c)}}return e.prototype.query=function(t,e,i){function n(t,s){for(var o=t.results,a=0;a<o.length;a++){var l=o[a],u=null!=l.children&&!n({results:l.children},!0);if(l.text===e.term||u)return!s&&(t.data=o,void i(t))}if(s)return!0;var c=r.createTag(e);if(null!=c){var h=r.option(c);h.attr(\"data-select2-tag\",!0),r.addOptions([h]),r.insertTag(o,c)}t.results=o,i(t)}var r=this;if(this._removeOldTags(),null==e.term||null!=e.page)return void t.call(this,e,i);t.call(this,e,n)},e.prototype.createTag=function(e,i){var n=t.trim(i.term);return\"\"===n?null:{id:n,text:n}},e.prototype.insertTag=function(t,e,i){e.unshift(i)},e.prototype._removeOldTags=function(e){this._lastTag;this.$element.find(\"option[data-select2-tag]\").each(function(){this.selected||t(this).remove()})},e}),e.define(\"select2/data/tokenizer\",[\"jquery\"],function(t){function e(t,e,i){var n=i.get(\"tokenizer\");void 0!==n&&(this.tokenizer=n),t.call(this,e,i)}return e.prototype.bind=function(t,e,i){t.call(this,e,i),this.$search=e.dropdown.$search||e.selection.$search||i.find(\".select2-search__field\")},e.prototype.query=function(e,i,n){function r(e){var i=o._normalizeItem(e);if(!o.$element.find(\"option\").filter(function(){return t(this).val()===i.id}).length){var n=o.option(i);n.attr(\"data-select2-tag\",!0),o._removeOldTags(),o.addOptions([n])}s(i)}function s(t){o.trigger(\"select\",{data:t})}var o=this;i.term=i.term||\"\";var a=this.tokenizer(i,this.options,r);a.term!==i.term&&(this.$search.length&&(this.$search.val(a.term),this.$search.focus()),i.term=a.term),e.call(this,i,n)},e.prototype.tokenizer=function(e,i,n,r){for(var s=n.get(\"tokenSeparators\")||[],o=i.term,a=0,l=this.createTag||function(t){return{id:t.term,text:t.term}};a<o.length;){var u=o[a];if(-1!==t.inArray(u,s)){var c=o.substr(0,a),h=t.extend({},i,{term:c}),d=l(h);null!=d?(r(d),o=o.substr(a+1)||\"\",a=0):a++}else a++}return{term:o}},e}),e.define(\"select2/data/minimumInputLength\",[],function(){function t(t,e,i){this.minimumInputLength=i.get(\"minimumInputLength\"),t.call(this,e,i)}return t.prototype.query=function(t,e,i){if(e.term=e.term||\"\",e.term.length<this.minimumInputLength)return void this.trigger(\"results:message\",{message:\"inputTooShort\",args:{minimum:this.minimumInputLength,input:e.term,params:e}});t.call(this,e,i)},t}),e.define(\"select2/data/maximumInputLength\",[],function(){function t(t,e,i){this.maximumInputLength=i.get(\"maximumInputLength\"),t.call(this,e,i)}return t.prototype.query=function(t,e,i){if(e.term=e.term||\"\",this.maximumInputLength>0&&e.term.length>this.maximumInputLength)return void this.trigger(\"results:message\",{message:\"inputTooLong\",args:{maximum:this.maximumInputLength,input:e.term,params:e}});t.call(this,e,i)},t}),e.define(\"select2/data/maximumSelectionLength\",[],function(){function t(t,e,i){this.maximumSelectionLength=i.get(\"maximumSelectionLength\"),t.call(this,e,i)}return t.prototype.query=function(t,e,i){var n=this;this.current(function(r){var s=null!=r?r.length:0;if(n.maximumSelectionLength>0&&s>=n.maximumSelectionLength)return void n.trigger(\"results:message\",{message:\"maximumSelected\",args:{maximum:n.maximumSelectionLength}});t.call(n,e,i)})},t}),e.define(\"select2/dropdown\",[\"jquery\",\"./utils\"],function(t,e){function i(t,e){this.$element=t,this.options=e,i.__super__.constructor.call(this)}return e.Extend(i,e.Observable),i.prototype.render=function(){var e=t('<span class=\"select2-dropdown\"><span class=\"select2-results\"></span></span>');return e.attr(\"dir\",this.options.get(\"dir\")),this.$dropdown=e,e},i.prototype.bind=function(){},i.prototype.position=function(t,e){},i.prototype.destroy=function(){this.$dropdown.remove()},i}),e.define(\"select2/dropdown/search\",[\"jquery\",\"../utils\"],function(t,e){function i(){}return i.prototype.render=function(e){var i=e.call(this),n=t('<span class=\"select2-search select2-search--dropdown\"><input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"textbox\" /></span>');return this.$searchContainer=n,this.$search=n.find(\"input\"),i.prepend(n),i},i.prototype.bind=function(e,i,n){var r=this;e.call(this,i,n),this.$search.on(\"keydown\",function(t){r.trigger(\"keypress\",t),r._keyUpPrevented=t.isDefaultPrevented()}),this.$search.on(\"input\",function(e){t(this).off(\"keyup\")}),this.$search.on(\"keyup input\",function(t){r.handleSearch(t)}),i.on(\"open\",function(){r.$search.attr(\"tabindex\",0),r.$search.focus(),window.setTimeout(function(){r.$search.focus()},0)}),i.on(\"close\",function(){r.$search.attr(\"tabindex\",-1),r.$search.val(\"\")}),i.on(\"focus\",function(){i.isOpen()&&r.$search.focus()}),i.on(\"results:all\",function(t){if(null==t.query.term||\"\"===t.query.term){r.showSearch(t)?r.$searchContainer.removeClass(\"select2-search--hide\"):r.$searchContainer.addClass(\"select2-search--hide\")}})},i.prototype.handleSearch=function(t){if(!this._keyUpPrevented){var e=this.$search.val();this.trigger(\"query\",{term:e})}this._keyUpPrevented=!1},i.prototype.showSearch=function(t,e){return!0},i}),e.define(\"select2/dropdown/hidePlaceholder\",[],function(){function t(t,e,i,n){this.placeholder=this.normalizePlaceholder(i.get(\"placeholder\")),t.call(this,e,i,n)}return t.prototype.append=function(t,e){e.results=this.removePlaceholder(e.results),t.call(this,e)},t.prototype.normalizePlaceholder=function(t,e){return\"string\"==typeof e&&(e={id:\"\",text:e}),e},t.prototype.removePlaceholder=function(t,e){for(var i=e.slice(0),n=e.length-1;n>=0;n--){var r=e[n];this.placeholder.id===r.id&&i.splice(n,1)}return i},t}),e.define(\"select2/dropdown/infiniteScroll\",[\"jquery\"],function(t){function e(t,e,i,n){this.lastParams={},t.call(this,e,i,n),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(t,e){this.$loadingMore.remove(),this.loading=!1,t.call(this,e),this.showLoadingMore(e)&&this.$results.append(this.$loadingMore)},e.prototype.bind=function(e,i,n){var r=this;e.call(this,i,n),i.on(\"query\",function(t){r.lastParams=t,r.loading=!0}),i.on(\"query:append\",function(t){r.lastParams=t,r.loading=!0}),this.$results.on(\"scroll\",function(){var e=t.contains(document.documentElement,r.$loadingMore[0]);if(!r.loading&&e){r.$results.offset().top+r.$results.outerHeight(!1)+50>=r.$loadingMore.offset().top+r.$loadingMore.outerHeight(!1)&&r.loadMore()}})},e.prototype.loadMore=function(){this.loading=!0;var e=t.extend({},{page:1},this.lastParams);e.page++,this.trigger(\"query:append\",e)},e.prototype.showLoadingMore=function(t,e){return e.pagination&&e.pagination.more},e.prototype.createLoadingMore=function(){var e=t('<li class=\"select2-results__option select2-results__option--load-more\"role=\"treeitem\" aria-disabled=\"true\"></li>'),i=this.options.get(\"translations\").get(\"loadingMore\");return e.html(i(this.lastParams)),e},e}),e.define(\"select2/dropdown/attachBody\",[\"jquery\",\"../utils\"],function(t,e){function i(e,i,n){this.$dropdownParent=n.get(\"dropdownParent\")||t(document.body),e.call(this,i,n)}return i.prototype.bind=function(t,e,i){var n=this,r=!1;t.call(this,e,i),e.on(\"open\",function(){n._showDropdown(),n._attachPositioningHandler(e),r||(r=!0,e.on(\"results:all\",function(){n._positionDropdown(),n._resizeDropdown()}),e.on(\"results:append\",function(){n._positionDropdown(),n._resizeDropdown()}))}),e.on(\"close\",function(){n._hideDropdown(),n._detachPositioningHandler(e)}),this.$dropdownContainer.on(\"mousedown\",function(t){t.stopPropagation()})},i.prototype.destroy=function(t){t.call(this),this.$dropdownContainer.remove()},i.prototype.position=function(t,e,i){e.attr(\"class\",i.attr(\"class\")),e.removeClass(\"select2\"),e.addClass(\"select2-container--open\"),e.css({position:\"absolute\",top:-999999}),this.$container=i},i.prototype.render=function(e){var i=t(\"<span></span>\"),n=e.call(this);return i.append(n),this.$dropdownContainer=i,i},i.prototype._hideDropdown=function(t){this.$dropdownContainer.detach()},i.prototype._attachPositioningHandler=function(i,n){var r=this,s=\"scroll.select2.\"+n.id,o=\"resize.select2.\"+n.id,a=\"orientationchange.select2.\"+n.id,l=this.$container.parents().filter(e.hasScroll);l.each(function(){t(this).data(\"select2-scroll-position\",{x:t(this).scrollLeft(),y:t(this).scrollTop()})}),l.on(s,function(e){var i=t(this).data(\"select2-scroll-position\");t(this).scrollTop(i.y)}),t(window).on(s+\" \"+o+\" \"+a,function(t){r._positionDropdown(),r._resizeDropdown()})},i.prototype._detachPositioningHandler=function(i,n){var r=\"scroll.select2.\"+n.id,s=\"resize.select2.\"+n.id,o=\"orientationchange.select2.\"+n.id;this.$container.parents().filter(e.hasScroll).off(r),t(window).off(r+\" \"+s+\" \"+o)},i.prototype._positionDropdown=function(){var e=t(window),i=this.$dropdown.hasClass(\"select2-dropdown--above\"),n=this.$dropdown.hasClass(\"select2-dropdown--below\"),r=null,s=this.$container.offset();s.bottom=s.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=s.top,o.bottom=s.top+o.height;var a={height:this.$dropdown.outerHeight(!1)},l={top:e.scrollTop(),bottom:e.scrollTop()+e.height()},u=l.top<s.top-a.height,c=l.bottom>s.bottom+a.height,h={left:s.left,top:o.bottom},d=this.$dropdownParent;\"static\"===d.css(\"position\")&&(d=d.offsetParent());var p=d.offset();h.top-=p.top,h.left-=p.left,i||n||(r=\"below\"),c||!u||i?!u&&c&&i&&(r=\"below\"):r=\"above\",(\"above\"==r||i&&\"below\"!==r)&&(h.top=o.top-p.top-a.height),null!=r&&(this.$dropdown.removeClass(\"select2-dropdown--below select2-dropdown--above\").addClass(\"select2-dropdown--\"+r),this.$container.removeClass(\"select2-container--below select2-container--above\").addClass(\"select2-container--\"+r)),this.$dropdownContainer.css(h)},i.prototype._resizeDropdown=function(){var t={width:this.$container.outerWidth(!1)+\"px\"};this.options.get(\"dropdownAutoWidth\")&&(t.minWidth=t.width,t.position=\"relative\",t.width=\"auto\"),this.$dropdown.css(t)},i.prototype._showDropdown=function(t){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},i}),e.define(\"select2/dropdown/minimumResultsForSearch\",[],function(){function t(e){for(var i=0,n=0;n<e.length;n++){var r=e[n];r.children?i+=t(r.children):i++}return i}function e(t,e,i,n){this.minimumResultsForSearch=i.get(\"minimumResultsForSearch\"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),t.call(this,e,i,n)}return e.prototype.showSearch=function(e,i){return!(t(i.data.results)<this.minimumResultsForSearch)&&e.call(this,i)},e}),e.define(\"select2/dropdown/selectOnClose\",[],function(){function t(){}return t.prototype.bind=function(t,e,i){var n=this;t.call(this,e,i),e.on(\"close\",function(t){n._handleSelectOnClose(t)})},t.prototype._handleSelectOnClose=function(t,e){if(e&&null!=e.originalSelect2Event){var i=e.originalSelect2Event;if(\"select\"===i._type||\"unselect\"===i._type)return}var n=this.getHighlightedResults();if(!(n.length<1)){var r=n.data(\"data\");null!=r.element&&r.element.selected||null==r.element&&r.selected||this.trigger(\"select\",{data:r})}},t}),e.define(\"select2/dropdown/closeOnSelect\",[],function(){function t(){}return t.prototype.bind=function(t,e,i){var n=this;t.call(this,e,i),e.on(\"select\",function(t){n._selectTriggered(t)}),e.on(\"unselect\",function(t){n._selectTriggered(t)})},t.prototype._selectTriggered=function(t,e){var i=e.originalEvent;i&&i.ctrlKey||this.trigger(\"close\",{originalEvent:i,originalSelect2Event:e})},t}),e.define(\"select2/i18n/en\",[],function(){return{errorLoading:function(){return\"The results could not be loaded.\"},inputTooLong:function(t){var e=t.input.length-t.maximum,i=\"Please delete \"+e+\" character\";return 1!=e&&(i+=\"s\"),i},inputTooShort:function(t){return\"Please enter \"+(t.minimum-t.input.length)+\" or more characters\"},loadingMore:function(){return\"Loading more results…\"},maximumSelected:function(t){var e=\"You can only select \"+t.maximum+\" item\";return 1!=t.maximum&&(e+=\"s\"),e},noResults:function(){return\"No results found\"},searching:function(){return\"Searching…\"}}}),e.define(\"select2/defaults\",[\"jquery\",\"require\",\"./results\",\"./selection/single\",\"./selection/multiple\",\"./selection/placeholder\",\"./selection/allowClear\",\"./selection/search\",\"./selection/eventRelay\",\"./utils\",\"./translation\",\"./diacritics\",\"./data/select\",\"./data/array\",\"./data/ajax\",\"./data/tags\",\"./data/tokenizer\",\"./data/minimumInputLength\",\"./data/maximumInputLength\",\"./data/maximumSelectionLength\",\"./dropdown\",\"./dropdown/search\",\"./dropdown/hidePlaceholder\",\"./dropdown/infiniteScroll\",\"./dropdown/attachBody\",\"./dropdown/minimumResultsForSearch\",\"./dropdown/selectOnClose\",\"./dropdown/closeOnSelect\",\"./i18n/en\"],function(t,e,i,n,r,s,o,a,l,u,c,h,d,p,f,g,m,v,_,y,b,w,x,C,k,T,D,S,A){function E(){this.reset()}return E.prototype.apply=function(h){if(h=t.extend(!0,{},this.defaults,h),null==h.dataAdapter){if(null!=h.ajax?h.dataAdapter=f:null!=h.data?h.dataAdapter=p:h.dataAdapter=d,h.minimumInputLength>0&&(h.dataAdapter=u.Decorate(h.dataAdapter,v)),h.maximumInputLength>0&&(h.dataAdapter=u.Decorate(h.dataAdapter,_)),h.maximumSelectionLength>0&&(h.dataAdapter=u.Decorate(h.dataAdapter,y)),h.tags&&(h.dataAdapter=u.Decorate(h.dataAdapter,g)),null==h.tokenSeparators&&null==h.tokenizer||(h.dataAdapter=u.Decorate(h.dataAdapter,m)),null!=h.query){var A=e(h.amdBase+\"compat/query\");h.dataAdapter=u.Decorate(h.dataAdapter,A)}if(null!=h.initSelection){var E=e(h.amdBase+\"compat/initSelection\");h.dataAdapter=u.Decorate(h.dataAdapter,E)}}if(null==h.resultsAdapter&&(h.resultsAdapter=i,null!=h.ajax&&(h.resultsAdapter=u.Decorate(h.resultsAdapter,C)),null!=h.placeholder&&(h.resultsAdapter=u.Decorate(h.resultsAdapter,x)),h.selectOnClose&&(h.resultsAdapter=u.Decorate(h.resultsAdapter,D))),null==h.dropdownAdapter){if(h.multiple)h.dropdownAdapter=b;else{var I=u.Decorate(b,w);h.dropdownAdapter=I}if(0!==h.minimumResultsForSearch&&(h.dropdownAdapter=u.Decorate(h.dropdownAdapter,T)),h.closeOnSelect&&(h.dropdownAdapter=u.Decorate(h.dropdownAdapter,S)),null!=h.dropdownCssClass||null!=h.dropdownCss||null!=h.adaptDropdownCssClass){var $=e(h.amdBase+\"compat/dropdownCss\");h.dropdownAdapter=u.Decorate(h.dropdownAdapter,$)}h.dropdownAdapter=u.Decorate(h.dropdownAdapter,k)}if(null==h.selectionAdapter){if(h.multiple?h.selectionAdapter=r:h.selectionAdapter=n,null!=h.placeholder&&(h.selectionAdapter=u.Decorate(h.selectionAdapter,s)),h.allowClear&&(h.selectionAdapter=u.Decorate(h.selectionAdapter,o)),h.multiple&&(h.selectionAdapter=u.Decorate(h.selectionAdapter,a)),null!=h.containerCssClass||null!=h.containerCss||null!=h.adaptContainerCssClass){var O=e(h.amdBase+\"compat/containerCss\");h.selectionAdapter=u.Decorate(h.selectionAdapter,O)}h.selectionAdapter=u.Decorate(h.selectionAdapter,l)}if(\"string\"==typeof h.language)if(h.language.indexOf(\"-\")>0){var P=h.language.split(\"-\"),N=P[0];h.language=[h.language,N]}else h.language=[h.language];if(t.isArray(h.language)){var M=new c;h.language.push(\"en\");for(var j=h.language,H=0;H<j.length;H++){var R=j[H],L={};try{L=c.loadPath(R)}catch(t){try{R=this.defaults.amdLanguageBase+R,L=c.loadPath(R)}catch(t){h.debug&&window.console&&console.warn;continue}}M.extend(L)}h.translations=M}else{var F=c.loadPath(this.defaults.amdLanguageBase+\"en\"),z=new c(h.language);z.extend(F),h.translations=z}return h},E.prototype.reset=function(){function e(t){function e(t){return h[t]||t}return t.replace(/[^\\u0000-\\u007E]/g,e)}function i(n,r){if(\"\"===t.trim(n.term))return r;if(r.children&&r.children.length>0){for(var s=t.extend(!0,{},r),o=r.children.length-1;o>=0;o--){null==i(n,r.children[o])&&s.children.splice(o,1)}return s.children.length>0?s:i(n,s)}var a=e(r.text).toUpperCase(),l=e(n.term).toUpperCase();return a.indexOf(l)>-1?r:null}this.defaults={amdBase:\"./\",amdLanguageBase:\"./i18n/\",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:u.escapeMarkup,language:A,matcher:i,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(t){return t},templateResult:function(t){return t.text},templateSelection:function(t){return t.text},theme:\"default\",width:\"resolve\"}},E.prototype.set=function(e,i){var n=t.camelCase(e),r={};r[n]=i;var s=u._convertData(r);t.extend(this.defaults,s)},new E}),e.define(\"select2/options\",[\"require\",\"jquery\",\"./defaults\",\"./utils\"],function(t,e,i,n){function r(e,r){if(this.options=e,null!=r&&this.fromElement(r),this.options=i.apply(this.options),r&&r.is(\"input\")){var s=t(this.get(\"amdBase\")+\"compat/inputData\");this.options.dataAdapter=n.Decorate(this.options.dataAdapter,s)}}return r.prototype.fromElement=function(t){var i=[\"select2\"];null==this.options.multiple&&(this.options.multiple=t.prop(\"multiple\")),null==this.options.disabled&&(this.options.disabled=t.prop(\"disabled\")),null==this.options.language&&(t.prop(\"lang\")?this.options.language=t.prop(\"lang\").toLowerCase():t.closest(\"[lang]\").prop(\"lang\")&&(this.options.language=t.closest(\"[lang]\").prop(\"lang\"))),null==this.options.dir&&(t.prop(\"dir\")?this.options.dir=t.prop(\"dir\"):t.closest(\"[dir]\").prop(\"dir\")?this.options.dir=t.closest(\"[dir]\").prop(\"dir\"):this.options.dir=\"ltr\"),t.prop(\"disabled\",this.options.disabled),t.prop(\"multiple\",this.options.multiple),t.data(\"select2Tags\")&&(this.options.debug&&window.console&&console.warn,t.data(\"data\",t.data(\"select2Tags\")),t.data(\"tags\",!0)),t.data(\"ajaxUrl\")&&(this.options.debug&&window.console&&console.warn,t.attr(\"ajax--url\",t.data(\"ajaxUrl\")),t.data(\"ajax--url\",t.data(\"ajaxUrl\")));var r={};r=e.fn.jquery&&\"1.\"==e.fn.jquery.substr(0,2)&&t[0].dataset?e.extend(!0,{},t[0].dataset,t.data()):t.data();var s=e.extend(!0,{},r);s=n._convertData(s);for(var o in s)e.inArray(o,i)>-1||(e.isPlainObject(this.options[o])?e.extend(this.options[o],s[o]):this.options[o]=s[o]);return this},r.prototype.get=function(t){return this.options[t]},r.prototype.set=function(t,e){this.options[t]=e},r}),e.define(\"select2/core\",[\"jquery\",\"./options\",\"./utils\",\"./keys\"],function(t,e,i,n){var r=function(t,i){null!=t.data(\"select2\")&&t.data(\"select2\").destroy(),this.$element=t,this.id=this._generateId(t),i=i||{},this.options=new e(i,t),r.__super__.constructor.call(this);var n=t.attr(\"tabindex\")||0;t.data(\"old-tabindex\",n),t.attr(\"tabindex\",\"-1\");var s=this.options.get(\"dataAdapter\");this.dataAdapter=new s(t,this.options);var o=this.render();this._placeContainer(o);var a=this.options.get(\"selectionAdapter\");this.selection=new a(t,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,o);var l=this.options.get(\"dropdownAdapter\");this.dropdown=new l(t,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,o);var u=this.options.get(\"resultsAdapter\");this.results=new u(t,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var c=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(t){c.trigger(\"selection:update\",{data:t})}),t.addClass(\"select2-hidden-accessible\"),t.attr(\"aria-hidden\",\"true\"),this._syncAttributes(),t.data(\"select2\",this)};return i.Extend(r,i.Observable),r.prototype._generateId=function(t){var e=\"\";return e=null!=t.attr(\"id\")?t.attr(\"id\"):null!=t.attr(\"name\")?t.attr(\"name\")+\"-\"+i.generateChars(2):i.generateChars(4),e=e.replace(/(:|\\.|\\[|\\]|,)/g,\"\"),e=\"select2-\"+e},r.prototype._placeContainer=function(t){t.insertAfter(this.$element);var e=this._resolveWidth(this.$element,this.options.get(\"width\"));null!=e&&t.css(\"width\",e)},r.prototype._resolveWidth=function(t,e){var i=/^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if(\"resolve\"==e){var n=this._resolveWidth(t,\"style\");return null!=n?n:this._resolveWidth(t,\"element\")}if(\"element\"==e){var r=t.outerWidth(!1);return r<=0?\"auto\":r+\"px\"}if(\"style\"==e){var s=t.attr(\"style\");if(\"string\"!=typeof s)return null;for(var o=s.split(\";\"),a=0,l=o.length;a<l;a+=1){var u=o[a].replace(/\\s/g,\"\"),c=u.match(i);if(null!==c&&c.length>=1)return c[1]}return null}return e},r.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},r.prototype._registerDomEvents=function(){var e=this;this.$element.on(\"change.select2\",function(){e.dataAdapter.current(function(t){e.trigger(\"selection:update\",{data:t})})}),this.$element.on(\"focus.select2\",function(t){e.trigger(\"focus\",t)}),this._syncA=i.bind(this._syncAttributes,this),this._syncS=i.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent(\"onpropertychange\",this._syncA);var n=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=n?(this._observer=new n(function(i){t.each(i,e._syncA),t.each(i,e._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener(\"DOMAttrModified\",e._syncA,!1),this.$element[0].addEventListener(\"DOMNodeInserted\",e._syncS,!1),this.$element[0].addEventListener(\"DOMNodeRemoved\",e._syncS,!1))},r.prototype._registerDataEvents=function(){var t=this;this.dataAdapter.on(\"*\",function(e,i){t.trigger(e,i)})},r.prototype._registerSelectionEvents=function(){var e=this,i=[\"toggle\",\"focus\"];this.selection.on(\"toggle\",function(){e.toggleDropdown()}),this.selection.on(\"focus\",function(t){e.focus(t)}),this.selection.on(\"*\",function(n,r){-1===t.inArray(n,i)&&e.trigger(n,r)})},r.prototype._registerDropdownEvents=function(){var t=this;this.dropdown.on(\"*\",function(e,i){t.trigger(e,i)})},r.prototype._registerResultsEvents=function(){var t=this;this.results.on(\"*\",function(e,i){t.trigger(e,i)})},r.prototype._registerEvents=function(){var t=this;this.on(\"open\",function(){t.$container.addClass(\"select2-container--open\")}),this.on(\"close\",function(){t.$container.removeClass(\"select2-container--open\")}),this.on(\"enable\",function(){t.$container.removeClass(\"select2-container--disabled\")}),this.on(\"disable\",function(){t.$container.addClass(\"select2-container--disabled\")}),this.on(\"blur\",function(){t.$container.removeClass(\"select2-container--focus\")}),this.on(\"query\",function(e){t.isOpen()||t.trigger(\"open\",{}),this.dataAdapter.query(e,function(i){t.trigger(\"results:all\",{data:i,query:e})})}),this.on(\"query:append\",function(e){this.dataAdapter.query(e,function(i){t.trigger(\"results:append\",{data:i,query:e})})}),this.on(\"keypress\",function(e){var i=e.which;t.isOpen()?i===n.ESC||i===n.TAB||i===n.UP&&e.altKey?(t.close(),e.preventDefault()):i===n.ENTER?(t.trigger(\"results:select\",{}),e.preventDefault()):i===n.SPACE&&e.ctrlKey?(t.trigger(\"results:toggle\",{}),e.preventDefault()):i===n.UP?(t.trigger(\"results:previous\",{}),e.preventDefault()):i===n.DOWN&&(t.trigger(\"results:next\",{}),e.preventDefault()):(i===n.ENTER||i===n.SPACE||i===n.DOWN&&e.altKey)&&(t.open(),e.preventDefault())})},r.prototype._syncAttributes=function(){this.options.set(\"disabled\",this.$element.prop(\"disabled\")),this.options.get(\"disabled\")?(this.isOpen()&&this.close(),this.trigger(\"disable\",{})):this.trigger(\"enable\",{})},r.prototype._syncSubtree=function(t,e){var i=!1,n=this;if(!t||!t.target||\"OPTION\"===t.target.nodeName||\"OPTGROUP\"===t.target.nodeName){if(e)if(e.addedNodes&&e.addedNodes.length>0)for(var r=0;r<e.addedNodes.length;r++){var s=e.addedNodes[r];s.selected&&(i=!0)}else e.removedNodes&&e.removedNodes.length>0&&(i=!0);else i=!0;i&&this.dataAdapter.current(function(t){n.trigger(\"selection:update\",{data:t})})}},r.prototype.trigger=function(t,e){var i=r.__super__.trigger,n={open:\"opening\",close:\"closing\",select:\"selecting\",unselect:\"unselecting\"};if(void 0===e&&(e={}),t in n){var s=n[t],o={prevented:!1,name:t,args:e};if(i.call(this,s,o),o.prevented)return void(e.prevented=!0)}i.call(this,t,e)},r.prototype.toggleDropdown=function(){this.options.get(\"disabled\")||(this.isOpen()?this.close():this.open())},r.prototype.open=function(){this.isOpen()||this.trigger(\"query\",{})},r.prototype.close=function(){this.isOpen()&&this.trigger(\"close\",{})},r.prototype.isOpen=function(){return this.$container.hasClass(\"select2-container--open\")},r.prototype.hasFocus=function(){return this.$container.hasClass(\"select2-container--focus\")},r.prototype.focus=function(t){this.hasFocus()||(this.$container.addClass(\"select2-container--focus\"),this.trigger(\"focus\",{}))},r.prototype.enable=function(t){this.options.get(\"debug\")&&window.console&&console.warn,null!=t&&0!==t.length||(t=[!0]);var e=!t[0];this.$element.prop(\"disabled\",e)},r.prototype.data=function(){this.options.get(\"debug\")&&arguments.length>0&&window.console&&console.warn;var t=[];return this.dataAdapter.current(function(e){t=e}),t},r.prototype.val=function(e){if(this.options.get(\"debug\")&&window.console&&console.warn,null==e||0===e.length)return this.$element.val();var i=e[0];t.isArray(i)&&(i=t.map(i,function(t){return t.toString()})),this.$element.val(i).trigger(\"change\")},r.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent(\"onpropertychange\",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener(\"DOMAttrModified\",this._syncA,!1),this.$element[0].removeEventListener(\"DOMNodeInserted\",this._syncS,!1),this.$element[0].removeEventListener(\"DOMNodeRemoved\",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(\".select2\"),this.$element.attr(\"tabindex\",this.$element.data(\"old-tabindex\")),this.$element.removeClass(\"select2-hidden-accessible\"),this.$element.attr(\"aria-hidden\",\"false\"),this.$element.removeData(\"select2\"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},r.prototype.render=function(){var e=t('<span class=\"select2 select2-container\"><span class=\"selection\"></span><span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span></span>');return e.attr(\"dir\",this.options.get(\"dir\")),this.$container=e,this.$container.addClass(\"select2-container--\"+this.options.get(\"theme\")),e.data(\"element\",this.$element),e},r}),e.define(\"jquery-mousewheel\",[\"jquery\"],function(t){return t}),e.define(\"jquery.select2\",[\"jquery\",\"jquery-mousewheel\",\"./select2/core\",\"./select2/defaults\"],function(t,e,i,n){if(null==t.fn.select2){var r=[\"open\",\"close\",\"destroy\"];t.fn.select2=function(e){if(\"object\"==typeof(e=e||{}))return this.each(function(){var n=t.extend(!0,{},e);new i(t(this),n)}),this;if(\"string\"==typeof e){var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var i=t(this).data(\"select2\");null==i&&window.console&&console.error,n=i[e].apply(i,s)}),t.inArray(e,r)>-1?this:n}throw new Error(\"Invalid arguments for Select2: \"+e)}}return null==t.fn.select2.defaults&&(t.fn.select2.defaults=n),i}),{define:e.define,require:e.require}}(),i=e.require(\"jquery.select2\");return t.fn.select2.amd=e,i})},function(t,e,i){i(51);var n=i(1)(i(10),i(43),\"data-v-3edef3ba\",null);t.exports=n.exports},function(t,e,i){i(53);var n=i(1)(i(11),i(44),\"data-v-5667c312\",null);t.exports=n.exports},function(t,e,i){i(54);var n=i(1)(i(12),i(45),null,null);t.exports=n.exports},function(t,e,i){i(52);var n=i(1)(i(13),null,\"data-v-5301a236\",null);t.exports=n.exports},function(t,e,i){i(55);var n=i(1)(i(14),i(46),\"data-v-de0d0e4e\",null);t.exports=n.exports},function(t,e,i){i(56);var n=i(1)(i(15),i(47),\"data-v-e9c80318\",null);t.exports=n.exports},function(t,e,i){i(50);var n=i(1)(i(16),i(42),\"data-v-225778c2\",null);t.exports=n.exports},function(t,e,i){i(57);var n=i(1)(i(17),i(48),\"data-v-ff564a86\",null);t.exports=n.exports},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",[i(\"div\",[i(\"div\",{staticClass:\"panel panel-default\"},[i(\"div\",{staticClass:\"panel-heading\"},[i(\"div\",{staticStyle:{display:\"flex\",\"justify-content\":\"space-between\",\"align-items\":\"center\"}},[i(\"span\",[t._v(\"\\n                        Personal Access Tokens\\n                    \")]),t._v(\" \"),i(\"a\",{staticClass:\"action-link\",on:{click:t.showCreateTokenForm}},[t._v(\"\\n                        Create New Token\\n                    \")])])]),t._v(\" \"),i(\"div\",{staticClass:\"panel-body\"},[0===t.tokens.length?i(\"p\",{staticClass:\"m-b-none\"},[t._v(\"\\n                    You have not created any personal access tokens.\\n                \")]):t._e(),t._v(\" \"),t.tokens.length>0?i(\"table\",{staticClass:\"table table-borderless m-b-none\"},[t._m(0),t._v(\" \"),i(\"tbody\",t._l(t.tokens,function(e){return i(\"tr\",[i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[t._v(\"\\n                                \"+t._s(e.name)+\"\\n                            \")]),t._v(\" \"),i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[i(\"a\",{staticClass:\"action-link text-danger\",on:{click:function(i){t.revoke(e)}}},[t._v(\"\\n                                    Delete\\n                                \")])])])}))]):t._e()])])]),t._v(\" \"),i(\"div\",{staticClass:\"modal fade\",attrs:{id:\"modal-create-token\",tabindex:\"-1\",role:\"dialog\"}},[i(\"div\",{staticClass:\"modal-dialog\"},[i(\"div\",{staticClass:\"modal-content\"},[t._m(1),t._v(\" \"),i(\"div\",{staticClass:\"modal-body\"},[t.form.errors.length>0?i(\"div\",{staticClass:\"alert alert-danger\"},[t._m(2),t._v(\" \"),i(\"br\"),t._v(\" \"),i(\"ul\",t._l(t.form.errors,function(e){return i(\"li\",[t._v(\"\\n                                \"+t._s(e)+\"\\n                            \")])}))]):t._e(),t._v(\" \"),i(\"form\",{staticClass:\"form-horizontal\",attrs:{role:\"form\"},on:{submit:function(e){e.preventDefault(),t.store(e)}}},[i(\"div\",{staticClass:\"form-group\"},[i(\"label\",{staticClass:\"col-md-4 control-label\"},[t._v(\"Name\")]),t._v(\" \"),i(\"div\",{staticClass:\"col-md-6\"},[i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:t.form.name,expression:\"form.name\"}],staticClass:\"form-control\",attrs:{id:\"create-token-name\",type:\"text\",name:\"name\"},domProps:{value:t.form.name},on:{input:function(e){e.target.composing||(t.form.name=e.target.value)}}})])]),t._v(\" \"),t.scopes.length>0?i(\"div\",{staticClass:\"form-group\"},[i(\"label\",{staticClass:\"col-md-4 control-label\"},[t._v(\"Scopes\")]),t._v(\" \"),i(\"div\",{staticClass:\"col-md-6\"},t._l(t.scopes,function(e){return i(\"div\",[i(\"div\",{staticClass:\"checkbox\"},[i(\"label\",[i(\"input\",{attrs:{type:\"checkbox\"},domProps:{checked:t.scopeIsAssigned(e.id)},on:{click:function(i){t.toggleScope(e.id)}}}),t._v(\"\\n\\n                                                \"+t._s(e.id)+\"\\n                                        \")])])])}))]):t._e()])]),t._v(\" \"),i(\"div\",{staticClass:\"modal-footer\"},[i(\"button\",{staticClass:\"btn btn-default\",attrs:{type:\"button\",\"data-dismiss\":\"modal\"}},[t._v(\"Close\")]),t._v(\" \"),i(\"button\",{staticClass:\"btn btn-primary\",attrs:{type:\"button\"},on:{click:t.store}},[t._v(\"\\n                        Create\\n                    \")])])])])]),t._v(\" \"),i(\"div\",{staticClass:\"modal fade\",attrs:{id:\"modal-access-token\",tabindex:\"-1\",role:\"dialog\"}},[i(\"div\",{staticClass:\"modal-dialog\"},[i(\"div\",{staticClass:\"modal-content\"},[t._m(3),t._v(\" \"),i(\"div\",{staticClass:\"modal-body\"},[i(\"p\",[t._v(\"\\n                        Here is your new personal access token. This is the only time it will be shown so don't lose it!\\n                        You may now use this token to make API requests.\\n                    \")]),t._v(\" \"),i(\"pre\",[i(\"code\",[t._v(t._s(t.accessToken))])])]),t._v(\" \"),t._m(4)])])])])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"thead\",[i(\"tr\",[i(\"th\",[t._v(\"Name\")]),t._v(\" \"),i(\"th\")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"modal-header\"},[i(\"button\",{staticClass:\"close\",attrs:{type:\"button \",\"data-dismiss\":\"modal\",\"aria-hidden\":\"true\"}},[t._v(\"×\")]),t._v(\" \"),i(\"h4\",{staticClass:\"modal-title\"},[t._v(\"\\n                        Create Token\\n                    \")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"p\",[i(\"strong\",[t._v(\"Whoops!\")]),t._v(\" Something went wrong!\")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"modal-header\"},[i(\"button\",{staticClass:\"close\",attrs:{type:\"button \",\"data-dismiss\":\"modal\",\"aria-hidden\":\"true\"}},[t._v(\"×\")]),t._v(\" \"),i(\"h4\",{staticClass:\"modal-title\"},[t._v(\"\\n                        Personal Access Token\\n                    \")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"modal-footer\"},[i(\"button\",{staticClass:\"btn btn-default\",attrs:{type:\"button\",\"data-dismiss\":\"modal\"}},[t._v(\"Close\")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"col-md-12\",class:t.alertType},[i(\"div\",{staticClass:\"alert\",class:t.alertClassName},[i(\"button\",{staticClass:\"close\",attrs:{type:\"button\"},on:{click:t.hideEvent}},[t._v(\"×\")]),t._v(\" \"),i(\"i\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"success\"==t.alertType,expression:\"alertType == 'success'\"}],staticClass:\"fa fa-check faa-pulse animated\"}),t._v(\" \"),i(\"strong\",[t._v(t._s(t.title)+\" \")]),t._v(\" \"),t._t(\"default\")],2)])},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.errors?i(\"div\",{staticClass:\"box\"},[i(\"div\",{staticClass:\"box-body\"},[t._m(0),t._v(\" \"),i(\"div\",{staticClass:\"errors-table\"},[i(\"table\",{staticClass:\"table table-striped table-bordered\",attrs:{id:\"errors-table\"}},[t._m(1),t._v(\" \"),i(\"tbody\",t._l(t.errors,function(e,n){return i(\"tr\",[i(\"td\",[t._v(t._s(n))]),t._v(\" \"),t._l(e,function(e,n){return i(\"td\",[i(\"b\",[t._v(t._s(n)+\":\")]),t._v(\" \"),t._l(e,function(e){return i(\"span\",[t._v(t._s(e[0]))])}),t._v(\" \"),i(\"br\")],2)})],2)}))])])])]):t._e()},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"alert alert-warning\"},[i(\"strong\",[t._v(\"Warning\")]),t._v(\" Some Errors occured while importing\\n    \")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"thead\",[i(\"th\",[t._v(\"Item\")]),t._v(\" \"),i(\"th\",[t._v(\"Errors\")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"tr\",{directives:[{name:\"show\",rawName:\"v-show\",value:t.processDetail,expression:\"processDetail\"}]},[i(\"td\",{attrs:{colspan:\"3\"}},[i(\"h4\",{staticClass:\"modal-title\"},[t._v(\"Import File:\")]),t._v(\" \"),i(\"div\",{staticClass:\"dynamic-form-row\"},[t._m(0),t._v(\" \"),i(\"div\",{staticClass:\"col-md-4 col-xs-12\"},[i(\"select2\",{attrs:{options:t.options.importTypes},model:{value:t.options.importType,callback:function(e){t.options.importType=e},expression:\"options.importType\"}},[i(\"option\",{attrs:{disabled:\"\",value:\"0\"}})])],1)]),t._v(\" \"),i(\"div\",{staticClass:\"dynamic-form-row\"},[t._m(1),t._v(\" \"),i(\"div\",{staticClass:\"col-md-4 col-xs-12\"},[i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:t.options.update,expression:\"options.update\"}],attrs:{type:\"checkbox\",name:\"import-update\"},domProps:{checked:Array.isArray(t.options.update)?t._i(t.options.update,null)>-1:t.options.update},on:{__c:function(e){var i=t.options.update,n=e.target,r=!!n.checked;if(Array.isArray(i)){var s=t._i(i,null);r?s<0&&(t.options.update=i.concat(null)):s>-1&&(t.options.update=i.slice(0,s).concat(i.slice(s+1)))}else t.options.update=r}}})])]),t._v(\" \"),i(\"div\",{staticClass:\"col-md-12\",staticStyle:{\"padding-top\":\"30px\"}},[i(\"table\",{staticClass:\"table\"},[t._m(2),t._v(\" \"),i(\"tbody\",[t._l(t.file.header_row,function(e,n){return[i(\"tr\",[i(\"td\",[i(\"label\",{staticClass:\"controllabel\",attrs:{for:e}},[t._v(t._s(e))])]),t._v(\" \"),i(\"td\",[i(\"div\",{attrs:{required:\"\"}},[i(\"select2\",{attrs:{options:t.columns},model:{value:t.columnMappings[e],callback:function(i){var n=t.columnMappings,r=e;Array.isArray(n)?n.splice(r,1,i):t.columnMappings[e]=i},expression:\"columnMappings[header]\"}},[i(\"option\",{attrs:{value:\"0\"}},[t._v(\"Do Not Import\")])])],1)]),t._v(\" \"),i(\"td\",[i(\"div\",[t._v(t._s(t.activeFile.first_row[n]))])])])]})],2)])])]),t._v(\" \"),i(\"td\",[i(\"button\",{staticClass:\"btn btn-default\",attrs:{type:\"button\"},on:{click:function(e){t.processDetail=!1}}},[t._v(\"Cancel\")]),t._v(\" \"),i(\"button\",{staticClass:\"btn btn-primary\",attrs:{type:\"submit\"},on:{click:t.postSave}},[t._v(\"Import\")]),t._v(\" \"),t.statusText?i(\"div\",{staticClass:\"alert alert-success col-md-5 col-md-offset-1\",staticStyle:{\"text-align\":\"left\"}},[t._v(t._s(this.statusText))]):t._e()])])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"col-md-4 col-xs-12\"},[i(\"label\",{attrs:{for:\"import-type\"}},[t._v(\"Import Type:\")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"col-md-4 col-xs-12\"},[i(\"label\",{attrs:{for:\"import-update\"}},[t._v(\"Update Existing Values?:\")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"thead\",[i(\"th\",[t._v(\"Header Field\")]),t._v(\" \"),i(\"th\",[t._v(\"Import Field\")]),t._v(\" \"),i(\"th\",[t._v(\"Sample Value\")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",[t.tokens.length>0?i(\"div\",[i(\"div\",{staticClass:\"panel panel-default\"},[i(\"div\",{staticClass:\"panel-heading\"},[t._v(\"Authorized Applications\")]),t._v(\" \"),i(\"div\",{staticClass:\"panel-body\"},[i(\"table\",{staticClass:\"table table-borderless m-b-none\"},[t._m(0),t._v(\" \"),i(\"tbody\",t._l(t.tokens,function(e){return i(\"tr\",[i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[t._v(\"\\n                                \"+t._s(e.client.name)+\"\\n                            \")]),t._v(\" \"),i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[e.scopes.length>0?i(\"span\",[t._v(\"\\n                                    \"+t._s(e.scopes.join(\", \"))+\"\\n                                \")]):t._e()]),t._v(\" \"),i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[i(\"a\",{staticClass:\"action-link text-danger\",on:{click:function(i){t.revoke(e)}}},[t._v(\"\\n                                    Revoke\\n                                \")])])])}))])])])]):t._e()])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"thead\",[i(\"tr\",[i(\"th\",[t._v(\"Name\")]),t._v(\" \"),i(\"th\",[t._v(\"Scopes\")]),t._v(\" \"),i(\"th\")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",[i(\"div\",{staticClass:\"panel panel-default\"},[i(\"div\",{staticClass:\"panel-heading\"},[i(\"div\",{staticStyle:{display:\"flex\",\"justify-content\":\"space-between\",\"align-items\":\"center\"}},[i(\"span\",[t._v(\"\\n                    OAuth Clients\\n                \")]),t._v(\" \"),i(\"a\",{staticClass:\"action-link\",on:{click:t.showCreateClientForm}},[t._v(\"\\n                    Create New Client\\n                \")])])]),t._v(\" \"),i(\"div\",{staticClass:\"panel-body\"},[0===t.clients.length?i(\"p\",{staticClass:\"m-b-none\"},[t._v(\"\\n                You have not created any OAuth clients.\\n            \")]):t._e(),t._v(\" \"),t.clients.length>0?i(\"table\",{staticClass:\"table table-borderless m-b-none\"},[t._m(0),t._v(\" \"),i(\"tbody\",t._l(t.clients,function(e){return i(\"tr\",[i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[t._v(\"\\n                            \"+t._s(e.id)+\"\\n                        \")]),t._v(\" \"),i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[t._v(\"\\n                            \"+t._s(e.name)+\"\\n                        \")]),t._v(\" \"),i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[i(\"code\",[t._v(t._s(e.secret))])]),t._v(\" \"),i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[i(\"a\",{staticClass:\"action-link\",on:{click:function(i){t.edit(e)}}},[t._v(\"\\n                                Edit\\n                            \")])]),t._v(\" \"),i(\"td\",{staticStyle:{\"vertical-align\":\"middle\"}},[i(\"a\",{staticClass:\"action-link text-danger\",on:{click:function(i){t.destroy(e)}}},[t._v(\"\\n                                Delete\\n                            \")])])])}))]):t._e()])]),t._v(\" \"),i(\"div\",{staticClass:\"modal fade\",attrs:{id:\"modal-create-client\",tabindex:\"-1\",role:\"dialog\"}},[i(\"div\",{staticClass:\"modal-dialog\"},[i(\"div\",{staticClass:\"modal-content\"},[t._m(1),t._v(\" \"),i(\"div\",{staticClass:\"modal-body\"},[t.createForm.errors.length>0?i(\"div\",{staticClass:\"alert alert-danger\"},[t._m(2),t._v(\" \"),i(\"br\"),t._v(\" \"),i(\"ul\",t._l(t.createForm.errors,function(e){return i(\"li\",[t._v(\"\\n                                \"+t._s(e)+\"\\n                            \")])}))]):t._e(),t._v(\" \"),i(\"form\",{staticClass:\"form-horizontal\",attrs:{role:\"form\"}},[i(\"div\",{staticClass:\"form-group\"},[i(\"label\",{staticClass:\"col-md-3 control-label\"},[t._v(\"Name\")]),t._v(\" \"),i(\"div\",{staticClass:\"col-md-7\"},[i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:t.createForm.name,expression:\"createForm.name\"}],staticClass:\"form-control\",attrs:{id:\"create-client-name\",type:\"text\"},domProps:{value:t.createForm.name},on:{keyup:function(e){if(!(\"button\"in e)&&t._k(e.keyCode,\"enter\",13))return null;t.store(e)},input:function(e){e.target.composing||(t.createForm.name=e.target.value)}}}),t._v(\" \"),i(\"span\",{staticClass:\"help-block\"},[t._v(\"\\n                                    Something your users will recognize and trust.\\n                                \")])])]),t._v(\" \"),i(\"div\",{staticClass:\"form-group\"},[i(\"label\",{staticClass:\"col-md-3 control-label\"},[t._v(\"Redirect URL\")]),t._v(\" \"),i(\"div\",{staticClass:\"col-md-7\"},[i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:t.createForm.redirect,expression:\"createForm.redirect\"}],staticClass:\"form-control\",attrs:{type:\"text\",name:\"redirect\"},domProps:{value:t.createForm.redirect},on:{keyup:function(e){if(!(\"button\"in e)&&t._k(e.keyCode,\"enter\",13))return null;t.store(e)},input:function(e){e.target.composing||(t.createForm.redirect=e.target.value)}}}),t._v(\" \"),i(\"span\",{staticClass:\"help-block\"},[t._v(\"\\n                                    Your application's authorization callback URL.\\n                                \")])])])])]),t._v(\" \"),i(\"div\",{staticClass:\"modal-footer\"},[i(\"button\",{staticClass:\"btn btn-default\",attrs:{type:\"button\",\"data-dismiss\":\"modal\"}},[t._v(\"Close\")]),t._v(\" \"),i(\"button\",{staticClass:\"btn btn-primary\",attrs:{type:\"button\"},on:{click:t.store}},[t._v(\"\\n                        Create\\n                    \")])])])])]),t._v(\" \"),i(\"div\",{staticClass:\"modal fade\",attrs:{id:\"modal-edit-client\",tabindex:\"-1\",role:\"dialog\"}},[i(\"div\",{staticClass:\"modal-dialog\"},[i(\"div\",{staticClass:\"modal-content\"},[t._m(3),t._v(\" \"),i(\"div\",{staticClass:\"modal-body\"},[t.editForm.errors.length>0?i(\"div\",{staticClass:\"alert alert-danger\"},[t._m(4),t._v(\" \"),i(\"br\"),t._v(\" \"),i(\"ul\",t._l(t.editForm.errors,function(e){return i(\"li\",[t._v(\"\\n                                \"+t._s(e)+\"\\n                            \")])}))]):t._e(),t._v(\" \"),i(\"form\",{staticClass:\"form-horizontal\",attrs:{role:\"form\"}},[i(\"div\",{staticClass:\"form-group\"},[i(\"label\",{staticClass:\"col-md-3 control-label\"},[t._v(\"Name\")]),t._v(\" \"),i(\"div\",{staticClass:\"col-md-7\"},[i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:t.editForm.name,expression:\"editForm.name\"}],staticClass:\"form-control\",attrs:{id:\"edit-client-name\",type:\"text\"},domProps:{value:t.editForm.name},on:{keyup:function(e){if(!(\"button\"in e)&&t._k(e.keyCode,\"enter\",13))return null;t.update(e)},input:function(e){e.target.composing||(t.editForm.name=e.target.value)}}}),t._v(\" \"),i(\"span\",{staticClass:\"help-block\"},[t._v(\"\\n                                    Something your users will recognize and trust.\\n                                \")])])]),t._v(\" \"),i(\"div\",{staticClass:\"form-group\"},[i(\"label\",{staticClass:\"col-md-3 control-label\"},[t._v(\"Redirect URL\")]),t._v(\" \"),i(\"div\",{staticClass:\"col-md-7\"},[i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:t.editForm.redirect,expression:\"editForm.redirect\"}],staticClass:\"form-control\",attrs:{type:\"text\",name:\"redirect\"},domProps:{value:t.editForm.redirect},on:{keyup:function(e){if(!(\"button\"in e)&&t._k(e.keyCode,\"enter\",13))return null;t.update(e)},input:function(e){e.target.composing||(t.editForm.redirect=e.target.value)}}}),t._v(\" \"),i(\"span\",{staticClass:\"help-block\"},[t._v(\"\\n                                    Your application's authorization callback URL.\\n                                \")])])])])]),t._v(\" \"),i(\"div\",{staticClass:\"modal-footer\"},[i(\"button\",{staticClass:\"btn btn-default\",attrs:{type:\"button\",\"data-dismiss\":\"modal\"}},[t._v(\"Close\")]),t._v(\" \"),i(\"button\",{staticClass:\"btn btn-primary\",attrs:{type:\"button\"},on:{click:t.update}},[t._v(\"\\n                        Save Changes\\n                    \")])])])])])])},staticRenderFns:[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"thead\",[i(\"tr\",[i(\"th\",[t._v(\"Client ID\")]),t._v(\" \"),i(\"th\",[t._v(\"Name\")]),t._v(\" \"),i(\"th\",[t._v(\"Secret\")]),t._v(\" \"),i(\"th\"),t._v(\" \"),i(\"th\")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"modal-header\"},[i(\"button\",{staticClass:\"close\",attrs:{type:\"button \",\"data-dismiss\":\"modal\",\"aria-hidden\":\"true\"}},[t._v(\"×\")]),t._v(\" \"),i(\"h4\",{staticClass:\"modal-title\"},[t._v(\"\\n                        Create Client\\n                    \")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"p\",[i(\"strong\",[t._v(\"Whoops!\")]),t._v(\" Something went wrong!\")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"div\",{staticClass:\"modal-header\"},[i(\"button\",{staticClass:\"close\",attrs:{type:\"button \",\"data-dismiss\":\"modal\",\"aria-hidden\":\"true\"}},[t._v(\"×\")]),t._v(\" \"),i(\"h4\",{staticClass:\"modal-title\"},[t._v(\"\\n                        Edit Client\\n                    \")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i(\"p\",[i(\"strong\",[t._v(\"Whoops!\")]),t._v(\" Something went wrong!\")])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement;return(t._self._c||e)(\"select\",{staticStyle:{width:\"100%\"}},[t._t(\"default\")],2)},staticRenderFns:[]}},function(t,e,i){\"use strict\";function n(t){this.state=U,this.value=void 0,this.deferred=[];var e=this;try{t(function(t){e.resolve(t)},function(t){e.reject(t)})}catch(t){e.reject(t)}}function r(t,e){t instanceof Promise?this.promise=t:this.promise=new Promise(t.bind(e)),this.context=e}function s(t){}function o(t){}function a(t,e){return K(t,e)}function l(t){return t?t.replace(/^\\s*|\\s*$/g,\"\"):\"\"}function u(t,e){return t&&void 0===e?t.replace(/\\s+$/,\"\"):t&&e?t.replace(new RegExp(\"[\"+e+\"]+$\"),\"\"):t}function c(t){return t?t.toLowerCase():\"\"}function h(t){return t?t.toUpperCase():\"\"}function d(t){return\"string\"==typeof t}function p(t){return\"function\"==typeof t}function f(t){return null!==t&&\"object\"==typeof t}function g(t){return f(t)&&Object.getPrototypeOf(t)==Object.prototype}function m(t){return\"undefined\"!=typeof Blob&&t instanceof Blob}function v(t){return\"undefined\"!=typeof FormData&&t instanceof FormData}function _(t,e,i){var n=r.resolve(t);return arguments.length<2?n:n.then(e,i)}function y(t,e,i){return i=i||{},p(i)&&(i=i.call(e)),w(t.bind({$vm:e,$options:i}),t,{$options:i})}function b(t,e){var i,n;if(it(t))for(i=0;i<t.length;i++)e.call(t[i],t[i],i);else if(f(t))for(n in t)G.call(t,n)&&e.call(t[n],t[n],n);return t}function w(t){return J.call(arguments,1).forEach(function(e){k(t,e,!0)}),t}function x(t){return J.call(arguments,1).forEach(function(e){for(var i in e)void 0===t[i]&&(t[i]=e[i])}),t}function C(t){return J.call(arguments,1).forEach(function(e){k(t,e)}),t}function k(t,e,i){for(var n in e)i&&(g(e[n])||it(e[n]))?(g(e[n])&&!g(t[n])&&(t[n]={}),it(e[n])&&!it(t[n])&&(t[n]=[]),k(t[n],e[n],i)):void 0!==e[n]&&(t[n]=e[n])}function T(t,e,i){var n=D(t),r=n.expand(e);return i&&i.push.apply(i,n.vars),r}function D(t){var e=[\"+\",\"#\",\".\",\"/\",\";\",\"?\",\"&\"],i=[];return{vars:i,expand:function(n){return t.replace(/\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,function(t,r,s){if(r){var o=null,a=[];if(-1!==e.indexOf(r.charAt(0))&&(o=r.charAt(0),r=r.substr(1)),r.split(/,/g).forEach(function(t){var e=/([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(t);a.push.apply(a,S(n,o,e[1],e[2]||e[3])),i.push(e[1])}),o&&\"+\"!==o){var l=\",\";return\"?\"===o?l=\"&\":\"#\"!==o&&(l=o),(0!==a.length?o:\"\")+a.join(l)}return a.join(\",\")}return $(s)})}}}function S(t,e,i,n){var r=t[i],s=[];if(A(r)&&\"\"!==r)if(\"string\"==typeof r||\"number\"==typeof r||\"boolean\"==typeof r)r=r.toString(),n&&\"*\"!==n&&(r=r.substring(0,parseInt(n,10))),s.push(I(e,r,E(e)?i:null));else if(\"*\"===n)Array.isArray(r)?r.filter(A).forEach(function(t){s.push(I(e,t,E(e)?i:null))}):Object.keys(r).forEach(function(t){A(r[t])&&s.push(I(e,r[t],t))});else{var o=[];Array.isArray(r)?r.filter(A).forEach(function(t){o.push(I(e,t))}):Object.keys(r).forEach(function(t){A(r[t])&&(o.push(encodeURIComponent(t)),o.push(I(e,r[t].toString())))}),E(e)?s.push(encodeURIComponent(i)+\"=\"+o.join(\",\")):0!==o.length&&s.push(o.join(\",\"))}else\";\"===e?s.push(encodeURIComponent(i)):\"\"!==r||\"&\"!==e&&\"?\"!==e?\"\"===r&&s.push(\"\"):s.push(encodeURIComponent(i)+\"=\");return s}function A(t){return void 0!==t&&null!==t}function E(t){return\";\"===t||\"&\"===t||\"?\"===t}function I(t,e,i){return e=\"+\"===t||\"#\"===t?$(e):encodeURIComponent(e),i?encodeURIComponent(i)+\"=\"+e:e}function $(t){return t.split(/(%[0-9A-Fa-f]{2})/g).map(function(t){return/%[0-9A-Fa-f]/.test(t)||(t=encodeURI(t)),t}).join(\"\")}function O(t,e){var i,n=this||{},r=t;return d(t)&&(r={url:t,params:e}),r=w({},O.options,n.$options,r),O.transforms.forEach(function(t){d(t)&&(t=O.transform[t]),p(t)&&(i=P(t,i,n.$vm))}),i(r)}function P(t,e,i){return function(n){return t.call(i,n,e)}}function N(t,e,i){var n,r=it(e),s=g(e);b(e,function(e,o){n=f(e)||it(e),i&&(o=i+\"[\"+(s||n?o:\"\")+\"]\"),!i&&r?t.add(e.name,e.value):n?N(t,e,o):t.add(o,e)})}function M(t){var e=t.match(/^\\[|^\\{(?!\\{)/),i={\"[\":/]$/,\"{\":/}$/};return e&&i[e[0]].test(t)}function j(t,e){e((t.client||(tt?vt:_t))(t))}function H(t,e){return Object.keys(t).reduce(function(t,i){return c(e)===c(i)?i:t},null)}function R(t){if(/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(t))throw new TypeError(\"Invalid character in header field name\");return l(t)}function L(t){return new r(function(e){var i=new FileReader;i.readAsText(t),i.onload=function(){e(i.result)}})}function F(t){return 0===t.type.indexOf(\"text\")||-1!==t.type.indexOf(\"json\")}function z(t){var e=this||{},i=yt(e.$vm);return x(t||{},e.$options,z.options),z.interceptors.forEach(function(t){d(t)&&(t=z.interceptor[t]),p(t)&&i.use(t)}),i(new xt(t)).then(function(t){return t.ok?t:r.reject(t)},function(t){return t instanceof Error&&o(t),r.reject(t)})}function W(t,e,i,n){var r=this||{},s={};return i=nt({},W.actions,i),b(i,function(i,o){i=w({url:t,params:nt({},e)},n,i),s[o]=function(){return(r.$http||z)(q(i,arguments))}}),s}function q(t,e){var i,n=nt({},t),r={};switch(e.length){case 2:r=e[0],i=e[1];break;case 1:/^(POST|PUT|PATCH)$/i.test(n.method)?i=e[0]:r=e[0];break;case 0:break;default:throw\"Expected up to 2 arguments [params, body], got \"+e.length+\" arguments\"}return n.body=i,n.params=nt({},n.params,r),n}function B(t){B.installed||(et(t),t.url=O,t.http=z,t.resource=W,t.Promise=r,Object.defineProperties(t.prototype,{$url:{get:function(){return y(t.url,this,this.$options.url)}},$http:{get:function(){return y(t.http,this,this.$options.http)}},$resource:{get:function(){return t.resource.bind(this)}},$promise:{get:function(){var e=this;return function(i){return new t.Promise(i,e)}}}}))}Object.defineProperty(e,\"__esModule\",{value:!0}),i.d(e,\"Url\",function(){return O}),i.d(e,\"Http\",function(){return z}),i.d(e,\"Resource\",function(){return W});/*!\n * vue-resource v1.3.3\n * https://github.com/pagekit/vue-resource\n * Released under the MIT License.\n */\nvar U=2;n.reject=function(t){return new n(function(e,i){i(t)})},n.resolve=function(t){return new n(function(e,i){e(t)})},n.all=function(t){return new n(function(e,i){var r=0,s=[];0===t.length&&e(s);for(var o=0;o<t.length;o+=1)n.resolve(t[o]).then(function(i){return function(n){s[i]=n,(r+=1)===t.length&&e(s)}}(o),i)})},n.race=function(t){return new n(function(e,i){for(var r=0;r<t.length;r+=1)n.resolve(t[r]).then(e,i)})};var Y=n.prototype;Y.resolve=function(t){var e=this;if(e.state===U){if(t===e)throw new TypeError(\"Promise settled with itself.\");var i=!1;try{var n=t&&t.then;if(null!==t&&\"object\"==typeof t&&\"function\"==typeof n)return void n.call(t,function(t){i||e.resolve(t),i=!0},function(t){i||e.reject(t),i=!0})}catch(t){return void(i||e.reject(t))}e.state=0,e.value=t,e.notify()}},Y.reject=function(t){var e=this;if(e.state===U){if(t===e)throw new TypeError(\"Promise settled with itself.\");e.state=1,e.value=t,e.notify()}},Y.notify=function(){var t=this;a(function(){if(t.state!==U)for(;t.deferred.length;){var e=t.deferred.shift(),i=e[0],n=e[1],r=e[2],s=e[3];try{0===t.state?r(\"function\"==typeof i?i.call(void 0,t.value):t.value):1===t.state&&(\"function\"==typeof n?r(n.call(void 0,t.value)):s(t.value))}catch(t){s(t)}}})},Y.then=function(t,e){var i=this;return new n(function(n,r){i.deferred.push([t,e,n,r]),i.notify()})},Y.catch=function(t){return this.then(void 0,t)},\"undefined\"==typeof Promise&&(window.Promise=n),r.all=function(t,e){return new r(Promise.all(t),e)},r.resolve=function(t,e){return new r(Promise.resolve(t),e)},r.reject=function(t,e){return new r(Promise.reject(t),e)},r.race=function(t,e){return new r(Promise.race(t),e)};var V=r.prototype;V.bind=function(t){return this.context=t,this},V.then=function(t,e){return t&&t.bind&&this.context&&(t=t.bind(this.context)),e&&e.bind&&this.context&&(e=e.bind(this.context)),new r(this.promise.then(t,e),this.context)},V.catch=function(t){return t&&t.bind&&this.context&&(t=t.bind(this.context)),new r(this.promise.catch(t),this.context)},V.finally=function(t){return this.then(function(e){return t.call(this),e},function(e){return t.call(this),Promise.reject(e)})};var K,X={},G=X.hasOwnProperty,Z=[],J=Z.slice,Q=!1,tt=\"undefined\"!=typeof window,et=function(t){var e=t.config,i=t.nextTick;K=i,Q=e.debug||!e.silent},it=Array.isArray,nt=Object.assign||C,rt=function(t,e){var i=e(t);return d(t.root)&&!/^(https?:)?\\//.test(i)&&(i=u(t.root,\"/\")+\"/\"+i),i},st=function(t,e){var i=Object.keys(O.options.params),n={},r=e(t);return b(t.params,function(t,e){-1===i.indexOf(e)&&(n[e]=t)}),n=O.params(n),n&&(r+=(-1==r.indexOf(\"?\")?\"?\":\"&\")+n),r},ot=function(t){var e=[],i=T(t.url,t.params,e);return e.forEach(function(e){delete t.params[e]}),i};O.options={url:\"\",root:null,params:{}},O.transform={template:ot,query:st,root:rt},O.transforms=[\"template\",\"query\",\"root\"],O.params=function(t){var e=[],i=encodeURIComponent;return e.add=function(t,e){p(e)&&(e=e()),null===e&&(e=\"\"),this.push(i(t)+\"=\"+i(e))},N(e,t),e.join(\"&\").replace(/%20/g,\"+\")},O.parse=function(t){var e=document.createElement(\"a\");return document.documentMode&&(e.href=t,t=e.href),e.href=t,{href:e.href,protocol:e.protocol?e.protocol.replace(/:$/,\"\"):\"\",port:e.port,host:e.host,hostname:e.hostname,pathname:\"/\"===e.pathname.charAt(0)?e.pathname:\"/\"+e.pathname,search:e.search?e.search.replace(/^\\?/,\"\"):\"\",hash:e.hash?e.hash.replace(/^#/,\"\"):\"\"}};var at=function(t){return new r(function(e){var i=new XDomainRequest,n=function(n){var r=n.type,s=0;\"load\"===r?s=200:\"error\"===r&&(s=500),e(t.respondWith(i.responseText,{status:s}))};t.abort=function(){return i.abort()},i.open(t.method,t.getUrl()),t.timeout&&(i.timeout=t.timeout),i.onload=n,i.onabort=n,i.onerror=n,i.ontimeout=n,i.onprogress=function(){},i.send(t.getBody())})},lt=tt&&\"withCredentials\"in new XMLHttpRequest,ut=function(t,e){if(tt){var i=O.parse(location.href),n=O.parse(t.getUrl());n.protocol===i.protocol&&n.host===i.host||(t.crossOrigin=!0,t.emulateHTTP=!1,lt||(t.client=at))}e()},ct=function(t,e){v(t.body)?t.headers.delete(\"Content-Type\"):f(t.body)&&t.emulateJSON&&(t.body=O.params(t.body),t.headers.set(\"Content-Type\",\"application/x-www-form-urlencoded\")),e()},ht=function(t,e){var i=t.headers.get(\"Content-Type\")||\"\";f(t.body)&&0===i.indexOf(\"application/json\")&&(t.body=JSON.stringify(t.body)),e(function(t){return t.bodyText?_(t.text(),function(e){if(i=t.headers.get(\"Content-Type\")||\"\",0===i.indexOf(\"application/json\")||M(e))try{t.body=JSON.parse(e)}catch(e){t.body=null}else t.body=e;return t}):t})},dt=function(t){return new r(function(e){var i,n,r=t.jsonp||\"callback\",s=t.jsonpCallback||\"_jsonp\"+Math.random().toString(36).substr(2),o=null;i=function(i){var r=i.type,a=0;\"load\"===r&&null!==o?a=200:\"error\"===r&&(a=500),a&&window[s]&&(delete window[s],document.body.removeChild(n)),e(t.respondWith(o,{status:a}))},window[s]=function(t){o=JSON.stringify(t)},t.abort=function(){i({type:\"abort\"})},t.params[r]=s,t.timeout&&setTimeout(t.abort,t.timeout),n=document.createElement(\"script\"),n.src=t.getUrl(),n.type=\"text/javascript\",n.async=!0,n.onload=i,n.onerror=i,document.body.appendChild(n)})},pt=function(t,e){\"JSONP\"==t.method&&(t.client=dt),e()},ft=function(t,e){p(t.before)&&t.before.call(this,t),e()},gt=function(t,e){t.emulateHTTP&&/^(PUT|PATCH|DELETE)$/i.test(t.method)&&(t.headers.set(\"X-HTTP-Method-Override\",t.method),t.method=\"POST\"),e()},mt=function(t,e){b(nt({},z.headers.common,t.crossOrigin?{}:z.headers.custom,z.headers[c(t.method)]),function(e,i){t.headers.has(i)||t.headers.set(i,e)}),e()},vt=function(t){return new r(function(e){var i=new XMLHttpRequest,n=function(n){var r=t.respondWith(\"response\"in i?i.response:i.responseText,{status:1223===i.status?204:i.status,statusText:1223===i.status?\"No Content\":l(i.statusText)});b(l(i.getAllResponseHeaders()).split(\"\\n\"),function(t){r.headers.append(t.slice(0,t.indexOf(\":\")),t.slice(t.indexOf(\":\")+1))}),e(r)};t.abort=function(){return i.abort()},t.progress&&(\"GET\"===t.method?i.addEventListener(\"progress\",t.progress):/^(POST|PUT)$/i.test(t.method)&&i.upload.addEventListener(\"progress\",t.progress)),i.open(t.method,t.getUrl(),!0),t.timeout&&(i.timeout=t.timeout),t.responseType&&\"responseType\"in i&&(i.responseType=t.responseType),(t.withCredentials||t.credentials)&&(i.withCredentials=!0),t.crossOrigin||t.headers.set(\"X-Requested-With\",\"XMLHttpRequest\"),t.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),i.onload=n,i.onabort=n,i.onerror=n,i.ontimeout=n,i.send(t.getBody())})},_t=function(t){var e=i(61);return new r(function(i){var n,r=t.getUrl(),s=t.getBody(),o=t.method,a={};t.headers.forEach(function(t,e){a[e]=t}),e(r,{body:s,method:o,headers:a}).then(n=function(e){var n=t.respondWith(e.body,{status:e.statusCode,statusText:l(e.statusMessage)});b(e.headers,function(t,e){n.headers.set(e,t)}),i(n)},function(t){return n(t.response)})})},yt=function(t){function e(e){return new r(function(r){function a(){i=n.pop(),p(i)?i.call(t,e,l):(s(\"Invalid interceptor of type \"+typeof i+\", must be a function\"),l())}function l(e){if(p(e))o.unshift(e);else if(f(e))return o.forEach(function(i){e=_(e,function(e){return i.call(t,e)||e})}),void _(e,r);a()}a()},t)}var i,n=[j],o=[];return f(t)||(t=null),e.use=function(t){n.push(t)},e},bt=function(t){var e=this;this.map={},b(t,function(t,i){return e.append(i,t)})};bt.prototype.has=function(t){return null!==H(this.map,t)},bt.prototype.get=function(t){var e=this.map[H(this.map,t)];return e?e.join():null},bt.prototype.getAll=function(t){return this.map[H(this.map,t)]||[]},bt.prototype.set=function(t,e){this.map[R(H(this.map,t)||t)]=[l(e)]},bt.prototype.append=function(t,e){var i=this.map[H(this.map,t)];i?i.push(l(e)):this.set(t,e)},bt.prototype.delete=function(t){delete this.map[H(this.map,t)]},bt.prototype.deleteAll=function(){this.map={}},bt.prototype.forEach=function(t,e){var i=this;b(this.map,function(n,r){b(n,function(n){return t.call(e,n,r,i)})})};var wt=function(t,e){var i=e.url,n=e.headers,r=e.status,s=e.statusText;this.url=i,this.ok=r>=200&&r<300,this.status=r||0,this.statusText=s||\"\",this.headers=new bt(n),this.body=t,d(t)?this.bodyText=t:m(t)&&(this.bodyBlob=t,F(t)&&(this.bodyText=L(t)))};wt.prototype.blob=function(){return _(this.bodyBlob)},wt.prototype.text=function(){return _(this.bodyText)},wt.prototype.json=function(){return _(this.text(),function(t){return JSON.parse(t)})},Object.defineProperty(wt.prototype,\"data\",{get:function(){return this.body},set:function(t){this.body=t}});var xt=function(t){this.body=null,this.params={},nt(this,t,{method:h(t.method||\"GET\")}),this.headers instanceof bt||(this.headers=new bt(this.headers))};xt.prototype.getUrl=function(){return O(this)},xt.prototype.getBody=function(){return this.body},xt.prototype.respondWith=function(t,e){return new wt(t,nt(e||{},{url:this.getUrl()}))};var Ct={Accept:\"application/json, text/plain, */*\"},kt={\"Content-Type\":\"application/json;charset=utf-8\"};z.options={},z.headers={put:kt,post:kt,patch:kt,delete:kt,common:Ct,custom:{}},z.interceptor={before:ft,method:gt,jsonp:pt,json:ht,form:ct,header:mt,cors:ut},z.interceptors=[\"before\",\"method\",\"jsonp\",\"json\",\"form\",\"header\",\"cors\"],[\"get\",\"delete\",\"head\",\"jsonp\"].forEach(function(t){z[t]=function(e,i){return this(nt(i||{},{url:e,method:t}))}}),[\"post\",\"put\",\"patch\"].forEach(function(t){z[t]=function(e,i,n){return this(nt(n||{},{url:e,method:t,body:i}))}}),W.actions={get:{method:\"GET\"},save:{method:\"POST\"},query:{method:\"GET\"},update:{method:\"PUT\"},remove:{method:\"DELETE\"},delete:{method:\"DELETE\"}},\"undefined\"!=typeof window&&window.Vue&&window.Vue.use(B),e.default=B},function(t,e,i){var n=i(21);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"8f4ff93a\",n,!0)},function(t,e,i){var n=i(22);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"7c4ed951\",n,!0)},function(t,e,i){var n=i(23);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"717c9dce\",n,!0)},function(t,e,i){var n=i(24);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"1dd8eaae\",n,!0)},function(t,e,i){var n=i(25);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"26b4c516\",n,!0)},function(t,e,i){var n=i(26);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"1789f86f\",n,!0)},function(t,e,i){var n=i(27);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"73719aac\",n,!0)},function(t,e,i){var n=i(28);\"string\"==typeof n&&(n=[[t.i,n,\"\"]]),n.locals&&(t.exports=n.locals);i(2)(\"664d54ac\",n,!0)},function(t,e){t.exports=function(t,e){for(var i=[],n={},r=0;r<e.length;r++){var s=e[r],o=s[0],a=s[1],l=s[2],u=s[3],c={id:t+\":\"+r,css:a,media:l,sourceMap:u};n[o]?n[o].parts.push(c):i.push(n[o]={id:o,parts:[c]})}return i}},function(t,e,i){\"use strict\";(function(e){/*!\n * Vue.js v2.3.3\n * (c) 2014-2017 Evan You\n * Released under the MIT License.\n */\nfunction i(t){return void 0===t||null===t}function n(t){return void 0!==t&&null!==t}function r(t){return!0===t}function s(t){return!1===t}function o(t){return\"string\"==typeof t||\"number\"==typeof t}function a(t){return null!==t&&\"object\"==typeof t}function l(t){return\"[object Object]\"===$r.call(t)}function u(t){return\"[object RegExp]\"===$r.call(t)}function c(t){return null==t?\"\":\"object\"==typeof t?JSON.stringify(t,null,2):String(t)}function h(t){var e=parseFloat(t);return isNaN(e)?t:e}function d(t,e){for(var i=Object.create(null),n=t.split(\",\"),r=0;r<n.length;r++)i[n[r]]=!0;return e?function(t){return i[t.toLowerCase()]}:function(t){return i[t]}}function p(t,e){if(t.length){var i=t.indexOf(e);if(i>-1)return t.splice(i,1)}}function f(t,e){return Pr.call(t,e)}function g(t){var e=Object.create(null);return function(i){return e[i]||(e[i]=t(i))}}function m(t,e){function i(i){var n=arguments.length;return n?n>1?t.apply(e,arguments):t.call(e,i):t.call(e)}return i._length=t.length,i}function v(t,e){e=e||0;for(var i=t.length-e,n=new Array(i);i--;)n[i]=t[i+e];return n}function _(t,e){for(var i in e)t[i]=e[i];return t}function y(t){for(var e={},i=0;i<t.length;i++)t[i]&&_(e,t[i]);return e}function b(){}function w(t,e){var i=a(t),n=a(e);if(!i||!n)return!i&&!n&&String(t)===String(e);try{return JSON.stringify(t)===JSON.stringify(e)}catch(i){return t===e}}function x(t,e){for(var i=0;i<t.length;i++)if(w(t[i],e))return i;return-1}function C(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments))}}function k(t){var e=(t+\"\").charCodeAt(0);return 36===e||95===e}function T(t,e,i,n){Object.defineProperty(t,e,{value:i,enumerable:!!n,writable:!0,configurable:!0})}function D(t){if(!Yr.test(t)){var e=t.split(\".\");return function(t){for(var i=0;i<e.length;i++){if(!t)return;t=t[e[i]]}return t}}}function S(t,e,i){if(Br.errorHandler)Br.errorHandler.call(null,t,e,i);else if(!Xr||\"undefined\"==typeof console)throw t}function A(t){return\"function\"==typeof t&&/native code/.test(t.toString())}function E(t){ds.target&&ps.push(ds.target),ds.target=t}function I(){ds.target=ps.pop()}function $(t,e){t.__proto__=e}function O(t,e,i){for(var n=0,r=i.length;n<r;n++){var s=i[n];T(t,s,e[s])}}function P(t,e){if(a(t)){var i;return f(t,\"__ob__\")&&t.__ob__ instanceof _s?i=t.__ob__:vs.shouldConvert&&!as()&&(Array.isArray(t)||l(t))&&Object.isExtensible(t)&&!t._isVue&&(i=new _s(t)),e&&i&&i.vmCount++,i}}function N(t,e,i,n){var r=new ds,s=Object.getOwnPropertyDescriptor(t,e);if(!s||!1!==s.configurable){var o=s&&s.get,a=s&&s.set,l=P(i);Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){var e=o?o.call(t):i;return ds.target&&(r.depend(),l&&l.dep.depend(),Array.isArray(e)&&H(e)),e},set:function(e){var n=o?o.call(t):i;e===n||e!==e&&n!==n||(a?a.call(t,e):i=e,l=P(e),r.notify())}})}}function M(t,e,i){if(Array.isArray(t)&&\"number\"==typeof e)return t.length=Math.max(t.length,e),t.splice(e,1,i),i;if(f(t,e))return t[e]=i,i;var n=t.__ob__;return t._isVue||n&&n.vmCount?i:n?(N(n.value,e,i),n.dep.notify(),i):(t[e]=i,i)}function j(t,e){if(Array.isArray(t)&&\"number\"==typeof e)return void t.splice(e,1);var i=t.__ob__;t._isVue||i&&i.vmCount||f(t,e)&&(delete t[e],i&&i.dep.notify())}function H(t){for(var e=void 0,i=0,n=t.length;i<n;i++)e=t[i],e&&e.__ob__&&e.__ob__.dep.depend(),Array.isArray(e)&&H(e)}function R(t,e){if(!e)return t;for(var i,n,r,s=Object.keys(e),o=0;o<s.length;o++)i=s[o],n=t[i],r=e[i],f(t,i)?l(n)&&l(r)&&R(n,r):M(t,i,r);return t}function L(t,e){return e?t?t.concat(e):Array.isArray(e)?e:[e]:t}function F(t,e){var i=Object.create(t||null);return e?_(i,e):i}function z(t){var e=t.props;if(e){var i,n,r,s={};if(Array.isArray(e))for(i=e.length;i--;)\"string\"==typeof(n=e[i])&&(r=Mr(n),s[r]={type:null});else if(l(e))for(var o in e)n=e[o],r=Mr(o),s[r]=l(n)?n:{type:n};t.props=s}}function W(t){var e=t.directives;if(e)for(var i in e){var n=e[i];\"function\"==typeof n&&(e[i]={bind:n,update:n})}}function q(t,e,i){function n(n){var r=ys[n]||bs;l[n]=r(t[n],e[n],i,n)}\"function\"==typeof e&&(e=e.options),z(e),W(e);var r=e.extends;if(r&&(t=q(t,r,i)),e.mixins)for(var s=0,o=e.mixins.length;s<o;s++)t=q(t,e.mixins[s],i);var a,l={};for(a in t)n(a);for(a in e)f(t,a)||n(a);return l}function B(t,e,i,n){if(\"string\"==typeof i){var r=t[e];if(f(r,i))return r[i];var s=Mr(i);if(f(r,s))return r[s];var o=jr(s);if(f(r,o))return r[o];return r[i]||r[s]||r[o]}}function U(t,e,i,n){var r=e[t],s=!f(i,t),o=i[t];if(K(Boolean,r.type)&&(s&&!f(r,\"default\")?o=!1:K(String,r.type)||\"\"!==o&&o!==Rr(t)||(o=!0)),void 0===o){o=Y(n,r,t);var a=vs.shouldConvert;vs.shouldConvert=!0,P(o),vs.shouldConvert=a}return o}function Y(t,e,i){if(f(e,\"default\")){var n=e.default;return t&&t.$options.propsData&&void 0===t.$options.propsData[i]&&void 0!==t._props[i]?t._props[i]:\"function\"==typeof n&&\"Function\"!==V(e.type)?n.call(t):n}}function V(t){var e=t&&t.toString().match(/^\\s*function (\\w+)/);return e?e[1]:\"\"}function K(t,e){if(!Array.isArray(e))return V(e)===V(t);for(var i=0,n=e.length;i<n;i++)if(V(e[i])===V(t))return!0;return!1}function X(t){return new ws(void 0,void 0,void 0,String(t))}function G(t){var e=new ws(t.tag,t.data,t.children,t.text,t.elm,t.context,t.componentOptions);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.isCloned=!0,e}function Z(t){for(var e=t.length,i=new Array(e),n=0;n<e;n++)i[n]=G(t[n]);return i}function J(t){function e(){var t=arguments,i=e.fns;if(!Array.isArray(i))return i.apply(null,arguments);for(var n=0;n<i.length;n++)i[n].apply(null,t)}return e.fns=t,e}function Q(t,e,n,r,s){var o,a,l,u;for(o in t)a=t[o],l=e[o],u=Ts(o),i(a)||(i(l)?(i(a.fns)&&(a=t[o]=J(a)),n(u.name,a,u.once,u.capture,u.passive)):a!==l&&(l.fns=a,t[o]=l));for(o in e)i(t[o])&&(u=Ts(o),r(u.name,e[o],u.capture))}function tt(t,e,s){function o(){s.apply(this,arguments),p(a.fns,o)}var a,l=t[e];i(l)?a=J([o]):n(l.fns)&&r(l.merged)?(a=l,a.fns.push(o)):a=J([l,o]),a.merged=!0,t[e]=a}function et(t,e,r){var s=e.options.props;if(!i(s)){var o={},a=t.attrs,l=t.props;if(n(a)||n(l))for(var u in s){var c=Rr(u);it(o,l,u,c,!0)||it(o,a,u,c,!1)}return o}}function it(t,e,i,r,s){if(n(e)){if(f(e,i))return t[i]=e[i],s||delete e[i],!0;if(f(e,r))return t[i]=e[r],s||delete e[r],!0}return!1}function nt(t){for(var e=0;e<t.length;e++)if(Array.isArray(t[e]))return Array.prototype.concat.apply([],t);return t}function rt(t){return o(t)?[X(t)]:Array.isArray(t)?ot(t):void 0}function st(t){return n(t)&&n(t.text)&&s(t.isComment)}function ot(t,e){var s,a,l,u=[];for(s=0;s<t.length;s++)a=t[s],i(a)||\"boolean\"==typeof a||(l=u[u.length-1],Array.isArray(a)?u.push.apply(u,ot(a,(e||\"\")+\"_\"+s)):o(a)?st(l)?l.text+=String(a):\"\"!==a&&u.push(X(a)):st(a)&&st(l)?u[u.length-1]=X(l.text+a.text):(r(t._isVList)&&n(a.tag)&&i(a.key)&&n(e)&&(a.key=\"__vlist\"+e+\"_\"+s+\"__\"),u.push(a)));return u}function at(t,e){return a(t)?e.extend(t):t}function lt(t,e,s){if(r(t.error)&&n(t.errorComp))return t.errorComp;if(n(t.resolved))return t.resolved;if(r(t.loading)&&n(t.loadingComp))return t.loadingComp;if(!n(t.contexts)){var o=t.contexts=[s],l=!0,u=function(){for(var t=0,e=o.length;t<e;t++)o[t].$forceUpdate()},c=C(function(i){t.resolved=at(i,e),l||u()}),h=C(function(e){n(t.errorComp)&&(t.error=!0,u())}),d=t(c,h);return a(d)&&(\"function\"==typeof d.then?i(t.resolved)&&d.then(c,h):n(d.component)&&\"function\"==typeof d.component.then&&(d.component.then(c,h),n(d.error)&&(t.errorComp=at(d.error,e)),n(d.loading)&&(t.loadingComp=at(d.loading,e),0===d.delay?t.loading=!0:setTimeout(function(){i(t.resolved)&&i(t.error)&&(t.loading=!0,u())},d.delay||200)),n(d.timeout)&&setTimeout(function(){i(t.resolved)&&h(null)},d.timeout))),l=!1,t.loading?t.loadingComp:t.resolved}t.contexts.push(s)}function ut(t){if(Array.isArray(t))for(var e=0;e<t.length;e++){var i=t[e];if(n(i)&&n(i.componentOptions))return i}}function ct(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&pt(t,e)}function ht(t,e,i){i?Cs.$once(t,e):Cs.$on(t,e)}function dt(t,e){Cs.$off(t,e)}function pt(t,e,i){Cs=t,Q(e,i||{},ht,dt,t)}function ft(t,e){var i={};if(!t)return i;for(var n=[],r=0,s=t.length;r<s;r++){var o=t[r];if(o.context!==e&&o.functionalContext!==e||!o.data||null==o.data.slot)n.push(o);else{var a=o.data.slot,l=i[a]||(i[a]=[]);\"template\"===o.tag?l.push.apply(l,o.children):l.push(o)}}return n.every(gt)||(i.default=n),i}function gt(t){return t.isComment||\" \"===t.text}function mt(t,e){e=e||{};for(var i=0;i<t.length;i++)Array.isArray(t[i])?mt(t[i],e):e[t[i].key]=t[i].fn;return e}function vt(t){var e=t.$options,i=e.parent;if(i&&!e.abstract){for(;i.$options.abstract&&i.$parent;)i=i.$parent;i.$children.push(t)}t.$parent=i,t.$root=i?i.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}function _t(t,e,i){t.$el=e,t.$options.render||(t.$options.render=ks),Ct(t,\"beforeMount\");var n;return n=function(){t._update(t._render(),i)},t._watcher=new Ns(t,n,b),i=!1,null==t.$vnode&&(t._isMounted=!0,Ct(t,\"mounted\")),t}function yt(t,e,i,n,r){var s=!!(r||t.$options._renderChildren||n.data.scopedSlots||t.$scopedSlots!==Ur);if(t.$options._parentVnode=n,t.$vnode=n,t._vnode&&(t._vnode.parent=n),t.$options._renderChildren=r,e&&t.$options.props){vs.shouldConvert=!1;for(var o=t._props,a=t.$options._propKeys||[],l=0;l<a.length;l++){var u=a[l];o[u]=U(u,t.$options.props,e,t)}vs.shouldConvert=!0,t.$options.propsData=e}if(i){var c=t.$options._parentListeners;t.$options._parentListeners=i,pt(t,i,c)}s&&(t.$slots=ft(r,n.context),t.$forceUpdate())}function bt(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}function wt(t,e){if(e){if(t._directInactive=!1,bt(t))return}else if(t._directInactive)return;if(t._inactive||null===t._inactive){t._inactive=!1;for(var i=0;i<t.$children.length;i++)wt(t.$children[i]);Ct(t,\"activated\")}}function xt(t,e){if(!(e&&(t._directInactive=!0,bt(t))||t._inactive)){t._inactive=!0;for(var i=0;i<t.$children.length;i++)xt(t.$children[i]);Ct(t,\"deactivated\")}}function Ct(t,e){var i=t.$options[e];if(i)for(var n=0,r=i.length;n<r;n++)try{i[n].call(t)}catch(i){S(i,t,e+\" hook\")}t._hasHookEvent&&t.$emit(\"hook:\"+e)}function kt(){Os=Ss.length=As.length=0,Es={},Is=$s=!1}function Tt(){$s=!0;var t,e;for(Ss.sort(function(t,e){return t.id-e.id}),Os=0;Os<Ss.length;Os++)t=Ss[Os],e=t.id,Es[e]=null,t.run();var i=As.slice(),n=Ss.slice();kt(),At(i),Dt(n),ls&&Br.devtools&&ls.emit(\"flush\")}function Dt(t){for(var e=t.length;e--;){var i=t[e],n=i.vm;n._watcher===i&&n._isMounted&&Ct(n,\"updated\")}}function St(t){t._inactive=!1,As.push(t)}function At(t){for(var e=0;e<t.length;e++)t[e]._inactive=!0,wt(t[e],!0)}function Et(t){var e=t.id;if(null==Es[e]){if(Es[e]=!0,$s){for(var i=Ss.length-1;i>Os&&Ss[i].id>t.id;)i--;Ss.splice(i+1,0,t)}else Ss.push(t);Is||(Is=!0,cs(Tt))}}function It(t){Ms.clear(),$t(t,Ms)}function $t(t,e){var i,n,r=Array.isArray(t);if((r||a(t))&&Object.isExtensible(t)){if(t.__ob__){var s=t.__ob__.dep.id;if(e.has(s))return;e.add(s)}if(r)for(i=t.length;i--;)$t(t[i],e);else for(n=Object.keys(t),i=n.length;i--;)$t(t[n[i]],e)}}function Ot(t,e,i){js.get=function(){return this[e][i]},js.set=function(t){this[e][i]=t},Object.defineProperty(t,i,js)}function Pt(t){t._watchers=[];var e=t.$options;e.props&&Nt(t,e.props),e.methods&&Ft(t,e.methods),e.data?Mt(t):P(t._data={},!0),e.computed&&Ht(t,e.computed),e.watch&&zt(t,e.watch)}function Nt(t,e){var i=t.$options.propsData||{},n=t._props={},r=t.$options._propKeys=[],s=!t.$parent;vs.shouldConvert=s;for(var o in e)!function(s){r.push(s);var o=U(s,e,i,t);N(n,s,o),s in t||Ot(t,\"_props\",s)}(o);vs.shouldConvert=!0}function Mt(t){var e=t.$options.data;e=t._data=\"function\"==typeof e?jt(e,t):e||{},l(e)||(e={});for(var i=Object.keys(e),n=t.$options.props,r=i.length;r--;)n&&f(n,i[r])||k(i[r])||Ot(t,\"_data\",i[r]);P(e,!0)}function jt(t,e){try{return t.call(e)}catch(t){return S(t,e,\"data()\"),{}}}function Ht(t,e){var i=t._computedWatchers=Object.create(null);for(var n in e){var r=e[n],s=\"function\"==typeof r?r:r.get;i[n]=new Ns(t,s,b,Hs),n in t||Rt(t,n,r)}}function Rt(t,e,i){\"function\"==typeof i?(js.get=Lt(e),js.set=b):(js.get=i.get?!1!==i.cache?Lt(e):i.get:b,js.set=i.set?i.set:b),Object.defineProperty(t,e,js)}function Lt(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),ds.target&&e.depend(),e.value}}function Ft(t,e){t.$options.props;for(var i in e)t[i]=null==e[i]?b:m(e[i],t)}function zt(t,e){for(var i in e){var n=e[i];if(Array.isArray(n))for(var r=0;r<n.length;r++)Wt(t,i,n[r]);else Wt(t,i,n)}}function Wt(t,e,i){var n;l(i)&&(n=i,i=i.handler),\"string\"==typeof i&&(i=t[i]),t.$watch(e,i,n)}function qt(t){var e=t.$options.provide;e&&(t._provided=\"function\"==typeof e?e.call(t):e)}function Bt(t){var e=Ut(t.$options.inject,t);e&&Object.keys(e).forEach(function(i){N(t,i,e[i])})}function Ut(t,e){if(t){for(var i=Array.isArray(t),n=Object.create(null),r=i?t:us?Reflect.ownKeys(t):Object.keys(t),s=0;s<r.length;s++)for(var o=r[s],a=i?o:t[o],l=e;l;){if(l._provided&&a in l._provided){n[o]=l._provided[a];break}l=l.$parent}return n}}function Yt(t,e,i,r,s){var o={},a=t.options.props;if(n(a))for(var l in a)o[l]=U(l,a,e||{});else n(i.attrs)&&Vt(o,i.attrs),n(i.props)&&Vt(o,i.props);var u=Object.create(r),c=function(t,e,i,n){return Qt(u,t,e,i,n,!0)},h=t.options.render.call(null,c,{data:i,props:o,children:s,parent:r,listeners:i.on||{},injections:Ut(t.options.inject,r),slots:function(){return ft(s,r)}});return h instanceof ws&&(h.functionalContext=r,h.functionalOptions=t.options,i.slot&&((h.data||(h.data={})).slot=i.slot)),h}function Vt(t,e){for(var i in e)t[Mr(i)]=e[i]}function Kt(t,e,s,o,l){if(!i(t)){var u=s.$options._base;if(a(t)&&(t=u.extend(t)),\"function\"==typeof t&&(!i(t.cid)||void 0!==(t=lt(t,u,s)))){pe(t),e=e||{},n(e.model)&&Jt(t.options,e);var c=et(e,t,l);if(r(t.options.functional))return Yt(t,c,e,s,o);var h=e.on;e.on=e.nativeOn,r(t.options.abstract)&&(e={}),Gt(e);var d=t.options.name||l;return new ws(\"vue-component-\"+t.cid+(d?\"-\"+d:\"\"),e,void 0,void 0,void 0,s,{Ctor:t,propsData:c,listeners:h,tag:l,children:o})}}}function Xt(t,e,i,r){var s=t.componentOptions,o={_isComponent:!0,parent:e,propsData:s.propsData,_componentTag:s.tag,_parentVnode:t,_parentListeners:s.listeners,_renderChildren:s.children,_parentElm:i||null,_refElm:r||null},a=t.data.inlineTemplate;return n(a)&&(o.render=a.render,o.staticRenderFns=a.staticRenderFns),new s.Ctor(o)}function Gt(t){t.hook||(t.hook={});for(var e=0;e<Ls.length;e++){var i=Ls[e],n=t.hook[i],r=Rs[i];t.hook[i]=n?Zt(r,n):r}}function Zt(t,e){return function(i,n,r,s){t(i,n,r,s),e(i,n,r,s)}}function Jt(t,e){var i=t.model&&t.model.prop||\"value\",r=t.model&&t.model.event||\"input\";(e.props||(e.props={}))[i]=e.model.value;var s=e.on||(e.on={});n(s[r])?s[r]=[e.model.callback].concat(s[r]):s[r]=e.model.callback}function Qt(t,e,i,n,s,a){return(Array.isArray(i)||o(i))&&(s=n,n=i,i=void 0),r(a)&&(s=zs),te(t,e,i,n,s)}function te(t,e,i,r,s){if(n(i)&&n(i.__ob__))return ks();if(!e)return ks();Array.isArray(r)&&\"function\"==typeof r[0]&&(i=i||{},i.scopedSlots={default:r[0]},r.length=0),s===zs?r=rt(r):s===Fs&&(r=nt(r));var o,a;if(\"string\"==typeof e){var l;a=Br.getTagNamespace(e),o=Br.isReservedTag(e)?new ws(Br.parsePlatformTagName(e),i,r,void 0,void 0,t):n(l=B(t.$options,\"components\",e))?Kt(l,i,t,r,e):new ws(e,i,r,void 0,void 0,t)}else o=Kt(e,i,t,r);return n(o)?(a&&ee(o,a),o):ks()}function ee(t,e){if(t.ns=e,\"foreignObject\"!==t.tag&&n(t.children))for(var r=0,s=t.children.length;r<s;r++){var o=t.children[r];n(o.tag)&&i(o.ns)&&ee(o,e)}}function ie(t,e){var i,r,s,o,l;if(Array.isArray(t)||\"string\"==typeof t)for(i=new Array(t.length),r=0,s=t.length;r<s;r++)i[r]=e(t[r],r);else if(\"number\"==typeof t)for(i=new Array(t),r=0;r<t;r++)i[r]=e(r+1,r);else if(a(t))for(o=Object.keys(t),i=new Array(o.length),r=0,s=o.length;r<s;r++)l=o[r],i[r]=e(t[l],l,r);return n(i)&&(i._isVList=!0),i}function ne(t,e,i,n){var r=this.$scopedSlots[t];if(r)return i=i||{},n&&_(i,n),r(i)||e;var s=this.$slots[t];return s||e}function re(t){return B(this.$options,\"filters\",t,!0)||Fr}function se(t,e,i){var n=Br.keyCodes[e]||i;return Array.isArray(n)?-1===n.indexOf(t):n!==t}function oe(t,e,i,n){if(i)if(a(i)){Array.isArray(i)&&(i=y(i));var r;for(var s in i){if(\"class\"===s||\"style\"===s)r=t;else{var o=t.attrs&&t.attrs.type;r=n||Br.mustUseProp(e,o,s)?t.domProps||(t.domProps={}):t.attrs||(t.attrs={})}s in r||(r[s]=i[s])}}else;return t}function ae(t,e){var i=this._staticTrees[t];return i&&!e?Array.isArray(i)?Z(i):G(i):(i=this._staticTrees[t]=this.$options.staticRenderFns[t].call(this._renderProxy),ue(i,\"__static__\"+t,!1),i)}function le(t,e,i){return ue(t,\"__once__\"+e+(i?\"_\"+i:\"\"),!0),t}function ue(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)t[n]&&\"string\"!=typeof t[n]&&ce(t[n],e+\"_\"+n,i);else ce(t,e,i)}function ce(t,e,i){t.isStatic=!0,t.key=e,t.isOnce=i}function he(t){t._vnode=null,t._staticTrees=null;var e=t.$vnode=t.$options._parentVnode,i=e&&e.context;t.$slots=ft(t.$options._renderChildren,i),t.$scopedSlots=Ur,t._c=function(e,i,n,r){return Qt(t,e,i,n,r,!1)},t.$createElement=function(e,i,n,r){return Qt(t,e,i,n,r,!0)}}function de(t,e){var i=t.$options=Object.create(t.constructor.options);i.parent=e.parent,i.propsData=e.propsData,i._parentVnode=e._parentVnode,i._parentListeners=e._parentListeners,i._renderChildren=e._renderChildren,i._componentTag=e._componentTag,i._parentElm=e._parentElm,i._refElm=e._refElm,e.render&&(i.render=e.render,i.staticRenderFns=e.staticRenderFns)}function pe(t){var e=t.options;if(t.super){var i=pe(t.super);if(i!==t.superOptions){t.superOptions=i;var n=fe(t);n&&_(t.extendOptions,n),e=t.options=q(i,t.extendOptions),e.name&&(e.components[e.name]=t)}}return e}function fe(t){var e,i=t.options,n=t.extendOptions,r=t.sealedOptions;for(var s in i)i[s]!==r[s]&&(e||(e={}),e[s]=ge(i[s],n[s],r[s]));return e}function ge(t,e,i){if(Array.isArray(t)){var n=[];i=Array.isArray(i)?i:[i],e=Array.isArray(e)?e:[e];for(var r=0;r<t.length;r++)(e.indexOf(t[r])>=0||i.indexOf(t[r])<0)&&n.push(t[r]);return n}return t}function me(t){this._init(t)}function ve(t){t.use=function(t){if(t.installed)return this;var e=v(arguments,1);return e.unshift(this),\"function\"==typeof t.install?t.install.apply(t,e):\"function\"==typeof t&&t.apply(null,e),t.installed=!0,this}}function _e(t){t.mixin=function(t){return this.options=q(this.options,t),this}}function ye(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var i=this,n=i.cid,r=t._Ctor||(t._Ctor={});if(r[n])return r[n];var s=t.name||i.options.name,o=function(t){this._init(t)};return o.prototype=Object.create(i.prototype),o.prototype.constructor=o,o.cid=e++,o.options=q(i.options,t),o.super=i,o.options.props&&be(o),o.options.computed&&we(o),o.extend=i.extend,o.mixin=i.mixin,o.use=i.use,Wr.forEach(function(t){o[t]=i[t]}),s&&(o.options.components[s]=o),o.superOptions=i.options,o.extendOptions=t,o.sealedOptions=_({},o.options),r[n]=o,o}}function be(t){var e=t.options.props;for(var i in e)Ot(t.prototype,\"_props\",i)}function we(t){var e=t.options.computed;for(var i in e)Rt(t.prototype,i,e[i])}function xe(t){Wr.forEach(function(e){t[e]=function(t,i){return i?(\"component\"===e&&l(i)&&(i.name=i.name||t,i=this.options._base.extend(i)),\"directive\"===e&&\"function\"==typeof i&&(i={bind:i,update:i}),this.options[e+\"s\"][t]=i,i):this.options[e+\"s\"][t]}})}function Ce(t){return t&&(t.Ctor.options.name||t.tag)}function ke(t,e){return\"string\"==typeof t?t.split(\",\").indexOf(e)>-1:!!u(t)&&t.test(e)}function Te(t,e,i){for(var n in t){var r=t[n];if(r){var s=Ce(r.componentOptions);s&&!i(s)&&(r!==e&&De(r),t[n]=null)}}}function De(t){t&&t.componentInstance.$destroy()}function Se(t){for(var e=t.data,i=t,r=t;n(r.componentInstance);)r=r.componentInstance._vnode,r.data&&(e=Ae(r.data,e));for(;n(i=i.parent);)i.data&&(e=Ae(e,i.data));return Ee(e)}function Ae(t,e){return{staticClass:Ie(t.staticClass,e.staticClass),class:n(t.class)?[t.class,e.class]:e.class}}function Ee(t){var e=t.class,i=t.staticClass;return n(i)||n(e)?Ie(i,$e(e)):\"\"}function Ie(t,e){return t?e?t+\" \"+e:t:e||\"\"}function $e(t){if(i(t))return\"\";if(\"string\"==typeof t)return t;var e=\"\";if(Array.isArray(t)){for(var r,s=0,o=t.length;s<o;s++)n(t[s])&&n(r=$e(t[s]))&&\"\"!==r&&(e+=r+\" \");return e.slice(0,-1)}if(a(t)){for(var l in t)t[l]&&(e+=l+\" \");return e.slice(0,-1)}return e}function Oe(t){return po(t)?\"svg\":\"math\"===t?\"math\":void 0}function Pe(t){if(!Xr)return!0;if(go(t))return!1;if(t=t.toLowerCase(),null!=mo[t])return mo[t];var e=document.createElement(t);return t.indexOf(\"-\")>-1?mo[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:mo[t]=/HTMLUnknownElement/.test(e.toString())}function Ne(t){if(\"string\"==typeof t){var e=document.querySelector(t);return e||document.createElement(\"div\")}return t}function Me(t,e){var i=document.createElement(t);return\"select\"!==t?i:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&i.setAttribute(\"multiple\",\"multiple\"),i)}function je(t,e){return document.createElementNS(co[t],e)}function He(t){return document.createTextNode(t)}function Re(t){return document.createComment(t)}function Le(t,e,i){t.insertBefore(e,i)}function Fe(t,e){t.removeChild(e)}function ze(t,e){t.appendChild(e)}function We(t){return t.parentNode}function qe(t){return t.nextSibling}function Be(t){return t.tagName}function Ue(t,e){t.textContent=e}function Ye(t,e,i){t.setAttribute(e,i)}function Ve(t,e){var i=t.data.ref;if(i){var n=t.context,r=t.componentInstance||t.elm,s=n.$refs;e?Array.isArray(s[i])?p(s[i],r):s[i]===r&&(s[i]=void 0):t.data.refInFor?Array.isArray(s[i])&&s[i].indexOf(r)<0?s[i].push(r):s[i]=[r]:s[i]=r}}function Ke(t,e){return t.key===e.key&&t.tag===e.tag&&t.isComment===e.isComment&&n(t.data)===n(e.data)&&Xe(t,e)}function Xe(t,e){if(\"input\"!==t.tag)return!0;var i;return(n(i=t.data)&&n(i=i.attrs)&&i.type)===(n(i=e.data)&&n(i=i.attrs)&&i.type)}function Ge(t,e,i){var r,s,o={};for(r=e;r<=i;++r)s=t[r].key,n(s)&&(o[s]=r);return o}function Ze(t,e){(t.data.directives||e.data.directives)&&Je(t,e)}function Je(t,e){var i,n,r,s=t===yo,o=e===yo,a=Qe(t.data.directives,t.context),l=Qe(e.data.directives,e.context),u=[],c=[];for(i in l)n=a[i],r=l[i],n?(r.oldValue=n.value,ei(r,\"update\",e,t),r.def&&r.def.componentUpdated&&c.push(r)):(ei(r,\"bind\",e,t),r.def&&r.def.inserted&&u.push(r));if(u.length){var h=function(){for(var i=0;i<u.length;i++)ei(u[i],\"inserted\",e,t)};s?tt(e.data.hook||(e.data.hook={}),\"insert\",h):h()}if(c.length&&tt(e.data.hook||(e.data.hook={}),\"postpatch\",function(){for(var i=0;i<c.length;i++)ei(c[i],\"componentUpdated\",e,t)}),!s)for(i in a)l[i]||ei(a[i],\"unbind\",t,t,o)}function Qe(t,e){var i=Object.create(null);if(!t)return i;var n,r;for(n=0;n<t.length;n++)r=t[n],r.modifiers||(r.modifiers=xo),i[ti(r)]=r,r.def=B(e.$options,\"directives\",r.name,!0);return i}function ti(t){return t.rawName||t.name+\".\"+Object.keys(t.modifiers||{}).join(\".\")}function ei(t,e,i,n,r){var s=t.def&&t.def[e];if(s)try{s(i.elm,t,i,n,r)}catch(n){S(n,i.context,\"directive \"+t.name+\" \"+e+\" hook\")}}function ii(t,e){if(!i(t.data.attrs)||!i(e.data.attrs)){var r,s,o=e.elm,a=t.data.attrs||{},l=e.data.attrs||{};n(l.__ob__)&&(l=e.data.attrs=_({},l));for(r in l)s=l[r],a[r]!==s&&ni(o,r,s);Jr&&l.value!==a.value&&ni(o,\"value\",l.value);for(r in a)i(l[r])&&(ao(r)?o.removeAttributeNS(oo,lo(r)):ro(r)||o.removeAttribute(r))}}function ni(t,e,i){so(e)?uo(i)?t.removeAttribute(e):t.setAttribute(e,e):ro(e)?t.setAttribute(e,uo(i)||\"false\"===i?\"false\":\"true\"):ao(e)?uo(i)?t.removeAttributeNS(oo,lo(e)):t.setAttributeNS(oo,e,i):uo(i)?t.removeAttribute(e):t.setAttribute(e,i)}function ri(t,e){var r=e.elm,s=e.data,o=t.data;if(!(i(s.staticClass)&&i(s.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var a=Se(e),l=r._transitionClasses;n(l)&&(a=Ie(a,$e(l))),a!==r._prevClass&&(r.setAttribute(\"class\",a),r._prevClass=a)}}function si(t){function e(){(o||(o=[])).push(t.slice(f,r).trim()),f=r+1}var i,n,r,s,o,a=!1,l=!1,u=!1,c=!1,h=0,d=0,p=0,f=0;for(r=0;r<t.length;r++)if(n=i,i=t.charCodeAt(r),a)39===i&&92!==n&&(a=!1);else if(l)34===i&&92!==n&&(l=!1);else if(u)96===i&&92!==n&&(u=!1);else if(c)47===i&&92!==n&&(c=!1);else if(124!==i||124===t.charCodeAt(r+1)||124===t.charCodeAt(r-1)||h||d||p){switch(i){case 34:l=!0;break;case 39:a=!0;break;case 96:u=!0;break;case 40:p++;break;case 41:p--;break;case 91:d++;break;case 93:d--;break;case 123:h++;break;case 125:h--}if(47===i){for(var g=r-1,m=void 0;g>=0&&\" \"===(m=t.charAt(g));g--);m&&Do.test(m)||(c=!0)}}else void 0===s?(f=r+1,s=t.slice(0,r).trim()):e();if(void 0===s?s=t.slice(0,r).trim():0!==f&&e(),o)for(r=0;r<o.length;r++)s=oi(s,o[r]);return s}function oi(t,e){var i=e.indexOf(\"(\");return i<0?'_f(\"'+e+'\")('+t+\")\":'_f(\"'+e.slice(0,i)+'\")('+t+\",\"+e.slice(i+1)}function ai(t){}function li(t,e){return t?t.map(function(t){return t[e]}).filter(function(t){return t}):[]}function ui(t,e,i){(t.props||(t.props=[])).push({name:e,value:i})}function ci(t,e,i){(t.attrs||(t.attrs=[])).push({name:e,value:i})}function hi(t,e,i,n,r,s){(t.directives||(t.directives=[])).push({name:e,rawName:i,value:n,arg:r,modifiers:s})}function di(t,e,i,n,r,s){n&&n.capture&&(delete n.capture,e=\"!\"+e),n&&n.once&&(delete n.once,e=\"~\"+e),n&&n.passive&&(delete n.passive,e=\"&\"+e);var o;n&&n.native?(delete n.native,o=t.nativeEvents||(t.nativeEvents={})):o=t.events||(t.events={});var a={value:i,modifiers:n},l=o[e];Array.isArray(l)?r?l.unshift(a):l.push(a):o[e]=l?r?[a,l]:[l,a]:a}function pi(t,e,i){var n=fi(t,\":\"+e)||fi(t,\"v-bind:\"+e);if(null!=n)return si(n);if(!1!==i){var r=fi(t,e);if(null!=r)return JSON.stringify(r)}}function fi(t,e){var i;if(null!=(i=t.attrsMap[e]))for(var n=t.attrsList,r=0,s=n.length;r<s;r++)if(n[r].name===e){n.splice(r,1);break}return i}function gi(t,e,i){var n=i||{},r=n.number,s=n.trim,o=\"$$v\";s&&(o=\"(typeof $$v === 'string'? $$v.trim(): $$v)\"),r&&(o=\"_n(\"+o+\")\");var a=mi(e,o);t.model={value:\"(\"+e+\")\",expression:'\"'+e+'\"',callback:\"function ($$v) {\"+a+\"}\"}}function mi(t,e){var i=vi(t);return null===i.idx?t+\"=\"+e:\"var $$exp = \"+i.exp+\", $$idx = \"+i.idx+\";if (!Array.isArray($$exp)){\"+t+\"=\"+e+\"}else{$$exp.splice($$idx, 1, \"+e+\")}\"}function vi(t){if(Vs=t,Ys=Vs.length,Xs=Gs=Zs=0,t.indexOf(\"[\")<0||t.lastIndexOf(\"]\")<Ys-1)return{exp:t,idx:null};for(;!yi();)Ks=_i(),bi(Ks)?xi(Ks):91===Ks&&wi(Ks);return{exp:t.substring(0,Gs),idx:t.substring(Gs+1,Zs)}}function _i(){return Vs.charCodeAt(++Xs)}function yi(){return Xs>=Ys}function bi(t){return 34===t||39===t}function wi(t){var e=1;for(Gs=Xs;!yi();)if(t=_i(),bi(t))xi(t);else if(91===t&&e++,93===t&&e--,0===e){Zs=Xs;break}}function xi(t){for(var e=t;!yi()&&(t=_i())!==e;);}function Ci(t,e,i){Js=i;var n=e.value,r=e.modifiers,s=t.tag,o=t.attrsMap.type;if(\"select\"===s)Di(t,n,r);else if(\"input\"===s&&\"checkbox\"===o)ki(t,n,r);else if(\"input\"===s&&\"radio\"===o)Ti(t,n,r);else if(\"input\"===s||\"textarea\"===s)Si(t,n,r);else if(!Br.isReservedTag(s))return gi(t,n,r),!1;return!0}function ki(t,e,i){var n=i&&i.number,r=pi(t,\"value\")||\"null\",s=pi(t,\"true-value\")||\"true\",o=pi(t,\"false-value\")||\"false\";ui(t,\"checked\",\"Array.isArray(\"+e+\")?_i(\"+e+\",\"+r+\")>-1\"+(\"true\"===s?\":(\"+e+\")\":\":_q(\"+e+\",\"+s+\")\")),di(t,Ao,\"var $$a=\"+e+\",$$el=$event.target,$$c=$$el.checked?(\"+s+\"):(\"+o+\");if(Array.isArray($$a)){var $$v=\"+(n?\"_n(\"+r+\")\":r)+\",$$i=_i($$a,$$v);if($$c){$$i<0&&(\"+e+\"=$$a.concat($$v))}else{$$i>-1&&(\"+e+\"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{\"+mi(e,\"$$c\")+\"}\",null,!0)}function Ti(t,e,i){var n=i&&i.number,r=pi(t,\"value\")||\"null\";r=n?\"_n(\"+r+\")\":r,ui(t,\"checked\",\"_q(\"+e+\",\"+r+\")\"),di(t,Ao,mi(e,r),null,!0)}function Di(t,e,i){var n=i&&i.number,r='Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return '+(n?\"_n(val)\":\"val\")+\"})\",s=\"var $$selectedVal = \"+r+\";\";s=s+\" \"+mi(e,\"$event.target.multiple ? $$selectedVal : $$selectedVal[0]\"),di(t,\"change\",s,null,!0)}function Si(t,e,i){var n=t.attrsMap.type,r=i||{},s=r.lazy,o=r.number,a=r.trim,l=!s&&\"range\"!==n,u=s?\"change\":\"range\"===n?So:\"input\",c=\"$event.target.value\";a&&(c=\"$event.target.value.trim()\"),o&&(c=\"_n(\"+c+\")\");var h=mi(e,c);l&&(h=\"if($event.target.composing)return;\"+h),ui(t,\"value\",\"(\"+e+\")\"),di(t,u,h,null,!0),(a||o||\"number\"===n)&&di(t,\"blur\",\"$forceUpdate()\")}function Ai(t){var e;n(t[So])&&(e=Zr?\"change\":\"input\",t[e]=[].concat(t[So],t[e]||[]),delete t[So]),n(t[Ao])&&(e=is?\"click\":\"change\",t[e]=[].concat(t[Ao],t[e]||[]),delete t[Ao])}function Ei(t,e,i,n,r){if(i){var s=e,o=Qs;e=function(i){null!==(1===arguments.length?s(i):s.apply(null,arguments))&&Ii(t,e,n,o)}}Qs.addEventListener(t,e,ns?{capture:n,passive:r}:n)}function Ii(t,e,i,n){(n||Qs).removeEventListener(t,e,i)}function $i(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Qs=e.elm,Ai(n),Q(n,r,Ei,Ii,e.context)}}function Oi(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var r,s,o=e.elm,a=t.data.domProps||{},l=e.data.domProps||{};n(l.__ob__)&&(l=e.data.domProps=_({},l));for(r in a)i(l[r])&&(o[r]=\"\");for(r in l)if(s=l[r],\"textContent\"!==r&&\"innerHTML\"!==r||(e.children&&(e.children.length=0),s!==a[r]))if(\"value\"===r){o._value=s;var u=i(s)?\"\":String(s);Pi(o,e,u)&&(o.value=u)}else o[r]=s}}function Pi(t,e,i){return!t.composing&&(\"option\"===e.tag||Ni(t,i)||Mi(t,i))}function Ni(t,e){return document.activeElement!==t&&t.value!==e}function Mi(t,e){var i=t.value,r=t._vModifiers;return n(r)&&r.number||\"number\"===t.type?h(i)!==h(e):n(r)&&r.trim?i.trim()!==e.trim():i!==e}function ji(t){var e=Hi(t.style);return t.staticStyle?_(t.staticStyle,e):e}function Hi(t){return Array.isArray(t)?y(t):\"string\"==typeof t?$o(t):t}function Ri(t,e){var i,n={};if(e)for(var r=t;r.componentInstance;)r=r.componentInstance._vnode,r.data&&(i=ji(r.data))&&_(n,i);(i=ji(t.data))&&_(n,i);for(var s=t;s=s.parent;)s.data&&(i=ji(s.data))&&_(n,i);return n}function Li(t,e){var r=e.data,s=t.data;if(!(i(r.staticStyle)&&i(r.style)&&i(s.staticStyle)&&i(s.style))){var o,a,l=e.elm,u=s.staticStyle,c=s.normalizedStyle||s.style||{},h=u||c,d=Hi(e.data.style)||{};e.data.normalizedStyle=n(d.__ob__)?_({},d):d;var p=Ri(e,!0);for(a in h)i(p[a])&&No(l,a,\"\");for(a in p)(o=p[a])!==h[a]&&No(l,a,null==o?\"\":o)}}function Fi(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(\" \")>-1?e.split(/\\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var i=\" \"+(t.getAttribute(\"class\")||\"\")+\" \";i.indexOf(\" \"+e+\" \")<0&&t.setAttribute(\"class\",(i+e).trim())}}function zi(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(\" \")>-1?e.split(/\\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e);else{for(var i=\" \"+(t.getAttribute(\"class\")||\"\")+\" \",n=\" \"+e+\" \";i.indexOf(n)>=0;)i=i.replace(n,\" \");t.setAttribute(\"class\",i.trim())}}function Wi(t){if(t){if(\"object\"==typeof t){var e={};return!1!==t.css&&_(e,Ro(t.name||\"v\")),_(e,t),e}return\"string\"==typeof t?Ro(t):void 0}}function qi(t){Yo(function(){Yo(t)})}function Bi(t,e){(t._transitionClasses||(t._transitionClasses=[])).push(e),Fi(t,e)}function Ui(t,e){t._transitionClasses&&p(t._transitionClasses,e),zi(t,e)}function Yi(t,e,i){var n=Vi(t,e),r=n.type,s=n.timeout,o=n.propCount;if(!r)return i();var a=r===Fo?qo:Uo,l=0,u=function(){t.removeEventListener(a,c),i()},c=function(e){e.target===t&&++l>=o&&u()};setTimeout(function(){l<o&&u()},s+1),t.addEventListener(a,c)}function Vi(t,e){var i,n=window.getComputedStyle(t),r=n[Wo+\"Delay\"].split(\", \"),s=n[Wo+\"Duration\"].split(\", \"),o=Ki(r,s),a=n[Bo+\"Delay\"].split(\", \"),l=n[Bo+\"Duration\"].split(\", \"),u=Ki(a,l),c=0,h=0;return e===Fo?o>0&&(i=Fo,c=o,h=s.length):e===zo?u>0&&(i=zo,c=u,h=l.length):(c=Math.max(o,u),i=c>0?o>u?Fo:zo:null,h=i?i===Fo?s.length:l.length:0),{type:i,timeout:c,propCount:h,hasTransform:i===Fo&&Vo.test(n[Wo+\"Property\"])}}function Ki(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.apply(null,e.map(function(e,i){return Xi(e)+Xi(t[i])}))}function Xi(t){return 1e3*Number(t.slice(0,-1))}function Gi(t,e){var r=t.elm;n(r._leaveCb)&&(r._leaveCb.cancelled=!0,r._leaveCb());var s=Wi(t.data.transition);if(!i(s)&&!n(r._enterCb)&&1===r.nodeType){for(var o=s.css,l=s.type,u=s.enterClass,c=s.enterToClass,d=s.enterActiveClass,p=s.appearClass,f=s.appearToClass,g=s.appearActiveClass,m=s.beforeEnter,v=s.enter,_=s.afterEnter,y=s.enterCancelled,b=s.beforeAppear,w=s.appear,x=s.afterAppear,k=s.appearCancelled,T=s.duration,D=Ds,S=Ds.$vnode;S&&S.parent;)S=S.parent,D=S.context;var A=!D._isMounted||!t.isRootInsert;if(!A||w||\"\"===w){var E=A&&p?p:u,I=A&&g?g:d,$=A&&f?f:c,O=A?b||m:m,P=A&&\"function\"==typeof w?w:v,N=A?x||_:_,M=A?k||y:y,j=h(a(T)?T.enter:T),H=!1!==o&&!Jr,R=Qi(P),L=r._enterCb=C(function(){H&&(Ui(r,$),Ui(r,I)),L.cancelled?(H&&Ui(r,E),M&&M(r)):N&&N(r),r._enterCb=null});t.data.show||tt(t.data.hook||(t.data.hook={}),\"insert\",function(){var e=r.parentNode,i=e&&e._pending&&e._pending[t.key];i&&i.tag===t.tag&&i.elm._leaveCb&&i.elm._leaveCb(),P&&P(r,L)}),O&&O(r),H&&(Bi(r,E),Bi(r,I),qi(function(){Bi(r,$),Ui(r,E),L.cancelled||R||(Ji(j)?setTimeout(L,j):Yi(r,l,L))})),t.data.show&&(e&&e(),P&&P(r,L)),H||R||L()}}}function Zi(t,e){function r(){k.cancelled||(t.data.show||((s.parentNode._pending||(s.parentNode._pending={}))[t.key]=t),f&&f(s),b&&(Bi(s,c),Bi(s,p),qi(function(){Bi(s,d),Ui(s,c),k.cancelled||w||(Ji(x)?setTimeout(k,x):Yi(s,u,k))})),g&&g(s,k),b||w||k())}var s=t.elm;n(s._enterCb)&&(s._enterCb.cancelled=!0,s._enterCb());var o=Wi(t.data.transition);if(i(o))return e();if(!n(s._leaveCb)&&1===s.nodeType){var l=o.css,u=o.type,c=o.leaveClass,d=o.leaveToClass,p=o.leaveActiveClass,f=o.beforeLeave,g=o.leave,m=o.afterLeave,v=o.leaveCancelled,_=o.delayLeave,y=o.duration,b=!1!==l&&!Jr,w=Qi(g),x=h(a(y)?y.leave:y),k=s._leaveCb=C(function(){s.parentNode&&s.parentNode._pending&&(s.parentNode._pending[t.key]=null),b&&(Ui(s,d),Ui(s,p)),k.cancelled?(b&&Ui(s,c),v&&v(s)):(e(),m&&m(s)),s._leaveCb=null});_?_(r):r()}}function Ji(t){return\"number\"==typeof t&&!isNaN(t)}function Qi(t){if(i(t))return!1;var e=t.fns;return n(e)?Qi(Array.isArray(e)?e[0]:e):(t._length||t.length)>1}function tn(t,e){!0!==e.data.show&&Gi(e)}function en(t,e,i){var n=e.value,r=t.multiple;if(!r||Array.isArray(n)){for(var s,o,a=0,l=t.options.length;a<l;a++)if(o=t.options[a],r)s=x(n,rn(o))>-1,o.selected!==s&&(o.selected=s);else if(w(rn(o),n))return void(t.selectedIndex!==a&&(t.selectedIndex=a));r||(t.selectedIndex=-1)}}function nn(t,e){for(var i=0,n=e.length;i<n;i++)if(w(rn(e[i]),t))return!1;return!0}function rn(t){return\"_value\"in t?t._value:t.value}function sn(t){t.target.composing=!0}function on(t){t.target.composing&&(t.target.composing=!1,an(t.target,\"input\"))}function an(t,e){var i=document.createEvent(\"HTMLEvents\");i.initEvent(e,!0,!0),t.dispatchEvent(i)}function ln(t){return!t.componentInstance||t.data&&t.data.transition?t:ln(t.componentInstance._vnode)}function un(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?un(ut(e.children)):t}function cn(t){var e={},i=t.$options;for(var n in i.propsData)e[n]=t[n];var r=i._parentListeners;for(var s in r)e[Mr(s)]=r[s];return e}function hn(t,e){if(/\\d-keep-alive$/.test(e.tag))return t(\"keep-alive\",{props:e.componentOptions.propsData})}function dn(t){for(;t=t.parent;)if(t.data.transition)return!0}function pn(t,e){return e.key===t.key&&e.tag===t.tag}function fn(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function gn(t){t.data.newPos=t.elm.getBoundingClientRect()}function mn(t){var e=t.data.pos,i=t.data.newPos,n=e.left-i.left,r=e.top-i.top;if(n||r){t.data.moved=!0;var s=t.elm.style;s.transform=s.WebkitTransform=\"translate(\"+n+\"px,\"+r+\"px)\",s.transitionDuration=\"0s\"}}function vn(t){return oa=oa||document.createElement(\"div\"),oa.innerHTML=t,oa.textContent}function _n(t,e){var i=e?Ya:Ua;return t.replace(i,function(t){return Ba[t]})}function yn(t,e){function i(e){c+=e,t=t.substring(e)}function n(t,i,n){var r,a;if(null==i&&(i=c),null==n&&(n=c),t&&(a=t.toLowerCase()),t)for(r=o.length-1;r>=0&&o[r].lowerCasedTag!==a;r--);else r=0;if(r>=0){for(var l=o.length-1;l>=r;l--)e.end&&e.end(o[l].tag,i,n);o.length=r,s=r&&o[r-1].tag}else\"br\"===a?e.start&&e.start(t,[],!0,i,n):\"p\"===a&&(e.start&&e.start(t,[],!1,i,n),e.end&&e.end(t,i,n))}for(var r,s,o=[],a=e.expectHTML,l=e.isUnaryTag||Lr,u=e.canBeLeftOpenTag||Lr,c=0;t;){if(r=t,s&&Wa(s)){var h=s.toLowerCase(),d=qa[h]||(qa[h]=new RegExp(\"([\\\\s\\\\S]*?)(</\"+h+\"[^>]*>)\",\"i\")),p=0,f=t.replace(d,function(t,i,n){return p=n.length,Wa(h)||\"noscript\"===h||(i=i.replace(/<!--([\\s\\S]*?)-->/g,\"$1\").replace(/<!\\[CDATA\\[([\\s\\S]*?)]]>/g,\"$1\")),e.chars&&e.chars(i),\"\"});c+=t.length-f.length,t=f,n(h,c-p,c)}else{var g=t.indexOf(\"<\");if(0===g){if(wa.test(t)){var m=t.indexOf(\"--\\x3e\");if(m>=0){i(m+3);continue}}if(xa.test(t)){var v=t.indexOf(\"]>\");if(v>=0){i(v+2);continue}}var _=t.match(ba);if(_){i(_[0].length);continue}var y=t.match(ya);if(y){var b=c;i(y[0].length),n(y[1],b,c);continue}var w=function(){var e=t.match(va);if(e){var n={tagName:e[1],attrs:[],start:c};i(e[0].length);for(var r,s;!(r=t.match(_a))&&(s=t.match(fa));)i(s[0].length),n.attrs.push(s);if(r)return n.unarySlash=r[1],i(r[0].length),n.end=c,n}}();if(w){!function(t){var i=t.tagName,r=t.unarySlash;a&&(\"p\"===s&&ca(i)&&n(s),u(i)&&s===i&&n(i));for(var c=l(i)||\"html\"===i&&\"head\"===s||!!r,h=t.attrs.length,d=new Array(h),p=0;p<h;p++){var f=t.attrs[p];Ca&&-1===f[0].indexOf('\"\"')&&(\"\"===f[3]&&delete f[3],\"\"===f[4]&&delete f[4],\"\"===f[5]&&delete f[5]);var g=f[3]||f[4]||f[5]||\"\";d[p]={name:f[1],value:_n(g,e.shouldDecodeNewlines)}}c||(o.push({tag:i,lowerCasedTag:i.toLowerCase(),attrs:d}),s=i),e.start&&e.start(i,d,c,t.start,t.end)}(w);continue}}var x=void 0,C=void 0,k=void 0;if(g>=0){for(C=t.slice(g);!(ya.test(C)||va.test(C)||wa.test(C)||xa.test(C)||(k=C.indexOf(\"<\",1))<0);)g+=k,C=t.slice(g);x=t.substring(0,g),i(g)}g<0&&(x=t,t=\"\"),e.chars&&x&&e.chars(x)}if(t===r){e.chars&&e.chars(t);break}}n()}function bn(t,e){var i=e?Xa(e):Va;if(i.test(t)){for(var n,r,s=[],o=i.lastIndex=0;n=i.exec(t);){r=n.index,r>o&&s.push(JSON.stringify(t.slice(o,r)));var a=si(n[1].trim());s.push(\"_s(\"+a+\")\"),o=r+n[0].length}return o<t.length&&s.push(JSON.stringify(t.slice(o))),s.join(\"+\")}}function wn(t,e){function i(t){t.pre&&(a=!1),Ea(t.tag)&&(l=!1)}ka=e.warn||ai,$a=e.getTagNamespace||Lr,Ia=e.mustUseProp||Lr,Ea=e.isPreTag||Lr,Sa=li(e.modules,\"preTransformNode\"),Da=li(e.modules,\"transformNode\"),Aa=li(e.modules,\"postTransformNode\"),Ta=e.delimiters;var n,r,s=[],o=!1!==e.preserveWhitespace,a=!1,l=!1;return yn(t,{warn:ka,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,start:function(t,o,u){var c=r&&r.ns||$a(t);Zr&&\"svg\"===c&&(o=Fn(o));var h={type:1,tag:t,attrsList:o,attrsMap:Hn(o),parent:r,children:[]};c&&(h.ns=c),Ln(h)&&!as()&&(h.forbidden=!0);for(var d=0;d<Sa.length;d++)Sa[d](h,e);if(a||(xn(h),h.pre&&(a=!0)),Ea(h.tag)&&(l=!0),a)Cn(h);else{Dn(h),Sn(h),$n(h),kn(h),h.plain=!h.key&&!o.length,Tn(h),On(h),Pn(h);for(var p=0;p<Da.length;p++)Da[p](h,e);Nn(h)}if(n?s.length||n.if&&(h.elseif||h.else)&&In(n,{exp:h.elseif,block:h}):n=h,r&&!h.forbidden)if(h.elseif||h.else)An(h,r);else if(h.slotScope){r.plain=!1;var f=h.slotTarget||'\"default\"';(r.scopedSlots||(r.scopedSlots={}))[f]=h}else r.children.push(h),h.parent=r;u?i(h):(r=h,s.push(h));for(var g=0;g<Aa.length;g++)Aa[g](h,e)},end:function(){var t=s[s.length-1],e=t.children[t.children.length-1];e&&3===e.type&&\" \"===e.text&&!l&&t.children.pop(),s.length-=1,r=s[s.length-1],i(t)},chars:function(t){if(r&&(!Zr||\"textarea\"!==r.tag||r.attrsMap.placeholder!==t)){var e=r.children;if(t=l||t.trim()?Rn(r)?t:nl(t):o&&e.length?\" \":\"\"){var i;!a&&\" \"!==t&&(i=bn(t,Ta))?e.push({type:2,expression:i,text:t}):\" \"===t&&e.length&&\" \"===e[e.length-1].text||e.push({type:3,text:t})}}}}),n}function xn(t){null!=fi(t,\"v-pre\")&&(t.pre=!0)}function Cn(t){var e=t.attrsList.length;if(e)for(var i=t.attrs=new Array(e),n=0;n<e;n++)i[n]={name:t.attrsList[n].name,value:JSON.stringify(t.attrsList[n].value)};else t.pre||(t.plain=!0)}function kn(t){var e=pi(t,\"key\");e&&(t.key=e)}function Tn(t){var e=pi(t,\"ref\");e&&(t.ref=e,t.refInFor=Mn(t))}function Dn(t){var e;if(e=fi(t,\"v-for\")){var i=e.match(Ja);if(!i)return;t.for=i[2].trim();var n=i[1].trim(),r=n.match(Qa);r?(t.alias=r[1].trim(),t.iterator1=r[2].trim(),r[3]&&(t.iterator2=r[3].trim())):t.alias=n}}function Sn(t){var e=fi(t,\"v-if\");if(e)t.if=e,In(t,{exp:e,block:t});else{null!=fi(t,\"v-else\")&&(t.else=!0);var i=fi(t,\"v-else-if\");i&&(t.elseif=i)}}function An(t,e){var i=En(e.children);i&&i.if&&In(i,{exp:t.elseif,block:t})}function En(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}function In(t,e){t.ifConditions||(t.ifConditions=[]),t.ifConditions.push(e)}function $n(t){null!=fi(t,\"v-once\")&&(t.once=!0)}function On(t){if(\"slot\"===t.tag)t.slotName=pi(t,\"name\");else{var e=pi(t,\"slot\");e&&(t.slotTarget='\"\"'===e?'\"default\"':e),\"template\"===t.tag&&(t.slotScope=fi(t,\"scope\"))}}function Pn(t){var e;(e=pi(t,\"is\"))&&(t.component=e),null!=fi(t,\"inline-template\")&&(t.inlineTemplate=!0)}function Nn(t){var e,i,n,r,s,o,a,l=t.attrsList;for(e=0,i=l.length;e<i;e++)if(n=r=l[e].name,s=l[e].value,Za.test(n))if(t.hasBindings=!0,o=jn(n),o&&(n=n.replace(il,\"\")),el.test(n))n=n.replace(el,\"\"),s=si(s),a=!1,o&&(o.prop&&(a=!0,\"innerHtml\"===(n=Mr(n))&&(n=\"innerHTML\")),o.camel&&(n=Mr(n)),o.sync&&di(t,\"update:\"+Mr(n),mi(s,\"$event\"))),a||Ia(t.tag,t.attrsMap.type,n)?ui(t,n,s):ci(t,n,s);else if(Ga.test(n))n=n.replace(Ga,\"\"),di(t,n,s,o,!1,ka);else{n=n.replace(Za,\"\");var u=n.match(tl),c=u&&u[1];c&&(n=n.slice(0,-(c.length+1))),hi(t,n,r,s,c,o)}else{ci(t,n,JSON.stringify(s))}}function Mn(t){for(var e=t;e;){if(void 0!==e.for)return!0;e=e.parent}return!1}function jn(t){var e=t.match(il);if(e){var i={};return e.forEach(function(t){i[t.slice(1)]=!0}),i}}function Hn(t){for(var e={},i=0,n=t.length;i<n;i++)e[t[i].name]=t[i].value;return e}function Rn(t){return\"script\"===t.tag||\"style\"===t.tag}function Ln(t){return\"style\"===t.tag||\"script\"===t.tag&&(!t.attrsMap.type||\"text/javascript\"===t.attrsMap.type)}function Fn(t){for(var e=[],i=0;i<t.length;i++){var n=t[i];rl.test(n.name)||(n.name=n.name.replace(sl,\"\"),e.push(n))}return e}function zn(t,e){t&&(Oa=ol(e.staticKeys||\"\"),Pa=e.isReservedTag||Lr,qn(t),Bn(t,!1))}function Wn(t){return d(\"type,tag,attrsList,attrsMap,plain,parent,children,attrs\"+(t?\",\"+t:\"\"))}function qn(t){if(t.static=Yn(t),1===t.type){if(!Pa(t.tag)&&\"slot\"!==t.tag&&null==t.attrsMap[\"inline-template\"])return;for(var e=0,i=t.children.length;e<i;e++){var n=t.children[e];qn(n),n.static||(t.static=!1)}}}function Bn(t,e){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=e),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var i=0,n=t.children.length;i<n;i++)Bn(t.children[i],e||!!t.for);t.ifConditions&&Un(t.ifConditions,e)}}function Un(t,e){for(var i=1,n=t.length;i<n;i++)Bn(t[i].block,e)}function Yn(t){return 2!==t.type&&(3===t.type||!(!t.pre&&(t.hasBindings||t.if||t.for||Or(t.tag)||!Pa(t.tag)||Vn(t)||!Object.keys(t).every(Oa))))}function Vn(t){for(;t.parent;){if(t=t.parent,\"template\"!==t.tag)return!1;if(t.for)return!0}return!1}function Kn(t,e,i){var n=e?\"nativeOn:{\":\"on:{\";for(var r in t){n+='\"'+r+'\":'+Xn(r,t[r])+\",\"}return n.slice(0,-1)+\"}\"}function Xn(t,e){if(!e)return\"function(){}\";if(Array.isArray(e))return\"[\"+e.map(function(e){return Xn(t,e)}).join(\",\")+\"]\";var i=ll.test(e.value),n=al.test(e.value);if(e.modifiers){var r=\"\",s=\"\",o=[];for(var a in e.modifiers)hl[a]?(s+=hl[a],ul[a]&&o.push(a)):o.push(a);o.length&&(r+=Gn(o)),s&&(r+=s);return\"function($event){\"+r+(i?e.value+\"($event)\":n?\"(\"+e.value+\")($event)\":e.value)+\"}\"}return i||n?e.value:\"function($event){\"+e.value+\"}\"}function Gn(t){return\"if(!('button' in $event)&&\"+t.map(Zn).join(\"&&\")+\")return null;\"}function Zn(t){var e=parseInt(t,10);if(e)return\"$event.keyCode!==\"+e;var i=ul[t];return\"_k($event.keyCode,\"+JSON.stringify(t)+(i?\",\"+JSON.stringify(i):\"\")+\")\"}function Jn(t,e){t.wrapData=function(i){return\"_b(\"+i+\",'\"+t.tag+\"',\"+e.value+(e.modifiers&&e.modifiers.prop?\",true\":\"\")+\")\"}}function Qn(t,e){var i=La,n=La=[],r=Fa;Fa=0,za=e,Na=e.warn||ai,Ma=li(e.modules,\"transformCode\"),ja=li(e.modules,\"genData\"),Ha=e.directives||{},Ra=e.isReservedTag||Lr;var s=t?tr(t):'_c(\"div\")';return La=i,Fa=r,{render:\"with(this){return \"+s+\"}\",staticRenderFns:n}}function tr(t){if(t.staticRoot&&!t.staticProcessed)return er(t);if(t.once&&!t.onceProcessed)return ir(t);if(t.for&&!t.forProcessed)return sr(t);if(t.if&&!t.ifProcessed)return nr(t);if(\"template\"!==t.tag||t.slotTarget){if(\"slot\"===t.tag)return _r(t);var e;if(t.component)e=yr(t.component,t);else{var i=t.plain?void 0:or(t),n=t.inlineTemplate?null:dr(t,!0);e=\"_c('\"+t.tag+\"'\"+(i?\",\"+i:\"\")+(n?\",\"+n:\"\")+\")\"}for(var r=0;r<Ma.length;r++)e=Ma[r](t,e);return e}return dr(t)||\"void 0\"}function er(t){return t.staticProcessed=!0,La.push(\"with(this){return \"+tr(t)+\"}\"),\"_m(\"+(La.length-1)+(t.staticInFor?\",true\":\"\")+\")\"}function ir(t){if(t.onceProcessed=!0,t.if&&!t.ifProcessed)return nr(t);if(t.staticInFor){for(var e=\"\",i=t.parent;i;){if(i.for){e=i.key;break}i=i.parent}return e?\"_o(\"+tr(t)+\",\"+Fa+++(e?\",\"+e:\"\")+\")\":tr(t)}return er(t)}function nr(t){return t.ifProcessed=!0,rr(t.ifConditions.slice())}function rr(t){function e(t){return t.once?ir(t):tr(t)}if(!t.length)return\"_e()\";var i=t.shift();return i.exp?\"(\"+i.exp+\")?\"+e(i.block)+\":\"+rr(t):\"\"+e(i.block)}function sr(t){var e=t.for,i=t.alias,n=t.iterator1?\",\"+t.iterator1:\"\",r=t.iterator2?\",\"+t.iterator2:\"\";return t.forProcessed=!0,\"_l((\"+e+\"),function(\"+i+n+r+\"){return \"+tr(t)+\"})\"}function or(t){var e=\"{\",i=ar(t);i&&(e+=i+\",\"),t.key&&(e+=\"key:\"+t.key+\",\"),t.ref&&(e+=\"ref:\"+t.ref+\",\"),t.refInFor&&(e+=\"refInFor:true,\"),t.pre&&(e+=\"pre:true,\"),t.component&&(e+='tag:\"'+t.tag+'\",');for(var n=0;n<ja.length;n++)e+=ja[n](t);if(t.attrs&&(e+=\"attrs:{\"+br(t.attrs)+\"},\"),t.props&&(e+=\"domProps:{\"+br(t.props)+\"},\"),t.events&&(e+=Kn(t.events,!1,Na)+\",\"),t.nativeEvents&&(e+=Kn(t.nativeEvents,!0,Na)+\",\"),t.slotTarget&&(e+=\"slot:\"+t.slotTarget+\",\"),t.scopedSlots&&(e+=ur(t.scopedSlots)+\",\"),t.model&&(e+=\"model:{value:\"+t.model.value+\",callback:\"+t.model.callback+\",expression:\"+t.model.expression+\"},\"),t.inlineTemplate){var r=lr(t);r&&(e+=r+\",\")}return e=e.replace(/,$/,\"\")+\"}\",t.wrapData&&(e=t.wrapData(e)),e}function ar(t){var e=t.directives;if(e){var i,n,r,s,o=\"directives:[\",a=!1;for(i=0,n=e.length;i<n;i++){r=e[i],s=!0;var l=Ha[r.name]||dl[r.name];l&&(s=!!l(t,r,Na)),s&&(a=!0,o+='{name:\"'+r.name+'\",rawName:\"'+r.rawName+'\"'+(r.value?\",value:(\"+r.value+\"),expression:\"+JSON.stringify(r.value):\"\")+(r.arg?',arg:\"'+r.arg+'\"':\"\")+(r.modifiers?\",modifiers:\"+JSON.stringify(r.modifiers):\"\")+\"},\")}return a?o.slice(0,-1)+\"]\":void 0}}function lr(t){var e=t.children[0];if(1===e.type){var i=Qn(e,za);return\"inlineTemplate:{render:function(){\"+i.render+\"},staticRenderFns:[\"+i.staticRenderFns.map(function(t){return\"function(){\"+t+\"}\"}).join(\",\")+\"]}\"}}function ur(t){return\"scopedSlots:_u([\"+Object.keys(t).map(function(e){return cr(e,t[e])}).join(\",\")+\"])\"}function cr(t,e){return e.for&&!e.forProcessed?hr(t,e):\"{key:\"+t+\",fn:function(\"+String(e.attrsMap.scope)+\"){return \"+(\"template\"===e.tag?dr(e)||\"void 0\":tr(e))+\"}}\"}function hr(t,e){var i=e.for,n=e.alias,r=e.iterator1?\",\"+e.iterator1:\"\",s=e.iterator2?\",\"+e.iterator2:\"\";return e.forProcessed=!0,\"_l((\"+i+\"),function(\"+n+r+s+\"){return \"+cr(t,e)+\"})\"}function dr(t,e){var i=t.children;if(i.length){var n=i[0];if(1===i.length&&n.for&&\"template\"!==n.tag&&\"slot\"!==n.tag)return tr(n);var r=e?pr(i):0;return\"[\"+i.map(mr).join(\",\")+\"]\"+(r?\",\"+r:\"\")}}function pr(t){for(var e=0,i=0;i<t.length;i++){var n=t[i];if(1===n.type){if(fr(n)||n.ifConditions&&n.ifConditions.some(function(t){return fr(t.block)})){e=2;break}(gr(n)||n.ifConditions&&n.ifConditions.some(function(t){return gr(t.block)}))&&(e=1)}}return e}function fr(t){return void 0!==t.for||\"template\"===t.tag||\"slot\"===t.tag}function gr(t){return!Ra(t.tag)}function mr(t){return 1===t.type?tr(t):vr(t)}function vr(t){return\"_v(\"+(2===t.type?t.expression:wr(JSON.stringify(t.text)))+\")\"}function _r(t){var e=t.slotName||'\"default\"',i=dr(t),n=\"_t(\"+e+(i?\",\"+i:\"\"),r=t.attrs&&\"{\"+t.attrs.map(function(t){return Mr(t.name)+\":\"+t.value}).join(\",\")+\"}\",s=t.attrsMap[\"v-bind\"];return!r&&!s||i||(n+=\",null\"),r&&(n+=\",\"+r),s&&(n+=(r?\"\":\",null\")+\",\"+s),n+\")\"}function yr(t,e){var i=e.inlineTemplate?null:dr(e,!0);return\"_c(\"+t+\",\"+or(e)+(i?\",\"+i:\"\")+\")\"}function br(t){for(var e=\"\",i=0;i<t.length;i++){var n=t[i];e+='\"'+n.name+'\":'+wr(n.value)+\",\"}return e.slice(0,-1)}function wr(t){return t.replace(/\\u2028/g,\"\\\\u2028\").replace(/\\u2029/g,\"\\\\u2029\")}function xr(t,e){var i=wn(t.trim(),e);zn(i,e);var n=Qn(i,e);return{ast:i,render:n.render,staticRenderFns:n.staticRenderFns}}function Cr(t,e){try{return new Function(t)}catch(i){return e.push({err:i,code:t}),b}}function kr(t,e){var i=(e.warn,fi(t,\"class\"));i&&(t.staticClass=JSON.stringify(i));var n=pi(t,\"class\",!1);n&&(t.classBinding=n)}function Tr(t){var e=\"\";return t.staticClass&&(e+=\"staticClass:\"+t.staticClass+\",\"),t.classBinding&&(e+=\"class:\"+t.classBinding+\",\"),e}function Dr(t,e){var i=(e.warn,fi(t,\"style\"));if(i){t.staticStyle=JSON.stringify($o(i))}var n=pi(t,\"style\",!1);n&&(t.styleBinding=n)}function Sr(t){var e=\"\";return t.staticStyle&&(e+=\"staticStyle:\"+t.staticStyle+\",\"),t.styleBinding&&(e+=\"style:(\"+t.styleBinding+\"),\"),e}function Ar(t,e){e.value&&ui(t,\"textContent\",\"_s(\"+e.value+\")\")}function Er(t,e){e.value&&ui(t,\"innerHTML\",\"_s(\"+e.value+\")\")}function Ir(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement(\"div\");return e.appendChild(t.cloneNode(!0)),e.innerHTML}var $r=Object.prototype.toString,Or=d(\"slot,component\",!0),Pr=Object.prototype.hasOwnProperty,Nr=/-(\\w)/g,Mr=g(function(t){return t.replace(Nr,function(t,e){return e?e.toUpperCase():\"\"})}),jr=g(function(t){return t.charAt(0).toUpperCase()+t.slice(1)}),Hr=/([^-])([A-Z])/g,Rr=g(function(t){return t.replace(Hr,\"$1-$2\").replace(Hr,\"$1-$2\").toLowerCase()}),Lr=function(){return!1},Fr=function(t){return t},zr=\"data-server-rendered\",Wr=[\"component\",\"directive\",\"filter\"],qr=[\"beforeCreate\",\"created\",\"beforeMount\",\"mounted\",\"beforeUpdate\",\"updated\",\"beforeDestroy\",\"destroyed\",\"activated\",\"deactivated\"],Br={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:Lr,isReservedAttr:Lr,isUnknownElement:Lr,getTagNamespace:b,parsePlatformTagName:Fr,mustUseProp:Lr,_lifecycleHooks:qr},Ur=Object.freeze({}),Yr=/[^\\w.$]/,Vr=b,Kr=\"__proto__\"in{},Xr=\"undefined\"!=typeof window,Gr=Xr&&window.navigator.userAgent.toLowerCase(),Zr=Gr&&/msie|trident/.test(Gr),Jr=Gr&&Gr.indexOf(\"msie 9.0\")>0,Qr=Gr&&Gr.indexOf(\"edge/\")>0,ts=Gr&&Gr.indexOf(\"android\")>0,es=Gr&&/iphone|ipad|ipod|ios/.test(Gr),is=Gr&&/chrome\\/\\d+/.test(Gr)&&!Qr,ns=!1;if(Xr)try{var rs={};Object.defineProperty(rs,\"passive\",{get:function(){ns=!0}}),window.addEventListener(\"test-passive\",null,rs)}catch(t){}var ss,os,as=function(){return void 0===ss&&(ss=!Xr&&void 0!==e&&\"server\"===e.process.env.VUE_ENV),ss},ls=Xr&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,us=\"undefined\"!=typeof Symbol&&A(Symbol)&&\"undefined\"!=typeof Reflect&&A(Reflect.ownKeys),cs=function(){function t(){n=!1;var t=i.slice(0);i.length=0;for(var e=0;e<t.length;e++)t[e]()}var e,i=[],n=!1;if(\"undefined\"!=typeof Promise&&A(Promise)){var r=Promise.resolve(),s=function(t){};e=function(){r.then(t).catch(s),es&&setTimeout(b)}}else if(\"undefined\"==typeof MutationObserver||!A(MutationObserver)&&\"[object MutationObserverConstructor]\"!==MutationObserver.toString())e=function(){setTimeout(t,0)};else{var o=1,a=new MutationObserver(t),l=document.createTextNode(String(o));a.observe(l,{characterData:!0}),e=function(){o=(o+1)%2,l.data=String(o)}}return function(t,r){var s;if(i.push(function(){if(t)try{t.call(r)}catch(t){S(t,r,\"nextTick\")}else s&&s(r)}),n||(n=!0,e()),!t&&\"undefined\"!=typeof Promise)return new Promise(function(t,e){s=t})}}();os=\"undefined\"!=typeof Set&&A(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var hs=0,ds=function(){this.id=hs++,this.subs=[]};ds.prototype.addSub=function(t){this.subs.push(t)},ds.prototype.removeSub=function(t){p(this.subs,t)},ds.prototype.depend=function(){ds.target&&ds.target.addDep(this)},ds.prototype.notify=function(){for(var t=this.subs.slice(),e=0,i=t.length;e<i;e++)t[e].update()},ds.target=null;var ps=[],fs=Array.prototype,gs=Object.create(fs);[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\",\"sort\",\"reverse\"].forEach(function(t){var e=fs[t];T(gs,t,function(){for(var i=arguments,n=arguments.length,r=new Array(n);n--;)r[n]=i[n];var s,o=e.apply(this,r),a=this.__ob__;switch(t){case\"push\":case\"unshift\":s=r;break;case\"splice\":s=r.slice(2)}return s&&a.observeArray(s),a.dep.notify(),o})});var ms=Object.getOwnPropertyNames(gs),vs={shouldConvert:!0,isSettingProps:!1},_s=function(t){if(this.value=t,this.dep=new ds,this.vmCount=0,T(t,\"__ob__\",this),Array.isArray(t)){(Kr?$:O)(t,gs,ms),this.observeArray(t)}else this.walk(t)};_s.prototype.walk=function(t){for(var e=Object.keys(t),i=0;i<e.length;i++)N(t,e[i],t[e[i]])},_s.prototype.observeArray=function(t){for(var e=0,i=t.length;e<i;e++)P(t[e])};var ys=Br.optionMergeStrategies;ys.data=function(t,e,i){return i?t||e?function(){var n=\"function\"==typeof e?e.call(i):e,r=\"function\"==typeof t?t.call(i):void 0;return n?R(n,r):r}:void 0:e?\"function\"!=typeof e?t:t?function(){return R(e.call(this),t.call(this))}:e:t},qr.forEach(function(t){ys[t]=L}),Wr.forEach(function(t){ys[t+\"s\"]=F}),ys.watch=function(t,e){if(!e)return Object.create(t||null);if(!t)return e;var i={};_(i,t);for(var n in e){var r=i[n],s=e[n];r&&!Array.isArray(r)&&(r=[r]),i[n]=r?r.concat(s):[s]}return i},ys.props=ys.methods=ys.computed=function(t,e){if(!e)return Object.create(t||null);if(!t)return e;var i=Object.create(null);return _(i,t),_(i,e),i};var bs=function(t,e){return void 0===e?t:e},ws=function(t,e,i,n,r,s,o){this.tag=t,this.data=e,this.children=i,this.text=n,this.elm=r,this.ns=void 0,this.context=s,this.functionalContext=void 0,this.key=e&&e.key,this.componentOptions=o,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1},xs={child:{}};xs.child.get=function(){return this.componentInstance},Object.defineProperties(ws.prototype,xs);var Cs,ks=function(){var t=new ws;return t.text=\"\",t.isComment=!0,t},Ts=g(function(t){var e=\"&\"===t.charAt(0);t=e?t.slice(1):t;var i=\"~\"===t.charAt(0);t=i?t.slice(1):t;var n=\"!\"===t.charAt(0);return t=n?t.slice(1):t,{name:t,once:i,capture:n,passive:e}}),Ds=null,Ss=[],As=[],Es={},Is=!1,$s=!1,Os=0,Ps=0,Ns=function(t,e,i,n){this.vm=t,t._watchers.push(this),n?(this.deep=!!n.deep,this.user=!!n.user,this.lazy=!!n.lazy,this.sync=!!n.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=i,this.id=++Ps,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new os,this.newDepIds=new os,this.expression=\"\",\"function\"==typeof e?this.getter=e:(this.getter=D(e),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};Ns.prototype.get=function(){E(this);var t,e=this.vm;if(this.user)try{t=this.getter.call(e,e)}catch(t){S(t,e,'getter for watcher \"'+this.expression+'\"')}else t=this.getter.call(e,e);return this.deep&&It(t),I(),this.cleanupDeps(),t},Ns.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},Ns.prototype.cleanupDeps=function(){for(var t=this,e=this.deps.length;e--;){var i=t.deps[e];t.newDepIds.has(i.id)||i.removeSub(t)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},Ns.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():Et(this)},Ns.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||a(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){S(t,this.vm,'callback for watcher \"'+this.expression+'\"')}else this.cb.call(this.vm,t,e)}}},Ns.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Ns.prototype.depend=function(){for(var t=this,e=this.deps.length;e--;)t.deps[e].depend()},Ns.prototype.teardown=function(){var t=this;if(this.active){this.vm._isBeingDestroyed||p(this.vm._watchers,this);for(var e=this.deps.length;e--;)t.deps[e].removeSub(t);this.active=!1}};var Ms=new os,js={enumerable:!0,configurable:!0,get:b,set:b},Hs={lazy:!0},Rs={init:function(t,e,i,n){if(!t.componentInstance||t.componentInstance._isDestroyed){(t.componentInstance=Xt(t,Ds,i,n)).$mount(e?t.elm:void 0,e)}else if(t.data.keepAlive){var r=t;Rs.prepatch(r,r)}},prepatch:function(t,e){var i=e.componentOptions;yt(e.componentInstance=t.componentInstance,i.propsData,i.listeners,e,i.children)},insert:function(t){var e=t.context,i=t.componentInstance;i._isMounted||(i._isMounted=!0,Ct(i,\"mounted\")),t.data.keepAlive&&(e._isMounted?St(i):wt(i,!0))},destroy:function(t){var e=t.componentInstance;e._isDestroyed||(t.data.keepAlive?xt(e,!0):e.$destroy())}},Ls=Object.keys(Rs),Fs=1,zs=2,Ws=0;!function(t){t.prototype._init=function(t){var e=this;e._uid=Ws++,e._isVue=!0,t&&t._isComponent?de(e,t):e.$options=q(pe(e.constructor),t||{},e),e._renderProxy=e,e._self=e,vt(e),ct(e),he(e),Ct(e,\"beforeCreate\"),Bt(e),Pt(e),qt(e),Ct(e,\"created\"),e.$options.el&&e.$mount(e.$options.el)}}(me),function(t){var e={};e.get=function(){return this._data};var i={};i.get=function(){return this._props},Object.defineProperty(t.prototype,\"$data\",e),Object.defineProperty(t.prototype,\"$props\",i),t.prototype.$set=M,t.prototype.$delete=j,t.prototype.$watch=function(t,e,i){var n=this;i=i||{},i.user=!0;var r=new Ns(n,t,e,i);return i.immediate&&e.call(n,r.value),function(){r.teardown()}}}(me),function(t){var e=/^hook:/;t.prototype.$on=function(t,i){var n=this,r=this;if(Array.isArray(t))for(var s=0,o=t.length;s<o;s++)n.$on(t[s],i);else(r._events[t]||(r._events[t]=[])).push(i),e.test(t)&&(r._hasHookEvent=!0);return r},t.prototype.$once=function(t,e){function i(){n.$off(t,i),e.apply(n,arguments)}var n=this;return i.fn=e,n.$on(t,i),n},t.prototype.$off=function(t,e){var i=this,n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(t)){for(var r=0,s=t.length;r<s;r++)i.$off(t[r],e);return n}var o=n._events[t];if(!o)return n;if(1===arguments.length)return n._events[t]=null,n;for(var a,l=o.length;l--;)if((a=o[l])===e||a.fn===e){o.splice(l,1);break}return n},t.prototype.$emit=function(t){var e=this,i=e._events[t];if(i){i=i.length>1?v(i):i;for(var n=v(arguments,1),r=0,s=i.length;r<s;r++)i[r].apply(e,n)}return e}}(me),function(t){t.prototype._update=function(t,e){var i=this;i._isMounted&&Ct(i,\"beforeUpdate\");var n=i.$el,r=i._vnode,s=Ds;Ds=i,i._vnode=t,i.$el=r?i.__patch__(r,t):i.__patch__(i.$el,t,e,!1,i.$options._parentElm,i.$options._refElm),Ds=s,n&&(n.__vue__=null),i.$el&&(i.$el.__vue__=i),i.$vnode&&i.$parent&&i.$vnode===i.$parent._vnode&&(i.$parent.$el=i.$el)},t.prototype.$forceUpdate=function(){var t=this;t._watcher&&t._watcher.update()},t.prototype.$destroy=function(){var t=this;if(!t._isBeingDestroyed){Ct(t,\"beforeDestroy\"),t._isBeingDestroyed=!0;var e=t.$parent;!e||e._isBeingDestroyed||t.$options.abstract||p(e.$children,t),t._watcher&&t._watcher.teardown();for(var i=t._watchers.length;i--;)t._watchers[i].teardown();t._data.__ob__&&t._data.__ob__.vmCount--,t._isDestroyed=!0,t.__patch__(t._vnode,null),Ct(t,\"destroyed\"),t.$off(),t.$el&&(t.$el.__vue__=null),t.$options._parentElm=t.$options._refElm=null}}}(me),function(t){t.prototype.$nextTick=function(t){return cs(t,this)},t.prototype._render=function(){var t=this,e=t.$options,i=e.render,n=e.staticRenderFns,r=e._parentVnode;if(t._isMounted)for(var s in t.$slots)t.$slots[s]=Z(t.$slots[s]);t.$scopedSlots=r&&r.data.scopedSlots||Ur,n&&!t._staticTrees&&(t._staticTrees=[]),t.$vnode=r;var o;try{o=i.call(t._renderProxy,t.$createElement)}catch(e){S(e,t,\"render function\"),o=t._vnode}return o instanceof ws||(o=ks()),o.parent=r,o},t.prototype._o=le,t.prototype._n=h,t.prototype._s=c,t.prototype._l=ie,t.prototype._t=ne,t.prototype._q=w,t.prototype._i=x,t.prototype._m=ae,t.prototype._f=re,t.prototype._k=se,t.prototype._b=oe,t.prototype._v=X,t.prototype._e=ks,t.prototype._u=mt}(me);var qs=[String,RegExp],Bs={name:\"keep-alive\",abstract:!0,props:{include:qs,exclude:qs},created:function(){this.cache=Object.create(null)},destroyed:function(){var t=this;for(var e in t.cache)De(t.cache[e])},watch:{include:function(t){Te(this.cache,this._vnode,function(e){return ke(t,e)})},exclude:function(t){Te(this.cache,this._vnode,function(e){return!ke(t,e)})}},render:function(){var t=ut(this.$slots.default),e=t&&t.componentOptions;if(e){var i=Ce(e);if(i&&(this.include&&!ke(this.include,i)||this.exclude&&ke(this.exclude,i)))return t;var n=null==t.key?e.Ctor.cid+(e.tag?\"::\"+e.tag:\"\"):t.key;this.cache[n]?t.componentInstance=this.cache[n].componentInstance:this.cache[n]=t,t.data.keepAlive=!0}return t}},Us={KeepAlive:Bs};!function(t){var e={};e.get=function(){return Br},Object.defineProperty(t,\"config\",e),t.util={warn:Vr,extend:_,mergeOptions:q,defineReactive:N},t.set=M,t.delete=j,t.nextTick=cs,t.options=Object.create(null),Wr.forEach(function(e){t.options[e+\"s\"]=Object.create(null)}),t.options._base=t,_(t.options.components,Us),ve(t),_e(t),ye(t),xe(t)}(me),Object.defineProperty(me.prototype,\"$isServer\",{get:as}),Object.defineProperty(me.prototype,\"$ssrContext\",{get:function(){return this.$vnode.ssrContext}}),me.version=\"2.3.3\";var Ys,Vs,Ks,Xs,Gs,Zs,Js,Qs,to,eo=d(\"style,class\"),io=d(\"input,textarea,option,select\"),no=function(t,e,i){return\"value\"===i&&io(t)&&\"button\"!==e||\"selected\"===i&&\"option\"===t||\"checked\"===i&&\"input\"===t||\"muted\"===i&&\"video\"===t},ro=d(\"contenteditable,draggable,spellcheck\"),so=d(\"allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible\"),oo=\"http://www.w3.org/1999/xlink\",ao=function(t){return\":\"===t.charAt(5)&&\"xlink\"===t.slice(0,5)},lo=function(t){return ao(t)?t.slice(6,t.length):\"\"},uo=function(t){return null==t||!1===t},co={svg:\"http://www.w3.org/2000/svg\",math:\"http://www.w3.org/1998/Math/MathML\"},ho=d(\"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template\"),po=d(\"svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view\",!0),fo=function(t){return\"pre\"===t},go=function(t){return ho(t)||po(t)},mo=Object.create(null),vo=Object.freeze({createElement:Me,createElementNS:je,createTextNode:He,createComment:Re,insertBefore:Le,removeChild:Fe,appendChild:ze,parentNode:We,nextSibling:qe,tagName:Be,setTextContent:Ue,setAttribute:Ye}),_o={create:function(t,e){Ve(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Ve(t,!0),Ve(e))},destroy:function(t){Ve(t,!0)}},yo=new ws(\"\",{},[]),bo=[\"create\",\"activate\",\"update\",\"remove\",\"destroy\"],wo={create:Ze,update:Ze,destroy:function(t){Ze(t,yo)}},xo=Object.create(null),Co=[_o,wo],ko={create:ii,update:ii},To={create:ri,update:ri},Do=/[\\w).+\\-_$\\]]/,So=\"__r\",Ao=\"__c\",Eo={create:$i,update:$i},Io={create:Oi,update:Oi},$o=g(function(t){var e={},i=/;(?![^(]*\\))/g,n=/:(.+)/;return t.split(i).forEach(function(t){if(t){var i=t.split(n);i.length>1&&(e[i[0].trim()]=i[1].trim())}}),e}),Oo=/^--/,Po=/\\s*!important$/,No=function(t,e,i){if(Oo.test(e))t.style.setProperty(e,i);else if(Po.test(i))t.style.setProperty(e,i.replace(Po,\"\"),\"important\");else{var n=jo(e);if(Array.isArray(i))for(var r=0,s=i.length;r<s;r++)t.style[n]=i[r];else t.style[n]=i}},Mo=[\"Webkit\",\"Moz\",\"ms\"],jo=g(function(t){if(to=to||document.createElement(\"div\"),\"filter\"!==(t=Mr(t))&&t in to.style)return t;for(var e=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<Mo.length;i++){var n=Mo[i]+e;if(n in to.style)return n}}),Ho={create:Li,update:Li},Ro=g(function(t){return{enterClass:t+\"-enter\",enterToClass:t+\"-enter-to\",enterActiveClass:t+\"-enter-active\",leaveClass:t+\"-leave\",leaveToClass:t+\"-leave-to\",leaveActiveClass:t+\"-leave-active\"}}),Lo=Xr&&!Jr,Fo=\"transition\",zo=\"animation\",Wo=\"transition\",qo=\"transitionend\",Bo=\"animation\",Uo=\"animationend\";Lo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Wo=\"WebkitTransition\",qo=\"webkitTransitionEnd\"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Bo=\"WebkitAnimation\",Uo=\"webkitAnimationEnd\"));var Yo=Xr&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout,Vo=/\\b(transform|all)(,|$)/,Ko=Xr?{create:tn,activate:tn,remove:function(t,e){!0!==t.data.show?Zi(t,e):e()}}:{},Xo=[ko,To,Eo,Io,Ho,Ko],Go=Xo.concat(Co),Zo=function(t){function e(t){return new ws(I.tagName(t).toLowerCase(),{},[],void 0,t)}function s(t,e){function i(){0==--i.listeners&&a(t)}return i.listeners=e,i}function a(t){var e=I.parentNode(t);n(e)&&I.removeChild(e,t)}function l(t,e,i,s,o){if(t.isRootInsert=!o,!u(t,e,i,s)){var a=t.data,l=t.children,c=t.tag;n(c)?(t.elm=t.ns?I.createElementNS(t.ns,c):I.createElement(c,t),v(t),f(t,l,e),n(a)&&m(t,e),p(i,t.elm,s)):r(t.isComment)?(t.elm=I.createComment(t.text),p(i,t.elm,s)):(t.elm=I.createTextNode(t.text),p(i,t.elm,s))}}function u(t,e,i,s){var o=t.data;if(n(o)){var a=n(t.componentInstance)&&o.keepAlive;if(n(o=o.hook)&&n(o=o.init)&&o(t,!1,i,s),n(t.componentInstance))return c(t,e),r(a)&&h(t,e,i,s),!0}}function c(t,e){n(t.data.pendingInsert)&&e.push.apply(e,t.data.pendingInsert),t.elm=t.componentInstance.$el,g(t)?(m(t,e),v(t)):(Ve(t),e.push(t))}function h(t,e,i,r){for(var s,o=t;o.componentInstance;)if(o=o.componentInstance._vnode,n(s=o.data)&&n(s=s.transition)){for(s=0;s<A.activate.length;++s)A.activate[s](yo,o);e.push(o);break}p(i,t.elm,r)}function p(t,e,i){n(t)&&(n(i)?i.parentNode===t&&I.insertBefore(t,e,i):I.appendChild(t,e))}function f(t,e,i){if(Array.isArray(e))for(var n=0;n<e.length;++n)l(e[n],i,t.elm,null,!0);else o(t.text)&&I.appendChild(t.elm,I.createTextNode(t.text))}function g(t){for(;t.componentInstance;)t=t.componentInstance._vnode;return n(t.tag)}function m(t,e){for(var i=0;i<A.create.length;++i)A.create[i](yo,t);D=t.data.hook,n(D)&&(n(D.create)&&D.create(yo,t),n(D.insert)&&e.push(t))}function v(t){for(var e,i=t;i;)n(e=i.context)&&n(e=e.$options._scopeId)&&I.setAttribute(t.elm,e,\"\"),i=i.parent;n(e=Ds)&&e!==t.context&&n(e=e.$options._scopeId)&&I.setAttribute(t.elm,e,\"\")}function _(t,e,i,n,r,s){for(;n<=r;++n)l(i[n],s,t,e)}function y(t){var e,i,r=t.data;if(n(r))for(n(e=r.hook)&&n(e=e.destroy)&&e(t),e=0;e<A.destroy.length;++e)A.destroy[e](t);if(n(e=t.children))for(i=0;i<t.children.length;++i)y(t.children[i])}function b(t,e,i,r){for(;i<=r;++i){var s=e[i];n(s)&&(n(s.tag)?(w(s),y(s)):a(s.elm))}}function w(t,e){if(n(e)||n(t.data)){var i,r=A.remove.length+1;for(n(e)?e.listeners+=r:e=s(t.elm,r),n(i=t.componentInstance)&&n(i=i._vnode)&&n(i.data)&&w(i,e),i=0;i<A.remove.length;++i)A.remove[i](t,e);n(i=t.data.hook)&&n(i=i.remove)?i(t,e):e()}else a(t.elm)}function x(t,e,r,s,o){for(var a,u,c,h,d=0,p=0,f=e.length-1,g=e[0],m=e[f],v=r.length-1,y=r[0],w=r[v],x=!o;d<=f&&p<=v;)i(g)?g=e[++d]:i(m)?m=e[--f]:Ke(g,y)?(C(g,y,s),g=e[++d],y=r[++p]):Ke(m,w)?(C(m,w,s),m=e[--f],w=r[--v]):Ke(g,w)?(C(g,w,s),x&&I.insertBefore(t,g.elm,I.nextSibling(m.elm)),g=e[++d],w=r[--v]):Ke(m,y)?(C(m,y,s),x&&I.insertBefore(t,m.elm,g.elm),m=e[--f],y=r[++p]):(i(a)&&(a=Ge(e,d,f)),u=n(y.key)?a[y.key]:null,i(u)?(l(y,s,t,g.elm),y=r[++p]):(c=e[u],Ke(c,y)?(C(c,y,s),e[u]=void 0,x&&I.insertBefore(t,y.elm,g.elm),y=r[++p]):(l(y,s,t,g.elm),y=r[++p])));d>f?(h=i(r[v+1])?null:r[v+1].elm,_(t,h,r,p,v,s)):p>v&&b(t,e,d,f)}function C(t,e,s,o){if(t!==e){if(r(e.isStatic)&&r(t.isStatic)&&e.key===t.key&&(r(e.isCloned)||r(e.isOnce)))return e.elm=t.elm,void(e.componentInstance=t.componentInstance);var a,l=e.data;n(l)&&n(a=l.hook)&&n(a=a.prepatch)&&a(t,e);var u=e.elm=t.elm,c=t.children,h=e.children;if(n(l)&&g(e)){for(a=0;a<A.update.length;++a)A.update[a](t,e);n(a=l.hook)&&n(a=a.update)&&a(t,e)}i(e.text)?n(c)&&n(h)?c!==h&&x(u,c,h,s,o):n(h)?(n(t.text)&&I.setTextContent(u,\"\"),_(u,null,h,0,h.length-1,s)):n(c)?b(u,c,0,c.length-1):n(t.text)&&I.setTextContent(u,\"\"):t.text!==e.text&&I.setTextContent(u,e.text),n(l)&&n(a=l.hook)&&n(a=a.postpatch)&&a(t,e)}}function k(t,e,i){if(r(i)&&n(t.parent))t.parent.data.pendingInsert=e;else for(var s=0;s<e.length;++s)e[s].data.hook.insert(e[s])}function T(t,e,i){e.elm=t;var r=e.tag,s=e.data,o=e.children;if(n(s)&&(n(D=s.hook)&&n(D=D.init)&&D(e,!0),n(D=e.componentInstance)))return c(e,i),!0;if(n(r)){if(n(o))if(t.hasChildNodes()){for(var a=!0,l=t.firstChild,u=0;u<o.length;u++){if(!l||!T(l,o[u],i)){a=!1;break}l=l.nextSibling}if(!a||l)return!1}else f(e,o,i);if(n(s))for(var h in s)if(!$(h)){m(e,i);break}}else t.data!==e.text&&(t.data=e.text);return!0}var D,S,A={},E=t.modules,I=t.nodeOps;for(D=0;D<bo.length;++D)for(A[bo[D]]=[],S=0;S<E.length;++S)n(E[S][bo[D]])&&A[bo[D]].push(E[S][bo[D]]);var $=d(\"attrs,style,class,staticClass,staticStyle,key\");return function(t,s,o,a,u,c){if(i(s))return void(n(t)&&y(t));var h=!1,d=[];if(i(t))h=!0,l(s,d,u,c);else{var p=n(t.nodeType);if(!p&&Ke(t,s))C(t,s,d,a);else{if(p){if(1===t.nodeType&&t.hasAttribute(zr)&&(t.removeAttribute(zr),o=!0),r(o)&&T(t,s,d))return k(s,d,!0),t;t=e(t)}var f=t.elm,m=I.parentNode(f);if(l(s,d,f._leaveCb?null:m,I.nextSibling(f)),n(s.parent)){for(var v=s.parent;v;)v.elm=s.elm,v=v.parent;if(g(s))for(var _=0;_<A.create.length;++_)A.create[_](yo,s.parent)}n(m)?b(m,[t],0,0):n(t.tag)&&y(t)}}return k(s,d,h),s.elm}}({nodeOps:vo,modules:Go});Jr&&document.addEventListener(\"selectionchange\",function(){var t=document.activeElement;t&&t.vmodel&&an(t,\"input\")});var Jo={inserted:function(t,e,i){if(\"select\"===i.tag){var n=function(){en(t,e,i.context)};n(),(Zr||Qr)&&setTimeout(n,0)}else\"textarea\"!==i.tag&&\"text\"!==t.type&&\"password\"!==t.type||(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener(\"change\",on),ts||(t.addEventListener(\"compositionstart\",sn),t.addEventListener(\"compositionend\",on)),Jr&&(t.vmodel=!0)))},componentUpdated:function(t,e,i){if(\"select\"===i.tag){en(t,e,i.context);(t.multiple?e.value.some(function(e){return nn(e,t.options)}):e.value!==e.oldValue&&nn(e.value,t.options))&&an(t,\"change\")}}},Qo={bind:function(t,e,i){var n=e.value;i=ln(i);var r=i.data&&i.data.transition,s=t.__vOriginalDisplay=\"none\"===t.style.display?\"\":t.style.display;n&&r&&!Jr?(i.data.show=!0,Gi(i,function(){t.style.display=s})):t.style.display=n?s:\"none\"},update:function(t,e,i){var n=e.value;n!==e.oldValue&&(i=ln(i),i.data&&i.data.transition&&!Jr?(i.data.show=!0,n?Gi(i,function(){t.style.display=t.__vOriginalDisplay}):Zi(i,function(){t.style.display=\"none\"})):t.style.display=n?t.__vOriginalDisplay:\"none\")},unbind:function(t,e,i,n,r){r||(t.style.display=t.__vOriginalDisplay)}},ta={model:Jo,show:Qo},ea={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]},ia={name:\"transition\",props:ea,abstract:!0,render:function(t){var e=this,i=this.$slots.default;if(i&&(i=i.filter(function(t){return t.tag}),i.length)){var n=this.mode,r=i[0];if(dn(this.$vnode))return r;var s=un(r);if(!s)return r;if(this._leaving)return hn(t,r);var a=\"__transition-\"+this._uid+\"-\";s.key=null==s.key?a+s.tag:o(s.key)?0===String(s.key).indexOf(a)?s.key:a+s.key:s.key;var l=(s.data||(s.data={})).transition=cn(this),u=this._vnode,c=un(u);if(s.data.directives&&s.data.directives.some(function(t){return\"show\"===t.name})&&(s.data.show=!0),c&&c.data&&!pn(s,c)){var h=c&&(c.data.transition=_({},l));if(\"out-in\"===n)return this._leaving=!0,tt(h,\"afterLeave\",function(){e._leaving=!1,e.$forceUpdate()}),hn(t,r);if(\"in-out\"===n){var d,p=function(){d()};tt(l,\"afterEnter\",p),tt(l,\"enterCancelled\",p),tt(h,\"delayLeave\",function(t){d=t})}}return r}}},na=_({tag:String,moveClass:String},ea);delete na.mode;var ra={props:na,render:function(t){for(var e=this.tag||this.$vnode.data.tag||\"span\",i=Object.create(null),n=this.prevChildren=this.children,r=this.$slots.default||[],s=this.children=[],o=cn(this),a=0;a<r.length;a++){var l=r[a];if(l.tag)if(null!=l.key&&0!==String(l.key).indexOf(\"__vlist\"))s.push(l),i[l.key]=l,(l.data||(l.data={})).transition=o;else;}if(n){for(var u=[],c=[],h=0;h<n.length;h++){var d=n[h];d.data.transition=o,d.data.pos=d.elm.getBoundingClientRect(),i[d.key]?u.push(d):c.push(d)}this.kept=t(e,null,u),this.removed=c}return t(e,null,s)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var t=this.prevChildren,e=this.moveClass||(this.name||\"v\")+\"-move\";if(t.length&&this.hasMove(t[0].elm,e)){t.forEach(fn),t.forEach(gn),t.forEach(mn);var i=document.body;i.offsetHeight;t.forEach(function(t){if(t.data.moved){var i=t.elm,n=i.style;Bi(i,e),n.transform=n.WebkitTransform=n.transitionDuration=\"\",i.addEventListener(qo,i._moveCb=function t(n){n&&!/transform$/.test(n.propertyName)||(i.removeEventListener(qo,t),i._moveCb=null,Ui(i,e))})}})}},methods:{hasMove:function(t,e){if(!Lo)return!1;if(null!=this._hasMove)return this._hasMove;var i=t.cloneNode();t._transitionClasses&&t._transitionClasses.forEach(function(t){zi(i,t)}),Fi(i,e),i.style.display=\"none\",this.$el.appendChild(i);var n=Vi(i);return this.$el.removeChild(i),this._hasMove=n.hasTransform}}},sa={Transition:ia,TransitionGroup:ra};me.config.mustUseProp=no,me.config.isReservedTag=go,me.config.isReservedAttr=eo,me.config.getTagNamespace=Oe,me.config.isUnknownElement=Pe,_(me.options.directives,ta),_(me.options.components,sa),me.prototype.__patch__=Xr?Zo:b,me.prototype.$mount=function(t,e){return t=t&&Xr?Ne(t):void 0,_t(this,t,e)},setTimeout(function(){Br.devtools&&ls&&ls.emit(\"init\",me)},0);var oa,aa=!!Xr&&function(t,e){var i=document.createElement(\"div\");return i.innerHTML='<div a=\"'+t+'\">',i.innerHTML.indexOf(e)>0}(\"\\n\",\"&#10;\"),la=d(\"area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr\"),ua=d(\"colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source\"),ca=d(\"address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track\"),ha=/([^\\s\"'<>\\/=]+)/,da=/(?:=)/,pa=[/\"([^\"]*)\"+/.source,/'([^']*)'+/.source,/([^\\s\"'=<>`]+)/.source],fa=new RegExp(\"^\\\\s*\"+ha.source+\"(?:\\\\s*(\"+da.source+\")\\\\s*(?:\"+pa.join(\"|\")+\"))?\"),ga=\"[a-zA-Z_][\\\\w\\\\-\\\\.]*\",ma=\"((?:\"+ga+\"\\\\:)?\"+ga+\")\",va=new RegExp(\"^<\"+ma),_a=/^\\s*(\\/?)>/,ya=new RegExp(\"^<\\\\/\"+ma+\"[^>]*>\"),ba=/^<!DOCTYPE [^>]+>/i,wa=/^<!--/,xa=/^<!\\[/,Ca=!1;\"x\".replace(/x(.)?/g,function(t,e){Ca=\"\"===e});var ka,Ta,Da,Sa,Aa,Ea,Ia,$a,Oa,Pa,Na,Ma,ja,Ha,Ra,La,Fa,za,Wa=d(\"script,style,textarea\",!0),qa={},Ba={\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&amp;\":\"&\",\"&#10;\":\"\\n\"},Ua=/&(?:lt|gt|quot|amp);/g,Ya=/&(?:lt|gt|quot|amp|#10);/g,Va=/\\{\\{((?:.|\\n)+?)\\}\\}/g,Ka=/[-.*+?^${}()|[\\]\\/\\\\]/g,Xa=g(function(t){var e=t[0].replace(Ka,\"\\\\$&\"),i=t[1].replace(Ka,\"\\\\$&\");return new RegExp(e+\"((?:.|\\\\n)+?)\"+i,\"g\")}),Ga=/^@|^v-on:/,Za=/^v-|^@|^:/,Ja=/(.*?)\\s+(?:in|of)\\s+(.*)/,Qa=/\\((\\{[^}]*\\}|[^,]*),([^,]*)(?:,([^,]*))?\\)/,tl=/:(.*)$/,el=/^:|^v-bind:/,il=/\\.[^.]+/g,nl=g(vn),rl=/^xmlns:NS\\d+/,sl=/^NS\\d+:/,ol=g(Wn),al=/^\\s*([\\w$_]+|\\([^)]*?\\))\\s*=>|^function\\s*\\(/,ll=/^\\s*[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['.*?']|\\[\".*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*\\s*$/,ul={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},cl=function(t){return\"if(\"+t+\")return null;\"},hl={stop:\"$event.stopPropagation();\",prevent:\"$event.preventDefault();\",self:cl(\"$event.target !== $event.currentTarget\"),ctrl:cl(\"!$event.ctrlKey\"),shift:cl(\"!$event.shiftKey\"),alt:cl(\"!$event.altKey\"),meta:cl(\"!$event.metaKey\"),left:cl(\"'button' in $event && $event.button !== 0\"),middle:cl(\"'button' in $event && $event.button !== 1\"),right:cl(\"'button' in $event && $event.button !== 2\")},dl={bind:Jn,cloak:b},pl=(new RegExp(\"\\\\b\"+\"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments\".split(\",\").join(\"\\\\b|\\\\b\")+\"\\\\b\"),new RegExp(\"\\\\b\"+\"delete,typeof,void\".split(\",\").join(\"\\\\s*\\\\([^\\\\)]*\\\\)|\\\\b\")+\"\\\\s*\\\\([^\\\\)]*\\\\)\"),{staticKeys:[\"staticClass\"],transformNode:kr,genData:Tr}),fl={staticKeys:[\"staticStyle\"],transformNode:Dr,genData:Sr},gl=[pl,fl],ml={model:Ci,text:Ar,html:Er},vl={expectHTML:!0,modules:gl,directives:ml,isPreTag:fo,isUnaryTag:la,mustUseProp:no,canBeLeftOpenTag:ua,isReservedTag:go,getTagNamespace:Oe,staticKeys:function(t){return t.reduce(function(t,e){return t.concat(e.staticKeys||[])},[]).join(\",\")}(gl)},_l=function(t){function e(e,i){var n=Object.create(t),r=[],s=[];if(n.warn=function(t,e){(e?s:r).push(t)},i){i.modules&&(n.modules=(t.modules||[]).concat(i.modules)),i.directives&&(n.directives=_(Object.create(t.directives),i.directives));for(var o in i)\"modules\"!==o&&\"directives\"!==o&&(n[o]=i[o])}var a=xr(e,n);return a.errors=r,a.tips=s,a}function i(t,i,r){i=i||{};var s=i.delimiters?String(i.delimiters)+t:t;if(n[s])return n[s];var o=e(t,i),a={},l=[];a.render=Cr(o.render,l);var u=o.staticRenderFns.length;a.staticRenderFns=new Array(u);for(var c=0;c<u;c++)a.staticRenderFns[c]=Cr(o.staticRenderFns[c],l);return n[s]=a}var n=Object.create(null);return{compile:e,compileToFunctions:i}}(vl),yl=_l.compileToFunctions,bl=g(function(t){var e=Ne(t);return e&&e.innerHTML}),wl=me.prototype.$mount;me.prototype.$mount=function(t,e){if((t=t&&Ne(t))===document.body||t===document.documentElement)return this;var i=this.$options;if(!i.render){var n=i.template;if(n)if(\"string\"==typeof n)\"#\"===n.charAt(0)&&(n=bl(n));else{if(!n.nodeType)return this;n=n.innerHTML}else t&&(n=Ir(t));if(n){var r=yl(n,{shouldDecodeNewlines:aa,delimiters:i.delimiters},this),s=r.render,o=r.staticRenderFns;i.render=s,i.staticRenderFns=o}}return wl.call(this,t,e)},me.compile=yl,t.exports=me}).call(e,i(4))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,\"loaded\",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,\"id\",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){},,function(t,e,i){t.exports=i(5)}]);\n\n\n// WEBPACK FOOTER //\n// /vue.js"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sourceRoot":""}
        \ No newline at end of file
        diff --git a/circle.yml b/circle.yml
        deleted file mode 100644
        index 61f3c5e6b2..0000000000
        --- a/circle.yml
        +++ /dev/null
        @@ -1,13 +0,0 @@
        -machine:
        -  timezone:
        -    US/Pacific
        -  php:
        -    version: 5.6.2
        -  hosts:
        -    localhost: 127.0.0.1
        -  environment:
        -    ENVIRONMENT: testing-ci
        -    DB_DATABASE: testing.sqlite
        -test:
        -  override:
        -    - ./vendor/bin/codecept run --env testing-ci -vv
        diff --git a/composer.json b/composer.json
        index 94f9527c63..22343e9ccd 100644
        --- a/composer.json
        +++ b/composer.json
        @@ -4,43 +4,47 @@
           "keywords": ["assets", "asset-management", "laravel"],
           "license": "AGPL-3",
           "type": "project",
        -      "require": {
        -      "php": ">=5.5.9",
        -      "laravel/framework": "5.2.*",
        -      "intervention/image": "dev-master",
        -      "league/csv": "~7.0",
        -      "maknz/slack": "dev-master",
        -      "erusev/parsedown": "dev-master",
        -      "fideloper/proxy": "^3.1",
        -      "guzzlehttp/guzzle": "6.2.1",
        -      "aws/aws-sdk-php-laravel": "~3.0",
        -      "tecnickcom/tc-lib-barcode": "dev-master",
        -      "laravelcollective/html" : "~5.0",
        -      "watson/validating": "^2.0",
        -      "doctrine/cache": "v1.5.4",
        -      "doctrine/common": "v2.5.3",
        -      "doctrine/dbal": "v2.4.2",
        -      "barryvdh/laravel-debugbar": "^2.1",
        -      "spatie/laravel-backup": "3.8.1",
        -      "misterphilip/maintenance-mode": "1.0.*",
        -      "neitanod/forceutf8": "dev-master",
        -      "pragmarx/google2fa": "^1.0"
        -    },
        +        "require": {
        +    "php": ">=5.6.4",
        +    "aws/aws-sdk-php-laravel": "^3.1",
        +    "barryvdh/laravel-debugbar": "^2.4",
        +    "doctrine/cache": "^1.6",
        +    "doctrine/common": "^2.7",
        +    "doctrine/dbal": "v2.4.2",
        +    "erusev/parsedown": "^1.6",
        +    "fideloper/proxy": "^3.1",
        +    "intervention/image": "^2.3",
        +    "javiereguiluz/easyslugger": "^1.0",
        +    "laravel/framework": "5.4.20",
        +    "laravel/passport": "^1.0",
        +    "laravel/tinker": "^1.0",
        +    "laravelcollective/html": "^5.3",
        +    "league/csv": "^8.1",
        +    "maknz/slack": "^1.7",
        +    "neitanod/forceutf8": "^2.0",
        +    "patchwork/utf8": "~1.2",
        +    "pragmarx/google2fa": "^1.0",
        +    "schuppo/password-strength": "~1.5",
        +    "spatie/laravel-backup": "^3.0.0",
        +    "tecnickcom/tc-lib-barcode": "^1.15",
        +    "unicodeveloper/laravel-password": "^1.0",
        +    "watson/validating": "^3.0",
        +    "doctrine/instantiator": "1.0.5",
        +    "doctrine/inflector": "1.0.*"
        +  },
             "require-dev": {
        -      "fzaninotto/faker": "~1.4",
        -      "mockery/mockery": "0.9.*",
        -      "phpunit/phpunit": "~4.0",
        -      "squizlabs/php_codesniffer": "2.*",
        -      "phpspec/phpspec": "~2.1",
        -      "codeception/codeception": "2.1.*",
        -      "symfony/dom-crawler": "~3.0",
        -      "symfony/css-selector": "~3.0",
        -      "codeception/c3": "2.*"
        +        "fzaninotto/faker": "~1.4",
        +        "phpunit/phpunit": "~5.7",
        +        "symfony/css-selector": "3.1.*",
        +        "symfony/dom-crawler": "3.1.*",
        +        "codeception/codeception": "2.2.9",
        +        "squizlabs/php_codesniffer": "*",
        +        "phpunit/php-token-stream": "1.4.11"
        +
             },
             "autoload": {
                 "classmap": [
        -            "database",
        -            "app/Helpers/Helper.php"
        +            "database"
                 ],
                 "psr-4": {
                     "App\\": "app/"
        @@ -48,29 +52,21 @@
             },
             "autoload-dev": {
                 "classmap": [
        -            "tests/TestCase.php"
        +            "tests/TestCase.php",
        +            "tests/unit/BaseTest.php"
                 ]
             },
             "scripts": {
                 "post-root-package-install": [
        -            "php -r \"copy('.env.example', '.env');\""
        +            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
                 ],
                 "post-create-project-cmd": [
                     "php artisan key:generate"
        -        ],
        -        "post-install-cmd": [
        -            "php artisan clear-compiled",
        -            "php artisan optimize"
        -        ],
        -        "pre-update-cmd": [
        -            "php artisan clear-compiled"
        -        ],
        -        "post-update-cmd": [
        -            "php artisan optimize"
                 ]
             },
             "config": {
        -        "preferred-install": "dist"
        -    },
        -    "minimum-stability": "stable"
        +        "preferred-install": "dist",
        +        "sort-packages": true,
        +        "optimize-autoloader": true
        +    }
         }
        diff --git a/composer.lock b/composer.lock
        index 0062967689..d5f999ea8d 100644
        --- a/composer.lock
        +++ b/composer.lock
        @@ -4,27 +4,30 @@
                 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
                 "This file is @generated automatically"
             ],
        -    "hash": "a188b3cf19debb9f4ad80016cb02bacd",
        -    "content-hash": "d05155478c07249acdb2fed3d47189e6",
        +    "content-hash": "db205a40d1f9ae7c221f8c60e8cb527b",
             "packages": [
                 {
                     "name": "aws/aws-sdk-php",
        -            "version": "3.19.2",
        +            "version": "3.34.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/aws/aws-sdk-php.git",
        -                "reference": "3cb90413129da42c9d3289d542bee0ae1049892c"
        +                "reference": "df7ddca6872048cc91315c2b4fdb9a57d5fceb84"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3cb90413129da42c9d3289d542bee0ae1049892c",
        -                "reference": "3cb90413129da42c9d3289d542bee0ae1049892c",
        +                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/df7ddca6872048cc91315c2b4fdb9a57d5fceb84",
        +                "reference": "df7ddca6872048cc91315c2b4fdb9a57d5fceb84",
                         "shasum": ""
                     },
                     "require": {
        +                "ext-json": "*",
        +                "ext-pcre": "*",
        +                "ext-simplexml": "*",
        +                "ext-spl": "*",
                         "guzzlehttp/guzzle": "^5.3.1|^6.2.1",
                         "guzzlehttp/promises": "~1.0",
        -                "guzzlehttp/psr7": "~1.3.1",
        +                "guzzlehttp/psr7": "^1.4.1",
                         "mtdowling/jmespath.php": "~2.2",
                         "php": ">=5.5"
                     },
        @@ -34,13 +37,9 @@
                         "behat/behat": "~3.0",
                         "doctrine/cache": "~1.4",
                         "ext-dom": "*",
        -                "ext-json": "*",
                         "ext-openssl": "*",
        -                "ext-pcre": "*",
        -                "ext-simplexml": "*",
        -                "ext-spl": "*",
                         "nette/neon": "^2.3",
        -                "phpunit/phpunit": "~4.0|~5.0",
        +                "phpunit/phpunit": "^4.8.35|^5.4.0",
                         "psr/cache": "^1.0"
                     },
                     "suggest": {
        @@ -85,7 +84,7 @@
                         "s3",
                         "sdk"
                     ],
        -            "time": "2016-08-23 20:58:48"
        +            "time": "2017-08-22T18:32:28+00:00"
                 },
                 {
                     "name": "aws/aws-sdk-php-laravel",
        @@ -141,34 +140,29 @@
                         "s3",
                         "sdk"
                     ],
        -            "time": "2016-01-18 06:57:07"
        +            "time": "2016-01-18T06:57:07+00:00"
                 },
                 {
                     "name": "barryvdh/laravel-debugbar",
        -            "version": "V2.2.3",
        +            "version": "v2.4.3",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/barryvdh/laravel-debugbar.git",
        -                "reference": "ecd1ce5c4a827e2f6a8fb41bcf67713beb1c1cbd"
        +                "reference": "d7c88f08131f6404cb714f3f6cf0642f6afa3903"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/ecd1ce5c4a827e2f6a8fb41bcf67713beb1c1cbd",
        -                "reference": "ecd1ce5c4a827e2f6a8fb41bcf67713beb1c1cbd",
        +                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d7c88f08131f6404cb714f3f6cf0642f6afa3903",
        +                "reference": "d7c88f08131f6404cb714f3f6cf0642f6afa3903",
                         "shasum": ""
                     },
                     "require": {
        -                "illuminate/support": "5.1.*|5.2.*|5.3.*",
        -                "maximebf/debugbar": "~1.11.0|~1.12.0",
        +                "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
        +                "maximebf/debugbar": "~1.13.0",
                         "php": ">=5.5.9",
                         "symfony/finder": "~2.7|~3.0"
                     },
                     "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "2.2-dev"
        -                }
        -            },
                     "autoload": {
                         "psr-4": {
                             "Barryvdh\\Debugbar\\": "src/"
        @@ -195,7 +189,7 @@
                         "profiler",
                         "webprofiler"
                     ],
        -            "time": "2016-07-29 15:00:36"
        +            "time": "2017-07-21T11:56:48+00:00"
                 },
                 {
                     "name": "christian-riesen/base32",
        @@ -249,38 +243,38 @@
                         "encode",
                         "rfc4648"
                     ],
        -            "time": "2016-05-05 11:49:03"
        +            "time": "2016-05-05T11:49:03+00:00"
                 },
                 {
        -            "name": "classpreloader/classpreloader",
        -            "version": "3.0.0",
        +            "name": "defuse/php-encryption",
        +            "version": "v2.1.0",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/ClassPreloader/ClassPreloader.git",
        -                "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a"
        +                "url": "https://github.com/defuse/php-encryption.git",
        +                "reference": "5176f5abb38d3ea8a6e3ac6cd3bbb54d8185a689"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/9b10b913c2bdf90c3d2e0d726b454fb7f77c552a",
        -                "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a",
        +                "url": "https://api.github.com/repos/defuse/php-encryption/zipball/5176f5abb38d3ea8a6e3ac6cd3bbb54d8185a689",
        +                "reference": "5176f5abb38d3ea8a6e3ac6cd3bbb54d8185a689",
                         "shasum": ""
                     },
                     "require": {
        -                "nikic/php-parser": "^1.0|^2.0",
        -                "php": ">=5.5.9"
        +                "ext-openssl": "*",
        +                "paragonie/random_compat": "~2.0",
        +                "php": ">=5.4.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "^4.8|^5.0"
        +                "nikic/php-parser": "^2.0|^3.0",
        +                "phpunit/phpunit": "^4|^5"
                     },
        +            "bin": [
        +                "bin/generate-defuse-key"
        +            ],
                     "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "3.0-dev"
        -                }
        -            },
                     "autoload": {
                         "psr-4": {
        -                    "ClassPreloader\\": "src/"
        +                    "Defuse\\Crypto\\": "src"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
        @@ -289,21 +283,30 @@
                     ],
                     "authors": [
                         {
        -                    "name": "Michael Dowling",
        -                    "email": "mtdowling@gmail.com"
        +                    "name": "Taylor Hornby",
        +                    "email": "taylor@defuse.ca",
        +                    "homepage": "https://defuse.ca/"
                         },
                         {
        -                    "name": "Graham Campbell",
        -                    "email": "graham@alt-three.com"
        +                    "name": "Scott Arciszewski",
        +                    "email": "info@paragonie.com",
        +                    "homepage": "https://paragonie.com"
                         }
                     ],
        -            "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case",
        +            "description": "Secure PHP Encryption Library",
                     "keywords": [
        -                "autoload",
        -                "class",
        -                "preload"
        +                "aes",
        +                "authenticated encryption",
        +                "cipher",
        +                "crypto",
        +                "cryptography",
        +                "encrypt",
        +                "encryption",
        +                "openssl",
        +                "security",
        +                "symmetric key cryptography"
                     ],
        -            "time": "2015-11-09 22:51:51"
        +            "time": "2017-05-18T21:28:48+00:00"
                 },
                 {
                     "name": "dnoegel/php-xdg-base-dir",
        @@ -336,39 +339,39 @@
                         "MIT"
                     ],
                     "description": "implementation of xdg base directory specification for php",
        -            "time": "2014-10-24 07:27:01"
        +            "time": "2014-10-24T07:27:01+00:00"
                 },
                 {
                     "name": "doctrine/annotations",
        -            "version": "v1.2.7",
        +            "version": "v1.4.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/doctrine/annotations.git",
        -                "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535"
        +                "reference": "54cacc9b81758b14e3ce750f205a393d52339e97"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
        -                "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
        +                "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97",
        +                "reference": "54cacc9b81758b14e3ce750f205a393d52339e97",
                         "shasum": ""
                     },
                     "require": {
                         "doctrine/lexer": "1.*",
        -                "php": ">=5.3.2"
        +                "php": "^5.6 || ^7.0"
                     },
                     "require-dev": {
                         "doctrine/cache": "1.*",
        -                "phpunit/phpunit": "4.*"
        +                "phpunit/phpunit": "^5.7"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.3.x-dev"
        +                    "dev-master": "1.4.x-dev"
                         }
                     },
                     "autoload": {
        -                "psr-0": {
        -                    "Doctrine\\Common\\Annotations\\": "lib/"
        +                "psr-4": {
        +                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
        @@ -404,37 +407,37 @@
                         "docblock",
                         "parser"
                     ],
        -            "time": "2015-08-31 12:32:49"
        +            "time": "2017-02-24T16:22:25+00:00"
                 },
                 {
                     "name": "doctrine/cache",
        -            "version": "v1.5.4",
        +            "version": "v1.6.2",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/doctrine/cache.git",
        -                "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136"
        +                "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/doctrine/cache/zipball/47cdc76ceb95cc591d9c79a36dc3794975b5d136",
        -                "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136",
        +                "url": "https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b",
        +                "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b",
                         "shasum": ""
                     },
                     "require": {
        -                "php": ">=5.3.2"
        +                "php": "~5.5|~7.0"
                     },
                     "conflict": {
                         "doctrine/common": ">2.2,<2.4"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": ">=3.7",
        +                "phpunit/phpunit": "~4.8|~5.0",
                         "predis/predis": "~1.0",
                         "satooshi/php-coveralls": "~0.6"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.5.x-dev"
        +                    "dev-master": "1.6.x-dev"
                         }
                     },
                     "autoload": {
        @@ -474,32 +477,33 @@
                         "cache",
                         "caching"
                     ],
        -            "time": "2015-12-19 05:03:47"
        +            "time": "2017-07-22T12:49:21+00:00"
                 },
                 {
                     "name": "doctrine/collections",
        -            "version": "v1.3.0",
        +            "version": "v1.4.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/doctrine/collections.git",
        -                "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a"
        +                "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a",
        -                "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a",
        +                "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba",
        +                "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba",
                         "shasum": ""
                     },
                     "require": {
        -                "php": ">=5.3.2"
        +                "php": "^5.6 || ^7.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~4.0"
        +                "doctrine/coding-standard": "~0.1@dev",
        +                "phpunit/phpunit": "^5.7"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.2.x-dev"
        +                    "dev-master": "1.3.x-dev"
                         }
                     },
                     "autoload": {
        @@ -540,20 +544,20 @@
                         "collections",
                         "iterator"
                     ],
        -            "time": "2015-04-14 22:21:58"
        +            "time": "2017-01-03T10:49:41+00:00"
                 },
                 {
                     "name": "doctrine/common",
        -            "version": "v2.5.3",
        +            "version": "v2.7.3",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/doctrine/common.git",
        -                "reference": "10f1f19651343f87573129ca970aef1a47a6f29e"
        +                "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/doctrine/common/zipball/10f1f19651343f87573129ca970aef1a47a6f29e",
        -                "reference": "10f1f19651343f87573129ca970aef1a47a6f29e",
        +                "url": "https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9",
        +                "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9",
                         "shasum": ""
                     },
                     "require": {
        @@ -562,20 +566,20 @@
                         "doctrine/collections": "1.*",
                         "doctrine/inflector": "1.*",
                         "doctrine/lexer": "1.*",
        -                "php": ">=5.3.2"
        +                "php": "~5.6|~7.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~3.7"
        +                "phpunit/phpunit": "^5.4.6"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "2.5.x-dev"
        +                    "dev-master": "2.7.x-dev"
                         }
                     },
                     "autoload": {
        -                "psr-0": {
        -                    "Doctrine\\Common\\": "lib/"
        +                "psr-4": {
        +                    "Doctrine\\Common\\": "lib/Doctrine/Common"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
        @@ -613,7 +617,7 @@
                         "persistence",
                         "spl"
                     ],
        -            "time": "2015-12-25 13:10:16"
        +            "time": "2017-07-22T08:35:12+00:00"
                 },
                 {
                     "name": "doctrine/dbal",
        @@ -679,20 +683,20 @@
                         "persistence",
                         "queryobject"
                     ],
        -            "time": "2014-01-01 16:43:57"
        +            "time": "2014-01-01T16:43:57+00:00"
                 },
                 {
                     "name": "doctrine/inflector",
        -            "version": "v1.1.0",
        +            "version": "v1.0.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/doctrine/inflector.git",
        -                "reference": "90b2128806bfde671b6952ab8bea493942c1fdae"
        +                "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae",
        -                "reference": "90b2128806bfde671b6952ab8bea493942c1fdae",
        +                "url": "https://api.github.com/repos/doctrine/inflector/zipball/0bcb2e79d8571787f18b7eb036ed3d004908e604",
        +                "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604",
                         "shasum": ""
                     },
                     "require": {
        @@ -704,7 +708,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.1.x-dev"
        +                    "dev-master": "1.0.x-dev"
                         }
                     },
                     "autoload": {
        @@ -746,7 +750,61 @@
                         "singularize",
                         "string"
                     ],
        -            "time": "2015-11-06 14:35:42"
        +            "time": "2014-12-20T21:24:13+00:00"
        +        },
        +        {
        +            "name": "doctrine/instantiator",
        +            "version": "1.0.5",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/doctrine/instantiator.git",
        +                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
        +                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.3,<8.0-DEV"
        +            },
        +            "require-dev": {
        +                "athletic/athletic": "~0.1.8",
        +                "ext-pdo": "*",
        +                "ext-phar": "*",
        +                "phpunit/phpunit": "~4.0",
        +                "squizlabs/php_codesniffer": "~2.0"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0.x-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Marco Pivetta",
        +                    "email": "ocramius@gmail.com",
        +                    "homepage": "http://ocramius.github.com/"
        +                }
        +            ],
        +            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
        +            "homepage": "https://github.com/doctrine/instantiator",
        +            "keywords": [
        +                "constructor",
        +                "instantiate"
        +            ],
        +            "time": "2015-06-14T21:17:01+00:00"
                 },
                 {
                     "name": "doctrine/lexer",
        @@ -800,20 +858,20 @@
                         "lexer",
                         "parser"
                     ],
        -            "time": "2014-09-09 13:34:57"
        +            "time": "2014-09-09T13:34:57+00:00"
                 },
                 {
                     "name": "erusev/parsedown",
        -            "version": "dev-master",
        +            "version": "1.6.3",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/erusev/parsedown.git",
        -                "reference": "f671ae73647b6666c1442cbaac98e5d60208e409"
        +                "reference": "728952b90a333b5c6f77f06ea9422b94b585878d"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/erusev/parsedown/zipball/f671ae73647b6666c1442cbaac98e5d60208e409",
        -                "reference": "f671ae73647b6666c1442cbaac98e5d60208e409",
        +                "url": "https://api.github.com/repos/erusev/parsedown/zipball/728952b90a333b5c6f77f06ea9422b94b585878d",
        +                "reference": "728952b90a333b5c6f77f06ea9422b94b585878d",
                         "shasum": ""
                     },
                     "require": {
        @@ -842,20 +900,20 @@
                         "markdown",
                         "parser"
                     ],
        -            "time": "2016-07-27 08:05:24"
        +            "time": "2017-05-14T14:47:48+00:00"
                 },
                 {
                     "name": "fideloper/proxy",
        -            "version": "3.1.0",
        +            "version": "3.3.4",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/fideloper/TrustedProxy.git",
        -                "reference": "ec4dd30141e2515e307aea3539ff242e85c3f120"
        +                "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec4dd30141e2515e307aea3539ff242e85c3f120",
        -                "reference": "ec4dd30141e2515e307aea3539ff242e85c3f120",
        +                "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9cdf6f118af58d89764249bbcc7bb260c132924f",
        +                "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f",
                         "shasum": ""
                     },
                     "require": {
        @@ -864,12 +922,18 @@
                     },
                     "require-dev": {
                         "illuminate/http": "~5.0",
        -                "mockery/mockery": "~0.9.3"
        +                "mockery/mockery": "~0.9.3",
        +                "phpunit/phpunit": "^5.7"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.1-dev"
        +                    "dev-master": "3.3-dev"
        +                },
        +                "laravel": {
        +                    "providers": [
        +                        "Fideloper\\Proxy\\TrustedProxyServiceProvider"
        +                    ]
                         }
                     },
                     "autoload": {
        @@ -893,32 +957,78 @@
                         "proxy",
                         "trusted proxy"
                     ],
        -            "time": "2015-12-24 15:02:55"
        +            "time": "2017-06-15T17:19:42+00:00"
                 },
                 {
        -            "name": "guzzlehttp/guzzle",
        -            "version": "6.2.1",
        +            "name": "firebase/php-jwt",
        +            "version": "v4.0.0",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/guzzle/guzzle.git",
        -                "reference": "3f808fba627f2c5b69e2501217bf31af349c1427"
        +                "url": "https://github.com/firebase/php-jwt.git",
        +                "reference": "dccf163dc8ed7ed6a00afc06c51ee5186a428d35"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/3f808fba627f2c5b69e2501217bf31af349c1427",
        -                "reference": "3f808fba627f2c5b69e2501217bf31af349c1427",
        +                "url": "https://api.github.com/repos/firebase/php-jwt/zipball/dccf163dc8ed7ed6a00afc06c51ee5186a428d35",
        +                "reference": "dccf163dc8ed7ed6a00afc06c51ee5186a428d35",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.3.0"
        +            },
        +            "type": "library",
        +            "autoload": {
        +                "psr-4": {
        +                    "Firebase\\JWT\\": "src"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "BSD-3-Clause"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Neuman Vong",
        +                    "email": "neuman+pear@twilio.com",
        +                    "role": "Developer"
        +                },
        +                {
        +                    "name": "Anant Narayanan",
        +                    "email": "anant@php.net",
        +                    "role": "Developer"
        +                }
        +            ],
        +            "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
        +            "homepage": "https://github.com/firebase/php-jwt",
        +            "time": "2016-07-18T04:51:16+00:00"
        +        },
        +        {
        +            "name": "guzzlehttp/guzzle",
        +            "version": "6.3.0",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/guzzle/guzzle.git",
        +                "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699",
        +                "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
                         "shasum": ""
                     },
                     "require": {
                         "guzzlehttp/promises": "^1.0",
        -                "guzzlehttp/psr7": "^1.3.1",
        +                "guzzlehttp/psr7": "^1.4",
                         "php": ">=5.5"
                     },
                     "require-dev": {
                         "ext-curl": "*",
        -                "phpunit/phpunit": "^4.0",
        +                "phpunit/phpunit": "^4.0 || ^5.0",
                         "psr/log": "^1.0"
                     },
        +            "suggest": {
        +                "psr/log": "Required for using the Log middleware"
        +            },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        @@ -955,32 +1065,32 @@
                         "rest",
                         "web service"
                     ],
        -            "time": "2016-07-15 17:22:37"
        +            "time": "2017-06-22T18:50:49+00:00"
                 },
                 {
                     "name": "guzzlehttp/promises",
        -            "version": "1.2.0",
        +            "version": "v1.3.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/guzzle/promises.git",
        -                "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579"
        +                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/guzzle/promises/zipball/c10d860e2a9595f8883527fa0021c7da9e65f579",
        -                "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579",
        +                "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
        +                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.5.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~4.0"
        +                "phpunit/phpunit": "^4.0"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.0-dev"
        +                    "dev-master": "1.4-dev"
                         }
                     },
                     "autoload": {
        @@ -1006,20 +1116,20 @@
                     "keywords": [
                         "promise"
                     ],
        -            "time": "2016-05-18 16:56:05"
        +            "time": "2016-12-20T10:07:11+00:00"
                 },
                 {
                     "name": "guzzlehttp/psr7",
        -            "version": "1.3.1",
        +            "version": "1.4.2",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/guzzle/psr7.git",
        -                "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b"
        +                "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
        -                "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
        +                "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
        +                "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
                         "shasum": ""
                     },
                     "require": {
        @@ -1055,29 +1165,36 @@
                             "name": "Michael Dowling",
                             "email": "mtdowling@gmail.com",
                             "homepage": "https://github.com/mtdowling"
        +                },
        +                {
        +                    "name": "Tobias Schultze",
        +                    "homepage": "https://github.com/Tobion"
                         }
                     ],
        -            "description": "PSR-7 message implementation",
        +            "description": "PSR-7 message implementation that also provides common utility methods",
                     "keywords": [
                         "http",
                         "message",
        +                "request",
        +                "response",
                         "stream",
        -                "uri"
        +                "uri",
        +                "url"
                     ],
        -            "time": "2016-06-24 23:00:38"
        +            "time": "2017-03-20T17:10:46+00:00"
                 },
                 {
                     "name": "intervention/image",
        -            "version": "dev-master",
        +            "version": "2.4.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/Intervention/image.git",
        -                "reference": "45a41a38bd1e5290cd51ab773013e6f041b2b711"
        +                "reference": "322a4ade249467179c50a3e50eda8760ff3af2a3"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/Intervention/image/zipball/45a41a38bd1e5290cd51ab773013e6f041b2b711",
        -                "reference": "45a41a38bd1e5290cd51ab773013e6f041b2b711",
        +                "url": "https://api.github.com/repos/Intervention/image/zipball/322a4ade249467179c50a3e50eda8760ff3af2a3",
        +                "reference": "322a4ade249467179c50a3e50eda8760ff3af2a3",
                         "shasum": ""
                     },
                     "require": {
        @@ -1087,7 +1204,7 @@
                     },
                     "require-dev": {
                         "mockery/mockery": "~0.9.2",
        -                "phpunit/phpunit": "3.*"
        +                "phpunit/phpunit": "^4.8 || ^5.7"
                     },
                     "suggest": {
                         "ext-gd": "to use GD library based image processing.",
        @@ -1098,6 +1215,14 @@
                     "extra": {
                         "branch-alias": {
                             "dev-master": "2.3-dev"
        +                },
        +                "laravel": {
        +                    "providers": [
        +                        "Intervention\\Image\\ImageServiceProvider"
        +                    ],
        +                    "aliases": {
        +                        "Image": "Intervention\\Image\\Facades\\Image"
        +                    }
                         }
                     },
                     "autoload": {
        @@ -1112,8 +1237,8 @@
                     "authors": [
                         {
                             "name": "Oliver Vogel",
        -                    "email": "oliver@olivervogel.net",
        -                    "homepage": "http://olivervogel.net/"
        +                    "email": "oliver@olivervogel.com",
        +                    "homepage": "http://olivervogel.com/"
                         }
                     ],
                     "description": "Image handling and manipulation library with support for Laravel integration",
        @@ -1126,7 +1251,7 @@
                         "thumbnail",
                         "watermark"
                     ],
        -            "time": "2016-08-19 14:41:12"
        +            "time": "2017-07-03T15:50:40+00:00"
                 },
                 {
                     "name": "jakub-onderka/php-console-color",
        @@ -1169,7 +1294,7 @@
                             "homepage": "http://www.acci.cz"
                         }
                     ],
        -            "time": "2014-04-08 15:00:19"
        +            "time": "2014-04-08T15:00:19+00:00"
                 },
                 {
                     "name": "jakub-onderka/php-console-highlighter",
        @@ -1213,104 +1338,74 @@
                             "homepage": "http://www.acci.cz/"
                         }
                     ],
        -            "time": "2015-04-20 18:58:01"
        +            "time": "2015-04-20T18:58:01+00:00"
                 },
                 {
        -            "name": "jeremeamia/SuperClosure",
        -            "version": "2.2.0",
        +            "name": "javiereguiluz/easyslugger",
        +            "version": "v1.0.0",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/jeremeamia/super_closure.git",
        -                "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938"
        +                "url": "https://github.com/javiereguiluz/EasySlugger.git",
        +                "reference": "11524a3fd70e3f0c98043755a0ffa228f2529211"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/29a88be2a4846d27c1613aed0c9071dfad7b5938",
        -                "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938",
        +                "url": "https://api.github.com/repos/javiereguiluz/EasySlugger/zipball/11524a3fd70e3f0c98043755a0ffa228f2529211",
        +                "reference": "11524a3fd70e3f0c98043755a0ffa228f2529211",
                         "shasum": ""
                     },
                     "require": {
        -                "nikic/php-parser": "^1.2|^2.0",
        -                "php": ">=5.4",
        -                "symfony/polyfill-php56": "^1.0"
        -            },
        -            "require-dev": {
        -                "phpunit/phpunit": "^4.0|^5.0"
        +                "php": ">=5.3.3"
                     },
                     "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "2.2-dev"
        -                }
        -            },
                     "autoload": {
                         "psr-4": {
        -                    "SuperClosure\\": "src/"
        +                    "EasySlugger\\": "src/"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
                     "license": [
                         "MIT"
                     ],
        -            "authors": [
        -                {
        -                    "name": "Jeremy Lindblom",
        -                    "email": "jeremeamia@gmail.com",
        -                    "homepage": "https://github.com/jeremeamia",
        -                    "role": "Developer"
        -                }
        -            ],
        -            "description": "Serialize Closure objects, including their context and binding",
        -            "homepage": "https://github.com/jeremeamia/super_closure",
        -            "keywords": [
        -                "closure",
        -                "function",
        -                "lambda",
        -                "parser",
        -                "serializable",
        -                "serialize",
        -                "tokenizer"
        -            ],
        -            "time": "2015-12-05 17:17:57"
        +            "description": "A fast and easy to use slugger with full UTF-8 support.",
        +            "time": "2015-04-12T19:57:10+00:00"
                 },
                 {
                     "name": "laravel/framework",
        -            "version": "v5.2.45",
        +            "version": "v5.4.20",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/laravel/framework.git",
        -                "reference": "2a79f920d5584ec6df7cf996d922a742d11095d1"
        +                "reference": "851aad458bcc904178ded02954d55d36c2c35f8b"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/laravel/framework/zipball/2a79f920d5584ec6df7cf996d922a742d11095d1",
        -                "reference": "2a79f920d5584ec6df7cf996d922a742d11095d1",
        +                "url": "https://api.github.com/repos/laravel/framework/zipball/851aad458bcc904178ded02954d55d36c2c35f8b",
        +                "reference": "851aad458bcc904178ded02954d55d36c2c35f8b",
                         "shasum": ""
                     },
                     "require": {
        -                "classpreloader/classpreloader": "~3.0",
                         "doctrine/inflector": "~1.0",
        +                "erusev/parsedown": "~1.6",
                         "ext-mbstring": "*",
                         "ext-openssl": "*",
        -                "jeremeamia/superclosure": "~2.2",
                         "league/flysystem": "~1.0",
                         "monolog/monolog": "~1.11",
                         "mtdowling/cron-expression": "~1.0",
                         "nesbot/carbon": "~1.20",
        -                "paragonie/random_compat": "~1.4",
        -                "php": ">=5.5.9",
        -                "psy/psysh": "0.7.*",
        -                "swiftmailer/swiftmailer": "~5.1",
        -                "symfony/console": "2.8.*|3.0.*",
        -                "symfony/debug": "2.8.*|3.0.*",
        -                "symfony/finder": "2.8.*|3.0.*",
        -                "symfony/http-foundation": "2.8.*|3.0.*",
        -                "symfony/http-kernel": "2.8.*|3.0.*",
        -                "symfony/polyfill-php56": "~1.0",
        -                "symfony/process": "2.8.*|3.0.*",
        -                "symfony/routing": "2.8.*|3.0.*",
        -                "symfony/translation": "2.8.*|3.0.*",
        -                "symfony/var-dumper": "2.8.*|3.0.*",
        +                "paragonie/random_compat": "~1.4|~2.0",
        +                "php": ">=5.6.4",
        +                "ramsey/uuid": "~3.0",
        +                "swiftmailer/swiftmailer": "~5.4",
        +                "symfony/console": "~3.2",
        +                "symfony/debug": "~3.2",
        +                "symfony/finder": "~3.2",
        +                "symfony/http-foundation": "~3.2",
        +                "symfony/http-kernel": "~3.2",
        +                "symfony/process": "~3.2",
        +                "symfony/routing": "~3.2",
        +                "symfony/var-dumper": "~3.2",
        +                "tijsverkoyen/css-to-inline-styles": "~2.2",
                         "vlucas/phpdotenv": "~2.2"
                     },
                     "replace": {
        @@ -1332,6 +1427,7 @@
                         "illuminate/http": "self.version",
                         "illuminate/log": "self.version",
                         "illuminate/mail": "self.version",
        +                "illuminate/notifications": "self.version",
                         "illuminate/pagination": "self.version",
                         "illuminate/pipeline": "self.version",
                         "illuminate/queue": "self.version",
        @@ -1346,37 +1442,37 @@
                     },
                     "require-dev": {
                         "aws/aws-sdk-php": "~3.0",
        +                "doctrine/dbal": "~2.5",
                         "mockery/mockery": "~0.9.4",
                         "pda/pheanstalk": "~3.0",
        -                "phpunit/phpunit": "~4.1",
        +                "phpunit/phpunit": "~5.7",
                         "predis/predis": "~1.0",
        -                "symfony/css-selector": "2.8.*|3.0.*",
        -                "symfony/dom-crawler": "2.8.*|3.0.*"
        +                "symfony/css-selector": "~3.2",
        +                "symfony/dom-crawler": "~3.2"
                     },
                     "suggest": {
                         "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).",
        -                "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).",
        +                "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).",
                         "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).",
        -                "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).",
        +                "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).",
        +                "laravel/tinker": "Required to use the tinker console command (~1.0).",
                         "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).",
                         "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).",
        +                "nexmo/client": "Required to use the Nexmo transport (~1.0).",
                         "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).",
                         "predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
                         "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).",
        -                "symfony/css-selector": "Required to use some of the crawler integration testing tools (2.8.*|3.0.*).",
        -                "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*).",
        -                "symfony/psr-http-message-bridge": "Required to use psr7 bridging features (0.2.*)."
        +                "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.2).",
        +                "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.2).",
        +                "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)."
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "5.2-dev"
        +                    "dev-master": "5.4-dev"
                         }
                     },
                     "autoload": {
        -                "classmap": [
        -                    "src/Illuminate/Queue/IlluminateQueueClosure.php"
        -                ],
                         "files": [
                             "src/Illuminate/Foundation/helpers.php",
                             "src/Illuminate/Support/helpers.php"
        @@ -1392,43 +1488,170 @@
                     "authors": [
                         {
                             "name": "Taylor Otwell",
        -                    "email": "taylorotwell@gmail.com"
        +                    "email": "taylor@laravel.com"
                         }
                     ],
                     "description": "The Laravel Framework.",
        -            "homepage": "http://laravel.com",
        +            "homepage": "https://laravel.com",
                     "keywords": [
                         "framework",
                         "laravel"
                     ],
        -            "time": "2016-08-26 11:44:52"
        +            "time": "2017-04-27T13:04:35+00:00"
                 },
                 {
        -            "name": "laravelcollective/html",
        -            "version": "v5.2.4",
        +            "name": "laravel/passport",
        +            "version": "v1.0.18",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/LaravelCollective/html.git",
        -                "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5"
        +                "url": "https://github.com/laravel/passport.git",
        +                "reference": "f4ec49664be83f2a641cbfbb6d43cfb79f4aa95e"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/LaravelCollective/html/zipball/3a312d39ffe37da0f57b602618b61fd07c1fcec5",
        -                "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5",
        +                "url": "https://api.github.com/repos/laravel/passport/zipball/f4ec49664be83f2a641cbfbb6d43cfb79f4aa95e",
        +                "reference": "f4ec49664be83f2a641cbfbb6d43cfb79f4aa95e",
                         "shasum": ""
                     },
                     "require": {
        -                "illuminate/http": "5.2.*",
        -                "illuminate/routing": "5.2.*",
        -                "illuminate/session": "5.2.*",
        -                "illuminate/support": "5.2.*",
        -                "illuminate/view": "5.2.*",
        -                "php": ">=5.5.9"
        +                "firebase/php-jwt": "~3.0|~4.0",
        +                "guzzlehttp/guzzle": "~6.0",
        +                "illuminate/auth": "~5.3",
        +                "illuminate/console": "~5.3",
        +                "illuminate/container": "~5.3",
        +                "illuminate/contracts": "~5.3",
        +                "illuminate/database": "~5.3",
        +                "illuminate/encryption": "~5.3",
        +                "illuminate/http": "~5.3",
        +                "illuminate/support": "~5.3",
        +                "league/oauth2-server": "~5.0",
        +                "php": ">=5.6.4",
        +                "phpseclib/phpseclib": "^2.0",
        +                "symfony/psr-http-message-bridge": "~1.0",
        +                "zendframework/zend-diactoros": "~1.0"
                     },
                     "require-dev": {
        -                "illuminate/database": "5.2.*",
                         "mockery/mockery": "~0.9",
        -                "phpunit/phpunit": "~4.0"
        +                "phpunit/phpunit": "~5.0"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Laravel\\Passport\\": "src/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Taylor Otwell",
        +                    "email": "taylor@laravel.com"
        +                }
        +            ],
        +            "description": "Laravel Passport provides OAuth2 server support to Laravel.",
        +            "keywords": [
        +                "laravel",
        +                "oauth",
        +                "passport"
        +            ],
        +            "time": "2017-07-12T20:03:53+00:00"
        +        },
        +        {
        +            "name": "laravel/tinker",
        +            "version": "v1.0.2",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/laravel/tinker.git",
        +                "reference": "203978fd67f118902acff95925847e70b72e3daf"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/laravel/tinker/zipball/203978fd67f118902acff95925847e70b72e3daf",
        +                "reference": "203978fd67f118902acff95925847e70b72e3daf",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "illuminate/console": "~5.1",
        +                "illuminate/contracts": "~5.1",
        +                "illuminate/support": "~5.1",
        +                "php": ">=5.5.9",
        +                "psy/psysh": "0.7.*|0.8.*",
        +                "symfony/var-dumper": "~3.0"
        +            },
        +            "require-dev": {
        +                "phpunit/phpunit": "~4.0|~5.0"
        +            },
        +            "suggest": {
        +                "illuminate/database": "The Illuminate Database package (~5.1)."
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0-dev"
        +                },
        +                "laravel": {
        +                    "providers": [
        +                        "Laravel\\Tinker\\TinkerServiceProvider"
        +                    ]
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Laravel\\Tinker\\": "src/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Taylor Otwell",
        +                    "email": "taylor@laravel.com"
        +                }
        +            ],
        +            "description": "Powerful REPL for the Laravel framework.",
        +            "keywords": [
        +                "REPL",
        +                "Tinker",
        +                "laravel",
        +                "psysh"
        +            ],
        +            "time": "2017-07-13T13:11:05+00:00"
        +        },
        +        {
        +            "name": "laravelcollective/html",
        +            "version": "v5.4.8",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/LaravelCollective/html.git",
        +                "reference": "9b8f51e7a2368911c896f5d42757886bae0717b5"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/LaravelCollective/html/zipball/9b8f51e7a2368911c896f5d42757886bae0717b5",
        +                "reference": "9b8f51e7a2368911c896f5d42757886bae0717b5",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "illuminate/http": "5.4.*",
        +                "illuminate/routing": "5.4.*",
        +                "illuminate/session": "5.4.*",
        +                "illuminate/support": "5.4.*",
        +                "illuminate/view": "5.4.*",
        +                "php": ">=5.6.4"
        +            },
        +            "require-dev": {
        +                "illuminate/database": "5.4.*",
        +                "mockery/mockery": "~0.9.4",
        +                "phpunit/phpunit": "~5.4"
                     },
                     "type": "library",
                     "autoload": {
        @@ -1455,34 +1678,92 @@
                     ],
                     "description": "HTML and Form Builders for the Laravel Framework",
                     "homepage": "http://laravelcollective.com",
        -            "time": "2016-01-27 22:29:54"
        +            "time": "2017-05-22T06:35:07+00:00"
                 },
                 {
        -            "name": "league/csv",
        -            "version": "7.2.0",
        +            "name": "lcobucci/jwt",
        +            "version": "3.2.1",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/thephpleague/csv.git",
        -                "reference": "69bafa6ff924fbf9effe4275d6eb16be81a853ef"
        +                "url": "https://github.com/lcobucci/jwt.git",
        +                "reference": "ddce703826f9c5229781933b1a39069e38e6a0f3"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/thephpleague/csv/zipball/69bafa6ff924fbf9effe4275d6eb16be81a853ef",
        -                "reference": "69bafa6ff924fbf9effe4275d6eb16be81a853ef",
        +                "url": "https://api.github.com/repos/lcobucci/jwt/zipball/ddce703826f9c5229781933b1a39069e38e6a0f3",
        +                "reference": "ddce703826f9c5229781933b1a39069e38e6a0f3",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "ext-openssl": "*",
        +                "php": ">=5.5"
        +            },
        +            "require-dev": {
        +                "mdanter/ecc": "~0.3.1",
        +                "mikey179/vfsstream": "~1.5",
        +                "phpmd/phpmd": "~2.2",
        +                "phpunit/php-invoker": "~1.1",
        +                "phpunit/phpunit": "~4.5",
        +                "squizlabs/php_codesniffer": "~2.3"
        +            },
        +            "suggest": {
        +                "mdanter/ecc": "Required to use Elliptic Curves based algorithms."
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "3.1-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Lcobucci\\JWT\\": "src"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "BSD-3-Clause"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Luís Otávio Cobucci Oblonczyk",
        +                    "email": "lcobucci@gmail.com",
        +                    "role": "Developer"
        +                }
        +            ],
        +            "description": "A simple library to work with JSON Web Token and JSON Web Signature",
        +            "keywords": [
        +                "JWS",
        +                "jwt"
        +            ],
        +            "time": "2016-10-31T20:09:32+00:00"
        +        },
        +        {
        +            "name": "league/csv",
        +            "version": "8.2.2",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/thephpleague/csv.git",
        +                "reference": "fa8bc05f64eb6c66b96edfaf60648f022ecb5f55"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/thephpleague/csv/zipball/fa8bc05f64eb6c66b96edfaf60648f022ecb5f55",
        +                "reference": "fa8bc05f64eb6c66b96edfaf60648f022ecb5f55",
                         "shasum": ""
                     },
                     "require": {
                         "ext-mbstring": "*",
        -                "php": ">=5.4.0"
        +                "php": ">=5.5.0"
                     },
                     "require-dev": {
        -                "fabpot/php-cs-fixer": "^1.9",
        +                "friendsofphp/php-cs-fixer": "^1.9",
                         "phpunit/phpunit": "^4.0"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "7.2-dev"
        +                    "dev-master": "8.2-dev"
                         }
                     },
                     "autoload": {
        @@ -1512,25 +1793,75 @@
                         "read",
                         "write"
                     ],
        -            "time": "2015-11-02 07:36:25"
        +            "time": "2017-07-12T07:18:20+00:00"
                 },
                 {
        -            "name": "league/flysystem",
        -            "version": "1.0.27",
        +            "name": "league/event",
        +            "version": "2.1.2",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/thephpleague/flysystem.git",
        -                "reference": "50e2045ed70a7e75a5e30bc3662904f3b67af8a9"
        +                "url": "https://github.com/thephpleague/event.git",
        +                "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/50e2045ed70a7e75a5e30bc3662904f3b67af8a9",
        -                "reference": "50e2045ed70a7e75a5e30bc3662904f3b67af8a9",
        +                "url": "https://api.github.com/repos/thephpleague/event/zipball/e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd",
        +                "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.4.0"
                     },
        +            "require-dev": {
        +                "henrikbjorn/phpspec-code-coverage": "~1.0.1",
        +                "phpspec/phpspec": "~2.0.0"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "2.2-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "League\\Event\\": "src/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Frank de Jonge",
        +                    "email": "info@frenky.net"
        +                }
        +            ],
        +            "description": "Event package",
        +            "keywords": [
        +                "emitter",
        +                "event",
        +                "listener"
        +            ],
        +            "time": "2015-05-21T12:24:47+00:00"
        +        },
        +        {
        +            "name": "league/flysystem",
        +            "version": "1.0.41",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/thephpleague/flysystem.git",
        +                "reference": "f400aa98912c561ba625ea4065031b7a41e5a155"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f400aa98912c561ba625ea4065031b7a41e5a155",
        +                "reference": "f400aa98912c561ba625ea4065031b7a41e5a155",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.5.9"
        +            },
                     "conflict": {
                         "league/flysystem-sftp": "<1.0.6"
                     },
        @@ -1546,13 +1877,13 @@
                         "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
                         "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
                         "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
        -                "league/flysystem-copy": "Allows you to use Copy.com storage",
        -                "league/flysystem-dropbox": "Allows you to use Dropbox storage",
                         "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
                         "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
                         "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
                         "league/flysystem-webdav": "Allows you to use WebDAV storage",
        -                "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter"
        +                "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
        +                "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
        +                "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
                     },
                     "type": "library",
                     "extra": {
        @@ -1595,34 +1926,110 @@
                         "sftp",
                         "storage"
                     ],
        -            "time": "2016-08-10 08:55:11"
        +            "time": "2017-08-06T17:41:04+00:00"
                 },
                 {
        -            "name": "maknz/slack",
        -            "version": "dev-master",
        +            "name": "league/oauth2-server",
        +            "version": "5.1.5",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/maknz/slack.git",
        -                "reference": "e9bab77eb7344f4697756ca55386576b05dc8e5a"
        +                "url": "https://github.com/thephpleague/oauth2-server.git",
        +                "reference": "8e5df6d6286d0010861a708b70f00345d074bce9"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/maknz/slack/zipball/e9bab77eb7344f4697756ca55386576b05dc8e5a",
        -                "reference": "e9bab77eb7344f4697756ca55386576b05dc8e5a",
        +                "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/8e5df6d6286d0010861a708b70f00345d074bce9",
        +                "reference": "8e5df6d6286d0010861a708b70f00345d074bce9",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "defuse/php-encryption": "^2.1",
        +                "ext-openssl": "*",
        +                "lcobucci/jwt": "^3.1",
        +                "league/event": "^2.1",
        +                "paragonie/random_compat": "^2.0",
        +                "php": ">=5.5.9",
        +                "psr/http-message": "^1.0"
        +            },
        +            "replace": {
        +                "league/oauth2server": "*",
        +                "lncd/oauth2": "*"
        +            },
        +            "require-dev": {
        +                "indigophp/hash-compat": "^1.1",
        +                "phpunit/phpunit": "^4.8 || ^5.0",
        +                "zendframework/zend-diactoros": "^1.0"
        +            },
        +            "suggest": {
        +                "indigophp/hash-compat": "Polyfill for hash_equals function for PHP 5.5"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-V5-WIP": "5.0-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "League\\OAuth2\\Server\\": "src/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Alex Bilbie",
        +                    "email": "hello@alexbilbie.com",
        +                    "homepage": "http://www.alexbilbie.com",
        +                    "role": "Developer"
        +                }
        +            ],
        +            "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.",
        +            "homepage": "https://oauth2.thephpleague.com/",
        +            "keywords": [
        +                "Authentication",
        +                "api",
        +                "auth",
        +                "authorisation",
        +                "authorization",
        +                "oauth",
        +                "oauth 2",
        +                "oauth 2.0",
        +                "oauth2",
        +                "protect",
        +                "resource",
        +                "secure",
        +                "server"
        +            ],
        +            "time": "2017-07-11T06:31:36+00:00"
        +        },
        +        {
        +            "name": "maknz/slack",
        +            "version": "1.7.0",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/maknz/slack.git",
        +                "reference": "7f21fefc70c76b304adc1b3a780c8740dfcfb595"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/maknz/slack/zipball/7f21fefc70c76b304adc1b3a780c8740dfcfb595",
        +                "reference": "7f21fefc70c76b304adc1b3a780c8740dfcfb595",
                         "shasum": ""
                     },
                     "require": {
                         "ext-mbstring": "*",
                         "guzzlehttp/guzzle": "~6.0|~5.0|~4.0",
        -                "php": ">=5.5.0"
        +                "php": ">=5.4.0"
                     },
                     "require-dev": {
                         "mockery/mockery": "0.9.*",
                         "phpunit/phpunit": "4.2.*"
                     },
                     "suggest": {
        -                "maknz/slack-laravel": "Required for Laravel support",
        -                "nexylan/slack-bundle": "Required for Symfony bundle support"
        +                "illuminate/support": "Required for Laravel support"
                     },
                     "type": "library",
                     "autoload": {
        @@ -1640,25 +2047,25 @@
                             "email": "github@mak.geek.nz"
                         }
                     ],
        -            "description": "A simple PHP package for sending messages to Slack, with a focus on ease of use and elegant syntax.",
        +            "description": "A simple PHP package for sending messages to Slack, with a focus on ease of use and elegant syntax. Includes Laravel support out of the box.",
                     "keywords": [
                         "laravel",
                         "slack"
                     ],
        -            "time": "2016-07-27 23:17:40"
        +            "time": "2015-06-03T03:35:16+00:00"
                 },
                 {
                     "name": "maximebf/debugbar",
        -            "version": "v1.12.0",
        +            "version": "1.13.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/maximebf/php-debugbar.git",
        -                "reference": "e634fbd32cd6bc3fa0e8c972b52d4bf49bab3988"
        +                "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/e634fbd32cd6bc3fa0e8c972b52d4bf49bab3988",
        -                "reference": "e634fbd32cd6bc3fa0e8c972b52d4bf49bab3988",
        +                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/afee79a236348e39a44cb837106b7c5b4897ac2a",
        +                "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a",
                         "shasum": ""
                     },
                     "require": {
        @@ -1677,7 +2084,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.12-dev"
        +                    "dev-master": "1.13-dev"
                         }
                     },
                     "autoload": {
        @@ -1706,65 +2113,20 @@
                         "debug",
                         "debugbar"
                     ],
        -            "time": "2016-05-15 13:11:34"
        -        },
        -        {
        -            "name": "misterphilip/maintenance-mode",
        -            "version": "1.0.2",
        -            "source": {
        -                "type": "git",
        -                "url": "https://github.com/MisterPhilip/maintenance-mode.git",
        -                "reference": "35e061703edb3c0703baea677335c03085f2b179"
        -            },
        -            "dist": {
        -                "type": "zip",
        -                "url": "https://api.github.com/repos/MisterPhilip/maintenance-mode/zipball/35e061703edb3c0703baea677335c03085f2b179",
        -                "reference": "35e061703edb3c0703baea677335c03085f2b179",
        -                "shasum": ""
        -            },
        -            "require": {
        -                "illuminate/support": "5.0 - 5.2",
        -                "nesbot/carbon": "~1.19",
        -                "php": ">=5.4.0"
        -            },
        -            "type": "library",
        -            "autoload": {
        -                "psr-0": {
        -                    "MisterPhilip\\MaintenanceMode": "src/"
        -                }
        -            },
        -            "notification-url": "https://packagist.org/downloads/",
        -            "license": [
        -                "MIT"
        -            ],
        -            "authors": [
        -                {
        -                    "name": "Philip Lawrence",
        -                    "email": "philip@misterphilip.com",
        -                    "homepage": "http://misterphilip.com"
        -                }
        -            ],
        -            "description": "An enhanced drop-in replacement for Laravel 5's maintenance mode",
        -            "keywords": [
        -                "l5",
        -                "laravel",
        -                "laravel5",
        -                "maintenance"
        -            ],
        -            "time": "2015-12-23 07:24:42"
        +            "time": "2017-01-05T08:46:19+00:00"
                 },
                 {
                     "name": "monolog/monolog",
        -            "version": "1.21.0",
        +            "version": "1.23.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/Seldaek/monolog.git",
        -                "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952"
        +                "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f42fbdfd53e306bda545845e4dbfd3e72edb4952",
        -                "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952",
        +                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
        +                "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
                         "shasum": ""
                     },
                     "require": {
        @@ -1775,7 +2137,7 @@
                         "psr/log-implementation": "1.0.0"
                     },
                     "require-dev": {
        -                "aws/aws-sdk-php": "^2.4.9",
        +                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
                         "doctrine/couchdb": "~1.0@dev",
                         "graylog2/gelf-php": "~1.0",
                         "jakub-onderka/php-parallel-lint": "0.9",
        @@ -1785,7 +2147,7 @@
                         "phpunit/phpunit-mock-objects": "2.3.0",
                         "ruflin/elastica": ">=0.90 <3.0",
                         "sentry/sentry": "^0.13",
        -                "swiftmailer/swiftmailer": "~5.3"
        +                "swiftmailer/swiftmailer": "^5.3|^6.0"
                     },
                     "suggest": {
                         "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
        @@ -1829,20 +2191,20 @@
                         "logging",
                         "psr-3"
                     ],
        -            "time": "2016-07-29 03:23:52"
        +            "time": "2017-06-19T01:22:40+00:00"
                 },
                 {
                     "name": "mtdowling/cron-expression",
        -            "version": "v1.1.0",
        +            "version": "v1.2.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/mtdowling/cron-expression.git",
        -                "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5"
        +                "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5",
        -                "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5",
        +                "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad",
        +                "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad",
                         "shasum": ""
                     },
                     "require": {
        @@ -1853,8 +2215,8 @@
                     },
                     "type": "library",
                     "autoload": {
        -                "psr-0": {
        -                    "Cron": "src/"
        +                "psr-4": {
        +                    "Cron\\": "src/Cron/"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
        @@ -1873,20 +2235,20 @@
                         "cron",
                         "schedule"
                     ],
        -            "time": "2016-01-26 21:23:30"
        +            "time": "2017-01-23T04:29:33+00:00"
                 },
                 {
                     "name": "mtdowling/jmespath.php",
        -            "version": "2.3.0",
        +            "version": "2.4.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/jmespath/jmespath.php.git",
        -                "reference": "192f93e43c2c97acde7694993ab171b3de284093"
        +                "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/192f93e43c2c97acde7694993ab171b3de284093",
        -                "reference": "192f93e43c2c97acde7694993ab171b3de284093",
        +                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
        +                "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
                         "shasum": ""
                     },
                     "require": {
        @@ -1928,20 +2290,20 @@
                         "json",
                         "jsonpath"
                     ],
        -            "time": "2016-01-05 18:25:05"
        +            "time": "2016-12-03T22:08:25+00:00"
                 },
                 {
                     "name": "neitanod/forceutf8",
        -            "version": "dev-master",
        +            "version": "v2.0.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/neitanod/forceutf8.git",
        -                "reference": "2c1b21e00ed16b2b083ae4e27901cb5f2856db90"
        +                "reference": "47c883ab2739e7938a8bb0bfd1c29d48c88858de"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/neitanod/forceutf8/zipball/2c1b21e00ed16b2b083ae4e27901cb5f2856db90",
        -                "reference": "2c1b21e00ed16b2b083ae4e27901cb5f2856db90",
        +                "url": "https://api.github.com/repos/neitanod/forceutf8/zipball/47c883ab2739e7938a8bb0bfd1c29d48c88858de",
        +                "reference": "47c883ab2739e7938a8bb0bfd1c29d48c88858de",
                         "shasum": ""
                     },
                     "require": {
        @@ -1962,30 +2324,36 @@
                     ],
                     "description": "PHP Class Encoding featuring popular Encoding::toUTF8() function --formerly known as forceUTF8()-- that fixes mixed encoded strings.",
                     "homepage": "https://github.com/neitanod/forceutf8",
        -            "time": "2015-05-07 16:37:23"
        +            "time": "2017-05-22T18:50:57+00:00"
                 },
                 {
                     "name": "nesbot/carbon",
        -            "version": "1.21.0",
        +            "version": "1.22.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/briannesbitt/Carbon.git",
        -                "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7"
        +                "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7b08ec6f75791e130012f206e3f7b0e76e18e3d7",
        -                "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7",
        +                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
        +                "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.3.0",
        -                "symfony/translation": "~2.6|~3.0"
        +                "symfony/translation": "~2.6 || ~3.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~4.0|~5.0"
        +                "friendsofphp/php-cs-fixer": "~2",
        +                "phpunit/phpunit": "~4.0 || ~5.0"
                     },
                     "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.23-dev"
        +                }
        +            },
                     "autoload": {
                         "psr-4": {
                             "Carbon\\": "src/Carbon/"
        @@ -2009,28 +2377,28 @@
                         "datetime",
                         "time"
                     ],
        -            "time": "2015-11-04 20:07:17"
        +            "time": "2017-01-16T07:55:07+00:00"
                 },
                 {
                     "name": "nikic/php-parser",
        -            "version": "v2.1.0",
        +            "version": "v3.1.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/nikic/PHP-Parser.git",
        -                "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3"
        +                "reference": "4d4896e553f2094e657fe493506dc37c509d4e2b"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/47b254ea51f1d6d5dc04b9b299e88346bf2369e3",
        -                "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3",
        +                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4d4896e553f2094e657fe493506dc37c509d4e2b",
        +                "reference": "4d4896e553f2094e657fe493506dc37c509d4e2b",
                         "shasum": ""
                     },
                     "require": {
                         "ext-tokenizer": "*",
        -                "php": ">=5.4"
        +                "php": ">=5.5"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~4.0"
        +                "phpunit/phpunit": "~4.0|~5.0"
                     },
                     "bin": [
                         "bin/php-parse"
        @@ -2038,7 +2406,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "2.1-dev"
        +                    "dev-master": "3.0-dev"
                         }
                     },
                     "autoload": {
        @@ -2060,20 +2428,20 @@
                         "parser",
                         "php"
                     ],
        -            "time": "2016-04-19 13:41:41"
        +            "time": "2017-07-28T14:45:09+00:00"
                 },
                 {
                     "name": "paragonie/random_compat",
        -            "version": "v1.4.1",
        +            "version": "v2.0.10",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/paragonie/random_compat.git",
        -                "reference": "c7e26a21ba357863de030f0b9e701c7d04593774"
        +                "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774",
        -                "reference": "c7e26a21ba357863de030f0b9e701c7d04593774",
        +                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d",
        +                "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d",
                         "shasum": ""
                     },
                     "require": {
        @@ -2108,7 +2476,158 @@
                         "pseudorandom",
                         "random"
                     ],
        -            "time": "2016-03-18 20:34:03"
        +            "time": "2017-03-13T16:27:32+00:00"
        +        },
        +        {
        +            "name": "patchwork/utf8",
        +            "version": "v1.3.1",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/tchwork/utf8.git",
        +                "reference": "30ec6451aec7d2536f0af8fe535f70c764f2c47a"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/tchwork/utf8/zipball/30ec6451aec7d2536f0af8fe535f70c764f2c47a",
        +                "reference": "30ec6451aec7d2536f0af8fe535f70c764f2c47a",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "lib-pcre": ">=7.3",
        +                "php": ">=5.3.0"
        +            },
        +            "suggest": {
        +                "ext-iconv": "Use iconv for best performance",
        +                "ext-intl": "Use Intl for best performance",
        +                "ext-mbstring": "Use Mbstring for best performance",
        +                "ext-wfio": "Use WFIO for UTF-8 filesystem access on Windows"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.3-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Patchwork\\": "src/Patchwork/"
        +                },
        +                "classmap": [
        +                    "src/Normalizer.php"
        +                ]
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "(Apache-2.0 or GPL-2.0)"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Nicolas Grekas",
        +                    "email": "p@tchwork.com"
        +                }
        +            ],
        +            "description": "Portable and performant UTF-8, Unicode and Grapheme Clusters for PHP",
        +            "homepage": "https://github.com/tchwork/utf8",
        +            "keywords": [
        +                "grapheme",
        +                "i18n",
        +                "unicode",
        +                "utf-8",
        +                "utf8"
        +            ],
        +            "time": "2016-05-18T13:57:10+00:00"
        +        },
        +        {
        +            "name": "phpseclib/phpseclib",
        +            "version": "2.0.6",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/phpseclib/phpseclib.git",
        +                "reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34a7699e6f31b1ef4035ee36444407cecf9f56aa",
        +                "reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.3.3"
        +            },
        +            "require-dev": {
        +                "phing/phing": "~2.7",
        +                "phpunit/phpunit": "~4.0",
        +                "sami/sami": "~2.0",
        +                "squizlabs/php_codesniffer": "~2.0"
        +            },
        +            "suggest": {
        +                "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
        +                "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
        +                "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
        +                "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
        +            },
        +            "type": "library",
        +            "autoload": {
        +                "files": [
        +                    "phpseclib/bootstrap.php"
        +                ],
        +                "psr-4": {
        +                    "phpseclib\\": "phpseclib/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Jim Wigginton",
        +                    "email": "terrafrost@php.net",
        +                    "role": "Lead Developer"
        +                },
        +                {
        +                    "name": "Patrick Monnerat",
        +                    "email": "pm@datasphere.ch",
        +                    "role": "Developer"
        +                },
        +                {
        +                    "name": "Andreas Fischer",
        +                    "email": "bantu@phpbb.com",
        +                    "role": "Developer"
        +                },
        +                {
        +                    "name": "Hans-Jürgen Petrich",
        +                    "email": "petrich@tronic-media.com",
        +                    "role": "Developer"
        +                },
        +                {
        +                    "name": "Graham Campbell",
        +                    "email": "graham@alt-three.com",
        +                    "role": "Developer"
        +                }
        +            ],
        +            "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
        +            "homepage": "http://phpseclib.sourceforge.net",
        +            "keywords": [
        +                "BigInteger",
        +                "aes",
        +                "asn.1",
        +                "asn1",
        +                "blowfish",
        +                "crypto",
        +                "cryptography",
        +                "encryption",
        +                "rsa",
        +                "security",
        +                "sftp",
        +                "signature",
        +                "signing",
        +                "ssh",
        +                "twofish",
        +                "x.509",
        +                "x509"
        +            ],
        +            "time": "2017-06-05T06:31:10+00:00"
                 },
                 {
                     "name": "pragmarx/google2fa",
        @@ -2169,7 +2688,7 @@
                         "google2fa",
                         "laravel"
                     ],
        -            "time": "2016-07-18 20:25:04"
        +            "time": "2016-07-18T20:25:04+00:00"
                 },
                 {
                     "name": "psr/http-message",
        @@ -2219,26 +2738,34 @@
                         "request",
                         "response"
                     ],
        -            "time": "2016-08-06 14:39:51"
        +            "time": "2016-08-06T14:39:51+00:00"
                 },
                 {
                     "name": "psr/log",
        -            "version": "1.0.0",
        +            "version": "1.0.2",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/php-fig/log.git",
        -                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
        +                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
        -                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
        +                "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
        +                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
                         "shasum": ""
                     },
        +            "require": {
        +                "php": ">=5.3.0"
        +            },
                     "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0.x-dev"
        +                }
        +            },
                     "autoload": {
        -                "psr-0": {
        -                    "Psr\\Log\\": ""
        +                "psr-4": {
        +                    "Psr\\Log\\": "Psr/Log/"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
        @@ -2252,46 +2779,48 @@
                         }
                     ],
                     "description": "Common interface for logging libraries",
        +            "homepage": "https://github.com/php-fig/log",
                     "keywords": [
                         "log",
                         "psr",
                         "psr-3"
                     ],
        -            "time": "2012-12-21 11:40:51"
        +            "time": "2016-10-10T12:19:37+00:00"
                 },
                 {
                     "name": "psy/psysh",
        -            "version": "v0.7.2",
        +            "version": "v0.8.11",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/bobthecow/psysh.git",
        -                "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280"
        +                "reference": "b193cd020e8c6b66cea6457826ae005e94e6d2c0"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280",
        -                "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280",
        +                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b193cd020e8c6b66cea6457826ae005e94e6d2c0",
        +                "reference": "b193cd020e8c6b66cea6457826ae005e94e6d2c0",
                         "shasum": ""
                     },
                     "require": {
                         "dnoegel/php-xdg-base-dir": "0.1",
                         "jakub-onderka/php-console-highlighter": "0.3.*",
        -                "nikic/php-parser": "^1.2.1|~2.0",
        +                "nikic/php-parser": "~1.3|~2.0|~3.0",
                         "php": ">=5.3.9",
                         "symfony/console": "~2.3.10|^2.4.2|~3.0",
                         "symfony/var-dumper": "~2.7|~3.0"
                     },
                     "require-dev": {
        -                "fabpot/php-cs-fixer": "~1.5",
        -                "phpunit/phpunit": "~3.7|~4.0|~5.0",
        -                "squizlabs/php_codesniffer": "~2.0",
        +                "friendsofphp/php-cs-fixer": "~1.11",
        +                "hoa/console": "~3.16|~1.14",
        +                "phpunit/phpunit": "~4.4|~5.0",
                         "symfony/finder": "~2.1|~3.0"
                     },
                     "suggest": {
                         "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
                         "ext-pdo-sqlite": "The doc command requires SQLite to work.",
                         "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
        -                "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history."
        +                "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
        +                "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
                     },
                     "bin": [
                         "bin/psysh"
        @@ -2329,7 +2858,139 @@
                         "interactive",
                         "shell"
                     ],
        -            "time": "2016-03-09 05:03:14"
        +            "time": "2017-07-29T19:30:02+00:00"
        +        },
        +        {
        +            "name": "ramsey/uuid",
        +            "version": "3.7.0",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/ramsey/uuid.git",
        +                "reference": "0ef23d1b10cf1bc576e9d865a7e9c47982c5715e"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/ramsey/uuid/zipball/0ef23d1b10cf1bc576e9d865a7e9c47982c5715e",
        +                "reference": "0ef23d1b10cf1bc576e9d865a7e9c47982c5715e",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "paragonie/random_compat": "^1.0|^2.0",
        +                "php": "^5.4 || ^7.0"
        +            },
        +            "replace": {
        +                "rhumsaa/uuid": "self.version"
        +            },
        +            "require-dev": {
        +                "apigen/apigen": "^4.1",
        +                "codeception/aspect-mock": "^1.0 | ^2.0",
        +                "doctrine/annotations": "~1.2.0",
        +                "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1",
        +                "ircmaxell/random-lib": "^1.1",
        +                "jakub-onderka/php-parallel-lint": "^0.9.0",
        +                "mockery/mockery": "^0.9.4",
        +                "moontoast/math": "^1.1",
        +                "php-mock/php-mock-phpunit": "^0.3|^1.1",
        +                "phpunit/phpunit": "^4.7|>=5.0 <5.4",
        +                "satooshi/php-coveralls": "^0.6.1",
        +                "squizlabs/php_codesniffer": "^2.3"
        +            },
        +            "suggest": {
        +                "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
        +                "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
        +                "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
        +                "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).",
        +                "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid",
        +                "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "3.x-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Ramsey\\Uuid\\": "src/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Marijn Huizendveld",
        +                    "email": "marijn.huizendveld@gmail.com"
        +                },
        +                {
        +                    "name": "Thibaud Fabre",
        +                    "email": "thibaud@aztech.io"
        +                },
        +                {
        +                    "name": "Ben Ramsey",
        +                    "email": "ben@benramsey.com",
        +                    "homepage": "https://benramsey.com"
        +                }
        +            ],
        +            "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).",
        +            "homepage": "https://github.com/ramsey/uuid",
        +            "keywords": [
        +                "guid",
        +                "identifier",
        +                "uuid"
        +            ],
        +            "time": "2017-08-04T13:39:04+00:00"
        +        },
        +        {
        +            "name": "schuppo/password-strength",
        +            "version": "v1.9",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/schuppo/PasswordStrengthPackage.git",
        +                "reference": "184d65517eb438651b491b116df8895238005b79"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/schuppo/PasswordStrengthPackage/zipball/184d65517eb438651b491b116df8895238005b79",
        +                "reference": "184d65517eb438651b491b116df8895238005b79",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "illuminate/support": "~5.0",
        +                "illuminate/translation": "^5.1",
        +                "php": ">=5.4.0"
        +            },
        +            "require-dev": {
        +                "illuminate/validation": "~5.0",
        +                "phpunit/phpunit": "^4.8"
        +            },
        +            "type": "library",
        +            "autoload": {
        +                "psr-0": {
        +                    "Schuppo\\PasswordStrength": "src/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Oliver Schupp",
        +                    "email": "oliver.schupp@yahoo.de"
        +                }
        +            ],
        +            "description": "This package provides a validator for ensuring strong passwords in Laravel 4 applications.",
        +            "keywords": [
        +                "laravel",
        +                "laravel 5",
        +                "laravel5",
        +                "password",
        +                "password strength",
        +                "validation"
        +            ],
        +            "time": "2016-10-05T09:57:59+00:00"
                 },
                 {
                     "name": "spatie/db-dumper",
        @@ -2379,26 +3040,26 @@
                         "mysqldump",
                         "spatie"
                     ],
        -            "time": "2016-06-14 13:23:01"
        +            "time": "2016-06-14T13:23:01+00:00"
                 },
                 {
                     "name": "spatie/laravel-backup",
        -            "version": "3.8.1",
        +            "version": "3.11.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/spatie/laravel-backup.git",
        -                "reference": "08b7b8c778d5aeb0179cc49da4f64415bab9f81f"
        +                "reference": "2382532ce52e3929ccb0e930539d14dfd09d22eb"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/08b7b8c778d5aeb0179cc49da4f64415bab9f81f",
        -                "reference": "08b7b8c778d5aeb0179cc49da4f64415bab9f81f",
        +                "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/2382532ce52e3929ccb0e930539d14dfd09d22eb",
        +                "reference": "2382532ce52e3929ccb0e930539d14dfd09d22eb",
                         "shasum": ""
                     },
                     "require": {
        -                "illuminate/console": "^5.1",
        -                "illuminate/filesystem": "^5.1.20",
        -                "illuminate/support": "^5.1",
        +                "illuminate/console": "~5.1.0|~5.2.0|~5.3.0|~5.4.0",
        +                "illuminate/filesystem": "~5.1.20|~5.2.0|~5.3.0|~5.4.0",
        +                "illuminate/support": "~5.1.0|~5.2.0|~5.3.0|~5.4.0",
                         "league/flysystem": "^1.0.8",
                         "php": "^5.5|^7.0",
                         "spatie/db-dumper": "^1.3",
        @@ -2410,6 +3071,7 @@
                         "phpunit/phpunit": "^4.8"
                     },
                     "suggest": {
        +                "irazasyed/telegram-bot-sdk": "Allows notifications to be sent using Telegram Bot",
                         "maknz/slack": "Allows notifications to be sent via Slack"
                     },
                     "type": "library",
        @@ -2441,27 +3103,28 @@
                         "laravel-backup",
                         "spatie"
                     ],
        -            "time": "2016-07-06 15:30:58"
        +            "time": "2017-02-18T09:54:12+00:00"
                 },
                 {
                     "name": "swiftmailer/swiftmailer",
        -            "version": "v5.4.3",
        +            "version": "v5.4.8",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/swiftmailer/swiftmailer.git",
        -                "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153"
        +                "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/4cc92842069c2bbc1f28daaaf1d2576ec4dfe153",
        -                "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153",
        +                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517",
        +                "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.3.3"
                     },
                     "require-dev": {
        -                "mockery/mockery": "~0.9.1"
        +                "mockery/mockery": "~0.9.1",
        +                "symfony/phpunit-bridge": "~3.2"
                     },
                     "type": "library",
                     "extra": {
        @@ -2494,40 +3157,49 @@
                         "mail",
                         "mailer"
                     ],
        -            "time": "2016-07-08 11:51:25"
        +            "time": "2017-05-01T15:54:03+00:00"
                 },
                 {
                     "name": "symfony/console",
        -            "version": "v3.0.9",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/console.git",
        -                "reference": "926061e74229e935d3c5b4e9ba87237316c6693f"
        +                "reference": "b0878233cb5c4391347e5495089c7af11b8e6201"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/console/zipball/926061e74229e935d3c5b4e9ba87237316c6693f",
        -                "reference": "926061e74229e935d3c5b4e9ba87237316c6693f",
        +                "url": "https://api.github.com/repos/symfony/console/zipball/b0878233cb5c4391347e5495089c7af11b8e6201",
        +                "reference": "b0878233cb5c4391347e5495089c7af11b8e6201",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.5.9",
        +                "symfony/debug": "~2.8|~3.0",
                         "symfony/polyfill-mbstring": "~1.0"
                     },
        +            "conflict": {
        +                "symfony/dependency-injection": "<3.3"
        +            },
                     "require-dev": {
                         "psr/log": "~1.0",
        +                "symfony/config": "~3.3",
        +                "symfony/dependency-injection": "~3.3",
                         "symfony/event-dispatcher": "~2.8|~3.0",
        +                "symfony/filesystem": "~2.8|~3.0",
        +                "symfony/http-kernel": "~2.8|~3.0",
                         "symfony/process": "~2.8|~3.0"
                     },
                     "suggest": {
                         "psr/log": "For using the console logger",
                         "symfony/event-dispatcher": "",
        +                "symfony/filesystem": "",
                         "symfony/process": ""
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -2554,20 +3226,73 @@
                     ],
                     "description": "Symfony Console Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-30 07:22:48"
        +            "time": "2017-07-29T21:27:59+00:00"
                 },
                 {
        -            "name": "symfony/debug",
        -            "version": "v3.0.9",
        +            "name": "symfony/css-selector",
        +            "version": "v3.1.10",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/symfony/debug.git",
        -                "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a"
        +                "url": "https://github.com/symfony/css-selector.git",
        +                "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a",
        -                "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a",
        +                "url": "https://api.github.com/repos/symfony/css-selector/zipball/722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d",
        +                "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.5.9"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "3.1-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Symfony\\Component\\CssSelector\\": ""
        +                },
        +                "exclude-from-classmap": [
        +                    "/Tests/"
        +                ]
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Jean-François Simon",
        +                    "email": "jeanfrancois.simon@sensiolabs.com"
        +                },
        +                {
        +                    "name": "Fabien Potencier",
        +                    "email": "fabien@symfony.com"
        +                },
        +                {
        +                    "name": "Symfony Community",
        +                    "homepage": "https://symfony.com/contributors"
        +                }
        +            ],
        +            "description": "Symfony CssSelector Component",
        +            "homepage": "https://symfony.com",
        +            "time": "2017-01-02T20:31:54+00:00"
        +        },
        +        {
        +            "name": "symfony/debug",
        +            "version": "v3.3.6",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/symfony/debug.git",
        +                "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/symfony/debug/zipball/7c13ae8ce1e2adbbd574fc39de7be498e1284e13",
        +                "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13",
                         "shasum": ""
                     },
                     "require": {
        @@ -2578,13 +3303,12 @@
                         "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
                     },
                     "require-dev": {
        -                "symfony/class-loader": "~2.8|~3.0",
                         "symfony/http-kernel": "~2.8|~3.0"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -2611,29 +3335,32 @@
                     ],
                     "description": "Symfony Debug Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-30 07:22:48"
        +            "time": "2017-07-28T15:27:31+00:00"
                 },
                 {
                     "name": "symfony/event-dispatcher",
        -            "version": "v3.1.3",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/event-dispatcher.git",
        -                "reference": "c0c00c80b3a69132c4e55c3e7db32b4a387615e5"
        +                "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c0c00c80b3a69132c4e55c3e7db32b4a387615e5",
        -                "reference": "c0c00c80b3a69132c4e55c3e7db32b4a387615e5",
        +                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67535f1e3fd662bdc68d7ba317c93eecd973617e",
        +                "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.5.9"
                     },
        +            "conflict": {
        +                "symfony/dependency-injection": "<3.3"
        +            },
                     "require-dev": {
                         "psr/log": "~1.0",
                         "symfony/config": "~2.8|~3.0",
        -                "symfony/dependency-injection": "~2.8|~3.0",
        +                "symfony/dependency-injection": "~3.3",
                         "symfony/expression-language": "~2.8|~3.0",
                         "symfony/stopwatch": "~2.8|~3.0"
                     },
        @@ -2644,7 +3371,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.1-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -2671,20 +3398,20 @@
                     ],
                     "description": "Symfony EventDispatcher Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-19 10:45:57"
        +            "time": "2017-06-09T14:53:08+00:00"
                 },
                 {
                     "name": "symfony/finder",
        -            "version": "v3.0.9",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/finder.git",
        -                "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9"
        +                "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/finder/zipball/3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9",
        -                "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9",
        +                "url": "https://api.github.com/repos/symfony/finder/zipball/baea7f66d30854ad32988c11a09d7ffd485810c4",
        +                "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4",
                         "shasum": ""
                     },
                     "require": {
        @@ -2693,7 +3420,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -2720,20 +3447,20 @@
                     ],
                     "description": "Symfony Finder Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-06-29 05:40:00"
        +            "time": "2017-06-01T21:01:25+00:00"
                 },
                 {
                     "name": "symfony/http-foundation",
        -            "version": "v3.0.9",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/http-foundation.git",
        -                "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82"
        +                "reference": "49e8cd2d59a7aa9bfab19e46de680c76e500a031"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49ba00f8ede742169cb6b70abe33243f4d673f82",
        -                "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82",
        +                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49e8cd2d59a7aa9bfab19e46de680c76e500a031",
        +                "reference": "49e8cd2d59a7aa9bfab19e46de680c76e500a031",
                         "shasum": ""
                     },
                     "require": {
        @@ -2746,7 +3473,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -2773,20 +3500,20 @@
                     ],
                     "description": "Symfony HttpFoundation Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-17 13:54:30"
        +            "time": "2017-07-21T11:04:46+00:00"
                 },
                 {
                     "name": "symfony/http-kernel",
        -            "version": "v3.0.9",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/http-kernel.git",
        -                "reference": "d97ba4425e36e79c794e7d14ff36f00f081b37b3"
        +                "reference": "db10d05f1d95e4168e638db7a81c79616f568ea5"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d97ba4425e36e79c794e7d14ff36f00f081b37b3",
        -                "reference": "d97ba4425e36e79c794e7d14ff36f00f081b37b3",
        +                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/db10d05f1d95e4168e638db7a81c79616f568ea5",
        +                "reference": "db10d05f1d95e4168e638db7a81c79616f568ea5",
                         "shasum": ""
                     },
                     "require": {
        @@ -2794,18 +3521,22 @@
                         "psr/log": "~1.0",
                         "symfony/debug": "~2.8|~3.0",
                         "symfony/event-dispatcher": "~2.8|~3.0",
        -                "symfony/http-foundation": "~2.8.8|~3.0.8|~3.1.2|~3.2"
        +                "symfony/http-foundation": "~3.3"
                     },
                     "conflict": {
        -                "symfony/config": "<2.8"
        +                "symfony/config": "<2.8",
        +                "symfony/dependency-injection": "<3.3",
        +                "symfony/var-dumper": "<3.3",
        +                "twig/twig": "<1.34|<2.4,>=2"
                     },
                     "require-dev": {
        +                "psr/cache": "~1.0",
                         "symfony/browser-kit": "~2.8|~3.0",
                         "symfony/class-loader": "~2.8|~3.0",
                         "symfony/config": "~2.8|~3.0",
                         "symfony/console": "~2.8|~3.0",
                         "symfony/css-selector": "~2.8|~3.0",
        -                "symfony/dependency-injection": "~2.8|~3.0",
        +                "symfony/dependency-injection": "~3.3",
                         "symfony/dom-crawler": "~2.8|~3.0",
                         "symfony/expression-language": "~2.8|~3.0",
                         "symfony/finder": "~2.8|~3.0",
        @@ -2814,7 +3545,7 @@
                         "symfony/stopwatch": "~2.8|~3.0",
                         "symfony/templating": "~2.8|~3.0",
                         "symfony/translation": "~2.8|~3.0",
        -                "symfony/var-dumper": "~2.8|~3.0"
        +                "symfony/var-dumper": "~3.3"
                     },
                     "suggest": {
                         "symfony/browser-kit": "",
        @@ -2828,7 +3559,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -2855,20 +3586,20 @@
                     ],
                     "description": "Symfony HttpKernel Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-30 09:10:37"
        +            "time": "2017-08-01T10:25:59+00:00"
                 },
                 {
                     "name": "symfony/polyfill-mbstring",
        -            "version": "v1.2.0",
        +            "version": "v1.5.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/polyfill-mbstring.git",
        -                "reference": "dff51f72b0706335131b00a7f49606168c582594"
        +                "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594",
        -                "reference": "dff51f72b0706335131b00a7f49606168c582594",
        +                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
        +                "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
                         "shasum": ""
                     },
                     "require": {
        @@ -2880,7 +3611,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.2-dev"
        +                    "dev-master": "1.5-dev"
                         }
                     },
                     "autoload": {
        @@ -2914,20 +3645,20 @@
                         "portable",
                         "shim"
                     ],
        -            "time": "2016-05-18 14:26:46"
        +            "time": "2017-06-14T15:44:48+00:00"
                 },
                 {
                     "name": "symfony/polyfill-php56",
        -            "version": "v1.2.0",
        +            "version": "v1.5.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/polyfill-php56.git",
        -                "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a"
        +                "reference": "e85ebdef569b84e8709864e1a290c40f156b30ca"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3edf57a8fbf9a927533344cef65ad7e1cf31030a",
        -                "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a",
        +                "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/e85ebdef569b84e8709864e1a290c40f156b30ca",
        +                "reference": "e85ebdef569b84e8709864e1a290c40f156b30ca",
                         "shasum": ""
                     },
                     "require": {
        @@ -2937,7 +3668,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.2-dev"
        +                    "dev-master": "1.5-dev"
                         }
                     },
                     "autoload": {
        @@ -2970,20 +3701,20 @@
                         "portable",
                         "shim"
                     ],
        -            "time": "2016-05-18 14:26:46"
        +            "time": "2017-06-14T15:44:48+00:00"
                 },
                 {
                     "name": "symfony/polyfill-util",
        -            "version": "v1.2.0",
        +            "version": "v1.5.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/polyfill-util.git",
        -                "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99"
        +                "reference": "67925d1cf0b84bd234a83bebf26d4eb281744c6d"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99",
        -                "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99",
        +                "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/67925d1cf0b84bd234a83bebf26d4eb281744c6d",
        +                "reference": "67925d1cf0b84bd234a83bebf26d4eb281744c6d",
                         "shasum": ""
                     },
                     "require": {
        @@ -2992,7 +3723,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.2-dev"
        +                    "dev-master": "1.5-dev"
                         }
                     },
                     "autoload": {
        @@ -3022,20 +3753,20 @@
                         "polyfill",
                         "shim"
                     ],
        -            "time": "2016-05-18 14:26:46"
        +            "time": "2017-07-05T15:09:33+00:00"
                 },
                 {
                     "name": "symfony/process",
        -            "version": "v3.0.9",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/process.git",
        -                "reference": "768debc5996f599c4372b322d9061dba2a4bf505"
        +                "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/process/zipball/768debc5996f599c4372b322d9061dba2a4bf505",
        -                "reference": "768debc5996f599c4372b322d9061dba2a4bf505",
        +                "url": "https://api.github.com/repos/symfony/process/zipball/07432804942b9f6dd7b7377faf9920af5f95d70a",
        +                "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a",
                         "shasum": ""
                     },
                     "require": {
        @@ -3044,7 +3775,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -3071,36 +3802,99 @@
                     ],
                     "description": "Symfony Process Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-28 11:13:34"
        +            "time": "2017-07-13T13:05:09+00:00"
                 },
                 {
        -            "name": "symfony/routing",
        -            "version": "v3.0.9",
        +            "name": "symfony/psr-http-message-bridge",
        +            "version": "v1.0.0",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/symfony/routing.git",
        -                "reference": "9038984bd9c05ab07280121e9e10f61a7231457b"
        +                "url": "https://github.com/symfony/psr-http-message-bridge.git",
        +                "reference": "66085f246d3893cbdbcec5f5ad15ac60546cf0de"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/routing/zipball/9038984bd9c05ab07280121e9e10f61a7231457b",
        -                "reference": "9038984bd9c05ab07280121e9e10f61a7231457b",
        +                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/66085f246d3893cbdbcec5f5ad15ac60546cf0de",
        +                "reference": "66085f246d3893cbdbcec5f5ad15ac60546cf0de",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.3.3",
        +                "psr/http-message": "~1.0",
        +                "symfony/http-foundation": "~2.3|~3.0"
        +            },
        +            "require-dev": {
        +                "symfony/phpunit-bridge": "~2.7|~3.0"
        +            },
        +            "suggest": {
        +                "psr/http-message-implementation": "To use the HttpFoundation factory",
        +                "zendframework/zend-diactoros": "To use the Zend Diactoros factory"
        +            },
        +            "type": "symfony-bridge",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Symfony\\Bridge\\PsrHttpMessage\\": ""
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Symfony Community",
        +                    "homepage": "http://symfony.com/contributors"
        +                },
        +                {
        +                    "name": "Fabien Potencier",
        +                    "email": "fabien@symfony.com"
        +                }
        +            ],
        +            "description": "PSR HTTP message bridge",
        +            "homepage": "http://symfony.com",
        +            "keywords": [
        +                "http",
        +                "http-message",
        +                "psr-7"
        +            ],
        +            "time": "2016-09-14T18:37:20+00:00"
        +        },
        +        {
        +            "name": "symfony/routing",
        +            "version": "v3.3.6",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/symfony/routing.git",
        +                "reference": "4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/symfony/routing/zipball/4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26",
        +                "reference": "4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.5.9"
                     },
                     "conflict": {
        -                "symfony/config": "<2.8"
        +                "symfony/config": "<2.8",
        +                "symfony/dependency-injection": "<3.3",
        +                "symfony/yaml": "<3.3"
                     },
                     "require-dev": {
                         "doctrine/annotations": "~1.0",
                         "doctrine/common": "~2.2",
                         "psr/log": "~1.0",
                         "symfony/config": "~2.8|~3.0",
        +                "symfony/dependency-injection": "~3.3",
                         "symfony/expression-language": "~2.8|~3.0",
                         "symfony/http-foundation": "~2.8|~3.0",
        -                "symfony/yaml": "~2.8|~3.0"
        +                "symfony/yaml": "~3.3"
                     },
                     "suggest": {
                         "doctrine/annotations": "For using the annotation loader",
        @@ -3113,7 +3907,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -3146,20 +3940,20 @@
                         "uri",
                         "url"
                     ],
        -            "time": "2016-06-29 05:40:00"
        +            "time": "2017-07-21T17:43:13+00:00"
                 },
                 {
                     "name": "symfony/translation",
        -            "version": "v3.0.9",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/translation.git",
        -                "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26"
        +                "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/translation/zipball/eee6c664853fd0576f21ae25725cfffeafe83f26",
        -                "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26",
        +                "url": "https://api.github.com/repos/symfony/translation/zipball/35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
        +                "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
                         "shasum": ""
                     },
                     "require": {
        @@ -3167,13 +3961,14 @@
                         "symfony/polyfill-mbstring": "~1.0"
                     },
                     "conflict": {
        -                "symfony/config": "<2.8"
        +                "symfony/config": "<2.8",
        +                "symfony/yaml": "<3.3"
                     },
                     "require-dev": {
                         "psr/log": "~1.0",
                         "symfony/config": "~2.8|~3.0",
        -                "symfony/intl": "~2.8|~3.0",
        -                "symfony/yaml": "~2.8|~3.0"
        +                "symfony/intl": "^2.8.18|^3.2.5",
        +                "symfony/yaml": "~3.3"
                     },
                     "suggest": {
                         "psr/log": "To use logging capability in translator",
        @@ -3183,7 +3978,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -3210,36 +4005,41 @@
                     ],
                     "description": "Symfony Translation Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-30 07:22:48"
        +            "time": "2017-06-24T16:45:30+00:00"
                 },
                 {
                     "name": "symfony/var-dumper",
        -            "version": "v3.0.9",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/var-dumper.git",
        -                "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377"
        +                "reference": "b2623bccb969ad595c2090f9be498b74670d0663"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1f7e071aafc6676fcb6e3f0497f87c2397247377",
        -                "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377",
        +                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b2623bccb969ad595c2090f9be498b74670d0663",
        +                "reference": "b2623bccb969ad595c2090f9be498b74670d0663",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.5.9",
                         "symfony/polyfill-mbstring": "~1.0"
                     },
        +            "conflict": {
        +                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
        +            },
                     "require-dev": {
        -                "twig/twig": "~1.20|~2.0"
        +                "ext-iconv": "*",
        +                "twig/twig": "~1.34|~2.4"
                     },
                     "suggest": {
        +                "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
                         "ext-symfony_debug": ""
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.0-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -3273,35 +4073,39 @@
                         "debug",
                         "dump"
                     ],
        -            "time": "2016-07-26 08:03:56"
        +            "time": "2017-07-28T06:06:09+00:00"
                 },
                 {
                     "name": "tecnickcom/tc-lib-barcode",
        -            "version": "dev-master",
        +            "version": "1.15.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/tecnickcom/tc-lib-barcode.git",
        -                "reference": "df69541618a0ebc24bc8f938e52f76a471f2e018"
        +                "reference": "18b8b9224c995cd9d7518e8551be833cbc31b323"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/tecnickcom/tc-lib-barcode/zipball/df69541618a0ebc24bc8f938e52f76a471f2e018",
        -                "reference": "df69541618a0ebc24bc8f938e52f76a471f2e018",
        +                "url": "https://api.github.com/repos/tecnickcom/tc-lib-barcode/zipball/18b8b9224c995cd9d7518e8551be833cbc31b323",
        +                "reference": "18b8b9224c995cd9d7518e8551be833cbc31b323",
                         "shasum": ""
                     },
                     "require": {
        +                "ext-bcmath": "*",
        +                "ext-date": "*",
        +                "ext-gd": "*",
        +                "ext-pcre": "*",
                         "php": ">=5.4",
        -                "tecnickcom/tc-lib-color": "^1.12.0"
        +                "tecnickcom/tc-lib-color": "^1.12.6"
                     },
                     "require-dev": {
                         "apigen/apigen": "^4.1.2",
        -                "bartlett/php-compatinfo": "^5.0.0",
        -                "pdepend/pdepend": "^2.2.2",
        -                "phploc/phploc": "^2.1.5|^3.0.0",
        -                "phpmd/phpmd": "^2.3.2",
        -                "phpunit/phpunit": "4.8.19|^5.0.0",
        -                "sebastian/phpcpd": "^2.0.2",
        -                "squizlabs/php_codesniffer": "^2.5.0|^3.0.0"
        +                "bartlett/php-compatinfo": "^5.0.4",
        +                "pdepend/pdepend": "^2.5.0",
        +                "phploc/phploc": "^2.1.5 || ^3.0.1",
        +                "phpmd/phpmd": "^2.6.0",
        +                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0",
        +                "sebastian/phpcpd": "^2.0.4 || 3.0.0",
        +                "squizlabs/php_codesniffer": "^2.8.0 || ^3.0.0"
                     },
                     "type": "library",
                     "autoload": {
        @@ -3359,34 +4163,35 @@
                         "tc-lib-barcode",
                         "upc"
                     ],
        -            "time": "2016-08-25 12:36:23"
        +            "time": "2017-02-12T13:51:39+00:00"
                 },
                 {
                     "name": "tecnickcom/tc-lib-color",
        -            "version": "1.12.0",
        +            "version": "1.12.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/tecnickcom/tc-lib-color.git",
        -                "reference": "176464ae7ad0256c1dfd9d742ee2461d0b660f7c"
        +                "reference": "8921acc8e9c26bdc32c9b08989d42e428af6c660"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/tecnickcom/tc-lib-color/zipball/176464ae7ad0256c1dfd9d742ee2461d0b660f7c",
        -                "reference": "176464ae7ad0256c1dfd9d742ee2461d0b660f7c",
        +                "url": "https://api.github.com/repos/tecnickcom/tc-lib-color/zipball/8921acc8e9c26bdc32c9b08989d42e428af6c660",
        +                "reference": "8921acc8e9c26bdc32c9b08989d42e428af6c660",
                         "shasum": ""
                     },
                     "require": {
        +                "ext-pcre": "*",
                         "php": ">=5.4"
                     },
                     "require-dev": {
                         "apigen/apigen": "^4.1.2",
        -                "bartlett/php-compatinfo": "^5.0.0",
        -                "pdepend/pdepend": "^2.2.2",
        -                "phploc/phploc": "^2.1.5|^3.0.0",
        -                "phpmd/phpmd": "^2.3.2",
        -                "phpunit/phpunit": "4.8.19|^5.0.0",
        -                "sebastian/phpcpd": "^2.0.2",
        -                "squizlabs/php_codesniffer": "^2.5.0|^3.0.0"
        +                "bartlett/php-compatinfo": "^5.0.4",
        +                "pdepend/pdepend": "^2.5.0",
        +                "phploc/phploc": "^2.1.5 || ^3.0.1",
        +                "phpmd/phpmd": "^2.6.0",
        +                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0",
        +                "sebastian/phpcpd": "^2.0.4 || 3.0.0",
        +                "squizlabs/php_codesniffer": "^2.8.0 || ^3.0.0"
                     },
                     "type": "library",
                     "autoload": {
        @@ -3421,20 +4226,122 @@
                         "tc-lib-color",
                         "web"
                     ],
        -            "time": "2016-08-25 11:56:01"
        +            "time": "2017-02-12T12:07:38+00:00"
                 },
                 {
        -            "name": "vlucas/phpdotenv",
        -            "version": "v2.3.0",
        +            "name": "tijsverkoyen/css-to-inline-styles",
        +            "version": "2.2.0",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/vlucas/phpdotenv.git",
        -                "reference": "9ca5644c536654e9509b9d257f53c58630eb2a6a"
        +                "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
        +                "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/9ca5644c536654e9509b9d257f53c58630eb2a6a",
        -                "reference": "9ca5644c536654e9509b9d257f53c58630eb2a6a",
        +                "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b",
        +                "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": "^5.5 || ^7",
        +                "symfony/css-selector": "^2.7|~3.0"
        +            },
        +            "require-dev": {
        +                "phpunit/phpunit": "~4.8|5.1.*"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "2.0.x-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "TijsVerkoyen\\CssToInlineStyles\\": "src"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "BSD-3-Clause"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Tijs Verkoyen",
        +                    "email": "css_to_inline_styles@verkoyen.eu",
        +                    "role": "Developer"
        +                }
        +            ],
        +            "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
        +            "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
        +            "time": "2016-09-20T12:50:39+00:00"
        +        },
        +        {
        +            "name": "unicodeveloper/laravel-password",
        +            "version": "1.0.2",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/unicodeveloper/laravel-password.git",
        +                "reference": "5c3bdc977c4b8065350caf2e57371b069ef6f5b4"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/unicodeveloper/laravel-password/zipball/5c3bdc977c4b8065350caf2e57371b069ef6f5b4",
        +                "reference": "5c3bdc977c4b8065350caf2e57371b069ef6f5b4",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": "~5.6|~7.0"
        +            },
        +            "require-dev": {
        +                "phpunit/phpunit": "~4.0||~5.0",
        +                "scrutinizer/ocular": "~1.1",
        +                "squizlabs/php_codesniffer": "~2.3"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Unicodeveloper\\DumbPassword\\": "src"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "MIT"
        +            ],
        +            "authors": [
        +                {
        +                    "name": ":Prosper Otemuyiwa",
        +                    "email": "prosperotemuyiwa@gmail.com",
        +                    "homepage": "http://goodheads.io",
        +                    "role": "Developer"
        +                }
        +            ],
        +            "description": "Protect your users from entering dumb and common passwords",
        +            "homepage": "https://github.com/unicodeveloper/laravel-password",
        +            "keywords": [
        +                "dumb",
        +                "passwords",
        +                "security",
        +                "unicodeveloper"
        +            ],
        +            "time": "2017-04-27T07:35:00+00:00"
        +        },
        +        {
        +            "name": "vlucas/phpdotenv",
        +            "version": "v2.4.0",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/vlucas/phpdotenv.git",
        +                "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
        +                "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
                         "shasum": ""
                     },
                     "require": {
        @@ -3446,7 +4353,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "2.3-dev"
        +                    "dev-master": "2.4-dev"
                         }
                     },
                     "autoload": {
        @@ -3471,28 +4378,28 @@
                         "env",
                         "environment"
                     ],
        -            "time": "2016-06-14 14:14:52"
        +            "time": "2016-09-01T10:05:43+00:00"
                 },
                 {
                     "name": "watson/validating",
        -            "version": "2.2.2",
        +            "version": "3.0.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/dwightwatson/validating.git",
        -                "reference": "8f37e416aaf02129c8ad57a446a6ef7080019687"
        +                "reference": "3cef5b4cd0af2dc26d2c7ca668bd12f4d4ab421b"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/dwightwatson/validating/zipball/8f37e416aaf02129c8ad57a446a6ef7080019687",
        -                "reference": "8f37e416aaf02129c8ad57a446a6ef7080019687",
        +                "url": "https://api.github.com/repos/dwightwatson/validating/zipball/3cef5b4cd0af2dc26d2c7ca668bd12f4d4ab421b",
        +                "reference": "3cef5b4cd0af2dc26d2c7ca668bd12f4d4ab421b",
                         "shasum": ""
                     },
                     "require": {
        -                "illuminate/contracts": "~5.0 <5.3",
        -                "illuminate/database": "~5.0 <5.3 || >=5.1.27",
        -                "illuminate/events": "~5.0 <5.3",
        -                "illuminate/support": "~5.0 <5.3",
        -                "illuminate/validation": "~5.0 <5.3",
        +                "illuminate/contracts": ">=5.3",
        +                "illuminate/database": ">=5.3",
        +                "illuminate/events": ">=5.3",
        +                "illuminate/support": ">=5.3",
        +                "illuminate/validation": ">=5.3",
                         "php": ">=5.4.0"
                     },
                     "require-dev": {
        @@ -3500,11 +4407,6 @@
                         "phpunit/phpunit": "~4.0"
                     },
                     "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "1.0-dev"
        -                }
        -            },
                     "autoload": {
                         "psr-4": {
                             "Watson\\Validating\\": "src/"
        @@ -3526,35 +4428,96 @@
                         "laravel",
                         "validation"
                     ],
        -            "time": "2016-08-28 07:54:32"
        +            "time": "2016-10-31T21:53:17+00:00"
        +        },
        +        {
        +            "name": "zendframework/zend-diactoros",
        +            "version": "1.5.0",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/zendframework/zend-diactoros.git",
        +                "reference": "1d23172f9dc1687a97c195a777b0199f14f7b26e"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/1d23172f9dc1687a97c195a777b0199f14f7b26e",
        +                "reference": "1d23172f9dc1687a97c195a777b0199f14f7b26e",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": "^5.6 || ^7.0",
        +                "psr/http-message": "^1.0"
        +            },
        +            "provide": {
        +                "psr/http-message-implementation": "1.0"
        +            },
        +            "require-dev": {
        +                "ext-dom": "*",
        +                "ext-libxml": "*",
        +                "phpunit/phpunit": "^5.7.16 || ^6.0.8",
        +                "zendframework/zend-coding-standard": "~1.0"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.5-dev",
        +                    "dev-develop": "1.6-dev"
        +                }
        +            },
        +            "autoload": {
        +                "psr-4": {
        +                    "Zend\\Diactoros\\": "src/"
        +                }
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "BSD-2-Clause"
        +            ],
        +            "description": "PSR HTTP Message implementations",
        +            "homepage": "https://github.com/zendframework/zend-diactoros",
        +            "keywords": [
        +                "http",
        +                "psr",
        +                "psr-7"
        +            ],
        +            "time": "2017-08-22T20:38:56+00:00"
                 }
             ],
             "packages-dev": [
                 {
        -            "name": "codeception/c3",
        -            "version": "2.0.7",
        +            "name": "behat/gherkin",
        +            "version": "v4.4.5",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/Codeception/c3.git",
        -                "reference": "51eec2c3a8e093deb621f58004f0393dc0871983"
        +                "url": "https://github.com/Behat/Gherkin.git",
        +                "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/Codeception/c3/zipball/51eec2c3a8e093deb621f58004f0393dc0871983",
        -                "reference": "51eec2c3a8e093deb621f58004f0393dc0871983",
        +                "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74",
        +                "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74",
                         "shasum": ""
                     },
                     "require": {
        -                "composer-plugin-api": "^1.0",
        -                "php": ">=5.4.0"
        +                "php": ">=5.3.1"
                     },
        -            "type": "composer-plugin",
        +            "require-dev": {
        +                "phpunit/phpunit": "~4.5|~5",
        +                "symfony/phpunit-bridge": "~2.7|~3",
        +                "symfony/yaml": "~2.3|~3"
        +            },
        +            "suggest": {
        +                "symfony/yaml": "If you want to parse features, represented in YAML files"
        +            },
        +            "type": "library",
                     "extra": {
        -                "class": "Codeception\\c3\\Installer"
        +                "branch-alias": {
        +                    "dev-master": "4.4-dev"
        +                }
                     },
                     "autoload": {
        -                "psr-4": {
        -                    "Codeception\\c3\\": "."
        +                "psr-0": {
        +                    "Behat\\Gherkin": "src/"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
        @@ -3563,70 +4526,78 @@
                     ],
                     "authors": [
                         {
        -                    "name": "Tiger Seo",
        -                    "email": "tiger.seo@gmail.com"
        -                },
        -                {
        -                    "name": "Michael Bodnarchuk",
        -                    "email": "davert.php@codegyre.com",
        -                    "homepage": "http://codegyre.com"
        +                    "name": "Konstantin Kudryashov",
        +                    "email": "ever.zet@gmail.com",
        +                    "homepage": "http://everzet.com"
                         }
                     ],
        -            "description": "CodeCoverage collector for Codeception",
        -            "homepage": "http://codeception.com/",
        +            "description": "Gherkin DSL parser for PHP 5.3",
        +            "homepage": "http://behat.org/",
                     "keywords": [
        -                "code coverage",
        -                "codecoverage"
        +                "BDD",
        +                "Behat",
        +                "Cucumber",
        +                "DSL",
        +                "gherkin",
        +                "parser"
                     ],
        -            "time": "2016-06-27 16:49:12"
        +            "time": "2016-10-30T11:50:56+00:00"
                 },
                 {
                     "name": "codeception/codeception",
        -            "version": "2.1.11",
        +            "version": "2.2.9",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/Codeception/Codeception.git",
        -                "reference": "d451dbe35e23da1cde5c367130d22f843981aafc"
        +                "reference": "0204f1362040d3e408404af2545e5fa27e8964e2"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/Codeception/Codeception/zipball/d451dbe35e23da1cde5c367130d22f843981aafc",
        -                "reference": "d451dbe35e23da1cde5c367130d22f843981aafc",
        +                "url": "https://api.github.com/repos/Codeception/Codeception/zipball/0204f1362040d3e408404af2545e5fa27e8964e2",
        +                "reference": "0204f1362040d3e408404af2545e5fa27e8964e2",
                         "shasum": ""
                     },
                     "require": {
        -                "ext-curl": "*",
        +                "behat/gherkin": "~4.4.0",
                         "ext-json": "*",
                         "ext-mbstring": "*",
                         "facebook/webdriver": ">=1.0.1 <2.0",
                         "guzzlehttp/guzzle": ">=4.1.4 <7.0",
                         "guzzlehttp/psr7": "~1.0",
                         "php": ">=5.4.0 <8.0",
        -                "phpunit/php-code-coverage": ">=2.1.3",
        -                "phpunit/phpunit": ">4.8.20 <5.4",
        -                "symfony/browser-kit": ">=2.5 <3.2",
        -                "symfony/console": ">=2.5 <3.2",
        -                "symfony/css-selector": ">=2.5 <3.2",
        -                "symfony/dom-crawler": ">=2.5 <3.2",
        -                "symfony/event-dispatcher": ">=2.5 <3.2",
        -                "symfony/finder": ">=2.5 <3.2",
        -                "symfony/yaml": ">=2.5 <3.2"
        +                "phpunit/php-code-coverage": ">=2.2.4 <5.0",
        +                "phpunit/phpunit": ">4.8.20 <6.0",
        +                "sebastian/comparator": "~1.1",
        +                "sebastian/diff": "^1.4",
        +                "symfony/browser-kit": ">=2.7 <4.0",
        +                "symfony/console": ">=2.7 <4.0",
        +                "symfony/css-selector": ">=2.7 <4.0",
        +                "symfony/dom-crawler": ">=2.7.5 <4.0",
        +                "symfony/event-dispatcher": ">=2.7 <4.0",
        +                "symfony/finder": ">=2.7 <4.0",
        +                "symfony/yaml": ">=2.7 <4.0"
                     },
                     "require-dev": {
                         "codeception/specify": "~0.3",
        -                "facebook/php-sdk-v4": "~5.0",
        +                "facebook/graph-sdk": "~5.3",
                         "flow/jsonpath": "~0.2",
        +                "league/factory-muffin": "^3.0",
        +                "league/factory-muffin-faker": "^1.0",
        +                "mongodb/mongodb": "^1.0",
                         "monolog/monolog": "~1.8",
        -                "pda/pheanstalk": "~2.0",
        +                "pda/pheanstalk": "~3.0",
                         "php-amqplib/php-amqplib": "~2.4",
        -                "squizlabs/php_codesniffer": "~2.0"
        +                "predis/predis": "^1.0",
        +                "squizlabs/php_codesniffer": "~2.0",
        +                "vlucas/phpdotenv": "^2.4.0"
                     },
                     "suggest": {
        -                "codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests",
                         "codeception/specify": "BDD-style code blocks",
                         "codeception/verify": "BDD-style assertions",
        -                "monolog/monolog": "Log test steps",
        -                "phpseclib/phpseclib": "Extension required to use the SFTP option in the FTP Module.",
        +                "flow/jsonpath": "For using JSONPath in REST module",
        +                "league/factory-muffin": "For DataFactory module",
        +                "league/factory-muffin-faker": "For Faker support in DataFactory module",
        +                "phpseclib/phpseclib": "for SFTP option in FTP Module",
                         "symfony/phpunit-bridge": "For phpunit-bridge support"
                     },
                     "bin": [
        @@ -3662,89 +4633,41 @@
                         "functional testing",
                         "unit testing"
                     ],
        -            "time": "2016-06-28 23:57:41"
        -        },
        -        {
        -            "name": "doctrine/instantiator",
        -            "version": "1.0.5",
        -            "source": {
        -                "type": "git",
        -                "url": "https://github.com/doctrine/instantiator.git",
        -                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
        -            },
        -            "dist": {
        -                "type": "zip",
        -                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
        -                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
        -                "shasum": ""
        -            },
        -            "require": {
        -                "php": ">=5.3,<8.0-DEV"
        -            },
        -            "require-dev": {
        -                "athletic/athletic": "~0.1.8",
        -                "ext-pdo": "*",
        -                "ext-phar": "*",
        -                "phpunit/phpunit": "~4.0",
        -                "squizlabs/php_codesniffer": "~2.0"
        -            },
        -            "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "1.0.x-dev"
        -                }
        -            },
        -            "autoload": {
        -                "psr-4": {
        -                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
        -                }
        -            },
        -            "notification-url": "https://packagist.org/downloads/",
        -            "license": [
        -                "MIT"
        -            ],
        -            "authors": [
        -                {
        -                    "name": "Marco Pivetta",
        -                    "email": "ocramius@gmail.com",
        -                    "homepage": "http://ocramius.github.com/"
        -                }
        -            ],
        -            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
        -            "homepage": "https://github.com/doctrine/instantiator",
        -            "keywords": [
        -                "constructor",
        -                "instantiate"
        -            ],
        -            "time": "2015-06-14 21:17:01"
        +            "time": "2017-02-04T02:04:21+00:00"
                 },
                 {
                     "name": "facebook/webdriver",
        -            "version": "1.1.3",
        +            "version": "1.4.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/facebook/php-webdriver.git",
        -                "reference": "b7186fb1bcfda956d237f59face250d06ef47253"
        +                "reference": "eadb0b7a7c3e6578185197fd40158b08c3164c83"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/b7186fb1bcfda956d237f59face250d06ef47253",
        -                "reference": "b7186fb1bcfda956d237f59face250d06ef47253",
        +                "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/eadb0b7a7c3e6578185197fd40158b08c3164c83",
        +                "reference": "eadb0b7a7c3e6578185197fd40158b08c3164c83",
                         "shasum": ""
                     },
                     "require": {
                         "ext-curl": "*",
        -                "php": ">=5.3.19"
        +                "ext-zip": "*",
        +                "php": "^5.5 || ~7.0",
        +                "symfony/process": "^2.8 || ^3.1"
                     },
                     "require-dev": {
        -                "friendsofphp/php-cs-fixer": "^1.11",
        +                "friendsofphp/php-cs-fixer": "^2.0",
        +                "php-mock/php-mock-phpunit": "^1.1",
                         "phpunit/phpunit": "4.6.* || ~5.0",
        +                "satooshi/php-coveralls": "^1.0",
                         "squizlabs/php_codesniffer": "^2.6"
                     },
        -            "suggest": {
        -                "phpdocumentor/phpdocumentor": "2.*"
        -            },
                     "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-community": "1.5-dev"
        +                }
        +            },
                     "autoload": {
                         "psr-4": {
                             "Facebook\\WebDriver\\": "lib/"
        @@ -3754,7 +4677,7 @@
                     "license": [
                         "Apache-2.0"
                     ],
        -            "description": "A PHP client for WebDriver",
        +            "description": "A PHP client for Selenium WebDriver",
                     "homepage": "https://github.com/facebook/php-webdriver",
                     "keywords": [
                         "facebook",
        @@ -3762,33 +4685,35 @@
                         "selenium",
                         "webdriver"
                     ],
        -            "time": "2016-08-10 00:44:08"
        +            "time": "2017-04-28T14:54:49+00:00"
                 },
                 {
                     "name": "fzaninotto/faker",
        -            "version": "v1.6.0",
        +            "version": "v1.7.1",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/fzaninotto/Faker.git",
        -                "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123"
        +                "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123",
        -                "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123",
        +                "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d",
        +                "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d",
                         "shasum": ""
                     },
                     "require": {
        -                "php": "^5.3.3|^7.0"
        +                "php": "^5.3.3 || ^7.0"
                     },
                     "require-dev": {
                         "ext-intl": "*",
        -                "phpunit/phpunit": "~4.0",
        -                "squizlabs/php_codesniffer": "~1.5"
        +                "phpunit/phpunit": "^4.0 || ^5.0",
        +                "squizlabs/php_codesniffer": "^1.5"
                     },
                     "type": "library",
                     "extra": {
        -                "branch-alias": []
        +                "branch-alias": {
        +                    "dev-master": "1.8-dev"
        +                }
                     },
                     "autoload": {
                         "psr-4": {
        @@ -3810,117 +4735,49 @@
                         "faker",
                         "fixtures"
                     ],
        -            "time": "2016-04-29 12:21:54"
        +            "time": "2017-08-15T16:48:10+00:00"
                 },
                 {
        -            "name": "hamcrest/hamcrest-php",
        -            "version": "v1.2.2",
        +            "name": "myclabs/deep-copy",
        +            "version": "1.6.1",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/hamcrest/hamcrest-php.git",
        -                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
        +                "url": "https://github.com/myclabs/DeepCopy.git",
        +                "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c",
        -                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
        +                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102",
        +                "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
                         "shasum": ""
                     },
                     "require": {
        -                "php": ">=5.3.2"
        -            },
        -            "replace": {
        -                "cordoval/hamcrest-php": "*",
        -                "davedevelopment/hamcrest-php": "*",
        -                "kodova/hamcrest-php": "*"
        +                "php": ">=5.4.0"
                     },
                     "require-dev": {
        -                "phpunit/php-file-iterator": "1.3.3",
        -                "satooshi/php-coveralls": "dev-master"
        +                "doctrine/collections": "1.*",
        +                "phpunit/phpunit": "~4.1"
                     },
                     "type": "library",
                     "autoload": {
        -                "classmap": [
        -                    "hamcrest"
        -                ],
        -                "files": [
        -                    "hamcrest/Hamcrest.php"
        -                ]
        -            },
        -            "notification-url": "https://packagist.org/downloads/",
        -            "license": [
        -                "BSD"
        -            ],
        -            "description": "This is the PHP port of Hamcrest Matchers",
        -            "keywords": [
        -                "test"
        -            ],
        -            "time": "2015-05-11 14:41:42"
        -        },
        -        {
        -            "name": "mockery/mockery",
        -            "version": "0.9.5",
        -            "source": {
        -                "type": "git",
        -                "url": "https://github.com/padraic/mockery.git",
        -                "reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2"
        -            },
        -            "dist": {
        -                "type": "zip",
        -                "url": "https://api.github.com/repos/padraic/mockery/zipball/4db079511a283e5aba1b3c2fb19037c645e70fc2",
        -                "reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2",
        -                "shasum": ""
        -            },
        -            "require": {
        -                "hamcrest/hamcrest-php": "~1.1",
        -                "lib-pcre": ">=7.0",
        -                "php": ">=5.3.2"
        -            },
        -            "require-dev": {
        -                "phpunit/phpunit": "~4.0"
        -            },
        -            "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "0.9.x-dev"
        -                }
        -            },
        -            "autoload": {
        -                "psr-0": {
        -                    "Mockery": "library/"
        +                "psr-4": {
        +                    "DeepCopy\\": "src/DeepCopy/"
                         }
                     },
                     "notification-url": "https://packagist.org/downloads/",
                     "license": [
        -                "BSD-3-Clause"
        +                "MIT"
                     ],
        -            "authors": [
        -                {
        -                    "name": "Pádraic Brady",
        -                    "email": "padraic.brady@gmail.com",
        -                    "homepage": "http://blog.astrumfutura.com"
        -                },
        -                {
        -                    "name": "Dave Marshall",
        -                    "email": "dave.marshall@atstsolutions.co.uk",
        -                    "homepage": "http://davedevelopment.co.uk"
        -                }
        -            ],
        -            "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
        -            "homepage": "http://github.com/padraic/mockery",
        +            "description": "Create deep copies (clones) of your objects",
        +            "homepage": "https://github.com/myclabs/DeepCopy",
                     "keywords": [
        -                "BDD",
        -                "TDD",
        -                "library",
        -                "mock",
        -                "mock objects",
        -                "mockery",
        -                "stub",
        -                "test",
        -                "test double",
        -                "testing"
        +                "clone",
        +                "copy",
        +                "duplicate",
        +                "object",
        +                "object graph"
                     ],
        -            "time": "2016-05-22 21:52:33"
        +            "time": "2017-04-12T18:52:22+00:00"
                 },
                 {
                     "name": "phpdocumentor/reflection-common",
        @@ -3974,26 +4831,26 @@
                         "reflection",
                         "static analysis"
                     ],
        -            "time": "2015-12-27 11:43:31"
        +            "time": "2015-12-27T11:43:31+00:00"
                 },
                 {
                     "name": "phpdocumentor/reflection-docblock",
        -            "version": "3.1.0",
        +            "version": "3.2.2",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
        -                "reference": "9270140b940ff02e58ec577c237274e92cd40cdd"
        +                "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd",
        -                "reference": "9270140b940ff02e58ec577c237274e92cd40cdd",
        +                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157",
        +                "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.5",
                         "phpdocumentor/reflection-common": "^1.0@dev",
        -                "phpdocumentor/type-resolver": "^0.2.0",
        +                "phpdocumentor/type-resolver": "^0.3.0",
                         "webmozart/assert": "^1.0"
                     },
                     "require-dev": {
        @@ -4019,24 +4876,24 @@
                         }
                     ],
                     "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
        -            "time": "2016-06-10 09:48:41"
        +            "time": "2017-08-08T06:39:58+00:00"
                 },
                 {
                     "name": "phpdocumentor/type-resolver",
        -            "version": "0.2",
        +            "version": "0.3.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/phpDocumentor/TypeResolver.git",
        -                "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
        +                "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
        -                "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
        +                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773",
        +                "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773",
                         "shasum": ""
                     },
                     "require": {
        -                "php": ">=5.5",
        +                "php": "^5.5 || ^7.0",
                         "phpdocumentor/reflection-common": "^1.0"
                     },
                     "require-dev": {
        @@ -4066,143 +4923,32 @@
                             "email": "me@mikevanriel.com"
                         }
                     ],
        -            "time": "2016-06-10 07:14:17"
        -        },
        -        {
        -            "name": "phpspec/php-diff",
        -            "version": "v1.0.2",
        -            "source": {
        -                "type": "git",
        -                "url": "https://github.com/phpspec/php-diff.git",
        -                "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a"
        -            },
        -            "dist": {
        -                "type": "zip",
        -                "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a",
        -                "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a",
        -                "shasum": ""
        -            },
        -            "type": "library",
        -            "autoload": {
        -                "psr-0": {
        -                    "Diff": "lib/"
        -                }
        -            },
        -            "notification-url": "https://packagist.org/downloads/",
        -            "license": [
        -                "BSD-3-Clause"
        -            ],
        -            "authors": [
        -                {
        -                    "name": "Chris Boulton",
        -                    "homepage": "http://github.com/chrisboulton",
        -                    "role": "Original developer"
        -                }
        -            ],
        -            "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).",
        -            "time": "2013-11-01 13:02:21"
        -        },
        -        {
        -            "name": "phpspec/phpspec",
        -            "version": "2.5.1",
        -            "source": {
        -                "type": "git",
        -                "url": "https://github.com/phpspec/phpspec.git",
        -                "reference": "531d00ee76e9ae98279ed4dbb2419e5e0f7fb82d"
        -            },
        -            "dist": {
        -                "type": "zip",
        -                "url": "https://api.github.com/repos/phpspec/phpspec/zipball/531d00ee76e9ae98279ed4dbb2419e5e0f7fb82d",
        -                "reference": "531d00ee76e9ae98279ed4dbb2419e5e0f7fb82d",
        -                "shasum": ""
        -            },
        -            "require": {
        -                "doctrine/instantiator": "^1.0.1",
        -                "ext-tokenizer": "*",
        -                "php": ">=5.3.3",
        -                "phpspec/php-diff": "~1.0.0",
        -                "phpspec/prophecy": "~1.4",
        -                "sebastian/exporter": "~1.0",
        -                "symfony/console": "~2.3|~3.0",
        -                "symfony/event-dispatcher": "~2.1|~3.0",
        -                "symfony/finder": "~2.1|~3.0",
        -                "symfony/process": "^2.6|~3.0",
        -                "symfony/yaml": "~2.1|~3.0"
        -            },
        -            "require-dev": {
        -                "behat/behat": "^3.0.11",
        -                "ciaranmcnulty/versionbasedtestskipper": "^0.2.1",
        -                "phpunit/phpunit": "~4.4",
        -                "symfony/filesystem": "~2.1|~3.0"
        -            },
        -            "suggest": {
        -                "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters"
        -            },
        -            "bin": [
        -                "bin/phpspec"
        -            ],
        -            "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "2.5.x-dev"
        -                }
        -            },
        -            "autoload": {
        -                "psr-0": {
        -                    "PhpSpec": "src/"
        -                }
        -            },
        -            "notification-url": "https://packagist.org/downloads/",
        -            "license": [
        -                "MIT"
        -            ],
        -            "authors": [
        -                {
        -                    "name": "Konstantin Kudryashov",
        -                    "email": "ever.zet@gmail.com",
        -                    "homepage": "http://everzet.com"
        -                },
        -                {
        -                    "name": "Marcello Duarte",
        -                    "homepage": "http://marcelloduarte.net/"
        -                }
        -            ],
        -            "description": "Specification-oriented BDD framework for PHP 5.3+",
        -            "homepage": "http://phpspec.net/",
        -            "keywords": [
        -                "BDD",
        -                "SpecBDD",
        -                "TDD",
        -                "spec",
        -                "specification",
        -                "testing",
        -                "tests"
        -            ],
        -            "time": "2016-07-16 08:34:07"
        +            "time": "2017-06-03T08:32:36+00:00"
                 },
                 {
                     "name": "phpspec/prophecy",
        -            "version": "v1.6.1",
        +            "version": "v1.7.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/phpspec/prophecy.git",
        -                "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
        +                "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
        -                "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
        +                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073",
        +                "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
                         "shasum": ""
                     },
                     "require": {
                         "doctrine/instantiator": "^1.0.2",
                         "php": "^5.3|^7.0",
                         "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
        -                "sebastian/comparator": "^1.1",
        -                "sebastian/recursion-context": "^1.0"
        +                "sebastian/comparator": "^1.1|^2.0",
        +                "sebastian/recursion-context": "^1.0|^2.0|^3.0"
                     },
                     "require-dev": {
        -                "phpspec/phpspec": "^2.0"
        +                "phpspec/phpspec": "^2.5|^3.2",
        +                "phpunit/phpunit": "^4.8 || ^5.6.5"
                     },
                     "type": "library",
                     "extra": {
        @@ -4240,43 +4986,44 @@
                         "spy",
                         "stub"
                     ],
        -            "time": "2016-06-07 08:13:47"
        +            "time": "2017-03-02T20:05:34+00:00"
                 },
                 {
                     "name": "phpunit/php-code-coverage",
        -            "version": "2.2.4",
        +            "version": "4.0.8",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
        -                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
        +                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
        -                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
        +                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
        +                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
                         "shasum": ""
                     },
                     "require": {
        -                "php": ">=5.3.3",
        -                "phpunit/php-file-iterator": "~1.3",
        -                "phpunit/php-text-template": "~1.2",
        -                "phpunit/php-token-stream": "~1.3",
        -                "sebastian/environment": "^1.3.2",
        -                "sebastian/version": "~1.0"
        +                "ext-dom": "*",
        +                "ext-xmlwriter": "*",
        +                "php": "^5.6 || ^7.0",
        +                "phpunit/php-file-iterator": "^1.3",
        +                "phpunit/php-text-template": "^1.2",
        +                "phpunit/php-token-stream": "^1.4.2 || ^2.0",
        +                "sebastian/code-unit-reverse-lookup": "^1.0",
        +                "sebastian/environment": "^1.3.2 || ^2.0",
        +                "sebastian/version": "^1.0 || ^2.0"
                     },
                     "require-dev": {
        -                "ext-xdebug": ">=2.1.4",
        -                "phpunit/phpunit": "~4"
        +                "ext-xdebug": "^2.1.4",
        +                "phpunit/phpunit": "^5.7"
                     },
                     "suggest": {
        -                "ext-dom": "*",
        -                "ext-xdebug": ">=2.2.1",
        -                "ext-xmlwriter": "*"
        +                "ext-xdebug": "^2.5.1"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "2.2.x-dev"
        +                    "dev-master": "4.0.x-dev"
                         }
                     },
                     "autoload": {
        @@ -4302,20 +5049,20 @@
                         "testing",
                         "xunit"
                     ],
        -            "time": "2015-10-06 15:47:00"
        +            "time": "2017-04-02T07:44:40+00:00"
                 },
                 {
                     "name": "phpunit/php-file-iterator",
        -            "version": "1.4.1",
        +            "version": "1.4.2",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
        -                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
        +                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
        -                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
        +                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
        +                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
                         "shasum": ""
                     },
                     "require": {
        @@ -4349,7 +5096,7 @@
                         "filesystem",
                         "iterator"
                     ],
        -            "time": "2015-06-21 13:08:43"
        +            "time": "2016-10-03T07:40:28+00:00"
                 },
                 {
                     "name": "phpunit/php-text-template",
        @@ -4390,29 +5137,34 @@
                     "keywords": [
                         "template"
                     ],
        -            "time": "2015-06-21 13:50:34"
        +            "time": "2015-06-21T13:50:34+00:00"
                 },
                 {
                     "name": "phpunit/php-timer",
        -            "version": "1.0.8",
        +            "version": "1.0.9",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/php-timer.git",
        -                "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
        +                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
        -                "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
        +                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
        +                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
                         "shasum": ""
                     },
                     "require": {
        -                "php": ">=5.3.3"
        +                "php": "^5.3.3 || ^7.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~4|~5"
        +                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
                     },
                     "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0-dev"
        +                }
        +            },
                     "autoload": {
                         "classmap": [
                             "src/"
        @@ -4434,20 +5186,20 @@
                     "keywords": [
                         "timer"
                     ],
        -            "time": "2016-05-12 18:03:57"
        +            "time": "2017-02-26T11:10:40+00:00"
                 },
                 {
                     "name": "phpunit/php-token-stream",
        -            "version": "1.4.8",
        +            "version": "1.4.11",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/php-token-stream.git",
        -                "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
        +                "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
        -                "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
        +                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
        +                "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
                         "shasum": ""
                     },
                     "require": {
        @@ -4483,44 +5235,54 @@
                     "keywords": [
                         "tokenizer"
                     ],
        -            "time": "2015-09-15 10:49:45"
        +            "time": "2017-02-27T10:12:30+00:00"
                 },
                 {
                     "name": "phpunit/phpunit",
        -            "version": "4.8.27",
        +            "version": "5.7.21",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/phpunit.git",
        -                "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90"
        +                "reference": "3b91adfb64264ddec5a2dee9851f354aa66327db"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c062dddcb68e44b563f66ee319ddae2b5a322a90",
        -                "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90",
        +                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3b91adfb64264ddec5a2dee9851f354aa66327db",
        +                "reference": "3b91adfb64264ddec5a2dee9851f354aa66327db",
                         "shasum": ""
                     },
                     "require": {
                         "ext-dom": "*",
                         "ext-json": "*",
        -                "ext-pcre": "*",
        -                "ext-reflection": "*",
        -                "ext-spl": "*",
        -                "php": ">=5.3.3",
        -                "phpspec/prophecy": "^1.3.1",
        -                "phpunit/php-code-coverage": "~2.1",
        +                "ext-libxml": "*",
        +                "ext-mbstring": "*",
        +                "ext-xml": "*",
        +                "myclabs/deep-copy": "~1.3",
        +                "php": "^5.6 || ^7.0",
        +                "phpspec/prophecy": "^1.6.2",
        +                "phpunit/php-code-coverage": "^4.0.4",
                         "phpunit/php-file-iterator": "~1.4",
                         "phpunit/php-text-template": "~1.2",
                         "phpunit/php-timer": "^1.0.6",
        -                "phpunit/phpunit-mock-objects": "~2.3",
        -                "sebastian/comparator": "~1.1",
        -                "sebastian/diff": "~1.2",
        -                "sebastian/environment": "~1.3",
        -                "sebastian/exporter": "~1.2",
        -                "sebastian/global-state": "~1.0",
        -                "sebastian/version": "~1.0",
        +                "phpunit/phpunit-mock-objects": "^3.2",
        +                "sebastian/comparator": "^1.2.4",
        +                "sebastian/diff": "^1.4.3",
        +                "sebastian/environment": "^1.3.4 || ^2.0",
        +                "sebastian/exporter": "~2.0",
        +                "sebastian/global-state": "^1.1",
        +                "sebastian/object-enumerator": "~2.0",
        +                "sebastian/resource-operations": "~1.0",
        +                "sebastian/version": "~1.0.3|~2.0",
                         "symfony/yaml": "~2.1|~3.0"
                     },
        +            "conflict": {
        +                "phpdocumentor/reflection-docblock": "3.0.2"
        +            },
        +            "require-dev": {
        +                "ext-pdo": "*"
        +            },
                     "suggest": {
        +                "ext-xdebug": "*",
                         "phpunit/php-invoker": "~1.1"
                     },
                     "bin": [
        @@ -4529,7 +5291,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "4.8.x-dev"
        +                    "dev-master": "5.7.x-dev"
                         }
                     },
                     "autoload": {
        @@ -4555,30 +5317,33 @@
                         "testing",
                         "xunit"
                     ],
        -            "time": "2016-07-21 06:48:14"
        +            "time": "2017-06-21T08:11:54+00:00"
                 },
                 {
                     "name": "phpunit/phpunit-mock-objects",
        -            "version": "2.3.8",
        +            "version": "3.4.4",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
        -                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
        +                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
        -                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
        +                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
        +                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
                         "shasum": ""
                     },
                     "require": {
                         "doctrine/instantiator": "^1.0.2",
        -                "php": ">=5.3.3",
        -                "phpunit/php-text-template": "~1.2",
        -                "sebastian/exporter": "~1.2"
        +                "php": "^5.6 || ^7.0",
        +                "phpunit/php-text-template": "^1.2",
        +                "sebastian/exporter": "^1.2 || ^2.0"
        +            },
        +            "conflict": {
        +                "phpunit/phpunit": "<5.4.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~4.4"
        +                "phpunit/phpunit": "^5.4"
                     },
                     "suggest": {
                         "ext-soap": "*"
        @@ -4586,7 +5351,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "2.3.x-dev"
        +                    "dev-master": "3.2.x-dev"
                         }
                     },
                     "autoload": {
        @@ -4611,26 +5376,71 @@
                         "mock",
                         "xunit"
                     ],
        -            "time": "2015-10-02 06:51:40"
        +            "time": "2017-06-30T09:13:00+00:00"
                 },
                 {
        -            "name": "sebastian/comparator",
        -            "version": "1.2.0",
        +            "name": "sebastian/code-unit-reverse-lookup",
        +            "version": "1.0.1",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/sebastianbergmann/comparator.git",
        -                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
        +                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
        +                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
        -                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
        +                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
        +                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": "^5.6 || ^7.0"
        +            },
        +            "require-dev": {
        +                "phpunit/phpunit": "^5.7 || ^6.0"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0.x-dev"
        +                }
        +            },
        +            "autoload": {
        +                "classmap": [
        +                    "src/"
        +                ]
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "BSD-3-Clause"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Sebastian Bergmann",
        +                    "email": "sebastian@phpunit.de"
        +                }
        +            ],
        +            "description": "Looks up which function or method a line of code belongs to",
        +            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
        +            "time": "2017-03-04T06:30:41+00:00"
        +        },
        +        {
        +            "name": "sebastian/comparator",
        +            "version": "1.2.4",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/sebastianbergmann/comparator.git",
        +                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
        +                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.3.3",
                         "sebastian/diff": "~1.2",
        -                "sebastian/exporter": "~1.2"
        +                "sebastian/exporter": "~1.2 || ~2.0"
                     },
                     "require-dev": {
                         "phpunit/phpunit": "~4.4"
        @@ -4675,27 +5485,27 @@
                         "compare",
                         "equality"
                     ],
        -            "time": "2015-07-26 15:48:44"
        +            "time": "2017-01-29T09:50:25+00:00"
                 },
                 {
                     "name": "sebastian/diff",
        -            "version": "1.4.1",
        +            "version": "1.4.3",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/diff.git",
        -                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
        +                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
        -                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
        +                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
        +                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
                         "shasum": ""
                     },
                     "require": {
        -                "php": ">=5.3.3"
        +                "php": "^5.3.3 || ^7.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "~4.8"
        +                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
                     },
                     "type": "library",
                     "extra": {
        @@ -4727,32 +5537,32 @@
                     "keywords": [
                         "diff"
                     ],
        -            "time": "2015-12-08 07:14:41"
        +            "time": "2017-05-22T07:24:03+00:00"
                 },
                 {
                     "name": "sebastian/environment",
        -            "version": "1.3.8",
        +            "version": "2.0.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/environment.git",
        -                "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
        +                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
        -                "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
        +                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
        +                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
                         "shasum": ""
                     },
                     "require": {
        -                "php": "^5.3.3 || ^7.0"
        +                "php": "^5.6 || ^7.0"
                     },
                     "require-dev": {
        -                "phpunit/phpunit": "^4.8 || ^5.0"
        +                "phpunit/phpunit": "^5.0"
                     },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.3.x-dev"
        +                    "dev-master": "2.0.x-dev"
                         }
                     },
                     "autoload": {
        @@ -4777,25 +5587,25 @@
                         "environment",
                         "hhvm"
                     ],
        -            "time": "2016-08-18 05:49:44"
        +            "time": "2016-11-26T07:53:53+00:00"
                 },
                 {
                     "name": "sebastian/exporter",
        -            "version": "1.2.2",
        +            "version": "2.0.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/sebastianbergmann/exporter.git",
        -                "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
        +                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
        -                "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
        +                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
        +                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.3.3",
        -                "sebastian/recursion-context": "~1.0"
        +                "sebastian/recursion-context": "~2.0"
                     },
                     "require-dev": {
                         "ext-mbstring": "*",
        @@ -4804,7 +5614,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.3.x-dev"
        +                    "dev-master": "2.0.x-dev"
                         }
                     },
                     "autoload": {
        @@ -4844,7 +5654,7 @@
                         "export",
                         "exporter"
                     ],
        -            "time": "2016-06-17 09:04:28"
        +            "time": "2016-11-19T08:54:04+00:00"
                 },
                 {
                     "name": "sebastian/global-state",
        @@ -4895,20 +5705,66 @@
                     "keywords": [
                         "global state"
                     ],
        -            "time": "2015-10-12 03:26:01"
        +            "time": "2015-10-12T03:26:01+00:00"
                 },
                 {
        -            "name": "sebastian/recursion-context",
        -            "version": "1.0.2",
        +            "name": "sebastian/object-enumerator",
        +            "version": "2.0.1",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/sebastianbergmann/recursion-context.git",
        -                "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
        +                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
        +                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
        -                "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
        +                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
        +                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.6",
        +                "sebastian/recursion-context": "~2.0"
        +            },
        +            "require-dev": {
        +                "phpunit/phpunit": "~5"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "2.0.x-dev"
        +                }
        +            },
        +            "autoload": {
        +                "classmap": [
        +                    "src/"
        +                ]
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "BSD-3-Clause"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Sebastian Bergmann",
        +                    "email": "sebastian@phpunit.de"
        +                }
        +            ],
        +            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
        +            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
        +            "time": "2017-02-18T15:18:39+00:00"
        +        },
        +        {
        +            "name": "sebastian/recursion-context",
        +            "version": "2.0.0",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/sebastianbergmann/recursion-context.git",
        +                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
        +                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
                         "shasum": ""
                     },
                     "require": {
        @@ -4920,7 +5776,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.0.x-dev"
        +                    "dev-master": "2.0.x-dev"
                         }
                     },
                     "autoload": {
        @@ -4948,23 +5804,73 @@
                     ],
                     "description": "Provides functionality to recursively process PHP variables",
                     "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
        -            "time": "2015-11-11 19:50:13"
        +            "time": "2016-11-19T07:33:16+00:00"
                 },
                 {
        -            "name": "sebastian/version",
        -            "version": "1.0.6",
        +            "name": "sebastian/resource-operations",
        +            "version": "1.0.0",
                     "source": {
                         "type": "git",
        -                "url": "https://github.com/sebastianbergmann/version.git",
        -                "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
        +                "url": "https://github.com/sebastianbergmann/resource-operations.git",
        +                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
        -                "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
        +                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
        +                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
                         "shasum": ""
                     },
        +            "require": {
        +                "php": ">=5.6.0"
        +            },
                     "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "1.0.x-dev"
        +                }
        +            },
        +            "autoload": {
        +                "classmap": [
        +                    "src/"
        +                ]
        +            },
        +            "notification-url": "https://packagist.org/downloads/",
        +            "license": [
        +                "BSD-3-Clause"
        +            ],
        +            "authors": [
        +                {
        +                    "name": "Sebastian Bergmann",
        +                    "email": "sebastian@phpunit.de"
        +                }
        +            ],
        +            "description": "Provides a list of PHP built-in functions that operate on resources",
        +            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
        +            "time": "2015-07-28T20:34:47+00:00"
        +        },
        +        {
        +            "name": "sebastian/version",
        +            "version": "2.0.1",
        +            "source": {
        +                "type": "git",
        +                "url": "https://github.com/sebastianbergmann/version.git",
        +                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
        +            },
        +            "dist": {
        +                "type": "zip",
        +                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
        +                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
        +                "shasum": ""
        +            },
        +            "require": {
        +                "php": ">=5.6"
        +            },
        +            "type": "library",
        +            "extra": {
        +                "branch-alias": {
        +                    "dev-master": "2.0.x-dev"
        +                }
        +            },
                     "autoload": {
                         "classmap": [
                             "src/"
        @@ -4983,68 +5889,41 @@
                     ],
                     "description": "Library that helps with managing the version number of Git-hosted PHP projects",
                     "homepage": "https://github.com/sebastianbergmann/version",
        -            "time": "2015-06-21 13:59:46"
        +            "time": "2016-10-03T07:35:21+00:00"
                 },
                 {
                     "name": "squizlabs/php_codesniffer",
        -            "version": "2.6.2",
        +            "version": "3.0.2",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
        -                "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83"
        +                "reference": "c7594a88ae75401e8f8d0bd4deb8431b39045c51"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4edb770cb853def6e60c93abb088ad5ac2010c83",
        -                "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83",
        +                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/c7594a88ae75401e8f8d0bd4deb8431b39045c51",
        +                "reference": "c7594a88ae75401e8f8d0bd4deb8431b39045c51",
                         "shasum": ""
                     },
                     "require": {
                         "ext-simplexml": "*",
                         "ext-tokenizer": "*",
                         "ext-xmlwriter": "*",
        -                "php": ">=5.1.2"
        +                "php": ">=5.4.0"
                     },
                     "require-dev": {
                         "phpunit/phpunit": "~4.0"
                     },
                     "bin": [
        -                "scripts/phpcs",
        -                "scripts/phpcbf"
        +                "bin/phpcs",
        +                "bin/phpcbf"
                     ],
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "2.x-dev"
        +                    "dev-master": "3.x-dev"
                         }
                     },
        -            "autoload": {
        -                "classmap": [
        -                    "CodeSniffer.php",
        -                    "CodeSniffer/CLI.php",
        -                    "CodeSniffer/Exception.php",
        -                    "CodeSniffer/File.php",
        -                    "CodeSniffer/Fixer.php",
        -                    "CodeSniffer/Report.php",
        -                    "CodeSniffer/Reporting.php",
        -                    "CodeSniffer/Sniff.php",
        -                    "CodeSniffer/Tokens.php",
        -                    "CodeSniffer/Reports/",
        -                    "CodeSniffer/Tokenizers/",
        -                    "CodeSniffer/DocGenerators/",
        -                    "CodeSniffer/Standards/AbstractPatternSniff.php",
        -                    "CodeSniffer/Standards/AbstractScopeSniff.php",
        -                    "CodeSniffer/Standards/AbstractVariableSniff.php",
        -                    "CodeSniffer/Standards/IncorrectPatternException.php",
        -                    "CodeSniffer/Standards/Generic/Sniffs/",
        -                    "CodeSniffer/Standards/MySource/Sniffs/",
        -                    "CodeSniffer/Standards/PEAR/Sniffs/",
        -                    "CodeSniffer/Standards/PSR1/Sniffs/",
        -                    "CodeSniffer/Standards/PSR2/Sniffs/",
        -                    "CodeSniffer/Standards/Squiz/Sniffs/",
        -                    "CodeSniffer/Standards/Zend/Sniffs/"
        -                ]
        -            },
                     "notification-url": "https://packagist.org/downloads/",
                     "license": [
                         "BSD-3-Clause"
        @@ -5061,20 +5940,20 @@
                         "phpcs",
                         "standards"
                     ],
        -            "time": "2016-07-13 23:29:13"
        +            "time": "2017-07-18T01:12:32+00:00"
                 },
                 {
                     "name": "symfony/browser-kit",
        -            "version": "v3.1.3",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/browser-kit.git",
        -                "reference": "d2a07cc11c5fa94820240b1e67592ffb18e347b9"
        +                "reference": "8079a6b3668ef15cdbf73a4c7d31081abb8bb5f0"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/d2a07cc11c5fa94820240b1e67592ffb18e347b9",
        -                "reference": "d2a07cc11c5fa94820240b1e67592ffb18e347b9",
        +                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8079a6b3668ef15cdbf73a4c7d31081abb8bb5f0",
        +                "reference": "8079a6b3668ef15cdbf73a4c7d31081abb8bb5f0",
                         "shasum": ""
                     },
                     "require": {
        @@ -5091,7 +5970,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.1-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -5118,73 +5997,20 @@
                     ],
                     "description": "Symfony BrowserKit Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-26 08:04:17"
        -        },
        -        {
        -            "name": "symfony/css-selector",
        -            "version": "v3.1.3",
        -            "source": {
        -                "type": "git",
        -                "url": "https://github.com/symfony/css-selector.git",
        -                "reference": "2851e1932d77ce727776154d659b232d061e816a"
        -            },
        -            "dist": {
        -                "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/css-selector/zipball/2851e1932d77ce727776154d659b232d061e816a",
        -                "reference": "2851e1932d77ce727776154d659b232d061e816a",
        -                "shasum": ""
        -            },
        -            "require": {
        -                "php": ">=5.5.9"
        -            },
        -            "type": "library",
        -            "extra": {
        -                "branch-alias": {
        -                    "dev-master": "3.1-dev"
        -                }
        -            },
        -            "autoload": {
        -                "psr-4": {
        -                    "Symfony\\Component\\CssSelector\\": ""
        -                },
        -                "exclude-from-classmap": [
        -                    "/Tests/"
        -                ]
        -            },
        -            "notification-url": "https://packagist.org/downloads/",
        -            "license": [
        -                "MIT"
        -            ],
        -            "authors": [
        -                {
        -                    "name": "Jean-François Simon",
        -                    "email": "jeanfrancois.simon@sensiolabs.com"
        -                },
        -                {
        -                    "name": "Fabien Potencier",
        -                    "email": "fabien@symfony.com"
        -                },
        -                {
        -                    "name": "Symfony Community",
        -                    "homepage": "https://symfony.com/contributors"
        -                }
        -            ],
        -            "description": "Symfony CssSelector Component",
        -            "homepage": "https://symfony.com",
        -            "time": "2016-06-29 05:41:56"
        +            "time": "2017-07-12T13:03:20+00:00"
                 },
                 {
                     "name": "symfony/dom-crawler",
        -            "version": "v3.1.3",
        +            "version": "v3.1.10",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/dom-crawler.git",
        -                "reference": "c7b9b8db3a6f2bac76dcd9a9db5446f2591897f9"
        +                "reference": "7eede2a901a19928494194f7d1815a77b9a473a0"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c7b9b8db3a6f2bac76dcd9a9db5446f2591897f9",
        -                "reference": "c7b9b8db3a6f2bac76dcd9a9db5446f2591897f9",
        +                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7eede2a901a19928494194f7d1815a77b9a473a0",
        +                "reference": "7eede2a901a19928494194f7d1815a77b9a473a0",
                         "shasum": ""
                     },
                     "require": {
        @@ -5227,29 +6053,35 @@
                     ],
                     "description": "Symfony DomCrawler Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-26 08:04:17"
        +            "time": "2017-01-21T17:13:55+00:00"
                 },
                 {
                     "name": "symfony/yaml",
        -            "version": "v3.1.3",
        +            "version": "v3.3.6",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/symfony/yaml.git",
        -                "reference": "1819adf2066880c7967df7180f4f662b6f0567ac"
        +                "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/symfony/yaml/zipball/1819adf2066880c7967df7180f4f662b6f0567ac",
        -                "reference": "1819adf2066880c7967df7180f4f662b6f0567ac",
        +                "url": "https://api.github.com/repos/symfony/yaml/zipball/ddc23324e6cfe066f3dd34a37ff494fa80b617ed",
        +                "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed",
                         "shasum": ""
                     },
                     "require": {
                         "php": ">=5.5.9"
                     },
        +            "require-dev": {
        +                "symfony/console": "~2.8|~3.0"
        +            },
        +            "suggest": {
        +                "symfony/console": "For validating YAML files using the lint command"
        +            },
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "3.1-dev"
        +                    "dev-master": "3.3-dev"
                         }
                     },
                     "autoload": {
        @@ -5276,24 +6108,24 @@
                     ],
                     "description": "Symfony Yaml Component",
                     "homepage": "https://symfony.com",
        -            "time": "2016-07-17 14:02:08"
        +            "time": "2017-07-23T12:43:26+00:00"
                 },
                 {
                     "name": "webmozart/assert",
        -            "version": "1.1.0",
        +            "version": "1.2.0",
                     "source": {
                         "type": "git",
                         "url": "https://github.com/webmozart/assert.git",
        -                "reference": "bb2d123231c095735130cc8f6d31385a44c7b308"
        +                "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
                     },
                     "dist": {
                         "type": "zip",
        -                "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308",
        -                "reference": "bb2d123231c095735130cc8f6d31385a44c7b308",
        +                "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
        +                "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
                         "shasum": ""
                     },
                     "require": {
        -                "php": "^5.3.3|^7.0"
        +                "php": "^5.3.3 || ^7.0"
                     },
                     "require-dev": {
                         "phpunit/phpunit": "^4.6",
        @@ -5302,7 +6134,7 @@
                     "type": "library",
                     "extra": {
                         "branch-alias": {
        -                    "dev-master": "1.2-dev"
        +                    "dev-master": "1.3-dev"
                         }
                     },
                     "autoload": {
        @@ -5326,22 +6158,16 @@
                         "check",
                         "validate"
                     ],
        -            "time": "2016-08-09 15:02:57"
        +            "time": "2016-11-23T20:04:58+00:00"
                 }
             ],
             "aliases": [],
             "minimum-stability": "stable",
        -    "stability-flags": {
        -        "intervention/image": 20,
        -        "maknz/slack": 20,
        -        "erusev/parsedown": 20,
        -        "tecnickcom/tc-lib-barcode": 20,
        -        "neitanod/forceutf8": 20
        -    },
        +    "stability-flags": [],
             "prefer-stable": false,
             "prefer-lowest": false,
             "platform": {
        -        "php": ">=5.5.9"
        +        "php": ">=5.6.4"
             },
             "platform-dev": []
         }
        diff --git a/config/app.php b/config/app.php
        index 753a568228..5fbfc80739 100755
        --- a/config/app.php
        +++ b/config/app.php
        @@ -2,6 +2,18 @@
         
         return [
         
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Application Name
        +    |--------------------------------------------------------------------------
        +    |
        +    | This value is the name of your application. This value is used when the
        +    | framework needs to place the application's name in a notification or
        +    | any other location as required by the application or its packages.
        +    */
        +
        +    'name' => env('SITE_NAME', 'Snipe-IT'),
        +
             /*
             |--------------------------------------------------------------------------
             | Application Environment
        @@ -66,7 +78,7 @@ return [
             |
             */
         
        -    'locale' =>  env('APP_LOCALE', 'en'),
        +    'locale' =>  env('APP_LOCALE', 'en_US.UTF-8'),
         
             /*
             |--------------------------------------------------------------------------
        @@ -94,7 +106,7 @@ return [
         
             'key' => env('APP_KEY'),
         
        -    'cipher' => 'rijndael-256',
        +    'cipher' =>  env('APP_CIPHER', 'AES-256-CBC'),
         
             /*
             |--------------------------------------------------------------------------
        @@ -184,6 +196,7 @@ return [
                 Illuminate\Foundation\Providers\FoundationServiceProvider::class,
                 Illuminate\Hashing\HashServiceProvider::class,
                 Illuminate\Mail\MailServiceProvider::class,
        +        Illuminate\Notifications\NotificationServiceProvider::class,
                 Illuminate\Pagination\PaginationServiceProvider::class,
                 Illuminate\Pipeline\PipelineServiceProvider::class,
                 Illuminate\Queue\QueueServiceProvider::class,
        @@ -195,15 +208,7 @@ return [
                 Illuminate\View\ViewServiceProvider::class,
         
                 /*
        -         * Application Service Providers...
        -         */
        -        App\Providers\AppServiceProvider::class,
        -        App\Providers\AuthServiceProvider::class,
        -        App\Providers\EventServiceProvider::class,
        -        App\Providers\RouteServiceProvider::class,
        -
        -        /*
        -         * Vendor service providers
        +         * Package Service Providers...
                  */
         
                 Barryvdh\Debugbar\ServiceProvider::class,
        @@ -212,13 +217,26 @@ return [
                 Collective\Html\HtmlServiceProvider::class,
                 Spatie\Backup\BackupServiceProvider::class,
                 Fideloper\Proxy\TrustedProxyServiceProvider::class,
        -        MisterPhilip\MaintenanceMode\MaintenanceModeServiceProvider::class,
        -        MisterPhilip\MaintenanceMode\MaintenanceCommandServiceProvider::class,
                 PragmaRX\Google2FA\Vendor\Laravel\ServiceProvider::class,
        +        Laravel\Passport\PassportServiceProvider::class,
        +        Laravel\Tinker\TinkerServiceProvider::class,
        +        Unicodeveloper\DumbPassword\DumbPasswordServiceProvider::class,
        +        Schuppo\PasswordStrength\PasswordStrengthServiceProvider::class,
        +
        +
                 /*
        -         * Custom service provider
        -         */
        -         App\Providers\MacroServiceProvider::class,
        +        * Application Service Providers...
        +        */
        +        App\Providers\AppServiceProvider::class,
        +        App\Providers\AuthServiceProvider::class,
        +        App\Providers\EventServiceProvider::class,
        +        App\Providers\RouteServiceProvider::class,
        +
        +
        +        /*
        +        * Custom service provider
        +        */
        +        App\Providers\MacroServiceProvider::class,
         
         
             ],
        @@ -236,42 +254,47 @@ return [
         
             'aliases' => [
         
        -        'App'       => Illuminate\Support\Facades\App::class,
        -        'Artisan'   => Illuminate\Support\Facades\Artisan::class,
        -        'Auth'      => Illuminate\Support\Facades\Auth::class,
        -        'Blade'     => Illuminate\Support\Facades\Blade::class,
        -        'Cache'     => Illuminate\Support\Facades\Cache::class,
        -        'Config'    => Illuminate\Support\Facades\Config::class,
        -        'Cookie'    => Illuminate\Support\Facades\Cookie::class,
        -        'Crypt'     => Illuminate\Support\Facades\Crypt::class,
        -        'DB'        => Illuminate\Support\Facades\DB::class,
        -        'Debugbar'  => Barryvdh\Debugbar\Facade::class,
        -        'Eloquent'  => Illuminate\Database\Eloquent\Model::class,
        -        'Event'     => Illuminate\Support\Facades\Event::class,
        -        'File'      => Illuminate\Support\Facades\File::class,
        -        'Gate'      => Illuminate\Support\Facades\Gate::class,
        -        'Hash'      => Illuminate\Support\Facades\Hash::class,
        -        'Image'     => Intervention\Image\Facades\Image::class,
        -        'Input'     => Illuminate\Support\Facades\Input::class,
        -        'Lang'      => Illuminate\Support\Facades\Lang::class,
        -        'Log'       => Illuminate\Support\Facades\Log::class,
        -        'Mail'      => Illuminate\Support\Facades\Mail::class,
        -        'Password'  => Illuminate\Support\Facades\Password::class,
        -        'Queue'     => Illuminate\Support\Facades\Queue::class,
        -        'Redirect'  => Illuminate\Support\Facades\Redirect::class,
        -        'Redis'     => Illuminate\Support\Facades\Redis::class,
        -        'Request'   => Illuminate\Support\Facades\Request::class,
        -        'Response'  => Illuminate\Support\Facades\Response::class,
        -        'Route'     => Illuminate\Support\Facades\Route::class,
        -        'Schema'    => Illuminate\Support\Facades\Schema::class,
        -        'Session'   => Illuminate\Support\Facades\Session::class,
        -        'Storage'   => Illuminate\Support\Facades\Storage::class,
        -        'URL'       => Illuminate\Support\Facades\URL::class,
        +        'App' => Illuminate\Support\Facades\App::class,
        +        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        +        'Auth' => Illuminate\Support\Facades\Auth::class,
        +        'Blade' => Illuminate\Support\Facades\Blade::class,
        +        'Bus' => Illuminate\Support\Facades\Bus::class,
        +        'Cache' => Illuminate\Support\Facades\Cache::class,
        +        'Config' => Illuminate\Support\Facades\Config::class,
        +        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        +        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        +        'DB' => Illuminate\Support\Facades\DB::class,
        +        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        +        'Event' => Illuminate\Support\Facades\Event::class,
        +        'File' => Illuminate\Support\Facades\File::class,
        +        'Gate' => Illuminate\Support\Facades\Gate::class,
        +        'Hash' => Illuminate\Support\Facades\Hash::class,
        +        'Lang' => Illuminate\Support\Facades\Lang::class,
        +        'Log' => Illuminate\Support\Facades\Log::class,
        +        'Mail' => Illuminate\Support\Facades\Mail::class,
        +        'Notification' => Illuminate\Support\Facades\Notification::class,
        +        'Password' => Illuminate\Support\Facades\Password::class,
        +        'Queue' => Illuminate\Support\Facades\Queue::class,
        +        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        +        'Redis' => Illuminate\Support\Facades\Redis::class,
        +        'Request' => Illuminate\Support\Facades\Request::class,
        +        'Response' => Illuminate\Support\Facades\Response::class,
        +        'Route' => Illuminate\Support\Facades\Route::class,
        +        'Schema' => Illuminate\Support\Facades\Schema::class,
        +        'Session' => Illuminate\Support\Facades\Session::class,
        +        'Storage' => Illuminate\Support\Facades\Storage::class,
        +        'URL' => Illuminate\Support\Facades\URL::class,
                 'Validator' => Illuminate\Support\Facades\Validator::class,
        -        'View'      => Illuminate\Support\Facades\View::class,
        -        'Form'      => 'Collective\Html\FormFacade',
        -        'Html'      => 'Collective\Html\HtmlFacade',
        +        'View' => Illuminate\Support\Facades\View::class,
        +        'Input' => Illuminate\Support\Facades\Input::class,
        +        'Form'      => Collective\Html\FormFacade::class,
        +        'Html'      => Collective\Html\HtmlFacade::class,
                 'Google2FA' => PragmaRX\Google2FA\Vendor\Laravel\Facade::class,
        +        'Debugbar' => Barryvdh\Debugbar\Facade::class,
        +        'Image'     => Intervention\Image\ImageManagerStatic::class,
        +        'Carbon' => Carbon\Carbon::class,
        +
        +
             ],
         
         ];
        diff --git a/config/auth.php b/config/auth.php
        index 0d66c111be..5ce0913764 100644
        --- a/config/auth.php
        +++ b/config/auth.php
        @@ -42,7 +42,7 @@ return [
                 ],
         
                 'api' => [
        -            'driver' => 'token',
        +            'driver' => 'passport',
                     'provider' => 'users',
                 ],
             ],
        @@ -70,10 +70,6 @@ return [
                     'model' => App\Models\User::class,
                 ],
         
        -        // 'users' => [
        -        //     'driver' => 'database',
        -        //     'table' => 'users',
        -        // ],
             ],
         
             /*
        diff --git a/config/database.php b/config/database.php
        index 0806c1dc99..28a8c85be0 100755
        --- a/config/database.php
        +++ b/config/database.php
        @@ -54,18 +54,19 @@ return [
         
                 'sqlite_testing' => [
                     'driver'   => 'sqlite',
        -            'database' => database_path('testing.sqlite'),
        +            'database' => ':memory:',
                     'prefix'   => '',
                 ],
         
                 'mysql' => [
                     'driver'    => 'mysql',
                     'host'      => env('DB_HOST', 'localhost'),
        +            'port'      => env('DB_PORT', '3306'),
                     'database'  => env('DB_DATABASE', 'forge'),
                     'username'  => env('DB_USERNAME', 'forge'),
                     'password'  => env('DB_PASSWORD', ''),
        -            'charset'   => 'utf8',
        -            'collation' => 'utf8_unicode_ci',
        +            'charset'   => 'utf8mb4',
        +            'collation' => 'utf8mb4_unicode_ci',
                     'prefix'    => env('DB_PREFIX', null),
                     'strict'    => false,
                     'engine'    => null,
        diff --git a/config/debugbar.php b/config/debugbar.php
        index 18ebfaf3cf..aeb5005615 100644
        --- a/config/debugbar.php
        +++ b/config/debugbar.php
        @@ -70,7 +70,7 @@ return array(
              | Extension, without the server-side code. It uses Debugbar collectors instead.
              |
              */
        -    'clockwork' => false,
        +    'clockwork' => true,
         
             /*
              |--------------------------------------------------------------------------
        @@ -91,13 +91,13 @@ return array(
                 'db'              => true,  // Show database (PDO) queries and bindings
                 'views'           => true,  // Views with their data
                 'route'           => true,  // Current route information
        -        'laravel'         => false, // Laravel version and environment
        -        'events'          => false, // All events fired
        +        'laravel'         => true, // Laravel version and environment
        +        'events'          => true, // All events fired
                 'default_request' => false, // Regular or special Symfony request logger
                 'symfony_request' => true,  // Only one can be enabled..
                 'mail'            => true,  // Catch mail messages
        -        'logs'            => false, // Add the latest log messages
        -        'files'           => false, // Show the included files
        +        'logs'            => true, // Add the latest log messages
        +        'files'           => true, // Show the included files
                 'config'          => false, // Display config settings
                 'auth'            => true, // Display Laravel authentication status
                 'gate'            => true, // Display Laravel Gate checks
        diff --git a/config/mail.php b/config/mail.php
        index 2f901d3ded..f975f9d788 100755
        --- a/config/mail.php
        +++ b/config/mail.php
        @@ -132,4 +132,15 @@ return [
         
             'sendmail' => '/usr/sbin/sendmail -bs',
         
        +    
        +    
        +    
        +    'markdown' => [
        +        'theme' => 'default',
        +
        +        'paths' => [
        +            resource_path('views/vendor/mail'),
        +        ],
        +    ],
        +
         ];
        diff --git a/config/permissions.php b/config/permissions.php
        index 22f5c8222c..6e578ae9d8 100644
        --- a/config/permissions.php
        +++ b/config/permissions.php
        @@ -18,6 +18,7 @@ return array(
                     'note'       => 'Determines whether the user has access to most aspects of the admin. ',
                     'display'    => true,
                 ),
        +
                 array(
                     'permission' => 'admin.api_key',
                     'label'      => 'Create API Key',
        @@ -84,8 +85,8 @@ return array(
                 array(
                     'permission' => 'assets.audit',
                     'label'      => 'Audit ',
        -            'note'       => '',
        -            'display'    => false,
        +            'note'       => 'Allows the user to mark an asset as physically inventoried.',
        +            'display'    => true,
                 ),
         
         
        @@ -279,6 +280,257 @@ return array(
         
             ),
         
        +
        +    'Models' => array(
        +        array(
        +            'permission' => 'models.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'models.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'models.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'models.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +
        +    ),
        +
        +    'Categories' => array(
        +        array(
        +            'permission' => 'categories.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'categories.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'categories.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'categories.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +    'Departments' => array(
        +        array(
        +            'permission' => 'departments.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'departments.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'departments.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'departments.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +    'Status Labels' => array(
        +        array(
        +            'permission' => 'statuslabels.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'statuslabels.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'statuslabels.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'statuslabels.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +    'Custom Fields' => array(
        +        array(
        +            'permission' => 'customfields.view',
        +            'label'      => 'View',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'customfields.create',
        +            'label'      => 'Create',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'customfields.edit',
        +            'label'      => 'Edit',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'customfields.delete',
        +            'label'      => 'Delete',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +
        +
        +    'Suppliers' => array(
        +        array(
        +            'permission' => 'suppliers.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'suppliers.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'suppliers.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'suppliers.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +
        +    'Manufacturers' => array(
        +        array(
        +            'permission' => 'manufacturers.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'manufacturers.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'manufacturers.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'manufacturers.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +    'Depreciations' => array(
        +        array(
        +            'permission' => 'depreciations.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'depreciations.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'depreciations.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'depreciations.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +    'Locations' => array(
        +        array(
        +            'permission' => 'locations.view',
        +            'label'      => 'View ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'locations.create',
        +            'label'      => 'Create ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'locations.edit',
        +            'label'      => 'Edit  ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +        array(
        +            'permission' => 'locations.delete',
        +            'label'      => 'Delete ',
        +            'note'       => '',
        +            'display'    => true,
        +        ),
        +    ),
        +
        +
        +
        +
             'Self' => array(
                 array(
                     'permission' => 'self.two_factor',
        @@ -287,9 +539,17 @@ return array(
                     'display'    => true,
                 ),
         
        +        array(
        +            'permission' => 'self.api',
        +            'label'      => 'Create API Keys',
        +            'note'       => 'The user create personal API keys to utilize the REST API.',
        +            'display'    => true,
        +        ),
        +
             ),
         
         
         
         
        +
         );
        diff --git a/config/services.php b/config/services.php
        index 93eec86365..882d047709 100644
        --- a/config/services.php
        +++ b/config/services.php
        @@ -35,4 +35,11 @@ return [
                 'secret' => env('STRIPE_SECRET'),
             ],
         
        +    'stunning' => [
        +        'enabled' => env('ENABLE_STUNNING', false),
        +        'app_key'  => env('STUNNING_APP_KEY'),
        +        'stripe_id'    => env('STUNNING_STRIPE_ID'),
        +    ],
        +
        +
         ];
        diff --git a/config/trustedproxy.php b/config/trustedproxy.php
        index 4026962719..0d056715ff 100644
        --- a/config/trustedproxy.php
        +++ b/config/trustedproxy.php
        @@ -9,15 +9,56 @@ return [
              * supported, along with CIDR notation.
              *
              * The "*" character is syntactic sugar
        -     * within TrustedProxy to trust any proxy;
        +     * within TrustedProxy to trust any proxy
        +     * that connects directly to your server,
              * a requirement when you cannot know the address
              * of your proxy (e.g. if using Rackspace balancers).
        +     *
        +     * The "**" character is syntactic sugar within
        +     * TrustedProxy to trust not just any proxy that
        +     * connects directly to your server, but also
        +     * proxies that connect to those proxies, and all
        +     * the way back until you reach the original source
        +     * IP. It will mean that $request->getClientIp()
        +     * always gets the originating client IP, no matter
        +     * how many proxies that client's request has
        +     * subsequently passed through.
              */
        -    'proxies' => env('APP_TRUSTED_PROXIES') !== null ? explode(env('APP_TRUSTED_PROXIES'), ',') : '*',
        +    'proxies' => env('APP_TRUSTED_PROXIES') !== null ?
        +        explode(',', env('APP_TRUSTED_PROXIES')) : '*',
         
             /*
        -     * Or, to trust all proxies, uncomment this:
        +     * Or, to trust all proxies that connect
        +     * directly to your server, uncomment this:
              */
        -     # 'proxies' => '*',
        +    // 'proxies' => '*',
         
        -];
        \ No newline at end of file
        +    /*
        +     * Or, to trust ALL proxies, including those that
        +     * are in a chain of forwarding, uncomment this:
        +    */
        +    // 'proxies' => '**',
        +
        +    /*
        +     * Default Header Names
        +     *
        +     * Change these if the proxy does
        +     * not send the default header names.
        +     *
        +     * Note that headers such as X-Forwarded-For
        +     * are transformed to HTTP_X_FORWARDED_FOR format.
        +     *
        +     * The following are Symfony defaults, found in
        +     * \Symfony\Component\HttpFoundation\Request::$trustedHeaders
        +     *
        +     * We may also want to add something like:
        +     * \Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_SCHEME',
        +     */
        +    'headers' => [
        +        \Illuminate\Http\Request::HEADER_CLIENT_IP    => 'X_FORWARDED_FOR',
        +        \Illuminate\Http\Request::HEADER_CLIENT_HOST  => 'X_FORWARDED_HOST',
        +        \Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
        +        \Illuminate\Http\Request::HEADER_CLIENT_PORT  => 'X_FORWARDED_PORT',
        +
        +    ]
        +];
        diff --git a/config/version.php b/config/version.php
        index 6b2255eb61..c0c582148c 100644
        --- a/config/version.php
        +++ b/config/version.php
        @@ -1,7 +1,7 @@
         <?php
         return array (
        -  'app_version' => 'v3.6.6',
        +  'app_version' => 'v4.0',
           'build_version' => '1',
        -  'hash_version' => 'gee2c67a',
        -  'full_hash' => 'v3.6.6-gee2c67a',
        +  'hash_version' => 'g998c4a5',
        +  'full_hash' => 'v4.0-1-g998c4a5',
         );
        diff --git a/database/factories/ActionLogFactory.php b/database/factories/ActionLogFactory.php
        new file mode 100644
        index 0000000000..63adbb5aa6
        --- /dev/null
        +++ b/database/factories/ActionLogFactory.php
        @@ -0,0 +1,111 @@
        +<?php
        +
        +use App\Models\Actionlog;
        +
        +$factory->defineAs(App\Models\Actionlog::class, 'asset-upload', function ($faker) {
        +    $asset = factory(App\Models\Asset::class)->create();
        +    return [
        +        'item_type' => get_class($asset),
        +        'item_id' => $asset->id,
        +        'user_id' => function () {
        +            return factory(App\Models\User::class)->create()->id;
        +        },
        +        'filename' => $faker->word,
        +        'action_type' => 'uploaded'
        +    ];
        +});
        +
        +$factory->defineAs(Actionlog::class, 'asset-checkout', function (Faker\Generator $faker) {
        +    $company =  factory(App\Models\Company::class)->create();
        +    $user = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $target = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    // $item = factory(App\Models\Asset::class)->create(['company_id' => $company->id]);
        +// dd($item);
        +    return [
        +        'user_id' => $user->id,
        +        'action_type' => 'checkout',
        +        'item_id' => factory(App\Models\Asset::class)->create(['company_id' => $company->id])->id,
        +        'item_type'  => App\Models\Asset::class,
        +        'target_id' => $target->id,
        +        'target_type' => get_class($target),
        +        'created_at'  => $faker->dateTime(),
        +        'note' => $faker->sentence,
        +        'company_id' => $company->id
        +    ];
        +});
        +
        +$factory->defineAs(Actionlog::class, 'license-checkout-asset', function (Faker\Generator $faker) {
        +    $company =  factory(App\Models\Company::class)->create();
        +    $user = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $target = factory(App\Models\Asset::class)->create(['company_id' => $company->id]);
        +    $item = factory(App\Models\License::class)->create(['company_id' => $company->id]);
        +
        +    return [
        +        'user_id' => $user->id,
        +        'action_type' => 'checkout',
        +        'item_id' => $item->id,
        +        'item_type'  => get_class($item),
        +        'target_id' => $target->id,
        +        'target_type' => get_class($target),
        +        'created_at'  => $faker->dateTime(),
        +        'note' => $faker->sentence,
        +        'company_id' => $company->id
        +    ];
        +});
        +
        +$factory->defineAs(Actionlog::class, 'accessory-checkout', function (Faker\Generator $faker) {
        +    $company =  factory(App\Models\Company::class)->create();
        +    $user = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $target = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $item = factory(App\Models\Accessory::class)->create(['company_id' => $company->id]);
        +
        +    return [
        +        'user_id' => $user->id,
        +        'action_type' => 'checkout',
        +        'item_id' => $item->id,
        +        'item_type'  => get_class($item),
        +        'target_id' => $target->id,
        +        'target_type' => get_class($target),
        +        'created_at'  => $faker->dateTime(),
        +        'note' => $faker->sentence,
        +        'company_id' => $company->id
        +    ];
        +});
        +
        +$factory->defineAs(Actionlog::class, 'consumable-checkout', function (Faker\Generator $faker) {
        +    $company =  factory(App\Models\Company::class)->create();
        +    $user = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $target = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $item = factory(App\Models\Consumable::class)->create(['company_id' => $company->id]);
        +
        +    return [
        +        'user_id' => $user->id,
        +        'action_type' => 'checkout',
        +        'item_id' => $item->id,
        +        'item_type'  => get_class($item),
        +        'target_id' => $target->id,
        +        'target_type' => get_class($target),
        +        'created_at'  => $faker->dateTime(),
        +        'note' => $faker->sentence,
        +        'company_id' => $company->id
        +    ];
        +});
        +
        +$factory->defineAs(Actionlog::class, 'component-checkout', function (Faker\Generator $faker) {
        +    $company =  factory(App\Models\Company::class)->create();
        +    $user = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $target = factory(App\Models\User::class)->create(['company_id' => $company->id]);
        +    $item = factory(App\Models\Component::class)->create(['company_id' => $company->id]);
        +
        +    return [
        +        'user_id' => $user->id,
        +        'action_type' => 'checkout',
        +        'item_id' => $item->id,
        +        'item_type'  => get_class($item),
        +        'target_id' => $target->id,
        +        'target_type' => get_class($target),
        +        'created_at'  => $faker->dateTime(),
        +        'note' => $faker->sentence,
        +        'company_id' => $company->id
        +    ];
        +});
        diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php
        new file mode 100644
        index 0000000000..de873c17b0
        --- /dev/null
        +++ b/database/factories/AssetFactory.php
        @@ -0,0 +1,115 @@
        +<?php
        +
        +use App\Models\Asset;
        +use App\Models\AssetModel;
        +use App\Models\Category;
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Model Factories
        +|--------------------------------------------------------------------------
        +|
        +| Factories related exclusively to modelling assets.
        +|
        +*/
        +
        +$factory->define(Asset::class, function (Faker\Generator $faker) {
        +    return [
        +        'name' => $faker->catchPhrase,
        +        'model_id' => function () {
        +            return factory(App\Models\AssetModel::class)->create()->id;
        +        },
        +        'rtd_location_id' => function () {
        +            return factory(App\Models\Location::class)->create()->id;
        +        },
        +        'serial' => $faker->uuid,
        +        'status_id' => function () {
        +            return factory(App\Models\Statuslabel::class)->states('rtd')->create()->id;
        +        },
        +        'user_id' => function () {
        +            return factory(App\Models\User::class)->create()->id;
        +        },
        +        'asset_tag' => $faker->unixTime('now'),
        +        'notes'   => $faker->sentence,
        +        'purchase_date' => $faker->dateTime(),
        +        'purchase_cost' => $faker->randomFloat(2),
        +        'order_number' => $faker->numberBetween(1000000, 50000000),
        +        'supplier_id' => function () {
        +            return factory(App\Models\Supplier::class)->create()->id;
        +        },
        +        'company_id' => function () {
        +            return factory(App\Models\Company::class)->create()->id;
        +        },
        +        'requestable' => $faker->boolean()
        +    ];
        +});
        +
        +$factory->state(Asset::class, 'deleted', function ($faker) {
        +    return [
        +        'deleted_at' => $faker->dateTime(),
        +    ];
        +});
        +
        +$factory->state(Asset::class, 'assigned-to-user', function ($faker) {
        +    return [
        +        'assigned_to' => factory(App\Models\User::class)->create()->id,
        +        'assigned_type' => App\Models\User::class,
        +    ];
        +});
        +
        +$factory->state(Asset::class, 'assigned-to-location', function ($faker) {
        +    return [
        +        'assigned_to' => factory(App\Models\Location::class)->create()->id,
        +        'assigned_type' => App\Models\Location::class,
        +    ];
        +});
        +
        +$factory->state(Asset::class, 'assigned-to-asset', function ($faker) {
        +    return [
        +        'assigned_to' => factory(App\Models\Asset::class)->create()->id,
        +        'assigned_type' => App\Models\Asset::class,
        +    ];
        +});
        +
        +$factory->state(Asset::class, 'requires-acceptance', function ($faker) {
        +    $cat = factory(Category::class)->states('asset-category', 'requires-acceptance')->create();
        +    $model = factory(AssetModel::class)->create(['category_id' => $cat->id]);
        +    return [
        +        'model_id' => $model->id
        +    ];
        +});
        +
        +$factory->define(App\Models\AssetModel::class, function (Faker\Generator $faker) {
        +    return [
        +    'name' => $faker->catchPhrase,
        +    'manufacturer_id' => function () {
        +        return factory(App\Models\Manufacturer::class)->create()->id;
        +    },
        +    'category_id' => function () {
        +        return factory(App\Models\Category::class)->states('asset-category')->create()->id;
        +    },
        +    'model_number' => $faker->numberBetween(1000000, 50000000),
        +    'eol' => 1,
        +    'notes' => $faker->paragraph(),
        +    'requestable' => $faker->boolean(),
        +    'depreciation_id' => function () {
        +        return factory(App\Models\Depreciation::class)->create()->id;
        +    },
        +    ];
        +});
        +
        +$factory->define(App\Models\AssetMaintenance::class, function (Faker\Generator $faker) {
        +    return [
        +        'asset_id' => function () {
        +            return factory(App\Models\Asset::class)->create()->id;
        +        },
        +        'supplier_id' => function () {
        +            return factory(App\Models\Supplier::class)->create()->id;
        +        },
        +        'asset_maintenance_type' => $faker->randomElement(['maintenance', 'repair', 'upgrade']),
        +        'title' => $faker->sentence,
        +        'start_date' => $faker->date(),
        +        'is_warranty' => $faker->boolean(),
        +        'notes' => $faker->paragraph(),
        +    ];
        +});
        diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php
        new file mode 100644
        index 0000000000..640b8add67
        --- /dev/null
        +++ b/database/factories/CategoryFactory.php
        @@ -0,0 +1,52 @@
        +<?php
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Category Factories
        +|--------------------------------------------------------------------------
        +|
        +| Factories related exclusively to creating categories and the various states..
        +|
        +*/
        +
        +
        +$factory->define(App\Models\Category::class, function (Faker\Generator $faker) {
        +    return [
        +    'name' => $faker->text(20),
        +    'category_type' => $faker->randomElement(['asset', 'accessory', 'component', 'consumable']),
        +    'eula_text' => $faker->paragraph(),
        +    'require_acceptance' => false,
        +    'use_default_eula' => $faker->boolean(),
        +    'checkin_email' => $faker->boolean()
        +    ];
        +});
        +
        +$factory->state(App\Models\Category::class, 'asset-category', function ($faker) {
        +    return [
        +        'category_type' => 'asset',
        +    ];
        +});
        +
        +$factory->state(App\Models\Category::class, 'accessory-category', function ($faker) {
        +    return [
        +        'category_type' => 'accessory',
        +    ];
        +});
        +
        +$factory->state(App\Models\Category::class, 'component-category', function ($faker) {
        +    return [
        +        'category_type' => 'component',
        +    ];
        +});
        +
        +$factory->state(App\Models\Category::class, 'consumable-category', function ($faker) {
        +    return [
        +        'category_type' => 'consumable',
        +    ];
        +});
        +
        +$factory->state(App\Models\Category::class, 'requires-acceptance', function ($faker) {
        +    return [
        +        'require_acceptance' => true,
        +    ];
        +});
        diff --git a/database/factories/CustomFieldsFactory.php b/database/factories/CustomFieldsFactory.php
        new file mode 100644
        index 0000000000..6b67c7cd48
        --- /dev/null
        +++ b/database/factories/CustomFieldsFactory.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +
        +$factory->define(App\Models\CustomField::class, function (Faker\Generator $faker) {
        +    return [
        +    'name' => $faker->catchPhrase,
        +    'format' => 'IP',
        +    'element' => 'text',
        +    ];
        +});
        +
        +$factory->define(App\Models\CustomFieldset::class, function (Faker\Generator $faker) {
        +    return [
        +        'name' => $faker->catchPhrase,
        +        'user_id' => Auth::id()
        +    ];
        +});
        diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php
        index 2f621abc07..902d633ffa 100644
        --- a/database/factories/ModelFactory.php
        +++ b/database/factories/ModelFactory.php
        @@ -11,399 +11,197 @@
         |
         */
         
        +use App\Models\AssetModel;
        +use App\Models\Category;
         use App\Models\Company;
         use App\Models\Location;
         use App\Models\Manufacturer;
        +use App\Models\Statuslabel;
         use App\Models\Supplier;
         
        -$factory->defineAs(App\Models\Asset::class, 'asset', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->catchPhrase,
        -    'model_id' => $faker->numberBetween(1,5),
        -    'rtd_location_id' => $faker->numberBetween(1,5),
        -    'serial' => $faker->uuid,
        -    'status_id' => 1,
        -    'user_id' => 1,
        -    'asset_tag' => $faker->unixTime('now'),
        -    'notes'   => $faker->sentence,
        -    'purchase_date' 		=> $faker->dateTime(),
        -    'purchase_cost' 		=> $faker->randomFloat(2),
        -    'order_number' => $faker->numberBetween(1000000,50000000),
        -    'supplier_id' => $faker->numberBetween(1,5),
        -    'requestable' => $faker->numberBetween(0,1),
        -    'company_id' => Company::inRandomOrder()->first()->id,
        -    'requestable' => $faker->boolean()
        -  ];
        -});
        -
        -
        -$factory->defineAs(App\Models\AssetModel::class, 'assetmodel', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->catchPhrase,
        -    'manufacturer_id' => $faker->numberBetween(1,10),
        -    'category_id' => $faker->numberBetween(1,9),
        -    'model_number' => $faker->numberBetween(1000000,50000000),
        -    'eol' => 1,
        -    'notes' => $faker->paragraph(),
        -    'requestable' => $faker->boolean(),
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Location::class, 'location', function (Faker\Generator $faker) {
        +$factory->define(App\Models\Accessory::class, function (Faker\Generator $faker) {
             return [
        -        'name' => $faker->catchPhrase,
        -        'address' => $faker->streetAddress,
        -        'address2' => $faker->secondaryAddress,
        -        'city' => $faker->city,
        -        'state' => $faker->stateAbbr,
        -        'country' => $faker->countryCode,
        -        'currency' => $faker->currencyCode,
        -        'zip' => $faker->postcode
        +    'company_id' => function () {
        +        return factory(App\Models\Company::class)->create()->id;
        +    },
        +    'name' => $faker->text(20),
        +    'category_id' => function () {
        +        return factory(App\Models\Category::class)->states('accessory-category')->create()->id;
        +    },
        +    'manufacturer_id' => function () {
        +        return factory(App\Models\Manufacturer::class)->create()->id;
        +    },
        +    'location_id' => function () {
        +        return factory(App\Models\Location::class)->create()->id;
        +    },
        +    'order_number' => $faker->numberBetween(1000000, 50000000),
        +    'purchase_date' => $faker->dateTime(),
        +    'purchase_cost' => $faker->randomFloat(2),
        +    'qty' => $faker->numberBetween(5, 10),
        +    'min_amt' => $faker->numberBetween($min = 1, $max = 2),
             ];
         });
         
        -$factory->defineAs(App\Models\Category::class, 'asset-category', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->text(20),
        -    'category_type' => $faker->randomElement($array = array ('asset')),
        -    'eula_text' => $faker->paragraph(),
        -    'require_acceptance' => $faker->boolean(),
        -    'checkin_email' => $faker->boolean()
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Category::class, 'accessory-category', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->text(20),
        -    'category_type' => $faker->randomElement($array = array ('accessory')),
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Category::class, 'component-category', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->text(20),
        -    'category_type' => $faker->randomElement($array = array ('component')),
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Category::class, 'consumable-category', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->text(20),
        -    'category_type' => $faker->randomElement($array = array ('consumable')),
        -  ];
        -});
        -
        -
        -$factory->defineAs(App\Models\Company::class, 'company', function (Faker\Generator $faker) {
        -  return [
        +$factory->define(App\Models\Company::class, function (Faker\Generator $faker) {
        +    return [
             'name' => $faker->company,
        -  ];
        +    ];
         });
         
        -$factory->defineAs(App\Models\Manufacturer::class, 'manufacturer', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->company,
        -  ];
        +$factory->define(App\Models\Component::class, function (Faker\Generator $faker) {
        +    return [
        +        'name' => $faker->text(20),
        +        'category_id' => function () {
        +            return factory(App\Models\Category::class)->create()->id;
        +        },
        +        'location_id' => function () {
        +            return factory(App\Models\Location::class)->create()->id;
        +        },
        +        'serial'   => $faker->uuid,
        +        'qty' => $faker->numberBetween(3, 10),
        +        'order_number' => $faker->numberBetween(1000000, 50000000),
        +        'purchase_date' => $faker->dateTime(),
        +        'purchase_cost' => $faker->randomFloat(2),
        +        'min_amt' => $faker->numberBetween($min = 1, $max = 2),
        +        'company_id' => function () {
        +            return factory(App\Models\Company::class)->create()->id;
        +        },
        +    ];
         });
         
        -$factory->defineAs(App\Models\Component::class, 'component', function (Faker\Generator $faker) {
        -  return [
        +$factory->define(App\Models\Consumable::class, function (Faker\Generator $faker) {
        +    return [
             'name' => $faker->text(20),
        -    'category_id' => $faker->numberBetween(21,25),
        -    'location_id' => Location::inRandomOrder()->first()->id,
        -    'serial'   => $faker->uuid,
        -    'qty' => $faker->numberBetween(3, 10),
        -    'order_number' => $faker->numberBetween(1000000,50000000),
        -    'purchase_date' 		=> $faker->dateTime(),
        -    'purchase_cost' 		=> $faker->randomFloat(2),
        +    'company_id' => function () {
        +            return factory(App\Models\Company::class)->create()->id;
        +    },
        +    'category_id' => function () {
        +            return factory(App\Models\Category::class)->create()->id;
        +    },
        +    'location_id' => function () {
        +            return factory(App\Models\Location::class)->create()->id;
        +    },
        +    'manufacturer_id' => function () {
        +        return factory(App\Models\Manufacturer::class)->create()->id;
        +    },
        +    'user_id' => function () {
        +        return factory(App\Models\User::class)->create()->id;
        +    },
        +    'model_number' => $faker->numberBetween(1000000, 50000000),
        +    'item_no' => $faker->numberBetween(1000000, 50000000),
        +    'order_number' => $faker->numberBetween(1000000, 50000000),
        +    'purchase_date' => $faker->dateTime(),
        +    'purchase_cost' => $faker->randomFloat(2),
        +    'qty' => $faker->numberBetween(5, 10),
             'min_amt' => $faker->numberBetween($min = 1, $max = 2),
        -    'company_id' => Company::inRandomOrder()->first()->id
        -  ];
        +    ];
         });
         
        -$factory->defineAs(App\Models\Depreciation::class, 'depreciation', function (Faker\Generator $faker) {
        -  return [
        +$factory->define(App\Models\Department::class, function (Faker\Generator $faker) {
        +    return [
        +    'name' => $faker->catchPhrase,
        +    'user_id' => '1',
        +    'location_id' => function () {
        +        return factory(App\Models\Location::class)->create()->id;
        +    },
        +    'company_id' => function () {
        +        return factory(App\Models\Company::class)->create()->id;
        +    },
        +    'manager_id' => function () {
        +        return factory(App\Models\User::class)->create()->id;
        +    },
        +
        +    ];
        +});
        +
        +$factory->define(App\Models\Depreciation::class, function (Faker\Generator $faker) {
        +    return [
             'name' => $faker->text(20),
             'months' => $faker->numberBetween(1, 10),
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Accessory::class, 'accessory', function (Faker\Generator $faker) {
        -  return [
        -    'company_id' => Company::inRandomOrder()->first()->id,
        -    'name' => $faker->text(20),
        -    'category_id' => $faker->numberBetween(11,15),
        -    'manufacturer_id' => Manufacturer::inRandomOrder()->first()->id,
        -    'location_id' => $faker->numberBetween(1,5),
        -    'order_number' => $faker->numberBetween(1000000,50000000),
        -    'purchase_date' 		=> $faker->dateTime(),
        -    'purchase_cost' 		=> $faker->randomFloat(2),
        -    'qty' => $faker->numberBetween(5, 10),
        -    'min_amt' => $faker->numberBetween($min = 1, $max = 2),
        -  ];
        -
        -});
        -
        -
        -$factory->defineAs(App\Models\Supplier::class, 'supplier', function (Faker\Generator $faker) {
        -    return [
        -        'name' => $faker->company,
        -        'address' => $faker->streetAddress,
        -        'address2' => $faker->secondaryAddress,
        -        'city' => $faker->city,
        -        'state' => $faker->stateAbbr,
        -        'zip' => $faker->postCode,
        -        'country' => $faker->countryCode,
        -        'contact' => $faker->name,
        -        'phone' => $faker->phoneNumber,
        -        'fax'   => $faker->phoneNumber,
        -        'email' => $faker->safeEmail,
        -        'url'   => $faker->url,
        -        'notes' => $faker->paragraph
             ];
         });
         
        -
        -$factory->defineAs(App\Models\Consumable::class, 'consumable', function (Faker\Generator $faker) {
        -  return [
        -    'name' => $faker->text(20),
        -    'company_id' => Company::inRandomOrder()->first()->id,
        -    'category_id' => $faker->numberBetween(16, 20),
        -    'model_number' => $faker->numberBetween(1000000,50000000),
        -    'item_no' => $faker->numberBetween(1000000,50000000),
        -    'order_number' => $faker->numberBetween(1000000,50000000),
        -    'purchase_date' 		=> $faker->dateTime(),
        -    'purchase_cost' 		=> $faker->randomFloat(2),
        -    'qty' => $faker->numberBetween(5, 10),
        -    'min_amt' => $faker->numberBetween($min = 1, $max = 2),
        -  ];
        -});
        -
        -
        -$factory->defineAs(App\Models\Statuslabel::class, 'rtd', function (Faker\Generator $faker) {
        -  return [
        -    'name'      => 'Ready to Deploy',
        -    'created_at' => $faker->dateTime(),
        -    'updated_at' => $faker->dateTime(),
        -    'user_id' => 1,
        -    'deleted_at' 		=> NULL,
        -    'deployable'	=> 1,
        -    'pending'	=> 0,
        -    'archived' => 0,
        -    'notes' => ''
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Statuslabel::class, 'pending', function (Faker\Generator $faker) {
        -  return [
        -    'name'  => 'Pending',
        -    'created_at' => $faker->dateTime(),
        -    'updated_at' => $faker->dateTime(),
        -    'user_id' => 1,
        -    'deleted_at' 		=> NULL,
        -    'deployable'	=> 0,
        -    'pending'	=> 1,
        -    'archived' => 0,
        -    'notes' => $faker->sentence
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Statuslabel::class, 'archived', function (Faker\Generator $faker) {
        -  return [
        -    'name'      => 'Archived',
        -    'created_at' => $faker->dateTime(),
        -    'updated_at' => $faker->dateTime(),
        -    'user_id' => 1,
        -    'deleted_at' 		=> NULL,
        -    'deployable'	=> 0,
        -    'pending'	=> 0,
        -    'archived' => 1,
        -    'notes' => 'These assets are permanently undeployable'
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Statuslabel::class, 'out_for_diagnostics', function (Faker\Generator $faker) {
        -  return [
        -    'name' => 'Out for Diagnostics',
        -    'created_at' => $faker->dateTime(),
        -    'updated_at' => $faker->dateTime(),
        -    'user_id' => 1,
        -    'deleted_at' 		=> NULL,
        -    'deployable'	=> 0,
        -    'pending'	=> 0,
        -    'archived' => 0,
        -    'notes' => ''
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Statuslabel::class, 'out_for_repair', function (Faker\Generator $faker) {
        -  return [
        -    'name'      => 'Out for Repair',
        -    'created_at' => $faker->dateTime(),
        -    'updated_at' => $faker->dateTime(),
        -    'user_id' => 1,
        -    'deleted_at' 		=> NULL,
        -    'deployable'	=> 0,
        -    'pending'	=> 0,
        -    'archived' => 0,
        -    'notes' => ''
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Statuslabel::class, 'broken', function (Faker\Generator $faker) {
        -  return [
        -    'name'      => 'Broken - Not Fixable',
        -    'created_at' => $faker->dateTime(),
        -    'updated_at' => $faker->dateTime(),
        -    'user_id' => 1,
        -    'deleted_at' 		=> NULL,
        -    'deployable'	=> 0,
        -    'pending'	=> 0,
        -    'archived' => 1,
        -     'notes' => ''
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Statuslabel::class, 'lost', function (Faker\Generator $faker) {
        -  return [
        -    'name'      => 'Lost/Stolen',
        -    'created_at' => $faker->dateTime(),
        -    'updated_at' => $faker->dateTime(),
        -    'user_id' => 1,
        -    'deleted_at' 		=> NULL,
        -    'deployable'	=> 0,
        -    'pending'	=> 0,
        -    'archived' => 1,
        -    'notes' => '',
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\License::class, 'license', function (Faker\Generator $faker) {
        +$factory->define(App\Models\License::class, function (Faker\Generator $faker) {
             return [
        -        'name'   => $faker->catchPhrase,
        -        'serial'   => $faker->uuid,
        -        'seats'   => $faker->numberBetween(1, 10),
        -        'license_email'   => $faker->safeEmail,
        -        'license_name'   => $faker->name,
        -        'order_number' => $faker->numberBetween(1500, 13250),
        -        'purchase_order' => $faker->numberBetween(1500, 13250),
        -        'purchase_date' 		=> $faker->dateTime(),
        -        'purchase_cost' 		=> $faker->randomFloat(2),
        -        'notes'   => $faker->sentence,
        -        'supplier_id' => Supplier::inRandomOrder()->first()->id,
        -        'company_id' => Company::inRandomOrder()->first()->id
        +    'name'   => $faker->catchPhrase,
        +    'serial'   => $faker->uuid,
        +    'seats'   => $faker->numberBetween(1, 10),
        +    'license_email'   => $faker->safeEmail,
        +    'license_name'   => $faker->name,
        +    'order_number' => $faker->numberBetween(1500, 13250),
        +    'purchase_order' => $faker->numberBetween(1500, 13250),
        +    'purchase_date' => $faker->dateTime(),
        +    'purchase_cost' => $faker->randomFloat(2),
        +    'notes' => $faker->sentence,
        +    'supplier_id' => function () {
        +        return factory(App\Models\Supplier::class)->create()->id;
        +    },
        +    'company_id' =>function () {
        +        return factory(App\Models\Company::class)->create()->id;
        +    },
             ];
         });
         
        -$factory->defineAs(App\Models\LicenseSeat::class, 'license-seat', function (Faker\Generator $faker) {
        -  return [
        -    'license_id'      	=> $faker->numberBetween(1, 10),
        -    'created_at' 		=> $faker->dateTime(),
        -    'updated_at' 		=> $faker->dateTime(),
        -    'notes' 			=> $faker->sentence,
        -    'user_id' 			=> '1',
        -  ];
        +$factory->define(App\Models\LicenseSeat::class, function (Faker\Generator $faker) {
        +    return [
        +    'license_id' => function () {
        +        return factory(App\Models\License::class)->create()->id;
        +    },
        +    'created_at' => $faker->dateTime(),
        +    'updated_at' => $faker->dateTime(),
        +    'notes' => $faker->sentence,
        +    'user_id' => '1',
        +    ];
         });
         
        -$factory->defineAs(App\Models\Actionlog::class, 'asset-checkout', function (Faker\Generator $faker) {
        -  $company = Company::has('users')->has('assets')->inRandomOrder()->first();
        -  return [
        -    'user_id'      	=> $company->users()->inRandomOrder()->first()->id,
        -    'action_type' 		=> 'checkout',
        -    'item_id' 		=> $company->assets()->inRandomOrder()->first()->id,
        -    'target_id' => $company->users()->inRandomOrder()->first()->id,
        -    'target_type' => 'App\\Models\\User',
        -    'created_at'  => $faker->dateTime(),
        -    'item_type'  => 'App\\Models\\Asset',
        -    'note' 			=> $faker->sentence,
        -    'company_id' => $company->id
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Actionlog::class, 'license-checkout-asset', function (Faker\Generator $faker) {
        -  $company = Company::has('users')->has('licenses')->inRandomOrder()->first();
        -
        -  return [
        -    'user_id'      	=> $company->users()->inRandomOrder()->first()->id,
        -    'action_type' 		=> 'checkout',
        -    'item_id' 		=> $company->licenses()->whereNotNull('company_id')->inRandomOrder()->first()->id,
        -    'target_id' => $company->assets()->inRandomOrder()->first()->id,
        -    'target_type' => 'App\\Models\\Asset',
        -    'created_at'  => $faker->dateTime(),
        -    'item_type'  => 'App\\Models\\License',
        -    'note' 			=> $faker->sentence,
        -    'company_id' => $company->id
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Actionlog::class, 'accessory-checkout', function (Faker\Generator $faker) {
        -    $company = Company::has('users')->has('accessories')->inRandomOrder()->first();
        -  return [
        -    'user_id'      	=> $company->users()->inRandomOrder()->first()->id,
        -    'action_type' 		=> 'checkout',
        -    'item_id' 		=> $company->accessories()->whereNotNull('company_id')->inRandomOrder()->first()->id,
        -    'target_id' => $company->users()->inRandomOrder()->first()->id,
        -    'target_type' => 'App\\Models\\User',
        -    'created_at'  => $faker->dateTime(),
        -    'item_type'  => 'App\\Models\\Accessory',
        -    'note' 			=> $faker->sentence,
        -    'company_id' => $company->id
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Actionlog::class, 'consumable-checkout', function (Faker\Generator $faker) {
        -    $company = Company::has('users')->has('consumables')->inRandomOrder()->first();
        -
        -  return [
        -    'user_id'      	=> $company->users()->inRandomOrder()->first()->id,
        -    'action_type' 		=> 'checkout',
        -    'item_id' 		=> $company->consumables()->whereNotNull('company_id')->inRandomOrder()->first()->id,
        -    'target_id' => $company->users()->inRandomOrder()->first()->id,
        -    'target_type' => 'App\\Models\\User',
        -    'created_at'  => $faker->dateTime(),
        -    'item_type'  => 'App\\Models\\Consumable',
        -    'note' 			=> $faker->sentence,
        -    'company_id' => $company->id
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\Actionlog::class, 'component-checkout', function (Faker\Generator $faker) {
        -   $company = Company::has('users')->has('components')->inRandomOrder()->first();
        -
        -  return [
        -    'user_id'      	=> $company->users()->inRandomOrder()->first()->id,
        -    'action_type' 		=> 'checkout',
        -    'item_id' 		=> $company->components()->whereNotNull('company_id')->inRandomOrder()->first()->id,
        -    'target_id' => $company->users()->inRandomOrder()->first()->id,
        -    'target_type' => 'App\\Models\\User',
        -    'created_at'  => $faker->dateTime(),
        -    'item_type'  => 'App\\Models\\Component',
        -    'note' 			=> $faker->sentence,
        -    'company_id' => $company->id
        -  ];
        -});
        -
        -$factory->defineAs(App\Models\CustomField::class, 'customfield-ip', function (Faker\Generator $faker) {
        -  return [
        +$factory->define(App\Models\Location::class, function (Faker\Generator $faker) {
        +    return [
             'name' => $faker->catchPhrase,
        -    'format' => 'IP',
        -    'element' => 'text',
        -  ];
        -});
        -
        -
        -$factory->defineAs(App\Models\User::class, 'valid-user', function (Faker\Generator $faker) {
        -    return [
        -        'first_name' => $faker->firstName,
        -        'last_name' => $faker->lastName,
        -        'username' => $faker->username,
        -        'password' => $faker->password,
        -        'email' => $faker->safeEmail,
        -        'company_id' => Company::inRandomOrder()->first()->id,
        -        'locale' => $faker->locale,
        -        'employee_num' => $faker->numberBetween(3500, 35050),
        -        'jobtitle' => $faker->word,
        -        'phone' => $faker->phoneNumber,
        -        'notes' => $faker->sentence
        +    'address' => $faker->streetAddress,
        +    'address2' => $faker->secondaryAddress,
        +    'city' => $faker->city,
        +    'state' => $faker->stateAbbr,
        +    'country' => $faker->countryCode,
        +    'currency' => $faker->currencyCode,
        +    'zip' => $faker->postcode
        +    ];
        +});
        +
        +$factory->define(App\Models\Manufacturer::class, function (Faker\Generator $faker) {
        +    return [
        +    'name' => $faker->company,
        +    ];
        +});
        +
        +$factory->define(App\Models\Supplier::class, function (Faker\Generator $faker) {
        +    return [
        +    'name' => $faker->company,
        +    'address' => $faker->streetAddress,
        +    'address2' => $faker->secondaryAddress,
        +    'city' => $faker->city,
        +    'state' => $faker->stateAbbr,
        +    'zip' => $faker->postCode,
        +    'country' => $faker->countryCode,
        +    'contact' => $faker->name,
        +    'phone' => $faker->phoneNumber,
        +    'fax'   => $faker->phoneNumber,
        +    'email' => $faker->safeEmail,
        +    'url'   => $faker->url,
        +    'notes' => $faker->text(255) // Supplier notes can be a max of 255 characters.
        +    ];
        +});
        +
        +$factory->define(App\Models\Setting::class, function ($faker) {
        +    return [
        +        'user_id' => 1,
        +        'per_page' => 20,
        +        'site_name' => $faker->sentence,
        +        'auto_increment_assets' => false,
        +        'alert_email' => $faker->safeEmail(),
        +        'alerts_enabled' => false,
        +        'brand' => 1,
        +        'default_currency' => $faker->currencyCode,
        +        'locale' => $faker->locale,
        +        'pwd_secure_min' => 5,
             ];
         });
        diff --git a/database/factories/StatusLabelFactory.php b/database/factories/StatusLabelFactory.php
        new file mode 100644
        index 0000000000..60b0bbc508
        --- /dev/null
        +++ b/database/factories/StatusLabelFactory.php
        @@ -0,0 +1,60 @@
        +<?php
        +
        +use App\Models\Statuslabel;
        +
        +$factory->define(Statuslabel::class, function (Faker\Generator $faker) {
        +    return [
        +        'name'      => $faker->sentence,
        +        'created_at' => $faker->dateTime(),
        +        'updated_at' => $faker->dateTime(),
        +        'user_id' => 1,
        +        'deleted_at' => null,
        +        'deployable' => 0,
        +        'pending' => 0,
        +        'archived' => 0,
        +        'notes' => ''
        +    ];
        +});
        +$factory->state(Statuslabel::class, 'rtd', function (Faker\Generator $faker) {
        +    return [
        +        'notes' => $faker->sentence,
        +        'deployable' => 1
        +    ];
        +});
        +$factory->state(Statuslabel::class, 'pending', function (Faker\Generator $faker) {
        +    return [
        +        'notes' => $faker->sentence,
        +        'pending' => 1,
        +    ];
        +});
        +
        +$factory->state(Statuslabel::class, 'archived', function (Faker\Generator $faker) {
        +    return [
        +        'notes' => 'These assets are permanently undeployable',
        +        'archived' => 1,
        +    ];
        +});
        +
        +$factory->state(Statuslabel::class, 'out_for_diagnostics', function (Faker\Generator $faker) {
        +    return [
        +        'name' => 'Out for Diagnostics',
        +    ];
        +});
        +
        +$factory->state(Statuslabel::class, 'out_for_repair', function (Faker\Generator $faker) {
        +    return [
        +        'name'      => 'Out for Repair',
        +    ];
        +});
        +
        +$factory->state(Statuslabel::class, 'broken', function (Faker\Generator $faker) {
        +    return [
        +        'name'      => 'Broken - Not Fixable',
        +    ];
        +});
        +
        +$factory->state(Statuslabel::class, 'lost', function (Faker\Generator $faker) {
        +    return [
        +        'name'      => 'Lost/Stolen',
        +    ];
        +});
        diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
        new file mode 100644
        index 0000000000..76e3c277e4
        --- /dev/null
        +++ b/database/factories/UserFactory.php
        @@ -0,0 +1,252 @@
        +<?php
        +
        +use App\Models\Company;
        +
        +$factory->define(App\Models\User::class, function (Faker\Generator $faker) {
        +    return [
        +        'first_name' => $faker->firstName,
        +        'last_name' => $faker->lastName,
        +        'username' => $faker->username,
        +        'password' => $faker->password,
        +        'permissions' => '{"user":"0"}',
        +        'email' => $faker->safeEmail,
        +        'company_id' => function () {
        +                return factory(App\Models\Company::class)->create()->id;
        +        },
        +        'locale' => $faker->locale,
        +        'employee_num' => $faker->numberBetween(3500, 35050),
        +        'jobtitle' => $faker->word,
        +        'phone' => $faker->phoneNumber,
        +        'notes' => $faker->sentence,
        +        'location_id' => function () {
        +            return factory(App\Models\Location::class)->create()->id;
        +        },
        +    ];
        +});
        +// USER GLOBAL PERMISSION STATES
        +$factory->state(App\Models\User::class, 'superuser', function ($faker) {
        +    return [
        +        'permissions' => '{"superuser":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'admin', function ($faker) {
        +    return [
        +        'permissions' => '{"admin":"1"}',
        +    ];
        +});
        +// USER ASSET PERMISSION STATES
        +$factory->state(App\Models\User::class, 'view-assets', function ($faker) {
        +    return [
        +        'permissions' => '{"assets.view":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'create-assets', function ($faker) {
        +    return [
        +        'permissions' => '{"assets.create":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'edit-assets', function ($faker) {
        +    return [
        +        'permissions' => '{"assets.edit":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'delete-assets', function ($faker) {
        +    return [
        +        'permissions' => '{"assets.delete":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkin-assets', function ($faker) {
        +    return [
        +        'permissions' => '{"assets.checkin":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkout-assets', function ($faker) {
        +    return [
        +        'permissions' => '{"assets.checkout":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'view-requestable-assets', function ($faker) {
        +    return [
        +        'permissions' => '{"assets.view.requestable":"1"}',
        +    ];
        +});
        +
        +// USER ACCESSORY PERMISSION STATES
        +$factory->state(App\Models\User::class, 'view-accessories', function ($faker) {
        +    return [
        +        'permissions' => '{"accessories.view":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'create-accessories', function ($faker) {
        +    return [
        +        'permissions' => '{"accessories.create":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'edit-accessories', function ($faker) {
        +    return [
        +        'permissions' => '{"accessories.edit":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'delete-accessories', function ($faker) {
        +    return [
        +        'permissions' => '{"accessories.delete":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkin-accessories', function ($faker) {
        +    return [
        +        'permissions' => '{"accessories.checkin":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkout-accessories', function ($faker) {
        +    return [
        +        'permissions' => '{"accessories.checkout":"1"}',
        +    ];
        +});
        +
        +// USER CONSUMABLE PERMISSION STATES
        +$factory->state(App\Models\User::class, 'view-consumables', function ($faker) {
        +    return [
        +        'permissions' => '{"consumables.view":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'create-consumables', function ($faker) {
        +    return [
        +        'permissions' => '{"consumables.create":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'edit-consumables', function ($faker) {
        +    return [
        +        'permissions' => '{"consumables.edit":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'delete-consumables', function ($faker) {
        +    return [
        +        'permissions' => '{"consumables.delete":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkin-consumables', function ($faker) {
        +    return [
        +        'permissions' => '{"consumables.checkin":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkout-consumables', function ($faker) {
        +    return [
        +        'permissions' => '{"consumables.checkout":"1"}',
        +    ];
        +});
        +
        +// USER LICENSE PERMISSION STATES
        +$factory->state(App\Models\User::class, 'view-licenses', function ($faker) {
        +    return [
        +        'permissions' => '{"licenses.view":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'create-licenses', function ($faker) {
        +    return [
        +        'permissions' => '{"licenses.create":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'edit-licenses', function ($faker) {
        +    return [
        +        'permissions' => '{"licenses.edit":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'delete-licenses', function ($faker) {
        +    return [
        +        'permissions' => '{"licenses.delete":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkout-licenses', function ($faker) {
        +    return [
        +        'permissions' => '{"licenses.checkout":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'view-keys-licenses', function ($faker) {
        +    return [
        +        'permissions' => '{"licenses.keys":"1"}',
        +    ];
        +});
        +
        +// USER COMPONENTS PERMISSION STATES
        +$factory->state(App\Models\User::class, 'view-components', function ($faker) {
        +    return [
        +        'permissions' => '{"components.view":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'create-components', function ($faker) {
        +    return [
        +        'permissions' => '{"components.create":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'edit-components', function ($faker) {
        +    return [
        +        'permissions' => '{"components.edit":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'delete-components', function ($faker) {
        +    return [
        +        'permissions' => '{"components.delete":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkin-components', function ($faker) {
        +    return [
        +        'permissions' => '{"components.checkin":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'checkout-components', function ($faker) {
        +    return [
        +        'permissions' => '{"components.checkout":"1"}',
        +    ];
        +});
        +
        +// USER USER PERMISSION STATES
        +$factory->state(App\Models\User::class, 'view-users', function ($faker) {
        +    return [
        +        'permissions' => '{"users.view":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'create-users', function ($faker) {
        +    return [
        +        'permissions' => '{"users.create":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'edit-users', function ($faker) {
        +    return [
        +        'permissions' => '{"users.edit":"1"}',
        +    ];
        +});
        +
        +$factory->state(App\Models\User::class, 'delete-users', function ($faker) {
        +    return [
        +        'permissions' => '{"users.delete":"1"}',
        +    ];
        +});
        diff --git a/database/migrations/2016_12_19_004212_adjust_locale_length_to_10.php b/database/migrations/2016_12_19_004212_adjust_locale_length_to_10.php
        new file mode 100644
        index 0000000000..ef31f4080e
        --- /dev/null
        +++ b/database/migrations/2016_12_19_004212_adjust_locale_length_to_10.php
        @@ -0,0 +1,34 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AdjustLocaleLengthTo10 extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('users', function (Blueprint $table) {
        +            //
        +            $table->string('locale', 10)->nullable()->default(config('app.locale'))->change();
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('users', function (Blueprint $table) {
        +            //
        +            $table->string('locale', 5)->nullable()->default(config('app.locale'))->change();
        +        });
        +    }
        +}
        diff --git a/database/migrations/2016_12_19_133936_extend_phone_lengths_in_supplier_and_elsewhere.php b/database/migrations/2016_12_19_133936_extend_phone_lengths_in_supplier_and_elsewhere.php
        new file mode 100644
        index 0000000000..05752e7db8
        --- /dev/null
        +++ b/database/migrations/2016_12_19_133936_extend_phone_lengths_in_supplier_and_elsewhere.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class ExtendPhoneLengthsInSupplierAndElsewhere extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('suppliers', function (Blueprint $table) {
        +            //
        +            $table->string('phone',35)->nullable()->default(NULL)->change();
        +            $table->string('fax',35)->nullable()->default(NULL)->change();
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('suppliers', function (Blueprint $table) {
        +            //
        +            $table->string('phone',20)->nullable()->default(NULL)->change();
        +            $table->string('fax',20)->nullable()->default(NULL)->change();
        +
        +        });
        +    }
        +}
        diff --git a/database/migrations/2016_12_27_212631_make_asset_assigned_to_polymorphic.php b/database/migrations/2016_12_27_212631_make_asset_assigned_to_polymorphic.php
        new file mode 100644
        index 0000000000..d98212265b
        --- /dev/null
        +++ b/database/migrations/2016_12_27_212631_make_asset_assigned_to_polymorphic.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +use App\Models\Asset;
        +use App\Models\User;
        +
        +class MakeAssetAssignedToPolymorphic extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +         Schema::table('assets', function (Blueprint $table) {
        +             $table->string('assigned_type')->nullable();
        +         });
        +
        +        // Prior to this migration, asset's could only be assigned to users.
        +        Asset::whereNotNull('assigned_to')->orWhere('assigned_to', '!=', '')->update(['assigned_type' => User::class]);
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return voidatom
        +     */
        +    public function down()
        +    {
        +        Schema::table('assets', function (Blueprint $table) {
        +            $table->dropColumn('assigned_type');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_01_09_040429_create_locations_ldap_query_field.php b/database/migrations/2017_01_09_040429_create_locations_ldap_query_field.php
        new file mode 100644
        index 0000000000..f67f85c2aa
        --- /dev/null
        +++ b/database/migrations/2017_01_09_040429_create_locations_ldap_query_field.php
        @@ -0,0 +1,31 @@
        +<?php
        +
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class CreateLocationsLdapQueryField extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('locations', function ($table) {
        +            $table->string('ldap_ou')->nullable()->default(null);
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('locations', function (Blueprint $table) {
        +            $table->dropColumn('ldap_ou');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_01_14_002418_create_imports_table.php b/database/migrations/2017_01_14_002418_create_imports_table.php
        new file mode 100644
        index 0000000000..4e58c60808
        --- /dev/null
        +++ b/database/migrations/2017_01_14_002418_create_imports_table.php
        @@ -0,0 +1,35 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class CreateImportsTable extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::create('imports', function (Blueprint $table) {
        +            $table->increments('id');
        +            $table->string('name')->nullable();
        +            $table->string('file_path');
        +            $table->integer('filesize');
        +            $table->string('import_type')->nullable();
        +            $table->timestamps();
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::dropIfExists('imports');
        +    }
        +}
        diff --git a/database/migrations/2017_01_25_063357_fix_utf8_custom_field_column_names.php b/database/migrations/2017_01_25_063357_fix_utf8_custom_field_column_names.php
        new file mode 100644
        index 0000000000..5e8379bdad
        --- /dev/null
        +++ b/database/migrations/2017_01_25_063357_fix_utf8_custom_field_column_names.php
        @@ -0,0 +1,90 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Migrations\Migration;
        +use App\Models\CustomField;
        +use Illuminate\Database\Schema\Blueprint;
        +
        +/**
        + * Fixes issue #2551 where columns got donked if the field name in non-ascii
        + * format.
        + *
        + * The only time this is ever called is in the
        + * 2017_01_25_063357_fix_utf8_custom_field_column_names.php migration
        + * as a one-time fix.
        + *
        + * @author [A. Gianotto] [<snipe@snipe.net>]
        + * @since [v4.0]
        + * @return Array
        + */
        +
        +function updateLegacyColumnName($customfield) {
        +
        +    $name_to_db_name = CustomField::name_to_db_name($customfield->name);
        +    //\Log::debug('Trying to rename '.$name_to_db_name." to ".$customfield->convertUnicodeDbSlug()."...\n");
        +
        +    if (Schema::hasColumn(CustomField::$table_name, $name_to_db_name)) {
        +
        +        return Schema::table(CustomField::$table_name,
        +            function ($table)  use ($name_to_db_name, $customfield) {
        +                $table->renameColumn($name_to_db_name, $customfield->convertUnicodeDbSlug());
        +            }
        +        );
        +
        +    } else {
        +        //\Log::debug('Legacy DB column '.$name_to_db_name.' was not found on the assets table.');
        +    }
        +
        +}
        +
        +
        +
        +
        +class FixUtf8CustomFieldColumnNames extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        $platform = Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform();
        +        $platform->registerDoctrineTypeMapping('enum', 'string');
        +
        +        Schema::table('custom_fields', function ($table) {
        +            $table->string('db_column')->nullable();
        +            $table->text('help_text')->nullable();
        +        });
        +
        +        foreach(CustomField::all() as $field) {
        +
        +            $db_column = $field->convertUnicodeDbSlug();
        +
        +            DB::table('custom_fields')
        +                ->where('id', $field->id)
        +                ->update(['db_column' => $db_column]);
        +
        +            // change the name of the column
        +            updateLegacyColumnName($field);
        +
        +
        +        }
        +
        +
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('custom_fields', function ($table) {
        +            $table->dropColumn('db_column');
        +            $table->dropColumn('help_text');
        +        });
        +    }
        +
        +}
        diff --git a/database/migrations/2017_03_03_154632_add_time_date_display_to_settings.php b/database/migrations/2017_03_03_154632_add_time_date_display_to_settings.php
        new file mode 100644
        index 0000000000..b3f40ab98d
        --- /dev/null
        +++ b/database/migrations/2017_03_03_154632_add_time_date_display_to_settings.php
        @@ -0,0 +1,35 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddTimeDateDisplayToSettings extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            //
        +            $table->string('date_display_format')->default('Y-m-d');
        +            $table->string('time_display_format')->default('h:i A');
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('settings', function ($table) {
        +            $table->dropColumn('date_display_format');
        +            $table->dropColumn('time_display_format');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_03_10_210807_add_fields_to_manufacturer.php b/database/migrations/2017_03_10_210807_add_fields_to_manufacturer.php
        new file mode 100644
        index 0000000000..8e19b205cd
        --- /dev/null
        +++ b/database/migrations/2017_03_10_210807_add_fields_to_manufacturer.php
        @@ -0,0 +1,38 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddFieldsToManufacturer extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('manufacturers', function (Blueprint $table) {
        +            $table->string('url')->nullable()->default(null);
        +            $table->string('support_url')->nullable()->default(null);
        +            $table->string('support_phone')->nullable()->default(null);
        +            $table->string('support_email')->nullable()->default(null);
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('settings', function ($table) {
        +            $table->dropColumn('url');
        +            $table->dropColumn('support_url');
        +            $table->dropColumn('support_phone');
        +            $table->dropColumn('support_email');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_05_08_195520_increase_size_of_field_values_in_custom_fields.php b/database/migrations/2017_05_08_195520_increase_size_of_field_values_in_custom_fields.php
        new file mode 100644
        index 0000000000..8b6c12f658
        --- /dev/null
        +++ b/database/migrations/2017_05_08_195520_increase_size_of_field_values_in_custom_fields.php
        @@ -0,0 +1,33 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class IncreaseSizeOfFieldValuesInCustomFields extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('custom_fields', function ($table) {
        +            $table->text('field_values')->nullable()->default(null)->change();
        +        });
        +       
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('custom_fields', function ($table) {
        +            $table->string('field_values', 255)->nullable()->default(null)->change();
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_05_22_204422_create_departments.php b/database/migrations/2017_05_22_204422_create_departments.php
        new file mode 100644
        index 0000000000..cf2e1eaf7c
        --- /dev/null
        +++ b/database/migrations/2017_05_22_204422_create_departments.php
        @@ -0,0 +1,46 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class CreateDepartments extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('users', function (Blueprint $table) {
        +            $table->integer('department_id')->nullable()->default(null);
        +        });
        +
        +        Schema::create('departments', function (Blueprint $table) {
        +            $table->increments('id');
        +            $table->string('name');
        +            $table->integer('user_id');
        +            $table->integer('company_id')->nullable()->default(null);
        +            $table->integer('location_id')->nullable()->default(null);
        +            $table->integer('manager_id')->nullable()->default(null);
        +            $table->string('notes')->nullable()->default(null);
        +            $table->timestamps();
        +            $table->softDeletes();
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('users', function ($table) {
        +            $table->dropColumn('department_id');
        +        });
        +
        +        Schema::dropIfExists('departments');
        +    }
        +}
        diff --git a/database/migrations/2017_05_22_233509_add_manager_to_locations_table.php b/database/migrations/2017_05_22_233509_add_manager_to_locations_table.php
        new file mode 100644
        index 0000000000..a103a85560
        --- /dev/null
        +++ b/database/migrations/2017_05_22_233509_add_manager_to_locations_table.php
        @@ -0,0 +1,34 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddManagerToLocationsTable extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('locations', function (Blueprint $table) {
        +            //
        +            $table->integer('manager_id')->nullable()->default(null);
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('locations', function (Blueprint $table) {
        +            //
        +            $table->dropColumn('manager_id');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_06_14_122059_add_next_autoincrement_to_settings.php b/database/migrations/2017_06_14_122059_add_next_autoincrement_to_settings.php
        new file mode 100644
        index 0000000000..72046aee6c
        --- /dev/null
        +++ b/database/migrations/2017_06_14_122059_add_next_autoincrement_to_settings.php
        @@ -0,0 +1,48 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +use App\Models\Asset;
        +
        +class AddNextAutoincrementToSettings extends Migration
        +{
        +    
        +
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        $assets = Asset::select('asset_tag')->whereNull('deleted_at')->get();
        +        if (!$next = Asset::nextAutoIncrement($assets)) {
        +            $next = 1;
        +        }
        +
        +        Schema::table('settings', function (Blueprint $table) use ($next) {
        +            $table->bigInteger('next_auto_tag_base')->default('1');
        +        });
        +
        +        //\Log::debug('Setting '.$next.' as default auto-increment');
        +
        +        if ($settings = App\Models\Setting::first()) {
        +            $settings->next_auto_tag_base = $next;
        +            $settings->save();
        +        }
        +
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('settings', function ($table) {
        +            $table->dropColumn('next_auto_tag_base');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_06_18_151753_add_header_and_first_row_to_importer_table.php b/database/migrations/2017_06_18_151753_add_header_and_first_row_to_importer_table.php
        new file mode 100644
        index 0000000000..6947c421a1
        --- /dev/null
        +++ b/database/migrations/2017_06_18_151753_add_header_and_first_row_to_importer_table.php
        @@ -0,0 +1,38 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddHeaderAndFirstRowToImporterTable extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('imports', function (Blueprint $table) {
        +            // Add a json string representing the header row of the csv, and the first row of the csv.
        +            $table->text('header_row')->nullable()->default(null);
        +            $table->text('first_row')->nullable()->default(null);
        +            $table->text('field_map')->nullable()->default(null);
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('imports', function (Blueprint $table) {
        +            //
        +            $table->dropColumn('header_row');
        +            $table->dropColumn('first_row');
        +            $table->dropColumn('field_map');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_07_07_191533_add_login_text.php b/database/migrations/2017_07_07_191533_add_login_text.php
        new file mode 100644
        index 0000000000..5fbd953655
        --- /dev/null
        +++ b/database/migrations/2017_07_07_191533_add_login_text.php
        @@ -0,0 +1,32 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddLoginText extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->text('login_note')->nullable()->default(null);
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->dropColumn('login_note');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_07_25_130710_add_thumbsize_to_settings.php b/database/migrations/2017_07_25_130710_add_thumbsize_to_settings.php
        new file mode 100644
        index 0000000000..0e4799c986
        --- /dev/null
        +++ b/database/migrations/2017_07_25_130710_add_thumbsize_to_settings.php
        @@ -0,0 +1,32 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddThumbsizeToSettings extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->integer('thumbnail_max_h')->nullable()->default('50');
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->dropColumn('thumbnail_max_h');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_08_03_160105_set_asset_archived_to_zero_default.php b/database/migrations/2017_08_03_160105_set_asset_archived_to_zero_default.php
        new file mode 100644
        index 0000000000..12bf1bde3a
        --- /dev/null
        +++ b/database/migrations/2017_08_03_160105_set_asset_archived_to_zero_default.php
        @@ -0,0 +1,33 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class SetAssetArchivedToZeroDefault extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        $platform = Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform();
        +        $platform->registerDoctrineTypeMapping('enum', 'string');
        +
        +        Schema::table('assets', function (Blueprint $table) {
        +            $table->boolean('archived')->default(0)->change();
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        //
        +    }
        +}
        diff --git a/database/migrations/2017_08_22_180636_add_secure_password_options.php b/database/migrations/2017_08_22_180636_add_secure_password_options.php
        new file mode 100644
        index 0000000000..f2c0223e1b
        --- /dev/null
        +++ b/database/migrations/2017_08_22_180636_add_secure_password_options.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddSecurePasswordOptions extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->boolean('pwd_secure_uncommon')->default('0');
        +            $table->string('pwd_secure_complexity')->nullable()->default(NULL);
        +            $table->integer('pwd_secure_min')->default('8');
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->dropColumn('pwd_secure_uncommon');
        +            $table->dropColumn('pwd_secure_complexity');
        +            $table->dropColumn('pwd_secure_min');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_08_25_074822_add_auditing_tables.php b/database/migrations/2017_08_25_074822_add_auditing_tables.php
        new file mode 100644
        index 0000000000..e8a6f5209a
        --- /dev/null
        +++ b/database/migrations/2017_08_25_074822_add_auditing_tables.php
        @@ -0,0 +1,32 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddAuditingTables extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('assets', function (Blueprint $table) {
        +            $table->date('next_audit_date')->nullable()->default(NULL);
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('assets', function (Blueprint $table) {
        +            $table->dropColumn('next_audit_date');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_08_25_101435_add_auditing_to_settings.php b/database/migrations/2017_08_25_101435_add_auditing_to_settings.php
        new file mode 100644
        index 0000000000..7ef4ed306f
        --- /dev/null
        +++ b/database/migrations/2017_08_25_101435_add_auditing_to_settings.php
        @@ -0,0 +1,34 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Schema;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Database\Migrations\Migration;
        +
        +class AddAuditingToSettings extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     *
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->integer('audit_interval')->nullable()->default(NULL);
        +            $table->integer('audit_warning_days')->nullable()->default(NULL);
        +        });
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        Schema::table('settings', function (Blueprint $table) {
        +            $table->dropColumn('audit_interval');
        +            $table->dropColumn('audit_warning_days');
        +        });
        +    }
        +}
        diff --git a/database/migrations/2017_09_18_225619_fix_assigned_type_not_being_nulled.php b/database/migrations/2017_09_18_225619_fix_assigned_type_not_being_nulled.php
        new file mode 100644
        index 0000000000..b9d2239981
        --- /dev/null
        +++ b/database/migrations/2017_09_18_225619_fix_assigned_type_not_being_nulled.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +use App\Models\Asset;
        +use Illuminate\Database\Migrations\Migration;
        +use Illuminate\Database\Schema\Blueprint;
        +use Illuminate\Support\Facades\Schema;
        +
        +class FixAssignedTypeNotBeingNulled extends Migration
        +{
        +    /**
        +     * Run the migrations.
        +     * There was a point in the v4 beta process where assigned_type was not nulled on checkin
        +     * This manually nulls all assets where there is an assigned_type but not an assigned_to.
        +     * @return void
        +     */
        +    public function up()
        +    {
        +        // There was a point in the v4 beta process where assigned_type was not nulled on checkin
        +        // This manually nulls all assets where there is an assigned_type but not an assigned_to.
        +        Asset::whereNotNull('assigned_type')->whereNull('assigned_to')->update(['assigned_type' => null]);
        +
        +        // Additionally, the importer did not set assigned_type when importing.
        +        // In the case where we have an assigned_to but not an assigned_type, set the assigned_type to User.
        +        Asset::whereNotNull('assigned_to')->whereNull('assigned_type')->update(['assigned_type' => 'App\Models\User']);
        +    }
        +
        +    /**
        +     * Reverse the migrations.
        +     *
        +     * @return void
        +     */
        +    public function down()
        +    {
        +        //
        +    }
        +}
        diff --git a/database/seeds/AccessorySeeder.php b/database/seeds/AccessorySeeder.php
        index 81dafb98a4..f29a65fed6 100644
        --- a/database/seeds/AccessorySeeder.php
        +++ b/database/seeds/AccessorySeeder.php
        @@ -7,6 +7,6 @@ class AccessorySeeder extends Seeder
           public function run()
           {
             Accessory::truncate();
        -    factory(Accessory::class, 'accessory',15)->create();
        +    factory(Accessory::class,15)->create();
           }
         }
        diff --git a/database/seeds/ActionlogSeeder.php b/database/seeds/ActionlogSeeder.php
        index f7f9dd4e0c..bb81a4aa45 100644
        --- a/database/seeds/ActionlogSeeder.php
        +++ b/database/seeds/ActionlogSeeder.php
        @@ -8,9 +8,9 @@ class ActionlogSeeder extends Seeder
           {
             Actionlog::truncate();
             factory(Actionlog::class, 'asset-checkout',25)->create();
        -    factory(Actionlog::class, 'accessory-checkout',15)->create();
        -    factory(Actionlog::class, 'consumable-checkout', 15)->create();
        -    factory(Actionlog::class, 'component-checkout', 15)->create();
        -    factory(Actionlog::class, 'license-checkout-asset', 15)->create();
        +    // factory(Actionlog::class, 'accessory-checkout',15)->create();
        +    // factory(Actionlog::class, 'consumable-checkout', 15)->create();
        +    // factory(Actionlog::class, 'component-checkout', 15)->create();
        +    // factory(Actionlog::class, 'license-checkout-asset', 15)->create();
           }
         }
        diff --git a/database/seeds/AssetModelSeeder.php b/database/seeds/AssetModelSeeder.php
        index 90f40525a0..6d32f66593 100755
        --- a/database/seeds/AssetModelSeeder.php
        +++ b/database/seeds/AssetModelSeeder.php
        @@ -8,7 +8,7 @@ class AssetModelSeeder extends Seeder
             public function run()
             {
                 AssetModel::truncate();
        -        factory(AssetModel::class, 'assetmodel',5)->create();
        +        factory(AssetModel::class,5)->create();
             }
         
         }
        diff --git a/database/seeds/AssetSeeder.php b/database/seeds/AssetSeeder.php
        index dbaddcff03..a19e5dc741 100644
        --- a/database/seeds/AssetSeeder.php
        +++ b/database/seeds/AssetSeeder.php
        @@ -8,10 +8,6 @@ class AssetSeeder extends Seeder
           public function run()
           {
               Asset::truncate();
        -      factory(Asset::class, 'asset', 100)->create();
        -
        -      // factory(App\Models\Asset::class, 50)->create()->each(function($u) {
        -      //   $u->assetmodel()->save(factory(App\AssetModel::class)->make());
        -      // });
        +      factory(Asset::class, 100)->create();
           }
         }
        diff --git a/database/seeds/CategorySeeder.php b/database/seeds/CategorySeeder.php
        index b4d87424e3..6546b056cf 100755
        --- a/database/seeds/CategorySeeder.php
        +++ b/database/seeds/CategorySeeder.php
        @@ -7,10 +7,10 @@ class CategorySeeder extends Seeder
             public function run()
             {
                 Category::truncate();
        -        factory(Category::class, 'asset-category', 10)->create();
        -        factory(Category::class, 'accessory-category', 5)->create();
        -        factory(Category::class, 'consumable-category', 5)->create();
        -        factory(Category::class, 'component-category', 5)->create();
        +        factory(Category::class, 10)->states('asset-category')->create();
        +        factory(Category::class, 10)->states('accessory-category')->create();
        +        factory(Category::class, 10)->states('component-category')->create();
        +        factory(Category::class, 10)->states('consumable-category')->create();
             }
         
         }
        diff --git a/database/seeds/CompanySeeder.php b/database/seeds/CompanySeeder.php
        index 5b8a238662..ba1ac00ba9 100644
        --- a/database/seeds/CompanySeeder.php
        +++ b/database/seeds/CompanySeeder.php
        @@ -14,6 +14,6 @@ class CompanySeeder extends Seeder
             {
                 //
                 Company::truncate();
        -        factory(Company::class, 'company', 4)->create();
        +        factory(Company::class, 4)->create();
             }
         }
        diff --git a/database/seeds/ComponentSeeder.php b/database/seeds/ComponentSeeder.php
        index 079e20c14d..c1c9038669 100644
        --- a/database/seeds/ComponentSeeder.php
        +++ b/database/seeds/ComponentSeeder.php
        @@ -4,10 +4,10 @@ use App\Models\Component;
         
         class ComponentSeeder extends Seeder
         {
        -  public function run()
        -  {
        -    Component::truncate();
        -    DB::table('components_assets')->truncate();
        -    factory(Component::class, 'component',10)->create();
        -  }
        +    public function run()
        +    {
        +        Component::truncate();
        +        DB::table('components_assets')->truncate();
        +        factory(Component::class, 10)->create();
        +    }
         }
        diff --git a/database/seeds/ConsumableSeeder.php b/database/seeds/ConsumableSeeder.php
        index 39947c3f4d..4f538ed66f 100644
        --- a/database/seeds/ConsumableSeeder.php
        +++ b/database/seeds/ConsumableSeeder.php
        @@ -4,9 +4,9 @@ use App\Models\Consumable;
         
         class ConsumableSeeder extends Seeder
         {
        -  public function run()
        -  {
        -    Consumable::truncate();
        -    factory(Consumable::class, 'consumable',25)->create();
        -  }
        +    public function run()
        +    {
        +        Consumable::truncate();
        +        factory(Consumable::class, 25)->create();
        +    }
         }
        diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
        index 7ae5ed2308..bbbfbcb607 100644
        --- a/database/seeds/DatabaseSeeder.php
        +++ b/database/seeds/DatabaseSeeder.php
        @@ -15,20 +15,22 @@ class DatabaseSeeder extends Seeder
                 Model::unguard();
         
                 $this->call(CompanySeeder::class);
        +        $this->call(CategorySeeder::class);
                 $this->call(UserSeeder::class);
        +        $this->call(DepreciationSeeder::class);
                 $this->call(ManufacturerSeeder::class);
                 $this->call(LocationSeeder::class);
        +        $this->call(SupplierSeeder::class);
                 $this->call(AssetModelSeeder::class);
        +        $this->call(DepreciationSeeder::class);
        +        $this->call(StatuslabelSeeder::class);
                 $this->call(AccessorySeeder::class);
                 $this->call(AssetSeeder::class);
        +        $this->call(LicenseSeeder::class);
                 $this->call(ComponentSeeder::class);
                 $this->call(ConsumableSeeder::class);
        -        $this->call(StatuslabelSeeder::class);
        -        $this->call(SupplierSeeder::class);
        -        $this->call(CategorySeeder::class);
                 $this->call(LicenseSeeder::class);
                 $this->call(ActionlogSeeder::class);
        -        $this->call(DepreciationSeeder::class);
                 $this->call(CustomFieldSeeder::class);
         
                 Model::reguard();
        diff --git a/database/seeds/DepreciationSeeder.php b/database/seeds/DepreciationSeeder.php
        index ac567cd692..1ba63d54c3 100644
        --- a/database/seeds/DepreciationSeeder.php
        +++ b/database/seeds/DepreciationSeeder.php
        @@ -4,9 +4,9 @@ use App\Models\Depreciation;
         
         class DepreciationSeeder extends Seeder
         {
        -  public function run()
        -  {
        -    Depreciation::truncate();
        -    factory(Depreciation::class, 'depreciation')->create();
        -  }
        +    public function run()
        +    {
        +        Depreciation::truncate();
        +        factory(Depreciation::class, 5)->create();
        +    }
         }
        diff --git a/database/seeds/LicenseSeeder.php b/database/seeds/LicenseSeeder.php
        index a3c5c702ab..eebe7a1f65 100644
        --- a/database/seeds/LicenseSeeder.php
        +++ b/database/seeds/LicenseSeeder.php
        @@ -3,19 +3,14 @@ use Illuminate\Database\Seeder;
         use App\Models\License;
         use App\Models\LicenseSeat;
         
        -
         class LicenseSeeder extends Seeder
         {
        -  public function run()
        -  {
        -      License::truncate();
        -      factory(License::class, 'license', 10)->create();
        +    public function run()
        +    {
        +        License::truncate();
        +        factory(License::class, 10)->create();
         
        -      LicenseSeat::truncate();
        -      factory(LicenseSeat::class, 'license-seat', 10)->create();
        -
        -      // factory(App\Models\Asset::class, 50)->create()->each(function($u) {
        -      //   $u->assetmodel()->save(factory(App\AssetModel::class)->make());
        -      // });
        -  }
        +        LicenseSeat::truncate();
        +        factory(LicenseSeat::class, 10)->create();
        +    }
         }
        diff --git a/database/seeds/LocationSeeder.php b/database/seeds/LocationSeeder.php
        index fd0d3b2ed2..3f0b811814 100644
        --- a/database/seeds/LocationSeeder.php
        +++ b/database/seeds/LocationSeeder.php
        @@ -5,10 +5,9 @@ use App\Models\Location;
         
         class LocationSeeder extends Seeder
         {
        -  public function run()
        -  {
        -      Location::truncate();
        -      factory(Location::class, 'location', 5)->create();
        -
        -  }
        +    public function run()
        +    {
        +        Location::truncate();
        +        factory(Location::class, 5)->create();
        +    }
         }
        diff --git a/database/seeds/ManufacturerSeeder.php b/database/seeds/ManufacturerSeeder.php
        index 73388ca018..9528545b48 100644
        --- a/database/seeds/ManufacturerSeeder.php
        +++ b/database/seeds/ManufacturerSeeder.php
        @@ -7,7 +7,6 @@ class ManufacturerSeeder extends Seeder
             public function run()
             {
                 Manufacturer::truncate();
        -        factory(Manufacturer::class, 'manufacturer', 10)->create();
        +        factory(Manufacturer::class, 10)->create();
             }
        -
         }
        diff --git a/database/seeds/StatuslabelSeeder.php b/database/seeds/StatuslabelSeeder.php
        index ac9731504c..1c58d76a0b 100755
        --- a/database/seeds/StatuslabelSeeder.php
        +++ b/database/seeds/StatuslabelSeeder.php
        @@ -7,14 +7,13 @@ class StatuslabelSeeder extends Seeder
         {
             public function run()
             {
        -      Statuslabel::truncate();
        -      factory(Statuslabel::class, 'rtd')->create();
        -      factory(Statuslabel::class, 'pending')->create();
        -      factory(Statuslabel::class, 'archived')->create();
        -      factory(Statuslabel::class, 'out_for_diagnostics')->create();
        -      factory(Statuslabel::class, 'out_for_repair')->create();
        -      factory(Statuslabel::class, 'broken')->create();
        -      factory(Statuslabel::class, 'lost')->create();
        +        Statuslabel::truncate();
        +        factory(Statuslabel::class)->states('rtd')->create(['name' => "Ready to Deploy"]);
        +        factory(Statuslabel::class)->states('pending')->create(['name' => "Pending"]);
        +        factory(Statuslabel::class)->states('archived')->create(['name' => "Archived"]);
        +        factory(Statuslabel::class)->states('out_for_diagnostics')->create();
        +        factory(Statuslabel::class)->states('out_for_repair')->create();
        +        factory(Statuslabel::class)->states('broken')->create();
        +        factory(Statuslabel::class)->states('lost')->create();
             }
        -
         }
        diff --git a/database/seeds/SupplierSeeder.php b/database/seeds/SupplierSeeder.php
        index ea56bd09f7..95fd894c02 100644
        --- a/database/seeds/SupplierSeeder.php
        +++ b/database/seeds/SupplierSeeder.php
        @@ -6,8 +6,7 @@ class SupplierSeeder extends Seeder
         {
             public function run()
             {
        -      Supplier::truncate();
        -      factory(Supplier::class, 'supplier',5)->create();
        +        Supplier::truncate();
        +        factory(Supplier::class, 5)->create();
             }
        -
         }
        diff --git a/database/seeds/UserSeeder.php b/database/seeds/UserSeeder.php
        index 0141aab2cf..bff8abb6bb 100644
        --- a/database/seeds/UserSeeder.php
        +++ b/database/seeds/UserSeeder.php
        @@ -13,6 +13,6 @@ class UserSeeder extends Seeder
             public function run()
             {
                 // Don't truncate the user column, that might suck.
        -        factory(User::class, 'valid-user', 10)->create();
        +        factory(User::class, 10)->create();
             }
         }
        diff --git a/docker.env b/docker.env
        index 6c39a69518..88ed191ce1 100644
        --- a/docker.env
        +++ b/docker.env
        @@ -9,10 +9,10 @@ MYSQL_PASSWORD=tinglewingler
         #Email Variables
         MAIL_PORT_587_TCP_ADDR=smtp.mandrillapp.com
         MAIL_PORT_587_TCP_PORT=587
        -MAIL_ENV_FROM_ADDR=uberbrady@gmail.com
        -MAIL_ENV_FROM_NAME=Brady Wetherington
        +MAIL_ENV_FROM_ADDR=you@example.com
        +MAIL_ENV_FROM_NAME=Snipe-IT
         MAIL_ENV_ENCRYPTION=tcp
        -MAIL_ENV_USERNAME=uberbrady@gmail.com
        +MAIL_ENV_USERNAME=you@example.com
         MAIL_ENV_PASSWORD=N7AqLufTZMULWHWYwJ0ZCw
         MAIL_ENV_REPLYTO_ADDR=you@example.com
         MAIL_ENV_REPLYTO_NAME='Snipe-IT'
        diff --git a/gulpfile.js b/gulpfile.js
        deleted file mode 100644
        index 69741dfadb..0000000000
        --- a/gulpfile.js
        +++ /dev/null
        @@ -1,45 +0,0 @@
        -var elixir = require('laravel-elixir');
        -require('laravel-elixir-codeception-standalone');
        -/*
        - |--------------------------------------------------------------------------
        - | Elixir Asset Management
        - |--------------------------------------------------------------------------
        - |
        - | Elixir provides a clean, fluent API for defining some basic Gulp tasks
        - | for your Laravel application. By default, we are compiling the Sass
        - | file for our application, as well as publishing vendor resources.
        - |
        - */
        -
        -elixir(function(mix) {
        -    mix.less(['AdminLTE.less','skins/skin-blue.less','ekko-lightbox.less','overrides.less','fontawesome-animated.css'],'public/assets/css');
        -
        -
        -    mix.scripts([
        -        'plugins/jQuery/jQuery-2.1.4.min.js',
        -        'plugins/jQueryUI/jquery-ui.js',
        -        'plugins/jQueryUI/jquery.ui.widget.js',
        -        'plugins/iframe-transport/jquery.iframe-transport.js',
        -        'plugins/fileupload/jquery.fileupload.js',
        -        'bootstrap.js',
        -        'plugins/fastclick/fastclick.js',
        -        'plugins/slimScroll/jquery.slimscroll.js',
        -        'plugins/select2/select2.full.min.js',
        -        'plugins/colorpicker/bootstrap-colorpicker.js',
        -        'bootstrap-table.js',
        -        'plugins/datepicker/bootstrap-datepicker.js',
        -        'plugins/select2/select2.js',
        -        'plugins/iCheck/icheck.js',
        -        'ekko-lightbox.js',
        -        'snipeit.js',
        -        'app.js'
        -
        -    ],'public/assets/js');
        -    mix.version(['assets/css/app.css','assets/js/all.js']);
        -
        -
        -    mix.codeception(null, { flags: '--report' });
        -
        -
        -
        -});
        diff --git a/index.html b/index.html
        index 1baa9773c5..dbd1babcb8 100644
        --- a/index.html
        +++ b/index.html
        @@ -5,11 +5,6 @@
                  Snipe-IT Setup
               </title>
         
        -
        -        <link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">
        -
        -
        -
                 <style>
                   td, th {
                     font-size: 14px;
        diff --git a/package.json b/package.json
        index e641044dca..4f2c1e5b22 100644
        --- a/package.json
        +++ b/package.json
        @@ -1,21 +1,42 @@
         {
           "private": true,
           "scripts": {
        -    "prod": "gulp --production",
        -    "dev": "gulp watch"
        +    "dev": "npm run development",
        +    "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        +    "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        +    "watch-poll": "npm run watch -- --watch-poll",
        +    "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        +    "prod": "npm run production",
        +    "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js "
           },
           "devDependencies": {
        -    "bootstrap-sass": "^3.3.7",
        -    "gulp": "^3.9.1",
        -    "jquery": "^3.1.0",
        -    "laravel-elixir": "^6.0.0-11",
        -    "laravel-elixir-vue-2": "^0.2.0",
        -    "laravel-elixir-webpack-official": "^1.0.2",
        -    "lodash": "^4.16.2",
        -    "vue": "^2.0.1",
        -    "vue-resource": "^1.0.3"
        +    "axios": "^0.16.2",
        +    "babel-preset-latest": "^6.24.1",
        +    "cross-env": "^5.0.5",
        +    "jquery": "^3.1.1",
        +    "laravel-mix": "1.4.3",
        +    "lodash": "^4.17.4",
        +    "vue": "2.4.4",
        +    "vue-template-compiler": "2.4.4"
           },
           "dependencies": {
        -    "laravel-elixir-codeception": "^0.2.0"
        +    "blueimp-file-upload": "^9.18.0",
        +    "bootstrap": "^3.3.7",
        +    "bootstrap-colorpicker": "^2.5.1",
        +    "bootstrap-datepicker": "^1.6.4",
        +    "bootstrap-less": "^3.3.8",
        +    "ekko-lightbox": "^5.1.1",
        +    "fastclick": "^1.0.6",
        +    "font-awesome": "^4.7.0",
        +    "jquery-slimscroll": "^1.3.8",
        +    "jquery-ui": "^1.12.1",
        +    "jquery-ui-bundle": "^1.12.1",
        +    "jquery.iframe-transport": "^1.0.0",
        +    "less": "^2.7.2",
        +    "less-loader": "^4.0.5",
        +    "papaparse": "^4.3.3",
        +    "select2": "^4.0.3",
        +    "tether": "^1.4.0",
        +    "vue-resource": "^1.3.3"
           }
         }
        diff --git a/phpunit.xml b/phpunit.xml
        index 19d00c20db..c48a1e9ae4 100644
        --- a/phpunit.xml
        +++ b/phpunit.xml
        @@ -23,5 +23,7 @@
                 <env name="CACHE_DRIVER" value="array"/>
                 <env name="SESSION_DRIVER" value="array"/>
                 <env name="QUEUE_DRIVER" value="sync"/>
        +
        +        <env name="DB_CONNECTION" value="sqlite_testing" />
             </php>
         </phpunit>
        diff --git a/public/assets/compiled/css/app.css b/public/assets/compiled/css/app.css
        deleted file mode 100644
        index a921dcb393..0000000000
        --- a/public/assets/compiled/css/app.css
        +++ /dev/null
        @@ -1,5916 +0,0 @@
        -@charset "UTF-8";
        -@import url(https://fonts.googleapis.com/css?family=Lato);
        -/*!
        - * Bootstrap v3.3.6 (http://getbootstrap.com)
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - */
        -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
        -html {
        -  font-family: sans-serif;
        -  -ms-text-size-adjust: 100%;
        -  -webkit-text-size-adjust: 100%; }
        -
        -body {
        -  margin: 0; }
        -
        -article,
        -aside,
        -details,
        -figcaption,
        -figure,
        -footer,
        -header,
        -hgroup,
        -main,
        -menu,
        -nav,
        -section,
        -summary {
        -  display: block; }
        -
        -audio,
        -canvas,
        -progress,
        -video {
        -  display: inline-block;
        -  vertical-align: baseline; }
        -
        -audio:not([controls]) {
        -  display: none;
        -  height: 0; }
        -
        -[hidden],
        -template {
        -  display: none; }
        -
        -a {
        -  background-color: transparent; }
        -
        -a:active,
        -a:hover {
        -  outline: 0; }
        -
        -abbr[title] {
        -  border-bottom: 1px dotted; }
        -
        -b,
        -strong {
        -  font-weight: bold; }
        -
        -dfn {
        -  font-style: italic; }
        -
        -h1 {
        -  font-size: 2em;
        -  margin: 0.67em 0; }
        -
        -mark {
        -  background: #ff0;
        -  color: #000; }
        -
        -small {
        -  font-size: 80%; }
        -
        -sub,
        -sup {
        -  font-size: 75%;
        -  line-height: 0;
        -  position: relative;
        -  vertical-align: baseline; }
        -
        -sup {
        -  top: -0.5em; }
        -
        -sub {
        -  bottom: -0.25em; }
        -
        -img {
        -  border: 0; }
        -
        -svg:not(:root) {
        -  overflow: hidden; }
        -
        -figure {
        -  margin: 1em 40px; }
        -
        -hr {
        -  box-sizing: content-box;
        -  height: 0; }
        -
        -pre {
        -  overflow: auto; }
        -
        -code,
        -kbd,
        -pre,
        -samp {
        -  font-family: monospace, monospace;
        -  font-size: 1em; }
        -
        -button,
        -input,
        -optgroup,
        -select,
        -textarea {
        -  color: inherit;
        -  font: inherit;
        -  margin: 0; }
        -
        -button {
        -  overflow: visible; }
        -
        -button,
        -select {
        -  text-transform: none; }
        -
        -button,
        -html input[type="button"],
        -input[type="reset"],
        -input[type="submit"] {
        -  -webkit-appearance: button;
        -  cursor: pointer; }
        -
        -button[disabled],
        -html input[disabled] {
        -  cursor: default; }
        -
        -button::-moz-focus-inner,
        -input::-moz-focus-inner {
        -  border: 0;
        -  padding: 0; }
        -
        -input {
        -  line-height: normal; }
        -
        -input[type="checkbox"],
        -input[type="radio"] {
        -  box-sizing: border-box;
        -  padding: 0; }
        -
        -input[type="number"]::-webkit-inner-spin-button,
        -input[type="number"]::-webkit-outer-spin-button {
        -  height: auto; }
        -
        -input[type="search"] {
        -  -webkit-appearance: textfield;
        -  box-sizing: content-box; }
        -
        -input[type="search"]::-webkit-search-cancel-button,
        -input[type="search"]::-webkit-search-decoration {
        -  -webkit-appearance: none; }
        -
        -fieldset {
        -  border: 1px solid #c0c0c0;
        -  margin: 0 2px;
        -  padding: 0.35em 0.625em 0.75em; }
        -
        -legend {
        -  border: 0;
        -  padding: 0; }
        -
        -textarea {
        -  overflow: auto; }
        -
        -optgroup {
        -  font-weight: bold; }
        -
        -table {
        -  border-collapse: collapse;
        -  border-spacing: 0; }
        -
        -td,
        -th {
        -  padding: 0; }
        -
        -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
        -@media print {
        -  *,
        -  *:before,
        -  *:after {
        -    background: transparent !important;
        -    color: #000 !important;
        -    box-shadow: none !important;
        -    text-shadow: none !important; }
        -  a,
        -  a:visited {
        -    text-decoration: underline; }
        -  a[href]:after {
        -    content: " (" attr(href) ")"; }
        -  abbr[title]:after {
        -    content: " (" attr(title) ")"; }
        -  a[href^="#"]:after,
        -  a[href^="javascript:"]: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; }
        -  p,
        -  h2,
        -  h3 {
        -    orphans: 3;
        -    widows: 3; }
        -  h2,
        -  h3 {
        -    page-break-after: avoid; }
        -  .navbar {
        -    display: none; }
        -  .btn > .caret,
        -  .dropup > .btn > .caret {
        -    border-top-color: #000 !important; }
        -  .label {
        -    border: 1px solid #000; }
        -  .table {
        -    border-collapse: collapse !important; }
        -    .table td,
        -    .table th {
        -      background-color: #fff !important; }
        -  .table-bordered th,
        -  .table-bordered td {
        -    border: 1px solid #ddd !important; } }
        -
        -@font-face {
        -  font-family: 'Glyphicons Halflings';
        -  src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot");
        -  src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); }
        -
        -.glyphicon {
        -  position: relative;
        -  top: 1px;
        -  display: inline-block;
        -  font-family: 'Glyphicons Halflings';
        -  font-style: normal;
        -  font-weight: normal;
        -  line-height: 1;
        -  -webkit-font-smoothing: antialiased;
        -  -moz-osx-font-smoothing: grayscale; }
        -
        -.glyphicon-asterisk:before {
        -  content: "\002a"; }
        -
        -.glyphicon-plus:before {
        -  content: "\002b"; }
        -
        -.glyphicon-euro:before,
        -.glyphicon-eur: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"; }
        -
        -.glyphicon-cd:before {
        -  content: "\e201"; }
        -
        -.glyphicon-save-file:before {
        -  content: "\e202"; }
        -
        -.glyphicon-open-file:before {
        -  content: "\e203"; }
        -
        -.glyphicon-level-up:before {
        -  content: "\e204"; }
        -
        -.glyphicon-copy:before {
        -  content: "\e205"; }
        -
        -.glyphicon-paste:before {
        -  content: "\e206"; }
        -
        -.glyphicon-alert:before {
        -  content: "\e209"; }
        -
        -.glyphicon-equalizer:before {
        -  content: "\e210"; }
        -
        -.glyphicon-king:before {
        -  content: "\e211"; }
        -
        -.glyphicon-queen:before {
        -  content: "\e212"; }
        -
        -.glyphicon-pawn:before {
        -  content: "\e213"; }
        -
        -.glyphicon-bishop:before {
        -  content: "\e214"; }
        -
        -.glyphicon-knight:before {
        -  content: "\e215"; }
        -
        -.glyphicon-baby-formula:before {
        -  content: "\e216"; }
        -
        -.glyphicon-tent:before {
        -  content: "\26fa"; }
        -
        -.glyphicon-blackboard:before {
        -  content: "\e218"; }
        -
        -.glyphicon-bed:before {
        -  content: "\e219"; }
        -
        -.glyphicon-apple:before {
        -  content: "\f8ff"; }
        -
        -.glyphicon-erase:before {
        -  content: "\e221"; }
        -
        -.glyphicon-hourglass:before {
        -  content: "\231b"; }
        -
        -.glyphicon-lamp:before {
        -  content: "\e223"; }
        -
        -.glyphicon-duplicate:before {
        -  content: "\e224"; }
        -
        -.glyphicon-piggy-bank:before {
        -  content: "\e225"; }
        -
        -.glyphicon-scissors:before {
        -  content: "\e226"; }
        -
        -.glyphicon-bitcoin:before {
        -  content: "\e227"; }
        -
        -.glyphicon-btc:before {
        -  content: "\e227"; }
        -
        -.glyphicon-xbt:before {
        -  content: "\e227"; }
        -
        -.glyphicon-yen:before {
        -  content: "\00a5"; }
        -
        -.glyphicon-jpy:before {
        -  content: "\00a5"; }
        -
        -.glyphicon-ruble:before {
        -  content: "\20bd"; }
        -
        -.glyphicon-rub:before {
        -  content: "\20bd"; }
        -
        -.glyphicon-scale:before {
        -  content: "\e230"; }
        -
        -.glyphicon-ice-lolly:before {
        -  content: "\e231"; }
        -
        -.glyphicon-ice-lolly-tasted:before {
        -  content: "\e232"; }
        -
        -.glyphicon-education:before {
        -  content: "\e233"; }
        -
        -.glyphicon-option-horizontal:before {
        -  content: "\e234"; }
        -
        -.glyphicon-option-vertical:before {
        -  content: "\e235"; }
        -
        -.glyphicon-menu-hamburger:before {
        -  content: "\e236"; }
        -
        -.glyphicon-modal-window:before {
        -  content: "\e237"; }
        -
        -.glyphicon-oil:before {
        -  content: "\e238"; }
        -
        -.glyphicon-grain:before {
        -  content: "\e239"; }
        -
        -.glyphicon-sunglasses:before {
        -  content: "\e240"; }
        -
        -.glyphicon-text-size:before {
        -  content: "\e241"; }
        -
        -.glyphicon-text-color:before {
        -  content: "\e242"; }
        -
        -.glyphicon-text-background:before {
        -  content: "\e243"; }
        -
        -.glyphicon-object-align-top:before {
        -  content: "\e244"; }
        -
        -.glyphicon-object-align-bottom:before {
        -  content: "\e245"; }
        -
        -.glyphicon-object-align-horizontal:before {
        -  content: "\e246"; }
        -
        -.glyphicon-object-align-left:before {
        -  content: "\e247"; }
        -
        -.glyphicon-object-align-vertical:before {
        -  content: "\e248"; }
        -
        -.glyphicon-object-align-right:before {
        -  content: "\e249"; }
        -
        -.glyphicon-triangle-right:before {
        -  content: "\e250"; }
        -
        -.glyphicon-triangle-left:before {
        -  content: "\e251"; }
        -
        -.glyphicon-triangle-bottom:before {
        -  content: "\e252"; }
        -
        -.glyphicon-triangle-top:before {
        -  content: "\e253"; }
        -
        -.glyphicon-console:before {
        -  content: "\e254"; }
        -
        -.glyphicon-superscript:before {
        -  content: "\e255"; }
        -
        -.glyphicon-subscript:before {
        -  content: "\e256"; }
        -
        -.glyphicon-menu-left:before {
        -  content: "\e257"; }
        -
        -.glyphicon-menu-right:before {
        -  content: "\e258"; }
        -
        -.glyphicon-menu-down:before {
        -  content: "\e259"; }
        -
        -.glyphicon-menu-up:before {
        -  content: "\e260"; }
        -
        -* {
        -  box-sizing: border-box; }
        -
        -*:before,
        -*:after {
        -  box-sizing: border-box; }
        -
        -html {
        -  font-size: 10px;
        -  -webkit-tap-highlight-color: transparent; }
        -
        -body {
        -  font-family: "Lato", sans-serif;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #333333;
        -  background-color: #fff; }
        -
        -input,
        -button,
        -select,
        -textarea {
        -  font-family: inherit;
        -  font-size: inherit;
        -  line-height: inherit; }
        -
        -a {
        -  color: #337ab7;
        -  text-decoration: none; }
        -  a:hover, a:focus {
        -    color: #23527c;
        -    text-decoration: underline; }
        -  a:focus {
        -    outline: thin dotted;
        -    outline: 5px auto -webkit-focus-ring-color;
        -    outline-offset: -2px; }
        -
        -figure {
        -  margin: 0; }
        -
        -img {
        -  vertical-align: middle; }
        -
        -.img-responsive {
        -  display: block;
        -  max-width: 100%;
        -  height: auto; }
        -
        -.img-rounded {
        -  border-radius: 6px; }
        -
        -.img-thumbnail {
        -  padding: 4px;
        -  line-height: 1.428571429;
        -  background-color: #fff;
        -  border: 1px solid #ddd;
        -  border-radius: 4px;
        -  transition: all 0.2s ease-in-out;
        -  display: inline-block;
        -  max-width: 100%;
        -  height: auto; }
        -
        -.img-circle {
        -  border-radius: 50%; }
        -
        -hr {
        -  margin-top: 20px;
        -  margin-bottom: 20px;
        -  border: 0;
        -  border-top: 1px solid #eeeeee; }
        -
        -.sr-only {
        -  position: absolute;
        -  width: 1px;
        -  height: 1px;
        -  margin: -1px;
        -  padding: 0;
        -  overflow: hidden;
        -  clip: rect(0, 0, 0, 0);
        -  border: 0; }
        -
        -.sr-only-focusable:active, .sr-only-focusable:focus {
        -  position: static;
        -  width: auto;
        -  height: auto;
        -  margin: 0;
        -  overflow: visible;
        -  clip: auto; }
        -
        -[role="button"] {
        -  cursor: pointer; }
        -
        -h1, h2, h3, h4, h5, h6,
        -.h1, .h2, .h3, .h4, .h5, .h6 {
        -  font-family: inherit;
        -  font-weight: 500;
        -  line-height: 1.1;
        -  color: inherit; }
        -  h1 small,
        -  h1 .small, h2 small,
        -  h2 .small, h3 small,
        -  h3 .small, h4 small,
        -  h4 .small, h5 small,
        -  h5 .small, h6 small,
        -  h6 .small,
        -  .h1 small,
        -  .h1 .small, .h2 small,
        -  .h2 .small, .h3 small,
        -  .h3 .small, .h4 small,
        -  .h4 .small, .h5 small,
        -  .h5 .small, .h6 small,
        -  .h6 .small {
        -    font-weight: normal;
        -    line-height: 1;
        -    color: #777777; }
        -
        -h1, .h1,
        -h2, .h2,
        -h3, .h3 {
        -  margin-top: 20px;
        -  margin-bottom: 10px; }
        -  h1 small,
        -  h1 .small, .h1 small,
        -  .h1 .small,
        -  h2 small,
        -  h2 .small, .h2 small,
        -  .h2 .small,
        -  h3 small,
        -  h3 .small, .h3 small,
        -  .h3 .small {
        -    font-size: 65%; }
        -
        -h4, .h4,
        -h5, .h5,
        -h6, .h6 {
        -  margin-top: 10px;
        -  margin-bottom: 10px; }
        -  h4 small,
        -  h4 .small, .h4 small,
        -  .h4 .small,
        -  h5 small,
        -  h5 .small, .h5 small,
        -  .h5 .small,
        -  h6 small,
        -  h6 .small, .h6 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: 300;
        -  line-height: 1.4; }
        -  @media (min-width: 768px) {
        -    .lead {
        -      font-size: 21px; } }
        -
        -small,
        -.small {
        -  font-size: 85%; }
        -
        -mark,
        -.mark {
        -  background-color: #fcf8e3;
        -  padding: .2em; }
        -
        -.text-left {
        -  text-align: left; }
        -
        -.text-right {
        -  text-align: right; }
        -
        -.text-center {
        -  text-align: center; }
        -
        -.text-justify {
        -  text-align: justify; }
        -
        -.text-nowrap {
        -  white-space: nowrap; }
        -
        -.text-lowercase {
        -  text-transform: lowercase; }
        -
        -.text-uppercase, .initialism {
        -  text-transform: uppercase; }
        -
        -.text-capitalize {
        -  text-transform: capitalize; }
        -
        -.text-muted {
        -  color: #777777; }
        -
        -.text-primary {
        -  color: #337ab7; }
        -
        -a.text-primary:hover,
        -a.text-primary:focus {
        -  color: #286090; }
        -
        -.text-success {
        -  color: #3c763d; }
        -
        -a.text-success:hover,
        -a.text-success:focus {
        -  color: #2b542c; }
        -
        -.text-info {
        -  color: #31708f; }
        -
        -a.text-info:hover,
        -a.text-info:focus {
        -  color: #245269; }
        -
        -.text-warning {
        -  color: #8a6d3b; }
        -
        -a.text-warning:hover,
        -a.text-warning:focus {
        -  color: #66512c; }
        -
        -.text-danger {
        -  color: #a94442; }
        -
        -a.text-danger:hover,
        -a.text-danger:focus {
        -  color: #843534; }
        -
        -.bg-primary {
        -  color: #fff; }
        -
        -.bg-primary {
        -  background-color: #337ab7; }
        -
        -a.bg-primary:hover,
        -a.bg-primary:focus {
        -  background-color: #286090; }
        -
        -.bg-success {
        -  background-color: #dff0d8; }
        -
        -a.bg-success:hover,
        -a.bg-success:focus {
        -  background-color: #c1e2b3; }
        -
        -.bg-info {
        -  background-color: #d9edf7; }
        -
        -a.bg-info:hover,
        -a.bg-info:focus {
        -  background-color: #afd9ee; }
        -
        -.bg-warning {
        -  background-color: #fcf8e3; }
        -
        -a.bg-warning:hover,
        -a.bg-warning:focus {
        -  background-color: #f7ecb5; }
        -
        -.bg-danger {
        -  background-color: #f2dede; }
        -
        -a.bg-danger:hover,
        -a.bg-danger:focus {
        -  background-color: #e4b9b9; }
        -
        -.page-header {
        -  padding-bottom: 9px;
        -  margin: 40px 0 20px;
        -  border-bottom: 1px solid #eeeeee; }
        -
        -ul,
        -ol {
        -  margin-top: 0;
        -  margin-bottom: 10px; }
        -  ul ul,
        -  ul ol,
        -  ol ul,
        -  ol ol {
        -    margin-bottom: 0; }
        -
        -.list-unstyled {
        -  padding-left: 0;
        -  list-style: none; }
        -
        -.list-inline {
        -  padding-left: 0;
        -  list-style: none;
        -  margin-left: -5px; }
        -  .list-inline > li {
        -    display: inline-block;
        -    padding-left: 5px;
        -    padding-right: 5px; }
        -
        -dl {
        -  margin-top: 0;
        -  margin-bottom: 20px; }
        -
        -dt,
        -dd {
        -  line-height: 1.428571429; }
        -
        -dt {
        -  font-weight: bold; }
        -
        -dd {
        -  margin-left: 0; }
        -
        -.dl-horizontal dd:before, .dl-horizontal dd:after {
        -  content: " ";
        -  display: table; }
        -
        -.dl-horizontal dd:after {
        -  clear: both; }
        -
        -@media (min-width: 768px) {
        -  .dl-horizontal dt {
        -    float: left;
        -    width: 160px;
        -    clear: left;
        -    text-align: right;
        -    overflow: hidden;
        -    text-overflow: ellipsis;
        -    white-space: nowrap; }
        -  .dl-horizontal dd {
        -    margin-left: 180px; } }
        -
        -abbr[title],
        -abbr[data-original-title] {
        -  cursor: help;
        -  border-bottom: 1px dotted #777777; }
        -
        -.initialism {
        -  font-size: 90%; }
        -
        -blockquote {
        -  padding: 10px 20px;
        -  margin: 0 0 20px;
        -  font-size: 17.5px;
        -  border-left: 5px solid #eeeeee; }
        -  blockquote p:last-child,
        -  blockquote ul:last-child,
        -  blockquote ol:last-child {
        -    margin-bottom: 0; }
        -  blockquote footer,
        -  blockquote small,
        -  blockquote .small {
        -    display: block;
        -    font-size: 80%;
        -    line-height: 1.428571429;
        -    color: #777777; }
        -    blockquote footer:before,
        -    blockquote small:before,
        -    blockquote .small:before {
        -      content: '\2014 \00A0'; }
        -
        -.blockquote-reverse,
        -blockquote.pull-right {
        -  padding-right: 15px;
        -  padding-left: 0;
        -  border-right: 5px solid #eeeeee;
        -  border-left: 0;
        -  text-align: right; }
        -  .blockquote-reverse footer:before,
        -  .blockquote-reverse small:before,
        -  .blockquote-reverse .small:before,
        -  blockquote.pull-right footer:before,
        -  blockquote.pull-right small:before,
        -  blockquote.pull-right .small:before {
        -    content: ''; }
        -  .blockquote-reverse footer:after,
        -  .blockquote-reverse small:after,
        -  .blockquote-reverse .small:after,
        -  blockquote.pull-right footer:after,
        -  blockquote.pull-right small:after,
        -  blockquote.pull-right .small:after {
        -    content: '\00A0 \2014'; }
        -
        -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;
        -  background-color: #f9f2f4;
        -  border-radius: 4px; }
        -
        -kbd {
        -  padding: 2px 4px;
        -  font-size: 90%;
        -  color: #fff;
        -  background-color: #333;
        -  border-radius: 3px;
        -  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }
        -  kbd kbd {
        -    padding: 0;
        -    font-size: 100%;
        -    font-weight: bold;
        -    box-shadow: none; }
        -
        -pre {
        -  display: block;
        -  padding: 9.5px;
        -  margin: 0 0 10px;
        -  font-size: 13px;
        -  line-height: 1.428571429;
        -  word-break: break-all;
        -  word-wrap: break-word;
        -  color: #333333;
        -  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 {
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px; }
        -  .container:before, .container:after {
        -    content: " ";
        -    display: table; }
        -  .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; } }
        -
        -.container-fluid {
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px; }
        -  .container-fluid:before, .container-fluid:after {
        -    content: " ";
        -    display: table; }
        -  .container-fluid:after {
        -    clear: both; }
        -
        -.row {
        -  margin-left: -15px;
        -  margin-right: -15px; }
        -  .row:before, .row:after {
        -    content: " ";
        -    display: table; }
        -  .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-left: 15px;
        -  padding-right: 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-1 {
        -  width: 8.3333333333%; }
        -
        -.col-xs-2 {
        -  width: 16.6666666667%; }
        -
        -.col-xs-3 {
        -  width: 25%; }
        -
        -.col-xs-4 {
        -  width: 33.3333333333%; }
        -
        -.col-xs-5 {
        -  width: 41.6666666667%; }
        -
        -.col-xs-6 {
        -  width: 50%; }
        -
        -.col-xs-7 {
        -  width: 58.3333333333%; }
        -
        -.col-xs-8 {
        -  width: 66.6666666667%; }
        -
        -.col-xs-9 {
        -  width: 75%; }
        -
        -.col-xs-10 {
        -  width: 83.3333333333%; }
        -
        -.col-xs-11 {
        -  width: 91.6666666667%; }
        -
        -.col-xs-12 {
        -  width: 100%; }
        -
        -.col-xs-pull-0 {
        -  right: auto; }
        -
        -.col-xs-pull-1 {
        -  right: 8.3333333333%; }
        -
        -.col-xs-pull-2 {
        -  right: 16.6666666667%; }
        -
        -.col-xs-pull-3 {
        -  right: 25%; }
        -
        -.col-xs-pull-4 {
        -  right: 33.3333333333%; }
        -
        -.col-xs-pull-5 {
        -  right: 41.6666666667%; }
        -
        -.col-xs-pull-6 {
        -  right: 50%; }
        -
        -.col-xs-pull-7 {
        -  right: 58.3333333333%; }
        -
        -.col-xs-pull-8 {
        -  right: 66.6666666667%; }
        -
        -.col-xs-pull-9 {
        -  right: 75%; }
        -
        -.col-xs-pull-10 {
        -  right: 83.3333333333%; }
        -
        -.col-xs-pull-11 {
        -  right: 91.6666666667%; }
        -
        -.col-xs-pull-12 {
        -  right: 100%; }
        -
        -.col-xs-push-0 {
        -  left: auto; }
        -
        -.col-xs-push-1 {
        -  left: 8.3333333333%; }
        -
        -.col-xs-push-2 {
        -  left: 16.6666666667%; }
        -
        -.col-xs-push-3 {
        -  left: 25%; }
        -
        -.col-xs-push-4 {
        -  left: 33.3333333333%; }
        -
        -.col-xs-push-5 {
        -  left: 41.6666666667%; }
        -
        -.col-xs-push-6 {
        -  left: 50%; }
        -
        -.col-xs-push-7 {
        -  left: 58.3333333333%; }
        -
        -.col-xs-push-8 {
        -  left: 66.6666666667%; }
        -
        -.col-xs-push-9 {
        -  left: 75%; }
        -
        -.col-xs-push-10 {
        -  left: 83.3333333333%; }
        -
        -.col-xs-push-11 {
        -  left: 91.6666666667%; }
        -
        -.col-xs-push-12 {
        -  left: 100%; }
        -
        -.col-xs-offset-0 {
        -  margin-left: 0%; }
        -
        -.col-xs-offset-1 {
        -  margin-left: 8.3333333333%; }
        -
        -.col-xs-offset-2 {
        -  margin-left: 16.6666666667%; }
        -
        -.col-xs-offset-3 {
        -  margin-left: 25%; }
        -
        -.col-xs-offset-4 {
        -  margin-left: 33.3333333333%; }
        -
        -.col-xs-offset-5 {
        -  margin-left: 41.6666666667%; }
        -
        -.col-xs-offset-6 {
        -  margin-left: 50%; }
        -
        -.col-xs-offset-7 {
        -  margin-left: 58.3333333333%; }
        -
        -.col-xs-offset-8 {
        -  margin-left: 66.6666666667%; }
        -
        -.col-xs-offset-9 {
        -  margin-left: 75%; }
        -
        -.col-xs-offset-10 {
        -  margin-left: 83.3333333333%; }
        -
        -.col-xs-offset-11 {
        -  margin-left: 91.6666666667%; }
        -
        -.col-xs-offset-12 {
        -  margin-left: 100%; }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-sm-2 {
        -    width: 16.6666666667%; }
        -  .col-sm-3 {
        -    width: 25%; }
        -  .col-sm-4 {
        -    width: 33.3333333333%; }
        -  .col-sm-5 {
        -    width: 41.6666666667%; }
        -  .col-sm-6 {
        -    width: 50%; }
        -  .col-sm-7 {
        -    width: 58.3333333333%; }
        -  .col-sm-8 {
        -    width: 66.6666666667%; }
        -  .col-sm-9 {
        -    width: 75%; }
        -  .col-sm-10 {
        -    width: 83.3333333333%; }
        -  .col-sm-11 {
        -    width: 91.6666666667%; }
        -  .col-sm-12 {
        -    width: 100%; }
        -  .col-sm-pull-0 {
        -    right: auto; }
        -  .col-sm-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-sm-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-sm-pull-3 {
        -    right: 25%; }
        -  .col-sm-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-sm-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-sm-pull-6 {
        -    right: 50%; }
        -  .col-sm-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-sm-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-sm-pull-9 {
        -    right: 75%; }
        -  .col-sm-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-sm-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-sm-pull-12 {
        -    right: 100%; }
        -  .col-sm-push-0 {
        -    left: auto; }
        -  .col-sm-push-1 {
        -    left: 8.3333333333%; }
        -  .col-sm-push-2 {
        -    left: 16.6666666667%; }
        -  .col-sm-push-3 {
        -    left: 25%; }
        -  .col-sm-push-4 {
        -    left: 33.3333333333%; }
        -  .col-sm-push-5 {
        -    left: 41.6666666667%; }
        -  .col-sm-push-6 {
        -    left: 50%; }
        -  .col-sm-push-7 {
        -    left: 58.3333333333%; }
        -  .col-sm-push-8 {
        -    left: 66.6666666667%; }
        -  .col-sm-push-9 {
        -    left: 75%; }
        -  .col-sm-push-10 {
        -    left: 83.3333333333%; }
        -  .col-sm-push-11 {
        -    left: 91.6666666667%; }
        -  .col-sm-push-12 {
        -    left: 100%; }
        -  .col-sm-offset-0 {
        -    margin-left: 0%; }
        -  .col-sm-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-sm-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-sm-offset-3 {
        -    margin-left: 25%; }
        -  .col-sm-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-sm-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-sm-offset-6 {
        -    margin-left: 50%; }
        -  .col-sm-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-sm-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-sm-offset-9 {
        -    margin-left: 75%; }
        -  .col-sm-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-sm-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-sm-offset-12 {
        -    margin-left: 100%; } }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-md-2 {
        -    width: 16.6666666667%; }
        -  .col-md-3 {
        -    width: 25%; }
        -  .col-md-4 {
        -    width: 33.3333333333%; }
        -  .col-md-5 {
        -    width: 41.6666666667%; }
        -  .col-md-6 {
        -    width: 50%; }
        -  .col-md-7 {
        -    width: 58.3333333333%; }
        -  .col-md-8 {
        -    width: 66.6666666667%; }
        -  .col-md-9 {
        -    width: 75%; }
        -  .col-md-10 {
        -    width: 83.3333333333%; }
        -  .col-md-11 {
        -    width: 91.6666666667%; }
        -  .col-md-12 {
        -    width: 100%; }
        -  .col-md-pull-0 {
        -    right: auto; }
        -  .col-md-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-md-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-md-pull-3 {
        -    right: 25%; }
        -  .col-md-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-md-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-md-pull-6 {
        -    right: 50%; }
        -  .col-md-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-md-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-md-pull-9 {
        -    right: 75%; }
        -  .col-md-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-md-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-md-pull-12 {
        -    right: 100%; }
        -  .col-md-push-0 {
        -    left: auto; }
        -  .col-md-push-1 {
        -    left: 8.3333333333%; }
        -  .col-md-push-2 {
        -    left: 16.6666666667%; }
        -  .col-md-push-3 {
        -    left: 25%; }
        -  .col-md-push-4 {
        -    left: 33.3333333333%; }
        -  .col-md-push-5 {
        -    left: 41.6666666667%; }
        -  .col-md-push-6 {
        -    left: 50%; }
        -  .col-md-push-7 {
        -    left: 58.3333333333%; }
        -  .col-md-push-8 {
        -    left: 66.6666666667%; }
        -  .col-md-push-9 {
        -    left: 75%; }
        -  .col-md-push-10 {
        -    left: 83.3333333333%; }
        -  .col-md-push-11 {
        -    left: 91.6666666667%; }
        -  .col-md-push-12 {
        -    left: 100%; }
        -  .col-md-offset-0 {
        -    margin-left: 0%; }
        -  .col-md-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-md-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-md-offset-3 {
        -    margin-left: 25%; }
        -  .col-md-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-md-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-md-offset-6 {
        -    margin-left: 50%; }
        -  .col-md-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-md-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-md-offset-9 {
        -    margin-left: 75%; }
        -  .col-md-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-md-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-md-offset-12 {
        -    margin-left: 100%; } }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-lg-2 {
        -    width: 16.6666666667%; }
        -  .col-lg-3 {
        -    width: 25%; }
        -  .col-lg-4 {
        -    width: 33.3333333333%; }
        -  .col-lg-5 {
        -    width: 41.6666666667%; }
        -  .col-lg-6 {
        -    width: 50%; }
        -  .col-lg-7 {
        -    width: 58.3333333333%; }
        -  .col-lg-8 {
        -    width: 66.6666666667%; }
        -  .col-lg-9 {
        -    width: 75%; }
        -  .col-lg-10 {
        -    width: 83.3333333333%; }
        -  .col-lg-11 {
        -    width: 91.6666666667%; }
        -  .col-lg-12 {
        -    width: 100%; }
        -  .col-lg-pull-0 {
        -    right: auto; }
        -  .col-lg-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-lg-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-lg-pull-3 {
        -    right: 25%; }
        -  .col-lg-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-lg-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-lg-pull-6 {
        -    right: 50%; }
        -  .col-lg-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-lg-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-lg-pull-9 {
        -    right: 75%; }
        -  .col-lg-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-lg-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-lg-pull-12 {
        -    right: 100%; }
        -  .col-lg-push-0 {
        -    left: auto; }
        -  .col-lg-push-1 {
        -    left: 8.3333333333%; }
        -  .col-lg-push-2 {
        -    left: 16.6666666667%; }
        -  .col-lg-push-3 {
        -    left: 25%; }
        -  .col-lg-push-4 {
        -    left: 33.3333333333%; }
        -  .col-lg-push-5 {
        -    left: 41.6666666667%; }
        -  .col-lg-push-6 {
        -    left: 50%; }
        -  .col-lg-push-7 {
        -    left: 58.3333333333%; }
        -  .col-lg-push-8 {
        -    left: 66.6666666667%; }
        -  .col-lg-push-9 {
        -    left: 75%; }
        -  .col-lg-push-10 {
        -    left: 83.3333333333%; }
        -  .col-lg-push-11 {
        -    left: 91.6666666667%; }
        -  .col-lg-push-12 {
        -    left: 100%; }
        -  .col-lg-offset-0 {
        -    margin-left: 0%; }
        -  .col-lg-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-lg-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-lg-offset-3 {
        -    margin-left: 25%; }
        -  .col-lg-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-lg-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-lg-offset-6 {
        -    margin-left: 50%; }
        -  .col-lg-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-lg-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-lg-offset-9 {
        -    margin-left: 75%; }
        -  .col-lg-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-lg-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-lg-offset-12 {
        -    margin-left: 100%; } }
        -
        -table {
        -  background-color: transparent; }
        -
        -caption {
        -  padding-top: 8px;
        -  padding-bottom: 8px;
        -  color: #777777;
        -  text-align: left; }
        -
        -th {
        -  text-align: left; }
        -
        -.table {
        -  width: 100%;
        -  max-width: 100%;
        -  margin-bottom: 20px; }
        -  .table > thead > tr > th,
        -  .table > thead > tr > td,
        -  .table > tbody > tr > th,
        -  .table > tbody > tr > td,
        -  .table > tfoot > tr > th,
        -  .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 > caption + thead > tr:first-child > td,
        -  .table > colgroup + thead > tr:first-child > th,
        -  .table > colgroup + thead > tr:first-child > td,
        -  .table > thead:first-child > tr:first-child > th,
        -  .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 > thead > tr > td,
        -.table-condensed > tbody > tr > th,
        -.table-condensed > tbody > tr > td,
        -.table-condensed > tfoot > tr > th,
        -.table-condensed > tfoot > tr > td {
        -  padding: 5px; }
        -
        -.table-bordered {
        -  border: 1px solid #ddd; }
        -  .table-bordered > thead > tr > th,
        -  .table-bordered > thead > tr > td,
        -  .table-bordered > tbody > tr > th,
        -  .table-bordered > tbody > tr > td,
        -  .table-bordered > tfoot > tr > th,
        -  .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-of-type(odd) {
        -  background-color: #f9f9f9; }
        -
        -.table-hover > tbody > tr:hover {
        -  background-color: #f5f5f5; }
        -
        -table col[class*="col-"] {
        -  position: static;
        -  float: none;
        -  display: table-column; }
        -
        -table td[class*="col-"],
        -table th[class*="col-"] {
        -  position: static;
        -  float: none;
        -  display: table-cell; }
        -
        -.table > thead > tr > td.active,
        -.table > thead > tr > th.active,
        -.table > thead > tr.active > td,
        -.table > thead > tr.active > th,
        -.table > tbody > tr > td.active,
        -.table > tbody > tr > th.active,
        -.table > tbody > tr.active > td,
        -.table > tbody > tr.active > th,
        -.table > tfoot > tr > td.active,
        -.table > tfoot > tr > th.active,
        -.table > tfoot > tr.active > td,
        -.table > tfoot > tr.active > th {
        -  background-color: #f5f5f5; }
        -
        -.table-hover > tbody > tr > td.active:hover,
        -.table-hover > tbody > tr > th.active:hover,
        -.table-hover > tbody > tr.active:hover > td,
        -.table-hover > tbody > tr:hover > .active,
        -.table-hover > tbody > tr.active:hover > th {
        -  background-color: #e8e8e8; }
        -
        -.table > thead > tr > td.success,
        -.table > thead > tr > th.success,
        -.table > thead > tr.success > td,
        -.table > thead > tr.success > th,
        -.table > tbody > tr > td.success,
        -.table > tbody > tr > th.success,
        -.table > tbody > tr.success > td,
        -.table > tbody > tr.success > th,
        -.table > tfoot > tr > td.success,
        -.table > tfoot > tr > th.success,
        -.table > tfoot > tr.success > td,
        -.table > tfoot > tr.success > th {
        -  background-color: #dff0d8; }
        -
        -.table-hover > tbody > tr > td.success:hover,
        -.table-hover > tbody > tr > th.success:hover,
        -.table-hover > tbody > tr.success:hover > td,
        -.table-hover > tbody > tr:hover > .success,
        -.table-hover > tbody > tr.success:hover > th {
        -  background-color: #d0e9c6; }
        -
        -.table > thead > tr > td.info,
        -.table > thead > tr > th.info,
        -.table > thead > tr.info > td,
        -.table > thead > tr.info > th,
        -.table > tbody > tr > td.info,
        -.table > tbody > tr > th.info,
        -.table > tbody > tr.info > td,
        -.table > tbody > tr.info > th,
        -.table > tfoot > tr > td.info,
        -.table > tfoot > tr > th.info,
        -.table > tfoot > tr.info > td,
        -.table > tfoot > tr.info > th {
        -  background-color: #d9edf7; }
        -
        -.table-hover > tbody > tr > td.info:hover,
        -.table-hover > tbody > tr > th.info:hover,
        -.table-hover > tbody > tr.info:hover > td,
        -.table-hover > tbody > tr:hover > .info,
        -.table-hover > tbody > tr.info:hover > th {
        -  background-color: #c4e3f3; }
        -
        -.table > thead > tr > td.warning,
        -.table > thead > tr > th.warning,
        -.table > thead > tr.warning > td,
        -.table > thead > tr.warning > th,
        -.table > tbody > tr > td.warning,
        -.table > tbody > tr > th.warning,
        -.table > tbody > tr.warning > td,
        -.table > tbody > tr.warning > th,
        -.table > tfoot > tr > td.warning,
        -.table > tfoot > tr > th.warning,
        -.table > tfoot > tr.warning > td,
        -.table > tfoot > tr.warning > th {
        -  background-color: #fcf8e3; }
        -
        -.table-hover > tbody > tr > td.warning:hover,
        -.table-hover > tbody > tr > th.warning:hover,
        -.table-hover > tbody > tr.warning:hover > td,
        -.table-hover > tbody > tr:hover > .warning,
        -.table-hover > tbody > tr.warning:hover > th {
        -  background-color: #faf2cc; }
        -
        -.table > thead > tr > td.danger,
        -.table > thead > tr > th.danger,
        -.table > thead > tr.danger > td,
        -.table > thead > tr.danger > th,
        -.table > tbody > tr > td.danger,
        -.table > tbody > tr > th.danger,
        -.table > tbody > tr.danger > td,
        -.table > tbody > tr.danger > th,
        -.table > tfoot > tr > td.danger,
        -.table > tfoot > tr > th.danger,
        -.table > tfoot > tr.danger > td,
        -.table > tfoot > tr.danger > th {
        -  background-color: #f2dede; }
        -
        -.table-hover > tbody > tr > td.danger:hover,
        -.table-hover > tbody > tr > th.danger:hover,
        -.table-hover > tbody > tr.danger:hover > td,
        -.table-hover > tbody > tr:hover > .danger,
        -.table-hover > tbody > tr.danger:hover > th {
        -  background-color: #ebcccc; }
        -
        -.table-responsive {
        -  overflow-x: auto;
        -  min-height: 0.01%; }
        -  @media screen and (max-width: 767px) {
        -    .table-responsive {
        -      width: 100%;
        -      margin-bottom: 15px;
        -      overflow-y: hidden;
        -      -ms-overflow-style: -ms-autohiding-scrollbar;
        -      border: 1px solid #ddd; }
        -      .table-responsive > .table {
        -        margin-bottom: 0; }
        -        .table-responsive > .table > thead > tr > th,
        -        .table-responsive > .table > thead > tr > td,
        -        .table-responsive > .table > tbody > tr > th,
        -        .table-responsive > .table > tbody > tr > td,
        -        .table-responsive > .table > tfoot > tr > th,
        -        .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 > thead > tr > td:first-child,
        -        .table-responsive > .table-bordered > tbody > tr > th:first-child,
        -        .table-responsive > .table-bordered > tbody > tr > td:first-child,
        -        .table-responsive > .table-bordered > tfoot > tr > th: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 > thead > tr > td:last-child,
        -        .table-responsive > .table-bordered > tbody > tr > th:last-child,
        -        .table-responsive > .table-bordered > tbody > tr > td:last-child,
        -        .table-responsive > .table-bordered > tfoot > tr > th: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 > tbody > tr:last-child > td,
        -        .table-responsive > .table-bordered > tfoot > tr:last-child > th,
        -        .table-responsive > .table-bordered > tfoot > tr:last-child > td {
        -          border-bottom: 0; } }
        -
        -fieldset {
        -  padding: 0;
        -  margin: 0;
        -  border: 0;
        -  min-width: 0; }
        -
        -legend {
        -  display: block;
        -  width: 100%;
        -  padding: 0;
        -  margin-bottom: 20px;
        -  font-size: 21px;
        -  line-height: inherit;
        -  color: #333333;
        -  border: 0;
        -  border-bottom: 1px solid #e5e5e5; }
        -
        -label {
        -  display: inline-block;
        -  max-width: 100%;
        -  margin-bottom: 5px;
        -  font-weight: bold; }
        -
        -input[type="search"] {
        -  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; }
        -
        -input[type="range"] {
        -  display: block;
        -  width: 100%; }
        -
        -select[multiple],
        -select[size] {
        -  height: auto; }
        -
        -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; }
        -
        -output {
        -  display: block;
        -  padding-top: 7px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #555555; }
        -
        -.form-control {
        -  display: block;
        -  width: 100%;
        -  height: 34px;
        -  padding: 6px 12px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #555555;
        -  background-color: #fff;
        -  background-image: none;
        -  border: 1px solid #ccc;
        -  border-radius: 4px;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
        -  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
        -  .form-control:focus {
        -    border-color: #66afe9;
        -    outline: 0;
        -    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;
        -    opacity: 1; }
        -  .form-control:-ms-input-placeholder {
        -    color: #999; }
        -  .form-control::-webkit-input-placeholder {
        -    color: #999; }
        -  .form-control::-ms-expand {
        -    border: 0;
        -    background-color: transparent; }
        -  .form-control[disabled], .form-control[readonly],
        -  fieldset[disabled] .form-control {
        -    background-color: #eeeeee;
        -    opacity: 1; }
        -  .form-control[disabled],
        -  fieldset[disabled] .form-control {
        -    cursor: not-allowed; }
        -
        -textarea.form-control {
        -  height: auto; }
        -
        -input[type="search"] {
        -  -webkit-appearance: none; }
        -
        -@media screen and (-webkit-min-device-pixel-ratio: 0) {
        -  input[type="date"].form-control,
        -  input[type="time"].form-control,
        -  input[type="datetime-local"].form-control,
        -  input[type="month"].form-control {
        -    line-height: 34px; }
        -  input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control,
        -  .input-group-sm > input[type="date"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="date"].btn,
        -  .input-group-sm input[type="date"],
        -  input[type="time"].input-sm,
        -  .input-group-sm > input[type="time"].form-control,
        -  .input-group-sm > input[type="time"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="time"].btn,
        -  .input-group-sm
        -  input[type="time"],
        -  input[type="datetime-local"].input-sm,
        -  .input-group-sm > input[type="datetime-local"].form-control,
        -  .input-group-sm > input[type="datetime-local"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
        -  .input-group-sm
        -  input[type="datetime-local"],
        -  input[type="month"].input-sm,
        -  .input-group-sm > input[type="month"].form-control,
        -  .input-group-sm > input[type="month"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="month"].btn,
        -  .input-group-sm
        -  input[type="month"] {
        -    line-height: 30px; }
        -  input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control,
        -  .input-group-lg > input[type="date"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="date"].btn,
        -  .input-group-lg input[type="date"],
        -  input[type="time"].input-lg,
        -  .input-group-lg > input[type="time"].form-control,
        -  .input-group-lg > input[type="time"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="time"].btn,
        -  .input-group-lg
        -  input[type="time"],
        -  input[type="datetime-local"].input-lg,
        -  .input-group-lg > input[type="datetime-local"].form-control,
        -  .input-group-lg > input[type="datetime-local"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
        -  .input-group-lg
        -  input[type="datetime-local"],
        -  input[type="month"].input-lg,
        -  .input-group-lg > input[type="month"].form-control,
        -  .input-group-lg > input[type="month"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="month"].btn,
        -  .input-group-lg
        -  input[type="month"] {
        -    line-height: 46px; } }
        -
        -.form-group {
        -  margin-bottom: 15px; }
        -
        -.radio,
        -.checkbox {
        -  position: relative;
        -  display: block;
        -  margin-top: 10px;
        -  margin-bottom: 10px; }
        -  .radio label,
        -  .checkbox label {
        -    min-height: 20px;
        -    padding-left: 20px;
        -    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"] {
        -  position: absolute;
        -  margin-left: -20px;
        -  margin-top: 4px \9; }
        -
        -.radio + .radio,
        -.checkbox + .checkbox {
        -  margin-top: -5px; }
        -
        -.radio-inline,
        -.checkbox-inline {
        -  position: relative;
        -  display: inline-block;
        -  padding-left: 20px;
        -  margin-bottom: 0;
        -  vertical-align: middle;
        -  font-weight: normal;
        -  cursor: pointer; }
        -
        -.radio-inline + .radio-inline,
        -.checkbox-inline + .checkbox-inline {
        -  margin-top: 0;
        -  margin-left: 10px; }
        -
        -input[type="radio"][disabled], input[type="radio"].disabled,
        -fieldset[disabled] input[type="radio"],
        -input[type="checkbox"][disabled],
        -input[type="checkbox"].disabled,
        -fieldset[disabled]
        -input[type="checkbox"] {
        -  cursor: not-allowed; }
        -
        -.radio-inline.disabled,
        -fieldset[disabled] .radio-inline,
        -.checkbox-inline.disabled,
        -fieldset[disabled]
        -.checkbox-inline {
        -  cursor: not-allowed; }
        -
        -.radio.disabled label,
        -fieldset[disabled] .radio label,
        -.checkbox.disabled label,
        -fieldset[disabled]
        -.checkbox label {
        -  cursor: not-allowed; }
        -
        -.form-control-static {
        -  padding-top: 7px;
        -  padding-bottom: 7px;
        -  margin-bottom: 0;
        -  min-height: 34px; }
        -  .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,
        -  .input-group-lg > .form-control-static.input-group-addon,
        -  .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
        -  .input-group-sm > .form-control-static.input-group-addon,
        -  .input-group-sm > .input-group-btn > .form-control-static.btn {
        -    padding-left: 0;
        -    padding-right: 0; }
        -
        -.input-sm, .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-sm, .input-group-sm > select.form-control,
        -.input-group-sm > select.input-group-addon,
        -.input-group-sm > .input-group-btn > select.btn {
        -  height: 30px;
        -  line-height: 30px; }
        -
        -textarea.input-sm, .input-group-sm > textarea.form-control,
        -.input-group-sm > textarea.input-group-addon,
        -.input-group-sm > .input-group-btn > textarea.btn,
        -select[multiple].input-sm,
        -.input-group-sm > select[multiple].form-control,
        -.input-group-sm > select[multiple].input-group-addon,
        -.input-group-sm > .input-group-btn > select[multiple].btn {
        -  height: auto; }
        -
        -.form-group-sm .form-control {
        -  height: 30px;
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.form-group-sm select.form-control {
        -  height: 30px;
        -  line-height: 30px; }
        -
        -.form-group-sm textarea.form-control,
        -.form-group-sm select[multiple].form-control {
        -  height: auto; }
        -
        -.form-group-sm .form-control-static {
        -  height: 30px;
        -  min-height: 32px;
        -  padding: 6px 10px;
        -  font-size: 12px;
        -  line-height: 1.5; }
        -
        -.input-lg, .input-group-lg > .form-control,
        -.input-group-lg > .input-group-addon,
        -.input-group-lg > .input-group-btn > .btn {
        -  height: 46px;
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -select.input-lg, .input-group-lg > select.form-control,
        -.input-group-lg > select.input-group-addon,
        -.input-group-lg > .input-group-btn > select.btn {
        -  height: 46px;
        -  line-height: 46px; }
        -
        -textarea.input-lg, .input-group-lg > textarea.form-control,
        -.input-group-lg > textarea.input-group-addon,
        -.input-group-lg > .input-group-btn > textarea.btn,
        -select[multiple].input-lg,
        -.input-group-lg > select[multiple].form-control,
        -.input-group-lg > select[multiple].input-group-addon,
        -.input-group-lg > .input-group-btn > select[multiple].btn {
        -  height: auto; }
        -
        -.form-group-lg .form-control {
        -  height: 46px;
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -.form-group-lg select.form-control {
        -  height: 46px;
        -  line-height: 46px; }
        -
        -.form-group-lg textarea.form-control,
        -.form-group-lg select[multiple].form-control {
        -  height: auto; }
        -
        -.form-group-lg .form-control-static {
        -  height: 46px;
        -  min-height: 38px;
        -  padding: 11px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333; }
        -
        -.has-feedback {
        -  position: relative; }
        -  .has-feedback .form-control {
        -    padding-right: 42.5px; }
        -
        -.form-control-feedback {
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -  z-index: 2;
        -  display: block;
        -  width: 34px;
        -  height: 34px;
        -  line-height: 34px;
        -  text-align: center;
        -  pointer-events: none; }
        -
        -.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,
        -.input-group-lg > .input-group-addon + .form-control-feedback,
        -.input-group-lg > .input-group-btn > .btn + .form-control-feedback,
        -.input-group-lg + .form-control-feedback,
        -.form-group-lg .form-control + .form-control-feedback {
        -  width: 46px;
        -  height: 46px;
        -  line-height: 46px; }
        -
        -.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,
        -.input-group-sm > .input-group-addon + .form-control-feedback,
        -.input-group-sm > .input-group-btn > .btn + .form-control-feedback,
        -.input-group-sm + .form-control-feedback,
        -.form-group-sm .form-control + .form-control-feedback {
        -  width: 30px;
        -  height: 30px;
        -  line-height: 30px; }
        -
        -.has-success .help-block,
        -.has-success .control-label,
        -.has-success .radio,
        -.has-success .checkbox,
        -.has-success .radio-inline,
        -.has-success .checkbox-inline,
        -.has-success.radio label,
        -.has-success.checkbox label,
        -.has-success.radio-inline label,
        -.has-success.checkbox-inline label {
        -  color: #3c763d; }
        -
        -.has-success .form-control {
        -  border-color: #3c763d;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-success .form-control:focus {
        -    border-color: #2b542c;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }
        -
        -.has-success .input-group-addon {
        -  color: #3c763d;
        -  border-color: #3c763d;
        -  background-color: #dff0d8; }
        -
        -.has-success .form-control-feedback {
        -  color: #3c763d; }
        -
        -.has-warning .help-block,
        -.has-warning .control-label,
        -.has-warning .radio,
        -.has-warning .checkbox,
        -.has-warning .radio-inline,
        -.has-warning .checkbox-inline,
        -.has-warning.radio label,
        -.has-warning.checkbox label,
        -.has-warning.radio-inline label,
        -.has-warning.checkbox-inline label {
        -  color: #8a6d3b; }
        -
        -.has-warning .form-control {
        -  border-color: #8a6d3b;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-warning .form-control:focus {
        -    border-color: #66512c;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }
        -
        -.has-warning .input-group-addon {
        -  color: #8a6d3b;
        -  border-color: #8a6d3b;
        -  background-color: #fcf8e3; }
        -
        -.has-warning .form-control-feedback {
        -  color: #8a6d3b; }
        -
        -.has-error .help-block,
        -.has-error .control-label,
        -.has-error .radio,
        -.has-error .checkbox,
        -.has-error .radio-inline,
        -.has-error .checkbox-inline,
        -.has-error.radio label,
        -.has-error.checkbox label,
        -.has-error.radio-inline label,
        -.has-error.checkbox-inline label {
        -  color: #a94442; }
        -
        -.has-error .form-control {
        -  border-color: #a94442;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-error .form-control:focus {
        -    border-color: #843534;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }
        -
        -.has-error .input-group-addon {
        -  color: #a94442;
        -  border-color: #a94442;
        -  background-color: #f2dede; }
        -
        -.has-error .form-control-feedback {
        -  color: #a94442; }
        -
        -.has-feedback label ~ .form-control-feedback {
        -  top: 25px; }
        -
        -.has-feedback label.sr-only ~ .form-control-feedback {
        -  top: 0; }
        -
        -.help-block {
        -  display: block;
        -  margin-top: 5px;
        -  margin-bottom: 10px;
        -  color: #737373; }
        -
        -@media (min-width: 768px) {
        -  .form-inline .form-group {
        -    display: inline-block;
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -  .form-inline .form-control {
        -    display: inline-block;
        -    width: auto;
        -    vertical-align: middle; }
        -  .form-inline .form-control-static {
        -    display: inline-block; }
        -  .form-inline .input-group {
        -    display: inline-table;
        -    vertical-align: middle; }
        -    .form-inline .input-group .input-group-addon,
        -    .form-inline .input-group .input-group-btn,
        -    .form-inline .input-group .form-control {
        -      width: auto; }
        -  .form-inline .input-group > .form-control {
        -    width: 100%; }
        -  .form-inline .control-label {
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -  .form-inline .radio,
        -  .form-inline .checkbox {
        -    display: inline-block;
        -    margin-top: 0;
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -    .form-inline .radio label,
        -    .form-inline .checkbox label {
        -      padding-left: 0; }
        -  .form-inline .radio input[type="radio"],
        -  .form-inline .checkbox input[type="checkbox"] {
        -    position: relative;
        -    margin-left: 0; }
        -  .form-inline .has-feedback .form-control-feedback {
        -    top: 0; } }
        -
        -.form-horizontal .radio,
        -.form-horizontal .checkbox,
        -.form-horizontal .radio-inline,
        -.form-horizontal .checkbox-inline {
        -  margin-top: 0;
        -  margin-bottom: 0;
        -  padding-top: 7px; }
        -
        -.form-horizontal .radio,
        -.form-horizontal .checkbox {
        -  min-height: 27px; }
        -
        -.form-horizontal .form-group {
        -  margin-left: -15px;
        -  margin-right: -15px; }
        -  .form-horizontal .form-group:before, .form-horizontal .form-group:after {
        -    content: " ";
        -    display: table; }
        -  .form-horizontal .form-group:after {
        -    clear: both; }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .control-label {
        -    text-align: right;
        -    margin-bottom: 0;
        -    padding-top: 7px; } }
        -
        -.form-horizontal .has-feedback .form-control-feedback {
        -  right: 15px; }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .form-group-lg .control-label {
        -    padding-top: 11px;
        -    font-size: 18px; } }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .form-group-sm .control-label {
        -    padding-top: 6px;
        -    font-size: 12px; } }
        -
        -.btn {
        -  display: inline-block;
        -  margin-bottom: 0;
        -  font-weight: normal;
        -  text-align: center;
        -  vertical-align: middle;
        -  -ms-touch-action: manipulation;
        -  touch-action: manipulation;
        -  cursor: pointer;
        -  background-image: none;
        -  border: 1px solid transparent;
        -  white-space: nowrap;
        -  padding: 6px 12px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  border-radius: 4px;
        -  -webkit-user-select: none;
        -  -moz-user-select: none;
        -  -ms-user-select: none;
        -  user-select: none; }
        -  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
        -    outline: thin dotted;
        -    outline: 5px auto -webkit-focus-ring-color;
        -    outline-offset: -2px; }
        -  .btn:hover, .btn:focus, .btn.focus {
        -    color: #333;
        -    text-decoration: none; }
        -  .btn:active, .btn.active {
        -    outline: 0;
        -    background-image: none;
        -    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
        -  .btn.disabled, .btn[disabled],
        -  fieldset[disabled] .btn {
        -    cursor: not-allowed;
        -    opacity: 0.65;
        -    filter: alpha(opacity=65);
        -    box-shadow: none; }
        -
        -a.btn.disabled,
        -fieldset[disabled] a.btn {
        -  pointer-events: none; }
        -
        -.btn-default {
        -  color: #333;
        -  background-color: #fff;
        -  border-color: #ccc; }
        -  .btn-default:focus, .btn-default.focus {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #8c8c8c; }
        -  .btn-default:hover {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #adadad; }
        -  .btn-default:active, .btn-default.active,
        -  .open > .btn-default.dropdown-toggle {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #adadad; }
        -    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,
        -    .open > .btn-default.dropdown-toggle:hover,
        -    .open > .btn-default.dropdown-toggle:focus,
        -    .open > .btn-default.dropdown-toggle.focus {
        -      color: #333;
        -      background-color: #d4d4d4;
        -      border-color: #8c8c8c; }
        -  .btn-default:active, .btn-default.active,
        -  .open > .btn-default.dropdown-toggle {
        -    background-image: none; }
        -  .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,
        -  fieldset[disabled] .btn-default:hover,
        -  fieldset[disabled] .btn-default:focus,
        -  fieldset[disabled] .btn-default.focus {
        -    background-color: #fff;
        -    border-color: #ccc; }
        -  .btn-default .badge {
        -    color: #fff;
        -    background-color: #333; }
        -
        -.btn-primary {
        -  color: #fff;
        -  background-color: #337ab7;
        -  border-color: #2e6da4; }
        -  .btn-primary:focus, .btn-primary.focus {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #122b40; }
        -  .btn-primary:hover {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #204d74; }
        -  .btn-primary:active, .btn-primary.active,
        -  .open > .btn-primary.dropdown-toggle {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #204d74; }
        -    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,
        -    .open > .btn-primary.dropdown-toggle:hover,
        -    .open > .btn-primary.dropdown-toggle:focus,
        -    .open > .btn-primary.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #204d74;
        -      border-color: #122b40; }
        -  .btn-primary:active, .btn-primary.active,
        -  .open > .btn-primary.dropdown-toggle {
        -    background-image: none; }
        -  .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,
        -  fieldset[disabled] .btn-primary:hover,
        -  fieldset[disabled] .btn-primary:focus,
        -  fieldset[disabled] .btn-primary.focus {
        -    background-color: #337ab7;
        -    border-color: #2e6da4; }
        -  .btn-primary .badge {
        -    color: #337ab7;
        -    background-color: #fff; }
        -
        -.btn-success {
        -  color: #fff;
        -  background-color: #5cb85c;
        -  border-color: #4cae4c; }
        -  .btn-success:focus, .btn-success.focus {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #255625; }
        -  .btn-success:hover {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #398439; }
        -  .btn-success:active, .btn-success.active,
        -  .open > .btn-success.dropdown-toggle {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #398439; }
        -    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,
        -    .open > .btn-success.dropdown-toggle:hover,
        -    .open > .btn-success.dropdown-toggle:focus,
        -    .open > .btn-success.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #398439;
        -      border-color: #255625; }
        -  .btn-success:active, .btn-success.active,
        -  .open > .btn-success.dropdown-toggle {
        -    background-image: none; }
        -  .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,
        -  fieldset[disabled] .btn-success:hover,
        -  fieldset[disabled] .btn-success:focus,
        -  fieldset[disabled] .btn-success.focus {
        -    background-color: #5cb85c;
        -    border-color: #4cae4c; }
        -  .btn-success .badge {
        -    color: #5cb85c;
        -    background-color: #fff; }
        -
        -.btn-info {
        -  color: #fff;
        -  background-color: #5bc0de;
        -  border-color: #46b8da; }
        -  .btn-info:focus, .btn-info.focus {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #1b6d85; }
        -  .btn-info:hover {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #269abc; }
        -  .btn-info:active, .btn-info.active,
        -  .open > .btn-info.dropdown-toggle {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #269abc; }
        -    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,
        -    .open > .btn-info.dropdown-toggle:hover,
        -    .open > .btn-info.dropdown-toggle:focus,
        -    .open > .btn-info.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #269abc;
        -      border-color: #1b6d85; }
        -  .btn-info:active, .btn-info.active,
        -  .open > .btn-info.dropdown-toggle {
        -    background-image: none; }
        -  .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,
        -  fieldset[disabled] .btn-info:hover,
        -  fieldset[disabled] .btn-info:focus,
        -  fieldset[disabled] .btn-info.focus {
        -    background-color: #5bc0de;
        -    border-color: #46b8da; }
        -  .btn-info .badge {
        -    color: #5bc0de;
        -    background-color: #fff; }
        -
        -.btn-warning {
        -  color: #fff;
        -  background-color: #f0ad4e;
        -  border-color: #eea236; }
        -  .btn-warning:focus, .btn-warning.focus {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #985f0d; }
        -  .btn-warning:hover {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #d58512; }
        -  .btn-warning:active, .btn-warning.active,
        -  .open > .btn-warning.dropdown-toggle {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #d58512; }
        -    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,
        -    .open > .btn-warning.dropdown-toggle:hover,
        -    .open > .btn-warning.dropdown-toggle:focus,
        -    .open > .btn-warning.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #d58512;
        -      border-color: #985f0d; }
        -  .btn-warning:active, .btn-warning.active,
        -  .open > .btn-warning.dropdown-toggle {
        -    background-image: none; }
        -  .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,
        -  fieldset[disabled] .btn-warning:hover,
        -  fieldset[disabled] .btn-warning:focus,
        -  fieldset[disabled] .btn-warning.focus {
        -    background-color: #f0ad4e;
        -    border-color: #eea236; }
        -  .btn-warning .badge {
        -    color: #f0ad4e;
        -    background-color: #fff; }
        -
        -.btn-danger {
        -  color: #fff;
        -  background-color: #d9534f;
        -  border-color: #d43f3a; }
        -  .btn-danger:focus, .btn-danger.focus {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #761c19; }
        -  .btn-danger:hover {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #ac2925; }
        -  .btn-danger:active, .btn-danger.active,
        -  .open > .btn-danger.dropdown-toggle {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #ac2925; }
        -    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,
        -    .open > .btn-danger.dropdown-toggle:hover,
        -    .open > .btn-danger.dropdown-toggle:focus,
        -    .open > .btn-danger.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #ac2925;
        -      border-color: #761c19; }
        -  .btn-danger:active, .btn-danger.active,
        -  .open > .btn-danger.dropdown-toggle {
        -    background-image: none; }
        -  .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,
        -  fieldset[disabled] .btn-danger:hover,
        -  fieldset[disabled] .btn-danger:focus,
        -  fieldset[disabled] .btn-danger.focus {
        -    background-color: #d9534f;
        -    border-color: #d43f3a; }
        -  .btn-danger .badge {
        -    color: #d9534f;
        -    background-color: #fff; }
        -
        -.btn-link {
        -  color: #337ab7;
        -  font-weight: normal;
        -  border-radius: 0; }
        -  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],
        -  fieldset[disabled] .btn-link {
        -    background-color: transparent;
        -    box-shadow: none; }
        -  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {
        -    border-color: transparent; }
        -  .btn-link:hover, .btn-link:focus {
        -    color: #23527c;
        -    text-decoration: underline;
        -    background-color: transparent; }
        -  .btn-link[disabled]:hover, .btn-link[disabled]:focus,
        -  fieldset[disabled] .btn-link:hover,
        -  fieldset[disabled] .btn-link:focus {
        -    color: #777777;
        -    text-decoration: none; }
        -
        -.btn-lg, .btn-group-lg > .btn {
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -.btn-sm, .btn-group-sm > .btn {
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.btn-xs, .btn-group-xs > .btn {
        -  padding: 1px 5px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.btn-block {
        -  display: block;
        -  width: 100%; }
        -
        -.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;
        -  transition: opacity 0.15s linear; }
        -  .fade.in {
        -    opacity: 1; }
        -
        -.collapse {
        -  display: none; }
        -  .collapse.in {
        -    display: block; }
        -
        -tr.collapse.in {
        -  display: table-row; }
        -
        -tbody.collapse.in {
        -  display: table-row-group; }
        -
        -.collapsing {
        -  position: relative;
        -  height: 0;
        -  overflow: hidden;
        -  transition-property: height, visibility;
        -  transition-duration: 0.35s;
        -  transition-timing-function: ease; }
        -
        -.caret {
        -  display: inline-block;
        -  width: 0;
        -  height: 0;
        -  margin-left: 2px;
        -  vertical-align: middle;
        -  border-top: 4px dashed;
        -  border-top: 4px solid \9;
        -  border-right: 4px solid transparent;
        -  border-left: 4px solid transparent; }
        -
        -.dropup,
        -.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;
        -  list-style: none;
        -  font-size: 14px;
        -  text-align: left;
        -  background-color: #fff;
        -  border: 1px solid #ccc;
        -  border: 1px solid rgba(0, 0, 0, 0.15);
        -  border-radius: 4px;
        -  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: #333333;
        -    white-space: nowrap; }
        -
        -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
        -  text-decoration: none;
        -  color: #262626;
        -  background-color: #f5f5f5; }
        -
        -.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  outline: 0;
        -  background-color: #337ab7; }
        -
        -.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
        -  color: #777777; }
        -
        -.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
        -  text-decoration: none;
        -  background-color: transparent;
        -  background-image: none;
        -  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
        -  cursor: not-allowed; }
        -
        -.open > .dropdown-menu {
        -  display: block; }
        -
        -.open > a {
        -  outline: 0; }
        -
        -.dropdown-menu-right {
        -  left: auto;
        -  right: 0; }
        -
        -.dropdown-menu-left {
        -  left: 0;
        -  right: auto; }
        -
        -.dropdown-header {
        -  display: block;
        -  padding: 3px 20px;
        -  font-size: 12px;
        -  line-height: 1.428571429;
        -  color: #777777;
        -  white-space: nowrap; }
        -
        -.dropdown-backdrop {
        -  position: fixed;
        -  left: 0;
        -  right: 0;
        -  bottom: 0;
        -  top: 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 dashed;
        -  border-bottom: 4px solid \9;
        -  content: ""; }
        -
        -.dropup .dropdown-menu,
        -.navbar-fixed-bottom .dropdown .dropdown-menu {
        -  top: auto;
        -  bottom: 100%;
        -  margin-bottom: 2px; }
        -
        -@media (min-width: 768px) {
        -  .navbar-right .dropdown-menu {
        -    right: 0;
        -    left: auto; }
        -  .navbar-right .dropdown-menu-left {
        -    left: 0;
        -    right: 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 > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
        -    .btn-group-vertical > .btn:hover,
        -    .btn-group-vertical > .btn:focus,
        -    .btn-group-vertical > .btn:active,
        -    .btn-group-vertical > .btn.active {
        -      z-index: 2; }
        -
        -.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 {
        -  margin-left: -5px; }
        -  .btn-toolbar:before, .btn-toolbar:after {
        -    content: " ";
        -    display: table; }
        -  .btn-toolbar:after {
        -    clear: both; }
        -  .btn-toolbar .btn,
        -  .btn-toolbar .btn-group,
        -  .btn-toolbar .input-group {
        -    float: left; }
        -  .btn-toolbar > .btn,
        -  .btn-toolbar > .btn-group,
        -  .btn-toolbar > .input-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-bottom-right-radius: 0;
        -    border-top-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:not(:last-child) > .btn:last-child,
        -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
        -  border-bottom-right-radius: 0;
        -  border-top-right-radius: 0; }
        -
        -.btn-group > .btn-group:last-child:not(:first-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 > .btn + .dropdown-toggle {
        -  padding-left: 8px;
        -  padding-right: 8px; }
        -
        -.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {
        -  padding-left: 12px;
        -  padding-right: 12px; }
        -
        -.btn-group.open .dropdown-toggle {
        -  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
        -  .btn-group.open .dropdown-toggle.btn-link {
        -    box-shadow: none; }
        -
        -.btn .caret {
        -  margin-left: 0; }
        -
        -.btn-lg .caret, .btn-group-lg > .btn .caret {
        -  border-width: 5px 5px 0;
        -  border-bottom-width: 0; }
        -
        -.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .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 {
        -  content: " ";
        -  display: table; }
        -
        -.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-top-left-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-top-left-radius: 0;
        -  border-bottom-right-radius: 4px;
        -  border-bottom-left-radius: 4px; }
        -
        -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
        -  border-radius: 0; }
        -
        -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
        -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0; }
        -
        -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.btn-group-justified {
        -  display: table;
        -  width: 100%;
        -  table-layout: fixed;
        -  border-collapse: separate; }
        -  .btn-group-justified > .btn,
        -  .btn-group-justified > .btn-group {
        -    float: none;
        -    display: table-cell;
        -    width: 1%; }
        -  .btn-group-justified > .btn-group .btn {
        -    width: 100%; }
        -  .btn-group-justified > .btn-group .dropdown-menu {
        -    left: auto; }
        -
        -[data-toggle="buttons"] > .btn input[type="radio"],
        -[data-toggle="buttons"] > .btn input[type="checkbox"],
        -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
        -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
        -  position: absolute;
        -  clip: rect(0, 0, 0, 0);
        -  pointer-events: none; }
        -
        -.input-group {
        -  position: relative;
        -  display: table;
        -  border-collapse: separate; }
        -  .input-group[class*="col-"] {
        -    float: none;
        -    padding-left: 0;
        -    padding-right: 0; }
        -  .input-group .form-control {
        -    position: relative;
        -    z-index: 2;
        -    float: left;
        -    width: 100%;
        -    margin-bottom: 0; }
        -    .input-group .form-control:focus {
        -      z-index: 3; }
        -
        -.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: 6px 12px;
        -  font-size: 14px;
        -  font-weight: normal;
        -  line-height: 1;
        -  color: #555555;
        -  text-align: center;
        -  background-color: #eeeeee;
        -  border: 1px solid #ccc;
        -  border-radius: 4px; }
        -  .input-group-addon.input-sm,
        -  .input-group-sm > .input-group-addon,
        -  .input-group-sm > .input-group-btn > .input-group-addon.btn {
        -    padding: 5px 10px;
        -    font-size: 12px;
        -    border-radius: 3px; }
        -  .input-group-addon.input-lg,
        -  .input-group-lg > .input-group-addon,
        -  .input-group-lg > .input-group-btn > .input-group-addon.btn {
        -    padding: 10px 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 > .btn-group > .btn,
        -.input-group-btn:first-child > .dropdown-toggle,
        -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
        -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
        -  border-bottom-right-radius: 0;
        -  border-top-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 > .btn-group > .btn,
        -.input-group-btn:last-child > .dropdown-toggle,
        -.input-group-btn:first-child > .btn:not(:first-child),
        -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
        -  border-bottom-left-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.input-group-addon:last-child {
        -  border-left: 0; }
        -
        -.input-group-btn {
        -  position: relative;
        -  font-size: 0;
        -  white-space: nowrap; }
        -  .input-group-btn > .btn {
        -    position: relative; }
        -    .input-group-btn > .btn + .btn {
        -      margin-left: -1px; }
        -    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {
        -      z-index: 2; }
        -  .input-group-btn:first-child > .btn,
        -  .input-group-btn:first-child > .btn-group {
        -    margin-right: -1px; }
        -  .input-group-btn:last-child > .btn,
        -  .input-group-btn:last-child > .btn-group {
        -    z-index: 2;
        -    margin-left: -1px; }
        -
        -.nav {
        -  margin-bottom: 0;
        -  padding-left: 0;
        -  list-style: none; }
        -  .nav:before, .nav:after {
        -    content: " ";
        -    display: table; }
        -  .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: #eeeeee; }
        -    .nav > li.disabled > a {
        -      color: #777777; }
        -      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
        -        color: #777777;
        -        text-decoration: none;
        -        background-color: transparent;
        -        cursor: not-allowed; }
        -  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
        -    background-color: #eeeeee;
        -    border-color: #337ab7; }
        -  .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: #eeeeee #eeeeee #ddd; }
        -    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
        -      color: #555555;
        -      background-color: #fff;
        -      border: 1px solid #ddd;
        -      border-bottom-color: transparent;
        -      cursor: default; }
        -
        -.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: #337ab7; }
        -
        -.nav-stacked > li {
        -  float: none; }
        -  .nav-stacked > li + li {
        -    margin-top: 2px;
        -    margin-left: 0; }
        -
        -.nav-justified, .nav-tabs.nav-justified {
        -  width: 100%; }
        -  .nav-justified > li, .nav-tabs.nav-justified > li {
        -    float: none; }
        -    .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
        -      text-align: center;
        -      margin-bottom: 5px; }
        -  .nav-justified > .dropdown .dropdown-menu {
        -    top: auto;
        -    left: auto; }
        -  @media (min-width: 768px) {
        -    .nav-justified > li, .nav-tabs.nav-justified > li {
        -      display: table-cell;
        -      width: 1%; }
        -      .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
        -        margin-bottom: 0; } }
        -
        -.nav-tabs-justified, .nav-tabs.nav-justified {
        -  border-bottom: 0; }
        -  .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
        -    margin-right: 0;
        -    border-radius: 4px; }
        -  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
        -  .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
        -  .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
        -    border: 1px solid #ddd; }
        -  @media (min-width: 768px) {
        -    .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
        -      border-bottom: 1px solid #ddd;
        -      border-radius: 4px 4px 0 0; }
        -    .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
        -    .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
        -    .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-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 {
        -    content: " ";
        -    display: table; }
        -  .navbar:after {
        -    clear: both; }
        -  @media (min-width: 768px) {
        -    .navbar {
        -      border-radius: 4px; } }
        -
        -.navbar-header:before, .navbar-header:after {
        -  content: " ";
        -  display: table; }
        -
        -.navbar-header:after {
        -  clear: both; }
        -
        -@media (min-width: 768px) {
        -  .navbar-header {
        -    float: left; } }
        -
        -.navbar-collapse {
        -  overflow-x: visible;
        -  padding-right: 15px;
        -  padding-left: 15px;
        -  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 {
        -    content: " ";
        -    display: table; }
        -  .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-left: 0;
        -        padding-right: 0; } }
        -
        -.navbar-fixed-top .navbar-collapse,
        -.navbar-fixed-bottom .navbar-collapse {
        -  max-height: 340px; }
        -  @media (max-device-width: 480px) and (orientation: landscape) {
        -    .navbar-fixed-top .navbar-collapse,
        -    .navbar-fixed-bottom .navbar-collapse {
        -      max-height: 200px; } }
        -
        -.container > .navbar-header,
        -.container > .navbar-collapse,
        -.container-fluid > .navbar-header,
        -.container-fluid > .navbar-collapse {
        -  margin-right: -15px;
        -  margin-left: -15px; }
        -  @media (min-width: 768px) {
        -    .container > .navbar-header,
        -    .container > .navbar-collapse,
        -    .container-fluid > .navbar-header,
        -    .container-fluid > .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;
        -  height: 50px; }
        -  .navbar-brand:hover, .navbar-brand:focus {
        -    text-decoration: none; }
        -  .navbar-brand > img {
        -    display: block; }
        -  @media (min-width: 768px) {
        -    .navbar > .container .navbar-brand,
        -    .navbar > .container-fluid .navbar-brand {
        -      margin-left: -15px; } }
        -
        -.navbar-toggle {
        -  position: relative;
        -  float: right;
        -  margin-right: 15px;
        -  padding: 9px 10px;
        -  margin-top: 8px;
        -  margin-bottom: 8px;
        -  background-color: transparent;
        -  background-image: none;
        -  border: 1px solid transparent;
        -  border-radius: 4px; }
        -  .navbar-toggle:focus {
        -    outline: 0; }
        -  .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-form {
        -  margin-left: -15px;
        -  margin-right: -15px;
        -  padding: 10px 15px;
        -  border-top: 1px solid transparent;
        -  border-bottom: 1px solid transparent;
        -  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
        -  margin-top: 8px;
        -  margin-bottom: 8px; }
        -  @media (min-width: 768px) {
        -    .navbar-form .form-group {
        -      display: inline-block;
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -    .navbar-form .form-control {
        -      display: inline-block;
        -      width: auto;
        -      vertical-align: middle; }
        -    .navbar-form .form-control-static {
        -      display: inline-block; }
        -    .navbar-form .input-group {
        -      display: inline-table;
        -      vertical-align: middle; }
        -      .navbar-form .input-group .input-group-addon,
        -      .navbar-form .input-group .input-group-btn,
        -      .navbar-form .input-group .form-control {
        -        width: auto; }
        -    .navbar-form .input-group > .form-control {
        -      width: 100%; }
        -    .navbar-form .control-label {
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -    .navbar-form .radio,
        -    .navbar-form .checkbox {
        -      display: inline-block;
        -      margin-top: 0;
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -      .navbar-form .radio label,
        -      .navbar-form .checkbox label {
        -        padding-left: 0; }
        -    .navbar-form .radio input[type="radio"],
        -    .navbar-form .checkbox input[type="checkbox"] {
        -      position: relative;
        -      margin-left: 0; }
        -    .navbar-form .has-feedback .form-control-feedback {
        -      top: 0; } }
        -  @media (max-width: 767px) {
        -    .navbar-form .form-group {
        -      margin-bottom: 5px; }
        -      .navbar-form .form-group:last-child {
        -        margin-bottom: 0; } }
        -  @media (min-width: 768px) {
        -    .navbar-form {
        -      width: auto;
        -      border: 0;
        -      margin-left: 0;
        -      margin-right: 0;
        -      padding-top: 0;
        -      padding-bottom: 0;
        -      box-shadow: none; } }
        -
        -.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 {
        -  margin-bottom: 0;
        -  border-top-right-radius: 4px;
        -  border-top-left-radius: 4px;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0; }
        -
        -.navbar-btn {
        -  margin-top: 8px;
        -  margin-bottom: 8px; }
        -  .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
        -    margin-top: 10px;
        -    margin-bottom: 10px; }
        -  .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
        -    margin-top: 14px;
        -    margin-bottom: 14px; }
        -
        -.navbar-text {
        -  margin-top: 15px;
        -  margin-bottom: 15px; }
        -  @media (min-width: 768px) {
        -    .navbar-text {
        -      float: left;
        -      margin-left: 15px;
        -      margin-right: 15px; } }
        -
        -@media (min-width: 768px) {
        -  .navbar-left {
        -    float: left !important; }
        -  .navbar-right {
        -    float: right !important;
        -    margin-right: -15px; }
        -    .navbar-right ~ .navbar-right {
        -      margin-right: 0; } }
        -
        -.navbar-default {
        -  background-color: #f8f8f8;
        -  border-color: #e7e7e7; }
        -  .navbar-default .navbar-brand {
        -    color: #777; }
        -    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
        -      color: #5e5e5e;
        -      background-color: transparent; }
        -  .navbar-default .navbar-text {
        -    color: #777; }
        -  .navbar-default .navbar-nav > li > a {
        -    color: #777; }
        -    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
        -      color: #333;
        -      background-color: transparent; }
        -  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
        -    color: #555;
        -    background-color: #e7e7e7; }
        -  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {
        -    color: #ccc;
        -    background-color: transparent; }
        -  .navbar-default .navbar-toggle {
        -    border-color: #ddd; }
        -    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
        -      background-color: #ddd; }
        -    .navbar-default .navbar-toggle .icon-bar {
        -      background-color: #888; }
        -  .navbar-default .navbar-collapse,
        -  .navbar-default .navbar-form {
        -    border-color: #e7e7e7; }
        -  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
        -    background-color: #e7e7e7;
        -    color: #555; }
        -  @media (max-width: 767px) {
        -    .navbar-default .navbar-nav .open .dropdown-menu > li > a {
        -      color: #777; }
        -      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
        -        color: #333;
        -        background-color: transparent; }
        -    .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: #555;
        -      background-color: #e7e7e7; }
        -    .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: #ccc;
        -      background-color: transparent; } }
        -  .navbar-default .navbar-link {
        -    color: #777; }
        -    .navbar-default .navbar-link:hover {
        -      color: #333; }
        -  .navbar-default .btn-link {
        -    color: #777; }
        -    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
        -      color: #333; }
        -    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,
        -    fieldset[disabled] .navbar-default .btn-link:hover,
        -    fieldset[disabled] .navbar-default .btn-link:focus {
        -      color: #ccc; }
        -
        -.navbar-inverse {
        -  background-color: #222;
        -  border-color: #090909; }
        -  .navbar-inverse .navbar-brand {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
        -      color: #fff;
        -      background-color: transparent; }
        -  .navbar-inverse .navbar-text {
        -    color: #9d9d9d; }
        -  .navbar-inverse .navbar-nav > li > a {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {
        -      color: #fff;
        -      background-color: transparent; }
        -  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
        -    color: #fff;
        -    background-color: #090909; }
        -  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {
        -    color: #444;
        -    background-color: transparent; }
        -  .navbar-inverse .navbar-toggle {
        -    border-color: #333; }
        -    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
        -      background-color: #333; }
        -    .navbar-inverse .navbar-toggle .icon-bar {
        -      background-color: #fff; }
        -  .navbar-inverse .navbar-collapse,
        -  .navbar-inverse .navbar-form {
        -    border-color: #101010; }
        -  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {
        -    background-color: #090909;
        -    color: #fff; }
        -  @media (max-width: 767px) {
        -    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
        -      border-color: #090909; }
        -    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
        -      background-color: #090909; }
        -    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
        -      color: #9d9d9d; }
        -      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
        -        color: #fff;
        -        background-color: transparent; }
        -    .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: #090909; }
        -    .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: #444;
        -      background-color: transparent; } }
        -  .navbar-inverse .navbar-link {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-link:hover {
        -      color: #fff; }
        -  .navbar-inverse .btn-link {
        -    color: #9d9d9d; }
        -    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
        -      color: #fff; }
        -    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,
        -    fieldset[disabled] .navbar-inverse .btn-link:hover,
        -    fieldset[disabled] .navbar-inverse .btn-link:focus {
        -      color: #444; }
        -
        -.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 {
        -      content: "/ ";
        -      padding: 0 5px;
        -      color: #ccc; }
        -  .breadcrumb > .active {
        -    color: #777777; }
        -
        -.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: 6px 12px;
        -      line-height: 1.428571429;
        -      text-decoration: none;
        -      color: #337ab7;
        -      background-color: #fff;
        -      border: 1px solid #ddd;
        -      margin-left: -1px; }
        -    .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-bottom-right-radius: 4px;
        -      border-top-right-radius: 4px; }
        -  .pagination > li > a:hover, .pagination > li > a:focus,
        -  .pagination > li > span:hover,
        -  .pagination > li > span:focus {
        -    z-index: 2;
        -    color: #23527c;
        -    background-color: #eeeeee;
        -    border-color: #ddd; }
        -  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,
        -  .pagination > .active > span,
        -  .pagination > .active > span:hover,
        -  .pagination > .active > span:focus {
        -    z-index: 3;
        -    color: #fff;
        -    background-color: #337ab7;
        -    border-color: #337ab7;
        -    cursor: default; }
        -  .pagination > .disabled > span,
        -  .pagination > .disabled > span:hover,
        -  .pagination > .disabled > span:focus,
        -  .pagination > .disabled > a,
        -  .pagination > .disabled > a:hover,
        -  .pagination > .disabled > a:focus {
        -    color: #777777;
        -    background-color: #fff;
        -    border-color: #ddd;
        -    cursor: not-allowed; }
        -
        -.pagination-lg > li > a,
        -.pagination-lg > li > span {
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333; }
        -
        -.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-bottom-right-radius: 6px;
        -  border-top-right-radius: 6px; }
        -
        -.pagination-sm > li > a,
        -.pagination-sm > li > span {
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5; }
        -
        -.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-bottom-right-radius: 3px;
        -  border-top-right-radius: 3px; }
        -
        -.pager {
        -  padding-left: 0;
        -  margin: 20px 0;
        -  list-style: none;
        -  text-align: center; }
        -  .pager:before, .pager:after {
        -    content: " ";
        -    display: table; }
        -  .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: #eeeeee; }
        -  .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: #777777;
        -    background-color: #fff;
        -    cursor: not-allowed; }
        -
        -.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:empty {
        -    display: none; }
        -  .btn .label {
        -    position: relative;
        -    top: -1px; }
        -
        -a.label:hover, a.label:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  cursor: pointer; }
        -
        -.label-default {
        -  background-color: #777777; }
        -  .label-default[href]:hover, .label-default[href]:focus {
        -    background-color: #5e5e5e; }
        -
        -.label-primary {
        -  background-color: #337ab7; }
        -  .label-primary[href]:hover, .label-primary[href]:focus {
        -    background-color: #286090; }
        -
        -.label-success {
        -  background-color: #5cb85c; }
        -  .label-success[href]:hover, .label-success[href]:focus {
        -    background-color: #449d44; }
        -
        -.label-info {
        -  background-color: #5bc0de; }
        -  .label-info[href]:hover, .label-info[href]:focus {
        -    background-color: #31b0d5; }
        -
        -.label-warning {
        -  background-color: #f0ad4e; }
        -  .label-warning[href]:hover, .label-warning[href]:focus {
        -    background-color: #ec971f; }
        -
        -.label-danger {
        -  background-color: #d9534f; }
        -  .label-danger[href]:hover, .label-danger[href]:focus {
        -    background-color: #c9302c; }
        -
        -.badge {
        -  display: inline-block;
        -  min-width: 10px;
        -  padding: 3px 7px;
        -  font-size: 12px;
        -  font-weight: bold;
        -  color: #fff;
        -  line-height: 1;
        -  vertical-align: middle;
        -  white-space: nowrap;
        -  text-align: center;
        -  background-color: #777777;
        -  border-radius: 10px; }
        -  .badge:empty {
        -    display: none; }
        -  .btn .badge {
        -    position: relative;
        -    top: -1px; }
        -  .btn-xs .badge, .btn-group-xs > .btn .badge,
        -  .btn-group-xs > .btn .badge {
        -    top: 0;
        -    padding: 1px 5px; }
        -  .list-group-item.active > .badge,
        -  .nav-pills > .active > a > .badge {
        -    color: #337ab7;
        -    background-color: #fff; }
        -  .list-group-item > .badge {
        -    float: right; }
        -  .list-group-item > .badge + .badge {
        -    margin-right: 5px; }
        -  .nav-pills > li > a > .badge {
        -    margin-left: 3px; }
        -
        -a.badge:hover, a.badge:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  cursor: pointer; }
        -
        -.jumbotron {
        -  padding-top: 30px;
        -  padding-bottom: 30px;
        -  margin-bottom: 30px;
        -  color: inherit;
        -  background-color: #eeeeee; }
        -  .jumbotron h1,
        -  .jumbotron .h1 {
        -    color: inherit; }
        -  .jumbotron p {
        -    margin-bottom: 15px;
        -    font-size: 21px;
        -    font-weight: 200; }
        -  .jumbotron > hr {
        -    border-top-color: #d5d5d5; }
        -  .container .jumbotron,
        -  .container-fluid .jumbotron {
        -    border-radius: 6px;
        -    padding-left: 15px;
        -    padding-right: 15px; }
        -  .jumbotron .container {
        -    max-width: 100%; }
        -  @media screen and (min-width: 768px) {
        -    .jumbotron {
        -      padding-top: 48px;
        -      padding-bottom: 48px; }
        -      .container .jumbotron,
        -      .container-fluid .jumbotron {
        -        padding-left: 60px;
        -        padding-right: 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;
        -  transition: border 0.2s ease-in-out; }
        -  .thumbnail > img,
        -  .thumbnail a > img {
        -    display: block;
        -    max-width: 100%;
        -    height: auto;
        -    margin-left: auto;
        -    margin-right: auto; }
        -  .thumbnail .caption {
        -    padding: 9px;
        -    color: #333333; }
        -
        -a.thumbnail:hover,
        -a.thumbnail:focus,
        -a.thumbnail.active {
        -  border-color: #337ab7; }
        -
        -.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,
        -.alert-dismissible {
        -  padding-right: 35px; }
        -  .alert-dismissable .close,
        -  .alert-dismissible .close {
        -    position: relative;
        -    top: -2px;
        -    right: -21px;
        -    color: inherit; }
        -
        -.alert-success {
        -  background-color: #dff0d8;
        -  border-color: #d6e9c6;
        -  color: #3c763d; }
        -  .alert-success hr {
        -    border-top-color: #c9e2b3; }
        -  .alert-success .alert-link {
        -    color: #2b542c; }
        -
        -.alert-info {
        -  background-color: #d9edf7;
        -  border-color: #bce8f1;
        -  color: #31708f; }
        -  .alert-info hr {
        -    border-top-color: #a6e1ec; }
        -  .alert-info .alert-link {
        -    color: #245269; }
        -
        -.alert-warning {
        -  background-color: #fcf8e3;
        -  border-color: #faebcc;
        -  color: #8a6d3b; }
        -  .alert-warning hr {
        -    border-top-color: #f7e1b5; }
        -  .alert-warning .alert-link {
        -    color: #66512c; }
        -
        -.alert-danger {
        -  background-color: #f2dede;
        -  border-color: #ebccd1;
        -  color: #a94442; }
        -  .alert-danger hr {
        -    border-top-color: #e4b9c0; }
        -  .alert-danger .alert-link {
        -    color: #843534; }
        -
        -@-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 {
        -  overflow: hidden;
        -  height: 20px;
        -  margin-bottom: 20px;
        -  background-color: #f5f5f5;
        -  border-radius: 4px;
        -  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: #337ab7;
        -  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
        -  transition: width 0.6s ease; }
        -
        -.progress-striped .progress-bar,
        -.progress-bar-striped {
        -  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,
        -.progress-bar.active {
        -  -webkit-animation: progress-bar-stripes 2s linear infinite;
        -  animation: progress-bar-stripes 2s linear infinite; }
        -
        -.progress-bar-success {
        -  background-color: #5cb85c; }
        -  .progress-striped .progress-bar-success {
        -    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: #5bc0de; }
        -  .progress-striped .progress-bar-info {
        -    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: #f0ad4e; }
        -  .progress-striped .progress-bar-warning {
        -    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: #d9534f; }
        -  .progress-striped .progress-bar-danger {
        -    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 {
        -  margin-top: 15px; }
        -  .media:first-child {
        -    margin-top: 0; }
        -
        -.media,
        -.media-body {
        -  zoom: 1;
        -  overflow: hidden; }
        -
        -.media-body {
        -  width: 10000px; }
        -
        -.media-object {
        -  display: block; }
        -  .media-object.img-thumbnail {
        -    max-width: none; }
        -
        -.media-right,
        -.media > .pull-right {
        -  padding-left: 10px; }
        -
        -.media-left,
        -.media > .pull-left {
        -  padding-right: 10px; }
        -
        -.media-left,
        -.media-right,
        -.media-body {
        -  display: table-cell;
        -  vertical-align: top; }
        -
        -.media-middle {
        -  vertical-align: middle; }
        -
        -.media-bottom {
        -  vertical-align: bottom; }
        -
        -.media-heading {
        -  margin-top: 0;
        -  margin-bottom: 5px; }
        -
        -.media-list {
        -  padding-left: 0;
        -  list-style: none; }
        -
        -.list-group {
        -  margin-bottom: 20px;
        -  padding-left: 0; }
        -
        -.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; }
        -
        -a.list-group-item,
        -button.list-group-item {
        -  color: #555; }
        -  a.list-group-item .list-group-item-heading,
        -  button.list-group-item .list-group-item-heading {
        -    color: #333; }
        -  a.list-group-item:hover, a.list-group-item:focus,
        -  button.list-group-item:hover,
        -  button.list-group-item:focus {
        -    text-decoration: none;
        -    color: #555;
        -    background-color: #f5f5f5; }
        -
        -button.list-group-item {
        -  width: 100%;
        -  text-align: left; }
        -
        -.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
        -  background-color: #eeeeee;
        -  color: #777777;
        -  cursor: not-allowed; }
        -  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {
        -    color: inherit; }
        -  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {
        -    color: #777777; }
        -
        -.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
        -  z-index: 2;
        -  color: #fff;
        -  background-color: #337ab7;
        -  border-color: #337ab7; }
        -  .list-group-item.active .list-group-item-heading,
        -  .list-group-item.active .list-group-item-heading > small,
        -  .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,
        -  .list-group-item.active:hover .list-group-item-heading > small,
        -  .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,
        -  .list-group-item.active:focus .list-group-item-heading > small,
        -  .list-group-item.active:focus .list-group-item-heading > .small {
        -    color: inherit; }
        -  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {
        -    color: #c7ddef; }
        -
        -.list-group-item-success {
        -  color: #3c763d;
        -  background-color: #dff0d8; }
        -
        -a.list-group-item-success,
        -button.list-group-item-success {
        -  color: #3c763d; }
        -  a.list-group-item-success .list-group-item-heading,
        -  button.list-group-item-success .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-success:hover, a.list-group-item-success:focus,
        -  button.list-group-item-success:hover,
        -  button.list-group-item-success:focus {
        -    color: #3c763d;
        -    background-color: #d0e9c6; }
        -  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,
        -  button.list-group-item-success.active,
        -  button.list-group-item-success.active:hover,
        -  button.list-group-item-success.active:focus {
        -    color: #fff;
        -    background-color: #3c763d;
        -    border-color: #3c763d; }
        -
        -.list-group-item-info {
        -  color: #31708f;
        -  background-color: #d9edf7; }
        -
        -a.list-group-item-info,
        -button.list-group-item-info {
        -  color: #31708f; }
        -  a.list-group-item-info .list-group-item-heading,
        -  button.list-group-item-info .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-info:hover, a.list-group-item-info:focus,
        -  button.list-group-item-info:hover,
        -  button.list-group-item-info:focus {
        -    color: #31708f;
        -    background-color: #c4e3f3; }
        -  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,
        -  button.list-group-item-info.active,
        -  button.list-group-item-info.active:hover,
        -  button.list-group-item-info.active:focus {
        -    color: #fff;
        -    background-color: #31708f;
        -    border-color: #31708f; }
        -
        -.list-group-item-warning {
        -  color: #8a6d3b;
        -  background-color: #fcf8e3; }
        -
        -a.list-group-item-warning,
        -button.list-group-item-warning {
        -  color: #8a6d3b; }
        -  a.list-group-item-warning .list-group-item-heading,
        -  button.list-group-item-warning .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-warning:hover, a.list-group-item-warning:focus,
        -  button.list-group-item-warning:hover,
        -  button.list-group-item-warning:focus {
        -    color: #8a6d3b;
        -    background-color: #faf2cc; }
        -  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,
        -  button.list-group-item-warning.active,
        -  button.list-group-item-warning.active:hover,
        -  button.list-group-item-warning.active:focus {
        -    color: #fff;
        -    background-color: #8a6d3b;
        -    border-color: #8a6d3b; }
        -
        -.list-group-item-danger {
        -  color: #a94442;
        -  background-color: #f2dede; }
        -
        -a.list-group-item-danger,
        -button.list-group-item-danger {
        -  color: #a94442; }
        -  a.list-group-item-danger .list-group-item-heading,
        -  button.list-group-item-danger .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-danger:hover, a.list-group-item-danger:focus,
        -  button.list-group-item-danger:hover,
        -  button.list-group-item-danger:focus {
        -    color: #a94442;
        -    background-color: #ebcccc; }
        -  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,
        -  button.list-group-item-danger.active,
        -  button.list-group-item-danger.active:hover,
        -  button.list-group-item-danger.active:focus {
        -    color: #fff;
        -    background-color: #a94442;
        -    border-color: #a94442; }
        -
        -.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;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }
        -
        -.panel-body {
        -  padding: 15px; }
        -  .panel-body:before, .panel-body:after {
        -    content: " ";
        -    display: table; }
        -  .panel-body:after {
        -    clear: both; }
        -
        -.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,
        -  .panel-title > small,
        -  .panel-title > .small,
        -  .panel-title > small > a,
        -  .panel-title > .small > 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 > .list-group,
        -.panel > .panel-collapse > .list-group {
        -  margin-bottom: 0; }
        -  .panel > .list-group .list-group-item,
        -  .panel > .panel-collapse > .list-group .list-group-item {
        -    border-width: 1px 0;
        -    border-radius: 0; }
        -  .panel > .list-group:first-child .list-group-item:first-child,
        -  .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
        -    border-top: 0;
        -    border-top-right-radius: 3px;
        -    border-top-left-radius: 3px; }
        -  .panel > .list-group:last-child .list-group-item:last-child,
        -  .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
        -    border-bottom: 0;
        -    border-bottom-right-radius: 3px;
        -    border-bottom-left-radius: 3px; }
        -
        -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.panel-heading + .list-group .list-group-item:first-child {
        -  border-top-width: 0; }
        -
        -.list-group + .panel-footer {
        -  border-top-width: 0; }
        -
        -.panel > .table,
        -.panel > .table-responsive > .table,
        -.panel > .panel-collapse > .table {
        -  margin-bottom: 0; }
        -  .panel > .table caption,
        -  .panel > .table-responsive > .table caption,
        -  .panel > .panel-collapse > .table caption {
        -    padding-left: 15px;
        -    padding-right: 15px; }
        -
        -.panel > .table:first-child,
        -.panel > .table-responsive:first-child > .table:first-child {
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px; }
        -  .panel > .table:first-child > thead:first-child > tr:first-child,
        -  .panel > .table:first-child > tbody:first-child > tr:first-child,
        -  .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
        -  .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
        -    border-top-left-radius: 3px;
        -    border-top-right-radius: 3px; }
        -    .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
        -    .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
        -      border-top-left-radius: 3px; }
        -    .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
        -    .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
        -      border-top-right-radius: 3px; }
        -
        -.panel > .table:last-child,
        -.panel > .table-responsive:last-child > .table:last-child {
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px; }
        -  .panel > .table:last-child > tbody:last-child > tr:last-child,
        -  .panel > .table:last-child > tfoot:last-child > tr:last-child,
        -  .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
        -  .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
        -    border-bottom-left-radius: 3px;
        -    border-bottom-right-radius: 3px; }
        -    .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
        -    .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
        -      border-bottom-left-radius: 3px; }
        -    .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
        -    .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
        -      border-bottom-right-radius: 3px; }
        -
        -.panel > .panel-body + .table,
        -.panel > .panel-body + .table-responsive,
        -.panel > .table + .panel-body,
        -.panel > .table-responsive + .panel-body {
        -  border-top: 1px solid #ddd; }
        -
        -.panel > .table > tbody:first-child > tr:first-child th,
        -.panel > .table > tbody:first-child > tr: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-bordered > thead > tr > td:first-child,
        -  .panel > .table-bordered > tbody > tr > th:first-child,
        -  .panel > .table-bordered > tbody > tr > td:first-child,
        -  .panel > .table-bordered > tfoot > tr > th:first-child,
        -  .panel > .table-bordered > tfoot > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr > td:last-child,
        -  .panel > .table-bordered > tbody > tr > th:last-child,
        -  .panel > .table-bordered > tbody > tr > td:last-child,
        -  .panel > .table-bordered > tfoot > tr > th:last-child,
        -  .panel > .table-bordered > tfoot > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
        -    border-right: 0; }
        -  .panel > .table-bordered > thead > tr:first-child > td,
        -  .panel > .table-bordered > thead > tr:first-child > th,
        -  .panel > .table-bordered > tbody > tr:first-child > td,
        -  .panel > .table-bordered > tbody > tr:first-child > th,
        -  .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
        -  .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
        -    border-bottom: 0; }
        -  .panel > .table-bordered > tbody > tr:last-child > td,
        -  .panel > .table-bordered > tbody > tr:last-child > th,
        -  .panel > .table-bordered > tfoot > tr:last-child > td,
        -  .panel > .table-bordered > tfoot > tr:last-child > th,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
        -    border-bottom: 0; }
        -
        -.panel > .table-responsive {
        -  border: 0;
        -  margin-bottom: 0; }
        -
        -.panel-group {
        -  margin-bottom: 20px; }
        -  .panel-group .panel {
        -    margin-bottom: 0;
        -    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,
        -    .panel-group .panel-heading + .panel-collapse > .list-group {
        -      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: #333333;
        -    background-color: #f5f5f5;
        -    border-color: #ddd; }
        -    .panel-default > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #ddd; }
        -    .panel-default > .panel-heading .badge {
        -      color: #f5f5f5;
        -      background-color: #333333; }
        -  .panel-default > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #ddd; }
        -
        -.panel-primary {
        -  border-color: #337ab7; }
        -  .panel-primary > .panel-heading {
        -    color: #fff;
        -    background-color: #337ab7;
        -    border-color: #337ab7; }
        -    .panel-primary > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #337ab7; }
        -    .panel-primary > .panel-heading .badge {
        -      color: #337ab7;
        -      background-color: #fff; }
        -  .panel-primary > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #337ab7; }
        -
        -.panel-success {
        -  border-color: #d6e9c6; }
        -  .panel-success > .panel-heading {
        -    color: #3c763d;
        -    background-color: #dff0d8;
        -    border-color: #d6e9c6; }
        -    .panel-success > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #d6e9c6; }
        -    .panel-success > .panel-heading .badge {
        -      color: #dff0d8;
        -      background-color: #3c763d; }
        -  .panel-success > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #d6e9c6; }
        -
        -.panel-info {
        -  border-color: #bce8f1; }
        -  .panel-info > .panel-heading {
        -    color: #31708f;
        -    background-color: #d9edf7;
        -    border-color: #bce8f1; }
        -    .panel-info > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #bce8f1; }
        -    .panel-info > .panel-heading .badge {
        -      color: #d9edf7;
        -      background-color: #31708f; }
        -  .panel-info > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #bce8f1; }
        -
        -.panel-warning {
        -  border-color: #faebcc; }
        -  .panel-warning > .panel-heading {
        -    color: #8a6d3b;
        -    background-color: #fcf8e3;
        -    border-color: #faebcc; }
        -    .panel-warning > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #faebcc; }
        -    .panel-warning > .panel-heading .badge {
        -      color: #fcf8e3;
        -      background-color: #8a6d3b; }
        -  .panel-warning > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #faebcc; }
        -
        -.panel-danger {
        -  border-color: #ebccd1; }
        -  .panel-danger > .panel-heading {
        -    color: #a94442;
        -    background-color: #f2dede;
        -    border-color: #ebccd1; }
        -    .panel-danger > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #ebccd1; }
        -    .panel-danger > .panel-heading .badge {
        -      color: #f2dede;
        -      background-color: #a94442; }
        -  .panel-danger > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #ebccd1; }
        -
        -.embed-responsive {
        -  position: relative;
        -  display: block;
        -  height: 0;
        -  padding: 0;
        -  overflow: hidden; }
        -  .embed-responsive .embed-responsive-item,
        -  .embed-responsive iframe,
        -  .embed-responsive embed,
        -  .embed-responsive object,
        -  .embed-responsive video {
        -    position: absolute;
        -    top: 0;
        -    left: 0;
        -    bottom: 0;
        -    height: 100%;
        -    width: 100%;
        -    border: 0; }
        -
        -.embed-responsive-16by9 {
        -  padding-bottom: 56.25%; }
        -
        -.embed-responsive-4by3 {
        -  padding-bottom: 75%; }
        -
        -.well {
        -  min-height: 20px;
        -  padding: 19px;
        -  margin-bottom: 20px;
        -  background-color: #f5f5f5;
        -  border: 1px solid #e3e3e3;
        -  border-radius: 4px;
        -  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: 0.2;
        -  filter: alpha(opacity=20); }
        -  .close:hover, .close:focus {
        -    color: #000;
        -    text-decoration: none;
        -    cursor: pointer;
        -    opacity: 0.5;
        -    filter: alpha(opacity=50); }
        -
        -button.close {
        -  padding: 0;
        -  cursor: pointer;
        -  background: transparent;
        -  border: 0;
        -  -webkit-appearance: none; }
        -
        -.modal-open {
        -  overflow: hidden; }
        -
        -.modal {
        -  display: none;
        -  overflow: hidden;
        -  position: fixed;
        -  top: 0;
        -  right: 0;
        -  bottom: 0;
        -  left: 0;
        -  z-index: 1050;
        -  -webkit-overflow-scrolling: touch;
        -  outline: 0; }
        -  .modal.fade .modal-dialog {
        -    -webkit-transform: translate(0, -25%);
        -    transform: translate(0, -25%);
        -    transition: -webkit-transform 0.3s ease-out;
        -    transition: transform 0.3s ease-out; }
        -  .modal.in .modal-dialog {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0); }
        -
        -.modal-open .modal {
        -  overflow-x: hidden;
        -  overflow-y: auto; }
        -
        -.modal-dialog {
        -  position: relative;
        -  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;
        -  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
        -  background-clip: padding-box;
        -  outline: 0; }
        -
        -.modal-backdrop {
        -  position: fixed;
        -  top: 0;
        -  right: 0;
        -  bottom: 0;
        -  left: 0;
        -  z-index: 1040;
        -  background-color: #000; }
        -  .modal-backdrop.fade {
        -    opacity: 0;
        -    filter: alpha(opacity=0); }
        -  .modal-backdrop.in {
        -    opacity: 0.5;
        -    filter: alpha(opacity=50); }
        -
        -.modal-header {
        -  padding: 15px;
        -  border-bottom: 1px solid #e5e5e5; }
        -  .modal-header:before, .modal-header:after {
        -    content: " ";
        -    display: table; }
        -  .modal-header:after {
        -    clear: both; }
        -
        -.modal-header .close {
        -  margin-top: -2px; }
        -
        -.modal-title {
        -  margin: 0;
        -  line-height: 1.428571429; }
        -
        -.modal-body {
        -  position: relative;
        -  padding: 15px; }
        -
        -.modal-footer {
        -  padding: 15px;
        -  text-align: right;
        -  border-top: 1px solid #e5e5e5; }
        -  .modal-footer:before, .modal-footer:after {
        -    content: " ";
        -    display: table; }
        -  .modal-footer:after {
        -    clear: both; }
        -  .modal-footer .btn + .btn {
        -    margin-left: 5px;
        -    margin-bottom: 0; }
        -  .modal-footer .btn-group .btn + .btn {
        -    margin-left: -1px; }
        -  .modal-footer .btn-block + .btn-block {
        -    margin-left: 0; }
        -
        -.modal-scrollbar-measure {
        -  position: absolute;
        -  top: -9999px;
        -  width: 50px;
        -  height: 50px;
        -  overflow: scroll; }
        -
        -@media (min-width: 768px) {
        -  .modal-dialog {
        -    width: 600px;
        -    margin: 30px auto; }
        -  .modal-content {
        -    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }
        -  .modal-sm {
        -    width: 300px; } }
        -
        -@media (min-width: 992px) {
        -  .modal-lg {
        -    width: 900px; } }
        -
        -.tooltip {
        -  position: absolute;
        -  z-index: 1070;
        -  display: block;
        -  font-family: "Lato", sans-serif;
        -  font-style: normal;
        -  font-weight: normal;
        -  letter-spacing: normal;
        -  line-break: auto;
        -  line-height: 1.428571429;
        -  text-align: left;
        -  text-align: start;
        -  text-decoration: none;
        -  text-shadow: none;
        -  text-transform: none;
        -  white-space: normal;
        -  word-break: normal;
        -  word-spacing: normal;
        -  word-wrap: normal;
        -  font-size: 12px;
        -  opacity: 0;
        -  filter: alpha(opacity=0); }
        -  .tooltip.in {
        -    opacity: 0.9;
        -    filter: alpha(opacity=90); }
        -  .tooltip.top {
        -    margin-top: -3px;
        -    padding: 5px 0; }
        -  .tooltip.right {
        -    margin-left: 3px;
        -    padding: 0 5px; }
        -  .tooltip.bottom {
        -    margin-top: 3px;
        -    padding: 5px 0; }
        -  .tooltip.left {
        -    margin-left: -3px;
        -    padding: 0 5px; }
        -
        -.tooltip-inner {
        -  max-width: 200px;
        -  padding: 3px 8px;
        -  color: #fff;
        -  text-align: center;
        -  background-color: #000;
        -  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-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.top-left .tooltip-arrow {
        -  bottom: 0;
        -  right: 5px;
        -  margin-bottom: -5px;
        -  border-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.top-right .tooltip-arrow {
        -  bottom: 0;
        -  left: 5px;
        -  margin-bottom: -5px;
        -  border-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.right .tooltip-arrow {
        -  top: 50%;
        -  left: 0;
        -  margin-top: -5px;
        -  border-width: 5px 5px 5px 0;
        -  border-right-color: #000; }
        -
        -.tooltip.left .tooltip-arrow {
        -  top: 50%;
        -  right: 0;
        -  margin-top: -5px;
        -  border-width: 5px 0 5px 5px;
        -  border-left-color: #000; }
        -
        -.tooltip.bottom .tooltip-arrow {
        -  top: 0;
        -  left: 50%;
        -  margin-left: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.tooltip.bottom-left .tooltip-arrow {
        -  top: 0;
        -  right: 5px;
        -  margin-top: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.tooltip.bottom-right .tooltip-arrow {
        -  top: 0;
        -  left: 5px;
        -  margin-top: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.popover {
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  z-index: 1060;
        -  display: none;
        -  max-width: 276px;
        -  padding: 1px;
        -  font-family: "Lato", sans-serif;
        -  font-style: normal;
        -  font-weight: normal;
        -  letter-spacing: normal;
        -  line-break: auto;
        -  line-height: 1.428571429;
        -  text-align: left;
        -  text-align: start;
        -  text-decoration: none;
        -  text-shadow: none;
        -  text-transform: none;
        -  white-space: normal;
        -  word-break: normal;
        -  word-spacing: normal;
        -  word-wrap: normal;
        -  font-size: 14px;
        -  background-color: #fff;
        -  background-clip: padding-box;
        -  border: 1px solid #ccc;
        -  border: 1px solid rgba(0, 0, 0, 0.2);
        -  border-radius: 6px;
        -  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }
        -  .popover.top {
        -    margin-top: -10px; }
        -  .popover.right {
        -    margin-left: 10px; }
        -  .popover.bottom {
        -    margin-top: 10px; }
        -  .popover.left {
        -    margin-left: -10px; }
        -
        -.popover-title {
        -  margin: 0;
        -  padding: 8px 14px;
        -  font-size: 14px;
        -  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 {
        -  left: 50%;
        -  margin-left: -11px;
        -  border-bottom-width: 0;
        -  border-top-color: #999999;
        -  border-top-color: rgba(0, 0, 0, 0.25);
        -  bottom: -11px; }
        -  .popover.top > .arrow:after {
        -    content: " ";
        -    bottom: 1px;
        -    margin-left: -10px;
        -    border-bottom-width: 0;
        -    border-top-color: #fff; }
        -
        -.popover.right > .arrow {
        -  top: 50%;
        -  left: -11px;
        -  margin-top: -11px;
        -  border-left-width: 0;
        -  border-right-color: #999999;
        -  border-right-color: rgba(0, 0, 0, 0.25); }
        -  .popover.right > .arrow:after {
        -    content: " ";
        -    left: 1px;
        -    bottom: -10px;
        -    border-left-width: 0;
        -    border-right-color: #fff; }
        -
        -.popover.bottom > .arrow {
        -  left: 50%;
        -  margin-left: -11px;
        -  border-top-width: 0;
        -  border-bottom-color: #999999;
        -  border-bottom-color: rgba(0, 0, 0, 0.25);
        -  top: -11px; }
        -  .popover.bottom > .arrow:after {
        -    content: " ";
        -    top: 1px;
        -    margin-left: -10px;
        -    border-top-width: 0;
        -    border-bottom-color: #fff; }
        -
        -.popover.left > .arrow {
        -  top: 50%;
        -  right: -11px;
        -  margin-top: -11px;
        -  border-right-width: 0;
        -  border-left-color: #999999;
        -  border-left-color: rgba(0, 0, 0, 0.25); }
        -  .popover.left > .arrow:after {
        -    content: " ";
        -    right: 1px;
        -    border-right-width: 0;
        -    border-left-color: #fff;
        -    bottom: -10px; }
        -
        -.carousel {
        -  position: relative; }
        -
        -.carousel-inner {
        -  position: relative;
        -  overflow: hidden;
        -  width: 100%; }
        -  .carousel-inner > .item {
        -    display: none;
        -    position: relative;
        -    transition: 0.6s ease-in-out left; }
        -    .carousel-inner > .item > img,
        -    .carousel-inner > .item > a > img {
        -      display: block;
        -      max-width: 100%;
        -      height: auto;
        -      line-height: 1; }
        -    @media all and (transform-3d), (-webkit-transform-3d) {
        -      .carousel-inner > .item {
        -        transition: -webkit-transform 0.6s ease-in-out;
        -        transition: transform 0.6s ease-in-out;
        -        -webkit-backface-visibility: hidden;
        -        backface-visibility: hidden;
        -        -webkit-perspective: 1000px;
        -        perspective: 1000px; }
        -        .carousel-inner > .item.next, .carousel-inner > .item.active.right {
        -          -webkit-transform: translate3d(100%, 0, 0);
        -          transform: translate3d(100%, 0, 0);
        -          left: 0; }
        -        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {
        -          -webkit-transform: translate3d(-100%, 0, 0);
        -          transform: translate3d(-100%, 0, 0);
        -          left: 0; }
        -        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {
        -          -webkit-transform: translate3d(0, 0, 0);
        -          transform: translate3d(0, 0, 0);
        -          left: 0; } }
        -  .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;
        -  left: 0;
        -  bottom: 0;
        -  width: 15%;
        -  opacity: 0.5;
        -  filter: alpha(opacity=50);
        -  font-size: 20px;
        -  color: #fff;
        -  text-align: center;
        -  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
        -  background-color: transparent; }
        -  .carousel-control.left {
        -    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 {
        -    left: auto;
        -    right: 0;
        -    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 {
        -    outline: 0;
        -    color: #fff;
        -    text-decoration: none;
        -    opacity: 0.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%;
        -    margin-top: -10px;
        -    z-index: 5;
        -    display: inline-block; }
        -  .carousel-control .icon-prev,
        -  .carousel-control .glyphicon-chevron-left {
        -    left: 50%;
        -    margin-left: -10px; }
        -  .carousel-control .icon-next,
        -  .carousel-control .glyphicon-chevron-right {
        -    right: 50%;
        -    margin-right: -10px; }
        -  .carousel-control .icon-prev,
        -  .carousel-control .icon-next {
        -    width: 20px;
        -    height: 20px;
        -    line-height: 1;
        -    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%;
        -  margin-left: -30%;
        -  padding-left: 0;
        -  list-style: none;
        -  text-align: center; }
        -  .carousel-indicators li {
        -    display: inline-block;
        -    width: 10px;
        -    height: 10px;
        -    margin: 1px;
        -    text-indent: -999px;
        -    border: 1px solid #fff;
        -    border-radius: 10px;
        -    cursor: pointer;
        -    background-color: #000 \9;
        -    background-color: transparent; }
        -  .carousel-indicators .active {
        -    margin: 0;
        -    width: 12px;
        -    height: 12px;
        -    background-color: #fff; }
        -
        -.carousel-caption {
        -  position: absolute;
        -  left: 15%;
        -  right: 15%;
        -  bottom: 20px;
        -  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 .glyphicon-chevron-left,
        -  .carousel-control .glyphicon-chevron-right,
        -  .carousel-control .icon-prev,
        -  .carousel-control .icon-next {
        -    width: 30px;
        -    height: 30px;
        -    margin-top: -10px;
        -    font-size: 30px; }
        -  .carousel-control .glyphicon-chevron-left,
        -  .carousel-control .icon-prev {
        -    margin-left: -10px; }
        -  .carousel-control .glyphicon-chevron-right,
        -  .carousel-control .icon-next {
        -    margin-right: -10px; }
        -  .carousel-caption {
        -    left: 20%;
        -    right: 20%;
        -    padding-bottom: 30px; }
        -  .carousel-indicators {
        -    bottom: 20px; } }
        -
        -.clearfix:before, .clearfix:after {
        -  content: " ";
        -  display: table; }
        -
        -.clearfix:after {
        -  clear: both; }
        -
        -.center-block {
        -  display: block;
        -  margin-left: auto;
        -  margin-right: 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; }
        -
        -.affix {
        -  position: fixed; }
        -
        -@-ms-viewport {
        -  width: device-width; }
        -
        -.visible-xs {
        -  display: none !important; }
        -
        -.visible-sm {
        -  display: none !important; }
        -
        -.visible-md {
        -  display: none !important; }
        -
        -.visible-lg {
        -  display: none !important; }
        -
        -.visible-xs-block,
        -.visible-xs-inline,
        -.visible-xs-inline-block,
        -.visible-sm-block,
        -.visible-sm-inline,
        -.visible-sm-inline-block,
        -.visible-md-block,
        -.visible-md-inline,
        -.visible-md-inline-block,
        -.visible-lg-block,
        -.visible-lg-inline,
        -.visible-lg-inline-block {
        -  display: none !important; }
        -
        -@media (max-width: 767px) {
        -  .visible-xs {
        -    display: block !important; }
        -  table.visible-xs {
        -    display: table !important; }
        -  tr.visible-xs {
        -    display: table-row !important; }
        -  th.visible-xs,
        -  td.visible-xs {
        -    display: table-cell !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-block {
        -    display: block !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-inline {
        -    display: inline !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm {
        -    display: block !important; }
        -  table.visible-sm {
        -    display: table !important; }
        -  tr.visible-sm {
        -    display: table-row !important; }
        -  th.visible-sm,
        -  td.visible-sm {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-block {
        -    display: block !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md {
        -    display: block !important; }
        -  table.visible-md {
        -    display: table !important; }
        -  tr.visible-md {
        -    display: table-row !important; }
        -  th.visible-md,
        -  td.visible-md {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-block {
        -    display: block !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg {
        -    display: block !important; }
        -  table.visible-lg {
        -    display: table !important; }
        -  tr.visible-lg {
        -    display: table-row !important; }
        -  th.visible-lg,
        -  td.visible-lg {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-block {
        -    display: block !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (max-width: 767px) {
        -  .hidden-xs {
        -    display: none !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .hidden-sm {
        -    display: none !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .hidden-md {
        -    display: none !important; } }
        -
        -@media (min-width: 1200px) {
        -  .hidden-lg {
        -    display: none !important; } }
        -
        -.visible-print {
        -  display: none !important; }
        -
        -@media print {
        -  .visible-print {
        -    display: block !important; }
        -  table.visible-print {
        -    display: table !important; }
        -  tr.visible-print {
        -    display: table-row !important; }
        -  th.visible-print,
        -  td.visible-print {
        -    display: table-cell !important; } }
        -
        -.visible-print-block {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-block {
        -      display: block !important; } }
        -
        -.visible-print-inline {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-inline {
        -      display: inline !important; } }
        -
        -.visible-print-inline-block {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-inline-block {
        -      display: inline-block !important; } }
        -
        -@media print {
        -  .hidden-print {
        -    display: none !important; } }
        -
        -/*!
        - * Start Bootstrap - SB Admin Bootstrap Admin Template (http://startbootstrap.com)
        - * Code licensed under the Apache License v2.0.
        - * For details, see http://www.apache.org/licenses/LICENSE-2.0.
        - */
        -/* Global Styles */
        -body {
        -  margin-top: 100px;
        -  background-color: #222; }
        -
        -@media (min-width: 768px) {
        -  body {
        -    margin-top: 50px; } }
        -
        -#wrapper {
        -  padding-left: 0; }
        -
        -#page-wrapper {
        -  width: 100%;
        -  padding: 0;
        -  background-color: #fff; }
        -
        -.huge {
        -  font-size: 50px;
        -  line-height: normal; }
        -
        -@media (min-width: 768px) {
        -  #wrapper {
        -    padding-left: 225px; }
        -  #page-wrapper {
        -    padding: 10px; } }
        -
        -/* Top Navigation */
        -.top-nav {
        -  padding: 0 15px; }
        -  .top-nav > li {
        -    display: inline-block;
        -    float: left; }
        -    .top-nav > li > a {
        -      padding-top: 15px;
        -      padding-bottom: 15px;
        -      line-height: 20px;
        -      color: #999; }
        -      .top-nav > li > a:hover, .top-nav > li > a:focus {
        -        color: #fff;
        -        background-color: #000; }
        -  .top-nav > .open > a {
        -    color: #fff;
        -    background-color: #000; }
        -    .top-nav > .open > a:hover, .top-nav > .open > a:focus {
        -      color: #fff;
        -      background-color: #000; }
        -  .top-nav > .open > .dropdown-menu {
        -    float: left;
        -    position: absolute;
        -    margin-top: 0;
        -    border: 1px solid rgba(0, 0, 0, 0.15);
        -    border-top-left-radius: 0;
        -    border-top-right-radius: 0;
        -    background-color: #fff;
        -    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); }
        -    .top-nav > .open > .dropdown-menu > li > a {
        -      white-space: normal; }
        -
        -ul.message-dropdown {
        -  padding: 0;
        -  max-height: 250px;
        -  overflow-x: hidden;
        -  overflow-y: auto; }
        -
        -li.message-preview {
        -  width: 275px;
        -  border-bottom: 1px solid rgba(0, 0, 0, 0.15); }
        -  li.message-preview > a {
        -    padding-top: 15px;
        -    padding-bottom: 15px; }
        -
        -li.message-footer {
        -  margin: 5px 0; }
        -
        -ul.alert-dropdown {
        -  width: 200px; }
        -
        -/* Side Navigation */
        -@media (min-width: 768px) {
        -  .side-nav {
        -    position: fixed;
        -    top: 51px;
        -    left: 225px;
        -    width: 225px;
        -    margin-left: -225px;
        -    border: none;
        -    border-radius: 0;
        -    overflow-y: auto;
        -    background-color: #222;
        -    bottom: 0;
        -    overflow-x: hidden;
        -    padding-bottom: 40px; }
        -    .side-nav > li > a {
        -      width: 225px; }
        -    .side-nav li a:hover, .side-nav li a:focus {
        -      outline: none;
        -      background-color: #000 !important; } }
        -
        -.side-nav > li > ul {
        -  padding: 0; }
        -  .side-nav > li > ul > li > a {
        -    display: block;
        -    padding: 10px 15px 10px 38px;
        -    text-decoration: none;
        -    color: #999; }
        -    .side-nav > li > ul > li > a:hover {
        -      color: #fff; }
        -
        -/* Flot Chart Containers */
        -.flot-chart {
        -  display: block;
        -  height: 400px; }
        -
        -.flot-chart-content {
        -  width: 100%;
        -  height: 100%; }
        -
        -/* Custom Colored Panels */
        -.huge {
        -  font-size: 40px; }
        -
        -.panel-green {
        -  border-color: #5cb85c; }
        -  .panel-green > .panel-heading {
        -    border-color: #5cb85c;
        -    color: #fff;
        -    background-color: #5cb85c; }
        -  .panel-green > a {
        -    color: #5cb85c; }
        -    .panel-green > a:hover {
        -      color: #3d8b3d; }
        -
        -.panel-red {
        -  border-color: #d9534f; }
        -  .panel-red > .panel-heading {
        -    border-color: #d9534f;
        -    color: #fff;
        -    background-color: #d9534f; }
        -  .panel-red > a {
        -    color: #d9534f; }
        -    .panel-red > a:hover {
        -      color: #b52b27; }
        -
        -.panel-yellow {
        -  border-color: #f0ad4e; }
        -  .panel-yellow > .panel-heading {
        -    border-color: #f0ad4e;
        -    color: #fff;
        -    background-color: #f0ad4e; }
        -  .panel-yellow > a {
        -    color: #f0ad4e; }
        -    .panel-yellow > a:hover {
        -      color: #df8a13; }
        -
        -.navbar {
        -  border-radius: 0px; }
        -
        -/*# sourceMappingURL=app.css.map */
        diff --git a/public/assets/compiled/css/app.css.map b/public/assets/compiled/css/app.css.map
        deleted file mode 100644
        index a9d381e6c7..0000000000
        --- a/public/assets/compiled/css/app.css.map
        +++ /dev/null
        @@ -1 +0,0 @@
        -{"version":3,"sources":["app.css","app.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/_bootstrap.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_normalize.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_print.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_glyphicons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_tab-focus.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_image.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_type.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_background-variant.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_clearfix.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-overflow.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid-framework.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_table-row.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_opacity.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-divider.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-filter.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_border-radius.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_input-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navbar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pager.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_jumbotron.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_thumbnails.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_progress-bars.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_gradients.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_progress-bar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_media.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-embed.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_wells.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_modals.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tooltip.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_center-block.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_hide-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss","bootstrap-overrides.scss"],"names":[],"mappings":"AAAA,iBAAiB;ACAjB,0DAAY;ACAZ;;;;GAIG;ACJH,4EAA4E;AAQ5E;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,+BAA+B,EAChC;;AAMD;EACE,UAAU,EACX;;AAYD;;;;;;;;;;;;;EAaE,eAAe,EAChB;;AAOD;;;;EAIE,sBAAsB;EACtB,yBAAyB,EAC1B;;AAOD;EACE,cAAc;EACd,UAAU,EACX;;AH3BD;;EGoCE,cAAc,EACf;;AASD;EACE,8BAA8B,EAC/B;;AAOD;;EAEE,WAAW,EACZ;;AASD;EACE,0BAA0B,EAC3B;;AAMD;;EAEE,kBAAkB,EACnB;;AAMD;EACE,mBAAmB,EACpB;;AAOD;EACE,eAAe;EACf,iBAAiB,EAClB;;AAMD;EACE,iBAAiB;EACjB,YAAY,EACb;;AAMD;EACE,eAAe,EAChB;;AAMD;;EAEE,eAAe;EACf,eAAe;EACf,mBAAmB;EACnB,yBAAyB,EAC1B;;AAED;EACE,YAAY,EACb;;AAED;EACE,gBAAgB,EACjB;;AASD;EACE,UAAU,EACX;;AAMD;EACE,iBAAiB,EAClB;;AASD;EACE,iBAAiB,EAClB;;AAMD;EACE,wBAAwB;EACxB,UAAU,EACX;;AAMD;EACE,eAAe,EAChB;;AAMD;;;;EAIE,kCAAkC;EAClC,eAAe,EAChB;;AAiBD;;;;;EAKE,eAAe;EACf,cAAc;EACd,UAAU,EACX;;AAMD;EACE,kBAAkB,EACnB;;AASD;;EAEE,qBAAqB,EACtB;;AAUD;;;;EAIE,2BAA2B;EAC3B,gBAAgB,EACjB;;AAMD;;EAEE,gBAAgB,EACjB;;AAMD;;EAEE,UAAU;EACV,WAAW,EACZ;;AAOD;EACE,oBAAoB,EACrB;;AAUD;;EAEE,uBAAuB;EACvB,WAAW,EACZ;;AAQD;;EAEE,aAAa,EACd;;AAOD;EACE,8BAA8B;EAC9B,wBAAwB,EACzB;;AAQD;;EAEE,yBAAyB,EAC1B;;AAMD;EACE,0BAA0B;EAC1B,cAAc;EACd,+BAA+B,EAChC;;AAOD;EACE,UAAU;EACV,WAAW,EACZ;;AAMD;EACE,eAAe,EAChB;;AAOD;EACE,kBAAkB,EACnB;;AASD;EACE,0BAA0B;EAC1B,kBAAkB,EACnB;;AAED;;EAEE,WAAW,EACZ;;ACvaD,qFAAqF;AAOrF;EACI;;;IAGI,mCAAmC;IACnC,uBAAuB;IACvB,4BAA4B;IAC5B,6BAA6B,EAChC;EAED;;IAEI,2BAA2B,EAC9B;EAED;IACI,6BAA4B,EAC/B;EAED;IACI,8BAA6B,EAChC;EAID;;IAEI,YAAY,EACf;EAED;;IAEI,uBAAuB;IACvB,yBAAyB,EAC5B;EAED;IACI,4BAA4B,EAC/B;EAED;;IAEI,yBAAyB,EAC5B;EAED;IACI,2BAA2B,EAC9B;EAED;;;IAGI,WAAW;IACX,UAAU,EACb;EAED;;IAEI,wBAAwB,EAC3B;EAKD;IACI,cAAc,EACjB;EACD;;IAGQ,kCAAkC,EACrC;EAEL;IACI,uBAAuB,EAC1B;EAED;IACI,qCAAqC,EAMxC;IAPD;;MAKQ,kCAAkC,EACrC;EAEL;;IAGQ,kCAAkC,EACrC,EAAA;;ACrFP;EACE,oCAAoC;EACpC,gEAAQ;EACR,kbAImM,EAAA;;AAKvM;EACE,mBAAmB;EACnB,SAAS;EACT,sBAAsB;EACtB,oCAAoC;EACpC,mBAAmB;EACnB,oBAAoB;EACpB,eAAe;EACf,oCAAoC;EACpC,mCAAmC,EACpC;;AAGD;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;;EAC+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AASpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;ACxSpE;ECkEU,uBDjEsB,EAC/B;;AACD;;EC+DU,uBD7DsB,EAC/B;;AAKD;EACE,gBAAgB;EAChB,yCAAiC,EAClC;;AAED;EACE,gCL1ByC;EK2BzC,gBEuB4B;EFtB5B,yBEkCmC;EFjCnC,eElB8B;EFmB9B,uBEF0B,EFG3B;;AAGD;;;;EAIE,qBAAqB;EACrB,mBAAmB;EACnB,qBAAqB,EACtB;;AAKD;EACE,eE/B4B;EFgC5B,sBAAsB,EAWvB;EAbD;IAMI,eEjB0B;IFkB1B,2BEhB6B,EFiB9B;EARH;IG3CE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EHoDpB;;AASH;EACE,UAAU,EACX;;AAKD;EACE,uBAAuB,EACxB;;AAGD;EIvEE,eADmC;EAEnC,gBAAgB;EAChB,aAAa,EJuEd;;AAGD;EACE,mBEwB6B,EFvB9B;;AAKD;EACE,aEgpB+B;EF/oB/B,yBE/BmC;EFgCnC,uBElE0B;EFmE1B,uBEipBgC;EFhpBhC,mBEY6B;ED8ErB,iCDzF+B;EIzFvC,sBJ4FoC;EI3FpC,gBAAgB;EAChB,aAAa,EJ2Fd;;AAGD;EACE,mBAAmB,EACpB;;AAKD;EACE,iBEhD6B;EFiD7B,oBEjD6B;EFkD7B,UAAU;EACV,8BErG8B,EFsG/B;;AAOD;EACE,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;EACb,WAAW;EACX,iBAAiB;EACjB,uBAAU;EACV,UAAU,EACX;;AAMD;EAGI,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,UAAU;EACV,kBAAkB;EAClB,WAAW,EACZ;;AN69BH;EMl9BE,gBAAgB,EACjB;;AKxJD;;EAEE,qBH0D+B;EGzD/B,iBH0D2B;EGzD3B,iBH0D2B;EGzD3B,eH0D+B,EGlDhC;EAbD;;;;;;;;;;;;;;IASI,oBAAoB;IACpB,eAAe;IACf,eHL4B,EGM7B;;AAGH;;;EAGE,iBHuC6B;EGtC7B,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAEH;;;EAGE,iBAAkC;EAClC,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAGH;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHCoB,EGDQ;;AACtC;EAAU,gBHSoB,EGTQ;;AAMtC;EACE,iBAAkC,EACnC;;AAED;EACE,oBHG6B;EGF7B,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB,EAKlB;EAHC;IANF;MAOI,gBAA2B,EAE9B,EAAA;;AAOD;;EAEE,eAAgB,EACjB;;AAED;;EAEE,0BH4asC;EG3atC,cAAc,EACf;;AAGD;EAAuB,iBAAiB,EAAI;;AAC5C;EAAuB,kBAAkB,EAAI;;AAC7C;EAAuB,mBAAmB,EAAI;;AAC9C;EAAuB,oBAAoB,EAAI;;AAC/C;EAAuB,oBAAoB,EAAI;;AAG/C;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,2BAA2B,EAAI;;AAGtD;EACE,eHxF8B,EGyF/B;;ACnGC;EACE,eJY0B,EIX3B;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJkfoC,EIjfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJsfoC,EIrfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ0foC,EIzfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ8foC,EI7frC;;AACD;;EACE,eAAa,EACd;;AD6GH;EAGE,YAAY,EACb;;AEtHC;EACE,0BLY0B,EKX3B;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLmfoC,EKlfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLufoC,EKtfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL2foC,EK1frC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL+foC,EK9frC;;AACD;;EACE,0BAAwB,EACzB;;AFgIH;EACE,oBAAuC;EACvC,oBH1E6B;EG2E7B,iCH7H8B,EG8H/B;;AAOD;;EAEE,cAAc;EACd,oBAAqC,EAKtC;EARD;;;;IAMI,iBAAiB,EAClB;;AAWH;EAJE,gBAAgB;EAChB,iBAAiB,EAKlB;;AAID;EAVE,gBAAgB;EAChB,iBAAiB;EAWjB,kBAAkB,EAOnB;EATD;IAKI,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB,EACpB;;AAIH;EACE,cAAc;EACd,oBHzH6B,EG0H9B;;AACD;;EAEE,yBH/HmC,EGgIpC;;AACD;EACE,kBAAkB,EACnB;;AACD;EACE,eAAe,EAChB;;AAOD;EG7LI,aAAa;EACb,eAAe,EAChB;;AH2LH;EGzLI,YAAY,EACb;;AH6LD;EALF;IAOM,YAAY;IACZ,aAA6B;IAC7B,YAAY;IACZ,kBAAkB;IIlNtB,iBAAiB;IACjB,wBAAwB;IACxB,oBAAoB,EJkNjB;EAZL;IAcM,mBH2nB6B,EG1nB9B,EAAA;;AASL;;EAGE,aAAa;EACb,kCH1N8B,EG2N/B;;AACD;EACE,eAAe,EAEhB;;AAGD;EACE,mBHhL6B;EGiL7B,iBHjL6B;EGkL7B,kBH4mB4C;EG3mB5C,+BHrO8B,EG6P/B;EA5BD;;;IAUM,iBAAiB,EAClB;EAXL;;;IAmBI,eAAe;IACf,eAAe;IACf,yBHtMiC;IGuMjC,eHxP4B,EG6P7B;IA3BH;;;MAyBM,uBAAuB,EACxB;;AAOL;;EAEE,oBAAoB;EACpB,gBAAgB;EAChB,gCHtQ8B;EGuQ9B,eAAe;EACf,kBAAkB,EAWnB;EAjBD;;;;;;IAYe,YAAY,EAAI;EAZ/B;;;;;;IAcM,uBAAuB,EACxB;;AAKL;EACE,oBHrO6B;EGsO7B,mBAAmB;EACnB,yBHzOmC,EG0OpC;;AKnSD;;;;EAIE,+DRsCyE,EQrC1E;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,eRmzBmC;EQlzBnC,0BRmzBmC;EQlzBnC,mBR0F6B,EQzF9B;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,YR6yBgC;EQ5yBhC,uBR6yBgC;EQ5yBhC,mBRmF6B;EQlF7B,+CAA+B,EAQhC;EAdD;IASI,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB,EAClB;;AAIH;EACE,eAAe;EACf,eAAgC;EAChC,iBAAkC;EAClC,gBAA2B;EAC3B,yBRkBmC;EQjBnC,sBAAsB;EACtB,sBAAsB;EACtB,eRpC8B;EQqC9B,0BRyxBmC;EQxxBnC,uBR0xBgC;EQzxBhC,mBR0D6B,EQ/C9B;EAtBD;IAeI,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,sBAAsB;IACtB,8BAA8B;IAC9B,iBAAiB,EAClB;;AAIH;EACE,kBR2wBiC;EQ1wBjC,mBAAmB,EACpB;;AC3DD;ECHE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDYpB;EAZD;IHMI,aAAa;IACb,eAAe,EAChB;EGRH;IHUI,YAAY,EACb;EGRD;IAHF;MAII,aT2UiC,ESnUpC,EAAA;EANC;IANF;MAOI,aT6UiC,ESxUpC,EAAA;EAHC;IATF;MAUI,cT+UkC,ES7UrC,EAAA;;AAQD;ECvBE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDsBpB;EAFD;IHdI,aAAa;IACb,eAAe,EAChB;EGYH;IHVI,YAAY,EACb;;AGkBH;ECvBE,mBAAkB;EAClB,oBAAmB,EDwBpB;EAFD;IHvBI,aAAa;IACb,eAAe,EAChB;EGqBH;IHnBI,YAAY,EACb;;AKVD;EACE,mBAAmB;EAEnB,gBAAgB;EAEhB,mBAAmB;EACnB,oBAAoB,EACrB;;AASD;EACE,YAAY,EACb;;AAMC;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAkBD;EACE,YAAY,EACb;;AAPD;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAPD;EACE,WAAW,EACZ;;AAPD;EACE,oBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,WAAgB,EACjB;;AAkBD;EACE,gBAAuB,EACxB;;AAFD;EACE,2BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,kBAAuB,EACxB;;AFEL;EErCE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFWL;EE9CE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFoBL;EEvDE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;ACxDL;EACE,8BZgIyC,EY/H1C;;AACD;EACE,iBZwHiC;EYvHjC,oBZuHiC;EYtHjC,eZG8B;EYF9B,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AAKD;EACE,YAAY;EACZ,gBAAgB;EAChB,oBZyC6B,EYD9B;EA3CD;;;;;;IAWQ,aZiG2B;IYhG3B,yBZ8B6B;IY7B7B,oBAAoB;IACpB,2BZ2G4B,EY1G7B;EAfP;IAoBI,uBAAuB;IACvB,8BZoGgC,EYnGjC;EAtBH;;;;;;IA8BQ,cAAc,EACf;EA/BP;IAoCI,2BZqFgC,EYpFjC;EArCH;IAyCI,uBZjCwB,EYkCzB;;AAMH;;;;;;EAOQ,aZuD2B,EYtD5B;;AAUP;EACE,uBZsDkC,EYrCnC;EAlBD;;;;;;IAQQ,uBZ+C4B,EY9C7B;EATP;;IAeM,yBAAyB,EAC1B;;AASL;EAEI,0BZsBmC,EYrBpC;;AAQH;EAEI,0BZamC,EYZpC;;AAQH;EACE,iBAAiB;EACjB,YAAY;EACZ,sBAAsB,EACvB;;AACD;;EAIM,iBAAiB;EACjB,YAAY;EACZ,oBAAoB,EACrB;;AC7IH;;;;;;;;;;;;EAII,0BbiIiC,EahIlC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb+ekC,Ea9enC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbmfkC,EalfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbufkC,EatfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb2fkC,Ea1fnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;ADwJL;EACE,iBAAiB;EACjB,kBAAkB,EA6DnB;EA3DC;IAJF;MAKI,YAAY;MACZ,oBAAqC;MACrC,mBAAmB;MACnB,6CAA6C;MAC7C,uBZrCgC,EY2FnC;MA/DD;QAaM,iBAAiB,EAalB;QA1BL;;;;;;UAsBY,oBAAoB,EACrB;MAvBX;QA8BM,UAAU,EA+BX;QA7DL;;;;;;UAuCY,eAAe,EAChB;QAxCX;;;;;;UA2CY,gBAAgB,EACjB;QA5CX;;;;UAwDY,iBAAiB,EAClB,EAAA;;AE1NX;EACE,WAAW;EACX,UAAU;EACV,UAAU;EAIV,aAAa,EACd;;AAED;EACE,eAAe;EACf,YAAY;EACZ,WAAW;EACX,oBd0C6B;EczC7B,gBAA2B;EAC3B,qBAAqB;EACrB,edd8B;Ece9B,UAAU;EACV,iCdmMsC,EclMvC;;AAED;EACE,sBAAsB;EACtB,gBAAgB;EAChB,mBAAmB;EACnB,kBAAkB,EACnB;;AAUD;Ef8BU,uBe7BsB,EAC/B;;AAGD;;EAEE,gBAAgB;EAChB,mBAAmB;EACnB,oBAAoB,EACrB;;AAED;EACE,eAAe,EAChB;;AAGD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;;EAEE,aAAa,EACd;;AAGD;;;EbvEE,qBAAqB;EAErB,2CAA2C;EAC3C,qBAAqB,EawEtB;;AAGD;EACE,eAAe;EACf,iBAAoC;EACpC,gBdlC4B;EcmC5B,yBdvBmC;EcwBnC,ed1E8B,Ec2E/B;;AAyBD;EACE,eAAe;EACf,YAAY;EACZ,adiGqD;EchGrD,kBdtB8B;EcuB9B,gBdnE4B;EcoE5B,yBdxDmC;EcyDnC,ed3G8B;Ec4G9B,uBdmEmC;EclEnC,uBAAuB;EACvB,uBdwEmC;EcvEnC,mBdf6B;EDxCrB,iDewDgC;Ef8DhC,yEe7DsE,EAgC/E;EA7CD;ICxDI,sBfsJoC;IerJpC,WAAW;IhBWL,mFgBdS,EAKhB;EDqDH;IfVI,YC2GiC;ID1GjC,WAAW,EACZ;EeQH;IfP4B,YCwGS,EDxGQ;EeO7C;IfNkC,YCuGG,EDvGc;EeMnD;IAuBI,UAAU;IACV,8BAA8B,EAC/B;EAzBH;;IAmCI,0BdrI4B;IcsI5B,WAAW,EACZ;EArCH;;IAyCI,oBd6EwC,Ec5EzC;;AAMH;EACE,aAAa,EACd;;AAUD;EACE,yBAAyB,EAC1B;;AAYD;EACE;;;;IAKI,kBdoBiD,EcnBlD;EANH;;;;;;;;;;;;;;;;;;;;;;IAUI,kBdmBiC,EclBlC;EAXH;;;;;;;;;;;;;;;;;;;;;;IAeI,kBdYgC,EcXjC,EAAA;;AAUL;EACE,oBdKmC,EcJpC;;AAOD;;EAEE,mBAAmB;EACnB,eAAe;EACf,iBAAiB;EACjB,oBAAoB,EASrB;EAdD;;IAQI,iBdtK2B;IcuK3B,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,gBAAgB,EACjB;;AAEH;;;;EAIE,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB,EACpB;;AAED;;EAEE,iBAAiB,EAClB;;AAGD;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB,EACjB;;AACD;;EAEE,cAAc;EACd,kBAAkB,EACnB;;AAMD;;;;;;EAKI,oBd/CwC,EcgDzC;;AAGH;;;;;EAII,oBdvDwC,EcwDzC;;AAGH;;;;;EAKM,oBdhEsC,EciEvC;;AAUL;EAEE,iBAAoC;EACpC,oBAAuC;EAEvC,iBAAiB;EACjB,iBAAkC,EAOnC;EAbD;;;;;IAUI,gBAAgB;IAChB,iBAAiB,EAClB;;ACxPD;;;EACE,afkJmC;EejJnC,kBf6B4B;Ee5B5B,gBfpB0B;EeqB1B,iBfiC2B;EehC3B,mBfoC2B,EenC5B;;AAED;;;EACE,af0ImC;EezInC,kBfyImC,EexIpC;;AAED;;;;;;;EACE,aAAa,EACd;;ADsPH;EAEI,adpHmC;EcqHnC,kBdzO4B;Ec0O5B,gBd1R0B;Ec2R1B,iBdrO2B;EcsO3B,mBdlO2B,EcmO5B;;AAPH;EASI,ad3HmC;Ec4HnC,kBd5HmC,Ec6HpC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,adnImC;EcoInC,iBAAkC;EAClC,kBdzP4B;Ec0P5B,gBd1S0B;Ec2S1B,iBdrP2B,EcsP5B;;AC3RD;;;EACE,afgJkC;Ee/IlC,mBf0B4B;EezB5B,gBfrB0B;EesB1B,uBfgCiC;Ee/BjC,mBfmC2B,EelC5B;;AAED;;;EACE,afwIkC;EevIlC,kBfuIkC,EetInC;;AAED;;;;;;;EACE,aAAa,EACd;;ADgRH;EAEI,adhJkC;EciJlC,mBdtQ4B;EcuQ5B,gBdrT0B;EcsT1B,uBdhQiC;EciQjC,mBd7P2B,Ec8P5B;;AAPH;EASI,advJkC;EcwJlC,kBdxJkC,EcyJnC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ad/JkC;EcgKlC,iBAAkC;EAClC,mBdtR4B;EcuR5B,gBdrU0B;EcsU1B,uBdhRiC,EciRlC;;AAQH;EAEE,mBAAmB,EAMpB;EARD;IAMI,sBAAkC,EACnC;;AAGH;EACE,mBAAmB;EACnB,OAAO;EACP,SAAS;EACT,WAAW;EACX,eAAe;EACf,Yd9LqD;Ec+LrD,ad/LqD;EcgMrD,kBdhMqD;EciMrD,mBAAmB;EACnB,qBAAqB,EACtB;;AACD;;;;;EAGE,YdrMoC;EcsMpC,adtMoC;EcuMpC,kBdvMoC,EcwMrC;;AACD;;;;;EAGE,Yd1MqC;Ec2MrC,ad3MqC;Ec4MrC,kBd5MqC,Ec6MtC;;AAGD;;;;;;;;;;ECxZI,efseoC,EererC;;ADuZH;ECpZI,sBfkeoC;EDlb9B,iDgB/CkC,EAMzC;ED6YH;ICjZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;AD8YL;EC1YI,efwdoC;EevdpC,sBfudoC;EetdpC,0BfudoC,EetdrC;;ADuYH;ECpYI,efkdoC,EejdrC;;ADsYH;;;;;;;;;;EC3ZI,ef8eoC,Ee7erC;;AD0ZH;ECvZI,sBf0eoC;ED1b9B,iDgB/CkC,EAMzC;EDgZH;ICpZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADiZL;EC7YI,efgeoC;Ee/dpC,sBf+doC;Ee9dpC,0Bf+doC,Ee9drC;;AD0YH;ECvYI,ef0doC,EezdrC;;ADyYH;;;;;;;;;;EC9ZI,efkfoC,EejfrC;;AD6ZH;EC1ZI,sBf8eoC;ED9b9B,iDgB/CkC,EAMzC;EDmZH;ICvZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADoZL;EChZI,efoeoC;EenepC,sBfmeoC;EelepC,0BfmeoC,EelerC;;AD6YH;EC1YI,ef8doC,Ee7drC;;AD8YH;EAGI,UAA2B,EAC5B;;AAJH;EAMI,OAAO,EACR;;AASH;EACE,eAAe;EACf,gBAAgB;EAChB,oBAAoB;EACpB,eAAc,EACf;;AAkBC;EAmEF;IAhEM,sBAAsB;IACtB,iBAAiB;IACjB,uBAAuB,EACxB;EA6DL;IAzDM,sBAAsB;IACtB,YAAY;IACZ,uBAAuB,EACxB;EAsDL;IAlDM,sBAAsB,EACvB;EAiDL;IA9CM,sBAAsB;IACtB,uBAAuB,EAOxB;IAsCL;;;MAxCQ,YAAY,EACb;EAuCP;IAlCM,YAAY,EACb;EAiCL;IA9BM,iBAAiB;IACjB,uBAAuB,EACxB;EA4BL;;IAtBM,sBAAsB;IACtB,cAAc;IACd,iBAAiB;IACjB,uBAAuB,EAKxB;IAcL;;MAhBQ,gBAAgB,EACjB;EAeP;;IAXM,mBAAmB;IACnB,eAAe,EAChB;EASL;IALM,OAAO,EACR,EAAA;;AAeL;;;;EASI,cAAc;EACd,iBAAiB;EACjB,iBAAoC,EACrC;;AAZH;;EAiBI,iBAAkC,EACnC;;AAlBH;EJ1hBE,mBAAkB;EAClB,oBAAmB,EIgjBlB;EAvBH;IR1hBI,aAAa;IACb,eAAe,EAChB;EQwhBH;IRthBI,YAAY,EACb;;AQgjBD;EA3BF;IA6BM,kBAAkB;IAClB,iBAAiB;IACjB,iBAAoC,EACrC,EAAA;;AAhCL;EAwCI,YAAY,EACb;;AAOC;EAhDJ;IAkDQ,kBAAqC;IACrC,gBdxiBsB,EcyiBvB,EAAA;;AAIH;EAxDJ;IA0DQ,iBAAqC;IACrC,gBd/iBsB,EcgjBvB,EAAA;;AE7lBP;EACE,sBAAsB;EACtB,iBAAiB;EACjB,oBhB0IqC;EgBzIrC,mBAAmB;EACnB,uBAAuB;EACvB,+BAA2B;EAA3B,2BAA2B;EAC3B,gBAAgB;EAChB,uBAAuB;EACvB,8BAA8B;EAC9B,oBAAoB;EC0CpB,kBjBmC8B;EiBlC9B,gBjBV4B;EiBW5B,yBjBCmC;EiBAnC,mBjB8C6B;ED4G7B,0BiBrMyB;EjBsMtB,uBiBtMsB;EjBuMrB,sBiBvMqB;EjBwMjB,kBiBxMiB,EAkC1B;EA9CD;IfJE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EeqBlB;EApBL;IA0BI,YhBqHiC;IgBpHjC,sBAAsB,EACvB;EA5BH;IAgCI,WAAW;IACX,uBAAuB;IjB4BjB,iDiB3BkC,EACzC;EAnCH;;IAwCI,oBhBuLwC;IkBpO1C,cF8CsB;IE3CtB,0BAAa;InB+DL,iBiBnBkB,EACzB;;AAKH;;EAGI,qBAAqB,EACtB;;AAOH;EC7DE,YjBiJmC;EiBhJnC,uBjBiJmC;EiBhJnC,mBjBiJmC,EgBpFpC;EAFD;ICvDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDoDH;IClDI,YjBsIiC;IiBrIjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+CH;;IC3CI,YjB+HiC;IiB9HjC,0BAAwB;IACpB,sBAAoB,EASzB;IDgCH;;;;MCpCM,YjBwH+B;MiBvH/B,0BAAwB;MACpB,sBAAoB,EACzB;EDiCL;;IC5BI,uBAAuB,EACxB;ED2BH;;;;ICpBM,uBjByG+B;IiBxG3B,mBjByG2B,EiBxGhC;EDkBL;ICdI,YjBmGiC;IiBlGjC,uBjBiGiC,EiBhGlC;;ADeH;EChEE,YjBqJmC;EiBpJnC,0BjBU4B;EiBT5B,sBjBqJqC,EgBrFtC;EAFD;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuDH;ICrDI,YjB0IiC;IiBzIjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkDH;;IC9CI,YjBmIiC;IiBlIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmCH;;;;MCvCM,YjB4H+B;MiB3H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoCL;;IC/BI,uBAAuB,EACxB;ED8BH;;;;ICvBM,0BjB9BwB;IiB+BpB,sBjB6G6B,EiB5GlC;EDqBL;ICjBI,ejBpC0B;IiBqC1B,uBjBqGiC,EiBpGlC;;ADmBH;ECpEE,YjByJmC;EiBxJnC,0BjBW6B;EiBV7B,sBjByJqC,EgBrFtC;EAFD;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED2DH;ICzDI,YjB8IiC;IiB7IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDsDH;;IClDI,YjBuIiC;IiBtIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDuCH;;;;MC3CM,YjBgI+B;MiB/H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDwCL;;ICnCI,uBAAuB,EACxB;EDkCH;;;;IC3BM,0BjB7ByB;IiB8BrB,sBjBiH6B,EiBhHlC;EDyBL;ICrBI,ejBnC2B;IiBoC3B,uBjByGiC,EiBxGlC;;ADuBH;ECxEE,YjB6JmC;EiB5JnC,0BjBY6B;EiBX7B,sBjB6JqC,EgBrFtC;EAFD;IClEI,YjBuJiC;IiBtJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+DH;IC7DI,YjBkJiC;IiBjJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED0DH;;ICtDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID2CH;;;;MC/CM,YjBoI+B;MiBnI/B,0BAAwB;MACpB,sBAAoB,EACzB;ED4CL;;ICvCI,uBAAuB,EACxB;EDsCH;;;;IC/BM,0BjB5ByB;IiB6BrB,sBjBqH6B,EiBpHlC;ED6BL;ICzBI,ejBlC2B;IiBmC3B,uBjB6GiC,EiB5GlC;;AD2BH;EC5EE,YjBiKmC;EiBhKnC,0BjBa6B;EiBZ7B,sBjBiKqC,EgBrFtC;EAFD;ICtEI,YjB2JiC;IiB1JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDmEH;ICjEI,YjBsJiC;IiBrJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED8DH;;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID+CH;;;;MCnDM,YjBwI+B;MiBvI/B,0BAAwB;MACpB,sBAAoB,EACzB;EDgDL;;IC3CI,uBAAuB,EACxB;ED0CH;;;;ICnCM,0BjB3ByB;IiB4BrB,sBjByH6B,EiBxHlC;EDiCL;IC7BI,ejBjC2B;IiBkC3B,uBjBiHiC,EiBhHlC;;AD+BH;EChFE,YjBqKmC;EiBpKnC,0BjBc6B;EiBb7B,sBjBqKqC,EgBrFtC;EAFD;IC1EI,YjB+JiC;IiB9JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuEH;ICrEI,YjB0JiC;IiBzJjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkEH;;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmDH;;;;MCvDM,YjB4I+B;MiB3I/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoDL;;IC/CI,uBAAuB,EACxB;ED8CH;;;;ICvCM,0BjB1ByB;IiB2BrB,sBjB6H6B,EiB5HlC;EDqCL;ICjCI,ejBhC2B;IiBiC3B,uBjBqHiC,EiBpHlC;;ADwCH;EACE,ehB/E4B;EgBgF5B,oBAAoB;EACpB,iBAAiB,EA8BlB;EAjCD;;IAUI,8BAA8B;IjBpCxB,iBiBqCkB,EACzB;EAZH;IAiBI,0BAA0B,EAC3B;EAlBH;IAqBI,ehBhF0B;IgBiF1B,2BhB/E6B;IgBgF7B,8BAA8B,EAC/B;EAxBH;;;IA6BM,ehB9G0B;IgB+G1B,sBAAsB,EACvB;;AAQL;EC1EE,mBjBsC8B;EiBrC9B,gBjBT4B;EiBU5B,uBjB4CmC;EiB3CnC,mBjB+C6B,EgB2B9B;;AACD;EC9EE,kBjByC8B;EiBxC9B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgB8B9B;;AACD;EClFE,iBjB4C6B;EiB3C7B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgBiC9B;;AAMD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;EACE,gBAAgB,EACjB;;AAGD;;;EAII,YAAY,EACb;;AG7JH;EACE,WAAW;EpBiLH,iCoBhL+B,EAIxC;EAND;IAII,WAAW,EACZ;;AAGH;EACE,cAAc,EAKf;EAND;IAGc,eAAe,EAAI;;AAKjC;EAAoB,mBAAmB,EAAI;;AAE3C;EAAoB,yBAAyB,EAAI;;AAEjD;EACE,mBAAmB;EACnB,UAAU;EACV,iBAAiB;EpB+JT,wCoB9JuC;EpBsKvC,2BoBrKyB;EpByKzB,iCoBxKgC,EACzC;;AC9BD;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,uBAAuB;EACvB,uBAAsC;EACtC,yBAAwC;EACxC,oCAAiD;EACjD,mCAAiD,EAClD;;AAGD;;EAEE,mBAAmB,EACpB;;AAGD;EACE,WAAW,EACZ;;AAGD;EACE,mBAAmB;EACnB,UAAU;EACV,QAAQ;EACR,cpBmP6B;EoBlP7B,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,gBpBU4B;EoBT5B,iBAAiB;EACjB,uBpBoMmC;EoBnMnC,uBpBuMmC;EoBtMnC,sCpBoMmC;EoBnMnC,mBpB+D6B;EDxCrB,4CqBtB2B;EACnC,6BAA6B,EAyB9B;EA3CD;IAwBI,SAAS;IACT,WAAW,EACZ;EA1BH;ICzBE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BrB6OsC,EoBxLrC;EA/BH;IAmCI,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ,oBAAoB;IACpB,yBpBNiC;IoBOjC,epB1D4B;IoB2D5B,oBAAoB,EACrB;;AAIH;EAGI,sBAAsB;EACtB,epB0KmC;EoBzKnC,0BpB2KoC,EoB1KrC;;AAIH;EAII,YpBwB4B;EoBvB5B,sBAAsB;EACtB,WAAW;EACX,0BpB5E0B,EoB6E3B;;AAOH;EAII,epB3F4B,EoB4F7B;;AALH;EAUI,sBAAsB;EACtB,8BAA8B;EAC9B,uBAAuB;EE3GzB,oEAAmE;EF6GjE,oBpBoHwC,EoBnHzC;;AAIH;EAGI,eAAe,EAChB;;AAJH;EAQI,WAAW,EACZ;;AAOH;EACE,WAAW;EACX,SAAS,EACV;;AAOD;EACE,QAAQ;EACR,YAAY,EACb;;AAGD;EACE,eAAe;EACf,kBAAkB;EAClB,gBpBtG4B;EoBuG5B,yBpB7FmC;EoB8FnC,epB/I8B;EoBgJ9B,oBAAoB,EACrB;;AAGD;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,UAAU;EACV,OAAO;EACP,aAA0B,EAC3B;;AAGD;EACE,SAAS;EACT,WAAW,EACZ;;AAOD;;EAII,cAAc;EACd,0BAAuC;EACvC,4BAAyC;EACzC,YAAY,EACb;;AARH;;EAWI,UAAU;EACV,aAAa;EACb,mBAAmB,EACpB;;AAQH;EACE;IAEI,SAAS;IAAE,WAAW,EACvB;EAHH;IAOI,QAAQ;IAAE,YAAY,EACvB,EAAA;;AGhNL;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,uBAAuB,EAYxB;EAhBD;;IAMI,mBAAmB;IACnB,YAAY,EAQb;IAfH;;;;;MAaM,WAAW,EACZ;;AAKL;;;;EAKI,kBAAkB,EACnB;;AAIH;EACE,kBAAkB,EAanB;EAdD;IjBnBI,aAAa;IACb,eAAe,EAChB;EiBiBH;IjBfI,YAAY,EACb;EiBcH;;;IAOI,YAAY,EACb;EARH;;;IAYI,iBAAiB,EAClB;;AAGH;EACE,iBAAiB,EAClB;;AAGD;EACE,eAAe,EAIhB;EALD;IChDE,8BDmDgC;IClD7B,2BDkD6B,EAC/B;;AAGH;;EC/CE,6BDiD6B;EChD1B,0BDgD0B,EAC9B;;AAGD;EACE,YAAY,EACb;;AACD;EACE,iBAAiB,EAClB;;AACD;;ECnEE,8BDsEgC;ECrE7B,2BDqE6B,EAC/B;;AAEH;ECjEE,6BDkE6B;ECjE1B,0BDiE0B,EAC9B;;AAGD;;EAEE,WAAW,EACZ;;AAgBD;EACE,kBAAkB;EAClB,mBAAmB,EACpB;;AACD;EACE,mBAAmB;EACnB,oBAAoB,EACrB;;AAID;ExB9CU,iDwB+CgC,EAMzC;EAPD;IxB9CU,iBwBmDkB,EACzB;;AAKH;EACE,eAAe,EAChB;;AAED;EACE,wBAAqD;EACrD,uBAAuB,EACxB;;AAED;EACE,wBvBf6B,EuBgB9B;;AAMD;;;EAII,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,gBAAgB,EACjB;;AARH;EjBhII,aAAa;EACb,eAAe,EAChB;;AiB8HH;EjB5HI,YAAY,EACb;;AiB2HH;EAcM,YAAY,EACb;;AAfL;;;;EAsBI,iBAAiB;EACjB,eAAe,EAChB;;AAGH;EAEI,iBAAiB,EAClB;;AAHH;ECvKE,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BDqKiC;ECpKhC,6BDoKgC,EAChC;;AAPH;ECvKE,2BDgL8B;EC/K7B,0BD+K6B;ECxK9B,gCxBkG6B;EwBjG5B,+BxBiG4B,EuBwE5B;;AAEH;EACE,iBAAiB,EAClB;;AACD;;EC/KE,8BDkLiC;ECjLhC,6BDiLgC,EAChC;;AAEH;EC7LE,2BD8L4B;EC7L3B,0BD6L2B,EAC7B;;AAMD;EACE,eAAe;EACf,YAAY;EACZ,oBAAoB;EACpB,0BAA0B,EAc3B;EAlBD;;IAOI,YAAY;IACZ,oBAAoB;IACpB,UAAU,EACX;EAVH;IAYI,YAAY,EACb;EAbH;IAgBI,WAAW,EACZ;;A/B4oGH;;;;E+BvnGM,mBAAmB;EACnB,uBAAU;EACV,qBAAqB,EACtB;;AE3OL;EACE,mBAAmB;EACnB,eAAe;EACf,0BAA0B,EA2B3B;EA9BD;IAOI,YAAY;IACZ,gBAAgB;IAChB,iBAAiB,EAClB;EAVH;IAeI,mBAAmB;IACnB,WAAW;IAKX,YAAY;IAEZ,YAAY;IACZ,iBAAiB,EAKlB;IA7BH;MA2BM,WAAW,EACZ;;AAuBL;;;EAGE,oBAAoB,EAKrB;EARD;;;IAMI,iBAAiB,EAClB;;AAGH;;EAEE,UAAU;EACV,oBAAoB;EACpB,uBAAuB,EACxB;;AAID;EACE,kBzBkB8B;EyBjB9B,gBzB3B4B;EyB4B5B,oBAAoB;EACpB,eAAe;EACf,ezBpE8B;EyBqE9B,mBAAmB;EACnB,0BzBpE8B;EyBqE9B,uBzB+GmC;EyB9GnC,mBzBwB6B,EyBL9B;EA5BD;;;IAaI,kBzBY4B;IyBX5B,gBzBrC0B;IyBsC1B,mBzBoB2B,EyBnB5B;EAhBH;;;IAkBI,mBzBI4B;IyBH5B,gBzB3C0B;IyB4C1B,mBzBc2B,EyBb5B;EArBH;;IA0BI,cAAc,EACf;;AAIH;;;;;;;EDpGE,8BC2G8B;ED1G3B,2BC0G2B,EAC/B;;AACD;EACE,gBAAgB,EACjB;;AACD;;;;;;;EDxGE,6BC+G6B;ED9G1B,0BC8G0B,EAC9B;;AACD;EACE,eAAe,EAChB;;AAID;EACE,mBAAmB;EAGnB,aAAa;EACb,oBAAoB,EA+BrB;EApCD;IAUI,mBAAmB,EAUpB;IApBH;MAYM,kBAAkB,EACnB;IAbL;MAkBM,WAAW,EACZ;EAnBL;;IA0BM,mBAAmB,EACpB;EA3BL;;IAgCM,WAAW;IACX,kBAAkB,EACnB;;AChKL;EACE,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB,EAyDlB;EA5DD;IpBOI,aAAa;IACb,eAAe,EAChB;EoBTH;IpBWI,YAAY,EACb;EoBZH;IAOI,mBAAmB;IACnB,eAAe,EAyBhB;IAjCH;MAWM,mBAAmB;MACnB,eAAe;MACf,mB1BqZ+C,E0B/YhD;MAnBL;QAgBQ,sBAAsB;QACtB,0B1BVwB,E0BWzB;IAlBP;MAuBM,e1BjB0B,E0B0B3B;MAhCL;QA2BQ,e1BrBwB;Q0BsBxB,sBAAsB;QACtB,8BAA8B;QAC9B,oB1BiMoC,E0BhMrC;EA/BP;IAwCM,0B1BjC0B;I0BkC1B,sB1BhCwB,E0BiCzB;EA1CL;ILHE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BAJgC,EKwD/B;EApDH;IA0DI,gBAAgB,EACjB;;AAQH;EACE,8B1BqW8C,E0BlU/C;EApCD;IAGI,YAAY;IAEZ,oBAAoB,EAyBrB;IA9BH;MASM,kBAAkB;MAClB,yB1BtB+B;M0BuB/B,8BAA8B;MAC9B,2BAA0D,EAI3D;MAhBL;QAcQ,mC1BwVwC,E0BvVzC;IAfP;MAuBQ,e1BrFwB;M0BsFxB,uB1BtEoB;M0BuEpB,uB1BmVwC;M0BlVxC,iCAAiC;MACjC,gBAAgB,EACjB;;AAaP;EAEI,YAAY,EAmBb;EArBH;IAMM,mB1BbyB,E0Bc1B;EAPL;IASM,iBAAiB,EAClB;EAVL;IAiBQ,Y1BnBwB;I0BoBxB,0B1BrHsB,E0BsHvB;;AAOP;EAEI,YAAY,EAKb;EAPH;IAIM,gBAAgB;IAChB,eAAe,EAChB;;AAWL;EACE,YAAY,EAwBb;EAzBD;IAII,YAAY,EAKb;IATH;MAMM,mBAAmB;MACnB,mBAAmB,EACpB;EARL;IAYI,UAAU;IACV,WAAW,EACZ;EAED;IAhBF;MAkBM,oBAAoB;MACpB,UAAU,EAIX;MAvBL;QAqBQ,iBAAiB,EAClB,EAAA;;AAQP;EACE,iBAAiB,EAyBlB;EA1BD;IAKI,gBAAgB;IAChB,mB1BtF2B,E0BuF5B;EAPH;;;IAYI,uB1BgPkD,E0B/OnD;EAED;IAfF;MAiBM,8B1B2OgD;M0B1OhD,2BAA0D,EAC3D;IAnBL;;;MAuBM,0B1BvLsB,E0BwLvB,EAAA;;AASL;EAEI,cAAc,EACf;;AAHH;EAKI,eAAe,EAChB;;AAQH;EAEE,iBAAiB;EF3OjB,2BE6O4B;EF5O3B,0BE4O2B,EAC7B;;ACvOD;EACE,mBAAmB;EACnB,iB3BgWqC;E2B/VrC,oB3BoD6B;E2BnD7B,8BAA8B,EAQ/B;EAZD;IrBKI,aAAa;IACb,eAAe,EAChB;EqBPH;IrBSI,YAAY,EACb;EqBDD;IATF;MAUI,mB3ByF2B,E2BvF9B,EAAA;;AAQD;ErBfI,aAAa;EACb,eAAe,EAChB;;AqBaH;ErBXI,YAAY,EACb;;AqBaD;EAHF;IAII,YAAY,EAEf,EAAA;;AAaD;EACE,oBAAoB;EACpB,oB3B4TsC;E2B3TtC,mB3B2TsC;E2B1TtC,kCAAkC;EAClC,mDAA8B;EAE9B,kCAAkC,EA+BnC;EAtCD;IrBlCI,aAAa;IACb,eAAe,EAChB;EqBgCH;IrB9BI,YAAY,EACb;EqB6BH;IAUI,iBAAiB,EAClB;EAED;IAbF;MAcI,YAAY;MACZ,cAAc;MACd,iBAAiB,EAsBpB;MAtCD;QAmBM,0BAA0B;QAC1B,wBAAwB;QACxB,kBAAkB;QAClB,6BAA6B,EAC9B;MAvBL;QA0BM,oBAAoB,EACrB;MAID;;;QAGE,gBAAgB;QAChB,iBAAiB,EAClB,EAAA;;AAIL;;EAGI,kB3BqRoC,E2BhRrC;EAHC;IALJ;;MAMM,kBAAkB,EAErB,EAAA;;AAQH;;;;EAII,oB3BkQoC;E2BjQpC,mB3BiQoC,E2B3PrC;EAJC;IAPJ;;;;MAQM,gBAAgB;MAChB,eAAgB,EAEnB,EAAA;;AAWH;EACE,c3BoJ6B;E2BnJ7B,sBAAsB,EAKvB;EAHC;IAJF;MAKI,iBAAiB,EAEpB,EAAA;;AAGD;;EAEE,gBAAgB;EAChB,SAAS;EACT,QAAQ;EACR,c3B0I6B,E2BpI9B;EAHC;IARF;;MASI,iBAAiB,EAEpB,EAAA;;AACD;EACE,OAAO;EACP,sBAAsB,EACvB;;AACD;EACE,UAAU;EACV,iBAAiB;EACjB,sBAAsB,EACvB;;AAKD;EACE,YAAY;EACZ,mB3B2MsC;E2B1MtC,gB3BjH4B;E2BkH5B,kB3BrG6B;E2BsG7B,a3BqMqC,E2BpLtC;EAtBD;IASI,sBAAsB,EACvB;EAVH;IAaI,eAAe,EAChB;EAED;IACE;;MAEE,mB3B0LkC,E2BzLnC,EAAA;;AAUL;EACE,mBAAmB;EACnB,aAAa;EACb,mB3B4KsC;E2B3KtC,kBAAkB;EC9LlB,gBAA4B;EAC5B,mBAA+B;ED+L/B,8BAA8B;EAC9B,uBAAuB;EACvB,8BAA8B;EAC9B,mB3B5F6B,E2BkH9B;EA/BD;IAcI,WAAW,EACZ;EAfH;IAmBI,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,mBAAmB,EACpB;EAvBH;IAyBI,gBAAgB,EACjB;EAED;IA5BF;MA6BI,cAAc,EAEjB,EAAA;;AAQD;EACE,oB3BuIsC,E2B1FvC;EA9CD;IAII,kBAAqB;IACrB,qBAAqB;IACrB,kB3B5K2B,E2B6K5B;EAED;IATF;MAYM,iBAAiB;MACjB,YAAY;MACZ,YAAY;MACZ,cAAc;MACd,8BAA8B;MAC9B,UAAU;MACV,iBAAiB,EAYlB;MA9BL;;QAqBQ,2BAA2B,EAC5B;MAtBP;QAwBQ,kB3B9LuB,E2BmMxB;QA7BP;UA2BU,uBAAuB,EACxB,EAAA;EAMP;IAlCF;MAmCI,YAAY;MACZ,UAAU,EAUb;MA9CD;QAuCM,YAAY,EAKb;QA5CL;UAyCQ,kB3BgG2C;U2B/F3C,qB3B+F2C,E2B9F5C,EAAA;;AAWP;EACE,mB3BiFsC;E2BhFtC,oB3BgFsC;E2B/EtC,mB3B+EsC;E2B9EtC,kCAAkC;EAClC,qCAAqC;E5B7N7B,qF4B8NiD;EC7RzD,gBAA4B;EAC5B,mBAA+B,EDyThC;Eb2JC;Ia9LF;MbiMM,sBAAsB;MACtB,iBAAiB;MACjB,uBAAuB,EACxB;IapML;MbwMM,sBAAsB;MACtB,YAAY;MACZ,uBAAuB,EACxB;Ia3ML;Mb+MM,sBAAsB,EACvB;IahNL;MbmNM,sBAAsB;MACtB,uBAAuB,EAOxB;Ma3NL;;;QbyNQ,YAAY,EACb;Ia1NP;Mb+NM,YAAY,EACb;IahOL;MbmOM,iBAAiB;MACjB,uBAAuB,EACxB;IarOL;;Mb2OM,sBAAsB;MACtB,cAAc;MACd,iBAAiB;MACjB,uBAAuB,EAKxB;ManPL;;QbiPQ,gBAAgB,EACjB;IalPP;;MbsPM,mBAAmB;MACnB,eAAe,EAChB;IaxPL;Mb4PM,OAAO,EACR,EAAA;EahPD;IAbJ;MAcM,mBAAmB,EAMtB;MApBH;QAiBQ,iBAAiB,EAClB,EAAA;EAQL;IA1BF;MA2BI,YAAY;MACZ,UAAU;MACV,eAAe;MACf,gBAAgB;MAChB,eAAe;MACf,kBAAkB;M5BxPZ,iB4ByPkB,EAE3B,EAAA;;AAMD;EACE,cAAc;EHpUd,2BGqU4B;EHpU3B,0BGoU2B,EAC7B;;AAED;EACE,iBAAiB;EHzUjB,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BGmU+B;EHlU9B,6BGkU8B,EAChC;;AAOD;EChVE,gBAA4B;EAC5B,mBAA+B,EDwVhC;EATD;IChVE,iBAA4B;IAC5B,oBAA+B,EDoV9B;EALH;IChVE,iBAA4B;IAC5B,oBAA+B,EDuV9B;;AAQH;EChWE,iBAA4B;EAC5B,oBAA+B,EDuWhC;EALC;IAHF;MAII,YAAY;MACZ,kB3BIoC;M2BHpC,mB3BGoC,E2BDvC,EAAA;;AAWD;EACE;IACE,uBAAuB,EACxB;EACD;IACE,wBAAwB;IAC1B,oB3BhBsC,E2BqBrC;IAPD;MAKI,gBAAgB,EACjB,EAAA;;AASL;EACE,0B3BzBwC;E2B0BxC,sB3BzBuC,E2ByJxC;EAlID;IAKI,Y3BzB2C,E2B+B5C;IAXH;MAQM,e3BlB2C;M2BmB3C,8B3BlBgD,E2BmBjD;EAVL;IAcI,Y3BvCmC,E2BwCpC;EAfH;IAmBM,Y3BvCyC,E2B8C1C;IA1BL;MAuBQ,Y3B1CuC;M2B2CvC,8B3B1C8C,E2B2C/C;EAzBP;IA+BQ,Y3BhDuC;I2BiDvC,0B3BhDyC,E2BiD1C;EAjCP;IAuCQ,Y3BtDuC;I2BuDvC,8B3BtD8C,E2BuD/C;EAzCP;IA8CI,mB3BlD2C,E2B0D5C;IAtDH;MAiDM,uB3BvDyC,E2BwD1C;IAlDL;MAoDM,uB3BzDyC,E2B0D1C;EArDL;;IA0DI,sB3BjFqC,E2BkFtC;EA3DH;IAoEQ,0B3BpFyC;I2BqFzC,Y3BtFuC,E2BuFxC;EAGH;IAzEJ;MA6EU,Y3BjGqC,E2BuGtC;MAnFT;QAgFY,Y3BnGmC;Q2BoGnC,8B3BnG0C,E2BoG3C;IAlFX;MAwFY,Y3BzGmC;M2B0GnC,0B3BzGqC,E2B0GtC;IA1FX;MAgGY,Y3B/GmC;M2BgHnC,8B3B/G0C,E2BgH3C,EAAA;EAlGX;IA8GI,Y3BlI2C,E2BsI5C;IAlHH;MAgHM,Y3BnIyC,E2BoI1C;EAjHL;IAqHI,Y3BzI2C,E2BqJ5C;IAjIH;MAwHM,Y3B3IyC,E2B4I1C;IAzHL;;;MA8HQ,Y3B7IuC,E2B8IxC;;AAOP;EACE,uB3BrI8C;E2BsI9C,sB3BrIgD,E2BsQjD;EAnID;IAKI,e3BrI+C,E2B2IhD;IAXH;MAQM,Y3B9H0C;M2B+H1C,8B3B9HiD,E2B+HlD;EAVL;IAcI,e3BnJ+C,E2BoJhD;EAfH;IAmBM,e3BnJ6C,E2B0J9C;IA1BL;MAuBQ,Y3BtJwC;M2BuJxC,8B3BtJ+C,E2BuJhD;EAzBP;IA+BQ,Y3B9JwC;I2B+JxC,0B3B5J0C,E2B6J3C;EAjCP;IAuCQ,Y3BlKwC;I2BmKxC,8B3BlK+C,E2BmKhD;EAzCP;IA+CI,mB3B/J4C,E2BuK7C;IAvDH;MAkDM,uB3BpK0C,E2BqK3C;IAnDL;MAqDM,uB3BtK0C,E2BuK3C;EAtDL;;IA2DI,sBAAoB,EACrB;EA5DH;IAoEQ,0B3BhM0C;I2BiM1C,Y3BpMwC,E2BqMzC;EAGH;IAzEJ;MA6EU,sB3BhNwC,E2BiNzC;IA9ET;MAgFU,0B3BnNwC,E2BoNzC;IAjFT;MAmFU,e3BnNyC,E2ByN1C;MAzFT;QAsFY,Y3BrNoC;Q2BsNpC,8B3BrN2C,E2BsN5C;IAxFX;MA8FY,Y3B7NoC;M2B8NpC,0B3B3NsC,E2B4NvC;IAhGX;MAsGY,Y3BjOoC;M2BkOpC,8B3BjO2C,E2BkO5C,EAAA;EAxGX;IA+GI,e3B/O+C,E2BmPhD;IAnHH;MAiHM,Y3BhP0C,E2BiP3C;EAlHL;IAsHI,e3BtP+C,E2BkQhD;IAlIH;MAyHM,Y3BxP0C,E2ByP3C;IA1HL;;;MA+HQ,Y3B1PwC,E2B2PzC;;AE7oBP;EACE,kB7BqxBkC;E6BpxBlC,oB7B0D6B;E6BzD7B,iBAAiB;EACjB,0B7BoxBqC;E6BnxBrC,mB7BmG6B,E6BlF9B;EAtBD;IAQI,sBAAsB,EASvB;IAjBH;MAaM,cAA2C;MAC3C,eAAe;MACf,Y7B2wB8B,E6B1wB/B;EAhBL;IAoBI,e7BX4B,E6BY7B;;ACvBH;EACE,sBAAsB;EACtB,gBAAgB;EAChB,eAA+B;EAC/B,mB9BsG6B,E8BlC9B;EAxED;IAOI,gBAAgB,EA0BjB;IAjCH;;MAUM,mBAAmB;MACnB,YAAY;MACZ,kB9BgF0B;M8B/E1B,yB9B+C+B;M8B9C/B,sBAAsB;MACtB,e9BDwB;M8BExB,uB9BobqC;M8BnbrC,uB9BobqC;M8BnbrC,kBAAkB,EACnB;IAnBL;;MAuBQ,eAAe;MNXrB,+BxB8F6B;MwB7F1B,4BxB6F0B,E8BjFxB;IAzBP;;MNIE,gCxBsG6B;MwBrG1B,6BxBqG0B,E8B3ExB;EA/BP;;;IAuCM,WAAW;IACX,e9BPwB;I8BQxB,0B9B7B0B;I8B8B1B,mB9B+ZqC,E8B9ZtC;EA3CL;;;;IAmDM,WAAW;IACX,Y9BuZqC;I8BtZrC,0B9BvCwB;I8BwCxB,sB9BxCwB;I8ByCxB,gBAAgB,EACjB;EAxDL;;;;;;IAkEM,e9BvD0B;I8BwD1B,uB9B6YqC;I8B5YrC,mB9B6YqC;I8B5YrC,oB9B+JsC,E8B9JvC;;AAQL;;EC3EM,mB/B4F0B;E+B3F1B,gB/B6CwB;E+B5CxB,uB/BkG+B,E+BjGhC;;ADwEL;;ENlEE,+BxB+F6B;EwB9F1B,4BxB8F0B,E+BhGxB;;ADmEP;;EN1EE,gCxBuG6B;EwBtG1B,6BxBsG0B,E+B1FxB;;ADkEP;;EChFM,kB/B+F0B;E+B9F1B,gB/B8CwB;E+B7CxB,iB/BmGyB,E+BlG1B;;AD6EL;;ENvEE,+BxBgG6B;EwB/F1B,4BxB+F0B,E+BjGxB;;ADwEP;;EN/EE,gCxBwG6B;EwBvG1B,6BxBuG0B,E+B3FxB;;ACfP;EACE,gBAAgB;EAChB,eAA+B;EAC/B,iBAAiB;EACjB,mBAAmB,EA4CpB;EAhDD;I1BUI,aAAa;IACb,eAAe,EAChB;E0BZH;I1BcI,YAAY,EACb;E0BfH;IAOI,gBAAgB,EAejB;IAtBH;;MAUM,sBAAsB;MACtB,kBAAkB;MAClB,uBhCsbqC;MgCrbrC,uBhCsbqC;MgCrbrC,oBhC0cqC,EgCzctC;IAfL;;MAmBM,sBAAsB;MACtB,0BhCV0B,EgCW3B;EArBL;;IA2BM,aAAa,EACd;EA5BL;;IAkCM,YAAY,EACb;EAnCL;;;;IA2CM,ehClC0B;IgCmC1B,uBhCsZqC;IgCrZrC,oBhCqLsC,EgCpLvC;;AC/CL;EACE,gBAAgB;EAChB,wBAAwB;EACxB,eAAe;EACf,kBAAkB;EAClB,eAAe;EACf,YjC+jBgC;EiC9jBhC,mBAAmB;EACnB,oBAAoB;EACpB,yBAAyB;EACzB,qBAAqB,EActB;EAxBD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;;AAIH;EAGI,YjCyiB8B;EiCxiB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AAMH;ECxCE,0BlCW8B,EiC+B/B;EAFD;ICnCM,0BAAwB,EACzB;;ADsCL;EC5CE,0BlCc4B,EiCgC7B;EAFD;ICvCM,0BAAwB,EACzB;;AD0CL;EChDE,0BlCe6B,EiCmC9B;EAFD;IC3CM,0BAAwB,EACzB;;AD8CL;ECpDE,0BlCgB6B,EiCsC9B;EAFD;IC/CM,0BAAwB,EACzB;;ADkDL;ECxDE,0BlCiB6B,EiCyC9B;EAFD;ICnDM,0BAAwB,EACzB;;ADsDL;EC5DE,0BlCkB6B,EiC4C9B;EAFD;ICvDM,0BAAwB,EACzB;;ACHL;EACE,sBAAsB;EACtB,gBAAgB;EAChB,iBAAiB;EACjB,gBnC2C4B;EmC1C5B,kBnCswBgC;EmCrwBhC,YnC2vBgC;EmC1vBhC,enCqwB6B;EmCpwB7B,uBAAuB;EACvB,oBAAoB;EACpB,mBAAmB;EACnB,0BnCH8B;EmCI9B,oBnCiwBgC,EmC1tBjC;EAnDD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;EAED;;IAEE,OAAO;IACP,iBAAiB,EAClB;EAKD;;IAEE,enCzB0B;ImC0B1B,uBnCouB8B,EmCnuB/B;EAED;IACE,aAAa,EACd;EAED;IACE,kBAAkB,EACnB;EAED;IACE,iBAAiB,EAClB;;AAIH;EAGI,YnC0sB8B;EmCzsB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AC7DH;EACE,kBpCqemC;EoCpenC,qBpCoemC;EoCnenC,oBpCmemC;EoClenC,epCmesC;EoCletC,0BpCK8B,EoCsC/B;EAhDD;;IASI,epCgeoC,EoC/drC;EAVH;IAaI,oBAAkC;IAClC,gBpC4diC;IoC3djC,iBAAiB,EAClB;EAhBH;IAmBI,0BAAwB,EACzB;EAED;;IAEE,mBpCiF2B;IoChF3B,mBAAkC;IAClC,oBAAkC,EACnC;EA3BH;IA8BI,gBAAgB,EACjB;EAED;IAjCF;MAkCI,kBAAmC;MACnC,qBAAmC,EAatC;MAXG;;QAEE,mBAAkC;QAClC,oBAAkC,EACnC;MAzCL;;QA6CM,gBpC8b+B,EoC7bhC,EAAA;;AC7CL;EACE,eAAe;EACf,arCquB+B;EqCpuB/B,oBrCwD6B;EqCvD7B,yBrCqDmC;EqCpDnC,uBrCkB0B;EqCjB1B,uBrCquBgC;EqCpuBhC,mBrCgG6B;ED8ErB,oCsC7KkC,EAgB3C;EAxBD;;InCGE,eADmC;IAEnC,gBAAgB;IAChB,aAAa;ImCQX,kBAAkB;IAClB,mBAAmB,EACpB;EAfH;IAqBI,arC6tB6B;IqC5tB7B,erChB4B,EqCiB7B;;AAIH;;;EAGE,sBrCnB4B,EqCoB7B;;AC7BD;EACE,ctC0mBgC;EsCzmBhC,oBtCuD6B;EsCtD7B,8BAA8B;EAC9B,mBtCiG6B,EsC1E9B;EA3BD;IAQI,cAAc;IAEd,eAAe,EAChB;EAXH;IAeI,kBtC8lB8B,EsC7lB/B;EAhBH;;IAqBI,iBAAiB,EAClB;EAtBH;IAyBI,gBAAgB,EACjB;;AAOH;;EAEE,oBAA8B,EAS/B;EAXD;;IAMI,mBAAmB;IACnB,UAAU;IACV,aAAa;IACb,eAAe,EAChB;;AAOH;ECvDE,0BvCqfsC;EuCpftC,sBvCqfqC;EuCpfrC,evCkfsC,EsC3bvC;EAFD;IClDI,0BAAwB,EACzB;EDiDH;IC/CI,eAAa,EACd;;ADkDH;EC3DE,0BvCyfsC;EuCxftC,sBvCyfqC;EuCxfrC,evCsfsC,EsC3bvC;EAFD;ICtDI,0BAAwB,EACzB;EDqDH;ICnDI,eAAa,EACd;;ADsDH;EC/DE,0BvC6fsC;EuC5ftC,sBvC6fqC;EuC5frC,evC0fsC,EsC3bvC;EAFD;IC1DI,0BAAwB,EACzB;EDyDH;ICvDI,eAAa,EACd;;AD0DH;ECnEE,0BvCigBsC;EuChgBtC,sBvCigBqC;EuChgBrC,evC8fsC,EsC3bvC;EAFD;IC9DI,0BAAwB,EACzB;ED6DH;IC3DI,eAAa,EACd;;ACHH;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAInC;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAQnC;EACE,iBAAiB;EACjB,axCsC6B;EwCrC7B,oBxCqC6B;EwCpC7B,0BxCgnBmC;EwC/mBnC,mBxC+E6B;EDxCrB,+CyCtCgC,EACzC;;AAGD;EACE,YAAY;EACZ,UAAU;EACV,aAAa;EACb,gBxCc4B;EwCb5B,kBxCyB6B;EwCxB7B,YxCsmBgC;EwCrmBhC,mBAAmB;EACnB,0BxC1B4B;EDoDpB,+CyCzB+B;EzC+I/B,4ByC9I0B,EACnC;;AAOD;;ECGE,sMAAiC;EDAjC,2BAA2B,EAC5B;;AAMD;;EzC5CE,2DyC8C0D;EzC5ClD,mDyC4CkD,EAC3D;;AAMD;EErEE,0B1Ce6B,EwCwD9B;EEpEC;IDkDA,sMAAiC,EChDhC;;AFoEH;EEzEE,0B1CgB6B,EwC2D9B;EExEC;IDkDA,sMAAiC,EChDhC;;AFwEH;EE7EE,0B1CiB6B,EwC8D9B;EE5EC;IDkDA,sMAAiC,EChDhC;;AF4EH;EEjFE,0B1CkB6B,EwCiE9B;EEhFC;IDkDA,sMAAiC,EChDhC;;ACRH;EAEE,iBAAiB,EAKlB;EAPD;IAKI,cAAc,EACf;;AAGH;;EAEE,QAAQ;EACR,iBAAiB,EAClB;;AAED;EACE,eAAe,EAChB;;AAED;EACE,eAAe,EAMhB;EAPD;IAKI,gBAAgB,EACjB;;AAGH;;EAEE,mBAAmB,EACpB;;AAED;;EAEE,oBAAoB,EACrB;;AAED;;;EAGE,oBAAoB;EACpB,oBAAoB,EACrB;;AAED;EACE,uBAAuB,EACxB;;AAED;EACE,uBAAuB,EACxB;;AAGD;EACE,cAAc;EACd,mBAAmB,EACpB;;AAKD;EACE,gBAAgB;EAChB,iBAAiB,EAClB;;ACxDD;EAEE,oBAAoB;EACpB,gBAAgB,EACjB;;AAOD;EACE,mBAAmB;EACnB,eAAe;EACf,mBAAmB;EAEnB,oBAAoB;EACpB,uB5C0oBkC;E4CzoBlC,uB5C2oBkC,E4CjoBnC;EAjBD;IpBjBE,6BxB0G6B;IwBzG5B,4BxByG4B,E4C7E5B;EAZH;IAcI,iBAAiB;IpBvBnB,gCxBkG6B;IwBjG5B,+BxBiG4B,E4CzE5B;;AASH;;EAEE,Y5C6oBkC,E4ChoBnC;EAfD;;IAKI,Y5C4oBgC,E4C3oBjC;EANH;;;IAWI,sBAAsB;IACtB,Y5CmoBgC;I4CloBhC,0B5CinBmC,E4ChnBpC;;AAGH;EACE,YAAY;EACZ,iBAAiB,EAClB;;AAED;EAKI,0B5CzD4B;E4C0D5B,e5C3D4B;E4C4D5B,oB5C6JwC,E4CpJzC;EAhBH;IAWM,eAAe,EAChB;EAZL;IAcM,e5CnE0B,E4CoE3B;;AAfL;EAsBI,WAAW;EACX,Y5CwB4B;E4CvB5B,0B5C1E0B;E4C2E1B,sB5C3E0B,E4CsF3B;EApCH;;;;;;;IA+BM,eAAe,EAChB;EAhCL;IAkCM,e5C8kBiC,E4C7kBlC;;ACnGH;EACE,e7CmfoC;E6ClfpC,0B7CmfoC,E6ChfrC;;AAED;;EACE,e7C4eoC,E6C1drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CoekC;I6CnelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7C6dkC;I6C5dlC,sB7C4dkC,E6C3dnC;;AAzBH;EACE,e7CufoC;E6CtfpC,0B7CufoC,E6CpfrC;;AAED;;EACE,e7CgfoC,E6C9drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CwekC;I6CvelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CiekC;I6ChelC,sB7CgekC,E6C/dnC;;AAzBH;EACE,e7C2foC;E6C1fpC,0B7C2foC,E6CxfrC;;AAED;;EACE,e7CofoC,E6ClerC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7C4ekC;I6C3elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CqekC;I6CpelC,sB7CoekC,E6CnenC;;AAzBH;EACE,e7C+foC;E6C9fpC,0B7C+foC,E6C5frC;;AAED;;EACE,e7CwfoC,E6CterC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CgfkC;I6C/elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CyekC;I6CxelC,sB7CwekC,E6CvenC;;AD8FL;EACE,cAAc;EACd,mBAAmB,EACpB;;AACD;EACE,iBAAiB;EACjB,iBAAiB,EAClB;;AE3HD;EACE,oB9C0D6B;E8CzD7B,uB9C6rBgC;E8C5rBhC,8BAA8B;EAC9B,mB9CmG6B;EDxCrB,0C+C1D0B,EACnC;;AAGD;EACE,c9CsrBgC,E8CprBjC;EAHD;IxCAI,aAAa;IACb,eAAe,EAChB;EwCFH;IxCII,YAAY,EACb;;AwCCH;EACE,mB9CirBqC;E8ChrBrC,qCAAqC;EtBpBrC,6BsBqBgD;EtBpB/C,4BsBoB+C,EAKjD;EARD;IAMI,eAAe,EAChB;;AAIH;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAe;EACf,eAAe,EAShB;EAbD;;;;;IAWI,eAAe,EAChB;;AAIH;EACE,mB9CspBqC;E8CrpBrC,0B9C2pBmC;E8C1pBnC,2B9CypBgC;EwBjsBhC,gCsByCmD;EtBxClD,+BsBwCkD,EACpD;;AAQD;;EAGI,iBAAiB,EAsBlB;EAzBH;;IAMM,oBAAoB;IACpB,iBAAiB,EAClB;EARL;;IAaQ,cAAc;ItBvEpB,6BsBwEsD;ItBvErD,4BsBuEqD,EACjD;EAfP;;IAqBQ,iBAAiB;ItBvEvB,gCsBwEyD;ItBvExD,+BsBuEwD,EACpD;;AAvBP;EtB1DE,2BsBsFgC;EtBrF/B,0BsBqF+B,EAC7B;;AAIL;EAEI,oBAAoB,EACrB;;AAEH;EACE,oBAAoB,EACrB;;AAOD;;;EAII,iBAAiB,EAMlB;EAVH;;;IAOM,mB9CmlB4B;I8CllB5B,oB9CklB4B,E8CjlB7B;;AATL;;EtBzGE,6BsBuHkD;EtBtHjD,4BsBsHiD,EAkBjD;EAhCH;;;;IAmBQ,4BAA6C;IAC7C,6BAA8C,EAU/C;IA9BP;;;;;;;;MAwBU,4BAA6C,EAC9C;IAzBT;;;;;;;;MA4BU,6BAA8C,EAC/C;;AA7BT;;EtBjGE,gCsBqIqD;EtBpIpD,+BsBoIoD,EAkBpD;EAtDH;;;;IAyCQ,+BAAgD;IAChD,gCAAiD,EAUlD;IApDP;;;;;;;;MA8CU,+BAAgD,EACjD;IA/CT;;;;;;;;MAkDU,gCAAiD,EAClD;;AAnDT;;;;EA2DI,2B9CzBgC,E8C0BjC;;AA5DH;;EA+DI,cAAc,EACf;;AAhEH;;EAmEI,UAAU,EAiCX;EApGH;;;;;;;;;;;;IA0EU,eAAe,EAChB;EA3ET;;;;;;;;;;;;IA8EU,gBAAgB,EACjB;EA/ET;;;;;;;;IAuFU,iBAAiB,EAClB;EAxFT;;;;;;;;IAgGU,iBAAiB,EAClB;;AAjGT;EAsGI,UAAU;EACV,iBAAiB,EAClB;;AASH;EACE,oB9C7J6B,E8CwL9B;EA5BD;IAKI,iBAAiB;IACjB,mB9CtH2B,E8C2H5B;IAXH;MASM,gBAAgB,EACjB;EAVL;IAcI,iBAAiB,EAMlB;IApBH;;MAkBM,2B9C6d4B,E8C5d7B;EAnBL;IAuBI,cAAc,EAIf;IA3BH;MAyBM,8B9Csd4B,E8Crd7B;;AAML;EC1PE,mB/C6sBgC,E8CjdjC;EAFD;ICvPI,e/CM4B;I+CL5B,0B/C0sBiC;I+CzsBjC,mB/CwsB8B,E+C/rB/B;ID4OH;MClPM,uB/CqsB4B,E+CpsB7B;IDiPL;MC/OM,e/CmsB+B;M+ClsB/B,0B/CH0B,E+CI3B;ED6OL;ICzOM,0B/C4rB4B,E+C3rB7B;;AD2OL;EC7PE,sB/Cc4B,E8CiP7B;EAFD;IC1PI,Y/C6sB8B;I+C5sB9B,0B/CU0B;I+CT1B,sB/CS0B,E+CA3B;ID+OH;MCrPM,0B/CMwB,E+CLzB;IDoPL;MClPM,e/CGwB;M+CFxB,uB/CosB4B,E+CnsB7B;EDgPL;IC5OM,6B/CHwB,E+CIzB;;AD8OL;EChQE,sB/CsfqC,E8CpPtC;EAFD;IC7PI,e/CifoC;I+ChfpC,0B/CifoC;I+ChfpC,sB/CifmC,E+CxepC;IDkPH;MCxPM,0B/C8eiC,E+C7elC;IDuPL;MCrPM,e/C0ekC;M+CzelC,0B/CwekC,E+CvenC;EDmPL;IC/OM,6B/CqeiC,E+CpelC;;ADiPL;ECnQE,sB/C0fqC,E8CrPtC;EAFD;IChQI,e/CqfoC;I+CpfpC,0B/CqfoC;I+CpfpC,sB/CqfmC,E+C5epC;IDqPH;MC3PM,0B/CkfiC,E+CjflC;ID0PL;MCxPM,e/C8ekC;M+C7elC,0B/C4ekC,E+C3enC;EDsPL;IClPM,6B/CyeiC,E+CxelC;;ADoPL;ECtQE,sB/C8fqC,E8CtPtC;EAFD;ICnQI,e/CyfoC;I+CxfpC,0B/CyfoC;I+CxfpC,sB/CyfmC,E+ChfpC;IDwPH;MC9PM,0B/CsfiC,E+CrflC;ID6PL;MC3PM,e/CkfkC;M+CjflC,0B/CgfkC,E+C/enC;EDyPL;ICrPM,6B/C6eiC,E+C5elC;;ADuPL;ECzQE,sB/CkgBqC,E8CvPtC;EAFD;ICtQI,e/C6foC;I+C5fpC,0B/C6foC;I+C5fpC,sB/C6fmC,E+CpfpC;ID2PH;MCjQM,0B/C0fiC,E+CzflC;IDgQL;MC9PM,e/CsfkC;M+CrflC,0B/CofkC,E+CnfnC;ED4PL;ICxPM,6B/CifiC,E+ChflC;;ACjBL;EACE,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,WAAW;EACX,iBAAiB,EAelB;EApBD;;;;;IAYI,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,UAAU,EACX;;AAIH;EACE,uBAAuB,EACxB;;AAGD;EACE,oBAAoB,EACrB;;AC5BD;EACE,iBAAiB;EACjB,cAAc;EACd,oBAAoB;EACpB,0BjDqvBmC;EiDpvBnC,0BjDqvBkC;EiDpvBlC,mBjDiG6B;EDxCrB,gDkDxDgC,EAKzC;EAZD;IASI,mBAAmB;IACnB,kCAAkB,EACnB;;AAIH;EACE,cAAc;EACd,mBjDuF6B,EiDtF9B;;AACD;EACE,aAAa;EACb,mBjDoF6B,EiDnF9B;;ACvBD;EACE,aAAa;EACb,gBAA2B;EAC3B,kBlDmzBgC;EkDlzBhC,eAAe;EACf,YlDkzBgC;EkDjzBhC,0BlDkzBwC;EkB1zBxC,agCSmB;EhCNnB,0BAAa,EgCiBd;EAlBD;IAWI,YlD4yB8B;IkD3yB9B,sBAAsB;IACtB,gBAAgB;IhCflB,agCgBqB;IhCbrB,0BAAa,EgCcZ;;AASH;EACE,WAAW;EACX,gBAAgB;EAChB,wBAAwB;EACxB,UAAU;EACV,yBAAyB,EAC1B;;ACzBD;EACE,iBAAiB,EAClB;;AAGD;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDmQ6B;EmDlQ7B,kCAAkC;EAIlC,WAAW,EAQZ;EArBD;IpD0HE,sCAA4B;IAGpB,8BAAoB;IAqEpB,4CoDhLqC;IpDgLrC,oCoDhLqC,EAC5C;EAnBH;IpD0HE,mCAA4B;IAGpB,2BAAoB,EoDzGoB;;AAElD;EACE,mBAAmB;EACnB,iBAAiB,EAClB;;AAGD;EACE,mBAAmB;EACnB,YAAY;EACZ,aAAa,EACd;;AAGD;EACE,mBAAmB;EACnB,uBnDuiBiD;EmDtiBjD,uBnD0iBiD;EmDziBjD,qCnDuiBiD;EmDtiBjD,mBnDuD6B;EDzCrB,yCoDb0B;EAClC,6BAA6B;EAE7B,WAAW,EACZ;;AAGD;EACE,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDoN6B;EmDnN7B,uBnD4hBgC,EmDxhBjC;EAXD;IjC5DE,WiCqE2B;IjClE3B,yBAAa,EiCkEmB;EATlC;IjC5DE,alBimB8B;IkB9lB9B,0BAAa,EiCmEuC;;AAKtD;EACE,cnDugBgC;EmDtgBhC,iCnDshBmC,EmDphBpC;EAJD;I7C/DI,aAAa;IACb,eAAe,EAChB;E6C6DH;I7C3DI,YAAY,EACb;;A6CgEH;EACE,iBAAiB,EAClB;;AAGD;EACE,UAAU;EACV,yBnD5BmC,EmD6BpC;;AAID;EACE,mBAAmB;EACnB,cnDifgC,EmDhfjC;;AAGD;EACE,cnD4egC;EmD3ehC,kBAAkB;EAClB,8BnD6fmC,EmD7epC;EAnBD;I7CvFI,aAAa;IACb,eAAe,EAChB;E6CqFH;I7CnFI,YAAY,EACb;E6CkFH;IAQI,iBAAiB;IACjB,iBAAiB,EAClB;EAVH;IAaI,kBAAkB,EACnB;EAdH;IAiBI,eAAe,EAChB;;AAIH;EACE,mBAAmB;EACnB,aAAa;EACb,YAAY;EACZ,aAAa;EACb,iBAAiB,EAClB;;AAGD;EAEE;IACE,anDme+B;ImDle/B,kBAAkB,EACnB;EACD;IpDtEQ,0CoDuE6B,EACpC;EAGD;IAAY,anD4dqB,EmD5dD,EAAA;;AAGlC;EACE;IAAY,anDsdqB,EmDtdD,EAAA;;AC9IlC;EACE,mBAAmB;EACnB,cpD+Q6B;EoD9Q7B,eAAe;ECRf,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EDHlB,gBpDwC4B;EkBlD5B,WkCYkB;ElCTlB,yBAAa,EkCgBd;EAhBD;IlCHE,alB+gB8B;IkB5gB9B,0BAAa,EkCWoC;EAXnD;IAYa,iBAAkB;IAAE,eAA+B,EAAI;EAZpE;IAaa,iBAAkB;IAAE,epDkgBA,EoDlgBmC;EAbpE;IAca,gBAAkB;IAAE,eAA+B,EAAI;EAdpE;IAea,kBAAkB;IAAE,epDggBA,EoDhgBmC;;AAIpE;EACE,iBpDmfiC;EoDlfjC,iBAAiB;EACjB,YpDmfgC;EoDlfhC,mBAAmB;EACnB,uBpDmfgC;EoDlfhC,mBpD8E6B,EoD7E9B;;AAGD;EACE,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAED;EAEI,UAAU;EACV,UAAU;EACV,kBpDse6B;EoDre7B,wBAAyD;EACzD,uBpDge8B,EoD/d/B;;AAPH;EASI,UAAU;EACV,WpDge6B;EoD/d7B,oBpD+d6B;EoD9d7B,wBAAyD;EACzD,uBpDyd8B,EoDxd/B;;AAdH;EAgBI,UAAU;EACV,UpDyd6B;EoDxd7B,oBpDwd6B;EoDvd7B,wBAAyD;EACzD,uBpDkd8B,EoDjd/B;;AArBH;EAuBI,SAAS;EACT,QAAQ;EACR,iBpDid6B;EoDhd7B,4BAA8E;EAC9E,yBpD2c8B,EoD1c/B;;AA5BH;EA8BI,SAAS;EACT,SAAS;EACT,iBpD0c6B;EoDzc7B,4BpDyc6B;EoDxc7B,wBpDoc8B,EoDnc/B;;AAnCH;EAqCI,OAAO;EACP,UAAU;EACV,kBpDmc6B;EoDlc7B,wBpDkc6B;EoDjc7B,0BpD6b8B,EoD5b/B;;AA1CH;EA4CI,OAAO;EACP,WpD6b6B;EoD5b7B,iBpD4b6B;EoD3b7B,wBpD2b6B;EoD1b7B,0BpDsb8B,EoDrb/B;;AAjDH;EAmDI,OAAO;EACP,UpDsb6B;EoDrb7B,iBpDqb6B;EoDpb7B,wBpDob6B;EoDnb7B,0BpD+a8B,EoD9a/B;;AE9FH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,ctD6Q6B;EsD5Q7B,cAAc;EACd,iBtDshByC;EsDrhBzC,aAAa;EDXb,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;ECAlB,gBtDmC4B;EsDjC5B,uBtD6gBwC;EsD5gBxC,6BAA6B;EAC7B,uBtDihBwC;EsDhhBxC,qCtD8gBwC;EsD7gBxC,mBtDwF6B;EDzCrB,0CuD9C2B,EAOpC;EAzBD;IAqBc,kBtDihB4B,EsDjhBS;EArBnD;IAsBc,kBtDghB4B,EsDhhBS;EAtBnD;IAuBc,iBtD+gB4B,EsD/gBQ;EAvBlD;IAwBc,mBtD8gB4B,EsD9gBU;;AAGpD;EACE,UAAU;EACV,kBAAkB;EAClB,gBtDgB4B;EsDf5B,0BtDogB0C;EsDngB1C,iCAA+B;EAC/B,2BAAwE,EACzE;;AAED;EACE,kBAAkB,EACnB;;AAMD;EAGI,mBAAmB;EACnB,eAAe;EACf,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAEH;EACE,mBtDmfyD,EsDlf1D;;AACD;EACE,mBtD2ewC;EsD1exC,YAAY,EACb;;AAED;EAEI,UAAU;EACV,mBtDyeuD;EsDxevD,uBAAuB;EACvB,0BtD2ewC;EsD1exC,sCtDweyC;EsDvezC,ctDqeuD,EsD7dxD;EAfH;IASM,aAAa;IACb,YAAY;IACZ,mBtD4doC;IsD3dpC,uBAAuB;IACvB,uBtD8coC,EsD7crC;;AAdL;EAiBI,SAAS;EACT,YtD0duD;EsDzdvD,kBtDyduD;EsDxdvD,qBAAqB;EACrB,4BtD2dwC;EsD1dxC,wCtDwdyC,EsDhd1C;EA9BH;IAwBM,aAAa;IACb,UAAU;IACV,ctD6coC;IsD5cpC,qBAAqB;IACrB,yBtD+boC,EsD9brC;;AA7BL;EAgCI,UAAU;EACV,mBtD2cuD;EsD1cvD,oBAAoB;EACpB,6BtD6cwC;EsD5cxC,yCtD0cyC;EsDzczC,WtDucuD,EsD/bxD;EA7CH;IAuCM,aAAa;IACb,SAAS;IACT,mBtD8boC;IsD7bpC,oBAAoB;IACpB,0BtDgboC,EsD/arC;;AA5CL;EAgDI,SAAS;EACT,atD2buD;EsD1bvD,kBtD0buD;EsDzbvD,sBAAsB;EACtB,2BtD4bwC;EsD3bxC,uCtDybyC,EsDjb1C;EA7DH;IAuDM,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,wBtDiaoC;IsDhapC,ctD4aoC,EsD3arC;;AC1HL;EACE,mBAAmB,EACpB;;AAED;EACE,mBAAmB;EACnB,iBAAiB;EACjB,YAAY,EA0Eb;EA7ED;IAMI,cAAc;IACd,mBAAmB;IxD0Kb,kCwDzKkC,EAgCzC;IAxCH;;MrDDE,eADmC;MAEnC,gBAAgB;MAChB,aAAa;MqDaT,eAAe,EAChB;IAGD;MAlBJ;QxDuMU,+CwDpL0C;QxDoL1C,uCwDpL0C;QxD4BlD,oCwD3BuC;QxD6B/B,4BwD7B+B;QxDuIvC,4BwDtI+B;QxDwIvB,oBwDxIuB,EAmB9B;QAxCH;UxDqIE,2CAA8B;UACtB,mCAAsB;UwD5GxB,QAAQ,EACT;QA3BP;UxDqIE,4CAA8B;UACtB,oCAAsB;UwDvGxB,QAAQ,EACT;QAhCP;UxDqIE,wCAA8B;UACtB,gCAAsB;UwDjGxB,QAAQ,EACT,EAAA;EAtCP;;;IA6CI,eAAe,EAChB;EA9CH;IAiDI,QAAQ,EACT;EAlDH;;IAsDI,mBAAmB;IACnB,OAAO;IACP,YAAY,EACb;EAzDH;IA4DI,WAAW,EACZ;EA7DH;IA+DI,YAAY,EACb;EAhEH;;IAmEI,QAAQ,EACT;EApEH;IAuEI,YAAY,EACb;EAxEH;IA0EI,WAAW,EACZ;;AAOH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,UAAU;EACV,WvD4sB+C;EkB1yB/C,alB2yB8C;EkBxyB9C,0BAAa;EqC6Fb,gBvD4sBgD;EuD3sBhD,YvDwsBgD;EuDvsBhD,mBAAmB;EACnB,0CvDosB0D;EuDnsB1D,8BAAsB,EA+DvB;EA1ED;IdjFE,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EciGvJ;EAlBH;IAoBI,WAAW;IACX,SAAS;IdtGX,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EcsGvJ;EAvBH;IA4BI,WAAW;IACX,YvDmrB8C;IuDlrB9C,sBAAsB;IrCvHxB,aqCwHqB;IrCrHrB,0BAAa,EqCsHZ;EAhCH;;;;IAuCI,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,WAAW;IACX,sBAAsB,EACvB;EA5CH;;IA+CI,UAAU;IACV,mBAAmB,EACpB;EAjDH;;IAoDI,WAAW;IACX,oBAAoB,EACrB;EAtDH;;IAyDI,YAAa;IACb,aAAa;IACb,eAAe;IACf,mBAAmB,EACpB;EA7DH;IAkEM,iBAAiB,EAClB;EAnEL;IAuEM,iBAAiB,EAClB;;AASL;EACE,mBAAmB;EACnB,aAAa;EACb,UAAU;EACV,YAAY;EACZ,WAAW;EACX,kBAAkB;EAClB,gBAAgB;EAChB,iBAAiB;EACjB,mBAAmB,EA8BpB;EAvCD;IAYI,sBAAsB;IACtB,YAAa;IACb,aAAa;IACb,YAAY;IACZ,oBAAoB;IACpB,uBvDonB8C;IuDnnB9C,oBAAoB;IACpB,gBAAgB;IAWhB,0BAA0B;IAC1B,8BAAsB,EACvB;EAhCH;IAkCI,UAAU;IACV,YAAa;IACb,aAAa;IACb,uBvD+lB8C,EuD9lB/C;;AAMH;EACE,mBAAmB;EACnB,UAAU;EACV,WAAW;EACX,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,qBAAqB;EACrB,YvDmlBgD;EuDllBhD,mBAAmB;EACnB,0CvDukB0D,EuDnkB3D;EAdD;IAYI,kBAAkB,EACnB;;AAKH;EAGE;;;;IAKI,YAAmC;IACnC,aAAoC;IACpC,kBAAwC;IACxC,gBAAuC,EACxC;EATH;;IAYI,mBAAyC,EAC1C;EAbH;;IAgBI,oBAA0C,EAC3C;EAIH;IACE,UAAU;IACV,WAAW;IACX,qBAAqB,EACtB;EAGD;IACE,aAAa,EACd,EAAA;;ACpQH;ElDOI,aAAa;EACb,eAAe,EAChB;;AkDTH;ElDWI,YAAY,EACb;;AkDTH;ECRE,eAAe;EACf,kBAAkB;EAClB,mBAAmB,EDQpB;;AACD;EACE,wBAAwB,EACzB;;AACD;EACE,uBAAuB,EACxB;;AAOD;EACE,yBAAyB,EAC1B;;AACD;EACE,0BAA0B,EAC3B;;AACD;EACE,mBAAmB,EACpB;;AACD;EEzBE,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,8BAA8B;EAC9B,UAAU,EFuBX;;AAOD;EACE,yBAAyB,EAC1B;;AAMD;EACE,gBAAgB,EACjB;;AGjCC;EACE,oBAAoB,EAAA;;ACNtB;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;ADiBH;;;;;;;;;;;;EAYE,yBAAyB,EAC1B;;AAED;EC5CE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD2CrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC/DE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD8DrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EClFE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADiFrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;ECrGE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADoGrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC9GE;IACE,yBAAyB,EAC1B,EAAA;;ADgHH;EClHE;IACE,yBAAyB,EAC1B,EAAA;;ADoHH;ECtHE;IACE,yBAAyB,EAC1B,EAAA;;ADwHH;EC1HE;IACE,yBAAyB,EAC1B,EAAA;;AAFD;EACE,yBAAyB,EAC1B;;ADqIH;ECjJE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD+IvC;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,0BAA0B,EAE7B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,2BAA2B,EAE9B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,iCAAiC,EAEpC,EAAA;;AAED;EChKE;IACE,yBAAyB,EAC1B,EAAA;;AClBH;;;;GAIG;AAEH,mBAAmB;AAEnB;EACE,kBAAkB;EAClB,uBAAuB,EACxB;;AAED;EACE;IACE,iBAAiB,EAClB,EAAA;;AAGH;EACE,gBAAgB,EACjB;;AAED;EACE,YAAY;EACZ,WAAW;EACX,uBAAuB,EACxB;;AAED;EACE,gBAAgB;EAChB,oBAAoB,EACrB;;AAED;EACE;IACE,oBAAoB,EACrB;EACD;IACE,cAAc,EACf,EAAA;;AAGH,oBAAoB;AAEpB;EACE,gBAAgB,EAyCjB;EA1CD;IAIM,sBAAsB;IACtB,YAAY,EAWb;IAhBL;MAOQ,kBAAkB;MAClB,qBAAqB;MACrB,kBAAkB;MAClB,YAAY,EAKb;MAfP;QAYU,YAAY;QACZ,uBAAuB,EACxB;EAdT;IAmBQ,YAAY;IACZ,uBAAuB,EAKxB;IAzBP;MAsBU,YAAY;MACZ,uBAAuB,EACxB;EAxBT;IA2BQ,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,sCAAsB;IACtB,0BAA0B;IAC1B,2BAA2B;IAC3B,uBAAuB;IAEvB,4CAA2B,EAI5B;IAvCP;MAqCU,oBAAoB,EACrB;;AAMT;EACE,WAAW;EACX,kBAAkB;EAClB,mBAAmB;EACnB,iBAAiB,EAClB;;AAED;EAEI,aAAa;EACb,6CAA6B,EAK9B;EARH;IAKM,kBAAkB;IAClB,qBAAqB,EACtB;;AAPL;EAUI,cAAc,EACf;;AAGH;EACE,aAAa,EACd;;AAED,qBAAqB;AAErB;EACE;IACE,gBAAgB;IAChB,UAAU;IACV,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,aAAa;IACb,iBAAiB;IACjB,iBAAiB;IACjB,uBAAuB;IACvB,UAAU;IACV,mBAAmB;IACnB,qBAAqB,EAUtB;IAtBD;MAcI,aAAa,EACd;IAfH;MAkBM,cAAc;MACd,kCAAkC,EACnC,EAAA;;AAKP;EACE,WAAW,EAUZ;EAXD;IAGI,eAAe;IACf,6BAA6B;IAC7B,sBAAsB;IACtB,YAAY,EAIb;IAVH;MAQM,YAAY,EACb;;AAIL,2BAA2B;AAE3B;EACE,eAAe;EACf,cAAc,EACf;;AAED;EACE,YAAY;EACZ,aAAa,EACd;;AAED,2BAA2B;AAE3B;EACE,gBAAgB,EACjB;;AAED;EACE,sBAAsB,EAcvB;EAfD;IAIM,sBAAsB;IACtB,YAAY;IACZ,0BAA0B,EAC3B;EAPL;IASM,eAAe,EAIhB;IAbL;MAWQ,eAAe,EAChB;;AAKP;EACE,sBAAsB,EAcvB;EAfD;IAIM,sBAAsB;IACtB,YAAY;IACZ,0BAA0B,EAC3B;EAPL;IASM,eAAe,EAIhB;IAbL;MAWQ,eAAe,EAChB;;AAKP;EACE,sBAAsB,EAcvB;EAfD;IAIM,sBAAsB;IACtB,YAAY;IACZ,0BAA0B,EAC3B;EAPL;IASM,eAAe,EAIhB;IAbL;MAWQ,eAAe,EAChB;;AAKP;EACE,mBAAmB,EACpB","file":"app.css","sourcesContent":["@charset \"UTF-8\";\n@import url(https://fonts.googleapis.com/css?family=Lato);\n/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%; }\n\nbody {\n  margin: 0; }\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline; }\n\naudio:not([controls]) {\n  display: none;\n  height: 0; }\n\n[hidden],\ntemplate {\n  display: none; }\n\na {\n  background-color: transparent; }\n\na:active,\na:hover {\n  outline: 0; }\n\nabbr[title] {\n  border-bottom: 1px dotted; }\n\nb,\nstrong {\n  font-weight: bold; }\n\ndfn {\n  font-style: italic; }\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0; }\n\nmark {\n  background: #ff0;\n  color: #000; }\n\nsmall {\n  font-size: 80%; }\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline; }\n\nsup {\n  top: -0.5em; }\n\nsub {\n  bottom: -0.25em; }\n\nimg {\n  border: 0; }\n\nsvg:not(:root) {\n  overflow: hidden; }\n\nfigure {\n  margin: 1em 40px; }\n\nhr {\n  box-sizing: content-box;\n  height: 0; }\n\npre {\n  overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em; }\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0; }\n\nbutton {\n  overflow: visible; }\n\nbutton,\nselect {\n  text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer; }\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0; }\n\ninput {\n  line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0; }\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto; }\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none; }\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em; }\n\nlegend {\n  border: 0;\n  padding: 0; }\n\ntextarea {\n  overflow: auto; }\n\noptgroup {\n  font-weight: bold; }\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0; }\n\ntd,\nth {\n  padding: 0; }\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important; }\n  a,\n  a:visited {\n    text-decoration: underline; }\n  a[href]:after {\n    content: \" (\" attr(href) \")\"; }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\"; }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\"; }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid; }\n  thead {\n    display: table-header-group; }\n  tr,\n  img {\n    page-break-inside: avoid; }\n  img {\n    max-width: 100% !important; }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3; }\n  h2,\n  h3 {\n    page-break-after: avoid; }\n  .navbar {\n    display: none; }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important; }\n  .label {\n    border: 1px solid #000; }\n  .table {\n    border-collapse: collapse !important; }\n    .table td,\n    .table th {\n      background-color: #fff !important; }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important; } }\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot\");\n  src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\"); }\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon-asterisk:before {\n  content: \"\\002a\"; }\n\n.glyphicon-plus:before {\n  content: \"\\002b\"; }\n\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\"; }\n\n.glyphicon-minus:before {\n  content: \"\\2212\"; }\n\n.glyphicon-cloud:before {\n  content: \"\\2601\"; }\n\n.glyphicon-envelope:before {\n  content: \"\\2709\"; }\n\n.glyphicon-pencil:before {\n  content: \"\\270f\"; }\n\n.glyphicon-glass:before {\n  content: \"\\e001\"; }\n\n.glyphicon-music:before {\n  content: \"\\e002\"; }\n\n.glyphicon-search:before {\n  content: \"\\e003\"; }\n\n.glyphicon-heart:before {\n  content: \"\\e005\"; }\n\n.glyphicon-star:before {\n  content: \"\\e006\"; }\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\"; }\n\n.glyphicon-user:before {\n  content: \"\\e008\"; }\n\n.glyphicon-film:before {\n  content: \"\\e009\"; }\n\n.glyphicon-th-large:before {\n  content: \"\\e010\"; }\n\n.glyphicon-th:before {\n  content: \"\\e011\"; }\n\n.glyphicon-th-list:before {\n  content: \"\\e012\"; }\n\n.glyphicon-ok:before {\n  content: \"\\e013\"; }\n\n.glyphicon-remove:before {\n  content: \"\\e014\"; }\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\"; }\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\"; }\n\n.glyphicon-off:before {\n  content: \"\\e017\"; }\n\n.glyphicon-signal:before {\n  content: \"\\e018\"; }\n\n.glyphicon-cog:before {\n  content: \"\\e019\"; }\n\n.glyphicon-trash:before {\n  content: \"\\e020\"; }\n\n.glyphicon-home:before {\n  content: \"\\e021\"; }\n\n.glyphicon-file:before {\n  content: \"\\e022\"; }\n\n.glyphicon-time:before {\n  content: \"\\e023\"; }\n\n.glyphicon-road:before {\n  content: \"\\e024\"; }\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\"; }\n\n.glyphicon-download:before {\n  content: \"\\e026\"; }\n\n.glyphicon-upload:before {\n  content: \"\\e027\"; }\n\n.glyphicon-inbox:before {\n  content: \"\\e028\"; }\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\"; }\n\n.glyphicon-repeat:before {\n  content: \"\\e030\"; }\n\n.glyphicon-refresh:before {\n  content: \"\\e031\"; }\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\"; }\n\n.glyphicon-lock:before {\n  content: \"\\e033\"; }\n\n.glyphicon-flag:before {\n  content: \"\\e034\"; }\n\n.glyphicon-headphones:before {\n  content: \"\\e035\"; }\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\"; }\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\"; }\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\"; }\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\"; }\n\n.glyphicon-barcode:before {\n  content: \"\\e040\"; }\n\n.glyphicon-tag:before {\n  content: \"\\e041\"; }\n\n.glyphicon-tags:before {\n  content: \"\\e042\"; }\n\n.glyphicon-book:before {\n  content: \"\\e043\"; }\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\"; }\n\n.glyphicon-print:before {\n  content: \"\\e045\"; }\n\n.glyphicon-camera:before {\n  content: \"\\e046\"; }\n\n.glyphicon-font:before {\n  content: \"\\e047\"; }\n\n.glyphicon-bold:before {\n  content: \"\\e048\"; }\n\n.glyphicon-italic:before {\n  content: \"\\e049\"; }\n\n.glyphicon-text-height:before {\n  content: \"\\e050\"; }\n\n.glyphicon-text-width:before {\n  content: \"\\e051\"; }\n\n.glyphicon-align-left:before {\n  content: \"\\e052\"; }\n\n.glyphicon-align-center:before {\n  content: \"\\e053\"; }\n\n.glyphicon-align-right:before {\n  content: \"\\e054\"; }\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\"; }\n\n.glyphicon-list:before {\n  content: \"\\e056\"; }\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\"; }\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\"; }\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\"; }\n\n.glyphicon-picture:before {\n  content: \"\\e060\"; }\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\"; }\n\n.glyphicon-adjust:before {\n  content: \"\\e063\"; }\n\n.glyphicon-tint:before {\n  content: \"\\e064\"; }\n\n.glyphicon-edit:before {\n  content: \"\\e065\"; }\n\n.glyphicon-share:before {\n  content: \"\\e066\"; }\n\n.glyphicon-check:before {\n  content: \"\\e067\"; }\n\n.glyphicon-move:before {\n  content: \"\\e068\"; }\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\"; }\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\"; }\n\n.glyphicon-backward:before {\n  content: \"\\e071\"; }\n\n.glyphicon-play:before {\n  content: \"\\e072\"; }\n\n.glyphicon-pause:before {\n  content: \"\\e073\"; }\n\n.glyphicon-stop:before {\n  content: \"\\e074\"; }\n\n.glyphicon-forward:before {\n  content: \"\\e075\"; }\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\"; }\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\"; }\n\n.glyphicon-eject:before {\n  content: \"\\e078\"; }\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\"; }\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\"; }\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\"; }\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\"; }\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\"; }\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\"; }\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\"; }\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\"; }\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\"; }\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\"; }\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\"; }\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\"; }\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\"; }\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\"; }\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\"; }\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\"; }\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\"; }\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\"; }\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\"; }\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\"; }\n\n.glyphicon-gift:before {\n  content: \"\\e102\"; }\n\n.glyphicon-leaf:before {\n  content: \"\\e103\"; }\n\n.glyphicon-fire:before {\n  content: \"\\e104\"; }\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\"; }\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\"; }\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\"; }\n\n.glyphicon-plane:before {\n  content: \"\\e108\"; }\n\n.glyphicon-calendar:before {\n  content: \"\\e109\"; }\n\n.glyphicon-random:before {\n  content: \"\\e110\"; }\n\n.glyphicon-comment:before {\n  content: \"\\e111\"; }\n\n.glyphicon-magnet:before {\n  content: \"\\e112\"; }\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\"; }\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\"; }\n\n.glyphicon-retweet:before {\n  content: \"\\e115\"; }\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\"; }\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\"; }\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\"; }\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\"; }\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\"; }\n\n.glyphicon-hdd:before {\n  content: \"\\e121\"; }\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\"; }\n\n.glyphicon-bell:before {\n  content: \"\\e123\"; }\n\n.glyphicon-certificate:before {\n  content: \"\\e124\"; }\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\"; }\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\"; }\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\"; }\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\"; }\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\"; }\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\"; }\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\"; }\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\"; }\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\"; }\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\"; }\n\n.glyphicon-globe:before {\n  content: \"\\e135\"; }\n\n.glyphicon-wrench:before {\n  content: \"\\e136\"; }\n\n.glyphicon-tasks:before {\n  content: \"\\e137\"; }\n\n.glyphicon-filter:before {\n  content: \"\\e138\"; }\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\"; }\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\"; }\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\"; }\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\"; }\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\"; }\n\n.glyphicon-link:before {\n  content: \"\\e144\"; }\n\n.glyphicon-phone:before {\n  content: \"\\e145\"; }\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\"; }\n\n.glyphicon-usd:before {\n  content: \"\\e148\"; }\n\n.glyphicon-gbp:before {\n  content: \"\\e149\"; }\n\n.glyphicon-sort:before {\n  content: \"\\e150\"; }\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\"; }\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\"; }\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\"; }\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\"; }\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\"; }\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\"; }\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\"; }\n\n.glyphicon-expand:before {\n  content: \"\\e158\"; }\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\"; }\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\"; }\n\n.glyphicon-log-in:before {\n  content: \"\\e161\"; }\n\n.glyphicon-flash:before {\n  content: \"\\e162\"; }\n\n.glyphicon-log-out:before {\n  content: \"\\e163\"; }\n\n.glyphicon-new-window:before {\n  content: \"\\e164\"; }\n\n.glyphicon-record:before {\n  content: \"\\e165\"; }\n\n.glyphicon-save:before {\n  content: \"\\e166\"; }\n\n.glyphicon-open:before {\n  content: \"\\e167\"; }\n\n.glyphicon-saved:before {\n  content: \"\\e168\"; }\n\n.glyphicon-import:before {\n  content: \"\\e169\"; }\n\n.glyphicon-export:before {\n  content: \"\\e170\"; }\n\n.glyphicon-send:before {\n  content: \"\\e171\"; }\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\"; }\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\"; }\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\"; }\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\"; }\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\"; }\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\"; }\n\n.glyphicon-transfer:before {\n  content: \"\\e178\"; }\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\"; }\n\n.glyphicon-header:before {\n  content: \"\\e180\"; }\n\n.glyphicon-compressed:before {\n  content: \"\\e181\"; }\n\n.glyphicon-earphone:before {\n  content: \"\\e182\"; }\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\"; }\n\n.glyphicon-tower:before {\n  content: \"\\e184\"; }\n\n.glyphicon-stats:before {\n  content: \"\\e185\"; }\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\"; }\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\"; }\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\"; }\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\"; }\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\"; }\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\"; }\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\"; }\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\"; }\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\"; }\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\"; }\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\"; }\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\"; }\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\"; }\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\"; }\n\n.glyphicon-cd:before {\n  content: \"\\e201\"; }\n\n.glyphicon-save-file:before {\n  content: \"\\e202\"; }\n\n.glyphicon-open-file:before {\n  content: \"\\e203\"; }\n\n.glyphicon-level-up:before {\n  content: \"\\e204\"; }\n\n.glyphicon-copy:before {\n  content: \"\\e205\"; }\n\n.glyphicon-paste:before {\n  content: \"\\e206\"; }\n\n.glyphicon-alert:before {\n  content: \"\\e209\"; }\n\n.glyphicon-equalizer:before {\n  content: \"\\e210\"; }\n\n.glyphicon-king:before {\n  content: \"\\e211\"; }\n\n.glyphicon-queen:before {\n  content: \"\\e212\"; }\n\n.glyphicon-pawn:before {\n  content: \"\\e213\"; }\n\n.glyphicon-bishop:before {\n  content: \"\\e214\"; }\n\n.glyphicon-knight:before {\n  content: \"\\e215\"; }\n\n.glyphicon-baby-formula:before {\n  content: \"\\e216\"; }\n\n.glyphicon-tent:before {\n  content: \"\\26fa\"; }\n\n.glyphicon-blackboard:before {\n  content: \"\\e218\"; }\n\n.glyphicon-bed:before {\n  content: \"\\e219\"; }\n\n.glyphicon-apple:before {\n  content: \"\\f8ff\"; }\n\n.glyphicon-erase:before {\n  content: \"\\e221\"; }\n\n.glyphicon-hourglass:before {\n  content: \"\\231b\"; }\n\n.glyphicon-lamp:before {\n  content: \"\\e223\"; }\n\n.glyphicon-duplicate:before {\n  content: \"\\e224\"; }\n\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\"; }\n\n.glyphicon-scissors:before {\n  content: \"\\e226\"; }\n\n.glyphicon-bitcoin:before {\n  content: \"\\e227\"; }\n\n.glyphicon-btc:before {\n  content: \"\\e227\"; }\n\n.glyphicon-xbt:before {\n  content: \"\\e227\"; }\n\n.glyphicon-yen:before {\n  content: \"\\00a5\"; }\n\n.glyphicon-jpy:before {\n  content: \"\\00a5\"; }\n\n.glyphicon-ruble:before {\n  content: \"\\20bd\"; }\n\n.glyphicon-rub:before {\n  content: \"\\20bd\"; }\n\n.glyphicon-scale:before {\n  content: \"\\e230\"; }\n\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\"; }\n\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\"; }\n\n.glyphicon-education:before {\n  content: \"\\e233\"; }\n\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\"; }\n\n.glyphicon-option-vertical:before {\n  content: \"\\e235\"; }\n\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\"; }\n\n.glyphicon-modal-window:before {\n  content: \"\\e237\"; }\n\n.glyphicon-oil:before {\n  content: \"\\e238\"; }\n\n.glyphicon-grain:before {\n  content: \"\\e239\"; }\n\n.glyphicon-sunglasses:before {\n  content: \"\\e240\"; }\n\n.glyphicon-text-size:before {\n  content: \"\\e241\"; }\n\n.glyphicon-text-color:before {\n  content: \"\\e242\"; }\n\n.glyphicon-text-background:before {\n  content: \"\\e243\"; }\n\n.glyphicon-object-align-top:before {\n  content: \"\\e244\"; }\n\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\"; }\n\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\"; }\n\n.glyphicon-object-align-left:before {\n  content: \"\\e247\"; }\n\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\"; }\n\n.glyphicon-object-align-right:before {\n  content: \"\\e249\"; }\n\n.glyphicon-triangle-right:before {\n  content: \"\\e250\"; }\n\n.glyphicon-triangle-left:before {\n  content: \"\\e251\"; }\n\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\"; }\n\n.glyphicon-triangle-top:before {\n  content: \"\\e253\"; }\n\n.glyphicon-console:before {\n  content: \"\\e254\"; }\n\n.glyphicon-superscript:before {\n  content: \"\\e255\"; }\n\n.glyphicon-subscript:before {\n  content: \"\\e256\"; }\n\n.glyphicon-menu-left:before {\n  content: \"\\e257\"; }\n\n.glyphicon-menu-right:before {\n  content: \"\\e258\"; }\n\n.glyphicon-menu-down:before {\n  content: \"\\e259\"; }\n\n.glyphicon-menu-up:before {\n  content: \"\\e260\"; }\n\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: transparent; }\n\nbody {\n  font-family: \"Lato\", sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #fff; }\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit; }\n\na {\n  color: #337ab7;\n  text-decoration: none; }\n  a:hover, a:focus {\n    color: #23527c;\n    text-decoration: underline; }\n  a:focus {\n    outline: thin dotted;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px; }\n\nfigure {\n  margin: 0; }\n\nimg {\n  vertical-align: middle; }\n\n.img-responsive {\n  display: block;\n  max-width: 100%;\n  height: auto; }\n\n.img-rounded {\n  border-radius: 6px; }\n\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto; }\n\n.img-circle {\n  border-radius: 50%; }\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee; }\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto; }\n\n[role=\"button\"] {\n  cursor: pointer; }\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit; }\n  h1 small,\n  h1 .small, h2 small,\n  h2 .small, h3 small,\n  h3 .small, h4 small,\n  h4 .small, h5 small,\n  h5 .small, h6 small,\n  h6 .small,\n  .h1 small,\n  .h1 .small, .h2 small,\n  .h2 .small, .h3 small,\n  .h3 .small, .h4 small,\n  .h4 .small, .h5 small,\n  .h5 .small, .h6 small,\n  .h6 .small {\n    font-weight: normal;\n    line-height: 1;\n    color: #777777; }\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: 20px;\n  margin-bottom: 10px; }\n  h1 small,\n  h1 .small, .h1 small,\n  .h1 .small,\n  h2 small,\n  h2 .small, .h2 small,\n  .h2 .small,\n  h3 small,\n  h3 .small, .h3 small,\n  .h3 .small {\n    font-size: 65%; }\n\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: 10px;\n  margin-bottom: 10px; }\n  h4 small,\n  h4 .small, .h4 small,\n  .h4 .small,\n  h5 small,\n  h5 .small, .h5 small,\n  .h5 .small,\n  h6 small,\n  h6 .small, .h6 small,\n  .h6 .small {\n    font-size: 75%; }\n\nh1, .h1 {\n  font-size: 36px; }\n\nh2, .h2 {\n  font-size: 30px; }\n\nh3, .h3 {\n  font-size: 24px; }\n\nh4, .h4 {\n  font-size: 18px; }\n\nh5, .h5 {\n  font-size: 14px; }\n\nh6, .h6 {\n  font-size: 12px; }\n\np {\n  margin: 0 0 10px; }\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4; }\n  @media (min-width: 768px) {\n    .lead {\n      font-size: 21px; } }\n\nsmall,\n.small {\n  font-size: 85%; }\n\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em; }\n\n.text-left {\n  text-align: left; }\n\n.text-right {\n  text-align: right; }\n\n.text-center {\n  text-align: center; }\n\n.text-justify {\n  text-align: justify; }\n\n.text-nowrap {\n  white-space: nowrap; }\n\n.text-lowercase {\n  text-transform: lowercase; }\n\n.text-uppercase, .initialism {\n  text-transform: uppercase; }\n\n.text-capitalize {\n  text-transform: capitalize; }\n\n.text-muted {\n  color: #777777; }\n\n.text-primary {\n  color: #337ab7; }\n\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090; }\n\n.text-success {\n  color: #3c763d; }\n\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c; }\n\n.text-info {\n  color: #31708f; }\n\na.text-info:hover,\na.text-info:focus {\n  color: #245269; }\n\n.text-warning {\n  color: #8a6d3b; }\n\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c; }\n\n.text-danger {\n  color: #a94442; }\n\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534; }\n\n.bg-primary {\n  color: #fff; }\n\n.bg-primary {\n  background-color: #337ab7; }\n\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090; }\n\n.bg-success {\n  background-color: #dff0d8; }\n\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3; }\n\n.bg-info {\n  background-color: #d9edf7; }\n\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee; }\n\n.bg-warning {\n  background-color: #fcf8e3; }\n\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5; }\n\n.bg-danger {\n  background-color: #f2dede; }\n\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9; }\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee; }\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px; }\n  ul ul,\n  ul ol,\n  ol ul,\n  ol ol {\n    margin-bottom: 0; }\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none; }\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px; }\n  .list-inline > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px; }\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px; }\n\ndt,\ndd {\n  line-height: 1.428571429; }\n\ndt {\n  font-weight: bold; }\n\ndd {\n  margin-left: 0; }\n\n.dl-horizontal dd:before, .dl-horizontal dd:after {\n  content: \" \";\n  display: table; }\n\n.dl-horizontal dd:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap; }\n  .dl-horizontal dd {\n    margin-left: 180px; } }\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777; }\n\n.initialism {\n  font-size: 90%; }\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee; }\n  blockquote p:last-child,\n  blockquote ul:last-child,\n  blockquote ol:last-child {\n    margin-bottom: 0; }\n  blockquote footer,\n  blockquote small,\n  blockquote .small {\n    display: block;\n    font-size: 80%;\n    line-height: 1.428571429;\n    color: #777777; }\n    blockquote footer:before,\n    blockquote small:before,\n    blockquote .small:before {\n      content: '\\2014 \\00A0'; }\n\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right; }\n  .blockquote-reverse footer:before,\n  .blockquote-reverse small:before,\n  .blockquote-reverse .small:before,\n  blockquote.pull-right footer:before,\n  blockquote.pull-right small:before,\n  blockquote.pull-right .small:before {\n    content: ''; }\n  .blockquote-reverse footer:after,\n  .blockquote-reverse small:after,\n  .blockquote-reverse .small:after,\n  blockquote.pull-right footer:after,\n  blockquote.pull-right small:after,\n  blockquote.pull-right .small:after {\n    content: '\\00A0 \\2014'; }\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429; }\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px; }\n\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }\n  kbd kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none; }\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px; }\n  pre code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0; }\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll; }\n\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px; }\n  .container:before, .container:after {\n    content: \" \";\n    display: table; }\n  .container:after {\n    clear: both; }\n  @media (min-width: 768px) {\n    .container {\n      width: 750px; } }\n  @media (min-width: 992px) {\n    .container {\n      width: 970px; } }\n  @media (min-width: 1200px) {\n    .container {\n      width: 1170px; } }\n\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px; }\n  .container-fluid:before, .container-fluid:after {\n    content: \" \";\n    display: table; }\n  .container-fluid:after {\n    clear: both; }\n\n.row {\n  margin-left: -15px;\n  margin-right: -15px; }\n  .row:before, .row:after {\n    content: \" \";\n    display: table; }\n  .row:after {\n    clear: both; }\n\n.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 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px; }\n\n.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 {\n  float: left; }\n\n.col-xs-1 {\n  width: 8.3333333333%; }\n\n.col-xs-2 {\n  width: 16.6666666667%; }\n\n.col-xs-3 {\n  width: 25%; }\n\n.col-xs-4 {\n  width: 33.3333333333%; }\n\n.col-xs-5 {\n  width: 41.6666666667%; }\n\n.col-xs-6 {\n  width: 50%; }\n\n.col-xs-7 {\n  width: 58.3333333333%; }\n\n.col-xs-8 {\n  width: 66.6666666667%; }\n\n.col-xs-9 {\n  width: 75%; }\n\n.col-xs-10 {\n  width: 83.3333333333%; }\n\n.col-xs-11 {\n  width: 91.6666666667%; }\n\n.col-xs-12 {\n  width: 100%; }\n\n.col-xs-pull-0 {\n  right: auto; }\n\n.col-xs-pull-1 {\n  right: 8.3333333333%; }\n\n.col-xs-pull-2 {\n  right: 16.6666666667%; }\n\n.col-xs-pull-3 {\n  right: 25%; }\n\n.col-xs-pull-4 {\n  right: 33.3333333333%; }\n\n.col-xs-pull-5 {\n  right: 41.6666666667%; }\n\n.col-xs-pull-6 {\n  right: 50%; }\n\n.col-xs-pull-7 {\n  right: 58.3333333333%; }\n\n.col-xs-pull-8 {\n  right: 66.6666666667%; }\n\n.col-xs-pull-9 {\n  right: 75%; }\n\n.col-xs-pull-10 {\n  right: 83.3333333333%; }\n\n.col-xs-pull-11 {\n  right: 91.6666666667%; }\n\n.col-xs-pull-12 {\n  right: 100%; }\n\n.col-xs-push-0 {\n  left: auto; }\n\n.col-xs-push-1 {\n  left: 8.3333333333%; }\n\n.col-xs-push-2 {\n  left: 16.6666666667%; }\n\n.col-xs-push-3 {\n  left: 25%; }\n\n.col-xs-push-4 {\n  left: 33.3333333333%; }\n\n.col-xs-push-5 {\n  left: 41.6666666667%; }\n\n.col-xs-push-6 {\n  left: 50%; }\n\n.col-xs-push-7 {\n  left: 58.3333333333%; }\n\n.col-xs-push-8 {\n  left: 66.6666666667%; }\n\n.col-xs-push-9 {\n  left: 75%; }\n\n.col-xs-push-10 {\n  left: 83.3333333333%; }\n\n.col-xs-push-11 {\n  left: 91.6666666667%; }\n\n.col-xs-push-12 {\n  left: 100%; }\n\n.col-xs-offset-0 {\n  margin-left: 0%; }\n\n.col-xs-offset-1 {\n  margin-left: 8.3333333333%; }\n\n.col-xs-offset-2 {\n  margin-left: 16.6666666667%; }\n\n.col-xs-offset-3 {\n  margin-left: 25%; }\n\n.col-xs-offset-4 {\n  margin-left: 33.3333333333%; }\n\n.col-xs-offset-5 {\n  margin-left: 41.6666666667%; }\n\n.col-xs-offset-6 {\n  margin-left: 50%; }\n\n.col-xs-offset-7 {\n  margin-left: 58.3333333333%; }\n\n.col-xs-offset-8 {\n  margin-left: 66.6666666667%; }\n\n.col-xs-offset-9 {\n  margin-left: 75%; }\n\n.col-xs-offset-10 {\n  margin-left: 83.3333333333%; }\n\n.col-xs-offset-11 {\n  margin-left: 91.6666666667%; }\n\n.col-xs-offset-12 {\n  margin-left: 100%; }\n\n@media (min-width: 768px) {\n  .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 {\n    float: left; }\n  .col-sm-1 {\n    width: 8.3333333333%; }\n  .col-sm-2 {\n    width: 16.6666666667%; }\n  .col-sm-3 {\n    width: 25%; }\n  .col-sm-4 {\n    width: 33.3333333333%; }\n  .col-sm-5 {\n    width: 41.6666666667%; }\n  .col-sm-6 {\n    width: 50%; }\n  .col-sm-7 {\n    width: 58.3333333333%; }\n  .col-sm-8 {\n    width: 66.6666666667%; }\n  .col-sm-9 {\n    width: 75%; }\n  .col-sm-10 {\n    width: 83.3333333333%; }\n  .col-sm-11 {\n    width: 91.6666666667%; }\n  .col-sm-12 {\n    width: 100%; }\n  .col-sm-pull-0 {\n    right: auto; }\n  .col-sm-pull-1 {\n    right: 8.3333333333%; }\n  .col-sm-pull-2 {\n    right: 16.6666666667%; }\n  .col-sm-pull-3 {\n    right: 25%; }\n  .col-sm-pull-4 {\n    right: 33.3333333333%; }\n  .col-sm-pull-5 {\n    right: 41.6666666667%; }\n  .col-sm-pull-6 {\n    right: 50%; }\n  .col-sm-pull-7 {\n    right: 58.3333333333%; }\n  .col-sm-pull-8 {\n    right: 66.6666666667%; }\n  .col-sm-pull-9 {\n    right: 75%; }\n  .col-sm-pull-10 {\n    right: 83.3333333333%; }\n  .col-sm-pull-11 {\n    right: 91.6666666667%; }\n  .col-sm-pull-12 {\n    right: 100%; }\n  .col-sm-push-0 {\n    left: auto; }\n  .col-sm-push-1 {\n    left: 8.3333333333%; }\n  .col-sm-push-2 {\n    left: 16.6666666667%; }\n  .col-sm-push-3 {\n    left: 25%; }\n  .col-sm-push-4 {\n    left: 33.3333333333%; }\n  .col-sm-push-5 {\n    left: 41.6666666667%; }\n  .col-sm-push-6 {\n    left: 50%; }\n  .col-sm-push-7 {\n    left: 58.3333333333%; }\n  .col-sm-push-8 {\n    left: 66.6666666667%; }\n  .col-sm-push-9 {\n    left: 75%; }\n  .col-sm-push-10 {\n    left: 83.3333333333%; }\n  .col-sm-push-11 {\n    left: 91.6666666667%; }\n  .col-sm-push-12 {\n    left: 100%; }\n  .col-sm-offset-0 {\n    margin-left: 0%; }\n  .col-sm-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-sm-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-sm-offset-3 {\n    margin-left: 25%; }\n  .col-sm-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-sm-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-sm-offset-6 {\n    margin-left: 50%; }\n  .col-sm-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-sm-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-sm-offset-9 {\n    margin-left: 75%; }\n  .col-sm-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-sm-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-sm-offset-12 {\n    margin-left: 100%; } }\n\n@media (min-width: 992px) {\n  .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 {\n    float: left; }\n  .col-md-1 {\n    width: 8.3333333333%; }\n  .col-md-2 {\n    width: 16.6666666667%; }\n  .col-md-3 {\n    width: 25%; }\n  .col-md-4 {\n    width: 33.3333333333%; }\n  .col-md-5 {\n    width: 41.6666666667%; }\n  .col-md-6 {\n    width: 50%; }\n  .col-md-7 {\n    width: 58.3333333333%; }\n  .col-md-8 {\n    width: 66.6666666667%; }\n  .col-md-9 {\n    width: 75%; }\n  .col-md-10 {\n    width: 83.3333333333%; }\n  .col-md-11 {\n    width: 91.6666666667%; }\n  .col-md-12 {\n    width: 100%; }\n  .col-md-pull-0 {\n    right: auto; }\n  .col-md-pull-1 {\n    right: 8.3333333333%; }\n  .col-md-pull-2 {\n    right: 16.6666666667%; }\n  .col-md-pull-3 {\n    right: 25%; }\n  .col-md-pull-4 {\n    right: 33.3333333333%; }\n  .col-md-pull-5 {\n    right: 41.6666666667%; }\n  .col-md-pull-6 {\n    right: 50%; }\n  .col-md-pull-7 {\n    right: 58.3333333333%; }\n  .col-md-pull-8 {\n    right: 66.6666666667%; }\n  .col-md-pull-9 {\n    right: 75%; }\n  .col-md-pull-10 {\n    right: 83.3333333333%; }\n  .col-md-pull-11 {\n    right: 91.6666666667%; }\n  .col-md-pull-12 {\n    right: 100%; }\n  .col-md-push-0 {\n    left: auto; }\n  .col-md-push-1 {\n    left: 8.3333333333%; }\n  .col-md-push-2 {\n    left: 16.6666666667%; }\n  .col-md-push-3 {\n    left: 25%; }\n  .col-md-push-4 {\n    left: 33.3333333333%; }\n  .col-md-push-5 {\n    left: 41.6666666667%; }\n  .col-md-push-6 {\n    left: 50%; }\n  .col-md-push-7 {\n    left: 58.3333333333%; }\n  .col-md-push-8 {\n    left: 66.6666666667%; }\n  .col-md-push-9 {\n    left: 75%; }\n  .col-md-push-10 {\n    left: 83.3333333333%; }\n  .col-md-push-11 {\n    left: 91.6666666667%; }\n  .col-md-push-12 {\n    left: 100%; }\n  .col-md-offset-0 {\n    margin-left: 0%; }\n  .col-md-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-md-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-md-offset-3 {\n    margin-left: 25%; }\n  .col-md-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-md-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-md-offset-6 {\n    margin-left: 50%; }\n  .col-md-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-md-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-md-offset-9 {\n    margin-left: 75%; }\n  .col-md-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-md-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-md-offset-12 {\n    margin-left: 100%; } }\n\n@media (min-width: 1200px) {\n  .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 {\n    float: left; }\n  .col-lg-1 {\n    width: 8.3333333333%; }\n  .col-lg-2 {\n    width: 16.6666666667%; }\n  .col-lg-3 {\n    width: 25%; }\n  .col-lg-4 {\n    width: 33.3333333333%; }\n  .col-lg-5 {\n    width: 41.6666666667%; }\n  .col-lg-6 {\n    width: 50%; }\n  .col-lg-7 {\n    width: 58.3333333333%; }\n  .col-lg-8 {\n    width: 66.6666666667%; }\n  .col-lg-9 {\n    width: 75%; }\n  .col-lg-10 {\n    width: 83.3333333333%; }\n  .col-lg-11 {\n    width: 91.6666666667%; }\n  .col-lg-12 {\n    width: 100%; }\n  .col-lg-pull-0 {\n    right: auto; }\n  .col-lg-pull-1 {\n    right: 8.3333333333%; }\n  .col-lg-pull-2 {\n    right: 16.6666666667%; }\n  .col-lg-pull-3 {\n    right: 25%; }\n  .col-lg-pull-4 {\n    right: 33.3333333333%; }\n  .col-lg-pull-5 {\n    right: 41.6666666667%; }\n  .col-lg-pull-6 {\n    right: 50%; }\n  .col-lg-pull-7 {\n    right: 58.3333333333%; }\n  .col-lg-pull-8 {\n    right: 66.6666666667%; }\n  .col-lg-pull-9 {\n    right: 75%; }\n  .col-lg-pull-10 {\n    right: 83.3333333333%; }\n  .col-lg-pull-11 {\n    right: 91.6666666667%; }\n  .col-lg-pull-12 {\n    right: 100%; }\n  .col-lg-push-0 {\n    left: auto; }\n  .col-lg-push-1 {\n    left: 8.3333333333%; }\n  .col-lg-push-2 {\n    left: 16.6666666667%; }\n  .col-lg-push-3 {\n    left: 25%; }\n  .col-lg-push-4 {\n    left: 33.3333333333%; }\n  .col-lg-push-5 {\n    left: 41.6666666667%; }\n  .col-lg-push-6 {\n    left: 50%; }\n  .col-lg-push-7 {\n    left: 58.3333333333%; }\n  .col-lg-push-8 {\n    left: 66.6666666667%; }\n  .col-lg-push-9 {\n    left: 75%; }\n  .col-lg-push-10 {\n    left: 83.3333333333%; }\n  .col-lg-push-11 {\n    left: 91.6666666667%; }\n  .col-lg-push-12 {\n    left: 100%; }\n  .col-lg-offset-0 {\n    margin-left: 0%; }\n  .col-lg-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-lg-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-lg-offset-3 {\n    margin-left: 25%; }\n  .col-lg-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-lg-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-lg-offset-6 {\n    margin-left: 50%; }\n  .col-lg-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-lg-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-lg-offset-9 {\n    margin-left: 75%; }\n  .col-lg-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-lg-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-lg-offset-12 {\n    margin-left: 100%; } }\n\ntable {\n  background-color: transparent; }\n\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left; }\n\nth {\n  text-align: left; }\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px; }\n  .table > thead > tr > th,\n  .table > thead > tr > td,\n  .table > tbody > tr > th,\n  .table > tbody > tr > td,\n  .table > tfoot > tr > th,\n  .table > tfoot > tr > td {\n    padding: 8px;\n    line-height: 1.428571429;\n    vertical-align: top;\n    border-top: 1px solid #ddd; }\n  .table > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid #ddd; }\n  .table > caption + thead > tr:first-child > th,\n  .table > caption + thead > tr:first-child > td,\n  .table > colgroup + thead > tr:first-child > th,\n  .table > colgroup + thead > tr:first-child > td,\n  .table > thead:first-child > tr:first-child > th,\n  .table > thead:first-child > tr:first-child > td {\n    border-top: 0; }\n  .table > tbody + tbody {\n    border-top: 2px solid #ddd; }\n  .table .table {\n    background-color: #fff; }\n\n.table-condensed > thead > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > tfoot > tr > td {\n  padding: 5px; }\n\n.table-bordered {\n  border: 1px solid #ddd; }\n  .table-bordered > thead > tr > th,\n  .table-bordered > thead > tr > td,\n  .table-bordered > tbody > tr > th,\n  .table-bordered > tbody > tr > td,\n  .table-bordered > tfoot > tr > th,\n  .table-bordered > tfoot > tr > td {\n    border: 1px solid #ddd; }\n  .table-bordered > thead > tr > th,\n  .table-bordered > thead > tr > td {\n    border-bottom-width: 2px; }\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell; }\n\n.table > thead > tr > td.active,\n.table > thead > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8; }\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8; }\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6; }\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7; }\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3; }\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc; }\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede; }\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc; }\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; }\n  @media screen and (max-width: 767px) {\n    .table-responsive {\n      width: 100%;\n      margin-bottom: 15px;\n      overflow-y: hidden;\n      -ms-overflow-style: -ms-autohiding-scrollbar;\n      border: 1px solid #ddd; }\n      .table-responsive > .table {\n        margin-bottom: 0; }\n        .table-responsive > .table > thead > tr > th,\n        .table-responsive > .table > thead > tr > td,\n        .table-responsive > .table > tbody > tr > th,\n        .table-responsive > .table > tbody > tr > td,\n        .table-responsive > .table > tfoot > tr > th,\n        .table-responsive > .table > tfoot > tr > td {\n          white-space: nowrap; }\n      .table-responsive > .table-bordered {\n        border: 0; }\n        .table-responsive > .table-bordered > thead > tr > th:first-child,\n        .table-responsive > .table-bordered > thead > tr > td:first-child,\n        .table-responsive > .table-bordered > tbody > tr > th:first-child,\n        .table-responsive > .table-bordered > tbody > tr > td:first-child,\n        .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n        .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n          border-left: 0; }\n        .table-responsive > .table-bordered > thead > tr > th:last-child,\n        .table-responsive > .table-bordered > thead > tr > td:last-child,\n        .table-responsive > .table-bordered > tbody > tr > th:last-child,\n        .table-responsive > .table-bordered > tbody > tr > td:last-child,\n        .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n        .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n          border-right: 0; }\n        .table-responsive > .table-bordered > tbody > tr:last-child > th,\n        .table-responsive > .table-bordered > tbody > tr:last-child > td,\n        .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n        .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n          border-bottom: 0; } }\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0; }\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5; }\n\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold; }\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal; }\n\ninput[type=\"file\"] {\n  display: block; }\n\ninput[type=\"range\"] {\n  display: block;\n  width: 100%; }\n\nselect[multiple],\nselect[size] {\n  height: auto; }\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px; }\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555; }\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }\n  .form-control:focus {\n    border-color: #66afe9;\n    outline: 0;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }\n  .form-control::-moz-placeholder {\n    color: #999;\n    opacity: 1; }\n  .form-control:-ms-input-placeholder {\n    color: #999; }\n  .form-control::-webkit-input-placeholder {\n    color: #999; }\n  .form-control::-ms-expand {\n    border: 0;\n    background-color: transparent; }\n  .form-control[disabled], .form-control[readonly],\n  fieldset[disabled] .form-control {\n    background-color: #eeeeee;\n    opacity: 1; }\n  .form-control[disabled],\n  fieldset[disabled] .form-control {\n    cursor: not-allowed; }\n\ntextarea.form-control {\n  height: auto; }\n\ninput[type=\"search\"] {\n  -webkit-appearance: none; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px; }\n  input[type=\"date\"].input-sm, .input-group-sm > input[type=\"date\"].form-control,\n  .input-group-sm > input[type=\"date\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"date\"].btn,\n  .input-group-sm input[type=\"date\"],\n  input[type=\"time\"].input-sm,\n  .input-group-sm > input[type=\"time\"].form-control,\n  .input-group-sm > input[type=\"time\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"time\"].btn,\n  .input-group-sm\n  input[type=\"time\"],\n  input[type=\"datetime-local\"].input-sm,\n  .input-group-sm > input[type=\"datetime-local\"].form-control,\n  .input-group-sm > input[type=\"datetime-local\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"datetime-local\"].btn,\n  .input-group-sm\n  input[type=\"datetime-local\"],\n  input[type=\"month\"].input-sm,\n  .input-group-sm > input[type=\"month\"].form-control,\n  .input-group-sm > input[type=\"month\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"month\"].btn,\n  .input-group-sm\n  input[type=\"month\"] {\n    line-height: 30px; }\n  input[type=\"date\"].input-lg, .input-group-lg > input[type=\"date\"].form-control,\n  .input-group-lg > input[type=\"date\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"date\"].btn,\n  .input-group-lg input[type=\"date\"],\n  input[type=\"time\"].input-lg,\n  .input-group-lg > input[type=\"time\"].form-control,\n  .input-group-lg > input[type=\"time\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"time\"].btn,\n  .input-group-lg\n  input[type=\"time\"],\n  input[type=\"datetime-local\"].input-lg,\n  .input-group-lg > input[type=\"datetime-local\"].form-control,\n  .input-group-lg > input[type=\"datetime-local\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"datetime-local\"].btn,\n  .input-group-lg\n  input[type=\"datetime-local\"],\n  input[type=\"month\"].input-lg,\n  .input-group-lg > input[type=\"month\"].form-control,\n  .input-group-lg > input[type=\"month\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"month\"].btn,\n  .input-group-lg\n  input[type=\"month\"] {\n    line-height: 46px; } }\n\n.form-group {\n  margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px; }\n  .radio label,\n  .checkbox label {\n    min-height: 20px;\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer; }\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9; }\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; }\n\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer; }\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; }\n\ninput[type=\"radio\"][disabled], input[type=\"radio\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled]\ninput[type=\"checkbox\"] {\n  cursor: not-allowed; }\n\n.radio-inline.disabled,\nfieldset[disabled] .radio-inline,\n.checkbox-inline.disabled,\nfieldset[disabled]\n.checkbox-inline {\n  cursor: not-allowed; }\n\n.radio.disabled label,\nfieldset[disabled] .radio label,\n.checkbox.disabled label,\nfieldset[disabled]\n.checkbox label {\n  cursor: not-allowed; }\n\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n  min-height: 34px; }\n  .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,\n  .input-group-lg > .form-control-static.input-group-addon,\n  .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,\n  .input-group-sm > .form-control-static.input-group-addon,\n  .input-group-sm > .input-group-btn > .form-control-static.btn {\n    padding-left: 0;\n    padding-right: 0; }\n\n.input-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\nselect.input-sm, .input-group-sm > select.form-control,\n.input-group-sm > select.input-group-addon,\n.input-group-sm > .input-group-btn > select.btn {\n  height: 30px;\n  line-height: 30px; }\n\ntextarea.input-sm, .input-group-sm > textarea.form-control,\n.input-group-sm > textarea.input-group-addon,\n.input-group-sm > .input-group-btn > textarea.btn,\nselect[multiple].input-sm,\n.input-group-sm > select[multiple].form-control,\n.input-group-sm > select[multiple].input-group-addon,\n.input-group-sm > .input-group-btn > select[multiple].btn {\n  height: auto; }\n\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px; }\n\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto; }\n\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5; }\n\n.input-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\nselect.input-lg, .input-group-lg > select.form-control,\n.input-group-lg > select.input-group-addon,\n.input-group-lg > .input-group-btn > select.btn {\n  height: 46px;\n  line-height: 46px; }\n\ntextarea.input-lg, .input-group-lg > textarea.form-control,\n.input-group-lg > textarea.input-group-addon,\n.input-group-lg > .input-group-btn > textarea.btn,\nselect[multiple].input-lg,\n.input-group-lg > select[multiple].form-control,\n.input-group-lg > select[multiple].input-group-addon,\n.input-group-lg > .input-group-btn > select[multiple].btn {\n  height: auto; }\n\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px; }\n\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto; }\n\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333; }\n\n.has-feedback {\n  position: relative; }\n  .has-feedback .form-control {\n    padding-right: 42.5px; }\n\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none; }\n\n.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,\n.input-group-lg > .input-group-addon + .form-control-feedback,\n.input-group-lg > .input-group-btn > .btn + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px; }\n\n.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,\n.input-group-sm > .input-group-addon + .form-control-feedback,\n.input-group-sm > .input-group-btn > .btn + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px; }\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d; }\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-success .form-control:focus {\n    border-color: #2b542c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }\n\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8; }\n\n.has-success .form-control-feedback {\n  color: #3c763d; }\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b; }\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-warning .form-control:focus {\n    border-color: #66512c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }\n\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3; }\n\n.has-warning .form-control-feedback {\n  color: #8a6d3b; }\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442; }\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-error .form-control:focus {\n    border-color: #843534;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }\n\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede; }\n\n.has-error .form-control-feedback {\n  color: #a94442; }\n\n.has-feedback label ~ .form-control-feedback {\n  top: 25px; }\n\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0; }\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373; }\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle; }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle; }\n  .form-inline .form-control-static {\n    display: inline-block; }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle; }\n    .form-inline .input-group .input-group-addon,\n    .form-inline .input-group .input-group-btn,\n    .form-inline .input-group .form-control {\n      width: auto; }\n  .form-inline .input-group > .form-control {\n    width: 100%; }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle; }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle; }\n    .form-inline .radio label,\n    .form-inline .checkbox label {\n      padding-left: 0; }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0; }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0; } }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px; }\n\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px; }\n  .form-horizontal .form-group:before, .form-horizontal .form-group:after {\n    content: \" \";\n    display: table; }\n  .form-horizontal .form-group:after {\n    clear: both; }\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px; } }\n\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px; }\n\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px; } }\n\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px; } }\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none; }\n  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {\n    outline: thin dotted;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px; }\n  .btn:hover, .btn:focus, .btn.focus {\n    color: #333;\n    text-decoration: none; }\n  .btn:active, .btn.active {\n    outline: 0;\n    background-image: none;\n    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n  .btn.disabled, .btn[disabled],\n  fieldset[disabled] .btn {\n    cursor: not-allowed;\n    opacity: 0.65;\n    filter: alpha(opacity=65);\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none; }\n\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc; }\n  .btn-default:focus, .btn-default.focus {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #8c8c8c; }\n  .btn-default:hover {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #adadad; }\n  .btn-default:active, .btn-default.active,\n  .open > .btn-default.dropdown-toggle {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #adadad; }\n    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,\n    .open > .btn-default.dropdown-toggle:hover,\n    .open > .btn-default.dropdown-toggle:focus,\n    .open > .btn-default.dropdown-toggle.focus {\n      color: #333;\n      background-color: #d4d4d4;\n      border-color: #8c8c8c; }\n  .btn-default:active, .btn-default.active,\n  .open > .btn-default.dropdown-toggle {\n    background-image: none; }\n  .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,\n  fieldset[disabled] .btn-default:hover,\n  fieldset[disabled] .btn-default:focus,\n  fieldset[disabled] .btn-default.focus {\n    background-color: #fff;\n    border-color: #ccc; }\n  .btn-default .badge {\n    color: #fff;\n    background-color: #333; }\n\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4; }\n  .btn-primary:focus, .btn-primary.focus {\n    color: #fff;\n    background-color: #286090;\n    border-color: #122b40; }\n  .btn-primary:hover {\n    color: #fff;\n    background-color: #286090;\n    border-color: #204d74; }\n  .btn-primary:active, .btn-primary.active,\n  .open > .btn-primary.dropdown-toggle {\n    color: #fff;\n    background-color: #286090;\n    border-color: #204d74; }\n    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,\n    .open > .btn-primary.dropdown-toggle:hover,\n    .open > .btn-primary.dropdown-toggle:focus,\n    .open > .btn-primary.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #204d74;\n      border-color: #122b40; }\n  .btn-primary:active, .btn-primary.active,\n  .open > .btn-primary.dropdown-toggle {\n    background-image: none; }\n  .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,\n  fieldset[disabled] .btn-primary:hover,\n  fieldset[disabled] .btn-primary:focus,\n  fieldset[disabled] .btn-primary.focus {\n    background-color: #337ab7;\n    border-color: #2e6da4; }\n  .btn-primary .badge {\n    color: #337ab7;\n    background-color: #fff; }\n\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c; }\n  .btn-success:focus, .btn-success.focus {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #255625; }\n  .btn-success:hover {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #398439; }\n  .btn-success:active, .btn-success.active,\n  .open > .btn-success.dropdown-toggle {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #398439; }\n    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,\n    .open > .btn-success.dropdown-toggle:hover,\n    .open > .btn-success.dropdown-toggle:focus,\n    .open > .btn-success.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #398439;\n      border-color: #255625; }\n  .btn-success:active, .btn-success.active,\n  .open > .btn-success.dropdown-toggle {\n    background-image: none; }\n  .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,\n  fieldset[disabled] .btn-success:hover,\n  fieldset[disabled] .btn-success:focus,\n  fieldset[disabled] .btn-success.focus {\n    background-color: #5cb85c;\n    border-color: #4cae4c; }\n  .btn-success .badge {\n    color: #5cb85c;\n    background-color: #fff; }\n\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da; }\n  .btn-info:focus, .btn-info.focus {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #1b6d85; }\n  .btn-info:hover {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #269abc; }\n  .btn-info:active, .btn-info.active,\n  .open > .btn-info.dropdown-toggle {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #269abc; }\n    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,\n    .open > .btn-info.dropdown-toggle:hover,\n    .open > .btn-info.dropdown-toggle:focus,\n    .open > .btn-info.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #269abc;\n      border-color: #1b6d85; }\n  .btn-info:active, .btn-info.active,\n  .open > .btn-info.dropdown-toggle {\n    background-image: none; }\n  .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,\n  fieldset[disabled] .btn-info:hover,\n  fieldset[disabled] .btn-info:focus,\n  fieldset[disabled] .btn-info.focus {\n    background-color: #5bc0de;\n    border-color: #46b8da; }\n  .btn-info .badge {\n    color: #5bc0de;\n    background-color: #fff; }\n\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236; }\n  .btn-warning:focus, .btn-warning.focus {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #985f0d; }\n  .btn-warning:hover {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #d58512; }\n  .btn-warning:active, .btn-warning.active,\n  .open > .btn-warning.dropdown-toggle {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #d58512; }\n    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,\n    .open > .btn-warning.dropdown-toggle:hover,\n    .open > .btn-warning.dropdown-toggle:focus,\n    .open > .btn-warning.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #d58512;\n      border-color: #985f0d; }\n  .btn-warning:active, .btn-warning.active,\n  .open > .btn-warning.dropdown-toggle {\n    background-image: none; }\n  .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,\n  fieldset[disabled] .btn-warning:hover,\n  fieldset[disabled] .btn-warning:focus,\n  fieldset[disabled] .btn-warning.focus {\n    background-color: #f0ad4e;\n    border-color: #eea236; }\n  .btn-warning .badge {\n    color: #f0ad4e;\n    background-color: #fff; }\n\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a; }\n  .btn-danger:focus, .btn-danger.focus {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #761c19; }\n  .btn-danger:hover {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #ac2925; }\n  .btn-danger:active, .btn-danger.active,\n  .open > .btn-danger.dropdown-toggle {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #ac2925; }\n    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,\n    .open > .btn-danger.dropdown-toggle:hover,\n    .open > .btn-danger.dropdown-toggle:focus,\n    .open > .btn-danger.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #ac2925;\n      border-color: #761c19; }\n  .btn-danger:active, .btn-danger.active,\n  .open > .btn-danger.dropdown-toggle {\n    background-image: none; }\n  .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,\n  fieldset[disabled] .btn-danger:hover,\n  fieldset[disabled] .btn-danger:focus,\n  fieldset[disabled] .btn-danger.focus {\n    background-color: #d9534f;\n    border-color: #d43f3a; }\n  .btn-danger .badge {\n    color: #d9534f;\n    background-color: #fff; }\n\n.btn-link {\n  color: #337ab7;\n  font-weight: normal;\n  border-radius: 0; }\n  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],\n  fieldset[disabled] .btn-link {\n    background-color: transparent;\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {\n    border-color: transparent; }\n  .btn-link:hover, .btn-link:focus {\n    color: #23527c;\n    text-decoration: underline;\n    background-color: transparent; }\n  .btn-link[disabled]:hover, .btn-link[disabled]:focus,\n  fieldset[disabled] .btn-link:hover,\n  fieldset[disabled] .btn-link:focus {\n    color: #777777;\n    text-decoration: none; }\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.btn-xs, .btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.btn-block {\n  display: block;\n  width: 100%; }\n\n.btn-block + .btn-block {\n  margin-top: 5px; }\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%; }\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear; }\n  .fade.in {\n    opacity: 1; }\n\n.collapse {\n  display: none; }\n  .collapse.in {\n    display: block; }\n\ntr.collapse.in {\n  display: table-row; }\n\ntbody.collapse.in {\n  display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease; }\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent; }\n\n.dropup,\n.dropdown {\n  position: relative; }\n\n.dropdown-toggle:focus {\n  outline: 0; }\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box; }\n  .dropdown-menu.pull-right {\n    right: 0;\n    left: auto; }\n  .dropdown-menu .divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5; }\n  .dropdown-menu > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: 1.428571429;\n    color: #333333;\n    white-space: nowrap; }\n\n.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5; }\n\n.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #337ab7; }\n\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n  color: #777777; }\n\n.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed; }\n\n.open > .dropdown-menu {\n  display: block; }\n\n.open > a {\n  outline: 0; }\n\n.dropdown-menu-right {\n  left: auto;\n  right: 0; }\n\n.dropdown-menu-left {\n  left: 0;\n  right: auto; }\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #777777;\n  white-space: nowrap; }\n\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990; }\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto; }\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n  content: \"\"; }\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px; }\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto; }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto; } }\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; }\n  .btn-group > .btn,\n  .btn-group-vertical > .btn {\n    position: relative;\n    float: left; }\n    .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n    .btn-group-vertical > .btn:hover,\n    .btn-group-vertical > .btn:focus,\n    .btn-group-vertical > .btn:active,\n    .btn-group-vertical > .btn.active {\n      z-index: 2; }\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px; }\n\n.btn-toolbar {\n  margin-left: -5px; }\n  .btn-toolbar:before, .btn-toolbar:after {\n    content: \" \";\n    display: table; }\n  .btn-toolbar:after {\n    clear: both; }\n  .btn-toolbar .btn,\n  .btn-toolbar .btn-group,\n  .btn-toolbar .input-group {\n    float: left; }\n  .btn-toolbar > .btn,\n  .btn-toolbar > .btn-group,\n  .btn-toolbar > .input-group {\n    margin-left: 5px; }\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0; }\n\n.btn-group > .btn:first-child {\n  margin-left: 0; }\n  .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n    border-bottom-right-radius: 0;\n    border-top-right-radius: 0; }\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group > .btn-group {\n  float: left; }\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0; }\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0; }\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0; }\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px; }\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n  .btn-group.open .dropdown-toggle.btn-link {\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n\n.btn .caret {\n  margin-left: 0; }\n\n.btn-lg .caret, .btn-group-lg > .btn .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0; }\n\n.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {\n  border-width: 0 5px 5px; }\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%; }\n\n.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {\n  content: \" \";\n  display: table; }\n\n.btn-group-vertical > .btn-group:after {\n  clear: both; }\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none; }\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0; }\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0; }\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px; }\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0; }\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate; }\n  .btn-group-justified > .btn,\n  .btn-group-justified > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%; }\n  .btn-group-justified > .btn-group .btn {\n    width: 100%; }\n  .btn-group-justified > .btn-group .dropdown-menu {\n    left: auto; }\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none; }\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate; }\n  .input-group[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0; }\n  .input-group .form-control {\n    position: relative;\n    z-index: 2;\n    float: left;\n    width: 100%;\n    margin-bottom: 0; }\n    .input-group .form-control:focus {\n      z-index: 3; }\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell; }\n  .input-group-addon:not(:first-child):not(:last-child),\n  .input-group-btn:not(:first-child):not(:last-child),\n  .input-group .form-control:not(:first-child):not(:last-child) {\n    border-radius: 0; }\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; }\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 4px; }\n  .input-group-addon.input-sm,\n  .input-group-sm > .input-group-addon,\n  .input-group-sm > .input-group-btn > .input-group-addon.btn {\n    padding: 5px 10px;\n    font-size: 12px;\n    border-radius: 3px; }\n  .input-group-addon.input-lg,\n  .input-group-lg > .input-group-addon,\n  .input-group-lg > .input-group-btn > .input-group-addon.btn {\n    padding: 10px 16px;\n    font-size: 18px;\n    border-radius: 6px; }\n  .input-group-addon input[type=\"radio\"],\n  .input-group-addon input[type=\"checkbox\"] {\n    margin-top: 0; }\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0; }\n\n.input-group-addon:first-child {\n  border-right: 0; }\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.input-group-addon:last-child {\n  border-left: 0; }\n\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap; }\n  .input-group-btn > .btn {\n    position: relative; }\n    .input-group-btn > .btn + .btn {\n      margin-left: -1px; }\n    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {\n      z-index: 2; }\n  .input-group-btn:first-child > .btn,\n  .input-group-btn:first-child > .btn-group {\n    margin-right: -1px; }\n  .input-group-btn:last-child > .btn,\n  .input-group-btn:last-child > .btn-group {\n    z-index: 2;\n    margin-left: -1px; }\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none; }\n  .nav:before, .nav:after {\n    content: \" \";\n    display: table; }\n  .nav:after {\n    clear: both; }\n  .nav > li {\n    position: relative;\n    display: block; }\n    .nav > li > a {\n      position: relative;\n      display: block;\n      padding: 10px 15px; }\n      .nav > li > a:hover, .nav > li > a:focus {\n        text-decoration: none;\n        background-color: #eeeeee; }\n    .nav > li.disabled > a {\n      color: #777777; }\n      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {\n        color: #777777;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed; }\n  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\n    background-color: #eeeeee;\n    border-color: #337ab7; }\n  .nav .nav-divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5; }\n  .nav > li > a > img {\n    max-width: none; }\n\n.nav-tabs {\n  border-bottom: 1px solid #ddd; }\n  .nav-tabs > li {\n    float: left;\n    margin-bottom: -1px; }\n    .nav-tabs > li > a {\n      margin-right: 2px;\n      line-height: 1.428571429;\n      border: 1px solid transparent;\n      border-radius: 4px 4px 0 0; }\n      .nav-tabs > li > a:hover {\n        border-color: #eeeeee #eeeeee #ddd; }\n    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\n      color: #555555;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      border-bottom-color: transparent;\n      cursor: default; }\n\n.nav-pills > li {\n  float: left; }\n  .nav-pills > li > a {\n    border-radius: 4px; }\n  .nav-pills > li + li {\n    margin-left: 2px; }\n  .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {\n    color: #fff;\n    background-color: #337ab7; }\n\n.nav-stacked > li {\n  float: none; }\n  .nav-stacked > li + li {\n    margin-top: 2px;\n    margin-left: 0; }\n\n.nav-justified, .nav-tabs.nav-justified {\n  width: 100%; }\n  .nav-justified > li, .nav-tabs.nav-justified > li {\n    float: none; }\n    .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n      text-align: center;\n      margin-bottom: 5px; }\n  .nav-justified > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto; }\n  @media (min-width: 768px) {\n    .nav-justified > li, .nav-tabs.nav-justified > li {\n      display: table-cell;\n      width: 1%; }\n      .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n        margin-bottom: 0; } }\n\n.nav-tabs-justified, .nav-tabs.nav-justified {\n  border-bottom: 0; }\n  .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n    margin-right: 0;\n    border-radius: 4px; }\n  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n    border: 1px solid #ddd; }\n  @media (min-width: 768px) {\n    .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n      border-bottom: 1px solid #ddd;\n      border-radius: 4px 4px 0 0; }\n    .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n    .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n    .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n      border-bottom-color: #fff; } }\n\n.tab-content > .tab-pane {\n  display: none; }\n\n.tab-content > .active {\n  display: block; }\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent; }\n  .navbar:before, .navbar:after {\n    content: \" \";\n    display: table; }\n  .navbar:after {\n    clear: both; }\n  @media (min-width: 768px) {\n    .navbar {\n      border-radius: 4px; } }\n\n.navbar-header:before, .navbar-header:after {\n  content: \" \";\n  display: table; }\n\n.navbar-header:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left; } }\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch; }\n  .navbar-collapse:before, .navbar-collapse:after {\n    content: \" \";\n    display: table; }\n  .navbar-collapse:after {\n    clear: both; }\n  .navbar-collapse.in {\n    overflow-y: auto; }\n  @media (min-width: 768px) {\n    .navbar-collapse {\n      width: auto;\n      border-top: 0;\n      box-shadow: none; }\n      .navbar-collapse.collapse {\n        display: block !important;\n        height: auto !important;\n        padding-bottom: 0;\n        overflow: visible !important; }\n      .navbar-collapse.in {\n        overflow-y: visible; }\n      .navbar-fixed-top .navbar-collapse,\n      .navbar-static-top .navbar-collapse,\n      .navbar-fixed-bottom .navbar-collapse {\n        padding-left: 0;\n        padding-right: 0; } }\n\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px; }\n  @media (max-device-width: 480px) and (orientation: landscape) {\n    .navbar-fixed-top .navbar-collapse,\n    .navbar-fixed-bottom .navbar-collapse {\n      max-height: 200px; } }\n\n.container > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px; }\n  @media (min-width: 768px) {\n    .container > .navbar-header,\n    .container > .navbar-collapse,\n    .container-fluid > .navbar-header,\n    .container-fluid > .navbar-collapse {\n      margin-right: 0;\n      margin-left: 0; } }\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px; }\n  @media (min-width: 768px) {\n    .navbar-static-top {\n      border-radius: 0; } }\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030; }\n  @media (min-width: 768px) {\n    .navbar-fixed-top,\n    .navbar-fixed-bottom {\n      border-radius: 0; } }\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px; }\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0; }\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px; }\n  .navbar-brand:hover, .navbar-brand:focus {\n    text-decoration: none; }\n  .navbar-brand > img {\n    display: block; }\n  @media (min-width: 768px) {\n    .navbar > .container .navbar-brand,\n    .navbar > .container-fluid .navbar-brand {\n      margin-left: -15px; } }\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px; }\n  .navbar-toggle:focus {\n    outline: 0; }\n  .navbar-toggle .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px; }\n  .navbar-toggle .icon-bar + .icon-bar {\n    margin-top: 4px; }\n  @media (min-width: 768px) {\n    .navbar-toggle {\n      display: none; } }\n\n.navbar-nav {\n  margin: 7.5px -15px; }\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n    line-height: 20px; }\n  @media (max-width: 767px) {\n    .navbar-nav .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none; }\n      .navbar-nav .open .dropdown-menu > li > a,\n      .navbar-nav .open .dropdown-menu .dropdown-header {\n        padding: 5px 15px 5px 25px; }\n      .navbar-nav .open .dropdown-menu > li > a {\n        line-height: 20px; }\n        .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {\n          background-image: none; } }\n  @media (min-width: 768px) {\n    .navbar-nav {\n      float: left;\n      margin: 0; }\n      .navbar-nav > li {\n        float: left; }\n        .navbar-nav > li > a {\n          padding-top: 15px;\n          padding-bottom: 15px; } }\n\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px; }\n  @media (min-width: 768px) {\n    .navbar-form .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle; }\n    .navbar-form .form-control {\n      display: inline-block;\n      width: auto;\n      vertical-align: middle; }\n    .navbar-form .form-control-static {\n      display: inline-block; }\n    .navbar-form .input-group {\n      display: inline-table;\n      vertical-align: middle; }\n      .navbar-form .input-group .input-group-addon,\n      .navbar-form .input-group .input-group-btn,\n      .navbar-form .input-group .form-control {\n        width: auto; }\n    .navbar-form .input-group > .form-control {\n      width: 100%; }\n    .navbar-form .control-label {\n      margin-bottom: 0;\n      vertical-align: middle; }\n    .navbar-form .radio,\n    .navbar-form .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle; }\n      .navbar-form .radio label,\n      .navbar-form .checkbox label {\n        padding-left: 0; }\n    .navbar-form .radio input[type=\"radio\"],\n    .navbar-form .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0; }\n    .navbar-form .has-feedback .form-control-feedback {\n      top: 0; } }\n  @media (max-width: 767px) {\n    .navbar-form .form-group {\n      margin-bottom: 5px; }\n      .navbar-form .form-group:last-child {\n        margin-bottom: 0; } }\n  @media (min-width: 768px) {\n    .navbar-form {\n      width: auto;\n      border: 0;\n      margin-left: 0;\n      margin-right: 0;\n      padding-top: 0;\n      padding-bottom: 0;\n      -webkit-box-shadow: none;\n      box-shadow: none; } }\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px; }\n  .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {\n    margin-top: 10px;\n    margin-bottom: 10px; }\n  .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {\n    margin-top: 14px;\n    margin-bottom: 14px; }\n\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px; }\n  @media (min-width: 768px) {\n    .navbar-text {\n      float: left;\n      margin-left: 15px;\n      margin-right: 15px; } }\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important; }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px; }\n    .navbar-right ~ .navbar-right {\n      margin-right: 0; } }\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7; }\n  .navbar-default .navbar-brand {\n    color: #777; }\n    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {\n      color: #5e5e5e;\n      background-color: transparent; }\n  .navbar-default .navbar-text {\n    color: #777; }\n  .navbar-default .navbar-nav > li > a {\n    color: #777; }\n    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {\n      color: #333;\n      background-color: transparent; }\n  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7; }\n  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent; }\n  .navbar-default .navbar-toggle {\n    border-color: #ddd; }\n    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n      background-color: #ddd; }\n    .navbar-default .navbar-toggle .icon-bar {\n      background-color: #888; }\n  .navbar-default .navbar-collapse,\n  .navbar-default .navbar-form {\n    border-color: #e7e7e7; }\n  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {\n    background-color: #e7e7e7;\n    color: #555; }\n  @media (max-width: 767px) {\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n      color: #777; }\n      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #333;\n        background-color: transparent; }\n    .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 {\n      color: #555;\n      background-color: #e7e7e7; }\n    .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 {\n      color: #ccc;\n      background-color: transparent; } }\n  .navbar-default .navbar-link {\n    color: #777; }\n    .navbar-default .navbar-link:hover {\n      color: #333; }\n  .navbar-default .btn-link {\n    color: #777; }\n    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {\n      color: #333; }\n    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,\n    fieldset[disabled] .navbar-default .btn-link:hover,\n    fieldset[disabled] .navbar-default .btn-link:focus {\n      color: #ccc; }\n\n.navbar-inverse {\n  background-color: #222;\n  border-color: #090909; }\n  .navbar-inverse .navbar-brand {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {\n      color: #fff;\n      background-color: transparent; }\n  .navbar-inverse .navbar-text {\n    color: #9d9d9d; }\n  .navbar-inverse .navbar-nav > li > a {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {\n      color: #fff;\n      background-color: transparent; }\n  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {\n    color: #fff;\n    background-color: #090909; }\n  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {\n    color: #444;\n    background-color: transparent; }\n  .navbar-inverse .navbar-toggle {\n    border-color: #333; }\n    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {\n      background-color: #333; }\n    .navbar-inverse .navbar-toggle .icon-bar {\n      background-color: #fff; }\n  .navbar-inverse .navbar-collapse,\n  .navbar-inverse .navbar-form {\n    border-color: #101010; }\n  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {\n    background-color: #090909;\n    color: #fff; }\n  @media (max-width: 767px) {\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n      border-color: #090909; }\n    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n      background-color: #090909; }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n      color: #9d9d9d; }\n      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #fff;\n        background-color: transparent; }\n    .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 {\n      color: #fff;\n      background-color: #090909; }\n    .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 {\n      color: #444;\n      background-color: transparent; } }\n  .navbar-inverse .navbar-link {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-link:hover {\n      color: #fff; }\n  .navbar-inverse .btn-link {\n    color: #9d9d9d; }\n    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {\n      color: #fff; }\n    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,\n    fieldset[disabled] .navbar-inverse .btn-link:hover,\n    fieldset[disabled] .navbar-inverse .btn-link:focus {\n      color: #444; }\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px; }\n  .breadcrumb > li {\n    display: inline-block; }\n    .breadcrumb > li + li:before {\n      content: \"/ \";\n      padding: 0 5px;\n      color: #ccc; }\n  .breadcrumb > .active {\n    color: #777777; }\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px; }\n  .pagination > li {\n    display: inline; }\n    .pagination > li > a,\n    .pagination > li > span {\n      position: relative;\n      float: left;\n      padding: 6px 12px;\n      line-height: 1.428571429;\n      text-decoration: none;\n      color: #337ab7;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      margin-left: -1px; }\n    .pagination > li:first-child > a,\n    .pagination > li:first-child > span {\n      margin-left: 0;\n      border-bottom-left-radius: 4px;\n      border-top-left-radius: 4px; }\n    .pagination > li:last-child > a,\n    .pagination > li:last-child > span {\n      border-bottom-right-radius: 4px;\n      border-top-right-radius: 4px; }\n  .pagination > li > a:hover, .pagination > li > a:focus,\n  .pagination > li > span:hover,\n  .pagination > li > span:focus {\n    z-index: 2;\n    color: #23527c;\n    background-color: #eeeeee;\n    border-color: #ddd; }\n  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,\n  .pagination > .active > span,\n  .pagination > .active > span:hover,\n  .pagination > .active > span:focus {\n    z-index: 3;\n    color: #fff;\n    background-color: #337ab7;\n    border-color: #337ab7;\n    cursor: default; }\n  .pagination > .disabled > span,\n  .pagination > .disabled > span:hover,\n  .pagination > .disabled > span:focus,\n  .pagination > .disabled > a,\n  .pagination > .disabled > a:hover,\n  .pagination > .disabled > a:focus {\n    color: #777777;\n    background-color: #fff;\n    border-color: #ddd;\n    cursor: not-allowed; }\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333; }\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px; }\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px; }\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5; }\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px; }\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px; }\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center; }\n  .pager:before, .pager:after {\n    content: \" \";\n    display: table; }\n  .pager:after {\n    clear: both; }\n  .pager li {\n    display: inline; }\n    .pager li > a,\n    .pager li > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      border-radius: 15px; }\n    .pager li > a:hover,\n    .pager li > a:focus {\n      text-decoration: none;\n      background-color: #eeeeee; }\n  .pager .next > a,\n  .pager .next > span {\n    float: right; }\n  .pager .previous > a,\n  .pager .previous > span {\n    float: left; }\n  .pager .disabled > a,\n  .pager .disabled > a:hover,\n  .pager .disabled > a:focus,\n  .pager .disabled > span {\n    color: #777777;\n    background-color: #fff;\n    cursor: not-allowed; }\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em; }\n  .label:empty {\n    display: none; }\n  .btn .label {\n    position: relative;\n    top: -1px; }\n\na.label:hover, a.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer; }\n\n.label-default {\n  background-color: #777777; }\n  .label-default[href]:hover, .label-default[href]:focus {\n    background-color: #5e5e5e; }\n\n.label-primary {\n  background-color: #337ab7; }\n  .label-primary[href]:hover, .label-primary[href]:focus {\n    background-color: #286090; }\n\n.label-success {\n  background-color: #5cb85c; }\n  .label-success[href]:hover, .label-success[href]:focus {\n    background-color: #449d44; }\n\n.label-info {\n  background-color: #5bc0de; }\n  .label-info[href]:hover, .label-info[href]:focus {\n    background-color: #31b0d5; }\n\n.label-warning {\n  background-color: #f0ad4e; }\n  .label-warning[href]:hover, .label-warning[href]:focus {\n    background-color: #ec971f; }\n\n.label-danger {\n  background-color: #d9534f; }\n  .label-danger[href]:hover, .label-danger[href]:focus {\n    background-color: #c9302c; }\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #fff;\n  line-height: 1;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px; }\n  .badge:empty {\n    display: none; }\n  .btn .badge {\n    position: relative;\n    top: -1px; }\n  .btn-xs .badge, .btn-group-xs > .btn .badge,\n  .btn-group-xs > .btn .badge {\n    top: 0;\n    padding: 1px 5px; }\n  .list-group-item.active > .badge,\n  .nav-pills > .active > a > .badge {\n    color: #337ab7;\n    background-color: #fff; }\n  .list-group-item > .badge {\n    float: right; }\n  .list-group-item > .badge + .badge {\n    margin-right: 5px; }\n  .nav-pills > li > a > .badge {\n    margin-left: 3px; }\n\na.badge:hover, a.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer; }\n\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee; }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    color: inherit; }\n  .jumbotron p {\n    margin-bottom: 15px;\n    font-size: 21px;\n    font-weight: 200; }\n  .jumbotron > hr {\n    border-top-color: #d5d5d5; }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    border-radius: 6px;\n    padding-left: 15px;\n    padding-right: 15px; }\n  .jumbotron .container {\n    max-width: 100%; }\n  @media screen and (min-width: 768px) {\n    .jumbotron {\n      padding-top: 48px;\n      padding-bottom: 48px; }\n      .container .jumbotron,\n      .container-fluid .jumbotron {\n        padding-left: 60px;\n        padding-right: 60px; }\n      .jumbotron h1,\n      .jumbotron .h1 {\n        font-size: 63px; } }\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out; }\n  .thumbnail > img,\n  .thumbnail a > img {\n    display: block;\n    max-width: 100%;\n    height: auto;\n    margin-left: auto;\n    margin-right: auto; }\n  .thumbnail .caption {\n    padding: 9px;\n    color: #333333; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7; }\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px; }\n  .alert h4 {\n    margin-top: 0;\n    color: inherit; }\n  .alert .alert-link {\n    font-weight: bold; }\n  .alert > p,\n  .alert > ul {\n    margin-bottom: 0; }\n  .alert > p + p {\n    margin-top: 5px; }\n\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px; }\n  .alert-dismissable .close,\n  .alert-dismissible .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit; }\n\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d; }\n  .alert-success hr {\n    border-top-color: #c9e2b3; }\n  .alert-success .alert-link {\n    color: #2b542c; }\n\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f; }\n  .alert-info hr {\n    border-top-color: #a6e1ec; }\n  .alert-info .alert-link {\n    color: #245269; }\n\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b; }\n  .alert-warning hr {\n    border-top-color: #f7e1b5; }\n  .alert-warning .alert-link {\n    color: #66512c; }\n\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442; }\n  .alert-danger hr {\n    border-top-color: #e4b9c0; }\n  .alert-danger .alert-link {\n    color: #843534; }\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0; }\n  to {\n    background-position: 0 0; } }\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0; }\n  to {\n    background-position: 0 0; } }\n\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); }\n\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease; }\n\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  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);\n  background-image: -o-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);\n  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);\n  background-size: 40px 40px; }\n\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite; }\n\n.progress-bar-success {\n  background-color: #5cb85c; }\n  .progress-striped .progress-bar-success {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-info {\n  background-color: #5bc0de; }\n  .progress-striped .progress-bar-info {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-warning {\n  background-color: #f0ad4e; }\n  .progress-striped .progress-bar-warning {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-danger {\n  background-color: #d9534f; }\n  .progress-striped .progress-bar-danger {\n    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);\n    background-image: -o-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);\n    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); }\n\n.media {\n  margin-top: 15px; }\n  .media:first-child {\n    margin-top: 0; }\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden; }\n\n.media-body {\n  width: 10000px; }\n\n.media-object {\n  display: block; }\n  .media-object.img-thumbnail {\n    max-width: none; }\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px; }\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px; }\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top; }\n\n.media-middle {\n  vertical-align: middle; }\n\n.media-bottom {\n  vertical-align: bottom; }\n\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px; }\n\n.media-list {\n  padding-left: 0;\n  list-style: none; }\n\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0; }\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd; }\n  .list-group-item:first-child {\n    border-top-right-radius: 4px;\n    border-top-left-radius: 4px; }\n  .list-group-item:last-child {\n    margin-bottom: 0;\n    border-bottom-right-radius: 4px;\n    border-bottom-left-radius: 4px; }\n\na.list-group-item,\nbutton.list-group-item {\n  color: #555; }\n  a.list-group-item .list-group-item-heading,\n  button.list-group-item .list-group-item-heading {\n    color: #333; }\n  a.list-group-item:hover, a.list-group-item:focus,\n  button.list-group-item:hover,\n  button.list-group-item:focus {\n    text-decoration: none;\n    color: #555;\n    background-color: #f5f5f5; }\n\nbutton.list-group-item {\n  width: 100%;\n  text-align: left; }\n\n.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed; }\n  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {\n    color: inherit; }\n  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {\n    color: #777777; }\n\n.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7; }\n  .list-group-item.active .list-group-item-heading,\n  .list-group-item.active .list-group-item-heading > small,\n  .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,\n  .list-group-item.active:hover .list-group-item-heading > small,\n  .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,\n  .list-group-item.active:focus .list-group-item-heading > small,\n  .list-group-item.active:focus .list-group-item-heading > .small {\n    color: inherit; }\n  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {\n    color: #c7ddef; }\n\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8; }\n\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d; }\n  a.list-group-item-success .list-group-item-heading,\n  button.list-group-item-success .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-success:hover, a.list-group-item-success:focus,\n  button.list-group-item-success:hover,\n  button.list-group-item-success:focus {\n    color: #3c763d;\n    background-color: #d0e9c6; }\n  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,\n  button.list-group-item-success.active,\n  button.list-group-item-success.active:hover,\n  button.list-group-item-success.active:focus {\n    color: #fff;\n    background-color: #3c763d;\n    border-color: #3c763d; }\n\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7; }\n\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f; }\n  a.list-group-item-info .list-group-item-heading,\n  button.list-group-item-info .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-info:hover, a.list-group-item-info:focus,\n  button.list-group-item-info:hover,\n  button.list-group-item-info:focus {\n    color: #31708f;\n    background-color: #c4e3f3; }\n  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,\n  button.list-group-item-info.active,\n  button.list-group-item-info.active:hover,\n  button.list-group-item-info.active:focus {\n    color: #fff;\n    background-color: #31708f;\n    border-color: #31708f; }\n\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3; }\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b; }\n  a.list-group-item-warning .list-group-item-heading,\n  button.list-group-item-warning .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-warning:hover, a.list-group-item-warning:focus,\n  button.list-group-item-warning:hover,\n  button.list-group-item-warning:focus {\n    color: #8a6d3b;\n    background-color: #faf2cc; }\n  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,\n  button.list-group-item-warning.active,\n  button.list-group-item-warning.active:hover,\n  button.list-group-item-warning.active:focus {\n    color: #fff;\n    background-color: #8a6d3b;\n    border-color: #8a6d3b; }\n\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede; }\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442; }\n  a.list-group-item-danger .list-group-item-heading,\n  button.list-group-item-danger .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-danger:hover, a.list-group-item-danger:focus,\n  button.list-group-item-danger:hover,\n  button.list-group-item-danger:focus {\n    color: #a94442;\n    background-color: #ebcccc; }\n  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,\n  button.list-group-item-danger.active,\n  button.list-group-item-danger.active:hover,\n  button.list-group-item-danger.active:focus {\n    color: #fff;\n    background-color: #a94442;\n    border-color: #a94442; }\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px; }\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3; }\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }\n\n.panel-body {\n  padding: 15px; }\n  .panel-body:before, .panel-body:after {\n    content: \" \";\n    display: table; }\n  .panel-body:after {\n    clear: both; }\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px; }\n  .panel-heading > .dropdown .dropdown-toggle {\n    color: inherit; }\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit; }\n  .panel-title > a,\n  .panel-title > small,\n  .panel-title > .small,\n  .panel-title > small > a,\n  .panel-title > .small > a {\n    color: inherit; }\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px; }\n\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0; }\n  .panel > .list-group .list-group-item,\n  .panel > .panel-collapse > .list-group .list-group-item {\n    border-width: 1px 0;\n    border-radius: 0; }\n  .panel > .list-group:first-child .list-group-item:first-child,\n  .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n    border-top: 0;\n    border-top-right-radius: 3px;\n    border-top-left-radius: 3px; }\n  .panel > .list-group:last-child .list-group-item:last-child,\n  .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n    border-bottom: 0;\n    border-bottom-right-radius: 3px;\n    border-bottom-left-radius: 3px; }\n\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0; }\n\n.list-group + .panel-footer {\n  border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0; }\n  .panel > .table caption,\n  .panel > .table-responsive > .table caption,\n  .panel > .panel-collapse > .table caption {\n    padding-left: 15px;\n    padding-right: 15px; }\n\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px; }\n  .panel > .table:first-child > thead:first-child > tr:first-child,\n  .panel > .table:first-child > tbody:first-child > tr:first-child,\n  .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n  .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n    border-top-left-radius: 3px;\n    border-top-right-radius: 3px; }\n    .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n    .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n      border-top-left-radius: 3px; }\n    .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n    .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n      border-top-right-radius: 3px; }\n\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px; }\n  .panel > .table:last-child > tbody:last-child > tr:last-child,\n  .panel > .table:last-child > tfoot:last-child > tr:last-child,\n  .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n  .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n    border-bottom-left-radius: 3px;\n    border-bottom-right-radius: 3px; }\n    .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n    .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n      border-bottom-left-radius: 3px; }\n    .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n    .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n      border-bottom-right-radius: 3px; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd; }\n\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0; }\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0; }\n  .panel > .table-bordered > thead > tr > th:first-child,\n  .panel > .table-bordered > thead > tr > td:first-child,\n  .panel > .table-bordered > tbody > tr > th:first-child,\n  .panel > .table-bordered > tbody > tr > td:first-child,\n  .panel > .table-bordered > tfoot > tr > th:first-child,\n  .panel > .table-bordered > tfoot > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0; }\n  .panel > .table-bordered > thead > tr > th:last-child,\n  .panel > .table-bordered > thead > tr > td:last-child,\n  .panel > .table-bordered > tbody > tr > th:last-child,\n  .panel > .table-bordered > tbody > tr > td:last-child,\n  .panel > .table-bordered > tfoot > tr > th:last-child,\n  .panel > .table-bordered > tfoot > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0; }\n  .panel > .table-bordered > thead > tr:first-child > td,\n  .panel > .table-bordered > thead > tr:first-child > th,\n  .panel > .table-bordered > tbody > tr:first-child > td,\n  .panel > .table-bordered > tbody > tr:first-child > th,\n  .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n  .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n    border-bottom: 0; }\n  .panel > .table-bordered > tbody > tr:last-child > td,\n  .panel > .table-bordered > tbody > tr:last-child > th,\n  .panel > .table-bordered > tfoot > tr:last-child > td,\n  .panel > .table-bordered > tfoot > tr:last-child > th,\n  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n    border-bottom: 0; }\n\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0; }\n\n.panel-group {\n  margin-bottom: 20px; }\n  .panel-group .panel {\n    margin-bottom: 0;\n    border-radius: 4px; }\n    .panel-group .panel + .panel {\n      margin-top: 5px; }\n  .panel-group .panel-heading {\n    border-bottom: 0; }\n    .panel-group .panel-heading + .panel-collapse > .panel-body,\n    .panel-group .panel-heading + .panel-collapse > .list-group {\n      border-top: 1px solid #ddd; }\n  .panel-group .panel-footer {\n    border-top: 0; }\n    .panel-group .panel-footer + .panel-collapse .panel-body {\n      border-bottom: 1px solid #ddd; }\n\n.panel-default {\n  border-color: #ddd; }\n  .panel-default > .panel-heading {\n    color: #333333;\n    background-color: #f5f5f5;\n    border-color: #ddd; }\n    .panel-default > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #ddd; }\n    .panel-default > .panel-heading .badge {\n      color: #f5f5f5;\n      background-color: #333333; }\n  .panel-default > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #ddd; }\n\n.panel-primary {\n  border-color: #337ab7; }\n  .panel-primary > .panel-heading {\n    color: #fff;\n    background-color: #337ab7;\n    border-color: #337ab7; }\n    .panel-primary > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #337ab7; }\n    .panel-primary > .panel-heading .badge {\n      color: #337ab7;\n      background-color: #fff; }\n  .panel-primary > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #337ab7; }\n\n.panel-success {\n  border-color: #d6e9c6; }\n  .panel-success > .panel-heading {\n    color: #3c763d;\n    background-color: #dff0d8;\n    border-color: #d6e9c6; }\n    .panel-success > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #d6e9c6; }\n    .panel-success > .panel-heading .badge {\n      color: #dff0d8;\n      background-color: #3c763d; }\n  .panel-success > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #d6e9c6; }\n\n.panel-info {\n  border-color: #bce8f1; }\n  .panel-info > .panel-heading {\n    color: #31708f;\n    background-color: #d9edf7;\n    border-color: #bce8f1; }\n    .panel-info > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #bce8f1; }\n    .panel-info > .panel-heading .badge {\n      color: #d9edf7;\n      background-color: #31708f; }\n  .panel-info > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #bce8f1; }\n\n.panel-warning {\n  border-color: #faebcc; }\n  .panel-warning > .panel-heading {\n    color: #8a6d3b;\n    background-color: #fcf8e3;\n    border-color: #faebcc; }\n    .panel-warning > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #faebcc; }\n    .panel-warning > .panel-heading .badge {\n      color: #fcf8e3;\n      background-color: #8a6d3b; }\n  .panel-warning > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #faebcc; }\n\n.panel-danger {\n  border-color: #ebccd1; }\n  .panel-danger > .panel-heading {\n    color: #a94442;\n    background-color: #f2dede;\n    border-color: #ebccd1; }\n    .panel-danger > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #ebccd1; }\n    .panel-danger > .panel-heading .badge {\n      color: #f2dede;\n      background-color: #a94442; }\n  .panel-danger > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #ebccd1; }\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden; }\n  .embed-responsive .embed-responsive-item,\n  .embed-responsive iframe,\n  .embed-responsive embed,\n  .embed-responsive object,\n  .embed-responsive video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0; }\n\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%; }\n\n.embed-responsive-4by3 {\n  padding-bottom: 75%; }\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }\n  .well blockquote {\n    border-color: #ddd;\n    border-color: rgba(0, 0, 0, 0.15); }\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px; }\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px; }\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: 0.2;\n  filter: alpha(opacity=20); }\n  .close:hover, .close:focus {\n    color: #000;\n    text-decoration: none;\n    cursor: pointer;\n    opacity: 0.5;\n    filter: alpha(opacity=50); }\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none; }\n\n.modal-open {\n  overflow: hidden; }\n\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0; }\n  .modal.fade .modal-dialog {\n    -webkit-transform: translate(0, -25%);\n    -ms-transform: translate(0, -25%);\n    -o-transform: translate(0, -25%);\n    transform: translate(0, -25%);\n    -webkit-transition: -webkit-transform 0.3s ease-out;\n    -moz-transition: -moz-transform 0.3s ease-out;\n    -o-transition: -o-transform 0.3s ease-out;\n    transition: transform 0.3s ease-out; }\n  .modal.in .modal-dialog {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    -o-transform: translate(0, 0);\n    transform: translate(0, 0); }\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto; }\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px; }\n\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0; }\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000; }\n  .modal-backdrop.fade {\n    opacity: 0;\n    filter: alpha(opacity=0); }\n  .modal-backdrop.in {\n    opacity: 0.5;\n    filter: alpha(opacity=50); }\n\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5; }\n  .modal-header:before, .modal-header:after {\n    content: \" \";\n    display: table; }\n  .modal-header:after {\n    clear: both; }\n\n.modal-header .close {\n  margin-top: -2px; }\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429; }\n\n.modal-body {\n  position: relative;\n  padding: 15px; }\n\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5; }\n  .modal-footer:before, .modal-footer:after {\n    content: \" \";\n    display: table; }\n  .modal-footer:after {\n    clear: both; }\n  .modal-footer .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; }\n  .modal-footer .btn-group .btn + .btn {\n    margin-left: -1px; }\n  .modal-footer .btn-block + .btn-block {\n    margin-left: 0; }\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll; }\n\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto; }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }\n  .modal-sm {\n    width: 300px; } }\n\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px; } }\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Lato\", sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.428571429;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 12px;\n  opacity: 0;\n  filter: alpha(opacity=0); }\n  .tooltip.in {\n    opacity: 0.9;\n    filter: alpha(opacity=90); }\n  .tooltip.top {\n    margin-top: -3px;\n    padding: 5px 0; }\n  .tooltip.right {\n    margin-left: 3px;\n    padding: 0 5px; }\n  .tooltip.bottom {\n    margin-top: 3px;\n    padding: 5px 0; }\n  .tooltip.left {\n    margin-left: -3px;\n    padding: 0 5px; }\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px; }\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid; }\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000; }\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000; }\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Lato\", sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.428571429;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 14px;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }\n  .popover.top {\n    margin-top: -10px; }\n  .popover.right {\n    margin-left: 10px; }\n  .popover.bottom {\n    margin-top: 10px; }\n  .popover.left {\n    margin-left: -10px; }\n\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0; }\n\n.popover-content {\n  padding: 9px 14px; }\n\n.popover > .arrow, .popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid; }\n\n.popover > .arrow {\n  border-width: 11px; }\n\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\"; }\n\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px; }\n  .popover.top > .arrow:after {\n    content: \" \";\n    bottom: 1px;\n    margin-left: -10px;\n    border-bottom-width: 0;\n    border-top-color: #fff; }\n\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25); }\n  .popover.right > .arrow:after {\n    content: \" \";\n    left: 1px;\n    bottom: -10px;\n    border-left-width: 0;\n    border-right-color: #fff; }\n\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px; }\n  .popover.bottom > .arrow:after {\n    content: \" \";\n    top: 1px;\n    margin-left: -10px;\n    border-top-width: 0;\n    border-bottom-color: #fff; }\n\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25); }\n  .popover.left > .arrow:after {\n    content: \" \";\n    right: 1px;\n    border-right-width: 0;\n    border-left-color: #fff;\n    bottom: -10px; }\n\n.carousel {\n  position: relative; }\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%; }\n  .carousel-inner > .item {\n    display: none;\n    position: relative;\n    -webkit-transition: 0.6s ease-in-out left;\n    -o-transition: 0.6s ease-in-out left;\n    transition: 0.6s ease-in-out left; }\n    .carousel-inner > .item > img,\n    .carousel-inner > .item > a > img {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      line-height: 1; }\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      .carousel-inner > .item {\n        -webkit-transition: -webkit-transform 0.6s ease-in-out;\n        -moz-transition: -moz-transform 0.6s ease-in-out;\n        -o-transition: -o-transform 0.6s ease-in-out;\n        transition: transform 0.6s ease-in-out;\n        -webkit-backface-visibility: hidden;\n        -moz-backface-visibility: hidden;\n        backface-visibility: hidden;\n        -webkit-perspective: 1000px;\n        -moz-perspective: 1000px;\n        perspective: 1000px; }\n        .carousel-inner > .item.next, .carousel-inner > .item.active.right {\n          -webkit-transform: translate3d(100%, 0, 0);\n          transform: translate3d(100%, 0, 0);\n          left: 0; }\n        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {\n          -webkit-transform: translate3d(-100%, 0, 0);\n          transform: translate3d(-100%, 0, 0);\n          left: 0; }\n        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {\n          -webkit-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\n          left: 0; } }\n  .carousel-inner > .active,\n  .carousel-inner > .next,\n  .carousel-inner > .prev {\n    display: block; }\n  .carousel-inner > .active {\n    left: 0; }\n  .carousel-inner > .next,\n  .carousel-inner > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%; }\n  .carousel-inner > .next {\n    left: 100%; }\n  .carousel-inner > .prev {\n    left: -100%; }\n  .carousel-inner > .next.left,\n  .carousel-inner > .prev.right {\n    left: 0; }\n  .carousel-inner > .active.left {\n    left: -100%; }\n  .carousel-inner > .active.right {\n    left: 100%; }\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  background-color: transparent; }\n  .carousel-control.left {\n    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }\n  .carousel-control.right {\n    left: auto;\n    right: 0;\n    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }\n  .carousel-control:hover, .carousel-control:focus {\n    outline: 0;\n    color: #fff;\n    text-decoration: none;\n    opacity: 0.9;\n    filter: alpha(opacity=90); }\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next,\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    margin-top: -10px;\n    z-index: 5;\n    display: inline-block; }\n  .carousel-control .icon-prev,\n  .carousel-control .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px; }\n  .carousel-control .icon-next,\n  .carousel-control .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px; }\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 20px;\n    height: 20px;\n    line-height: 1;\n    font-family: serif; }\n  .carousel-control .icon-prev:before {\n    content: '\\2039'; }\n  .carousel-control .icon-next:before {\n    content: '\\203a'; }\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center; }\n  .carousel-indicators li {\n    display: inline-block;\n    width: 10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid #fff;\n    border-radius: 10px;\n    cursor: pointer;\n    background-color: #000 \\9;\n    background-color: transparent; }\n  .carousel-indicators .active {\n    margin: 0;\n    width: 12px;\n    height: 12px;\n    background-color: #fff; }\n\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }\n  .carousel-caption .btn {\n    text-shadow: none; }\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px; }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px; }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px; }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px; }\n  .carousel-indicators {\n    bottom: 20px; } }\n\n.clearfix:before, .clearfix:after {\n  content: \" \";\n  display: table; }\n\n.clearfix:after {\n  clear: both; }\n\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto; }\n\n.pull-right {\n  float: right !important; }\n\n.pull-left {\n  float: left !important; }\n\n.hide {\n  display: none !important; }\n\n.show {\n  display: block !important; }\n\n.invisible {\n  visibility: hidden; }\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0; }\n\n.hidden {\n  display: none !important; }\n\n.affix {\n  position: fixed; }\n\n@-ms-viewport {\n  width: device-width; }\n\n.visible-xs {\n  display: none !important; }\n\n.visible-sm {\n  display: none !important; }\n\n.visible-md {\n  display: none !important; }\n\n.visible-lg {\n  display: none !important; }\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important; }\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important; }\n  table.visible-xs {\n    display: table !important; }\n  tr.visible-xs {\n    display: table-row !important; }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important; }\n  table.visible-sm {\n    display: table !important; }\n  tr.visible-sm {\n    display: table-row !important; }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important; }\n  table.visible-md {\n    display: table !important; }\n  tr.visible-md {\n    display: table-row !important; }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important; }\n  table.visible-lg {\n    display: table !important; }\n  tr.visible-lg {\n    display: table-row !important; }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important; } }\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important; } }\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important; } }\n\n.visible-print {\n  display: none !important; }\n\n@media print {\n  .visible-print {\n    display: block !important; }\n  table.visible-print {\n    display: table !important; }\n  tr.visible-print {\n    display: table-row !important; }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important; } }\n\n.visible-print-block {\n  display: none !important; }\n  @media print {\n    .visible-print-block {\n      display: block !important; } }\n\n.visible-print-inline {\n  display: none !important; }\n  @media print {\n    .visible-print-inline {\n      display: inline !important; } }\n\n.visible-print-inline-block {\n  display: none !important; }\n  @media print {\n    .visible-print-inline-block {\n      display: inline-block !important; } }\n\n@media print {\n  .hidden-print {\n    display: none !important; } }\n","@import url(https://fonts.googleapis.com/css?family=Lato);\n$font-family-sans-serif: 'Lato', sans-serif;\n\n@import \"node_modules/bootstrap-sass/assets/stylesheets/bootstrap\";\n","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n// Core variables and mixins\n@import \"bootstrap/variables\";\n@import \"bootstrap/mixins\";\n\n// Reset and dependencies\n@import \"bootstrap/normalize\";\n@import \"bootstrap/print\";\n@import \"bootstrap/glyphicons\";\n\n// Core CSS\n@import \"bootstrap/scaffolding\";\n@import \"bootstrap/type\";\n@import \"bootstrap/code\";\n@import \"bootstrap/grid\";\n@import \"bootstrap/tables\";\n@import \"bootstrap/forms\";\n@import \"bootstrap/buttons\";\n\n// Components\n@import \"bootstrap/component-animations\";\n@import \"bootstrap/dropdowns\";\n@import \"bootstrap/button-groups\";\n@import \"bootstrap/input-groups\";\n@import \"bootstrap/navs\";\n@import \"bootstrap/navbar\";\n@import \"bootstrap/breadcrumbs\";\n@import \"bootstrap/pagination\";\n@import \"bootstrap/pager\";\n@import \"bootstrap/labels\";\n@import \"bootstrap/badges\";\n@import \"bootstrap/jumbotron\";\n@import \"bootstrap/thumbnails\";\n@import \"bootstrap/alerts\";\n@import \"bootstrap/progress-bars\";\n@import \"bootstrap/media\";\n@import \"bootstrap/list-group\";\n@import \"bootstrap/panels\";\n@import \"bootstrap/responsive-embed\";\n@import \"bootstrap/wells\";\n@import \"bootstrap/close\";\n\n// Components w/ JavaScript\n@import \"bootstrap/modals\";\n@import \"bootstrap/tooltip\";\n@import \"bootstrap/popovers\";\n@import \"bootstrap/carousel\";\n\n// Utility classes\n@import \"bootstrap/utilities\";\n@import \"bootstrap/responsive-utilities\";\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n//    without disabling user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n@at-root {\n  // Import the fonts\n  @font-face {\n    font-family: 'Glyphicons Halflings';\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');\n  }\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\002a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  @include box-sizing(border-box);\n}\n*:before,\n*:after {\n  @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: $font-family-base;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $text-color;\n  background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: $link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n  }\n\n  &:focus {\n    @include tab-focus;\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: $thumbnail-padding;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    $line-height-computed;\n  margin-bottom: $line-height-computed;\n  border: 0;\n  border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n  cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n  -webkit-animation: $animation;\n       -o-animation: $animation;\n          animation: $animation;\n}\n@mixin animation-name($name) {\n  -webkit-animation-name: $name;\n          animation-name: $name;\n}\n@mixin animation-duration($duration) {\n  -webkit-animation-duration: $duration;\n          animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n  -webkit-animation-timing-function: $timing-function;\n          animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n  -webkit-animation-delay: $delay;\n          animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n  -webkit-animation-iteration-count: $iteration-count;\n          animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n  -webkit-animation-direction: $direction;\n          animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n  -webkit-animation-fill-mode: $fill-mode;\n          animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility) {\n  -webkit-backface-visibility: $visibility;\n     -moz-backface-visibility: $visibility;\n          backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n          box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n  -webkit-box-sizing: $boxmodel;\n     -moz-box-sizing: $boxmodel;\n          box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n  -webkit-column-count: $column-count;\n     -moz-column-count: $column-count;\n          column-count: $column-count;\n  -webkit-column-gap: $column-gap;\n     -moz-column-gap: $column-gap;\n          column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: $mode;\n     -moz-hyphens: $mode;\n      -ms-hyphens: $mode; // IE10+\n       -o-hyphens: $mode;\n          hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: $color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n  -webkit-transform: scale($ratio);\n      -ms-transform: scale($ratio); // IE9 only\n       -o-transform: scale($ratio);\n          transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n  -webkit-transform: scaleX($ratio);\n      -ms-transform: scaleX($ratio); // IE9 only\n       -o-transform: scaleX($ratio);\n          transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n  -webkit-transform: scaleY($ratio);\n      -ms-transform: scaleY($ratio); // IE9 only\n       -o-transform: scaleY($ratio);\n          transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n  -webkit-transform: skewX($x) skewY($y);\n      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX($x) skewY($y);\n          transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n  -webkit-transform: translate($x, $y);\n      -ms-transform: translate($x, $y); // IE9 only\n       -o-transform: translate($x, $y);\n          transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n  -webkit-transform: translate3d($x, $y, $z);\n          transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees); // IE9 only\n       -o-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n  -webkit-transform: rotateX($degrees);\n      -ms-transform: rotateX($degrees); // IE9 only\n       -o-transform: rotateX($degrees);\n          transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n  -webkit-transform: rotateY($degrees);\n      -ms-transform: rotateY($degrees); // IE9 only\n       -o-transform: rotateY($degrees);\n          transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n  -webkit-perspective: $perspective;\n     -moz-perspective: $perspective;\n          perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n  -webkit-perspective-origin: $perspective;\n     -moz-perspective-origin: $perspective;\n          perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n  -webkit-transform-origin: $origin;\n     -moz-transform-origin: $origin;\n      -ms-transform-origin: $origin; // IE9 only\n          transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n  -webkit-transition: $transition;\n       -o-transition: $transition;\n          transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n  -webkit-transition-property: $transition-property;\n          transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n  -webkit-transition-delay: $transition-delay;\n          transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n  -webkit-transition-duration: $transition-duration;\n          transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n  -webkit-transition-timing-function: $timing-function;\n          transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n  -webkit-transition: -webkit-transform $transition;\n     -moz-transition: -moz-transform $transition;\n       -o-transition: -o-transform $transition;\n          transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n  -webkit-user-select: $select;\n     -moz-user-select: $select;\n      -ms-user-select: $select; // IE10+\n          user-select: $select;\n}\n","$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n$gray-base:              #000 !default;\n$gray-darker:            lighten($gray-base, 13.5%) !default; // #222\n$gray-dark:              lighten($gray-base, 20%) !default;   // #333\n$gray:                   lighten($gray-base, 33.5%) !default; // #555\n$gray-light:             lighten($gray-base, 46.7%) !default; // #777\n$gray-lighter:           lighten($gray-base, 93.5%) !default; // #eee\n\n$brand-primary:         darken(#428bca, 6.5%) !default; // #337ab7\n$brand-success:         #5cb85c !default;\n$brand-info:            #5bc0de !default;\n$brand-warning:         #f0ad4e !default;\n$brand-danger:          #d9534f !default;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n$body-bg:               #fff !default;\n//** Global text color on `<body>`.\n$text-color:            $gray-dark !default;\n\n//** Global textual link color.\n$link-color:            $brand-primary !default;\n//** Link hover color set via `darken()` function.\n$link-hover-color:      darken($link-color, 15%) !default;\n//** Link hover decoration.\n$link-hover-decoration: underline !default;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif:       Georgia, \"Times New Roman\", Times, serif !default;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n$font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base:        $font-family-sans-serif !default;\n\n$font-size-base:          14px !default;\n$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5:            $font-size-base !default;\n$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base:        1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the `<body>`.\n$headings-font-family:    inherit !default;\n$headings-font-weight:    500 !default;\n$headings-line-height:    1.1 !default;\n$headings-color:          inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name:          \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id:        \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical:     6px !default;\n$padding-base-horizontal:   12px !default;\n\n$padding-large-vertical:    10px !default;\n$padding-large-horizontal:  16px !default;\n\n$padding-small-vertical:    5px !default;\n$padding-small-horizontal:  10px !default;\n\n$padding-xs-vertical:       1px !default;\n$padding-xs-horizontal:     5px !default;\n\n$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small:         1.5 !default;\n\n$border-radius-base:        4px !default;\n$border-radius-large:       6px !default;\n$border-radius-small:       3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color:    #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg:       $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n$caret-width-base:          4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large:         5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n$table-cell-padding:            8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding:  5px !default;\n\n//** Default background color used for all tables.\n$table-bg:                      transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent:               #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover:                #f5f5f5 !default;\n$table-bg-active:               $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color:            #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight:                normal !default;\n\n$btn-default-color:              #333 !default;\n$btn-default-bg:                 #fff !default;\n$btn-default-border:             #ccc !default;\n\n$btn-primary-color:              #fff !default;\n$btn-primary-bg:                 $brand-primary !default;\n$btn-primary-border:             darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color:              #fff !default;\n$btn-success-bg:                 $brand-success !default;\n$btn-success-border:             darken($btn-success-bg, 5%) !default;\n\n$btn-info-color:                 #fff !default;\n$btn-info-bg:                    $brand-info !default;\n$btn-info-border:                darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color:              #fff !default;\n$btn-warning-bg:                 $brand-warning !default;\n$btn-warning-border:             darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color:               #fff !default;\n$btn-danger-bg:                  $brand-danger !default;\n$btn-danger-border:              darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color:        $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base:         $border-radius-base !default;\n$btn-border-radius-large:        $border-radius-large !default;\n$btn-border-radius-small:        $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n$input-bg:                       #fff !default;\n//** `<input disabled>` background color\n$input-bg-disabled:              $gray-lighter !default;\n\n//** Text color for `<input>`s\n$input-color:                    $gray !default;\n//** `<input>` border color\n$input-border:                   #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.\n$input-border-radius:            $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large:      $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small:      $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus:             #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder:        #999 !default;\n\n//** Default `.form-control` height\n$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom:       15px !default;\n\n$legend-color:                   $gray-dark !default;\n$legend-border-color:            #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg:           $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled:                not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg:                    #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border:                rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border:       #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg:            #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color:            $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg:         #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color:     $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg:        $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color:   $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color:          $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color:           #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar:            1000 !default;\n$zindex-dropdown:          1000 !default;\n$zindex-popover:           1060 !default;\n$zindex-tooltip:           1070 !default;\n$zindex-navbar-fixed:      1030 !default;\n$zindex-modal-background:  1040 !default;\n$zindex-modal:             1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs:                  480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min:              $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone:               $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm:                  768px !default;\n$screen-sm-min:              $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet:              $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md:                  992px !default;\n$screen-md-min:              $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop:             $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg:                  1200px !default;\n$screen-lg-min:              $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop:          $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max:              ($screen-sm-min - 1) !default;\n$screen-sm-max:              ($screen-md-min - 1) !default;\n$screen-md-max:              ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns:              12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width:         30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint:     $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet:             (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm:                 $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop:            (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md:                 $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop:      (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg:                 $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height:                    50px !default;\n$navbar-margin-bottom:             $line-height-computed !default;\n$navbar-border-radius:             $border-radius-base !default;\n$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height:       340px !default;\n\n$navbar-default-color:             #777 !default;\n$navbar-default-bg:                #f8f8f8 !default;\n$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color:                #777 !default;\n$navbar-default-link-hover-color:          #333 !default;\n$navbar-default-link-hover-bg:             transparent !default;\n$navbar-default-link-active-color:         #555 !default;\n$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color:       #ccc !default;\n$navbar-default-link-disabled-bg:          transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color:               $navbar-default-link-color !default;\n$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg:            transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg:           #ddd !default;\n$navbar-default-toggle-icon-bar-bg:        #888 !default;\n$navbar-default-toggle-border-color:       #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color:                      lighten($gray-light, 15%) !default;\n$navbar-inverse-bg:                         #222 !default;\n$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color:           #fff !default;\n$navbar-inverse-link-hover-bg:              transparent !default;\n$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color:        #444 !default;\n$navbar-inverse-link-disabled-bg:           transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color:          #fff !default;\n$navbar-inverse-brand-hover-bg:             transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg:            #333 !default;\n$navbar-inverse-toggle-icon-bar-bg:         #fff !default;\n$navbar-inverse-toggle-border-color:        #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding:                          10px 15px !default;\n$nav-link-hover-bg:                         $gray-lighter !default;\n\n$nav-disabled-link-color:                   $gray-light !default;\n$nav-disabled-link-hover-color:             $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color:                     #ddd !default;\n\n$nav-tabs-link-hover-border-color:          $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg:             $body-bg !default;\n$nav-tabs-active-link-hover-color:          $gray !default;\n$nav-tabs-active-link-hover-border-color:   #ddd !default;\n\n$nav-tabs-justified-link-border-color:            #ddd !default;\n$nav-tabs-justified-active-link-border-color:     $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius:                   $border-radius-base !default;\n$nav-pills-active-link-hover-bg:            $component-active-bg !default;\n$nav-pills-active-link-hover-color:         $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color:                     $link-color !default;\n$pagination-bg:                        #fff !default;\n$pagination-border:                    #ddd !default;\n\n$pagination-hover-color:               $link-hover-color !default;\n$pagination-hover-bg:                  $gray-lighter !default;\n$pagination-hover-border:              #ddd !default;\n\n$pagination-active-color:              #fff !default;\n$pagination-active-bg:                 $brand-primary !default;\n$pagination-active-border:             $brand-primary !default;\n\n$pagination-disabled-color:            $gray-light !default;\n$pagination-disabled-bg:               #fff !default;\n$pagination-disabled-border:           #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg:                             $pagination-bg !default;\n$pager-border:                         $pagination-border !default;\n$pager-border-radius:                  15px !default;\n\n$pager-hover-bg:                       $pagination-hover-bg !default;\n\n$pager-active-bg:                      $pagination-active-bg !default;\n$pager-active-color:                   $pagination-active-color !default;\n\n$pager-disabled-color:                 $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding:              30px !default;\n$jumbotron-color:                inherit !default;\n$jumbotron-bg:                   $gray-lighter !default;\n$jumbotron-heading-color:        inherit !default;\n$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text:             #3c763d !default;\n$state-success-bg:               #dff0d8 !default;\n$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text:                #31708f !default;\n$state-info-bg:                  #d9edf7 !default;\n$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text:             #8a6d3b !default;\n$state-warning-bg:               #fcf8e3 !default;\n$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text:              #a94442 !default;\n$state-danger-bg:                #f2dede !default;\n$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width:           200px !default;\n//** Tooltip text color\n$tooltip-color:               #fff !default;\n//** Tooltip background color\n$tooltip-bg:                  #000 !default;\n$tooltip-opacity:             .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width:         5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color:         $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg:                          #fff !default;\n//** Popover maximum width\n$popover-max-width:                   276px !default;\n//** Popover border color\n$popover-border-color:                rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color:       #ccc !default;\n\n//** Popover title background color\n$popover-title-bg:                    darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width:                 10px !default;\n//** Popover arrow color\n$popover-arrow-color:                 $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg:            $gray-light !default;\n//** Primary label background color\n$label-primary-bg:            $brand-primary !default;\n//** Success label background color\n$label-success-bg:            $brand-success !default;\n//** Info label background color\n$label-info-bg:               $brand-info !default;\n//** Warning label background color\n$label-warning-bg:            $brand-warning !default;\n//** Danger label background color\n$label-danger-bg:             $brand-danger !default;\n\n//** Default label text color\n$label-color:                 #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color:      #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding:         15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding:         15px !default;\n//** Modal title line-height\n$modal-title-line-height:     $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg:                             #fff !default;\n//** Modal content border color\n$modal-content-border-color:                   rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color:          #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg:           #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity:      .5 !default;\n//** Modal header border color\n$modal-header-border-color:   #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color:   $modal-header-border-color !default;\n\n$modal-lg:                    900px !default;\n$modal-md:                    600px !default;\n$modal-sm:                    300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding:               15px !default;\n$alert-border-radius:         $border-radius-base !default;\n$alert-link-font-weight:      bold !default;\n\n$alert-success-bg:            $state-success-bg !default;\n$alert-success-text:          $state-success-text !default;\n$alert-success-border:        $state-success-border !default;\n\n$alert-info-bg:               $state-info-bg !default;\n$alert-info-text:             $state-info-text !default;\n$alert-info-border:           $state-info-border !default;\n\n$alert-warning-bg:            $state-warning-bg !default;\n$alert-warning-text:          $state-warning-text !default;\n$alert-warning-border:        $state-warning-border !default;\n\n$alert-danger-bg:             $state-danger-bg !default;\n$alert-danger-text:           $state-danger-text !default;\n$alert-danger-border:         $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg:                 #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color:          #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius:      $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg:             $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg:     $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg:     $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg:      $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg:        $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg:                 #fff !default;\n//** `.list-group-item` border color\n$list-group-border:             #ddd !default;\n//** List group border radius\n$list-group-border-radius:      $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg:           #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color:       $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg:          $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border:      $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color:      $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg:         $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color:         #555 !default;\n$list-group-link-hover-color:   $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg:                    #fff !default;\n$panel-body-padding:          15px !default;\n$panel-heading-padding:       10px 15px !default;\n$panel-footer-padding:        $panel-heading-padding !default;\n$panel-border-radius:         $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border:          #ddd !default;\n$panel-footer-bg:             #f5f5f5 !default;\n\n$panel-default-text:          $gray-dark !default;\n$panel-default-border:        #ddd !default;\n$panel-default-heading-bg:    #f5f5f5 !default;\n\n$panel-primary-text:          #fff !default;\n$panel-primary-border:        $brand-primary !default;\n$panel-primary-heading-bg:    $brand-primary !default;\n\n$panel-success-text:          $state-success-text !default;\n$panel-success-border:        $state-success-border !default;\n$panel-success-heading-bg:    $state-success-bg !default;\n\n$panel-info-text:             $state-info-text !default;\n$panel-info-border:           $state-info-border !default;\n$panel-info-heading-bg:       $state-info-bg !default;\n\n$panel-warning-text:          $state-warning-text !default;\n$panel-warning-border:        $state-warning-border !default;\n$panel-warning-heading-bg:    $state-warning-bg !default;\n\n$panel-danger-text:           $state-danger-text !default;\n$panel-danger-border:         $state-danger-border !default;\n$panel-danger-heading-bg:     $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding:           4px !default;\n//** Thumbnail background color\n$thumbnail-bg:                $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border:            #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius:     $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color:     $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding:   9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg:                     #f5f5f5 !default;\n$well-border:                 darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color:                 #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color:      #fff !default;\n$badge-bg:                    $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color:          $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg:             #fff !default;\n\n$badge-font-weight:           bold !default;\n$badge-line-height:           1 !default;\n$badge-border-radius:         10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical:   8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg:                 #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color:              #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color:       $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator:          \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color:                      #fff !default;\n$carousel-control-width:                      15% !default;\n$carousel-control-opacity:                    .5 !default;\n$carousel-control-font-size:                  20px !default;\n\n$carousel-indicator-active-bg:                #fff !default;\n$carousel-indicator-border-color:             #fff !default;\n\n$carousel-caption-color:                      #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight:           bold !default;\n$close-color:                 #000 !default;\n$close-text-shadow:           0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color:                  #c7254e !default;\n$code-bg:                     #f9f2f4 !default;\n\n$kbd-color:                   #fff !default;\n$kbd-bg:                      #333 !default;\n\n$pre-bg:                      #f5f5f5 !default;\n$pre-color:                   $gray-dark !default;\n$pre-border-color:            #ccc !default;\n$pre-scrollable-max-height:   340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted:                  $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color:           $gray-light !default;\n//** Headings small color\n$headings-small-color:        $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color:      $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size:        ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color:     $gray-lighter !default;\n//** Page header border color\n$page-header-border-color:    $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset:        $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border:                   $gray-lighter !default;\n","// WebKit-style focus\n\n@mixin tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n  display: $display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n    background-size: $width-1x $height-1x;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: $headings-font-family;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: $headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: $headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: $line-height-computed;\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: ($line-height-computed / 2);\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: $line-height-computed;\n  font-size: floor(($font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: $screen-sm-min) {\n    font-size: ($font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n  background-color: $state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (($line-height-computed / 2) - 1);\n  margin: ($line-height-computed * 2) 0 $line-height-computed;\n  border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: ($line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n  @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled;\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n  line-height: $line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: $dl-horizontal-breakpoint) {\n    dt {\n      float: left;\n      width: ($dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      @include text-overflow;\n    }\n    dd {\n      margin-left: $dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: ($line-height-computed / 2) $line-height-computed;\n  margin: 0 0 $line-height-computed;\n  font-size: $blockquote-font-size;\n  border-left: 5px solid $blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: $line-height-base;\n    color: $blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid $blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: $line-height-computed;\n  font-style: normal;\n  line-height: $line-height-base;\n}\n","// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n  #{$parent} {\n    color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    color: darken($color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n  #{$parent} {\n    background-color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    background-color: darken($color, 10%);\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n@mixin clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $code-color;\n  background-color: $code-bg;\n  border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  border-radius: $border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (($line-height-computed - 1) / 2);\n  margin: 0 0 ($line-height-computed / 2);\n  font-size: ($font-size-base - 1); // 14px to 13px\n  line-height: $line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: $pre-color;\n  background-color: $pre-bg;\n  border: 1px solid $pre-border-color;\n  border-radius: $border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: $pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  @include container-fixed;\n\n  @media (min-width: $screen-sm-min) {\n    width: $container-sm;\n  }\n  @media (min-width: $screen-md-min) {\n    width: $container-md;\n  }\n  @media (min-width: $screen-lg-min) {\n    width: $container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  @include container-fixed;\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  @include make-row;\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@include make-grid-columns;\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n@include make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: $screen-sm-min) {\n  @include make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: $screen-md-min) {\n  @include make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: $screen-lg-min) {\n  @include make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  floor(($gutter / 2));\n  padding-right: ceil(($gutter / 2));\n  @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n  margin-left:  ceil(($gutter / -2));\n  margin-right: floor(($gutter / -2));\n  @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage(($columns / $grid-columns));\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n  margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n  left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n  right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-sm-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-offset($columns) {\n  @media (min-width: $screen-sm-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-push($columns) {\n  @media (min-width: $screen-sm-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-pull($columns) {\n  @media (min-width: $screen-sm-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-md-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-offset($columns) {\n  @media (min-width: $screen-md-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-push($columns) {\n  @media (min-width: $screen-md-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-pull($columns) {\n  @media (min-width: $screen-md-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-lg-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-offset($columns) {\n  @media (min-width: $screen-lg-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-push($columns) {\n  @media (min-width: $screen-lg-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-pull($columns) {\n  @media (min-width: $screen-lg-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n  }\n  #{$list} {\n    position: relative;\n    // Prevent columns from collapsing when empty\n    min-height: 1px;\n    // Inner gutter via padding\n    padding-left:  ceil(($grid-gutter-width / 2));\n    padding-right: floor(($grid-gutter-width / 2));\n  }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-#{$class}-#{$i}\";\n  }\n  #{$list} {\n    float: left;\n  }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n  @if ($type == width) and ($index > 0) {\n    .col-#{$class}-#{$index} {\n      width: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index > 0) {\n    .col-#{$class}-push-#{$index} {\n      left: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index == 0) {\n    .col-#{$class}-push-0 {\n      left: auto;\n    }\n  }\n  @if ($type == pull) and ($index > 0) {\n    .col-#{$class}-pull-#{$index} {\n      right: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == pull) and ($index == 0) {\n    .col-#{$class}-pull-0 {\n      right: auto;\n    }\n  }\n  @if ($type == offset) {\n    .col-#{$class}-offset-#{$index} {\n      margin-left: percentage(($index / $grid-columns));\n    }\n  }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n  @for $i from 0 through $columns {\n    @include calc-grid-column($i, $class, $type);\n  }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n  @include float-grid-columns($class);\n  @include loop-grid-columns($grid-columns, $class, width);\n  @include loop-grid-columns($grid-columns, $class, pull);\n  @include loop-grid-columns($grid-columns, $class, push);\n  @include loop-grid-columns($grid-columns, $class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: $table-bg;\n}\ncaption {\n  padding-top: $table-cell-padding;\n  padding-bottom: $table-cell-padding;\n  color: $text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: $line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-cell-padding;\n        line-height: $line-height-base;\n        vertical-align: top;\n        border-top: 1px solid $table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid $table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid $table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: $body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid $table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid $table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: $table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: $table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: $screen-xs-max) {\n    width: 100%;\n    margin-bottom: ($line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid $table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.#{$state},\n    > th.#{$state},\n    &.#{$state} > td,\n    &.#{$state} > th {\n      background-color: $background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.#{$state}:hover,\n    > th.#{$state}:hover,\n    &.#{$state}:hover > td,\n    &:hover > .#{$state},\n    &.#{$state}:hover > th {\n      background-color: darken($background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: $line-height-computed;\n  font-size: ($font-size-base * 1.5);\n  line-height: inherit;\n  color: $legend-color;\n  border: 0;\n  border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  @include tab-focus;\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: ($padding-base-vertical + 1);\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n  background-color: $input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid $input-border;\n  border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  @include form-control-focus;\n\n  // Placeholder\n  @include placeholder;\n\n  // Unstyle the caret on `<select>`s in IE10+.\n  &::-ms-expand {\n    border: 0;\n    background-color: transparent;\n  }\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    background-color: $input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n  }\n\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n\n  // [converter] extracted textarea& to textarea.form-control\n}\n\n// Reset height for `textarea`s\ntextarea.form-control {\n  height: auto;\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    &.form-control {\n      line-height: $input-height-base;\n    }\n\n    &.input-sm,\n    .input-group-sm & {\n      line-height: $input-height-small;\n    }\n\n    &.input-lg,\n    .input-group-lg & {\n      line-height: $input-height-large;\n    }\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: $form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: ($padding-base-vertical + 1);\n  padding-bottom: ($padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n  min-height: ($line-height-computed + $font-size-base);\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);\n.form-group-sm {\n  .form-control {\n    height: $input-height-small;\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    line-height: $line-height-small;\n    border-radius: $input-border-radius-small;\n  }\n  select.form-control {\n    height: $input-height-small;\n    line-height: $input-height-small;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: $input-height-small;\n    min-height: ($line-height-computed + $font-size-small);\n    padding: ($padding-small-vertical + 1) $padding-small-horizontal;\n    font-size: $font-size-small;\n    line-height: $line-height-small;\n  }\n}\n\n@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);\n.form-group-lg {\n  .form-control {\n    height: $input-height-large;\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    line-height: $line-height-large;\n    border-radius: $input-border-radius-large;\n  }\n  select.form-control {\n    height: $input-height-large;\n    line-height: $input-height-large;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: $input-height-large;\n    min-height: ($line-height-computed + $font-size-large);\n    padding: ($padding-large-vertical + 1) $padding-large-horizontal;\n    font-size: $font-size-large;\n    line-height: $line-height-large;\n  }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: ($input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: $input-height-base;\n  height: $input-height-base;\n  line-height: $input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: $input-height-large;\n  height: $input-height-large;\n  line-height: $input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: $input-height-small;\n  height: $input-height-small;\n  line-height: $input-height-small;\n}\n\n// Feedback states\n.has-success {\n  @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);\n}\n.has-warning {\n  @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);\n}\n.has-error {\n  @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n    top: ($line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n    top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten($text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n// [converter] extracted from `.form-inline` for libsass compatibility\n@mixin form-inline {\n\n  // Kick in the inline\n  @media (min-width: $screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match.\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n// [converter] extracted as `@mixin form-inline` for libsass compatibility\n.form-inline {\n  @include form-inline;\n}\n\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: ($line-height-computed + ($padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    @include make-row;\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: $screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: floor(($grid-gutter-width / 2));\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: $screen-sm-min) {\n      .control-label {\n        padding-top: ($padding-large-vertical + 1);\n        font-size: $font-size-large;\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: $screen-sm-min) {\n      .control-label {\n        padding-top: ($padding-small-vertical + 1);\n        font-size: $font-size-small;\n      }\n    }\n  }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: $text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: $border-color;\n    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken($border-color, 10%);\n      $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);\n      @include box-shadow($shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: $text-color;\n    border-color: $border-color;\n    background-color: $background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: $text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus($color: $input-border-focus) {\n  $color-rgba: rgba(red($color), green($color), blue($color), .6);\n  &:focus {\n    border-color: $color;\n    outline: 0;\n    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  #{$parent} {\n    height: $input-height;\n    padding: $padding-vertical $padding-horizontal;\n    font-size: $font-size;\n    line-height: $line-height;\n    border-radius: $border-radius;\n  }\n\n  select#{$parent} {\n    height: $input-height;\n    line-height: $input-height;\n  }\n\n  textarea#{$parent},\n  select[multiple]#{$parent} {\n    height: auto;\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: $btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n  @include user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      @include tab-focus;\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: $btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n    @include opacity(.65);\n    @include box-shadow(none);\n  }\n\n  // [converter] extracted a& to a.btn\n}\n\na.btn {\n  &.disabled,\n  fieldset[disabled] & {\n    pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: $link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    @include box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: $btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n\n  &:focus,\n  &.focus {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 25%);\n  }\n  &:hover {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n\n    &:hover,\n    &:focus,\n    &.focus {\n      color: $color;\n      background-color: darken($background, 17%);\n          border-color: darken($border, 25%);\n    }\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus,\n    &.focus {\n      background-color: $background;\n          border-color: $border;\n    }\n  }\n\n  .badge {\n    color: $background;\n    background-color: $color;\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  padding: $padding-vertical $padding-horizontal;\n  font-size: $font-size;\n  line-height: $line-height;\n  border-radius: $border-radius;\n}\n","// Opacity\n\n@mixin opacity($opacity) {\n  opacity: $opacity;\n  // IE8 filter\n  $opacity-ie: ($opacity * 100);\n  filter: alpha(opacity=$opacity-ie);\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  @include transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  // [converter] extracted tr&.in to tr.collapse.in\n  // [converter] extracted tbody&.in to tbody.collapse.in\n}\n\ntr.collapse.in    { display: table-row; }\n\ntbody.collapse.in { display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  @include transition-property(height, visibility);\n  @include transition-duration(.35s);\n  @include transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   $caret-width-base dashed;\n  border-top:   $caret-width-base solid \\9; // IE8\n  border-right: $caret-width-base solid transparent;\n  border-left:  $caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: $zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: $font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: $dropdown-bg;\n  border: 1px solid $dropdown-fallback-border; // IE8 fallback\n  border: 1px solid $dropdown-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    @include nav-divider($dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: $line-height-base;\n    color: $dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $dropdown-link-hover-color;\n    background-color: $dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: $dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    @include reset-filter;\n    cursor: $cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: $font-size-small;\n  line-height: $line-height-base;\n  color: $dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: ($zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: $caret-width-base dashed;\n    border-bottom: $caret-width-base solid \\9; // IE8\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      right: 0; left: auto;\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      left: 0; right: auto;\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n  height: 1px;\n  margin: (($line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: $color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  @include clearfix;\n\n  .btn,\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    @include border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { @extend .btn-xs; }\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: $caret-width-large $caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 $caret-width-large $caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    @include clearfix;\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    @include border-top-radius($btn-border-radius-base);\n    @include border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    @include border-top-radius(0);\n    @include border-bottom-radius($btn-border-radius-base);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","// Single side border-radius\n\n@mixin border-top-radius($radius) {\n  border-top-right-radius: $radius;\n   border-top-left-radius: $radius;\n}\n@mixin border-right-radius($radius) {\n  border-bottom-right-radius: $radius;\n     border-top-right-radius: $radius;\n}\n@mixin border-bottom-radius($radius) {\n  border-bottom-right-radius: $radius;\n   border-bottom-left-radius: $radius;\n}\n@mixin border-left-radius($radius) {\n  border-bottom-left-radius: $radius;\n     border-top-left-radius: $radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n    \n    &:focus {\n      z-index: 3;\n    }\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  @extend .input-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  @extend .input-sm;\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: $input-color;\n  text-align: center;\n  background-color: $input-group-addon-bg;\n  border: 1px solid $input-group-addon-border-color;\n  border-radius: $input-border-radius;\n\n  // Sizing\n  &.input-sm {\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    border-radius: $input-border-radius-small;\n  }\n  &.input-lg {\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    border-radius: $input-border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  @include border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  @include border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      z-index: 2;\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  @include clearfix;\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: $nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: $nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: $nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: $nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: $cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: $nav-link-hover-bg;\n      border-color: $link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    @include nav-divider;\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid $nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: $line-height-base;\n      border: 1px solid transparent;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n      &:hover {\n        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-tabs-active-link-hover-color;\n        background-color: $nav-tabs-active-link-hover-bg;\n        border: 1px solid $nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    @extend .nav-justified;\n    @extend .nav-tabs-justified;\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: $nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-pills-active-link-hover-color;\n        background-color: $nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: $border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid $nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid $nav-tabs-justified-link-border-color;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: $nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  @include border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: $navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: $navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: $navbar-padding-horizontal;\n  padding-left:  $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  @include clearfix;\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: $navbar-collapse-max-height;\n\n    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -$navbar-padding-horizontal;\n    margin-left:  -$navbar-padding-horizontal;\n\n    @media (min-width: $grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: $zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: $zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: $navbar-padding-vertical $navbar-padding-horizontal;\n  font-size: $font-size-large;\n  line-height: $line-height-computed;\n  height: $navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -$navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: $navbar-padding-horizontal;\n  padding: 9px 10px;\n  @include navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: $border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: $line-height-computed;\n  }\n\n  @media (max-width: $grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: $line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    $navbar-padding-vertical;\n        padding-bottom: $navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -$navbar-padding-horizontal;\n  margin-right: -$navbar-padding-horizontal;\n  padding: 10px $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  @include box-shadow($shadow);\n\n  // Mixin behavior for optimum display\n  @include form-inline;\n\n  .form-group {\n    @media (max-width: $grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  @include navbar-vertical-align($input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    @include box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  @include border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  @include border-top-radius($navbar-border-radius);\n  @include border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  @include navbar-vertical-align($input-height-base);\n\n  &.btn-sm {\n    @include navbar-vertical-align($input-height-small);\n  }\n  &.btn-xs {\n    @include navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  @include navbar-vertical-align($line-height-computed);\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin-left: $navbar-padding-horizontal;\n    margin-right: $navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  margin-right: -$navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: $navbar-default-bg;\n  border-color: $navbar-default-border;\n\n  .navbar-brand {\n    color: $navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-brand-hover-color;\n      background-color: $navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-hover-color;\n        background-color: $navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-active-color;\n        background-color: $navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n        background-color: $navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: $navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: $navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-default-link-active-bg;\n        color: $navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: $navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-hover-color;\n            background-color: $navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-active-color;\n            background-color: $navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-disabled-color;\n            background-color: $navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: $navbar-default-link-color;\n    &:hover {\n      color: $navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: $navbar-inverse-bg;\n  border-color: $navbar-inverse-border;\n\n  .navbar-brand {\n    color: $navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-brand-hover-color;\n      background-color: $navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-hover-color;\n        background-color: $navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-active-color;\n        background-color: $navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n        background-color: $navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: $navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken($navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-inverse-link-active-bg;\n        color: $navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: $navbar-inverse-border;\n        }\n        .divider {\n          background-color: $navbar-inverse-border;\n        }\n        > li > a {\n          color: $navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-hover-color;\n            background-color: $navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-active-color;\n            background-color: $navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-disabled-color;\n            background-color: $navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: $navbar-inverse-link-color;\n    &:hover {\n      color: $navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n  margin-top: (($navbar-height - $element-height) / 2);\n  margin-bottom: (($navbar-height - $element-height) / 2);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n  margin-bottom: $line-height-computed;\n  list-style: none;\n  background-color: $breadcrumb-bg;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      // [converter] Workaround for https://github.com/sass/libsass/issues/1115\n      $nbsp: \"\\00a0\";\n      content: \"#{$breadcrumb-separator}#{$nbsp}\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: $breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: $breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: $padding-base-vertical $padding-base-horizontal;\n      line-height: $line-height-base;\n      text-decoration: none;\n      color: $pagination-color;\n      background-color: $pagination-bg;\n      border: 1px solid $pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        @include border-left-radius($border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: $pagination-hover-color;\n      background-color: $pagination-hover-bg;\n      border-color: $pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 3;\n      color: $pagination-active-color;\n      background-color: $pagination-active-bg;\n      border-color: $pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: $pagination-disabled-color;\n      background-color: $pagination-disabled-bg;\n      border-color: $pagination-disabled-border;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n","// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: $padding-vertical $padding-horizontal;\n      font-size: $font-size;\n      line-height: $line-height;\n    }\n    &:first-child {\n      > a,\n      > span {\n        @include border-left-radius($border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  @include clearfix;\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: $pager-bg;\n      border: 1px solid $pager-border;\n      border-radius: $pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: $pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: $pager-disabled-color;\n      background-color: $pager-bg;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: $label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // [converter] extracted a& to a.label\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Add hover effects, but only for links\na.label {\n  &:hover,\n  &:focus {\n    color: $label-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  @include label-variant($label-default-bg);\n}\n\n.label-primary {\n  @include label-variant($label-primary-bg);\n}\n\n.label-success {\n  @include label-variant($label-success-bg);\n}\n\n.label-info {\n  @include label-variant($label-info-bg);\n}\n\n.label-warning {\n  @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n  @include label-variant($label-danger-bg);\n}\n","// Labels\n\n@mixin label-variant($color) {\n  background-color: $color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken($color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: $font-size-small;\n  font-weight: $badge-font-weight;\n  color: $badge-color;\n  line-height: $badge-line-height;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: $badge-bg;\n  border-radius: $badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // [converter] extracted a& to a.badge\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: $badge-active-color;\n    background-color: $badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: $badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding-top:    $jumbotron-padding;\n  padding-bottom: $jumbotron-padding;\n  margin-bottom: $jumbotron-padding;\n  color: $jumbotron-color;\n  background-color: $jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: $jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: ($jumbotron-padding / 2);\n    font-size: $jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken($jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container\n    padding-left:  ($grid-gutter-width / 2);\n    padding-right: ($grid-gutter-width / 2);\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: $screen-sm-min) {\n    padding-top:    ($jumbotron-padding * 1.6);\n    padding-bottom: ($jumbotron-padding * 1.6);\n\n    .container &,\n    .container-fluid & {\n      padding-left:  ($jumbotron-padding * 2);\n      padding-right: ($jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: $jumbotron-heading-font-size;\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: $thumbnail-padding;\n  margin-bottom: $line-height-computed;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    @include img-responsive;\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active\n\n  // Image captions\n  .caption {\n    padding: $thumbnail-caption-padding;\n    color: $thumbnail-caption-color;\n  }\n}\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: $link-color;\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: $alert-padding;\n  margin-bottom: $line-height-computed;\n  border: 1px solid transparent;\n  border-radius: $alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing $headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: $alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: ($alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n","// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n  background-color: $background;\n  border-color: $border;\n  color: $text-color;\n\n  hr {\n    border-top-color: darken($border, 5%);\n  }\n  .alert-link {\n    color: darken($text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: $line-height-computed;\n  margin-bottom: $line-height-computed;\n  background-color: $progress-bg;\n  border-radius: $progress-border-radius;\n  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: $font-size-small;\n  line-height: $line-height-computed;\n  color: $progress-bar-color;\n  text-align: center;\n  background-color: $progress-bar-bg;\n  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  @include transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  @include gradient-striped;\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  @include animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  @include progress-bar-variant($progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  @include progress-bar-variant($progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  @include progress-bar-variant($progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  @include progress-bar-variant($progress-bar-danger-bg);\n}\n","// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n  background-repeat: repeat-x;\n  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// Progress bars\n\n@mixin progress-bar-variant($color) {\n  background-color: $color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    @include gradient-striped;\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n\n  // Fix collapse in webkit from max-width: 100% and display: table-cell.\n  &.img-thumbnail {\n    max-width: none;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: $list-group-bg;\n  border: 1px solid $list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    @include border-top-radius($list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    @include border-bottom-radius($list-group-border-radius);\n  }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n  color: $list-group-link-color;\n\n  .list-group-item-heading {\n    color: $list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $list-group-link-hover-color;\n    background-color: $list-group-hover-bg;\n  }\n}\n\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: $list-group-disabled-bg;\n    color: $list-group-disabled-color;\n    cursor: $cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: $list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: $list-group-active-color;\n    background-color: $list-group-active-bg;\n    border-color: $list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: $list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@include list-group-item-variant(success, $state-success-bg, $state-success-text);\n@include list-group-item-variant(info, $state-info-bg, $state-info-text);\n@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);\n@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n  .list-group-item-#{$state} {\n    color: $color;\n    background-color: $background;\n\n    // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}\n  }\n\n  a.list-group-item-#{$state},\n  button.list-group-item-#{$state} {\n    color: $color;\n\n    .list-group-item-heading {\n      color: inherit;\n    }\n\n    &:hover,\n    &:focus {\n      color: $color;\n      background-color: darken($background, 5%);\n    }\n    &.active,\n    &.active:hover,\n    &.active:focus {\n      color: #fff;\n      background-color: $color;\n      border-color: $color;\n    }\n  }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: $line-height-computed;\n  background-color: $panel-bg;\n  border: 1px solid transparent;\n  border-radius: $panel-border-radius;\n  @include box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: $panel-body-padding;\n  @include clearfix;\n}\n\n// Optional heading\n.panel-heading {\n  padding: $panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  @include border-top-radius(($panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil(($font-size-base * 1.125));\n  color: inherit;\n\n  > a,\n  > small,\n  > .small,\n  > small > a,\n  > .small > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: $panel-footer-padding;\n  background-color: $panel-footer-bg;\n  border-top: 1px solid $panel-inner-border;\n  @include border-bottom-radius(($panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        @include border-top-radius(($panel-border-radius - 1));\n      }\n    }\n\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        @include border-bottom-radius(($panel-border-radius - 1));\n      }\n    }\n  }\n  > .panel-heading + .panel-collapse > .list-group {\n    .list-group-item:first-child {\n      @include border-top-radius(0);\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: $panel-body-padding;\n      padding-right: $panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    @include border-top-radius(($panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: ($panel-border-radius - 1);\n        border-top-right-radius: ($panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: ($panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: ($panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    @include border-bottom-radius(($panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: ($panel-border-radius - 1);\n        border-bottom-right-radius: ($panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: ($panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: ($panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid $table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: $line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: $panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid $panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid $panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);\n}\n.panel-primary {\n  @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);\n}\n.panel-success {\n  @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);\n}\n.panel-info {\n  @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);\n}\n.panel-warning {\n  @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);\n}\n.panel-danger {\n  @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);\n}\n","// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n  border-color: $border;\n\n  & > .panel-heading {\n    color: $heading-text-color;\n    background-color: $heading-bg-color;\n    border-color: $heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: $border;\n    }\n    .badge {\n      color: $heading-bg-color;\n      background-color: $heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: $border;\n    }\n  }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: $well-bg;\n  border: 1px solid $well-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: $border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: $border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: ($font-size-base * 1.5);\n  font-weight: $close-font-weight;\n  line-height: 1;\n  color: $close-color;\n  text-shadow: $close-text-shadow;\n  @include opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: $close-color;\n    text-decoration: none;\n    cursor: pointer;\n    @include opacity(.5);\n  }\n\n  // [converter] extracted button& to button.close\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    @include translate(0, -25%);\n    @include transition-transform(0.3s ease-out);\n  }\n  &.in .modal-dialog { @include translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: $modal-content-bg;\n  border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid $modal-content-border-color;\n  border-radius: $border-radius-large;\n  @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-modal-background;\n  background-color: $modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { @include opacity(0); }\n  &.in { @include opacity($modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: $modal-title-padding;\n  border-bottom: 1px solid $modal-header-border-color;\n  @include clearfix;\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: $modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid $modal-footer-border-color;\n  @include clearfix; // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: $screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: $modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    @include box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: $modal-sm; }\n}\n\n@media (min-width: $screen-md-min) {\n  .modal-lg { width: $modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: $zindex-tooltip;\n  display: block;\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text;\n  font-size: $font-size-small;\n\n  @include opacity(0);\n\n  &.in     { @include opacity($tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: $tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 $tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: $tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 $tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: $tooltip-max-width;\n  padding: 3px 8px;\n  color: $tooltip-color;\n  text-align: center;\n  background-color: $tooltip-bg;\n  border-radius: $border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: $tooltip-arrow-width;\n    margin-bottom: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: $tooltip-arrow-width;\n    margin-bottom: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-right-color: $tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-left-color: $tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: $tooltip-arrow-width;\n    margin-top: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: $tooltip-arrow-width;\n    margin-top: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n}\n","@mixin reset-text() {\n  font-family: $font-family-base;\n  // We deliberately do NOT reset font-size.\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: $line-height-base;\n  text-align: left; // Fallback for where `start` is not supported\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: $zindex-popover;\n  display: none;\n  max-width: $popover-max-width;\n  padding: 1px;\n  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text;\n  font-size: $font-size-base;\n\n  background-color: $popover-bg;\n  background-clip: padding-box;\n  border: 1px solid $popover-fallback-border-color;\n  border: 1px solid $popover-border-color;\n  border-radius: $border-radius-large;\n  @include box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -$popover-arrow-width; }\n  &.right   { margin-left: $popover-arrow-width; }\n  &.bottom  { margin-top: $popover-arrow-width; }\n  &.left    { margin-left: -$popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: $font-size-base;\n  background-color: $popover-title-bg;\n  border-bottom: 1px solid darken($popover-title-bg, 5%);\n  border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: $popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: $popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -$popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: $popover-arrow-outer-color;\n    bottom: -$popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -$popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: $popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -$popover-arrow-outer-width;\n    margin-top: -$popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: $popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -$popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: $popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -$popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: $popover-arrow-outer-color;\n    top: -$popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -$popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: $popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -$popover-arrow-outer-width;\n    margin-top: -$popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: $popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: $popover-arrow-color;\n      bottom: -$popover-arrow-width;\n    }\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    @include transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      @include img-responsive;\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      @include transition-transform(0.6s ease-in-out);\n      @include backface-visibility(hidden);\n      @include perspective(1000px);\n\n      &.next,\n      &.active.right {\n        @include translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        @include translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        @include translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: $carousel-control-width;\n  @include opacity($carousel-control-opacity);\n  font-size: $carousel-control-font-size;\n  color: $carousel-control-color;\n  text-align: center;\n  text-shadow: $carousel-text-shadow;\n  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: $carousel-control-color;\n    text-decoration: none;\n    @include opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    margin-top: -10px;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    line-height: 1;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid $carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: $carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: $carousel-caption-color;\n  text-align: center;\n  text-shadow: $carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: $screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: ($carousel-control-font-size * 1.5);\n      height: ($carousel-control-font-size * 1.5);\n      margin-top: ($carousel-control-font-size / -2);\n      font-size: ($carousel-control-font-size * 1.5);\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: ($carousel-control-font-size / -2);\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: ($carousel-control-font-size / -2);\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  @include clearfix;\n}\n.center-block {\n  @include center-block;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  @include text-hide;\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","// Center-align a block level element\n\n@mixin center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n@mixin hide-text() {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n@mixin text-hide() {\n  @include hide-text;\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@at-root {\n  @-ms-viewport {\n    width: device-width;\n  }\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n\n@include responsive-invisibility('.visible-xs');\n@include responsive-invisibility('.visible-sm');\n@include responsive-invisibility('.visible-md');\n@include responsive-invisibility('.visible-lg');\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n@media (max-width: $screen-xs-max) {\n  @include responsive-visibility('.visible-xs');\n}\n.visible-xs-block {\n  @media (max-width: $screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: $screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: $screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n  @include responsive-visibility('.visible-sm');\n}\n.visible-sm-block {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n  @include responsive-visibility('.visible-md');\n}\n.visible-md-block {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-lg-min) {\n  @include responsive-visibility('.visible-lg');\n}\n.visible-lg-block {\n  @media (min-width: $screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: $screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: $screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n@media (max-width: $screen-xs-max) {\n  @include responsive-invisibility('.hidden-xs');\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n  @include responsive-invisibility('.hidden-sm');\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n  @include responsive-invisibility('.hidden-md');\n}\n\n@media (min-width: $screen-lg-min) {\n  @include responsive-invisibility('.hidden-lg');\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n\n@include responsive-invisibility('.visible-print');\n\n@media print {\n  @include responsive-visibility('.visible-print');\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n@media print {\n  @include responsive-invisibility('.hidden-print');\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent hack\n@mixin responsive-visibility($parent) {\n  #{$parent} {\n    display: block !important;\n  }\n  table#{$parent}  { display: table !important; }\n  tr#{$parent}     { display: table-row !important; }\n  th#{$parent},\n  td#{$parent}     { display: table-cell !important; }\n}\n\n// [converter] $parent hack\n@mixin responsive-invisibility($parent) {\n  #{$parent} {\n    display: none !important;\n  }\n}\n","/*!\n * Start Bootstrap - SB Admin Bootstrap Admin Template (http://startbootstrap.com)\n * Code licensed under the Apache License v2.0.\n * For details, see http://www.apache.org/licenses/LICENSE-2.0.\n */\n\n/* Global Styles */\n\nbody {\n  margin-top: 100px;\n  background-color: #222;\n}\n\n@media (min-width: 768px) {\n  body {\n    margin-top: 50px;\n  }\n}\n\n#wrapper {\n  padding-left: 0;\n}\n\n#page-wrapper {\n  width: 100%;\n  padding: 0;\n  background-color: #fff;\n}\n\n.huge {\n  font-size: 50px;\n  line-height: normal;\n}\n\n@media (min-width: 768px) {\n  #wrapper {\n    padding-left: 225px;\n  }\n  #page-wrapper {\n    padding: 10px;\n  }\n}\n\n/* Top Navigation */\n\n.top-nav {\n  padding: 0 15px;\n  > {\n    li {\n      display: inline-block;\n      float: left;\n      > a {\n        padding-top: 15px;\n        padding-bottom: 15px;\n        line-height: 20px;\n        color: #999;\n        &:hover, &:focus {\n          color: #fff;\n          background-color: #000;\n        }\n      }\n    }\n    .open > {\n      a {\n        color: #fff;\n        background-color: #000;\n        &:hover, &:focus {\n          color: #fff;\n          background-color: #000;\n        }\n      }\n      .dropdown-menu {\n        float: left;\n        position: absolute;\n        margin-top: 0;\n        border: 1px solid rgba(0, 0, 0, 0.15);\n        border-top-left-radius: 0;\n        border-top-right-radius: 0;\n        background-color: #fff;\n        -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n        box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n        > li > a {\n          white-space: normal;\n        }\n      }\n    }\n  }\n}\n\nul.message-dropdown {\n  padding: 0;\n  max-height: 250px;\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\nli {\n  &.message-preview {\n    width: 275px;\n    border-bottom: 1px solid rgba(0, 0, 0, 0.15);\n    > a {\n      padding-top: 15px;\n      padding-bottom: 15px;\n    }\n  }\n  &.message-footer {\n    margin: 5px 0;\n  }\n}\n\nul.alert-dropdown {\n  width: 200px;\n}\n\n/* Side Navigation */\n\n@media (min-width: 768px) {\n  .side-nav {\n    position: fixed;\n    top: 51px;\n    left: 225px;\n    width: 225px;\n    margin-left: -225px;\n    border: none;\n    border-radius: 0;\n    overflow-y: auto;\n    background-color: #222;\n    bottom: 0;\n    overflow-x: hidden;\n    padding-bottom: 40px;\n    > li > a {\n      width: 225px;\n    }\n    li a {\n      &:hover, &:focus {\n        outline: none;\n        background-color: #000 !important;\n      }\n    }\n  }\n}\n\n.side-nav > li > ul {\n  padding: 0;\n  > li > a {\n    display: block;\n    padding: 10px 15px 10px 38px;\n    text-decoration: none;\n    color: #999;\n    &:hover {\n      color: #fff;\n    }\n  }\n}\n\n/* Flot Chart Containers */\n\n.flot-chart {\n  display: block;\n  height: 400px;\n}\n\n.flot-chart-content {\n  width: 100%;\n  height: 100%;\n}\n\n/* Custom Colored Panels */\n\n.huge {\n  font-size: 40px;\n}\n\n.panel-green {\n  border-color: #5cb85c;\n  > {\n    .panel-heading {\n      border-color: #5cb85c;\n      color: #fff;\n      background-color: #5cb85c;\n    }\n    a {\n      color: #5cb85c;\n      &:hover {\n        color: #3d8b3d;\n      }\n    }\n  }\n}\n\n.panel-red {\n  border-color: #d9534f;\n  > {\n    .panel-heading {\n      border-color: #d9534f;\n      color: #fff;\n      background-color: #d9534f;\n    }\n    a {\n      color: #d9534f;\n      &:hover {\n        color: #b52b27;\n      }\n    }\n  }\n}\n\n.panel-yellow {\n  border-color: #f0ad4e;\n  > {\n    .panel-heading {\n      border-color: #f0ad4e;\n      color: #fff;\n      background-color: #f0ad4e;\n    }\n    a {\n      color: #f0ad4e;\n      &:hover {\n        color: #df8a13;\n      }\n    }\n  }\n}\n\n.navbar {\n  border-radius: 0px;\n}\n"],"sourceRoot":"/source/"}
        \ No newline at end of file
        diff --git a/public/assets/css/AdminLTE.css b/public/assets/css/AdminLTE.css
        deleted file mode 100755
        index 2b6b9ee7bf..0000000000
        --- a/public/assets/css/AdminLTE.css
        +++ /dev/null
        @@ -1,4729 +0,0 @@
        -@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);
        -/*!
        - *   AdminLTE v2.3.0
        - *   Author: Almsaeed Studio
        - *	 Website: Almsaeed Studio <http://almsaeedstudio.com>
        - *   License: Open source - MIT
        - *           Please visit http://opensource.org/licenses/MIT for more information
        -!*/
        -/*
        - * Core: General Layout Style
        - * -------------------------
        - */
        -html,
        -body {
        -  min-height: 100%;
        -}
        -.layout-boxed html,
        -.layout-boxed body {
        -  height: 100%;
        -}
        -body {
        -  -webkit-font-smoothing: antialiased;
        -  -moz-osx-font-smoothing: grayscale;
        -  font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
        -  font-weight: 400;
        -  overflow-x: hidden;
        -  overflow-y: auto;
        -}
        -/* Layout */
        -.wrapper {
        -  min-height: 100%;
        -  position: static;
        -  overflow: hidden;
        -}
        -.wrapper:before,
        -.wrapper:after {
        -  content: " ";
        -  display: table;
        -}
        -.wrapper:after {
        -  clear: both;
        -}
        -.layout-boxed .wrapper {
        -  max-width: 1250px;
        -  margin: 0 auto;
        -  min-height: 100%;
        -  box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);
        -  position: relative;
        -}
        -.layout-boxed {
        -  background: url('../img/boxed-bg.jpg') repeat fixed;
        -}
        -/*
        - * Content Wrapper - contains the main content
        - * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```
        - */
        -.content-wrapper,
        -.right-side,
        -.main-footer {
        -  -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out;
        -  -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out;
        -  -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out;
        -  transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out;
        -  margin-left: 230px;
        -  z-index: 820;
        -}
        -.layout-top-nav .content-wrapper,
        -.layout-top-nav .right-side,
        -.layout-top-nav .main-footer {
        -  margin-left: 0;
        -}
        -@media (max-width: 767px) {
        -  .content-wrapper,
        -  .right-side,
        -  .main-footer {
        -    margin-left: 0;
        -  }
        -}
        -@media (min-width: 768px) {
        -  .sidebar-collapse .content-wrapper,
        -  .sidebar-collapse .right-side,
        -  .sidebar-collapse .main-footer {
        -    margin-left: 0;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .sidebar-open .content-wrapper,
        -  .sidebar-open .right-side,
        -  .sidebar-open .main-footer {
        -    -webkit-transform: translate(230px, 0);
        -    -ms-transform: translate(230px, 0);
        -    -o-transform: translate(230px, 0);
        -    transform: translate(230px, 0);
        -  }
        -}
        -.content-wrapper,
        -.right-side {
        -  min-height: 100%;
        -  background-color: #ecf0f5;
        -  z-index: 800;
        -}
        -.main-footer {
        -  background: #fff;
        -  padding: 15px;
        -  color: #444;
        -  border-top: 1px solid #d2d6de;
        -}
        -/* Fixed layout */
        -.fixed .main-header,
        -.fixed .main-sidebar,
        -.fixed .left-side {
        -  position: fixed;
        -}
        -.fixed .main-header {
        -  top: 0;
        -  right: 0;
        -  left: 0;
        -}
        -.fixed .content-wrapper,
        -.fixed .right-side {
        -  padding-top: 50px;
        -}
        -@media (max-width: 767px) {
        -  .fixed .content-wrapper,
        -  .fixed .right-side {
        -    padding-top: 100px;
        -  }
        -}
        -.fixed.layout-boxed .wrapper {
        -  max-width: 100%;
        -}
        -body.hold-transition .content-wrapper,
        -body.hold-transition .right-side,
        -body.hold-transition .main-footer,
        -body.hold-transition .main-sidebar,
        -body.hold-transition .left-side,
        -body.hold-transition .main-header > .navbar,
        -body.hold-transition .main-header .logo {
        -  /* Fix for IE */
        -  -webkit-transition: none;
        -  -o-transition: none;
        -  transition: none;
        -}
        -/* Content */
        -.content {
        -  min-height: 250px;
        -  padding: 15px;
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px;
        -}
        -/* H1 - H6 font */
        -h1,
        -h2,
        -h3,
        -h4,
        -h5,
        -h6,
        -.h1,
        -.h2,
        -.h3,
        -.h4,
        -.h5,
        -.h6 {
        -  font-family: 'Source Sans Pro', sans-serif;
        -}
        -/* General Links */
        -a {
        -  color: #3c8dbc;
        -}
        -a:hover,
        -a:active,
        -a:focus {
        -  outline: none;
        -  text-decoration: none;
        -  color: #72afd2;
        -}
        -/* Page Header */
        -.page-header {
        -  margin: 10px 0 20px 0;
        -  font-size: 22px;
        -}
        -.page-header > small {
        -  color: #666;
        -  display: block;
        -  margin-top: 5px;
        -}
        -/*
        - * Component: Main Header
        - * ----------------------
        - */
        -.main-header {
        -  position: relative;
        -  max-height: 100px;
        -  z-index: 1030;
        -}
        -.main-header > .navbar {
        -  -webkit-transition: margin-left 0.3s ease-in-out;
        -  -o-transition: margin-left 0.3s ease-in-out;
        -  transition: margin-left 0.3s ease-in-out;
        -  margin-bottom: 0;
        -  margin-left: 230px;
        -  border: none;
        -  min-height: 50px;
        -  border-radius: 0;
        -}
        -.layout-top-nav .main-header > .navbar {
        -  margin-left: 0;
        -}
        -.main-header #navbar-search-input.form-control {
        -  background: rgba(255, 255, 255, 0.2);
        -  border-color: transparent;
        -}
        -.main-header #navbar-search-input.form-control:focus,
        -.main-header #navbar-search-input.form-control:active {
        -  border-color: rgba(0, 0, 0, 0.1);
        -  background: rgba(255, 255, 255, 0.9);
        -}
        -.main-header #navbar-search-input.form-control::-moz-placeholder {
        -  color: #ccc;
        -  opacity: 1;
        -}
        -.main-header #navbar-search-input.form-control:-ms-input-placeholder {
        -  color: #ccc;
        -}
        -.main-header #navbar-search-input.form-control::-webkit-input-placeholder {
        -  color: #ccc;
        -}
        -.main-header .navbar-custom-menu,
        -.main-header .navbar-right {
        -  float: right;
        -}
        -@media (max-width: 991px) {
        -  .main-header .navbar-custom-menu a,
        -  .main-header .navbar-right a {
        -    color: inherit;
        -    background: transparent;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .main-header .navbar-right {
        -    float: none;
        -  }
        -  .navbar-collapse .main-header .navbar-right {
        -    margin: 7.5px -15px;
        -  }
        -  .main-header .navbar-right > li {
        -    color: inherit;
        -    border: 0;
        -  }
        -}
        -.main-header .sidebar-toggle {
        -  float: left;
        -  background-color: transparent;
        -  background-image: none;
        -  padding: 15px 15px;
        -  font-family: fontAwesome;
        -}
        -.main-header .sidebar-toggle:before {
        -  content: "\f0c9";
        -}
        -.main-header .sidebar-toggle:hover {
        -  color: #fff;
        -}
        -.main-header .sidebar-toggle:focus,
        -.main-header .sidebar-toggle:active {
        -  background: transparent;
        -}
        -.main-header .sidebar-toggle .icon-bar {
        -  display: none;
        -}
        -.main-header .navbar .nav > li.user > a > .fa,
        -.main-header .navbar .nav > li.user > a > .glyphicon,
        -.main-header .navbar .nav > li.user > a > .ion {
        -  margin-right: 5px;
        -}
        -.main-header .navbar .nav > li > a > .label {
        -  position: absolute;
        -  top: 9px;
        -  right: 7px;
        -  text-align: center;
        -  font-size: 9px;
        -  padding: 2px 3px;
        -  line-height: .9;
        -}
        -.main-header .logo {
        -  -webkit-transition: width 0.3s ease-in-out;
        -  -o-transition: width 0.3s ease-in-out;
        -  transition: width 0.3s ease-in-out;
        -  display: block;
        -  float: left;
        -  height: 50px;
        -  font-size: 20px;
        -  line-height: 50px;
        -  text-align: center;
        -  width: 230px;
        -  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        -  padding: 0 15px;
        -  font-weight: 300;
        -  overflow: hidden;
        -}
        -.main-header .logo .logo-lg {
        -  display: block;
        -}
        -.main-header .logo .logo-mini {
        -  display: none;
        -}
        -.main-header .navbar-brand {
        -  color: #fff;
        -}
        -.content-header {
        -  position: relative;
        -  padding: 15px 15px 0 15px;
        -}
        -.content-header > h1 {
        -  margin: 0;
        -  font-size: 24px;
        -}
        -.content-header > h1 > small {
        -  font-size: 15px;
        -  display: inline-block;
        -  padding-left: 4px;
        -  font-weight: 300;
        -}
        -.content-header > .breadcrumb {
        -  float: right;
        -  background: transparent;
        -  margin-top: 0;
        -  margin-bottom: 0;
        -  font-size: 12px;
        -  padding: 7px 5px;
        -  position: absolute;
        -  top: 15px;
        -  right: 10px;
        -  border-radius: 2px;
        -}
        -.content-header > .breadcrumb > li > a {
        -  color: #444;
        -  text-decoration: none;
        -  display: inline-block;
        -}
        -.content-header > .breadcrumb > li > a > .fa,
        -.content-header > .breadcrumb > li > a > .glyphicon,
        -.content-header > .breadcrumb > li > a > .ion {
        -  margin-right: 5px;
        -}
        -.content-header > .breadcrumb > li + li:before {
        -  content: '>\00a0';
        -}
        -@media (max-width: 991px) {
        -  .content-header > .breadcrumb {
        -    position: relative;
        -    margin-top: 5px;
        -    top: 0;
        -    right: 0;
        -    float: none;
        -    background: #d2d6de;
        -    padding-left: 10px;
        -  }
        -  .content-header > .breadcrumb li:before {
        -    color: #97a0b3;
        -  }
        -}
        -.navbar-toggle {
        -  color: #fff;
        -  border: 0;
        -  margin: 0;
        -  padding: 15px 15px;
        -}
        -@media (max-width: 991px) {
        -  .navbar-custom-menu .navbar-nav > li {
        -    float: left;
        -  }
        -  .navbar-custom-menu .navbar-nav {
        -    margin: 0;
        -    float: left;
        -  }
        -  .navbar-custom-menu .navbar-nav > li > a {
        -    padding-top: 15px;
        -    padding-bottom: 15px;
        -    line-height: 20px;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .main-header {
        -    position: relative;
        -  }
        -  .main-header .logo,
        -  .main-header .navbar {
        -    width: 100%;
        -    float: none;
        -  }
        -  .main-header .navbar {
        -    margin: 0;
        -  }
        -  .main-header .navbar-custom-menu {
        -    float: right;
        -  }
        -}
        -@media (max-width: 991px) {
        -  .navbar-collapse.pull-left {
        -    float: none!important;
        -  }
        -  .navbar-collapse.pull-left + .navbar-custom-menu {
        -    display: block;
        -    position: absolute;
        -    top: 0;
        -    right: 40px;
        -  }
        -}
        -/*
        - * Component: Sidebar
        - * ------------------
        - */
        -.main-sidebar,
        -.left-side {
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  padding-top: 50px;
        -  min-height: 100%;
        -  width: 230px;
        -  z-index: 810;
        -  -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out;
        -  -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out;
        -  -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out;
        -  transition: transform 0.3s ease-in-out, width 0.3s ease-in-out;
        -}
        -@media (max-width: 767px) {
        -  .main-sidebar,
        -  .left-side {
        -    padding-top: 100px;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .main-sidebar,
        -  .left-side {
        -    -webkit-transform: translate(-230px, 0);
        -    -ms-transform: translate(-230px, 0);
        -    -o-transform: translate(-230px, 0);
        -    transform: translate(-230px, 0);
        -  }
        -}
        -@media (min-width: 768px) {
        -  .sidebar-collapse .main-sidebar,
        -  .sidebar-collapse .left-side {
        -    -webkit-transform: translate(-230px, 0);
        -    -ms-transform: translate(-230px, 0);
        -    -o-transform: translate(-230px, 0);
        -    transform: translate(-230px, 0);
        -  }
        -}
        -@media (max-width: 767px) {
        -  .sidebar-open .main-sidebar,
        -  .sidebar-open .left-side {
        -    -webkit-transform: translate(0, 0);
        -    -ms-transform: translate(0, 0);
        -    -o-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -  }
        -}
        -.sidebar {
        -  padding-bottom: 10px;
        -}
        -.sidebar-form input:focus {
        -  border-color: transparent;
        -}
        -.user-panel {
        -  position: relative;
        -  width: 100%;
        -  padding: 10px;
        -  overflow: hidden;
        -}
        -.user-panel:before,
        -.user-panel:after {
        -  content: " ";
        -  display: table;
        -}
        -.user-panel:after {
        -  clear: both;
        -}
        -.user-panel > .image > img {
        -  width: 100%;
        -  max-width: 45px;
        -  height: auto;
        -}
        -.user-panel > .info {
        -  padding: 5px 5px 5px 15px;
        -  line-height: 1;
        -  position: absolute;
        -  left: 55px;
        -}
        -.user-panel > .info > p {
        -  font-weight: 600;
        -  margin-bottom: 9px;
        -}
        -.user-panel > .info > a {
        -  text-decoration: none;
        -  padding-right: 5px;
        -  margin-top: 3px;
        -  font-size: 11px;
        -}
        -.user-panel > .info > a > .fa,
        -.user-panel > .info > a > .ion,
        -.user-panel > .info > a > .glyphicon {
        -  margin-right: 3px;
        -}
        -.sidebar-menu {
        -  list-style: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -.sidebar-menu > li {
        -  position: relative;
        -  margin: 0;
        -  padding: 0;
        -}
        -.sidebar-menu > li > a {
        -  padding: 12px 5px 12px 15px;
        -  display: block;
        -}
        -.sidebar-menu > li > a > .fa,
        -.sidebar-menu > li > a > .glyphicon,
        -.sidebar-menu > li > a > .ion {
        -  width: 20px;
        -}
        -.sidebar-menu > li .label,
        -.sidebar-menu > li .badge {
        -  margin-top: 3px;
        -  margin-right: 5px;
        -}
        -.sidebar-menu li.header {
        -  padding: 10px 25px 10px 15px;
        -  font-size: 12px;
        -}
        -.sidebar-menu li > a > .fa-angle-left {
        -  width: auto;
        -  height: auto;
        -  padding: 0;
        -  margin-right: 10px;
        -  margin-top: 3px;
        -}
        -.sidebar-menu li.active > a > .fa-angle-left {
        -  -webkit-transform: rotate(-90deg);
        -  -ms-transform: rotate(-90deg);
        -  -o-transform: rotate(-90deg);
        -  transform: rotate(-90deg);
        -}
        -.sidebar-menu li.active > .treeview-menu {
        -  display: block;
        -}
        -.sidebar-menu .treeview-menu {
        -  display: none;
        -  list-style: none;
        -  padding: 0;
        -  margin: 0;
        -  padding-left: 5px;
        -}
        -.sidebar-menu .treeview-menu .treeview-menu {
        -  padding-left: 20px;
        -}
        -.sidebar-menu .treeview-menu > li {
        -  margin: 0;
        -}
        -.sidebar-menu .treeview-menu > li > a {
        -  padding: 5px 5px 5px 15px;
        -  display: block;
        -  font-size: 14px;
        -}
        -.sidebar-menu .treeview-menu > li > a > .fa,
        -.sidebar-menu .treeview-menu > li > a > .glyphicon,
        -.sidebar-menu .treeview-menu > li > a > .ion {
        -  width: 20px;
        -}
        -.sidebar-menu .treeview-menu > li > a > .fa-angle-left,
        -.sidebar-menu .treeview-menu > li > a > .fa-angle-down {
        -  width: auto;
        -}
        -/*
        - * Component: Sidebar Mini
        - */
        -@media (min-width: 768px) {
        -  .sidebar-mini.sidebar-collapse .content-wrapper,
        -  .sidebar-mini.sidebar-collapse .right-side,
        -  .sidebar-mini.sidebar-collapse .main-footer {
        -    margin-left: 50px!important;
        -    z-index: 840;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-sidebar {
        -    -webkit-transform: translate(0, 0);
        -    -ms-transform: translate(0, 0);
        -    -o-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -    width: 50px!important;
        -    z-index: 850;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li {
        -    position: relative;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a {
        -    margin-right: 0;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span {
        -    border-top-right-radius: 4px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span {
        -    border-bottom-right-radius: 4px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
        -    padding-top: 5px;
        -    padding-bottom: 5px;
        -    border-bottom-right-radius: 4px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right),
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
        -    display: block!important;
        -    position: absolute;
        -    width: 180px;
        -    left: 50px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span {
        -    top: 0;
        -    margin-left: -3px;
        -    padding: 12px 5px 12px 20px;
        -    background-color: inherit;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
        -    top: 44px;
        -    margin-left: 0;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info,
        -  .sidebar-mini.sidebar-collapse .sidebar-form,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu li.header {
        -    display: none!important;
        -    -webkit-transform: translateZ(0);
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .logo {
        -    width: 50px;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini {
        -    display: block;
        -    margin-left: -15px;
        -    margin-right: -15px;
        -    font-size: 18px;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg {
        -    display: none;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .navbar {
        -    margin-left: 50px;
        -  }
        -}
        -.sidebar-menu,
        -.main-sidebar .user-panel,
        -.sidebar-menu > li.header {
        -  white-space: nowrap;
        -  overflow: hidden;
        -}
        -.sidebar-menu:hover {
        -  overflow: visible;
        -}
        -.sidebar-form,
        -.sidebar-menu > li.header {
        -  overflow: hidden;
        -  text-overflow: clip;
        -}
        -.sidebar-menu li > a {
        -  position: relative;
        -}
        -.sidebar-menu li > a > .pull-right {
        -  position: absolute;
        -  top: 50%;
        -  right: 10px;
        -  margin-top: -7px;
        -}
        -/*
        - * Component: Control sidebar. By default, this is the right sidebar.
        - */
        -.control-sidebar-bg {
        -  position: fixed;
        -  z-index: 1000;
        -  bottom: 0;
        -}
        -.control-sidebar-bg,
        -.control-sidebar {
        -  top: 0;
        -  right: -230px;
        -  width: 230px;
        -  -webkit-transition: right 0.3s ease-in-out;
        -  -o-transition: right 0.3s ease-in-out;
        -  transition: right 0.3s ease-in-out;
        -}
        -.control-sidebar {
        -  position: absolute;
        -  padding-top: 50px;
        -  z-index: 1010;
        -}
        -@media (max-width: 768px) {
        -  .control-sidebar {
        -    padding-top: 100px;
        -  }
        -}
        -.control-sidebar > .tab-content {
        -  padding: 10px 15px;
        -}
        -.control-sidebar.control-sidebar-open,
        -.control-sidebar.control-sidebar-open + .control-sidebar-bg {
        -  right: 0;
        -}
        -.control-sidebar-open .control-sidebar-bg,
        -.control-sidebar-open .control-sidebar {
        -  right: 0;
        -}
        -@media (min-width: 768px) {
        -  .control-sidebar-open .content-wrapper,
        -  .control-sidebar-open .right-side,
        -  .control-sidebar-open .main-footer {
        -    margin-right: 230px;
        -  }
        -}
        -.nav-tabs.control-sidebar-tabs > li:first-of-type > a,
        -.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover,
        -.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus {
        -  border-left-width: 0;
        -}
        -.nav-tabs.control-sidebar-tabs > li > a {
        -  border-radius: 0;
        -}
        -.nav-tabs.control-sidebar-tabs > li > a,
        -.nav-tabs.control-sidebar-tabs > li > a:hover {
        -  border-top: none;
        -  border-right: none;
        -  border-left: 1px solid transparent;
        -  border-bottom: 1px solid transparent;
        -}
        -.nav-tabs.control-sidebar-tabs > li > a .icon {
        -  font-size: 16px;
        -}
        -.nav-tabs.control-sidebar-tabs > li.active > a,
        -.nav-tabs.control-sidebar-tabs > li.active > a:hover,
        -.nav-tabs.control-sidebar-tabs > li.active > a:focus,
        -.nav-tabs.control-sidebar-tabs > li.active > a:active {
        -  border-top: none;
        -  border-right: none;
        -  border-bottom: none;
        -}
        -@media (max-width: 768px) {
        -  .nav-tabs.control-sidebar-tabs {
        -    display: table;
        -  }
        -  .nav-tabs.control-sidebar-tabs > li {
        -    display: table-cell;
        -  }
        -}
        -.control-sidebar-heading {
        -  font-weight: 400;
        -  font-size: 16px;
        -  padding: 10px 0;
        -  margin-bottom: 10px;
        -}
        -.control-sidebar-subheading {
        -  display: block;
        -  font-weight: 400;
        -  font-size: 14px;
        -}
        -.control-sidebar-menu {
        -  list-style: none;
        -  padding: 0;
        -  margin: 0 -15px;
        -}
        -.control-sidebar-menu > li > a {
        -  display: block;
        -  padding: 10px 15px;
        -}
        -.control-sidebar-menu > li > a:before,
        -.control-sidebar-menu > li > a:after {
        -  content: " ";
        -  display: table;
        -}
        -.control-sidebar-menu > li > a:after {
        -  clear: both;
        -}
        -.control-sidebar-menu > li > a > .control-sidebar-subheading {
        -  margin-top: 0;
        -}
        -.control-sidebar-menu .menu-icon {
        -  float: left;
        -  width: 35px;
        -  height: 35px;
        -  border-radius: 50%;
        -  text-align: center;
        -  line-height: 35px;
        -}
        -.control-sidebar-menu .menu-info {
        -  margin-left: 45px;
        -  margin-top: 3px;
        -}
        -.control-sidebar-menu .menu-info > .control-sidebar-subheading {
        -  margin: 0;
        -}
        -.control-sidebar-menu .menu-info > p {
        -  margin: 0;
        -  font-size: 11px;
        -}
        -.control-sidebar-menu .progress {
        -  margin: 0;
        -}
        -.control-sidebar-dark {
        -  color: #b8c7ce;
        -}
        -.control-sidebar-dark,
        -.control-sidebar-dark + .control-sidebar-bg {
        -  background: #222d32;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs {
        -  border-bottom: #1c2529;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a {
        -  background: #181f23;
        -  color: #b8c7ce;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus {
        -  border-left-color: #141a1d;
        -  border-bottom-color: #141a1d;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active {
        -  background: #1c2529;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover {
        -  color: #fff;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active {
        -  background: #222d32;
        -  color: #fff;
        -}
        -.control-sidebar-dark .control-sidebar-heading,
        -.control-sidebar-dark .control-sidebar-subheading {
        -  color: #fff;
        -}
        -.control-sidebar-dark .control-sidebar-menu > li > a:hover {
        -  background: #1e282c;
        -}
        -.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p {
        -  color: #b8c7ce;
        -}
        -.control-sidebar-light {
        -  color: #5e5e5e;
        -}
        -.control-sidebar-light,
        -.control-sidebar-light + .control-sidebar-bg {
        -  background: #f9fafc;
        -  border-left: 1px solid #d2d6de;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs {
        -  border-bottom: #d2d6de;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a {
        -  background: #e8ecf4;
        -  color: #444444;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus {
        -  border-left-color: #d2d6de;
        -  border-bottom-color: #d2d6de;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active {
        -  background: #eff1f7;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active {
        -  background: #f9fafc;
        -  color: #111;
        -}
        -.control-sidebar-light .control-sidebar-heading,
        -.control-sidebar-light .control-sidebar-subheading {
        -  color: #111;
        -}
        -.control-sidebar-light .control-sidebar-menu {
        -  margin-left: -14px;
        -}
        -.control-sidebar-light .control-sidebar-menu > li > a:hover {
        -  background: #f4f4f5;
        -}
        -.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p {
        -  color: #5e5e5e;
        -}
        -/*
        - * Component: Dropdown menus
        - * -------------------------
        - */
        -/*Dropdowns in general*/
        -.dropdown-menu {
        -  box-shadow: none;
        -  border-color: #eee;
        -}
        -.dropdown-menu > li > a {
        -  color: #777;
        -}
        -.dropdown-menu > li > a > .glyphicon,
        -.dropdown-menu > li > a > .fa,
        -.dropdown-menu > li > a > .ion {
        -  margin-right: 10px;
        -}
        -.dropdown-menu > li > a:hover {
        -  background-color: #e1e3e9;
        -  color: #333;
        -}
        -.dropdown-menu > .divider {
        -  background-color: #eee;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu,
        -.navbar-nav > .messages-menu > .dropdown-menu,
        -.navbar-nav > .tasks-menu > .dropdown-menu {
        -  width: 280px;
        -  padding: 0 0 0 0;
        -  margin: 0;
        -  top: 100%;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li,
        -.navbar-nav > .messages-menu > .dropdown-menu > li,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li {
        -  position: relative;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li.header,
        -.navbar-nav > .messages-menu > .dropdown-menu > li.header,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li.header {
        -  border-top-left-radius: 4px;
        -  border-top-right-radius: 4px;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0;
        -  background-color: #ffffff;
        -  padding: 7px 10px;
        -  border-bottom: 1px solid #f4f4f4;
        -  color: #444444;
        -  font-size: 14px;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
        -.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 4px;
        -  border-bottom-left-radius: 4px;
        -  font-size: 12px;
        -  background-color: #fff;
        -  padding: 7px 10px;
        -  border-bottom: 1px solid #eeeeee;
        -  color: #444!important;
        -  text-align: center;
        -}
        -@media (max-width: 991px) {
        -  .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
        -  .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
        -  .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
        -    background: #fff!important;
        -    color: #444!important;
        -  }
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover,
        -.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover {
        -  text-decoration: none;
        -  font-weight: normal;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu {
        -  max-height: 200px;
        -  margin: 0;
        -  padding: 0;
        -  list-style: none;
        -  overflow-x: hidden;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
        -  display: block;
        -  white-space: nowrap;
        -  /* Prevent text from breaking */
        -  border-bottom: 1px solid #f4f4f4;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover {
        -  background: #f4f4f4;
        -  text-decoration: none;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a {
        -  color: #444444;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -  white-space: nowrap;
        -  padding: 10px;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon,
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa,
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion {
        -  width: 20px;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a {
        -  margin: 0;
        -  padding: 10px 10px;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img {
        -  margin: auto 10px auto auto;
        -  width: 40px;
        -  height: 40px;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 {
        -  padding: 0;
        -  margin: 0 0 0 45px;
        -  color: #444444;
        -  font-size: 15px;
        -  position: relative;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small {
        -  color: #999999;
        -  font-size: 10px;
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p {
        -  margin: 0 0 0 45px;
        -  font-size: 12px;
        -  color: #888888;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
        -  content: " ";
        -  display: table;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
        -  clear: both;
        -}
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
        -  padding: 10px;
        -}
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 {
        -  font-size: 14px;
        -  padding: 0;
        -  margin: 0 0 10px 0;
        -  color: #666666;
        -}
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress {
        -  padding: 0;
        -  margin: 0;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0;
        -  padding: 1px 0 0 0;
        -  border-top-width: 0;
        -  width: 280px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu,
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body {
        -  border-bottom-right-radius: 4px;
        -  border-bottom-left-radius: 4px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header {
        -  height: 175px;
        -  padding: 10px;
        -  text-align: center;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img {
        -  z-index: 5;
        -  height: 90px;
        -  width: 90px;
        -  border: 3px solid;
        -  border-color: transparent;
        -  border-color: rgba(255, 255, 255, 0.2);
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p {
        -  z-index: 5;
        -  color: #fff;
        -  color: rgba(255, 255, 255, 0.8);
        -  font-size: 17px;
        -  margin-top: 10px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small {
        -  display: block;
        -  font-size: 12px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body {
        -  padding: 15px;
        -  border-bottom: 1px solid #f4f4f4;
        -  border-top: 1px solid #dddddd;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body:before,
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
        -  content: " ";
        -  display: table;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
        -  clear: both;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body a {
        -  color: #444 !important;
        -}
        -@media (max-width: 991px) {
        -  .navbar-nav > .user-menu > .dropdown-menu > .user-body a {
        -    background: #fff !important;
        -    color: #444 !important;
        -  }
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer {
        -  background-color: #f9f9f9;
        -  padding: 10px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before,
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
        -  content: " ";
        -  display: table;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
        -  clear: both;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default {
        -  color: #666666;
        -}
        -@media (max-width: 991px) {
        -  .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover {
        -    background-color: #f9f9f9;
        -  }
        -}
        -.navbar-nav > .user-menu .user-image {
        -  float: left;
        -  width: 25px;
        -  height: 25px;
        -  border-radius: 50%;
        -  margin-right: 10px;
        -  margin-top: -2px;
        -}
        -@media (max-width: 767px) {
        -  .navbar-nav > .user-menu .user-image {
        -    float: none;
        -    margin-right: 0;
        -    margin-top: -8px;
        -    line-height: 10px;
        -  }
        -}
        -/* Add fade animation to dropdown menus by appending
        - the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/
        -.open:not(.dropup) > .animated-dropdown-menu {
        -  backface-visibility: visible !important;
        -  -webkit-animation: flipInX 0.7s both;
        -  -o-animation: flipInX 0.7s both;
        -  animation: flipInX 0.7s both;
        -}
        -@keyframes flipInX {
        -  0% {
        -    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
        -    transition-timing-function: ease-in;
        -    opacity: 0;
        -  }
        -  40% {
        -    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
        -    transition-timing-function: ease-in;
        -  }
        -  60% {
        -    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
        -    opacity: 1;
        -  }
        -  80% {
        -    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
        -  }
        -  100% {
        -    transform: perspective(400px);
        -  }
        -}
        -@-webkit-keyframes flipInX {
        -  0% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
        -    -webkit-transition-timing-function: ease-in;
        -    opacity: 0;
        -  }
        -  40% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
        -    -webkit-transition-timing-function: ease-in;
        -  }
        -  60% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
        -    opacity: 1;
        -  }
        -  80% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
        -  }
        -  100% {
        -    -webkit-transform: perspective(400px);
        -  }
        -}
        -/* Fix dropdown menu in navbars */
        -.navbar-custom-menu > .navbar-nav > li {
        -  position: relative;
        -}
        -.navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
        -  position: absolute;
        -  right: 0;
        -  left: auto;
        -}
        -@media (max-width: 991px) {
        -  .navbar-custom-menu > .navbar-nav {
        -    float: right;
        -  }
        -  .navbar-custom-menu > .navbar-nav > li {
        -    position: static;
        -  }
        -  .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
        -    position: absolute;
        -    right: 5%;
        -    left: auto;
        -    border: 1px solid #ddd;
        -    background: #fff;
        -  }
        -}
        -/*
        - * Component: Form
        - * ---------------
        - */
        -.form-control {
        -  border-radius: 0;
        -  box-shadow: none;
        -  border-color: #d2d6de;
        -}
        -.form-control:focus {
        -  border-color: #3c8dbc;
        -  box-shadow: none;
        -}
        -.form-control::-moz-placeholder,
        -.form-control:-ms-input-placeholder,
        -.form-control::-webkit-input-placeholder {
        -  color: #bbb;
        -  opacity: 1;
        -}
        -.form-control:not(select) {
        -  -webkit-appearance: none;
        -  -moz-appearance: none;
        -  appearance: none;
        -}
        -.form-group.has-success label {
        -  color: #00a65a;
        -}
        -.form-group.has-success .form-control {
        -  border-color: #00a65a;
        -  box-shadow: none;
        -}
        -.form-group.has-warning label {
        -  color: #f39c12;
        -}
        -.form-group.has-warning .form-control {
        -  border-color: #f39c12;
        -  box-shadow: none;
        -}
        -.form-group.has-error label {
        -  color: #dd4b39;
        -}
        -.form-group.has-error .form-control {
        -  border-color: #dd4b39;
        -  box-shadow: none;
        -}
        -/* Input group */
        -.input-group .input-group-addon {
        -  border-radius: 0;
        -  border-color: #d2d6de;
        -  background-color: #fff;
        -}
        -/* button groups */
        -.btn-group-vertical .btn.btn-flat:first-of-type,
        -.btn-group-vertical .btn.btn-flat:last-of-type {
        -  border-radius: 0;
        -}
        -.icheck > label {
        -  padding-left: 0;
        -}
        -/* support Font Awesome icons in form-control */
        -.form-control-feedback.fa {
        -  line-height: 34px;
        -}
        -.input-lg + .form-control-feedback.fa,
        -.input-group-lg + .form-control-feedback.fa,
        -.form-group-lg .form-control + .form-control-feedback.fa {
        -  line-height: 46px;
        -}
        -.input-sm + .form-control-feedback.fa,
        -.input-group-sm + .form-control-feedback.fa,
        -.form-group-sm .form-control + .form-control-feedback.fa {
        -  line-height: 30px;
        -}
        -/*
        - * Component: Progress Bar
        - * -----------------------
        - */
        -.progress,
        -.progress > .progress-bar {
        -  -webkit-box-shadow: none;
        -  box-shadow: none;
        -}
        -.progress,
        -.progress > .progress-bar,
        -.progress .progress-bar,
        -.progress > .progress-bar .progress-bar {
        -  border-radius: 1px;
        -}
        -/* size variation */
        -.progress.sm,
        -.progress-sm {
        -  height: 10px;
        -}
        -.progress.sm,
        -.progress-sm,
        -.progress.sm .progress-bar,
        -.progress-sm .progress-bar {
        -  border-radius: 1px;
        -}
        -.progress.xs,
        -.progress-xs {
        -  height: 7px;
        -}
        -.progress.xs,
        -.progress-xs,
        -.progress.xs .progress-bar,
        -.progress-xs .progress-bar {
        -  border-radius: 1px;
        -}
        -.progress.xxs,
        -.progress-xxs {
        -  height: 3px;
        -}
        -.progress.xxs,
        -.progress-xxs,
        -.progress.xxs .progress-bar,
        -.progress-xxs .progress-bar {
        -  border-radius: 1px;
        -}
        -/* Vertical bars */
        -.progress.vertical {
        -  position: relative;
        -  width: 30px;
        -  height: 200px;
        -  display: inline-block;
        -  margin-right: 10px;
        -}
        -.progress.vertical > .progress-bar {
        -  width: 100%;
        -  position: absolute;
        -  bottom: 0;
        -}
        -.progress.vertical.sm,
        -.progress.vertical.progress-sm {
        -  width: 20px;
        -}
        -.progress.vertical.xs,
        -.progress.vertical.progress-xs {
        -  width: 10px;
        -}
        -.progress.vertical.xxs,
        -.progress.vertical.progress-xxs {
        -  width: 3px;
        -}
        -.progress-group .progress-text {
        -  font-weight: 600;
        -}
        -.progress-group .progress-number {
        -  float: right;
        -}
        -/* Remove margins from progress bars when put in a table */
        -.table tr > td .progress {
        -  margin: 0;
        -}
        -.progress-bar-light-blue,
        -.progress-bar-primary {
        -  background-color: #3c8dbc;
        -}
        -.progress-striped .progress-bar-light-blue,
        -.progress-striped .progress-bar-primary {
        -  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: -o-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-green,
        -.progress-bar-success {
        -  background-color: #00a65a;
        -}
        -.progress-striped .progress-bar-green,
        -.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: -o-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-aqua,
        -.progress-bar-info {
        -  background-color: #00c0ef;
        -}
        -.progress-striped .progress-bar-aqua,
        -.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: -o-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-yellow,
        -.progress-bar-warning {
        -  background-color: #f39c12;
        -}
        -.progress-striped .progress-bar-yellow,
        -.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: -o-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-red,
        -.progress-bar-danger {
        -  background-color: #dd4b39;
        -}
        -.progress-striped .progress-bar-red,
        -.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: -o-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);
        -}
        -/*
        - * Component: Small Box
        - * --------------------
        - */
        -.small-box {
        -  border-radius: 2px;
        -  position: relative;
        -  display: block;
        -  margin-bottom: 20px;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -}
        -.small-box > .inner {
        -  padding: 10px;
        -}
        -.small-box > .small-box-footer {
        -  position: relative;
        -  text-align: center;
        -  padding: 3px 0;
        -  color: #fff;
        -  color: rgba(255, 255, 255, 0.8);
        -  display: block;
        -  z-index: 10;
        -  background: rgba(0, 0, 0, 0.1);
        -  text-decoration: none;
        -}
        -.small-box > .small-box-footer:hover {
        -  color: #fff;
        -  background: rgba(0, 0, 0, 0.15);
        -}
        -.small-box h3 {
        -  font-size: 38px;
        -  font-weight: bold;
        -  margin: 0 0 10px 0;
        -  white-space: nowrap;
        -  padding: 0;
        -}
        -.small-box p {
        -  font-size: 15px;
        -}
        -.small-box p > small {
        -  display: block;
        -  color: #f9f9f9;
        -  font-size: 13px;
        -  margin-top: 5px;
        -}
        -.small-box h3,
        -.small-box p {
        -  z-index: 5px;
        -}
        -.small-box .icon {
        -  -webkit-transition: all 0.3s linear;
        -  -o-transition: all 0.3s linear;
        -  transition: all 0.3s linear;
        -  position: absolute;
        -  top: -10px;
        -  right: 10px;
        -  z-index: 0;
        -  font-size: 90px;
        -  color: rgba(0, 0, 0, 0.15);
        -}
        -.small-box:hover {
        -  text-decoration: none;
        -  color: #f9f9f9;
        -}
        -.small-box:hover .icon {
        -  font-size: 95px;
        -}
        -@media (max-width: 767px) {
        -  .small-box {
        -    text-align: center;
        -  }
        -  .small-box .icon {
        -    display: none;
        -  }
        -  .small-box p {
        -    font-size: 12px;
        -  }
        -}
        -/*
        - * Component: Box
        - * --------------
        - */
        -.box {
        -  position: relative;
        -  border-radius: 3px;
        -  background: #ffffff;
        -  border-top: 3px solid #d2d6de;
        -  margin-bottom: 20px;
        -  width: 100%;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -}
        -.box.box-primary {
        -  border-top-color: #3c8dbc;
        -}
        -.box.box-info {
        -  border-top-color: #00c0ef;
        -}
        -.box.box-danger {
        -  border-top-color: #dd4b39;
        -}
        -.box.box-warning {
        -  border-top-color: #f39c12;
        -}
        -.box.box-success {
        -  border-top-color: #00a65a;
        -}
        -.box.box-default {
        -  border-top-color: #d2d6de;
        -}
        -.box.collapsed-box .box-body,
        -.box.collapsed-box .box-footer {
        -  display: none;
        -}
        -.box .nav-stacked > li {
        -  border-bottom: 1px solid #f4f4f4;
        -  margin: 0;
        -}
        -.box .nav-stacked > li:last-of-type {
        -  border-bottom: none;
        -}
        -.box.height-control .box-body {
        -  max-height: 300px;
        -  overflow: auto;
        -}
        -.box .border-right {
        -  border-right: 1px solid #f4f4f4;
        -}
        -.box .border-left {
        -  border-left: 1px solid #f4f4f4;
        -}
        -.box.box-solid {
        -  border-top: 0;
        -}
        -.box.box-solid > .box-header .btn.btn-default {
        -  background: transparent;
        -}
        -.box.box-solid > .box-header .btn:hover,
        -.box.box-solid > .box-header a:hover {
        -  background: rgba(0, 0, 0, 0.1);
        -}
        -.box.box-solid.box-default {
        -  border: 1px solid #d2d6de;
        -}
        -.box.box-solid.box-default > .box-header {
        -  color: #444444;
        -  background: #d2d6de;
        -  background-color: #d2d6de;
        -}
        -.box.box-solid.box-default > .box-header a,
        -.box.box-solid.box-default > .box-header .btn {
        -  color: #444444;
        -}
        -.box.box-solid.box-primary {
        -  border: 1px solid #3c8dbc;
        -}
        -.box.box-solid.box-primary > .box-header {
        -  color: #ffffff;
        -  background: #3c8dbc;
        -  background-color: #3c8dbc;
        -}
        -.box.box-solid.box-primary > .box-header a,
        -.box.box-solid.box-primary > .box-header .btn {
        -  color: #ffffff;
        -}
        -.box.box-solid.box-info {
        -  border: 1px solid #00c0ef;
        -}
        -.box.box-solid.box-info > .box-header {
        -  color: #ffffff;
        -  background: #00c0ef;
        -  background-color: #00c0ef;
        -}
        -.box.box-solid.box-info > .box-header a,
        -.box.box-solid.box-info > .box-header .btn {
        -  color: #ffffff;
        -}
        -.box.box-solid.box-danger {
        -  border: 1px solid #dd4b39;
        -}
        -.box.box-solid.box-danger > .box-header {
        -  color: #ffffff;
        -  background: #dd4b39;
        -  background-color: #dd4b39;
        -}
        -.box.box-solid.box-danger > .box-header a,
        -.box.box-solid.box-danger > .box-header .btn {
        -  color: #ffffff;
        -}
        -.box.box-solid.box-warning {
        -  border: 1px solid #f39c12;
        -}
        -.box.box-solid.box-warning > .box-header {
        -  color: #ffffff;
        -  background: #f39c12;
        -  background-color: #f39c12;
        -}
        -.box.box-solid.box-warning > .box-header a,
        -.box.box-solid.box-warning > .box-header .btn {
        -  color: #ffffff;
        -}
        -.box.box-solid.box-success {
        -  border: 1px solid #00a65a;
        -}
        -.box.box-solid.box-success > .box-header {
        -  color: #ffffff;
        -  background: #00a65a;
        -  background-color: #00a65a;
        -}
        -.box.box-solid.box-success > .box-header a,
        -.box.box-solid.box-success > .box-header .btn {
        -  color: #ffffff;
        -}
        -.box.box-solid > .box-header > .box-tools .btn {
        -  border: 0;
        -  box-shadow: none;
        -}
        -.box.box-solid[class*='bg'] > .box-header {
        -  color: #fff;
        -}
        -.box .box-group > .box {
        -  margin-bottom: 5px;
        -}
        -.box .knob-label {
        -  text-align: center;
        -  color: #333;
        -  font-weight: 100;
        -  font-size: 12px;
        -  margin-bottom: 0.3em;
        -}
        -.box > .overlay,
        -.overlay-wrapper > .overlay,
        -.box > .loading-img,
        -.overlay-wrapper > .loading-img {
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  width: 100%;
        -  height: 100%;
        -}
        -.box .overlay,
        -.overlay-wrapper .overlay {
        -  z-index: 50;
        -  background: rgba(255, 255, 255, 0.7);
        -  border-radius: 3px;
        -}
        -.box .overlay > .fa,
        -.overlay-wrapper .overlay > .fa {
        -  position: absolute;
        -  top: 50%;
        -  left: 50%;
        -  margin-left: -15px;
        -  margin-top: -15px;
        -  color: #000;
        -  font-size: 30px;
        -}
        -.box .overlay.dark,
        -.overlay-wrapper .overlay.dark {
        -  background: rgba(0, 0, 0, 0.5);
        -}
        -.box-header:before,
        -.box-body:before,
        -.box-footer:before,
        -.box-header:after,
        -.box-body:after,
        -.box-footer:after {
        -  content: " ";
        -  display: table;
        -}
        -.box-header:after,
        -.box-body:after,
        -.box-footer:after {
        -  clear: both;
        -}
        -.box-header {
        -  color: #444;
        -  display: block;
        -  padding: 10px;
        -  position: relative;
        -}
        -.box-header.with-border {
        -  border-bottom: 1px solid #f4f4f4;
        -}
        -.collapsed-box .box-header.with-border {
        -  border-bottom: none;
        -}
        -.box-header > .fa,
        -.box-header > .glyphicon,
        -.box-header > .ion,
        -.box-header .box-title {
        -  display: inline-block;
        -  font-size: 18px;
        -  margin: 0;
        -  line-height: 1;
        -}
        -.box-header > .fa,
        -.box-header > .glyphicon,
        -.box-header > .ion {
        -  margin-right: 5px;
        -}
        -.box-header > .box-tools {
        -  position: absolute;
        -  right: 10px;
        -  top: 5px;
        -}
        -.box-header > .box-tools [data-toggle="tooltip"] {
        -  position: relative;
        -}
        -.box-header > .box-tools.pull-right .dropdown-menu {
        -  right: 0;
        -  left: auto;
        -}
        -.btn-box-tool {
        -  padding: 5px;
        -  font-size: 12px;
        -  background: transparent;
        -  color: #97a0b3;
        -}
        -.open .btn-box-tool,
        -.btn-box-tool:hover {
        -  color: #606c84;
        -}
        -.btn-box-tool.btn:active {
        -  box-shadow: none;
        -}
        -.box-body {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px;
        -  padding: 10px;
        -}
        -.no-header .box-body {
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px;
        -}
        -.box-body > .table {
        -  margin-bottom: 0;
        -}
        -.box-body .fc {
        -  margin-top: 5px;
        -}
        -.box-body .full-width-chart {
        -  margin: -19px;
        -}
        -.box-body.no-padding .full-width-chart {
        -  margin: -9px;
        -}
        -.box-body .box-pane {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 3px;
        -}
        -.box-body .box-pane-right {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 0;
        -}
        -.box-footer {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px;
        -  border-top: 1px solid #f4f4f4;
        -  padding: 10px;
        -  background-color: #ffffff;
        -}
        -.chart-legend {
        -  margin: 10px 0;
        -}
        -@media (max-width: 991px) {
        -  .chart-legend > li {
        -    float: left;
        -    margin-right: 10px;
        -  }
        -}
        -.box-comments {
        -  background: #f7f7f7;
        -}
        -.box-comments .box-comment {
        -  padding: 8px 0;
        -  border-bottom: 1px solid #eee;
        -}
        -.box-comments .box-comment:before,
        -.box-comments .box-comment:after {
        -  content: " ";
        -  display: table;
        -}
        -.box-comments .box-comment:after {
        -  clear: both;
        -}
        -.box-comments .box-comment:last-of-type {
        -  border-bottom: 0;
        -}
        -.box-comments .box-comment:first-of-type {
        -  padding-top: 0;
        -}
        -.box-comments .box-comment img {
        -  float: left;
        -}
        -.box-comments .comment-text {
        -  margin-left: 40px;
        -  color: #555;
        -}
        -.box-comments .username {
        -  color: #444;
        -  display: block;
        -  font-weight: 600;
        -}
        -.box-comments .text-muted {
        -  font-weight: 400;
        -  font-size: 12px;
        -}
        -/* Widget: TODO LIST */
        -.todo-list {
        -  margin: 0;
        -  padding: 0;
        -  list-style: none;
        -  overflow: auto;
        -}
        -.todo-list > li {
        -  border-radius: 2px;
        -  padding: 10px;
        -  background: #f4f4f4;
        -  margin-bottom: 2px;
        -  border-left: 2px solid #e6e7e8;
        -  color: #444;
        -}
        -.todo-list > li:last-of-type {
        -  margin-bottom: 0;
        -}
        -.todo-list > li > input[type='checkbox'] {
        -  margin: 0 10px 0 5px;
        -}
        -.todo-list > li .text {
        -  display: inline-block;
        -  margin-left: 5px;
        -  font-weight: 600;
        -}
        -.todo-list > li .label {
        -  margin-left: 10px;
        -  font-size: 9px;
        -}
        -.todo-list > li .tools {
        -  display: none;
        -  float: right;
        -  color: #dd4b39;
        -}
        -.todo-list > li .tools > .fa,
        -.todo-list > li .tools > .glyphicon,
        -.todo-list > li .tools > .ion {
        -  margin-right: 5px;
        -  cursor: pointer;
        -}
        -.todo-list > li:hover .tools {
        -  display: inline-block;
        -}
        -.todo-list > li.done {
        -  color: #999;
        -}
        -.todo-list > li.done .text {
        -  text-decoration: line-through;
        -  font-weight: 500;
        -}
        -.todo-list > li.done .label {
        -  background: #d2d6de !important;
        -}
        -.todo-list .danger {
        -  border-left-color: #dd4b39;
        -}
        -.todo-list .warning {
        -  border-left-color: #f39c12;
        -}
        -.todo-list .info {
        -  border-left-color: #00c0ef;
        -}
        -.todo-list .success {
        -  border-left-color: #00a65a;
        -}
        -.todo-list .primary {
        -  border-left-color: #3c8dbc;
        -}
        -.todo-list .handle {
        -  display: inline-block;
        -  cursor: move;
        -  margin: 0 5px;
        -}
        -/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/
        -.chat {
        -  padding: 5px 20px 5px 10px;
        -}
        -.chat .item {
        -  margin-bottom: 10px;
        -}
        -.chat .item:before,
        -.chat .item:after {
        -  content: " ";
        -  display: table;
        -}
        -.chat .item:after {
        -  clear: both;
        -}
        -.chat .item > img {
        -  width: 40px;
        -  height: 40px;
        -  border: 2px solid transparent;
        -  border-radius: 50%;
        -}
        -.chat .item > .online {
        -  border: 2px solid #00a65a;
        -}
        -.chat .item > .offline {
        -  border: 2px solid #dd4b39;
        -}
        -.chat .item > .message {
        -  margin-left: 55px;
        -  margin-top: -40px;
        -}
        -.chat .item > .message > .name {
        -  display: block;
        -  font-weight: 600;
        -}
        -.chat .item > .attachment {
        -  border-radius: 3px;
        -  background: #f4f4f4;
        -  margin-left: 65px;
        -  margin-right: 15px;
        -  padding: 10px;
        -}
        -.chat .item > .attachment > h4 {
        -  margin: 0 0 5px 0;
        -  font-weight: 600;
        -  font-size: 14px;
        -}
        -.chat .item > .attachment > p,
        -.chat .item > .attachment > .filename {
        -  font-weight: 600;
        -  font-size: 13px;
        -  font-style: italic;
        -  margin: 0;
        -}
        -.chat .item > .attachment:before,
        -.chat .item > .attachment:after {
        -  content: " ";
        -  display: table;
        -}
        -.chat .item > .attachment:after {
        -  clear: both;
        -}
        -.box-input {
        -  max-width: 200px;
        -}
        -.modal .panel-body {
        -  color: #444;
        -}
        -/*
        - * Component: Info Box
        - * -------------------
        - */
        -.info-box {
        -  display: block;
        -  min-height: 90px;
        -  background: #fff;
        -  width: 100%;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  border-radius: 2px;
        -  margin-bottom: 15px;
        -}
        -.info-box small {
        -  font-size: 14px;
        -}
        -.info-box .progress {
        -  background: rgba(0, 0, 0, 0.2);
        -  margin: 5px -10px 5px -10px;
        -  height: 2px;
        -}
        -.info-box .progress,
        -.info-box .progress .progress-bar {
        -  border-radius: 0;
        -}
        -.info-box .progress .progress-bar {
        -  background: #fff;
        -}
        -.info-box-icon {
        -  border-top-left-radius: 2px;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 2px;
        -  display: block;
        -  float: left;
        -  height: 90px;
        -  width: 90px;
        -  text-align: center;
        -  font-size: 45px;
        -  line-height: 90px;
        -  background: rgba(0, 0, 0, 0.2);
        -}
        -.info-box-icon > img {
        -  max-width: 100%;
        -}
        -.info-box-content {
        -  padding: 5px 10px;
        -  margin-left: 90px;
        -}
        -.info-box-number {
        -  display: block;
        -  font-weight: bold;
        -  font-size: 18px;
        -}
        -.progress-description,
        -.info-box-text {
        -  display: block;
        -  font-size: 14px;
        -  white-space: nowrap;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -}
        -.info-box-text {
        -  text-transform: uppercase;
        -}
        -.info-box-more {
        -  display: block;
        -}
        -.progress-description {
        -  margin: 0;
        -}
        -/*
        - * Component: Timeline
        - * -------------------
        - */
        -.timeline {
        -  position: relative;
        -  margin: 0 0 30px 0;
        -  padding: 0;
        -  list-style: none;
        -}
        -.timeline:before {
        -  content: '';
        -  position: absolute;
        -  top: 0;
        -  bottom: 0;
        -  width: 4px;
        -  background: #ddd;
        -  left: 31px;
        -  margin: 0;
        -  border-radius: 2px;
        -}
        -.timeline > li {
        -  position: relative;
        -  margin-right: 10px;
        -  margin-bottom: 15px;
        -}
        -.timeline > li:before,
        -.timeline > li:after {
        -  content: " ";
        -  display: table;
        -}
        -.timeline > li:after {
        -  clear: both;
        -}
        -.timeline > li > .timeline-item {
        -  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  border-radius: 3px;
        -  margin-top: 0;
        -  background: #fff;
        -  color: #444;
        -  margin-left: 60px;
        -  margin-right: 15px;
        -  padding: 0;
        -  position: relative;
        -}
        -.timeline > li > .timeline-item > .time {
        -  color: #999;
        -  float: right;
        -  padding: 10px;
        -  font-size: 12px;
        -}
        -.timeline > li > .timeline-item > .timeline-header {
        -  margin: 0;
        -  color: #555;
        -  border-bottom: 1px solid #f4f4f4;
        -  padding: 10px;
        -  font-size: 16px;
        -  line-height: 1.1;
        -}
        -.timeline > li > .timeline-item > .timeline-header > a {
        -  font-weight: 600;
        -}
        -.timeline > li > .timeline-item > .timeline-body,
        -.timeline > li > .timeline-item > .timeline-footer {
        -  padding: 10px;
        -}
        -.timeline > li > .fa,
        -.timeline > li > .glyphicon,
        -.timeline > li > .ion {
        -  width: 30px;
        -  height: 30px;
        -  font-size: 15px;
        -  line-height: 30px;
        -  position: absolute;
        -  color: #666;
        -  background: #d2d6de;
        -  border-radius: 50%;
        -  text-align: center;
        -  left: 18px;
        -  top: 0;
        -}
        -.timeline > .time-label > span {
        -  font-weight: 600;
        -  padding: 5px;
        -  display: inline-block;
        -  background-color: #fff;
        -  border-radius: 4px;
        -}
        -.timeline-inverse > li > .timeline-item {
        -  background: #f0f0f0;
        -  border: 1px solid #ddd;
        -  -webkit-box-shadow: none;
        -  box-shadow: none;
        -}
        -.timeline-inverse > li > .timeline-item > .timeline-header {
        -  border-bottom-color: #ddd;
        -}
        -/*
        - * Component: Button
        - * -----------------
        - */
        -.btn {
        -  border-radius: 3px;
        -  -webkit-box-shadow: none;
        -  box-shadow: none;
        -  border: 1px solid transparent;
        -}
        -.btn.uppercase {
        -  text-transform: uppercase;
        -}
        -.btn.btn-flat {
        -  border-radius: 0;
        -  -webkit-box-shadow: none;
        -  -moz-box-shadow: none;
        -  box-shadow: none;
        -  border-width: 1px;
        -}
        -.btn:active {
        -  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
        -  -moz-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:focus {
        -  outline: none;
        -}
        -.btn.btn-file {
        -  position: relative;
        -  overflow: hidden;
        -}
        -.btn.btn-file > input[type='file'] {
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -  min-width: 100%;
        -  min-height: 100%;
        -  font-size: 100px;
        -  text-align: right;
        -  opacity: 0;
        -  filter: alpha(opacity=0);
        -  outline: none;
        -  background: white;
        -  cursor: inherit;
        -  display: block;
        -}
        -.btn-default {
        -  background-color: #f4f4f4;
        -  color: #444;
        -  border-color: #ddd;
        -}
        -.btn-default:hover,
        -.btn-default:active,
        -.btn-default.hover {
        -  background-color: #e7e7e7;
        -}
        -.btn-primary {
        -  background-color: #3c8dbc;
        -  border-color: #367fa9;
        -}
        -.btn-primary:hover,
        -.btn-primary:active,
        -.btn-primary.hover {
        -  background-color: #367fa9;
        -}
        -.btn-success {
        -  background-color: #00a65a;
        -  border-color: #008d4c;
        -}
        -.btn-success:hover,
        -.btn-success:active,
        -.btn-success.hover {
        -  background-color: #008d4c;
        -}
        -.btn-info {
        -  background-color: #00c0ef;
        -  border-color: #00acd6;
        -}
        -.btn-info:hover,
        -.btn-info:active,
        -.btn-info.hover {
        -  background-color: #00acd6;
        -}
        -.btn-danger {
        -  background-color: #dd4b39;
        -  border-color: #d73925;
        -}
        -.btn-danger:hover,
        -.btn-danger:active,
        -.btn-danger.hover {
        -  background-color: #d73925;
        -}
        -.btn-warning {
        -  background-color: #f39c12;
        -  border-color: #e08e0b;
        -}
        -.btn-warning:hover,
        -.btn-warning:active,
        -.btn-warning.hover {
        -  background-color: #e08e0b;
        -}
        -.btn-outline {
        -  border: 1px solid #fff;
        -  background: transparent;
        -  color: #fff;
        -}
        -.btn-outline:hover,
        -.btn-outline:focus,
        -.btn-outline:active {
        -  color: rgba(255, 255, 255, 0.7);
        -  border-color: rgba(255, 255, 255, 0.7);
        -}
        -.btn-link {
        -  -webkit-box-shadow: none;
        -  box-shadow: none;
        -}
        -.btn[class*='bg-']:hover {
        -  -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);
        -  box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);
        -}
        -.btn-app {
        -  border-radius: 3px;
        -  position: relative;
        -  padding: 15px 5px;
        -  margin: 0 0 10px 10px;
        -  min-width: 80px;
        -  height: 60px;
        -  text-align: center;
        -  color: #666;
        -  border: 1px solid #ddd;
        -  background-color: #f4f4f4;
        -  font-size: 12px;
        -}
        -.btn-app > .fa,
        -.btn-app > .glyphicon,
        -.btn-app > .ion {
        -  font-size: 20px;
        -  display: block;
        -}
        -.btn-app:hover {
        -  background: #f4f4f4;
        -  color: #444;
        -  border-color: #aaa;
        -}
        -.btn-app:active,
        -.btn-app:focus {
        -  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
        -  -moz-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-app > .badge {
        -  position: absolute;
        -  top: -3px;
        -  right: -10px;
        -  font-size: 10px;
        -  font-weight: 400;
        -}
        -/*
        - * Component: Callout
        - * ------------------
        - */
        -.callout {
        -  border-radius: 3px;
        -  margin: 0 0 20px 0;
        -  padding: 15px 30px 15px 15px;
        -  border-left: 5px solid #eee;
        -}
        -.callout a {
        -  color: #fff;
        -  text-decoration: underline;
        -}
        -.callout a:hover {
        -  color: #eee;
        -}
        -.callout h4 {
        -  margin-top: 0;
        -  font-weight: 600;
        -}
        -.callout p:last-child {
        -  margin-bottom: 0;
        -}
        -.callout code,
        -.callout .highlight {
        -  background-color: #fff;
        -}
        -.callout.callout-danger {
        -  border-color: #c23321;
        -}
        -.callout.callout-warning {
        -  border-color: #c87f0a;
        -}
        -.callout.callout-info {
        -  border-color: #0097bc;
        -}
        -.callout.callout-success {
        -  border-color: #00733e;
        -}
        -/*
        - * Component: alert
        - * ----------------
        - */
        -.alert {
        -  border-radius: 3px;
        -}
        -.alert h4 {
        -  font-weight: 600;
        -}
        -.alert .icon {
        -  margin-right: 10px;
        -}
        -.alert .close {
        -  color: #000;
        -  opacity: 0.2;
        -  filter: alpha(opacity=20);
        -}
        -.alert .close:hover {
        -  opacity: 0.5;
        -  filter: alpha(opacity=50);
        -}
        -.alert a {
        -  color: #fff;
        -  text-decoration: underline;
        -}
        -.alert-success {
        -  border-color: #008d4c;
        -}
        -.alert-danger,
        -.alert-error {
        -  border-color: #d73925;
        -}
        -.alert-warning {
        -  border-color: #e08e0b;
        -}
        -.alert-info {
        -  border-color: #00acd6;
        -}
        -/*
        - * Component: Nav
        - * --------------
        - */
        -.nav > li > a:hover,
        -.nav > li > a:active,
        -.nav > li > a:focus {
        -  color: #444;
        -  background: #f7f7f7;
        -}
        -/* NAV PILLS */
        -.nav-pills > li > a {
        -  border-radius: 0;
        -  border-top: 3px solid transparent;
        -  color: #444;
        -}
        -.nav-pills > li > a > .fa,
        -.nav-pills > li > a > .glyphicon,
        -.nav-pills > li > a > .ion {
        -  margin-right: 5px;
        -}
        -.nav-pills > li.active > a,
        -.nav-pills > li.active > a:hover,
        -.nav-pills > li.active > a:focus {
        -  border-top-color: #3c8dbc;
        -}
        -.nav-pills > li.active > a {
        -  font-weight: 600;
        -}
        -/* NAV STACKED */
        -.nav-stacked > li > a {
        -  border-radius: 0;
        -  border-top: 0;
        -  border-left: 3px solid transparent;
        -  color: #444;
        -}
        -.nav-stacked > li.active > a,
        -.nav-stacked > li.active > a:hover {
        -  background: transparent;
        -  color: #444;
        -  border-top: 0;
        -  border-left-color: #3c8dbc;
        -}
        -.nav-stacked > li.header {
        -  border-bottom: 1px solid #ddd;
        -  color: #777;
        -  margin-bottom: 10px;
        -  padding: 5px 10px;
        -  text-transform: uppercase;
        -}
        -/* NAV TABS */
        -.nav-tabs-custom {
        -  margin-bottom: 20px;
        -  background: #fff;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  border-radius: 3px;
        -}
        -.nav-tabs-custom > .nav-tabs {
        -  margin: 0;
        -  border-bottom-color: #f4f4f4;
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px;
        -}
        -.nav-tabs-custom > .nav-tabs > li {
        -  border-top: 3px solid transparent;
        -  margin-bottom: -2px;
        -  margin-right: 5px;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a {
        -  color: #444;
        -  border-radius: 0;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a.text-muted {
        -  color: #999;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a,
        -.nav-tabs-custom > .nav-tabs > li > a:hover {
        -  background: transparent;
        -  margin: 0;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a:hover {
        -  color: #999;
        -}
        -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover,
        -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus,
        -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active {
        -  border-color: transparent;
        -}
        -.nav-tabs-custom > .nav-tabs > li.active {
        -  border-top-color: #3c8dbc;
        -}
        -.nav-tabs-custom > .nav-tabs > li.active > a,
        -.nav-tabs-custom > .nav-tabs > li.active:hover > a {
        -  background-color: #fff;
        -  color: #444;
        -}
        -.nav-tabs-custom > .nav-tabs > li.active > a {
        -  border-top-color: transparent;
        -  border-left-color: #f4f4f4;
        -  border-right-color: #f4f4f4;
        -}
        -.nav-tabs-custom > .nav-tabs > li:first-of-type {
        -  margin-left: 0;
        -}
        -.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a {
        -  border-left-color: transparent;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right {
        -  float: none!important;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li {
        -  float: right;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type {
        -  margin-right: 0;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a {
        -  border-left-width: 1px;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a {
        -  border-left-color: #f4f4f4;
        -  border-right-color: transparent;
        -}
        -.nav-tabs-custom > .nav-tabs > li.header {
        -  line-height: 35px;
        -  padding: 0 10px;
        -  font-size: 20px;
        -  color: #444;
        -}
        -.nav-tabs-custom > .nav-tabs > li.header > .fa,
        -.nav-tabs-custom > .nav-tabs > li.header > .glyphicon,
        -.nav-tabs-custom > .nav-tabs > li.header > .ion {
        -  margin-right: 5px;
        -}
        -.nav-tabs-custom > .tab-content {
        -  background: #fff;
        -  padding: 10px;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px;
        -}
        -.nav-tabs-custom .dropdown.open > a:active,
        -.nav-tabs-custom .dropdown.open > a:focus {
        -  background: transparent;
        -  color: #999;
        -}
        -/* PAGINATION */
        -.pagination > li > a {
        -  background: #fafafa;
        -  color: #666;
        -}
        -.pagination.pagination-flat > li > a {
        -  border-radius: 0 !important;
        -}
        -/*
        - * Component: Products List
        - * ------------------------
        - */
        -.products-list {
        -  list-style: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -.products-list > .item {
        -  border-radius: 3px;
        -  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  padding: 10px 0;
        -  background: #fff;
        -}
        -.products-list > .item:before,
        -.products-list > .item:after {
        -  content: " ";
        -  display: table;
        -}
        -.products-list > .item:after {
        -  clear: both;
        -}
        -.products-list .product-img {
        -  float: left;
        -}
        -.products-list .product-img img {
        -  width: 50px;
        -  height: 50px;
        -}
        -.products-list .product-info {
        -  margin-left: 60px;
        -}
        -.products-list .product-title {
        -  font-weight: 600;
        -}
        -.products-list .product-description {
        -  display: block;
        -  color: #999;
        -  overflow: hidden;
        -  white-space: nowrap;
        -  text-overflow: ellipsis;
        -}
        -.product-list-in-box > .item {
        -  -webkit-box-shadow: none;
        -  box-shadow: none;
        -  border-radius: 0;
        -  border-bottom: 1px solid #f4f4f4;
        -}
        -.product-list-in-box > .item:last-of-type {
        -  border-bottom-width: 0;
        -}
        -/*
        - * Component: Table
        - * ----------------
        - */
        -.table > thead > tr > th,
        -.table > tbody > tr > th,
        -.table > tfoot > tr > th,
        -.table > thead > tr > td,
        -.table > tbody > tr > td,
        -.table > tfoot > tr > td {
        -  border-top: 1px solid #f4f4f4;
        -}
        -.table > thead > tr > th {
        -  border-bottom: 2px solid #f4f4f4;
        -}
        -.table tr td .progress {
        -  margin-top: 5px;
        -}
        -.table-bordered {
        -  border: 1px solid #f4f4f4;
        -}
        -.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 #f4f4f4;
        -}
        -.table-bordered > thead > tr > th,
        -.table-bordered > thead > tr > td {
        -  border-bottom-width: 2px;
        -}
        -.table.no-border,
        -.table.no-border td,
        -.table.no-border th {
        -  border: 0;
        -}
        -/* .text-center in tables */
        -table.text-center,
        -table.text-center td,
        -table.text-center th {
        -  text-align: center;
        -}
        -.table.align th {
        -  text-align: left;
        -}
        -.table.align td {
        -  text-align: right;
        -}
        -/*
        - * Component: Label
        - * ----------------
        - */
        -.label-default {
        -  background-color: #d2d6de;
        -  color: #444;
        -}
        -/*
        - * Component: Direct Chat
        - * ----------------------
        - */
        -.direct-chat .box-body {
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0;
        -  position: relative;
        -  overflow-x: hidden;
        -  padding: 0;
        -}
        -.direct-chat.chat-pane-open .direct-chat-contacts {
        -  -webkit-transform: translate(0, 0);
        -  -ms-transform: translate(0, 0);
        -  -o-transform: translate(0, 0);
        -  transform: translate(0, 0);
        -}
        -.direct-chat-messages {
        -  -webkit-transform: translate(0, 0);
        -  -ms-transform: translate(0, 0);
        -  -o-transform: translate(0, 0);
        -  transform: translate(0, 0);
        -  padding: 10px;
        -  height: 250px;
        -  overflow: auto;
        -}
        -.direct-chat-msg,
        -.direct-chat-text {
        -  display: block;
        -}
        -.direct-chat-msg {
        -  margin-bottom: 10px;
        -}
        -.direct-chat-msg:before,
        -.direct-chat-msg:after {
        -  content: " ";
        -  display: table;
        -}
        -.direct-chat-msg:after {
        -  clear: both;
        -}
        -.direct-chat-messages,
        -.direct-chat-contacts {
        -  -webkit-transition: -webkit-transform 0.5s ease-in-out;
        -  -moz-transition: -moz-transform 0.5s ease-in-out;
        -  -o-transition: -o-transform 0.5s ease-in-out;
        -  transition: transform 0.5s ease-in-out;
        -}
        -.direct-chat-text {
        -  border-radius: 5px;
        -  position: relative;
        -  padding: 5px 10px;
        -  background: #d2d6de;
        -  border: 1px solid #d2d6de;
        -  margin: 5px 0 0 50px;
        -  color: #444444;
        -}
        -.direct-chat-text:after,
        -.direct-chat-text:before {
        -  position: absolute;
        -  right: 100%;
        -  top: 15px;
        -  border: solid transparent;
        -  border-right-color: #d2d6de;
        -  content: ' ';
        -  height: 0;
        -  width: 0;
        -  pointer-events: none;
        -}
        -.direct-chat-text:after {
        -  border-width: 5px;
        -  margin-top: -5px;
        -}
        -.direct-chat-text:before {
        -  border-width: 6px;
        -  margin-top: -6px;
        -}
        -.right .direct-chat-text {
        -  margin-right: 50px;
        -  margin-left: 0;
        -}
        -.right .direct-chat-text:after,
        -.right .direct-chat-text:before {
        -  right: auto;
        -  left: 100%;
        -  border-right-color: transparent;
        -  border-left-color: #d2d6de;
        -}
        -.direct-chat-img {
        -  border-radius: 50%;
        -  float: left;
        -  width: 40px;
        -  height: 40px;
        -}
        -.right .direct-chat-img {
        -  float: right;
        -}
        -.direct-chat-info {
        -  display: block;
        -  margin-bottom: 2px;
        -  font-size: 12px;
        -}
        -.direct-chat-name {
        -  font-weight: 600;
        -}
        -.direct-chat-timestamp {
        -  color: #999;
        -}
        -.direct-chat-contacts-open .direct-chat-contacts {
        -  -webkit-transform: translate(0, 0);
        -  -ms-transform: translate(0, 0);
        -  -o-transform: translate(0, 0);
        -  transform: translate(0, 0);
        -}
        -.direct-chat-contacts {
        -  -webkit-transform: translate(101%, 0);
        -  -ms-transform: translate(101%, 0);
        -  -o-transform: translate(101%, 0);
        -  transform: translate(101%, 0);
        -  position: absolute;
        -  top: 0;
        -  bottom: 0;
        -  height: 250px;
        -  width: 100%;
        -  background: #222d32;
        -  color: #fff;
        -  overflow: auto;
        -}
        -.contacts-list > li {
        -  border-bottom: 1px solid rgba(0, 0, 0, 0.2);
        -  padding: 10px;
        -  margin: 0;
        -}
        -.contacts-list > li:before,
        -.contacts-list > li:after {
        -  content: " ";
        -  display: table;
        -}
        -.contacts-list > li:after {
        -  clear: both;
        -}
        -.contacts-list > li:last-of-type {
        -  border-bottom: none;
        -}
        -.contacts-list-img {
        -  border-radius: 50%;
        -  width: 40px;
        -  float: left;
        -}
        -.contacts-list-info {
        -  margin-left: 45px;
        -  color: #fff;
        -}
        -.contacts-list-name,
        -.contacts-list-status {
        -  display: block;
        -}
        -.contacts-list-name {
        -  font-weight: 600;
        -}
        -.contacts-list-status {
        -  font-size: 12px;
        -}
        -.contacts-list-date {
        -  color: #aaa;
        -  font-weight: normal;
        -}
        -.contacts-list-msg {
        -  color: #999;
        -}
        -.direct-chat-danger .right > .direct-chat-text {
        -  background: #dd4b39;
        -  border-color: #dd4b39;
        -  color: #ffffff;
        -}
        -.direct-chat-danger .right > .direct-chat-text:after,
        -.direct-chat-danger .right > .direct-chat-text:before {
        -  border-left-color: #dd4b39;
        -}
        -.direct-chat-primary .right > .direct-chat-text {
        -  background: #3c8dbc;
        -  border-color: #3c8dbc;
        -  color: #ffffff;
        -}
        -.direct-chat-primary .right > .direct-chat-text:after,
        -.direct-chat-primary .right > .direct-chat-text:before {
        -  border-left-color: #3c8dbc;
        -}
        -.direct-chat-warning .right > .direct-chat-text {
        -  background: #f39c12;
        -  border-color: #f39c12;
        -  color: #ffffff;
        -}
        -.direct-chat-warning .right > .direct-chat-text:after,
        -.direct-chat-warning .right > .direct-chat-text:before {
        -  border-left-color: #f39c12;
        -}
        -.direct-chat-info .right > .direct-chat-text {
        -  background: #00c0ef;
        -  border-color: #00c0ef;
        -  color: #ffffff;
        -}
        -.direct-chat-info .right > .direct-chat-text:after,
        -.direct-chat-info .right > .direct-chat-text:before {
        -  border-left-color: #00c0ef;
        -}
        -.direct-chat-success .right > .direct-chat-text {
        -  background: #00a65a;
        -  border-color: #00a65a;
        -  color: #ffffff;
        -}
        -.direct-chat-success .right > .direct-chat-text:after,
        -.direct-chat-success .right > .direct-chat-text:before {
        -  border-left-color: #00a65a;
        -}
        -/*
        - * Component: Users List
        - * ---------------------
        - */
        -.users-list > li {
        -  width: 25%;
        -  float: left;
        -  padding: 10px;
        -  text-align: center;
        -}
        -.users-list > li img {
        -  border-radius: 50%;
        -  max-width: 100%;
        -  height: auto;
        -}
        -.users-list > li > a:hover,
        -.users-list > li > a:hover .users-list-name {
        -  color: #999;
        -}
        -.users-list-name,
        -.users-list-date {
        -  display: block;
        -}
        -.users-list-name {
        -  font-weight: 600;
        -  color: #444;
        -  overflow: hidden;
        -  white-space: nowrap;
        -  text-overflow: ellipsis;
        -}
        -.users-list-date {
        -  color: #999;
        -  font-size: 12px;
        -}
        -/*
        - * Component: Carousel
        - * -------------------
        - */
        -.carousel-control.left,
        -.carousel-control.right {
        -  background-image: none;
        -}
        -.carousel-control > .fa {
        -  font-size: 40px;
        -  position: absolute;
        -  top: 50%;
        -  z-index: 5;
        -  display: inline-block;
        -  margin-top: -20px;
        -}
        -/*
        - * Component: modal
        - * ----------------
        - */
        -.modal {
        -  background: rgba(0, 0, 0, 0.3);
        -}
        -.modal-content {
        -  border-radius: 0;
        -  -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
        -  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
        -  border: 0;
        -}
        -@media (min-width: 768px) {
        -  .modal-content {
        -    -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
        -    box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
        -  }
        -}
        -.modal-header {
        -  border-bottom-color: #f4f4f4;
        -}
        -.modal-footer {
        -  border-top-color: #f4f4f4;
        -}
        -.modal-primary .modal-header,
        -.modal-primary .modal-footer {
        -  border-color: #307095;
        -}
        -.modal-warning .modal-header,
        -.modal-warning .modal-footer {
        -  border-color: #c87f0a;
        -}
        -.modal-info .modal-header,
        -.modal-info .modal-footer {
        -  border-color: #0097bc;
        -}
        -.modal-success .modal-header,
        -.modal-success .modal-footer {
        -  border-color: #00733e;
        -}
        -.modal-danger .modal-header,
        -.modal-danger .modal-footer {
        -  border-color: #c23321;
        -}
        -/*
        - * Component: Social Widgets
        - * -------------------------
        - */
        -.box-widget {
        -  border: none;
        -  position: relative;
        -}
        -.widget-user .widget-user-header {
        -  padding: 20px;
        -  height: 120px;
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px;
        -}
        -.widget-user .widget-user-username {
        -  margin-top: 0;
        -  margin-bottom: 5px;
        -  font-size: 25px;
        -  font-weight: 300;
        -  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
        -}
        -.widget-user .widget-user-desc {
        -  margin-top: 0;
        -}
        -.widget-user .widget-user-image {
        -  position: absolute;
        -  top: 65px;
        -  left: 50%;
        -  margin-left: -45px;
        -}
        -.widget-user .widget-user-image > img {
        -  width: 90px;
        -  height: auto;
        -  border: 3px solid #fff;
        -}
        -.widget-user .box-footer {
        -  padding-top: 30px;
        -}
        -.widget-user-2 .widget-user-header {
        -  padding: 20px;
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px;
        -}
        -.widget-user-2 .widget-user-username {
        -  margin-top: 5px;
        -  margin-bottom: 5px;
        -  font-size: 25px;
        -  font-weight: 300;
        -}
        -.widget-user-2 .widget-user-desc {
        -  margin-top: 0;
        -}
        -.widget-user-2 .widget-user-username,
        -.widget-user-2 .widget-user-desc {
        -  margin-left: 75px;
        -}
        -.widget-user-2 .widget-user-image > img {
        -  width: 65px;
        -  height: auto;
        -  float: left;
        -}
        -/*
        - * Page: Mailbox
        - * -------------
        - */
        -.mailbox-messages > .table {
        -  margin: 0;
        -}
        -.mailbox-controls {
        -  padding: 5px;
        -}
        -.mailbox-controls.with-border {
        -  border-bottom: 1px solid #f4f4f4;
        -}
        -.mailbox-read-info {
        -  border-bottom: 1px solid #f4f4f4;
        -  padding: 10px;
        -}
        -.mailbox-read-info h3 {
        -  font-size: 20px;
        -  margin: 0;
        -}
        -.mailbox-read-info h5 {
        -  margin: 0;
        -  padding: 5px 0 0 0;
        -}
        -.mailbox-read-time {
        -  color: #999;
        -  font-size: 13px;
        -}
        -.mailbox-read-message {
        -  padding: 10px;
        -}
        -.mailbox-attachments li {
        -  float: left;
        -  width: 200px;
        -  border: 1px solid #eee;
        -  margin-bottom: 10px;
        -  margin-right: 10px;
        -}
        -.mailbox-attachment-name {
        -  font-weight: bold;
        -  color: #666;
        -}
        -.mailbox-attachment-icon,
        -.mailbox-attachment-info,
        -.mailbox-attachment-size {
        -  display: block;
        -}
        -.mailbox-attachment-info {
        -  padding: 10px;
        -  background: #f4f4f4;
        -}
        -.mailbox-attachment-size {
        -  color: #999;
        -  font-size: 12px;
        -}
        -.mailbox-attachment-icon {
        -  text-align: center;
        -  font-size: 65px;
        -  color: #666;
        -  padding: 20px 10px;
        -}
        -.mailbox-attachment-icon.has-img {
        -  padding: 0;
        -}
        -.mailbox-attachment-icon.has-img > img {
        -  max-width: 100%;
        -  height: auto;
        -}
        -/*
        - * Page: Lock Screen
        - * -----------------
        - */
        -/* ADD THIS CLASS TO THE <BODY> TAG */
        -.lockscreen {
        -  background: #d2d6de;
        -}
        -.lockscreen-logo {
        -  font-size: 35px;
        -  text-align: center;
        -  margin-bottom: 25px;
        -  font-weight: 300;
        -}
        -.lockscreen-logo a {
        -  color: #444;
        -}
        -.lockscreen-wrapper {
        -  max-width: 400px;
        -  margin: 0 auto;
        -  margin-top: 10%;
        -}
        -/* User name [optional] */
        -.lockscreen .lockscreen-name {
        -  text-align: center;
        -  font-weight: 600;
        -}
        -/* Will contain the image and the sign in form */
        -.lockscreen-item {
        -  border-radius: 4px;
        -  padding: 0;
        -  background: #fff;
        -  position: relative;
        -  margin: 10px auto 30px auto;
        -  width: 290px;
        -}
        -/* User image */
        -.lockscreen-image {
        -  border-radius: 50%;
        -  position: absolute;
        -  left: -10px;
        -  top: -25px;
        -  background: #fff;
        -  padding: 5px;
        -  z-index: 10;
        -}
        -.lockscreen-image > img {
        -  border-radius: 50%;
        -  width: 70px;
        -  height: 70px;
        -}
        -/* Contains the password input and the login button */
        -.lockscreen-credentials {
        -  margin-left: 70px;
        -}
        -.lockscreen-credentials .form-control {
        -  border: 0;
        -}
        -.lockscreen-credentials .btn {
        -  background-color: #fff;
        -  border: 0;
        -  padding: 0 10px;
        -}
        -.lockscreen-footer {
        -  margin-top: 10px;
        -}
        -/*
        - * Page: Login & Register
        - * ----------------------
        - */
        -.login-logo,
        -.register-logo {
        -  font-size: 35px;
        -  text-align: center;
        -  margin-bottom: 25px;
        -  font-weight: 300;
        -}
        -.login-logo a,
        -.register-logo a {
        -  color: #444;
        -}
        -.login-page,
        -.register-page {
        -  background: #d2d6de;
        -}
        -.login-box,
        -.register-box {
        -  width: 360px;
        -  margin: 7% auto;
        -}
        -@media (max-width: 768px) {
        -  .login-box,
        -  .register-box {
        -    width: 90%;
        -    margin-top: 20px;
        -  }
        -}
        -.login-box-body,
        -.register-box-body {
        -  background: #fff;
        -  padding: 20px;
        -  border-top: 0;
        -  color: #666;
        -}
        -.login-box-body .form-control-feedback,
        -.register-box-body .form-control-feedback {
        -  color: #777;
        -}
        -.login-box-msg,
        -.register-box-msg {
        -  margin: 0;
        -  text-align: center;
        -  padding: 0 20px 20px 20px;
        -}
        -.social-auth-links {
        -  margin: 10px 0;
        -}
        -/*
        - * Page: 400 and 500 error pages
        - * ------------------------------
        - */
        -.error-page {
        -  width: 600px;
        -  margin: 20px auto 0 auto;
        -}
        -@media (max-width: 991px) {
        -  .error-page {
        -    width: 100%;
        -  }
        -}
        -.error-page > .headline {
        -  float: left;
        -  font-size: 100px;
        -  font-weight: 300;
        -}
        -@media (max-width: 991px) {
        -  .error-page > .headline {
        -    float: none;
        -    text-align: center;
        -  }
        -}
        -.error-page > .error-content {
        -  margin-left: 190px;
        -  display: block;
        -}
        -@media (max-width: 991px) {
        -  .error-page > .error-content {
        -    margin-left: 0;
        -  }
        -}
        -.error-page > .error-content > h3 {
        -  font-weight: 300;
        -  font-size: 25px;
        -}
        -@media (max-width: 991px) {
        -  .error-page > .error-content > h3 {
        -    text-align: center;
        -  }
        -}
        -/*
        - * Page: Invoice
        - * -------------
        - */
        -.invoice {
        -  position: relative;
        -  background: #fff;
        -  border: 1px solid #f4f4f4;
        -  padding: 20px;
        -  margin: 10px 25px;
        -}
        -.invoice-title {
        -  margin-top: 0;
        -}
        -/*
        - * Page: Profile
        - * -------------
        - */
        -.profile-user-img {
        -  margin: 0 auto;
        -  width: 100px;
        -  padding: 3px;
        -  border: 3px solid #d2d6de;
        -}
        -.profile-username {
        -  font-size: 21px;
        -  margin-top: 5px;
        -}
        -.post {
        -  border-bottom: 1px solid #d2d6de;
        -  margin-bottom: 15px;
        -  padding-bottom: 15px;
        -  color: #666;
        -}
        -.post:last-of-type {
        -  border-bottom: 0;
        -  margin-bottom: 0;
        -  padding-bottom: 0;
        -}
        -.post .user-block {
        -  margin-bottom: 15px;
        -}
        -/*
        - * Social Buttons for Bootstrap
        - *
        - * Copyright 2013-2015 Panayiotis Lipiridis
        - * Licensed under the MIT License
        - *
        - * https://github.com/lipis/bootstrap-social
        - */
        -.btn-social {
        -  position: relative;
        -  padding-left: 44px;
        -  text-align: left;
        -  white-space: nowrap;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -}
        -.btn-social > :first-child {
        -  position: absolute;
        -  left: 0;
        -  top: 0;
        -  bottom: 0;
        -  width: 32px;
        -  line-height: 34px;
        -  font-size: 1.6em;
        -  text-align: center;
        -  border-right: 1px solid rgba(0, 0, 0, 0.2);
        -}
        -.btn-social.btn-lg {
        -  padding-left: 61px;
        -}
        -.btn-social.btn-lg > :first-child {
        -  line-height: 45px;
        -  width: 45px;
        -  font-size: 1.8em;
        -}
        -.btn-social.btn-sm {
        -  padding-left: 38px;
        -}
        -.btn-social.btn-sm > :first-child {
        -  line-height: 28px;
        -  width: 28px;
        -  font-size: 1.4em;
        -}
        -.btn-social.btn-xs {
        -  padding-left: 30px;
        -}
        -.btn-social.btn-xs > :first-child {
        -  line-height: 20px;
        -  width: 20px;
        -  font-size: 1.2em;
        -}
        -.btn-social-icon {
        -  position: relative;
        -  padding-left: 44px;
        -  text-align: left;
        -  white-space: nowrap;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -  height: 34px;
        -  width: 34px;
        -  padding: 0;
        -}
        -.btn-social-icon > :first-child {
        -  position: absolute;
        -  left: 0;
        -  top: 0;
        -  bottom: 0;
        -  width: 32px;
        -  line-height: 34px;
        -  font-size: 1.6em;
        -  text-align: center;
        -  border-right: 1px solid rgba(0, 0, 0, 0.2);
        -}
        -.btn-social-icon.btn-lg {
        -  padding-left: 61px;
        -}
        -.btn-social-icon.btn-lg > :first-child {
        -  line-height: 45px;
        -  width: 45px;
        -  font-size: 1.8em;
        -}
        -.btn-social-icon.btn-sm {
        -  padding-left: 38px;
        -}
        -.btn-social-icon.btn-sm > :first-child {
        -  line-height: 28px;
        -  width: 28px;
        -  font-size: 1.4em;
        -}
        -.btn-social-icon.btn-xs {
        -  padding-left: 30px;
        -}
        -.btn-social-icon.btn-xs > :first-child {
        -  line-height: 20px;
        -  width: 20px;
        -  font-size: 1.2em;
        -}
        -.btn-social-icon > :first-child {
        -  border: none;
        -  text-align: center;
        -  width: 100%;
        -}
        -.btn-social-icon.btn-lg {
        -  height: 45px;
        -  width: 45px;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.btn-social-icon.btn-sm {
        -  height: 30px;
        -  width: 30px;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.btn-social-icon.btn-xs {
        -  height: 22px;
        -  width: 22px;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.btn-adn {
        -  color: #ffffff;
        -  background-color: #d87a68;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-adn:hover,
        -.btn-adn:focus,
        -.btn-adn.focus,
        -.btn-adn:active,
        -.btn-adn.active,
        -.open > .dropdown-toggle.btn-adn {
        -  color: #ffffff;
        -  background-color: #ce563f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-adn:active,
        -.btn-adn.active,
        -.open > .dropdown-toggle.btn-adn {
        -  background-image: none;
        -}
        -.btn-adn .badge {
        -  color: #d87a68;
        -  background-color: #ffffff;
        -}
        -.btn-bitbucket {
        -  color: #ffffff;
        -  background-color: #205081;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-bitbucket:hover,
        -.btn-bitbucket:focus,
        -.btn-bitbucket.focus,
        -.btn-bitbucket:active,
        -.btn-bitbucket.active,
        -.open > .dropdown-toggle.btn-bitbucket {
        -  color: #ffffff;
        -  background-color: #163758;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-bitbucket:active,
        -.btn-bitbucket.active,
        -.open > .dropdown-toggle.btn-bitbucket {
        -  background-image: none;
        -}
        -.btn-bitbucket .badge {
        -  color: #205081;
        -  background-color: #ffffff;
        -}
        -.btn-dropbox {
        -  color: #ffffff;
        -  background-color: #1087dd;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-dropbox:hover,
        -.btn-dropbox:focus,
        -.btn-dropbox.focus,
        -.btn-dropbox:active,
        -.btn-dropbox.active,
        -.open > .dropdown-toggle.btn-dropbox {
        -  color: #ffffff;
        -  background-color: #0d6aad;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-dropbox:active,
        -.btn-dropbox.active,
        -.open > .dropdown-toggle.btn-dropbox {
        -  background-image: none;
        -}
        -.btn-dropbox .badge {
        -  color: #1087dd;
        -  background-color: #ffffff;
        -}
        -.btn-facebook {
        -  color: #ffffff;
        -  background-color: #3b5998;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-facebook:hover,
        -.btn-facebook:focus,
        -.btn-facebook.focus,
        -.btn-facebook:active,
        -.btn-facebook.active,
        -.open > .dropdown-toggle.btn-facebook {
        -  color: #ffffff;
        -  background-color: #2d4373;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-facebook:active,
        -.btn-facebook.active,
        -.open > .dropdown-toggle.btn-facebook {
        -  background-image: none;
        -}
        -.btn-facebook .badge {
        -  color: #3b5998;
        -  background-color: #ffffff;
        -}
        -.btn-flickr {
        -  color: #ffffff;
        -  background-color: #ff0084;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-flickr:hover,
        -.btn-flickr:focus,
        -.btn-flickr.focus,
        -.btn-flickr:active,
        -.btn-flickr.active,
        -.open > .dropdown-toggle.btn-flickr {
        -  color: #ffffff;
        -  background-color: #cc006a;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-flickr:active,
        -.btn-flickr.active,
        -.open > .dropdown-toggle.btn-flickr {
        -  background-image: none;
        -}
        -.btn-flickr .badge {
        -  color: #ff0084;
        -  background-color: #ffffff;
        -}
        -.btn-foursquare {
        -  color: #ffffff;
        -  background-color: #f94877;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-foursquare:hover,
        -.btn-foursquare:focus,
        -.btn-foursquare.focus,
        -.btn-foursquare:active,
        -.btn-foursquare.active,
        -.open > .dropdown-toggle.btn-foursquare {
        -  color: #ffffff;
        -  background-color: #f71752;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-foursquare:active,
        -.btn-foursquare.active,
        -.open > .dropdown-toggle.btn-foursquare {
        -  background-image: none;
        -}
        -.btn-foursquare .badge {
        -  color: #f94877;
        -  background-color: #ffffff;
        -}
        -.btn-github {
        -  color: #ffffff;
        -  background-color: #444444;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-github:hover,
        -.btn-github:focus,
        -.btn-github.focus,
        -.btn-github:active,
        -.btn-github.active,
        -.open > .dropdown-toggle.btn-github {
        -  color: #ffffff;
        -  background-color: #2b2b2b;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-github:active,
        -.btn-github.active,
        -.open > .dropdown-toggle.btn-github {
        -  background-image: none;
        -}
        -.btn-github .badge {
        -  color: #444444;
        -  background-color: #ffffff;
        -}
        -.btn-google {
        -  color: #ffffff;
        -  background-color: #dd4b39;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-google:hover,
        -.btn-google:focus,
        -.btn-google.focus,
        -.btn-google:active,
        -.btn-google.active,
        -.open > .dropdown-toggle.btn-google {
        -  color: #ffffff;
        -  background-color: #c23321;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-google:active,
        -.btn-google.active,
        -.open > .dropdown-toggle.btn-google {
        -  background-image: none;
        -}
        -.btn-google .badge {
        -  color: #dd4b39;
        -  background-color: #ffffff;
        -}
        -.btn-instagram {
        -  color: #ffffff;
        -  background-color: #3f729b;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-instagram:hover,
        -.btn-instagram:focus,
        -.btn-instagram.focus,
        -.btn-instagram:active,
        -.btn-instagram.active,
        -.open > .dropdown-toggle.btn-instagram {
        -  color: #ffffff;
        -  background-color: #305777;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-instagram:active,
        -.btn-instagram.active,
        -.open > .dropdown-toggle.btn-instagram {
        -  background-image: none;
        -}
        -.btn-instagram .badge {
        -  color: #3f729b;
        -  background-color: #ffffff;
        -}
        -.btn-linkedin {
        -  color: #ffffff;
        -  background-color: #007bb6;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-linkedin:hover,
        -.btn-linkedin:focus,
        -.btn-linkedin.focus,
        -.btn-linkedin:active,
        -.btn-linkedin.active,
        -.open > .dropdown-toggle.btn-linkedin {
        -  color: #ffffff;
        -  background-color: #005983;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-linkedin:active,
        -.btn-linkedin.active,
        -.open > .dropdown-toggle.btn-linkedin {
        -  background-image: none;
        -}
        -.btn-linkedin .badge {
        -  color: #007bb6;
        -  background-color: #ffffff;
        -}
        -.btn-microsoft {
        -  color: #ffffff;
        -  background-color: #2672ec;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-microsoft:hover,
        -.btn-microsoft:focus,
        -.btn-microsoft.focus,
        -.btn-microsoft:active,
        -.btn-microsoft.active,
        -.open > .dropdown-toggle.btn-microsoft {
        -  color: #ffffff;
        -  background-color: #125acd;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-microsoft:active,
        -.btn-microsoft.active,
        -.open > .dropdown-toggle.btn-microsoft {
        -  background-image: none;
        -}
        -.btn-microsoft .badge {
        -  color: #2672ec;
        -  background-color: #ffffff;
        -}
        -.btn-openid {
        -  color: #ffffff;
        -  background-color: #f7931e;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-openid:hover,
        -.btn-openid:focus,
        -.btn-openid.focus,
        -.btn-openid:active,
        -.btn-openid.active,
        -.open > .dropdown-toggle.btn-openid {
        -  color: #ffffff;
        -  background-color: #da7908;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-openid:active,
        -.btn-openid.active,
        -.open > .dropdown-toggle.btn-openid {
        -  background-image: none;
        -}
        -.btn-openid .badge {
        -  color: #f7931e;
        -  background-color: #ffffff;
        -}
        -.btn-pinterest {
        -  color: #ffffff;
        -  background-color: #cb2027;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-pinterest:hover,
        -.btn-pinterest:focus,
        -.btn-pinterest.focus,
        -.btn-pinterest:active,
        -.btn-pinterest.active,
        -.open > .dropdown-toggle.btn-pinterest {
        -  color: #ffffff;
        -  background-color: #9f191f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-pinterest:active,
        -.btn-pinterest.active,
        -.open > .dropdown-toggle.btn-pinterest {
        -  background-image: none;
        -}
        -.btn-pinterest .badge {
        -  color: #cb2027;
        -  background-color: #ffffff;
        -}
        -.btn-reddit {
        -  color: #000000;
        -  background-color: #eff7ff;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-reddit:hover,
        -.btn-reddit:focus,
        -.btn-reddit.focus,
        -.btn-reddit:active,
        -.btn-reddit.active,
        -.open > .dropdown-toggle.btn-reddit {
        -  color: #000000;
        -  background-color: #bcddff;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-reddit:active,
        -.btn-reddit.active,
        -.open > .dropdown-toggle.btn-reddit {
        -  background-image: none;
        -}
        -.btn-reddit .badge {
        -  color: #eff7ff;
        -  background-color: #000000;
        -}
        -.btn-soundcloud {
        -  color: #ffffff;
        -  background-color: #ff5500;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-soundcloud:hover,
        -.btn-soundcloud:focus,
        -.btn-soundcloud.focus,
        -.btn-soundcloud:active,
        -.btn-soundcloud.active,
        -.open > .dropdown-toggle.btn-soundcloud {
        -  color: #ffffff;
        -  background-color: #cc4400;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-soundcloud:active,
        -.btn-soundcloud.active,
        -.open > .dropdown-toggle.btn-soundcloud {
        -  background-image: none;
        -}
        -.btn-soundcloud .badge {
        -  color: #ff5500;
        -  background-color: #ffffff;
        -}
        -.btn-tumblr {
        -  color: #ffffff;
        -  background-color: #2c4762;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-tumblr:hover,
        -.btn-tumblr:focus,
        -.btn-tumblr.focus,
        -.btn-tumblr:active,
        -.btn-tumblr.active,
        -.open > .dropdown-toggle.btn-tumblr {
        -  color: #ffffff;
        -  background-color: #1c2d3f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-tumblr:active,
        -.btn-tumblr.active,
        -.open > .dropdown-toggle.btn-tumblr {
        -  background-image: none;
        -}
        -.btn-tumblr .badge {
        -  color: #2c4762;
        -  background-color: #ffffff;
        -}
        -.btn-twitter {
        -  color: #ffffff;
        -  background-color: #55acee;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-twitter:hover,
        -.btn-twitter:focus,
        -.btn-twitter.focus,
        -.btn-twitter:active,
        -.btn-twitter.active,
        -.open > .dropdown-toggle.btn-twitter {
        -  color: #ffffff;
        -  background-color: #2795e9;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-twitter:active,
        -.btn-twitter.active,
        -.open > .dropdown-toggle.btn-twitter {
        -  background-image: none;
        -}
        -.btn-twitter .badge {
        -  color: #55acee;
        -  background-color: #ffffff;
        -}
        -.btn-vimeo {
        -  color: #ffffff;
        -  background-color: #1ab7ea;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vimeo:hover,
        -.btn-vimeo:focus,
        -.btn-vimeo.focus,
        -.btn-vimeo:active,
        -.btn-vimeo.active,
        -.open > .dropdown-toggle.btn-vimeo {
        -  color: #ffffff;
        -  background-color: #1295bf;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vimeo:active,
        -.btn-vimeo.active,
        -.open > .dropdown-toggle.btn-vimeo {
        -  background-image: none;
        -}
        -.btn-vimeo .badge {
        -  color: #1ab7ea;
        -  background-color: #ffffff;
        -}
        -.btn-vk {
        -  color: #ffffff;
        -  background-color: #587ea3;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vk:hover,
        -.btn-vk:focus,
        -.btn-vk.focus,
        -.btn-vk:active,
        -.btn-vk.active,
        -.open > .dropdown-toggle.btn-vk {
        -  color: #ffffff;
        -  background-color: #466482;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vk:active,
        -.btn-vk.active,
        -.open > .dropdown-toggle.btn-vk {
        -  background-image: none;
        -}
        -.btn-vk .badge {
        -  color: #587ea3;
        -  background-color: #ffffff;
        -}
        -.btn-yahoo {
        -  color: #ffffff;
        -  background-color: #720e9e;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-yahoo:hover,
        -.btn-yahoo:focus,
        -.btn-yahoo.focus,
        -.btn-yahoo:active,
        -.btn-yahoo.active,
        -.open > .dropdown-toggle.btn-yahoo {
        -  color: #ffffff;
        -  background-color: #500a6f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-yahoo:active,
        -.btn-yahoo.active,
        -.open > .dropdown-toggle.btn-yahoo {
        -  background-image: none;
        -}
        -.btn-yahoo .badge {
        -  color: #720e9e;
        -  background-color: #ffffff;
        -}
        -/*
        - * Plugin: Full Calendar
        - * ---------------------
        - */
        -.fc-button {
        -  background: #f4f4f4;
        -  background-image: none;
        -  color: #444;
        -  border-color: #ddd;
        -  border-bottom-color: #ddd;
        -}
        -.fc-button:hover,
        -.fc-button:active,
        -.fc-button.hover {
        -  background-color: #e9e9e9;
        -}
        -.fc-header-title h2 {
        -  font-size: 15px;
        -  line-height: 1.6em;
        -  color: #666;
        -  margin-left: 10px;
        -}
        -.fc-header-right {
        -  padding-right: 10px;
        -}
        -.fc-header-left {
        -  padding-left: 10px;
        -}
        -.fc-widget-header {
        -  background: #fafafa;
        -}
        -.fc-grid {
        -  width: 100%;
        -  border: 0;
        -}
        -.fc-widget-header:first-of-type,
        -.fc-widget-content:first-of-type {
        -  border-left: 0;
        -  border-right: 0;
        -}
        -.fc-widget-header:last-of-type,
        -.fc-widget-content:last-of-type {
        -  border-right: 0;
        -}
        -.fc-toolbar {
        -  padding: 10px;
        -  margin: 0;
        -}
        -.fc-day-number {
        -  font-size: 20px;
        -  font-weight: 300;
        -  padding-right: 10px;
        -}
        -.fc-color-picker {
        -  list-style: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -.fc-color-picker > li {
        -  float: left;
        -  font-size: 30px;
        -  margin-right: 5px;
        -  line-height: 30px;
        -}
        -.fc-color-picker > li .fa {
        -  -webkit-transition: -webkit-transform linear 0.3s;
        -  -moz-transition: -moz-transform linear 0.3s;
        -  -o-transition: -o-transform linear 0.3s;
        -  transition: transform linear 0.3s;
        -}
        -.fc-color-picker > li .fa:hover {
        -  -webkit-transform: rotate(30deg);
        -  -ms-transform: rotate(30deg);
        -  -o-transform: rotate(30deg);
        -  transform: rotate(30deg);
        -}
        -#add-new-event {
        -  -webkit-transition: all linear 0.3s;
        -  -o-transition: all linear 0.3s;
        -  transition: all linear 0.3s;
        -}
        -.external-event {
        -  padding: 5px 10px;
        -  font-weight: bold;
        -  margin-bottom: 4px;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  border-radius: 3px;
        -  cursor: move;
        -}
        -.external-event:hover {
        -  box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);
        -}
        -/*
        - * Plugin: Select2
        - * ---------------
        - */
        -.select2-container--default.select2-container--focus,
        -.select2-selection.select2-container--focus,
        -.select2-container--default:focus,
        -.select2-selection:focus,
        -.select2-container--default:active,
        -.select2-selection:active {
        -  outline: none;
        -}
        -.select2-container--default .select2-selection--single,
        -.select2-selection .select2-selection--single {
        -  border: 1px solid #d2d6de;
        -  border-radius: 0;
        -  padding: 6px 12px;
        -  height: 34px;
        -}
        -.select2-container--default.select2-container--open {
        -  border-color: #3c8dbc;
        -}
        -.select2-dropdown {
        -  border: 1px solid #d2d6de;
        -  border-radius: 0;
        -}
        -.select2-container--default .select2-results__option--highlighted[aria-selected] {
        -  background-color: #3c8dbc;
        -  color: white;
        -}
        -.select2-results__option {
        -  padding: 6px 12px;
        -  user-select: none;
        -  -webkit-user-select: none;
        -}
        -.select2-container .select2-selection--single .select2-selection__rendered {
        -  padding-left: 0;
        -  padding-right: 0;
        -  height: auto;
        -  margin-top: -4px;
        -}
        -.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
        -  padding-right: 6px;
        -  padding-left: 20px;
        -}
        -.select2-container--default .select2-selection--single .select2-selection__arrow {
        -  height: 28px;
        -  right: 3px;
        -}
        -.select2-container--default .select2-selection--single .select2-selection__arrow b {
        -  margin-top: 0;
        -}
        -.select2-dropdown .select2-search__field,
        -.select2-search--inline .select2-search__field {
        -  border: 1px solid #d2d6de;
        -}
        -.select2-dropdown .select2-search__field:focus,
        -.select2-search--inline .select2-search__field:focus {
        -  outline: none;
        -  border: 1px solid #3c8dbc;
        -}
        -.select2-container--default .select2-results__option[aria-disabled=true] {
        -  color: #999;
        -}
        -.select2-container--default .select2-results__option[aria-selected=true] {
        -  background-color: #ddd;
        -}
        -.select2-container--default .select2-results__option[aria-selected=true],
        -.select2-container--default .select2-results__option[aria-selected=true]:hover {
        -  color: #444;
        -}
        -.select2-container--default .select2-selection--multiple {
        -  border: 1px solid #d2d6de;
        -  border-radius: 0;
        -}
        -.select2-container--default .select2-selection--multiple:focus {
        -  border-color: #3c8dbc;
        -}
        -.select2-container--default.select2-container--focus .select2-selection--multiple {
        -  border-color: #d2d6de;
        -}
        -.select2-container--default .select2-selection--multiple .select2-selection__choice {
        -  background-color: #3c8dbc;
        -  border-color: #367fa9;
        -  padding: 1px 10px;
        -  color: #fff;
        -}
        -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
        -  margin-right: 5px;
        -  color: rgba(255, 255, 255, 0.7);
        -}
        -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
        -  color: #fff;
        -}
        -.select2-container .select2-selection--single .select2-selection__rendered {
        -  padding-right: 10px;
        -}
        -/*
        - * General: Miscellaneous
        - * ----------------------
        - */
        -.pad {
        -  padding: 10px;
        -}
        -.margin {
        -  margin: 10px;
        -}
        -.margin-bottom {
        -  margin-bottom: 20px;
        -}
        -.margin-bottom-none {
        -  margin-bottom: 0;
        -}
        -.margin-r-5 {
        -  margin-right: 5px;
        -}
        -.inline {
        -  display: inline;
        -}
        -.description-block {
        -  display: block;
        -  margin: 10px 0;
        -  text-align: center;
        -}
        -.description-block.margin-bottom {
        -  margin-bottom: 25px;
        -}
        -.description-block > .description-header {
        -  margin: 0;
        -  padding: 0;
        -  font-weight: 600;
        -  font-size: 16px;
        -}
        -.description-block > .description-text {
        -  text-transform: uppercase;
        -}
        -.bg-red,
        -.bg-yellow,
        -.bg-aqua,
        -.bg-blue,
        -.bg-light-blue,
        -.bg-green,
        -.bg-navy,
        -.bg-teal,
        -.bg-olive,
        -.bg-lime,
        -.bg-orange,
        -.bg-fuchsia,
        -.bg-purple,
        -.bg-maroon,
        -.bg-black,
        -.bg-red-active,
        -.bg-yellow-active,
        -.bg-aqua-active,
        -.bg-blue-active,
        -.bg-light-blue-active,
        -.bg-green-active,
        -.bg-navy-active,
        -.bg-teal-active,
        -.bg-olive-active,
        -.bg-lime-active,
        -.bg-orange-active,
        -.bg-fuchsia-active,
        -.bg-purple-active,
        -.bg-maroon-active,
        -.bg-black-active,
        -.callout.callout-danger,
        -.callout.callout-warning,
        -.callout.callout-info,
        -.callout.callout-success,
        -.alert-success,
        -.alert-danger,
        -.alert-error,
        -.alert-warning,
        -.alert-info,
        -.label-danger,
        -.label-info,
        -.label-warning,
        -.label-primary,
        -.label-success,
        -.modal-primary .modal-body,
        -.modal-primary .modal-header,
        -.modal-primary .modal-footer,
        -.modal-warning .modal-body,
        -.modal-warning .modal-header,
        -.modal-warning .modal-footer,
        -.modal-info .modal-body,
        -.modal-info .modal-header,
        -.modal-info .modal-footer,
        -.modal-success .modal-body,
        -.modal-success .modal-header,
        -.modal-success .modal-footer,
        -.modal-danger .modal-body,
        -.modal-danger .modal-header,
        -.modal-danger .modal-footer {
        -  color: #fff !important;
        -}
        -.bg-gray {
        -  color: #000;
        -  background-color: #d2d6de !important;
        -}
        -.bg-gray-light {
        -  background-color: #f7f7f7;
        -}
        -.bg-black {
        -  background-color: #111111 !important;
        -}
        -.bg-red,
        -.callout.callout-danger,
        -.alert-danger,
        -.alert-error,
        -.label-danger,
        -.modal-danger .modal-body {
        -  background-color: #dd4b39 !important;
        -}
        -.bg-yellow,
        -.callout.callout-warning,
        -.alert-warning,
        -.label-warning,
        -.modal-warning .modal-body {
        -  background-color: #f39c12 !important;
        -}
        -.bg-aqua,
        -.callout.callout-info,
        -.alert-info,
        -.label-info,
        -.modal-info .modal-body {
        -  background-color: #00c0ef !important;
        -}
        -.bg-blue {
        -  background-color: #0073b7 !important;
        -}
        -.bg-light-blue,
        -.label-primary,
        -.modal-primary .modal-body {
        -  background-color: #3c8dbc !important;
        -}
        -.bg-green,
        -.callout.callout-success,
        -.alert-success,
        -.label-success,
        -.modal-success .modal-body {
        -  background-color: #00a65a !important;
        -}
        -.bg-navy {
        -  background-color: #001f3f !important;
        -}
        -.bg-teal {
        -  background-color: #39cccc !important;
        -}
        -.bg-olive {
        -  background-color: #3d9970 !important;
        -}
        -.bg-lime {
        -  background-color: #01ff70 !important;
        -}
        -.bg-orange {
        -  background-color: #ff851b !important;
        -}
        -.bg-fuchsia {
        -  background-color: #f012be !important;
        -}
        -.bg-purple {
        -  background-color: #605ca8 !important;
        -}
        -.bg-maroon {
        -  background-color: #d81b60 !important;
        -}
        -.bg-gray-active {
        -  color: #000;
        -  background-color: #b5bbc8 !important;
        -}
        -.bg-black-active {
        -  background-color: #000000 !important;
        -}
        -.bg-red-active,
        -.modal-danger .modal-header,
        -.modal-danger .modal-footer {
        -  background-color: #d33724 !important;
        -}
        -.bg-yellow-active,
        -.modal-warning .modal-header,
        -.modal-warning .modal-footer {
        -  background-color: #db8b0b !important;
        -}
        -.bg-aqua-active,
        -.modal-info .modal-header,
        -.modal-info .modal-footer {
        -  background-color: #00a7d0 !important;
        -}
        -.bg-blue-active {
        -  background-color: #005384 !important;
        -}
        -.bg-light-blue-active,
        -.modal-primary .modal-header,
        -.modal-primary .modal-footer {
        -  background-color: #357ca5 !important;
        -}
        -.bg-green-active,
        -.modal-success .modal-header,
        -.modal-success .modal-footer {
        -  background-color: #008d4c !important;
        -}
        -.bg-navy-active {
        -  background-color: #001a35 !important;
        -}
        -.bg-teal-active {
        -  background-color: #30bbbb !important;
        -}
        -.bg-olive-active {
        -  background-color: #368763 !important;
        -}
        -.bg-lime-active {
        -  background-color: #00e765 !important;
        -}
        -.bg-orange-active {
        -  background-color: #ff7701 !important;
        -}
        -.bg-fuchsia-active {
        -  background-color: #db0ead !important;
        -}
        -.bg-purple-active {
        -  background-color: #555299 !important;
        -}
        -.bg-maroon-active {
        -  background-color: #ca195a !important;
        -}
        -[class^="bg-"].disabled {
        -  opacity: 0.65;
        -  filter: alpha(opacity=65);
        -}
        -.text-red {
        -  color: #dd4b39 !important;
        -}
        -.text-yellow {
        -  color: #f39c12 !important;
        -}
        -.text-aqua {
        -  color: #00c0ef !important;
        -}
        -.text-blue {
        -  color: #0073b7 !important;
        -}
        -.text-black {
        -  color: #111111 !important;
        -}
        -.text-light-blue {
        -  color: #3c8dbc !important;
        -}
        -.text-green {
        -  color: #00a65a !important;
        -}
        -.text-gray {
        -  color: #d2d6de !important;
        -}
        -.text-navy {
        -  color: #001f3f !important;
        -}
        -.text-teal {
        -  color: #39cccc !important;
        -}
        -.text-olive {
        -  color: #3d9970 !important;
        -}
        -.text-lime {
        -  color: #01ff70 !important;
        -}
        -.text-orange {
        -  color: #ff851b !important;
        -}
        -.text-fuchsia {
        -  color: #f012be !important;
        -}
        -.text-purple {
        -  color: #605ca8 !important;
        -}
        -.text-maroon {
        -  color: #d81b60 !important;
        -}
        -.link-muted {
        -  color: #7a869d;
        -}
        -.link-muted:hover,
        -.link-muted:focus {
        -  color: #606c84;
        -}
        -.link-black {
        -  color: #666;
        -}
        -.link-black:hover,
        -.link-black:focus {
        -  color: #999;
        -}
        -.hide {
        -  display: none !important;
        -}
        -.no-border {
        -  border: 0 !important;
        -}
        -.no-padding {
        -  padding: 0 !important;
        -}
        -.no-margin {
        -  margin: 0 !important;
        -}
        -.no-shadow {
        -  box-shadow: none!important;
        -}
        -.list-unstyled,
        -.chart-legend,
        -.contacts-list,
        -.users-list,
        -.mailbox-attachments {
        -  list-style: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -.list-group-unbordered > .list-group-item {
        -  border-left: 0;
        -  border-right: 0;
        -  border-radius: 0;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.flat {
        -  border-radius: 0 !important;
        -}
        -.text-bold,
        -.text-bold.table td,
        -.text-bold.table th {
        -  font-weight: 700;
        -}
        -.text-sm {
        -  font-size: 12px;
        -}
        -.jqstooltip {
        -  padding: 5px!important;
        -  width: auto!important;
        -  height: auto!important;
        -}
        -.bg-teal-gradient {
        -  background: #39cccc !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;
        -  background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important;
        -  background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important;
        -  background: -o-linear-gradient(#7adddd, #39cccc) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-light-blue-gradient {
        -  background: #3c8dbc !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;
        -  background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;
        -  background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important;
        -  background: -o-linear-gradient(#67a8ce, #3c8dbc) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-blue-gradient {
        -  background: #0073b7 !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;
        -  background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important;
        -  background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important;
        -  background: -o-linear-gradient(#0089db, #0073b7) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-aqua-gradient {
        -  background: #00c0ef !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;
        -  background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;
        -  background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important;
        -  background: -o-linear-gradient(#14d1ff, #00c0ef) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-yellow-gradient {
        -  background: #f39c12 !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;
        -  background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;
        -  background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important;
        -  background: -o-linear-gradient(#f7bc60, #f39c12) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-purple-gradient {
        -  background: #605ca8 !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;
        -  background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important;
        -  background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important;
        -  background: -o-linear-gradient(#9491c4, #605ca8) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-green-gradient {
        -  background: #00a65a !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;
        -  background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;
        -  background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important;
        -  background: -o-linear-gradient(#00ca6d, #00a65a) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-red-gradient {
        -  background: #dd4b39 !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;
        -  background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important;
        -  background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important;
        -  background: -o-linear-gradient(#e47365, #dd4b39) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-black-gradient {
        -  background: #111111 !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important;
        -  background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important;
        -  background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important;
        -  background: -o-linear-gradient(#2b2b2b, #111111) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-maroon-gradient {
        -  background: #d81b60 !important;
        -  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;
        -  background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;
        -  background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important;
        -  background: -o-linear-gradient(#e73f7c, #d81b60) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;
        -  color: #fff;
        -}
        -.description-block .description-icon {
        -  font-size: 16px;
        -}
        -.no-pad-top {
        -  padding-top: 0;
        -}
        -.position-static {
        -  position: static!important;
        -}
        -.list-header {
        -  font-size: 15px;
        -  padding: 10px 4px;
        -  font-weight: bold;
        -  color: #666;
        -}
        -.list-seperator {
        -  height: 1px;
        -  background: #f4f4f4;
        -  margin: 15px 0 9px 0;
        -}
        -.list-link > a {
        -  padding: 4px;
        -  color: #777;
        -}
        -.list-link > a:hover {
        -  color: #222;
        -}
        -.font-light {
        -  font-weight: 300;
        -}
        -.user-block:before,
        -.user-block:after {
        -  content: " ";
        -  display: table;
        -}
        -.user-block:after {
        -  clear: both;
        -}
        -.user-block img {
        -  width: 40px;
        -  height: 40px;
        -  float: left;
        -}
        -.user-block .username,
        -.user-block .description,
        -.user-block .comment {
        -  display: block;
        -  margin-left: 50px;
        -}
        -.user-block .username {
        -  font-size: 16px;
        -  font-weight: 600;
        -}
        -.user-block .description {
        -  color: #999;
        -  font-size: 13px;
        -}
        -.user-block.user-block-sm .username,
        -.user-block.user-block-sm .description,
        -.user-block.user-block-sm .comment {
        -  margin-left: 40px;
        -}
        -.user-block.user-block-sm .username {
        -  font-size: 14px;
        -}
        -.img-sm,
        -.img-md,
        -.img-lg,
        -.box-comments .box-comment img,
        -.user-block.user-block-sm img {
        -  float: left;
        -}
        -.img-sm,
        -.box-comments .box-comment img,
        -.user-block.user-block-sm img {
        -  width: 30px!important;
        -  height: 30px!important;
        -}
        -.img-sm + .img-push {
        -  margin-left: 40px;
        -}
        -.img-md {
        -  width: 60px;
        -  height: 60px;
        -}
        -.img-md + .img-push {
        -  margin-left: 70px;
        -}
        -.img-lg {
        -  width: 100px;
        -  height: 100px;
        -}
        -.img-lg + .img-push {
        -  margin-left: 110px;
        -}
        -.img-bordered {
        -  border: 3px solid #d2d6de;
        -  padding: 3px;
        -}
        -.img-bordered-sm {
        -  border: 2px solid #d2d6de;
        -  padding: 2px;
        -}
        -.attachment-block {
        -  border: 1px solid #f4f4f4;
        -  padding: 5px;
        -  margin-bottom: 10px;
        -  background: #f7f7f7;
        -}
        -.attachment-block .attachment-img {
        -  max-width: 100px;
        -  max-height: 100px;
        -  height: auto;
        -  float: left;
        -}
        -.attachment-block .attachment-pushed {
        -  margin-left: 110px;
        -}
        -.attachment-block .attachment-heading {
        -  margin: 0;
        -}
        -.attachment-block .attachment-text {
        -  color: #555;
        -}
        -.connectedSortable {
        -  min-height: 100px;
        -}
        -.ui-helper-hidden-accessible {
        -  border: 0;
        -  clip: rect(0 0 0 0);
        -  height: 1px;
        -  margin: -1px;
        -  overflow: hidden;
        -  padding: 0;
        -  position: absolute;
        -  width: 1px;
        -}
        -.sort-highlight {
        -  background: #f4f4f4;
        -  border: 1px dashed #ddd;
        -  margin-bottom: 10px;
        -}
        -.full-opacity-hover {
        -  opacity: 0.65;
        -  filter: alpha(opacity=65);
        -}
        -.full-opacity-hover:hover {
        -  opacity: 1;
        -  filter: alpha(opacity=100);
        -}
        -.chart {
        -  position: relative;
        -  overflow: hidden;
        -  width: 100%;
        -}
        -.chart svg,
        -.chart canvas {
        -  width: 100%!important;
        -}
        -/*
        - * Misc: print
        - * -----------
        - */
        -@media print {
        -  .no-print,
        -  .main-sidebar,
        -  .left-side,
        -  .main-header,
        -  .content-header {
        -    display: none!important;
        -  }
        -  .content-wrapper,
        -  .right-side,
        -  .main-footer {
        -    margin-left: 0!important;
        -    min-height: 0!important;
        -    -webkit-transform: translate(0, 0) !important;
        -    -ms-transform: translate(0, 0) !important;
        -    -o-transform: translate(0, 0) !important;
        -    transform: translate(0, 0) !important;
        -  }
        -  .fixed .content-wrapper,
        -  .fixed .right-side {
        -    padding-top: 0!important;
        -  }
        -  .invoice {
        -    width: 100%;
        -    border: 0;
        -    margin: 0;
        -    padding: 0;
        -  }
        -  .invoice-col {
        -    float: left;
        -    width: 33.3333333%;
        -  }
        -  .table-responsive {
        -    overflow: auto;
        -  }
        -  .table-responsive > .table tr th,
        -  .table-responsive > .table tr td {
        -    white-space: normal!important;
        -  }
        -}
        diff --git a/public/assets/css/app.css b/public/assets/css/app.css
        deleted file mode 100644
        index 3578f68047..0000000000
        --- a/public/assets/css/app.css
        +++ /dev/null
        @@ -1,5674 +0,0 @@
        -/*!
        - *   AdminLTE v2.3.0
        - *   Author: Almsaeed Studio
        - *	 Website: Almsaeed Studio <http://almsaeedstudio.com>
        - *   License: Open source - MIT
        - *           Please visit http://opensource.org/licenses/MIT for more information
        -!*/
        -@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);
        -/*
        - * Core: General Layout Style
        - * -------------------------
        - */
        -html,
        -body {
        -  min-height: 100%;
        -}
        -.layout-boxed html,
        -.layout-boxed body {
        -  height: 100%;
        -}
        -body {
        -  -webkit-font-smoothing: antialiased;
        -  -moz-osx-font-smoothing: grayscale;
        -  font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
        -  font-weight: 400;
        -  overflow-x: hidden;
        -  overflow-y: auto;
        -}
        -/* Layout */
        -.wrapper {
        -  min-height: 100%;
        -  position: static;
        -  overflow: hidden;
        -}
        -.wrapper:before,
        -.wrapper:after {
        -  content: " ";
        -  display: table;
        -}
        -.wrapper:after {
        -  clear: both;
        -}
        -.layout-boxed .wrapper {
        -  max-width: 1250px;
        -  margin: 0 auto;
        -  min-height: 100%;
        -  box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);
        -  position: relative;
        -}
        -.layout-boxed {
        -  background: url('../img/boxed-bg.jpg') repeat fixed;
        -}
        -/*
        - * Content Wrapper - contains the main content
        - * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```
        - */
        -.content-wrapper,
        -.right-side,
        -.main-footer {
        -  transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out;
        -  transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out;
        -  margin-left: 230px;
        -  z-index: 820;
        -}
        -.layout-top-nav .content-wrapper,
        -.layout-top-nav .right-side,
        -.layout-top-nav .main-footer {
        -  margin-left: 0;
        -}
        -@media (max-width: 767px) {
        -  .content-wrapper,
        -  .right-side,
        -  .main-footer {
        -    margin-left: 0;
        -  }
        -}
        -@media (min-width: 768px) {
        -  .sidebar-collapse .content-wrapper,
        -  .sidebar-collapse .right-side,
        -  .sidebar-collapse .main-footer {
        -    margin-left: 0;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .sidebar-open .content-wrapper,
        -  .sidebar-open .right-side,
        -  .sidebar-open .main-footer {
        -    -webkit-transform: translate(230px, 0);
        -    transform: translate(230px, 0);
        -  }
        -}
        -.content-wrapper,
        -.right-side {
        -  min-height: 100%;
        -  background-color: #ecf0f5;
        -  z-index: 800;
        -}
        -.main-footer {
        -  background: #fff;
        -  padding: 15px;
        -  color: #444;
        -  border-top: 1px solid #d2d6de;
        -}
        -/* Fixed layout */
        -.fixed .main-header,
        -.fixed .main-sidebar,
        -.fixed .left-side {
        -  position: fixed;
        -}
        -.fixed .main-header {
        -  top: 0;
        -  right: 0;
        -  left: 0;
        -}
        -.fixed .content-wrapper,
        -.fixed .right-side {
        -  padding-top: 50px;
        -}
        -@media (max-width: 767px) {
        -  .fixed .content-wrapper,
        -  .fixed .right-side {
        -    padding-top: 100px;
        -  }
        -}
        -.fixed.layout-boxed .wrapper {
        -  max-width: 100%;
        -}
        -body.hold-transition .content-wrapper,
        -body.hold-transition .right-side,
        -body.hold-transition .main-footer,
        -body.hold-transition .main-sidebar,
        -body.hold-transition .left-side,
        -body.hold-transition .main-header > .navbar,
        -body.hold-transition .main-header .logo {
        -  /* Fix for IE */
        -  transition: none;
        -}
        -/* Content */
        -.content {
        -  min-height: 250px;
        -  padding: 15px;
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px;
        -}
        -/* H1 - H6 font */
        -h1,
        -h2,
        -h3,
        -h4,
        -h5,
        -h6,
        -.h1,
        -.h2,
        -.h3,
        -.h4,
        -.h5,
        -.h6 {
        -  font-family: 'Source Sans Pro', sans-serif;
        -}
        -/* General Links */
        -a {
        -  color: #3c8dbc;
        -}
        -a:hover,
        -a:active,
        -a:focus {
        -  outline: none;
        -  text-decoration: none;
        -  color: #72afd2;
        -}
        -/* Page Header */
        -.page-header {
        -  margin: 10px 0 20px 0;
        -  font-size: 22px;
        -}
        -.page-header > small {
        -  color: #666;
        -  display: block;
        -  margin-top: 5px;
        -}
        -/*
        - * Component: Main Header
        - * ----------------------
        - */
        -.main-header {
        -  position: relative;
        -  max-height: 100px;
        -  z-index: 1030;
        -}
        -.main-header > .navbar {
        -  transition: margin-left 0.3s ease-in-out;
        -  margin-bottom: 0;
        -  margin-left: 230px;
        -  border: none;
        -  min-height: 50px;
        -  border-radius: 0;
        -}
        -.layout-top-nav .main-header > .navbar {
        -  margin-left: 0;
        -}
        -.main-header #navbar-search-input.form-control {
        -  background: rgba(255, 255, 255, 0.2);
        -  border-color: transparent;
        -}
        -.main-header #navbar-search-input.form-control:focus,
        -.main-header #navbar-search-input.form-control:active {
        -  border-color: rgba(0, 0, 0, 0.1);
        -  background: rgba(255, 255, 255, 0.9);
        -}
        -.main-header #navbar-search-input.form-control::-moz-placeholder {
        -  color: #ccc;
        -  opacity: 1;
        -}
        -.main-header #navbar-search-input.form-control:-ms-input-placeholder {
        -  color: #ccc;
        -}
        -.main-header #navbar-search-input.form-control::-webkit-input-placeholder {
        -  color: #ccc;
        -}
        -.main-header .navbar-custom-menu,
        -.main-header .navbar-right {
        -  float: right;
        -}
        -@media (max-width: 991px) {
        -  .main-header .navbar-custom-menu a,
        -  .main-header .navbar-right a {
        -    color: inherit;
        -    background: transparent;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .main-header .navbar-right {
        -    float: none;
        -  }
        -  .navbar-collapse .main-header .navbar-right {
        -    margin: 7.5px -15px;
        -  }
        -  .main-header .navbar-right > li {
        -    color: inherit;
        -    border: 0;
        -  }
        -}
        -.main-header .sidebar-toggle {
        -  float: left;
        -  background-color: transparent;
        -  background-image: none;
        -  padding: 15px 15px;
        -  font-family: fontAwesome;
        -}
        -.main-header .sidebar-toggle:before {
        -  content: "\f0c9";
        -}
        -.main-header .sidebar-toggle:hover {
        -  color: #fff;
        -}
        -.main-header .sidebar-toggle:focus,
        -.main-header .sidebar-toggle:active {
        -  background: transparent;
        -}
        -.main-header .sidebar-toggle .icon-bar {
        -  display: none;
        -}
        -.main-header .navbar .nav > li.user > a > .fa,
        -.main-header .navbar .nav > li.user > a > .glyphicon,
        -.main-header .navbar .nav > li.user > a > .ion {
        -  margin-right: 5px;
        -}
        -.main-header .navbar .nav > li > a > .label {
        -  position: absolute;
        -  top: 9px;
        -  right: 7px;
        -  text-align: center;
        -  font-size: 9px;
        -  padding: 2px 3px;
        -  line-height: .9;
        -}
        -.main-header .logo {
        -  transition: width 0.3s ease-in-out;
        -  display: block;
        -  float: left;
        -  height: 50px;
        -  font-size: 20px;
        -  line-height: 50px;
        -  text-align: center;
        -  width: 230px;
        -  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        -  padding: 0 15px;
        -  font-weight: 300;
        -  overflow: hidden;
        -}
        -.main-header .logo .logo-lg {
        -  display: block;
        -}
        -.main-header .logo .logo-mini {
        -  display: none;
        -}
        -.main-header .navbar-brand {
        -  color: #fff;
        -}
        -.content-header {
        -  position: relative;
        -  padding: 15px 15px 0 15px;
        -}
        -.content-header > h1 {
        -  margin: 0;
        -  font-size: 24px;
        -}
        -.content-header > h1 > small {
        -  font-size: 15px;
        -  display: inline-block;
        -  padding-left: 4px;
        -  font-weight: 300;
        -}
        -.content-header > .breadcrumb {
        -  float: right;
        -  background: transparent;
        -  margin-top: 0;
        -  margin-bottom: 0;
        -  font-size: 12px;
        -  padding: 7px 5px;
        -  position: absolute;
        -  top: 15px;
        -  right: 10px;
        -  border-radius: 2px;
        -}
        -.content-header > .breadcrumb > li > a {
        -  color: #444;
        -  text-decoration: none;
        -  display: inline-block;
        -}
        -.content-header > .breadcrumb > li > a > .fa,
        -.content-header > .breadcrumb > li > a > .glyphicon,
        -.content-header > .breadcrumb > li > a > .ion {
        -  margin-right: 5px;
        -}
        -.content-header > .breadcrumb > li + li:before {
        -  content: '>\00a0';
        -}
        -@media (max-width: 991px) {
        -  .content-header > .breadcrumb {
        -    position: relative;
        -    margin-top: 5px;
        -    top: 0;
        -    right: 0;
        -    float: none;
        -    background: #d2d6de;
        -    padding-left: 10px;
        -  }
        -  .content-header > .breadcrumb li:before {
        -    color: #97a0b3;
        -  }
        -}
        -.navbar-toggle {
        -  color: #fff;
        -  border: 0;
        -  margin: 0;
        -  padding: 15px 15px;
        -}
        -@media (max-width: 991px) {
        -  .navbar-custom-menu .navbar-nav > li {
        -    float: left;
        -  }
        -  .navbar-custom-menu .navbar-nav {
        -    margin: 0;
        -    float: left;
        -  }
        -  .navbar-custom-menu .navbar-nav > li > a {
        -    padding-top: 15px;
        -    padding-bottom: 15px;
        -    line-height: 20px;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .main-header {
        -    position: relative;
        -  }
        -  .main-header .logo,
        -  .main-header .navbar {
        -    width: 100%;
        -    float: none;
        -  }
        -  .main-header .navbar {
        -    margin: 0;
        -  }
        -  .main-header .navbar-custom-menu {
        -    float: right;
        -  }
        -}
        -@media (max-width: 991px) {
        -  .navbar-collapse.pull-left {
        -    float: none!important;
        -  }
        -  .navbar-collapse.pull-left + .navbar-custom-menu {
        -    display: block;
        -    position: absolute;
        -    top: 0;
        -    right: 40px;
        -  }
        -}
        -@media (max-width: 991px) {
        -  .content-header {
        -    padding-top: 110px;
        -  }
        -}
        -@media (max-width: 991px) {
        -  ul.sidebar-menu {
        -    padding-top: 120px;
        -  }
        -}
        -@media (max-width: 991px) {
        -  .sidebar-toggle-mobile a {
        -    color: white;
        -  }
        -}
        -/*
        - * Component: Sidebar
        - * ------------------
        - */
        -.main-sidebar,
        -.left-side {
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  padding-top: 50px;
        -  min-height: 100%;
        -  width: 230px;
        -  z-index: 810;
        -  transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out;
        -  transition: transform 0.3s ease-in-out, width 0.3s ease-in-out;
        -}
        -@media (max-width: 767px) {
        -  .main-sidebar,
        -  .left-side {
        -    padding-top: 100px;
        -  }
        -}
        -@media (max-width: 767px) {
        -  .main-sidebar,
        -  .left-side {
        -    -webkit-transform: translate(-230px, 0);
        -    transform: translate(-230px, 0);
        -  }
        -}
        -@media (min-width: 768px) {
        -  .sidebar-collapse .main-sidebar,
        -  .sidebar-collapse .left-side {
        -    -webkit-transform: translate(-230px, 0);
        -    transform: translate(-230px, 0);
        -  }
        -}
        -@media (max-width: 767px) {
        -  .sidebar-open .main-sidebar,
        -  .sidebar-open .left-side {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -  }
        -}
        -.sidebar {
        -  padding-bottom: 10px;
        -}
        -.sidebar-form input:focus {
        -  border-color: transparent;
        -}
        -.user-panel {
        -  position: relative;
        -  width: 100%;
        -  padding: 10px;
        -  overflow: hidden;
        -}
        -.user-panel:before,
        -.user-panel:after {
        -  content: " ";
        -  display: table;
        -}
        -.user-panel:after {
        -  clear: both;
        -}
        -.user-panel > .image > img {
        -  width: 100%;
        -  max-width: 45px;
        -  height: auto;
        -}
        -.user-panel > .info {
        -  padding: 5px 5px 5px 15px;
        -  line-height: 1;
        -  position: absolute;
        -  left: 55px;
        -}
        -.user-panel > .info > p {
        -  font-weight: 600;
        -  margin-bottom: 9px;
        -}
        -.user-panel > .info > a {
        -  text-decoration: none;
        -  padding-right: 5px;
        -  margin-top: 3px;
        -  font-size: 11px;
        -}
        -.user-panel > .info > a > .fa,
        -.user-panel > .info > a > .ion,
        -.user-panel > .info > a > .glyphicon {
        -  margin-right: 3px;
        -}
        -.sidebar-menu {
        -  list-style: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -.sidebar-menu > li {
        -  position: relative;
        -  margin: 0;
        -  padding: 0;
        -}
        -.sidebar-menu > li > a {
        -  padding: 12px 5px 12px 15px;
        -  display: block;
        -}
        -.sidebar-menu > li > a > .fa,
        -.sidebar-menu > li > a > .glyphicon,
        -.sidebar-menu > li > a > .ion {
        -  width: 20px;
        -}
        -.sidebar-menu > li .label,
        -.sidebar-menu > li .badge {
        -  margin-top: 3px;
        -  margin-right: 5px;
        -}
        -.sidebar-menu li.header {
        -  padding: 10px 25px 10px 15px;
        -  font-size: 12px;
        -}
        -.sidebar-menu li > a > .fa-angle-left {
        -  width: auto;
        -  height: auto;
        -  padding: 0;
        -  margin-right: 10px;
        -  margin-top: 3px;
        -}
        -.sidebar-menu li.active > a > .fa-angle-left {
        -  -webkit-transform: rotate(-90deg);
        -  transform: rotate(-90deg);
        -}
        -.sidebar-menu li.active > .treeview-menu {
        -  display: block;
        -}
        -.sidebar-menu .treeview-menu {
        -  display: none;
        -  list-style: none;
        -  padding: 0;
        -  margin: 0;
        -  padding-left: 5px;
        -}
        -.sidebar-menu .treeview-menu .treeview-menu {
        -  padding-left: 20px;
        -}
        -.sidebar-menu .treeview-menu > li {
        -  margin: 0;
        -}
        -.sidebar-menu .treeview-menu > li > a {
        -  padding: 5px 5px 5px 15px;
        -  display: block;
        -  font-size: 14px;
        -}
        -.sidebar-menu .treeview-menu > li > a > .fa,
        -.sidebar-menu .treeview-menu > li > a > .glyphicon,
        -.sidebar-menu .treeview-menu > li > a > .ion {
        -  width: 20px;
        -}
        -.sidebar-menu .treeview-menu > li > a > .fa-angle-left,
        -.sidebar-menu .treeview-menu > li > a > .fa-angle-down {
        -  width: auto;
        -}
        -/*
        - * Component: Sidebar Mini
        - */
        -@media (min-width: 768px) {
        -  .sidebar-mini.sidebar-collapse .content-wrapper,
        -  .sidebar-mini.sidebar-collapse .right-side,
        -  .sidebar-mini.sidebar-collapse .main-footer {
        -    margin-left: 50px!important;
        -    z-index: 840;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-sidebar {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -    width: 50px!important;
        -    z-index: 850;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li {
        -    position: relative;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a {
        -    margin-right: 0;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span {
        -    border-top-right-radius: 4px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span {
        -    border-bottom-right-radius: 4px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
        -    padding-top: 5px;
        -    padding-bottom: 5px;
        -    border-bottom-right-radius: 4px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right),
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
        -    display: block!important;
        -    position: absolute;
        -    width: 180px;
        -    left: 50px;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span {
        -    top: 0;
        -    margin-left: -3px;
        -    padding: 12px 5px 12px 20px;
        -    background-color: inherit;
        -  }
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
        -    top: 44px;
        -    margin-left: 0;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info,
        -  .sidebar-mini.sidebar-collapse .sidebar-form,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right,
        -  .sidebar-mini.sidebar-collapse .sidebar-menu li.header {
        -    display: none!important;
        -    -webkit-transform: translateZ(0);
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .logo {
        -    width: 50px;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini {
        -    display: block;
        -    margin-left: -15px;
        -    margin-right: -15px;
        -    font-size: 18px;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg {
        -    display: none;
        -  }
        -  .sidebar-mini.sidebar-collapse .main-header .navbar {
        -    margin-left: 50px;
        -  }
        -}
        -.sidebar-menu,
        -.main-sidebar .user-panel,
        -.sidebar-menu > li.header {
        -  white-space: nowrap;
        -  overflow: hidden;
        -}
        -.sidebar-menu:hover {
        -  overflow: visible;
        -}
        -.sidebar-form,
        -.sidebar-menu > li.header {
        -  overflow: hidden;
        -  text-overflow: clip;
        -}
        -.sidebar-menu li > a {
        -  position: relative;
        -}
        -.sidebar-menu li > a > .pull-right {
        -  position: absolute;
        -  top: 50%;
        -  right: 10px;
        -  margin-top: -7px;
        -}
        -/*
        - * Component: Control sidebar. By default, this is the right sidebar.
        - */
        -.control-sidebar-bg {
        -  position: fixed;
        -  z-index: 1000;
        -  bottom: 0;
        -}
        -.control-sidebar-bg,
        -.control-sidebar {
        -  top: 0;
        -  right: -230px;
        -  width: 230px;
        -  transition: right 0.3s ease-in-out;
        -}
        -.control-sidebar {
        -  position: absolute;
        -  padding-top: 50px;
        -  z-index: 1010;
        -}
        -@media (max-width: 768px) {
        -  .control-sidebar {
        -    padding-top: 100px;
        -  }
        -}
        -.control-sidebar > .tab-content {
        -  padding: 10px 15px;
        -}
        -.control-sidebar.control-sidebar-open,
        -.control-sidebar.control-sidebar-open + .control-sidebar-bg {
        -  right: 0;
        -}
        -.control-sidebar-open .control-sidebar-bg,
        -.control-sidebar-open .control-sidebar {
        -  right: 0;
        -}
        -@media (min-width: 768px) {
        -  .control-sidebar-open .content-wrapper,
        -  .control-sidebar-open .right-side,
        -  .control-sidebar-open .main-footer {
        -    margin-right: 230px;
        -  }
        -}
        -.nav-tabs.control-sidebar-tabs > li:first-of-type > a,
        -.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover,
        -.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus {
        -  border-left-width: 0;
        -}
        -.nav-tabs.control-sidebar-tabs > li > a {
        -  border-radius: 0;
        -}
        -.nav-tabs.control-sidebar-tabs > li > a,
        -.nav-tabs.control-sidebar-tabs > li > a:hover {
        -  border-top: none;
        -  border-right: none;
        -  border-left: 1px solid transparent;
        -  border-bottom: 1px solid transparent;
        -}
        -.nav-tabs.control-sidebar-tabs > li > a .icon {
        -  font-size: 16px;
        -}
        -.nav-tabs.control-sidebar-tabs > li.active > a,
        -.nav-tabs.control-sidebar-tabs > li.active > a:hover,
        -.nav-tabs.control-sidebar-tabs > li.active > a:focus,
        -.nav-tabs.control-sidebar-tabs > li.active > a:active {
        -  border-top: none;
        -  border-right: none;
        -  border-bottom: none;
        -}
        -@media (max-width: 768px) {
        -  .nav-tabs.control-sidebar-tabs {
        -    display: table;
        -  }
        -  .nav-tabs.control-sidebar-tabs > li {
        -    display: table-cell;
        -  }
        -}
        -.control-sidebar-heading {
        -  font-weight: 400;
        -  font-size: 16px;
        -  padding: 10px 0;
        -  margin-bottom: 10px;
        -}
        -.control-sidebar-subheading {
        -  display: block;
        -  font-weight: 400;
        -  font-size: 14px;
        -}
        -.control-sidebar-menu {
        -  list-style: none;
        -  padding: 0;
        -  margin: 0 -15px;
        -}
        -.control-sidebar-menu > li > a {
        -  display: block;
        -  padding: 10px 15px;
        -}
        -.control-sidebar-menu > li > a:before,
        -.control-sidebar-menu > li > a:after {
        -  content: " ";
        -  display: table;
        -}
        -.control-sidebar-menu > li > a:after {
        -  clear: both;
        -}
        -.control-sidebar-menu > li > a > .control-sidebar-subheading {
        -  margin-top: 0;
        -}
        -.control-sidebar-menu .menu-icon {
        -  float: left;
        -  width: 35px;
        -  height: 35px;
        -  border-radius: 50%;
        -  text-align: center;
        -  line-height: 35px;
        -}
        -.control-sidebar-menu .menu-info {
        -  margin-left: 45px;
        -  margin-top: 3px;
        -}
        -.control-sidebar-menu .menu-info > .control-sidebar-subheading {
        -  margin: 0;
        -}
        -.control-sidebar-menu .menu-info > p {
        -  margin: 0;
        -  font-size: 11px;
        -}
        -.control-sidebar-menu .progress {
        -  margin: 0;
        -}
        -.control-sidebar-dark {
        -  color: #b8c7ce;
        -}
        -.control-sidebar-dark,
        -.control-sidebar-dark + .control-sidebar-bg {
        -  background: #222d32;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs {
        -  border-bottom: #1c2529;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a {
        -  background: #181f23;
        -  color: #b8c7ce;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus {
        -  border-left-color: #141a1d;
        -  border-bottom-color: #141a1d;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active {
        -  background: #1c2529;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover {
        -  color: #fff;
        -}
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus,
        -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active {
        -  background: #222d32;
        -  color: #fff;
        -}
        -.control-sidebar-dark .control-sidebar-heading,
        -.control-sidebar-dark .control-sidebar-subheading {
        -  color: #fff;
        -}
        -.control-sidebar-dark .control-sidebar-menu > li > a:hover {
        -  background: #1e282c;
        -}
        -.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p {
        -  color: #b8c7ce;
        -}
        -.control-sidebar-light {
        -  color: #5e5e5e;
        -}
        -.control-sidebar-light,
        -.control-sidebar-light + .control-sidebar-bg {
        -  background: #f9fafc;
        -  border-left: 1px solid #d2d6de;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs {
        -  border-bottom: #d2d6de;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a {
        -  background: #e8ecf4;
        -  color: #444;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus {
        -  border-left-color: #d2d6de;
        -  border-bottom-color: #d2d6de;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active {
        -  background: #eff1f7;
        -}
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus,
        -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active {
        -  background: #f9fafc;
        -  color: #111;
        -}
        -.control-sidebar-light .control-sidebar-heading,
        -.control-sidebar-light .control-sidebar-subheading {
        -  color: #111;
        -}
        -.control-sidebar-light .control-sidebar-menu {
        -  margin-left: -14px;
        -}
        -.control-sidebar-light .control-sidebar-menu > li > a:hover {
        -  background: #f4f4f5;
        -}
        -.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p {
        -  color: #5e5e5e;
        -}
        -/*
        - * Component: Dropdown menus
        - * -------------------------
        - */
        -/*Dropdowns in general*/
        -.dropdown-menu {
        -  box-shadow: none;
        -  border-color: #eee;
        -}
        -.dropdown-menu > li > a {
        -  color: #777;
        -}
        -.dropdown-menu > li > a > .glyphicon,
        -.dropdown-menu > li > a > .fa,
        -.dropdown-menu > li > a > .ion {
        -  margin-right: 10px;
        -}
        -.dropdown-menu > li > a:hover {
        -  background-color: #e1e3e9;
        -  color: #333;
        -}
        -.dropdown-menu > .divider {
        -  background-color: #eee;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu,
        -.navbar-nav > .messages-menu > .dropdown-menu,
        -.navbar-nav > .tasks-menu > .dropdown-menu {
        -  width: 280px;
        -  padding: 0 0 0 0;
        -  margin: 0;
        -  top: 100%;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li,
        -.navbar-nav > .messages-menu > .dropdown-menu > li,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li {
        -  position: relative;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li.header,
        -.navbar-nav > .messages-menu > .dropdown-menu > li.header,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li.header {
        -  border-top-left-radius: 4px;
        -  border-top-right-radius: 4px;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0;
        -  background-color: #ffffff;
        -  padding: 7px 10px;
        -  border-bottom: 1px solid #f4f4f4;
        -  color: #444444;
        -  font-size: 14px;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
        -.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 4px;
        -  border-bottom-left-radius: 4px;
        -  font-size: 12px;
        -  background-color: #fff;
        -  padding: 7px 10px;
        -  border-bottom: 1px solid #eeeeee;
        -  color: #444!important;
        -  text-align: center;
        -}
        -@media (max-width: 991px) {
        -  .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
        -  .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
        -  .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
        -    background: #fff!important;
        -    color: #444!important;
        -  }
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover,
        -.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover {
        -  text-decoration: none;
        -  font-weight: normal;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu {
        -  max-height: 200px;
        -  margin: 0;
        -  padding: 0;
        -  list-style: none;
        -  overflow-x: hidden;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
        -  display: block;
        -  white-space: nowrap;
        -  /* Prevent text from breaking */
        -  border-bottom: 1px solid #f4f4f4;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover,
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover {
        -  background: #f4f4f4;
        -  text-decoration: none;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a {
        -  color: #444444;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -  white-space: nowrap;
        -  padding: 10px;
        -}
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon,
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa,
        -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion {
        -  width: 20px;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a {
        -  margin: 0;
        -  padding: 10px 10px;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img {
        -  margin: auto 10px auto auto;
        -  width: 40px;
        -  height: 40px;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 {
        -  padding: 0;
        -  margin: 0 0 0 45px;
        -  color: #444444;
        -  font-size: 15px;
        -  position: relative;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small {
        -  color: #999999;
        -  font-size: 10px;
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p {
        -  margin: 0 0 0 45px;
        -  font-size: 12px;
        -  color: #888888;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before,
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
        -  content: " ";
        -  display: table;
        -}
        -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
        -  clear: both;
        -}
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
        -  padding: 10px;
        -}
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 {
        -  font-size: 14px;
        -  padding: 0;
        -  margin: 0 0 10px 0;
        -  color: #666666;
        -}
        -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress {
        -  padding: 0;
        -  margin: 0;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0;
        -  padding: 1px 0 0 0;
        -  border-top-width: 0;
        -  width: 280px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu,
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body {
        -  border-bottom-right-radius: 4px;
        -  border-bottom-left-radius: 4px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header {
        -  height: 175px;
        -  padding: 10px;
        -  text-align: center;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img {
        -  z-index: 5;
        -  height: 90px;
        -  width: 90px;
        -  border: 3px solid;
        -  border-color: transparent;
        -  border-color: rgba(255, 255, 255, 0.2);
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p {
        -  z-index: 5;
        -  color: #fff;
        -  color: rgba(255, 255, 255, 0.8);
        -  font-size: 17px;
        -  margin-top: 10px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small {
        -  display: block;
        -  font-size: 12px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body {
        -  padding: 15px;
        -  border-bottom: 1px solid #f4f4f4;
        -  border-top: 1px solid #dddddd;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body:before,
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
        -  content: " ";
        -  display: table;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
        -  clear: both;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-body a {
        -  color: #444 !important;
        -}
        -@media (max-width: 991px) {
        -  .navbar-nav > .user-menu > .dropdown-menu > .user-body a {
        -    background: #fff !important;
        -    color: #444 !important;
        -  }
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer {
        -  background-color: #f9f9f9;
        -  padding: 10px;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before,
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
        -  content: " ";
        -  display: table;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
        -  clear: both;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default {
        -  color: #666666;
        -}
        -@media (max-width: 991px) {
        -  .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover {
        -    background-color: #f9f9f9;
        -  }
        -}
        -.navbar-nav > .user-menu .user-image {
        -  float: left;
        -  width: 25px;
        -  height: 25px;
        -  border-radius: 50%;
        -  margin-right: 10px;
        -  margin-top: -2px;
        -}
        -@media (max-width: 767px) {
        -  .navbar-nav > .user-menu .user-image {
        -    float: none;
        -    margin-right: 0;
        -    margin-top: -8px;
        -    line-height: 10px;
        -  }
        -}
        -/* Add fade animation to dropdown menus by appending
        - the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/
        -.open:not(.dropup) > .animated-dropdown-menu {
        -  -webkit-backface-visibility: visible !important;
        -  backface-visibility: visible !important;
        -  -webkit-animation: flipInX 0.7s both;
        -  animation: flipInX 0.7s both;
        -}
        -@keyframes flipInX {
        -  0% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
        -    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
        -    transition-timing-function: ease-in;
        -    opacity: 0;
        -  }
        -  40% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
        -    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
        -    transition-timing-function: ease-in;
        -  }
        -  60% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
        -    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
        -    opacity: 1;
        -  }
        -  80% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
        -    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
        -  }
        -  100% {
        -    -webkit-transform: perspective(400px);
        -    transform: perspective(400px);
        -  }
        -}
        -@-webkit-keyframes flipInX {
        -  0% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
        -    -webkit-transition-timing-function: ease-in;
        -    opacity: 0;
        -  }
        -  40% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
        -    -webkit-transition-timing-function: ease-in;
        -  }
        -  60% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
        -    opacity: 1;
        -  }
        -  80% {
        -    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
        -  }
        -  100% {
        -    -webkit-transform: perspective(400px);
        -  }
        -}
        -/* Fix dropdown menu in navbars */
        -.navbar-custom-menu > .navbar-nav > li {
        -  position: relative;
        -}
        -.navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
        -  position: absolute;
        -  right: 0;
        -  left: auto;
        -}
        -@media (max-width: 991px) {
        -  .navbar-custom-menu > .navbar-nav {
        -    float: right;
        -  }
        -  .navbar-custom-menu > .navbar-nav > li {
        -    position: static;
        -  }
        -  .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
        -    position: absolute;
        -    right: 5%;
        -    left: auto;
        -    border: 1px solid #ddd;
        -    background: #fff;
        -  }
        -}
        -/*
        - * Component: Form
        - * ---------------
        - */
        -.form-control {
        -  border-radius: 0;
        -  box-shadow: none;
        -  border-color: #d2d6de;
        -}
        -.form-control:focus {
        -  border-color: #3c8dbc;
        -  box-shadow: none;
        -}
        -.form-control::-moz-placeholder,
        -.form-control:-ms-input-placeholder,
        -.form-control::-webkit-input-placeholder {
        -  color: #bbb;
        -  opacity: 1;
        -}
        -.form-control:not(select) {
        -  -webkit-appearance: none;
        -  -moz-appearance: none;
        -  appearance: none;
        -}
        -.form-group.has-success label {
        -  color: #00a65a;
        -}
        -.form-group.has-success .form-control {
        -  border-color: #00a65a;
        -  box-shadow: none;
        -}
        -.form-group.has-warning label {
        -  color: #f39c12;
        -}
        -.form-group.has-warning .form-control {
        -  border-color: #f39c12;
        -  box-shadow: none;
        -}
        -.form-group.has-error label {
        -  color: #dd4b39;
        -}
        -.form-group.has-error .form-control {
        -  border-color: #dd4b39;
        -  box-shadow: none;
        -}
        -/* Input group */
        -.input-group .input-group-addon {
        -  border-radius: 0;
        -  border-color: #d2d6de;
        -  background-color: #fff;
        -}
        -/* button groups */
        -.btn-group-vertical .btn.btn-flat:first-of-type,
        -.btn-group-vertical .btn.btn-flat:last-of-type {
        -  border-radius: 0;
        -}
        -.icheck > label {
        -  padding-left: 0;
        -}
        -/* support Font Awesome icons in form-control */
        -.form-control-feedback.fa {
        -  line-height: 34px;
        -}
        -.input-lg + .form-control-feedback.fa,
        -.input-group-lg + .form-control-feedback.fa,
        -.form-group-lg .form-control + .form-control-feedback.fa {
        -  line-height: 46px;
        -}
        -.input-sm + .form-control-feedback.fa,
        -.input-group-sm + .form-control-feedback.fa,
        -.form-group-sm .form-control + .form-control-feedback.fa {
        -  line-height: 30px;
        -}
        -/*
        - * Component: Progress Bar
        - * -----------------------
        - */
        -.progress,
        -.progress > .progress-bar {
        -  box-shadow: none;
        -}
        -.progress,
        -.progress > .progress-bar,
        -.progress .progress-bar,
        -.progress > .progress-bar .progress-bar {
        -  border-radius: 1px;
        -}
        -/* size variation */
        -.progress.sm,
        -.progress-sm {
        -  height: 10px;
        -}
        -.progress.sm,
        -.progress-sm,
        -.progress.sm .progress-bar,
        -.progress-sm .progress-bar {
        -  border-radius: 1px;
        -}
        -.progress.xs,
        -.progress-xs {
        -  height: 7px;
        -}
        -.progress.xs,
        -.progress-xs,
        -.progress.xs .progress-bar,
        -.progress-xs .progress-bar {
        -  border-radius: 1px;
        -}
        -.progress.xxs,
        -.progress-xxs {
        -  height: 3px;
        -}
        -.progress.xxs,
        -.progress-xxs,
        -.progress.xxs .progress-bar,
        -.progress-xxs .progress-bar {
        -  border-radius: 1px;
        -}
        -/* Vertical bars */
        -.progress.vertical {
        -  position: relative;
        -  width: 30px;
        -  height: 200px;
        -  display: inline-block;
        -  margin-right: 10px;
        -}
        -.progress.vertical > .progress-bar {
        -  width: 100%;
        -  position: absolute;
        -  bottom: 0;
        -}
        -.progress.vertical.sm,
        -.progress.vertical.progress-sm {
        -  width: 20px;
        -}
        -.progress.vertical.xs,
        -.progress.vertical.progress-xs {
        -  width: 10px;
        -}
        -.progress.vertical.xxs,
        -.progress.vertical.progress-xxs {
        -  width: 3px;
        -}
        -.progress-group .progress-text {
        -  font-weight: 600;
        -}
        -.progress-group .progress-number {
        -  float: right;
        -}
        -/* Remove margins from progress bars when put in a table */
        -.table tr > td .progress {
        -  margin: 0;
        -}
        -.progress-bar-light-blue,
        -.progress-bar-primary {
        -  background-color: #3c8dbc;
        -}
        -.progress-striped .progress-bar-light-blue,
        -.progress-striped .progress-bar-primary {
        -  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-green,
        -.progress-bar-success {
        -  background-color: #00a65a;
        -}
        -.progress-striped .progress-bar-green,
        -.progress-striped .progress-bar-success {
        -  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-aqua,
        -.progress-bar-info {
        -  background-color: #00c0ef;
        -}
        -.progress-striped .progress-bar-aqua,
        -.progress-striped .progress-bar-info {
        -  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-yellow,
        -.progress-bar-warning {
        -  background-color: #f39c12;
        -}
        -.progress-striped .progress-bar-yellow,
        -.progress-striped .progress-bar-warning {
        -  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-red,
        -.progress-bar-danger {
        -  background-color: #dd4b39;
        -}
        -.progress-striped .progress-bar-red,
        -.progress-striped .progress-bar-danger {
        -  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);
        -}
        -/*
        - * Component: Small Box
        - * --------------------
        - */
        -.small-box {
        -  border-radius: 2px;
        -  position: relative;
        -  display: block;
        -  margin-bottom: 20px;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -}
        -.small-box > .inner {
        -  padding: 10px;
        -}
        -.small-box > .small-box-footer {
        -  position: relative;
        -  text-align: center;
        -  padding: 3px 0;
        -  color: #fff;
        -  color: rgba(255, 255, 255, 0.8);
        -  display: block;
        -  z-index: 10;
        -  background: rgba(0, 0, 0, 0.1);
        -  text-decoration: none;
        -}
        -.small-box > .small-box-footer:hover {
        -  color: #fff;
        -  background: rgba(0, 0, 0, 0.15);
        -}
        -.small-box h3 {
        -  font-size: 38px;
        -  font-weight: bold;
        -  margin: 0 0 10px 0;
        -  white-space: nowrap;
        -  padding: 0;
        -}
        -.small-box p {
        -  font-size: 15px;
        -}
        -.small-box p > small {
        -  display: block;
        -  color: #f9f9f9;
        -  font-size: 13px;
        -  margin-top: 5px;
        -}
        -.small-box h3,
        -.small-box p {
        -  z-index: 5px;
        -}
        -.small-box .icon {
        -  transition: all 0.3s linear;
        -  position: absolute;
        -  top: -10px;
        -  right: 10px;
        -  z-index: 0;
        -  font-size: 90px;
        -  color: rgba(0, 0, 0, 0.15);
        -}
        -.small-box:hover {
        -  text-decoration: none;
        -  color: #f9f9f9;
        -}
        -.small-box:hover .icon {
        -  font-size: 95px;
        -}
        -@media (max-width: 767px) {
        -  .small-box {
        -    text-align: center;
        -  }
        -  .small-box .icon {
        -    display: none;
        -  }
        -  .small-box p {
        -    font-size: 12px;
        -  }
        -}
        -/*
        - * Component: Box
        - * --------------
        - */
        -.box {
        -  position: relative;
        -  border-radius: 3px;
        -  background: #ffffff;
        -  border-top: 3px solid #d2d6de;
        -  margin-bottom: 20px;
        -  width: 100%;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -}
        -.box.box-primary {
        -  border-top-color: #3c8dbc;
        -}
        -.box.box-info {
        -  border-top-color: #00c0ef;
        -}
        -.box.box-danger {
        -  border-top-color: #dd4b39;
        -}
        -.box.box-warning {
        -  border-top-color: #f39c12;
        -}
        -.box.box-success {
        -  border-top-color: #00a65a;
        -}
        -.box.box-default {
        -  border-top-color: #d2d6de;
        -}
        -.box.collapsed-box .box-body,
        -.box.collapsed-box .box-footer {
        -  display: none;
        -}
        -.box .nav-stacked > li {
        -  border-bottom: 1px solid #f4f4f4;
        -  margin: 0;
        -}
        -.box .nav-stacked > li:last-of-type {
        -  border-bottom: none;
        -}
        -.box.height-control .box-body {
        -  max-height: 300px;
        -  overflow: auto;
        -}
        -.box .border-right {
        -  border-right: 1px solid #f4f4f4;
        -}
        -.box .border-left {
        -  border-left: 1px solid #f4f4f4;
        -}
        -.box.box-solid {
        -  border-top: 0;
        -}
        -.box.box-solid > .box-header .btn.btn-default {
        -  background: transparent;
        -}
        -.box.box-solid > .box-header .btn:hover,
        -.box.box-solid > .box-header a:hover {
        -  background: rgba(0, 0, 0, 0.1);
        -}
        -.box.box-solid.box-default {
        -  border: 1px solid #d2d6de;
        -}
        -.box.box-solid.box-default > .box-header {
        -  color: #444;
        -  background: #d2d6de;
        -  background-color: #d2d6de;
        -}
        -.box.box-solid.box-default > .box-header a,
        -.box.box-solid.box-default > .box-header .btn {
        -  color: #444;
        -}
        -.box.box-solid.box-primary {
        -  border: 1px solid #3c8dbc;
        -}
        -.box.box-solid.box-primary > .box-header {
        -  color: #fff;
        -  background: #3c8dbc;
        -  background-color: #3c8dbc;
        -}
        -.box.box-solid.box-primary > .box-header a,
        -.box.box-solid.box-primary > .box-header .btn {
        -  color: #fff;
        -}
        -.box.box-solid.box-info {
        -  border: 1px solid #00c0ef;
        -}
        -.box.box-solid.box-info > .box-header {
        -  color: #fff;
        -  background: #00c0ef;
        -  background-color: #00c0ef;
        -}
        -.box.box-solid.box-info > .box-header a,
        -.box.box-solid.box-info > .box-header .btn {
        -  color: #fff;
        -}
        -.box.box-solid.box-danger {
        -  border: 1px solid #dd4b39;
        -}
        -.box.box-solid.box-danger > .box-header {
        -  color: #fff;
        -  background: #dd4b39;
        -  background-color: #dd4b39;
        -}
        -.box.box-solid.box-danger > .box-header a,
        -.box.box-solid.box-danger > .box-header .btn {
        -  color: #fff;
        -}
        -.box.box-solid.box-warning {
        -  border: 1px solid #f39c12;
        -}
        -.box.box-solid.box-warning > .box-header {
        -  color: #fff;
        -  background: #f39c12;
        -  background-color: #f39c12;
        -}
        -.box.box-solid.box-warning > .box-header a,
        -.box.box-solid.box-warning > .box-header .btn {
        -  color: #fff;
        -}
        -.box.box-solid.box-success {
        -  border: 1px solid #00a65a;
        -}
        -.box.box-solid.box-success > .box-header {
        -  color: #fff;
        -  background: #00a65a;
        -  background-color: #00a65a;
        -}
        -.box.box-solid.box-success > .box-header a,
        -.box.box-solid.box-success > .box-header .btn {
        -  color: #fff;
        -}
        -.box.box-solid > .box-header > .box-tools .btn {
        -  border: 0;
        -  box-shadow: none;
        -}
        -.box.box-solid[class*='bg'] > .box-header {
        -  color: #fff;
        -}
        -.box .box-group > .box {
        -  margin-bottom: 5px;
        -}
        -.box .knob-label {
        -  text-align: center;
        -  color: #333;
        -  font-weight: 100;
        -  font-size: 12px;
        -  margin-bottom: 0.3em;
        -}
        -.box > .overlay,
        -.overlay-wrapper > .overlay,
        -.box > .loading-img,
        -.overlay-wrapper > .loading-img {
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  width: 100%;
        -  height: 100%;
        -}
        -.box .overlay,
        -.overlay-wrapper .overlay {
        -  z-index: 50;
        -  background: rgba(255, 255, 255, 0.7);
        -  border-radius: 3px;
        -}
        -.box .overlay > .fa,
        -.overlay-wrapper .overlay > .fa {
        -  position: absolute;
        -  top: 50%;
        -  left: 50%;
        -  margin-left: -15px;
        -  margin-top: -15px;
        -  color: #000;
        -  font-size: 30px;
        -}
        -.box .overlay.dark,
        -.overlay-wrapper .overlay.dark {
        -  background: rgba(0, 0, 0, 0.5);
        -}
        -.box-header:before,
        -.box-body:before,
        -.box-footer:before,
        -.box-header:after,
        -.box-body:after,
        -.box-footer:after {
        -  content: " ";
        -  display: table;
        -}
        -.box-header:after,
        -.box-body:after,
        -.box-footer:after {
        -  clear: both;
        -}
        -.box-header {
        -  color: #444;
        -  display: block;
        -  padding: 10px;
        -  position: relative;
        -}
        -.box-header.with-border {
        -  border-bottom: 1px solid #f4f4f4;
        -}
        -.collapsed-box .box-header.with-border {
        -  border-bottom: none;
        -}
        -.box-header > .fa,
        -.box-header > .glyphicon,
        -.box-header > .ion,
        -.box-header .box-title {
        -  display: inline-block;
        -  font-size: 18px;
        -  margin: 0;
        -  line-height: 1;
        -}
        -.box-header > .fa,
        -.box-header > .glyphicon,
        -.box-header > .ion {
        -  margin-right: 5px;
        -}
        -.box-header > .box-tools {
        -  position: absolute;
        -  right: 10px;
        -  top: 5px;
        -}
        -.box-header > .box-tools [data-toggle="tooltip"] {
        -  position: relative;
        -}
        -.box-header > .box-tools.pull-right .dropdown-menu {
        -  right: 0;
        -  left: auto;
        -}
        -.btn-box-tool {
        -  padding: 5px;
        -  font-size: 12px;
        -  background: transparent;
        -  color: #97a0b3;
        -}
        -.open .btn-box-tool,
        -.btn-box-tool:hover {
        -  color: #606c84;
        -}
        -.btn-box-tool.btn:active {
        -  box-shadow: none;
        -}
        -.box-body {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px;
        -  padding: 10px;
        -}
        -.no-header .box-body {
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px;
        -}
        -.box-body > .table {
        -  margin-bottom: 0;
        -}
        -.box-body .fc {
        -  margin-top: 5px;
        -}
        -.box-body .full-width-chart {
        -  margin: -19px;
        -}
        -.box-body.no-padding .full-width-chart {
        -  margin: -9px;
        -}
        -.box-body .box-pane {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 3px;
        -}
        -.box-body .box-pane-right {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 0;
        -}
        -.box-footer {
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px;
        -  border-top: 1px solid #f4f4f4;
        -  padding: 10px;
        -  background-color: #fff;
        -}
        -.chart-legend {
        -  margin: 10px 0;
        -}
        -@media (max-width: 991px) {
        -  .chart-legend > li {
        -    float: left;
        -    margin-right: 10px;
        -  }
        -}
        -.box-comments {
        -  background: #f7f7f7;
        -}
        -.box-comments .box-comment {
        -  padding: 8px 0;
        -  border-bottom: 1px solid #eee;
        -}
        -.box-comments .box-comment:before,
        -.box-comments .box-comment:after {
        -  content: " ";
        -  display: table;
        -}
        -.box-comments .box-comment:after {
        -  clear: both;
        -}
        -.box-comments .box-comment:last-of-type {
        -  border-bottom: 0;
        -}
        -.box-comments .box-comment:first-of-type {
        -  padding-top: 0;
        -}
        -.box-comments .box-comment img {
        -  float: left;
        -}
        -.box-comments .comment-text {
        -  margin-left: 40px;
        -  color: #555;
        -}
        -.box-comments .username {
        -  color: #444;
        -  display: block;
        -  font-weight: 600;
        -}
        -.box-comments .text-muted {
        -  font-weight: 400;
        -  font-size: 12px;
        -}
        -/* Widget: TODO LIST */
        -.todo-list {
        -  margin: 0;
        -  padding: 0;
        -  list-style: none;
        -  overflow: auto;
        -}
        -.todo-list > li {
        -  border-radius: 2px;
        -  padding: 10px;
        -  background: #f4f4f4;
        -  margin-bottom: 2px;
        -  border-left: 2px solid #e6e7e8;
        -  color: #444;
        -}
        -.todo-list > li:last-of-type {
        -  margin-bottom: 0;
        -}
        -.todo-list > li > input[type='checkbox'] {
        -  margin: 0 10px 0 5px;
        -}
        -.todo-list > li .text {
        -  display: inline-block;
        -  margin-left: 5px;
        -  font-weight: 600;
        -}
        -.todo-list > li .label {
        -  margin-left: 10px;
        -  font-size: 9px;
        -}
        -.todo-list > li .tools {
        -  display: none;
        -  float: right;
        -  color: #dd4b39;
        -}
        -.todo-list > li .tools > .fa,
        -.todo-list > li .tools > .glyphicon,
        -.todo-list > li .tools > .ion {
        -  margin-right: 5px;
        -  cursor: pointer;
        -}
        -.todo-list > li:hover .tools {
        -  display: inline-block;
        -}
        -.todo-list > li.done {
        -  color: #999;
        -}
        -.todo-list > li.done .text {
        -  text-decoration: line-through;
        -  font-weight: 500;
        -}
        -.todo-list > li.done .label {
        -  background: #d2d6de !important;
        -}
        -.todo-list .danger {
        -  border-left-color: #dd4b39;
        -}
        -.todo-list .warning {
        -  border-left-color: #f39c12;
        -}
        -.todo-list .info {
        -  border-left-color: #00c0ef;
        -}
        -.todo-list .success {
        -  border-left-color: #00a65a;
        -}
        -.todo-list .primary {
        -  border-left-color: #3c8dbc;
        -}
        -.todo-list .handle {
        -  display: inline-block;
        -  cursor: move;
        -  margin: 0 5px;
        -}
        -/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/
        -.chat {
        -  padding: 5px 20px 5px 10px;
        -}
        -.chat .item {
        -  margin-bottom: 10px;
        -}
        -.chat .item:before,
        -.chat .item:after {
        -  content: " ";
        -  display: table;
        -}
        -.chat .item:after {
        -  clear: both;
        -}
        -.chat .item > img {
        -  width: 40px;
        -  height: 40px;
        -  border: 2px solid transparent;
        -  border-radius: 50%;
        -}
        -.chat .item > .online {
        -  border: 2px solid #00a65a;
        -}
        -.chat .item > .offline {
        -  border: 2px solid #dd4b39;
        -}
        -.chat .item > .message {
        -  margin-left: 55px;
        -  margin-top: -40px;
        -}
        -.chat .item > .message > .name {
        -  display: block;
        -  font-weight: 600;
        -}
        -.chat .item > .attachment {
        -  border-radius: 3px;
        -  background: #f4f4f4;
        -  margin-left: 65px;
        -  margin-right: 15px;
        -  padding: 10px;
        -}
        -.chat .item > .attachment > h4 {
        -  margin: 0 0 5px 0;
        -  font-weight: 600;
        -  font-size: 14px;
        -}
        -.chat .item > .attachment > p,
        -.chat .item > .attachment > .filename {
        -  font-weight: 600;
        -  font-size: 13px;
        -  font-style: italic;
        -  margin: 0;
        -}
        -.chat .item > .attachment:before,
        -.chat .item > .attachment:after {
        -  content: " ";
        -  display: table;
        -}
        -.chat .item > .attachment:after {
        -  clear: both;
        -}
        -.box-input {
        -  max-width: 200px;
        -}
        -.modal .panel-body {
        -  color: #444;
        -}
        -/*
        - * Component: Info Box
        - * -------------------
        - */
        -.info-box {
        -  display: block;
        -  min-height: 90px;
        -  background: #fff;
        -  width: 100%;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  border-radius: 2px;
        -  margin-bottom: 15px;
        -}
        -.info-box small {
        -  font-size: 14px;
        -}
        -.info-box .progress {
        -  background: rgba(0, 0, 0, 0.2);
        -  margin: 5px -10px 5px -10px;
        -  height: 2px;
        -}
        -.info-box .progress,
        -.info-box .progress .progress-bar {
        -  border-radius: 0;
        -}
        -.info-box .progress .progress-bar {
        -  background: #fff;
        -}
        -.info-box-icon {
        -  border-top-left-radius: 2px;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 2px;
        -  display: block;
        -  float: left;
        -  height: 90px;
        -  width: 90px;
        -  text-align: center;
        -  font-size: 45px;
        -  line-height: 90px;
        -  background: rgba(0, 0, 0, 0.2);
        -}
        -.info-box-icon > img {
        -  max-width: 100%;
        -}
        -.info-box-content {
        -  padding: 5px 10px;
        -  margin-left: 90px;
        -}
        -.info-box-number {
        -  display: block;
        -  font-weight: bold;
        -  font-size: 18px;
        -}
        -.progress-description,
        -.info-box-text {
        -  display: block;
        -  font-size: 14px;
        -  white-space: nowrap;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -}
        -.info-box-text {
        -  text-transform: uppercase;
        -}
        -.info-box-more {
        -  display: block;
        -}
        -.progress-description {
        -  margin: 0;
        -}
        -/*
        - * Component: Button
        - * -----------------
        - */
        -.btn {
        -  border-radius: 3px;
        -  box-shadow: none;
        -  border: 1px solid transparent;
        -}
        -.btn.uppercase {
        -  text-transform: uppercase;
        -}
        -.btn.btn-flat {
        -  border-radius: 0;
        -  box-shadow: none;
        -  border-width: 1px;
        -}
        -.btn:active {
        -  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
        -}
        -.btn:focus {
        -  outline: none;
        -}
        -.btn.btn-file {
        -  position: relative;
        -  overflow: hidden;
        -}
        -.btn.btn-file > input[type='file'] {
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -  min-width: 100%;
        -  min-height: 100%;
        -  font-size: 100px;
        -  text-align: right;
        -  opacity: 0;
        -  filter: alpha(opacity=0);
        -  outline: none;
        -  background: white;
        -  cursor: inherit;
        -  display: block;
        -}
        -.btn-default {
        -  background-color: #f4f4f4;
        -  color: #444;
        -  border-color: #ddd;
        -}
        -.btn-default:hover,
        -.btn-default:active,
        -.btn-default.hover {
        -  background-color: #e7e7e7;
        -}
        -.btn-primary {
        -  background-color: #3c8dbc;
        -  border-color: #367fa9;
        -}
        -.btn-primary:hover,
        -.btn-primary:active,
        -.btn-primary.hover {
        -  background-color: #367fa9;
        -}
        -.btn-success {
        -  background-color: #00a65a;
        -  border-color: #008d4c;
        -}
        -.btn-success:hover,
        -.btn-success:active,
        -.btn-success.hover {
        -  background-color: #008d4c;
        -}
        -.btn-info {
        -  background-color: #00c0ef;
        -  border-color: #00acd6;
        -}
        -.btn-info:hover,
        -.btn-info:active,
        -.btn-info.hover {
        -  background-color: #00acd6;
        -}
        -.btn-danger {
        -  background-color: #dd4b39;
        -  border-color: #d73925;
        -}
        -.btn-danger:hover,
        -.btn-danger:active,
        -.btn-danger.hover {
        -  background-color: #d73925;
        -}
        -.btn-warning {
        -  background-color: #f39c12;
        -  border-color: #e08e0b;
        -}
        -.btn-warning:hover,
        -.btn-warning:active,
        -.btn-warning.hover {
        -  background-color: #e08e0b;
        -}
        -.btn-outline {
        -  border: 1px solid #fff;
        -  background: transparent;
        -  color: #fff;
        -}
        -.btn-outline:hover,
        -.btn-outline:focus,
        -.btn-outline:active {
        -  color: rgba(255, 255, 255, 0.7);
        -  border-color: rgba(255, 255, 255, 0.7);
        -}
        -.btn-link {
        -  box-shadow: none;
        -}
        -.btn[class*='bg-']:hover {
        -  box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);
        -}
        -.btn-app {
        -  border-radius: 3px;
        -  position: relative;
        -  padding: 15px 5px;
        -  margin: 0 0 10px 10px;
        -  min-width: 80px;
        -  height: 60px;
        -  text-align: center;
        -  color: #666;
        -  border: 1px solid #ddd;
        -  background-color: #f4f4f4;
        -  font-size: 12px;
        -}
        -.btn-app > .fa,
        -.btn-app > .glyphicon,
        -.btn-app > .ion {
        -  font-size: 20px;
        -  display: block;
        -}
        -.btn-app:hover {
        -  background: #f4f4f4;
        -  color: #444;
        -  border-color: #aaa;
        -}
        -.btn-app:active,
        -.btn-app:focus {
        -  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
        -}
        -.btn-app > .badge {
        -  position: absolute;
        -  top: -3px;
        -  right: -10px;
        -  font-size: 10px;
        -  font-weight: 400;
        -}
        -/*
        - * Component: Callout
        - * ------------------
        - */
        -.callout {
        -  border-radius: 3px;
        -  margin: 0 0 20px 0;
        -  padding: 15px 30px 15px 15px;
        -  border-left: 5px solid #eee;
        -}
        -.callout a {
        -  color: #fff;
        -  text-decoration: underline;
        -}
        -.callout a:hover {
        -  color: #eee;
        -}
        -.callout h4 {
        -  margin-top: 0;
        -  font-weight: 600;
        -}
        -.callout p:last-child {
        -  margin-bottom: 0;
        -}
        -.callout code,
        -.callout .highlight {
        -  background-color: #fff;
        -}
        -.callout.callout-danger {
        -  border-color: #c23321;
        -}
        -.callout.callout-warning {
        -  border-color: #c87f0a;
        -}
        -.callout.callout-info {
        -  border-color: #0097bc;
        -}
        -.callout.callout-success {
        -  border-color: #00733e;
        -}
        -/*
        - * Component: alert
        - * ----------------
        - */
        -.alert {
        -  border-radius: 3px;
        -}
        -.alert h4 {
        -  font-weight: 600;
        -}
        -.alert .icon {
        -  margin-right: 10px;
        -}
        -.alert .close {
        -  color: #000;
        -  opacity: 0.2;
        -  filter: alpha(opacity=20);
        -}
        -.alert .close:hover {
        -  opacity: 0.5;
        -  filter: alpha(opacity=50);
        -}
        -.alert a {
        -  color: #fff;
        -  text-decoration: underline;
        -}
        -.alert-success {
        -  border-color: #008d4c;
        -}
        -.alert-danger,
        -.alert-error {
        -  border-color: #d73925;
        -}
        -.alert-warning {
        -  border-color: #e08e0b;
        -}
        -.alert-info {
        -  border-color: #00acd6;
        -}
        -/*
        - * Component: Nav
        - * --------------
        - */
        -.nav > li > a:hover,
        -.nav > li > a:active,
        -.nav > li > a:focus {
        -  color: #444;
        -  background: #f7f7f7;
        -}
        -/* NAV PILLS */
        -.nav-pills > li > a {
        -  border-radius: 0;
        -  border-top: 3px solid transparent;
        -  color: #444;
        -}
        -.nav-pills > li > a > .fa,
        -.nav-pills > li > a > .glyphicon,
        -.nav-pills > li > a > .ion {
        -  margin-right: 5px;
        -}
        -.nav-pills > li.active > a,
        -.nav-pills > li.active > a:hover,
        -.nav-pills > li.active > a:focus {
        -  border-top-color: #3c8dbc;
        -}
        -.nav-pills > li.active > a {
        -  font-weight: 600;
        -}
        -/* NAV STACKED */
        -.nav-stacked > li > a {
        -  border-radius: 0;
        -  border-top: 0;
        -  border-left: 3px solid transparent;
        -  color: #444;
        -}
        -.nav-stacked > li.active > a,
        -.nav-stacked > li.active > a:hover {
        -  background: transparent;
        -  color: #444;
        -  border-top: 0;
        -  border-left-color: #3c8dbc;
        -}
        -.nav-stacked > li.header {
        -  border-bottom: 1px solid #ddd;
        -  color: #777;
        -  margin-bottom: 10px;
        -  padding: 5px 10px;
        -  text-transform: uppercase;
        -}
        -/* NAV TABS */
        -.nav-tabs-custom {
        -  margin-bottom: 20px;
        -  background: #fff;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  border-radius: 3px;
        -}
        -.nav-tabs-custom > .nav-tabs {
        -  margin: 0;
        -  border-bottom-color: #f4f4f4;
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px;
        -}
        -.nav-tabs-custom > .nav-tabs > li {
        -  border-top: 3px solid transparent;
        -  margin-bottom: -2px;
        -  margin-right: 5px;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a {
        -  color: #444;
        -  border-radius: 0;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a.text-muted {
        -  color: #999;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a,
        -.nav-tabs-custom > .nav-tabs > li > a:hover {
        -  background: transparent;
        -  margin: 0;
        -}
        -.nav-tabs-custom > .nav-tabs > li > a:hover {
        -  color: #999;
        -}
        -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover,
        -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus,
        -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active {
        -  border-color: transparent;
        -}
        -.nav-tabs-custom > .nav-tabs > li.active {
        -  border-top-color: #3c8dbc;
        -}
        -.nav-tabs-custom > .nav-tabs > li.active > a,
        -.nav-tabs-custom > .nav-tabs > li.active:hover > a {
        -  background-color: #fff;
        -  color: #444;
        -}
        -.nav-tabs-custom > .nav-tabs > li.active > a {
        -  border-top-color: transparent;
        -  border-left-color: #f4f4f4;
        -  border-right-color: #f4f4f4;
        -}
        -.nav-tabs-custom > .nav-tabs > li:first-of-type {
        -  margin-left: 0;
        -}
        -.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a {
        -  border-left-color: transparent;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right {
        -  float: none!important;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li {
        -  float: right;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type {
        -  margin-right: 0;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a {
        -  border-left-width: 1px;
        -}
        -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a {
        -  border-left-color: #f4f4f4;
        -  border-right-color: transparent;
        -}
        -.nav-tabs-custom > .nav-tabs > li.header {
        -  line-height: 35px;
        -  padding: 0 10px;
        -  font-size: 20px;
        -  color: #444;
        -}
        -.nav-tabs-custom > .nav-tabs > li.header > .fa,
        -.nav-tabs-custom > .nav-tabs > li.header > .glyphicon,
        -.nav-tabs-custom > .nav-tabs > li.header > .ion {
        -  margin-right: 5px;
        -}
        -.nav-tabs-custom > .tab-content {
        -  background: #fff;
        -  padding: 10px;
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px;
        -}
        -.nav-tabs-custom .dropdown.open > a:active,
        -.nav-tabs-custom .dropdown.open > a:focus {
        -  background: transparent;
        -  color: #999;
        -}
        -/* PAGINATION */
        -.pagination > li > a {
        -  background: #fafafa;
        -  color: #666;
        -}
        -.pagination.pagination-flat > li > a {
        -  border-radius: 0 !important;
        -}
        -/*
        - * Component: Table
        - * ----------------
        - */
        -.table > thead > tr > th,
        -.table > tbody > tr > th,
        -.table > tfoot > tr > th,
        -.table > thead > tr > td,
        -.table > tbody > tr > td,
        -.table > tfoot > tr > td {
        -  border-top: 1px solid #f4f4f4;
        -}
        -.table > thead > tr > th {
        -  border-bottom: 2px solid #f4f4f4;
        -}
        -.table tr td .progress {
        -  margin-top: 5px;
        -}
        -.table-bordered {
        -  border: 1px solid #f4f4f4;
        -}
        -.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 #f4f4f4;
        -}
        -.table-bordered > thead > tr > th,
        -.table-bordered > thead > tr > td {
        -  border-bottom-width: 2px;
        -}
        -.table.no-border,
        -.table.no-border td,
        -.table.no-border th {
        -  border: 0;
        -}
        -/* .text-center in tables */
        -table.text-center,
        -table.text-center td,
        -table.text-center th {
        -  text-align: center;
        -}
        -.table.align th {
        -  text-align: left;
        -}
        -.table.align td {
        -  text-align: right;
        -}
        -/*
        - * Component: Label
        - * ----------------
        - */
        -.label-default {
        -  background-color: #d2d6de;
        -  color: #444;
        -}
        -/*
        - * Component: Direct Chat
        - * ----------------------
        - */
        -.direct-chat .box-body {
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0;
        -  position: relative;
        -  overflow-x: hidden;
        -  padding: 0;
        -}
        -.direct-chat.chat-pane-open .direct-chat-contacts {
        -  -webkit-transform: translate(0, 0);
        -  transform: translate(0, 0);
        -}
        -.direct-chat-messages {
        -  -webkit-transform: translate(0, 0);
        -  transform: translate(0, 0);
        -  padding: 10px;
        -  height: 250px;
        -  overflow: auto;
        -}
        -.direct-chat-msg,
        -.direct-chat-text {
        -  display: block;
        -}
        -.direct-chat-msg {
        -  margin-bottom: 10px;
        -}
        -.direct-chat-msg:before,
        -.direct-chat-msg:after {
        -  content: " ";
        -  display: table;
        -}
        -.direct-chat-msg:after {
        -  clear: both;
        -}
        -.direct-chat-messages,
        -.direct-chat-contacts {
        -  transition: -webkit-transform 0.5s ease-in-out;
        -  transition: transform 0.5s ease-in-out;
        -}
        -.direct-chat-text {
        -  border-radius: 5px;
        -  position: relative;
        -  padding: 5px 10px;
        -  background: #d2d6de;
        -  border: 1px solid #d2d6de;
        -  margin: 5px 0 0 50px;
        -  color: #444;
        -}
        -.direct-chat-text:after,
        -.direct-chat-text:before {
        -  position: absolute;
        -  right: 100%;
        -  top: 15px;
        -  border: solid transparent;
        -  border-right-color: #d2d6de;
        -  content: ' ';
        -  height: 0;
        -  width: 0;
        -  pointer-events: none;
        -}
        -.direct-chat-text:after {
        -  border-width: 5px;
        -  margin-top: -5px;
        -}
        -.direct-chat-text:before {
        -  border-width: 6px;
        -  margin-top: -6px;
        -}
        -.right .direct-chat-text {
        -  margin-right: 50px;
        -  margin-left: 0;
        -}
        -.right .direct-chat-text:after,
        -.right .direct-chat-text:before {
        -  right: auto;
        -  left: 100%;
        -  border-right-color: transparent;
        -  border-left-color: #d2d6de;
        -}
        -.direct-chat-img {
        -  border-radius: 50%;
        -  float: left;
        -  width: 40px;
        -  height: 40px;
        -}
        -.right .direct-chat-img {
        -  float: right;
        -}
        -.direct-chat-info {
        -  display: block;
        -  margin-bottom: 2px;
        -  font-size: 12px;
        -}
        -.direct-chat-name {
        -  font-weight: 600;
        -}
        -.direct-chat-timestamp {
        -  color: #999;
        -}
        -.direct-chat-contacts-open .direct-chat-contacts {
        -  -webkit-transform: translate(0, 0);
        -  transform: translate(0, 0);
        -}
        -.direct-chat-contacts {
        -  -webkit-transform: translate(101%, 0);
        -  transform: translate(101%, 0);
        -  position: absolute;
        -  top: 0;
        -  bottom: 0;
        -  height: 250px;
        -  width: 100%;
        -  background: #222d32;
        -  color: #fff;
        -  overflow: auto;
        -}
        -.contacts-list > li {
        -  border-bottom: 1px solid rgba(0, 0, 0, 0.2);
        -  padding: 10px;
        -  margin: 0;
        -}
        -.contacts-list > li:before,
        -.contacts-list > li:after {
        -  content: " ";
        -  display: table;
        -}
        -.contacts-list > li:after {
        -  clear: both;
        -}
        -.contacts-list > li:last-of-type {
        -  border-bottom: none;
        -}
        -.contacts-list-img {
        -  border-radius: 50%;
        -  width: 40px;
        -  float: left;
        -}
        -.contacts-list-info {
        -  margin-left: 45px;
        -  color: #fff;
        -}
        -.contacts-list-name,
        -.contacts-list-status {
        -  display: block;
        -}
        -.contacts-list-name {
        -  font-weight: 600;
        -}
        -.contacts-list-status {
        -  font-size: 12px;
        -}
        -.contacts-list-date {
        -  color: #aaa;
        -  font-weight: normal;
        -}
        -.contacts-list-msg {
        -  color: #999;
        -}
        -.direct-chat-danger .right > .direct-chat-text {
        -  background: #dd4b39;
        -  border-color: #dd4b39;
        -  color: #fff;
        -}
        -.direct-chat-danger .right > .direct-chat-text:after,
        -.direct-chat-danger .right > .direct-chat-text:before {
        -  border-left-color: #dd4b39;
        -}
        -.direct-chat-primary .right > .direct-chat-text {
        -  background: #3c8dbc;
        -  border-color: #3c8dbc;
        -  color: #fff;
        -}
        -.direct-chat-primary .right > .direct-chat-text:after,
        -.direct-chat-primary .right > .direct-chat-text:before {
        -  border-left-color: #3c8dbc;
        -}
        -.direct-chat-warning .right > .direct-chat-text {
        -  background: #f39c12;
        -  border-color: #f39c12;
        -  color: #fff;
        -}
        -.direct-chat-warning .right > .direct-chat-text:after,
        -.direct-chat-warning .right > .direct-chat-text:before {
        -  border-left-color: #f39c12;
        -}
        -.direct-chat-info .right > .direct-chat-text {
        -  background: #00c0ef;
        -  border-color: #00c0ef;
        -  color: #fff;
        -}
        -.direct-chat-info .right > .direct-chat-text:after,
        -.direct-chat-info .right > .direct-chat-text:before {
        -  border-left-color: #00c0ef;
        -}
        -.direct-chat-success .right > .direct-chat-text {
        -  background: #00a65a;
        -  border-color: #00a65a;
        -  color: #fff;
        -}
        -.direct-chat-success .right > .direct-chat-text:after,
        -.direct-chat-success .right > .direct-chat-text:before {
        -  border-left-color: #00a65a;
        -}
        -/*
        - * Component: Users List
        - * ---------------------
        - */
        -.users-list > li {
        -  width: 25%;
        -  float: left;
        -  padding: 10px;
        -  text-align: center;
        -}
        -.users-list > li img {
        -  border-radius: 50%;
        -  max-width: 100%;
        -  height: auto;
        -}
        -.users-list > li > a:hover,
        -.users-list > li > a:hover .users-list-name {
        -  color: #999;
        -}
        -.users-list-name,
        -.users-list-date {
        -  display: block;
        -}
        -.users-list-name {
        -  font-weight: 600;
        -  color: #444;
        -  overflow: hidden;
        -  white-space: nowrap;
        -  text-overflow: ellipsis;
        -}
        -.users-list-date {
        -  color: #999;
        -  font-size: 12px;
        -}
        -/*
        - * Component: modal
        - * ----------------
        - */
        -.modal {
        -  background: rgba(0, 0, 0, 0.3);
        -}
        -.modal-content {
        -  border-radius: 0;
        -  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
        -  border: 0;
        -}
        -@media (min-width: 768px) {
        -  .modal-content {
        -    box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
        -  }
        -}
        -.modal-header {
        -  border-bottom-color: #f4f4f4;
        -}
        -.modal-footer {
        -  border-top-color: #f4f4f4;
        -}
        -.modal-primary .modal-header,
        -.modal-primary .modal-footer {
        -  border-color: #307095;
        -}
        -.modal-warning .modal-header,
        -.modal-warning .modal-footer {
        -  border-color: #c87f0a;
        -}
        -.modal-info .modal-header,
        -.modal-info .modal-footer {
        -  border-color: #0097bc;
        -}
        -.modal-success .modal-header,
        -.modal-success .modal-footer {
        -  border-color: #00733e;
        -}
        -.modal-danger .modal-header,
        -.modal-danger .modal-footer {
        -  border-color: #c23321;
        -}
        -/*
        - * Page: Login & Register
        - * ----------------------
        - */
        -.login-logo,
        -.register-logo {
        -  font-size: 35px;
        -  text-align: center;
        -  margin-bottom: 25px;
        -  font-weight: 300;
        -}
        -.login-logo a,
        -.register-logo a {
        -  color: #444;
        -}
        -.login-page,
        -.register-page {
        -  background: #d2d6de;
        -}
        -.login-box,
        -.register-box {
        -  width: 360px;
        -  margin: 7% auto;
        -}
        -@media (max-width: 768px) {
        -  .login-box,
        -  .register-box {
        -    width: 90%;
        -    margin-top: 20px;
        -  }
        -}
        -.login-box-body,
        -.register-box-body {
        -  background: #fff;
        -  padding: 20px;
        -  border-top: 0;
        -  color: #666;
        -}
        -.login-box-body .form-control-feedback,
        -.register-box-body .form-control-feedback {
        -  color: #777;
        -}
        -.login-box-msg,
        -.register-box-msg {
        -  margin: 0;
        -  text-align: center;
        -  padding: 0 20px 20px 20px;
        -}
        -.social-auth-links {
        -  margin: 10px 0;
        -}
        -/*
        - * Page: 400 and 500 error pages
        - * ------------------------------
        - */
        -.error-page {
        -  width: 600px;
        -  margin: 20px auto 0 auto;
        -}
        -@media (max-width: 991px) {
        -  .error-page {
        -    width: 100%;
        -  }
        -}
        -.error-page > .headline {
        -  float: left;
        -  font-size: 100px;
        -  font-weight: 300;
        -}
        -@media (max-width: 991px) {
        -  .error-page > .headline {
        -    float: none;
        -    text-align: center;
        -  }
        -}
        -.error-page > .error-content {
        -  margin-left: 190px;
        -  display: block;
        -}
        -@media (max-width: 991px) {
        -  .error-page > .error-content {
        -    margin-left: 0;
        -  }
        -}
        -.error-page > .error-content > h3 {
        -  font-weight: 300;
        -  font-size: 25px;
        -}
        -@media (max-width: 991px) {
        -  .error-page > .error-content > h3 {
        -    text-align: center;
        -  }
        -}
        -/*
        - * Social Buttons for Bootstrap
        - *
        - * Copyright 2013-2015 Panayiotis Lipiridis
        - * Licensed under the MIT License
        - *
        - * https://github.com/lipis/bootstrap-social
        - */
        -.btn-social {
        -  position: relative;
        -  padding-left: 44px;
        -  text-align: left;
        -  white-space: nowrap;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -}
        -.btn-social > :first-child {
        -  position: absolute;
        -  left: 0;
        -  top: 0;
        -  bottom: 0;
        -  width: 32px;
        -  line-height: 34px;
        -  font-size: 1.6em;
        -  text-align: center;
        -  border-right: 1px solid rgba(0, 0, 0, 0.2);
        -}
        -.btn-social.btn-lg {
        -  padding-left: 61px;
        -}
        -.btn-social.btn-lg > :first-child {
        -  line-height: 45px;
        -  width: 45px;
        -  font-size: 1.8em;
        -}
        -.btn-social.btn-sm {
        -  padding-left: 38px;
        -}
        -.btn-social.btn-sm > :first-child {
        -  line-height: 28px;
        -  width: 28px;
        -  font-size: 1.4em;
        -}
        -.btn-social.btn-xs {
        -  padding-left: 30px;
        -}
        -.btn-social.btn-xs > :first-child {
        -  line-height: 20px;
        -  width: 20px;
        -  font-size: 1.2em;
        -}
        -.btn-social-icon {
        -  position: relative;
        -  padding-left: 44px;
        -  text-align: left;
        -  white-space: nowrap;
        -  overflow: hidden;
        -  text-overflow: ellipsis;
        -  height: 34px;
        -  width: 34px;
        -  padding: 0;
        -}
        -.btn-social-icon > :first-child {
        -  position: absolute;
        -  left: 0;
        -  top: 0;
        -  bottom: 0;
        -  width: 32px;
        -  line-height: 34px;
        -  font-size: 1.6em;
        -  text-align: center;
        -  border-right: 1px solid rgba(0, 0, 0, 0.2);
        -}
        -.btn-social-icon.btn-lg {
        -  padding-left: 61px;
        -}
        -.btn-social-icon.btn-lg > :first-child {
        -  line-height: 45px;
        -  width: 45px;
        -  font-size: 1.8em;
        -}
        -.btn-social-icon.btn-sm {
        -  padding-left: 38px;
        -}
        -.btn-social-icon.btn-sm > :first-child {
        -  line-height: 28px;
        -  width: 28px;
        -  font-size: 1.4em;
        -}
        -.btn-social-icon.btn-xs {
        -  padding-left: 30px;
        -}
        -.btn-social-icon.btn-xs > :first-child {
        -  line-height: 20px;
        -  width: 20px;
        -  font-size: 1.2em;
        -}
        -.btn-social-icon > :first-child {
        -  border: none;
        -  text-align: center;
        -  width: 100%;
        -}
        -.btn-social-icon.btn-lg {
        -  height: 45px;
        -  width: 45px;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.btn-social-icon.btn-sm {
        -  height: 30px;
        -  width: 30px;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.btn-social-icon.btn-xs {
        -  height: 22px;
        -  width: 22px;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.btn-adn {
        -  color: #fff;
        -  background-color: #d87a68;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-adn:hover,
        -.btn-adn:focus,
        -.btn-adn.focus,
        -.btn-adn:active,
        -.btn-adn.active,
        -.open > .dropdown-toggle.btn-adn {
        -  color: #fff;
        -  background-color: #ce563f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-adn:active,
        -.btn-adn.active,
        -.open > .dropdown-toggle.btn-adn {
        -  background-image: none;
        -}
        -.btn-adn.disabled,
        -.btn-adn[disabled],
        -fieldset[disabled] .btn-adn,
        -.btn-adn.disabled:hover,
        -.btn-adn[disabled]:hover,
        -fieldset[disabled] .btn-adn:hover,
        -.btn-adn.disabled:focus,
        -.btn-adn[disabled]:focus,
        -fieldset[disabled] .btn-adn:focus,
        -.btn-adn.disabled.focus,
        -.btn-adn[disabled].focus,
        -fieldset[disabled] .btn-adn.focus,
        -.btn-adn.disabled:active,
        -.btn-adn[disabled]:active,
        -fieldset[disabled] .btn-adn:active,
        -.btn-adn.disabled.active,
        -.btn-adn[disabled].active,
        -fieldset[disabled] .btn-adn.active {
        -  background-color: #d87a68;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-adn .badge {
        -  color: #d87a68;
        -  background-color: #fff;
        -}
        -.btn-bitbucket {
        -  color: #fff;
        -  background-color: #205081;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-bitbucket:hover,
        -.btn-bitbucket:focus,
        -.btn-bitbucket.focus,
        -.btn-bitbucket:active,
        -.btn-bitbucket.active,
        -.open > .dropdown-toggle.btn-bitbucket {
        -  color: #fff;
        -  background-color: #163758;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-bitbucket:active,
        -.btn-bitbucket.active,
        -.open > .dropdown-toggle.btn-bitbucket {
        -  background-image: none;
        -}
        -.btn-bitbucket.disabled,
        -.btn-bitbucket[disabled],
        -fieldset[disabled] .btn-bitbucket,
        -.btn-bitbucket.disabled:hover,
        -.btn-bitbucket[disabled]:hover,
        -fieldset[disabled] .btn-bitbucket:hover,
        -.btn-bitbucket.disabled:focus,
        -.btn-bitbucket[disabled]:focus,
        -fieldset[disabled] .btn-bitbucket:focus,
        -.btn-bitbucket.disabled.focus,
        -.btn-bitbucket[disabled].focus,
        -fieldset[disabled] .btn-bitbucket.focus,
        -.btn-bitbucket.disabled:active,
        -.btn-bitbucket[disabled]:active,
        -fieldset[disabled] .btn-bitbucket:active,
        -.btn-bitbucket.disabled.active,
        -.btn-bitbucket[disabled].active,
        -fieldset[disabled] .btn-bitbucket.active {
        -  background-color: #205081;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-bitbucket .badge {
        -  color: #205081;
        -  background-color: #fff;
        -}
        -.btn-dropbox {
        -  color: #fff;
        -  background-color: #1087dd;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-dropbox:hover,
        -.btn-dropbox:focus,
        -.btn-dropbox.focus,
        -.btn-dropbox:active,
        -.btn-dropbox.active,
        -.open > .dropdown-toggle.btn-dropbox {
        -  color: #fff;
        -  background-color: #0d6aad;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-dropbox:active,
        -.btn-dropbox.active,
        -.open > .dropdown-toggle.btn-dropbox {
        -  background-image: none;
        -}
        -.btn-dropbox.disabled,
        -.btn-dropbox[disabled],
        -fieldset[disabled] .btn-dropbox,
        -.btn-dropbox.disabled:hover,
        -.btn-dropbox[disabled]:hover,
        -fieldset[disabled] .btn-dropbox:hover,
        -.btn-dropbox.disabled:focus,
        -.btn-dropbox[disabled]:focus,
        -fieldset[disabled] .btn-dropbox:focus,
        -.btn-dropbox.disabled.focus,
        -.btn-dropbox[disabled].focus,
        -fieldset[disabled] .btn-dropbox.focus,
        -.btn-dropbox.disabled:active,
        -.btn-dropbox[disabled]:active,
        -fieldset[disabled] .btn-dropbox:active,
        -.btn-dropbox.disabled.active,
        -.btn-dropbox[disabled].active,
        -fieldset[disabled] .btn-dropbox.active {
        -  background-color: #1087dd;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-dropbox .badge {
        -  color: #1087dd;
        -  background-color: #fff;
        -}
        -.btn-facebook {
        -  color: #fff;
        -  background-color: #3b5998;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-facebook:hover,
        -.btn-facebook:focus,
        -.btn-facebook.focus,
        -.btn-facebook:active,
        -.btn-facebook.active,
        -.open > .dropdown-toggle.btn-facebook {
        -  color: #fff;
        -  background-color: #2d4373;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-facebook:active,
        -.btn-facebook.active,
        -.open > .dropdown-toggle.btn-facebook {
        -  background-image: none;
        -}
        -.btn-facebook.disabled,
        -.btn-facebook[disabled],
        -fieldset[disabled] .btn-facebook,
        -.btn-facebook.disabled:hover,
        -.btn-facebook[disabled]:hover,
        -fieldset[disabled] .btn-facebook:hover,
        -.btn-facebook.disabled:focus,
        -.btn-facebook[disabled]:focus,
        -fieldset[disabled] .btn-facebook:focus,
        -.btn-facebook.disabled.focus,
        -.btn-facebook[disabled].focus,
        -fieldset[disabled] .btn-facebook.focus,
        -.btn-facebook.disabled:active,
        -.btn-facebook[disabled]:active,
        -fieldset[disabled] .btn-facebook:active,
        -.btn-facebook.disabled.active,
        -.btn-facebook[disabled].active,
        -fieldset[disabled] .btn-facebook.active {
        -  background-color: #3b5998;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-facebook .badge {
        -  color: #3b5998;
        -  background-color: #fff;
        -}
        -.btn-flickr {
        -  color: #fff;
        -  background-color: #ff0084;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-flickr:hover,
        -.btn-flickr:focus,
        -.btn-flickr.focus,
        -.btn-flickr:active,
        -.btn-flickr.active,
        -.open > .dropdown-toggle.btn-flickr {
        -  color: #fff;
        -  background-color: #cc006a;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-flickr:active,
        -.btn-flickr.active,
        -.open > .dropdown-toggle.btn-flickr {
        -  background-image: none;
        -}
        -.btn-flickr.disabled,
        -.btn-flickr[disabled],
        -fieldset[disabled] .btn-flickr,
        -.btn-flickr.disabled:hover,
        -.btn-flickr[disabled]:hover,
        -fieldset[disabled] .btn-flickr:hover,
        -.btn-flickr.disabled:focus,
        -.btn-flickr[disabled]:focus,
        -fieldset[disabled] .btn-flickr:focus,
        -.btn-flickr.disabled.focus,
        -.btn-flickr[disabled].focus,
        -fieldset[disabled] .btn-flickr.focus,
        -.btn-flickr.disabled:active,
        -.btn-flickr[disabled]:active,
        -fieldset[disabled] .btn-flickr:active,
        -.btn-flickr.disabled.active,
        -.btn-flickr[disabled].active,
        -fieldset[disabled] .btn-flickr.active {
        -  background-color: #ff0084;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-flickr .badge {
        -  color: #ff0084;
        -  background-color: #fff;
        -}
        -.btn-foursquare {
        -  color: #fff;
        -  background-color: #f94877;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-foursquare:hover,
        -.btn-foursquare:focus,
        -.btn-foursquare.focus,
        -.btn-foursquare:active,
        -.btn-foursquare.active,
        -.open > .dropdown-toggle.btn-foursquare {
        -  color: #fff;
        -  background-color: #f71752;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-foursquare:active,
        -.btn-foursquare.active,
        -.open > .dropdown-toggle.btn-foursquare {
        -  background-image: none;
        -}
        -.btn-foursquare.disabled,
        -.btn-foursquare[disabled],
        -fieldset[disabled] .btn-foursquare,
        -.btn-foursquare.disabled:hover,
        -.btn-foursquare[disabled]:hover,
        -fieldset[disabled] .btn-foursquare:hover,
        -.btn-foursquare.disabled:focus,
        -.btn-foursquare[disabled]:focus,
        -fieldset[disabled] .btn-foursquare:focus,
        -.btn-foursquare.disabled.focus,
        -.btn-foursquare[disabled].focus,
        -fieldset[disabled] .btn-foursquare.focus,
        -.btn-foursquare.disabled:active,
        -.btn-foursquare[disabled]:active,
        -fieldset[disabled] .btn-foursquare:active,
        -.btn-foursquare.disabled.active,
        -.btn-foursquare[disabled].active,
        -fieldset[disabled] .btn-foursquare.active {
        -  background-color: #f94877;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-foursquare .badge {
        -  color: #f94877;
        -  background-color: #fff;
        -}
        -.btn-github {
        -  color: #fff;
        -  background-color: #444444;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-github:hover,
        -.btn-github:focus,
        -.btn-github.focus,
        -.btn-github:active,
        -.btn-github.active,
        -.open > .dropdown-toggle.btn-github {
        -  color: #fff;
        -  background-color: #2b2b2b;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-github:active,
        -.btn-github.active,
        -.open > .dropdown-toggle.btn-github {
        -  background-image: none;
        -}
        -.btn-github.disabled,
        -.btn-github[disabled],
        -fieldset[disabled] .btn-github,
        -.btn-github.disabled:hover,
        -.btn-github[disabled]:hover,
        -fieldset[disabled] .btn-github:hover,
        -.btn-github.disabled:focus,
        -.btn-github[disabled]:focus,
        -fieldset[disabled] .btn-github:focus,
        -.btn-github.disabled.focus,
        -.btn-github[disabled].focus,
        -fieldset[disabled] .btn-github.focus,
        -.btn-github.disabled:active,
        -.btn-github[disabled]:active,
        -fieldset[disabled] .btn-github:active,
        -.btn-github.disabled.active,
        -.btn-github[disabled].active,
        -fieldset[disabled] .btn-github.active {
        -  background-color: #444444;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-github .badge {
        -  color: #444444;
        -  background-color: #fff;
        -}
        -.btn-google {
        -  color: #fff;
        -  background-color: #dd4b39;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-google:hover,
        -.btn-google:focus,
        -.btn-google.focus,
        -.btn-google:active,
        -.btn-google.active,
        -.open > .dropdown-toggle.btn-google {
        -  color: #fff;
        -  background-color: #c23321;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-google:active,
        -.btn-google.active,
        -.open > .dropdown-toggle.btn-google {
        -  background-image: none;
        -}
        -.btn-google.disabled,
        -.btn-google[disabled],
        -fieldset[disabled] .btn-google,
        -.btn-google.disabled:hover,
        -.btn-google[disabled]:hover,
        -fieldset[disabled] .btn-google:hover,
        -.btn-google.disabled:focus,
        -.btn-google[disabled]:focus,
        -fieldset[disabled] .btn-google:focus,
        -.btn-google.disabled.focus,
        -.btn-google[disabled].focus,
        -fieldset[disabled] .btn-google.focus,
        -.btn-google.disabled:active,
        -.btn-google[disabled]:active,
        -fieldset[disabled] .btn-google:active,
        -.btn-google.disabled.active,
        -.btn-google[disabled].active,
        -fieldset[disabled] .btn-google.active {
        -  background-color: #dd4b39;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-google .badge {
        -  color: #dd4b39;
        -  background-color: #fff;
        -}
        -.btn-instagram {
        -  color: #fff;
        -  background-color: #3f729b;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-instagram:hover,
        -.btn-instagram:focus,
        -.btn-instagram.focus,
        -.btn-instagram:active,
        -.btn-instagram.active,
        -.open > .dropdown-toggle.btn-instagram {
        -  color: #fff;
        -  background-color: #305777;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-instagram:active,
        -.btn-instagram.active,
        -.open > .dropdown-toggle.btn-instagram {
        -  background-image: none;
        -}
        -.btn-instagram.disabled,
        -.btn-instagram[disabled],
        -fieldset[disabled] .btn-instagram,
        -.btn-instagram.disabled:hover,
        -.btn-instagram[disabled]:hover,
        -fieldset[disabled] .btn-instagram:hover,
        -.btn-instagram.disabled:focus,
        -.btn-instagram[disabled]:focus,
        -fieldset[disabled] .btn-instagram:focus,
        -.btn-instagram.disabled.focus,
        -.btn-instagram[disabled].focus,
        -fieldset[disabled] .btn-instagram.focus,
        -.btn-instagram.disabled:active,
        -.btn-instagram[disabled]:active,
        -fieldset[disabled] .btn-instagram:active,
        -.btn-instagram.disabled.active,
        -.btn-instagram[disabled].active,
        -fieldset[disabled] .btn-instagram.active {
        -  background-color: #3f729b;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-instagram .badge {
        -  color: #3f729b;
        -  background-color: #fff;
        -}
        -.btn-linkedin {
        -  color: #fff;
        -  background-color: #007bb6;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-linkedin:hover,
        -.btn-linkedin:focus,
        -.btn-linkedin.focus,
        -.btn-linkedin:active,
        -.btn-linkedin.active,
        -.open > .dropdown-toggle.btn-linkedin {
        -  color: #fff;
        -  background-color: #005983;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-linkedin:active,
        -.btn-linkedin.active,
        -.open > .dropdown-toggle.btn-linkedin {
        -  background-image: none;
        -}
        -.btn-linkedin.disabled,
        -.btn-linkedin[disabled],
        -fieldset[disabled] .btn-linkedin,
        -.btn-linkedin.disabled:hover,
        -.btn-linkedin[disabled]:hover,
        -fieldset[disabled] .btn-linkedin:hover,
        -.btn-linkedin.disabled:focus,
        -.btn-linkedin[disabled]:focus,
        -fieldset[disabled] .btn-linkedin:focus,
        -.btn-linkedin.disabled.focus,
        -.btn-linkedin[disabled].focus,
        -fieldset[disabled] .btn-linkedin.focus,
        -.btn-linkedin.disabled:active,
        -.btn-linkedin[disabled]:active,
        -fieldset[disabled] .btn-linkedin:active,
        -.btn-linkedin.disabled.active,
        -.btn-linkedin[disabled].active,
        -fieldset[disabled] .btn-linkedin.active {
        -  background-color: #007bb6;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-linkedin .badge {
        -  color: #007bb6;
        -  background-color: #fff;
        -}
        -.btn-microsoft {
        -  color: #fff;
        -  background-color: #2672ec;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-microsoft:hover,
        -.btn-microsoft:focus,
        -.btn-microsoft.focus,
        -.btn-microsoft:active,
        -.btn-microsoft.active,
        -.open > .dropdown-toggle.btn-microsoft {
        -  color: #fff;
        -  background-color: #125acd;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-microsoft:active,
        -.btn-microsoft.active,
        -.open > .dropdown-toggle.btn-microsoft {
        -  background-image: none;
        -}
        -.btn-microsoft.disabled,
        -.btn-microsoft[disabled],
        -fieldset[disabled] .btn-microsoft,
        -.btn-microsoft.disabled:hover,
        -.btn-microsoft[disabled]:hover,
        -fieldset[disabled] .btn-microsoft:hover,
        -.btn-microsoft.disabled:focus,
        -.btn-microsoft[disabled]:focus,
        -fieldset[disabled] .btn-microsoft:focus,
        -.btn-microsoft.disabled.focus,
        -.btn-microsoft[disabled].focus,
        -fieldset[disabled] .btn-microsoft.focus,
        -.btn-microsoft.disabled:active,
        -.btn-microsoft[disabled]:active,
        -fieldset[disabled] .btn-microsoft:active,
        -.btn-microsoft.disabled.active,
        -.btn-microsoft[disabled].active,
        -fieldset[disabled] .btn-microsoft.active {
        -  background-color: #2672ec;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-microsoft .badge {
        -  color: #2672ec;
        -  background-color: #fff;
        -}
        -.btn-openid {
        -  color: #fff;
        -  background-color: #f7931e;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-openid:hover,
        -.btn-openid:focus,
        -.btn-openid.focus,
        -.btn-openid:active,
        -.btn-openid.active,
        -.open > .dropdown-toggle.btn-openid {
        -  color: #fff;
        -  background-color: #da7908;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-openid:active,
        -.btn-openid.active,
        -.open > .dropdown-toggle.btn-openid {
        -  background-image: none;
        -}
        -.btn-openid.disabled,
        -.btn-openid[disabled],
        -fieldset[disabled] .btn-openid,
        -.btn-openid.disabled:hover,
        -.btn-openid[disabled]:hover,
        -fieldset[disabled] .btn-openid:hover,
        -.btn-openid.disabled:focus,
        -.btn-openid[disabled]:focus,
        -fieldset[disabled] .btn-openid:focus,
        -.btn-openid.disabled.focus,
        -.btn-openid[disabled].focus,
        -fieldset[disabled] .btn-openid.focus,
        -.btn-openid.disabled:active,
        -.btn-openid[disabled]:active,
        -fieldset[disabled] .btn-openid:active,
        -.btn-openid.disabled.active,
        -.btn-openid[disabled].active,
        -fieldset[disabled] .btn-openid.active {
        -  background-color: #f7931e;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-openid .badge {
        -  color: #f7931e;
        -  background-color: #fff;
        -}
        -.btn-pinterest {
        -  color: #fff;
        -  background-color: #cb2027;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-pinterest:hover,
        -.btn-pinterest:focus,
        -.btn-pinterest.focus,
        -.btn-pinterest:active,
        -.btn-pinterest.active,
        -.open > .dropdown-toggle.btn-pinterest {
        -  color: #fff;
        -  background-color: #9f191f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-pinterest:active,
        -.btn-pinterest.active,
        -.open > .dropdown-toggle.btn-pinterest {
        -  background-image: none;
        -}
        -.btn-pinterest.disabled,
        -.btn-pinterest[disabled],
        -fieldset[disabled] .btn-pinterest,
        -.btn-pinterest.disabled:hover,
        -.btn-pinterest[disabled]:hover,
        -fieldset[disabled] .btn-pinterest:hover,
        -.btn-pinterest.disabled:focus,
        -.btn-pinterest[disabled]:focus,
        -fieldset[disabled] .btn-pinterest:focus,
        -.btn-pinterest.disabled.focus,
        -.btn-pinterest[disabled].focus,
        -fieldset[disabled] .btn-pinterest.focus,
        -.btn-pinterest.disabled:active,
        -.btn-pinterest[disabled]:active,
        -fieldset[disabled] .btn-pinterest:active,
        -.btn-pinterest.disabled.active,
        -.btn-pinterest[disabled].active,
        -fieldset[disabled] .btn-pinterest.active {
        -  background-color: #cb2027;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-pinterest .badge {
        -  color: #cb2027;
        -  background-color: #fff;
        -}
        -.btn-reddit {
        -  color: #000;
        -  background-color: #eff7ff;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-reddit:hover,
        -.btn-reddit:focus,
        -.btn-reddit.focus,
        -.btn-reddit:active,
        -.btn-reddit.active,
        -.open > .dropdown-toggle.btn-reddit {
        -  color: #000;
        -  background-color: #bcddff;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-reddit:active,
        -.btn-reddit.active,
        -.open > .dropdown-toggle.btn-reddit {
        -  background-image: none;
        -}
        -.btn-reddit.disabled,
        -.btn-reddit[disabled],
        -fieldset[disabled] .btn-reddit,
        -.btn-reddit.disabled:hover,
        -.btn-reddit[disabled]:hover,
        -fieldset[disabled] .btn-reddit:hover,
        -.btn-reddit.disabled:focus,
        -.btn-reddit[disabled]:focus,
        -fieldset[disabled] .btn-reddit:focus,
        -.btn-reddit.disabled.focus,
        -.btn-reddit[disabled].focus,
        -fieldset[disabled] .btn-reddit.focus,
        -.btn-reddit.disabled:active,
        -.btn-reddit[disabled]:active,
        -fieldset[disabled] .btn-reddit:active,
        -.btn-reddit.disabled.active,
        -.btn-reddit[disabled].active,
        -fieldset[disabled] .btn-reddit.active {
        -  background-color: #eff7ff;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-reddit .badge {
        -  color: #eff7ff;
        -  background-color: #000;
        -}
        -.btn-soundcloud {
        -  color: #fff;
        -  background-color: #ff5500;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-soundcloud:hover,
        -.btn-soundcloud:focus,
        -.btn-soundcloud.focus,
        -.btn-soundcloud:active,
        -.btn-soundcloud.active,
        -.open > .dropdown-toggle.btn-soundcloud {
        -  color: #fff;
        -  background-color: #cc4400;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-soundcloud:active,
        -.btn-soundcloud.active,
        -.open > .dropdown-toggle.btn-soundcloud {
        -  background-image: none;
        -}
        -.btn-soundcloud.disabled,
        -.btn-soundcloud[disabled],
        -fieldset[disabled] .btn-soundcloud,
        -.btn-soundcloud.disabled:hover,
        -.btn-soundcloud[disabled]:hover,
        -fieldset[disabled] .btn-soundcloud:hover,
        -.btn-soundcloud.disabled:focus,
        -.btn-soundcloud[disabled]:focus,
        -fieldset[disabled] .btn-soundcloud:focus,
        -.btn-soundcloud.disabled.focus,
        -.btn-soundcloud[disabled].focus,
        -fieldset[disabled] .btn-soundcloud.focus,
        -.btn-soundcloud.disabled:active,
        -.btn-soundcloud[disabled]:active,
        -fieldset[disabled] .btn-soundcloud:active,
        -.btn-soundcloud.disabled.active,
        -.btn-soundcloud[disabled].active,
        -fieldset[disabled] .btn-soundcloud.active {
        -  background-color: #ff5500;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-soundcloud .badge {
        -  color: #ff5500;
        -  background-color: #fff;
        -}
        -.btn-tumblr {
        -  color: #fff;
        -  background-color: #2c4762;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-tumblr:hover,
        -.btn-tumblr:focus,
        -.btn-tumblr.focus,
        -.btn-tumblr:active,
        -.btn-tumblr.active,
        -.open > .dropdown-toggle.btn-tumblr {
        -  color: #fff;
        -  background-color: #1c2d3f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-tumblr:active,
        -.btn-tumblr.active,
        -.open > .dropdown-toggle.btn-tumblr {
        -  background-image: none;
        -}
        -.btn-tumblr.disabled,
        -.btn-tumblr[disabled],
        -fieldset[disabled] .btn-tumblr,
        -.btn-tumblr.disabled:hover,
        -.btn-tumblr[disabled]:hover,
        -fieldset[disabled] .btn-tumblr:hover,
        -.btn-tumblr.disabled:focus,
        -.btn-tumblr[disabled]:focus,
        -fieldset[disabled] .btn-tumblr:focus,
        -.btn-tumblr.disabled.focus,
        -.btn-tumblr[disabled].focus,
        -fieldset[disabled] .btn-tumblr.focus,
        -.btn-tumblr.disabled:active,
        -.btn-tumblr[disabled]:active,
        -fieldset[disabled] .btn-tumblr:active,
        -.btn-tumblr.disabled.active,
        -.btn-tumblr[disabled].active,
        -fieldset[disabled] .btn-tumblr.active {
        -  background-color: #2c4762;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-tumblr .badge {
        -  color: #2c4762;
        -  background-color: #fff;
        -}
        -.btn-twitter {
        -  color: #fff;
        -  background-color: #55acee;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-twitter:hover,
        -.btn-twitter:focus,
        -.btn-twitter.focus,
        -.btn-twitter:active,
        -.btn-twitter.active,
        -.open > .dropdown-toggle.btn-twitter {
        -  color: #fff;
        -  background-color: #2795e9;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-twitter:active,
        -.btn-twitter.active,
        -.open > .dropdown-toggle.btn-twitter {
        -  background-image: none;
        -}
        -.btn-twitter.disabled,
        -.btn-twitter[disabled],
        -fieldset[disabled] .btn-twitter,
        -.btn-twitter.disabled:hover,
        -.btn-twitter[disabled]:hover,
        -fieldset[disabled] .btn-twitter:hover,
        -.btn-twitter.disabled:focus,
        -.btn-twitter[disabled]:focus,
        -fieldset[disabled] .btn-twitter:focus,
        -.btn-twitter.disabled.focus,
        -.btn-twitter[disabled].focus,
        -fieldset[disabled] .btn-twitter.focus,
        -.btn-twitter.disabled:active,
        -.btn-twitter[disabled]:active,
        -fieldset[disabled] .btn-twitter:active,
        -.btn-twitter.disabled.active,
        -.btn-twitter[disabled].active,
        -fieldset[disabled] .btn-twitter.active {
        -  background-color: #55acee;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-twitter .badge {
        -  color: #55acee;
        -  background-color: #fff;
        -}
        -.btn-vimeo {
        -  color: #fff;
        -  background-color: #1ab7ea;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vimeo:hover,
        -.btn-vimeo:focus,
        -.btn-vimeo.focus,
        -.btn-vimeo:active,
        -.btn-vimeo.active,
        -.open > .dropdown-toggle.btn-vimeo {
        -  color: #fff;
        -  background-color: #1295bf;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vimeo:active,
        -.btn-vimeo.active,
        -.open > .dropdown-toggle.btn-vimeo {
        -  background-image: none;
        -}
        -.btn-vimeo.disabled,
        -.btn-vimeo[disabled],
        -fieldset[disabled] .btn-vimeo,
        -.btn-vimeo.disabled:hover,
        -.btn-vimeo[disabled]:hover,
        -fieldset[disabled] .btn-vimeo:hover,
        -.btn-vimeo.disabled:focus,
        -.btn-vimeo[disabled]:focus,
        -fieldset[disabled] .btn-vimeo:focus,
        -.btn-vimeo.disabled.focus,
        -.btn-vimeo[disabled].focus,
        -fieldset[disabled] .btn-vimeo.focus,
        -.btn-vimeo.disabled:active,
        -.btn-vimeo[disabled]:active,
        -fieldset[disabled] .btn-vimeo:active,
        -.btn-vimeo.disabled.active,
        -.btn-vimeo[disabled].active,
        -fieldset[disabled] .btn-vimeo.active {
        -  background-color: #1ab7ea;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vimeo .badge {
        -  color: #1ab7ea;
        -  background-color: #fff;
        -}
        -.btn-vk {
        -  color: #fff;
        -  background-color: #587ea3;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vk:hover,
        -.btn-vk:focus,
        -.btn-vk.focus,
        -.btn-vk:active,
        -.btn-vk.active,
        -.open > .dropdown-toggle.btn-vk {
        -  color: #fff;
        -  background-color: #466482;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vk:active,
        -.btn-vk.active,
        -.open > .dropdown-toggle.btn-vk {
        -  background-image: none;
        -}
        -.btn-vk.disabled,
        -.btn-vk[disabled],
        -fieldset[disabled] .btn-vk,
        -.btn-vk.disabled:hover,
        -.btn-vk[disabled]:hover,
        -fieldset[disabled] .btn-vk:hover,
        -.btn-vk.disabled:focus,
        -.btn-vk[disabled]:focus,
        -fieldset[disabled] .btn-vk:focus,
        -.btn-vk.disabled.focus,
        -.btn-vk[disabled].focus,
        -fieldset[disabled] .btn-vk.focus,
        -.btn-vk.disabled:active,
        -.btn-vk[disabled]:active,
        -fieldset[disabled] .btn-vk:active,
        -.btn-vk.disabled.active,
        -.btn-vk[disabled].active,
        -fieldset[disabled] .btn-vk.active {
        -  background-color: #587ea3;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-vk .badge {
        -  color: #587ea3;
        -  background-color: #fff;
        -}
        -.btn-yahoo {
        -  color: #fff;
        -  background-color: #720e9e;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-yahoo:hover,
        -.btn-yahoo:focus,
        -.btn-yahoo.focus,
        -.btn-yahoo:active,
        -.btn-yahoo.active,
        -.open > .dropdown-toggle.btn-yahoo {
        -  color: #fff;
        -  background-color: #500a6f;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-yahoo:active,
        -.btn-yahoo.active,
        -.open > .dropdown-toggle.btn-yahoo {
        -  background-image: none;
        -}
        -.btn-yahoo.disabled,
        -.btn-yahoo[disabled],
        -fieldset[disabled] .btn-yahoo,
        -.btn-yahoo.disabled:hover,
        -.btn-yahoo[disabled]:hover,
        -fieldset[disabled] .btn-yahoo:hover,
        -.btn-yahoo.disabled:focus,
        -.btn-yahoo[disabled]:focus,
        -fieldset[disabled] .btn-yahoo:focus,
        -.btn-yahoo.disabled.focus,
        -.btn-yahoo[disabled].focus,
        -fieldset[disabled] .btn-yahoo.focus,
        -.btn-yahoo.disabled:active,
        -.btn-yahoo[disabled]:active,
        -fieldset[disabled] .btn-yahoo:active,
        -.btn-yahoo.disabled.active,
        -.btn-yahoo[disabled].active,
        -fieldset[disabled] .btn-yahoo.active {
        -  background-color: #720e9e;
        -  border-color: rgba(0, 0, 0, 0.2);
        -}
        -.btn-yahoo .badge {
        -  color: #720e9e;
        -  background-color: #fff;
        -}
        -/*
        - * Plugin: Full Calendar
        - * ---------------------
        - */
        -.fc-button {
        -  background: #f4f4f4;
        -  background-image: none;
        -  color: #444;
        -  border-color: #ddd;
        -  border-bottom-color: #ddd;
        -}
        -.fc-button:hover,
        -.fc-button:active,
        -.fc-button.hover {
        -  background-color: #e9e9e9;
        -}
        -.fc-header-title h2 {
        -  font-size: 15px;
        -  line-height: 1.6em;
        -  color: #666;
        -  margin-left: 10px;
        -}
        -.fc-header-right {
        -  padding-right: 10px;
        -}
        -.fc-header-left {
        -  padding-left: 10px;
        -}
        -.fc-widget-header {
        -  background: #fafafa;
        -}
        -.fc-grid {
        -  width: 100%;
        -  border: 0;
        -}
        -.fc-widget-header:first-of-type,
        -.fc-widget-content:first-of-type {
        -  border-left: 0;
        -  border-right: 0;
        -}
        -.fc-widget-header:last-of-type,
        -.fc-widget-content:last-of-type {
        -  border-right: 0;
        -}
        -.fc-toolbar {
        -  padding: 10px;
        -  margin: 0;
        -}
        -.fc-day-number {
        -  font-size: 20px;
        -  font-weight: 300;
        -  padding-right: 10px;
        -}
        -.fc-color-picker {
        -  list-style: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -.fc-color-picker > li {
        -  float: left;
        -  font-size: 30px;
        -  margin-right: 5px;
        -  line-height: 30px;
        -}
        -.fc-color-picker > li .fa {
        -  transition: -webkit-transform linear 0.3s;
        -  transition: transform linear 0.3s;
        -}
        -.fc-color-picker > li .fa:hover {
        -  -webkit-transform: rotate(30deg);
        -  transform: rotate(30deg);
        -}
        -#add-new-event {
        -  transition: all linear 0.3s;
        -}
        -.external-event {
        -  padding: 5px 10px;
        -  font-weight: bold;
        -  margin-bottom: 4px;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
        -  border-radius: 3px;
        -  cursor: move;
        -}
        -.external-event:hover {
        -  box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);
        -}
        -/*
        - * Plugin: Select2
        - * ---------------
        - */
        -.select2-container--default.select2-container--focus,
        -.select2-selection.select2-container--focus,
        -.select2-container--default:focus,
        -.select2-selection:focus,
        -.select2-container--default:active,
        -.select2-selection:active {
        -  outline: none;
        -}
        -.select2-container--default .select2-selection--single,
        -.select2-selection .select2-selection--single {
        -  border: 1px solid #d2d6de;
        -  border-radius: 0;
        -  padding: 6px 12px;
        -  height: 34px;
        -}
        -.select2-container--default.select2-container--open {
        -  border-color: #3c8dbc;
        -}
        -.select2-dropdown {
        -  border: 1px solid #d2d6de;
        -  border-radius: 0;
        -}
        -.select2-container--default .select2-results__option--highlighted[aria-selected] {
        -  background-color: #3c8dbc;
        -  color: white;
        -}
        -.select2-results__option {
        -  padding: 6px 12px;
        -  -moz-user-select: none;
        -  -ms-user-select: none;
        -  user-select: none;
        -  -webkit-user-select: none;
        -}
        -.select2-container .select2-selection--single .select2-selection__rendered {
        -  padding-left: 0;
        -  padding-right: 0;
        -  height: auto;
        -  margin-top: -4px;
        -}
        -.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
        -  padding-right: 6px;
        -  padding-left: 20px;
        -}
        -.select2-container--default .select2-selection--single .select2-selection__arrow {
        -  height: 28px;
        -  right: 3px;
        -}
        -.select2-container--default .select2-selection--single .select2-selection__arrow b {
        -  margin-top: 0;
        -}
        -.select2-dropdown .select2-search__field,
        -.select2-search--inline .select2-search__field {
        -  border: 1px solid #d2d6de;
        -}
        -.select2-dropdown .select2-search__field:focus,
        -.select2-search--inline .select2-search__field:focus {
        -  outline: none;
        -  border: 1px solid #3c8dbc;
        -}
        -.select2-container--default .select2-results__option[aria-disabled=true] {
        -  color: #999;
        -}
        -.select2-container--default .select2-results__option[aria-selected=true] {
        -  background-color: #ddd;
        -}
        -.select2-container--default .select2-results__option[aria-selected=true],
        -.select2-container--default .select2-results__option[aria-selected=true]:hover {
        -  color: #444;
        -}
        -.select2-container--default .select2-selection--multiple {
        -  border: 1px solid #d2d6de;
        -  border-radius: 0;
        -}
        -.select2-container--default .select2-selection--multiple:focus {
        -  border-color: #3c8dbc;
        -}
        -.select2-container--default.select2-container--focus .select2-selection--multiple {
        -  border-color: #d2d6de;
        -}
        -.select2-container--default .select2-selection--multiple .select2-selection__choice {
        -  background-color: #3c8dbc;
        -  border-color: #367fa9;
        -  padding: 1px 10px;
        -  color: #fff;
        -}
        -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
        -  margin-right: 5px;
        -  color: rgba(255, 255, 255, 0.7);
        -}
        -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
        -  color: #fff;
        -}
        -.select2-container .select2-selection--single .select2-selection__rendered {
        -  padding-right: 10px;
        -}
        -/*
        - * General: Miscellaneous
        - * ----------------------
        - */
        -.pad {
        -  padding: 10px;
        -}
        -.margin {
        -  margin: 10px;
        -}
        -.margin-bottom {
        -  margin-bottom: 20px;
        -}
        -.margin-bottom-none {
        -  margin-bottom: 0;
        -}
        -.margin-r-5 {
        -  margin-right: 5px;
        -}
        -.inline {
        -  display: inline;
        -}
        -.description-block {
        -  display: block;
        -  margin: 10px 0;
        -  text-align: center;
        -}
        -.description-block.margin-bottom {
        -  margin-bottom: 25px;
        -}
        -.description-block > .description-header {
        -  margin: 0;
        -  padding: 0;
        -  font-weight: 600;
        -  font-size: 16px;
        -}
        -.description-block > .description-text {
        -  text-transform: uppercase;
        -}
        -.bg-red,
        -.bg-yellow,
        -.bg-aqua,
        -.bg-blue,
        -.bg-light-blue,
        -.bg-green,
        -.bg-navy,
        -.bg-teal,
        -.bg-olive,
        -.bg-lime,
        -.bg-orange,
        -.bg-fuchsia,
        -.bg-purple,
        -.bg-maroon,
        -.bg-black,
        -.bg-red-active,
        -.bg-yellow-active,
        -.bg-aqua-active,
        -.bg-blue-active,
        -.bg-light-blue-active,
        -.bg-green-active,
        -.bg-navy-active,
        -.bg-teal-active,
        -.bg-olive-active,
        -.bg-lime-active,
        -.bg-orange-active,
        -.bg-fuchsia-active,
        -.bg-purple-active,
        -.bg-maroon-active,
        -.bg-black-active,
        -.callout.callout-danger,
        -.callout.callout-warning,
        -.callout.callout-info,
        -.callout.callout-success,
        -.alert-success,
        -.alert-danger,
        -.alert-error,
        -.alert-warning,
        -.alert-info,
        -.label-danger,
        -.label-info,
        -.label-warning,
        -.label-primary,
        -.label-success,
        -.modal-primary .modal-body,
        -.modal-primary .modal-header,
        -.modal-primary .modal-footer,
        -.modal-warning .modal-body,
        -.modal-warning .modal-header,
        -.modal-warning .modal-footer,
        -.modal-info .modal-body,
        -.modal-info .modal-header,
        -.modal-info .modal-footer,
        -.modal-success .modal-body,
        -.modal-success .modal-header,
        -.modal-success .modal-footer,
        -.modal-danger .modal-body,
        -.modal-danger .modal-header,
        -.modal-danger .modal-footer {
        -  color: #fff !important;
        -}
        -.bg-gray {
        -  color: #000;
        -  background-color: #d2d6de !important;
        -}
        -.bg-gray-light {
        -  background-color: #f7f7f7;
        -}
        -.bg-black {
        -  background-color: #111 !important;
        -}
        -.bg-red,
        -.callout.callout-danger,
        -.alert-danger,
        -.alert-error,
        -.label-danger,
        -.modal-danger .modal-body {
        -  background-color: #dd4b39 !important;
        -}
        -.bg-yellow,
        -.callout.callout-warning,
        -.alert-warning,
        -.label-warning,
        -.modal-warning .modal-body {
        -  background-color: #f39c12 !important;
        -}
        -.bg-aqua,
        -.callout.callout-info,
        -.alert-info,
        -.label-info,
        -.modal-info .modal-body {
        -  background-color: #00c0ef !important;
        -}
        -.bg-blue {
        -  background-color: #0073b7 !important;
        -}
        -.bg-light-blue,
        -.label-primary,
        -.modal-primary .modal-body {
        -  background-color: #3c8dbc !important;
        -}
        -.bg-green,
        -.callout.callout-success,
        -.alert-success,
        -.label-success,
        -.modal-success .modal-body {
        -  background-color: #00a65a !important;
        -}
        -.bg-navy {
        -  background-color: #001F3F !important;
        -}
        -.bg-teal {
        -  background-color: #39CCCC !important;
        -}
        -.bg-olive {
        -  background-color: #3D9970 !important;
        -}
        -.bg-lime {
        -  background-color: #01FF70 !important;
        -}
        -.bg-orange {
        -  background-color: #FF851B !important;
        -}
        -.bg-fuchsia {
        -  background-color: #F012BE !important;
        -}
        -.bg-purple {
        -  background-color: #605ca8 !important;
        -}
        -.bg-maroon {
        -  background-color: #D81B60 !important;
        -}
        -.bg-gray-active {
        -  color: #000;
        -  background-color: #b5bbc8 !important;
        -}
        -.bg-black-active {
        -  background-color: #000000 !important;
        -}
        -.bg-red-active,
        -.modal-danger .modal-header,
        -.modal-danger .modal-footer {
        -  background-color: #d33724 !important;
        -}
        -.bg-yellow-active,
        -.modal-warning .modal-header,
        -.modal-warning .modal-footer {
        -  background-color: #db8b0b !important;
        -}
        -.bg-aqua-active,
        -.modal-info .modal-header,
        -.modal-info .modal-footer {
        -  background-color: #00a7d0 !important;
        -}
        -.bg-blue-active {
        -  background-color: #005384 !important;
        -}
        -.bg-light-blue-active,
        -.modal-primary .modal-header,
        -.modal-primary .modal-footer {
        -  background-color: #357ca5 !important;
        -}
        -.bg-green-active,
        -.modal-success .modal-header,
        -.modal-success .modal-footer {
        -  background-color: #008d4c !important;
        -}
        -.bg-navy-active {
        -  background-color: #001a35 !important;
        -}
        -.bg-teal-active {
        -  background-color: #30bbbb !important;
        -}
        -.bg-olive-active {
        -  background-color: #368763 !important;
        -}
        -.bg-lime-active {
        -  background-color: #00e765 !important;
        -}
        -.bg-orange-active {
        -  background-color: #ff7701 !important;
        -}
        -.bg-fuchsia-active {
        -  background-color: #db0ead !important;
        -}
        -.bg-purple-active {
        -  background-color: #555299 !important;
        -}
        -.bg-maroon-active {
        -  background-color: #ca195a !important;
        -}
        -[class^="bg-"].disabled {
        -  opacity: 0.65;
        -  filter: alpha(opacity=65);
        -}
        -.text-red {
        -  color: #dd4b39 !important;
        -}
        -.text-yellow {
        -  color: #f39c12 !important;
        -}
        -.text-aqua {
        -  color: #00c0ef !important;
        -}
        -.text-blue {
        -  color: #0073b7 !important;
        -}
        -.text-black {
        -  color: #111 !important;
        -}
        -.text-light-blue {
        -  color: #3c8dbc !important;
        -}
        -.text-green {
        -  color: #00a65a !important;
        -}
        -.text-gray {
        -  color: #d2d6de !important;
        -}
        -.text-navy {
        -  color: #001F3F !important;
        -}
        -.text-teal {
        -  color: #39CCCC !important;
        -}
        -.text-olive {
        -  color: #3D9970 !important;
        -}
        -.text-lime {
        -  color: #01FF70 !important;
        -}
        -.text-orange {
        -  color: #FF851B !important;
        -}
        -.text-fuchsia {
        -  color: #F012BE !important;
        -}
        -.text-purple {
        -  color: #605ca8 !important;
        -}
        -.text-maroon {
        -  color: #D81B60 !important;
        -}
        -.link-muted {
        -  color: #7a869d;
        -}
        -.link-muted:hover,
        -.link-muted:focus {
        -  color: #606c84;
        -}
        -.link-black {
        -  color: #666;
        -}
        -.link-black:hover,
        -.link-black:focus {
        -  color: #999;
        -}
        -.hide {
        -  display: none !important;
        -}
        -.no-border {
        -  border: 0 !important;
        -}
        -.no-padding {
        -  padding: 0 !important;
        -}
        -.no-margin {
        -  margin: 0 !important;
        -}
        -.no-shadow {
        -  box-shadow: none!important;
        -}
        -.list-unstyled,
        -.chart-legend,
        -.contacts-list,
        -.users-list {
        -  list-style: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -.list-group-unbordered > .list-group-item {
        -  border-left: 0;
        -  border-right: 0;
        -  border-radius: 0;
        -  padding-left: 0;
        -  padding-right: 0;
        -}
        -.flat {
        -  border-radius: 0 !important;
        -}
        -.text-bold,
        -.text-bold.table td,
        -.text-bold.table th {
        -  font-weight: 700;
        -}
        -.text-sm {
        -  font-size: 12px;
        -}
        -.jqstooltip {
        -  padding: 5px!important;
        -  width: auto!important;
        -  height: auto!important;
        -}
        -.bg-teal-gradient {
        -  background: #39CCCC !important;
        -  background: -o-linear-gradient(#7adddd, #39CCCC) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39CCCC', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-light-blue-gradient {
        -  background: #3c8dbc !important;
        -  background: -o-linear-gradient(#67a8ce, #3c8dbc) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-blue-gradient {
        -  background: #0073b7 !important;
        -  background: -o-linear-gradient(#0089db, #0073b7) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-aqua-gradient {
        -  background: #00c0ef !important;
        -  background: -o-linear-gradient(#14d1ff, #00c0ef) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-yellow-gradient {
        -  background: #f39c12 !important;
        -  background: -o-linear-gradient(#f7bc60, #f39c12) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-purple-gradient {
        -  background: #605ca8 !important;
        -  background: -o-linear-gradient(#9491c4, #605ca8) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-green-gradient {
        -  background: #00a65a !important;
        -  background: -o-linear-gradient(#00ca6d, #00a65a) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-red-gradient {
        -  background: #dd4b39 !important;
        -  background: -o-linear-gradient(#e47365, #dd4b39) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-black-gradient {
        -  background: #111 !important;
        -  background: -o-linear-gradient(#2b2b2b, #111) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111', GradientType=0) !important;
        -  color: #fff;
        -}
        -.bg-maroon-gradient {
        -  background: #D81B60 !important;
        -  background: -o-linear-gradient(#e73f7c, #D81B60) !important;
        -  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#D81B60', GradientType=0) !important;
        -  color: #fff;
        -}
        -.description-block .description-icon {
        -  font-size: 16px;
        -}
        -.no-pad-top {
        -  padding-top: 0;
        -}
        -.position-static {
        -  position: static!important;
        -}
        -.list-header {
        -  font-size: 15px;
        -  padding: 10px 4px;
        -  font-weight: bold;
        -  color: #666;
        -}
        -.list-seperator {
        -  height: 1px;
        -  background: #f4f4f4;
        -  margin: 15px 0 9px 0;
        -}
        -.list-link > a {
        -  padding: 4px;
        -  color: #777;
        -}
        -.list-link > a:hover {
        -  color: #222;
        -}
        -.font-light {
        -  font-weight: 300;
        -}
        -.user-block:before,
        -.user-block:after {
        -  content: " ";
        -  display: table;
        -}
        -.user-block:after {
        -  clear: both;
        -}
        -.user-block img {
        -  width: 40px;
        -  height: 40px;
        -  float: left;
        -}
        -.user-block .username,
        -.user-block .description,
        -.user-block .comment {
        -  display: block;
        -  margin-left: 50px;
        -}
        -.user-block .username {
        -  font-size: 16px;
        -  font-weight: 600;
        -}
        -.user-block .description {
        -  color: #999;
        -  font-size: 13px;
        -}
        -.user-block.user-block-sm .username,
        -.user-block.user-block-sm .description,
        -.user-block.user-block-sm .comment {
        -  margin-left: 40px;
        -}
        -.user-block.user-block-sm .username {
        -  font-size: 14px;
        -}
        -.img-sm,
        -.img-md,
        -.img-lg,
        -.box-comments .box-comment img,
        -.user-block.user-block-sm img {
        -  float: left;
        -}
        -.img-sm,
        -.box-comments .box-comment img,
        -.user-block.user-block-sm img {
        -  width: 30px!important;
        -  height: 30px!important;
        -}
        -.img-sm + .img-push {
        -  margin-left: 40px;
        -}
        -.img-md {
        -  width: 60px;
        -  height: 60px;
        -}
        -.img-md + .img-push {
        -  margin-left: 70px;
        -}
        -.img-lg {
        -  width: 100px;
        -  height: 100px;
        -}
        -.img-lg + .img-push {
        -  margin-left: 110px;
        -}
        -.img-bordered {
        -  border: 3px solid #d2d6de;
        -  padding: 3px;
        -}
        -.img-bordered-sm {
        -  border: 2px solid #d2d6de;
        -  padding: 2px;
        -}
        -.attachment-block {
        -  border: 1px solid #f4f4f4;
        -  padding: 5px;
        -  margin-bottom: 10px;
        -  background: #f7f7f7;
        -}
        -.attachment-block .attachment-img {
        -  max-width: 100px;
        -  max-height: 100px;
        -  height: auto;
        -  float: left;
        -}
        -.attachment-block .attachment-pushed {
        -  margin-left: 110px;
        -}
        -.attachment-block .attachment-heading {
        -  margin: 0;
        -}
        -.attachment-block .attachment-text {
        -  color: #555;
        -}
        -.connectedSortable {
        -  min-height: 100px;
        -}
        -.ui-helper-hidden-accessible {
        -  border: 0;
        -  clip: rect(0 0 0 0);
        -  height: 1px;
        -  margin: -1px;
        -  overflow: hidden;
        -  padding: 0;
        -  position: absolute;
        -  width: 1px;
        -}
        -.sort-highlight {
        -  background: #f4f4f4;
        -  border: 1px dashed #ddd;
        -  margin-bottom: 10px;
        -}
        -.full-opacity-hover {
        -  opacity: 0.65;
        -  filter: alpha(opacity=65);
        -}
        -.full-opacity-hover:hover {
        -  opacity: 1;
        -  filter: alpha(opacity=100);
        -}
        -.chart {
        -  position: relative;
        -  overflow: hidden;
        -  width: 100%;
        -}
        -.chart svg,
        -.chart canvas {
        -  width: 100%!important;
        -}
        -/*
        - * Misc: print
        - * -----------
        - */
        -@media print {
        -  .no-print,
        -  .main-sidebar,
        -  .left-side,
        -  .main-header,
        -  .content-header {
        -    display: none!important;
        -  }
        -  .content-wrapper,
        -  .right-side,
        -  .main-footer {
        -    margin-left: 0!important;
        -    min-height: 0!important;
        -    -webkit-transform: translate(0, 0) !important;
        -    transform: translate(0, 0) !important;
        -  }
        -  .fixed .content-wrapper,
        -  .fixed .right-side {
        -    padding-top: 0!important;
        -  }
        -  .invoice {
        -    width: 100%;
        -    border: 0;
        -    margin: 0;
        -    padding: 0;
        -  }
        -  .invoice-col {
        -    float: left;
        -    width: 33.3333333%;
        -  }
        -  .table-responsive {
        -    overflow: auto;
        -  }
        -  .table-responsive > .table tr th,
        -  .table-responsive > .table tr td {
        -    white-space: normal!important;
        -  }
        -}
        -
        -/*
        - * Skin: Blue
        - * ----------
        - */
        -.skin-blue .main-header .navbar {
        -  background-color: #3c8dbc;
        -}
        -.skin-blue .main-header .navbar .nav > li > a {
        -  color: #fff;
        -}
        -.skin-blue .main-header .navbar .nav > li > a:hover,
        -.skin-blue .main-header .navbar .nav > li > a:active,
        -.skin-blue .main-header .navbar .nav > li > a:focus,
        -.skin-blue .main-header .navbar .nav .open > a,
        -.skin-blue .main-header .navbar .nav .open > a:hover,
        -.skin-blue .main-header .navbar .nav .open > a:focus,
        -.skin-blue .main-header .navbar .nav > .active > a {
        -  background: rgba(0, 0, 0, 0.1);
        -  color: #f6f6f6;
        -}
        -.skin-blue .main-header .navbar .sidebar-toggle {
        -  color: #fff;
        -}
        -.skin-blue .main-header .navbar .sidebar-toggle:hover {
        -  color: #f6f6f6;
        -  background: rgba(0, 0, 0, 0.1);
        -}
        -.skin-blue .main-header .navbar .sidebar-toggle {
        -  color: #fff;
        -}
        -.skin-blue .main-header .navbar .sidebar-toggle:hover {
        -  background-color: #367fa9;
        -}
        -@media (max-width: 767px) {
        -  .skin-blue .main-header .navbar .dropdown-menu li.divider {
        -    background-color: rgba(255, 255, 255, 0.1);
        -  }
        -  .skin-blue .main-header .navbar .dropdown-menu li a {
        -    color: #fff;
        -  }
        -  .skin-blue .main-header .navbar .dropdown-menu li a:hover {
        -    background: #367fa9;
        -  }
        -}
        -.skin-blue .main-header li.user-header {
        -  background-color: #3c8dbc;
        -}
        -.skin-blue .content-header {
        -  background: transparent;
        -}
        -.skin-blue .wrapper,
        -.skin-blue .main-sidebar,
        -.skin-blue .left-side {
        -  background-color: #222d32;
        -}
        -.skin-blue .user-panel > .info,
        -.skin-blue .user-panel > .info > a {
        -  color: #fff;
        -}
        -.skin-blue .sidebar-menu > li.header {
        -  color: #4b646f;
        -  background: #1a2226;
        -}
        -.skin-blue .sidebar-menu > li > a {
        -  border-left: 3px solid transparent;
        -}
        -.skin-blue .sidebar-menu > li:hover > a,
        -.skin-blue .sidebar-menu > li.active > a {
        -  color: #fff;
        -  background: #1e282c;
        -  border-left-color: #3c8dbc;
        -}
        -.skin-blue .sidebar-menu > li > .treeview-menu {
        -  margin: 0 1px;
        -  background: #2c3b41;
        -}
        -.skin-blue .sidebar a {
        -  color: #b8c7ce;
        -}
        -.skin-blue .sidebar a:hover {
        -  text-decoration: none;
        -}
        -.skin-blue .treeview-menu > li > a {
        -  color: #8aa4af;
        -}
        -.skin-blue .treeview-menu > li.active > a,
        -.skin-blue .treeview-menu > li > a:hover {
        -  color: #fff;
        -}
        -.skin-blue .sidebar-form {
        -  border-radius: 3px;
        -  border: 1px solid #374850;
        -  margin: 10px 10px;
        -}
        -.skin-blue .sidebar-form input[type="text"],
        -.skin-blue .sidebar-form .btn {
        -  box-shadow: none;
        -  background-color: #374850;
        -  border: 1px solid transparent;
        -  height: 35px;
        -  transition: all 0.3s ease-in-out;
        -}
        -.skin-blue .sidebar-form input[type="text"] {
        -  color: #666;
        -  border-top-left-radius: 2px;
        -  border-top-right-radius: 0;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 2px;
        -}
        -.skin-blue .sidebar-form input[type="text"]:focus,
        -.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
        -  background-color: #fff;
        -  color: #666;
        -}
        -.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
        -  border-left-color: #fff;
        -}
        -.skin-blue .sidebar-form .btn {
        -  color: #999;
        -  border-top-left-radius: 0;
        -  border-top-right-radius: 2px;
        -  border-bottom-right-radius: 2px;
        -  border-bottom-left-radius: 0;
        -}
        -.skin-blue.layout-top-nav .main-header > .logo .logo-variant {
        -  background-color: none;
        -}
        -
        -/*!
        - * Lightbox for Bootstrap 3 by @ashleydw
        - * https://github.com/ashleydw/lightbox
        - *
        - * License: https://github.com/ashleydw/lightbox/blob/master/LICENSE
        - */
        -.ekko-lightbox-container {
        -  position: relative;
        -}
        -.ekko-lightbox-nav-overlay {
        -  z-index: 100;
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  width: 100%;
        -  height: 100%;
        -}
        -.ekko-lightbox-nav-overlay a {
        -  opacity: 0;
        -  transition: opacity 0.5s;
        -  color: #fff;
        -  font-size: 30px;
        -  height: 100%;
        -  width: 49%;
        -  display: block;
        -  text-shadow: 2px 2px 4px #000;
        -  -webkit-filter: dropshadow(color=#000, offx=2, offy=2);
        -  filter: dropshadow(color=#000, offx=2, offy=2);
        -  z-index: 100;
        -}
        -.ekko-lightbox-nav-overlay a:empty {
        -  width: 49%;
        -}
        -.ekko-lightbox a:hover {
        -  opacity: 1;
        -  text-decoration: none;
        -}
        -.ekko-lightbox .glyphicon-chevron-left {
        -  padding-left: 15px;
        -  float: left;
        -  left: 0;
        -  text-align: left;
        -}
        -.ekko-lightbox .glyphicon-chevron-right {
        -  padding-right: 15px;
        -  float: right;
        -  right: 0;
        -  text-align: right;
        -}
        -.ekko-lightbox .modal-footer {
        -  text-align: left;
        -}
        -
        -.skin-blue .main-header .logo {
        -  background-color: inherit;
        -}
        -.main-header .logo {
        -  width: 100% !important;
        -  white-space: nowrap;
        -  text-align: left;
        -  display: block;
        -  clear: both;
        -}
        -.huge {
        -  font-size: 40px;
        -}
        -.btn-file {
        -  position: relative;
        -  overflow: hidden;
        -}
        -.dropdown-menu > li > a {
        -  color: #354044;
        -}
        -#sort tr.cansort {
        -  border-radius: 2px;
        -  padding: 10px;
        -  background: #f4f4f4;
        -  margin-bottom: 3px;
        -  border-left: 2px solid #e6e7e8;
        -  color: #444;
        -  cursor: move;
        -}
        -.user-image-inline {
        -  float: left;
        -  width: 25px;
        -  height: 25px;
        -  border-radius: 50%;
        -  margin-right: 10px;
        -}
        -.input-group .input-group-addon {
        -  background-color: #f4f4f4;
        -}
        -a.accordion-header {
        -  color: #333;
        -}
        -.dynamic-form-row {
        -  padding: 10px;
        -  margin: 20px;
        -}
        -.handle {
        -  padding-left: 10px;
        -}
        -.btn-file input[type=file] {
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -  min-width: 100%;
        -  min-height: 100%;
        -  font-size: 100px;
        -  text-align: right;
        -  filter: alpha(opacity=0);
        -  opacity: 0;
        -  outline: none;
        -  background: white;
        -  cursor: inherit;
        -  display: block;
        -}
        -.main-footer {
        -  font-size: 13px;
        -}
        -.main-header {
        -  max-height: 150px;
        -}
        -.navbar-brand-img {
        -  float: left;
        -  padding: 5px 5px 5px 0;
        -}
        -.navbar-nav > .user-menu > .dropdown-menu {
        -  width: inherit;
        -}
        -.main-header .logo {
        -  padding: 0px 5px 0px 15px;
        -}
        -.sidebar-toggle {
        -  margin-left: -48px;
        -  z-index: 100;
        -  background-color: inherit;
        -}
        -.sidebar-toggle-mobile {
        -  z-index: 100;
        -  width: 50px;
        -  padding-top: 10px;
        -}
        -.main-header .sidebar-toggle:before {
        -  content: "\f0c9";
        -}
        -.direct-chat-contacts {
        -  padding: 10px;
        -  height: 150px;
        -}
        -.select2-container {
        -  width: 100%;
        -}
        -.error input {
        -  color: #dd4b39;
        -  border: 2px solid #dd4b39 !important;
        -}
        -.error label,
        -.alert-msg {
        -  color: #dd4b39;
        -  display: block;
        -}
        -.input-group[class*="col-"] {
        -  padding-right: 15px;
        -  padding-left: 15px;
        -}
        -.control-label.multiline {
        -  padding-top: 10;
        -}
        -.btn-outline {
        -  color: inherit;
        -  background-color: transparent;
        -  transition: all .5s;
        -}
        -.btn-primary.btn-outline {
        -  color: #428bca;
        -}
        -.btn-success.btn-outline {
        -  color: #5cb85c;
        -}
        -.btn-info.btn-outline {
        -  color: #5bc0de;
        -}
        -.btn-warning.btn-outline {
        -  color: #f0ad4e;
        -}
        -.btn-danger.btn-outline {
        -  color: #d9534f;
        -}
        -.btn-primary.btn-outline:hover,
        -.btn-success.btn-outline:hover,
        -.btn-info.btn-outline:hover,
        -.btn-warning.btn-outline:hover,
        -.btn-danger.btn-outline:hover {
        -  color: #fff;
        -}
        -.slideout-menu {
        -  position: fixed;
        -  top: 0;
        -  right: -250px;
        -  width: 250px;
        -  height: 100%;
        -  background: #333;
        -  z-index: 100;
        -  margin-top: 100px;
        -  color: white;
        -  padding: 10px;
        -}
        -.slideout-menu h3 {
        -  position: relative;
        -  padding: 5px 5px;
        -  color: #fff;
        -  font-size: 1.2em;
        -  font-weight: 400;
        -  border-bottom: 4px solid #222;
        -}
        -.slideout-menu .slideout-menu-toggle {
        -  position: absolute;
        -  top: 12px;
        -  right: 10px;
        -  display: inline-block;
        -  padding: 6px 9px 5px;
        -  font-family: Arial, sans-serif;
        -  font-weight: bold;
        -  line-height: 1;
        -  background: #222;
        -  color: #999;
        -  text-decoration: none;
        -  vertical-align: top;
        -}
        -.slideout-menu .slideout-menu-toggle:hover {
        -  color: #fff;
        -}
        -.slideout-menu ul {
        -  list-style: none;
        -  font-weight: 300;
        -  border-top: 1px solid #151515;
        -  border-bottom: 1px solid #454545;
        -}
        -.slideout-menu ul li {
        -  border-top: 1px solid #454545;
        -  border-bottom: 1px solid #151515;
        -}
        -.slideout-menu ul li a {
        -  position: relative;
        -  display: block;
        -  padding: 10px;
        -  color: #999;
        -  text-decoration: none;
        -}
        -.slideout-menu ul li a:hover {
        -  background: #000;
        -  color: #fff;
        -}
        -.slideout-menu ul li a i {
        -  position: absolute;
        -  top: 15px;
        -  right: 10px;
        -  opacity: .5;
        -}
        -.btn-box-tool-lg {
        -  font-size: 16px;
        -  color: orange;
        -}
        -.bs-wizard {
        -  margin-top: 20px;
        -}
        -/*Form Wizard*/
        -.bs-wizard {
        -  border-bottom: solid 1px #e0e0e0;
        -  padding: 0 0 10px 0;
        -}
        -.bs-wizard > .bs-wizard-step {
        -  padding: 0;
        -  position: relative;
        -}
        -.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {
        -  color: #595959;
        -  font-size: 16px;
        -  margin-bottom: 5px;
        -}
        -.bs-wizard > .bs-wizard-step .bs-wizard-info {
        -  color: #999;
        -  font-size: 14px;
        -}
        -.bs-wizard > .bs-wizard-step > .bs-wizard-dot {
        -  position: absolute;
        -  width: 30px;
        -  height: 30px;
        -  display: block;
        -  background: #fbe8aa;
        -  top: 45px;
        -  left: 50%;
        -  margin-top: -15px;
        -  margin-left: -15px;
        -  border-radius: 50%;
        -}
        -.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {
        -  content: ' ';
        -  width: 14px;
        -  height: 14px;
        -  background: #fbbd19;
        -  border-radius: 50px;
        -  position: absolute;
        -  top: 8px;
        -  left: 8px;
        -}
        -.bs-wizard > .bs-wizard-step > .progress {
        -  position: relative;
        -  border-radius: 0px;
        -  height: 8px;
        -  box-shadow: none;
        -  margin: 20px 0;
        -}
        -.bs-wizard > .bs-wizard-step > .progress > .progress-bar {
        -  width: 0px;
        -  box-shadow: none;
        -  background: #fbe8aa;
        -}
        -.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {
        -  width: 100%;
        -}
        -.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {
        -  width: 50%;
        -}
        -.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {
        -  width: 0%;
        -}
        -.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {
        -  width: 100%;
        -}
        -.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {
        -  background-color: #f5f5f5;
        -}
        -.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {
        -  opacity: 0;
        -}
        -.bs-wizard > .bs-wizard-step:first-child > .progress {
        -  left: 50%;
        -  width: 50%;
        -}
        -.bs-wizard > .bs-wizard-step:last-child > .progress {
        -  width: 50%;
        -}
        -.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot {
        -  pointer-events: none;
        -}
        -/*END Form Wizard*/
        -.left-navblock {
        -  display: inline-block;
        -  float: left;
        -  text-align: left;
        -  color: white;
        -  padding: 0px;
        -  /* adjust based on your layout */
        -}
        -.skin-blue .main-header .navbar .dropdown-menu li a {
        -  color: #333;
        -}
        -a.logo.no-hover a:hover {
        -  background-color: transparent;
        -}
        -.required {
        -  border-right: 6px solid orange;
        -}
        -
        -/* WRENCHING */
        -@-webkit-keyframes wrench {
        -  0% {
        -    -webkit-transform: rotate(-12deg);
        -  }
        -  8% {
        -    -webkit-transform: rotate(12deg);
        -  }
        -  10% {
        -    -webkit-transform: rotate(24deg);
        -  }
        -  18% {
        -    -webkit-transform: rotate(-24deg);
        -  }
        -  20% {
        -    -webkit-transform: rotate(-24deg);
        -  }
        -  28% {
        -    -webkit-transform: rotate(24deg);
        -  }
        -  30% {
        -    -webkit-transform: rotate(24deg);
        -  }
        -  38% {
        -    -webkit-transform: rotate(-24deg);
        -  }
        -  40% {
        -    -webkit-transform: rotate(-24deg);
        -  }
        -  48% {
        -    -webkit-transform: rotate(24deg);
        -  }
        -  50% {
        -    -webkit-transform: rotate(24deg);
        -  }
        -  58% {
        -    -webkit-transform: rotate(-24deg);
        -  }
        -  60% {
        -    -webkit-transform: rotate(-24deg);
        -  }
        -  68% {
        -    -webkit-transform: rotate(24deg);
        -  }
        -  75% {
        -    -webkit-transform: rotate(0deg);
        -  }
        -}
        -@keyframes wrench {
        -  0% {
        -    -webkit-transform: rotate(-12deg);
        -    transform: rotate(-12deg);
        -  }
        -  8% {
        -    -webkit-transform: rotate(12deg);
        -    transform: rotate(12deg);
        -  }
        -  10% {
        -    -webkit-transform: rotate(24deg);
        -    transform: rotate(24deg);
        -  }
        -  18% {
        -    -webkit-transform: rotate(-24deg);
        -    transform: rotate(-24deg);
        -  }
        -  20% {
        -    -webkit-transform: rotate(-24deg);
        -    transform: rotate(-24deg);
        -  }
        -  28% {
        -    -webkit-transform: rotate(24deg);
        -    transform: rotate(24deg);
        -  }
        -  30% {
        -    -webkit-transform: rotate(24deg);
        -    transform: rotate(24deg);
        -  }
        -  38% {
        -    -webkit-transform: rotate(-24deg);
        -    transform: rotate(-24deg);
        -  }
        -  40% {
        -    -webkit-transform: rotate(-24deg);
        -    transform: rotate(-24deg);
        -  }
        -  48% {
        -    -webkit-transform: rotate(24deg);
        -    transform: rotate(24deg);
        -  }
        -  50% {
        -    -webkit-transform: rotate(24deg);
        -    transform: rotate(24deg);
        -  }
        -  58% {
        -    -webkit-transform: rotate(-24deg);
        -    transform: rotate(-24deg);
        -  }
        -  60% {
        -    -webkit-transform: rotate(-24deg);
        -    transform: rotate(-24deg);
        -  }
        -  68% {
        -    -webkit-transform: rotate(24deg);
        -    transform: rotate(24deg);
        -  }
        -  75% {
        -    -webkit-transform: rotate(0deg);
        -    transform: rotate(0deg);
        -  }
        -}
        -.faa-wrench.animated,
        -.faa-wrench.animated-hover:hover {
        -  -moz-animation: wrench 2.5s ease infinite;
        -  -moz-transform-origin-x: 90%;
        -  -moz-transform-origin-y: 35%;
        -  -moz-transform-origin-z: initial;
        -  -webkit-animation: wrench 2.5s ease infinite;
        -  -webkit-transform-origin-x: 90%;
        -  -webkit-transform-origin-y: 35%;
        -  -webkit-transform-origin-z: initial;
        -  -ms-animation: wrench 2.5s ease infinite;
        -  -ms-transform-origin-x: 90%;
        -  -ms-transform-origin-y: 35%;
        -  -ms-transform-origin-z: initial;
        -  -webkit-animation: wrench 2.5s ease infinite;
        -  animation: wrench 2.5s ease infinite;
        -  transform-origin-x: 90%;
        -  transform-origin-y: 35%;
        -  transform-origin-z: initial;
        -}
        -/* BELL */
        -@-webkit-keyframes ring {
        -  0% {
        -    -webkit-transform: rotate(-15deg);
        -  }
        -  2% {
        -    -webkit-transform: rotate(15deg);
        -  }
        -  4% {
        -    -webkit-transform: rotate(-18deg);
        -  }
        -  6% {
        -    -webkit-transform: rotate(18deg);
        -  }
        -  8% {
        -    -webkit-transform: rotate(-22deg);
        -  }
        -  10% {
        -    -webkit-transform: rotate(22deg);
        -  }
        -  12% {
        -    -webkit-transform: rotate(-18deg);
        -  }
        -  14% {
        -    -webkit-transform: rotate(18deg);
        -  }
        -  16% {
        -    -webkit-transform: rotate(-12deg);
        -  }
        -  18% {
        -    -webkit-transform: rotate(12deg);
        -  }
        -  20% {
        -    -webkit-transform: rotate(0deg);
        -  }
        -}
        -@keyframes ring {
        -  0% {
        -    -webkit-transform: rotate(-15deg);
        -    transform: rotate(-15deg);
        -  }
        -  2% {
        -    -webkit-transform: rotate(15deg);
        -    transform: rotate(15deg);
        -  }
        -  4% {
        -    -webkit-transform: rotate(-18deg);
        -    transform: rotate(-18deg);
        -  }
        -  6% {
        -    -webkit-transform: rotate(18deg);
        -    transform: rotate(18deg);
        -  }
        -  8% {
        -    -webkit-transform: rotate(-22deg);
        -    transform: rotate(-22deg);
        -  }
        -  10% {
        -    -webkit-transform: rotate(22deg);
        -    transform: rotate(22deg);
        -  }
        -  12% {
        -    -webkit-transform: rotate(-18deg);
        -    transform: rotate(-18deg);
        -  }
        -  14% {
        -    -webkit-transform: rotate(18deg);
        -    transform: rotate(18deg);
        -  }
        -  16% {
        -    -webkit-transform: rotate(-12deg);
        -    transform: rotate(-12deg);
        -  }
        -  18% {
        -    -webkit-transform: rotate(12deg);
        -    transform: rotate(12deg);
        -  }
        -  20% {
        -    -webkit-transform: rotate(0deg);
        -    transform: rotate(0deg);
        -  }
        -}
        -.faa-ring.animated,
        -.faa-ring.animated-hover:hover {
        -  -moz-animation: ring 2s ease infinite;
        -  -moz-transform-origin-x: 50%;
        -  -moz-transform-origin-y: 0px;
        -  -moz-transform-origin-z: initial;
        -  -webkit-animation: ring 2s ease infinite;
        -  -webkit-transform-origin-x: 50%;
        -  -webkit-transform-origin-y: 0px;
        -  -webkit-transform-origin-z: initial;
        -  -ms-animation: ring 2s ease infinite;
        -  -ms-transform-origin-x: 50%;
        -  -ms-transform-origin-y: 0px;
        -  -ms-transform-origin-z: initial;
        -  -webkit-animation: ring 2s ease infinite;
        -  animation: ring 2s ease infinite;
        -  transform-origin-x: 50%;
        -  transform-origin-y: 0px;
        -  transform-origin-z: initial;
        -}
        -/* VERTICAL */
        -@-webkit-keyframes vertical {
        -  0% {
        -    -webkit-transform: translate(0, -3px);
        -  }
        -  4% {
        -    -webkit-transform: translate(0, 3px);
        -  }
        -  8% {
        -    -webkit-transform: translate(0, -3px);
        -  }
        -  12% {
        -    -webkit-transform: translate(0, 3px);
        -  }
        -  16% {
        -    -webkit-transform: translate(0, -3px);
        -  }
        -  20% {
        -    -webkit-transform: translate(0, 3px);
        -  }
        -  22% {
        -    -webkit-transform: translate(0, 0);
        -  }
        -}
        -@keyframes vertical {
        -  0% {
        -    -webkit-transform: translate(0, -3px);
        -    transform: translate(0, -3px);
        -  }
        -  4% {
        -    -webkit-transform: translate(0, 3px);
        -    transform: translate(0, 3px);
        -  }
        -  8% {
        -    -webkit-transform: translate(0, -3px);
        -    transform: translate(0, -3px);
        -  }
        -  12% {
        -    -webkit-transform: translate(0, 3px);
        -    transform: translate(0, 3px);
        -  }
        -  16% {
        -    -webkit-transform: translate(0, -3px);
        -    transform: translate(0, -3px);
        -  }
        -  20% {
        -    -webkit-transform: translate(0, 3px);
        -    transform: translate(0, 3px);
        -  }
        -  22% {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -  }
        -}
        -.faa-vertical.animated,
        -.faa-vertical.animated-hover:hover {
        -  -webkit-animation: vertical 2s ease infinite;
        -  animation: vertical 2s ease infinite;
        -}
        -/* HORIZONTAL */
        -@-webkit-keyframes horizontal {
        -  0% {
        -    -webkit-transform: translate(0, 0);
        -  }
        -  6% {
        -    -webkit-transform: translate(5px, 0);
        -  }
        -  12% {
        -    -webkit-transform: translate(0, 0);
        -  }
        -  18% {
        -    -webkit-transform: translate(5px, 0);
        -  }
        -  24% {
        -    -webkit-transform: translate(0, 0);
        -  }
        -  30% {
        -    -webkit-transform: translate(5px, 0);
        -  }
        -  36% {
        -    -webkit-transform: translate(0, 0);
        -  }
        -}
        -@keyframes horizontal {
        -  0% {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -  }
        -  6% {
        -    -webkit-transform: translate(5px, 0);
        -    transform: translate(5px, 0);
        -  }
        -  12% {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -  }
        -  18% {
        -    -webkit-transform: translate(5px, 0);
        -    transform: translate(5px, 0);
        -  }
        -  24% {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -  }
        -  30% {
        -    -webkit-transform: translate(5px, 0);
        -    transform: translate(5px, 0);
        -  }
        -  36% {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0);
        -  }
        -}
        -.faa-horizontal.animated,
        -.faa-horizontal.animated-hover:hover {
        -  -webkit-animation: horizontal 2s ease infinite;
        -  animation: horizontal 2s ease infinite;
        -}
        -/* FLASHING */
        -@-webkit-keyframes flash {
        -  0%,
        -  100%,
        -  50% {
        -    opacity: 1;
        -  }
        -  25%,
        -  75% {
        -    opacity: 0;
        -  }
        -}
        -@keyframes flash {
        -  0%,
        -  100%,
        -  50% {
        -    opacity: 1;
        -  }
        -  25%,
        -  75% {
        -    opacity: 0;
        -  }
        -}
        -.faa-flash.animated,
        -.faa-flash.animated-hover:hover {
        -  -webkit-animation: flash 2s ease infinite;
        -  animation: flash 2s ease infinite;
        -}
        -/* BOUNCE */
        -@-webkit-keyframes bounce {
        -  0%,
        -  100%,
        -  20%,
        -  50%,
        -  80% {
        -    -webkit-transform: translateY(0);
        -  }
        -  40% {
        -    -webkit-transform: translateY(-15px);
        -  }
        -  60% {
        -    -webkit-transform: translateY(-15px);
        -  }
        -}
        -@keyframes bounce {
        -  0%,
        -  10%,
        -  20%,
        -  50%,
        -  80% {
        -    -webkit-transform: translateY(0);
        -    transform: translateY(0);
        -  }
        -  40% {
        -    -webkit-transform: translateY(-15px);
        -    transform: translateY(-15px);
        -  }
        -  60% {
        -    -webkit-transform: translateY(-15px);
        -    transform: translateY(-15px);
        -  }
        -}
        -.faa-bounce.animated,
        -.faa-bounce.animated-hover:hover {
        -  -webkit-animation: bounce 2s ease infinite;
        -  animation: bounce 2s ease infinite;
        -}
        -/* SPIN */
        -@-webkit-keyframes spin {
        -  0% {
        -    -webkit-transform: rotate(0deg);
        -  }
        -  100% {
        -    -webkit-transform: rotate(359deg);
        -  }
        -}
        -@keyframes spin {
        -  0% {
        -    -webkit-transform: rotate(0deg);
        -    transform: rotate(0deg);
        -  }
        -  100% {
        -    -webkit-transform: rotate(359deg);
        -    transform: rotate(359deg);
        -  }
        -}
        -.faa-spin.animated,
        -.faa-spin.animated-hover:hover {
        -  -webkit-animation: spin 1.5s linear infinite;
        -  animation: spin 1.5s linear infinite;
        -}
        -/* FLOAT */
        -@-webkit-keyframes float {
        -  0% {
        -    -webkit-transform: translateY(0);
        -  }
        -  50% {
        -    -webkit-transform: translateY(-6px);
        -  }
        -  100% {
        -    -webkit-transform: translateY(0);
        -  }
        -}
        -@keyframes float {
        -  0% {
        -    -webkit-transform: translateY(0);
        -    transform: translateY(0);
        -  }
        -  50% {
        -    -webkit-transform: translateY(-6px);
        -    transform: translateY(-6px);
        -  }
        -  100% {
        -    -webkit-transform: translateY(0);
        -    transform: translateY(0);
        -  }
        -}
        -.faa-float.animated,
        -.faa-float.animated-hover:hover {
        -  -webkit-animation: float 2s linear infinite;
        -  animation: float 2s linear infinite;
        -}
        -/* PULSE */
        -@-webkit-keyframes pulse {
        -  0% {
        -    -webkit-transform: scale(1);
        -  }
        -  50% {
        -    -webkit-transform: scale(0.8);
        -  }
        -  100% {
        -    -webkit-transform: scale(1);
        -  }
        -}
        -@keyframes pulse {
        -  0% {
        -    -webkit-transform: scale(1.1);
        -    transform: scale(1.1);
        -  }
        -  50% {
        -    -webkit-transform: scale(0.8);
        -    transform: scale(0.8);
        -  }
        -  100% {
        -    -webkit-transform: scale(1);
        -    transform: scale(1);
        -  }
        -}
        -.faa-pulse.animated,
        -.faa-pulse.animated-hover:hover {
        -  -webkit-animation: pulse 2s linear infinite;
        -  animation: pulse 2s linear infinite;
        -}
        -/* SHAKE */
        -.faa-shake.animated,
        -.faa-shake.animated-hover:hover {
        -  -webkit-animation: wrench 2.5s ease infinite;
        -}
        -
        -/*# sourceMappingURL=app.css.map */
        diff --git a/public/assets/css/app.css.map b/public/assets/css/app.css.map
        deleted file mode 100644
        index e47d8592fc..0000000000
        --- a/public/assets/css/app.css.map
        +++ /dev/null
        @@ -1 +0,0 @@
        -{"version":3,"sources":["AdminLTE.css","core.less","bootstrap-less/mixins/clearfix.less","bootstrap-less/mixins/vendor-prefixes.less","bootstrap-less/mixins/grid.less","header.less","mixins.less","sidebar.less","sidebar-mini.less","control-sidebar.less","dropdown.less","bootstrap-less/mixins/border-radius.less","forms.less","progress-bars.less","bootstrap-less/mixins/progress-bar.less","bootstrap-less/mixins/gradients.less","small-box.less","boxes.less","info-box.less","buttons.less","bootstrap-less/mixins/opacity.less","callout.less","alerts.less","navs.less","table.less","labels.less","direct-chat.less","users-list.less","modal.less","login_and_register.less","404_500_errors.less","bootstrap-social.less","bootstrap-less/mixins/buttons.less","fullcalendar.less","select2.less","miscellaneous.less","print.less","skin-blue.css","skin-blue.less","../mixins.less","../bootstrap-less/mixins/vendor-prefixes.less","ekko-lightbox.css","ekko-lightbox.less","overrides.less","overrides.css","fontawesome-animated.css"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,mHAAmH;AACnH;;;GAGG;ACPH;;EAEE,iBAAA;CDSD;ACRC;;EACE,aAAA;CDWH;ACPD;EACE,oCAAA;EACA,mCAAA;EACA,+EAAA;EACA,iBAAA;EACA,mBAAA;EACA,iBAAA;CDSD;AACD,YAAY;ACNZ;EAEE,iBAAA;EACA,iBAAA;EACA,iBAAA;CDOD;AEpBC;;EAEE,aAAA;EACA,eAAA;CFsBH;AEpBC;EACE,YAAA;CFsBH;ACdC;EACE,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,uCAAA;EACA,mBAAA;CDgBH;ACZD;EACE,oDAAA;CDcD;AACD;;;GAGG;ACXH;;;EE0KU,wEAAA;EAAA,gEAAA;EFnKR,mBAAA;EACA,aAAA;CDaD;ACXC;;;EACE,eAAA;CDeH;ACTC;EA8GF;;;IAjHI,eAAA;GDkBD;CACF;ACZC;EA0GF;;;IA5GM,eAAA;GDoBH;CACF;ACbC;EAoGF;;;IE7BE,uCAAA;IAGQ,+BAAA;GHpDP;CACF;ACpBD;;EAEE,iBAAA;EACA,0BAAA;EACA,aAAA;CDsBD;ACpBD;EACE,iBAAA;EACA,cAAA;EACA,YAAA;EACA,8BAAA;CDsBD;AACD,kBAAkB;ACnBlB;;;EAII,gBAAA;CDoBH;ACxBD;EAOI,OAAA;EACA,SAAA;EACA,QAAA;CDoBH;AC7BD;;EAaI,kBAAA;CDoBH;AChBC;EAkEF;;IApEM,mBAAA;GDuBH;CACF;ACrBC;EAEI,gBAAA;CDsBL;ACjBD;;;;;;;EDyBE,gBAAgB;EGsDR,iBAAA;CHlDT;AACD,aAAa;AChBb;EACE,kBAAA;EACA,cAAA;EG3HA,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CJ8ID;AACD,kBAAkB;AClBlB;;;;;;;;;;;;EAYE,2CAAA;CDoBD;AACD,mBAAmB;AClBnB;EACE,eAAA;CDoBD;AClBD;;;EAGE,cAAA;EACA,sBAAA;EACA,eAAA;CDoBD;AACD,iBAAiB;ACjBjB;EACE,sBAAA;EACA,gBAAA;CDmBD;ACrBD;EAKI,YAAA;EACA,eAAA;EACA,gBAAA;CDmBH;AACD;;;GAGG;AK1LH;EACE,mBAAA;EACA,kBAAA;EACA,cAAA;CL4LD;AK/LD;EF2LU,yCAAA;EEpLN,iBAAA;EACA,mBAAA;EACA,aAAA;EACA,iBAAA;EACA,iBAAA;CL8LH;AK7LG;EACE,eAAA;CL+LL;AK5MD;EAkBI,qCAAA;EACA,0BAAA;CL6LH;AK5LG;;EAEE,iCAAA;EACA,qCAAA;CL8LL;AK5LG;EACE,YAAA;EACA,WAAA;CL8LL;AK5LG;EACE,YAAA;CL8LL;AK5LG;EACE,YAAA;CL8LL;AK/ND;;EAuCI,aAAA;CL4LH;AKrLC;EAyNF;;IA7NQ,eAAA;IACA,wBAAA;GL8LL;CACF;AKhLC;EA6MF;IAtNM,YAAA;GL6LH;EK5LG;IACE,oBAAA;GL8LL;EKsBH;IAjNQ,eAAA;IACA,UAAA;GL8LL;CACF;AKtPD;EA6DI,YAAA;EACA,8BAAA;EACA,uBAAA;EACA,mBAAA;EAEA,yBAAA;CL2LH;AK1LG;EACE,iBAAA;CL4LL;AK1LG;EACE,YAAA;CL4LL;AK1LG;;EAEE,wBAAA;CL4LL;AKvQD;EA+EI,cAAA;CL2LH;AK1QD;;;EAsFM,kBAAA;CLyLL;AK/QD;EA4FI,mBAAA;EACA,SAAA;EACA,WAAA;EACA,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;CLsLH;AKxRD;EF2LU,mCAAA;EEnFN,eAAA;EACA,YAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,mBAAA;EACA,aAAA;EACA,4DAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CLsLH;AKxSD;EAuHM,eAAA;CLoLL;AK3SD;EA0HM,cAAA;CLoLL;AK9SD;EA+HI,YAAA;CLkLH;AK7KD;EACE,mBAAA;EACA,0BAAA;CL+KD;AKjLD;EAKI,UAAA;EACA,gBAAA;CL+KH;AKrLD;EAQM,gBAAA;EACA,sBAAA;EACA,kBAAA;EACA,iBAAA;CLgLL;AK3LD;EAgBI,aAAA;EACA,wBAAA;EACA,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;EACA,UAAA;EACA,YAAA;ECxFF,mBAAA;CNuQD;AKvMD;EA2BM,YAAA;EACA,sBAAA;EACA,sBAAA;CL+KL;AK5MD;;;EA+BQ,kBAAA;CLkLP;AKjND;EAmCM,kBAAA;CLiLL;AK/JD;EA8EA;IA1FM,mBAAA;IACA,gBAAA;IACA,OAAA;IACA,SAAA;IACA,YAAA;IACA,oBAAA;IACA,mBAAA;GL+KH;EK3FH;IAlFQ,eAAA;GLgLL;CACF;AK5KD;EACE,YAAA;EACA,UAAA;EACA,UAAA;EACA,mBAAA;CL8KD;AKzJD;EAjBE;IACE,YAAA;GL6KD;EK1KD;IACE,UAAA;IACA,YAAA;GL4KD;EKzKD;IACE,kBAAA;IACA,qBAAA;IACA,kBAAA;GL2KD;CACF;AKtJD;EAhBE;IACE,mBAAA;GLyKD;EK1KD;;IAII,YAAA;IACA,YAAA;GL0KH;EK/KD;IAQI,UAAA;GL0KH;EKlLD;IAWI,aAAA;GL0KH;CACF;AK5JD;EAyBA;IAjCI,sBAAA;GLwKD;EKvIH;IA/BM,eAAA;IACA,mBAAA;IACA,OAAA;IACA,YAAA;GLyKH;CACF;AK7JD;EANE;IACE,mBAAA;GLsKD;CACF;AK3JD;EANE;IACE,mBAAA;GLoKD;CACF;AKxJD;EAPE;IACE,aAAA;GLkKD;CACF;AACD;;;GAGG;AOtaH;;EAEE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,kBAAA;EACA,iBAAA;EACA,aAAA;EACA,aAAA;EJuMQ,uEAAA;EAAA,+DAAA;CHqOT;AOpaC;EAsIF;;IAxIM,mBAAA;GP2aH;CACF;AOvaC;EAmIF;;IJfE,wCAAA;IAGQ,gCAAA;GHwTP;CACF;AO5aC;EA+HF;;IJfE,wCAAA;IAGQ,gCAAA;GHiUP;CACF;AOhbC;EA0HF;;IJfE,mCAAA;IAGQ,2BAAA;GH0UP;CACF;AOtbD;EACE,qBAAA;CPwbD;AOrbD;EAEI,0BAAA;CPsbH;AOjbD;EACE,mBAAA;EACA,YAAA;EACA,cAAA;EACA,iBAAA;CPmbD;AE3dC;;EAEE,aAAA;EACA,eAAA;CF6dH;AE3dC;EACE,YAAA;CF6dH;AO/bD;EAOI,YAAA;EACA,gBAAA;EACA,aAAA;CP2bH;AOpcD;EAYI,0BAAA;EACA,eAAA;EACA,mBAAA;EACA,WAAA;CP2bH;AO1cD;EAiBM,iBAAA;EACA,mBAAA;CP4bL;AO9cD;EAqBM,sBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;CP4bL;AOpdD;;;EA4BQ,kBAAA;CP6bP;AOtbD;EACE,iBAAA;EACA,UAAA;EACA,WAAA;CPwbD;AO3bD;EAMI,mBAAA;EACA,UAAA;EACA,WAAA;CPwbH;AOhcD;EAUM,4BAAA;EACA,eAAA;CPybL;AOpcD;;;EAeQ,YAAA;CP0bP;AOzcD;;EAoBM,gBAAA;EACA,kBAAA;CPybL;AO9cD;EAyBI,6BAAA;EACA,gBAAA;CPwbH;AOldD;EA6BI,YAAA;EACA,aAAA;EACA,WAAA;EACA,mBAAA;EACA,gBAAA;CPwbH;AOzdD;EJoEE,kCAAA;EAGQ,0BAAA;CHwZT;AO/dD;EAwCM,eAAA;CP0bL;AOleD;EA8CI,cAAA;EACA,iBAAA;EACA,WAAA;EACA,UAAA;EACA,kBAAA;CPubH;AOzeD;EAoDM,mBAAA;CPwbL;AO5eD;EAuDM,UAAA;CPwbL;AO/eD;EAyDQ,0BAAA;EACA,eAAA;EACA,gBAAA;CPybP;AOpfD;;;EA+DU,YAAA;CP0bT;AOzfD;;EAmEU,YAAA;CP0bT;AACD;;GAEG;AQpeH;EAvGI;;;IAMI,4BAAA;IACA,aAAA;GR2kBL;EQllBC;ILqIF,mCAAA;IAGQ,2BAAA;IK1HF,sBAAA;IACA,aAAA;GR2kBL;EQ1lBC;IAoBM,mBAAA;GRykBP;EQ7lBC;IAsBQ,gBAAA;GR0kBT;EQhmBC;IAyBQ,6BAAA;GR0kBT;EQvkBO;IAEI,gCAAA;GRwkBX;EQtmBC;IAoCQ,iBAAA;IACA,oBAAA;IACA,gCAAA;GRqkBT;EQjkBO;;IAMI,yBAAA;IACA,mBAAA;IACA,aAAA;IACA,WAAA;GR+jBX;EQxkBO;IAcI,OAAA;IACA,kBAAA;IACA,4BAAA;IACA,0BAAA;GR6jBX;EQ9kBO;IAoBI,UAAA;IACA,eAAA;GR6jBX;EQ5nBC;;;;;;IA6EI,wBAAA;IACA,iCAAA;GRujBL;EQroBC;IAoFM,YAAA;GRojBP;EQxoBC;IAsFQ,eAAA;IACA,mBAAA;IACA,oBAAA;IACA,gBAAA;GRqjBT;EQ9oBC;IA4FQ,cAAA;GRqjBT;EQjpBC;IAkGM,kBAAA;GRkjBP;CACF;AQ3iBD;;;EAGE,oBAAA;EACA,iBAAA;CR6iBD;AQ3iBD;EACE,kBAAA;CR6iBD;AQ3iBD;;EAEE,iBAAA;EACA,oBAAA;CR6iBD;AQ3iBD;EACE,mBAAA;CR6iBD;AQ9iBD;EAGI,mBAAA;EACA,SAAA;EACA,YAAA;EACA,iBAAA;CR8iBH;AACD;;GAEG;ASnrBH;EACE,gBAAA;EACA,cAAA;EACA,UAAA;CTqrBD;ASlrBD;;EAEE,OAAA;EACA,cAAA;EACA,aAAA;ENiLQ,mCAAA;CHsgBT;ASnrBD;EACE,mBAAA;EACA,kBAAA;EACA,cAAA;CTqrBD;AS/qBC;EA4PF;IA/PI,mBAAA;GTsrBD;CACF;AS7rBD;EAUI,mBAAA;CTsrBH;ASlrBG;;EAEE,SAAA;CTorBL;AS/qBD;;EAGI,SAAA;CTgrBH;ASvqBD;EAoOA;;;IAvOM,oBAAA;GTgrBH;CACF;ASzqBK;;;EAGE,qBAAA;CT2qBP;ASjrBD;EHmBE,iBAAA;CNiqBD;ASvqBK;;EAEE,iBAAA;EACA,mBAAA;EACA,mCAAA;EACA,qCAAA;CTyqBP;AS3rBD;EAqBQ,gBAAA;CTyqBP;ASnqBO;;;;EAIE,iBAAA;EACA,mBAAA;EACA,oBAAA;CTqqBT;ASzpBD;EAqLA;IA1LI,eAAA;GTkqBD;ESxeH;IAxLM,oBAAA;GTmqBH;CACF;AS/pBD;EACE,iBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;CTiqBD;AS9pBD;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;CTgqBD;AS7pBD;EACE,iBAAA;EACA,WAAA;EACA,gBAAA;CT+pBD;ASlqBD;EAMI,eAAA;EACA,mBAAA;CT+pBH;AE3wBC;;EAEE,aAAA;EACA,eAAA;CF6wBH;AE3wBC;EACE,YAAA;CF6wBH;AS9qBD;EASM,cAAA;CTwqBL;ASjrBD;EAaI,YAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;CTuqBH;ASzrBD;EAqBI,kBAAA;EACA,gBAAA;CTuqBH;AS7rBD;EAwBM,UAAA;CTwqBL;AShsBD;EA2BM,UAAA;EACA,gBAAA;CTwqBL;ASpsBD;EAgCI,UAAA;CTuqBH;ASnqBD;EACE,eAAA;CTqqBD;ASnqBC;;EAEE,oBAAA;CTqqBH;AS1qBD;EASI,uBAAA;CToqBH;AS7qBD;EAYQ,oBAAA;EACA,eAAA;CToqBP;ASlqBO;;;EAGE,2BAAA;EACA,6BAAA;CToqBT;ASlqBO;;;EAGE,oBAAA;CToqBT;ASlqBO;EACE,YAAA;CToqBT;AS9pBS;;;;EAIE,oBAAA;EACA,YAAA;CTgqBX;AStsBD;;EA+CI,YAAA;CT2pBH;ASrpBO;EACE,oBAAA;CTupBT;AS7sBD;EA0DY,eAAA;CTspBX;AS9oBD;EACE,eAAA;CTgpBD;AS9oBC;;EAEE,oBAAA;EACA,+BAAA;CTgpBH;AStpBD;EAUI,uBAAA;CT+oBH;ASzpBD;EAaQ,oBAAA;EACA,YAAA;CT+oBP;AS7oBO;;;EAGE,2BAAA;EACA,6BAAA;CT+oBT;AS7oBO;;;EAGE,oBAAA;CT+oBT;ASzoBS;;;;EAIE,oBAAA;EACA,YAAA;CT2oBX;AS/qBD;;EA6CI,YAAA;CTsoBH;ASnrBD;EAiDI,mBAAA;CTqoBH;ASloBO;EACE,oBAAA;CTooBT;ASzrBD;EAyDY,eAAA;CTmoBX;AACD;;;GAGG;AACH,wBAAwB;AUn5BxB;EACE,iBAAA;EACA,mBAAA;CVq5BD;AUv5BD;EAII,YAAA;CVs5BH;AU15BD;;;EASI,mBAAA;CVs5BH;AU/5BD;EAYI,0BAAA;EACA,YAAA;CVs5BH;AUn6BD;EAgBI,uBAAA;CVs5BH;AUj5BD;;;EAQI,aAAA;EAEA,iBAAA;EACA,UAAA;EACA,UAAA;CV64BH;AUz5BD;;;EAMM,mBAAA;CVw5BL;AU95BD;;;EJkDE,4BAAA;EACA,6BAAA;EACA,8BAAA;EACA,6BAAA;EIpCE,0BAAA;EACA,kBAAA;EACA,iCAAA;EACA,eAAA;EACA,gBAAA;CVs5BH;AU36BD;;;EJkDE,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,+BAAA;EIzBE,gBAAA;EACA,uBAAA;EACA,kBAAA;EACA,iCAAA;EACA,sBAAA;EAKA,mBAAA;CVo5BH;AUp5BG;EA2RJ;;;IA9RM,2BAAA;IACA,sBAAA;GV65BH;CACF;AU15BG;;;EACE,sBAAA;EACA,oBAAA;CV85BL;AUv8BD;;;EA+CI,kBAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;EACA,mBAAA;CV65BH;AUh9BD;;;EAqDM,eAAA;EACA,oBAAA;EVg6BJ,gCAAgC;EU/5B5B,iCAAA;CVi6BL;AU/5BK;;;EACE,oBAAA;EACA,sBAAA;CVm6BP;AU55BD;EAIM,eAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EACA,cAAA;CV25BL;AUn6BD;;;EAaQ,YAAA;CV25BP;AUn5BD;EAKM,UAAA;EAEA,mBAAA;CVg5BL;AUv5BD;EAUQ,4BAAA;EACA,YAAA;EACA,aAAA;CVg5BP;AU55BD;EAgBQ,WAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;EACA,mBAAA;CV+4BP;AUn6BD;EAuBU,eAAA;EACA,gBAAA;EACA,mBAAA;EACA,OAAA;EACA,SAAA;CV+4BT;AU16BD;EAgCQ,mBAAA;EACA,gBAAA;EACA,eAAA;CV64BP;AEphCC;;EAEE,aAAA;EACA,eAAA;CFshCH;AEphCC;EACE,YAAA;CFshCH;AU34BD;EAGM,cAAA;CV24BL;AU94BD;EAMQ,gBAAA;EACA,WAAA;EACA,mBAAA;EACA,eAAA;CV24BP;AUp5BD;EAaQ,WAAA;EACA,UAAA;CV04BP;AUp4BD;EC/KE,2BAAA;EACC,0BAAA;EDiLC,mBAAA;EACA,oBAAA;EACA,aAAA;CVs4BH;AUp4BG;;EC9KF,gCAAA;EACC,+BAAA;CXsjCF;AUh5BD;EAaM,cAAA;EACA,cAAA;EACA,mBAAA;CVs4BL;AUr5BD;EAkBQ,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,0BAAA;EACA,uCAAA;CVs4BP;AU75BD;EA0BQ,WAAA;EACA,YAAA;EACA,gCAAA;EACA,gBAAA;EAEA,iBAAA;CVq4BP;AUp6BD;EAiCU,eAAA;EACA,gBAAA;CVs4BT;AUx6BD;EAyCM,cAAA;EACA,iCAAA;EACA,8BAAA;CVk4BL;AEllCC;;EAEE,aAAA;EACA,eAAA;CFolCH;AEllCC;EACE,YAAA;CFolCH;AUr7BD;EA8CQ,uBAAA;CV04BP;AUr4BK;EAsHN;IAzHU,4BAAA;IACA,uBAAA;GV44BP;CACF;AU97BD;EAwDM,0BAAA;EACA,cAAA;CVy4BL;AEvmCC;;EAEE,aAAA;EACA,eAAA;CFymCH;AEvmCC;EACE,YAAA;CFymCH;AU18BD;EA4DQ,eAAA;CVi5BP;AU54BO;EAwGR;IA1GY,0BAAA;GVk5BT;CACF;AUl9BD;EAsEI,YAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;EACA,iBAAA;CV+4BH;AUx4BC;EAuFF;IA5FM,YAAA;IACA,gBAAA;IACA,iBAAA;IACA,kBAAA;GVi5BH;CACF;AACD;qEACqE;AU74BrE;EACE,gDAAA;EAAA,wCAAA;EPvPA,qCAAA;EAEQ,6BAAA;CHuoCT;AU94BD;EACE;IACE,+DAAA;IAAA,uDAAA;IACA,oCAAA;IACA,WAAA;GVg5BD;EU74BD;IACE,gEAAA;IAAA,wDAAA;IACA,oCAAA;GV+4BD;EU54BD;IACE,+DAAA;IAAA,uDAAA;IACA,WAAA;GV84BD;EU34BD;IACE,+DAAA;IAAA,uDAAA;GV64BD;EU14BD;IACE,sCAAA;IAAA,8BAAA;GV44BD;CACF;AU14BD;EACE;IACE,+DAAA;IACA,4CAAA;IACA,WAAA;GV44BD;EUz4BD;IACE,gEAAA;IACA,4CAAA;GV24BD;EUx4BD;IACE,+DAAA;IACA,WAAA;GV04BD;EUv4BD;IACE,+DAAA;GVy4BD;EUt4BD;IACE,sCAAA;GVw4BD;CACF;AACD,kCAAkC;AUr4BlC;EAEI,mBAAA;CVs4BH;AUx4BD;EAIM,mBAAA;EACA,SAAA;EACA,WAAA;CVu4BL;AUp3BD;EAdE;IACE,aAAA;GVq4BD;EUt4BD;IAGI,iBAAA;GVs4BH;EUz4BD;IAKM,mBAAA;IACA,UAAA;IACA,WAAA;IACA,uBAAA;IACA,iBAAA;GVu4BL;CACF;AACD;;;GAGG;AY9tCH;ENqEE,iBAAA;EMnEA,iBAAA;EACA,sBAAA;CZguCD;AY/tCC;EACE,sBAAA;EACA,iBAAA;CZiuCH;AY/tCC;;;EAGE,YAAA;EACA,WAAA;CZiuCH;AY9tCC;EACE,yBAAA;EACA,sBAAA;EACA,iBAAA;CZguCH;AY3tCC;EAEI,eAAA;CZ4tCL;AY9tCC;EAKI,sBAAA;EACA,iBAAA;CZ4tCL;AYxtCC;EAEI,eAAA;CZytCL;AY3tCC;EAKI,sBAAA;EACA,iBAAA;CZytCL;AYrtCC;EAEI,eAAA;CZstCL;AYxtCC;EAKI,sBAAA;EACA,iBAAA;CZstCL;AACD,iBAAiB;AYjtCjB;ENcE,iBAAA;EMXE,sBAAA;EACA,uBAAA;CZktCH;AACD,mBAAmB;AY7sCf;;ENIF,iBAAA;CN6sCD;AY3sCD;EACE,gBAAA;CZ6sCD;AACD,gDAAgD;AY1sChD;EACI,kBAAA;CZ4sCH;AYzsCD;;;EAGE,kBAAA;CZ2sCD;AYzsCD;;;EAGE,kBAAA;CZ2sCD;AACD;;;GAGG;AaryCH;;EV+DU,iBAAA;CH2uCT;AavyCC;;;;EPgEA,mBAAA;CN6uCD;AACD,oBAAoB;AaxyCpB;;EAEE,aAAA;Cb0yCD;AazyCC;;;;EPuDA,mBAAA;CNwvCD;Aa3yCD;;EAEE,YAAA;Cb6yCD;Aa5yCC;;;;EPgDA,mBAAA;CNkwCD;Aa9yCD;;EAEE,YAAA;CbgzCD;Aa/yCC;;;;EPyCA,mBAAA;CN4wCD;AACD,mBAAmB;AajzCnB;EACE,mBAAA;EACA,YAAA;EACA,cAAA;EACA,sBAAA;EACA,mBAAA;CbmzCD;AaxzCD;EAOI,YAAA;EACA,mBAAA;EACA,UAAA;CbozCH;AahzCC;;EAEE,YAAA;CbkzCH;Aa/yCC;;EAEE,YAAA;CbizCH;Aa/yCC;;EAEE,WAAA;CbizCH;Aa5yCD;EAEI,iBAAA;Cb6yCH;Aa/yCD;EAKI,aAAA;Cb6yCH;AACD,2DAA2D;AazyC3D;EAEI,UAAA;Cb0yCH;AapyCD;;ECjFE,0BAAA;Cdy3CD;Act3CC;;ECkDE,sMAAA;Cf00CH;Aa1yCD;;ECrFE,0BAAA;Cdm4CD;Ach4CC;;ECkDE,sMAAA;Cfo1CH;Aa/yCD;;EC1FE,0BAAA;Cd64CD;Ac14CC;;ECkDE,sMAAA;Cf81CH;AapzCD;;EC/FE,0BAAA;Cdu5CD;Acp5CC;;ECkDE,sMAAA;Cfw2CH;AazzCD;;ECpGE,0BAAA;Cdi6CD;Ac95CC;;ECkDE,sMAAA;Cfk3CH;AACD;;;GAGG;AgBz6CH;EVoEE,mBAAA;EUlEA,mBAAA;EACA,eAAA;EACA,oBAAA;EACA,yCAAA;ChB26CD;AgBh7CD;EAQI,cAAA;ChB26CH;AgBn7CD;EAYI,mBAAA;EACA,mBAAA;EACA,eAAA;EACA,YAAA;EACA,gCAAA;EACA,eAAA;EACA,YAAA;EACA,+BAAA;EACA,sBAAA;ChB06CH;AgBz6CG;EACE,YAAA;EACA,gCAAA;ChB26CL;AgBl8CD;EA4BI,gBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;EACA,WAAA;ChBy6CH;AgBz8CD;EAqCI,gBAAA;ChBu6CH;AgB58CD;EAuCM,eAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;ChBw6CL;AgBl9CD;;EA+CI,aAAA;ChBu6CH;AgBt9CD;Eb2LU,4BAAA;EatIN,mBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,gBAAA;EACA,2BAAA;ChBu6CH;AgBn6CC;EACE,sBAAA;EACA,eAAA;ChBq6CH;AgBv6CC;EAKI,gBAAA;ChBq6CL;AgBp5CD;EAVE;IACE,mBAAA;GhBi6CD;EgBl6CD;IAGI,cAAA;GhBk6CH;EgBr6CD;IAMI,gBAAA;GhBk6CH;CACF;AACD;;;GAGG;AiBx/CH;EACE,mBAAA;EXoEA,mBAAA;EWlEA,oBAAA;EACA,8BAAA;EACA,oBAAA;EACA,YAAA;EACA,yCAAA;CjB0/CD;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBr/CC;;EAGI,cAAA;CjBs/CL;AiBvhDD;EAuCM,iCAAA;EACA,UAAA;CjBm/CL;AiBl/CK;EACE,oBAAA;CjBo/CP;AiB9+CC;EAEI,kBAAA;EACA,eAAA;CjB++CL;AiBliDD;EAwDI,gCAAA;CjB6+CH;AiBriDD;EA2DI,+BAAA;CjB6+CH;AiBt+CC;EACE,cAAA;CjBw+CH;AiBz+CC;EAIM,wBAAA;CjBw+CP;AiBp+CO;;EACE,+BAAA;CjBu+CT;AiBj+CG;EXvCF,0BAAA;CN2gDD;AiBp+CG;EXrCA,YAAA;EACA,oBAAA;EACA,0BAAA;CN4gDH;AiBz+CG;;EXhCE,YAAA;CN6gDL;AiB1+CG;EX1CF,0BAAA;CNuhDD;AiB7+CG;EXxCA,YAAA;EACA,oBAAA;EACA,0BAAA;CNwhDH;AiBl/CG;;EXnCE,YAAA;CNyhDL;AiBn/CG;EX7CF,0BAAA;CNmiDD;AiBt/CG;EX3CA,YAAA;EACA,oBAAA;EACA,0BAAA;CNoiDH;AiB3/CG;;EXtCE,YAAA;CNqiDL;AiB5/CG;EXhDF,0BAAA;CN+iDD;AiB//CG;EX9CA,YAAA;EACA,oBAAA;EACA,0BAAA;CNgjDH;AiBpgDG;;EXzCE,YAAA;CNijDL;AiBrgDG;EXnDF,0BAAA;CN2jDD;AiBxgDG;EXjDA,YAAA;EACA,oBAAA;EACA,0BAAA;CN4jDH;AiB7gDG;;EX5CE,YAAA;CN6jDL;AiB9gDG;EXtDF,0BAAA;CNukDD;AiBjhDG;EXpDA,YAAA;EACA,oBAAA;EACA,0BAAA;CNwkDH;AiBthDG;;EX/CE,YAAA;CNykDL;AiBxjDC;EAmCI,UAAA;EACA,iBAAA;CjBwhDL;AiBphDG;EAEI,YAAA;CjBqhDP;AiBjoDD;EAqHM,mBAAA;CjB+gDL;AiBpoDD;EA4HI,mBAAA;EACA,YAAA;EACA,iBAAA;EACA,gBAAA;EACA,qBAAA;CjB2gDH;AiBvgDD;;;;EAKI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,YAAA;EACA,aAAA;CjBwgDH;AiBjhDD;;EAaI,YAAA;EACA,qCAAA;EX7EF,mBAAA;CNslDD;AiBvhDD;;EAiBM,mBAAA;EACA,SAAA;EACA,UAAA;EACA,mBAAA;EACA,kBAAA;EACA,YAAA;EACA,gBAAA;CjB0gDL;AiBjiDD;;EA4BI,+BAAA;CjBygDH;AEhqDC;;;;;;EAEE,aAAA;EACA,eAAA;CFsqDH;AEpqDC;;;EACE,YAAA;CFwqDH;AiB3gDD;EACE,YAAA;EACA,eAAA;EACA,cAAA;EACA,mBAAA;CjB6gDD;AiB1gDC;EACE,iCAAA;CjB4gDH;AiB3gDG;EACE,oBAAA;CjB6gDL;AiBvhDD;;;;EAmBI,sBAAA;EACA,gBAAA;EACA,UAAA;EACA,eAAA;CjB0gDH;AiBhiDD;;;EA2BI,kBAAA;CjB0gDH;AiBriDD;EA8BI,mBAAA;EACA,YAAA;EACA,SAAA;CjB0gDH;AiB1iDD;EAkCM,mBAAA;CjB2gDL;AiBxgDG;EAEI,SAAA;EACA,WAAA;CjBygDP;AiBlgDD;EACE,aAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;CjBogDD;AiBngDC;;EAEE,eAAA;CjBqgDH;AiBngDC;EACE,iBAAA;CjBqgDH;AiBhgDD;EXjKE,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,+BAAA;EWgKA,cAAA;CjBqgDD;AiBpgDC;EN9OA,6BAAA;EACC,4BAAA;CXqvDF;AiB3gDD;EAQI,iBAAA;CjBsgDH;AiB9gDD;EAaI,gBAAA;CjBogDH;AiBjhDD;EAiBI,cAAA;CjBmgDH;AiBjgDC;EACE,aAAA;CjBmgDH;AiBvhDD;EXjKE,0BAAA;EACA,2BAAA;EACA,8BAAA;EACA,+BAAA;CN2rDD;AiB7hDD;EXjKE,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,6BAAA;CNisDD;AiBngDD;EXjME,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,+BAAA;EWgMA,8BAAA;EACA,cAAA;EACA,uBAAA;CjBwgDD;AiBtgDD;EAEE,eAAA;CjBugDD;AiBjgDC;EAuMF;IA1MM,YAAA;IACA,mBAAA;GjBwgDH;CACF;AiBngDD;EACE,oBAAA;CjBqgDD;AiBtgDD;EAII,eAAA;EACA,8BAAA;CjBqgDH;AE7xDC;;EAEE,aAAA;EACA,eAAA;CF+xDH;AE7xDC;EACE,YAAA;CF+xDH;AiB5gDG;EACE,iBAAA;CjB8gDL;AiB5gDG;EACE,eAAA;CjB8gDL;AiBxhDD;EAcM,YAAA;CjB6gDL;AiB3hDD;EAkBI,kBAAA;EACA,YAAA;CjB4gDH;AiB/hDD;EAsBI,YAAA;EACA,eAAA;EACA,iBAAA;CjB4gDH;AiBpiDD;EA2BI,iBAAA;EACA,gBAAA;CjB4gDH;AACD,uBAAuB;AiBpgDvB;EACE,UAAA;EACA,WAAA;EACA,iBAAA;EACA,eAAA;CjBsgDD;AiB1gDD;EX5PE,mBAAA;EWoQE,cAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,YAAA;CjBsgDH;AiBrgDG;EACE,iBAAA;CjBugDL;AiBrhDD;EAkBM,qBAAA;CjBsgDL;AiBxhDD;EAsBM,sBAAA;EACA,iBAAA;EACA,iBAAA;CjBqgDL;AiB7hDD;EA6BM,kBAAA;EACA,eAAA;CjBmgDL;AiBjiDD;EAmCM,cAAA;EACA,aAAA;EACA,eAAA;CjBigDL;AiBtiDD;;;EAwCQ,kBAAA;EACA,gBAAA;CjBmgDP;AiB//CG;EACE,sBAAA;CjBigDL;AiB9/CG;EACE,YAAA;CjBggDL;AiBjgDG;EAGI,8BAAA;EACA,iBAAA;CjBigDP;AiBrgDG;EAQI,+BAAA;CjBggDP;AiBzjDD;EAgEI,2BAAA;CjB4/CH;AiB5jDD;EAmEI,2BAAA;CjB4/CH;AiB/jDD;EAsEI,2BAAA;CjB4/CH;AiBlkDD;EAyEI,2BAAA;CjB4/CH;AiBrkDD;EA4EI,2BAAA;CjB4/CH;AiBxkDD;EAgFI,sBAAA;EACA,aAAA;EACA,cAAA;CjB2/CH;AACD,uGAAuG;AiBr/CvG;EACE,2BAAA;CjBu/CD;AiBx/CD;EAKI,oBAAA;CjBs/CH;AE54DC;;EAEE,aAAA;EACA,eAAA;CF84DH;AE54DC;EACE,YAAA;CF84DH;AiBngDD;EAQM,YAAA;EACA,aAAA;EACA,8BAAA;EX/VJ,mBAAA;CN81DD;AiBzgDD;EAeM,0BAAA;CjB6/CL;AiB5gDD;EAkBM,0BAAA;CjB6/CL;AiB/gDD;EAuBM,kBAAA;EACA,kBAAA;CjB2/CL;AiBnhDD;EA0BQ,eAAA;EACA,iBAAA;CjB4/CP;AiBvhDD;EXrVE,mBAAA;EWuXI,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,cAAA;CjBy/CL;AiB9hDD;EAuCQ,kBAAA;EACA,iBAAA;EACA,gBAAA;CjB0/CP;AiBniDD;;EA4CQ,iBAAA;EACA,gBAAA;EACA,mBAAA;EACA,UAAA;CjB2/CP;AE37DC;;EAEE,aAAA;EACA,eAAA;CF67DH;AE37DC;EACE,YAAA;CF67DH;AiBx/CD;EACE,iBAAA;CjB0/CD;AiBr/CD;EAEI,YAAA;CjBs/CH;AACD;;;GAGG;AkBt9DH;EACE,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,yCAAA;EZgEA,mBAAA;EY9DA,oBAAA;ClBw9DD;AkB/9DD;EASI,gBAAA;ClBy9DH;AkBl+DD;EAYI,+BAAA;EACA,4BAAA;EACA,YAAA;ClBy9DH;AkBx9DG;;EZsDF,iBAAA;CNs6DD;AkB3+DD;EAoBM,iBAAA;ClB09DL;AkBt9DD;EZiDE,4BAAA;EACA,2BAAA;EACA,8BAAA;EACA,+BAAA;EYlDA,eAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,+BAAA;ClB29DD;AkBp+DD;EAWI,gBAAA;ClB49DH;AkBz9DD;EACE,kBAAA;EACA,kBAAA;ClB29DD;AkBz9DD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;ClB29DD;AkBz9DD;;EAEE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;ClB29DD;AkBz9DD;EACE,0BAAA;ClB29DD;AkBz9DD;EACE,eAAA;ClB29DD;AkBx9DD;EACE,UAAA;ClB09DD;AACD;;;GAGG;AmB5hEH;EboEE,mBAAA;EHJQ,iBAAA;EgB7DR,8BAAA;CnB+hED;AmB7hEC;EACE,0BAAA;CnB+hEH;AmB3hEC;Eb0DA,iBAAA;EatDE,iBAAA;EACA,kBAAA;CnB6hEH;AmBzhEC;EAGE,iDAAA;CnB2hEH;AmBxhEC;EACE,cAAA;CnB0hEH;AmBthEC;EACE,mBAAA;EACA,iBAAA;CnBwhEH;AmB1hEC;EAII,mBAAA;EACA,OAAA;EACA,SAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;EACA,kBAAA;EC1CJ,WAAA;EAGA,yBAAA;EDyCI,cAAA;EACA,kBAAA;EACA,gBAAA;EACA,eAAA;CnB0hEL;AmBphED;EACE,0BAAA;EACA,YAAA;EACA,mBAAA;CnBshED;AmBrhEC;;;EAGE,0BAAA;CnBuhEH;AmBphED;EACE,0BAAA;EACA,sBAAA;CnBshED;AmBrhEC;;;EACE,0BAAA;CnByhEH;AmBthED;EACE,0BAAA;EACA,sBAAA;CnBwhED;AmBvhEC;;;EACE,0BAAA;CnB2hEH;AmBxhED;EACE,0BAAA;EACA,sBAAA;CnB0hED;AmBzhEC;;;EACE,0BAAA;CnB6hEH;AmB1hED;EACE,0BAAA;EACA,sBAAA;CnB4hED;AmB3hEC;;;EACE,0BAAA;CnB+hEH;AmB5hED;EACE,0BAAA;EACA,sBAAA;CnB8hED;AmB7hEC;;;EACE,0BAAA;CnBiiEH;AmB9hED;EACE,uBAAA;EACA,wBAAA;EACA,YAAA;CnBgiED;AmB/hEC;;;EAGE,gCAAA;EACA,uCAAA;CnBiiEH;AmB9hED;EhB3CU,iBAAA;CH6kET;AmB9hED;EhB/CU,+CAAA;CHilET;AmB9hED;Eb/CE,mBAAA;EaiDA,mBAAA;EACA,kBAAA;EACA,sBAAA;EACA,gBAAA;EACA,aAAA;EACA,mBAAA;EACA,YAAA;EACA,uBAAA;EACA,0BAAA;EACA,gBAAA;CnBgiED;AmB3iED;;;EAcI,gBAAA;EACA,eAAA;CnBkiEH;AmB/hEC;EACE,oBAAA;EACA,YAAA;EACA,mBAAA;CnBiiEH;AmB9hEC;;EAGE,iDAAA;CnBiiEH;AmB5jED;EAgCI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,iBAAA;CnB+hEH;AACD;;;GAGG;AqBzrEH;EfmEE,mBAAA;EejEA,mBAAA;EACA,6BAAA;EACA,4BAAA;CrB2rED;AqB/rED;EAMI,YAAA;EACA,2BAAA;CrB4rEH;AqB3rEG;EACE,YAAA;CrB6rEL;AqBtsED;EAaI,cAAA;EACA,iBAAA;CrB4rEH;AqB1sED;EAiBI,iBAAA;CrB4rEH;AqB7sED;;EAqBI,uBAAA;CrB4rEH;AqBxrEC;EAEE,sBAAA;CrByrEH;AqBvrEC;EAEE,sBAAA;CrBwrEH;AqBtrEC;EAEE,sBAAA;CrBurEH;AqBrrEC;EAEE,sBAAA;CrBsrEH;AACD;;;GAGG;AsBluEH;EhBoEE,mBAAA;CNiqED;AsBruED;EAGI,iBAAA;CtBquEH;AsBxuED;EAMI,mBAAA;CtBquEH;AsB3uED;EASI,YAAA;EFXF,aAAA;EAGA,0BAAA;CpB+uED;AsBruEG;EFbF,aAAA;EAGA,0BAAA;CpBmvED;AsBpvED;EAgBI,YAAA;EACA,2BAAA;CtBuuEH;AsBluED;EAEE,sBAAA;CtBmuED;AsBjuED;;EAGE,sBAAA;CtBkuED;AsBhuED;EAEE,sBAAA;CtBiuED;AsB/tED;EAEE,sBAAA;CtBguED;AACD;;;GAGG;AuBzwEH;;;EAII,YAAA;EACA,oBAAA;CvB0wEH;AACD,eAAe;AuBtwEf;EjB0DE,iBAAA;EiBvDE,kCAAA;EACA,YAAA;CvBuwEH;AuB3wED;;;EAQM,kBAAA;CvBwwEL;AuBhxED;;;EAcI,0BAAA;CvBuwEH;AuBrxED;EAiBI,iBAAA;CvBuwEH;AACD,iBAAiB;AuBpwEjB;EjBqCE,iBAAA;EiBlCE,cAAA;EACA,mCAAA;EACA,YAAA;CvBqwEH;AuB1wED;;EASI,wBAAA;EACA,YAAA;EACA,cAAA;EACA,2BAAA;CvBqwEH;AuBjxED;EAgBI,8BAAA;EACA,YAAA;EACA,oBAAA;EACA,kBAAA;EACA,0BAAA;CvBowEH;AACD,cAAc;AuBhwEd;EACE,oBAAA;EACA,iBAAA;EACA,yCAAA;EACA,mBAAA;CvBkwED;AuBtwED;EAMI,UAAA;EACA,6BAAA;EZjEF,6BAAA;EACC,4BAAA;CXq0EF;AuB5wED;EAUM,kCAAA;EACA,oBAAA;EAuBA,kBAAA;CvB+uEL;AuBjxED;EAaQ,YAAA;EjBDN,iBAAA;CNywED;AuBtwEO;EACE,YAAA;CvBwwET;AuBtwEO;;EAEE,wBAAA;EACA,UAAA;CvBwwET;AuBtwEO;EACE,YAAA;CvBwwET;AuBrwEK;;;EAII,0BAAA;CvBswET;AuBryED;EAsCM,0BAAA;CvBkwEL;AuBjwEK;;EAEE,uBAAA;EACA,YAAA;CvBmwEP;AuB7yED;EA6CQ,8BAAA;EACA,2BAAA;EACA,4BAAA;CvBmwEP;AuBlzED;EAqDM,eAAA;CvBgwEL;AuB/vEK;EAEI,+BAAA;CvBgwET;AuB1vEG;EACE,sBAAA;CvB4vEL;AuB7vEG;EAGI,aAAA;CvB6vEP;AuBhwEG;EAMI,gBAAA;CvB6vEP;AuBnwEG;EAQM,uBAAA;CvB8vET;AuB5vEO;EAEI,2BAAA;EACA,gCAAA;CvB6vEX;AuBx0ED;EAkFM,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,YAAA;CvByvEL;AuB90ED;;;EAyFQ,kBAAA;CvB0vEP;AuBn1ED;EA+FI,iBAAA;EACA,cAAA;EZlJF,gCAAA;EACC,+BAAA;CX04EF;AuBpvEG;;EAEE,wBAAA;EACA,YAAA;CvBsvEL;AACD,gBAAgB;AuBjvEhB;EAEI,oBAAA;EACA,YAAA;CvBkvEH;AuBhvEC;EjBvGA,4BAAA;CN01ED;AACD;;;GAGG;AwBl6EH;;;;;;EAQQ,8BAAA;CxBk6EP;AwB16ED;EAcI,iCAAA;CxB+5EH;AwB76ED;EAkBI,gBAAA;CxB85EH;AwBz5ED;EACE,0BAAA;CxB25ED;AwB55ED;;;;;;EAQQ,0BAAA;CxB45EP;AwBp6ED;;EAeM,yBAAA;CxBy5EL;AwBn5EC;;;EAGE,UAAA;CxBq5EH;AACD,4BAA4B;AwBh5E1B;;;EACE,mBAAA;CxBo5EH;AwBh5ED;EAEI,iBAAA;CxBi5EH;AwBn5ED;EAKI,kBAAA;CxBi5EH;AACD;;;GAGG;AyBr9EH;EACE,0BAAA;EACA,YAAA;CzBu9ED;AACD;;;GAGG;A0B79EH;EfOE,8BAAA;EACC,6BAAA;EeLC,mBAAA;EACA,mBAAA;EACA,WAAA;C1B+9EH;A0B79EC;EvBmIA,mCAAA;EAGQ,2BAAA;CH61ET;A0B79ED;EvB6HE,mCAAA;EAGQ,2BAAA;EuB9HR,cAAA;EACA,cAAA;EACA,eAAA;C1Bk+ED;A0Bh+ED;;EAEE,eAAA;C1Bk+ED;A0Bh+ED;EAEE,oBAAA;C1Bi+ED;AEj/EC;;EAEE,aAAA;EACA,eAAA;CFm/EH;AEj/EC;EACE,YAAA;CFm/EH;A0Bv+ED;;EvBuLU,+CAAA;EAAA,uCAAA;CHuzET;A0B1+ED;EpBsCE,mBAAA;EoBpCA,mBAAA;EACA,kBAAA;EACA,oBAAA;EACA,0BAAA;EACA,qBAAA;EACA,YAAA;C1B4+ED;A0Bz+EC;;EAEE,mBAAA;EACA,YAAA;EACA,UAAA;EACA,0BAAA;EACA,4BAAA;EACA,aAAA;EACA,UAAA;EACA,SAAA;EACA,qBAAA;C1B2+EH;A0Bx+EC;EACE,kBAAA;EACA,iBAAA;C1B0+EH;A0Bx+EC;EACE,kBAAA;EACA,iBAAA;C1B0+EH;A0Bx+EC;EACE,mBAAA;EACA,eAAA;C1B0+EH;A0Bz+EG;;EAEE,YAAA;EACA,WAAA;EACA,gCAAA;EACA,2BAAA;C1B2+EL;A0Bv+ED;EpBLE,mBAAA;EoBOA,YAAA;EACA,YAAA;EACA,aAAA;C1By+ED;A0Bx+EC;EACE,aAAA;C1B0+EH;A0Bv+ED;EACE,eAAA;EACA,mBAAA;EACA,gBAAA;C1By+ED;A0Bv+ED;EACE,iBAAA;C1By+ED;A0Bv+ED;EACE,YAAA;C1By+ED;A0Bt+ED;EvB2CE,mCAAA;EAGQ,2BAAA;CH87ET;A0Bv+ED;EvBsCE,sCAAA;EAGQ,8BAAA;EuBvCR,mBAAA;EACA,OAAA;EACA,UAAA;EACA,cAAA;EACA,YAAA;EACA,oBAAA;EACA,YAAA;EACA,eAAA;C1B4+ED;A0Bx+ED;EAII,4CAAA;EACA,cAAA;EACA,UAAA;C1Bu+EH;AErlFC;;EAEE,aAAA;EACA,eAAA;CFulFH;AErlFC;EACE,YAAA;CFulFH;A0B9+EG;EACE,oBAAA;C1Bg/EL;A0B5+ED;EpBxDE,mBAAA;EoB0DA,YAAA;EACA,YAAA;C1B8+ED;A0B5+ED;EACE,kBAAA;EACA,YAAA;C1B8+ED;A0B5+ED;;EAEE,eAAA;C1B8+ED;A0B5+ED;EACE,iBAAA;C1B8+ED;A0B5+ED;EACE,gBAAA;C1B8+ED;A0B5+ED;EACE,YAAA;EACA,oBAAA;C1B8+ED;A0B5+ED;EACE,YAAA;C1B8+ED;A0B1+ED;EpBhGI,oBAAA;EACA,sBAAA;EACA,YAAA;CN6kFH;AM5kFG;;EAEE,2BAAA;CN8kFL;A0Bh/ED;EpBnGI,oBAAA;EACA,sBAAA;EACA,YAAA;CNslFH;AMrlFG;;EAEE,2BAAA;CNulFL;A0Bt/ED;EpBtGI,oBAAA;EACA,sBAAA;EACA,YAAA;CN+lFH;AM9lFG;;EAEE,2BAAA;CNgmFL;A0B5/ED;EpBzGI,oBAAA;EACA,sBAAA;EACA,YAAA;CNwmFH;AMvmFG;;EAEE,2BAAA;CNymFL;A0BlgFD;EpB5GI,oBAAA;EACA,sBAAA;EACA,YAAA;CNinFH;AMhnFG;;EAEE,2BAAA;CNknFL;AACD;;;GAGG;A2BprFH;EAGI,WAAA;EACA,YAAA;EACA,cAAA;EACA,mBAAA;C3BorFH;A2B1rFD;ErBqEE,mBAAA;EqB5DI,gBAAA;EACA,aAAA;C3BqrFL;A2BlrFK;;EAEE,YAAA;C3BorFP;A2B/qFD;;EAEE,eAAA;C3BirFD;A2B/qFD;EACE,iBAAA;EACA,YAAA;EACA,iBAAA;EACA,oBAAA;EACA,wBAAA;C3BirFD;A2B/qFD;EACE,YAAA;EACA,gBAAA;C3BirFD;AACD;;;GAGG;A4BttFH;EACE,+BAAA;C5BwtFD;A4BttFD;EtBkEE,iBAAA;EHJQ,2CAAA;EyB3DR,UAAA;C5BytFD;A4BrtFD;EA2DA;IzBJU,2CAAA;GHmqFP;CACF;A4B1tFD;EACE,6BAAA;C5B4tFD;A4B1tFD;EACE,0BAAA;C5B4tFD;A4BxtFD;;EAOI,sBAAA;C5BqtFH;A4BltFD;;EAOI,sBAAA;C5B+sFH;A4B5sFD;;EAOI,sBAAA;C5BysFH;A4BtsFD;;EAOI,sBAAA;C5BmsFH;A4BhsFD;;EAOI,sBAAA;C5B6rFH;AACD;;;GAGG;A6BlwFH;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;EACA,iBAAA;C7BowFD;A6BzwFD;;EAOI,YAAA;C7BswFH;A6BlwFD;;EAEE,oBAAA;C7BowFD;A6BjwFD;;EAEE,aAAA;EACA,gBAAA;C7BmwFD;A6B9vFD;EAqBA;;IAxBI,WAAA;IACA,iBAAA;G7BswFD;CACF;A6BnwFD;;EAEE,iBAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;C7BqwFD;A6B1wFD;;EAOI,YAAA;C7BuwFH;A6BpwFD;;EAEE,UAAA;EACA,mBAAA;EACA,0BAAA;C7BswFD;A6BpwFD;EACE,eAAA;C7BswFD;AACD;;;GAGG;A8BtzFH;EACE,aAAA;EACA,yBAAA;C9BwzFD;A8BnzFC;EAyBF;IA5BI,YAAA;G9B0zFD;CACF;A8B/zFD;EAQI,YAAA;EACA,iBAAA;EACA,iBAAA;C9B0zFH;A8BrzFC;EAiBF;IApBM,YAAA;IACA,mBAAA;G9B4zFH;CACF;A8B10FD;EAkBI,mBAAA;EAWA,eAAA;C9BizFH;A8BxzFG;EAUJ;IAZM,eAAA;G9B8zFH;CACF;A8Bn1FD;EAuBM,iBAAA;EACA,gBAAA;C9B+zFL;A8B3zFG;EAIJ;IANQ,mBAAA;G9Bi0FL;CACF;AACD;;;;;;;GAOG;A+B11FH;EACE,mBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;C/B41FD;A+Bl2FD;EAQI,mBAAA;EACA,QAAA;EACA,OAAA;EACA,UAAA;EACA,YAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,2CAAA;C/B61FH;A+B31FC;EACE,mBAAA;C/B61FH;A+B91FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B81FL;A+B31FC;EACE,mBAAA;C/B61FH;A+B91FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B81FL;A+B31FC;EACE,mBAAA;C/B61FH;A+B91FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B81FL;A+Bz1FD;EA3CE,mBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EAwCA,aAAA;EACA,YAAA;EACA,WAAA;C/Bg2FD;A+Bp2FD;EApCI,mBAAA;EACA,QAAA;EACA,OAAA;EACA,UAAA;EACA,YAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,2CAAA;C/B24FH;A+Bz4FC;EACE,mBAAA;C/B24FH;A+B54FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B44FL;A+Bz4FC;EACE,mBAAA;C/B24FH;A+B54FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B44FL;A+Bz4FC;EACE,mBAAA;C/B24FH;A+B54FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B44FL;A+Bv4FD;EAMI,aAAA;EACA,mBAAA;EACA,YAAA;C/Bo4FH;A+Bl4FC;EACE,aAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;C/Bo4FH;A+Bl4FC;EACE,aAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;C/Bo4FH;A+Bl4FC;EACE,aAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;C/Bo4FH;A+B13FD;ECxFE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCq9FD;AgCn9FC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCq9FP;AgCn9FC;;;EAGE,uBAAA;ChCq9FH;AgCh9FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC89FT;A+Bn6FD;ECtDI,eAAA;EACA,uBAAA;ChC49FH;A+Bt6FD;ECzFE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCkgGD;AgChgGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCkgGP;AgChgGC;;;EAGE,uBAAA;ChCkgGH;AgC7/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC2gGT;A+B/8FD;ECvDI,eAAA;EACA,uBAAA;ChCygGH;A+Bl9FD;EC1FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC+iGD;AgC7iGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC+iGP;AgC7iGC;;;EAGE,uBAAA;ChC+iGH;AgC1iGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCwjGT;A+B3/FD;ECxDI,eAAA;EACA,uBAAA;ChCsjGH;A+B9/FD;EC3FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC4lGD;AgC1lGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC4lGP;AgC1lGC;;;EAGE,uBAAA;ChC4lGH;AgCvlGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCqmGT;A+BviGD;ECzDI,eAAA;EACA,uBAAA;ChCmmGH;A+B1iGD;EC5FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCyoGD;AgCvoGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCyoGP;AgCvoGC;;;EAGE,uBAAA;ChCyoGH;AgCpoGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCkpGT;A+BnlGD;EC1DI,eAAA;EACA,uBAAA;ChCgpGH;A+BtlGD;EC7FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCsrGD;AgCprGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCsrGP;AgCprGC;;;EAGE,uBAAA;ChCsrGH;AgCjrGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC+rGT;A+B/nGD;EC3DI,eAAA;EACA,uBAAA;ChC6rGH;A+BloGD;EC9FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCmuGD;AgCjuGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCmuGP;AgCjuGC;;;EAGE,uBAAA;ChCmuGH;AgC9tGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC4uGT;A+B3qGD;EC5DI,eAAA;EACA,uBAAA;ChC0uGH;A+B9qGD;EC/FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCgxGD;AgC9wGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCgxGP;AgC9wGC;;;EAGE,uBAAA;ChCgxGH;AgC3wGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCyxGT;A+BvtGD;EC7DI,eAAA;EACA,uBAAA;ChCuxGH;A+B1tGD;EChGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC6zGD;AgC3zGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC6zGP;AgC3zGC;;;EAGE,uBAAA;ChC6zGH;AgCxzGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCs0GT;A+BnwGD;EC9DI,eAAA;EACA,uBAAA;ChCo0GH;A+BtwGD;ECjGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC02GD;AgCx2GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC02GP;AgCx2GC;;;EAGE,uBAAA;ChC02GH;AgCr2GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCm3GT;A+B/yGD;EC/DI,eAAA;EACA,uBAAA;ChCi3GH;A+BlzGD;EClGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCu5GD;AgCr5GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCu5GP;AgCr5GC;;;EAGE,uBAAA;ChCu5GH;AgCl5GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCg6GT;A+B31GD;EChEI,eAAA;EACA,uBAAA;ChC85GH;A+B91GD;ECnGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCo8GD;AgCl8GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCo8GP;AgCl8GC;;;EAGE,uBAAA;ChCo8GH;AgC/7GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC68GT;A+Bv4GD;ECjEI,eAAA;EACA,uBAAA;ChC28GH;A+B14GD;ECpGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCi/GD;AgC/+GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCi/GP;AgC/+GC;;;EAGE,uBAAA;ChCi/GH;AgC5+GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC0/GT;A+Bn7GD;EClEI,eAAA;EACA,uBAAA;ChCw/GH;A+Bt7GD;ECrGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC8hHD;AgC5hHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC8hHP;AgC5hHC;;;EAGE,uBAAA;ChC8hHH;AgCzhHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCuiHT;A+B/9GD;ECnEI,eAAA;EACA,uBAAA;ChCqiHH;A+Bl+GD;ECtGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC2kHD;AgCzkHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC2kHP;AgCzkHC;;;EAGE,uBAAA;ChC2kHH;AgCtkHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChColHT;A+B3gHD;ECpEI,eAAA;EACA,uBAAA;ChCklHH;A+B9gHD;ECvGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCwnHD;AgCtnHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCwnHP;AgCtnHC;;;EAGE,uBAAA;ChCwnHH;AgCnnHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCioHT;A+BvjHD;ECrEI,eAAA;EACA,uBAAA;ChC+nHH;A+B1jHD;ECxGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCqqHD;AgCnqHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCqqHP;AgCnqHC;;;EAGE,uBAAA;ChCqqHH;AgChqHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC8qHT;A+BnmHD;ECtEI,eAAA;EACA,uBAAA;ChC4qHH;A+BtmHD;ECzGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCktHD;AgChtHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCktHP;AgChtHC;;;EAGE,uBAAA;ChCktHH;AgC7sHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC2tHT;A+B/oHD;ECvEI,eAAA;EACA,uBAAA;ChCytHH;A+BlpHD;EC1GE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC+vHD;AgC7vHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC+vHP;AgC7vHC;;;EAGE,uBAAA;ChC+vHH;AgC1vHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCwwHT;A+B3rHD;ECxEI,eAAA;EACA,uBAAA;ChCswHH;A+B9rHD;EC3GE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC4yHD;AgC1yHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC4yHP;AgC1yHC;;;EAGE,uBAAA;ChC4yHH;AgCvyHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCqzHT;A+BvuHD;ECzEI,eAAA;EACA,uBAAA;ChCmzHH;AACD;;;GAGG;AiC31HH;EACE,oBAAA;EACA,uBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;CjC61HD;AiC51HC;;;EAGE,0BAAA;CjC81HH;AiC11HD;EACE,gBAAA;EACA,mBAAA;EACA,YAAA;EACA,kBAAA;CjC41HD;AiC11HD;EACE,oBAAA;CjC41HD;AiC11HD;EACE,mBAAA;CjC41HD;AiCz1HD;EACE,oBAAA;CjC21HD;AiCz1HD;EACE,YAAA;EACA,UAAA;CjC21HD;AiCz1HD;;EAEE,eAAA;EACA,gBAAA;CjC21HD;AiCz1HD;;EAEE,gBAAA;CjC21HD;AiCz1HD;EACE,cAAA;EACA,UAAA;CjC21HD;AiCz1HD;EACE,gBAAA;EACA,iBAAA;EACA,oBAAA;CjC21HD;AiCz1HD;EACE,iBAAA;EACA,UAAA;EACA,WAAA;CjC21HD;AiC91HD;EAKI,YAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;CjC41HH;AiCp2HD;E9B8JU,0CAAA;EAAA,kCAAA;CH4sHT;AiC/1HK;E9BqFJ,iCAAA;EAGQ,yBAAA;CH6wHT;AiC/1HD;E9BuHU,4BAAA;CH6uHT;AiCj2HD;EACE,kBAAA;EACA,kBAAA;EACA,mBAAA;EACA,yCAAA;EACA,0CAAA;EACA,mBAAA;EACA,aAAA;CjCm2HD;AiCl2HC;EACE,8CAAA;CjCo2HH;AACD;;;GAGG;AkCr7HD;;;;;;EAGE,cAAA;ClC07HH;AkC/7HD;;EAQI,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,aAAA;ClC27HH;AkCx7HD;EACE,sBAAA;ClC07HD;AkCx7HD;EACE,0BAAA;EACA,iBAAA;ClC07HD;AkCx7HD;EACE,0BAAA;EACA,aAAA;ClC07HD;AkCx7HD;EACE,kBAAA;EACA,uBAAA;EAAA,sBAAA;EAAA,kBAAA;EACA,0BAAA;ClC07HD;AkCz7HD;EACE,gBAAA;EACA,iBAAA;EACA,aAAA;EACA,iBAAA;ClC27HD;AkCz7HD;EACE,mBAAA;EACA,mBAAA;ClC27HD;AkCz7HD;EACE,aAAA;EACA,WAAA;ClC27HD;AkCz7HD;EACE,cAAA;ClC27HD;AkCz7HD;;EAGI,0BAAA;ClC07HH;AkCz7HG;;EACE,cAAA;EACA,0BAAA;ClC47HL;AkCx7HD;EACE,YAAA;ClC07HD;AkCx7HD;EACE,uBAAA;ClC07HD;AkCz7HC;;EAEE,YAAA;ClC27HH;AkCt7HD;EAEI,0BAAA;EACA,iBAAA;ClCu7HH;AkCt7HG;EACE,sBAAA;ClCw7HL;AkCr7HC;EACE,sBAAA;ClCu7HH;AkCp7HD;EACE,0BAAA;EACA,sBAAA;EACA,kBAAA;EACA,YAAA;ClCs7HD;AkCp7HD;EACE,kBAAA;EACA,gCAAA;ClCs7HD;AkCr7HC;EACE,YAAA;ClCu7HH;AkCp7HD;EACE,oBAAA;ClCs7HD;AACD;;;GAGG;AmCzhIH;EACE,cAAA;CnC2hID;AmCzhID;EACE,aAAA;CnC2hID;AmCzhID;EACE,oBAAA;CnC2hID;AmCzhID;EACE,iBAAA;CnC2hID;AmCzhID;EACE,kBAAA;CnC2hID;AmCxhID;EACE,gBAAA;CnC0hID;AmCthID;EACE,eAAA;EACA,eAAA;EACA,mBAAA;CnCwhID;AmCvhIC;EACE,oBAAA;CnCyhIH;AmC9hID;EAQI,UAAA;EACA,WAAA;EACA,iBAAA;EACA,gBAAA;CnCyhIH;AmCpiID;EAcI,0BAAA;CnCyhIH;AmCphID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BE,uBAAA;CnCmjID;AmCjjID;EACE,YAAA;EACA,qCAAA;CnCmjID;AmCjjID;EACE,0BAAA;CnCmjID;AmCjjID;EACE,kCAAA;CnCmjID;AmCjjID;;;;;;EACE,qCAAA;CnCwjID;AmCtjID;;;;;EACE,qCAAA;CnC4jID;AmC1jID;;;;;EACE,qCAAA;CnCgkID;AmC9jID;EACE,qCAAA;CnCgkID;AmC9jID;;;EACE,qCAAA;CnCkkID;AmChkID;;;;;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmClkID;EACE,YAAA;EACA,qCAAA;CnCokID;AmClkID;EACE,qCAAA;CnCokID;AmClkID;;;EACE,qCAAA;CnCskID;AmCpkID;;;EACE,qCAAA;CnCwkID;AmCtkID;;;EACE,qCAAA;CnC0kID;AmCxkID;EACE,qCAAA;CnC0kID;AmCxkID;;;EACE,qCAAA;CnC4kID;AmC1kID;;;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC1kID;EfnLE,cAAA;EAGA,0BAAA;CpB8vID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,uBAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,eAAA;CnC2kID;AmC1kIC;;EAEE,eAAA;CnC4kIH;AmCzkID;EACE,YAAA;CnC2kID;AmC1kIC;;EAEE,YAAA;CnC4kIH;AmCvkID;EACE,yBAAA;CnCykID;AmCrkID;EACE,qBAAA;CnCukID;AmCpkID;EACE,sBAAA;CnCskID;AmCnkID;EACE,qBAAA;CnCqkID;AmCjkID;EACE,2BAAA;CnCmkID;AmC/jID;;;;EACE,iBAAA;EACA,UAAA;EACA,WAAA;CnCokID;AmCjkID;EAEI,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;CnCkkIH;AmC7jID;E7B1NE,4BAAA;CN0xID;AmC3jIC;;;EACE,iBAAA;CnC+jIH;AmC5jID;EACE,gBAAA;CnC8jID;AmC1jID;EACE,uBAAA;EACA,sBAAA;EACA,uBAAA;CnC4jID;AmCvjID;E7BpOE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BwNA,YAAA;CnC8jID;AmC5jID;E7BxOE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6B4NA,YAAA;CnCmkID;AmCjkID;E7B5OE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BgOA,YAAA;CnCwkID;AmCtkID;E7BhPE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BoOA,YAAA;CnC6kID;AmC3kID;E7BpPE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BwOA,YAAA;CnCklID;AmChlID;E7BxPE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6B4OA,YAAA;CnCulID;AmCrlID;E7B5PE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BgPA,YAAA;CnC4lID;AmC1lID;E7BhQE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BoPA,YAAA;CnCimID;AmC/lID;E7BpQE,4BAAA;EAYA,yDAAA;EAEA,2HAAA;E6BwPA,YAAA;CnCsmID;AmCpmID;E7BxQE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6B4PA,YAAA;CnC2mID;AmCvmID;EAEI,gBAAA;CnCwmIH;AmCnmID;EACE,eAAA;CnCqmID;AmCjmID;EACE,2BAAA;CnCmmID;AmC/lID;EACE,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,YAAA;CnCimID;AmC/lID;EACE,YAAA;EACA,oBAAA;EACA,qBAAA;CnCimID;AmC/lID;EAEI,aAAA;EACA,YAAA;CnCgmIH;AmC/lIG;EACE,YAAA;CnCimIL;AmC3lID;EACE,iBAAA;CnC6lID;AE39IC;;EAEE,aAAA;EACA,eAAA;CF69IH;AE39IC;EACE,YAAA;CF69IH;AmCjmID;EAGI,YAAA;EACA,aAAA;EACA,YAAA;CnCimIH;AmCtmID;;;EAUI,eAAA;EACA,kBAAA;CnCimIH;AmC5mID;EAcI,gBAAA;EACA,iBAAA;CnCimIH;AmChnID;EAkBI,YAAA;EACA,gBAAA;CnCimIH;AmC/lIC;;;EAOI,kBAAA;CnC6lIL;AmCpmIC;EAUI,gBAAA;CnC6lIL;AmCvlID;;;;;EAGE,YAAA;CnC2lID;AmCzlID;;;EACE,sBAAA;EACA,uBAAA;CnC6lID;AmC/lID;EAII,kBAAA;CnC8lIH;AmC3lID;EACE,YAAA;EACA,aAAA;CnC6lID;AmC/lID;EAII,kBAAA;CnC8lIH;AmC3lID;EACE,aAAA;EACA,cAAA;CnC6lID;AmC/lID;EAII,mBAAA;CnC8lIH;AmC1lID;EACE,0BAAA;EACA,aAAA;CnC4lID;AmC1lID;EACE,0BAAA;EACA,aAAA;CnC4lID;AmCzlID;EACE,0BAAA;EACA,aAAA;EACA,oBAAA;EACA,oBAAA;CnC2lID;AmC/lID;EAOI,iBAAA;EACA,kBAAA;EACA,aAAA;EACA,YAAA;CnC2lIH;AmCrmID;EAaI,mBAAA;CnC2lIH;AmCxmID;EAgBI,UAAA;CnC2lIH;AmC3mID;EAmBI,YAAA;CnC2lIH;AmCvlID;EACE,kBAAA;CnCylID;AmCvlID;EACE,UAAA;EACA,oBAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;EACA,WAAA;EACA,mBAAA;EACA,WAAA;CnCylID;AmCvlID;EACE,oBAAA;EACA,wBAAA;EACA,oBAAA;CnCylID;AmCvlID;Ef9fE,cAAA;EAGA,0BAAA;CpBslJD;AmCzlIC;EfhgBA,WAAA;EAGA,2BAAA;CpB0lJD;AmCxlID;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;CnC0lID;AmC7lID;;EAMI,sBAAA;CnC2lIH;AACD;;;GAGG;AoC7jJH;EA1CE;;;;;IACE,wBAAA;GpC8mJD;EoCpmJD;;;IAGE,yBAAA;IACA,wBAAA;IjCyHF,8CAAA;IAGQ,sCAAA;GH8+IP;EoCvmJD;;IAEE,yBAAA;GpCymJD;EoCtmJD;IACE,YAAA;IACA,UAAA;IACA,UAAA;IACA,WAAA;GpCwmJD;EoCtmJD;IACE,YAAA;IACA,mBAAA;GpCwmJD;EoCrmJD;IACE,eAAA;GpCumJD;EoCxmJD;;IAII,8BAAA;GpCwmJH;CACF;;AqCrpJD;;;GAGG;ACMH;ECHE,0BAAA;CFAD;ACGD;ECAI,YAAA;CFAH;ACAD;;;;;;;ECUI,+BAAA;EACA,eAAA;CFDH;ACVD;ECgBI,YAAA;CFHH;AEIG;EACE,eAAA;EACA,+BAAA;CFFL;ACjBD;EAMQ,YAAA;CDcP;ACbO;EACE,0BAAA;CDeT;ACGG;EAZQ;IACE,2CAAA;GDYX;ECqBH;IA9Bc,YAAA;GDYX;ECXW;IACE,oBAAA;GDab;CACF;AClCD;EA8BM,0BAAA;CDOL;ACrCD;EAoCI,wBAAA;CDIH;ACxCD;;;ECsGI,0BAAA;CFzDH;AC7CD;;EC2GM,YAAA;CF1DL;AEgEG;EACE,eAAA;EACA,oBAAA;CF9DL;ACrDD;ECuHM,mCAAA;CF/DL;AEkEG;;EACE,YAAA;EACA,oBAAA;EACA,2BAAA;CF/DL;AC9DD;ECiIM,cAAA;EACA,oBAAA;CFhEL;AClED;ECuII,eAAA;CFlEH;AEmEG;EACE,sBAAA;CFjEL;ACxED;ECgJQ,eAAA;CFrEP;AEuEK;;EACE,YAAA;CFpEP;AC/ED;ECgEE,mBAAA;EA0FE,0BAAA;EACA,kBAAA;CFvEH;ACpFD;;EC6JM,iBAAA;EACA,0BAAA;EACA,8BAAA;EACA,aAAA;ECuBI,iCAAA;CHzFT;AC9FD;ECoKM,YAAA;EAhGJ,4BAAA;EACA,2BAAA;EACA,8BAAA;EACA,+BAAA;CF8BD;AEiEK;;EACE,uBAAA;EACA,YAAA;CF9DP;AEgEK;EACE,wBAAA;CF9DP;AC7GD;EC+KM,YAAA;EA3GJ,0BAAA;EACA,6BAAA;EACA,gCAAA;EACA,6BAAA;CF6CD;ACzED;EAEI,uBAAA;CD0EH;;AIhID;;;;;GAKG;ACGD;EACE,mBAAA;CDDH;ACIC;EACE,aAAA;EACA,mBAAA;EACA,OAAA;EACA,QAAA;EACA,YAAA;EACA,aAAA;CDFH;ACJC;EASI,WAAA;EAIA,yBAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,WAAA;EACA,eAAA;EACA,8BAAA;EACA,uDAAA;EAAA,+CAAA;EACA,aAAA;CDFL;ACIK;EACE,WAAA;CDFP;AC3BD;EAmCI,WAAA;EACA,sBAAA;CDLH;AC/BD;EAwCI,mBAAA;EACA,YAAA;EACA,QAAA;EACA,iBAAA;CDNH;ACrCD;EA+CI,oBAAA;EACA,aAAA;EACA,SAAA;EACA,kBAAA;CDPH;AC3CD;EAsDI,iBAAA;CDRH;;AErDD;EACE,0BAAA;CCCD;ADCD;EACE,uBAAA;EACA,oBAAA;EACA,iBAAA;EACA,eAAA;EACA,YAAA;CCCD;ADED;EACE,gBAAA;CCAD;ADGD;EACI,mBAAA;EACA,iBAAA;CCDH;ADID;EACI,eAAA;CCFH;ADMD;EACA,mBAAA;EACA,cAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,YAAA;EACA,aAAA;CCJC;ADOD;EACE,YAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;CCLD;ADQD;EACE,0BAAA;CCND;ADSD;EACI,YAAA;CCPH;ADUD;EACE,cAAA;EACA,aAAA;CCRD;ADYD;EACE,mBAAA;CCVD;ADaD;EACI,mBAAA;EACA,OAAA;EACA,SAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;EACA,kBAAA;EACA,yBAAA;EACA,WAAA;EACA,cAAA;EACA,kBAAA;EACA,gBAAA;EACA,eAAA;CCXH;ADaD;EACE,gBAAA;CCXD;ADaD;EACE,kBAAA;CCXD;ADaD;EACE,YAAA;EACA,uBAAA;CCXD;ADcD;EACE,eAAA;CCZD;ADcD;EACE,0BAAA;CCZD;ADgBD;EACE,mBAAA;EACA,aAAA;EACA,0BAAA;CCdD;ADiBD;EACE,aAAA;EACA,YAAA;EACA,kBAAA;CCfD;ADsBD;EACE,iBAAA;CCpBD;ADuBD;EACE,cAAA;EACA,cAAA;CCrBD;ADyBD;EACE,YAAA;CCvBD;ADyBD;EACE,eAAA;EACA,qCAAA;CCvBD;AD0BD;;EACE,eAAA;EACA,eAAA;CCvBD;AD0BD;EACQ,oBAAA;EACA,mBAAA;CCxBP;AD0BC;EACI,gBAAA;CCxBL;AD2BD;EACE,eAAA;EACA,8BAAA;EACA,oBAAA;CCzBD;AD4BD;EACE,eAAA;CC1BD;AD6BD;EACE,eAAA;CC3BD;AD8BD;EACE,eAAA;CC5BD;AD+BD;EACE,eAAA;CC7BD;ADgCD;EACE,eAAA;CC9BD;ADiCD;;;;;EACE,YAAA;CC3BD;AD8BD;EACC,gBAAA;EACA,OAAA;EACA,cAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA;EACA,aAAA;EACC,kBAAA;EACA,aAAA;EACA,cAAA;CC5BD;AD8BD;EACC,mBAAA;EACA,iBAAA;EACA,YAAA;EACA,iBAAA;EACA,iBAAA;EACA,8BAAA;CC5BA;AD8BD;EACC,mBAAA;EACA,UAAA;EACA,YAAA;EACA,sBAAA;EACA,qBAAA;EACA,+BAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,YAAA;EACA,sBAAA;EACA,oBAAA;CC5BA;AD8BD;EACC,YAAA;CC5BA;AD8BD;EACC,iBAAA;EACA,iBAAA;EACA,8BAAA;EACA,iCAAA;CC5BA;AD8BD;EACC,8BAAA;EACA,iCAAA;CC5BA;AD8BD;EACC,mBAAA;EACA,eAAA;EACA,cAAA;EACA,YAAA;EACA,sBAAA;CC5BA;AD8BD;EACC,iBAAA;EACA,YAAA;CC5BA;AD8BD;EACC,mBAAA;EACA,UAAA;EACA,YAAA;EACA,YAAA;CC5BA;AD+BA;EACE,gBAAA;EACA,cAAA;CC7BF;ADkCA;EAAY,iBAAA;CC/BZ;AACD,eAAe;ADiCd;EAAY,iCAAA;EAAkC,oBAAA;CC7B9C;AD8BA;EAA8B,WAAA;EAAY,mBAAA;CC1B1C;AD4BA;EAAiD,eAAA;EAAgB,gBAAA;EAAiB,mBAAA;CCvBlF;ADwBA;EAA8C,YAAA;EAAa,gBAAA;CCpB3D;ADqBA;EAA+C,mBAAA;EAAoB,YAAA;EAAa,aAAA;EAAc,eAAA;EAAgB,oBAAA;EAAqB,UAAA;EAAW,UAAA;EAAW,kBAAA;EAAmB,mBAAA;EAAoB,mBAAA;CCThM;ADUA;EAAqD,aAAA;EAAc,YAAA;EAAa,aAAA;EAAc,oBAAA;EAAqB,oBAAA;EAAqB,mBAAA;EAAoB,SAAA;EAAU,UAAA;CCAtK;ADCA;EAA0C,mBAAA;EAAoB,mBAAA;EAAoB,YAAA;EAAa,iBAAA;EAAkB,eAAA;CCMjH;ADLA;EAA0D,WAAA;EAAW,iBAAA;EAAkB,oBAAA;CCUvF;ADTA;EAAmE,YAAA;CCYnE;ADXA;EAAiE,WAAA;CCcjE;ADbA;EAA6E,UAAA;CCgB7E;ADfA;EAA4E,YAAA;CCkB5E;ADjBA;EAAwD,0BAAA;CCoBxD;ADnBA;EAA8D,WAAA;CCsB9D;ADrBA;EAAuD,UAAA;EAAW,WAAA;CCyBlE;ADxBA;EAAsD,WAAA;CC2BtD;AD1BA;EAAuD,qBAAA;CC6BvD;AACD,mBAAmB;AD3BnB;EACE,sBAAA;EACA,YAAA;EACA,iBAAA;EACA,aAAA;EACA,aAAA;EC6BA,iCAAiC;CAClC;AD1BD;EACE,YAAA;CC4BD;ADzBD;EACC,8BAAA;CC2BA;ADvBD;EACE,+BAAA;CCyBD;;ACvTD,eAAe;AA+Df;EACI;IACI,kCAAA;GAdL;EAiBC;IACI,iCAAA;GAfL;EAkBC;IACI,iCAAA;GAhBL;EAmBC;IACI,kCAAA;GAjBL;EAoBC;IACI,kCAAA;GAlBL;EAqBC;IACI,iCAAA;GAnBL;EAsBC;IACI,iCAAA;GApBL;EAuBC;IACI,kCAAA;GArBL;EAwBC;IACI,kCAAA;GAtBL;EAyBC;IACI,iCAAA;GAvBL;EA0BC;IACI,iCAAA;GAxBL;EA2BC;IACI,kCAAA;GAzBL;EA4BC;IACI,kCAAA;GA1BL;EA6BC;IACI,iCAAA;GA3BL;EA8BC;IACI,gCAAA;GA5BL;CACF;AA2JD;EACI;IACI,kCAAA;IAAA,0BAAA;GA3DL;EA8DC;IACI,iCAAA;IAAA,yBAAA;GA5DL;EA+DC;IACI,iCAAA;IAAA,yBAAA;GA7DL;EAgEC;IACI,kCAAA;IAAA,0BAAA;GA9DL;EAiEC;IACI,kCAAA;IAAA,0BAAA;GA/DL;EAkEC;IACI,iCAAA;IAAA,yBAAA;GAhEL;EAmEC;IACI,iCAAA;IAAA,yBAAA;GAjEL;EAoEC;IACI,kCAAA;IAAA,0BAAA;GAlEL;EAqEC;IACI,kCAAA;IAAA,0BAAA;GAnEL;EAsEC;IACI,iCAAA;IAAA,yBAAA;GApEL;EAuEC;IACI,iCAAA;IAAA,yBAAA;GArEL;EAwEC;IACI,kCAAA;IAAA,0BAAA;GAtEL;EAyEC;IACI,kCAAA;IAAA,0BAAA;GAvEL;EA0EC;IACI,iCAAA;IAAA,yBAAA;GAxEL;EA2EC;IACI,gCAAA;IAAA,wBAAA;GAzEL;CACF;AA4ED;;EACI,0CAAA;EACA,6BAAA;EACA,6BAAA;EACA,iCAAA;EAEA,6CAAA;EACA,gCAAA;EACA,gCAAA;EACA,oCAAA;EAEA,yCAAA;EACA,4BAAA;EACA,4BAAA;EACA,gCAAA;EAEA,6CAAA;EAAA,qCAAA;EACA,wBAAA;EACA,wBAAA;EACA,4BAAA;CA5EH;AACD,UAAU;AA6HV;EACI;IACI,kCAAA;GAxFL;EA2FC;IACI,iCAAA;GAzFL;EA4FC;IACI,kCAAA;GA1FL;EA6FC;IACI,iCAAA;GA3FL;EA8FC;IACI,kCAAA;GA5FL;EA+FC;IACI,iCAAA;GA7FL;EAgGC;IACI,kCAAA;GA9FL;EAiGC;IACI,iCAAA;GA/FL;EAkGC;IACI,kCAAA;GAhGL;EAmGC;IACI,iCAAA;GAjGL;EAoGC;IACI,gCAAA;GAlGL;CACF;AAmJD;EACI;IACI,kCAAA;IAAA,0BAAA;GA9GL;EAiHC;IACI,iCAAA;IAAA,yBAAA;GA/GL;EAkHC;IACI,kCAAA;IAAA,0BAAA;GAhHL;EAmHC;IACI,iCAAA;IAAA,yBAAA;GAjHL;EAoHC;IACI,kCAAA;IAAA,0BAAA;GAlHL;EAqHC;IACI,iCAAA;IAAA,yBAAA;GAnHL;EAsHC;IACI,kCAAA;IAAA,0BAAA;GApHL;EAuHC;IACI,iCAAA;IAAA,yBAAA;GArHL;EAwHC;IACI,kCAAA;IAAA,0BAAA;GAtHL;EAyHC;IACI,iCAAA;IAAA,yBAAA;GAvHL;EA0HC;IACI,gCAAA;IAAA,wBAAA;GAxHL;CACF;AA2HD;;EACI,sCAAA;EACA,6BAAA;EACA,6BAAA;EACA,iCAAA;EAEA,yCAAA;EACA,gCAAA;EACA,gCAAA;EACA,oCAAA;EAEA,qCAAA;EACA,4BAAA;EACA,4BAAA;EACA,gCAAA;EAEA,yCAAA;EAAA,iCAAA;EACA,wBAAA;EACA,wBAAA;EACA,4BAAA;CA3HH;AACD,cAAc;AA4Jd;EACI;IACI,sCAAA;GAnIL;EAsIC;IACI,qCAAA;GApIL;EAuIC;IACI,sCAAA;GArIL;EAwIC;IACI,qCAAA;GAtIL;EAyIC;IACI,sCAAA;GAvIL;EA0IC;IACI,qCAAA;GAxIL;EA2IC;IACI,mCAAA;GAzIL;CACF;AA0KD;EACI;IACI,sCAAA;IAAA,8BAAA;GAjJL;EAoJC;IACI,qCAAA;IAAA,6BAAA;GAlJL;EAqJC;IACI,sCAAA;IAAA,8BAAA;GAnJL;EAsJC;IACI,qCAAA;IAAA,6BAAA;GApJL;EAuJC;IACI,sCAAA;IAAA,8BAAA;GArJL;EAwJC;IACI,qCAAA;IAAA,6BAAA;GAtJL;EAyJC;IACI,mCAAA;IAAA,2BAAA;GAvJL;CACF;AA0JD;;EAEI,6CAAA;EAEA,qCAAA;CAvJH;AACD,gBAAgB;AAwLhB;EACI;IACI,mCAAA;GA/JL;EAkKC;IACI,qCAAA;GAhKL;EAmKC;IACI,mCAAA;GAjKL;EAoKC;IACI,qCAAA;GAlKL;EAqKC;IACI,mCAAA;GAnKL;EAsKC;IACI,qCAAA;GApKL;EAuKC;IACI,mCAAA;GArKL;CACF;AAsMD;EACI;IACI,mCAAA;IAAA,2BAAA;GA7KL;EAgLC;IACI,qCAAA;IAAA,6BAAA;GA9KL;EAiLC;IACI,mCAAA;IAAA,2BAAA;GA/KL;EAkLC;IACI,qCAAA;IAAA,6BAAA;GAhLL;EAmLC;IACI,mCAAA;IAAA,2BAAA;GAjLL;EAoLC;IACI,qCAAA;IAAA,6BAAA;GAlLL;EAqLC;IACI,mCAAA;IAAA,2BAAA;GAnLL;CACF;AAsLD;;EAEI,+CAAA;EAEA,uCAAA;CAnLH;AACD,cAAc;AAgMd;EACI;;;IACI,WAAA;GAjLL;EAoLC;;IACI,WAAA;GAjLL;CACF;AA8LD;EACI;;;IACI,WAAA;GA/KL;EAkLC;;IACI,WAAA;GA/KL;CACF;AAkLD;;EAEI,0CAAA;EAEA,kCAAA;CA/KH;AACD,YAAY;AAgMZ;EACI;;;;;IACI,iCAAA;GA3KL;EA8KC;IACI,qCAAA;GA5KL;EA+KC;IACI,qCAAA;GA7KL;CACF;AA8LD;EACI;;;;;IACI,iCAAA;IAAA,yBAAA;GAzKL;EA4KC;IACI,qCAAA;IAAA,6BAAA;GA1KL;EA6KC;IACI,qCAAA;IAAA,6BAAA;GA3KL;CACF;AA8KD;;EAEI,2CAAA;EAEA,mCAAA;CA3KH;AACD,UAAU;AAwLV;EACI;IACI,gCAAA;GA9KL;EAiLC;IACI,kCAAA;GA/KL;CACF;AA4LD;EACI;IACI,gCAAA;IAAA,wBAAA;GAlLL;EAqLC;IACI,kCAAA;IAAA,0BAAA;GAnLL;CACF;AAsLD;;EAEI,6CAAA;EAEA,qCAAA;CAnLH;AACD,WAAW;AAoMX;EACI;IACI,iCAAA;GAvLL;EA0LC;IACI,oCAAA;GAxLL;EA2LC;IACI,iCAAA;GAzLL;CACF;AA0MD;EACI;IACI,iCAAA;IAAA,yBAAA;GA7LL;EAgMC;IACI,oCAAA;IAAA,4BAAA;GA9LL;EAiMC;IACI,iCAAA;IAAA,yBAAA;GA/LL;CACF;AAkMD;;EAEI,4CAAA;EAEA,oCAAA;CA/LH;AACD,WAAW;AAgNX;EACI;IACI,4BAAA;GAnML;EAsMC;IACI,8BAAA;GApML;EAuMC;IACI,4BAAA;GArML;CACF;AAsND;EACI;IACI,8BAAA;IAAA,sBAAA;GAzML;EA4MC;IACI,8BAAA;IAAA,sBAAA;GA1ML;EA6MC;IACI,4BAAA;IAAA,oBAAA;GA3ML;CACF;AA8MD;;EAEI,4CAAA;EAEA,oCAAA;CA3MH;AACD,WAAW;AA8MX;;EACI,6CAAA;CA3MH","file":"app.css","sourcesContent":["/*!\n *   AdminLTE v2.3.0\n *   Author: Almsaeed Studio\n *\t Website: Almsaeed Studio <http://almsaeedstudio.com>\n *   License: Open source - MIT\n *           Please visit http://opensource.org/licenses/MIT for more information\n!*/\n@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);\n/*\n * Core: General Layout Style\n * -------------------------\n */\nhtml,\nbody {\n  min-height: 100%;\n}\n.layout-boxed html,\n.layout-boxed body {\n  height: 100%;\n}\nbody {\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-weight: 400;\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n/* Layout */\n.wrapper {\n  min-height: 100%;\n  position: static;\n  overflow: hidden;\n}\n.wrapper:before,\n.wrapper:after {\n  content: \" \";\n  display: table;\n}\n.wrapper:after {\n  clear: both;\n}\n.layout-boxed .wrapper {\n  max-width: 1250px;\n  margin: 0 auto;\n  min-height: 100%;\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);\n  position: relative;\n}\n.layout-boxed {\n  background: url('../img/boxed-bg.jpg') repeat fixed;\n}\n/*\n * Content Wrapper - contains the main content\n * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```\n */\n.content-wrapper,\n.right-side,\n.main-footer {\n  -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  margin-left: 230px;\n  z-index: 820;\n}\n.layout-top-nav .content-wrapper,\n.layout-top-nav .right-side,\n.layout-top-nav .main-footer {\n  margin-left: 0;\n}\n@media (max-width: 767px) {\n  .content-wrapper,\n  .right-side,\n  .main-footer {\n    margin-left: 0;\n  }\n}\n@media (min-width: 768px) {\n  .sidebar-collapse .content-wrapper,\n  .sidebar-collapse .right-side,\n  .sidebar-collapse .main-footer {\n    margin-left: 0;\n  }\n}\n@media (max-width: 767px) {\n  .sidebar-open .content-wrapper,\n  .sidebar-open .right-side,\n  .sidebar-open .main-footer {\n    -webkit-transform: translate(230px, 0);\n    -ms-transform: translate(230px, 0);\n    -o-transform: translate(230px, 0);\n    transform: translate(230px, 0);\n  }\n}\n.content-wrapper,\n.right-side {\n  min-height: 100%;\n  background-color: #ecf0f5;\n  z-index: 800;\n}\n.main-footer {\n  background: #fff;\n  padding: 15px;\n  color: #444;\n  border-top: 1px solid #d2d6de;\n}\n/* Fixed layout */\n.fixed .main-header,\n.fixed .main-sidebar,\n.fixed .left-side {\n  position: fixed;\n}\n.fixed .main-header {\n  top: 0;\n  right: 0;\n  left: 0;\n}\n.fixed .content-wrapper,\n.fixed .right-side {\n  padding-top: 50px;\n}\n@media (max-width: 767px) {\n  .fixed .content-wrapper,\n  .fixed .right-side {\n    padding-top: 100px;\n  }\n}\n.fixed.layout-boxed .wrapper {\n  max-width: 100%;\n}\nbody.hold-transition .content-wrapper,\nbody.hold-transition .right-side,\nbody.hold-transition .main-footer,\nbody.hold-transition .main-sidebar,\nbody.hold-transition .left-side,\nbody.hold-transition .main-header > .navbar,\nbody.hold-transition .main-header .logo {\n  /* Fix for IE */\n  -webkit-transition: none;\n  -o-transition: none;\n  transition: none;\n}\n/* Content */\n.content {\n  min-height: 250px;\n  padding: 15px;\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n/* H1 - H6 font */\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: 'Source Sans Pro', sans-serif;\n}\n/* General Links */\na {\n  color: #3c8dbc;\n}\na:hover,\na:active,\na:focus {\n  outline: none;\n  text-decoration: none;\n  color: #72afd2;\n}\n/* Page Header */\n.page-header {\n  margin: 10px 0 20px 0;\n  font-size: 22px;\n}\n.page-header > small {\n  color: #666;\n  display: block;\n  margin-top: 5px;\n}\n/*\n * Component: Main Header\n * ----------------------\n */\n.main-header {\n  position: relative;\n  max-height: 100px;\n  z-index: 1030;\n}\n.main-header > .navbar {\n  -webkit-transition: margin-left 0.3s ease-in-out;\n  -o-transition: margin-left 0.3s ease-in-out;\n  transition: margin-left 0.3s ease-in-out;\n  margin-bottom: 0;\n  margin-left: 230px;\n  border: none;\n  min-height: 50px;\n  border-radius: 0;\n}\n.layout-top-nav .main-header > .navbar {\n  margin-left: 0;\n}\n.main-header #navbar-search-input.form-control {\n  background: rgba(255, 255, 255, 0.2);\n  border-color: transparent;\n}\n.main-header #navbar-search-input.form-control:focus,\n.main-header #navbar-search-input.form-control:active {\n  border-color: rgba(0, 0, 0, 0.1);\n  background: rgba(255, 255, 255, 0.9);\n}\n.main-header #navbar-search-input.form-control::-moz-placeholder {\n  color: #ccc;\n  opacity: 1;\n}\n.main-header #navbar-search-input.form-control:-ms-input-placeholder {\n  color: #ccc;\n}\n.main-header #navbar-search-input.form-control::-webkit-input-placeholder {\n  color: #ccc;\n}\n.main-header .navbar-custom-menu,\n.main-header .navbar-right {\n  float: right;\n}\n@media (max-width: 991px) {\n  .main-header .navbar-custom-menu a,\n  .main-header .navbar-right a {\n    color: inherit;\n    background: transparent;\n  }\n}\n@media (max-width: 767px) {\n  .main-header .navbar-right {\n    float: none;\n  }\n  .navbar-collapse .main-header .navbar-right {\n    margin: 7.5px -15px;\n  }\n  .main-header .navbar-right > li {\n    color: inherit;\n    border: 0;\n  }\n}\n.main-header .sidebar-toggle {\n  float: left;\n  background-color: transparent;\n  background-image: none;\n  padding: 15px 15px;\n  font-family: fontAwesome;\n}\n.main-header .sidebar-toggle:before {\n  content: \"\\f0c9\";\n}\n.main-header .sidebar-toggle:hover {\n  color: #fff;\n}\n.main-header .sidebar-toggle:focus,\n.main-header .sidebar-toggle:active {\n  background: transparent;\n}\n.main-header .sidebar-toggle .icon-bar {\n  display: none;\n}\n.main-header .navbar .nav > li.user > a > .fa,\n.main-header .navbar .nav > li.user > a > .glyphicon,\n.main-header .navbar .nav > li.user > a > .ion {\n  margin-right: 5px;\n}\n.main-header .navbar .nav > li > a > .label {\n  position: absolute;\n  top: 9px;\n  right: 7px;\n  text-align: center;\n  font-size: 9px;\n  padding: 2px 3px;\n  line-height: .9;\n}\n.main-header .logo {\n  -webkit-transition: width 0.3s ease-in-out;\n  -o-transition: width 0.3s ease-in-out;\n  transition: width 0.3s ease-in-out;\n  display: block;\n  float: left;\n  height: 50px;\n  font-size: 20px;\n  line-height: 50px;\n  text-align: center;\n  width: 230px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  padding: 0 15px;\n  font-weight: 300;\n  overflow: hidden;\n}\n.main-header .logo .logo-lg {\n  display: block;\n}\n.main-header .logo .logo-mini {\n  display: none;\n}\n.main-header .navbar-brand {\n  color: #fff;\n}\n.content-header {\n  position: relative;\n  padding: 15px 15px 0 15px;\n}\n.content-header > h1 {\n  margin: 0;\n  font-size: 24px;\n}\n.content-header > h1 > small {\n  font-size: 15px;\n  display: inline-block;\n  padding-left: 4px;\n  font-weight: 300;\n}\n.content-header > .breadcrumb {\n  float: right;\n  background: transparent;\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 12px;\n  padding: 7px 5px;\n  position: absolute;\n  top: 15px;\n  right: 10px;\n  border-radius: 2px;\n}\n.content-header > .breadcrumb > li > a {\n  color: #444;\n  text-decoration: none;\n  display: inline-block;\n}\n.content-header > .breadcrumb > li > a > .fa,\n.content-header > .breadcrumb > li > a > .glyphicon,\n.content-header > .breadcrumb > li > a > .ion {\n  margin-right: 5px;\n}\n.content-header > .breadcrumb > li + li:before {\n  content: '>\\00a0';\n}\n@media (max-width: 991px) {\n  .content-header > .breadcrumb {\n    position: relative;\n    margin-top: 5px;\n    top: 0;\n    right: 0;\n    float: none;\n    background: #d2d6de;\n    padding-left: 10px;\n  }\n  .content-header > .breadcrumb li:before {\n    color: #97a0b3;\n  }\n}\n.navbar-toggle {\n  color: #fff;\n  border: 0;\n  margin: 0;\n  padding: 15px 15px;\n}\n@media (max-width: 991px) {\n  .navbar-custom-menu .navbar-nav > li {\n    float: left;\n  }\n  .navbar-custom-menu .navbar-nav {\n    margin: 0;\n    float: left;\n  }\n  .navbar-custom-menu .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n    line-height: 20px;\n  }\n}\n@media (max-width: 767px) {\n  .main-header {\n    position: relative;\n  }\n  .main-header .logo,\n  .main-header .navbar {\n    width: 100%;\n    float: none;\n  }\n  .main-header .navbar {\n    margin: 0;\n  }\n  .main-header .navbar-custom-menu {\n    float: right;\n  }\n}\n@media (max-width: 991px) {\n  .navbar-collapse.pull-left {\n    float: none!important;\n  }\n  .navbar-collapse.pull-left + .navbar-custom-menu {\n    display: block;\n    position: absolute;\n    top: 0;\n    right: 40px;\n  }\n}\n@media (max-width: 991px) {\n  .content-header {\n    padding-top: 110px;\n  }\n}\n@media (max-width: 991px) {\n  ul.sidebar-menu {\n    padding-top: 120px;\n  }\n}\n@media (max-width: 991px) {\n  .sidebar-toggle-mobile a {\n    color: white;\n  }\n}\n/*\n * Component: Sidebar\n * ------------------\n */\n.main-sidebar,\n.left-side {\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding-top: 50px;\n  min-height: 100%;\n  width: 230px;\n  z-index: 810;\n  -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out;\n  -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out;\n  -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out;\n  transition: transform 0.3s ease-in-out, width 0.3s ease-in-out;\n}\n@media (max-width: 767px) {\n  .main-sidebar,\n  .left-side {\n    padding-top: 100px;\n  }\n}\n@media (max-width: 767px) {\n  .main-sidebar,\n  .left-side {\n    -webkit-transform: translate(-230px, 0);\n    -ms-transform: translate(-230px, 0);\n    -o-transform: translate(-230px, 0);\n    transform: translate(-230px, 0);\n  }\n}\n@media (min-width: 768px) {\n  .sidebar-collapse .main-sidebar,\n  .sidebar-collapse .left-side {\n    -webkit-transform: translate(-230px, 0);\n    -ms-transform: translate(-230px, 0);\n    -o-transform: translate(-230px, 0);\n    transform: translate(-230px, 0);\n  }\n}\n@media (max-width: 767px) {\n  .sidebar-open .main-sidebar,\n  .sidebar-open .left-side {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    -o-transform: translate(0, 0);\n    transform: translate(0, 0);\n  }\n}\n.sidebar {\n  padding-bottom: 10px;\n}\n.sidebar-form input:focus {\n  border-color: transparent;\n}\n.user-panel {\n  position: relative;\n  width: 100%;\n  padding: 10px;\n  overflow: hidden;\n}\n.user-panel:before,\n.user-panel:after {\n  content: \" \";\n  display: table;\n}\n.user-panel:after {\n  clear: both;\n}\n.user-panel > .image > img {\n  width: 100%;\n  max-width: 45px;\n  height: auto;\n}\n.user-panel > .info {\n  padding: 5px 5px 5px 15px;\n  line-height: 1;\n  position: absolute;\n  left: 55px;\n}\n.user-panel > .info > p {\n  font-weight: 600;\n  margin-bottom: 9px;\n}\n.user-panel > .info > a {\n  text-decoration: none;\n  padding-right: 5px;\n  margin-top: 3px;\n  font-size: 11px;\n}\n.user-panel > .info > a > .fa,\n.user-panel > .info > a > .ion,\n.user-panel > .info > a > .glyphicon {\n  margin-right: 3px;\n}\n.sidebar-menu {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.sidebar-menu > li {\n  position: relative;\n  margin: 0;\n  padding: 0;\n}\n.sidebar-menu > li > a {\n  padding: 12px 5px 12px 15px;\n  display: block;\n}\n.sidebar-menu > li > a > .fa,\n.sidebar-menu > li > a > .glyphicon,\n.sidebar-menu > li > a > .ion {\n  width: 20px;\n}\n.sidebar-menu > li .label,\n.sidebar-menu > li .badge {\n  margin-top: 3px;\n  margin-right: 5px;\n}\n.sidebar-menu li.header {\n  padding: 10px 25px 10px 15px;\n  font-size: 12px;\n}\n.sidebar-menu li > a > .fa-angle-left {\n  width: auto;\n  height: auto;\n  padding: 0;\n  margin-right: 10px;\n  margin-top: 3px;\n}\n.sidebar-menu li.active > a > .fa-angle-left {\n  -webkit-transform: rotate(-90deg);\n  -ms-transform: rotate(-90deg);\n  -o-transform: rotate(-90deg);\n  transform: rotate(-90deg);\n}\n.sidebar-menu li.active > .treeview-menu {\n  display: block;\n}\n.sidebar-menu .treeview-menu {\n  display: none;\n  list-style: none;\n  padding: 0;\n  margin: 0;\n  padding-left: 5px;\n}\n.sidebar-menu .treeview-menu .treeview-menu {\n  padding-left: 20px;\n}\n.sidebar-menu .treeview-menu > li {\n  margin: 0;\n}\n.sidebar-menu .treeview-menu > li > a {\n  padding: 5px 5px 5px 15px;\n  display: block;\n  font-size: 14px;\n}\n.sidebar-menu .treeview-menu > li > a > .fa,\n.sidebar-menu .treeview-menu > li > a > .glyphicon,\n.sidebar-menu .treeview-menu > li > a > .ion {\n  width: 20px;\n}\n.sidebar-menu .treeview-menu > li > a > .fa-angle-left,\n.sidebar-menu .treeview-menu > li > a > .fa-angle-down {\n  width: auto;\n}\n/*\n * Component: Sidebar Mini\n */\n@media (min-width: 768px) {\n  .sidebar-mini.sidebar-collapse .content-wrapper,\n  .sidebar-mini.sidebar-collapse .right-side,\n  .sidebar-mini.sidebar-collapse .main-footer {\n    margin-left: 50px!important;\n    z-index: 840;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    -o-transform: translate(0, 0);\n    transform: translate(0, 0);\n    width: 50px!important;\n    z-index: 850;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li {\n    position: relative;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a {\n    margin-right: 0;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span {\n    border-top-right-radius: 4px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span {\n    border-bottom-right-radius: 4px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {\n    padding-top: 5px;\n    padding-bottom: 5px;\n    border-bottom-right-radius: 4px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right),\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {\n    display: block!important;\n    position: absolute;\n    width: 180px;\n    left: 50px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span {\n    top: 0;\n    margin-left: -3px;\n    padding: 12px 5px 12px 20px;\n    background-color: inherit;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {\n    top: 44px;\n    margin-left: 0;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info,\n  .sidebar-mini.sidebar-collapse .sidebar-form,\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span,\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu,\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right,\n  .sidebar-mini.sidebar-collapse .sidebar-menu li.header {\n    display: none!important;\n    -webkit-transform: translateZ(0);\n  }\n  .sidebar-mini.sidebar-collapse .main-header .logo {\n    width: 50px;\n  }\n  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini {\n    display: block;\n    margin-left: -15px;\n    margin-right: -15px;\n    font-size: 18px;\n  }\n  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg {\n    display: none;\n  }\n  .sidebar-mini.sidebar-collapse .main-header .navbar {\n    margin-left: 50px;\n  }\n}\n.sidebar-menu,\n.main-sidebar .user-panel,\n.sidebar-menu > li.header {\n  white-space: nowrap;\n  overflow: hidden;\n}\n.sidebar-menu:hover {\n  overflow: visible;\n}\n.sidebar-form,\n.sidebar-menu > li.header {\n  overflow: hidden;\n  text-overflow: clip;\n}\n.sidebar-menu li > a {\n  position: relative;\n}\n.sidebar-menu li > a > .pull-right {\n  position: absolute;\n  top: 50%;\n  right: 10px;\n  margin-top: -7px;\n}\n/*\n * Component: Control sidebar. By default, this is the right sidebar.\n */\n.control-sidebar-bg {\n  position: fixed;\n  z-index: 1000;\n  bottom: 0;\n}\n.control-sidebar-bg,\n.control-sidebar {\n  top: 0;\n  right: -230px;\n  width: 230px;\n  -webkit-transition: right 0.3s ease-in-out;\n  -o-transition: right 0.3s ease-in-out;\n  transition: right 0.3s ease-in-out;\n}\n.control-sidebar {\n  position: absolute;\n  padding-top: 50px;\n  z-index: 1010;\n}\n@media (max-width: 768px) {\n  .control-sidebar {\n    padding-top: 100px;\n  }\n}\n.control-sidebar > .tab-content {\n  padding: 10px 15px;\n}\n.control-sidebar.control-sidebar-open,\n.control-sidebar.control-sidebar-open + .control-sidebar-bg {\n  right: 0;\n}\n.control-sidebar-open .control-sidebar-bg,\n.control-sidebar-open .control-sidebar {\n  right: 0;\n}\n@media (min-width: 768px) {\n  .control-sidebar-open .content-wrapper,\n  .control-sidebar-open .right-side,\n  .control-sidebar-open .main-footer {\n    margin-right: 230px;\n  }\n}\n.nav-tabs.control-sidebar-tabs > li:first-of-type > a,\n.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover,\n.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus {\n  border-left-width: 0;\n}\n.nav-tabs.control-sidebar-tabs > li > a {\n  border-radius: 0;\n}\n.nav-tabs.control-sidebar-tabs > li > a,\n.nav-tabs.control-sidebar-tabs > li > a:hover {\n  border-top: none;\n  border-right: none;\n  border-left: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n}\n.nav-tabs.control-sidebar-tabs > li > a .icon {\n  font-size: 16px;\n}\n.nav-tabs.control-sidebar-tabs > li.active > a,\n.nav-tabs.control-sidebar-tabs > li.active > a:hover,\n.nav-tabs.control-sidebar-tabs > li.active > a:focus,\n.nav-tabs.control-sidebar-tabs > li.active > a:active {\n  border-top: none;\n  border-right: none;\n  border-bottom: none;\n}\n@media (max-width: 768px) {\n  .nav-tabs.control-sidebar-tabs {\n    display: table;\n  }\n  .nav-tabs.control-sidebar-tabs > li {\n    display: table-cell;\n  }\n}\n.control-sidebar-heading {\n  font-weight: 400;\n  font-size: 16px;\n  padding: 10px 0;\n  margin-bottom: 10px;\n}\n.control-sidebar-subheading {\n  display: block;\n  font-weight: 400;\n  font-size: 14px;\n}\n.control-sidebar-menu {\n  list-style: none;\n  padding: 0;\n  margin: 0 -15px;\n}\n.control-sidebar-menu > li > a {\n  display: block;\n  padding: 10px 15px;\n}\n.control-sidebar-menu > li > a:before,\n.control-sidebar-menu > li > a:after {\n  content: \" \";\n  display: table;\n}\n.control-sidebar-menu > li > a:after {\n  clear: both;\n}\n.control-sidebar-menu > li > a > .control-sidebar-subheading {\n  margin-top: 0;\n}\n.control-sidebar-menu .menu-icon {\n  float: left;\n  width: 35px;\n  height: 35px;\n  border-radius: 50%;\n  text-align: center;\n  line-height: 35px;\n}\n.control-sidebar-menu .menu-info {\n  margin-left: 45px;\n  margin-top: 3px;\n}\n.control-sidebar-menu .menu-info > .control-sidebar-subheading {\n  margin: 0;\n}\n.control-sidebar-menu .menu-info > p {\n  margin: 0;\n  font-size: 11px;\n}\n.control-sidebar-menu .progress {\n  margin: 0;\n}\n.control-sidebar-dark {\n  color: #b8c7ce;\n}\n.control-sidebar-dark,\n.control-sidebar-dark + .control-sidebar-bg {\n  background: #222d32;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs {\n  border-bottom: #1c2529;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a {\n  background: #181f23;\n  color: #b8c7ce;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus {\n  border-left-color: #141a1d;\n  border-bottom-color: #141a1d;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active {\n  background: #1c2529;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover {\n  color: #fff;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active {\n  background: #222d32;\n  color: #fff;\n}\n.control-sidebar-dark .control-sidebar-heading,\n.control-sidebar-dark .control-sidebar-subheading {\n  color: #fff;\n}\n.control-sidebar-dark .control-sidebar-menu > li > a:hover {\n  background: #1e282c;\n}\n.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p {\n  color: #b8c7ce;\n}\n.control-sidebar-light {\n  color: #5e5e5e;\n}\n.control-sidebar-light,\n.control-sidebar-light + .control-sidebar-bg {\n  background: #f9fafc;\n  border-left: 1px solid #d2d6de;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs {\n  border-bottom: #d2d6de;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a {\n  background: #e8ecf4;\n  color: #444;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus {\n  border-left-color: #d2d6de;\n  border-bottom-color: #d2d6de;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active {\n  background: #eff1f7;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active {\n  background: #f9fafc;\n  color: #111;\n}\n.control-sidebar-light .control-sidebar-heading,\n.control-sidebar-light .control-sidebar-subheading {\n  color: #111;\n}\n.control-sidebar-light .control-sidebar-menu {\n  margin-left: -14px;\n}\n.control-sidebar-light .control-sidebar-menu > li > a:hover {\n  background: #f4f4f5;\n}\n.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p {\n  color: #5e5e5e;\n}\n/*\n * Component: Dropdown menus\n * -------------------------\n */\n/*Dropdowns in general*/\n.dropdown-menu {\n  box-shadow: none;\n  border-color: #eee;\n}\n.dropdown-menu > li > a {\n  color: #777;\n}\n.dropdown-menu > li > a > .glyphicon,\n.dropdown-menu > li > a > .fa,\n.dropdown-menu > li > a > .ion {\n  margin-right: 10px;\n}\n.dropdown-menu > li > a:hover {\n  background-color: #e1e3e9;\n  color: #333;\n}\n.dropdown-menu > .divider {\n  background-color: #eee;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu,\n.navbar-nav > .messages-menu > .dropdown-menu,\n.navbar-nav > .tasks-menu > .dropdown-menu {\n  width: 280px;\n  padding: 0 0 0 0;\n  margin: 0;\n  top: 100%;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li,\n.navbar-nav > .messages-menu > .dropdown-menu > li,\n.navbar-nav > .tasks-menu > .dropdown-menu > li {\n  position: relative;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li.header,\n.navbar-nav > .messages-menu > .dropdown-menu > li.header,\n.navbar-nav > .tasks-menu > .dropdown-menu > li.header {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n  background-color: #ffffff;\n  padding: 7px 10px;\n  border-bottom: 1px solid #f4f4f4;\n  color: #444444;\n  font-size: 14px;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,\n.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,\n.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n  font-size: 12px;\n  background-color: #fff;\n  padding: 7px 10px;\n  border-bottom: 1px solid #eeeeee;\n  color: #444!important;\n  text-align: center;\n}\n@media (max-width: 991px) {\n  .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,\n  .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,\n  .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {\n    background: #fff!important;\n    color: #444!important;\n  }\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover,\n.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover,\n.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover {\n  text-decoration: none;\n  font-weight: normal;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu,\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu {\n  max-height: 200px;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow-x: hidden;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a,\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {\n  display: block;\n  white-space: nowrap;\n  /* Prevent text from breaking */\n  border-bottom: 1px solid #f4f4f4;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover,\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover {\n  background: #f4f4f4;\n  text-decoration: none;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a {\n  color: #444444;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  padding: 10px;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon,\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa,\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion {\n  width: 20px;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a {\n  margin: 0;\n  padding: 10px 10px;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img {\n  margin: auto 10px auto auto;\n  width: 40px;\n  height: 40px;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 {\n  padding: 0;\n  margin: 0 0 0 45px;\n  color: #444444;\n  font-size: 15px;\n  position: relative;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small {\n  color: #999999;\n  font-size: 10px;\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p {\n  margin: 0 0 0 45px;\n  font-size: 12px;\n  color: #888888;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {\n  content: \" \";\n  display: table;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {\n  clear: both;\n}\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {\n  padding: 10px;\n}\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 {\n  font-size: 14px;\n  padding: 0;\n  margin: 0 0 10px 0;\n  color: #666666;\n}\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress {\n  padding: 0;\n  margin: 0;\n}\n.navbar-nav > .user-menu > .dropdown-menu {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  padding: 1px 0 0 0;\n  border-top-width: 0;\n  width: 280px;\n}\n.navbar-nav > .user-menu > .dropdown-menu,\n.navbar-nav > .user-menu > .dropdown-menu > .user-body {\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header {\n  height: 175px;\n  padding: 10px;\n  text-align: center;\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img {\n  z-index: 5;\n  height: 90px;\n  width: 90px;\n  border: 3px solid;\n  border-color: transparent;\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p {\n  z-index: 5;\n  color: #fff;\n  color: rgba(255, 255, 255, 0.8);\n  font-size: 17px;\n  margin-top: 10px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small {\n  display: block;\n  font-size: 12px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body {\n  padding: 15px;\n  border-bottom: 1px solid #f4f4f4;\n  border-top: 1px solid #dddddd;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body:before,\n.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {\n  content: \" \";\n  display: table;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {\n  clear: both;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body a {\n  color: #444 !important;\n}\n@media (max-width: 991px) {\n  .navbar-nav > .user-menu > .dropdown-menu > .user-body a {\n    background: #fff !important;\n    color: #444 !important;\n  }\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer {\n  background-color: #f9f9f9;\n  padding: 10px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before,\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {\n  content: \" \";\n  display: table;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {\n  clear: both;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default {\n  color: #666666;\n}\n@media (max-width: 991px) {\n  .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover {\n    background-color: #f9f9f9;\n  }\n}\n.navbar-nav > .user-menu .user-image {\n  float: left;\n  width: 25px;\n  height: 25px;\n  border-radius: 50%;\n  margin-right: 10px;\n  margin-top: -2px;\n}\n@media (max-width: 767px) {\n  .navbar-nav > .user-menu .user-image {\n    float: none;\n    margin-right: 0;\n    margin-top: -8px;\n    line-height: 10px;\n  }\n}\n/* Add fade animation to dropdown menus by appending\n the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/\n.open:not(.dropup) > .animated-dropdown-menu {\n  backface-visibility: visible !important;\n  -webkit-animation: flipInX 0.7s both;\n  -o-animation: flipInX 0.7s both;\n  animation: flipInX 0.7s both;\n}\n@keyframes flipInX {\n  0% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transition-timing-function: ease-in;\n  }\n  60% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    transform: perspective(400px);\n  }\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n  }\n}\n/* Fix dropdown menu in navbars */\n.navbar-custom-menu > .navbar-nav > li {\n  position: relative;\n}\n.navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n  position: absolute;\n  right: 0;\n  left: auto;\n}\n@media (max-width: 991px) {\n  .navbar-custom-menu > .navbar-nav {\n    float: right;\n  }\n  .navbar-custom-menu > .navbar-nav > li {\n    position: static;\n  }\n  .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n    position: absolute;\n    right: 5%;\n    left: auto;\n    border: 1px solid #ddd;\n    background: #fff;\n  }\n}\n/*\n * Component: Form\n * ---------------\n */\n.form-control {\n  border-radius: 0;\n  box-shadow: none;\n  border-color: #d2d6de;\n}\n.form-control:focus {\n  border-color: #3c8dbc;\n  box-shadow: none;\n}\n.form-control::-moz-placeholder,\n.form-control:-ms-input-placeholder,\n.form-control::-webkit-input-placeholder {\n  color: #bbb;\n  opacity: 1;\n}\n.form-control:not(select) {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n.form-group.has-success label {\n  color: #00a65a;\n}\n.form-group.has-success .form-control {\n  border-color: #00a65a;\n  box-shadow: none;\n}\n.form-group.has-warning label {\n  color: #f39c12;\n}\n.form-group.has-warning .form-control {\n  border-color: #f39c12;\n  box-shadow: none;\n}\n.form-group.has-error label {\n  color: #dd4b39;\n}\n.form-group.has-error .form-control {\n  border-color: #dd4b39;\n  box-shadow: none;\n}\n/* Input group */\n.input-group .input-group-addon {\n  border-radius: 0;\n  border-color: #d2d6de;\n  background-color: #fff;\n}\n/* button groups */\n.btn-group-vertical .btn.btn-flat:first-of-type,\n.btn-group-vertical .btn.btn-flat:last-of-type {\n  border-radius: 0;\n}\n.icheck > label {\n  padding-left: 0;\n}\n/* support Font Awesome icons in form-control */\n.form-control-feedback.fa {\n  line-height: 34px;\n}\n.input-lg + .form-control-feedback.fa,\n.input-group-lg + .form-control-feedback.fa,\n.form-group-lg .form-control + .form-control-feedback.fa {\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback.fa,\n.input-group-sm + .form-control-feedback.fa,\n.form-group-sm .form-control + .form-control-feedback.fa {\n  line-height: 30px;\n}\n/*\n * Component: Progress Bar\n * -----------------------\n */\n.progress,\n.progress > .progress-bar {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.progress,\n.progress > .progress-bar,\n.progress .progress-bar,\n.progress > .progress-bar .progress-bar {\n  border-radius: 1px;\n}\n/* size variation */\n.progress.sm,\n.progress-sm {\n  height: 10px;\n}\n.progress.sm,\n.progress-sm,\n.progress.sm .progress-bar,\n.progress-sm .progress-bar {\n  border-radius: 1px;\n}\n.progress.xs,\n.progress-xs {\n  height: 7px;\n}\n.progress.xs,\n.progress-xs,\n.progress.xs .progress-bar,\n.progress-xs .progress-bar {\n  border-radius: 1px;\n}\n.progress.xxs,\n.progress-xxs {\n  height: 3px;\n}\n.progress.xxs,\n.progress-xxs,\n.progress.xxs .progress-bar,\n.progress-xxs .progress-bar {\n  border-radius: 1px;\n}\n/* Vertical bars */\n.progress.vertical {\n  position: relative;\n  width: 30px;\n  height: 200px;\n  display: inline-block;\n  margin-right: 10px;\n}\n.progress.vertical > .progress-bar {\n  width: 100%;\n  position: absolute;\n  bottom: 0;\n}\n.progress.vertical.sm,\n.progress.vertical.progress-sm {\n  width: 20px;\n}\n.progress.vertical.xs,\n.progress.vertical.progress-xs {\n  width: 10px;\n}\n.progress.vertical.xxs,\n.progress.vertical.progress-xxs {\n  width: 3px;\n}\n.progress-group .progress-text {\n  font-weight: 600;\n}\n.progress-group .progress-number {\n  float: right;\n}\n/* Remove margins from progress bars when put in a table */\n.table tr > td .progress {\n  margin: 0;\n}\n.progress-bar-light-blue,\n.progress-bar-primary {\n  background-color: #3c8dbc;\n}\n.progress-striped .progress-bar-light-blue,\n.progress-striped .progress-bar-primary {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-green,\n.progress-bar-success {\n  background-color: #00a65a;\n}\n.progress-striped .progress-bar-green,\n.progress-striped .progress-bar-success {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-aqua,\n.progress-bar-info {\n  background-color: #00c0ef;\n}\n.progress-striped .progress-bar-aqua,\n.progress-striped .progress-bar-info {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-yellow,\n.progress-bar-warning {\n  background-color: #f39c12;\n}\n.progress-striped .progress-bar-yellow,\n.progress-striped .progress-bar-warning {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-red,\n.progress-bar-danger {\n  background-color: #dd4b39;\n}\n.progress-striped .progress-bar-red,\n.progress-striped .progress-bar-danger {\n  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);\n  background-image: -o-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);\n  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);\n}\n/*\n * Component: Small Box\n * --------------------\n */\n.small-box {\n  border-radius: 2px;\n  position: relative;\n  display: block;\n  margin-bottom: 20px;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n}\n.small-box > .inner {\n  padding: 10px;\n}\n.small-box > .small-box-footer {\n  position: relative;\n  text-align: center;\n  padding: 3px 0;\n  color: #fff;\n  color: rgba(255, 255, 255, 0.8);\n  display: block;\n  z-index: 10;\n  background: rgba(0, 0, 0, 0.1);\n  text-decoration: none;\n}\n.small-box > .small-box-footer:hover {\n  color: #fff;\n  background: rgba(0, 0, 0, 0.15);\n}\n.small-box h3 {\n  font-size: 38px;\n  font-weight: bold;\n  margin: 0 0 10px 0;\n  white-space: nowrap;\n  padding: 0;\n}\n.small-box p {\n  font-size: 15px;\n}\n.small-box p > small {\n  display: block;\n  color: #f9f9f9;\n  font-size: 13px;\n  margin-top: 5px;\n}\n.small-box h3,\n.small-box p {\n  z-index: 5px;\n}\n.small-box .icon {\n  -webkit-transition: all 0.3s linear;\n  -o-transition: all 0.3s linear;\n  transition: all 0.3s linear;\n  position: absolute;\n  top: -10px;\n  right: 10px;\n  z-index: 0;\n  font-size: 90px;\n  color: rgba(0, 0, 0, 0.15);\n}\n.small-box:hover {\n  text-decoration: none;\n  color: #f9f9f9;\n}\n.small-box:hover .icon {\n  font-size: 95px;\n}\n@media (max-width: 767px) {\n  .small-box {\n    text-align: center;\n  }\n  .small-box .icon {\n    display: none;\n  }\n  .small-box p {\n    font-size: 12px;\n  }\n}\n/*\n * Component: Box\n * --------------\n */\n.box {\n  position: relative;\n  border-radius: 3px;\n  background: #ffffff;\n  border-top: 3px solid #d2d6de;\n  margin-bottom: 20px;\n  width: 100%;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n}\n.box.box-primary {\n  border-top-color: #3c8dbc;\n}\n.box.box-info {\n  border-top-color: #00c0ef;\n}\n.box.box-danger {\n  border-top-color: #dd4b39;\n}\n.box.box-warning {\n  border-top-color: #f39c12;\n}\n.box.box-success {\n  border-top-color: #00a65a;\n}\n.box.box-default {\n  border-top-color: #d2d6de;\n}\n.box.collapsed-box .box-body,\n.box.collapsed-box .box-footer {\n  display: none;\n}\n.box .nav-stacked > li {\n  border-bottom: 1px solid #f4f4f4;\n  margin: 0;\n}\n.box .nav-stacked > li:last-of-type {\n  border-bottom: none;\n}\n.box.height-control .box-body {\n  max-height: 300px;\n  overflow: auto;\n}\n.box .border-right {\n  border-right: 1px solid #f4f4f4;\n}\n.box .border-left {\n  border-left: 1px solid #f4f4f4;\n}\n.box.box-solid {\n  border-top: 0;\n}\n.box.box-solid > .box-header .btn.btn-default {\n  background: transparent;\n}\n.box.box-solid > .box-header .btn:hover,\n.box.box-solid > .box-header a:hover {\n  background: rgba(0, 0, 0, 0.1);\n}\n.box.box-solid.box-default {\n  border: 1px solid #d2d6de;\n}\n.box.box-solid.box-default > .box-header {\n  color: #444;\n  background: #d2d6de;\n  background-color: #d2d6de;\n}\n.box.box-solid.box-default > .box-header a,\n.box.box-solid.box-default > .box-header .btn {\n  color: #444;\n}\n.box.box-solid.box-primary {\n  border: 1px solid #3c8dbc;\n}\n.box.box-solid.box-primary > .box-header {\n  color: #fff;\n  background: #3c8dbc;\n  background-color: #3c8dbc;\n}\n.box.box-solid.box-primary > .box-header a,\n.box.box-solid.box-primary > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-info {\n  border: 1px solid #00c0ef;\n}\n.box.box-solid.box-info > .box-header {\n  color: #fff;\n  background: #00c0ef;\n  background-color: #00c0ef;\n}\n.box.box-solid.box-info > .box-header a,\n.box.box-solid.box-info > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-danger {\n  border: 1px solid #dd4b39;\n}\n.box.box-solid.box-danger > .box-header {\n  color: #fff;\n  background: #dd4b39;\n  background-color: #dd4b39;\n}\n.box.box-solid.box-danger > .box-header a,\n.box.box-solid.box-danger > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-warning {\n  border: 1px solid #f39c12;\n}\n.box.box-solid.box-warning > .box-header {\n  color: #fff;\n  background: #f39c12;\n  background-color: #f39c12;\n}\n.box.box-solid.box-warning > .box-header a,\n.box.box-solid.box-warning > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-success {\n  border: 1px solid #00a65a;\n}\n.box.box-solid.box-success > .box-header {\n  color: #fff;\n  background: #00a65a;\n  background-color: #00a65a;\n}\n.box.box-solid.box-success > .box-header a,\n.box.box-solid.box-success > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid > .box-header > .box-tools .btn {\n  border: 0;\n  box-shadow: none;\n}\n.box.box-solid[class*='bg'] > .box-header {\n  color: #fff;\n}\n.box .box-group > .box {\n  margin-bottom: 5px;\n}\n.box .knob-label {\n  text-align: center;\n  color: #333;\n  font-weight: 100;\n  font-size: 12px;\n  margin-bottom: 0.3em;\n}\n.box > .overlay,\n.overlay-wrapper > .overlay,\n.box > .loading-img,\n.overlay-wrapper > .loading-img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.box .overlay,\n.overlay-wrapper .overlay {\n  z-index: 50;\n  background: rgba(255, 255, 255, 0.7);\n  border-radius: 3px;\n}\n.box .overlay > .fa,\n.overlay-wrapper .overlay > .fa {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin-left: -15px;\n  margin-top: -15px;\n  color: #000;\n  font-size: 30px;\n}\n.box .overlay.dark,\n.overlay-wrapper .overlay.dark {\n  background: rgba(0, 0, 0, 0.5);\n}\n.box-header:before,\n.box-body:before,\n.box-footer:before,\n.box-header:after,\n.box-body:after,\n.box-footer:after {\n  content: \" \";\n  display: table;\n}\n.box-header:after,\n.box-body:after,\n.box-footer:after {\n  clear: both;\n}\n.box-header {\n  color: #444;\n  display: block;\n  padding: 10px;\n  position: relative;\n}\n.box-header.with-border {\n  border-bottom: 1px solid #f4f4f4;\n}\n.collapsed-box .box-header.with-border {\n  border-bottom: none;\n}\n.box-header > .fa,\n.box-header > .glyphicon,\n.box-header > .ion,\n.box-header .box-title {\n  display: inline-block;\n  font-size: 18px;\n  margin: 0;\n  line-height: 1;\n}\n.box-header > .fa,\n.box-header > .glyphicon,\n.box-header > .ion {\n  margin-right: 5px;\n}\n.box-header > .box-tools {\n  position: absolute;\n  right: 10px;\n  top: 5px;\n}\n.box-header > .box-tools [data-toggle=\"tooltip\"] {\n  position: relative;\n}\n.box-header > .box-tools.pull-right .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.btn-box-tool {\n  padding: 5px;\n  font-size: 12px;\n  background: transparent;\n  color: #97a0b3;\n}\n.open .btn-box-tool,\n.btn-box-tool:hover {\n  color: #606c84;\n}\n.btn-box-tool.btn:active {\n  box-shadow: none;\n}\n.box-body {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n  padding: 10px;\n}\n.no-header .box-body {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.box-body > .table {\n  margin-bottom: 0;\n}\n.box-body .fc {\n  margin-top: 5px;\n}\n.box-body .full-width-chart {\n  margin: -19px;\n}\n.box-body.no-padding .full-width-chart {\n  margin: -9px;\n}\n.box-body .box-pane {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 3px;\n}\n.box-body .box-pane-right {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 0;\n}\n.box-footer {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n  border-top: 1px solid #f4f4f4;\n  padding: 10px;\n  background-color: #fff;\n}\n.chart-legend {\n  margin: 10px 0;\n}\n@media (max-width: 991px) {\n  .chart-legend > li {\n    float: left;\n    margin-right: 10px;\n  }\n}\n.box-comments {\n  background: #f7f7f7;\n}\n.box-comments .box-comment {\n  padding: 8px 0;\n  border-bottom: 1px solid #eee;\n}\n.box-comments .box-comment:before,\n.box-comments .box-comment:after {\n  content: \" \";\n  display: table;\n}\n.box-comments .box-comment:after {\n  clear: both;\n}\n.box-comments .box-comment:last-of-type {\n  border-bottom: 0;\n}\n.box-comments .box-comment:first-of-type {\n  padding-top: 0;\n}\n.box-comments .box-comment img {\n  float: left;\n}\n.box-comments .comment-text {\n  margin-left: 40px;\n  color: #555;\n}\n.box-comments .username {\n  color: #444;\n  display: block;\n  font-weight: 600;\n}\n.box-comments .text-muted {\n  font-weight: 400;\n  font-size: 12px;\n}\n/* Widget: TODO LIST */\n.todo-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow: auto;\n}\n.todo-list > li {\n  border-radius: 2px;\n  padding: 10px;\n  background: #f4f4f4;\n  margin-bottom: 2px;\n  border-left: 2px solid #e6e7e8;\n  color: #444;\n}\n.todo-list > li:last-of-type {\n  margin-bottom: 0;\n}\n.todo-list > li > input[type='checkbox'] {\n  margin: 0 10px 0 5px;\n}\n.todo-list > li .text {\n  display: inline-block;\n  margin-left: 5px;\n  font-weight: 600;\n}\n.todo-list > li .label {\n  margin-left: 10px;\n  font-size: 9px;\n}\n.todo-list > li .tools {\n  display: none;\n  float: right;\n  color: #dd4b39;\n}\n.todo-list > li .tools > .fa,\n.todo-list > li .tools > .glyphicon,\n.todo-list > li .tools > .ion {\n  margin-right: 5px;\n  cursor: pointer;\n}\n.todo-list > li:hover .tools {\n  display: inline-block;\n}\n.todo-list > li.done {\n  color: #999;\n}\n.todo-list > li.done .text {\n  text-decoration: line-through;\n  font-weight: 500;\n}\n.todo-list > li.done .label {\n  background: #d2d6de !important;\n}\n.todo-list .danger {\n  border-left-color: #dd4b39;\n}\n.todo-list .warning {\n  border-left-color: #f39c12;\n}\n.todo-list .info {\n  border-left-color: #00c0ef;\n}\n.todo-list .success {\n  border-left-color: #00a65a;\n}\n.todo-list .primary {\n  border-left-color: #3c8dbc;\n}\n.todo-list .handle {\n  display: inline-block;\n  cursor: move;\n  margin: 0 5px;\n}\n/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/\n.chat {\n  padding: 5px 20px 5px 10px;\n}\n.chat .item {\n  margin-bottom: 10px;\n}\n.chat .item:before,\n.chat .item:after {\n  content: \" \";\n  display: table;\n}\n.chat .item:after {\n  clear: both;\n}\n.chat .item > img {\n  width: 40px;\n  height: 40px;\n  border: 2px solid transparent;\n  border-radius: 50%;\n}\n.chat .item > .online {\n  border: 2px solid #00a65a;\n}\n.chat .item > .offline {\n  border: 2px solid #dd4b39;\n}\n.chat .item > .message {\n  margin-left: 55px;\n  margin-top: -40px;\n}\n.chat .item > .message > .name {\n  display: block;\n  font-weight: 600;\n}\n.chat .item > .attachment {\n  border-radius: 3px;\n  background: #f4f4f4;\n  margin-left: 65px;\n  margin-right: 15px;\n  padding: 10px;\n}\n.chat .item > .attachment > h4 {\n  margin: 0 0 5px 0;\n  font-weight: 600;\n  font-size: 14px;\n}\n.chat .item > .attachment > p,\n.chat .item > .attachment > .filename {\n  font-weight: 600;\n  font-size: 13px;\n  font-style: italic;\n  margin: 0;\n}\n.chat .item > .attachment:before,\n.chat .item > .attachment:after {\n  content: \" \";\n  display: table;\n}\n.chat .item > .attachment:after {\n  clear: both;\n}\n.box-input {\n  max-width: 200px;\n}\n.modal .panel-body {\n  color: #444;\n}\n/*\n * Component: Info Box\n * -------------------\n */\n.info-box {\n  display: block;\n  min-height: 90px;\n  background: #fff;\n  width: 100%;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  border-radius: 2px;\n  margin-bottom: 15px;\n}\n.info-box small {\n  font-size: 14px;\n}\n.info-box .progress {\n  background: rgba(0, 0, 0, 0.2);\n  margin: 5px -10px 5px -10px;\n  height: 2px;\n}\n.info-box .progress,\n.info-box .progress .progress-bar {\n  border-radius: 0;\n}\n.info-box .progress .progress-bar {\n  background: #fff;\n}\n.info-box-icon {\n  border-top-left-radius: 2px;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 2px;\n  display: block;\n  float: left;\n  height: 90px;\n  width: 90px;\n  text-align: center;\n  font-size: 45px;\n  line-height: 90px;\n  background: rgba(0, 0, 0, 0.2);\n}\n.info-box-icon > img {\n  max-width: 100%;\n}\n.info-box-content {\n  padding: 5px 10px;\n  margin-left: 90px;\n}\n.info-box-number {\n  display: block;\n  font-weight: bold;\n  font-size: 18px;\n}\n.progress-description,\n.info-box-text {\n  display: block;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.info-box-text {\n  text-transform: uppercase;\n}\n.info-box-more {\n  display: block;\n}\n.progress-description {\n  margin: 0;\n}\n/*\n * Component: Button\n * -----------------\n */\n.btn {\n  border-radius: 3px;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  border: 1px solid transparent;\n}\n.btn.uppercase {\n  text-transform: uppercase;\n}\n.btn.btn-flat {\n  border-radius: 0;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  border-width: 1px;\n}\n.btn:active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn:focus {\n  outline: none;\n}\n.btn.btn-file {\n  position: relative;\n  overflow: hidden;\n}\n.btn.btn-file > input[type='file'] {\n  position: absolute;\n  top: 0;\n  right: 0;\n  min-width: 100%;\n  min-height: 100%;\n  font-size: 100px;\n  text-align: right;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  outline: none;\n  background: white;\n  cursor: inherit;\n  display: block;\n}\n.btn-default {\n  background-color: #f4f4f4;\n  color: #444;\n  border-color: #ddd;\n}\n.btn-default:hover,\n.btn-default:active,\n.btn-default.hover {\n  background-color: #e7e7e7;\n}\n.btn-primary {\n  background-color: #3c8dbc;\n  border-color: #367fa9;\n}\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary.hover {\n  background-color: #367fa9;\n}\n.btn-success {\n  background-color: #00a65a;\n  border-color: #008d4c;\n}\n.btn-success:hover,\n.btn-success:active,\n.btn-success.hover {\n  background-color: #008d4c;\n}\n.btn-info {\n  background-color: #00c0ef;\n  border-color: #00acd6;\n}\n.btn-info:hover,\n.btn-info:active,\n.btn-info.hover {\n  background-color: #00acd6;\n}\n.btn-danger {\n  background-color: #dd4b39;\n  border-color: #d73925;\n}\n.btn-danger:hover,\n.btn-danger:active,\n.btn-danger.hover {\n  background-color: #d73925;\n}\n.btn-warning {\n  background-color: #f39c12;\n  border-color: #e08e0b;\n}\n.btn-warning:hover,\n.btn-warning:active,\n.btn-warning.hover {\n  background-color: #e08e0b;\n}\n.btn-outline {\n  border: 1px solid #fff;\n  background: transparent;\n  color: #fff;\n}\n.btn-outline:hover,\n.btn-outline:focus,\n.btn-outline:active {\n  color: rgba(255, 255, 255, 0.7);\n  border-color: rgba(255, 255, 255, 0.7);\n}\n.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn[class*='bg-']:hover {\n  -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);\n  box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);\n}\n.btn-app {\n  border-radius: 3px;\n  position: relative;\n  padding: 15px 5px;\n  margin: 0 0 10px 10px;\n  min-width: 80px;\n  height: 60px;\n  text-align: center;\n  color: #666;\n  border: 1px solid #ddd;\n  background-color: #f4f4f4;\n  font-size: 12px;\n}\n.btn-app > .fa,\n.btn-app > .glyphicon,\n.btn-app > .ion {\n  font-size: 20px;\n  display: block;\n}\n.btn-app:hover {\n  background: #f4f4f4;\n  color: #444;\n  border-color: #aaa;\n}\n.btn-app:active,\n.btn-app:focus {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-app > .badge {\n  position: absolute;\n  top: -3px;\n  right: -10px;\n  font-size: 10px;\n  font-weight: 400;\n}\n/*\n * Component: Callout\n * ------------------\n */\n.callout {\n  border-radius: 3px;\n  margin: 0 0 20px 0;\n  padding: 15px 30px 15px 15px;\n  border-left: 5px solid #eee;\n}\n.callout a {\n  color: #fff;\n  text-decoration: underline;\n}\n.callout a:hover {\n  color: #eee;\n}\n.callout h4 {\n  margin-top: 0;\n  font-weight: 600;\n}\n.callout p:last-child {\n  margin-bottom: 0;\n}\n.callout code,\n.callout .highlight {\n  background-color: #fff;\n}\n.callout.callout-danger {\n  border-color: #c23321;\n}\n.callout.callout-warning {\n  border-color: #c87f0a;\n}\n.callout.callout-info {\n  border-color: #0097bc;\n}\n.callout.callout-success {\n  border-color: #00733e;\n}\n/*\n * Component: alert\n * ----------------\n */\n.alert {\n  border-radius: 3px;\n}\n.alert h4 {\n  font-weight: 600;\n}\n.alert .icon {\n  margin-right: 10px;\n}\n.alert .close {\n  color: #000;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.alert .close:hover {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.alert a {\n  color: #fff;\n  text-decoration: underline;\n}\n.alert-success {\n  border-color: #008d4c;\n}\n.alert-danger,\n.alert-error {\n  border-color: #d73925;\n}\n.alert-warning {\n  border-color: #e08e0b;\n}\n.alert-info {\n  border-color: #00acd6;\n}\n/*\n * Component: Nav\n * --------------\n */\n.nav > li > a:hover,\n.nav > li > a:active,\n.nav > li > a:focus {\n  color: #444;\n  background: #f7f7f7;\n}\n/* NAV PILLS */\n.nav-pills > li > a {\n  border-radius: 0;\n  border-top: 3px solid transparent;\n  color: #444;\n}\n.nav-pills > li > a > .fa,\n.nav-pills > li > a > .glyphicon,\n.nav-pills > li > a > .ion {\n  margin-right: 5px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  border-top-color: #3c8dbc;\n}\n.nav-pills > li.active > a {\n  font-weight: 600;\n}\n/* NAV STACKED */\n.nav-stacked > li > a {\n  border-radius: 0;\n  border-top: 0;\n  border-left: 3px solid transparent;\n  color: #444;\n}\n.nav-stacked > li.active > a,\n.nav-stacked > li.active > a:hover {\n  background: transparent;\n  color: #444;\n  border-top: 0;\n  border-left-color: #3c8dbc;\n}\n.nav-stacked > li.header {\n  border-bottom: 1px solid #ddd;\n  color: #777;\n  margin-bottom: 10px;\n  padding: 5px 10px;\n  text-transform: uppercase;\n}\n/* NAV TABS */\n.nav-tabs-custom {\n  margin-bottom: 20px;\n  background: #fff;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  border-radius: 3px;\n}\n.nav-tabs-custom > .nav-tabs {\n  margin: 0;\n  border-bottom-color: #f4f4f4;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.nav-tabs-custom > .nav-tabs > li {\n  border-top: 3px solid transparent;\n  margin-bottom: -2px;\n  margin-right: 5px;\n}\n.nav-tabs-custom > .nav-tabs > li > a {\n  color: #444;\n  border-radius: 0;\n}\n.nav-tabs-custom > .nav-tabs > li > a.text-muted {\n  color: #999;\n}\n.nav-tabs-custom > .nav-tabs > li > a,\n.nav-tabs-custom > .nav-tabs > li > a:hover {\n  background: transparent;\n  margin: 0;\n}\n.nav-tabs-custom > .nav-tabs > li > a:hover {\n  color: #999;\n}\n.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover,\n.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus,\n.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active {\n  border-color: transparent;\n}\n.nav-tabs-custom > .nav-tabs > li.active {\n  border-top-color: #3c8dbc;\n}\n.nav-tabs-custom > .nav-tabs > li.active > a,\n.nav-tabs-custom > .nav-tabs > li.active:hover > a {\n  background-color: #fff;\n  color: #444;\n}\n.nav-tabs-custom > .nav-tabs > li.active > a {\n  border-top-color: transparent;\n  border-left-color: #f4f4f4;\n  border-right-color: #f4f4f4;\n}\n.nav-tabs-custom > .nav-tabs > li:first-of-type {\n  margin-left: 0;\n}\n.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a {\n  border-left-color: transparent;\n}\n.nav-tabs-custom > .nav-tabs.pull-right {\n  float: none!important;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li {\n  float: right;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type {\n  margin-right: 0;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a {\n  border-left-width: 1px;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a {\n  border-left-color: #f4f4f4;\n  border-right-color: transparent;\n}\n.nav-tabs-custom > .nav-tabs > li.header {\n  line-height: 35px;\n  padding: 0 10px;\n  font-size: 20px;\n  color: #444;\n}\n.nav-tabs-custom > .nav-tabs > li.header > .fa,\n.nav-tabs-custom > .nav-tabs > li.header > .glyphicon,\n.nav-tabs-custom > .nav-tabs > li.header > .ion {\n  margin-right: 5px;\n}\n.nav-tabs-custom > .tab-content {\n  background: #fff;\n  padding: 10px;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.nav-tabs-custom .dropdown.open > a:active,\n.nav-tabs-custom .dropdown.open > a:focus {\n  background: transparent;\n  color: #999;\n}\n/* PAGINATION */\n.pagination > li > a {\n  background: #fafafa;\n  color: #666;\n}\n.pagination.pagination-flat > li > a {\n  border-radius: 0 !important;\n}\n/*\n * Component: Table\n * ----------------\n */\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  border-top: 1px solid #f4f4f4;\n}\n.table > thead > tr > th {\n  border-bottom: 2px solid #f4f4f4;\n}\n.table tr td .progress {\n  margin-top: 5px;\n}\n.table-bordered {\n  border: 1px solid #f4f4f4;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #f4f4f4;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table.no-border,\n.table.no-border td,\n.table.no-border th {\n  border: 0;\n}\n/* .text-center in tables */\ntable.text-center,\ntable.text-center td,\ntable.text-center th {\n  text-align: center;\n}\n.table.align th {\n  text-align: left;\n}\n.table.align td {\n  text-align: right;\n}\n/*\n * Component: Label\n * ----------------\n */\n.label-default {\n  background-color: #d2d6de;\n  color: #444;\n}\n/*\n * Component: Direct Chat\n * ----------------------\n */\n.direct-chat .box-body {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n  position: relative;\n  overflow-x: hidden;\n  padding: 0;\n}\n.direct-chat.chat-pane-open .direct-chat-contacts {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.direct-chat-messages {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n  padding: 10px;\n  height: 250px;\n  overflow: auto;\n}\n.direct-chat-msg,\n.direct-chat-text {\n  display: block;\n}\n.direct-chat-msg {\n  margin-bottom: 10px;\n}\n.direct-chat-msg:before,\n.direct-chat-msg:after {\n  content: \" \";\n  display: table;\n}\n.direct-chat-msg:after {\n  clear: both;\n}\n.direct-chat-messages,\n.direct-chat-contacts {\n  -webkit-transition: -webkit-transform 0.5s ease-in-out;\n  -moz-transition: -moz-transform 0.5s ease-in-out;\n  -o-transition: -o-transform 0.5s ease-in-out;\n  transition: transform 0.5s ease-in-out;\n}\n.direct-chat-text {\n  border-radius: 5px;\n  position: relative;\n  padding: 5px 10px;\n  background: #d2d6de;\n  border: 1px solid #d2d6de;\n  margin: 5px 0 0 50px;\n  color: #444;\n}\n.direct-chat-text:after,\n.direct-chat-text:before {\n  position: absolute;\n  right: 100%;\n  top: 15px;\n  border: solid transparent;\n  border-right-color: #d2d6de;\n  content: ' ';\n  height: 0;\n  width: 0;\n  pointer-events: none;\n}\n.direct-chat-text:after {\n  border-width: 5px;\n  margin-top: -5px;\n}\n.direct-chat-text:before {\n  border-width: 6px;\n  margin-top: -6px;\n}\n.right .direct-chat-text {\n  margin-right: 50px;\n  margin-left: 0;\n}\n.right .direct-chat-text:after,\n.right .direct-chat-text:before {\n  right: auto;\n  left: 100%;\n  border-right-color: transparent;\n  border-left-color: #d2d6de;\n}\n.direct-chat-img {\n  border-radius: 50%;\n  float: left;\n  width: 40px;\n  height: 40px;\n}\n.right .direct-chat-img {\n  float: right;\n}\n.direct-chat-info {\n  display: block;\n  margin-bottom: 2px;\n  font-size: 12px;\n}\n.direct-chat-name {\n  font-weight: 600;\n}\n.direct-chat-timestamp {\n  color: #999;\n}\n.direct-chat-contacts-open .direct-chat-contacts {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.direct-chat-contacts {\n  -webkit-transform: translate(101%, 0);\n  -ms-transform: translate(101%, 0);\n  -o-transform: translate(101%, 0);\n  transform: translate(101%, 0);\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  height: 250px;\n  width: 100%;\n  background: #222d32;\n  color: #fff;\n  overflow: auto;\n}\n.contacts-list > li {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  padding: 10px;\n  margin: 0;\n}\n.contacts-list > li:before,\n.contacts-list > li:after {\n  content: \" \";\n  display: table;\n}\n.contacts-list > li:after {\n  clear: both;\n}\n.contacts-list > li:last-of-type {\n  border-bottom: none;\n}\n.contacts-list-img {\n  border-radius: 50%;\n  width: 40px;\n  float: left;\n}\n.contacts-list-info {\n  margin-left: 45px;\n  color: #fff;\n}\n.contacts-list-name,\n.contacts-list-status {\n  display: block;\n}\n.contacts-list-name {\n  font-weight: 600;\n}\n.contacts-list-status {\n  font-size: 12px;\n}\n.contacts-list-date {\n  color: #aaa;\n  font-weight: normal;\n}\n.contacts-list-msg {\n  color: #999;\n}\n.direct-chat-danger .right > .direct-chat-text {\n  background: #dd4b39;\n  border-color: #dd4b39;\n  color: #fff;\n}\n.direct-chat-danger .right > .direct-chat-text:after,\n.direct-chat-danger .right > .direct-chat-text:before {\n  border-left-color: #dd4b39;\n}\n.direct-chat-primary .right > .direct-chat-text {\n  background: #3c8dbc;\n  border-color: #3c8dbc;\n  color: #fff;\n}\n.direct-chat-primary .right > .direct-chat-text:after,\n.direct-chat-primary .right > .direct-chat-text:before {\n  border-left-color: #3c8dbc;\n}\n.direct-chat-warning .right > .direct-chat-text {\n  background: #f39c12;\n  border-color: #f39c12;\n  color: #fff;\n}\n.direct-chat-warning .right > .direct-chat-text:after,\n.direct-chat-warning .right > .direct-chat-text:before {\n  border-left-color: #f39c12;\n}\n.direct-chat-info .right > .direct-chat-text {\n  background: #00c0ef;\n  border-color: #00c0ef;\n  color: #fff;\n}\n.direct-chat-info .right > .direct-chat-text:after,\n.direct-chat-info .right > .direct-chat-text:before {\n  border-left-color: #00c0ef;\n}\n.direct-chat-success .right > .direct-chat-text {\n  background: #00a65a;\n  border-color: #00a65a;\n  color: #fff;\n}\n.direct-chat-success .right > .direct-chat-text:after,\n.direct-chat-success .right > .direct-chat-text:before {\n  border-left-color: #00a65a;\n}\n/*\n * Component: Users List\n * ---------------------\n */\n.users-list > li {\n  width: 25%;\n  float: left;\n  padding: 10px;\n  text-align: center;\n}\n.users-list > li img {\n  border-radius: 50%;\n  max-width: 100%;\n  height: auto;\n}\n.users-list > li > a:hover,\n.users-list > li > a:hover .users-list-name {\n  color: #999;\n}\n.users-list-name,\n.users-list-date {\n  display: block;\n}\n.users-list-name {\n  font-weight: 600;\n  color: #444;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.users-list-date {\n  color: #999;\n  font-size: 12px;\n}\n/*\n * Component: modal\n * ----------------\n */\n.modal {\n  background: rgba(0, 0, 0, 0.3);\n}\n.modal-content {\n  border-radius: 0;\n  -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n  border: 0;\n}\n@media (min-width: 768px) {\n  .modal-content {\n    -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n    box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n  }\n}\n.modal-header {\n  border-bottom-color: #f4f4f4;\n}\n.modal-footer {\n  border-top-color: #f4f4f4;\n}\n.modal-primary .modal-header,\n.modal-primary .modal-footer {\n  border-color: #307095;\n}\n.modal-warning .modal-header,\n.modal-warning .modal-footer {\n  border-color: #c87f0a;\n}\n.modal-info .modal-header,\n.modal-info .modal-footer {\n  border-color: #0097bc;\n}\n.modal-success .modal-header,\n.modal-success .modal-footer {\n  border-color: #00733e;\n}\n.modal-danger .modal-header,\n.modal-danger .modal-footer {\n  border-color: #c23321;\n}\n/*\n * Page: Login & Register\n * ----------------------\n */\n.login-logo,\n.register-logo {\n  font-size: 35px;\n  text-align: center;\n  margin-bottom: 25px;\n  font-weight: 300;\n}\n.login-logo a,\n.register-logo a {\n  color: #444;\n}\n.login-page,\n.register-page {\n  background: #d2d6de;\n}\n.login-box,\n.register-box {\n  width: 360px;\n  margin: 7% auto;\n}\n@media (max-width: 768px) {\n  .login-box,\n  .register-box {\n    width: 90%;\n    margin-top: 20px;\n  }\n}\n.login-box-body,\n.register-box-body {\n  background: #fff;\n  padding: 20px;\n  border-top: 0;\n  color: #666;\n}\n.login-box-body .form-control-feedback,\n.register-box-body .form-control-feedback {\n  color: #777;\n}\n.login-box-msg,\n.register-box-msg {\n  margin: 0;\n  text-align: center;\n  padding: 0 20px 20px 20px;\n}\n.social-auth-links {\n  margin: 10px 0;\n}\n/*\n * Page: 400 and 500 error pages\n * ------------------------------\n */\n.error-page {\n  width: 600px;\n  margin: 20px auto 0 auto;\n}\n@media (max-width: 991px) {\n  .error-page {\n    width: 100%;\n  }\n}\n.error-page > .headline {\n  float: left;\n  font-size: 100px;\n  font-weight: 300;\n}\n@media (max-width: 991px) {\n  .error-page > .headline {\n    float: none;\n    text-align: center;\n  }\n}\n.error-page > .error-content {\n  margin-left: 190px;\n  display: block;\n}\n@media (max-width: 991px) {\n  .error-page > .error-content {\n    margin-left: 0;\n  }\n}\n.error-page > .error-content > h3 {\n  font-weight: 300;\n  font-size: 25px;\n}\n@media (max-width: 991px) {\n  .error-page > .error-content > h3 {\n    text-align: center;\n  }\n}\n/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2015 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n.btn-social {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.btn-social > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social.btn-lg {\n  padding-left: 61px;\n}\n.btn-social.btn-lg > :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social.btn-sm {\n  padding-left: 38px;\n}\n.btn-social.btn-sm > :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social.btn-xs {\n  padding-left: 30px;\n}\n.btn-social.btn-xs > :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  height: 34px;\n  width: 34px;\n  padding: 0;\n}\n.btn-social-icon > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social-icon.btn-lg {\n  padding-left: 61px;\n}\n.btn-social-icon.btn-lg > :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social-icon.btn-sm {\n  padding-left: 38px;\n}\n.btn-social-icon.btn-sm > :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social-icon.btn-xs {\n  padding-left: 30px;\n}\n.btn-social-icon.btn-xs > :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon > :first-child {\n  border: none;\n  text-align: center;\n  width: 100%;\n}\n.btn-social-icon.btn-lg {\n  height: 45px;\n  width: 45px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-sm {\n  height: 30px;\n  width: 30px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-xs {\n  height: 22px;\n  width: 22px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-adn {\n  color: #fff;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:hover,\n.btn-adn:focus,\n.btn-adn.focus,\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  color: #fff;\n  background-color: #ce563f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  background-image: none;\n}\n.btn-adn.disabled,\n.btn-adn[disabled],\nfieldset[disabled] .btn-adn,\n.btn-adn.disabled:hover,\n.btn-adn[disabled]:hover,\nfieldset[disabled] .btn-adn:hover,\n.btn-adn.disabled:focus,\n.btn-adn[disabled]:focus,\nfieldset[disabled] .btn-adn:focus,\n.btn-adn.disabled.focus,\n.btn-adn[disabled].focus,\nfieldset[disabled] .btn-adn.focus,\n.btn-adn.disabled:active,\n.btn-adn[disabled]:active,\nfieldset[disabled] .btn-adn:active,\n.btn-adn.disabled.active,\n.btn-adn[disabled].active,\nfieldset[disabled] .btn-adn.active {\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn .badge {\n  color: #d87a68;\n  background-color: #fff;\n}\n.btn-bitbucket {\n  color: #fff;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:hover,\n.btn-bitbucket:focus,\n.btn-bitbucket.focus,\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  color: #fff;\n  background-color: #163758;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  background-image: none;\n}\n.btn-bitbucket.disabled,\n.btn-bitbucket[disabled],\nfieldset[disabled] .btn-bitbucket,\n.btn-bitbucket.disabled:hover,\n.btn-bitbucket[disabled]:hover,\nfieldset[disabled] .btn-bitbucket:hover,\n.btn-bitbucket.disabled:focus,\n.btn-bitbucket[disabled]:focus,\nfieldset[disabled] .btn-bitbucket:focus,\n.btn-bitbucket.disabled.focus,\n.btn-bitbucket[disabled].focus,\nfieldset[disabled] .btn-bitbucket.focus,\n.btn-bitbucket.disabled:active,\n.btn-bitbucket[disabled]:active,\nfieldset[disabled] .btn-bitbucket:active,\n.btn-bitbucket.disabled.active,\n.btn-bitbucket[disabled].active,\nfieldset[disabled] .btn-bitbucket.active {\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket .badge {\n  color: #205081;\n  background-color: #fff;\n}\n.btn-dropbox {\n  color: #fff;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:hover,\n.btn-dropbox:focus,\n.btn-dropbox.focus,\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  color: #fff;\n  background-color: #0d6aad;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  background-image: none;\n}\n.btn-dropbox.disabled,\n.btn-dropbox[disabled],\nfieldset[disabled] .btn-dropbox,\n.btn-dropbox.disabled:hover,\n.btn-dropbox[disabled]:hover,\nfieldset[disabled] .btn-dropbox:hover,\n.btn-dropbox.disabled:focus,\n.btn-dropbox[disabled]:focus,\nfieldset[disabled] .btn-dropbox:focus,\n.btn-dropbox.disabled.focus,\n.btn-dropbox[disabled].focus,\nfieldset[disabled] .btn-dropbox.focus,\n.btn-dropbox.disabled:active,\n.btn-dropbox[disabled]:active,\nfieldset[disabled] .btn-dropbox:active,\n.btn-dropbox.disabled.active,\n.btn-dropbox[disabled].active,\nfieldset[disabled] .btn-dropbox.active {\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox .badge {\n  color: #1087dd;\n  background-color: #fff;\n}\n.btn-facebook {\n  color: #fff;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:hover,\n.btn-facebook:focus,\n.btn-facebook.focus,\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  color: #fff;\n  background-color: #2d4373;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  background-image: none;\n}\n.btn-facebook.disabled,\n.btn-facebook[disabled],\nfieldset[disabled] .btn-facebook,\n.btn-facebook.disabled:hover,\n.btn-facebook[disabled]:hover,\nfieldset[disabled] .btn-facebook:hover,\n.btn-facebook.disabled:focus,\n.btn-facebook[disabled]:focus,\nfieldset[disabled] .btn-facebook:focus,\n.btn-facebook.disabled.focus,\n.btn-facebook[disabled].focus,\nfieldset[disabled] .btn-facebook.focus,\n.btn-facebook.disabled:active,\n.btn-facebook[disabled]:active,\nfieldset[disabled] .btn-facebook:active,\n.btn-facebook.disabled.active,\n.btn-facebook[disabled].active,\nfieldset[disabled] .btn-facebook.active {\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook .badge {\n  color: #3b5998;\n  background-color: #fff;\n}\n.btn-flickr {\n  color: #fff;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:hover,\n.btn-flickr:focus,\n.btn-flickr.focus,\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  color: #fff;\n  background-color: #cc006a;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  background-image: none;\n}\n.btn-flickr.disabled,\n.btn-flickr[disabled],\nfieldset[disabled] .btn-flickr,\n.btn-flickr.disabled:hover,\n.btn-flickr[disabled]:hover,\nfieldset[disabled] .btn-flickr:hover,\n.btn-flickr.disabled:focus,\n.btn-flickr[disabled]:focus,\nfieldset[disabled] .btn-flickr:focus,\n.btn-flickr.disabled.focus,\n.btn-flickr[disabled].focus,\nfieldset[disabled] .btn-flickr.focus,\n.btn-flickr.disabled:active,\n.btn-flickr[disabled]:active,\nfieldset[disabled] .btn-flickr:active,\n.btn-flickr.disabled.active,\n.btn-flickr[disabled].active,\nfieldset[disabled] .btn-flickr.active {\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr .badge {\n  color: #ff0084;\n  background-color: #fff;\n}\n.btn-foursquare {\n  color: #fff;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:hover,\n.btn-foursquare:focus,\n.btn-foursquare.focus,\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  color: #fff;\n  background-color: #f71752;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  background-image: none;\n}\n.btn-foursquare.disabled,\n.btn-foursquare[disabled],\nfieldset[disabled] .btn-foursquare,\n.btn-foursquare.disabled:hover,\n.btn-foursquare[disabled]:hover,\nfieldset[disabled] .btn-foursquare:hover,\n.btn-foursquare.disabled:focus,\n.btn-foursquare[disabled]:focus,\nfieldset[disabled] .btn-foursquare:focus,\n.btn-foursquare.disabled.focus,\n.btn-foursquare[disabled].focus,\nfieldset[disabled] .btn-foursquare.focus,\n.btn-foursquare.disabled:active,\n.btn-foursquare[disabled]:active,\nfieldset[disabled] .btn-foursquare:active,\n.btn-foursquare.disabled.active,\n.btn-foursquare[disabled].active,\nfieldset[disabled] .btn-foursquare.active {\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare .badge {\n  color: #f94877;\n  background-color: #fff;\n}\n.btn-github {\n  color: #fff;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:hover,\n.btn-github:focus,\n.btn-github.focus,\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  color: #fff;\n  background-color: #2b2b2b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  background-image: none;\n}\n.btn-github.disabled,\n.btn-github[disabled],\nfieldset[disabled] .btn-github,\n.btn-github.disabled:hover,\n.btn-github[disabled]:hover,\nfieldset[disabled] .btn-github:hover,\n.btn-github.disabled:focus,\n.btn-github[disabled]:focus,\nfieldset[disabled] .btn-github:focus,\n.btn-github.disabled.focus,\n.btn-github[disabled].focus,\nfieldset[disabled] .btn-github.focus,\n.btn-github.disabled:active,\n.btn-github[disabled]:active,\nfieldset[disabled] .btn-github:active,\n.btn-github.disabled.active,\n.btn-github[disabled].active,\nfieldset[disabled] .btn-github.active {\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github .badge {\n  color: #444444;\n  background-color: #fff;\n}\n.btn-google {\n  color: #fff;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google:hover,\n.btn-google:focus,\n.btn-google.focus,\n.btn-google:active,\n.btn-google.active,\n.open > .dropdown-toggle.btn-google {\n  color: #fff;\n  background-color: #c23321;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google:active,\n.btn-google.active,\n.open > .dropdown-toggle.btn-google {\n  background-image: none;\n}\n.btn-google.disabled,\n.btn-google[disabled],\nfieldset[disabled] .btn-google,\n.btn-google.disabled:hover,\n.btn-google[disabled]:hover,\nfieldset[disabled] .btn-google:hover,\n.btn-google.disabled:focus,\n.btn-google[disabled]:focus,\nfieldset[disabled] .btn-google:focus,\n.btn-google.disabled.focus,\n.btn-google[disabled].focus,\nfieldset[disabled] .btn-google.focus,\n.btn-google.disabled:active,\n.btn-google[disabled]:active,\nfieldset[disabled] .btn-google:active,\n.btn-google.disabled.active,\n.btn-google[disabled].active,\nfieldset[disabled] .btn-google.active {\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google .badge {\n  color: #dd4b39;\n  background-color: #fff;\n}\n.btn-instagram {\n  color: #fff;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:hover,\n.btn-instagram:focus,\n.btn-instagram.focus,\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  color: #fff;\n  background-color: #305777;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  background-image: none;\n}\n.btn-instagram.disabled,\n.btn-instagram[disabled],\nfieldset[disabled] .btn-instagram,\n.btn-instagram.disabled:hover,\n.btn-instagram[disabled]:hover,\nfieldset[disabled] .btn-instagram:hover,\n.btn-instagram.disabled:focus,\n.btn-instagram[disabled]:focus,\nfieldset[disabled] .btn-instagram:focus,\n.btn-instagram.disabled.focus,\n.btn-instagram[disabled].focus,\nfieldset[disabled] .btn-instagram.focus,\n.btn-instagram.disabled:active,\n.btn-instagram[disabled]:active,\nfieldset[disabled] .btn-instagram:active,\n.btn-instagram.disabled.active,\n.btn-instagram[disabled].active,\nfieldset[disabled] .btn-instagram.active {\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram .badge {\n  color: #3f729b;\n  background-color: #fff;\n}\n.btn-linkedin {\n  color: #fff;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:hover,\n.btn-linkedin:focus,\n.btn-linkedin.focus,\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  color: #fff;\n  background-color: #005983;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  background-image: none;\n}\n.btn-linkedin.disabled,\n.btn-linkedin[disabled],\nfieldset[disabled] .btn-linkedin,\n.btn-linkedin.disabled:hover,\n.btn-linkedin[disabled]:hover,\nfieldset[disabled] .btn-linkedin:hover,\n.btn-linkedin.disabled:focus,\n.btn-linkedin[disabled]:focus,\nfieldset[disabled] .btn-linkedin:focus,\n.btn-linkedin.disabled.focus,\n.btn-linkedin[disabled].focus,\nfieldset[disabled] .btn-linkedin.focus,\n.btn-linkedin.disabled:active,\n.btn-linkedin[disabled]:active,\nfieldset[disabled] .btn-linkedin:active,\n.btn-linkedin.disabled.active,\n.btn-linkedin[disabled].active,\nfieldset[disabled] .btn-linkedin.active {\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin .badge {\n  color: #007bb6;\n  background-color: #fff;\n}\n.btn-microsoft {\n  color: #fff;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:hover,\n.btn-microsoft:focus,\n.btn-microsoft.focus,\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  color: #fff;\n  background-color: #125acd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  background-image: none;\n}\n.btn-microsoft.disabled,\n.btn-microsoft[disabled],\nfieldset[disabled] .btn-microsoft,\n.btn-microsoft.disabled:hover,\n.btn-microsoft[disabled]:hover,\nfieldset[disabled] .btn-microsoft:hover,\n.btn-microsoft.disabled:focus,\n.btn-microsoft[disabled]:focus,\nfieldset[disabled] .btn-microsoft:focus,\n.btn-microsoft.disabled.focus,\n.btn-microsoft[disabled].focus,\nfieldset[disabled] .btn-microsoft.focus,\n.btn-microsoft.disabled:active,\n.btn-microsoft[disabled]:active,\nfieldset[disabled] .btn-microsoft:active,\n.btn-microsoft.disabled.active,\n.btn-microsoft[disabled].active,\nfieldset[disabled] .btn-microsoft.active {\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft .badge {\n  color: #2672ec;\n  background-color: #fff;\n}\n.btn-openid {\n  color: #fff;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:hover,\n.btn-openid:focus,\n.btn-openid.focus,\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  color: #fff;\n  background-color: #da7908;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  background-image: none;\n}\n.btn-openid.disabled,\n.btn-openid[disabled],\nfieldset[disabled] .btn-openid,\n.btn-openid.disabled:hover,\n.btn-openid[disabled]:hover,\nfieldset[disabled] .btn-openid:hover,\n.btn-openid.disabled:focus,\n.btn-openid[disabled]:focus,\nfieldset[disabled] .btn-openid:focus,\n.btn-openid.disabled.focus,\n.btn-openid[disabled].focus,\nfieldset[disabled] .btn-openid.focus,\n.btn-openid.disabled:active,\n.btn-openid[disabled]:active,\nfieldset[disabled] .btn-openid:active,\n.btn-openid.disabled.active,\n.btn-openid[disabled].active,\nfieldset[disabled] .btn-openid.active {\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid .badge {\n  color: #f7931e;\n  background-color: #fff;\n}\n.btn-pinterest {\n  color: #fff;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:hover,\n.btn-pinterest:focus,\n.btn-pinterest.focus,\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  color: #fff;\n  background-color: #9f191f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  background-image: none;\n}\n.btn-pinterest.disabled,\n.btn-pinterest[disabled],\nfieldset[disabled] .btn-pinterest,\n.btn-pinterest.disabled:hover,\n.btn-pinterest[disabled]:hover,\nfieldset[disabled] .btn-pinterest:hover,\n.btn-pinterest.disabled:focus,\n.btn-pinterest[disabled]:focus,\nfieldset[disabled] .btn-pinterest:focus,\n.btn-pinterest.disabled.focus,\n.btn-pinterest[disabled].focus,\nfieldset[disabled] .btn-pinterest.focus,\n.btn-pinterest.disabled:active,\n.btn-pinterest[disabled]:active,\nfieldset[disabled] .btn-pinterest:active,\n.btn-pinterest.disabled.active,\n.btn-pinterest[disabled].active,\nfieldset[disabled] .btn-pinterest.active {\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest .badge {\n  color: #cb2027;\n  background-color: #fff;\n}\n.btn-reddit {\n  color: #000;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:hover,\n.btn-reddit:focus,\n.btn-reddit.focus,\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  color: #000;\n  background-color: #bcddff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  background-image: none;\n}\n.btn-reddit.disabled,\n.btn-reddit[disabled],\nfieldset[disabled] .btn-reddit,\n.btn-reddit.disabled:hover,\n.btn-reddit[disabled]:hover,\nfieldset[disabled] .btn-reddit:hover,\n.btn-reddit.disabled:focus,\n.btn-reddit[disabled]:focus,\nfieldset[disabled] .btn-reddit:focus,\n.btn-reddit.disabled.focus,\n.btn-reddit[disabled].focus,\nfieldset[disabled] .btn-reddit.focus,\n.btn-reddit.disabled:active,\n.btn-reddit[disabled]:active,\nfieldset[disabled] .btn-reddit:active,\n.btn-reddit.disabled.active,\n.btn-reddit[disabled].active,\nfieldset[disabled] .btn-reddit.active {\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit .badge {\n  color: #eff7ff;\n  background-color: #000;\n}\n.btn-soundcloud {\n  color: #fff;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:hover,\n.btn-soundcloud:focus,\n.btn-soundcloud.focus,\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  color: #fff;\n  background-color: #cc4400;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  background-image: none;\n}\n.btn-soundcloud.disabled,\n.btn-soundcloud[disabled],\nfieldset[disabled] .btn-soundcloud,\n.btn-soundcloud.disabled:hover,\n.btn-soundcloud[disabled]:hover,\nfieldset[disabled] .btn-soundcloud:hover,\n.btn-soundcloud.disabled:focus,\n.btn-soundcloud[disabled]:focus,\nfieldset[disabled] .btn-soundcloud:focus,\n.btn-soundcloud.disabled.focus,\n.btn-soundcloud[disabled].focus,\nfieldset[disabled] .btn-soundcloud.focus,\n.btn-soundcloud.disabled:active,\n.btn-soundcloud[disabled]:active,\nfieldset[disabled] .btn-soundcloud:active,\n.btn-soundcloud.disabled.active,\n.btn-soundcloud[disabled].active,\nfieldset[disabled] .btn-soundcloud.active {\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud .badge {\n  color: #ff5500;\n  background-color: #fff;\n}\n.btn-tumblr {\n  color: #fff;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:hover,\n.btn-tumblr:focus,\n.btn-tumblr.focus,\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  color: #fff;\n  background-color: #1c2d3f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  background-image: none;\n}\n.btn-tumblr.disabled,\n.btn-tumblr[disabled],\nfieldset[disabled] .btn-tumblr,\n.btn-tumblr.disabled:hover,\n.btn-tumblr[disabled]:hover,\nfieldset[disabled] .btn-tumblr:hover,\n.btn-tumblr.disabled:focus,\n.btn-tumblr[disabled]:focus,\nfieldset[disabled] .btn-tumblr:focus,\n.btn-tumblr.disabled.focus,\n.btn-tumblr[disabled].focus,\nfieldset[disabled] .btn-tumblr.focus,\n.btn-tumblr.disabled:active,\n.btn-tumblr[disabled]:active,\nfieldset[disabled] .btn-tumblr:active,\n.btn-tumblr.disabled.active,\n.btn-tumblr[disabled].active,\nfieldset[disabled] .btn-tumblr.active {\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr .badge {\n  color: #2c4762;\n  background-color: #fff;\n}\n.btn-twitter {\n  color: #fff;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:hover,\n.btn-twitter:focus,\n.btn-twitter.focus,\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  color: #fff;\n  background-color: #2795e9;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  background-image: none;\n}\n.btn-twitter.disabled,\n.btn-twitter[disabled],\nfieldset[disabled] .btn-twitter,\n.btn-twitter.disabled:hover,\n.btn-twitter[disabled]:hover,\nfieldset[disabled] .btn-twitter:hover,\n.btn-twitter.disabled:focus,\n.btn-twitter[disabled]:focus,\nfieldset[disabled] .btn-twitter:focus,\n.btn-twitter.disabled.focus,\n.btn-twitter[disabled].focus,\nfieldset[disabled] .btn-twitter.focus,\n.btn-twitter.disabled:active,\n.btn-twitter[disabled]:active,\nfieldset[disabled] .btn-twitter:active,\n.btn-twitter.disabled.active,\n.btn-twitter[disabled].active,\nfieldset[disabled] .btn-twitter.active {\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter .badge {\n  color: #55acee;\n  background-color: #fff;\n}\n.btn-vimeo {\n  color: #fff;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:hover,\n.btn-vimeo:focus,\n.btn-vimeo.focus,\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  color: #fff;\n  background-color: #1295bf;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  background-image: none;\n}\n.btn-vimeo.disabled,\n.btn-vimeo[disabled],\nfieldset[disabled] .btn-vimeo,\n.btn-vimeo.disabled:hover,\n.btn-vimeo[disabled]:hover,\nfieldset[disabled] .btn-vimeo:hover,\n.btn-vimeo.disabled:focus,\n.btn-vimeo[disabled]:focus,\nfieldset[disabled] .btn-vimeo:focus,\n.btn-vimeo.disabled.focus,\n.btn-vimeo[disabled].focus,\nfieldset[disabled] .btn-vimeo.focus,\n.btn-vimeo.disabled:active,\n.btn-vimeo[disabled]:active,\nfieldset[disabled] .btn-vimeo:active,\n.btn-vimeo.disabled.active,\n.btn-vimeo[disabled].active,\nfieldset[disabled] .btn-vimeo.active {\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo .badge {\n  color: #1ab7ea;\n  background-color: #fff;\n}\n.btn-vk {\n  color: #fff;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:hover,\n.btn-vk:focus,\n.btn-vk.focus,\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  color: #fff;\n  background-color: #466482;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  background-image: none;\n}\n.btn-vk.disabled,\n.btn-vk[disabled],\nfieldset[disabled] .btn-vk,\n.btn-vk.disabled:hover,\n.btn-vk[disabled]:hover,\nfieldset[disabled] .btn-vk:hover,\n.btn-vk.disabled:focus,\n.btn-vk[disabled]:focus,\nfieldset[disabled] .btn-vk:focus,\n.btn-vk.disabled.focus,\n.btn-vk[disabled].focus,\nfieldset[disabled] .btn-vk.focus,\n.btn-vk.disabled:active,\n.btn-vk[disabled]:active,\nfieldset[disabled] .btn-vk:active,\n.btn-vk.disabled.active,\n.btn-vk[disabled].active,\nfieldset[disabled] .btn-vk.active {\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk .badge {\n  color: #587ea3;\n  background-color: #fff;\n}\n.btn-yahoo {\n  color: #fff;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:hover,\n.btn-yahoo:focus,\n.btn-yahoo.focus,\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  color: #fff;\n  background-color: #500a6f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  background-image: none;\n}\n.btn-yahoo.disabled,\n.btn-yahoo[disabled],\nfieldset[disabled] .btn-yahoo,\n.btn-yahoo.disabled:hover,\n.btn-yahoo[disabled]:hover,\nfieldset[disabled] .btn-yahoo:hover,\n.btn-yahoo.disabled:focus,\n.btn-yahoo[disabled]:focus,\nfieldset[disabled] .btn-yahoo:focus,\n.btn-yahoo.disabled.focus,\n.btn-yahoo[disabled].focus,\nfieldset[disabled] .btn-yahoo.focus,\n.btn-yahoo.disabled:active,\n.btn-yahoo[disabled]:active,\nfieldset[disabled] .btn-yahoo:active,\n.btn-yahoo.disabled.active,\n.btn-yahoo[disabled].active,\nfieldset[disabled] .btn-yahoo.active {\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo .badge {\n  color: #720e9e;\n  background-color: #fff;\n}\n/*\n * Plugin: Full Calendar\n * ---------------------\n */\n.fc-button {\n  background: #f4f4f4;\n  background-image: none;\n  color: #444;\n  border-color: #ddd;\n  border-bottom-color: #ddd;\n}\n.fc-button:hover,\n.fc-button:active,\n.fc-button.hover {\n  background-color: #e9e9e9;\n}\n.fc-header-title h2 {\n  font-size: 15px;\n  line-height: 1.6em;\n  color: #666;\n  margin-left: 10px;\n}\n.fc-header-right {\n  padding-right: 10px;\n}\n.fc-header-left {\n  padding-left: 10px;\n}\n.fc-widget-header {\n  background: #fafafa;\n}\n.fc-grid {\n  width: 100%;\n  border: 0;\n}\n.fc-widget-header:first-of-type,\n.fc-widget-content:first-of-type {\n  border-left: 0;\n  border-right: 0;\n}\n.fc-widget-header:last-of-type,\n.fc-widget-content:last-of-type {\n  border-right: 0;\n}\n.fc-toolbar {\n  padding: 10px;\n  margin: 0;\n}\n.fc-day-number {\n  font-size: 20px;\n  font-weight: 300;\n  padding-right: 10px;\n}\n.fc-color-picker {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.fc-color-picker > li {\n  float: left;\n  font-size: 30px;\n  margin-right: 5px;\n  line-height: 30px;\n}\n.fc-color-picker > li .fa {\n  -webkit-transition: -webkit-transform linear 0.3s;\n  -moz-transition: -moz-transform linear 0.3s;\n  -o-transition: -o-transform linear 0.3s;\n  transition: transform linear 0.3s;\n}\n.fc-color-picker > li .fa:hover {\n  -webkit-transform: rotate(30deg);\n  -ms-transform: rotate(30deg);\n  -o-transform: rotate(30deg);\n  transform: rotate(30deg);\n}\n#add-new-event {\n  -webkit-transition: all linear 0.3s;\n  -o-transition: all linear 0.3s;\n  transition: all linear 0.3s;\n}\n.external-event {\n  padding: 5px 10px;\n  font-weight: bold;\n  margin-bottom: 4px;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  border-radius: 3px;\n  cursor: move;\n}\n.external-event:hover {\n  box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);\n}\n/*\n * Plugin: Select2\n * ---------------\n */\n.select2-container--default.select2-container--focus,\n.select2-selection.select2-container--focus,\n.select2-container--default:focus,\n.select2-selection:focus,\n.select2-container--default:active,\n.select2-selection:active {\n  outline: none;\n}\n.select2-container--default .select2-selection--single,\n.select2-selection .select2-selection--single {\n  border: 1px solid #d2d6de;\n  border-radius: 0;\n  padding: 6px 12px;\n  height: 34px;\n}\n.select2-container--default.select2-container--open {\n  border-color: #3c8dbc;\n}\n.select2-dropdown {\n  border: 1px solid #d2d6de;\n  border-radius: 0;\n}\n.select2-container--default .select2-results__option--highlighted[aria-selected] {\n  background-color: #3c8dbc;\n  color: white;\n}\n.select2-results__option {\n  padding: 6px 12px;\n  user-select: none;\n  -webkit-user-select: none;\n}\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-left: 0;\n  padding-right: 0;\n  height: auto;\n  margin-top: -4px;\n}\n.select2-container[dir=\"rtl\"] .select2-selection--single .select2-selection__rendered {\n  padding-right: 6px;\n  padding-left: 20px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow {\n  height: 28px;\n  right: 3px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow b {\n  margin-top: 0;\n}\n.select2-dropdown .select2-search__field,\n.select2-search--inline .select2-search__field {\n  border: 1px solid #d2d6de;\n}\n.select2-dropdown .select2-search__field:focus,\n.select2-search--inline .select2-search__field:focus {\n  outline: none;\n  border: 1px solid #3c8dbc;\n}\n.select2-container--default .select2-results__option[aria-disabled=true] {\n  color: #999;\n}\n.select2-container--default .select2-results__option[aria-selected=true] {\n  background-color: #ddd;\n}\n.select2-container--default .select2-results__option[aria-selected=true],\n.select2-container--default .select2-results__option[aria-selected=true]:hover {\n  color: #444;\n}\n.select2-container--default .select2-selection--multiple {\n  border: 1px solid #d2d6de;\n  border-radius: 0;\n}\n.select2-container--default .select2-selection--multiple:focus {\n  border-color: #3c8dbc;\n}\n.select2-container--default.select2-container--focus .select2-selection--multiple {\n  border-color: #d2d6de;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice {\n  background-color: #3c8dbc;\n  border-color: #367fa9;\n  padding: 1px 10px;\n  color: #fff;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {\n  margin-right: 5px;\n  color: rgba(255, 255, 255, 0.7);\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {\n  color: #fff;\n}\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-right: 10px;\n}\n/*\n * General: Miscellaneous\n * ----------------------\n */\n.pad {\n  padding: 10px;\n}\n.margin {\n  margin: 10px;\n}\n.margin-bottom {\n  margin-bottom: 20px;\n}\n.margin-bottom-none {\n  margin-bottom: 0;\n}\n.margin-r-5 {\n  margin-right: 5px;\n}\n.inline {\n  display: inline;\n}\n.description-block {\n  display: block;\n  margin: 10px 0;\n  text-align: center;\n}\n.description-block.margin-bottom {\n  margin-bottom: 25px;\n}\n.description-block > .description-header {\n  margin: 0;\n  padding: 0;\n  font-weight: 600;\n  font-size: 16px;\n}\n.description-block > .description-text {\n  text-transform: uppercase;\n}\n.bg-red,\n.bg-yellow,\n.bg-aqua,\n.bg-blue,\n.bg-light-blue,\n.bg-green,\n.bg-navy,\n.bg-teal,\n.bg-olive,\n.bg-lime,\n.bg-orange,\n.bg-fuchsia,\n.bg-purple,\n.bg-maroon,\n.bg-black,\n.bg-red-active,\n.bg-yellow-active,\n.bg-aqua-active,\n.bg-blue-active,\n.bg-light-blue-active,\n.bg-green-active,\n.bg-navy-active,\n.bg-teal-active,\n.bg-olive-active,\n.bg-lime-active,\n.bg-orange-active,\n.bg-fuchsia-active,\n.bg-purple-active,\n.bg-maroon-active,\n.bg-black-active,\n.callout.callout-danger,\n.callout.callout-warning,\n.callout.callout-info,\n.callout.callout-success,\n.alert-success,\n.alert-danger,\n.alert-error,\n.alert-warning,\n.alert-info,\n.label-danger,\n.label-info,\n.label-warning,\n.label-primary,\n.label-success,\n.modal-primary .modal-body,\n.modal-primary .modal-header,\n.modal-primary .modal-footer,\n.modal-warning .modal-body,\n.modal-warning .modal-header,\n.modal-warning .modal-footer,\n.modal-info .modal-body,\n.modal-info .modal-header,\n.modal-info .modal-footer,\n.modal-success .modal-body,\n.modal-success .modal-header,\n.modal-success .modal-footer,\n.modal-danger .modal-body,\n.modal-danger .modal-header,\n.modal-danger .modal-footer {\n  color: #fff !important;\n}\n.bg-gray {\n  color: #000;\n  background-color: #d2d6de !important;\n}\n.bg-gray-light {\n  background-color: #f7f7f7;\n}\n.bg-black {\n  background-color: #111 !important;\n}\n.bg-red,\n.callout.callout-danger,\n.alert-danger,\n.alert-error,\n.label-danger,\n.modal-danger .modal-body {\n  background-color: #dd4b39 !important;\n}\n.bg-yellow,\n.callout.callout-warning,\n.alert-warning,\n.label-warning,\n.modal-warning .modal-body {\n  background-color: #f39c12 !important;\n}\n.bg-aqua,\n.callout.callout-info,\n.alert-info,\n.label-info,\n.modal-info .modal-body {\n  background-color: #00c0ef !important;\n}\n.bg-blue {\n  background-color: #0073b7 !important;\n}\n.bg-light-blue,\n.label-primary,\n.modal-primary .modal-body {\n  background-color: #3c8dbc !important;\n}\n.bg-green,\n.callout.callout-success,\n.alert-success,\n.label-success,\n.modal-success .modal-body {\n  background-color: #00a65a !important;\n}\n.bg-navy {\n  background-color: #001F3F !important;\n}\n.bg-teal {\n  background-color: #39CCCC !important;\n}\n.bg-olive {\n  background-color: #3D9970 !important;\n}\n.bg-lime {\n  background-color: #01FF70 !important;\n}\n.bg-orange {\n  background-color: #FF851B !important;\n}\n.bg-fuchsia {\n  background-color: #F012BE !important;\n}\n.bg-purple {\n  background-color: #605ca8 !important;\n}\n.bg-maroon {\n  background-color: #D81B60 !important;\n}\n.bg-gray-active {\n  color: #000;\n  background-color: #b5bbc8 !important;\n}\n.bg-black-active {\n  background-color: #000000 !important;\n}\n.bg-red-active,\n.modal-danger .modal-header,\n.modal-danger .modal-footer {\n  background-color: #d33724 !important;\n}\n.bg-yellow-active,\n.modal-warning .modal-header,\n.modal-warning .modal-footer {\n  background-color: #db8b0b !important;\n}\n.bg-aqua-active,\n.modal-info .modal-header,\n.modal-info .modal-footer {\n  background-color: #00a7d0 !important;\n}\n.bg-blue-active {\n  background-color: #005384 !important;\n}\n.bg-light-blue-active,\n.modal-primary .modal-header,\n.modal-primary .modal-footer {\n  background-color: #357ca5 !important;\n}\n.bg-green-active,\n.modal-success .modal-header,\n.modal-success .modal-footer {\n  background-color: #008d4c !important;\n}\n.bg-navy-active {\n  background-color: #001a35 !important;\n}\n.bg-teal-active {\n  background-color: #30bbbb !important;\n}\n.bg-olive-active {\n  background-color: #368763 !important;\n}\n.bg-lime-active {\n  background-color: #00e765 !important;\n}\n.bg-orange-active {\n  background-color: #ff7701 !important;\n}\n.bg-fuchsia-active {\n  background-color: #db0ead !important;\n}\n.bg-purple-active {\n  background-color: #555299 !important;\n}\n.bg-maroon-active {\n  background-color: #ca195a !important;\n}\n[class^=\"bg-\"].disabled {\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n}\n.text-red {\n  color: #dd4b39 !important;\n}\n.text-yellow {\n  color: #f39c12 !important;\n}\n.text-aqua {\n  color: #00c0ef !important;\n}\n.text-blue {\n  color: #0073b7 !important;\n}\n.text-black {\n  color: #111 !important;\n}\n.text-light-blue {\n  color: #3c8dbc !important;\n}\n.text-green {\n  color: #00a65a !important;\n}\n.text-gray {\n  color: #d2d6de !important;\n}\n.text-navy {\n  color: #001F3F !important;\n}\n.text-teal {\n  color: #39CCCC !important;\n}\n.text-olive {\n  color: #3D9970 !important;\n}\n.text-lime {\n  color: #01FF70 !important;\n}\n.text-orange {\n  color: #FF851B !important;\n}\n.text-fuchsia {\n  color: #F012BE !important;\n}\n.text-purple {\n  color: #605ca8 !important;\n}\n.text-maroon {\n  color: #D81B60 !important;\n}\n.link-muted {\n  color: #7a869d;\n}\n.link-muted:hover,\n.link-muted:focus {\n  color: #606c84;\n}\n.link-black {\n  color: #666;\n}\n.link-black:hover,\n.link-black:focus {\n  color: #999;\n}\n.hide {\n  display: none !important;\n}\n.no-border {\n  border: 0 !important;\n}\n.no-padding {\n  padding: 0 !important;\n}\n.no-margin {\n  margin: 0 !important;\n}\n.no-shadow {\n  box-shadow: none!important;\n}\n.list-unstyled,\n.chart-legend,\n.contacts-list,\n.users-list {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.list-group-unbordered > .list-group-item {\n  border-left: 0;\n  border-right: 0;\n  border-radius: 0;\n  padding-left: 0;\n  padding-right: 0;\n}\n.flat {\n  border-radius: 0 !important;\n}\n.text-bold,\n.text-bold.table td,\n.text-bold.table th {\n  font-weight: 700;\n}\n.text-sm {\n  font-size: 12px;\n}\n.jqstooltip {\n  padding: 5px!important;\n  width: auto!important;\n  height: auto!important;\n}\n.bg-teal-gradient {\n  background: #39CCCC !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39CCCC), color-stop(1, #7adddd)) !important;\n  background: -ms-linear-gradient(bottom, #39CCCC, #7adddd) !important;\n  background: -moz-linear-gradient(center bottom, #39CCCC 0%, #7adddd 100%) !important;\n  background: -o-linear-gradient(#7adddd, #39CCCC) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39CCCC', GradientType=0) !important;\n  color: #fff;\n}\n.bg-light-blue-gradient {\n  background: #3c8dbc !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;\n  background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;\n  background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important;\n  background: -o-linear-gradient(#67a8ce, #3c8dbc) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;\n  color: #fff;\n}\n.bg-blue-gradient {\n  background: #0073b7 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;\n  background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important;\n  background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important;\n  background: -o-linear-gradient(#0089db, #0073b7) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;\n  color: #fff;\n}\n.bg-aqua-gradient {\n  background: #00c0ef !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;\n  background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;\n  background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important;\n  background: -o-linear-gradient(#14d1ff, #00c0ef) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;\n  color: #fff;\n}\n.bg-yellow-gradient {\n  background: #f39c12 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;\n  background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;\n  background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important;\n  background: -o-linear-gradient(#f7bc60, #f39c12) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;\n  color: #fff;\n}\n.bg-purple-gradient {\n  background: #605ca8 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;\n  background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important;\n  background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important;\n  background: -o-linear-gradient(#9491c4, #605ca8) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;\n  color: #fff;\n}\n.bg-green-gradient {\n  background: #00a65a !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;\n  background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;\n  background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important;\n  background: -o-linear-gradient(#00ca6d, #00a65a) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;\n  color: #fff;\n}\n.bg-red-gradient {\n  background: #dd4b39 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;\n  background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important;\n  background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important;\n  background: -o-linear-gradient(#e47365, #dd4b39) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;\n  color: #fff;\n}\n.bg-black-gradient {\n  background: #111 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;\n  background: -ms-linear-gradient(bottom, #111, #2b2b2b) !important;\n  background: -moz-linear-gradient(center bottom, #111 0%, #2b2b2b 100%) !important;\n  background: -o-linear-gradient(#2b2b2b, #111) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111', GradientType=0) !important;\n  color: #fff;\n}\n.bg-maroon-gradient {\n  background: #D81B60 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #D81B60), color-stop(1, #e73f7c)) !important;\n  background: -ms-linear-gradient(bottom, #D81B60, #e73f7c) !important;\n  background: -moz-linear-gradient(center bottom, #D81B60 0%, #e73f7c 100%) !important;\n  background: -o-linear-gradient(#e73f7c, #D81B60) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#D81B60', GradientType=0) !important;\n  color: #fff;\n}\n.description-block .description-icon {\n  font-size: 16px;\n}\n.no-pad-top {\n  padding-top: 0;\n}\n.position-static {\n  position: static!important;\n}\n.list-header {\n  font-size: 15px;\n  padding: 10px 4px;\n  font-weight: bold;\n  color: #666;\n}\n.list-seperator {\n  height: 1px;\n  background: #f4f4f4;\n  margin: 15px 0 9px 0;\n}\n.list-link > a {\n  padding: 4px;\n  color: #777;\n}\n.list-link > a:hover {\n  color: #222;\n}\n.font-light {\n  font-weight: 300;\n}\n.user-block:before,\n.user-block:after {\n  content: \" \";\n  display: table;\n}\n.user-block:after {\n  clear: both;\n}\n.user-block img {\n  width: 40px;\n  height: 40px;\n  float: left;\n}\n.user-block .username,\n.user-block .description,\n.user-block .comment {\n  display: block;\n  margin-left: 50px;\n}\n.user-block .username {\n  font-size: 16px;\n  font-weight: 600;\n}\n.user-block .description {\n  color: #999;\n  font-size: 13px;\n}\n.user-block.user-block-sm .username,\n.user-block.user-block-sm .description,\n.user-block.user-block-sm .comment {\n  margin-left: 40px;\n}\n.user-block.user-block-sm .username {\n  font-size: 14px;\n}\n.img-sm,\n.img-md,\n.img-lg,\n.box-comments .box-comment img,\n.user-block.user-block-sm img {\n  float: left;\n}\n.img-sm,\n.box-comments .box-comment img,\n.user-block.user-block-sm img {\n  width: 30px!important;\n  height: 30px!important;\n}\n.img-sm + .img-push {\n  margin-left: 40px;\n}\n.img-md {\n  width: 60px;\n  height: 60px;\n}\n.img-md + .img-push {\n  margin-left: 70px;\n}\n.img-lg {\n  width: 100px;\n  height: 100px;\n}\n.img-lg + .img-push {\n  margin-left: 110px;\n}\n.img-bordered {\n  border: 3px solid #d2d6de;\n  padding: 3px;\n}\n.img-bordered-sm {\n  border: 2px solid #d2d6de;\n  padding: 2px;\n}\n.attachment-block {\n  border: 1px solid #f4f4f4;\n  padding: 5px;\n  margin-bottom: 10px;\n  background: #f7f7f7;\n}\n.attachment-block .attachment-img {\n  max-width: 100px;\n  max-height: 100px;\n  height: auto;\n  float: left;\n}\n.attachment-block .attachment-pushed {\n  margin-left: 110px;\n}\n.attachment-block .attachment-heading {\n  margin: 0;\n}\n.attachment-block .attachment-text {\n  color: #555;\n}\n.connectedSortable {\n  min-height: 100px;\n}\n.ui-helper-hidden-accessible {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n.sort-highlight {\n  background: #f4f4f4;\n  border: 1px dashed #ddd;\n  margin-bottom: 10px;\n}\n.full-opacity-hover {\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n}\n.full-opacity-hover:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n.chart {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.chart svg,\n.chart canvas {\n  width: 100%!important;\n}\n/*\n * Misc: print\n * -----------\n */\n@media print {\n  .no-print,\n  .main-sidebar,\n  .left-side,\n  .main-header,\n  .content-header {\n    display: none!important;\n  }\n  .content-wrapper,\n  .right-side,\n  .main-footer {\n    margin-left: 0!important;\n    min-height: 0!important;\n    -webkit-transform: translate(0, 0) !important;\n    -ms-transform: translate(0, 0) !important;\n    -o-transform: translate(0, 0) !important;\n    transform: translate(0, 0) !important;\n  }\n  .fixed .content-wrapper,\n  .fixed .right-side {\n    padding-top: 0!important;\n  }\n  .invoice {\n    width: 100%;\n    border: 0;\n    margin: 0;\n    padding: 0;\n  }\n  .invoice-col {\n    float: left;\n    width: 33.3333333%;\n  }\n  .table-responsive {\n    overflow: auto;\n  }\n  .table-responsive > .table tr th,\n  .table-responsive > .table tr td {\n    white-space: normal!important;\n  }\n}\n","/*\n * Core: General Layout Style\n * -------------------------\n */\nhtml,\nbody {\n  min-height: 100%;\n  .layout-boxed & {\n    height: 100%;\n  }\n}\n\nbody {\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-weight: 400;\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n/* Layout */\n.wrapper {\n  .clearfix();\n  min-height: 100%;\n  position: static;\n  overflow: hidden;\n  .layout-boxed & {\n    max-width: 1250px;\n    margin: 0 auto;\n    min-height: 100%;\n    box-shadow: 0 0 8px rgba(0,0,0,0.5);\n    position: relative;\n  }\n}\n\n.layout-boxed {\n  background: url('@{boxed-layout-bg-image-path}') repeat fixed;\n}\n\n/*\n * Content Wrapper - contains the main content\n * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```\n */\n.content-wrapper,\n.right-side,\n.main-footer {\n  //Using disposable variable to join statements with a comma\n  @transition-rule: @transition-speed @transition-fn,\n    margin @transition-speed @transition-fn;\n  .transition-transform(@transition-rule);\n  margin-left: @sidebar-width;\n  z-index: 820;\n  //Top nav layout\n  .layout-top-nav & {\n    margin-left: 0;\n  }\n  @media (max-width: @screen-xs-max) {\n    margin-left: 0;\n  }\n  //When opening the sidebar on large screens\n  .sidebar-collapse & {\n    @media (min-width: @screen-sm) {\n      margin-left: 0;\n    }\n  }\n  //When opening the sidebar on small screens\n  .sidebar-open & {\n    @media (max-width: @screen-xs-max) {\n      .translate(@sidebar-width, 0);\n    }\n  }\n}\n\n.content-wrapper,\n.right-side {\n  min-height: 100%;\n  background-color: @body-bg;\n  z-index: 800;\n}\n.main-footer {\n  background: #fff;\n  padding: 15px;\n  color: #444;\n  border-top: 1px solid @gray;\n}\n\n/* Fixed layout */\n.fixed {\n  .main-header,\n  .main-sidebar,\n  .left-side {\n    position: fixed;\n  }\n  .main-header {\n    top: 0;\n    right: 0;\n    left: 0;\n  }\n  .content-wrapper,\n  .right-side {\n    padding-top: 50px;\n    @media (max-width: @screen-header-collapse) {\n      padding-top: 100px;\n    }\n  }\n  &.layout-boxed {\n    .wrapper {\n      max-width: 100%;\n    }\n  }\n}\n\nbody.hold-transition { \n    .content-wrapper, \n    .right-side, \n    .main-footer, \n    .main-sidebar, \n    .left-side, \n    .main-header > .navbar,\n    .main-header .logo {\n      /* Fix for IE */\n      .transition(none);\n    }\n}\n\n/* Content */\n.content {\n  min-height: 250px;\n  padding: 15px;\n  .container-fixed(@grid-gutter-width);\n}\n\n/* H1 - H6 font */\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: 'Source Sans Pro', sans-serif;\n}\n/* General Links */\na {\n  color: @link-color;\n}\na:hover,\na:active,\na:focus {\n  outline: none;\n  text-decoration: none;\n  color: @link-hover-color;\n}\n\n/* Page Header */\n.page-header {\n  margin: 10px 0 20px 0;\n  font-size: 22px;\n\n  > small {\n    color: #666;\n    display: block;\n    margin-top: 5px;\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n","/*\n * Component: Main Header\n * ----------------------\n */\n\n.main-header {\n  position: relative;\n  max-height: 100px;\n  z-index: 1030;\n  //Navbar\n  > .navbar {\n    .transition(margin-left @transition-speed @transition-fn);\n    margin-bottom: 0;\n    margin-left: @sidebar-width;\n    border: none;\n    min-height: @navbar-height;\n    border-radius: 0;\n    .layout-top-nav & {\n      margin-left: 0;\n    }\n  }\n  //Navbar search text input\n  #navbar-search-input.form-control {\n    background: rgba(255,255,255,.2);\n    border-color: transparent;\n    &:focus,\n      &:active {\n      border-color: rgba(0,0,0,.1);\n      background: rgba(255,255,255,.9);\n    }\n    &::-moz-placeholder {\n      color: #ccc;\n      opacity: 1;\n    }\n    &:-ms-input-placeholder {\n      color: #ccc;\n    }\n    &::-webkit-input-placeholder {\n      color: #ccc;\n    }\n  }\n  //Navbar Right Menu\n  .navbar-custom-menu,\n  .navbar-right {\n    float: right;\n    @media (max-width: @screen-sm-max) {\n       a {\n        color: inherit;\n        background: transparent;\n      }\n    }\n  }\n  .navbar-right {\n    @media (max-width: @screen-header-collapse) {\n      float: none;\n      .navbar-collapse & {\n        margin: 7.5px -15px;\n      }\n      > li {\n        color: inherit;\n        border: 0;\n      }\n    }\n  }\n  //Navbar toggle button\n  .sidebar-toggle {\n    float: left;\n    background-color: transparent;\n    background-image: none;\n    padding: @navbar-padding-vertical @navbar-padding-horizontal;\n    //Add the fontawesome bars icon\n    font-family: fontAwesome;\n    &:before {\n      content: \"\\f0c9\";\n    }\n    &:hover {\n      color: #fff;\n    }\n    &:focus,\n    &:active {\n      background: transparent;\n    }\n  }\n  .sidebar-toggle .icon-bar {\n    display: none;\n  }\n  //Navbar User Menu\n  .navbar .nav > li.user > a {\n    > .fa,\n    > .glyphicon,\n    > .ion {\n      margin-right: 5px;\n    }\n  }\n\n  //Labels in navbar\n  .navbar .nav > li > a > .label {\n    position: absolute;\n    top: 9px;\n    right: 7px;\n    text-align: center;\n    font-size: 9px;\n    padding: 2px 3px;\n    line-height: .9;\n  }\n\n  //Logo bar\n  .logo {\n    .transition(width @transition-speed @transition-fn);\n    display: block;\n    float: left;\n    height: @navbar-height;\n    font-size: 20px;\n    line-height: 50px;\n    text-align: center;\n    width: @sidebar-width;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    padding: 0 15px;\n    font-weight: 300;\n    overflow: hidden;\n    //Add support to sidebar mini by allowing the user to create\n    //2 logo designs. mini and lg\n    .logo-lg {\n      //should be visibile when sidebar isn't collapsed\n      display: block;\n    }\n    .logo-mini {\n      display: none;\n    }\n  }\n  //Navbar Brand. Alternative logo with layout-top-nav\n  .navbar-brand {\n    color: #fff;\n  }\n}\n\n// Content Header\n.content-header {\n  position: relative;\n  padding: 15px 15px 0 15px;\n  // Header Text\n  > h1 {\n    margin: 0;\n    font-size: 24px;\n    > small {\n      font-size: 15px;\n      display: inline-block;\n      padding-left: 4px;\n      font-weight: 300;\n    }\n  }\n\n  > .breadcrumb {\n    float: right;\n    background: transparent;\n    margin-top: 0;\n    margin-bottom: 0;\n    font-size: 12px;\n    padding: 7px 5px;\n    position: absolute;\n    top: 15px;\n    right: 10px;\n    .border-radius(2px);\n    > li > a {\n      color: #444;\n      text-decoration: none;\n      display: inline-block;\n      > .fa, > .glyphicon, > .ion {\n        margin-right: 5px;\n      }\n    }\n    > li + li:before {\n      content: '>\\00a0';\n    }\n  }\n\n  @media (max-width: @screen-sm-max) {\n    > .breadcrumb {\n      position: relative;\n      margin-top: 5px;\n      top: 0;\n      right: 0;\n      float: none;\n      background: @gray;\n      padding-left: 10px;\n      li:before {\n        color: darken(@gray, 20%);\n      }\n    }\n  }\n}\n.navbar-toggle {\n  color: #fff;\n  border: 0;\n  margin: 0;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n}\n//Control navbar scaffolding on x-small screens\n@media (max-width: @screen-sm-max) {\n  .navbar-custom-menu .navbar-nav > li {\n    float: left;\n  }\n  //Dont't let links get full width\n  .navbar-custom-menu .navbar-nav {\n    margin: 0;\n    float: left;\n  }\n\n  .navbar-custom-menu .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n    line-height: 20px;\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-header-collapse) {\n  .main-header {\n    position: relative;\n    .logo,\n    .navbar {\n      width: 100%;\n      float: none;\n    }\n    .navbar {\n      margin: 0;\n    }\n    .navbar-custom-menu {\n      float: right;\n    }\n  }\n}\n\n.navbar-collapse.pull-left {\n  @media(max-width: @screen-sm-max) {\n    float: none!important;\n    + .navbar-custom-menu {\n      display: block;\n      position: absolute;\n      top: 0;\n      right: 40px;\n    }\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-sm-max) {\n  .content-header {\n    padding-top: 110px;\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-sm-max) {\n  ul.sidebar-menu {\n    padding-top: 120px;\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-sm-max) {\n  .sidebar-toggle-mobile a {\n    color: white;\n  }\n}\n\n\n\n","//AdminLTE mixins\n//===============\n\n\n//Changes the color and the hovering properties of the navbar\n.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) {\n  background-color: @color;\n  //Navbar links\n  .nav > li > a {\n    color: @font-color;\n  }\n\n  .nav > li > a:hover,\n    .nav > li > a:active,\n    .nav > li > a:focus,\n    .nav .open > a,\n    .nav .open > a:hover,\n    .nav .open > a:focus,\n    .nav > .active > a {\n    background: @hover-bg;\n    color: @hover-color;\n  }\n\n  //Add color to the sidebar toggle button\n  .sidebar-toggle {\n    color: @font-color;\n    &:hover {\n      color: @hover-color;\n      background: @hover-bg;\n    }\n  }\n}\n\n//Logo color variation\n.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) {\n  background-color: @bg-color;\n  color: @color;\n  border-bottom: @border-bottom-width solid @border-bottom-color;\n\n  &:hover {\n    background-color: darken(@bg-color, 1%);\n  }\n}\n\n//Box solid color variantion creator\n.box-solid-variant(@color; @text-color: #fff) {\n  border: 1px solid @color;\n  > .box-header {\n    color: @text-color;\n    background: @color;\n    background-color: @color;\n    a,\n    .btn {\n      color: @text-color;\n    }\n  }\n}\n\n//Direct Chat Variant\n.direct-chat-variant(@bg-color; @color: #fff) {\n  .right > .direct-chat-text {\n    background: @bg-color;\n    border-color: @bg-color;\n    color: @color;\n    &:after,\n      &:before {\n      border-left-color: @bg-color;\n    }\n  }\n}\n\n//border radius creator\n.border-radius(@radius) {\n  border-radius: @radius;\n}\n//Different radius each side\n.border-radius(@top-left; @top-right; @bottom-left; @bottom-right) {\n  border-top-left-radius: @top-left;\n  border-top-right-radius: @top-right;\n  border-bottom-right-radius: @bottom-right;\n  border-bottom-left-radius: @bottom-left;\n}\n\n//Gradient background\n.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) {\n  background: @color;\n  background: -webkit-gradient(linear,\n    left bottom,\n    left top,\n    color-stop(0, @start),\n    color-stop(1, @stop));\n  background: -ms-linear-gradient(bottom,\n    @start,\n    @stop);\n  background: -moz-linear-gradient(center bottom,\n    @start 0%,\n    @stop 100%);\n  background: -o-linear-gradient(@stop,\n    @start);\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",@stop,@start));\n}\n\n//Added 2.1.0\n//Skins Mixins\n\n//Dark Sidebar Mixin\n.skin-dark-sidebar(@link-hover-border-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-dark-bg;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: #fff;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-dark-bg, 20%);\n      background: darken(@sidebar-dark-bg, 4%);\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n    }\n    //Hover and active states\n    &:hover > a, &.active > a {\n      color: @sidebar-dark-hover-color;\n      background: @sidebar-dark-hover-bg;\n      border-left-color: @link-hover-border-color;\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      margin: 0 1px;\n      background: @sidebar-dark-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-dark-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-dark-submenu-color;\n      }\n      &.active > a, > a:hover {\n        color: @sidebar-dark-submenu-hover-color;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid lighten(@sidebar-dark-bg, 10%);\n    margin: 10px 10px;\n    input[type=\"text\"], .btn {\n      box-shadow: none;\n      background-color: lighten(@sidebar-dark-bg, 10%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus, &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n}\n\n//Light Sidebar Mixin\n.skin-light-sidebar(@icon-active-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-light-bg;\n  }\n  .content-wrapper,\n  .main-footer {\n    border-left: 1px solid @gray;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: @sidebar-light-color;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    .transition(border-left-color .3s ease);\n    //border-left: 3px solid transparent;\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-light-color, 25%);\n      background: @sidebar-light-bg;\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n      font-weight: 600;\n    }\n    //Hover and active states\n    &:hover > a,\n      &.active > a {\n      color: @sidebar-light-hover-color;\n      background: @sidebar-light-hover-bg;\n    }\n    &:hover > a {\n\n    }\n    &.active {\n      border-left-color: @icon-active-color;\n      > a {\n        font-weight: 600;\n      }\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      background: @sidebar-light-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-light-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-light-submenu-color;\n      }\n      &.active > a,\n      > a:hover {\n        color: @sidebar-light-submenu-hover-color;\n      }\n      &.active > a {\n        font-weight: 600;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid @gray;//darken(@sidebar-light-bg, 5%);\n    margin: 10px 10px;\n    input[type=\"text\"],\n    .btn {\n      box-shadow: none;\n      background-color: #fff;//darken(@sidebar-light-bg, 3%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus,\n        &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n  @media(min-width: @screen-sm-min) {\n    &.sidebar-mini.sidebar-collapse {\n      .sidebar-menu > li > .treeview-menu {\n        border-left: 1px solid @gray;\n      }\n    }\n  }\n}\n","/*\n * Component: Sidebar\n * ------------------\n */\n//Main Sidebar\n// ``` .left-side has been deprecated as of 2.0.0 in favor of .main-sidebar ```\n\n.main-sidebar,\n.left-side {\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding-top: 50px;\n  min-height: 100%;\n  width: @sidebar-width;\n  z-index: 810;\n  //Using disposable variable to join statements with a comma\n  @transition-rule: @transition-speed @transition-fn,\n    width @transition-speed @transition-fn;\n  .transition-transform(@transition-rule);\n  @media (max-width: @screen-header-collapse) {\n      padding-top: 100px;\n  }\n  @media (max-width: @screen-xs-max) {\n    .translate(-@sidebar-width, 0);\n  }\n  .sidebar-collapse & {\n    @media (min-width: @screen-sm) {\n      .translate(-@sidebar-width, 0);\n    }\n  }\n  .sidebar-open & {\n    @media (max-width: @screen-xs-max) {\n      .translate(0, 0);\n    }\n  }\n}\n\n.sidebar {\n  padding-bottom: 10px;\n}\n// remove border from form\n.sidebar-form {\n  input:focus {\n    border-color: transparent;\n  }\n}\n\n//Sidebar user panel\n.user-panel {\n  position: relative;\n  width: 100%;\n  padding: 10px;\n  overflow: hidden;\n  .clearfix();\n  > .image > img {\n    width: 100%;\n    max-width: 45px;\n    height: auto;\n  }\n  > .info {\n    padding: 5px 5px 5px 15px;\n    line-height: 1;\n    position: absolute;\n    left: 55px;\n    > p {\n      font-weight: 600;\n      margin-bottom: 9px;\n    }\n    > a {\n      text-decoration: none;\n      padding-right: 5px;\n      margin-top: 3px;\n      font-size: 11px;\n      > .fa,\n      > .ion,\n      > .glyphicon {\n        margin-right: 3px;\n      }\n    }\n  }\n}\n\n// Sidebar menu\n.sidebar-menu {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  //First Level\n  > li {\n    position: relative;\n    margin: 0;\n    padding: 0;\n    > a {\n      padding: 12px 5px 12px 15px;\n      display: block;\n      > .fa,\n      > .glyphicon,\n      > .ion {\n        width: 20px;\n      }\n    }\n    .label,\n    .badge {\n      margin-top: 3px;\n      margin-right: 5px;\n    }\n  }\n  li.header {\n    padding: 10px 25px 10px 15px;\n    font-size: 12px;\n  }\n  li > a > .fa-angle-left {\n    width: auto;\n    height: auto;\n    padding: 0;\n    margin-right: 10px;\n    margin-top: 3px;\n  }\n  li.active {\n    > a > .fa-angle-left {\n      .rotate(-90deg);\n    }\n    > .treeview-menu {\n      display: block;\n    }\n  }\n\n  // Tree view menu\n  .treeview-menu {\n    display: none;\n    list-style: none;\n    padding:0;\n    margin:0;\n    padding-left: 5px;\n    .treeview-menu {\n      padding-left: 20px;\n    }\n    > li {\n      margin: 0;\n      > a {\n        padding: 5px 5px 5px 15px;\n        display: block;\n        font-size: 14px;\n        > .fa,\n        > .glyphicon,\n        > .ion {\n          width: 20px;\n        }\n        > .fa-angle-left,\n        > .fa-angle-down {\n          width: auto;\n        }\n      }\n    }\n  }\n}\n","/*\n * Component: Sidebar Mini\n */\n\n//Add sidebar-mini class to the body tag to activate this feature\n.sidebar-mini {\n  //Sidebar mini should work only on devices larger than @screen-sm\n  @media (min-width: @screen-sm) {\n    //When the sidebar is collapsed...\n    &.sidebar-collapse {\n\n      //Apply the new margining to the main content and footer\n      .content-wrapper,\n      .right-side,\n      .main-footer {\n        margin-left: 50px!important;\n        z-index: 840;\n      }\n\n      //Modify the sidebar to shrink instead of disappearing\n      .main-sidebar {\n        //Don't go away! Just shrink\n        .translate(0, 0);\n        width: 50px!important;\n        z-index: 850;\n      }\n\n      .sidebar-menu {\n        > li {\n          position: relative;\n          > a {\n            margin-right: 0;\n          }\n          > a > span {\n            border-top-right-radius: 4px;\n          }\n\n          &:not(.treeview) {\n            > a > span {\n              border-bottom-right-radius: 4px;\n            }\n          }\n\n          > .treeview-menu {\n            //Add some padding to the treeview menu\n            padding-top: 5px;\n            padding-bottom: 5px;\n            border-bottom-right-radius: 4px;\n          }\n\n          //Show menu items on hover\n          &:hover {\n            > a {\n              //overflow: visible;\n            }\n            > a > span:not(.pull-right),\n              > .treeview-menu {\n              display: block!important;\n              position: absolute;\n              width: @sidebar-width - 50;\n              left: 50px;\n            }\n\n            //position the header & treeview menus\n            > a > span {\n              top: 0;\n              margin-left: -3px;\n              padding: 12px 5px 12px 20px;\n              background-color: inherit;\n            }\n            > .treeview-menu {\n              top: 44px;\n              margin-left: 0;\n            }\n          }\n        }\n      }\n\n      //Make the sidebar links, menus, labels, badges\n      //and angle icons disappear\n      .main-sidebar .user-panel > .info,\n      .sidebar-form,\n      .sidebar-menu > li > a > span,\n      .sidebar-menu > li > .treeview-menu,\n      .sidebar-menu >li > a > .pull-right,\n      .sidebar-menu li.header {\n        display: none!important;\n        -webkit-transform: translateZ(0);\n      }\n\n      .main-header {\n        //Let's make the logo also shrink and the mini logo to appear\n        .logo {\n          width: 50px;\n          > .logo-mini {\n            display: block;\n            margin-left: -15px;\n            margin-right: -15px;\n            font-size: 18px;\n          }\n          > .logo-lg {\n            display: none;\n          }\n        }\n\n        //Since the logo got smaller, we need to fix the navbar's position\n        .navbar {\n          margin-left: 50px;\n        }\n      }\n    }\n  }\n}\n\n//A fix for text overflow while transitioning from sidebar mini to full sidebar\n.sidebar-menu,\n.main-sidebar .user-panel,\n.sidebar-menu > li.header {\n  white-space: nowrap;\n  overflow: hidden;\n}\n.sidebar-menu:hover {\n  overflow: visible;\n}\n.sidebar-form,\n.sidebar-menu > li.header {\n  overflow: hidden;\n  text-overflow: clip;\n}\n.sidebar-menu li > a {\n  position: relative;\n  > .pull-right {\n    position: absolute;\n    top: 50%;\n    right: 10px;\n    margin-top: -7px;\n  }\n}\n","/*\n * Component: Control sidebar. By default, this is the right sidebar.\n */\n//The sidebar's background control class\n//This is a hack to make the background visible while scrolling\n.control-sidebar-bg {\n  position: fixed;\n  z-index: 1000;\n  bottom: 0;\n}\n//Transitions\n.control-sidebar-bg,\n.control-sidebar {\n  top: 0;\n  right: -@control-sidebar-width;\n  width: @control-sidebar-width;\n  .transition(right @transition-speed ease-in-out);\n}\n//The sidebar\n.control-sidebar {\n  position: absolute;\n  padding-top: @navbar-height;\n  z-index: 1010;\n  //Fix position after header collapse\n  @media (max-width: @screen-sm) {\n    padding-top: @navbar-height + 50;\n  }\n  //Tab panes\n  > .tab-content {\n    padding: 10px 15px;\n  }\n  //Open state with slide over content effect\n  &.control-sidebar-open {\n    &,\n    + .control-sidebar-bg {\n      right: 0;\n    }\n  }\n}\n//Open without slide over content\n.control-sidebar-open {\n  .control-sidebar-bg,\n  .control-sidebar {\n    right: 0;\n  }\n  @media(min-width: @screen-sm) {\n    .content-wrapper,\n    .right-side,\n    .main-footer {\n      margin-right: @control-sidebar-width;\n    }\n  }\n}\n//Control sidebar tabs\n.nav-tabs.control-sidebar-tabs {\n  > li {\n    &:first-of-type > a {\n      &,\n      &:hover,\n        &:focus {\n        border-left-width: 0;\n      }\n    }\n    > a {\n      .border-radius(0);\n\n      //Hover and active states\n      &,\n      &:hover {\n        border-top: none;\n        border-right: none;\n        border-left: 1px solid transparent;\n        border-bottom: 1px solid transparent;\n      }\n      .icon {\n        font-size: 16px;\n      }\n    }\n    //Active state\n    &.active {\n      > a {\n        &,\n        &:hover,\n          &:focus,\n          &:active {\n          border-top: none;\n          border-right: none;\n          border-bottom: none;\n        }\n      }\n    }\n  }\n  //Remove responsiveness on small screens\n  @media(max-width: @screen-sm) {\n    display: table;\n    >li {\n      display: table-cell;\n    }\n  }\n}\n//Headings in the sidebar content\n.control-sidebar-heading {\n  font-weight: 400;\n  font-size: 16px;\n  padding: 10px 0;\n  margin-bottom: 10px;\n}\n//Subheadings\n.control-sidebar-subheading {\n  display: block;\n  font-weight: 400;\n  font-size: 14px;\n}\n//Control Sidebar Menu\n.control-sidebar-menu {\n  list-style: none;\n  padding: 0;\n  margin: 0 -15px;\n  > li > a {\n    .clearfix();\n    display: block;\n    padding: 10px 15px;\n    > .control-sidebar-subheading {\n      margin-top: 0;\n    }\n  }\n  .menu-icon {\n    float: left;\n    width: 35px;\n    height: 35px;\n    border-radius: 50%;\n    text-align: center;\n    line-height: 35px;\n  }\n  .menu-info {\n    margin-left: 45px;\n    margin-top: 3px;\n    > .control-sidebar-subheading {\n      margin: 0;\n    }\n    > p {\n      margin: 0;\n      font-size: 11px;\n    }\n  }\n  .progress {\n    margin: 0;\n  }\n}\n//Dark skin\n.control-sidebar-dark {\n  color: @sidebar-dark-color;\n  // Background\n  &,\n  + .control-sidebar-bg {\n    background: @sidebar-dark-bg;\n  }\n  // Sidebar tabs\n  .nav-tabs.control-sidebar-tabs {\n    border-bottom: darken(@sidebar-dark-bg, 3%);\n    > li {\n      > a {\n        background: darken(@sidebar-dark-bg, 5%);\n        color: @sidebar-dark-color;\n        //Hover and active states\n        &,\n        &:hover,\n          &:focus {\n          border-left-color: darken(@sidebar-dark-bg, 7%);\n          border-bottom-color: darken(@sidebar-dark-bg, 7%);          \n        }\n        &:hover,\n          &:focus,\n          &:active {\n          background: darken(@sidebar-dark-bg, 3%);\n        }\n        &:hover {\n          color: #fff;\n        }\n      }\n      //Active state\n      &.active {\n        > a {\n          &,\n          &:hover,\n            &:focus,\n            &:active {\n            background: @sidebar-dark-bg;\n            color: #fff;\n          }\n        }\n      }\n    }\n  }\n  //Heading & subheading\n  .control-sidebar-heading,\n  .control-sidebar-subheading {\n    color: #fff;\n  }\n  //Sidebar list\n  .control-sidebar-menu {\n    > li {\n      > a {\n        &:hover {\n          background: @sidebar-dark-hover-bg;\n        }\n        .menu-info {\n          > p {\n            color: @sidebar-dark-color;\n          }\n        }\n      }\n    }\n  }\n}\n//Light skin\n.control-sidebar-light {\n  color: lighten(@sidebar-light-color, 10%);\n  // Background\n  &,\n  + .control-sidebar-bg {\n    background: @sidebar-light-bg;\n    border-left: 1px solid @gray;\n  }\n  // Sidebar tabs\n  .nav-tabs.control-sidebar-tabs {\n    border-bottom: @gray;\n    > li {\n      > a {\n        background: darken(@sidebar-light-bg, 5%);\n        color: @sidebar-light-color;\n        //Hover and active states\n        &,\n        &:hover,\n          &:focus {\n          border-left-color: @gray;\n          border-bottom-color: @gray;\n        }\n        &:hover,\n          &:focus,\n          &:active {\n          background: darken(@sidebar-light-bg, 3%);\n        }\n      }\n      //Active state\n      &.active {\n        > a {\n          &,\n          &:hover,\n            &:focus,\n            &:active {\n            background: @sidebar-light-bg;\n            color: #111;\n          }\n        }\n      }\n    }\n  }\n  //Heading & subheading\n  .control-sidebar-heading,\n  .control-sidebar-subheading {\n    color: #111;\n  }\n  //Sidebar list\n  .control-sidebar-menu {\n    margin-left: -14px;\n    > li {\n      > a {\n        &:hover {\n          background: @sidebar-light-hover-bg;\n        }\n        .menu-info {\n          > p {\n            color: lighten(@sidebar-light-color, 10%);\n          }\n        }\n      }\n    }\n  }\n}\n","/*\n * Component: Dropdown menus\n * -------------------------\n */\n\n/*Dropdowns in general*/\n.dropdown-menu {\n  box-shadow: none;\n  border-color: #eee;\n  > li > a {\n    color: #777;\n  }\n  > li > a > .glyphicon,\n  > li > a > .fa,\n  > li > a > .ion{\n    margin-right: 10px;\n  }\n  > li > a:hover {\n    background-color: lighten(@gray, 5%);\n    color: #333;\n  }\n  > .divider {\n    background-color: #eee;\n  }\n}\n\n//Navbar custom dropdown menu\n.navbar-nav > .notifications-menu,\n.navbar-nav > .messages-menu,\n.navbar-nav > .tasks-menu {\n  //fix width and padding\n  > .dropdown-menu {\n    > li {\n      position: relative;\n    }\n    width: 280px;\n    //Remove padding and margins\n    padding: 0 0 0 0;\n    margin: 0;\n    top: 100%;\n  }\n  //Define header class\n  > .dropdown-menu > li.header {\n    .border-radius(4px; 4px; 0; 0);\n    background-color: #ffffff;\n    padding: 7px 10px;\n    border-bottom: 1px solid #f4f4f4;\n    color: #444444;\n    font-size: 14px;\n  }\n\n\n  //Define footer class\n  > .dropdown-menu > li.footer > a {\n    .border-radius(0; 0; 4px; 4px);\n    font-size: 12px;\n    background-color: #fff;\n    padding: 7px 10px;\n    border-bottom: 1px solid #eeeeee;\n    color: #444!important;\n    @media (max-width: @screen-sm-max) {\n      background: #fff!important;\n      color: #444!important;\n    }\n    text-align: center;\n    //Hover state\n    &:hover {\n      text-decoration: none;\n      font-weight: normal;\n    }\n  }\n\n  //Clear inner menu padding and margins\n  > .dropdown-menu > li .menu {\n    max-height: 200px;\n    margin: 0;\n    padding: 0;\n    list-style: none;\n    overflow-x: hidden;\n    > li > a {\n      display: block;\n      white-space: nowrap; /* Prevent text from breaking */\n      border-bottom: 1px solid #f4f4f4;\n      // Hove state\n      &:hover {\n        background: #f4f4f4;\n        text-decoration: none;\n      }\n    }\n  }\n}\n\n//Notifications menu\n.navbar-nav > .notifications-menu {\n  > .dropdown-menu > li .menu {\n    // Links inside the menu\n    > li > a {\n      color: #444444;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      padding: 10px;\n      // Icons inside the menu\n      > .glyphicon,\n      > .fa,\n      > .ion {\n        width: 20px;\n      }\n    }\n\n  }\n}\n\n//Messages menu\n.navbar-nav > .messages-menu {\n  //Inner menu\n  > .dropdown-menu > li .menu {\n    // Messages menu item\n    > li > a {\n      margin: 0;\n      //line-height: 20px;\n      padding: 10px 10px;\n      // User image\n      > div > img {\n        margin: auto 10px auto auto;\n        width: 40px;\n        height: 40px;\n      }\n      // Message heading\n      > h4 {\n        padding: 0;\n        margin: 0 0 0 45px;\n        color: #444444;\n        font-size: 15px;\n        position: relative;\n        // Small for message time display\n        > small {\n          color: #999999;\n          font-size: 10px;\n          position: absolute;\n          top: 0;\n          right: 0;\n        }\n      }\n\n      > p {\n        margin: 0 0 0 45px;\n        font-size: 12px;\n        color: #888888;\n      }\n\n      .clearfix();\n\n    }\n\n  }\n}\n//Tasks menu\n.navbar-nav > .tasks-menu {\n  > .dropdown-menu > li .menu {\n    > li > a {\n      padding: 10px;\n\n      > h3 {\n        font-size: 14px;\n        padding: 0;\n        margin: 0 0 10px 0;\n        color: #666666;\n      }\n\n      > .progress {\n        padding: 0;\n        margin: 0;\n      }\n    }\n  }\n}\n//User menu\n.navbar-nav > .user-menu {\n  > .dropdown-menu {\n    .border-top-radius(0);\n    padding: 1px 0 0 0;\n    border-top-width: 0;\n    width: 280px;\n\n    &,\n    > .user-body {\n      .border-bottom-radius(4px);\n    }\n    // Header menu\n    > li.user-header {\n      height: 175px;\n      padding: 10px;\n      text-align: center;\n      // User image\n      > img {\n        z-index: 5;\n        height: 90px;\n        width: 90px;\n        border: 3px solid;\n        border-color: transparent;\n        border-color: rgba(255, 255, 255, 0.2);\n      }\n      > p {\n        z-index: 5;\n        color: #fff;\n        color: rgba(255, 255, 255, 0.8);\n        font-size: 17px;\n        //text-shadow: 2px 2px 3px #333333;\n        margin-top: 10px;\n        > small {\n          display: block;\n          font-size: 12px;\n        }\n      }\n    }\n\n    // Menu Body\n    > .user-body {\n      padding: 15px;\n      border-bottom: 1px solid #f4f4f4;\n      border-top: 1px solid #dddddd;\n      .clearfix();\n      a {\n        color: #444 !important;\n        @media (max-width: @screen-sm-max) {\n          background: #fff !important;\n          color: #444 !important;\n        }\n      }\n    }\n\n    // Menu Footer\n    > .user-footer {\n      background-color: #f9f9f9;\n      padding: 10px;\n      .clearfix();\n      .btn-default {\n        color: #666666;\n        &:hover {\n          @media (max-width: @screen-sm-max) {\n            background-color: #f9f9f9;\n          }\n        }\n      }\n    }\n  }\n  .user-image {\n    float: left;\n    width: 25px;\n    height: 25px;\n    border-radius: 50%;\n    margin-right: 10px;\n    margin-top: -2px;\n    @media (max-width: @screen-xs-max) {\n      float: none;\n      margin-right: 0;\n      margin-top: -8px;\n      line-height: 10px;\n    }\n  }\n}\n\n/* Add fade animation to dropdown menus by appending\n the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/\n.open:not(.dropup) > .animated-dropdown-menu {\n  backface-visibility: visible !important;\n  .animation(flipInX .7s both);\n\n}\n@keyframes flipInX {\n  0% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transition-timing-function: ease-in;\n  }\n\n  60% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  100% {\n    transform: perspective(400px);\n  }\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n  }\n}\n\n/* Fix dropdown menu in navbars */\n.navbar-custom-menu > .navbar-nav {\n  > li {\n    position: relative;\n    > .dropdown-menu {\n      position: absolute;\n      right: 0;\n      left: auto;\n    }\n  }\n}\n@media (max-width: @screen-sm-max) {\n  .navbar-custom-menu > .navbar-nav {\n    float: right;\n    > li {\n      position: static;\n      > .dropdown-menu {\n        position: absolute;\n        right: 5%;\n        left: auto;\n        border: 1px solid #ddd;\n        background: #fff;\n      }\n    }\n  }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n","/*\n * Component: Form\n * ---------------\n */\n.form-control {\n  .border-radius(@input-radius);\n  box-shadow: none;\n  border-color: @gray;\n  &:focus {\n    border-color: @light-blue;\n    box-shadow: none;\n  }\n  &::-moz-placeholder,\n  &:-ms-input-placeholder,\n  &::-webkit-input-placeholder {\n    color: #bbb;\n    opacity: 1;\n  }\n\n  &:not(select) {\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    appearance: none;\n  }\n}\n\n.form-group {\n  &.has-success {\n    label {\n      color: @green;\n    }\n    .form-control {\n      border-color: @green;\n      box-shadow: none;\n    }\n  }\n\n  &.has-warning {\n    label {\n      color: @yellow;\n    }\n    .form-control {\n      border-color: @yellow;\n      box-shadow: none;\n    }\n  }\n\n  &.has-error {\n    label {\n      color: @red;\n    }\n    .form-control {\n      border-color: @red;\n      box-shadow: none;\n    }\n  }\n}\n\n/* Input group */\n.input-group {\n  .input-group-addon {\n    .border-radius(@input-radius);\n    border-color: @gray;\n    background-color: #fff;\n  }\n}\n/* button groups */\n.btn-group-vertical {\n  .btn {\n    &.btn-flat:first-of-type, &.btn-flat:last-of-type {\n      .border-radius(0);\n    }\n  }\n}\n\n.icheck > label {\n  padding-left: 0;\n}\n\n/* support Font Awesome icons in form-control */\n.form-control-feedback.fa {\n    line-height: @input-height-base;\n}\n\n.input-lg + .form-control-feedback.fa,\n.input-group-lg + .form-control-feedback.fa,\n.form-group-lg .form-control + .form-control-feedback.fa {\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback.fa,\n.input-group-sm + .form-control-feedback.fa,\n.form-group-sm .form-control + .form-control-feedback.fa {\n  line-height: @input-height-small;\n}\n","/*\n * Component: Progress Bar\n * -----------------------\n */\n\n//General CSS\n.progress,\n.progress > .progress-bar {\n  .box-shadow(none);\n  &, .progress-bar {\n    .border-radius(@progress-bar-border-radius);\n  }\n}\n\n/* size variation */\n.progress.sm,\n.progress-sm {\n  height: 10px;\n  &, .progress-bar {\n    .border-radius(@progress-bar-sm-border-radius);\n  }\n}\n.progress.xs,\n.progress-xs {\n  height: 7px;\n  &, .progress-bar {\n    .border-radius(@progress-bar-xs-border-radius);\n  }\n}\n.progress.xxs,\n.progress-xxs {\n  height: 3px;\n  &, .progress-bar {\n    .border-radius(@progress-bar-xs-border-radius);\n  }\n}\n/* Vertical bars */\n.progress.vertical {\n  position: relative;\n  width: 30px;\n  height: 200px;\n  display: inline-block;\n  margin-right: 10px;\n  > .progress-bar {\n    width: 100%;\n    position: absolute;\n    bottom: 0;\n  }\n\n  //Sizes\n  &.sm,\n  &.progress-sm{\n    width: 20px;\n  }\n\n  &.xs,\n  &.progress-xs{\n    width: 10px;\n  }\n  &.xxs,\n  &.progress-xxs{\n    width: 3px;\n  }\n}\n\n//Progress Groups\n.progress-group {\n  .progress-text {\n    font-weight: 600;\n  }\n  .progress-number {\n    float: right;\n  }\n}\n\n/* Remove margins from progress bars when put in a table */\n.table {\n  tr > td .progress {\n    margin: 0;\n  }\n}\n\n// Variations\n// -------------------------\n.progress-bar-light-blue,\n.progress-bar-primary {\n  .progress-bar-variant(@light-blue);\n}\n.progress-bar-green,\n.progress-bar-success {\n  .progress-bar-variant(@green);\n}\n\n.progress-bar-aqua,\n.progress-bar-info {\n  .progress-bar-variant(@aqua);\n}\n\n.progress-bar-yellow,\n.progress-bar-warning {\n  .progress-bar-variant(@yellow);\n}\n\n.progress-bar-red,\n.progress-bar-danger {\n  .progress-bar-variant(@red);\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n","// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","/*\n * Component: Small Box\n * --------------------\n */\n\n.small-box {\n  .border-radius(2px);\n  position: relative;\n  display: block;\n  margin-bottom: 20px;\n  box-shadow: @box-boxshadow;\n  // content wrapper\n  > .inner {\n    padding: 10px;\n  }\n\n  > .small-box-footer {\n    position: relative;\n    text-align: center;\n    padding: 3px 0;\n    color: #fff;\n    color: rgba(255, 255, 255, 0.8);\n    display: block;\n    z-index: 10;\n    background: rgba(0,0,0,0.1);\n    text-decoration: none;\n    &:hover {\n      color: #fff;\n      background: rgba(0,0,0,0.15);\n    }\n  }\n\n  h3 {\n    font-size: 38px;\n    font-weight: bold;\n    margin: 0 0 10px 0;\n    white-space: nowrap;\n    padding: 0;\n\n  }\n\n  p {\n    font-size: 15px;\n    > small {\n      display: block;\n      color: #f9f9f9;\n      font-size: 13px;\n      margin-top: 5px;\n    }\n  }\n\n  h3, p {\n    z-index: 5px;\n  }\n\n  // the icon\n  .icon {\n    .transition(all @transition-speed linear);\n    position: absolute;\n    top: -10px;\n    right: 10px;\n    z-index: 0;\n    font-size: 90px;\n    color: rgba(0, 0, 0, 0.15);\n  }\n\n  // Small box hover state\n  &:hover {\n    text-decoration: none;\n    color: #f9f9f9;\n    // Animate icons on small box hover\n    .icon {\n      font-size: 95px;\n    }\n  }\n}\n\n@media (max-width: @screen-xs-max) {\n  // No need for icons on very small devices\n  .small-box {\n    text-align: center;\n    .icon {\n      display: none;\n    }\n    p {\n      font-size: 12px;\n    }\n  }\n}\n","/*\n * Component: Box\n * --------------\n */\n.box {\n  position: relative;\n  .border-radius(@box-border-radius);\n  background: #ffffff;\n  border-top: 3px solid @box-default-border-top-color;\n  margin-bottom: 20px;\n  width: 100%;\n  box-shadow: @box-boxshadow;\n\n  // Box color variations\n  &.box-primary {\n    border-top-color: @light-blue;\n  }\n  &.box-info {\n    border-top-color: @aqua;\n  }\n  &.box-danger {\n    border-top-color: @red;\n  }\n  &.box-warning {\n    border-top-color: @yellow;\n  }\n  &.box-success {\n    border-top-color: @green;\n  }\n  &.box-default {\n    border-top-color: @gray;\n  }\n\n  // collapsed mode\n  &.collapsed-box {\n    .box-body,\n    .box-footer {\n      display: none;\n    }\n  }\n\n  .nav-stacked {\n    > li {\n      border-bottom: 1px solid @box-border-color;\n      margin: 0;\n      &:last-of-type {\n        border-bottom: none;\n      }\n    }\n  }\n\n  // fixed height to 300px\n  &.height-control {\n    .box-body {\n      max-height: 300px;\n      overflow: auto;\n    }\n  }\n\n  .border-right {\n    border-right: 1px solid @box-border-color;\n  }\n  .border-left {\n    border-left: 1px solid @box-border-color;\n  }\n\n  //SOLID BOX\n  //---------\n  //use this class to get a colored header and borders\n\n  &.box-solid {\n    border-top: 0;\n    > .box-header {\n      .btn.btn-default {\n        background: transparent;\n      }\n      .btn,\n      a {\n        &:hover {\n          background: rgba(0,0,0,0.1);\n        }\n      }\n    }\n\n    // Box color variations\n    &.box-default {\n      .box-solid-variant(@gray, #444);\n    }\n    &.box-primary {\n      .box-solid-variant(@light-blue);\n    }\n    &.box-info {\n      .box-solid-variant(@aqua);\n    }\n    &.box-danger {\n      .box-solid-variant(@red);\n    }\n    &.box-warning {\n      .box-solid-variant(@yellow);\n    }\n    &.box-success {\n      .box-solid-variant(@green);\n    }\n\n    > .box-header > .box-tools .btn {\n      border: 0;\n      box-shadow: none;\n    }\n\n    // Fix font color for tiles\n    &[class*='bg'] {\n      > .box-header {\n        color: #fff;\n      }\n    }\n\n  }\n\n  //BOX GROUP\n  .box-group {\n    > .box {\n      margin-bottom: 5px;\n    }\n  }\n\n\n  // jQuery Knob in a box\n  .knob-label {\n    text-align: center;\n    color: #333;\n    font-weight: 100;\n    font-size: 12px;\n    margin-bottom: 0.3em;\n  }\n}\n\n.box,\n.overlay-wrapper {\n  // Box overlay for LOADING STATE effect\n  > .overlay,\n  > .loading-img {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n  }\n\n  .overlay {\n    z-index: 50;\n    background: rgba(255, 255, 255, 0.7);\n    .border-radius(@box-border-radius);\n    > .fa {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      margin-left: -15px;\n      margin-top: -15px;\n      color: #000;\n      font-size: 30px;\n    }\n  }\n\n  .overlay.dark {\n    background: rgba(0, 0, 0, 0.5);\n  }\n}\n\n//Add clearfix to header, body and footer\n.box-header,\n.box-body,\n.box-footer {\n  .clearfix();\n}\n\n//Box header\n.box-header {\n  color: #444;\n  display: block;\n  padding: @box-padding;\n  position: relative;\n\n  //Add bottom border\n  &.with-border {\n    border-bottom: 1px solid @box-border-color;\n    .collapsed-box & {\n      border-bottom: none;\n    }\n  }\n\n  //Icons and box title\n  > .fa,\n  > .glyphicon,\n  > .ion,\n  .box-title {\n    display: inline-block;\n    font-size: 18px;\n    margin: 0;\n    line-height: 1;\n  }\n  > .fa,\n  > .glyphicon,\n  > .ion {\n    margin-right: 5px;\n  }\n  > .box-tools {\n    position: absolute;\n    right: 10px;\n    top: 5px;\n    [data-toggle=\"tooltip\"] {\n      position: relative;\n    }\n\n    &.pull-right {\n      .dropdown-menu {\n        right: 0;\n        left: auto;\n      }\n    }\n  }\n}\n\n//Box Tools Buttons\n.btn-box-tool {\n  padding: 5px;\n  font-size: 12px;\n  background: transparent;\n  color: darken(@box-default-border-top-color, 20%);\n  .open &,\n  &:hover {\n    color: darken(@box-default-border-top-color, 40%);\n  }\n  &.btn:active {\n    box-shadow: none;\n  }\n}\n\n//Box Body\n.box-body {\n  .border-radius(0; 0; @box-border-radius; @box-border-radius);\n  padding: @box-padding;\n  .no-header & {\n    .border-top-radius(@box-border-radius);\n  }\n  // Tables within the box body\n  > .table {\n    margin-bottom: 0;\n  }\n\n  // Calendar within the box body\n  .fc {\n    margin-top: 5px;\n  }\n\n  .full-width-chart {\n    margin: -19px;\n  }\n  &.no-padding .full-width-chart {\n    margin: -9px;\n  }\n\n  .box-pane {\n    .border-radius(0; 0; @box-border-radius; 0);\n  }\n  .box-pane-right {\n    .border-radius(0; 0; 0; @box-border-radius);\n  }\n}\n\n//Box footer\n.box-footer {\n  .border-radius(0; 0; @box-border-radius; @box-border-radius);\n  border-top: 1px solid @box-border-color;\n  padding: @box-padding;\n  background-color: @box-footer-bg;\n}\n.chart-legend {\n  &:extend(.list-unstyled);\n  margin: 10px 0;\n  > li {\n    @media (max-width: @screen-sm-max) {\n      float: left;\n      margin-right: 10px;\n    }\n  }\n}\n\n//Comment Box\n.box-comments {\n  background: #f7f7f7;\n  .box-comment {\n    .clearfix();\n    padding: 8px 0;\n    border-bottom: 1px solid #eee;\n    &:last-of-type {\n      border-bottom: 0;\n    }\n    &:first-of-type {\n      padding-top: 0;\n    }\n    img {\n      &:extend(.img-sm);\n      float: left;\n    }\n  }\n  .comment-text {\n    margin-left: 40px;\n    color: #555;\n  }\n  .username {\n    color: #444;\n    display: block;\n    font-weight: 600;\n  }\n  .text-muted {\n    font-weight: 400;\n    font-size: 12px;\n  }\n}\n\n//Widgets\n//-----------\n\n/* Widget: TODO LIST */\n\n.todo-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow: auto;\n  // Todo list element\n  > li {\n    .border-radius(2px);\n    padding: 10px;\n    background: #f4f4f4;\n    margin-bottom: 2px;\n    border-left: 2px solid #e6e7e8;\n    color: #444;\n    &:last-of-type {\n      margin-bottom: 0;\n    }\n\n    > input[type='checkbox']  {\n      margin: 0 10px 0 5px;\n    }\n\n    .text {\n      display: inline-block;\n      margin-left: 5px;\n      font-weight: 600;\n    }\n\n    // Time labels\n    .label {\n      margin-left: 10px;\n      font-size: 9px;\n    }\n\n    // Tools and options box\n    .tools {\n      display: none;\n      float: right;\n      color: @red;\n      // icons\n      > .fa, > .glyphicon, > .ion {\n        margin-right: 5px;\n        cursor: pointer;\n      }\n\n    }\n    &:hover .tools {\n      display: inline-block;\n    }\n\n    &.done {\n      color: #999;\n      .text {\n        text-decoration: line-through;\n        font-weight: 500;\n      }\n\n      .label {\n        background: @gray!important;\n      }\n    }\n  }\n\n  // Color varaity\n  .danger {\n    border-left-color: @red;\n  }\n  .warning {\n    border-left-color: @yellow;\n  }\n  .info {\n    border-left-color: @aqua;\n  }\n  .success {\n    border-left-color: @green;\n  }\n  .primary {\n    border-left-color: @light-blue;\n  }\n\n  .handle {\n    display: inline-block;\n    cursor: move;\n    margin: 0 5px;\n  }\n\n}\n// END TODO WIDGET\n\n/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/\n.chat {\n  padding: 5px 20px 5px 10px;\n\n  .item {\n    .clearfix();\n    margin-bottom: 10px;\n    // The image\n    > img {\n      width: 40px;\n      height: 40px;\n      border: 2px solid transparent;\n      .border-radius(50%);\n    }\n\n    > .online {\n      border: 2px solid @green;\n    }\n    > .offline {\n      border: 2px solid @red;\n    }\n\n    // The message body\n    > .message {\n      margin-left: 55px;\n      margin-top: -40px;\n      > .name {\n        display: block;\n        font-weight: 600;\n      }\n    }\n\n    // The attachment\n    > .attachment {\n      .border-radius(@attachment-border-radius);\n      background: #f4f4f4;\n      margin-left: 65px;\n      margin-right: 15px;\n      padding: 10px;\n      > h4 {\n        margin: 0 0 5px 0;\n        font-weight: 600;\n        font-size: 14px;\n      }\n      > p, > .filename {\n        font-weight: 600;\n        font-size: 13px;\n        font-style: italic;\n        margin: 0;\n\n      }\n      .clearfix();\n    }\n  }\n\n}\n//END CHAT WIDGET\n\n//Input in box\n.box-input {\n  max-width: 200px;\n}\n\n//A fix for panels body text color when placed within\n// a modal\n.modal {\n  .panel-body {\n    color: #444;\n  }\n}\n","/*\n * Component: Info Box\n * -------------------\n */\n.info-box {\n  display: block;\n  min-height: 90px;\n  background: #fff;\n  width: 100%;\n  box-shadow: @box-boxshadow;\n  .border-radius(2px);\n  margin-bottom: 15px;\n  small {\n    font-size: 14px;\n  }\n  .progress {\n    background: rgba(0,0,0,.2);\n    margin: 5px -10px 5px -10px;\n    height: 2px;\n    &,\n    & .progress-bar {\n      .border-radius(0);\n    }\n    .progress-bar {\n      background: #fff;\n    }\n  }\n}\n.info-box-icon {\n  .border-radius(2px; 0; 2px; 0);\n  display: block;\n  float: left;\n  height: 90px;\n  width: 90px;\n  text-align: center;\n  font-size: 45px;\n  line-height: 90px;\n  background: rgba(0,0,0,0.2);\n  > img {\n    max-width: 100%;\n  }\n}\n.info-box-content {\n  padding: 5px 10px;\n  margin-left: 90px;\n}\n.info-box-number {\n  display: block;\n  font-weight: bold;\n  font-size: 18px;\n}\n.progress-description,\n.info-box-text {\n  display: block;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.info-box-text {\n  text-transform: uppercase;\n}\n.info-box-more {\n  display: block;\n}\n\n.progress-description {\n  margin: 0;\n}\n","/*\n * Component: Button\n * -----------------\n */\n\n.btn {\n  .border-radius(@btn-border-radius);\n  .box-shadow(@btn-boxshadow);\n  border: 1px solid transparent;\n\n  &.uppercase {\n    text-transform: uppercase\n  }\n\n  // Flat buttons\n  &.btn-flat {\n    .border-radius(0);\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n    border-width: 1px;\n  }\n\n  // Active state\n  &:active {\n    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n  }\n\n  &:focus {\n    outline: none;\n  }\n\n  // input file btn\n  &.btn-file {\n    position: relative;\n    overflow: hidden;\n    > input[type='file'] {\n      position: absolute;\n      top: 0;\n      right: 0;\n      min-width: 100%;\n      min-height: 100%;\n      font-size: 100px;\n      text-align: right;\n      .opacity(0);\n      outline: none;\n      background: white;\n      cursor: inherit;\n      display: block;\n    }\n  }\n}\n\n//Button color variations\n.btn-default {\n  background-color: #f4f4f4;\n  color: #444;\n  border-color: #ddd;\n  &:hover,\n    &:active,\n    &.hover {\n    background-color:darken(#f4f4f4, 5%);\n  }\n}\n.btn-primary {\n  background-color: @light-blue;\n  border-color: darken(@light-blue, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@light-blue, 5%);\n  }\n}\n.btn-success {\n  background-color: @green;\n  border-color: darken(@green, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@green, 5%);\n  }\n}\n.btn-info {\n  background-color: @aqua;\n  border-color: darken(@aqua, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@aqua, 5%);\n  }\n}\n.btn-danger {\n  background-color: @red;\n  border-color: darken(@red, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@red, 5%);\n  }\n}\n.btn-warning {\n  background-color: @yellow;\n  border-color: darken(@yellow, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@yellow, 5%);\n  }\n}\n.btn-outline {\n  border: 1px solid #fff;\n  background: transparent;\n  color: #fff;\n  &:hover,\n    &:focus,\n    &:active {\n    color: rgba(255,255,255,.7);\n    border-color: rgba(255,255,255,.7);\n  }\n}\n.btn-link {\n  .box-shadow(none);\n}\n//General .btn with bg class\n.btn[class*='bg-']:hover {\n  .box-shadow(inset 0 0 100px rgba(0,0,0,0.2));\n}\n// Application buttons\n.btn-app {\n  .border-radius(3px);\n  position: relative;\n  padding: 15px 5px;\n  margin: 0 0 10px 10px;\n  min-width: 80px;\n  height: 60px;\n  text-align: center;\n  color: #666;\n  border: 1px solid #ddd;\n  background-color: #f4f4f4;\n  font-size: 12px;\n  //Icons within the btn\n  > .fa, > .glyphicon, > .ion {\n    font-size: 20px;\n    display: block;\n  }\n\n  &:hover {\n    background: #f4f4f4;\n    color: #444;\n    border-color: #aaa;\n  }\n\n  &:active, &:focus {\n    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n  }\n\n  //The badge\n  > .badge {\n    position: absolute;\n    top: -3px;\n    right: -10px;\n    font-size: 10px;\n    font-weight: 400;\n  }\n}\n","// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","/*\n * Component: Callout\n * ------------------\n */\n\n// Base styles (regardless of theme)\n.callout {\n  .border-radius(3px);\n  margin: 0 0 20px 0;\n  padding: 15px 30px 15px 15px;\n  border-left: 5px solid #eee;\n  a {\n    color: #fff;\n    text-decoration: underline;\n    &:hover {\n      color: #eee;\n    }\n  }\n  h4 {\n    margin-top: 0;\n    font-weight: 600;\n  }\n  p:last-child {\n    margin-bottom: 0;\n  }\n  code,\n  .highlight {\n    background-color: #fff;\n  }\n\n  // Themes for different contexts\n  &.callout-danger {\n    &:extend(.bg-red);\n    border-color: darken(@red, 10%);\n  }\n  &.callout-warning {\n    &:extend(.bg-yellow);\n    border-color: darken(@yellow, 10%);\n  }\n  &.callout-info {\n    &:extend(.bg-aqua);\n    border-color: darken(@aqua, 10%);\n  }\n  &.callout-success {\n    &:extend(.bg-green);\n    border-color: darken(@green, 10%);\n  }\n}\n","/*\n * Component: alert\n * ----------------\n */\n\n.alert {\n  .border-radius(3px);\n  h4 {\n    font-weight: 600;\n  }\n  .icon {\n    margin-right: 10px;\n  }\n  .close {\n    color: #000;\n    .opacity(.2);\n    &:hover {\n      .opacity(.5);\n    }\n  }\n  a {\n    color: #fff;\n    text-decoration: underline;\n  }\n}\n\n//Alert Variants\n.alert-success {\n  &:extend(.bg-green);\n  border-color: darken(@green, 5%);\n}\n.alert-danger,\n.alert-error {\n  &:extend(.bg-red);\n  border-color: darken(@red, 5%);\n}\n.alert-warning {\n  &:extend(.bg-yellow);\n  border-color: darken(@yellow, 5%);\n}\n.alert-info {\n  &:extend(.bg-aqua);\n  border-color: darken(@aqua, 5%);\n}\n","/*\n * Component: Nav\n * --------------\n */\n\n.nav {\n  > li > a:hover,\n    > li > a:active,\n    > li > a:focus {\n    color: #444;\n    background: #f7f7f7;\n  }\n}\n\n/* NAV PILLS */\n.nav-pills {\n  > li > a {\n    .border-radius(0);\n    border-top: 3px solid transparent;\n    color: #444;\n    > .fa,\n    > .glyphicon,\n    > .ion {\n      margin-right: 5px;\n    }\n  }\n  > li.active > a,\n  > li.active > a:hover,\n    > li.active > a:focus {\n    border-top-color: @light-blue;\n  }\n  > li.active > a {\n    font-weight: 600;\n  }\n}\n/* NAV STACKED */\n.nav-stacked {\n  > li > a {\n    .border-radius(0);\n    border-top: 0;\n    border-left: 3px solid transparent;\n    color: #444;\n  }\n  > li.active > a,\n  > li.active > a:hover {\n    background: transparent;\n    color: #444;\n    border-top: 0;\n    border-left-color: @light-blue;\n  }\n\n  > li.header {\n    border-bottom: 1px solid #ddd;\n    color: #777;\n    margin-bottom: 10px;\n    padding: 5px 10px;\n    text-transform: uppercase;\n  }\n}\n\n/* NAV TABS */\n.nav-tabs-custom {\n  margin-bottom: 20px;\n  background: #fff;\n  box-shadow: @box-boxshadow;\n  border-radius: @box-border-radius;\n  > .nav-tabs {\n    margin: 0;\n    border-bottom-color: #f4f4f4;\n    .border-top-radius(@box-border-radius);\n    > li {\n      border-top: 3px solid transparent;\n      margin-bottom: -2px;\n      > a {\n        color: #444;\n        .border-radius(0);\n        &.text-muted {\n          color: #999;\n        }\n        &,\n        &:hover {\n          background: transparent;\n          margin: 0;\n        }\n        &:hover {\n          color: #999;\n        }\n      }\n      &:not(.active) {\n        > a:hover,\n          > a:focus,\n          > a:active {\n          border-color: transparent;\n        }\n      }\n      margin-right: 5px;\n    }\n\n    > li.active {\n      border-top-color: @light-blue;\n      & > a,\n      &:hover > a {\n        background-color: #fff;\n        color: #444;\n      }\n      > a {\n        border-top-color: transparent;\n        border-left-color: #f4f4f4;\n        border-right-color: #f4f4f4;\n      }\n\n    }\n\n    > li:first-of-type {\n      margin-left: 0;\n      &.active {\n        > a {\n          border-left-color: transparent;\n        }\n      }\n    }\n\n    //Pulled to the right\n    &.pull-right {\n      float: none!important;\n      > li {\n        float: right;\n      }\n      > li:first-of-type {\n        margin-right: 0;\n        > a {\n          border-left-width: 1px;\n        }\n        &.active {\n          > a {\n            border-left-color: #f4f4f4;\n            border-right-color: transparent;\n          }\n        }\n      }\n    }\n\n    > li.header {\n      line-height: 35px;\n      padding: 0 10px;\n      font-size: 20px;\n      color: #444;\n      > .fa,\n      > .glyphicon,\n      > .ion {\n        margin-right: 5px;\n      }\n    }\n  }\n\n  > .tab-content {\n    background: #fff;\n    padding: 10px;\n    .border-bottom-radius(@box-border-radius);\n  }\n\n  .dropdown.open > a {\n    &:active,\n      &:focus {\n      background: transparent;\n      color: #999;\n    }\n  }\n}\n\n/* PAGINATION */\n.pagination {\n  > li > a {\n    background: #fafafa;\n    color: #666;    \n  }\n  &.pagination-flat {\n    > li > a {\n      .border-radius(0)!important;\n    }\n  }\n}","/*\n * Component: Table\n * ----------------\n */\n\n.table {\n  //Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border-top: 1px solid @box-border-color;\n      }\n    }\n  }\n  //thead cells\n  > thead > tr > th {\n    border-bottom: 2px solid @box-border-color;\n  }\n  //progress bars in tables\n  tr td .progress {\n    margin-top: 5px;\n  }\n}\n\n//Bordered Table\n.table-bordered {\n  border: 1px solid @box-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @box-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n.table.no-border {\n  &,\n  td,\n  th {\n    border: 0;\n  }\n}\n\n/* .text-center in tables */\ntable.text-center {\n  &, td, th {\n    text-align: center;\n  }\n}\n\n.table.align {\n  th {\n    text-align: left;\n  }\n  td {\n    text-align: right;\n  }\n}\n","/*\n * Component: Label\n * ----------------\n */\n.label-default {\n  background-color: @gray;\n  color: #444;\n}\n.label-danger {\n  &:extend(.bg-red);\n}\n.label-info {\n  &:extend(.bg-aqua);\n}\n.label-warning {\n  &:extend(.bg-yellow);\n}\n.label-primary {\n  &:extend(.bg-light-blue);\n}\n.label-success {\n  &:extend(.bg-green);\n}\n","/*\n * Component: Direct Chat\n * ----------------------\n */\n.direct-chat {\n  .box-body {\n    .border-bottom-radius(0);\n    position: relative;\n    overflow-x: hidden;\n    padding: 0;\n  }\n  &.chat-pane-open {\n    .direct-chat-contacts {\n      .translate(0, 0);\n    }\n  }\n}\n.direct-chat-messages {\n  .translate(0, 0);\n  padding: 10px;\n  height: 250px;\n  overflow: auto;\n}\n.direct-chat-msg,\n.direct-chat-text {\n  display: block;\n}\n.direct-chat-msg {\n  .clearfix();\n  margin-bottom: 10px;\n}\n.direct-chat-messages,\n.direct-chat-contacts {\n  .transition-transform(.5s ease-in-out);\n}\n.direct-chat-text {\n  .border-radius(5px);\n  position: relative;\n  padding: 5px 10px;\n  background: @direct-chat-default-msg-bg;\n  border: 1px solid @direct-chat-default-msg-border-color;\n  margin: 5px 0 0 50px;\n  color: @direct-chat-default-font-color;\n\n  //Create the arrow\n  &:after,\n    &:before {\n    position: absolute;\n    right: 100%;\n    top: 15px;\n    border: solid transparent;\n    border-right-color: @direct-chat-default-msg-border-color;\n    content: ' ';\n    height: 0;\n    width: 0;\n    pointer-events: none;\n  }\n\n  &:after {\n    border-width: 5px;\n    margin-top: -5px;\n  }\n  &:before {\n    border-width: 6px;\n    margin-top: -6px;\n  }\n  .right & {\n    margin-right: 50px;\n    margin-left: 0;\n    &:after,\n      &:before {\n      right: auto;\n      left: 100%;\n      border-right-color: transparent;\n      border-left-color: @direct-chat-default-msg-border-color;\n    }\n  }\n}\n.direct-chat-img {\n  .border-radius(50%);\n  float: left;\n  width: 40px;\n  height: 40px;\n  .right & {\n    float: right;\n  }\n}\n.direct-chat-info {\n  display: block;\n  margin-bottom: 2px;\n  font-size: 12px;\n}\n.direct-chat-name {\n  font-weight: 600;\n}\n.direct-chat-timestamp {\n  color: #999;\n}\n//Direct chat contacts pane\n.direct-chat-contacts-open {\n  .direct-chat-contacts {\n    .translate(0, 0);\n  }\n}\n.direct-chat-contacts {\n  .translate(101%, 0);\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  height: 250px;\n  width: 100%;\n  background: #222d32;\n  color: #fff;\n  overflow: auto;\n}\n\n//Contacts list -- for displaying contacts in direct chat contacts pane\n.contacts-list {\n  &:extend(.list-unstyled);\n  > li {\n    .clearfix();\n    border-bottom: 1px solid rgba(0,0,0,0.2);\n    padding: 10px;\n    margin: 0;\n    &:last-of-type {\n      border-bottom: none;\n    }\n  }\n}\n.contacts-list-img {\n  .border-radius(50%);\n  width: 40px;\n  float: left;\n}\n.contacts-list-info {\n  margin-left: 45px;\n  color: #fff;\n}\n.contacts-list-name,\n.contacts-list-status {\n  display: block;\n}\n.contacts-list-name {\n  font-weight: 600;\n}\n.contacts-list-status {\n  font-size: 12px;\n}\n.contacts-list-date {\n  color: #aaa;\n  font-weight: normal;\n}\n.contacts-list-msg {\n  color: #999;\n}\n\n//Direct Chat Variants\n.direct-chat-danger {\n  .direct-chat-variant(@red);\n}\n.direct-chat-primary {\n  .direct-chat-variant(@light-blue);\n}\n.direct-chat-warning {\n  .direct-chat-variant(@yellow);\n}\n.direct-chat-info {\n  .direct-chat-variant(@aqua);\n}\n.direct-chat-success {\n  .direct-chat-variant(@green);\n}\n","/*\n * Component: Users List\n * ---------------------\n */\n.users-list {\n  &:extend(.list-unstyled);\n  > li {\n    width: 25%;\n    float: left;\n    padding: 10px;\n    text-align: center;\n    img {\n      .border-radius(50%);\n      max-width: 100%;\n      height: auto;\n    }\n    > a:hover {\n      &,\n      .users-list-name {\n        color: #999;\n      }\n    }\n  }\n}\n.users-list-name,\n.users-list-date {\n  display: block;\n}\n.users-list-name {\n  font-weight: 600;\n  color: #444;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.users-list-date {\n  color: #999;\n  font-size: 12px;\n}\n","/*\n * Component: modal\n * ----------------\n */\n.modal {\n  background: rgba(0,0,0,.3);\n}\n.modal-content {\n  .border-radius(0);\n  .box-shadow(0 2px 3px rgba(0,0,0,.125));\n  border: 0;\n  @media (min-width: @screen-sm-min) {\n    .box-shadow(0 2px 3px rgba(0,0,0,.125));\n  }\n}\n.modal-header {\n  border-bottom-color: @box-border-color;\n}\n.modal-footer {\n  border-top-color: @box-border-color;\n}\n\n//Modal variants\n.modal-primary {\n  .modal-body {\n    &:extend(.bg-light-blue);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-light-blue-active);\n    border-color: darken(@light-blue, 10%);\n  }\n}\n.modal-warning {\n  .modal-body {\n    &:extend(.bg-yellow);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-yellow-active);\n    border-color: darken(@yellow, 10%);\n  }\n}\n.modal-info {\n  .modal-body {\n    &:extend(.bg-aqua);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-aqua-active);\n    border-color: darken(@aqua, 10%);\n  }\n}\n.modal-success {\n  .modal-body {\n    &:extend(.bg-green);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-green-active);\n    border-color: darken(@green, 10%);\n  }\n}\n.modal-danger {\n  .modal-body {\n    &:extend(.bg-red);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-red-active);\n    border-color: darken(@red, 10%);\n  }\n}\n","/*\n * Page: Login & Register\n * ----------------------\n */\n\n.login-logo,\n.register-logo {\n  font-size: 35px;\n  text-align: center;\n  margin-bottom: 25px;\n  font-weight: 300;\n  a {\n    color: #444;\n  }\n}\n\n.login-page,\n.register-page {\n  background: @gray;\n}\n\n.login-box,\n.register-box {\n  width: 360px;\n  margin: 7% auto;\n  @media (max-width: @screen-sm) {\n    width: 90%;\n    margin-top: 20px;\n  }\n}\n\n.login-box-body,\n.register-box-body {\n  background: #fff;\n  padding: 20px;\n  border-top: 0;\n  color: #666;\n  .form-control-feedback {\n    color: #777;\n  }\n}\n.login-box-msg,\n.register-box-msg {\n  margin: 0;\n  text-align: center;\n  padding: 0 20px 20px 20px;\n}\n.social-auth-links {\n  margin: 10px 0;\n}\n","/*\n * Page: 400 and 500 error pages\n * ------------------------------\n */\n.error-page {\n  width: 600px;\n  margin: 20px auto 0 auto;\n  @media (max-width: @screen-sm-max) {\n    width: 100%;\n  }\n  //For the error number e.g: 404\n  > .headline {\n    float: left;\n    font-size: 100px;\n    font-weight: 300;\n    @media (max-width: @screen-sm-max) {\n      float: none;\n      text-align: center;\n    }\n  }\n  //For the message\n  > .error-content {\n    margin-left: 190px;\n    @media (max-width: @screen-sm-max) {\n      margin-left: 0;\n    }\n    > h3 {\n      font-weight: 300;\n      font-size: 25px;\n      @media(max-width: @screen-sm-max) {\n        text-align: center;\n      }\n    }\n    display: block;\n  }\n}\n","/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2015 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n\n@bs-height-base: (@line-height-computed + @padding-base-vertical * 2);\n@bs-height-lg:   (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2);\n@bs-height-sm:   (floor(@font-size-small * 1.5) + @padding-small-vertical * 2);\n@bs-height-xs:   (floor(@font-size-small * 1.2) + @padding-small-vertical + 1);\n\n.btn-social {\n  position: relative;\n  padding-left: (@bs-height-base + @padding-base-horizontal);\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  > :first-child {\n    position: absolute;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    width: @bs-height-base;\n    line-height: (@bs-height-base + 2);\n    font-size: 1.6em;\n    text-align: center;\n    border-right: 1px solid rgba(0, 0, 0, 0.2);\n  }\n  &.btn-lg {\n    padding-left: (@bs-height-lg + @padding-large-horizontal);\n    > :first-child {\n      line-height: @bs-height-lg;\n      width: @bs-height-lg;\n      font-size: 1.8em;\n    }\n  }\n  &.btn-sm {\n    padding-left: (@bs-height-sm + @padding-small-horizontal);\n    > :first-child {\n      line-height: @bs-height-sm;\n      width: @bs-height-sm;\n      font-size: 1.4em;\n    }\n  }\n  &.btn-xs {\n    padding-left: (@bs-height-xs + @padding-small-horizontal);\n    > :first-child {\n      line-height: @bs-height-xs;\n      width: @bs-height-xs;\n      font-size: 1.2em;\n    }\n  }\n}\n\n.btn-social-icon {\n  .btn-social;\n  height: (@bs-height-base + 2);\n  width: (@bs-height-base + 2);\n  padding: 0;\n  > :first-child {\n    border: none;\n    text-align: center;\n    width: 100%;\n  }\n  &.btn-lg {\n    height: @bs-height-lg;\n    width: @bs-height-lg;\n    padding-left: 0;\n    padding-right: 0;\n  }\n  &.btn-sm {\n    height: (@bs-height-sm + 2);\n    width: (@bs-height-sm + 2);\n    padding-left: 0;\n    padding-right: 0;\n  }\n  &.btn-xs {\n    height: (@bs-height-xs + 2);\n    width: (@bs-height-xs + 2);\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n.btn-social(@color-bg, @color: #fff) {\n  background-color: @color-bg;\n  .button-variant(@color, @color-bg, rgba(0,0,0,.2));\n}\n\n\n.btn-adn           { .btn-social(#d87a68); }\n.btn-bitbucket     { .btn-social(#205081); }\n.btn-dropbox       { .btn-social(#1087dd); }\n.btn-facebook      { .btn-social(#3b5998); }\n.btn-flickr        { .btn-social(#ff0084); }\n.btn-foursquare    { .btn-social(#f94877); }\n.btn-github        { .btn-social(#444444); }\n.btn-google        { .btn-social(#dd4b39); }\n.btn-instagram     { .btn-social(#3f729b); }\n.btn-linkedin      { .btn-social(#007bb6); }\n.btn-microsoft     { .btn-social(#2672ec); }\n.btn-openid        { .btn-social(#f7931e); }\n.btn-pinterest     { .btn-social(#cb2027); }\n.btn-reddit        { .btn-social(#eff7ff, #000); }\n.btn-soundcloud    { .btn-social(#ff5500); }\n.btn-tumblr        { .btn-social(#2c4762); }\n.btn-twitter       { .btn-social(#55acee); }\n.btn-vimeo         { .btn-social(#1ab7ea); }\n.btn-vk            { .btn-social(#587ea3); }\n.btn-yahoo         { .btn-social(#720e9e); }\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &.focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n","/*\n * Plugin: Full Calendar\n * ---------------------\n */\n//Fullcalendar buttons\n.fc-button {\n  background: #f4f4f4;\n  background-image: none;\n  color: #444;\n  border-color: #ddd;\n  border-bottom-color: #ddd;\n  &:hover,\n    &:active,\n    &.hover {\n    background-color: #e9e9e9;\n  }\n}\n// Calendar title\n.fc-header-title h2 {\n  font-size: 15px;\n  line-height: 1.6em;\n  color: #666;\n  margin-left: 10px;\n}\n.fc-header-right {\n  padding-right: 10px;\n}\n.fc-header-left {\n  padding-left: 10px;\n}\n// Calendar table header cells\n.fc-widget-header {\n  background: #fafafa;\n}\n.fc-grid {\n  width: 100%;\n  border: 0;\n}\n.fc-widget-header:first-of-type,\n.fc-widget-content:first-of-type {\n  border-left: 0;\n  border-right: 0;\n}\n.fc-widget-header:last-of-type,\n.fc-widget-content:last-of-type {\n  border-right: 0;\n}\n.fc-toolbar {\n  padding: @box-padding;\n  margin: 0;\n}\n.fc-day-number {\n  font-size: 20px;\n  font-weight: 300;\n  padding-right: 10px;\n}\n.fc-color-picker {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  > li {\n    float: left;\n    font-size: 30px;\n    margin-right: 5px;\n    line-height: 30px;\n    .fa {\n      .transition-transform(linear .3s);\n      &:hover {\n        .rotate(30deg);\n      }\n    }\n  }\n}\n#add-new-event {\n  .transition(all linear .3s);\n}\n.external-event {\n  padding: 5px 10px;\n  font-weight: bold;\n  margin-bottom: 4px;\n  box-shadow: @box-boxshadow;\n  text-shadow: @box-boxshadow;\n  border-radius: @box-border-radius;\n  cursor: move;\n  &:hover {\n    box-shadow: inset 0 0 90px rgba(0,0,0,0.2);\n  }\n}\n","/*\n * Plugin: Select2\n * ---------------\n */\n\n//Signle select\n.select2-container--default,\n.select2-selection {\n  &.select2-container--focus,\n  &:focus,\n    &:active {\n    outline: none;\n  }\n  .select2-selection--single {\n    border: 1px solid @gray;\n    border-radius: @input-radius;\n    padding: 6px 12px;\n    height: 34px;\n  }\n}\n.select2-container--default.select2-container--open {\n  border-color: @light-blue;\n}\n.select2-dropdown {\n  border: 1px solid @gray;\n  border-radius: @input-radius;\n}\n.select2-container--default .select2-results__option--highlighted[aria-selected] {\n  background-color: @light-blue;\n  color: white;\n}\n.select2-results__option {\n  padding: 6px 12px;\n  user-select: none;\n  -webkit-user-select: none; }\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-left: 0;\n  padding-right: 0;\n  height: auto;\n  margin-top: -4px;\n}\n.select2-container[dir=\"rtl\"] .select2-selection--single .select2-selection__rendered {\n  padding-right: 6px;\n  padding-left: 20px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow {\n  height: 28px;\n  right: 3px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow b {\n  margin-top: 0;\n}\n.select2-dropdown,\n.select2-search--inline {\n  .select2-search__field {\n    border: 1px solid @gray;\n    &:focus {\n      outline: none;\n      border: 1px solid @light-blue;\n    }\n  }\n}\n.select2-container--default .select2-results__option[aria-disabled=true] {\n  color: #999;\n}\n.select2-container--default .select2-results__option[aria-selected=true] {\n  background-color: #ddd;\n  &,\n  &:hover {\n    color: #444;\n  }\n}\n\n//Multiple select\n.select2-container--default {\n  .select2-selection--multiple {\n    border: 1px solid @gray;\n    border-radius: @input-radius;\n    &:focus {\n      border-color: @light-blue;\n    }\n  }\n  &.select2-container--focus .select2-selection--multiple {\n    border-color: @gray;\n  }\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice {\n  background-color: @light-blue;\n  border-color: darken(@light-blue, 5%);\n  padding: 1px 10px;\n  color: #fff;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {\n  margin-right: 5px;\n  color: rgba(255,255,255,.7);\n  &:hover {\n    color: #fff;\n  }\n}\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-right: 10px;\n}\n","/*\n * General: Miscellaneous\n * ----------------------\n */\n// 10px padding and margins\n.pad {\n  padding: 10px;\n}\n.margin {\n  margin: 10px;\n}\n.margin-bottom {\n  margin-bottom: 20px;\n}\n.margin-bottom-none {\n  margin-bottom: 0;\n}\n.margin-r-5 {\n  margin-right: 5px;\n}\n// Display inline\n.inline {\n  display: inline;\n}\n\n// Description Blocks\n.description-block {\n  display: block;\n  margin: 10px 0;\n  text-align: center;\n  &.margin-bottom {\n    margin-bottom: 25px;\n  }\n  > .description-header {\n    margin: 0;\n    padding: 0;\n    font-weight: 600;\n    font-size: 16px;\n  }\n  > .description-text {\n    text-transform: uppercase;\n  }\n}\n\n// Background colors\n.bg-red,\n.bg-yellow,\n.bg-aqua,\n.bg-blue,\n.bg-light-blue,\n.bg-green,\n.bg-navy,\n.bg-teal,\n.bg-olive,\n.bg-lime,\n.bg-orange ,\n.bg-fuchsia,\n.bg-purple,\n.bg-maroon,\n.bg-black,\n.bg-red-active,\n.bg-yellow-active,\n.bg-aqua-active,\n.bg-blue-active,\n.bg-light-blue-active,\n.bg-green-active,\n.bg-navy-active,\n.bg-teal-active,\n.bg-olive-active,\n.bg-lime-active,\n.bg-orange-active,\n.bg-fuchsia-active,\n.bg-purple-active,\n.bg-maroon-active,\n.bg-black-active {\n  color: #fff !important;\n}\n.bg-gray {\n  color: #000;\n  background-color: @gray!important;\n}\n.bg-gray-light {\n  background-color: #f7f7f7;\n}\n.bg-black {\n  background-color: @black!important;\n}\n.bg-red {\n  background-color: @red !important;\n}\n.bg-yellow {\n  background-color: @yellow !important;\n}\n.bg-aqua {\n  background-color: @aqua !important;\n}\n.bg-blue {\n  background-color: @blue !important;\n}\n.bg-light-blue {\n  background-color: @light-blue !important;\n}\n.bg-green {\n  background-color: @green !important;\n}\n.bg-navy {\n  background-color: @navy !important;\n}\n.bg-teal {\n  background-color: @teal !important;\n}\n.bg-olive {\n  background-color: @olive !important;\n}\n.bg-lime {\n  background-color: @lime !important;\n}\n.bg-orange {\n  background-color: @orange !important;\n}\n.bg-fuchsia {\n  background-color: @fuchsia !important;\n}\n.bg-purple {\n  background-color: @purple !important;\n}\n.bg-maroon {\n  background-color: @maroon !important;\n}\n\n//Set of Active Background Colors\n.bg-gray-active {\n  color: #000;\n  background-color: darken(@gray,10%)!important;\n}\n.bg-black-active {\n  background-color: darken(@black, 10%)!important;\n}\n.bg-red-active {\n  background-color: darken(@red , 6%)!important;\n}\n.bg-yellow-active {\n  background-color: darken(@yellow , 6%)!important;\n}\n.bg-aqua-active {\n  background-color: darken(@aqua , 6%)!important;\n}\n.bg-blue-active {\n  background-color: darken(@blue , 10%)!important;\n}\n.bg-light-blue-active {\n  background-color: darken(@light-blue , 6%)!important;\n}\n.bg-green-active {\n  background-color: darken(@green , 5%)!important;\n}\n.bg-navy-active {\n  background-color: darken(@navy , 2%)!important;\n}\n.bg-teal-active {\n  background-color: darken(@teal , 5%)!important;\n}\n.bg-olive-active {\n  background-color: darken(@olive , 5%)!important;\n}\n.bg-lime-active {\n  background-color: darken(@lime , 5%)!important;\n}\n.bg-orange-active {\n  background-color: darken(@orange , 5%)!important;\n}\n.bg-fuchsia-active {\n  background-color: darken(@fuchsia , 5%)!important;\n}\n.bg-purple-active {\n  background-color: darken(@purple , 5%)!important;\n}\n.bg-maroon-active {\n  background-color: darken(@maroon , 3%)!important;\n}\n\n//Disabled!\n[class^=\"bg-\"].disabled {\n  .opacity(.65);\n}\n\n// Text colors\n.text-red {\n  color: @red !important;\n}\n.text-yellow {\n  color: @yellow !important;\n}\n.text-aqua {\n  color: @aqua !important;\n}\n.text-blue {\n  color: @blue !important;\n}\n.text-black {\n  color: @black!important;\n}\n.text-light-blue {\n  color: @light-blue !important;\n}\n.text-green {\n  color: @green !important;\n}\n.text-gray {\n  color: @gray !important;\n}\n.text-navy {\n  color: @navy !important;\n}\n.text-teal {\n  color: @teal !important;\n}\n.text-olive {\n  color: @olive !important;\n}\n.text-lime {\n  color: @lime !important;\n}\n.text-orange {\n  color: @orange !important;\n}\n.text-fuchsia {\n  color: @fuchsia !important;\n}\n.text-purple {\n  color: @purple !important;\n}\n.text-maroon {\n  color: @maroon !important;\n}\n.link-muted {\n  color: darken(@gray, 30%);\n  &:hover,\n    &:focus {\n    color: darken(@gray, 40%);\n  }\n}\n.link-black {\n  color: #666;\n  &:hover,\n    &:focus {\n    color: #999;\n  }\n}\n\n// Hide elements by display none only\n.hide {\n  display: none !important;\n}\n\n// Remove borders\n.no-border {\n  border: 0 !important;\n}\n// Remove padding\n.no-padding {\n  padding: 0 !important;\n}\n// Remove margins\n.no-margin {\n  margin: 0 !important;\n}\n\n// Remove box shadow\n.no-shadow {\n  box-shadow: none!important;\n}\n\n// Unstyled List\n.list-unstyled {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n.list-group-unbordered {\n  > .list-group-item {\n    border-left: 0;\n    border-right: 0;\n    border-radius: 0; \n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n// Remove border radius\n.flat {\n  .border-radius(0)!important;\n}\n\n.text-bold {\n  &, &.table td, &.table th {\n    font-weight: 700;\n  }\n}\n.text-sm {\n  font-size: 12px;\n}\n\n// _fix for sparkline tooltip\n.jqstooltip{\n  padding: 5px!important;\n  width:auto!important;\n  height:auto!important;\n}\n\n\n// Gradient Background colors\n.bg-teal-gradient {\n  .gradient(@teal; @teal; lighten(@teal, 16%))!important;\n  color: #fff;\n}\n.bg-light-blue-gradient {\n  .gradient(@light-blue; @light-blue; lighten(@light-blue, 12%))!important;\n  color: #fff;\n}\n.bg-blue-gradient {\n  .gradient(@blue; @blue; lighten(@blue, 7%))!important;\n  color: #fff;\n}\n.bg-aqua-gradient {\n  .gradient(@aqua; @aqua; lighten(@aqua, 7%))!important;\n  color: #fff;\n}\n.bg-yellow-gradient {\n  .gradient(@yellow; @yellow; lighten(@yellow, 16%))!important;\n  color: #fff;\n}\n.bg-purple-gradient {\n  .gradient(@purple; @purple; lighten(@purple, 16%))!important;\n  color: #fff;\n}\n.bg-green-gradient {\n  .gradient(@green; @green; lighten(@green, 7%))!important;\n  color: #fff;\n}\n.bg-red-gradient {\n  .gradient(@red; @red; lighten(@red, 10%))!important;\n  color: #fff;\n}\n.bg-black-gradient {\n  .gradient(@black; @black; lighten(@black, 10%))!important;\n  color: #fff;\n}\n.bg-maroon-gradient {\n  .gradient(@maroon; @maroon; lighten(@maroon, 10%))!important;\n  color: #fff;\n}\n\n//Description Block Extension\n.description-block {\n  .description-icon {\n    font-size: 16px;\n  }\n}\n\n//Remove top padding\n.no-pad-top {\n  padding-top: 0;\n}\n\n//Make position static\n.position-static {\n  position: static!important;\n}\n\n//List utility classes\n.list-header {\n  font-size: 15px;\n  padding: 10px 4px;\n  font-weight: bold;\n  color: #666;\n}\n.list-seperator {\n  height: 1px;\n  background: @box-border-color;\n  margin: 15px 0 9px 0;\n}\n.list-link {\n  > a {\n    padding: 4px;\n    color: #777;\n    &:hover {\n      color: #222;\n    }\n  }\n}\n\n//Light font weight\n.font-light {\n  font-weight: 300;\n}\n\n//User block\n.user-block {\n  .clearfix();\n  img {\n    width: 40px;\n    height: 40px;\n    float: left;\n  }\n  .username,\n  .description,\n  .comment {\n    display: block;\n    margin-left: 50px;\n  }\n  .username {\n    font-size: 16px;\n    font-weight: 600;\n  }\n  .description {\n    color: #999;\n    font-size: 13px;\n  }\n  &.user-block-sm {\n    img {\n      &:extend(.img-sm);\n    }\n    .username,\n    .description,\n    .comment {\n      margin-left: 40px;\n    }\n    .username {\n      font-size: 14px;\n    }\n  }\n}\n\n//Image sizes\n.img-sm,\n.img-md,\n.img-lg {\n  float: left;\n}\n.img-sm {\n  width: 30px!important;\n  height: 30px!important;\n  + .img-push {\n    margin-left: 40px;\n  }\n}\n.img-md {\n  width: 60px;\n  height: 60px;\n  + .img-push {\n    margin-left: 70px;\n  }\n}\n.img-lg {\n  width: 100px;\n  height: 100px;\n  + .img-push {\n    margin-left: 110px;\n  }\n}\n// Image bordered\n.img-bordered {\n  border: 3px solid @gray;\n  padding: 3px;\n}\n.img-bordered-sm {\n  border: 2px solid @gray;\n  padding: 2px;\n}\n//General attachemnt block\n.attachment-block {\n  border: 1px solid @box-border-color;\n  padding: 5px;\n  margin-bottom: 10px;\n  background: #f7f7f7;\n\n  .attachment-img {\n    max-width: 100px;\n    max-height: 100px;\n    height: auto;\n    float: left;\n  }\n  .attachment-pushed {\n    margin-left: 110px;\n  }\n  .attachment-heading {\n    margin: 0;\n  }\n  .attachment-text {\n    color: #555;\n  }\n}\n\n.connectedSortable {\n  min-height: 100px;\n}\n.ui-helper-hidden-accessible {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n.sort-highlight {\n  background: #f4f4f4;\n  border: 1px dashed #ddd;\n  margin-bottom: 10px;\n}\n.full-opacity-hover {\n  .opacity(.65);\n  &:hover {\n    .opacity(1);\n  }\n}\n// Charts\n.chart {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n  svg,\n  canvas {\n    width: 100%!important;\n  }\n}\n","/*\n * Misc: print\n * -----------\n */\n@media print {\n  //Add to elements that you do not want to show when printing\n  .no-print {\n    display: none!important;\n  }\n  //Elements that we want to hide when printing\n  .main-sidebar,\n  .left-side,\n  .main-header,\n  .content-header {\n    &:extend(.no-print);\n  }\n  //This is the only element that should appear, so let's remove the margins\n  .content-wrapper,\n  .right-side,\n  .main-footer {\n    margin-left: 0!important;    \n    min-height: 0!important;\n    .translate(0,0)!important;\n  }\n  .fixed .content-wrapper,\n  .fixed .right-side {\n    padding-top: 0!important;\n  }\n  //Invoice printing\n  .invoice {\n    width: 100%;\n    border: 0;\n    margin: 0;\n    padding: 0;\n  }\n  .invoice-col {\n    float: left;\n    width: 33.3333333%;\n  }\n  //Make sure table content displays properly\n  .table-responsive {\n    overflow: auto;\n    > .table tr th,\n    > .table tr td {\n      white-space: normal!important;\n    }\n  }\n}\n","/*\n * Skin: Blue\n * ----------\n */\n.skin-blue .main-header .navbar {\n  background-color: #3c8dbc;\n}\n.skin-blue .main-header .navbar .nav > li > a {\n  color: #fff;\n}\n.skin-blue .main-header .navbar .nav > li > a:hover,\n.skin-blue .main-header .navbar .nav > li > a:active,\n.skin-blue .main-header .navbar .nav > li > a:focus,\n.skin-blue .main-header .navbar .nav .open > a,\n.skin-blue .main-header .navbar .nav .open > a:hover,\n.skin-blue .main-header .navbar .nav .open > a:focus,\n.skin-blue .main-header .navbar .nav > .active > a {\n  background: rgba(0, 0, 0, 0.1);\n  color: #f6f6f6;\n}\n.skin-blue .main-header .navbar .sidebar-toggle {\n  color: #fff;\n}\n.skin-blue .main-header .navbar .sidebar-toggle:hover {\n  color: #f6f6f6;\n  background: rgba(0, 0, 0, 0.1);\n}\n.skin-blue .main-header .navbar .sidebar-toggle {\n  color: #fff;\n}\n.skin-blue .main-header .navbar .sidebar-toggle:hover {\n  background-color: #367fa9;\n}\n@media (max-width: 767px) {\n  .skin-blue .main-header .navbar .dropdown-menu li.divider {\n    background-color: rgba(255, 255, 255, 0.1);\n  }\n  .skin-blue .main-header .navbar .dropdown-menu li a {\n    color: #fff;\n  }\n  .skin-blue .main-header .navbar .dropdown-menu li a:hover {\n    background: #367fa9;\n  }\n}\n.skin-blue .main-header li.user-header {\n  background-color: #3c8dbc;\n}\n.skin-blue .content-header {\n  background: transparent;\n}\n.skin-blue .wrapper,\n.skin-blue .main-sidebar,\n.skin-blue .left-side {\n  background-color: #222d32;\n}\n.skin-blue .user-panel > .info,\n.skin-blue .user-panel > .info > a {\n  color: #fff;\n}\n.skin-blue .sidebar-menu > li.header {\n  color: #4b646f;\n  background: #1a2226;\n}\n.skin-blue .sidebar-menu > li > a {\n  border-left: 3px solid transparent;\n}\n.skin-blue .sidebar-menu > li:hover > a,\n.skin-blue .sidebar-menu > li.active > a {\n  color: #fff;\n  background: #1e282c;\n  border-left-color: #3c8dbc;\n}\n.skin-blue .sidebar-menu > li > .treeview-menu {\n  margin: 0 1px;\n  background: #2c3b41;\n}\n.skin-blue .sidebar a {\n  color: #b8c7ce;\n}\n.skin-blue .sidebar a:hover {\n  text-decoration: none;\n}\n.skin-blue .treeview-menu > li > a {\n  color: #8aa4af;\n}\n.skin-blue .treeview-menu > li.active > a,\n.skin-blue .treeview-menu > li > a:hover {\n  color: #fff;\n}\n.skin-blue .sidebar-form {\n  border-radius: 3px;\n  border: 1px solid #374850;\n  margin: 10px 10px;\n}\n.skin-blue .sidebar-form input[type=\"text\"],\n.skin-blue .sidebar-form .btn {\n  box-shadow: none;\n  background-color: #374850;\n  border: 1px solid transparent;\n  height: 35px;\n  -webkit-transition: all 0.3s ease-in-out;\n  -o-transition: all 0.3s ease-in-out;\n  transition: all 0.3s ease-in-out;\n}\n.skin-blue .sidebar-form input[type=\"text\"] {\n  color: #666;\n  border-top-left-radius: 2px;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 2px;\n}\n.skin-blue .sidebar-form input[type=\"text\"]:focus,\n.skin-blue .sidebar-form input[type=\"text\"]:focus + .input-group-btn .btn {\n  background-color: #fff;\n  color: #666;\n}\n.skin-blue .sidebar-form input[type=\"text\"]:focus + .input-group-btn .btn {\n  border-left-color: #fff;\n}\n.skin-blue .sidebar-form .btn {\n  color: #999;\n  border-top-left-radius: 0;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n  border-bottom-left-radius: 0;\n}\n.skin-blue.layout-top-nav .main-header > .logo .logo-variant {\n  background-color: none;\n}\n","/*\n * Skin: Blue\n * ----------\n */\n@import \"../../less/bootstrap-less/mixins.less\";\n@import \"../../less/bootstrap-less/variables.less\";\n@import \"../variables.less\";\n@import \"../mixins.less\";\n\n.skin-blue {\n  //Navbar\n  .main-header {\n    .navbar {\n      .navbar-variant(@light-blue; #fff);\n      .sidebar-toggle {\n        color: #fff;\n        &:hover {\n          background-color: darken(@light-blue, 5%);\n        }\n      }\n      @media (max-width: @screen-header-collapse) {\n        .dropdown-menu {\n          li {\n            &.divider {\n              background-color: rgba(255, 255, 255, 0.1);\n            }\n            a {\n              color: #fff;\n              &:hover {\n                background: darken(@light-blue, 5%);\n              }\n            }\n          }\n        }\n      }\n    }\n    //Logo\n\n    li.user-header {\n      background-color: @light-blue;\n    }\n  }\n\n  //Content Header\n  .content-header {\n    background: transparent;\n  }\n\n  //Create the sidebar skin\n  .skin-dark-sidebar(@light-blue);\n}\n\n.skin-blue.layout-top-nav .main-header > .logo {\n  .logo-variant {\n    background-color: none;\n  }\n}\n","//AdminLTE mixins\n//===============\n\n\n//Changes the color and the hovering properties of the navbar\n.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) {\n  background-color: @color;\n  //Navbar links\n  .nav > li > a {\n    color: @font-color;\n  }\n\n  .nav > li > a:hover,\n    .nav > li > a:active,\n    .nav > li > a:focus,\n    .nav .open > a,\n    .nav .open > a:hover,\n    .nav .open > a:focus,\n    .nav > .active > a {\n    background: @hover-bg;\n    color: @hover-color;\n  }\n\n  //Add color to the sidebar toggle button\n  .sidebar-toggle {\n    color: @font-color;\n    &:hover {\n      color: @hover-color;\n      background: @hover-bg;\n    }\n  }\n}\n\n//Logo color variation\n.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) {\n  background-color: @bg-color;\n  color: @color;\n  border-bottom: @border-bottom-width solid @border-bottom-color;\n\n  &:hover {\n    background-color: darken(@bg-color, 1%);\n  }\n}\n\n//Box solid color variantion creator\n.box-solid-variant(@color; @text-color: #fff) {\n  border: 1px solid @color;\n  > .box-header {\n    color: @text-color;\n    background: @color;\n    background-color: @color;\n    a,\n    .btn {\n      color: @text-color;\n    }\n  }\n}\n\n//Direct Chat Variant\n.direct-chat-variant(@bg-color; @color: #fff) {\n  .right > .direct-chat-text {\n    background: @bg-color;\n    border-color: @bg-color;\n    color: @color;\n    &:after,\n      &:before {\n      border-left-color: @bg-color;\n    }\n  }\n}\n\n//border radius creator\n.border-radius(@radius) {\n  border-radius: @radius;\n}\n//Different radius each side\n.border-radius(@top-left; @top-right; @bottom-left; @bottom-right) {\n  border-top-left-radius: @top-left;\n  border-top-right-radius: @top-right;\n  border-bottom-right-radius: @bottom-right;\n  border-bottom-left-radius: @bottom-left;\n}\n\n//Gradient background\n.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) {\n  background: @color;\n  background: -webkit-gradient(linear,\n    left bottom,\n    left top,\n    color-stop(0, @start),\n    color-stop(1, @stop));\n  background: -ms-linear-gradient(bottom,\n    @start,\n    @stop);\n  background: -moz-linear-gradient(center bottom,\n    @start 0%,\n    @stop 100%);\n  background: -o-linear-gradient(@stop,\n    @start);\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",@stop,@start));\n}\n\n//Added 2.1.0\n//Skins Mixins\n\n//Dark Sidebar Mixin\n.skin-dark-sidebar(@link-hover-border-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-dark-bg;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: #fff;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-dark-bg, 20%);\n      background: darken(@sidebar-dark-bg, 4%);\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n    }\n    //Hover and active states\n    &:hover > a, &.active > a {\n      color: @sidebar-dark-hover-color;\n      background: @sidebar-dark-hover-bg;\n      border-left-color: @link-hover-border-color;\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      margin: 0 1px;\n      background: @sidebar-dark-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-dark-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-dark-submenu-color;\n      }\n      &.active > a, > a:hover {\n        color: @sidebar-dark-submenu-hover-color;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid lighten(@sidebar-dark-bg, 10%);\n    margin: 10px 10px;\n    input[type=\"text\"], .btn {\n      box-shadow: none;\n      background-color: lighten(@sidebar-dark-bg, 10%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus, &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n}\n\n//Light Sidebar Mixin\n.skin-light-sidebar(@icon-active-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-light-bg;\n  }\n  .content-wrapper,\n  .main-footer {\n    border-left: 1px solid @gray;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: @sidebar-light-color;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    .transition(border-left-color .3s ease);\n    //border-left: 3px solid transparent;\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-light-color, 25%);\n      background: @sidebar-light-bg;\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n      font-weight: 600;\n    }\n    //Hover and active states\n    &:hover > a,\n      &.active > a {\n      color: @sidebar-light-hover-color;\n      background: @sidebar-light-hover-bg;\n    }\n    &:hover > a {\n\n    }\n    &.active {\n      border-left-color: @icon-active-color;\n      > a {\n        font-weight: 600;\n      }\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      background: @sidebar-light-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-light-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-light-submenu-color;\n      }\n      &.active > a,\n      > a:hover {\n        color: @sidebar-light-submenu-hover-color;\n      }\n      &.active > a {\n        font-weight: 600;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid @gray;//darken(@sidebar-light-bg, 5%);\n    margin: 10px 10px;\n    input[type=\"text\"],\n    .btn {\n      box-shadow: none;\n      background-color: #fff;//darken(@sidebar-light-bg, 3%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus,\n        &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n  @media(min-width: @screen-sm-min) {\n    &.sidebar-mini.sidebar-collapse {\n      .sidebar-menu > li > .treeview-menu {\n        border-left: 1px solid @gray;\n      }\n    }\n  }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","/*!\n * Lightbox for Bootstrap 3 by @ashleydw\n * https://github.com/ashleydw/lightbox\n *\n * License: https://github.com/ashleydw/lightbox/blob/master/LICENSE\n */\n.ekko-lightbox-container {\n  position: relative;\n}\n.ekko-lightbox-nav-overlay {\n  z-index: 100;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.ekko-lightbox-nav-overlay a {\n  opacity: 0;\n  -webkit-transition: opacity 0.5s;\n  -moz-transition: opacity 0.5s;\n  -o-transition: opacity 0.5s;\n  transition: opacity 0.5s;\n  color: #fff;\n  font-size: 30px;\n  height: 100%;\n  width: 49%;\n  display: block;\n  text-shadow: 2px 2px 4px #000;\n  filter: dropshadow(color=#000, offx=2, offy=2);\n  z-index: 100;\n}\n.ekko-lightbox-nav-overlay a:empty {\n  width: 49%;\n}\n.ekko-lightbox a:hover {\n  opacity: 1;\n  text-decoration: none;\n}\n.ekko-lightbox .glyphicon-chevron-left {\n  padding-left: 15px;\n  float: left;\n  left: 0;\n  text-align: left;\n}\n.ekko-lightbox .glyphicon-chevron-right {\n  padding-right: 15px;\n  float: right;\n  right: 0;\n  text-align: right;\n}\n.ekko-lightbox .modal-footer {\n  text-align: left;\n}\n","/*!\n * Lightbox for Bootstrap 3 by @ashleydw\n * https://github.com/ashleydw/lightbox\n *\n * License: https://github.com/ashleydw/lightbox/blob/master/LICENSE\n */\n\n.ekko-lightbox {\n  &-container {\n    position:relative;\n  }\n\n  &-nav-overlay {\n    z-index:100;\n    position: absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n\n    a {\n      opacity: 0;\n      -webkit-transition: opacity 0.5s;\n      -moz-transition: opacity 0.5s;\n      -o-transition: opacity 0.5s;\n      transition: opacity 0.5s;\n      color:#fff;\n      font-size:30px;\n      height: 100%;\n      width:49%;\n      display:block;\n      text-shadow: 2px 2px 4px #000;\n      filter: dropshadow(color=#000, offx=2, offy=2);\n      z-index:100;\n\n      &:empty {\n        width:49%;\n      }\n    }\n  }\n\n  a:hover {\n    opacity: 1;\n    text-decoration: none;\n  }\n\n  .glyphicon-chevron-left {\n    padding-left:15px;\n    float:left;\n    left:0;\n    text-align: left;\n  }\n\n  .glyphicon-chevron-right {\n    padding-right:15px;\n    float:right;\n    right:0;\n    text-align: right;\n  }\n\n  .modal-footer {\n    text-align: left;\n  }\n}",".skin-blue .main-header .logo {\n  background-color: inherit;\n}\n.main-header .logo {\n  width: 100% !important;\n  white-space: nowrap;\n  text-align: left;\n  display: block;\n  clear: both;\n  //text-overflow: hidden;\n}\n.huge {\n  font-size: 40px;\n}\n\n.btn-file {\n    position: relative;\n    overflow: hidden;\n}\n\n.dropdown-menu>li>a {\n    color: #354044;\n}\n\n\n#sort tr.cansort {\nborder-radius: 2px;\npadding: 10px;\nbackground: #f4f4f4;\nmargin-bottom: 3px;\nborder-left: 2px solid #e6e7e8;\ncolor: #444;\ncursor: move;\n}\n\n.user-image-inline {\n  float: left;\n  width: 25px;\n  height: 25px;\n  border-radius: 50%;\n  margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n  background-color: #f4f4f4;\n}\n\na.accordion-header {\n    color: #333;\n}\n\n.dynamic-form-row {\n  padding: 10px;\n  margin: 20px;\n}\n\n\n.handle {\n  padding-left: 10px;\n}\n\n.btn-file input[type=file] {\n    position: absolute;\n    top: 0;\n    right: 0;\n    min-width: 100%;\n    min-height: 100%;\n    font-size: 100px;\n    text-align: right;\n    filter: alpha(opacity=0);\n    opacity: 0;\n    outline: none;\n    background: white;\n    cursor: inherit;\n    display: block;\n}\n.main-footer {\n  font-size: 13px;\n}\n.main-header {\n  max-height: 150px;\n}\n.navbar-brand-img {\n  float: left;\n  padding: 5px 5px 5px 0;\n}\n\n.navbar-nav>.user-menu>.dropdown-menu {\n  width: inherit;\n}\n.main-header .logo {\n  padding: 0px 5px 0px 15px;\n}\n\n\n.sidebar-toggle {\n  margin-left: -48px;\n  z-index: 100;\n  background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n  z-index: 100;\n  width: 50px;\n  padding-top: 10px;\n}\n\n.skin-blue .main-header .navbar .dropdown-menu li a {\n  //color: inherit;\n}\n\n.main-header .sidebar-toggle:before {\n  content: \"\\f0c9\";\n}\n\n.direct-chat-contacts {\n  padding: 10px;\n  height: 150px;\n}\n\n\n.select2-container {\n  width: 100%;\n}\n.error input {\n  color: #dd4b39;\n  border: 2px solid #dd4b39 !important;\n}\n\n.error label, .alert-msg {\n  color: #dd4b39;\n  display: block;\n}\n\n.input-group[class*=\"col-\"] {\n        padding-right: 15px;\n        padding-left: 15px;\n  }\n  .control-label.multiline {\n      padding-top: 10;\n  }\n\n.btn-outline {\n  color: inherit;\n  background-color: transparent;\n  transition: all .5s;\n}\n\n.btn-primary.btn-outline {\n  color: #428bca;\n}\n\n.btn-success.btn-outline {\n  color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n  color: #5bc0de;\n}\n\n.btn-warning.btn-outline {\n  color: #f0ad4e;\n}\n\n.btn-danger.btn-outline {\n  color: #d9534f;\n}\n\n.btn-primary.btn-outline:hover, .btn-success.btn-outline:hover, .btn-info.btn-outline:hover, .btn-warning.btn-outline:hover, .btn-danger.btn-outline:hover {\n  color: #fff;\n}\n\n.slideout-menu {\n\tposition: fixed;\n\ttop: 0;\n\tright: -250px;\n\twidth: 250px;\n\theight: 100%;\n\tbackground: #333;\n\tz-index: 100;\n  margin-top: 100px;\n  color: white;\n  padding: 10px;\n}\n.slideout-menu h3 {\n\tposition: relative;\n\tpadding: 5px 5px;\n\tcolor: #fff;\n\tfont-size: 1.2em;\n\tfont-weight: 400;\n\tborder-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n\tposition: absolute;\n\ttop: 12px;\n\tright: 10px;\n\tdisplay: inline-block;\n\tpadding: 6px 9px 5px;\n\tfont-family: Arial, sans-serif;\n\tfont-weight: bold;\n\tline-height: 1;\n\tbackground: #222;\n\tcolor: #999;\n\ttext-decoration: none;\n\tvertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n\tcolor: #fff;\n}\n.slideout-menu ul {\n\tlist-style: none;\n\tfont-weight: 300;\n\tborder-top: 1px solid #151515;\n\tborder-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n\tborder-top: 1px solid #454545;\n\tborder-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n\tposition: relative;\n\tdisplay: block;\n\tpadding: 10px;\n\tcolor: #999;\n\ttext-decoration: none;\n}\n.slideout-menu ul li a:hover {\n\tbackground: #000;\n\tcolor: #fff;\n}\n.slideout-menu ul li a i {\n\tposition: absolute;\n\ttop: 15px;\n\tright: 10px;\n\topacity: .5;\n}\n\n .btn-box-tool-lg {\n   font-size: 16px;\n   color: orange;\n }\n\n\n\n .bs-wizard {margin-top: 20px;}\n\n /*Form Wizard*/\n .bs-wizard {border-bottom: solid 1px #e0e0e0; padding: 0 0 10px 0;}\n .bs-wizard > .bs-wizard-step {padding: 0; position: relative;}\n .bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n .bs-wizard > .bs-wizard-step .bs-wizard-stepnum {color: #595959; font-size: 16px; margin-bottom: 5px;}\n .bs-wizard > .bs-wizard-step .bs-wizard-info {color: #999; font-size: 14px;}\n .bs-wizard > .bs-wizard-step > .bs-wizard-dot {position: absolute; width: 30px; height: 30px; display: block; background: #fbe8aa; top: 45px; left: 50%; margin-top: -15px; margin-left: -15px; border-radius: 50%;}\n .bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {content: ' '; width: 14px; height: 14px; background: #fbbd19; border-radius: 50px; position: absolute; top: 8px; left: 8px; }\n .bs-wizard > .bs-wizard-step > .progress {position: relative; border-radius: 0px; height: 8px; box-shadow: none; margin: 20px 0;}\n .bs-wizard > .bs-wizard-step > .progress > .progress-bar {width:0px; box-shadow: none; background: #fbe8aa;}\n .bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {width:100%;}\n .bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {width:50%;}\n .bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {width:0%;}\n .bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {width: 100%;}\n .bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {background-color: #f5f5f5;}\n .bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {opacity: 0;}\n .bs-wizard > .bs-wizard-step:first-child  > .progress {left: 50%; width: 50%;}\n .bs-wizard > .bs-wizard-step:last-child  > .progress {width: 50%;}\n .bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot{ pointer-events: none; }\n /*END Form Wizard*/\n\n.left-navblock{\n  display: inline-block;\n  float: left;\n  text-align: left;\n  color: white;\n  padding: 0px;\n  /* adjust based on your layout */\n\n}\n.skin-blue .main-header .navbar .dropdown-menu li a {\n  color: #333;\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n\n.required {\n  border-right: 6px solid orange;\n}\n\n",".skin-blue .main-header .logo {\n  background-color: inherit;\n}\n.main-header .logo {\n  width: 100% !important;\n  white-space: nowrap;\n  text-align: left;\n  display: block;\n  clear: both;\n}\n.huge {\n  font-size: 40px;\n}\n.btn-file {\n  position: relative;\n  overflow: hidden;\n}\n.dropdown-menu > li > a {\n  color: #354044;\n}\n#sort tr.cansort {\n  border-radius: 2px;\n  padding: 10px;\n  background: #f4f4f4;\n  margin-bottom: 3px;\n  border-left: 2px solid #e6e7e8;\n  color: #444;\n  cursor: move;\n}\n.user-image-inline {\n  float: left;\n  width: 25px;\n  height: 25px;\n  border-radius: 50%;\n  margin-right: 10px;\n}\n.input-group .input-group-addon {\n  background-color: #f4f4f4;\n}\na.accordion-header {\n  color: #333;\n}\n.dynamic-form-row {\n  padding: 10px;\n  margin: 20px;\n}\n.handle {\n  padding-left: 10px;\n}\n.btn-file input[type=file] {\n  position: absolute;\n  top: 0;\n  right: 0;\n  min-width: 100%;\n  min-height: 100%;\n  font-size: 100px;\n  text-align: right;\n  filter: alpha(opacity=0);\n  opacity: 0;\n  outline: none;\n  background: white;\n  cursor: inherit;\n  display: block;\n}\n.main-footer {\n  font-size: 13px;\n}\n.main-header {\n  max-height: 150px;\n}\n.navbar-brand-img {\n  float: left;\n  padding: 5px 5px 5px 0;\n}\n.navbar-nav > .user-menu > .dropdown-menu {\n  width: inherit;\n}\n.main-header .logo {\n  padding: 0px 5px 0px 15px;\n}\n.sidebar-toggle {\n  margin-left: -48px;\n  z-index: 100;\n  background-color: inherit;\n}\n.sidebar-toggle-mobile {\n  z-index: 100;\n  width: 50px;\n  padding-top: 10px;\n}\n.main-header .sidebar-toggle:before {\n  content: \"\\f0c9\";\n}\n.direct-chat-contacts {\n  padding: 10px;\n  height: 150px;\n}\n.select2-container {\n  width: 100%;\n}\n.error input {\n  color: #dd4b39;\n  border: 2px solid #dd4b39 !important;\n}\n.error label,\n.alert-msg {\n  color: #dd4b39;\n  display: block;\n}\n.input-group[class*=\"col-\"] {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.control-label.multiline {\n  padding-top: 10;\n}\n.btn-outline {\n  color: inherit;\n  background-color: transparent;\n  transition: all .5s;\n}\n.btn-primary.btn-outline {\n  color: #428bca;\n}\n.btn-success.btn-outline {\n  color: #5cb85c;\n}\n.btn-info.btn-outline {\n  color: #5bc0de;\n}\n.btn-warning.btn-outline {\n  color: #f0ad4e;\n}\n.btn-danger.btn-outline {\n  color: #d9534f;\n}\n.btn-primary.btn-outline:hover,\n.btn-success.btn-outline:hover,\n.btn-info.btn-outline:hover,\n.btn-warning.btn-outline:hover,\n.btn-danger.btn-outline:hover {\n  color: #fff;\n}\n.slideout-menu {\n  position: fixed;\n  top: 0;\n  right: -250px;\n  width: 250px;\n  height: 100%;\n  background: #333;\n  z-index: 100;\n  margin-top: 100px;\n  color: white;\n  padding: 10px;\n}\n.slideout-menu h3 {\n  position: relative;\n  padding: 5px 5px;\n  color: #fff;\n  font-size: 1.2em;\n  font-weight: 400;\n  border-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n  position: absolute;\n  top: 12px;\n  right: 10px;\n  display: inline-block;\n  padding: 6px 9px 5px;\n  font-family: Arial, sans-serif;\n  font-weight: bold;\n  line-height: 1;\n  background: #222;\n  color: #999;\n  text-decoration: none;\n  vertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n  color: #fff;\n}\n.slideout-menu ul {\n  list-style: none;\n  font-weight: 300;\n  border-top: 1px solid #151515;\n  border-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n  border-top: 1px solid #454545;\n  border-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n  position: relative;\n  display: block;\n  padding: 10px;\n  color: #999;\n  text-decoration: none;\n}\n.slideout-menu ul li a:hover {\n  background: #000;\n  color: #fff;\n}\n.slideout-menu ul li a i {\n  position: absolute;\n  top: 15px;\n  right: 10px;\n  opacity: .5;\n}\n.btn-box-tool-lg {\n  font-size: 16px;\n  color: orange;\n}\n.bs-wizard {\n  margin-top: 20px;\n}\n/*Form Wizard*/\n.bs-wizard {\n  border-bottom: solid 1px #e0e0e0;\n  padding: 0 0 10px 0;\n}\n.bs-wizard > .bs-wizard-step {\n  padding: 0;\n  position: relative;\n}\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {\n  color: #595959;\n  font-size: 16px;\n  margin-bottom: 5px;\n}\n.bs-wizard > .bs-wizard-step .bs-wizard-info {\n  color: #999;\n  font-size: 14px;\n}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {\n  position: absolute;\n  width: 30px;\n  height: 30px;\n  display: block;\n  background: #fbe8aa;\n  top: 45px;\n  left: 50%;\n  margin-top: -15px;\n  margin-left: -15px;\n  border-radius: 50%;\n}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {\n  content: ' ';\n  width: 14px;\n  height: 14px;\n  background: #fbbd19;\n  border-radius: 50px;\n  position: absolute;\n  top: 8px;\n  left: 8px;\n}\n.bs-wizard > .bs-wizard-step > .progress {\n  position: relative;\n  border-radius: 0px;\n  height: 8px;\n  box-shadow: none;\n  margin: 20px 0;\n}\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {\n  width: 0px;\n  box-shadow: none;\n  background: #fbe8aa;\n}\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {\n  width: 100%;\n}\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {\n  width: 50%;\n}\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {\n  width: 0%;\n}\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {\n  width: 100%;\n}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {\n  background-color: #f5f5f5;\n}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {\n  opacity: 0;\n}\n.bs-wizard > .bs-wizard-step:first-child > .progress {\n  left: 50%;\n  width: 50%;\n}\n.bs-wizard > .bs-wizard-step:last-child > .progress {\n  width: 50%;\n}\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot {\n  pointer-events: none;\n}\n/*END Form Wizard*/\n.left-navblock {\n  display: inline-block;\n  float: left;\n  text-align: left;\n  color: white;\n  padding: 0px;\n  /* adjust based on your layout */\n}\n.skin-blue .main-header .navbar .dropdown-menu li a {\n  color: #333;\n}\na.logo.no-hover a:hover {\n  background-color: transparent;\n}\n.required {\n  border-right: 6px solid orange;\n}\n","/* WRENCHING */\n@-moz-keyframes wrench {\n    0% {\n        -moz-transform: rotate(-12deg)\n    }\n\n    8% {\n        -moz-transform: rotate(12deg)\n    }\n\n    10% {\n        -moz-transform: rotate(24deg)\n    }\n\n    18% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    20% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    28% {\n        -moz-transform: rotate(24deg)\n    }\n\n    30% {\n        -moz-transform: rotate(24deg)\n    }\n\n    38% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    40% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    48% {\n        -moz-transform: rotate(24deg)\n    }\n\n    50% {\n        -moz-transform: rotate(24deg)\n    }\n\n    58% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    60% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    68% {\n        -moz-transform: rotate(24deg)\n    }\n\n    75% {\n        -moz-transform: rotate(0deg)\n    }\n}\n\n@-webkit-keyframes wrench {\n    0% {\n        -webkit-transform: rotate(-12deg)\n    }\n\n    8% {\n        -webkit-transform: rotate(12deg)\n    }\n\n    10% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    18% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    20% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    28% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    30% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    38% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    40% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    48% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    50% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    58% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    60% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    68% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    75% {\n        -webkit-transform: rotate(0deg)\n    }\n}\n\n@-o-keyframes wrench {\n    0% {\n        -o-transform: rotate(-12deg)\n    }\n\n    8% {\n        -o-transform: rotate(12deg)\n    }\n\n    10% {\n        -o-transform: rotate(24deg)\n    }\n\n    18% {\n        -o-transform: rotate(-24deg)\n    }\n\n    20% {\n        -o-transform: rotate(-24deg)\n    }\n\n    28% {\n        -o-transform: rotate(24deg)\n    }\n\n    30% {\n        -o-transform: rotate(24deg)\n    }\n\n    38% {\n        -o-transform: rotate(-24deg)\n    }\n\n    40% {\n        -o-transform: rotate(-24deg)\n    }\n\n    48% {\n        -o-transform: rotate(24deg)\n    }\n\n    50% {\n        -o-transform: rotate(24deg)\n    }\n\n    58% {\n        -o-transform: rotate(-24deg)\n    }\n\n    60% {\n        -o-transform: rotate(-24deg)\n    }\n\n    68% {\n        -o-transform: rotate(24deg)\n    }\n\n    75% {\n        -o-transform: rotate(0deg)\n    }\n}\n\n@-ms-keyframes wrench {\n    0% {\n        -ms-transform: rotate(-12deg)\n    }\n\n    8% {\n        -ms-transform: rotate(12deg)\n    }\n\n    10% {\n        -ms-transform: rotate(24deg)\n    }\n\n    18% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    20% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    28% {\n        -ms-transform: rotate(24deg)\n    }\n\n    30% {\n        -ms-transform: rotate(24deg)\n    }\n\n    38% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    40% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    48% {\n        -ms-transform: rotate(24deg)\n    }\n\n    50% {\n        -ms-transform: rotate(24deg)\n    }\n\n    58% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    60% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    68% {\n        -ms-transform: rotate(24deg)\n    }\n\n    75% {\n        -ms-transform: rotate(0deg)\n    }\n}\n\n@keyframes wrench {\n    0% {\n        transform: rotate(-12deg)\n    }\n\n    8% {\n        transform: rotate(12deg)\n    }\n\n    10% {\n        transform: rotate(24deg)\n    }\n\n    18% {\n        transform: rotate(-24deg)\n    }\n\n    20% {\n        transform: rotate(-24deg)\n    }\n\n    28% {\n        transform: rotate(24deg)\n    }\n\n    30% {\n        transform: rotate(24deg)\n    }\n\n    38% {\n        transform: rotate(-24deg)\n    }\n\n    40% {\n        transform: rotate(-24deg)\n    }\n\n    48% {\n        transform: rotate(24deg)\n    }\n\n    50% {\n        transform: rotate(24deg)\n    }\n\n    58% {\n        transform: rotate(-24deg)\n    }\n\n    60% {\n        transform: rotate(-24deg)\n    }\n\n    68% {\n        transform: rotate(24deg)\n    }\n\n    75% {\n        transform: rotate(0deg)\n    }\n}\n\n.faa-wrench.animated, .faa-wrench.animated-hover:hover {\n    -moz-animation: wrench 2.5s ease infinite;\n    -moz-transform-origin-x: 90%;\n    -moz-transform-origin-y: 35%;\n    -moz-transform-origin-z: initial;\n\n    -webkit-animation: wrench 2.5s ease infinite;\n    -webkit-transform-origin-x: 90%;\n    -webkit-transform-origin-y: 35%;\n    -webkit-transform-origin-z: initial;\n\n    -ms-animation: wrench 2.5s ease infinite;\n    -ms-transform-origin-x: 90%;\n    -ms-transform-origin-y: 35%;\n    -ms-transform-origin-z: initial;\n\n    animation: wrench 2.5s ease infinite;\n    transform-origin-x: 90%;\n    transform-origin-y: 35%;\n    transform-origin-z: initial;\n}\n\n/* BELL */\n@-moz-keyframes ring {\n    0% {\n        -moz-transform: rotate(-15deg)\n    }\n\n    2% {\n        -moz-transform: rotate(15deg)\n    }\n\n    4% {\n        -moz-transform: rotate(-18deg)\n    }\n\n    6% {\n        -moz-transform: rotate(18deg)\n    }\n\n    8% {\n        -moz-transform: rotate(-22deg)\n    }\n\n    10% {\n        -moz-transform: rotate(22deg)\n    }\n\n    12% {\n        -moz-transform: rotate(-18deg)\n    }\n\n    14% {\n        -moz-transform: rotate(18deg)\n    }\n\n    16% {\n        -moz-transform: rotate(-12deg)\n    }\n\n    18% {\n        -moz-transform: rotate(12deg)\n    }\n\n    20% {\n        -moz-transform: rotate(0deg)\n    }\n}\n\n@-webkit-keyframes ring {\n    0% {\n        -webkit-transform: rotate(-15deg)\n    }\n\n    2% {\n        -webkit-transform: rotate(15deg)\n    }\n\n    4% {\n        -webkit-transform: rotate(-18deg)\n    }\n\n    6% {\n        -webkit-transform: rotate(18deg)\n    }\n\n    8% {\n        -webkit-transform: rotate(-22deg)\n    }\n\n    10% {\n        -webkit-transform: rotate(22deg)\n    }\n\n    12% {\n        -webkit-transform: rotate(-18deg)\n    }\n\n    14% {\n        -webkit-transform: rotate(18deg)\n    }\n\n    16% {\n        -webkit-transform: rotate(-12deg)\n    }\n\n    18% {\n        -webkit-transform: rotate(12deg)\n    }\n\n    20% {\n        -webkit-transform: rotate(0deg)\n    }\n}\n\n@-ms-keyframes ring {\n    0% {\n        -ms-transform: rotate(-15deg)\n    }\n\n    2% {\n        -ms-transform: rotate(15deg)\n    }\n\n    4% {\n        -ms-transform: rotate(-18deg)\n    }\n\n    6% {\n        -ms-transform: rotate(18deg)\n    }\n\n    8% {\n        -ms-transform: rotate(-22deg)\n    }\n\n    10% {\n        -ms-transform: rotate(22deg)\n    }\n\n    12% {\n        -ms-transform: rotate(-18deg)\n    }\n\n    14% {\n        -ms-transform: rotate(18deg)\n    }\n\n    16% {\n        -ms-transform: rotate(-12deg)\n    }\n\n    18% {\n        -ms-transform: rotate(12deg)\n    }\n\n    20% {\n        -ms-transform: rotate(0deg)\n    }\n}\n\n@keyframes ring {\n    0% {\n        transform: rotate(-15deg)\n    }\n\n    2% {\n        transform: rotate(15deg)\n    }\n\n    4% {\n        transform: rotate(-18deg)\n    }\n\n    6% {\n        transform: rotate(18deg)\n    }\n\n    8% {\n        transform: rotate(-22deg)\n    }\n\n    10% {\n        transform: rotate(22deg)\n    }\n\n    12% {\n        transform: rotate(-18deg)\n    }\n\n    14% {\n        transform: rotate(18deg)\n    }\n\n    16% {\n        transform: rotate(-12deg)\n    }\n\n    18% {\n        transform: rotate(12deg)\n    }\n\n    20% {\n        transform: rotate(0deg)\n    }\n}\n\n.faa-ring.animated, .faa-ring.animated-hover:hover {\n    -moz-animation: ring 2s ease infinite;\n    -moz-transform-origin-x: 50%;\n    -moz-transform-origin-y: 0px;\n    -moz-transform-origin-z: initial;\n\n    -webkit-animation: ring 2s ease infinite;\n    -webkit-transform-origin-x: 50%;\n    -webkit-transform-origin-y: 0px;\n    -webkit-transform-origin-z: initial;\n\n    -ms-animation: ring 2s ease infinite;\n    -ms-transform-origin-x: 50%;\n    -ms-transform-origin-y: 0px;\n    -ms-transform-origin-z: initial;\n\n    animation: ring 2s ease infinite;\n    transform-origin-x: 50%;\n    transform-origin-y: 0px;\n    transform-origin-z: initial;\n}\n\n/* VERTICAL */\n@-moz-keyframes vertical {\n    0% {\n        -moz-transform: translate(0, -3px)\n    }\n\n    4% {\n        -moz-transform: translate(0, 3px)\n    }\n\n    8% {\n        -moz-transform: translate(0, -3px)\n    }\n\n    12% {\n        -moz-transform: translate(0, 3px)\n    }\n\n    16% {\n        -moz-transform: translate(0, -3px)\n    }\n\n    20% {\n        -moz-transform: translate(0, 3px)\n    }\n\n    22% {\n        -moz-transform: translate(0, 0)\n    }\n}\n\n@-webkit-keyframes vertical {\n    0% {\n        -webkit-transform: translate(0, -3px)\n    }\n\n    4% {\n        -webkit-transform: translate(0, 3px)\n    }\n\n    8% {\n        -webkit-transform: translate(0, -3px)\n    }\n\n    12% {\n        -webkit-transform: translate(0, 3px)\n    }\n\n    16% {\n        -webkit-transform: translate(0, -3px)\n    }\n\n    20% {\n        -webkit-transform: translate(0, 3px)\n    }\n\n    22% {\n        -webkit-transform: translate(0, 0)\n    }\n}\n\n@-ms-keyframes vertical {\n    0% {\n        -ms-transform: translate(0, -3px)\n    }\n\n    4% {\n        -ms-transform: translate(0, 3px)\n    }\n\n    8% {\n        -ms-transform: translate(0, -3px)\n    }\n\n    12% {\n        -ms-transform: translate(0, 3px)\n    }\n\n    16% {\n        -ms-transform: translate(0, -3px)\n    }\n\n    20% {\n        -ms-transform: translate(0, 3px)\n    }\n\n    22% {\n        -ms-transform: translate(0, 0)\n    }\n}\n\n@keyframes vertical {\n    0% {\n        transform: translate(0, -3px)\n    }\n\n    4% {\n        transform: translate(0, 3px)\n    }\n\n    8% {\n        transform: translate(0, -3px)\n    }\n\n    12% {\n        transform: translate(0, 3px)\n    }\n\n    16% {\n        transform: translate(0, -3px)\n    }\n\n    20% {\n        transform: translate(0, 3px)\n    }\n\n    22% {\n        transform: translate(0, 0)\n    }\n}\n\n.faa-vertical.animated, .faa-vertical.animated-hover:hover {\n    -moz-animation: vertical 2s ease infinite;\n    -webkit-animation: vertical 2s ease infinite;\n    -ms-animation: vertical 2s ease infinite;\n    animation: vertical 2s ease infinite;\n}\n\n/* HORIZONTAL */\n@-moz-keyframes horizontal {\n    0% {\n        -moz-transform: translate(0, 0)\n    }\n\n    6% {\n        -moz-transform: translate(5px, 0)\n    }\n\n    12% {\n        -moz-transform: translate(0, 0)\n    }\n\n    18% {\n        -moz-transform: translate(5px, 0)\n    }\n\n    24% {\n        -moz-transform: translate(0, 0)\n    }\n\n    30% {\n        -moz-transform: translate(5px, 0)\n    }\n\n    36% {\n        -moz-transform: translate(0, 0)\n    }\n}\n\n@-webkit-keyframes horizontal {\n    0% {\n        -webkit-transform: translate(0, 0)\n    }\n\n    6% {\n        -webkit-transform: translate(5px, 0)\n    }\n\n    12% {\n        -webkit-transform: translate(0, 0)\n    }\n\n    18% {\n        -webkit-transform: translate(5px, 0)\n    }\n\n    24% {\n        -webkit-transform: translate(0, 0)\n    }\n\n    30% {\n        -webkit-transform: translate(5px, 0)\n    }\n\n    36% {\n        -webkit-transform: translate(0, 0)\n    }\n}\n\n@-ms-keyframes horizontal {\n    0% {\n        -ms-transform: translate(0, 0)\n    }\n\n    6% {\n        -ms-transform: translate(5px, 0)\n    }\n\n    12% {\n        -ms-transform: translate(0, 0)\n    }\n\n    18% {\n        -ms-transform: translate(5px, 0)\n    }\n\n    24% {\n        -ms-transform: translate(0, 0)\n    }\n\n    30% {\n        -ms-transform: translate(5px, 0)\n    }\n\n    36% {\n        -ms-transform: translate(0, 0)\n    }\n}\n\n@keyframes horizontal {\n    0% {\n        transform: translate(0, 0)\n    }\n\n    6% {\n        transform: translate(5px, 0)\n    }\n\n    12% {\n        transform: translate(0, 0)\n    }\n\n    18% {\n        transform: translate(5px, 0)\n    }\n\n    24% {\n        transform: translate(0, 0)\n    }\n\n    30% {\n        transform: translate(5px, 0)\n    }\n\n    36% {\n        transform: translate(0, 0)\n    }\n}\n\n.faa-horizontal.animated, .faa-horizontal.animated-hover:hover {\n    -moz-animation: horizontal 2s ease infinite;\n    -webkit-animation: horizontal 2s ease infinite;\n    -ms-animation: horizontal 2s ease infinite;\n    animation: horizontal 2s ease infinite;\n}\n\n/* FLASHING */\n@-moz-keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n@-webkit-keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n@-ms-keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n@keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n.faa-flash.animated, .faa-flash.animated-hover:hover {\n    -moz-animation: flash 2s ease infinite;\n    -webkit-animation: flash 2s ease infinite;\n    -ms-animation: flash 2s ease infinite;\n    animation: flash 2s ease infinite;\n}\n\n/* BOUNCE */\n@-moz-keyframes bounce {\n    0%, 100%, 20%, 50%, 80% {\n        -moz-transform: translateY(0)\n    }\n\n    40% {\n        -moz-transform: translateY(-15px)\n    }\n\n    60% {\n        -moz-transform: translateY(-15px)\n    }\n}\n\n@-webkit-keyframes bounce {\n    0%, 100%, 20%, 50%, 80% {\n        -webkit-transform: translateY(0)\n    }\n\n    40% {\n        -webkit-transform: translateY(-15px)\n    }\n\n    60% {\n        -webkit-transform: translateY(-15px)\n    }\n}\n\n@-ms-keyframes bounce {\n    0%, 100%, 20%, 50%, 80% {\n        -ms-transform: translateY(0)\n    }\n\n    40% {\n        -ms-transform: translateY(-15px)\n    }\n\n    60% {\n        -ms-transform: translateY(-15px)\n    }\n}\n\n@keyframes bounce {\n    0%, 10%, 20%, 50%, 80% {\n        transform: translateY(0)\n    }\n\n    40% {\n        transform: translateY(-15px)\n    }\n\n    60% {\n        transform: translateY(-15px)\n    }\n}\n\n.faa-bounce.animated, .faa-bounce.animated-hover:hover {\n    -moz-animation: bounce 2s ease infinite;\n    -webkit-animation: bounce 2s ease infinite;\n    -ms-animation: bounce 2s ease infinite;\n    animation: bounce 2s ease infinite;\n}\n\n/* SPIN */\n@-moz-keyframes spin {\n    0% {\n        -moz-transform: rotate(0deg)\n    }\n\n    100% {\n        -moz-transform: rotate(359deg)\n    }\n}\n\n@-webkit-keyframes spin {\n    0% {\n        -webkit-transform: rotate(0deg)\n    }\n\n    100% {\n        -webkit-transform: rotate(359deg)\n    }\n}\n\n@-ms-keyframes spin {\n    0% {\n        -ms-transform: rotate(0deg)\n    }\n\n    100% {\n        -ms-transform: rotate(359deg)\n    }\n}\n\n@keyframes spin {\n    0% {\n        transform: rotate(0deg)\n    }\n\n    100% {\n        transform: rotate(359deg)\n    }\n}\n\n.faa-spin.animated, .faa-spin.animated-hover:hover {\n    -moz-animation: spin 1.5s linear infinite;\n    -webkit-animation: spin 1.5s linear infinite;\n    -ms-animation: spin 1.5s linear infinite;\n    animation: spin 1.5s linear infinite;\n}\n\n/* FLOAT */\n@-moz-keyframes float {\n    0% {\n        -moz-transform: translateY(0)\n    }\n\n    50% {\n        -moz-transform: translateY(-6px)\n    }\n\n    100% {\n        -moz-transform: translateY(0)\n    }\n}\n\n@-webkit-keyframes float {\n    0% {\n        -webkit-transform: translateY(0)\n    }\n\n    50% {\n        -webkit-transform: translateY(-6px)\n    }\n\n    100% {\n        -webkit-transform: translateY(0)\n    }\n}\n\n@-ms-keyframes float {\n    0% {\n        -ms-transform: translateY(0)\n    }\n\n    50% {\n        -ms-transform: translateY(-6px)\n    }\n\n    100% {\n        -ms-transform: translateY(0)\n    }\n}\n\n@keyframes float {\n    0% {\n        transform: translateY(0)\n    }\n\n    50% {\n        transform: translateY(-6px)\n    }\n\n    100% {\n        transform: translateY(0)\n    }\n}\n\n.faa-float.animated, .faa-float.animated-hover:hover {\n    - moz-animation: float 2s linear infinite;\n    -webkit-animation: float 2s linear infinite;\n    -ms-animation: float 2s linear infinite;\n    animation: float 2s linear infinite;\n}\n\n/* PULSE */\n@-moz-keyframes pulse {\n    0% {\n        -moz-transform: scale(1.1)\n    }\n\n    50% {\n        -moz-transform: scale(0.8)\n    }\n\n    100% {\n        -moz-transform: scale(1)\n    }\n}\n\n@-webkit-keyframes pulse {\n    0% {\n        -webkit-transform: scale(1)\n    }\n\n    50% {\n        -webkit-transform: scale(0.8)\n    }\n\n    100% {\n        -webkit-transform: scale(1)\n    }\n}\n\n@-ms-keyframes pulse {\n    0% {\n        -ms-transform: scale(1.1)\n    }\n\n    50% {\n        -ms-transform: scale(0.8)\n    }\n\n    100% {\n        -ms-transform: scale(1)\n    }\n}\n\n@keyframes pulse {\n    0% {\n        transform: scale(1.1)\n    }\n\n    50% {\n        transform: scale(0.8)\n    }\n\n    100% {\n        transform: scale(1)\n    }\n}\n\n.faa-pulse.animated, .faa-pulse.animated-hover:hover {\n    -moz-animation: pulse 2s linear infinite;\n    -webkit-animation: pulse 2s linear infinite;\n    -ms-animation: pulse 2s linear infinite;\n    animation: pulse 2s linear infinite;\n}\n\n/* SHAKE */\n.faa-shake.animated, .faa-shake.animated-hover:hover {\n    -webkit-animation: wrench 2.5s ease infinite;\n}\n\n\n"],"sourceRoot":"/source/"}
        \ No newline at end of file
        diff --git a/public/assets/css/compiled/app.css b/public/assets/css/compiled/app.css
        deleted file mode 100644
        index 62d7d9da68..0000000000
        --- a/public/assets/css/compiled/app.css
        +++ /dev/null
        @@ -1,5753 +0,0 @@
        -@charset "UTF-8";
        -@import url(https://fonts.googleapis.com/css?family=Lato);
        -/*!
        - * Bootstrap v3.3.6 (http://getbootstrap.com)
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - */
        -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
        -html {
        -  font-family: sans-serif;
        -  -ms-text-size-adjust: 100%;
        -  -webkit-text-size-adjust: 100%; }
        -
        -body {
        -  margin: 0; }
        -
        -article,
        -aside,
        -details,
        -figcaption,
        -figure,
        -footer,
        -header,
        -hgroup,
        -main,
        -menu,
        -nav,
        -section,
        -summary {
        -  display: block; }
        -
        -audio,
        -canvas,
        -progress,
        -video {
        -  display: inline-block;
        -  vertical-align: baseline; }
        -
        -audio:not([controls]) {
        -  display: none;
        -  height: 0; }
        -
        -[hidden],
        -template {
        -  display: none; }
        -
        -a {
        -  background-color: transparent; }
        -
        -a:active,
        -a:hover {
        -  outline: 0; }
        -
        -abbr[title] {
        -  border-bottom: 1px dotted; }
        -
        -b,
        -strong {
        -  font-weight: bold; }
        -
        -dfn {
        -  font-style: italic; }
        -
        -h1 {
        -  font-size: 2em;
        -  margin: 0.67em 0; }
        -
        -mark {
        -  background: #ff0;
        -  color: #000; }
        -
        -small {
        -  font-size: 80%; }
        -
        -sub,
        -sup {
        -  font-size: 75%;
        -  line-height: 0;
        -  position: relative;
        -  vertical-align: baseline; }
        -
        -sup {
        -  top: -0.5em; }
        -
        -sub {
        -  bottom: -0.25em; }
        -
        -img {
        -  border: 0; }
        -
        -svg:not(:root) {
        -  overflow: hidden; }
        -
        -figure {
        -  margin: 1em 40px; }
        -
        -hr {
        -  box-sizing: content-box;
        -  height: 0; }
        -
        -pre {
        -  overflow: auto; }
        -
        -code,
        -kbd,
        -pre,
        -samp {
        -  font-family: monospace, monospace;
        -  font-size: 1em; }
        -
        -button,
        -input,
        -optgroup,
        -select,
        -textarea {
        -  color: inherit;
        -  font: inherit;
        -  margin: 0; }
        -
        -button {
        -  overflow: visible; }
        -
        -button,
        -select {
        -  text-transform: none; }
        -
        -button,
        -html input[type="button"],
        -input[type="reset"],
        -input[type="submit"] {
        -  -webkit-appearance: button;
        -  cursor: pointer; }
        -
        -button[disabled],
        -html input[disabled] {
        -  cursor: default; }
        -
        -button::-moz-focus-inner,
        -input::-moz-focus-inner {
        -  border: 0;
        -  padding: 0; }
        -
        -input {
        -  line-height: normal; }
        -
        -input[type="checkbox"],
        -input[type="radio"] {
        -  box-sizing: border-box;
        -  padding: 0; }
        -
        -input[type="number"]::-webkit-inner-spin-button,
        -input[type="number"]::-webkit-outer-spin-button {
        -  height: auto; }
        -
        -input[type="search"] {
        -  -webkit-appearance: textfield;
        -  box-sizing: content-box; }
        -
        -input[type="search"]::-webkit-search-cancel-button,
        -input[type="search"]::-webkit-search-decoration {
        -  -webkit-appearance: none; }
        -
        -fieldset {
        -  border: 1px solid #c0c0c0;
        -  margin: 0 2px;
        -  padding: 0.35em 0.625em 0.75em; }
        -
        -legend {
        -  border: 0;
        -  padding: 0; }
        -
        -textarea {
        -  overflow: auto; }
        -
        -optgroup {
        -  font-weight: bold; }
        -
        -table {
        -  border-collapse: collapse;
        -  border-spacing: 0; }
        -
        -td,
        -th {
        -  padding: 0; }
        -
        -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
        -@media print {
        -  *,
        -  *:before,
        -  *:after {
        -    background: transparent !important;
        -    color: #000 !important;
        -    box-shadow: none !important;
        -    text-shadow: none !important; }
        -  a,
        -  a:visited {
        -    text-decoration: underline; }
        -  a[href]:after {
        -    content: " (" attr(href) ")"; }
        -  abbr[title]:after {
        -    content: " (" attr(title) ")"; }
        -  a[href^="#"]:after,
        -  a[href^="javascript:"]: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; }
        -  p,
        -  h2,
        -  h3 {
        -    orphans: 3;
        -    widows: 3; }
        -  h2,
        -  h3 {
        -    page-break-after: avoid; }
        -  .navbar {
        -    display: none; }
        -  .btn > .caret,
        -  .dropup > .btn > .caret {
        -    border-top-color: #000 !important; }
        -  .label {
        -    border: 1px solid #000; }
        -  .table {
        -    border-collapse: collapse !important; }
        -    .table td,
        -    .table th {
        -      background-color: #fff !important; }
        -  .table-bordered th,
        -  .table-bordered td {
        -    border: 1px solid #ddd !important; } }
        -
        -@font-face {
        -  font-family: 'Glyphicons Halflings';
        -  src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot");
        -  src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); }
        -
        -.glyphicon {
        -  position: relative;
        -  top: 1px;
        -  display: inline-block;
        -  font-family: 'Glyphicons Halflings';
        -  font-style: normal;
        -  font-weight: normal;
        -  line-height: 1;
        -  -webkit-font-smoothing: antialiased;
        -  -moz-osx-font-smoothing: grayscale; }
        -
        -.glyphicon-asterisk:before {
        -  content: "\002a"; }
        -
        -.glyphicon-plus:before {
        -  content: "\002b"; }
        -
        -.glyphicon-euro:before,
        -.glyphicon-eur: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"; }
        -
        -.glyphicon-cd:before {
        -  content: "\e201"; }
        -
        -.glyphicon-save-file:before {
        -  content: "\e202"; }
        -
        -.glyphicon-open-file:before {
        -  content: "\e203"; }
        -
        -.glyphicon-level-up:before {
        -  content: "\e204"; }
        -
        -.glyphicon-copy:before {
        -  content: "\e205"; }
        -
        -.glyphicon-paste:before {
        -  content: "\e206"; }
        -
        -.glyphicon-alert:before {
        -  content: "\e209"; }
        -
        -.glyphicon-equalizer:before {
        -  content: "\e210"; }
        -
        -.glyphicon-king:before {
        -  content: "\e211"; }
        -
        -.glyphicon-queen:before {
        -  content: "\e212"; }
        -
        -.glyphicon-pawn:before {
        -  content: "\e213"; }
        -
        -.glyphicon-bishop:before {
        -  content: "\e214"; }
        -
        -.glyphicon-knight:before {
        -  content: "\e215"; }
        -
        -.glyphicon-baby-formula:before {
        -  content: "\e216"; }
        -
        -.glyphicon-tent:before {
        -  content: "\26fa"; }
        -
        -.glyphicon-blackboard:before {
        -  content: "\e218"; }
        -
        -.glyphicon-bed:before {
        -  content: "\e219"; }
        -
        -.glyphicon-apple:before {
        -  content: "\f8ff"; }
        -
        -.glyphicon-erase:before {
        -  content: "\e221"; }
        -
        -.glyphicon-hourglass:before {
        -  content: "\231b"; }
        -
        -.glyphicon-lamp:before {
        -  content: "\e223"; }
        -
        -.glyphicon-duplicate:before {
        -  content: "\e224"; }
        -
        -.glyphicon-piggy-bank:before {
        -  content: "\e225"; }
        -
        -.glyphicon-scissors:before {
        -  content: "\e226"; }
        -
        -.glyphicon-bitcoin:before {
        -  content: "\e227"; }
        -
        -.glyphicon-btc:before {
        -  content: "\e227"; }
        -
        -.glyphicon-xbt:before {
        -  content: "\e227"; }
        -
        -.glyphicon-yen:before {
        -  content: "\00a5"; }
        -
        -.glyphicon-jpy:before {
        -  content: "\00a5"; }
        -
        -.glyphicon-ruble:before {
        -  content: "\20bd"; }
        -
        -.glyphicon-rub:before {
        -  content: "\20bd"; }
        -
        -.glyphicon-scale:before {
        -  content: "\e230"; }
        -
        -.glyphicon-ice-lolly:before {
        -  content: "\e231"; }
        -
        -.glyphicon-ice-lolly-tasted:before {
        -  content: "\e232"; }
        -
        -.glyphicon-education:before {
        -  content: "\e233"; }
        -
        -.glyphicon-option-horizontal:before {
        -  content: "\e234"; }
        -
        -.glyphicon-option-vertical:before {
        -  content: "\e235"; }
        -
        -.glyphicon-menu-hamburger:before {
        -  content: "\e236"; }
        -
        -.glyphicon-modal-window:before {
        -  content: "\e237"; }
        -
        -.glyphicon-oil:before {
        -  content: "\e238"; }
        -
        -.glyphicon-grain:before {
        -  content: "\e239"; }
        -
        -.glyphicon-sunglasses:before {
        -  content: "\e240"; }
        -
        -.glyphicon-text-size:before {
        -  content: "\e241"; }
        -
        -.glyphicon-text-color:before {
        -  content: "\e242"; }
        -
        -.glyphicon-text-background:before {
        -  content: "\e243"; }
        -
        -.glyphicon-object-align-top:before {
        -  content: "\e244"; }
        -
        -.glyphicon-object-align-bottom:before {
        -  content: "\e245"; }
        -
        -.glyphicon-object-align-horizontal:before {
        -  content: "\e246"; }
        -
        -.glyphicon-object-align-left:before {
        -  content: "\e247"; }
        -
        -.glyphicon-object-align-vertical:before {
        -  content: "\e248"; }
        -
        -.glyphicon-object-align-right:before {
        -  content: "\e249"; }
        -
        -.glyphicon-triangle-right:before {
        -  content: "\e250"; }
        -
        -.glyphicon-triangle-left:before {
        -  content: "\e251"; }
        -
        -.glyphicon-triangle-bottom:before {
        -  content: "\e252"; }
        -
        -.glyphicon-triangle-top:before {
        -  content: "\e253"; }
        -
        -.glyphicon-console:before {
        -  content: "\e254"; }
        -
        -.glyphicon-superscript:before {
        -  content: "\e255"; }
        -
        -.glyphicon-subscript:before {
        -  content: "\e256"; }
        -
        -.glyphicon-menu-left:before {
        -  content: "\e257"; }
        -
        -.glyphicon-menu-right:before {
        -  content: "\e258"; }
        -
        -.glyphicon-menu-down:before {
        -  content: "\e259"; }
        -
        -.glyphicon-menu-up:before {
        -  content: "\e260"; }
        -
        -* {
        -  box-sizing: border-box; }
        -
        -*:before,
        -*:after {
        -  box-sizing: border-box; }
        -
        -html {
        -  font-size: 10px;
        -  -webkit-tap-highlight-color: transparent; }
        -
        -body {
        -  font-family: "Lato", sans-serif;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #333333;
        -  background-color: #fff; }
        -
        -input,
        -button,
        -select,
        -textarea {
        -  font-family: inherit;
        -  font-size: inherit;
        -  line-height: inherit; }
        -
        -a {
        -  color: #337ab7;
        -  text-decoration: none; }
        -  a:hover, a:focus {
        -    color: #23527c;
        -    text-decoration: underline; }
        -  a:focus {
        -    outline: thin dotted;
        -    outline: 5px auto -webkit-focus-ring-color;
        -    outline-offset: -2px; }
        -
        -figure {
        -  margin: 0; }
        -
        -img {
        -  vertical-align: middle; }
        -
        -.img-responsive {
        -  display: block;
        -  max-width: 100%;
        -  height: auto; }
        -
        -.img-rounded {
        -  border-radius: 6px; }
        -
        -.img-thumbnail {
        -  padding: 4px;
        -  line-height: 1.428571429;
        -  background-color: #fff;
        -  border: 1px solid #ddd;
        -  border-radius: 4px;
        -  transition: all 0.2s ease-in-out;
        -  display: inline-block;
        -  max-width: 100%;
        -  height: auto; }
        -
        -.img-circle {
        -  border-radius: 50%; }
        -
        -hr {
        -  margin-top: 20px;
        -  margin-bottom: 20px;
        -  border: 0;
        -  border-top: 1px solid #eeeeee; }
        -
        -.sr-only {
        -  position: absolute;
        -  width: 1px;
        -  height: 1px;
        -  margin: -1px;
        -  padding: 0;
        -  overflow: hidden;
        -  clip: rect(0, 0, 0, 0);
        -  border: 0; }
        -
        -.sr-only-focusable:active, .sr-only-focusable:focus {
        -  position: static;
        -  width: auto;
        -  height: auto;
        -  margin: 0;
        -  overflow: visible;
        -  clip: auto; }
        -
        -[role="button"] {
        -  cursor: pointer; }
        -
        -h1, h2, h3, h4, h5, h6,
        -.h1, .h2, .h3, .h4, .h5, .h6 {
        -  font-family: inherit;
        -  font-weight: 500;
        -  line-height: 1.1;
        -  color: inherit; }
        -  h1 small,
        -  h1 .small, h2 small,
        -  h2 .small, h3 small,
        -  h3 .small, h4 small,
        -  h4 .small, h5 small,
        -  h5 .small, h6 small,
        -  h6 .small,
        -  .h1 small,
        -  .h1 .small, .h2 small,
        -  .h2 .small, .h3 small,
        -  .h3 .small, .h4 small,
        -  .h4 .small, .h5 small,
        -  .h5 .small, .h6 small,
        -  .h6 .small {
        -    font-weight: normal;
        -    line-height: 1;
        -    color: #777777; }
        -
        -h1, .h1,
        -h2, .h2,
        -h3, .h3 {
        -  margin-top: 20px;
        -  margin-bottom: 10px; }
        -  h1 small,
        -  h1 .small, .h1 small,
        -  .h1 .small,
        -  h2 small,
        -  h2 .small, .h2 small,
        -  .h2 .small,
        -  h3 small,
        -  h3 .small, .h3 small,
        -  .h3 .small {
        -    font-size: 65%; }
        -
        -h4, .h4,
        -h5, .h5,
        -h6, .h6 {
        -  margin-top: 10px;
        -  margin-bottom: 10px; }
        -  h4 small,
        -  h4 .small, .h4 small,
        -  .h4 .small,
        -  h5 small,
        -  h5 .small, .h5 small,
        -  .h5 .small,
        -  h6 small,
        -  h6 .small, .h6 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: 300;
        -  line-height: 1.4; }
        -  @media (min-width: 768px) {
        -    .lead {
        -      font-size: 21px; } }
        -
        -small,
        -.small {
        -  font-size: 85%; }
        -
        -mark,
        -.mark {
        -  background-color: #fcf8e3;
        -  padding: .2em; }
        -
        -.text-left {
        -  text-align: left; }
        -
        -.text-right {
        -  text-align: right; }
        -
        -.text-center {
        -  text-align: center; }
        -
        -.text-justify {
        -  text-align: justify; }
        -
        -.text-nowrap {
        -  white-space: nowrap; }
        -
        -.text-lowercase {
        -  text-transform: lowercase; }
        -
        -.text-uppercase, .initialism {
        -  text-transform: uppercase; }
        -
        -.text-capitalize {
        -  text-transform: capitalize; }
        -
        -.text-muted {
        -  color: #777777; }
        -
        -.text-primary {
        -  color: #337ab7; }
        -
        -a.text-primary:hover,
        -a.text-primary:focus {
        -  color: #286090; }
        -
        -.text-success {
        -  color: #3c763d; }
        -
        -a.text-success:hover,
        -a.text-success:focus {
        -  color: #2b542c; }
        -
        -.text-info {
        -  color: #31708f; }
        -
        -a.text-info:hover,
        -a.text-info:focus {
        -  color: #245269; }
        -
        -.text-warning {
        -  color: #8a6d3b; }
        -
        -a.text-warning:hover,
        -a.text-warning:focus {
        -  color: #66512c; }
        -
        -.text-danger {
        -  color: #a94442; }
        -
        -a.text-danger:hover,
        -a.text-danger:focus {
        -  color: #843534; }
        -
        -.bg-primary {
        -  color: #fff; }
        -
        -.bg-primary {
        -  background-color: #337ab7; }
        -
        -a.bg-primary:hover,
        -a.bg-primary:focus {
        -  background-color: #286090; }
        -
        -.bg-success {
        -  background-color: #dff0d8; }
        -
        -a.bg-success:hover,
        -a.bg-success:focus {
        -  background-color: #c1e2b3; }
        -
        -.bg-info {
        -  background-color: #d9edf7; }
        -
        -a.bg-info:hover,
        -a.bg-info:focus {
        -  background-color: #afd9ee; }
        -
        -.bg-warning {
        -  background-color: #fcf8e3; }
        -
        -a.bg-warning:hover,
        -a.bg-warning:focus {
        -  background-color: #f7ecb5; }
        -
        -.bg-danger {
        -  background-color: #f2dede; }
        -
        -a.bg-danger:hover,
        -a.bg-danger:focus {
        -  background-color: #e4b9b9; }
        -
        -.page-header {
        -  padding-bottom: 9px;
        -  margin: 40px 0 20px;
        -  border-bottom: 1px solid #eeeeee; }
        -
        -ul,
        -ol {
        -  margin-top: 0;
        -  margin-bottom: 10px; }
        -  ul ul,
        -  ul ol,
        -  ol ul,
        -  ol ol {
        -    margin-bottom: 0; }
        -
        -.list-unstyled {
        -  padding-left: 0;
        -  list-style: none; }
        -
        -.list-inline {
        -  padding-left: 0;
        -  list-style: none;
        -  margin-left: -5px; }
        -  .list-inline > li {
        -    display: inline-block;
        -    padding-left: 5px;
        -    padding-right: 5px; }
        -
        -dl {
        -  margin-top: 0;
        -  margin-bottom: 20px; }
        -
        -dt,
        -dd {
        -  line-height: 1.428571429; }
        -
        -dt {
        -  font-weight: bold; }
        -
        -dd {
        -  margin-left: 0; }
        -
        -.dl-horizontal dd:before, .dl-horizontal dd:after {
        -  content: " ";
        -  display: table; }
        -
        -.dl-horizontal dd:after {
        -  clear: both; }
        -
        -@media (min-width: 768px) {
        -  .dl-horizontal dt {
        -    float: left;
        -    width: 160px;
        -    clear: left;
        -    text-align: right;
        -    overflow: hidden;
        -    text-overflow: ellipsis;
        -    white-space: nowrap; }
        -  .dl-horizontal dd {
        -    margin-left: 180px; } }
        -
        -abbr[title],
        -abbr[data-original-title] {
        -  cursor: help;
        -  border-bottom: 1px dotted #777777; }
        -
        -.initialism {
        -  font-size: 90%; }
        -
        -blockquote {
        -  padding: 10px 20px;
        -  margin: 0 0 20px;
        -  font-size: 17.5px;
        -  border-left: 5px solid #eeeeee; }
        -  blockquote p:last-child,
        -  blockquote ul:last-child,
        -  blockquote ol:last-child {
        -    margin-bottom: 0; }
        -  blockquote footer,
        -  blockquote small,
        -  blockquote .small {
        -    display: block;
        -    font-size: 80%;
        -    line-height: 1.428571429;
        -    color: #777777; }
        -    blockquote footer:before,
        -    blockquote small:before,
        -    blockquote .small:before {
        -      content: '\2014 \00A0'; }
        -
        -.blockquote-reverse,
        -blockquote.pull-right {
        -  padding-right: 15px;
        -  padding-left: 0;
        -  border-right: 5px solid #eeeeee;
        -  border-left: 0;
        -  text-align: right; }
        -  .blockquote-reverse footer:before,
        -  .blockquote-reverse small:before,
        -  .blockquote-reverse .small:before,
        -  blockquote.pull-right footer:before,
        -  blockquote.pull-right small:before,
        -  blockquote.pull-right .small:before {
        -    content: ''; }
        -  .blockquote-reverse footer:after,
        -  .blockquote-reverse small:after,
        -  .blockquote-reverse .small:after,
        -  blockquote.pull-right footer:after,
        -  blockquote.pull-right small:after,
        -  blockquote.pull-right .small:after {
        -    content: '\00A0 \2014'; }
        -
        -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;
        -  background-color: #f9f2f4;
        -  border-radius: 4px; }
        -
        -kbd {
        -  padding: 2px 4px;
        -  font-size: 90%;
        -  color: #fff;
        -  background-color: #333;
        -  border-radius: 3px;
        -  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }
        -  kbd kbd {
        -    padding: 0;
        -    font-size: 100%;
        -    font-weight: bold;
        -    box-shadow: none; }
        -
        -pre {
        -  display: block;
        -  padding: 9.5px;
        -  margin: 0 0 10px;
        -  font-size: 13px;
        -  line-height: 1.428571429;
        -  word-break: break-all;
        -  word-wrap: break-word;
        -  color: #333333;
        -  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 {
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px; }
        -  .container:before, .container:after {
        -    content: " ";
        -    display: table; }
        -  .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; } }
        -
        -.container-fluid {
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px; }
        -  .container-fluid:before, .container-fluid:after {
        -    content: " ";
        -    display: table; }
        -  .container-fluid:after {
        -    clear: both; }
        -
        -.row {
        -  margin-left: -15px;
        -  margin-right: -15px; }
        -  .row:before, .row:after {
        -    content: " ";
        -    display: table; }
        -  .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-left: 15px;
        -  padding-right: 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-1 {
        -  width: 8.3333333333%; }
        -
        -.col-xs-2 {
        -  width: 16.6666666667%; }
        -
        -.col-xs-3 {
        -  width: 25%; }
        -
        -.col-xs-4 {
        -  width: 33.3333333333%; }
        -
        -.col-xs-5 {
        -  width: 41.6666666667%; }
        -
        -.col-xs-6 {
        -  width: 50%; }
        -
        -.col-xs-7 {
        -  width: 58.3333333333%; }
        -
        -.col-xs-8 {
        -  width: 66.6666666667%; }
        -
        -.col-xs-9 {
        -  width: 75%; }
        -
        -.col-xs-10 {
        -  width: 83.3333333333%; }
        -
        -.col-xs-11 {
        -  width: 91.6666666667%; }
        -
        -.col-xs-12 {
        -  width: 100%; }
        -
        -.col-xs-pull-0 {
        -  right: auto; }
        -
        -.col-xs-pull-1 {
        -  right: 8.3333333333%; }
        -
        -.col-xs-pull-2 {
        -  right: 16.6666666667%; }
        -
        -.col-xs-pull-3 {
        -  right: 25%; }
        -
        -.col-xs-pull-4 {
        -  right: 33.3333333333%; }
        -
        -.col-xs-pull-5 {
        -  right: 41.6666666667%; }
        -
        -.col-xs-pull-6 {
        -  right: 50%; }
        -
        -.col-xs-pull-7 {
        -  right: 58.3333333333%; }
        -
        -.col-xs-pull-8 {
        -  right: 66.6666666667%; }
        -
        -.col-xs-pull-9 {
        -  right: 75%; }
        -
        -.col-xs-pull-10 {
        -  right: 83.3333333333%; }
        -
        -.col-xs-pull-11 {
        -  right: 91.6666666667%; }
        -
        -.col-xs-pull-12 {
        -  right: 100%; }
        -
        -.col-xs-push-0 {
        -  left: auto; }
        -
        -.col-xs-push-1 {
        -  left: 8.3333333333%; }
        -
        -.col-xs-push-2 {
        -  left: 16.6666666667%; }
        -
        -.col-xs-push-3 {
        -  left: 25%; }
        -
        -.col-xs-push-4 {
        -  left: 33.3333333333%; }
        -
        -.col-xs-push-5 {
        -  left: 41.6666666667%; }
        -
        -.col-xs-push-6 {
        -  left: 50%; }
        -
        -.col-xs-push-7 {
        -  left: 58.3333333333%; }
        -
        -.col-xs-push-8 {
        -  left: 66.6666666667%; }
        -
        -.col-xs-push-9 {
        -  left: 75%; }
        -
        -.col-xs-push-10 {
        -  left: 83.3333333333%; }
        -
        -.col-xs-push-11 {
        -  left: 91.6666666667%; }
        -
        -.col-xs-push-12 {
        -  left: 100%; }
        -
        -.col-xs-offset-0 {
        -  margin-left: 0%; }
        -
        -.col-xs-offset-1 {
        -  margin-left: 8.3333333333%; }
        -
        -.col-xs-offset-2 {
        -  margin-left: 16.6666666667%; }
        -
        -.col-xs-offset-3 {
        -  margin-left: 25%; }
        -
        -.col-xs-offset-4 {
        -  margin-left: 33.3333333333%; }
        -
        -.col-xs-offset-5 {
        -  margin-left: 41.6666666667%; }
        -
        -.col-xs-offset-6 {
        -  margin-left: 50%; }
        -
        -.col-xs-offset-7 {
        -  margin-left: 58.3333333333%; }
        -
        -.col-xs-offset-8 {
        -  margin-left: 66.6666666667%; }
        -
        -.col-xs-offset-9 {
        -  margin-left: 75%; }
        -
        -.col-xs-offset-10 {
        -  margin-left: 83.3333333333%; }
        -
        -.col-xs-offset-11 {
        -  margin-left: 91.6666666667%; }
        -
        -.col-xs-offset-12 {
        -  margin-left: 100%; }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-sm-2 {
        -    width: 16.6666666667%; }
        -  .col-sm-3 {
        -    width: 25%; }
        -  .col-sm-4 {
        -    width: 33.3333333333%; }
        -  .col-sm-5 {
        -    width: 41.6666666667%; }
        -  .col-sm-6 {
        -    width: 50%; }
        -  .col-sm-7 {
        -    width: 58.3333333333%; }
        -  .col-sm-8 {
        -    width: 66.6666666667%; }
        -  .col-sm-9 {
        -    width: 75%; }
        -  .col-sm-10 {
        -    width: 83.3333333333%; }
        -  .col-sm-11 {
        -    width: 91.6666666667%; }
        -  .col-sm-12 {
        -    width: 100%; }
        -  .col-sm-pull-0 {
        -    right: auto; }
        -  .col-sm-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-sm-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-sm-pull-3 {
        -    right: 25%; }
        -  .col-sm-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-sm-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-sm-pull-6 {
        -    right: 50%; }
        -  .col-sm-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-sm-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-sm-pull-9 {
        -    right: 75%; }
        -  .col-sm-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-sm-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-sm-pull-12 {
        -    right: 100%; }
        -  .col-sm-push-0 {
        -    left: auto; }
        -  .col-sm-push-1 {
        -    left: 8.3333333333%; }
        -  .col-sm-push-2 {
        -    left: 16.6666666667%; }
        -  .col-sm-push-3 {
        -    left: 25%; }
        -  .col-sm-push-4 {
        -    left: 33.3333333333%; }
        -  .col-sm-push-5 {
        -    left: 41.6666666667%; }
        -  .col-sm-push-6 {
        -    left: 50%; }
        -  .col-sm-push-7 {
        -    left: 58.3333333333%; }
        -  .col-sm-push-8 {
        -    left: 66.6666666667%; }
        -  .col-sm-push-9 {
        -    left: 75%; }
        -  .col-sm-push-10 {
        -    left: 83.3333333333%; }
        -  .col-sm-push-11 {
        -    left: 91.6666666667%; }
        -  .col-sm-push-12 {
        -    left: 100%; }
        -  .col-sm-offset-0 {
        -    margin-left: 0%; }
        -  .col-sm-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-sm-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-sm-offset-3 {
        -    margin-left: 25%; }
        -  .col-sm-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-sm-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-sm-offset-6 {
        -    margin-left: 50%; }
        -  .col-sm-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-sm-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-sm-offset-9 {
        -    margin-left: 75%; }
        -  .col-sm-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-sm-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-sm-offset-12 {
        -    margin-left: 100%; } }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-md-2 {
        -    width: 16.6666666667%; }
        -  .col-md-3 {
        -    width: 25%; }
        -  .col-md-4 {
        -    width: 33.3333333333%; }
        -  .col-md-5 {
        -    width: 41.6666666667%; }
        -  .col-md-6 {
        -    width: 50%; }
        -  .col-md-7 {
        -    width: 58.3333333333%; }
        -  .col-md-8 {
        -    width: 66.6666666667%; }
        -  .col-md-9 {
        -    width: 75%; }
        -  .col-md-10 {
        -    width: 83.3333333333%; }
        -  .col-md-11 {
        -    width: 91.6666666667%; }
        -  .col-md-12 {
        -    width: 100%; }
        -  .col-md-pull-0 {
        -    right: auto; }
        -  .col-md-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-md-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-md-pull-3 {
        -    right: 25%; }
        -  .col-md-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-md-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-md-pull-6 {
        -    right: 50%; }
        -  .col-md-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-md-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-md-pull-9 {
        -    right: 75%; }
        -  .col-md-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-md-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-md-pull-12 {
        -    right: 100%; }
        -  .col-md-push-0 {
        -    left: auto; }
        -  .col-md-push-1 {
        -    left: 8.3333333333%; }
        -  .col-md-push-2 {
        -    left: 16.6666666667%; }
        -  .col-md-push-3 {
        -    left: 25%; }
        -  .col-md-push-4 {
        -    left: 33.3333333333%; }
        -  .col-md-push-5 {
        -    left: 41.6666666667%; }
        -  .col-md-push-6 {
        -    left: 50%; }
        -  .col-md-push-7 {
        -    left: 58.3333333333%; }
        -  .col-md-push-8 {
        -    left: 66.6666666667%; }
        -  .col-md-push-9 {
        -    left: 75%; }
        -  .col-md-push-10 {
        -    left: 83.3333333333%; }
        -  .col-md-push-11 {
        -    left: 91.6666666667%; }
        -  .col-md-push-12 {
        -    left: 100%; }
        -  .col-md-offset-0 {
        -    margin-left: 0%; }
        -  .col-md-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-md-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-md-offset-3 {
        -    margin-left: 25%; }
        -  .col-md-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-md-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-md-offset-6 {
        -    margin-left: 50%; }
        -  .col-md-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-md-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-md-offset-9 {
        -    margin-left: 75%; }
        -  .col-md-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-md-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-md-offset-12 {
        -    margin-left: 100%; } }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-lg-2 {
        -    width: 16.6666666667%; }
        -  .col-lg-3 {
        -    width: 25%; }
        -  .col-lg-4 {
        -    width: 33.3333333333%; }
        -  .col-lg-5 {
        -    width: 41.6666666667%; }
        -  .col-lg-6 {
        -    width: 50%; }
        -  .col-lg-7 {
        -    width: 58.3333333333%; }
        -  .col-lg-8 {
        -    width: 66.6666666667%; }
        -  .col-lg-9 {
        -    width: 75%; }
        -  .col-lg-10 {
        -    width: 83.3333333333%; }
        -  .col-lg-11 {
        -    width: 91.6666666667%; }
        -  .col-lg-12 {
        -    width: 100%; }
        -  .col-lg-pull-0 {
        -    right: auto; }
        -  .col-lg-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-lg-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-lg-pull-3 {
        -    right: 25%; }
        -  .col-lg-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-lg-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-lg-pull-6 {
        -    right: 50%; }
        -  .col-lg-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-lg-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-lg-pull-9 {
        -    right: 75%; }
        -  .col-lg-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-lg-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-lg-pull-12 {
        -    right: 100%; }
        -  .col-lg-push-0 {
        -    left: auto; }
        -  .col-lg-push-1 {
        -    left: 8.3333333333%; }
        -  .col-lg-push-2 {
        -    left: 16.6666666667%; }
        -  .col-lg-push-3 {
        -    left: 25%; }
        -  .col-lg-push-4 {
        -    left: 33.3333333333%; }
        -  .col-lg-push-5 {
        -    left: 41.6666666667%; }
        -  .col-lg-push-6 {
        -    left: 50%; }
        -  .col-lg-push-7 {
        -    left: 58.3333333333%; }
        -  .col-lg-push-8 {
        -    left: 66.6666666667%; }
        -  .col-lg-push-9 {
        -    left: 75%; }
        -  .col-lg-push-10 {
        -    left: 83.3333333333%; }
        -  .col-lg-push-11 {
        -    left: 91.6666666667%; }
        -  .col-lg-push-12 {
        -    left: 100%; }
        -  .col-lg-offset-0 {
        -    margin-left: 0%; }
        -  .col-lg-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-lg-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-lg-offset-3 {
        -    margin-left: 25%; }
        -  .col-lg-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-lg-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-lg-offset-6 {
        -    margin-left: 50%; }
        -  .col-lg-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-lg-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-lg-offset-9 {
        -    margin-left: 75%; }
        -  .col-lg-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-lg-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-lg-offset-12 {
        -    margin-left: 100%; } }
        -
        -table {
        -  background-color: transparent; }
        -
        -caption {
        -  padding-top: 8px;
        -  padding-bottom: 8px;
        -  color: #777777;
        -  text-align: left; }
        -
        -th {
        -  text-align: left; }
        -
        -.table {
        -  width: 100%;
        -  max-width: 100%;
        -  margin-bottom: 20px; }
        -  .table > thead > tr > th,
        -  .table > thead > tr > td,
        -  .table > tbody > tr > th,
        -  .table > tbody > tr > td,
        -  .table > tfoot > tr > th,
        -  .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 > caption + thead > tr:first-child > td,
        -  .table > colgroup + thead > tr:first-child > th,
        -  .table > colgroup + thead > tr:first-child > td,
        -  .table > thead:first-child > tr:first-child > th,
        -  .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 > thead > tr > td,
        -.table-condensed > tbody > tr > th,
        -.table-condensed > tbody > tr > td,
        -.table-condensed > tfoot > tr > th,
        -.table-condensed > tfoot > tr > td {
        -  padding: 5px; }
        -
        -.table-bordered {
        -  border: 1px solid #ddd; }
        -  .table-bordered > thead > tr > th,
        -  .table-bordered > thead > tr > td,
        -  .table-bordered > tbody > tr > th,
        -  .table-bordered > tbody > tr > td,
        -  .table-bordered > tfoot > tr > th,
        -  .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-of-type(odd) {
        -  background-color: #f9f9f9; }
        -
        -.table-hover > tbody > tr:hover {
        -  background-color: #f5f5f5; }
        -
        -table col[class*="col-"] {
        -  position: static;
        -  float: none;
        -  display: table-column; }
        -
        -table td[class*="col-"],
        -table th[class*="col-"] {
        -  position: static;
        -  float: none;
        -  display: table-cell; }
        -
        -.table > thead > tr > td.active,
        -.table > thead > tr > th.active,
        -.table > thead > tr.active > td,
        -.table > thead > tr.active > th,
        -.table > tbody > tr > td.active,
        -.table > tbody > tr > th.active,
        -.table > tbody > tr.active > td,
        -.table > tbody > tr.active > th,
        -.table > tfoot > tr > td.active,
        -.table > tfoot > tr > th.active,
        -.table > tfoot > tr.active > td,
        -.table > tfoot > tr.active > th {
        -  background-color: #f5f5f5; }
        -
        -.table-hover > tbody > tr > td.active:hover,
        -.table-hover > tbody > tr > th.active:hover,
        -.table-hover > tbody > tr.active:hover > td,
        -.table-hover > tbody > tr:hover > .active,
        -.table-hover > tbody > tr.active:hover > th {
        -  background-color: #e8e8e8; }
        -
        -.table > thead > tr > td.success,
        -.table > thead > tr > th.success,
        -.table > thead > tr.success > td,
        -.table > thead > tr.success > th,
        -.table > tbody > tr > td.success,
        -.table > tbody > tr > th.success,
        -.table > tbody > tr.success > td,
        -.table > tbody > tr.success > th,
        -.table > tfoot > tr > td.success,
        -.table > tfoot > tr > th.success,
        -.table > tfoot > tr.success > td,
        -.table > tfoot > tr.success > th {
        -  background-color: #dff0d8; }
        -
        -.table-hover > tbody > tr > td.success:hover,
        -.table-hover > tbody > tr > th.success:hover,
        -.table-hover > tbody > tr.success:hover > td,
        -.table-hover > tbody > tr:hover > .success,
        -.table-hover > tbody > tr.success:hover > th {
        -  background-color: #d0e9c6; }
        -
        -.table > thead > tr > td.info,
        -.table > thead > tr > th.info,
        -.table > thead > tr.info > td,
        -.table > thead > tr.info > th,
        -.table > tbody > tr > td.info,
        -.table > tbody > tr > th.info,
        -.table > tbody > tr.info > td,
        -.table > tbody > tr.info > th,
        -.table > tfoot > tr > td.info,
        -.table > tfoot > tr > th.info,
        -.table > tfoot > tr.info > td,
        -.table > tfoot > tr.info > th {
        -  background-color: #d9edf7; }
        -
        -.table-hover > tbody > tr > td.info:hover,
        -.table-hover > tbody > tr > th.info:hover,
        -.table-hover > tbody > tr.info:hover > td,
        -.table-hover > tbody > tr:hover > .info,
        -.table-hover > tbody > tr.info:hover > th {
        -  background-color: #c4e3f3; }
        -
        -.table > thead > tr > td.warning,
        -.table > thead > tr > th.warning,
        -.table > thead > tr.warning > td,
        -.table > thead > tr.warning > th,
        -.table > tbody > tr > td.warning,
        -.table > tbody > tr > th.warning,
        -.table > tbody > tr.warning > td,
        -.table > tbody > tr.warning > th,
        -.table > tfoot > tr > td.warning,
        -.table > tfoot > tr > th.warning,
        -.table > tfoot > tr.warning > td,
        -.table > tfoot > tr.warning > th {
        -  background-color: #fcf8e3; }
        -
        -.table-hover > tbody > tr > td.warning:hover,
        -.table-hover > tbody > tr > th.warning:hover,
        -.table-hover > tbody > tr.warning:hover > td,
        -.table-hover > tbody > tr:hover > .warning,
        -.table-hover > tbody > tr.warning:hover > th {
        -  background-color: #faf2cc; }
        -
        -.table > thead > tr > td.danger,
        -.table > thead > tr > th.danger,
        -.table > thead > tr.danger > td,
        -.table > thead > tr.danger > th,
        -.table > tbody > tr > td.danger,
        -.table > tbody > tr > th.danger,
        -.table > tbody > tr.danger > td,
        -.table > tbody > tr.danger > th,
        -.table > tfoot > tr > td.danger,
        -.table > tfoot > tr > th.danger,
        -.table > tfoot > tr.danger > td,
        -.table > tfoot > tr.danger > th {
        -  background-color: #f2dede; }
        -
        -.table-hover > tbody > tr > td.danger:hover,
        -.table-hover > tbody > tr > th.danger:hover,
        -.table-hover > tbody > tr.danger:hover > td,
        -.table-hover > tbody > tr:hover > .danger,
        -.table-hover > tbody > tr.danger:hover > th {
        -  background-color: #ebcccc; }
        -
        -.table-responsive {
        -  overflow-x: auto;
        -  min-height: 0.01%; }
        -  @media screen and (max-width: 767px) {
        -    .table-responsive {
        -      width: 100%;
        -      margin-bottom: 15px;
        -      overflow-y: hidden;
        -      -ms-overflow-style: -ms-autohiding-scrollbar;
        -      border: 1px solid #ddd; }
        -      .table-responsive > .table {
        -        margin-bottom: 0; }
        -        .table-responsive > .table > thead > tr > th,
        -        .table-responsive > .table > thead > tr > td,
        -        .table-responsive > .table > tbody > tr > th,
        -        .table-responsive > .table > tbody > tr > td,
        -        .table-responsive > .table > tfoot > tr > th,
        -        .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 > thead > tr > td:first-child,
        -        .table-responsive > .table-bordered > tbody > tr > th:first-child,
        -        .table-responsive > .table-bordered > tbody > tr > td:first-child,
        -        .table-responsive > .table-bordered > tfoot > tr > th: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 > thead > tr > td:last-child,
        -        .table-responsive > .table-bordered > tbody > tr > th:last-child,
        -        .table-responsive > .table-bordered > tbody > tr > td:last-child,
        -        .table-responsive > .table-bordered > tfoot > tr > th: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 > tbody > tr:last-child > td,
        -        .table-responsive > .table-bordered > tfoot > tr:last-child > th,
        -        .table-responsive > .table-bordered > tfoot > tr:last-child > td {
        -          border-bottom: 0; } }
        -
        -fieldset {
        -  padding: 0;
        -  margin: 0;
        -  border: 0;
        -  min-width: 0; }
        -
        -legend {
        -  display: block;
        -  width: 100%;
        -  padding: 0;
        -  margin-bottom: 20px;
        -  font-size: 21px;
        -  line-height: inherit;
        -  color: #333333;
        -  border: 0;
        -  border-bottom: 1px solid #e5e5e5; }
        -
        -label {
        -  display: inline-block;
        -  max-width: 100%;
        -  margin-bottom: 5px;
        -  font-weight: bold; }
        -
        -input[type="search"] {
        -  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; }
        -
        -input[type="range"] {
        -  display: block;
        -  width: 100%; }
        -
        -select[multiple],
        -select[size] {
        -  height: auto; }
        -
        -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; }
        -
        -output {
        -  display: block;
        -  padding-top: 7px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #555555; }
        -
        -.form-control {
        -  display: block;
        -  width: 100%;
        -  height: 34px;
        -  padding: 6px 12px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #555555;
        -  background-color: #fff;
        -  background-image: none;
        -  border: 1px solid #ccc;
        -  border-radius: 4px;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
        -  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
        -  .form-control:focus {
        -    border-color: #66afe9;
        -    outline: 0;
        -    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;
        -    opacity: 1; }
        -  .form-control:-ms-input-placeholder {
        -    color: #999; }
        -  .form-control::-webkit-input-placeholder {
        -    color: #999; }
        -  .form-control::-ms-expand {
        -    border: 0;
        -    background-color: transparent; }
        -  .form-control[disabled], .form-control[readonly],
        -  fieldset[disabled] .form-control {
        -    background-color: #eeeeee;
        -    opacity: 1; }
        -  .form-control[disabled],
        -  fieldset[disabled] .form-control {
        -    cursor: not-allowed; }
        -
        -textarea.form-control {
        -  height: auto; }
        -
        -input[type="search"] {
        -  -webkit-appearance: none; }
        -
        -@media screen and (-webkit-min-device-pixel-ratio: 0) {
        -  input[type="date"].form-control,
        -  input[type="time"].form-control,
        -  input[type="datetime-local"].form-control,
        -  input[type="month"].form-control {
        -    line-height: 34px; }
        -  input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control,
        -  .input-group-sm > input[type="date"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="date"].btn,
        -  .input-group-sm input[type="date"],
        -  input[type="time"].input-sm,
        -  .input-group-sm > input[type="time"].form-control,
        -  .input-group-sm > input[type="time"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="time"].btn,
        -  .input-group-sm
        -  input[type="time"],
        -  input[type="datetime-local"].input-sm,
        -  .input-group-sm > input[type="datetime-local"].form-control,
        -  .input-group-sm > input[type="datetime-local"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
        -  .input-group-sm
        -  input[type="datetime-local"],
        -  input[type="month"].input-sm,
        -  .input-group-sm > input[type="month"].form-control,
        -  .input-group-sm > input[type="month"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="month"].btn,
        -  .input-group-sm
        -  input[type="month"] {
        -    line-height: 30px; }
        -  input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control,
        -  .input-group-lg > input[type="date"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="date"].btn,
        -  .input-group-lg input[type="date"],
        -  input[type="time"].input-lg,
        -  .input-group-lg > input[type="time"].form-control,
        -  .input-group-lg > input[type="time"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="time"].btn,
        -  .input-group-lg
        -  input[type="time"],
        -  input[type="datetime-local"].input-lg,
        -  .input-group-lg > input[type="datetime-local"].form-control,
        -  .input-group-lg > input[type="datetime-local"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
        -  .input-group-lg
        -  input[type="datetime-local"],
        -  input[type="month"].input-lg,
        -  .input-group-lg > input[type="month"].form-control,
        -  .input-group-lg > input[type="month"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="month"].btn,
        -  .input-group-lg
        -  input[type="month"] {
        -    line-height: 46px; } }
        -
        -.form-group {
        -  margin-bottom: 15px; }
        -
        -.radio,
        -.checkbox {
        -  position: relative;
        -  display: block;
        -  margin-top: 10px;
        -  margin-bottom: 10px; }
        -  .radio label,
        -  .checkbox label {
        -    min-height: 20px;
        -    padding-left: 20px;
        -    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"] {
        -  position: absolute;
        -  margin-left: -20px;
        -  margin-top: 4px \9; }
        -
        -.radio + .radio,
        -.checkbox + .checkbox {
        -  margin-top: -5px; }
        -
        -.radio-inline,
        -.checkbox-inline {
        -  position: relative;
        -  display: inline-block;
        -  padding-left: 20px;
        -  margin-bottom: 0;
        -  vertical-align: middle;
        -  font-weight: normal;
        -  cursor: pointer; }
        -
        -.radio-inline + .radio-inline,
        -.checkbox-inline + .checkbox-inline {
        -  margin-top: 0;
        -  margin-left: 10px; }
        -
        -input[type="radio"][disabled], input[type="radio"].disabled,
        -fieldset[disabled] input[type="radio"],
        -input[type="checkbox"][disabled],
        -input[type="checkbox"].disabled,
        -fieldset[disabled]
        -input[type="checkbox"] {
        -  cursor: not-allowed; }
        -
        -.radio-inline.disabled,
        -fieldset[disabled] .radio-inline,
        -.checkbox-inline.disabled,
        -fieldset[disabled]
        -.checkbox-inline {
        -  cursor: not-allowed; }
        -
        -.radio.disabled label,
        -fieldset[disabled] .radio label,
        -.checkbox.disabled label,
        -fieldset[disabled]
        -.checkbox label {
        -  cursor: not-allowed; }
        -
        -.form-control-static {
        -  padding-top: 7px;
        -  padding-bottom: 7px;
        -  margin-bottom: 0;
        -  min-height: 34px; }
        -  .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,
        -  .input-group-lg > .form-control-static.input-group-addon,
        -  .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
        -  .input-group-sm > .form-control-static.input-group-addon,
        -  .input-group-sm > .input-group-btn > .form-control-static.btn {
        -    padding-left: 0;
        -    padding-right: 0; }
        -
        -.input-sm, .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-sm, .input-group-sm > select.form-control,
        -.input-group-sm > select.input-group-addon,
        -.input-group-sm > .input-group-btn > select.btn {
        -  height: 30px;
        -  line-height: 30px; }
        -
        -textarea.input-sm, .input-group-sm > textarea.form-control,
        -.input-group-sm > textarea.input-group-addon,
        -.input-group-sm > .input-group-btn > textarea.btn,
        -select[multiple].input-sm,
        -.input-group-sm > select[multiple].form-control,
        -.input-group-sm > select[multiple].input-group-addon,
        -.input-group-sm > .input-group-btn > select[multiple].btn {
        -  height: auto; }
        -
        -.form-group-sm .form-control {
        -  height: 30px;
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.form-group-sm select.form-control {
        -  height: 30px;
        -  line-height: 30px; }
        -
        -.form-group-sm textarea.form-control,
        -.form-group-sm select[multiple].form-control {
        -  height: auto; }
        -
        -.form-group-sm .form-control-static {
        -  height: 30px;
        -  min-height: 32px;
        -  padding: 6px 10px;
        -  font-size: 12px;
        -  line-height: 1.5; }
        -
        -.input-lg, .input-group-lg > .form-control,
        -.input-group-lg > .input-group-addon,
        -.input-group-lg > .input-group-btn > .btn {
        -  height: 46px;
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -select.input-lg, .input-group-lg > select.form-control,
        -.input-group-lg > select.input-group-addon,
        -.input-group-lg > .input-group-btn > select.btn {
        -  height: 46px;
        -  line-height: 46px; }
        -
        -textarea.input-lg, .input-group-lg > textarea.form-control,
        -.input-group-lg > textarea.input-group-addon,
        -.input-group-lg > .input-group-btn > textarea.btn,
        -select[multiple].input-lg,
        -.input-group-lg > select[multiple].form-control,
        -.input-group-lg > select[multiple].input-group-addon,
        -.input-group-lg > .input-group-btn > select[multiple].btn {
        -  height: auto; }
        -
        -.form-group-lg .form-control {
        -  height: 46px;
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -.form-group-lg select.form-control {
        -  height: 46px;
        -  line-height: 46px; }
        -
        -.form-group-lg textarea.form-control,
        -.form-group-lg select[multiple].form-control {
        -  height: auto; }
        -
        -.form-group-lg .form-control-static {
        -  height: 46px;
        -  min-height: 38px;
        -  padding: 11px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333; }
        -
        -.has-feedback {
        -  position: relative; }
        -  .has-feedback .form-control {
        -    padding-right: 42.5px; }
        -
        -.form-control-feedback {
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -  z-index: 2;
        -  display: block;
        -  width: 34px;
        -  height: 34px;
        -  line-height: 34px;
        -  text-align: center;
        -  pointer-events: none; }
        -
        -.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,
        -.input-group-lg > .input-group-addon + .form-control-feedback,
        -.input-group-lg > .input-group-btn > .btn + .form-control-feedback,
        -.input-group-lg + .form-control-feedback,
        -.form-group-lg .form-control + .form-control-feedback {
        -  width: 46px;
        -  height: 46px;
        -  line-height: 46px; }
        -
        -.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,
        -.input-group-sm > .input-group-addon + .form-control-feedback,
        -.input-group-sm > .input-group-btn > .btn + .form-control-feedback,
        -.input-group-sm + .form-control-feedback,
        -.form-group-sm .form-control + .form-control-feedback {
        -  width: 30px;
        -  height: 30px;
        -  line-height: 30px; }
        -
        -.has-success .help-block,
        -.has-success .control-label,
        -.has-success .radio,
        -.has-success .checkbox,
        -.has-success .radio-inline,
        -.has-success .checkbox-inline,
        -.has-success.radio label,
        -.has-success.checkbox label,
        -.has-success.radio-inline label,
        -.has-success.checkbox-inline label {
        -  color: #3c763d; }
        -
        -.has-success .form-control {
        -  border-color: #3c763d;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-success .form-control:focus {
        -    border-color: #2b542c;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }
        -
        -.has-success .input-group-addon {
        -  color: #3c763d;
        -  border-color: #3c763d;
        -  background-color: #dff0d8; }
        -
        -.has-success .form-control-feedback {
        -  color: #3c763d; }
        -
        -.has-warning .help-block,
        -.has-warning .control-label,
        -.has-warning .radio,
        -.has-warning .checkbox,
        -.has-warning .radio-inline,
        -.has-warning .checkbox-inline,
        -.has-warning.radio label,
        -.has-warning.checkbox label,
        -.has-warning.radio-inline label,
        -.has-warning.checkbox-inline label {
        -  color: #8a6d3b; }
        -
        -.has-warning .form-control {
        -  border-color: #8a6d3b;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-warning .form-control:focus {
        -    border-color: #66512c;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }
        -
        -.has-warning .input-group-addon {
        -  color: #8a6d3b;
        -  border-color: #8a6d3b;
        -  background-color: #fcf8e3; }
        -
        -.has-warning .form-control-feedback {
        -  color: #8a6d3b; }
        -
        -.has-error .help-block,
        -.has-error .control-label,
        -.has-error .radio,
        -.has-error .checkbox,
        -.has-error .radio-inline,
        -.has-error .checkbox-inline,
        -.has-error.radio label,
        -.has-error.checkbox label,
        -.has-error.radio-inline label,
        -.has-error.checkbox-inline label {
        -  color: #a94442; }
        -
        -.has-error .form-control {
        -  border-color: #a94442;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-error .form-control:focus {
        -    border-color: #843534;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }
        -
        -.has-error .input-group-addon {
        -  color: #a94442;
        -  border-color: #a94442;
        -  background-color: #f2dede; }
        -
        -.has-error .form-control-feedback {
        -  color: #a94442; }
        -
        -.has-feedback label ~ .form-control-feedback {
        -  top: 25px; }
        -
        -.has-feedback label.sr-only ~ .form-control-feedback {
        -  top: 0; }
        -
        -.help-block {
        -  display: block;
        -  margin-top: 5px;
        -  margin-bottom: 10px;
        -  color: #737373; }
        -
        -@media (min-width: 768px) {
        -  .form-inline .form-group {
        -    display: inline-block;
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -  .form-inline .form-control {
        -    display: inline-block;
        -    width: auto;
        -    vertical-align: middle; }
        -  .form-inline .form-control-static {
        -    display: inline-block; }
        -  .form-inline .input-group {
        -    display: inline-table;
        -    vertical-align: middle; }
        -    .form-inline .input-group .input-group-addon,
        -    .form-inline .input-group .input-group-btn,
        -    .form-inline .input-group .form-control {
        -      width: auto; }
        -  .form-inline .input-group > .form-control {
        -    width: 100%; }
        -  .form-inline .control-label {
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -  .form-inline .radio,
        -  .form-inline .checkbox {
        -    display: inline-block;
        -    margin-top: 0;
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -    .form-inline .radio label,
        -    .form-inline .checkbox label {
        -      padding-left: 0; }
        -  .form-inline .radio input[type="radio"],
        -  .form-inline .checkbox input[type="checkbox"] {
        -    position: relative;
        -    margin-left: 0; }
        -  .form-inline .has-feedback .form-control-feedback {
        -    top: 0; } }
        -
        -.form-horizontal .radio,
        -.form-horizontal .checkbox,
        -.form-horizontal .radio-inline,
        -.form-horizontal .checkbox-inline {
        -  margin-top: 0;
        -  margin-bottom: 0;
        -  padding-top: 7px; }
        -
        -.form-horizontal .radio,
        -.form-horizontal .checkbox {
        -  min-height: 27px; }
        -
        -.form-horizontal .form-group {
        -  margin-left: -15px;
        -  margin-right: -15px; }
        -  .form-horizontal .form-group:before, .form-horizontal .form-group:after {
        -    content: " ";
        -    display: table; }
        -  .form-horizontal .form-group:after {
        -    clear: both; }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .control-label {
        -    text-align: right;
        -    margin-bottom: 0;
        -    padding-top: 7px; } }
        -
        -.form-horizontal .has-feedback .form-control-feedback {
        -  right: 15px; }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .form-group-lg .control-label {
        -    padding-top: 11px;
        -    font-size: 18px; } }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .form-group-sm .control-label {
        -    padding-top: 6px;
        -    font-size: 12px; } }
        -
        -.btn {
        -  display: inline-block;
        -  margin-bottom: 0;
        -  font-weight: normal;
        -  text-align: center;
        -  vertical-align: middle;
        -  -ms-touch-action: manipulation;
        -  touch-action: manipulation;
        -  cursor: pointer;
        -  background-image: none;
        -  border: 1px solid transparent;
        -  white-space: nowrap;
        -  padding: 6px 12px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  border-radius: 4px;
        -  -webkit-user-select: none;
        -  -moz-user-select: none;
        -  -ms-user-select: none;
        -  user-select: none; }
        -  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
        -    outline: thin dotted;
        -    outline: 5px auto -webkit-focus-ring-color;
        -    outline-offset: -2px; }
        -  .btn:hover, .btn:focus, .btn.focus {
        -    color: #333;
        -    text-decoration: none; }
        -  .btn:active, .btn.active {
        -    outline: 0;
        -    background-image: none;
        -    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
        -  .btn.disabled, .btn[disabled],
        -  fieldset[disabled] .btn {
        -    cursor: not-allowed;
        -    opacity: 0.65;
        -    filter: alpha(opacity=65);
        -    box-shadow: none; }
        -
        -a.btn.disabled,
        -fieldset[disabled] a.btn {
        -  pointer-events: none; }
        -
        -.btn-default {
        -  color: #333;
        -  background-color: #fff;
        -  border-color: #ccc; }
        -  .btn-default:focus, .btn-default.focus {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #8c8c8c; }
        -  .btn-default:hover {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #adadad; }
        -  .btn-default:active, .btn-default.active,
        -  .open > .btn-default.dropdown-toggle {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #adadad; }
        -    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,
        -    .open > .btn-default.dropdown-toggle:hover,
        -    .open > .btn-default.dropdown-toggle:focus,
        -    .open > .btn-default.dropdown-toggle.focus {
        -      color: #333;
        -      background-color: #d4d4d4;
        -      border-color: #8c8c8c; }
        -  .btn-default:active, .btn-default.active,
        -  .open > .btn-default.dropdown-toggle {
        -    background-image: none; }
        -  .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,
        -  fieldset[disabled] .btn-default:hover,
        -  fieldset[disabled] .btn-default:focus,
        -  fieldset[disabled] .btn-default.focus {
        -    background-color: #fff;
        -    border-color: #ccc; }
        -  .btn-default .badge {
        -    color: #fff;
        -    background-color: #333; }
        -
        -.btn-primary {
        -  color: #fff;
        -  background-color: #337ab7;
        -  border-color: #2e6da4; }
        -  .btn-primary:focus, .btn-primary.focus {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #122b40; }
        -  .btn-primary:hover {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #204d74; }
        -  .btn-primary:active, .btn-primary.active,
        -  .open > .btn-primary.dropdown-toggle {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #204d74; }
        -    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,
        -    .open > .btn-primary.dropdown-toggle:hover,
        -    .open > .btn-primary.dropdown-toggle:focus,
        -    .open > .btn-primary.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #204d74;
        -      border-color: #122b40; }
        -  .btn-primary:active, .btn-primary.active,
        -  .open > .btn-primary.dropdown-toggle {
        -    background-image: none; }
        -  .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,
        -  fieldset[disabled] .btn-primary:hover,
        -  fieldset[disabled] .btn-primary:focus,
        -  fieldset[disabled] .btn-primary.focus {
        -    background-color: #337ab7;
        -    border-color: #2e6da4; }
        -  .btn-primary .badge {
        -    color: #337ab7;
        -    background-color: #fff; }
        -
        -.btn-success {
        -  color: #fff;
        -  background-color: #5cb85c;
        -  border-color: #4cae4c; }
        -  .btn-success:focus, .btn-success.focus {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #255625; }
        -  .btn-success:hover {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #398439; }
        -  .btn-success:active, .btn-success.active,
        -  .open > .btn-success.dropdown-toggle {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #398439; }
        -    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,
        -    .open > .btn-success.dropdown-toggle:hover,
        -    .open > .btn-success.dropdown-toggle:focus,
        -    .open > .btn-success.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #398439;
        -      border-color: #255625; }
        -  .btn-success:active, .btn-success.active,
        -  .open > .btn-success.dropdown-toggle {
        -    background-image: none; }
        -  .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,
        -  fieldset[disabled] .btn-success:hover,
        -  fieldset[disabled] .btn-success:focus,
        -  fieldset[disabled] .btn-success.focus {
        -    background-color: #5cb85c;
        -    border-color: #4cae4c; }
        -  .btn-success .badge {
        -    color: #5cb85c;
        -    background-color: #fff; }
        -
        -.btn-info {
        -  color: #fff;
        -  background-color: #5bc0de;
        -  border-color: #46b8da; }
        -  .btn-info:focus, .btn-info.focus {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #1b6d85; }
        -  .btn-info:hover {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #269abc; }
        -  .btn-info:active, .btn-info.active,
        -  .open > .btn-info.dropdown-toggle {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #269abc; }
        -    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,
        -    .open > .btn-info.dropdown-toggle:hover,
        -    .open > .btn-info.dropdown-toggle:focus,
        -    .open > .btn-info.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #269abc;
        -      border-color: #1b6d85; }
        -  .btn-info:active, .btn-info.active,
        -  .open > .btn-info.dropdown-toggle {
        -    background-image: none; }
        -  .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,
        -  fieldset[disabled] .btn-info:hover,
        -  fieldset[disabled] .btn-info:focus,
        -  fieldset[disabled] .btn-info.focus {
        -    background-color: #5bc0de;
        -    border-color: #46b8da; }
        -  .btn-info .badge {
        -    color: #5bc0de;
        -    background-color: #fff; }
        -
        -.btn-warning {
        -  color: #fff;
        -  background-color: #f0ad4e;
        -  border-color: #eea236; }
        -  .btn-warning:focus, .btn-warning.focus {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #985f0d; }
        -  .btn-warning:hover {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #d58512; }
        -  .btn-warning:active, .btn-warning.active,
        -  .open > .btn-warning.dropdown-toggle {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #d58512; }
        -    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,
        -    .open > .btn-warning.dropdown-toggle:hover,
        -    .open > .btn-warning.dropdown-toggle:focus,
        -    .open > .btn-warning.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #d58512;
        -      border-color: #985f0d; }
        -  .btn-warning:active, .btn-warning.active,
        -  .open > .btn-warning.dropdown-toggle {
        -    background-image: none; }
        -  .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,
        -  fieldset[disabled] .btn-warning:hover,
        -  fieldset[disabled] .btn-warning:focus,
        -  fieldset[disabled] .btn-warning.focus {
        -    background-color: #f0ad4e;
        -    border-color: #eea236; }
        -  .btn-warning .badge {
        -    color: #f0ad4e;
        -    background-color: #fff; }
        -
        -.btn-danger {
        -  color: #fff;
        -  background-color: #d9534f;
        -  border-color: #d43f3a; }
        -  .btn-danger:focus, .btn-danger.focus {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #761c19; }
        -  .btn-danger:hover {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #ac2925; }
        -  .btn-danger:active, .btn-danger.active,
        -  .open > .btn-danger.dropdown-toggle {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #ac2925; }
        -    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,
        -    .open > .btn-danger.dropdown-toggle:hover,
        -    .open > .btn-danger.dropdown-toggle:focus,
        -    .open > .btn-danger.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #ac2925;
        -      border-color: #761c19; }
        -  .btn-danger:active, .btn-danger.active,
        -  .open > .btn-danger.dropdown-toggle {
        -    background-image: none; }
        -  .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,
        -  fieldset[disabled] .btn-danger:hover,
        -  fieldset[disabled] .btn-danger:focus,
        -  fieldset[disabled] .btn-danger.focus {
        -    background-color: #d9534f;
        -    border-color: #d43f3a; }
        -  .btn-danger .badge {
        -    color: #d9534f;
        -    background-color: #fff; }
        -
        -.btn-link {
        -  color: #337ab7;
        -  font-weight: normal;
        -  border-radius: 0; }
        -  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],
        -  fieldset[disabled] .btn-link {
        -    background-color: transparent;
        -    box-shadow: none; }
        -  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {
        -    border-color: transparent; }
        -  .btn-link:hover, .btn-link:focus {
        -    color: #23527c;
        -    text-decoration: underline;
        -    background-color: transparent; }
        -  .btn-link[disabled]:hover, .btn-link[disabled]:focus,
        -  fieldset[disabled] .btn-link:hover,
        -  fieldset[disabled] .btn-link:focus {
        -    color: #777777;
        -    text-decoration: none; }
        -
        -.btn-lg, .btn-group-lg > .btn {
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -.btn-sm, .btn-group-sm > .btn {
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.btn-xs, .btn-group-xs > .btn {
        -  padding: 1px 5px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.btn-block {
        -  display: block;
        -  width: 100%; }
        -
        -.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;
        -  transition: opacity 0.15s linear; }
        -  .fade.in {
        -    opacity: 1; }
        -
        -.collapse {
        -  display: none; }
        -  .collapse.in {
        -    display: block; }
        -
        -tr.collapse.in {
        -  display: table-row; }
        -
        -tbody.collapse.in {
        -  display: table-row-group; }
        -
        -.collapsing {
        -  position: relative;
        -  height: 0;
        -  overflow: hidden;
        -  transition-property: height, visibility;
        -  transition-duration: 0.35s;
        -  transition-timing-function: ease; }
        -
        -.caret {
        -  display: inline-block;
        -  width: 0;
        -  height: 0;
        -  margin-left: 2px;
        -  vertical-align: middle;
        -  border-top: 4px dashed;
        -  border-top: 4px solid \9;
        -  border-right: 4px solid transparent;
        -  border-left: 4px solid transparent; }
        -
        -.dropup,
        -.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;
        -  list-style: none;
        -  font-size: 14px;
        -  text-align: left;
        -  background-color: #fff;
        -  border: 1px solid #ccc;
        -  border: 1px solid rgba(0, 0, 0, 0.15);
        -  border-radius: 4px;
        -  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: #333333;
        -    white-space: nowrap; }
        -
        -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
        -  text-decoration: none;
        -  color: #262626;
        -  background-color: #f5f5f5; }
        -
        -.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  outline: 0;
        -  background-color: #337ab7; }
        -
        -.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
        -  color: #777777; }
        -
        -.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
        -  text-decoration: none;
        -  background-color: transparent;
        -  background-image: none;
        -  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
        -  cursor: not-allowed; }
        -
        -.open > .dropdown-menu {
        -  display: block; }
        -
        -.open > a {
        -  outline: 0; }
        -
        -.dropdown-menu-right {
        -  left: auto;
        -  right: 0; }
        -
        -.dropdown-menu-left {
        -  left: 0;
        -  right: auto; }
        -
        -.dropdown-header {
        -  display: block;
        -  padding: 3px 20px;
        -  font-size: 12px;
        -  line-height: 1.428571429;
        -  color: #777777;
        -  white-space: nowrap; }
        -
        -.dropdown-backdrop {
        -  position: fixed;
        -  left: 0;
        -  right: 0;
        -  bottom: 0;
        -  top: 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 dashed;
        -  border-bottom: 4px solid \9;
        -  content: ""; }
        -
        -.dropup .dropdown-menu,
        -.navbar-fixed-bottom .dropdown .dropdown-menu {
        -  top: auto;
        -  bottom: 100%;
        -  margin-bottom: 2px; }
        -
        -@media (min-width: 768px) {
        -  .navbar-right .dropdown-menu {
        -    right: 0;
        -    left: auto; }
        -  .navbar-right .dropdown-menu-left {
        -    left: 0;
        -    right: 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 > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
        -    .btn-group-vertical > .btn:hover,
        -    .btn-group-vertical > .btn:focus,
        -    .btn-group-vertical > .btn:active,
        -    .btn-group-vertical > .btn.active {
        -      z-index: 2; }
        -
        -.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 {
        -  margin-left: -5px; }
        -  .btn-toolbar:before, .btn-toolbar:after {
        -    content: " ";
        -    display: table; }
        -  .btn-toolbar:after {
        -    clear: both; }
        -  .btn-toolbar .btn,
        -  .btn-toolbar .btn-group,
        -  .btn-toolbar .input-group {
        -    float: left; }
        -  .btn-toolbar > .btn,
        -  .btn-toolbar > .btn-group,
        -  .btn-toolbar > .input-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-bottom-right-radius: 0;
        -    border-top-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:not(:last-child) > .btn:last-child,
        -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
        -  border-bottom-right-radius: 0;
        -  border-top-right-radius: 0; }
        -
        -.btn-group > .btn-group:last-child:not(:first-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 > .btn + .dropdown-toggle {
        -  padding-left: 8px;
        -  padding-right: 8px; }
        -
        -.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {
        -  padding-left: 12px;
        -  padding-right: 12px; }
        -
        -.btn-group.open .dropdown-toggle {
        -  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
        -  .btn-group.open .dropdown-toggle.btn-link {
        -    box-shadow: none; }
        -
        -.btn .caret {
        -  margin-left: 0; }
        -
        -.btn-lg .caret, .btn-group-lg > .btn .caret {
        -  border-width: 5px 5px 0;
        -  border-bottom-width: 0; }
        -
        -.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .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 {
        -  content: " ";
        -  display: table; }
        -
        -.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-top-left-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-top-left-radius: 0;
        -  border-bottom-right-radius: 4px;
        -  border-bottom-left-radius: 4px; }
        -
        -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
        -  border-radius: 0; }
        -
        -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
        -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0; }
        -
        -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.btn-group-justified {
        -  display: table;
        -  width: 100%;
        -  table-layout: fixed;
        -  border-collapse: separate; }
        -  .btn-group-justified > .btn,
        -  .btn-group-justified > .btn-group {
        -    float: none;
        -    display: table-cell;
        -    width: 1%; }
        -  .btn-group-justified > .btn-group .btn {
        -    width: 100%; }
        -  .btn-group-justified > .btn-group .dropdown-menu {
        -    left: auto; }
        -
        -[data-toggle="buttons"] > .btn input[type="radio"],
        -[data-toggle="buttons"] > .btn input[type="checkbox"],
        -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
        -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
        -  position: absolute;
        -  clip: rect(0, 0, 0, 0);
        -  pointer-events: none; }
        -
        -.input-group {
        -  position: relative;
        -  display: table;
        -  border-collapse: separate; }
        -  .input-group[class*="col-"] {
        -    float: none;
        -    padding-left: 0;
        -    padding-right: 0; }
        -  .input-group .form-control {
        -    position: relative;
        -    z-index: 2;
        -    float: left;
        -    width: 100%;
        -    margin-bottom: 0; }
        -    .input-group .form-control:focus {
        -      z-index: 3; }
        -
        -.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: 6px 12px;
        -  font-size: 14px;
        -  font-weight: normal;
        -  line-height: 1;
        -  color: #555555;
        -  text-align: center;
        -  background-color: #eeeeee;
        -  border: 1px solid #ccc;
        -  border-radius: 4px; }
        -  .input-group-addon.input-sm,
        -  .input-group-sm > .input-group-addon,
        -  .input-group-sm > .input-group-btn > .input-group-addon.btn {
        -    padding: 5px 10px;
        -    font-size: 12px;
        -    border-radius: 3px; }
        -  .input-group-addon.input-lg,
        -  .input-group-lg > .input-group-addon,
        -  .input-group-lg > .input-group-btn > .input-group-addon.btn {
        -    padding: 10px 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 > .btn-group > .btn,
        -.input-group-btn:first-child > .dropdown-toggle,
        -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
        -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
        -  border-bottom-right-radius: 0;
        -  border-top-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 > .btn-group > .btn,
        -.input-group-btn:last-child > .dropdown-toggle,
        -.input-group-btn:first-child > .btn:not(:first-child),
        -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
        -  border-bottom-left-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.input-group-addon:last-child {
        -  border-left: 0; }
        -
        -.input-group-btn {
        -  position: relative;
        -  font-size: 0;
        -  white-space: nowrap; }
        -  .input-group-btn > .btn {
        -    position: relative; }
        -    .input-group-btn > .btn + .btn {
        -      margin-left: -1px; }
        -    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {
        -      z-index: 2; }
        -  .input-group-btn:first-child > .btn,
        -  .input-group-btn:first-child > .btn-group {
        -    margin-right: -1px; }
        -  .input-group-btn:last-child > .btn,
        -  .input-group-btn:last-child > .btn-group {
        -    z-index: 2;
        -    margin-left: -1px; }
        -
        -.nav {
        -  margin-bottom: 0;
        -  padding-left: 0;
        -  list-style: none; }
        -  .nav:before, .nav:after {
        -    content: " ";
        -    display: table; }
        -  .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: #eeeeee; }
        -    .nav > li.disabled > a {
        -      color: #777777; }
        -      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
        -        color: #777777;
        -        text-decoration: none;
        -        background-color: transparent;
        -        cursor: not-allowed; }
        -  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
        -    background-color: #eeeeee;
        -    border-color: #337ab7; }
        -  .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: #eeeeee #eeeeee #ddd; }
        -    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
        -      color: #555555;
        -      background-color: #fff;
        -      border: 1px solid #ddd;
        -      border-bottom-color: transparent;
        -      cursor: default; }
        -
        -.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: #337ab7; }
        -
        -.nav-stacked > li {
        -  float: none; }
        -  .nav-stacked > li + li {
        -    margin-top: 2px;
        -    margin-left: 0; }
        -
        -.nav-justified, .nav-tabs.nav-justified {
        -  width: 100%; }
        -  .nav-justified > li, .nav-tabs.nav-justified > li {
        -    float: none; }
        -    .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
        -      text-align: center;
        -      margin-bottom: 5px; }
        -  .nav-justified > .dropdown .dropdown-menu {
        -    top: auto;
        -    left: auto; }
        -  @media (min-width: 768px) {
        -    .nav-justified > li, .nav-tabs.nav-justified > li {
        -      display: table-cell;
        -      width: 1%; }
        -      .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
        -        margin-bottom: 0; } }
        -
        -.nav-tabs-justified, .nav-tabs.nav-justified {
        -  border-bottom: 0; }
        -  .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
        -    margin-right: 0;
        -    border-radius: 4px; }
        -  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
        -  .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
        -  .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
        -    border: 1px solid #ddd; }
        -  @media (min-width: 768px) {
        -    .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
        -      border-bottom: 1px solid #ddd;
        -      border-radius: 4px 4px 0 0; }
        -    .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
        -    .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
        -    .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-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 {
        -    content: " ";
        -    display: table; }
        -  .navbar:after {
        -    clear: both; }
        -  @media (min-width: 768px) {
        -    .navbar {
        -      border-radius: 4px; } }
        -
        -.navbar-header:before, .navbar-header:after {
        -  content: " ";
        -  display: table; }
        -
        -.navbar-header:after {
        -  clear: both; }
        -
        -@media (min-width: 768px) {
        -  .navbar-header {
        -    float: left; } }
        -
        -.navbar-collapse {
        -  overflow-x: visible;
        -  padding-right: 15px;
        -  padding-left: 15px;
        -  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 {
        -    content: " ";
        -    display: table; }
        -  .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-left: 0;
        -        padding-right: 0; } }
        -
        -.navbar-fixed-top .navbar-collapse,
        -.navbar-fixed-bottom .navbar-collapse {
        -  max-height: 340px; }
        -  @media (max-device-width: 480px) and (orientation: landscape) {
        -    .navbar-fixed-top .navbar-collapse,
        -    .navbar-fixed-bottom .navbar-collapse {
        -      max-height: 200px; } }
        -
        -.container > .navbar-header,
        -.container > .navbar-collapse,
        -.container-fluid > .navbar-header,
        -.container-fluid > .navbar-collapse {
        -  margin-right: -15px;
        -  margin-left: -15px; }
        -  @media (min-width: 768px) {
        -    .container > .navbar-header,
        -    .container > .navbar-collapse,
        -    .container-fluid > .navbar-header,
        -    .container-fluid > .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;
        -  height: 50px; }
        -  .navbar-brand:hover, .navbar-brand:focus {
        -    text-decoration: none; }
        -  .navbar-brand > img {
        -    display: block; }
        -  @media (min-width: 768px) {
        -    .navbar > .container .navbar-brand,
        -    .navbar > .container-fluid .navbar-brand {
        -      margin-left: -15px; } }
        -
        -.navbar-toggle {
        -  position: relative;
        -  float: right;
        -  margin-right: 15px;
        -  padding: 9px 10px;
        -  margin-top: 8px;
        -  margin-bottom: 8px;
        -  background-color: transparent;
        -  background-image: none;
        -  border: 1px solid transparent;
        -  border-radius: 4px; }
        -  .navbar-toggle:focus {
        -    outline: 0; }
        -  .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-form {
        -  margin-left: -15px;
        -  margin-right: -15px;
        -  padding: 10px 15px;
        -  border-top: 1px solid transparent;
        -  border-bottom: 1px solid transparent;
        -  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
        -  margin-top: 8px;
        -  margin-bottom: 8px; }
        -  @media (min-width: 768px) {
        -    .navbar-form .form-group {
        -      display: inline-block;
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -    .navbar-form .form-control {
        -      display: inline-block;
        -      width: auto;
        -      vertical-align: middle; }
        -    .navbar-form .form-control-static {
        -      display: inline-block; }
        -    .navbar-form .input-group {
        -      display: inline-table;
        -      vertical-align: middle; }
        -      .navbar-form .input-group .input-group-addon,
        -      .navbar-form .input-group .input-group-btn,
        -      .navbar-form .input-group .form-control {
        -        width: auto; }
        -    .navbar-form .input-group > .form-control {
        -      width: 100%; }
        -    .navbar-form .control-label {
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -    .navbar-form .radio,
        -    .navbar-form .checkbox {
        -      display: inline-block;
        -      margin-top: 0;
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -      .navbar-form .radio label,
        -      .navbar-form .checkbox label {
        -        padding-left: 0; }
        -    .navbar-form .radio input[type="radio"],
        -    .navbar-form .checkbox input[type="checkbox"] {
        -      position: relative;
        -      margin-left: 0; }
        -    .navbar-form .has-feedback .form-control-feedback {
        -      top: 0; } }
        -  @media (max-width: 767px) {
        -    .navbar-form .form-group {
        -      margin-bottom: 5px; }
        -      .navbar-form .form-group:last-child {
        -        margin-bottom: 0; } }
        -  @media (min-width: 768px) {
        -    .navbar-form {
        -      width: auto;
        -      border: 0;
        -      margin-left: 0;
        -      margin-right: 0;
        -      padding-top: 0;
        -      padding-bottom: 0;
        -      box-shadow: none; } }
        -
        -.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 {
        -  margin-bottom: 0;
        -  border-top-right-radius: 4px;
        -  border-top-left-radius: 4px;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0; }
        -
        -.navbar-btn {
        -  margin-top: 8px;
        -  margin-bottom: 8px; }
        -  .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
        -    margin-top: 10px;
        -    margin-bottom: 10px; }
        -  .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
        -    margin-top: 14px;
        -    margin-bottom: 14px; }
        -
        -.navbar-text {
        -  margin-top: 15px;
        -  margin-bottom: 15px; }
        -  @media (min-width: 768px) {
        -    .navbar-text {
        -      float: left;
        -      margin-left: 15px;
        -      margin-right: 15px; } }
        -
        -@media (min-width: 768px) {
        -  .navbar-left {
        -    float: left !important; }
        -  .navbar-right {
        -    float: right !important;
        -    margin-right: -15px; }
        -    .navbar-right ~ .navbar-right {
        -      margin-right: 0; } }
        -
        -.navbar-default {
        -  background-color: #f8f8f8;
        -  border-color: #e7e7e7; }
        -  .navbar-default .navbar-brand {
        -    color: #777; }
        -    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
        -      color: #5e5e5e;
        -      background-color: transparent; }
        -  .navbar-default .navbar-text {
        -    color: #777; }
        -  .navbar-default .navbar-nav > li > a {
        -    color: #777; }
        -    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
        -      color: #333;
        -      background-color: transparent; }
        -  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
        -    color: #555;
        -    background-color: #e7e7e7; }
        -  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {
        -    color: #ccc;
        -    background-color: transparent; }
        -  .navbar-default .navbar-toggle {
        -    border-color: #ddd; }
        -    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
        -      background-color: #ddd; }
        -    .navbar-default .navbar-toggle .icon-bar {
        -      background-color: #888; }
        -  .navbar-default .navbar-collapse,
        -  .navbar-default .navbar-form {
        -    border-color: #e7e7e7; }
        -  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
        -    background-color: #e7e7e7;
        -    color: #555; }
        -  @media (max-width: 767px) {
        -    .navbar-default .navbar-nav .open .dropdown-menu > li > a {
        -      color: #777; }
        -      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
        -        color: #333;
        -        background-color: transparent; }
        -    .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: #555;
        -      background-color: #e7e7e7; }
        -    .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: #ccc;
        -      background-color: transparent; } }
        -  .navbar-default .navbar-link {
        -    color: #777; }
        -    .navbar-default .navbar-link:hover {
        -      color: #333; }
        -  .navbar-default .btn-link {
        -    color: #777; }
        -    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
        -      color: #333; }
        -    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,
        -    fieldset[disabled] .navbar-default .btn-link:hover,
        -    fieldset[disabled] .navbar-default .btn-link:focus {
        -      color: #ccc; }
        -
        -.navbar-inverse {
        -  background-color: #222;
        -  border-color: #090909; }
        -  .navbar-inverse .navbar-brand {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
        -      color: #fff;
        -      background-color: transparent; }
        -  .navbar-inverse .navbar-text {
        -    color: #9d9d9d; }
        -  .navbar-inverse .navbar-nav > li > a {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {
        -      color: #fff;
        -      background-color: transparent; }
        -  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
        -    color: #fff;
        -    background-color: #090909; }
        -  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {
        -    color: #444;
        -    background-color: transparent; }
        -  .navbar-inverse .navbar-toggle {
        -    border-color: #333; }
        -    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
        -      background-color: #333; }
        -    .navbar-inverse .navbar-toggle .icon-bar {
        -      background-color: #fff; }
        -  .navbar-inverse .navbar-collapse,
        -  .navbar-inverse .navbar-form {
        -    border-color: #101010; }
        -  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {
        -    background-color: #090909;
        -    color: #fff; }
        -  @media (max-width: 767px) {
        -    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
        -      border-color: #090909; }
        -    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
        -      background-color: #090909; }
        -    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
        -      color: #9d9d9d; }
        -      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
        -        color: #fff;
        -        background-color: transparent; }
        -    .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: #090909; }
        -    .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: #444;
        -      background-color: transparent; } }
        -  .navbar-inverse .navbar-link {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-link:hover {
        -      color: #fff; }
        -  .navbar-inverse .btn-link {
        -    color: #9d9d9d; }
        -    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
        -      color: #fff; }
        -    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,
        -    fieldset[disabled] .navbar-inverse .btn-link:hover,
        -    fieldset[disabled] .navbar-inverse .btn-link:focus {
        -      color: #444; }
        -
        -.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 {
        -      content: "/ ";
        -      padding: 0 5px;
        -      color: #ccc; }
        -  .breadcrumb > .active {
        -    color: #777777; }
        -
        -.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: 6px 12px;
        -      line-height: 1.428571429;
        -      text-decoration: none;
        -      color: #337ab7;
        -      background-color: #fff;
        -      border: 1px solid #ddd;
        -      margin-left: -1px; }
        -    .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-bottom-right-radius: 4px;
        -      border-top-right-radius: 4px; }
        -  .pagination > li > a:hover, .pagination > li > a:focus,
        -  .pagination > li > span:hover,
        -  .pagination > li > span:focus {
        -    z-index: 2;
        -    color: #23527c;
        -    background-color: #eeeeee;
        -    border-color: #ddd; }
        -  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,
        -  .pagination > .active > span,
        -  .pagination > .active > span:hover,
        -  .pagination > .active > span:focus {
        -    z-index: 3;
        -    color: #fff;
        -    background-color: #337ab7;
        -    border-color: #337ab7;
        -    cursor: default; }
        -  .pagination > .disabled > span,
        -  .pagination > .disabled > span:hover,
        -  .pagination > .disabled > span:focus,
        -  .pagination > .disabled > a,
        -  .pagination > .disabled > a:hover,
        -  .pagination > .disabled > a:focus {
        -    color: #777777;
        -    background-color: #fff;
        -    border-color: #ddd;
        -    cursor: not-allowed; }
        -
        -.pagination-lg > li > a,
        -.pagination-lg > li > span {
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333; }
        -
        -.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-bottom-right-radius: 6px;
        -  border-top-right-radius: 6px; }
        -
        -.pagination-sm > li > a,
        -.pagination-sm > li > span {
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5; }
        -
        -.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-bottom-right-radius: 3px;
        -  border-top-right-radius: 3px; }
        -
        -.pager {
        -  padding-left: 0;
        -  margin: 20px 0;
        -  list-style: none;
        -  text-align: center; }
        -  .pager:before, .pager:after {
        -    content: " ";
        -    display: table; }
        -  .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: #eeeeee; }
        -  .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: #777777;
        -    background-color: #fff;
        -    cursor: not-allowed; }
        -
        -.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:empty {
        -    display: none; }
        -  .btn .label {
        -    position: relative;
        -    top: -1px; }
        -
        -a.label:hover, a.label:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  cursor: pointer; }
        -
        -.label-default {
        -  background-color: #777777; }
        -  .label-default[href]:hover, .label-default[href]:focus {
        -    background-color: #5e5e5e; }
        -
        -.label-primary {
        -  background-color: #337ab7; }
        -  .label-primary[href]:hover, .label-primary[href]:focus {
        -    background-color: #286090; }
        -
        -.label-success {
        -  background-color: #5cb85c; }
        -  .label-success[href]:hover, .label-success[href]:focus {
        -    background-color: #449d44; }
        -
        -.label-info {
        -  background-color: #5bc0de; }
        -  .label-info[href]:hover, .label-info[href]:focus {
        -    background-color: #31b0d5; }
        -
        -.label-warning {
        -  background-color: #f0ad4e; }
        -  .label-warning[href]:hover, .label-warning[href]:focus {
        -    background-color: #ec971f; }
        -
        -.label-danger {
        -  background-color: #d9534f; }
        -  .label-danger[href]:hover, .label-danger[href]:focus {
        -    background-color: #c9302c; }
        -
        -.badge {
        -  display: inline-block;
        -  min-width: 10px;
        -  padding: 3px 7px;
        -  font-size: 12px;
        -  font-weight: bold;
        -  color: #fff;
        -  line-height: 1;
        -  vertical-align: middle;
        -  white-space: nowrap;
        -  text-align: center;
        -  background-color: #777777;
        -  border-radius: 10px; }
        -  .badge:empty {
        -    display: none; }
        -  .btn .badge {
        -    position: relative;
        -    top: -1px; }
        -  .btn-xs .badge, .btn-group-xs > .btn .badge,
        -  .btn-group-xs > .btn .badge {
        -    top: 0;
        -    padding: 1px 5px; }
        -  .list-group-item.active > .badge,
        -  .nav-pills > .active > a > .badge {
        -    color: #337ab7;
        -    background-color: #fff; }
        -  .list-group-item > .badge {
        -    float: right; }
        -  .list-group-item > .badge + .badge {
        -    margin-right: 5px; }
        -  .nav-pills > li > a > .badge {
        -    margin-left: 3px; }
        -
        -a.badge:hover, a.badge:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  cursor: pointer; }
        -
        -.jumbotron {
        -  padding-top: 30px;
        -  padding-bottom: 30px;
        -  margin-bottom: 30px;
        -  color: inherit;
        -  background-color: #eeeeee; }
        -  .jumbotron h1,
        -  .jumbotron .h1 {
        -    color: inherit; }
        -  .jumbotron p {
        -    margin-bottom: 15px;
        -    font-size: 21px;
        -    font-weight: 200; }
        -  .jumbotron > hr {
        -    border-top-color: #d5d5d5; }
        -  .container .jumbotron,
        -  .container-fluid .jumbotron {
        -    border-radius: 6px;
        -    padding-left: 15px;
        -    padding-right: 15px; }
        -  .jumbotron .container {
        -    max-width: 100%; }
        -  @media screen and (min-width: 768px) {
        -    .jumbotron {
        -      padding-top: 48px;
        -      padding-bottom: 48px; }
        -      .container .jumbotron,
        -      .container-fluid .jumbotron {
        -        padding-left: 60px;
        -        padding-right: 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;
        -  transition: border 0.2s ease-in-out; }
        -  .thumbnail > img,
        -  .thumbnail a > img {
        -    display: block;
        -    max-width: 100%;
        -    height: auto;
        -    margin-left: auto;
        -    margin-right: auto; }
        -  .thumbnail .caption {
        -    padding: 9px;
        -    color: #333333; }
        -
        -a.thumbnail:hover,
        -a.thumbnail:focus,
        -a.thumbnail.active {
        -  border-color: #337ab7; }
        -
        -.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,
        -.alert-dismissible {
        -  padding-right: 35px; }
        -  .alert-dismissable .close,
        -  .alert-dismissible .close {
        -    position: relative;
        -    top: -2px;
        -    right: -21px;
        -    color: inherit; }
        -
        -.alert-success {
        -  background-color: #dff0d8;
        -  border-color: #d6e9c6;
        -  color: #3c763d; }
        -  .alert-success hr {
        -    border-top-color: #c9e2b3; }
        -  .alert-success .alert-link {
        -    color: #2b542c; }
        -
        -.alert-info {
        -  background-color: #d9edf7;
        -  border-color: #bce8f1;
        -  color: #31708f; }
        -  .alert-info hr {
        -    border-top-color: #a6e1ec; }
        -  .alert-info .alert-link {
        -    color: #245269; }
        -
        -.alert-warning {
        -  background-color: #fcf8e3;
        -  border-color: #faebcc;
        -  color: #8a6d3b; }
        -  .alert-warning hr {
        -    border-top-color: #f7e1b5; }
        -  .alert-warning .alert-link {
        -    color: #66512c; }
        -
        -.alert-danger {
        -  background-color: #f2dede;
        -  border-color: #ebccd1;
        -  color: #a94442; }
        -  .alert-danger hr {
        -    border-top-color: #e4b9c0; }
        -  .alert-danger .alert-link {
        -    color: #843534; }
        -
        -@-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 {
        -  overflow: hidden;
        -  height: 20px;
        -  margin-bottom: 20px;
        -  background-color: #f5f5f5;
        -  border-radius: 4px;
        -  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: #337ab7;
        -  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
        -  transition: width 0.6s ease; }
        -
        -.progress-striped .progress-bar,
        -.progress-bar-striped {
        -  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,
        -.progress-bar.active {
        -  -webkit-animation: progress-bar-stripes 2s linear infinite;
        -  animation: progress-bar-stripes 2s linear infinite; }
        -
        -.progress-bar-success {
        -  background-color: #5cb85c; }
        -  .progress-striped .progress-bar-success {
        -    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: #5bc0de; }
        -  .progress-striped .progress-bar-info {
        -    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: #f0ad4e; }
        -  .progress-striped .progress-bar-warning {
        -    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: #d9534f; }
        -  .progress-striped .progress-bar-danger {
        -    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 {
        -  margin-top: 15px; }
        -  .media:first-child {
        -    margin-top: 0; }
        -
        -.media,
        -.media-body {
        -  zoom: 1;
        -  overflow: hidden; }
        -
        -.media-body {
        -  width: 10000px; }
        -
        -.media-object {
        -  display: block; }
        -  .media-object.img-thumbnail {
        -    max-width: none; }
        -
        -.media-right,
        -.media > .pull-right {
        -  padding-left: 10px; }
        -
        -.media-left,
        -.media > .pull-left {
        -  padding-right: 10px; }
        -
        -.media-left,
        -.media-right,
        -.media-body {
        -  display: table-cell;
        -  vertical-align: top; }
        -
        -.media-middle {
        -  vertical-align: middle; }
        -
        -.media-bottom {
        -  vertical-align: bottom; }
        -
        -.media-heading {
        -  margin-top: 0;
        -  margin-bottom: 5px; }
        -
        -.media-list {
        -  padding-left: 0;
        -  list-style: none; }
        -
        -.list-group {
        -  margin-bottom: 20px;
        -  padding-left: 0; }
        -
        -.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; }
        -
        -a.list-group-item,
        -button.list-group-item {
        -  color: #555; }
        -  a.list-group-item .list-group-item-heading,
        -  button.list-group-item .list-group-item-heading {
        -    color: #333; }
        -  a.list-group-item:hover, a.list-group-item:focus,
        -  button.list-group-item:hover,
        -  button.list-group-item:focus {
        -    text-decoration: none;
        -    color: #555;
        -    background-color: #f5f5f5; }
        -
        -button.list-group-item {
        -  width: 100%;
        -  text-align: left; }
        -
        -.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
        -  background-color: #eeeeee;
        -  color: #777777;
        -  cursor: not-allowed; }
        -  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {
        -    color: inherit; }
        -  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {
        -    color: #777777; }
        -
        -.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
        -  z-index: 2;
        -  color: #fff;
        -  background-color: #337ab7;
        -  border-color: #337ab7; }
        -  .list-group-item.active .list-group-item-heading,
        -  .list-group-item.active .list-group-item-heading > small,
        -  .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,
        -  .list-group-item.active:hover .list-group-item-heading > small,
        -  .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,
        -  .list-group-item.active:focus .list-group-item-heading > small,
        -  .list-group-item.active:focus .list-group-item-heading > .small {
        -    color: inherit; }
        -  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {
        -    color: #c7ddef; }
        -
        -.list-group-item-success {
        -  color: #3c763d;
        -  background-color: #dff0d8; }
        -
        -a.list-group-item-success,
        -button.list-group-item-success {
        -  color: #3c763d; }
        -  a.list-group-item-success .list-group-item-heading,
        -  button.list-group-item-success .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-success:hover, a.list-group-item-success:focus,
        -  button.list-group-item-success:hover,
        -  button.list-group-item-success:focus {
        -    color: #3c763d;
        -    background-color: #d0e9c6; }
        -  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,
        -  button.list-group-item-success.active,
        -  button.list-group-item-success.active:hover,
        -  button.list-group-item-success.active:focus {
        -    color: #fff;
        -    background-color: #3c763d;
        -    border-color: #3c763d; }
        -
        -.list-group-item-info {
        -  color: #31708f;
        -  background-color: #d9edf7; }
        -
        -a.list-group-item-info,
        -button.list-group-item-info {
        -  color: #31708f; }
        -  a.list-group-item-info .list-group-item-heading,
        -  button.list-group-item-info .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-info:hover, a.list-group-item-info:focus,
        -  button.list-group-item-info:hover,
        -  button.list-group-item-info:focus {
        -    color: #31708f;
        -    background-color: #c4e3f3; }
        -  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,
        -  button.list-group-item-info.active,
        -  button.list-group-item-info.active:hover,
        -  button.list-group-item-info.active:focus {
        -    color: #fff;
        -    background-color: #31708f;
        -    border-color: #31708f; }
        -
        -.list-group-item-warning {
        -  color: #8a6d3b;
        -  background-color: #fcf8e3; }
        -
        -a.list-group-item-warning,
        -button.list-group-item-warning {
        -  color: #8a6d3b; }
        -  a.list-group-item-warning .list-group-item-heading,
        -  button.list-group-item-warning .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-warning:hover, a.list-group-item-warning:focus,
        -  button.list-group-item-warning:hover,
        -  button.list-group-item-warning:focus {
        -    color: #8a6d3b;
        -    background-color: #faf2cc; }
        -  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,
        -  button.list-group-item-warning.active,
        -  button.list-group-item-warning.active:hover,
        -  button.list-group-item-warning.active:focus {
        -    color: #fff;
        -    background-color: #8a6d3b;
        -    border-color: #8a6d3b; }
        -
        -.list-group-item-danger {
        -  color: #a94442;
        -  background-color: #f2dede; }
        -
        -a.list-group-item-danger,
        -button.list-group-item-danger {
        -  color: #a94442; }
        -  a.list-group-item-danger .list-group-item-heading,
        -  button.list-group-item-danger .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-danger:hover, a.list-group-item-danger:focus,
        -  button.list-group-item-danger:hover,
        -  button.list-group-item-danger:focus {
        -    color: #a94442;
        -    background-color: #ebcccc; }
        -  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,
        -  button.list-group-item-danger.active,
        -  button.list-group-item-danger.active:hover,
        -  button.list-group-item-danger.active:focus {
        -    color: #fff;
        -    background-color: #a94442;
        -    border-color: #a94442; }
        -
        -.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;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }
        -
        -.panel-body {
        -  padding: 15px; }
        -  .panel-body:before, .panel-body:after {
        -    content: " ";
        -    display: table; }
        -  .panel-body:after {
        -    clear: both; }
        -
        -.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,
        -  .panel-title > small,
        -  .panel-title > .small,
        -  .panel-title > small > a,
        -  .panel-title > .small > 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 > .list-group,
        -.panel > .panel-collapse > .list-group {
        -  margin-bottom: 0; }
        -  .panel > .list-group .list-group-item,
        -  .panel > .panel-collapse > .list-group .list-group-item {
        -    border-width: 1px 0;
        -    border-radius: 0; }
        -  .panel > .list-group:first-child .list-group-item:first-child,
        -  .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
        -    border-top: 0;
        -    border-top-right-radius: 3px;
        -    border-top-left-radius: 3px; }
        -  .panel > .list-group:last-child .list-group-item:last-child,
        -  .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
        -    border-bottom: 0;
        -    border-bottom-right-radius: 3px;
        -    border-bottom-left-radius: 3px; }
        -
        -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.panel-heading + .list-group .list-group-item:first-child {
        -  border-top-width: 0; }
        -
        -.list-group + .panel-footer {
        -  border-top-width: 0; }
        -
        -.panel > .table,
        -.panel > .table-responsive > .table,
        -.panel > .panel-collapse > .table {
        -  margin-bottom: 0; }
        -  .panel > .table caption,
        -  .panel > .table-responsive > .table caption,
        -  .panel > .panel-collapse > .table caption {
        -    padding-left: 15px;
        -    padding-right: 15px; }
        -
        -.panel > .table:first-child,
        -.panel > .table-responsive:first-child > .table:first-child {
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px; }
        -  .panel > .table:first-child > thead:first-child > tr:first-child,
        -  .panel > .table:first-child > tbody:first-child > tr:first-child,
        -  .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
        -  .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
        -    border-top-left-radius: 3px;
        -    border-top-right-radius: 3px; }
        -    .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
        -    .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
        -      border-top-left-radius: 3px; }
        -    .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
        -    .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
        -      border-top-right-radius: 3px; }
        -
        -.panel > .table:last-child,
        -.panel > .table-responsive:last-child > .table:last-child {
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px; }
        -  .panel > .table:last-child > tbody:last-child > tr:last-child,
        -  .panel > .table:last-child > tfoot:last-child > tr:last-child,
        -  .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
        -  .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
        -    border-bottom-left-radius: 3px;
        -    border-bottom-right-radius: 3px; }
        -    .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
        -    .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
        -      border-bottom-left-radius: 3px; }
        -    .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
        -    .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
        -      border-bottom-right-radius: 3px; }
        -
        -.panel > .panel-body + .table,
        -.panel > .panel-body + .table-responsive,
        -.panel > .table + .panel-body,
        -.panel > .table-responsive + .panel-body {
        -  border-top: 1px solid #ddd; }
        -
        -.panel > .table > tbody:first-child > tr:first-child th,
        -.panel > .table > tbody:first-child > tr: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-bordered > thead > tr > td:first-child,
        -  .panel > .table-bordered > tbody > tr > th:first-child,
        -  .panel > .table-bordered > tbody > tr > td:first-child,
        -  .panel > .table-bordered > tfoot > tr > th:first-child,
        -  .panel > .table-bordered > tfoot > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr > td:last-child,
        -  .panel > .table-bordered > tbody > tr > th:last-child,
        -  .panel > .table-bordered > tbody > tr > td:last-child,
        -  .panel > .table-bordered > tfoot > tr > th:last-child,
        -  .panel > .table-bordered > tfoot > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
        -    border-right: 0; }
        -  .panel > .table-bordered > thead > tr:first-child > td,
        -  .panel > .table-bordered > thead > tr:first-child > th,
        -  .panel > .table-bordered > tbody > tr:first-child > td,
        -  .panel > .table-bordered > tbody > tr:first-child > th,
        -  .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
        -  .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
        -    border-bottom: 0; }
        -  .panel > .table-bordered > tbody > tr:last-child > td,
        -  .panel > .table-bordered > tbody > tr:last-child > th,
        -  .panel > .table-bordered > tfoot > tr:last-child > td,
        -  .panel > .table-bordered > tfoot > tr:last-child > th,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
        -    border-bottom: 0; }
        -
        -.panel > .table-responsive {
        -  border: 0;
        -  margin-bottom: 0; }
        -
        -.panel-group {
        -  margin-bottom: 20px; }
        -  .panel-group .panel {
        -    margin-bottom: 0;
        -    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,
        -    .panel-group .panel-heading + .panel-collapse > .list-group {
        -      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: #333333;
        -    background-color: #f5f5f5;
        -    border-color: #ddd; }
        -    .panel-default > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #ddd; }
        -    .panel-default > .panel-heading .badge {
        -      color: #f5f5f5;
        -      background-color: #333333; }
        -  .panel-default > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #ddd; }
        -
        -.panel-primary {
        -  border-color: #337ab7; }
        -  .panel-primary > .panel-heading {
        -    color: #fff;
        -    background-color: #337ab7;
        -    border-color: #337ab7; }
        -    .panel-primary > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #337ab7; }
        -    .panel-primary > .panel-heading .badge {
        -      color: #337ab7;
        -      background-color: #fff; }
        -  .panel-primary > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #337ab7; }
        -
        -.panel-success {
        -  border-color: #d6e9c6; }
        -  .panel-success > .panel-heading {
        -    color: #3c763d;
        -    background-color: #dff0d8;
        -    border-color: #d6e9c6; }
        -    .panel-success > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #d6e9c6; }
        -    .panel-success > .panel-heading .badge {
        -      color: #dff0d8;
        -      background-color: #3c763d; }
        -  .panel-success > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #d6e9c6; }
        -
        -.panel-info {
        -  border-color: #bce8f1; }
        -  .panel-info > .panel-heading {
        -    color: #31708f;
        -    background-color: #d9edf7;
        -    border-color: #bce8f1; }
        -    .panel-info > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #bce8f1; }
        -    .panel-info > .panel-heading .badge {
        -      color: #d9edf7;
        -      background-color: #31708f; }
        -  .panel-info > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #bce8f1; }
        -
        -.panel-warning {
        -  border-color: #faebcc; }
        -  .panel-warning > .panel-heading {
        -    color: #8a6d3b;
        -    background-color: #fcf8e3;
        -    border-color: #faebcc; }
        -    .panel-warning > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #faebcc; }
        -    .panel-warning > .panel-heading .badge {
        -      color: #fcf8e3;
        -      background-color: #8a6d3b; }
        -  .panel-warning > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #faebcc; }
        -
        -.panel-danger {
        -  border-color: #ebccd1; }
        -  .panel-danger > .panel-heading {
        -    color: #a94442;
        -    background-color: #f2dede;
        -    border-color: #ebccd1; }
        -    .panel-danger > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #ebccd1; }
        -    .panel-danger > .panel-heading .badge {
        -      color: #f2dede;
        -      background-color: #a94442; }
        -  .panel-danger > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #ebccd1; }
        -
        -.embed-responsive {
        -  position: relative;
        -  display: block;
        -  height: 0;
        -  padding: 0;
        -  overflow: hidden; }
        -  .embed-responsive .embed-responsive-item,
        -  .embed-responsive iframe,
        -  .embed-responsive embed,
        -  .embed-responsive object,
        -  .embed-responsive video {
        -    position: absolute;
        -    top: 0;
        -    left: 0;
        -    bottom: 0;
        -    height: 100%;
        -    width: 100%;
        -    border: 0; }
        -
        -.embed-responsive-16by9 {
        -  padding-bottom: 56.25%; }
        -
        -.embed-responsive-4by3 {
        -  padding-bottom: 75%; }
        -
        -.well {
        -  min-height: 20px;
        -  padding: 19px;
        -  margin-bottom: 20px;
        -  background-color: #f5f5f5;
        -  border: 1px solid #e3e3e3;
        -  border-radius: 4px;
        -  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: 0.2;
        -  filter: alpha(opacity=20); }
        -  .close:hover, .close:focus {
        -    color: #000;
        -    text-decoration: none;
        -    cursor: pointer;
        -    opacity: 0.5;
        -    filter: alpha(opacity=50); }
        -
        -button.close {
        -  padding: 0;
        -  cursor: pointer;
        -  background: transparent;
        -  border: 0;
        -  -webkit-appearance: none; }
        -
        -.modal-open {
        -  overflow: hidden; }
        -
        -.modal {
        -  display: none;
        -  overflow: hidden;
        -  position: fixed;
        -  top: 0;
        -  right: 0;
        -  bottom: 0;
        -  left: 0;
        -  z-index: 1050;
        -  -webkit-overflow-scrolling: touch;
        -  outline: 0; }
        -  .modal.fade .modal-dialog {
        -    -webkit-transform: translate(0, -25%);
        -    transform: translate(0, -25%);
        -    transition: -webkit-transform 0.3s ease-out;
        -    transition: transform 0.3s ease-out; }
        -  .modal.in .modal-dialog {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0); }
        -
        -.modal-open .modal {
        -  overflow-x: hidden;
        -  overflow-y: auto; }
        -
        -.modal-dialog {
        -  position: relative;
        -  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;
        -  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
        -  background-clip: padding-box;
        -  outline: 0; }
        -
        -.modal-backdrop {
        -  position: fixed;
        -  top: 0;
        -  right: 0;
        -  bottom: 0;
        -  left: 0;
        -  z-index: 1040;
        -  background-color: #000; }
        -  .modal-backdrop.fade {
        -    opacity: 0;
        -    filter: alpha(opacity=0); }
        -  .modal-backdrop.in {
        -    opacity: 0.5;
        -    filter: alpha(opacity=50); }
        -
        -.modal-header {
        -  padding: 15px;
        -  border-bottom: 1px solid #e5e5e5; }
        -  .modal-header:before, .modal-header:after {
        -    content: " ";
        -    display: table; }
        -  .modal-header:after {
        -    clear: both; }
        -
        -.modal-header .close {
        -  margin-top: -2px; }
        -
        -.modal-title {
        -  margin: 0;
        -  line-height: 1.428571429; }
        -
        -.modal-body {
        -  position: relative;
        -  padding: 15px; }
        -
        -.modal-footer {
        -  padding: 15px;
        -  text-align: right;
        -  border-top: 1px solid #e5e5e5; }
        -  .modal-footer:before, .modal-footer:after {
        -    content: " ";
        -    display: table; }
        -  .modal-footer:after {
        -    clear: both; }
        -  .modal-footer .btn + .btn {
        -    margin-left: 5px;
        -    margin-bottom: 0; }
        -  .modal-footer .btn-group .btn + .btn {
        -    margin-left: -1px; }
        -  .modal-footer .btn-block + .btn-block {
        -    margin-left: 0; }
        -
        -.modal-scrollbar-measure {
        -  position: absolute;
        -  top: -9999px;
        -  width: 50px;
        -  height: 50px;
        -  overflow: scroll; }
        -
        -@media (min-width: 768px) {
        -  .modal-dialog {
        -    width: 600px;
        -    margin: 30px auto; }
        -  .modal-content {
        -    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }
        -  .modal-sm {
        -    width: 300px; } }
        -
        -@media (min-width: 992px) {
        -  .modal-lg {
        -    width: 900px; } }
        -
        -.tooltip {
        -  position: absolute;
        -  z-index: 1070;
        -  display: block;
        -  font-family: "Lato", sans-serif;
        -  font-style: normal;
        -  font-weight: normal;
        -  letter-spacing: normal;
        -  line-break: auto;
        -  line-height: 1.428571429;
        -  text-align: left;
        -  text-align: start;
        -  text-decoration: none;
        -  text-shadow: none;
        -  text-transform: none;
        -  white-space: normal;
        -  word-break: normal;
        -  word-spacing: normal;
        -  word-wrap: normal;
        -  font-size: 12px;
        -  opacity: 0;
        -  filter: alpha(opacity=0); }
        -  .tooltip.in {
        -    opacity: 0.9;
        -    filter: alpha(opacity=90); }
        -  .tooltip.top {
        -    margin-top: -3px;
        -    padding: 5px 0; }
        -  .tooltip.right {
        -    margin-left: 3px;
        -    padding: 0 5px; }
        -  .tooltip.bottom {
        -    margin-top: 3px;
        -    padding: 5px 0; }
        -  .tooltip.left {
        -    margin-left: -3px;
        -    padding: 0 5px; }
        -
        -.tooltip-inner {
        -  max-width: 200px;
        -  padding: 3px 8px;
        -  color: #fff;
        -  text-align: center;
        -  background-color: #000;
        -  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-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.top-left .tooltip-arrow {
        -  bottom: 0;
        -  right: 5px;
        -  margin-bottom: -5px;
        -  border-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.top-right .tooltip-arrow {
        -  bottom: 0;
        -  left: 5px;
        -  margin-bottom: -5px;
        -  border-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.right .tooltip-arrow {
        -  top: 50%;
        -  left: 0;
        -  margin-top: -5px;
        -  border-width: 5px 5px 5px 0;
        -  border-right-color: #000; }
        -
        -.tooltip.left .tooltip-arrow {
        -  top: 50%;
        -  right: 0;
        -  margin-top: -5px;
        -  border-width: 5px 0 5px 5px;
        -  border-left-color: #000; }
        -
        -.tooltip.bottom .tooltip-arrow {
        -  top: 0;
        -  left: 50%;
        -  margin-left: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.tooltip.bottom-left .tooltip-arrow {
        -  top: 0;
        -  right: 5px;
        -  margin-top: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.tooltip.bottom-right .tooltip-arrow {
        -  top: 0;
        -  left: 5px;
        -  margin-top: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.popover {
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  z-index: 1060;
        -  display: none;
        -  max-width: 276px;
        -  padding: 1px;
        -  font-family: "Lato", sans-serif;
        -  font-style: normal;
        -  font-weight: normal;
        -  letter-spacing: normal;
        -  line-break: auto;
        -  line-height: 1.428571429;
        -  text-align: left;
        -  text-align: start;
        -  text-decoration: none;
        -  text-shadow: none;
        -  text-transform: none;
        -  white-space: normal;
        -  word-break: normal;
        -  word-spacing: normal;
        -  word-wrap: normal;
        -  font-size: 14px;
        -  background-color: #fff;
        -  background-clip: padding-box;
        -  border: 1px solid #ccc;
        -  border: 1px solid rgba(0, 0, 0, 0.2);
        -  border-radius: 6px;
        -  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }
        -  .popover.top {
        -    margin-top: -10px; }
        -  .popover.right {
        -    margin-left: 10px; }
        -  .popover.bottom {
        -    margin-top: 10px; }
        -  .popover.left {
        -    margin-left: -10px; }
        -
        -.popover-title {
        -  margin: 0;
        -  padding: 8px 14px;
        -  font-size: 14px;
        -  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 {
        -  left: 50%;
        -  margin-left: -11px;
        -  border-bottom-width: 0;
        -  border-top-color: #999999;
        -  border-top-color: rgba(0, 0, 0, 0.25);
        -  bottom: -11px; }
        -  .popover.top > .arrow:after {
        -    content: " ";
        -    bottom: 1px;
        -    margin-left: -10px;
        -    border-bottom-width: 0;
        -    border-top-color: #fff; }
        -
        -.popover.right > .arrow {
        -  top: 50%;
        -  left: -11px;
        -  margin-top: -11px;
        -  border-left-width: 0;
        -  border-right-color: #999999;
        -  border-right-color: rgba(0, 0, 0, 0.25); }
        -  .popover.right > .arrow:after {
        -    content: " ";
        -    left: 1px;
        -    bottom: -10px;
        -    border-left-width: 0;
        -    border-right-color: #fff; }
        -
        -.popover.bottom > .arrow {
        -  left: 50%;
        -  margin-left: -11px;
        -  border-top-width: 0;
        -  border-bottom-color: #999999;
        -  border-bottom-color: rgba(0, 0, 0, 0.25);
        -  top: -11px; }
        -  .popover.bottom > .arrow:after {
        -    content: " ";
        -    top: 1px;
        -    margin-left: -10px;
        -    border-top-width: 0;
        -    border-bottom-color: #fff; }
        -
        -.popover.left > .arrow {
        -  top: 50%;
        -  right: -11px;
        -  margin-top: -11px;
        -  border-right-width: 0;
        -  border-left-color: #999999;
        -  border-left-color: rgba(0, 0, 0, 0.25); }
        -  .popover.left > .arrow:after {
        -    content: " ";
        -    right: 1px;
        -    border-right-width: 0;
        -    border-left-color: #fff;
        -    bottom: -10px; }
        -
        -.carousel {
        -  position: relative; }
        -
        -.carousel-inner {
        -  position: relative;
        -  overflow: hidden;
        -  width: 100%; }
        -  .carousel-inner > .item {
        -    display: none;
        -    position: relative;
        -    transition: 0.6s ease-in-out left; }
        -    .carousel-inner > .item > img,
        -    .carousel-inner > .item > a > img {
        -      display: block;
        -      max-width: 100%;
        -      height: auto;
        -      line-height: 1; }
        -    @media all and (transform-3d), (-webkit-transform-3d) {
        -      .carousel-inner > .item {
        -        transition: -webkit-transform 0.6s ease-in-out;
        -        transition: transform 0.6s ease-in-out;
        -        -webkit-backface-visibility: hidden;
        -        backface-visibility: hidden;
        -        -webkit-perspective: 1000px;
        -        perspective: 1000px; }
        -        .carousel-inner > .item.next, .carousel-inner > .item.active.right {
        -          -webkit-transform: translate3d(100%, 0, 0);
        -          transform: translate3d(100%, 0, 0);
        -          left: 0; }
        -        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {
        -          -webkit-transform: translate3d(-100%, 0, 0);
        -          transform: translate3d(-100%, 0, 0);
        -          left: 0; }
        -        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {
        -          -webkit-transform: translate3d(0, 0, 0);
        -          transform: translate3d(0, 0, 0);
        -          left: 0; } }
        -  .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;
        -  left: 0;
        -  bottom: 0;
        -  width: 15%;
        -  opacity: 0.5;
        -  filter: alpha(opacity=50);
        -  font-size: 20px;
        -  color: #fff;
        -  text-align: center;
        -  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
        -  background-color: transparent; }
        -  .carousel-control.left {
        -    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 {
        -    left: auto;
        -    right: 0;
        -    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 {
        -    outline: 0;
        -    color: #fff;
        -    text-decoration: none;
        -    opacity: 0.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%;
        -    margin-top: -10px;
        -    z-index: 5;
        -    display: inline-block; }
        -  .carousel-control .icon-prev,
        -  .carousel-control .glyphicon-chevron-left {
        -    left: 50%;
        -    margin-left: -10px; }
        -  .carousel-control .icon-next,
        -  .carousel-control .glyphicon-chevron-right {
        -    right: 50%;
        -    margin-right: -10px; }
        -  .carousel-control .icon-prev,
        -  .carousel-control .icon-next {
        -    width: 20px;
        -    height: 20px;
        -    line-height: 1;
        -    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%;
        -  margin-left: -30%;
        -  padding-left: 0;
        -  list-style: none;
        -  text-align: center; }
        -  .carousel-indicators li {
        -    display: inline-block;
        -    width: 10px;
        -    height: 10px;
        -    margin: 1px;
        -    text-indent: -999px;
        -    border: 1px solid #fff;
        -    border-radius: 10px;
        -    cursor: pointer;
        -    background-color: #000 \9;
        -    background-color: transparent; }
        -  .carousel-indicators .active {
        -    margin: 0;
        -    width: 12px;
        -    height: 12px;
        -    background-color: #fff; }
        -
        -.carousel-caption {
        -  position: absolute;
        -  left: 15%;
        -  right: 15%;
        -  bottom: 20px;
        -  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 .glyphicon-chevron-left,
        -  .carousel-control .glyphicon-chevron-right,
        -  .carousel-control .icon-prev,
        -  .carousel-control .icon-next {
        -    width: 30px;
        -    height: 30px;
        -    margin-top: -10px;
        -    font-size: 30px; }
        -  .carousel-control .glyphicon-chevron-left,
        -  .carousel-control .icon-prev {
        -    margin-left: -10px; }
        -  .carousel-control .glyphicon-chevron-right,
        -  .carousel-control .icon-next {
        -    margin-right: -10px; }
        -  .carousel-caption {
        -    left: 20%;
        -    right: 20%;
        -    padding-bottom: 30px; }
        -  .carousel-indicators {
        -    bottom: 20px; } }
        -
        -.clearfix:before, .clearfix:after {
        -  content: " ";
        -  display: table; }
        -
        -.clearfix:after {
        -  clear: both; }
        -
        -.center-block {
        -  display: block;
        -  margin-left: auto;
        -  margin-right: 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; }
        -
        -.affix {
        -  position: fixed; }
        -
        -@-ms-viewport {
        -  width: device-width; }
        -
        -.visible-xs {
        -  display: none !important; }
        -
        -.visible-sm {
        -  display: none !important; }
        -
        -.visible-md {
        -  display: none !important; }
        -
        -.visible-lg {
        -  display: none !important; }
        -
        -.visible-xs-block,
        -.visible-xs-inline,
        -.visible-xs-inline-block,
        -.visible-sm-block,
        -.visible-sm-inline,
        -.visible-sm-inline-block,
        -.visible-md-block,
        -.visible-md-inline,
        -.visible-md-inline-block,
        -.visible-lg-block,
        -.visible-lg-inline,
        -.visible-lg-inline-block {
        -  display: none !important; }
        -
        -@media (max-width: 767px) {
        -  .visible-xs {
        -    display: block !important; }
        -  table.visible-xs {
        -    display: table !important; }
        -  tr.visible-xs {
        -    display: table-row !important; }
        -  th.visible-xs,
        -  td.visible-xs {
        -    display: table-cell !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-block {
        -    display: block !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-inline {
        -    display: inline !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm {
        -    display: block !important; }
        -  table.visible-sm {
        -    display: table !important; }
        -  tr.visible-sm {
        -    display: table-row !important; }
        -  th.visible-sm,
        -  td.visible-sm {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-block {
        -    display: block !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md {
        -    display: block !important; }
        -  table.visible-md {
        -    display: table !important; }
        -  tr.visible-md {
        -    display: table-row !important; }
        -  th.visible-md,
        -  td.visible-md {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-block {
        -    display: block !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg {
        -    display: block !important; }
        -  table.visible-lg {
        -    display: table !important; }
        -  tr.visible-lg {
        -    display: table-row !important; }
        -  th.visible-lg,
        -  td.visible-lg {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-block {
        -    display: block !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (max-width: 767px) {
        -  .hidden-xs {
        -    display: none !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .hidden-sm {
        -    display: none !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .hidden-md {
        -    display: none !important; } }
        -
        -@media (min-width: 1200px) {
        -  .hidden-lg {
        -    display: none !important; } }
        -
        -.visible-print {
        -  display: none !important; }
        -
        -@media print {
        -  .visible-print {
        -    display: block !important; }
        -  table.visible-print {
        -    display: table !important; }
        -  tr.visible-print {
        -    display: table-row !important; }
        -  th.visible-print,
        -  td.visible-print {
        -    display: table-cell !important; } }
        -
        -.visible-print-block {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-block {
        -      display: block !important; } }
        -
        -.visible-print-inline {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-inline {
        -      display: inline !important; } }
        -
        -.visible-print-inline-block {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-inline-block {
        -      display: inline-block !important; } }
        -
        -@media print {
        -  .hidden-print {
        -    display: none !important; } }
        -
        -/*# sourceMappingURL=app.css.map */
        diff --git a/public/assets/css/compiled/app.css.map b/public/assets/css/compiled/app.css.map
        deleted file mode 100644
        index 345d88bf80..0000000000
        --- a/public/assets/css/compiled/app.css.map
        +++ /dev/null
        @@ -1 +0,0 @@
        -{"version":3,"sources":["app.css","app.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/_bootstrap.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_normalize.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_print.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_glyphicons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_tab-focus.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_image.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_type.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_background-variant.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_clearfix.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-overflow.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid-framework.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_table-row.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_opacity.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-divider.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-filter.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_border-radius.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_input-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navbar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pager.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_jumbotron.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_thumbnails.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_progress-bars.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_gradients.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_progress-bar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_media.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-embed.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_wells.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_modals.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tooltip.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_center-block.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_hide-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss"],"names":[],"mappings":"AAAA,iBAAiB;ACAjB,0DAAY;ACAZ;;;;GAIG;ACJH,4EAA4E;AAQ5E;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,+BAA+B,EAChC;;AAMD;EACE,UAAU,EACX;;AAYD;;;;;;;;;;;;;EAaE,eAAe,EAChB;;AAOD;;;;EAIE,sBAAsB;EACtB,yBAAyB,EAC1B;;AAOD;EACE,cAAc;EACd,UAAU,EACX;;AH3BD;;EGoCE,cAAc,EACf;;AASD;EACE,8BAA8B,EAC/B;;AAOD;;EAEE,WAAW,EACZ;;AASD;EACE,0BAA0B,EAC3B;;AAMD;;EAEE,kBAAkB,EACnB;;AAMD;EACE,mBAAmB,EACpB;;AAOD;EACE,eAAe;EACf,iBAAiB,EAClB;;AAMD;EACE,iBAAiB;EACjB,YAAY,EACb;;AAMD;EACE,eAAe,EAChB;;AAMD;;EAEE,eAAe;EACf,eAAe;EACf,mBAAmB;EACnB,yBAAyB,EAC1B;;AAED;EACE,YAAY,EACb;;AAED;EACE,gBAAgB,EACjB;;AASD;EACE,UAAU,EACX;;AAMD;EACE,iBAAiB,EAClB;;AASD;EACE,iBAAiB,EAClB;;AAMD;EACE,wBAAwB;EACxB,UAAU,EACX;;AAMD;EACE,eAAe,EAChB;;AAMD;;;;EAIE,kCAAkC;EAClC,eAAe,EAChB;;AAiBD;;;;;EAKE,eAAe;EACf,cAAc;EACd,UAAU,EACX;;AAMD;EACE,kBAAkB,EACnB;;AASD;;EAEE,qBAAqB,EACtB;;AAUD;;;;EAIE,2BAA2B;EAC3B,gBAAgB,EACjB;;AAMD;;EAEE,gBAAgB,EACjB;;AAMD;;EAEE,UAAU;EACV,WAAW,EACZ;;AAOD;EACE,oBAAoB,EACrB;;AAUD;;EAEE,uBAAuB;EACvB,WAAW,EACZ;;AAQD;;EAEE,aAAa,EACd;;AAOD;EACE,8BAA8B;EAC9B,wBAAwB,EACzB;;AAQD;;EAEE,yBAAyB,EAC1B;;AAMD;EACE,0BAA0B;EAC1B,cAAc;EACd,+BAA+B,EAChC;;AAOD;EACE,UAAU;EACV,WAAW,EACZ;;AAMD;EACE,eAAe,EAChB;;AAOD;EACE,kBAAkB,EACnB;;AASD;EACE,0BAA0B;EAC1B,kBAAkB,EACnB;;AAED;;EAEE,WAAW,EACZ;;ACvaD,qFAAqF;AAOrF;EACI;;;IAGI,mCAAmC;IACnC,uBAAuB;IACvB,4BAA4B;IAC5B,6BAA6B,EAChC;EAED;;IAEI,2BAA2B,EAC9B;EAED;IACI,6BAA4B,EAC/B;EAED;IACI,8BAA6B,EAChC;EAID;;IAEI,YAAY,EACf;EAED;;IAEI,uBAAuB;IACvB,yBAAyB,EAC5B;EAED;IACI,4BAA4B,EAC/B;EAED;;IAEI,yBAAyB,EAC5B;EAED;IACI,2BAA2B,EAC9B;EAED;;;IAGI,WAAW;IACX,UAAU,EACb;EAED;;IAEI,wBAAwB,EAC3B;EAKD;IACI,cAAc,EACjB;EACD;;IAGQ,kCAAkC,EACrC;EAEL;IACI,uBAAuB,EAC1B;EAED;IACI,qCAAqC,EAMxC;IAPD;;MAKQ,kCAAkC,EACrC;EAEL;;IAGQ,kCAAkC,EACrC,EAAA;;ACrFP;EACE,oCAAoC;EACpC,gEAAQ;EACR,kbAImM,EAAA;;AAKvM;EACE,mBAAmB;EACnB,SAAS;EACT,sBAAsB;EACtB,oCAAoC;EACpC,mBAAmB;EACnB,oBAAoB;EACpB,eAAe;EACf,oCAAoC;EACpC,mCAAmC,EACpC;;AAGD;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;;EAC+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AASpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;ACxSpE;ECkEU,uBDjEsB,EAC/B;;AACD;;EC+DU,uBD7DsB,EAC/B;;AAKD;EACE,gBAAgB;EAChB,yCAAiC,EAClC;;AAED;EACE,gCL1ByC;EK2BzC,gBEuB4B;EFtB5B,yBEkCmC;EFjCnC,eElB8B;EFmB9B,uBEF0B,EFG3B;;AAGD;;;;EAIE,qBAAqB;EACrB,mBAAmB;EACnB,qBAAqB,EACtB;;AAKD;EACE,eE/B4B;EFgC5B,sBAAsB,EAWvB;EAbD;IAMI,eEjB0B;IFkB1B,2BEhB6B,EFiB9B;EARH;IG3CE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EHoDpB;;AASH;EACE,UAAU,EACX;;AAKD;EACE,uBAAuB,EACxB;;AAGD;EIvEE,eADmC;EAEnC,gBAAgB;EAChB,aAAa,EJuEd;;AAGD;EACE,mBEwB6B,EFvB9B;;AAKD;EACE,aEgpB+B;EF/oB/B,yBE/BmC;EFgCnC,uBElE0B;EFmE1B,uBEipBgC;EFhpBhC,mBEY6B;ED8ErB,iCDzF+B;EIzFvC,sBJ4FoC;EI3FpC,gBAAgB;EAChB,aAAa,EJ2Fd;;AAGD;EACE,mBAAmB,EACpB;;AAKD;EACE,iBEhD6B;EFiD7B,oBEjD6B;EFkD7B,UAAU;EACV,8BErG8B,EFsG/B;;AAOD;EACE,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;EACb,WAAW;EACX,iBAAiB;EACjB,uBAAU;EACV,UAAU,EACX;;AAMD;EAGI,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,UAAU;EACV,kBAAkB;EAClB,WAAW,EACZ;;AN69BH;EMl9BE,gBAAgB,EACjB;;AKxJD;;EAEE,qBH0D+B;EGzD/B,iBH0D2B;EGzD3B,iBH0D2B;EGzD3B,eH0D+B,EGlDhC;EAbD;;;;;;;;;;;;;;IASI,oBAAoB;IACpB,eAAe;IACf,eHL4B,EGM7B;;AAGH;;;EAGE,iBHuC6B;EGtC7B,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAEH;;;EAGE,iBAAkC;EAClC,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAGH;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHCoB,EGDQ;;AACtC;EAAU,gBHSoB,EGTQ;;AAMtC;EACE,iBAAkC,EACnC;;AAED;EACE,oBHG6B;EGF7B,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB,EAKlB;EAHC;IANF;MAOI,gBAA2B,EAE9B,EAAA;;AAOD;;EAEE,eAAgB,EACjB;;AAED;;EAEE,0BH4asC;EG3atC,cAAc,EACf;;AAGD;EAAuB,iBAAiB,EAAI;;AAC5C;EAAuB,kBAAkB,EAAI;;AAC7C;EAAuB,mBAAmB,EAAI;;AAC9C;EAAuB,oBAAoB,EAAI;;AAC/C;EAAuB,oBAAoB,EAAI;;AAG/C;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,2BAA2B,EAAI;;AAGtD;EACE,eHxF8B,EGyF/B;;ACnGC;EACE,eJY0B,EIX3B;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJkfoC,EIjfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJsfoC,EIrfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ0foC,EIzfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ8foC,EI7frC;;AACD;;EACE,eAAa,EACd;;AD6GH;EAGE,YAAY,EACb;;AEtHC;EACE,0BLY0B,EKX3B;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLmfoC,EKlfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLufoC,EKtfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL2foC,EK1frC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL+foC,EK9frC;;AACD;;EACE,0BAAwB,EACzB;;AFgIH;EACE,oBAAuC;EACvC,oBH1E6B;EG2E7B,iCH7H8B,EG8H/B;;AAOD;;EAEE,cAAc;EACd,oBAAqC,EAKtC;EARD;;;;IAMI,iBAAiB,EAClB;;AAWH;EAJE,gBAAgB;EAChB,iBAAiB,EAKlB;;AAID;EAVE,gBAAgB;EAChB,iBAAiB;EAWjB,kBAAkB,EAOnB;EATD;IAKI,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB,EACpB;;AAIH;EACE,cAAc;EACd,oBHzH6B,EG0H9B;;AACD;;EAEE,yBH/HmC,EGgIpC;;AACD;EACE,kBAAkB,EACnB;;AACD;EACE,eAAe,EAChB;;AAOD;EG7LI,aAAa;EACb,eAAe,EAChB;;AH2LH;EGzLI,YAAY,EACb;;AH6LD;EALF;IAOM,YAAY;IACZ,aAA6B;IAC7B,YAAY;IACZ,kBAAkB;IIlNtB,iBAAiB;IACjB,wBAAwB;IACxB,oBAAoB,EJkNjB;EAZL;IAcM,mBH2nB6B,EG1nB9B,EAAA;;AASL;;EAGE,aAAa;EACb,kCH1N8B,EG2N/B;;AACD;EACE,eAAe,EAEhB;;AAGD;EACE,mBHhL6B;EGiL7B,iBHjL6B;EGkL7B,kBH4mB4C;EG3mB5C,+BHrO8B,EG6P/B;EA5BD;;;IAUM,iBAAiB,EAClB;EAXL;;;IAmBI,eAAe;IACf,eAAe;IACf,yBHtMiC;IGuMjC,eHxP4B,EG6P7B;IA3BH;;;MAyBM,uBAAuB,EACxB;;AAOL;;EAEE,oBAAoB;EACpB,gBAAgB;EAChB,gCHtQ8B;EGuQ9B,eAAe;EACf,kBAAkB,EAWnB;EAjBD;;;;;;IAYe,YAAY,EAAI;EAZ/B;;;;;;IAcM,uBAAuB,EACxB;;AAKL;EACE,oBHrO6B;EGsO7B,mBAAmB;EACnB,yBHzOmC,EG0OpC;;AKnSD;;;;EAIE,+DRsCyE,EQrC1E;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,eRmzBmC;EQlzBnC,0BRmzBmC;EQlzBnC,mBR0F6B,EQzF9B;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,YR6yBgC;EQ5yBhC,uBR6yBgC;EQ5yBhC,mBRmF6B;EQlF7B,+CAA+B,EAQhC;EAdD;IASI,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB,EAClB;;AAIH;EACE,eAAe;EACf,eAAgC;EAChC,iBAAkC;EAClC,gBAA2B;EAC3B,yBRkBmC;EQjBnC,sBAAsB;EACtB,sBAAsB;EACtB,eRpC8B;EQqC9B,0BRyxBmC;EQxxBnC,uBR0xBgC;EQzxBhC,mBR0D6B,EQ/C9B;EAtBD;IAeI,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,sBAAsB;IACtB,8BAA8B;IAC9B,iBAAiB,EAClB;;AAIH;EACE,kBR2wBiC;EQ1wBjC,mBAAmB,EACpB;;AC3DD;ECHE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDYpB;EAZD;IHMI,aAAa;IACb,eAAe,EAChB;EGRH;IHUI,YAAY,EACb;EGRD;IAHF;MAII,aT2UiC,ESnUpC,EAAA;EANC;IANF;MAOI,aT6UiC,ESxUpC,EAAA;EAHC;IATF;MAUI,cT+UkC,ES7UrC,EAAA;;AAQD;ECvBE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDsBpB;EAFD;IHdI,aAAa;IACb,eAAe,EAChB;EGYH;IHVI,YAAY,EACb;;AGkBH;ECvBE,mBAAkB;EAClB,oBAAmB,EDwBpB;EAFD;IHvBI,aAAa;IACb,eAAe,EAChB;EGqBH;IHnBI,YAAY,EACb;;AKVD;EACE,mBAAmB;EAEnB,gBAAgB;EAEhB,mBAAmB;EACnB,oBAAoB,EACrB;;AASD;EACE,YAAY,EACb;;AAMC;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAkBD;EACE,YAAY,EACb;;AAPD;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAPD;EACE,WAAW,EACZ;;AAPD;EACE,oBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,WAAgB,EACjB;;AAkBD;EACE,gBAAuB,EACxB;;AAFD;EACE,2BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,kBAAuB,EACxB;;AFEL;EErCE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFWL;EE9CE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFoBL;EEvDE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;ACxDL;EACE,8BZgIyC,EY/H1C;;AACD;EACE,iBZwHiC;EYvHjC,oBZuHiC;EYtHjC,eZG8B;EYF9B,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AAKD;EACE,YAAY;EACZ,gBAAgB;EAChB,oBZyC6B,EYD9B;EA3CD;;;;;;IAWQ,aZiG2B;IYhG3B,yBZ8B6B;IY7B7B,oBAAoB;IACpB,2BZ2G4B,EY1G7B;EAfP;IAoBI,uBAAuB;IACvB,8BZoGgC,EYnGjC;EAtBH;;;;;;IA8BQ,cAAc,EACf;EA/BP;IAoCI,2BZqFgC,EYpFjC;EArCH;IAyCI,uBZjCwB,EYkCzB;;AAMH;;;;;;EAOQ,aZuD2B,EYtD5B;;AAUP;EACE,uBZsDkC,EYrCnC;EAlBD;;;;;;IAQQ,uBZ+C4B,EY9C7B;EATP;;IAeM,yBAAyB,EAC1B;;AASL;EAEI,0BZsBmC,EYrBpC;;AAQH;EAEI,0BZamC,EYZpC;;AAQH;EACE,iBAAiB;EACjB,YAAY;EACZ,sBAAsB,EACvB;;AACD;;EAIM,iBAAiB;EACjB,YAAY;EACZ,oBAAoB,EACrB;;AC7IH;;;;;;;;;;;;EAII,0BbiIiC,EahIlC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb+ekC,Ea9enC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbmfkC,EalfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbufkC,EatfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb2fkC,Ea1fnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;ADwJL;EACE,iBAAiB;EACjB,kBAAkB,EA6DnB;EA3DC;IAJF;MAKI,YAAY;MACZ,oBAAqC;MACrC,mBAAmB;MACnB,6CAA6C;MAC7C,uBZrCgC,EY2FnC;MA/DD;QAaM,iBAAiB,EAalB;QA1BL;;;;;;UAsBY,oBAAoB,EACrB;MAvBX;QA8BM,UAAU,EA+BX;QA7DL;;;;;;UAuCY,eAAe,EAChB;QAxCX;;;;;;UA2CY,gBAAgB,EACjB;QA5CX;;;;UAwDY,iBAAiB,EAClB,EAAA;;AE1NX;EACE,WAAW;EACX,UAAU;EACV,UAAU;EAIV,aAAa,EACd;;AAED;EACE,eAAe;EACf,YAAY;EACZ,WAAW;EACX,oBd0C6B;EczC7B,gBAA2B;EAC3B,qBAAqB;EACrB,edd8B;Ece9B,UAAU;EACV,iCdmMsC,EclMvC;;AAED;EACE,sBAAsB;EACtB,gBAAgB;EAChB,mBAAmB;EACnB,kBAAkB,EACnB;;AAUD;Ef8BU,uBe7BsB,EAC/B;;AAGD;;EAEE,gBAAgB;EAChB,mBAAmB;EACnB,oBAAoB,EACrB;;AAED;EACE,eAAe,EAChB;;AAGD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;;EAEE,aAAa,EACd;;AAGD;;;EbvEE,qBAAqB;EAErB,2CAA2C;EAC3C,qBAAqB,EawEtB;;AAGD;EACE,eAAe;EACf,iBAAoC;EACpC,gBdlC4B;EcmC5B,yBdvBmC;EcwBnC,ed1E8B,Ec2E/B;;AAyBD;EACE,eAAe;EACf,YAAY;EACZ,adiGqD;EchGrD,kBdtB8B;EcuB9B,gBdnE4B;EcoE5B,yBdxDmC;EcyDnC,ed3G8B;Ec4G9B,uBdmEmC;EclEnC,uBAAuB;EACvB,uBdwEmC;EcvEnC,mBdf6B;EDxCrB,iDewDgC;Ef8DhC,yEe7DsE,EAgC/E;EA7CD;ICxDI,sBfsJoC;IerJpC,WAAW;IhBWL,mFgBdS,EAKhB;EDqDH;IfVI,YC2GiC;ID1GjC,WAAW,EACZ;EeQH;IfP4B,YCwGS,EDxGQ;EeO7C;IfNkC,YCuGG,EDvGc;EeMnD;IAuBI,UAAU;IACV,8BAA8B,EAC/B;EAzBH;;IAmCI,0BdrI4B;IcsI5B,WAAW,EACZ;EArCH;;IAyCI,oBd6EwC,Ec5EzC;;AAMH;EACE,aAAa,EACd;;AAUD;EACE,yBAAyB,EAC1B;;AAYD;EACE;;;;IAKI,kBdoBiD,EcnBlD;EANH;;;;;;;;;;;;;;;;;;;;;;IAUI,kBdmBiC,EclBlC;EAXH;;;;;;;;;;;;;;;;;;;;;;IAeI,kBdYgC,EcXjC,EAAA;;AAUL;EACE,oBdKmC,EcJpC;;AAOD;;EAEE,mBAAmB;EACnB,eAAe;EACf,iBAAiB;EACjB,oBAAoB,EASrB;EAdD;;IAQI,iBdtK2B;IcuK3B,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,gBAAgB,EACjB;;AAEH;;;;EAIE,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB,EACpB;;AAED;;EAEE,iBAAiB,EAClB;;AAGD;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB,EACjB;;AACD;;EAEE,cAAc;EACd,kBAAkB,EACnB;;AAMD;;;;;;EAKI,oBd/CwC,EcgDzC;;AAGH;;;;;EAII,oBdvDwC,EcwDzC;;AAGH;;;;;EAKM,oBdhEsC,EciEvC;;AAUL;EAEE,iBAAoC;EACpC,oBAAuC;EAEvC,iBAAiB;EACjB,iBAAkC,EAOnC;EAbD;;;;;IAUI,gBAAgB;IAChB,iBAAiB,EAClB;;ACxPD;;;EACE,afkJmC;EejJnC,kBf6B4B;Ee5B5B,gBfpB0B;EeqB1B,iBfiC2B;EehC3B,mBfoC2B,EenC5B;;AAED;;;EACE,af0ImC;EezInC,kBfyImC,EexIpC;;AAED;;;;;;;EACE,aAAa,EACd;;ADsPH;EAEI,adpHmC;EcqHnC,kBdzO4B;Ec0O5B,gBd1R0B;Ec2R1B,iBdrO2B;EcsO3B,mBdlO2B,EcmO5B;;AAPH;EASI,ad3HmC;Ec4HnC,kBd5HmC,Ec6HpC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,adnImC;EcoInC,iBAAkC;EAClC,kBdzP4B;Ec0P5B,gBd1S0B;Ec2S1B,iBdrP2B,EcsP5B;;AC3RD;;;EACE,afgJkC;Ee/IlC,mBf0B4B;EezB5B,gBfrB0B;EesB1B,uBfgCiC;Ee/BjC,mBfmC2B,EelC5B;;AAED;;;EACE,afwIkC;EevIlC,kBfuIkC,EetInC;;AAED;;;;;;;EACE,aAAa,EACd;;ADgRH;EAEI,adhJkC;EciJlC,mBdtQ4B;EcuQ5B,gBdrT0B;EcsT1B,uBdhQiC;EciQjC,mBd7P2B,Ec8P5B;;AAPH;EASI,advJkC;EcwJlC,kBdxJkC,EcyJnC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ad/JkC;EcgKlC,iBAAkC;EAClC,mBdtR4B;EcuR5B,gBdrU0B;EcsU1B,uBdhRiC,EciRlC;;AAQH;EAEE,mBAAmB,EAMpB;EARD;IAMI,sBAAkC,EACnC;;AAGH;EACE,mBAAmB;EACnB,OAAO;EACP,SAAS;EACT,WAAW;EACX,eAAe;EACf,Yd9LqD;Ec+LrD,ad/LqD;EcgMrD,kBdhMqD;EciMrD,mBAAmB;EACnB,qBAAqB,EACtB;;AACD;;;;;EAGE,YdrMoC;EcsMpC,adtMoC;EcuMpC,kBdvMoC,EcwMrC;;AACD;;;;;EAGE,Yd1MqC;Ec2MrC,ad3MqC;Ec4MrC,kBd5MqC,Ec6MtC;;AAGD;;;;;;;;;;ECxZI,efseoC,EererC;;ADuZH;ECpZI,sBfkeoC;EDlb9B,iDgB/CkC,EAMzC;ED6YH;ICjZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;AD8YL;EC1YI,efwdoC;EevdpC,sBfudoC;EetdpC,0BfudoC,EetdrC;;ADuYH;ECpYI,efkdoC,EejdrC;;ADsYH;;;;;;;;;;EC3ZI,ef8eoC,Ee7erC;;AD0ZH;ECvZI,sBf0eoC;ED1b9B,iDgB/CkC,EAMzC;EDgZH;ICpZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADiZL;EC7YI,efgeoC;Ee/dpC,sBf+doC;Ee9dpC,0Bf+doC,Ee9drC;;AD0YH;ECvYI,ef0doC,EezdrC;;ADyYH;;;;;;;;;;EC9ZI,efkfoC,EejfrC;;AD6ZH;EC1ZI,sBf8eoC;ED9b9B,iDgB/CkC,EAMzC;EDmZH;ICvZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADoZL;EChZI,efoeoC;EenepC,sBfmeoC;EelepC,0BfmeoC,EelerC;;AD6YH;EC1YI,ef8doC,Ee7drC;;AD8YH;EAGI,UAA2B,EAC5B;;AAJH;EAMI,OAAO,EACR;;AASH;EACE,eAAe;EACf,gBAAgB;EAChB,oBAAoB;EACpB,eAAc,EACf;;AAkBC;EAmEF;IAhEM,sBAAsB;IACtB,iBAAiB;IACjB,uBAAuB,EACxB;EA6DL;IAzDM,sBAAsB;IACtB,YAAY;IACZ,uBAAuB,EACxB;EAsDL;IAlDM,sBAAsB,EACvB;EAiDL;IA9CM,sBAAsB;IACtB,uBAAuB,EAOxB;IAsCL;;;MAxCQ,YAAY,EACb;EAuCP;IAlCM,YAAY,EACb;EAiCL;IA9BM,iBAAiB;IACjB,uBAAuB,EACxB;EA4BL;;IAtBM,sBAAsB;IACtB,cAAc;IACd,iBAAiB;IACjB,uBAAuB,EAKxB;IAcL;;MAhBQ,gBAAgB,EACjB;EAeP;;IAXM,mBAAmB;IACnB,eAAe,EAChB;EASL;IALM,OAAO,EACR,EAAA;;AAeL;;;;EASI,cAAc;EACd,iBAAiB;EACjB,iBAAoC,EACrC;;AAZH;;EAiBI,iBAAkC,EACnC;;AAlBH;EJ1hBE,mBAAkB;EAClB,oBAAmB,EIgjBlB;EAvBH;IR1hBI,aAAa;IACb,eAAe,EAChB;EQwhBH;IRthBI,YAAY,EACb;;AQgjBD;EA3BF;IA6BM,kBAAkB;IAClB,iBAAiB;IACjB,iBAAoC,EACrC,EAAA;;AAhCL;EAwCI,YAAY,EACb;;AAOC;EAhDJ;IAkDQ,kBAAqC;IACrC,gBdxiBsB,EcyiBvB,EAAA;;AAIH;EAxDJ;IA0DQ,iBAAqC;IACrC,gBd/iBsB,EcgjBvB,EAAA;;AE7lBP;EACE,sBAAsB;EACtB,iBAAiB;EACjB,oBhB0IqC;EgBzIrC,mBAAmB;EACnB,uBAAuB;EACvB,+BAA2B;EAA3B,2BAA2B;EAC3B,gBAAgB;EAChB,uBAAuB;EACvB,8BAA8B;EAC9B,oBAAoB;EC0CpB,kBjBmC8B;EiBlC9B,gBjBV4B;EiBW5B,yBjBCmC;EiBAnC,mBjB8C6B;ED4G7B,0BiBrMyB;EjBsMtB,uBiBtMsB;EjBuMrB,sBiBvMqB;EjBwMjB,kBiBxMiB,EAkC1B;EA9CD;IfJE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EeqBlB;EApBL;IA0BI,YhBqHiC;IgBpHjC,sBAAsB,EACvB;EA5BH;IAgCI,WAAW;IACX,uBAAuB;IjB4BjB,iDiB3BkC,EACzC;EAnCH;;IAwCI,oBhBuLwC;IkBpO1C,cF8CsB;IE3CtB,0BAAa;InB+DL,iBiBnBkB,EACzB;;AAKH;;EAGI,qBAAqB,EACtB;;AAOH;EC7DE,YjBiJmC;EiBhJnC,uBjBiJmC;EiBhJnC,mBjBiJmC,EgBpFpC;EAFD;ICvDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDoDH;IClDI,YjBsIiC;IiBrIjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+CH;;IC3CI,YjB+HiC;IiB9HjC,0BAAwB;IACpB,sBAAoB,EASzB;IDgCH;;;;MCpCM,YjBwH+B;MiBvH/B,0BAAwB;MACpB,sBAAoB,EACzB;EDiCL;;IC5BI,uBAAuB,EACxB;ED2BH;;;;ICpBM,uBjByG+B;IiBxG3B,mBjByG2B,EiBxGhC;EDkBL;ICdI,YjBmGiC;IiBlGjC,uBjBiGiC,EiBhGlC;;ADeH;EChEE,YjBqJmC;EiBpJnC,0BjBU4B;EiBT5B,sBjBqJqC,EgBrFtC;EAFD;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuDH;ICrDI,YjB0IiC;IiBzIjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkDH;;IC9CI,YjBmIiC;IiBlIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmCH;;;;MCvCM,YjB4H+B;MiB3H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoCL;;IC/BI,uBAAuB,EACxB;ED8BH;;;;ICvBM,0BjB9BwB;IiB+BpB,sBjB6G6B,EiB5GlC;EDqBL;ICjBI,ejBpC0B;IiBqC1B,uBjBqGiC,EiBpGlC;;ADmBH;ECpEE,YjByJmC;EiBxJnC,0BjBW6B;EiBV7B,sBjByJqC,EgBrFtC;EAFD;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED2DH;ICzDI,YjB8IiC;IiB7IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDsDH;;IClDI,YjBuIiC;IiBtIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDuCH;;;;MC3CM,YjBgI+B;MiB/H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDwCL;;ICnCI,uBAAuB,EACxB;EDkCH;;;;IC3BM,0BjB7ByB;IiB8BrB,sBjBiH6B,EiBhHlC;EDyBL;ICrBI,ejBnC2B;IiBoC3B,uBjByGiC,EiBxGlC;;ADuBH;ECxEE,YjB6JmC;EiB5JnC,0BjBY6B;EiBX7B,sBjB6JqC,EgBrFtC;EAFD;IClEI,YjBuJiC;IiBtJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+DH;IC7DI,YjBkJiC;IiBjJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED0DH;;ICtDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID2CH;;;;MC/CM,YjBoI+B;MiBnI/B,0BAAwB;MACpB,sBAAoB,EACzB;ED4CL;;ICvCI,uBAAuB,EACxB;EDsCH;;;;IC/BM,0BjB5ByB;IiB6BrB,sBjBqH6B,EiBpHlC;ED6BL;ICzBI,ejBlC2B;IiBmC3B,uBjB6GiC,EiB5GlC;;AD2BH;EC5EE,YjBiKmC;EiBhKnC,0BjBa6B;EiBZ7B,sBjBiKqC,EgBrFtC;EAFD;ICtEI,YjB2JiC;IiB1JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDmEH;ICjEI,YjBsJiC;IiBrJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED8DH;;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID+CH;;;;MCnDM,YjBwI+B;MiBvI/B,0BAAwB;MACpB,sBAAoB,EACzB;EDgDL;;IC3CI,uBAAuB,EACxB;ED0CH;;;;ICnCM,0BjB3ByB;IiB4BrB,sBjByH6B,EiBxHlC;EDiCL;IC7BI,ejBjC2B;IiBkC3B,uBjBiHiC,EiBhHlC;;AD+BH;EChFE,YjBqKmC;EiBpKnC,0BjBc6B;EiBb7B,sBjBqKqC,EgBrFtC;EAFD;IC1EI,YjB+JiC;IiB9JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuEH;ICrEI,YjB0JiC;IiBzJjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkEH;;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmDH;;;;MCvDM,YjB4I+B;MiB3I/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoDL;;IC/CI,uBAAuB,EACxB;ED8CH;;;;ICvCM,0BjB1ByB;IiB2BrB,sBjB6H6B,EiB5HlC;EDqCL;ICjCI,ejBhC2B;IiBiC3B,uBjBqHiC,EiBpHlC;;ADwCH;EACE,ehB/E4B;EgBgF5B,oBAAoB;EACpB,iBAAiB,EA8BlB;EAjCD;;IAUI,8BAA8B;IjBpCxB,iBiBqCkB,EACzB;EAZH;IAiBI,0BAA0B,EAC3B;EAlBH;IAqBI,ehBhF0B;IgBiF1B,2BhB/E6B;IgBgF7B,8BAA8B,EAC/B;EAxBH;;;IA6BM,ehB9G0B;IgB+G1B,sBAAsB,EACvB;;AAQL;EC1EE,mBjBsC8B;EiBrC9B,gBjBT4B;EiBU5B,uBjB4CmC;EiB3CnC,mBjB+C6B,EgB2B9B;;AACD;EC9EE,kBjByC8B;EiBxC9B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgB8B9B;;AACD;EClFE,iBjB4C6B;EiB3C7B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgBiC9B;;AAMD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;EACE,gBAAgB,EACjB;;AAGD;;;EAII,YAAY,EACb;;AG7JH;EACE,WAAW;EpBiLH,iCoBhL+B,EAIxC;EAND;IAII,WAAW,EACZ;;AAGH;EACE,cAAc,EAKf;EAND;IAGc,eAAe,EAAI;;AAKjC;EAAoB,mBAAmB,EAAI;;AAE3C;EAAoB,yBAAyB,EAAI;;AAEjD;EACE,mBAAmB;EACnB,UAAU;EACV,iBAAiB;EpB+JT,wCoB9JuC;EpBsKvC,2BoBrKyB;EpByKzB,iCoBxKgC,EACzC;;AC9BD;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,uBAAuB;EACvB,uBAAsC;EACtC,yBAAwC;EACxC,oCAAiD;EACjD,mCAAiD,EAClD;;AAGD;;EAEE,mBAAmB,EACpB;;AAGD;EACE,WAAW,EACZ;;AAGD;EACE,mBAAmB;EACnB,UAAU;EACV,QAAQ;EACR,cpBmP6B;EoBlP7B,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,gBpBU4B;EoBT5B,iBAAiB;EACjB,uBpBoMmC;EoBnMnC,uBpBuMmC;EoBtMnC,sCpBoMmC;EoBnMnC,mBpB+D6B;EDxCrB,4CqBtB2B;EACnC,6BAA6B,EAyB9B;EA3CD;IAwBI,SAAS;IACT,WAAW,EACZ;EA1BH;ICzBE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BrB6OsC,EoBxLrC;EA/BH;IAmCI,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ,oBAAoB;IACpB,yBpBNiC;IoBOjC,epB1D4B;IoB2D5B,oBAAoB,EACrB;;AAIH;EAGI,sBAAsB;EACtB,epB0KmC;EoBzKnC,0BpB2KoC,EoB1KrC;;AAIH;EAII,YpBwB4B;EoBvB5B,sBAAsB;EACtB,WAAW;EACX,0BpB5E0B,EoB6E3B;;AAOH;EAII,epB3F4B,EoB4F7B;;AALH;EAUI,sBAAsB;EACtB,8BAA8B;EAC9B,uBAAuB;EE3GzB,oEAAmE;EF6GjE,oBpBoHwC,EoBnHzC;;AAIH;EAGI,eAAe,EAChB;;AAJH;EAQI,WAAW,EACZ;;AAOH;EACE,WAAW;EACX,SAAS,EACV;;AAOD;EACE,QAAQ;EACR,YAAY,EACb;;AAGD;EACE,eAAe;EACf,kBAAkB;EAClB,gBpBtG4B;EoBuG5B,yBpB7FmC;EoB8FnC,epB/I8B;EoBgJ9B,oBAAoB,EACrB;;AAGD;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,UAAU;EACV,OAAO;EACP,aAA0B,EAC3B;;AAGD;EACE,SAAS;EACT,WAAW,EACZ;;AAOD;;EAII,cAAc;EACd,0BAAuC;EACvC,4BAAyC;EACzC,YAAY,EACb;;AARH;;EAWI,UAAU;EACV,aAAa;EACb,mBAAmB,EACpB;;AAQH;EACE;IAEI,SAAS;IAAE,WAAW,EACvB;EAHH;IAOI,QAAQ;IAAE,YAAY,EACvB,EAAA;;AGhNL;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,uBAAuB,EAYxB;EAhBD;;IAMI,mBAAmB;IACnB,YAAY,EAQb;IAfH;;;;;MAaM,WAAW,EACZ;;AAKL;;;;EAKI,kBAAkB,EACnB;;AAIH;EACE,kBAAkB,EAanB;EAdD;IjBnBI,aAAa;IACb,eAAe,EAChB;EiBiBH;IjBfI,YAAY,EACb;EiBcH;;;IAOI,YAAY,EACb;EARH;;;IAYI,iBAAiB,EAClB;;AAGH;EACE,iBAAiB,EAClB;;AAGD;EACE,eAAe,EAIhB;EALD;IChDE,8BDmDgC;IClD7B,2BDkD6B,EAC/B;;AAGH;;EC/CE,6BDiD6B;EChD1B,0BDgD0B,EAC9B;;AAGD;EACE,YAAY,EACb;;AACD;EACE,iBAAiB,EAClB;;AACD;;ECnEE,8BDsEgC;ECrE7B,2BDqE6B,EAC/B;;AAEH;ECjEE,6BDkE6B;ECjE1B,0BDiE0B,EAC9B;;AAGD;;EAEE,WAAW,EACZ;;AAgBD;EACE,kBAAkB;EAClB,mBAAmB,EACpB;;AACD;EACE,mBAAmB;EACnB,oBAAoB,EACrB;;AAID;ExB9CU,iDwB+CgC,EAMzC;EAPD;IxB9CU,iBwBmDkB,EACzB;;AAKH;EACE,eAAe,EAChB;;AAED;EACE,wBAAqD;EACrD,uBAAuB,EACxB;;AAED;EACE,wBvBf6B,EuBgB9B;;AAMD;;;EAII,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,gBAAgB,EACjB;;AARH;EjBhII,aAAa;EACb,eAAe,EAChB;;AiB8HH;EjB5HI,YAAY,EACb;;AiB2HH;EAcM,YAAY,EACb;;AAfL;;;;EAsBI,iBAAiB;EACjB,eAAe,EAChB;;AAGH;EAEI,iBAAiB,EAClB;;AAHH;ECvKE,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BDqKiC;ECpKhC,6BDoKgC,EAChC;;AAPH;ECvKE,2BDgL8B;EC/K7B,0BD+K6B;ECxK9B,gCxBkG6B;EwBjG5B,+BxBiG4B,EuBwE5B;;AAEH;EACE,iBAAiB,EAClB;;AACD;;EC/KE,8BDkLiC;ECjLhC,6BDiLgC,EAChC;;AAEH;EC7LE,2BD8L4B;EC7L3B,0BD6L2B,EAC7B;;AAMD;EACE,eAAe;EACf,YAAY;EACZ,oBAAoB;EACpB,0BAA0B,EAc3B;EAlBD;;IAOI,YAAY;IACZ,oBAAoB;IACpB,UAAU,EACX;EAVH;IAYI,YAAY,EACb;EAbH;IAgBI,WAAW,EACZ;;A/B4oGH;;;;E+BvnGM,mBAAmB;EACnB,uBAAU;EACV,qBAAqB,EACtB;;AE3OL;EACE,mBAAmB;EACnB,eAAe;EACf,0BAA0B,EA2B3B;EA9BD;IAOI,YAAY;IACZ,gBAAgB;IAChB,iBAAiB,EAClB;EAVH;IAeI,mBAAmB;IACnB,WAAW;IAKX,YAAY;IAEZ,YAAY;IACZ,iBAAiB,EAKlB;IA7BH;MA2BM,WAAW,EACZ;;AAuBL;;;EAGE,oBAAoB,EAKrB;EARD;;;IAMI,iBAAiB,EAClB;;AAGH;;EAEE,UAAU;EACV,oBAAoB;EACpB,uBAAuB,EACxB;;AAID;EACE,kBzBkB8B;EyBjB9B,gBzB3B4B;EyB4B5B,oBAAoB;EACpB,eAAe;EACf,ezBpE8B;EyBqE9B,mBAAmB;EACnB,0BzBpE8B;EyBqE9B,uBzB+GmC;EyB9GnC,mBzBwB6B,EyBL9B;EA5BD;;;IAaI,kBzBY4B;IyBX5B,gBzBrC0B;IyBsC1B,mBzBoB2B,EyBnB5B;EAhBH;;;IAkBI,mBzBI4B;IyBH5B,gBzB3C0B;IyB4C1B,mBzBc2B,EyBb5B;EArBH;;IA0BI,cAAc,EACf;;AAIH;;;;;;;EDpGE,8BC2G8B;ED1G3B,2BC0G2B,EAC/B;;AACD;EACE,gBAAgB,EACjB;;AACD;;;;;;;EDxGE,6BC+G6B;ED9G1B,0BC8G0B,EAC9B;;AACD;EACE,eAAe,EAChB;;AAID;EACE,mBAAmB;EAGnB,aAAa;EACb,oBAAoB,EA+BrB;EApCD;IAUI,mBAAmB,EAUpB;IApBH;MAYM,kBAAkB,EACnB;IAbL;MAkBM,WAAW,EACZ;EAnBL;;IA0BM,mBAAmB,EACpB;EA3BL;;IAgCM,WAAW;IACX,kBAAkB,EACnB;;AChKL;EACE,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB,EAyDlB;EA5DD;IpBOI,aAAa;IACb,eAAe,EAChB;EoBTH;IpBWI,YAAY,EACb;EoBZH;IAOI,mBAAmB;IACnB,eAAe,EAyBhB;IAjCH;MAWM,mBAAmB;MACnB,eAAe;MACf,mB1BqZ+C,E0B/YhD;MAnBL;QAgBQ,sBAAsB;QACtB,0B1BVwB,E0BWzB;IAlBP;MAuBM,e1BjB0B,E0B0B3B;MAhCL;QA2BQ,e1BrBwB;Q0BsBxB,sBAAsB;QACtB,8BAA8B;QAC9B,oB1BiMoC,E0BhMrC;EA/BP;IAwCM,0B1BjC0B;I0BkC1B,sB1BhCwB,E0BiCzB;EA1CL;ILHE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BAJgC,EKwD/B;EApDH;IA0DI,gBAAgB,EACjB;;AAQH;EACE,8B1BqW8C,E0BlU/C;EApCD;IAGI,YAAY;IAEZ,oBAAoB,EAyBrB;IA9BH;MASM,kBAAkB;MAClB,yB1BtB+B;M0BuB/B,8BAA8B;MAC9B,2BAA0D,EAI3D;MAhBL;QAcQ,mC1BwVwC,E0BvVzC;IAfP;MAuBQ,e1BrFwB;M0BsFxB,uB1BtEoB;M0BuEpB,uB1BmVwC;M0BlVxC,iCAAiC;MACjC,gBAAgB,EACjB;;AAaP;EAEI,YAAY,EAmBb;EArBH;IAMM,mB1BbyB,E0Bc1B;EAPL;IASM,iBAAiB,EAClB;EAVL;IAiBQ,Y1BnBwB;I0BoBxB,0B1BrHsB,E0BsHvB;;AAOP;EAEI,YAAY,EAKb;EAPH;IAIM,gBAAgB;IAChB,eAAe,EAChB;;AAWL;EACE,YAAY,EAwBb;EAzBD;IAII,YAAY,EAKb;IATH;MAMM,mBAAmB;MACnB,mBAAmB,EACpB;EARL;IAYI,UAAU;IACV,WAAW,EACZ;EAED;IAhBF;MAkBM,oBAAoB;MACpB,UAAU,EAIX;MAvBL;QAqBQ,iBAAiB,EAClB,EAAA;;AAQP;EACE,iBAAiB,EAyBlB;EA1BD;IAKI,gBAAgB;IAChB,mB1BtF2B,E0BuF5B;EAPH;;;IAYI,uB1BgPkD,E0B/OnD;EAED;IAfF;MAiBM,8B1B2OgD;M0B1OhD,2BAA0D,EAC3D;IAnBL;;;MAuBM,0B1BvLsB,E0BwLvB,EAAA;;AASL;EAEI,cAAc,EACf;;AAHH;EAKI,eAAe,EAChB;;AAQH;EAEE,iBAAiB;EF3OjB,2BE6O4B;EF5O3B,0BE4O2B,EAC7B;;ACvOD;EACE,mBAAmB;EACnB,iB3BgWqC;E2B/VrC,oB3BoD6B;E2BnD7B,8BAA8B,EAQ/B;EAZD;IrBKI,aAAa;IACb,eAAe,EAChB;EqBPH;IrBSI,YAAY,EACb;EqBDD;IATF;MAUI,mB3ByF2B,E2BvF9B,EAAA;;AAQD;ErBfI,aAAa;EACb,eAAe,EAChB;;AqBaH;ErBXI,YAAY,EACb;;AqBaD;EAHF;IAII,YAAY,EAEf,EAAA;;AAaD;EACE,oBAAoB;EACpB,oB3B4TsC;E2B3TtC,mB3B2TsC;E2B1TtC,kCAAkC;EAClC,mDAA8B;EAE9B,kCAAkC,EA+BnC;EAtCD;IrBlCI,aAAa;IACb,eAAe,EAChB;EqBgCH;IrB9BI,YAAY,EACb;EqB6BH;IAUI,iBAAiB,EAClB;EAED;IAbF;MAcI,YAAY;MACZ,cAAc;MACd,iBAAiB,EAsBpB;MAtCD;QAmBM,0BAA0B;QAC1B,wBAAwB;QACxB,kBAAkB;QAClB,6BAA6B,EAC9B;MAvBL;QA0BM,oBAAoB,EACrB;MAID;;;QAGE,gBAAgB;QAChB,iBAAiB,EAClB,EAAA;;AAIL;;EAGI,kB3BqRoC,E2BhRrC;EAHC;IALJ;;MAMM,kBAAkB,EAErB,EAAA;;AAQH;;;;EAII,oB3BkQoC;E2BjQpC,mB3BiQoC,E2B3PrC;EAJC;IAPJ;;;;MAQM,gBAAgB;MAChB,eAAgB,EAEnB,EAAA;;AAWH;EACE,c3BoJ6B;E2BnJ7B,sBAAsB,EAKvB;EAHC;IAJF;MAKI,iBAAiB,EAEpB,EAAA;;AAGD;;EAEE,gBAAgB;EAChB,SAAS;EACT,QAAQ;EACR,c3B0I6B,E2BpI9B;EAHC;IARF;;MASI,iBAAiB,EAEpB,EAAA;;AACD;EACE,OAAO;EACP,sBAAsB,EACvB;;AACD;EACE,UAAU;EACV,iBAAiB;EACjB,sBAAsB,EACvB;;AAKD;EACE,YAAY;EACZ,mB3B2MsC;E2B1MtC,gB3BjH4B;E2BkH5B,kB3BrG6B;E2BsG7B,a3BqMqC,E2BpLtC;EAtBD;IASI,sBAAsB,EACvB;EAVH;IAaI,eAAe,EAChB;EAED;IACE;;MAEE,mB3B0LkC,E2BzLnC,EAAA;;AAUL;EACE,mBAAmB;EACnB,aAAa;EACb,mB3B4KsC;E2B3KtC,kBAAkB;EC9LlB,gBAA4B;EAC5B,mBAA+B;ED+L/B,8BAA8B;EAC9B,uBAAuB;EACvB,8BAA8B;EAC9B,mB3B5F6B,E2BkH9B;EA/BD;IAcI,WAAW,EACZ;EAfH;IAmBI,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,mBAAmB,EACpB;EAvBH;IAyBI,gBAAgB,EACjB;EAED;IA5BF;MA6BI,cAAc,EAEjB,EAAA;;AAQD;EACE,oB3BuIsC,E2B1FvC;EA9CD;IAII,kBAAqB;IACrB,qBAAqB;IACrB,kB3B5K2B,E2B6K5B;EAED;IATF;MAYM,iBAAiB;MACjB,YAAY;MACZ,YAAY;MACZ,cAAc;MACd,8BAA8B;MAC9B,UAAU;MACV,iBAAiB,EAYlB;MA9BL;;QAqBQ,2BAA2B,EAC5B;MAtBP;QAwBQ,kB3B9LuB,E2BmMxB;QA7BP;UA2BU,uBAAuB,EACxB,EAAA;EAMP;IAlCF;MAmCI,YAAY;MACZ,UAAU,EAUb;MA9CD;QAuCM,YAAY,EAKb;QA5CL;UAyCQ,kB3BgG2C;U2B/F3C,qB3B+F2C,E2B9F5C,EAAA;;AAWP;EACE,mB3BiFsC;E2BhFtC,oB3BgFsC;E2B/EtC,mB3B+EsC;E2B9EtC,kCAAkC;EAClC,qCAAqC;E5B7N7B,qF4B8NiD;EC7RzD,gBAA4B;EAC5B,mBAA+B,EDyThC;Eb2JC;Ia9LF;MbiMM,sBAAsB;MACtB,iBAAiB;MACjB,uBAAuB,EACxB;IapML;MbwMM,sBAAsB;MACtB,YAAY;MACZ,uBAAuB,EACxB;Ia3ML;Mb+MM,sBAAsB,EACvB;IahNL;MbmNM,sBAAsB;MACtB,uBAAuB,EAOxB;Ma3NL;;;QbyNQ,YAAY,EACb;Ia1NP;Mb+NM,YAAY,EACb;IahOL;MbmOM,iBAAiB;MACjB,uBAAuB,EACxB;IarOL;;Mb2OM,sBAAsB;MACtB,cAAc;MACd,iBAAiB;MACjB,uBAAuB,EAKxB;ManPL;;QbiPQ,gBAAgB,EACjB;IalPP;;MbsPM,mBAAmB;MACnB,eAAe,EAChB;IaxPL;Mb4PM,OAAO,EACR,EAAA;EahPD;IAbJ;MAcM,mBAAmB,EAMtB;MApBH;QAiBQ,iBAAiB,EAClB,EAAA;EAQL;IA1BF;MA2BI,YAAY;MACZ,UAAU;MACV,eAAe;MACf,gBAAgB;MAChB,eAAe;MACf,kBAAkB;M5BxPZ,iB4ByPkB,EAE3B,EAAA;;AAMD;EACE,cAAc;EHpUd,2BGqU4B;EHpU3B,0BGoU2B,EAC7B;;AAED;EACE,iBAAiB;EHzUjB,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BGmU+B;EHlU9B,6BGkU8B,EAChC;;AAOD;EChVE,gBAA4B;EAC5B,mBAA+B,EDwVhC;EATD;IChVE,iBAA4B;IAC5B,oBAA+B,EDoV9B;EALH;IChVE,iBAA4B;IAC5B,oBAA+B,EDuV9B;;AAQH;EChWE,iBAA4B;EAC5B,oBAA+B,EDuWhC;EALC;IAHF;MAII,YAAY;MACZ,kB3BIoC;M2BHpC,mB3BGoC,E2BDvC,EAAA;;AAWD;EACE;IACE,uBAAuB,EACxB;EACD;IACE,wBAAwB;IAC1B,oB3BhBsC,E2BqBrC;IAPD;MAKI,gBAAgB,EACjB,EAAA;;AASL;EACE,0B3BzBwC;E2B0BxC,sB3BzBuC,E2ByJxC;EAlID;IAKI,Y3BzB2C,E2B+B5C;IAXH;MAQM,e3BlB2C;M2BmB3C,8B3BlBgD,E2BmBjD;EAVL;IAcI,Y3BvCmC,E2BwCpC;EAfH;IAmBM,Y3BvCyC,E2B8C1C;IA1BL;MAuBQ,Y3B1CuC;M2B2CvC,8B3B1C8C,E2B2C/C;EAzBP;IA+BQ,Y3BhDuC;I2BiDvC,0B3BhDyC,E2BiD1C;EAjCP;IAuCQ,Y3BtDuC;I2BuDvC,8B3BtD8C,E2BuD/C;EAzCP;IA8CI,mB3BlD2C,E2B0D5C;IAtDH;MAiDM,uB3BvDyC,E2BwD1C;IAlDL;MAoDM,uB3BzDyC,E2B0D1C;EArDL;;IA0DI,sB3BjFqC,E2BkFtC;EA3DH;IAoEQ,0B3BpFyC;I2BqFzC,Y3BtFuC,E2BuFxC;EAGH;IAzEJ;MA6EU,Y3BjGqC,E2BuGtC;MAnFT;QAgFY,Y3BnGmC;Q2BoGnC,8B3BnG0C,E2BoG3C;IAlFX;MAwFY,Y3BzGmC;M2B0GnC,0B3BzGqC,E2B0GtC;IA1FX;MAgGY,Y3B/GmC;M2BgHnC,8B3B/G0C,E2BgH3C,EAAA;EAlGX;IA8GI,Y3BlI2C,E2BsI5C;IAlHH;MAgHM,Y3BnIyC,E2BoI1C;EAjHL;IAqHI,Y3BzI2C,E2BqJ5C;IAjIH;MAwHM,Y3B3IyC,E2B4I1C;IAzHL;;;MA8HQ,Y3B7IuC,E2B8IxC;;AAOP;EACE,uB3BrI8C;E2BsI9C,sB3BrIgD,E2BsQjD;EAnID;IAKI,e3BrI+C,E2B2IhD;IAXH;MAQM,Y3B9H0C;M2B+H1C,8B3B9HiD,E2B+HlD;EAVL;IAcI,e3BnJ+C,E2BoJhD;EAfH;IAmBM,e3BnJ6C,E2B0J9C;IA1BL;MAuBQ,Y3BtJwC;M2BuJxC,8B3BtJ+C,E2BuJhD;EAzBP;IA+BQ,Y3B9JwC;I2B+JxC,0B3B5J0C,E2B6J3C;EAjCP;IAuCQ,Y3BlKwC;I2BmKxC,8B3BlK+C,E2BmKhD;EAzCP;IA+CI,mB3B/J4C,E2BuK7C;IAvDH;MAkDM,uB3BpK0C,E2BqK3C;IAnDL;MAqDM,uB3BtK0C,E2BuK3C;EAtDL;;IA2DI,sBAAoB,EACrB;EA5DH;IAoEQ,0B3BhM0C;I2BiM1C,Y3BpMwC,E2BqMzC;EAGH;IAzEJ;MA6EU,sB3BhNwC,E2BiNzC;IA9ET;MAgFU,0B3BnNwC,E2BoNzC;IAjFT;MAmFU,e3BnNyC,E2ByN1C;MAzFT;QAsFY,Y3BrNoC;Q2BsNpC,8B3BrN2C,E2BsN5C;IAxFX;MA8FY,Y3B7NoC;M2B8NpC,0B3B3NsC,E2B4NvC;IAhGX;MAsGY,Y3BjOoC;M2BkOpC,8B3BjO2C,E2BkO5C,EAAA;EAxGX;IA+GI,e3B/O+C,E2BmPhD;IAnHH;MAiHM,Y3BhP0C,E2BiP3C;EAlHL;IAsHI,e3BtP+C,E2BkQhD;IAlIH;MAyHM,Y3BxP0C,E2ByP3C;IA1HL;;;MA+HQ,Y3B1PwC,E2B2PzC;;AE7oBP;EACE,kB7BqxBkC;E6BpxBlC,oB7B0D6B;E6BzD7B,iBAAiB;EACjB,0B7BoxBqC;E6BnxBrC,mB7BmG6B,E6BlF9B;EAtBD;IAQI,sBAAsB,EASvB;IAjBH;MAaM,cAA2C;MAC3C,eAAe;MACf,Y7B2wB8B,E6B1wB/B;EAhBL;IAoBI,e7BX4B,E6BY7B;;ACvBH;EACE,sBAAsB;EACtB,gBAAgB;EAChB,eAA+B;EAC/B,mB9BsG6B,E8BlC9B;EAxED;IAOI,gBAAgB,EA0BjB;IAjCH;;MAUM,mBAAmB;MACnB,YAAY;MACZ,kB9BgF0B;M8B/E1B,yB9B+C+B;M8B9C/B,sBAAsB;MACtB,e9BDwB;M8BExB,uB9BobqC;M8BnbrC,uB9BobqC;M8BnbrC,kBAAkB,EACnB;IAnBL;;MAuBQ,eAAe;MNXrB,+BxB8F6B;MwB7F1B,4BxB6F0B,E8BjFxB;IAzBP;;MNIE,gCxBsG6B;MwBrG1B,6BxBqG0B,E8B3ExB;EA/BP;;;IAuCM,WAAW;IACX,e9BPwB;I8BQxB,0B9B7B0B;I8B8B1B,mB9B+ZqC,E8B9ZtC;EA3CL;;;;IAmDM,WAAW;IACX,Y9BuZqC;I8BtZrC,0B9BvCwB;I8BwCxB,sB9BxCwB;I8ByCxB,gBAAgB,EACjB;EAxDL;;;;;;IAkEM,e9BvD0B;I8BwD1B,uB9B6YqC;I8B5YrC,mB9B6YqC;I8B5YrC,oB9B+JsC,E8B9JvC;;AAQL;;EC3EM,mB/B4F0B;E+B3F1B,gB/B6CwB;E+B5CxB,uB/BkG+B,E+BjGhC;;ADwEL;;ENlEE,+BxB+F6B;EwB9F1B,4BxB8F0B,E+BhGxB;;ADmEP;;EN1EE,gCxBuG6B;EwBtG1B,6BxBsG0B,E+B1FxB;;ADkEP;;EChFM,kB/B+F0B;E+B9F1B,gB/B8CwB;E+B7CxB,iB/BmGyB,E+BlG1B;;AD6EL;;ENvEE,+BxBgG6B;EwB/F1B,4BxB+F0B,E+BjGxB;;ADwEP;;EN/EE,gCxBwG6B;EwBvG1B,6BxBuG0B,E+B3FxB;;ACfP;EACE,gBAAgB;EAChB,eAA+B;EAC/B,iBAAiB;EACjB,mBAAmB,EA4CpB;EAhDD;I1BUI,aAAa;IACb,eAAe,EAChB;E0BZH;I1BcI,YAAY,EACb;E0BfH;IAOI,gBAAgB,EAejB;IAtBH;;MAUM,sBAAsB;MACtB,kBAAkB;MAClB,uBhCsbqC;MgCrbrC,uBhCsbqC;MgCrbrC,oBhC0cqC,EgCzctC;IAfL;;MAmBM,sBAAsB;MACtB,0BhCV0B,EgCW3B;EArBL;;IA2BM,aAAa,EACd;EA5BL;;IAkCM,YAAY,EACb;EAnCL;;;;IA2CM,ehClC0B;IgCmC1B,uBhCsZqC;IgCrZrC,oBhCqLsC,EgCpLvC;;AC/CL;EACE,gBAAgB;EAChB,wBAAwB;EACxB,eAAe;EACf,kBAAkB;EAClB,eAAe;EACf,YjC+jBgC;EiC9jBhC,mBAAmB;EACnB,oBAAoB;EACpB,yBAAyB;EACzB,qBAAqB,EActB;EAxBD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;;AAIH;EAGI,YjCyiB8B;EiCxiB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AAMH;ECxCE,0BlCW8B,EiC+B/B;EAFD;ICnCM,0BAAwB,EACzB;;ADsCL;EC5CE,0BlCc4B,EiCgC7B;EAFD;ICvCM,0BAAwB,EACzB;;AD0CL;EChDE,0BlCe6B,EiCmC9B;EAFD;IC3CM,0BAAwB,EACzB;;AD8CL;ECpDE,0BlCgB6B,EiCsC9B;EAFD;IC/CM,0BAAwB,EACzB;;ADkDL;ECxDE,0BlCiB6B,EiCyC9B;EAFD;ICnDM,0BAAwB,EACzB;;ADsDL;EC5DE,0BlCkB6B,EiC4C9B;EAFD;ICvDM,0BAAwB,EACzB;;ACHL;EACE,sBAAsB;EACtB,gBAAgB;EAChB,iBAAiB;EACjB,gBnC2C4B;EmC1C5B,kBnCswBgC;EmCrwBhC,YnC2vBgC;EmC1vBhC,enCqwB6B;EmCpwB7B,uBAAuB;EACvB,oBAAoB;EACpB,mBAAmB;EACnB,0BnCH8B;EmCI9B,oBnCiwBgC,EmC1tBjC;EAnDD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;EAED;;IAEE,OAAO;IACP,iBAAiB,EAClB;EAKD;;IAEE,enCzB0B;ImC0B1B,uBnCouB8B,EmCnuB/B;EAED;IACE,aAAa,EACd;EAED;IACE,kBAAkB,EACnB;EAED;IACE,iBAAiB,EAClB;;AAIH;EAGI,YnC0sB8B;EmCzsB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AC7DH;EACE,kBpCqemC;EoCpenC,qBpCoemC;EoCnenC,oBpCmemC;EoClenC,epCmesC;EoCletC,0BpCK8B,EoCsC/B;EAhDD;;IASI,epCgeoC,EoC/drC;EAVH;IAaI,oBAAkC;IAClC,gBpC4diC;IoC3djC,iBAAiB,EAClB;EAhBH;IAmBI,0BAAwB,EACzB;EAED;;IAEE,mBpCiF2B;IoChF3B,mBAAkC;IAClC,oBAAkC,EACnC;EA3BH;IA8BI,gBAAgB,EACjB;EAED;IAjCF;MAkCI,kBAAmC;MACnC,qBAAmC,EAatC;MAXG;;QAEE,mBAAkC;QAClC,oBAAkC,EACnC;MAzCL;;QA6CM,gBpC8b+B,EoC7bhC,EAAA;;AC7CL;EACE,eAAe;EACf,arCquB+B;EqCpuB/B,oBrCwD6B;EqCvD7B,yBrCqDmC;EqCpDnC,uBrCkB0B;EqCjB1B,uBrCquBgC;EqCpuBhC,mBrCgG6B;ED8ErB,oCsC7KkC,EAgB3C;EAxBD;;InCGE,eADmC;IAEnC,gBAAgB;IAChB,aAAa;ImCQX,kBAAkB;IAClB,mBAAmB,EACpB;EAfH;IAqBI,arC6tB6B;IqC5tB7B,erChB4B,EqCiB7B;;AAIH;;;EAGE,sBrCnB4B,EqCoB7B;;AC7BD;EACE,ctC0mBgC;EsCzmBhC,oBtCuD6B;EsCtD7B,8BAA8B;EAC9B,mBtCiG6B,EsC1E9B;EA3BD;IAQI,cAAc;IAEd,eAAe,EAChB;EAXH;IAeI,kBtC8lB8B,EsC7lB/B;EAhBH;;IAqBI,iBAAiB,EAClB;EAtBH;IAyBI,gBAAgB,EACjB;;AAOH;;EAEE,oBAA8B,EAS/B;EAXD;;IAMI,mBAAmB;IACnB,UAAU;IACV,aAAa;IACb,eAAe,EAChB;;AAOH;ECvDE,0BvCqfsC;EuCpftC,sBvCqfqC;EuCpfrC,evCkfsC,EsC3bvC;EAFD;IClDI,0BAAwB,EACzB;EDiDH;IC/CI,eAAa,EACd;;ADkDH;EC3DE,0BvCyfsC;EuCxftC,sBvCyfqC;EuCxfrC,evCsfsC,EsC3bvC;EAFD;ICtDI,0BAAwB,EACzB;EDqDH;ICnDI,eAAa,EACd;;ADsDH;EC/DE,0BvC6fsC;EuC5ftC,sBvC6fqC;EuC5frC,evC0fsC,EsC3bvC;EAFD;IC1DI,0BAAwB,EACzB;EDyDH;ICvDI,eAAa,EACd;;AD0DH;ECnEE,0BvCigBsC;EuChgBtC,sBvCigBqC;EuChgBrC,evC8fsC,EsC3bvC;EAFD;IC9DI,0BAAwB,EACzB;ED6DH;IC3DI,eAAa,EACd;;ACHH;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAInC;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAQnC;EACE,iBAAiB;EACjB,axCsC6B;EwCrC7B,oBxCqC6B;EwCpC7B,0BxCgnBmC;EwC/mBnC,mBxC+E6B;EDxCrB,+CyCtCgC,EACzC;;AAGD;EACE,YAAY;EACZ,UAAU;EACV,aAAa;EACb,gBxCc4B;EwCb5B,kBxCyB6B;EwCxB7B,YxCsmBgC;EwCrmBhC,mBAAmB;EACnB,0BxC1B4B;EDoDpB,+CyCzB+B;EzC+I/B,4ByC9I0B,EACnC;;AAOD;;ECGE,sMAAiC;EDAjC,2BAA2B,EAC5B;;AAMD;;EzC5CE,2DyC8C0D;EzC5ClD,mDyC4CkD,EAC3D;;AAMD;EErEE,0B1Ce6B,EwCwD9B;EEpEC;IDkDA,sMAAiC,EChDhC;;AFoEH;EEzEE,0B1CgB6B,EwC2D9B;EExEC;IDkDA,sMAAiC,EChDhC;;AFwEH;EE7EE,0B1CiB6B,EwC8D9B;EE5EC;IDkDA,sMAAiC,EChDhC;;AF4EH;EEjFE,0B1CkB6B,EwCiE9B;EEhFC;IDkDA,sMAAiC,EChDhC;;ACRH;EAEE,iBAAiB,EAKlB;EAPD;IAKI,cAAc,EACf;;AAGH;;EAEE,QAAQ;EACR,iBAAiB,EAClB;;AAED;EACE,eAAe,EAChB;;AAED;EACE,eAAe,EAMhB;EAPD;IAKI,gBAAgB,EACjB;;AAGH;;EAEE,mBAAmB,EACpB;;AAED;;EAEE,oBAAoB,EACrB;;AAED;;;EAGE,oBAAoB;EACpB,oBAAoB,EACrB;;AAED;EACE,uBAAuB,EACxB;;AAED;EACE,uBAAuB,EACxB;;AAGD;EACE,cAAc;EACd,mBAAmB,EACpB;;AAKD;EACE,gBAAgB;EAChB,iBAAiB,EAClB;;ACxDD;EAEE,oBAAoB;EACpB,gBAAgB,EACjB;;AAOD;EACE,mBAAmB;EACnB,eAAe;EACf,mBAAmB;EAEnB,oBAAoB;EACpB,uB5C0oBkC;E4CzoBlC,uB5C2oBkC,E4CjoBnC;EAjBD;IpBjBE,6BxB0G6B;IwBzG5B,4BxByG4B,E4C7E5B;EAZH;IAcI,iBAAiB;IpBvBnB,gCxBkG6B;IwBjG5B,+BxBiG4B,E4CzE5B;;AASH;;EAEE,Y5C6oBkC,E4ChoBnC;EAfD;;IAKI,Y5C4oBgC,E4C3oBjC;EANH;;;IAWI,sBAAsB;IACtB,Y5CmoBgC;I4CloBhC,0B5CinBmC,E4ChnBpC;;AAGH;EACE,YAAY;EACZ,iBAAiB,EAClB;;AAED;EAKI,0B5CzD4B;E4C0D5B,e5C3D4B;E4C4D5B,oB5C6JwC,E4CpJzC;EAhBH;IAWM,eAAe,EAChB;EAZL;IAcM,e5CnE0B,E4CoE3B;;AAfL;EAsBI,WAAW;EACX,Y5CwB4B;E4CvB5B,0B5C1E0B;E4C2E1B,sB5C3E0B,E4CsF3B;EApCH;;;;;;;IA+BM,eAAe,EAChB;EAhCL;IAkCM,e5C8kBiC,E4C7kBlC;;ACnGH;EACE,e7CmfoC;E6ClfpC,0B7CmfoC,E6ChfrC;;AAED;;EACE,e7C4eoC,E6C1drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CoekC;I6CnelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7C6dkC;I6C5dlC,sB7C4dkC,E6C3dnC;;AAzBH;EACE,e7CufoC;E6CtfpC,0B7CufoC,E6CpfrC;;AAED;;EACE,e7CgfoC,E6C9drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CwekC;I6CvelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CiekC;I6ChelC,sB7CgekC,E6C/dnC;;AAzBH;EACE,e7C2foC;E6C1fpC,0B7C2foC,E6CxfrC;;AAED;;EACE,e7CofoC,E6ClerC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7C4ekC;I6C3elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CqekC;I6CpelC,sB7CoekC,E6CnenC;;AAzBH;EACE,e7C+foC;E6C9fpC,0B7C+foC,E6C5frC;;AAED;;EACE,e7CwfoC,E6CterC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CgfkC;I6C/elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CyekC;I6CxelC,sB7CwekC,E6CvenC;;AD8FL;EACE,cAAc;EACd,mBAAmB,EACpB;;AACD;EACE,iBAAiB;EACjB,iBAAiB,EAClB;;AE3HD;EACE,oB9C0D6B;E8CzD7B,uB9C6rBgC;E8C5rBhC,8BAA8B;EAC9B,mB9CmG6B;EDxCrB,0C+C1D0B,EACnC;;AAGD;EACE,c9CsrBgC,E8CprBjC;EAHD;IxCAI,aAAa;IACb,eAAe,EAChB;EwCFH;IxCII,YAAY,EACb;;AwCCH;EACE,mB9CirBqC;E8ChrBrC,qCAAqC;EtBpBrC,6BsBqBgD;EtBpB/C,4BsBoB+C,EAKjD;EARD;IAMI,eAAe,EAChB;;AAIH;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAe;EACf,eAAe,EAShB;EAbD;;;;;IAWI,eAAe,EAChB;;AAIH;EACE,mB9CspBqC;E8CrpBrC,0B9C2pBmC;E8C1pBnC,2B9CypBgC;EwBjsBhC,gCsByCmD;EtBxClD,+BsBwCkD,EACpD;;AAQD;;EAGI,iBAAiB,EAsBlB;EAzBH;;IAMM,oBAAoB;IACpB,iBAAiB,EAClB;EARL;;IAaQ,cAAc;ItBvEpB,6BsBwEsD;ItBvErD,4BsBuEqD,EACjD;EAfP;;IAqBQ,iBAAiB;ItBvEvB,gCsBwEyD;ItBvExD,+BsBuEwD,EACpD;;AAvBP;EtB1DE,2BsBsFgC;EtBrF/B,0BsBqF+B,EAC7B;;AAIL;EAEI,oBAAoB,EACrB;;AAEH;EACE,oBAAoB,EACrB;;AAOD;;;EAII,iBAAiB,EAMlB;EAVH;;;IAOM,mB9CmlB4B;I8CllB5B,oB9CklB4B,E8CjlB7B;;AATL;;EtBzGE,6BsBuHkD;EtBtHjD,4BsBsHiD,EAkBjD;EAhCH;;;;IAmBQ,4BAA6C;IAC7C,6BAA8C,EAU/C;IA9BP;;;;;;;;MAwBU,4BAA6C,EAC9C;IAzBT;;;;;;;;MA4BU,6BAA8C,EAC/C;;AA7BT;;EtBjGE,gCsBqIqD;EtBpIpD,+BsBoIoD,EAkBpD;EAtDH;;;;IAyCQ,+BAAgD;IAChD,gCAAiD,EAUlD;IApDP;;;;;;;;MA8CU,+BAAgD,EACjD;IA/CT;;;;;;;;MAkDU,gCAAiD,EAClD;;AAnDT;;;;EA2DI,2B9CzBgC,E8C0BjC;;AA5DH;;EA+DI,cAAc,EACf;;AAhEH;;EAmEI,UAAU,EAiCX;EApGH;;;;;;;;;;;;IA0EU,eAAe,EAChB;EA3ET;;;;;;;;;;;;IA8EU,gBAAgB,EACjB;EA/ET;;;;;;;;IAuFU,iBAAiB,EAClB;EAxFT;;;;;;;;IAgGU,iBAAiB,EAClB;;AAjGT;EAsGI,UAAU;EACV,iBAAiB,EAClB;;AASH;EACE,oB9C7J6B,E8CwL9B;EA5BD;IAKI,iBAAiB;IACjB,mB9CtH2B,E8C2H5B;IAXH;MASM,gBAAgB,EACjB;EAVL;IAcI,iBAAiB,EAMlB;IApBH;;MAkBM,2B9C6d4B,E8C5d7B;EAnBL;IAuBI,cAAc,EAIf;IA3BH;MAyBM,8B9Csd4B,E8Crd7B;;AAML;EC1PE,mB/C6sBgC,E8CjdjC;EAFD;ICvPI,e/CM4B;I+CL5B,0B/C0sBiC;I+CzsBjC,mB/CwsB8B,E+C/rB/B;ID4OH;MClPM,uB/CqsB4B,E+CpsB7B;IDiPL;MC/OM,e/CmsB+B;M+ClsB/B,0B/CH0B,E+CI3B;ED6OL;ICzOM,0B/C4rB4B,E+C3rB7B;;AD2OL;EC7PE,sB/Cc4B,E8CiP7B;EAFD;IC1PI,Y/C6sB8B;I+C5sB9B,0B/CU0B;I+CT1B,sB/CS0B,E+CA3B;ID+OH;MCrPM,0B/CMwB,E+CLzB;IDoPL;MClPM,e/CGwB;M+CFxB,uB/CosB4B,E+CnsB7B;EDgPL;IC5OM,6B/CHwB,E+CIzB;;AD8OL;EChQE,sB/CsfqC,E8CpPtC;EAFD;IC7PI,e/CifoC;I+ChfpC,0B/CifoC;I+ChfpC,sB/CifmC,E+CxepC;IDkPH;MCxPM,0B/C8eiC,E+C7elC;IDuPL;MCrPM,e/C0ekC;M+CzelC,0B/CwekC,E+CvenC;EDmPL;IC/OM,6B/CqeiC,E+CpelC;;ADiPL;ECnQE,sB/C0fqC,E8CrPtC;EAFD;IChQI,e/CqfoC;I+CpfpC,0B/CqfoC;I+CpfpC,sB/CqfmC,E+C5epC;IDqPH;MC3PM,0B/CkfiC,E+CjflC;ID0PL;MCxPM,e/C8ekC;M+C7elC,0B/C4ekC,E+C3enC;EDsPL;IClPM,6B/CyeiC,E+CxelC;;ADoPL;ECtQE,sB/C8fqC,E8CtPtC;EAFD;ICnQI,e/CyfoC;I+CxfpC,0B/CyfoC;I+CxfpC,sB/CyfmC,E+ChfpC;IDwPH;MC9PM,0B/CsfiC,E+CrflC;ID6PL;MC3PM,e/CkfkC;M+CjflC,0B/CgfkC,E+C/enC;EDyPL;ICrPM,6B/C6eiC,E+C5elC;;ADuPL;ECzQE,sB/CkgBqC,E8CvPtC;EAFD;ICtQI,e/C6foC;I+C5fpC,0B/C6foC;I+C5fpC,sB/C6fmC,E+CpfpC;ID2PH;MCjQM,0B/C0fiC,E+CzflC;IDgQL;MC9PM,e/CsfkC;M+CrflC,0B/CofkC,E+CnfnC;ED4PL;ICxPM,6B/CifiC,E+ChflC;;ACjBL;EACE,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,WAAW;EACX,iBAAiB,EAelB;EApBD;;;;;IAYI,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,UAAU,EACX;;AAIH;EACE,uBAAuB,EACxB;;AAGD;EACE,oBAAoB,EACrB;;AC5BD;EACE,iBAAiB;EACjB,cAAc;EACd,oBAAoB;EACpB,0BjDqvBmC;EiDpvBnC,0BjDqvBkC;EiDpvBlC,mBjDiG6B;EDxCrB,gDkDxDgC,EAKzC;EAZD;IASI,mBAAmB;IACnB,kCAAkB,EACnB;;AAIH;EACE,cAAc;EACd,mBjDuF6B,EiDtF9B;;AACD;EACE,aAAa;EACb,mBjDoF6B,EiDnF9B;;ACvBD;EACE,aAAa;EACb,gBAA2B;EAC3B,kBlDmzBgC;EkDlzBhC,eAAe;EACf,YlDkzBgC;EkDjzBhC,0BlDkzBwC;EkB1zBxC,agCSmB;EhCNnB,0BAAa,EgCiBd;EAlBD;IAWI,YlD4yB8B;IkD3yB9B,sBAAsB;IACtB,gBAAgB;IhCflB,agCgBqB;IhCbrB,0BAAa,EgCcZ;;AASH;EACE,WAAW;EACX,gBAAgB;EAChB,wBAAwB;EACxB,UAAU;EACV,yBAAyB,EAC1B;;ACzBD;EACE,iBAAiB,EAClB;;AAGD;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDmQ6B;EmDlQ7B,kCAAkC;EAIlC,WAAW,EAQZ;EArBD;IpD0HE,sCAA4B;IAGpB,8BAAoB;IAqEpB,4CoDhLqC;IpDgLrC,oCoDhLqC,EAC5C;EAnBH;IpD0HE,mCAA4B;IAGpB,2BAAoB,EoDzGoB;;AAElD;EACE,mBAAmB;EACnB,iBAAiB,EAClB;;AAGD;EACE,mBAAmB;EACnB,YAAY;EACZ,aAAa,EACd;;AAGD;EACE,mBAAmB;EACnB,uBnDuiBiD;EmDtiBjD,uBnD0iBiD;EmDziBjD,qCnDuiBiD;EmDtiBjD,mBnDuD6B;EDzCrB,yCoDb0B;EAClC,6BAA6B;EAE7B,WAAW,EACZ;;AAGD;EACE,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDoN6B;EmDnN7B,uBnD4hBgC,EmDxhBjC;EAXD;IjC5DE,WiCqE2B;IjClE3B,yBAAa,EiCkEmB;EATlC;IjC5DE,alBimB8B;IkB9lB9B,0BAAa,EiCmEuC;;AAKtD;EACE,cnDugBgC;EmDtgBhC,iCnDshBmC,EmDphBpC;EAJD;I7C/DI,aAAa;IACb,eAAe,EAChB;E6C6DH;I7C3DI,YAAY,EACb;;A6CgEH;EACE,iBAAiB,EAClB;;AAGD;EACE,UAAU;EACV,yBnD5BmC,EmD6BpC;;AAID;EACE,mBAAmB;EACnB,cnDifgC,EmDhfjC;;AAGD;EACE,cnD4egC;EmD3ehC,kBAAkB;EAClB,8BnD6fmC,EmD7epC;EAnBD;I7CvFI,aAAa;IACb,eAAe,EAChB;E6CqFH;I7CnFI,YAAY,EACb;E6CkFH;IAQI,iBAAiB;IACjB,iBAAiB,EAClB;EAVH;IAaI,kBAAkB,EACnB;EAdH;IAiBI,eAAe,EAChB;;AAIH;EACE,mBAAmB;EACnB,aAAa;EACb,YAAY;EACZ,aAAa;EACb,iBAAiB,EAClB;;AAGD;EAEE;IACE,anDme+B;ImDle/B,kBAAkB,EACnB;EACD;IpDtEQ,0CoDuE6B,EACpC;EAGD;IAAY,anD4dqB,EmD5dD,EAAA;;AAGlC;EACE;IAAY,anDsdqB,EmDtdD,EAAA;;AC9IlC;EACE,mBAAmB;EACnB,cpD+Q6B;EoD9Q7B,eAAe;ECRf,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EDHlB,gBpDwC4B;EkBlD5B,WkCYkB;ElCTlB,yBAAa,EkCgBd;EAhBD;IlCHE,alB+gB8B;IkB5gB9B,0BAAa,EkCWoC;EAXnD;IAYa,iBAAkB;IAAE,eAA+B,EAAI;EAZpE;IAaa,iBAAkB;IAAE,epDkgBA,EoDlgBmC;EAbpE;IAca,gBAAkB;IAAE,eAA+B,EAAI;EAdpE;IAea,kBAAkB;IAAE,epDggBA,EoDhgBmC;;AAIpE;EACE,iBpDmfiC;EoDlfjC,iBAAiB;EACjB,YpDmfgC;EoDlfhC,mBAAmB;EACnB,uBpDmfgC;EoDlfhC,mBpD8E6B,EoD7E9B;;AAGD;EACE,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAED;EAEI,UAAU;EACV,UAAU;EACV,kBpDse6B;EoDre7B,wBAAyD;EACzD,uBpDge8B,EoD/d/B;;AAPH;EASI,UAAU;EACV,WpDge6B;EoD/d7B,oBpD+d6B;EoD9d7B,wBAAyD;EACzD,uBpDyd8B,EoDxd/B;;AAdH;EAgBI,UAAU;EACV,UpDyd6B;EoDxd7B,oBpDwd6B;EoDvd7B,wBAAyD;EACzD,uBpDkd8B,EoDjd/B;;AArBH;EAuBI,SAAS;EACT,QAAQ;EACR,iBpDid6B;EoDhd7B,4BAA8E;EAC9E,yBpD2c8B,EoD1c/B;;AA5BH;EA8BI,SAAS;EACT,SAAS;EACT,iBpD0c6B;EoDzc7B,4BpDyc6B;EoDxc7B,wBpDoc8B,EoDnc/B;;AAnCH;EAqCI,OAAO;EACP,UAAU;EACV,kBpDmc6B;EoDlc7B,wBpDkc6B;EoDjc7B,0BpD6b8B,EoD5b/B;;AA1CH;EA4CI,OAAO;EACP,WpD6b6B;EoD5b7B,iBpD4b6B;EoD3b7B,wBpD2b6B;EoD1b7B,0BpDsb8B,EoDrb/B;;AAjDH;EAmDI,OAAO;EACP,UpDsb6B;EoDrb7B,iBpDqb6B;EoDpb7B,wBpDob6B;EoDnb7B,0BpD+a8B,EoD9a/B;;AE9FH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,ctD6Q6B;EsD5Q7B,cAAc;EACd,iBtDshByC;EsDrhBzC,aAAa;EDXb,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;ECAlB,gBtDmC4B;EsDjC5B,uBtD6gBwC;EsD5gBxC,6BAA6B;EAC7B,uBtDihBwC;EsDhhBxC,qCtD8gBwC;EsD7gBxC,mBtDwF6B;EDzCrB,0CuD9C2B,EAOpC;EAzBD;IAqBc,kBtDihB4B,EsDjhBS;EArBnD;IAsBc,kBtDghB4B,EsDhhBS;EAtBnD;IAuBc,iBtD+gB4B,EsD/gBQ;EAvBlD;IAwBc,mBtD8gB4B,EsD9gBU;;AAGpD;EACE,UAAU;EACV,kBAAkB;EAClB,gBtDgB4B;EsDf5B,0BtDogB0C;EsDngB1C,iCAA+B;EAC/B,2BAAwE,EACzE;;AAED;EACE,kBAAkB,EACnB;;AAMD;EAGI,mBAAmB;EACnB,eAAe;EACf,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAEH;EACE,mBtDmfyD,EsDlf1D;;AACD;EACE,mBtD2ewC;EsD1exC,YAAY,EACb;;AAED;EAEI,UAAU;EACV,mBtDyeuD;EsDxevD,uBAAuB;EACvB,0BtD2ewC;EsD1exC,sCtDweyC;EsDvezC,ctDqeuD,EsD7dxD;EAfH;IASM,aAAa;IACb,YAAY;IACZ,mBtD4doC;IsD3dpC,uBAAuB;IACvB,uBtD8coC,EsD7crC;;AAdL;EAiBI,SAAS;EACT,YtD0duD;EsDzdvD,kBtDyduD;EsDxdvD,qBAAqB;EACrB,4BtD2dwC;EsD1dxC,wCtDwdyC,EsDhd1C;EA9BH;IAwBM,aAAa;IACb,UAAU;IACV,ctD6coC;IsD5cpC,qBAAqB;IACrB,yBtD+boC,EsD9brC;;AA7BL;EAgCI,UAAU;EACV,mBtD2cuD;EsD1cvD,oBAAoB;EACpB,6BtD6cwC;EsD5cxC,yCtD0cyC;EsDzczC,WtDucuD,EsD/bxD;EA7CH;IAuCM,aAAa;IACb,SAAS;IACT,mBtD8boC;IsD7bpC,oBAAoB;IACpB,0BtDgboC,EsD/arC;;AA5CL;EAgDI,SAAS;EACT,atD2buD;EsD1bvD,kBtD0buD;EsDzbvD,sBAAsB;EACtB,2BtD4bwC;EsD3bxC,uCtDybyC,EsDjb1C;EA7DH;IAuDM,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,wBtDiaoC;IsDhapC,ctD4aoC,EsD3arC;;AC1HL;EACE,mBAAmB,EACpB;;AAED;EACE,mBAAmB;EACnB,iBAAiB;EACjB,YAAY,EA0Eb;EA7ED;IAMI,cAAc;IACd,mBAAmB;IxD0Kb,kCwDzKkC,EAgCzC;IAxCH;;MrDDE,eADmC;MAEnC,gBAAgB;MAChB,aAAa;MqDaT,eAAe,EAChB;IAGD;MAlBJ;QxDuMU,+CwDpL0C;QxDoL1C,uCwDpL0C;QxD4BlD,oCwD3BuC;QxD6B/B,4BwD7B+B;QxDuIvC,4BwDtI+B;QxDwIvB,oBwDxIuB,EAmB9B;QAxCH;UxDqIE,2CAA8B;UACtB,mCAAsB;UwD5GxB,QAAQ,EACT;QA3BP;UxDqIE,4CAA8B;UACtB,oCAAsB;UwDvGxB,QAAQ,EACT;QAhCP;UxDqIE,wCAA8B;UACtB,gCAAsB;UwDjGxB,QAAQ,EACT,EAAA;EAtCP;;;IA6CI,eAAe,EAChB;EA9CH;IAiDI,QAAQ,EACT;EAlDH;;IAsDI,mBAAmB;IACnB,OAAO;IACP,YAAY,EACb;EAzDH;IA4DI,WAAW,EACZ;EA7DH;IA+DI,YAAY,EACb;EAhEH;;IAmEI,QAAQ,EACT;EApEH;IAuEI,YAAY,EACb;EAxEH;IA0EI,WAAW,EACZ;;AAOH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,UAAU;EACV,WvD4sB+C;EkB1yB/C,alB2yB8C;EkBxyB9C,0BAAa;EqC6Fb,gBvD4sBgD;EuD3sBhD,YvDwsBgD;EuDvsBhD,mBAAmB;EACnB,0CvDosB0D;EuDnsB1D,8BAAsB,EA+DvB;EA1ED;IdjFE,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EciGvJ;EAlBH;IAoBI,WAAW;IACX,SAAS;IdtGX,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EcsGvJ;EAvBH;IA4BI,WAAW;IACX,YvDmrB8C;IuDlrB9C,sBAAsB;IrCvHxB,aqCwHqB;IrCrHrB,0BAAa,EqCsHZ;EAhCH;;;;IAuCI,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,WAAW;IACX,sBAAsB,EACvB;EA5CH;;IA+CI,UAAU;IACV,mBAAmB,EACpB;EAjDH;;IAoDI,WAAW;IACX,oBAAoB,EACrB;EAtDH;;IAyDI,YAAa;IACb,aAAa;IACb,eAAe;IACf,mBAAmB,EACpB;EA7DH;IAkEM,iBAAiB,EAClB;EAnEL;IAuEM,iBAAiB,EAClB;;AASL;EACE,mBAAmB;EACnB,aAAa;EACb,UAAU;EACV,YAAY;EACZ,WAAW;EACX,kBAAkB;EAClB,gBAAgB;EAChB,iBAAiB;EACjB,mBAAmB,EA8BpB;EAvCD;IAYI,sBAAsB;IACtB,YAAa;IACb,aAAa;IACb,YAAY;IACZ,oBAAoB;IACpB,uBvDonB8C;IuDnnB9C,oBAAoB;IACpB,gBAAgB;IAWhB,0BAA0B;IAC1B,8BAAsB,EACvB;EAhCH;IAkCI,UAAU;IACV,YAAa;IACb,aAAa;IACb,uBvD+lB8C,EuD9lB/C;;AAMH;EACE,mBAAmB;EACnB,UAAU;EACV,WAAW;EACX,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,qBAAqB;EACrB,YvDmlBgD;EuDllBhD,mBAAmB;EACnB,0CvDukB0D,EuDnkB3D;EAdD;IAYI,kBAAkB,EACnB;;AAKH;EAGE;;;;IAKI,YAAmC;IACnC,aAAoC;IACpC,kBAAwC;IACxC,gBAAuC,EACxC;EATH;;IAYI,mBAAyC,EAC1C;EAbH;;IAgBI,oBAA0C,EAC3C;EAIH;IACE,UAAU;IACV,WAAW;IACX,qBAAqB,EACtB;EAGD;IACE,aAAa,EACd,EAAA;;ACpQH;ElDOI,aAAa;EACb,eAAe,EAChB;;AkDTH;ElDWI,YAAY,EACb;;AkDTH;ECRE,eAAe;EACf,kBAAkB;EAClB,mBAAmB,EDQpB;;AACD;EACE,wBAAwB,EACzB;;AACD;EACE,uBAAuB,EACxB;;AAOD;EACE,yBAAyB,EAC1B;;AACD;EACE,0BAA0B,EAC3B;;AACD;EACE,mBAAmB,EACpB;;AACD;EEzBE,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,8BAA8B;EAC9B,UAAU,EFuBX;;AAOD;EACE,yBAAyB,EAC1B;;AAMD;EACE,gBAAgB,EACjB;;AGjCC;EACE,oBAAoB,EAAA;;ACNtB;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;ADiBH;;;;;;;;;;;;EAYE,yBAAyB,EAC1B;;AAED;EC5CE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD2CrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC/DE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD8DrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EClFE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADiFrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;ECrGE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADoGrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC9GE;IACE,yBAAyB,EAC1B,EAAA;;ADgHH;EClHE;IACE,yBAAyB,EAC1B,EAAA;;ADoHH;ECtHE;IACE,yBAAyB,EAC1B,EAAA;;ADwHH;EC1HE;IACE,yBAAyB,EAC1B,EAAA;;AAFD;EACE,yBAAyB,EAC1B;;ADqIH;ECjJE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD+IvC;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,0BAA0B,EAE7B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,2BAA2B,EAE9B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,iCAAiC,EAEpC,EAAA;;AAED;EChKE;IACE,yBAAyB,EAC1B,EAAA","file":"app.css","sourcesContent":["@charset \"UTF-8\";\n@import url(https://fonts.googleapis.com/css?family=Lato);\n/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%; }\n\nbody {\n  margin: 0; }\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline; }\n\naudio:not([controls]) {\n  display: none;\n  height: 0; }\n\n[hidden],\ntemplate {\n  display: none; }\n\na {\n  background-color: transparent; }\n\na:active,\na:hover {\n  outline: 0; }\n\nabbr[title] {\n  border-bottom: 1px dotted; }\n\nb,\nstrong {\n  font-weight: bold; }\n\ndfn {\n  font-style: italic; }\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0; }\n\nmark {\n  background: #ff0;\n  color: #000; }\n\nsmall {\n  font-size: 80%; }\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline; }\n\nsup {\n  top: -0.5em; }\n\nsub {\n  bottom: -0.25em; }\n\nimg {\n  border: 0; }\n\nsvg:not(:root) {\n  overflow: hidden; }\n\nfigure {\n  margin: 1em 40px; }\n\nhr {\n  box-sizing: content-box;\n  height: 0; }\n\npre {\n  overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em; }\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0; }\n\nbutton {\n  overflow: visible; }\n\nbutton,\nselect {\n  text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer; }\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0; }\n\ninput {\n  line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0; }\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto; }\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none; }\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em; }\n\nlegend {\n  border: 0;\n  padding: 0; }\n\ntextarea {\n  overflow: auto; }\n\noptgroup {\n  font-weight: bold; }\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0; }\n\ntd,\nth {\n  padding: 0; }\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important; }\n  a,\n  a:visited {\n    text-decoration: underline; }\n  a[href]:after {\n    content: \" (\" attr(href) \")\"; }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\"; }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\"; }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid; }\n  thead {\n    display: table-header-group; }\n  tr,\n  img {\n    page-break-inside: avoid; }\n  img {\n    max-width: 100% !important; }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3; }\n  h2,\n  h3 {\n    page-break-after: avoid; }\n  .navbar {\n    display: none; }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important; }\n  .label {\n    border: 1px solid #000; }\n  .table {\n    border-collapse: collapse !important; }\n    .table td,\n    .table th {\n      background-color: #fff !important; }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important; } }\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot\");\n  src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\"); }\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon-asterisk:before {\n  content: \"\\002a\"; }\n\n.glyphicon-plus:before {\n  content: \"\\002b\"; }\n\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\"; }\n\n.glyphicon-minus:before {\n  content: \"\\2212\"; }\n\n.glyphicon-cloud:before {\n  content: \"\\2601\"; }\n\n.glyphicon-envelope:before {\n  content: \"\\2709\"; }\n\n.glyphicon-pencil:before {\n  content: \"\\270f\"; }\n\n.glyphicon-glass:before {\n  content: \"\\e001\"; }\n\n.glyphicon-music:before {\n  content: \"\\e002\"; }\n\n.glyphicon-search:before {\n  content: \"\\e003\"; }\n\n.glyphicon-heart:before {\n  content: \"\\e005\"; }\n\n.glyphicon-star:before {\n  content: \"\\e006\"; }\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\"; }\n\n.glyphicon-user:before {\n  content: \"\\e008\"; }\n\n.glyphicon-film:before {\n  content: \"\\e009\"; }\n\n.glyphicon-th-large:before {\n  content: \"\\e010\"; }\n\n.glyphicon-th:before {\n  content: \"\\e011\"; }\n\n.glyphicon-th-list:before {\n  content: \"\\e012\"; }\n\n.glyphicon-ok:before {\n  content: \"\\e013\"; }\n\n.glyphicon-remove:before {\n  content: \"\\e014\"; }\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\"; }\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\"; }\n\n.glyphicon-off:before {\n  content: \"\\e017\"; }\n\n.glyphicon-signal:before {\n  content: \"\\e018\"; }\n\n.glyphicon-cog:before {\n  content: \"\\e019\"; }\n\n.glyphicon-trash:before {\n  content: \"\\e020\"; }\n\n.glyphicon-home:before {\n  content: \"\\e021\"; }\n\n.glyphicon-file:before {\n  content: \"\\e022\"; }\n\n.glyphicon-time:before {\n  content: \"\\e023\"; }\n\n.glyphicon-road:before {\n  content: \"\\e024\"; }\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\"; }\n\n.glyphicon-download:before {\n  content: \"\\e026\"; }\n\n.glyphicon-upload:before {\n  content: \"\\e027\"; }\n\n.glyphicon-inbox:before {\n  content: \"\\e028\"; }\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\"; }\n\n.glyphicon-repeat:before {\n  content: \"\\e030\"; }\n\n.glyphicon-refresh:before {\n  content: \"\\e031\"; }\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\"; }\n\n.glyphicon-lock:before {\n  content: \"\\e033\"; }\n\n.glyphicon-flag:before {\n  content: \"\\e034\"; }\n\n.glyphicon-headphones:before {\n  content: \"\\e035\"; }\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\"; }\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\"; }\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\"; }\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\"; }\n\n.glyphicon-barcode:before {\n  content: \"\\e040\"; }\n\n.glyphicon-tag:before {\n  content: \"\\e041\"; }\n\n.glyphicon-tags:before {\n  content: \"\\e042\"; }\n\n.glyphicon-book:before {\n  content: \"\\e043\"; }\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\"; }\n\n.glyphicon-print:before {\n  content: \"\\e045\"; }\n\n.glyphicon-camera:before {\n  content: \"\\e046\"; }\n\n.glyphicon-font:before {\n  content: \"\\e047\"; }\n\n.glyphicon-bold:before {\n  content: \"\\e048\"; }\n\n.glyphicon-italic:before {\n  content: \"\\e049\"; }\n\n.glyphicon-text-height:before {\n  content: \"\\e050\"; }\n\n.glyphicon-text-width:before {\n  content: \"\\e051\"; }\n\n.glyphicon-align-left:before {\n  content: \"\\e052\"; }\n\n.glyphicon-align-center:before {\n  content: \"\\e053\"; }\n\n.glyphicon-align-right:before {\n  content: \"\\e054\"; }\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\"; }\n\n.glyphicon-list:before {\n  content: \"\\e056\"; }\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\"; }\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\"; }\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\"; }\n\n.glyphicon-picture:before {\n  content: \"\\e060\"; }\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\"; }\n\n.glyphicon-adjust:before {\n  content: \"\\e063\"; }\n\n.glyphicon-tint:before {\n  content: \"\\e064\"; }\n\n.glyphicon-edit:before {\n  content: \"\\e065\"; }\n\n.glyphicon-share:before {\n  content: \"\\e066\"; }\n\n.glyphicon-check:before {\n  content: \"\\e067\"; }\n\n.glyphicon-move:before {\n  content: \"\\e068\"; }\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\"; }\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\"; }\n\n.glyphicon-backward:before {\n  content: \"\\e071\"; }\n\n.glyphicon-play:before {\n  content: \"\\e072\"; }\n\n.glyphicon-pause:before {\n  content: \"\\e073\"; }\n\n.glyphicon-stop:before {\n  content: \"\\e074\"; }\n\n.glyphicon-forward:before {\n  content: \"\\e075\"; }\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\"; }\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\"; }\n\n.glyphicon-eject:before {\n  content: \"\\e078\"; }\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\"; }\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\"; }\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\"; }\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\"; }\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\"; }\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\"; }\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\"; }\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\"; }\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\"; }\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\"; }\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\"; }\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\"; }\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\"; }\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\"; }\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\"; }\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\"; }\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\"; }\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\"; }\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\"; }\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\"; }\n\n.glyphicon-gift:before {\n  content: \"\\e102\"; }\n\n.glyphicon-leaf:before {\n  content: \"\\e103\"; }\n\n.glyphicon-fire:before {\n  content: \"\\e104\"; }\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\"; }\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\"; }\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\"; }\n\n.glyphicon-plane:before {\n  content: \"\\e108\"; }\n\n.glyphicon-calendar:before {\n  content: \"\\e109\"; }\n\n.glyphicon-random:before {\n  content: \"\\e110\"; }\n\n.glyphicon-comment:before {\n  content: \"\\e111\"; }\n\n.glyphicon-magnet:before {\n  content: \"\\e112\"; }\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\"; }\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\"; }\n\n.glyphicon-retweet:before {\n  content: \"\\e115\"; }\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\"; }\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\"; }\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\"; }\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\"; }\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\"; }\n\n.glyphicon-hdd:before {\n  content: \"\\e121\"; }\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\"; }\n\n.glyphicon-bell:before {\n  content: \"\\e123\"; }\n\n.glyphicon-certificate:before {\n  content: \"\\e124\"; }\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\"; }\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\"; }\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\"; }\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\"; }\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\"; }\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\"; }\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\"; }\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\"; }\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\"; }\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\"; }\n\n.glyphicon-globe:before {\n  content: \"\\e135\"; }\n\n.glyphicon-wrench:before {\n  content: \"\\e136\"; }\n\n.glyphicon-tasks:before {\n  content: \"\\e137\"; }\n\n.glyphicon-filter:before {\n  content: \"\\e138\"; }\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\"; }\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\"; }\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\"; }\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\"; }\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\"; }\n\n.glyphicon-link:before {\n  content: \"\\e144\"; }\n\n.glyphicon-phone:before {\n  content: \"\\e145\"; }\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\"; }\n\n.glyphicon-usd:before {\n  content: \"\\e148\"; }\n\n.glyphicon-gbp:before {\n  content: \"\\e149\"; }\n\n.glyphicon-sort:before {\n  content: \"\\e150\"; }\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\"; }\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\"; }\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\"; }\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\"; }\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\"; }\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\"; }\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\"; }\n\n.glyphicon-expand:before {\n  content: \"\\e158\"; }\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\"; }\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\"; }\n\n.glyphicon-log-in:before {\n  content: \"\\e161\"; }\n\n.glyphicon-flash:before {\n  content: \"\\e162\"; }\n\n.glyphicon-log-out:before {\n  content: \"\\e163\"; }\n\n.glyphicon-new-window:before {\n  content: \"\\e164\"; }\n\n.glyphicon-record:before {\n  content: \"\\e165\"; }\n\n.glyphicon-save:before {\n  content: \"\\e166\"; }\n\n.glyphicon-open:before {\n  content: \"\\e167\"; }\n\n.glyphicon-saved:before {\n  content: \"\\e168\"; }\n\n.glyphicon-import:before {\n  content: \"\\e169\"; }\n\n.glyphicon-export:before {\n  content: \"\\e170\"; }\n\n.glyphicon-send:before {\n  content: \"\\e171\"; }\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\"; }\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\"; }\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\"; }\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\"; }\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\"; }\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\"; }\n\n.glyphicon-transfer:before {\n  content: \"\\e178\"; }\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\"; }\n\n.glyphicon-header:before {\n  content: \"\\e180\"; }\n\n.glyphicon-compressed:before {\n  content: \"\\e181\"; }\n\n.glyphicon-earphone:before {\n  content: \"\\e182\"; }\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\"; }\n\n.glyphicon-tower:before {\n  content: \"\\e184\"; }\n\n.glyphicon-stats:before {\n  content: \"\\e185\"; }\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\"; }\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\"; }\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\"; }\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\"; }\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\"; }\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\"; }\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\"; }\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\"; }\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\"; }\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\"; }\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\"; }\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\"; }\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\"; }\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\"; }\n\n.glyphicon-cd:before {\n  content: \"\\e201\"; }\n\n.glyphicon-save-file:before {\n  content: \"\\e202\"; }\n\n.glyphicon-open-file:before {\n  content: \"\\e203\"; }\n\n.glyphicon-level-up:before {\n  content: \"\\e204\"; }\n\n.glyphicon-copy:before {\n  content: \"\\e205\"; }\n\n.glyphicon-paste:before {\n  content: \"\\e206\"; }\n\n.glyphicon-alert:before {\n  content: \"\\e209\"; }\n\n.glyphicon-equalizer:before {\n  content: \"\\e210\"; }\n\n.glyphicon-king:before {\n  content: \"\\e211\"; }\n\n.glyphicon-queen:before {\n  content: \"\\e212\"; }\n\n.glyphicon-pawn:before {\n  content: \"\\e213\"; }\n\n.glyphicon-bishop:before {\n  content: \"\\e214\"; }\n\n.glyphicon-knight:before {\n  content: \"\\e215\"; }\n\n.glyphicon-baby-formula:before {\n  content: \"\\e216\"; }\n\n.glyphicon-tent:before {\n  content: \"\\26fa\"; }\n\n.glyphicon-blackboard:before {\n  content: \"\\e218\"; }\n\n.glyphicon-bed:before {\n  content: \"\\e219\"; }\n\n.glyphicon-apple:before {\n  content: \"\\f8ff\"; }\n\n.glyphicon-erase:before {\n  content: \"\\e221\"; }\n\n.glyphicon-hourglass:before {\n  content: \"\\231b\"; }\n\n.glyphicon-lamp:before {\n  content: \"\\e223\"; }\n\n.glyphicon-duplicate:before {\n  content: \"\\e224\"; }\n\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\"; }\n\n.glyphicon-scissors:before {\n  content: \"\\e226\"; }\n\n.glyphicon-bitcoin:before {\n  content: \"\\e227\"; }\n\n.glyphicon-btc:before {\n  content: \"\\e227\"; }\n\n.glyphicon-xbt:before {\n  content: \"\\e227\"; }\n\n.glyphicon-yen:before {\n  content: \"\\00a5\"; }\n\n.glyphicon-jpy:before {\n  content: \"\\00a5\"; }\n\n.glyphicon-ruble:before {\n  content: \"\\20bd\"; }\n\n.glyphicon-rub:before {\n  content: \"\\20bd\"; }\n\n.glyphicon-scale:before {\n  content: \"\\e230\"; }\n\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\"; }\n\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\"; }\n\n.glyphicon-education:before {\n  content: \"\\e233\"; }\n\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\"; }\n\n.glyphicon-option-vertical:before {\n  content: \"\\e235\"; }\n\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\"; }\n\n.glyphicon-modal-window:before {\n  content: \"\\e237\"; }\n\n.glyphicon-oil:before {\n  content: \"\\e238\"; }\n\n.glyphicon-grain:before {\n  content: \"\\e239\"; }\n\n.glyphicon-sunglasses:before {\n  content: \"\\e240\"; }\n\n.glyphicon-text-size:before {\n  content: \"\\e241\"; }\n\n.glyphicon-text-color:before {\n  content: \"\\e242\"; }\n\n.glyphicon-text-background:before {\n  content: \"\\e243\"; }\n\n.glyphicon-object-align-top:before {\n  content: \"\\e244\"; }\n\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\"; }\n\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\"; }\n\n.glyphicon-object-align-left:before {\n  content: \"\\e247\"; }\n\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\"; }\n\n.glyphicon-object-align-right:before {\n  content: \"\\e249\"; }\n\n.glyphicon-triangle-right:before {\n  content: \"\\e250\"; }\n\n.glyphicon-triangle-left:before {\n  content: \"\\e251\"; }\n\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\"; }\n\n.glyphicon-triangle-top:before {\n  content: \"\\e253\"; }\n\n.glyphicon-console:before {\n  content: \"\\e254\"; }\n\n.glyphicon-superscript:before {\n  content: \"\\e255\"; }\n\n.glyphicon-subscript:before {\n  content: \"\\e256\"; }\n\n.glyphicon-menu-left:before {\n  content: \"\\e257\"; }\n\n.glyphicon-menu-right:before {\n  content: \"\\e258\"; }\n\n.glyphicon-menu-down:before {\n  content: \"\\e259\"; }\n\n.glyphicon-menu-up:before {\n  content: \"\\e260\"; }\n\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: transparent; }\n\nbody {\n  font-family: \"Lato\", sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #fff; }\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit; }\n\na {\n  color: #337ab7;\n  text-decoration: none; }\n  a:hover, a:focus {\n    color: #23527c;\n    text-decoration: underline; }\n  a:focus {\n    outline: thin dotted;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px; }\n\nfigure {\n  margin: 0; }\n\nimg {\n  vertical-align: middle; }\n\n.img-responsive {\n  display: block;\n  max-width: 100%;\n  height: auto; }\n\n.img-rounded {\n  border-radius: 6px; }\n\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto; }\n\n.img-circle {\n  border-radius: 50%; }\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee; }\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto; }\n\n[role=\"button\"] {\n  cursor: pointer; }\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit; }\n  h1 small,\n  h1 .small, h2 small,\n  h2 .small, h3 small,\n  h3 .small, h4 small,\n  h4 .small, h5 small,\n  h5 .small, h6 small,\n  h6 .small,\n  .h1 small,\n  .h1 .small, .h2 small,\n  .h2 .small, .h3 small,\n  .h3 .small, .h4 small,\n  .h4 .small, .h5 small,\n  .h5 .small, .h6 small,\n  .h6 .small {\n    font-weight: normal;\n    line-height: 1;\n    color: #777777; }\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: 20px;\n  margin-bottom: 10px; }\n  h1 small,\n  h1 .small, .h1 small,\n  .h1 .small,\n  h2 small,\n  h2 .small, .h2 small,\n  .h2 .small,\n  h3 small,\n  h3 .small, .h3 small,\n  .h3 .small {\n    font-size: 65%; }\n\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: 10px;\n  margin-bottom: 10px; }\n  h4 small,\n  h4 .small, .h4 small,\n  .h4 .small,\n  h5 small,\n  h5 .small, .h5 small,\n  .h5 .small,\n  h6 small,\n  h6 .small, .h6 small,\n  .h6 .small {\n    font-size: 75%; }\n\nh1, .h1 {\n  font-size: 36px; }\n\nh2, .h2 {\n  font-size: 30px; }\n\nh3, .h3 {\n  font-size: 24px; }\n\nh4, .h4 {\n  font-size: 18px; }\n\nh5, .h5 {\n  font-size: 14px; }\n\nh6, .h6 {\n  font-size: 12px; }\n\np {\n  margin: 0 0 10px; }\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4; }\n  @media (min-width: 768px) {\n    .lead {\n      font-size: 21px; } }\n\nsmall,\n.small {\n  font-size: 85%; }\n\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em; }\n\n.text-left {\n  text-align: left; }\n\n.text-right {\n  text-align: right; }\n\n.text-center {\n  text-align: center; }\n\n.text-justify {\n  text-align: justify; }\n\n.text-nowrap {\n  white-space: nowrap; }\n\n.text-lowercase {\n  text-transform: lowercase; }\n\n.text-uppercase, .initialism {\n  text-transform: uppercase; }\n\n.text-capitalize {\n  text-transform: capitalize; }\n\n.text-muted {\n  color: #777777; }\n\n.text-primary {\n  color: #337ab7; }\n\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090; }\n\n.text-success {\n  color: #3c763d; }\n\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c; }\n\n.text-info {\n  color: #31708f; }\n\na.text-info:hover,\na.text-info:focus {\n  color: #245269; }\n\n.text-warning {\n  color: #8a6d3b; }\n\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c; }\n\n.text-danger {\n  color: #a94442; }\n\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534; }\n\n.bg-primary {\n  color: #fff; }\n\n.bg-primary {\n  background-color: #337ab7; }\n\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090; }\n\n.bg-success {\n  background-color: #dff0d8; }\n\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3; }\n\n.bg-info {\n  background-color: #d9edf7; }\n\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee; }\n\n.bg-warning {\n  background-color: #fcf8e3; }\n\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5; }\n\n.bg-danger {\n  background-color: #f2dede; }\n\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9; }\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee; }\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px; }\n  ul ul,\n  ul ol,\n  ol ul,\n  ol ol {\n    margin-bottom: 0; }\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none; }\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px; }\n  .list-inline > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px; }\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px; }\n\ndt,\ndd {\n  line-height: 1.428571429; }\n\ndt {\n  font-weight: bold; }\n\ndd {\n  margin-left: 0; }\n\n.dl-horizontal dd:before, .dl-horizontal dd:after {\n  content: \" \";\n  display: table; }\n\n.dl-horizontal dd:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap; }\n  .dl-horizontal dd {\n    margin-left: 180px; } }\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777; }\n\n.initialism {\n  font-size: 90%; }\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee; }\n  blockquote p:last-child,\n  blockquote ul:last-child,\n  blockquote ol:last-child {\n    margin-bottom: 0; }\n  blockquote footer,\n  blockquote small,\n  blockquote .small {\n    display: block;\n    font-size: 80%;\n    line-height: 1.428571429;\n    color: #777777; }\n    blockquote footer:before,\n    blockquote small:before,\n    blockquote .small:before {\n      content: '\\2014 \\00A0'; }\n\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right; }\n  .blockquote-reverse footer:before,\n  .blockquote-reverse small:before,\n  .blockquote-reverse .small:before,\n  blockquote.pull-right footer:before,\n  blockquote.pull-right small:before,\n  blockquote.pull-right .small:before {\n    content: ''; }\n  .blockquote-reverse footer:after,\n  .blockquote-reverse small:after,\n  .blockquote-reverse .small:after,\n  blockquote.pull-right footer:after,\n  blockquote.pull-right small:after,\n  blockquote.pull-right .small:after {\n    content: '\\00A0 \\2014'; }\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429; }\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px; }\n\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }\n  kbd kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none; }\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px; }\n  pre code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0; }\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll; }\n\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px; }\n  .container:before, .container:after {\n    content: \" \";\n    display: table; }\n  .container:after {\n    clear: both; }\n  @media (min-width: 768px) {\n    .container {\n      width: 750px; } }\n  @media (min-width: 992px) {\n    .container {\n      width: 970px; } }\n  @media (min-width: 1200px) {\n    .container {\n      width: 1170px; } }\n\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px; }\n  .container-fluid:before, .container-fluid:after {\n    content: \" \";\n    display: table; }\n  .container-fluid:after {\n    clear: both; }\n\n.row {\n  margin-left: -15px;\n  margin-right: -15px; }\n  .row:before, .row:after {\n    content: \" \";\n    display: table; }\n  .row:after {\n    clear: both; }\n\n.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 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px; }\n\n.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 {\n  float: left; }\n\n.col-xs-1 {\n  width: 8.3333333333%; }\n\n.col-xs-2 {\n  width: 16.6666666667%; }\n\n.col-xs-3 {\n  width: 25%; }\n\n.col-xs-4 {\n  width: 33.3333333333%; }\n\n.col-xs-5 {\n  width: 41.6666666667%; }\n\n.col-xs-6 {\n  width: 50%; }\n\n.col-xs-7 {\n  width: 58.3333333333%; }\n\n.col-xs-8 {\n  width: 66.6666666667%; }\n\n.col-xs-9 {\n  width: 75%; }\n\n.col-xs-10 {\n  width: 83.3333333333%; }\n\n.col-xs-11 {\n  width: 91.6666666667%; }\n\n.col-xs-12 {\n  width: 100%; }\n\n.col-xs-pull-0 {\n  right: auto; }\n\n.col-xs-pull-1 {\n  right: 8.3333333333%; }\n\n.col-xs-pull-2 {\n  right: 16.6666666667%; }\n\n.col-xs-pull-3 {\n  right: 25%; }\n\n.col-xs-pull-4 {\n  right: 33.3333333333%; }\n\n.col-xs-pull-5 {\n  right: 41.6666666667%; }\n\n.col-xs-pull-6 {\n  right: 50%; }\n\n.col-xs-pull-7 {\n  right: 58.3333333333%; }\n\n.col-xs-pull-8 {\n  right: 66.6666666667%; }\n\n.col-xs-pull-9 {\n  right: 75%; }\n\n.col-xs-pull-10 {\n  right: 83.3333333333%; }\n\n.col-xs-pull-11 {\n  right: 91.6666666667%; }\n\n.col-xs-pull-12 {\n  right: 100%; }\n\n.col-xs-push-0 {\n  left: auto; }\n\n.col-xs-push-1 {\n  left: 8.3333333333%; }\n\n.col-xs-push-2 {\n  left: 16.6666666667%; }\n\n.col-xs-push-3 {\n  left: 25%; }\n\n.col-xs-push-4 {\n  left: 33.3333333333%; }\n\n.col-xs-push-5 {\n  left: 41.6666666667%; }\n\n.col-xs-push-6 {\n  left: 50%; }\n\n.col-xs-push-7 {\n  left: 58.3333333333%; }\n\n.col-xs-push-8 {\n  left: 66.6666666667%; }\n\n.col-xs-push-9 {\n  left: 75%; }\n\n.col-xs-push-10 {\n  left: 83.3333333333%; }\n\n.col-xs-push-11 {\n  left: 91.6666666667%; }\n\n.col-xs-push-12 {\n  left: 100%; }\n\n.col-xs-offset-0 {\n  margin-left: 0%; }\n\n.col-xs-offset-1 {\n  margin-left: 8.3333333333%; }\n\n.col-xs-offset-2 {\n  margin-left: 16.6666666667%; }\n\n.col-xs-offset-3 {\n  margin-left: 25%; }\n\n.col-xs-offset-4 {\n  margin-left: 33.3333333333%; }\n\n.col-xs-offset-5 {\n  margin-left: 41.6666666667%; }\n\n.col-xs-offset-6 {\n  margin-left: 50%; }\n\n.col-xs-offset-7 {\n  margin-left: 58.3333333333%; }\n\n.col-xs-offset-8 {\n  margin-left: 66.6666666667%; }\n\n.col-xs-offset-9 {\n  margin-left: 75%; }\n\n.col-xs-offset-10 {\n  margin-left: 83.3333333333%; }\n\n.col-xs-offset-11 {\n  margin-left: 91.6666666667%; }\n\n.col-xs-offset-12 {\n  margin-left: 100%; }\n\n@media (min-width: 768px) {\n  .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 {\n    float: left; }\n  .col-sm-1 {\n    width: 8.3333333333%; }\n  .col-sm-2 {\n    width: 16.6666666667%; }\n  .col-sm-3 {\n    width: 25%; }\n  .col-sm-4 {\n    width: 33.3333333333%; }\n  .col-sm-5 {\n    width: 41.6666666667%; }\n  .col-sm-6 {\n    width: 50%; }\n  .col-sm-7 {\n    width: 58.3333333333%; }\n  .col-sm-8 {\n    width: 66.6666666667%; }\n  .col-sm-9 {\n    width: 75%; }\n  .col-sm-10 {\n    width: 83.3333333333%; }\n  .col-sm-11 {\n    width: 91.6666666667%; }\n  .col-sm-12 {\n    width: 100%; }\n  .col-sm-pull-0 {\n    right: auto; }\n  .col-sm-pull-1 {\n    right: 8.3333333333%; }\n  .col-sm-pull-2 {\n    right: 16.6666666667%; }\n  .col-sm-pull-3 {\n    right: 25%; }\n  .col-sm-pull-4 {\n    right: 33.3333333333%; }\n  .col-sm-pull-5 {\n    right: 41.6666666667%; }\n  .col-sm-pull-6 {\n    right: 50%; }\n  .col-sm-pull-7 {\n    right: 58.3333333333%; }\n  .col-sm-pull-8 {\n    right: 66.6666666667%; }\n  .col-sm-pull-9 {\n    right: 75%; }\n  .col-sm-pull-10 {\n    right: 83.3333333333%; }\n  .col-sm-pull-11 {\n    right: 91.6666666667%; }\n  .col-sm-pull-12 {\n    right: 100%; }\n  .col-sm-push-0 {\n    left: auto; }\n  .col-sm-push-1 {\n    left: 8.3333333333%; }\n  .col-sm-push-2 {\n    left: 16.6666666667%; }\n  .col-sm-push-3 {\n    left: 25%; }\n  .col-sm-push-4 {\n    left: 33.3333333333%; }\n  .col-sm-push-5 {\n    left: 41.6666666667%; }\n  .col-sm-push-6 {\n    left: 50%; }\n  .col-sm-push-7 {\n    left: 58.3333333333%; }\n  .col-sm-push-8 {\n    left: 66.6666666667%; }\n  .col-sm-push-9 {\n    left: 75%; }\n  .col-sm-push-10 {\n    left: 83.3333333333%; }\n  .col-sm-push-11 {\n    left: 91.6666666667%; }\n  .col-sm-push-12 {\n    left: 100%; }\n  .col-sm-offset-0 {\n    margin-left: 0%; }\n  .col-sm-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-sm-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-sm-offset-3 {\n    margin-left: 25%; }\n  .col-sm-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-sm-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-sm-offset-6 {\n    margin-left: 50%; }\n  .col-sm-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-sm-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-sm-offset-9 {\n    margin-left: 75%; }\n  .col-sm-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-sm-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-sm-offset-12 {\n    margin-left: 100%; } }\n\n@media (min-width: 992px) {\n  .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 {\n    float: left; }\n  .col-md-1 {\n    width: 8.3333333333%; }\n  .col-md-2 {\n    width: 16.6666666667%; }\n  .col-md-3 {\n    width: 25%; }\n  .col-md-4 {\n    width: 33.3333333333%; }\n  .col-md-5 {\n    width: 41.6666666667%; }\n  .col-md-6 {\n    width: 50%; }\n  .col-md-7 {\n    width: 58.3333333333%; }\n  .col-md-8 {\n    width: 66.6666666667%; }\n  .col-md-9 {\n    width: 75%; }\n  .col-md-10 {\n    width: 83.3333333333%; }\n  .col-md-11 {\n    width: 91.6666666667%; }\n  .col-md-12 {\n    width: 100%; }\n  .col-md-pull-0 {\n    right: auto; }\n  .col-md-pull-1 {\n    right: 8.3333333333%; }\n  .col-md-pull-2 {\n    right: 16.6666666667%; }\n  .col-md-pull-3 {\n    right: 25%; }\n  .col-md-pull-4 {\n    right: 33.3333333333%; }\n  .col-md-pull-5 {\n    right: 41.6666666667%; }\n  .col-md-pull-6 {\n    right: 50%; }\n  .col-md-pull-7 {\n    right: 58.3333333333%; }\n  .col-md-pull-8 {\n    right: 66.6666666667%; }\n  .col-md-pull-9 {\n    right: 75%; }\n  .col-md-pull-10 {\n    right: 83.3333333333%; }\n  .col-md-pull-11 {\n    right: 91.6666666667%; }\n  .col-md-pull-12 {\n    right: 100%; }\n  .col-md-push-0 {\n    left: auto; }\n  .col-md-push-1 {\n    left: 8.3333333333%; }\n  .col-md-push-2 {\n    left: 16.6666666667%; }\n  .col-md-push-3 {\n    left: 25%; }\n  .col-md-push-4 {\n    left: 33.3333333333%; }\n  .col-md-push-5 {\n    left: 41.6666666667%; }\n  .col-md-push-6 {\n    left: 50%; }\n  .col-md-push-7 {\n    left: 58.3333333333%; }\n  .col-md-push-8 {\n    left: 66.6666666667%; }\n  .col-md-push-9 {\n    left: 75%; }\n  .col-md-push-10 {\n    left: 83.3333333333%; }\n  .col-md-push-11 {\n    left: 91.6666666667%; }\n  .col-md-push-12 {\n    left: 100%; }\n  .col-md-offset-0 {\n    margin-left: 0%; }\n  .col-md-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-md-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-md-offset-3 {\n    margin-left: 25%; }\n  .col-md-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-md-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-md-offset-6 {\n    margin-left: 50%; }\n  .col-md-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-md-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-md-offset-9 {\n    margin-left: 75%; }\n  .col-md-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-md-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-md-offset-12 {\n    margin-left: 100%; } }\n\n@media (min-width: 1200px) {\n  .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 {\n    float: left; }\n  .col-lg-1 {\n    width: 8.3333333333%; }\n  .col-lg-2 {\n    width: 16.6666666667%; }\n  .col-lg-3 {\n    width: 25%; }\n  .col-lg-4 {\n    width: 33.3333333333%; }\n  .col-lg-5 {\n    width: 41.6666666667%; }\n  .col-lg-6 {\n    width: 50%; }\n  .col-lg-7 {\n    width: 58.3333333333%; }\n  .col-lg-8 {\n    width: 66.6666666667%; }\n  .col-lg-9 {\n    width: 75%; }\n  .col-lg-10 {\n    width: 83.3333333333%; }\n  .col-lg-11 {\n    width: 91.6666666667%; }\n  .col-lg-12 {\n    width: 100%; }\n  .col-lg-pull-0 {\n    right: auto; }\n  .col-lg-pull-1 {\n    right: 8.3333333333%; }\n  .col-lg-pull-2 {\n    right: 16.6666666667%; }\n  .col-lg-pull-3 {\n    right: 25%; }\n  .col-lg-pull-4 {\n    right: 33.3333333333%; }\n  .col-lg-pull-5 {\n    right: 41.6666666667%; }\n  .col-lg-pull-6 {\n    right: 50%; }\n  .col-lg-pull-7 {\n    right: 58.3333333333%; }\n  .col-lg-pull-8 {\n    right: 66.6666666667%; }\n  .col-lg-pull-9 {\n    right: 75%; }\n  .col-lg-pull-10 {\n    right: 83.3333333333%; }\n  .col-lg-pull-11 {\n    right: 91.6666666667%; }\n  .col-lg-pull-12 {\n    right: 100%; }\n  .col-lg-push-0 {\n    left: auto; }\n  .col-lg-push-1 {\n    left: 8.3333333333%; }\n  .col-lg-push-2 {\n    left: 16.6666666667%; }\n  .col-lg-push-3 {\n    left: 25%; }\n  .col-lg-push-4 {\n    left: 33.3333333333%; }\n  .col-lg-push-5 {\n    left: 41.6666666667%; }\n  .col-lg-push-6 {\n    left: 50%; }\n  .col-lg-push-7 {\n    left: 58.3333333333%; }\n  .col-lg-push-8 {\n    left: 66.6666666667%; }\n  .col-lg-push-9 {\n    left: 75%; }\n  .col-lg-push-10 {\n    left: 83.3333333333%; }\n  .col-lg-push-11 {\n    left: 91.6666666667%; }\n  .col-lg-push-12 {\n    left: 100%; }\n  .col-lg-offset-0 {\n    margin-left: 0%; }\n  .col-lg-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-lg-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-lg-offset-3 {\n    margin-left: 25%; }\n  .col-lg-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-lg-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-lg-offset-6 {\n    margin-left: 50%; }\n  .col-lg-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-lg-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-lg-offset-9 {\n    margin-left: 75%; }\n  .col-lg-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-lg-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-lg-offset-12 {\n    margin-left: 100%; } }\n\ntable {\n  background-color: transparent; }\n\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left; }\n\nth {\n  text-align: left; }\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px; }\n  .table > thead > tr > th,\n  .table > thead > tr > td,\n  .table > tbody > tr > th,\n  .table > tbody > tr > td,\n  .table > tfoot > tr > th,\n  .table > tfoot > tr > td {\n    padding: 8px;\n    line-height: 1.428571429;\n    vertical-align: top;\n    border-top: 1px solid #ddd; }\n  .table > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid #ddd; }\n  .table > caption + thead > tr:first-child > th,\n  .table > caption + thead > tr:first-child > td,\n  .table > colgroup + thead > tr:first-child > th,\n  .table > colgroup + thead > tr:first-child > td,\n  .table > thead:first-child > tr:first-child > th,\n  .table > thead:first-child > tr:first-child > td {\n    border-top: 0; }\n  .table > tbody + tbody {\n    border-top: 2px solid #ddd; }\n  .table .table {\n    background-color: #fff; }\n\n.table-condensed > thead > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > tfoot > tr > td {\n  padding: 5px; }\n\n.table-bordered {\n  border: 1px solid #ddd; }\n  .table-bordered > thead > tr > th,\n  .table-bordered > thead > tr > td,\n  .table-bordered > tbody > tr > th,\n  .table-bordered > tbody > tr > td,\n  .table-bordered > tfoot > tr > th,\n  .table-bordered > tfoot > tr > td {\n    border: 1px solid #ddd; }\n  .table-bordered > thead > tr > th,\n  .table-bordered > thead > tr > td {\n    border-bottom-width: 2px; }\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell; }\n\n.table > thead > tr > td.active,\n.table > thead > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8; }\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8; }\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6; }\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7; }\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3; }\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc; }\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede; }\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc; }\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; }\n  @media screen and (max-width: 767px) {\n    .table-responsive {\n      width: 100%;\n      margin-bottom: 15px;\n      overflow-y: hidden;\n      -ms-overflow-style: -ms-autohiding-scrollbar;\n      border: 1px solid #ddd; }\n      .table-responsive > .table {\n        margin-bottom: 0; }\n        .table-responsive > .table > thead > tr > th,\n        .table-responsive > .table > thead > tr > td,\n        .table-responsive > .table > tbody > tr > th,\n        .table-responsive > .table > tbody > tr > td,\n        .table-responsive > .table > tfoot > tr > th,\n        .table-responsive > .table > tfoot > tr > td {\n          white-space: nowrap; }\n      .table-responsive > .table-bordered {\n        border: 0; }\n        .table-responsive > .table-bordered > thead > tr > th:first-child,\n        .table-responsive > .table-bordered > thead > tr > td:first-child,\n        .table-responsive > .table-bordered > tbody > tr > th:first-child,\n        .table-responsive > .table-bordered > tbody > tr > td:first-child,\n        .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n        .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n          border-left: 0; }\n        .table-responsive > .table-bordered > thead > tr > th:last-child,\n        .table-responsive > .table-bordered > thead > tr > td:last-child,\n        .table-responsive > .table-bordered > tbody > tr > th:last-child,\n        .table-responsive > .table-bordered > tbody > tr > td:last-child,\n        .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n        .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n          border-right: 0; }\n        .table-responsive > .table-bordered > tbody > tr:last-child > th,\n        .table-responsive > .table-bordered > tbody > tr:last-child > td,\n        .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n        .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n          border-bottom: 0; } }\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0; }\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5; }\n\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold; }\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal; }\n\ninput[type=\"file\"] {\n  display: block; }\n\ninput[type=\"range\"] {\n  display: block;\n  width: 100%; }\n\nselect[multiple],\nselect[size] {\n  height: auto; }\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px; }\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555; }\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }\n  .form-control:focus {\n    border-color: #66afe9;\n    outline: 0;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }\n  .form-control::-moz-placeholder {\n    color: #999;\n    opacity: 1; }\n  .form-control:-ms-input-placeholder {\n    color: #999; }\n  .form-control::-webkit-input-placeholder {\n    color: #999; }\n  .form-control::-ms-expand {\n    border: 0;\n    background-color: transparent; }\n  .form-control[disabled], .form-control[readonly],\n  fieldset[disabled] .form-control {\n    background-color: #eeeeee;\n    opacity: 1; }\n  .form-control[disabled],\n  fieldset[disabled] .form-control {\n    cursor: not-allowed; }\n\ntextarea.form-control {\n  height: auto; }\n\ninput[type=\"search\"] {\n  -webkit-appearance: none; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px; }\n  input[type=\"date\"].input-sm, .input-group-sm > input[type=\"date\"].form-control,\n  .input-group-sm > input[type=\"date\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"date\"].btn,\n  .input-group-sm input[type=\"date\"],\n  input[type=\"time\"].input-sm,\n  .input-group-sm > input[type=\"time\"].form-control,\n  .input-group-sm > input[type=\"time\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"time\"].btn,\n  .input-group-sm\n  input[type=\"time\"],\n  input[type=\"datetime-local\"].input-sm,\n  .input-group-sm > input[type=\"datetime-local\"].form-control,\n  .input-group-sm > input[type=\"datetime-local\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"datetime-local\"].btn,\n  .input-group-sm\n  input[type=\"datetime-local\"],\n  input[type=\"month\"].input-sm,\n  .input-group-sm > input[type=\"month\"].form-control,\n  .input-group-sm > input[type=\"month\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"month\"].btn,\n  .input-group-sm\n  input[type=\"month\"] {\n    line-height: 30px; }\n  input[type=\"date\"].input-lg, .input-group-lg > input[type=\"date\"].form-control,\n  .input-group-lg > input[type=\"date\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"date\"].btn,\n  .input-group-lg input[type=\"date\"],\n  input[type=\"time\"].input-lg,\n  .input-group-lg > input[type=\"time\"].form-control,\n  .input-group-lg > input[type=\"time\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"time\"].btn,\n  .input-group-lg\n  input[type=\"time\"],\n  input[type=\"datetime-local\"].input-lg,\n  .input-group-lg > input[type=\"datetime-local\"].form-control,\n  .input-group-lg > input[type=\"datetime-local\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"datetime-local\"].btn,\n  .input-group-lg\n  input[type=\"datetime-local\"],\n  input[type=\"month\"].input-lg,\n  .input-group-lg > input[type=\"month\"].form-control,\n  .input-group-lg > input[type=\"month\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"month\"].btn,\n  .input-group-lg\n  input[type=\"month\"] {\n    line-height: 46px; } }\n\n.form-group {\n  margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px; }\n  .radio label,\n  .checkbox label {\n    min-height: 20px;\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer; }\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9; }\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; }\n\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer; }\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; }\n\ninput[type=\"radio\"][disabled], input[type=\"radio\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled]\ninput[type=\"checkbox\"] {\n  cursor: not-allowed; }\n\n.radio-inline.disabled,\nfieldset[disabled] .radio-inline,\n.checkbox-inline.disabled,\nfieldset[disabled]\n.checkbox-inline {\n  cursor: not-allowed; }\n\n.radio.disabled label,\nfieldset[disabled] .radio label,\n.checkbox.disabled label,\nfieldset[disabled]\n.checkbox label {\n  cursor: not-allowed; }\n\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n  min-height: 34px; }\n  .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,\n  .input-group-lg > .form-control-static.input-group-addon,\n  .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,\n  .input-group-sm > .form-control-static.input-group-addon,\n  .input-group-sm > .input-group-btn > .form-control-static.btn {\n    padding-left: 0;\n    padding-right: 0; }\n\n.input-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\nselect.input-sm, .input-group-sm > select.form-control,\n.input-group-sm > select.input-group-addon,\n.input-group-sm > .input-group-btn > select.btn {\n  height: 30px;\n  line-height: 30px; }\n\ntextarea.input-sm, .input-group-sm > textarea.form-control,\n.input-group-sm > textarea.input-group-addon,\n.input-group-sm > .input-group-btn > textarea.btn,\nselect[multiple].input-sm,\n.input-group-sm > select[multiple].form-control,\n.input-group-sm > select[multiple].input-group-addon,\n.input-group-sm > .input-group-btn > select[multiple].btn {\n  height: auto; }\n\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px; }\n\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto; }\n\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5; }\n\n.input-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\nselect.input-lg, .input-group-lg > select.form-control,\n.input-group-lg > select.input-group-addon,\n.input-group-lg > .input-group-btn > select.btn {\n  height: 46px;\n  line-height: 46px; }\n\ntextarea.input-lg, .input-group-lg > textarea.form-control,\n.input-group-lg > textarea.input-group-addon,\n.input-group-lg > .input-group-btn > textarea.btn,\nselect[multiple].input-lg,\n.input-group-lg > select[multiple].form-control,\n.input-group-lg > select[multiple].input-group-addon,\n.input-group-lg > .input-group-btn > select[multiple].btn {\n  height: auto; }\n\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px; }\n\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto; }\n\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333; }\n\n.has-feedback {\n  position: relative; }\n  .has-feedback .form-control {\n    padding-right: 42.5px; }\n\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none; }\n\n.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,\n.input-group-lg > .input-group-addon + .form-control-feedback,\n.input-group-lg > .input-group-btn > .btn + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px; }\n\n.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,\n.input-group-sm > .input-group-addon + .form-control-feedback,\n.input-group-sm > .input-group-btn > .btn + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px; }\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d; }\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-success .form-control:focus {\n    border-color: #2b542c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }\n\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8; }\n\n.has-success .form-control-feedback {\n  color: #3c763d; }\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b; }\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-warning .form-control:focus {\n    border-color: #66512c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }\n\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3; }\n\n.has-warning .form-control-feedback {\n  color: #8a6d3b; }\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442; }\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-error .form-control:focus {\n    border-color: #843534;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }\n\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede; }\n\n.has-error .form-control-feedback {\n  color: #a94442; }\n\n.has-feedback label ~ .form-control-feedback {\n  top: 25px; }\n\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0; }\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373; }\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle; }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle; }\n  .form-inline .form-control-static {\n    display: inline-block; }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle; }\n    .form-inline .input-group .input-group-addon,\n    .form-inline .input-group .input-group-btn,\n    .form-inline .input-group .form-control {\n      width: auto; }\n  .form-inline .input-group > .form-control {\n    width: 100%; }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle; }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle; }\n    .form-inline .radio label,\n    .form-inline .checkbox label {\n      padding-left: 0; }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0; }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0; } }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px; }\n\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px; }\n  .form-horizontal .form-group:before, .form-horizontal .form-group:after {\n    content: \" \";\n    display: table; }\n  .form-horizontal .form-group:after {\n    clear: both; }\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px; } }\n\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px; }\n\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px; } }\n\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px; } }\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none; }\n  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {\n    outline: thin dotted;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px; }\n  .btn:hover, .btn:focus, .btn.focus {\n    color: #333;\n    text-decoration: none; }\n  .btn:active, .btn.active {\n    outline: 0;\n    background-image: none;\n    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n  .btn.disabled, .btn[disabled],\n  fieldset[disabled] .btn {\n    cursor: not-allowed;\n    opacity: 0.65;\n    filter: alpha(opacity=65);\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none; }\n\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc; }\n  .btn-default:focus, .btn-default.focus {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #8c8c8c; }\n  .btn-default:hover {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #adadad; }\n  .btn-default:active, .btn-default.active,\n  .open > .btn-default.dropdown-toggle {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #adadad; }\n    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,\n    .open > .btn-default.dropdown-toggle:hover,\n    .open > .btn-default.dropdown-toggle:focus,\n    .open > .btn-default.dropdown-toggle.focus {\n      color: #333;\n      background-color: #d4d4d4;\n      border-color: #8c8c8c; }\n  .btn-default:active, .btn-default.active,\n  .open > .btn-default.dropdown-toggle {\n    background-image: none; }\n  .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,\n  fieldset[disabled] .btn-default:hover,\n  fieldset[disabled] .btn-default:focus,\n  fieldset[disabled] .btn-default.focus {\n    background-color: #fff;\n    border-color: #ccc; }\n  .btn-default .badge {\n    color: #fff;\n    background-color: #333; }\n\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4; }\n  .btn-primary:focus, .btn-primary.focus {\n    color: #fff;\n    background-color: #286090;\n    border-color: #122b40; }\n  .btn-primary:hover {\n    color: #fff;\n    background-color: #286090;\n    border-color: #204d74; }\n  .btn-primary:active, .btn-primary.active,\n  .open > .btn-primary.dropdown-toggle {\n    color: #fff;\n    background-color: #286090;\n    border-color: #204d74; }\n    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,\n    .open > .btn-primary.dropdown-toggle:hover,\n    .open > .btn-primary.dropdown-toggle:focus,\n    .open > .btn-primary.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #204d74;\n      border-color: #122b40; }\n  .btn-primary:active, .btn-primary.active,\n  .open > .btn-primary.dropdown-toggle {\n    background-image: none; }\n  .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,\n  fieldset[disabled] .btn-primary:hover,\n  fieldset[disabled] .btn-primary:focus,\n  fieldset[disabled] .btn-primary.focus {\n    background-color: #337ab7;\n    border-color: #2e6da4; }\n  .btn-primary .badge {\n    color: #337ab7;\n    background-color: #fff; }\n\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c; }\n  .btn-success:focus, .btn-success.focus {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #255625; }\n  .btn-success:hover {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #398439; }\n  .btn-success:active, .btn-success.active,\n  .open > .btn-success.dropdown-toggle {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #398439; }\n    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,\n    .open > .btn-success.dropdown-toggle:hover,\n    .open > .btn-success.dropdown-toggle:focus,\n    .open > .btn-success.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #398439;\n      border-color: #255625; }\n  .btn-success:active, .btn-success.active,\n  .open > .btn-success.dropdown-toggle {\n    background-image: none; }\n  .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,\n  fieldset[disabled] .btn-success:hover,\n  fieldset[disabled] .btn-success:focus,\n  fieldset[disabled] .btn-success.focus {\n    background-color: #5cb85c;\n    border-color: #4cae4c; }\n  .btn-success .badge {\n    color: #5cb85c;\n    background-color: #fff; }\n\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da; }\n  .btn-info:focus, .btn-info.focus {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #1b6d85; }\n  .btn-info:hover {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #269abc; }\n  .btn-info:active, .btn-info.active,\n  .open > .btn-info.dropdown-toggle {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #269abc; }\n    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,\n    .open > .btn-info.dropdown-toggle:hover,\n    .open > .btn-info.dropdown-toggle:focus,\n    .open > .btn-info.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #269abc;\n      border-color: #1b6d85; }\n  .btn-info:active, .btn-info.active,\n  .open > .btn-info.dropdown-toggle {\n    background-image: none; }\n  .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,\n  fieldset[disabled] .btn-info:hover,\n  fieldset[disabled] .btn-info:focus,\n  fieldset[disabled] .btn-info.focus {\n    background-color: #5bc0de;\n    border-color: #46b8da; }\n  .btn-info .badge {\n    color: #5bc0de;\n    background-color: #fff; }\n\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236; }\n  .btn-warning:focus, .btn-warning.focus {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #985f0d; }\n  .btn-warning:hover {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #d58512; }\n  .btn-warning:active, .btn-warning.active,\n  .open > .btn-warning.dropdown-toggle {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #d58512; }\n    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,\n    .open > .btn-warning.dropdown-toggle:hover,\n    .open > .btn-warning.dropdown-toggle:focus,\n    .open > .btn-warning.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #d58512;\n      border-color: #985f0d; }\n  .btn-warning:active, .btn-warning.active,\n  .open > .btn-warning.dropdown-toggle {\n    background-image: none; }\n  .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,\n  fieldset[disabled] .btn-warning:hover,\n  fieldset[disabled] .btn-warning:focus,\n  fieldset[disabled] .btn-warning.focus {\n    background-color: #f0ad4e;\n    border-color: #eea236; }\n  .btn-warning .badge {\n    color: #f0ad4e;\n    background-color: #fff; }\n\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a; }\n  .btn-danger:focus, .btn-danger.focus {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #761c19; }\n  .btn-danger:hover {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #ac2925; }\n  .btn-danger:active, .btn-danger.active,\n  .open > .btn-danger.dropdown-toggle {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #ac2925; }\n    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,\n    .open > .btn-danger.dropdown-toggle:hover,\n    .open > .btn-danger.dropdown-toggle:focus,\n    .open > .btn-danger.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #ac2925;\n      border-color: #761c19; }\n  .btn-danger:active, .btn-danger.active,\n  .open > .btn-danger.dropdown-toggle {\n    background-image: none; }\n  .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,\n  fieldset[disabled] .btn-danger:hover,\n  fieldset[disabled] .btn-danger:focus,\n  fieldset[disabled] .btn-danger.focus {\n    background-color: #d9534f;\n    border-color: #d43f3a; }\n  .btn-danger .badge {\n    color: #d9534f;\n    background-color: #fff; }\n\n.btn-link {\n  color: #337ab7;\n  font-weight: normal;\n  border-radius: 0; }\n  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],\n  fieldset[disabled] .btn-link {\n    background-color: transparent;\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {\n    border-color: transparent; }\n  .btn-link:hover, .btn-link:focus {\n    color: #23527c;\n    text-decoration: underline;\n    background-color: transparent; }\n  .btn-link[disabled]:hover, .btn-link[disabled]:focus,\n  fieldset[disabled] .btn-link:hover,\n  fieldset[disabled] .btn-link:focus {\n    color: #777777;\n    text-decoration: none; }\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.btn-xs, .btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.btn-block {\n  display: block;\n  width: 100%; }\n\n.btn-block + .btn-block {\n  margin-top: 5px; }\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%; }\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear; }\n  .fade.in {\n    opacity: 1; }\n\n.collapse {\n  display: none; }\n  .collapse.in {\n    display: block; }\n\ntr.collapse.in {\n  display: table-row; }\n\ntbody.collapse.in {\n  display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease; }\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent; }\n\n.dropup,\n.dropdown {\n  position: relative; }\n\n.dropdown-toggle:focus {\n  outline: 0; }\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box; }\n  .dropdown-menu.pull-right {\n    right: 0;\n    left: auto; }\n  .dropdown-menu .divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5; }\n  .dropdown-menu > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: 1.428571429;\n    color: #333333;\n    white-space: nowrap; }\n\n.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5; }\n\n.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #337ab7; }\n\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n  color: #777777; }\n\n.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed; }\n\n.open > .dropdown-menu {\n  display: block; }\n\n.open > a {\n  outline: 0; }\n\n.dropdown-menu-right {\n  left: auto;\n  right: 0; }\n\n.dropdown-menu-left {\n  left: 0;\n  right: auto; }\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #777777;\n  white-space: nowrap; }\n\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990; }\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto; }\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n  content: \"\"; }\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px; }\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto; }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto; } }\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; }\n  .btn-group > .btn,\n  .btn-group-vertical > .btn {\n    position: relative;\n    float: left; }\n    .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n    .btn-group-vertical > .btn:hover,\n    .btn-group-vertical > .btn:focus,\n    .btn-group-vertical > .btn:active,\n    .btn-group-vertical > .btn.active {\n      z-index: 2; }\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px; }\n\n.btn-toolbar {\n  margin-left: -5px; }\n  .btn-toolbar:before, .btn-toolbar:after {\n    content: \" \";\n    display: table; }\n  .btn-toolbar:after {\n    clear: both; }\n  .btn-toolbar .btn,\n  .btn-toolbar .btn-group,\n  .btn-toolbar .input-group {\n    float: left; }\n  .btn-toolbar > .btn,\n  .btn-toolbar > .btn-group,\n  .btn-toolbar > .input-group {\n    margin-left: 5px; }\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0; }\n\n.btn-group > .btn:first-child {\n  margin-left: 0; }\n  .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n    border-bottom-right-radius: 0;\n    border-top-right-radius: 0; }\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group > .btn-group {\n  float: left; }\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0; }\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0; }\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0; }\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px; }\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n  .btn-group.open .dropdown-toggle.btn-link {\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n\n.btn .caret {\n  margin-left: 0; }\n\n.btn-lg .caret, .btn-group-lg > .btn .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0; }\n\n.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {\n  border-width: 0 5px 5px; }\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%; }\n\n.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {\n  content: \" \";\n  display: table; }\n\n.btn-group-vertical > .btn-group:after {\n  clear: both; }\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none; }\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0; }\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0; }\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px; }\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0; }\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate; }\n  .btn-group-justified > .btn,\n  .btn-group-justified > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%; }\n  .btn-group-justified > .btn-group .btn {\n    width: 100%; }\n  .btn-group-justified > .btn-group .dropdown-menu {\n    left: auto; }\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none; }\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate; }\n  .input-group[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0; }\n  .input-group .form-control {\n    position: relative;\n    z-index: 2;\n    float: left;\n    width: 100%;\n    margin-bottom: 0; }\n    .input-group .form-control:focus {\n      z-index: 3; }\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell; }\n  .input-group-addon:not(:first-child):not(:last-child),\n  .input-group-btn:not(:first-child):not(:last-child),\n  .input-group .form-control:not(:first-child):not(:last-child) {\n    border-radius: 0; }\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; }\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 4px; }\n  .input-group-addon.input-sm,\n  .input-group-sm > .input-group-addon,\n  .input-group-sm > .input-group-btn > .input-group-addon.btn {\n    padding: 5px 10px;\n    font-size: 12px;\n    border-radius: 3px; }\n  .input-group-addon.input-lg,\n  .input-group-lg > .input-group-addon,\n  .input-group-lg > .input-group-btn > .input-group-addon.btn {\n    padding: 10px 16px;\n    font-size: 18px;\n    border-radius: 6px; }\n  .input-group-addon input[type=\"radio\"],\n  .input-group-addon input[type=\"checkbox\"] {\n    margin-top: 0; }\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0; }\n\n.input-group-addon:first-child {\n  border-right: 0; }\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.input-group-addon:last-child {\n  border-left: 0; }\n\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap; }\n  .input-group-btn > .btn {\n    position: relative; }\n    .input-group-btn > .btn + .btn {\n      margin-left: -1px; }\n    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {\n      z-index: 2; }\n  .input-group-btn:first-child > .btn,\n  .input-group-btn:first-child > .btn-group {\n    margin-right: -1px; }\n  .input-group-btn:last-child > .btn,\n  .input-group-btn:last-child > .btn-group {\n    z-index: 2;\n    margin-left: -1px; }\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none; }\n  .nav:before, .nav:after {\n    content: \" \";\n    display: table; }\n  .nav:after {\n    clear: both; }\n  .nav > li {\n    position: relative;\n    display: block; }\n    .nav > li > a {\n      position: relative;\n      display: block;\n      padding: 10px 15px; }\n      .nav > li > a:hover, .nav > li > a:focus {\n        text-decoration: none;\n        background-color: #eeeeee; }\n    .nav > li.disabled > a {\n      color: #777777; }\n      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {\n        color: #777777;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed; }\n  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\n    background-color: #eeeeee;\n    border-color: #337ab7; }\n  .nav .nav-divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5; }\n  .nav > li > a > img {\n    max-width: none; }\n\n.nav-tabs {\n  border-bottom: 1px solid #ddd; }\n  .nav-tabs > li {\n    float: left;\n    margin-bottom: -1px; }\n    .nav-tabs > li > a {\n      margin-right: 2px;\n      line-height: 1.428571429;\n      border: 1px solid transparent;\n      border-radius: 4px 4px 0 0; }\n      .nav-tabs > li > a:hover {\n        border-color: #eeeeee #eeeeee #ddd; }\n    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\n      color: #555555;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      border-bottom-color: transparent;\n      cursor: default; }\n\n.nav-pills > li {\n  float: left; }\n  .nav-pills > li > a {\n    border-radius: 4px; }\n  .nav-pills > li + li {\n    margin-left: 2px; }\n  .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {\n    color: #fff;\n    background-color: #337ab7; }\n\n.nav-stacked > li {\n  float: none; }\n  .nav-stacked > li + li {\n    margin-top: 2px;\n    margin-left: 0; }\n\n.nav-justified, .nav-tabs.nav-justified {\n  width: 100%; }\n  .nav-justified > li, .nav-tabs.nav-justified > li {\n    float: none; }\n    .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n      text-align: center;\n      margin-bottom: 5px; }\n  .nav-justified > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto; }\n  @media (min-width: 768px) {\n    .nav-justified > li, .nav-tabs.nav-justified > li {\n      display: table-cell;\n      width: 1%; }\n      .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n        margin-bottom: 0; } }\n\n.nav-tabs-justified, .nav-tabs.nav-justified {\n  border-bottom: 0; }\n  .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n    margin-right: 0;\n    border-radius: 4px; }\n  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n    border: 1px solid #ddd; }\n  @media (min-width: 768px) {\n    .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n      border-bottom: 1px solid #ddd;\n      border-radius: 4px 4px 0 0; }\n    .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n    .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n    .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n      border-bottom-color: #fff; } }\n\n.tab-content > .tab-pane {\n  display: none; }\n\n.tab-content > .active {\n  display: block; }\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent; }\n  .navbar:before, .navbar:after {\n    content: \" \";\n    display: table; }\n  .navbar:after {\n    clear: both; }\n  @media (min-width: 768px) {\n    .navbar {\n      border-radius: 4px; } }\n\n.navbar-header:before, .navbar-header:after {\n  content: \" \";\n  display: table; }\n\n.navbar-header:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left; } }\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch; }\n  .navbar-collapse:before, .navbar-collapse:after {\n    content: \" \";\n    display: table; }\n  .navbar-collapse:after {\n    clear: both; }\n  .navbar-collapse.in {\n    overflow-y: auto; }\n  @media (min-width: 768px) {\n    .navbar-collapse {\n      width: auto;\n      border-top: 0;\n      box-shadow: none; }\n      .navbar-collapse.collapse {\n        display: block !important;\n        height: auto !important;\n        padding-bottom: 0;\n        overflow: visible !important; }\n      .navbar-collapse.in {\n        overflow-y: visible; }\n      .navbar-fixed-top .navbar-collapse,\n      .navbar-static-top .navbar-collapse,\n      .navbar-fixed-bottom .navbar-collapse {\n        padding-left: 0;\n        padding-right: 0; } }\n\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px; }\n  @media (max-device-width: 480px) and (orientation: landscape) {\n    .navbar-fixed-top .navbar-collapse,\n    .navbar-fixed-bottom .navbar-collapse {\n      max-height: 200px; } }\n\n.container > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px; }\n  @media (min-width: 768px) {\n    .container > .navbar-header,\n    .container > .navbar-collapse,\n    .container-fluid > .navbar-header,\n    .container-fluid > .navbar-collapse {\n      margin-right: 0;\n      margin-left: 0; } }\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px; }\n  @media (min-width: 768px) {\n    .navbar-static-top {\n      border-radius: 0; } }\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030; }\n  @media (min-width: 768px) {\n    .navbar-fixed-top,\n    .navbar-fixed-bottom {\n      border-radius: 0; } }\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px; }\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0; }\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px; }\n  .navbar-brand:hover, .navbar-brand:focus {\n    text-decoration: none; }\n  .navbar-brand > img {\n    display: block; }\n  @media (min-width: 768px) {\n    .navbar > .container .navbar-brand,\n    .navbar > .container-fluid .navbar-brand {\n      margin-left: -15px; } }\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px; }\n  .navbar-toggle:focus {\n    outline: 0; }\n  .navbar-toggle .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px; }\n  .navbar-toggle .icon-bar + .icon-bar {\n    margin-top: 4px; }\n  @media (min-width: 768px) {\n    .navbar-toggle {\n      display: none; } }\n\n.navbar-nav {\n  margin: 7.5px -15px; }\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n    line-height: 20px; }\n  @media (max-width: 767px) {\n    .navbar-nav .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none; }\n      .navbar-nav .open .dropdown-menu > li > a,\n      .navbar-nav .open .dropdown-menu .dropdown-header {\n        padding: 5px 15px 5px 25px; }\n      .navbar-nav .open .dropdown-menu > li > a {\n        line-height: 20px; }\n        .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {\n          background-image: none; } }\n  @media (min-width: 768px) {\n    .navbar-nav {\n      float: left;\n      margin: 0; }\n      .navbar-nav > li {\n        float: left; }\n        .navbar-nav > li > a {\n          padding-top: 15px;\n          padding-bottom: 15px; } }\n\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px; }\n  @media (min-width: 768px) {\n    .navbar-form .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle; }\n    .navbar-form .form-control {\n      display: inline-block;\n      width: auto;\n      vertical-align: middle; }\n    .navbar-form .form-control-static {\n      display: inline-block; }\n    .navbar-form .input-group {\n      display: inline-table;\n      vertical-align: middle; }\n      .navbar-form .input-group .input-group-addon,\n      .navbar-form .input-group .input-group-btn,\n      .navbar-form .input-group .form-control {\n        width: auto; }\n    .navbar-form .input-group > .form-control {\n      width: 100%; }\n    .navbar-form .control-label {\n      margin-bottom: 0;\n      vertical-align: middle; }\n    .navbar-form .radio,\n    .navbar-form .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle; }\n      .navbar-form .radio label,\n      .navbar-form .checkbox label {\n        padding-left: 0; }\n    .navbar-form .radio input[type=\"radio\"],\n    .navbar-form .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0; }\n    .navbar-form .has-feedback .form-control-feedback {\n      top: 0; } }\n  @media (max-width: 767px) {\n    .navbar-form .form-group {\n      margin-bottom: 5px; }\n      .navbar-form .form-group:last-child {\n        margin-bottom: 0; } }\n  @media (min-width: 768px) {\n    .navbar-form {\n      width: auto;\n      border: 0;\n      margin-left: 0;\n      margin-right: 0;\n      padding-top: 0;\n      padding-bottom: 0;\n      -webkit-box-shadow: none;\n      box-shadow: none; } }\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px; }\n  .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {\n    margin-top: 10px;\n    margin-bottom: 10px; }\n  .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {\n    margin-top: 14px;\n    margin-bottom: 14px; }\n\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px; }\n  @media (min-width: 768px) {\n    .navbar-text {\n      float: left;\n      margin-left: 15px;\n      margin-right: 15px; } }\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important; }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px; }\n    .navbar-right ~ .navbar-right {\n      margin-right: 0; } }\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7; }\n  .navbar-default .navbar-brand {\n    color: #777; }\n    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {\n      color: #5e5e5e;\n      background-color: transparent; }\n  .navbar-default .navbar-text {\n    color: #777; }\n  .navbar-default .navbar-nav > li > a {\n    color: #777; }\n    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {\n      color: #333;\n      background-color: transparent; }\n  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7; }\n  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent; }\n  .navbar-default .navbar-toggle {\n    border-color: #ddd; }\n    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n      background-color: #ddd; }\n    .navbar-default .navbar-toggle .icon-bar {\n      background-color: #888; }\n  .navbar-default .navbar-collapse,\n  .navbar-default .navbar-form {\n    border-color: #e7e7e7; }\n  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {\n    background-color: #e7e7e7;\n    color: #555; }\n  @media (max-width: 767px) {\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n      color: #777; }\n      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #333;\n        background-color: transparent; }\n    .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 {\n      color: #555;\n      background-color: #e7e7e7; }\n    .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 {\n      color: #ccc;\n      background-color: transparent; } }\n  .navbar-default .navbar-link {\n    color: #777; }\n    .navbar-default .navbar-link:hover {\n      color: #333; }\n  .navbar-default .btn-link {\n    color: #777; }\n    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {\n      color: #333; }\n    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,\n    fieldset[disabled] .navbar-default .btn-link:hover,\n    fieldset[disabled] .navbar-default .btn-link:focus {\n      color: #ccc; }\n\n.navbar-inverse {\n  background-color: #222;\n  border-color: #090909; }\n  .navbar-inverse .navbar-brand {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {\n      color: #fff;\n      background-color: transparent; }\n  .navbar-inverse .navbar-text {\n    color: #9d9d9d; }\n  .navbar-inverse .navbar-nav > li > a {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {\n      color: #fff;\n      background-color: transparent; }\n  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {\n    color: #fff;\n    background-color: #090909; }\n  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {\n    color: #444;\n    background-color: transparent; }\n  .navbar-inverse .navbar-toggle {\n    border-color: #333; }\n    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {\n      background-color: #333; }\n    .navbar-inverse .navbar-toggle .icon-bar {\n      background-color: #fff; }\n  .navbar-inverse .navbar-collapse,\n  .navbar-inverse .navbar-form {\n    border-color: #101010; }\n  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {\n    background-color: #090909;\n    color: #fff; }\n  @media (max-width: 767px) {\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n      border-color: #090909; }\n    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n      background-color: #090909; }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n      color: #9d9d9d; }\n      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #fff;\n        background-color: transparent; }\n    .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 {\n      color: #fff;\n      background-color: #090909; }\n    .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 {\n      color: #444;\n      background-color: transparent; } }\n  .navbar-inverse .navbar-link {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-link:hover {\n      color: #fff; }\n  .navbar-inverse .btn-link {\n    color: #9d9d9d; }\n    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {\n      color: #fff; }\n    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,\n    fieldset[disabled] .navbar-inverse .btn-link:hover,\n    fieldset[disabled] .navbar-inverse .btn-link:focus {\n      color: #444; }\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px; }\n  .breadcrumb > li {\n    display: inline-block; }\n    .breadcrumb > li + li:before {\n      content: \"/ \";\n      padding: 0 5px;\n      color: #ccc; }\n  .breadcrumb > .active {\n    color: #777777; }\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px; }\n  .pagination > li {\n    display: inline; }\n    .pagination > li > a,\n    .pagination > li > span {\n      position: relative;\n      float: left;\n      padding: 6px 12px;\n      line-height: 1.428571429;\n      text-decoration: none;\n      color: #337ab7;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      margin-left: -1px; }\n    .pagination > li:first-child > a,\n    .pagination > li:first-child > span {\n      margin-left: 0;\n      border-bottom-left-radius: 4px;\n      border-top-left-radius: 4px; }\n    .pagination > li:last-child > a,\n    .pagination > li:last-child > span {\n      border-bottom-right-radius: 4px;\n      border-top-right-radius: 4px; }\n  .pagination > li > a:hover, .pagination > li > a:focus,\n  .pagination > li > span:hover,\n  .pagination > li > span:focus {\n    z-index: 2;\n    color: #23527c;\n    background-color: #eeeeee;\n    border-color: #ddd; }\n  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,\n  .pagination > .active > span,\n  .pagination > .active > span:hover,\n  .pagination > .active > span:focus {\n    z-index: 3;\n    color: #fff;\n    background-color: #337ab7;\n    border-color: #337ab7;\n    cursor: default; }\n  .pagination > .disabled > span,\n  .pagination > .disabled > span:hover,\n  .pagination > .disabled > span:focus,\n  .pagination > .disabled > a,\n  .pagination > .disabled > a:hover,\n  .pagination > .disabled > a:focus {\n    color: #777777;\n    background-color: #fff;\n    border-color: #ddd;\n    cursor: not-allowed; }\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333; }\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px; }\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px; }\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5; }\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px; }\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px; }\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center; }\n  .pager:before, .pager:after {\n    content: \" \";\n    display: table; }\n  .pager:after {\n    clear: both; }\n  .pager li {\n    display: inline; }\n    .pager li > a,\n    .pager li > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      border-radius: 15px; }\n    .pager li > a:hover,\n    .pager li > a:focus {\n      text-decoration: none;\n      background-color: #eeeeee; }\n  .pager .next > a,\n  .pager .next > span {\n    float: right; }\n  .pager .previous > a,\n  .pager .previous > span {\n    float: left; }\n  .pager .disabled > a,\n  .pager .disabled > a:hover,\n  .pager .disabled > a:focus,\n  .pager .disabled > span {\n    color: #777777;\n    background-color: #fff;\n    cursor: not-allowed; }\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em; }\n  .label:empty {\n    display: none; }\n  .btn .label {\n    position: relative;\n    top: -1px; }\n\na.label:hover, a.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer; }\n\n.label-default {\n  background-color: #777777; }\n  .label-default[href]:hover, .label-default[href]:focus {\n    background-color: #5e5e5e; }\n\n.label-primary {\n  background-color: #337ab7; }\n  .label-primary[href]:hover, .label-primary[href]:focus {\n    background-color: #286090; }\n\n.label-success {\n  background-color: #5cb85c; }\n  .label-success[href]:hover, .label-success[href]:focus {\n    background-color: #449d44; }\n\n.label-info {\n  background-color: #5bc0de; }\n  .label-info[href]:hover, .label-info[href]:focus {\n    background-color: #31b0d5; }\n\n.label-warning {\n  background-color: #f0ad4e; }\n  .label-warning[href]:hover, .label-warning[href]:focus {\n    background-color: #ec971f; }\n\n.label-danger {\n  background-color: #d9534f; }\n  .label-danger[href]:hover, .label-danger[href]:focus {\n    background-color: #c9302c; }\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #fff;\n  line-height: 1;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px; }\n  .badge:empty {\n    display: none; }\n  .btn .badge {\n    position: relative;\n    top: -1px; }\n  .btn-xs .badge, .btn-group-xs > .btn .badge,\n  .btn-group-xs > .btn .badge {\n    top: 0;\n    padding: 1px 5px; }\n  .list-group-item.active > .badge,\n  .nav-pills > .active > a > .badge {\n    color: #337ab7;\n    background-color: #fff; }\n  .list-group-item > .badge {\n    float: right; }\n  .list-group-item > .badge + .badge {\n    margin-right: 5px; }\n  .nav-pills > li > a > .badge {\n    margin-left: 3px; }\n\na.badge:hover, a.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer; }\n\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee; }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    color: inherit; }\n  .jumbotron p {\n    margin-bottom: 15px;\n    font-size: 21px;\n    font-weight: 200; }\n  .jumbotron > hr {\n    border-top-color: #d5d5d5; }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    border-radius: 6px;\n    padding-left: 15px;\n    padding-right: 15px; }\n  .jumbotron .container {\n    max-width: 100%; }\n  @media screen and (min-width: 768px) {\n    .jumbotron {\n      padding-top: 48px;\n      padding-bottom: 48px; }\n      .container .jumbotron,\n      .container-fluid .jumbotron {\n        padding-left: 60px;\n        padding-right: 60px; }\n      .jumbotron h1,\n      .jumbotron .h1 {\n        font-size: 63px; } }\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out; }\n  .thumbnail > img,\n  .thumbnail a > img {\n    display: block;\n    max-width: 100%;\n    height: auto;\n    margin-left: auto;\n    margin-right: auto; }\n  .thumbnail .caption {\n    padding: 9px;\n    color: #333333; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7; }\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px; }\n  .alert h4 {\n    margin-top: 0;\n    color: inherit; }\n  .alert .alert-link {\n    font-weight: bold; }\n  .alert > p,\n  .alert > ul {\n    margin-bottom: 0; }\n  .alert > p + p {\n    margin-top: 5px; }\n\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px; }\n  .alert-dismissable .close,\n  .alert-dismissible .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit; }\n\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d; }\n  .alert-success hr {\n    border-top-color: #c9e2b3; }\n  .alert-success .alert-link {\n    color: #2b542c; }\n\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f; }\n  .alert-info hr {\n    border-top-color: #a6e1ec; }\n  .alert-info .alert-link {\n    color: #245269; }\n\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b; }\n  .alert-warning hr {\n    border-top-color: #f7e1b5; }\n  .alert-warning .alert-link {\n    color: #66512c; }\n\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442; }\n  .alert-danger hr {\n    border-top-color: #e4b9c0; }\n  .alert-danger .alert-link {\n    color: #843534; }\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0; }\n  to {\n    background-position: 0 0; } }\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0; }\n  to {\n    background-position: 0 0; } }\n\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); }\n\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease; }\n\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  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);\n  background-image: -o-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);\n  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);\n  background-size: 40px 40px; }\n\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite; }\n\n.progress-bar-success {\n  background-color: #5cb85c; }\n  .progress-striped .progress-bar-success {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-info {\n  background-color: #5bc0de; }\n  .progress-striped .progress-bar-info {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-warning {\n  background-color: #f0ad4e; }\n  .progress-striped .progress-bar-warning {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-danger {\n  background-color: #d9534f; }\n  .progress-striped .progress-bar-danger {\n    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);\n    background-image: -o-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);\n    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); }\n\n.media {\n  margin-top: 15px; }\n  .media:first-child {\n    margin-top: 0; }\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden; }\n\n.media-body {\n  width: 10000px; }\n\n.media-object {\n  display: block; }\n  .media-object.img-thumbnail {\n    max-width: none; }\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px; }\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px; }\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top; }\n\n.media-middle {\n  vertical-align: middle; }\n\n.media-bottom {\n  vertical-align: bottom; }\n\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px; }\n\n.media-list {\n  padding-left: 0;\n  list-style: none; }\n\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0; }\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd; }\n  .list-group-item:first-child {\n    border-top-right-radius: 4px;\n    border-top-left-radius: 4px; }\n  .list-group-item:last-child {\n    margin-bottom: 0;\n    border-bottom-right-radius: 4px;\n    border-bottom-left-radius: 4px; }\n\na.list-group-item,\nbutton.list-group-item {\n  color: #555; }\n  a.list-group-item .list-group-item-heading,\n  button.list-group-item .list-group-item-heading {\n    color: #333; }\n  a.list-group-item:hover, a.list-group-item:focus,\n  button.list-group-item:hover,\n  button.list-group-item:focus {\n    text-decoration: none;\n    color: #555;\n    background-color: #f5f5f5; }\n\nbutton.list-group-item {\n  width: 100%;\n  text-align: left; }\n\n.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed; }\n  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {\n    color: inherit; }\n  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {\n    color: #777777; }\n\n.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7; }\n  .list-group-item.active .list-group-item-heading,\n  .list-group-item.active .list-group-item-heading > small,\n  .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,\n  .list-group-item.active:hover .list-group-item-heading > small,\n  .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,\n  .list-group-item.active:focus .list-group-item-heading > small,\n  .list-group-item.active:focus .list-group-item-heading > .small {\n    color: inherit; }\n  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {\n    color: #c7ddef; }\n\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8; }\n\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d; }\n  a.list-group-item-success .list-group-item-heading,\n  button.list-group-item-success .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-success:hover, a.list-group-item-success:focus,\n  button.list-group-item-success:hover,\n  button.list-group-item-success:focus {\n    color: #3c763d;\n    background-color: #d0e9c6; }\n  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,\n  button.list-group-item-success.active,\n  button.list-group-item-success.active:hover,\n  button.list-group-item-success.active:focus {\n    color: #fff;\n    background-color: #3c763d;\n    border-color: #3c763d; }\n\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7; }\n\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f; }\n  a.list-group-item-info .list-group-item-heading,\n  button.list-group-item-info .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-info:hover, a.list-group-item-info:focus,\n  button.list-group-item-info:hover,\n  button.list-group-item-info:focus {\n    color: #31708f;\n    background-color: #c4e3f3; }\n  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,\n  button.list-group-item-info.active,\n  button.list-group-item-info.active:hover,\n  button.list-group-item-info.active:focus {\n    color: #fff;\n    background-color: #31708f;\n    border-color: #31708f; }\n\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3; }\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b; }\n  a.list-group-item-warning .list-group-item-heading,\n  button.list-group-item-warning .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-warning:hover, a.list-group-item-warning:focus,\n  button.list-group-item-warning:hover,\n  button.list-group-item-warning:focus {\n    color: #8a6d3b;\n    background-color: #faf2cc; }\n  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,\n  button.list-group-item-warning.active,\n  button.list-group-item-warning.active:hover,\n  button.list-group-item-warning.active:focus {\n    color: #fff;\n    background-color: #8a6d3b;\n    border-color: #8a6d3b; }\n\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede; }\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442; }\n  a.list-group-item-danger .list-group-item-heading,\n  button.list-group-item-danger .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-danger:hover, a.list-group-item-danger:focus,\n  button.list-group-item-danger:hover,\n  button.list-group-item-danger:focus {\n    color: #a94442;\n    background-color: #ebcccc; }\n  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,\n  button.list-group-item-danger.active,\n  button.list-group-item-danger.active:hover,\n  button.list-group-item-danger.active:focus {\n    color: #fff;\n    background-color: #a94442;\n    border-color: #a94442; }\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px; }\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3; }\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }\n\n.panel-body {\n  padding: 15px; }\n  .panel-body:before, .panel-body:after {\n    content: \" \";\n    display: table; }\n  .panel-body:after {\n    clear: both; }\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px; }\n  .panel-heading > .dropdown .dropdown-toggle {\n    color: inherit; }\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit; }\n  .panel-title > a,\n  .panel-title > small,\n  .panel-title > .small,\n  .panel-title > small > a,\n  .panel-title > .small > a {\n    color: inherit; }\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px; }\n\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0; }\n  .panel > .list-group .list-group-item,\n  .panel > .panel-collapse > .list-group .list-group-item {\n    border-width: 1px 0;\n    border-radius: 0; }\n  .panel > .list-group:first-child .list-group-item:first-child,\n  .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n    border-top: 0;\n    border-top-right-radius: 3px;\n    border-top-left-radius: 3px; }\n  .panel > .list-group:last-child .list-group-item:last-child,\n  .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n    border-bottom: 0;\n    border-bottom-right-radius: 3px;\n    border-bottom-left-radius: 3px; }\n\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0; }\n\n.list-group + .panel-footer {\n  border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0; }\n  .panel > .table caption,\n  .panel > .table-responsive > .table caption,\n  .panel > .panel-collapse > .table caption {\n    padding-left: 15px;\n    padding-right: 15px; }\n\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px; }\n  .panel > .table:first-child > thead:first-child > tr:first-child,\n  .panel > .table:first-child > tbody:first-child > tr:first-child,\n  .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n  .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n    border-top-left-radius: 3px;\n    border-top-right-radius: 3px; }\n    .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n    .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n      border-top-left-radius: 3px; }\n    .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n    .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n      border-top-right-radius: 3px; }\n\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px; }\n  .panel > .table:last-child > tbody:last-child > tr:last-child,\n  .panel > .table:last-child > tfoot:last-child > tr:last-child,\n  .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n  .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n    border-bottom-left-radius: 3px;\n    border-bottom-right-radius: 3px; }\n    .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n    .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n      border-bottom-left-radius: 3px; }\n    .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n    .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n      border-bottom-right-radius: 3px; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd; }\n\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0; }\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0; }\n  .panel > .table-bordered > thead > tr > th:first-child,\n  .panel > .table-bordered > thead > tr > td:first-child,\n  .panel > .table-bordered > tbody > tr > th:first-child,\n  .panel > .table-bordered > tbody > tr > td:first-child,\n  .panel > .table-bordered > tfoot > tr > th:first-child,\n  .panel > .table-bordered > tfoot > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0; }\n  .panel > .table-bordered > thead > tr > th:last-child,\n  .panel > .table-bordered > thead > tr > td:last-child,\n  .panel > .table-bordered > tbody > tr > th:last-child,\n  .panel > .table-bordered > tbody > tr > td:last-child,\n  .panel > .table-bordered > tfoot > tr > th:last-child,\n  .panel > .table-bordered > tfoot > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0; }\n  .panel > .table-bordered > thead > tr:first-child > td,\n  .panel > .table-bordered > thead > tr:first-child > th,\n  .panel > .table-bordered > tbody > tr:first-child > td,\n  .panel > .table-bordered > tbody > tr:first-child > th,\n  .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n  .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n    border-bottom: 0; }\n  .panel > .table-bordered > tbody > tr:last-child > td,\n  .panel > .table-bordered > tbody > tr:last-child > th,\n  .panel > .table-bordered > tfoot > tr:last-child > td,\n  .panel > .table-bordered > tfoot > tr:last-child > th,\n  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n    border-bottom: 0; }\n\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0; }\n\n.panel-group {\n  margin-bottom: 20px; }\n  .panel-group .panel {\n    margin-bottom: 0;\n    border-radius: 4px; }\n    .panel-group .panel + .panel {\n      margin-top: 5px; }\n  .panel-group .panel-heading {\n    border-bottom: 0; }\n    .panel-group .panel-heading + .panel-collapse > .panel-body,\n    .panel-group .panel-heading + .panel-collapse > .list-group {\n      border-top: 1px solid #ddd; }\n  .panel-group .panel-footer {\n    border-top: 0; }\n    .panel-group .panel-footer + .panel-collapse .panel-body {\n      border-bottom: 1px solid #ddd; }\n\n.panel-default {\n  border-color: #ddd; }\n  .panel-default > .panel-heading {\n    color: #333333;\n    background-color: #f5f5f5;\n    border-color: #ddd; }\n    .panel-default > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #ddd; }\n    .panel-default > .panel-heading .badge {\n      color: #f5f5f5;\n      background-color: #333333; }\n  .panel-default > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #ddd; }\n\n.panel-primary {\n  border-color: #337ab7; }\n  .panel-primary > .panel-heading {\n    color: #fff;\n    background-color: #337ab7;\n    border-color: #337ab7; }\n    .panel-primary > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #337ab7; }\n    .panel-primary > .panel-heading .badge {\n      color: #337ab7;\n      background-color: #fff; }\n  .panel-primary > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #337ab7; }\n\n.panel-success {\n  border-color: #d6e9c6; }\n  .panel-success > .panel-heading {\n    color: #3c763d;\n    background-color: #dff0d8;\n    border-color: #d6e9c6; }\n    .panel-success > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #d6e9c6; }\n    .panel-success > .panel-heading .badge {\n      color: #dff0d8;\n      background-color: #3c763d; }\n  .panel-success > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #d6e9c6; }\n\n.panel-info {\n  border-color: #bce8f1; }\n  .panel-info > .panel-heading {\n    color: #31708f;\n    background-color: #d9edf7;\n    border-color: #bce8f1; }\n    .panel-info > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #bce8f1; }\n    .panel-info > .panel-heading .badge {\n      color: #d9edf7;\n      background-color: #31708f; }\n  .panel-info > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #bce8f1; }\n\n.panel-warning {\n  border-color: #faebcc; }\n  .panel-warning > .panel-heading {\n    color: #8a6d3b;\n    background-color: #fcf8e3;\n    border-color: #faebcc; }\n    .panel-warning > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #faebcc; }\n    .panel-warning > .panel-heading .badge {\n      color: #fcf8e3;\n      background-color: #8a6d3b; }\n  .panel-warning > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #faebcc; }\n\n.panel-danger {\n  border-color: #ebccd1; }\n  .panel-danger > .panel-heading {\n    color: #a94442;\n    background-color: #f2dede;\n    border-color: #ebccd1; }\n    .panel-danger > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #ebccd1; }\n    .panel-danger > .panel-heading .badge {\n      color: #f2dede;\n      background-color: #a94442; }\n  .panel-danger > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #ebccd1; }\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden; }\n  .embed-responsive .embed-responsive-item,\n  .embed-responsive iframe,\n  .embed-responsive embed,\n  .embed-responsive object,\n  .embed-responsive video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0; }\n\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%; }\n\n.embed-responsive-4by3 {\n  padding-bottom: 75%; }\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }\n  .well blockquote {\n    border-color: #ddd;\n    border-color: rgba(0, 0, 0, 0.15); }\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px; }\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px; }\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: 0.2;\n  filter: alpha(opacity=20); }\n  .close:hover, .close:focus {\n    color: #000;\n    text-decoration: none;\n    cursor: pointer;\n    opacity: 0.5;\n    filter: alpha(opacity=50); }\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none; }\n\n.modal-open {\n  overflow: hidden; }\n\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0; }\n  .modal.fade .modal-dialog {\n    -webkit-transform: translate(0, -25%);\n    -ms-transform: translate(0, -25%);\n    -o-transform: translate(0, -25%);\n    transform: translate(0, -25%);\n    -webkit-transition: -webkit-transform 0.3s ease-out;\n    -moz-transition: -moz-transform 0.3s ease-out;\n    -o-transition: -o-transform 0.3s ease-out;\n    transition: transform 0.3s ease-out; }\n  .modal.in .modal-dialog {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    -o-transform: translate(0, 0);\n    transform: translate(0, 0); }\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto; }\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px; }\n\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0; }\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000; }\n  .modal-backdrop.fade {\n    opacity: 0;\n    filter: alpha(opacity=0); }\n  .modal-backdrop.in {\n    opacity: 0.5;\n    filter: alpha(opacity=50); }\n\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5; }\n  .modal-header:before, .modal-header:after {\n    content: \" \";\n    display: table; }\n  .modal-header:after {\n    clear: both; }\n\n.modal-header .close {\n  margin-top: -2px; }\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429; }\n\n.modal-body {\n  position: relative;\n  padding: 15px; }\n\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5; }\n  .modal-footer:before, .modal-footer:after {\n    content: \" \";\n    display: table; }\n  .modal-footer:after {\n    clear: both; }\n  .modal-footer .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; }\n  .modal-footer .btn-group .btn + .btn {\n    margin-left: -1px; }\n  .modal-footer .btn-block + .btn-block {\n    margin-left: 0; }\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll; }\n\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto; }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }\n  .modal-sm {\n    width: 300px; } }\n\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px; } }\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Lato\", sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.428571429;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 12px;\n  opacity: 0;\n  filter: alpha(opacity=0); }\n  .tooltip.in {\n    opacity: 0.9;\n    filter: alpha(opacity=90); }\n  .tooltip.top {\n    margin-top: -3px;\n    padding: 5px 0; }\n  .tooltip.right {\n    margin-left: 3px;\n    padding: 0 5px; }\n  .tooltip.bottom {\n    margin-top: 3px;\n    padding: 5px 0; }\n  .tooltip.left {\n    margin-left: -3px;\n    padding: 0 5px; }\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px; }\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid; }\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000; }\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000; }\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Lato\", sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.428571429;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 14px;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }\n  .popover.top {\n    margin-top: -10px; }\n  .popover.right {\n    margin-left: 10px; }\n  .popover.bottom {\n    margin-top: 10px; }\n  .popover.left {\n    margin-left: -10px; }\n\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0; }\n\n.popover-content {\n  padding: 9px 14px; }\n\n.popover > .arrow, .popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid; }\n\n.popover > .arrow {\n  border-width: 11px; }\n\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\"; }\n\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px; }\n  .popover.top > .arrow:after {\n    content: \" \";\n    bottom: 1px;\n    margin-left: -10px;\n    border-bottom-width: 0;\n    border-top-color: #fff; }\n\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25); }\n  .popover.right > .arrow:after {\n    content: \" \";\n    left: 1px;\n    bottom: -10px;\n    border-left-width: 0;\n    border-right-color: #fff; }\n\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px; }\n  .popover.bottom > .arrow:after {\n    content: \" \";\n    top: 1px;\n    margin-left: -10px;\n    border-top-width: 0;\n    border-bottom-color: #fff; }\n\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25); }\n  .popover.left > .arrow:after {\n    content: \" \";\n    right: 1px;\n    border-right-width: 0;\n    border-left-color: #fff;\n    bottom: -10px; }\n\n.carousel {\n  position: relative; }\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%; }\n  .carousel-inner > .item {\n    display: none;\n    position: relative;\n    -webkit-transition: 0.6s ease-in-out left;\n    -o-transition: 0.6s ease-in-out left;\n    transition: 0.6s ease-in-out left; }\n    .carousel-inner > .item > img,\n    .carousel-inner > .item > a > img {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      line-height: 1; }\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      .carousel-inner > .item {\n        -webkit-transition: -webkit-transform 0.6s ease-in-out;\n        -moz-transition: -moz-transform 0.6s ease-in-out;\n        -o-transition: -o-transform 0.6s ease-in-out;\n        transition: transform 0.6s ease-in-out;\n        -webkit-backface-visibility: hidden;\n        -moz-backface-visibility: hidden;\n        backface-visibility: hidden;\n        -webkit-perspective: 1000px;\n        -moz-perspective: 1000px;\n        perspective: 1000px; }\n        .carousel-inner > .item.next, .carousel-inner > .item.active.right {\n          -webkit-transform: translate3d(100%, 0, 0);\n          transform: translate3d(100%, 0, 0);\n          left: 0; }\n        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {\n          -webkit-transform: translate3d(-100%, 0, 0);\n          transform: translate3d(-100%, 0, 0);\n          left: 0; }\n        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {\n          -webkit-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\n          left: 0; } }\n  .carousel-inner > .active,\n  .carousel-inner > .next,\n  .carousel-inner > .prev {\n    display: block; }\n  .carousel-inner > .active {\n    left: 0; }\n  .carousel-inner > .next,\n  .carousel-inner > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%; }\n  .carousel-inner > .next {\n    left: 100%; }\n  .carousel-inner > .prev {\n    left: -100%; }\n  .carousel-inner > .next.left,\n  .carousel-inner > .prev.right {\n    left: 0; }\n  .carousel-inner > .active.left {\n    left: -100%; }\n  .carousel-inner > .active.right {\n    left: 100%; }\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  background-color: transparent; }\n  .carousel-control.left {\n    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }\n  .carousel-control.right {\n    left: auto;\n    right: 0;\n    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }\n  .carousel-control:hover, .carousel-control:focus {\n    outline: 0;\n    color: #fff;\n    text-decoration: none;\n    opacity: 0.9;\n    filter: alpha(opacity=90); }\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next,\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    margin-top: -10px;\n    z-index: 5;\n    display: inline-block; }\n  .carousel-control .icon-prev,\n  .carousel-control .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px; }\n  .carousel-control .icon-next,\n  .carousel-control .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px; }\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 20px;\n    height: 20px;\n    line-height: 1;\n    font-family: serif; }\n  .carousel-control .icon-prev:before {\n    content: '\\2039'; }\n  .carousel-control .icon-next:before {\n    content: '\\203a'; }\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center; }\n  .carousel-indicators li {\n    display: inline-block;\n    width: 10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid #fff;\n    border-radius: 10px;\n    cursor: pointer;\n    background-color: #000 \\9;\n    background-color: transparent; }\n  .carousel-indicators .active {\n    margin: 0;\n    width: 12px;\n    height: 12px;\n    background-color: #fff; }\n\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }\n  .carousel-caption .btn {\n    text-shadow: none; }\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px; }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px; }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px; }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px; }\n  .carousel-indicators {\n    bottom: 20px; } }\n\n.clearfix:before, .clearfix:after {\n  content: \" \";\n  display: table; }\n\n.clearfix:after {\n  clear: both; }\n\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto; }\n\n.pull-right {\n  float: right !important; }\n\n.pull-left {\n  float: left !important; }\n\n.hide {\n  display: none !important; }\n\n.show {\n  display: block !important; }\n\n.invisible {\n  visibility: hidden; }\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0; }\n\n.hidden {\n  display: none !important; }\n\n.affix {\n  position: fixed; }\n\n@-ms-viewport {\n  width: device-width; }\n\n.visible-xs {\n  display: none !important; }\n\n.visible-sm {\n  display: none !important; }\n\n.visible-md {\n  display: none !important; }\n\n.visible-lg {\n  display: none !important; }\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important; }\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important; }\n  table.visible-xs {\n    display: table !important; }\n  tr.visible-xs {\n    display: table-row !important; }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important; }\n  table.visible-sm {\n    display: table !important; }\n  tr.visible-sm {\n    display: table-row !important; }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important; }\n  table.visible-md {\n    display: table !important; }\n  tr.visible-md {\n    display: table-row !important; }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important; }\n  table.visible-lg {\n    display: table !important; }\n  tr.visible-lg {\n    display: table-row !important; }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important; } }\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important; } }\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important; } }\n\n.visible-print {\n  display: none !important; }\n\n@media print {\n  .visible-print {\n    display: block !important; }\n  table.visible-print {\n    display: table !important; }\n  tr.visible-print {\n    display: table-row !important; }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important; } }\n\n.visible-print-block {\n  display: none !important; }\n  @media print {\n    .visible-print-block {\n      display: block !important; } }\n\n.visible-print-inline {\n  display: none !important; }\n  @media print {\n    .visible-print-inline {\n      display: inline !important; } }\n\n.visible-print-inline-block {\n  display: none !important; }\n  @media print {\n    .visible-print-inline-block {\n      display: inline-block !important; } }\n\n@media print {\n  .hidden-print {\n    display: none !important; } }\n","@import url(https://fonts.googleapis.com/css?family=Lato);\n$font-family-sans-serif: 'Lato', sans-serif;\n\n@import \"node_modules/bootstrap-sass/assets/stylesheets/bootstrap\";\n","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n// Core variables and mixins\n@import \"bootstrap/variables\";\n@import \"bootstrap/mixins\";\n\n// Reset and dependencies\n@import \"bootstrap/normalize\";\n@import \"bootstrap/print\";\n@import \"bootstrap/glyphicons\";\n\n// Core CSS\n@import \"bootstrap/scaffolding\";\n@import \"bootstrap/type\";\n@import \"bootstrap/code\";\n@import \"bootstrap/grid\";\n@import \"bootstrap/tables\";\n@import \"bootstrap/forms\";\n@import \"bootstrap/buttons\";\n\n// Components\n@import \"bootstrap/component-animations\";\n@import \"bootstrap/dropdowns\";\n@import \"bootstrap/button-groups\";\n@import \"bootstrap/input-groups\";\n@import \"bootstrap/navs\";\n@import \"bootstrap/navbar\";\n@import \"bootstrap/breadcrumbs\";\n@import \"bootstrap/pagination\";\n@import \"bootstrap/pager\";\n@import \"bootstrap/labels\";\n@import \"bootstrap/badges\";\n@import \"bootstrap/jumbotron\";\n@import \"bootstrap/thumbnails\";\n@import \"bootstrap/alerts\";\n@import \"bootstrap/progress-bars\";\n@import \"bootstrap/media\";\n@import \"bootstrap/list-group\";\n@import \"bootstrap/panels\";\n@import \"bootstrap/responsive-embed\";\n@import \"bootstrap/wells\";\n@import \"bootstrap/close\";\n\n// Components w/ JavaScript\n@import \"bootstrap/modals\";\n@import \"bootstrap/tooltip\";\n@import \"bootstrap/popovers\";\n@import \"bootstrap/carousel\";\n\n// Utility classes\n@import \"bootstrap/utilities\";\n@import \"bootstrap/responsive-utilities\";\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n//    without disabling user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n@at-root {\n  // Import the fonts\n  @font-face {\n    font-family: 'Glyphicons Halflings';\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');\n  }\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\002a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  @include box-sizing(border-box);\n}\n*:before,\n*:after {\n  @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: $font-family-base;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $text-color;\n  background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: $link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n  }\n\n  &:focus {\n    @include tab-focus;\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: $thumbnail-padding;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    $line-height-computed;\n  margin-bottom: $line-height-computed;\n  border: 0;\n  border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n  cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n  -webkit-animation: $animation;\n       -o-animation: $animation;\n          animation: $animation;\n}\n@mixin animation-name($name) {\n  -webkit-animation-name: $name;\n          animation-name: $name;\n}\n@mixin animation-duration($duration) {\n  -webkit-animation-duration: $duration;\n          animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n  -webkit-animation-timing-function: $timing-function;\n          animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n  -webkit-animation-delay: $delay;\n          animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n  -webkit-animation-iteration-count: $iteration-count;\n          animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n  -webkit-animation-direction: $direction;\n          animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n  -webkit-animation-fill-mode: $fill-mode;\n          animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility) {\n  -webkit-backface-visibility: $visibility;\n     -moz-backface-visibility: $visibility;\n          backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n          box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n  -webkit-box-sizing: $boxmodel;\n     -moz-box-sizing: $boxmodel;\n          box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n  -webkit-column-count: $column-count;\n     -moz-column-count: $column-count;\n          column-count: $column-count;\n  -webkit-column-gap: $column-gap;\n     -moz-column-gap: $column-gap;\n          column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: $mode;\n     -moz-hyphens: $mode;\n      -ms-hyphens: $mode; // IE10+\n       -o-hyphens: $mode;\n          hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: $color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n  -webkit-transform: scale($ratio);\n      -ms-transform: scale($ratio); // IE9 only\n       -o-transform: scale($ratio);\n          transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n  -webkit-transform: scaleX($ratio);\n      -ms-transform: scaleX($ratio); // IE9 only\n       -o-transform: scaleX($ratio);\n          transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n  -webkit-transform: scaleY($ratio);\n      -ms-transform: scaleY($ratio); // IE9 only\n       -o-transform: scaleY($ratio);\n          transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n  -webkit-transform: skewX($x) skewY($y);\n      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX($x) skewY($y);\n          transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n  -webkit-transform: translate($x, $y);\n      -ms-transform: translate($x, $y); // IE9 only\n       -o-transform: translate($x, $y);\n          transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n  -webkit-transform: translate3d($x, $y, $z);\n          transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees); // IE9 only\n       -o-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n  -webkit-transform: rotateX($degrees);\n      -ms-transform: rotateX($degrees); // IE9 only\n       -o-transform: rotateX($degrees);\n          transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n  -webkit-transform: rotateY($degrees);\n      -ms-transform: rotateY($degrees); // IE9 only\n       -o-transform: rotateY($degrees);\n          transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n  -webkit-perspective: $perspective;\n     -moz-perspective: $perspective;\n          perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n  -webkit-perspective-origin: $perspective;\n     -moz-perspective-origin: $perspective;\n          perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n  -webkit-transform-origin: $origin;\n     -moz-transform-origin: $origin;\n      -ms-transform-origin: $origin; // IE9 only\n          transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n  -webkit-transition: $transition;\n       -o-transition: $transition;\n          transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n  -webkit-transition-property: $transition-property;\n          transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n  -webkit-transition-delay: $transition-delay;\n          transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n  -webkit-transition-duration: $transition-duration;\n          transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n  -webkit-transition-timing-function: $timing-function;\n          transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n  -webkit-transition: -webkit-transform $transition;\n     -moz-transition: -moz-transform $transition;\n       -o-transition: -o-transform $transition;\n          transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n  -webkit-user-select: $select;\n     -moz-user-select: $select;\n      -ms-user-select: $select; // IE10+\n          user-select: $select;\n}\n","$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n$gray-base:              #000 !default;\n$gray-darker:            lighten($gray-base, 13.5%) !default; // #222\n$gray-dark:              lighten($gray-base, 20%) !default;   // #333\n$gray:                   lighten($gray-base, 33.5%) !default; // #555\n$gray-light:             lighten($gray-base, 46.7%) !default; // #777\n$gray-lighter:           lighten($gray-base, 93.5%) !default; // #eee\n\n$brand-primary:         darken(#428bca, 6.5%) !default; // #337ab7\n$brand-success:         #5cb85c !default;\n$brand-info:            #5bc0de !default;\n$brand-warning:         #f0ad4e !default;\n$brand-danger:          #d9534f !default;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n$body-bg:               #fff !default;\n//** Global text color on `<body>`.\n$text-color:            $gray-dark !default;\n\n//** Global textual link color.\n$link-color:            $brand-primary !default;\n//** Link hover color set via `darken()` function.\n$link-hover-color:      darken($link-color, 15%) !default;\n//** Link hover decoration.\n$link-hover-decoration: underline !default;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif:       Georgia, \"Times New Roman\", Times, serif !default;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n$font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base:        $font-family-sans-serif !default;\n\n$font-size-base:          14px !default;\n$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5:            $font-size-base !default;\n$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base:        1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the `<body>`.\n$headings-font-family:    inherit !default;\n$headings-font-weight:    500 !default;\n$headings-line-height:    1.1 !default;\n$headings-color:          inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name:          \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id:        \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical:     6px !default;\n$padding-base-horizontal:   12px !default;\n\n$padding-large-vertical:    10px !default;\n$padding-large-horizontal:  16px !default;\n\n$padding-small-vertical:    5px !default;\n$padding-small-horizontal:  10px !default;\n\n$padding-xs-vertical:       1px !default;\n$padding-xs-horizontal:     5px !default;\n\n$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small:         1.5 !default;\n\n$border-radius-base:        4px !default;\n$border-radius-large:       6px !default;\n$border-radius-small:       3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color:    #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg:       $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n$caret-width-base:          4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large:         5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n$table-cell-padding:            8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding:  5px !default;\n\n//** Default background color used for all tables.\n$table-bg:                      transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent:               #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover:                #f5f5f5 !default;\n$table-bg-active:               $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color:            #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight:                normal !default;\n\n$btn-default-color:              #333 !default;\n$btn-default-bg:                 #fff !default;\n$btn-default-border:             #ccc !default;\n\n$btn-primary-color:              #fff !default;\n$btn-primary-bg:                 $brand-primary !default;\n$btn-primary-border:             darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color:              #fff !default;\n$btn-success-bg:                 $brand-success !default;\n$btn-success-border:             darken($btn-success-bg, 5%) !default;\n\n$btn-info-color:                 #fff !default;\n$btn-info-bg:                    $brand-info !default;\n$btn-info-border:                darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color:              #fff !default;\n$btn-warning-bg:                 $brand-warning !default;\n$btn-warning-border:             darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color:               #fff !default;\n$btn-danger-bg:                  $brand-danger !default;\n$btn-danger-border:              darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color:        $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base:         $border-radius-base !default;\n$btn-border-radius-large:        $border-radius-large !default;\n$btn-border-radius-small:        $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n$input-bg:                       #fff !default;\n//** `<input disabled>` background color\n$input-bg-disabled:              $gray-lighter !default;\n\n//** Text color for `<input>`s\n$input-color:                    $gray !default;\n//** `<input>` border color\n$input-border:                   #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.\n$input-border-radius:            $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large:      $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small:      $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus:             #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder:        #999 !default;\n\n//** Default `.form-control` height\n$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom:       15px !default;\n\n$legend-color:                   $gray-dark !default;\n$legend-border-color:            #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg:           $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled:                not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg:                    #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border:                rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border:       #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg:            #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color:            $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg:         #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color:     $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg:        $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color:   $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color:          $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color:           #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar:            1000 !default;\n$zindex-dropdown:          1000 !default;\n$zindex-popover:           1060 !default;\n$zindex-tooltip:           1070 !default;\n$zindex-navbar-fixed:      1030 !default;\n$zindex-modal-background:  1040 !default;\n$zindex-modal:             1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs:                  480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min:              $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone:               $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm:                  768px !default;\n$screen-sm-min:              $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet:              $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md:                  992px !default;\n$screen-md-min:              $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop:             $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg:                  1200px !default;\n$screen-lg-min:              $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop:          $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max:              ($screen-sm-min - 1) !default;\n$screen-sm-max:              ($screen-md-min - 1) !default;\n$screen-md-max:              ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns:              12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width:         30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint:     $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet:             (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm:                 $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop:            (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md:                 $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop:      (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg:                 $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height:                    50px !default;\n$navbar-margin-bottom:             $line-height-computed !default;\n$navbar-border-radius:             $border-radius-base !default;\n$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height:       340px !default;\n\n$navbar-default-color:             #777 !default;\n$navbar-default-bg:                #f8f8f8 !default;\n$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color:                #777 !default;\n$navbar-default-link-hover-color:          #333 !default;\n$navbar-default-link-hover-bg:             transparent !default;\n$navbar-default-link-active-color:         #555 !default;\n$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color:       #ccc !default;\n$navbar-default-link-disabled-bg:          transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color:               $navbar-default-link-color !default;\n$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg:            transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg:           #ddd !default;\n$navbar-default-toggle-icon-bar-bg:        #888 !default;\n$navbar-default-toggle-border-color:       #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color:                      lighten($gray-light, 15%) !default;\n$navbar-inverse-bg:                         #222 !default;\n$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color:           #fff !default;\n$navbar-inverse-link-hover-bg:              transparent !default;\n$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color:        #444 !default;\n$navbar-inverse-link-disabled-bg:           transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color:          #fff !default;\n$navbar-inverse-brand-hover-bg:             transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg:            #333 !default;\n$navbar-inverse-toggle-icon-bar-bg:         #fff !default;\n$navbar-inverse-toggle-border-color:        #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding:                          10px 15px !default;\n$nav-link-hover-bg:                         $gray-lighter !default;\n\n$nav-disabled-link-color:                   $gray-light !default;\n$nav-disabled-link-hover-color:             $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color:                     #ddd !default;\n\n$nav-tabs-link-hover-border-color:          $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg:             $body-bg !default;\n$nav-tabs-active-link-hover-color:          $gray !default;\n$nav-tabs-active-link-hover-border-color:   #ddd !default;\n\n$nav-tabs-justified-link-border-color:            #ddd !default;\n$nav-tabs-justified-active-link-border-color:     $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius:                   $border-radius-base !default;\n$nav-pills-active-link-hover-bg:            $component-active-bg !default;\n$nav-pills-active-link-hover-color:         $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color:                     $link-color !default;\n$pagination-bg:                        #fff !default;\n$pagination-border:                    #ddd !default;\n\n$pagination-hover-color:               $link-hover-color !default;\n$pagination-hover-bg:                  $gray-lighter !default;\n$pagination-hover-border:              #ddd !default;\n\n$pagination-active-color:              #fff !default;\n$pagination-active-bg:                 $brand-primary !default;\n$pagination-active-border:             $brand-primary !default;\n\n$pagination-disabled-color:            $gray-light !default;\n$pagination-disabled-bg:               #fff !default;\n$pagination-disabled-border:           #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg:                             $pagination-bg !default;\n$pager-border:                         $pagination-border !default;\n$pager-border-radius:                  15px !default;\n\n$pager-hover-bg:                       $pagination-hover-bg !default;\n\n$pager-active-bg:                      $pagination-active-bg !default;\n$pager-active-color:                   $pagination-active-color !default;\n\n$pager-disabled-color:                 $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding:              30px !default;\n$jumbotron-color:                inherit !default;\n$jumbotron-bg:                   $gray-lighter !default;\n$jumbotron-heading-color:        inherit !default;\n$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text:             #3c763d !default;\n$state-success-bg:               #dff0d8 !default;\n$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text:                #31708f !default;\n$state-info-bg:                  #d9edf7 !default;\n$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text:             #8a6d3b !default;\n$state-warning-bg:               #fcf8e3 !default;\n$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text:              #a94442 !default;\n$state-danger-bg:                #f2dede !default;\n$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width:           200px !default;\n//** Tooltip text color\n$tooltip-color:               #fff !default;\n//** Tooltip background color\n$tooltip-bg:                  #000 !default;\n$tooltip-opacity:             .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width:         5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color:         $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg:                          #fff !default;\n//** Popover maximum width\n$popover-max-width:                   276px !default;\n//** Popover border color\n$popover-border-color:                rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color:       #ccc !default;\n\n//** Popover title background color\n$popover-title-bg:                    darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width:                 10px !default;\n//** Popover arrow color\n$popover-arrow-color:                 $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg:            $gray-light !default;\n//** Primary label background color\n$label-primary-bg:            $brand-primary !default;\n//** Success label background color\n$label-success-bg:            $brand-success !default;\n//** Info label background color\n$label-info-bg:               $brand-info !default;\n//** Warning label background color\n$label-warning-bg:            $brand-warning !default;\n//** Danger label background color\n$label-danger-bg:             $brand-danger !default;\n\n//** Default label text color\n$label-color:                 #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color:      #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding:         15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding:         15px !default;\n//** Modal title line-height\n$modal-title-line-height:     $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg:                             #fff !default;\n//** Modal content border color\n$modal-content-border-color:                   rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color:          #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg:           #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity:      .5 !default;\n//** Modal header border color\n$modal-header-border-color:   #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color:   $modal-header-border-color !default;\n\n$modal-lg:                    900px !default;\n$modal-md:                    600px !default;\n$modal-sm:                    300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding:               15px !default;\n$alert-border-radius:         $border-radius-base !default;\n$alert-link-font-weight:      bold !default;\n\n$alert-success-bg:            $state-success-bg !default;\n$alert-success-text:          $state-success-text !default;\n$alert-success-border:        $state-success-border !default;\n\n$alert-info-bg:               $state-info-bg !default;\n$alert-info-text:             $state-info-text !default;\n$alert-info-border:           $state-info-border !default;\n\n$alert-warning-bg:            $state-warning-bg !default;\n$alert-warning-text:          $state-warning-text !default;\n$alert-warning-border:        $state-warning-border !default;\n\n$alert-danger-bg:             $state-danger-bg !default;\n$alert-danger-text:           $state-danger-text !default;\n$alert-danger-border:         $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg:                 #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color:          #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius:      $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg:             $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg:     $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg:     $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg:      $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg:        $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg:                 #fff !default;\n//** `.list-group-item` border color\n$list-group-border:             #ddd !default;\n//** List group border radius\n$list-group-border-radius:      $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg:           #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color:       $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg:          $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border:      $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color:      $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg:         $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color:         #555 !default;\n$list-group-link-hover-color:   $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg:                    #fff !default;\n$panel-body-padding:          15px !default;\n$panel-heading-padding:       10px 15px !default;\n$panel-footer-padding:        $panel-heading-padding !default;\n$panel-border-radius:         $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border:          #ddd !default;\n$panel-footer-bg:             #f5f5f5 !default;\n\n$panel-default-text:          $gray-dark !default;\n$panel-default-border:        #ddd !default;\n$panel-default-heading-bg:    #f5f5f5 !default;\n\n$panel-primary-text:          #fff !default;\n$panel-primary-border:        $brand-primary !default;\n$panel-primary-heading-bg:    $brand-primary !default;\n\n$panel-success-text:          $state-success-text !default;\n$panel-success-border:        $state-success-border !default;\n$panel-success-heading-bg:    $state-success-bg !default;\n\n$panel-info-text:             $state-info-text !default;\n$panel-info-border:           $state-info-border !default;\n$panel-info-heading-bg:       $state-info-bg !default;\n\n$panel-warning-text:          $state-warning-text !default;\n$panel-warning-border:        $state-warning-border !default;\n$panel-warning-heading-bg:    $state-warning-bg !default;\n\n$panel-danger-text:           $state-danger-text !default;\n$panel-danger-border:         $state-danger-border !default;\n$panel-danger-heading-bg:     $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding:           4px !default;\n//** Thumbnail background color\n$thumbnail-bg:                $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border:            #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius:     $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color:     $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding:   9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg:                     #f5f5f5 !default;\n$well-border:                 darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color:                 #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color:      #fff !default;\n$badge-bg:                    $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color:          $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg:             #fff !default;\n\n$badge-font-weight:           bold !default;\n$badge-line-height:           1 !default;\n$badge-border-radius:         10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical:   8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg:                 #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color:              #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color:       $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator:          \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color:                      #fff !default;\n$carousel-control-width:                      15% !default;\n$carousel-control-opacity:                    .5 !default;\n$carousel-control-font-size:                  20px !default;\n\n$carousel-indicator-active-bg:                #fff !default;\n$carousel-indicator-border-color:             #fff !default;\n\n$carousel-caption-color:                      #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight:           bold !default;\n$close-color:                 #000 !default;\n$close-text-shadow:           0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color:                  #c7254e !default;\n$code-bg:                     #f9f2f4 !default;\n\n$kbd-color:                   #fff !default;\n$kbd-bg:                      #333 !default;\n\n$pre-bg:                      #f5f5f5 !default;\n$pre-color:                   $gray-dark !default;\n$pre-border-color:            #ccc !default;\n$pre-scrollable-max-height:   340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted:                  $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color:           $gray-light !default;\n//** Headings small color\n$headings-small-color:        $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color:      $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size:        ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color:     $gray-lighter !default;\n//** Page header border color\n$page-header-border-color:    $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset:        $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border:                   $gray-lighter !default;\n","// WebKit-style focus\n\n@mixin tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n  display: $display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n    background-size: $width-1x $height-1x;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: $headings-font-family;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: $headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: $headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: $line-height-computed;\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: ($line-height-computed / 2);\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: $line-height-computed;\n  font-size: floor(($font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: $screen-sm-min) {\n    font-size: ($font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n  background-color: $state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (($line-height-computed / 2) - 1);\n  margin: ($line-height-computed * 2) 0 $line-height-computed;\n  border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: ($line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n  @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled;\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n  line-height: $line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: $dl-horizontal-breakpoint) {\n    dt {\n      float: left;\n      width: ($dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      @include text-overflow;\n    }\n    dd {\n      margin-left: $dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: ($line-height-computed / 2) $line-height-computed;\n  margin: 0 0 $line-height-computed;\n  font-size: $blockquote-font-size;\n  border-left: 5px solid $blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: $line-height-base;\n    color: $blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid $blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: $line-height-computed;\n  font-style: normal;\n  line-height: $line-height-base;\n}\n","// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n  #{$parent} {\n    color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    color: darken($color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n  #{$parent} {\n    background-color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    background-color: darken($color, 10%);\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n@mixin clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $code-color;\n  background-color: $code-bg;\n  border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  border-radius: $border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (($line-height-computed - 1) / 2);\n  margin: 0 0 ($line-height-computed / 2);\n  font-size: ($font-size-base - 1); // 14px to 13px\n  line-height: $line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: $pre-color;\n  background-color: $pre-bg;\n  border: 1px solid $pre-border-color;\n  border-radius: $border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: $pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  @include container-fixed;\n\n  @media (min-width: $screen-sm-min) {\n    width: $container-sm;\n  }\n  @media (min-width: $screen-md-min) {\n    width: $container-md;\n  }\n  @media (min-width: $screen-lg-min) {\n    width: $container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  @include container-fixed;\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  @include make-row;\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@include make-grid-columns;\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n@include make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: $screen-sm-min) {\n  @include make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: $screen-md-min) {\n  @include make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: $screen-lg-min) {\n  @include make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  floor(($gutter / 2));\n  padding-right: ceil(($gutter / 2));\n  @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n  margin-left:  ceil(($gutter / -2));\n  margin-right: floor(($gutter / -2));\n  @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage(($columns / $grid-columns));\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n  margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n  left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n  right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-sm-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-offset($columns) {\n  @media (min-width: $screen-sm-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-push($columns) {\n  @media (min-width: $screen-sm-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-pull($columns) {\n  @media (min-width: $screen-sm-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-md-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-offset($columns) {\n  @media (min-width: $screen-md-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-push($columns) {\n  @media (min-width: $screen-md-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-pull($columns) {\n  @media (min-width: $screen-md-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-lg-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-offset($columns) {\n  @media (min-width: $screen-lg-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-push($columns) {\n  @media (min-width: $screen-lg-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-pull($columns) {\n  @media (min-width: $screen-lg-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n  }\n  #{$list} {\n    position: relative;\n    // Prevent columns from collapsing when empty\n    min-height: 1px;\n    // Inner gutter via padding\n    padding-left:  ceil(($grid-gutter-width / 2));\n    padding-right: floor(($grid-gutter-width / 2));\n  }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-#{$class}-#{$i}\";\n  }\n  #{$list} {\n    float: left;\n  }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n  @if ($type == width) and ($index > 0) {\n    .col-#{$class}-#{$index} {\n      width: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index > 0) {\n    .col-#{$class}-push-#{$index} {\n      left: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index == 0) {\n    .col-#{$class}-push-0 {\n      left: auto;\n    }\n  }\n  @if ($type == pull) and ($index > 0) {\n    .col-#{$class}-pull-#{$index} {\n      right: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == pull) and ($index == 0) {\n    .col-#{$class}-pull-0 {\n      right: auto;\n    }\n  }\n  @if ($type == offset) {\n    .col-#{$class}-offset-#{$index} {\n      margin-left: percentage(($index / $grid-columns));\n    }\n  }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n  @for $i from 0 through $columns {\n    @include calc-grid-column($i, $class, $type);\n  }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n  @include float-grid-columns($class);\n  @include loop-grid-columns($grid-columns, $class, width);\n  @include loop-grid-columns($grid-columns, $class, pull);\n  @include loop-grid-columns($grid-columns, $class, push);\n  @include loop-grid-columns($grid-columns, $class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: $table-bg;\n}\ncaption {\n  padding-top: $table-cell-padding;\n  padding-bottom: $table-cell-padding;\n  color: $text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: $line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-cell-padding;\n        line-height: $line-height-base;\n        vertical-align: top;\n        border-top: 1px solid $table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid $table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid $table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: $body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid $table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid $table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: $table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: $table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: $screen-xs-max) {\n    width: 100%;\n    margin-bottom: ($line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid $table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.#{$state},\n    > th.#{$state},\n    &.#{$state} > td,\n    &.#{$state} > th {\n      background-color: $background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.#{$state}:hover,\n    > th.#{$state}:hover,\n    &.#{$state}:hover > td,\n    &:hover > .#{$state},\n    &.#{$state}:hover > th {\n      background-color: darken($background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: $line-height-computed;\n  font-size: ($font-size-base * 1.5);\n  line-height: inherit;\n  color: $legend-color;\n  border: 0;\n  border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  @include tab-focus;\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: ($padding-base-vertical + 1);\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n  background-color: $input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid $input-border;\n  border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  @include form-control-focus;\n\n  // Placeholder\n  @include placeholder;\n\n  // Unstyle the caret on `<select>`s in IE10+.\n  &::-ms-expand {\n    border: 0;\n    background-color: transparent;\n  }\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    background-color: $input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n  }\n\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n\n  // [converter] extracted textarea& to textarea.form-control\n}\n\n// Reset height for `textarea`s\ntextarea.form-control {\n  height: auto;\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    &.form-control {\n      line-height: $input-height-base;\n    }\n\n    &.input-sm,\n    .input-group-sm & {\n      line-height: $input-height-small;\n    }\n\n    &.input-lg,\n    .input-group-lg & {\n      line-height: $input-height-large;\n    }\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: $form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: ($padding-base-vertical + 1);\n  padding-bottom: ($padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n  min-height: ($line-height-computed + $font-size-base);\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);\n.form-group-sm {\n  .form-control {\n    height: $input-height-small;\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    line-height: $line-height-small;\n    border-radius: $input-border-radius-small;\n  }\n  select.form-control {\n    height: $input-height-small;\n    line-height: $input-height-small;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: $input-height-small;\n    min-height: ($line-height-computed + $font-size-small);\n    padding: ($padding-small-vertical + 1) $padding-small-horizontal;\n    font-size: $font-size-small;\n    line-height: $line-height-small;\n  }\n}\n\n@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);\n.form-group-lg {\n  .form-control {\n    height: $input-height-large;\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    line-height: $line-height-large;\n    border-radius: $input-border-radius-large;\n  }\n  select.form-control {\n    height: $input-height-large;\n    line-height: $input-height-large;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: $input-height-large;\n    min-height: ($line-height-computed + $font-size-large);\n    padding: ($padding-large-vertical + 1) $padding-large-horizontal;\n    font-size: $font-size-large;\n    line-height: $line-height-large;\n  }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: ($input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: $input-height-base;\n  height: $input-height-base;\n  line-height: $input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: $input-height-large;\n  height: $input-height-large;\n  line-height: $input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: $input-height-small;\n  height: $input-height-small;\n  line-height: $input-height-small;\n}\n\n// Feedback states\n.has-success {\n  @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);\n}\n.has-warning {\n  @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);\n}\n.has-error {\n  @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n    top: ($line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n    top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten($text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n// [converter] extracted from `.form-inline` for libsass compatibility\n@mixin form-inline {\n\n  // Kick in the inline\n  @media (min-width: $screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match.\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n// [converter] extracted as `@mixin form-inline` for libsass compatibility\n.form-inline {\n  @include form-inline;\n}\n\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: ($line-height-computed + ($padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    @include make-row;\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: $screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: floor(($grid-gutter-width / 2));\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: $screen-sm-min) {\n      .control-label {\n        padding-top: ($padding-large-vertical + 1);\n        font-size: $font-size-large;\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: $screen-sm-min) {\n      .control-label {\n        padding-top: ($padding-small-vertical + 1);\n        font-size: $font-size-small;\n      }\n    }\n  }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: $text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: $border-color;\n    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken($border-color, 10%);\n      $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);\n      @include box-shadow($shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: $text-color;\n    border-color: $border-color;\n    background-color: $background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: $text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus($color: $input-border-focus) {\n  $color-rgba: rgba(red($color), green($color), blue($color), .6);\n  &:focus {\n    border-color: $color;\n    outline: 0;\n    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  #{$parent} {\n    height: $input-height;\n    padding: $padding-vertical $padding-horizontal;\n    font-size: $font-size;\n    line-height: $line-height;\n    border-radius: $border-radius;\n  }\n\n  select#{$parent} {\n    height: $input-height;\n    line-height: $input-height;\n  }\n\n  textarea#{$parent},\n  select[multiple]#{$parent} {\n    height: auto;\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: $btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n  @include user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      @include tab-focus;\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: $btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n    @include opacity(.65);\n    @include box-shadow(none);\n  }\n\n  // [converter] extracted a& to a.btn\n}\n\na.btn {\n  &.disabled,\n  fieldset[disabled] & {\n    pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: $link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    @include box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: $btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n\n  &:focus,\n  &.focus {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 25%);\n  }\n  &:hover {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n\n    &:hover,\n    &:focus,\n    &.focus {\n      color: $color;\n      background-color: darken($background, 17%);\n          border-color: darken($border, 25%);\n    }\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus,\n    &.focus {\n      background-color: $background;\n          border-color: $border;\n    }\n  }\n\n  .badge {\n    color: $background;\n    background-color: $color;\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  padding: $padding-vertical $padding-horizontal;\n  font-size: $font-size;\n  line-height: $line-height;\n  border-radius: $border-radius;\n}\n","// Opacity\n\n@mixin opacity($opacity) {\n  opacity: $opacity;\n  // IE8 filter\n  $opacity-ie: ($opacity * 100);\n  filter: alpha(opacity=$opacity-ie);\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  @include transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  // [converter] extracted tr&.in to tr.collapse.in\n  // [converter] extracted tbody&.in to tbody.collapse.in\n}\n\ntr.collapse.in    { display: table-row; }\n\ntbody.collapse.in { display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  @include transition-property(height, visibility);\n  @include transition-duration(.35s);\n  @include transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   $caret-width-base dashed;\n  border-top:   $caret-width-base solid \\9; // IE8\n  border-right: $caret-width-base solid transparent;\n  border-left:  $caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: $zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: $font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: $dropdown-bg;\n  border: 1px solid $dropdown-fallback-border; // IE8 fallback\n  border: 1px solid $dropdown-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    @include nav-divider($dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: $line-height-base;\n    color: $dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $dropdown-link-hover-color;\n    background-color: $dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: $dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    @include reset-filter;\n    cursor: $cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: $font-size-small;\n  line-height: $line-height-base;\n  color: $dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: ($zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: $caret-width-base dashed;\n    border-bottom: $caret-width-base solid \\9; // IE8\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      right: 0; left: auto;\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      left: 0; right: auto;\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n  height: 1px;\n  margin: (($line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: $color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  @include clearfix;\n\n  .btn,\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    @include border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { @extend .btn-xs; }\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: $caret-width-large $caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 $caret-width-large $caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    @include clearfix;\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    @include border-top-radius($btn-border-radius-base);\n    @include border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    @include border-top-radius(0);\n    @include border-bottom-radius($btn-border-radius-base);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","// Single side border-radius\n\n@mixin border-top-radius($radius) {\n  border-top-right-radius: $radius;\n   border-top-left-radius: $radius;\n}\n@mixin border-right-radius($radius) {\n  border-bottom-right-radius: $radius;\n     border-top-right-radius: $radius;\n}\n@mixin border-bottom-radius($radius) {\n  border-bottom-right-radius: $radius;\n   border-bottom-left-radius: $radius;\n}\n@mixin border-left-radius($radius) {\n  border-bottom-left-radius: $radius;\n     border-top-left-radius: $radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n    \n    &:focus {\n      z-index: 3;\n    }\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  @extend .input-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  @extend .input-sm;\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: $input-color;\n  text-align: center;\n  background-color: $input-group-addon-bg;\n  border: 1px solid $input-group-addon-border-color;\n  border-radius: $input-border-radius;\n\n  // Sizing\n  &.input-sm {\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    border-radius: $input-border-radius-small;\n  }\n  &.input-lg {\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    border-radius: $input-border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  @include border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  @include border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      z-index: 2;\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  @include clearfix;\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: $nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: $nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: $nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: $nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: $cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: $nav-link-hover-bg;\n      border-color: $link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    @include nav-divider;\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid $nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: $line-height-base;\n      border: 1px solid transparent;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n      &:hover {\n        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-tabs-active-link-hover-color;\n        background-color: $nav-tabs-active-link-hover-bg;\n        border: 1px solid $nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    @extend .nav-justified;\n    @extend .nav-tabs-justified;\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: $nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-pills-active-link-hover-color;\n        background-color: $nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: $border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid $nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid $nav-tabs-justified-link-border-color;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: $nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  @include border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: $navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: $navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: $navbar-padding-horizontal;\n  padding-left:  $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  @include clearfix;\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: $navbar-collapse-max-height;\n\n    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -$navbar-padding-horizontal;\n    margin-left:  -$navbar-padding-horizontal;\n\n    @media (min-width: $grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: $zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: $zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: $navbar-padding-vertical $navbar-padding-horizontal;\n  font-size: $font-size-large;\n  line-height: $line-height-computed;\n  height: $navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -$navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: $navbar-padding-horizontal;\n  padding: 9px 10px;\n  @include navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: $border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: $line-height-computed;\n  }\n\n  @media (max-width: $grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: $line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    $navbar-padding-vertical;\n        padding-bottom: $navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -$navbar-padding-horizontal;\n  margin-right: -$navbar-padding-horizontal;\n  padding: 10px $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  @include box-shadow($shadow);\n\n  // Mixin behavior for optimum display\n  @include form-inline;\n\n  .form-group {\n    @media (max-width: $grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  @include navbar-vertical-align($input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    @include box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  @include border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  @include border-top-radius($navbar-border-radius);\n  @include border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  @include navbar-vertical-align($input-height-base);\n\n  &.btn-sm {\n    @include navbar-vertical-align($input-height-small);\n  }\n  &.btn-xs {\n    @include navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  @include navbar-vertical-align($line-height-computed);\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin-left: $navbar-padding-horizontal;\n    margin-right: $navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  margin-right: -$navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: $navbar-default-bg;\n  border-color: $navbar-default-border;\n\n  .navbar-brand {\n    color: $navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-brand-hover-color;\n      background-color: $navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-hover-color;\n        background-color: $navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-active-color;\n        background-color: $navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n        background-color: $navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: $navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: $navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-default-link-active-bg;\n        color: $navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: $navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-hover-color;\n            background-color: $navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-active-color;\n            background-color: $navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-disabled-color;\n            background-color: $navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: $navbar-default-link-color;\n    &:hover {\n      color: $navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: $navbar-inverse-bg;\n  border-color: $navbar-inverse-border;\n\n  .navbar-brand {\n    color: $navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-brand-hover-color;\n      background-color: $navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-hover-color;\n        background-color: $navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-active-color;\n        background-color: $navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n        background-color: $navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: $navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken($navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-inverse-link-active-bg;\n        color: $navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: $navbar-inverse-border;\n        }\n        .divider {\n          background-color: $navbar-inverse-border;\n        }\n        > li > a {\n          color: $navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-hover-color;\n            background-color: $navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-active-color;\n            background-color: $navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-disabled-color;\n            background-color: $navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: $navbar-inverse-link-color;\n    &:hover {\n      color: $navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n  margin-top: (($navbar-height - $element-height) / 2);\n  margin-bottom: (($navbar-height - $element-height) / 2);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n  margin-bottom: $line-height-computed;\n  list-style: none;\n  background-color: $breadcrumb-bg;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      // [converter] Workaround for https://github.com/sass/libsass/issues/1115\n      $nbsp: \"\\00a0\";\n      content: \"#{$breadcrumb-separator}#{$nbsp}\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: $breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: $breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: $padding-base-vertical $padding-base-horizontal;\n      line-height: $line-height-base;\n      text-decoration: none;\n      color: $pagination-color;\n      background-color: $pagination-bg;\n      border: 1px solid $pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        @include border-left-radius($border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: $pagination-hover-color;\n      background-color: $pagination-hover-bg;\n      border-color: $pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 3;\n      color: $pagination-active-color;\n      background-color: $pagination-active-bg;\n      border-color: $pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: $pagination-disabled-color;\n      background-color: $pagination-disabled-bg;\n      border-color: $pagination-disabled-border;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n","// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: $padding-vertical $padding-horizontal;\n      font-size: $font-size;\n      line-height: $line-height;\n    }\n    &:first-child {\n      > a,\n      > span {\n        @include border-left-radius($border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  @include clearfix;\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: $pager-bg;\n      border: 1px solid $pager-border;\n      border-radius: $pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: $pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: $pager-disabled-color;\n      background-color: $pager-bg;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: $label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // [converter] extracted a& to a.label\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Add hover effects, but only for links\na.label {\n  &:hover,\n  &:focus {\n    color: $label-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  @include label-variant($label-default-bg);\n}\n\n.label-primary {\n  @include label-variant($label-primary-bg);\n}\n\n.label-success {\n  @include label-variant($label-success-bg);\n}\n\n.label-info {\n  @include label-variant($label-info-bg);\n}\n\n.label-warning {\n  @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n  @include label-variant($label-danger-bg);\n}\n","// Labels\n\n@mixin label-variant($color) {\n  background-color: $color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken($color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: $font-size-small;\n  font-weight: $badge-font-weight;\n  color: $badge-color;\n  line-height: $badge-line-height;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: $badge-bg;\n  border-radius: $badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // [converter] extracted a& to a.badge\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: $badge-active-color;\n    background-color: $badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: $badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding-top:    $jumbotron-padding;\n  padding-bottom: $jumbotron-padding;\n  margin-bottom: $jumbotron-padding;\n  color: $jumbotron-color;\n  background-color: $jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: $jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: ($jumbotron-padding / 2);\n    font-size: $jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken($jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container\n    padding-left:  ($grid-gutter-width / 2);\n    padding-right: ($grid-gutter-width / 2);\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: $screen-sm-min) {\n    padding-top:    ($jumbotron-padding * 1.6);\n    padding-bottom: ($jumbotron-padding * 1.6);\n\n    .container &,\n    .container-fluid & {\n      padding-left:  ($jumbotron-padding * 2);\n      padding-right: ($jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: $jumbotron-heading-font-size;\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: $thumbnail-padding;\n  margin-bottom: $line-height-computed;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    @include img-responsive;\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active\n\n  // Image captions\n  .caption {\n    padding: $thumbnail-caption-padding;\n    color: $thumbnail-caption-color;\n  }\n}\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: $link-color;\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: $alert-padding;\n  margin-bottom: $line-height-computed;\n  border: 1px solid transparent;\n  border-radius: $alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing $headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: $alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: ($alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n","// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n  background-color: $background;\n  border-color: $border;\n  color: $text-color;\n\n  hr {\n    border-top-color: darken($border, 5%);\n  }\n  .alert-link {\n    color: darken($text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: $line-height-computed;\n  margin-bottom: $line-height-computed;\n  background-color: $progress-bg;\n  border-radius: $progress-border-radius;\n  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: $font-size-small;\n  line-height: $line-height-computed;\n  color: $progress-bar-color;\n  text-align: center;\n  background-color: $progress-bar-bg;\n  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  @include transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  @include gradient-striped;\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  @include animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  @include progress-bar-variant($progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  @include progress-bar-variant($progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  @include progress-bar-variant($progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  @include progress-bar-variant($progress-bar-danger-bg);\n}\n","// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n  background-repeat: repeat-x;\n  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// Progress bars\n\n@mixin progress-bar-variant($color) {\n  background-color: $color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    @include gradient-striped;\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n\n  // Fix collapse in webkit from max-width: 100% and display: table-cell.\n  &.img-thumbnail {\n    max-width: none;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: $list-group-bg;\n  border: 1px solid $list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    @include border-top-radius($list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    @include border-bottom-radius($list-group-border-radius);\n  }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n  color: $list-group-link-color;\n\n  .list-group-item-heading {\n    color: $list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $list-group-link-hover-color;\n    background-color: $list-group-hover-bg;\n  }\n}\n\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: $list-group-disabled-bg;\n    color: $list-group-disabled-color;\n    cursor: $cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: $list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: $list-group-active-color;\n    background-color: $list-group-active-bg;\n    border-color: $list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: $list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@include list-group-item-variant(success, $state-success-bg, $state-success-text);\n@include list-group-item-variant(info, $state-info-bg, $state-info-text);\n@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);\n@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n  .list-group-item-#{$state} {\n    color: $color;\n    background-color: $background;\n\n    // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}\n  }\n\n  a.list-group-item-#{$state},\n  button.list-group-item-#{$state} {\n    color: $color;\n\n    .list-group-item-heading {\n      color: inherit;\n    }\n\n    &:hover,\n    &:focus {\n      color: $color;\n      background-color: darken($background, 5%);\n    }\n    &.active,\n    &.active:hover,\n    &.active:focus {\n      color: #fff;\n      background-color: $color;\n      border-color: $color;\n    }\n  }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: $line-height-computed;\n  background-color: $panel-bg;\n  border: 1px solid transparent;\n  border-radius: $panel-border-radius;\n  @include box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: $panel-body-padding;\n  @include clearfix;\n}\n\n// Optional heading\n.panel-heading {\n  padding: $panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  @include border-top-radius(($panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil(($font-size-base * 1.125));\n  color: inherit;\n\n  > a,\n  > small,\n  > .small,\n  > small > a,\n  > .small > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: $panel-footer-padding;\n  background-color: $panel-footer-bg;\n  border-top: 1px solid $panel-inner-border;\n  @include border-bottom-radius(($panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        @include border-top-radius(($panel-border-radius - 1));\n      }\n    }\n\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        @include border-bottom-radius(($panel-border-radius - 1));\n      }\n    }\n  }\n  > .panel-heading + .panel-collapse > .list-group {\n    .list-group-item:first-child {\n      @include border-top-radius(0);\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: $panel-body-padding;\n      padding-right: $panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    @include border-top-radius(($panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: ($panel-border-radius - 1);\n        border-top-right-radius: ($panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: ($panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: ($panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    @include border-bottom-radius(($panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: ($panel-border-radius - 1);\n        border-bottom-right-radius: ($panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: ($panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: ($panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid $table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: $line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: $panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid $panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid $panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);\n}\n.panel-primary {\n  @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);\n}\n.panel-success {\n  @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);\n}\n.panel-info {\n  @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);\n}\n.panel-warning {\n  @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);\n}\n.panel-danger {\n  @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);\n}\n","// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n  border-color: $border;\n\n  & > .panel-heading {\n    color: $heading-text-color;\n    background-color: $heading-bg-color;\n    border-color: $heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: $border;\n    }\n    .badge {\n      color: $heading-bg-color;\n      background-color: $heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: $border;\n    }\n  }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: $well-bg;\n  border: 1px solid $well-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: $border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: $border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: ($font-size-base * 1.5);\n  font-weight: $close-font-weight;\n  line-height: 1;\n  color: $close-color;\n  text-shadow: $close-text-shadow;\n  @include opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: $close-color;\n    text-decoration: none;\n    cursor: pointer;\n    @include opacity(.5);\n  }\n\n  // [converter] extracted button& to button.close\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    @include translate(0, -25%);\n    @include transition-transform(0.3s ease-out);\n  }\n  &.in .modal-dialog { @include translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: $modal-content-bg;\n  border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid $modal-content-border-color;\n  border-radius: $border-radius-large;\n  @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-modal-background;\n  background-color: $modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { @include opacity(0); }\n  &.in { @include opacity($modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: $modal-title-padding;\n  border-bottom: 1px solid $modal-header-border-color;\n  @include clearfix;\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: $modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid $modal-footer-border-color;\n  @include clearfix; // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: $screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: $modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    @include box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: $modal-sm; }\n}\n\n@media (min-width: $screen-md-min) {\n  .modal-lg { width: $modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: $zindex-tooltip;\n  display: block;\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text;\n  font-size: $font-size-small;\n\n  @include opacity(0);\n\n  &.in     { @include opacity($tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: $tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 $tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: $tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 $tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: $tooltip-max-width;\n  padding: 3px 8px;\n  color: $tooltip-color;\n  text-align: center;\n  background-color: $tooltip-bg;\n  border-radius: $border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: $tooltip-arrow-width;\n    margin-bottom: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: $tooltip-arrow-width;\n    margin-bottom: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-right-color: $tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-left-color: $tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: $tooltip-arrow-width;\n    margin-top: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: $tooltip-arrow-width;\n    margin-top: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n}\n","@mixin reset-text() {\n  font-family: $font-family-base;\n  // We deliberately do NOT reset font-size.\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: $line-height-base;\n  text-align: left; // Fallback for where `start` is not supported\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: $zindex-popover;\n  display: none;\n  max-width: $popover-max-width;\n  padding: 1px;\n  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text;\n  font-size: $font-size-base;\n\n  background-color: $popover-bg;\n  background-clip: padding-box;\n  border: 1px solid $popover-fallback-border-color;\n  border: 1px solid $popover-border-color;\n  border-radius: $border-radius-large;\n  @include box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -$popover-arrow-width; }\n  &.right   { margin-left: $popover-arrow-width; }\n  &.bottom  { margin-top: $popover-arrow-width; }\n  &.left    { margin-left: -$popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: $font-size-base;\n  background-color: $popover-title-bg;\n  border-bottom: 1px solid darken($popover-title-bg, 5%);\n  border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: $popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: $popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -$popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: $popover-arrow-outer-color;\n    bottom: -$popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -$popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: $popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -$popover-arrow-outer-width;\n    margin-top: -$popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: $popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -$popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: $popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -$popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: $popover-arrow-outer-color;\n    top: -$popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -$popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: $popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -$popover-arrow-outer-width;\n    margin-top: -$popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: $popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: $popover-arrow-color;\n      bottom: -$popover-arrow-width;\n    }\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    @include transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      @include img-responsive;\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      @include transition-transform(0.6s ease-in-out);\n      @include backface-visibility(hidden);\n      @include perspective(1000px);\n\n      &.next,\n      &.active.right {\n        @include translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        @include translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        @include translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: $carousel-control-width;\n  @include opacity($carousel-control-opacity);\n  font-size: $carousel-control-font-size;\n  color: $carousel-control-color;\n  text-align: center;\n  text-shadow: $carousel-text-shadow;\n  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: $carousel-control-color;\n    text-decoration: none;\n    @include opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    margin-top: -10px;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    line-height: 1;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid $carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: $carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: $carousel-caption-color;\n  text-align: center;\n  text-shadow: $carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: $screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: ($carousel-control-font-size * 1.5);\n      height: ($carousel-control-font-size * 1.5);\n      margin-top: ($carousel-control-font-size / -2);\n      font-size: ($carousel-control-font-size * 1.5);\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: ($carousel-control-font-size / -2);\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: ($carousel-control-font-size / -2);\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  @include clearfix;\n}\n.center-block {\n  @include center-block;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  @include text-hide;\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","// Center-align a block level element\n\n@mixin center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n@mixin hide-text() {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n@mixin text-hide() {\n  @include hide-text;\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@at-root {\n  @-ms-viewport {\n    width: device-width;\n  }\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n\n@include responsive-invisibility('.visible-xs');\n@include responsive-invisibility('.visible-sm');\n@include responsive-invisibility('.visible-md');\n@include responsive-invisibility('.visible-lg');\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n@media (max-width: $screen-xs-max) {\n  @include responsive-visibility('.visible-xs');\n}\n.visible-xs-block {\n  @media (max-width: $screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: $screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: $screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n  @include responsive-visibility('.visible-sm');\n}\n.visible-sm-block {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n  @include responsive-visibility('.visible-md');\n}\n.visible-md-block {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-lg-min) {\n  @include responsive-visibility('.visible-lg');\n}\n.visible-lg-block {\n  @media (min-width: $screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: $screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: $screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n@media (max-width: $screen-xs-max) {\n  @include responsive-invisibility('.hidden-xs');\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n  @include responsive-invisibility('.hidden-sm');\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n  @include responsive-invisibility('.hidden-md');\n}\n\n@media (min-width: $screen-lg-min) {\n  @include responsive-invisibility('.hidden-lg');\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n\n@include responsive-invisibility('.visible-print');\n\n@media print {\n  @include responsive-visibility('.visible-print');\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n@media print {\n  @include responsive-invisibility('.hidden-print');\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent hack\n@mixin responsive-visibility($parent) {\n  #{$parent} {\n    display: block !important;\n  }\n  table#{$parent}  { display: table !important; }\n  tr#{$parent}     { display: table-row !important; }\n  th#{$parent},\n  td#{$parent}     { display: table-cell !important; }\n}\n\n// [converter] $parent hack\n@mixin responsive-invisibility($parent) {\n  #{$parent} {\n    display: none !important;\n  }\n}\n"],"sourceRoot":"/source/"}
        \ No newline at end of file
        diff --git a/public/assets/css/font-awesome.min.css b/public/assets/css/font-awesome.min.css
        deleted file mode 100644
        index d0603cb4b0..0000000000
        --- a/public/assets/css/font-awesome.min.css
        +++ /dev/null
        @@ -1,4 +0,0 @@
        -/*!
        - *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
        - *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
        - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.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.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-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);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.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:#fff}.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-remove:before,.fa-close:before,.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-photo:before,.fa-image:before,.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,.fa-bar-chart: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-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.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-navicon:before,.fa-reorder:before,.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-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc: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-mail-reply-all:before,.fa-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,.fa-gratipay: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"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
        diff --git a/public/assets/js/all.js b/public/assets/js/all.js
        deleted file mode 100755
        index 0505c3ff91..0000000000
        --- a/public/assets/js/all.js
        +++ /dev/null
        @@ -1,35065 +0,0 @@
        -/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
        -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
        -return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
        -void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
        -
        -/*! jQuery UI - v1.11.4 - 2015-03-11
        -* http://jqueryui.com
        -* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
        -* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
        -
        -(function( factory ) {
        -	if ( typeof define === "function" && define.amd ) {
        -
        -		// AMD. Register as an anonymous module.
        -		define([ "jquery" ], factory );
        -	} else {
        -
        -		// Browser globals
        -		factory( jQuery );
        -	}
        -}(function( $ ) {
        -/*!
        - * jQuery UI Core 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/category/ui-core/
        - */
        -
        -
        -// $.ui might exist from components with no dependencies, e.g., $.ui.position
        -$.ui = $.ui || {};
        -
        -$.extend( $.ui, {
        -	version: "1.11.4",
        -
        -	keyCode: {
        -		BACKSPACE: 8,
        -		COMMA: 188,
        -		DELETE: 46,
        -		DOWN: 40,
        -		END: 35,
        -		ENTER: 13,
        -		ESCAPE: 27,
        -		HOME: 36,
        -		LEFT: 37,
        -		PAGE_DOWN: 34,
        -		PAGE_UP: 33,
        -		PERIOD: 190,
        -		RIGHT: 39,
        -		SPACE: 32,
        -		TAB: 9,
        -		UP: 38
        -	}
        -});
        -
        -// plugins
        -$.fn.extend({
        -	scrollParent: function( includeHidden ) {
        -		var position = this.css( "position" ),
        -			excludeStaticParent = position === "absolute",
        -			overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
        -			scrollParent = this.parents().filter( function() {
        -				var parent = $( this );
        -				if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
        -					return false;
        -				}
        -				return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
        -			}).eq( 0 );
        -
        -		return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
        -	},
        -
        -	uniqueId: (function() {
        -		var uuid = 0;
        -
        -		return function() {
        -			return this.each(function() {
        -				if ( !this.id ) {
        -					this.id = "ui-id-" + ( ++uuid );
        -				}
        -			});
        -		};
        -	})(),
        -
        -	removeUniqueId: function() {
        -		return this.each(function() {
        -			if ( /^ui-id-\d+$/.test( this.id ) ) {
        -				$( this ).removeAttr( "id" );
        -			}
        -		});
        -	}
        -});
        -
        -// selectors
        -function focusable( element, isTabIndexNotNaN ) {
        -	var map, mapName, img,
        -		nodeName = element.nodeName.toLowerCase();
        -	if ( "area" === nodeName ) {
        -		map = element.parentNode;
        -		mapName = map.name;
        -		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
        -			return false;
        -		}
        -		img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
        -		return !!img && visible( img );
        -	}
        -	return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
        -		!element.disabled :
        -		"a" === nodeName ?
        -			element.href || isTabIndexNotNaN :
        -			isTabIndexNotNaN) &&
        -		// the element and all of its ancestors must be visible
        -		visible( element );
        -}
        -
        -function visible( element ) {
        -	return $.expr.filters.visible( element ) &&
        -		!$( element ).parents().addBack().filter(function() {
        -			return $.css( this, "visibility" ) === "hidden";
        -		}).length;
        -}
        -
        -$.extend( $.expr[ ":" ], {
        -	data: $.expr.createPseudo ?
        -		$.expr.createPseudo(function( dataName ) {
        -			return function( elem ) {
        -				return !!$.data( elem, dataName );
        -			};
        -		}) :
        -		// support: jQuery <1.8
        -		function( elem, i, match ) {
        -			return !!$.data( elem, match[ 3 ] );
        -		},
        -
        -	focusable: function( element ) {
        -		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
        -	},
        -
        -	tabbable: function( element ) {
        -		var tabIndex = $.attr( element, "tabindex" ),
        -			isTabIndexNaN = isNaN( tabIndex );
        -		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
        -	}
        -});
        -
        -// support: jQuery <1.8
        -if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
        -	$.each( [ "Width", "Height" ], function( i, name ) {
        -		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
        -			type = name.toLowerCase(),
        -			orig = {
        -				innerWidth: $.fn.innerWidth,
        -				innerHeight: $.fn.innerHeight,
        -				outerWidth: $.fn.outerWidth,
        -				outerHeight: $.fn.outerHeight
        -			};
        -
        -		function reduce( elem, size, border, margin ) {
        -			$.each( side, function() {
        -				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
        -				if ( border ) {
        -					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
        -				}
        -				if ( margin ) {
        -					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
        -				}
        -			});
        -			return size;
        -		}
        -
        -		$.fn[ "inner" + name ] = function( size ) {
        -			if ( size === undefined ) {
        -				return orig[ "inner" + name ].call( this );
        -			}
        -
        -			return this.each(function() {
        -				$( this ).css( type, reduce( this, size ) + "px" );
        -			});
        -		};
        -
        -		$.fn[ "outer" + name] = function( size, margin ) {
        -			if ( typeof size !== "number" ) {
        -				return orig[ "outer" + name ].call( this, size );
        -			}
        -
        -			return this.each(function() {
        -				$( this).css( type, reduce( this, size, true, margin ) + "px" );
        -			});
        -		};
        -	});
        -}
        -
        -// support: jQuery <1.8
        -if ( !$.fn.addBack ) {
        -	$.fn.addBack = function( selector ) {
        -		return this.add( selector == null ?
        -			this.prevObject : this.prevObject.filter( selector )
        -		);
        -	};
        -}
        -
        -// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
        -if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
        -	$.fn.removeData = (function( removeData ) {
        -		return function( key ) {
        -			if ( arguments.length ) {
        -				return removeData.call( this, $.camelCase( key ) );
        -			} else {
        -				return removeData.call( this );
        -			}
        -		};
        -	})( $.fn.removeData );
        -}
        -
        -// deprecated
        -$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
        -
        -$.fn.extend({
        -	focus: (function( orig ) {
        -		return function( delay, fn ) {
        -			return typeof delay === "number" ?
        -				this.each(function() {
        -					var elem = this;
        -					setTimeout(function() {
        -						$( elem ).focus();
        -						if ( fn ) {
        -							fn.call( elem );
        -						}
        -					}, delay );
        -				}) :
        -				orig.apply( this, arguments );
        -		};
        -	})( $.fn.focus ),
        -
        -	disableSelection: (function() {
        -		var eventType = "onselectstart" in document.createElement( "div" ) ?
        -			"selectstart" :
        -			"mousedown";
        -
        -		return function() {
        -			return this.bind( eventType + ".ui-disableSelection", function( event ) {
        -				event.preventDefault();
        -			});
        -		};
        -	})(),
        -
        -	enableSelection: function() {
        -		return this.unbind( ".ui-disableSelection" );
        -	},
        -
        -	zIndex: function( zIndex ) {
        -		if ( zIndex !== undefined ) {
        -			return this.css( "zIndex", zIndex );
        -		}
        -
        -		if ( this.length ) {
        -			var elem = $( this[ 0 ] ), position, value;
        -			while ( elem.length && elem[ 0 ] !== document ) {
        -				// Ignore z-index if position is set to a value where z-index is ignored by the browser
        -				// This makes behavior of this function consistent across browsers
        -				// WebKit always returns auto if the element is positioned
        -				position = elem.css( "position" );
        -				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
        -					// IE returns 0 when zIndex is not specified
        -					// other browsers return a string
        -					// we ignore the case of nested elements with an explicit value of 0
        -					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
        -					value = parseInt( elem.css( "zIndex" ), 10 );
        -					if ( !isNaN( value ) && value !== 0 ) {
        -						return value;
        -					}
        -				}
        -				elem = elem.parent();
        -			}
        -		}
        -
        -		return 0;
        -	}
        -});
        -
        -// $.ui.plugin is deprecated. Use $.widget() extensions instead.
        -$.ui.plugin = {
        -	add: function( module, option, set ) {
        -		var i,
        -			proto = $.ui[ module ].prototype;
        -		for ( i in set ) {
        -			proto.plugins[ i ] = proto.plugins[ i ] || [];
        -			proto.plugins[ i ].push( [ option, set[ i ] ] );
        -		}
        -	},
        -	call: function( instance, name, args, allowDisconnected ) {
        -		var i,
        -			set = instance.plugins[ name ];
        -
        -		if ( !set ) {
        -			return;
        -		}
        -
        -		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
        -			return;
        -		}
        -
        -		for ( i = 0; i < set.length; i++ ) {
        -			if ( instance.options[ set[ i ][ 0 ] ] ) {
        -				set[ i ][ 1 ].apply( instance.element, args );
        -			}
        -		}
        -	}
        -};
        -
        -
        -/*!
        - * jQuery UI Widget 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/jQuery.widget/
        - */
        -
        -
        -var widget_uuid = 0,
        -	widget_slice = Array.prototype.slice;
        -
        -$.cleanData = (function( orig ) {
        -	return function( elems ) {
        -		var events, elem, i;
        -		for ( i = 0; (elem = elems[i]) != null; i++ ) {
        -			try {
        -
        -				// Only trigger remove when necessary to save time
        -				events = $._data( elem, "events" );
        -				if ( events && events.remove ) {
        -					$( elem ).triggerHandler( "remove" );
        -				}
        -
        -			// http://bugs.jquery.com/ticket/8235
        -			} catch ( e ) {}
        -		}
        -		orig( elems );
        -	};
        -})( $.cleanData );
        -
        -$.widget = function( name, base, prototype ) {
        -	var fullName, existingConstructor, constructor, basePrototype,
        -		// proxiedPrototype allows the provided prototype to remain unmodified
        -		// so that it can be used as a mixin for multiple widgets (#8876)
        -		proxiedPrototype = {},
        -		namespace = name.split( "." )[ 0 ];
        -
        -	name = name.split( "." )[ 1 ];
        -	fullName = namespace + "-" + name;
        -
        -	if ( !prototype ) {
        -		prototype = base;
        -		base = $.Widget;
        -	}
        -
        -	// create selector for plugin
        -	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
        -		return !!$.data( elem, fullName );
        -	};
        -
        -	$[ namespace ] = $[ namespace ] || {};
        -	existingConstructor = $[ namespace ][ name ];
        -	constructor = $[ namespace ][ name ] = function( options, element ) {
        -		// allow instantiation without "new" keyword
        -		if ( !this._createWidget ) {
        -			return new constructor( options, element );
        -		}
        -
        -		// allow instantiation without initializing for simple inheritance
        -		// must use "new" keyword (the code above always passes args)
        -		if ( arguments.length ) {
        -			this._createWidget( options, element );
        -		}
        -	};
        -	// extend with the existing constructor to carry over any static properties
        -	$.extend( constructor, existingConstructor, {
        -		version: prototype.version,
        -		// copy the object used to create the prototype in case we need to
        -		// redefine the widget later
        -		_proto: $.extend( {}, prototype ),
        -		// track widgets that inherit from this widget in case this widget is
        -		// redefined after a widget inherits from it
        -		_childConstructors: []
        -	});
        -
        -	basePrototype = new base();
        -	// we need to make the options hash a property directly on the new instance
        -	// otherwise we'll modify the options hash on the prototype that we're
        -	// inheriting from
        -	basePrototype.options = $.widget.extend( {}, basePrototype.options );
        -	$.each( prototype, function( prop, value ) {
        -		if ( !$.isFunction( value ) ) {
        -			proxiedPrototype[ prop ] = value;
        -			return;
        -		}
        -		proxiedPrototype[ prop ] = (function() {
        -			var _super = function() {
        -					return base.prototype[ prop ].apply( this, arguments );
        -				},
        -				_superApply = function( args ) {
        -					return base.prototype[ prop ].apply( this, args );
        -				};
        -			return function() {
        -				var __super = this._super,
        -					__superApply = this._superApply,
        -					returnValue;
        -
        -				this._super = _super;
        -				this._superApply = _superApply;
        -
        -				returnValue = value.apply( this, arguments );
        -
        -				this._super = __super;
        -				this._superApply = __superApply;
        -
        -				return returnValue;
        -			};
        -		})();
        -	});
        -	constructor.prototype = $.widget.extend( basePrototype, {
        -		// TODO: remove support for widgetEventPrefix
        -		// always use the name + a colon as the prefix, e.g., draggable:start
        -		// don't prefix for widgets that aren't DOM-based
        -		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
        -	}, proxiedPrototype, {
        -		constructor: constructor,
        -		namespace: namespace,
        -		widgetName: name,
        -		widgetFullName: fullName
        -	});
        -
        -	// If this widget is being redefined then we need to find all widgets that
        -	// are inheriting from it and redefine all of them so that they inherit from
        -	// the new version of this widget. We're essentially trying to replace one
        -	// level in the prototype chain.
        -	if ( existingConstructor ) {
        -		$.each( existingConstructor._childConstructors, function( i, child ) {
        -			var childPrototype = child.prototype;
        -
        -			// redefine the child widget using the same prototype that was
        -			// originally used, but inherit from the new version of the base
        -			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
        -		});
        -		// remove the list of existing child constructors from the old constructor
        -		// so the old child constructors can be garbage collected
        -		delete existingConstructor._childConstructors;
        -	} else {
        -		base._childConstructors.push( constructor );
        -	}
        -
        -	$.widget.bridge( name, constructor );
        -
        -	return constructor;
        -};
        -
        -$.widget.extend = function( target ) {
        -	var input = widget_slice.call( arguments, 1 ),
        -		inputIndex = 0,
        -		inputLength = input.length,
        -		key,
        -		value;
        -	for ( ; inputIndex < inputLength; inputIndex++ ) {
        -		for ( key in input[ inputIndex ] ) {
        -			value = input[ inputIndex ][ key ];
        -			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
        -				// Clone objects
        -				if ( $.isPlainObject( value ) ) {
        -					target[ key ] = $.isPlainObject( target[ key ] ) ?
        -						$.widget.extend( {}, target[ key ], value ) :
        -						// Don't extend strings, arrays, etc. with objects
        -						$.widget.extend( {}, value );
        -				// Copy everything else by reference
        -				} else {
        -					target[ key ] = value;
        -				}
        -			}
        -		}
        -	}
        -	return target;
        -};
        -
        -$.widget.bridge = function( name, object ) {
        -	var fullName = object.prototype.widgetFullName || name;
        -	$.fn[ name ] = function( options ) {
        -		var isMethodCall = typeof options === "string",
        -			args = widget_slice.call( arguments, 1 ),
        -			returnValue = this;
        -
        -		if ( isMethodCall ) {
        -			this.each(function() {
        -				var methodValue,
        -					instance = $.data( this, fullName );
        -				if ( options === "instance" ) {
        -					returnValue = instance;
        -					return false;
        -				}
        -				if ( !instance ) {
        -					return $.error( "cannot call methods on " + name + " prior to initialization; " +
        -						"attempted to call method '" + options + "'" );
        -				}
        -				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
        -					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
        -				}
        -				methodValue = instance[ options ].apply( instance, args );
        -				if ( methodValue !== instance && methodValue !== undefined ) {
        -					returnValue = methodValue && methodValue.jquery ?
        -						returnValue.pushStack( methodValue.get() ) :
        -						methodValue;
        -					return false;
        -				}
        -			});
        -		} else {
        -
        -			// Allow multiple hashes to be passed on init
        -			if ( args.length ) {
        -				options = $.widget.extend.apply( null, [ options ].concat(args) );
        -			}
        -
        -			this.each(function() {
        -				var instance = $.data( this, fullName );
        -				if ( instance ) {
        -					instance.option( options || {} );
        -					if ( instance._init ) {
        -						instance._init();
        -					}
        -				} else {
        -					$.data( this, fullName, new object( options, this ) );
        -				}
        -			});
        -		}
        -
        -		return returnValue;
        -	};
        -};
        -
        -$.Widget = function( /* options, element */ ) {};
        -$.Widget._childConstructors = [];
        -
        -$.Widget.prototype = {
        -	widgetName: "widget",
        -	widgetEventPrefix: "",
        -	defaultElement: "<div>",
        -	options: {
        -		disabled: false,
        -
        -		// callbacks
        -		create: null
        -	},
        -	_createWidget: function( options, element ) {
        -		element = $( element || this.defaultElement || this )[ 0 ];
        -		this.element = $( element );
        -		this.uuid = widget_uuid++;
        -		this.eventNamespace = "." + this.widgetName + this.uuid;
        -
        -		this.bindings = $();
        -		this.hoverable = $();
        -		this.focusable = $();
        -
        -		if ( element !== this ) {
        -			$.data( element, this.widgetFullName, this );
        -			this._on( true, this.element, {
        -				remove: function( event ) {
        -					if ( event.target === element ) {
        -						this.destroy();
        -					}
        -				}
        -			});
        -			this.document = $( element.style ?
        -				// element within the document
        -				element.ownerDocument :
        -				// element is window or document
        -				element.document || element );
        -			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
        -		}
        -
        -		this.options = $.widget.extend( {},
        -			this.options,
        -			this._getCreateOptions(),
        -			options );
        -
        -		this._create();
        -		this._trigger( "create", null, this._getCreateEventData() );
        -		this._init();
        -	},
        -	_getCreateOptions: $.noop,
        -	_getCreateEventData: $.noop,
        -	_create: $.noop,
        -	_init: $.noop,
        -
        -	destroy: function() {
        -		this._destroy();
        -		// we can probably remove the unbind calls in 2.0
        -		// all event bindings should go through this._on()
        -		this.element
        -			.unbind( this.eventNamespace )
        -			.removeData( this.widgetFullName )
        -			// support: jquery <1.6.3
        -			// http://bugs.jquery.com/ticket/9413
        -			.removeData( $.camelCase( this.widgetFullName ) );
        -		this.widget()
        -			.unbind( this.eventNamespace )
        -			.removeAttr( "aria-disabled" )
        -			.removeClass(
        -				this.widgetFullName + "-disabled " +
        -				"ui-state-disabled" );
        -
        -		// clean up events and states
        -		this.bindings.unbind( this.eventNamespace );
        -		this.hoverable.removeClass( "ui-state-hover" );
        -		this.focusable.removeClass( "ui-state-focus" );
        -	},
        -	_destroy: $.noop,
        -
        -	widget: function() {
        -		return this.element;
        -	},
        -
        -	option: function( key, value ) {
        -		var options = key,
        -			parts,
        -			curOption,
        -			i;
        -
        -		if ( arguments.length === 0 ) {
        -			// don't return a reference to the internal hash
        -			return $.widget.extend( {}, this.options );
        -		}
        -
        -		if ( typeof key === "string" ) {
        -			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
        -			options = {};
        -			parts = key.split( "." );
        -			key = parts.shift();
        -			if ( parts.length ) {
        -				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
        -				for ( i = 0; i < parts.length - 1; i++ ) {
        -					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
        -					curOption = curOption[ parts[ i ] ];
        -				}
        -				key = parts.pop();
        -				if ( arguments.length === 1 ) {
        -					return curOption[ key ] === undefined ? null : curOption[ key ];
        -				}
        -				curOption[ key ] = value;
        -			} else {
        -				if ( arguments.length === 1 ) {
        -					return this.options[ key ] === undefined ? null : this.options[ key ];
        -				}
        -				options[ key ] = value;
        -			}
        -		}
        -
        -		this._setOptions( options );
        -
        -		return this;
        -	},
        -	_setOptions: function( options ) {
        -		var key;
        -
        -		for ( key in options ) {
        -			this._setOption( key, options[ key ] );
        -		}
        -
        -		return this;
        -	},
        -	_setOption: function( key, value ) {
        -		this.options[ key ] = value;
        -
        -		if ( key === "disabled" ) {
        -			this.widget()
        -				.toggleClass( this.widgetFullName + "-disabled", !!value );
        -
        -			// If the widget is becoming disabled, then nothing is interactive
        -			if ( value ) {
        -				this.hoverable.removeClass( "ui-state-hover" );
        -				this.focusable.removeClass( "ui-state-focus" );
        -			}
        -		}
        -
        -		return this;
        -	},
        -
        -	enable: function() {
        -		return this._setOptions({ disabled: false });
        -	},
        -	disable: function() {
        -		return this._setOptions({ disabled: true });
        -	},
        -
        -	_on: function( suppressDisabledCheck, element, handlers ) {
        -		var delegateElement,
        -			instance = this;
        -
        -		// no suppressDisabledCheck flag, shuffle arguments
        -		if ( typeof suppressDisabledCheck !== "boolean" ) {
        -			handlers = element;
        -			element = suppressDisabledCheck;
        -			suppressDisabledCheck = false;
        -		}
        -
        -		// no element argument, shuffle and use this.element
        -		if ( !handlers ) {
        -			handlers = element;
        -			element = this.element;
        -			delegateElement = this.widget();
        -		} else {
        -			element = delegateElement = $( element );
        -			this.bindings = this.bindings.add( element );
        -		}
        -
        -		$.each( handlers, function( event, handler ) {
        -			function handlerProxy() {
        -				// allow widgets to customize the disabled handling
        -				// - disabled as an array instead of boolean
        -				// - disabled class as method for disabling individual parts
        -				if ( !suppressDisabledCheck &&
        -						( instance.options.disabled === true ||
        -							$( this ).hasClass( "ui-state-disabled" ) ) ) {
        -					return;
        -				}
        -				return ( typeof handler === "string" ? instance[ handler ] : handler )
        -					.apply( instance, arguments );
        -			}
        -
        -			// copy the guid so direct unbinding works
        -			if ( typeof handler !== "string" ) {
        -				handlerProxy.guid = handler.guid =
        -					handler.guid || handlerProxy.guid || $.guid++;
        -			}
        -
        -			var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
        -				eventName = match[1] + instance.eventNamespace,
        -				selector = match[2];
        -			if ( selector ) {
        -				delegateElement.delegate( selector, eventName, handlerProxy );
        -			} else {
        -				element.bind( eventName, handlerProxy );
        -			}
        -		});
        -	},
        -
        -	_off: function( element, eventName ) {
        -		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
        -			this.eventNamespace;
        -		element.unbind( eventName ).undelegate( eventName );
        -
        -		// Clear the stack to avoid memory leaks (#10056)
        -		this.bindings = $( this.bindings.not( element ).get() );
        -		this.focusable = $( this.focusable.not( element ).get() );
        -		this.hoverable = $( this.hoverable.not( element ).get() );
        -	},
        -
        -	_delay: function( handler, delay ) {
        -		function handlerProxy() {
        -			return ( typeof handler === "string" ? instance[ handler ] : handler )
        -				.apply( instance, arguments );
        -		}
        -		var instance = this;
        -		return setTimeout( handlerProxy, delay || 0 );
        -	},
        -
        -	_hoverable: function( element ) {
        -		this.hoverable = this.hoverable.add( element );
        -		this._on( element, {
        -			mouseenter: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-hover" );
        -			},
        -			mouseleave: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-hover" );
        -			}
        -		});
        -	},
        -
        -	_focusable: function( element ) {
        -		this.focusable = this.focusable.add( element );
        -		this._on( element, {
        -			focusin: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-focus" );
        -			},
        -			focusout: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-focus" );
        -			}
        -		});
        -	},
        -
        -	_trigger: function( type, event, data ) {
        -		var prop, orig,
        -			callback = this.options[ type ];
        -
        -		data = data || {};
        -		event = $.Event( event );
        -		event.type = ( type === this.widgetEventPrefix ?
        -			type :
        -			this.widgetEventPrefix + type ).toLowerCase();
        -		// the original event may come from any element
        -		// so we need to reset the target on the new event
        -		event.target = this.element[ 0 ];
        -
        -		// copy original event properties over to the new event
        -		orig = event.originalEvent;
        -		if ( orig ) {
        -			for ( prop in orig ) {
        -				if ( !( prop in event ) ) {
        -					event[ prop ] = orig[ prop ];
        -				}
        -			}
        -		}
        -
        -		this.element.trigger( event, data );
        -		return !( $.isFunction( callback ) &&
        -			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
        -			event.isDefaultPrevented() );
        -	}
        -};
        -
        -$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
        -	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
        -		if ( typeof options === "string" ) {
        -			options = { effect: options };
        -		}
        -		var hasOptions,
        -			effectName = !options ?
        -				method :
        -				options === true || typeof options === "number" ?
        -					defaultEffect :
        -					options.effect || defaultEffect;
        -		options = options || {};
        -		if ( typeof options === "number" ) {
        -			options = { duration: options };
        -		}
        -		hasOptions = !$.isEmptyObject( options );
        -		options.complete = callback;
        -		if ( options.delay ) {
        -			element.delay( options.delay );
        -		}
        -		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
        -			element[ method ]( options );
        -		} else if ( effectName !== method && element[ effectName ] ) {
        -			element[ effectName ]( options.duration, options.easing, callback );
        -		} else {
        -			element.queue(function( next ) {
        -				$( this )[ method ]();
        -				if ( callback ) {
        -					callback.call( element[ 0 ] );
        -				}
        -				next();
        -			});
        -		}
        -	};
        -});
        -
        -var widget = $.widget;
        -
        -
        -/*!
        - * jQuery UI Mouse 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/mouse/
        - */
        -
        -
        -var mouseHandled = false;
        -$( document ).mouseup( function() {
        -	mouseHandled = false;
        -});
        -
        -var mouse = $.widget("ui.mouse", {
        -	version: "1.11.4",
        -	options: {
        -		cancel: "input,textarea,button,select,option",
        -		distance: 1,
        -		delay: 0
        -	},
        -	_mouseInit: function() {
        -		var that = this;
        -
        -		this.element
        -			.bind("mousedown." + this.widgetName, function(event) {
        -				return that._mouseDown(event);
        -			})
        -			.bind("click." + this.widgetName, function(event) {
        -				if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
        -					$.removeData(event.target, that.widgetName + ".preventClickEvent");
        -					event.stopImmediatePropagation();
        -					return false;
        -				}
        -			});
        -
        -		this.started = false;
        -	},
        -
        -	// TODO: make sure destroying one instance of mouse doesn't mess with
        -	// other instances of mouse
        -	_mouseDestroy: function() {
        -		this.element.unbind("." + this.widgetName);
        -		if ( this._mouseMoveDelegate ) {
        -			this.document
        -				.unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
        -				.unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
        -		}
        -	},
        -
        -	_mouseDown: function(event) {
        -		// don't let more than one widget handle mouseStart
        -		if ( mouseHandled ) {
        -			return;
        -		}
        -
        -		this._mouseMoved = false;
        -
        -		// we may have missed mouseup (out of window)
        -		(this._mouseStarted && this._mouseUp(event));
        -
        -		this._mouseDownEvent = event;
        -
        -		var that = this,
        -			btnIsLeft = (event.which === 1),
        -			// event.target.nodeName works around a bug in IE 8 with
        -			// disabled inputs (#7620)
        -			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
        -		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
        -			return true;
        -		}
        -
        -		this.mouseDelayMet = !this.options.delay;
        -		if (!this.mouseDelayMet) {
        -			this._mouseDelayTimer = setTimeout(function() {
        -				that.mouseDelayMet = true;
        -			}, this.options.delay);
        -		}
        -
        -		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
        -			this._mouseStarted = (this._mouseStart(event) !== false);
        -			if (!this._mouseStarted) {
        -				event.preventDefault();
        -				return true;
        -			}
        -		}
        -
        -		// Click event may never have fired (Gecko & Opera)
        -		if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
        -			$.removeData(event.target, this.widgetName + ".preventClickEvent");
        -		}
        -
        -		// these delegates are required to keep context
        -		this._mouseMoveDelegate = function(event) {
        -			return that._mouseMove(event);
        -		};
        -		this._mouseUpDelegate = function(event) {
        -			return that._mouseUp(event);
        -		};
        -
        -		this.document
        -			.bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        -			.bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
        -
        -		event.preventDefault();
        -
        -		mouseHandled = true;
        -		return true;
        -	},
        -
        -	_mouseMove: function(event) {
        -		// Only check for mouseups outside the document if you've moved inside the document
        -		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
        -		// fire a mousemove event if content is placed under the cursor. See #7778
        -		// Support: IE <9
        -		if ( this._mouseMoved ) {
        -			// IE mouseup check - mouseup happened when mouse was out of window
        -			if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
        -				return this._mouseUp(event);
        -
        -			// Iframe mouseup check - mouseup occurred in another document
        -			} else if ( !event.which ) {
        -				return this._mouseUp( event );
        -			}
        -		}
        -
        -		if ( event.which || event.button ) {
        -			this._mouseMoved = true;
        -		}
        -
        -		if (this._mouseStarted) {
        -			this._mouseDrag(event);
        -			return event.preventDefault();
        -		}
        -
        -		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
        -			this._mouseStarted =
        -				(this._mouseStart(this._mouseDownEvent, event) !== false);
        -			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
        -		}
        -
        -		return !this._mouseStarted;
        -	},
        -
        -	_mouseUp: function(event) {
        -		this.document
        -			.unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        -			.unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
        -
        -		if (this._mouseStarted) {
        -			this._mouseStarted = false;
        -
        -			if (event.target === this._mouseDownEvent.target) {
        -				$.data(event.target, this.widgetName + ".preventClickEvent", true);
        -			}
        -
        -			this._mouseStop(event);
        -		}
        -
        -		mouseHandled = false;
        -		return false;
        -	},
        -
        -	_mouseDistanceMet: function(event) {
        -		return (Math.max(
        -				Math.abs(this._mouseDownEvent.pageX - event.pageX),
        -				Math.abs(this._mouseDownEvent.pageY - event.pageY)
        -			) >= this.options.distance
        -		);
        -	},
        -
        -	_mouseDelayMet: function(/* event */) {
        -		return this.mouseDelayMet;
        -	},
        -
        -	// These are placeholder methods, to be overriden by extending plugin
        -	_mouseStart: function(/* event */) {},
        -	_mouseDrag: function(/* event */) {},
        -	_mouseStop: function(/* event */) {},
        -	_mouseCapture: function(/* event */) { return true; }
        -});
        -
        -
        -/*!
        - * jQuery UI Position 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/position/
        - */
        -
        -(function() {
        -
        -$.ui = $.ui || {};
        -
        -var cachedScrollbarWidth, supportsOffsetFractions,
        -	max = Math.max,
        -	abs = Math.abs,
        -	round = Math.round,
        -	rhorizontal = /left|center|right/,
        -	rvertical = /top|center|bottom/,
        -	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
        -	rposition = /^\w+/,
        -	rpercent = /%$/,
        -	_position = $.fn.position;
        -
        -function getOffsets( offsets, width, height ) {
        -	return [
        -		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
        -		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
        -	];
        -}
        -
        -function parseCss( element, property ) {
        -	return parseInt( $.css( element, property ), 10 ) || 0;
        -}
        -
        -function getDimensions( elem ) {
        -	var raw = elem[0];
        -	if ( raw.nodeType === 9 ) {
        -		return {
        -			width: elem.width(),
        -			height: elem.height(),
        -			offset: { top: 0, left: 0 }
        -		};
        -	}
        -	if ( $.isWindow( raw ) ) {
        -		return {
        -			width: elem.width(),
        -			height: elem.height(),
        -			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
        -		};
        -	}
        -	if ( raw.preventDefault ) {
        -		return {
        -			width: 0,
        -			height: 0,
        -			offset: { top: raw.pageY, left: raw.pageX }
        -		};
        -	}
        -	return {
        -		width: elem.outerWidth(),
        -		height: elem.outerHeight(),
        -		offset: elem.offset()
        -	};
        -}
        -
        -$.position = {
        -	scrollbarWidth: function() {
        -		if ( cachedScrollbarWidth !== undefined ) {
        -			return cachedScrollbarWidth;
        -		}
        -		var w1, w2,
        -			div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
        -			innerDiv = div.children()[0];
        -
        -		$( "body" ).append( div );
        -		w1 = innerDiv.offsetWidth;
        -		div.css( "overflow", "scroll" );
        -
        -		w2 = innerDiv.offsetWidth;
        -
        -		if ( w1 === w2 ) {
        -			w2 = div[0].clientWidth;
        -		}
        -
        -		div.remove();
        -
        -		return (cachedScrollbarWidth = w1 - w2);
        -	},
        -	getScrollInfo: function( within ) {
        -		var overflowX = within.isWindow || within.isDocument ? "" :
        -				within.element.css( "overflow-x" ),
        -			overflowY = within.isWindow || within.isDocument ? "" :
        -				within.element.css( "overflow-y" ),
        -			hasOverflowX = overflowX === "scroll" ||
        -				( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
        -			hasOverflowY = overflowY === "scroll" ||
        -				( overflowY === "auto" && within.height < within.element[0].scrollHeight );
        -		return {
        -			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
        -			height: hasOverflowX ? $.position.scrollbarWidth() : 0
        -		};
        -	},
        -	getWithinInfo: function( element ) {
        -		var withinElement = $( element || window ),
        -			isWindow = $.isWindow( withinElement[0] ),
        -			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
        -		return {
        -			element: withinElement,
        -			isWindow: isWindow,
        -			isDocument: isDocument,
        -			offset: withinElement.offset() || { left: 0, top: 0 },
        -			scrollLeft: withinElement.scrollLeft(),
        -			scrollTop: withinElement.scrollTop(),
        -
        -			// support: jQuery 1.6.x
        -			// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
        -			width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
        -			height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
        -		};
        -	}
        -};
        -
        -$.fn.position = function( options ) {
        -	if ( !options || !options.of ) {
        -		return _position.apply( this, arguments );
        -	}
        -
        -	// make a copy, we don't want to modify arguments
        -	options = $.extend( {}, options );
        -
        -	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
        -		target = $( options.of ),
        -		within = $.position.getWithinInfo( options.within ),
        -		scrollInfo = $.position.getScrollInfo( within ),
        -		collision = ( options.collision || "flip" ).split( " " ),
        -		offsets = {};
        -
        -	dimensions = getDimensions( target );
        -	if ( target[0].preventDefault ) {
        -		// force left top to allow flipping
        -		options.at = "left top";
        -	}
        -	targetWidth = dimensions.width;
        -	targetHeight = dimensions.height;
        -	targetOffset = dimensions.offset;
        -	// clone to reuse original targetOffset later
        -	basePosition = $.extend( {}, targetOffset );
        -
        -	// force my and at to have valid horizontal and vertical positions
        -	// if a value is missing or invalid, it will be converted to center
        -	$.each( [ "my", "at" ], function() {
        -		var pos = ( options[ this ] || "" ).split( " " ),
        -			horizontalOffset,
        -			verticalOffset;
        -
        -		if ( pos.length === 1) {
        -			pos = rhorizontal.test( pos[ 0 ] ) ?
        -				pos.concat( [ "center" ] ) :
        -				rvertical.test( pos[ 0 ] ) ?
        -					[ "center" ].concat( pos ) :
        -					[ "center", "center" ];
        -		}
        -		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
        -		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
        -
        -		// calculate offsets
        -		horizontalOffset = roffset.exec( pos[ 0 ] );
        -		verticalOffset = roffset.exec( pos[ 1 ] );
        -		offsets[ this ] = [
        -			horizontalOffset ? horizontalOffset[ 0 ] : 0,
        -			verticalOffset ? verticalOffset[ 0 ] : 0
        -		];
        -
        -		// reduce to just the positions without the offsets
        -		options[ this ] = [
        -			rposition.exec( pos[ 0 ] )[ 0 ],
        -			rposition.exec( pos[ 1 ] )[ 0 ]
        -		];
        -	});
        -
        -	// normalize collision option
        -	if ( collision.length === 1 ) {
        -		collision[ 1 ] = collision[ 0 ];
        -	}
        -
        -	if ( options.at[ 0 ] === "right" ) {
        -		basePosition.left += targetWidth;
        -	} else if ( options.at[ 0 ] === "center" ) {
        -		basePosition.left += targetWidth / 2;
        -	}
        -
        -	if ( options.at[ 1 ] === "bottom" ) {
        -		basePosition.top += targetHeight;
        -	} else if ( options.at[ 1 ] === "center" ) {
        -		basePosition.top += targetHeight / 2;
        -	}
        -
        -	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
        -	basePosition.left += atOffset[ 0 ];
        -	basePosition.top += atOffset[ 1 ];
        -
        -	return this.each(function() {
        -		var collisionPosition, using,
        -			elem = $( this ),
        -			elemWidth = elem.outerWidth(),
        -			elemHeight = elem.outerHeight(),
        -			marginLeft = parseCss( this, "marginLeft" ),
        -			marginTop = parseCss( this, "marginTop" ),
        -			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
        -			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
        -			position = $.extend( {}, basePosition ),
        -			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
        -
        -		if ( options.my[ 0 ] === "right" ) {
        -			position.left -= elemWidth;
        -		} else if ( options.my[ 0 ] === "center" ) {
        -			position.left -= elemWidth / 2;
        -		}
        -
        -		if ( options.my[ 1 ] === "bottom" ) {
        -			position.top -= elemHeight;
        -		} else if ( options.my[ 1 ] === "center" ) {
        -			position.top -= elemHeight / 2;
        -		}
        -
        -		position.left += myOffset[ 0 ];
        -		position.top += myOffset[ 1 ];
        -
        -		// if the browser doesn't support fractions, then round for consistent results
        -		if ( !supportsOffsetFractions ) {
        -			position.left = round( position.left );
        -			position.top = round( position.top );
        -		}
        -
        -		collisionPosition = {
        -			marginLeft: marginLeft,
        -			marginTop: marginTop
        -		};
        -
        -		$.each( [ "left", "top" ], function( i, dir ) {
        -			if ( $.ui.position[ collision[ i ] ] ) {
        -				$.ui.position[ collision[ i ] ][ dir ]( position, {
        -					targetWidth: targetWidth,
        -					targetHeight: targetHeight,
        -					elemWidth: elemWidth,
        -					elemHeight: elemHeight,
        -					collisionPosition: collisionPosition,
        -					collisionWidth: collisionWidth,
        -					collisionHeight: collisionHeight,
        -					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
        -					my: options.my,
        -					at: options.at,
        -					within: within,
        -					elem: elem
        -				});
        -			}
        -		});
        -
        -		if ( options.using ) {
        -			// adds feedback as second argument to using callback, if present
        -			using = function( props ) {
        -				var left = targetOffset.left - position.left,
        -					right = left + targetWidth - elemWidth,
        -					top = targetOffset.top - position.top,
        -					bottom = top + targetHeight - elemHeight,
        -					feedback = {
        -						target: {
        -							element: target,
        -							left: targetOffset.left,
        -							top: targetOffset.top,
        -							width: targetWidth,
        -							height: targetHeight
        -						},
        -						element: {
        -							element: elem,
        -							left: position.left,
        -							top: position.top,
        -							width: elemWidth,
        -							height: elemHeight
        -						},
        -						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
        -						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
        -					};
        -				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
        -					feedback.horizontal = "center";
        -				}
        -				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
        -					feedback.vertical = "middle";
        -				}
        -				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
        -					feedback.important = "horizontal";
        -				} else {
        -					feedback.important = "vertical";
        -				}
        -				options.using.call( this, props, feedback );
        -			};
        -		}
        -
        -		elem.offset( $.extend( position, { using: using } ) );
        -	});
        -};
        -
        -$.ui.position = {
        -	fit: {
        -		left: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
        -				outerWidth = within.width,
        -				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        -				overLeft = withinOffset - collisionPosLeft,
        -				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
        -				newOverRight;
        -
        -			// element is wider than within
        -			if ( data.collisionWidth > outerWidth ) {
        -				// element is initially over the left side of within
        -				if ( overLeft > 0 && overRight <= 0 ) {
        -					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
        -					position.left += overLeft - newOverRight;
        -				// element is initially over right side of within
        -				} else if ( overRight > 0 && overLeft <= 0 ) {
        -					position.left = withinOffset;
        -				// element is initially over both left and right sides of within
        -				} else {
        -					if ( overLeft > overRight ) {
        -						position.left = withinOffset + outerWidth - data.collisionWidth;
        -					} else {
        -						position.left = withinOffset;
        -					}
        -				}
        -			// too far left -> align with left edge
        -			} else if ( overLeft > 0 ) {
        -				position.left += overLeft;
        -			// too far right -> align with right edge
        -			} else if ( overRight > 0 ) {
        -				position.left -= overRight;
        -			// adjust based on position and margin
        -			} else {
        -				position.left = max( position.left - collisionPosLeft, position.left );
        -			}
        -		},
        -		top: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
        -				outerHeight = data.within.height,
        -				collisionPosTop = position.top - data.collisionPosition.marginTop,
        -				overTop = withinOffset - collisionPosTop,
        -				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
        -				newOverBottom;
        -
        -			// element is taller than within
        -			if ( data.collisionHeight > outerHeight ) {
        -				// element is initially over the top of within
        -				if ( overTop > 0 && overBottom <= 0 ) {
        -					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
        -					position.top += overTop - newOverBottom;
        -				// element is initially over bottom of within
        -				} else if ( overBottom > 0 && overTop <= 0 ) {
        -					position.top = withinOffset;
        -				// element is initially over both top and bottom of within
        -				} else {
        -					if ( overTop > overBottom ) {
        -						position.top = withinOffset + outerHeight - data.collisionHeight;
        -					} else {
        -						position.top = withinOffset;
        -					}
        -				}
        -			// too far up -> align with top
        -			} else if ( overTop > 0 ) {
        -				position.top += overTop;
        -			// too far down -> align with bottom edge
        -			} else if ( overBottom > 0 ) {
        -				position.top -= overBottom;
        -			// adjust based on position and margin
        -			} else {
        -				position.top = max( position.top - collisionPosTop, position.top );
        -			}
        -		}
        -	},
        -	flip: {
        -		left: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.offset.left + within.scrollLeft,
        -				outerWidth = within.width,
        -				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
        -				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        -				overLeft = collisionPosLeft - offsetLeft,
        -				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
        -				myOffset = data.my[ 0 ] === "left" ?
        -					-data.elemWidth :
        -					data.my[ 0 ] === "right" ?
        -						data.elemWidth :
        -						0,
        -				atOffset = data.at[ 0 ] === "left" ?
        -					data.targetWidth :
        -					data.at[ 0 ] === "right" ?
        -						-data.targetWidth :
        -						0,
        -				offset = -2 * data.offset[ 0 ],
        -				newOverRight,
        -				newOverLeft;
        -
        -			if ( overLeft < 0 ) {
        -				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
        -				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
        -					position.left += myOffset + atOffset + offset;
        -				}
        -			} else if ( overRight > 0 ) {
        -				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
        -				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
        -					position.left += myOffset + atOffset + offset;
        -				}
        -			}
        -		},
        -		top: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.offset.top + within.scrollTop,
        -				outerHeight = within.height,
        -				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
        -				collisionPosTop = position.top - data.collisionPosition.marginTop,
        -				overTop = collisionPosTop - offsetTop,
        -				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
        -				top = data.my[ 1 ] === "top",
        -				myOffset = top ?
        -					-data.elemHeight :
        -					data.my[ 1 ] === "bottom" ?
        -						data.elemHeight :
        -						0,
        -				atOffset = data.at[ 1 ] === "top" ?
        -					data.targetHeight :
        -					data.at[ 1 ] === "bottom" ?
        -						-data.targetHeight :
        -						0,
        -				offset = -2 * data.offset[ 1 ],
        -				newOverTop,
        -				newOverBottom;
        -			if ( overTop < 0 ) {
        -				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
        -				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
        -					position.top += myOffset + atOffset + offset;
        -				}
        -			} else if ( overBottom > 0 ) {
        -				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
        -				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
        -					position.top += myOffset + atOffset + offset;
        -				}
        -			}
        -		}
        -	},
        -	flipfit: {
        -		left: function() {
        -			$.ui.position.flip.left.apply( this, arguments );
        -			$.ui.position.fit.left.apply( this, arguments );
        -		},
        -		top: function() {
        -			$.ui.position.flip.top.apply( this, arguments );
        -			$.ui.position.fit.top.apply( this, arguments );
        -		}
        -	}
        -};
        -
        -// fraction support test
        -(function() {
        -	var testElement, testElementParent, testElementStyle, offsetLeft, i,
        -		body = document.getElementsByTagName( "body" )[ 0 ],
        -		div = document.createElement( "div" );
        -
        -	//Create a "fake body" for testing based on method used in jQuery.support
        -	testElement = document.createElement( body ? "div" : "body" );
        -	testElementStyle = {
        -		visibility: "hidden",
        -		width: 0,
        -		height: 0,
        -		border: 0,
        -		margin: 0,
        -		background: "none"
        -	};
        -	if ( body ) {
        -		$.extend( testElementStyle, {
        -			position: "absolute",
        -			left: "-1000px",
        -			top: "-1000px"
        -		});
        -	}
        -	for ( i in testElementStyle ) {
        -		testElement.style[ i ] = testElementStyle[ i ];
        -	}
        -	testElement.appendChild( div );
        -	testElementParent = body || document.documentElement;
        -	testElementParent.insertBefore( testElement, testElementParent.firstChild );
        -
        -	div.style.cssText = "position: absolute; left: 10.7432222px;";
        -
        -	offsetLeft = $( div ).offset().left;
        -	supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
        -
        -	testElement.innerHTML = "";
        -	testElementParent.removeChild( testElement );
        -})();
        -
        -})();
        -
        -var position = $.ui.position;
        -
        -
        -/*!
        - * jQuery UI Accordion 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/accordion/
        - */
        -
        -
        -var accordion = $.widget( "ui.accordion", {
        -	version: "1.11.4",
        -	options: {
        -		active: 0,
        -		animate: {},
        -		collapsible: false,
        -		event: "click",
        -		header: "> li > :first-child,> :not(li):even",
        -		heightStyle: "auto",
        -		icons: {
        -			activeHeader: "ui-icon-triangle-1-s",
        -			header: "ui-icon-triangle-1-e"
        -		},
        -
        -		// callbacks
        -		activate: null,
        -		beforeActivate: null
        -	},
        -
        -	hideProps: {
        -		borderTopWidth: "hide",
        -		borderBottomWidth: "hide",
        -		paddingTop: "hide",
        -		paddingBottom: "hide",
        -		height: "hide"
        -	},
        -
        -	showProps: {
        -		borderTopWidth: "show",
        -		borderBottomWidth: "show",
        -		paddingTop: "show",
        -		paddingBottom: "show",
        -		height: "show"
        -	},
        -
        -	_create: function() {
        -		var options = this.options;
        -		this.prevShow = this.prevHide = $();
        -		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
        -			// ARIA
        -			.attr( "role", "tablist" );
        -
        -		// don't allow collapsible: false and active: false / null
        -		if ( !options.collapsible && (options.active === false || options.active == null) ) {
        -			options.active = 0;
        -		}
        -
        -		this._processPanels();
        -		// handle negative values
        -		if ( options.active < 0 ) {
        -			options.active += this.headers.length;
        -		}
        -		this._refresh();
        -	},
        -
        -	_getCreateEventData: function() {
        -		return {
        -			header: this.active,
        -			panel: !this.active.length ? $() : this.active.next()
        -		};
        -	},
        -
        -	_createIcons: function() {
        -		var icons = this.options.icons;
        -		if ( icons ) {
        -			$( "<span>" )
        -				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
        -				.prependTo( this.headers );
        -			this.active.children( ".ui-accordion-header-icon" )
        -				.removeClass( icons.header )
        -				.addClass( icons.activeHeader );
        -			this.headers.addClass( "ui-accordion-icons" );
        -		}
        -	},
        -
        -	_destroyIcons: function() {
        -		this.headers
        -			.removeClass( "ui-accordion-icons" )
        -			.children( ".ui-accordion-header-icon" )
        -				.remove();
        -	},
        -
        -	_destroy: function() {
        -		var contents;
        -
        -		// clean up main element
        -		this.element
        -			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
        -			.removeAttr( "role" );
        -
        -		// clean up headers
        -		this.headers
        -			.removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " +
        -				"ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-expanded" )
        -			.removeAttr( "aria-selected" )
        -			.removeAttr( "aria-controls" )
        -			.removeAttr( "tabIndex" )
        -			.removeUniqueId();
        -
        -		this._destroyIcons();
        -
        -		// clean up content panels
        -		contents = this.headers.next()
        -			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " +
        -				"ui-accordion-content ui-accordion-content-active ui-state-disabled" )
        -			.css( "display", "" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-hidden" )
        -			.removeAttr( "aria-labelledby" )
        -			.removeUniqueId();
        -
        -		if ( this.options.heightStyle !== "content" ) {
        -			contents.css( "height", "" );
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "active" ) {
        -			// _activate() will handle invalid values and update this.options
        -			this._activate( value );
        -			return;
        -		}
        -
        -		if ( key === "event" ) {
        -			if ( this.options.event ) {
        -				this._off( this.headers, this.options.event );
        -			}
        -			this._setupEvents( value );
        -		}
        -
        -		this._super( key, value );
        -
        -		// setting collapsible: false while collapsed; open first panel
        -		if ( key === "collapsible" && !value && this.options.active === false ) {
        -			this._activate( 0 );
        -		}
        -
        -		if ( key === "icons" ) {
        -			this._destroyIcons();
        -			if ( value ) {
        -				this._createIcons();
        -			}
        -		}
        -
        -		// #5332 - opacity doesn't cascade to positioned elements in IE
        -		// so we need to add the disabled class to the headers and panels
        -		if ( key === "disabled" ) {
        -			this.element
        -				.toggleClass( "ui-state-disabled", !!value )
        -				.attr( "aria-disabled", value );
        -			this.headers.add( this.headers.next() )
        -				.toggleClass( "ui-state-disabled", !!value );
        -		}
        -	},
        -
        -	_keydown: function( event ) {
        -		if ( event.altKey || event.ctrlKey ) {
        -			return;
        -		}
        -
        -		var keyCode = $.ui.keyCode,
        -			length = this.headers.length,
        -			currentIndex = this.headers.index( event.target ),
        -			toFocus = false;
        -
        -		switch ( event.keyCode ) {
        -			case keyCode.RIGHT:
        -			case keyCode.DOWN:
        -				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
        -				break;
        -			case keyCode.LEFT:
        -			case keyCode.UP:
        -				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
        -				break;
        -			case keyCode.SPACE:
        -			case keyCode.ENTER:
        -				this._eventHandler( event );
        -				break;
        -			case keyCode.HOME:
        -				toFocus = this.headers[ 0 ];
        -				break;
        -			case keyCode.END:
        -				toFocus = this.headers[ length - 1 ];
        -				break;
        -		}
        -
        -		if ( toFocus ) {
        -			$( event.target ).attr( "tabIndex", -1 );
        -			$( toFocus ).attr( "tabIndex", 0 );
        -			toFocus.focus();
        -			event.preventDefault();
        -		}
        -	},
        -
        -	_panelKeyDown: function( event ) {
        -		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
        -			$( event.currentTarget ).prev().focus();
        -		}
        -	},
        -
        -	refresh: function() {
        -		var options = this.options;
        -		this._processPanels();
        -
        -		// was collapsed or no panel
        -		if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
        -			options.active = false;
        -			this.active = $();
        -		// active false only when collapsible is true
        -		} else if ( options.active === false ) {
        -			this._activate( 0 );
        -		// was active, but active panel is gone
        -		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        -			// all remaining panel are disabled
        -			if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
        -				options.active = false;
        -				this.active = $();
        -			// activate previous panel
        -			} else {
        -				this._activate( Math.max( 0, options.active - 1 ) );
        -			}
        -		// was active, active panel still exists
        -		} else {
        -			// make sure active index is correct
        -			options.active = this.headers.index( this.active );
        -		}
        -
        -		this._destroyIcons();
        -
        -		this._refresh();
        -	},
        -
        -	_processPanels: function() {
        -		var prevHeaders = this.headers,
        -			prevPanels = this.panels;
        -
        -		this.headers = this.element.find( this.options.header )
        -			.addClass( "ui-accordion-header ui-state-default ui-corner-all" );
        -
        -		this.panels = this.headers.next()
        -			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
        -			.filter( ":not(.ui-accordion-content-active)" )
        -			.hide();
        -
        -		// Avoid memory leaks (#10056)
        -		if ( prevPanels ) {
        -			this._off( prevHeaders.not( this.headers ) );
        -			this._off( prevPanels.not( this.panels ) );
        -		}
        -	},
        -
        -	_refresh: function() {
        -		var maxHeight,
        -			options = this.options,
        -			heightStyle = options.heightStyle,
        -			parent = this.element.parent();
        -
        -		this.active = this._findActive( options.active )
        -			.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
        -			.removeClass( "ui-corner-all" );
        -		this.active.next()
        -			.addClass( "ui-accordion-content-active" )
        -			.show();
        -
        -		this.headers
        -			.attr( "role", "tab" )
        -			.each(function() {
        -				var header = $( this ),
        -					headerId = header.uniqueId().attr( "id" ),
        -					panel = header.next(),
        -					panelId = panel.uniqueId().attr( "id" );
        -				header.attr( "aria-controls", panelId );
        -				panel.attr( "aria-labelledby", headerId );
        -			})
        -			.next()
        -				.attr( "role", "tabpanel" );
        -
        -		this.headers
        -			.not( this.active )
        -			.attr({
        -				"aria-selected": "false",
        -				"aria-expanded": "false",
        -				tabIndex: -1
        -			})
        -			.next()
        -				.attr({
        -					"aria-hidden": "true"
        -				})
        -				.hide();
        -
        -		// make sure at least one header is in the tab order
        -		if ( !this.active.length ) {
        -			this.headers.eq( 0 ).attr( "tabIndex", 0 );
        -		} else {
        -			this.active.attr({
        -				"aria-selected": "true",
        -				"aria-expanded": "true",
        -				tabIndex: 0
        -			})
        -			.next()
        -				.attr({
        -					"aria-hidden": "false"
        -				});
        -		}
        -
        -		this._createIcons();
        -
        -		this._setupEvents( options.event );
        -
        -		if ( heightStyle === "fill" ) {
        -			maxHeight = parent.height();
        -			this.element.siblings( ":visible" ).each(function() {
        -				var elem = $( this ),
        -					position = elem.css( "position" );
        -
        -				if ( position === "absolute" || position === "fixed" ) {
        -					return;
        -				}
        -				maxHeight -= elem.outerHeight( true );
        -			});
        -
        -			this.headers.each(function() {
        -				maxHeight -= $( this ).outerHeight( true );
        -			});
        -
        -			this.headers.next()
        -				.each(function() {
        -					$( this ).height( Math.max( 0, maxHeight -
        -						$( this ).innerHeight() + $( this ).height() ) );
        -				})
        -				.css( "overflow", "auto" );
        -		} else if ( heightStyle === "auto" ) {
        -			maxHeight = 0;
        -			this.headers.next()
        -				.each(function() {
        -					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
        -				})
        -				.height( maxHeight );
        -		}
        -	},
        -
        -	_activate: function( index ) {
        -		var active = this._findActive( index )[ 0 ];
        -
        -		// trying to activate the already active panel
        -		if ( active === this.active[ 0 ] ) {
        -			return;
        -		}
        -
        -		// trying to collapse, simulate a click on the currently active header
        -		active = active || this.active[ 0 ];
        -
        -		this._eventHandler({
        -			target: active,
        -			currentTarget: active,
        -			preventDefault: $.noop
        -		});
        -	},
        -
        -	_findActive: function( selector ) {
        -		return typeof selector === "number" ? this.headers.eq( selector ) : $();
        -	},
        -
        -	_setupEvents: function( event ) {
        -		var events = {
        -			keydown: "_keydown"
        -		};
        -		if ( event ) {
        -			$.each( event.split( " " ), function( index, eventName ) {
        -				events[ eventName ] = "_eventHandler";
        -			});
        -		}
        -
        -		this._off( this.headers.add( this.headers.next() ) );
        -		this._on( this.headers, events );
        -		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
        -		this._hoverable( this.headers );
        -		this._focusable( this.headers );
        -	},
        -
        -	_eventHandler: function( event ) {
        -		var options = this.options,
        -			active = this.active,
        -			clicked = $( event.currentTarget ),
        -			clickedIsActive = clicked[ 0 ] === active[ 0 ],
        -			collapsing = clickedIsActive && options.collapsible,
        -			toShow = collapsing ? $() : clicked.next(),
        -			toHide = active.next(),
        -			eventData = {
        -				oldHeader: active,
        -				oldPanel: toHide,
        -				newHeader: collapsing ? $() : clicked,
        -				newPanel: toShow
        -			};
        -
        -		event.preventDefault();
        -
        -		if (
        -				// click on active header, but not collapsible
        -				( clickedIsActive && !options.collapsible ) ||
        -				// allow canceling activation
        -				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        -			return;
        -		}
        -
        -		options.active = collapsing ? false : this.headers.index( clicked );
        -
        -		// when the call to ._toggle() comes after the class changes
        -		// it causes a very odd bug in IE 8 (see #6720)
        -		this.active = clickedIsActive ? $() : clicked;
        -		this._toggle( eventData );
        -
        -		// switch classes
        -		// corner classes on the previously active header stay after the animation
        -		active.removeClass( "ui-accordion-header-active ui-state-active" );
        -		if ( options.icons ) {
        -			active.children( ".ui-accordion-header-icon" )
        -				.removeClass( options.icons.activeHeader )
        -				.addClass( options.icons.header );
        -		}
        -
        -		if ( !clickedIsActive ) {
        -			clicked
        -				.removeClass( "ui-corner-all" )
        -				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
        -			if ( options.icons ) {
        -				clicked.children( ".ui-accordion-header-icon" )
        -					.removeClass( options.icons.header )
        -					.addClass( options.icons.activeHeader );
        -			}
        -
        -			clicked
        -				.next()
        -				.addClass( "ui-accordion-content-active" );
        -		}
        -	},
        -
        -	_toggle: function( data ) {
        -		var toShow = data.newPanel,
        -			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
        -
        -		// handle activating a panel during the animation for another activation
        -		this.prevShow.add( this.prevHide ).stop( true, true );
        -		this.prevShow = toShow;
        -		this.prevHide = toHide;
        -
        -		if ( this.options.animate ) {
        -			this._animate( toShow, toHide, data );
        -		} else {
        -			toHide.hide();
        -			toShow.show();
        -			this._toggleComplete( data );
        -		}
        -
        -		toHide.attr({
        -			"aria-hidden": "true"
        -		});
        -		toHide.prev().attr({
        -			"aria-selected": "false",
        -			"aria-expanded": "false"
        -		});
        -		// if we're switching panels, remove the old header from the tab order
        -		// if we're opening from collapsed state, remove the previous header from the tab order
        -		// if we're collapsing, then keep the collapsing header in the tab order
        -		if ( toShow.length && toHide.length ) {
        -			toHide.prev().attr({
        -				"tabIndex": -1,
        -				"aria-expanded": "false"
        -			});
        -		} else if ( toShow.length ) {
        -			this.headers.filter(function() {
        -				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
        -			})
        -			.attr( "tabIndex", -1 );
        -		}
        -
        -		toShow
        -			.attr( "aria-hidden", "false" )
        -			.prev()
        -				.attr({
        -					"aria-selected": "true",
        -					"aria-expanded": "true",
        -					tabIndex: 0
        -				});
        -	},
        -
        -	_animate: function( toShow, toHide, data ) {
        -		var total, easing, duration,
        -			that = this,
        -			adjust = 0,
        -			boxSizing = toShow.css( "box-sizing" ),
        -			down = toShow.length &&
        -				( !toHide.length || ( toShow.index() < toHide.index() ) ),
        -			animate = this.options.animate || {},
        -			options = down && animate.down || animate,
        -			complete = function() {
        -				that._toggleComplete( data );
        -			};
        -
        -		if ( typeof options === "number" ) {
        -			duration = options;
        -		}
        -		if ( typeof options === "string" ) {
        -			easing = options;
        -		}
        -		// fall back from options to animation in case of partial down settings
        -		easing = easing || options.easing || animate.easing;
        -		duration = duration || options.duration || animate.duration;
        -
        -		if ( !toHide.length ) {
        -			return toShow.animate( this.showProps, duration, easing, complete );
        -		}
        -		if ( !toShow.length ) {
        -			return toHide.animate( this.hideProps, duration, easing, complete );
        -		}
        -
        -		total = toShow.show().outerHeight();
        -		toHide.animate( this.hideProps, {
        -			duration: duration,
        -			easing: easing,
        -			step: function( now, fx ) {
        -				fx.now = Math.round( now );
        -			}
        -		});
        -		toShow
        -			.hide()
        -			.animate( this.showProps, {
        -				duration: duration,
        -				easing: easing,
        -				complete: complete,
        -				step: function( now, fx ) {
        -					fx.now = Math.round( now );
        -					if ( fx.prop !== "height" ) {
        -						if ( boxSizing === "content-box" ) {
        -							adjust += fx.now;
        -						}
        -					} else if ( that.options.heightStyle !== "content" ) {
        -						fx.now = Math.round( total - toHide.outerHeight() - adjust );
        -						adjust = 0;
        -					}
        -				}
        -			});
        -	},
        -
        -	_toggleComplete: function( data ) {
        -		var toHide = data.oldPanel;
        -
        -		toHide
        -			.removeClass( "ui-accordion-content-active" )
        -			.prev()
        -				.removeClass( "ui-corner-top" )
        -				.addClass( "ui-corner-all" );
        -
        -		// Work around for rendering bug in IE (#5421)
        -		if ( toHide.length ) {
        -			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
        -		}
        -		this._trigger( "activate", null, data );
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Menu 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/menu/
        - */
        -
        -
        -var menu = $.widget( "ui.menu", {
        -	version: "1.11.4",
        -	defaultElement: "<ul>",
        -	delay: 300,
        -	options: {
        -		icons: {
        -			submenu: "ui-icon-carat-1-e"
        -		},
        -		items: "> *",
        -		menus: "ul",
        -		position: {
        -			my: "left-1 top",
        -			at: "right top"
        -		},
        -		role: "menu",
        -
        -		// callbacks
        -		blur: null,
        -		focus: null,
        -		select: null
        -	},
        -
        -	_create: function() {
        -		this.activeMenu = this.element;
        -
        -		// Flag used to prevent firing of the click handler
        -		// as the event bubbles up through nested menus
        -		this.mouseHandled = false;
        -		this.element
        -			.uniqueId()
        -			.addClass( "ui-menu ui-widget ui-widget-content" )
        -			.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
        -			.attr({
        -				role: this.options.role,
        -				tabIndex: 0
        -			});
        -
        -		if ( this.options.disabled ) {
        -			this.element
        -				.addClass( "ui-state-disabled" )
        -				.attr( "aria-disabled", "true" );
        -		}
        -
        -		this._on({
        -			// Prevent focus from sticking to links inside menu after clicking
        -			// them (focus should always stay on UL during navigation).
        -			"mousedown .ui-menu-item": function( event ) {
        -				event.preventDefault();
        -			},
        -			"click .ui-menu-item": function( event ) {
        -				var target = $( event.target );
        -				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
        -					this.select( event );
        -
        -					// Only set the mouseHandled flag if the event will bubble, see #9469.
        -					if ( !event.isPropagationStopped() ) {
        -						this.mouseHandled = true;
        -					}
        -
        -					// Open submenu on click
        -					if ( target.has( ".ui-menu" ).length ) {
        -						this.expand( event );
        -					} else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
        -
        -						// Redirect focus to the menu
        -						this.element.trigger( "focus", [ true ] );
        -
        -						// If the active item is on the top level, let it stay active.
        -						// Otherwise, blur the active item since it is no longer visible.
        -						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
        -							clearTimeout( this.timer );
        -						}
        -					}
        -				}
        -			},
        -			"mouseenter .ui-menu-item": function( event ) {
        -				// Ignore mouse events while typeahead is active, see #10458.
        -				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
        -				// is over an item in the menu
        -				if ( this.previousFilter ) {
        -					return;
        -				}
        -				var target = $( event.currentTarget );
        -				// Remove ui-state-active class from siblings of the newly focused menu item
        -				// to avoid a jump caused by adjacent elements both having a class with a border
        -				target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" );
        -				this.focus( event, target );
        -			},
        -			mouseleave: "collapseAll",
        -			"mouseleave .ui-menu": "collapseAll",
        -			focus: function( event, keepActiveItem ) {
        -				// If there's already an active item, keep it active
        -				// If not, activate the first item
        -				var item = this.active || this.element.find( this.options.items ).eq( 0 );
        -
        -				if ( !keepActiveItem ) {
        -					this.focus( event, item );
        -				}
        -			},
        -			blur: function( event ) {
        -				this._delay(function() {
        -					if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
        -						this.collapseAll( event );
        -					}
        -				});
        -			},
        -			keydown: "_keydown"
        -		});
        -
        -		this.refresh();
        -
        -		// Clicks outside of a menu collapse any open menus
        -		this._on( this.document, {
        -			click: function( event ) {
        -				if ( this._closeOnDocumentClick( event ) ) {
        -					this.collapseAll( event );
        -				}
        -
        -				// Reset the mouseHandled flag
        -				this.mouseHandled = false;
        -			}
        -		});
        -	},
        -
        -	_destroy: function() {
        -		// Destroy (sub)menus
        -		this.element
        -			.removeAttr( "aria-activedescendant" )
        -			.find( ".ui-menu" ).addBack()
        -				.removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
        -				.removeAttr( "role" )
        -				.removeAttr( "tabIndex" )
        -				.removeAttr( "aria-labelledby" )
        -				.removeAttr( "aria-expanded" )
        -				.removeAttr( "aria-hidden" )
        -				.removeAttr( "aria-disabled" )
        -				.removeUniqueId()
        -				.show();
        -
        -		// Destroy menu items
        -		this.element.find( ".ui-menu-item" )
        -			.removeClass( "ui-menu-item" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-disabled" )
        -			.removeUniqueId()
        -			.removeClass( "ui-state-hover" )
        -			.removeAttr( "tabIndex" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-haspopup" )
        -			.children().each( function() {
        -				var elem = $( this );
        -				if ( elem.data( "ui-menu-submenu-carat" ) ) {
        -					elem.remove();
        -				}
        -			});
        -
        -		// Destroy menu dividers
        -		this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
        -	},
        -
        -	_keydown: function( event ) {
        -		var match, prev, character, skip,
        -			preventDefault = true;
        -
        -		switch ( event.keyCode ) {
        -		case $.ui.keyCode.PAGE_UP:
        -			this.previousPage( event );
        -			break;
        -		case $.ui.keyCode.PAGE_DOWN:
        -			this.nextPage( event );
        -			break;
        -		case $.ui.keyCode.HOME:
        -			this._move( "first", "first", event );
        -			break;
        -		case $.ui.keyCode.END:
        -			this._move( "last", "last", event );
        -			break;
        -		case $.ui.keyCode.UP:
        -			this.previous( event );
        -			break;
        -		case $.ui.keyCode.DOWN:
        -			this.next( event );
        -			break;
        -		case $.ui.keyCode.LEFT:
        -			this.collapse( event );
        -			break;
        -		case $.ui.keyCode.RIGHT:
        -			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
        -				this.expand( event );
        -			}
        -			break;
        -		case $.ui.keyCode.ENTER:
        -		case $.ui.keyCode.SPACE:
        -			this._activate( event );
        -			break;
        -		case $.ui.keyCode.ESCAPE:
        -			this.collapse( event );
        -			break;
        -		default:
        -			preventDefault = false;
        -			prev = this.previousFilter || "";
        -			character = String.fromCharCode( event.keyCode );
        -			skip = false;
        -
        -			clearTimeout( this.filterTimer );
        -
        -			if ( character === prev ) {
        -				skip = true;
        -			} else {
        -				character = prev + character;
        -			}
        -
        -			match = this._filterMenuItems( character );
        -			match = skip && match.index( this.active.next() ) !== -1 ?
        -				this.active.nextAll( ".ui-menu-item" ) :
        -				match;
        -
        -			// If no matches on the current filter, reset to the last character pressed
        -			// to move down the menu to the first item that starts with that character
        -			if ( !match.length ) {
        -				character = String.fromCharCode( event.keyCode );
        -				match = this._filterMenuItems( character );
        -			}
        -
        -			if ( match.length ) {
        -				this.focus( event, match );
        -				this.previousFilter = character;
        -				this.filterTimer = this._delay(function() {
        -					delete this.previousFilter;
        -				}, 1000 );
        -			} else {
        -				delete this.previousFilter;
        -			}
        -		}
        -
        -		if ( preventDefault ) {
        -			event.preventDefault();
        -		}
        -	},
        -
        -	_activate: function( event ) {
        -		if ( !this.active.is( ".ui-state-disabled" ) ) {
        -			if ( this.active.is( "[aria-haspopup='true']" ) ) {
        -				this.expand( event );
        -			} else {
        -				this.select( event );
        -			}
        -		}
        -	},
        -
        -	refresh: function() {
        -		var menus, items,
        -			that = this,
        -			icon = this.options.icons.submenu,
        -			submenus = this.element.find( this.options.menus );
        -
        -		this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
        -
        -		// Initialize nested menus
        -		submenus.filter( ":not(.ui-menu)" )
        -			.addClass( "ui-menu ui-widget ui-widget-content ui-front" )
        -			.hide()
        -			.attr({
        -				role: this.options.role,
        -				"aria-hidden": "true",
        -				"aria-expanded": "false"
        -			})
        -			.each(function() {
        -				var menu = $( this ),
        -					item = menu.parent(),
        -					submenuCarat = $( "<span>" )
        -						.addClass( "ui-menu-icon ui-icon " + icon )
        -						.data( "ui-menu-submenu-carat", true );
        -
        -				item
        -					.attr( "aria-haspopup", "true" )
        -					.prepend( submenuCarat );
        -				menu.attr( "aria-labelledby", item.attr( "id" ) );
        -			});
        -
        -		menus = submenus.add( this.element );
        -		items = menus.find( this.options.items );
        -
        -		// Initialize menu-items containing spaces and/or dashes only as dividers
        -		items.not( ".ui-menu-item" ).each(function() {
        -			var item = $( this );
        -			if ( that._isDivider( item ) ) {
        -				item.addClass( "ui-widget-content ui-menu-divider" );
        -			}
        -		});
        -
        -		// Don't refresh list items that are already adapted
        -		items.not( ".ui-menu-item, .ui-menu-divider" )
        -			.addClass( "ui-menu-item" )
        -			.uniqueId()
        -			.attr({
        -				tabIndex: -1,
        -				role: this._itemRole()
        -			});
        -
        -		// Add aria-disabled attribute to any disabled menu item
        -		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
        -
        -		// If the active item has been removed, blur the menu
        -		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        -			this.blur();
        -		}
        -	},
        -
        -	_itemRole: function() {
        -		return {
        -			menu: "menuitem",
        -			listbox: "option"
        -		}[ this.options.role ];
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "icons" ) {
        -			this.element.find( ".ui-menu-icon" )
        -				.removeClass( this.options.icons.submenu )
        -				.addClass( value.submenu );
        -		}
        -		if ( key === "disabled" ) {
        -			this.element
        -				.toggleClass( "ui-state-disabled", !!value )
        -				.attr( "aria-disabled", value );
        -		}
        -		this._super( key, value );
        -	},
        -
        -	focus: function( event, item ) {
        -		var nested, focused;
        -		this.blur( event, event && event.type === "focus" );
        -
        -		this._scrollIntoView( item );
        -
        -		this.active = item.first();
        -		focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" );
        -		// Only update aria-activedescendant if there's a role
        -		// otherwise we assume focus is managed elsewhere
        -		if ( this.options.role ) {
        -			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
        -		}
        -
        -		// Highlight active parent menu item, if any
        -		this.active
        -			.parent()
        -			.closest( ".ui-menu-item" )
        -			.addClass( "ui-state-active" );
        -
        -		if ( event && event.type === "keydown" ) {
        -			this._close();
        -		} else {
        -			this.timer = this._delay(function() {
        -				this._close();
        -			}, this.delay );
        -		}
        -
        -		nested = item.children( ".ui-menu" );
        -		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
        -			this._startOpening(nested);
        -		}
        -		this.activeMenu = item.parent();
        -
        -		this._trigger( "focus", event, { item: item } );
        -	},
        -
        -	_scrollIntoView: function( item ) {
        -		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
        -		if ( this._hasScroll() ) {
        -			borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
        -			paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
        -			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
        -			scroll = this.activeMenu.scrollTop();
        -			elementHeight = this.activeMenu.height();
        -			itemHeight = item.outerHeight();
        -
        -			if ( offset < 0 ) {
        -				this.activeMenu.scrollTop( scroll + offset );
        -			} else if ( offset + itemHeight > elementHeight ) {
        -				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
        -			}
        -		}
        -	},
        -
        -	blur: function( event, fromFocus ) {
        -		if ( !fromFocus ) {
        -			clearTimeout( this.timer );
        -		}
        -
        -		if ( !this.active ) {
        -			return;
        -		}
        -
        -		this.active.removeClass( "ui-state-focus" );
        -		this.active = null;
        -
        -		this._trigger( "blur", event, { item: this.active } );
        -	},
        -
        -	_startOpening: function( submenu ) {
        -		clearTimeout( this.timer );
        -
        -		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
        -		// shift in the submenu position when mousing over the carat icon
        -		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
        -			return;
        -		}
        -
        -		this.timer = this._delay(function() {
        -			this._close();
        -			this._open( submenu );
        -		}, this.delay );
        -	},
        -
        -	_open: function( submenu ) {
        -		var position = $.extend({
        -			of: this.active
        -		}, this.options.position );
        -
        -		clearTimeout( this.timer );
        -		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
        -			.hide()
        -			.attr( "aria-hidden", "true" );
        -
        -		submenu
        -			.show()
        -			.removeAttr( "aria-hidden" )
        -			.attr( "aria-expanded", "true" )
        -			.position( position );
        -	},
        -
        -	collapseAll: function( event, all ) {
        -		clearTimeout( this.timer );
        -		this.timer = this._delay(function() {
        -			// If we were passed an event, look for the submenu that contains the event
        -			var currentMenu = all ? this.element :
        -				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
        -
        -			// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
        -			if ( !currentMenu.length ) {
        -				currentMenu = this.element;
        -			}
        -
        -			this._close( currentMenu );
        -
        -			this.blur( event );
        -			this.activeMenu = currentMenu;
        -		}, this.delay );
        -	},
        -
        -	// With no arguments, closes the currently active menu - if nothing is active
        -	// it closes all menus.  If passed an argument, it will search for menus BELOW
        -	_close: function( startMenu ) {
        -		if ( !startMenu ) {
        -			startMenu = this.active ? this.active.parent() : this.element;
        -		}
        -
        -		startMenu
        -			.find( ".ui-menu" )
        -				.hide()
        -				.attr( "aria-hidden", "true" )
        -				.attr( "aria-expanded", "false" )
        -			.end()
        -			.find( ".ui-state-active" ).not( ".ui-state-focus" )
        -				.removeClass( "ui-state-active" );
        -	},
        -
        -	_closeOnDocumentClick: function( event ) {
        -		return !$( event.target ).closest( ".ui-menu" ).length;
        -	},
        -
        -	_isDivider: function( item ) {
        -
        -		// Match hyphen, em dash, en dash
        -		return !/[^\-\u2014\u2013\s]/.test( item.text() );
        -	},
        -
        -	collapse: function( event ) {
        -		var newItem = this.active &&
        -			this.active.parent().closest( ".ui-menu-item", this.element );
        -		if ( newItem && newItem.length ) {
        -			this._close();
        -			this.focus( event, newItem );
        -		}
        -	},
        -
        -	expand: function( event ) {
        -		var newItem = this.active &&
        -			this.active
        -				.children( ".ui-menu " )
        -				.find( this.options.items )
        -				.first();
        -
        -		if ( newItem && newItem.length ) {
        -			this._open( newItem.parent() );
        -
        -			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
        -			this._delay(function() {
        -				this.focus( event, newItem );
        -			});
        -		}
        -	},
        -
        -	next: function( event ) {
        -		this._move( "next", "first", event );
        -	},
        -
        -	previous: function( event ) {
        -		this._move( "prev", "last", event );
        -	},
        -
        -	isFirstItem: function() {
        -		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
        -	},
        -
        -	isLastItem: function() {
        -		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
        -	},
        -
        -	_move: function( direction, filter, event ) {
        -		var next;
        -		if ( this.active ) {
        -			if ( direction === "first" || direction === "last" ) {
        -				next = this.active
        -					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
        -					.eq( -1 );
        -			} else {
        -				next = this.active
        -					[ direction + "All" ]( ".ui-menu-item" )
        -					.eq( 0 );
        -			}
        -		}
        -		if ( !next || !next.length || !this.active ) {
        -			next = this.activeMenu.find( this.options.items )[ filter ]();
        -		}
        -
        -		this.focus( event, next );
        -	},
        -
        -	nextPage: function( event ) {
        -		var item, base, height;
        -
        -		if ( !this.active ) {
        -			this.next( event );
        -			return;
        -		}
        -		if ( this.isLastItem() ) {
        -			return;
        -		}
        -		if ( this._hasScroll() ) {
        -			base = this.active.offset().top;
        -			height = this.element.height();
        -			this.active.nextAll( ".ui-menu-item" ).each(function() {
        -				item = $( this );
        -				return item.offset().top - base - height < 0;
        -			});
        -
        -			this.focus( event, item );
        -		} else {
        -			this.focus( event, this.activeMenu.find( this.options.items )
        -				[ !this.active ? "first" : "last" ]() );
        -		}
        -	},
        -
        -	previousPage: function( event ) {
        -		var item, base, height;
        -		if ( !this.active ) {
        -			this.next( event );
        -			return;
        -		}
        -		if ( this.isFirstItem() ) {
        -			return;
        -		}
        -		if ( this._hasScroll() ) {
        -			base = this.active.offset().top;
        -			height = this.element.height();
        -			this.active.prevAll( ".ui-menu-item" ).each(function() {
        -				item = $( this );
        -				return item.offset().top - base + height > 0;
        -			});
        -
        -			this.focus( event, item );
        -		} else {
        -			this.focus( event, this.activeMenu.find( this.options.items ).first() );
        -		}
        -	},
        -
        -	_hasScroll: function() {
        -		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
        -	},
        -
        -	select: function( event ) {
        -		// TODO: It should never be possible to not have an active item at this
        -		// point, but the tests don't trigger mouseenter before click.
        -		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
        -		var ui = { item: this.active };
        -		if ( !this.active.has( ".ui-menu" ).length ) {
        -			this.collapseAll( event, true );
        -		}
        -		this._trigger( "select", event, ui );
        -	},
        -
        -	_filterMenuItems: function(character) {
        -		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
        -			regex = new RegExp( "^" + escapedCharacter, "i" );
        -
        -		return this.activeMenu
        -			.find( this.options.items )
        -
        -			// Only match on items, not dividers or other content (#10571)
        -			.filter( ".ui-menu-item" )
        -			.filter(function() {
        -				return regex.test( $.trim( $( this ).text() ) );
        -			});
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Autocomplete 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/autocomplete/
        - */
        -
        -
        -$.widget( "ui.autocomplete", {
        -	version: "1.11.4",
        -	defaultElement: "<input>",
        -	options: {
        -		appendTo: null,
        -		autoFocus: false,
        -		delay: 300,
        -		minLength: 1,
        -		position: {
        -			my: "left top",
        -			at: "left bottom",
        -			collision: "none"
        -		},
        -		source: null,
        -
        -		// callbacks
        -		change: null,
        -		close: null,
        -		focus: null,
        -		open: null,
        -		response: null,
        -		search: null,
        -		select: null
        -	},
        -
        -	requestIndex: 0,
        -	pending: 0,
        -
        -	_create: function() {
        -		// Some browsers only repeat keydown events, not keypress events,
        -		// so we use the suppressKeyPress flag to determine if we've already
        -		// handled the keydown event. #7269
        -		// Unfortunately the code for & in keypress is the same as the up arrow,
        -		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
        -		// events when we know the keydown event was used to modify the
        -		// search term. #7799
        -		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
        -			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
        -			isTextarea = nodeName === "textarea",
        -			isInput = nodeName === "input";
        -
        -		this.isMultiLine =
        -			// Textareas are always multi-line
        -			isTextarea ? true :
        -			// Inputs are always single-line, even if inside a contentEditable element
        -			// IE also treats inputs as contentEditable
        -			isInput ? false :
        -			// All other element types are determined by whether or not they're contentEditable
        -			this.element.prop( "isContentEditable" );
        -
        -		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
        -		this.isNewMenu = true;
        -
        -		this.element
        -			.addClass( "ui-autocomplete-input" )
        -			.attr( "autocomplete", "off" );
        -
        -		this._on( this.element, {
        -			keydown: function( event ) {
        -				if ( this.element.prop( "readOnly" ) ) {
        -					suppressKeyPress = true;
        -					suppressInput = true;
        -					suppressKeyPressRepeat = true;
        -					return;
        -				}
        -
        -				suppressKeyPress = false;
        -				suppressInput = false;
        -				suppressKeyPressRepeat = false;
        -				var keyCode = $.ui.keyCode;
        -				switch ( event.keyCode ) {
        -				case keyCode.PAGE_UP:
        -					suppressKeyPress = true;
        -					this._move( "previousPage", event );
        -					break;
        -				case keyCode.PAGE_DOWN:
        -					suppressKeyPress = true;
        -					this._move( "nextPage", event );
        -					break;
        -				case keyCode.UP:
        -					suppressKeyPress = true;
        -					this._keyEvent( "previous", event );
        -					break;
        -				case keyCode.DOWN:
        -					suppressKeyPress = true;
        -					this._keyEvent( "next", event );
        -					break;
        -				case keyCode.ENTER:
        -					// when menu is open and has focus
        -					if ( this.menu.active ) {
        -						// #6055 - Opera still allows the keypress to occur
        -						// which causes forms to submit
        -						suppressKeyPress = true;
        -						event.preventDefault();
        -						this.menu.select( event );
        -					}
        -					break;
        -				case keyCode.TAB:
        -					if ( this.menu.active ) {
        -						this.menu.select( event );
        -					}
        -					break;
        -				case keyCode.ESCAPE:
        -					if ( this.menu.element.is( ":visible" ) ) {
        -						if ( !this.isMultiLine ) {
        -							this._value( this.term );
        -						}
        -						this.close( event );
        -						// Different browsers have different default behavior for escape
        -						// Single press can mean undo or clear
        -						// Double press in IE means clear the whole form
        -						event.preventDefault();
        -					}
        -					break;
        -				default:
        -					suppressKeyPressRepeat = true;
        -					// search timeout should be triggered before the input value is changed
        -					this._searchTimeout( event );
        -					break;
        -				}
        -			},
        -			keypress: function( event ) {
        -				if ( suppressKeyPress ) {
        -					suppressKeyPress = false;
        -					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        -						event.preventDefault();
        -					}
        -					return;
        -				}
        -				if ( suppressKeyPressRepeat ) {
        -					return;
        -				}
        -
        -				// replicate some key handlers to allow them to repeat in Firefox and Opera
        -				var keyCode = $.ui.keyCode;
        -				switch ( event.keyCode ) {
        -				case keyCode.PAGE_UP:
        -					this._move( "previousPage", event );
        -					break;
        -				case keyCode.PAGE_DOWN:
        -					this._move( "nextPage", event );
        -					break;
        -				case keyCode.UP:
        -					this._keyEvent( "previous", event );
        -					break;
        -				case keyCode.DOWN:
        -					this._keyEvent( "next", event );
        -					break;
        -				}
        -			},
        -			input: function( event ) {
        -				if ( suppressInput ) {
        -					suppressInput = false;
        -					event.preventDefault();
        -					return;
        -				}
        -				this._searchTimeout( event );
        -			},
        -			focus: function() {
        -				this.selectedItem = null;
        -				this.previous = this._value();
        -			},
        -			blur: function( event ) {
        -				if ( this.cancelBlur ) {
        -					delete this.cancelBlur;
        -					return;
        -				}
        -
        -				clearTimeout( this.searching );
        -				this.close( event );
        -				this._change( event );
        -			}
        -		});
        -
        -		this._initSource();
        -		this.menu = $( "<ul>" )
        -			.addClass( "ui-autocomplete ui-front" )
        -			.appendTo( this._appendTo() )
        -			.menu({
        -				// disable ARIA support, the live region takes care of that
        -				role: null
        -			})
        -			.hide()
        -			.menu( "instance" );
        -
        -		this._on( this.menu.element, {
        -			mousedown: function( event ) {
        -				// prevent moving focus out of the text field
        -				event.preventDefault();
        -
        -				// IE doesn't prevent moving focus even with event.preventDefault()
        -				// so we set a flag to know when we should ignore the blur event
        -				this.cancelBlur = true;
        -				this._delay(function() {
        -					delete this.cancelBlur;
        -				});
        -
        -				// clicking on the scrollbar causes focus to shift to the body
        -				// but we can't detect a mouseup or a click immediately afterward
        -				// so we have to track the next mousedown and close the menu if
        -				// the user clicks somewhere outside of the autocomplete
        -				var menuElement = this.menu.element[ 0 ];
        -				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
        -					this._delay(function() {
        -						var that = this;
        -						this.document.one( "mousedown", function( event ) {
        -							if ( event.target !== that.element[ 0 ] &&
        -									event.target !== menuElement &&
        -									!$.contains( menuElement, event.target ) ) {
        -								that.close();
        -							}
        -						});
        -					});
        -				}
        -			},
        -			menufocus: function( event, ui ) {
        -				var label, item;
        -				// support: Firefox
        -				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
        -				if ( this.isNewMenu ) {
        -					this.isNewMenu = false;
        -					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
        -						this.menu.blur();
        -
        -						this.document.one( "mousemove", function() {
        -							$( event.target ).trigger( event.originalEvent );
        -						});
        -
        -						return;
        -					}
        -				}
        -
        -				item = ui.item.data( "ui-autocomplete-item" );
        -				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
        -					// use value to match what will end up in the input, if it was a key event
        -					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
        -						this._value( item.value );
        -					}
        -				}
        -
        -				// Announce the value in the liveRegion
        -				label = ui.item.attr( "aria-label" ) || item.value;
        -				if ( label && $.trim( label ).length ) {
        -					this.liveRegion.children().hide();
        -					$( "<div>" ).text( label ).appendTo( this.liveRegion );
        -				}
        -			},
        -			menuselect: function( event, ui ) {
        -				var item = ui.item.data( "ui-autocomplete-item" ),
        -					previous = this.previous;
        -
        -				// only trigger when focus was lost (click on menu)
        -				if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
        -					this.element.focus();
        -					this.previous = previous;
        -					// #6109 - IE triggers two focus events and the second
        -					// is asynchronous, so we need to reset the previous
        -					// term synchronously and asynchronously :-(
        -					this._delay(function() {
        -						this.previous = previous;
        -						this.selectedItem = item;
        -					});
        -				}
        -
        -				if ( false !== this._trigger( "select", event, { item: item } ) ) {
        -					this._value( item.value );
        -				}
        -				// reset the term after the select event
        -				// this allows custom select handling to work properly
        -				this.term = this._value();
        -
        -				this.close( event );
        -				this.selectedItem = item;
        -			}
        -		});
        -
        -		this.liveRegion = $( "<span>", {
        -				role: "status",
        -				"aria-live": "assertive",
        -				"aria-relevant": "additions"
        -			})
        -			.addClass( "ui-helper-hidden-accessible" )
        -			.appendTo( this.document[ 0 ].body );
        -
        -		// turning off autocomplete prevents the browser from remembering the
        -		// value when navigating through history, so we re-enable autocomplete
        -		// if the page is unloaded before the widget is destroyed. #7790
        -		this._on( this.window, {
        -			beforeunload: function() {
        -				this.element.removeAttr( "autocomplete" );
        -			}
        -		});
        -	},
        -
        -	_destroy: function() {
        -		clearTimeout( this.searching );
        -		this.element
        -			.removeClass( "ui-autocomplete-input" )
        -			.removeAttr( "autocomplete" );
        -		this.menu.element.remove();
        -		this.liveRegion.remove();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -		if ( key === "source" ) {
        -			this._initSource();
        -		}
        -		if ( key === "appendTo" ) {
        -			this.menu.element.appendTo( this._appendTo() );
        -		}
        -		if ( key === "disabled" && value && this.xhr ) {
        -			this.xhr.abort();
        -		}
        -	},
        -
        -	_appendTo: function() {
        -		var element = this.options.appendTo;
        -
        -		if ( element ) {
        -			element = element.jquery || element.nodeType ?
        -				$( element ) :
        -				this.document.find( element ).eq( 0 );
        -		}
        -
        -		if ( !element || !element[ 0 ] ) {
        -			element = this.element.closest( ".ui-front" );
        -		}
        -
        -		if ( !element.length ) {
        -			element = this.document[ 0 ].body;
        -		}
        -
        -		return element;
        -	},
        -
        -	_initSource: function() {
        -		var array, url,
        -			that = this;
        -		if ( $.isArray( this.options.source ) ) {
        -			array = this.options.source;
        -			this.source = function( request, response ) {
        -				response( $.ui.autocomplete.filter( array, request.term ) );
        -			};
        -		} else if ( typeof this.options.source === "string" ) {
        -			url = this.options.source;
        -			this.source = function( request, response ) {
        -				if ( that.xhr ) {
        -					that.xhr.abort();
        -				}
        -				that.xhr = $.ajax({
        -					url: url,
        -					data: request,
        -					dataType: "json",
        -					success: function( data ) {
        -						response( data );
        -					},
        -					error: function() {
        -						response([]);
        -					}
        -				});
        -			};
        -		} else {
        -			this.source = this.options.source;
        -		}
        -	},
        -
        -	_searchTimeout: function( event ) {
        -		clearTimeout( this.searching );
        -		this.searching = this._delay(function() {
        -
        -			// Search if the value has changed, or if the user retypes the same value (see #7434)
        -			var equalValues = this.term === this._value(),
        -				menuVisible = this.menu.element.is( ":visible" ),
        -				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
        -
        -			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
        -				this.selectedItem = null;
        -				this.search( null, event );
        -			}
        -		}, this.options.delay );
        -	},
        -
        -	search: function( value, event ) {
        -		value = value != null ? value : this._value();
        -
        -		// always save the actual value, not the one passed as an argument
        -		this.term = this._value();
        -
        -		if ( value.length < this.options.minLength ) {
        -			return this.close( event );
        -		}
        -
        -		if ( this._trigger( "search", event ) === false ) {
        -			return;
        -		}
        -
        -		return this._search( value );
        -	},
        -
        -	_search: function( value ) {
        -		this.pending++;
        -		this.element.addClass( "ui-autocomplete-loading" );
        -		this.cancelSearch = false;
        -
        -		this.source( { term: value }, this._response() );
        -	},
        -
        -	_response: function() {
        -		var index = ++this.requestIndex;
        -
        -		return $.proxy(function( content ) {
        -			if ( index === this.requestIndex ) {
        -				this.__response( content );
        -			}
        -
        -			this.pending--;
        -			if ( !this.pending ) {
        -				this.element.removeClass( "ui-autocomplete-loading" );
        -			}
        -		}, this );
        -	},
        -
        -	__response: function( content ) {
        -		if ( content ) {
        -			content = this._normalize( content );
        -		}
        -		this._trigger( "response", null, { content: content } );
        -		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
        -			this._suggest( content );
        -			this._trigger( "open" );
        -		} else {
        -			// use ._close() instead of .close() so we don't cancel future searches
        -			this._close();
        -		}
        -	},
        -
        -	close: function( event ) {
        -		this.cancelSearch = true;
        -		this._close( event );
        -	},
        -
        -	_close: function( event ) {
        -		if ( this.menu.element.is( ":visible" ) ) {
        -			this.menu.element.hide();
        -			this.menu.blur();
        -			this.isNewMenu = true;
        -			this._trigger( "close", event );
        -		}
        -	},
        -
        -	_change: function( event ) {
        -		if ( this.previous !== this._value() ) {
        -			this._trigger( "change", event, { item: this.selectedItem } );
        -		}
        -	},
        -
        -	_normalize: function( items ) {
        -		// assume all items have the right format when the first item is complete
        -		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
        -			return items;
        -		}
        -		return $.map( items, function( item ) {
        -			if ( typeof item === "string" ) {
        -				return {
        -					label: item,
        -					value: item
        -				};
        -			}
        -			return $.extend( {}, item, {
        -				label: item.label || item.value,
        -				value: item.value || item.label
        -			});
        -		});
        -	},
        -
        -	_suggest: function( items ) {
        -		var ul = this.menu.element.empty();
        -		this._renderMenu( ul, items );
        -		this.isNewMenu = true;
        -		this.menu.refresh();
        -
        -		// size and position menu
        -		ul.show();
        -		this._resizeMenu();
        -		ul.position( $.extend({
        -			of: this.element
        -		}, this.options.position ) );
        -
        -		if ( this.options.autoFocus ) {
        -			this.menu.next();
        -		}
        -	},
        -
        -	_resizeMenu: function() {
        -		var ul = this.menu.element;
        -		ul.outerWidth( Math.max(
        -			// Firefox wraps long text (possibly a rounding bug)
        -			// so we add 1px to avoid the wrapping (#7513)
        -			ul.width( "" ).outerWidth() + 1,
        -			this.element.outerWidth()
        -		) );
        -	},
        -
        -	_renderMenu: function( ul, items ) {
        -		var that = this;
        -		$.each( items, function( index, item ) {
        -			that._renderItemData( ul, item );
        -		});
        -	},
        -
        -	_renderItemData: function( ul, item ) {
        -		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
        -	},
        -
        -	_renderItem: function( ul, item ) {
        -		return $( "<li>" ).text( item.label ).appendTo( ul );
        -	},
        -
        -	_move: function( direction, event ) {
        -		if ( !this.menu.element.is( ":visible" ) ) {
        -			this.search( null, event );
        -			return;
        -		}
        -		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
        -				this.menu.isLastItem() && /^next/.test( direction ) ) {
        -
        -			if ( !this.isMultiLine ) {
        -				this._value( this.term );
        -			}
        -
        -			this.menu.blur();
        -			return;
        -		}
        -		this.menu[ direction ]( event );
        -	},
        -
        -	widget: function() {
        -		return this.menu.element;
        -	},
        -
        -	_value: function() {
        -		return this.valueMethod.apply( this.element, arguments );
        -	},
        -
        -	_keyEvent: function( keyEvent, event ) {
        -		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        -			this._move( keyEvent, event );
        -
        -			// prevents moving cursor to beginning/end of the text field in some browsers
        -			event.preventDefault();
        -		}
        -	}
        -});
        -
        -$.extend( $.ui.autocomplete, {
        -	escapeRegex: function( value ) {
        -		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
        -	},
        -	filter: function( array, term ) {
        -		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
        -		return $.grep( array, function( value ) {
        -			return matcher.test( value.label || value.value || value );
        -		});
        -	}
        -});
        -
        -// live region extension, adding a `messages` option
        -// NOTE: This is an experimental API. We are still investigating
        -// a full solution for string manipulation and internationalization.
        -$.widget( "ui.autocomplete", $.ui.autocomplete, {
        -	options: {
        -		messages: {
        -			noResults: "No search results.",
        -			results: function( amount ) {
        -				return amount + ( amount > 1 ? " results are" : " result is" ) +
        -					" available, use up and down arrow keys to navigate.";
        -			}
        -		}
        -	},
        -
        -	__response: function( content ) {
        -		var message;
        -		this._superApply( arguments );
        -		if ( this.options.disabled || this.cancelSearch ) {
        -			return;
        -		}
        -		if ( content && content.length ) {
        -			message = this.options.messages.results( content.length );
        -		} else {
        -			message = this.options.messages.noResults;
        -		}
        -		this.liveRegion.children().hide();
        -		$( "<div>" ).text( message ).appendTo( this.liveRegion );
        -	}
        -});
        -
        -var autocomplete = $.ui.autocomplete;
        -
        -
        -/*!
        - * jQuery UI Button 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/button/
        - */
        -
        -
        -var lastActive,
        -	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
        -	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
        -	formResetHandler = function() {
        -		var form = $( this );
        -		setTimeout(function() {
        -			form.find( ":ui-button" ).button( "refresh" );
        -		}, 1 );
        -	},
        -	radioGroup = function( radio ) {
        -		var name = radio.name,
        -			form = radio.form,
        -			radios = $( [] );
        -		if ( name ) {
        -			name = name.replace( /'/g, "\\'" );
        -			if ( form ) {
        -				radios = $( form ).find( "[name='" + name + "'][type=radio]" );
        -			} else {
        -				radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument )
        -					.filter(function() {
        -						return !this.form;
        -					});
        -			}
        -		}
        -		return radios;
        -	};
        -
        -$.widget( "ui.button", {
        -	version: "1.11.4",
        -	defaultElement: "<button>",
        -	options: {
        -		disabled: null,
        -		text: true,
        -		label: null,
        -		icons: {
        -			primary: null,
        -			secondary: null
        -		}
        -	},
        -	_create: function() {
        -		this.element.closest( "form" )
        -			.unbind( "reset" + this.eventNamespace )
        -			.bind( "reset" + this.eventNamespace, formResetHandler );
        -
        -		if ( typeof this.options.disabled !== "boolean" ) {
        -			this.options.disabled = !!this.element.prop( "disabled" );
        -		} else {
        -			this.element.prop( "disabled", this.options.disabled );
        -		}
        -
        -		this._determineButtonType();
        -		this.hasTitle = !!this.buttonElement.attr( "title" );
        -
        -		var that = this,
        -			options = this.options,
        -			toggleButton = this.type === "checkbox" || this.type === "radio",
        -			activeClass = !toggleButton ? "ui-state-active" : "";
        -
        -		if ( options.label === null ) {
        -			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
        -		}
        -
        -		this._hoverable( this.buttonElement );
        -
        -		this.buttonElement
        -			.addClass( baseClasses )
        -			.attr( "role", "button" )
        -			.bind( "mouseenter" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return;
        -				}
        -				if ( this === lastActive ) {
        -					$( this ).addClass( "ui-state-active" );
        -				}
        -			})
        -			.bind( "mouseleave" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return;
        -				}
        -				$( this ).removeClass( activeClass );
        -			})
        -			.bind( "click" + this.eventNamespace, function( event ) {
        -				if ( options.disabled ) {
        -					event.preventDefault();
        -					event.stopImmediatePropagation();
        -				}
        -			});
        -
        -		// Can't use _focusable() because the element that receives focus
        -		// and the element that gets the ui-state-focus class are different
        -		this._on({
        -			focus: function() {
        -				this.buttonElement.addClass( "ui-state-focus" );
        -			},
        -			blur: function() {
        -				this.buttonElement.removeClass( "ui-state-focus" );
        -			}
        -		});
        -
        -		if ( toggleButton ) {
        -			this.element.bind( "change" + this.eventNamespace, function() {
        -				that.refresh();
        -			});
        -		}
        -
        -		if ( this.type === "checkbox" ) {
        -			this.buttonElement.bind( "click" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return false;
        -				}
        -			});
        -		} else if ( this.type === "radio" ) {
        -			this.buttonElement.bind( "click" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return false;
        -				}
        -				$( this ).addClass( "ui-state-active" );
        -				that.buttonElement.attr( "aria-pressed", "true" );
        -
        -				var radio = that.element[ 0 ];
        -				radioGroup( radio )
        -					.not( radio )
        -					.map(function() {
        -						return $( this ).button( "widget" )[ 0 ];
        -					})
        -					.removeClass( "ui-state-active" )
        -					.attr( "aria-pressed", "false" );
        -			});
        -		} else {
        -			this.buttonElement
        -				.bind( "mousedown" + this.eventNamespace, function() {
        -					if ( options.disabled ) {
        -						return false;
        -					}
        -					$( this ).addClass( "ui-state-active" );
        -					lastActive = this;
        -					that.document.one( "mouseup", function() {
        -						lastActive = null;
        -					});
        -				})
        -				.bind( "mouseup" + this.eventNamespace, function() {
        -					if ( options.disabled ) {
        -						return false;
        -					}
        -					$( this ).removeClass( "ui-state-active" );
        -				})
        -				.bind( "keydown" + this.eventNamespace, function(event) {
        -					if ( options.disabled ) {
        -						return false;
        -					}
        -					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
        -						$( this ).addClass( "ui-state-active" );
        -					}
        -				})
        -				// see #8559, we bind to blur here in case the button element loses
        -				// focus between keydown and keyup, it would be left in an "active" state
        -				.bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
        -					$( this ).removeClass( "ui-state-active" );
        -				});
        -
        -			if ( this.buttonElement.is("a") ) {
        -				this.buttonElement.keyup(function(event) {
        -					if ( event.keyCode === $.ui.keyCode.SPACE ) {
        -						// TODO pass through original event correctly (just as 2nd argument doesn't work)
        -						$( this ).click();
        -					}
        -				});
        -			}
        -		}
        -
        -		this._setOption( "disabled", options.disabled );
        -		this._resetButton();
        -	},
        -
        -	_determineButtonType: function() {
        -		var ancestor, labelSelector, checked;
        -
        -		if ( this.element.is("[type=checkbox]") ) {
        -			this.type = "checkbox";
        -		} else if ( this.element.is("[type=radio]") ) {
        -			this.type = "radio";
        -		} else if ( this.element.is("input") ) {
        -			this.type = "input";
        -		} else {
        -			this.type = "button";
        -		}
        -
        -		if ( this.type === "checkbox" || this.type === "radio" ) {
        -			// we don't search against the document in case the element
        -			// is disconnected from the DOM
        -			ancestor = this.element.parents().last();
        -			labelSelector = "label[for='" + this.element.attr("id") + "']";
        -			this.buttonElement = ancestor.find( labelSelector );
        -			if ( !this.buttonElement.length ) {
        -				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
        -				this.buttonElement = ancestor.filter( labelSelector );
        -				if ( !this.buttonElement.length ) {
        -					this.buttonElement = ancestor.find( labelSelector );
        -				}
        -			}
        -			this.element.addClass( "ui-helper-hidden-accessible" );
        -
        -			checked = this.element.is( ":checked" );
        -			if ( checked ) {
        -				this.buttonElement.addClass( "ui-state-active" );
        -			}
        -			this.buttonElement.prop( "aria-pressed", checked );
        -		} else {
        -			this.buttonElement = this.element;
        -		}
        -	},
        -
        -	widget: function() {
        -		return this.buttonElement;
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-helper-hidden-accessible" );
        -		this.buttonElement
        -			.removeClass( baseClasses + " ui-state-active " + typeClasses )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-pressed" )
        -			.html( this.buttonElement.find(".ui-button-text").html() );
        -
        -		if ( !this.hasTitle ) {
        -			this.buttonElement.removeAttr( "title" );
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -		if ( key === "disabled" ) {
        -			this.widget().toggleClass( "ui-state-disabled", !!value );
        -			this.element.prop( "disabled", !!value );
        -			if ( value ) {
        -				if ( this.type === "checkbox" || this.type === "radio" ) {
        -					this.buttonElement.removeClass( "ui-state-focus" );
        -				} else {
        -					this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
        -				}
        -			}
        -			return;
        -		}
        -		this._resetButton();
        -	},
        -
        -	refresh: function() {
        -		//See #8237 & #8828
        -		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
        -
        -		if ( isDisabled !== this.options.disabled ) {
        -			this._setOption( "disabled", isDisabled );
        -		}
        -		if ( this.type === "radio" ) {
        -			radioGroup( this.element[0] ).each(function() {
        -				if ( $( this ).is( ":checked" ) ) {
        -					$( this ).button( "widget" )
        -						.addClass( "ui-state-active" )
        -						.attr( "aria-pressed", "true" );
        -				} else {
        -					$( this ).button( "widget" )
        -						.removeClass( "ui-state-active" )
        -						.attr( "aria-pressed", "false" );
        -				}
        -			});
        -		} else if ( this.type === "checkbox" ) {
        -			if ( this.element.is( ":checked" ) ) {
        -				this.buttonElement
        -					.addClass( "ui-state-active" )
        -					.attr( "aria-pressed", "true" );
        -			} else {
        -				this.buttonElement
        -					.removeClass( "ui-state-active" )
        -					.attr( "aria-pressed", "false" );
        -			}
        -		}
        -	},
        -
        -	_resetButton: function() {
        -		if ( this.type === "input" ) {
        -			if ( this.options.label ) {
        -				this.element.val( this.options.label );
        -			}
        -			return;
        -		}
        -		var buttonElement = this.buttonElement.removeClass( typeClasses ),
        -			buttonText = $( "<span></span>", this.document[0] )
        -				.addClass( "ui-button-text" )
        -				.html( this.options.label )
        -				.appendTo( buttonElement.empty() )
        -				.text(),
        -			icons = this.options.icons,
        -			multipleIcons = icons.primary && icons.secondary,
        -			buttonClasses = [];
        -
        -		if ( icons.primary || icons.secondary ) {
        -			if ( this.options.text ) {
        -				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
        -			}
        -
        -			if ( icons.primary ) {
        -				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
        -			}
        -
        -			if ( icons.secondary ) {
        -				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
        -			}
        -
        -			if ( !this.options.text ) {
        -				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
        -
        -				if ( !this.hasTitle ) {
        -					buttonElement.attr( "title", $.trim( buttonText ) );
        -				}
        -			}
        -		} else {
        -			buttonClasses.push( "ui-button-text-only" );
        -		}
        -		buttonElement.addClass( buttonClasses.join( " " ) );
        -	}
        -});
        -
        -$.widget( "ui.buttonset", {
        -	version: "1.11.4",
        -	options: {
        -		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
        -	},
        -
        -	_create: function() {
        -		this.element.addClass( "ui-buttonset" );
        -	},
        -
        -	_init: function() {
        -		this.refresh();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "disabled" ) {
        -			this.buttons.button( "option", key, value );
        -		}
        -
        -		this._super( key, value );
        -	},
        -
        -	refresh: function() {
        -		var rtl = this.element.css( "direction" ) === "rtl",
        -			allButtons = this.element.find( this.options.items ),
        -			existingButtons = allButtons.filter( ":ui-button" );
        -
        -		// Initialize new buttons
        -		allButtons.not( ":ui-button" ).button();
        -
        -		// Refresh existing buttons
        -		existingButtons.button( "refresh" );
        -
        -		this.buttons = allButtons
        -			.map(function() {
        -				return $( this ).button( "widget" )[ 0 ];
        -			})
        -				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
        -				.filter( ":first" )
        -					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
        -				.end()
        -				.filter( ":last" )
        -					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
        -				.end()
        -			.end();
        -	},
        -
        -	_destroy: function() {
        -		this.element.removeClass( "ui-buttonset" );
        -		this.buttons
        -			.map(function() {
        -				return $( this ).button( "widget" )[ 0 ];
        -			})
        -				.removeClass( "ui-corner-left ui-corner-right" )
        -			.end()
        -			.button( "destroy" );
        -	}
        -});
        -
        -var button = $.ui.button;
        -
        -
        -/*!
        - * jQuery UI Datepicker 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/datepicker/
        - */
        -
        -
        -$.extend($.ui, { datepicker: { version: "1.11.4" } });
        -
        -var datepicker_instActive;
        -
        -function datepicker_getZindex( elem ) {
        -	var position, value;
        -	while ( elem.length && elem[ 0 ] !== document ) {
        -		// Ignore z-index if position is set to a value where z-index is ignored by the browser
        -		// This makes behavior of this function consistent across browsers
        -		// WebKit always returns auto if the element is positioned
        -		position = elem.css( "position" );
        -		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
        -			// IE returns 0 when zIndex is not specified
        -			// other browsers return a string
        -			// we ignore the case of nested elements with an explicit value of 0
        -			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
        -			value = parseInt( elem.css( "zIndex" ), 10 );
        -			if ( !isNaN( value ) && value !== 0 ) {
        -				return value;
        -			}
        -		}
        -		elem = elem.parent();
        -	}
        -
        -	return 0;
        -}
        -/* Date picker manager.
        -   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
        -   Settings for (groups of) date pickers are maintained in an instance object,
        -   allowing multiple different settings on the same page. */
        -
        -function Datepicker() {
        -	this._curInst = null; // The current instance in use
        -	this._keyEvent = false; // If the last event was a key event
        -	this._disabledInputs = []; // List of date picker inputs that have been disabled
        -	this._datepickerShowing = false; // True if the popup picker is showing , false if not
        -	this._inDialog = false; // True if showing within a "dialog", false if not
        -	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
        -	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
        -	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
        -	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
        -	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
        -	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
        -	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
        -	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
        -	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
        -	this.regional = []; // Available regional settings, indexed by language code
        -	this.regional[""] = { // Default regional settings
        -		closeText: "Done", // Display text for close link
        -		prevText: "Prev", // Display text for previous month link
        -		nextText: "Next", // Display text for next month link
        -		currentText: "Today", // Display text for current month link
        -		monthNames: ["January","February","March","April","May","June",
        -			"July","August","September","October","November","December"], // Names of months for drop-down and formatting
        -		monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
        -		dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
        -		dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
        -		dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
        -		weekHeader: "Wk", // Column header for week of the year
        -		dateFormat: "mm/dd/yy", // See format options on parseDate
        -		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
        -		isRTL: false, // True if right-to-left language, false if left-to-right
        -		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
        -		yearSuffix: "" // Additional text to append to the year in the month headers
        -	};
        -	this._defaults = { // Global defaults for all the date picker instances
        -		showOn: "focus", // "focus" for popup on focus,
        -			// "button" for trigger button, or "both" for either
        -		showAnim: "fadeIn", // Name of jQuery animation for popup
        -		showOptions: {}, // Options for enhanced animations
        -		defaultDate: null, // Used when field is blank: actual date,
        -			// +/-number for offset from today, null for today
        -		appendText: "", // Display text following the input box, e.g. showing the format
        -		buttonText: "...", // Text for trigger button
        -		buttonImage: "", // URL for trigger button image
        -		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
        -		hideIfNoPrevNext: false, // True to hide next/previous month links
        -			// if not applicable, false to just disable them
        -		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
        -		gotoCurrent: false, // True if today link goes back to current selection instead
        -		changeMonth: false, // True if month can be selected directly, false if only prev/next
        -		changeYear: false, // True if year can be selected directly, false if only prev/next
        -		yearRange: "c-10:c+10", // Range of years to display in drop-down,
        -			// either relative to today's year (-nn:+nn), relative to currently displayed year
        -			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
        -		showOtherMonths: false, // True to show dates in other months, false to leave blank
        -		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
        -		showWeek: false, // True to show week of the year, false to not show it
        -		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
        -			// takes a Date and returns the number of the week for it
        -		shortYearCutoff: "+10", // Short year values < this are in the current century,
        -			// > this are in the previous century,
        -			// string value starting with "+" for current year + value
        -		minDate: null, // The earliest selectable date, or null for no limit
        -		maxDate: null, // The latest selectable date, or null for no limit
        -		duration: "fast", // Duration of display/closure
        -		beforeShowDay: null, // Function that takes a date and returns an array with
        -			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
        -			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
        -		beforeShow: null, // Function that takes an input field and
        -			// returns a set of custom settings for the date picker
        -		onSelect: null, // Define a callback function when a date is selected
        -		onChangeMonthYear: null, // Define a callback function when the month or year is changed
        -		onClose: null, // Define a callback function when the datepicker is closed
        -		numberOfMonths: 1, // Number of months to show at a time
        -		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
        -		stepMonths: 1, // Number of months to step back/forward
        -		stepBigMonths: 12, // Number of months to step back/forward for the big links
        -		altField: "", // Selector for an alternate field to store selected dates into
        -		altFormat: "", // The date format to use for the alternate field
        -		constrainInput: true, // The input is constrained by the current date format
        -		showButtonPanel: false, // True to show button panel, false to not show it
        -		autoSize: false, // True to size the input for the date format, false to leave as is
        -		disabled: false // The initial disabled state
        -	};
        -	$.extend(this._defaults, this.regional[""]);
        -	this.regional.en = $.extend( true, {}, this.regional[ "" ]);
        -	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
        -	this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
        -}
        -
        -$.extend(Datepicker.prototype, {
        -	/* Class name added to elements to indicate already configured with a date picker. */
        -	markerClassName: "hasDatepicker",
        -
        -	//Keep track of the maximum number of rows displayed (see #7043)
        -	maxRows: 4,
        -
        -	// TODO rename to "widget" when switching to widget factory
        -	_widgetDatepicker: function() {
        -		return this.dpDiv;
        -	},
        -
        -	/* Override the default settings for all instances of the date picker.
        -	 * @param  settings  object - the new settings to use as defaults (anonymous object)
        -	 * @return the manager object
        -	 */
        -	setDefaults: function(settings) {
        -		datepicker_extendRemove(this._defaults, settings || {});
        -		return this;
        -	},
        -
        -	/* Attach the date picker to a jQuery selection.
        -	 * @param  target	element - the target input field or division or span
        -	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
        -	 */
        -	_attachDatepicker: function(target, settings) {
        -		var nodeName, inline, inst;
        -		nodeName = target.nodeName.toLowerCase();
        -		inline = (nodeName === "div" || nodeName === "span");
        -		if (!target.id) {
        -			this.uuid += 1;
        -			target.id = "dp" + this.uuid;
        -		}
        -		inst = this._newInst($(target), inline);
        -		inst.settings = $.extend({}, settings || {});
        -		if (nodeName === "input") {
        -			this._connectDatepicker(target, inst);
        -		} else if (inline) {
        -			this._inlineDatepicker(target, inst);
        -		}
        -	},
        -
        -	/* Create a new instance object. */
        -	_newInst: function(target, inline) {
        -		var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
        -		return {id: id, input: target, // associated target
        -			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
        -			drawMonth: 0, drawYear: 0, // month being drawn
        -			inline: inline, // is datepicker inline or not
        -			dpDiv: (!inline ? this.dpDiv : // presentation div
        -			datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
        -	},
        -
        -	/* Attach the date picker to an input field. */
        -	_connectDatepicker: function(target, inst) {
        -		var input = $(target);
        -		inst.append = $([]);
        -		inst.trigger = $([]);
        -		if (input.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -		this._attachments(input, inst);
        -		input.addClass(this.markerClassName).keydown(this._doKeyDown).
        -			keypress(this._doKeyPress).keyup(this._doKeyUp);
        -		this._autoSize(inst);
        -		$.data(target, "datepicker", inst);
        -		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
        -		if( inst.settings.disabled ) {
        -			this._disableDatepicker( target );
        -		}
        -	},
        -
        -	/* Make attachments based on settings. */
        -	_attachments: function(input, inst) {
        -		var showOn, buttonText, buttonImage,
        -			appendText = this._get(inst, "appendText"),
        -			isRTL = this._get(inst, "isRTL");
        -
        -		if (inst.append) {
        -			inst.append.remove();
        -		}
        -		if (appendText) {
        -			inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
        -			input[isRTL ? "before" : "after"](inst.append);
        -		}
        -
        -		input.unbind("focus", this._showDatepicker);
        -
        -		if (inst.trigger) {
        -			inst.trigger.remove();
        -		}
        -
        -		showOn = this._get(inst, "showOn");
        -		if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
        -			input.focus(this._showDatepicker);
        -		}
        -		if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
        -			buttonText = this._get(inst, "buttonText");
        -			buttonImage = this._get(inst, "buttonImage");
        -			inst.trigger = $(this._get(inst, "buttonImageOnly") ?
        -				$("<img/>").addClass(this._triggerClass).
        -					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
        -				$("<button type='button'></button>").addClass(this._triggerClass).
        -					html(!buttonImage ? buttonText : $("<img/>").attr(
        -					{ src:buttonImage, alt:buttonText, title:buttonText })));
        -			input[isRTL ? "before" : "after"](inst.trigger);
        -			inst.trigger.click(function() {
        -				if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
        -					$.datepicker._hideDatepicker();
        -				} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
        -					$.datepicker._hideDatepicker();
        -					$.datepicker._showDatepicker(input[0]);
        -				} else {
        -					$.datepicker._showDatepicker(input[0]);
        -				}
        -				return false;
        -			});
        -		}
        -	},
        -
        -	/* Apply the maximum length for the date format. */
        -	_autoSize: function(inst) {
        -		if (this._get(inst, "autoSize") && !inst.inline) {
        -			var findMax, max, maxI, i,
        -				date = new Date(2009, 12 - 1, 20), // Ensure double digits
        -				dateFormat = this._get(inst, "dateFormat");
        -
        -			if (dateFormat.match(/[DM]/)) {
        -				findMax = function(names) {
        -					max = 0;
        -					maxI = 0;
        -					for (i = 0; i < names.length; i++) {
        -						if (names[i].length > max) {
        -							max = names[i].length;
        -							maxI = i;
        -						}
        -					}
        -					return maxI;
        -				};
        -				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
        -					"monthNames" : "monthNamesShort"))));
        -				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
        -					"dayNames" : "dayNamesShort"))) + 20 - date.getDay());
        -			}
        -			inst.input.attr("size", this._formatDate(inst, date).length);
        -		}
        -	},
        -
        -	/* Attach an inline date picker to a div. */
        -	_inlineDatepicker: function(target, inst) {
        -		var divSpan = $(target);
        -		if (divSpan.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -		divSpan.addClass(this.markerClassName).append(inst.dpDiv);
        -		$.data(target, "datepicker", inst);
        -		this._setDate(inst, this._getDefaultDate(inst), true);
        -		this._updateDatepicker(inst);
        -		this._updateAlternate(inst);
        -		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
        -		if( inst.settings.disabled ) {
        -			this._disableDatepicker( target );
        -		}
        -		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
        -		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
        -		inst.dpDiv.css( "display", "block" );
        -	},
        -
        -	/* Pop-up the date picker in a "dialog" box.
        -	 * @param  input element - ignored
        -	 * @param  date	string or Date - the initial date to display
        -	 * @param  onSelect  function - the function to call when a date is selected
        -	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
        -	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
        -	 *					event - with x/y coordinates or
        -	 *					leave empty for default (screen centre)
        -	 * @return the manager object
        -	 */
        -	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
        -		var id, browserWidth, browserHeight, scrollX, scrollY,
        -			inst = this._dialogInst; // internal instance
        -
        -		if (!inst) {
        -			this.uuid += 1;
        -			id = "dp" + this.uuid;
        -			this._dialogInput = $("<input type='text' id='" + id +
        -				"' style='position: absolute; top: -100px; width: 0px;'/>");
        -			this._dialogInput.keydown(this._doKeyDown);
        -			$("body").append(this._dialogInput);
        -			inst = this._dialogInst = this._newInst(this._dialogInput, false);
        -			inst.settings = {};
        -			$.data(this._dialogInput[0], "datepicker", inst);
        -		}
        -		datepicker_extendRemove(inst.settings, settings || {});
        -		date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
        -		this._dialogInput.val(date);
        -
        -		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
        -		if (!this._pos) {
        -			browserWidth = document.documentElement.clientWidth;
        -			browserHeight = document.documentElement.clientHeight;
        -			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
        -			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
        -			this._pos = // should use actual width/height below
        -				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
        -		}
        -
        -		// move input on screen for focus, but hidden behind dialog
        -		this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
        -		inst.settings.onSelect = onSelect;
        -		this._inDialog = true;
        -		this.dpDiv.addClass(this._dialogClass);
        -		this._showDatepicker(this._dialogInput[0]);
        -		if ($.blockUI) {
        -			$.blockUI(this.dpDiv);
        -		}
        -		$.data(this._dialogInput[0], "datepicker", inst);
        -		return this;
        -	},
        -
        -	/* Detach a datepicker from its control.
        -	 * @param  target	element - the target input field or division or span
        -	 */
        -	_destroyDatepicker: function(target) {
        -		var nodeName,
        -			$target = $(target),
        -			inst = $.data(target, "datepicker");
        -
        -		if (!$target.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -
        -		nodeName = target.nodeName.toLowerCase();
        -		$.removeData(target, "datepicker");
        -		if (nodeName === "input") {
        -			inst.append.remove();
        -			inst.trigger.remove();
        -			$target.removeClass(this.markerClassName).
        -				unbind("focus", this._showDatepicker).
        -				unbind("keydown", this._doKeyDown).
        -				unbind("keypress", this._doKeyPress).
        -				unbind("keyup", this._doKeyUp);
        -		} else if (nodeName === "div" || nodeName === "span") {
        -			$target.removeClass(this.markerClassName).empty();
        -		}
        -
        -		if ( datepicker_instActive === inst ) {
        -			datepicker_instActive = null;
        -		}
        -	},
        -
        -	/* Enable the date picker to a jQuery selection.
        -	 * @param  target	element - the target input field or division or span
        -	 */
        -	_enableDatepicker: function(target) {
        -		var nodeName, inline,
        -			$target = $(target),
        -			inst = $.data(target, "datepicker");
        -
        -		if (!$target.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -
        -		nodeName = target.nodeName.toLowerCase();
        -		if (nodeName === "input") {
        -			target.disabled = false;
        -			inst.trigger.filter("button").
        -				each(function() { this.disabled = false; }).end().
        -				filter("img").css({opacity: "1.0", cursor: ""});
        -		} else if (nodeName === "div" || nodeName === "span") {
        -			inline = $target.children("." + this._inlineClass);
        -			inline.children().removeClass("ui-state-disabled");
        -			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
        -				prop("disabled", false);
        -		}
        -		this._disabledInputs = $.map(this._disabledInputs,
        -			function(value) { return (value === target ? null : value); }); // delete entry
        -	},
        -
        -	/* Disable the date picker to a jQuery selection.
        -	 * @param  target	element - the target input field or division or span
        -	 */
        -	_disableDatepicker: function(target) {
        -		var nodeName, inline,
        -			$target = $(target),
        -			inst = $.data(target, "datepicker");
        -
        -		if (!$target.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -
        -		nodeName = target.nodeName.toLowerCase();
        -		if (nodeName === "input") {
        -			target.disabled = true;
        -			inst.trigger.filter("button").
        -				each(function() { this.disabled = true; }).end().
        -				filter("img").css({opacity: "0.5", cursor: "default"});
        -		} else if (nodeName === "div" || nodeName === "span") {
        -			inline = $target.children("." + this._inlineClass);
        -			inline.children().addClass("ui-state-disabled");
        -			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
        -				prop("disabled", true);
        -		}
        -		this._disabledInputs = $.map(this._disabledInputs,
        -			function(value) { return (value === target ? null : value); }); // delete entry
        -		this._disabledInputs[this._disabledInputs.length] = target;
        -	},
        -
        -	/* Is the first field in a jQuery collection disabled as a datepicker?
        -	 * @param  target	element - the target input field or division or span
        -	 * @return boolean - true if disabled, false if enabled
        -	 */
        -	_isDisabledDatepicker: function(target) {
        -		if (!target) {
        -			return false;
        -		}
        -		for (var i = 0; i < this._disabledInputs.length; i++) {
        -			if (this._disabledInputs[i] === target) {
        -				return true;
        -			}
        -		}
        -		return false;
        -	},
        -
        -	/* Retrieve the instance data for the target control.
        -	 * @param  target  element - the target input field or division or span
        -	 * @return  object - the associated instance data
        -	 * @throws  error if a jQuery problem getting data
        -	 */
        -	_getInst: function(target) {
        -		try {
        -			return $.data(target, "datepicker");
        -		}
        -		catch (err) {
        -			throw "Missing instance data for this datepicker";
        -		}
        -	},
        -
        -	/* Update or retrieve the settings for a date picker attached to an input field or division.
        -	 * @param  target  element - the target input field or division or span
        -	 * @param  name	object - the new settings to update or
        -	 *				string - the name of the setting to change or retrieve,
        -	 *				when retrieving also "all" for all instance settings or
        -	 *				"defaults" for all global defaults
        -	 * @param  value   any - the new value for the setting
        -	 *				(omit if above is an object or to retrieve a value)
        -	 */
        -	_optionDatepicker: function(target, name, value) {
        -		var settings, date, minDate, maxDate,
        -			inst = this._getInst(target);
        -
        -		if (arguments.length === 2 && typeof name === "string") {
        -			return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
        -				(inst ? (name === "all" ? $.extend({}, inst.settings) :
        -				this._get(inst, name)) : null));
        -		}
        -
        -		settings = name || {};
        -		if (typeof name === "string") {
        -			settings = {};
        -			settings[name] = value;
        -		}
        -
        -		if (inst) {
        -			if (this._curInst === inst) {
        -				this._hideDatepicker();
        -			}
        -
        -			date = this._getDateDatepicker(target, true);
        -			minDate = this._getMinMaxDate(inst, "min");
        -			maxDate = this._getMinMaxDate(inst, "max");
        -			datepicker_extendRemove(inst.settings, settings);
        -			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
        -			if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
        -				inst.settings.minDate = this._formatDate(inst, minDate);
        -			}
        -			if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
        -				inst.settings.maxDate = this._formatDate(inst, maxDate);
        -			}
        -			if ( "disabled" in settings ) {
        -				if ( settings.disabled ) {
        -					this._disableDatepicker(target);
        -				} else {
        -					this._enableDatepicker(target);
        -				}
        -			}
        -			this._attachments($(target), inst);
        -			this._autoSize(inst);
        -			this._setDate(inst, date);
        -			this._updateAlternate(inst);
        -			this._updateDatepicker(inst);
        -		}
        -	},
        -
        -	// change method deprecated
        -	_changeDatepicker: function(target, name, value) {
        -		this._optionDatepicker(target, name, value);
        -	},
        -
        -	/* Redraw the date picker attached to an input field or division.
        -	 * @param  target  element - the target input field or division or span
        -	 */
        -	_refreshDatepicker: function(target) {
        -		var inst = this._getInst(target);
        -		if (inst) {
        -			this._updateDatepicker(inst);
        -		}
        -	},
        -
        -	/* Set the dates for a jQuery selection.
        -	 * @param  target element - the target input field or division or span
        -	 * @param  date	Date - the new date
        -	 */
        -	_setDateDatepicker: function(target, date) {
        -		var inst = this._getInst(target);
        -		if (inst) {
        -			this._setDate(inst, date);
        -			this._updateDatepicker(inst);
        -			this._updateAlternate(inst);
        -		}
        -	},
        -
        -	/* Get the date(s) for the first entry in a jQuery selection.
        -	 * @param  target element - the target input field or division or span
        -	 * @param  noDefault boolean - true if no default date is to be used
        -	 * @return Date - the current date
        -	 */
        -	_getDateDatepicker: function(target, noDefault) {
        -		var inst = this._getInst(target);
        -		if (inst && !inst.inline) {
        -			this._setDateFromField(inst, noDefault);
        -		}
        -		return (inst ? this._getDate(inst) : null);
        -	},
        -
        -	/* Handle keystrokes. */
        -	_doKeyDown: function(event) {
        -		var onSelect, dateStr, sel,
        -			inst = $.datepicker._getInst(event.target),
        -			handled = true,
        -			isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
        -
        -		inst._keyEvent = true;
        -		if ($.datepicker._datepickerShowing) {
        -			switch (event.keyCode) {
        -				case 9: $.datepicker._hideDatepicker();
        -						handled = false;
        -						break; // hide on tab out
        -				case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
        -									$.datepicker._currentClass + ")", inst.dpDiv);
        -						if (sel[0]) {
        -							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
        -						}
        -
        -						onSelect = $.datepicker._get(inst, "onSelect");
        -						if (onSelect) {
        -							dateStr = $.datepicker._formatDate(inst);
        -
        -							// trigger custom callback
        -							onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
        -						} else {
        -							$.datepicker._hideDatepicker();
        -						}
        -
        -						return false; // don't submit the form
        -				case 27: $.datepicker._hideDatepicker();
        -						break; // hide on escape
        -				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -							-$.datepicker._get(inst, "stepBigMonths") :
        -							-$.datepicker._get(inst, "stepMonths")), "M");
        -						break; // previous month/year on page up/+ ctrl
        -				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -							+$.datepicker._get(inst, "stepBigMonths") :
        -							+$.datepicker._get(inst, "stepMonths")), "M");
        -						break; // next month/year on page down/+ ctrl
        -				case 35: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._clearDate(event.target);
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // clear on ctrl or command +end
        -				case 36: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._gotoToday(event.target);
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // current on ctrl or command +home
        -				case 37: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						// -1 day on ctrl or command +left
        -						if (event.originalEvent.altKey) {
        -							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -								-$.datepicker._get(inst, "stepBigMonths") :
        -								-$.datepicker._get(inst, "stepMonths")), "M");
        -						}
        -						// next month/year on alt +left on Mac
        -						break;
        -				case 38: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, -7, "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // -1 week on ctrl or command +up
        -				case 39: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						// +1 day on ctrl or command +right
        -						if (event.originalEvent.altKey) {
        -							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -								+$.datepicker._get(inst, "stepBigMonths") :
        -								+$.datepicker._get(inst, "stepMonths")), "M");
        -						}
        -						// next month/year on alt +right
        -						break;
        -				case 40: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, +7, "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // +1 week on ctrl or command +down
        -				default: handled = false;
        -			}
        -		} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
        -			$.datepicker._showDatepicker(this);
        -		} else {
        -			handled = false;
        -		}
        -
        -		if (handled) {
        -			event.preventDefault();
        -			event.stopPropagation();
        -		}
        -	},
        -
        -	/* Filter entered characters - based on date format. */
        -	_doKeyPress: function(event) {
        -		var chars, chr,
        -			inst = $.datepicker._getInst(event.target);
        -
        -		if ($.datepicker._get(inst, "constrainInput")) {
        -			chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
        -			chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
        -			return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
        -		}
        -	},
        -
        -	/* Synchronise manual entry and field/alternate field. */
        -	_doKeyUp: function(event) {
        -		var date,
        -			inst = $.datepicker._getInst(event.target);
        -
        -		if (inst.input.val() !== inst.lastVal) {
        -			try {
        -				date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
        -					(inst.input ? inst.input.val() : null),
        -					$.datepicker._getFormatConfig(inst));
        -
        -				if (date) { // only if valid
        -					$.datepicker._setDateFromField(inst);
        -					$.datepicker._updateAlternate(inst);
        -					$.datepicker._updateDatepicker(inst);
        -				}
        -			}
        -			catch (err) {
        -			}
        -		}
        -		return true;
        -	},
        -
        -	/* Pop-up the date picker for a given input field.
        -	 * If false returned from beforeShow event handler do not show.
        -	 * @param  input  element - the input field attached to the date picker or
        -	 *					event - if triggered by focus
        -	 */
        -	_showDatepicker: function(input) {
        -		input = input.target || input;
        -		if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
        -			input = $("input", input.parentNode)[0];
        -		}
        -
        -		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
        -			return;
        -		}
        -
        -		var inst, beforeShow, beforeShowSettings, isFixed,
        -			offset, showAnim, duration;
        -
        -		inst = $.datepicker._getInst(input);
        -		if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
        -			$.datepicker._curInst.dpDiv.stop(true, true);
        -			if ( inst && $.datepicker._datepickerShowing ) {
        -				$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
        -			}
        -		}
        -
        -		beforeShow = $.datepicker._get(inst, "beforeShow");
        -		beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
        -		if(beforeShowSettings === false){
        -			return;
        -		}
        -		datepicker_extendRemove(inst.settings, beforeShowSettings);
        -
        -		inst.lastVal = null;
        -		$.datepicker._lastInput = input;
        -		$.datepicker._setDateFromField(inst);
        -
        -		if ($.datepicker._inDialog) { // hide cursor
        -			input.value = "";
        -		}
        -		if (!$.datepicker._pos) { // position below input
        -			$.datepicker._pos = $.datepicker._findPos(input);
        -			$.datepicker._pos[1] += input.offsetHeight; // add the height
        -		}
        -
        -		isFixed = false;
        -		$(input).parents().each(function() {
        -			isFixed |= $(this).css("position") === "fixed";
        -			return !isFixed;
        -		});
        -
        -		offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
        -		$.datepicker._pos = null;
        -		//to avoid flashes on Firefox
        -		inst.dpDiv.empty();
        -		// determine sizing offscreen
        -		inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
        -		$.datepicker._updateDatepicker(inst);
        -		// fix width for dynamic number of date pickers
        -		// and adjust position before showing
        -		offset = $.datepicker._checkOffset(inst, offset, isFixed);
        -		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
        -			"static" : (isFixed ? "fixed" : "absolute")), display: "none",
        -			left: offset.left + "px", top: offset.top + "px"});
        -
        -		if (!inst.inline) {
        -			showAnim = $.datepicker._get(inst, "showAnim");
        -			duration = $.datepicker._get(inst, "duration");
        -			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
        -			$.datepicker._datepickerShowing = true;
        -
        -			if ( $.effects && $.effects.effect[ showAnim ] ) {
        -				inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
        -			} else {
        -				inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
        -			}
        -
        -			if ( $.datepicker._shouldFocusInput( inst ) ) {
        -				inst.input.focus();
        -			}
        -
        -			$.datepicker._curInst = inst;
        -		}
        -	},
        -
        -	/* Generate the date picker content. */
        -	_updateDatepicker: function(inst) {
        -		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
        -		datepicker_instActive = inst; // for delegate hover events
        -		inst.dpDiv.empty().append(this._generateHTML(inst));
        -		this._attachHandlers(inst);
        -
        -		var origyearshtml,
        -			numMonths = this._getNumberOfMonths(inst),
        -			cols = numMonths[1],
        -			width = 17,
        -			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
        -
        -		if ( activeCell.length > 0 ) {
        -			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
        -		}
        -
        -		inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
        -		if (cols > 1) {
        -			inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
        -		}
        -		inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
        -			"Class"]("ui-datepicker-multi");
        -		inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
        -			"Class"]("ui-datepicker-rtl");
        -
        -		if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
        -			inst.input.focus();
        -		}
        -
        -		// deffered render of the years select (to avoid flashes on Firefox)
        -		if( inst.yearshtml ){
        -			origyearshtml = inst.yearshtml;
        -			setTimeout(function(){
        -				//assure that inst.yearshtml didn't change.
        -				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
        -					inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
        -				}
        -				origyearshtml = inst.yearshtml = null;
        -			}, 0);
        -		}
        -	},
        -
        -	// #6694 - don't focus the input if it's already focused
        -	// this breaks the change event in IE
        -	// Support: IE and jQuery <1.9
        -	_shouldFocusInput: function( inst ) {
        -		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
        -	},
        -
        -	/* Check positioning to remain on screen. */
        -	_checkOffset: function(inst, offset, isFixed) {
        -		var dpWidth = inst.dpDiv.outerWidth(),
        -			dpHeight = inst.dpDiv.outerHeight(),
        -			inputWidth = inst.input ? inst.input.outerWidth() : 0,
        -			inputHeight = inst.input ? inst.input.outerHeight() : 0,
        -			viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
        -			viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
        -
        -		offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
        -		offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
        -		offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
        -
        -		// now check if datepicker is showing outside window viewport - move to a better place if so.
        -		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
        -			Math.abs(offset.left + dpWidth - viewWidth) : 0);
        -		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
        -			Math.abs(dpHeight + inputHeight) : 0);
        -
        -		return offset;
        -	},
        -
        -	/* Find an object's position on the screen. */
        -	_findPos: function(obj) {
        -		var position,
        -			inst = this._getInst(obj),
        -			isRTL = this._get(inst, "isRTL");
        -
        -		while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
        -			obj = obj[isRTL ? "previousSibling" : "nextSibling"];
        -		}
        -
        -		position = $(obj).offset();
        -		return [position.left, position.top];
        -	},
        -
        -	/* Hide the date picker from view.
        -	 * @param  input  element - the input field attached to the date picker
        -	 */
        -	_hideDatepicker: function(input) {
        -		var showAnim, duration, postProcess, onClose,
        -			inst = this._curInst;
        -
        -		if (!inst || (input && inst !== $.data(input, "datepicker"))) {
        -			return;
        -		}
        -
        -		if (this._datepickerShowing) {
        -			showAnim = this._get(inst, "showAnim");
        -			duration = this._get(inst, "duration");
        -			postProcess = function() {
        -				$.datepicker._tidyDialog(inst);
        -			};
        -
        -			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
        -			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
        -				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
        -			} else {
        -				inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
        -					(showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
        -			}
        -
        -			if (!showAnim) {
        -				postProcess();
        -			}
        -			this._datepickerShowing = false;
        -
        -			onClose = this._get(inst, "onClose");
        -			if (onClose) {
        -				onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
        -			}
        -
        -			this._lastInput = null;
        -			if (this._inDialog) {
        -				this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
        -				if ($.blockUI) {
        -					$.unblockUI();
        -					$("body").append(this.dpDiv);
        -				}
        -			}
        -			this._inDialog = false;
        -		}
        -	},
        -
        -	/* Tidy up after a dialog display. */
        -	_tidyDialog: function(inst) {
        -		inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
        -	},
        -
        -	/* Close date picker if clicked elsewhere. */
        -	_checkExternalClick: function(event) {
        -		if (!$.datepicker._curInst) {
        -			return;
        -		}
        -
        -		var $target = $(event.target),
        -			inst = $.datepicker._getInst($target[0]);
        -
        -		if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
        -				$target.parents("#" + $.datepicker._mainDivId).length === 0 &&
        -				!$target.hasClass($.datepicker.markerClassName) &&
        -				!$target.closest("." + $.datepicker._triggerClass).length &&
        -				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
        -			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
        -				$.datepicker._hideDatepicker();
        -		}
        -	},
        -
        -	/* Adjust one of the date sub-fields. */
        -	_adjustDate: function(id, offset, period) {
        -		var target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		if (this._isDisabledDatepicker(target[0])) {
        -			return;
        -		}
        -		this._adjustInstDate(inst, offset +
        -			(period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
        -			period);
        -		this._updateDatepicker(inst);
        -	},
        -
        -	/* Action for current link. */
        -	_gotoToday: function(id) {
        -		var date,
        -			target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		if (this._get(inst, "gotoCurrent") && inst.currentDay) {
        -			inst.selectedDay = inst.currentDay;
        -			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
        -			inst.drawYear = inst.selectedYear = inst.currentYear;
        -		} else {
        -			date = new Date();
        -			inst.selectedDay = date.getDate();
        -			inst.drawMonth = inst.selectedMonth = date.getMonth();
        -			inst.drawYear = inst.selectedYear = date.getFullYear();
        -		}
        -		this._notifyChange(inst);
        -		this._adjustDate(target);
        -	},
        -
        -	/* Action for selecting a new month/year. */
        -	_selectMonthYear: function(id, select, period) {
        -		var target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		inst["selected" + (period === "M" ? "Month" : "Year")] =
        -		inst["draw" + (period === "M" ? "Month" : "Year")] =
        -			parseInt(select.options[select.selectedIndex].value,10);
        -
        -		this._notifyChange(inst);
        -		this._adjustDate(target);
        -	},
        -
        -	/* Action for selecting a day. */
        -	_selectDay: function(id, month, year, td) {
        -		var inst,
        -			target = $(id);
        -
        -		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
        -			return;
        -		}
        -
        -		inst = this._getInst(target[0]);
        -		inst.selectedDay = inst.currentDay = $("a", td).html();
        -		inst.selectedMonth = inst.currentMonth = month;
        -		inst.selectedYear = inst.currentYear = year;
        -		this._selectDate(id, this._formatDate(inst,
        -			inst.currentDay, inst.currentMonth, inst.currentYear));
        -	},
        -
        -	/* Erase the input field and hide the date picker. */
        -	_clearDate: function(id) {
        -		var target = $(id);
        -		this._selectDate(target, "");
        -	},
        -
        -	/* Update the input field with the selected date. */
        -	_selectDate: function(id, dateStr) {
        -		var onSelect,
        -			target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
        -		if (inst.input) {
        -			inst.input.val(dateStr);
        -		}
        -		this._updateAlternate(inst);
        -
        -		onSelect = this._get(inst, "onSelect");
        -		if (onSelect) {
        -			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
        -		} else if (inst.input) {
        -			inst.input.trigger("change"); // fire the change event
        -		}
        -
        -		if (inst.inline){
        -			this._updateDatepicker(inst);
        -		} else {
        -			this._hideDatepicker();
        -			this._lastInput = inst.input[0];
        -			if (typeof(inst.input[0]) !== "object") {
        -				inst.input.focus(); // restore focus
        -			}
        -			this._lastInput = null;
        -		}
        -	},
        -
        -	/* Update any alternate field to synchronise with the main field. */
        -	_updateAlternate: function(inst) {
        -		var altFormat, date, dateStr,
        -			altField = this._get(inst, "altField");
        -
        -		if (altField) { // update alternate field too
        -			altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
        -			date = this._getDate(inst);
        -			dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
        -			$(altField).each(function() { $(this).val(dateStr); });
        -		}
        -	},
        -
        -	/* Set as beforeShowDay function to prevent selection of weekends.
        -	 * @param  date  Date - the date to customise
        -	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
        -	 */
        -	noWeekends: function(date) {
        -		var day = date.getDay();
        -		return [(day > 0 && day < 6), ""];
        -	},
        -
        -	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
        -	 * @param  date  Date - the date to get the week for
        -	 * @return  number - the number of the week within the year that contains this date
        -	 */
        -	iso8601Week: function(date) {
        -		var time,
        -			checkDate = new Date(date.getTime());
        -
        -		// Find Thursday of this week starting on Monday
        -		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
        -
        -		time = checkDate.getTime();
        -		checkDate.setMonth(0); // Compare with Jan 1
        -		checkDate.setDate(1);
        -		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
        -	},
        -
        -	/* Parse a string value into a date object.
        -	 * See formatDate below for the possible formats.
        -	 *
        -	 * @param  format string - the expected format of the date
        -	 * @param  value string - the date in the above format
        -	 * @param  settings Object - attributes include:
        -	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
        -	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        -	 *					dayNames		string[7] - names of the days from Sunday (optional)
        -	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        -	 *					monthNames		string[12] - names of the months (optional)
        -	 * @return  Date - the extracted date value or null if value is blank
        -	 */
        -	parseDate: function (format, value, settings) {
        -		if (format == null || value == null) {
        -			throw "Invalid arguments";
        -		}
        -
        -		value = (typeof value === "object" ? value.toString() : value + "");
        -		if (value === "") {
        -			return null;
        -		}
        -
        -		var iFormat, dim, extra,
        -			iValue = 0,
        -			shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
        -			shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
        -				new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
        -			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
        -			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
        -			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
        -			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
        -			year = -1,
        -			month = -1,
        -			day = -1,
        -			doy = -1,
        -			literal = false,
        -			date,
        -			// Check whether a format character is doubled
        -			lookAhead = function(match) {
        -				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
        -				if (matches) {
        -					iFormat++;
        -				}
        -				return matches;
        -			},
        -			// Extract a number from the string value
        -			getNumber = function(match) {
        -				var isDoubled = lookAhead(match),
        -					size = (match === "@" ? 14 : (match === "!" ? 20 :
        -					(match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
        -					minSize = (match === "y" ? size : 1),
        -					digits = new RegExp("^\\d{" + minSize + "," + size + "}"),
        -					num = value.substring(iValue).match(digits);
        -				if (!num) {
        -					throw "Missing number at position " + iValue;
        -				}
        -				iValue += num[0].length;
        -				return parseInt(num[0], 10);
        -			},
        -			// Extract a name from the string value and convert to an index
        -			getName = function(match, shortNames, longNames) {
        -				var index = -1,
        -					names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
        -						return [ [k, v] ];
        -					}).sort(function (a, b) {
        -						return -(a[1].length - b[1].length);
        -					});
        -
        -				$.each(names, function (i, pair) {
        -					var name = pair[1];
        -					if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
        -						index = pair[0];
        -						iValue += name.length;
        -						return false;
        -					}
        -				});
        -				if (index !== -1) {
        -					return index + 1;
        -				} else {
        -					throw "Unknown name at position " + iValue;
        -				}
        -			},
        -			// Confirm that a literal character matches the string value
        -			checkLiteral = function() {
        -				if (value.charAt(iValue) !== format.charAt(iFormat)) {
        -					throw "Unexpected literal at position " + iValue;
        -				}
        -				iValue++;
        -			};
        -
        -		for (iFormat = 0; iFormat < format.length; iFormat++) {
        -			if (literal) {
        -				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
        -					literal = false;
        -				} else {
        -					checkLiteral();
        -				}
        -			} else {
        -				switch (format.charAt(iFormat)) {
        -					case "d":
        -						day = getNumber("d");
        -						break;
        -					case "D":
        -						getName("D", dayNamesShort, dayNames);
        -						break;
        -					case "o":
        -						doy = getNumber("o");
        -						break;
        -					case "m":
        -						month = getNumber("m");
        -						break;
        -					case "M":
        -						month = getName("M", monthNamesShort, monthNames);
        -						break;
        -					case "y":
        -						year = getNumber("y");
        -						break;
        -					case "@":
        -						date = new Date(getNumber("@"));
        -						year = date.getFullYear();
        -						month = date.getMonth() + 1;
        -						day = date.getDate();
        -						break;
        -					case "!":
        -						date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
        -						year = date.getFullYear();
        -						month = date.getMonth() + 1;
        -						day = date.getDate();
        -						break;
        -					case "'":
        -						if (lookAhead("'")){
        -							checkLiteral();
        -						} else {
        -							literal = true;
        -						}
        -						break;
        -					default:
        -						checkLiteral();
        -				}
        -			}
        -		}
        -
        -		if (iValue < value.length){
        -			extra = value.substr(iValue);
        -			if (!/^\s+/.test(extra)) {
        -				throw "Extra/unparsed characters found in date: " + extra;
        -			}
        -		}
        -
        -		if (year === -1) {
        -			year = new Date().getFullYear();
        -		} else if (year < 100) {
        -			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
        -				(year <= shortYearCutoff ? 0 : -100);
        -		}
        -
        -		if (doy > -1) {
        -			month = 1;
        -			day = doy;
        -			do {
        -				dim = this._getDaysInMonth(year, month - 1);
        -				if (day <= dim) {
        -					break;
        -				}
        -				month++;
        -				day -= dim;
        -			} while (true);
        -		}
        -
        -		date = this._daylightSavingAdjust(new Date(year, month - 1, day));
        -		if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
        -			throw "Invalid date"; // E.g. 31/02/00
        -		}
        -		return date;
        -	},
        -
        -	/* Standard date formats. */
        -	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
        -	COOKIE: "D, dd M yy",
        -	ISO_8601: "yy-mm-dd",
        -	RFC_822: "D, d M y",
        -	RFC_850: "DD, dd-M-y",
        -	RFC_1036: "D, d M y",
        -	RFC_1123: "D, d M yy",
        -	RFC_2822: "D, d M yy",
        -	RSS: "D, d M y", // RFC 822
        -	TICKS: "!",
        -	TIMESTAMP: "@",
        -	W3C: "yy-mm-dd", // ISO 8601
        -
        -	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
        -		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
        -
        -	/* Format a date object into a string value.
        -	 * The format can be combinations of the following:
        -	 * d  - day of month (no leading zero)
        -	 * dd - day of month (two digit)
        -	 * o  - day of year (no leading zeros)
        -	 * oo - day of year (three digit)
        -	 * D  - day name short
        -	 * DD - day name long
        -	 * m  - month of year (no leading zero)
        -	 * mm - month of year (two digit)
        -	 * M  - month name short
        -	 * MM - month name long
        -	 * y  - year (two digit)
        -	 * yy - year (four digit)
        -	 * @ - Unix timestamp (ms since 01/01/1970)
        -	 * ! - Windows ticks (100ns since 01/01/0001)
        -	 * "..." - literal text
        -	 * '' - single quote
        -	 *
        -	 * @param  format string - the desired format of the date
        -	 * @param  date Date - the date value to format
        -	 * @param  settings Object - attributes include:
        -	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        -	 *					dayNames		string[7] - names of the days from Sunday (optional)
        -	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        -	 *					monthNames		string[12] - names of the months (optional)
        -	 * @return  string - the date in the above format
        -	 */
        -	formatDate: function (format, date, settings) {
        -		if (!date) {
        -			return "";
        -		}
        -
        -		var iFormat,
        -			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
        -			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
        -			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
        -			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
        -			// Check whether a format character is doubled
        -			lookAhead = function(match) {
        -				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
        -				if (matches) {
        -					iFormat++;
        -				}
        -				return matches;
        -			},
        -			// Format a number, with leading zero if necessary
        -			formatNumber = function(match, value, len) {
        -				var num = "" + value;
        -				if (lookAhead(match)) {
        -					while (num.length < len) {
        -						num = "0" + num;
        -					}
        -				}
        -				return num;
        -			},
        -			// Format a name, short or long as requested
        -			formatName = function(match, value, shortNames, longNames) {
        -				return (lookAhead(match) ? longNames[value] : shortNames[value]);
        -			},
        -			output = "",
        -			literal = false;
        -
        -		if (date) {
        -			for (iFormat = 0; iFormat < format.length; iFormat++) {
        -				if (literal) {
        -					if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
        -						literal = false;
        -					} else {
        -						output += format.charAt(iFormat);
        -					}
        -				} else {
        -					switch (format.charAt(iFormat)) {
        -						case "d":
        -							output += formatNumber("d", date.getDate(), 2);
        -							break;
        -						case "D":
        -							output += formatName("D", date.getDay(), dayNamesShort, dayNames);
        -							break;
        -						case "o":
        -							output += formatNumber("o",
        -								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
        -							break;
        -						case "m":
        -							output += formatNumber("m", date.getMonth() + 1, 2);
        -							break;
        -						case "M":
        -							output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
        -							break;
        -						case "y":
        -							output += (lookAhead("y") ? date.getFullYear() :
        -								(date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
        -							break;
        -						case "@":
        -							output += date.getTime();
        -							break;
        -						case "!":
        -							output += date.getTime() * 10000 + this._ticksTo1970;
        -							break;
        -						case "'":
        -							if (lookAhead("'")) {
        -								output += "'";
        -							} else {
        -								literal = true;
        -							}
        -							break;
        -						default:
        -							output += format.charAt(iFormat);
        -					}
        -				}
        -			}
        -		}
        -		return output;
        -	},
        -
        -	/* Extract all possible characters from the date format. */
        -	_possibleChars: function (format) {
        -		var iFormat,
        -			chars = "",
        -			literal = false,
        -			// Check whether a format character is doubled
        -			lookAhead = function(match) {
        -				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
        -				if (matches) {
        -					iFormat++;
        -				}
        -				return matches;
        -			};
        -
        -		for (iFormat = 0; iFormat < format.length; iFormat++) {
        -			if (literal) {
        -				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
        -					literal = false;
        -				} else {
        -					chars += format.charAt(iFormat);
        -				}
        -			} else {
        -				switch (format.charAt(iFormat)) {
        -					case "d": case "m": case "y": case "@":
        -						chars += "0123456789";
        -						break;
        -					case "D": case "M":
        -						return null; // Accept anything
        -					case "'":
        -						if (lookAhead("'")) {
        -							chars += "'";
        -						} else {
        -							literal = true;
        -						}
        -						break;
        -					default:
        -						chars += format.charAt(iFormat);
        -				}
        -			}
        -		}
        -		return chars;
        -	},
        -
        -	/* Get a setting value, defaulting if necessary. */
        -	_get: function(inst, name) {
        -		return inst.settings[name] !== undefined ?
        -			inst.settings[name] : this._defaults[name];
        -	},
        -
        -	/* Parse existing date and initialise date picker. */
        -	_setDateFromField: function(inst, noDefault) {
        -		if (inst.input.val() === inst.lastVal) {
        -			return;
        -		}
        -
        -		var dateFormat = this._get(inst, "dateFormat"),
        -			dates = inst.lastVal = inst.input ? inst.input.val() : null,
        -			defaultDate = this._getDefaultDate(inst),
        -			date = defaultDate,
        -			settings = this._getFormatConfig(inst);
        -
        -		try {
        -			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
        -		} catch (event) {
        -			dates = (noDefault ? "" : dates);
        -		}
        -		inst.selectedDay = date.getDate();
        -		inst.drawMonth = inst.selectedMonth = date.getMonth();
        -		inst.drawYear = inst.selectedYear = date.getFullYear();
        -		inst.currentDay = (dates ? date.getDate() : 0);
        -		inst.currentMonth = (dates ? date.getMonth() : 0);
        -		inst.currentYear = (dates ? date.getFullYear() : 0);
        -		this._adjustInstDate(inst);
        -	},
        -
        -	/* Retrieve the default date shown on opening. */
        -	_getDefaultDate: function(inst) {
        -		return this._restrictMinMax(inst,
        -			this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
        -	},
        -
        -	/* A date may be specified as an exact value or a relative one. */
        -	_determineDate: function(inst, date, defaultDate) {
        -		var offsetNumeric = function(offset) {
        -				var date = new Date();
        -				date.setDate(date.getDate() + offset);
        -				return date;
        -			},
        -			offsetString = function(offset) {
        -				try {
        -					return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
        -						offset, $.datepicker._getFormatConfig(inst));
        -				}
        -				catch (e) {
        -					// Ignore
        -				}
        -
        -				var date = (offset.toLowerCase().match(/^c/) ?
        -					$.datepicker._getDate(inst) : null) || new Date(),
        -					year = date.getFullYear(),
        -					month = date.getMonth(),
        -					day = date.getDate(),
        -					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
        -					matches = pattern.exec(offset);
        -
        -				while (matches) {
        -					switch (matches[2] || "d") {
        -						case "d" : case "D" :
        -							day += parseInt(matches[1],10); break;
        -						case "w" : case "W" :
        -							day += parseInt(matches[1],10) * 7; break;
        -						case "m" : case "M" :
        -							month += parseInt(matches[1],10);
        -							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
        -							break;
        -						case "y": case "Y" :
        -							year += parseInt(matches[1],10);
        -							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
        -							break;
        -					}
        -					matches = pattern.exec(offset);
        -				}
        -				return new Date(year, month, day);
        -			},
        -			newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
        -				(typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
        -
        -		newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
        -		if (newDate) {
        -			newDate.setHours(0);
        -			newDate.setMinutes(0);
        -			newDate.setSeconds(0);
        -			newDate.setMilliseconds(0);
        -		}
        -		return this._daylightSavingAdjust(newDate);
        -	},
        -
        -	/* Handle switch to/from daylight saving.
        -	 * Hours may be non-zero on daylight saving cut-over:
        -	 * > 12 when midnight changeover, but then cannot generate
        -	 * midnight datetime, so jump to 1AM, otherwise reset.
        -	 * @param  date  (Date) the date to check
        -	 * @return  (Date) the corrected date
        -	 */
        -	_daylightSavingAdjust: function(date) {
        -		if (!date) {
        -			return null;
        -		}
        -		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
        -		return date;
        -	},
        -
        -	/* Set the date(s) directly. */
        -	_setDate: function(inst, date, noChange) {
        -		var clear = !date,
        -			origMonth = inst.selectedMonth,
        -			origYear = inst.selectedYear,
        -			newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
        -
        -		inst.selectedDay = inst.currentDay = newDate.getDate();
        -		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
        -		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
        -		if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
        -			this._notifyChange(inst);
        -		}
        -		this._adjustInstDate(inst);
        -		if (inst.input) {
        -			inst.input.val(clear ? "" : this._formatDate(inst));
        -		}
        -	},
        -
        -	/* Retrieve the date(s) directly. */
        -	_getDate: function(inst) {
        -		var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
        -			this._daylightSavingAdjust(new Date(
        -			inst.currentYear, inst.currentMonth, inst.currentDay)));
        -			return startDate;
        -	},
        -
        -	/* Attach the onxxx handlers.  These are declared statically so
        -	 * they work with static code transformers like Caja.
        -	 */
        -	_attachHandlers: function(inst) {
        -		var stepMonths = this._get(inst, "stepMonths"),
        -			id = "#" + inst.id.replace( /\\\\/g, "\\" );
        -		inst.dpDiv.find("[data-handler]").map(function () {
        -			var handler = {
        -				prev: function () {
        -					$.datepicker._adjustDate(id, -stepMonths, "M");
        -				},
        -				next: function () {
        -					$.datepicker._adjustDate(id, +stepMonths, "M");
        -				},
        -				hide: function () {
        -					$.datepicker._hideDatepicker();
        -				},
        -				today: function () {
        -					$.datepicker._gotoToday(id);
        -				},
        -				selectDay: function () {
        -					$.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
        -					return false;
        -				},
        -				selectMonth: function () {
        -					$.datepicker._selectMonthYear(id, this, "M");
        -					return false;
        -				},
        -				selectYear: function () {
        -					$.datepicker._selectMonthYear(id, this, "Y");
        -					return false;
        -				}
        -			};
        -			$(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
        -		});
        -	},
        -
        -	/* Generate the HTML for the current state of the date picker. */
        -	_generateHTML: function(inst) {
        -		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
        -			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
        -			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
        -			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
        -			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
        -			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
        -			tempDate = new Date(),
        -			today = this._daylightSavingAdjust(
        -				new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
        -			isRTL = this._get(inst, "isRTL"),
        -			showButtonPanel = this._get(inst, "showButtonPanel"),
        -			hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
        -			navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
        -			numMonths = this._getNumberOfMonths(inst),
        -			showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
        -			stepMonths = this._get(inst, "stepMonths"),
        -			isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
        -			currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
        -				new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
        -			minDate = this._getMinMaxDate(inst, "min"),
        -			maxDate = this._getMinMaxDate(inst, "max"),
        -			drawMonth = inst.drawMonth - showCurrentAtPos,
        -			drawYear = inst.drawYear;
        -
        -		if (drawMonth < 0) {
        -			drawMonth += 12;
        -			drawYear--;
        -		}
        -		if (maxDate) {
        -			maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
        -				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
        -			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
        -			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
        -				drawMonth--;
        -				if (drawMonth < 0) {
        -					drawMonth = 11;
        -					drawYear--;
        -				}
        -			}
        -		}
        -		inst.drawMonth = drawMonth;
        -		inst.drawYear = drawYear;
        -
        -		prevText = this._get(inst, "prevText");
        -		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
        -			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
        -			this._getFormatConfig(inst)));
        -
        -		prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
        -			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
        -			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
        -			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
        -
        -		nextText = this._get(inst, "nextText");
        -		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
        -			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
        -			this._getFormatConfig(inst)));
        -
        -		next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
        -			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
        -			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
        -			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
        -
        -		currentText = this._get(inst, "currentText");
        -		gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
        -		currentText = (!navigationAsDateFormat ? currentText :
        -			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
        -
        -		controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
        -			this._get(inst, "closeText") + "</button>" : "");
        -
        -		buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
        -			(this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
        -			">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
        -
        -		firstDay = parseInt(this._get(inst, "firstDay"),10);
        -		firstDay = (isNaN(firstDay) ? 0 : firstDay);
        -
        -		showWeek = this._get(inst, "showWeek");
        -		dayNames = this._get(inst, "dayNames");
        -		dayNamesMin = this._get(inst, "dayNamesMin");
        -		monthNames = this._get(inst, "monthNames");
        -		monthNamesShort = this._get(inst, "monthNamesShort");
        -		beforeShowDay = this._get(inst, "beforeShowDay");
        -		showOtherMonths = this._get(inst, "showOtherMonths");
        -		selectOtherMonths = this._get(inst, "selectOtherMonths");
        -		defaultDate = this._getDefaultDate(inst);
        -		html = "";
        -		dow;
        -		for (row = 0; row < numMonths[0]; row++) {
        -			group = "";
        -			this.maxRows = 4;
        -			for (col = 0; col < numMonths[1]; col++) {
        -				selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
        -				cornerClass = " ui-corner-all";
        -				calender = "";
        -				if (isMultiMonth) {
        -					calender += "<div class='ui-datepicker-group";
        -					if (numMonths[1] > 1) {
        -						switch (col) {
        -							case 0: calender += " ui-datepicker-group-first";
        -								cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
        -							case numMonths[1]-1: calender += " ui-datepicker-group-last";
        -								cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
        -							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
        -						}
        -					}
        -					calender += "'>";
        -				}
        -				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
        -					(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
        -					(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
        -					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
        -					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
        -					"</div><table class='ui-datepicker-calendar'><thead>" +
        -					"<tr>";
        -				thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
        -				for (dow = 0; dow < 7; dow++) { // days of the week
        -					day = (dow + firstDay) % 7;
        -					thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
        -						"<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
        -				}
        -				calender += thead + "</tr></thead><tbody>";
        -				daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
        -				if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
        -					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
        -				}
        -				leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
        -				curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
        -				numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
        -				this.maxRows = numRows;
        -				printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
        -				for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
        -					calender += "<tr>";
        -					tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
        -						this._get(inst, "calculateWeek")(printDate) + "</td>");
        -					for (dow = 0; dow < 7; dow++) { // create date picker days
        -						daySettings = (beforeShowDay ?
        -							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
        -						otherMonth = (printDate.getMonth() !== drawMonth);
        -						unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
        -							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
        -						tbody += "<td class='" +
        -							((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
        -							(otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
        -							((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
        -							(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
        -							// or defaultDate is current printedDate and defaultDate is selectedDate
        -							" " + this._dayOverClass : "") + // highlight selected day
        -							(unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") +  // highlight unselectable days
        -							(otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
        -							(printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
        -							(printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
        -							((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
        -							(unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
        -							(otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
        -							(unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
        -							(printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
        -							(printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
        -							(otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
        -							"' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
        -						printDate.setDate(printDate.getDate() + 1);
        -						printDate = this._daylightSavingAdjust(printDate);
        -					}
        -					calender += tbody + "</tr>";
        -				}
        -				drawMonth++;
        -				if (drawMonth > 11) {
        -					drawMonth = 0;
        -					drawYear++;
        -				}
        -				calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
        -							((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
        -				group += calender;
        -			}
        -			html += group;
        -		}
        -		html += buttonPanel;
        -		inst._keyEvent = false;
        -		return html;
        -	},
        -
        -	/* Generate the month and year header. */
        -	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
        -			secondary, monthNames, monthNamesShort) {
        -
        -		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
        -			changeMonth = this._get(inst, "changeMonth"),
        -			changeYear = this._get(inst, "changeYear"),
        -			showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
        -			html = "<div class='ui-datepicker-title'>",
        -			monthHtml = "";
        -
        -		// month selection
        -		if (secondary || !changeMonth) {
        -			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
        -		} else {
        -			inMinYear = (minDate && minDate.getFullYear() === drawYear);
        -			inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
        -			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
        -			for ( month = 0; month < 12; month++) {
        -				if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
        -					monthHtml += "<option value='" + month + "'" +
        -						(month === drawMonth ? " selected='selected'" : "") +
        -						">" + monthNamesShort[month] + "</option>";
        -				}
        -			}
        -			monthHtml += "</select>";
        -		}
        -
        -		if (!showMonthAfterYear) {
        -			html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
        -		}
        -
        -		// year selection
        -		if ( !inst.yearshtml ) {
        -			inst.yearshtml = "";
        -			if (secondary || !changeYear) {
        -				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
        -			} else {
        -				// determine range of years to display
        -				years = this._get(inst, "yearRange").split(":");
        -				thisYear = new Date().getFullYear();
        -				determineYear = function(value) {
        -					var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
        -						(value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
        -						parseInt(value, 10)));
        -					return (isNaN(year) ? thisYear : year);
        -				};
        -				year = determineYear(years[0]);
        -				endYear = Math.max(year, determineYear(years[1] || ""));
        -				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
        -				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
        -				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
        -				for (; year <= endYear; year++) {
        -					inst.yearshtml += "<option value='" + year + "'" +
        -						(year === drawYear ? " selected='selected'" : "") +
        -						">" + year + "</option>";
        -				}
        -				inst.yearshtml += "</select>";
        -
        -				html += inst.yearshtml;
        -				inst.yearshtml = null;
        -			}
        -		}
        -
        -		html += this._get(inst, "yearSuffix");
        -		if (showMonthAfterYear) {
        -			html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
        -		}
        -		html += "</div>"; // Close datepicker_header
        -		return html;
        -	},
        -
        -	/* Adjust one of the date sub-fields. */
        -	_adjustInstDate: function(inst, offset, period) {
        -		var year = inst.drawYear + (period === "Y" ? offset : 0),
        -			month = inst.drawMonth + (period === "M" ? offset : 0),
        -			day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
        -			date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
        -
        -		inst.selectedDay = date.getDate();
        -		inst.drawMonth = inst.selectedMonth = date.getMonth();
        -		inst.drawYear = inst.selectedYear = date.getFullYear();
        -		if (period === "M" || period === "Y") {
        -			this._notifyChange(inst);
        -		}
        -	},
        -
        -	/* Ensure a date is within any min/max bounds. */
        -	_restrictMinMax: function(inst, date) {
        -		var minDate = this._getMinMaxDate(inst, "min"),
        -			maxDate = this._getMinMaxDate(inst, "max"),
        -			newDate = (minDate && date < minDate ? minDate : date);
        -		return (maxDate && newDate > maxDate ? maxDate : newDate);
        -	},
        -
        -	/* Notify change of month/year. */
        -	_notifyChange: function(inst) {
        -		var onChange = this._get(inst, "onChangeMonthYear");
        -		if (onChange) {
        -			onChange.apply((inst.input ? inst.input[0] : null),
        -				[inst.selectedYear, inst.selectedMonth + 1, inst]);
        -		}
        -	},
        -
        -	/* Determine the number of months to show. */
        -	_getNumberOfMonths: function(inst) {
        -		var numMonths = this._get(inst, "numberOfMonths");
        -		return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
        -	},
        -
        -	/* Determine the current maximum date - ensure no time components are set. */
        -	_getMinMaxDate: function(inst, minMax) {
        -		return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
        -	},
        -
        -	/* Find the number of days in a given month. */
        -	_getDaysInMonth: function(year, month) {
        -		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
        -	},
        -
        -	/* Find the day of the week of the first of a month. */
        -	_getFirstDayOfMonth: function(year, month) {
        -		return new Date(year, month, 1).getDay();
        -	},
        -
        -	/* Determines if we should allow a "next/prev" month display change. */
        -	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
        -		var numMonths = this._getNumberOfMonths(inst),
        -			date = this._daylightSavingAdjust(new Date(curYear,
        -			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
        -
        -		if (offset < 0) {
        -			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
        -		}
        -		return this._isInRange(inst, date);
        -	},
        -
        -	/* Is the given date in the accepted range? */
        -	_isInRange: function(inst, date) {
        -		var yearSplit, currentYear,
        -			minDate = this._getMinMaxDate(inst, "min"),
        -			maxDate = this._getMinMaxDate(inst, "max"),
        -			minYear = null,
        -			maxYear = null,
        -			years = this._get(inst, "yearRange");
        -			if (years){
        -				yearSplit = years.split(":");
        -				currentYear = new Date().getFullYear();
        -				minYear = parseInt(yearSplit[0], 10);
        -				maxYear = parseInt(yearSplit[1], 10);
        -				if ( yearSplit[0].match(/[+\-].*/) ) {
        -					minYear += currentYear;
        -				}
        -				if ( yearSplit[1].match(/[+\-].*/) ) {
        -					maxYear += currentYear;
        -				}
        -			}
        -
        -		return ((!minDate || date.getTime() >= minDate.getTime()) &&
        -			(!maxDate || date.getTime() <= maxDate.getTime()) &&
        -			(!minYear || date.getFullYear() >= minYear) &&
        -			(!maxYear || date.getFullYear() <= maxYear));
        -	},
        -
        -	/* Provide the configuration settings for formatting/parsing. */
        -	_getFormatConfig: function(inst) {
        -		var shortYearCutoff = this._get(inst, "shortYearCutoff");
        -		shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
        -			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
        -		return {shortYearCutoff: shortYearCutoff,
        -			dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
        -			monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
        -	},
        -
        -	/* Format the given date for display. */
        -	_formatDate: function(inst, day, month, year) {
        -		if (!day) {
        -			inst.currentDay = inst.selectedDay;
        -			inst.currentMonth = inst.selectedMonth;
        -			inst.currentYear = inst.selectedYear;
        -		}
        -		var date = (day ? (typeof day === "object" ? day :
        -			this._daylightSavingAdjust(new Date(year, month, day))) :
        -			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
        -		return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
        -	}
        -});
        -
        -/*
        - * Bind hover events for datepicker elements.
        - * Done via delegate so the binding only occurs once in the lifetime of the parent div.
        - * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
        - */
        -function datepicker_bindHover(dpDiv) {
        -	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
        -	return dpDiv.delegate(selector, "mouseout", function() {
        -			$(this).removeClass("ui-state-hover");
        -			if (this.className.indexOf("ui-datepicker-prev") !== -1) {
        -				$(this).removeClass("ui-datepicker-prev-hover");
        -			}
        -			if (this.className.indexOf("ui-datepicker-next") !== -1) {
        -				$(this).removeClass("ui-datepicker-next-hover");
        -			}
        -		})
        -		.delegate( selector, "mouseover", datepicker_handleMouseover );
        -}
        -
        -function datepicker_handleMouseover() {
        -	if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
        -		$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
        -		$(this).addClass("ui-state-hover");
        -		if (this.className.indexOf("ui-datepicker-prev") !== -1) {
        -			$(this).addClass("ui-datepicker-prev-hover");
        -		}
        -		if (this.className.indexOf("ui-datepicker-next") !== -1) {
        -			$(this).addClass("ui-datepicker-next-hover");
        -		}
        -	}
        -}
        -
        -/* jQuery extend now ignores nulls! */
        -function datepicker_extendRemove(target, props) {
        -	$.extend(target, props);
        -	for (var name in props) {
        -		if (props[name] == null) {
        -			target[name] = props[name];
        -		}
        -	}
        -	return target;
        -}
        -
        -/* Invoke the datepicker functionality.
        -   @param  options  string - a command, optionally followed by additional parameters or
        -					Object - settings for attaching new datepicker functionality
        -   @return  jQuery object */
        -$.fn.datepicker = function(options){
        -
        -	/* Verify an empty collection wasn't passed - Fixes #6976 */
        -	if ( !this.length ) {
        -		return this;
        -	}
        -
        -	/* Initialise the date picker. */
        -	if (!$.datepicker.initialized) {
        -		$(document).mousedown($.datepicker._checkExternalClick);
        -		$.datepicker.initialized = true;
        -	}
        -
        -	/* Append datepicker main container to body if not exist. */
        -	if ($("#"+$.datepicker._mainDivId).length === 0) {
        -		$("body").append($.datepicker.dpDiv);
        -	}
        -
        -	var otherArgs = Array.prototype.slice.call(arguments, 1);
        -	if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
        -		return $.datepicker["_" + options + "Datepicker"].
        -			apply($.datepicker, [this[0]].concat(otherArgs));
        -	}
        -	if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
        -		return $.datepicker["_" + options + "Datepicker"].
        -			apply($.datepicker, [this[0]].concat(otherArgs));
        -	}
        -	return this.each(function() {
        -		typeof options === "string" ?
        -			$.datepicker["_" + options + "Datepicker"].
        -				apply($.datepicker, [this].concat(otherArgs)) :
        -			$.datepicker._attachDatepicker(this, options);
        -	});
        -};
        -
        -$.datepicker = new Datepicker(); // singleton instance
        -$.datepicker.initialized = false;
        -$.datepicker.uuid = new Date().getTime();
        -$.datepicker.version = "1.11.4";
        -
        -var datepicker = $.datepicker;
        -
        -
        -/*!
        - * jQuery UI Draggable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/draggable/
        - */
        -
        -
        -$.widget("ui.draggable", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "drag",
        -	options: {
        -		addClasses: true,
        -		appendTo: "parent",
        -		axis: false,
        -		connectToSortable: false,
        -		containment: false,
        -		cursor: "auto",
        -		cursorAt: false,
        -		grid: false,
        -		handle: false,
        -		helper: "original",
        -		iframeFix: false,
        -		opacity: false,
        -		refreshPositions: false,
        -		revert: false,
        -		revertDuration: 500,
        -		scope: "default",
        -		scroll: true,
        -		scrollSensitivity: 20,
        -		scrollSpeed: 20,
        -		snap: false,
        -		snapMode: "both",
        -		snapTolerance: 20,
        -		stack: false,
        -		zIndex: false,
        -
        -		// callbacks
        -		drag: null,
        -		start: null,
        -		stop: null
        -	},
        -	_create: function() {
        -
        -		if ( this.options.helper === "original" ) {
        -			this._setPositionRelative();
        -		}
        -		if (this.options.addClasses){
        -			this.element.addClass("ui-draggable");
        -		}
        -		if (this.options.disabled){
        -			this.element.addClass("ui-draggable-disabled");
        -		}
        -		this._setHandleClassName();
        -
        -		this._mouseInit();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -		if ( key === "handle" ) {
        -			this._removeHandleClassName();
        -			this._setHandleClassName();
        -		}
        -	},
        -
        -	_destroy: function() {
        -		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
        -			this.destroyOnClear = true;
        -			return;
        -		}
        -		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
        -		this._removeHandleClassName();
        -		this._mouseDestroy();
        -	},
        -
        -	_mouseCapture: function(event) {
        -		var o = this.options;
        -
        -		this._blurActiveElement( event );
        -
        -		// among others, prevent a drag on a resizable-handle
        -		if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
        -			return false;
        -		}
        -
        -		//Quit if we're not on a valid handle
        -		this.handle = this._getHandle(event);
        -		if (!this.handle) {
        -			return false;
        -		}
        -
        -		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
        -
        -		return true;
        -
        -	},
        -
        -	_blockFrames: function( selector ) {
        -		this.iframeBlocks = this.document.find( selector ).map(function() {
        -			var iframe = $( this );
        -
        -			return $( "<div>" )
        -				.css( "position", "absolute" )
        -				.appendTo( iframe.parent() )
        -				.outerWidth( iframe.outerWidth() )
        -				.outerHeight( iframe.outerHeight() )
        -				.offset( iframe.offset() )[ 0 ];
        -		});
        -	},
        -
        -	_unblockFrames: function() {
        -		if ( this.iframeBlocks ) {
        -			this.iframeBlocks.remove();
        -			delete this.iframeBlocks;
        -		}
        -	},
        -
        -	_blurActiveElement: function( event ) {
        -		var document = this.document[ 0 ];
        -
        -		// Only need to blur if the event occurred on the draggable itself, see #10527
        -		if ( !this.handleElement.is( event.target ) ) {
        -			return;
        -		}
        -
        -		// support: IE9
        -		// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
        -		try {
        -
        -			// Support: IE9, IE10
        -			// If the <body> is blurred, IE will switch windows, see #9520
        -			if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
        -
        -				// Blur any element that currently has focus, see #4261
        -				$( document.activeElement ).blur();
        -			}
        -		} catch ( error ) {}
        -	},
        -
        -	_mouseStart: function(event) {
        -
        -		var o = this.options;
        -
        -		//Create and append the visible helper
        -		this.helper = this._createHelper(event);
        -
        -		this.helper.addClass("ui-draggable-dragging");
        -
        -		//Cache the helper size
        -		this._cacheHelperProportions();
        -
        -		//If ddmanager is used for droppables, set the global draggable
        -		if ($.ui.ddmanager) {
        -			$.ui.ddmanager.current = this;
        -		}
        -
        -		/*
        -		 * - Position generation -
        -		 * This block generates everything position related - it's the core of draggables.
        -		 */
        -
        -		//Cache the margins of the original element
        -		this._cacheMargins();
        -
        -		//Store the helper's css position
        -		this.cssPosition = this.helper.css( "position" );
        -		this.scrollParent = this.helper.scrollParent( true );
        -		this.offsetParent = this.helper.offsetParent();
        -		this.hasFixedAncestor = this.helper.parents().filter(function() {
        -				return $( this ).css( "position" ) === "fixed";
        -			}).length > 0;
        -
        -		//The element's absolute position on the page minus margins
        -		this.positionAbs = this.element.offset();
        -		this._refreshOffsets( event );
        -
        -		//Generate the original position
        -		this.originalPosition = this.position = this._generatePosition( event, false );
        -		this.originalPageX = event.pageX;
        -		this.originalPageY = event.pageY;
        -
        -		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        -		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
        -
        -		//Set a containment if given in the options
        -		this._setContainment();
        -
        -		//Trigger event + callbacks
        -		if (this._trigger("start", event) === false) {
        -			this._clear();
        -			return false;
        -		}
        -
        -		//Recache the helper size
        -		this._cacheHelperProportions();
        -
        -		//Prepare the droppable offsets
        -		if ($.ui.ddmanager && !o.dropBehaviour) {
        -			$.ui.ddmanager.prepareOffsets(this, event);
        -		}
        -
        -		// Reset helper's right/bottom css if they're set and set explicit width/height instead
        -		// as this prevents resizing of elements with right/bottom set (see #7772)
        -		this._normalizeRightBottom();
        -
        -		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
        -
        -		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
        -		if ( $.ui.ddmanager ) {
        -			$.ui.ddmanager.dragStart(this, event);
        -		}
        -
        -		return true;
        -	},
        -
        -	_refreshOffsets: function( event ) {
        -		this.offset = {
        -			top: this.positionAbs.top - this.margins.top,
        -			left: this.positionAbs.left - this.margins.left,
        -			scroll: false,
        -			parent: this._getParentOffset(),
        -			relative: this._getRelativeOffset()
        -		};
        -
        -		this.offset.click = {
        -			left: event.pageX - this.offset.left,
        -			top: event.pageY - this.offset.top
        -		};
        -	},
        -
        -	_mouseDrag: function(event, noPropagation) {
        -		// reset any necessary cached properties (see #5009)
        -		if ( this.hasFixedAncestor ) {
        -			this.offset.parent = this._getParentOffset();
        -		}
        -
        -		//Compute the helpers position
        -		this.position = this._generatePosition( event, true );
        -		this.positionAbs = this._convertPositionTo("absolute");
        -
        -		//Call plugins and callbacks and use the resulting position if something is returned
        -		if (!noPropagation) {
        -			var ui = this._uiHash();
        -			if (this._trigger("drag", event, ui) === false) {
        -				this._mouseUp({});
        -				return false;
        -			}
        -			this.position = ui.position;
        -		}
        -
        -		this.helper[ 0 ].style.left = this.position.left + "px";
        -		this.helper[ 0 ].style.top = this.position.top + "px";
        -
        -		if ($.ui.ddmanager) {
        -			$.ui.ddmanager.drag(this, event);
        -		}
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function(event) {
        -
        -		//If we are using droppables, inform the manager about the drop
        -		var that = this,
        -			dropped = false;
        -		if ($.ui.ddmanager && !this.options.dropBehaviour) {
        -			dropped = $.ui.ddmanager.drop(this, event);
        -		}
        -
        -		//if a drop comes from outside (a sortable)
        -		if (this.dropped) {
        -			dropped = this.dropped;
        -			this.dropped = false;
        -		}
        -
        -		if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
        -			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
        -				if (that._trigger("stop", event) !== false) {
        -					that._clear();
        -				}
        -			});
        -		} else {
        -			if (this._trigger("stop", event) !== false) {
        -				this._clear();
        -			}
        -		}
        -
        -		return false;
        -	},
        -
        -	_mouseUp: function( event ) {
        -		this._unblockFrames();
        -
        -		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
        -		if ( $.ui.ddmanager ) {
        -			$.ui.ddmanager.dragStop(this, event);
        -		}
        -
        -		// Only need to focus if the event occurred on the draggable itself, see #10527
        -		if ( this.handleElement.is( event.target ) ) {
        -			// The interaction is over; whether or not the click resulted in a drag, focus the element
        -			this.element.focus();
        -		}
        -
        -		return $.ui.mouse.prototype._mouseUp.call(this, event);
        -	},
        -
        -	cancel: function() {
        -
        -		if (this.helper.is(".ui-draggable-dragging")) {
        -			this._mouseUp({});
        -		} else {
        -			this._clear();
        -		}
        -
        -		return this;
        -
        -	},
        -
        -	_getHandle: function(event) {
        -		return this.options.handle ?
        -			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
        -			true;
        -	},
        -
        -	_setHandleClassName: function() {
        -		this.handleElement = this.options.handle ?
        -			this.element.find( this.options.handle ) : this.element;
        -		this.handleElement.addClass( "ui-draggable-handle" );
        -	},
        -
        -	_removeHandleClassName: function() {
        -		this.handleElement.removeClass( "ui-draggable-handle" );
        -	},
        -
        -	_createHelper: function(event) {
        -
        -		var o = this.options,
        -			helperIsFunction = $.isFunction( o.helper ),
        -			helper = helperIsFunction ?
        -				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
        -				( o.helper === "clone" ?
        -					this.element.clone().removeAttr( "id" ) :
        -					this.element );
        -
        -		if (!helper.parents("body").length) {
        -			helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
        -		}
        -
        -		// http://bugs.jqueryui.com/ticket/9446
        -		// a helper function can return the original element
        -		// which wouldn't have been set to relative in _create
        -		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
        -			this._setPositionRelative();
        -		}
        -
        -		if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
        -			helper.css("position", "absolute");
        -		}
        -
        -		return helper;
        -
        -	},
        -
        -	_setPositionRelative: function() {
        -		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
        -			this.element[ 0 ].style.position = "relative";
        -		}
        -	},
        -
        -	_adjustOffsetFromHelper: function(obj) {
        -		if (typeof obj === "string") {
        -			obj = obj.split(" ");
        -		}
        -		if ($.isArray(obj)) {
        -			obj = { left: +obj[0], top: +obj[1] || 0 };
        -		}
        -		if ("left" in obj) {
        -			this.offset.click.left = obj.left + this.margins.left;
        -		}
        -		if ("right" in obj) {
        -			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        -		}
        -		if ("top" in obj) {
        -			this.offset.click.top = obj.top + this.margins.top;
        -		}
        -		if ("bottom" in obj) {
        -			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        -		}
        -	},
        -
        -	_isRootNode: function( element ) {
        -		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
        -	},
        -
        -	_getParentOffset: function() {
        -
        -		//Get the offsetParent and cache its position
        -		var po = this.offsetParent.offset(),
        -			document = this.document[ 0 ];
        -
        -		// This is a special case where we need to modify a offset calculated on start, since the following happened:
        -		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
        -		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
        -		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
        -		if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
        -			po.left += this.scrollParent.scrollLeft();
        -			po.top += this.scrollParent.scrollTop();
        -		}
        -
        -		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
        -			po = { top: 0, left: 0 };
        -		}
        -
        -		return {
        -			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
        -			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
        -		};
        -
        -	},
        -
        -	_getRelativeOffset: function() {
        -		if ( this.cssPosition !== "relative" ) {
        -			return { top: 0, left: 0 };
        -		}
        -
        -		var p = this.element.position(),
        -			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        -
        -		return {
        -			top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
        -			left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
        -		};
        -
        -	},
        -
        -	_cacheMargins: function() {
        -		this.margins = {
        -			left: (parseInt(this.element.css("marginLeft"), 10) || 0),
        -			top: (parseInt(this.element.css("marginTop"), 10) || 0),
        -			right: (parseInt(this.element.css("marginRight"), 10) || 0),
        -			bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
        -		};
        -	},
        -
        -	_cacheHelperProportions: function() {
        -		this.helperProportions = {
        -			width: this.helper.outerWidth(),
        -			height: this.helper.outerHeight()
        -		};
        -	},
        -
        -	_setContainment: function() {
        -
        -		var isUserScrollable, c, ce,
        -			o = this.options,
        -			document = this.document[ 0 ];
        -
        -		this.relativeContainer = null;
        -
        -		if ( !o.containment ) {
        -			this.containment = null;
        -			return;
        -		}
        -
        -		if ( o.containment === "window" ) {
        -			this.containment = [
        -				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
        -				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
        -				$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
        -				$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
        -			];
        -			return;
        -		}
        -
        -		if ( o.containment === "document") {
        -			this.containment = [
        -				0,
        -				0,
        -				$( document ).width() - this.helperProportions.width - this.margins.left,
        -				( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
        -			];
        -			return;
        -		}
        -
        -		if ( o.containment.constructor === Array ) {
        -			this.containment = o.containment;
        -			return;
        -		}
        -
        -		if ( o.containment === "parent" ) {
        -			o.containment = this.helper[ 0 ].parentNode;
        -		}
        -
        -		c = $( o.containment );
        -		ce = c[ 0 ];
        -
        -		if ( !ce ) {
        -			return;
        -		}
        -
        -		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
        -
        -		this.containment = [
        -			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
        -			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
        -			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
        -				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
        -				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
        -				this.helperProportions.width -
        -				this.margins.left -
        -				this.margins.right,
        -			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
        -				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
        -				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
        -				this.helperProportions.height -
        -				this.margins.top -
        -				this.margins.bottom
        -		];
        -		this.relativeContainer = c;
        -	},
        -
        -	_convertPositionTo: function(d, pos) {
        -
        -		if (!pos) {
        -			pos = this.position;
        -		}
        -
        -		var mod = d === "absolute" ? 1 : -1,
        -			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        -
        -		return {
        -			top: (
        -				pos.top	+																// The absolute mouse position
        -				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top * mod -										// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
        -			),
        -			left: (
        -				pos.left +																// The absolute mouse position
        -				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
        -			)
        -		};
        -
        -	},
        -
        -	_generatePosition: function( event, constrainPosition ) {
        -
        -		var containment, co, top, left,
        -			o = this.options,
        -			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
        -			pageX = event.pageX,
        -			pageY = event.pageY;
        -
        -		// Cache the scroll
        -		if ( !scrollIsRootNode || !this.offset.scroll ) {
        -			this.offset.scroll = {
        -				top: this.scrollParent.scrollTop(),
        -				left: this.scrollParent.scrollLeft()
        -			};
        -		}
        -
        -		/*
        -		 * - Position constraining -
        -		 * Constrain the position to a mix of grid, containment.
        -		 */
        -
        -		// If we are not dragging yet, we won't check for options
        -		if ( constrainPosition ) {
        -			if ( this.containment ) {
        -				if ( this.relativeContainer ){
        -					co = this.relativeContainer.offset();
        -					containment = [
        -						this.containment[ 0 ] + co.left,
        -						this.containment[ 1 ] + co.top,
        -						this.containment[ 2 ] + co.left,
        -						this.containment[ 3 ] + co.top
        -					];
        -				} else {
        -					containment = this.containment;
        -				}
        -
        -				if (event.pageX - this.offset.click.left < containment[0]) {
        -					pageX = containment[0] + this.offset.click.left;
        -				}
        -				if (event.pageY - this.offset.click.top < containment[1]) {
        -					pageY = containment[1] + this.offset.click.top;
        -				}
        -				if (event.pageX - this.offset.click.left > containment[2]) {
        -					pageX = containment[2] + this.offset.click.left;
        -				}
        -				if (event.pageY - this.offset.click.top > containment[3]) {
        -					pageY = containment[3] + this.offset.click.top;
        -				}
        -			}
        -
        -			if (o.grid) {
        -				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
        -				top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
        -				pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
        -
        -				left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
        -				pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
        -			}
        -
        -			if ( o.axis === "y" ) {
        -				pageX = this.originalPageX;
        -			}
        -
        -			if ( o.axis === "x" ) {
        -				pageY = this.originalPageY;
        -			}
        -		}
        -
        -		return {
        -			top: (
        -				pageY -																	// The absolute mouse position
        -				this.offset.click.top	-												// Click offset (relative to the element)
        -				this.offset.relative.top -												// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
        -				( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
        -			),
        -			left: (
        -				pageX -																	// The absolute mouse position
        -				this.offset.click.left -												// Click offset (relative to the element)
        -				this.offset.relative.left -												// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
        -				( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
        -			)
        -		};
        -
        -	},
        -
        -	_clear: function() {
        -		this.helper.removeClass("ui-draggable-dragging");
        -		if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
        -			this.helper.remove();
        -		}
        -		this.helper = null;
        -		this.cancelHelperRemoval = false;
        -		if ( this.destroyOnClear ) {
        -			this.destroy();
        -		}
        -	},
        -
        -	_normalizeRightBottom: function() {
        -		if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
        -			this.helper.width( this.helper.width() );
        -			this.helper.css( "right", "auto" );
        -		}
        -		if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
        -			this.helper.height( this.helper.height() );
        -			this.helper.css( "bottom", "auto" );
        -		}
        -	},
        -
        -	// From now on bulk stuff - mainly helpers
        -
        -	_trigger: function( type, event, ui ) {
        -		ui = ui || this._uiHash();
        -		$.ui.plugin.call( this, type, [ event, ui, this ], true );
        -
        -		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
        -		if ( /^(drag|start|stop)/.test( type ) ) {
        -			this.positionAbs = this._convertPositionTo( "absolute" );
        -			ui.offset = this.positionAbs;
        -		}
        -		return $.Widget.prototype._trigger.call( this, type, event, ui );
        -	},
        -
        -	plugins: {},
        -
        -	_uiHash: function() {
        -		return {
        -			helper: this.helper,
        -			position: this.position,
        -			originalPosition: this.originalPosition,
        -			offset: this.positionAbs
        -		};
        -	}
        -
        -});
        -
        -$.ui.plugin.add( "draggable", "connectToSortable", {
        -	start: function( event, ui, draggable ) {
        -		var uiSortable = $.extend( {}, ui, {
        -			item: draggable.element
        -		});
        -
        -		draggable.sortables = [];
        -		$( draggable.options.connectToSortable ).each(function() {
        -			var sortable = $( this ).sortable( "instance" );
        -
        -			if ( sortable && !sortable.options.disabled ) {
        -				draggable.sortables.push( sortable );
        -
        -				// refreshPositions is called at drag start to refresh the containerCache
        -				// which is used in drag. This ensures it's initialized and synchronized
        -				// with any changes that might have happened on the page since initialization.
        -				sortable.refreshPositions();
        -				sortable._trigger("activate", event, uiSortable);
        -			}
        -		});
        -	},
        -	stop: function( event, ui, draggable ) {
        -		var uiSortable = $.extend( {}, ui, {
        -			item: draggable.element
        -		});
        -
        -		draggable.cancelHelperRemoval = false;
        -
        -		$.each( draggable.sortables, function() {
        -			var sortable = this;
        -
        -			if ( sortable.isOver ) {
        -				sortable.isOver = 0;
        -
        -				// Allow this sortable to handle removing the helper
        -				draggable.cancelHelperRemoval = true;
        -				sortable.cancelHelperRemoval = false;
        -
        -				// Use _storedCSS To restore properties in the sortable,
        -				// as this also handles revert (#9675) since the draggable
        -				// may have modified them in unexpected ways (#8809)
        -				sortable._storedCSS = {
        -					position: sortable.placeholder.css( "position" ),
        -					top: sortable.placeholder.css( "top" ),
        -					left: sortable.placeholder.css( "left" )
        -				};
        -
        -				sortable._mouseStop(event);
        -
        -				// Once drag has ended, the sortable should return to using
        -				// its original helper, not the shared helper from draggable
        -				sortable.options.helper = sortable.options._helper;
        -			} else {
        -				// Prevent this Sortable from removing the helper.
        -				// However, don't set the draggable to remove the helper
        -				// either as another connected Sortable may yet handle the removal.
        -				sortable.cancelHelperRemoval = true;
        -
        -				sortable._trigger( "deactivate", event, uiSortable );
        -			}
        -		});
        -	},
        -	drag: function( event, ui, draggable ) {
        -		$.each( draggable.sortables, function() {
        -			var innermostIntersecting = false,
        -				sortable = this;
        -
        -			// Copy over variables that sortable's _intersectsWith uses
        -			sortable.positionAbs = draggable.positionAbs;
        -			sortable.helperProportions = draggable.helperProportions;
        -			sortable.offset.click = draggable.offset.click;
        -
        -			if ( sortable._intersectsWith( sortable.containerCache ) ) {
        -				innermostIntersecting = true;
        -
        -				$.each( draggable.sortables, function() {
        -					// Copy over variables that sortable's _intersectsWith uses
        -					this.positionAbs = draggable.positionAbs;
        -					this.helperProportions = draggable.helperProportions;
        -					this.offset.click = draggable.offset.click;
        -
        -					if ( this !== sortable &&
        -							this._intersectsWith( this.containerCache ) &&
        -							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
        -						innermostIntersecting = false;
        -					}
        -
        -					return innermostIntersecting;
        -				});
        -			}
        -
        -			if ( innermostIntersecting ) {
        -				// If it intersects, we use a little isOver variable and set it once,
        -				// so that the move-in stuff gets fired only once.
        -				if ( !sortable.isOver ) {
        -					sortable.isOver = 1;
        -
        -					// Store draggable's parent in case we need to reappend to it later.
        -					draggable._parent = ui.helper.parent();
        -
        -					sortable.currentItem = ui.helper
        -						.appendTo( sortable.element )
        -						.data( "ui-sortable-item", true );
        -
        -					// Store helper option to later restore it
        -					sortable.options._helper = sortable.options.helper;
        -
        -					sortable.options.helper = function() {
        -						return ui.helper[ 0 ];
        -					};
        -
        -					// Fire the start events of the sortable with our passed browser event,
        -					// and our own helper (so it doesn't create a new one)
        -					event.target = sortable.currentItem[ 0 ];
        -					sortable._mouseCapture( event, true );
        -					sortable._mouseStart( event, true, true );
        -
        -					// Because the browser event is way off the new appended portlet,
        -					// modify necessary variables to reflect the changes
        -					sortable.offset.click.top = draggable.offset.click.top;
        -					sortable.offset.click.left = draggable.offset.click.left;
        -					sortable.offset.parent.left -= draggable.offset.parent.left -
        -						sortable.offset.parent.left;
        -					sortable.offset.parent.top -= draggable.offset.parent.top -
        -						sortable.offset.parent.top;
        -
        -					draggable._trigger( "toSortable", event );
        -
        -					// Inform draggable that the helper is in a valid drop zone,
        -					// used solely in the revert option to handle "valid/invalid".
        -					draggable.dropped = sortable.element;
        -
        -					// Need to refreshPositions of all sortables in the case that
        -					// adding to one sortable changes the location of the other sortables (#9675)
        -					$.each( draggable.sortables, function() {
        -						this.refreshPositions();
        -					});
        -
        -					// hack so receive/update callbacks work (mostly)
        -					draggable.currentItem = draggable.element;
        -					sortable.fromOutside = draggable;
        -				}
        -
        -				if ( sortable.currentItem ) {
        -					sortable._mouseDrag( event );
        -					// Copy the sortable's position because the draggable's can potentially reflect
        -					// a relative position, while sortable is always absolute, which the dragged
        -					// element has now become. (#8809)
        -					ui.position = sortable.position;
        -				}
        -			} else {
        -				// If it doesn't intersect with the sortable, and it intersected before,
        -				// we fake the drag stop of the sortable, but make sure it doesn't remove
        -				// the helper by using cancelHelperRemoval.
        -				if ( sortable.isOver ) {
        -
        -					sortable.isOver = 0;
        -					sortable.cancelHelperRemoval = true;
        -
        -					// Calling sortable's mouseStop would trigger a revert,
        -					// so revert must be temporarily false until after mouseStop is called.
        -					sortable.options._revert = sortable.options.revert;
        -					sortable.options.revert = false;
        -
        -					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
        -					sortable._mouseStop( event, true );
        -
        -					// restore sortable behaviors that were modfied
        -					// when the draggable entered the sortable area (#9481)
        -					sortable.options.revert = sortable.options._revert;
        -					sortable.options.helper = sortable.options._helper;
        -
        -					if ( sortable.placeholder ) {
        -						sortable.placeholder.remove();
        -					}
        -
        -					// Restore and recalculate the draggable's offset considering the sortable
        -					// may have modified them in unexpected ways. (#8809, #10669)
        -					ui.helper.appendTo( draggable._parent );
        -					draggable._refreshOffsets( event );
        -					ui.position = draggable._generatePosition( event, true );
        -
        -					draggable._trigger( "fromSortable", event );
        -
        -					// Inform draggable that the helper is no longer in a valid drop zone
        -					draggable.dropped = false;
        -
        -					// Need to refreshPositions of all sortables just in case removing
        -					// from one sortable changes the location of other sortables (#9675)
        -					$.each( draggable.sortables, function() {
        -						this.refreshPositions();
        -					});
        -				}
        -			}
        -		});
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "cursor", {
        -	start: function( event, ui, instance ) {
        -		var t = $( "body" ),
        -			o = instance.options;
        -
        -		if (t.css("cursor")) {
        -			o._cursor = t.css("cursor");
        -		}
        -		t.css("cursor", o.cursor);
        -	},
        -	stop: function( event, ui, instance ) {
        -		var o = instance.options;
        -		if (o._cursor) {
        -			$("body").css("cursor", o._cursor);
        -		}
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "opacity", {
        -	start: function( event, ui, instance ) {
        -		var t = $( ui.helper ),
        -			o = instance.options;
        -		if (t.css("opacity")) {
        -			o._opacity = t.css("opacity");
        -		}
        -		t.css("opacity", o.opacity);
        -	},
        -	stop: function( event, ui, instance ) {
        -		var o = instance.options;
        -		if (o._opacity) {
        -			$(ui.helper).css("opacity", o._opacity);
        -		}
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "scroll", {
        -	start: function( event, ui, i ) {
        -		if ( !i.scrollParentNotHidden ) {
        -			i.scrollParentNotHidden = i.helper.scrollParent( false );
        -		}
        -
        -		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
        -			i.overflowOffset = i.scrollParentNotHidden.offset();
        -		}
        -	},
        -	drag: function( event, ui, i  ) {
        -
        -		var o = i.options,
        -			scrolled = false,
        -			scrollParent = i.scrollParentNotHidden[ 0 ],
        -			document = i.document[ 0 ];
        -
        -		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
        -			if ( !o.axis || o.axis !== "x" ) {
        -				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
        -					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
        -				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
        -					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
        -				}
        -			}
        -
        -			if ( !o.axis || o.axis !== "y" ) {
        -				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
        -					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
        -				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
        -					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
        -				}
        -			}
        -
        -		} else {
        -
        -			if (!o.axis || o.axis !== "x") {
        -				if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
        -					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
        -				} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
        -					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
        -				}
        -			}
        -
        -			if (!o.axis || o.axis !== "y") {
        -				if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
        -					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
        -				} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
        -					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
        -				}
        -			}
        -
        -		}
        -
        -		if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
        -			$.ui.ddmanager.prepareOffsets(i, event);
        -		}
        -
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "snap", {
        -	start: function( event, ui, i ) {
        -
        -		var o = i.options;
        -
        -		i.snapElements = [];
        -
        -		$(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
        -			var $t = $(this),
        -				$o = $t.offset();
        -			if (this !== i.element[0]) {
        -				i.snapElements.push({
        -					item: this,
        -					width: $t.outerWidth(), height: $t.outerHeight(),
        -					top: $o.top, left: $o.left
        -				});
        -			}
        -		});
        -
        -	},
        -	drag: function( event, ui, inst ) {
        -
        -		var ts, bs, ls, rs, l, r, t, b, i, first,
        -			o = inst.options,
        -			d = o.snapTolerance,
        -			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
        -			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
        -
        -		for (i = inst.snapElements.length - 1; i >= 0; i--){
        -
        -			l = inst.snapElements[i].left - inst.margins.left;
        -			r = l + inst.snapElements[i].width;
        -			t = inst.snapElements[i].top - inst.margins.top;
        -			b = t + inst.snapElements[i].height;
        -
        -			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
        -				if (inst.snapElements[i].snapping) {
        -					(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
        -				}
        -				inst.snapElements[i].snapping = false;
        -				continue;
        -			}
        -
        -			if (o.snapMode !== "inner") {
        -				ts = Math.abs(t - y2) <= d;
        -				bs = Math.abs(b - y1) <= d;
        -				ls = Math.abs(l - x2) <= d;
        -				rs = Math.abs(r - x1) <= d;
        -				if (ts) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
        -				}
        -				if (bs) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top;
        -				}
        -				if (ls) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
        -				}
        -				if (rs) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left;
        -				}
        -			}
        -
        -			first = (ts || bs || ls || rs);
        -
        -			if (o.snapMode !== "outer") {
        -				ts = Math.abs(t - y1) <= d;
        -				bs = Math.abs(b - y2) <= d;
        -				ls = Math.abs(l - x1) <= d;
        -				rs = Math.abs(r - x2) <= d;
        -				if (ts) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top;
        -				}
        -				if (bs) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
        -				}
        -				if (ls) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left;
        -				}
        -				if (rs) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
        -				}
        -			}
        -
        -			if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
        -				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
        -			}
        -			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
        -
        -		}
        -
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "stack", {
        -	start: function( event, ui, instance ) {
        -		var min,
        -			o = instance.options,
        -			group = $.makeArray($(o.stack)).sort(function(a, b) {
        -				return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
        -			});
        -
        -		if (!group.length) { return; }
        -
        -		min = parseInt($(group[0]).css("zIndex"), 10) || 0;
        -		$(group).each(function(i) {
        -			$(this).css("zIndex", min + i);
        -		});
        -		this.css("zIndex", (min + group.length));
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "zIndex", {
        -	start: function( event, ui, instance ) {
        -		var t = $( ui.helper ),
        -			o = instance.options;
        -
        -		if (t.css("zIndex")) {
        -			o._zIndex = t.css("zIndex");
        -		}
        -		t.css("zIndex", o.zIndex);
        -	},
        -	stop: function( event, ui, instance ) {
        -		var o = instance.options;
        -
        -		if (o._zIndex) {
        -			$(ui.helper).css("zIndex", o._zIndex);
        -		}
        -	}
        -});
        -
        -var draggable = $.ui.draggable;
        -
        -
        -/*!
        - * jQuery UI Resizable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/resizable/
        - */
        -
        -
        -$.widget("ui.resizable", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "resize",
        -	options: {
        -		alsoResize: false,
        -		animate: false,
        -		animateDuration: "slow",
        -		animateEasing: "swing",
        -		aspectRatio: false,
        -		autoHide: false,
        -		containment: false,
        -		ghost: false,
        -		grid: false,
        -		handles: "e,s,se",
        -		helper: false,
        -		maxHeight: null,
        -		maxWidth: null,
        -		minHeight: 10,
        -		minWidth: 10,
        -		// See #7960
        -		zIndex: 90,
        -
        -		// callbacks
        -		resize: null,
        -		start: null,
        -		stop: null
        -	},
        -
        -	_num: function( value ) {
        -		return parseInt( value, 10 ) || 0;
        -	},
        -
        -	_isNumber: function( value ) {
        -		return !isNaN( parseInt( value, 10 ) );
        -	},
        -
        -	_hasScroll: function( el, a ) {
        -
        -		if ( $( el ).css( "overflow" ) === "hidden") {
        -			return false;
        -		}
        -
        -		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
        -			has = false;
        -
        -		if ( el[ scroll ] > 0 ) {
        -			return true;
        -		}
        -
        -		// TODO: determine which cases actually cause this to happen
        -		// if the element doesn't have the scroll set, see if it's possible to
        -		// set the scroll
        -		el[ scroll ] = 1;
        -		has = ( el[ scroll ] > 0 );
        -		el[ scroll ] = 0;
        -		return has;
        -	},
        -
        -	_create: function() {
        -
        -		var n, i, handle, axis, hname,
        -			that = this,
        -			o = this.options;
        -		this.element.addClass("ui-resizable");
        -
        -		$.extend(this, {
        -			_aspectRatio: !!(o.aspectRatio),
        -			aspectRatio: o.aspectRatio,
        -			originalElement: this.element,
        -			_proportionallyResizeElements: [],
        -			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
        -		});
        -
        -		// Wrap the element if it cannot hold child nodes
        -		if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
        -
        -			this.element.wrap(
        -				$("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
        -					position: this.element.css("position"),
        -					width: this.element.outerWidth(),
        -					height: this.element.outerHeight(),
        -					top: this.element.css("top"),
        -					left: this.element.css("left")
        -				})
        -			);
        -
        -			this.element = this.element.parent().data(
        -				"ui-resizable", this.element.resizable( "instance" )
        -			);
        -
        -			this.elementIsWrapper = true;
        -
        -			this.element.css({
        -				marginLeft: this.originalElement.css("marginLeft"),
        -				marginTop: this.originalElement.css("marginTop"),
        -				marginRight: this.originalElement.css("marginRight"),
        -				marginBottom: this.originalElement.css("marginBottom")
        -			});
        -			this.originalElement.css({
        -				marginLeft: 0,
        -				marginTop: 0,
        -				marginRight: 0,
        -				marginBottom: 0
        -			});
        -			// support: Safari
        -			// Prevent Safari textarea resize
        -			this.originalResizeStyle = this.originalElement.css("resize");
        -			this.originalElement.css("resize", "none");
        -
        -			this._proportionallyResizeElements.push( this.originalElement.css({
        -				position: "static",
        -				zoom: 1,
        -				display: "block"
        -			}) );
        -
        -			// support: IE9
        -			// avoid IE jump (hard set the margin)
        -			this.originalElement.css({ margin: this.originalElement.css("margin") });
        -
        -			this._proportionallyResize();
        -		}
        -
        -		this.handles = o.handles ||
        -			( !$(".ui-resizable-handle", this.element).length ?
        -				"e,s,se" : {
        -					n: ".ui-resizable-n",
        -					e: ".ui-resizable-e",
        -					s: ".ui-resizable-s",
        -					w: ".ui-resizable-w",
        -					se: ".ui-resizable-se",
        -					sw: ".ui-resizable-sw",
        -					ne: ".ui-resizable-ne",
        -					nw: ".ui-resizable-nw"
        -				} );
        -
        -		this._handles = $();
        -		if ( this.handles.constructor === String ) {
        -
        -			if ( this.handles === "all") {
        -				this.handles = "n,e,s,w,se,sw,ne,nw";
        -			}
        -
        -			n = this.handles.split(",");
        -			this.handles = {};
        -
        -			for (i = 0; i < n.length; i++) {
        -
        -				handle = $.trim(n[i]);
        -				hname = "ui-resizable-" + handle;
        -				axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
        -
        -				axis.css({ zIndex: o.zIndex });
        -
        -				// TODO : What's going on here?
        -				if ("se" === handle) {
        -					axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
        -				}
        -
        -				this.handles[handle] = ".ui-resizable-" + handle;
        -				this.element.append(axis);
        -			}
        -
        -		}
        -
        -		this._renderAxis = function(target) {
        -
        -			var i, axis, padPos, padWrapper;
        -
        -			target = target || this.element;
        -
        -			for (i in this.handles) {
        -
        -				if (this.handles[i].constructor === String) {
        -					this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
        -				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
        -					this.handles[ i ] = $( this.handles[ i ] );
        -					this._on( this.handles[ i ], { "mousedown": that._mouseDown });
        -				}
        -
        -				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
        -
        -					axis = $(this.handles[i], this.element);
        -
        -					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
        -
        -					padPos = [ "padding",
        -						/ne|nw|n/.test(i) ? "Top" :
        -						/se|sw|s/.test(i) ? "Bottom" :
        -						/^e$/.test(i) ? "Right" : "Left" ].join("");
        -
        -					target.css(padPos, padWrapper);
        -
        -					this._proportionallyResize();
        -				}
        -
        -				this._handles = this._handles.add( this.handles[ i ] );
        -			}
        -		};
        -
        -		// TODO: make renderAxis a prototype function
        -		this._renderAxis(this.element);
        -
        -		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
        -		this._handles.disableSelection();
        -
        -		this._handles.mouseover(function() {
        -			if (!that.resizing) {
        -				if (this.className) {
        -					axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
        -				}
        -				that.axis = axis && axis[1] ? axis[1] : "se";
        -			}
        -		});
        -
        -		if (o.autoHide) {
        -			this._handles.hide();
        -			$(this.element)
        -				.addClass("ui-resizable-autohide")
        -				.mouseenter(function() {
        -					if (o.disabled) {
        -						return;
        -					}
        -					$(this).removeClass("ui-resizable-autohide");
        -					that._handles.show();
        -				})
        -				.mouseleave(function() {
        -					if (o.disabled) {
        -						return;
        -					}
        -					if (!that.resizing) {
        -						$(this).addClass("ui-resizable-autohide");
        -						that._handles.hide();
        -					}
        -				});
        -		}
        -
        -		this._mouseInit();
        -	},
        -
        -	_destroy: function() {
        -
        -		this._mouseDestroy();
        -
        -		var wrapper,
        -			_destroy = function(exp) {
        -				$(exp)
        -					.removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
        -					.removeData("resizable")
        -					.removeData("ui-resizable")
        -					.unbind(".resizable")
        -					.find(".ui-resizable-handle")
        -						.remove();
        -			};
        -
        -		// TODO: Unwrap at same DOM position
        -		if (this.elementIsWrapper) {
        -			_destroy(this.element);
        -			wrapper = this.element;
        -			this.originalElement.css({
        -				position: wrapper.css("position"),
        -				width: wrapper.outerWidth(),
        -				height: wrapper.outerHeight(),
        -				top: wrapper.css("top"),
        -				left: wrapper.css("left")
        -			}).insertAfter( wrapper );
        -			wrapper.remove();
        -		}
        -
        -		this.originalElement.css("resize", this.originalResizeStyle);
        -		_destroy(this.originalElement);
        -
        -		return this;
        -	},
        -
        -	_mouseCapture: function(event) {
        -		var i, handle,
        -			capture = false;
        -
        -		for (i in this.handles) {
        -			handle = $(this.handles[i])[0];
        -			if (handle === event.target || $.contains(handle, event.target)) {
        -				capture = true;
        -			}
        -		}
        -
        -		return !this.options.disabled && capture;
        -	},
        -
        -	_mouseStart: function(event) {
        -
        -		var curleft, curtop, cursor,
        -			o = this.options,
        -			el = this.element;
        -
        -		this.resizing = true;
        -
        -		this._renderProxy();
        -
        -		curleft = this._num(this.helper.css("left"));
        -		curtop = this._num(this.helper.css("top"));
        -
        -		if (o.containment) {
        -			curleft += $(o.containment).scrollLeft() || 0;
        -			curtop += $(o.containment).scrollTop() || 0;
        -		}
        -
        -		this.offset = this.helper.offset();
        -		this.position = { left: curleft, top: curtop };
        -
        -		this.size = this._helper ? {
        -				width: this.helper.width(),
        -				height: this.helper.height()
        -			} : {
        -				width: el.width(),
        -				height: el.height()
        -			};
        -
        -		this.originalSize = this._helper ? {
        -				width: el.outerWidth(),
        -				height: el.outerHeight()
        -			} : {
        -				width: el.width(),
        -				height: el.height()
        -			};
        -
        -		this.sizeDiff = {
        -			width: el.outerWidth() - el.width(),
        -			height: el.outerHeight() - el.height()
        -		};
        -
        -		this.originalPosition = { left: curleft, top: curtop };
        -		this.originalMousePosition = { left: event.pageX, top: event.pageY };
        -
        -		this.aspectRatio = (typeof o.aspectRatio === "number") ?
        -			o.aspectRatio :
        -			((this.originalSize.width / this.originalSize.height) || 1);
        -
        -		cursor = $(".ui-resizable-" + this.axis).css("cursor");
        -		$("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
        -
        -		el.addClass("ui-resizable-resizing");
        -		this._propagate("start", event);
        -		return true;
        -	},
        -
        -	_mouseDrag: function(event) {
        -
        -		var data, props,
        -			smp = this.originalMousePosition,
        -			a = this.axis,
        -			dx = (event.pageX - smp.left) || 0,
        -			dy = (event.pageY - smp.top) || 0,
        -			trigger = this._change[a];
        -
        -		this._updatePrevProperties();
        -
        -		if (!trigger) {
        -			return false;
        -		}
        -
        -		data = trigger.apply(this, [ event, dx, dy ]);
        -
        -		this._updateVirtualBoundaries(event.shiftKey);
        -		if (this._aspectRatio || event.shiftKey) {
        -			data = this._updateRatio(data, event);
        -		}
        -
        -		data = this._respectSize(data, event);
        -
        -		this._updateCache(data);
        -
        -		this._propagate("resize", event);
        -
        -		props = this._applyChanges();
        -
        -		if ( !this._helper && this._proportionallyResizeElements.length ) {
        -			this._proportionallyResize();
        -		}
        -
        -		if ( !$.isEmptyObject( props ) ) {
        -			this._updatePrevProperties();
        -			this._trigger( "resize", event, this.ui() );
        -			this._applyChanges();
        -		}
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function(event) {
        -
        -		this.resizing = false;
        -		var pr, ista, soffseth, soffsetw, s, left, top,
        -			o = this.options, that = this;
        -
        -		if (this._helper) {
        -
        -			pr = this._proportionallyResizeElements;
        -			ista = pr.length && (/textarea/i).test(pr[0].nodeName);
        -			soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
        -			soffsetw = ista ? 0 : that.sizeDiff.width;
        -
        -			s = {
        -				width: (that.helper.width()  - soffsetw),
        -				height: (that.helper.height() - soffseth)
        -			};
        -			left = (parseInt(that.element.css("left"), 10) +
        -				(that.position.left - that.originalPosition.left)) || null;
        -			top = (parseInt(that.element.css("top"), 10) +
        -				(that.position.top - that.originalPosition.top)) || null;
        -
        -			if (!o.animate) {
        -				this.element.css($.extend(s, { top: top, left: left }));
        -			}
        -
        -			that.helper.height(that.size.height);
        -			that.helper.width(that.size.width);
        -
        -			if (this._helper && !o.animate) {
        -				this._proportionallyResize();
        -			}
        -		}
        -
        -		$("body").css("cursor", "auto");
        -
        -		this.element.removeClass("ui-resizable-resizing");
        -
        -		this._propagate("stop", event);
        -
        -		if (this._helper) {
        -			this.helper.remove();
        -		}
        -
        -		return false;
        -
        -	},
        -
        -	_updatePrevProperties: function() {
        -		this.prevPosition = {
        -			top: this.position.top,
        -			left: this.position.left
        -		};
        -		this.prevSize = {
        -			width: this.size.width,
        -			height: this.size.height
        -		};
        -	},
        -
        -	_applyChanges: function() {
        -		var props = {};
        -
        -		if ( this.position.top !== this.prevPosition.top ) {
        -			props.top = this.position.top + "px";
        -		}
        -		if ( this.position.left !== this.prevPosition.left ) {
        -			props.left = this.position.left + "px";
        -		}
        -		if ( this.size.width !== this.prevSize.width ) {
        -			props.width = this.size.width + "px";
        -		}
        -		if ( this.size.height !== this.prevSize.height ) {
        -			props.height = this.size.height + "px";
        -		}
        -
        -		this.helper.css( props );
        -
        -		return props;
        -	},
        -
        -	_updateVirtualBoundaries: function(forceAspectRatio) {
        -		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
        -			o = this.options;
        -
        -		b = {
        -			minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
        -			maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
        -			minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
        -			maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
        -		};
        -
        -		if (this._aspectRatio || forceAspectRatio) {
        -			pMinWidth = b.minHeight * this.aspectRatio;
        -			pMinHeight = b.minWidth / this.aspectRatio;
        -			pMaxWidth = b.maxHeight * this.aspectRatio;
        -			pMaxHeight = b.maxWidth / this.aspectRatio;
        -
        -			if (pMinWidth > b.minWidth) {
        -				b.minWidth = pMinWidth;
        -			}
        -			if (pMinHeight > b.minHeight) {
        -				b.minHeight = pMinHeight;
        -			}
        -			if (pMaxWidth < b.maxWidth) {
        -				b.maxWidth = pMaxWidth;
        -			}
        -			if (pMaxHeight < b.maxHeight) {
        -				b.maxHeight = pMaxHeight;
        -			}
        -		}
        -		this._vBoundaries = b;
        -	},
        -
        -	_updateCache: function(data) {
        -		this.offset = this.helper.offset();
        -		if (this._isNumber(data.left)) {
        -			this.position.left = data.left;
        -		}
        -		if (this._isNumber(data.top)) {
        -			this.position.top = data.top;
        -		}
        -		if (this._isNumber(data.height)) {
        -			this.size.height = data.height;
        -		}
        -		if (this._isNumber(data.width)) {
        -			this.size.width = data.width;
        -		}
        -	},
        -
        -	_updateRatio: function( data ) {
        -
        -		var cpos = this.position,
        -			csize = this.size,
        -			a = this.axis;
        -
        -		if (this._isNumber(data.height)) {
        -			data.width = (data.height * this.aspectRatio);
        -		} else if (this._isNumber(data.width)) {
        -			data.height = (data.width / this.aspectRatio);
        -		}
        -
        -		if (a === "sw") {
        -			data.left = cpos.left + (csize.width - data.width);
        -			data.top = null;
        -		}
        -		if (a === "nw") {
        -			data.top = cpos.top + (csize.height - data.height);
        -			data.left = cpos.left + (csize.width - data.width);
        -		}
        -
        -		return data;
        -	},
        -
        -	_respectSize: function( data ) {
        -
        -		var o = this._vBoundaries,
        -			a = this.axis,
        -			ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
        -			ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
        -			isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
        -			isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
        -			dw = this.originalPosition.left + this.originalSize.width,
        -			dh = this.position.top + this.size.height,
        -			cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
        -		if (isminw) {
        -			data.width = o.minWidth;
        -		}
        -		if (isminh) {
        -			data.height = o.minHeight;
        -		}
        -		if (ismaxw) {
        -			data.width = o.maxWidth;
        -		}
        -		if (ismaxh) {
        -			data.height = o.maxHeight;
        -		}
        -
        -		if (isminw && cw) {
        -			data.left = dw - o.minWidth;
        -		}
        -		if (ismaxw && cw) {
        -			data.left = dw - o.maxWidth;
        -		}
        -		if (isminh && ch) {
        -			data.top = dh - o.minHeight;
        -		}
        -		if (ismaxh && ch) {
        -			data.top = dh - o.maxHeight;
        -		}
        -
        -		// Fixing jump error on top/left - bug #2330
        -		if (!data.width && !data.height && !data.left && data.top) {
        -			data.top = null;
        -		} else if (!data.width && !data.height && !data.top && data.left) {
        -			data.left = null;
        -		}
        -
        -		return data;
        -	},
        -
        -	_getPaddingPlusBorderDimensions: function( element ) {
        -		var i = 0,
        -			widths = [],
        -			borders = [
        -				element.css( "borderTopWidth" ),
        -				element.css( "borderRightWidth" ),
        -				element.css( "borderBottomWidth" ),
        -				element.css( "borderLeftWidth" )
        -			],
        -			paddings = [
        -				element.css( "paddingTop" ),
        -				element.css( "paddingRight" ),
        -				element.css( "paddingBottom" ),
        -				element.css( "paddingLeft" )
        -			];
        -
        -		for ( ; i < 4; i++ ) {
        -			widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
        -			widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
        -		}
        -
        -		return {
        -			height: widths[ 0 ] + widths[ 2 ],
        -			width: widths[ 1 ] + widths[ 3 ]
        -		};
        -	},
        -
        -	_proportionallyResize: function() {
        -
        -		if (!this._proportionallyResizeElements.length) {
        -			return;
        -		}
        -
        -		var prel,
        -			i = 0,
        -			element = this.helper || this.element;
        -
        -		for ( ; i < this._proportionallyResizeElements.length; i++) {
        -
        -			prel = this._proportionallyResizeElements[i];
        -
        -			// TODO: Seems like a bug to cache this.outerDimensions
        -			// considering that we are in a loop.
        -			if (!this.outerDimensions) {
        -				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
        -			}
        -
        -			prel.css({
        -				height: (element.height() - this.outerDimensions.height) || 0,
        -				width: (element.width() - this.outerDimensions.width) || 0
        -			});
        -
        -		}
        -
        -	},
        -
        -	_renderProxy: function() {
        -
        -		var el = this.element, o = this.options;
        -		this.elementOffset = el.offset();
        -
        -		if (this._helper) {
        -
        -			this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
        -
        -			this.helper.addClass(this._helper).css({
        -				width: this.element.outerWidth() - 1,
        -				height: this.element.outerHeight() - 1,
        -				position: "absolute",
        -				left: this.elementOffset.left + "px",
        -				top: this.elementOffset.top + "px",
        -				zIndex: ++o.zIndex //TODO: Don't modify option
        -			});
        -
        -			this.helper
        -				.appendTo("body")
        -				.disableSelection();
        -
        -		} else {
        -			this.helper = this.element;
        -		}
        -
        -	},
        -
        -	_change: {
        -		e: function(event, dx) {
        -			return { width: this.originalSize.width + dx };
        -		},
        -		w: function(event, dx) {
        -			var cs = this.originalSize, sp = this.originalPosition;
        -			return { left: sp.left + dx, width: cs.width - dx };
        -		},
        -		n: function(event, dx, dy) {
        -			var cs = this.originalSize, sp = this.originalPosition;
        -			return { top: sp.top + dy, height: cs.height - dy };
        -		},
        -		s: function(event, dx, dy) {
        -			return { height: this.originalSize.height + dy };
        -		},
        -		se: function(event, dx, dy) {
        -			return $.extend(this._change.s.apply(this, arguments),
        -				this._change.e.apply(this, [ event, dx, dy ]));
        -		},
        -		sw: function(event, dx, dy) {
        -			return $.extend(this._change.s.apply(this, arguments),
        -				this._change.w.apply(this, [ event, dx, dy ]));
        -		},
        -		ne: function(event, dx, dy) {
        -			return $.extend(this._change.n.apply(this, arguments),
        -				this._change.e.apply(this, [ event, dx, dy ]));
        -		},
        -		nw: function(event, dx, dy) {
        -			return $.extend(this._change.n.apply(this, arguments),
        -				this._change.w.apply(this, [ event, dx, dy ]));
        -		}
        -	},
        -
        -	_propagate: function(n, event) {
        -		$.ui.plugin.call(this, n, [ event, this.ui() ]);
        -		(n !== "resize" && this._trigger(n, event, this.ui()));
        -	},
        -
        -	plugins: {},
        -
        -	ui: function() {
        -		return {
        -			originalElement: this.originalElement,
        -			element: this.element,
        -			helper: this.helper,
        -			position: this.position,
        -			size: this.size,
        -			originalSize: this.originalSize,
        -			originalPosition: this.originalPosition
        -		};
        -	}
        -
        -});
        -
        -/*
        - * Resizable Extensions
        - */
        -
        -$.ui.plugin.add("resizable", "animate", {
        -
        -	stop: function( event ) {
        -		var that = $(this).resizable( "instance" ),
        -			o = that.options,
        -			pr = that._proportionallyResizeElements,
        -			ista = pr.length && (/textarea/i).test(pr[0].nodeName),
        -			soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
        -			soffsetw = ista ? 0 : that.sizeDiff.width,
        -			style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
        -			left = (parseInt(that.element.css("left"), 10) +
        -				(that.position.left - that.originalPosition.left)) || null,
        -			top = (parseInt(that.element.css("top"), 10) +
        -				(that.position.top - that.originalPosition.top)) || null;
        -
        -		that.element.animate(
        -			$.extend(style, top && left ? { top: top, left: left } : {}), {
        -				duration: o.animateDuration,
        -				easing: o.animateEasing,
        -				step: function() {
        -
        -					var data = {
        -						width: parseInt(that.element.css("width"), 10),
        -						height: parseInt(that.element.css("height"), 10),
        -						top: parseInt(that.element.css("top"), 10),
        -						left: parseInt(that.element.css("left"), 10)
        -					};
        -
        -					if (pr && pr.length) {
        -						$(pr[0]).css({ width: data.width, height: data.height });
        -					}
        -
        -					// propagating resize, and updating values for each animation step
        -					that._updateCache(data);
        -					that._propagate("resize", event);
        -
        -				}
        -			}
        -		);
        -	}
        -
        -});
        -
        -$.ui.plugin.add( "resizable", "containment", {
        -
        -	start: function() {
        -		var element, p, co, ch, cw, width, height,
        -			that = $( this ).resizable( "instance" ),
        -			o = that.options,
        -			el = that.element,
        -			oc = o.containment,
        -			ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
        -
        -		if ( !ce ) {
        -			return;
        -		}
        -
        -		that.containerElement = $( ce );
        -
        -		if ( /document/.test( oc ) || oc === document ) {
        -			that.containerOffset = {
        -				left: 0,
        -				top: 0
        -			};
        -			that.containerPosition = {
        -				left: 0,
        -				top: 0
        -			};
        -
        -			that.parentData = {
        -				element: $( document ),
        -				left: 0,
        -				top: 0,
        -				width: $( document ).width(),
        -				height: $( document ).height() || document.body.parentNode.scrollHeight
        -			};
        -		} else {
        -			element = $( ce );
        -			p = [];
        -			$([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
        -				p[ i ] = that._num( element.css( "padding" + name ) );
        -			});
        -
        -			that.containerOffset = element.offset();
        -			that.containerPosition = element.position();
        -			that.containerSize = {
        -				height: ( element.innerHeight() - p[ 3 ] ),
        -				width: ( element.innerWidth() - p[ 1 ] )
        -			};
        -
        -			co = that.containerOffset;
        -			ch = that.containerSize.height;
        -			cw = that.containerSize.width;
        -			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
        -			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
        -
        -			that.parentData = {
        -				element: ce,
        -				left: co.left,
        -				top: co.top,
        -				width: width,
        -				height: height
        -			};
        -		}
        -	},
        -
        -	resize: function( event ) {
        -		var woset, hoset, isParent, isOffsetRelative,
        -			that = $( this ).resizable( "instance" ),
        -			o = that.options,
        -			co = that.containerOffset,
        -			cp = that.position,
        -			pRatio = that._aspectRatio || event.shiftKey,
        -			cop = {
        -				top: 0,
        -				left: 0
        -			},
        -			ce = that.containerElement,
        -			continueResize = true;
        -
        -		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
        -			cop = co;
        -		}
        -
        -		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
        -			that.size.width = that.size.width +
        -				( that._helper ?
        -					( that.position.left - co.left ) :
        -					( that.position.left - cop.left ) );
        -
        -			if ( pRatio ) {
        -				that.size.height = that.size.width / that.aspectRatio;
        -				continueResize = false;
        -			}
        -			that.position.left = o.helper ? co.left : 0;
        -		}
        -
        -		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
        -			that.size.height = that.size.height +
        -				( that._helper ?
        -					( that.position.top - co.top ) :
        -					that.position.top );
        -
        -			if ( pRatio ) {
        -				that.size.width = that.size.height * that.aspectRatio;
        -				continueResize = false;
        -			}
        -			that.position.top = that._helper ? co.top : 0;
        -		}
        -
        -		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
        -		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
        -
        -		if ( isParent && isOffsetRelative ) {
        -			that.offset.left = that.parentData.left + that.position.left;
        -			that.offset.top = that.parentData.top + that.position.top;
        -		} else {
        -			that.offset.left = that.element.offset().left;
        -			that.offset.top = that.element.offset().top;
        -		}
        -
        -		woset = Math.abs( that.sizeDiff.width +
        -			(that._helper ?
        -				that.offset.left - cop.left :
        -				(that.offset.left - co.left)) );
        -
        -		hoset = Math.abs( that.sizeDiff.height +
        -			(that._helper ?
        -				that.offset.top - cop.top :
        -				(that.offset.top - co.top)) );
        -
        -		if ( woset + that.size.width >= that.parentData.width ) {
        -			that.size.width = that.parentData.width - woset;
        -			if ( pRatio ) {
        -				that.size.height = that.size.width / that.aspectRatio;
        -				continueResize = false;
        -			}
        -		}
        -
        -		if ( hoset + that.size.height >= that.parentData.height ) {
        -			that.size.height = that.parentData.height - hoset;
        -			if ( pRatio ) {
        -				that.size.width = that.size.height * that.aspectRatio;
        -				continueResize = false;
        -			}
        -		}
        -
        -		if ( !continueResize ) {
        -			that.position.left = that.prevPosition.left;
        -			that.position.top = that.prevPosition.top;
        -			that.size.width = that.prevSize.width;
        -			that.size.height = that.prevSize.height;
        -		}
        -	},
        -
        -	stop: function() {
        -		var that = $( this ).resizable( "instance" ),
        -			o = that.options,
        -			co = that.containerOffset,
        -			cop = that.containerPosition,
        -			ce = that.containerElement,
        -			helper = $( that.helper ),
        -			ho = helper.offset(),
        -			w = helper.outerWidth() - that.sizeDiff.width,
        -			h = helper.outerHeight() - that.sizeDiff.height;
        -
        -		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
        -			$( this ).css({
        -				left: ho.left - cop.left - co.left,
        -				width: w,
        -				height: h
        -			});
        -		}
        -
        -		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
        -			$( this ).css({
        -				left: ho.left - cop.left - co.left,
        -				width: w,
        -				height: h
        -			});
        -		}
        -	}
        -});
        -
        -$.ui.plugin.add("resizable", "alsoResize", {
        -
        -	start: function() {
        -		var that = $(this).resizable( "instance" ),
        -			o = that.options;
        -
        -		$(o.alsoResize).each(function() {
        -			var el = $(this);
        -			el.data("ui-resizable-alsoresize", {
        -				width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
        -				left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
        -			});
        -		});
        -	},
        -
        -	resize: function(event, ui) {
        -		var that = $(this).resizable( "instance" ),
        -			o = that.options,
        -			os = that.originalSize,
        -			op = that.originalPosition,
        -			delta = {
        -				height: (that.size.height - os.height) || 0,
        -				width: (that.size.width - os.width) || 0,
        -				top: (that.position.top - op.top) || 0,
        -				left: (that.position.left - op.left) || 0
        -			};
        -
        -			$(o.alsoResize).each(function() {
        -				var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
        -					css = el.parents(ui.originalElement[0]).length ?
        -							[ "width", "height" ] :
        -							[ "width", "height", "top", "left" ];
        -
        -				$.each(css, function(i, prop) {
        -					var sum = (start[prop] || 0) + (delta[prop] || 0);
        -					if (sum && sum >= 0) {
        -						style[prop] = sum || null;
        -					}
        -				});
        -
        -				el.css(style);
        -			});
        -	},
        -
        -	stop: function() {
        -		$(this).removeData("resizable-alsoresize");
        -	}
        -});
        -
        -$.ui.plugin.add("resizable", "ghost", {
        -
        -	start: function() {
        -
        -		var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
        -
        -		that.ghost = that.originalElement.clone();
        -		that.ghost
        -			.css({
        -				opacity: 0.25,
        -				display: "block",
        -				position: "relative",
        -				height: cs.height,
        -				width: cs.width,
        -				margin: 0,
        -				left: 0,
        -				top: 0
        -			})
        -			.addClass("ui-resizable-ghost")
        -			.addClass(typeof o.ghost === "string" ? o.ghost : "");
        -
        -		that.ghost.appendTo(that.helper);
        -
        -	},
        -
        -	resize: function() {
        -		var that = $(this).resizable( "instance" );
        -		if (that.ghost) {
        -			that.ghost.css({
        -				position: "relative",
        -				height: that.size.height,
        -				width: that.size.width
        -			});
        -		}
        -	},
        -
        -	stop: function() {
        -		var that = $(this).resizable( "instance" );
        -		if (that.ghost && that.helper) {
        -			that.helper.get(0).removeChild(that.ghost.get(0));
        -		}
        -	}
        -
        -});
        -
        -$.ui.plugin.add("resizable", "grid", {
        -
        -	resize: function() {
        -		var outerDimensions,
        -			that = $(this).resizable( "instance" ),
        -			o = that.options,
        -			cs = that.size,
        -			os = that.originalSize,
        -			op = that.originalPosition,
        -			a = that.axis,
        -			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
        -			gridX = (grid[0] || 1),
        -			gridY = (grid[1] || 1),
        -			ox = Math.round((cs.width - os.width) / gridX) * gridX,
        -			oy = Math.round((cs.height - os.height) / gridY) * gridY,
        -			newWidth = os.width + ox,
        -			newHeight = os.height + oy,
        -			isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
        -			isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
        -			isMinWidth = o.minWidth && (o.minWidth > newWidth),
        -			isMinHeight = o.minHeight && (o.minHeight > newHeight);
        -
        -		o.grid = grid;
        -
        -		if (isMinWidth) {
        -			newWidth += gridX;
        -		}
        -		if (isMinHeight) {
        -			newHeight += gridY;
        -		}
        -		if (isMaxWidth) {
        -			newWidth -= gridX;
        -		}
        -		if (isMaxHeight) {
        -			newHeight -= gridY;
        -		}
        -
        -		if (/^(se|s|e)$/.test(a)) {
        -			that.size.width = newWidth;
        -			that.size.height = newHeight;
        -		} else if (/^(ne)$/.test(a)) {
        -			that.size.width = newWidth;
        -			that.size.height = newHeight;
        -			that.position.top = op.top - oy;
        -		} else if (/^(sw)$/.test(a)) {
        -			that.size.width = newWidth;
        -			that.size.height = newHeight;
        -			that.position.left = op.left - ox;
        -		} else {
        -			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
        -				outerDimensions = that._getPaddingPlusBorderDimensions( this );
        -			}
        -
        -			if ( newHeight - gridY > 0 ) {
        -				that.size.height = newHeight;
        -				that.position.top = op.top - oy;
        -			} else {
        -				newHeight = gridY - outerDimensions.height;
        -				that.size.height = newHeight;
        -				that.position.top = op.top + os.height - newHeight;
        -			}
        -			if ( newWidth - gridX > 0 ) {
        -				that.size.width = newWidth;
        -				that.position.left = op.left - ox;
        -			} else {
        -				newWidth = gridX - outerDimensions.width;
        -				that.size.width = newWidth;
        -				that.position.left = op.left + os.width - newWidth;
        -			}
        -		}
        -	}
        -
        -});
        -
        -var resizable = $.ui.resizable;
        -
        -
        -/*!
        - * jQuery UI Dialog 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/dialog/
        - */
        -
        -
        -var dialog = $.widget( "ui.dialog", {
        -	version: "1.11.4",
        -	options: {
        -		appendTo: "body",
        -		autoOpen: true,
        -		buttons: [],
        -		closeOnEscape: true,
        -		closeText: "Close",
        -		dialogClass: "",
        -		draggable: true,
        -		hide: null,
        -		height: "auto",
        -		maxHeight: null,
        -		maxWidth: null,
        -		minHeight: 150,
        -		minWidth: 150,
        -		modal: false,
        -		position: {
        -			my: "center",
        -			at: "center",
        -			of: window,
        -			collision: "fit",
        -			// Ensure the titlebar is always visible
        -			using: function( pos ) {
        -				var topOffset = $( this ).css( pos ).offset().top;
        -				if ( topOffset < 0 ) {
        -					$( this ).css( "top", pos.top - topOffset );
        -				}
        -			}
        -		},
        -		resizable: true,
        -		show: null,
        -		title: null,
        -		width: 300,
        -
        -		// callbacks
        -		beforeClose: null,
        -		close: null,
        -		drag: null,
        -		dragStart: null,
        -		dragStop: null,
        -		focus: null,
        -		open: null,
        -		resize: null,
        -		resizeStart: null,
        -		resizeStop: null
        -	},
        -
        -	sizeRelatedOptions: {
        -		buttons: true,
        -		height: true,
        -		maxHeight: true,
        -		maxWidth: true,
        -		minHeight: true,
        -		minWidth: true,
        -		width: true
        -	},
        -
        -	resizableRelatedOptions: {
        -		maxHeight: true,
        -		maxWidth: true,
        -		minHeight: true,
        -		minWidth: true
        -	},
        -
        -	_create: function() {
        -		this.originalCss = {
        -			display: this.element[ 0 ].style.display,
        -			width: this.element[ 0 ].style.width,
        -			minHeight: this.element[ 0 ].style.minHeight,
        -			maxHeight: this.element[ 0 ].style.maxHeight,
        -			height: this.element[ 0 ].style.height
        -		};
        -		this.originalPosition = {
        -			parent: this.element.parent(),
        -			index: this.element.parent().children().index( this.element )
        -		};
        -		this.originalTitle = this.element.attr( "title" );
        -		this.options.title = this.options.title || this.originalTitle;
        -
        -		this._createWrapper();
        -
        -		this.element
        -			.show()
        -			.removeAttr( "title" )
        -			.addClass( "ui-dialog-content ui-widget-content" )
        -			.appendTo( this.uiDialog );
        -
        -		this._createTitlebar();
        -		this._createButtonPane();
        -
        -		if ( this.options.draggable && $.fn.draggable ) {
        -			this._makeDraggable();
        -		}
        -		if ( this.options.resizable && $.fn.resizable ) {
        -			this._makeResizable();
        -		}
        -
        -		this._isOpen = false;
        -
        -		this._trackFocus();
        -	},
        -
        -	_init: function() {
        -		if ( this.options.autoOpen ) {
        -			this.open();
        -		}
        -	},
        -
        -	_appendTo: function() {
        -		var element = this.options.appendTo;
        -		if ( element && (element.jquery || element.nodeType) ) {
        -			return $( element );
        -		}
        -		return this.document.find( element || "body" ).eq( 0 );
        -	},
        -
        -	_destroy: function() {
        -		var next,
        -			originalPosition = this.originalPosition;
        -
        -		this._untrackInstance();
        -		this._destroyOverlay();
        -
        -		this.element
        -			.removeUniqueId()
        -			.removeClass( "ui-dialog-content ui-widget-content" )
        -			.css( this.originalCss )
        -			// Without detaching first, the following becomes really slow
        -			.detach();
        -
        -		this.uiDialog.stop( true, true ).remove();
        -
        -		if ( this.originalTitle ) {
        -			this.element.attr( "title", this.originalTitle );
        -		}
        -
        -		next = originalPosition.parent.children().eq( originalPosition.index );
        -		// Don't try to place the dialog next to itself (#8613)
        -		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
        -			next.before( this.element );
        -		} else {
        -			originalPosition.parent.append( this.element );
        -		}
        -	},
        -
        -	widget: function() {
        -		return this.uiDialog;
        -	},
        -
        -	disable: $.noop,
        -	enable: $.noop,
        -
        -	close: function( event ) {
        -		var activeElement,
        -			that = this;
        -
        -		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
        -			return;
        -		}
        -
        -		this._isOpen = false;
        -		this._focusedElement = null;
        -		this._destroyOverlay();
        -		this._untrackInstance();
        -
        -		if ( !this.opener.filter( ":focusable" ).focus().length ) {
        -
        -			// support: IE9
        -			// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
        -			try {
        -				activeElement = this.document[ 0 ].activeElement;
        -
        -				// Support: IE9, IE10
        -				// If the <body> is blurred, IE will switch windows, see #4520
        -				if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) {
        -
        -					// Hiding a focused element doesn't trigger blur in WebKit
        -					// so in case we have nothing to focus on, explicitly blur the active element
        -					// https://bugs.webkit.org/show_bug.cgi?id=47182
        -					$( activeElement ).blur();
        -				}
        -			} catch ( error ) {}
        -		}
        -
        -		this._hide( this.uiDialog, this.options.hide, function() {
        -			that._trigger( "close", event );
        -		});
        -	},
        -
        -	isOpen: function() {
        -		return this._isOpen;
        -	},
        -
        -	moveToTop: function() {
        -		this._moveToTop();
        -	},
        -
        -	_moveToTop: function( event, silent ) {
        -		var moved = false,
        -			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
        -				return +$( this ).css( "z-index" );
        -			}).get(),
        -			zIndexMax = Math.max.apply( null, zIndices );
        -
        -		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
        -			this.uiDialog.css( "z-index", zIndexMax + 1 );
        -			moved = true;
        -		}
        -
        -		if ( moved && !silent ) {
        -			this._trigger( "focus", event );
        -		}
        -		return moved;
        -	},
        -
        -	open: function() {
        -		var that = this;
        -		if ( this._isOpen ) {
        -			if ( this._moveToTop() ) {
        -				this._focusTabbable();
        -			}
        -			return;
        -		}
        -
        -		this._isOpen = true;
        -		this.opener = $( this.document[ 0 ].activeElement );
        -
        -		this._size();
        -		this._position();
        -		this._createOverlay();
        -		this._moveToTop( null, true );
        -
        -		// Ensure the overlay is moved to the top with the dialog, but only when
        -		// opening. The overlay shouldn't move after the dialog is open so that
        -		// modeless dialogs opened after the modal dialog stack properly.
        -		if ( this.overlay ) {
        -			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
        -		}
        -
        -		this._show( this.uiDialog, this.options.show, function() {
        -			that._focusTabbable();
        -			that._trigger( "focus" );
        -		});
        -
        -		// Track the dialog immediately upon openening in case a focus event
        -		// somehow occurs outside of the dialog before an element inside the
        -		// dialog is focused (#10152)
        -		this._makeFocusTarget();
        -
        -		this._trigger( "open" );
        -	},
        -
        -	_focusTabbable: function() {
        -		// Set focus to the first match:
        -		// 1. An element that was focused previously
        -		// 2. First element inside the dialog matching [autofocus]
        -		// 3. Tabbable element inside the content element
        -		// 4. Tabbable element inside the buttonpane
        -		// 5. The close button
        -		// 6. The dialog itself
        -		var hasFocus = this._focusedElement;
        -		if ( !hasFocus ) {
        -			hasFocus = this.element.find( "[autofocus]" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.element.find( ":tabbable" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.uiDialog;
        -		}
        -		hasFocus.eq( 0 ).focus();
        -	},
        -
        -	_keepFocus: function( event ) {
        -		function checkFocus() {
        -			var activeElement = this.document[0].activeElement,
        -				isActive = this.uiDialog[0] === activeElement ||
        -					$.contains( this.uiDialog[0], activeElement );
        -			if ( !isActive ) {
        -				this._focusTabbable();
        -			}
        -		}
        -		event.preventDefault();
        -		checkFocus.call( this );
        -		// support: IE
        -		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
        -		// so we check again later
        -		this._delay( checkFocus );
        -	},
        -
        -	_createWrapper: function() {
        -		this.uiDialog = $("<div>")
        -			.addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
        -				this.options.dialogClass )
        -			.hide()
        -			.attr({
        -				// Setting tabIndex makes the div focusable
        -				tabIndex: -1,
        -				role: "dialog"
        -			})
        -			.appendTo( this._appendTo() );
        -
        -		this._on( this.uiDialog, {
        -			keydown: function( event ) {
        -				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
        -						event.keyCode === $.ui.keyCode.ESCAPE ) {
        -					event.preventDefault();
        -					this.close( event );
        -					return;
        -				}
        -
        -				// prevent tabbing out of dialogs
        -				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
        -					return;
        -				}
        -				var tabbables = this.uiDialog.find( ":tabbable" ),
        -					first = tabbables.filter( ":first" ),
        -					last = tabbables.filter( ":last" );
        -
        -				if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
        -					this._delay(function() {
        -						first.focus();
        -					});
        -					event.preventDefault();
        -				} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
        -					this._delay(function() {
        -						last.focus();
        -					});
        -					event.preventDefault();
        -				}
        -			},
        -			mousedown: function( event ) {
        -				if ( this._moveToTop( event ) ) {
        -					this._focusTabbable();
        -				}
        -			}
        -		});
        -
        -		// We assume that any existing aria-describedby attribute means
        -		// that the dialog content is marked up properly
        -		// otherwise we brute force the content as the description
        -		if ( !this.element.find( "[aria-describedby]" ).length ) {
        -			this.uiDialog.attr({
        -				"aria-describedby": this.element.uniqueId().attr( "id" )
        -			});
        -		}
        -	},
        -
        -	_createTitlebar: function() {
        -		var uiDialogTitle;
        -
        -		this.uiDialogTitlebar = $( "<div>" )
        -			.addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" )
        -			.prependTo( this.uiDialog );
        -		this._on( this.uiDialogTitlebar, {
        -			mousedown: function( event ) {
        -				// Don't prevent click on close button (#8838)
        -				// Focusing a dialog that is partially scrolled out of view
        -				// causes the browser to scroll it into view, preventing the click event
        -				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
        -					// Dialog isn't getting focus when dragging (#8063)
        -					this.uiDialog.focus();
        -				}
        -			}
        -		});
        -
        -		// support: IE
        -		// Use type="button" to prevent enter keypresses in textboxes from closing the
        -		// dialog in IE (#9312)
        -		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
        -			.button({
        -				label: this.options.closeText,
        -				icons: {
        -					primary: "ui-icon-closethick"
        -				},
        -				text: false
        -			})
        -			.addClass( "ui-dialog-titlebar-close" )
        -			.appendTo( this.uiDialogTitlebar );
        -		this._on( this.uiDialogTitlebarClose, {
        -			click: function( event ) {
        -				event.preventDefault();
        -				this.close( event );
        -			}
        -		});
        -
        -		uiDialogTitle = $( "<span>" )
        -			.uniqueId()
        -			.addClass( "ui-dialog-title" )
        -			.prependTo( this.uiDialogTitlebar );
        -		this._title( uiDialogTitle );
        -
        -		this.uiDialog.attr({
        -			"aria-labelledby": uiDialogTitle.attr( "id" )
        -		});
        -	},
        -
        -	_title: function( title ) {
        -		if ( !this.options.title ) {
        -			title.html( "&#160;" );
        -		}
        -		title.text( this.options.title );
        -	},
        -
        -	_createButtonPane: function() {
        -		this.uiDialogButtonPane = $( "<div>" )
        -			.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
        -
        -		this.uiButtonSet = $( "<div>" )
        -			.addClass( "ui-dialog-buttonset" )
        -			.appendTo( this.uiDialogButtonPane );
        -
        -		this._createButtons();
        -	},
        -
        -	_createButtons: function() {
        -		var that = this,
        -			buttons = this.options.buttons;
        -
        -		// if we already have a button pane, remove it
        -		this.uiDialogButtonPane.remove();
        -		this.uiButtonSet.empty();
        -
        -		if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
        -			this.uiDialog.removeClass( "ui-dialog-buttons" );
        -			return;
        -		}
        -
        -		$.each( buttons, function( name, props ) {
        -			var click, buttonOptions;
        -			props = $.isFunction( props ) ?
        -				{ click: props, text: name } :
        -				props;
        -			// Default to a non-submitting button
        -			props = $.extend( { type: "button" }, props );
        -			// Change the context for the click callback to be the main element
        -			click = props.click;
        -			props.click = function() {
        -				click.apply( that.element[ 0 ], arguments );
        -			};
        -			buttonOptions = {
        -				icons: props.icons,
        -				text: props.showText
        -			};
        -			delete props.icons;
        -			delete props.showText;
        -			$( "<button></button>", props )
        -				.button( buttonOptions )
        -				.appendTo( that.uiButtonSet );
        -		});
        -		this.uiDialog.addClass( "ui-dialog-buttons" );
        -		this.uiDialogButtonPane.appendTo( this.uiDialog );
        -	},
        -
        -	_makeDraggable: function() {
        -		var that = this,
        -			options = this.options;
        -
        -		function filteredUi( ui ) {
        -			return {
        -				position: ui.position,
        -				offset: ui.offset
        -			};
        -		}
        -
        -		this.uiDialog.draggable({
        -			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
        -			handle: ".ui-dialog-titlebar",
        -			containment: "document",
        -			start: function( event, ui ) {
        -				$( this ).addClass( "ui-dialog-dragging" );
        -				that._blockFrames();
        -				that._trigger( "dragStart", event, filteredUi( ui ) );
        -			},
        -			drag: function( event, ui ) {
        -				that._trigger( "drag", event, filteredUi( ui ) );
        -			},
        -			stop: function( event, ui ) {
        -				var left = ui.offset.left - that.document.scrollLeft(),
        -					top = ui.offset.top - that.document.scrollTop();
        -
        -				options.position = {
        -					my: "left top",
        -					at: "left" + (left >= 0 ? "+" : "") + left + " " +
        -						"top" + (top >= 0 ? "+" : "") + top,
        -					of: that.window
        -				};
        -				$( this ).removeClass( "ui-dialog-dragging" );
        -				that._unblockFrames();
        -				that._trigger( "dragStop", event, filteredUi( ui ) );
        -			}
        -		});
        -	},
        -
        -	_makeResizable: function() {
        -		var that = this,
        -			options = this.options,
        -			handles = options.resizable,
        -			// .ui-resizable has position: relative defined in the stylesheet
        -			// but dialogs have to use absolute or fixed positioning
        -			position = this.uiDialog.css("position"),
        -			resizeHandles = typeof handles === "string" ?
        -				handles	:
        -				"n,e,s,w,se,sw,ne,nw";
        -
        -		function filteredUi( ui ) {
        -			return {
        -				originalPosition: ui.originalPosition,
        -				originalSize: ui.originalSize,
        -				position: ui.position,
        -				size: ui.size
        -			};
        -		}
        -
        -		this.uiDialog.resizable({
        -			cancel: ".ui-dialog-content",
        -			containment: "document",
        -			alsoResize: this.element,
        -			maxWidth: options.maxWidth,
        -			maxHeight: options.maxHeight,
        -			minWidth: options.minWidth,
        -			minHeight: this._minHeight(),
        -			handles: resizeHandles,
        -			start: function( event, ui ) {
        -				$( this ).addClass( "ui-dialog-resizing" );
        -				that._blockFrames();
        -				that._trigger( "resizeStart", event, filteredUi( ui ) );
        -			},
        -			resize: function( event, ui ) {
        -				that._trigger( "resize", event, filteredUi( ui ) );
        -			},
        -			stop: function( event, ui ) {
        -				var offset = that.uiDialog.offset(),
        -					left = offset.left - that.document.scrollLeft(),
        -					top = offset.top - that.document.scrollTop();
        -
        -				options.height = that.uiDialog.height();
        -				options.width = that.uiDialog.width();
        -				options.position = {
        -					my: "left top",
        -					at: "left" + (left >= 0 ? "+" : "") + left + " " +
        -						"top" + (top >= 0 ? "+" : "") + top,
        -					of: that.window
        -				};
        -				$( this ).removeClass( "ui-dialog-resizing" );
        -				that._unblockFrames();
        -				that._trigger( "resizeStop", event, filteredUi( ui ) );
        -			}
        -		})
        -		.css( "position", position );
        -	},
        -
        -	_trackFocus: function() {
        -		this._on( this.widget(), {
        -			focusin: function( event ) {
        -				this._makeFocusTarget();
        -				this._focusedElement = $( event.target );
        -			}
        -		});
        -	},
        -
        -	_makeFocusTarget: function() {
        -		this._untrackInstance();
        -		this._trackingInstances().unshift( this );
        -	},
        -
        -	_untrackInstance: function() {
        -		var instances = this._trackingInstances(),
        -			exists = $.inArray( this, instances );
        -		if ( exists !== -1 ) {
        -			instances.splice( exists, 1 );
        -		}
        -	},
        -
        -	_trackingInstances: function() {
        -		var instances = this.document.data( "ui-dialog-instances" );
        -		if ( !instances ) {
        -			instances = [];
        -			this.document.data( "ui-dialog-instances", instances );
        -		}
        -		return instances;
        -	},
        -
        -	_minHeight: function() {
        -		var options = this.options;
        -
        -		return options.height === "auto" ?
        -			options.minHeight :
        -			Math.min( options.minHeight, options.height );
        -	},
        -
        -	_position: function() {
        -		// Need to show the dialog to get the actual offset in the position plugin
        -		var isVisible = this.uiDialog.is( ":visible" );
        -		if ( !isVisible ) {
        -			this.uiDialog.show();
        -		}
        -		this.uiDialog.position( this.options.position );
        -		if ( !isVisible ) {
        -			this.uiDialog.hide();
        -		}
        -	},
        -
        -	_setOptions: function( options ) {
        -		var that = this,
        -			resize = false,
        -			resizableOptions = {};
        -
        -		$.each( options, function( key, value ) {
        -			that._setOption( key, value );
        -
        -			if ( key in that.sizeRelatedOptions ) {
        -				resize = true;
        -			}
        -			if ( key in that.resizableRelatedOptions ) {
        -				resizableOptions[ key ] = value;
        -			}
        -		});
        -
        -		if ( resize ) {
        -			this._size();
        -			this._position();
        -		}
        -		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        -			this.uiDialog.resizable( "option", resizableOptions );
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		var isDraggable, isResizable,
        -			uiDialog = this.uiDialog;
        -
        -		if ( key === "dialogClass" ) {
        -			uiDialog
        -				.removeClass( this.options.dialogClass )
        -				.addClass( value );
        -		}
        -
        -		if ( key === "disabled" ) {
        -			return;
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "appendTo" ) {
        -			this.uiDialog.appendTo( this._appendTo() );
        -		}
        -
        -		if ( key === "buttons" ) {
        -			this._createButtons();
        -		}
        -
        -		if ( key === "closeText" ) {
        -			this.uiDialogTitlebarClose.button({
        -				// Ensure that we always pass a string
        -				label: "" + value
        -			});
        -		}
        -
        -		if ( key === "draggable" ) {
        -			isDraggable = uiDialog.is( ":data(ui-draggable)" );
        -			if ( isDraggable && !value ) {
        -				uiDialog.draggable( "destroy" );
        -			}
        -
        -			if ( !isDraggable && value ) {
        -				this._makeDraggable();
        -			}
        -		}
        -
        -		if ( key === "position" ) {
        -			this._position();
        -		}
        -
        -		if ( key === "resizable" ) {
        -			// currently resizable, becoming non-resizable
        -			isResizable = uiDialog.is( ":data(ui-resizable)" );
        -			if ( isResizable && !value ) {
        -				uiDialog.resizable( "destroy" );
        -			}
        -
        -			// currently resizable, changing handles
        -			if ( isResizable && typeof value === "string" ) {
        -				uiDialog.resizable( "option", "handles", value );
        -			}
        -
        -			// currently non-resizable, becoming resizable
        -			if ( !isResizable && value !== false ) {
        -				this._makeResizable();
        -			}
        -		}
        -
        -		if ( key === "title" ) {
        -			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
        -		}
        -	},
        -
        -	_size: function() {
        -		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
        -		// divs will both have width and height set, so we need to reset them
        -		var nonContentHeight, minContentHeight, maxContentHeight,
        -			options = this.options;
        -
        -		// Reset content sizing
        -		this.element.show().css({
        -			width: "auto",
        -			minHeight: 0,
        -			maxHeight: "none",
        -			height: 0
        -		});
        -
        -		if ( options.minWidth > options.width ) {
        -			options.width = options.minWidth;
        -		}
        -
        -		// reset wrapper sizing
        -		// determine the height of all the non-content elements
        -		nonContentHeight = this.uiDialog.css({
        -				height: "auto",
        -				width: options.width
        -			})
        -			.outerHeight();
        -		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
        -		maxContentHeight = typeof options.maxHeight === "number" ?
        -			Math.max( 0, options.maxHeight - nonContentHeight ) :
        -			"none";
        -
        -		if ( options.height === "auto" ) {
        -			this.element.css({
        -				minHeight: minContentHeight,
        -				maxHeight: maxContentHeight,
        -				height: "auto"
        -			});
        -		} else {
        -			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
        -		}
        -
        -		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        -			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
        -		}
        -	},
        -
        -	_blockFrames: function() {
        -		this.iframeBlocks = this.document.find( "iframe" ).map(function() {
        -			var iframe = $( this );
        -
        -			return $( "<div>" )
        -				.css({
        -					position: "absolute",
        -					width: iframe.outerWidth(),
        -					height: iframe.outerHeight()
        -				})
        -				.appendTo( iframe.parent() )
        -				.offset( iframe.offset() )[0];
        -		});
        -	},
        -
        -	_unblockFrames: function() {
        -		if ( this.iframeBlocks ) {
        -			this.iframeBlocks.remove();
        -			delete this.iframeBlocks;
        -		}
        -	},
        -
        -	_allowInteraction: function( event ) {
        -		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
        -			return true;
        -		}
        -
        -		// TODO: Remove hack when datepicker implements
        -		// the .ui-front logic (#8989)
        -		return !!$( event.target ).closest( ".ui-datepicker" ).length;
        -	},
        -
        -	_createOverlay: function() {
        -		if ( !this.options.modal ) {
        -			return;
        -		}
        -
        -		// We use a delay in case the overlay is created from an
        -		// event that we're going to be cancelling (#2804)
        -		var isOpening = true;
        -		this._delay(function() {
        -			isOpening = false;
        -		});
        -
        -		if ( !this.document.data( "ui-dialog-overlays" ) ) {
        -
        -			// Prevent use of anchors and inputs
        -			// Using _on() for an event handler shared across many instances is
        -			// safe because the dialogs stack and must be closed in reverse order
        -			this._on( this.document, {
        -				focusin: function( event ) {
        -					if ( isOpening ) {
        -						return;
        -					}
        -
        -					if ( !this._allowInteraction( event ) ) {
        -						event.preventDefault();
        -						this._trackingInstances()[ 0 ]._focusTabbable();
        -					}
        -				}
        -			});
        -		}
        -
        -		this.overlay = $( "<div>" )
        -			.addClass( "ui-widget-overlay ui-front" )
        -			.appendTo( this._appendTo() );
        -		this._on( this.overlay, {
        -			mousedown: "_keepFocus"
        -		});
        -		this.document.data( "ui-dialog-overlays",
        -			(this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
        -	},
        -
        -	_destroyOverlay: function() {
        -		if ( !this.options.modal ) {
        -			return;
        -		}
        -
        -		if ( this.overlay ) {
        -			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
        -
        -			if ( !overlays ) {
        -				this.document
        -					.unbind( "focusin" )
        -					.removeData( "ui-dialog-overlays" );
        -			} else {
        -				this.document.data( "ui-dialog-overlays", overlays );
        -			}
        -
        -			this.overlay.remove();
        -			this.overlay = null;
        -		}
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Droppable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/droppable/
        - */
        -
        -
        -$.widget( "ui.droppable", {
        -	version: "1.11.4",
        -	widgetEventPrefix: "drop",
        -	options: {
        -		accept: "*",
        -		activeClass: false,
        -		addClasses: true,
        -		greedy: false,
        -		hoverClass: false,
        -		scope: "default",
        -		tolerance: "intersect",
        -
        -		// callbacks
        -		activate: null,
        -		deactivate: null,
        -		drop: null,
        -		out: null,
        -		over: null
        -	},
        -	_create: function() {
        -
        -		var proportions,
        -			o = this.options,
        -			accept = o.accept;
        -
        -		this.isover = false;
        -		this.isout = true;
        -
        -		this.accept = $.isFunction( accept ) ? accept : function( d ) {
        -			return d.is( accept );
        -		};
        -
        -		this.proportions = function( /* valueToWrite */ ) {
        -			if ( arguments.length ) {
        -				// Store the droppable's proportions
        -				proportions = arguments[ 0 ];
        -			} else {
        -				// Retrieve or derive the droppable's proportions
        -				return proportions ?
        -					proportions :
        -					proportions = {
        -						width: this.element[ 0 ].offsetWidth,
        -						height: this.element[ 0 ].offsetHeight
        -					};
        -			}
        -		};
        -
        -		this._addToManager( o.scope );
        -
        -		o.addClasses && this.element.addClass( "ui-droppable" );
        -
        -	},
        -
        -	_addToManager: function( scope ) {
        -		// Add the reference and positions to the manager
        -		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
        -		$.ui.ddmanager.droppables[ scope ].push( this );
        -	},
        -
        -	_splice: function( drop ) {
        -		var i = 0;
        -		for ( ; i < drop.length; i++ ) {
        -			if ( drop[ i ] === this ) {
        -				drop.splice( i, 1 );
        -			}
        -		}
        -	},
        -
        -	_destroy: function() {
        -		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        -
        -		this._splice( drop );
        -
        -		this.element.removeClass( "ui-droppable ui-droppable-disabled" );
        -	},
        -
        -	_setOption: function( key, value ) {
        -
        -		if ( key === "accept" ) {
        -			this.accept = $.isFunction( value ) ? value : function( d ) {
        -				return d.is( value );
        -			};
        -		} else if ( key === "scope" ) {
        -			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        -
        -			this._splice( drop );
        -			this._addToManager( value );
        -		}
        -
        -		this._super( key, value );
        -	},
        -
        -	_activate: function( event ) {
        -		var draggable = $.ui.ddmanager.current;
        -		if ( this.options.activeClass ) {
        -			this.element.addClass( this.options.activeClass );
        -		}
        -		if ( draggable ){
        -			this._trigger( "activate", event, this.ui( draggable ) );
        -		}
        -	},
        -
        -	_deactivate: function( event ) {
        -		var draggable = $.ui.ddmanager.current;
        -		if ( this.options.activeClass ) {
        -			this.element.removeClass( this.options.activeClass );
        -		}
        -		if ( draggable ){
        -			this._trigger( "deactivate", event, this.ui( draggable ) );
        -		}
        -	},
        -
        -	_over: function( event ) {
        -
        -		var draggable = $.ui.ddmanager.current;
        -
        -		// Bail if draggable and droppable are same element
        -		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
        -			return;
        -		}
        -
        -		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -			if ( this.options.hoverClass ) {
        -				this.element.addClass( this.options.hoverClass );
        -			}
        -			this._trigger( "over", event, this.ui( draggable ) );
        -		}
        -
        -	},
        -
        -	_out: function( event ) {
        -
        -		var draggable = $.ui.ddmanager.current;
        -
        -		// Bail if draggable and droppable are same element
        -		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
        -			return;
        -		}
        -
        -		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -			if ( this.options.hoverClass ) {
        -				this.element.removeClass( this.options.hoverClass );
        -			}
        -			this._trigger( "out", event, this.ui( draggable ) );
        -		}
        -
        -	},
        -
        -	_drop: function( event, custom ) {
        -
        -		var draggable = custom || $.ui.ddmanager.current,
        -			childrenIntersection = false;
        -
        -		// Bail if draggable and droppable are same element
        -		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
        -			return false;
        -		}
        -
        -		this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
        -			var inst = $( this ).droppable( "instance" );
        -			if (
        -				inst.options.greedy &&
        -				!inst.options.disabled &&
        -				inst.options.scope === draggable.options.scope &&
        -				inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
        -				$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
        -			) { childrenIntersection = true; return false; }
        -		});
        -		if ( childrenIntersection ) {
        -			return false;
        -		}
        -
        -		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -			if ( this.options.activeClass ) {
        -				this.element.removeClass( this.options.activeClass );
        -			}
        -			if ( this.options.hoverClass ) {
        -				this.element.removeClass( this.options.hoverClass );
        -			}
        -			this._trigger( "drop", event, this.ui( draggable ) );
        -			return this.element;
        -		}
        -
        -		return false;
        -
        -	},
        -
        -	ui: function( c ) {
        -		return {
        -			draggable: ( c.currentItem || c.element ),
        -			helper: c.helper,
        -			position: c.position,
        -			offset: c.positionAbs
        -		};
        -	}
        -
        -});
        -
        -$.ui.intersect = (function() {
        -	function isOverAxis( x, reference, size ) {
        -		return ( x >= reference ) && ( x < ( reference + size ) );
        -	}
        -
        -	return function( draggable, droppable, toleranceMode, event ) {
        -
        -		if ( !droppable.offset ) {
        -			return false;
        -		}
        -
        -		var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
        -			y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
        -			x2 = x1 + draggable.helperProportions.width,
        -			y2 = y1 + draggable.helperProportions.height,
        -			l = droppable.offset.left,
        -			t = droppable.offset.top,
        -			r = l + droppable.proportions().width,
        -			b = t + droppable.proportions().height;
        -
        -		switch ( toleranceMode ) {
        -		case "fit":
        -			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
        -		case "intersect":
        -			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
        -				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
        -				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
        -				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
        -		case "pointer":
        -			return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
        -		case "touch":
        -			return (
        -				( y1 >= t && y1 <= b ) || // Top edge touching
        -				( y2 >= t && y2 <= b ) || // Bottom edge touching
        -				( y1 < t && y2 > b ) // Surrounded vertically
        -			) && (
        -				( x1 >= l && x1 <= r ) || // Left edge touching
        -				( x2 >= l && x2 <= r ) || // Right edge touching
        -				( x1 < l && x2 > r ) // Surrounded horizontally
        -			);
        -		default:
        -			return false;
        -		}
        -	};
        -})();
        -
        -/*
        -	This manager tracks offsets of draggables and droppables
        -*/
        -$.ui.ddmanager = {
        -	current: null,
        -	droppables: { "default": [] },
        -	prepareOffsets: function( t, event ) {
        -
        -		var i, j,
        -			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
        -			type = event ? event.type : null, // workaround for #2317
        -			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
        -
        -		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
        -
        -			// No disabled and non-accepted
        -			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
        -				continue;
        -			}
        -
        -			// Filter out elements in the current dragged item
        -			for ( j = 0; j < list.length; j++ ) {
        -				if ( list[ j ] === m[ i ].element[ 0 ] ) {
        -					m[ i ].proportions().height = 0;
        -					continue droppablesLoop;
        -				}
        -			}
        -
        -			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
        -			if ( !m[ i ].visible ) {
        -				continue;
        -			}
        -
        -			// Activate the droppable if used directly from draggables
        -			if ( type === "mousedown" ) {
        -				m[ i ]._activate.call( m[ i ], event );
        -			}
        -
        -			m[ i ].offset = m[ i ].element.offset();
        -			m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
        -
        -		}
        -
        -	},
        -	drop: function( draggable, event ) {
        -
        -		var dropped = false;
        -		// Create a copy of the droppables in case the list changes during the drop (#9116)
        -		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
        -
        -			if ( !this.options ) {
        -				return;
        -			}
        -			if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
        -				dropped = this._drop.call( this, event ) || dropped;
        -			}
        -
        -			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -				this.isout = true;
        -				this.isover = false;
        -				this._deactivate.call( this, event );
        -			}
        -
        -		});
        -		return dropped;
        -
        -	},
        -	dragStart: function( draggable, event ) {
        -		// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
        -		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
        -			if ( !draggable.options.refreshPositions ) {
        -				$.ui.ddmanager.prepareOffsets( draggable, event );
        -			}
        -		});
        -	},
        -	drag: function( draggable, event ) {
        -
        -		// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
        -		if ( draggable.options.refreshPositions ) {
        -			$.ui.ddmanager.prepareOffsets( draggable, event );
        -		}
        -
        -		// Run through all droppables and check their positions based on specific tolerance options
        -		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
        -
        -			if ( this.options.disabled || this.greedyChild || !this.visible ) {
        -				return;
        -			}
        -
        -			var parentInstance, scope, parent,
        -				intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
        -				c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
        -			if ( !c ) {
        -				return;
        -			}
        -
        -			if ( this.options.greedy ) {
        -				// find droppable parents with same scope
        -				scope = this.options.scope;
        -				parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
        -					return $( this ).droppable( "instance" ).options.scope === scope;
        -				});
        -
        -				if ( parent.length ) {
        -					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
        -					parentInstance.greedyChild = ( c === "isover" );
        -				}
        -			}
        -
        -			// we just moved into a greedy child
        -			if ( parentInstance && c === "isover" ) {
        -				parentInstance.isover = false;
        -				parentInstance.isout = true;
        -				parentInstance._out.call( parentInstance, event );
        -			}
        -
        -			this[ c ] = true;
        -			this[c === "isout" ? "isover" : "isout"] = false;
        -			this[c === "isover" ? "_over" : "_out"].call( this, event );
        -
        -			// we just moved out of a greedy child
        -			if ( parentInstance && c === "isout" ) {
        -				parentInstance.isout = false;
        -				parentInstance.isover = true;
        -				parentInstance._over.call( parentInstance, event );
        -			}
        -		});
        -
        -	},
        -	dragStop: function( draggable, event ) {
        -		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
        -		// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
        -		if ( !draggable.options.refreshPositions ) {
        -			$.ui.ddmanager.prepareOffsets( draggable, event );
        -		}
        -	}
        -};
        -
        -var droppable = $.ui.droppable;
        -
        -
        -/*!
        - * jQuery UI Effects 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/category/effects-core/
        - */
        -
        -
        -var dataSpace = "ui-effects-",
        -
        -	// Create a local jQuery because jQuery Color relies on it and the
        -	// global may not exist with AMD and a custom build (#10199)
        -	jQuery = $;
        -
        -$.effects = {
        -	effect: {}
        -};
        -
        -/*!
        - * jQuery Color Animations v2.1.2
        - * https://github.com/jquery/jquery-color
        - *
        - * Copyright 2014 jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * Date: Wed Jan 16 08:47:09 2013 -0600
        - */
        -(function( jQuery, undefined ) {
        -
        -	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
        -
        -	// plusequals test for += 100 -= 100
        -	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
        -	// a set of RE's that can match strings and generate color tuples.
        -	stringParsers = [ {
        -			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        -			parse: function( execResult ) {
        -				return [
        -					execResult[ 1 ],
        -					execResult[ 2 ],
        -					execResult[ 3 ],
        -					execResult[ 4 ]
        -				];
        -			}
        -		}, {
        -			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        -			parse: function( execResult ) {
        -				return [
        -					execResult[ 1 ] * 2.55,
        -					execResult[ 2 ] * 2.55,
        -					execResult[ 3 ] * 2.55,
        -					execResult[ 4 ]
        -				];
        -			}
        -		}, {
        -			// this regex ignores A-F because it's compared against an already lowercased string
        -			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
        -			parse: function( execResult ) {
        -				return [
        -					parseInt( execResult[ 1 ], 16 ),
        -					parseInt( execResult[ 2 ], 16 ),
        -					parseInt( execResult[ 3 ], 16 )
        -				];
        -			}
        -		}, {
        -			// this regex ignores A-F because it's compared against an already lowercased string
        -			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
        -			parse: function( execResult ) {
        -				return [
        -					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
        -					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
        -					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
        -				];
        -			}
        -		}, {
        -			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        -			space: "hsla",
        -			parse: function( execResult ) {
        -				return [
        -					execResult[ 1 ],
        -					execResult[ 2 ] / 100,
        -					execResult[ 3 ] / 100,
        -					execResult[ 4 ]
        -				];
        -			}
        -		} ],
        -
        -	// jQuery.Color( )
        -	color = jQuery.Color = function( color, green, blue, alpha ) {
        -		return new jQuery.Color.fn.parse( color, green, blue, alpha );
        -	},
        -	spaces = {
        -		rgba: {
        -			props: {
        -				red: {
        -					idx: 0,
        -					type: "byte"
        -				},
        -				green: {
        -					idx: 1,
        -					type: "byte"
        -				},
        -				blue: {
        -					idx: 2,
        -					type: "byte"
        -				}
        -			}
        -		},
        -
        -		hsla: {
        -			props: {
        -				hue: {
        -					idx: 0,
        -					type: "degrees"
        -				},
        -				saturation: {
        -					idx: 1,
        -					type: "percent"
        -				},
        -				lightness: {
        -					idx: 2,
        -					type: "percent"
        -				}
        -			}
        -		}
        -	},
        -	propTypes = {
        -		"byte": {
        -			floor: true,
        -			max: 255
        -		},
        -		"percent": {
        -			max: 1
        -		},
        -		"degrees": {
        -			mod: 360,
        -			floor: true
        -		}
        -	},
        -	support = color.support = {},
        -
        -	// element for support tests
        -	supportElem = jQuery( "<p>" )[ 0 ],
        -
        -	// colors = jQuery.Color.names
        -	colors,
        -
        -	// local aliases of functions called often
        -	each = jQuery.each;
        -
        -// determine rgba support immediately
        -supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
        -support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
        -
        -// define cache name and alpha properties
        -// for rgba and hsla spaces
        -each( spaces, function( spaceName, space ) {
        -	space.cache = "_" + spaceName;
        -	space.props.alpha = {
        -		idx: 3,
        -		type: "percent",
        -		def: 1
        -	};
        -});
        -
        -function clamp( value, prop, allowEmpty ) {
        -	var type = propTypes[ prop.type ] || {};
        -
        -	if ( value == null ) {
        -		return (allowEmpty || !prop.def) ? null : prop.def;
        -	}
        -
        -	// ~~ is an short way of doing floor for positive numbers
        -	value = type.floor ? ~~value : parseFloat( value );
        -
        -	// IE will pass in empty strings as value for alpha,
        -	// which will hit this case
        -	if ( isNaN( value ) ) {
        -		return prop.def;
        -	}
        -
        -	if ( type.mod ) {
        -		// we add mod before modding to make sure that negatives values
        -		// get converted properly: -10 -> 350
        -		return (value + type.mod) % type.mod;
        -	}
        -
        -	// for now all property types without mod have min and max
        -	return 0 > value ? 0 : type.max < value ? type.max : value;
        -}
        -
        -function stringParse( string ) {
        -	var inst = color(),
        -		rgba = inst._rgba = [];
        -
        -	string = string.toLowerCase();
        -
        -	each( stringParsers, function( i, parser ) {
        -		var parsed,
        -			match = parser.re.exec( string ),
        -			values = match && parser.parse( match ),
        -			spaceName = parser.space || "rgba";
        -
        -		if ( values ) {
        -			parsed = inst[ spaceName ]( values );
        -
        -			// if this was an rgba parse the assignment might happen twice
        -			// oh well....
        -			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
        -			rgba = inst._rgba = parsed._rgba;
        -
        -			// exit each( stringParsers ) here because we matched
        -			return false;
        -		}
        -	});
        -
        -	// Found a stringParser that handled it
        -	if ( rgba.length ) {
        -
        -		// if this came from a parsed string, force "transparent" when alpha is 0
        -		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
        -		if ( rgba.join() === "0,0,0,0" ) {
        -			jQuery.extend( rgba, colors.transparent );
        -		}
        -		return inst;
        -	}
        -
        -	// named colors
        -	return colors[ string ];
        -}
        -
        -color.fn = jQuery.extend( color.prototype, {
        -	parse: function( red, green, blue, alpha ) {
        -		if ( red === undefined ) {
        -			this._rgba = [ null, null, null, null ];
        -			return this;
        -		}
        -		if ( red.jquery || red.nodeType ) {
        -			red = jQuery( red ).css( green );
        -			green = undefined;
        -		}
        -
        -		var inst = this,
        -			type = jQuery.type( red ),
        -			rgba = this._rgba = [];
        -
        -		// more than 1 argument specified - assume ( red, green, blue, alpha )
        -		if ( green !== undefined ) {
        -			red = [ red, green, blue, alpha ];
        -			type = "array";
        -		}
        -
        -		if ( type === "string" ) {
        -			return this.parse( stringParse( red ) || colors._default );
        -		}
        -
        -		if ( type === "array" ) {
        -			each( spaces.rgba.props, function( key, prop ) {
        -				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
        -			});
        -			return this;
        -		}
        -
        -		if ( type === "object" ) {
        -			if ( red instanceof color ) {
        -				each( spaces, function( spaceName, space ) {
        -					if ( red[ space.cache ] ) {
        -						inst[ space.cache ] = red[ space.cache ].slice();
        -					}
        -				});
        -			} else {
        -				each( spaces, function( spaceName, space ) {
        -					var cache = space.cache;
        -					each( space.props, function( key, prop ) {
        -
        -						// if the cache doesn't exist, and we know how to convert
        -						if ( !inst[ cache ] && space.to ) {
        -
        -							// if the value was null, we don't need to copy it
        -							// if the key was alpha, we don't need to copy it either
        -							if ( key === "alpha" || red[ key ] == null ) {
        -								return;
        -							}
        -							inst[ cache ] = space.to( inst._rgba );
        -						}
        -
        -						// this is the only case where we allow nulls for ALL properties.
        -						// call clamp with alwaysAllowEmpty
        -						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
        -					});
        -
        -					// everything defined but alpha?
        -					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
        -						// use the default of 1
        -						inst[ cache ][ 3 ] = 1;
        -						if ( space.from ) {
        -							inst._rgba = space.from( inst[ cache ] );
        -						}
        -					}
        -				});
        -			}
        -			return this;
        -		}
        -	},
        -	is: function( compare ) {
        -		var is = color( compare ),
        -			same = true,
        -			inst = this;
        -
        -		each( spaces, function( _, space ) {
        -			var localCache,
        -				isCache = is[ space.cache ];
        -			if (isCache) {
        -				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
        -				each( space.props, function( _, prop ) {
        -					if ( isCache[ prop.idx ] != null ) {
        -						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
        -						return same;
        -					}
        -				});
        -			}
        -			return same;
        -		});
        -		return same;
        -	},
        -	_space: function() {
        -		var used = [],
        -			inst = this;
        -		each( spaces, function( spaceName, space ) {
        -			if ( inst[ space.cache ] ) {
        -				used.push( spaceName );
        -			}
        -		});
        -		return used.pop();
        -	},
        -	transition: function( other, distance ) {
        -		var end = color( other ),
        -			spaceName = end._space(),
        -			space = spaces[ spaceName ],
        -			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
        -			start = startColor[ space.cache ] || space.to( startColor._rgba ),
        -			result = start.slice();
        -
        -		end = end[ space.cache ];
        -		each( space.props, function( key, prop ) {
        -			var index = prop.idx,
        -				startValue = start[ index ],
        -				endValue = end[ index ],
        -				type = propTypes[ prop.type ] || {};
        -
        -			// if null, don't override start value
        -			if ( endValue === null ) {
        -				return;
        -			}
        -			// if null - use end
        -			if ( startValue === null ) {
        -				result[ index ] = endValue;
        -			} else {
        -				if ( type.mod ) {
        -					if ( endValue - startValue > type.mod / 2 ) {
        -						startValue += type.mod;
        -					} else if ( startValue - endValue > type.mod / 2 ) {
        -						startValue -= type.mod;
        -					}
        -				}
        -				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
        -			}
        -		});
        -		return this[ spaceName ]( result );
        -	},
        -	blend: function( opaque ) {
        -		// if we are already opaque - return ourself
        -		if ( this._rgba[ 3 ] === 1 ) {
        -			return this;
        -		}
        -
        -		var rgb = this._rgba.slice(),
        -			a = rgb.pop(),
        -			blend = color( opaque )._rgba;
        -
        -		return color( jQuery.map( rgb, function( v, i ) {
        -			return ( 1 - a ) * blend[ i ] + a * v;
        -		}));
        -	},
        -	toRgbaString: function() {
        -		var prefix = "rgba(",
        -			rgba = jQuery.map( this._rgba, function( v, i ) {
        -				return v == null ? ( i > 2 ? 1 : 0 ) : v;
        -			});
        -
        -		if ( rgba[ 3 ] === 1 ) {
        -			rgba.pop();
        -			prefix = "rgb(";
        -		}
        -
        -		return prefix + rgba.join() + ")";
        -	},
        -	toHslaString: function() {
        -		var prefix = "hsla(",
        -			hsla = jQuery.map( this.hsla(), function( v, i ) {
        -				if ( v == null ) {
        -					v = i > 2 ? 1 : 0;
        -				}
        -
        -				// catch 1 and 2
        -				if ( i && i < 3 ) {
        -					v = Math.round( v * 100 ) + "%";
        -				}
        -				return v;
        -			});
        -
        -		if ( hsla[ 3 ] === 1 ) {
        -			hsla.pop();
        -			prefix = "hsl(";
        -		}
        -		return prefix + hsla.join() + ")";
        -	},
        -	toHexString: function( includeAlpha ) {
        -		var rgba = this._rgba.slice(),
        -			alpha = rgba.pop();
        -
        -		if ( includeAlpha ) {
        -			rgba.push( ~~( alpha * 255 ) );
        -		}
        -
        -		return "#" + jQuery.map( rgba, function( v ) {
        -
        -			// default to 0 when nulls exist
        -			v = ( v || 0 ).toString( 16 );
        -			return v.length === 1 ? "0" + v : v;
        -		}).join("");
        -	},
        -	toString: function() {
        -		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
        -	}
        -});
        -color.fn.parse.prototype = color.fn;
        -
        -// hsla conversions adapted from:
        -// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
        -
        -function hue2rgb( p, q, h ) {
        -	h = ( h + 1 ) % 1;
        -	if ( h * 6 < 1 ) {
        -		return p + ( q - p ) * h * 6;
        -	}
        -	if ( h * 2 < 1) {
        -		return q;
        -	}
        -	if ( h * 3 < 2 ) {
        -		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
        -	}
        -	return p;
        -}
        -
        -spaces.hsla.to = function( rgba ) {
        -	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
        -		return [ null, null, null, rgba[ 3 ] ];
        -	}
        -	var r = rgba[ 0 ] / 255,
        -		g = rgba[ 1 ] / 255,
        -		b = rgba[ 2 ] / 255,
        -		a = rgba[ 3 ],
        -		max = Math.max( r, g, b ),
        -		min = Math.min( r, g, b ),
        -		diff = max - min,
        -		add = max + min,
        -		l = add * 0.5,
        -		h, s;
        -
        -	if ( min === max ) {
        -		h = 0;
        -	} else if ( r === max ) {
        -		h = ( 60 * ( g - b ) / diff ) + 360;
        -	} else if ( g === max ) {
        -		h = ( 60 * ( b - r ) / diff ) + 120;
        -	} else {
        -		h = ( 60 * ( r - g ) / diff ) + 240;
        -	}
        -
        -	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
        -	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
        -	if ( diff === 0 ) {
        -		s = 0;
        -	} else if ( l <= 0.5 ) {
        -		s = diff / add;
        -	} else {
        -		s = diff / ( 2 - add );
        -	}
        -	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
        -};
        -
        -spaces.hsla.from = function( hsla ) {
        -	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
        -		return [ null, null, null, hsla[ 3 ] ];
        -	}
        -	var h = hsla[ 0 ] / 360,
        -		s = hsla[ 1 ],
        -		l = hsla[ 2 ],
        -		a = hsla[ 3 ],
        -		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
        -		p = 2 * l - q;
        -
        -	return [
        -		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
        -		Math.round( hue2rgb( p, q, h ) * 255 ),
        -		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
        -		a
        -	];
        -};
        -
        -each( spaces, function( spaceName, space ) {
        -	var props = space.props,
        -		cache = space.cache,
        -		to = space.to,
        -		from = space.from;
        -
        -	// makes rgba() and hsla()
        -	color.fn[ spaceName ] = function( value ) {
        -
        -		// generate a cache for this space if it doesn't exist
        -		if ( to && !this[ cache ] ) {
        -			this[ cache ] = to( this._rgba );
        -		}
        -		if ( value === undefined ) {
        -			return this[ cache ].slice();
        -		}
        -
        -		var ret,
        -			type = jQuery.type( value ),
        -			arr = ( type === "array" || type === "object" ) ? value : arguments,
        -			local = this[ cache ].slice();
        -
        -		each( props, function( key, prop ) {
        -			var val = arr[ type === "object" ? key : prop.idx ];
        -			if ( val == null ) {
        -				val = local[ prop.idx ];
        -			}
        -			local[ prop.idx ] = clamp( val, prop );
        -		});
        -
        -		if ( from ) {
        -			ret = color( from( local ) );
        -			ret[ cache ] = local;
        -			return ret;
        -		} else {
        -			return color( local );
        -		}
        -	};
        -
        -	// makes red() green() blue() alpha() hue() saturation() lightness()
        -	each( props, function( key, prop ) {
        -		// alpha is included in more than one space
        -		if ( color.fn[ key ] ) {
        -			return;
        -		}
        -		color.fn[ key ] = function( value ) {
        -			var vtype = jQuery.type( value ),
        -				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
        -				local = this[ fn ](),
        -				cur = local[ prop.idx ],
        -				match;
        -
        -			if ( vtype === "undefined" ) {
        -				return cur;
        -			}
        -
        -			if ( vtype === "function" ) {
        -				value = value.call( this, cur );
        -				vtype = jQuery.type( value );
        -			}
        -			if ( value == null && prop.empty ) {
        -				return this;
        -			}
        -			if ( vtype === "string" ) {
        -				match = rplusequals.exec( value );
        -				if ( match ) {
        -					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
        -				}
        -			}
        -			local[ prop.idx ] = value;
        -			return this[ fn ]( local );
        -		};
        -	});
        -});
        -
        -// add cssHook and .fx.step function for each named hook.
        -// accept a space separated string of properties
        -color.hook = function( hook ) {
        -	var hooks = hook.split( " " );
        -	each( hooks, function( i, hook ) {
        -		jQuery.cssHooks[ hook ] = {
        -			set: function( elem, value ) {
        -				var parsed, curElem,
        -					backgroundColor = "";
        -
        -				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
        -					value = color( parsed || value );
        -					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
        -						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
        -						while (
        -							(backgroundColor === "" || backgroundColor === "transparent") &&
        -							curElem && curElem.style
        -						) {
        -							try {
        -								backgroundColor = jQuery.css( curElem, "backgroundColor" );
        -								curElem = curElem.parentNode;
        -							} catch ( e ) {
        -							}
        -						}
        -
        -						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
        -							backgroundColor :
        -							"_default" );
        -					}
        -
        -					value = value.toRgbaString();
        -				}
        -				try {
        -					elem.style[ hook ] = value;
        -				} catch ( e ) {
        -					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
        -				}
        -			}
        -		};
        -		jQuery.fx.step[ hook ] = function( fx ) {
        -			if ( !fx.colorInit ) {
        -				fx.start = color( fx.elem, hook );
        -				fx.end = color( fx.end );
        -				fx.colorInit = true;
        -			}
        -			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
        -		};
        -	});
        -
        -};
        -
        -color.hook( stepHooks );
        -
        -jQuery.cssHooks.borderColor = {
        -	expand: function( value ) {
        -		var expanded = {};
        -
        -		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
        -			expanded[ "border" + part + "Color" ] = value;
        -		});
        -		return expanded;
        -	}
        -};
        -
        -// Basic color names only.
        -// Usage of any of the other color names requires adding yourself or including
        -// jquery.color.svg-names.js.
        -colors = jQuery.Color.names = {
        -	// 4.1. Basic color keywords
        -	aqua: "#00ffff",
        -	black: "#000000",
        -	blue: "#0000ff",
        -	fuchsia: "#ff00ff",
        -	gray: "#808080",
        -	green: "#008000",
        -	lime: "#00ff00",
        -	maroon: "#800000",
        -	navy: "#000080",
        -	olive: "#808000",
        -	purple: "#800080",
        -	red: "#ff0000",
        -	silver: "#c0c0c0",
        -	teal: "#008080",
        -	white: "#ffffff",
        -	yellow: "#ffff00",
        -
        -	// 4.2.3. "transparent" color keyword
        -	transparent: [ null, null, null, 0 ],
        -
        -	_default: "#ffffff"
        -};
        -
        -})( jQuery );
        -
        -/******************************************************************************/
        -/****************************** CLASS ANIMATIONS ******************************/
        -/******************************************************************************/
        -(function() {
        -
        -var classAnimationActions = [ "add", "remove", "toggle" ],
        -	shorthandStyles = {
        -		border: 1,
        -		borderBottom: 1,
        -		borderColor: 1,
        -		borderLeft: 1,
        -		borderRight: 1,
        -		borderTop: 1,
        -		borderWidth: 1,
        -		margin: 1,
        -		padding: 1
        -	};
        -
        -$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
        -	$.fx.step[ prop ] = function( fx ) {
        -		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
        -			jQuery.style( fx.elem, prop, fx.end );
        -			fx.setAttr = true;
        -		}
        -	};
        -});
        -
        -function getElementStyles( elem ) {
        -	var key, len,
        -		style = elem.ownerDocument.defaultView ?
        -			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
        -			elem.currentStyle,
        -		styles = {};
        -
        -	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
        -		len = style.length;
        -		while ( len-- ) {
        -			key = style[ len ];
        -			if ( typeof style[ key ] === "string" ) {
        -				styles[ $.camelCase( key ) ] = style[ key ];
        -			}
        -		}
        -	// support: Opera, IE <9
        -	} else {
        -		for ( key in style ) {
        -			if ( typeof style[ key ] === "string" ) {
        -				styles[ key ] = style[ key ];
        -			}
        -		}
        -	}
        -
        -	return styles;
        -}
        -
        -function styleDifference( oldStyle, newStyle ) {
        -	var diff = {},
        -		name, value;
        -
        -	for ( name in newStyle ) {
        -		value = newStyle[ name ];
        -		if ( oldStyle[ name ] !== value ) {
        -			if ( !shorthandStyles[ name ] ) {
        -				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
        -					diff[ name ] = value;
        -				}
        -			}
        -		}
        -	}
        -
        -	return diff;
        -}
        -
        -// support: jQuery <1.8
        -if ( !$.fn.addBack ) {
        -	$.fn.addBack = function( selector ) {
        -		return this.add( selector == null ?
        -			this.prevObject : this.prevObject.filter( selector )
        -		);
        -	};
        -}
        -
        -$.effects.animateClass = function( value, duration, easing, callback ) {
        -	var o = $.speed( duration, easing, callback );
        -
        -	return this.queue( function() {
        -		var animated = $( this ),
        -			baseClass = animated.attr( "class" ) || "",
        -			applyClassChange,
        -			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
        -
        -		// map the animated objects to store the original styles.
        -		allAnimations = allAnimations.map(function() {
        -			var el = $( this );
        -			return {
        -				el: el,
        -				start: getElementStyles( this )
        -			};
        -		});
        -
        -		// apply class change
        -		applyClassChange = function() {
        -			$.each( classAnimationActions, function(i, action) {
        -				if ( value[ action ] ) {
        -					animated[ action + "Class" ]( value[ action ] );
        -				}
        -			});
        -		};
        -		applyClassChange();
        -
        -		// map all animated objects again - calculate new styles and diff
        -		allAnimations = allAnimations.map(function() {
        -			this.end = getElementStyles( this.el[ 0 ] );
        -			this.diff = styleDifference( this.start, this.end );
        -			return this;
        -		});
        -
        -		// apply original class
        -		animated.attr( "class", baseClass );
        -
        -		// map all animated objects again - this time collecting a promise
        -		allAnimations = allAnimations.map(function() {
        -			var styleInfo = this,
        -				dfd = $.Deferred(),
        -				opts = $.extend({}, o, {
        -					queue: false,
        -					complete: function() {
        -						dfd.resolve( styleInfo );
        -					}
        -				});
        -
        -			this.el.animate( this.diff, opts );
        -			return dfd.promise();
        -		});
        -
        -		// once all animations have completed:
        -		$.when.apply( $, allAnimations.get() ).done(function() {
        -
        -			// set the final class
        -			applyClassChange();
        -
        -			// for each animated element,
        -			// clear all css properties that were animated
        -			$.each( arguments, function() {
        -				var el = this.el;
        -				$.each( this.diff, function(key) {
        -					el.css( key, "" );
        -				});
        -			});
        -
        -			// this is guarnteed to be there if you use jQuery.speed()
        -			// it also handles dequeuing the next anim...
        -			o.complete.call( animated[ 0 ] );
        -		});
        -	});
        -};
        -
        -$.fn.extend({
        -	addClass: (function( orig ) {
        -		return function( classNames, speed, easing, callback ) {
        -			return speed ?
        -				$.effects.animateClass.call( this,
        -					{ add: classNames }, speed, easing, callback ) :
        -				orig.apply( this, arguments );
        -		};
        -	})( $.fn.addClass ),
        -
        -	removeClass: (function( orig ) {
        -		return function( classNames, speed, easing, callback ) {
        -			return arguments.length > 1 ?
        -				$.effects.animateClass.call( this,
        -					{ remove: classNames }, speed, easing, callback ) :
        -				orig.apply( this, arguments );
        -		};
        -	})( $.fn.removeClass ),
        -
        -	toggleClass: (function( orig ) {
        -		return function( classNames, force, speed, easing, callback ) {
        -			if ( typeof force === "boolean" || force === undefined ) {
        -				if ( !speed ) {
        -					// without speed parameter
        -					return orig.apply( this, arguments );
        -				} else {
        -					return $.effects.animateClass.call( this,
        -						(force ? { add: classNames } : { remove: classNames }),
        -						speed, easing, callback );
        -				}
        -			} else {
        -				// without force parameter
        -				return $.effects.animateClass.call( this,
        -					{ toggle: classNames }, force, speed, easing );
        -			}
        -		};
        -	})( $.fn.toggleClass ),
        -
        -	switchClass: function( remove, add, speed, easing, callback) {
        -		return $.effects.animateClass.call( this, {
        -			add: add,
        -			remove: remove
        -		}, speed, easing, callback );
        -	}
        -});
        -
        -})();
        -
        -/******************************************************************************/
        -/*********************************** EFFECTS **********************************/
        -/******************************************************************************/
        -
        -(function() {
        -
        -$.extend( $.effects, {
        -	version: "1.11.4",
        -
        -	// Saves a set of properties in a data storage
        -	save: function( element, set ) {
        -		for ( var i = 0; i < set.length; i++ ) {
        -			if ( set[ i ] !== null ) {
        -				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
        -			}
        -		}
        -	},
        -
        -	// Restores a set of previously saved properties from a data storage
        -	restore: function( element, set ) {
        -		var val, i;
        -		for ( i = 0; i < set.length; i++ ) {
        -			if ( set[ i ] !== null ) {
        -				val = element.data( dataSpace + set[ i ] );
        -				// support: jQuery 1.6.2
        -				// http://bugs.jquery.com/ticket/9917
        -				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
        -				// We can't differentiate between "" and 0 here, so we just assume
        -				// empty string since it's likely to be a more common value...
        -				if ( val === undefined ) {
        -					val = "";
        -				}
        -				element.css( set[ i ], val );
        -			}
        -		}
        -	},
        -
        -	setMode: function( el, mode ) {
        -		if (mode === "toggle") {
        -			mode = el.is( ":hidden" ) ? "show" : "hide";
        -		}
        -		return mode;
        -	},
        -
        -	// Translates a [top,left] array into a baseline value
        -	// this should be a little more flexible in the future to handle a string & hash
        -	getBaseline: function( origin, original ) {
        -		var y, x;
        -		switch ( origin[ 0 ] ) {
        -			case "top": y = 0; break;
        -			case "middle": y = 0.5; break;
        -			case "bottom": y = 1; break;
        -			default: y = origin[ 0 ] / original.height;
        -		}
        -		switch ( origin[ 1 ] ) {
        -			case "left": x = 0; break;
        -			case "center": x = 0.5; break;
        -			case "right": x = 1; break;
        -			default: x = origin[ 1 ] / original.width;
        -		}
        -		return {
        -			x: x,
        -			y: y
        -		};
        -	},
        -
        -	// Wraps the element around a wrapper that copies position properties
        -	createWrapper: function( element ) {
        -
        -		// if the element is already wrapped, return it
        -		if ( element.parent().is( ".ui-effects-wrapper" )) {
        -			return element.parent();
        -		}
        -
        -		// wrap the element
        -		var props = {
        -				width: element.outerWidth(true),
        -				height: element.outerHeight(true),
        -				"float": element.css( "float" )
        -			},
        -			wrapper = $( "<div></div>" )
        -				.addClass( "ui-effects-wrapper" )
        -				.css({
        -					fontSize: "100%",
        -					background: "transparent",
        -					border: "none",
        -					margin: 0,
        -					padding: 0
        -				}),
        -			// Store the size in case width/height are defined in % - Fixes #5245
        -			size = {
        -				width: element.width(),
        -				height: element.height()
        -			},
        -			active = document.activeElement;
        -
        -		// support: Firefox
        -		// Firefox incorrectly exposes anonymous content
        -		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
        -		try {
        -			active.id;
        -		} catch ( e ) {
        -			active = document.body;
        -		}
        -
        -		element.wrap( wrapper );
        -
        -		// Fixes #7595 - Elements lose focus when wrapped.
        -		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        -			$( active ).focus();
        -		}
        -
        -		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
        -
        -		// transfer positioning properties to the wrapper
        -		if ( element.css( "position" ) === "static" ) {
        -			wrapper.css({ position: "relative" });
        -			element.css({ position: "relative" });
        -		} else {
        -			$.extend( props, {
        -				position: element.css( "position" ),
        -				zIndex: element.css( "z-index" )
        -			});
        -			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
        -				props[ pos ] = element.css( pos );
        -				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
        -					props[ pos ] = "auto";
        -				}
        -			});
        -			element.css({
        -				position: "relative",
        -				top: 0,
        -				left: 0,
        -				right: "auto",
        -				bottom: "auto"
        -			});
        -		}
        -		element.css(size);
        -
        -		return wrapper.css( props ).show();
        -	},
        -
        -	removeWrapper: function( element ) {
        -		var active = document.activeElement;
        -
        -		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
        -			element.parent().replaceWith( element );
        -
        -			// Fixes #7595 - Elements lose focus when wrapped.
        -			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        -				$( active ).focus();
        -			}
        -		}
        -
        -		return element;
        -	},
        -
        -	setTransition: function( element, list, factor, value ) {
        -		value = value || {};
        -		$.each( list, function( i, x ) {
        -			var unit = element.cssUnit( x );
        -			if ( unit[ 0 ] > 0 ) {
        -				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
        -			}
        -		});
        -		return value;
        -	}
        -});
        -
        -// return an effect options object for the given parameters:
        -function _normalizeArguments( effect, options, speed, callback ) {
        -
        -	// allow passing all options as the first parameter
        -	if ( $.isPlainObject( effect ) ) {
        -		options = effect;
        -		effect = effect.effect;
        -	}
        -
        -	// convert to an object
        -	effect = { effect: effect };
        -
        -	// catch (effect, null, ...)
        -	if ( options == null ) {
        -		options = {};
        -	}
        -
        -	// catch (effect, callback)
        -	if ( $.isFunction( options ) ) {
        -		callback = options;
        -		speed = null;
        -		options = {};
        -	}
        -
        -	// catch (effect, speed, ?)
        -	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
        -		callback = speed;
        -		speed = options;
        -		options = {};
        -	}
        -
        -	// catch (effect, options, callback)
        -	if ( $.isFunction( speed ) ) {
        -		callback = speed;
        -		speed = null;
        -	}
        -
        -	// add options to effect
        -	if ( options ) {
        -		$.extend( effect, options );
        -	}
        -
        -	speed = speed || options.duration;
        -	effect.duration = $.fx.off ? 0 :
        -		typeof speed === "number" ? speed :
        -		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
        -		$.fx.speeds._default;
        -
        -	effect.complete = callback || options.complete;
        -
        -	return effect;
        -}
        -
        -function standardAnimationOption( option ) {
        -	// Valid standard speeds (nothing, number, named speed)
        -	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
        -		return true;
        -	}
        -
        -	// Invalid strings - treat as "normal" speed
        -	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
        -		return true;
        -	}
        -
        -	// Complete callback
        -	if ( $.isFunction( option ) ) {
        -		return true;
        -	}
        -
        -	// Options hash (but not naming an effect)
        -	if ( typeof option === "object" && !option.effect ) {
        -		return true;
        -	}
        -
        -	// Didn't match any standard API
        -	return false;
        -}
        -
        -$.fn.extend({
        -	effect: function( /* effect, options, speed, callback */ ) {
        -		var args = _normalizeArguments.apply( this, arguments ),
        -			mode = args.mode,
        -			queue = args.queue,
        -			effectMethod = $.effects.effect[ args.effect ];
        -
        -		if ( $.fx.off || !effectMethod ) {
        -			// delegate to the original method (e.g., .show()) if possible
        -			if ( mode ) {
        -				return this[ mode ]( args.duration, args.complete );
        -			} else {
        -				return this.each( function() {
        -					if ( args.complete ) {
        -						args.complete.call( this );
        -					}
        -				});
        -			}
        -		}
        -
        -		function run( next ) {
        -			var elem = $( this ),
        -				complete = args.complete,
        -				mode = args.mode;
        -
        -			function done() {
        -				if ( $.isFunction( complete ) ) {
        -					complete.call( elem[0] );
        -				}
        -				if ( $.isFunction( next ) ) {
        -					next();
        -				}
        -			}
        -
        -			// If the element already has the correct final state, delegate to
        -			// the core methods so the internal tracking of "olddisplay" works.
        -			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
        -				elem[ mode ]();
        -				done();
        -			} else {
        -				effectMethod.call( elem[0], args, done );
        -			}
        -		}
        -
        -		return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
        -	},
        -
        -	show: (function( orig ) {
        -		return function( option ) {
        -			if ( standardAnimationOption( option ) ) {
        -				return orig.apply( this, arguments );
        -			} else {
        -				var args = _normalizeArguments.apply( this, arguments );
        -				args.mode = "show";
        -				return this.effect.call( this, args );
        -			}
        -		};
        -	})( $.fn.show ),
        -
        -	hide: (function( orig ) {
        -		return function( option ) {
        -			if ( standardAnimationOption( option ) ) {
        -				return orig.apply( this, arguments );
        -			} else {
        -				var args = _normalizeArguments.apply( this, arguments );
        -				args.mode = "hide";
        -				return this.effect.call( this, args );
        -			}
        -		};
        -	})( $.fn.hide ),
        -
        -	toggle: (function( orig ) {
        -		return function( option ) {
        -			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
        -				return orig.apply( this, arguments );
        -			} else {
        -				var args = _normalizeArguments.apply( this, arguments );
        -				args.mode = "toggle";
        -				return this.effect.call( this, args );
        -			}
        -		};
        -	})( $.fn.toggle ),
        -
        -	// helper functions
        -	cssUnit: function(key) {
        -		var style = this.css( key ),
        -			val = [];
        -
        -		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
        -			if ( style.indexOf( unit ) > 0 ) {
        -				val = [ parseFloat( style ), unit ];
        -			}
        -		});
        -		return val;
        -	}
        -});
        -
        -})();
        -
        -/******************************************************************************/
        -/*********************************** EASING ***********************************/
        -/******************************************************************************/
        -
        -(function() {
        -
        -// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
        -
        -var baseEasings = {};
        -
        -$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
        -	baseEasings[ name ] = function( p ) {
        -		return Math.pow( p, i + 2 );
        -	};
        -});
        -
        -$.extend( baseEasings, {
        -	Sine: function( p ) {
        -		return 1 - Math.cos( p * Math.PI / 2 );
        -	},
        -	Circ: function( p ) {
        -		return 1 - Math.sqrt( 1 - p * p );
        -	},
        -	Elastic: function( p ) {
        -		return p === 0 || p === 1 ? p :
        -			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
        -	},
        -	Back: function( p ) {
        -		return p * p * ( 3 * p - 2 );
        -	},
        -	Bounce: function( p ) {
        -		var pow2,
        -			bounce = 4;
        -
        -		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
        -		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
        -	}
        -});
        -
        -$.each( baseEasings, function( name, easeIn ) {
        -	$.easing[ "easeIn" + name ] = easeIn;
        -	$.easing[ "easeOut" + name ] = function( p ) {
        -		return 1 - easeIn( 1 - p );
        -	};
        -	$.easing[ "easeInOut" + name ] = function( p ) {
        -		return p < 0.5 ?
        -			easeIn( p * 2 ) / 2 :
        -			1 - easeIn( p * -2 + 2 ) / 2;
        -	};
        -});
        -
        -})();
        -
        -var effect = $.effects;
        -
        -
        -/*!
        - * jQuery UI Effects Blind 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/blind-effect/
        - */
        -
        -
        -var effectBlind = $.effects.effect.blind = function( o, done ) {
        -	// Create element
        -	var el = $( this ),
        -		rvertical = /up|down|vertical/,
        -		rpositivemotion = /up|left|vertical|horizontal/,
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		direction = o.direction || "up",
        -		vertical = rvertical.test( direction ),
        -		ref = vertical ? "height" : "width",
        -		ref2 = vertical ? "top" : "left",
        -		motion = rpositivemotion.test( direction ),
        -		animation = {},
        -		show = mode === "show",
        -		wrapper, distance, margin;
        -
        -	// if already wrapped, the wrapper's properties are my property. #6245
        -	if ( el.parent().is( ".ui-effects-wrapper" ) ) {
        -		$.effects.save( el.parent(), props );
        -	} else {
        -		$.effects.save( el, props );
        -	}
        -	el.show();
        -	wrapper = $.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -
        -	distance = wrapper[ ref ]();
        -	margin = parseFloat( wrapper.css( ref2 ) ) || 0;
        -
        -	animation[ ref ] = show ? distance : 0;
        -	if ( !motion ) {
        -		el
        -			.css( vertical ? "bottom" : "right", 0 )
        -			.css( vertical ? "top" : "left", "auto" )
        -			.css({ position: "absolute" });
        -
        -		animation[ ref2 ] = show ? margin : distance + margin;
        -	}
        -
        -	// start at 0 if we are showing
        -	if ( show ) {
        -		wrapper.css( ref, 0 );
        -		if ( !motion ) {
        -			wrapper.css( ref2, margin + distance );
        -		}
        -	}
        -
        -	// Animate
        -	wrapper.animate( animation, {
        -		duration: o.duration,
        -		easing: o.easing,
        -		queue: false,
        -		complete: function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Bounce 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/bounce-effect/
        - */
        -
        -
        -var effectBounce = $.effects.effect.bounce = function( o, done ) {
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -
        -		// defaults:
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		hide = mode === "hide",
        -		show = mode === "show",
        -		direction = o.direction || "up",
        -		distance = o.distance,
        -		times = o.times || 5,
        -
        -		// number of internal animations
        -		anims = times * 2 + ( show || hide ? 1 : 0 ),
        -		speed = o.duration / anims,
        -		easing = o.easing,
        -
        -		// utility:
        -		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        -		motion = ( direction === "up" || direction === "left" ),
        -		i,
        -		upAnim,
        -		downAnim,
        -
        -		// we will need to re-assemble the queue to stack our animations in place
        -		queue = el.queue(),
        -		queuelen = queue.length;
        -
        -	// Avoid touching opacity to prevent clearType and PNG issues in IE
        -	if ( show || hide ) {
        -		props.push( "opacity" );
        -	}
        -
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el ); // Create Wrapper
        -
        -	// default distance for the BIGGEST bounce is the outer Distance / 3
        -	if ( !distance ) {
        -		distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
        -	}
        -
        -	if ( show ) {
        -		downAnim = { opacity: 1 };
        -		downAnim[ ref ] = 0;
        -
        -		// if we are showing, force opacity 0 and set the initial position
        -		// then do the "first" animation
        -		el.css( "opacity", 0 )
        -			.css( ref, motion ? -distance * 2 : distance * 2 )
        -			.animate( downAnim, speed, easing );
        -	}
        -
        -	// start at the smallest distance if we are hiding
        -	if ( hide ) {
        -		distance = distance / Math.pow( 2, times - 1 );
        -	}
        -
        -	downAnim = {};
        -	downAnim[ ref ] = 0;
        -	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
        -	for ( i = 0; i < times; i++ ) {
        -		upAnim = {};
        -		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        -
        -		el.animate( upAnim, speed, easing )
        -			.animate( downAnim, speed, easing );
        -
        -		distance = hide ? distance * 2 : distance / 2;
        -	}
        -
        -	// Last Bounce when Hiding
        -	if ( hide ) {
        -		upAnim = { opacity: 0 };
        -		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        -
        -		el.animate( upAnim, speed, easing );
        -	}
        -
        -	el.queue(function() {
        -		if ( hide ) {
        -			el.hide();
        -		}
        -		$.effects.restore( el, props );
        -		$.effects.removeWrapper( el );
        -		done();
        -	});
        -
        -	// inject all the animations we just queued to be first in line (after "inprogress")
        -	if ( queuelen > 1) {
        -		queue.splice.apply( queue,
        -			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
        -	}
        -	el.dequeue();
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Clip 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/clip-effect/
        - */
        -
        -
        -var effectClip = $.effects.effect.clip = function( o, done ) {
        -	// Create element
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -		direction = o.direction || "vertical",
        -		vert = direction === "vertical",
        -		size = vert ? "height" : "width",
        -		position = vert ? "top" : "left",
        -		animation = {},
        -		wrapper, animate, distance;
        -
        -	// Save & Show
        -	$.effects.save( el, props );
        -	el.show();
        -
        -	// Create Wrapper
        -	wrapper = $.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -	animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
        -	distance = animate[ size ]();
        -
        -	// Shift
        -	if ( show ) {
        -		animate.css( size, 0 );
        -		animate.css( position, distance / 2 );
        -	}
        -
        -	// Create Animation Object:
        -	animation[ size ] = show ? distance : 0;
        -	animation[ position ] = show ? 0 : distance / 2;
        -
        -	// Animate
        -	animate.animate( animation, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( !show ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Drop 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/drop-effect/
        - */
        -
        -
        -var effectDrop = $.effects.effect.drop = function( o, done ) {
        -
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -		direction = o.direction || "left",
        -		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        -		motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
        -		animation = {
        -			opacity: show ? 1 : 0
        -		},
        -		distance;
        -
        -	// Adjust
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el );
        -
        -	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
        -
        -	if ( show ) {
        -		el
        -			.css( "opacity", 0 )
        -			.css( ref, motion === "pos" ? -distance : distance );
        -	}
        -
        -	// Animation
        -	animation[ ref ] = ( show ?
        -		( motion === "pos" ? "+=" : "-=" ) :
        -		( motion === "pos" ? "-=" : "+=" ) ) +
        -		distance;
        -
        -	// Animate
        -	el.animate( animation, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Explode 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/explode-effect/
        - */
        -
        -
        -var effectExplode = $.effects.effect.explode = function( o, done ) {
        -
        -	var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
        -		cells = rows,
        -		el = $( this ),
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -
        -		// show and then visibility:hidden the element before calculating offset
        -		offset = el.show().css( "visibility", "hidden" ).offset(),
        -
        -		// width and height of a piece
        -		width = Math.ceil( el.outerWidth() / cells ),
        -		height = Math.ceil( el.outerHeight() / rows ),
        -		pieces = [],
        -
        -		// loop
        -		i, j, left, top, mx, my;
        -
        -	// children animate complete:
        -	function childComplete() {
        -		pieces.push( this );
        -		if ( pieces.length === rows * cells ) {
        -			animComplete();
        -		}
        -	}
        -
        -	// clone the element for each row and cell.
        -	for ( i = 0; i < rows ; i++ ) { // ===>
        -		top = offset.top + i * height;
        -		my = i - ( rows - 1 ) / 2 ;
        -
        -		for ( j = 0; j < cells ; j++ ) { // |||
        -			left = offset.left + j * width;
        -			mx = j - ( cells - 1 ) / 2 ;
        -
        -			// Create a clone of the now hidden main element that will be absolute positioned
        -			// within a wrapper div off the -left and -top equal to size of our pieces
        -			el
        -				.clone()
        -				.appendTo( "body" )
        -				.wrap( "<div></div>" )
        -				.css({
        -					position: "absolute",
        -					visibility: "visible",
        -					left: -j * width,
        -					top: -i * height
        -				})
        -
        -			// select the wrapper - make it overflow: hidden and absolute positioned based on
        -			// where the original was located +left and +top equal to the size of pieces
        -				.parent()
        -				.addClass( "ui-effects-explode" )
        -				.css({
        -					position: "absolute",
        -					overflow: "hidden",
        -					width: width,
        -					height: height,
        -					left: left + ( show ? mx * width : 0 ),
        -					top: top + ( show ? my * height : 0 ),
        -					opacity: show ? 0 : 1
        -				}).animate({
        -					left: left + ( show ? 0 : mx * width ),
        -					top: top + ( show ? 0 : my * height ),
        -					opacity: show ? 1 : 0
        -				}, o.duration || 500, o.easing, childComplete );
        -		}
        -	}
        -
        -	function animComplete() {
        -		el.css({
        -			visibility: "visible"
        -		});
        -		$( pieces ).remove();
        -		if ( !show ) {
        -			el.hide();
        -		}
        -		done();
        -	}
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Fade 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/fade-effect/
        - */
        -
        -
        -var effectFade = $.effects.effect.fade = function( o, done ) {
        -	var el = $( this ),
        -		mode = $.effects.setMode( el, o.mode || "toggle" );
        -
        -	el.animate({
        -		opacity: mode
        -	}, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: done
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Fold 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/fold-effect/
        - */
        -
        -
        -var effectFold = $.effects.effect.fold = function( o, done ) {
        -
        -	// Create element
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -		hide = mode === "hide",
        -		size = o.size || 15,
        -		percent = /([0-9]+)%/.exec( size ),
        -		horizFirst = !!o.horizFirst,
        -		widthFirst = show !== horizFirst,
        -		ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
        -		duration = o.duration / 2,
        -		wrapper, distance,
        -		animation1 = {},
        -		animation2 = {};
        -
        -	$.effects.save( el, props );
        -	el.show();
        -
        -	// Create Wrapper
        -	wrapper = $.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -	distance = widthFirst ?
        -		[ wrapper.width(), wrapper.height() ] :
        -		[ wrapper.height(), wrapper.width() ];
        -
        -	if ( percent ) {
        -		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
        -	}
        -	if ( show ) {
        -		wrapper.css( horizFirst ? {
        -			height: 0,
        -			width: size
        -		} : {
        -			height: size,
        -			width: 0
        -		});
        -	}
        -
        -	// Animation
        -	animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
        -	animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
        -
        -	// Animate
        -	wrapper
        -		.animate( animation1, duration, o.easing )
        -		.animate( animation2, duration, o.easing, function() {
        -			if ( hide ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		});
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Highlight 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/highlight-effect/
        - */
        -
        -
        -var effectHighlight = $.effects.effect.highlight = function( o, done ) {
        -	var elem = $( this ),
        -		props = [ "backgroundImage", "backgroundColor", "opacity" ],
        -		mode = $.effects.setMode( elem, o.mode || "show" ),
        -		animation = {
        -			backgroundColor: elem.css( "backgroundColor" )
        -		};
        -
        -	if (mode === "hide") {
        -		animation.opacity = 0;
        -	}
        -
        -	$.effects.save( elem, props );
        -
        -	elem
        -		.show()
        -		.css({
        -			backgroundImage: "none",
        -			backgroundColor: o.color || "#ffff99"
        -		})
        -		.animate( animation, {
        -			queue: false,
        -			duration: o.duration,
        -			easing: o.easing,
        -			complete: function() {
        -				if ( mode === "hide" ) {
        -					elem.hide();
        -				}
        -				$.effects.restore( elem, props );
        -				done();
        -			}
        -		});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Size 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/size-effect/
        - */
        -
        -
        -var effectSize = $.effects.effect.size = function( o, done ) {
        -
        -	// Create element
        -	var original, baseline, factor,
        -		el = $( this ),
        -		props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
        -
        -		// Always restore
        -		props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
        -
        -		// Copy for children
        -		props2 = [ "width", "height", "overflow" ],
        -		cProps = [ "fontSize" ],
        -		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
        -		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
        -
        -		// Set options
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		restore = o.restore || mode !== "effect",
        -		scale = o.scale || "both",
        -		origin = o.origin || [ "middle", "center" ],
        -		position = el.css( "position" ),
        -		props = restore ? props0 : props1,
        -		zero = {
        -			height: 0,
        -			width: 0,
        -			outerHeight: 0,
        -			outerWidth: 0
        -		};
        -
        -	if ( mode === "show" ) {
        -		el.show();
        -	}
        -	original = {
        -		height: el.height(),
        -		width: el.width(),
        -		outerHeight: el.outerHeight(),
        -		outerWidth: el.outerWidth()
        -	};
        -
        -	if ( o.mode === "toggle" && mode === "show" ) {
        -		el.from = o.to || zero;
        -		el.to = o.from || original;
        -	} else {
        -		el.from = o.from || ( mode === "show" ? zero : original );
        -		el.to = o.to || ( mode === "hide" ? zero : original );
        -	}
        -
        -	// Set scaling factor
        -	factor = {
        -		from: {
        -			y: el.from.height / original.height,
        -			x: el.from.width / original.width
        -		},
        -		to: {
        -			y: el.to.height / original.height,
        -			x: el.to.width / original.width
        -		}
        -	};
        -
        -	// Scale the css box
        -	if ( scale === "box" || scale === "both" ) {
        -
        -		// Vertical props scaling
        -		if ( factor.from.y !== factor.to.y ) {
        -			props = props.concat( vProps );
        -			el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
        -			el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
        -		}
        -
        -		// Horizontal props scaling
        -		if ( factor.from.x !== factor.to.x ) {
        -			props = props.concat( hProps );
        -			el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
        -			el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
        -		}
        -	}
        -
        -	// Scale the content
        -	if ( scale === "content" || scale === "both" ) {
        -
        -		// Vertical props scaling
        -		if ( factor.from.y !== factor.to.y ) {
        -			props = props.concat( cProps ).concat( props2 );
        -			el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
        -			el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
        -		}
        -	}
        -
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el );
        -	el.css( "overflow", "hidden" ).css( el.from );
        -
        -	// Adjust
        -	if (origin) { // Calculate baseline shifts
        -		baseline = $.effects.getBaseline( origin, original );
        -		el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
        -		el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
        -		el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
        -		el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
        -	}
        -	el.css( el.from ); // set top & left
        -
        -	// Animate
        -	if ( scale === "content" || scale === "both" ) { // Scale the children
        -
        -		// Add margins/font-size
        -		vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
        -		hProps = hProps.concat([ "marginLeft", "marginRight" ]);
        -		props2 = props0.concat(vProps).concat(hProps);
        -
        -		el.find( "*[width]" ).each( function() {
        -			var child = $( this ),
        -				c_original = {
        -					height: child.height(),
        -					width: child.width(),
        -					outerHeight: child.outerHeight(),
        -					outerWidth: child.outerWidth()
        -				};
        -			if (restore) {
        -				$.effects.save(child, props2);
        -			}
        -
        -			child.from = {
        -				height: c_original.height * factor.from.y,
        -				width: c_original.width * factor.from.x,
        -				outerHeight: c_original.outerHeight * factor.from.y,
        -				outerWidth: c_original.outerWidth * factor.from.x
        -			};
        -			child.to = {
        -				height: c_original.height * factor.to.y,
        -				width: c_original.width * factor.to.x,
        -				outerHeight: c_original.height * factor.to.y,
        -				outerWidth: c_original.width * factor.to.x
        -			};
        -
        -			// Vertical props scaling
        -			if ( factor.from.y !== factor.to.y ) {
        -				child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
        -				child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
        -			}
        -
        -			// Horizontal props scaling
        -			if ( factor.from.x !== factor.to.x ) {
        -				child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
        -				child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
        -			}
        -
        -			// Animate children
        -			child.css( child.from );
        -			child.animate( child.to, o.duration, o.easing, function() {
        -
        -				// Restore children
        -				if ( restore ) {
        -					$.effects.restore( child, props2 );
        -				}
        -			});
        -		});
        -	}
        -
        -	// Animate
        -	el.animate( el.to, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( el.to.opacity === 0 ) {
        -				el.css( "opacity", el.from.opacity );
        -			}
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			if ( !restore ) {
        -
        -				// we need to calculate our new positioning based on the scaling
        -				if ( position === "static" ) {
        -					el.css({
        -						position: "relative",
        -						top: el.to.top,
        -						left: el.to.left
        -					});
        -				} else {
        -					$.each([ "top", "left" ], function( idx, pos ) {
        -						el.css( pos, function( _, str ) {
        -							var val = parseInt( str, 10 ),
        -								toRef = idx ? el.to.left : el.to.top;
        -
        -							// if original was "auto", recalculate the new value from wrapper
        -							if ( str === "auto" ) {
        -								return toRef + "px";
        -							}
        -
        -							return val + toRef + "px";
        -						});
        -					});
        -				}
        -			}
        -
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Scale 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/scale-effect/
        - */
        -
        -
        -var effectScale = $.effects.effect.scale = function( o, done ) {
        -
        -	// Create element
        -	var el = $( this ),
        -		options = $.extend( true, {}, o ),
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		percent = parseInt( o.percent, 10 ) ||
        -			( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
        -		direction = o.direction || "both",
        -		origin = o.origin,
        -		original = {
        -			height: el.height(),
        -			width: el.width(),
        -			outerHeight: el.outerHeight(),
        -			outerWidth: el.outerWidth()
        -		},
        -		factor = {
        -			y: direction !== "horizontal" ? (percent / 100) : 1,
        -			x: direction !== "vertical" ? (percent / 100) : 1
        -		};
        -
        -	// We are going to pass this effect to the size effect:
        -	options.effect = "size";
        -	options.queue = false;
        -	options.complete = done;
        -
        -	// Set default origin and restore for show/hide
        -	if ( mode !== "effect" ) {
        -		options.origin = origin || [ "middle", "center" ];
        -		options.restore = true;
        -	}
        -
        -	options.from = o.from || ( mode === "show" ? {
        -		height: 0,
        -		width: 0,
        -		outerHeight: 0,
        -		outerWidth: 0
        -	} : original );
        -	options.to = {
        -		height: original.height * factor.y,
        -		width: original.width * factor.x,
        -		outerHeight: original.outerHeight * factor.y,
        -		outerWidth: original.outerWidth * factor.x
        -	};
        -
        -	// Fade option to support puff
        -	if ( options.fade ) {
        -		if ( mode === "show" ) {
        -			options.from.opacity = 0;
        -			options.to.opacity = 1;
        -		}
        -		if ( mode === "hide" ) {
        -			options.from.opacity = 1;
        -			options.to.opacity = 0;
        -		}
        -	}
        -
        -	// Animate
        -	el.effect( options );
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Puff 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/puff-effect/
        - */
        -
        -
        -var effectPuff = $.effects.effect.puff = function( o, done ) {
        -	var elem = $( this ),
        -		mode = $.effects.setMode( elem, o.mode || "hide" ),
        -		hide = mode === "hide",
        -		percent = parseInt( o.percent, 10 ) || 150,
        -		factor = percent / 100,
        -		original = {
        -			height: elem.height(),
        -			width: elem.width(),
        -			outerHeight: elem.outerHeight(),
        -			outerWidth: elem.outerWidth()
        -		};
        -
        -	$.extend( o, {
        -		effect: "scale",
        -		queue: false,
        -		fade: true,
        -		mode: mode,
        -		complete: done,
        -		percent: hide ? percent : 100,
        -		from: hide ?
        -			original :
        -			{
        -				height: original.height * factor,
        -				width: original.width * factor,
        -				outerHeight: original.outerHeight * factor,
        -				outerWidth: original.outerWidth * factor
        -			}
        -	});
        -
        -	elem.effect( o );
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Pulsate 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/pulsate-effect/
        - */
        -
        -
        -var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
        -	var elem = $( this ),
        -		mode = $.effects.setMode( elem, o.mode || "show" ),
        -		show = mode === "show",
        -		hide = mode === "hide",
        -		showhide = ( show || mode === "hide" ),
        -
        -		// showing or hiding leaves of the "last" animation
        -		anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
        -		duration = o.duration / anims,
        -		animateTo = 0,
        -		queue = elem.queue(),
        -		queuelen = queue.length,
        -		i;
        -
        -	if ( show || !elem.is(":visible")) {
        -		elem.css( "opacity", 0 ).show();
        -		animateTo = 1;
        -	}
        -
        -	// anims - 1 opacity "toggles"
        -	for ( i = 1; i < anims; i++ ) {
        -		elem.animate({
        -			opacity: animateTo
        -		}, duration, o.easing );
        -		animateTo = 1 - animateTo;
        -	}
        -
        -	elem.animate({
        -		opacity: animateTo
        -	}, duration, o.easing);
        -
        -	elem.queue(function() {
        -		if ( hide ) {
        -			elem.hide();
        -		}
        -		done();
        -	});
        -
        -	// We just queued up "anims" animations, we need to put them next in the queue
        -	if ( queuelen > 1 ) {
        -		queue.splice.apply( queue,
        -			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
        -	}
        -	elem.dequeue();
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Shake 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/shake-effect/
        - */
        -
        -
        -var effectShake = $.effects.effect.shake = function( o, done ) {
        -
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		direction = o.direction || "left",
        -		distance = o.distance || 20,
        -		times = o.times || 3,
        -		anims = times * 2 + 1,
        -		speed = Math.round( o.duration / anims ),
        -		ref = (direction === "up" || direction === "down") ? "top" : "left",
        -		positiveMotion = (direction === "up" || direction === "left"),
        -		animation = {},
        -		animation1 = {},
        -		animation2 = {},
        -		i,
        -
        -		// we will need to re-assemble the queue to stack our animations in place
        -		queue = el.queue(),
        -		queuelen = queue.length;
        -
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el );
        -
        -	// Animation
        -	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
        -	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
        -	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
        -
        -	// Animate
        -	el.animate( animation, speed, o.easing );
        -
        -	// Shakes
        -	for ( i = 1; i < times; i++ ) {
        -		el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
        -	}
        -	el
        -		.animate( animation1, speed, o.easing )
        -		.animate( animation, speed / 2, o.easing )
        -		.queue(function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		});
        -
        -	// inject all the animations we just queued to be first in line (after "inprogress")
        -	if ( queuelen > 1) {
        -		queue.splice.apply( queue,
        -			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
        -	}
        -	el.dequeue();
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Slide 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/slide-effect/
        - */
        -
        -
        -var effectSlide = $.effects.effect.slide = function( o, done ) {
        -
        -	// Create element
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
        -		mode = $.effects.setMode( el, o.mode || "show" ),
        -		show = mode === "show",
        -		direction = o.direction || "left",
        -		ref = (direction === "up" || direction === "down") ? "top" : "left",
        -		positiveMotion = (direction === "up" || direction === "left"),
        -		distance,
        -		animation = {};
        -
        -	// Adjust
        -	$.effects.save( el, props );
        -	el.show();
        -	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
        -
        -	$.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -
        -	if ( show ) {
        -		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
        -	}
        -
        -	// Animation
        -	animation[ ref ] = ( show ?
        -		( positiveMotion ? "+=" : "-=") :
        -		( positiveMotion ? "-=" : "+=")) +
        -		distance;
        -
        -	// Animate
        -	el.animate( animation, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Transfer 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/transfer-effect/
        - */
        -
        -
        -var effectTransfer = $.effects.effect.transfer = function( o, done ) {
        -	var elem = $( this ),
        -		target = $( o.to ),
        -		targetFixed = target.css( "position" ) === "fixed",
        -		body = $("body"),
        -		fixTop = targetFixed ? body.scrollTop() : 0,
        -		fixLeft = targetFixed ? body.scrollLeft() : 0,
        -		endPosition = target.offset(),
        -		animation = {
        -			top: endPosition.top - fixTop,
        -			left: endPosition.left - fixLeft,
        -			height: target.innerHeight(),
        -			width: target.innerWidth()
        -		},
        -		startPosition = elem.offset(),
        -		transfer = $( "<div class='ui-effects-transfer'></div>" )
        -			.appendTo( document.body )
        -			.addClass( o.className )
        -			.css({
        -				top: startPosition.top - fixTop,
        -				left: startPosition.left - fixLeft,
        -				height: elem.innerHeight(),
        -				width: elem.innerWidth(),
        -				position: targetFixed ? "fixed" : "absolute"
        -			})
        -			.animate( animation, o.duration, o.easing, function() {
        -				transfer.remove();
        -				done();
        -			});
        -};
        -
        -
        -/*!
        - * jQuery UI Progressbar 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/progressbar/
        - */
        -
        -
        -var progressbar = $.widget( "ui.progressbar", {
        -	version: "1.11.4",
        -	options: {
        -		max: 100,
        -		value: 0,
        -
        -		change: null,
        -		complete: null
        -	},
        -
        -	min: 0,
        -
        -	_create: function() {
        -		// Constrain initial value
        -		this.oldValue = this.options.value = this._constrainedValue();
        -
        -		this.element
        -			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
        -			.attr({
        -				// Only set static values, aria-valuenow and aria-valuemax are
        -				// set inside _refreshValue()
        -				role: "progressbar",
        -				"aria-valuemin": this.min
        -			});
        -
        -		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
        -			.appendTo( this.element );
        -
        -		this._refreshValue();
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-valuemin" )
        -			.removeAttr( "aria-valuemax" )
        -			.removeAttr( "aria-valuenow" );
        -
        -		this.valueDiv.remove();
        -	},
        -
        -	value: function( newValue ) {
        -		if ( newValue === undefined ) {
        -			return this.options.value;
        -		}
        -
        -		this.options.value = this._constrainedValue( newValue );
        -		this._refreshValue();
        -	},
        -
        -	_constrainedValue: function( newValue ) {
        -		if ( newValue === undefined ) {
        -			newValue = this.options.value;
        -		}
        -
        -		this.indeterminate = newValue === false;
        -
        -		// sanitize value
        -		if ( typeof newValue !== "number" ) {
        -			newValue = 0;
        -		}
        -
        -		return this.indeterminate ? false :
        -			Math.min( this.options.max, Math.max( this.min, newValue ) );
        -	},
        -
        -	_setOptions: function( options ) {
        -		// Ensure "value" option is set after other values (like max)
        -		var value = options.value;
        -		delete options.value;
        -
        -		this._super( options );
        -
        -		this.options.value = this._constrainedValue( value );
        -		this._refreshValue();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "max" ) {
        -			// Don't allow a max less than min
        -			value = Math.max( this.min, value );
        -		}
        -		if ( key === "disabled" ) {
        -			this.element
        -				.toggleClass( "ui-state-disabled", !!value )
        -				.attr( "aria-disabled", value );
        -		}
        -		this._super( key, value );
        -	},
        -
        -	_percentage: function() {
        -		return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
        -	},
        -
        -	_refreshValue: function() {
        -		var value = this.options.value,
        -			percentage = this._percentage();
        -
        -		this.valueDiv
        -			.toggle( this.indeterminate || value > this.min )
        -			.toggleClass( "ui-corner-right", value === this.options.max )
        -			.width( percentage.toFixed(0) + "%" );
        -
        -		this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
        -
        -		if ( this.indeterminate ) {
        -			this.element.removeAttr( "aria-valuenow" );
        -			if ( !this.overlayDiv ) {
        -				this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
        -			}
        -		} else {
        -			this.element.attr({
        -				"aria-valuemax": this.options.max,
        -				"aria-valuenow": value
        -			});
        -			if ( this.overlayDiv ) {
        -				this.overlayDiv.remove();
        -				this.overlayDiv = null;
        -			}
        -		}
        -
        -		if ( this.oldValue !== value ) {
        -			this.oldValue = value;
        -			this._trigger( "change" );
        -		}
        -		if ( value === this.options.max ) {
        -			this._trigger( "complete" );
        -		}
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Selectable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/selectable/
        - */
        -
        -
        -var selectable = $.widget("ui.selectable", $.ui.mouse, {
        -	version: "1.11.4",
        -	options: {
        -		appendTo: "body",
        -		autoRefresh: true,
        -		distance: 0,
        -		filter: "*",
        -		tolerance: "touch",
        -
        -		// callbacks
        -		selected: null,
        -		selecting: null,
        -		start: null,
        -		stop: null,
        -		unselected: null,
        -		unselecting: null
        -	},
        -	_create: function() {
        -		var selectees,
        -			that = this;
        -
        -		this.element.addClass("ui-selectable");
        -
        -		this.dragged = false;
        -
        -		// cache selectee children based on filter
        -		this.refresh = function() {
        -			selectees = $(that.options.filter, that.element[0]);
        -			selectees.addClass("ui-selectee");
        -			selectees.each(function() {
        -				var $this = $(this),
        -					pos = $this.offset();
        -				$.data(this, "selectable-item", {
        -					element: this,
        -					$element: $this,
        -					left: pos.left,
        -					top: pos.top,
        -					right: pos.left + $this.outerWidth(),
        -					bottom: pos.top + $this.outerHeight(),
        -					startselected: false,
        -					selected: $this.hasClass("ui-selected"),
        -					selecting: $this.hasClass("ui-selecting"),
        -					unselecting: $this.hasClass("ui-unselecting")
        -				});
        -			});
        -		};
        -		this.refresh();
        -
        -		this.selectees = selectees.addClass("ui-selectee");
        -
        -		this._mouseInit();
        -
        -		this.helper = $("<div class='ui-selectable-helper'></div>");
        -	},
        -
        -	_destroy: function() {
        -		this.selectees
        -			.removeClass("ui-selectee")
        -			.removeData("selectable-item");
        -		this.element
        -			.removeClass("ui-selectable ui-selectable-disabled");
        -		this._mouseDestroy();
        -	},
        -
        -	_mouseStart: function(event) {
        -		var that = this,
        -			options = this.options;
        -
        -		this.opos = [ event.pageX, event.pageY ];
        -
        -		if (this.options.disabled) {
        -			return;
        -		}
        -
        -		this.selectees = $(options.filter, this.element[0]);
        -
        -		this._trigger("start", event);
        -
        -		$(options.appendTo).append(this.helper);
        -		// position helper (lasso)
        -		this.helper.css({
        -			"left": event.pageX,
        -			"top": event.pageY,
        -			"width": 0,
        -			"height": 0
        -		});
        -
        -		if (options.autoRefresh) {
        -			this.refresh();
        -		}
        -
        -		this.selectees.filter(".ui-selected").each(function() {
        -			var selectee = $.data(this, "selectable-item");
        -			selectee.startselected = true;
        -			if (!event.metaKey && !event.ctrlKey) {
        -				selectee.$element.removeClass("ui-selected");
        -				selectee.selected = false;
        -				selectee.$element.addClass("ui-unselecting");
        -				selectee.unselecting = true;
        -				// selectable UNSELECTING callback
        -				that._trigger("unselecting", event, {
        -					unselecting: selectee.element
        -				});
        -			}
        -		});
        -
        -		$(event.target).parents().addBack().each(function() {
        -			var doSelect,
        -				selectee = $.data(this, "selectable-item");
        -			if (selectee) {
        -				doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
        -				selectee.$element
        -					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
        -					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
        -				selectee.unselecting = !doSelect;
        -				selectee.selecting = doSelect;
        -				selectee.selected = doSelect;
        -				// selectable (UN)SELECTING callback
        -				if (doSelect) {
        -					that._trigger("selecting", event, {
        -						selecting: selectee.element
        -					});
        -				} else {
        -					that._trigger("unselecting", event, {
        -						unselecting: selectee.element
        -					});
        -				}
        -				return false;
        -			}
        -		});
        -
        -	},
        -
        -	_mouseDrag: function(event) {
        -
        -		this.dragged = true;
        -
        -		if (this.options.disabled) {
        -			return;
        -		}
        -
        -		var tmp,
        -			that = this,
        -			options = this.options,
        -			x1 = this.opos[0],
        -			y1 = this.opos[1],
        -			x2 = event.pageX,
        -			y2 = event.pageY;
        -
        -		if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
        -		if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
        -		this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
        -
        -		this.selectees.each(function() {
        -			var selectee = $.data(this, "selectable-item"),
        -				hit = false;
        -
        -			//prevent helper from being selected if appendTo: selectable
        -			if (!selectee || selectee.element === that.element[0]) {
        -				return;
        -			}
        -
        -			if (options.tolerance === "touch") {
        -				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
        -			} else if (options.tolerance === "fit") {
        -				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
        -			}
        -
        -			if (hit) {
        -				// SELECT
        -				if (selectee.selected) {
        -					selectee.$element.removeClass("ui-selected");
        -					selectee.selected = false;
        -				}
        -				if (selectee.unselecting) {
        -					selectee.$element.removeClass("ui-unselecting");
        -					selectee.unselecting = false;
        -				}
        -				if (!selectee.selecting) {
        -					selectee.$element.addClass("ui-selecting");
        -					selectee.selecting = true;
        -					// selectable SELECTING callback
        -					that._trigger("selecting", event, {
        -						selecting: selectee.element
        -					});
        -				}
        -			} else {
        -				// UNSELECT
        -				if (selectee.selecting) {
        -					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
        -						selectee.$element.removeClass("ui-selecting");
        -						selectee.selecting = false;
        -						selectee.$element.addClass("ui-selected");
        -						selectee.selected = true;
        -					} else {
        -						selectee.$element.removeClass("ui-selecting");
        -						selectee.selecting = false;
        -						if (selectee.startselected) {
        -							selectee.$element.addClass("ui-unselecting");
        -							selectee.unselecting = true;
        -						}
        -						// selectable UNSELECTING callback
        -						that._trigger("unselecting", event, {
        -							unselecting: selectee.element
        -						});
        -					}
        -				}
        -				if (selectee.selected) {
        -					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
        -						selectee.$element.removeClass("ui-selected");
        -						selectee.selected = false;
        -
        -						selectee.$element.addClass("ui-unselecting");
        -						selectee.unselecting = true;
        -						// selectable UNSELECTING callback
        -						that._trigger("unselecting", event, {
        -							unselecting: selectee.element
        -						});
        -					}
        -				}
        -			}
        -		});
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function(event) {
        -		var that = this;
        -
        -		this.dragged = false;
        -
        -		$(".ui-unselecting", this.element[0]).each(function() {
        -			var selectee = $.data(this, "selectable-item");
        -			selectee.$element.removeClass("ui-unselecting");
        -			selectee.unselecting = false;
        -			selectee.startselected = false;
        -			that._trigger("unselected", event, {
        -				unselected: selectee.element
        -			});
        -		});
        -		$(".ui-selecting", this.element[0]).each(function() {
        -			var selectee = $.data(this, "selectable-item");
        -			selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
        -			selectee.selecting = false;
        -			selectee.selected = true;
        -			selectee.startselected = true;
        -			that._trigger("selected", event, {
        -				selected: selectee.element
        -			});
        -		});
        -		this._trigger("stop", event);
        -
        -		this.helper.remove();
        -
        -		return false;
        -	}
        -
        -});
        -
        -
        -/*!
        - * jQuery UI Selectmenu 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/selectmenu
        - */
        -
        -
        -var selectmenu = $.widget( "ui.selectmenu", {
        -	version: "1.11.4",
        -	defaultElement: "<select>",
        -	options: {
        -		appendTo: null,
        -		disabled: null,
        -		icons: {
        -			button: "ui-icon-triangle-1-s"
        -		},
        -		position: {
        -			my: "left top",
        -			at: "left bottom",
        -			collision: "none"
        -		},
        -		width: null,
        -
        -		// callbacks
        -		change: null,
        -		close: null,
        -		focus: null,
        -		open: null,
        -		select: null
        -	},
        -
        -	_create: function() {
        -		var selectmenuId = this.element.uniqueId().attr( "id" );
        -		this.ids = {
        -			element: selectmenuId,
        -			button: selectmenuId + "-button",
        -			menu: selectmenuId + "-menu"
        -		};
        -
        -		this._drawButton();
        -		this._drawMenu();
        -
        -		if ( this.options.disabled ) {
        -			this.disable();
        -		}
        -	},
        -
        -	_drawButton: function() {
        -		var that = this;
        -
        -		// Associate existing label with the new button
        -		this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button );
        -		this._on( this.label, {
        -			click: function( event ) {
        -				this.button.focus();
        -				event.preventDefault();
        -			}
        -		});
        -
        -		// Hide original select element
        -		this.element.hide();
        -
        -		// Create button
        -		this.button = $( "<span>", {
        -			"class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all",
        -			tabindex: this.options.disabled ? -1 : 0,
        -			id: this.ids.button,
        -			role: "combobox",
        -			"aria-expanded": "false",
        -			"aria-autocomplete": "list",
        -			"aria-owns": this.ids.menu,
        -			"aria-haspopup": "true"
        -		})
        -			.insertAfter( this.element );
        -
        -		$( "<span>", {
        -			"class": "ui-icon " + this.options.icons.button
        -		})
        -			.prependTo( this.button );
        -
        -		this.buttonText = $( "<span>", {
        -			"class": "ui-selectmenu-text"
        -		})
        -			.appendTo( this.button );
        -
        -		this._setText( this.buttonText, this.element.find( "option:selected" ).text() );
        -		this._resizeButton();
        -
        -		this._on( this.button, this._buttonEvents );
        -		this.button.one( "focusin", function() {
        -
        -			// Delay rendering the menu items until the button receives focus.
        -			// The menu may have already been rendered via a programmatic open.
        -			if ( !that.menuItems ) {
        -				that._refreshMenu();
        -			}
        -		});
        -		this._hoverable( this.button );
        -		this._focusable( this.button );
        -	},
        -
        -	_drawMenu: function() {
        -		var that = this;
        -
        -		// Create menu
        -		this.menu = $( "<ul>", {
        -			"aria-hidden": "true",
        -			"aria-labelledby": this.ids.button,
        -			id: this.ids.menu
        -		});
        -
        -		// Wrap menu
        -		this.menuWrap = $( "<div>", {
        -			"class": "ui-selectmenu-menu ui-front"
        -		})
        -			.append( this.menu )
        -			.appendTo( this._appendTo() );
        -
        -		// Initialize menu widget
        -		this.menuInstance = this.menu
        -			.menu({
        -				role: "listbox",
        -				select: function( event, ui ) {
        -					event.preventDefault();
        -
        -					// support: IE8
        -					// If the item was selected via a click, the text selection
        -					// will be destroyed in IE
        -					that._setSelection();
        -
        -					that._select( ui.item.data( "ui-selectmenu-item" ), event );
        -				},
        -				focus: function( event, ui ) {
        -					var item = ui.item.data( "ui-selectmenu-item" );
        -
        -					// Prevent inital focus from firing and check if its a newly focused item
        -					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
        -						that._trigger( "focus", event, { item: item } );
        -						if ( !that.isOpen ) {
        -							that._select( item, event );
        -						}
        -					}
        -					that.focusIndex = item.index;
        -
        -					that.button.attr( "aria-activedescendant",
        -						that.menuItems.eq( item.index ).attr( "id" ) );
        -				}
        -			})
        -			.menu( "instance" );
        -
        -		// Adjust menu styles to dropdown
        -		this.menu
        -			.addClass( "ui-corner-bottom" )
        -			.removeClass( "ui-corner-all" );
        -
        -		// Don't close the menu on mouseleave
        -		this.menuInstance._off( this.menu, "mouseleave" );
        -
        -		// Cancel the menu's collapseAll on document click
        -		this.menuInstance._closeOnDocumentClick = function() {
        -			return false;
        -		};
        -
        -		// Selects often contain empty items, but never contain dividers
        -		this.menuInstance._isDivider = function() {
        -			return false;
        -		};
        -	},
        -
        -	refresh: function() {
        -		this._refreshMenu();
        -		this._setText( this.buttonText, this._getSelectedItem().text() );
        -		if ( !this.options.width ) {
        -			this._resizeButton();
        -		}
        -	},
        -
        -	_refreshMenu: function() {
        -		this.menu.empty();
        -
        -		var item,
        -			options = this.element.find( "option" );
        -
        -		if ( !options.length ) {
        -			return;
        -		}
        -
        -		this._parseOptions( options );
        -		this._renderMenu( this.menu, this.items );
        -
        -		this.menuInstance.refresh();
        -		this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" );
        -
        -		item = this._getSelectedItem();
        -
        -		// Update the menu to have the correct item focused
        -		this.menuInstance.focus( null, item );
        -		this._setAria( item.data( "ui-selectmenu-item" ) );
        -
        -		// Set disabled state
        -		this._setOption( "disabled", this.element.prop( "disabled" ) );
        -	},
        -
        -	open: function( event ) {
        -		if ( this.options.disabled ) {
        -			return;
        -		}
        -
        -		// If this is the first time the menu is being opened, render the items
        -		if ( !this.menuItems ) {
        -			this._refreshMenu();
        -		} else {
        -
        -			// Menu clears focus on close, reset focus to selected item
        -			this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" );
        -			this.menuInstance.focus( null, this._getSelectedItem() );
        -		}
        -
        -		this.isOpen = true;
        -		this._toggleAttr();
        -		this._resizeMenu();
        -		this._position();
        -
        -		this._on( this.document, this._documentClick );
        -
        -		this._trigger( "open", event );
        -	},
        -
        -	_position: function() {
        -		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
        -	},
        -
        -	close: function( event ) {
        -		if ( !this.isOpen ) {
        -			return;
        -		}
        -
        -		this.isOpen = false;
        -		this._toggleAttr();
        -
        -		this.range = null;
        -		this._off( this.document );
        -
        -		this._trigger( "close", event );
        -	},
        -
        -	widget: function() {
        -		return this.button;
        -	},
        -
        -	menuWidget: function() {
        -		return this.menu;
        -	},
        -
        -	_renderMenu: function( ul, items ) {
        -		var that = this,
        -			currentOptgroup = "";
        -
        -		$.each( items, function( index, item ) {
        -			if ( item.optgroup !== currentOptgroup ) {
        -				$( "<li>", {
        -					"class": "ui-selectmenu-optgroup ui-menu-divider" +
        -						( item.element.parent( "optgroup" ).prop( "disabled" ) ?
        -							" ui-state-disabled" :
        -							"" ),
        -					text: item.optgroup
        -				})
        -					.appendTo( ul );
        -
        -				currentOptgroup = item.optgroup;
        -			}
        -
        -			that._renderItemData( ul, item );
        -		});
        -	},
        -
        -	_renderItemData: function( ul, item ) {
        -		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
        -	},
        -
        -	_renderItem: function( ul, item ) {
        -		var li = $( "<li>" );
        -
        -		if ( item.disabled ) {
        -			li.addClass( "ui-state-disabled" );
        -		}
        -		this._setText( li, item.label );
        -
        -		return li.appendTo( ul );
        -	},
        -
        -	_setText: function( element, value ) {
        -		if ( value ) {
        -			element.text( value );
        -		} else {
        -			element.html( "&#160;" );
        -		}
        -	},
        -
        -	_move: function( direction, event ) {
        -		var item, next,
        -			filter = ".ui-menu-item";
        -
        -		if ( this.isOpen ) {
        -			item = this.menuItems.eq( this.focusIndex );
        -		} else {
        -			item = this.menuItems.eq( this.element[ 0 ].selectedIndex );
        -			filter += ":not(.ui-state-disabled)";
        -		}
        -
        -		if ( direction === "first" || direction === "last" ) {
        -			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
        -		} else {
        -			next = item[ direction + "All" ]( filter ).eq( 0 );
        -		}
        -
        -		if ( next.length ) {
        -			this.menuInstance.focus( event, next );
        -		}
        -	},
        -
        -	_getSelectedItem: function() {
        -		return this.menuItems.eq( this.element[ 0 ].selectedIndex );
        -	},
        -
        -	_toggle: function( event ) {
        -		this[ this.isOpen ? "close" : "open" ]( event );
        -	},
        -
        -	_setSelection: function() {
        -		var selection;
        -
        -		if ( !this.range ) {
        -			return;
        -		}
        -
        -		if ( window.getSelection ) {
        -			selection = window.getSelection();
        -			selection.removeAllRanges();
        -			selection.addRange( this.range );
        -
        -		// support: IE8
        -		} else {
        -			this.range.select();
        -		}
        -
        -		// support: IE
        -		// Setting the text selection kills the button focus in IE, but
        -		// restoring the focus doesn't kill the selection.
        -		this.button.focus();
        -	},
        -
        -	_documentClick: {
        -		mousedown: function( event ) {
        -			if ( !this.isOpen ) {
        -				return;
        -			}
        -
        -			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) {
        -				this.close( event );
        -			}
        -		}
        -	},
        -
        -	_buttonEvents: {
        -
        -		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
        -		mousedown: function() {
        -			var selection;
        -
        -			if ( window.getSelection ) {
        -				selection = window.getSelection();
        -				if ( selection.rangeCount ) {
        -					this.range = selection.getRangeAt( 0 );
        -				}
        -
        -			// support: IE8
        -			} else {
        -				this.range = document.selection.createRange();
        -			}
        -		},
        -
        -		click: function( event ) {
        -			this._setSelection();
        -			this._toggle( event );
        -		},
        -
        -		keydown: function( event ) {
        -			var preventDefault = true;
        -			switch ( event.keyCode ) {
        -				case $.ui.keyCode.TAB:
        -				case $.ui.keyCode.ESCAPE:
        -					this.close( event );
        -					preventDefault = false;
        -					break;
        -				case $.ui.keyCode.ENTER:
        -					if ( this.isOpen ) {
        -						this._selectFocusedItem( event );
        -					}
        -					break;
        -				case $.ui.keyCode.UP:
        -					if ( event.altKey ) {
        -						this._toggle( event );
        -					} else {
        -						this._move( "prev", event );
        -					}
        -					break;
        -				case $.ui.keyCode.DOWN:
        -					if ( event.altKey ) {
        -						this._toggle( event );
        -					} else {
        -						this._move( "next", event );
        -					}
        -					break;
        -				case $.ui.keyCode.SPACE:
        -					if ( this.isOpen ) {
        -						this._selectFocusedItem( event );
        -					} else {
        -						this._toggle( event );
        -					}
        -					break;
        -				case $.ui.keyCode.LEFT:
        -					this._move( "prev", event );
        -					break;
        -				case $.ui.keyCode.RIGHT:
        -					this._move( "next", event );
        -					break;
        -				case $.ui.keyCode.HOME:
        -				case $.ui.keyCode.PAGE_UP:
        -					this._move( "first", event );
        -					break;
        -				case $.ui.keyCode.END:
        -				case $.ui.keyCode.PAGE_DOWN:
        -					this._move( "last", event );
        -					break;
        -				default:
        -					this.menu.trigger( event );
        -					preventDefault = false;
        -			}
        -
        -			if ( preventDefault ) {
        -				event.preventDefault();
        -			}
        -		}
        -	},
        -
        -	_selectFocusedItem: function( event ) {
        -		var item = this.menuItems.eq( this.focusIndex );
        -		if ( !item.hasClass( "ui-state-disabled" ) ) {
        -			this._select( item.data( "ui-selectmenu-item" ), event );
        -		}
        -	},
        -
        -	_select: function( item, event ) {
        -		var oldIndex = this.element[ 0 ].selectedIndex;
        -
        -		// Change native select element
        -		this.element[ 0 ].selectedIndex = item.index;
        -		this._setText( this.buttonText, item.label );
        -		this._setAria( item );
        -		this._trigger( "select", event, { item: item } );
        -
        -		if ( item.index !== oldIndex ) {
        -			this._trigger( "change", event, { item: item } );
        -		}
        -
        -		this.close( event );
        -	},
        -
        -	_setAria: function( item ) {
        -		var id = this.menuItems.eq( item.index ).attr( "id" );
        -
        -		this.button.attr({
        -			"aria-labelledby": id,
        -			"aria-activedescendant": id
        -		});
        -		this.menu.attr( "aria-activedescendant", id );
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "icons" ) {
        -			this.button.find( "span.ui-icon" )
        -				.removeClass( this.options.icons.button )
        -				.addClass( value.button );
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "appendTo" ) {
        -			this.menuWrap.appendTo( this._appendTo() );
        -		}
        -
        -		if ( key === "disabled" ) {
        -			this.menuInstance.option( "disabled", value );
        -			this.button
        -				.toggleClass( "ui-state-disabled", value )
        -				.attr( "aria-disabled", value );
        -
        -			this.element.prop( "disabled", value );
        -			if ( value ) {
        -				this.button.attr( "tabindex", -1 );
        -				this.close();
        -			} else {
        -				this.button.attr( "tabindex", 0 );
        -			}
        -		}
        -
        -		if ( key === "width" ) {
        -			this._resizeButton();
        -		}
        -	},
        -
        -	_appendTo: function() {
        -		var element = this.options.appendTo;
        -
        -		if ( element ) {
        -			element = element.jquery || element.nodeType ?
        -				$( element ) :
        -				this.document.find( element ).eq( 0 );
        -		}
        -
        -		if ( !element || !element[ 0 ] ) {
        -			element = this.element.closest( ".ui-front" );
        -		}
        -
        -		if ( !element.length ) {
        -			element = this.document[ 0 ].body;
        -		}
        -
        -		return element;
        -	},
        -
        -	_toggleAttr: function() {
        -		this.button
        -			.toggleClass( "ui-corner-top", this.isOpen )
        -			.toggleClass( "ui-corner-all", !this.isOpen )
        -			.attr( "aria-expanded", this.isOpen );
        -		this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
        -		this.menu.attr( "aria-hidden", !this.isOpen );
        -	},
        -
        -	_resizeButton: function() {
        -		var width = this.options.width;
        -
        -		if ( !width ) {
        -			width = this.element.show().outerWidth();
        -			this.element.hide();
        -		}
        -
        -		this.button.outerWidth( width );
        -	},
        -
        -	_resizeMenu: function() {
        -		this.menu.outerWidth( Math.max(
        -			this.button.outerWidth(),
        -
        -			// support: IE10
        -			// IE10 wraps long text (possibly a rounding bug)
        -			// so we add 1px to avoid the wrapping
        -			this.menu.width( "" ).outerWidth() + 1
        -		) );
        -	},
        -
        -	_getCreateOptions: function() {
        -		return { disabled: this.element.prop( "disabled" ) };
        -	},
        -
        -	_parseOptions: function( options ) {
        -		var data = [];
        -		options.each(function( index, item ) {
        -			var option = $( item ),
        -				optgroup = option.parent( "optgroup" );
        -			data.push({
        -				element: option,
        -				index: index,
        -				value: option.val(),
        -				label: option.text(),
        -				optgroup: optgroup.attr( "label" ) || "",
        -				disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
        -			});
        -		});
        -		this.items = data;
        -	},
        -
        -	_destroy: function() {
        -		this.menuWrap.remove();
        -		this.button.remove();
        -		this.element.show();
        -		this.element.removeUniqueId();
        -		this.label.attr( "for", this.ids.element );
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Slider 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/slider/
        - */
        -
        -
        -var slider = $.widget( "ui.slider", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "slide",
        -
        -	options: {
        -		animate: false,
        -		distance: 0,
        -		max: 100,
        -		min: 0,
        -		orientation: "horizontal",
        -		range: false,
        -		step: 1,
        -		value: 0,
        -		values: null,
        -
        -		// callbacks
        -		change: null,
        -		slide: null,
        -		start: null,
        -		stop: null
        -	},
        -
        -	// number of pages in a slider
        -	// (how many times can you page up/down to go through the whole range)
        -	numPages: 5,
        -
        -	_create: function() {
        -		this._keySliding = false;
        -		this._mouseSliding = false;
        -		this._animateOff = true;
        -		this._handleIndex = null;
        -		this._detectOrientation();
        -		this._mouseInit();
        -		this._calculateNewMax();
        -
        -		this.element
        -			.addClass( "ui-slider" +
        -				" ui-slider-" + this.orientation +
        -				" ui-widget" +
        -				" ui-widget-content" +
        -				" ui-corner-all");
        -
        -		this._refresh();
        -		this._setOption( "disabled", this.options.disabled );
        -
        -		this._animateOff = false;
        -	},
        -
        -	_refresh: function() {
        -		this._createRange();
        -		this._createHandles();
        -		this._setupEvents();
        -		this._refreshValue();
        -	},
        -
        -	_createHandles: function() {
        -		var i, handleCount,
        -			options = this.options,
        -			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
        -			handle = "<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",
        -			handles = [];
        -
        -		handleCount = ( options.values && options.values.length ) || 1;
        -
        -		if ( existingHandles.length > handleCount ) {
        -			existingHandles.slice( handleCount ).remove();
        -			existingHandles = existingHandles.slice( 0, handleCount );
        -		}
        -
        -		for ( i = existingHandles.length; i < handleCount; i++ ) {
        -			handles.push( handle );
        -		}
        -
        -		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
        -
        -		this.handle = this.handles.eq( 0 );
        -
        -		this.handles.each(function( i ) {
        -			$( this ).data( "ui-slider-handle-index", i );
        -		});
        -	},
        -
        -	_createRange: function() {
        -		var options = this.options,
        -			classes = "";
        -
        -		if ( options.range ) {
        -			if ( options.range === true ) {
        -				if ( !options.values ) {
        -					options.values = [ this._valueMin(), this._valueMin() ];
        -				} else if ( options.values.length && options.values.length !== 2 ) {
        -					options.values = [ options.values[0], options.values[0] ];
        -				} else if ( $.isArray( options.values ) ) {
        -					options.values = options.values.slice(0);
        -				}
        -			}
        -
        -			if ( !this.range || !this.range.length ) {
        -				this.range = $( "<div></div>" )
        -					.appendTo( this.element );
        -
        -				classes = "ui-slider-range" +
        -				// note: this isn't the most fittingly semantic framework class for this element,
        -				// but worked best visually with a variety of themes
        -				" ui-widget-header ui-corner-all";
        -			} else {
        -				this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
        -					// Handle range switching from true to min/max
        -					.css({
        -						"left": "",
        -						"bottom": ""
        -					});
        -			}
        -
        -			this.range.addClass( classes +
        -				( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
        -		} else {
        -			if ( this.range ) {
        -				this.range.remove();
        -			}
        -			this.range = null;
        -		}
        -	},
        -
        -	_setupEvents: function() {
        -		this._off( this.handles );
        -		this._on( this.handles, this._handleEvents );
        -		this._hoverable( this.handles );
        -		this._focusable( this.handles );
        -	},
        -
        -	_destroy: function() {
        -		this.handles.remove();
        -		if ( this.range ) {
        -			this.range.remove();
        -		}
        -
        -		this.element
        -			.removeClass( "ui-slider" +
        -				" ui-slider-horizontal" +
        -				" ui-slider-vertical" +
        -				" ui-widget" +
        -				" ui-widget-content" +
        -				" ui-corner-all" );
        -
        -		this._mouseDestroy();
        -	},
        -
        -	_mouseCapture: function( event ) {
        -		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
        -			that = this,
        -			o = this.options;
        -
        -		if ( o.disabled ) {
        -			return false;
        -		}
        -
        -		this.elementSize = {
        -			width: this.element.outerWidth(),
        -			height: this.element.outerHeight()
        -		};
        -		this.elementOffset = this.element.offset();
        -
        -		position = { x: event.pageX, y: event.pageY };
        -		normValue = this._normValueFromMouse( position );
        -		distance = this._valueMax() - this._valueMin() + 1;
        -		this.handles.each(function( i ) {
        -			var thisDistance = Math.abs( normValue - that.values(i) );
        -			if (( distance > thisDistance ) ||
        -				( distance === thisDistance &&
        -					(i === that._lastChangedValue || that.values(i) === o.min ))) {
        -				distance = thisDistance;
        -				closestHandle = $( this );
        -				index = i;
        -			}
        -		});
        -
        -		allowed = this._start( event, index );
        -		if ( allowed === false ) {
        -			return false;
        -		}
        -		this._mouseSliding = true;
        -
        -		this._handleIndex = index;
        -
        -		closestHandle
        -			.addClass( "ui-state-active" )
        -			.focus();
        -
        -		offset = closestHandle.offset();
        -		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
        -		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
        -			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
        -			top: event.pageY - offset.top -
        -				( closestHandle.height() / 2 ) -
        -				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
        -				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
        -				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
        -		};
        -
        -		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
        -			this._slide( event, index, normValue );
        -		}
        -		this._animateOff = true;
        -		return true;
        -	},
        -
        -	_mouseStart: function() {
        -		return true;
        -	},
        -
        -	_mouseDrag: function( event ) {
        -		var position = { x: event.pageX, y: event.pageY },
        -			normValue = this._normValueFromMouse( position );
        -
        -		this._slide( event, this._handleIndex, normValue );
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function( event ) {
        -		this.handles.removeClass( "ui-state-active" );
        -		this._mouseSliding = false;
        -
        -		this._stop( event, this._handleIndex );
        -		this._change( event, this._handleIndex );
        -
        -		this._handleIndex = null;
        -		this._clickOffset = null;
        -		this._animateOff = false;
        -
        -		return false;
        -	},
        -
        -	_detectOrientation: function() {
        -		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
        -	},
        -
        -	_normValueFromMouse: function( position ) {
        -		var pixelTotal,
        -			pixelMouse,
        -			percentMouse,
        -			valueTotal,
        -			valueMouse;
        -
        -		if ( this.orientation === "horizontal" ) {
        -			pixelTotal = this.elementSize.width;
        -			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
        -		} else {
        -			pixelTotal = this.elementSize.height;
        -			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
        -		}
        -
        -		percentMouse = ( pixelMouse / pixelTotal );
        -		if ( percentMouse > 1 ) {
        -			percentMouse = 1;
        -		}
        -		if ( percentMouse < 0 ) {
        -			percentMouse = 0;
        -		}
        -		if ( this.orientation === "vertical" ) {
        -			percentMouse = 1 - percentMouse;
        -		}
        -
        -		valueTotal = this._valueMax() - this._valueMin();
        -		valueMouse = this._valueMin() + percentMouse * valueTotal;
        -
        -		return this._trimAlignValue( valueMouse );
        -	},
        -
        -	_start: function( event, index ) {
        -		var uiHash = {
        -			handle: this.handles[ index ],
        -			value: this.value()
        -		};
        -		if ( this.options.values && this.options.values.length ) {
        -			uiHash.value = this.values( index );
        -			uiHash.values = this.values();
        -		}
        -		return this._trigger( "start", event, uiHash );
        -	},
        -
        -	_slide: function( event, index, newVal ) {
        -		var otherVal,
        -			newValues,
        -			allowed;
        -
        -		if ( this.options.values && this.options.values.length ) {
        -			otherVal = this.values( index ? 0 : 1 );
        -
        -			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
        -					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
        -				) {
        -				newVal = otherVal;
        -			}
        -
        -			if ( newVal !== this.values( index ) ) {
        -				newValues = this.values();
        -				newValues[ index ] = newVal;
        -				// A slide can be canceled by returning false from the slide callback
        -				allowed = this._trigger( "slide", event, {
        -					handle: this.handles[ index ],
        -					value: newVal,
        -					values: newValues
        -				} );
        -				otherVal = this.values( index ? 0 : 1 );
        -				if ( allowed !== false ) {
        -					this.values( index, newVal );
        -				}
        -			}
        -		} else {
        -			if ( newVal !== this.value() ) {
        -				// A slide can be canceled by returning false from the slide callback
        -				allowed = this._trigger( "slide", event, {
        -					handle: this.handles[ index ],
        -					value: newVal
        -				} );
        -				if ( allowed !== false ) {
        -					this.value( newVal );
        -				}
        -			}
        -		}
        -	},
        -
        -	_stop: function( event, index ) {
        -		var uiHash = {
        -			handle: this.handles[ index ],
        -			value: this.value()
        -		};
        -		if ( this.options.values && this.options.values.length ) {
        -			uiHash.value = this.values( index );
        -			uiHash.values = this.values();
        -		}
        -
        -		this._trigger( "stop", event, uiHash );
        -	},
        -
        -	_change: function( event, index ) {
        -		if ( !this._keySliding && !this._mouseSliding ) {
        -			var uiHash = {
        -				handle: this.handles[ index ],
        -				value: this.value()
        -			};
        -			if ( this.options.values && this.options.values.length ) {
        -				uiHash.value = this.values( index );
        -				uiHash.values = this.values();
        -			}
        -
        -			//store the last changed value index for reference when handles overlap
        -			this._lastChangedValue = index;
        -
        -			this._trigger( "change", event, uiHash );
        -		}
        -	},
        -
        -	value: function( newValue ) {
        -		if ( arguments.length ) {
        -			this.options.value = this._trimAlignValue( newValue );
        -			this._refreshValue();
        -			this._change( null, 0 );
        -			return;
        -		}
        -
        -		return this._value();
        -	},
        -
        -	values: function( index, newValue ) {
        -		var vals,
        -			newValues,
        -			i;
        -
        -		if ( arguments.length > 1 ) {
        -			this.options.values[ index ] = this._trimAlignValue( newValue );
        -			this._refreshValue();
        -			this._change( null, index );
        -			return;
        -		}
        -
        -		if ( arguments.length ) {
        -			if ( $.isArray( arguments[ 0 ] ) ) {
        -				vals = this.options.values;
        -				newValues = arguments[ 0 ];
        -				for ( i = 0; i < vals.length; i += 1 ) {
        -					vals[ i ] = this._trimAlignValue( newValues[ i ] );
        -					this._change( null, i );
        -				}
        -				this._refreshValue();
        -			} else {
        -				if ( this.options.values && this.options.values.length ) {
        -					return this._values( index );
        -				} else {
        -					return this.value();
        -				}
        -			}
        -		} else {
        -			return this._values();
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		var i,
        -			valsLength = 0;
        -
        -		if ( key === "range" && this.options.range === true ) {
        -			if ( value === "min" ) {
        -				this.options.value = this._values( 0 );
        -				this.options.values = null;
        -			} else if ( value === "max" ) {
        -				this.options.value = this._values( this.options.values.length - 1 );
        -				this.options.values = null;
        -			}
        -		}
        -
        -		if ( $.isArray( this.options.values ) ) {
        -			valsLength = this.options.values.length;
        -		}
        -
        -		if ( key === "disabled" ) {
        -			this.element.toggleClass( "ui-state-disabled", !!value );
        -		}
        -
        -		this._super( key, value );
        -
        -		switch ( key ) {
        -			case "orientation":
        -				this._detectOrientation();
        -				this.element
        -					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
        -					.addClass( "ui-slider-" + this.orientation );
        -				this._refreshValue();
        -
        -				// Reset positioning from previous orientation
        -				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
        -				break;
        -			case "value":
        -				this._animateOff = true;
        -				this._refreshValue();
        -				this._change( null, 0 );
        -				this._animateOff = false;
        -				break;
        -			case "values":
        -				this._animateOff = true;
        -				this._refreshValue();
        -				for ( i = 0; i < valsLength; i += 1 ) {
        -					this._change( null, i );
        -				}
        -				this._animateOff = false;
        -				break;
        -			case "step":
        -			case "min":
        -			case "max":
        -				this._animateOff = true;
        -				this._calculateNewMax();
        -				this._refreshValue();
        -				this._animateOff = false;
        -				break;
        -			case "range":
        -				this._animateOff = true;
        -				this._refresh();
        -				this._animateOff = false;
        -				break;
        -		}
        -	},
        -
        -	//internal value getter
        -	// _value() returns value trimmed by min and max, aligned by step
        -	_value: function() {
        -		var val = this.options.value;
        -		val = this._trimAlignValue( val );
        -
        -		return val;
        -	},
        -
        -	//internal values getter
        -	// _values() returns array of values trimmed by min and max, aligned by step
        -	// _values( index ) returns single value trimmed by min and max, aligned by step
        -	_values: function( index ) {
        -		var val,
        -			vals,
        -			i;
        -
        -		if ( arguments.length ) {
        -			val = this.options.values[ index ];
        -			val = this._trimAlignValue( val );
        -
        -			return val;
        -		} else if ( this.options.values && this.options.values.length ) {
        -			// .slice() creates a copy of the array
        -			// this copy gets trimmed by min and max and then returned
        -			vals = this.options.values.slice();
        -			for ( i = 0; i < vals.length; i += 1) {
        -				vals[ i ] = this._trimAlignValue( vals[ i ] );
        -			}
        -
        -			return vals;
        -		} else {
        -			return [];
        -		}
        -	},
        -
        -	// returns the step-aligned value that val is closest to, between (inclusive) min and max
        -	_trimAlignValue: function( val ) {
        -		if ( val <= this._valueMin() ) {
        -			return this._valueMin();
        -		}
        -		if ( val >= this._valueMax() ) {
        -			return this._valueMax();
        -		}
        -		var step = ( this.options.step > 0 ) ? this.options.step : 1,
        -			valModStep = (val - this._valueMin()) % step,
        -			alignValue = val - valModStep;
        -
        -		if ( Math.abs(valModStep) * 2 >= step ) {
        -			alignValue += ( valModStep > 0 ) ? step : ( -step );
        -		}
        -
        -		// Since JavaScript has problems with large floats, round
        -		// the final value to 5 digits after the decimal point (see #4124)
        -		return parseFloat( alignValue.toFixed(5) );
        -	},
        -
        -	_calculateNewMax: function() {
        -		var max = this.options.max,
        -			min = this._valueMin(),
        -			step = this.options.step,
        -			aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;
        -		max = aboveMin + min;
        -		this.max = parseFloat( max.toFixed( this._precision() ) );
        -	},
        -
        -	_precision: function() {
        -		var precision = this._precisionOf( this.options.step );
        -		if ( this.options.min !== null ) {
        -			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        -		}
        -		return precision;
        -	},
        -
        -	_precisionOf: function( num ) {
        -		var str = num.toString(),
        -			decimal = str.indexOf( "." );
        -		return decimal === -1 ? 0 : str.length - decimal - 1;
        -	},
        -
        -	_valueMin: function() {
        -		return this.options.min;
        -	},
        -
        -	_valueMax: function() {
        -		return this.max;
        -	},
        -
        -	_refreshValue: function() {
        -		var lastValPercent, valPercent, value, valueMin, valueMax,
        -			oRange = this.options.range,
        -			o = this.options,
        -			that = this,
        -			animate = ( !this._animateOff ) ? o.animate : false,
        -			_set = {};
        -
        -		if ( this.options.values && this.options.values.length ) {
        -			this.handles.each(function( i ) {
        -				valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
        -				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        -				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        -				if ( that.options.range === true ) {
        -					if ( that.orientation === "horizontal" ) {
        -						if ( i === 0 ) {
        -							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
        -						}
        -						if ( i === 1 ) {
        -							that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
        -						}
        -					} else {
        -						if ( i === 0 ) {
        -							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
        -						}
        -						if ( i === 1 ) {
        -							that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
        -						}
        -					}
        -				}
        -				lastValPercent = valPercent;
        -			});
        -		} else {
        -			value = this.value();
        -			valueMin = this._valueMin();
        -			valueMax = this._valueMax();
        -			valPercent = ( valueMax !== valueMin ) ?
        -					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
        -					0;
        -			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        -			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        -
        -			if ( oRange === "min" && this.orientation === "horizontal" ) {
        -				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
        -			}
        -			if ( oRange === "max" && this.orientation === "horizontal" ) {
        -				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
        -			}
        -			if ( oRange === "min" && this.orientation === "vertical" ) {
        -				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
        -			}
        -			if ( oRange === "max" && this.orientation === "vertical" ) {
        -				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
        -			}
        -		}
        -	},
        -
        -	_handleEvents: {
        -		keydown: function( event ) {
        -			var allowed, curVal, newVal, step,
        -				index = $( event.target ).data( "ui-slider-handle-index" );
        -
        -			switch ( event.keyCode ) {
        -				case $.ui.keyCode.HOME:
        -				case $.ui.keyCode.END:
        -				case $.ui.keyCode.PAGE_UP:
        -				case $.ui.keyCode.PAGE_DOWN:
        -				case $.ui.keyCode.UP:
        -				case $.ui.keyCode.RIGHT:
        -				case $.ui.keyCode.DOWN:
        -				case $.ui.keyCode.LEFT:
        -					event.preventDefault();
        -					if ( !this._keySliding ) {
        -						this._keySliding = true;
        -						$( event.target ).addClass( "ui-state-active" );
        -						allowed = this._start( event, index );
        -						if ( allowed === false ) {
        -							return;
        -						}
        -					}
        -					break;
        -			}
        -
        -			step = this.options.step;
        -			if ( this.options.values && this.options.values.length ) {
        -				curVal = newVal = this.values( index );
        -			} else {
        -				curVal = newVal = this.value();
        -			}
        -
        -			switch ( event.keyCode ) {
        -				case $.ui.keyCode.HOME:
        -					newVal = this._valueMin();
        -					break;
        -				case $.ui.keyCode.END:
        -					newVal = this._valueMax();
        -					break;
        -				case $.ui.keyCode.PAGE_UP:
        -					newVal = this._trimAlignValue(
        -						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
        -					);
        -					break;
        -				case $.ui.keyCode.PAGE_DOWN:
        -					newVal = this._trimAlignValue(
        -						curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );
        -					break;
        -				case $.ui.keyCode.UP:
        -				case $.ui.keyCode.RIGHT:
        -					if ( curVal === this._valueMax() ) {
        -						return;
        -					}
        -					newVal = this._trimAlignValue( curVal + step );
        -					break;
        -				case $.ui.keyCode.DOWN:
        -				case $.ui.keyCode.LEFT:
        -					if ( curVal === this._valueMin() ) {
        -						return;
        -					}
        -					newVal = this._trimAlignValue( curVal - step );
        -					break;
        -			}
        -
        -			this._slide( event, index, newVal );
        -		},
        -		keyup: function( event ) {
        -			var index = $( event.target ).data( "ui-slider-handle-index" );
        -
        -			if ( this._keySliding ) {
        -				this._keySliding = false;
        -				this._stop( event, index );
        -				this._change( event, index );
        -				$( event.target ).removeClass( "ui-state-active" );
        -			}
        -		}
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Sortable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/sortable/
        - */
        -
        -
        -var sortable = $.widget("ui.sortable", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "sort",
        -	ready: false,
        -	options: {
        -		appendTo: "parent",
        -		axis: false,
        -		connectWith: false,
        -		containment: false,
        -		cursor: "auto",
        -		cursorAt: false,
        -		dropOnEmpty: true,
        -		forcePlaceholderSize: false,
        -		forceHelperSize: false,
        -		grid: false,
        -		handle: false,
        -		helper: "original",
        -		items: "> *",
        -		opacity: false,
        -		placeholder: false,
        -		revert: false,
        -		scroll: true,
        -		scrollSensitivity: 20,
        -		scrollSpeed: 20,
        -		scope: "default",
        -		tolerance: "intersect",
        -		zIndex: 1000,
        -
        -		// callbacks
        -		activate: null,
        -		beforeStop: null,
        -		change: null,
        -		deactivate: null,
        -		out: null,
        -		over: null,
        -		receive: null,
        -		remove: null,
        -		sort: null,
        -		start: null,
        -		stop: null,
        -		update: null
        -	},
        -
        -	_isOverAxis: function( x, reference, size ) {
        -		return ( x >= reference ) && ( x < ( reference + size ) );
        -	},
        -
        -	_isFloating: function( item ) {
        -		return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
        -	},
        -
        -	_create: function() {
        -		this.containerCache = {};
        -		this.element.addClass("ui-sortable");
        -
        -		//Get the items
        -		this.refresh();
        -
        -		//Let's determine the parent's offset
        -		this.offset = this.element.offset();
        -
        -		//Initialize mouse events for interaction
        -		this._mouseInit();
        -
        -		this._setHandleClassName();
        -
        -		//We're ready to go
        -		this.ready = true;
        -
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -
        -		if ( key === "handle" ) {
        -			this._setHandleClassName();
        -		}
        -	},
        -
        -	_setHandleClassName: function() {
        -		this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
        -		$.each( this.items, function() {
        -			( this.instance.options.handle ?
        -				this.item.find( this.instance.options.handle ) : this.item )
        -				.addClass( "ui-sortable-handle" );
        -		});
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-sortable ui-sortable-disabled" )
        -			.find( ".ui-sortable-handle" )
        -				.removeClass( "ui-sortable-handle" );
        -		this._mouseDestroy();
        -
        -		for ( var i = this.items.length - 1; i >= 0; i-- ) {
        -			this.items[i].item.removeData(this.widgetName + "-item");
        -		}
        -
        -		return this;
        -	},
        -
        -	_mouseCapture: function(event, overrideHandle) {
        -		var currentItem = null,
        -			validHandle = false,
        -			that = this;
        -
        -		if (this.reverting) {
        -			return false;
        -		}
        -
        -		if(this.options.disabled || this.options.type === "static") {
        -			return false;
        -		}
        -
        -		//We have to refresh the items data once first
        -		this._refreshItems(event);
        -
        -		//Find out if the clicked node (or one of its parents) is a actual item in this.items
        -		$(event.target).parents().each(function() {
        -			if($.data(this, that.widgetName + "-item") === that) {
        -				currentItem = $(this);
        -				return false;
        -			}
        -		});
        -		if($.data(event.target, that.widgetName + "-item") === that) {
        -			currentItem = $(event.target);
        -		}
        -
        -		if(!currentItem) {
        -			return false;
        -		}
        -		if(this.options.handle && !overrideHandle) {
        -			$(this.options.handle, currentItem).find("*").addBack().each(function() {
        -				if(this === event.target) {
        -					validHandle = true;
        -				}
        -			});
        -			if(!validHandle) {
        -				return false;
        -			}
        -		}
        -
        -		this.currentItem = currentItem;
        -		this._removeCurrentsFromItems();
        -		return true;
        -
        -	},
        -
        -	_mouseStart: function(event, overrideHandle, noActivation) {
        -
        -		var i, body,
        -			o = this.options;
        -
        -		this.currentContainer = this;
        -
        -		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
        -		this.refreshPositions();
        -
        -		//Create and append the visible helper
        -		this.helper = this._createHelper(event);
        -
        -		//Cache the helper size
        -		this._cacheHelperProportions();
        -
        -		/*
        -		 * - Position generation -
        -		 * This block generates everything position related - it's the core of draggables.
        -		 */
        -
        -		//Cache the margins of the original element
        -		this._cacheMargins();
        -
        -		//Get the next scrolling parent
        -		this.scrollParent = this.helper.scrollParent();
        -
        -		//The element's absolute position on the page minus margins
        -		this.offset = this.currentItem.offset();
        -		this.offset = {
        -			top: this.offset.top - this.margins.top,
        -			left: this.offset.left - this.margins.left
        -		};
        -
        -		$.extend(this.offset, {
        -			click: { //Where the click happened, relative to the element
        -				left: event.pageX - this.offset.left,
        -				top: event.pageY - this.offset.top
        -			},
        -			parent: this._getParentOffset(),
        -			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
        -		});
        -
        -		// Only after we got the offset, we can change the helper's position to absolute
        -		// TODO: Still need to figure out a way to make relative sorting possible
        -		this.helper.css("position", "absolute");
        -		this.cssPosition = this.helper.css("position");
        -
        -		//Generate the original position
        -		this.originalPosition = this._generatePosition(event);
        -		this.originalPageX = event.pageX;
        -		this.originalPageY = event.pageY;
        -
        -		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        -		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
        -
        -		//Cache the former DOM position
        -		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
        -
        -		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
        -		if(this.helper[0] !== this.currentItem[0]) {
        -			this.currentItem.hide();
        -		}
        -
        -		//Create the placeholder
        -		this._createPlaceholder();
        -
        -		//Set a containment if given in the options
        -		if(o.containment) {
        -			this._setContainment();
        -		}
        -
        -		if( o.cursor && o.cursor !== "auto" ) { // cursor option
        -			body = this.document.find( "body" );
        -
        -			// support: IE
        -			this.storedCursor = body.css( "cursor" );
        -			body.css( "cursor", o.cursor );
        -
        -			this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
        -		}
        -
        -		if(o.opacity) { // opacity option
        -			if (this.helper.css("opacity")) {
        -				this._storedOpacity = this.helper.css("opacity");
        -			}
        -			this.helper.css("opacity", o.opacity);
        -		}
        -
        -		if(o.zIndex) { // zIndex option
        -			if (this.helper.css("zIndex")) {
        -				this._storedZIndex = this.helper.css("zIndex");
        -			}
        -			this.helper.css("zIndex", o.zIndex);
        -		}
        -
        -		//Prepare scrolling
        -		if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
        -			this.overflowOffset = this.scrollParent.offset();
        -		}
        -
        -		//Call callbacks
        -		this._trigger("start", event, this._uiHash());
        -
        -		//Recache the helper size
        -		if(!this._preserveHelperProportions) {
        -			this._cacheHelperProportions();
        -		}
        -
        -
        -		//Post "activate" events to possible containers
        -		if( !noActivation ) {
        -			for ( i = this.containers.length - 1; i >= 0; i-- ) {
        -				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
        -			}
        -		}
        -
        -		//Prepare possible droppables
        -		if($.ui.ddmanager) {
        -			$.ui.ddmanager.current = this;
        -		}
        -
        -		if ($.ui.ddmanager && !o.dropBehaviour) {
        -			$.ui.ddmanager.prepareOffsets(this, event);
        -		}
        -
        -		this.dragging = true;
        -
        -		this.helper.addClass("ui-sortable-helper");
        -		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
        -		return true;
        -
        -	},
        -
        -	_mouseDrag: function(event) {
        -		var i, item, itemElement, intersection,
        -			o = this.options,
        -			scrolled = false;
        -
        -		//Compute the helpers position
        -		this.position = this._generatePosition(event);
        -		this.positionAbs = this._convertPositionTo("absolute");
        -
        -		if (!this.lastPositionAbs) {
        -			this.lastPositionAbs = this.positionAbs;
        -		}
        -
        -		//Do scrolling
        -		if(this.options.scroll) {
        -			if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
        -
        -				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
        -				} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
        -				}
        -
        -				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
        -				} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
        -				}
        -
        -			} else {
        -
        -				if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
        -					scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
        -				} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
        -					scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
        -				}
        -
        -				if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
        -					scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
        -				} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
        -					scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
        -				}
        -
        -			}
        -
        -			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
        -				$.ui.ddmanager.prepareOffsets(this, event);
        -			}
        -		}
        -
        -		//Regenerate the absolute position used for position checks
        -		this.positionAbs = this._convertPositionTo("absolute");
        -
        -		//Set the helper position
        -		if(!this.options.axis || this.options.axis !== "y") {
        -			this.helper[0].style.left = this.position.left+"px";
        -		}
        -		if(!this.options.axis || this.options.axis !== "x") {
        -			this.helper[0].style.top = this.position.top+"px";
        -		}
        -
        -		//Rearrange
        -		for (i = this.items.length - 1; i >= 0; i--) {
        -
        -			//Cache variables and intersection, continue if no intersection
        -			item = this.items[i];
        -			itemElement = item.item[0];
        -			intersection = this._intersectsWithPointer(item);
        -			if (!intersection) {
        -				continue;
        -			}
        -
        -			// Only put the placeholder inside the current Container, skip all
        -			// items from other containers. This works because when moving
        -			// an item from one container to another the
        -			// currentContainer is switched before the placeholder is moved.
        -			//
        -			// Without this, moving items in "sub-sortables" can cause
        -			// the placeholder to jitter between the outer and inner container.
        -			if (item.instance !== this.currentContainer) {
        -				continue;
        -			}
        -
        -			// cannot intersect with itself
        -			// no useless actions that have been done before
        -			// no action if the item moved is the parent of the item checked
        -			if (itemElement !== this.currentItem[0] &&
        -				this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
        -				!$.contains(this.placeholder[0], itemElement) &&
        -				(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
        -			) {
        -
        -				this.direction = intersection === 1 ? "down" : "up";
        -
        -				if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
        -					this._rearrange(event, item);
        -				} else {
        -					break;
        -				}
        -
        -				this._trigger("change", event, this._uiHash());
        -				break;
        -			}
        -		}
        -
        -		//Post events to containers
        -		this._contactContainers(event);
        -
        -		//Interconnect with droppables
        -		if($.ui.ddmanager) {
        -			$.ui.ddmanager.drag(this, event);
        -		}
        -
        -		//Call callbacks
        -		this._trigger("sort", event, this._uiHash());
        -
        -		this.lastPositionAbs = this.positionAbs;
        -		return false;
        -
        -	},
        -
        -	_mouseStop: function(event, noPropagation) {
        -
        -		if(!event) {
        -			return;
        -		}
        -
        -		//If we are using droppables, inform the manager about the drop
        -		if ($.ui.ddmanager && !this.options.dropBehaviour) {
        -			$.ui.ddmanager.drop(this, event);
        -		}
        -
        -		if(this.options.revert) {
        -			var that = this,
        -				cur = this.placeholder.offset(),
        -				axis = this.options.axis,
        -				animation = {};
        -
        -			if ( !axis || axis === "x" ) {
        -				animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
        -			}
        -			if ( !axis || axis === "y" ) {
        -				animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
        -			}
        -			this.reverting = true;
        -			$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
        -				that._clear(event);
        -			});
        -		} else {
        -			this._clear(event, noPropagation);
        -		}
        -
        -		return false;
        -
        -	},
        -
        -	cancel: function() {
        -
        -		if(this.dragging) {
        -
        -			this._mouseUp({ target: null });
        -
        -			if(this.options.helper === "original") {
        -				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
        -			} else {
        -				this.currentItem.show();
        -			}
        -
        -			//Post deactivating events to containers
        -			for (var i = this.containers.length - 1; i >= 0; i--){
        -				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
        -				if(this.containers[i].containerCache.over) {
        -					this.containers[i]._trigger("out", null, this._uiHash(this));
        -					this.containers[i].containerCache.over = 0;
        -				}
        -			}
        -
        -		}
        -
        -		if (this.placeholder) {
        -			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
        -			if(this.placeholder[0].parentNode) {
        -				this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
        -			}
        -			if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
        -				this.helper.remove();
        -			}
        -
        -			$.extend(this, {
        -				helper: null,
        -				dragging: false,
        -				reverting: false,
        -				_noFinalSort: null
        -			});
        -
        -			if(this.domPosition.prev) {
        -				$(this.domPosition.prev).after(this.currentItem);
        -			} else {
        -				$(this.domPosition.parent).prepend(this.currentItem);
        -			}
        -		}
        -
        -		return this;
        -
        -	},
        -
        -	serialize: function(o) {
        -
        -		var items = this._getItemsAsjQuery(o && o.connected),
        -			str = [];
        -		o = o || {};
        -
        -		$(items).each(function() {
        -			var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
        -			if (res) {
        -				str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
        -			}
        -		});
        -
        -		if(!str.length && o.key) {
        -			str.push(o.key + "=");
        -		}
        -
        -		return str.join("&");
        -
        -	},
        -
        -	toArray: function(o) {
        -
        -		var items = this._getItemsAsjQuery(o && o.connected),
        -			ret = [];
        -
        -		o = o || {};
        -
        -		items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
        -		return ret;
        -
        -	},
        -
        -	/* Be careful with the following core functions */
        -	_intersectsWith: function(item) {
        -
        -		var x1 = this.positionAbs.left,
        -			x2 = x1 + this.helperProportions.width,
        -			y1 = this.positionAbs.top,
        -			y2 = y1 + this.helperProportions.height,
        -			l = item.left,
        -			r = l + item.width,
        -			t = item.top,
        -			b = t + item.height,
        -			dyClick = this.offset.click.top,
        -			dxClick = this.offset.click.left,
        -			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
        -			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
        -			isOverElement = isOverElementHeight && isOverElementWidth;
        -
        -		if ( this.options.tolerance === "pointer" ||
        -			this.options.forcePointerForContainers ||
        -			(this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
        -		) {
        -			return isOverElement;
        -		} else {
        -
        -			return (l < x1 + (this.helperProportions.width / 2) && // Right Half
        -				x2 - (this.helperProportions.width / 2) < r && // Left Half
        -				t < y1 + (this.helperProportions.height / 2) && // Bottom Half
        -				y2 - (this.helperProportions.height / 2) < b ); // Top Half
        -
        -		}
        -	},
        -
        -	_intersectsWithPointer: function(item) {
        -
        -		var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
        -			isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
        -			isOverElement = isOverElementHeight && isOverElementWidth,
        -			verticalDirection = this._getDragVerticalDirection(),
        -			horizontalDirection = this._getDragHorizontalDirection();
        -
        -		if (!isOverElement) {
        -			return false;
        -		}
        -
        -		return this.floating ?
        -			( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
        -			: ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
        -
        -	},
        -
        -	_intersectsWithSides: function(item) {
        -
        -		var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
        -			isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
        -			verticalDirection = this._getDragVerticalDirection(),
        -			horizontalDirection = this._getDragHorizontalDirection();
        -
        -		if (this.floating && horizontalDirection) {
        -			return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
        -		} else {
        -			return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
        -		}
        -
        -	},
        -
        -	_getDragVerticalDirection: function() {
        -		var delta = this.positionAbs.top - this.lastPositionAbs.top;
        -		return delta !== 0 && (delta > 0 ? "down" : "up");
        -	},
        -
        -	_getDragHorizontalDirection: function() {
        -		var delta = this.positionAbs.left - this.lastPositionAbs.left;
        -		return delta !== 0 && (delta > 0 ? "right" : "left");
        -	},
        -
        -	refresh: function(event) {
        -		this._refreshItems(event);
        -		this._setHandleClassName();
        -		this.refreshPositions();
        -		return this;
        -	},
        -
        -	_connectWith: function() {
        -		var options = this.options;
        -		return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
        -	},
        -
        -	_getItemsAsjQuery: function(connected) {
        -
        -		var i, j, cur, inst,
        -			items = [],
        -			queries = [],
        -			connectWith = this._connectWith();
        -
        -		if(connectWith && connected) {
        -			for (i = connectWith.length - 1; i >= 0; i--){
        -				cur = $(connectWith[i], this.document[0]);
        -				for ( j = cur.length - 1; j >= 0; j--){
        -					inst = $.data(cur[j], this.widgetFullName);
        -					if(inst && inst !== this && !inst.options.disabled) {
        -						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
        -					}
        -				}
        -			}
        -		}
        -
        -		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
        -
        -		function addItems() {
        -			items.push( this );
        -		}
        -		for (i = queries.length - 1; i >= 0; i--){
        -			queries[i][0].each( addItems );
        -		}
        -
        -		return $(items);
        -
        -	},
        -
        -	_removeCurrentsFromItems: function() {
        -
        -		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
        -
        -		this.items = $.grep(this.items, function (item) {
        -			for (var j=0; j < list.length; j++) {
        -				if(list[j] === item.item[0]) {
        -					return false;
        -				}
        -			}
        -			return true;
        -		});
        -
        -	},
        -
        -	_refreshItems: function(event) {
        -
        -		this.items = [];
        -		this.containers = [this];
        -
        -		var i, j, cur, inst, targetData, _queries, item, queriesLength,
        -			items = this.items,
        -			queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
        -			connectWith = this._connectWith();
        -
        -		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
        -			for (i = connectWith.length - 1; i >= 0; i--){
        -				cur = $(connectWith[i], this.document[0]);
        -				for (j = cur.length - 1; j >= 0; j--){
        -					inst = $.data(cur[j], this.widgetFullName);
        -					if(inst && inst !== this && !inst.options.disabled) {
        -						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
        -						this.containers.push(inst);
        -					}
        -				}
        -			}
        -		}
        -
        -		for (i = queries.length - 1; i >= 0; i--) {
        -			targetData = queries[i][1];
        -			_queries = queries[i][0];
        -
        -			for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
        -				item = $(_queries[j]);
        -
        -				item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
        -
        -				items.push({
        -					item: item,
        -					instance: targetData,
        -					width: 0, height: 0,
        -					left: 0, top: 0
        -				});
        -			}
        -		}
        -
        -	},
        -
        -	refreshPositions: function(fast) {
        -
        -		// Determine whether items are being displayed horizontally
        -		this.floating = this.items.length ?
        -			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
        -			false;
        -
        -		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
        -		if(this.offsetParent && this.helper) {
        -			this.offset.parent = this._getParentOffset();
        -		}
        -
        -		var i, item, t, p;
        -
        -		for (i = this.items.length - 1; i >= 0; i--){
        -			item = this.items[i];
        -
        -			//We ignore calculating positions of all connected containers when we're not over them
        -			if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
        -				continue;
        -			}
        -
        -			t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
        -
        -			if (!fast) {
        -				item.width = t.outerWidth();
        -				item.height = t.outerHeight();
        -			}
        -
        -			p = t.offset();
        -			item.left = p.left;
        -			item.top = p.top;
        -		}
        -
        -		if(this.options.custom && this.options.custom.refreshContainers) {
        -			this.options.custom.refreshContainers.call(this);
        -		} else {
        -			for (i = this.containers.length - 1; i >= 0; i--){
        -				p = this.containers[i].element.offset();
        -				this.containers[i].containerCache.left = p.left;
        -				this.containers[i].containerCache.top = p.top;
        -				this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
        -				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
        -			}
        -		}
        -
        -		return this;
        -	},
        -
        -	_createPlaceholder: function(that) {
        -		that = that || this;
        -		var className,
        -			o = that.options;
        -
        -		if(!o.placeholder || o.placeholder.constructor === String) {
        -			className = o.placeholder;
        -			o.placeholder = {
        -				element: function() {
        -
        -					var nodeName = that.currentItem[0].nodeName.toLowerCase(),
        -						element = $( "<" + nodeName + ">", that.document[0] )
        -							.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
        -							.removeClass("ui-sortable-helper");
        -
        -					if ( nodeName === "tbody" ) {
        -						that._createTrPlaceholder(
        -							that.currentItem.find( "tr" ).eq( 0 ),
        -							$( "<tr>", that.document[ 0 ] ).appendTo( element )
        -						);
        -					} else if ( nodeName === "tr" ) {
        -						that._createTrPlaceholder( that.currentItem, element );
        -					} else if ( nodeName === "img" ) {
        -						element.attr( "src", that.currentItem.attr( "src" ) );
        -					}
        -
        -					if ( !className ) {
        -						element.css( "visibility", "hidden" );
        -					}
        -
        -					return element;
        -				},
        -				update: function(container, p) {
        -
        -					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
        -					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
        -					if(className && !o.forcePlaceholderSize) {
        -						return;
        -					}
        -
        -					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
        -					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
        -					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
        -				}
        -			};
        -		}
        -
        -		//Create the placeholder
        -		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
        -
        -		//Append it after the actual current item
        -		that.currentItem.after(that.placeholder);
        -
        -		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
        -		o.placeholder.update(that, that.placeholder);
        -
        -	},
        -
        -	_createTrPlaceholder: function( sourceTr, targetTr ) {
        -		var that = this;
        -
        -		sourceTr.children().each(function() {
        -			$( "<td>&#160;</td>", that.document[ 0 ] )
        -				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
        -				.appendTo( targetTr );
        -		});
        -	},
        -
        -	_contactContainers: function(event) {
        -		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
        -			innermostContainer = null,
        -			innermostIndex = null;
        -
        -		// get innermost container that intersects with item
        -		for (i = this.containers.length - 1; i >= 0; i--) {
        -
        -			// never consider a container that's located within the item itself
        -			if($.contains(this.currentItem[0], this.containers[i].element[0])) {
        -				continue;
        -			}
        -
        -			if(this._intersectsWith(this.containers[i].containerCache)) {
        -
        -				// if we've already found a container and it's more "inner" than this, then continue
        -				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
        -					continue;
        -				}
        -
        -				innermostContainer = this.containers[i];
        -				innermostIndex = i;
        -
        -			} else {
        -				// container doesn't intersect. trigger "out" event if necessary
        -				if(this.containers[i].containerCache.over) {
        -					this.containers[i]._trigger("out", event, this._uiHash(this));
        -					this.containers[i].containerCache.over = 0;
        -				}
        -			}
        -
        -		}
        -
        -		// if no intersecting containers found, return
        -		if(!innermostContainer) {
        -			return;
        -		}
        -
        -		// move the item into the container if it's not there already
        -		if(this.containers.length === 1) {
        -			if (!this.containers[innermostIndex].containerCache.over) {
        -				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
        -				this.containers[innermostIndex].containerCache.over = 1;
        -			}
        -		} else {
        -
        -			//When entering a new container, we will find the item with the least distance and append our item near it
        -			dist = 10000;
        -			itemWithLeastDistance = null;
        -			floating = innermostContainer.floating || this._isFloating(this.currentItem);
        -			posProperty = floating ? "left" : "top";
        -			sizeProperty = floating ? "width" : "height";
        -			axis = floating ? "clientX" : "clientY";
        -
        -			for (j = this.items.length - 1; j >= 0; j--) {
        -				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
        -					continue;
        -				}
        -				if(this.items[j].item[0] === this.currentItem[0]) {
        -					continue;
        -				}
        -
        -				cur = this.items[j].item.offset()[posProperty];
        -				nearBottom = false;
        -				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
        -					nearBottom = true;
        -				}
        -
        -				if ( Math.abs( event[ axis ] - cur ) < dist ) {
        -					dist = Math.abs( event[ axis ] - cur );
        -					itemWithLeastDistance = this.items[ j ];
        -					this.direction = nearBottom ? "up": "down";
        -				}
        -			}
        -
        -			//Check if dropOnEmpty is enabled
        -			if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
        -				return;
        -			}
        -
        -			if(this.currentContainer === this.containers[innermostIndex]) {
        -				if ( !this.currentContainer.containerCache.over ) {
        -					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
        -					this.currentContainer.containerCache.over = 1;
        -				}
        -				return;
        -			}
        -
        -			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
        -			this._trigger("change", event, this._uiHash());
        -			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
        -			this.currentContainer = this.containers[innermostIndex];
        -
        -			//Update the placeholder
        -			this.options.placeholder.update(this.currentContainer, this.placeholder);
        -
        -			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
        -			this.containers[innermostIndex].containerCache.over = 1;
        -		}
        -
        -
        -	},
        -
        -	_createHelper: function(event) {
        -
        -		var o = this.options,
        -			helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
        -
        -		//Add the helper to the DOM if that didn't happen already
        -		if(!helper.parents("body").length) {
        -			$(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
        -		}
        -
        -		if(helper[0] === this.currentItem[0]) {
        -			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
        -		}
        -
        -		if(!helper[0].style.width || o.forceHelperSize) {
        -			helper.width(this.currentItem.width());
        -		}
        -		if(!helper[0].style.height || o.forceHelperSize) {
        -			helper.height(this.currentItem.height());
        -		}
        -
        -		return helper;
        -
        -	},
        -
        -	_adjustOffsetFromHelper: function(obj) {
        -		if (typeof obj === "string") {
        -			obj = obj.split(" ");
        -		}
        -		if ($.isArray(obj)) {
        -			obj = {left: +obj[0], top: +obj[1] || 0};
        -		}
        -		if ("left" in obj) {
        -			this.offset.click.left = obj.left + this.margins.left;
        -		}
        -		if ("right" in obj) {
        -			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        -		}
        -		if ("top" in obj) {
        -			this.offset.click.top = obj.top + this.margins.top;
        -		}
        -		if ("bottom" in obj) {
        -			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        -		}
        -	},
        -
        -	_getParentOffset: function() {
        -
        -
        -		//Get the offsetParent and cache its position
        -		this.offsetParent = this.helper.offsetParent();
        -		var po = this.offsetParent.offset();
        -
        -		// This is a special case where we need to modify a offset calculated on start, since the following happened:
        -		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
        -		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
        -		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
        -		if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
        -			po.left += this.scrollParent.scrollLeft();
        -			po.top += this.scrollParent.scrollTop();
        -		}
        -
        -		// This needs to be actually done for all browsers, since pageX/pageY includes this information
        -		// with an ugly IE fix
        -		if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
        -			po = { top: 0, left: 0 };
        -		}
        -
        -		return {
        -			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
        -			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
        -		};
        -
        -	},
        -
        -	_getRelativeOffset: function() {
        -
        -		if(this.cssPosition === "relative") {
        -			var p = this.currentItem.position();
        -			return {
        -				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
        -				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
        -			};
        -		} else {
        -			return { top: 0, left: 0 };
        -		}
        -
        -	},
        -
        -	_cacheMargins: function() {
        -		this.margins = {
        -			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
        -			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
        -		};
        -	},
        -
        -	_cacheHelperProportions: function() {
        -		this.helperProportions = {
        -			width: this.helper.outerWidth(),
        -			height: this.helper.outerHeight()
        -		};
        -	},
        -
        -	_setContainment: function() {
        -
        -		var ce, co, over,
        -			o = this.options;
        -		if(o.containment === "parent") {
        -			o.containment = this.helper[0].parentNode;
        -		}
        -		if(o.containment === "document" || o.containment === "window") {
        -			this.containment = [
        -				0 - this.offset.relative.left - this.offset.parent.left,
        -				0 - this.offset.relative.top - this.offset.parent.top,
        -				o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
        -				(o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
        -			];
        -		}
        -
        -		if(!(/^(document|window|parent)$/).test(o.containment)) {
        -			ce = $(o.containment)[0];
        -			co = $(o.containment).offset();
        -			over = ($(ce).css("overflow") !== "hidden");
        -
        -			this.containment = [
        -				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
        -				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
        -				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
        -				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
        -			];
        -		}
        -
        -	},
        -
        -	_convertPositionTo: function(d, pos) {
        -
        -		if(!pos) {
        -			pos = this.position;
        -		}
        -		var mod = d === "absolute" ? 1 : -1,
        -			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
        -			scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
        -
        -		return {
        -			top: (
        -				pos.top	+																// The absolute mouse position
        -				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top * mod -											// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
        -			),
        -			left: (
        -				pos.left +																// The absolute mouse position
        -				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
        -			)
        -		};
        -
        -	},
        -
        -	_generatePosition: function(event) {
        -
        -		var top, left,
        -			o = this.options,
        -			pageX = event.pageX,
        -			pageY = event.pageY,
        -			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
        -
        -		// This is another very weird special case that only happens for relative elements:
        -		// 1. If the css position is relative
        -		// 2. and the scroll parent is the document or similar to the offset parent
        -		// we have to refresh the relative offset during the scroll so there are no jumps
        -		if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
        -			this.offset.relative = this._getRelativeOffset();
        -		}
        -
        -		/*
        -		 * - Position constraining -
        -		 * Constrain the position to a mix of grid, containment.
        -		 */
        -
        -		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
        -
        -			if(this.containment) {
        -				if(event.pageX - this.offset.click.left < this.containment[0]) {
        -					pageX = this.containment[0] + this.offset.click.left;
        -				}
        -				if(event.pageY - this.offset.click.top < this.containment[1]) {
        -					pageY = this.containment[1] + this.offset.click.top;
        -				}
        -				if(event.pageX - this.offset.click.left > this.containment[2]) {
        -					pageX = this.containment[2] + this.offset.click.left;
        -				}
        -				if(event.pageY - this.offset.click.top > this.containment[3]) {
        -					pageY = this.containment[3] + this.offset.click.top;
        -				}
        -			}
        -
        -			if(o.grid) {
        -				top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
        -				pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
        -
        -				left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
        -				pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
        -			}
        -
        -		}
        -
        -		return {
        -			top: (
        -				pageY -																// The absolute mouse position
        -				this.offset.click.top -													// Click offset (relative to the element)
        -				this.offset.relative.top	-											// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
        -			),
        -			left: (
        -				pageX -																// The absolute mouse position
        -				this.offset.click.left -												// Click offset (relative to the element)
        -				this.offset.relative.left	-											// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
        -			)
        -		};
        -
        -	},
        -
        -	_rearrange: function(event, i, a, hardRefresh) {
        -
        -		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
        -
        -		//Various things done here to improve the performance:
        -		// 1. we create a setTimeout, that calls refreshPositions
        -		// 2. on the instance, we have a counter variable, that get's higher after every append
        -		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
        -		// 4. this lets only the last addition to the timeout stack through
        -		this.counter = this.counter ? ++this.counter : 1;
        -		var counter = this.counter;
        -
        -		this._delay(function() {
        -			if(counter === this.counter) {
        -				this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
        -			}
        -		});
        -
        -	},
        -
        -	_clear: function(event, noPropagation) {
        -
        -		this.reverting = false;
        -		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
        -		// everything else normalized again
        -		var i,
        -			delayedTriggers = [];
        -
        -		// We first have to update the dom position of the actual currentItem
        -		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
        -		if(!this._noFinalSort && this.currentItem.parent().length) {
        -			this.placeholder.before(this.currentItem);
        -		}
        -		this._noFinalSort = null;
        -
        -		if(this.helper[0] === this.currentItem[0]) {
        -			for(i in this._storedCSS) {
        -				if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
        -					this._storedCSS[i] = "";
        -				}
        -			}
        -			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
        -		} else {
        -			this.currentItem.show();
        -		}
        -
        -		if(this.fromOutside && !noPropagation) {
        -			delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
        -		}
        -		if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
        -			delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
        -		}
        -
        -		// Check if the items Container has Changed and trigger appropriate
        -		// events.
        -		if (this !== this.currentContainer) {
        -			if(!noPropagation) {
        -				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
        -				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
        -				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
        -			}
        -		}
        -
        -
        -		//Post events to containers
        -		function delayEvent( type, instance, container ) {
        -			return function( event ) {
        -				container._trigger( type, event, instance._uiHash( instance ) );
        -			};
        -		}
        -		for (i = this.containers.length - 1; i >= 0; i--){
        -			if (!noPropagation) {
        -				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
        -			}
        -			if(this.containers[i].containerCache.over) {
        -				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
        -				this.containers[i].containerCache.over = 0;
        -			}
        -		}
        -
        -		//Do what was originally in plugins
        -		if ( this.storedCursor ) {
        -			this.document.find( "body" ).css( "cursor", this.storedCursor );
        -			this.storedStylesheet.remove();
        -		}
        -		if(this._storedOpacity) {
        -			this.helper.css("opacity", this._storedOpacity);
        -		}
        -		if(this._storedZIndex) {
        -			this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
        -		}
        -
        -		this.dragging = false;
        -
        -		if(!noPropagation) {
        -			this._trigger("beforeStop", event, this._uiHash());
        -		}
        -
        -		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
        -		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
        -
        -		if ( !this.cancelHelperRemoval ) {
        -			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
        -				this.helper.remove();
        -			}
        -			this.helper = null;
        -		}
        -
        -		if(!noPropagation) {
        -			for (i=0; i < delayedTriggers.length; i++) {
        -				delayedTriggers[i].call(this, event);
        -			} //Trigger all delayed events
        -			this._trigger("stop", event, this._uiHash());
        -		}
        -
        -		this.fromOutside = false;
        -		return !this.cancelHelperRemoval;
        -
        -	},
        -
        -	_trigger: function() {
        -		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
        -			this.cancel();
        -		}
        -	},
        -
        -	_uiHash: function(_inst) {
        -		var inst = _inst || this;
        -		return {
        -			helper: inst.helper,
        -			placeholder: inst.placeholder || $([]),
        -			position: inst.position,
        -			originalPosition: inst.originalPosition,
        -			offset: inst.positionAbs,
        -			item: inst.currentItem,
        -			sender: _inst ? _inst.element : null
        -		};
        -	}
        -
        -});
        -
        -
        -/*!
        - * jQuery UI Spinner 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/spinner/
        - */
        -
        -
        -function spinner_modifier( fn ) {
        -	return function() {
        -		var previous = this.element.val();
        -		fn.apply( this, arguments );
        -		this._refresh();
        -		if ( previous !== this.element.val() ) {
        -			this._trigger( "change" );
        -		}
        -	};
        -}
        -
        -var spinner = $.widget( "ui.spinner", {
        -	version: "1.11.4",
        -	defaultElement: "<input>",
        -	widgetEventPrefix: "spin",
        -	options: {
        -		culture: null,
        -		icons: {
        -			down: "ui-icon-triangle-1-s",
        -			up: "ui-icon-triangle-1-n"
        -		},
        -		incremental: true,
        -		max: null,
        -		min: null,
        -		numberFormat: null,
        -		page: 10,
        -		step: 1,
        -
        -		change: null,
        -		spin: null,
        -		start: null,
        -		stop: null
        -	},
        -
        -	_create: function() {
        -		// handle string values that need to be parsed
        -		this._setOption( "max", this.options.max );
        -		this._setOption( "min", this.options.min );
        -		this._setOption( "step", this.options.step );
        -
        -		// Only format if there is a value, prevents the field from being marked
        -		// as invalid in Firefox, see #9573.
        -		if ( this.value() !== "" ) {
        -			// Format the value, but don't constrain.
        -			this._value( this.element.val(), true );
        -		}
        -
        -		this._draw();
        -		this._on( this._events );
        -		this._refresh();
        -
        -		// turning off autocomplete prevents the browser from remembering the
        -		// value when navigating through history, so we re-enable autocomplete
        -		// if the page is unloaded before the widget is destroyed. #7790
        -		this._on( this.window, {
        -			beforeunload: function() {
        -				this.element.removeAttr( "autocomplete" );
        -			}
        -		});
        -	},
        -
        -	_getCreateOptions: function() {
        -		var options = {},
        -			element = this.element;
        -
        -		$.each( [ "min", "max", "step" ], function( i, option ) {
        -			var value = element.attr( option );
        -			if ( value !== undefined && value.length ) {
        -				options[ option ] = value;
        -			}
        -		});
        -
        -		return options;
        -	},
        -
        -	_events: {
        -		keydown: function( event ) {
        -			if ( this._start( event ) && this._keydown( event ) ) {
        -				event.preventDefault();
        -			}
        -		},
        -		keyup: "_stop",
        -		focus: function() {
        -			this.previous = this.element.val();
        -		},
        -		blur: function( event ) {
        -			if ( this.cancelBlur ) {
        -				delete this.cancelBlur;
        -				return;
        -			}
        -
        -			this._stop();
        -			this._refresh();
        -			if ( this.previous !== this.element.val() ) {
        -				this._trigger( "change", event );
        -			}
        -		},
        -		mousewheel: function( event, delta ) {
        -			if ( !delta ) {
        -				return;
        -			}
        -			if ( !this.spinning && !this._start( event ) ) {
        -				return false;
        -			}
        -
        -			this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
        -			clearTimeout( this.mousewheelTimer );
        -			this.mousewheelTimer = this._delay(function() {
        -				if ( this.spinning ) {
        -					this._stop( event );
        -				}
        -			}, 100 );
        -			event.preventDefault();
        -		},
        -		"mousedown .ui-spinner-button": function( event ) {
        -			var previous;
        -
        -			// We never want the buttons to have focus; whenever the user is
        -			// interacting with the spinner, the focus should be on the input.
        -			// If the input is focused then this.previous is properly set from
        -			// when the input first received focus. If the input is not focused
        -			// then we need to set this.previous based on the value before spinning.
        -			previous = this.element[0] === this.document[0].activeElement ?
        -				this.previous : this.element.val();
        -			function checkFocus() {
        -				var isActive = this.element[0] === this.document[0].activeElement;
        -				if ( !isActive ) {
        -					this.element.focus();
        -					this.previous = previous;
        -					// support: IE
        -					// IE sets focus asynchronously, so we need to check if focus
        -					// moved off of the input because the user clicked on the button.
        -					this._delay(function() {
        -						this.previous = previous;
        -					});
        -				}
        -			}
        -
        -			// ensure focus is on (or stays on) the text field
        -			event.preventDefault();
        -			checkFocus.call( this );
        -
        -			// support: IE
        -			// IE doesn't prevent moving focus even with event.preventDefault()
        -			// so we set a flag to know when we should ignore the blur event
        -			// and check (again) if focus moved off of the input.
        -			this.cancelBlur = true;
        -			this._delay(function() {
        -				delete this.cancelBlur;
        -				checkFocus.call( this );
        -			});
        -
        -			if ( this._start( event ) === false ) {
        -				return;
        -			}
        -
        -			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        -		},
        -		"mouseup .ui-spinner-button": "_stop",
        -		"mouseenter .ui-spinner-button": function( event ) {
        -			// button will add ui-state-active if mouse was down while mouseleave and kept down
        -			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
        -				return;
        -			}
        -
        -			if ( this._start( event ) === false ) {
        -				return false;
        -			}
        -			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        -		},
        -		// TODO: do we really want to consider this a stop?
        -		// shouldn't we just stop the repeater and wait until mouseup before
        -		// we trigger the stop event?
        -		"mouseleave .ui-spinner-button": "_stop"
        -	},
        -
        -	_draw: function() {
        -		var uiSpinner = this.uiSpinner = this.element
        -			.addClass( "ui-spinner-input" )
        -			.attr( "autocomplete", "off" )
        -			.wrap( this._uiSpinnerHtml() )
        -			.parent()
        -				// add buttons
        -				.append( this._buttonHtml() );
        -
        -		this.element.attr( "role", "spinbutton" );
        -
        -		// button bindings
        -		this.buttons = uiSpinner.find( ".ui-spinner-button" )
        -			.attr( "tabIndex", -1 )
        -			.button()
        -			.removeClass( "ui-corner-all" );
        -
        -		// IE 6 doesn't understand height: 50% for the buttons
        -		// unless the wrapper has an explicit height
        -		if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
        -				uiSpinner.height() > 0 ) {
        -			uiSpinner.height( uiSpinner.height() );
        -		}
        -
        -		// disable spinner if element was already disabled
        -		if ( this.options.disabled ) {
        -			this.disable();
        -		}
        -	},
        -
        -	_keydown: function( event ) {
        -		var options = this.options,
        -			keyCode = $.ui.keyCode;
        -
        -		switch ( event.keyCode ) {
        -		case keyCode.UP:
        -			this._repeat( null, 1, event );
        -			return true;
        -		case keyCode.DOWN:
        -			this._repeat( null, -1, event );
        -			return true;
        -		case keyCode.PAGE_UP:
        -			this._repeat( null, options.page, event );
        -			return true;
        -		case keyCode.PAGE_DOWN:
        -			this._repeat( null, -options.page, event );
        -			return true;
        -		}
        -
        -		return false;
        -	},
        -
        -	_uiSpinnerHtml: function() {
        -		return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
        -	},
        -
        -	_buttonHtml: function() {
        -		return "" +
        -			"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
        -				"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
        -			"</a>" +
        -			"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
        -				"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
        -			"</a>";
        -	},
        -
        -	_start: function( event ) {
        -		if ( !this.spinning && this._trigger( "start", event ) === false ) {
        -			return false;
        -		}
        -
        -		if ( !this.counter ) {
        -			this.counter = 1;
        -		}
        -		this.spinning = true;
        -		return true;
        -	},
        -
        -	_repeat: function( i, steps, event ) {
        -		i = i || 500;
        -
        -		clearTimeout( this.timer );
        -		this.timer = this._delay(function() {
        -			this._repeat( 40, steps, event );
        -		}, i );
        -
        -		this._spin( steps * this.options.step, event );
        -	},
        -
        -	_spin: function( step, event ) {
        -		var value = this.value() || 0;
        -
        -		if ( !this.counter ) {
        -			this.counter = 1;
        -		}
        -
        -		value = this._adjustValue( value + step * this._increment( this.counter ) );
        -
        -		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
        -			this._value( value );
        -			this.counter++;
        -		}
        -	},
        -
        -	_increment: function( i ) {
        -		var incremental = this.options.incremental;
        -
        -		if ( incremental ) {
        -			return $.isFunction( incremental ) ?
        -				incremental( i ) :
        -				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
        -		}
        -
        -		return 1;
        -	},
        -
        -	_precision: function() {
        -		var precision = this._precisionOf( this.options.step );
        -		if ( this.options.min !== null ) {
        -			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        -		}
        -		return precision;
        -	},
        -
        -	_precisionOf: function( num ) {
        -		var str = num.toString(),
        -			decimal = str.indexOf( "." );
        -		return decimal === -1 ? 0 : str.length - decimal - 1;
        -	},
        -
        -	_adjustValue: function( value ) {
        -		var base, aboveMin,
        -			options = this.options;
        -
        -		// make sure we're at a valid step
        -		// - find out where we are relative to the base (min or 0)
        -		base = options.min !== null ? options.min : 0;
        -		aboveMin = value - base;
        -		// - round to the nearest step
        -		aboveMin = Math.round(aboveMin / options.step) * options.step;
        -		// - rounding is based on 0, so adjust back to our base
        -		value = base + aboveMin;
        -
        -		// fix precision from bad JS floating point math
        -		value = parseFloat( value.toFixed( this._precision() ) );
        -
        -		// clamp the value
        -		if ( options.max !== null && value > options.max) {
        -			return options.max;
        -		}
        -		if ( options.min !== null && value < options.min ) {
        -			return options.min;
        -		}
        -
        -		return value;
        -	},
        -
        -	_stop: function( event ) {
        -		if ( !this.spinning ) {
        -			return;
        -		}
        -
        -		clearTimeout( this.timer );
        -		clearTimeout( this.mousewheelTimer );
        -		this.counter = 0;
        -		this.spinning = false;
        -		this._trigger( "stop", event );
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "culture" || key === "numberFormat" ) {
        -			var prevValue = this._parse( this.element.val() );
        -			this.options[ key ] = value;
        -			this.element.val( this._format( prevValue ) );
        -			return;
        -		}
        -
        -		if ( key === "max" || key === "min" || key === "step" ) {
        -			if ( typeof value === "string" ) {
        -				value = this._parse( value );
        -			}
        -		}
        -		if ( key === "icons" ) {
        -			this.buttons.first().find( ".ui-icon" )
        -				.removeClass( this.options.icons.up )
        -				.addClass( value.up );
        -			this.buttons.last().find( ".ui-icon" )
        -				.removeClass( this.options.icons.down )
        -				.addClass( value.down );
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "disabled" ) {
        -			this.widget().toggleClass( "ui-state-disabled", !!value );
        -			this.element.prop( "disabled", !!value );
        -			this.buttons.button( value ? "disable" : "enable" );
        -		}
        -	},
        -
        -	_setOptions: spinner_modifier(function( options ) {
        -		this._super( options );
        -	}),
        -
        -	_parse: function( val ) {
        -		if ( typeof val === "string" && val !== "" ) {
        -			val = window.Globalize && this.options.numberFormat ?
        -				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
        -		}
        -		return val === "" || isNaN( val ) ? null : val;
        -	},
        -
        -	_format: function( value ) {
        -		if ( value === "" ) {
        -			return "";
        -		}
        -		return window.Globalize && this.options.numberFormat ?
        -			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
        -			value;
        -	},
        -
        -	_refresh: function() {
        -		this.element.attr({
        -			"aria-valuemin": this.options.min,
        -			"aria-valuemax": this.options.max,
        -			// TODO: what should we do with values that can't be parsed?
        -			"aria-valuenow": this._parse( this.element.val() )
        -		});
        -	},
        -
        -	isValid: function() {
        -		var value = this.value();
        -
        -		// null is invalid
        -		if ( value === null ) {
        -			return false;
        -		}
        -
        -		// if value gets adjusted, it's invalid
        -		return value === this._adjustValue( value );
        -	},
        -
        -	// update the value without triggering change
        -	_value: function( value, allowAny ) {
        -		var parsed;
        -		if ( value !== "" ) {
        -			parsed = this._parse( value );
        -			if ( parsed !== null ) {
        -				if ( !allowAny ) {
        -					parsed = this._adjustValue( parsed );
        -				}
        -				value = this._format( parsed );
        -			}
        -		}
        -		this.element.val( value );
        -		this._refresh();
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-spinner-input" )
        -			.prop( "disabled", false )
        -			.removeAttr( "autocomplete" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-valuemin" )
        -			.removeAttr( "aria-valuemax" )
        -			.removeAttr( "aria-valuenow" );
        -		this.uiSpinner.replaceWith( this.element );
        -	},
        -
        -	stepUp: spinner_modifier(function( steps ) {
        -		this._stepUp( steps );
        -	}),
        -	_stepUp: function( steps ) {
        -		if ( this._start() ) {
        -			this._spin( (steps || 1) * this.options.step );
        -			this._stop();
        -		}
        -	},
        -
        -	stepDown: spinner_modifier(function( steps ) {
        -		this._stepDown( steps );
        -	}),
        -	_stepDown: function( steps ) {
        -		if ( this._start() ) {
        -			this._spin( (steps || 1) * -this.options.step );
        -			this._stop();
        -		}
        -	},
        -
        -	pageUp: spinner_modifier(function( pages ) {
        -		this._stepUp( (pages || 1) * this.options.page );
        -	}),
        -
        -	pageDown: spinner_modifier(function( pages ) {
        -		this._stepDown( (pages || 1) * this.options.page );
        -	}),
        -
        -	value: function( newVal ) {
        -		if ( !arguments.length ) {
        -			return this._parse( this.element.val() );
        -		}
        -		spinner_modifier( this._value ).call( this, newVal );
        -	},
        -
        -	widget: function() {
        -		return this.uiSpinner;
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Tabs 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/tabs/
        - */
        -
        -
        -var tabs = $.widget( "ui.tabs", {
        -	version: "1.11.4",
        -	delay: 300,
        -	options: {
        -		active: null,
        -		collapsible: false,
        -		event: "click",
        -		heightStyle: "content",
        -		hide: null,
        -		show: null,
        -
        -		// callbacks
        -		activate: null,
        -		beforeActivate: null,
        -		beforeLoad: null,
        -		load: null
        -	},
        -
        -	_isLocal: (function() {
        -		var rhash = /#.*$/;
        -
        -		return function( anchor ) {
        -			var anchorUrl, locationUrl;
        -
        -			// support: IE7
        -			// IE7 doesn't normalize the href property when set via script (#9317)
        -			anchor = anchor.cloneNode( false );
        -
        -			anchorUrl = anchor.href.replace( rhash, "" );
        -			locationUrl = location.href.replace( rhash, "" );
        -
        -			// decoding may throw an error if the URL isn't UTF-8 (#9518)
        -			try {
        -				anchorUrl = decodeURIComponent( anchorUrl );
        -			} catch ( error ) {}
        -			try {
        -				locationUrl = decodeURIComponent( locationUrl );
        -			} catch ( error ) {}
        -
        -			return anchor.hash.length > 1 && anchorUrl === locationUrl;
        -		};
        -	})(),
        -
        -	_create: function() {
        -		var that = this,
        -			options = this.options;
        -
        -		this.running = false;
        -
        -		this.element
        -			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
        -			.toggleClass( "ui-tabs-collapsible", options.collapsible );
        -
        -		this._processTabs();
        -		options.active = this._initialActive();
        -
        -		// Take disabling tabs via class attribute from HTML
        -		// into account and update option properly.
        -		if ( $.isArray( options.disabled ) ) {
        -			options.disabled = $.unique( options.disabled.concat(
        -				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
        -					return that.tabs.index( li );
        -				})
        -			) ).sort();
        -		}
        -
        -		// check for length avoids error when initializing empty list
        -		if ( this.options.active !== false && this.anchors.length ) {
        -			this.active = this._findActive( options.active );
        -		} else {
        -			this.active = $();
        -		}
        -
        -		this._refresh();
        -
        -		if ( this.active.length ) {
        -			this.load( options.active );
        -		}
        -	},
        -
        -	_initialActive: function() {
        -		var active = this.options.active,
        -			collapsible = this.options.collapsible,
        -			locationHash = location.hash.substring( 1 );
        -
        -		if ( active === null ) {
        -			// check the fragment identifier in the URL
        -			if ( locationHash ) {
        -				this.tabs.each(function( i, tab ) {
        -					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
        -						active = i;
        -						return false;
        -					}
        -				});
        -			}
        -
        -			// check for a tab marked active via a class
        -			if ( active === null ) {
        -				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
        -			}
        -
        -			// no active tab, set to false
        -			if ( active === null || active === -1 ) {
        -				active = this.tabs.length ? 0 : false;
        -			}
        -		}
        -
        -		// handle numbers: negative, out of range
        -		if ( active !== false ) {
        -			active = this.tabs.index( this.tabs.eq( active ) );
        -			if ( active === -1 ) {
        -				active = collapsible ? false : 0;
        -			}
        -		}
        -
        -		// don't allow collapsible: false and active: false
        -		if ( !collapsible && active === false && this.anchors.length ) {
        -			active = 0;
        -		}
        -
        -		return active;
        -	},
        -
        -	_getCreateEventData: function() {
        -		return {
        -			tab: this.active,
        -			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
        -		};
        -	},
        -
        -	_tabKeydown: function( event ) {
        -		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
        -			selectedIndex = this.tabs.index( focusedTab ),
        -			goingForward = true;
        -
        -		if ( this._handlePageNav( event ) ) {
        -			return;
        -		}
        -
        -		switch ( event.keyCode ) {
        -			case $.ui.keyCode.RIGHT:
        -			case $.ui.keyCode.DOWN:
        -				selectedIndex++;
        -				break;
        -			case $.ui.keyCode.UP:
        -			case $.ui.keyCode.LEFT:
        -				goingForward = false;
        -				selectedIndex--;
        -				break;
        -			case $.ui.keyCode.END:
        -				selectedIndex = this.anchors.length - 1;
        -				break;
        -			case $.ui.keyCode.HOME:
        -				selectedIndex = 0;
        -				break;
        -			case $.ui.keyCode.SPACE:
        -				// Activate only, no collapsing
        -				event.preventDefault();
        -				clearTimeout( this.activating );
        -				this._activate( selectedIndex );
        -				return;
        -			case $.ui.keyCode.ENTER:
        -				// Toggle (cancel delayed activation, allow collapsing)
        -				event.preventDefault();
        -				clearTimeout( this.activating );
        -				// Determine if we should collapse or activate
        -				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
        -				return;
        -			default:
        -				return;
        -		}
        -
        -		// Focus the appropriate tab, based on which key was pressed
        -		event.preventDefault();
        -		clearTimeout( this.activating );
        -		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
        -
        -		// Navigating with control/command key will prevent automatic activation
        -		if ( !event.ctrlKey && !event.metaKey ) {
        -
        -			// Update aria-selected immediately so that AT think the tab is already selected.
        -			// Otherwise AT may confuse the user by stating that they need to activate the tab,
        -			// but the tab will already be activated by the time the announcement finishes.
        -			focusedTab.attr( "aria-selected", "false" );
        -			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
        -
        -			this.activating = this._delay(function() {
        -				this.option( "active", selectedIndex );
        -			}, this.delay );
        -		}
        -	},
        -
        -	_panelKeydown: function( event ) {
        -		if ( this._handlePageNav( event ) ) {
        -			return;
        -		}
        -
        -		// Ctrl+up moves focus to the current tab
        -		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
        -			event.preventDefault();
        -			this.active.focus();
        -		}
        -	},
        -
        -	// Alt+page up/down moves focus to the previous/next tab (and activates)
        -	_handlePageNav: function( event ) {
        -		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
        -			this._activate( this._focusNextTab( this.options.active - 1, false ) );
        -			return true;
        -		}
        -		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
        -			this._activate( this._focusNextTab( this.options.active + 1, true ) );
        -			return true;
        -		}
        -	},
        -
        -	_findNextTab: function( index, goingForward ) {
        -		var lastTabIndex = this.tabs.length - 1;
        -
        -		function constrain() {
        -			if ( index > lastTabIndex ) {
        -				index = 0;
        -			}
        -			if ( index < 0 ) {
        -				index = lastTabIndex;
        -			}
        -			return index;
        -		}
        -
        -		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
        -			index = goingForward ? index + 1 : index - 1;
        -		}
        -
        -		return index;
        -	},
        -
        -	_focusNextTab: function( index, goingForward ) {
        -		index = this._findNextTab( index, goingForward );
        -		this.tabs.eq( index ).focus();
        -		return index;
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "active" ) {
        -			// _activate() will handle invalid values and update this.options
        -			this._activate( value );
        -			return;
        -		}
        -
        -		if ( key === "disabled" ) {
        -			// don't use the widget factory's disabled handling
        -			this._setupDisabled( value );
        -			return;
        -		}
        -
        -		this._super( key, value);
        -
        -		if ( key === "collapsible" ) {
        -			this.element.toggleClass( "ui-tabs-collapsible", value );
        -			// Setting collapsible: false while collapsed; open first panel
        -			if ( !value && this.options.active === false ) {
        -				this._activate( 0 );
        -			}
        -		}
        -
        -		if ( key === "event" ) {
        -			this._setupEvents( value );
        -		}
        -
        -		if ( key === "heightStyle" ) {
        -			this._setupHeightStyle( value );
        -		}
        -	},
        -
        -	_sanitizeSelector: function( hash ) {
        -		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
        -	},
        -
        -	refresh: function() {
        -		var options = this.options,
        -			lis = this.tablist.children( ":has(a[href])" );
        -
        -		// get disabled tabs from class attribute from HTML
        -		// this will get converted to a boolean if needed in _refresh()
        -		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
        -			return lis.index( tab );
        -		});
        -
        -		this._processTabs();
        -
        -		// was collapsed or no tabs
        -		if ( options.active === false || !this.anchors.length ) {
        -			options.active = false;
        -			this.active = $();
        -		// was active, but active tab is gone
        -		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
        -			// all remaining tabs are disabled
        -			if ( this.tabs.length === options.disabled.length ) {
        -				options.active = false;
        -				this.active = $();
        -			// activate previous tab
        -			} else {
        -				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
        -			}
        -		// was active, active tab still exists
        -		} else {
        -			// make sure active index is correct
        -			options.active = this.tabs.index( this.active );
        -		}
        -
        -		this._refresh();
        -	},
        -
        -	_refresh: function() {
        -		this._setupDisabled( this.options.disabled );
        -		this._setupEvents( this.options.event );
        -		this._setupHeightStyle( this.options.heightStyle );
        -
        -		this.tabs.not( this.active ).attr({
        -			"aria-selected": "false",
        -			"aria-expanded": "false",
        -			tabIndex: -1
        -		});
        -		this.panels.not( this._getPanelForTab( this.active ) )
        -			.hide()
        -			.attr({
        -				"aria-hidden": "true"
        -			});
        -
        -		// Make sure one tab is in the tab order
        -		if ( !this.active.length ) {
        -			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
        -		} else {
        -			this.active
        -				.addClass( "ui-tabs-active ui-state-active" )
        -				.attr({
        -					"aria-selected": "true",
        -					"aria-expanded": "true",
        -					tabIndex: 0
        -				});
        -			this._getPanelForTab( this.active )
        -				.show()
        -				.attr({
        -					"aria-hidden": "false"
        -				});
        -		}
        -	},
        -
        -	_processTabs: function() {
        -		var that = this,
        -			prevTabs = this.tabs,
        -			prevAnchors = this.anchors,
        -			prevPanels = this.panels;
        -
        -		this.tablist = this._getList()
        -			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
        -			.attr( "role", "tablist" )
        -
        -			// Prevent users from focusing disabled tabs via click
        -			.delegate( "> li", "mousedown" + this.eventNamespace, function( event ) {
        -				if ( $( this ).is( ".ui-state-disabled" ) ) {
        -					event.preventDefault();
        -				}
        -			})
        -
        -			// support: IE <9
        -			// Preventing the default action in mousedown doesn't prevent IE
        -			// from focusing the element, so if the anchor gets focused, blur.
        -			// We don't have to worry about focusing the previously focused
        -			// element since clicking on a non-focusable element should focus
        -			// the body anyway.
        -			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
        -				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
        -					this.blur();
        -				}
        -			});
        -
        -		this.tabs = this.tablist.find( "> li:has(a[href])" )
        -			.addClass( "ui-state-default ui-corner-top" )
        -			.attr({
        -				role: "tab",
        -				tabIndex: -1
        -			});
        -
        -		this.anchors = this.tabs.map(function() {
        -				return $( "a", this )[ 0 ];
        -			})
        -			.addClass( "ui-tabs-anchor" )
        -			.attr({
        -				role: "presentation",
        -				tabIndex: -1
        -			});
        -
        -		this.panels = $();
        -
        -		this.anchors.each(function( i, anchor ) {
        -			var selector, panel, panelId,
        -				anchorId = $( anchor ).uniqueId().attr( "id" ),
        -				tab = $( anchor ).closest( "li" ),
        -				originalAriaControls = tab.attr( "aria-controls" );
        -
        -			// inline tab
        -			if ( that._isLocal( anchor ) ) {
        -				selector = anchor.hash;
        -				panelId = selector.substring( 1 );
        -				panel = that.element.find( that._sanitizeSelector( selector ) );
        -			// remote tab
        -			} else {
        -				// If the tab doesn't already have aria-controls,
        -				// generate an id by using a throw-away element
        -				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
        -				selector = "#" + panelId;
        -				panel = that.element.find( selector );
        -				if ( !panel.length ) {
        -					panel = that._createPanel( panelId );
        -					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
        -				}
        -				panel.attr( "aria-live", "polite" );
        -			}
        -
        -			if ( panel.length) {
        -				that.panels = that.panels.add( panel );
        -			}
        -			if ( originalAriaControls ) {
        -				tab.data( "ui-tabs-aria-controls", originalAriaControls );
        -			}
        -			tab.attr({
        -				"aria-controls": panelId,
        -				"aria-labelledby": anchorId
        -			});
        -			panel.attr( "aria-labelledby", anchorId );
        -		});
        -
        -		this.panels
        -			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
        -			.attr( "role", "tabpanel" );
        -
        -		// Avoid memory leaks (#10056)
        -		if ( prevTabs ) {
        -			this._off( prevTabs.not( this.tabs ) );
        -			this._off( prevAnchors.not( this.anchors ) );
        -			this._off( prevPanels.not( this.panels ) );
        -		}
        -	},
        -
        -	// allow overriding how to find the list for rare usage scenarios (#7715)
        -	_getList: function() {
        -		return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
        -	},
        -
        -	_createPanel: function( id ) {
        -		return $( "<div>" )
        -			.attr( "id", id )
        -			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
        -			.data( "ui-tabs-destroy", true );
        -	},
        -
        -	_setupDisabled: function( disabled ) {
        -		if ( $.isArray( disabled ) ) {
        -			if ( !disabled.length ) {
        -				disabled = false;
        -			} else if ( disabled.length === this.anchors.length ) {
        -				disabled = true;
        -			}
        -		}
        -
        -		// disable tabs
        -		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
        -			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
        -				$( li )
        -					.addClass( "ui-state-disabled" )
        -					.attr( "aria-disabled", "true" );
        -			} else {
        -				$( li )
        -					.removeClass( "ui-state-disabled" )
        -					.removeAttr( "aria-disabled" );
        -			}
        -		}
        -
        -		this.options.disabled = disabled;
        -	},
        -
        -	_setupEvents: function( event ) {
        -		var events = {};
        -		if ( event ) {
        -			$.each( event.split(" "), function( index, eventName ) {
        -				events[ eventName ] = "_eventHandler";
        -			});
        -		}
        -
        -		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
        -		// Always prevent the default action, even when disabled
        -		this._on( true, this.anchors, {
        -			click: function( event ) {
        -				event.preventDefault();
        -			}
        -		});
        -		this._on( this.anchors, events );
        -		this._on( this.tabs, { keydown: "_tabKeydown" } );
        -		this._on( this.panels, { keydown: "_panelKeydown" } );
        -
        -		this._focusable( this.tabs );
        -		this._hoverable( this.tabs );
        -	},
        -
        -	_setupHeightStyle: function( heightStyle ) {
        -		var maxHeight,
        -			parent = this.element.parent();
        -
        -		if ( heightStyle === "fill" ) {
        -			maxHeight = parent.height();
        -			maxHeight -= this.element.outerHeight() - this.element.height();
        -
        -			this.element.siblings( ":visible" ).each(function() {
        -				var elem = $( this ),
        -					position = elem.css( "position" );
        -
        -				if ( position === "absolute" || position === "fixed" ) {
        -					return;
        -				}
        -				maxHeight -= elem.outerHeight( true );
        -			});
        -
        -			this.element.children().not( this.panels ).each(function() {
        -				maxHeight -= $( this ).outerHeight( true );
        -			});
        -
        -			this.panels.each(function() {
        -				$( this ).height( Math.max( 0, maxHeight -
        -					$( this ).innerHeight() + $( this ).height() ) );
        -			})
        -			.css( "overflow", "auto" );
        -		} else if ( heightStyle === "auto" ) {
        -			maxHeight = 0;
        -			this.panels.each(function() {
        -				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
        -			}).height( maxHeight );
        -		}
        -	},
        -
        -	_eventHandler: function( event ) {
        -		var options = this.options,
        -			active = this.active,
        -			anchor = $( event.currentTarget ),
        -			tab = anchor.closest( "li" ),
        -			clickedIsActive = tab[ 0 ] === active[ 0 ],
        -			collapsing = clickedIsActive && options.collapsible,
        -			toShow = collapsing ? $() : this._getPanelForTab( tab ),
        -			toHide = !active.length ? $() : this._getPanelForTab( active ),
        -			eventData = {
        -				oldTab: active,
        -				oldPanel: toHide,
        -				newTab: collapsing ? $() : tab,
        -				newPanel: toShow
        -			};
        -
        -		event.preventDefault();
        -
        -		if ( tab.hasClass( "ui-state-disabled" ) ||
        -				// tab is already loading
        -				tab.hasClass( "ui-tabs-loading" ) ||
        -				// can't switch durning an animation
        -				this.running ||
        -				// click on active header, but not collapsible
        -				( clickedIsActive && !options.collapsible ) ||
        -				// allow canceling activation
        -				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        -			return;
        -		}
        -
        -		options.active = collapsing ? false : this.tabs.index( tab );
        -
        -		this.active = clickedIsActive ? $() : tab;
        -		if ( this.xhr ) {
        -			this.xhr.abort();
        -		}
        -
        -		if ( !toHide.length && !toShow.length ) {
        -			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
        -		}
        -
        -		if ( toShow.length ) {
        -			this.load( this.tabs.index( tab ), event );
        -		}
        -		this._toggle( event, eventData );
        -	},
        -
        -	// handles show/hide for selecting tabs
        -	_toggle: function( event, eventData ) {
        -		var that = this,
        -			toShow = eventData.newPanel,
        -			toHide = eventData.oldPanel;
        -
        -		this.running = true;
        -
        -		function complete() {
        -			that.running = false;
        -			that._trigger( "activate", event, eventData );
        -		}
        -
        -		function show() {
        -			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
        -
        -			if ( toShow.length && that.options.show ) {
        -				that._show( toShow, that.options.show, complete );
        -			} else {
        -				toShow.show();
        -				complete();
        -			}
        -		}
        -
        -		// start out by hiding, then showing, then completing
        -		if ( toHide.length && this.options.hide ) {
        -			this._hide( toHide, this.options.hide, function() {
        -				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
        -				show();
        -			});
        -		} else {
        -			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
        -			toHide.hide();
        -			show();
        -		}
        -
        -		toHide.attr( "aria-hidden", "true" );
        -		eventData.oldTab.attr({
        -			"aria-selected": "false",
        -			"aria-expanded": "false"
        -		});
        -		// If we're switching tabs, remove the old tab from the tab order.
        -		// If we're opening from collapsed state, remove the previous tab from the tab order.
        -		// If we're collapsing, then keep the collapsing tab in the tab order.
        -		if ( toShow.length && toHide.length ) {
        -			eventData.oldTab.attr( "tabIndex", -1 );
        -		} else if ( toShow.length ) {
        -			this.tabs.filter(function() {
        -				return $( this ).attr( "tabIndex" ) === 0;
        -			})
        -			.attr( "tabIndex", -1 );
        -		}
        -
        -		toShow.attr( "aria-hidden", "false" );
        -		eventData.newTab.attr({
        -			"aria-selected": "true",
        -			"aria-expanded": "true",
        -			tabIndex: 0
        -		});
        -	},
        -
        -	_activate: function( index ) {
        -		var anchor,
        -			active = this._findActive( index );
        -
        -		// trying to activate the already active panel
        -		if ( active[ 0 ] === this.active[ 0 ] ) {
        -			return;
        -		}
        -
        -		// trying to collapse, simulate a click on the current active header
        -		if ( !active.length ) {
        -			active = this.active;
        -		}
        -
        -		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
        -		this._eventHandler({
        -			target: anchor,
        -			currentTarget: anchor,
        -			preventDefault: $.noop
        -		});
        -	},
        -
        -	_findActive: function( index ) {
        -		return index === false ? $() : this.tabs.eq( index );
        -	},
        -
        -	_getIndex: function( index ) {
        -		// meta-function to give users option to provide a href string instead of a numerical index.
        -		if ( typeof index === "string" ) {
        -			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
        -		}
        -
        -		return index;
        -	},
        -
        -	_destroy: function() {
        -		if ( this.xhr ) {
        -			this.xhr.abort();
        -		}
        -
        -		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
        -
        -		this.tablist
        -			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
        -			.removeAttr( "role" );
        -
        -		this.anchors
        -			.removeClass( "ui-tabs-anchor" )
        -			.removeAttr( "role" )
        -			.removeAttr( "tabIndex" )
        -			.removeUniqueId();
        -
        -		this.tablist.unbind( this.eventNamespace );
        -
        -		this.tabs.add( this.panels ).each(function() {
        -			if ( $.data( this, "ui-tabs-destroy" ) ) {
        -				$( this ).remove();
        -			} else {
        -				$( this )
        -					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
        -						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
        -					.removeAttr( "tabIndex" )
        -					.removeAttr( "aria-live" )
        -					.removeAttr( "aria-busy" )
        -					.removeAttr( "aria-selected" )
        -					.removeAttr( "aria-labelledby" )
        -					.removeAttr( "aria-hidden" )
        -					.removeAttr( "aria-expanded" )
        -					.removeAttr( "role" );
        -			}
        -		});
        -
        -		this.tabs.each(function() {
        -			var li = $( this ),
        -				prev = li.data( "ui-tabs-aria-controls" );
        -			if ( prev ) {
        -				li
        -					.attr( "aria-controls", prev )
        -					.removeData( "ui-tabs-aria-controls" );
        -			} else {
        -				li.removeAttr( "aria-controls" );
        -			}
        -		});
        -
        -		this.panels.show();
        -
        -		if ( this.options.heightStyle !== "content" ) {
        -			this.panels.css( "height", "" );
        -		}
        -	},
        -
        -	enable: function( index ) {
        -		var disabled = this.options.disabled;
        -		if ( disabled === false ) {
        -			return;
        -		}
        -
        -		if ( index === undefined ) {
        -			disabled = false;
        -		} else {
        -			index = this._getIndex( index );
        -			if ( $.isArray( disabled ) ) {
        -				disabled = $.map( disabled, function( num ) {
        -					return num !== index ? num : null;
        -				});
        -			} else {
        -				disabled = $.map( this.tabs, function( li, num ) {
        -					return num !== index ? num : null;
        -				});
        -			}
        -		}
        -		this._setupDisabled( disabled );
        -	},
        -
        -	disable: function( index ) {
        -		var disabled = this.options.disabled;
        -		if ( disabled === true ) {
        -			return;
        -		}
        -
        -		if ( index === undefined ) {
        -			disabled = true;
        -		} else {
        -			index = this._getIndex( index );
        -			if ( $.inArray( index, disabled ) !== -1 ) {
        -				return;
        -			}
        -			if ( $.isArray( disabled ) ) {
        -				disabled = $.merge( [ index ], disabled ).sort();
        -			} else {
        -				disabled = [ index ];
        -			}
        -		}
        -		this._setupDisabled( disabled );
        -	},
        -
        -	load: function( index, event ) {
        -		index = this._getIndex( index );
        -		var that = this,
        -			tab = this.tabs.eq( index ),
        -			anchor = tab.find( ".ui-tabs-anchor" ),
        -			panel = this._getPanelForTab( tab ),
        -			eventData = {
        -				tab: tab,
        -				panel: panel
        -			},
        -			complete = function( jqXHR, status ) {
        -				if ( status === "abort" ) {
        -					that.panels.stop( false, true );
        -				}
        -
        -				tab.removeClass( "ui-tabs-loading" );
        -				panel.removeAttr( "aria-busy" );
        -
        -				if ( jqXHR === that.xhr ) {
        -					delete that.xhr;
        -				}
        -			};
        -
        -		// not remote
        -		if ( this._isLocal( anchor[ 0 ] ) ) {
        -			return;
        -		}
        -
        -		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
        -
        -		// support: jQuery <1.8
        -		// jQuery <1.8 returns false if the request is canceled in beforeSend,
        -		// but as of 1.8, $.ajax() always returns a jqXHR object.
        -		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
        -			tab.addClass( "ui-tabs-loading" );
        -			panel.attr( "aria-busy", "true" );
        -
        -			this.xhr
        -				.done(function( response, status, jqXHR ) {
        -					// support: jQuery <1.8
        -					// http://bugs.jquery.com/ticket/11778
        -					setTimeout(function() {
        -						panel.html( response );
        -						that._trigger( "load", event, eventData );
        -
        -						complete( jqXHR, status );
        -					}, 1 );
        -				})
        -				.fail(function( jqXHR, status ) {
        -					// support: jQuery <1.8
        -					// http://bugs.jquery.com/ticket/11778
        -					setTimeout(function() {
        -						complete( jqXHR, status );
        -					}, 1 );
        -				});
        -		}
        -	},
        -
        -	_ajaxSettings: function( anchor, event, eventData ) {
        -		var that = this;
        -		return {
        -			url: anchor.attr( "href" ),
        -			beforeSend: function( jqXHR, settings ) {
        -				return that._trigger( "beforeLoad", event,
        -					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
        -			}
        -		};
        -	},
        -
        -	_getPanelForTab: function( tab ) {
        -		var id = $( tab ).attr( "aria-controls" );
        -		return this.element.find( this._sanitizeSelector( "#" + id ) );
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Tooltip 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/tooltip/
        - */
        -
        -
        -var tooltip = $.widget( "ui.tooltip", {
        -	version: "1.11.4",
        -	options: {
        -		content: function() {
        -			// support: IE<9, Opera in jQuery <1.7
        -			// .text() can't accept undefined, so coerce to a string
        -			var title = $( this ).attr( "title" ) || "";
        -			// Escape title, since we're going from an attribute to raw HTML
        -			return $( "<a>" ).text( title ).html();
        -		},
        -		hide: true,
        -		// Disabled elements have inconsistent behavior across browsers (#8661)
        -		items: "[title]:not([disabled])",
        -		position: {
        -			my: "left top+15",
        -			at: "left bottom",
        -			collision: "flipfit flip"
        -		},
        -		show: true,
        -		tooltipClass: null,
        -		track: false,
        -
        -		// callbacks
        -		close: null,
        -		open: null
        -	},
        -
        -	_addDescribedBy: function( elem, id ) {
        -		var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
        -		describedby.push( id );
        -		elem
        -			.data( "ui-tooltip-id", id )
        -			.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
        -	},
        -
        -	_removeDescribedBy: function( elem ) {
        -		var id = elem.data( "ui-tooltip-id" ),
        -			describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
        -			index = $.inArray( id, describedby );
        -
        -		if ( index !== -1 ) {
        -			describedby.splice( index, 1 );
        -		}
        -
        -		elem.removeData( "ui-tooltip-id" );
        -		describedby = $.trim( describedby.join( " " ) );
        -		if ( describedby ) {
        -			elem.attr( "aria-describedby", describedby );
        -		} else {
        -			elem.removeAttr( "aria-describedby" );
        -		}
        -	},
        -
        -	_create: function() {
        -		this._on({
        -			mouseover: "open",
        -			focusin: "open"
        -		});
        -
        -		// IDs of generated tooltips, needed for destroy
        -		this.tooltips = {};
        -
        -		// IDs of parent tooltips where we removed the title attribute
        -		this.parents = {};
        -
        -		if ( this.options.disabled ) {
        -			this._disable();
        -		}
        -
        -		// Append the aria-live region so tooltips announce correctly
        -		this.liveRegion = $( "<div>" )
        -			.attr({
        -				role: "log",
        -				"aria-live": "assertive",
        -				"aria-relevant": "additions"
        -			})
        -			.addClass( "ui-helper-hidden-accessible" )
        -			.appendTo( this.document[ 0 ].body );
        -	},
        -
        -	_setOption: function( key, value ) {
        -		var that = this;
        -
        -		if ( key === "disabled" ) {
        -			this[ value ? "_disable" : "_enable" ]();
        -			this.options[ key ] = value;
        -			// disable element style changes
        -			return;
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "content" ) {
        -			$.each( this.tooltips, function( id, tooltipData ) {
        -				that._updateContent( tooltipData.element );
        -			});
        -		}
        -	},
        -
        -	_disable: function() {
        -		var that = this;
        -
        -		// close open tooltips
        -		$.each( this.tooltips, function( id, tooltipData ) {
        -			var event = $.Event( "blur" );
        -			event.target = event.currentTarget = tooltipData.element[ 0 ];
        -			that.close( event, true );
        -		});
        -
        -		// remove title attributes to prevent native tooltips
        -		this.element.find( this.options.items ).addBack().each(function() {
        -			var element = $( this );
        -			if ( element.is( "[title]" ) ) {
        -				element
        -					.data( "ui-tooltip-title", element.attr( "title" ) )
        -					.removeAttr( "title" );
        -			}
        -		});
        -	},
        -
        -	_enable: function() {
        -		// restore title attributes
        -		this.element.find( this.options.items ).addBack().each(function() {
        -			var element = $( this );
        -			if ( element.data( "ui-tooltip-title" ) ) {
        -				element.attr( "title", element.data( "ui-tooltip-title" ) );
        -			}
        -		});
        -	},
        -
        -	open: function( event ) {
        -		var that = this,
        -			target = $( event ? event.target : this.element )
        -				// we need closest here due to mouseover bubbling,
        -				// but always pointing at the same event target
        -				.closest( this.options.items );
        -
        -		// No element to show a tooltip for or the tooltip is already open
        -		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
        -			return;
        -		}
        -
        -		if ( target.attr( "title" ) ) {
        -			target.data( "ui-tooltip-title", target.attr( "title" ) );
        -		}
        -
        -		target.data( "ui-tooltip-open", true );
        -
        -		// kill parent tooltips, custom or native, for hover
        -		if ( event && event.type === "mouseover" ) {
        -			target.parents().each(function() {
        -				var parent = $( this ),
        -					blurEvent;
        -				if ( parent.data( "ui-tooltip-open" ) ) {
        -					blurEvent = $.Event( "blur" );
        -					blurEvent.target = blurEvent.currentTarget = this;
        -					that.close( blurEvent, true );
        -				}
        -				if ( parent.attr( "title" ) ) {
        -					parent.uniqueId();
        -					that.parents[ this.id ] = {
        -						element: this,
        -						title: parent.attr( "title" )
        -					};
        -					parent.attr( "title", "" );
        -				}
        -			});
        -		}
        -
        -		this._registerCloseHandlers( event, target );
        -		this._updateContent( target, event );
        -	},
        -
        -	_updateContent: function( target, event ) {
        -		var content,
        -			contentOption = this.options.content,
        -			that = this,
        -			eventType = event ? event.type : null;
        -
        -		if ( typeof contentOption === "string" ) {
        -			return this._open( event, target, contentOption );
        -		}
        -
        -		content = contentOption.call( target[0], function( response ) {
        -
        -			// IE may instantly serve a cached response for ajax requests
        -			// delay this call to _open so the other call to _open runs first
        -			that._delay(function() {
        -
        -				// Ignore async response if tooltip was closed already
        -				if ( !target.data( "ui-tooltip-open" ) ) {
        -					return;
        -				}
        -
        -				// jQuery creates a special event for focusin when it doesn't
        -				// exist natively. To improve performance, the native event
        -				// object is reused and the type is changed. Therefore, we can't
        -				// rely on the type being correct after the event finished
        -				// bubbling, so we set it back to the previous value. (#8740)
        -				if ( event ) {
        -					event.type = eventType;
        -				}
        -				this._open( event, target, response );
        -			});
        -		});
        -		if ( content ) {
        -			this._open( event, target, content );
        -		}
        -	},
        -
        -	_open: function( event, target, content ) {
        -		var tooltipData, tooltip, delayedShow, a11yContent,
        -			positionOption = $.extend( {}, this.options.position );
        -
        -		if ( !content ) {
        -			return;
        -		}
        -
        -		// Content can be updated multiple times. If the tooltip already
        -		// exists, then just update the content and bail.
        -		tooltipData = this._find( target );
        -		if ( tooltipData ) {
        -			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
        -			return;
        -		}
        -
        -		// if we have a title, clear it to prevent the native tooltip
        -		// we have to check first to avoid defining a title if none exists
        -		// (we don't want to cause an element to start matching [title])
        -		//
        -		// We use removeAttr only for key events, to allow IE to export the correct
        -		// accessible attributes. For mouse events, set to empty string to avoid
        -		// native tooltip showing up (happens only when removing inside mouseover).
        -		if ( target.is( "[title]" ) ) {
        -			if ( event && event.type === "mouseover" ) {
        -				target.attr( "title", "" );
        -			} else {
        -				target.removeAttr( "title" );
        -			}
        -		}
        -
        -		tooltipData = this._tooltip( target );
        -		tooltip = tooltipData.tooltip;
        -		this._addDescribedBy( target, tooltip.attr( "id" ) );
        -		tooltip.find( ".ui-tooltip-content" ).html( content );
        -
        -		// Support: Voiceover on OS X, JAWS on IE <= 9
        -		// JAWS announces deletions even when aria-relevant="additions"
        -		// Voiceover will sometimes re-read the entire log region's contents from the beginning
        -		this.liveRegion.children().hide();
        -		if ( content.clone ) {
        -			a11yContent = content.clone();
        -			a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
        -		} else {
        -			a11yContent = content;
        -		}
        -		$( "<div>" ).html( a11yContent ).appendTo( this.liveRegion );
        -
        -		function position( event ) {
        -			positionOption.of = event;
        -			if ( tooltip.is( ":hidden" ) ) {
        -				return;
        -			}
        -			tooltip.position( positionOption );
        -		}
        -		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
        -			this._on( this.document, {
        -				mousemove: position
        -			});
        -			// trigger once to override element-relative positioning
        -			position( event );
        -		} else {
        -			tooltip.position( $.extend({
        -				of: target
        -			}, this.options.position ) );
        -		}
        -
        -		tooltip.hide();
        -
        -		this._show( tooltip, this.options.show );
        -		// Handle tracking tooltips that are shown with a delay (#8644). As soon
        -		// as the tooltip is visible, position the tooltip using the most recent
        -		// event.
        -		if ( this.options.show && this.options.show.delay ) {
        -			delayedShow = this.delayedShow = setInterval(function() {
        -				if ( tooltip.is( ":visible" ) ) {
        -					position( positionOption.of );
        -					clearInterval( delayedShow );
        -				}
        -			}, $.fx.interval );
        -		}
        -
        -		this._trigger( "open", event, { tooltip: tooltip } );
        -	},
        -
        -	_registerCloseHandlers: function( event, target ) {
        -		var events = {
        -			keyup: function( event ) {
        -				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
        -					var fakeEvent = $.Event(event);
        -					fakeEvent.currentTarget = target[0];
        -					this.close( fakeEvent, true );
        -				}
        -			}
        -		};
        -
        -		// Only bind remove handler for delegated targets. Non-delegated
        -		// tooltips will handle this in destroy.
        -		if ( target[ 0 ] !== this.element[ 0 ] ) {
        -			events.remove = function() {
        -				this._removeTooltip( this._find( target ).tooltip );
        -			};
        -		}
        -
        -		if ( !event || event.type === "mouseover" ) {
        -			events.mouseleave = "close";
        -		}
        -		if ( !event || event.type === "focusin" ) {
        -			events.focusout = "close";
        -		}
        -		this._on( true, target, events );
        -	},
        -
        -	close: function( event ) {
        -		var tooltip,
        -			that = this,
        -			target = $( event ? event.currentTarget : this.element ),
        -			tooltipData = this._find( target );
        -
        -		// The tooltip may already be closed
        -		if ( !tooltipData ) {
        -
        -			// We set ui-tooltip-open immediately upon open (in open()), but only set the
        -			// additional data once there's actually content to show (in _open()). So even if the
        -			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
        -			// the period between open() and _open().
        -			target.removeData( "ui-tooltip-open" );
        -			return;
        -		}
        -
        -		tooltip = tooltipData.tooltip;
        -
        -		// disabling closes the tooltip, so we need to track when we're closing
        -		// to avoid an infinite loop in case the tooltip becomes disabled on close
        -		if ( tooltipData.closing ) {
        -			return;
        -		}
        -
        -		// Clear the interval for delayed tracking tooltips
        -		clearInterval( this.delayedShow );
        -
        -		// only set title if we had one before (see comment in _open())
        -		// If the title attribute has changed since open(), don't restore
        -		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
        -			target.attr( "title", target.data( "ui-tooltip-title" ) );
        -		}
        -
        -		this._removeDescribedBy( target );
        -
        -		tooltipData.hiding = true;
        -		tooltip.stop( true );
        -		this._hide( tooltip, this.options.hide, function() {
        -			that._removeTooltip( $( this ) );
        -		});
        -
        -		target.removeData( "ui-tooltip-open" );
        -		this._off( target, "mouseleave focusout keyup" );
        -
        -		// Remove 'remove' binding only on delegated targets
        -		if ( target[ 0 ] !== this.element[ 0 ] ) {
        -			this._off( target, "remove" );
        -		}
        -		this._off( this.document, "mousemove" );
        -
        -		if ( event && event.type === "mouseleave" ) {
        -			$.each( this.parents, function( id, parent ) {
        -				$( parent.element ).attr( "title", parent.title );
        -				delete that.parents[ id ];
        -			});
        -		}
        -
        -		tooltipData.closing = true;
        -		this._trigger( "close", event, { tooltip: tooltip } );
        -		if ( !tooltipData.hiding ) {
        -			tooltipData.closing = false;
        -		}
        -	},
        -
        -	_tooltip: function( element ) {
        -		var tooltip = $( "<div>" )
        -				.attr( "role", "tooltip" )
        -				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
        -					( this.options.tooltipClass || "" ) ),
        -			id = tooltip.uniqueId().attr( "id" );
        -
        -		$( "<div>" )
        -			.addClass( "ui-tooltip-content" )
        -			.appendTo( tooltip );
        -
        -		tooltip.appendTo( this.document[0].body );
        -
        -		return this.tooltips[ id ] = {
        -			element: element,
        -			tooltip: tooltip
        -		};
        -	},
        -
        -	_find: function( target ) {
        -		var id = target.data( "ui-tooltip-id" );
        -		return id ? this.tooltips[ id ] : null;
        -	},
        -
        -	_removeTooltip: function( tooltip ) {
        -		tooltip.remove();
        -		delete this.tooltips[ tooltip.attr( "id" ) ];
        -	},
        -
        -	_destroy: function() {
        -		var that = this;
        -
        -		// close open tooltips
        -		$.each( this.tooltips, function( id, tooltipData ) {
        -			// Delegate to close method to handle common cleanup
        -			var event = $.Event( "blur" ),
        -				element = tooltipData.element;
        -			event.target = event.currentTarget = element[ 0 ];
        -			that.close( event, true );
        -
        -			// Remove immediately; destroying an open tooltip doesn't use the
        -			// hide animation
        -			$( "#" + id ).remove();
        -
        -			// Restore the title
        -			if ( element.data( "ui-tooltip-title" ) ) {
        -				// If the title attribute has changed since open(), don't restore
        -				if ( !element.attr( "title" ) ) {
        -					element.attr( "title", element.data( "ui-tooltip-title" ) );
        -				}
        -				element.removeData( "ui-tooltip-title" );
        -			}
        -		});
        -		this.liveRegion.remove();
        -	}
        -});
        -
        -
        -
        -}));
        -/*! jQuery UI - v1.11.1+CommonJS - 2014-09-17
        -* http://jqueryui.com
        -* Includes: widget.js
        -* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
        -
        -(function( factory ) {
        -	if ( typeof define === "function" && define.amd ) {
        -
        -		// AMD. Register as an anonymous module.
        -		define([ "jquery" ], factory );
        -
        -	} else if (typeof exports === "object") {
        -		// Node/CommonJS:
        -		factory(require("jquery"));
        -
        -	} else {
        -
        -		// Browser globals
        -		factory( jQuery );
        -	}
        -}(function( $ ) {
        -/*!
        - * jQuery UI Widget 1.11.1
        - * http://jqueryui.com
        - *
        - * Copyright 2014 jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/jQuery.widget/
        - */
        -
        -
        -var widget_uuid = 0,
        -	widget_slice = Array.prototype.slice;
        -
        -$.cleanData = (function( orig ) {
        -	return function( elems ) {
        -		var events, elem, i;
        -		for ( i = 0; (elem = elems[i]) != null; i++ ) {
        -			try {
        -
        -				// Only trigger remove when necessary to save time
        -				events = $._data( elem, "events" );
        -				if ( events && events.remove ) {
        -					$( elem ).triggerHandler( "remove" );
        -				}
        -
        -			// http://bugs.jquery.com/ticket/8235
        -			} catch( e ) {}
        -		}
        -		orig( elems );
        -	};
        -})( $.cleanData );
        -
        -$.widget = function( name, base, prototype ) {
        -	var fullName, existingConstructor, constructor, basePrototype,
        -		// proxiedPrototype allows the provided prototype to remain unmodified
        -		// so that it can be used as a mixin for multiple widgets (#8876)
        -		proxiedPrototype = {},
        -		namespace = name.split( "." )[ 0 ];
        -
        -	name = name.split( "." )[ 1 ];
        -	fullName = namespace + "-" + name;
        -
        -	if ( !prototype ) {
        -		prototype = base;
        -		base = $.Widget;
        -	}
        -
        -	// create selector for plugin
        -	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
        -		return !!$.data( elem, fullName );
        -	};
        -
        -	$[ namespace ] = $[ namespace ] || {};
        -	existingConstructor = $[ namespace ][ name ];
        -	constructor = $[ namespace ][ name ] = function( options, element ) {
        -		// allow instantiation without "new" keyword
        -		if ( !this._createWidget ) {
        -			return new constructor( options, element );
        -		}
        -
        -		// allow instantiation without initializing for simple inheritance
        -		// must use "new" keyword (the code above always passes args)
        -		if ( arguments.length ) {
        -			this._createWidget( options, element );
        -		}
        -	};
        -	// extend with the existing constructor to carry over any static properties
        -	$.extend( constructor, existingConstructor, {
        -		version: prototype.version,
        -		// copy the object used to create the prototype in case we need to
        -		// redefine the widget later
        -		_proto: $.extend( {}, prototype ),
        -		// track widgets that inherit from this widget in case this widget is
        -		// redefined after a widget inherits from it
        -		_childConstructors: []
        -	});
        -
        -	basePrototype = new base();
        -	// we need to make the options hash a property directly on the new instance
        -	// otherwise we'll modify the options hash on the prototype that we're
        -	// inheriting from
        -	basePrototype.options = $.widget.extend( {}, basePrototype.options );
        -	$.each( prototype, function( prop, value ) {
        -		if ( !$.isFunction( value ) ) {
        -			proxiedPrototype[ prop ] = value;
        -			return;
        -		}
        -		proxiedPrototype[ prop ] = (function() {
        -			var _super = function() {
        -					return base.prototype[ prop ].apply( this, arguments );
        -				},
        -				_superApply = function( args ) {
        -					return base.prototype[ prop ].apply( this, args );
        -				};
        -			return function() {
        -				var __super = this._super,
        -					__superApply = this._superApply,
        -					returnValue;
        -
        -				this._super = _super;
        -				this._superApply = _superApply;
        -
        -				returnValue = value.apply( this, arguments );
        -
        -				this._super = __super;
        -				this._superApply = __superApply;
        -
        -				return returnValue;
        -			};
        -		})();
        -	});
        -	constructor.prototype = $.widget.extend( basePrototype, {
        -		// TODO: remove support for widgetEventPrefix
        -		// always use the name + a colon as the prefix, e.g., draggable:start
        -		// don't prefix for widgets that aren't DOM-based
        -		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
        -	}, proxiedPrototype, {
        -		constructor: constructor,
        -		namespace: namespace,
        -		widgetName: name,
        -		widgetFullName: fullName
        -	});
        -
        -	// If this widget is being redefined then we need to find all widgets that
        -	// are inheriting from it and redefine all of them so that they inherit from
        -	// the new version of this widget. We're essentially trying to replace one
        -	// level in the prototype chain.
        -	if ( existingConstructor ) {
        -		$.each( existingConstructor._childConstructors, function( i, child ) {
        -			var childPrototype = child.prototype;
        -
        -			// redefine the child widget using the same prototype that was
        -			// originally used, but inherit from the new version of the base
        -			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
        -		});
        -		// remove the list of existing child constructors from the old constructor
        -		// so the old child constructors can be garbage collected
        -		delete existingConstructor._childConstructors;
        -	} else {
        -		base._childConstructors.push( constructor );
        -	}
        -
        -	$.widget.bridge( name, constructor );
        -
        -	return constructor;
        -};
        -
        -$.widget.extend = function( target ) {
        -	var input = widget_slice.call( arguments, 1 ),
        -		inputIndex = 0,
        -		inputLength = input.length,
        -		key,
        -		value;
        -	for ( ; inputIndex < inputLength; inputIndex++ ) {
        -		for ( key in input[ inputIndex ] ) {
        -			value = input[ inputIndex ][ key ];
        -			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
        -				// Clone objects
        -				if ( $.isPlainObject( value ) ) {
        -					target[ key ] = $.isPlainObject( target[ key ] ) ?
        -						$.widget.extend( {}, target[ key ], value ) :
        -						// Don't extend strings, arrays, etc. with objects
        -						$.widget.extend( {}, value );
        -				// Copy everything else by reference
        -				} else {
        -					target[ key ] = value;
        -				}
        -			}
        -		}
        -	}
        -	return target;
        -};
        -
        -$.widget.bridge = function( name, object ) {
        -	var fullName = object.prototype.widgetFullName || name;
        -	$.fn[ name ] = function( options ) {
        -		var isMethodCall = typeof options === "string",
        -			args = widget_slice.call( arguments, 1 ),
        -			returnValue = this;
        -
        -		// allow multiple hashes to be passed on init
        -		options = !isMethodCall && args.length ?
        -			$.widget.extend.apply( null, [ options ].concat(args) ) :
        -			options;
        -
        -		if ( isMethodCall ) {
        -			this.each(function() {
        -				var methodValue,
        -					instance = $.data( this, fullName );
        -				if ( options === "instance" ) {
        -					returnValue = instance;
        -					return false;
        -				}
        -				if ( !instance ) {
        -					return $.error( "cannot call methods on " + name + " prior to initialization; " +
        -						"attempted to call method '" + options + "'" );
        -				}
        -				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
        -					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
        -				}
        -				methodValue = instance[ options ].apply( instance, args );
        -				if ( methodValue !== instance && methodValue !== undefined ) {
        -					returnValue = methodValue && methodValue.jquery ?
        -						returnValue.pushStack( methodValue.get() ) :
        -						methodValue;
        -					return false;
        -				}
        -			});
        -		} else {
        -			this.each(function() {
        -				var instance = $.data( this, fullName );
        -				if ( instance ) {
        -					instance.option( options || {} );
        -					if ( instance._init ) {
        -						instance._init();
        -					}
        -				} else {
        -					$.data( this, fullName, new object( options, this ) );
        -				}
        -			});
        -		}
        -
        -		return returnValue;
        -	};
        -};
        -
        -$.Widget = function( /* options, element */ ) {};
        -$.Widget._childConstructors = [];
        -
        -$.Widget.prototype = {
        -	widgetName: "widget",
        -	widgetEventPrefix: "",
        -	defaultElement: "<div>",
        -	options: {
        -		disabled: false,
        -
        -		// callbacks
        -		create: null
        -	},
        -	_createWidget: function( options, element ) {
        -		element = $( element || this.defaultElement || this )[ 0 ];
        -		this.element = $( element );
        -		this.uuid = widget_uuid++;
        -		this.eventNamespace = "." + this.widgetName + this.uuid;
        -		this.options = $.widget.extend( {},
        -			this.options,
        -			this._getCreateOptions(),
        -			options );
        -
        -		this.bindings = $();
        -		this.hoverable = $();
        -		this.focusable = $();
        -
        -		if ( element !== this ) {
        -			$.data( element, this.widgetFullName, this );
        -			this._on( true, this.element, {
        -				remove: function( event ) {
        -					if ( event.target === element ) {
        -						this.destroy();
        -					}
        -				}
        -			});
        -			this.document = $( element.style ?
        -				// element within the document
        -				element.ownerDocument :
        -				// element is window or document
        -				element.document || element );
        -			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
        -		}
        -
        -		this._create();
        -		this._trigger( "create", null, this._getCreateEventData() );
        -		this._init();
        -	},
        -	_getCreateOptions: $.noop,
        -	_getCreateEventData: $.noop,
        -	_create: $.noop,
        -	_init: $.noop,
        -
        -	destroy: function() {
        -		this._destroy();
        -		// we can probably remove the unbind calls in 2.0
        -		// all event bindings should go through this._on()
        -		this.element
        -			.unbind( this.eventNamespace )
        -			.removeData( this.widgetFullName )
        -			// support: jquery <1.6.3
        -			// http://bugs.jquery.com/ticket/9413
        -			.removeData( $.camelCase( this.widgetFullName ) );
        -		this.widget()
        -			.unbind( this.eventNamespace )
        -			.removeAttr( "aria-disabled" )
        -			.removeClass(
        -				this.widgetFullName + "-disabled " +
        -				"ui-state-disabled" );
        -
        -		// clean up events and states
        -		this.bindings.unbind( this.eventNamespace );
        -		this.hoverable.removeClass( "ui-state-hover" );
        -		this.focusable.removeClass( "ui-state-focus" );
        -	},
        -	_destroy: $.noop,
        -
        -	widget: function() {
        -		return this.element;
        -	},
        -
        -	option: function( key, value ) {
        -		var options = key,
        -			parts,
        -			curOption,
        -			i;
        -
        -		if ( arguments.length === 0 ) {
        -			// don't return a reference to the internal hash
        -			return $.widget.extend( {}, this.options );
        -		}
        -
        -		if ( typeof key === "string" ) {
        -			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
        -			options = {};
        -			parts = key.split( "." );
        -			key = parts.shift();
        -			if ( parts.length ) {
        -				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
        -				for ( i = 0; i < parts.length - 1; i++ ) {
        -					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
        -					curOption = curOption[ parts[ i ] ];
        -				}
        -				key = parts.pop();
        -				if ( arguments.length === 1 ) {
        -					return curOption[ key ] === undefined ? null : curOption[ key ];
        -				}
        -				curOption[ key ] = value;
        -			} else {
        -				if ( arguments.length === 1 ) {
        -					return this.options[ key ] === undefined ? null : this.options[ key ];
        -				}
        -				options[ key ] = value;
        -			}
        -		}
        -
        -		this._setOptions( options );
        -
        -		return this;
        -	},
        -	_setOptions: function( options ) {
        -		var key;
        -
        -		for ( key in options ) {
        -			this._setOption( key, options[ key ] );
        -		}
        -
        -		return this;
        -	},
        -	_setOption: function( key, value ) {
        -		this.options[ key ] = value;
        -
        -		if ( key === "disabled" ) {
        -			this.widget()
        -				.toggleClass( this.widgetFullName + "-disabled", !!value );
        -
        -			// If the widget is becoming disabled, then nothing is interactive
        -			if ( value ) {
        -				this.hoverable.removeClass( "ui-state-hover" );
        -				this.focusable.removeClass( "ui-state-focus" );
        -			}
        -		}
        -
        -		return this;
        -	},
        -
        -	enable: function() {
        -		return this._setOptions({ disabled: false });
        -	},
        -	disable: function() {
        -		return this._setOptions({ disabled: true });
        -	},
        -
        -	_on: function( suppressDisabledCheck, element, handlers ) {
        -		var delegateElement,
        -			instance = this;
        -
        -		// no suppressDisabledCheck flag, shuffle arguments
        -		if ( typeof suppressDisabledCheck !== "boolean" ) {
        -			handlers = element;
        -			element = suppressDisabledCheck;
        -			suppressDisabledCheck = false;
        -		}
        -
        -		// no element argument, shuffle and use this.element
        -		if ( !handlers ) {
        -			handlers = element;
        -			element = this.element;
        -			delegateElement = this.widget();
        -		} else {
        -			element = delegateElement = $( element );
        -			this.bindings = this.bindings.add( element );
        -		}
        -
        -		$.each( handlers, function( event, handler ) {
        -			function handlerProxy() {
        -				// allow widgets to customize the disabled handling
        -				// - disabled as an array instead of boolean
        -				// - disabled class as method for disabling individual parts
        -				if ( !suppressDisabledCheck &&
        -						( instance.options.disabled === true ||
        -							$( this ).hasClass( "ui-state-disabled" ) ) ) {
        -					return;
        -				}
        -				return ( typeof handler === "string" ? instance[ handler ] : handler )
        -					.apply( instance, arguments );
        -			}
        -
        -			// copy the guid so direct unbinding works
        -			if ( typeof handler !== "string" ) {
        -				handlerProxy.guid = handler.guid =
        -					handler.guid || handlerProxy.guid || $.guid++;
        -			}
        -
        -			var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
        -				eventName = match[1] + instance.eventNamespace,
        -				selector = match[2];
        -			if ( selector ) {
        -				delegateElement.delegate( selector, eventName, handlerProxy );
        -			} else {
        -				element.bind( eventName, handlerProxy );
        -			}
        -		});
        -	},
        -
        -	_off: function( element, eventName ) {
        -		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
        -		element.unbind( eventName ).undelegate( eventName );
        -	},
        -
        -	_delay: function( handler, delay ) {
        -		function handlerProxy() {
        -			return ( typeof handler === "string" ? instance[ handler ] : handler )
        -				.apply( instance, arguments );
        -		}
        -		var instance = this;
        -		return setTimeout( handlerProxy, delay || 0 );
        -	},
        -
        -	_hoverable: function( element ) {
        -		this.hoverable = this.hoverable.add( element );
        -		this._on( element, {
        -			mouseenter: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-hover" );
        -			},
        -			mouseleave: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-hover" );
        -			}
        -		});
        -	},
        -
        -	_focusable: function( element ) {
        -		this.focusable = this.focusable.add( element );
        -		this._on( element, {
        -			focusin: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-focus" );
        -			},
        -			focusout: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-focus" );
        -			}
        -		});
        -	},
        -
        -	_trigger: function( type, event, data ) {
        -		var prop, orig,
        -			callback = this.options[ type ];
        -
        -		data = data || {};
        -		event = $.Event( event );
        -		event.type = ( type === this.widgetEventPrefix ?
        -			type :
        -			this.widgetEventPrefix + type ).toLowerCase();
        -		// the original event may come from any element
        -		// so we need to reset the target on the new event
        -		event.target = this.element[ 0 ];
        -
        -		// copy original event properties over to the new event
        -		orig = event.originalEvent;
        -		if ( orig ) {
        -			for ( prop in orig ) {
        -				if ( !( prop in event ) ) {
        -					event[ prop ] = orig[ prop ];
        -				}
        -			}
        -		}
        -
        -		this.element.trigger( event, data );
        -		return !( $.isFunction( callback ) &&
        -			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
        -			event.isDefaultPrevented() );
        -	}
        -};
        -
        -$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
        -	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
        -		if ( typeof options === "string" ) {
        -			options = { effect: options };
        -		}
        -		var hasOptions,
        -			effectName = !options ?
        -				method :
        -				options === true || typeof options === "number" ?
        -					defaultEffect :
        -					options.effect || defaultEffect;
        -		options = options || {};
        -		if ( typeof options === "number" ) {
        -			options = { duration: options };
        -		}
        -		hasOptions = !$.isEmptyObject( options );
        -		options.complete = callback;
        -		if ( options.delay ) {
        -			element.delay( options.delay );
        -		}
        -		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
        -			element[ method ]( options );
        -		} else if ( effectName !== method && element[ effectName ] ) {
        -			element[ effectName ]( options.duration, options.easing, callback );
        -		} else {
        -			element.queue(function( next ) {
        -				$( this )[ method ]();
        -				if ( callback ) {
        -					callback.call( element[ 0 ] );
        -				}
        -				next();
        -			});
        -		}
        -	};
        -});
        -
        -var widget = $.widget;
        -
        -
        -
        -}));
        -
        -/*
        - * jQuery Iframe Transport Plugin 1.8.3
        - * https://github.com/blueimp/jQuery-File-Upload
        - *
        - * Copyright 2011, Sebastian Tschan
        - * https://blueimp.net
        - *
        - * Licensed under the MIT license:
        - * http://www.opensource.org/licenses/MIT
        - */
        -
        -/* global define, require, window, document */
        -
        -(function (factory) {
        -    'use strict';
        -    if (typeof define === 'function' && define.amd) {
        -        // Register as an anonymous AMD module:
        -        define(['jquery'], factory);
        -    } else if (typeof exports === 'object') {
        -        // Node/CommonJS:
        -        factory(require('jquery'));
        -    } else {
        -        // Browser globals:
        -        factory(window.jQuery);
        -    }
        -}(function ($) {
        -    'use strict';
        -
        -    // Helper variable to create unique names for the transport iframes:
        -    var counter = 0;
        -
        -    // The iframe transport accepts four additional options:
        -    // options.fileInput: a jQuery collection of file input fields
        -    // options.paramName: the parameter name for the file form data,
        -    //  overrides the name property of the file input field(s),
        -    //  can be a string or an array of strings.
        -    // options.formData: an array of objects with name and value properties,
        -    //  equivalent to the return data of .serializeArray(), e.g.:
        -    //  [{name: 'a', value: 1}, {name: 'b', value: 2}]
        -    // options.initialIframeSrc: the URL of the initial iframe src,
        -    //  by default set to "javascript:false;"
        -    $.ajaxTransport('iframe', function (options) {
        -        if (options.async) {
        -            // javascript:false as initial iframe src
        -            // prevents warning popups on HTTPS in IE6:
        -            /*jshint scripturl: true */
        -            var initialIframeSrc = options.initialIframeSrc || 'javascript:false;',
        -            /*jshint scripturl: false */
        -                form,
        -                iframe,
        -                addParamChar;
        -            return {
        -                send: function (_, completeCallback) {
        -                    form = $('<form style="display:none;"></form>');
        -                    form.attr('accept-charset', options.formAcceptCharset);
        -                    addParamChar = /\?/.test(options.url) ? '&' : '?';
        -                    // XDomainRequest only supports GET and POST:
        -                    if (options.type === 'DELETE') {
        -                        options.url = options.url + addParamChar + '_method=DELETE';
        -                        options.type = 'POST';
        -                    } else if (options.type === 'PUT') {
        -                        options.url = options.url + addParamChar + '_method=PUT';
        -                        options.type = 'POST';
        -                    } else if (options.type === 'PATCH') {
        -                        options.url = options.url + addParamChar + '_method=PATCH';
        -                        options.type = 'POST';
        -                    }
        -                    // IE versions below IE8 cannot set the name property of
        -                    // elements that have already been added to the DOM,
        -                    // so we set the name along with the iframe HTML markup:
        -                    counter += 1;
        -                    iframe = $(
        -                        '<iframe src="' + initialIframeSrc +
        -                            '" name="iframe-transport-' + counter + '"></iframe>'
        -                    ).bind('load', function () {
        -                        var fileInputClones,
        -                            paramNames = $.isArray(options.paramName) ?
        -                                    options.paramName : [options.paramName];
        -                        iframe
        -                            .unbind('load')
        -                            .bind('load', function () {
        -                                var response;
        -                                // Wrap in a try/catch block to catch exceptions thrown
        -                                // when trying to access cross-domain iframe contents:
        -                                try {
        -                                    response = iframe.contents();
        -                                    // Google Chrome and Firefox do not throw an
        -                                    // exception when calling iframe.contents() on
        -                                    // cross-domain requests, so we unify the response:
        -                                    if (!response.length || !response[0].firstChild) {
        -                                        throw new Error();
        -                                    }
        -                                } catch (e) {
        -                                    response = undefined;
        -                                }
        -                                // The complete callback returns the
        -                                // iframe content document as response object:
        -                                completeCallback(
        -                                    200,
        -                                    'success',
        -                                    {'iframe': response}
        -                                );
        -                                // Fix for IE endless progress bar activity bug
        -                                // (happens on form submits to iframe targets):
        -                                $('<iframe src="' + initialIframeSrc + '"></iframe>')
        -                                    .appendTo(form);
        -                                window.setTimeout(function () {
        -                                    // Removing the form in a setTimeout call
        -                                    // allows Chrome's developer tools to display
        -                                    // the response result
        -                                    form.remove();
        -                                }, 0);
        -                            });
        -                        form
        -                            .prop('target', iframe.prop('name'))
        -                            .prop('action', options.url)
        -                            .prop('method', options.type);
        -                        if (options.formData) {
        -                            $.each(options.formData, function (index, field) {
        -                                $('<input type="hidden"/>')
        -                                    .prop('name', field.name)
        -                                    .val(field.value)
        -                                    .appendTo(form);
        -                            });
        -                        }
        -                        if (options.fileInput && options.fileInput.length &&
        -                                options.type === 'POST') {
        -                            fileInputClones = options.fileInput.clone();
        -                            // Insert a clone for each file input field:
        -                            options.fileInput.after(function (index) {
        -                                return fileInputClones[index];
        -                            });
        -                            if (options.paramName) {
        -                                options.fileInput.each(function (index) {
        -                                    $(this).prop(
        -                                        'name',
        -                                        paramNames[index] || options.paramName
        -                                    );
        -                                });
        -                            }
        -                            // Appending the file input fields to the hidden form
        -                            // removes them from their original location:
        -                            form
        -                                .append(options.fileInput)
        -                                .prop('enctype', 'multipart/form-data')
        -                                // enctype must be set as encoding for IE:
        -                                .prop('encoding', 'multipart/form-data');
        -                            // Remove the HTML5 form attribute from the input(s):
        -                            options.fileInput.removeAttr('form');
        -                        }
        -                        form.submit();
        -                        // Insert the file input fields at their original location
        -                        // by replacing the clones with the originals:
        -                        if (fileInputClones && fileInputClones.length) {
        -                            options.fileInput.each(function (index, input) {
        -                                var clone = $(fileInputClones[index]);
        -                                // Restore the original name and form properties:
        -                                $(input)
        -                                    .prop('name', clone.prop('name'))
        -                                    .attr('form', clone.attr('form'));
        -                                clone.replaceWith(input);
        -                            });
        -                        }
        -                    });
        -                    form.append(iframe).appendTo(document.body);
        -                },
        -                abort: function () {
        -                    if (iframe) {
        -                        // javascript:false as iframe src aborts the request
        -                        // and prevents warning popups on HTTPS in IE6.
        -                        // concat is used to avoid the "Script URL" JSLint error:
        -                        iframe
        -                            .unbind('load')
        -                            .prop('src', initialIframeSrc);
        -                    }
        -                    if (form) {
        -                        form.remove();
        -                    }
        -                }
        -            };
        -        }
        -    });
        -
        -    // The iframe transport returns the iframe content document as response.
        -    // The following adds converters from iframe to text, json, html, xml
        -    // and script.
        -    // Please note that the Content-Type for JSON responses has to be text/plain
        -    // or text/html, if the browser doesn't include application/json in the
        -    // Accept header, else IE will show a download dialog.
        -    // The Content-Type for XML responses on the other hand has to be always
        -    // application/xml or text/xml, so IE properly parses the XML response.
        -    // See also
        -    // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
        -    $.ajaxSetup({
        -        converters: {
        -            'iframe text': function (iframe) {
        -                return iframe && $(iframe[0].body).text();
        -            },
        -            'iframe json': function (iframe) {
        -                return iframe && $.parseJSON($(iframe[0].body).text());
        -            },
        -            'iframe html': function (iframe) {
        -                return iframe && $(iframe[0].body).html();
        -            },
        -            'iframe xml': function (iframe) {
        -                var xmlDoc = iframe && iframe[0];
        -                return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
        -                        $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
        -                            $(xmlDoc.body).html());
        -            },
        -            'iframe script': function (iframe) {
        -                return iframe && $.globalEval($(iframe[0].body).text());
        -            }
        -        }
        -    });
        -
        -}));
        -
        -/*
        - * jQuery File Upload Plugin 5.42.3
        - * https://github.com/blueimp/jQuery-File-Upload
        - *
        - * Copyright 2010, Sebastian Tschan
        - * https://blueimp.net
        - *
        - * Licensed under the MIT license:
        - * http://www.opensource.org/licenses/MIT
        - */
        -
        -/* jshint nomen:false */
        -/* global define, require, window, document, location, Blob, FormData */
        -
        -(function (factory) {
        -    'use strict';
        -    if (typeof define === 'function' && define.amd) {
        -        // Register as an anonymous AMD module:
        -        define([
        -            'jquery',
        -            'jquery.ui.widget'
        -        ], factory);
        -    } else if (typeof exports === 'object') {
        -        // Node/CommonJS:
        -        factory(
        -            require('jquery'),
        -            require('./vendor/jquery.ui.widget')
        -        );
        -    } else {
        -        // Browser globals:
        -        factory(window.jQuery);
        -    }
        -}(function ($) {
        -    'use strict';
        -
        -    // Detect file input support, based on
        -    // http://viljamis.com/blog/2012/file-upload-support-on-mobile/
        -    $.support.fileInput = !(new RegExp(
        -        // Handle devices which give false positives for the feature detection:
        -        '(Android (1\\.[0156]|2\\.[01]))' +
        -            '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +
        -            '|(w(eb)?OSBrowser)|(webOS)' +
        -            '|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
        -    ).test(window.navigator.userAgent) ||
        -        // Feature detection for all other devices:
        -        $('<input type="file">').prop('disabled'));
        -
        -    // The FileReader API is not actually used, but works as feature detection,
        -    // as some Safari versions (5?) support XHR file uploads via the FormData API,
        -    // but not non-multipart XHR file uploads.
        -    // window.XMLHttpRequestUpload is not available on IE10, so we check for
        -    // window.ProgressEvent instead to detect XHR2 file upload capability:
        -    $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);
        -    $.support.xhrFormDataFileUpload = !!window.FormData;
        -
        -    // Detect support for Blob slicing (required for chunked uploads):
        -    $.support.blobSlice = window.Blob && (Blob.prototype.slice ||
        -        Blob.prototype.webkitSlice || Blob.prototype.mozSlice);
        -
        -    // Helper function to create drag handlers for dragover/dragenter/dragleave:
        -    function getDragHandler(type) {
        -        var isDragOver = type === 'dragover';
        -        return function (e) {
        -            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
        -            var dataTransfer = e.dataTransfer;
        -            if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&
        -                    this._trigger(
        -                        type,
        -                        $.Event(type, {delegatedEvent: e})
        -                    ) !== false) {
        -                e.preventDefault();
        -                if (isDragOver) {
        -                    dataTransfer.dropEffect = 'copy';
        -                }
        -            }
        -        };
        -    }
        -
        -    // The fileupload widget listens for change events on file input fields defined
        -    // via fileInput setting and paste or drop events of the given dropZone.
        -    // In addition to the default jQuery Widget methods, the fileupload widget
        -    // exposes the "add" and "send" methods, to add or directly send files using
        -    // the fileupload API.
        -    // By default, files added via file input selection, paste, drag & drop or
        -    // "add" method are uploaded immediately, but it is possible to override
        -    // the "add" callback option to queue file uploads.
        -    $.widget('blueimp.fileupload', {
        -
        -        options: {
        -            // The drop target element(s), by the default the complete document.
        -            // Set to null to disable drag & drop support:
        -            dropZone: $(document),
        -            // The paste target element(s), by the default undefined.
        -            // Set to a DOM node or jQuery object to enable file pasting:
        -            pasteZone: undefined,
        -            // The file input field(s), that are listened to for change events.
        -            // If undefined, it is set to the file input fields inside
        -            // of the widget element on plugin initialization.
        -            // Set to null to disable the change listener.
        -            fileInput: undefined,
        -            // By default, the file input field is replaced with a clone after
        -            // each input field change event. This is required for iframe transport
        -            // queues and allows change events to be fired for the same file
        -            // selection, but can be disabled by setting the following option to false:
        -            replaceFileInput: true,
        -            // The parameter name for the file form data (the request argument name).
        -            // If undefined or empty, the name property of the file input field is
        -            // used, or "files[]" if the file input name property is also empty,
        -            // can be a string or an array of strings:
        -            paramName: undefined,
        -            // By default, each file of a selection is uploaded using an individual
        -            // request for XHR type uploads. Set to false to upload file
        -            // selections in one request each:
        -            singleFileUploads: true,
        -            // To limit the number of files uploaded with one XHR request,
        -            // set the following option to an integer greater than 0:
        -            limitMultiFileUploads: undefined,
        -            // The following option limits the number of files uploaded with one
        -            // XHR request to keep the request size under or equal to the defined
        -            // limit in bytes:
        -            limitMultiFileUploadSize: undefined,
        -            // Multipart file uploads add a number of bytes to each uploaded file,
        -            // therefore the following option adds an overhead for each file used
        -            // in the limitMultiFileUploadSize configuration:
        -            limitMultiFileUploadSizeOverhead: 512,
        -            // Set the following option to true to issue all file upload requests
        -            // in a sequential order:
        -            sequentialUploads: false,
        -            // To limit the number of concurrent uploads,
        -            // set the following option to an integer greater than 0:
        -            limitConcurrentUploads: undefined,
        -            // Set the following option to true to force iframe transport uploads:
        -            forceIframeTransport: false,
        -            // Set the following option to the location of a redirect url on the
        -            // origin server, for cross-domain iframe transport uploads:
        -            redirect: undefined,
        -            // The parameter name for the redirect url, sent as part of the form
        -            // data and set to 'redirect' if this option is empty:
        -            redirectParamName: undefined,
        -            // Set the following option to the location of a postMessage window,
        -            // to enable postMessage transport uploads:
        -            postMessage: undefined,
        -            // By default, XHR file uploads are sent as multipart/form-data.
        -            // The iframe transport is always using multipart/form-data.
        -            // Set to false to enable non-multipart XHR uploads:
        -            multipart: true,
        -            // To upload large files in smaller chunks, set the following option
        -            // to a preferred maximum chunk size. If set to 0, null or undefined,
        -            // or the browser does not support the required Blob API, files will
        -            // be uploaded as a whole.
        -            maxChunkSize: undefined,
        -            // When a non-multipart upload or a chunked multipart upload has been
        -            // aborted, this option can be used to resume the upload by setting
        -            // it to the size of the already uploaded bytes. This option is most
        -            // useful when modifying the options object inside of the "add" or
        -            // "send" callbacks, as the options are cloned for each file upload.
        -            uploadedBytes: undefined,
        -            // By default, failed (abort or error) file uploads are removed from the
        -            // global progress calculation. Set the following option to false to
        -            // prevent recalculating the global progress data:
        -            recalculateProgress: true,
        -            // Interval in milliseconds to calculate and trigger progress events:
        -            progressInterval: 100,
        -            // Interval in milliseconds to calculate progress bitrate:
        -            bitrateInterval: 500,
        -            // By default, uploads are started automatically when adding files:
        -            autoUpload: true,
        -
        -            // Error and info messages:
        -            messages: {
        -                uploadedBytes: 'Uploaded bytes exceed file size'
        -            },
        -
        -            // Translation function, gets the message key to be translated
        -            // and an object with context specific data as arguments:
        -            i18n: function (message, context) {
        -                message = this.messages[message] || message.toString();
        -                if (context) {
        -                    $.each(context, function (key, value) {
        -                        message = message.replace('{' + key + '}', value);
        -                    });
        -                }
        -                return message;
        -            },
        -
        -            // Additional form data to be sent along with the file uploads can be set
        -            // using this option, which accepts an array of objects with name and
        -            // value properties, a function returning such an array, a FormData
        -            // object (for XHR file uploads), or a simple object.
        -            // The form of the first fileInput is given as parameter to the function:
        -            formData: function (form) {
        -                return form.serializeArray();
        -            },
        -
        -            // The add callback is invoked as soon as files are added to the fileupload
        -            // widget (via file input selection, drag & drop, paste or add API call).
        -            // If the singleFileUploads option is enabled, this callback will be
        -            // called once for each file in the selection for XHR file uploads, else
        -            // once for each file selection.
        -            //
        -            // The upload starts when the submit method is invoked on the data parameter.
        -            // The data object contains a files property holding the added files
        -            // and allows you to override plugin options as well as define ajax settings.
        -            //
        -            // Listeners for this callback can also be bound the following way:
        -            // .bind('fileuploadadd', func);
        -            //
        -            // data.submit() returns a Promise object and allows to attach additional
        -            // handlers using jQuery's Deferred callbacks:
        -            // data.submit().done(func).fail(func).always(func);
        -            add: function (e, data) {
        -                if (e.isDefaultPrevented()) {
        -                    return false;
        -                }
        -                if (data.autoUpload || (data.autoUpload !== false &&
        -                        $(this).fileupload('option', 'autoUpload'))) {
        -                    data.process().done(function () {
        -                        data.submit();
        -                    });
        -                }
        -            },
        -
        -            // Other callbacks:
        -
        -            // Callback for the submit event of each file upload:
        -            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);
        -
        -            // Callback for the start of each file upload request:
        -            // send: function (e, data) {}, // .bind('fileuploadsend', func);
        -
        -            // Callback for successful uploads:
        -            // done: function (e, data) {}, // .bind('fileuploaddone', func);
        -
        -            // Callback for failed (abort or error) uploads:
        -            // fail: function (e, data) {}, // .bind('fileuploadfail', func);
        -
        -            // Callback for completed (success, abort or error) requests:
        -            // always: function (e, data) {}, // .bind('fileuploadalways', func);
        -
        -            // Callback for upload progress events:
        -            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);
        -
        -            // Callback for global upload progress events:
        -            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);
        -
        -            // Callback for uploads start, equivalent to the global ajaxStart event:
        -            // start: function (e) {}, // .bind('fileuploadstart', func);
        -
        -            // Callback for uploads stop, equivalent to the global ajaxStop event:
        -            // stop: function (e) {}, // .bind('fileuploadstop', func);
        -
        -            // Callback for change events of the fileInput(s):
        -            // change: function (e, data) {}, // .bind('fileuploadchange', func);
        -
        -            // Callback for paste events to the pasteZone(s):
        -            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);
        -
        -            // Callback for drop events of the dropZone(s):
        -            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);
        -
        -            // Callback for dragover events of the dropZone(s):
        -            // dragover: function (e) {}, // .bind('fileuploaddragover', func);
        -
        -            // Callback for the start of each chunk upload request:
        -            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
        -
        -            // Callback for successful chunk uploads:
        -            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);
        -
        -            // Callback for failed (abort or error) chunk uploads:
        -            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);
        -
        -            // Callback for completed (success, abort or error) chunk upload requests:
        -            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);
        -
        -            // The plugin options are used as settings object for the ajax calls.
        -            // The following are jQuery ajax settings required for the file uploads:
        -            processData: false,
        -            contentType: false,
        -            cache: false,
        -            timeout: 0
        -        },
        -
        -        // A list of options that require reinitializing event listeners and/or
        -        // special initialization code:
        -        _specialOptions: [
        -            'fileInput',
        -            'dropZone',
        -            'pasteZone',
        -            'multipart',
        -            'forceIframeTransport'
        -        ],
        -
        -        _blobSlice: $.support.blobSlice && function () {
        -            var slice = this.slice || this.webkitSlice || this.mozSlice;
        -            return slice.apply(this, arguments);
        -        },
        -
        -        _BitrateTimer: function () {
        -            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
        -            this.loaded = 0;
        -            this.bitrate = 0;
        -            this.getBitrate = function (now, loaded, interval) {
        -                var timeDiff = now - this.timestamp;
        -                if (!this.bitrate || !interval || timeDiff > interval) {
        -                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
        -                    this.loaded = loaded;
        -                    this.timestamp = now;
        -                }
        -                return this.bitrate;
        -            };
        -        },
        -
        -        _isXHRUpload: function (options) {
        -            return !options.forceIframeTransport &&
        -                ((!options.multipart && $.support.xhrFileUpload) ||
        -                $.support.xhrFormDataFileUpload);
        -        },
        -
        -        _getFormData: function (options) {
        -            var formData;
        -            if ($.type(options.formData) === 'function') {
        -                return options.formData(options.form);
        -            }
        -            if ($.isArray(options.formData)) {
        -                return options.formData;
        -            }
        -            if ($.type(options.formData) === 'object') {
        -                formData = [];
        -                $.each(options.formData, function (name, value) {
        -                    formData.push({name: name, value: value});
        -                });
        -                return formData;
        -            }
        -            return [];
        -        },
        -
        -        _getTotal: function (files) {
        -            var total = 0;
        -            $.each(files, function (index, file) {
        -                total += file.size || 1;
        -            });
        -            return total;
        -        },
        -
        -        _initProgressObject: function (obj) {
        -            var progress = {
        -                loaded: 0,
        -                total: 0,
        -                bitrate: 0
        -            };
        -            if (obj._progress) {
        -                $.extend(obj._progress, progress);
        -            } else {
        -                obj._progress = progress;
        -            }
        -        },
        -
        -        _initResponseObject: function (obj) {
        -            var prop;
        -            if (obj._response) {
        -                for (prop in obj._response) {
        -                    if (obj._response.hasOwnProperty(prop)) {
        -                        delete obj._response[prop];
        -                    }
        -                }
        -            } else {
        -                obj._response = {};
        -            }
        -        },
        -
        -        _onProgress: function (e, data) {
        -            if (e.lengthComputable) {
        -                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),
        -                    loaded;
        -                if (data._time && data.progressInterval &&
        -                        (now - data._time < data.progressInterval) &&
        -                        e.loaded !== e.total) {
        -                    return;
        -                }
        -                data._time = now;
        -                loaded = Math.floor(
        -                    e.loaded / e.total * (data.chunkSize || data._progress.total)
        -                ) + (data.uploadedBytes || 0);
        -                // Add the difference from the previously loaded state
        -                // to the global loaded counter:
        -                this._progress.loaded += (loaded - data._progress.loaded);
        -                this._progress.bitrate = this._bitrateTimer.getBitrate(
        -                    now,
        -                    this._progress.loaded,
        -                    data.bitrateInterval
        -                );
        -                data._progress.loaded = data.loaded = loaded;
        -                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
        -                    now,
        -                    loaded,
        -                    data.bitrateInterval
        -                );
        -                // Trigger a custom progress event with a total data property set
        -                // to the file size(s) of the current upload and a loaded data
        -                // property calculated accordingly:
        -                this._trigger(
        -                    'progress',
        -                    $.Event('progress', {delegatedEvent: e}),
        -                    data
        -                );
        -                // Trigger a global progress event for all current file uploads,
        -                // including ajax calls queued for sequential file uploads:
        -                this._trigger(
        -                    'progressall',
        -                    $.Event('progressall', {delegatedEvent: e}),
        -                    this._progress
        -                );
        -            }
        -        },
        -
        -        _initProgressListener: function (options) {
        -            var that = this,
        -                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();
        -            // Accesss to the native XHR object is required to add event listeners
        -            // for the upload progress event:
        -            if (xhr.upload) {
        -                $(xhr.upload).bind('progress', function (e) {
        -                    var oe = e.originalEvent;
        -                    // Make sure the progress event properties get copied over:
        -                    e.lengthComputable = oe.lengthComputable;
        -                    e.loaded = oe.loaded;
        -                    e.total = oe.total;
        -                    that._onProgress(e, options);
        -                });
        -                options.xhr = function () {
        -                    return xhr;
        -                };
        -            }
        -        },
        -
        -        _isInstanceOf: function (type, obj) {
        -            // Cross-frame instanceof check
        -            return Object.prototype.toString.call(obj) === '[object ' + type + ']';
        -        },
        -
        -        _initXHRData: function (options) {
        -            var that = this,
        -                formData,
        -                file = options.files[0],
        -                // Ignore non-multipart setting if not supported:
        -                multipart = options.multipart || !$.support.xhrFileUpload,
        -                paramName = $.type(options.paramName) === 'array' ?
        -                    options.paramName[0] : options.paramName;
        -            options.headers = $.extend({}, options.headers);
        -            if (options.contentRange) {
        -                options.headers['Content-Range'] = options.contentRange;
        -            }
        -            if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
        -                options.headers['Content-Disposition'] = 'attachment; filename="' +
        -                    encodeURI(file.name) + '"';
        -            }
        -            if (!multipart) {
        -                options.contentType = file.type || 'application/octet-stream';
        -                options.data = options.blob || file;
        -            } else if ($.support.xhrFormDataFileUpload) {
        -                if (options.postMessage) {
        -                    // window.postMessage does not allow sending FormData
        -                    // objects, so we just add the File/Blob objects to
        -                    // the formData array and let the postMessage window
        -                    // create the FormData object out of this array:
        -                    formData = this._getFormData(options);
        -                    if (options.blob) {
        -                        formData.push({
        -                            name: paramName,
        -                            value: options.blob
        -                        });
        -                    } else {
        -                        $.each(options.files, function (index, file) {
        -                            formData.push({
        -                                name: ($.type(options.paramName) === 'array' &&
        -                                    options.paramName[index]) || paramName,
        -                                value: file
        -                            });
        -                        });
        -                    }
        -                } else {
        -                    if (that._isInstanceOf('FormData', options.formData)) {
        -                        formData = options.formData;
        -                    } else {
        -                        formData = new FormData();
        -                        $.each(this._getFormData(options), function (index, field) {
        -                            formData.append(field.name, field.value);
        -                        });
        -                    }
        -                    if (options.blob) {
        -                        formData.append(paramName, options.blob, file.name);
        -                    } else {
        -                        $.each(options.files, function (index, file) {
        -                            // This check allows the tests to run with
        -                            // dummy objects:
        -                            if (that._isInstanceOf('File', file) ||
        -                                    that._isInstanceOf('Blob', file)) {
        -                                formData.append(
        -                                    ($.type(options.paramName) === 'array' &&
        -                                        options.paramName[index]) || paramName,
        -                                    file,
        -                                    file.uploadName || file.name
        -                                );
        -                            }
        -                        });
        -                    }
        -                }
        -                options.data = formData;
        -            }
        -            // Blob reference is not needed anymore, free memory:
        -            options.blob = null;
        -        },
        -
        -        _initIframeSettings: function (options) {
        -            var targetHost = $('<a></a>').prop('href', options.url).prop('host');
        -            // Setting the dataType to iframe enables the iframe transport:
        -            options.dataType = 'iframe ' + (options.dataType || '');
        -            // The iframe transport accepts a serialized array as form data:
        -            options.formData = this._getFormData(options);
        -            // Add redirect url to form data on cross-domain uploads:
        -            if (options.redirect && targetHost && targetHost !== location.host) {
        -                options.formData.push({
        -                    name: options.redirectParamName || 'redirect',
        -                    value: options.redirect
        -                });
        -            }
        -        },
        -
        -        _initDataSettings: function (options) {
        -            if (this._isXHRUpload(options)) {
        -                if (!this._chunkedUpload(options, true)) {
        -                    if (!options.data) {
        -                        this._initXHRData(options);
        -                    }
        -                    this._initProgressListener(options);
        -                }
        -                if (options.postMessage) {
        -                    // Setting the dataType to postmessage enables the
        -                    // postMessage transport:
        -                    options.dataType = 'postmessage ' + (options.dataType || '');
        -                }
        -            } else {
        -                this._initIframeSettings(options);
        -            }
        -        },
        -
        -        _getParamName: function (options) {
        -            var fileInput = $(options.fileInput),
        -                paramName = options.paramName;
        -            if (!paramName) {
        -                paramName = [];
        -                fileInput.each(function () {
        -                    var input = $(this),
        -                        name = input.prop('name') || 'files[]',
        -                        i = (input.prop('files') || [1]).length;
        -                    while (i) {
        -                        paramName.push(name);
        -                        i -= 1;
        -                    }
        -                });
        -                if (!paramName.length) {
        -                    paramName = [fileInput.prop('name') || 'files[]'];
        -                }
        -            } else if (!$.isArray(paramName)) {
        -                paramName = [paramName];
        -            }
        -            return paramName;
        -        },
        -
        -        _initFormSettings: function (options) {
        -            // Retrieve missing options from the input field and the
        -            // associated form, if available:
        -            if (!options.form || !options.form.length) {
        -                options.form = $(options.fileInput.prop('form'));
        -                // If the given file input doesn't have an associated form,
        -                // use the default widget file input's form:
        -                if (!options.form.length) {
        -                    options.form = $(this.options.fileInput.prop('form'));
        -                }
        -            }
        -            options.paramName = this._getParamName(options);
        -            if (!options.url) {
        -                options.url = options.form.prop('action') || location.href;
        -            }
        -            // The HTTP request method must be "POST" or "PUT":
        -            options.type = (options.type ||
        -                ($.type(options.form.prop('method')) === 'string' &&
        -                    options.form.prop('method')) || ''
        -                ).toUpperCase();
        -            if (options.type !== 'POST' && options.type !== 'PUT' &&
        -                    options.type !== 'PATCH') {
        -                options.type = 'POST';
        -            }
        -            if (!options.formAcceptCharset) {
        -                options.formAcceptCharset = options.form.attr('accept-charset');
        -            }
        -        },
        -
        -        _getAJAXSettings: function (data) {
        -            var options = $.extend({}, this.options, data);
        -            this._initFormSettings(options);
        -            this._initDataSettings(options);
        -            return options;
        -        },
        -
        -        // jQuery 1.6 doesn't provide .state(),
        -        // while jQuery 1.8+ removed .isRejected() and .isResolved():
        -        _getDeferredState: function (deferred) {
        -            if (deferred.state) {
        -                return deferred.state();
        -            }
        -            if (deferred.isResolved()) {
        -                return 'resolved';
        -            }
        -            if (deferred.isRejected()) {
        -                return 'rejected';
        -            }
        -            return 'pending';
        -        },
        -
        -        // Maps jqXHR callbacks to the equivalent
        -        // methods of the given Promise object:
        -        _enhancePromise: function (promise) {
        -            promise.success = promise.done;
        -            promise.error = promise.fail;
        -            promise.complete = promise.always;
        -            return promise;
        -        },
        -
        -        // Creates and returns a Promise object enhanced with
        -        // the jqXHR methods abort, success, error and complete:
        -        _getXHRPromise: function (resolveOrReject, context, args) {
        -            var dfd = $.Deferred(),
        -                promise = dfd.promise();
        -            context = context || this.options.context || promise;
        -            if (resolveOrReject === true) {
        -                dfd.resolveWith(context, args);
        -            } else if (resolveOrReject === false) {
        -                dfd.rejectWith(context, args);
        -            }
        -            promise.abort = dfd.promise;
        -            return this._enhancePromise(promise);
        -        },
        -
        -        // Adds convenience methods to the data callback argument:
        -        _addConvenienceMethods: function (e, data) {
        -            var that = this,
        -                getPromise = function (args) {
        -                    return $.Deferred().resolveWith(that, args).promise();
        -                };
        -            data.process = function (resolveFunc, rejectFunc) {
        -                if (resolveFunc || rejectFunc) {
        -                    data._processQueue = this._processQueue =
        -                        (this._processQueue || getPromise([this])).pipe(
        -                            function () {
        -                                if (data.errorThrown) {
        -                                    return $.Deferred()
        -                                        .rejectWith(that, [data]).promise();
        -                                }
        -                                return getPromise(arguments);
        -                            }
        -                        ).pipe(resolveFunc, rejectFunc);
        -                }
        -                return this._processQueue || getPromise([this]);
        -            };
        -            data.submit = function () {
        -                if (this.state() !== 'pending') {
        -                    data.jqXHR = this.jqXHR =
        -                        (that._trigger(
        -                            'submit',
        -                            $.Event('submit', {delegatedEvent: e}),
        -                            this
        -                        ) !== false) && that._onSend(e, this);
        -                }
        -                return this.jqXHR || that._getXHRPromise();
        -            };
        -            data.abort = function () {
        -                if (this.jqXHR) {
        -                    return this.jqXHR.abort();
        -                }
        -                this.errorThrown = 'abort';
        -                that._trigger('fail', null, this);
        -                return that._getXHRPromise(false);
        -            };
        -            data.state = function () {
        -                if (this.jqXHR) {
        -                    return that._getDeferredState(this.jqXHR);
        -                }
        -                if (this._processQueue) {
        -                    return that._getDeferredState(this._processQueue);
        -                }
        -            };
        -            data.processing = function () {
        -                return !this.jqXHR && this._processQueue && that
        -                    ._getDeferredState(this._processQueue) === 'pending';
        -            };
        -            data.progress = function () {
        -                return this._progress;
        -            };
        -            data.response = function () {
        -                return this._response;
        -            };
        -        },
        -
        -        // Parses the Range header from the server response
        -        // and returns the uploaded bytes:
        -        _getUploadedBytes: function (jqXHR) {
        -            var range = jqXHR.getResponseHeader('Range'),
        -                parts = range && range.split('-'),
        -                upperBytesPos = parts && parts.length > 1 &&
        -                    parseInt(parts[1], 10);
        -            return upperBytesPos && upperBytesPos + 1;
        -        },
        -
        -        // Uploads a file in multiple, sequential requests
        -        // by splitting the file up in multiple blob chunks.
        -        // If the second parameter is true, only tests if the file
        -        // should be uploaded in chunks, but does not invoke any
        -        // upload requests:
        -        _chunkedUpload: function (options, testOnly) {
        -            options.uploadedBytes = options.uploadedBytes || 0;
        -            var that = this,
        -                file = options.files[0],
        -                fs = file.size,
        -                ub = options.uploadedBytes,
        -                mcs = options.maxChunkSize || fs,
        -                slice = this._blobSlice,
        -                dfd = $.Deferred(),
        -                promise = dfd.promise(),
        -                jqXHR,
        -                upload;
        -            if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
        -                    options.data) {
        -                return false;
        -            }
        -            if (testOnly) {
        -                return true;
        -            }
        -            if (ub >= fs) {
        -                file.error = options.i18n('uploadedBytes');
        -                return this._getXHRPromise(
        -                    false,
        -                    options.context,
        -                    [null, 'error', file.error]
        -                );
        -            }
        -            // The chunk upload method:
        -            upload = function () {
        -                // Clone the options object for each chunk upload:
        -                var o = $.extend({}, options),
        -                    currentLoaded = o._progress.loaded;
        -                o.blob = slice.call(
        -                    file,
        -                    ub,
        -                    ub + mcs,
        -                    file.type
        -                );
        -                // Store the current chunk size, as the blob itself
        -                // will be dereferenced after data processing:
        -                o.chunkSize = o.blob.size;
        -                // Expose the chunk bytes position range:
        -                o.contentRange = 'bytes ' + ub + '-' +
        -                    (ub + o.chunkSize - 1) + '/' + fs;
        -                // Process the upload data (the blob and potential form data):
        -                that._initXHRData(o);
        -                // Add progress listeners for this chunk upload:
        -                that._initProgressListener(o);
        -                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||
        -                        that._getXHRPromise(false, o.context))
        -                    .done(function (result, textStatus, jqXHR) {
        -                        ub = that._getUploadedBytes(jqXHR) ||
        -                            (ub + o.chunkSize);
        -                        // Create a progress event if no final progress event
        -                        // with loaded equaling total has been triggered
        -                        // for this chunk:
        -                        if (currentLoaded + o.chunkSize - o._progress.loaded) {
        -                            that._onProgress($.Event('progress', {
        -                                lengthComputable: true,
        -                                loaded: ub - o.uploadedBytes,
        -                                total: ub - o.uploadedBytes
        -                            }), o);
        -                        }
        -                        options.uploadedBytes = o.uploadedBytes = ub;
        -                        o.result = result;
        -                        o.textStatus = textStatus;
        -                        o.jqXHR = jqXHR;
        -                        that._trigger('chunkdone', null, o);
        -                        that._trigger('chunkalways', null, o);
        -                        if (ub < fs) {
        -                            // File upload not yet complete,
        -                            // continue with the next chunk:
        -                            upload();
        -                        } else {
        -                            dfd.resolveWith(
        -                                o.context,
        -                                [result, textStatus, jqXHR]
        -                            );
        -                        }
        -                    })
        -                    .fail(function (jqXHR, textStatus, errorThrown) {
        -                        o.jqXHR = jqXHR;
        -                        o.textStatus = textStatus;
        -                        o.errorThrown = errorThrown;
        -                        that._trigger('chunkfail', null, o);
        -                        that._trigger('chunkalways', null, o);
        -                        dfd.rejectWith(
        -                            o.context,
        -                            [jqXHR, textStatus, errorThrown]
        -                        );
        -                    });
        -            };
        -            this._enhancePromise(promise);
        -            promise.abort = function () {
        -                return jqXHR.abort();
        -            };
        -            upload();
        -            return promise;
        -        },
        -
        -        _beforeSend: function (e, data) {
        -            if (this._active === 0) {
        -                // the start callback is triggered when an upload starts
        -                // and no other uploads are currently running,
        -                // equivalent to the global ajaxStart event:
        -                this._trigger('start');
        -                // Set timer for global bitrate progress calculation:
        -                this._bitrateTimer = new this._BitrateTimer();
        -                // Reset the global progress values:
        -                this._progress.loaded = this._progress.total = 0;
        -                this._progress.bitrate = 0;
        -            }
        -            // Make sure the container objects for the .response() and
        -            // .progress() methods on the data object are available
        -            // and reset to their initial state:
        -            this._initResponseObject(data);
        -            this._initProgressObject(data);
        -            data._progress.loaded = data.loaded = data.uploadedBytes || 0;
        -            data._progress.total = data.total = this._getTotal(data.files) || 1;
        -            data._progress.bitrate = data.bitrate = 0;
        -            this._active += 1;
        -            // Initialize the global progress values:
        -            this._progress.loaded += data.loaded;
        -            this._progress.total += data.total;
        -        },
        -
        -        _onDone: function (result, textStatus, jqXHR, options) {
        -            var total = options._progress.total,
        -                response = options._response;
        -            if (options._progress.loaded < total) {
        -                // Create a progress event if no final progress event
        -                // with loaded equaling total has been triggered:
        -                this._onProgress($.Event('progress', {
        -                    lengthComputable: true,
        -                    loaded: total,
        -                    total: total
        -                }), options);
        -            }
        -            response.result = options.result = result;
        -            response.textStatus = options.textStatus = textStatus;
        -            response.jqXHR = options.jqXHR = jqXHR;
        -            this._trigger('done', null, options);
        -        },
        -
        -        _onFail: function (jqXHR, textStatus, errorThrown, options) {
        -            var response = options._response;
        -            if (options.recalculateProgress) {
        -                // Remove the failed (error or abort) file upload from
        -                // the global progress calculation:
        -                this._progress.loaded -= options._progress.loaded;
        -                this._progress.total -= options._progress.total;
        -            }
        -            response.jqXHR = options.jqXHR = jqXHR;
        -            response.textStatus = options.textStatus = textStatus;
        -            response.errorThrown = options.errorThrown = errorThrown;
        -            this._trigger('fail', null, options);
        -        },
        -
        -        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {
        -            // jqXHRorResult, textStatus and jqXHRorError are added to the
        -            // options object via done and fail callbacks
        -            this._trigger('always', null, options);
        -        },
        -
        -        _onSend: function (e, data) {
        -            if (!data.submit) {
        -                this._addConvenienceMethods(e, data);
        -            }
        -            var that = this,
        -                jqXHR,
        -                aborted,
        -                slot,
        -                pipe,
        -                options = that._getAJAXSettings(data),
        -                send = function () {
        -                    that._sending += 1;
        -                    // Set timer for bitrate progress calculation:
        -                    options._bitrateTimer = new that._BitrateTimer();
        -                    jqXHR = jqXHR || (
        -                        ((aborted || that._trigger(
        -                            'send',
        -                            $.Event('send', {delegatedEvent: e}),
        -                            options
        -                        ) === false) &&
        -                        that._getXHRPromise(false, options.context, aborted)) ||
        -                        that._chunkedUpload(options) || $.ajax(options)
        -                    ).done(function (result, textStatus, jqXHR) {
        -                        that._onDone(result, textStatus, jqXHR, options);
        -                    }).fail(function (jqXHR, textStatus, errorThrown) {
        -                        that._onFail(jqXHR, textStatus, errorThrown, options);
        -                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {
        -                        that._onAlways(
        -                            jqXHRorResult,
        -                            textStatus,
        -                            jqXHRorError,
        -                            options
        -                        );
        -                        that._sending -= 1;
        -                        that._active -= 1;
        -                        if (options.limitConcurrentUploads &&
        -                                options.limitConcurrentUploads > that._sending) {
        -                            // Start the next queued upload,
        -                            // that has not been aborted:
        -                            var nextSlot = that._slots.shift();
        -                            while (nextSlot) {
        -                                if (that._getDeferredState(nextSlot) === 'pending') {
        -                                    nextSlot.resolve();
        -                                    break;
        -                                }
        -                                nextSlot = that._slots.shift();
        -                            }
        -                        }
        -                        if (that._active === 0) {
        -                            // The stop callback is triggered when all uploads have
        -                            // been completed, equivalent to the global ajaxStop event:
        -                            that._trigger('stop');
        -                        }
        -                    });
        -                    return jqXHR;
        -                };
        -            this._beforeSend(e, options);
        -            if (this.options.sequentialUploads ||
        -                    (this.options.limitConcurrentUploads &&
        -                    this.options.limitConcurrentUploads <= this._sending)) {
        -                if (this.options.limitConcurrentUploads > 1) {
        -                    slot = $.Deferred();
        -                    this._slots.push(slot);
        -                    pipe = slot.pipe(send);
        -                } else {
        -                    this._sequence = this._sequence.pipe(send, send);
        -                    pipe = this._sequence;
        -                }
        -                // Return the piped Promise object, enhanced with an abort method,
        -                // which is delegated to the jqXHR object of the current upload,
        -                // and jqXHR callbacks mapped to the equivalent Promise methods:
        -                pipe.abort = function () {
        -                    aborted = [undefined, 'abort', 'abort'];
        -                    if (!jqXHR) {
        -                        if (slot) {
        -                            slot.rejectWith(options.context, aborted);
        -                        }
        -                        return send();
        -                    }
        -                    return jqXHR.abort();
        -                };
        -                return this._enhancePromise(pipe);
        -            }
        -            return send();
        -        },
        -
        -        _onAdd: function (e, data) {
        -            var that = this,
        -                result = true,
        -                options = $.extend({}, this.options, data),
        -                files = data.files,
        -                filesLength = files.length,
        -                limit = options.limitMultiFileUploads,
        -                limitSize = options.limitMultiFileUploadSize,
        -                overhead = options.limitMultiFileUploadSizeOverhead,
        -                batchSize = 0,
        -                paramName = this._getParamName(options),
        -                paramNameSet,
        -                paramNameSlice,
        -                fileSet,
        -                i,
        -                j = 0;
        -            if (!filesLength) {
        -                return false;
        -            }
        -            if (limitSize && files[0].size === undefined) {
        -                limitSize = undefined;
        -            }
        -            if (!(options.singleFileUploads || limit || limitSize) ||
        -                    !this._isXHRUpload(options)) {
        -                fileSet = [files];
        -                paramNameSet = [paramName];
        -            } else if (!(options.singleFileUploads || limitSize) && limit) {
        -                fileSet = [];
        -                paramNameSet = [];
        -                for (i = 0; i < filesLength; i += limit) {
        -                    fileSet.push(files.slice(i, i + limit));
        -                    paramNameSlice = paramName.slice(i, i + limit);
        -                    if (!paramNameSlice.length) {
        -                        paramNameSlice = paramName;
        -                    }
        -                    paramNameSet.push(paramNameSlice);
        -                }
        -            } else if (!options.singleFileUploads && limitSize) {
        -                fileSet = [];
        -                paramNameSet = [];
        -                for (i = 0; i < filesLength; i = i + 1) {
        -                    batchSize += files[i].size + overhead;
        -                    if (i + 1 === filesLength ||
        -                            ((batchSize + files[i + 1].size + overhead) > limitSize) ||
        -                            (limit && i + 1 - j >= limit)) {
        -                        fileSet.push(files.slice(j, i + 1));
        -                        paramNameSlice = paramName.slice(j, i + 1);
        -                        if (!paramNameSlice.length) {
        -                            paramNameSlice = paramName;
        -                        }
        -                        paramNameSet.push(paramNameSlice);
        -                        j = i + 1;
        -                        batchSize = 0;
        -                    }
        -                }
        -            } else {
        -                paramNameSet = paramName;
        -            }
        -            data.originalFiles = files;
        -            $.each(fileSet || files, function (index, element) {
        -                var newData = $.extend({}, data);
        -                newData.files = fileSet ? element : [element];
        -                newData.paramName = paramNameSet[index];
        -                that._initResponseObject(newData);
        -                that._initProgressObject(newData);
        -                that._addConvenienceMethods(e, newData);
        -                result = that._trigger(
        -                    'add',
        -                    $.Event('add', {delegatedEvent: e}),
        -                    newData
        -                );
        -                return result;
        -            });
        -            return result;
        -        },
        -
        -        _replaceFileInput: function (data) {
        -            var input = data.fileInput,
        -                inputClone = input.clone(true);
        -            // Add a reference for the new cloned file input to the data argument:
        -            data.fileInputClone = inputClone;
        -            $('<form></form>').append(inputClone)[0].reset();
        -            // Detaching allows to insert the fileInput on another form
        -            // without loosing the file input value:
        -            input.after(inputClone).detach();
        -            // Avoid memory leaks with the detached file input:
        -            $.cleanData(input.unbind('remove'));
        -            // Replace the original file input element in the fileInput
        -            // elements set with the clone, which has been copied including
        -            // event handlers:
        -            this.options.fileInput = this.options.fileInput.map(function (i, el) {
        -                if (el === input[0]) {
        -                    return inputClone[0];
        -                }
        -                return el;
        -            });
        -            // If the widget has been initialized on the file input itself,
        -            // override this.element with the file input clone:
        -            if (input[0] === this.element[0]) {
        -                this.element = inputClone;
        -            }
        -        },
        -
        -        _handleFileTreeEntry: function (entry, path) {
        -            var that = this,
        -                dfd = $.Deferred(),
        -                errorHandler = function (e) {
        -                    if (e && !e.entry) {
        -                        e.entry = entry;
        -                    }
        -                    // Since $.when returns immediately if one
        -                    // Deferred is rejected, we use resolve instead.
        -                    // This allows valid files and invalid items
        -                    // to be returned together in one set:
        -                    dfd.resolve([e]);
        -                },
        -                successHandler = function (entries) {
        -                    that._handleFileTreeEntries(
        -                        entries,
        -                        path + entry.name + '/'
        -                    ).done(function (files) {
        -                        dfd.resolve(files);
        -                    }).fail(errorHandler);
        -                },
        -                readEntries = function () {
        -                    dirReader.readEntries(function (results) {
        -                        if (!results.length) {
        -                            successHandler(entries);
        -                        } else {
        -                            entries = entries.concat(results);
        -                            readEntries();
        -                        }
        -                    }, errorHandler);
        -                },
        -                dirReader, entries = [];
        -            path = path || '';
        -            if (entry.isFile) {
        -                if (entry._file) {
        -                    // Workaround for Chrome bug #149735
        -                    entry._file.relativePath = path;
        -                    dfd.resolve(entry._file);
        -                } else {
        -                    entry.file(function (file) {
        -                        file.relativePath = path;
        -                        dfd.resolve(file);
        -                    }, errorHandler);
        -                }
        -            } else if (entry.isDirectory) {
        -                dirReader = entry.createReader();
        -                readEntries();
        -            } else {
        -                // Return an empy list for file system items
        -                // other than files or directories:
        -                dfd.resolve([]);
        -            }
        -            return dfd.promise();
        -        },
        -
        -        _handleFileTreeEntries: function (entries, path) {
        -            var that = this;
        -            return $.when.apply(
        -                $,
        -                $.map(entries, function (entry) {
        -                    return that._handleFileTreeEntry(entry, path);
        -                })
        -            ).pipe(function () {
        -                return Array.prototype.concat.apply(
        -                    [],
        -                    arguments
        -                );
        -            });
        -        },
        -
        -        _getDroppedFiles: function (dataTransfer) {
        -            dataTransfer = dataTransfer || {};
        -            var items = dataTransfer.items;
        -            if (items && items.length && (items[0].webkitGetAsEntry ||
        -                    items[0].getAsEntry)) {
        -                return this._handleFileTreeEntries(
        -                    $.map(items, function (item) {
        -                        var entry;
        -                        if (item.webkitGetAsEntry) {
        -                            entry = item.webkitGetAsEntry();
        -                            if (entry) {
        -                                // Workaround for Chrome bug #149735:
        -                                entry._file = item.getAsFile();
        -                            }
        -                            return entry;
        -                        }
        -                        return item.getAsEntry();
        -                    })
        -                );
        -            }
        -            return $.Deferred().resolve(
        -                $.makeArray(dataTransfer.files)
        -            ).promise();
        -        },
        -
        -        _getSingleFileInputFiles: function (fileInput) {
        -            fileInput = $(fileInput);
        -            var entries = fileInput.prop('webkitEntries') ||
        -                    fileInput.prop('entries'),
        -                files,
        -                value;
        -            if (entries && entries.length) {
        -                return this._handleFileTreeEntries(entries);
        -            }
        -            files = $.makeArray(fileInput.prop('files'));
        -            if (!files.length) {
        -                value = fileInput.prop('value');
        -                if (!value) {
        -                    return $.Deferred().resolve([]).promise();
        -                }
        -                // If the files property is not available, the browser does not
        -                // support the File API and we add a pseudo File object with
        -                // the input value as name with path information removed:
        -                files = [{name: value.replace(/^.*\\/, '')}];
        -            } else if (files[0].name === undefined && files[0].fileName) {
        -                // File normalization for Safari 4 and Firefox 3:
        -                $.each(files, function (index, file) {
        -                    file.name = file.fileName;
        -                    file.size = file.fileSize;
        -                });
        -            }
        -            return $.Deferred().resolve(files).promise();
        -        },
        -
        -        _getFileInputFiles: function (fileInput) {
        -            if (!(fileInput instanceof $) || fileInput.length === 1) {
        -                return this._getSingleFileInputFiles(fileInput);
        -            }
        -            return $.when.apply(
        -                $,
        -                $.map(fileInput, this._getSingleFileInputFiles)
        -            ).pipe(function () {
        -                return Array.prototype.concat.apply(
        -                    [],
        -                    arguments
        -                );
        -            });
        -        },
        -
        -        _onChange: function (e) {
        -            var that = this,
        -                data = {
        -                    fileInput: $(e.target),
        -                    form: $(e.target.form)
        -                };
        -            this._getFileInputFiles(data.fileInput).always(function (files) {
        -                data.files = files;
        -                if (that.options.replaceFileInput) {
        -                    that._replaceFileInput(data);
        -                }
        -                if (that._trigger(
        -                        'change',
        -                        $.Event('change', {delegatedEvent: e}),
        -                        data
        -                    ) !== false) {
        -                    that._onAdd(e, data);
        -                }
        -            });
        -        },
        -
        -        _onPaste: function (e) {
        -            var items = e.originalEvent && e.originalEvent.clipboardData &&
        -                    e.originalEvent.clipboardData.items,
        -                data = {files: []};
        -            if (items && items.length) {
        -                $.each(items, function (index, item) {
        -                    var file = item.getAsFile && item.getAsFile();
        -                    if (file) {
        -                        data.files.push(file);
        -                    }
        -                });
        -                if (this._trigger(
        -                        'paste',
        -                        $.Event('paste', {delegatedEvent: e}),
        -                        data
        -                    ) !== false) {
        -                    this._onAdd(e, data);
        -                }
        -            }
        -        },
        -
        -        _onDrop: function (e) {
        -            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
        -            var that = this,
        -                dataTransfer = e.dataTransfer,
        -                data = {};
        -            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
        -                e.preventDefault();
        -                this._getDroppedFiles(dataTransfer).always(function (files) {
        -                    data.files = files;
        -                    if (that._trigger(
        -                            'drop',
        -                            $.Event('drop', {delegatedEvent: e}),
        -                            data
        -                        ) !== false) {
        -                        that._onAdd(e, data);
        -                    }
        -                });
        -            }
        -        },
        -
        -        _onDragOver: getDragHandler('dragover'),
        -
        -        _onDragEnter: getDragHandler('dragenter'),
        -
        -        _onDragLeave: getDragHandler('dragleave'),
        -
        -        _initEventHandlers: function () {
        -            if (this._isXHRUpload(this.options)) {
        -                this._on(this.options.dropZone, {
        -                    dragover: this._onDragOver,
        -                    drop: this._onDrop,
        -                    // event.preventDefault() on dragenter is required for IE10+:
        -                    dragenter: this._onDragEnter,
        -                    // dragleave is not required, but added for completeness:
        -                    dragleave: this._onDragLeave
        -                });
        -                this._on(this.options.pasteZone, {
        -                    paste: this._onPaste
        -                });
        -            }
        -            if ($.support.fileInput) {
        -                this._on(this.options.fileInput, {
        -                    change: this._onChange
        -                });
        -            }
        -        },
        -
        -        _destroyEventHandlers: function () {
        -            this._off(this.options.dropZone, 'dragenter dragleave dragover drop');
        -            this._off(this.options.pasteZone, 'paste');
        -            this._off(this.options.fileInput, 'change');
        -        },
        -
        -        _setOption: function (key, value) {
        -            var reinit = $.inArray(key, this._specialOptions) !== -1;
        -            if (reinit) {
        -                this._destroyEventHandlers();
        -            }
        -            this._super(key, value);
        -            if (reinit) {
        -                this._initSpecialOptions();
        -                this._initEventHandlers();
        -            }
        -        },
        -
        -        _initSpecialOptions: function () {
        -            var options = this.options;
        -            if (options.fileInput === undefined) {
        -                options.fileInput = this.element.is('input[type="file"]') ?
        -                        this.element : this.element.find('input[type="file"]');
        -            } else if (!(options.fileInput instanceof $)) {
        -                options.fileInput = $(options.fileInput);
        -            }
        -            if (!(options.dropZone instanceof $)) {
        -                options.dropZone = $(options.dropZone);
        -            }
        -            if (!(options.pasteZone instanceof $)) {
        -                options.pasteZone = $(options.pasteZone);
        -            }
        -        },
        -
        -        _getRegExp: function (str) {
        -            var parts = str.split('/'),
        -                modifiers = parts.pop();
        -            parts.shift();
        -            return new RegExp(parts.join('/'), modifiers);
        -        },
        -
        -        _isRegExpOption: function (key, value) {
        -            return key !== 'url' && $.type(value) === 'string' &&
        -                /^\/.*\/[igm]{0,3}$/.test(value);
        -        },
        -
        -        _initDataAttributes: function () {
        -            var that = this,
        -                options = this.options,
        -                data = this.element.data();
        -            // Initialize options set via HTML5 data-attributes:
        -            $.each(
        -                this.element[0].attributes,
        -                function (index, attr) {
        -                    var key = attr.name.toLowerCase(),
        -                        value;
        -                    if (/^data-/.test(key)) {
        -                        // Convert hyphen-ated key to camelCase:
        -                        key = key.slice(5).replace(/-[a-z]/g, function (str) {
        -                            return str.charAt(1).toUpperCase();
        -                        });
        -                        value = data[key];
        -                        if (that._isRegExpOption(key, value)) {
        -                            value = that._getRegExp(value);
        -                        }
        -                        options[key] = value;
        -                    }
        -                }
        -            );
        -        },
        -
        -        _create: function () {
        -            this._initDataAttributes();
        -            this._initSpecialOptions();
        -            this._slots = [];
        -            this._sequence = this._getXHRPromise(true);
        -            this._sending = this._active = 0;
        -            this._initProgressObject(this);
        -            this._initEventHandlers();
        -        },
        -
        -        // This method is exposed to the widget API and allows to query
        -        // the number of active uploads:
        -        active: function () {
        -            return this._active;
        -        },
        -
        -        // This method is exposed to the widget API and allows to query
        -        // the widget upload progress.
        -        // It returns an object with loaded, total and bitrate properties
        -        // for the running uploads:
        -        progress: function () {
        -            return this._progress;
        -        },
        -
        -        // This method is exposed to the widget API and allows adding files
        -        // using the fileupload API. The data parameter accepts an object which
        -        // must have a files property and can contain additional options:
        -        // .fileupload('add', {files: filesList});
        -        add: function (data) {
        -            var that = this;
        -            if (!data || this.options.disabled) {
        -                return;
        -            }
        -            if (data.fileInput && !data.files) {
        -                this._getFileInputFiles(data.fileInput).always(function (files) {
        -                    data.files = files;
        -                    that._onAdd(null, data);
        -                });
        -            } else {
        -                data.files = $.makeArray(data.files);
        -                this._onAdd(null, data);
        -            }
        -        },
        -
        -        // This method is exposed to the widget API and allows sending files
        -        // using the fileupload API. The data parameter accepts an object which
        -        // must have a files or fileInput property and can contain additional options:
        -        // .fileupload('send', {files: filesList});
        -        // The method returns a Promise object for the file upload call.
        -        send: function (data) {
        -            if (data && !this.options.disabled) {
        -                if (data.fileInput && !data.files) {
        -                    var that = this,
        -                        dfd = $.Deferred(),
        -                        promise = dfd.promise(),
        -                        jqXHR,
        -                        aborted;
        -                    promise.abort = function () {
        -                        aborted = true;
        -                        if (jqXHR) {
        -                            return jqXHR.abort();
        -                        }
        -                        dfd.reject(null, 'abort', 'abort');
        -                        return promise;
        -                    };
        -                    this._getFileInputFiles(data.fileInput).always(
        -                        function (files) {
        -                            if (aborted) {
        -                                return;
        -                            }
        -                            if (!files.length) {
        -                                dfd.reject();
        -                                return;
        -                            }
        -                            data.files = files;
        -                            jqXHR = that._onSend(null, data);
        -                            jqXHR.then(
        -                                function (result, textStatus, jqXHR) {
        -                                    dfd.resolve(result, textStatus, jqXHR);
        -                                },
        -                                function (jqXHR, textStatus, errorThrown) {
        -                                    dfd.reject(jqXHR, textStatus, errorThrown);
        -                                }
        -                            );
        -                        }
        -                    );
        -                    return this._enhancePromise(promise);
        -                }
        -                data.files = $.makeArray(data.files);
        -                if (data.files.length) {
        -                    return this._onSend(null, data);
        -                }
        -            }
        -            return this._getXHRPromise(false, data && data.context);
        -        }
        -
        -    });
        -
        -}));
        -
        -/*!
        - * Bootstrap v3.3.6 (http://getbootstrap.com)
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under the MIT license
        - */
        -
        -if (typeof jQuery === 'undefined') {
        -  throw new Error('Bootstrap\'s JavaScript requires jQuery')
        -}
        -
        -+function ($) {
        -  'use strict';
        -  var version = $.fn.jquery.split(' ')[0].split('.')
        -  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {
        -    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
        -  }
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: transition.js v3.3.6
        - * http://getbootstrap.com/javascript/#transitions
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
        -  // ============================================================
        -
        -  function transitionEnd() {
        -    var el = document.createElement('bootstrap')
        -
        -    var transEndEventNames = {
        -      WebkitTransition : 'webkitTransitionEnd',
        -      MozTransition    : 'transitionend',
        -      OTransition      : 'oTransitionEnd otransitionend',
        -      transition       : 'transitionend'
        -    }
        -
        -    for (var name in transEndEventNames) {
        -      if (el.style[name] !== undefined) {
        -        return { end: transEndEventNames[name] }
        -      }
        -    }
        -
        -    return false // explicit for ie8 (  ._.)
        -  }
        -
        -  // http://blog.alexmaccaw.com/css-transitions
        -  $.fn.emulateTransitionEnd = function (duration) {
        -    var called = false
        -    var $el = this
        -    $(this).one('bsTransitionEnd', function () { called = true })
        -    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
        -    setTimeout(callback, duration)
        -    return this
        -  }
        -
        -  $(function () {
        -    $.support.transition = transitionEnd()
        -
        -    if (!$.support.transition) return
        -
        -    $.event.special.bsTransitionEnd = {
        -      bindType: $.support.transition.end,
        -      delegateType: $.support.transition.end,
        -      handle: function (e) {
        -        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
        -      }
        -    }
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: alert.js v3.3.6
        - * http://getbootstrap.com/javascript/#alerts
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // ALERT CLASS DEFINITION
        -  // ======================
        -
        -  var dismiss = '[data-dismiss="alert"]'
        -  var Alert   = function (el) {
        -    $(el).on('click', dismiss, this.close)
        -  }
        -
        -  Alert.VERSION = '3.3.6'
        -
        -  Alert.TRANSITION_DURATION = 150
        -
        -  Alert.prototype.close = function (e) {
        -    var $this    = $(this)
        -    var selector = $this.attr('data-target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    var $parent = $(selector)
        -
        -    if (e) e.preventDefault()
        -
        -    if (!$parent.length) {
        -      $parent = $this.closest('.alert')
        -    }
        -
        -    $parent.trigger(e = $.Event('close.bs.alert'))
        -
        -    if (e.isDefaultPrevented()) return
        -
        -    $parent.removeClass('in')
        -
        -    function removeElement() {
        -      // detach from parent, fire event then clean up data
        -      $parent.detach().trigger('closed.bs.alert').remove()
        -    }
        -
        -    $.support.transition && $parent.hasClass('fade') ?
        -      $parent
        -        .one('bsTransitionEnd', removeElement)
        -        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
        -      removeElement()
        -  }
        -
        -
        -  // ALERT PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.alert')
        -
        -      if (!data) $this.data('bs.alert', (data = new Alert(this)))
        -      if (typeof option == 'string') data[option].call($this)
        -    })
        -  }
        -
        -  var old = $.fn.alert
        -
        -  $.fn.alert             = Plugin
        -  $.fn.alert.Constructor = Alert
        -
        -
        -  // ALERT NO CONFLICT
        -  // =================
        -
        -  $.fn.alert.noConflict = function () {
        -    $.fn.alert = old
        -    return this
        -  }
        -
        -
        -  // ALERT DATA-API
        -  // ==============
        -
        -  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: button.js v3.3.6
        - * http://getbootstrap.com/javascript/#buttons
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // BUTTON PUBLIC CLASS DEFINITION
        -  // ==============================
        -
        -  var Button = function (element, options) {
        -    this.$element  = $(element)
        -    this.options   = $.extend({}, Button.DEFAULTS, options)
        -    this.isLoading = false
        -  }
        -
        -  Button.VERSION  = '3.3.6'
        -
        -  Button.DEFAULTS = {
        -    loadingText: 'loading...'
        -  }
        -
        -  Button.prototype.setState = function (state) {
        -    var d    = 'disabled'
        -    var $el  = this.$element
        -    var val  = $el.is('input') ? 'val' : 'html'
        -    var data = $el.data()
        -
        -    state += 'Text'
        -
        -    if (data.resetText == null) $el.data('resetText', $el[val]())
        -
        -    // push to event loop to allow forms to submit
        -    setTimeout($.proxy(function () {
        -      $el[val](data[state] == null ? this.options[state] : data[state])
        -
        -      if (state == 'loadingText') {
        -        this.isLoading = true
        -        $el.addClass(d).attr(d, d)
        -      } else if (this.isLoading) {
        -        this.isLoading = false
        -        $el.removeClass(d).removeAttr(d)
        -      }
        -    }, this), 0)
        -  }
        -
        -  Button.prototype.toggle = function () {
        -    var changed = true
        -    var $parent = this.$element.closest('[data-toggle="buttons"]')
        -
        -    if ($parent.length) {
        -      var $input = this.$element.find('input')
        -      if ($input.prop('type') == 'radio') {
        -        if ($input.prop('checked')) changed = false
        -        $parent.find('.active').removeClass('active')
        -        this.$element.addClass('active')
        -      } else if ($input.prop('type') == 'checkbox') {
        -        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
        -        this.$element.toggleClass('active')
        -      }
        -      $input.prop('checked', this.$element.hasClass('active'))
        -      if (changed) $input.trigger('change')
        -    } else {
        -      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
        -      this.$element.toggleClass('active')
        -    }
        -  }
        -
        -
        -  // BUTTON PLUGIN DEFINITION
        -  // ========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.button')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.button', (data = new Button(this, options)))
        -
        -      if (option == 'toggle') data.toggle()
        -      else if (option) data.setState(option)
        -    })
        -  }
        -
        -  var old = $.fn.button
        -
        -  $.fn.button             = Plugin
        -  $.fn.button.Constructor = Button
        -
        -
        -  // BUTTON NO CONFLICT
        -  // ==================
        -
        -  $.fn.button.noConflict = function () {
        -    $.fn.button = old
        -    return this
        -  }
        -
        -
        -  // BUTTON DATA-API
        -  // ===============
        -
        -  $(document)
        -    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        -      var $btn = $(e.target)
        -      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
        -      Plugin.call($btn, 'toggle')
        -      if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
        -    })
        -    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        -      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
        -    })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: carousel.js v3.3.6
        - * http://getbootstrap.com/javascript/#carousel
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // CAROUSEL CLASS DEFINITION
        -  // =========================
        -
        -  var Carousel = function (element, options) {
        -    this.$element    = $(element)
        -    this.$indicators = this.$element.find('.carousel-indicators')
        -    this.options     = options
        -    this.paused      = null
        -    this.sliding     = null
        -    this.interval    = null
        -    this.$active     = null
        -    this.$items      = null
        -
        -    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
        -
        -    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
        -      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
        -      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
        -  }
        -
        -  Carousel.VERSION  = '3.3.6'
        -
        -  Carousel.TRANSITION_DURATION = 600
        -
        -  Carousel.DEFAULTS = {
        -    interval: 5000,
        -    pause: 'hover',
        -    wrap: true,
        -    keyboard: true
        -  }
        -
        -  Carousel.prototype.keydown = function (e) {
        -    if (/input|textarea/i.test(e.target.tagName)) return
        -    switch (e.which) {
        -      case 37: this.prev(); break
        -      case 39: this.next(); break
        -      default: return
        -    }
        -
        -    e.preventDefault()
        -  }
        -
        -  Carousel.prototype.cycle = function (e) {
        -    e || (this.paused = false)
        -
        -    this.interval && clearInterval(this.interval)
        -
        -    this.options.interval
        -      && !this.paused
        -      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
        -
        -    return this
        -  }
        -
        -  Carousel.prototype.getItemIndex = function (item) {
        -    this.$items = item.parent().children('.item')
        -    return this.$items.index(item || this.$active)
        -  }
        -
        -  Carousel.prototype.getItemForDirection = function (direction, active) {
        -    var activeIndex = this.getItemIndex(active)
        -    var willWrap = (direction == 'prev' && activeIndex === 0)
        -                || (direction == 'next' && activeIndex == (this.$items.length - 1))
        -    if (willWrap && !this.options.wrap) return active
        -    var delta = direction == 'prev' ? -1 : 1
        -    var itemIndex = (activeIndex + delta) % this.$items.length
        -    return this.$items.eq(itemIndex)
        -  }
        -
        -  Carousel.prototype.to = function (pos) {
        -    var that        = this
        -    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
        -
        -    if (pos > (this.$items.length - 1) || pos < 0) return
        -
        -    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
        -    if (activeIndex == pos) return this.pause().cycle()
        -
        -    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
        -  }
        -
        -  Carousel.prototype.pause = function (e) {
        -    e || (this.paused = true)
        -
        -    if (this.$element.find('.next, .prev').length && $.support.transition) {
        -      this.$element.trigger($.support.transition.end)
        -      this.cycle(true)
        -    }
        -
        -    this.interval = clearInterval(this.interval)
        -
        -    return this
        -  }
        -
        -  Carousel.prototype.next = function () {
        -    if (this.sliding) return
        -    return this.slide('next')
        -  }
        -
        -  Carousel.prototype.prev = function () {
        -    if (this.sliding) return
        -    return this.slide('prev')
        -  }
        -
        -  Carousel.prototype.slide = function (type, next) {
        -    var $active   = this.$element.find('.item.active')
        -    var $next     = next || this.getItemForDirection(type, $active)
        -    var isCycling = this.interval
        -    var direction = type == 'next' ? 'left' : 'right'
        -    var that      = this
        -
        -    if ($next.hasClass('active')) return (this.sliding = false)
        -
        -    var relatedTarget = $next[0]
        -    var slideEvent = $.Event('slide.bs.carousel', {
        -      relatedTarget: relatedTarget,
        -      direction: direction
        -    })
        -    this.$element.trigger(slideEvent)
        -    if (slideEvent.isDefaultPrevented()) return
        -
        -    this.sliding = true
        -
        -    isCycling && this.pause()
        -
        -    if (this.$indicators.length) {
        -      this.$indicators.find('.active').removeClass('active')
        -      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
        -      $nextIndicator && $nextIndicator.addClass('active')
        -    }
        -
        -    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
        -    if ($.support.transition && this.$element.hasClass('slide')) {
        -      $next.addClass(type)
        -      $next[0].offsetWidth // force reflow
        -      $active.addClass(direction)
        -      $next.addClass(direction)
        -      $active
        -        .one('bsTransitionEnd', function () {
        -          $next.removeClass([type, direction].join(' ')).addClass('active')
        -          $active.removeClass(['active', direction].join(' '))
        -          that.sliding = false
        -          setTimeout(function () {
        -            that.$element.trigger(slidEvent)
        -          }, 0)
        -        })
        -        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
        -    } else {
        -      $active.removeClass('active')
        -      $next.addClass('active')
        -      this.sliding = false
        -      this.$element.trigger(slidEvent)
        -    }
        -
        -    isCycling && this.cycle()
        -
        -    return this
        -  }
        -
        -
        -  // CAROUSEL PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.carousel')
        -      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -      var action  = typeof option == 'string' ? option : options.slide
        -
        -      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
        -      if (typeof option == 'number') data.to(option)
        -      else if (action) data[action]()
        -      else if (options.interval) data.pause().cycle()
        -    })
        -  }
        -
        -  var old = $.fn.carousel
        -
        -  $.fn.carousel             = Plugin
        -  $.fn.carousel.Constructor = Carousel
        -
        -
        -  // CAROUSEL NO CONFLICT
        -  // ====================
        -
        -  $.fn.carousel.noConflict = function () {
        -    $.fn.carousel = old
        -    return this
        -  }
        -
        -
        -  // CAROUSEL DATA-API
        -  // =================
        -
        -  var clickHandler = function (e) {
        -    var href
        -    var $this   = $(this)
        -    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
        -    if (!$target.hasClass('carousel')) return
        -    var options = $.extend({}, $target.data(), $this.data())
        -    var slideIndex = $this.attr('data-slide-to')
        -    if (slideIndex) options.interval = false
        -
        -    Plugin.call($target, options)
        -
        -    if (slideIndex) {
        -      $target.data('bs.carousel').to(slideIndex)
        -    }
        -
        -    e.preventDefault()
        -  }
        -
        -  $(document)
        -    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
        -    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
        -
        -  $(window).on('load', function () {
        -    $('[data-ride="carousel"]').each(function () {
        -      var $carousel = $(this)
        -      Plugin.call($carousel, $carousel.data())
        -    })
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: collapse.js v3.3.6
        - * http://getbootstrap.com/javascript/#collapse
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // COLLAPSE PUBLIC CLASS DEFINITION
        -  // ================================
        -
        -  var Collapse = function (element, options) {
        -    this.$element      = $(element)
        -    this.options       = $.extend({}, Collapse.DEFAULTS, options)
        -    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
        -                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
        -    this.transitioning = null
        -
        -    if (this.options.parent) {
        -      this.$parent = this.getParent()
        -    } else {
        -      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
        -    }
        -
        -    if (this.options.toggle) this.toggle()
        -  }
        -
        -  Collapse.VERSION  = '3.3.6'
        -
        -  Collapse.TRANSITION_DURATION = 350
        -
        -  Collapse.DEFAULTS = {
        -    toggle: true
        -  }
        -
        -  Collapse.prototype.dimension = function () {
        -    var hasWidth = this.$element.hasClass('width')
        -    return hasWidth ? 'width' : 'height'
        -  }
        -
        -  Collapse.prototype.show = function () {
        -    if (this.transitioning || this.$element.hasClass('in')) return
        -
        -    var activesData
        -    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
        -
        -    if (actives && actives.length) {
        -      activesData = actives.data('bs.collapse')
        -      if (activesData && activesData.transitioning) return
        -    }
        -
        -    var startEvent = $.Event('show.bs.collapse')
        -    this.$element.trigger(startEvent)
        -    if (startEvent.isDefaultPrevented()) return
        -
        -    if (actives && actives.length) {
        -      Plugin.call(actives, 'hide')
        -      activesData || actives.data('bs.collapse', null)
        -    }
        -
        -    var dimension = this.dimension()
        -
        -    this.$element
        -      .removeClass('collapse')
        -      .addClass('collapsing')[dimension](0)
        -      .attr('aria-expanded', true)
        -
        -    this.$trigger
        -      .removeClass('collapsed')
        -      .attr('aria-expanded', true)
        -
        -    this.transitioning = 1
        -
        -    var complete = function () {
        -      this.$element
        -        .removeClass('collapsing')
        -        .addClass('collapse in')[dimension]('')
        -      this.transitioning = 0
        -      this.$element
        -        .trigger('shown.bs.collapse')
        -    }
        -
        -    if (!$.support.transition) return complete.call(this)
        -
        -    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
        -
        -    this.$element
        -      .one('bsTransitionEnd', $.proxy(complete, this))
        -      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
        -  }
        -
        -  Collapse.prototype.hide = function () {
        -    if (this.transitioning || !this.$element.hasClass('in')) return
        -
        -    var startEvent = $.Event('hide.bs.collapse')
        -    this.$element.trigger(startEvent)
        -    if (startEvent.isDefaultPrevented()) return
        -
        -    var dimension = this.dimension()
        -
        -    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
        -
        -    this.$element
        -      .addClass('collapsing')
        -      .removeClass('collapse in')
        -      .attr('aria-expanded', false)
        -
        -    this.$trigger
        -      .addClass('collapsed')
        -      .attr('aria-expanded', false)
        -
        -    this.transitioning = 1
        -
        -    var complete = function () {
        -      this.transitioning = 0
        -      this.$element
        -        .removeClass('collapsing')
        -        .addClass('collapse')
        -        .trigger('hidden.bs.collapse')
        -    }
        -
        -    if (!$.support.transition) return complete.call(this)
        -
        -    this.$element
        -      [dimension](0)
        -      .one('bsTransitionEnd', $.proxy(complete, this))
        -      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
        -  }
        -
        -  Collapse.prototype.toggle = function () {
        -    this[this.$element.hasClass('in') ? 'hide' : 'show']()
        -  }
        -
        -  Collapse.prototype.getParent = function () {
        -    return $(this.options.parent)
        -      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
        -      .each($.proxy(function (i, element) {
        -        var $element = $(element)
        -        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
        -      }, this))
        -      .end()
        -  }
        -
        -  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
        -    var isOpen = $element.hasClass('in')
        -
        -    $element.attr('aria-expanded', isOpen)
        -    $trigger
        -      .toggleClass('collapsed', !isOpen)
        -      .attr('aria-expanded', isOpen)
        -  }
        -
        -  function getTargetFromTrigger($trigger) {
        -    var href
        -    var target = $trigger.attr('data-target')
        -      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
        -
        -    return $(target)
        -  }
        -
        -
        -  // COLLAPSE PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.collapse')
        -      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -
        -      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
        -      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.collapse
        -
        -  $.fn.collapse             = Plugin
        -  $.fn.collapse.Constructor = Collapse
        -
        -
        -  // COLLAPSE NO CONFLICT
        -  // ====================
        -
        -  $.fn.collapse.noConflict = function () {
        -    $.fn.collapse = old
        -    return this
        -  }
        -
        -
        -  // COLLAPSE DATA-API
        -  // =================
        -
        -  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
        -    var $this   = $(this)
        -
        -    if (!$this.attr('data-target')) e.preventDefault()
        -
        -    var $target = getTargetFromTrigger($this)
        -    var data    = $target.data('bs.collapse')
        -    var option  = data ? 'toggle' : $this.data()
        -
        -    Plugin.call($target, option)
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: dropdown.js v3.3.6
        - * http://getbootstrap.com/javascript/#dropdowns
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // DROPDOWN CLASS DEFINITION
        -  // =========================
        -
        -  var backdrop = '.dropdown-backdrop'
        -  var toggle   = '[data-toggle="dropdown"]'
        -  var Dropdown = function (element) {
        -    $(element).on('click.bs.dropdown', this.toggle)
        -  }
        -
        -  Dropdown.VERSION = '3.3.6'
        -
        -  function getParent($this) {
        -    var selector = $this.attr('data-target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    var $parent = selector && $(selector)
        -
        -    return $parent && $parent.length ? $parent : $this.parent()
        -  }
        -
        -  function clearMenus(e) {
        -    if (e && e.which === 3) return
        -    $(backdrop).remove()
        -    $(toggle).each(function () {
        -      var $this         = $(this)
        -      var $parent       = getParent($this)
        -      var relatedTarget = { relatedTarget: this }
        -
        -      if (!$parent.hasClass('open')) return
        -
        -      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
        -
        -      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      $this.attr('aria-expanded', 'false')
        -      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
        -    })
        -  }
        -
        -  Dropdown.prototype.toggle = function (e) {
        -    var $this = $(this)
        -
        -    if ($this.is('.disabled, :disabled')) return
        -
        -    var $parent  = getParent($this)
        -    var isActive = $parent.hasClass('open')
        -
        -    clearMenus()
        -
        -    if (!isActive) {
        -      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        -        // if mobile we use a backdrop because click events don't delegate
        -        $(document.createElement('div'))
        -          .addClass('dropdown-backdrop')
        -          .insertAfter($(this))
        -          .on('click', clearMenus)
        -      }
        -
        -      var relatedTarget = { relatedTarget: this }
        -      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      $this
        -        .trigger('focus')
        -        .attr('aria-expanded', 'true')
        -
        -      $parent
        -        .toggleClass('open')
        -        .trigger($.Event('shown.bs.dropdown', relatedTarget))
        -    }
        -
        -    return false
        -  }
        -
        -  Dropdown.prototype.keydown = function (e) {
        -    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
        -
        -    var $this = $(this)
        -
        -    e.preventDefault()
        -    e.stopPropagation()
        -
        -    if ($this.is('.disabled, :disabled')) return
        -
        -    var $parent  = getParent($this)
        -    var isActive = $parent.hasClass('open')
        -
        -    if (!isActive && e.which != 27 || isActive && e.which == 27) {
        -      if (e.which == 27) $parent.find(toggle).trigger('focus')
        -      return $this.trigger('click')
        -    }
        -
        -    var desc = ' li:not(.disabled):visible a'
        -    var $items = $parent.find('.dropdown-menu' + desc)
        -
        -    if (!$items.length) return
        -
        -    var index = $items.index(e.target)
        -
        -    if (e.which == 38 && index > 0)                 index--         // up
        -    if (e.which == 40 && index < $items.length - 1) index++         // down
        -    if (!~index)                                    index = 0
        -
        -    $items.eq(index).trigger('focus')
        -  }
        -
        -
        -  // DROPDOWN PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.dropdown')
        -
        -      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
        -      if (typeof option == 'string') data[option].call($this)
        -    })
        -  }
        -
        -  var old = $.fn.dropdown
        -
        -  $.fn.dropdown             = Plugin
        -  $.fn.dropdown.Constructor = Dropdown
        -
        -
        -  // DROPDOWN NO CONFLICT
        -  // ====================
        -
        -  $.fn.dropdown.noConflict = function () {
        -    $.fn.dropdown = old
        -    return this
        -  }
        -
        -
        -  // APPLY TO STANDARD DROPDOWN ELEMENTS
        -  // ===================================
        -
        -  $(document)
        -    .on('click.bs.dropdown.data-api', clearMenus)
        -    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
        -    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
        -    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
        -    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: modal.js v3.3.6
        - * http://getbootstrap.com/javascript/#modals
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // MODAL CLASS DEFINITION
        -  // ======================
        -
        -  var Modal = function (element, options) {
        -    this.options             = options
        -    this.$body               = $(document.body)
        -    this.$element            = $(element)
        -    this.$dialog             = this.$element.find('.modal-dialog')
        -    this.$backdrop           = null
        -    this.isShown             = null
        -    this.originalBodyPad     = null
        -    this.scrollbarWidth      = 0
        -    this.ignoreBackdropClick = false
        -
        -    if (this.options.remote) {
        -      this.$element
        -        .find('.modal-content')
        -        .load(this.options.remote, $.proxy(function () {
        -          this.$element.trigger('loaded.bs.modal')
        -        }, this))
        -    }
        -  }
        -
        -  Modal.VERSION  = '3.3.6'
        -
        -  Modal.TRANSITION_DURATION = 300
        -  Modal.BACKDROP_TRANSITION_DURATION = 150
        -
        -  Modal.DEFAULTS = {
        -    backdrop: true,
        -    keyboard: true,
        -    show: true
        -  }
        -
        -  Modal.prototype.toggle = function (_relatedTarget) {
        -    return this.isShown ? this.hide() : this.show(_relatedTarget)
        -  }
        -
        -  Modal.prototype.show = function (_relatedTarget) {
        -    var that = this
        -    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
        -
        -    this.$element.trigger(e)
        -
        -    if (this.isShown || e.isDefaultPrevented()) return
        -
        -    this.isShown = true
        -
        -    this.checkScrollbar()
        -    this.setScrollbar()
        -    this.$body.addClass('modal-open')
        -
        -    this.escape()
        -    this.resize()
        -
        -    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
        -
        -    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
        -      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        -        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
        -      })
        -    })
        -
        -    this.backdrop(function () {
        -      var transition = $.support.transition && that.$element.hasClass('fade')
        -
        -      if (!that.$element.parent().length) {
        -        that.$element.appendTo(that.$body) // don't move modals dom position
        -      }
        -
        -      that.$element
        -        .show()
        -        .scrollTop(0)
        -
        -      that.adjustDialog()
        -
        -      if (transition) {
        -        that.$element[0].offsetWidth // force reflow
        -      }
        -
        -      that.$element.addClass('in')
        -
        -      that.enforceFocus()
        -
        -      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
        -
        -      transition ?
        -        that.$dialog // wait for modal to slide in
        -          .one('bsTransitionEnd', function () {
        -            that.$element.trigger('focus').trigger(e)
        -          })
        -          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        -        that.$element.trigger('focus').trigger(e)
        -    })
        -  }
        -
        -  Modal.prototype.hide = function (e) {
        -    if (e) e.preventDefault()
        -
        -    e = $.Event('hide.bs.modal')
        -
        -    this.$element.trigger(e)
        -
        -    if (!this.isShown || e.isDefaultPrevented()) return
        -
        -    this.isShown = false
        -
        -    this.escape()
        -    this.resize()
        -
        -    $(document).off('focusin.bs.modal')
        -
        -    this.$element
        -      .removeClass('in')
        -      .off('click.dismiss.bs.modal')
        -      .off('mouseup.dismiss.bs.modal')
        -
        -    this.$dialog.off('mousedown.dismiss.bs.modal')
        -
        -    $.support.transition && this.$element.hasClass('fade') ?
        -      this.$element
        -        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        -        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        -      this.hideModal()
        -  }
        -
        -  Modal.prototype.enforceFocus = function () {
        -    $(document)
        -      .off('focusin.bs.modal') // guard against infinite focus loop
        -      .on('focusin.bs.modal', $.proxy(function (e) {
        -        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
        -          this.$element.trigger('focus')
        -        }
        -      }, this))
        -  }
        -
        -  Modal.prototype.escape = function () {
        -    if (this.isShown && this.options.keyboard) {
        -      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
        -        e.which == 27 && this.hide()
        -      }, this))
        -    } else if (!this.isShown) {
        -      this.$element.off('keydown.dismiss.bs.modal')
        -    }
        -  }
        -
        -  Modal.prototype.resize = function () {
        -    if (this.isShown) {
        -      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
        -    } else {
        -      $(window).off('resize.bs.modal')
        -    }
        -  }
        -
        -  Modal.prototype.hideModal = function () {
        -    var that = this
        -    this.$element.hide()
        -    this.backdrop(function () {
        -      that.$body.removeClass('modal-open')
        -      that.resetAdjustments()
        -      that.resetScrollbar()
        -      that.$element.trigger('hidden.bs.modal')
        -    })
        -  }
        -
        -  Modal.prototype.removeBackdrop = function () {
        -    this.$backdrop && this.$backdrop.remove()
        -    this.$backdrop = null
        -  }
        -
        -  Modal.prototype.backdrop = function (callback) {
        -    var that = this
        -    var animate = this.$element.hasClass('fade') ? 'fade' : ''
        -
        -    if (this.isShown && this.options.backdrop) {
        -      var doAnimate = $.support.transition && animate
        -
        -      this.$backdrop = $(document.createElement('div'))
        -        .addClass('modal-backdrop ' + animate)
        -        .appendTo(this.$body)
        -
        -      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        -        if (this.ignoreBackdropClick) {
        -          this.ignoreBackdropClick = false
        -          return
        -        }
        -        if (e.target !== e.currentTarget) return
        -        this.options.backdrop == 'static'
        -          ? this.$element[0].focus()
        -          : this.hide()
        -      }, this))
        -
        -      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
        -
        -      this.$backdrop.addClass('in')
        -
        -      if (!callback) return
        -
        -      doAnimate ?
        -        this.$backdrop
        -          .one('bsTransitionEnd', callback)
        -          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        -        callback()
        -
        -    } else if (!this.isShown && this.$backdrop) {
        -      this.$backdrop.removeClass('in')
        -
        -      var callbackRemove = function () {
        -        that.removeBackdrop()
        -        callback && callback()
        -      }
        -      $.support.transition && this.$element.hasClass('fade') ?
        -        this.$backdrop
        -          .one('bsTransitionEnd', callbackRemove)
        -          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        -        callbackRemove()
        -
        -    } else if (callback) {
        -      callback()
        -    }
        -  }
        -
        -  // these following methods are used to handle overflowing modals
        -
        -  Modal.prototype.handleUpdate = function () {
        -    this.adjustDialog()
        -  }
        -
        -  Modal.prototype.adjustDialog = function () {
        -    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
        -
        -    this.$element.css({
        -      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
        -      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
        -    })
        -  }
        -
        -  Modal.prototype.resetAdjustments = function () {
        -    this.$element.css({
        -      paddingLeft: '',
        -      paddingRight: ''
        -    })
        -  }
        -
        -  Modal.prototype.checkScrollbar = function () {
        -    var fullWindowWidth = window.innerWidth
        -    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
        -      var documentElementRect = document.documentElement.getBoundingClientRect()
        -      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
        -    }
        -    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
        -    this.scrollbarWidth = this.measureScrollbar()
        -  }
        -
        -  Modal.prototype.setScrollbar = function () {
        -    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
        -    this.originalBodyPad = document.body.style.paddingRight || ''
        -    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
        -  }
        -
        -  Modal.prototype.resetScrollbar = function () {
        -    this.$body.css('padding-right', this.originalBodyPad)
        -  }
        -
        -  Modal.prototype.measureScrollbar = function () { // thx walsh
        -    var scrollDiv = document.createElement('div')
        -    scrollDiv.className = 'modal-scrollbar-measure'
        -    this.$body.append(scrollDiv)
        -    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
        -    this.$body[0].removeChild(scrollDiv)
        -    return scrollbarWidth
        -  }
        -
        -
        -  // MODAL PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option, _relatedTarget) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.modal')
        -      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -
        -      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
        -      if (typeof option == 'string') data[option](_relatedTarget)
        -      else if (options.show) data.show(_relatedTarget)
        -    })
        -  }
        -
        -  var old = $.fn.modal
        -
        -  $.fn.modal             = Plugin
        -  $.fn.modal.Constructor = Modal
        -
        -
        -  // MODAL NO CONFLICT
        -  // =================
        -
        -  $.fn.modal.noConflict = function () {
        -    $.fn.modal = old
        -    return this
        -  }
        -
        -
        -  // MODAL DATA-API
        -  // ==============
        -
        -  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
        -    var $this   = $(this)
        -    var href    = $this.attr('href')
        -    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
        -    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
        -
        -    if ($this.is('a')) e.preventDefault()
        -
        -    $target.one('show.bs.modal', function (showEvent) {
        -      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
        -      $target.one('hidden.bs.modal', function () {
        -        $this.is(':visible') && $this.trigger('focus')
        -      })
        -    })
        -    Plugin.call($target, option, this)
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: tooltip.js v3.3.6
        - * http://getbootstrap.com/javascript/#tooltip
        - * Inspired by the original jQuery.tipsy by Jason Frame
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // TOOLTIP PUBLIC CLASS DEFINITION
        -  // ===============================
        -
        -  var Tooltip = function (element, options) {
        -    this.type       = null
        -    this.options    = null
        -    this.enabled    = null
        -    this.timeout    = null
        -    this.hoverState = null
        -    this.$element   = null
        -    this.inState    = null
        -
        -    this.init('tooltip', element, options)
        -  }
        -
        -  Tooltip.VERSION  = '3.3.6'
        -
        -  Tooltip.TRANSITION_DURATION = 150
        -
        -  Tooltip.DEFAULTS = {
        -    animation: true,
        -    placement: 'top',
        -    selector: false,
        -    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
        -    trigger: 'hover focus',
        -    title: '',
        -    delay: 0,
        -    html: false,
        -    container: false,
        -    viewport: {
        -      selector: 'body',
        -      padding: 0
        -    }
        -  }
        -
        -  Tooltip.prototype.init = function (type, element, options) {
        -    this.enabled   = true
        -    this.type      = type
        -    this.$element  = $(element)
        -    this.options   = this.getOptions(options)
        -    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
        -    this.inState   = { click: false, hover: false, focus: false }
        -
        -    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
        -      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
        -    }
        -
        -    var triggers = this.options.trigger.split(' ')
        -
        -    for (var i = triggers.length; i--;) {
        -      var trigger = triggers[i]
        -
        -      if (trigger == 'click') {
        -        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
        -      } else if (trigger != 'manual') {
        -        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        -        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
        -
        -        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        -        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
        -      }
        -    }
        -
        -    this.options.selector ?
        -      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
        -      this.fixTitle()
        -  }
        -
        -  Tooltip.prototype.getDefaults = function () {
        -    return Tooltip.DEFAULTS
        -  }
        -
        -  Tooltip.prototype.getOptions = function (options) {
        -    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
        -
        -    if (options.delay && typeof options.delay == 'number') {
        -      options.delay = {
        -        show: options.delay,
        -        hide: options.delay
        -      }
        -    }
        -
        -    return options
        -  }
        -
        -  Tooltip.prototype.getDelegateOptions = function () {
        -    var options  = {}
        -    var defaults = this.getDefaults()
        -
        -    this._options && $.each(this._options, function (key, value) {
        -      if (defaults[key] != value) options[key] = value
        -    })
        -
        -    return options
        -  }
        -
        -  Tooltip.prototype.enter = function (obj) {
        -    var self = obj instanceof this.constructor ?
        -      obj : $(obj.currentTarget).data('bs.' + this.type)
        -
        -    if (!self) {
        -      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        -      $(obj.currentTarget).data('bs.' + this.type, self)
        -    }
        -
        -    if (obj instanceof $.Event) {
        -      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
        -    }
        -
        -    if (self.tip().hasClass('in') || self.hoverState == 'in') {
        -      self.hoverState = 'in'
        -      return
        -    }
        -
        -    clearTimeout(self.timeout)
        -
        -    self.hoverState = 'in'
        -
        -    if (!self.options.delay || !self.options.delay.show) return self.show()
        -
        -    self.timeout = setTimeout(function () {
        -      if (self.hoverState == 'in') self.show()
        -    }, self.options.delay.show)
        -  }
        -
        -  Tooltip.prototype.isInStateTrue = function () {
        -    for (var key in this.inState) {
        -      if (this.inState[key]) return true
        -    }
        -
        -    return false
        -  }
        -
        -  Tooltip.prototype.leave = function (obj) {
        -    var self = obj instanceof this.constructor ?
        -      obj : $(obj.currentTarget).data('bs.' + this.type)
        -
        -    if (!self) {
        -      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        -      $(obj.currentTarget).data('bs.' + this.type, self)
        -    }
        -
        -    if (obj instanceof $.Event) {
        -      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
        -    }
        -
        -    if (self.isInStateTrue()) return
        -
        -    clearTimeout(self.timeout)
        -
        -    self.hoverState = 'out'
        -
        -    if (!self.options.delay || !self.options.delay.hide) return self.hide()
        -
        -    self.timeout = setTimeout(function () {
        -      if (self.hoverState == 'out') self.hide()
        -    }, self.options.delay.hide)
        -  }
        -
        -  Tooltip.prototype.show = function () {
        -    var e = $.Event('show.bs.' + this.type)
        -
        -    if (this.hasContent() && this.enabled) {
        -      this.$element.trigger(e)
        -
        -      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
        -      if (e.isDefaultPrevented() || !inDom) return
        -      var that = this
        -
        -      var $tip = this.tip()
        -
        -      var tipId = this.getUID(this.type)
        -
        -      this.setContent()
        -      $tip.attr('id', tipId)
        -      this.$element.attr('aria-describedby', tipId)
        -
        -      if (this.options.animation) $tip.addClass('fade')
        -
        -      var placement = typeof this.options.placement == 'function' ?
        -        this.options.placement.call(this, $tip[0], this.$element[0]) :
        -        this.options.placement
        -
        -      var autoToken = /\s?auto?\s?/i
        -      var autoPlace = autoToken.test(placement)
        -      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
        -
        -      $tip
        -        .detach()
        -        .css({ top: 0, left: 0, display: 'block' })
        -        .addClass(placement)
        -        .data('bs.' + this.type, this)
        -
        -      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
        -      this.$element.trigger('inserted.bs.' + this.type)
        -
        -      var pos          = this.getPosition()
        -      var actualWidth  = $tip[0].offsetWidth
        -      var actualHeight = $tip[0].offsetHeight
        -
        -      if (autoPlace) {
        -        var orgPlacement = placement
        -        var viewportDim = this.getPosition(this.$viewport)
        -
        -        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
        -                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
        -                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
        -                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
        -                    placement
        -
        -        $tip
        -          .removeClass(orgPlacement)
        -          .addClass(placement)
        -      }
        -
        -      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
        -
        -      this.applyPlacement(calculatedOffset, placement)
        -
        -      var complete = function () {
        -        var prevHoverState = that.hoverState
        -        that.$element.trigger('shown.bs.' + that.type)
        -        that.hoverState = null
        -
        -        if (prevHoverState == 'out') that.leave(that)
        -      }
        -
        -      $.support.transition && this.$tip.hasClass('fade') ?
        -        $tip
        -          .one('bsTransitionEnd', complete)
        -          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        -        complete()
        -    }
        -  }
        -
        -  Tooltip.prototype.applyPlacement = function (offset, placement) {
        -    var $tip   = this.tip()
        -    var width  = $tip[0].offsetWidth
        -    var height = $tip[0].offsetHeight
        -
        -    // manually read margins because getBoundingClientRect includes difference
        -    var marginTop = parseInt($tip.css('margin-top'), 10)
        -    var marginLeft = parseInt($tip.css('margin-left'), 10)
        -
        -    // we must check for NaN for ie 8/9
        -    if (isNaN(marginTop))  marginTop  = 0
        -    if (isNaN(marginLeft)) marginLeft = 0
        -
        -    offset.top  += marginTop
        -    offset.left += marginLeft
        -
        -    // $.fn.offset doesn't round pixel values
        -    // so we use setOffset directly with our own function B-0
        -    $.offset.setOffset($tip[0], $.extend({
        -      using: function (props) {
        -        $tip.css({
        -          top: Math.round(props.top),
        -          left: Math.round(props.left)
        -        })
        -      }
        -    }, offset), 0)
        -
        -    $tip.addClass('in')
        -
        -    // check to see if placing tip in new offset caused the tip to resize itself
        -    var actualWidth  = $tip[0].offsetWidth
        -    var actualHeight = $tip[0].offsetHeight
        -
        -    if (placement == 'top' && actualHeight != height) {
        -      offset.top = offset.top + height - actualHeight
        -    }
        -
        -    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
        -
        -    if (delta.left) offset.left += delta.left
        -    else offset.top += delta.top
        -
        -    var isVertical          = /top|bottom/.test(placement)
        -    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
        -    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
        -
        -    $tip.offset(offset)
        -    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
        -  }
        -
        -  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
        -    this.arrow()
        -      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
        -      .css(isVertical ? 'top' : 'left', '')
        -  }
        -
        -  Tooltip.prototype.setContent = function () {
        -    var $tip  = this.tip()
        -    var title = this.getTitle()
        -
        -    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
        -    $tip.removeClass('fade in top bottom left right')
        -  }
        -
        -  Tooltip.prototype.hide = function (callback) {
        -    var that = this
        -    var $tip = $(this.$tip)
        -    var e    = $.Event('hide.bs.' + this.type)
        -
        -    function complete() {
        -      if (that.hoverState != 'in') $tip.detach()
        -      that.$element
        -        .removeAttr('aria-describedby')
        -        .trigger('hidden.bs.' + that.type)
        -      callback && callback()
        -    }
        -
        -    this.$element.trigger(e)
        -
        -    if (e.isDefaultPrevented()) return
        -
        -    $tip.removeClass('in')
        -
        -    $.support.transition && $tip.hasClass('fade') ?
        -      $tip
        -        .one('bsTransitionEnd', complete)
        -        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        -      complete()
        -
        -    this.hoverState = null
        -
        -    return this
        -  }
        -
        -  Tooltip.prototype.fixTitle = function () {
        -    var $e = this.$element
        -    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
        -      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
        -    }
        -  }
        -
        -  Tooltip.prototype.hasContent = function () {
        -    return this.getTitle()
        -  }
        -
        -  Tooltip.prototype.getPosition = function ($element) {
        -    $element   = $element || this.$element
        -
        -    var el     = $element[0]
        -    var isBody = el.tagName == 'BODY'
        -
        -    var elRect    = el.getBoundingClientRect()
        -    if (elRect.width == null) {
        -      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
        -      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
        -    }
        -    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
        -    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
        -    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
        -
        -    return $.extend({}, elRect, scroll, outerDims, elOffset)
        -  }
        -
        -  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
        -    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
        -           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
        -           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        -        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
        -
        -  }
        -
        -  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
        -    var delta = { top: 0, left: 0 }
        -    if (!this.$viewport) return delta
        -
        -    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
        -    var viewportDimensions = this.getPosition(this.$viewport)
        -
        -    if (/right|left/.test(placement)) {
        -      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
        -      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
        -      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        -        delta.top = viewportDimensions.top - topEdgeOffset
        -      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        -        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
        -      }
        -    } else {
        -      var leftEdgeOffset  = pos.left - viewportPadding
        -      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
        -      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        -        delta.left = viewportDimensions.left - leftEdgeOffset
        -      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
        -        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
        -      }
        -    }
        -
        -    return delta
        -  }
        -
        -  Tooltip.prototype.getTitle = function () {
        -    var title
        -    var $e = this.$element
        -    var o  = this.options
        -
        -    title = $e.attr('data-original-title')
        -      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
        -
        -    return title
        -  }
        -
        -  Tooltip.prototype.getUID = function (prefix) {
        -    do prefix += ~~(Math.random() * 1000000)
        -    while (document.getElementById(prefix))
        -    return prefix
        -  }
        -
        -  Tooltip.prototype.tip = function () {
        -    if (!this.$tip) {
        -      this.$tip = $(this.options.template)
        -      if (this.$tip.length != 1) {
        -        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
        -      }
        -    }
        -    return this.$tip
        -  }
        -
        -  Tooltip.prototype.arrow = function () {
        -    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
        -  }
        -
        -  Tooltip.prototype.enable = function () {
        -    this.enabled = true
        -  }
        -
        -  Tooltip.prototype.disable = function () {
        -    this.enabled = false
        -  }
        -
        -  Tooltip.prototype.toggleEnabled = function () {
        -    this.enabled = !this.enabled
        -  }
        -
        -  Tooltip.prototype.toggle = function (e) {
        -    var self = this
        -    if (e) {
        -      self = $(e.currentTarget).data('bs.' + this.type)
        -      if (!self) {
        -        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        -        $(e.currentTarget).data('bs.' + this.type, self)
        -      }
        -    }
        -
        -    if (e) {
        -      self.inState.click = !self.inState.click
        -      if (self.isInStateTrue()) self.enter(self)
        -      else self.leave(self)
        -    } else {
        -      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
        -    }
        -  }
        -
        -  Tooltip.prototype.destroy = function () {
        -    var that = this
        -    clearTimeout(this.timeout)
        -    this.hide(function () {
        -      that.$element.off('.' + that.type).removeData('bs.' + that.type)
        -      if (that.$tip) {
        -        that.$tip.detach()
        -      }
        -      that.$tip = null
        -      that.$arrow = null
        -      that.$viewport = null
        -    })
        -  }
        -
        -
        -  // TOOLTIP PLUGIN DEFINITION
        -  // =========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.tooltip')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data && /destroy|hide/.test(option)) return
        -      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.tooltip
        -
        -  $.fn.tooltip             = Plugin
        -  $.fn.tooltip.Constructor = Tooltip
        -
        -
        -  // TOOLTIP NO CONFLICT
        -  // ===================
        -
        -  $.fn.tooltip.noConflict = function () {
        -    $.fn.tooltip = old
        -    return this
        -  }
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: popover.js v3.3.6
        - * http://getbootstrap.com/javascript/#popovers
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // POPOVER PUBLIC CLASS DEFINITION
        -  // ===============================
        -
        -  var Popover = function (element, options) {
        -    this.init('popover', element, options)
        -  }
        -
        -  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
        -
        -  Popover.VERSION  = '3.3.6'
        -
        -  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
        -    placement: 'right',
        -    trigger: 'click',
        -    content: '',
        -    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
        -  })
        -
        -
        -  // NOTE: POPOVER EXTENDS tooltip.js
        -  // ================================
        -
        -  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
        -
        -  Popover.prototype.constructor = Popover
        -
        -  Popover.prototype.getDefaults = function () {
        -    return Popover.DEFAULTS
        -  }
        -
        -  Popover.prototype.setContent = function () {
        -    var $tip    = this.tip()
        -    var title   = this.getTitle()
        -    var content = this.getContent()
        -
        -    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
        -    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
        -      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
        -    ](content)
        -
        -    $tip.removeClass('fade top bottom left right in')
        -
        -    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
        -    // this manually by checking the contents.
        -    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
        -  }
        -
        -  Popover.prototype.hasContent = function () {
        -    return this.getTitle() || this.getContent()
        -  }
        -
        -  Popover.prototype.getContent = function () {
        -    var $e = this.$element
        -    var o  = this.options
        -
        -    return $e.attr('data-content')
        -      || (typeof o.content == 'function' ?
        -            o.content.call($e[0]) :
        -            o.content)
        -  }
        -
        -  Popover.prototype.arrow = function () {
        -    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
        -  }
        -
        -
        -  // POPOVER PLUGIN DEFINITION
        -  // =========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.popover')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data && /destroy|hide/.test(option)) return
        -      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.popover
        -
        -  $.fn.popover             = Plugin
        -  $.fn.popover.Constructor = Popover
        -
        -
        -  // POPOVER NO CONFLICT
        -  // ===================
        -
        -  $.fn.popover.noConflict = function () {
        -    $.fn.popover = old
        -    return this
        -  }
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: scrollspy.js v3.3.6
        - * http://getbootstrap.com/javascript/#scrollspy
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // SCROLLSPY CLASS DEFINITION
        -  // ==========================
        -
        -  function ScrollSpy(element, options) {
        -    this.$body          = $(document.body)
        -    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
        -    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
        -    this.selector       = (this.options.target || '') + ' .nav li > a'
        -    this.offsets        = []
        -    this.targets        = []
        -    this.activeTarget   = null
        -    this.scrollHeight   = 0
        -
        -    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
        -    this.refresh()
        -    this.process()
        -  }
        -
        -  ScrollSpy.VERSION  = '3.3.6'
        -
        -  ScrollSpy.DEFAULTS = {
        -    offset: 10
        -  }
        -
        -  ScrollSpy.prototype.getScrollHeight = function () {
        -    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
        -  }
        -
        -  ScrollSpy.prototype.refresh = function () {
        -    var that          = this
        -    var offsetMethod  = 'offset'
        -    var offsetBase    = 0
        -
        -    this.offsets      = []
        -    this.targets      = []
        -    this.scrollHeight = this.getScrollHeight()
        -
        -    if (!$.isWindow(this.$scrollElement[0])) {
        -      offsetMethod = 'position'
        -      offsetBase   = this.$scrollElement.scrollTop()
        -    }
        -
        -    this.$body
        -      .find(this.selector)
        -      .map(function () {
        -        var $el   = $(this)
        -        var href  = $el.data('target') || $el.attr('href')
        -        var $href = /^#./.test(href) && $(href)
        -
        -        return ($href
        -          && $href.length
        -          && $href.is(':visible')
        -          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
        -      })
        -      .sort(function (a, b) { return a[0] - b[0] })
        -      .each(function () {
        -        that.offsets.push(this[0])
        -        that.targets.push(this[1])
        -      })
        -  }
        -
        -  ScrollSpy.prototype.process = function () {
        -    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
        -    var scrollHeight = this.getScrollHeight()
        -    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
        -    var offsets      = this.offsets
        -    var targets      = this.targets
        -    var activeTarget = this.activeTarget
        -    var i
        -
        -    if (this.scrollHeight != scrollHeight) {
        -      this.refresh()
        -    }
        -
        -    if (scrollTop >= maxScroll) {
        -      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
        -    }
        -
        -    if (activeTarget && scrollTop < offsets[0]) {
        -      this.activeTarget = null
        -      return this.clear()
        -    }
        -
        -    for (i = offsets.length; i--;) {
        -      activeTarget != targets[i]
        -        && scrollTop >= offsets[i]
        -        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
        -        && this.activate(targets[i])
        -    }
        -  }
        -
        -  ScrollSpy.prototype.activate = function (target) {
        -    this.activeTarget = target
        -
        -    this.clear()
        -
        -    var selector = this.selector +
        -      '[data-target="' + target + '"],' +
        -      this.selector + '[href="' + target + '"]'
        -
        -    var active = $(selector)
        -      .parents('li')
        -      .addClass('active')
        -
        -    if (active.parent('.dropdown-menu').length) {
        -      active = active
        -        .closest('li.dropdown')
        -        .addClass('active')
        -    }
        -
        -    active.trigger('activate.bs.scrollspy')
        -  }
        -
        -  ScrollSpy.prototype.clear = function () {
        -    $(this.selector)
        -      .parentsUntil(this.options.target, '.active')
        -      .removeClass('active')
        -  }
        -
        -
        -  // SCROLLSPY PLUGIN DEFINITION
        -  // ===========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.scrollspy')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.scrollspy
        -
        -  $.fn.scrollspy             = Plugin
        -  $.fn.scrollspy.Constructor = ScrollSpy
        -
        -
        -  // SCROLLSPY NO CONFLICT
        -  // =====================
        -
        -  $.fn.scrollspy.noConflict = function () {
        -    $.fn.scrollspy = old
        -    return this
        -  }
        -
        -
        -  // SCROLLSPY DATA-API
        -  // ==================
        -
        -  $(window).on('load.bs.scrollspy.data-api', function () {
        -    $('[data-spy="scroll"]').each(function () {
        -      var $spy = $(this)
        -      Plugin.call($spy, $spy.data())
        -    })
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: tab.js v3.3.6
        - * http://getbootstrap.com/javascript/#tabs
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // TAB CLASS DEFINITION
        -  // ====================
        -
        -  var Tab = function (element) {
        -    // jscs:disable requireDollarBeforejQueryAssignment
        -    this.element = $(element)
        -    // jscs:enable requireDollarBeforejQueryAssignment
        -  }
        -
        -  Tab.VERSION = '3.3.6'
        -
        -  Tab.TRANSITION_DURATION = 150
        -
        -  Tab.prototype.show = function () {
        -    var $this    = this.element
        -    var $ul      = $this.closest('ul:not(.dropdown-menu)')
        -    var selector = $this.data('target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    if ($this.parent('li').hasClass('active')) return
        -
        -    var $previous = $ul.find('.active:last a')
        -    var hideEvent = $.Event('hide.bs.tab', {
        -      relatedTarget: $this[0]
        -    })
        -    var showEvent = $.Event('show.bs.tab', {
        -      relatedTarget: $previous[0]
        -    })
        -
        -    $previous.trigger(hideEvent)
        -    $this.trigger(showEvent)
        -
        -    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
        -
        -    var $target = $(selector)
        -
        -    this.activate($this.closest('li'), $ul)
        -    this.activate($target, $target.parent(), function () {
        -      $previous.trigger({
        -        type: 'hidden.bs.tab',
        -        relatedTarget: $this[0]
        -      })
        -      $this.trigger({
        -        type: 'shown.bs.tab',
        -        relatedTarget: $previous[0]
        -      })
        -    })
        -  }
        -
        -  Tab.prototype.activate = function (element, container, callback) {
        -    var $active    = container.find('> .active')
        -    var transition = callback
        -      && $.support.transition
        -      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
        -
        -    function next() {
        -      $active
        -        .removeClass('active')
        -        .find('> .dropdown-menu > .active')
        -          .removeClass('active')
        -        .end()
        -        .find('[data-toggle="tab"]')
        -          .attr('aria-expanded', false)
        -
        -      element
        -        .addClass('active')
        -        .find('[data-toggle="tab"]')
        -          .attr('aria-expanded', true)
        -
        -      if (transition) {
        -        element[0].offsetWidth // reflow for transition
        -        element.addClass('in')
        -      } else {
        -        element.removeClass('fade')
        -      }
        -
        -      if (element.parent('.dropdown-menu').length) {
        -        element
        -          .closest('li.dropdown')
        -            .addClass('active')
        -          .end()
        -          .find('[data-toggle="tab"]')
        -            .attr('aria-expanded', true)
        -      }
        -
        -      callback && callback()
        -    }
        -
        -    $active.length && transition ?
        -      $active
        -        .one('bsTransitionEnd', next)
        -        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
        -      next()
        -
        -    $active.removeClass('in')
        -  }
        -
        -
        -  // TAB PLUGIN DEFINITION
        -  // =====================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.tab')
        -
        -      if (!data) $this.data('bs.tab', (data = new Tab(this)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.tab
        -
        -  $.fn.tab             = Plugin
        -  $.fn.tab.Constructor = Tab
        -
        -
        -  // TAB NO CONFLICT
        -  // ===============
        -
        -  $.fn.tab.noConflict = function () {
        -    $.fn.tab = old
        -    return this
        -  }
        -
        -
        -  // TAB DATA-API
        -  // ============
        -
        -  var clickHandler = function (e) {
        -    e.preventDefault()
        -    Plugin.call($(this), 'show')
        -  }
        -
        -  $(document)
        -    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
        -    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: affix.js v3.3.6
        - * http://getbootstrap.com/javascript/#affix
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // AFFIX CLASS DEFINITION
        -  // ======================
        -
        -  var Affix = function (element, options) {
        -    this.options = $.extend({}, Affix.DEFAULTS, options)
        -
        -    this.$target = $(this.options.target)
        -      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
        -      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
        -
        -    this.$element     = $(element)
        -    this.affixed      = null
        -    this.unpin        = null
        -    this.pinnedOffset = null
        -
        -    this.checkPosition()
        -  }
        -
        -  Affix.VERSION  = '3.3.6'
        -
        -  Affix.RESET    = 'affix affix-top affix-bottom'
        -
        -  Affix.DEFAULTS = {
        -    offset: 0,
        -    target: window
        -  }
        -
        -  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
        -    var scrollTop    = this.$target.scrollTop()
        -    var position     = this.$element.offset()
        -    var targetHeight = this.$target.height()
        -
        -    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
        -
        -    if (this.affixed == 'bottom') {
        -      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
        -      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
        -    }
        -
        -    var initializing   = this.affixed == null
        -    var colliderTop    = initializing ? scrollTop : position.top
        -    var colliderHeight = initializing ? targetHeight : height
        -
        -    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
        -    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
        -
        -    return false
        -  }
        -
        -  Affix.prototype.getPinnedOffset = function () {
        -    if (this.pinnedOffset) return this.pinnedOffset
        -    this.$element.removeClass(Affix.RESET).addClass('affix')
        -    var scrollTop = this.$target.scrollTop()
        -    var position  = this.$element.offset()
        -    return (this.pinnedOffset = position.top - scrollTop)
        -  }
        -
        -  Affix.prototype.checkPositionWithEventLoop = function () {
        -    setTimeout($.proxy(this.checkPosition, this), 1)
        -  }
        -
        -  Affix.prototype.checkPosition = function () {
        -    if (!this.$element.is(':visible')) return
        -
        -    var height       = this.$element.height()
        -    var offset       = this.options.offset
        -    var offsetTop    = offset.top
        -    var offsetBottom = offset.bottom
        -    var scrollHeight = Math.max($(document).height(), $(document.body).height())
        -
        -    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
        -    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
        -    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
        -
        -    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
        -
        -    if (this.affixed != affix) {
        -      if (this.unpin != null) this.$element.css('top', '')
        -
        -      var affixType = 'affix' + (affix ? '-' + affix : '')
        -      var e         = $.Event(affixType + '.bs.affix')
        -
        -      this.$element.trigger(e)
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      this.affixed = affix
        -      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
        -
        -      this.$element
        -        .removeClass(Affix.RESET)
        -        .addClass(affixType)
        -        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
        -    }
        -
        -    if (affix == 'bottom') {
        -      this.$element.offset({
        -        top: scrollHeight - height - offsetBottom
        -      })
        -    }
        -  }
        -
        -
        -  // AFFIX PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.affix')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.affix
        -
        -  $.fn.affix             = Plugin
        -  $.fn.affix.Constructor = Affix
        -
        -
        -  // AFFIX NO CONFLICT
        -  // =================
        -
        -  $.fn.affix.noConflict = function () {
        -    $.fn.affix = old
        -    return this
        -  }
        -
        -
        -  // AFFIX DATA-API
        -  // ==============
        -
        -  $(window).on('load', function () {
        -    $('[data-spy="affix"]').each(function () {
        -      var $spy = $(this)
        -      var data = $spy.data()
        -
        -      data.offset = data.offset || {}
        -
        -      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
        -      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
        -
        -      Plugin.call($spy, data)
        -    })
        -  })
        -
        -}(jQuery);
        -
        -;(function () {
        -	'use strict';
        -
        -	/**
        -	 * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.
        -	 *
        -	 * @codingstandard ftlabs-jsv2
        -	 * @copyright The Financial Times Limited [All Rights Reserved]
        -	 * @license MIT License (see LICENSE.txt)
        -	 */
        -
        -	/*jslint browser:true, node:true*/
        -	/*global define, Event, Node*/
        -
        -
        -	/**
        -	 * Instantiate fast-clicking listeners on the specified layer.
        -	 *
        -	 * @constructor
        -	 * @param {Element} layer The layer to listen on
        -	 * @param {Object} [options={}] The options to override the defaults
        -	 */
        -	function FastClick(layer, options) {
        -		var oldOnClick;
        -
        -		options = options || {};
        -
        -		/**
        -		 * Whether a click is currently being tracked.
        -		 *
        -		 * @type boolean
        -		 */
        -		this.trackingClick = false;
        -
        -
        -		/**
        -		 * Timestamp for when click tracking started.
        -		 *
        -		 * @type number
        -		 */
        -		this.trackingClickStart = 0;
        -
        -
        -		/**
        -		 * The element being tracked for a click.
        -		 *
        -		 * @type EventTarget
        -		 */
        -		this.targetElement = null;
        -
        -
        -		/**
        -		 * X-coordinate of touch start event.
        -		 *
        -		 * @type number
        -		 */
        -		this.touchStartX = 0;
        -
        -
        -		/**
        -		 * Y-coordinate of touch start event.
        -		 *
        -		 * @type number
        -		 */
        -		this.touchStartY = 0;
        -
        -
        -		/**
        -		 * ID of the last touch, retrieved from Touch.identifier.
        -		 *
        -		 * @type number
        -		 */
        -		this.lastTouchIdentifier = 0;
        -
        -
        -		/**
        -		 * Touchmove boundary, beyond which a click will be cancelled.
        -		 *
        -		 * @type number
        -		 */
        -		this.touchBoundary = options.touchBoundary || 10;
        -
        -
        -		/**
        -		 * The FastClick layer.
        -		 *
        -		 * @type Element
        -		 */
        -		this.layer = layer;
        -
        -		/**
        -		 * The minimum time between tap(touchstart and touchend) events
        -		 *
        -		 * @type number
        -		 */
        -		this.tapDelay = options.tapDelay || 200;
        -
        -		/**
        -		 * The maximum time for a tap
        -		 *
        -		 * @type number
        -		 */
        -		this.tapTimeout = options.tapTimeout || 700;
        -
        -		if (FastClick.notNeeded(layer)) {
        -			return;
        -		}
        -
        -		// Some old versions of Android don't have Function.prototype.bind
        -		function bind(method, context) {
        -			return function() { return method.apply(context, arguments); };
        -		}
        -
        -
        -		var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];
        -		var context = this;
        -		for (var i = 0, l = methods.length; i < l; i++) {
        -			context[methods[i]] = bind(context[methods[i]], context);
        -		}
        -
        -		// Set up event handlers as required
        -		if (deviceIsAndroid) {
        -			layer.addEventListener('mouseover', this.onMouse, true);
        -			layer.addEventListener('mousedown', this.onMouse, true);
        -			layer.addEventListener('mouseup', this.onMouse, true);
        -		}
        -
        -		layer.addEventListener('click', this.onClick, true);
        -		layer.addEventListener('touchstart', this.onTouchStart, false);
        -		layer.addEventListener('touchmove', this.onTouchMove, false);
        -		layer.addEventListener('touchend', this.onTouchEnd, false);
        -		layer.addEventListener('touchcancel', this.onTouchCancel, false);
        -
        -		// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
        -		// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick
        -		// layer when they are cancelled.
        -		if (!Event.prototype.stopImmediatePropagation) {
        -			layer.removeEventListener = function(type, callback, capture) {
        -				var rmv = Node.prototype.removeEventListener;
        -				if (type === 'click') {
        -					rmv.call(layer, type, callback.hijacked || callback, capture);
        -				} else {
        -					rmv.call(layer, type, callback, capture);
        -				}
        -			};
        -
        -			layer.addEventListener = function(type, callback, capture) {
        -				var adv = Node.prototype.addEventListener;
        -				if (type === 'click') {
        -					adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {
        -						if (!event.propagationStopped) {
        -							callback(event);
        -						}
        -					}), capture);
        -				} else {
        -					adv.call(layer, type, callback, capture);
        -				}
        -			};
        -		}
        -
        -		// If a handler is already declared in the element's onclick attribute, it will be fired before
        -		// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and
        -		// adding it as listener.
        -		if (typeof layer.onclick === 'function') {
        -
        -			// Android browser on at least 3.2 requires a new reference to the function in layer.onclick
        -			// - the old one won't work if passed to addEventListener directly.
        -			oldOnClick = layer.onclick;
        -			layer.addEventListener('click', function(event) {
        -				oldOnClick(event);
        -			}, false);
        -			layer.onclick = null;
        -		}
        -	}
        -
        -	/**
        -	* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.
        -	*
        -	* @type boolean
        -	*/
        -	var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0;
        -
        -	/**
        -	 * Android requires exceptions.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;
        -
        -
        -	/**
        -	 * iOS requires exceptions.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;
        -
        -
        -	/**
        -	 * iOS 4 requires an exception for select elements.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);
        -
        -
        -	/**
        -	 * iOS 6.0-7.* requires the target element to be manually derived
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent);
        -
        -	/**
        -	 * BlackBerry requires exceptions.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;
        -
        -	/**
        -	 * Determine whether a given element requires a native click.
        -	 *
        -	 * @param {EventTarget|Element} target Target DOM element
        -	 * @returns {boolean} Returns true if the element needs a native click
        -	 */
        -	FastClick.prototype.needsClick = function(target) {
        -		switch (target.nodeName.toLowerCase()) {
        -
        -		// Don't send a synthetic click to disabled inputs (issue #62)
        -		case 'button':
        -		case 'select':
        -		case 'textarea':
        -			if (target.disabled) {
        -				return true;
        -			}
        -
        -			break;
        -		case 'input':
        -
        -			// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
        -			if ((deviceIsIOS && target.type === 'file') || target.disabled) {
        -				return true;
        -			}
        -
        -			break;
        -		case 'label':
        -		case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames
        -		case 'video':
        -			return true;
        -		}
        -
        -		return (/\bneedsclick\b/).test(target.className);
        -	};
        -
        -
        -	/**
        -	 * Determine whether a given element requires a call to focus to simulate click into element.
        -	 *
        -	 * @param {EventTarget|Element} target Target DOM element
        -	 * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.
        -	 */
        -	FastClick.prototype.needsFocus = function(target) {
        -		switch (target.nodeName.toLowerCase()) {
        -		case 'textarea':
        -			return true;
        -		case 'select':
        -			return !deviceIsAndroid;
        -		case 'input':
        -			switch (target.type) {
        -			case 'button':
        -			case 'checkbox':
        -			case 'file':
        -			case 'image':
        -			case 'radio':
        -			case 'submit':
        -				return false;
        -			}
        -
        -			// No point in attempting to focus disabled inputs
        -			return !target.disabled && !target.readOnly;
        -		default:
        -			return (/\bneedsfocus\b/).test(target.className);
        -		}
        -	};
        -
        -
        -	/**
        -	 * Send a click event to the specified element.
        -	 *
        -	 * @param {EventTarget|Element} targetElement
        -	 * @param {Event} event
        -	 */
        -	FastClick.prototype.sendClick = function(targetElement, event) {
        -		var clickEvent, touch;
        -
        -		// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)
        -		if (document.activeElement && document.activeElement !== targetElement) {
        -			document.activeElement.blur();
        -		}
        -
        -		touch = event.changedTouches[0];
        -
        -		// Synthesise a click event, with an extra attribute so it can be tracked
        -		clickEvent = document.createEvent('MouseEvents');
        -		clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
        -		clickEvent.forwardedTouchEvent = true;
        -		targetElement.dispatchEvent(clickEvent);
        -	};
        -
        -	FastClick.prototype.determineEventType = function(targetElement) {
        -
        -		//Issue #159: Android Chrome Select Box does not open with a synthetic click event
        -		if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {
        -			return 'mousedown';
        -		}
        -
        -		return 'click';
        -	};
        -
        -
        -	/**
        -	 * @param {EventTarget|Element} targetElement
        -	 */
        -	FastClick.prototype.focus = function(targetElement) {
        -		var length;
        -
        -		// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.
        -		if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {
        -			length = targetElement.value.length;
        -			targetElement.setSelectionRange(length, length);
        -		} else {
        -			targetElement.focus();
        -		}
        -	};
        -
        -
        -	/**
        -	 * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.
        -	 *
        -	 * @param {EventTarget|Element} targetElement
        -	 */
        -	FastClick.prototype.updateScrollParent = function(targetElement) {
        -		var scrollParent, parentElement;
        -
        -		scrollParent = targetElement.fastClickScrollParent;
        -
        -		// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the
        -		// target element was moved to another parent.
        -		if (!scrollParent || !scrollParent.contains(targetElement)) {
        -			parentElement = targetElement;
        -			do {
        -				if (parentElement.scrollHeight > parentElement.offsetHeight) {
        -					scrollParent = parentElement;
        -					targetElement.fastClickScrollParent = parentElement;
        -					break;
        -				}
        -
        -				parentElement = parentElement.parentElement;
        -			} while (parentElement);
        -		}
        -
        -		// Always update the scroll top tracker if possible.
        -		if (scrollParent) {
        -			scrollParent.fastClickLastScrollTop = scrollParent.scrollTop;
        -		}
        -	};
        -
        -
        -	/**
        -	 * @param {EventTarget} targetElement
        -	 * @returns {Element|EventTarget}
        -	 */
        -	FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {
        -
        -		// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.
        -		if (eventTarget.nodeType === Node.TEXT_NODE) {
        -			return eventTarget.parentNode;
        -		}
        -
        -		return eventTarget;
        -	};
        -
        -
        -	/**
        -	 * On touch start, record the position and scroll offset.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onTouchStart = function(event) {
        -		var targetElement, touch, selection;
        -
        -		// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).
        -		if (event.targetTouches.length > 1) {
        -			return true;
        -		}
        -
        -		targetElement = this.getTargetElementFromEventTarget(event.target);
        -		touch = event.targetTouches[0];
        -
        -		if (deviceIsIOS) {
        -
        -			// Only trusted events will deselect text on iOS (issue #49)
        -			selection = window.getSelection();
        -			if (selection.rangeCount && !selection.isCollapsed) {
        -				return true;
        -			}
        -
        -			if (!deviceIsIOS4) {
        -
        -				// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):
        -				// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched
        -				// with the same identifier as the touch event that previously triggered the click that triggered the alert.
        -				// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an
        -				// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.
        -				// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,
        -				// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,
        -				// random integers, it's safe to to continue if the identifier is 0 here.
        -				if (touch.identifier && touch.identifier === this.lastTouchIdentifier) {
        -					event.preventDefault();
        -					return false;
        -				}
        -
        -				this.lastTouchIdentifier = touch.identifier;
        -
        -				// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:
        -				// 1) the user does a fling scroll on the scrollable layer
        -				// 2) the user stops the fling scroll with another tap
        -				// then the event.target of the last 'touchend' event will be the element that was under the user's finger
        -				// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check
        -				// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).
        -				this.updateScrollParent(targetElement);
        -			}
        -		}
        -
        -		this.trackingClick = true;
        -		this.trackingClickStart = event.timeStamp;
        -		this.targetElement = targetElement;
        -
        -		this.touchStartX = touch.pageX;
        -		this.touchStartY = touch.pageY;
        -
        -		// Prevent phantom clicks on fast double-tap (issue #36)
        -		if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
        -			event.preventDefault();
        -		}
        -
        -		return true;
        -	};
        -
        -
        -	/**
        -	 * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.touchHasMoved = function(event) {
        -		var touch = event.changedTouches[0], boundary = this.touchBoundary;
        -
        -		if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {
        -			return true;
        -		}
        -
        -		return false;
        -	};
        -
        -
        -	/**
        -	 * Update the last position.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onTouchMove = function(event) {
        -		if (!this.trackingClick) {
        -			return true;
        -		}
        -
        -		// If the touch has moved, cancel the click tracking
        -		if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {
        -			this.trackingClick = false;
        -			this.targetElement = null;
        -		}
        -
        -		return true;
        -	};
        -
        -
        -	/**
        -	 * Attempt to find the labelled control for the given label element.
        -	 *
        -	 * @param {EventTarget|HTMLLabelElement} labelElement
        -	 * @returns {Element|null}
        -	 */
        -	FastClick.prototype.findControl = function(labelElement) {
        -
        -		// Fast path for newer browsers supporting the HTML5 control attribute
        -		if (labelElement.control !== undefined) {
        -			return labelElement.control;
        -		}
        -
        -		// All browsers under test that support touch events also support the HTML5 htmlFor attribute
        -		if (labelElement.htmlFor) {
        -			return document.getElementById(labelElement.htmlFor);
        -		}
        -
        -		// If no for attribute exists, attempt to retrieve the first labellable descendant element
        -		// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label
        -		return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');
        -	};
        -
        -
        -	/**
        -	 * On touch end, determine whether to send a click event at once.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onTouchEnd = function(event) {
        -		var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;
        -
        -		if (!this.trackingClick) {
        -			return true;
        -		}
        -
        -		// Prevent phantom clicks on fast double-tap (issue #36)
        -		if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
        -			this.cancelNextClick = true;
        -			return true;
        -		}
        -
        -		if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {
        -			return true;
        -		}
        -
        -		// Reset to prevent wrong click cancel on input (issue #156).
        -		this.cancelNextClick = false;
        -
        -		this.lastClickTime = event.timeStamp;
        -
        -		trackingClickStart = this.trackingClickStart;
        -		this.trackingClick = false;
        -		this.trackingClickStart = 0;
        -
        -		// On some iOS devices, the targetElement supplied with the event is invalid if the layer
        -		// is performing a transition or scroll, and has to be re-detected manually. Note that
        -		// for this to function correctly, it must be called *after* the event target is checked!
        -		// See issue #57; also filed as rdar://13048589 .
        -		if (deviceIsIOSWithBadTarget) {
        -			touch = event.changedTouches[0];
        -
        -			// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null
        -			targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;
        -			targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;
        -		}
        -
        -		targetTagName = targetElement.tagName.toLowerCase();
        -		if (targetTagName === 'label') {
        -			forElement = this.findControl(targetElement);
        -			if (forElement) {
        -				this.focus(targetElement);
        -				if (deviceIsAndroid) {
        -					return false;
        -				}
        -
        -				targetElement = forElement;
        -			}
        -		} else if (this.needsFocus(targetElement)) {
        -
        -			// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.
        -			// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).
        -			if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
        -				this.targetElement = null;
        -				return false;
        -			}
        -
        -			this.focus(targetElement);
        -			this.sendClick(targetElement, event);
        -
        -			// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.
        -			// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)
        -			if (!deviceIsIOS || targetTagName !== 'select') {
        -				this.targetElement = null;
        -				event.preventDefault();
        -			}
        -
        -			return false;
        -		}
        -
        -		if (deviceIsIOS && !deviceIsIOS4) {
        -
        -			// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled
        -			// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).
        -			scrollParent = targetElement.fastClickScrollParent;
        -			if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {
        -				return true;
        -			}
        -		}
        -
        -		// Prevent the actual click from going though - unless the target node is marked as requiring
        -		// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.
        -		if (!this.needsClick(targetElement)) {
        -			event.preventDefault();
        -			this.sendClick(targetElement, event);
        -		}
        -
        -		return false;
        -	};
        -
        -
        -	/**
        -	 * On touch cancel, stop tracking the click.
        -	 *
        -	 * @returns {void}
        -	 */
        -	FastClick.prototype.onTouchCancel = function() {
        -		this.trackingClick = false;
        -		this.targetElement = null;
        -	};
        -
        -
        -	/**
        -	 * Determine mouse events which should be permitted.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onMouse = function(event) {
        -
        -		// If a target element was never set (because a touch event was never fired) allow the event
        -		if (!this.targetElement) {
        -			return true;
        -		}
        -
        -		if (event.forwardedTouchEvent) {
        -			return true;
        -		}
        -
        -		// Programmatically generated events targeting a specific element should be permitted
        -		if (!event.cancelable) {
        -			return true;
        -		}
        -
        -		// Derive and check the target element to see whether the mouse event needs to be permitted;
        -		// unless explicitly enabled, prevent non-touch click events from triggering actions,
        -		// to prevent ghost/doubleclicks.
        -		if (!this.needsClick(this.targetElement) || this.cancelNextClick) {
        -
        -			// Prevent any user-added listeners declared on FastClick element from being fired.
        -			if (event.stopImmediatePropagation) {
        -				event.stopImmediatePropagation();
        -			} else {
        -
        -				// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
        -				event.propagationStopped = true;
        -			}
        -
        -			// Cancel the event
        -			event.stopPropagation();
        -			event.preventDefault();
        -
        -			return false;
        -		}
        -
        -		// If the mouse event is permitted, return true for the action to go through.
        -		return true;
        -	};
        -
        -
        -	/**
        -	 * On actual clicks, determine whether this is a touch-generated click, a click action occurring
        -	 * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or
        -	 * an actual click which should be permitted.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onClick = function(event) {
        -		var permitted;
        -
        -		// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.
        -		if (this.trackingClick) {
        -			this.targetElement = null;
        -			this.trackingClick = false;
        -			return true;
        -		}
        -
        -		// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.
        -		if (event.target.type === 'submit' && event.detail === 0) {
        -			return true;
        -		}
        -
        -		permitted = this.onMouse(event);
        -
        -		// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.
        -		if (!permitted) {
        -			this.targetElement = null;
        -		}
        -
        -		// If clicks are permitted, return true for the action to go through.
        -		return permitted;
        -	};
        -
        -
        -	/**
        -	 * Remove all FastClick's event listeners.
        -	 *
        -	 * @returns {void}
        -	 */
        -	FastClick.prototype.destroy = function() {
        -		var layer = this.layer;
        -
        -		if (deviceIsAndroid) {
        -			layer.removeEventListener('mouseover', this.onMouse, true);
        -			layer.removeEventListener('mousedown', this.onMouse, true);
        -			layer.removeEventListener('mouseup', this.onMouse, true);
        -		}
        -
        -		layer.removeEventListener('click', this.onClick, true);
        -		layer.removeEventListener('touchstart', this.onTouchStart, false);
        -		layer.removeEventListener('touchmove', this.onTouchMove, false);
        -		layer.removeEventListener('touchend', this.onTouchEnd, false);
        -		layer.removeEventListener('touchcancel', this.onTouchCancel, false);
        -	};
        -
        -
        -	/**
        -	 * Check whether FastClick is needed.
        -	 *
        -	 * @param {Element} layer The layer to listen on
        -	 */
        -	FastClick.notNeeded = function(layer) {
        -		var metaViewport;
        -		var chromeVersion;
        -		var blackberryVersion;
        -		var firefoxVersion;
        -
        -		// Devices that don't support touch don't need FastClick
        -		if (typeof window.ontouchstart === 'undefined') {
        -			return true;
        -		}
        -
        -		// Chrome version - zero for other browsers
        -		chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
        -
        -		if (chromeVersion) {
        -
        -			if (deviceIsAndroid) {
        -				metaViewport = document.querySelector('meta[name=viewport]');
        -
        -				if (metaViewport) {
        -					// Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
        -					if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
        -						return true;
        -					}
        -					// Chrome 32 and above with width=device-width or less don't need FastClick
        -					if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {
        -						return true;
        -					}
        -				}
        -
        -			// Chrome desktop doesn't need FastClick (issue #15)
        -			} else {
        -				return true;
        -			}
        -		}
        -
        -		if (deviceIsBlackBerry10) {
        -			blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/);
        -
        -			// BlackBerry 10.3+ does not require Fastclick library.
        -			// https://github.com/ftlabs/fastclick/issues/251
        -			if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {
        -				metaViewport = document.querySelector('meta[name=viewport]');
        -
        -				if (metaViewport) {
        -					// user-scalable=no eliminates click delay.
        -					if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
        -						return true;
        -					}
        -					// width=device-width (or less than device-width) eliminates click delay.
        -					if (document.documentElement.scrollWidth <= window.outerWidth) {
        -						return true;
        -					}
        -				}
        -			}
        -		}
        -
        -		// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)
        -		if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {
        -			return true;
        -		}
        -
        -		// Firefox version - zero for other browsers
        -		firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
        -
        -		if (firefoxVersion >= 27) {
        -			// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896
        -
        -			metaViewport = document.querySelector('meta[name=viewport]');
        -			if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {
        -				return true;
        -			}
        -		}
        -
        -		// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version
        -		// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx
        -		if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {
        -			return true;
        -		}
        -
        -		return false;
        -	};
        -
        -
        -	/**
        -	 * Factory method for creating a FastClick object
        -	 *
        -	 * @param {Element} layer The layer to listen on
        -	 * @param {Object} [options={}] The options to override the defaults
        -	 */
        -	FastClick.attach = function(layer, options) {
        -		return new FastClick(layer, options);
        -	};
        -
        -
        -	if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {
        -
        -		// AMD. Register as an anonymous module.
        -		define(function() {
        -			return FastClick;
        -		});
        -	} else if (typeof module !== 'undefined' && module.exports) {
        -		module.exports = FastClick.attach;
        -		module.exports.FastClick = FastClick;
        -	} else {
        -		window.FastClick = FastClick;
        -	}
        -}());
        -
        -/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
        - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
        - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
        - *
        - * Version: 1.3.3
        - *
        - */
        -(function ($) {
        -
        -  $.fn.extend({
        -    slimScroll: function (options) {
        -
        -      var defaults = {
        -        // width in pixels of the visible scroll area
        -        width: 'auto',
        -        // height in pixels of the visible scroll area
        -        height: '250px',
        -        // width in pixels of the scrollbar and rail
        -        size: '7px',
        -        // scrollbar color, accepts any hex/color value
        -        color: '#000',
        -        // scrollbar position - left/right
        -        position: 'right',
        -        // distance in pixels between the side edge and the scrollbar
        -        distance: '1px',
        -        // default scroll position on load - top / bottom / $('selector')
        -        start: 'top',
        -        // sets scrollbar opacity
        -        opacity: .4,
        -        // enables always-on mode for the scrollbar
        -        alwaysVisible: false,
        -        // check if we should hide the scrollbar when user is hovering over
        -        disableFadeOut: false,
        -        // sets visibility of the rail
        -        railVisible: false,
        -        // sets rail color
        -        railColor: '#333',
        -        // sets rail opacity
        -        railOpacity: .2,
        -        // whether  we should use jQuery UI Draggable to enable bar dragging
        -        railDraggable: true,
        -        // defautlt CSS class of the slimscroll rail
        -        railClass: 'slimScrollRail',
        -        // defautlt CSS class of the slimscroll bar
        -        barClass: 'slimScrollBar',
        -        // defautlt CSS class of the slimscroll wrapper
        -        wrapperClass: 'slimScrollDiv',
        -        // check if mousewheel should scroll the window if we reach top/bottom
        -        allowPageScroll: false,
        -        // scroll amount applied to each mouse wheel step
        -        wheelStep: 20,
        -        // scroll amount applied when user is using gestures
        -        touchScrollStep: 200,
        -        // sets border radius
        -        borderRadius: '7px',
        -        // sets border radius of the rail
        -        railBorderRadius: '7px'
        -      };
        -
        -      var o = $.extend(defaults, options);
        -
        -      // do it for every element that matches selector
        -      this.each(function () {
        -
        -        var isOverPanel, isOverBar, isDragg, queueHide, touchDif,
        -                barHeight, percentScroll, lastScroll,
        -                divS = '<div></div>',
        -                minBarHeight = 30,
        -                releaseScroll = false;
        -
        -        // used in event handlers and for better minification
        -        var me = $(this);
        -
        -        // ensure we are not binding it again
        -        if (me.parent().hasClass(o.wrapperClass))
        -        {
        -          // start from last bar position
        -          var offset = me.scrollTop();
        -
        -          // find bar and rail
        -          bar = me.parent().find('.' + o.barClass);
        -          rail = me.parent().find('.' + o.railClass);
        -
        -          getBarHeight();
        -
        -          // check if we should scroll existing instance
        -          if ($.isPlainObject(options))
        -          {
        -            // Pass height: auto to an existing slimscroll object to force a resize after contents have changed
        -            if ('height' in options && options.height == 'auto') {
        -              me.parent().css('height', 'auto');
        -              me.css('height', 'auto');
        -              var height = me.parent().parent().height();
        -              me.parent().css('height', height);
        -              me.css('height', height);
        -            }
        -
        -            if ('scrollTo' in options)
        -            {
        -              // jump to a static point
        -              offset = parseInt(o.scrollTo);
        -            }
        -            else if ('scrollBy' in options)
        -            {
        -              // jump by value pixels
        -              offset += parseInt(o.scrollBy);
        -            }
        -            else if ('destroy' in options)
        -            {
        -              // remove slimscroll elements
        -              bar.remove();
        -              rail.remove();
        -              me.unwrap();
        -              return;
        -            }
        -
        -            // scroll content by the given offset
        -            scrollContent(offset, false, true);
        -          }
        -
        -          return;
        -        }
        -        else if ($.isPlainObject(options))
        -        {
        -          if ('destroy' in options)
        -          {
        -            return;
        -          }
        -        }
        -
        -        // optionally set height to the parent's height
        -        o.height = (o.height == 'auto') ? me.parent().height() : o.height;
        -
        -        // wrap content
        -        var wrapper = $(divS)
        -                .addClass(o.wrapperClass)
        -                .css({
        -                  position: 'relative',
        -                  overflow: 'hidden',
        -                  width: o.width,
        -                  height: o.height
        -                });
        -
        -        // update style for the div
        -        me.css({
        -          overflow: 'hidden',
        -          width: o.width,
        -          height: o.height,
        -          //Fix for IE10
        -          "-ms-touch-action": "none"
        -        });
        -
        -        // create scrollbar rail
        -        var rail = $(divS)
        -                .addClass(o.railClass)
        -                .css({
        -                  width: o.size,
        -                  height: '100%',
        -                  position: 'absolute',
        -                  top: 0,
        -                  display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',
        -                  'border-radius': o.railBorderRadius,
        -                  background: o.railColor,
        -                  opacity: o.railOpacity,
        -                  zIndex: 90
        -                });
        -
        -        // create scrollbar
        -        var bar = $(divS)
        -                .addClass(o.barClass)
        -                .css({
        -                  background: o.color,
        -                  width: o.size,
        -                  position: 'absolute',
        -                  top: 0,
        -                  opacity: o.opacity,
        -                  display: o.alwaysVisible ? 'block' : 'none',
        -                  'border-radius': o.borderRadius,
        -                  BorderRadius: o.borderRadius,
        -                  MozBorderRadius: o.borderRadius,
        -                  WebkitBorderRadius: o.borderRadius,
        -                  zIndex: 99
        -                });
        -
        -        // set position
        -        var posCss = (o.position == 'right') ? {right: o.distance} : {left: o.distance};
        -        rail.css(posCss);
        -        bar.css(posCss);
        -
        -        // wrap it
        -        me.wrap(wrapper);
        -
        -        // append to parent div
        -        me.parent().append(bar);
        -        me.parent().append(rail);
        -
        -        // make it draggable and no longer dependent on the jqueryUI
        -        if (o.railDraggable) {
        -          bar.bind("mousedown", function (e) {
        -            var $doc = $(document);
        -            isDragg = true;
        -            t = parseFloat(bar.css('top'));
        -            pageY = e.pageY;
        -
        -            $doc.bind("mousemove.slimscroll", function (e) {
        -              currTop = t + e.pageY - pageY;
        -              bar.css('top', currTop);
        -              scrollContent(0, bar.position().top, false);// scroll content
        -            });
        -
        -            $doc.bind("mouseup.slimscroll", function (e) {
        -              isDragg = false;
        -              hideBar();
        -              $doc.unbind('.slimscroll');
        -            });
        -            return false;
        -          }).bind("selectstart.slimscroll", function (e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -            return false;
        -          });
        -        }
        -
        -        // on rail over
        -        rail.hover(function () {
        -          showBar();
        -        }, function () {
        -          hideBar();
        -        });
        -
        -        // on bar over
        -        bar.hover(function () {
        -          isOverBar = true;
        -        }, function () {
        -          isOverBar = false;
        -        });
        -
        -        // show on parent mouseover
        -        me.hover(function () {
        -          isOverPanel = true;
        -          showBar();
        -          hideBar();
        -        }, function () {
        -          isOverPanel = false;
        -          hideBar();
        -        });
        -
        -        if (window.navigator.msPointerEnabled) {          
        -          // support for mobile
        -          me.bind('MSPointerDown', function (e, b) {
        -            if (e.originalEvent.targetTouches.length)
        -            {
        -              // record where touch started
        -              touchDif = e.originalEvent.targetTouches[0].pageY;
        -            }
        -          });
        -
        -          me.bind('MSPointerMove', function (e) {
        -            // prevent scrolling the page if necessary
        -            e.originalEvent.preventDefault();
        -            if (e.originalEvent.targetTouches.length)
        -            {
        -              // see how far user swiped
        -              var diff = (touchDif - e.originalEvent.targetTouches[0].pageY) / o.touchScrollStep;
        -              // scroll content
        -              scrollContent(diff, true);
        -              touchDif = e.originalEvent.targetTouches[0].pageY;
        -              
        -            }
        -          });
        -        } else {
        -          // support for mobile
        -          me.bind('touchstart', function (e, b) {
        -            if (e.originalEvent.touches.length)
        -            {
        -              // record where touch started
        -              touchDif = e.originalEvent.touches[0].pageY;
        -            }
        -          });
        -
        -          me.bind('touchmove', function (e) {
        -            // prevent scrolling the page if necessary
        -            if (!releaseScroll)
        -            {
        -              e.originalEvent.preventDefault();
        -            }
        -            if (e.originalEvent.touches.length)
        -            {
        -              // see how far user swiped
        -              var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;
        -              // scroll content
        -              scrollContent(diff, true);
        -              touchDif = e.originalEvent.touches[0].pageY;
        -            }
        -          });
        -        }
        -
        -        // set up initial height
        -        getBarHeight();
        -
        -        // check start position
        -        if (o.start === 'bottom')
        -        {
        -          // scroll content to bottom
        -          bar.css({top: me.outerHeight() - bar.outerHeight()});
        -          scrollContent(0, true);
        -        }
        -        else if (o.start !== 'top')
        -        {
        -          // assume jQuery selector
        -          scrollContent($(o.start).position().top, null, true);
        -
        -          // make sure bar stays hidden
        -          if (!o.alwaysVisible) {
        -            bar.hide();
        -          }
        -        }
        -
        -        // attach scroll events
        -        attachWheel();
        -
        -        function _onWheel(e)
        -        {
        -          // use mouse wheel only when mouse is over
        -          if (!isOverPanel) {
        -            return;
        -          }
        -
        -          var e = e || window.event;
        -
        -          var delta = 0;
        -          if (e.wheelDelta) {
        -            delta = -e.wheelDelta / 120;
        -          }
        -          if (e.detail) {
        -            delta = e.detail / 3;
        -          }
        -
        -          var target = e.target || e.srcTarget || e.srcElement;
        -          if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {
        -            // scroll content
        -            scrollContent(delta, true);
        -          }
        -
        -          // stop window scroll
        -          if (e.preventDefault && !releaseScroll) {
        -            e.preventDefault();
        -          }
        -          if (!releaseScroll) {
        -            e.returnValue = false;
        -          }
        -        }
        -
        -        function scrollContent(y, isWheel, isJump)
        -        {
        -          releaseScroll = false;
        -          var delta = y;
        -          var maxTop = me.outerHeight() - bar.outerHeight();
        -
        -          if (isWheel)
        -          {
        -            // move bar with mouse wheel
        -            delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();
        -
        -            // move bar, make sure it doesn't go out
        -            delta = Math.min(Math.max(delta, 0), maxTop);
        -
        -            // if scrolling down, make sure a fractional change to the
        -            // scroll position isn't rounded away when the scrollbar's CSS is set
        -            // this flooring of delta would happened automatically when
        -            // bar.css is set below, but we floor here for clarity
        -            delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);
        -
        -            // scroll the scrollbar
        -            bar.css({top: delta + 'px'});
        -          }
        -
        -          // calculate actual scroll amount
        -          percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());
        -          delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
        -
        -          if (isJump)
        -          {
        -            delta = y;
        -            var offsetTop = delta / me[0].scrollHeight * me.outerHeight();
        -            offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);
        -            bar.css({top: offsetTop + 'px'});
        -          }
        -
        -          // scroll content
        -          me.scrollTop(delta);
        -
        -          // fire scrolling event
        -          me.trigger('slimscrolling', ~~delta);
        -
        -          // ensure bar is visible
        -          showBar();
        -
        -          // trigger hide when scroll is stopped
        -          hideBar();
        -        }
        -
        -        function attachWheel()
        -        {
        -          if (window.addEventListener)
        -          {
        -            this.addEventListener('DOMMouseScroll', _onWheel, false);
        -            this.addEventListener('mousewheel', _onWheel, false);
        -          }
        -          else
        -          {
        -            document.attachEvent("onmousewheel", _onWheel)
        -          }
        -        }
        -
        -        function getBarHeight()
        -        {
        -          // calculate scrollbar height and make sure it is not too small
        -          barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
        -          bar.css({height: barHeight + 'px'});
        -
        -          // hide scrollbar if content is not long enough
        -          var display = barHeight == me.outerHeight() ? 'none' : 'block';
        -          bar.css({display: display});
        -        }
        -
        -        function showBar()
        -        {
        -          // recalculate bar height
        -          getBarHeight();
        -          clearTimeout(queueHide);
        -
        -          // when bar reached top or bottom
        -          if (percentScroll == ~~percentScroll)
        -          {
        -            //release wheel
        -            releaseScroll = o.allowPageScroll;
        -
        -            // publish approporiate event
        -            if (lastScroll != percentScroll)
        -            {
        -              var msg = (~~percentScroll == 0) ? 'top' : 'bottom';
        -              me.trigger('slimscroll', msg);
        -            }
        -          }
        -          else
        -          {
        -            releaseScroll = false;
        -          }
        -          lastScroll = percentScroll;
        -
        -          // show only when required
        -          if (barHeight >= me.outerHeight()) {
        -            //allow window scroll
        -            releaseScroll = true;
        -            return;
        -          }
        -          bar.stop(true, true).fadeIn('fast');
        -          if (o.railVisible) {
        -            rail.stop(true, true).fadeIn('fast');
        -          }
        -        }
        -
        -        function hideBar()
        -        {
        -          // only hide when options allow it
        -          if (!o.alwaysVisible)
        -          {
        -            queueHide = setTimeout(function () {
        -              if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
        -              {
        -                bar.fadeOut('slow');
        -                rail.fadeOut('slow');
        -              }
        -            }, 1000);
        -          }
        -        }
        -
        -      });
        -
        -      // maintain chainability
        -      return this;
        -    }
        -  });
        -
        -  $.fn.extend({
        -    slimscroll: $.fn.slimScroll
        -  });
        -
        -})(jQuery);
        -
        -/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){return n.apply(b,v.call(arguments,0).concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice;this.listeners=this.listeners||{},a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),this.$results.append(d)},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")});var f=e.filter("[aria-selected=true]");f.length>0?f.first().trigger("mouseenter"):e.first().trigger("mouseenter")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";{a(h)}this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b){var c=this,d=b.id+"-results";this.$results.attr("id",d),b.on("results:all",function(a){c.clear(),c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("results:append",function(a){c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("query",function(a){c.showLoading(a)}),b.on("select",function(){b.isOpen()&&c.setClasses()}),b.on("unselect",function(){b.isOpen()&&c.setClasses()}),b.on("open",function(){c.$results.attr("aria-expanded","true"),c.$results.attr("aria-hidden","false"),c.setClasses(),c.ensureHighlightVisible()}),b.on("close",function(){c.$results.attr("aria-expanded","false"),c.$results.attr("aria-hidden","true"),c.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=c.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=c.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?c.trigger("close"):c.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a);if(0!==d){var e=d-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top,h=f.offset().top,i=c.$results.scrollTop()+(h-g);0===e?c.$results.scrollTop(0):0>h-g&&c.$results.scrollTop(i)}}),b.on("results:next",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a),e=d+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top+c.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=c.$results.scrollTop()+h-g;0===e?c.$results.scrollTop(0):h>g&&c.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){c.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=c.$results.scrollTop(),d=c.$results.get(0).scrollHeight-c.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&d<=c.$results.height();e?(c.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(c.$results.scrollTop(c.$results.get(0).scrollHeight-c.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var d=a(this),e=d.data("data");return"true"===d.attr("aria-selected")?void(c.options.get("multiple")?c.trigger("unselect",{originalEvent:b,data:e}):c.trigger("close")):void c.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(){var b=a(this).data("data");c.getHighlightedResults().removeClass("select2-results__option--highlighted"),c.trigger("results:focus",{data:b,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a){var b=this,d=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){b.trigger("focus",a)}),this.$selection.on("blur",function(a){b.trigger("blur",a)}),this.$selection.on("keydown",function(a){b.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){b.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){b.update(a.data)}),a.on("open",function(){b.$selection.attr("aria-expanded","true"),b.$selection.attr("aria-owns",d),b._attachCloseHandler(a)}),a.on("close",function(){b.$selection.attr("aria-expanded","false"),b.$selection.removeAttr("aria-activedescendant"),b.$selection.removeAttr("aria-owns"),b.$selection.focus(),b._detachCloseHandler(a)}),a.on("enable",function(){b.$selection.attr("tabindex",b._tabindex)}),a.on("disable",function(){b.$selection.attr("tabindex","-1")})},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},d.prototype.bind=function(a){var b=this;d.__super__.bind.apply(this,arguments);var c=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",c),this.$selection.attr("aria-labelledby",c),this.$selection.on("mousedown",function(a){1===a.which&&b.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(){}),this.$selection.on("blur",function(){}),a.on("selection:update",function(a){b.update(a.data)})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){return a("<span></span>")},d.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.display(b),d=this.$selection.find(".select2-selection__rendered");d.empty().append(c),d.prop("title",b.title||b.text)},d}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(){var b=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){b.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(c){var d=a(this),e=d.parent(),f=e.data("data");b.trigger("unselect",{originalEvent:c,data:f})})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.display(e),g=this.selectionContainer();g.append(f),g.prop("title",e.title||e.text),g.data("data",e),b.push(g)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(){function a(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},a.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},a}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle")}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus()}),b.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.focus()}),b.on("enable",function(){e.$search.prop("disabled",!1)}),b.on("disable",function(){e.$search.prop("disabled",!0)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e.trigger("blur",a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}}),this.$selection.on("input",".select2-search--inline",function(){e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input",".select2-search--inline",function(a){e.handleSearch(a)})},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.trigger("open"),this.$search.val(b.text+" ")},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a){var b=this;this.container=a,a.on("select",function(a){b.select(a.data)}),a.on("unselect",function(a){b.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};
        -if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=(c.extend(!0,{},l,j),this.option(l));k.replaceWith(m)}else{var n=this.option(j);if(j.children){var o=this.convertToOptions(j.children);b.appendMany(n,o)}h.push(n)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(b,c){this.ajaxOptions=this._applyDefaults(c.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),a.__super__.constructor.call(this,b,c)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return{q:a.term}},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url(a)),"function"==typeof f.data&&(f.data=f.data(a)),this.ajaxOptions.delay&&""!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g<e.length;g++){var h=e[g],i=this._normalizeItem(h),j=this.option(i);this.$element.append(j)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(){var b=(this._lastTag,this.$element.find("option[data-select2-tag]"));b.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(a,b,c){function d(a){e.select(a)}var e=this;b.term=b.term||"";var f=this.tokenizer(b,this.options,d);f.term!==b.term&&(this.$search.length&&(this.$search.val(f.term),this.$search.focus()),b.term=f.term),a.call(this,b,c)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);e(m),g=g.substr(h+1)||"",h=0}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.position=function(){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a){function b(){}return b.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},b.prototype.handleSearch=function(){if(!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},b.prototype.showSearch=function(){return!0},b}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="option load-more" role="treeitem"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(a,b,c){this.$dropdownParent=c.get("dropdownParent")||document.body,a.call(this,b,c)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c){var d=this,e="scroll.select2."+c.id,f="resize.select2."+c.id,g="orientationchange.select2."+c.id,h=this.$container.parents().filter(b.hasScroll);h.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),h.on(e,function(){var b=a(this).data("select2-scroll-position");a(this).scrollTop(b.y)}),a(window).on(e+" "+f+" "+g,function(){d._positionDropdown(),d._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c){var d="scroll.select2."+c.id,e="resize.select2."+c.id,f="orientationchange.select2."+c.id,g=this.$container.parents().filter(b.hasScroll);g.off(d),a(window).off(d+" "+e+" "+f)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom};c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){this.$dropdownContainer.width();var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(){d._handleSelectOnClose()})},a.prototype._handleSelectOnClose=function(){var a=this.getHighlightedResults();a.length<1||this.trigger("select",{data:a.data("data")})},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close")},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend({},this.defaults,l),null==l.dataAdapter){if(l.dataAdapter=null!=l.ajax?o:null!=l.data?n:m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.selectionAdapter=l.multiple?e:d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(this.options.dir=a.prop("dir")?a.prop("dir"):a.closest("[dir]").prop("dir")?a.closest("[dir]").prop("dir"):"ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("focus",function(){a.$container.addClass("select2-container--focus")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open"),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ENTER?(a.trigger("results:select"),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle"),b.preventDefault()):c===d.UP?(a.trigger("results:previous"),b.preventDefault()):c===d.DOWN?(a.trigger("results:next"),b.preventDefault()):(c===d.ESC||c===d.TAB)&&(a.close(),b.preventDefault()):(c===d.ENTER||c===d.SPACE||(c===d.DOWN||c===d.UP)&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable")):this.trigger("enable")},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||(this.trigger("query",{}),this.trigger("open"))},e.prototype.close=function(){this.isOpen()&&this.trigger("close")},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get("multiple")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger("change")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger("change")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];
        -b.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger("change")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],"data")});this._currentData.push.apply(this._currentData,d)},b}),b.define("select2/compat/matcher",["jquery"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||""===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define("select2/compat/query",[],function(){function a(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get("query");d.call(null,b)},a}),b.define("select2/dropdown/attachContainer",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(".dropdown-wrapper");d.append(b),b.addClass("select2-dropdown--below"),c.addClass("select2-container--below")},a}),b.define("select2/dropdown/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("select2/selection/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("jquery.select2",["jquery","require","./select2/core","./select2/defaults"],function(a,b,c,d){if(b("jquery.mousewheel"),null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){{var d=a.extend({},b,!0);new c(a(this),d)}}),this;if("string"==typeof b){var d=this.data("select2");null==d&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2.");var f=Array.prototype.slice.call(arguments,1),g=d[b](f);return a.inArray(b,e)>-1?this:g}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),function(c){"function"==typeof b.define&&b.define.amd?b.define("jquery.mousewheel",["jquery"],c):"object"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
        -/*!
        - * Bootstrap Colorpicker
        - * http://mjolnic.github.io/bootstrap-colorpicker/
        - *
        - * Originally written by (c) 2012 Stefan Petre
        - * Licensed under the Apache License v2.0
        - * http://www.apache.org/licenses/LICENSE-2.0.txt
        - *
        - * @todo Update DOCS
        - */
        -(function($) {
        -    'use strict';
        -
        -    // Color object
        -    var Color = function(val) {
        -        this.value = {
        -            h: 0,
        -            s: 0,
        -            b: 0,
        -            a: 1
        -        };
        -        this.origFormat = null; // original string format
        -        if (val) {
        -            if (val.toLowerCase !== undefined) {
        -                this.setColor(val);
        -            } else if (val.h !== undefined) {
        -                this.value = val;
        -            }
        -        }
        -    };
        -
        -    Color.prototype = {
        -        constructor: Color,
        -        _sanitizeNumber: function(val) {
        -            if (typeof val === 'number') {
        -                return val;
        -            }
        -            if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {
        -                return 1;
        -            }
        -            if (val.toLowerCase !== undefined) {
        -                return parseFloat(val);
        -            }
        -            return 1;
        -        },
        -        //parse a string to HSB
        -        setColor: function(strVal) {
        -            strVal = strVal.toLowerCase();
        -            this.value = this.stringToHSB(strVal) ||  {
        -                h: 0,
        -                s: 0,
        -                b: 0,
        -                a: 1
        -            };
        -        },
        -        stringToHSB: function(strVal) {
        -            strVal = strVal.toLowerCase();
        -            var that = this,
        -                result = false;
        -            $.each(this.stringParsers, function(i, parser) {
        -                var match = parser.re.exec(strVal),
        -                    values = match && parser.parse.apply(that, [match]),
        -                    format = parser.format || 'rgba';
        -                if (values) {
        -                    if (format.match(/hsla?/)) {
        -                        result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));
        -                    } else {
        -                        result = that.RGBtoHSB.apply(that, values);
        -                    }
        -                    that.origFormat = format;
        -                    return false;
        -                }
        -                return true;
        -            });
        -            return result;
        -        },
        -        setHue: function(h) {
        -            this.value.h = 1 - h;
        -        },
        -        setSaturation: function(s) {
        -            this.value.s = s;
        -        },
        -        setBrightness: function(b) {
        -            this.value.b = 1 - b;
        -        },
        -        setAlpha: function(a) {
        -            this.value.a = parseInt((1 - a) * 100, 10) / 100;
        -        },
        -        toRGB: function(h, s, v, a) {
        -            h = h || this.value.h;
        -            s = s || this.value.s;
        -            v = v || this.value.b;
        -            a = a || this.value.a;
        -
        -            var r, g, b, i, f, p, q, t;
        -            if (h && s === undefined && v === undefined) {
        -                s = h.s, v = h.v, h = h.h;
        -            }
        -            i = Math.floor(h * 6);
        -            f = h * 6 - i;
        -            p = v * (1 - s);
        -            q = v * (1 - f * s);
        -            t = v * (1 - (1 - f) * s);
        -            switch (i % 6) {
        -                case 0:
        -                    r = v, g = t, b = p;
        -                    break;
        -                case 1:
        -                    r = q, g = v, b = p;
        -                    break;
        -                case 2:
        -                    r = p, g = v, b = t;
        -                    break;
        -                case 3:
        -                    r = p, g = q, b = v;
        -                    break;
        -                case 4:
        -                    r = t, g = p, b = v;
        -                    break;
        -                case 5:
        -                    r = v, g = p, b = q;
        -                    break;
        -            }
        -            return {
        -                r: Math.floor(r * 255),
        -                g: Math.floor(g * 255),
        -                b: Math.floor(b * 255),
        -                a: a
        -            };
        -        },
        -        toHex: function(h, s, b, a) {
        -            var rgb = this.toRGB(h, s, b, a);
        -            return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
        -        },
        -        toHSL: function(h, s, b, a) {
        -            h = h || this.value.h;
        -            s = s || this.value.s;
        -            b = b || this.value.b;
        -            a = a || this.value.a;
        -
        -            var H = h,
        -                L = (2 - s) * b,
        -                S = s * b;
        -            if (L > 0 && L <= 1) {
        -                S /= L;
        -            } else {
        -                S /= 2 - L;
        -            }
        -            L /= 2;
        -            if (S > 1) {
        -                S = 1;
        -            }
        -            return {
        -                h: H,
        -                s: S,
        -                l: L,
        -                a: a
        -            };
        -        },
        -        RGBtoHSB: function(r, g, b, a) {
        -            r /= 255;
        -            g /= 255;
        -            b /= 255;
        -
        -            var H, S, V, C;
        -            V = Math.max(r, g, b);
        -            C = V - Math.min(r, g, b);
        -            H = (C === 0 ? null :
        -                V === r ? (g - b) / C :
        -                V === g ? (b - r) / C + 2 :
        -                (r - g) / C + 4
        -            );
        -            H = ((H + 360) % 6) * 60 / 360;
        -            S = C === 0 ? 0 : C / V;
        -            return {
        -                h: this._sanitizeNumber(H),
        -                s: S,
        -                b: V,
        -                a: this._sanitizeNumber(a)
        -            };
        -        },
        -        HueToRGB: function(p, q, h) {
        -            if (h < 0) {
        -                h += 1;
        -            } else if (h > 1) {
        -                h -= 1;
        -            }
        -            if ((h * 6) < 1) {
        -                return p + (q - p) * h * 6;
        -            } else if ((h * 2) < 1) {
        -                return q;
        -            } else if ((h * 3) < 2) {
        -                return p + (q - p) * ((2 / 3) - h) * 6;
        -            } else {
        -                return p;
        -            }
        -        },
        -        HSLtoRGB: function(h, s, l, a) {
        -            if (s < 0) {
        -                s = 0;
        -            }
        -            var q;
        -            if (l <= 0.5) {
        -                q = l * (1 + s);
        -            } else {
        -                q = l + s - (l * s);
        -            }
        -
        -            var p = 2 * l - q;
        -
        -            var tr = h + (1 / 3);
        -            var tg = h;
        -            var tb = h - (1 / 3);
        -
        -            var r = Math.round(this.HueToRGB(p, q, tr) * 255);
        -            var g = Math.round(this.HueToRGB(p, q, tg) * 255);
        -            var b = Math.round(this.HueToRGB(p, q, tb) * 255);
        -            return [r, g, b, this._sanitizeNumber(a)];
        -        },
        -        toString: function(format) {
        -            format = format ||  'rgba';
        -            switch (format) {
        -                case 'rgb':
        -                    {
        -                        var rgb = this.toRGB();
        -                        return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';
        -                    }
        -                    break;
        -                case 'rgba':
        -                    {
        -                        var rgb = this.toRGB();
        -                        return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')';
        -                    }
        -                    break;
        -                case 'hsl':
        -                    {
        -                        var hsl = this.toHSL();
        -                        return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)';
        -                    }
        -                    break;
        -                case 'hsla':
        -                    {
        -                        var hsl = this.toHSL();
        -                        return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')';
        -                    }
        -                    break;
        -                case 'hex':
        -                    {
        -                        return this.toHex();
        -                    }
        -                    break;
        -                default:
        -                    {
        -                        return false;
        -                    }
        -                    break;
        -            }
        -        },
        -        // a set of RE's that can match strings and generate color tuples.
        -        // from John Resig color plugin
        -        // https://github.com/jquery/jquery-color/
        -        stringParsers: [{
        -            re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
        -            format: 'hex',
        -            parse: function(execResult) {
        -                return [
        -                    parseInt(execResult[1], 16),
        -                    parseInt(execResult[2], 16),
        -                    parseInt(execResult[3], 16),
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,
        -            format: 'hex',
        -            parse: function(execResult) {
        -                return [
        -                    parseInt(execResult[1] + execResult[1], 16),
        -                    parseInt(execResult[2] + execResult[2], 16),
        -                    parseInt(execResult[3] + execResult[3], 16),
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,
        -            format: 'rgb',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1],
        -                    execResult[2],
        -                    execResult[3],
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
        -            format: 'rgb',
        -            parse: function(execResult) {
        -                return [
        -                    2.55 * execResult[1],
        -                    2.55 * execResult[2],
        -                    2.55 * execResult[3],
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
        -            format: 'rgba',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1],
        -                    execResult[2],
        -                    execResult[3],
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
        -            format: 'rgba',
        -            parse: function(execResult) {
        -                return [
        -                    2.55 * execResult[1],
        -                    2.55 * execResult[2],
        -                    2.55 * execResult[3],
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
        -            format: 'hsl',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1] / 360,
        -                    execResult[2] / 100,
        -                    execResult[3] / 100,
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
        -            format: 'hsla',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1] / 360,
        -                    execResult[2] / 100,
        -                    execResult[3] / 100,
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            //predefined color name
        -            re: /^([a-z]{3,})$/,
        -            format: 'alias',
        -            parse: function(execResult) {
        -                var hexval = this.colorNameToHex(execResult[0]) ||  '#000000';
        -                var match = this.stringParsers[0].re.exec(hexval),
        -                    values = match && this.stringParsers[0].parse.apply(this, [match]);
        -                return values;
        -            }
        -        }],
        -        colorNameToHex: function(name) {
        -            // 140 predefined colors from the HTML Colors spec
        -            var colors = {
        -                "aliceblue": "#f0f8ff",
        -                "antiquewhite": "#faebd7",
        -                "aqua": "#00ffff",
        -                "aquamarine": "#7fffd4",
        -                "azure": "#f0ffff",
        -                "beige": "#f5f5dc",
        -                "bisque": "#ffe4c4",
        -                "black": "#000000",
        -                "blanchedalmond": "#ffebcd",
        -                "blue": "#0000ff",
        -                "blueviolet": "#8a2be2",
        -                "brown": "#a52a2a",
        -                "burlywood": "#deb887",
        -                "cadetblue": "#5f9ea0",
        -                "chartreuse": "#7fff00",
        -                "chocolate": "#d2691e",
        -                "coral": "#ff7f50",
        -                "cornflowerblue": "#6495ed",
        -                "cornsilk": "#fff8dc",
        -                "crimson": "#dc143c",
        -                "cyan": "#00ffff",
        -                "darkblue": "#00008b",
        -                "darkcyan": "#008b8b",
        -                "darkgoldenrod": "#b8860b",
        -                "darkgray": "#a9a9a9",
        -                "darkgreen": "#006400",
        -                "darkkhaki": "#bdb76b",
        -                "darkmagenta": "#8b008b",
        -                "darkolivegreen": "#556b2f",
        -                "darkorange": "#ff8c00",
        -                "darkorchid": "#9932cc",
        -                "darkred": "#8b0000",
        -                "darksalmon": "#e9967a",
        -                "darkseagreen": "#8fbc8f",
        -                "darkslateblue": "#483d8b",
        -                "darkslategray": "#2f4f4f",
        -                "darkturquoise": "#00ced1",
        -                "darkviolet": "#9400d3",
        -                "deeppink": "#ff1493",
        -                "deepskyblue": "#00bfff",
        -                "dimgray": "#696969",
        -                "dodgerblue": "#1e90ff",
        -                "firebrick": "#b22222",
        -                "floralwhite": "#fffaf0",
        -                "forestgreen": "#228b22",
        -                "fuchsia": "#ff00ff",
        -                "gainsboro": "#dcdcdc",
        -                "ghostwhite": "#f8f8ff",
        -                "gold": "#ffd700",
        -                "goldenrod": "#daa520",
        -                "gray": "#808080",
        -                "green": "#008000",
        -                "greenyellow": "#adff2f",
        -                "honeydew": "#f0fff0",
        -                "hotpink": "#ff69b4",
        -                "indianred ": "#cd5c5c",
        -                "indigo ": "#4b0082",
        -                "ivory": "#fffff0",
        -                "khaki": "#f0e68c",
        -                "lavender": "#e6e6fa",
        -                "lavenderblush": "#fff0f5",
        -                "lawngreen": "#7cfc00",
        -                "lemonchiffon": "#fffacd",
        -                "lightblue": "#add8e6",
        -                "lightcoral": "#f08080",
        -                "lightcyan": "#e0ffff",
        -                "lightgoldenrodyellow": "#fafad2",
        -                "lightgrey": "#d3d3d3",
        -                "lightgreen": "#90ee90",
        -                "lightpink": "#ffb6c1",
        -                "lightsalmon": "#ffa07a",
        -                "lightseagreen": "#20b2aa",
        -                "lightskyblue": "#87cefa",
        -                "lightslategray": "#778899",
        -                "lightsteelblue": "#b0c4de",
        -                "lightyellow": "#ffffe0",
        -                "lime": "#00ff00",
        -                "limegreen": "#32cd32",
        -                "linen": "#faf0e6",
        -                "magenta": "#ff00ff",
        -                "maroon": "#800000",
        -                "mediumaquamarine": "#66cdaa",
        -                "mediumblue": "#0000cd",
        -                "mediumorchid": "#ba55d3",
        -                "mediumpurple": "#9370d8",
        -                "mediumseagreen": "#3cb371",
        -                "mediumslateblue": "#7b68ee",
        -                "mediumspringgreen": "#00fa9a",
        -                "mediumturquoise": "#48d1cc",
        -                "mediumvioletred": "#c71585",
        -                "midnightblue": "#191970",
        -                "mintcream": "#f5fffa",
        -                "mistyrose": "#ffe4e1",
        -                "moccasin": "#ffe4b5",
        -                "navajowhite": "#ffdead",
        -                "navy": "#000080",
        -                "oldlace": "#fdf5e6",
        -                "olive": "#808000",
        -                "olivedrab": "#6b8e23",
        -                "orange": "#ffa500",
        -                "orangered": "#ff4500",
        -                "orchid": "#da70d6",
        -                "palegoldenrod": "#eee8aa",
        -                "palegreen": "#98fb98",
        -                "paleturquoise": "#afeeee",
        -                "palevioletred": "#d87093",
        -                "papayawhip": "#ffefd5",
        -                "peachpuff": "#ffdab9",
        -                "peru": "#cd853f",
        -                "pink": "#ffc0cb",
        -                "plum": "#dda0dd",
        -                "powderblue": "#b0e0e6",
        -                "purple": "#800080",
        -                "red": "#ff0000",
        -                "rosybrown": "#bc8f8f",
        -                "royalblue": "#4169e1",
        -                "saddlebrown": "#8b4513",
        -                "salmon": "#fa8072",
        -                "sandybrown": "#f4a460",
        -                "seagreen": "#2e8b57",
        -                "seashell": "#fff5ee",
        -                "sienna": "#a0522d",
        -                "silver": "#c0c0c0",
        -                "skyblue": "#87ceeb",
        -                "slateblue": "#6a5acd",
        -                "slategray": "#708090",
        -                "snow": "#fffafa",
        -                "springgreen": "#00ff7f",
        -                "steelblue": "#4682b4",
        -                "tan": "#d2b48c",
        -                "teal": "#008080",
        -                "thistle": "#d8bfd8",
        -                "tomato": "#ff6347",
        -                "turquoise": "#40e0d0",
        -                "violet": "#ee82ee",
        -                "wheat": "#f5deb3",
        -                "white": "#ffffff",
        -                "whitesmoke": "#f5f5f5",
        -                "yellow": "#ffff00",
        -                "yellowgreen": "#9acd32"
        -            };
        -
        -            if (typeof colors[name.toLowerCase()] !== 'undefined') {
        -                return colors[name.toLowerCase()];
        -            }
        -            return false;
        -        }
        -    };
        -
        -
        -    var defaults = {
        -        horizontal: false, // horizontal mode layout ?
        -        inline: false, //forces to show the colorpicker as an inline element
        -        color: false, //forces a color
        -        format: false, //forces a format
        -        input: 'input', // children input selector
        -        container: false, // container selector
        -        component: '.add-on, .input-group-addon', // children component selector
        -        sliders: {
        -            saturation: {
        -                maxLeft: 100,
        -                maxTop: 100,
        -                callLeft: 'setSaturation',
        -                callTop: 'setBrightness'
        -            },
        -            hue: {
        -                maxLeft: 0,
        -                maxTop: 100,
        -                callLeft: false,
        -                callTop: 'setHue'
        -            },
        -            alpha: {
        -                maxLeft: 0,
        -                maxTop: 100,
        -                callLeft: false,
        -                callTop: 'setAlpha'
        -            }
        -        },
        -        slidersHorz: {
        -            saturation: {
        -                maxLeft: 100,
        -                maxTop: 100,
        -                callLeft: 'setSaturation',
        -                callTop: 'setBrightness'
        -            },
        -            hue: {
        -                maxLeft: 100,
        -                maxTop: 0,
        -                callLeft: 'setHue',
        -                callTop: false
        -            },
        -            alpha: {
        -                maxLeft: 100,
        -                maxTop: 0,
        -                callLeft: 'setAlpha',
        -                callTop: false
        -            }
        -        },
        -        template: '<div class="colorpicker dropdown-menu">' +
        -            '<div class="colorpicker-saturation"><i><b></b></i></div>' +
        -            '<div class="colorpicker-hue"><i></i></div>' +
        -            '<div class="colorpicker-alpha"><i></i></div>' +
        -            '<div class="colorpicker-color"><div /></div>' +
        -            '</div>'
        -    };
        -
        -    var Colorpicker = function(element, options) {
        -        this.element = $(element).addClass('colorpicker-element');
        -        this.options = $.extend({}, defaults, this.element.data(), options);
        -        this.component = this.options.component;
        -        this.component = (this.component !== false) ? this.element.find(this.component) : false;
        -        if (this.component && (this.component.length === 0)) {
        -            this.component = false;
        -        }
        -        this.container = (this.options.container === true) ? this.element : this.options.container;
        -        this.container = (this.container !== false) ? $(this.container) : false;
        -
        -        // Is the element an input? Should we search inside for any input?
        -        this.input = this.element.is('input') ? this.element : (this.options.input ?
        -            this.element.find(this.options.input) : false);
        -        if (this.input && (this.input.length === 0)) {
        -            this.input = false;
        -        }
        -        // Set HSB color
        -        this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());
        -        this.format = this.options.format !== false ? this.options.format : this.color.origFormat;
        -
        -        // Setup picker
        -        this.picker = $(this.options.template);
        -        if (this.options.inline) {
        -            this.picker.addClass('colorpicker-inline colorpicker-visible');
        -        } else {
        -            this.picker.addClass('colorpicker-hidden');
        -        }
        -        if (this.options.horizontal) {
        -            this.picker.addClass('colorpicker-horizontal');
        -        }
        -        if (this.format === 'rgba' || this.format === 'hsla') {
        -            this.picker.addClass('colorpicker-with-alpha');
        -        }
        -        this.picker.on('mousedown.colorpicker', $.proxy(this.mousedown, this));
        -        this.picker.appendTo(this.container ? this.container : $('body'));
        -
        -        // Bind events
        -        if (this.input !== false) {
        -            this.input.on({
        -                'keyup.colorpicker': $.proxy(this.keyup, this)
        -            });
        -            if (this.component === false) {
        -                this.element.on({
        -                    'focus.colorpicker': $.proxy(this.show, this)
        -                });
        -            }
        -            if (this.options.inline === false) {
        -                this.element.on({
        -                    'focusout.colorpicker': $.proxy(this.hide, this)
        -                });
        -            }
        -        }
        -
        -        if (this.component !== false) {
        -            this.component.on({
        -                'click.colorpicker': $.proxy(this.show, this)
        -            });
        -        }
        -
        -        if ((this.input === false) && (this.component === false)) {
        -            this.element.on({
        -                'click.colorpicker': $.proxy(this.show, this)
        -            });
        -        }
        -        this.update();
        -
        -        $($.proxy(function() {
        -            this.element.trigger('create');
        -        }, this));
        -    };
        -
        -    Colorpicker.version = '2.0.0-beta';
        -
        -    Colorpicker.Color = Color;
        -
        -    Colorpicker.prototype = {
        -        constructor: Colorpicker,
        -        destroy: function() {
        -            this.picker.remove();
        -            this.element.removeData('colorpicker').off('.colorpicker');
        -            if (this.input !== false) {
        -                this.input.off('.colorpicker');
        -            }
        -            if (this.component !== false) {
        -                this.component.off('.colorpicker');
        -            }
        -            this.element.removeClass('colorpicker-element');
        -            this.element.trigger({
        -                type: 'destroy'
        -            });
        -        },
        -        reposition: function() {
        -            if (this.options.inline !== false) {
        -                return false;
        -            }
        -            var offset = this.component ? this.component.offset() : this.element.offset();
        -            this.picker.css({
        -                top: offset.top + (this.component ? this.component.outerHeight() : this.element.outerHeight()),
        -                left: offset.left
        -            });
        -        },
        -        show: function(e) {
        -            if (this.isDisabled()) {
        -                return false;
        -            }
        -            this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');
        -            this.reposition();
        -            $(window).on('resize.colorpicker', $.proxy(this.reposition, this));
        -            if (!this.hasInput() && e) {
        -                if (e.stopPropagation && e.preventDefault) {
        -                    e.stopPropagation();
        -                    e.preventDefault();
        -                }
        -            }
        -            if (this.options.inline === false) {
        -                $(window.document).on({
        -                    'mousedown.colorpicker': $.proxy(this.hide, this)
        -                });
        -            }
        -            this.element.trigger({
        -                type: 'showPicker',
        -                color: this.color
        -            });
        -        },
        -        hide: function() {
        -            this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');
        -            $(window).off('resize.colorpicker', this.reposition);
        -            $(document).off({
        -                'mousedown.colorpicker': this.hide
        -            });
        -            this.update();
        -            this.element.trigger({
        -                type: 'hidePicker',
        -                color: this.color
        -            });
        -        },
        -        updateData: function(val) {
        -            val = val ||  this.color.toString(this.format);
        -            this.element.data('color', val);
        -            return val;
        -        },
        -        updateInput: function(val) {
        -            val = val ||  this.color.toString(this.format);
        -            if (this.input !== false) {
        -                this.input.prop('value', val);
        -            }
        -            return val;
        -        },
        -        updatePicker: function(val) {
        -            if (val !== undefined) {
        -                this.color = new Color(val);
        -            }
        -            var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;
        -            var icns = this.picker.find('i');
        -            if (icns.length === 0) {
        -                return;
        -            }
        -            if (this.options.horizontal === false) {
        -                sl = this.options.sliders;
        -                icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()
        -                    .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));
        -            } else {
        -                sl = this.options.slidersHorz;
        -                icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()
        -                    .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));
        -            }
        -            icns.eq(0).css({
        -                'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,
        -                'left': this.color.value.s * sl.saturation.maxLeft
        -            });
        -            this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));
        -            this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());
        -            this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));
        -            return val;
        -        },
        -        updateComponent: function(val) {
        -            val = val ||  this.color.toString(this.format);
        -            if (this.component !== false) {
        -                var icn = this.component.find('i').eq(0);
        -                if (icn.length > 0) {
        -                    icn.css({
        -                        'backgroundColor': val
        -                    });
        -                } else {
        -                    this.component.css({
        -                        'backgroundColor': val
        -                    });
        -                }
        -            }
        -            return val;
        -        },
        -        update: function(force) {
        -            var val = this.updateComponent();
        -            if ((this.getValue(false) !== false) || (force === true)) {
        -                // Update input/data only if the current value is not blank
        -                this.updateInput(val);
        -                this.updateData(val);
        -            }
        -            this.updatePicker();
        -            return val;
        -
        -        },
        -        setValue: function(val) { // set color manually
        -            this.color = new Color(val);
        -            this.update();
        -            this.element.trigger({
        -                type: 'changeColor',
        -                color: this.color,
        -                value: val
        -            });
        -        },
        -        getValue: function(defaultValue) {
        -            defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;
        -            var val;
        -            if (this.hasInput()) {
        -                val = this.input.val();
        -            } else {
        -                val = this.element.data('color');
        -            }
        -            if ((val === undefined) || (val === '') || (val === null)) {
        -                // if not defined or empty, return default
        -                val = defaultValue;
        -            }
        -            return val;
        -        },
        -        hasInput: function() {
        -            return (this.input !== false);
        -        },
        -        isDisabled: function() {
        -            if (this.hasInput()) {
        -                return (this.input.prop('disabled') === true);
        -            }
        -            return false;
        -        },
        -        disable: function() {
        -            if (this.hasInput()) {
        -                this.input.prop('disabled', true);
        -                return true;
        -            }
        -            return false;
        -        },
        -        enable: function() {
        -            if (this.hasInput()) {
        -                this.input.prop('disabled', false);
        -                return true;
        -            }
        -            return false;
        -        },
        -        currentSlider: null,
        -        mousePointer: {
        -            left: 0,
        -            top: 0
        -        },
        -        mousedown: function(e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -
        -            var target = $(e.target);
        -
        -            //detect the slider and set the limits and callbacks
        -            var zone = target.closest('div');
        -            var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;
        -            if (!zone.is('.colorpicker')) {
        -                if (zone.is('.colorpicker-saturation')) {
        -                    this.currentSlider = $.extend({}, sl.saturation);
        -                } else if (zone.is('.colorpicker-hue')) {
        -                    this.currentSlider = $.extend({}, sl.hue);
        -                } else if (zone.is('.colorpicker-alpha')) {
        -                    this.currentSlider = $.extend({}, sl.alpha);
        -                } else {
        -                    return false;
        -                }
        -                var offset = zone.offset();
        -                //reference to guide's style
        -                this.currentSlider.guide = zone.find('i')[0].style;
        -                this.currentSlider.left = e.pageX - offset.left;
        -                this.currentSlider.top = e.pageY - offset.top;
        -                this.mousePointer = {
        -                    left: e.pageX,
        -                    top: e.pageY
        -                };
        -                //trigger mousemove to move the guide to the current position
        -                $(document).on({
        -                    'mousemove.colorpicker': $.proxy(this.mousemove, this),
        -                    'mouseup.colorpicker': $.proxy(this.mouseup, this)
        -                }).trigger('mousemove');
        -            }
        -            return false;
        -        },
        -        mousemove: function(e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -            var left = Math.max(
        -                0,
        -                Math.min(
        -                    this.currentSlider.maxLeft,
        -                    this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
        -                )
        -            );
        -            var top = Math.max(
        -                0,
        -                Math.min(
        -                    this.currentSlider.maxTop,
        -                    this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
        -                )
        -            );
        -            this.currentSlider.guide.left = left + 'px';
        -            this.currentSlider.guide.top = top + 'px';
        -            if (this.currentSlider.callLeft) {
        -                this.color[this.currentSlider.callLeft].call(this.color, left / 100);
        -            }
        -            if (this.currentSlider.callTop) {
        -                this.color[this.currentSlider.callTop].call(this.color, top / 100);
        -            }
        -            this.update(true);
        -
        -            this.element.trigger({
        -                type: 'changeColor',
        -                color: this.color
        -            });
        -            return false;
        -        },
        -        mouseup: function(e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -            $(document).off({
        -                'mousemove.colorpicker': this.mousemove,
        -                'mouseup.colorpicker': this.mouseup
        -            });
        -            return false;
        -        },
        -        keyup: function(e) {
        -            if ((e.keyCode === 38)) {
        -                if (this.color.value.a < 1) {
        -                    this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;
        -                }
        -                this.update(true);
        -            } else if ((e.keyCode === 40)) {
        -                if (this.color.value.a > 0) {
        -                    this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;
        -                }
        -                this.update(true);
        -            } else {
        -                var val = this.input.val();
        -                this.color = new Color(val);
        -                if (this.getValue(false) !== false) {
        -                    this.updateData();
        -                    this.updateComponent();
        -                    this.updatePicker();
        -                }
        -            }
        -            this.element.trigger({
        -                type: 'changeColor',
        -                color: this.color,
        -                value: val
        -            });
        -        }
        -    };
        -
        -    $.colorpicker = Colorpicker;
        -
        -    $.fn.colorpicker = function(option) {
        -        return this.each(function() {
        -            var $this = $(this),
        -                inst = $this.data('colorpicker'),
        -                options = ((typeof option === 'object') ? option : {});
        -            if ((!inst) && (typeof option !== 'string')) {
        -                $this.data('colorpicker', new Colorpicker(this, options));
        -            } else {
        -                if (typeof option === 'string') {
        -                    inst[option].apply(inst, Array.prototype.slice.call(arguments, 1));
        -                }
        -            }
        -        });
        -    };
        -
        -    $.fn.colorpicker.constructor = Colorpicker;
        -
        -})(window.jQuery);
        -
        -/**
        - * @author zhixin wen <wenzhixin2010@gmail.com>
        - * version: 1.9.1
        - * https://github.com/wenzhixin/bootstrap-table/
        - */
        -
        -!function ($) {
        -    'use strict';
        -
        -    // TOOLS DEFINITION
        -    // ======================
        -
        -    var cachedWidth = null;
        -
        -    // it only does '%s', and return '' when arguments are undefined
        -    var sprintf = function (str) {
        -        var args = arguments,
        -            flag = true,
        -            i = 1;
        -
        -        str = str.replace(/%s/g, function () {
        -            var arg = args[i++];
        -
        -            if (typeof arg === 'undefined') {
        -                flag = false;
        -                return '';
        -            }
        -            return arg;
        -        });
        -        return flag ? str : '';
        -    };
        -
        -    var getPropertyFromOther = function (list, from, to, value) {
        -        var result = '';
        -        $.each(list, function (i, item) {
        -            if (item[from] === value) {
        -                result = item[to];
        -                return false;
        -            }
        -            return true;
        -        });
        -        return result;
        -    };
        -
        -    var getFieldIndex = function (columns, field) {
        -        var index = -1;
        -
        -        $.each(columns, function (i, column) {
        -            if (column.field === field) {
        -                index = i;
        -                return false;
        -            }
        -            return true;
        -        });
        -        return index;
        -    };
        -
        -    // http://jsfiddle.net/wenyi/47nz7ez9/3/
        -    var setFieldIndex = function (columns) {
        -        var i, j, k,
        -            totalCol = 0,
        -            flag = [];
        -
        -        for (i = 0; i < columns[0].length; i++) {
        -            totalCol += columns[0][i].colspan || 1;
        -        }
        -
        -        for (i = 0; i < columns.length; i++) {
        -            flag[i] = [];
        -            for (j = 0; j < totalCol; j++) {
        -                flag[i][j] = false;
        -            }
        -        }
        -
        -        for (i = 0; i < columns.length; i++) {
        -            for (j = 0; j < columns[i].length; j++) {
        -                var r = columns[i][j],
        -                    rowspan = r.rowspan || 1,
        -                    colspan = r.colspan || 1,
        -                    index = $.inArray(false, flag[i]);
        -
        -                if (colspan === 1) {
        -                    r.fieldIndex = index;
        -                    // when field is undefined, use index instead
        -                    if (typeof r.field === 'undefined') {
        -                        r.field = index;
        -                    }
        -                }
        -
        -                for (k = 0; k < rowspan; k++) {
        -                    flag[i + k][index] = true;
        -                }
        -                for (k = 0; k < colspan; k++) {
        -                    flag[i][index + k] = true;
        -                }
        -            }
        -        }
        -    };
        -
        -    var getScrollBarWidth = function () {
        -        if (cachedWidth === null) {
        -            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),
        -                outer = $('<div/>').addClass('fixed-table-scroll-outer'),
        -                w1, w2;
        -
        -            outer.append(inner);
        -            $('body').append(outer);
        -
        -            w1 = inner[0].offsetWidth;
        -            outer.css('overflow', 'scroll');
        -            w2 = inner[0].offsetWidth;
        -
        -            if (w1 === w2) {
        -                w2 = outer[0].clientWidth;
        -            }
        -
        -            outer.remove();
        -            cachedWidth = w1 - w2;
        -        }
        -        return cachedWidth;
        -    };
        -
        -    var calculateObjectValue = function (self, name, args, defaultValue) {
        -        var func = name;
        -
        -        if (typeof name === 'string') {
        -            // support obj.func1.func2
        -            var names = name.split('.');
        -
        -            if (names.length > 1) {
        -                func = window;
        -                $.each(names, function (i, f) {
        -                    func = func[f];
        -                });
        -            } else {
        -                func = window[name];
        -            }
        -        }
        -        if (typeof func === 'object') {
        -            return func;
        -        }
        -        if (typeof func === 'function') {
        -            return func.apply(self, args);
        -        }
        -        if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {
        -            return sprintf.apply(this, [name].concat(args));
        -        }
        -        return defaultValue;
        -    };
        -
        -    var compareObjects = function (objectA, objectB, compareLength) {
        -        // Create arrays of property names
        -        var objectAProperties = Object.getOwnPropertyNames(objectA),
        -            objectBProperties = Object.getOwnPropertyNames(objectB),
        -            propName = '';
        -
        -        if (compareLength) {
        -            // If number of properties is different, objects are not equivalent
        -            if (objectAProperties.length !== objectBProperties.length) {
        -                return false;
        -            }
        -        }
        -
        -        for (var i = 0; i < objectAProperties.length; i++) {
        -            propName = objectAProperties[i];
        -
        -            // If the property is not in the object B properties, continue with the next property
        -            if ($.inArray(propName, objectBProperties) > -1) {
        -                // If values of same property are not equal, objects are not equivalent
        -                if (objectA[propName] !== objectB[propName]) {
        -                    return false;
        -                }
        -            }
        -        }
        -
        -        // If we made it this far, objects are considered equivalent
        -        return true;
        -    };
        -
        -    var escapeHTML = function (text) {
        -        if (typeof text === 'string') {
        -            return text
        -                .replace(/&/g, "&amp;")
        -                .replace(/</g, "&lt;")
        -                .replace(/>/g, "&gt;")
        -                .replace(/"/g, "&quot;")
        -                .replace(/'/g, "&#039;");
        -        }
        -        return text;
        -    };
        -
        -    var getRealHeight = function ($el) {
        -        var height = 0;
        -        $el.children().each(function () {
        -            if (height < $(this).outerHeight(true)) {
        -                height = $(this).outerHeight(true);
        -            }
        -        });
        -        return height;
        -    };
        -
        -    var getRealDataAttr = function (dataAttr) {
        -        for (var attr in dataAttr) {
        -            var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();
        -            if (auxAttr !== attr) {
        -                dataAttr[auxAttr] = dataAttr[attr];
        -                delete dataAttr[attr];
        -            }
        -        }
        -
        -        return dataAttr;
        -    };
        -
        -    var getItemField = function (item, field) {
        -        var value = item;
        -
        -        if (typeof field !== 'string' || item.hasOwnProperty(field)) {
        -            return item[field];
        -        }
        -        var props = field.split('.');
        -        for (var p in props) {
        -            value = value[props[p]];
        -        }
        -        return value;
        -    };
        -
        -    // BOOTSTRAP TABLE CLASS DEFINITION
        -    // ======================
        -
        -    var BootstrapTable = function (el, options) {
        -        this.options = options;
        -        this.$el = $(el);
        -        this.$el_ = this.$el.clone();
        -        this.timeoutId_ = 0;
        -        this.timeoutFooter_ = 0;
        -
        -        this.init();
        -    };
        -
        -    BootstrapTable.DEFAULTS = {
        -        classes: 'table table-hover',
        -        locale: undefined,
        -        height: undefined,
        -        undefinedText: '-',
        -        sortName: undefined,
        -        sortOrder: 'asc',
        -        striped: false,
        -        columns: [[]],
        -        data: [],
        -        dataField: 'rows',
        -        method: 'get',
        -        url: undefined,
        -        ajax: undefined,
        -        cache: true,
        -        contentType: 'application/json',
        -        dataType: 'json',
        -        ajaxOptions: {},
        -        queryParams: function (params) {
        -            return params;
        -        },
        -        queryParamsType: 'limit', // undefined
        -        responseHandler: function (res) {
        -            return res;
        -        },
        -        pagination: false,
        -        onlyInfoPagination: false,
        -        sidePagination: 'client', // client or server
        -        totalRows: 0, // server side need to set
        -        pageNumber: 1,
        -        pageSize: 10,
        -        pageList: [10, 25, 50, 100],
        -        paginationHAlign: 'right', //right, left
        -        paginationVAlign: 'bottom', //bottom, top, both
        -        paginationDetailHAlign: 'left', //right, left
        -        paginationFirstText: '&laquo;',
        -        paginationPreText: '&lsaquo;',
        -        paginationNextText: '&rsaquo;',
        -        paginationLastText: '&raquo;',
        -        search: false,
        -        strictSearch: false,
        -        searchAlign: 'right',
        -        selectItemName: 'btSelectItem',
        -        showHeader: true,
        -        showFooter: false,
        -        showColumns: false,
        -        showPaginationSwitch: false,
        -        showRefresh: false,
        -        showToggle: false,
        -        buttonsAlign: 'right',
        -        smartDisplay: true,
        -        minimumCountColumns: 1,
        -        idField: undefined,
        -        uniqueId: undefined,
        -        cardView: false,
        -        detailView: false,
        -        detailFormatter: function (index, row) {
        -            return '';
        -        },
        -        trimOnSearch: true,
        -        clickToSelect: false,
        -        singleSelect: false,
        -        toolbar: undefined,
        -        toolbarAlign: 'left',
        -        checkboxHeader: true,
        -        sortable: true,
        -        silentSort: true,
        -        maintainSelected: false,
        -        searchTimeOut: 500,
        -        searchText: '',
        -        iconSize: undefined,
        -        iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome)
        -        icons: {
        -            paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',
        -            paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',
        -            refresh: 'glyphicon-refresh icon-refresh',
        -            toggle: 'glyphicon-list-alt icon-list-alt',
        -            columns: 'glyphicon-th icon-th',
        -            detailOpen: 'glyphicon-plus icon-plus',
        -            detailClose: 'glyphicon-minus icon-minus'
        -        },
        -
        -        rowStyle: function (row, index) {
        -            return {};
        -        },
        -
        -        rowAttributes: function (row, index) {
        -            return {};
        -        },
        -
        -        onAll: function (name, args) {
        -            return false;
        -        },
        -        onClickCell: function (field, value, row, $element) {
        -            return false;
        -        },
        -        onDblClickCell: function (field, value, row, $element) {
        -            return false;
        -        },
        -        onClickRow: function (item, $element) {
        -            return false;
        -        },
        -        onDblClickRow: function (item, $element) {
        -            return false;
        -        },
        -        onSort: function (name, order) {
        -            return false;
        -        },
        -        onCheck: function (row) {
        -            return false;
        -        },
        -        onUncheck: function (row) {
        -            return false;
        -        },
        -        onCheckAll: function (rows) {
        -            return false;
        -        },
        -        onUncheckAll: function (rows) {
        -            return false;
        -        },
        -        onCheckSome: function (rows) {
        -            return false;
        -        },
        -        onUncheckSome: function (rows) {
        -            return false;
        -        },
        -        onLoadSuccess: function (data) {
        -            return false;
        -        },
        -        onLoadError: function (status) {
        -            return false;
        -        },
        -        onColumnSwitch: function (field, checked) {
        -            return false;
        -        },
        -        onPageChange: function (number, size) {
        -            return false;
        -        },
        -        onSearch: function (text) {
        -            return false;
        -        },
        -        onToggle: function (cardView) {
        -            return false;
        -        },
        -        onPreBody: function (data) {
        -            return false;
        -        },
        -        onPostBody: function () {
        -            return false;
        -        },
        -        onPostHeader: function () {
        -            return false;
        -        },
        -        onExpandRow: function (index, row, $detail) {
        -            return false;
        -        },
        -        onCollapseRow: function (index, row) {
        -            return false;
        -        },
        -        onRefreshOptions: function (options) {
        -            return false;
        -        },
        -        onResetView: function () {
        -            return false;
        -        }
        -    };
        -
        -    BootstrapTable.LOCALES = [];
        -
        -    BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {
        -        formatLoadingMessage: function () {
        -            return 'Loading, please wait...';
        -        },
        -        formatRecordsPerPage: function (pageNumber) {
        -            return sprintf('%s records per page', pageNumber);
        -        },
        -        formatShowingRows: function (pageFrom, pageTo, totalRows) {
        -            return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows);
        -        },
        -        formatDetailPagination: function (totalRows) {
        -            return sprintf('Showing %s rows', totalRows);
        -        },
        -        formatSearch: function () {
        -            return 'Search';
        -        },
        -        formatNoMatches: function () {
        -            return 'No matching records found';
        -        },
        -        formatPaginationSwitch: function () {
        -            return 'Hide/Show pagination';
        -        },
        -        formatRefresh: function () {
        -            return 'Refresh';
        -        },
        -        formatToggle: function () {
        -            return 'Toggle';
        -        },
        -        formatColumns: function () {
        -            return 'Columns';
        -        },
        -        formatAllRows: function () {
        -            return 'All';
        -        }
        -    };
        -
        -    $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']);
        -
        -    BootstrapTable.COLUMN_DEFAULTS = {
        -        radio: false,
        -        checkbox: false,
        -        checkboxEnabled: true,
        -        field: undefined,
        -        title: undefined,
        -        titleTooltip: undefined,
        -        'class': undefined,
        -        align: undefined, // left, right, center
        -        halign: undefined, // left, right, center
        -        falign: undefined, // left, right, center
        -        valign: undefined, // top, middle, bottom
        -        width: undefined,
        -        sortable: false,
        -        order: 'asc', // asc, desc
        -        visible: true,
        -        switchable: true,
        -        clickToSelect: true,
        -        formatter: undefined,
        -        footerFormatter: undefined,
        -        events: undefined,
        -        sorter: undefined,
        -        sortName: undefined,
        -        cellStyle: undefined,
        -        searchable: true,
        -        searchFormatter: true,
        -        cardVisible: true
        -    };
        -
        -    BootstrapTable.EVENTS = {
        -        'all.bs.table': 'onAll',
        -        'click-cell.bs.table': 'onClickCell',
        -        'dbl-click-cell.bs.table': 'onDblClickCell',
        -        'click-row.bs.table': 'onClickRow',
        -        'dbl-click-row.bs.table': 'onDblClickRow',
        -        'sort.bs.table': 'onSort',
        -        'check.bs.table': 'onCheck',
        -        'uncheck.bs.table': 'onUncheck',
        -        'check-all.bs.table': 'onCheckAll',
        -        'uncheck-all.bs.table': 'onUncheckAll',
        -        'check-some.bs.table': 'onCheckSome',
        -        'uncheck-some.bs.table': 'onUncheckSome',
        -        'load-success.bs.table': 'onLoadSuccess',
        -        'load-error.bs.table': 'onLoadError',
        -        'column-switch.bs.table': 'onColumnSwitch',
        -        'page-change.bs.table': 'onPageChange',
        -        'search.bs.table': 'onSearch',
        -        'toggle.bs.table': 'onToggle',
        -        'pre-body.bs.table': 'onPreBody',
        -        'post-body.bs.table': 'onPostBody',
        -        'post-header.bs.table': 'onPostHeader',
        -        'expand-row.bs.table': 'onExpandRow',
        -        'collapse-row.bs.table': 'onCollapseRow',
        -        'refresh-options.bs.table': 'onRefreshOptions',
        -        'reset-view.bs.table': 'onResetView'
        -    };
        -
        -    BootstrapTable.prototype.init = function () {
        -        this.initLocale();
        -        this.initContainer();
        -        this.initTable();
        -        this.initHeader();
        -        this.initData();
        -        this.initFooter();
        -        this.initToolbar();
        -        this.initPagination();
        -        this.initBody();
        -        this.initSearchText();
        -        this.initServer();
        -    };
        -
        -    BootstrapTable.prototype.initLocale = function () {
        -        if (this.options.locale) {
        -            var parts = this.options.locale.split(/-|_/);
        -            parts[0].toLowerCase();
        -            parts[1] && parts[1].toUpperCase();
        -            if ($.fn.bootstrapTable.locales[this.options.locale]) {
        -                // locale as requested
        -                $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);
        -            } else if ($.fn.bootstrapTable.locales[parts.join('-')]) {
        -                // locale with sep set to - (in case original was specified with _)
        -                $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);
        -            } else if ($.fn.bootstrapTable.locales[parts[0]]) {
        -                // short locale language code (i.e. 'en')
        -                $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initContainer = function () {
        -        this.$container = $([
        -            '<div class="bootstrap-table">',
        -            '<div class="fixed-table-toolbar"></div>',
        -            this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
        -                '<div class="fixed-table-pagination" style="clear: both;"></div>' :
        -                '',
        -            '<div class="fixed-table-container">',
        -            '<div class="fixed-table-header"><table></table></div>',
        -            '<div class="fixed-table-body">',
        -            '<div class="fixed-table-loading">',
        -            this.options.formatLoadingMessage(),
        -            '</div>',
        -            '</div>',
        -            '<div class="fixed-table-footer"><table><tr></tr></table></div>',
        -            this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?
        -                '<div class="fixed-table-pagination"></div>' :
        -                '',
        -            '</div>',
        -            '</div>'
        -        ].join(''));
        -
        -        this.$container.insertAfter(this.$el);
        -        this.$tableContainer = this.$container.find('.fixed-table-container');
        -        this.$tableHeader = this.$container.find('.fixed-table-header');
        -        this.$tableBody = this.$container.find('.fixed-table-body');
        -        this.$tableLoading = this.$container.find('.fixed-table-loading');
        -        this.$tableFooter = this.$container.find('.fixed-table-footer');
        -        this.$toolbar = this.$container.find('.fixed-table-toolbar');
        -        this.$pagination = this.$container.find('.fixed-table-pagination');
        -
        -        this.$tableBody.append(this.$el);
        -        this.$container.after('<div class="clearfix"></div>');
        -
        -        this.$el.addClass(this.options.classes);
        -        if (this.options.striped) {
        -            this.$el.addClass('table-striped');
        -        }
        -        if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) {
        -            this.$tableContainer.addClass('table-no-bordered');
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initTable = function () {
        -        var that = this,
        -            columns = [],
        -            data = [];
        -
        -        this.$header = this.$el.find('>thead');
        -        if (!this.$header.length) {
        -            this.$header = $('<thead></thead>').appendTo(this.$el);
        -        }
        -        this.$header.find('tr').each(function () {
        -            var column = [];
        -
        -            $(this).find('th').each(function () {
        -                column.push($.extend({}, {
        -                    title: $(this).html(),
        -                    'class': $(this).attr('class'),
        -                    titleTooltip: $(this).attr('title'),
        -                    rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,
        -                    colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined
        -                }, $(this).data()));
        -            });
        -            columns.push(column);
        -        });
        -        if (!$.isArray(this.options.columns[0])) {
        -            this.options.columns = [this.options.columns];
        -        }
        -        this.options.columns = $.extend(true, [], columns, this.options.columns);
        -        this.columns = [];
        -
        -        setFieldIndex(this.options.columns);
        -        $.each(this.options.columns, function (i, columns) {
        -            $.each(columns, function (j, column) {
        -                column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column);
        -
        -                if (typeof column.fieldIndex !== 'undefined') {
        -                    that.columns[column.fieldIndex] = column;
        -                }
        -
        -                that.options.columns[i][j] = column;
        -            });
        -        });
        -
        -        // if options.data is setting, do not process tbody data
        -        if (this.options.data.length) {
        -            return;
        -        }
        -
        -        this.$el.find('>tbody>tr').each(function () {
        -            var row = {};
        -
        -            // save tr's id, class and data-* attributes
        -            row._id = $(this).attr('id');
        -            row._class = $(this).attr('class');
        -            row._data = getRealDataAttr($(this).data());
        -
        -            $(this).find('td').each(function (i) {
        -                var field = that.columns[i].field;
        -
        -                row[field] = $(this).html();
        -                // save td's id, class and data-* attributes
        -                row['_' + field + '_id'] = $(this).attr('id');
        -                row['_' + field + '_class'] = $(this).attr('class');
        -                row['_' + field + '_rowspan'] = $(this).attr('rowspan');
        -                row['_' + field + '_title'] = $(this).attr('title');
        -                row['_' + field + '_data'] = getRealDataAttr($(this).data());
        -            });
        -            data.push(row);
        -        });
        -        this.options.data = data;
        -    };
        -
        -    BootstrapTable.prototype.initHeader = function () {
        -        var that = this,
        -            visibleColumns = {},
        -            html = [];
        -
        -        this.header = {
        -            fields: [],
        -            styles: [],
        -            classes: [],
        -            formatters: [],
        -            events: [],
        -            sorters: [],
        -            sortNames: [],
        -            cellStyles: [],
        -            searchables: []
        -        };
        -
        -        $.each(this.options.columns, function (i, columns) {
        -            html.push('<tr>');
        -
        -            if (i == 0 && !that.options.cardView && that.options.detailView) {
        -                html.push(sprintf('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',
        -                    that.options.columns.length));
        -            }
        -
        -            $.each(columns, function (j, column) {
        -                var text = '',
        -                    halign = '', // header align style
        -                    align = '', // body align style
        -                    style = '',
        -                    class_ = sprintf(' class="%s"', column['class']),
        -                    order = that.options.sortOrder || column.order,
        -                    unitWidth = 'px',
        -                    width = column.width;
        -
        -                if (column.width !== undefined && (!that.options.cardView)) {
        -                    if (typeof column.width === 'string') {
        -                        if (column.width.indexOf('%') !== -1) {
        -                            unitWidth = '%';
        -                        }
        -                    }
        -                }
        -                if (column.width && typeof column.width === 'string') {
        -                    width = column.width.replace('%', '').replace('px', '');
        -                }
        -
        -                halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align);
        -                align = sprintf('text-align: %s; ', column.align);
        -                style = sprintf('vertical-align: %s; ', column.valign);
        -                style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ?
        -                    '36px' : (width ? width + unitWidth : undefined));
        -
        -                if (typeof column.fieldIndex !== 'undefined') {
        -                    that.header.fields[column.fieldIndex] = column.field;
        -                    that.header.styles[column.fieldIndex] = align + style;
        -                    that.header.classes[column.fieldIndex] = class_;
        -                    that.header.formatters[column.fieldIndex] = column.formatter;
        -                    that.header.events[column.fieldIndex] = column.events;
        -                    that.header.sorters[column.fieldIndex] = column.sorter;
        -                    that.header.sortNames[column.fieldIndex] = column.sortName;
        -                    that.header.cellStyles[column.fieldIndex] = column.cellStyle;
        -                    that.header.searchables[column.fieldIndex] = column.searchable;
        -
        -                    if (!column.visible) {
        -                        return;
        -                    }
        -
        -                    if (that.options.cardView && (!column.cardVisible)) {
        -                        return;
        -                    }
        -
        -                    visibleColumns[column.field] = column;
        -                }
        -
        -                html.push('<th' + sprintf(' title="%s"', column.titleTooltip),
        -                    column.checkbox || column.radio ?
        -                        sprintf(' class="bs-checkbox %s"', column['class'] || '') :
        -                        class_,
        -                    sprintf(' style="%s"', halign + style),
        -                    sprintf(' rowspan="%s"', column.rowspan),
        -                    sprintf(' colspan="%s"', column.colspan),
        -                    sprintf(' data-field="%s"', column.field),
        -                    "tabindex='0'",
        -                    '>');
        -
        -                html.push(sprintf('<div class="th-inner %s">', that.options.sortable && column.sortable ?
        -                    'sortable both' : ''));
        -
        -                text = column.title;
        -
        -                if (column.checkbox) {
        -                    if (!that.options.singleSelect && that.options.checkboxHeader) {
        -                        text = '<input name="btSelectAll" type="checkbox" />';
        -                    }
        -                    that.header.stateField = column.field;
        -                }
        -                if (column.radio) {
        -                    text = '';
        -                    that.header.stateField = column.field;
        -                    that.options.singleSelect = true;
        -                }
        -
        -                html.push(text);
        -                html.push('</div>');
        -                html.push('<div class="fht-cell"></div>');
        -                html.push('</div>');
        -                html.push('</th>');
        -            });
        -            html.push('</tr>');
        -        });
        -
        -        this.$header.html(html.join(''));
        -        this.$header.find('th[data-field]').each(function (i) {
        -            $(this).data(visibleColumns[$(this).data('field')]);
        -        });
        -        this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {
        -            if (that.options.sortable && $(this).parent().data().sortable) {
        -                that.onSort(event);
        -            }
        -        });
        -
        -        this.$header.children().children().off('keypress').on('keypress', function (event) {
        -            if (that.options.sortable && $(this).data().sortable) {
        -                var code = event.keyCode || event.which;
        -                if (code == 13) { //Enter keycode
        -                    that.onSort(event);
        -                }
        -            }
        -        });
        -
        -        if (!this.options.showHeader || this.options.cardView) {
        -            this.$header.hide();
        -            this.$tableHeader.hide();
        -            this.$tableLoading.css('top', 0);
        -        } else {
        -            this.$header.show();
        -            this.$tableHeader.show();
        -            this.$tableLoading.css('top', this.$header.outerHeight() + 1);
        -            // Assign the correct sortable arrow
        -            this.getCaret();
        -        }
        -
        -        this.$selectAll = this.$header.find('[name="btSelectAll"]');
        -        this.$container.off('click', '[name="btSelectAll"]')
        -            .on('click', '[name="btSelectAll"]', function () {
        -                var checked = $(this).prop('checked');
        -                that[checked ? 'checkAll' : 'uncheckAll']();
        -                that.updateSelected();
        -            });
        -    };
        -
        -    BootstrapTable.prototype.initFooter = function () {
        -        if (!this.options.showFooter || this.options.cardView) {
        -            this.$tableFooter.hide();
        -        } else {
        -            this.$tableFooter.show();
        -        }
        -    };
        -
        -    /**
        -     * @param data
        -     * @param type: append / prepend
        -     */
        -    BootstrapTable.prototype.initData = function (data, type) {
        -        if (type === 'append') {
        -            this.data = this.data.concat(data);
        -        } else if (type === 'prepend') {
        -            this.data = [].concat(data).concat(this.data);
        -        } else {
        -            this.data = data || this.options.data;
        -        }
        -
        -        // Fix #839 Records deleted when adding new row on filtered table
        -        if (type === 'append') {
        -            this.options.data = this.options.data.concat(data);
        -        } else if (type === 'prepend') {
        -            this.options.data = [].concat(data).concat(this.options.data);
        -        } else {
        -            this.options.data = this.data;
        -        }
        -
        -        if (this.options.sidePagination === 'server') {
        -            return;
        -        }
        -        this.initSort();
        -    };
        -
        -    BootstrapTable.prototype.initSort = function () {
        -        var that = this,
        -            name = this.options.sortName,
        -            order = this.options.sortOrder === 'desc' ? -1 : 1,
        -            index = $.inArray(this.options.sortName, this.header.fields);
        -
        -        if (index !== -1) {
        -            this.data.sort(function (a, b) {
        -                if (that.header.sortNames[index]) {
        -                    name = that.header.sortNames[index];
        -                }
        -                var aa = getItemField(a, name),
        -                    bb = getItemField(b, name),
        -                    value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]);
        -
        -                if (value !== undefined) {
        -                    return order * value;
        -                }
        -
        -                // Fix #161: undefined or null string sort bug.
        -                if (aa === undefined || aa === null) {
        -                    aa = '';
        -                }
        -                if (bb === undefined || bb === null) {
        -                    bb = '';
        -                }
        -
        -                // IF both values are numeric, do a numeric comparison
        -                if ($.isNumeric(aa) && $.isNumeric(bb)) {
        -                    // Convert numerical values form string to float.
        -                    aa = parseFloat(aa);
        -                    bb = parseFloat(bb);
        -                    if (aa < bb) {
        -                        return order * -1;
        -                    }
        -                    return order;
        -                }
        -
        -                if (aa === bb) {
        -                    return 0;
        -                }
        -
        -                // If value is not a string, convert to string
        -                if (typeof aa !== 'string') {
        -                    aa = aa.toString();
        -                }
        -
        -                if (aa.localeCompare(bb) === -1) {
        -                    return order * -1;
        -                }
        -
        -                return order;
        -            });
        -        }
        -    };
        -
        -    BootstrapTable.prototype.onSort = function (event) {
        -        var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(),
        -            $this_ = this.$header.find('th').eq($this.index());
        -
        -        this.$header.add(this.$header_).find('span.order').remove();
        -
        -        if (this.options.sortName === $this.data('field')) {
        -            this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';
        -        } else {
        -            this.options.sortName = $this.data('field');
        -            this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';
        -        }
        -        this.trigger('sort', this.options.sortName, this.options.sortOrder);
        -
        -        $this.add($this_).data('order', this.options.sortOrder);
        -
        -        // Assign the correct sortable arrow
        -        this.getCaret();
        -
        -        if (this.options.sidePagination === 'server') {
        -            this.initServer(this.options.silentSort);
        -            return;
        -        }
        -
        -        this.initSort();
        -        this.initBody();
        -    };
        -
        -    BootstrapTable.prototype.initToolbar = function () {
        -        var that = this,
        -            html = [],
        -            timeoutId = 0,
        -            $keepOpen,
        -            $search,
        -            switchableCount = 0;
        -
        -        this.$toolbar.html('');
        -
        -        if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {
        -            $(sprintf('<div class="bars pull-%s"></div>', this.options.toolbarAlign))
        -                .appendTo(this.$toolbar)
        -                .append($(this.options.toolbar));
        -        }
        -
        -        // showColumns, showToggle, showRefresh
        -        html = [sprintf('<div class="columns columns-%s btn-group pull-%s">',
        -            this.options.buttonsAlign, this.options.buttonsAlign)];
        -
        -        if (typeof this.options.icons === 'string') {
        -            this.options.icons = calculateObjectValue(null, this.options.icons);
        -        }
        -
        -        if (this.options.showPaginationSwitch) {
        -            html.push(sprintf('<button class="btn btn-default" type="button" name="paginationSwitch" title="%s">',
        -                    this.options.formatPaginationSwitch()),
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),
        -                '</button>');
        -        }
        -
        -        if (this.options.showRefresh) {
        -            html.push(sprintf('<button class="btn btn-default' +
        -                    sprintf(' btn-%s', this.options.iconSize) +
        -                    '" type="button" name="refresh" title="%s">',
        -                    this.options.formatRefresh()),
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.refresh),
        -                '</button>');
        -        }
        -
        -        if (this.options.showToggle) {
        -            html.push(sprintf('<button class="btn btn-default' +
        -                    sprintf(' btn-%s', this.options.iconSize) +
        -                    '" type="button" name="toggle" title="%s">',
        -                    this.options.formatToggle()),
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.toggle),
        -                '</button>');
        -        }
        -
        -        if (this.options.showColumns) {
        -            html.push(sprintf('<div class="keep-open btn-group" title="%s">',
        -                    this.options.formatColumns()),
        -                '<button type="button" class="btn btn-default' +
        -                sprintf(' btn-%s', this.options.iconSize) +
        -                ' dropdown-toggle" data-toggle="dropdown">',
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.columns),
        -                ' <span class="caret"></span>',
        -                '</button>',
        -                '<ul class="dropdown-menu" role="menu">');
        -
        -            $.each(this.columns, function (i, column) {
        -                if (column.radio || column.checkbox) {
        -                    return;
        -                }
        -
        -                if (that.options.cardView && (!column.cardVisible)) {
        -                    return;
        -                }
        -
        -                var checked = column.visible ? ' checked="checked"' : '';
        -
        -                if (column.switchable) {
        -                    html.push(sprintf('<li>' +
        -                        '<label><input type="checkbox" data-field="%s" value="%s"%s> %s</label>' +
        -                        '</li>', column.field, i, checked, column.title));
        -                    switchableCount++;
        -                }
        -            });
        -            html.push('</ul>',
        -                '</div>');
        -        }
        -
        -        html.push('</div>');
        -
        -        // Fix #188: this.showToolbar is for extentions
        -        if (this.showToolbar || html.length > 2) {
        -            this.$toolbar.append(html.join(''));
        -        }
        -
        -        if (this.options.showPaginationSwitch) {
        -            this.$toolbar.find('button[name="paginationSwitch"]')
        -                .off('click').on('click', $.proxy(this.togglePagination, this));
        -        }
        -
        -        if (this.options.showRefresh) {
        -            this.$toolbar.find('button[name="refresh"]')
        -                .off('click').on('click', $.proxy(this.refresh, this));
        -        }
        -
        -        if (this.options.showToggle) {
        -            this.$toolbar.find('button[name="toggle"]')
        -                .off('click').on('click', function () {
        -                    that.toggleView();
        -                });
        -        }
        -
        -        if (this.options.showColumns) {
        -            $keepOpen = this.$toolbar.find('.keep-open');
        -
        -            if (switchableCount <= this.options.minimumCountColumns) {
        -                $keepOpen.find('input').prop('disabled', true);
        -            }
        -
        -            $keepOpen.find('li').off('click').on('click', function (event) {
        -                event.stopImmediatePropagation();
        -            });
        -            $keepOpen.find('input').off('click').on('click', function () {
        -                var $this = $(this);
        -
        -                that.toggleColumn(getFieldIndex(that.columns,
        -                    $(this).data('field')), $this.prop('checked'), false);
        -                that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));
        -            });
        -        }
        -
        -        if (this.options.search) {
        -            html = [];
        -            html.push(
        -                '<div class="pull-' + this.options.searchAlign + ' search">',
        -                sprintf('<input class="form-control' +
        -                    sprintf(' input-%s', this.options.iconSize) +
        -                    '" type="text" placeholder="%s">',
        -                    this.options.formatSearch()),
        -                '</div>');
        -
        -            this.$toolbar.append(html.join(''));
        -            $search = this.$toolbar.find('.search input');
        -            $search.off('keyup drop').on('keyup drop', function (event) {
        -                clearTimeout(timeoutId); // doesn't matter if it's 0
        -                timeoutId = setTimeout(function () {
        -                    that.onSearch(event);
        -                }, that.options.searchTimeOut);
        -            });
        -        }
        -    };
        -
        -    BootstrapTable.prototype.onSearch = function (event) {
        -        var text = $.trim($(event.currentTarget).val());
        -
        -        // trim search input
        -        if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {
        -            $(event.currentTarget).val(text);
        -        }
        -
        -        if (text === this.searchText) {
        -            return;
        -        }
        -        this.searchText = text;
        -
        -        this.options.pageNumber = 1;
        -        this.initSearch();
        -        this.updatePagination();
        -        this.trigger('search', text);
        -    };
        -
        -    BootstrapTable.prototype.initSearch = function () {
        -        var that = this;
        -
        -        if (this.options.sidePagination !== 'server') {
        -            var s = this.searchText && this.searchText.toLowerCase();
        -            var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns;
        -
        -            // Check filter
        -            this.data = f ? $.grep(this.options.data, function (item, i) {
        -                for (var key in f) {
        -                    if ($.isArray(f[key])) {
        -                        if ($.inArray(item[key], f[key]) === -1) {
        -                            return false;
        -                        }
        -                    } else if (item[key] !== f[key]) {
        -                        return false;
        -                    }
        -                }
        -                return true;
        -            }) : this.options.data;
        -
        -            this.data = s ? $.grep(this.data, function (item, i) {
        -                for (var key in item) {
        -                    key = $.isNumeric(key) ? parseInt(key, 10) : key;
        -                    var value = item[key],
        -                        column = that.columns[getFieldIndex(that.columns, key)],
        -                        j = $.inArray(key, that.header.fields);
        -
        -                    // Fix #142: search use formated data
        -                    if (column && column.searchFormatter) {
        -                        value = calculateObjectValue(column,
        -                            that.header.formatters[j], [value, item, i], value);
        -                    }
        -
        -                    var index = $.inArray(key, that.header.fields);
        -                    if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
        -                        if (that.options.strictSearch) {
        -                            if ((value + '').toLowerCase() === s) {
        -                                return true;
        -                            }
        -                        } else {
        -                            if ((value + '').toLowerCase().indexOf(s) !== -1) {
        -                                return true;
        -                            }
        -                        }
        -                    }
        -                }
        -                return false;
        -            }) : this.data;
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initPagination = function () {
        -        if (!this.options.pagination) {
        -            this.$pagination.hide();
        -            return;
        -        } else {
        -            this.$pagination.show();
        -        }
        -
        -        var that = this,
        -            html = [],
        -            $allSelected = false,
        -            i, from, to,
        -            $pageList,
        -            $first, $pre,
        -            $next, $last,
        -            $number,
        -            data = this.getData();
        -
        -        if (this.options.sidePagination !== 'server') {
        -            this.options.totalRows = data.length;
        -        }
        -
        -        this.totalPages = 0;
        -        if (this.options.totalRows) {
        -            if (this.options.pageSize === this.options.formatAllRows()) {
        -                this.options.pageSize = this.options.totalRows;
        -                $allSelected = true;
        -            } else if (this.options.pageSize === this.options.totalRows) {
        -                // Fix #667 Table with pagination,
        -                // multiple pages and a search that matches to one page throws exception
        -                var pageLst = typeof this.options.pageList === 'string' ?
        -                    this.options.pageList.replace('[', '').replace(']', '')
        -                        .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList;
        -                if ($.inArray(this.options.formatAllRows().toLowerCase(), pageLst)  > -1) {
        -                    $allSelected = true;
        -                }
        -            }
        -
        -            this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1;
        -
        -            this.options.totalPages = this.totalPages;
        -        }
        -        if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) {
        -            this.options.pageNumber = this.totalPages;
        -        }
        -
        -        this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1;
        -        this.pageTo = this.options.pageNumber * this.options.pageSize;
        -        if (this.pageTo > this.options.totalRows) {
        -            this.pageTo = this.options.totalRows;
        -        }
        -
        -        html.push(
        -            '<div class="pull-' + this.options.paginationDetailHAlign + ' pagination-detail">',
        -            '<span class="pagination-info">',
        -            this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) :
        -            this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows),
        -            '</span>');
        -
        -        if (!this.options.onlyInfoPagination) {
        -            html.push('<span class="page-list">');
        -
        -            var pageNumber = [
        -                    sprintf('<span class="btn-group %s">',
        -                        this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
        -                            'dropdown' : 'dropup'),
        -                    '<button type="button" class="btn btn-default ' +
        -                    sprintf(' btn-%s', this.options.iconSize) +
        -                    ' dropdown-toggle" data-toggle="dropdown">',
        -                    '<span class="page-size">',
        -                    $allSelected ? this.options.formatAllRows() : this.options.pageSize,
        -                    '</span>',
        -                    ' <span class="caret"></span>',
        -                    '</button>',
        -                    '<ul class="dropdown-menu" role="menu">'
        -                ],
        -                pageList = this.options.pageList;
        -
        -            if (typeof this.options.pageList === 'string') {
        -                var list = this.options.pageList.replace('[', '').replace(']', '')
        -                    .replace(/ /g, '').split(',');
        -
        -                pageList = [];
        -                $.each(list, function (i, value) {
        -                    pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ?
        -                        that.options.formatAllRows() : +value);
        -                });
        -            }
        -
        -            $.each(pageList, function (i, page) {
        -                if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) {
        -                    var active;
        -                    if ($allSelected) {
        -                        active = page === that.options.formatAllRows() ? ' class="active"' : '';
        -                    } else {
        -                        active = page === that.options.pageSize ? ' class="active"' : '';
        -                    }
        -                    pageNumber.push(sprintf('<li%s><a href="javascript:void(0)">%s</a></li>', active, page));
        -                }
        -            });
        -            pageNumber.push('</ul></span>');
        -
        -            html.push(this.options.formatRecordsPerPage(pageNumber.join('')));
        -            html.push('</span>');
        -
        -            html.push('</div>',
        -                '<div class="pull-' + this.options.paginationHAlign + ' pagination">',
        -                '<ul class="pagination' + sprintf(' pagination-%s', this.options.iconSize) + '">',
        -                '<li class="page-first"><a href="javascript:void(0)">' + this.options.paginationFirstText + '</a></li>',
        -                '<li class="page-pre"><a href="javascript:void(0)">' + this.options.paginationPreText + '</a></li>');
        -
        -            if (this.totalPages < 5) {
        -                from = 1;
        -                to = this.totalPages;
        -            } else {
        -                from = this.options.pageNumber - 2;
        -                to = from + 4;
        -                if (from < 1) {
        -                    from = 1;
        -                    to = 5;
        -                }
        -                if (to > this.totalPages) {
        -                    to = this.totalPages;
        -                    from = to - 4;
        -                }
        -            }
        -            for (i = from; i <= to; i++) {
        -                html.push('<li class="page-number' + (i === this.options.pageNumber ? ' active' : '') + '">',
        -                    '<a href="javascript:void(0)">', i, '</a>',
        -                    '</li>');
        -            }
        -
        -            html.push(
        -                '<li class="page-next"><a href="javascript:void(0)">' + this.options.paginationNextText + '</a></li>',
        -                '<li class="page-last"><a href="javascript:void(0)">' + this.options.paginationLastText + '</a></li>',
        -                '</ul>',
        -                '</div>');
        -
        -        }
        -        this.$pagination.html(html.join(''));
        -
        -        if (!this.options.onlyInfoPagination) {
        -            $pageList = this.$pagination.find('.page-list a');
        -            $first = this.$pagination.find('.page-first');
        -            $pre = this.$pagination.find('.page-pre');
        -            $next = this.$pagination.find('.page-next');
        -            $last = this.$pagination.find('.page-last');
        -            $number = this.$pagination.find('.page-number');
        -
        -            if (this.options.pageNumber <= 1) {
        -                $first.addClass('disabled');
        -                $pre.addClass('disabled');
        -            }
        -            if (this.options.pageNumber >= this.totalPages) {
        -                $next.addClass('disabled');
        -                $last.addClass('disabled');
        -            }
        -            if (this.options.smartDisplay) {
        -                if (this.totalPages <= 1) {
        -                    this.$pagination.find('div.pagination').hide();
        -                }
        -                if (pageList.length < 2 || this.options.totalRows <= pageList[0]) {
        -                    this.$pagination.find('span.page-list').hide();
        -                }
        -
        -                // when data is empty, hide the pagination
        -                this.$pagination[this.getData().length ? 'show' : 'hide']();
        -            }
        -            if ($allSelected) {
        -                this.options.pageSize = this.options.formatAllRows();
        -            }
        -            $pageList.off('click').on('click', $.proxy(this.onPageListChange, this));
        -            $first.off('click').on('click', $.proxy(this.onPageFirst, this));
        -            $pre.off('click').on('click', $.proxy(this.onPagePre, this));
        -            $next.off('click').on('click', $.proxy(this.onPageNext, this));
        -            $last.off('click').on('click', $.proxy(this.onPageLast, this));
        -            $number.off('click').on('click', $.proxy(this.onPageNumber, this));
        -        }
        -    };
        -
        -    BootstrapTable.prototype.updatePagination = function (event) {
        -        // Fix #171: IE disabled button can be clicked bug.
        -        if (event && $(event.currentTarget).hasClass('disabled')) {
        -            return;
        -        }
        -
        -        if (!this.options.maintainSelected) {
        -            this.resetRows();
        -        }
        -
        -        this.initPagination();
        -        if (this.options.sidePagination === 'server') {
        -            this.initServer();
        -        } else {
        -            this.initBody();
        -        }
        -
        -        this.trigger('page-change', this.options.pageNumber, this.options.pageSize);
        -    };
        -
        -    BootstrapTable.prototype.onPageListChange = function (event) {
        -        var $this = $(event.currentTarget);
        -
        -        $this.parent().addClass('active').siblings().removeClass('active');
        -        this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?
        -            this.options.formatAllRows() : +$this.text();
        -        this.$toolbar.find('.page-size').text(this.options.pageSize);
        -
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageFirst = function (event) {
        -        this.options.pageNumber = 1;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPagePre = function (event) {
        -        this.options.pageNumber--;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageNext = function (event) {
        -        this.options.pageNumber++;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageLast = function (event) {
        -        this.options.pageNumber = this.totalPages;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageNumber = function (event) {
        -        if (this.options.pageNumber === +$(event.currentTarget).text()) {
        -            return;
        -        }
        -        this.options.pageNumber = +$(event.currentTarget).text();
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.initBody = function (fixedScroll) {
        -        var that = this,
        -            html = [],
        -            data = this.getData();
        -
        -        this.trigger('pre-body', data);
        -
        -        this.$body = this.$el.find('>tbody');
        -        if (!this.$body.length) {
        -            this.$body = $('<tbody></tbody>').appendTo(this.$el);
        -        }
        -
        -        //Fix #389 Bootstrap-table-flatJSON is not working
        -
        -        if (!this.options.pagination || this.options.sidePagination === 'server') {
        -            this.pageFrom = 1;
        -            this.pageTo = data.length;
        -        }
        -
        -        for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
        -            var key,
        -                item = data[i],
        -                style = {},
        -                csses = [],
        -                data_ = '',
        -                attributes = {},
        -                htmlAttributes = [];
        -
        -            style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
        -
        -            if (style && style.css) {
        -                for (key in style.css) {
        -                    csses.push(key + ': ' + style.css[key]);
        -                }
        -            }
        -
        -            attributes = calculateObjectValue(this.options,
        -                this.options.rowAttributes, [item, i], attributes);
        -
        -            if (attributes) {
        -                for (key in attributes) {
        -                    htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
        -                }
        -            }
        -
        -            if (item._data && !$.isEmptyObject(item._data)) {
        -                $.each(item._data, function (k, v) {
        -                    // ignore data-index
        -                    if (k === 'index') {
        -                        return;
        -                    }
        -                    data_ += sprintf(' data-%s="%s"', k, v);
        -                });
        -            }
        -
        -            html.push('<tr',
        -                sprintf(' %s', htmlAttributes.join(' ')),
        -                sprintf(' id="%s"', $.isArray(item) ? undefined : item._id),
        -                sprintf(' class="%s"', style.classes || ($.isArray(item) ? undefined : item._class)),
        -                sprintf(' data-index="%s"', i),
        -                sprintf(' data-uniqueid="%s"', item[this.options.uniqueId]),
        -                sprintf('%s', data_),
        -                '>'
        -            );
        -
        -            if (this.options.cardView) {
        -                html.push(sprintf('<td colspan="%s">', this.header.fields.length));
        -            }
        -
        -            if (!this.options.cardView && this.options.detailView) {
        -                html.push('<td>',
        -                    '<a class="detail-icon" href="javascript:">',
        -                    sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),
        -                    '</a>',
        -                    '</td>');
        -            }
        -
        -            $.each(this.header.fields, function (j, field) {
        -                var text = '',
        -                    value = getItemField(item, field),
        -                    type = '',
        -                    cellStyle = {},
        -                    id_ = '',
        -                    class_ = that.header.classes[j],
        -                    data_ = '',
        -                    rowspan_ = '',
        -                    title_ = '',
        -                    column = that.columns[getFieldIndex(that.columns, field)];
        -
        -                if (!column.visible) {
        -                    return;
        -                }
        -
        -                style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; '));
        -
        -                value = calculateObjectValue(column,
        -                    that.header.formatters[j], [value, item, i], value);
        -
        -                // handle td's id and class
        -                if (item['_' + field + '_id']) {
        -                    id_ = sprintf(' id="%s"', item['_' + field + '_id']);
        -                }
        -                if (item['_' + field + '_class']) {
        -                    class_ = sprintf(' class="%s"', item['_' + field + '_class']);
        -                }
        -                if (item['_' + field + '_rowspan']) {
        -                    rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']);
        -                }
        -                if (item['_' + field + '_title']) {
        -                    title_ = sprintf(' title="%s"', item['_' + field + '_title']);
        -                }
        -                cellStyle = calculateObjectValue(that.header,
        -                    that.header.cellStyles[j], [value, item, i], cellStyle);
        -                if (cellStyle.classes) {
        -                    class_ = sprintf(' class="%s"', cellStyle.classes);
        -                }
        -                if (cellStyle.css) {
        -                    var csses_ = [];
        -                    for (var key in cellStyle.css) {
        -                        csses_.push(key + ': ' + cellStyle.css[key]);
        -                    }
        -                    style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; '));
        -                }
        -
        -                if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {
        -                    $.each(item['_' + field + '_data'], function (k, v) {
        -                        // ignore data-index
        -                        if (k === 'index') {
        -                            return;
        -                        }
        -                        data_ += sprintf(' data-%s="%s"', k, v);
        -                    });
        -                }
        -
        -                if (column.checkbox || column.radio) {
        -                    type = column.checkbox ? 'checkbox' : type;
        -                    type = column.radio ? 'radio' : type;
        -
        -                    text = [that.options.cardView ?
        -                        '<div class="card-view">' : '<td class="bs-checkbox">',
        -                        '<input' +
        -                        sprintf(' data-index="%s"', i) +
        -                        sprintf(' name="%s"', that.options.selectItemName) +
        -                        sprintf(' type="%s"', type) +
        -                        sprintf(' value="%s"', item[that.options.idField]) +
        -                        sprintf(' checked="%s"', value === true ||
        -                        (value && value.checked) ? 'checked' : undefined) +
        -                        sprintf(' disabled="%s"', !column.checkboxEnabled ||
        -                        (value && value.disabled) ? 'disabled' : undefined) +
        -                        ' />',
        -                        that.header.formatters[j] && typeof value === 'string' ? value : '',
        -                        that.options.cardView ? '</div>' : '</td>'
        -                    ].join('');
        -
        -                    item[that.header.stateField] = value === true || (value && value.checked);
        -                } else {
        -                    value = typeof value === 'undefined' || value === null ?
        -                        that.options.undefinedText : value;
        -
        -                    text = that.options.cardView ? ['<div class="card-view">',
        -                        that.options.showHeader ? sprintf('<span class="title" %s>%s</span>', style,
        -                            getPropertyFromOther(that.columns, 'field', 'title', field)) : '',
        -                        sprintf('<span class="value">%s</span>', value),
        -                        '</div>'
        -                    ].join('') : [sprintf('<td%s %s %s %s %s %s>', id_, class_, style, data_, rowspan_, title_),
        -                        value,
        -                        '</td>'
        -                    ].join('');
        -
        -                    // Hide empty data on Card view when smartDisplay is set to true.
        -                    if (that.options.cardView && that.options.smartDisplay && value === '') {
        -                        // Should set a placeholder for event binding correct fieldIndex
        -                        text = '<div class="card-view"></div>';
        -                    }
        -                }
        -
        -                html.push(text);
        -            });
        -
        -            if (this.options.cardView) {
        -                html.push('</td>');
        -            }
        -
        -            html.push('</tr>');
        -        }
        -
        -        // show no records
        -        if (!html.length) {
        -            html.push('<tr class="no-records-found">',
        -                sprintf('<td colspan="%s">%s</td>',
        -                    this.$header.find('th').length, this.options.formatNoMatches()),
        -                '</tr>');
        -        }
        -
        -        this.$body.html(html.join(''));
        -
        -        if (!fixedScroll) {
        -            this.scrollTo(0);
        -        }
        -
        -        // click to select by column
        -        this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {
        -            var $td = $(this),
        -                $tr = $td.parent(),
        -                item = that.data[$tr.data('index')],
        -                index = $td[0].cellIndex,
        -                field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],
        -                column = that.columns[getFieldIndex(that.columns, field)],
        -                value = getItemField(item, field);
        -
        -            if ($td.find('.detail-icon').length) {
        -                return;
        -            }
        -
        -            that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);
        -            that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);
        -
        -            // if click to select - then trigger the checkbox/radio click
        -            if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {
        -                var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName));
        -                if ($selectItem.length) {
        -                    $selectItem[0].click(); // #144: .trigger('click') bug
        -                }
        -            }
        -        });
        -
        -        this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {
        -            var $this = $(this),
        -                $tr = $this.parent().parent(),
        -                index = $tr.data('index'),
        -                row = data[index]; // Fix #980 Detail view, when searching, returns wrong row
        -
        -            // remove and update
        -            if ($tr.next().is('tr.detail-view')) {
        -                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));
        -                $tr.next().remove();
        -                that.trigger('collapse-row', index, row);
        -            } else {
        -                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));
        -                $tr.after(sprintf('<tr class="detail-view"><td colspan="%s">%s</td></tr>',
        -                    $tr.find('td').length, calculateObjectValue(that.options,
        -                        that.options.detailFormatter, [index, row], '')));
        -                that.trigger('expand-row', index, row, $tr.next().find('td'));
        -            }
        -            that.resetView();
        -        });
        -
        -        this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName));
        -        this.$selectItem.off('click').on('click', function (event) {
        -            event.stopImmediatePropagation();
        -
        -            var $this = $(this),
        -                checked = $this.prop('checked'),
        -                row = that.data[$this.data('index')];
        -
        -            if (that.options.maintainSelected && $(this).is(':radio')) {
        -                $.each(that.options.data, function (i, row) {
        -                    row[that.header.stateField] = false;
        -                });
        -            }
        -
        -            row[that.header.stateField] = checked;
        -
        -            if (that.options.singleSelect) {
        -                that.$selectItem.not(this).each(function () {
        -                    that.data[$(this).data('index')][that.header.stateField] = false;
        -                });
        -                that.$selectItem.filter(':checked').not(this).prop('checked', false);
        -            }
        -
        -            that.updateSelected();
        -            that.trigger(checked ? 'check' : 'uncheck', row, $this);
        -        });
        -
        -        $.each(this.header.events, function (i, events) {
        -            if (!events) {
        -                return;
        -            }
        -            // fix bug, if events is defined with namespace
        -            if (typeof events === 'string') {
        -                events = calculateObjectValue(null, events);
        -            }
        -
        -            var field = that.header.fields[i],
        -                fieldIndex = $.inArray(field, that.getVisibleFields());
        -
        -            if (that.options.detailView && !that.options.cardView) {
        -                fieldIndex += 1;
        -            }
        -
        -            for (var key in events) {
        -                that.$body.find('>tr:not(.no-records-found)').each(function () {
        -                    var $tr = $(this),
        -                        $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),
        -                        index = key.indexOf(' '),
        -                        name = key.substring(0, index),
        -                        el = key.substring(index + 1),
        -                        func = events[key];
        -
        -                    $td.find(el).off(name).on(name, function (e) {
        -                        var index = $tr.data('index'),
        -                            row = that.data[index],
        -                            value = row[field];
        -
        -                        func.apply(this, [e, value, row, index]);
        -                    });
        -                });
        -            }
        -        });
        -
        -        this.updateSelected();
        -        this.resetView();
        -
        -        this.trigger('post-body');
        -    };
        -
        -    BootstrapTable.prototype.initServer = function (silent, query) {
        -        var that = this,
        -            data = {},
        -            params = {
        -                pageSize: this.options.pageSize === this.options.formatAllRows() ?
        -                    this.options.totalRows : this.options.pageSize,
        -                pageNumber: this.options.pageNumber,
        -                searchText: this.searchText,
        -                sortName: this.options.sortName,
        -                sortOrder: this.options.sortOrder
        -            },
        -            request;
        -
        -        if (!this.options.url && !this.options.ajax) {
        -            return;
        -        }
        -
        -        if (this.options.queryParamsType === 'limit') {
        -            params = {
        -                search: params.searchText,
        -                sort: params.sortName,
        -                order: params.sortOrder
        -            };
        -            if (this.options.pagination) {
        -                params.limit = this.options.pageSize === this.options.formatAllRows() ?
        -                    this.options.totalRows : this.options.pageSize;
        -                params.offset = this.options.pageSize === this.options.formatAllRows() ?
        -                    0 : this.options.pageSize * (this.options.pageNumber - 1);
        -            }
        -        }
        -
        -        if (!($.isEmptyObject(this.filterColumnsPartial))) {
        -            params['filter'] = JSON.stringify(this.filterColumnsPartial, null);
        -        }
        -
        -        data = calculateObjectValue(this.options, this.options.queryParams, [params], data);
        -
        -        $.extend(data, query || {});
        -
        -        // false to stop request
        -        if (data === false) {
        -            return;
        -        }
        -
        -        if (!silent) {
        -            this.$tableLoading.show();
        -        }
        -        request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), {
        -            type: this.options.method,
        -            url: this.options.url,
        -            data: this.options.contentType === 'application/json' && this.options.method === 'post' ?
        -                JSON.stringify(data) : data,
        -            cache: this.options.cache,
        -            contentType: this.options.contentType,
        -            dataType: this.options.dataType,
        -            success: function (res) {
        -                res = calculateObjectValue(that.options, that.options.responseHandler, [res], res);
        -
        -                that.load(res);
        -                that.trigger('load-success', res);
        -            },
        -            error: function (res) {
        -                that.trigger('load-error', res.status, res);
        -            },
        -            complete: function () {
        -                if (!silent) {
        -                    that.$tableLoading.hide();
        -                }
        -            }
        -        });
        -
        -        if (this.options.ajax) {
        -            calculateObjectValue(this, this.options.ajax, [request], null);
        -        } else {
        -            $.ajax(request);
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initSearchText = function () {
        -        if (this.options.search) {
        -            if (this.options.searchText !== '') {
        -                var $search = this.$toolbar.find('.search input');
        -                $search.val(this.options.searchText);
        -                this.onSearch({currentTarget: $search});
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.getCaret = function () {
        -        var that = this;
        -
        -        $.each(this.$header.find('th'), function (i, th) {
        -            $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both');
        -        });
        -    };
        -
        -    BootstrapTable.prototype.updateSelected = function () {
        -        var checkAll = this.$selectItem.filter(':enabled').length &&
        -            this.$selectItem.filter(':enabled').length ===
        -            this.$selectItem.filter(':enabled').filter(':checked').length;
        -
        -        this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);
        -
        -        this.$selectItem.each(function () {
        -            $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected');
        -        });
        -    };
        -
        -    BootstrapTable.prototype.updateRows = function () {
        -        var that = this;
        -
        -        this.$selectItem.each(function () {
        -            that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');
        -        });
        -    };
        -
        -    BootstrapTable.prototype.resetRows = function () {
        -        var that = this;
        -
        -        $.each(this.data, function (i, row) {
        -            that.$selectAll.prop('checked', false);
        -            that.$selectItem.prop('checked', false);
        -            if (that.header.stateField) {
        -                row[that.header.stateField] = false;
        -            }
        -        });
        -    };
        -
        -    BootstrapTable.prototype.trigger = function (name) {
        -        var args = Array.prototype.slice.call(arguments, 1);
        -
        -        name += '.bs.table';
        -        this.options[BootstrapTable.EVENTS[name]].apply(this.options, args);
        -        this.$el.trigger($.Event(name), args);
        -
        -        this.options.onAll(name, args);
        -        this.$el.trigger($.Event('all.bs.table'), [name, args]);
        -    };
        -
        -    BootstrapTable.prototype.resetHeader = function () {
        -        // fix #61: the hidden table reset header bug.
        -        // fix bug: get $el.css('width') error sometime (height = 500)
        -        clearTimeout(this.timeoutId_);
        -        this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);
        -    };
        -
        -    BootstrapTable.prototype.fitHeader = function () {
        -        var that = this,
        -            fixedBody,
        -            scrollWidth,
        -            focused,
        -            focusedTemp;
        -
        -        if (that.$el.is(':hidden')) {
        -            that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100);
        -            return;
        -        }
        -        fixedBody = this.$tableBody.get(0);
        -
        -        scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth &&
        -        fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ?
        -            getScrollBarWidth() : 0;
        -
        -        this.$el.css('margin-top', -this.$header.outerHeight());
        -
        -        focused = $(':focus');
        -        if (focused.length > 0) {
        -            var $th = focused.parents('th');
        -            if ($th.length > 0) {
        -                var dataField = $th.attr('data-field');
        -                if (dataField !== undefined) {
        -                    var $headerTh = this.$header.find("[data-field='" + dataField + "']");
        -                    if ($headerTh.length > 0) {
        -                        $headerTh.find(":input").addClass("focus-temp");
        -                    }
        -                }
        -            }
        -        }
        -
        -        this.$header_ = this.$header.clone(true, true);
        -        this.$selectAll_ = this.$header_.find('[name="btSelectAll"]');
        -        this.$tableHeader.css({
        -            'margin-right': scrollWidth
        -        }).find('table').css('width', this.$el.outerWidth())
        -            .html('').attr('class', this.$el.attr('class'))
        -            .append(this.$header_);
        -
        -
        -        focusedTemp = $('.focus-temp:visible:eq(0)');
        -        if (focusedTemp.length > 0) {
        -            focusedTemp.focus();
        -            this.$header.find('.focus-temp').removeClass('focus-temp');
        -        }
        -
        -        // fix bug: $.data() is not working as expected after $.append()
        -        this.$header.find('th[data-field]').each(function (i) {
        -            that.$header_.find(sprintf('th[data-field="%s"]', $(this).data('field'))).data($(this).data());
        -        });
        -
        -        var visibleFields = this.getVisibleFields();
        -
        -        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
        -            var $this = $(this),
        -                index = i;
        -
        -            if (that.options.detailView && !that.options.cardView) {
        -                if (i === 0) {
        -                    that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());
        -                }
        -                index = i - 1;
        -            }
        -
        -            that.$header_.find(sprintf('th[data-field="%s"]', visibleFields[index]))
        -                .find('.fht-cell').width($this.innerWidth());
        -        });
        -        // horizontal scroll event
        -        // TODO: it's probably better improving the layout than binding to scroll event
        -        this.$tableBody.off('scroll').on('scroll', function () {
        -            that.$tableHeader.scrollLeft($(this).scrollLeft());
        -
        -            if (that.options.showFooter && !that.options.cardView) {
        -                that.$tableFooter.scrollLeft($(this).scrollLeft());
        -            }
        -        });
        -        that.trigger('post-header');
        -    };
        -
        -    BootstrapTable.prototype.resetFooter = function () {
        -        var that = this,
        -            data = that.getData(),
        -            html = [];
        -
        -        if (!this.options.showFooter || this.options.cardView) { //do nothing
        -            return;
        -        }
        -
        -        if (!this.options.cardView && this.options.detailView) {
        -            html.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>');
        -        }
        -
        -        $.each(this.columns, function (i, column) {
        -            var falign = '', // footer align style
        -                style = '',
        -                class_ = sprintf(' class="%s"', column['class']);
        -
        -            if (!column.visible) {
        -                return;
        -            }
        -
        -            if (that.options.cardView && (!column.cardVisible)) {
        -                return;
        -            }
        -
        -            falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align);
        -            style = sprintf('vertical-align: %s; ', column.valign);
        -
        -            html.push('<td', class_, sprintf(' style="%s"', falign + style), '>');
        -            html.push('<div class="th-inner">');
        -
        -            html.push(calculateObjectValue(column, column.footerFormatter, [data], '&nbsp;') || '&nbsp;');
        -
        -            html.push('</div>');
        -            html.push('<div class="fht-cell"></div>');
        -            html.push('</div>');
        -            html.push('</td>');
        -        });
        -
        -        this.$tableFooter.find('tr').html(html.join(''));
        -        clearTimeout(this.timeoutFooter_);
        -        this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this),
        -            this.$el.is(':hidden') ? 100 : 0);
        -    };
        -
        -    BootstrapTable.prototype.fitFooter = function () {
        -        var that = this,
        -            $footerTd,
        -            elWidth,
        -            scrollWidth;
        -
        -        clearTimeout(this.timeoutFooter_);
        -        if (this.$el.is(':hidden')) {
        -            this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100);
        -            return;
        -        }
        -
        -        elWidth = this.$el.css('width');
        -        scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0;
        -
        -        this.$tableFooter.css({
        -            'margin-right': scrollWidth
        -        }).find('table').css('width', elWidth)
        -            .attr('class', this.$el.attr('class'));
        -
        -        $footerTd = this.$tableFooter.find('td');
        -
        -        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
        -            var $this = $(this);
        -
        -            $footerTd.eq(i).find('.fht-cell').width($this.innerWidth());
        -        });
        -    };
        -
        -    BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) {
        -        if (index === -1) {
        -            return;
        -        }
        -        this.columns[index].visible = checked;
        -        this.initHeader();
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody();
        -
        -        if (this.options.showColumns) {
        -            var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);
        -
        -            if (needUpdate) {
        -                $items.filter(sprintf('[value="%s"]', index)).prop('checked', checked);
        -            }
        -
        -            if ($items.filter(':checked').length <= this.options.minimumCountColumns) {
        -                $items.filter(':checked').prop('disabled', true);
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {
        -        if (index === -1) {
        -            return;
        -        }
        -
        -        this.$body.find(typeof index !== 'undefined' ?
        -            sprintf('tr[data-index="%s"]', index) :
        -            sprintf('tr[data-uniqueid="%s"]', uniqueId))
        -            [visible ? 'show' : 'hide']();
        -    };
        -
        -    BootstrapTable.prototype.getVisibleFields = function () {
        -        var that = this,
        -            visibleFields = [];
        -
        -        $.each(this.header.fields, function (j, field) {
        -            var column = that.columns[getFieldIndex(that.columns, field)];
        -
        -            if (!column.visible) {
        -                return;
        -            }
        -            visibleFields.push(field);
        -        });
        -        return visibleFields;
        -    };
        -
        -    // PUBLIC FUNCTION DEFINITION
        -    // =======================
        -
        -    BootstrapTable.prototype.resetView = function (params) {
        -        var padding = 0;
        -
        -        if (params && params.height) {
        -            this.options.height = params.height;
        -        }
        -
        -        this.$selectAll.prop('checked', this.$selectItem.length > 0 &&
        -            this.$selectItem.length === this.$selectItem.filter(':checked').length);
        -
        -        if (this.options.height) {
        -            var toolbarHeight = getRealHeight(this.$toolbar),
        -                paginationHeight = getRealHeight(this.$pagination),
        -                height = this.options.height - toolbarHeight - paginationHeight;
        -
        -            this.$tableContainer.css('height', height + 'px');
        -        }
        -
        -        if (this.options.cardView) {
        -            // remove the element css
        -            this.$el.css('margin-top', '0');
        -            this.$tableContainer.css('padding-bottom', '0');
        -            return;
        -        }
        -
        -        if (this.options.showHeader && this.options.height) {
        -            this.$tableHeader.show();
        -            this.resetHeader();
        -            padding += this.$header.outerHeight();
        -        } else {
        -            this.$tableHeader.hide();
        -            this.trigger('post-header');
        -        }
        -
        -        if (this.options.showFooter) {
        -            this.resetFooter();
        -            if (this.options.height) {
        -                padding += this.$tableFooter.outerHeight() + 1;
        -            }
        -        }
        -
        -        // Assign the correct sortable arrow
        -        this.getCaret();
        -        this.$tableContainer.css('padding-bottom', padding + 'px');
        -        this.trigger('reset-view');
        -    };
        -
        -    BootstrapTable.prototype.getData = function (useCurrentPage) {
        -        return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?
        -            (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) :
        -            (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data);
        -    };
        -
        -    BootstrapTable.prototype.load = function (data) {
        -        var fixedScroll = false;
        -
        -        // #431: support pagination
        -        if (this.options.sidePagination === 'server') {
        -            this.options.totalRows = data.total;
        -            fixedScroll = data.fixedScroll;
        -            data = data[this.options.dataField];
        -        } else if (!$.isArray(data)) { // support fixedScroll
        -            fixedScroll = data.fixedScroll;
        -            data = data.data;
        -        }
        -
        -        this.initData(data);
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(fixedScroll);
        -    };
        -
        -    BootstrapTable.prototype.append = function (data) {
        -        this.initData(data, 'append');
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.prepend = function (data) {
        -        this.initData(data, 'prepend');
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.remove = function (params) {
        -        var len = this.options.data.length,
        -            i, row;
        -
        -        if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {
        -            return;
        -        }
        -
        -        for (i = len - 1; i >= 0; i--) {
        -            row = this.options.data[i];
        -
        -            if (!row.hasOwnProperty(params.field)) {
        -                continue;
        -            }
        -            if ($.inArray(row[params.field], params.values) !== -1) {
        -                this.options.data.splice(i, 1);
        -            }
        -        }
        -
        -        if (len === this.options.data.length) {
        -            return;
        -        }
        -
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.removeAll = function () {
        -        if (this.options.data.length > 0) {
        -            this.options.data.splice(0, this.options.data.length);
        -            this.initSearch();
        -            this.initPagination();
        -            this.initBody(true);
        -        }
        -    };
        -
        -    BootstrapTable.prototype.getRowByUniqueId = function (id) {
        -        var uniqueId = this.options.uniqueId,
        -            len = this.options.data.length,
        -            dataRow = null,
        -            i, row, rowUniqueId;
        -
        -        for (i = len - 1; i >= 0; i--) {
        -            row = this.options.data[i];
        -
        -            if (row.hasOwnProperty(uniqueId)) { // uniqueId is a column
        -                rowUniqueId = row[uniqueId];
        -            } else if(row._data.hasOwnProperty(uniqueId)) { // uniqueId is a row data property
        -                rowUniqueId = row._data[uniqueId];
        -            } else {
        -                continue;
        -            }
        -
        -            if (typeof rowUniqueId === 'string') {
        -                id = id.toString();
        -            } else if (typeof rowUniqueId === 'number') {
        -                if ((Number(rowUniqueId) === rowUniqueId) && (rowUniqueId % 1 === 0)) {
        -                    id = parseInt(id);
        -                } else if ((rowUniqueId === Number(rowUniqueId)) && (rowUniqueId !== 0)) {
        -                    id = parseFloat(id);
        -                }
        -            }
        -
        -            if (rowUniqueId === id) {
        -                dataRow = row;
        -                break;
        -            }
        -        }
        -
        -        return dataRow;
        -    };
        -
        -    BootstrapTable.prototype.removeByUniqueId = function (id) {
        -        var len = this.options.data.length,
        -            row = this.getRowByUniqueId(id);
        -
        -        if (row) {
        -            this.options.data.splice(this.options.data.indexOf(row), 1);
        -        }
        -
        -        if (len === this.options.data.length) {
        -            return;
        -        }
        -
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.updateByUniqueId = function (params) {
        -        var rowId;
        -
        -        if (!params.hasOwnProperty('id') || !params.hasOwnProperty('row')) {
        -            return;
        -        }
        -
        -        rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data);
        -
        -        if (rowId === -1) {
        -            return;
        -        }
        -
        -        $.extend(this.data[rowId], params.row);
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.insertRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
        -            return;
        -        }
        -        this.data.splice(params.index, 0, params.row);
        -        this.initSearch();
        -        this.initPagination();
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.updateRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
        -            return;
        -        }
        -        $.extend(this.data[params.index], params.row);
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.showRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
        -            return;
        -        }
        -        this.toggleRow(params.index, params.uniqueId, true);
        -    };
        -
        -    BootstrapTable.prototype.hideRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
        -            return;
        -        }
        -        this.toggleRow(params.index, params.uniqueId, false);
        -    };
        -
        -    BootstrapTable.prototype.getRowsHidden = function (show) {
        -        var rows = $(this.$body[0]).children().filter(':hidden'),
        -            i = 0;
        -        if (show) {
        -            for (; i < rows.length; i++) {
        -                $(rows[i]).show();
        -            }
        -        }
        -        return rows;
        -    };
        -
        -    BootstrapTable.prototype.mergeCells = function (options) {
        -        var row = options.index,
        -            col = $.inArray(options.field, this.getVisibleFields()),
        -            rowspan = options.rowspan || 1,
        -            colspan = options.colspan || 1,
        -            i, j,
        -            $tr = this.$body.find('>tr'),
        -            $td;
        -
        -        if (this.options.detailView && !this.options.cardView) {
        -            col += 1;
        -        }
        -
        -        $td = $tr.eq(row).find('>td').eq(col);
        -
        -        if (row < 0 || col < 0 || row >= this.data.length) {
        -            return;
        -        }
        -
        -        for (i = row; i < row + rowspan; i++) {
        -            for (j = col; j < col + colspan; j++) {
        -                $tr.eq(i).find('>td').eq(j).hide();
        -            }
        -        }
        -
        -        $td.attr('rowspan', rowspan).attr('colspan', colspan).show();
        -    };
        -
        -    BootstrapTable.prototype.updateCell = function (params) {
        -        if (!params.hasOwnProperty('index') ||
        -            !params.hasOwnProperty('field') ||
        -            !params.hasOwnProperty('value')) {
        -            return;
        -        }
        -        this.data[params.index][params.field] = params.value;
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.getOptions = function () {
        -        return this.options;
        -    };
        -
        -    BootstrapTable.prototype.getSelections = function () {
        -        var that = this;
        -
        -        return $.grep(this.data, function (row) {
        -            return row[that.header.stateField];
        -        });
        -    };
        -
        -    BootstrapTable.prototype.getAllSelections = function () {
        -        var that = this;
        -
        -        return $.grep(this.options.data, function (row) {
        -            return row[that.header.stateField];
        -        });
        -    };
        -
        -    BootstrapTable.prototype.checkAll = function () {
        -        this.checkAll_(true);
        -    };
        -
        -    BootstrapTable.prototype.uncheckAll = function () {
        -        this.checkAll_(false);
        -    };
        -
        -    BootstrapTable.prototype.checkAll_ = function (checked) {
        -        var rows;
        -        if (!checked) {
        -            rows = this.getSelections();
        -        }
        -        this.$selectAll.add(this.$selectAll_).prop('checked', checked);
        -        this.$selectItem.filter(':enabled').prop('checked', checked);
        -        this.updateRows();
        -        if (checked) {
        -            rows = this.getSelections();
        -        }
        -        this.trigger(checked ? 'check-all' : 'uncheck-all', rows);
        -    };
        -
        -    BootstrapTable.prototype.check = function (index) {
        -        this.check_(true, index);
        -    };
        -
        -    BootstrapTable.prototype.uncheck = function (index) {
        -        this.check_(false, index);
        -    };
        -
        -    BootstrapTable.prototype.check_ = function (checked, index) {
        -        var $el = this.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
        -        this.data[index][this.header.stateField] = checked;
        -        this.updateSelected();
        -        this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el);
        -    };
        -
        -    BootstrapTable.prototype.checkBy = function (obj) {
        -        this.checkBy_(true, obj);
        -    };
        -
        -    BootstrapTable.prototype.uncheckBy = function (obj) {
        -        this.checkBy_(false, obj);
        -    };
        -
        -    BootstrapTable.prototype.checkBy_ = function (checked, obj) {
        -        if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {
        -            return;
        -        }
        -
        -        var that = this,
        -            rows = [];
        -        $.each(this.options.data, function (index, row) {
        -            if (!row.hasOwnProperty(obj.field)) {
        -                return false;
        -            }
        -            if ($.inArray(row[obj.field], obj.values) !== -1) {
        -                var $el = that.$selectItem.filter(':enabled')
        -                    .filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
        -                row[that.header.stateField] = checked;
        -                rows.push(row);
        -                that.trigger(checked ? 'check' : 'uncheck', row, $el);
        -            }
        -        });
        -        this.updateSelected();
        -        this.trigger(checked ? 'check-some' : 'uncheck-some', rows);
        -    };
        -
        -    BootstrapTable.prototype.destroy = function () {
        -        this.$el.insertBefore(this.$container);
        -        $(this.options.toolbar).insertBefore(this.$el);
        -        this.$container.next().remove();
        -        this.$container.remove();
        -        this.$el.html(this.$el_.html())
        -            .css('margin-top', '0')
        -            .attr('class', this.$el_.attr('class') || ''); // reset the class
        -    };
        -
        -    BootstrapTable.prototype.showLoading = function () {
        -        this.$tableLoading.show();
        -    };
        -
        -    BootstrapTable.prototype.hideLoading = function () {
        -        this.$tableLoading.hide();
        -    };
        -
        -    BootstrapTable.prototype.togglePagination = function () {
        -        this.options.pagination = !this.options.pagination;
        -        var button = this.$toolbar.find('button[name="paginationSwitch"] i');
        -        if (this.options.pagination) {
        -            button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown);
        -        } else {
        -            button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp);
        -        }
        -        this.updatePagination();
        -    };
        -
        -    BootstrapTable.prototype.refresh = function (params) {
        -        if (params && params.url) {
        -            this.options.url = params.url;
        -            this.options.pageNumber = 1;
        -        }
        -        this.initServer(params && params.silent, params && params.query);
        -    };
        -
        -    BootstrapTable.prototype.resetWidth = function () {
        -        if (this.options.showHeader && this.options.height) {
        -            this.fitHeader();
        -        }
        -        if (this.options.showFooter) {
        -            this.fitFooter();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.showColumn = function (field) {
        -        this.toggleColumn(getFieldIndex(this.columns, field), true, true);
        -    };
        -
        -    BootstrapTable.prototype.hideColumn = function (field) {
        -        this.toggleColumn(getFieldIndex(this.columns, field), false, true);
        -    };
        -
        -    BootstrapTable.prototype.getHiddenColumns = function () {
        -        return $.grep(this.columns, function (column) {
        -            return !column.visible;
        -        });
        -    };
        -
        -    BootstrapTable.prototype.filterBy = function (columns) {
        -        this.filterColumns = $.isEmptyObject(columns) ? {} : columns;
        -        this.options.pageNumber = 1;
        -        this.initSearch();
        -        this.updatePagination();
        -    };
        -
        -    BootstrapTable.prototype.scrollTo = function (value) {
        -        if (typeof value === 'string') {
        -            value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0;
        -        }
        -        if (typeof value === 'number') {
        -            this.$tableBody.scrollTop(value);
        -        }
        -        if (typeof value === 'undefined') {
        -            return this.$tableBody.scrollTop();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.getScrollPosition = function () {
        -        return this.scrollTo();
        -    };
        -
        -    BootstrapTable.prototype.selectPage = function (page) {
        -        if (page > 0 && page <= this.options.totalPages) {
        -            this.options.pageNumber = page;
        -            this.updatePagination();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.prevPage = function () {
        -        if (this.options.pageNumber > 1) {
        -            this.options.pageNumber--;
        -            this.updatePagination();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.nextPage = function () {
        -        if (this.options.pageNumber < this.options.totalPages) {
        -            this.options.pageNumber++;
        -            this.updatePagination();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.toggleView = function () {
        -        this.options.cardView = !this.options.cardView;
        -        this.initHeader();
        -        // Fixed remove toolbar when click cardView button.
        -        //that.initToolbar();
        -        this.initBody();
        -        this.trigger('toggle', this.options.cardView);
        -    };
        -
        -    BootstrapTable.prototype.refreshOptions = function (options) {
        -        //If the objects are equivalent then avoid the call of destroy / init methods
        -        if (compareObjects(this.options, options, false)) {
        -            return;
        -        }
        -        this.options = $.extend(this.options, options);
        -        this.trigger('refresh-options', this.options);
        -        this.destroy();
        -        this.init();
        -    };
        -
        -    BootstrapTable.prototype.resetSearch = function (text) {
        -        var $search = this.$toolbar.find('.search input');
        -        $search.val(text || '');
        -        this.onSearch({currentTarget: $search});
        -    };
        -
        -    BootstrapTable.prototype.expandRow_ = function (expand, index) {
        -        var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', index));
        -        if ($tr.next().is('tr.detail-view') === (expand ? false : true)) {
        -            $tr.find('> td > .detail-icon').click();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.expandRow = function (index) {
        -        this.expandRow_(true, index);
        -    };
        -
        -    BootstrapTable.prototype.collapseRow = function (index) {
        -        this.expandRow_(false, index);
        -    };
        -
        -    BootstrapTable.prototype.expandAllRows = function (isSubTable) {
        -        if (isSubTable) {
        -            var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', 0)),
        -                that = this,
        -                detailIcon = null,
        -                executeInterval = false,
        -                idInterval = -1;
        -
        -            if (!$tr.next().is('tr.detail-view')) {
        -                $tr.find('> td > .detail-icon').click();
        -                executeInterval = true;
        -            } else if (!$tr.next().next().is('tr.detail-view')) {
        -                $tr.next().find(".detail-icon").click();
        -                executeInterval = true;
        -            }
        -
        -            if (executeInterval) {
        -                try {
        -                    idInterval = setInterval(function () {
        -                        detailIcon = that.$body.find("tr.detail-view").last().find(".detail-icon");
        -                        if (detailIcon.length > 0) {
        -                            detailIcon.click();
        -                        } else {
        -                            clearInterval(idInterval);
        -                        }
        -                    }, 1);
        -                } catch (ex) {
        -                    clearInterval(idInterval);
        -                }
        -            }
        -        } else {
        -            var trs = this.$body.children();
        -            for (var i = 0; i < trs.length; i++) {
        -                this.expandRow_(true, $(trs[i]).data("index"));
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.collapseAllRows = function (isSubTable) {
        -        if (isSubTable) {
        -            this.expandRow_(false, 0);
        -        } else {
        -            var trs = this.$body.children();
        -            for (var i = 0; i < trs.length; i++) {
        -                this.expandRow_(false, $(trs[i]).data("index"));
        -            }
        -        }
        -    };
        -
        -    // BOOTSTRAP TABLE PLUGIN DEFINITION
        -    // =======================
        -
        -    var allowedMethods = [
        -        'getOptions',
        -        'getSelections', 'getAllSelections', 'getData',
        -        'load', 'append', 'prepend', 'remove', 'removeAll',
        -        'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',
        -        'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',
        -        'mergeCells',
        -        'checkAll', 'uncheckAll',
        -        'check', 'uncheck',
        -        'checkBy', 'uncheckBy',
        -        'refresh',
        -        'resetView',
        -        'resetWidth',
        -        'destroy',
        -        'showLoading', 'hideLoading',
        -        'showColumn', 'hideColumn', 'getHiddenColumns',
        -        'filterBy',
        -        'scrollTo',
        -        'getScrollPosition',
        -        'selectPage', 'prevPage', 'nextPage',
        -        'togglePagination',
        -        'toggleView',
        -        'refreshOptions',
        -        'resetSearch',
        -        'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows'
        -    ];
        -
        -    $.fn.bootstrapTable = function (option) {
        -        var value,
        -            args = Array.prototype.slice.call(arguments, 1);
        -
        -        this.each(function () {
        -            var $this = $(this),
        -                data = $this.data('bootstrap.table'),
        -                options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),
        -                    typeof option === 'object' && option);
        -
        -            if (typeof option === 'string') {
        -                if ($.inArray(option, allowedMethods) < 0) {
        -                    throw new Error("Unknown method: " + option);
        -                }
        -
        -                if (!data) {
        -                    return;
        -                }
        -
        -                value = data[option].apply(data, args);
        -
        -                if (option === 'destroy') {
        -                    $this.removeData('bootstrap.table');
        -                }
        -            }
        -
        -            if (!data) {
        -                $this.data('bootstrap.table', (data = new BootstrapTable(this, options)));
        -            }
        -        });
        -
        -        return typeof value === 'undefined' ? this : value;
        -    };
        -
        -    $.fn.bootstrapTable.Constructor = BootstrapTable;
        -    $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;
        -    $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;
        -    $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;
        -    $.fn.bootstrapTable.methods = allowedMethods;
        -    $.fn.bootstrapTable.utils = {
        -        sprintf: sprintf,
        -        getFieldIndex: getFieldIndex,
        -        compareObjects: compareObjects,
        -        calculateObjectValue: calculateObjectValue
        -    };
        -
        -    // BOOTSTRAP TABLE INIT
        -    // =======================
        -
        -    $(function () {
        -        $('[data-toggle="table"]').bootstrapTable();
        -    });
        -
        -}(jQuery);
        -
        -/* =========================================================
        - * bootstrap-datepicker.js
        - * Repo: https://github.com/eternicode/bootstrap-datepicker/
        - * Demo: http://eternicode.github.io/bootstrap-datepicker/
        - * Docs: http://bootstrap-datepicker.readthedocs.org/
        - * Forked from http://www.eyecon.ro/bootstrap-datepicker
        - * =========================================================
        - * Started by Stefan Petre; improvements by Andrew Rowls + contributors
        - *
        - * Licensed under the Apache License, Version 2.0 (the "License");
        - * you may not use this file except in compliance with the License.
        - * You may obtain a copy of the License at
        - *
        - * http://www.apache.org/licenses/LICENSE-2.0
        - *
        - * Unless required by applicable law or agreed to in writing, software
        - * distributed under the License is distributed on an "AS IS" BASIS,
        - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        - * See the License for the specific language governing permissions and
        - * limitations under the License.
        - * ========================================================= */
        -
        -(function($, undefined){
        -
        -	var $window = $(window);
        -
        -	function UTCDate(){
        -		return new Date(Date.UTC.apply(Date, arguments));
        -	}
        -	function UTCToday(){
        -		var today = new Date();
        -		return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());
        -	}
        -	function alias(method){
        -		return function(){
        -			return this[method].apply(this, arguments);
        -		};
        -	}
        -
        -	var DateArray = (function(){
        -		var extras = {
        -			get: function(i){
        -				return this.slice(i)[0];
        -			},
        -			contains: function(d){
        -				// Array.indexOf is not cross-browser;
        -				// $.inArray doesn't work with Dates
        -				var val = d && d.valueOf();
        -				for (var i=0, l=this.length; i < l; i++)
        -					if (this[i].valueOf() === val)
        -						return i;
        -				return -1;
        -			},
        -			remove: function(i){
        -				this.splice(i,1);
        -			},
        -			replace: function(new_array){
        -				if (!new_array)
        -					return;
        -				if (!$.isArray(new_array))
        -					new_array = [new_array];
        -				this.clear();
        -				this.push.apply(this, new_array);
        -			},
        -			clear: function(){
        -				this.splice(0);
        -			},
        -			copy: function(){
        -				var a = new DateArray();
        -				a.replace(this);
        -				return a;
        -			}
        -		};
        -
        -		return function(){
        -			var a = [];
        -			a.push.apply(a, arguments);
        -			$.extend(a, extras);
        -			return a;
        -		};
        -	})();
        -
        -
        -	// Picker object
        -
        -	var Datepicker = function(element, options){
        -		this.dates = new DateArray();
        -		this.viewDate = UTCToday();
        -		this.focusDate = null;
        -
        -		this._process_options(options);
        -
        -		this.element = $(element);
        -		this.isInline = false;
        -		this.isInput = this.element.is('input');
        -		this.component = this.element.is('.date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;
        -		this.hasInput = this.component && this.element.find('input').length;
        -		if (this.component && this.component.length === 0)
        -			this.component = false;
        -
        -		this.picker = $(DPGlobal.template);
        -		this._buildEvents();
        -		this._attachEvents();
        -
        -		if (this.isInline){
        -			this.picker.addClass('datepicker-inline').appendTo(this.element);
        -		}
        -		else {
        -			this.picker.addClass('datepicker-dropdown dropdown-menu');
        -		}
        -
        -		if (this.o.rtl){
        -			this.picker.addClass('datepicker-rtl');
        -		}
        -
        -		this.viewMode = this.o.startView;
        -
        -		if (this.o.calendarWeeks)
        -			this.picker.find('tfoot th.today')
        -						.attr('colspan', function(i, val){
        -							return parseInt(val) + 1;
        -						});
        -
        -		this._allow_update = false;
        -
        -		this.setStartDate(this._o.startDate);
        -		this.setEndDate(this._o.endDate);
        -		this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);
        -
        -		this.fillDow();
        -		this.fillMonths();
        -
        -		this._allow_update = true;
        -
        -		this.update();
        -		this.showMode();
        -
        -		if (this.isInline){
        -			this.show();
        -		}
        -	};
        -
        -	Datepicker.prototype = {
        -		constructor: Datepicker,
        -
        -		_process_options: function(opts){
        -			// Store raw options for reference
        -			this._o = $.extend({}, this._o, opts);
        -			// Processed options
        -			var o = this.o = $.extend({}, this._o);
        -
        -			// Check if "de-DE" style date is available, if not language should
        -			// fallback to 2 letter code eg "de"
        -			var lang = o.language;
        -			if (!dates[lang]){
        -				lang = lang.split('-')[0];
        -				if (!dates[lang])
        -					lang = defaults.language;
        -			}
        -			o.language = lang;
        -
        -			switch (o.startView){
        -				case 2:
        -				case 'decade':
        -					o.startView = 2;
        -					break;
        -				case 1:
        -				case 'year':
        -					o.startView = 1;
        -					break;
        -				default:
        -					o.startView = 0;
        -			}
        -
        -			switch (o.minViewMode){
        -				case 1:
        -				case 'months':
        -					o.minViewMode = 1;
        -					break;
        -				case 2:
        -				case 'years':
        -					o.minViewMode = 2;
        -					break;
        -				default:
        -					o.minViewMode = 0;
        -			}
        -
        -			o.startView = Math.max(o.startView, o.minViewMode);
        -
        -			// true, false, or Number > 0
        -			if (o.multidate !== true){
        -				o.multidate = Number(o.multidate) || false;
        -				if (o.multidate !== false)
        -					o.multidate = Math.max(0, o.multidate);
        -				else
        -					o.multidate = 1;
        -			}
        -			o.multidateSeparator = String(o.multidateSeparator);
        -
        -			o.weekStart %= 7;
        -			o.weekEnd = ((o.weekStart + 6) % 7);
        -
        -			var format = DPGlobal.parseFormat(o.format);
        -			if (o.startDate !== -Infinity){
        -				if (!!o.startDate){
        -					if (o.startDate instanceof Date)
        -						o.startDate = this._local_to_utc(this._zero_time(o.startDate));
        -					else
        -						o.startDate = DPGlobal.parseDate(o.startDate, format, o.language);
        -				}
        -				else {
        -					o.startDate = -Infinity;
        -				}
        -			}
        -			if (o.endDate !== Infinity){
        -				if (!!o.endDate){
        -					if (o.endDate instanceof Date)
        -						o.endDate = this._local_to_utc(this._zero_time(o.endDate));
        -					else
        -						o.endDate = DPGlobal.parseDate(o.endDate, format, o.language);
        -				}
        -				else {
        -					o.endDate = Infinity;
        -				}
        -			}
        -
        -			o.daysOfWeekDisabled = o.daysOfWeekDisabled||[];
        -			if (!$.isArray(o.daysOfWeekDisabled))
        -				o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/);
        -			o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){
        -				return parseInt(d, 10);
        -			});
        -
        -			var plc = String(o.orientation).toLowerCase().split(/\s+/g),
        -				_plc = o.orientation.toLowerCase();
        -			plc = $.grep(plc, function(word){
        -				return (/^auto|left|right|top|bottom$/).test(word);
        -			});
        -			o.orientation = {x: 'auto', y: 'auto'};
        -			if (!_plc || _plc === 'auto')
        -				; // no action
        -			else if (plc.length === 1){
        -				switch (plc[0]){
        -					case 'top':
        -					case 'bottom':
        -						o.orientation.y = plc[0];
        -						break;
        -					case 'left':
        -					case 'right':
        -						o.orientation.x = plc[0];
        -						break;
        -				}
        -			}
        -			else {
        -				_plc = $.grep(plc, function(word){
        -					return (/^left|right$/).test(word);
        -				});
        -				o.orientation.x = _plc[0] || 'auto';
        -
        -				_plc = $.grep(plc, function(word){
        -					return (/^top|bottom$/).test(word);
        -				});
        -				o.orientation.y = _plc[0] || 'auto';
        -			}
        -		},
        -		_events: [],
        -		_secondaryEvents: [],
        -		_applyEvents: function(evs){
        -			for (var i=0, el, ch, ev; i < evs.length; i++){
        -				el = evs[i][0];
        -				if (evs[i].length === 2){
        -					ch = undefined;
        -					ev = evs[i][1];
        -				}
        -				else if (evs[i].length === 3){
        -					ch = evs[i][1];
        -					ev = evs[i][2];
        -				}
        -				el.on(ev, ch);
        -			}
        -		},
        -		_unapplyEvents: function(evs){
        -			for (var i=0, el, ev, ch; i < evs.length; i++){
        -				el = evs[i][0];
        -				if (evs[i].length === 2){
        -					ch = undefined;
        -					ev = evs[i][1];
        -				}
        -				else if (evs[i].length === 3){
        -					ch = evs[i][1];
        -					ev = evs[i][2];
        -				}
        -				el.off(ev, ch);
        -			}
        -		},
        -		_buildEvents: function(){
        -			if (this.isInput){ // single input
        -				this._events = [
        -					[this.element, {
        -						focus: $.proxy(this.show, this),
        -						keyup: $.proxy(function(e){
        -							if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)
        -								this.update();
        -						}, this),
        -						keydown: $.proxy(this.keydown, this)
        -					}]
        -				];
        -			}
        -			else if (this.component && this.hasInput){ // component: input + button
        -				this._events = [
        -					// For components that are not readonly, allow keyboard nav
        -					[this.element.find('input'), {
        -						focus: $.proxy(this.show, this),
        -						keyup: $.proxy(function(e){
        -							if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)
        -								this.update();
        -						}, this),
        -						keydown: $.proxy(this.keydown, this)
        -					}],
        -					[this.component, {
        -						click: $.proxy(this.show, this)
        -					}]
        -				];
        -			}
        -			else if (this.element.is('div')){  // inline datepicker
        -				this.isInline = true;
        -			}
        -			else {
        -				this._events = [
        -					[this.element, {
        -						click: $.proxy(this.show, this)
        -					}]
        -				];
        -			}
        -			this._events.push(
        -				// Component: listen for blur on element descendants
        -				[this.element, '*', {
        -					blur: $.proxy(function(e){
        -						this._focused_from = e.target;
        -					}, this)
        -				}],
        -				// Input: listen for blur on element
        -				[this.element, {
        -					blur: $.proxy(function(e){
        -						this._focused_from = e.target;
        -					}, this)
        -				}]
        -			);
        -
        -			this._secondaryEvents = [
        -				[this.picker, {
        -					click: $.proxy(this.click, this)
        -				}],
        -				[$(window), {
        -					resize: $.proxy(this.place, this)
        -				}],
        -				[$(document), {
        -					'mousedown touchstart': $.proxy(function(e){
        -						// Clicked outside the datepicker, hide it
        -						if (!(
        -							this.element.is(e.target) ||
        -							this.element.find(e.target).length ||
        -							this.picker.is(e.target) ||
        -							this.picker.find(e.target).length
        -						)){
        -							this.hide();
        -						}
        -					}, this)
        -				}]
        -			];
        -		},
        -		_attachEvents: function(){
        -			this._detachEvents();
        -			this._applyEvents(this._events);
        -		},
        -		_detachEvents: function(){
        -			this._unapplyEvents(this._events);
        -		},
        -		_attachSecondaryEvents: function(){
        -			this._detachSecondaryEvents();
        -			this._applyEvents(this._secondaryEvents);
        -		},
        -		_detachSecondaryEvents: function(){
        -			this._unapplyEvents(this._secondaryEvents);
        -		},
        -		_trigger: function(event, altdate){
        -			var date = altdate || this.dates.get(-1),
        -				local_date = this._utc_to_local(date);
        -
        -			this.element.trigger({
        -				type: event,
        -				date: local_date,
        -				dates: $.map(this.dates, this._utc_to_local),
        -				format: $.proxy(function(ix, format){
        -					if (arguments.length === 0){
        -						ix = this.dates.length - 1;
        -						format = this.o.format;
        -					}
        -					else if (typeof ix === 'string'){
        -						format = ix;
        -						ix = this.dates.length - 1;
        -					}
        -					format = format || this.o.format;
        -					var date = this.dates.get(ix);
        -					return DPGlobal.formatDate(date, format, this.o.language);
        -				}, this)
        -			});
        -		},
        -
        -		show: function(){
        -			if (!this.isInline)
        -				this.picker.appendTo('body');
        -			this.picker.show();
        -			this.place();
        -			this._attachSecondaryEvents();
        -			this._trigger('show');
        -		},
        -
        -		hide: function(){
        -			if (this.isInline)
        -				return;
        -			if (!this.picker.is(':visible'))
        -				return;
        -			this.focusDate = null;
        -			this.picker.hide().detach();
        -			this._detachSecondaryEvents();
        -			this.viewMode = this.o.startView;
        -			this.showMode();
        -
        -			if (
        -				this.o.forceParse &&
        -				(
        -					this.isInput && this.element.val() ||
        -					this.hasInput && this.element.find('input').val()
        -				)
        -			)
        -				this.setValue();
        -			this._trigger('hide');
        -		},
        -
        -		remove: function(){
        -			this.hide();
        -			this._detachEvents();
        -			this._detachSecondaryEvents();
        -			this.picker.remove();
        -			delete this.element.data().datepicker;
        -			if (!this.isInput){
        -				delete this.element.data().date;
        -			}
        -		},
        -
        -		_utc_to_local: function(utc){
        -			return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000));
        -		},
        -		_local_to_utc: function(local){
        -			return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));
        -		},
        -		_zero_time: function(local){
        -			return local && new Date(local.getFullYear(), local.getMonth(), local.getDate());
        -		},
        -		_zero_utc_time: function(utc){
        -			return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()));
        -		},
        -
        -		getDates: function(){
        -			return $.map(this.dates, this._utc_to_local);
        -		},
        -
        -		getUTCDates: function(){
        -			return $.map(this.dates, function(d){
        -				return new Date(d);
        -			});
        -		},
        -
        -		getDate: function(){
        -			return this._utc_to_local(this.getUTCDate());
        -		},
        -
        -		getUTCDate: function(){
        -			return new Date(this.dates.get(-1));
        -		},
        -
        -		setDates: function(){
        -			var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
        -			this.update.apply(this, args);
        -			this._trigger('changeDate');
        -			this.setValue();
        -		},
        -
        -		setUTCDates: function(){
        -			var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
        -			this.update.apply(this, $.map(args, this._utc_to_local));
        -			this._trigger('changeDate');
        -			this.setValue();
        -		},
        -
        -		setDate: alias('setDates'),
        -		setUTCDate: alias('setUTCDates'),
        -
        -		setValue: function(){
        -			var formatted = this.getFormattedDate();
        -			if (!this.isInput){
        -				if (this.component){
        -					this.element.find('input').val(formatted).change();
        -				}
        -			}
        -			else {
        -				this.element.val(formatted).change();
        -			}
        -		},
        -
        -		getFormattedDate: function(format){
        -			if (format === undefined)
        -				format = this.o.format;
        -
        -			var lang = this.o.language;
        -			return $.map(this.dates, function(d){
        -				return DPGlobal.formatDate(d, format, lang);
        -			}).join(this.o.multidateSeparator);
        -		},
        -
        -		setStartDate: function(startDate){
        -			this._process_options({startDate: startDate});
        -			this.update();
        -			this.updateNavArrows();
        -		},
        -
        -		setEndDate: function(endDate){
        -			this._process_options({endDate: endDate});
        -			this.update();
        -			this.updateNavArrows();
        -		},
        -
        -		setDaysOfWeekDisabled: function(daysOfWeekDisabled){
        -			this._process_options({daysOfWeekDisabled: daysOfWeekDisabled});
        -			this.update();
        -			this.updateNavArrows();
        -		},
        -
        -		place: function(){
        -			if (this.isInline)
        -				return;
        -			var calendarWidth = this.picker.outerWidth(),
        -				calendarHeight = this.picker.outerHeight(),
        -				visualPadding = 10,
        -				windowWidth = $window.width(),
        -				windowHeight = $window.height(),
        -				scrollTop = $window.scrollTop();
        -
        -			var zIndex = parseInt(this.element.parents().filter(function(){
        -					return $(this).css('z-index') !== 'auto';
        -				}).first().css('z-index'))+10;
        -			var offset = this.component ? this.component.parent().offset() : this.element.offset();
        -			var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);
        -			var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);
        -			var left = offset.left,
        -				top = offset.top;
        -
        -			this.picker.removeClass(
        -				'datepicker-orient-top datepicker-orient-bottom '+
        -				'datepicker-orient-right datepicker-orient-left'
        -			);
        -
        -			if (this.o.orientation.x !== 'auto'){
        -				this.picker.addClass('datepicker-orient-' + this.o.orientation.x);
        -				if (this.o.orientation.x === 'right')
        -					left -= calendarWidth - width;
        -			}
        -			// auto x orientation is best-placement: if it crosses a window
        -			// edge, fudge it sideways
        -			else {
        -				// Default to left
        -				this.picker.addClass('datepicker-orient-left');
        -				if (offset.left < 0)
        -					left -= offset.left - visualPadding;
        -				else if (offset.left + calendarWidth > windowWidth)
        -					left = windowWidth - calendarWidth - visualPadding;
        -			}
        -
        -			// auto y orientation is best-situation: top or bottom, no fudging,
        -			// decision based on which shows more of the calendar
        -			var yorient = this.o.orientation.y,
        -				top_overflow, bottom_overflow;
        -			if (yorient === 'auto'){
        -				top_overflow = -scrollTop + offset.top - calendarHeight;
        -				bottom_overflow = scrollTop + windowHeight - (offset.top + height + calendarHeight);
        -				if (Math.max(top_overflow, bottom_overflow) === bottom_overflow)
        -					yorient = 'top';
        -				else
        -					yorient = 'bottom';
        -			}
        -			this.picker.addClass('datepicker-orient-' + yorient);
        -			if (yorient === 'top')
        -				top += height;
        -			else
        -				top -= calendarHeight + parseInt(this.picker.css('padding-top'));
        -
        -			this.picker.css({
        -				top: top,
        -				left: left,
        -				zIndex: zIndex
        -			});
        -		},
        -
        -		_allow_update: true,
        -		update: function(){
        -			if (!this._allow_update)
        -				return;
        -
        -			var oldDates = this.dates.copy(),
        -				dates = [],
        -				fromArgs = false;
        -			if (arguments.length){
        -				$.each(arguments, $.proxy(function(i, date){
        -					if (date instanceof Date)
        -						date = this._local_to_utc(date);
        -					dates.push(date);
        -				}, this));
        -				fromArgs = true;
        -			}
        -			else {
        -				dates = this.isInput
        -						? this.element.val()
        -						: this.element.data('date') || this.element.find('input').val();
        -				if (dates && this.o.multidate)
        -					dates = dates.split(this.o.multidateSeparator);
        -				else
        -					dates = [dates];
        -				delete this.element.data().date;
        -			}
        -
        -			dates = $.map(dates, $.proxy(function(date){
        -				return DPGlobal.parseDate(date, this.o.format, this.o.language);
        -			}, this));
        -			dates = $.grep(dates, $.proxy(function(date){
        -				return (
        -					date < this.o.startDate ||
        -					date > this.o.endDate ||
        -					!date
        -				);
        -			}, this), true);
        -			this.dates.replace(dates);
        -
        -			if (this.dates.length)
        -				this.viewDate = new Date(this.dates.get(-1));
        -			else if (this.viewDate < this.o.startDate)
        -				this.viewDate = new Date(this.o.startDate);
        -			else if (this.viewDate > this.o.endDate)
        -				this.viewDate = new Date(this.o.endDate);
        -
        -			if (fromArgs){
        -				// setting date by clicking
        -				this.setValue();
        -			}
        -			else if (dates.length){
        -				// setting date by typing
        -				if (String(oldDates) !== String(this.dates))
        -					this._trigger('changeDate');
        -			}
        -			if (!this.dates.length && oldDates.length)
        -				this._trigger('clearDate');
        -
        -			this.fill();
        -		},
        -
        -		fillDow: function(){
        -			var dowCnt = this.o.weekStart,
        -				html = '<tr>';
        -			if (this.o.calendarWeeks){
        -				var cell = '<th class="cw">&nbsp;</th>';
        -				html += cell;
        -				this.picker.find('.datepicker-days thead tr:first-child').prepend(cell);
        -			}
        -			while (dowCnt < this.o.weekStart + 7){
        -				html += '<th class="dow">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';
        -			}
        -			html += '</tr>';
        -			this.picker.find('.datepicker-days thead').append(html);
        -		},
        -
        -		fillMonths: function(){
        -			var html = '',
        -			i = 0;
        -			while (i < 12){
        -				html += '<span class="month">'+dates[this.o.language].monthsShort[i++]+'</span>';
        -			}
        -			this.picker.find('.datepicker-months td').html(html);
        -		},
        -
        -		setRange: function(range){
        -			if (!range || !range.length)
        -				delete this.range;
        -			else
        -				this.range = $.map(range, function(d){
        -					return d.valueOf();
        -				});
        -			this.fill();
        -		},
        -
        -		getClassNames: function(date){
        -			var cls = [],
        -				year = this.viewDate.getUTCFullYear(),
        -				month = this.viewDate.getUTCMonth(),
        -				today = new Date();
        -			if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){
        -				cls.push('old');
        -			}
        -			else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){
        -				cls.push('new');
        -			}
        -			if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
        -				cls.push('focused');
        -			// Compare internal UTC date with local today, not UTC today
        -			if (this.o.todayHighlight &&
        -				date.getUTCFullYear() === today.getFullYear() &&
        -				date.getUTCMonth() === today.getMonth() &&
        -				date.getUTCDate() === today.getDate()){
        -				cls.push('today');
        -			}
        -			if (this.dates.contains(date) !== -1)
        -				cls.push('active');
        -			if (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate ||
        -				$.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1){
        -				cls.push('disabled');
        -			}
        -			if (this.range){
        -				if (date > this.range[0] && date < this.range[this.range.length-1]){
        -					cls.push('range');
        -				}
        -				if ($.inArray(date.valueOf(), this.range) !== -1){
        -					cls.push('selected');
        -				}
        -			}
        -			return cls;
        -		},
        -
        -		fill: function(){
        -			var d = new Date(this.viewDate),
        -				year = d.getUTCFullYear(),
        -				month = d.getUTCMonth(),
        -				startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
        -				startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
        -				endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
        -				endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
        -				todaytxt = dates[this.o.language].today || dates['en'].today || '',
        -				cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
        -				tooltip;
        -			this.picker.find('.datepicker-days thead th.datepicker-switch')
        -						.text(dates[this.o.language].months[month]+' '+year);
        -			this.picker.find('tfoot th.today')
        -						.text(todaytxt)
        -						.toggle(this.o.todayBtn !== false);
        -			this.picker.find('tfoot th.clear')
        -						.text(cleartxt)
        -						.toggle(this.o.clearBtn !== false);
        -			this.updateNavArrows();
        -			this.fillMonths();
        -			var prevMonth = UTCDate(year, month-1, 28),
        -				day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
        -			prevMonth.setUTCDate(day);
        -			prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);
        -			var nextMonth = new Date(prevMonth);
        -			nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
        -			nextMonth = nextMonth.valueOf();
        -			var html = [];
        -			var clsName;
        -			while (prevMonth.valueOf() < nextMonth){
        -				if (prevMonth.getUTCDay() === this.o.weekStart){
        -					html.push('<tr>');
        -					if (this.o.calendarWeeks){
        -						// ISO 8601: First week contains first thursday.
        -						// ISO also states week starts on Monday, but we can be more abstract here.
        -						var
        -							// Start of current week: based on weekstart/current date
        -							ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),
        -							// Thursday of this week
        -							th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
        -							// First Thursday of year, year from thursday
        -							yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),
        -							// Calendar week: ms between thursdays, div ms per day, div 7 days
        -							calWeek =  (th - yth) / 864e5 / 7 + 1;
        -						html.push('<td class="cw">'+ calWeek +'</td>');
        -
        -					}
        -				}
        -				clsName = this.getClassNames(prevMonth);
        -				clsName.push('day');
        -
        -				if (this.o.beforeShowDay !== $.noop){
        -					var before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
        -					if (before === undefined)
        -						before = {};
        -					else if (typeof(before) === 'boolean')
        -						before = {enabled: before};
        -					else if (typeof(before) === 'string')
        -						before = {classes: before};
        -					if (before.enabled === false)
        -						clsName.push('disabled');
        -					if (before.classes)
        -						clsName = clsName.concat(before.classes.split(/\s+/));
        -					if (before.tooltip)
        -						tooltip = before.tooltip;
        -				}
        -
        -				clsName = $.unique(clsName);
        -				html.push('<td class="'+clsName.join(' ')+'"' + (tooltip ? ' title="'+tooltip+'"' : '') + '>'+prevMonth.getUTCDate() + '</td>');
        -				if (prevMonth.getUTCDay() === this.o.weekEnd){
        -					html.push('</tr>');
        -				}
        -				prevMonth.setUTCDate(prevMonth.getUTCDate()+1);
        -			}
        -			this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
        -
        -			var months = this.picker.find('.datepicker-months')
        -						.find('th:eq(1)')
        -							.text(year)
        -							.end()
        -						.find('span').removeClass('active');
        -
        -			$.each(this.dates, function(i, d){
        -				if (d.getUTCFullYear() === year)
        -					months.eq(d.getUTCMonth()).addClass('active');
        -			});
        -
        -			if (year < startYear || year > endYear){
        -				months.addClass('disabled');
        -			}
        -			if (year === startYear){
        -				months.slice(0, startMonth).addClass('disabled');
        -			}
        -			if (year === endYear){
        -				months.slice(endMonth+1).addClass('disabled');
        -			}
        -
        -			html = '';
        -			year = parseInt(year/10, 10) * 10;
        -			var yearCont = this.picker.find('.datepicker-years')
        -								.find('th:eq(1)')
        -									.text(year + '-' + (year + 9))
        -									.end()
        -								.find('td');
        -			year -= 1;
        -			var years = $.map(this.dates, function(d){
        -					return d.getUTCFullYear();
        -				}),
        -				classes;
        -			for (var i = -1; i < 11; i++){
        -				classes = ['year'];
        -				if (i === -1)
        -					classes.push('old');
        -				else if (i === 10)
        -					classes.push('new');
        -				if ($.inArray(year, years) !== -1)
        -					classes.push('active');
        -				if (year < startYear || year > endYear)
        -					classes.push('disabled');
        -				html += '<span class="' + classes.join(' ') + '">'+year+'</span>';
        -				year += 1;
        -			}
        -			yearCont.html(html);
        -		},
        -
        -		updateNavArrows: function(){
        -			if (!this._allow_update)
        -				return;
        -
        -			var d = new Date(this.viewDate),
        -				year = d.getUTCFullYear(),
        -				month = d.getUTCMonth();
        -			switch (this.viewMode){
        -				case 0:
        -					if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){
        -						this.picker.find('.prev').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.prev').css({visibility: 'visible'});
        -					}
        -					if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){
        -						this.picker.find('.next').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.next').css({visibility: 'visible'});
        -					}
        -					break;
        -				case 1:
        -				case 2:
        -					if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()){
        -						this.picker.find('.prev').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.prev').css({visibility: 'visible'});
        -					}
        -					if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()){
        -						this.picker.find('.next').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.next').css({visibility: 'visible'});
        -					}
        -					break;
        -			}
        -		},
        -
        -		click: function(e){
        -			e.preventDefault();
        -			var target = $(e.target).closest('span, td, th'),
        -				year, month, day;
        -			if (target.length === 1){
        -				switch (target[0].nodeName.toLowerCase()){
        -					case 'th':
        -						switch (target[0].className){
        -							case 'datepicker-switch':
        -								this.showMode(1);
        -								break;
        -							case 'prev':
        -							case 'next':
        -								var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1);
        -								switch (this.viewMode){
        -									case 0:
        -										this.viewDate = this.moveMonth(this.viewDate, dir);
        -										this._trigger('changeMonth', this.viewDate);
        -										break;
        -									case 1:
        -									case 2:
        -										this.viewDate = this.moveYear(this.viewDate, dir);
        -										if (this.viewMode === 1)
        -											this._trigger('changeYear', this.viewDate);
        -										break;
        -								}
        -								this.fill();
        -								break;
        -							case 'today':
        -								var date = new Date();
        -								date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
        -
        -								this.showMode(-2);
        -								var which = this.o.todayBtn === 'linked' ? null : 'view';
        -								this._setDate(date, which);
        -								break;
        -							case 'clear':
        -								var element;
        -								if (this.isInput)
        -									element = this.element;
        -								else if (this.component)
        -									element = this.element.find('input');
        -								if (element)
        -									element.val("").change();
        -								this.update();
        -								this._trigger('changeDate');
        -								if (this.o.autoclose)
        -									this.hide();
        -								break;
        -						}
        -						break;
        -					case 'span':
        -						if (!target.is('.disabled')){
        -							this.viewDate.setUTCDate(1);
        -							if (target.is('.month')){
        -								day = 1;
        -								month = target.parent().find('span').index(target);
        -								year = this.viewDate.getUTCFullYear();
        -								this.viewDate.setUTCMonth(month);
        -								this._trigger('changeMonth', this.viewDate);
        -								if (this.o.minViewMode === 1){
        -									this._setDate(UTCDate(year, month, day));
        -								}
        -							}
        -							else {
        -								day = 1;
        -								month = 0;
        -								year = parseInt(target.text(), 10)||0;
        -								this.viewDate.setUTCFullYear(year);
        -								this._trigger('changeYear', this.viewDate);
        -								if (this.o.minViewMode === 2){
        -									this._setDate(UTCDate(year, month, day));
        -								}
        -							}
        -							this.showMode(-1);
        -							this.fill();
        -						}
        -						break;
        -					case 'td':
        -						if (target.is('.day') && !target.is('.disabled')){
        -							day = parseInt(target.text(), 10)||1;
        -							year = this.viewDate.getUTCFullYear();
        -							month = this.viewDate.getUTCMonth();
        -							if (target.is('.old')){
        -								if (month === 0){
        -									month = 11;
        -									year -= 1;
        -								}
        -								else {
        -									month -= 1;
        -								}
        -							}
        -							else if (target.is('.new')){
        -								if (month === 11){
        -									month = 0;
        -									year += 1;
        -								}
        -								else {
        -									month += 1;
        -								}
        -							}
        -							this._setDate(UTCDate(year, month, day));
        -						}
        -						break;
        -				}
        -			}
        -			if (this.picker.is(':visible') && this._focused_from){
        -				$(this._focused_from).focus();
        -			}
        -			delete this._focused_from;
        -		},
        -
        -		_toggle_multidate: function(date){
        -			var ix = this.dates.contains(date);
        -			if (!date){
        -				this.dates.clear();
        -			}
        -			else if (ix !== -1){
        -				this.dates.remove(ix);
        -			}
        -			else {
        -				this.dates.push(date);
        -			}
        -			if (typeof this.o.multidate === 'number')
        -				while (this.dates.length > this.o.multidate)
        -					this.dates.remove(0);
        -		},
        -
        -		_setDate: function(date, which){
        -			if (!which || which === 'date')
        -				this._toggle_multidate(date && new Date(date));
        -			if (!which || which  === 'view')
        -				this.viewDate = date && new Date(date);
        -
        -			this.fill();
        -			this.setValue();
        -			this._trigger('changeDate');
        -			var element;
        -			if (this.isInput){
        -				element = this.element;
        -			}
        -			else if (this.component){
        -				element = this.element.find('input');
        -			}
        -			if (element){
        -				element.change();
        -			}
        -			if (this.o.autoclose && (!which || which === 'date')){
        -				this.hide();
        -			}
        -		},
        -
        -		moveMonth: function(date, dir){
        -			if (!date)
        -				return undefined;
        -			if (!dir)
        -				return date;
        -			var new_date = new Date(date.valueOf()),
        -				day = new_date.getUTCDate(),
        -				month = new_date.getUTCMonth(),
        -				mag = Math.abs(dir),
        -				new_month, test;
        -			dir = dir > 0 ? 1 : -1;
        -			if (mag === 1){
        -				test = dir === -1
        -					// If going back one month, make sure month is not current month
        -					// (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
        -					? function(){
        -						return new_date.getUTCMonth() === month;
        -					}
        -					// If going forward one month, make sure month is as expected
        -					// (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
        -					: function(){
        -						return new_date.getUTCMonth() !== new_month;
        -					};
        -				new_month = month + dir;
        -				new_date.setUTCMonth(new_month);
        -				// Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
        -				if (new_month < 0 || new_month > 11)
        -					new_month = (new_month + 12) % 12;
        -			}
        -			else {
        -				// For magnitudes >1, move one month at a time...
        -				for (var i=0; i < mag; i++)
        -					// ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
        -					new_date = this.moveMonth(new_date, dir);
        -				// ...then reset the day, keeping it in the new month
        -				new_month = new_date.getUTCMonth();
        -				new_date.setUTCDate(day);
        -				test = function(){
        -					return new_month !== new_date.getUTCMonth();
        -				};
        -			}
        -			// Common date-resetting loop -- if date is beyond end of month, make it
        -			// end of month
        -			while (test()){
        -				new_date.setUTCDate(--day);
        -				new_date.setUTCMonth(new_month);
        -			}
        -			return new_date;
        -		},
        -
        -		moveYear: function(date, dir){
        -			return this.moveMonth(date, dir*12);
        -		},
        -
        -		dateWithinRange: function(date){
        -			return date >= this.o.startDate && date <= this.o.endDate;
        -		},
        -
        -		keydown: function(e){
        -			if (this.picker.is(':not(:visible)')){
        -				if (e.keyCode === 27) // allow escape to hide and re-show picker
        -					this.show();
        -				return;
        -			}
        -			var dateChanged = false,
        -				dir, newDate, newViewDate,
        -				focusDate = this.focusDate || this.viewDate;
        -			switch (e.keyCode){
        -				case 27: // escape
        -					if (this.focusDate){
        -						this.focusDate = null;
        -						this.viewDate = this.dates.get(-1) || this.viewDate;
        -						this.fill();
        -					}
        -					else
        -						this.hide();
        -					e.preventDefault();
        -					break;
        -				case 37: // left
        -				case 39: // right
        -					if (!this.o.keyboardNavigation)
        -						break;
        -					dir = e.keyCode === 37 ? -1 : 1;
        -					if (e.ctrlKey){
        -						newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveYear(focusDate, dir);
        -						this._trigger('changeYear', this.viewDate);
        -					}
        -					else if (e.shiftKey){
        -						newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveMonth(focusDate, dir);
        -						this._trigger('changeMonth', this.viewDate);
        -					}
        -					else {
        -						newDate = new Date(this.dates.get(-1) || UTCToday());
        -						newDate.setUTCDate(newDate.getUTCDate() + dir);
        -						newViewDate = new Date(focusDate);
        -						newViewDate.setUTCDate(focusDate.getUTCDate() + dir);
        -					}
        -					if (this.dateWithinRange(newDate)){
        -						this.focusDate = this.viewDate = newViewDate;
        -						this.setValue();
        -						this.fill();
        -						e.preventDefault();
        -					}
        -					break;
        -				case 38: // up
        -				case 40: // down
        -					if (!this.o.keyboardNavigation)
        -						break;
        -					dir = e.keyCode === 38 ? -1 : 1;
        -					if (e.ctrlKey){
        -						newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveYear(focusDate, dir);
        -						this._trigger('changeYear', this.viewDate);
        -					}
        -					else if (e.shiftKey){
        -						newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveMonth(focusDate, dir);
        -						this._trigger('changeMonth', this.viewDate);
        -					}
        -					else {
        -						newDate = new Date(this.dates.get(-1) || UTCToday());
        -						newDate.setUTCDate(newDate.getUTCDate() + dir * 7);
        -						newViewDate = new Date(focusDate);
        -						newViewDate.setUTCDate(focusDate.getUTCDate() + dir * 7);
        -					}
        -					if (this.dateWithinRange(newDate)){
        -						this.focusDate = this.viewDate = newViewDate;
        -						this.setValue();
        -						this.fill();
        -						e.preventDefault();
        -					}
        -					break;
        -				case 32: // spacebar
        -					// Spacebar is used in manually typing dates in some formats.
        -					// As such, its behavior should not be hijacked.
        -					break;
        -				case 13: // enter
        -					focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
        -					this._toggle_multidate(focusDate);
        -					dateChanged = true;
        -					this.focusDate = null;
        -					this.viewDate = this.dates.get(-1) || this.viewDate;
        -					this.setValue();
        -					this.fill();
        -					if (this.picker.is(':visible')){
        -						e.preventDefault();
        -						if (this.o.autoclose)
        -							this.hide();
        -					}
        -					break;
        -				case 9: // tab
        -					this.focusDate = null;
        -					this.viewDate = this.dates.get(-1) || this.viewDate;
        -					this.fill();
        -					this.hide();
        -					break;
        -			}
        -			if (dateChanged){
        -				if (this.dates.length)
        -					this._trigger('changeDate');
        -				else
        -					this._trigger('clearDate');
        -				var element;
        -				if (this.isInput){
        -					element = this.element;
        -				}
        -				else if (this.component){
        -					element = this.element.find('input');
        -				}
        -				if (element){
        -					element.change();
        -				}
        -			}
        -		},
        -
        -		showMode: function(dir){
        -			if (dir){
        -				this.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir));
        -			}
        -			this.picker
        -				.find('>div')
        -				.hide()
        -				.filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName)
        -					.css('display', 'block');
        -			this.updateNavArrows();
        -		}
        -	};
        -
        -	var DateRangePicker = function(element, options){
        -		this.element = $(element);
        -		this.inputs = $.map(options.inputs, function(i){
        -			return i.jquery ? i[0] : i;
        -		});
        -		delete options.inputs;
        -
        -		$(this.inputs)
        -			.datepicker(options)
        -			.bind('changeDate', $.proxy(this.dateUpdated, this));
        -
        -		this.pickers = $.map(this.inputs, function(i){
        -			return $(i).data('datepicker');
        -		});
        -		this.updateDates();
        -	};
        -	DateRangePicker.prototype = {
        -		updateDates: function(){
        -			this.dates = $.map(this.pickers, function(i){
        -				return i.getUTCDate();
        -			});
        -			this.updateRanges();
        -		},
        -		updateRanges: function(){
        -			var range = $.map(this.dates, function(d){
        -				return d.valueOf();
        -			});
        -			$.each(this.pickers, function(i, p){
        -				p.setRange(range);
        -			});
        -		},
        -		dateUpdated: function(e){
        -			// `this.updating` is a workaround for preventing infinite recursion
        -			// between `changeDate` triggering and `setUTCDate` calling.  Until
        -			// there is a better mechanism.
        -			if (this.updating)
        -				return;
        -			this.updating = true;
        -
        -			var dp = $(e.target).data('datepicker'),
        -				new_date = dp.getUTCDate(),
        -				i = $.inArray(e.target, this.inputs),
        -				l = this.inputs.length;
        -			if (i === -1)
        -				return;
        -
        -			$.each(this.pickers, function(i, p){
        -				if (!p.getUTCDate())
        -					p.setUTCDate(new_date);
        -			});
        -
        -			if (new_date < this.dates[i]){
        -				// Date being moved earlier/left
        -				while (i >= 0 && new_date < this.dates[i]){
        -					this.pickers[i--].setUTCDate(new_date);
        -				}
        -			}
        -			else if (new_date > this.dates[i]){
        -				// Date being moved later/right
        -				while (i < l && new_date > this.dates[i]){
        -					this.pickers[i++].setUTCDate(new_date);
        -				}
        -			}
        -			this.updateDates();
        -
        -			delete this.updating;
        -		},
        -		remove: function(){
        -			$.map(this.pickers, function(p){ p.remove(); });
        -			delete this.element.data().datepicker;
        -		}
        -	};
        -
        -	function opts_from_el(el, prefix){
        -		// Derive options from element data-attrs
        -		var data = $(el).data(),
        -			out = {}, inkey,
        -			replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
        -		prefix = new RegExp('^' + prefix.toLowerCase());
        -		function re_lower(_,a){
        -			return a.toLowerCase();
        -		}
        -		for (var key in data)
        -			if (prefix.test(key)){
        -				inkey = key.replace(replace, re_lower);
        -				out[inkey] = data[key];
        -			}
        -		return out;
        -	}
        -
        -	function opts_from_locale(lang){
        -		// Derive options from locale plugins
        -		var out = {};
        -		// Check if "de-DE" style date is available, if not language should
        -		// fallback to 2 letter code eg "de"
        -		if (!dates[lang]){
        -			lang = lang.split('-')[0];
        -			if (!dates[lang])
        -				return;
        -		}
        -		var d = dates[lang];
        -		$.each(locale_opts, function(i,k){
        -			if (k in d)
        -				out[k] = d[k];
        -		});
        -		return out;
        -	}
        -
        -	var old = $.fn.datepicker;
        -	$.fn.datepicker = function(option){
        -		var args = Array.apply(null, arguments);
        -		args.shift();
        -		var internal_return;
        -		this.each(function(){
        -			var $this = $(this),
        -				data = $this.data('datepicker'),
        -				options = typeof option === 'object' && option;
        -			if (!data){
        -				var elopts = opts_from_el(this, 'date'),
        -					// Preliminary otions
        -					xopts = $.extend({}, defaults, elopts, options),
        -					locopts = opts_from_locale(xopts.language),
        -					// Options priority: js args, data-attrs, locales, defaults
        -					opts = $.extend({}, defaults, locopts, elopts, options);
        -				if ($this.is('.input-daterange') || opts.inputs){
        -					var ropts = {
        -						inputs: opts.inputs || $this.find('input').toArray()
        -					};
        -					$this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts))));
        -				}
        -				else {
        -					$this.data('datepicker', (data = new Datepicker(this, opts)));
        -				}
        -			}
        -			if (typeof option === 'string' && typeof data[option] === 'function'){
        -				internal_return = data[option].apply(data, args);
        -				if (internal_return !== undefined)
        -					return false;
        -			}
        -		});
        -		if (internal_return !== undefined)
        -			return internal_return;
        -		else
        -			return this;
        -	};
        -
        -	var defaults = $.fn.datepicker.defaults = {
        -		autoclose: false,
        -		beforeShowDay: $.noop,
        -		calendarWeeks: false,
        -		clearBtn: false,
        -		daysOfWeekDisabled: [],
        -		endDate: Infinity,
        -		forceParse: true,
        -		format: 'mm/dd/yyyy',
        -		keyboardNavigation: true,
        -		language: 'en',
        -		minViewMode: 0,
        -		multidate: false,
        -		multidateSeparator: ',',
        -		orientation: "auto",
        -		rtl: false,
        -		startDate: -Infinity,
        -		startView: 0,
        -		todayBtn: false,
        -		todayHighlight: false,
        -		weekStart: 0
        -	};
        -	var locale_opts = $.fn.datepicker.locale_opts = [
        -		'format',
        -		'rtl',
        -		'weekStart'
        -	];
        -	$.fn.datepicker.Constructor = Datepicker;
        -	var dates = $.fn.datepicker.dates = {
        -		en: {
        -			days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
        -			daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        -			daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
        -			months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
        -			monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
        -			today: "Today",
        -			clear: "Clear"
        -		}
        -	};
        -
        -	var DPGlobal = {
        -		modes: [
        -			{
        -				clsName: 'days',
        -				navFnc: 'Month',
        -				navStep: 1
        -			},
        -			{
        -				clsName: 'months',
        -				navFnc: 'FullYear',
        -				navStep: 1
        -			},
        -			{
        -				clsName: 'years',
        -				navFnc: 'FullYear',
        -				navStep: 10
        -		}],
        -		isLeapYear: function(year){
        -			return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
        -		},
        -		getDaysInMonth: function(year, month){
        -			return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
        -		},
        -		validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
        -		nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,
        -		parseFormat: function(format){
        -			// IE treats \0 as a string end in inputs (truncating the value),
        -			// so it's a bad format delimiter, anyway
        -			var separators = format.replace(this.validParts, '\0').split('\0'),
        -				parts = format.match(this.validParts);
        -			if (!separators || !separators.length || !parts || parts.length === 0){
        -				throw new Error("Invalid date format.");
        -			}
        -			return {separators: separators, parts: parts};
        -		},
        -		parseDate: function(date, format, language){
        -			if (!date)
        -				return undefined;
        -			if (date instanceof Date)
        -				return date;
        -			if (typeof format === 'string')
        -				format = DPGlobal.parseFormat(format);
        -			var part_re = /([\-+]\d+)([dmwy])/,
        -				parts = date.match(/([\-+]\d+)([dmwy])/g),
        -				part, dir, i;
        -			if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){
        -				date = new Date();
        -				for (i=0; i < parts.length; i++){
        -					part = part_re.exec(parts[i]);
        -					dir = parseInt(part[1]);
        -					switch (part[2]){
        -						case 'd':
        -							date.setUTCDate(date.getUTCDate() + dir);
        -							break;
        -						case 'm':
        -							date = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);
        -							break;
        -						case 'w':
        -							date.setUTCDate(date.getUTCDate() + dir * 7);
        -							break;
        -						case 'y':
        -							date = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);
        -							break;
        -					}
        -				}
        -				return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);
        -			}
        -			parts = date && date.match(this.nonpunctuation) || [];
        -			date = new Date();
        -			var parsed = {},
        -				setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
        -				setters_map = {
        -					yyyy: function(d,v){
        -						return d.setUTCFullYear(v);
        -					},
        -					yy: function(d,v){
        -						return d.setUTCFullYear(2000+v);
        -					},
        -					m: function(d,v){
        -						if (isNaN(d))
        -							return d;
        -						v -= 1;
        -						while (v < 0) v += 12;
        -						v %= 12;
        -						d.setUTCMonth(v);
        -						while (d.getUTCMonth() !== v)
        -							d.setUTCDate(d.getUTCDate()-1);
        -						return d;
        -					},
        -					d: function(d,v){
        -						return d.setUTCDate(v);
        -					}
        -				},
        -				val, filtered;
        -			setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
        -			setters_map['dd'] = setters_map['d'];
        -			date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
        -			var fparts = format.parts.slice();
        -			// Remove noop parts
        -			if (parts.length !== fparts.length){
        -				fparts = $(fparts).filter(function(i,p){
        -					return $.inArray(p, setters_order) !== -1;
        -				}).toArray();
        -			}
        -			// Process remainder
        -			function match_part(){
        -				var m = this.slice(0, parts[i].length),
        -					p = parts[i].slice(0, m.length);
        -				return m === p;
        -			}
        -			if (parts.length === fparts.length){
        -				var cnt;
        -				for (i=0, cnt = fparts.length; i < cnt; i++){
        -					val = parseInt(parts[i], 10);
        -					part = fparts[i];
        -					if (isNaN(val)){
        -						switch (part){
        -							case 'MM':
        -								filtered = $(dates[language].months).filter(match_part);
        -								val = $.inArray(filtered[0], dates[language].months) + 1;
        -								break;
        -							case 'M':
        -								filtered = $(dates[language].monthsShort).filter(match_part);
        -								val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
        -								break;
        -						}
        -					}
        -					parsed[part] = val;
        -				}
        -				var _date, s;
        -				for (i=0; i < setters_order.length; i++){
        -					s = setters_order[i];
        -					if (s in parsed && !isNaN(parsed[s])){
        -						_date = new Date(date);
        -						setters_map[s](_date, parsed[s]);
        -						if (!isNaN(_date))
        -							date = _date;
        -					}
        -				}
        -			}
        -			return date;
        -		},
        -		formatDate: function(date, format, language){
        -			if (!date)
        -				return '';
        -			if (typeof format === 'string')
        -				format = DPGlobal.parseFormat(format);
        -			var val = {
        -				d: date.getUTCDate(),
        -				D: dates[language].daysShort[date.getUTCDay()],
        -				DD: dates[language].days[date.getUTCDay()],
        -				m: date.getUTCMonth() + 1,
        -				M: dates[language].monthsShort[date.getUTCMonth()],
        -				MM: dates[language].months[date.getUTCMonth()],
        -				yy: date.getUTCFullYear().toString().substring(2),
        -				yyyy: date.getUTCFullYear()
        -			};
        -			val.dd = (val.d < 10 ? '0' : '') + val.d;
        -			val.mm = (val.m < 10 ? '0' : '') + val.m;
        -			date = [];
        -			var seps = $.extend([], format.separators);
        -			for (var i=0, cnt = format.parts.length; i <= cnt; i++){
        -				if (seps.length)
        -					date.push(seps.shift());
        -				date.push(val[format.parts[i]]);
        -			}
        -			return date.join('');
        -		},
        -		headTemplate: '<thead>'+
        -							'<tr>'+
        -								'<th class="prev">&laquo;</th>'+
        -								'<th colspan="5" class="datepicker-switch"></th>'+
        -								'<th class="next">&raquo;</th>'+
        -							'</tr>'+
        -						'</thead>',
        -		contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
        -		footTemplate: '<tfoot>'+
        -							'<tr>'+
        -								'<th colspan="7" class="today"></th>'+
        -							'</tr>'+
        -							'<tr>'+
        -								'<th colspan="7" class="clear"></th>'+
        -							'</tr>'+
        -						'</tfoot>'
        -	};
        -	DPGlobal.template = '<div class="datepicker">'+
        -							'<div class="datepicker-days">'+
        -								'<table class="table table-condensed">'+
        -									DPGlobal.headTemplate+
        -									'<tbody></tbody>'+
        -									DPGlobal.footTemplate+
        -								'</table>'+
        -							'</div>'+
        -							'<div class="datepicker-months">'+
        -								'<table class="table table-condensed">'+
        -									DPGlobal.headTemplate+
        -									DPGlobal.contTemplate+
        -									DPGlobal.footTemplate+
        -								'</table>'+
        -							'</div>'+
        -							'<div class="datepicker-years">'+
        -								'<table class="table table-condensed">'+
        -									DPGlobal.headTemplate+
        -									DPGlobal.contTemplate+
        -									DPGlobal.footTemplate+
        -								'</table>'+
        -							'</div>'+
        -						'</div>';
        -
        -	$.fn.datepicker.DPGlobal = DPGlobal;
        -
        -
        -	/* DATEPICKER NO CONFLICT
        -	* =================== */
        -
        -	$.fn.datepicker.noConflict = function(){
        -		$.fn.datepicker = old;
        -		return this;
        -	};
        -
        -
        -	/* DATEPICKER DATA-API
        -	* ================== */
        -
        -	$(document).on(
        -		'focus.datepicker.data-api click.datepicker.data-api',
        -		'[data-provide="datepicker"]',
        -		function(e){
        -			var $this = $(this);
        -			if ($this.data('datepicker'))
        -				return;
        -			e.preventDefault();
        -			// component click requires us to explicitly show it
        -			$this.datepicker('show');
        -		}
        -	);
        -	$(function(){
        -		$('[data-provide="datepicker-inline"]').datepicker();
        -	});
        -
        -}(window.jQuery));
        -
        -/*!
        - * Select2 4.0.0
        - * https://select2.github.io
        - *
        - * Released under the MIT license
        - * https://github.com/select2/select2/blob/master/LICENSE.md
        - */
        -(function (factory) {
        -  if (typeof define === 'function' && define.amd) {
        -    // AMD. Register as an anonymous module.
        -    define(['jquery'], factory);
        -  } else if (typeof exports === 'object') {
        -    // Node/CommonJS
        -    factory(require('jquery'));
        -  } else {
        -    // Browser globals
        -    factory(jQuery);
        -  }
        -}(function (jQuery) {
        -  // This is needed so we can catch the AMD loader configuration and use it
        -  // The inner file should be wrapped (by `banner.start.js`) in a function that
        -  // returns the AMD loader references.
        -  var S2 =
        -(function () {
        -  // Restore the Select2 AMD loader so it can be used
        -  // Needed mostly in the language files, where the loader is not inserted
        -  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
        -    var S2 = jQuery.fn.select2.amd;
        -  }
        -var S2;(function () { if (!S2 || !S2.requirejs) {
        -if (!S2) { S2 = {}; } else { require = S2; }
        -/**
        - * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
        - * Available via the MIT or new BSD license.
        - * see: http://github.com/jrburke/almond for details
        - */
        -//Going sloppy to avoid 'use strict' string cost, but strict practices should
        -//be followed.
        -/*jslint sloppy: true */
        -/*global setTimeout: false */
        -
        -var requirejs, require, define;
        -(function (undef) {
        -    var main, req, makeMap, handlers,
        -        defined = {},
        -        waiting = {},
        -        config = {},
        -        defining = {},
        -        hasOwn = Object.prototype.hasOwnProperty,
        -        aps = [].slice,
        -        jsSuffixRegExp = /\.js$/;
        -
        -    function hasProp(obj, prop) {
        -        return hasOwn.call(obj, prop);
        -    }
        -
        -    /**
        -     * Given a relative module name, like ./something, normalize it to
        -     * a real name that can be mapped to a path.
        -     * @param {String} name the relative name
        -     * @param {String} baseName a real name that the name arg is relative
        -     * to.
        -     * @returns {String} normalized name
        -     */
        -    function normalize(name, baseName) {
        -        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
        -            foundI, foundStarMap, starI, i, j, part,
        -            baseParts = baseName && baseName.split("/"),
        -            map = config.map,
        -            starMap = (map && map['*']) || {};
        -
        -        //Adjust any relative paths.
        -        if (name && name.charAt(0) === ".") {
        -            //If have a base name, try to normalize against it,
        -            //otherwise, assume it is a top-level require that will
        -            //be relative to baseUrl in the end.
        -            if (baseName) {
        -                //Convert baseName to array, and lop off the last part,
        -                //so that . matches that "directory" and not name of the baseName's
        -                //module. For instance, baseName of "one/two/three", maps to
        -                //"one/two/three.js", but we want the directory, "one/two" for
        -                //this normalization.
        -                baseParts = baseParts.slice(0, baseParts.length - 1);
        -                name = name.split('/');
        -                lastIndex = name.length - 1;
        -
        -                // Node .js allowance:
        -                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
        -                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
        -                }
        -
        -                name = baseParts.concat(name);
        -
        -                //start trimDots
        -                for (i = 0; i < name.length; i += 1) {
        -                    part = name[i];
        -                    if (part === ".") {
        -                        name.splice(i, 1);
        -                        i -= 1;
        -                    } else if (part === "..") {
        -                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {
        -                            //End of the line. Keep at least one non-dot
        -                            //path segment at the front so it can be mapped
        -                            //correctly to disk. Otherwise, there is likely
        -                            //no path mapping for a path starting with '..'.
        -                            //This can still fail, but catches the most reasonable
        -                            //uses of ..
        -                            break;
        -                        } else if (i > 0) {
        -                            name.splice(i - 1, 2);
        -                            i -= 2;
        -                        }
        -                    }
        -                }
        -                //end trimDots
        -
        -                name = name.join("/");
        -            } else if (name.indexOf('./') === 0) {
        -                // No baseName, so this is ID is resolved relative
        -                // to baseUrl, pull off the leading dot.
        -                name = name.substring(2);
        -            }
        -        }
        -
        -        //Apply map config if available.
        -        if ((baseParts || starMap) && map) {
        -            nameParts = name.split('/');
        -
        -            for (i = nameParts.length; i > 0; i -= 1) {
        -                nameSegment = nameParts.slice(0, i).join("/");
        -
        -                if (baseParts) {
        -                    //Find the longest baseName segment match in the config.
        -                    //So, do joins on the biggest to smallest lengths of baseParts.
        -                    for (j = baseParts.length; j > 0; j -= 1) {
        -                        mapValue = map[baseParts.slice(0, j).join('/')];
        -
        -                        //baseName segment has  config, find if it has one for
        -                        //this name.
        -                        if (mapValue) {
        -                            mapValue = mapValue[nameSegment];
        -                            if (mapValue) {
        -                                //Match, update name to the new value.
        -                                foundMap = mapValue;
        -                                foundI = i;
        -                                break;
        -                            }
        -                        }
        -                    }
        -                }
        -
        -                if (foundMap) {
        -                    break;
        -                }
        -
        -                //Check for a star map match, but just hold on to it,
        -                //if there is a shorter segment match later in a matching
        -                //config, then favor over this star map.
        -                if (!foundStarMap && starMap && starMap[nameSegment]) {
        -                    foundStarMap = starMap[nameSegment];
        -                    starI = i;
        -                }
        -            }
        -
        -            if (!foundMap && foundStarMap) {
        -                foundMap = foundStarMap;
        -                foundI = starI;
        -            }
        -
        -            if (foundMap) {
        -                nameParts.splice(0, foundI, foundMap);
        -                name = nameParts.join('/');
        -            }
        -        }
        -
        -        return name;
        -    }
        -
        -    function makeRequire(relName, forceSync) {
        -        return function () {
        -            //A version of a require function that passes a moduleName
        -            //value for items that may need to
        -            //look up paths relative to the moduleName
        -            return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
        -        };
        -    }
        -
        -    function makeNormalize(relName) {
        -        return function (name) {
        -            return normalize(name, relName);
        -        };
        -    }
        -
        -    function makeLoad(depName) {
        -        return function (value) {
        -            defined[depName] = value;
        -        };
        -    }
        -
        -    function callDep(name) {
        -        if (hasProp(waiting, name)) {
        -            var args = waiting[name];
        -            delete waiting[name];
        -            defining[name] = true;
        -            main.apply(undef, args);
        -        }
        -
        -        if (!hasProp(defined, name) && !hasProp(defining, name)) {
        -            throw new Error('No ' + name);
        -        }
        -        return defined[name];
        -    }
        -
        -    //Turns a plugin!resource to [plugin, resource]
        -    //with the plugin being undefined if the name
        -    //did not have a plugin prefix.
        -    function splitPrefix(name) {
        -        var prefix,
        -            index = name ? name.indexOf('!') : -1;
        -        if (index > -1) {
        -            prefix = name.substring(0, index);
        -            name = name.substring(index + 1, name.length);
        -        }
        -        return [prefix, name];
        -    }
        -
        -    /**
        -     * Makes a name map, normalizing the name, and using a plugin
        -     * for normalization if necessary. Grabs a ref to plugin
        -     * too, as an optimization.
        -     */
        -    makeMap = function (name, relName) {
        -        var plugin,
        -            parts = splitPrefix(name),
        -            prefix = parts[0];
        -
        -        name = parts[1];
        -
        -        if (prefix) {
        -            prefix = normalize(prefix, relName);
        -            plugin = callDep(prefix);
        -        }
        -
        -        //Normalize according
        -        if (prefix) {
        -            if (plugin && plugin.normalize) {
        -                name = plugin.normalize(name, makeNormalize(relName));
        -            } else {
        -                name = normalize(name, relName);
        -            }
        -        } else {
        -            name = normalize(name, relName);
        -            parts = splitPrefix(name);
        -            prefix = parts[0];
        -            name = parts[1];
        -            if (prefix) {
        -                plugin = callDep(prefix);
        -            }
        -        }
        -
        -        //Using ridiculous property names for space reasons
        -        return {
        -            f: prefix ? prefix + '!' + name : name, //fullName
        -            n: name,
        -            pr: prefix,
        -            p: plugin
        -        };
        -    };
        -
        -    function makeConfig(name) {
        -        return function () {
        -            return (config && config.config && config.config[name]) || {};
        -        };
        -    }
        -
        -    handlers = {
        -        require: function (name) {
        -            return makeRequire(name);
        -        },
        -        exports: function (name) {
        -            var e = defined[name];
        -            if (typeof e !== 'undefined') {
        -                return e;
        -            } else {
        -                return (defined[name] = {});
        -            }
        -        },
        -        module: function (name) {
        -            return {
        -                id: name,
        -                uri: '',
        -                exports: defined[name],
        -                config: makeConfig(name)
        -            };
        -        }
        -    };
        -
        -    main = function (name, deps, callback, relName) {
        -        var cjsModule, depName, ret, map, i,
        -            args = [],
        -            callbackType = typeof callback,
        -            usingExports;
        -
        -        //Use name if no relName
        -        relName = relName || name;
        -
        -        //Call the callback to define the module, if necessary.
        -        if (callbackType === 'undefined' || callbackType === 'function') {
        -            //Pull out the defined dependencies and pass the ordered
        -            //values to the callback.
        -            //Default to [require, exports, module] if no deps
        -            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
        -            for (i = 0; i < deps.length; i += 1) {
        -                map = makeMap(deps[i], relName);
        -                depName = map.f;
        -
        -                //Fast path CommonJS standard dependencies.
        -                if (depName === "require") {
        -                    args[i] = handlers.require(name);
        -                } else if (depName === "exports") {
        -                    //CommonJS module spec 1.1
        -                    args[i] = handlers.exports(name);
        -                    usingExports = true;
        -                } else if (depName === "module") {
        -                    //CommonJS module spec 1.1
        -                    cjsModule = args[i] = handlers.module(name);
        -                } else if (hasProp(defined, depName) ||
        -                           hasProp(waiting, depName) ||
        -                           hasProp(defining, depName)) {
        -                    args[i] = callDep(depName);
        -                } else if (map.p) {
        -                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
        -                    args[i] = defined[depName];
        -                } else {
        -                    throw new Error(name + ' missing ' + depName);
        -                }
        -            }
        -
        -            ret = callback ? callback.apply(defined[name], args) : undefined;
        -
        -            if (name) {
        -                //If setting exports via "module" is in play,
        -                //favor that over return value and exports. After that,
        -                //favor a non-undefined return value over exports use.
        -                if (cjsModule && cjsModule.exports !== undef &&
        -                        cjsModule.exports !== defined[name]) {
        -                    defined[name] = cjsModule.exports;
        -                } else if (ret !== undef || !usingExports) {
        -                    //Use the return value from the function.
        -                    defined[name] = ret;
        -                }
        -            }
        -        } else if (name) {
        -            //May just be an object definition for the module. Only
        -            //worry about defining if have a module name.
        -            defined[name] = callback;
        -        }
        -    };
        -
        -    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
        -        if (typeof deps === "string") {
        -            if (handlers[deps]) {
        -                //callback in this case is really relName
        -                return handlers[deps](callback);
        -            }
        -            //Just return the module wanted. In this scenario, the
        -            //deps arg is the module name, and second arg (if passed)
        -            //is just the relName.
        -            //Normalize module name, if it contains . or ..
        -            return callDep(makeMap(deps, callback).f);
        -        } else if (!deps.splice) {
        -            //deps is a config object, not an array.
        -            config = deps;
        -            if (config.deps) {
        -                req(config.deps, config.callback);
        -            }
        -            if (!callback) {
        -                return;
        -            }
        -
        -            if (callback.splice) {
        -                //callback is an array, which means it is a dependency list.
        -                //Adjust args if there are dependencies
        -                deps = callback;
        -                callback = relName;
        -                relName = null;
        -            } else {
        -                deps = undef;
        -            }
        -        }
        -
        -        //Support require(['a'])
        -        callback = callback || function () {};
        -
        -        //If relName is a function, it is an errback handler,
        -        //so remove it.
        -        if (typeof relName === 'function') {
        -            relName = forceSync;
        -            forceSync = alt;
        -        }
        -
        -        //Simulate async callback;
        -        if (forceSync) {
        -            main(undef, deps, callback, relName);
        -        } else {
        -            //Using a non-zero value because of concern for what old browsers
        -            //do, and latest browsers "upgrade" to 4 if lower value is used:
        -            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
        -            //If want a value immediately, use require('id') instead -- something
        -            //that works in almond on the global level, but not guaranteed and
        -            //unlikely to work in other AMD implementations.
        -            setTimeout(function () {
        -                main(undef, deps, callback, relName);
        -            }, 4);
        -        }
        -
        -        return req;
        -    };
        -
        -    /**
        -     * Just drops the config on the floor, but returns req in case
        -     * the config return value is used.
        -     */
        -    req.config = function (cfg) {
        -        return req(cfg);
        -    };
        -
        -    /**
        -     * Expose module registry for debugging and tooling
        -     */
        -    requirejs._defined = defined;
        -
        -    define = function (name, deps, callback) {
        -
        -        //This module may not have dependencies
        -        if (!deps.splice) {
        -            //deps is not an array, so probably means
        -            //an object literal or factory function for
        -            //the value. Adjust args.
        -            callback = deps;
        -            deps = [];
        -        }
        -
        -        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
        -            waiting[name] = [name, deps, callback];
        -        }
        -    };
        -
        -    define.amd = {
        -        jQuery: true
        -    };
        -}());
        -
        -S2.requirejs = requirejs;S2.require = require;S2.define = define;
        -}
        -}());
        -S2.define("almond", function(){});
        -
        -/* global jQuery:false, $:false */
        -S2.define('jquery',[],function () {
        -  var _$ = jQuery || $;
        -
        -  if (_$ == null && console && console.error) {
        -    console.error(
        -      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
        -      'found. Make sure that you are including jQuery before Select2 on your ' +
        -      'web page.'
        -    );
        -  }
        -
        -  return _$;
        -});
        -
        -S2.define('select2/utils',[
        -  'jquery'
        -], function ($) {
        -  var Utils = {};
        -
        -  Utils.Extend = function (ChildClass, SuperClass) {
        -    var __hasProp = {}.hasOwnProperty;
        -
        -    function BaseConstructor () {
        -      this.constructor = ChildClass;
        -    }
        -
        -    for (var key in SuperClass) {
        -      if (__hasProp.call(SuperClass, key)) {
        -        ChildClass[key] = SuperClass[key];
        -      }
        -    }
        -
        -    BaseConstructor.prototype = SuperClass.prototype;
        -    ChildClass.prototype = new BaseConstructor();
        -    ChildClass.__super__ = SuperClass.prototype;
        -
        -    return ChildClass;
        -  };
        -
        -  function getMethods (theClass) {
        -    var proto = theClass.prototype;
        -
        -    var methods = [];
        -
        -    for (var methodName in proto) {
        -      var m = proto[methodName];
        -
        -      if (typeof m !== 'function') {
        -        continue;
        -      }
        -
        -      if (methodName === 'constructor') {
        -        continue;
        -      }
        -
        -      methods.push(methodName);
        -    }
        -
        -    return methods;
        -  }
        -
        -  Utils.Decorate = function (SuperClass, DecoratorClass) {
        -    var decoratedMethods = getMethods(DecoratorClass);
        -    var superMethods = getMethods(SuperClass);
        -
        -    function DecoratedClass () {
        -      var unshift = Array.prototype.unshift;
        -
        -      var argCount = DecoratorClass.prototype.constructor.length;
        -
        -      var calledConstructor = SuperClass.prototype.constructor;
        -
        -      if (argCount > 0) {
        -        unshift.call(arguments, SuperClass.prototype.constructor);
        -
        -        calledConstructor = DecoratorClass.prototype.constructor;
        -      }
        -
        -      calledConstructor.apply(this, arguments);
        -    }
        -
        -    DecoratorClass.displayName = SuperClass.displayName;
        -
        -    function ctr () {
        -      this.constructor = DecoratedClass;
        -    }
        -
        -    DecoratedClass.prototype = new ctr();
        -
        -    for (var m = 0; m < superMethods.length; m++) {
        -        var superMethod = superMethods[m];
        -
        -        DecoratedClass.prototype[superMethod] =
        -          SuperClass.prototype[superMethod];
        -    }
        -
        -    var calledMethod = function (methodName) {
        -      // Stub out the original method if it's not decorating an actual method
        -      var originalMethod = function () {};
        -
        -      if (methodName in DecoratedClass.prototype) {
        -        originalMethod = DecoratedClass.prototype[methodName];
        -      }
        -
        -      var decoratedMethod = DecoratorClass.prototype[methodName];
        -
        -      return function () {
        -        var unshift = Array.prototype.unshift;
        -
        -        unshift.call(arguments, originalMethod);
        -
        -        return decoratedMethod.apply(this, arguments);
        -      };
        -    };
        -
        -    for (var d = 0; d < decoratedMethods.length; d++) {
        -      var decoratedMethod = decoratedMethods[d];
        -
        -      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
        -    }
        -
        -    return DecoratedClass;
        -  };
        -
        -  var Observable = function () {
        -    this.listeners = {};
        -  };
        -
        -  Observable.prototype.on = function (event, callback) {
        -    this.listeners = this.listeners || {};
        -
        -    if (event in this.listeners) {
        -      this.listeners[event].push(callback);
        -    } else {
        -      this.listeners[event] = [callback];
        -    }
        -  };
        -
        -  Observable.prototype.trigger = function (event) {
        -    var slice = Array.prototype.slice;
        -
        -    this.listeners = this.listeners || {};
        -
        -    if (event in this.listeners) {
        -      this.invoke(this.listeners[event], slice.call(arguments, 1));
        -    }
        -
        -    if ('*' in this.listeners) {
        -      this.invoke(this.listeners['*'], arguments);
        -    }
        -  };
        -
        -  Observable.prototype.invoke = function (listeners, params) {
        -    for (var i = 0, len = listeners.length; i < len; i++) {
        -      listeners[i].apply(this, params);
        -    }
        -  };
        -
        -  Utils.Observable = Observable;
        -
        -  Utils.generateChars = function (length) {
        -    var chars = '';
        -
        -    for (var i = 0; i < length; i++) {
        -      var randomChar = Math.floor(Math.random() * 36);
        -      chars += randomChar.toString(36);
        -    }
        -
        -    return chars;
        -  };
        -
        -  Utils.bind = function (func, context) {
        -    return function () {
        -      func.apply(context, arguments);
        -    };
        -  };
        -
        -  Utils._convertData = function (data) {
        -    for (var originalKey in data) {
        -      var keys = originalKey.split('-');
        -
        -      var dataLevel = data;
        -
        -      if (keys.length === 1) {
        -        continue;
        -      }
        -
        -      for (var k = 0; k < keys.length; k++) {
        -        var key = keys[k];
        -
        -        // Lowercase the first letter
        -        // By default, dash-separated becomes camelCase
        -        key = key.substring(0, 1).toLowerCase() + key.substring(1);
        -
        -        if (!(key in dataLevel)) {
        -          dataLevel[key] = {};
        -        }
        -
        -        if (k == keys.length - 1) {
        -          dataLevel[key] = data[originalKey];
        -        }
        -
        -        dataLevel = dataLevel[key];
        -      }
        -
        -      delete data[originalKey];
        -    }
        -
        -    return data;
        -  };
        -
        -  Utils.hasScroll = function (index, el) {
        -    // Adapted from the function created by @ShadowScripter
        -    // and adapted by @BillBarry on the Stack Exchange Code Review website.
        -    // The original code can be found at
        -    // http://codereview.stackexchange.com/q/13338
        -    // and was designed to be used with the Sizzle selector engine.
        -
        -    var $el = $(el);
        -    var overflowX = el.style.overflowX;
        -    var overflowY = el.style.overflowY;
        -
        -    //Check both x and y declarations
        -    if (overflowX === overflowY &&
        -        (overflowY === 'hidden' || overflowY === 'visible')) {
        -      return false;
        -    }
        -
        -    if (overflowX === 'scroll' || overflowY === 'scroll') {
        -      return true;
        -    }
        -
        -    return ($el.innerHeight() < el.scrollHeight ||
        -      $el.innerWidth() < el.scrollWidth);
        -  };
        -
        -  Utils.escapeMarkup = function (markup) {
        -    var replaceMap = {
        -      '\\': '&#92;',
        -      '&': '&amp;',
        -      '<': '&lt;',
        -      '>': '&gt;',
        -      '"': '&quot;',
        -      '\'': '&#39;',
        -      '/': '&#47;'
        -    };
        -
        -    // Do not try to escape the markup if it's not a string
        -    if (typeof markup !== 'string') {
        -      return markup;
        -    }
        -
        -    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
        -      return replaceMap[match];
        -    });
        -  };
        -
        -  // Append an array of jQuery nodes to a given element.
        -  Utils.appendMany = function ($element, $nodes) {
        -    // jQuery 1.7.x does not support $.fn.append() with an array
        -    // Fall back to a jQuery object collection using $.fn.add()
        -    if ($.fn.jquery.substr(0, 3) === '1.7') {
        -      var $jqNodes = $();
        -
        -      $.map($nodes, function (node) {
        -        $jqNodes = $jqNodes.add(node);
        -      });
        -
        -      $nodes = $jqNodes;
        -    }
        -
        -    $element.append($nodes);
        -  };
        -
        -  return Utils;
        -});
        -
        -S2.define('select2/results',[
        -  'jquery',
        -  './utils'
        -], function ($, Utils) {
        -  function Results ($element, options, dataAdapter) {
        -    this.$element = $element;
        -    this.data = dataAdapter;
        -    this.options = options;
        -
        -    Results.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(Results, Utils.Observable);
        -
        -  Results.prototype.render = function () {
        -    var $results = $(
        -      '<ul class="select2-results__options" role="tree"></ul>'
        -    );
        -
        -    if (this.options.get('multiple')) {
        -      $results.attr('aria-multiselectable', 'true');
        -    }
        -
        -    this.$results = $results;
        -
        -    return $results;
        -  };
        -
        -  Results.prototype.clear = function () {
        -    this.$results.empty();
        -  };
        -
        -  Results.prototype.displayMessage = function (params) {
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    this.clear();
        -    this.hideLoading();
        -
        -    var $message = $(
        -      '<li role="treeitem" class="select2-results__option"></li>'
        -    );
        -
        -    var message = this.options.get('translations').get(params.message);
        -
        -    $message.append(
        -      escapeMarkup(
        -        message(params.args)
        -      )
        -    );
        -
        -    this.$results.append($message);
        -  };
        -
        -  Results.prototype.append = function (data) {
        -    this.hideLoading();
        -
        -    var $options = [];
        -
        -    if (data.results == null || data.results.length === 0) {
        -      if (this.$results.children().length === 0) {
        -        this.trigger('results:message', {
        -          message: 'noResults'
        -        });
        -      }
        -
        -      return;
        -    }
        -
        -    data.results = this.sort(data.results);
        -
        -    for (var d = 0; d < data.results.length; d++) {
        -      var item = data.results[d];
        -
        -      var $option = this.option(item);
        -
        -      $options.push($option);
        -    }
        -
        -    this.$results.append($options);
        -  };
        -
        -  Results.prototype.position = function ($results, $dropdown) {
        -    var $resultsContainer = $dropdown.find('.select2-results');
        -    $resultsContainer.append($results);
        -  };
        -
        -  Results.prototype.sort = function (data) {
        -    var sorter = this.options.get('sorter');
        -
        -    return sorter(data);
        -  };
        -
        -  Results.prototype.setClasses = function () {
        -    var self = this;
        -
        -    this.data.current(function (selected) {
        -      var selectedIds = $.map(selected, function (s) {
        -        return s.id.toString();
        -      });
        -
        -      var $options = self.$results
        -        .find('.select2-results__option[aria-selected]');
        -
        -      $options.each(function () {
        -        var $option = $(this);
        -
        -        var item = $.data(this, 'data');
        -
        -        // id needs to be converted to a string when comparing
        -        var id = '' + item.id;
        -
        -        if ((item.element != null && item.element.selected) ||
        -            (item.element == null && $.inArray(id, selectedIds) > -1)) {
        -          $option.attr('aria-selected', 'true');
        -        } else {
        -          $option.attr('aria-selected', 'false');
        -        }
        -      });
        -
        -      var $selected = $options.filter('[aria-selected=true]');
        -
        -      // Check if there are any selected options
        -      if ($selected.length > 0) {
        -        // If there are selected options, highlight the first
        -        $selected.first().trigger('mouseenter');
        -      } else {
        -        // If there are no selected options, highlight the first option
        -        // in the dropdown
        -        $options.first().trigger('mouseenter');
        -      }
        -    });
        -  };
        -
        -  Results.prototype.showLoading = function (params) {
        -    this.hideLoading();
        -
        -    var loadingMore = this.options.get('translations').get('searching');
        -
        -    var loading = {
        -      disabled: true,
        -      loading: true,
        -      text: loadingMore(params)
        -    };
        -    var $loading = this.option(loading);
        -    $loading.className += ' loading-results';
        -
        -    this.$results.prepend($loading);
        -  };
        -
        -  Results.prototype.hideLoading = function () {
        -    this.$results.find('.loading-results').remove();
        -  };
        -
        -  Results.prototype.option = function (data) {
        -    var option = document.createElement('li');
        -    option.className = 'select2-results__option';
        -
        -    var attrs = {
        -      'role': 'treeitem',
        -      'aria-selected': 'false'
        -    };
        -
        -    if (data.disabled) {
        -      delete attrs['aria-selected'];
        -      attrs['aria-disabled'] = 'true';
        -    }
        -
        -    if (data.id == null) {
        -      delete attrs['aria-selected'];
        -    }
        -
        -    if (data._resultId != null) {
        -      option.id = data._resultId;
        -    }
        -
        -    if (data.title) {
        -      option.title = data.title;
        -    }
        -
        -    if (data.children) {
        -      attrs.role = 'group';
        -      attrs['aria-label'] = data.text;
        -      delete attrs['aria-selected'];
        -    }
        -
        -    for (var attr in attrs) {
        -      var val = attrs[attr];
        -
        -      option.setAttribute(attr, val);
        -    }
        -
        -    if (data.children) {
        -      var $option = $(option);
        -
        -      var label = document.createElement('strong');
        -      label.className = 'select2-results__group';
        -
        -      var $label = $(label);
        -      this.template(data, label);
        -
        -      var $children = [];
        -
        -      for (var c = 0; c < data.children.length; c++) {
        -        var child = data.children[c];
        -
        -        var $child = this.option(child);
        -
        -        $children.push($child);
        -      }
        -
        -      var $childrenContainer = $('<ul></ul>', {
        -        'class': 'select2-results__options select2-results__options--nested'
        -      });
        -
        -      $childrenContainer.append($children);
        -
        -      $option.append(label);
        -      $option.append($childrenContainer);
        -    } else {
        -      this.template(data, option);
        -    }
        -
        -    $.data(option, 'data', data);
        -
        -    return option;
        -  };
        -
        -  Results.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    var id = container.id + '-results';
        -
        -    this.$results.attr('id', id);
        -
        -    container.on('results:all', function (params) {
        -      self.clear();
        -      self.append(params.data);
        -
        -      if (container.isOpen()) {
        -        self.setClasses();
        -      }
        -    });
        -
        -    container.on('results:append', function (params) {
        -      self.append(params.data);
        -
        -      if (container.isOpen()) {
        -        self.setClasses();
        -      }
        -    });
        -
        -    container.on('query', function (params) {
        -      self.showLoading(params);
        -    });
        -
        -    container.on('select', function () {
        -      if (!container.isOpen()) {
        -        return;
        -      }
        -
        -      self.setClasses();
        -    });
        -
        -    container.on('unselect', function () {
        -      if (!container.isOpen()) {
        -        return;
        -      }
        -
        -      self.setClasses();
        -    });
        -
        -    container.on('open', function () {
        -      // When the dropdown is open, aria-expended="true"
        -      self.$results.attr('aria-expanded', 'true');
        -      self.$results.attr('aria-hidden', 'false');
        -
        -      self.setClasses();
        -      self.ensureHighlightVisible();
        -    });
        -
        -    container.on('close', function () {
        -      // When the dropdown is closed, aria-expended="false"
        -      self.$results.attr('aria-expanded', 'false');
        -      self.$results.attr('aria-hidden', 'true');
        -      self.$results.removeAttr('aria-activedescendant');
        -    });
        -
        -    container.on('results:toggle', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      if ($highlighted.length === 0) {
        -        return;
        -      }
        -
        -      $highlighted.trigger('mouseup');
        -    });
        -
        -    container.on('results:select', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      if ($highlighted.length === 0) {
        -        return;
        -      }
        -
        -      var data = $highlighted.data('data');
        -
        -      if ($highlighted.attr('aria-selected') == 'true') {
        -        self.trigger('close');
        -      } else {
        -        self.trigger('select', {
        -          data: data
        -        });
        -      }
        -    });
        -
        -    container.on('results:previous', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      var $options = self.$results.find('[aria-selected]');
        -
        -      var currentIndex = $options.index($highlighted);
        -
        -      // If we are already at te top, don't move further
        -      if (currentIndex === 0) {
        -        return;
        -      }
        -
        -      var nextIndex = currentIndex - 1;
        -
        -      // If none are highlighted, highlight the first
        -      if ($highlighted.length === 0) {
        -        nextIndex = 0;
        -      }
        -
        -      var $next = $options.eq(nextIndex);
        -
        -      $next.trigger('mouseenter');
        -
        -      var currentOffset = self.$results.offset().top;
        -      var nextTop = $next.offset().top;
        -      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
        -
        -      if (nextIndex === 0) {
        -        self.$results.scrollTop(0);
        -      } else if (nextTop - currentOffset < 0) {
        -        self.$results.scrollTop(nextOffset);
        -      }
        -    });
        -
        -    container.on('results:next', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      var $options = self.$results.find('[aria-selected]');
        -
        -      var currentIndex = $options.index($highlighted);
        -
        -      var nextIndex = currentIndex + 1;
        -
        -      // If we are at the last option, stay there
        -      if (nextIndex >= $options.length) {
        -        return;
        -      }
        -
        -      var $next = $options.eq(nextIndex);
        -
        -      $next.trigger('mouseenter');
        -
        -      var currentOffset = self.$results.offset().top +
        -        self.$results.outerHeight(false);
        -      var nextBottom = $next.offset().top + $next.outerHeight(false);
        -      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
        -
        -      if (nextIndex === 0) {
        -        self.$results.scrollTop(0);
        -      } else if (nextBottom > currentOffset) {
        -        self.$results.scrollTop(nextOffset);
        -      }
        -    });
        -
        -    container.on('results:focus', function (params) {
        -      params.element.addClass('select2-results__option--highlighted');
        -    });
        -
        -    container.on('results:message', function (params) {
        -      self.displayMessage(params);
        -    });
        -
        -    if ($.fn.mousewheel) {
        -      this.$results.on('mousewheel', function (e) {
        -        var top = self.$results.scrollTop();
        -
        -        var bottom = (
        -          self.$results.get(0).scrollHeight -
        -          self.$results.scrollTop() +
        -          e.deltaY
        -        );
        -
        -        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
        -        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
        -
        -        if (isAtTop) {
        -          self.$results.scrollTop(0);
        -
        -          e.preventDefault();
        -          e.stopPropagation();
        -        } else if (isAtBottom) {
        -          self.$results.scrollTop(
        -            self.$results.get(0).scrollHeight - self.$results.height()
        -          );
        -
        -          e.preventDefault();
        -          e.stopPropagation();
        -        }
        -      });
        -    }
        -
        -    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
        -      function (evt) {
        -      var $this = $(this);
        -
        -      var data = $this.data('data');
        -
        -      if ($this.attr('aria-selected') === 'true') {
        -        if (self.options.get('multiple')) {
        -          self.trigger('unselect', {
        -            originalEvent: evt,
        -            data: data
        -          });
        -        } else {
        -          self.trigger('close');
        -        }
        -
        -        return;
        -      }
        -
        -      self.trigger('select', {
        -        originalEvent: evt,
        -        data: data
        -      });
        -    });
        -
        -    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
        -      function (evt) {
        -      var data = $(this).data('data');
        -
        -      self.getHighlightedResults()
        -          .removeClass('select2-results__option--highlighted');
        -
        -      self.trigger('results:focus', {
        -        data: data,
        -        element: $(this)
        -      });
        -    });
        -  };
        -
        -  Results.prototype.getHighlightedResults = function () {
        -    var $highlighted = this.$results
        -    .find('.select2-results__option--highlighted');
        -
        -    return $highlighted;
        -  };
        -
        -  Results.prototype.destroy = function () {
        -    this.$results.remove();
        -  };
        -
        -  Results.prototype.ensureHighlightVisible = function () {
        -    var $highlighted = this.getHighlightedResults();
        -
        -    if ($highlighted.length === 0) {
        -      return;
        -    }
        -
        -    var $options = this.$results.find('[aria-selected]');
        -
        -    var currentIndex = $options.index($highlighted);
        -
        -    var currentOffset = this.$results.offset().top;
        -    var nextTop = $highlighted.offset().top;
        -    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
        -
        -    var offsetDelta = nextTop - currentOffset;
        -    nextOffset -= $highlighted.outerHeight(false) * 2;
        -
        -    if (currentIndex <= 2) {
        -      this.$results.scrollTop(0);
        -    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
        -      this.$results.scrollTop(nextOffset);
        -    }
        -  };
        -
        -  Results.prototype.template = function (result, container) {
        -    var template = this.options.get('templateResult');
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    var content = template(result);
        -
        -    if (content == null) {
        -      container.style.display = 'none';
        -    } else if (typeof content === 'string') {
        -      container.innerHTML = escapeMarkup(content);
        -    } else {
        -      $(container).append(content);
        -    }
        -  };
        -
        -  return Results;
        -});
        -
        -S2.define('select2/keys',[
        -
        -], function () {
        -  var KEYS = {
        -    BACKSPACE: 8,
        -    TAB: 9,
        -    ENTER: 13,
        -    SHIFT: 16,
        -    CTRL: 17,
        -    ALT: 18,
        -    ESC: 27,
        -    SPACE: 32,
        -    PAGE_UP: 33,
        -    PAGE_DOWN: 34,
        -    END: 35,
        -    HOME: 36,
        -    LEFT: 37,
        -    UP: 38,
        -    RIGHT: 39,
        -    DOWN: 40,
        -    DELETE: 46
        -  };
        -
        -  return KEYS;
        -});
        -
        -S2.define('select2/selection/base',[
        -  'jquery',
        -  '../utils',
        -  '../keys'
        -], function ($, Utils, KEYS) {
        -  function BaseSelection ($element, options) {
        -    this.$element = $element;
        -    this.options = options;
        -
        -    BaseSelection.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(BaseSelection, Utils.Observable);
        -
        -  BaseSelection.prototype.render = function () {
        -    var $selection = $(
        -      '<span class="select2-selection" role="combobox" ' +
        -      'aria-autocomplete="list" aria-haspopup="true" aria-expanded="false">' +
        -      '</span>'
        -    );
        -
        -    this._tabindex = 0;
        -
        -    if (this.$element.data('old-tabindex') != null) {
        -      this._tabindex = this.$element.data('old-tabindex');
        -    } else if (this.$element.attr('tabindex') != null) {
        -      this._tabindex = this.$element.attr('tabindex');
        -    }
        -
        -    $selection.attr('title', this.$element.attr('title'));
        -    $selection.attr('tabindex', this._tabindex);
        -
        -    this.$selection = $selection;
        -
        -    return $selection;
        -  };
        -
        -  BaseSelection.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    var id = container.id + '-container';
        -    var resultsId = container.id + '-results';
        -
        -    this.container = container;
        -
        -    this.$selection.on('focus', function (evt) {
        -      self.trigger('focus', evt);
        -    });
        -
        -    this.$selection.on('blur', function (evt) {
        -      self.trigger('blur', evt);
        -    });
        -
        -    this.$selection.on('keydown', function (evt) {
        -      self.trigger('keypress', evt);
        -
        -      if (evt.which === KEYS.SPACE) {
        -        evt.preventDefault();
        -      }
        -    });
        -
        -    container.on('results:focus', function (params) {
        -      self.$selection.attr('aria-activedescendant', params.data._resultId);
        -    });
        -
        -    container.on('selection:update', function (params) {
        -      self.update(params.data);
        -    });
        -
        -    container.on('open', function () {
        -      // When the dropdown is open, aria-expanded="true"
        -      self.$selection.attr('aria-expanded', 'true');
        -      self.$selection.attr('aria-owns', resultsId);
        -
        -      self._attachCloseHandler(container);
        -    });
        -
        -    container.on('close', function () {
        -      // When the dropdown is closed, aria-expanded="false"
        -      self.$selection.attr('aria-expanded', 'false');
        -      self.$selection.removeAttr('aria-activedescendant');
        -      self.$selection.removeAttr('aria-owns');
        -
        -      self.$selection.focus();
        -
        -      self._detachCloseHandler(container);
        -    });
        -
        -    container.on('enable', function () {
        -      self.$selection.attr('tabindex', self._tabindex);
        -    });
        -
        -    container.on('disable', function () {
        -      self.$selection.attr('tabindex', '-1');
        -    });
        -  };
        -
        -  BaseSelection.prototype._attachCloseHandler = function (container) {
        -    var self = this;
        -
        -    $(document.body).on('mousedown.select2.' + container.id, function (e) {
        -      var $target = $(e.target);
        -
        -      var $select = $target.closest('.select2');
        -
        -      var $all = $('.select2.select2-container--open');
        -
        -      $all.each(function () {
        -        var $this = $(this);
        -
        -        if (this == $select[0]) {
        -          return;
        -        }
        -
        -        var $element = $this.data('element');
        -
        -        $element.select2('close');
        -      });
        -    });
        -  };
        -
        -  BaseSelection.prototype._detachCloseHandler = function (container) {
        -    $(document.body).off('mousedown.select2.' + container.id);
        -  };
        -
        -  BaseSelection.prototype.position = function ($selection, $container) {
        -    var $selectionContainer = $container.find('.selection');
        -    $selectionContainer.append($selection);
        -  };
        -
        -  BaseSelection.prototype.destroy = function () {
        -    this._detachCloseHandler(this.container);
        -  };
        -
        -  BaseSelection.prototype.update = function (data) {
        -    throw new Error('The `update` method must be defined in child classes.');
        -  };
        -
        -  return BaseSelection;
        -});
        -
        -S2.define('select2/selection/single',[
        -  'jquery',
        -  './base',
        -  '../utils',
        -  '../keys'
        -], function ($, BaseSelection, Utils, KEYS) {
        -  function SingleSelection () {
        -    SingleSelection.__super__.constructor.apply(this, arguments);
        -  }
        -
        -  Utils.Extend(SingleSelection, BaseSelection);
        -
        -  SingleSelection.prototype.render = function () {
        -    var $selection = SingleSelection.__super__.render.call(this);
        -
        -    $selection.addClass('select2-selection--single');
        -
        -    $selection.html(
        -      '<span class="select2-selection__rendered"></span>' +
        -      '<span class="select2-selection__arrow" role="presentation">' +
        -        '<b role="presentation"></b>' +
        -      '</span>'
        -    );
        -
        -    return $selection;
        -  };
        -
        -  SingleSelection.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    SingleSelection.__super__.bind.apply(this, arguments);
        -
        -    var id = container.id + '-container';
        -
        -    this.$selection.find('.select2-selection__rendered').attr('id', id);
        -    this.$selection.attr('aria-labelledby', id);
        -
        -    this.$selection.on('mousedown', function (evt) {
        -      // Only respond to left clicks
        -      if (evt.which !== 1) {
        -        return;
        -      }
        -
        -      self.trigger('toggle', {
        -        originalEvent: evt
        -      });
        -    });
        -
        -    this.$selection.on('focus', function (evt) {
        -      // User focuses on the container
        -    });
        -
        -    this.$selection.on('blur', function (evt) {
        -      // User exits the container
        -    });
        -
        -    container.on('selection:update', function (params) {
        -      self.update(params.data);
        -    });
        -  };
        -
        -  SingleSelection.prototype.clear = function () {
        -    this.$selection.find('.select2-selection__rendered').empty();
        -  };
        -
        -  SingleSelection.prototype.display = function (data) {
        -    var template = this.options.get('templateSelection');
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    return escapeMarkup(template(data));
        -  };
        -
        -  SingleSelection.prototype.selectionContainer = function () {
        -    return $('<span></span>');
        -  };
        -
        -  SingleSelection.prototype.update = function (data) {
        -    if (data.length === 0) {
        -      this.clear();
        -      return;
        -    }
        -
        -    var selection = data[0];
        -
        -    var formatted = this.display(selection);
        -
        -    var $rendered = this.$selection.find('.select2-selection__rendered');
        -    $rendered.empty().append(formatted);
        -    $rendered.prop('title', selection.title || selection.text);
        -  };
        -
        -  return SingleSelection;
        -});
        -
        -S2.define('select2/selection/multiple',[
        -  'jquery',
        -  './base',
        -  '../utils'
        -], function ($, BaseSelection, Utils) {
        -  function MultipleSelection ($element, options) {
        -    MultipleSelection.__super__.constructor.apply(this, arguments);
        -  }
        -
        -  Utils.Extend(MultipleSelection, BaseSelection);
        -
        -  MultipleSelection.prototype.render = function () {
        -    var $selection = MultipleSelection.__super__.render.call(this);
        -
        -    $selection.addClass('select2-selection--multiple');
        -
        -    $selection.html(
        -      '<ul class="select2-selection__rendered"></ul>'
        -    );
        -
        -    return $selection;
        -  };
        -
        -  MultipleSelection.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    MultipleSelection.__super__.bind.apply(this, arguments);
        -
        -    this.$selection.on('click', function (evt) {
        -      self.trigger('toggle', {
        -        originalEvent: evt
        -      });
        -    });
        -
        -    this.$selection.on('click', '.select2-selection__choice__remove',
        -      function (evt) {
        -      var $remove = $(this);
        -      var $selection = $remove.parent();
        -
        -      var data = $selection.data('data');
        -
        -      self.trigger('unselect', {
        -        originalEvent: evt,
        -        data: data
        -      });
        -    });
        -  };
        -
        -  MultipleSelection.prototype.clear = function () {
        -    this.$selection.find('.select2-selection__rendered').empty();
        -  };
        -
        -  MultipleSelection.prototype.display = function (data) {
        -    var template = this.options.get('templateSelection');
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    return escapeMarkup(template(data));
        -  };
        -
        -  MultipleSelection.prototype.selectionContainer = function () {
        -    var $container = $(
        -      '<li class="select2-selection__choice">' +
        -        '<span class="select2-selection__choice__remove" role="presentation">' +
        -          '&times;' +
        -        '</span>' +
        -      '</li>'
        -    );
        -
        -    return $container;
        -  };
        -
        -  MultipleSelection.prototype.update = function (data) {
        -    this.clear();
        -
        -    if (data.length === 0) {
        -      return;
        -    }
        -
        -    var $selections = [];
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var selection = data[d];
        -
        -      var formatted = this.display(selection);
        -      var $selection = this.selectionContainer();
        -
        -      $selection.append(formatted);
        -      $selection.prop('title', selection.title || selection.text);
        -
        -      $selection.data('data', selection);
        -
        -      $selections.push($selection);
        -    }
        -
        -    var $rendered = this.$selection.find('.select2-selection__rendered');
        -
        -    Utils.appendMany($rendered, $selections);
        -  };
        -
        -  return MultipleSelection;
        -});
        -
        -S2.define('select2/selection/placeholder',[
        -  '../utils'
        -], function (Utils) {
        -  function Placeholder (decorated, $element, options) {
        -    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        -
        -    decorated.call(this, $element, options);
        -  }
        -
        -  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
        -    if (typeof placeholder === 'string') {
        -      placeholder = {
        -        id: '',
        -        text: placeholder
        -      };
        -    }
        -
        -    return placeholder;
        -  };
        -
        -  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
        -    var $placeholder = this.selectionContainer();
        -
        -    $placeholder.html(this.display(placeholder));
        -    $placeholder.addClass('select2-selection__placeholder')
        -                .removeClass('select2-selection__choice');
        -
        -    return $placeholder;
        -  };
        -
        -  Placeholder.prototype.update = function (decorated, data) {
        -    var singlePlaceholder = (
        -      data.length == 1 && data[0].id != this.placeholder.id
        -    );
        -    var multipleSelections = data.length > 1;
        -
        -    if (multipleSelections || singlePlaceholder) {
        -      return decorated.call(this, data);
        -    }
        -
        -    this.clear();
        -
        -    var $placeholder = this.createPlaceholder(this.placeholder);
        -
        -    this.$selection.find('.select2-selection__rendered').append($placeholder);
        -  };
        -
        -  return Placeholder;
        -});
        -
        -S2.define('select2/selection/allowClear',[
        -  'jquery',
        -  '../keys'
        -], function ($, KEYS) {
        -  function AllowClear () { }
        -
        -  AllowClear.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    if (this.placeholder == null) {
        -      if (this.options.get('debug') && window.console && console.error) {
        -        console.error(
        -          'Select2: The `allowClear` option should be used in combination ' +
        -          'with the `placeholder` option.'
        -        );
        -      }
        -    }
        -
        -    this.$selection.on('mousedown', '.select2-selection__clear',
        -      function (evt) {
        -        self._handleClear(evt);
        -    });
        -
        -    container.on('keypress', function (evt) {
        -      self._handleKeyboardClear(evt, container);
        -    });
        -  };
        -
        -  AllowClear.prototype._handleClear = function (_, evt) {
        -    // Ignore the event if it is disabled
        -    if (this.options.get('disabled')) {
        -      return;
        -    }
        -
        -    var $clear = this.$selection.find('.select2-selection__clear');
        -
        -    // Ignore the event if nothing has been selected
        -    if ($clear.length === 0) {
        -      return;
        -    }
        -
        -    evt.stopPropagation();
        -
        -    var data = $clear.data('data');
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var unselectData = {
        -        data: data[d]
        -      };
        -
        -      // Trigger the `unselect` event, so people can prevent it from being
        -      // cleared.
        -      this.trigger('unselect', unselectData);
        -
        -      // If the event was prevented, don't clear it out.
        -      if (unselectData.prevented) {
        -        return;
        -      }
        -    }
        -
        -    this.$element.val(this.placeholder.id).trigger('change');
        -
        -    this.trigger('toggle');
        -  };
        -
        -  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
        -    if (container.isOpen()) {
        -      return;
        -    }
        -
        -    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
        -      this._handleClear(evt);
        -    }
        -  };
        -
        -  AllowClear.prototype.update = function (decorated, data) {
        -    decorated.call(this, data);
        -
        -    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
        -        data.length === 0) {
        -      return;
        -    }
        -
        -    var $remove = $(
        -      '<span class="select2-selection__clear">' +
        -        '&times;' +
        -      '</span>'
        -    );
        -    $remove.data('data', data);
        -
        -    this.$selection.find('.select2-selection__rendered').prepend($remove);
        -  };
        -
        -  return AllowClear;
        -});
        -
        -S2.define('select2/selection/search',[
        -  'jquery',
        -  '../utils',
        -  '../keys'
        -], function ($, Utils, KEYS) {
        -  function Search (decorated, $element, options) {
        -    decorated.call(this, $element, options);
        -  }
        -
        -  Search.prototype.render = function (decorated) {
        -    var $search = $(
        -      '<li class="select2-search select2-search--inline">' +
        -        '<input class="select2-search__field" type="search" tabindex="-1"' +
        -        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        -        ' spellcheck="false" role="textbox" />' +
        -      '</li>'
        -    );
        -
        -    this.$searchContainer = $search;
        -    this.$search = $search.find('input');
        -
        -    var $rendered = decorated.call(this);
        -
        -    return $rendered;
        -  };
        -
        -  Search.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('open', function () {
        -      self.$search.attr('tabindex', 0);
        -
        -      self.$search.focus();
        -    });
        -
        -    container.on('close', function () {
        -      self.$search.attr('tabindex', -1);
        -
        -      self.$search.val('');
        -      self.$search.focus();
        -    });
        -
        -    container.on('enable', function () {
        -      self.$search.prop('disabled', false);
        -    });
        -
        -    container.on('disable', function () {
        -      self.$search.prop('disabled', true);
        -    });
        -
        -    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
        -      self.trigger('focus', evt);
        -    });
        -
        -    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
        -      self.trigger('blur', evt);
        -    });
        -
        -    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
        -      evt.stopPropagation();
        -
        -      self.trigger('keypress', evt);
        -
        -      self._keyUpPrevented = evt.isDefaultPrevented();
        -
        -      var key = evt.which;
        -
        -      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
        -        var $previousChoice = self.$searchContainer
        -          .prev('.select2-selection__choice');
        -
        -        if ($previousChoice.length > 0) {
        -          var item = $previousChoice.data('data');
        -
        -          self.searchRemoveChoice(item);
        -
        -          evt.preventDefault();
        -        }
        -      }
        -    });
        -
        -    // Workaround for browsers which do not support the `input` event
        -    // This will prevent double-triggering of events for browsers which support
        -    // both the `keyup` and `input` events.
        -    this.$selection.on('input', '.select2-search--inline', function (evt) {
        -      // Unbind the duplicated `keyup` event
        -      self.$selection.off('keyup.search');
        -    });
        -
        -    this.$selection.on('keyup.search input', '.select2-search--inline',
        -        function (evt) {
        -      self.handleSearch(evt);
        -    });
        -  };
        -
        -  Search.prototype.createPlaceholder = function (decorated, placeholder) {
        -    this.$search.attr('placeholder', placeholder.text);
        -  };
        -
        -  Search.prototype.update = function (decorated, data) {
        -    this.$search.attr('placeholder', '');
        -
        -    decorated.call(this, data);
        -
        -    this.$selection.find('.select2-selection__rendered')
        -                   .append(this.$searchContainer);
        -
        -    this.resizeSearch();
        -  };
        -
        -  Search.prototype.handleSearch = function () {
        -    this.resizeSearch();
        -
        -    if (!this._keyUpPrevented) {
        -      var input = this.$search.val();
        -
        -      this.trigger('query', {
        -        term: input
        -      });
        -    }
        -
        -    this._keyUpPrevented = false;
        -  };
        -
        -  Search.prototype.searchRemoveChoice = function (decorated, item) {
        -    this.trigger('unselect', {
        -      data: item
        -    });
        -
        -    this.trigger('open');
        -
        -    this.$search.val(item.text + ' ');
        -  };
        -
        -  Search.prototype.resizeSearch = function () {
        -    this.$search.css('width', '25px');
        -
        -    var width = '';
        -
        -    if (this.$search.attr('placeholder') !== '') {
        -      width = this.$selection.find('.select2-selection__rendered').innerWidth();
        -    } else {
        -      var minimumWidth = this.$search.val().length + 1;
        -
        -      width = (minimumWidth * 0.75) + 'em';
        -    }
        -
        -    this.$search.css('width', width);
        -  };
        -
        -  return Search;
        -});
        -
        -S2.define('select2/selection/eventRelay',[
        -  'jquery'
        -], function ($) {
        -  function EventRelay () { }
        -
        -  EventRelay.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -    var relayEvents = [
        -      'open', 'opening',
        -      'close', 'closing',
        -      'select', 'selecting',
        -      'unselect', 'unselecting'
        -    ];
        -
        -    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('*', function (name, params) {
        -      // Ignore events that should not be relayed
        -      if ($.inArray(name, relayEvents) === -1) {
        -        return;
        -      }
        -
        -      // The parameters should always be an object
        -      params = params || {};
        -
        -      // Generate the jQuery event for the Select2 event
        -      var evt = $.Event('select2:' + name, {
        -        params: params
        -      });
        -
        -      self.$element.trigger(evt);
        -
        -      // Only handle preventable events if it was one
        -      if ($.inArray(name, preventableEvents) === -1) {
        -        return;
        -      }
        -
        -      params.prevented = evt.isDefaultPrevented();
        -    });
        -  };
        -
        -  return EventRelay;
        -});
        -
        -S2.define('select2/translation',[
        -  'jquery',
        -  'require'
        -], function ($, require) {
        -  function Translation (dict) {
        -    this.dict = dict || {};
        -  }
        -
        -  Translation.prototype.all = function () {
        -    return this.dict;
        -  };
        -
        -  Translation.prototype.get = function (key) {
        -    return this.dict[key];
        -  };
        -
        -  Translation.prototype.extend = function (translation) {
        -    this.dict = $.extend({}, translation.all(), this.dict);
        -  };
        -
        -  // Static functions
        -
        -  Translation._cache = {};
        -
        -  Translation.loadPath = function (path) {
        -    if (!(path in Translation._cache)) {
        -      var translations = require(path);
        -
        -      Translation._cache[path] = translations;
        -    }
        -
        -    return new Translation(Translation._cache[path]);
        -  };
        -
        -  return Translation;
        -});
        -
        -S2.define('select2/diacritics',[
        -
        -], function () {
        -  var diacritics = {
        -    '\u24B6': 'A',
        -    '\uFF21': 'A',
        -    '\u00C0': 'A',
        -    '\u00C1': 'A',
        -    '\u00C2': 'A',
        -    '\u1EA6': 'A',
        -    '\u1EA4': 'A',
        -    '\u1EAA': 'A',
        -    '\u1EA8': 'A',
        -    '\u00C3': 'A',
        -    '\u0100': 'A',
        -    '\u0102': 'A',
        -    '\u1EB0': 'A',
        -    '\u1EAE': 'A',
        -    '\u1EB4': 'A',
        -    '\u1EB2': 'A',
        -    '\u0226': 'A',
        -    '\u01E0': 'A',
        -    '\u00C4': 'A',
        -    '\u01DE': 'A',
        -    '\u1EA2': 'A',
        -    '\u00C5': 'A',
        -    '\u01FA': 'A',
        -    '\u01CD': 'A',
        -    '\u0200': 'A',
        -    '\u0202': 'A',
        -    '\u1EA0': 'A',
        -    '\u1EAC': 'A',
        -    '\u1EB6': 'A',
        -    '\u1E00': 'A',
        -    '\u0104': 'A',
        -    '\u023A': 'A',
        -    '\u2C6F': 'A',
        -    '\uA732': 'AA',
        -    '\u00C6': 'AE',
        -    '\u01FC': 'AE',
        -    '\u01E2': 'AE',
        -    '\uA734': 'AO',
        -    '\uA736': 'AU',
        -    '\uA738': 'AV',
        -    '\uA73A': 'AV',
        -    '\uA73C': 'AY',
        -    '\u24B7': 'B',
        -    '\uFF22': 'B',
        -    '\u1E02': 'B',
        -    '\u1E04': 'B',
        -    '\u1E06': 'B',
        -    '\u0243': 'B',
        -    '\u0182': 'B',
        -    '\u0181': 'B',
        -    '\u24B8': 'C',
        -    '\uFF23': 'C',
        -    '\u0106': 'C',
        -    '\u0108': 'C',
        -    '\u010A': 'C',
        -    '\u010C': 'C',
        -    '\u00C7': 'C',
        -    '\u1E08': 'C',
        -    '\u0187': 'C',
        -    '\u023B': 'C',
        -    '\uA73E': 'C',
        -    '\u24B9': 'D',
        -    '\uFF24': 'D',
        -    '\u1E0A': 'D',
        -    '\u010E': 'D',
        -    '\u1E0C': 'D',
        -    '\u1E10': 'D',
        -    '\u1E12': 'D',
        -    '\u1E0E': 'D',
        -    '\u0110': 'D',
        -    '\u018B': 'D',
        -    '\u018A': 'D',
        -    '\u0189': 'D',
        -    '\uA779': 'D',
        -    '\u01F1': 'DZ',
        -    '\u01C4': 'DZ',
        -    '\u01F2': 'Dz',
        -    '\u01C5': 'Dz',
        -    '\u24BA': 'E',
        -    '\uFF25': 'E',
        -    '\u00C8': 'E',
        -    '\u00C9': 'E',
        -    '\u00CA': 'E',
        -    '\u1EC0': 'E',
        -    '\u1EBE': 'E',
        -    '\u1EC4': 'E',
        -    '\u1EC2': 'E',
        -    '\u1EBC': 'E',
        -    '\u0112': 'E',
        -    '\u1E14': 'E',
        -    '\u1E16': 'E',
        -    '\u0114': 'E',
        -    '\u0116': 'E',
        -    '\u00CB': 'E',
        -    '\u1EBA': 'E',
        -    '\u011A': 'E',
        -    '\u0204': 'E',
        -    '\u0206': 'E',
        -    '\u1EB8': 'E',
        -    '\u1EC6': 'E',
        -    '\u0228': 'E',
        -    '\u1E1C': 'E',
        -    '\u0118': 'E',
        -    '\u1E18': 'E',
        -    '\u1E1A': 'E',
        -    '\u0190': 'E',
        -    '\u018E': 'E',
        -    '\u24BB': 'F',
        -    '\uFF26': 'F',
        -    '\u1E1E': 'F',
        -    '\u0191': 'F',
        -    '\uA77B': 'F',
        -    '\u24BC': 'G',
        -    '\uFF27': 'G',
        -    '\u01F4': 'G',
        -    '\u011C': 'G',
        -    '\u1E20': 'G',
        -    '\u011E': 'G',
        -    '\u0120': 'G',
        -    '\u01E6': 'G',
        -    '\u0122': 'G',
        -    '\u01E4': 'G',
        -    '\u0193': 'G',
        -    '\uA7A0': 'G',
        -    '\uA77D': 'G',
        -    '\uA77E': 'G',
        -    '\u24BD': 'H',
        -    '\uFF28': 'H',
        -    '\u0124': 'H',
        -    '\u1E22': 'H',
        -    '\u1E26': 'H',
        -    '\u021E': 'H',
        -    '\u1E24': 'H',
        -    '\u1E28': 'H',
        -    '\u1E2A': 'H',
        -    '\u0126': 'H',
        -    '\u2C67': 'H',
        -    '\u2C75': 'H',
        -    '\uA78D': 'H',
        -    '\u24BE': 'I',
        -    '\uFF29': 'I',
        -    '\u00CC': 'I',
        -    '\u00CD': 'I',
        -    '\u00CE': 'I',
        -    '\u0128': 'I',
        -    '\u012A': 'I',
        -    '\u012C': 'I',
        -    '\u0130': 'I',
        -    '\u00CF': 'I',
        -    '\u1E2E': 'I',
        -    '\u1EC8': 'I',
        -    '\u01CF': 'I',
        -    '\u0208': 'I',
        -    '\u020A': 'I',
        -    '\u1ECA': 'I',
        -    '\u012E': 'I',
        -    '\u1E2C': 'I',
        -    '\u0197': 'I',
        -    '\u24BF': 'J',
        -    '\uFF2A': 'J',
        -    '\u0134': 'J',
        -    '\u0248': 'J',
        -    '\u24C0': 'K',
        -    '\uFF2B': 'K',
        -    '\u1E30': 'K',
        -    '\u01E8': 'K',
        -    '\u1E32': 'K',
        -    '\u0136': 'K',
        -    '\u1E34': 'K',
        -    '\u0198': 'K',
        -    '\u2C69': 'K',
        -    '\uA740': 'K',
        -    '\uA742': 'K',
        -    '\uA744': 'K',
        -    '\uA7A2': 'K',
        -    '\u24C1': 'L',
        -    '\uFF2C': 'L',
        -    '\u013F': 'L',
        -    '\u0139': 'L',
        -    '\u013D': 'L',
        -    '\u1E36': 'L',
        -    '\u1E38': 'L',
        -    '\u013B': 'L',
        -    '\u1E3C': 'L',
        -    '\u1E3A': 'L',
        -    '\u0141': 'L',
        -    '\u023D': 'L',
        -    '\u2C62': 'L',
        -    '\u2C60': 'L',
        -    '\uA748': 'L',
        -    '\uA746': 'L',
        -    '\uA780': 'L',
        -    '\u01C7': 'LJ',
        -    '\u01C8': 'Lj',
        -    '\u24C2': 'M',
        -    '\uFF2D': 'M',
        -    '\u1E3E': 'M',
        -    '\u1E40': 'M',
        -    '\u1E42': 'M',
        -    '\u2C6E': 'M',
        -    '\u019C': 'M',
        -    '\u24C3': 'N',
        -    '\uFF2E': 'N',
        -    '\u01F8': 'N',
        -    '\u0143': 'N',
        -    '\u00D1': 'N',
        -    '\u1E44': 'N',
        -    '\u0147': 'N',
        -    '\u1E46': 'N',
        -    '\u0145': 'N',
        -    '\u1E4A': 'N',
        -    '\u1E48': 'N',
        -    '\u0220': 'N',
        -    '\u019D': 'N',
        -    '\uA790': 'N',
        -    '\uA7A4': 'N',
        -    '\u01CA': 'NJ',
        -    '\u01CB': 'Nj',
        -    '\u24C4': 'O',
        -    '\uFF2F': 'O',
        -    '\u00D2': 'O',
        -    '\u00D3': 'O',
        -    '\u00D4': 'O',
        -    '\u1ED2': 'O',
        -    '\u1ED0': 'O',
        -    '\u1ED6': 'O',
        -    '\u1ED4': 'O',
        -    '\u00D5': 'O',
        -    '\u1E4C': 'O',
        -    '\u022C': 'O',
        -    '\u1E4E': 'O',
        -    '\u014C': 'O',
        -    '\u1E50': 'O',
        -    '\u1E52': 'O',
        -    '\u014E': 'O',
        -    '\u022E': 'O',
        -    '\u0230': 'O',
        -    '\u00D6': 'O',
        -    '\u022A': 'O',
        -    '\u1ECE': 'O',
        -    '\u0150': 'O',
        -    '\u01D1': 'O',
        -    '\u020C': 'O',
        -    '\u020E': 'O',
        -    '\u01A0': 'O',
        -    '\u1EDC': 'O',
        -    '\u1EDA': 'O',
        -    '\u1EE0': 'O',
        -    '\u1EDE': 'O',
        -    '\u1EE2': 'O',
        -    '\u1ECC': 'O',
        -    '\u1ED8': 'O',
        -    '\u01EA': 'O',
        -    '\u01EC': 'O',
        -    '\u00D8': 'O',
        -    '\u01FE': 'O',
        -    '\u0186': 'O',
        -    '\u019F': 'O',
        -    '\uA74A': 'O',
        -    '\uA74C': 'O',
        -    '\u01A2': 'OI',
        -    '\uA74E': 'OO',
        -    '\u0222': 'OU',
        -    '\u24C5': 'P',
        -    '\uFF30': 'P',
        -    '\u1E54': 'P',
        -    '\u1E56': 'P',
        -    '\u01A4': 'P',
        -    '\u2C63': 'P',
        -    '\uA750': 'P',
        -    '\uA752': 'P',
        -    '\uA754': 'P',
        -    '\u24C6': 'Q',
        -    '\uFF31': 'Q',
        -    '\uA756': 'Q',
        -    '\uA758': 'Q',
        -    '\u024A': 'Q',
        -    '\u24C7': 'R',
        -    '\uFF32': 'R',
        -    '\u0154': 'R',
        -    '\u1E58': 'R',
        -    '\u0158': 'R',
        -    '\u0210': 'R',
        -    '\u0212': 'R',
        -    '\u1E5A': 'R',
        -    '\u1E5C': 'R',
        -    '\u0156': 'R',
        -    '\u1E5E': 'R',
        -    '\u024C': 'R',
        -    '\u2C64': 'R',
        -    '\uA75A': 'R',
        -    '\uA7A6': 'R',
        -    '\uA782': 'R',
        -    '\u24C8': 'S',
        -    '\uFF33': 'S',
        -    '\u1E9E': 'S',
        -    '\u015A': 'S',
        -    '\u1E64': 'S',
        -    '\u015C': 'S',
        -    '\u1E60': 'S',
        -    '\u0160': 'S',
        -    '\u1E66': 'S',
        -    '\u1E62': 'S',
        -    '\u1E68': 'S',
        -    '\u0218': 'S',
        -    '\u015E': 'S',
        -    '\u2C7E': 'S',
        -    '\uA7A8': 'S',
        -    '\uA784': 'S',
        -    '\u24C9': 'T',
        -    '\uFF34': 'T',
        -    '\u1E6A': 'T',
        -    '\u0164': 'T',
        -    '\u1E6C': 'T',
        -    '\u021A': 'T',
        -    '\u0162': 'T',
        -    '\u1E70': 'T',
        -    '\u1E6E': 'T',
        -    '\u0166': 'T',
        -    '\u01AC': 'T',
        -    '\u01AE': 'T',
        -    '\u023E': 'T',
        -    '\uA786': 'T',
        -    '\uA728': 'TZ',
        -    '\u24CA': 'U',
        -    '\uFF35': 'U',
        -    '\u00D9': 'U',
        -    '\u00DA': 'U',
        -    '\u00DB': 'U',
        -    '\u0168': 'U',
        -    '\u1E78': 'U',
        -    '\u016A': 'U',
        -    '\u1E7A': 'U',
        -    '\u016C': 'U',
        -    '\u00DC': 'U',
        -    '\u01DB': 'U',
        -    '\u01D7': 'U',
        -    '\u01D5': 'U',
        -    '\u01D9': 'U',
        -    '\u1EE6': 'U',
        -    '\u016E': 'U',
        -    '\u0170': 'U',
        -    '\u01D3': 'U',
        -    '\u0214': 'U',
        -    '\u0216': 'U',
        -    '\u01AF': 'U',
        -    '\u1EEA': 'U',
        -    '\u1EE8': 'U',
        -    '\u1EEE': 'U',
        -    '\u1EEC': 'U',
        -    '\u1EF0': 'U',
        -    '\u1EE4': 'U',
        -    '\u1E72': 'U',
        -    '\u0172': 'U',
        -    '\u1E76': 'U',
        -    '\u1E74': 'U',
        -    '\u0244': 'U',
        -    '\u24CB': 'V',
        -    '\uFF36': 'V',
        -    '\u1E7C': 'V',
        -    '\u1E7E': 'V',
        -    '\u01B2': 'V',
        -    '\uA75E': 'V',
        -    '\u0245': 'V',
        -    '\uA760': 'VY',
        -    '\u24CC': 'W',
        -    '\uFF37': 'W',
        -    '\u1E80': 'W',
        -    '\u1E82': 'W',
        -    '\u0174': 'W',
        -    '\u1E86': 'W',
        -    '\u1E84': 'W',
        -    '\u1E88': 'W',
        -    '\u2C72': 'W',
        -    '\u24CD': 'X',
        -    '\uFF38': 'X',
        -    '\u1E8A': 'X',
        -    '\u1E8C': 'X',
        -    '\u24CE': 'Y',
        -    '\uFF39': 'Y',
        -    '\u1EF2': 'Y',
        -    '\u00DD': 'Y',
        -    '\u0176': 'Y',
        -    '\u1EF8': 'Y',
        -    '\u0232': 'Y',
        -    '\u1E8E': 'Y',
        -    '\u0178': 'Y',
        -    '\u1EF6': 'Y',
        -    '\u1EF4': 'Y',
        -    '\u01B3': 'Y',
        -    '\u024E': 'Y',
        -    '\u1EFE': 'Y',
        -    '\u24CF': 'Z',
        -    '\uFF3A': 'Z',
        -    '\u0179': 'Z',
        -    '\u1E90': 'Z',
        -    '\u017B': 'Z',
        -    '\u017D': 'Z',
        -    '\u1E92': 'Z',
        -    '\u1E94': 'Z',
        -    '\u01B5': 'Z',
        -    '\u0224': 'Z',
        -    '\u2C7F': 'Z',
        -    '\u2C6B': 'Z',
        -    '\uA762': 'Z',
        -    '\u24D0': 'a',
        -    '\uFF41': 'a',
        -    '\u1E9A': 'a',
        -    '\u00E0': 'a',
        -    '\u00E1': 'a',
        -    '\u00E2': 'a',
        -    '\u1EA7': 'a',
        -    '\u1EA5': 'a',
        -    '\u1EAB': 'a',
        -    '\u1EA9': 'a',
        -    '\u00E3': 'a',
        -    '\u0101': 'a',
        -    '\u0103': 'a',
        -    '\u1EB1': 'a',
        -    '\u1EAF': 'a',
        -    '\u1EB5': 'a',
        -    '\u1EB3': 'a',
        -    '\u0227': 'a',
        -    '\u01E1': 'a',
        -    '\u00E4': 'a',
        -    '\u01DF': 'a',
        -    '\u1EA3': 'a',
        -    '\u00E5': 'a',
        -    '\u01FB': 'a',
        -    '\u01CE': 'a',
        -    '\u0201': 'a',
        -    '\u0203': 'a',
        -    '\u1EA1': 'a',
        -    '\u1EAD': 'a',
        -    '\u1EB7': 'a',
        -    '\u1E01': 'a',
        -    '\u0105': 'a',
        -    '\u2C65': 'a',
        -    '\u0250': 'a',
        -    '\uA733': 'aa',
        -    '\u00E6': 'ae',
        -    '\u01FD': 'ae',
        -    '\u01E3': 'ae',
        -    '\uA735': 'ao',
        -    '\uA737': 'au',
        -    '\uA739': 'av',
        -    '\uA73B': 'av',
        -    '\uA73D': 'ay',
        -    '\u24D1': 'b',
        -    '\uFF42': 'b',
        -    '\u1E03': 'b',
        -    '\u1E05': 'b',
        -    '\u1E07': 'b',
        -    '\u0180': 'b',
        -    '\u0183': 'b',
        -    '\u0253': 'b',
        -    '\u24D2': 'c',
        -    '\uFF43': 'c',
        -    '\u0107': 'c',
        -    '\u0109': 'c',
        -    '\u010B': 'c',
        -    '\u010D': 'c',
        -    '\u00E7': 'c',
        -    '\u1E09': 'c',
        -    '\u0188': 'c',
        -    '\u023C': 'c',
        -    '\uA73F': 'c',
        -    '\u2184': 'c',
        -    '\u24D3': 'd',
        -    '\uFF44': 'd',
        -    '\u1E0B': 'd',
        -    '\u010F': 'd',
        -    '\u1E0D': 'd',
        -    '\u1E11': 'd',
        -    '\u1E13': 'd',
        -    '\u1E0F': 'd',
        -    '\u0111': 'd',
        -    '\u018C': 'd',
        -    '\u0256': 'd',
        -    '\u0257': 'd',
        -    '\uA77A': 'd',
        -    '\u01F3': 'dz',
        -    '\u01C6': 'dz',
        -    '\u24D4': 'e',
        -    '\uFF45': 'e',
        -    '\u00E8': 'e',
        -    '\u00E9': 'e',
        -    '\u00EA': 'e',
        -    '\u1EC1': 'e',
        -    '\u1EBF': 'e',
        -    '\u1EC5': 'e',
        -    '\u1EC3': 'e',
        -    '\u1EBD': 'e',
        -    '\u0113': 'e',
        -    '\u1E15': 'e',
        -    '\u1E17': 'e',
        -    '\u0115': 'e',
        -    '\u0117': 'e',
        -    '\u00EB': 'e',
        -    '\u1EBB': 'e',
        -    '\u011B': 'e',
        -    '\u0205': 'e',
        -    '\u0207': 'e',
        -    '\u1EB9': 'e',
        -    '\u1EC7': 'e',
        -    '\u0229': 'e',
        -    '\u1E1D': 'e',
        -    '\u0119': 'e',
        -    '\u1E19': 'e',
        -    '\u1E1B': 'e',
        -    '\u0247': 'e',
        -    '\u025B': 'e',
        -    '\u01DD': 'e',
        -    '\u24D5': 'f',
        -    '\uFF46': 'f',
        -    '\u1E1F': 'f',
        -    '\u0192': 'f',
        -    '\uA77C': 'f',
        -    '\u24D6': 'g',
        -    '\uFF47': 'g',
        -    '\u01F5': 'g',
        -    '\u011D': 'g',
        -    '\u1E21': 'g',
        -    '\u011F': 'g',
        -    '\u0121': 'g',
        -    '\u01E7': 'g',
        -    '\u0123': 'g',
        -    '\u01E5': 'g',
        -    '\u0260': 'g',
        -    '\uA7A1': 'g',
        -    '\u1D79': 'g',
        -    '\uA77F': 'g',
        -    '\u24D7': 'h',
        -    '\uFF48': 'h',
        -    '\u0125': 'h',
        -    '\u1E23': 'h',
        -    '\u1E27': 'h',
        -    '\u021F': 'h',
        -    '\u1E25': 'h',
        -    '\u1E29': 'h',
        -    '\u1E2B': 'h',
        -    '\u1E96': 'h',
        -    '\u0127': 'h',
        -    '\u2C68': 'h',
        -    '\u2C76': 'h',
        -    '\u0265': 'h',
        -    '\u0195': 'hv',
        -    '\u24D8': 'i',
        -    '\uFF49': 'i',
        -    '\u00EC': 'i',
        -    '\u00ED': 'i',
        -    '\u00EE': 'i',
        -    '\u0129': 'i',
        -    '\u012B': 'i',
        -    '\u012D': 'i',
        -    '\u00EF': 'i',
        -    '\u1E2F': 'i',
        -    '\u1EC9': 'i',
        -    '\u01D0': 'i',
        -    '\u0209': 'i',
        -    '\u020B': 'i',
        -    '\u1ECB': 'i',
        -    '\u012F': 'i',
        -    '\u1E2D': 'i',
        -    '\u0268': 'i',
        -    '\u0131': 'i',
        -    '\u24D9': 'j',
        -    '\uFF4A': 'j',
        -    '\u0135': 'j',
        -    '\u01F0': 'j',
        -    '\u0249': 'j',
        -    '\u24DA': 'k',
        -    '\uFF4B': 'k',
        -    '\u1E31': 'k',
        -    '\u01E9': 'k',
        -    '\u1E33': 'k',
        -    '\u0137': 'k',
        -    '\u1E35': 'k',
        -    '\u0199': 'k',
        -    '\u2C6A': 'k',
        -    '\uA741': 'k',
        -    '\uA743': 'k',
        -    '\uA745': 'k',
        -    '\uA7A3': 'k',
        -    '\u24DB': 'l',
        -    '\uFF4C': 'l',
        -    '\u0140': 'l',
        -    '\u013A': 'l',
        -    '\u013E': 'l',
        -    '\u1E37': 'l',
        -    '\u1E39': 'l',
        -    '\u013C': 'l',
        -    '\u1E3D': 'l',
        -    '\u1E3B': 'l',
        -    '\u017F': 'l',
        -    '\u0142': 'l',
        -    '\u019A': 'l',
        -    '\u026B': 'l',
        -    '\u2C61': 'l',
        -    '\uA749': 'l',
        -    '\uA781': 'l',
        -    '\uA747': 'l',
        -    '\u01C9': 'lj',
        -    '\u24DC': 'm',
        -    '\uFF4D': 'm',
        -    '\u1E3F': 'm',
        -    '\u1E41': 'm',
        -    '\u1E43': 'm',
        -    '\u0271': 'm',
        -    '\u026F': 'm',
        -    '\u24DD': 'n',
        -    '\uFF4E': 'n',
        -    '\u01F9': 'n',
        -    '\u0144': 'n',
        -    '\u00F1': 'n',
        -    '\u1E45': 'n',
        -    '\u0148': 'n',
        -    '\u1E47': 'n',
        -    '\u0146': 'n',
        -    '\u1E4B': 'n',
        -    '\u1E49': 'n',
        -    '\u019E': 'n',
        -    '\u0272': 'n',
        -    '\u0149': 'n',
        -    '\uA791': 'n',
        -    '\uA7A5': 'n',
        -    '\u01CC': 'nj',
        -    '\u24DE': 'o',
        -    '\uFF4F': 'o',
        -    '\u00F2': 'o',
        -    '\u00F3': 'o',
        -    '\u00F4': 'o',
        -    '\u1ED3': 'o',
        -    '\u1ED1': 'o',
        -    '\u1ED7': 'o',
        -    '\u1ED5': 'o',
        -    '\u00F5': 'o',
        -    '\u1E4D': 'o',
        -    '\u022D': 'o',
        -    '\u1E4F': 'o',
        -    '\u014D': 'o',
        -    '\u1E51': 'o',
        -    '\u1E53': 'o',
        -    '\u014F': 'o',
        -    '\u022F': 'o',
        -    '\u0231': 'o',
        -    '\u00F6': 'o',
        -    '\u022B': 'o',
        -    '\u1ECF': 'o',
        -    '\u0151': 'o',
        -    '\u01D2': 'o',
        -    '\u020D': 'o',
        -    '\u020F': 'o',
        -    '\u01A1': 'o',
        -    '\u1EDD': 'o',
        -    '\u1EDB': 'o',
        -    '\u1EE1': 'o',
        -    '\u1EDF': 'o',
        -    '\u1EE3': 'o',
        -    '\u1ECD': 'o',
        -    '\u1ED9': 'o',
        -    '\u01EB': 'o',
        -    '\u01ED': 'o',
        -    '\u00F8': 'o',
        -    '\u01FF': 'o',
        -    '\u0254': 'o',
        -    '\uA74B': 'o',
        -    '\uA74D': 'o',
        -    '\u0275': 'o',
        -    '\u01A3': 'oi',
        -    '\u0223': 'ou',
        -    '\uA74F': 'oo',
        -    '\u24DF': 'p',
        -    '\uFF50': 'p',
        -    '\u1E55': 'p',
        -    '\u1E57': 'p',
        -    '\u01A5': 'p',
        -    '\u1D7D': 'p',
        -    '\uA751': 'p',
        -    '\uA753': 'p',
        -    '\uA755': 'p',
        -    '\u24E0': 'q',
        -    '\uFF51': 'q',
        -    '\u024B': 'q',
        -    '\uA757': 'q',
        -    '\uA759': 'q',
        -    '\u24E1': 'r',
        -    '\uFF52': 'r',
        -    '\u0155': 'r',
        -    '\u1E59': 'r',
        -    '\u0159': 'r',
        -    '\u0211': 'r',
        -    '\u0213': 'r',
        -    '\u1E5B': 'r',
        -    '\u1E5D': 'r',
        -    '\u0157': 'r',
        -    '\u1E5F': 'r',
        -    '\u024D': 'r',
        -    '\u027D': 'r',
        -    '\uA75B': 'r',
        -    '\uA7A7': 'r',
        -    '\uA783': 'r',
        -    '\u24E2': 's',
        -    '\uFF53': 's',
        -    '\u00DF': 's',
        -    '\u015B': 's',
        -    '\u1E65': 's',
        -    '\u015D': 's',
        -    '\u1E61': 's',
        -    '\u0161': 's',
        -    '\u1E67': 's',
        -    '\u1E63': 's',
        -    '\u1E69': 's',
        -    '\u0219': 's',
        -    '\u015F': 's',
        -    '\u023F': 's',
        -    '\uA7A9': 's',
        -    '\uA785': 's',
        -    '\u1E9B': 's',
        -    '\u24E3': 't',
        -    '\uFF54': 't',
        -    '\u1E6B': 't',
        -    '\u1E97': 't',
        -    '\u0165': 't',
        -    '\u1E6D': 't',
        -    '\u021B': 't',
        -    '\u0163': 't',
        -    '\u1E71': 't',
        -    '\u1E6F': 't',
        -    '\u0167': 't',
        -    '\u01AD': 't',
        -    '\u0288': 't',
        -    '\u2C66': 't',
        -    '\uA787': 't',
        -    '\uA729': 'tz',
        -    '\u24E4': 'u',
        -    '\uFF55': 'u',
        -    '\u00F9': 'u',
        -    '\u00FA': 'u',
        -    '\u00FB': 'u',
        -    '\u0169': 'u',
        -    '\u1E79': 'u',
        -    '\u016B': 'u',
        -    '\u1E7B': 'u',
        -    '\u016D': 'u',
        -    '\u00FC': 'u',
        -    '\u01DC': 'u',
        -    '\u01D8': 'u',
        -    '\u01D6': 'u',
        -    '\u01DA': 'u',
        -    '\u1EE7': 'u',
        -    '\u016F': 'u',
        -    '\u0171': 'u',
        -    '\u01D4': 'u',
        -    '\u0215': 'u',
        -    '\u0217': 'u',
        -    '\u01B0': 'u',
        -    '\u1EEB': 'u',
        -    '\u1EE9': 'u',
        -    '\u1EEF': 'u',
        -    '\u1EED': 'u',
        -    '\u1EF1': 'u',
        -    '\u1EE5': 'u',
        -    '\u1E73': 'u',
        -    '\u0173': 'u',
        -    '\u1E77': 'u',
        -    '\u1E75': 'u',
        -    '\u0289': 'u',
        -    '\u24E5': 'v',
        -    '\uFF56': 'v',
        -    '\u1E7D': 'v',
        -    '\u1E7F': 'v',
        -    '\u028B': 'v',
        -    '\uA75F': 'v',
        -    '\u028C': 'v',
        -    '\uA761': 'vy',
        -    '\u24E6': 'w',
        -    '\uFF57': 'w',
        -    '\u1E81': 'w',
        -    '\u1E83': 'w',
        -    '\u0175': 'w',
        -    '\u1E87': 'w',
        -    '\u1E85': 'w',
        -    '\u1E98': 'w',
        -    '\u1E89': 'w',
        -    '\u2C73': 'w',
        -    '\u24E7': 'x',
        -    '\uFF58': 'x',
        -    '\u1E8B': 'x',
        -    '\u1E8D': 'x',
        -    '\u24E8': 'y',
        -    '\uFF59': 'y',
        -    '\u1EF3': 'y',
        -    '\u00FD': 'y',
        -    '\u0177': 'y',
        -    '\u1EF9': 'y',
        -    '\u0233': 'y',
        -    '\u1E8F': 'y',
        -    '\u00FF': 'y',
        -    '\u1EF7': 'y',
        -    '\u1E99': 'y',
        -    '\u1EF5': 'y',
        -    '\u01B4': 'y',
        -    '\u024F': 'y',
        -    '\u1EFF': 'y',
        -    '\u24E9': 'z',
        -    '\uFF5A': 'z',
        -    '\u017A': 'z',
        -    '\u1E91': 'z',
        -    '\u017C': 'z',
        -    '\u017E': 'z',
        -    '\u1E93': 'z',
        -    '\u1E95': 'z',
        -    '\u01B6': 'z',
        -    '\u0225': 'z',
        -    '\u0240': 'z',
        -    '\u2C6C': 'z',
        -    '\uA763': 'z',
        -    '\u0386': '\u0391',
        -    '\u0388': '\u0395',
        -    '\u0389': '\u0397',
        -    '\u038A': '\u0399',
        -    '\u03AA': '\u0399',
        -    '\u038C': '\u039F',
        -    '\u038E': '\u03A5',
        -    '\u03AB': '\u03A5',
        -    '\u038F': '\u03A9',
        -    '\u03AC': '\u03B1',
        -    '\u03AD': '\u03B5',
        -    '\u03AE': '\u03B7',
        -    '\u03AF': '\u03B9',
        -    '\u03CA': '\u03B9',
        -    '\u0390': '\u03B9',
        -    '\u03CC': '\u03BF',
        -    '\u03CD': '\u03C5',
        -    '\u03CB': '\u03C5',
        -    '\u03B0': '\u03C5',
        -    '\u03C9': '\u03C9',
        -    '\u03C2': '\u03C3'
        -  };
        -
        -  return diacritics;
        -});
        -
        -S2.define('select2/data/base',[
        -  '../utils'
        -], function (Utils) {
        -  function BaseAdapter ($element, options) {
        -    BaseAdapter.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(BaseAdapter, Utils.Observable);
        -
        -  BaseAdapter.prototype.current = function (callback) {
        -    throw new Error('The `current` method must be defined in child classes.');
        -  };
        -
        -  BaseAdapter.prototype.query = function (params, callback) {
        -    throw new Error('The `query` method must be defined in child classes.');
        -  };
        -
        -  BaseAdapter.prototype.bind = function (container, $container) {
        -    // Can be implemented in subclasses
        -  };
        -
        -  BaseAdapter.prototype.destroy = function () {
        -    // Can be implemented in subclasses
        -  };
        -
        -  BaseAdapter.prototype.generateResultId = function (container, data) {
        -    var id = container.id + '-result-';
        -
        -    id += Utils.generateChars(4);
        -
        -    if (data.id != null) {
        -      id += '-' + data.id.toString();
        -    } else {
        -      id += '-' + Utils.generateChars(4);
        -    }
        -    return id;
        -  };
        -
        -  return BaseAdapter;
        -});
        -
        -S2.define('select2/data/select',[
        -  './base',
        -  '../utils',
        -  'jquery'
        -], function (BaseAdapter, Utils, $) {
        -  function SelectAdapter ($element, options) {
        -    this.$element = $element;
        -    this.options = options;
        -
        -    SelectAdapter.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(SelectAdapter, BaseAdapter);
        -
        -  SelectAdapter.prototype.current = function (callback) {
        -    var data = [];
        -    var self = this;
        -
        -    this.$element.find(':selected').each(function () {
        -      var $option = $(this);
        -
        -      var option = self.item($option);
        -
        -      data.push(option);
        -    });
        -
        -    callback(data);
        -  };
        -
        -  SelectAdapter.prototype.select = function (data) {
        -    var self = this;
        -
        -    data.selected = true;
        -
        -    // If data.element is a DOM node, use it instead
        -    if ($(data.element).is('option')) {
        -      data.element.selected = true;
        -
        -      this.$element.trigger('change');
        -
        -      return;
        -    }
        -
        -    if (this.$element.prop('multiple')) {
        -      this.current(function (currentData) {
        -        var val = [];
        -
        -        data = [data];
        -        data.push.apply(data, currentData);
        -
        -        for (var d = 0; d < data.length; d++) {
        -          var id = data[d].id;
        -
        -          if ($.inArray(id, val) === -1) {
        -            val.push(id);
        -          }
        -        }
        -
        -        self.$element.val(val);
        -        self.$element.trigger('change');
        -      });
        -    } else {
        -      var val = data.id;
        -
        -      this.$element.val(val);
        -      this.$element.trigger('change');
        -    }
        -  };
        -
        -  SelectAdapter.prototype.unselect = function (data) {
        -    var self = this;
        -
        -    if (!this.$element.prop('multiple')) {
        -      return;
        -    }
        -
        -    data.selected = false;
        -
        -    if ($(data.element).is('option')) {
        -      data.element.selected = false;
        -
        -      this.$element.trigger('change');
        -
        -      return;
        -    }
        -
        -    this.current(function (currentData) {
        -      var val = [];
        -
        -      for (var d = 0; d < currentData.length; d++) {
        -        var id = currentData[d].id;
        -
        -        if (id !== data.id && $.inArray(id, val) === -1) {
        -          val.push(id);
        -        }
        -      }
        -
        -      self.$element.val(val);
        -
        -      self.$element.trigger('change');
        -    });
        -  };
        -
        -  SelectAdapter.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    this.container = container;
        -
        -    container.on('select', function (params) {
        -      self.select(params.data);
        -    });
        -
        -    container.on('unselect', function (params) {
        -      self.unselect(params.data);
        -    });
        -  };
        -
        -  SelectAdapter.prototype.destroy = function () {
        -    // Remove anything added to child elements
        -    this.$element.find('*').each(function () {
        -      // Remove any custom data set by Select2
        -      $.removeData(this, 'data');
        -    });
        -  };
        -
        -  SelectAdapter.prototype.query = function (params, callback) {
        -    var data = [];
        -    var self = this;
        -
        -    var $options = this.$element.children();
        -
        -    $options.each(function () {
        -      var $option = $(this);
        -
        -      if (!$option.is('option') && !$option.is('optgroup')) {
        -        return;
        -      }
        -
        -      var option = self.item($option);
        -
        -      var matches = self.matches(params, option);
        -
        -      if (matches !== null) {
        -        data.push(matches);
        -      }
        -    });
        -
        -    callback({
        -      results: data
        -    });
        -  };
        -
        -  SelectAdapter.prototype.addOptions = function ($options) {
        -    Utils.appendMany(this.$element, $options);
        -  };
        -
        -  SelectAdapter.prototype.option = function (data) {
        -    var option;
        -
        -    if (data.children) {
        -      option = document.createElement('optgroup');
        -      option.label = data.text;
        -    } else {
        -      option = document.createElement('option');
        -
        -      if (option.textContent !== undefined) {
        -        option.textContent = data.text;
        -      } else {
        -        option.innerText = data.text;
        -      }
        -    }
        -
        -    if (data.id) {
        -      option.value = data.id;
        -    }
        -
        -    if (data.disabled) {
        -      option.disabled = true;
        -    }
        -
        -    if (data.selected) {
        -      option.selected = true;
        -    }
        -
        -    if (data.title) {
        -      option.title = data.title;
        -    }
        -
        -    var $option = $(option);
        -
        -    var normalizedData = this._normalizeItem(data);
        -    normalizedData.element = option;
        -
        -    // Override the option's data with the combined data
        -    $.data(option, 'data', normalizedData);
        -
        -    return $option;
        -  };
        -
        -  SelectAdapter.prototype.item = function ($option) {
        -    var data = {};
        -
        -    data = $.data($option[0], 'data');
        -
        -    if (data != null) {
        -      return data;
        -    }
        -
        -    if ($option.is('option')) {
        -      data = {
        -        id: $option.val(),
        -        text: $option.text(),
        -        disabled: $option.prop('disabled'),
        -        selected: $option.prop('selected'),
        -        title: $option.prop('title')
        -      };
        -    } else if ($option.is('optgroup')) {
        -      data = {
        -        text: $option.prop('label'),
        -        children: [],
        -        title: $option.prop('title')
        -      };
        -
        -      var $children = $option.children('option');
        -      var children = [];
        -
        -      for (var c = 0; c < $children.length; c++) {
        -        var $child = $($children[c]);
        -
        -        var child = this.item($child);
        -
        -        children.push(child);
        -      }
        -
        -      data.children = children;
        -    }
        -
        -    data = this._normalizeItem(data);
        -    data.element = $option[0];
        -
        -    $.data($option[0], 'data', data);
        -
        -    return data;
        -  };
        -
        -  SelectAdapter.prototype._normalizeItem = function (item) {
        -    if (!$.isPlainObject(item)) {
        -      item = {
        -        id: item,
        -        text: item
        -      };
        -    }
        -
        -    item = $.extend({}, {
        -      text: ''
        -    }, item);
        -
        -    var defaults = {
        -      selected: false,
        -      disabled: false
        -    };
        -
        -    if (item.id != null) {
        -      item.id = item.id.toString();
        -    }
        -
        -    if (item.text != null) {
        -      item.text = item.text.toString();
        -    }
        -
        -    if (item._resultId == null && item.id && this.container != null) {
        -      item._resultId = this.generateResultId(this.container, item);
        -    }
        -
        -    return $.extend({}, defaults, item);
        -  };
        -
        -  SelectAdapter.prototype.matches = function (params, data) {
        -    var matcher = this.options.get('matcher');
        -
        -    return matcher(params, data);
        -  };
        -
        -  return SelectAdapter;
        -});
        -
        -S2.define('select2/data/array',[
        -  './select',
        -  '../utils',
        -  'jquery'
        -], function (SelectAdapter, Utils, $) {
        -  function ArrayAdapter ($element, options) {
        -    var data = options.get('data') || [];
        -
        -    ArrayAdapter.__super__.constructor.call(this, $element, options);
        -
        -    this.addOptions(this.convertToOptions(data));
        -  }
        -
        -  Utils.Extend(ArrayAdapter, SelectAdapter);
        -
        -  ArrayAdapter.prototype.select = function (data) {
        -    var $option = this.$element.find('option').filter(function (i, elm) {
        -      return elm.value == data.id.toString();
        -    });
        -
        -    if ($option.length === 0) {
        -      $option = this.option(data);
        -
        -      this.addOptions($option);
        -    }
        -
        -    ArrayAdapter.__super__.select.call(this, data);
        -  };
        -
        -  ArrayAdapter.prototype.convertToOptions = function (data) {
        -    var self = this;
        -
        -    var $existing = this.$element.find('option');
        -    var existingIds = $existing.map(function () {
        -      return self.item($(this)).id;
        -    }).get();
        -
        -    var $options = [];
        -
        -    // Filter out all items except for the one passed in the argument
        -    function onlyItem (item) {
        -      return function () {
        -        return $(this).val() == item.id;
        -      };
        -    }
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var item = this._normalizeItem(data[d]);
        -
        -      // Skip items which were pre-loaded, only merge the data
        -      if ($.inArray(item.id, existingIds) >= 0) {
        -        var $existingOption = $existing.filter(onlyItem(item));
        -
        -        var existingData = this.item($existingOption);
        -        var newData = $.extend(true, {}, existingData, item);
        -
        -        var $newOption = this.option(existingData);
        -
        -        $existingOption.replaceWith($newOption);
        -
        -        continue;
        -      }
        -
        -      var $option = this.option(item);
        -
        -      if (item.children) {
        -        var $children = this.convertToOptions(item.children);
        -
        -        Utils.appendMany($option, $children);
        -      }
        -
        -      $options.push($option);
        -    }
        -
        -    return $options;
        -  };
        -
        -  return ArrayAdapter;
        -});
        -
        -S2.define('select2/data/ajax',[
        -  './array',
        -  '../utils',
        -  'jquery'
        -], function (ArrayAdapter, Utils, $) {
        -  function AjaxAdapter ($element, options) {
        -    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
        -
        -    if (this.ajaxOptions.processResults != null) {
        -      this.processResults = this.ajaxOptions.processResults;
        -    }
        -
        -    ArrayAdapter.__super__.constructor.call(this, $element, options);
        -  }
        -
        -  Utils.Extend(AjaxAdapter, ArrayAdapter);
        -
        -  AjaxAdapter.prototype._applyDefaults = function (options) {
        -    var defaults = {
        -      data: function (params) {
        -        return {
        -          q: params.term
        -        };
        -      },
        -      transport: function (params, success, failure) {
        -        var $request = $.ajax(params);
        -
        -        $request.then(success);
        -        $request.fail(failure);
        -
        -        return $request;
        -      }
        -    };
        -
        -    return $.extend({}, defaults, options, true);
        -  };
        -
        -  AjaxAdapter.prototype.processResults = function (results) {
        -    return results;
        -  };
        -
        -  AjaxAdapter.prototype.query = function (params, callback) {
        -    var matches = [];
        -    var self = this;
        -
        -    if (this._request != null) {
        -      // JSONP requests cannot always be aborted
        -      if ($.isFunction(this._request.abort)) {
        -        this._request.abort();
        -      }
        -
        -      this._request = null;
        -    }
        -
        -    var options = $.extend({
        -      type: 'GET'
        -    }, this.ajaxOptions);
        -
        -    if (typeof options.url === 'function') {
        -      options.url = options.url(params);
        -    }
        -
        -    if (typeof options.data === 'function') {
        -      options.data = options.data(params);
        -    }
        -
        -    function request () {
        -      var $request = options.transport(options, function (data) {
        -        var results = self.processResults(data, params);
        -
        -        if (self.options.get('debug') && window.console && console.error) {
        -          // Check to make sure that the response included a `results` key.
        -          if (!results || !results.results || !$.isArray(results.results)) {
        -            console.error(
        -              'Select2: The AJAX results did not return an array in the ' +
        -              '`results` key of the response.'
        -            );
        -          }
        -        }
        -
        -        callback(results);
        -      }, function () {
        -        // TODO: Handle AJAX errors
        -      });
        -
        -      self._request = $request;
        -    }
        -
        -    if (this.ajaxOptions.delay && params.term !== '') {
        -      if (this._queryTimeout) {
        -        window.clearTimeout(this._queryTimeout);
        -      }
        -
        -      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
        -    } else {
        -      request();
        -    }
        -  };
        -
        -  return AjaxAdapter;
        -});
        -
        -S2.define('select2/data/tags',[
        -  'jquery'
        -], function ($) {
        -  function Tags (decorated, $element, options) {
        -    var tags = options.get('tags');
        -
        -    var createTag = options.get('createTag');
        -
        -    if (createTag !== undefined) {
        -      this.createTag = createTag;
        -    }
        -
        -    decorated.call(this, $element, options);
        -
        -    if ($.isArray(tags)) {
        -      for (var t = 0; t < tags.length; t++) {
        -        var tag = tags[t];
        -        var item = this._normalizeItem(tag);
        -
        -        var $option = this.option(item);
        -
        -        this.$element.append($option);
        -      }
        -    }
        -  }
        -
        -  Tags.prototype.query = function (decorated, params, callback) {
        -    var self = this;
        -
        -    this._removeOldTags();
        -
        -    if (params.term == null || params.page != null) {
        -      decorated.call(this, params, callback);
        -      return;
        -    }
        -
        -    function wrapper (obj, child) {
        -      var data = obj.results;
        -
        -      for (var i = 0; i < data.length; i++) {
        -        var option = data[i];
        -
        -        var checkChildren = (
        -          option.children != null &&
        -          !wrapper({
        -            results: option.children
        -          }, true)
        -        );
        -
        -        var checkText = option.text === params.term;
        -
        -        if (checkText || checkChildren) {
        -          if (child) {
        -            return false;
        -          }
        -
        -          obj.data = data;
        -          callback(obj);
        -
        -          return;
        -        }
        -      }
        -
        -      if (child) {
        -        return true;
        -      }
        -
        -      var tag = self.createTag(params);
        -
        -      if (tag != null) {
        -        var $option = self.option(tag);
        -        $option.attr('data-select2-tag', true);
        -
        -        self.addOptions([$option]);
        -
        -        self.insertTag(data, tag);
        -      }
        -
        -      obj.results = data;
        -
        -      callback(obj);
        -    }
        -
        -    decorated.call(this, params, wrapper);
        -  };
        -
        -  Tags.prototype.createTag = function (decorated, params) {
        -    var term = $.trim(params.term);
        -
        -    if (term === '') {
        -      return null;
        -    }
        -
        -    return {
        -      id: term,
        -      text: term
        -    };
        -  };
        -
        -  Tags.prototype.insertTag = function (_, data, tag) {
        -    data.unshift(tag);
        -  };
        -
        -  Tags.prototype._removeOldTags = function (_) {
        -    var tag = this._lastTag;
        -
        -    var $options = this.$element.find('option[data-select2-tag]');
        -
        -    $options.each(function () {
        -      if (this.selected) {
        -        return;
        -      }
        -
        -      $(this).remove();
        -    });
        -  };
        -
        -  return Tags;
        -});
        -
        -S2.define('select2/data/tokenizer',[
        -  'jquery'
        -], function ($) {
        -  function Tokenizer (decorated, $element, options) {
        -    var tokenizer = options.get('tokenizer');
        -
        -    if (tokenizer !== undefined) {
        -      this.tokenizer = tokenizer;
        -    }
        -
        -    decorated.call(this, $element, options);
        -  }
        -
        -  Tokenizer.prototype.bind = function (decorated, container, $container) {
        -    decorated.call(this, container, $container);
        -
        -    this.$search =  container.dropdown.$search || container.selection.$search ||
        -      $container.find('.select2-search__field');
        -  };
        -
        -  Tokenizer.prototype.query = function (decorated, params, callback) {
        -    var self = this;
        -
        -    function select (data) {
        -      self.select(data);
        -    }
        -
        -    params.term = params.term || '';
        -
        -    var tokenData = this.tokenizer(params, this.options, select);
        -
        -    if (tokenData.term !== params.term) {
        -      // Replace the search term if we have the search box
        -      if (this.$search.length) {
        -        this.$search.val(tokenData.term);
        -        this.$search.focus();
        -      }
        -
        -      params.term = tokenData.term;
        -    }
        -
        -    decorated.call(this, params, callback);
        -  };
        -
        -  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
        -    var separators = options.get('tokenSeparators') || [];
        -    var term = params.term;
        -    var i = 0;
        -
        -    var createTag = this.createTag || function (params) {
        -      return {
        -        id: params.term,
        -        text: params.term
        -      };
        -    };
        -
        -    while (i < term.length) {
        -      var termChar = term[i];
        -
        -      if ($.inArray(termChar, separators) === -1) {
        -        i++;
        -
        -        continue;
        -      }
        -
        -      var part = term.substr(0, i);
        -      var partParams = $.extend({}, params, {
        -        term: part
        -      });
        -
        -      var data = createTag(partParams);
        -
        -      callback(data);
        -
        -      // Reset the term to not include the tokenized portion
        -      term = term.substr(i + 1) || '';
        -      i = 0;
        -    }
        -
        -    return {
        -      term: term
        -    };
        -  };
        -
        -  return Tokenizer;
        -});
        -
        -S2.define('select2/data/minimumInputLength',[
        -
        -], function () {
        -  function MinimumInputLength (decorated, $e, options) {
        -    this.minimumInputLength = options.get('minimumInputLength');
        -
        -    decorated.call(this, $e, options);
        -  }
        -
        -  MinimumInputLength.prototype.query = function (decorated, params, callback) {
        -    params.term = params.term || '';
        -
        -    if (params.term.length < this.minimumInputLength) {
        -      this.trigger('results:message', {
        -        message: 'inputTooShort',
        -        args: {
        -          minimum: this.minimumInputLength,
        -          input: params.term,
        -          params: params
        -        }
        -      });
        -
        -      return;
        -    }
        -
        -    decorated.call(this, params, callback);
        -  };
        -
        -  return MinimumInputLength;
        -});
        -
        -S2.define('select2/data/maximumInputLength',[
        -
        -], function () {
        -  function MaximumInputLength (decorated, $e, options) {
        -    this.maximumInputLength = options.get('maximumInputLength');
        -
        -    decorated.call(this, $e, options);
        -  }
        -
        -  MaximumInputLength.prototype.query = function (decorated, params, callback) {
        -    params.term = params.term || '';
        -
        -    if (this.maximumInputLength > 0 &&
        -        params.term.length > this.maximumInputLength) {
        -      this.trigger('results:message', {
        -        message: 'inputTooLong',
        -        args: {
        -          maximum: this.maximumInputLength,
        -          input: params.term,
        -          params: params
        -        }
        -      });
        -
        -      return;
        -    }
        -
        -    decorated.call(this, params, callback);
        -  };
        -
        -  return MaximumInputLength;
        -});
        -
        -S2.define('select2/data/maximumSelectionLength',[
        -
        -], function (){
        -  function MaximumSelectionLength (decorated, $e, options) {
        -    this.maximumSelectionLength = options.get('maximumSelectionLength');
        -
        -    decorated.call(this, $e, options);
        -  }
        -
        -  MaximumSelectionLength.prototype.query =
        -    function (decorated, params, callback) {
        -      var self = this;
        -
        -      this.current(function (currentData) {
        -        var count = currentData != null ? currentData.length : 0;
        -        if (self.maximumSelectionLength > 0 &&
        -          count >= self.maximumSelectionLength) {
        -          self.trigger('results:message', {
        -            message: 'maximumSelected',
        -            args: {
        -              maximum: self.maximumSelectionLength
        -            }
        -          });
        -          return;
        -        }
        -        decorated.call(self, params, callback);
        -      });
        -  };
        -
        -  return MaximumSelectionLength;
        -});
        -
        -S2.define('select2/dropdown',[
        -  'jquery',
        -  './utils'
        -], function ($, Utils) {
        -  function Dropdown ($element, options) {
        -    this.$element = $element;
        -    this.options = options;
        -
        -    Dropdown.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(Dropdown, Utils.Observable);
        -
        -  Dropdown.prototype.render = function () {
        -    var $dropdown = $(
        -      '<span class="select2-dropdown">' +
        -        '<span class="select2-results"></span>' +
        -      '</span>'
        -    );
        -
        -    $dropdown.attr('dir', this.options.get('dir'));
        -
        -    this.$dropdown = $dropdown;
        -
        -    return $dropdown;
        -  };
        -
        -  Dropdown.prototype.position = function ($dropdown, $container) {
        -    // Should be implmented in subclasses
        -  };
        -
        -  Dropdown.prototype.destroy = function () {
        -    // Remove the dropdown from the DOM
        -    this.$dropdown.remove();
        -  };
        -
        -  return Dropdown;
        -});
        -
        -S2.define('select2/dropdown/search',[
        -  'jquery',
        -  '../utils'
        -], function ($, Utils) {
        -  function Search () { }
        -
        -  Search.prototype.render = function (decorated) {
        -    var $rendered = decorated.call(this);
        -
        -    var $search = $(
        -      '<span class="select2-search select2-search--dropdown">' +
        -        '<input class="select2-search__field" type="search" tabindex="-1"' +
        -        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        -        ' spellcheck="false" role="textbox" />' +
        -      '</span>'
        -    );
        -
        -    this.$searchContainer = $search;
        -    this.$search = $search.find('input');
        -
        -    $rendered.prepend($search);
        -
        -    return $rendered;
        -  };
        -
        -  Search.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    this.$search.on('keydown', function (evt) {
        -      self.trigger('keypress', evt);
        -
        -      self._keyUpPrevented = evt.isDefaultPrevented();
        -    });
        -
        -    // Workaround for browsers which do not support the `input` event
        -    // This will prevent double-triggering of events for browsers which support
        -    // both the `keyup` and `input` events.
        -    this.$search.on('input', function (evt) {
        -      // Unbind the duplicated `keyup` event
        -      $(this).off('keyup');
        -    });
        -
        -    this.$search.on('keyup input', function (evt) {
        -      self.handleSearch(evt);
        -    });
        -
        -    container.on('open', function () {
        -      self.$search.attr('tabindex', 0);
        -
        -      self.$search.focus();
        -
        -      window.setTimeout(function () {
        -        self.$search.focus();
        -      }, 0);
        -    });
        -
        -    container.on('close', function () {
        -      self.$search.attr('tabindex', -1);
        -
        -      self.$search.val('');
        -    });
        -
        -    container.on('results:all', function (params) {
        -      if (params.query.term == null || params.query.term === '') {
        -        var showSearch = self.showSearch(params);
        -
        -        if (showSearch) {
        -          self.$searchContainer.removeClass('select2-search--hide');
        -        } else {
        -          self.$searchContainer.addClass('select2-search--hide');
        -        }
        -      }
        -    });
        -  };
        -
        -  Search.prototype.handleSearch = function (evt) {
        -    if (!this._keyUpPrevented) {
        -      var input = this.$search.val();
        -
        -      this.trigger('query', {
        -        term: input
        -      });
        -    }
        -
        -    this._keyUpPrevented = false;
        -  };
        -
        -  Search.prototype.showSearch = function (_, params) {
        -    return true;
        -  };
        -
        -  return Search;
        -});
        -
        -S2.define('select2/dropdown/hidePlaceholder',[
        -
        -], function () {
        -  function HidePlaceholder (decorated, $element, options, dataAdapter) {
        -    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        -
        -    decorated.call(this, $element, options, dataAdapter);
        -  }
        -
        -  HidePlaceholder.prototype.append = function (decorated, data) {
        -    data.results = this.removePlaceholder(data.results);
        -
        -    decorated.call(this, data);
        -  };
        -
        -  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
        -    if (typeof placeholder === 'string') {
        -      placeholder = {
        -        id: '',
        -        text: placeholder
        -      };
        -    }
        -
        -    return placeholder;
        -  };
        -
        -  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
        -    var modifiedData = data.slice(0);
        -
        -    for (var d = data.length - 1; d >= 0; d--) {
        -      var item = data[d];
        -
        -      if (this.placeholder.id === item.id) {
        -        modifiedData.splice(d, 1);
        -      }
        -    }
        -
        -    return modifiedData;
        -  };
        -
        -  return HidePlaceholder;
        -});
        -
        -S2.define('select2/dropdown/infiniteScroll',[
        -  'jquery'
        -], function ($) {
        -  function InfiniteScroll (decorated, $element, options, dataAdapter) {
        -    this.lastParams = {};
        -
        -    decorated.call(this, $element, options, dataAdapter);
        -
        -    this.$loadingMore = this.createLoadingMore();
        -    this.loading = false;
        -  }
        -
        -  InfiniteScroll.prototype.append = function (decorated, data) {
        -    this.$loadingMore.remove();
        -    this.loading = false;
        -
        -    decorated.call(this, data);
        -
        -    if (this.showLoadingMore(data)) {
        -      this.$results.append(this.$loadingMore);
        -    }
        -  };
        -
        -  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('query', function (params) {
        -      self.lastParams = params;
        -      self.loading = true;
        -    });
        -
        -    container.on('query:append', function (params) {
        -      self.lastParams = params;
        -      self.loading = true;
        -    });
        -
        -    this.$results.on('scroll', function () {
        -      var isLoadMoreVisible = $.contains(
        -        document.documentElement,
        -        self.$loadingMore[0]
        -      );
        -
        -      if (self.loading || !isLoadMoreVisible) {
        -        return;
        -      }
        -
        -      var currentOffset = self.$results.offset().top +
        -        self.$results.outerHeight(false);
        -      var loadingMoreOffset = self.$loadingMore.offset().top +
        -        self.$loadingMore.outerHeight(false);
        -
        -      if (currentOffset + 50 >= loadingMoreOffset) {
        -        self.loadMore();
        -      }
        -    });
        -  };
        -
        -  InfiniteScroll.prototype.loadMore = function () {
        -    this.loading = true;
        -
        -    var params = $.extend({}, {page: 1}, this.lastParams);
        -
        -    params.page++;
        -
        -    this.trigger('query:append', params);
        -  };
        -
        -  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
        -    return data.pagination && data.pagination.more;
        -  };
        -
        -  InfiniteScroll.prototype.createLoadingMore = function () {
        -    var $option = $(
        -      '<li class="option load-more" role="treeitem"></li>'
        -    );
        -
        -    var message = this.options.get('translations').get('loadingMore');
        -
        -    $option.html(message(this.lastParams));
        -
        -    return $option;
        -  };
        -
        -  return InfiniteScroll;
        -});
        -
        -S2.define('select2/dropdown/attachBody',[
        -  'jquery',
        -  '../utils'
        -], function ($, Utils) {
        -  function AttachBody (decorated, $element, options) {
        -    this.$dropdownParent = options.get('dropdownParent') || document.body;
        -
        -    decorated.call(this, $element, options);
        -  }
        -
        -  AttachBody.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    var setupResultsEvents = false;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('open', function () {
        -      self._showDropdown();
        -      self._attachPositioningHandler(container);
        -
        -      if (!setupResultsEvents) {
        -        setupResultsEvents = true;
        -
        -        container.on('results:all', function () {
        -          self._positionDropdown();
        -          self._resizeDropdown();
        -        });
        -
        -        container.on('results:append', function () {
        -          self._positionDropdown();
        -          self._resizeDropdown();
        -        });
        -      }
        -    });
        -
        -    container.on('close', function () {
        -      self._hideDropdown();
        -      self._detachPositioningHandler(container);
        -    });
        -
        -    this.$dropdownContainer.on('mousedown', function (evt) {
        -      evt.stopPropagation();
        -    });
        -  };
        -
        -  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
        -    // Clone all of the container classes
        -    $dropdown.attr('class', $container.attr('class'));
        -
        -    $dropdown.removeClass('select2');
        -    $dropdown.addClass('select2-container--open');
        -
        -    $dropdown.css({
        -      position: 'absolute',
        -      top: -999999
        -    });
        -
        -    this.$container = $container;
        -  };
        -
        -  AttachBody.prototype.render = function (decorated) {
        -    var $container = $('<span></span>');
        -
        -    var $dropdown = decorated.call(this);
        -    $container.append($dropdown);
        -
        -    this.$dropdownContainer = $container;
        -
        -    return $container;
        -  };
        -
        -  AttachBody.prototype._hideDropdown = function (decorated) {
        -    this.$dropdownContainer.detach();
        -  };
        -
        -  AttachBody.prototype._attachPositioningHandler = function (container) {
        -    var self = this;
        -
        -    var scrollEvent = 'scroll.select2.' + container.id;
        -    var resizeEvent = 'resize.select2.' + container.id;
        -    var orientationEvent = 'orientationchange.select2.' + container.id;
        -
        -    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        -    $watchers.each(function () {
        -      $(this).data('select2-scroll-position', {
        -        x: $(this).scrollLeft(),
        -        y: $(this).scrollTop()
        -      });
        -    });
        -
        -    $watchers.on(scrollEvent, function (ev) {
        -      var position = $(this).data('select2-scroll-position');
        -      $(this).scrollTop(position.y);
        -    });
        -
        -    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
        -      function (e) {
        -      self._positionDropdown();
        -      self._resizeDropdown();
        -    });
        -  };
        -
        -  AttachBody.prototype._detachPositioningHandler = function (container) {
        -    var scrollEvent = 'scroll.select2.' + container.id;
        -    var resizeEvent = 'resize.select2.' + container.id;
        -    var orientationEvent = 'orientationchange.select2.' + container.id;
        -
        -    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        -    $watchers.off(scrollEvent);
        -
        -    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
        -  };
        -
        -  AttachBody.prototype._positionDropdown = function () {
        -    var $window = $(window);
        -
        -    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
        -    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
        -
        -    var newDirection = null;
        -
        -    var position = this.$container.position();
        -    var offset = this.$container.offset();
        -
        -    offset.bottom = offset.top + this.$container.outerHeight(false);
        -
        -    var container = {
        -      height: this.$container.outerHeight(false)
        -    };
        -
        -    container.top = offset.top;
        -    container.bottom = offset.top + container.height;
        -
        -    var dropdown = {
        -      height: this.$dropdown.outerHeight(false)
        -    };
        -
        -    var viewport = {
        -      top: $window.scrollTop(),
        -      bottom: $window.scrollTop() + $window.height()
        -    };
        -
        -    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
        -    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
        -
        -    var css = {
        -      left: offset.left,
        -      top: container.bottom
        -    };
        -
        -    if (!isCurrentlyAbove && !isCurrentlyBelow) {
        -      newDirection = 'below';
        -    }
        -
        -    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
        -      newDirection = 'above';
        -    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
        -      newDirection = 'below';
        -    }
        -
        -    if (newDirection == 'above' ||
        -      (isCurrentlyAbove && newDirection !== 'below')) {
        -      css.top = container.top - dropdown.height;
        -    }
        -
        -    if (newDirection != null) {
        -      this.$dropdown
        -        .removeClass('select2-dropdown--below select2-dropdown--above')
        -        .addClass('select2-dropdown--' + newDirection);
        -      this.$container
        -        .removeClass('select2-container--below select2-container--above')
        -        .addClass('select2-container--' + newDirection);
        -    }
        -
        -    this.$dropdownContainer.css(css);
        -  };
        -
        -  AttachBody.prototype._resizeDropdown = function () {
        -    this.$dropdownContainer.width();
        -
        -    var css = {
        -      width: this.$container.outerWidth(false) + 'px'
        -    };
        -
        -    if (this.options.get('dropdownAutoWidth')) {
        -      css.minWidth = css.width;
        -      css.width = 'auto';
        -    }
        -
        -    this.$dropdown.css(css);
        -  };
        -
        -  AttachBody.prototype._showDropdown = function (decorated) {
        -    this.$dropdownContainer.appendTo(this.$dropdownParent);
        -
        -    this._positionDropdown();
        -    this._resizeDropdown();
        -  };
        -
        -  return AttachBody;
        -});
        -
        -S2.define('select2/dropdown/minimumResultsForSearch',[
        -
        -], function () {
        -  function countResults (data) {
        -    var count = 0;
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var item = data[d];
        -
        -      if (item.children) {
        -        count += countResults(item.children);
        -      } else {
        -        count++;
        -      }
        -    }
        -
        -    return count;
        -  }
        -
        -  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
        -    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
        -
        -    if (this.minimumResultsForSearch < 0) {
        -      this.minimumResultsForSearch = Infinity;
        -    }
        -
        -    decorated.call(this, $element, options, dataAdapter);
        -  }
        -
        -  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
        -    if (countResults(params.data.results) < this.minimumResultsForSearch) {
        -      return false;
        -    }
        -
        -    return decorated.call(this, params);
        -  };
        -
        -  return MinimumResultsForSearch;
        -});
        -
        -S2.define('select2/dropdown/selectOnClose',[
        -
        -], function () {
        -  function SelectOnClose () { }
        -
        -  SelectOnClose.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('close', function () {
        -      self._handleSelectOnClose();
        -    });
        -  };
        -
        -  SelectOnClose.prototype._handleSelectOnClose = function () {
        -    var $highlightedResults = this.getHighlightedResults();
        -
        -    if ($highlightedResults.length < 1) {
        -      return;
        -    }
        -
        -    this.trigger('select', {
        -        data: $highlightedResults.data('data')
        -    });
        -  };
        -
        -  return SelectOnClose;
        -});
        -
        -S2.define('select2/dropdown/closeOnSelect',[
        -
        -], function () {
        -  function CloseOnSelect () { }
        -
        -  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('select', function (evt) {
        -      self._selectTriggered(evt);
        -    });
        -
        -    container.on('unselect', function (evt) {
        -      self._selectTriggered(evt);
        -    });
        -  };
        -
        -  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
        -    var originalEvent = evt.originalEvent;
        -
        -    // Don't close if the control key is being held
        -    if (originalEvent && originalEvent.ctrlKey) {
        -      return;
        -    }
        -
        -    this.trigger('close');
        -  };
        -
        -  return CloseOnSelect;
        -});
        -
        -S2.define('select2/i18n/en',[],function () {
        -  // English
        -  return {
        -    errorLoading: function () {
        -      return 'The results could not be loaded.';
        -    },
        -    inputTooLong: function (args) {
        -      var overChars = args.input.length - args.maximum;
        -
        -      var message = 'Please delete ' + overChars + ' character';
        -
        -      if (overChars != 1) {
        -        message += 's';
        -      }
        -
        -      return message;
        -    },
        -    inputTooShort: function (args) {
        -      var remainingChars = args.minimum - args.input.length;
        -
        -      var message = 'Please enter ' + remainingChars + ' or more characters';
        -
        -      return message;
        -    },
        -    loadingMore: function () {
        -      return 'Loading more results…';
        -    },
        -    maximumSelected: function (args) {
        -      var message = 'You can only select ' + args.maximum + ' item';
        -
        -      if (args.maximum != 1) {
        -        message += 's';
        -      }
        -
        -      return message;
        -    },
        -    noResults: function () {
        -      return 'No results found';
        -    },
        -    searching: function () {
        -      return 'Searching…';
        -    }
        -  };
        -});
        -
        -S2.define('select2/defaults',[
        -  'jquery',
        -  'require',
        -
        -  './results',
        -
        -  './selection/single',
        -  './selection/multiple',
        -  './selection/placeholder',
        -  './selection/allowClear',
        -  './selection/search',
        -  './selection/eventRelay',
        -
        -  './utils',
        -  './translation',
        -  './diacritics',
        -
        -  './data/select',
        -  './data/array',
        -  './data/ajax',
        -  './data/tags',
        -  './data/tokenizer',
        -  './data/minimumInputLength',
        -  './data/maximumInputLength',
        -  './data/maximumSelectionLength',
        -
        -  './dropdown',
        -  './dropdown/search',
        -  './dropdown/hidePlaceholder',
        -  './dropdown/infiniteScroll',
        -  './dropdown/attachBody',
        -  './dropdown/minimumResultsForSearch',
        -  './dropdown/selectOnClose',
        -  './dropdown/closeOnSelect',
        -
        -  './i18n/en'
        -], function ($, require,
        -
        -             ResultsList,
        -
        -             SingleSelection, MultipleSelection, Placeholder, AllowClear,
        -             SelectionSearch, EventRelay,
        -
        -             Utils, Translation, DIACRITICS,
        -
        -             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
        -             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
        -
        -             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
        -             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
        -
        -             EnglishTranslation) {
        -  function Defaults () {
        -    this.reset();
        -  }
        -
        -  Defaults.prototype.apply = function (options) {
        -    options = $.extend({}, this.defaults, options);
        -
        -    if (options.dataAdapter == null) {
        -      if (options.ajax != null) {
        -        options.dataAdapter = AjaxData;
        -      } else if (options.data != null) {
        -        options.dataAdapter = ArrayData;
        -      } else {
        -        options.dataAdapter = SelectData;
        -      }
        -
        -      if (options.minimumInputLength > 0) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          MinimumInputLength
        -        );
        -      }
        -
        -      if (options.maximumInputLength > 0) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          MaximumInputLength
        -        );
        -      }
        -
        -      if (options.maximumSelectionLength > 0) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          MaximumSelectionLength
        -        );
        -      }
        -
        -      if (options.tags) {
        -        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
        -      }
        -
        -      if (options.tokenSeparators != null || options.tokenizer != null) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          Tokenizer
        -        );
        -      }
        -
        -      if (options.query != null) {
        -        var Query = require(options.amdBase + 'compat/query');
        -
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          Query
        -        );
        -      }
        -
        -      if (options.initSelection != null) {
        -        var InitSelection = require(options.amdBase + 'compat/initSelection');
        -
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          InitSelection
        -        );
        -      }
        -    }
        -
        -    if (options.resultsAdapter == null) {
        -      options.resultsAdapter = ResultsList;
        -
        -      if (options.ajax != null) {
        -        options.resultsAdapter = Utils.Decorate(
        -          options.resultsAdapter,
        -          InfiniteScroll
        -        );
        -      }
        -
        -      if (options.placeholder != null) {
        -        options.resultsAdapter = Utils.Decorate(
        -          options.resultsAdapter,
        -          HidePlaceholder
        -        );
        -      }
        -
        -      if (options.selectOnClose) {
        -        options.resultsAdapter = Utils.Decorate(
        -          options.resultsAdapter,
        -          SelectOnClose
        -        );
        -      }
        -    }
        -
        -    if (options.dropdownAdapter == null) {
        -      if (options.multiple) {
        -        options.dropdownAdapter = Dropdown;
        -      } else {
        -        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
        -
        -        options.dropdownAdapter = SearchableDropdown;
        -      }
        -
        -      if (options.minimumResultsForSearch !== 0) {
        -        options.dropdownAdapter = Utils.Decorate(
        -          options.dropdownAdapter,
        -          MinimumResultsForSearch
        -        );
        -      }
        -
        -      if (options.closeOnSelect) {
        -        options.dropdownAdapter = Utils.Decorate(
        -          options.dropdownAdapter,
        -          CloseOnSelect
        -        );
        -      }
        -
        -      if (
        -        options.dropdownCssClass != null ||
        -        options.dropdownCss != null ||
        -        options.adaptDropdownCssClass != null
        -      ) {
        -        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
        -
        -        options.dropdownAdapter = Utils.Decorate(
        -          options.dropdownAdapter,
        -          DropdownCSS
        -        );
        -      }
        -
        -      options.dropdownAdapter = Utils.Decorate(
        -        options.dropdownAdapter,
        -        AttachBody
        -      );
        -    }
        -
        -    if (options.selectionAdapter == null) {
        -      if (options.multiple) {
        -        options.selectionAdapter = MultipleSelection;
        -      } else {
        -        options.selectionAdapter = SingleSelection;
        -      }
        -
        -      // Add the placeholder mixin if a placeholder was specified
        -      if (options.placeholder != null) {
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          Placeholder
        -        );
        -      }
        -
        -      if (options.allowClear) {
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          AllowClear
        -        );
        -      }
        -
        -      if (options.multiple) {
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          SelectionSearch
        -        );
        -      }
        -
        -      if (
        -        options.containerCssClass != null ||
        -        options.containerCss != null ||
        -        options.adaptContainerCssClass != null
        -      ) {
        -        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
        -
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          ContainerCSS
        -        );
        -      }
        -
        -      options.selectionAdapter = Utils.Decorate(
        -        options.selectionAdapter,
        -        EventRelay
        -      );
        -    }
        -
        -    if (typeof options.language === 'string') {
        -      // Check if the language is specified with a region
        -      if (options.language.indexOf('-') > 0) {
        -        // Extract the region information if it is included
        -        var languageParts = options.language.split('-');
        -        var baseLanguage = languageParts[0];
        -
        -        options.language = [options.language, baseLanguage];
        -      } else {
        -        options.language = [options.language];
        -      }
        -    }
        -
        -    if ($.isArray(options.language)) {
        -      var languages = new Translation();
        -      options.language.push('en');
        -
        -      var languageNames = options.language;
        -
        -      for (var l = 0; l < languageNames.length; l++) {
        -        var name = languageNames[l];
        -        var language = {};
        -
        -        try {
        -          // Try to load it with the original name
        -          language = Translation.loadPath(name);
        -        } catch (e) {
        -          try {
        -            // If we couldn't load it, check if it wasn't the full path
        -            name = this.defaults.amdLanguageBase + name;
        -            language = Translation.loadPath(name);
        -          } catch (ex) {
        -            // The translation could not be loaded at all. Sometimes this is
        -            // because of a configuration problem, other times this can be
        -            // because of how Select2 helps load all possible translation files.
        -            if (options.debug && window.console && console.warn) {
        -              console.warn(
        -                'Select2: The language file for "' + name + '" could not be ' +
        -                'automatically loaded. A fallback will be used instead.'
        -              );
        -            }
        -
        -            continue;
        -          }
        -        }
        -
        -        languages.extend(language);
        -      }
        -
        -      options.translations = languages;
        -    } else {
        -      var baseTranslation = Translation.loadPath(
        -        this.defaults.amdLanguageBase + 'en'
        -      );
        -      var customTranslation = new Translation(options.language);
        -
        -      customTranslation.extend(baseTranslation);
        -
        -      options.translations = customTranslation;
        -    }
        -
        -    return options;
        -  };
        -
        -  Defaults.prototype.reset = function () {
        -    function stripDiacritics (text) {
        -      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
        -      function match(a) {
        -        return DIACRITICS[a] || a;
        -      }
        -
        -      return text.replace(/[^\u0000-\u007E]/g, match);
        -    }
        -
        -    function matcher (params, data) {
        -      // Always return the object if there is nothing to compare
        -      if ($.trim(params.term) === '') {
        -        return data;
        -      }
        -
        -      // Do a recursive check for options with children
        -      if (data.children && data.children.length > 0) {
        -        // Clone the data object if there are children
        -        // This is required as we modify the object to remove any non-matches
        -        var match = $.extend(true, {}, data);
        -
        -        // Check each child of the option
        -        for (var c = data.children.length - 1; c >= 0; c--) {
        -          var child = data.children[c];
        -
        -          var matches = matcher(params, child);
        -
        -          // If there wasn't a match, remove the object in the array
        -          if (matches == null) {
        -            match.children.splice(c, 1);
        -          }
        -        }
        -
        -        // If any children matched, return the new object
        -        if (match.children.length > 0) {
        -          return match;
        -        }
        -
        -        // If there were no matching children, check just the plain object
        -        return matcher(params, match);
        -      }
        -
        -      var original = stripDiacritics(data.text).toUpperCase();
        -      var term = stripDiacritics(params.term).toUpperCase();
        -
        -      // Check if the text contains the term
        -      if (original.indexOf(term) > -1) {
        -        return data;
        -      }
        -
        -      // If it doesn't contain the term, don't return anything
        -      return null;
        -    }
        -
        -    this.defaults = {
        -      amdBase: './',
        -      amdLanguageBase: './i18n/',
        -      closeOnSelect: true,
        -      debug: false,
        -      dropdownAutoWidth: false,
        -      escapeMarkup: Utils.escapeMarkup,
        -      language: EnglishTranslation,
        -      matcher: matcher,
        -      minimumInputLength: 0,
        -      maximumInputLength: 0,
        -      maximumSelectionLength: 0,
        -      minimumResultsForSearch: 0,
        -      selectOnClose: false,
        -      sorter: function (data) {
        -        return data;
        -      },
        -      templateResult: function (result) {
        -        return result.text;
        -      },
        -      templateSelection: function (selection) {
        -        return selection.text;
        -      },
        -      theme: 'default',
        -      width: 'resolve'
        -    };
        -  };
        -
        -  Defaults.prototype.set = function (key, value) {
        -    var camelKey = $.camelCase(key);
        -
        -    var data = {};
        -    data[camelKey] = value;
        -
        -    var convertedData = Utils._convertData(data);
        -
        -    $.extend(this.defaults, convertedData);
        -  };
        -
        -  var defaults = new Defaults();
        -
        -  return defaults;
        -});
        -
        -S2.define('select2/options',[
        -  'require',
        -  'jquery',
        -  './defaults',
        -  './utils'
        -], function (require, $, Defaults, Utils) {
        -  function Options (options, $element) {
        -    this.options = options;
        -
        -    if ($element != null) {
        -      this.fromElement($element);
        -    }
        -
        -    this.options = Defaults.apply(this.options);
        -
        -    if ($element && $element.is('input')) {
        -      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
        -
        -      this.options.dataAdapter = Utils.Decorate(
        -        this.options.dataAdapter,
        -        InputCompat
        -      );
        -    }
        -  }
        -
        -  Options.prototype.fromElement = function ($e) {
        -    var excludedData = ['select2'];
        -
        -    if (this.options.multiple == null) {
        -      this.options.multiple = $e.prop('multiple');
        -    }
        -
        -    if (this.options.disabled == null) {
        -      this.options.disabled = $e.prop('disabled');
        -    }
        -
        -    if (this.options.language == null) {
        -      if ($e.prop('lang')) {
        -        this.options.language = $e.prop('lang').toLowerCase();
        -      } else if ($e.closest('[lang]').prop('lang')) {
        -        this.options.language = $e.closest('[lang]').prop('lang');
        -      }
        -    }
        -
        -    if (this.options.dir == null) {
        -      if ($e.prop('dir')) {
        -        this.options.dir = $e.prop('dir');
        -      } else if ($e.closest('[dir]').prop('dir')) {
        -        this.options.dir = $e.closest('[dir]').prop('dir');
        -      } else {
        -        this.options.dir = 'ltr';
        -      }
        -    }
        -
        -    $e.prop('disabled', this.options.disabled);
        -    $e.prop('multiple', this.options.multiple);
        -
        -    if ($e.data('select2Tags')) {
        -      if (this.options.debug && window.console && console.warn) {
        -        console.warn(
        -          'Select2: The `data-select2-tags` attribute has been changed to ' +
        -          'use the `data-data` and `data-tags="true"` attributes and will be ' +
        -          'removed in future versions of Select2.'
        -        );
        -      }
        -
        -      $e.data('data', $e.data('select2Tags'));
        -      $e.data('tags', true);
        -    }
        -
        -    if ($e.data('ajaxUrl')) {
        -      if (this.options.debug && window.console && console.warn) {
        -        console.warn(
        -          'Select2: The `data-ajax-url` attribute has been changed to ' +
        -          '`data-ajax--url` and support for the old attribute will be removed' +
        -          ' in future versions of Select2.'
        -        );
        -      }
        -
        -      $e.attr('ajax--url', $e.data('ajaxUrl'));
        -      $e.data('ajax--url', $e.data('ajaxUrl'));
        -    }
        -
        -    var dataset = {};
        -
        -    // Prefer the element's `dataset` attribute if it exists
        -    // jQuery 1.x does not correctly handle data attributes with multiple dashes
        -    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
        -      dataset = $.extend(true, {}, $e[0].dataset, $e.data());
        -    } else {
        -      dataset = $e.data();
        -    }
        -
        -    var data = $.extend(true, {}, dataset);
        -
        -    data = Utils._convertData(data);
        -
        -    for (var key in data) {
        -      if ($.inArray(key, excludedData) > -1) {
        -        continue;
        -      }
        -
        -      if ($.isPlainObject(this.options[key])) {
        -        $.extend(this.options[key], data[key]);
        -      } else {
        -        this.options[key] = data[key];
        -      }
        -    }
        -
        -    return this;
        -  };
        -
        -  Options.prototype.get = function (key) {
        -    return this.options[key];
        -  };
        -
        -  Options.prototype.set = function (key, val) {
        -    this.options[key] = val;
        -  };
        -
        -  return Options;
        -});
        -
        -S2.define('select2/core',[
        -  'jquery',
        -  './options',
        -  './utils',
        -  './keys'
        -], function ($, Options, Utils, KEYS) {
        -  var Select2 = function ($element, options) {
        -    if ($element.data('select2') != null) {
        -      $element.data('select2').destroy();
        -    }
        -
        -    this.$element = $element;
        -
        -    this.id = this._generateId($element);
        -
        -    options = options || {};
        -
        -    this.options = new Options(options, $element);
        -
        -    Select2.__super__.constructor.call(this);
        -
        -    // Set up the tabindex
        -
        -    var tabindex = $element.attr('tabindex') || 0;
        -    $element.data('old-tabindex', tabindex);
        -    $element.attr('tabindex', '-1');
        -
        -    // Set up containers and adapters
        -
        -    var DataAdapter = this.options.get('dataAdapter');
        -    this.dataAdapter = new DataAdapter($element, this.options);
        -
        -    var $container = this.render();
        -
        -    this._placeContainer($container);
        -
        -    var SelectionAdapter = this.options.get('selectionAdapter');
        -    this.selection = new SelectionAdapter($element, this.options);
        -    this.$selection = this.selection.render();
        -
        -    this.selection.position(this.$selection, $container);
        -
        -    var DropdownAdapter = this.options.get('dropdownAdapter');
        -    this.dropdown = new DropdownAdapter($element, this.options);
        -    this.$dropdown = this.dropdown.render();
        -
        -    this.dropdown.position(this.$dropdown, $container);
        -
        -    var ResultsAdapter = this.options.get('resultsAdapter');
        -    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
        -    this.$results = this.results.render();
        -
        -    this.results.position(this.$results, this.$dropdown);
        -
        -    // Bind events
        -
        -    var self = this;
        -
        -    // Bind the container to all of the adapters
        -    this._bindAdapters();
        -
        -    // Register any DOM event handlers
        -    this._registerDomEvents();
        -
        -    // Register any internal event handlers
        -    this._registerDataEvents();
        -    this._registerSelectionEvents();
        -    this._registerDropdownEvents();
        -    this._registerResultsEvents();
        -    this._registerEvents();
        -
        -    // Set the initial state
        -    this.dataAdapter.current(function (initialData) {
        -      self.trigger('selection:update', {
        -        data: initialData
        -      });
        -    });
        -
        -    // Hide the original select
        -    $element.addClass('select2-hidden-accessible');
        -	$element.attr('aria-hidden', 'true');
        -	
        -    // Synchronize any monitored attributes
        -    this._syncAttributes();
        -
        -    $element.data('select2', this);
        -  };
        -
        -  Utils.Extend(Select2, Utils.Observable);
        -
        -  Select2.prototype._generateId = function ($element) {
        -    var id = '';
        -
        -    if ($element.attr('id') != null) {
        -      id = $element.attr('id');
        -    } else if ($element.attr('name') != null) {
        -      id = $element.attr('name') + '-' + Utils.generateChars(2);
        -    } else {
        -      id = Utils.generateChars(4);
        -    }
        -
        -    id = 'select2-' + id;
        -
        -    return id;
        -  };
        -
        -  Select2.prototype._placeContainer = function ($container) {
        -    $container.insertAfter(this.$element);
        -
        -    var width = this._resolveWidth(this.$element, this.options.get('width'));
        -
        -    if (width != null) {
        -      $container.css('width', width);
        -    }
        -  };
        -
        -  Select2.prototype._resolveWidth = function ($element, method) {
        -    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
        -
        -    if (method == 'resolve') {
        -      var styleWidth = this._resolveWidth($element, 'style');
        -
        -      if (styleWidth != null) {
        -        return styleWidth;
        -      }
        -
        -      return this._resolveWidth($element, 'element');
        -    }
        -
        -    if (method == 'element') {
        -      var elementWidth = $element.outerWidth(false);
        -
        -      if (elementWidth <= 0) {
        -        return 'auto';
        -      }
        -
        -      return elementWidth + 'px';
        -    }
        -
        -    if (method == 'style') {
        -      var style = $element.attr('style');
        -
        -      if (typeof(style) !== 'string') {
        -        return null;
        -      }
        -
        -      var attrs = style.split(';');
        -
        -      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
        -        var attr = attrs[i].replace(/\s/g, '');
        -        var matches = attr.match(WIDTH);
        -
        -        if (matches !== null && matches.length >= 1) {
        -          return matches[1];
        -        }
        -      }
        -
        -      return null;
        -    }
        -
        -    return method;
        -  };
        -
        -  Select2.prototype._bindAdapters = function () {
        -    this.dataAdapter.bind(this, this.$container);
        -    this.selection.bind(this, this.$container);
        -
        -    this.dropdown.bind(this, this.$container);
        -    this.results.bind(this, this.$container);
        -  };
        -
        -  Select2.prototype._registerDomEvents = function () {
        -    var self = this;
        -
        -    this.$element.on('change.select2', function () {
        -      self.dataAdapter.current(function (data) {
        -        self.trigger('selection:update', {
        -          data: data
        -        });
        -      });
        -    });
        -
        -    this._sync = Utils.bind(this._syncAttributes, this);
        -
        -    if (this.$element[0].attachEvent) {
        -      this.$element[0].attachEvent('onpropertychange', this._sync);
        -    }
        -
        -    var observer = window.MutationObserver ||
        -      window.WebKitMutationObserver ||
        -      window.MozMutationObserver
        -    ;
        -
        -    if (observer != null) {
        -      this._observer = new observer(function (mutations) {
        -        $.each(mutations, self._sync);
        -      });
        -      this._observer.observe(this.$element[0], {
        -        attributes: true,
        -        subtree: false
        -      });
        -    } else if (this.$element[0].addEventListener) {
        -      this.$element[0].addEventListener('DOMAttrModified', self._sync, false);
        -    }
        -  };
        -
        -  Select2.prototype._registerDataEvents = function () {
        -    var self = this;
        -
        -    this.dataAdapter.on('*', function (name, params) {
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerSelectionEvents = function () {
        -    var self = this;
        -    var nonRelayEvents = ['toggle'];
        -
        -    this.selection.on('toggle', function () {
        -      self.toggleDropdown();
        -    });
        -
        -    this.selection.on('*', function (name, params) {
        -      if ($.inArray(name, nonRelayEvents) !== -1) {
        -        return;
        -      }
        -
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerDropdownEvents = function () {
        -    var self = this;
        -
        -    this.dropdown.on('*', function (name, params) {
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerResultsEvents = function () {
        -    var self = this;
        -
        -    this.results.on('*', function (name, params) {
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerEvents = function () {
        -    var self = this;
        -
        -    this.on('open', function () {
        -      self.$container.addClass('select2-container--open');
        -    });
        -
        -    this.on('close', function () {
        -      self.$container.removeClass('select2-container--open');
        -    });
        -
        -    this.on('enable', function () {
        -      self.$container.removeClass('select2-container--disabled');
        -    });
        -
        -    this.on('disable', function () {
        -      self.$container.addClass('select2-container--disabled');
        -    });
        -
        -    this.on('focus', function () {
        -      self.$container.addClass('select2-container--focus');
        -    });
        -
        -    this.on('blur', function () {
        -      self.$container.removeClass('select2-container--focus');
        -    });
        -
        -    this.on('query', function (params) {
        -      if (!self.isOpen()) {
        -        self.trigger('open');
        -      }
        -
        -      this.dataAdapter.query(params, function (data) {
        -        self.trigger('results:all', {
        -          data: data,
        -          query: params
        -        });
        -      });
        -    });
        -
        -    this.on('query:append', function (params) {
        -      this.dataAdapter.query(params, function (data) {
        -        self.trigger('results:append', {
        -          data: data,
        -          query: params
        -        });
        -      });
        -    });
        -
        -    this.on('keypress', function (evt) {
        -      var key = evt.which;
        -
        -      if (self.isOpen()) {
        -        if (key === KEYS.ENTER) {
        -          self.trigger('results:select');
        -
        -          evt.preventDefault();
        -        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
        -          self.trigger('results:toggle');
        -
        -          evt.preventDefault();
        -        } else if (key === KEYS.UP) {
        -          self.trigger('results:previous');
        -
        -          evt.preventDefault();
        -        } else if (key === KEYS.DOWN) {
        -          self.trigger('results:next');
        -
        -          evt.preventDefault();
        -        } else if (key === KEYS.ESC || key === KEYS.TAB) {
        -          self.close();
        -
        -          evt.preventDefault();
        -        }
        -      } else {
        -        if (key === KEYS.ENTER || key === KEYS.SPACE ||
        -            ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) {
        -          self.open();
        -
        -          evt.preventDefault();
        -        }
        -      }
        -    });
        -  };
        -
        -  Select2.prototype._syncAttributes = function () {
        -    this.options.set('disabled', this.$element.prop('disabled'));
        -
        -    if (this.options.get('disabled')) {
        -      if (this.isOpen()) {
        -        this.close();
        -      }
        -
        -      this.trigger('disable');
        -    } else {
        -      this.trigger('enable');
        -    }
        -  };
        -
        -  /**
        -   * Override the trigger method to automatically trigger pre-events when
        -   * there are events that can be prevented.
        -   */
        -  Select2.prototype.trigger = function (name, args) {
        -    var actualTrigger = Select2.__super__.trigger;
        -    var preTriggerMap = {
        -      'open': 'opening',
        -      'close': 'closing',
        -      'select': 'selecting',
        -      'unselect': 'unselecting'
        -    };
        -
        -    if (name in preTriggerMap) {
        -      var preTriggerName = preTriggerMap[name];
        -      var preTriggerArgs = {
        -        prevented: false,
        -        name: name,
        -        args: args
        -      };
        -
        -      actualTrigger.call(this, preTriggerName, preTriggerArgs);
        -
        -      if (preTriggerArgs.prevented) {
        -        args.prevented = true;
        -
        -        return;
        -      }
        -    }
        -
        -    actualTrigger.call(this, name, args);
        -  };
        -
        -  Select2.prototype.toggleDropdown = function () {
        -    if (this.options.get('disabled')) {
        -      return;
        -    }
        -
        -    if (this.isOpen()) {
        -      this.close();
        -    } else {
        -      this.open();
        -    }
        -  };
        -
        -  Select2.prototype.open = function () {
        -    if (this.isOpen()) {
        -      return;
        -    }
        -
        -    this.trigger('query', {});
        -
        -    this.trigger('open');
        -  };
        -
        -  Select2.prototype.close = function () {
        -    if (!this.isOpen()) {
        -      return;
        -    }
        -
        -    this.trigger('close');
        -  };
        -
        -  Select2.prototype.isOpen = function () {
        -    return this.$container.hasClass('select2-container--open');
        -  };
        -
        -  Select2.prototype.enable = function (args) {
        -    if (this.options.get('debug') && window.console && console.warn) {
        -      console.warn(
        -        'Select2: The `select2("enable")` method has been deprecated and will' +
        -        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
        -        ' instead.'
        -      );
        -    }
        -
        -    if (args == null || args.length === 0) {
        -      args = [true];
        -    }
        -
        -    var disabled = !args[0];
        -
        -    this.$element.prop('disabled', disabled);
        -  };
        -
        -  Select2.prototype.data = function () {
        -    if (this.options.get('debug') &&
        -        arguments.length > 0 && window.console && console.warn) {
        -      console.warn(
        -        'Select2: Data can no longer be set using `select2("data")`. You ' +
        -        'should consider setting the value instead using `$element.val()`.'
        -      );
        -    }
        -
        -    var data = [];
        -
        -    this.dataAdapter.current(function (currentData) {
        -      data = currentData;
        -    });
        -
        -    return data;
        -  };
        -
        -  Select2.prototype.val = function (args) {
        -    if (this.options.get('debug') && window.console && console.warn) {
        -      console.warn(
        -        'Select2: The `select2("val")` method has been deprecated and will be' +
        -        ' removed in later Select2 versions. Use $element.val() instead.'
        -      );
        -    }
        -
        -    if (args == null || args.length === 0) {
        -      return this.$element.val();
        -    }
        -
        -    var newVal = args[0];
        -
        -    if ($.isArray(newVal)) {
        -      newVal = $.map(newVal, function (obj) {
        -        return obj.toString();
        -      });
        -    }
        -
        -    this.$element.val(newVal).trigger('change');
        -  };
        -
        -  Select2.prototype.destroy = function () {
        -    this.$container.remove();
        -
        -    if (this.$element[0].detachEvent) {
        -      this.$element[0].detachEvent('onpropertychange', this._sync);
        -    }
        -
        -    if (this._observer != null) {
        -      this._observer.disconnect();
        -      this._observer = null;
        -    } else if (this.$element[0].removeEventListener) {
        -      this.$element[0]
        -        .removeEventListener('DOMAttrModified', this._sync, false);
        -    }
        -
        -    this._sync = null;
        -
        -    this.$element.off('.select2');
        -    this.$element.attr('tabindex', this.$element.data('old-tabindex'));
        -
        -    this.$element.removeClass('select2-hidden-accessible');
        -	this.$element.attr('aria-hidden', 'false');
        -    this.$element.removeData('select2');
        -
        -    this.dataAdapter.destroy();
        -    this.selection.destroy();
        -    this.dropdown.destroy();
        -    this.results.destroy();
        -
        -    this.dataAdapter = null;
        -    this.selection = null;
        -    this.dropdown = null;
        -    this.results = null;
        -  };
        -
        -  Select2.prototype.render = function () {
        -    var $container = $(
        -      '<span class="select2 select2-container">' +
        -        '<span class="selection"></span>' +
        -        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
        -      '</span>'
        -    );
        -
        -    $container.attr('dir', this.options.get('dir'));
        -
        -    this.$container = $container;
        -
        -    this.$container.addClass('select2-container--' + this.options.get('theme'));
        -
        -    $container.data('element', this.$element);
        -
        -    return $container;
        -  };
        -
        -  return Select2;
        -});
        -
        -S2.define('jquery.select2',[
        -  'jquery',
        -  'require',
        -
        -  './select2/core',
        -  './select2/defaults'
        -], function ($, require, Select2, Defaults) {
        -  // Force jQuery.mousewheel to be loaded if it hasn't already
        -  require('jquery.mousewheel');
        -
        -  if ($.fn.select2 == null) {
        -    // All methods that should return the element
        -    var thisMethods = ['open', 'close', 'destroy'];
        -
        -    $.fn.select2 = function (options) {
        -      options = options || {};
        -
        -      if (typeof options === 'object') {
        -        this.each(function () {
        -          var instanceOptions = $.extend({}, options, true);
        -
        -          var instance = new Select2($(this), instanceOptions);
        -        });
        -
        -        return this;
        -      } else if (typeof options === 'string') {
        -        var instance = this.data('select2');
        -
        -        if (instance == null && window.console && console.error) {
        -          console.error(
        -            'The select2(\'' + options + '\') method was called on an ' +
        -            'element that is not using Select2.'
        -          );
        -        }
        -
        -        var args = Array.prototype.slice.call(arguments, 1);
        -
        -        var ret = instance[options](args);
        -
        -        // Check if we should be returning `this`
        -        if ($.inArray(options, thisMethods) > -1) {
        -          return this;
        -        }
        -
        -        return ret;
        -      } else {
        -        throw new Error('Invalid arguments for Select2: ' + options);
        -      }
        -    };
        -  }
        -
        -  if ($.fn.select2.defaults == null) {
        -    $.fn.select2.defaults = Defaults;
        -  }
        -
        -  return Select2;
        -});
        -
        -S2.define('jquery.mousewheel',[
        -  'jquery'
        -], function ($) {
        -  // Used to shim jQuery.mousewheel for non-full builds.
        -  return $;
        -});
        -
        -  // Return the AMD loader configuration so it can be used outside of this file
        -  return {
        -    define: S2.define,
        -    require: S2.require
        -  };
        -}());
        -
        -  // Autoload the jQuery bindings
        -  // We know that all of the modules exist above this, so we're safe
        -  var select2 = S2.require('jquery.select2');
        -
        -  // Hold the AMD module references on the jQuery function that was just loaded
        -  // This allows Select2 to use the internal loader outside of this file, such
        -  // as in the language files.
        -  jQuery.fn.select2.amd = S2;
        -
        -  // Return the Select2 instance for anyone who is importing it.
        -  return select2;
        -}));
        -
        -/*!
        - * iCheck v1.0.1, http://git.io/arlzeA
        - * =================================
        - * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization
        - *
        - * (c) 2013 Damir Sultanov, http://fronteed.com
        - * MIT Licensed
        - */
        -
        -(function($) {
        -
        -  // Cached vars
        -  var _iCheck = 'iCheck',
        -    _iCheckHelper = _iCheck + '-helper',
        -    _checkbox = 'checkbox',
        -    _radio = 'radio',
        -    _checked = 'checked',
        -    _unchecked = 'un' + _checked,
        -    _disabled = 'disabled',
        -    _determinate = 'determinate',
        -    _indeterminate = 'in' + _determinate,
        -    _update = 'update',
        -    _type = 'type',
        -    _click = 'click',
        -    _touch = 'touchbegin.i touchend.i',
        -    _add = 'addClass',
        -    _remove = 'removeClass',
        -    _callback = 'trigger',
        -    _label = 'label',
        -    _cursor = 'cursor',
        -    _mobile = /ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);
        -
        -  // Plugin init
        -  $.fn[_iCheck] = function(options, fire) {
        -
        -    // Walker
        -    var handle = 'input[type="' + _checkbox + '"], input[type="' + _radio + '"]',
        -      stack = $(),
        -      walker = function(object) {
        -        object.each(function() {
        -          var self = $(this);
        -
        -          if (self.is(handle)) {
        -            stack = stack.add(self);
        -          } else {
        -            stack = stack.add(self.find(handle));
        -          }
        -        });
        -      };
        -
        -    // Check if we should operate with some method
        -    if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) {
        -
        -      // Normalize method's name
        -      options = options.toLowerCase();
        -
        -      // Find checkboxes and radio buttons
        -      walker(this);
        -
        -      return stack.each(function() {
        -        var self = $(this);
        -
        -        if (options == 'destroy') {
        -          tidy(self, 'ifDestroyed');
        -        } else {
        -          operate(self, true, options);
        -        }
        -          // Fire method's callback
        -        if ($.isFunction(fire)) {
        -          fire();
        -        }
        -      });
        -
        -    // Customization
        -    } else if (typeof options == 'object' || !options) {
        -
        -      // Check if any options were passed
        -      var settings = $.extend({
        -          checkedClass: _checked,
        -          disabledClass: _disabled,
        -          indeterminateClass: _indeterminate,
        -          labelHover: true,
        -          aria: false
        -        }, options),
        -
        -        selector = settings.handle,
        -        hoverClass = settings.hoverClass || 'hover',
        -        focusClass = settings.focusClass || 'focus',
        -        activeClass = settings.activeClass || 'active',
        -        labelHover = !!settings.labelHover,
        -        labelHoverClass = settings.labelHoverClass || 'hover',
        -
        -        // Setup clickable area
        -        area = ('' + settings.increaseArea).replace('%', '') | 0;
        -
        -      // Selector limit
        -      if (selector == _checkbox || selector == _radio) {
        -        handle = 'input[type="' + selector + '"]';
        -      }
        -        // Clickable area limit
        -      if (area < -50) {
        -        area = -50;
        -      }
        -        // Walk around the selector
        -      walker(this);
        -
        -      return stack.each(function() {
        -        var self = $(this);
        -
        -        // If already customized
        -        tidy(self);
        -
        -        var node = this,
        -          id = node.id,
        -
        -          // Layer styles
        -          offset = -area + '%',
        -          size = 100 + (area * 2) + '%',
        -          layer = {
        -            position: 'absolute',
        -            top: offset,
        -            left: offset,
        -            display: 'block',
        -            width: size,
        -            height: size,
        -            margin: 0,
        -            padding: 0,
        -            background: '#fff',
        -            border: 0,
        -            opacity: 0
        -          },
        -
        -          // Choose how to hide input
        -          hide = _mobile ? {
        -            position: 'absolute',
        -            visibility: 'hidden'
        -          } : area ? layer : {
        -            position: 'absolute',
        -            opacity: 0
        -          },
        -
        -          // Get proper class
        -          className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio,
        -
        -          // Find assigned labels
        -          label = $(_label + '[for="' + id + '"]').add(self.closest(_label)),
        -
        -          // Check ARIA option
        -          aria = !!settings.aria,
        -
        -          // Set ARIA placeholder
        -          ariaID = _iCheck + '-' + Math.random().toString(36).replace('0.', ''),
        -
        -          // Parent & helper
        -          parent = '<div class="' + className + '" ' + (aria ? 'role="' + node[_type] + '" ' : ''),
        -          helper;
        -
        -        // Set ARIA "labelledby"
        -        if (label.length && aria) {
        -          label.each(function() {
        -            parent += 'aria-labelledby="';
        -
        -            if (this.id) {
        -              parent += this.id;
        -            } else {
        -              this.id = ariaID;
        -              parent += ariaID;
        -            }
        -
        -            parent += '"';
        -          });
        -        }
        -          // Wrap input
        -        parent = self.wrap(parent + '/>')[_callback]('ifCreated').parent().append(settings.insert);
        -
        -        // Layer addition
        -        helper = $('<ins class="' + _iCheckHelper + '"/>').css(layer).appendTo(parent);
        -
        -        // Finalize customization
        -        self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide);
        -        !!settings.inheritClass && parent[_add](node.className || '');
        -        !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id);
        -        parent.css('position') == 'static' && parent.css('position', 'relative');
        -        operate(self, true, _update);
        -
        -        // Label events
        -        if (label.length) {
        -          label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function(event) {
        -            var type = event[_type],
        -              item = $(this);
        -
        -            // Do nothing if input is disabled
        -            if (!node[_disabled]) {
        -
        -              // Click
        -              if (type == _click) {
        -                if ($(event.target).is('a')) {
        -                  return;
        -                }
        -                operate(self, false, true);
        -
        -              // Hover state
        -              } else if (labelHover) {
        -
        -                // mouseout|touchend
        -                if (/ut|nd/.test(type)) {
        -                  parent[_remove](hoverClass);
        -                  item[_remove](labelHoverClass);
        -                } else {
        -                  parent[_add](hoverClass);
        -                  item[_add](labelHoverClass);
        -                }
        -              }
        -                if (_mobile) {
        -                event.stopPropagation();
        -              } else {
        -                return false;
        -              }
        -            }
        -          });
        -        }
        -          // Input events
        -        self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function(event) {
        -          var type = event[_type],
        -            key = event.keyCode;
        -
        -          // Click
        -          if (type == _click) {
        -            return false;
        -
        -          // Keydown
        -          } else if (type == 'keydown' && key == 32) {
        -            if (!(node[_type] == _radio && node[_checked])) {
        -              if (node[_checked]) {
        -                off(self, _checked);
        -              } else {
        -                on(self, _checked);
        -              }
        -            }
        -              return false;
        -
        -          // Keyup
        -          } else if (type == 'keyup' && node[_type] == _radio) {
        -            !node[_checked] && on(self, _checked);
        -
        -          // Focus/blur
        -          } else if (/us|ur/.test(type)) {
        -            parent[type == 'blur' ? _remove : _add](focusClass);
        -          }
        -        });
        -
        -        // Helper events
        -        helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function(event) {
        -          var type = event[_type],
        -
        -            // mousedown|mouseup
        -            toggle = /wn|up/.test(type) ? activeClass : hoverClass;
        -
        -          // Do nothing if input is disabled
        -          if (!node[_disabled]) {
        -
        -            // Click
        -            if (type == _click) {
        -              operate(self, false, true);
        -
        -            // Active and hover states
        -            } else {
        -
        -              // State is on
        -              if (/wn|er|in/.test(type)) {
        -
        -                // mousedown|mouseover|touchbegin
        -                parent[_add](toggle);
        -
        -              // State is off
        -              } else {
        -                parent[_remove](toggle + ' ' + activeClass);
        -              }
        -                // Label hover
        -              if (label.length && labelHover && toggle == hoverClass) {
        -
        -                // mouseout|touchend
        -                label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass);
        -              }
        -            }
        -              if (_mobile) {
        -              event.stopPropagation();
        -            } else {
        -              return false;
        -            }
        -          }
        -        });
        -      });
        -    } else {
        -      return this;
        -    }
        -  };
        -
        -  // Do something with inputs
        -  function operate(input, direct, method) {
        -    var node = input[0],
        -      state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked,
        -      active = method == _update ? {
        -        checked: node[_checked],
        -        disabled: node[_disabled],
        -        indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false'
        -      } : node[state];
        -
        -    // Check, disable or indeterminate
        -    if (/^(ch|di|in)/.test(method) && !active) {
        -      on(input, state);
        -
        -    // Uncheck, enable or determinate
        -    } else if (/^(un|en|de)/.test(method) && active) {
        -      off(input, state);
        -
        -    // Update
        -    } else if (method == _update) {
        -
        -      // Handle states
        -      for (var state in active) {
        -        if (active[state]) {
        -          on(input, state, true);
        -        } else {
        -          off(input, state, true);
        -        }
        -      }
        -    } else if (!direct || method == 'toggle') {
        -
        -      // Helper or label was clicked
        -      if (!direct) {
        -        input[_callback]('ifClicked');
        -      }
        -        // Toggle checked state
        -      if (active) {
        -        if (node[_type] !== _radio) {
        -          off(input, state);
        -        }
        -      } else {
        -        on(input, state);
        -      }
        -    }
        -  }
        -    // Add checked, disabled or indeterminate state
        -  function on(input, state, keep) {
        -    var node = input[0],
        -      parent = input.parent(),
        -      checked = state == _checked,
        -      indeterminate = state == _indeterminate,
        -      disabled = state == _disabled,
        -      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',
        -      regular = option(input, callback + capitalize(node[_type])),
        -      specific = option(input, state + capitalize(node[_type]));
        -
        -    // Prevent unnecessary actions
        -    if (node[state] !== true) {
        -
        -      // Toggle assigned radio buttons
        -      if (!keep && state == _checked && node[_type] == _radio && node.name) {
        -        var form = input.closest('form'),
        -          inputs = 'input[name="' + node.name + '"]';
        -
        -        inputs = form.length ? form.find(inputs) : $(inputs);
        -
        -        inputs.each(function() {
        -          if (this !== node && $(this).data(_iCheck)) {
        -            off($(this), state);
        -          }
        -        });
        -      }
        -        // Indeterminate state
        -      if (indeterminate) {
        -
        -        // Add indeterminate state
        -        node[state] = true;
        -
        -        // Remove checked state
        -        if (node[_checked]) {
        -          off(input, _checked, 'force');
        -        }
        -          // Checked or disabled state
        -      } else {
        -
        -        // Add checked or disabled state
        -        if (!keep) {
        -          node[state] = true;
        -        }
        -          // Remove indeterminate state
        -        if (checked && node[_indeterminate]) {
        -          off(input, _indeterminate, false);
        -        }
        -      }
        -        // Trigger callbacks
        -      callbacks(input, checked, state, keep);
        -    }
        -      // Add proper cursor
        -    if (node[_disabled] && !!option(input, _cursor, true)) {
        -      parent.find('.' + _iCheckHelper).css(_cursor, 'default');
        -    }
        -      // Add state class
        -    parent[_add](specific || option(input, state) || '');
        -
        -    // Set ARIA attribute
        -    disabled ? parent.attr('aria-disabled', 'true') : parent.attr('aria-checked', indeterminate ? 'mixed' : 'true');
        -
        -    // Remove regular state class
        -    parent[_remove](regular || option(input, callback) || '');
        -  }
        -    // Remove checked, disabled or indeterminate state
        -  function off(input, state, keep) {
        -    var node = input[0],
        -      parent = input.parent(),
        -      checked = state == _checked,
        -      indeterminate = state == _indeterminate,
        -      disabled = state == _disabled,
        -      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',
        -      regular = option(input, callback + capitalize(node[_type])),
        -      specific = option(input, state + capitalize(node[_type]));
        -
        -    // Prevent unnecessary actions
        -    if (node[state] !== false) {
        -
        -      // Toggle state
        -      if (indeterminate || !keep || keep == 'force') {
        -        node[state] = false;
        -      }
        -        // Trigger callbacks
        -      callbacks(input, checked, callback, keep);
        -    }
        -      // Add proper cursor
        -    if (!node[_disabled] && !!option(input, _cursor, true)) {
        -      parent.find('.' + _iCheckHelper).css(_cursor, 'pointer');
        -    }
        -      // Remove state class
        -    parent[_remove](specific || option(input, state) || '');
        -
        -    // Set ARIA attribute
        -    disabled ? parent.attr('aria-disabled', 'false') : parent.attr('aria-checked', 'false');
        -
        -    // Add regular state class
        -    parent[_add](regular || option(input, callback) || '');
        -  }
        -    // Remove all traces
        -  function tidy(input, callback) {
        -    if (input.data(_iCheck)) {
        -
        -      // Remove everything except input
        -      input.parent().html(input.attr('style', input.data(_iCheck).s || ''));
        -
        -      // Callback
        -      if (callback) {
        -        input[_callback](callback);
        -      }
        -        // Unbind events
        -      input.off('.i').unwrap();
        -      $(_label + '[for="' + input[0].id + '"]').add(input.closest(_label)).off('.i');
        -    }
        -  }
        -    // Get some option
        -  function option(input, state, regular) {
        -    if (input.data(_iCheck)) {
        -      return input.data(_iCheck).o[state + (regular ? '' : 'Class')];
        -    }
        -  }
        -    // Capitalize some string
        -  function capitalize(string) {
        -    return string.charAt(0).toUpperCase() + string.slice(1);
        -  }
        -    // Executable handlers
        -  function callbacks(input, checked, callback, keep) {
        -    if (!keep) {
        -      if (checked) {
        -        input[_callback]('ifToggled');
        -      }
        -        input[_callback]('ifChanged')[_callback]('if' + capitalize(callback));
        -    }
        -  }
        -})(window.jQuery || window.Zepto);
        -
        -
        -/*
        -Lightbox for Bootstrap 3 by @ashleydw
        -https://github.com/ashleydw/lightbox
        -
        -License: https://github.com/ashleydw/lightbox/blob/master/LICENSE
        - */
        -
        -(function() {
        -  "use strict";
        -  var $, EkkoLightbox;
        -
        -  $ = jQuery;
        -
        -  EkkoLightbox = function(element, options) {
        -    var content, footer, header;
        -    this.options = $.extend({
        -      title: null,
        -      footer: null,
        -      remote: null
        -    }, $.fn.ekkoLightbox.defaults, options || {});
        -    this.$element = $(element);
        -    content = '';
        -    this.modal_id = this.options.modal_id ? this.options.modal_id : 'ekkoLightbox-' + Math.floor((Math.random() * 1000) + 1);
        -    header = '<div class="modal-header"' + (this.options.title || this.options.always_show_close ? '' : ' style="display:none"') + '><button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button><h4 class="modal-title">' + (this.options.title || "&nbsp;") + '</h4></div>';
        -    footer = '<div class="modal-footer"' + (this.options.footer ? '' : ' style="display:none"') + '>' + this.options.footer + '</div>';
        -    $(document.body).append('<div id="' + this.modal_id + '" class="ekko-lightbox modal fade" tabindex="-1"><div class="modal-dialog"><div class="modal-content">' + header + '<div class="modal-body"><div class="ekko-lightbox-container"><div></div></div></div>' + footer + '</div></div></div>');
        -    this.modal = $('#' + this.modal_id);
        -    this.modal_dialog = this.modal.find('.modal-dialog').first();
        -    this.modal_content = this.modal.find('.modal-content').first();
        -    this.modal_body = this.modal.find('.modal-body').first();
        -    this.modal_header = this.modal.find('.modal-header').first();
        -    this.modal_footer = this.modal.find('.modal-footer').first();
        -    this.lightbox_container = this.modal_body.find('.ekko-lightbox-container').first();
        -    this.lightbox_body = this.lightbox_container.find('> div:first-child').first();
        -    this.showLoading();
        -    this.modal_arrows = null;
        -    this.border = {
        -      top: parseFloat(this.modal_dialog.css('border-top-width')) + parseFloat(this.modal_content.css('border-top-width')) + parseFloat(this.modal_body.css('border-top-width')),
        -      right: parseFloat(this.modal_dialog.css('border-right-width')) + parseFloat(this.modal_content.css('border-right-width')) + parseFloat(this.modal_body.css('border-right-width')),
        -      bottom: parseFloat(this.modal_dialog.css('border-bottom-width')) + parseFloat(this.modal_content.css('border-bottom-width')) + parseFloat(this.modal_body.css('border-bottom-width')),
        -      left: parseFloat(this.modal_dialog.css('border-left-width')) + parseFloat(this.modal_content.css('border-left-width')) + parseFloat(this.modal_body.css('border-left-width'))
        -    };
        -    this.padding = {
        -      top: parseFloat(this.modal_dialog.css('padding-top')) + parseFloat(this.modal_content.css('padding-top')) + parseFloat(this.modal_body.css('padding-top')),
        -      right: parseFloat(this.modal_dialog.css('padding-right')) + parseFloat(this.modal_content.css('padding-right')) + parseFloat(this.modal_body.css('padding-right')),
        -      bottom: parseFloat(this.modal_dialog.css('padding-bottom')) + parseFloat(this.modal_content.css('padding-bottom')) + parseFloat(this.modal_body.css('padding-bottom')),
        -      left: parseFloat(this.modal_dialog.css('padding-left')) + parseFloat(this.modal_content.css('padding-left')) + parseFloat(this.modal_body.css('padding-left'))
        -    };
        -    this.modal.on('show.bs.modal', this.options.onShow.bind(this)).on('shown.bs.modal', (function(_this) {
        -      return function() {
        -        _this.modal_shown();
        -        return _this.options.onShown.call(_this);
        -      };
        -    })(this)).on('hide.bs.modal', this.options.onHide.bind(this)).on('hidden.bs.modal', (function(_this) {
        -      return function() {
        -        if (_this.gallery) {
        -          $(document).off('keydown.ekkoLightbox');
        -        }
        -        _this.modal.remove();
        -        return _this.options.onHidden.call(_this);
        -      };
        -    })(this)).modal('show', options);
        -    return this.modal;
        -  };
        -
        -  EkkoLightbox.prototype = {
        -    modal_shown: function() {
        -      var video_id;
        -      if (!this.options.remote) {
        -        return this.error('No remote target given');
        -      } else {
        -        this.gallery = this.$element.data('gallery');
        -        if (this.gallery) {
        -          if (this.options.gallery_parent_selector === 'document.body' || this.options.gallery_parent_selector === '') {
        -            this.gallery_items = $(document.body).find('*[data-gallery="' + this.gallery + '"]');
        -          } else {
        -            this.gallery_items = this.$element.parents(this.options.gallery_parent_selector).first().find('*[data-gallery="' + this.gallery + '"]');
        -          }
        -          this.gallery_index = this.gallery_items.index(this.$element);
        -          $(document).on('keydown.ekkoLightbox', this.navigate.bind(this));
        -          if (this.options.directional_arrows && this.gallery_items.length > 1) {
        -            this.lightbox_container.append('<div class="ekko-lightbox-nav-overlay"><a href="#" class="' + this.strip_stops(this.options.left_arrow_class) + '"></a><a href="#" class="' + this.strip_stops(this.options.right_arrow_class) + '"></a></div>');
        -            this.modal_arrows = this.lightbox_container.find('div.ekko-lightbox-nav-overlay').first();
        -            this.lightbox_container.find('a' + this.strip_spaces(this.options.left_arrow_class)).on('click', (function(_this) {
        -              return function(event) {
        -                event.preventDefault();
        -                return _this.navigate_left();
        -              };
        -            })(this));
        -            this.lightbox_container.find('a' + this.strip_spaces(this.options.right_arrow_class)).on('click', (function(_this) {
        -              return function(event) {
        -                event.preventDefault();
        -                return _this.navigate_right();
        -              };
        -            })(this));
        -          }
        -        }
        -        if (this.options.type) {
        -          if (this.options.type === 'image') {
        -            return this.preloadImage(this.options.remote, true);
        -          } else if (this.options.type === 'youtube' && (video_id = this.getYoutubeId(this.options.remote))) {
        -            return this.showYoutubeVideo(video_id);
        -          } else if (this.options.type === 'vimeo') {
        -            return this.showVimeoVideo(this.options.remote);
        -          } else if (this.options.type === 'instagram') {
        -            return this.showInstagramVideo(this.options.remote);
        -          } else if (this.options.type === 'url') {
        -            return this.loadRemoteContent(this.options.remote);
        -          } else if (this.options.type === 'video') {
        -            return this.showVideoIframe(this.options.remote);
        -          } else {
        -            return this.error("Could not detect remote target type. Force the type using data-type=\"image|youtube|vimeo|instagram|url|video\"");
        -          }
        -        } else {
        -          return this.detectRemoteType(this.options.remote);
        -        }
        -      }
        -    },
        -    strip_stops: function(str) {
        -      return str.replace(/\./g, '');
        -    },
        -    strip_spaces: function(str) {
        -      return str.replace(/\s/g, '');
        -    },
        -    isImage: function(str) {
        -      return str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);
        -    },
        -    isSwf: function(str) {
        -      return str.match(/\.(swf)((\?|#).*)?$/i);
        -    },
        -    getYoutubeId: function(str) {
        -      var match;
        -      match = str.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);
        -      if (match && match[2].length === 11) {
        -        return match[2];
        -      } else {
        -        return false;
        -      }
        -    },
        -    getVimeoId: function(str) {
        -      if (str.indexOf('vimeo') > 0) {
        -        return str;
        -      } else {
        -        return false;
        -      }
        -    },
        -    getInstagramId: function(str) {
        -      if (str.indexOf('instagram') > 0) {
        -        return str;
        -      } else {
        -        return false;
        -      }
        -    },
        -    navigate: function(event) {
        -      event = event || window.event;
        -      if (event.keyCode === 39 || event.keyCode === 37) {
        -        if (event.keyCode === 39) {
        -          return this.navigate_right();
        -        } else if (event.keyCode === 37) {
        -          return this.navigate_left();
        -        }
        -      }
        -    },
        -    navigateTo: function(index) {
        -      var next, src;
        -      if (index < 0 || index > this.gallery_items.length - 1) {
        -        return this;
        -      }
        -      this.showLoading();
        -      this.gallery_index = index;
        -      this.$element = $(this.gallery_items.get(this.gallery_index));
        -      this.updateTitleAndFooter();
        -      src = this.$element.attr('data-remote') || this.$element.attr('href');
        -      this.detectRemoteType(src, this.$element.attr('data-type') || false);
        -      if (this.gallery_index + 1 < this.gallery_items.length) {
        -        next = $(this.gallery_items.get(this.gallery_index + 1), false);
        -        src = next.attr('data-remote') || next.attr('href');
        -        if (next.attr('data-type') === 'image' || this.isImage(src)) {
        -          return this.preloadImage(src, false);
        -        }
        -      }
        -    },
        -    navigate_left: function() {
        -      if (this.gallery_items.length === 1) {
        -        return;
        -      }
        -      if (this.gallery_index === 0) {
        -        this.gallery_index = this.gallery_items.length - 1;
        -      } else {
        -        this.gallery_index--;
        -      }
        -      this.options.onNavigate.call(this, 'left', this.gallery_index);
        -      return this.navigateTo(this.gallery_index);
        -    },
        -    navigate_right: function() {
        -      if (this.gallery_items.length === 1) {
        -        return;
        -      }
        -      if (this.gallery_index === this.gallery_items.length - 1) {
        -        this.gallery_index = 0;
        -      } else {
        -        this.gallery_index++;
        -      }
        -      this.options.onNavigate.call(this, 'right', this.gallery_index);
        -      return this.navigateTo(this.gallery_index);
        -    },
        -    detectRemoteType: function(src, type) {
        -      var video_id;
        -      type = type || false;
        -      if (type === 'image' || this.isImage(src)) {
        -        this.options.type = 'image';
        -        return this.preloadImage(src, true);
        -      } else if (type === 'youtube' || (video_id = this.getYoutubeId(src))) {
        -        this.options.type = 'youtube';
        -        return this.showYoutubeVideo(video_id);
        -      } else if (type === 'vimeo' || (video_id = this.getVimeoId(src))) {
        -        this.options.type = 'vimeo';
        -        return this.showVimeoVideo(video_id);
        -      } else if (type === 'instagram' || (video_id = this.getInstagramId(src))) {
        -        this.options.type = 'instagram';
        -        return this.showInstagramVideo(video_id);
        -      } else if (type === 'video') {
        -        this.options.type = 'video';
        -        return this.showVideoIframe(video_id);
        -      } else {
        -        this.options.type = 'url';
        -        return this.loadRemoteContent(src);
        -      }
        -    },
        -    updateTitleAndFooter: function() {
        -      var caption, footer, header, title;
        -      header = this.modal_content.find('.modal-header');
        -      footer = this.modal_content.find('.modal-footer');
        -      title = this.$element.data('title') || "";
        -      caption = this.$element.data('footer') || "";
        -      if (title || this.options.always_show_close) {
        -        header.css('display', '').find('.modal-title').html(title || "&nbsp;");
        -      } else {
        -        header.css('display', 'none');
        -      }
        -      if (caption) {
        -        footer.css('display', '').html(caption);
        -      } else {
        -        footer.css('display', 'none');
        -      }
        -      return this;
        -    },
        -    showLoading: function() {
        -      this.lightbox_body.html('<div class="modal-loading">' + this.options.loadingMessage + '</div>');
        -      return this;
        -    },
        -    showYoutubeVideo: function(id) {
        -      var height, rel, width;
        -      if ((this.$element.attr('data-norelated') != null) || this.options.no_related) {
        -        rel = "&rel=0";
        -      } else {
        -        rel = "";
        -      }
        -      width = this.checkDimensions(this.$element.data('width') || 560);
        -      height = width / (560 / 315);
        -      return this.showVideoIframe('//www.youtube.com/embed/' + id + '?badge=0&autoplay=1&html5=1' + rel, width, height);
        -    },
        -    showVimeoVideo: function(id) {
        -      var height, width;
        -      width = this.checkDimensions(this.$element.data('width') || 560);
        -      height = width / (500 / 281);
        -      return this.showVideoIframe(id + '?autoplay=1', width, height);
        -    },
        -    showInstagramVideo: function(id) {
        -      var height, width;
        -      width = this.checkDimensions(this.$element.data('width') || 612);
        -      this.resize(width);
        -      height = width + 80;
        -      this.lightbox_body.html('<iframe width="' + width + '" height="' + height + '" src="' + this.addTrailingSlash(id) + 'embed/" frameborder="0" allowfullscreen></iframe>');
        -      this.options.onContentLoaded.call(this);
        -      if (this.modal_arrows) {
        -        return this.modal_arrows.css('display', 'none');
        -      }
        -    },
        -    showVideoIframe: function(url, width, height) {
        -      height = height || width;
        -      this.resize(width);
        -      this.lightbox_body.html('<div class="embed-responsive embed-responsive-16by9"><iframe width="' + width + '" height="' + height + '" src="' + url + '" frameborder="0" allowfullscreen class="embed-responsive-item"></iframe></div>');
        -      this.options.onContentLoaded.call(this);
        -      if (this.modal_arrows) {
        -        this.modal_arrows.css('display', 'none');
        -      }
        -      return this;
        -    },
        -    loadRemoteContent: function(url) {
        -      var disableExternalCheck, width;
        -      width = this.$element.data('width') || 560;
        -      this.resize(width);
        -      disableExternalCheck = this.$element.data('disableExternalCheck') || false;
        -      if (!disableExternalCheck && !this.isExternal(url)) {
        -        this.lightbox_body.load(url, $.proxy((function(_this) {
        -          return function() {
        -            return _this.$element.trigger('loaded.bs.modal');
        -          };
        -        })(this)));
        -      } else {
        -        this.lightbox_body.html('<iframe width="' + width + '" height="' + width + '" src="' + url + '" frameborder="0" allowfullscreen></iframe>');
        -        this.options.onContentLoaded.call(this);
        -      }
        -      if (this.modal_arrows) {
        -        this.modal_arrows.css('display', 'none');
        -      }
        -      return this;
        -    },
        -    isExternal: function(url) {
        -      var match;
        -      match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
        -      if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) {
        -        return true;
        -      }
        -      if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":(" + {
        -        "http:": 80,
        -        "https:": 443
        -      }[location.protocol] + ")?$"), "") !== location.host) {
        -        return true;
        -      }
        -      return false;
        -    },
        -    error: function(message) {
        -      this.lightbox_body.html(message);
        -      return this;
        -    },
        -    preloadImage: function(src, onLoadShowImage) {
        -      var img;
        -      img = new Image();
        -      if ((onLoadShowImage == null) || onLoadShowImage === true) {
        -        img.onload = (function(_this) {
        -          return function() {
        -            var image;
        -            image = $('<img />');
        -            image.attr('src', img.src);
        -            image.addClass('img-responsive');
        -            _this.lightbox_body.html(image);
        -            if (_this.modal_arrows) {
        -              _this.modal_arrows.css('display', 'block');
        -            }
        -            return image.load(function() {
        -              if (_this.options.scale_height) {
        -                _this.scaleHeight(img.height, img.width);
        -              } else {
        -                _this.resize(img.width);
        -              }
        -              return _this.options.onContentLoaded.call(_this);
        -            });
        -          };
        -        })(this);
        -        img.onerror = (function(_this) {
        -          return function() {
        -            return _this.error('Failed to load image: ' + src);
        -          };
        -        })(this);
        -      }
        -      img.src = src;
        -      return img;
        -    },
        -    scaleHeight: function(height, width) {
        -      var border_padding, factor, footer_height, header_height, margins, max_height;
        -      header_height = this.modal_header.outerHeight(true) || 0;
        -      footer_height = this.modal_footer.outerHeight(true) || 0;
        -      if (!this.modal_footer.is(':visible')) {
        -        footer_height = 0;
        -      }
        -      if (!this.modal_header.is(':visible')) {
        -        header_height = 0;
        -      }
        -      border_padding = this.border.top + this.border.bottom + this.padding.top + this.padding.bottom;
        -      margins = parseFloat(this.modal_dialog.css('margin-top')) + parseFloat(this.modal_dialog.css('margin-bottom'));
        -      max_height = $(window).height() - border_padding - margins - header_height - footer_height;
        -      factor = Math.min(max_height / height, 1);
        -      this.modal_dialog.css('height', 'auto').css('max-height', max_height);
        -      return this.resize(factor * width);
        -    },
        -    resize: function(width) {
        -      var width_total;
        -      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;
        -      this.modal_dialog.css('width', 'auto').css('max-width', width_total);
        -      this.lightbox_container.find('a').css('line-height', function() {
        -        return $(this).parent().height() + 'px';
        -      });
        -      return this;
        -    },
        -    checkDimensions: function(width) {
        -      var body_width, width_total;
        -      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;
        -      body_width = document.body.clientWidth;
        -      if (width_total > body_width) {
        -        width = this.modal_body.width();
        -      }
        -      return width;
        -    },
        -    close: function() {
        -      return this.modal.modal('hide');
        -    },
        -    addTrailingSlash: function(url) {
        -      if (url.substr(-1) !== '/') {
        -        url += '/';
        -      }
        -      return url;
        -    }
        -  };
        -
        -  $.fn.ekkoLightbox = function(options) {
        -    return this.each(function() {
        -      var $this;
        -      $this = $(this);
        -      options = $.extend({
        -        remote: $this.attr('data-remote') || $this.attr('href'),
        -        gallery_parent_selector: $this.attr('data-parent'),
        -        type: $this.attr('data-type')
        -      }, options, $this.data());
        -      new EkkoLightbox(this, options);
        -      return this;
        -    });
        -  };
        -
        -  $.fn.ekkoLightbox.defaults = {
        -    gallery_parent_selector: 'document.body',
        -    left_arrow_class: '.glyphicon .glyphicon-chevron-left',
        -    right_arrow_class: '.glyphicon .glyphicon-chevron-right',
        -    directional_arrows: true,
        -    type: null,
        -    always_show_close: true,
        -    no_related: false,
        -    scale_height: true,
        -    loadingMessage: 'Loading...',
        -    onShow: function() {},
        -    onShown: function() {},
        -    onHide: function() {},
        -    onHidden: function() {},
        -    onNavigate: function() {},
        -    onContentLoaded: function() {}
        -  };
        -
        -}).call(this);
        -
        -/**
        - * Module containing core application logic.
        - * @param  {jQuery} $        Insulated jQuery object
        - * @param  {JSON} settings Insulated `window.snipeit.settings` object.
        - * @return {IIFE}          Immediately invoked. Returns self.
        - */
        -
        -
        -var pieOptions = {
        -    //Boolean - Whether we should show a stroke on each segment
        -    segmentShowStroke: true,
        -    //String - The colour of each segment stroke
        -    segmentStrokeColor: "#fff",
        -    //Number - The width of each segment stroke
        -    segmentStrokeWidth: 1,
        -    //Number - The percentage of the chart that we cut out of the middle
        -    percentageInnerCutout: 50, // This is 0 for Pie charts
        -    //Number - Amount of animation steps
        -    animationSteps: 100,
        -    //String - Animation easing effect
        -    animationEasing: "easeOutBounce",
        -    //Boolean - Whether we animate the rotation of the Doughnut
        -    animateRotate: true,
        -    //Boolean - Whether we animate scaling the Doughnut from the centre
        -    animateScale: false,
        -    //Boolean - whether to make the chart responsive to window resizing
        -    responsive: true,
        -    // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
        -    maintainAspectRatio: false,
        -
        -    //String - A legend template
        -    legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li>" +
        -    "<i class='fa fa-circle-o' style='color: <%=segments[i].fillColor%>'></i>" +
        -    "<%if(segments[i].label){%><%=segments[i].label%><%}%> foo</li><%}%></ul>",
        -    //String - A tooltip template
        -    tooltipTemplate: "<%=value %> <%=label%> "
        -};
        -//console.dir(pieOptions);
        -//Create pie or douhnut chart
        -// You can switch between pie and douhnut using the method below.
        -//pieChart.Doughnut(PieData, pieOptions);
        -//-----------------
        -//- END PIE CHART -
        -//-----------------
        -
        -
        -
        -(function($, settings) {
        -    var Components = {};
        -    Components.modals = {};
        -
        -    // confirm delete modal
        -    Components.modals.confirmDelete = function() {
        -        var $el = $('table');
        -
        -        var events = {
        -            'click': function(evnt) {
        -                var $context = $(this);
        -                var $dataConfirmModal = $('#dataConfirmModal');
        -                var href = $context.attr('href');
        -                var message = $context.attr('data-content');
        -                var title = $context.attr('data-title');
        -
        -                $('#myModalLabel').text(title);
        -                $dataConfirmModal.find('.modal-body').text(message);
        -                $('#dataConfirmOK').attr('href', href);
        -                $dataConfirmModal.modal({
        -                    show: true
        -                });
        -                return false;
        -            }
        -        };
        -
        -        var render = function() {
        -            $el.on('click', '.delete-asset', events['click']);
        -        };
        -
        -        return {
        -            render: render
        -        };
        -    };
        -
        -
        -    /**
        -     * Application start point
        -     * Component definition stays out of load event, execution only happens.
        -     */
        -    $(function() {
        -        new Components.modals.confirmDelete().render();
        -    });
        -}(jQuery, window.snipeit.settings));
        -
        -
        -
        -
        -/*! AdminLTE app.js
        - * ================
        - * Main JS application file for AdminLTE v2. This file
        - * should be included in all pages. It controls some layout
        - * options and implements exclusive AdminLTE plugins.
        - *
        - * @Author  Almsaeed Studio
        - * @Support <http://www.almsaeedstudio.com>
        - * @Email   <support@almsaeedstudio.com>
        - * @version 2.3.0
        - * @license MIT <http://opensource.org/licenses/MIT>
        - */
        -
        -//Make sure jQuery has been loaded before app.js
        -if (typeof jQuery === "undefined") {
        -  throw new Error("AdminLTE requires jQuery");
        -}
        -
        -
        -/* AdminLTE
        - *
        - * @type Object
        - * @description $.AdminLTE is the main object for the template's app.
        - *              It's used for implementing functions and options related
        - *              to the template. Keeping everything wrapped in an object
        - *              prevents conflict with other plugins and is a better
        - *              way to organize our code.
        - */
        -$.AdminLTE = {};
        -
        -/* --------------------
        - * - AdminLTE Options -
        - * --------------------
        - * Modify these options to suit your implementation
        - */
        -$.AdminLTE.options = {
        -  //Add slimscroll to navbar menus
        -  //This requires you to load the slimscroll plugin
        -  //in every page before app.js
        -  navbarMenuSlimscroll: true,
        -  navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar
        -  navbarMenuHeight: "200px", //The height of the inner menu
        -  //General animation speed for JS animated elements such as box collapse/expand and
        -  //sidebar treeview slide up/down. This options accepts an integer as milliseconds,
        -  //'fast', 'normal', or 'slow'
        -  animationSpeed: 500,
        -  //Sidebar push menu toggle button selector
        -  sidebarToggleSelector: "[data-toggle='offcanvas']",
        -  //Activate sidebar push menu
        -  sidebarPushMenu: true,
        -  //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
        -  sidebarSlimScroll: true,
        -  //Enable sidebar expand on hover effect for sidebar mini
        -  //This option is forced to true if both the fixed layout and sidebar mini
        -  //are used together
        -  sidebarExpandOnHover: false,
        -  //BoxRefresh Plugin
        -  enableBoxRefresh: true,
        -  //Bootstrap.js tooltip
        -  enableBSToppltip: true,
        -  BSTooltipSelector: "[data-toggle='tooltip']",
        -  //Enable Fast Click. Fastclick.js creates a more
        -  //native touch experience with touch devices. If you
        -  //choose to enable the plugin, make sure you load the script
        -  //before AdminLTE's app.js
        -  enableFastclick: true,
        -  //Control Sidebar Options
        -  enableControlSidebar: true,
        -  controlSidebarOptions: {
        -    //Which button should trigger the open/close event
        -    toggleBtnSelector: "[data-toggle='control-sidebar']",
        -    //The sidebar selector
        -    selector: ".control-sidebar",
        -    //Enable slide over content
        -    slide: true
        -  },
        -  //Box Widget Plugin. Enable this plugin
        -  //to allow boxes to be collapsed and/or removed
        -  enableBoxWidget: true,
        -  //Box Widget plugin options
        -  boxWidgetOptions: {
        -    boxWidgetIcons: {
        -      //Collapse icon
        -      collapse: 'fa-minus',
        -      //Open icon
        -      open: 'fa-plus',
        -      //Remove icon
        -      remove: 'fa-times'
        -    },
        -    boxWidgetSelectors: {
        -      //Remove button selector
        -      remove: '[data-widget="remove"]',
        -      //Collapse button selector
        -      collapse: '[data-widget="collapse"]'
        -    }
        -  },
        -  //Direct Chat plugin options
        -  directChat: {
        -    //Enable direct chat by default
        -    enable: true,
        -    //The button to open and close the chat contacts pane
        -    contactToggleSelector: '[data-widget="chat-pane-toggle"]'
        -  },
        -  //Define the set of colors to use globally around the website
        -  colors: {
        -    lightBlue: "#3c8dbc",
        -    red: "#f56954",
        -    green: "#00a65a",
        -    aqua: "#00c0ef",
        -    yellow: "#f39c12",
        -    blue: "#0073b7",
        -    navy: "#001F3F",
        -    teal: "#39CCCC",
        -    olive: "#3D9970",
        -    lime: "#01FF70",
        -    orange: "#FF851B",
        -    fuchsia: "#F012BE",
        -    purple: "#8E24AA",
        -    maroon: "#D81B60",
        -    black: "#222222",
        -    gray: "#d2d6de"
        -  },
        -  //The standard screen sizes that bootstrap uses.
        -  //If you change these in the variables.less file, change
        -  //them here too.
        -  screenSizes: {
        -    xs: 480,
        -    sm: 768,
        -    md: 992,
        -    lg: 1200
        -  }
        -};
        -
        -/* ------------------
        - * - Implementation -
        - * ------------------
        - * The next block of code implements AdminLTE's
        - * functions and plugins as specified by the
        - * options above.
        - */
        -$(function () {
        -  "use strict";
        -
        -  //Fix for IE page transitions
        -  $("body").removeClass("hold-transition");
        -
        -  //Extend options if external options exist
        -  if (typeof AdminLTEOptions !== "undefined") {
        -    $.extend(true,
        -            $.AdminLTE.options,
        -            AdminLTEOptions);
        -  }
        -
        -  //Easy access to options
        -  var o = $.AdminLTE.options;
        -
        -  //Set up the object
        -  _init();
        -
        -  //Activate the layout maker
        -  $.AdminLTE.layout.activate();
        -
        -  //Enable sidebar tree view controls
        -  $.AdminLTE.tree('.sidebar');
        -
        -  //Enable control sidebar
        -  if (o.enableControlSidebar) {
        -    $.AdminLTE.controlSidebar.activate();
        -  }
        -
        -  //Add slimscroll to navbar dropdown
        -  if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
        -    $(".navbar .menu").slimscroll({
        -      height: o.navbarMenuHeight,
        -      alwaysVisible: false,
        -      size: o.navbarMenuSlimscrollWidth
        -    }).css("width", "100%");
        -  }
        -
        -  //Activate sidebar push menu
        -  if (o.sidebarPushMenu) {
        -    $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
        -  }
        -
        -  //Activate Bootstrap tooltip
        -  if (o.enableBSToppltip) {
        -    $('body').tooltip({
        -      selector: o.BSTooltipSelector
        -    });
        -  }
        -
        -  //Activate box widget
        -  if (o.enableBoxWidget) {
        -    $.AdminLTE.boxWidget.activate();
        -  }
        -
        -  //Activate fast click
        -  if (o.enableFastclick && typeof FastClick != 'undefined') {
        -    FastClick.attach(document.body);
        -  }
        -
        -  //Activate direct chat widget
        -  if (o.directChat.enable) {
        -    $(document).on('click', o.directChat.contactToggleSelector, function () {
        -      var box = $(this).parents('.direct-chat').first();
        -      box.toggleClass('direct-chat-contacts-open');
        -    });
        -  }
        -
        -  /*
        -   * INITIALIZE BUTTON TOGGLE
        -   * ------------------------
        -   */
        -  $('.btn-group[data-toggle="btn-toggle"]').each(function () {
        -    var group = $(this);
        -    $(this).find(".btn").on('click', function (e) {
        -      group.find(".btn.active").removeClass("active");
        -      $(this).addClass("active");
        -      e.preventDefault();
        -    });
        -
        -  });
        -});
        -
        -/* ----------------------------------
        - * - Initialize the AdminLTE Object -
        - * ----------------------------------
        - * All AdminLTE functions are implemented below.
        - */
        -function _init() {
        -  'use strict';
        -  /* Layout
        -   * ======
        -   * Fixes the layout height in case min-height fails.
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.layout.activate()
        -   *        $.AdminLTE.layout.fix()
        -   *        $.AdminLTE.layout.fixSidebar()
        -   */
        -  $.AdminLTE.layout = {
        -    activate: function () {
        -      var _this = this;
        -      _this.fix();
        -      _this.fixSidebar();
        -      $(window, ".wrapper").resize(function () {
        -        _this.fix();
        -        _this.fixSidebar();
        -      });
        -    },
        -    fix: function () {
        -      //Get window height and the wrapper height
        -      var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();
        -      var window_height = $(window).height();
        -      var sidebar_height = $(".sidebar").height();
        -      //Set the min-height of the content and sidebar based on the
        -      //the height of the document.
        -      if ($("body").hasClass("fixed")) {
        -        $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight());
        -      } else {
        -        var postSetWidth;
        -        if (window_height >= sidebar_height) {
        -          $(".content-wrapper, .right-side").css('min-height', window_height - neg);
        -          postSetWidth = window_height - neg;
        -        } else {
        -          $(".content-wrapper, .right-side").css('min-height', sidebar_height);
        -          postSetWidth = sidebar_height;
        -        }
        -
        -        //Fix for the control sidebar height
        -        var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
        -        if (typeof controlSidebar !== "undefined") {
        -          if (controlSidebar.height() > postSetWidth)
        -            $(".content-wrapper, .right-side").css('min-height', controlSidebar.height());
        -        }
        -
        -      }
        -    },
        -    fixSidebar: function () {
        -      //Make sure the body tag has the .fixed class
        -      if (!$("body").hasClass("fixed")) {
        -        if (typeof $.fn.slimScroll != 'undefined') {
        -          $(".sidebar").slimScroll({destroy: true}).height("auto");
        -        }
        -        return;
        -      } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
        -        window.console.error("Error: the fixed layout requires the slimscroll plugin!");
        -      }
        -      //Enable slimscroll for fixed layout
        -      if ($.AdminLTE.options.sidebarSlimScroll) {
        -        if (typeof $.fn.slimScroll != 'undefined') {
        -          //Destroy if it exists
        -          $(".sidebar").slimScroll({destroy: true}).height("auto");
        -          //Add slimscroll
        -          $(".sidebar").slimscroll({
        -            height: ($(window).height() - $(".main-header").height()) + "px",
        -            color: "rgba(0,0,0,0.2)",
        -            size: "3px"
        -          });
        -        }
        -      }
        -    }
        -  };
        -
        -  /* PushMenu()
        -   * ==========
        -   * Adds the push menu functionality to the sidebar.
        -   *
        -   * @type Function
        -   * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
        -   */
        -  $.AdminLTE.pushMenu = {
        -    activate: function (toggleBtn) {
        -      //Get the screen sizes
        -      var screenSizes = $.AdminLTE.options.screenSizes;
        -
        -      //Enable sidebar toggle
        -      $(toggleBtn).on('click', function (e) {
        -        e.preventDefault();
        -
        -        //Enable sidebar push menu
        -        if ($(window).width() > (screenSizes.sm - 1)) {
        -          if ($("body").hasClass('sidebar-collapse')) {
        -            $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu');
        -          } else {
        -            $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu');
        -          }
        -        }
        -        //Handle sidebar push menu for small screens
        -        else {
        -          if ($("body").hasClass('sidebar-open')) {
        -            $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');
        -          } else {
        -            $("body").addClass('sidebar-open').trigger('expanded.pushMenu');
        -          }
        -        }
        -      });
        -
        -      $(".content-wrapper").click(function () {
        -        //Enable hide menu when clicking on the content-wrapper on small screens
        -        if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) {
        -          $("body").removeClass('sidebar-open');
        -        }
        -      });
        -
        -      //Enable expand on hover for sidebar mini
        -      if ($.AdminLTE.options.sidebarExpandOnHover
        -              || ($('body').hasClass('fixed')
        -                      && $('body').hasClass('sidebar-mini'))) {
        -        this.expandOnHover();
        -      }
        -    },
        -    expandOnHover: function () {
        -      var _this = this;
        -      var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
        -      //Expand sidebar on hover
        -      $('.main-sidebar').hover(function () {
        -        if ($('body').hasClass('sidebar-mini')
        -                && $("body").hasClass('sidebar-collapse')
        -                && $(window).width() > screenWidth) {
        -          _this.expand();
        -        }
        -      }, function () {
        -        if ($('body').hasClass('sidebar-mini')
        -                && $('body').hasClass('sidebar-expanded-on-hover')
        -                && $(window).width() > screenWidth) {
        -          _this.collapse();
        -        }
        -      });
        -    },
        -    expand: function () {
        -      $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
        -    },
        -    collapse: function () {
        -      if ($('body').hasClass('sidebar-expanded-on-hover')) {
        -        $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
        -      }
        -    }
        -  };
        -
        -  /* Tree()
        -   * ======
        -   * Converts the sidebar into a multilevel
        -   * tree view menu.
        -   *
        -   * @type Function
        -   * @Usage: $.AdminLTE.tree('.sidebar')
        -   */
        -  $.AdminLTE.tree = function (menu) {
        -    var _this = this;
        -    var animationSpeed = $.AdminLTE.options.animationSpeed;
        -    $(document).on('click', menu + ' li a', function (e) {
        -      //Get the clicked link and the next element
        -      var $this = $(this);
        -      var checkElement = $this.next();
        -
        -      //Check if the next element is a menu and is visible
        -      if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {
        -        //Close the menu
        -        checkElement.slideUp(animationSpeed, function () {
        -          checkElement.removeClass('menu-open');
        -          //Fix the layout in case the sidebar stretches over the height of the window
        -          //_this.layout.fix();
        -        });
        -        checkElement.parent("li").removeClass("active");
        -      }
        -      //If the menu is not visible
        -      else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
        -        //Get the parent menu
        -        var parent = $this.parents('ul').first();
        -        //Close all open menus within the parent
        -        var ul = parent.find('ul:visible').slideUp(animationSpeed);
        -        //Remove the menu-open class from the parent
        -        ul.removeClass('menu-open');
        -        //Get the parent li
        -        var parent_li = $this.parent("li");
        -
        -        //Open the target menu and add the menu-open class
        -        checkElement.slideDown(animationSpeed, function () {
        -          //Add the class active to the parent li
        -          checkElement.addClass('menu-open');
        -          parent.find('li.active').removeClass('active');
        -          parent_li.addClass('active');
        -          //Fix the layout in case the sidebar stretches over the height of the window
        -          _this.layout.fix();
        -        });
        -      }
        -      //if this isn't a link, prevent the page from being redirected
        -      if (checkElement.is('.treeview-menu')) {
        -        e.preventDefault();
        -      }
        -    });
        -  };
        -
        -  /* ControlSidebar
        -   * ==============
        -   * Adds functionality to the right sidebar
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.controlSidebar.activate(options)
        -   */
        -  $.AdminLTE.controlSidebar = {
        -    //instantiate the object
        -    activate: function () {
        -      //Get the object
        -      var _this = this;
        -      //Update options
        -      var o = $.AdminLTE.options.controlSidebarOptions;
        -      //Get the sidebar
        -      var sidebar = $(o.selector);
        -      //The toggle button
        -      var btn = $(o.toggleBtnSelector);
        -
        -      //Listen to the click event
        -      btn.on('click', function (e) {
        -        e.preventDefault();
        -        //If the sidebar is not open
        -        if (!sidebar.hasClass('control-sidebar-open')
        -                && !$('body').hasClass('control-sidebar-open')) {
        -          //Open the sidebar
        -          _this.open(sidebar, o.slide);
        -        } else {
        -          _this.close(sidebar, o.slide);
        -        }
        -      });
        -
        -      //If the body has a boxed layout, fix the sidebar bg position
        -      var bg = $(".control-sidebar-bg");
        -      _this._fix(bg);
        -
        -      //If the body has a fixed layout, make the control sidebar fixed
        -      if ($('body').hasClass('fixed')) {
        -        _this._fixForFixed(sidebar);
        -      } else {
        -        //If the content height is less than the sidebar's height, force max height
        -        if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
        -          _this._fixForContent(sidebar);
        -        }
        -      }
        -    },
        -    //Open the control sidebar
        -    open: function (sidebar, slide) {
        -      //Slide over content
        -      if (slide) {
        -        sidebar.addClass('control-sidebar-open');
        -      } else {
        -        //Push the content by adding the open class to the body instead
        -        //of the sidebar itself
        -        $('body').addClass('control-sidebar-open');
        -      }
        -    },
        -    //Close the control sidebar
        -    close: function (sidebar, slide) {
        -      if (slide) {
        -        sidebar.removeClass('control-sidebar-open');
        -      } else {
        -        $('body').removeClass('control-sidebar-open');
        -      }
        -    },
        -    _fix: function (sidebar) {
        -      var _this = this;
        -      if ($("body").hasClass('layout-boxed')) {
        -        sidebar.css('position', 'absolute');
        -        sidebar.height($(".wrapper").height());
        -        $(window).resize(function () {
        -          _this._fix(sidebar);
        -        });
        -      } else {
        -        sidebar.css({
        -          'position': 'fixed',
        -          'height': 'auto'
        -        });
        -      }
        -    },
        -    _fixForFixed: function (sidebar) {
        -      sidebar.css({
        -        'position': 'fixed',
        -        'max-height': '100%',
        -        'overflow': 'auto',
        -        'padding-bottom': '50px'
        -      });
        -    },
        -    _fixForContent: function (sidebar) {
        -      $(".content-wrapper, .right-side").css('min-height', sidebar.height());
        -    }
        -  };
        -
        -  /* BoxWidget
        -   * =========
        -   * BoxWidget is a plugin to handle collapsing and
        -   * removing boxes from the screen.
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.boxWidget.activate()
        -   *        Set all your options in the main $.AdminLTE.options object
        -   */
        -  $.AdminLTE.boxWidget = {
        -    selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
        -    icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
        -    animationSpeed: $.AdminLTE.options.animationSpeed,
        -    activate: function (_box) {
        -      var _this = this;
        -      if (!_box) {
        -        _box = document; // activate all boxes per default
        -      }
        -      //Listen for collapse event triggers
        -      $(_box).on('click', _this.selectors.collapse, function (e) {
        -        e.preventDefault();
        -        _this.collapse($(this));
        -      });
        -
        -      //Listen for remove event triggers
        -      $(_box).on('click', _this.selectors.remove, function (e) {
        -        e.preventDefault();
        -        _this.remove($(this));
        -      });
        -    },
        -    collapse: function (element) {
        -      var _this = this;
        -      //Find the box parent
        -      var box = element.parents(".box").first();
        -      //Find the body and the footer
        -      var box_content = box.find("> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer");
        -      if (!box.hasClass("collapsed-box")) {
        -        //Convert minus into plus
        -        element.children(":first")
        -                .removeClass(_this.icons.collapse)
        -                .addClass(_this.icons.open);
        -        //Hide the content
        -        box_content.slideUp(_this.animationSpeed, function () {
        -          box.addClass("collapsed-box");
        -        });
        -      } else {
        -        //Convert plus into minus
        -        element.children(":first")
        -                .removeClass(_this.icons.open)
        -                .addClass(_this.icons.collapse);
        -        //Show the content
        -        box_content.slideDown(_this.animationSpeed, function () {
        -          box.removeClass("collapsed-box");
        -        });
        -      }
        -    },
        -    remove: function (element) {
        -      //Find the box parent
        -      var box = element.parents(".box").first();
        -      box.slideUp(this.animationSpeed);
        -    }
        -  };
        -}
        -
        -/* ------------------
        - * - Custom Plugins -
        - * ------------------
        - * All custom plugins are defined below.
        - */
        -
        -/*
        - * BOX REFRESH BUTTON
        - * ------------------
        - * This is a custom plugin to use with the component BOX. It allows you to add
        - * a refresh button to the box. It converts the box's state to a loading state.
        - *
        - * @type plugin
        - * @usage $("#box-widget").boxRefresh( options );
        - */
        -(function ($) {
        -
        -  "use strict";
        -
        -  $.fn.boxRefresh = function (options) {
        -
        -    // Render options
        -    var settings = $.extend({
        -      //Refresh button selector
        -      trigger: ".refresh-btn",
        -      //File source to be loaded (e.g: ajax/src.php)
        -      source: "",
        -      //Callbacks
        -      onLoadStart: function (box) {
        -        return box;
        -      }, //Right after the button has been clicked
        -      onLoadDone: function (box) {
        -        return box;
        -      } //When the source has been loaded
        -
        -    }, options);
        -
        -    //The overlay
        -    var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
        -
        -    return this.each(function () {
        -      //if a source is specified
        -      if (settings.source === "") {
        -        if (window.console) {
        -          window.console.log("Please specify a source first - boxRefresh()");
        -        }
        -        return;
        -      }
        -      //the box
        -      var box = $(this);
        -      //the button
        -      var rBtn = box.find(settings.trigger).first();
        -
        -      //On trigger click
        -      rBtn.on('click', function (e) {
        -        e.preventDefault();
        -        //Add loading overlay
        -        start(box);
        -
        -        //Perform ajax call
        -        box.find(".box-body").load(settings.source, function () {
        -          done(box);
        -        });
        -      });
        -    });
        -
        -    function start(box) {
        -      //Add overlay and loading img
        -      box.append(overlay);
        -
        -      settings.onLoadStart.call(box);
        -    }
        -
        -    function done(box) {
        -      //Remove overlay and loading img
        -      box.find(overlay).remove();
        -
        -      settings.onLoadDone.call(box);
        -    }
        -
        -  };
        -
        -})(jQuery);
        -
        -/*
        - * EXPLICIT BOX ACTIVATION
        - * -----------------------
        - * This is a custom plugin to use with the component BOX. It allows you to activate
        - * a box inserted in the DOM after the app.js was loaded.
        - *
        - * @type plugin
        - * @usage $("#box-widget").activateBox();
        - */
        -(function ($) {
        -
        -  'use strict';
        -
        -  $.fn.activateBox = function () {
        -    $.AdminLTE.boxWidget.activate(this);
        -  };
        -
        -})(jQuery);
        -
        -/*
        - * TODO LIST CUSTOM PLUGIN
        - * -----------------------
        - * This plugin depends on iCheck plugin for checkbox and radio inputs
        - *
        - * @type plugin
        - * @usage $("#todo-widget").todolist( options );
        - */
        -(function ($) {
        -
        -  'use strict';
        -
        -  $.fn.todolist = function (options) {
        -    // Render options
        -    var settings = $.extend({
        -      //When the user checks the input
        -      onCheck: function (ele) {
        -        return ele;
        -      },
        -      //When the user unchecks the input
        -      onUncheck: function (ele) {
        -        return ele;
        -      }
        -    }, options);
        -
        -    return this.each(function () {
        -
        -      if (typeof $.fn.iCheck != 'undefined') {
        -        $('input', this).on('ifChecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onCheck.call(ele);
        -        });
        -
        -        $('input', this).on('ifUnchecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onUncheck.call(ele);
        -        });
        -      } else {
        -        $('input', this).on('change', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          if ($('input', ele).is(":checked")) {
        -            settings.onCheck.call(ele);
        -          } else {
        -            settings.onUncheck.call(ele);
        -          }
        -        });
        -      }
        -    });
        -  };
        -}(jQuery));
        -
        -//-------------
        -//- PIE CHART -
        -//-------------
        -// Get context with jQuery - using jQuery's .get() method.
        -
        -
        -
        -
        -//# sourceMappingURL=all.js.map
        diff --git a/public/assets/js/all.js.map b/public/assets/js/all.js.map
        deleted file mode 100644
        index 4fd717d172..0000000000
        --- a/public/assets/js/all.js.map
        +++ /dev/null
        @@ -1 +0,0 @@
        -{"version":3,"sources":["jQuery-2.1.4.min.js","jquery-ui.js","jquery.ui.widget.js","jquery.iframe-transport.js","jquery.fileupload.js","bootstrap.js","fastclick.js","jquery.slimscroll.js","select2.full.min.js","bootstrap-colorpicker.js","bootstrap-table.js","bootstrap-datepicker.js","select2.js","icheck.js","ekko-lightbox.js","snipeit.js","app.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxugBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3zEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACz0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1eA;AACA;AACA;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACr7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACloFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvoDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3xKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"all.js","sourcesContent":["/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */\n!function(a,b){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error(\"jQuery requires a window with a document\");return b(a)}:b(a)}(\"undefined\"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m=\"2.1.4\",n=function(a,b){return new n.fn.init(a,b)},o=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,p=/^-ms-/,q=/-([\\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:\"\",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for(\"boolean\"==typeof g&&(j=g,g=arguments[h]||{},h++),\"object\"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:\"jQuery\"+(m+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return\"function\"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return\"object\"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,\"isPrototypeOf\")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?h[i.call(a)]||\"object\":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf(\"use strict\")?(b=l.createElement(\"script\"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,\"ms-\").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?\"\":(a+\"\").replace(o,\"\")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,\"string\"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return\"string\"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(a,b){h[\"[object \"+b+\"]\"]=b.toLowerCase()});function s(a){var b=\"length\"in a&&a.length,c=n.type(a);return\"function\"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===c||0===b||\"number\"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=\"sizzle\"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",L=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",M=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",N=M.replace(\"w\",\"w#\"),O=\"\\\\[\"+L+\"*(\"+M+\")(?:\"+L+\"*([*^$|!~]?=)\"+L+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+N+\"))|)\"+L+\"*\\\\]\",P=\":(\"+M+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+O+\")*)|.*)\\\\)|)\",Q=new RegExp(L+\"+\",\"g\"),R=new RegExp(\"^\"+L+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+L+\"+$\",\"g\"),S=new RegExp(\"^\"+L+\"*,\"+L+\"*\"),T=new RegExp(\"^\"+L+\"*([>+~]|\"+L+\")\"+L+\"*\"),U=new RegExp(\"=\"+L+\"*([^\\\\]'\\\"]*?)\"+L+\"*\\\\]\",\"g\"),V=new RegExp(P),W=new RegExp(\"^\"+N+\"$\"),X={ID:new RegExp(\"^#(\"+M+\")\"),CLASS:new RegExp(\"^\\\\.(\"+M+\")\"),TAG:new RegExp(\"^(\"+M.replace(\"w\",\"w*\")+\")\"),ATTR:new RegExp(\"^\"+O),PSEUDO:new RegExp(\"^\"+P),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+L+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+L+\"*(?:([+-]|)\"+L+\"*(\\\\d+)|))\"+L+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+K+\")$\",\"i\"),needsContext:new RegExp(\"^\"+L+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+L+\"*((?:-\\\\d)?\\\\d*)\"+L+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\\d$/i,$=/^[^{]+\\{\\s*\\[native \\w/,_=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,aa=/[+~]/,ba=/'|\\\\/g,ca=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+L+\"?|(\"+L+\")|.)\",\"ig\"),da=function(a,b,c){var d=\"0x\"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,\"string\"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&\"object\"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute(\"id\"))?s=r.replace(ba,\"\\\\$&\"):b.setAttribute(\"id\",s),s=\"[id='\"+s+\"'] \",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(\",\")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute(\"id\")}}}return i(a.replace(R,\"$1\"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+\" \")>d.cacheLength&&delete b[a.shift()],b[c+\" \"]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement(\"div\");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split(\"|\"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return\"input\"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return(\"input\"===c||\"button\"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&\"undefined\"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?\"HTML\"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener(\"unload\",ea,!1):e.attachEvent&&e.attachEvent(\"onunload\",ea)),p=!f(g),c.attributes=ja(function(a){return a.className=\"i\",!a.getAttribute(\"className\")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment(\"\")),!a.getElementsByTagName(\"*\").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(\"undefined\"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute(\"id\")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c=\"undefined\"!=typeof a.getAttributeNode&&a.getAttributeNode(\"id\");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return\"undefined\"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if(\"*\"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=\"<a id='\"+u+\"'></a><select id='\"+u+\"-\\f]' msallowcapture=''><option selected=''></option></select>\",a.querySelectorAll(\"[msallowcapture^='']\").length&&q.push(\"[*^$]=\"+L+\"*(?:''|\\\"\\\")\"),a.querySelectorAll(\"[selected]\").length||q.push(\"\\\\[\"+L+\"*(?:value|\"+K+\")\"),a.querySelectorAll(\"[id~=\"+u+\"-]\").length||q.push(\"~=\"),a.querySelectorAll(\":checked\").length||q.push(\":checked\"),a.querySelectorAll(\"a#\"+u+\"+*\").length||q.push(\".#.+[+~]\")}),ja(function(a){var b=g.createElement(\"input\");b.setAttribute(\"type\",\"hidden\"),a.appendChild(b).setAttribute(\"name\",\"D\"),a.querySelectorAll(\"[name=d]\").length&&q.push(\"name\"+L+\"*[*^$|!~]?=\"),a.querySelectorAll(\":enabled\").length||q.push(\":enabled\",\":disabled\"),a.querySelectorAll(\"*,:x\"),q.push(\",.*:\")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,\"div\"),s.call(a,\"[s!='']:x\"),r.push(\"!=\",P)}),q=q.length&&new RegExp(q.join(\"|\")),r=r.length&&new RegExp(r.join(\"|\")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,\"='$1']\"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c=\"\",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if(\"string\"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||\"\").replace(ca,da),\"~=\"===a[2]&&(a[3]=\" \"+a[3]+\" \"),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),\"nth\"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*(\"even\"===a[3]||\"odd\"===a[3])),a[5]=+(a[7]+a[8]||\"odd\"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||\"\":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(\")\",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return\"*\"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+\" \"];return b||(b=new RegExp(\"(^|\"+L+\")\"+a+\"(\"+L+\"|$)\"))&&y(a,function(a){return b.test(\"string\"==typeof a.className&&a.className||\"undefined\"!=typeof a.getAttribute&&a.getAttribute(\"class\")||\"\")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?\"!=\"===b:b?(e+=\"\",\"=\"===b?e===c:\"!=\"===b?e!==c:\"^=\"===b?c&&0===e.indexOf(c):\"*=\"===b?c&&e.indexOf(c)>-1:\"$=\"===b?c&&e.slice(-c.length)===c:\"~=\"===b?(\" \"+e.replace(Q,\" \")+\" \").indexOf(c)>-1:\"|=\"===b?e===c||e.slice(0,c.length+1)===c+\"-\":!1):!0}},CHILD:function(a,b,c,d,e){var f=\"nth\"!==a.slice(0,3),g=\"last\"!==a.slice(-4),h=\"of-type\"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?\"nextSibling\":\"previousSibling\",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p=\"only\"===a&&!o&&\"nextSibling\"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error(\"unsupported pseudo: \"+a);return e[u]?e(b):e.length>1?(c=[a,a,\"\",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,\"$1\"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||\"\")||ga.error(\"unsupported lang: \"+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute(\"xml:lang\")||b.getAttribute(\"lang\"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+\"-\");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&!!a.checked||\"option\"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&\"button\"===a.type||\"button\"===b},text:function(a){var b;return\"input\"===a.nodeName.toLowerCase()&&\"text\"===a.type&&(null==(b=a.getAttribute(\"type\"))||\"text\"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+\" \"];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R,\" \")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d=\"\";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&\"parentNode\"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||\"*\",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[\" \"],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:\" \"===a[i-2].type?\"*\":\"\"})).replace(R,\"$1\"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q=\"0\",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG(\"*\",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+\" \"];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n=\"function\"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&\"ID\"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split(\"\").sort(B).join(\"\")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement(\"div\"))}),ja(function(a){return a.innerHTML=\"<a href='#'></a>\",\"#\"===a.firstChild.getAttribute(\"href\")})||ka(\"type|href|height|width\",function(a,b,c){return c?void 0:a.getAttribute(b,\"type\"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=\"<input/>\",a.firstChild.setAttribute(\"value\",\"\"),\"\"===a.firstChild.getAttribute(\"value\")})||ka(\"value\",function(a,b,c){return c||\"input\"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute(\"disabled\")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[\":\"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,w=/^.[^:#\\[\\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if(\"string\"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=\":not(\"+a+\")\"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if(\"string\"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+\" \"+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,\"string\"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if(\"string\"==typeof a){if(c=\"<\"===a[0]&&\">\"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?\"undefined\"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||\"string\"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?\"string\"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return n.dir(a,\"parentNode\",c)},next:function(a){return D(a,\"nextSibling\")},prev:function(a){return D(a,\"previousSibling\")},nextAll:function(a){return n.dir(a,\"nextSibling\")},prevAll:function(a){return n.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return n.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return n.dir(a,\"previousSibling\",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return\"Until\"!==a.slice(-5)&&(d=c),d&&\"string\"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a=\"string\"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);\"function\"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&\"string\"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[[\"resolve\",\"done\",n.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",n.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",n.Callbacks(\"memory\")]],c=\"pending\",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+\"With\"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+\"With\"](this===e?d:this,arguments),this},e[f[0]+\"With\"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler(\"ready\"),n(l).off(\"ready\"))))}});function I(){l.removeEventListener(\"DOMContentLoaded\",I,!1),a.removeEventListener(\"load\",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),\"complete\"===l.readyState?setTimeout(n.ready):(l.addEventListener(\"DOMContentLoaded\",I,!1),a.addEventListener(\"load\",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if(\"object\"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if(\"string\"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&\"string\"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d=\"data-\"+b.replace(O,\"-$1\").toLowerCase(),c=a.getAttribute(d),\"string\"==typeof c){try{c=\"true\"===c?!0:\"false\"===c?!1:\"null\"===c?null:+c+\"\"===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){\nreturn M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,\"hasDataAttrs\"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf(\"data-\")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,\"hasDataAttrs\",!0)}return e}return\"object\"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf(\"-\")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||\"fx\")+\"queue\",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||\"fx\";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};\"inprogress\"===e&&(e=c.shift(),d--),e&&(\"fx\"===b&&c.unshift(\"inprogress\"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+\"queueHooks\";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks(\"once memory\").add(function(){L.remove(a,[b+\"queue\",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return\"string\"!=typeof a&&(b=a,a=\"fx\",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),\"fx\"===a&&\"inprogress\"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};\"string\"!=typeof a&&(b=a,a=void 0),a=a||\"fx\";while(g--)c=L.get(f[g],a+\"queueHooks\"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,R=[\"Top\",\"Right\",\"Bottom\",\"Left\"],S=function(a,b){return a=b||a,\"none\"===n.css(a,\"display\")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement(\"div\")),c=l.createElement(\"input\");c.setAttribute(\"type\",\"radio\"),c.setAttribute(\"checked\",\"checked\"),c.setAttribute(\"name\",\"t\"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML=\"<textarea>x</textarea>\",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U=\"undefined\";k.focusinBubbles=\"onfocusin\"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(\".\")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp(\"(^|\\\\.)\"+p.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&(\"**\"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,\"events\"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,\"type\")?b.type:b,r=j.call(b,\"namespace\")?b.namespace.split(\".\"):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(\".\")>=0&&(r=q.split(\".\"),q=r.shift(),r.sort()),k=q.indexOf(\":\")<0&&\"on\"+q,b=b[n.expando]?b:new n.Event(q,\"object\"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join(\".\"),b.namespace_re=b.namespace?new RegExp(\"(^|\\\\.)\"+r.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,\"events\")||{})[b.type]&&L.get(g,\"handle\"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,\"events\")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||\"click\"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||\"click\"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+\" \",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:\"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:\"focusin\"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:\"focusout\"},click:{trigger:function(){return\"checkbox\"===this.type&&this.click&&n.nodeName(this,\"input\")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,\"a\")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if(\"object\"==typeof a){\"string\"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&(\"string\"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+\".\"+d.namespace:d.origType,d.selector,d.handler),this;if(\"object\"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||\"function\"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,ba=/<([\\w:]+)/,ca=/<|&#?\\w+;/,da=/<(?:script|style|link)/i,ea=/checked\\s*(?:[^=]|=\\s*.checked.)/i,fa=/^$|\\/(?:java|ecma)script/i,ga=/^true\\/(.*)/,ha=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,ia={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,\"table\")&&n.nodeName(11!==b.nodeType?b:b.firstChild,\"tr\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function ka(a){return a.type=(null!==a.getAttribute(\"type\"))+\"/\"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute(\"type\"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],\"globalEval\",!b||L.get(b[c],\"globalEval\"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||\"*\"):a.querySelectorAll?a.querySelectorAll(b||\"*\"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();\"input\"===c&&T.test(a.type)?b.checked=a.checked:(\"input\"===c||\"textarea\"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,\"script\"),g.length>0&&ma(g,!i&&oa(a,\"script\")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if(\"object\"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement(\"div\")),g=(ba.exec(e)||[\"\",\"\"])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,\"<$1></$2>\")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=\"\"}else l.push(b.createTextNode(e));k.textContent=\"\",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),\"script\"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||\"\")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,\"script\")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent=\"\");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if(\"string\"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(aa,\"<$1></$2>\");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&\"string\"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,\"script\"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,\"script\"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||\"\")&&!L.access(h,\"globalEval\")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,\"\")))}return this}}),n.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],\"display\");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),\"none\"!==c&&c||(qa=(qa||n(\"<iframe frameborder='0' width='0' height='0'/>\")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp(\"^(\"+Q+\")(?!px)[a-z%]+$\",\"i\"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(\"\"!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+\"\":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement(\"div\"),f=l.createElement(\"div\");if(f.style){f.style.backgroundClip=\"content-box\",f.cloneNode(!0).style.backgroundClip=\"\",k.clearCloneStyle=\"content-box\"===f.style.backgroundClip,e.style.cssText=\"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute\",e.appendChild(f);function g(){f.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute\",f.innerHTML=\"\",d.appendChild(e);var g=a.getComputedStyle(f,null);b=\"1%\"!==g.top,c=\"4px\"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement(\"div\"));return c.style.cssText=f.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0\",c.style.marginRight=c.style.width=\"0\",f.style.width=\"1px\",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp(\"^(\"+Q+\")(.*)$\",\"i\"),Ba=new RegExp(\"^([+-])=(\"+Q+\")\",\"i\"),Ca={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Da={letterSpacing:\"0\",fontWeight:\"400\"},Ea=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||\"px\"):b}function Ha(a,b,c,d,e){for(var f=c===(d?\"border\":\"content\")?4:\"width\"===b?1:0,g=0;4>f;f+=2)\"margin\"===c&&(g+=n.css(a,c+R[f],!0,e)),d?(\"content\"===c&&(g-=n.css(a,\"padding\"+R[f],!0,e)),\"margin\"!==c&&(g-=n.css(a,\"border\"+R[f]+\"Width\",!0,e))):(g+=n.css(a,\"padding\"+R[f],!0,e),\"padding\"!==c&&(g+=n.css(a,\"border\"+R[f]+\"Width\",!0,e)));return g}function Ia(a,b,c){var d=!0,e=\"width\"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g=\"border-box\"===n.css(a,\"boxSizing\",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?\"border\":\"content\"),d,f)+\"px\"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,\"olddisplay\"),c=d.style.display,b?(f[g]||\"none\"!==c||(d.style.display=\"\"),\"\"===d.style.display&&S(d)&&(f[g]=L.access(d,\"olddisplay\",ta(d.nodeName)))):(e=S(d),\"none\"===c&&e||L.set(d,\"olddisplay\",e?c:n.css(d,\"display\"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&\"none\"!==d.style.display&&\"\"!==d.style.display||(d.style.display=b?f[g]||\"\":\"none\"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,\"opacity\");return\"\"===c?\"1\":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":\"cssFloat\"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&\"get\"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,\"string\"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f=\"number\"),null!=c&&c===c&&(\"number\"!==f||n.cssNumber[h]||(c+=\"px\"),k.clearCloneStyle||\"\"!==c||0!==b.indexOf(\"background\")||(i[b]=\"inherit\"),g&&\"set\"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&\"get\"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),\"normal\"===e&&b in Da&&(e=Da[b]),\"\"===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each([\"height\",\"width\"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,\"display\"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,\"border-box\"===n.css(a,\"boxSizing\",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:\"inline-block\"},xa,[a,\"marginRight\"]):void 0}),n.each({margin:\"\",padding:\"\",border:\"Width\"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f=\"string\"==typeof c?c.split(\" \"):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return\"boolean\"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||\"swing\",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?\"\":\"px\")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,\"\"),b&&\"auto\"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp(\"^(?:([+-])=|)(\"+Q+\")([a-z%]*)$\",\"i\"),Pa=/queueHooks$/,Qa=[Va],Ra={\"*\":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?\"\":\"px\"),g=(n.cssNumber[a]||\"px\"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||\".5\",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e[\"margin\"+c]=e[\"padding\"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra[\"*\"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,\"fxshow\");c.queue||(h=n._queueHooks(a,\"fx\"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,\"fx\").length||h.empty.fire()})})),1===a.nodeType&&(\"height\"in b||\"width\"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,\"display\"),k=\"none\"===j?L.get(a,\"olddisplay\")||ta(a.nodeName):j,\"inline\"===k&&\"none\"===n.css(a,\"float\")&&(o.display=\"inline-block\")),c.overflow&&(o.overflow=\"hidden\",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||\"toggle\"===e,e===(p?\"hide\":\"show\")){if(\"show\"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))\"inline\"===(\"none\"===j?ta(a.nodeName):j)&&(o.display=j);else{q?\"hidden\"in q&&(p=q.hidden):q=L.access(a,\"fxshow\",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,\"fxshow\");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start=\"width\"===d||\"height\"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&\"expand\"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=[\"*\"]):a=a.split(\" \");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&\"object\"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:\"number\"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue=\"fx\"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,\"finish\"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return\"string\"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||\"fx\",[]),this.each(function(){var b=!0,e=null!=a&&a+\"queueHooks\",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||\"fx\"),this.each(function(){var b,c=L.get(this),d=c[a+\"queue\"],e=c[a+\"queueHooks\"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each([\"toggle\",\"show\",\"hide\"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||\"boolean\"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta(\"show\"),slideUp:Ta(\"hide\"),slideToggle:Ta(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||\"fx\",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement(\"input\"),b=l.createElement(\"select\"),c=b.appendChild(l.createElement(\"option\"));a.type=\"checkbox\",k.checkOn=\"\"!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement(\"input\"),a.value=\"t\",a.type=\"radio\",k.radioValue=\"t\"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),\nvoid 0===c?d&&\"get\"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&\"set\"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+\"\"),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&\"radio\"===b&&n.nodeName(a,\"input\")){var c=a.value;return a.setAttribute(\"type\",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&\"set\"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&\"get\"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute(\"tabindex\")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\\t\\r\\n\\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=\"string\"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||\"\").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ab,\" \"):\" \")){f=0;while(e=b[f++])d.indexOf(\" \"+e+\" \")<0&&(d+=e+\" \");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||\"string\"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||\"\").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ab,\" \"):\"\")){f=0;while(e=b[f++])while(d.indexOf(\" \"+e+\" \")>=0)d=d.replace(\" \"+e+\" \",\" \");g=a?n.trim(d):\"\",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return\"boolean\"==typeof b&&\"string\"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if(\"string\"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||\"boolean\"===c)&&(this.className&&L.set(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":L.get(this,\"__className__\")||\"\")})},hasClass:function(a){for(var b=\" \"+a+\" \",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(\" \"+this[c].className+\" \").replace(ab,\" \").indexOf(b)>=0)return!0;return!1}});var bb=/\\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e=\"\":\"number\"==typeof e?e+=\"\":n.isArray(e)&&(e=n.map(e,function(a){return null==a?\"\":a+\"\"})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&\"set\"in b&&void 0!==b.set(this,e,\"value\")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&\"get\"in b&&void 0!==(c=b.get(e,\"value\"))?c:(c=e.value,\"string\"==typeof c?c.replace(bb,\"\"):null==c?\"\":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,\"value\");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f=\"select-one\"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute(\"disabled\"))||c.parentNode.disabled&&n.nodeName(c.parentNode,\"optgroup\"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each([\"radio\",\"checkbox\"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute(\"value\")?\"on\":a.value})}),n.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,\"**\"):this.off(b,a||\"**\",c)}});var cb=n.now(),db=/\\?/;n.parseJSON=function(a){return JSON.parse(a+\"\")},n.parseXML=function(a){var b,c;if(!a||\"string\"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,\"text/xml\")}catch(d){b=void 0}return(!b||b.getElementsByTagName(\"parsererror\").length)&&n.error(\"Invalid XML: \"+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\\/\\//,kb=/^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,lb={},mb={},nb=\"*/\".concat(\"*\"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){\"string\"!=typeof b&&(c=b,b=\"*\");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])\"+\"===d[0]?(d=d.slice(1)||\"*\",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return\"string\"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e[\"*\"]&&g(\"*\")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while(\"*\"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader(\"Content-Type\"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+\" \"+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if(\"*\"===f)f=i;else if(\"*\"!==i&&i!==f){if(g=j[i+\" \"+f]||j[\"* \"+f],!g)for(e in j)if(h=e.split(\" \"),h[1]===f&&(g=j[i+\" \"+h[0]]||j[\"* \"+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a[\"throws\"])b=g(b);else try{b=g(b)}catch(l){return{state:\"parsererror\",error:g?l:\"No conversion from \"+i+\" to \"+f}}}return{state:\"success\",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:\"GET\",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":nb,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":n.parseJSON,\"text xml\":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){\"object\"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks(\"once memory\"),q=k.statusCode||{},r={},s={},t=0,u=\"canceled\",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+\"\").replace(eb,\"\").replace(jb,pb[1]+\"//\"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||\"*\").toLowerCase().match(E)||[\"\"],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||(\"http:\"===h[1]?\"80\":\"443\"))===(pb[3]||(\"http:\"===pb[1]?\"80\":\"443\")))),k.data&&k.processData&&\"string\"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger(\"ajaxStart\"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?\"&\":\"?\")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,\"$1_=\"+cb++):d+(db.test(d)?\"&\":\"?\")+\"_=\"+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader(\"If-Modified-Since\",n.lastModified[d]),n.etag[d]&&v.setRequestHeader(\"If-None-Match\",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader(\"Content-Type\",k.contentType),v.setRequestHeader(\"Accept\",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+(\"*\"!==k.dataTypes[0]?\", \"+nb+\"; q=0.01\":\"\"):k.accepts[\"*\"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u=\"abort\";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger(\"ajaxSend\",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort(\"timeout\")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,\"No Transport\");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||\"\",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader(\"Last-Modified\"),w&&(n.lastModified[d]=w),w=v.getResponseHeader(\"etag\"),w&&(n.etag[d]=w)),204===a||\"HEAD\"===k.type?x=\"nocontent\":304===a?x=\"notmodified\":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x=\"error\",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+\"\",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?\"ajaxSuccess\":\"ajaxError\",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger(\"ajaxComplete\",[v,k]),--n.active||n.event.trigger(\"ajaxStop\")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,\"json\")},getScript:function(a,b){return n.get(a,void 0,b,\"script\")}}),n.each([\"get\",\"post\"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,\"body\")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\\[\\]$/,xb=/\\r?\\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+\"[\"+(\"object\"==typeof e?b:\"\")+\"]\",e,c,d)});else if(c||\"object\"!==n.type(b))d(a,b);else for(e in b)Ab(a+\"[\"+e+\"]\",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?\"\":b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join(\"&\").replace(vb,\"+\")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,\"elements\");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(\":disabled\")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,\"\\r\\n\")}}):{name:b.name,value:c.replace(xb,\"\\r\\n\")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent(\"onunload\",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&\"withCredentials\"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c[\"X-Requested-With\"]||(c[\"X-Requested-With\"]=\"XMLHttpRequest\");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,\"abort\"===a?f.abort():\"error\"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,\"string\"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b(\"error\"),b=Cb[g]=b(\"abort\");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter(\"script\",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\")}),n.ajaxTransport(\"script\",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n(\"<script>\").prop({async:!0,charset:a.scriptCharset,src:a.url}).on(\"load error\",c=function(a){b.remove(),c=null,a&&e(\"error\"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\\?(?=&|$)|\\?\\?/;n.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var a=Fb.pop()||n.expando+\"_\"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?\"url\":\"string\"==typeof b.data&&!(b.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Gb.test(b.data)&&\"data\");return h||\"jsonp\"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,\"$1\"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?\"&\":\"?\")+b.jsonp+\"=\"+e),b.converters[\"script json\"]=function(){return g||n.error(e+\" was not called\"),g[0]},b.dataTypes[0]=\"json\",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),\"script\"):void 0}),n.parseHTML=function(a,b,c){if(!a||\"string\"!=typeof a)return null;\"boolean\"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if(\"string\"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(\" \");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&\"object\"==typeof b&&(e=\"POST\"),g.length>0&&n.ajax({url:a,type:e,dataType:\"html\",data:b}).done(function(a){f=arguments,g.html(d?n(\"<div>\").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,\"position\"),l=n(a),m={};\"static\"===k&&(a.style.position=\"relative\"),h=l.offset(),f=n.css(a,\"top\"),i=n.css(a,\"left\"),j=(\"absolute\"===k||\"fixed\"===k)&&(f+i).indexOf(\"auto\")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),\"using\"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return\"fixed\"===n.css(c,\"position\")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],\"html\")||(d=a.offset()),d.top+=n.css(a[0],\"borderTopWidth\",!0),d.left+=n.css(a[0],\"borderLeftWidth\",!0)),{top:b.top-d.top-n.css(c,\"marginTop\",!0),left:b.left-d.left-n.css(c,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,\"html\")&&\"static\"===n.css(a,\"position\"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(b,c){var d=\"pageYOffset\"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each([\"top\",\"left\"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+\"px\":c):void 0})}),n.each({Height:\"height\",Width:\"width\"},function(a,b){n.each({padding:\"inner\"+a,content:b,\"\":\"outer\"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||\"boolean\"!=typeof d),g=c||(d===!0||e===!0?\"margin\":\"border\");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement[\"client\"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body[\"scroll\"+a],e[\"scroll\"+a],b.body[\"offset\"+a],e[\"offset\"+a],e[\"client\"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});\n","/*! jQuery UI - v1.11.4 - 2015-03-11\n* http://jqueryui.com\n* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js\n* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */\n\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n/*!\n * jQuery UI Core 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n\n\n// $.ui might exist from components with no dependencies, e.g., $.ui.position\n$.ui = $.ui || {};\n\n$.extend( $.ui, {\n\tversion: \"1.11.4\",\n\n\tkeyCode: {\n\t\tBACKSPACE: 8,\n\t\tCOMMA: 188,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tLEFT: 37,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38\n\t}\n});\n\n// plugins\n$.fn.extend({\n\tscrollParent: function( includeHidden ) {\n\t\tvar position = this.css( \"position\" ),\n\t\t\texcludeStaticParent = position === \"absolute\",\n\t\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\t\tscrollParent = this.parents().filter( function() {\n\t\t\t\tvar parent = $( this );\n\t\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) + parent.css( \"overflow-x\" ) );\n\t\t\t}).eq( 0 );\n\n\t\treturn position === \"fixed\" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;\n\t},\n\n\tuniqueId: (function() {\n\t\tvar uuid = 0;\n\n\t\treturn function() {\n\t\t\treturn this.each(function() {\n\t\t\t\tif ( !this.id ) {\n\t\t\t\t\tthis.id = \"ui-id-\" + ( ++uuid );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t})(),\n\n\tremoveUniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( /^ui-id-\\d+$/.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar map, mapName, img,\n\t\tnodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap='#\" + mapName + \"']\" )[ 0 ];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?\n\t\t!element.disabled :\n\t\t\"a\" === nodeName ?\n\t\t\telement.href || isTabIndexNotNaN :\n\t\t\tisTabIndexNotNaN) &&\n\t\t// the element and all of its ancestors must be visible\n\t\tvisible( element );\n}\n\nfunction visible( element ) {\n\treturn $.expr.filters.visible( element ) &&\n\t\t!$( element ).parents().addBack().filter(function() {\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\n\t\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo(function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t}) :\n\t\t// support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n// support: jQuery <1.8\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t});\n\t\t};\n\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t});\n\t\t};\n\t});\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\n\t$.fn.removeData = (function( removeData ) {\n\t\treturn function( key ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\n\t\t\t} else {\n\t\t\t\treturn removeData.call( this );\n\t\t\t}\n\t\t};\n\t})( $.fn.removeData );\n}\n\n// deprecated\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n$.fn.extend({\n\tfocus: (function( orig ) {\n\t\treturn function( delay, fn ) {\n\t\t\treturn typeof delay === \"number\" ?\n\t\t\t\tthis.each(function() {\n\t\t\t\t\tvar elem = this;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay );\n\t\t\t\t}) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.focus ),\n\n\tdisableSelection: (function() {\n\t\tvar eventType = \"onselectstart\" in document.createElement( \"div\" ) ?\n\t\t\t\"selectstart\" :\n\t\t\t\"mousedown\";\n\n\t\treturn function() {\n\t\t\treturn this.bind( eventType + \".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t\t};\n\t})(),\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n});\n\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\n$.ui.plugin = {\n\tadd: function( module, option, set ) {\n\t\tvar i,\n\t\t\tproto = $.ui[ module ].prototype;\n\t\tfor ( i in set ) {\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t}\n\t},\n\tcall: function( instance, name, args, allowDisconnected ) {\n\t\tvar i,\n\t\t\tset = instance.plugins[ name ];\n\n\t\tif ( !set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n/*!\n * jQuery UI Widget 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n\n\nvar widget_uuid = 0,\n\twidget_slice = Array.prototype.slice;\n\n$.cleanData = (function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; (elem = elems[i]) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n})( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widget_slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = widget_slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\treturnValue = instance;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat(args) );\n\t\t\t}\n\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widget_uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled\", !!value );\n\n\t\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\t\tif ( value ) {\n\t\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions({ disabled: false });\n\t},\n\tdisable: function() {\n\t\treturn this._setOptions({ disabled: true });\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\nvar widget = $.widget;\n\n\n/*!\n * jQuery UI Mouse 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/mouse/\n */\n\n\nvar mouseHandled = false;\n$( document ).mouseup( function() {\n\tmouseHandled = false;\n});\n\nvar mouse = $.widget(\"ui.mouse\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tcancel: \"input,textarea,button,select,option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.bind(\"mousedown.\" + this.widgetName, function(event) {\n\t\t\t\treturn that._mouseDown(event);\n\t\t\t})\n\t\t\t.bind(\"click.\" + this.widgetName, function(event) {\n\t\t\t\tif (true === $.data(event.target, that.widgetName + \".preventClickEvent\")) {\n\t\t\t\t\t$.removeData(event.target, that.widgetName + \".preventClickEvent\");\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.unbind(\".\" + this.widgetName);\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.unbind(\"mousemove.\" + this.widgetName, this._mouseMoveDelegate)\n\t\t\t\t.unbind(\"mouseup.\" + this.widgetName, this._mouseUpDelegate);\n\t\t}\n\t},\n\n\t_mouseDown: function(event) {\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// we may have missed mouseup (out of window)\n\t\t(this._mouseStarted && this._mouseUp(event));\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = (event.which === 1),\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = (typeof this.options.cancel === \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif (!this.mouseDelayMet) {\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay);\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\n\t\t\tif (!this._mouseStarted) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif (true === $.data(event.target, this.widgetName + \".preventClickEvent\")) {\n\t\t\t$.removeData(event.target, this.widgetName + \".preventClickEvent\");\n\t\t}\n\n\t\t// these delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function(event) {\n\t\t\treturn that._mouseMove(event);\n\t\t};\n\t\tthis._mouseUpDelegate = function(event) {\n\t\t\treturn that._mouseUp(event);\n\t\t};\n\n\t\tthis.document\n\t\t\t.bind( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.bind( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function(event) {\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\n\t\t// Support: IE <9\n\t\tif ( this._mouseMoved ) {\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\t\tif ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {\n\t\t\t\treturn this._mouseUp(event);\n\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\n\t\t\t} else if ( !event.which ) {\n\t\t\t\treturn this._mouseUp( event );\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseDrag(event);\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function(event) {\n\t\tthis.document\n\t\t\t.unbind( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.unbind( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif (event.target === this._mouseDownEvent.target) {\n\t\t\t\t$.data(event.target, this.widgetName + \".preventClickEvent\", true);\n\t\t\t}\n\n\t\t\tthis._mouseStop(event);\n\t\t}\n\n\t\tmouseHandled = false;\n\t\treturn false;\n\t},\n\n\t_mouseDistanceMet: function(event) {\n\t\treturn (Math.max(\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function(/* event */) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function(/* event */) {},\n\t_mouseDrag: function(/* event */) {},\n\t_mouseStop: function(/* event */) {},\n\t_mouseCapture: function(/* event */) { return true; }\n});\n\n\n/*!\n * jQuery UI Position 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n\n(function() {\n\n$.ui = $.ui || {};\n\nvar cachedScrollbarWidth, supportsOffsetFractions,\n\tmax = Math.max,\n\tabs = Math.abs,\n\tround = Math.round,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[0];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[0];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[0].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn (cachedScrollbarWidth = w1 - w2);\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[0].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[0].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[0] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: withinElement.offset() || { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\n\t\t\t// support: jQuery 1.6.x\n\t\t\t// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows\n\t\t\twidth: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),\n\t\t\theight: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[0].preventDefault ) {\n\t\t// force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\t// clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t});\n\n\t// normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each(function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) + scrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) + scrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\t// if the browser doesn't support fractions, then round for consistent results\n\t\tif ( !supportsOffsetFractions ) {\n\t\t\tposition.left = round( position.left );\n\t\t\tposition.top = round( position.top );\n\t\t}\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem: elem\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif ( options.using ) {\n\t\t\t// adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t});\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\t\t\t\t// element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\t\t\t\t// element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t// element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\t\t\t// too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\t\t\t\t// element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\t\t\t\t// element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t// element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\t\t\t// too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\tif ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;\n\t\t\t\tif ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n// fraction support test\n(function() {\n\tvar testElement, testElementParent, testElementStyle, offsetLeft, i,\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ],\n\t\tdiv = document.createElement( \"div\" );\n\n\t//Create a \"fake body\" for testing based on method used in jQuery.support\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\n\ttestElementStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\tbackground: \"none\"\n\t};\n\tif ( body ) {\n\t\t$.extend( testElementStyle, {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"-1000px\",\n\t\t\ttop: \"-1000px\"\n\t\t});\n\t}\n\tfor ( i in testElementStyle ) {\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\n\t}\n\ttestElement.appendChild( div );\n\ttestElementParent = body || document.documentElement;\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\n\n\tdiv.style.cssText = \"position: absolute; left: 10.7432222px;\";\n\n\toffsetLeft = $( div ).offset().left;\n\tsupportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;\n\n\ttestElement.innerHTML = \"\";\n\ttestElementParent.removeChild( testElement );\n})();\n\n})();\n\nvar position = $.ui.position;\n\n\n/*!\n * jQuery UI Accordion 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/accordion/\n */\n\n\nvar accordion = $.widget( \"ui.accordion\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tactive: 0,\n\t\tanimate: {},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theader: \"> li > :first-child,> :not(li):even\",\n\t\theightStyle: \"auto\",\n\t\ticons: {\n\t\t\tactiveHeader: \"ui-icon-triangle-1-s\",\n\t\t\theader: \"ui-icon-triangle-1-e\"\n\t\t},\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null\n\t},\n\n\thideProps: {\n\t\tborderTopWidth: \"hide\",\n\t\tborderBottomWidth: \"hide\",\n\t\tpaddingTop: \"hide\",\n\t\tpaddingBottom: \"hide\",\n\t\theight: \"hide\"\n\t},\n\n\tshowProps: {\n\t\tborderTopWidth: \"show\",\n\t\tborderBottomWidth: \"show\",\n\t\tpaddingTop: \"show\",\n\t\tpaddingBottom: \"show\",\n\t\theight: \"show\"\n\t},\n\n\t_create: function() {\n\t\tvar options = this.options;\n\t\tthis.prevShow = this.prevHide = $();\n\t\tthis.element.addClass( \"ui-accordion ui-widget ui-helper-reset\" )\n\t\t\t// ARIA\n\t\t\t.attr( \"role\", \"tablist\" );\n\n\t\t// don't allow collapsible: false and active: false / null\n\t\tif ( !options.collapsible && (options.active === false || options.active == null) ) {\n\t\t\toptions.active = 0;\n\t\t}\n\n\t\tthis._processPanels();\n\t\t// handle negative values\n\t\tif ( options.active < 0 ) {\n\t\t\toptions.active += this.headers.length;\n\t\t}\n\t\tthis._refresh();\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\theader: this.active,\n\t\t\tpanel: !this.active.length ? $() : this.active.next()\n\t\t};\n\t},\n\n\t_createIcons: function() {\n\t\tvar icons = this.options.icons;\n\t\tif ( icons ) {\n\t\t\t$( \"<span>\" )\n\t\t\t\t.addClass( \"ui-accordion-header-icon ui-icon \" + icons.header )\n\t\t\t\t.prependTo( this.headers );\n\t\t\tthis.active.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.removeClass( icons.header )\n\t\t\t\t.addClass( icons.activeHeader );\n\t\t\tthis.headers.addClass( \"ui-accordion-icons\" );\n\t\t}\n\t},\n\n\t_destroyIcons: function() {\n\t\tthis.headers\n\t\t\t.removeClass( \"ui-accordion-icons\" )\n\t\t\t.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.remove();\n\t},\n\n\t_destroy: function() {\n\t\tvar contents;\n\n\t\t// clean up main element\n\t\tthis.element\n\t\t\t.removeClass( \"ui-accordion ui-widget ui-helper-reset\" )\n\t\t\t.removeAttr( \"role\" );\n\n\t\t// clean up headers\n\t\tthis.headers\n\t\t\t.removeClass( \"ui-accordion-header ui-accordion-header-active ui-state-default \" +\n\t\t\t\t\"ui-corner-all ui-state-active ui-state-disabled ui-corner-top\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t.removeAttr( \"aria-selected\" )\n\t\t\t.removeAttr( \"aria-controls\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis._destroyIcons();\n\n\t\t// clean up content panels\n\t\tcontents = this.headers.next()\n\t\t\t.removeClass( \"ui-helper-reset ui-widget-content ui-corner-bottom \" +\n\t\t\t\t\"ui-accordion-content ui-accordion-content-active ui-state-disabled\" )\n\t\t\t.css( \"display\", \"\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t.removeUniqueId();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tcontents.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tif ( this.options.event ) {\n\t\t\t\tthis._off( this.headers, this.options.event );\n\t\t\t}\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\t// setting collapsible: false while collapsed; open first panel\n\t\tif ( key === \"collapsible\" && !value && this.options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t}\n\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis._destroyIcons();\n\t\t\tif ( value ) {\n\t\t\t\tthis._createIcons();\n\t\t\t}\n\t\t}\n\n\t\t// #5332 - opacity doesn't cascade to positioned elements in IE\n\t\t// so we need to add the disabled class to the headers and panels\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t\tthis.headers.add( this.headers.next() )\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tif ( event.altKey || event.ctrlKey ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar keyCode = $.ui.keyCode,\n\t\t\tlength = this.headers.length,\n\t\t\tcurrentIndex = this.headers.index( event.target ),\n\t\t\ttoFocus = false;\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase keyCode.RIGHT:\n\t\t\tcase keyCode.DOWN:\n\t\t\t\ttoFocus = this.headers[ ( currentIndex + 1 ) % length ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.LEFT:\n\t\t\tcase keyCode.UP:\n\t\t\t\ttoFocus = this.headers[ ( currentIndex - 1 + length ) % length ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.SPACE:\n\t\t\tcase keyCode.ENTER:\n\t\t\t\tthis._eventHandler( event );\n\t\t\t\tbreak;\n\t\t\tcase keyCode.HOME:\n\t\t\t\ttoFocus = this.headers[ 0 ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.END:\n\t\t\t\ttoFocus = this.headers[ length - 1 ];\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( toFocus ) {\n\t\t\t$( event.target ).attr( \"tabIndex\", -1 );\n\t\t\t$( toFocus ).attr( \"tabIndex\", 0 );\n\t\t\ttoFocus.focus();\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_panelKeyDown: function( event ) {\n\t\tif ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {\n\t\t\t$( event.currentTarget ).prev().focus();\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options;\n\t\tthis._processPanels();\n\n\t\t// was collapsed or no panel\n\t\tif ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\t\t// active false only when collapsible is true\n\t\t} else if ( options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t// was active, but active panel is gone\n\t\t} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\t// all remaining panel are disabled\n\t\t\tif ( this.headers.length === this.headers.find(\".ui-state-disabled\").length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\t\t\t// activate previous panel\n\t\t\t} else {\n\t\t\t\tthis._activate( Math.max( 0, options.active - 1 ) );\n\t\t\t}\n\t\t// was active, active panel still exists\n\t\t} else {\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.headers.index( this.active );\n\t\t}\n\n\t\tthis._destroyIcons();\n\n\t\tthis._refresh();\n\t},\n\n\t_processPanels: function() {\n\t\tvar prevHeaders = this.headers,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.headers = this.element.find( this.options.header )\n\t\t\t.addClass( \"ui-accordion-header ui-state-default ui-corner-all\" );\n\n\t\tthis.panels = this.headers.next()\n\t\t\t.addClass( \"ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom\" )\n\t\t\t.filter( \":not(.ui-accordion-content-active)\" )\n\t\t\t.hide();\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevPanels ) {\n\t\t\tthis._off( prevHeaders.not( this.headers ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t_refresh: function() {\n\t\tvar maxHeight,\n\t\t\toptions = this.options,\n\t\t\theightStyle = options.heightStyle,\n\t\t\tparent = this.element.parent();\n\n\t\tthis.active = this._findActive( options.active )\n\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" )\n\t\t\t.removeClass( \"ui-corner-all\" );\n\t\tthis.active.next()\n\t\t\t.addClass( \"ui-accordion-content-active\" )\n\t\t\t.show();\n\n\t\tthis.headers\n\t\t\t.attr( \"role\", \"tab\" )\n\t\t\t.each(function() {\n\t\t\t\tvar header = $( this ),\n\t\t\t\t\theaderId = header.uniqueId().attr( \"id\" ),\n\t\t\t\t\tpanel = header.next(),\n\t\t\t\t\tpanelId = panel.uniqueId().attr( \"id\" );\n\t\t\t\theader.attr( \"aria-controls\", panelId );\n\t\t\t\tpanel.attr( \"aria-labelledby\", headerId );\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\tthis.headers\n\t\t\t.not( this.active )\n\t\t\t.attr({\n\t\t\t\t\"aria-selected\": \"false\",\n\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\ttabIndex: -1\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t})\n\t\t\t\t.hide();\n\n\t\t// make sure at least one header is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.headers.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active.attr({\n\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\ttabIndex: 0\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t});\n\t\t}\n\n\t\tthis._createIcons();\n\n\t\tthis._setupEvents( options.event );\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.headers.each(function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.headers.next()\n\t\t\t\t.each(function() {\n\t\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t\t})\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.headers.next()\n\t\t\t\t.each(function() {\n\t\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).css( \"height\", \"\" ).height() );\n\t\t\t\t})\n\t\t\t\t.height( maxHeight );\n\t\t}\n\t},\n\n\t_activate: function( index ) {\n\t\tvar active = this._findActive( index )[ 0 ];\n\n\t\t// trying to activate the already active panel\n\t\tif ( active === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// trying to collapse, simulate a click on the currently active header\n\t\tactive = active || this.active[ 0 ];\n\n\t\tthis._eventHandler({\n\t\t\ttarget: active,\n\t\t\tcurrentTarget: active,\n\t\t\tpreventDefault: $.noop\n\t\t});\n\t},\n\n\t_findActive: function( selector ) {\n\t\treturn typeof selector === \"number\" ? this.headers.eq( selector ) : $();\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tkeydown: \"_keydown\"\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t});\n\t\t}\n\n\t\tthis._off( this.headers.add( this.headers.next() ) );\n\t\tthis._on( this.headers, events );\n\t\tthis._on( this.headers.next(), { keydown: \"_panelKeyDown\" });\n\t\tthis._hoverable( this.headers );\n\t\tthis._focusable( this.headers );\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tclicked = $( event.currentTarget ),\n\t\t\tclickedIsActive = clicked[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : clicked.next(),\n\t\t\ttoHide = active.next(),\n\t\t\teventData = {\n\t\t\t\toldHeader: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewHeader: collapsing ? $() : clicked,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif (\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.headers.index( clicked );\n\n\t\t// when the call to ._toggle() comes after the class changes\n\t\t// it causes a very odd bug in IE 8 (see #6720)\n\t\tthis.active = clickedIsActive ? $() : clicked;\n\t\tthis._toggle( eventData );\n\n\t\t// switch classes\n\t\t// corner classes on the previously active header stay after the animation\n\t\tactive.removeClass( \"ui-accordion-header-active ui-state-active\" );\n\t\tif ( options.icons ) {\n\t\t\tactive.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.removeClass( options.icons.activeHeader )\n\t\t\t\t.addClass( options.icons.header );\n\t\t}\n\n\t\tif ( !clickedIsActive ) {\n\t\t\tclicked\n\t\t\t\t.removeClass( \"ui-corner-all\" )\n\t\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" );\n\t\t\tif ( options.icons ) {\n\t\t\t\tclicked.children( \".ui-accordion-header-icon\" )\n\t\t\t\t\t.removeClass( options.icons.header )\n\t\t\t\t\t.addClass( options.icons.activeHeader );\n\t\t\t}\n\n\t\t\tclicked\n\t\t\t\t.next()\n\t\t\t\t.addClass( \"ui-accordion-content-active\" );\n\t\t}\n\t},\n\n\t_toggle: function( data ) {\n\t\tvar toShow = data.newPanel,\n\t\t\ttoHide = this.prevShow.length ? this.prevShow : data.oldPanel;\n\n\t\t// handle activating a panel during the animation for another activation\n\t\tthis.prevShow.add( this.prevHide ).stop( true, true );\n\t\tthis.prevShow = toShow;\n\t\tthis.prevHide = toHide;\n\n\t\tif ( this.options.animate ) {\n\t\t\tthis._animate( toShow, toHide, data );\n\t\t} else {\n\t\t\ttoHide.hide();\n\t\t\ttoShow.show();\n\t\t\tthis._toggleComplete( data );\n\t\t}\n\n\t\ttoHide.attr({\n\t\t\t\"aria-hidden\": \"true\"\n\t\t});\n\t\ttoHide.prev().attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t});\n\t\t// if we're switching panels, remove the old header from the tab order\n\t\t// if we're opening from collapsed state, remove the previous header from the tab order\n\t\t// if we're collapsing, then keep the collapsing header in the tab order\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\ttoHide.prev().attr({\n\t\t\t\t\"tabIndex\": -1,\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t});\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.headers.filter(function() {\n\t\t\t\treturn parseInt( $( this ).attr( \"tabIndex\" ), 10 ) === 0;\n\t\t\t})\n\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow\n\t\t\t.attr( \"aria-hidden\", \"false\" )\n\t\t\t.prev()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t});\n\t},\n\n\t_animate: function( toShow, toHide, data ) {\n\t\tvar total, easing, duration,\n\t\t\tthat = this,\n\t\t\tadjust = 0,\n\t\t\tboxSizing = toShow.css( \"box-sizing\" ),\n\t\t\tdown = toShow.length &&\n\t\t\t\t( !toHide.length || ( toShow.index() < toHide.index() ) ),\n\t\t\tanimate = this.options.animate || {},\n\t\t\toptions = down && animate.down || animate,\n\t\t\tcomplete = function() {\n\t\t\t\tthat._toggleComplete( data );\n\t\t\t};\n\n\t\tif ( typeof options === \"number\" ) {\n\t\t\tduration = options;\n\t\t}\n\t\tif ( typeof options === \"string\" ) {\n\t\t\teasing = options;\n\t\t}\n\t\t// fall back from options to animation in case of partial down settings\n\t\teasing = easing || options.easing || animate.easing;\n\t\tduration = duration || options.duration || animate.duration;\n\n\t\tif ( !toHide.length ) {\n\t\t\treturn toShow.animate( this.showProps, duration, easing, complete );\n\t\t}\n\t\tif ( !toShow.length ) {\n\t\t\treturn toHide.animate( this.hideProps, duration, easing, complete );\n\t\t}\n\n\t\ttotal = toShow.show().outerHeight();\n\t\ttoHide.animate( this.hideProps, {\n\t\t\tduration: duration,\n\t\t\teasing: easing,\n\t\t\tstep: function( now, fx ) {\n\t\t\t\tfx.now = Math.round( now );\n\t\t\t}\n\t\t});\n\t\ttoShow\n\t\t\t.hide()\n\t\t\t.animate( this.showProps, {\n\t\t\t\tduration: duration,\n\t\t\t\teasing: easing,\n\t\t\t\tcomplete: complete,\n\t\t\t\tstep: function( now, fx ) {\n\t\t\t\t\tfx.now = Math.round( now );\n\t\t\t\t\tif ( fx.prop !== \"height\" ) {\n\t\t\t\t\t\tif ( boxSizing === \"content-box\" ) {\n\t\t\t\t\t\t\tadjust += fx.now;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( that.options.heightStyle !== \"content\" ) {\n\t\t\t\t\t\tfx.now = Math.round( total - toHide.outerHeight() - adjust );\n\t\t\t\t\t\tadjust = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t},\n\n\t_toggleComplete: function( data ) {\n\t\tvar toHide = data.oldPanel;\n\n\t\ttoHide\n\t\t\t.removeClass( \"ui-accordion-content-active\" )\n\t\t\t.prev()\n\t\t\t\t.removeClass( \"ui-corner-top\" )\n\t\t\t\t.addClass( \"ui-corner-all\" );\n\n\t\t// Work around for rendering bug in IE (#5421)\n\t\tif ( toHide.length ) {\n\t\t\ttoHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;\n\t\t}\n\t\tthis._trigger( \"activate\", null, data );\n\t}\n});\n\n\n/*!\n * jQuery UI Menu 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/menu/\n */\n\n\nvar menu = $.widget( \"ui.menu\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<ul>\",\n\tdelay: 300,\n\toptions: {\n\t\ticons: {\n\t\t\tsubmenu: \"ui-icon-carat-1-e\"\n\t\t},\n\t\titems: \"> *\",\n\t\tmenus: \"ul\",\n\t\tposition: {\n\t\t\tmy: \"left-1 top\",\n\t\t\tat: \"right top\"\n\t\t},\n\t\trole: \"menu\",\n\n\t\t// callbacks\n\t\tblur: null,\n\t\tfocus: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tthis.activeMenu = this.element;\n\n\t\t// Flag used to prevent firing of the click handler\n\t\t// as the event bubbles up through nested menus\n\t\tthis.mouseHandled = false;\n\t\tthis.element\n\t\t\t.uniqueId()\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content\" )\n\t\t\t.toggleClass( \"ui-menu-icons\", !!this.element.find( \".ui-icon\" ).length )\n\t\t\t.attr({\n\t\t\t\trole: this.options.role,\n\t\t\t\ttabIndex: 0\n\t\t\t});\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.element\n\t\t\t\t.addClass( \"ui-state-disabled\" )\n\t\t\t\t.attr( \"aria-disabled\", \"true\" );\n\t\t}\n\n\t\tthis._on({\n\t\t\t// Prevent focus from sticking to links inside menu after clicking\n\t\t\t// them (focus should always stay on UL during navigation).\n\t\t\t\"mousedown .ui-menu-item\": function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t},\n\t\t\t\"click .ui-menu-item\": function( event ) {\n\t\t\t\tvar target = $( event.target );\n\t\t\t\tif ( !this.mouseHandled && target.not( \".ui-state-disabled\" ).length ) {\n\t\t\t\t\tthis.select( event );\n\n\t\t\t\t\t// Only set the mouseHandled flag if the event will bubble, see #9469.\n\t\t\t\t\tif ( !event.isPropagationStopped() ) {\n\t\t\t\t\t\tthis.mouseHandled = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Open submenu on click\n\t\t\t\t\tif ( target.has( \".ui-menu\" ).length ) {\n\t\t\t\t\t\tthis.expand( event );\n\t\t\t\t\t} else if ( !this.element.is( \":focus\" ) && $( this.document[ 0 ].activeElement ).closest( \".ui-menu\" ).length ) {\n\n\t\t\t\t\t\t// Redirect focus to the menu\n\t\t\t\t\t\tthis.element.trigger( \"focus\", [ true ] );\n\n\t\t\t\t\t\t// If the active item is on the top level, let it stay active.\n\t\t\t\t\t\t// Otherwise, blur the active item since it is no longer visible.\n\t\t\t\t\t\tif ( this.active && this.active.parents( \".ui-menu\" ).length === 1 ) {\n\t\t\t\t\t\t\tclearTimeout( this.timer );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mouseenter .ui-menu-item\": function( event ) {\n\t\t\t\t// Ignore mouse events while typeahead is active, see #10458.\n\t\t\t\t// Prevents focusing the wrong item when typeahead causes a scroll while the mouse\n\t\t\t\t// is over an item in the menu\n\t\t\t\tif ( this.previousFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar target = $( event.currentTarget );\n\t\t\t\t// Remove ui-state-active class from siblings of the newly focused menu item\n\t\t\t\t// to avoid a jump caused by adjacent elements both having a class with a border\n\t\t\t\ttarget.siblings( \".ui-state-active\" ).removeClass( \"ui-state-active\" );\n\t\t\t\tthis.focus( event, target );\n\t\t\t},\n\t\t\tmouseleave: \"collapseAll\",\n\t\t\t\"mouseleave .ui-menu\": \"collapseAll\",\n\t\t\tfocus: function( event, keepActiveItem ) {\n\t\t\t\t// If there's already an active item, keep it active\n\t\t\t\t// If not, activate the first item\n\t\t\t\tvar item = this.active || this.element.find( this.options.items ).eq( 0 );\n\n\t\t\t\tif ( !keepActiveItem ) {\n\t\t\t\t\tthis.focus( event, item );\n\t\t\t\t}\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tthis._delay(function() {\n\t\t\t\t\tif ( !$.contains( this.element[0], this.document[0].activeElement ) ) {\n\t\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tkeydown: \"_keydown\"\n\t\t});\n\n\t\tthis.refresh();\n\n\t\t// Clicks outside of a menu collapse any open menus\n\t\tthis._on( this.document, {\n\t\t\tclick: function( event ) {\n\t\t\t\tif ( this._closeOnDocumentClick( event ) ) {\n\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t}\n\n\t\t\t\t// Reset the mouseHandled flag\n\t\t\t\tthis.mouseHandled = false;\n\t\t\t}\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\t// Destroy (sub)menus\n\t\tthis.element\n\t\t\t.removeAttr( \"aria-activedescendant\" )\n\t\t\t.find( \".ui-menu\" ).addBack()\n\t\t\t\t.removeClass( \"ui-menu ui-widget ui-widget-content ui-menu-icons ui-front\" )\n\t\t\t\t.removeAttr( \"role\" )\n\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.show();\n\n\t\t// Destroy menu items\n\t\tthis.element.find( \".ui-menu-item\" )\n\t\t\t.removeClass( \"ui-menu-item\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeUniqueId()\n\t\t\t.removeClass( \"ui-state-hover\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-haspopup\" )\n\t\t\t.children().each( function() {\n\t\t\t\tvar elem = $( this );\n\t\t\t\tif ( elem.data( \"ui-menu-submenu-carat\" ) ) {\n\t\t\t\t\telem.remove();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Destroy menu dividers\n\t\tthis.element.find( \".ui-menu-divider\" ).removeClass( \"ui-menu-divider ui-widget-content\" );\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar match, prev, character, skip,\n\t\t\tpreventDefault = true;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\tthis.previousPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\tthis.nextPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tthis._move( \"first\", \"first\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tthis._move( \"last\", \"last\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\t\tthis.previous( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tthis.next( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ENTER:\n\t\tcase $.ui.keyCode.SPACE:\n\t\t\tthis._activate( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpreventDefault = false;\n\t\t\tprev = this.previousFilter || \"\";\n\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\tskip = false;\n\n\t\t\tclearTimeout( this.filterTimer );\n\n\t\t\tif ( character === prev ) {\n\t\t\t\tskip = true;\n\t\t\t} else {\n\t\t\t\tcharacter = prev + character;\n\t\t\t}\n\n\t\t\tmatch = this._filterMenuItems( character );\n\t\t\tmatch = skip && match.index( this.active.next() ) !== -1 ?\n\t\t\t\tthis.active.nextAll( \".ui-menu-item\" ) :\n\t\t\t\tmatch;\n\n\t\t\t// If no matches on the current filter, reset to the last character pressed\n\t\t\t// to move down the menu to the first item that starts with that character\n\t\t\tif ( !match.length ) {\n\t\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\t\tmatch = this._filterMenuItems( character );\n\t\t\t}\n\n\t\t\tif ( match.length ) {\n\t\t\t\tthis.focus( event, match );\n\t\t\t\tthis.previousFilter = character;\n\t\t\t\tthis.filterTimer = this._delay(function() {\n\t\t\t\t\tdelete this.previousFilter;\n\t\t\t\t}, 1000 );\n\t\t\t} else {\n\t\t\t\tdelete this.previousFilter;\n\t\t\t}\n\t\t}\n\n\t\tif ( preventDefault ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_activate: function( event ) {\n\t\tif ( !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\tif ( this.active.is( \"[aria-haspopup='true']\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t} else {\n\t\t\t\tthis.select( event );\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar menus, items,\n\t\t\tthat = this,\n\t\t\ticon = this.options.icons.submenu,\n\t\t\tsubmenus = this.element.find( this.options.menus );\n\n\t\tthis.element.toggleClass( \"ui-menu-icons\", !!this.element.find( \".ui-icon\" ).length );\n\n\t\t// Initialize nested menus\n\t\tsubmenus.filter( \":not(.ui-menu)\" )\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content ui-front\" )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\trole: this.options.role,\n\t\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t})\n\t\t\t.each(function() {\n\t\t\t\tvar menu = $( this ),\n\t\t\t\t\titem = menu.parent(),\n\t\t\t\t\tsubmenuCarat = $( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-menu-icon ui-icon \" + icon )\n\t\t\t\t\t\t.data( \"ui-menu-submenu-carat\", true );\n\n\t\t\t\titem\n\t\t\t\t\t.attr( \"aria-haspopup\", \"true\" )\n\t\t\t\t\t.prepend( submenuCarat );\n\t\t\t\tmenu.attr( \"aria-labelledby\", item.attr( \"id\" ) );\n\t\t\t});\n\n\t\tmenus = submenus.add( this.element );\n\t\titems = menus.find( this.options.items );\n\n\t\t// Initialize menu-items containing spaces and/or dashes only as dividers\n\t\titems.not( \".ui-menu-item\" ).each(function() {\n\t\t\tvar item = $( this );\n\t\t\tif ( that._isDivider( item ) ) {\n\t\t\t\titem.addClass( \"ui-widget-content ui-menu-divider\" );\n\t\t\t}\n\t\t});\n\n\t\t// Don't refresh list items that are already adapted\n\t\titems.not( \".ui-menu-item, .ui-menu-divider\" )\n\t\t\t.addClass( \"ui-menu-item\" )\n\t\t\t.uniqueId()\n\t\t\t.attr({\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: this._itemRole()\n\t\t\t});\n\n\t\t// Add aria-disabled attribute to any disabled menu item\n\t\titems.filter( \".ui-state-disabled\" ).attr( \"aria-disabled\", \"true\" );\n\n\t\t// If the active item has been removed, blur the menu\n\t\tif ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\tthis.blur();\n\t\t}\n\t},\n\n\t_itemRole: function() {\n\t\treturn {\n\t\t\tmenu: \"menuitem\",\n\t\t\tlistbox: \"option\"\n\t\t}[ this.options.role ];\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.element.find( \".ui-menu-icon\" )\n\t\t\t\t.removeClass( this.options.icons.submenu )\n\t\t\t\t.addClass( value.submenu );\n\t\t}\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\tfocus: function( event, item ) {\n\t\tvar nested, focused;\n\t\tthis.blur( event, event && event.type === \"focus\" );\n\n\t\tthis._scrollIntoView( item );\n\n\t\tthis.active = item.first();\n\t\tfocused = this.active.addClass( \"ui-state-focus\" ).removeClass( \"ui-state-active\" );\n\t\t// Only update aria-activedescendant if there's a role\n\t\t// otherwise we assume focus is managed elsewhere\n\t\tif ( this.options.role ) {\n\t\t\tthis.element.attr( \"aria-activedescendant\", focused.attr( \"id\" ) );\n\t\t}\n\n\t\t// Highlight active parent menu item, if any\n\t\tthis.active\n\t\t\t.parent()\n\t\t\t.closest( \".ui-menu-item\" )\n\t\t\t.addClass( \"ui-state-active\" );\n\n\t\tif ( event && event.type === \"keydown\" ) {\n\t\t\tthis._close();\n\t\t} else {\n\t\t\tthis.timer = this._delay(function() {\n\t\t\t\tthis._close();\n\t\t\t}, this.delay );\n\t\t}\n\n\t\tnested = item.children( \".ui-menu\" );\n\t\tif ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {\n\t\t\tthis._startOpening(nested);\n\t\t}\n\t\tthis.activeMenu = item.parent();\n\n\t\tthis._trigger( \"focus\", event, { item: item } );\n\t},\n\n\t_scrollIntoView: function( item ) {\n\t\tvar borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\n\t\tif ( this._hasScroll() ) {\n\t\t\tborderTop = parseFloat( $.css( this.activeMenu[0], \"borderTopWidth\" ) ) || 0;\n\t\t\tpaddingTop = parseFloat( $.css( this.activeMenu[0], \"paddingTop\" ) ) || 0;\n\t\t\toffset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\n\t\t\tscroll = this.activeMenu.scrollTop();\n\t\t\telementHeight = this.activeMenu.height();\n\t\t\titemHeight = item.outerHeight();\n\n\t\t\tif ( offset < 0 ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset );\n\t\t\t} else if ( offset + itemHeight > elementHeight ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\n\t\t\t}\n\t\t}\n\t},\n\n\tblur: function( event, fromFocus ) {\n\t\tif ( !fromFocus ) {\n\t\t\tclearTimeout( this.timer );\n\t\t}\n\n\t\tif ( !this.active ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.active.removeClass( \"ui-state-focus\" );\n\t\tthis.active = null;\n\n\t\tthis._trigger( \"blur\", event, { item: this.active } );\n\t},\n\n\t_startOpening: function( submenu ) {\n\t\tclearTimeout( this.timer );\n\n\t\t// Don't open if already open fixes a Firefox bug that caused a .5 pixel\n\t\t// shift in the submenu position when mousing over the carat icon\n\t\tif ( submenu.attr( \"aria-hidden\" ) !== \"true\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timer = this._delay(function() {\n\t\t\tthis._close();\n\t\t\tthis._open( submenu );\n\t\t}, this.delay );\n\t},\n\n\t_open: function( submenu ) {\n\t\tvar position = $.extend({\n\t\t\tof: this.active\n\t\t}, this.options.position );\n\n\t\tclearTimeout( this.timer );\n\t\tthis.element.find( \".ui-menu\" ).not( submenu.parents( \".ui-menu\" ) )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" );\n\n\t\tsubmenu\n\t\t\t.show()\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.attr( \"aria-expanded\", \"true\" )\n\t\t\t.position( position );\n\t},\n\n\tcollapseAll: function( event, all ) {\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay(function() {\n\t\t\t// If we were passed an event, look for the submenu that contains the event\n\t\t\tvar currentMenu = all ? this.element :\n\t\t\t\t$( event && event.target ).closest( this.element.find( \".ui-menu\" ) );\n\n\t\t\t// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway\n\t\t\tif ( !currentMenu.length ) {\n\t\t\t\tcurrentMenu = this.element;\n\t\t\t}\n\n\t\t\tthis._close( currentMenu );\n\n\t\t\tthis.blur( event );\n\t\t\tthis.activeMenu = currentMenu;\n\t\t}, this.delay );\n\t},\n\n\t// With no arguments, closes the currently active menu - if nothing is active\n\t// it closes all menus.  If passed an argument, it will search for menus BELOW\n\t_close: function( startMenu ) {\n\t\tif ( !startMenu ) {\n\t\t\tstartMenu = this.active ? this.active.parent() : this.element;\n\t\t}\n\n\t\tstartMenu\n\t\t\t.find( \".ui-menu\" )\n\t\t\t\t.hide()\n\t\t\t\t.attr( \"aria-hidden\", \"true\" )\n\t\t\t\t.attr( \"aria-expanded\", \"false\" )\n\t\t\t.end()\n\t\t\t.find( \".ui-state-active\" ).not( \".ui-state-focus\" )\n\t\t\t\t.removeClass( \"ui-state-active\" );\n\t},\n\n\t_closeOnDocumentClick: function( event ) {\n\t\treturn !$( event.target ).closest( \".ui-menu\" ).length;\n\t},\n\n\t_isDivider: function( item ) {\n\n\t\t// Match hyphen, em dash, en dash\n\t\treturn !/[^\\-\\u2014\\u2013\\s]/.test( item.text() );\n\t},\n\n\tcollapse: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active.parent().closest( \".ui-menu-item\", this.element );\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._close();\n\t\t\tthis.focus( event, newItem );\n\t\t}\n\t},\n\n\texpand: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active\n\t\t\t\t.children( \".ui-menu \" )\n\t\t\t\t.find( this.options.items )\n\t\t\t\t.first();\n\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._open( newItem.parent() );\n\n\t\t\t// Delay so Firefox will not hide activedescendant change in expanding submenu from AT\n\t\t\tthis._delay(function() {\n\t\t\t\tthis.focus( event, newItem );\n\t\t\t});\n\t\t}\n\t},\n\n\tnext: function( event ) {\n\t\tthis._move( \"next\", \"first\", event );\n\t},\n\n\tprevious: function( event ) {\n\t\tthis._move( \"prev\", \"last\", event );\n\t},\n\n\tisFirstItem: function() {\n\t\treturn this.active && !this.active.prevAll( \".ui-menu-item\" ).length;\n\t},\n\n\tisLastItem: function() {\n\t\treturn this.active && !this.active.nextAll( \".ui-menu-item\" ).length;\n\t},\n\n\t_move: function( direction, filter, event ) {\n\t\tvar next;\n\t\tif ( this.active ) {\n\t\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( -1 );\n\t\t\t} else {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction + \"All\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( 0 );\n\t\t\t}\n\t\t}\n\t\tif ( !next || !next.length || !this.active ) {\n\t\t\tnext = this.activeMenu.find( this.options.items )[ filter ]();\n\t\t}\n\n\t\tthis.focus( event, next );\n\t},\n\n\tnextPage: function( event ) {\n\t\tvar item, base, height;\n\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isLastItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.nextAll( \".ui-menu-item\" ).each(function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base - height < 0;\n\t\t\t});\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items )\n\t\t\t\t[ !this.active ? \"first\" : \"last\" ]() );\n\t\t}\n\t},\n\n\tpreviousPage: function( event ) {\n\t\tvar item, base, height;\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isFirstItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.prevAll( \".ui-menu-item\" ).each(function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base + height > 0;\n\t\t\t});\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items ).first() );\n\t\t}\n\t},\n\n\t_hasScroll: function() {\n\t\treturn this.element.outerHeight() < this.element.prop( \"scrollHeight\" );\n\t},\n\n\tselect: function( event ) {\n\t\t// TODO: It should never be possible to not have an active item at this\n\t\t// point, but the tests don't trigger mouseenter before click.\n\t\tthis.active = this.active || $( event.target ).closest( \".ui-menu-item\" );\n\t\tvar ui = { item: this.active };\n\t\tif ( !this.active.has( \".ui-menu\" ).length ) {\n\t\t\tthis.collapseAll( event, true );\n\t\t}\n\t\tthis._trigger( \"select\", event, ui );\n\t},\n\n\t_filterMenuItems: function(character) {\n\t\tvar escapedCharacter = character.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" ),\n\t\t\tregex = new RegExp( \"^\" + escapedCharacter, \"i\" );\n\n\t\treturn this.activeMenu\n\t\t\t.find( this.options.items )\n\n\t\t\t// Only match on items, not dividers or other content (#10571)\n\t\t\t.filter( \".ui-menu-item\" )\n\t\t\t.filter(function() {\n\t\t\t\treturn regex.test( $.trim( $( this ).text() ) );\n\t\t\t});\n\t}\n});\n\n\n/*!\n * jQuery UI Autocomplete 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/autocomplete/\n */\n\n\n$.widget( \"ui.autocomplete\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<input>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tautoFocus: false,\n\t\tdelay: 300,\n\t\tminLength: 1,\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\tsource: null,\n\n\t\t// callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresponse: null,\n\t\tsearch: null,\n\t\tselect: null\n\t},\n\n\trequestIndex: 0,\n\tpending: 0,\n\n\t_create: function() {\n\t\t// Some browsers only repeat keydown events, not keypress events,\n\t\t// so we use the suppressKeyPress flag to determine if we've already\n\t\t// handled the keydown event. #7269\n\t\t// Unfortunately the code for & in keypress is the same as the up arrow,\n\t\t// so we use the suppressKeyPressRepeat flag to avoid handling keypress\n\t\t// events when we know the keydown event was used to modify the\n\t\t// search term. #7799\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\n\t\t\tnodeName = this.element[ 0 ].nodeName.toLowerCase(),\n\t\t\tisTextarea = nodeName === \"textarea\",\n\t\t\tisInput = nodeName === \"input\";\n\n\t\tthis.isMultiLine =\n\t\t\t// Textareas are always multi-line\n\t\t\tisTextarea ? true :\n\t\t\t// Inputs are always single-line, even if inside a contentEditable element\n\t\t\t// IE also treats inputs as contentEditable\n\t\t\tisInput ? false :\n\t\t\t// All other element types are determined by whether or not they're contentEditable\n\t\t\tthis.element.prop( \"isContentEditable\" );\n\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\n\t\tthis.isNewMenu = true;\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-autocomplete-input\" )\n\t\t\t.attr( \"autocomplete\", \"off\" );\n\n\t\tthis._on( this.element, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tsuppressInput = true;\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsuppressKeyPress = false;\n\t\t\t\tsuppressInput = false;\n\t\t\t\tsuppressKeyPressRepeat = false;\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ENTER:\n\t\t\t\t\t// when menu is open and has focus\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\t// #6055 - Opera still allows the keypress to occur\n\t\t\t\t\t\t// which causes forms to submit\n\t\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.TAB:\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ESCAPE:\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\t\t\t\tthis._value( this.term );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.close( event );\n\t\t\t\t\t\t// Different browsers have different default behavior for escape\n\t\t\t\t\t\t// Single press can mean undo or clear\n\t\t\t\t\t\t// Double press in IE means clear the whole form\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\t// search timeout should be triggered before the input value is changed\n\t\t\t\t\tthis._searchTimeout( event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeypress: function( event ) {\n\t\t\t\tif ( suppressKeyPress ) {\n\t\t\t\t\tsuppressKeyPress = false;\n\t\t\t\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( suppressKeyPressRepeat ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// replicate some key handlers to allow them to repeat in Firefox and Opera\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tinput: function( event ) {\n\t\t\t\tif ( suppressInput ) {\n\t\t\t\t\tsuppressInput = false;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._searchTimeout( event );\n\t\t\t},\n\t\t\tfocus: function() {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.previous = this._value();\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tif ( this.cancelBlur ) {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tclearTimeout( this.searching );\n\t\t\t\tthis.close( event );\n\t\t\t\tthis._change( event );\n\t\t\t}\n\t\t});\n\n\t\tthis._initSource();\n\t\tthis.menu = $( \"<ul>\" )\n\t\t\t.addClass( \"ui-autocomplete ui-front\" )\n\t\t\t.appendTo( this._appendTo() )\n\t\t\t.menu({\n\t\t\t\t// disable ARIA support, the live region takes care of that\n\t\t\t\trole: null\n\t\t\t})\n\t\t\t.hide()\n\t\t\t.menu( \"instance\" );\n\n\t\tthis._on( this.menu.element, {\n\t\t\tmousedown: function( event ) {\n\t\t\t\t// prevent moving focus out of the text field\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t\tthis.cancelBlur = true;\n\t\t\t\tthis._delay(function() {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t});\n\n\t\t\t\t// clicking on the scrollbar causes focus to shift to the body\n\t\t\t\t// but we can't detect a mouseup or a click immediately afterward\n\t\t\t\t// so we have to track the next mousedown and close the menu if\n\t\t\t\t// the user clicks somewhere outside of the autocomplete\n\t\t\t\tvar menuElement = this.menu.element[ 0 ];\n\t\t\t\tif ( !$( event.target ).closest( \".ui-menu-item\" ).length ) {\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tvar that = this;\n\t\t\t\t\t\tthis.document.one( \"mousedown\", function( event ) {\n\t\t\t\t\t\t\tif ( event.target !== that.element[ 0 ] &&\n\t\t\t\t\t\t\t\t\tevent.target !== menuElement &&\n\t\t\t\t\t\t\t\t\t!$.contains( menuElement, event.target ) ) {\n\t\t\t\t\t\t\t\tthat.close();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenufocus: function( event, ui ) {\n\t\t\t\tvar label, item;\n\t\t\t\t// support: Firefox\n\t\t\t\t// Prevent accidental activation of menu items in Firefox (#7024 #9118)\n\t\t\t\tif ( this.isNewMenu ) {\n\t\t\t\t\tthis.isNewMenu = false;\n\t\t\t\t\tif ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis.menu.blur();\n\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titem = ui.item.data( \"ui-autocomplete-item\" );\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\n\t\t\t\t\t// use value to match what will end up in the input, if it was a key event\n\t\t\t\t\tif ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis._value( item.value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Announce the value in the liveRegion\n\t\t\t\tlabel = ui.item.attr( \"aria-label\" ) || item.value;\n\t\t\t\tif ( label && $.trim( label ).length ) {\n\t\t\t\t\tthis.liveRegion.children().hide();\n\t\t\t\t\t$( \"<div>\" ).text( label ).appendTo( this.liveRegion );\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenuselect: function( event, ui ) {\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\n\t\t\t\t\tprevious = this.previous;\n\n\t\t\t\t// only trigger when focus was lost (click on menu)\n\t\t\t\tif ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {\n\t\t\t\t\tthis.element.focus();\n\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t// #6109 - IE triggers two focus events and the second\n\t\t\t\t\t// is asynchronous, so we need to reset the previous\n\t\t\t\t\t// term synchronously and asynchronously :-(\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\tthis.selectedItem = item;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\n\t\t\t\t\tthis._value( item.value );\n\t\t\t\t}\n\t\t\t\t// reset the term after the select event\n\t\t\t\t// this allows custom select handling to work properly\n\t\t\t\tthis.term = this._value();\n\n\t\t\t\tthis.close( event );\n\t\t\t\tthis.selectedItem = item;\n\t\t\t}\n\t\t});\n\n\t\tthis.liveRegion = $( \"<span>\", {\n\t\t\t\trole: \"status\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t})\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\n\t\t// turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\tclearTimeout( this.searching );\n\t\tthis.element\n\t\t\t.removeClass( \"ui-autocomplete-input\" )\n\t\t\t.removeAttr( \"autocomplete\" );\n\t\tthis.menu.element.remove();\n\t\tthis.liveRegion.remove();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"source\" ) {\n\t\t\tthis._initSource();\n\t\t}\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\n\t\t}\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_initSource: function() {\n\t\tvar array, url,\n\t\t\tthat = this;\n\t\tif ( $.isArray( this.options.source ) ) {\n\t\t\tarray = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\n\t\t\t};\n\t\t} else if ( typeof this.options.source === \"string\" ) {\n\t\t\turl = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tif ( that.xhr ) {\n\t\t\t\t\tthat.xhr.abort();\n\t\t\t\t}\n\t\t\t\tthat.xhr = $.ajax({\n\t\t\t\t\turl: url,\n\t\t\t\t\tdata: request,\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tsuccess: function( data ) {\n\t\t\t\t\t\tresponse( data );\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tresponse([]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t} else {\n\t\t\tthis.source = this.options.source;\n\t\t}\n\t},\n\n\t_searchTimeout: function( event ) {\n\t\tclearTimeout( this.searching );\n\t\tthis.searching = this._delay(function() {\n\n\t\t\t// Search if the value has changed, or if the user retypes the same value (see #7434)\n\t\t\tvar equalValues = this.term === this._value(),\n\t\t\t\tmenuVisible = this.menu.element.is( \":visible\" ),\n\t\t\t\tmodifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n\n\t\t\tif ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.search( null, event );\n\t\t\t}\n\t\t}, this.options.delay );\n\t},\n\n\tsearch: function( value, event ) {\n\t\tvalue = value != null ? value : this._value();\n\n\t\t// always save the actual value, not the one passed as an argument\n\t\tthis.term = this._value();\n\n\t\tif ( value.length < this.options.minLength ) {\n\t\t\treturn this.close( event );\n\t\t}\n\n\t\tif ( this._trigger( \"search\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._search( value );\n\t},\n\n\t_search: function( value ) {\n\t\tthis.pending++;\n\t\tthis.element.addClass( \"ui-autocomplete-loading\" );\n\t\tthis.cancelSearch = false;\n\n\t\tthis.source( { term: value }, this._response() );\n\t},\n\n\t_response: function() {\n\t\tvar index = ++this.requestIndex;\n\n\t\treturn $.proxy(function( content ) {\n\t\t\tif ( index === this.requestIndex ) {\n\t\t\t\tthis.__response( content );\n\t\t\t}\n\n\t\t\tthis.pending--;\n\t\t\tif ( !this.pending ) {\n\t\t\t\tthis.element.removeClass( \"ui-autocomplete-loading\" );\n\t\t\t}\n\t\t}, this );\n\t},\n\n\t__response: function( content ) {\n\t\tif ( content ) {\n\t\t\tcontent = this._normalize( content );\n\t\t}\n\t\tthis._trigger( \"response\", null, { content: content } );\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\n\t\t\tthis._suggest( content );\n\t\t\tthis._trigger( \"open\" );\n\t\t} else {\n\t\t\t// use ._close() instead of .close() so we don't cancel future searches\n\t\t\tthis._close();\n\t\t}\n\t},\n\n\tclose: function( event ) {\n\t\tthis.cancelSearch = true;\n\t\tthis._close( event );\n\t},\n\n\t_close: function( event ) {\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.menu.element.hide();\n\t\t\tthis.menu.blur();\n\t\t\tthis.isNewMenu = true;\n\t\t\tthis._trigger( \"close\", event );\n\t\t}\n\t},\n\n\t_change: function( event ) {\n\t\tif ( this.previous !== this._value() ) {\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\n\t\t}\n\t},\n\n\t_normalize: function( items ) {\n\t\t// assume all items have the right format when the first item is complete\n\t\tif ( items.length && items[ 0 ].label && items[ 0 ].value ) {\n\t\t\treturn items;\n\t\t}\n\t\treturn $.map( items, function( item ) {\n\t\t\tif ( typeof item === \"string\" ) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: item,\n\t\t\t\t\tvalue: item\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn $.extend( {}, item, {\n\t\t\t\tlabel: item.label || item.value,\n\t\t\t\tvalue: item.value || item.label\n\t\t\t});\n\t\t});\n\t},\n\n\t_suggest: function( items ) {\n\t\tvar ul = this.menu.element.empty();\n\t\tthis._renderMenu( ul, items );\n\t\tthis.isNewMenu = true;\n\t\tthis.menu.refresh();\n\n\t\t// size and position menu\n\t\tul.show();\n\t\tthis._resizeMenu();\n\t\tul.position( $.extend({\n\t\t\tof: this.element\n\t\t}, this.options.position ) );\n\n\t\tif ( this.options.autoFocus ) {\n\t\t\tthis.menu.next();\n\t\t}\n\t},\n\n\t_resizeMenu: function() {\n\t\tvar ul = this.menu.element;\n\t\tul.outerWidth( Math.max(\n\t\t\t// Firefox wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping (#7513)\n\t\t\tul.width( \"\" ).outerWidth() + 1,\n\t\t\tthis.element.outerWidth()\n\t\t) );\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this;\n\t\t$.each( items, function( index, item ) {\n\t\t\tthat._renderItemData( ul, item );\n\t\t});\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\treturn $( \"<li>\" ).text( item.label ).appendTo( ul );\n\t},\n\n\t_move: function( direction, event ) {\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.search( null, event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\n\t\t\t\tthis.menu.isLastItem() && /^next/.test( direction ) ) {\n\n\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\tthis._value( this.term );\n\t\t\t}\n\n\t\t\tthis.menu.blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.menu[ direction ]( event );\n\t},\n\n\twidget: function() {\n\t\treturn this.menu.element;\n\t},\n\n\t_value: function() {\n\t\treturn this.valueMethod.apply( this.element, arguments );\n\t},\n\n\t_keyEvent: function( keyEvent, event ) {\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis._move( keyEvent, event );\n\n\t\t\t// prevents moving cursor to beginning/end of the text field in some browsers\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n});\n\n$.extend( $.ui.autocomplete, {\n\tescapeRegex: function( value ) {\n\t\treturn value.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" );\n\t},\n\tfilter: function( array, term ) {\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), \"i\" );\n\t\treturn $.grep( array, function( value ) {\n\t\t\treturn matcher.test( value.label || value.value || value );\n\t\t});\n\t}\n});\n\n// live region extension, adding a `messages` option\n// NOTE: This is an experimental API. We are still investigating\n// a full solution for string manipulation and internationalization.\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\n\toptions: {\n\t\tmessages: {\n\t\t\tnoResults: \"No search results.\",\n\t\t\tresults: function( amount ) {\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\n\t\t\t}\n\t\t}\n\t},\n\n\t__response: function( content ) {\n\t\tvar message;\n\t\tthis._superApply( arguments );\n\t\tif ( this.options.disabled || this.cancelSearch ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( content && content.length ) {\n\t\t\tmessage = this.options.messages.results( content.length );\n\t\t} else {\n\t\t\tmessage = this.options.messages.noResults;\n\t\t}\n\t\tthis.liveRegion.children().hide();\n\t\t$( \"<div>\" ).text( message ).appendTo( this.liveRegion );\n\t}\n});\n\nvar autocomplete = $.ui.autocomplete;\n\n\n/*!\n * jQuery UI Button 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/button/\n */\n\n\nvar lastActive,\n\tbaseClasses = \"ui-button ui-widget ui-state-default ui-corner-all\",\n\ttypeClasses = \"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",\n\tformResetHandler = function() {\n\t\tvar form = $( this );\n\t\tsetTimeout(function() {\n\t\t\tform.find( \":ui-button\" ).button( \"refresh\" );\n\t\t}, 1 );\n\t},\n\tradioGroup = function( radio ) {\n\t\tvar name = radio.name,\n\t\t\tform = radio.form,\n\t\t\tradios = $( [] );\n\t\tif ( name ) {\n\t\t\tname = name.replace( /'/g, \"\\\\'\" );\n\t\t\tif ( form ) {\n\t\t\t\tradios = $( form ).find( \"[name='\" + name + \"'][type=radio]\" );\n\t\t\t} else {\n\t\t\t\tradios = $( \"[name='\" + name + \"'][type=radio]\", radio.ownerDocument )\n\t\t\t\t\t.filter(function() {\n\t\t\t\t\t\treturn !this.form;\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn radios;\n\t};\n\n$.widget( \"ui.button\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<button>\",\n\toptions: {\n\t\tdisabled: null,\n\t\ttext: true,\n\t\tlabel: null,\n\t\ticons: {\n\t\t\tprimary: null,\n\t\t\tsecondary: null\n\t\t}\n\t},\n\t_create: function() {\n\t\tthis.element.closest( \"form\" )\n\t\t\t.unbind( \"reset\" + this.eventNamespace )\n\t\t\t.bind( \"reset\" + this.eventNamespace, formResetHandler );\n\n\t\tif ( typeof this.options.disabled !== \"boolean\" ) {\n\t\t\tthis.options.disabled = !!this.element.prop( \"disabled\" );\n\t\t} else {\n\t\t\tthis.element.prop( \"disabled\", this.options.disabled );\n\t\t}\n\n\t\tthis._determineButtonType();\n\t\tthis.hasTitle = !!this.buttonElement.attr( \"title\" );\n\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\ttoggleButton = this.type === \"checkbox\" || this.type === \"radio\",\n\t\t\tactiveClass = !toggleButton ? \"ui-state-active\" : \"\";\n\n\t\tif ( options.label === null ) {\n\t\t\toptions.label = (this.type === \"input\" ? this.buttonElement.val() : this.buttonElement.html());\n\t\t}\n\n\t\tthis._hoverable( this.buttonElement );\n\n\t\tthis.buttonElement\n\t\t\t.addClass( baseClasses )\n\t\t\t.attr( \"role\", \"button\" )\n\t\t\t.bind( \"mouseenter\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( this === lastActive ) {\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t}\n\t\t\t})\n\t\t\t.bind( \"mouseleave\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$( this ).removeClass( activeClass );\n\t\t\t})\n\t\t\t.bind( \"click\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Can't use _focusable() because the element that receives focus\n\t\t// and the element that gets the ui-state-focus class are different\n\t\tthis._on({\n\t\t\tfocus: function() {\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tblur: function() {\n\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\n\t\tif ( toggleButton ) {\n\t\t\tthis.element.bind( \"change\" + this.eventNamespace, function() {\n\t\t\t\tthat.refresh();\n\t\t\t});\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"radio\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\tthat.buttonElement.attr( \"aria-pressed\", \"true\" );\n\n\t\t\t\tvar radio = that.element[ 0 ];\n\t\t\t\tradioGroup( radio )\n\t\t\t\t\t.not( radio )\n\t\t\t\t\t.map(function() {\n\t\t\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t\t\t})\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t});\n\t\t} else {\n\t\t\tthis.buttonElement\n\t\t\t\t.bind( \"mousedown\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\tlastActive = this;\n\t\t\t\t\tthat.document.one( \"mouseup\", function() {\n\t\t\t\t\t\tlastActive = null;\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.bind( \"mouseup\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t})\n\t\t\t\t.bind( \"keydown\" + this.eventNamespace, function(event) {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {\n\t\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t// see #8559, we bind to blur here in case the button element loses\n\t\t\t\t// focus between keydown and keyup, it would be left in an \"active\" state\n\t\t\t\t.bind( \"keyup\" + this.eventNamespace + \" blur\" + this.eventNamespace, function() {\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t});\n\n\t\t\tif ( this.buttonElement.is(\"a\") ) {\n\t\t\t\tthis.buttonElement.keyup(function(event) {\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\n\t\t\t\t\t\t// TODO pass through original event correctly (just as 2nd argument doesn't work)\n\t\t\t\t\t\t$( this ).click();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis._setOption( \"disabled\", options.disabled );\n\t\tthis._resetButton();\n\t},\n\n\t_determineButtonType: function() {\n\t\tvar ancestor, labelSelector, checked;\n\n\t\tif ( this.element.is(\"[type=checkbox]\") ) {\n\t\t\tthis.type = \"checkbox\";\n\t\t} else if ( this.element.is(\"[type=radio]\") ) {\n\t\t\tthis.type = \"radio\";\n\t\t} else if ( this.element.is(\"input\") ) {\n\t\t\tthis.type = \"input\";\n\t\t} else {\n\t\t\tthis.type = \"button\";\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t// we don't search against the document in case the element\n\t\t\t// is disconnected from the DOM\n\t\t\tancestor = this.element.parents().last();\n\t\t\tlabelSelector = \"label[for='\" + this.element.attr(\"id\") + \"']\";\n\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\tancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();\n\t\t\t\tthis.buttonElement = ancestor.filter( labelSelector );\n\t\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.element.addClass( \"ui-helper-hidden-accessible\" );\n\n\t\t\tchecked = this.element.is( \":checked\" );\n\t\t\tif ( checked ) {\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-active\" );\n\t\t\t}\n\t\t\tthis.buttonElement.prop( \"aria-pressed\", checked );\n\t\t} else {\n\t\t\tthis.buttonElement = this.element;\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.buttonElement;\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-helper-hidden-accessible\" );\n\t\tthis.buttonElement\n\t\t\t.removeClass( baseClasses + \" ui-state-active \" + typeClasses )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-pressed\" )\n\t\t\t.html( this.buttonElement.find(\".ui-button-text\").html() );\n\n\t\tif ( !this.hasTitle ) {\n\t\t\tthis.buttonElement.removeAttr( \"title\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget().toggleClass( \"ui-state-disabled\", !!value );\n\t\t\tthis.element.prop( \"disabled\", !!value );\n\t\t\tif ( value ) {\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\n\t\t\t\t} else {\n\t\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus ui-state-active\" );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis._resetButton();\n\t},\n\n\trefresh: function() {\n\t\t//See #8237 & #8828\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ? this.element.is( \":disabled\" ) : this.element.hasClass( \"ui-button-disabled\" );\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOption( \"disabled\", isDisabled );\n\t\t}\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tradioGroup( this.element[0] ).each(function() {\n\t\t\t\tif ( $( this ).is( \":checked\" ) ) {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"checkbox\" ) {\n\t\t\tif ( this.element.is( \":checked\" ) ) {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t} else {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetButton: function() {\n\t\tif ( this.type === \"input\" ) {\n\t\t\tif ( this.options.label ) {\n\t\t\t\tthis.element.val( this.options.label );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tvar buttonElement = this.buttonElement.removeClass( typeClasses ),\n\t\t\tbuttonText = $( \"<span></span>\", this.document[0] )\n\t\t\t\t.addClass( \"ui-button-text\" )\n\t\t\t\t.html( this.options.label )\n\t\t\t\t.appendTo( buttonElement.empty() )\n\t\t\t\t.text(),\n\t\t\ticons = this.options.icons,\n\t\t\tmultipleIcons = icons.primary && icons.secondary,\n\t\t\tbuttonClasses = [];\n\n\t\tif ( icons.primary || icons.secondary ) {\n\t\t\tif ( this.options.text ) {\n\t\t\t\tbuttonClasses.push( \"ui-button-text-icon\" + ( multipleIcons ? \"s\" : ( icons.primary ? \"-primary\" : \"-secondary\" ) ) );\n\t\t\t}\n\n\t\t\tif ( icons.primary ) {\n\t\t\t\tbuttonElement.prepend( \"<span class='ui-button-icon-primary ui-icon \" + icons.primary + \"'></span>\" );\n\t\t\t}\n\n\t\t\tif ( icons.secondary ) {\n\t\t\t\tbuttonElement.append( \"<span class='ui-button-icon-secondary ui-icon \" + icons.secondary + \"'></span>\" );\n\t\t\t}\n\n\t\t\tif ( !this.options.text ) {\n\t\t\t\tbuttonClasses.push( multipleIcons ? \"ui-button-icons-only\" : \"ui-button-icon-only\" );\n\n\t\t\t\tif ( !this.hasTitle ) {\n\t\t\t\t\tbuttonElement.attr( \"title\", $.trim( buttonText ) );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbuttonClasses.push( \"ui-button-text-only\" );\n\t\t}\n\t\tbuttonElement.addClass( buttonClasses.join( \" \" ) );\n\t}\n});\n\n$.widget( \"ui.buttonset\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\titems: \"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)\"\n\t},\n\n\t_create: function() {\n\t\tthis.element.addClass( \"ui-buttonset\" );\n\t},\n\n\t_init: function() {\n\t\tthis.refresh();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.buttons.button( \"option\", key, value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\trefresh: function() {\n\t\tvar rtl = this.element.css( \"direction\" ) === \"rtl\",\n\t\t\tallButtons = this.element.find( this.options.items ),\n\t\t\texistingButtons = allButtons.filter( \":ui-button\" );\n\n\t\t// Initialize new buttons\n\t\tallButtons.not( \":ui-button\" ).button();\n\n\t\t// Refresh existing buttons\n\t\texistingButtons.button( \"refresh\" );\n\n\t\tthis.buttons = allButtons\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-all ui-corner-left ui-corner-right\" )\n\t\t\t\t.filter( \":first\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-right\" : \"ui-corner-left\" )\n\t\t\t\t.end()\n\t\t\t\t.filter( \":last\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-left\" : \"ui-corner-right\" )\n\t\t\t\t.end()\n\t\t\t.end();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeClass( \"ui-buttonset\" );\n\t\tthis.buttons\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-left ui-corner-right\" )\n\t\t\t.end()\n\t\t\t.button( \"destroy\" );\n\t}\n});\n\nvar button = $.ui.button;\n\n\n/*!\n * jQuery UI Datepicker 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/datepicker/\n */\n\n\n$.extend($.ui, { datepicker: { version: \"1.11.4\" } });\n\nvar datepicker_instActive;\n\nfunction datepicker_getZindex( elem ) {\n\tvar position, value;\n\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t// This makes behavior of this function consistent across browsers\n\t\t// WebKit always returns auto if the element is positioned\n\t\tposition = elem.css( \"position\" );\n\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t// other browsers return a string\n\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\telem = elem.parent();\n\t}\n\n\treturn 0;\n}\n/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. */\n\nfunction Datepicker() {\n\tthis._curInst = null; // The current instance in use\n\tthis._keyEvent = false; // If the last event was a key event\n\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\n\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\n\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\n\tthis._mainDivId = \"ui-datepicker-div\"; // The ID of the main datepicker division\n\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\n\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\n\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\n\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\n\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\n\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\n\tthis.regional = []; // Available regional settings, indexed by language code\n\tthis.regional[\"\"] = { // Default regional settings\n\t\tcloseText: \"Done\", // Display text for close link\n\t\tprevText: \"Prev\", // Display text for previous month link\n\t\tnextText: \"Next\", // Display text for next month link\n\t\tcurrentText: \"Today\", // Display text for current month link\n\t\tmonthNames: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\n\t\t\t\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"], // Names of months for drop-down and formatting\n\t\tmonthNamesShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], // For formatting\n\t\tdayNames: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], // For formatting\n\t\tdayNamesShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], // For formatting\n\t\tdayNamesMin: [\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"], // Column headings for days starting at Sunday\n\t\tweekHeader: \"Wk\", // Column header for week of the year\n\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\n\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\n\t\tisRTL: false, // True if right-to-left language, false if left-to-right\n\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\n\t\tyearSuffix: \"\" // Additional text to append to the year in the month headers\n\t};\n\tthis._defaults = { // Global defaults for all the date picker instances\n\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\n\t\t\t// \"button\" for trigger button, or \"both\" for either\n\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\n\t\tshowOptions: {}, // Options for enhanced animations\n\t\tdefaultDate: null, // Used when field is blank: actual date,\n\t\t\t// +/-number for offset from today, null for today\n\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\n\t\tbuttonText: \"...\", // Text for trigger button\n\t\tbuttonImage: \"\", // URL for trigger button image\n\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\n\t\thideIfNoPrevNext: false, // True to hide next/previous month links\n\t\t\t// if not applicable, false to just disable them\n\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\n\t\tgotoCurrent: false, // True if today link goes back to current selection instead\n\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\n\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\n\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\n\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\n\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\n\t\tshowWeek: false, // True to show week of the year, false to not show it\n\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\n\t\t\t// takes a Date and returns the number of the week for it\n\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\n\t\t\t// > this are in the previous century,\n\t\t\t// string value starting with \"+\" for current year + value\n\t\tminDate: null, // The earliest selectable date, or null for no limit\n\t\tmaxDate: null, // The latest selectable date, or null for no limit\n\t\tduration: \"fast\", // Duration of display/closure\n\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\n\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\tbeforeShow: null, // Function that takes an input field and\n\t\t\t// returns a set of custom settings for the date picker\n\t\tonSelect: null, // Define a callback function when a date is selected\n\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\n\t\tonClose: null, // Define a callback function when the datepicker is closed\n\t\tnumberOfMonths: 1, // Number of months to show at a time\n\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\n\t\tstepMonths: 1, // Number of months to step back/forward\n\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\n\t\taltField: \"\", // Selector for an alternate field to store selected dates into\n\t\taltFormat: \"\", // The date format to use for the alternate field\n\t\tconstrainInput: true, // The input is constrained by the current date format\n\t\tshowButtonPanel: false, // True to show button panel, false to not show it\n\t\tautoSize: false, // True to size the input for the date format, false to leave as is\n\t\tdisabled: false // The initial disabled state\n\t};\n\t$.extend(this._defaults, this.regional[\"\"]);\n\tthis.regional.en = $.extend( true, {}, this.regional[ \"\" ]);\n\tthis.regional[ \"en-US\" ] = $.extend( true, {}, this.regional.en );\n\tthis.dpDiv = datepicker_bindHover($(\"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\"));\n}\n\n$.extend(Datepicker.prototype, {\n\t/* Class name added to elements to indicate already configured with a date picker. */\n\tmarkerClassName: \"hasDatepicker\",\n\n\t//Keep track of the maximum number of rows displayed (see #7043)\n\tmaxRows: 4,\n\n\t// TODO rename to \"widget\" when switching to widget factory\n\t_widgetDatepicker: function() {\n\t\treturn this.dpDiv;\n\t},\n\n\t/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t */\n\tsetDefaults: function(settings) {\n\t\tdatepicker_extendRemove(this._defaults, settings || {});\n\t\treturn this;\n\t},\n\n\t/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t */\n\t_attachDatepicker: function(target, settings) {\n\t\tvar nodeName, inline, inst;\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tinline = (nodeName === \"div\" || nodeName === \"span\");\n\t\tif (!target.id) {\n\t\t\tthis.uuid += 1;\n\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t}\n\t\tinst = this._newInst($(target), inline);\n\t\tinst.settings = $.extend({}, settings || {});\n\t\tif (nodeName === \"input\") {\n\t\t\tthis._connectDatepicker(target, inst);\n\t\t} else if (inline) {\n\t\t\tthis._inlineDatepicker(target, inst);\n\t\t}\n\t},\n\n\t/* Create a new instance object. */\n\t_newInst: function(target, inline) {\n\t\tvar id = target[0].id.replace(/([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\"); // escape jQuery meta chars\n\t\treturn {id: id, input: target, // associated target\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\n\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\n\t\t\tinline: inline, // is datepicker inline or not\n\t\t\tdpDiv: (!inline ? this.dpDiv : // presentation div\n\t\t\tdatepicker_bindHover($(\"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\")))};\n\t},\n\n\t/* Attach the date picker to an input field. */\n\t_connectDatepicker: function(target, inst) {\n\t\tvar input = $(target);\n\t\tinst.append = $([]);\n\t\tinst.trigger = $([]);\n\t\tif (input.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._attachments(input, inst);\n\t\tinput.addClass(this.markerClassName).keydown(this._doKeyDown).\n\t\t\tkeypress(this._doKeyPress).keyup(this._doKeyUp);\n\t\tthis._autoSize(inst);\n\t\t$.data(target, \"datepicker\", inst);\n\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\tif( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t},\n\n\t/* Make attachments based on settings. */\n\t_attachments: function(input, inst) {\n\t\tvar showOn, buttonText, buttonImage,\n\t\t\tappendText = this._get(inst, \"appendText\"),\n\t\t\tisRTL = this._get(inst, \"isRTL\");\n\n\t\tif (inst.append) {\n\t\t\tinst.append.remove();\n\t\t}\n\t\tif (appendText) {\n\t\t\tinst.append = $(\"<span class='\" + this._appendClass + \"'>\" + appendText + \"</span>\");\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.append);\n\t\t}\n\n\t\tinput.unbind(\"focus\", this._showDatepicker);\n\n\t\tif (inst.trigger) {\n\t\t\tinst.trigger.remove();\n\t\t}\n\n\t\tshowOn = this._get(inst, \"showOn\");\n\t\tif (showOn === \"focus\" || showOn === \"both\") { // pop-up date picker when in the marked field\n\t\t\tinput.focus(this._showDatepicker);\n\t\t}\n\t\tif (showOn === \"button\" || showOn === \"both\") { // pop-up date picker when button clicked\n\t\t\tbuttonText = this._get(inst, \"buttonText\");\n\t\t\tbuttonImage = this._get(inst, \"buttonImage\");\n\t\t\tinst.trigger = $(this._get(inst, \"buttonImageOnly\") ?\n\t\t\t\t$(\"<img/>\").addClass(this._triggerClass).\n\t\t\t\t\tattr({ src: buttonImage, alt: buttonText, title: buttonText }) :\n\t\t\t\t$(\"<button type='button'></button>\").addClass(this._triggerClass).\n\t\t\t\t\thtml(!buttonImage ? buttonText : $(\"<img/>\").attr(\n\t\t\t\t\t{ src:buttonImage, alt:buttonText, title:buttonText })));\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.trigger);\n\t\t\tinst.trigger.click(function() {\n\t\t\t\tif ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t} else {\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t},\n\n\t/* Apply the maximum length for the date format. */\n\t_autoSize: function(inst) {\n\t\tif (this._get(inst, \"autoSize\") && !inst.inline) {\n\t\t\tvar findMax, max, maxI, i,\n\t\t\t\tdate = new Date(2009, 12 - 1, 20), // Ensure double digits\n\t\t\t\tdateFormat = this._get(inst, \"dateFormat\");\n\n\t\t\tif (dateFormat.match(/[DM]/)) {\n\t\t\t\tfindMax = function(names) {\n\t\t\t\t\tmax = 0;\n\t\t\t\t\tmaxI = 0;\n\t\t\t\t\tfor (i = 0; i < names.length; i++) {\n\t\t\t\t\t\tif (names[i].length > max) {\n\t\t\t\t\t\t\tmax = names[i].length;\n\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn maxI;\n\t\t\t\t};\n\t\t\t\tdate.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\"))));\n\t\t\t\tdate.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\"))) + 20 - date.getDay());\n\t\t\t}\n\t\t\tinst.input.attr(\"size\", this._formatDate(inst, date).length);\n\t\t}\n\t},\n\n\t/* Attach an inline date picker to a div. */\n\t_inlineDatepicker: function(target, inst) {\n\t\tvar divSpan = $(target);\n\t\tif (divSpan.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\t\tdivSpan.addClass(this.markerClassName).append(inst.dpDiv);\n\t\t$.data(target, \"datepicker\", inst);\n\t\tthis._setDate(inst, this._getDefaultDate(inst), true);\n\t\tthis._updateDatepicker(inst);\n\t\tthis._updateAlternate(inst);\n\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\tif( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\n\t\tinst.dpDiv.css( \"display\", \"block\" );\n\t},\n\n\t/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t */\n\t_dialogDatepicker: function(input, date, onSelect, settings, pos) {\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\n\t\t\tinst = this._dialogInst; // internal instance\n\n\t\tif (!inst) {\n\t\t\tthis.uuid += 1;\n\t\t\tid = \"dp\" + this.uuid;\n\t\t\tthis._dialogInput = $(\"<input type='text' id='\" + id +\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'/>\");\n\t\t\tthis._dialogInput.keydown(this._doKeyDown);\n\t\t\t$(\"body\").append(this._dialogInput);\n\t\t\tinst = this._dialogInst = this._newInst(this._dialogInput, false);\n\t\t\tinst.settings = {};\n\t\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\n\t\t}\n\t\tdatepicker_extendRemove(inst.settings, settings || {});\n\t\tdate = (date && date.constructor === Date ? this._formatDate(inst, date) : date);\n\t\tthis._dialogInput.val(date);\n\n\t\tthis._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);\n\t\tif (!this._pos) {\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\tthis._pos = // should use actual width/height below\n\t\t\t\t[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];\n\t\t}\n\n\t\t// move input on screen for focus, but hidden behind dialog\n\t\tthis._dialogInput.css(\"left\", (this._pos[0] + 20) + \"px\").css(\"top\", this._pos[1] + \"px\");\n\t\tinst.settings.onSelect = onSelect;\n\t\tthis._inDialog = true;\n\t\tthis.dpDiv.addClass(this._dialogClass);\n\t\tthis._showDatepicker(this._dialogInput[0]);\n\t\tif ($.blockUI) {\n\t\t\t$.blockUI(this.dpDiv);\n\t\t}\n\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\n\t\treturn this;\n\t},\n\n\t/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_destroyDatepicker: function(target) {\n\t\tvar nodeName,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, \"datepicker\");\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\t$.removeData(target, \"datepicker\");\n\t\tif (nodeName === \"input\") {\n\t\t\tinst.append.remove();\n\t\t\tinst.trigger.remove();\n\t\t\t$target.removeClass(this.markerClassName).\n\t\t\t\tunbind(\"focus\", this._showDatepicker).\n\t\t\t\tunbind(\"keydown\", this._doKeyDown).\n\t\t\t\tunbind(\"keypress\", this._doKeyPress).\n\t\t\t\tunbind(\"keyup\", this._doKeyUp);\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\t$target.removeClass(this.markerClassName).empty();\n\t\t}\n\n\t\tif ( datepicker_instActive === inst ) {\n\t\t\tdatepicker_instActive = null;\n\t\t}\n\t},\n\n\t/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_enableDatepicker: function(target) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, \"datepicker\");\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif (nodeName === \"input\") {\n\t\t\ttarget.disabled = false;\n\t\t\tinst.trigger.filter(\"button\").\n\t\t\t\teach(function() { this.disabled = false; }).end().\n\t\t\t\tfilter(\"img\").css({opacity: \"1.0\", cursor: \"\"});\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\tinline.children().removeClass(\"ui-state-disabled\");\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\n\t\t\t\tprop(\"disabled\", false);\n\t\t}\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\n\t\t\tfunction(value) { return (value === target ? null : value); }); // delete entry\n\t},\n\n\t/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_disableDatepicker: function(target) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, \"datepicker\");\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif (nodeName === \"input\") {\n\t\t\ttarget.disabled = true;\n\t\t\tinst.trigger.filter(\"button\").\n\t\t\t\teach(function() { this.disabled = true; }).end().\n\t\t\t\tfilter(\"img\").css({opacity: \"0.5\", cursor: \"default\"});\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\tinline.children().addClass(\"ui-state-disabled\");\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\n\t\t\t\tprop(\"disabled\", true);\n\t\t}\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\n\t\t\tfunction(value) { return (value === target ? null : value); }); // delete entry\n\t\tthis._disabledInputs[this._disabledInputs.length] = target;\n\t},\n\n\t/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t */\n\t_isDisabledDatepicker: function(target) {\n\t\tif (!target) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (var i = 0; i < this._disabledInputs.length; i++) {\n\t\t\tif (this._disabledInputs[i] === target) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t */\n\t_getInst: function(target) {\n\t\ttry {\n\t\t\treturn $.data(target, \"datepicker\");\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t}\n\t},\n\n\t/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t */\n\t_optionDatepicker: function(target, name, value) {\n\t\tvar settings, date, minDate, maxDate,\n\t\t\tinst = this._getInst(target);\n\n\t\tif (arguments.length === 2 && typeof name === \"string\") {\n\t\t\treturn (name === \"defaults\" ? $.extend({}, $.datepicker._defaults) :\n\t\t\t\t(inst ? (name === \"all\" ? $.extend({}, inst.settings) :\n\t\t\t\tthis._get(inst, name)) : null));\n\t\t}\n\n\t\tsettings = name || {};\n\t\tif (typeof name === \"string\") {\n\t\t\tsettings = {};\n\t\t\tsettings[name] = value;\n\t\t}\n\n\t\tif (inst) {\n\t\t\tif (this._curInst === inst) {\n\t\t\t\tthis._hideDatepicker();\n\t\t\t}\n\n\t\t\tdate = this._getDateDatepicker(target, true);\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\");\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\");\n\t\t\tdatepicker_extendRemove(inst.settings, settings);\n\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\n\t\t\tif (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {\n\t\t\t\tinst.settings.minDate = this._formatDate(inst, minDate);\n\t\t\t}\n\t\t\tif (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {\n\t\t\t\tinst.settings.maxDate = this._formatDate(inst, maxDate);\n\t\t\t}\n\t\t\tif ( \"disabled\" in settings ) {\n\t\t\t\tif ( settings.disabled ) {\n\t\t\t\t\tthis._disableDatepicker(target);\n\t\t\t\t} else {\n\t\t\t\t\tthis._enableDatepicker(target);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._attachments($(target), inst);\n\t\t\tthis._autoSize(inst);\n\t\t\tthis._setDate(inst, date);\n\t\t\tthis._updateAlternate(inst);\n\t\t\tthis._updateDatepicker(inst);\n\t\t}\n\t},\n\n\t// change method deprecated\n\t_changeDatepicker: function(target, name, value) {\n\t\tthis._optionDatepicker(target, name, value);\n\t},\n\n\t/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t */\n\t_refreshDatepicker: function(target) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst) {\n\t\t\tthis._updateDatepicker(inst);\n\t\t}\n\t},\n\n\t/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t */\n\t_setDateDatepicker: function(target, date) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst) {\n\t\t\tthis._setDate(inst, date);\n\t\t\tthis._updateDatepicker(inst);\n\t\t\tthis._updateAlternate(inst);\n\t\t}\n\t},\n\n\t/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t */\n\t_getDateDatepicker: function(target, noDefault) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst && !inst.inline) {\n\t\t\tthis._setDateFromField(inst, noDefault);\n\t\t}\n\t\treturn (inst ? this._getDate(inst) : null);\n\t},\n\n\t/* Handle keystrokes. */\n\t_doKeyDown: function(event) {\n\t\tvar onSelect, dateStr, sel,\n\t\t\tinst = $.datepicker._getInst(event.target),\n\t\t\thandled = true,\n\t\t\tisRTL = inst.dpDiv.is(\".ui-datepicker-rtl\");\n\n\t\tinst._keyEvent = true;\n\t\tif ($.datepicker._datepickerShowing) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\n\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\tbreak; // hide on tab out\n\t\t\t\tcase 13: sel = $(\"td.\" + $.datepicker._dayOverClass + \":not(.\" +\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv);\n\t\t\t\t\t\tif (sel[0]) {\n\t\t\t\t\t\t\t$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect = $.datepicker._get(inst, \"onSelect\");\n\t\t\t\t\t\tif (onSelect) {\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate(inst);\n\n\t\t\t\t\t\t\t// trigger custom callback\n\t\t\t\t\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false; // don't submit the form\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\n\t\t\t\t\t\tbreak; // hide on escape\n\t\t\t\tcase 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\n\t\t\t\tcase 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\n\t\t\t\tcase 35: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._clearDate(event.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // clear on ctrl or command +end\n\t\t\t\tcase 36: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._gotoToday(event.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // current on ctrl or command +home\n\t\t\t\tcase 37: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t// -1 day on ctrl or command +left\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// next month/year on alt +left on Mac\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 38: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, -7, \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\n\t\t\t\tcase 39: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t// +1 day on ctrl or command +right\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// next month/year on alt +right\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 40: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, +7, \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\n\t\t\t\tdefault: handled = false;\n\t\t\t}\n\t\t} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home\n\t\t\t$.datepicker._showDatepicker(this);\n\t\t} else {\n\t\t\thandled = false;\n\t\t}\n\n\t\tif (handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t/* Filter entered characters - based on date format. */\n\t_doKeyPress: function(event) {\n\t\tvar chars, chr,\n\t\t\tinst = $.datepicker._getInst(event.target);\n\n\t\tif ($.datepicker._get(inst, \"constrainInput\")) {\n\t\t\tchars = $.datepicker._possibleChars($.datepicker._get(inst, \"dateFormat\"));\n\t\t\tchr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);\n\t\t\treturn event.ctrlKey || event.metaKey || (chr < \" \" || !chars || chars.indexOf(chr) > -1);\n\t\t}\n\t},\n\n\t/* Synchronise manual entry and field/alternate field. */\n\t_doKeyUp: function(event) {\n\t\tvar date,\n\t\t\tinst = $.datepicker._getInst(event.target);\n\n\t\tif (inst.input.val() !== inst.lastVal) {\n\t\t\ttry {\n\t\t\t\tdate = $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\n\t\t\t\t\t(inst.input ? inst.input.val() : null),\n\t\t\t\t\t$.datepicker._getFormatConfig(inst));\n\n\t\t\t\tif (date) { // only if valid\n\t\t\t\t\t$.datepicker._setDateFromField(inst);\n\t\t\t\t\t$.datepicker._updateAlternate(inst);\n\t\t\t\t\t$.datepicker._updateDatepicker(inst);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\t/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t */\n\t_showDatepicker: function(input) {\n\t\tinput = input.target || input;\n\t\tif (input.nodeName.toLowerCase() !== \"input\") { // find from button/image trigger\n\t\t\tinput = $(\"input\", input.parentNode)[0];\n\t\t}\n\n\t\tif ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here\n\t\t\treturn;\n\t\t}\n\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\n\t\t\toffset, showAnim, duration;\n\n\t\tinst = $.datepicker._getInst(input);\n\t\tif ($.datepicker._curInst && $.datepicker._curInst !== inst) {\n\t\t\t$.datepicker._curInst.dpDiv.stop(true, true);\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );\n\t\t\t}\n\t\t}\n\n\t\tbeforeShow = $.datepicker._get(inst, \"beforeShow\");\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};\n\t\tif(beforeShowSettings === false){\n\t\t\treturn;\n\t\t}\n\t\tdatepicker_extendRemove(inst.settings, beforeShowSettings);\n\n\t\tinst.lastVal = null;\n\t\t$.datepicker._lastInput = input;\n\t\t$.datepicker._setDateFromField(inst);\n\n\t\tif ($.datepicker._inDialog) { // hide cursor\n\t\t\tinput.value = \"\";\n\t\t}\n\t\tif (!$.datepicker._pos) { // position below input\n\t\t\t$.datepicker._pos = $.datepicker._findPos(input);\n\t\t\t$.datepicker._pos[1] += input.offsetHeight; // add the height\n\t\t}\n\n\t\tisFixed = false;\n\t\t$(input).parents().each(function() {\n\t\t\tisFixed |= $(this).css(\"position\") === \"fixed\";\n\t\t\treturn !isFixed;\n\t\t});\n\n\t\toffset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};\n\t\t$.datepicker._pos = null;\n\t\t//to avoid flashes on Firefox\n\t\tinst.dpDiv.empty();\n\t\t// determine sizing offscreen\n\t\tinst.dpDiv.css({position: \"absolute\", display: \"block\", top: \"-1000px\"});\n\t\t$.datepicker._updateDatepicker(inst);\n\t\t// fix width for dynamic number of date pickers\n\t\t// and adjust position before showing\n\t\toffset = $.datepicker._checkOffset(inst, offset, isFixed);\n\t\tinst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?\n\t\t\t\"static\" : (isFixed ? \"fixed\" : \"absolute\")), display: \"none\",\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\"});\n\n\t\tif (!inst.inline) {\n\t\t\tshowAnim = $.datepicker._get(inst, \"showAnim\");\n\t\t\tduration = $.datepicker._get(inst, \"duration\");\n\t\t\tinst.dpDiv.css( \"z-index\", datepicker_getZindex( $( input ) ) + 1 );\n\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\n\t\t\t\tinst.dpDiv.show(showAnim, $.datepicker._get(inst, \"showOptions\"), duration);\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[showAnim || \"show\"](showAnim ? duration : null);\n\t\t\t}\n\n\t\t\tif ( $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\t\tinst.input.focus();\n\t\t\t}\n\n\t\t\t$.datepicker._curInst = inst;\n\t\t}\n\t},\n\n\t/* Generate the date picker content. */\n\t_updateDatepicker: function(inst) {\n\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\n\t\tdatepicker_instActive = inst; // for delegate hover events\n\t\tinst.dpDiv.empty().append(this._generateHTML(inst));\n\t\tthis._attachHandlers(inst);\n\n\t\tvar origyearshtml,\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\n\t\t\tcols = numMonths[1],\n\t\t\twidth = 17,\n\t\t\tactiveCell = inst.dpDiv.find( \".\" + this._dayOverClass + \" a\" );\n\n\t\tif ( activeCell.length > 0 ) {\n\t\t\tdatepicker_handleMouseover.apply( activeCell.get( 0 ) );\n\t\t}\n\n\t\tinst.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\");\n\t\tif (cols > 1) {\n\t\t\tinst.dpDiv.addClass(\"ui-datepicker-multi-\" + cols).css(\"width\", (width * cols) + \"em\");\n\t\t}\n\t\tinst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? \"add\" : \"remove\") +\n\t\t\t\"Class\"](\"ui-datepicker-multi\");\n\t\tinst.dpDiv[(this._get(inst, \"isRTL\") ? \"add\" : \"remove\") +\n\t\t\t\"Class\"](\"ui-datepicker-rtl\");\n\n\t\tif (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\tinst.input.focus();\n\t\t}\n\n\t\t// deffered render of the years select (to avoid flashes on Firefox)\n\t\tif( inst.yearshtml ){\n\t\t\torigyearshtml = inst.yearshtml;\n\t\t\tsetTimeout(function(){\n\t\t\t\t//assure that inst.yearshtml didn't change.\n\t\t\t\tif( origyearshtml === inst.yearshtml && inst.yearshtml ){\n\t\t\t\t\tinst.dpDiv.find(\"select.ui-datepicker-year:first\").replaceWith(inst.yearshtml);\n\t\t\t\t}\n\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t}, 0);\n\t\t}\n\t},\n\n\t// #6694 - don't focus the input if it's already focused\n\t// this breaks the change event in IE\n\t// Support: IE and jQuery <1.9\n\t_shouldFocusInput: function( inst ) {\n\t\treturn inst.input && inst.input.is( \":visible\" ) && !inst.input.is( \":disabled\" ) && !inst.input.is( \":focus\" );\n\t},\n\n\t/* Check positioning to remain on screen. */\n\t_checkOffset: function(inst, offset, isFixed) {\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\tviewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),\n\t\t\tviewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());\n\n\t\toffset.left -= (this._get(inst, \"isRTL\") ? (dpWidth - inputWidth) : 0);\n\t\toffset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;\n\t\toffset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;\n\n\t\t// now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\toffset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?\n\t\t\tMath.abs(offset.left + dpWidth - viewWidth) : 0);\n\t\toffset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?\n\t\t\tMath.abs(dpHeight + inputHeight) : 0);\n\n\t\treturn offset;\n\t},\n\n\t/* Find an object's position on the screen. */\n\t_findPos: function(obj) {\n\t\tvar position,\n\t\t\tinst = this._getInst(obj),\n\t\t\tisRTL = this._get(inst, \"isRTL\");\n\n\t\twhile (obj && (obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {\n\t\t\tobj = obj[isRTL ? \"previousSibling\" : \"nextSibling\"];\n\t\t}\n\n\t\tposition = $(obj).offset();\n\t\treturn [position.left, position.top];\n\t},\n\n\t/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t */\n\t_hideDatepicker: function(input) {\n\t\tvar showAnim, duration, postProcess, onClose,\n\t\t\tinst = this._curInst;\n\n\t\tif (!inst || (input && inst !== $.data(input, \"datepicker\"))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._datepickerShowing) {\n\t\t\tshowAnim = this._get(inst, \"showAnim\");\n\t\t\tduration = this._get(inst, \"duration\");\n\t\t\tpostProcess = function() {\n\t\t\t\t$.datepicker._tidyDialog(inst);\n\t\t\t};\n\n\t\t\t// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {\n\t\t\t\tinst.dpDiv.hide(showAnim, $.datepicker._get(inst, \"showOptions\"), duration, postProcess);\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[(showAnim === \"slideDown\" ? \"slideUp\" :\n\t\t\t\t\t(showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\"))]((showAnim ? duration : null), postProcess);\n\t\t\t}\n\n\t\t\tif (!showAnim) {\n\t\t\t\tpostProcess();\n\t\t\t}\n\t\t\tthis._datepickerShowing = false;\n\n\t\t\tonClose = this._get(inst, \"onClose\");\n\t\t\tif (onClose) {\n\t\t\t\tonClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : \"\"), inst]);\n\t\t\t}\n\n\t\t\tthis._lastInput = null;\n\t\t\tif (this._inDialog) {\n\t\t\t\tthis._dialogInput.css({ position: \"absolute\", left: \"0\", top: \"-100px\" });\n\t\t\t\tif ($.blockUI) {\n\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t$(\"body\").append(this.dpDiv);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._inDialog = false;\n\t\t}\n\t},\n\n\t/* Tidy up after a dialog display. */\n\t_tidyDialog: function(inst) {\n\t\tinst.dpDiv.removeClass(this._dialogClass).unbind(\".ui-datepicker-calendar\");\n\t},\n\n\t/* Close date picker if clicked elsewhere. */\n\t_checkExternalClick: function(event) {\n\t\tif (!$.datepicker._curInst) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $target = $(event.target),\n\t\t\tinst = $.datepicker._getInst($target[0]);\n\n\t\tif ( ( ( $target[0].id !== $.datepicker._mainDivId &&\n\t\t\t\t$target.parents(\"#\" + $.datepicker._mainDivId).length === 0 &&\n\t\t\t\t!$target.hasClass($.datepicker.markerClassName) &&\n\t\t\t\t!$target.closest(\".\" + $.datepicker._triggerClass).length &&\n\t\t\t\t$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||\n\t\t\t( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {\n\t\t\t\t$.datepicker._hideDatepicker();\n\t\t}\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustDate: function(id, offset, period) {\n\t\tvar target = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tif (this._isDisabledDatepicker(target[0])) {\n\t\t\treturn;\n\t\t}\n\t\tthis._adjustInstDate(inst, offset +\n\t\t\t(period === \"M\" ? this._get(inst, \"showCurrentAtPos\") : 0), // undo positioning\n\t\t\tperiod);\n\t\tthis._updateDatepicker(inst);\n\t},\n\n\t/* Action for current link. */\n\t_gotoToday: function(id) {\n\t\tvar date,\n\t\t\ttarget = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tif (this._get(inst, \"gotoCurrent\") && inst.currentDay) {\n\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t} else {\n\t\t\tdate = new Date();\n\t\t\tinst.selectedDay = date.getDate();\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t}\n\t\tthis._notifyChange(inst);\n\t\tthis._adjustDate(target);\n\t},\n\n\t/* Action for selecting a new month/year. */\n\t_selectMonthYear: function(id, select, period) {\n\t\tvar target = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tinst[\"selected\" + (period === \"M\" ? \"Month\" : \"Year\")] =\n\t\tinst[\"draw\" + (period === \"M\" ? \"Month\" : \"Year\")] =\n\t\t\tparseInt(select.options[select.selectedIndex].value,10);\n\n\t\tthis._notifyChange(inst);\n\t\tthis._adjustDate(target);\n\t},\n\n\t/* Action for selecting a day. */\n\t_selectDay: function(id, month, year, td) {\n\t\tvar inst,\n\t\t\ttarget = $(id);\n\n\t\tif ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {\n\t\t\treturn;\n\t\t}\n\n\t\tinst = this._getInst(target[0]);\n\t\tinst.selectedDay = inst.currentDay = $(\"a\", td).html();\n\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\tinst.selectedYear = inst.currentYear = year;\n\t\tthis._selectDate(id, this._formatDate(inst,\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear));\n\t},\n\n\t/* Erase the input field and hide the date picker. */\n\t_clearDate: function(id) {\n\t\tvar target = $(id);\n\t\tthis._selectDate(target, \"\");\n\t},\n\n\t/* Update the input field with the selected date. */\n\t_selectDate: function(id, dateStr) {\n\t\tvar onSelect,\n\t\t\ttarget = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tdateStr = (dateStr != null ? dateStr : this._formatDate(inst));\n\t\tif (inst.input) {\n\t\t\tinst.input.val(dateStr);\n\t\t}\n\t\tthis._updateAlternate(inst);\n\n\t\tonSelect = this._get(inst, \"onSelect\");\n\t\tif (onSelect) {\n\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback\n\t\t} else if (inst.input) {\n\t\t\tinst.input.trigger(\"change\"); // fire the change event\n\t\t}\n\n\t\tif (inst.inline){\n\t\t\tthis._updateDatepicker(inst);\n\t\t} else {\n\t\t\tthis._hideDatepicker();\n\t\t\tthis._lastInput = inst.input[0];\n\t\t\tif (typeof(inst.input[0]) !== \"object\") {\n\t\t\t\tinst.input.focus(); // restore focus\n\t\t\t}\n\t\t\tthis._lastInput = null;\n\t\t}\n\t},\n\n\t/* Update any alternate field to synchronise with the main field. */\n\t_updateAlternate: function(inst) {\n\t\tvar altFormat, date, dateStr,\n\t\t\taltField = this._get(inst, \"altField\");\n\n\t\tif (altField) { // update alternate field too\n\t\t\taltFormat = this._get(inst, \"altFormat\") || this._get(inst, \"dateFormat\");\n\t\t\tdate = this._getDate(inst);\n\t\t\tdateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));\n\t\t\t$(altField).each(function() { $(this).val(dateStr); });\n\t\t}\n\t},\n\n\t/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t */\n\tnoWeekends: function(date) {\n\t\tvar day = date.getDay();\n\t\treturn [(day > 0 && day < 6), \"\"];\n\t},\n\n\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t */\n\tiso8601Week: function(date) {\n\t\tvar time,\n\t\t\tcheckDate = new Date(date.getTime());\n\n\t\t// Find Thursday of this week starting on Monday\n\t\tcheckDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));\n\n\t\ttime = checkDate.getTime();\n\t\tcheckDate.setMonth(0); // Compare with Jan 1\n\t\tcheckDate.setDate(1);\n\t\treturn Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n\t},\n\n\t/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t */\n\tparseDate: function (format, value, settings) {\n\t\tif (format == null || value == null) {\n\t\t\tthrow \"Invalid arguments\";\n\t\t}\n\n\t\tvalue = (typeof value === \"object\" ? value.toString() : value + \"\");\n\t\tif (value === \"\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar iFormat, dim, extra,\n\t\t\tiValue = 0,\n\t\t\tshortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,\n\t\t\tshortYearCutoff = (typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\t\t\tyear = -1,\n\t\t\tmonth = -1,\n\t\t\tday = -1,\n\t\t\tdoy = -1,\n\t\t\tliteral = false,\n\t\t\tdate,\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\t\t\t// Extract a number from the string value\n\t\t\tgetNumber = function(match) {\n\t\t\t\tvar isDoubled = lookAhead(match),\n\t\t\t\t\tsize = (match === \"@\" ? 14 : (match === \"!\" ? 20 :\n\t\t\t\t\t(match === \"y\" && isDoubled ? 4 : (match === \"o\" ? 3 : 2)))),\n\t\t\t\t\tminSize = (match === \"y\" ? size : 1),\n\t\t\t\t\tdigits = new RegExp(\"^\\\\d{\" + minSize + \",\" + size + \"}\"),\n\t\t\t\t\tnum = value.substring(iValue).match(digits);\n\t\t\t\tif (!num) {\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue += num[0].length;\n\t\t\t\treturn parseInt(num[0], 10);\n\t\t\t},\n\t\t\t// Extract a name from the string value and convert to an index\n\t\t\tgetName = function(match, shortNames, longNames) {\n\t\t\t\tvar index = -1,\n\t\t\t\t\tnames = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {\n\t\t\t\t\t\treturn [ [k, v] ];\n\t\t\t\t\t}).sort(function (a, b) {\n\t\t\t\t\t\treturn -(a[1].length - b[1].length);\n\t\t\t\t\t});\n\n\t\t\t\t$.each(names, function (i, pair) {\n\t\t\t\t\tvar name = pair[1];\n\t\t\t\t\tif (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {\n\t\t\t\t\t\tindex = pair[0];\n\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\treturn index + 1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Confirm that a literal character matches the string value\n\t\t\tcheckLiteral = function() {\n\t\t\t\tif (value.charAt(iValue) !== format.charAt(iFormat)) {\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue++;\n\t\t\t};\n\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\tif (literal) {\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tday = getNumber(\"d\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\tgetName(\"D\", dayNamesShort, dayNames);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\tdoy = getNumber(\"o\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tmonth = getNumber(\"m\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tmonth = getName(\"M\", monthNamesShort, monthNames);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tyear = getNumber(\"y\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\tdate = new Date(getNumber(\"@\"));\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\tdate = new Date((getNumber(\"!\") - this._ticksTo1970) / 10000);\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif (lookAhead(\"'\")){\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (iValue < value.length){\n\t\t\textra = value.substr(iValue);\n\t\t\tif (!/^\\s+/.test(extra)) {\n\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\n\t\t\t}\n\t\t}\n\n\t\tif (year === -1) {\n\t\t\tyear = new Date().getFullYear();\n\t\t} else if (year < 100) {\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\n\t\t\t\t(year <= shortYearCutoff ? 0 : -100);\n\t\t}\n\n\t\tif (doy > -1) {\n\t\t\tmonth = 1;\n\t\t\tday = doy;\n\t\t\tdo {\n\t\t\t\tdim = this._getDaysInMonth(year, month - 1);\n\t\t\t\tif (day <= dim) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmonth++;\n\t\t\t\tday -= dim;\n\t\t\t} while (true);\n\t\t}\n\n\t\tdate = this._daylightSavingAdjust(new Date(year, month - 1, day));\n\t\tif (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {\n\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\n\t\t}\n\t\treturn date;\n\t},\n\n\t/* Standard date formats. */\n\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\n\tCOOKIE: \"D, dd M yy\",\n\tISO_8601: \"yy-mm-dd\",\n\tRFC_822: \"D, d M y\",\n\tRFC_850: \"DD, dd-M-y\",\n\tRFC_1036: \"D, d M y\",\n\tRFC_1123: \"D, d M yy\",\n\tRFC_2822: \"D, d M yy\",\n\tRSS: \"D, d M y\", // RFC 822\n\tTICKS: \"!\",\n\tTIMESTAMP: \"@\",\n\tW3C: \"yy-mm-dd\", // ISO 8601\n\n\t_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +\n\t\tMath.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),\n\n\t/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01/01/1970)\n\t * ! - Windows ticks (100ns since 01/01/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t */\n\tformatDate: function (format, date, settings) {\n\t\tif (!date) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar iFormat,\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\t\t\t// Format a number, with leading zero if necessary\n\t\t\tformatNumber = function(match, value, len) {\n\t\t\t\tvar num = \"\" + value;\n\t\t\t\tif (lookAhead(match)) {\n\t\t\t\t\twhile (num.length < len) {\n\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn num;\n\t\t\t},\n\t\t\t// Format a name, short or long as requested\n\t\t\tformatName = function(match, value, shortNames, longNames) {\n\t\t\t\treturn (lookAhead(match) ? longNames[value] : shortNames[value]);\n\t\t\t},\n\t\t\toutput = \"\",\n\t\t\tliteral = false;\n\n\t\tif (date) {\n\t\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\t\tif (literal) {\n\t\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\toutput += formatNumber(\"d\", date.getDate(), 2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\toutput += formatName(\"D\", date.getDay(), dayNamesShort, dayNames);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\toutput += formatNumber(\"o\",\n\t\t\t\t\t\t\t\tMath.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\toutput += formatNumber(\"m\", date.getMonth() + 1, 2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\toutput += formatName(\"M\", date.getMonth(), monthNamesShort, monthNames);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\toutput += (lookAhead(\"y\") ? date.getFullYear() :\n\t\t\t\t\t\t\t\t(date.getYear() % 100 < 10 ? \"0\" : \"\") + date.getYear() % 100);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t/* Extract all possible characters from the date format. */\n\t_possibleChars: function (format) {\n\t\tvar iFormat,\n\t\t\tchars = \"\",\n\t\t\tliteral = false,\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t};\n\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\tif (literal) {\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\n\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\": case \"M\":\n\t\t\t\t\t\treturn null; // Accept anything\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t},\n\n\t/* Get a setting value, defaulting if necessary. */\n\t_get: function(inst, name) {\n\t\treturn inst.settings[name] !== undefined ?\n\t\t\tinst.settings[name] : this._defaults[name];\n\t},\n\n\t/* Parse existing date and initialise date picker. */\n\t_setDateFromField: function(inst, noDefault) {\n\t\tif (inst.input.val() === inst.lastVal) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar dateFormat = this._get(inst, \"dateFormat\"),\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\tdefaultDate = this._getDefaultDate(inst),\n\t\t\tdate = defaultDate,\n\t\t\tsettings = this._getFormatConfig(inst);\n\n\t\ttry {\n\t\t\tdate = this.parseDate(dateFormat, dates, settings) || defaultDate;\n\t\t} catch (event) {\n\t\t\tdates = (noDefault ? \"\" : dates);\n\t\t}\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tinst.currentDay = (dates ? date.getDate() : 0);\n\t\tinst.currentMonth = (dates ? date.getMonth() : 0);\n\t\tinst.currentYear = (dates ? date.getFullYear() : 0);\n\t\tthis._adjustInstDate(inst);\n\t},\n\n\t/* Retrieve the default date shown on opening. */\n\t_getDefaultDate: function(inst) {\n\t\treturn this._restrictMinMax(inst,\n\t\t\tthis._determineDate(inst, this._get(inst, \"defaultDate\"), new Date()));\n\t},\n\n\t/* A date may be specified as an exact value or a relative one. */\n\t_determineDate: function(inst, date, defaultDate) {\n\t\tvar offsetNumeric = function(offset) {\n\t\t\t\tvar date = new Date();\n\t\t\t\tdate.setDate(date.getDate() + offset);\n\t\t\t\treturn date;\n\t\t\t},\n\t\t\toffsetString = function(offset) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig(inst));\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\tvar date = (offset.toLowerCase().match(/^c/) ?\n\t\t\t\t\t$.datepicker._getDate(inst) : null) || new Date(),\n\t\t\t\t\tyear = date.getFullYear(),\n\t\t\t\t\tmonth = date.getMonth(),\n\t\t\t\t\tday = date.getDate(),\n\t\t\t\t\tpattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\n\t\t\t\t\tmatches = pattern.exec(offset);\n\n\t\t\t\twhile (matches) {\n\t\t\t\t\tswitch (matches[2] || \"d\") {\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\n\t\t\t\t\t\t\tday += parseInt(matches[1],10); break;\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\n\t\t\t\t\t\t\tday += parseInt(matches[1],10) * 7; break;\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\n\t\t\t\t\t\t\tmonth += parseInt(matches[1],10);\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\n\t\t\t\t\t\t\tyear += parseInt(matches[1],10);\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tmatches = pattern.exec(offset);\n\t\t\t\t}\n\t\t\t\treturn new Date(year, month, day);\n\t\t\t},\n\t\t\tnewDate = (date == null || date === \"\" ? defaultDate : (typeof date === \"string\" ? offsetString(date) :\n\t\t\t\t(typeof date === \"number\" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));\n\n\t\tnewDate = (newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate);\n\t\tif (newDate) {\n\t\t\tnewDate.setHours(0);\n\t\t\tnewDate.setMinutes(0);\n\t\t\tnewDate.setSeconds(0);\n\t\t\tnewDate.setMilliseconds(0);\n\t\t}\n\t\treturn this._daylightSavingAdjust(newDate);\n\t},\n\n\t/* Handle switch to/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t */\n\t_daylightSavingAdjust: function(date) {\n\t\tif (!date) {\n\t\t\treturn null;\n\t\t}\n\t\tdate.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\n\t\treturn date;\n\t},\n\n\t/* Set the date(s) directly. */\n\t_setDate: function(inst, date, noChange) {\n\t\tvar clear = !date,\n\t\t\torigMonth = inst.selectedMonth,\n\t\t\torigYear = inst.selectedYear,\n\t\t\tnewDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));\n\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\tif ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {\n\t\t\tthis._notifyChange(inst);\n\t\t}\n\t\tthis._adjustInstDate(inst);\n\t\tif (inst.input) {\n\t\t\tinst.input.val(clear ? \"\" : this._formatDate(inst));\n\t\t}\n\t},\n\n\t/* Retrieve the date(s) directly. */\n\t_getDate: function(inst) {\n\t\tvar startDate = (!inst.currentYear || (inst.input && inst.input.val() === \"\") ? null :\n\t\t\tthis._daylightSavingAdjust(new Date(\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay)));\n\t\t\treturn startDate;\n\t},\n\n\t/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t */\n\t_attachHandlers: function(inst) {\n\t\tvar stepMonths = this._get(inst, \"stepMonths\"),\n\t\t\tid = \"#\" + inst.id.replace( /\\\\\\\\/g, \"\\\\\" );\n\t\tinst.dpDiv.find(\"[data-handler]\").map(function () {\n\t\t\tvar handler = {\n\t\t\t\tprev: function () {\n\t\t\t\t\t$.datepicker._adjustDate(id, -stepMonths, \"M\");\n\t\t\t\t},\n\t\t\t\tnext: function () {\n\t\t\t\t\t$.datepicker._adjustDate(id, +stepMonths, \"M\");\n\t\t\t\t},\n\t\t\t\thide: function () {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t},\n\t\t\t\ttoday: function () {\n\t\t\t\t\t$.datepicker._gotoToday(id);\n\t\t\t\t},\n\t\t\t\tselectDay: function () {\n\t\t\t\t\t$.datepicker._selectDay(id, +this.getAttribute(\"data-month\"), +this.getAttribute(\"data-year\"), this);\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectMonth: function () {\n\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"M\");\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectYear: function () {\n\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"Y\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t$(this).bind(this.getAttribute(\"data-event\"), handler[this.getAttribute(\"data-handler\")]);\n\t\t});\n\t},\n\n\t/* Generate the HTML for the current state of the date picker. */\n\t_generateHTML: function(inst) {\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\n\t\t\ttempDate = new Date(),\n\t\t\ttoday = this._daylightSavingAdjust(\n\t\t\t\tnew Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time\n\t\t\tisRTL = this._get(inst, \"isRTL\"),\n\t\t\tshowButtonPanel = this._get(inst, \"showButtonPanel\"),\n\t\t\thideIfNoPrevNext = this._get(inst, \"hideIfNoPrevNext\"),\n\t\t\tnavigationAsDateFormat = this._get(inst, \"navigationAsDateFormat\"),\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\n\t\t\tshowCurrentAtPos = this._get(inst, \"showCurrentAtPos\"),\n\t\t\tstepMonths = this._get(inst, \"stepMonths\"),\n\t\t\tisMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),\n\t\t\tcurrentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :\n\t\t\t\tnew Date(inst.currentYear, inst.currentMonth, inst.currentDay))),\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\tdrawYear = inst.drawYear;\n\n\t\tif (drawMonth < 0) {\n\t\t\tdrawMonth += 12;\n\t\t\tdrawYear--;\n\t\t}\n\t\tif (maxDate) {\n\t\t\tmaxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),\n\t\t\t\tmaxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));\n\t\t\tmaxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);\n\t\t\twhile (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {\n\t\t\t\tdrawMonth--;\n\t\t\t\tif (drawMonth < 0) {\n\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinst.drawMonth = drawMonth;\n\t\tinst.drawYear = drawYear;\n\n\t\tprevText = this._get(inst, \"prevText\");\n\t\tprevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),\n\t\t\tthis._getFormatConfig(inst)));\n\n\t\tprev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?\n\t\t\t\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'\" +\n\t\t\t\" title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"</span></a>\" :\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\"+ prevText +\"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"</span></a>\"));\n\n\t\tnextText = this._get(inst, \"nextText\");\n\t\tnextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),\n\t\t\tthis._getFormatConfig(inst)));\n\n\t\tnext = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?\n\t\t\t\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'\" +\n\t\t\t\" title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"</span></a>\" :\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\"+ nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"</span></a>\"));\n\n\t\tcurrentText = this._get(inst, \"currentText\");\n\t\tgotoDate = (this._get(inst, \"gotoCurrent\") && inst.currentDay ? currentDate : today);\n\t\tcurrentText = (!navigationAsDateFormat ? currentText :\n\t\t\tthis.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));\n\n\t\tcontrols = (!inst.inline ? \"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\" +\n\t\t\tthis._get(inst, \"closeText\") + \"</button>\" : \"\");\n\n\t\tbuttonPanel = (showButtonPanel) ? \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" + (isRTL ? controls : \"\") +\n\t\t\t(this._isInRange(inst, gotoDate) ? \"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'\" +\n\t\t\t\">\" + currentText + \"</button>\" : \"\") + (isRTL ? \"\" : controls) + \"</div>\" : \"\";\n\n\t\tfirstDay = parseInt(this._get(inst, \"firstDay\"),10);\n\t\tfirstDay = (isNaN(firstDay) ? 0 : firstDay);\n\n\t\tshowWeek = this._get(inst, \"showWeek\");\n\t\tdayNames = this._get(inst, \"dayNames\");\n\t\tdayNamesMin = this._get(inst, \"dayNamesMin\");\n\t\tmonthNames = this._get(inst, \"monthNames\");\n\t\tmonthNamesShort = this._get(inst, \"monthNamesShort\");\n\t\tbeforeShowDay = this._get(inst, \"beforeShowDay\");\n\t\tshowOtherMonths = this._get(inst, \"showOtherMonths\");\n\t\tselectOtherMonths = this._get(inst, \"selectOtherMonths\");\n\t\tdefaultDate = this._getDefaultDate(inst);\n\t\thtml = \"\";\n\t\tdow;\n\t\tfor (row = 0; row < numMonths[0]; row++) {\n\t\t\tgroup = \"\";\n\t\t\tthis.maxRows = 4;\n\t\t\tfor (col = 0; col < numMonths[1]; col++) {\n\t\t\t\tselectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));\n\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\tcalender = \"\";\n\t\t\t\tif (isMultiMonth) {\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\n\t\t\t\t\tif (numMonths[1] > 1) {\n\t\t\t\t\t\tswitch (col) {\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"right\" : \"left\"); break;\n\t\t\t\t\t\t\tcase numMonths[1]-1: calender += \" ui-datepicker-group-last\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"left\" : \"right\"); break;\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcalender += \"'>\";\n\t\t\t\t}\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\n\t\t\t\t\t(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : \"\") +\n\t\t\t\t\t(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : \"\") +\n\t\t\t\t\tthis._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers\n\t\t\t\t\t\"</div><table class='ui-datepicker-calendar'><thead>\" +\n\t\t\t\t\t\"<tr>\";\n\t\t\t\tthead = (showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get(inst, \"weekHeader\") + \"</th>\" : \"\");\n\t\t\t\tfor (dow = 0; dow < 7; dow++) { // days of the week\n\t\t\t\t\tday = (dow + firstDay) % 7;\n\t\t\t\t\tthead += \"<th scope='col'\" + ((dow + firstDay + 6) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\") + \">\" +\n\t\t\t\t\t\t\"<span title='\" + dayNames[day] + \"'>\" + dayNamesMin[day] + \"</span></th>\";\n\t\t\t\t}\n\t\t\t\tcalender += thead + \"</tr></thead><tbody>\";\n\t\t\t\tdaysInMonth = this._getDaysInMonth(drawYear, drawMonth);\n\t\t\t\tif (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {\n\t\t\t\t\tinst.selectedDay = Math.min(inst.selectedDay, daysInMonth);\n\t\t\t\t}\n\t\t\t\tleadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;\n\t\t\t\tcurRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate\n\t\t\t\tnumRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)\n\t\t\t\tthis.maxRows = numRows;\n\t\t\t\tprintDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));\n\t\t\t\tfor (dRow = 0; dRow < numRows; dRow++) { // create date picker rows\n\t\t\t\t\tcalender += \"<tr>\";\n\t\t\t\t\ttbody = (!showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\n\t\t\t\t\t\tthis._get(inst, \"calculateWeek\")(printDate) + \"</td>\");\n\t\t\t\t\tfor (dow = 0; dow < 7; dow++) { // create date picker days\n\t\t\t\t\t\tdaySettings = (beforeShowDay ?\n\t\t\t\t\t\t\tbeforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, \"\"]);\n\t\t\t\t\t\totherMonth = (printDate.getMonth() !== drawMonth);\n\t\t\t\t\t\tunselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||\n\t\t\t\t\t\t\t(minDate && printDate < minDate) || (maxDate && printDate > maxDate);\n\t\t\t\t\t\ttbody += \"<td class='\" +\n\t\t\t\t\t\t\t((dow + firstDay + 6) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\") + // highlight weekends\n\t\t\t\t\t\t\t(otherMonth ? \" ui-datepicker-other-month\" : \"\") + // highlight days from other months\n\t\t\t\t\t\t\t((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key\n\t\t\t\t\t\t\t(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?\n\t\t\t\t\t\t\t// or defaultDate is current printedDate and defaultDate is selectedDate\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\") + // highlight selected day\n\t\t\t\t\t\t\t(unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\": \"\") +  // highlight unselectable days\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[1] + // highlight custom dates\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\") + // highlight selected day\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\")) + \"'\" + // highlight today (if different)\n\t\t\t\t\t\t\t((!otherMonth || showOtherMonths) && daySettings[2] ? \" title='\" + daySettings[2].replace(/'/g, \"&#39;\") + \"'\" : \"\") + // cell title\n\t\t\t\t\t\t\t(unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\") + \">\" + // actions\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \"&#xa0;\" : // display for other months\n\t\t\t\t\t\t\t(unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"</span>\" : \"<a class='ui-state-default\" +\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\") +\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\") + // highlight selected day\n\t\t\t\t\t\t\t(otherMonth ? \" ui-priority-secondary\" : \"\") + // distinguish dates from other months\n\t\t\t\t\t\t\t\"' href='#'>\" + printDate.getDate() + \"</a>\")) + \"</td>\"; // display selectable date\n\t\t\t\t\t\tprintDate.setDate(printDate.getDate() + 1);\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust(printDate);\n\t\t\t\t\t}\n\t\t\t\t\tcalender += tbody + \"</tr>\";\n\t\t\t\t}\n\t\t\t\tdrawMonth++;\n\t\t\t\tif (drawMonth > 11) {\n\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\tdrawYear++;\n\t\t\t\t}\n\t\t\t\tcalender += \"</tbody></table>\" + (isMultiMonth ? \"</div>\" +\n\t\t\t\t\t\t\t((numMonths[0] > 0 && col === numMonths[1]-1) ? \"<div class='ui-datepicker-row-break'></div>\" : \"\") : \"\");\n\t\t\t\tgroup += calender;\n\t\t\t}\n\t\t\thtml += group;\n\t\t}\n\t\thtml += buttonPanel;\n\t\tinst._keyEvent = false;\n\t\treturn html;\n\t},\n\n\t/* Generate the month and year header. */\n\t_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\tsecondary, monthNames, monthNamesShort) {\n\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\n\t\t\tchangeMonth = this._get(inst, \"changeMonth\"),\n\t\t\tchangeYear = this._get(inst, \"changeYear\"),\n\t\t\tshowMonthAfterYear = this._get(inst, \"showMonthAfterYear\"),\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\n\t\t\tmonthHtml = \"\";\n\n\t\t// month selection\n\t\tif (secondary || !changeMonth) {\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[drawMonth] + \"</span>\";\n\t\t} else {\n\t\t\tinMinYear = (minDate && minDate.getFullYear() === drawYear);\n\t\t\tinMaxYear = (maxDate && maxDate.getFullYear() === drawYear);\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\";\n\t\t\tfor ( month = 0; month < 12; month++) {\n\t\t\t\tif ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\n\t\t\t\t\t\t(month === drawMonth ? \" selected='selected'\" : \"\") +\n\t\t\t\t\t\t\">\" + monthNamesShort[month] + \"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonthHtml += \"</select>\";\n\t\t}\n\n\t\tif (!showMonthAfterYear) {\n\t\t\thtml += monthHtml + (secondary || !(changeMonth && changeYear) ? \"&#xa0;\" : \"\");\n\t\t}\n\n\t\t// year selection\n\t\tif ( !inst.yearshtml ) {\n\t\t\tinst.yearshtml = \"\";\n\t\t\tif (secondary || !changeYear) {\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"</span>\";\n\t\t\t} else {\n\t\t\t\t// determine range of years to display\n\t\t\t\tyears = this._get(inst, \"yearRange\").split(\":\");\n\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\tdetermineYear = function(value) {\n\t\t\t\t\tvar year = (value.match(/c[+\\-].*/) ? drawYear + parseInt(value.substring(1), 10) :\n\t\t\t\t\t\t(value.match(/[+\\-].*/) ? thisYear + parseInt(value, 10) :\n\t\t\t\t\t\tparseInt(value, 10)));\n\t\t\t\t\treturn (isNaN(year) ? thisYear : year);\n\t\t\t\t};\n\t\t\t\tyear = determineYear(years[0]);\n\t\t\t\tendYear = Math.max(year, determineYear(years[1] || \"\"));\n\t\t\t\tyear = (minDate ? Math.max(year, minDate.getFullYear()) : year);\n\t\t\t\tendYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";\n\t\t\t\tfor (; year <= endYear; year++) {\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\n\t\t\t\t\t\t(year === drawYear ? \" selected='selected'\" : \"\") +\n\t\t\t\t\t\t\">\" + year + \"</option>\";\n\t\t\t\t}\n\t\t\t\tinst.yearshtml += \"</select>\";\n\n\t\t\t\thtml += inst.yearshtml;\n\t\t\t\tinst.yearshtml = null;\n\t\t\t}\n\t\t}\n\n\t\thtml += this._get(inst, \"yearSuffix\");\n\t\tif (showMonthAfterYear) {\n\t\t\thtml += (secondary || !(changeMonth && changeYear) ? \"&#xa0;\" : \"\") + monthHtml;\n\t\t}\n\t\thtml += \"</div>\"; // Close datepicker_header\n\t\treturn html;\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustInstDate: function(inst, offset, period) {\n\t\tvar year = inst.drawYear + (period === \"Y\" ? offset : 0),\n\t\t\tmonth = inst.drawMonth + (period === \"M\" ? offset : 0),\n\t\t\tday = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === \"D\" ? offset : 0),\n\t\t\tdate = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));\n\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tif (period === \"M\" || period === \"Y\") {\n\t\t\tthis._notifyChange(inst);\n\t\t}\n\t},\n\n\t/* Ensure a date is within any min/max bounds. */\n\t_restrictMinMax: function(inst, date) {\n\t\tvar minDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tnewDate = (minDate && date < minDate ? minDate : date);\n\t\treturn (maxDate && newDate > maxDate ? maxDate : newDate);\n\t},\n\n\t/* Notify change of month/year. */\n\t_notifyChange: function(inst) {\n\t\tvar onChange = this._get(inst, \"onChangeMonthYear\");\n\t\tif (onChange) {\n\t\t\tonChange.apply((inst.input ? inst.input[0] : null),\n\t\t\t\t[inst.selectedYear, inst.selectedMonth + 1, inst]);\n\t\t}\n\t},\n\n\t/* Determine the number of months to show. */\n\t_getNumberOfMonths: function(inst) {\n\t\tvar numMonths = this._get(inst, \"numberOfMonths\");\n\t\treturn (numMonths == null ? [1, 1] : (typeof numMonths === \"number\" ? [1, numMonths] : numMonths));\n\t},\n\n\t/* Determine the current maximum date - ensure no time components are set. */\n\t_getMinMaxDate: function(inst, minMax) {\n\t\treturn this._determineDate(inst, this._get(inst, minMax + \"Date\"), null);\n\t},\n\n\t/* Find the number of days in a given month. */\n\t_getDaysInMonth: function(year, month) {\n\t\treturn 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();\n\t},\n\n\t/* Find the day of the week of the first of a month. */\n\t_getFirstDayOfMonth: function(year, month) {\n\t\treturn new Date(year, month, 1).getDay();\n\t},\n\n\t/* Determines if we should allow a \"next/prev\" month display change. */\n\t_canAdjustMonth: function(inst, offset, curYear, curMonth) {\n\t\tvar numMonths = this._getNumberOfMonths(inst),\n\t\t\tdate = this._daylightSavingAdjust(new Date(curYear,\n\t\t\tcurMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));\n\n\t\tif (offset < 0) {\n\t\t\tdate.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));\n\t\t}\n\t\treturn this._isInRange(inst, date);\n\t},\n\n\t/* Is the given date in the accepted range? */\n\t_isInRange: function(inst, date) {\n\t\tvar yearSplit, currentYear,\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tminYear = null,\n\t\t\tmaxYear = null,\n\t\t\tyears = this._get(inst, \"yearRange\");\n\t\t\tif (years){\n\t\t\t\tyearSplit = years.split(\":\");\n\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\tminYear = parseInt(yearSplit[0], 10);\n\t\t\t\tmaxYear = parseInt(yearSplit[1], 10);\n\t\t\t\tif ( yearSplit[0].match(/[+\\-].*/) ) {\n\t\t\t\t\tminYear += currentYear;\n\t\t\t\t}\n\t\t\t\tif ( yearSplit[1].match(/[+\\-].*/) ) {\n\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn ((!minDate || date.getTime() >= minDate.getTime()) &&\n\t\t\t(!maxDate || date.getTime() <= maxDate.getTime()) &&\n\t\t\t(!minYear || date.getFullYear() >= minYear) &&\n\t\t\t(!maxYear || date.getFullYear() <= maxYear));\n\t},\n\n\t/* Provide the configuration settings for formatting/parsing. */\n\t_getFormatConfig: function(inst) {\n\t\tvar shortYearCutoff = this._get(inst, \"shortYearCutoff\");\n\t\tshortYearCutoff = (typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\n\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));\n\t\treturn {shortYearCutoff: shortYearCutoff,\n\t\t\tdayNamesShort: this._get(inst, \"dayNamesShort\"), dayNames: this._get(inst, \"dayNames\"),\n\t\t\tmonthNamesShort: this._get(inst, \"monthNamesShort\"), monthNames: this._get(inst, \"monthNames\")};\n\t},\n\n\t/* Format the given date for display. */\n\t_formatDate: function(inst, day, month, year) {\n\t\tif (!day) {\n\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\tinst.currentYear = inst.selectedYear;\n\t\t}\n\t\tvar date = (day ? (typeof day === \"object\" ? day :\n\t\t\tthis._daylightSavingAdjust(new Date(year, month, day))) :\n\t\t\tthis._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));\n\t\treturn this.formatDate(this._get(inst, \"dateFormat\"), date, this._getFormatConfig(inst));\n\t}\n});\n\n/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */\nfunction datepicker_bindHover(dpDiv) {\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\treturn dpDiv.delegate(selector, \"mouseout\", function() {\n\t\t\t$(this).removeClass(\"ui-state-hover\");\n\t\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t\t$(this).removeClass(\"ui-datepicker-prev-hover\");\n\t\t\t}\n\t\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t\t$(this).removeClass(\"ui-datepicker-next-hover\");\n\t\t\t}\n\t\t})\n\t\t.delegate( selector, \"mouseover\", datepicker_handleMouseover );\n}\n\nfunction datepicker_handleMouseover() {\n\tif (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {\n\t\t$(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\");\n\t\t$(this).addClass(\"ui-state-hover\");\n\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t$(this).addClass(\"ui-datepicker-prev-hover\");\n\t\t}\n\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t$(this).addClass(\"ui-datepicker-next-hover\");\n\t\t}\n\t}\n}\n\n/* jQuery extend now ignores nulls! */\nfunction datepicker_extendRemove(target, props) {\n\t$.extend(target, props);\n\tfor (var name in props) {\n\t\tif (props[name] == null) {\n\t\t\ttarget[name] = props[name];\n\t\t}\n\t}\n\treturn target;\n}\n\n/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object */\n$.fn.datepicker = function(options){\n\n\t/* Verify an empty collection wasn't passed - Fixes #6976 */\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\t/* Initialise the date picker. */\n\tif (!$.datepicker.initialized) {\n\t\t$(document).mousedown($.datepicker._checkExternalClick);\n\t\t$.datepicker.initialized = true;\n\t}\n\n\t/* Append datepicker main container to body if not exist. */\n\tif ($(\"#\"+$.datepicker._mainDivId).length === 0) {\n\t\t$(\"body\").append($.datepicker.dpDiv);\n\t}\n\n\tvar otherArgs = Array.prototype.slice.call(arguments, 1);\n\tif (typeof options === \"string\" && (options === \"isDisabled\" || options === \"getDate\" || options === \"widget\")) {\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\n\t}\n\tif (options === \"option\" && arguments.length === 2 && typeof arguments[1] === \"string\") {\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\n\t}\n\treturn this.each(function() {\n\t\ttypeof options === \"string\" ?\n\t\t\t$.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\t\tapply($.datepicker, [this].concat(otherArgs)) :\n\t\t\t$.datepicker._attachDatepicker(this, options);\n\t});\n};\n\n$.datepicker = new Datepicker(); // singleton instance\n$.datepicker.initialized = false;\n$.datepicker.uuid = new Date().getTime();\n$.datepicker.version = \"1.11.4\";\n\nvar datepicker = $.datepicker;\n\n\n/*!\n * jQuery UI Draggable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/draggable/\n */\n\n\n$.widget(\"ui.draggable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false,\n\n\t\t// callbacks\n\t\tdrag: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tif ( this.options.helper === \"original\" ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\t\tif (this.options.addClasses){\n\t\t\tthis.element.addClass(\"ui-draggable\");\n\t\t}\n\t\tif (this.options.disabled){\n\t\t\tthis.element.addClass(\"ui-draggable-disabled\");\n\t\t}\n\t\tthis._setHandleClassName();\n\n\t\tthis._mouseInit();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._removeHandleClassName();\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( ( this.helper || this.element ).is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis.destroyOnClear = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.element.removeClass( \"ui-draggable ui-draggable-dragging ui-draggable-disabled\" );\n\t\tthis._removeHandleClassName();\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function(event) {\n\t\tvar o = this.options;\n\n\t\tthis._blurActiveElement( event );\n\n\t\t// among others, prevent a drag on a resizable-handle\n\t\tif (this.helper || o.disabled || $(event.target).closest(\".ui-resizable-handle\").length > 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle(event);\n\t\tif (!this.handle) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._blockFrames( o.iframeFix === true ? \"iframe\" : o.iframeFix );\n\n\t\treturn true;\n\n\t},\n\n\t_blockFrames: function( selector ) {\n\t\tthis.iframeBlocks = this.document.find( selector ).map(function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( \"position\", \"absolute\" )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.outerWidth( iframe.outerWidth() )\n\t\t\t\t.outerHeight( iframe.outerHeight() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t});\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_blurActiveElement: function( event ) {\n\t\tvar document = this.document[ 0 ];\n\n\t\t// Only need to blur if the event occurred on the draggable itself, see #10527\n\t\tif ( !this.handleElement.is( event.target ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// support: IE9\n\t\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\n\t\ttry {\n\n\t\t\t// Support: IE9, IE10\n\t\t\t// If the <body> is blurred, IE will switch windows, see #9520\n\t\t\tif ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== \"body\" ) {\n\n\t\t\t\t// Blur any element that currently has focus, see #4261\n\t\t\t\t$( document.activeElement ).blur();\n\t\t\t}\n\t\t} catch ( error ) {}\n\t},\n\n\t_mouseStart: function(event) {\n\n\t\tvar o = this.options;\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\tthis.helper.addClass(\"ui-draggable-dragging\");\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//If ddmanager is used for droppables, set the global draggable\n\t\tif ($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Store the helper's css position\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\t\tthis.scrollParent = this.helper.scrollParent( true );\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tthis.hasFixedAncestor = this.helper.parents().filter(function() {\n\t\t\t\treturn $( this ).css( \"position\" ) === \"fixed\";\n\t\t\t}).length > 0;\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.positionAbs = this.element.offset();\n\t\tthis._refreshOffsets( event );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition( event, false );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t//Set a containment if given in the options\n\t\tthis._setContainment();\n\n\t\t//Trigger event + callbacks\n\t\tif (this._trigger(\"start\", event) === false) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t//Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//Prepare the droppable offsets\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\t\t// Reset helper's right/bottom css if they're set and set explicit width/height instead\n\t\t// as this prevents resizing of elements with right/bottom set (see #7772)\n\t\tthis._normalizeRightBottom();\n\n\t\tthis._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position\n\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStart(this, event);\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_refreshOffsets: function( event ) {\n\t\tthis.offset = {\n\t\t\ttop: this.positionAbs.top - this.margins.top,\n\t\t\tleft: this.positionAbs.left - this.margins.left,\n\t\t\tscroll: false,\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset()\n\t\t};\n\n\t\tthis.offset.click = {\n\t\t\tleft: event.pageX - this.offset.left,\n\t\t\ttop: event.pageY - this.offset.top\n\t\t};\n\t},\n\n\t_mouseDrag: function(event, noPropagation) {\n\t\t// reset any necessary cached properties (see #5009)\n\t\tif ( this.hasFixedAncestor ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event, true );\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\n\t\tif (!noPropagation) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif (this._trigger(\"drag\", event, ui) === false) {\n\t\t\t\tthis._mouseUp({});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\n\t\tif ($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tvar that = this,\n\t\t\tdropped = false;\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\tdropped = $.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\t//if a drop comes from outside (a sortable)\n\t\tif (this.dropped) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\n\t\tif ((this.options.revert === \"invalid\" && !dropped) || (this.options.revert === \"valid\" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {\n\t\t\t$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {\n\t\t\t\tif (that._trigger(\"stop\", event) !== false) {\n\t\t\t\t\tthat._clear();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif (this._trigger(\"stop\", event) !== false) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis._unblockFrames();\n\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStop(this, event);\n\t\t}\n\n\t\t// Only need to focus if the event occurred on the draggable itself, see #10527\n\t\tif ( this.handleElement.is( event.target ) ) {\n\t\t\t// The interaction is over; whether or not the click resulted in a drag, focus the element\n\t\t\tthis.element.focus();\n\t\t}\n\n\t\treturn $.ui.mouse.prototype._mouseUp.call(this, event);\n\t},\n\n\tcancel: function() {\n\n\t\tif (this.helper.is(\".ui-draggable-dragging\")) {\n\t\t\tthis._mouseUp({});\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t_getHandle: function(event) {\n\t\treturn this.options.handle ?\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\n\t\t\ttrue;\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.handleElement = this.options.handle ?\n\t\t\tthis.element.find( this.options.handle ) : this.element;\n\t\tthis.handleElement.addClass( \"ui-draggable-handle\" );\n\t},\n\n\t_removeHandleClassName: function() {\n\t\tthis.handleElement.removeClass( \"ui-draggable-handle\" );\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelperIsFunction = $.isFunction( o.helper ),\n\t\t\thelper = helperIsFunction ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ?\n\t\t\t\t\tthis.element.clone().removeAttr( \"id\" ) :\n\t\t\t\t\tthis.element );\n\n\t\tif (!helper.parents(\"body\").length) {\n\t\t\thelper.appendTo((o.appendTo === \"parent\" ? this.element[0].parentNode : o.appendTo));\n\t\t}\n\n\t\t// http://bugs.jqueryui.com/ticket/9446\n\t\t// a helper function can return the original element\n\t\t// which wouldn't have been set to relative in _create\n\t\tif ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\n\t\tif (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css(\"position\"))) {\n\t\t\thelper.css(\"position\", \"absolute\");\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_setPositionRelative: function() {\n\t\tif ( !( /^(?:r|a|f)/ ).test( this.element.css( \"position\" ) ) ) {\n\t\t\tthis.element[ 0 ].style.position = \"relative\";\n\t\t}\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = { left: +obj[0], top: +obj[1] || 0 };\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_isRootNode: function( element ) {\n\t\treturn ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tvar po = this.offsetParent.offset(),\n\t\t\tdocument = this.document[ 0 ];\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif (this.cssPosition === \"absolute\" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\tif ( this._isRootNode( this.offsetParent[ 0 ] ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"), 10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"), 10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\t\tif ( this.cssPosition !== \"relative\" ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\tvar p = this.element.position(),\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: p.top - ( parseInt(this.helper.css( \"top\" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),\n\t\t\tleft: p.left - ( parseInt(this.helper.css( \"left\" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )\n\t\t};\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.element.css(\"marginLeft\"), 10) || 0),\n\t\t\ttop: (parseInt(this.element.css(\"marginTop\"), 10) || 0),\n\t\t\tright: (parseInt(this.element.css(\"marginRight\"), 10) || 0),\n\t\t\tbottom: (parseInt(this.element.css(\"marginBottom\"), 10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar isUserScrollable, c, ce,\n\t\t\to = this.options,\n\t\t\tdocument = this.document[ 0 ];\n\n\t\tthis.relativeContainer = null;\n\n\t\tif ( !o.containment ) {\n\t\t\tthis.containment = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"document\") {\n\t\t\tthis.containment = [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t$( document ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment.constructor === Array ) {\n\t\t\tthis.containment = o.containment;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\n\t\tc = $( o.containment );\n\t\tce = c[ 0 ];\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisUserScrollable = /(scroll|auto)/.test( c.css( \"overflow\" ) );\n\n\t\tthis.containment = [\n\t\t\t( parseInt( c.css( \"borderLeftWidth\" ), 10 ) || 0 ) + ( parseInt( c.css( \"paddingLeft\" ), 10 ) || 0 ),\n\t\t\t( parseInt( c.css( \"borderTopWidth\" ), 10 ) || 0 ) + ( parseInt( c.css( \"paddingTop\" ), 10 ) || 0 ),\n\t\t\t( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t( parseInt( c.css( \"borderRightWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.width -\n\t\t\t\tthis.margins.left -\n\t\t\t\tthis.margins.right,\n\t\t\t( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t( parseInt( c.css( \"borderBottomWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.height -\n\t\t\t\tthis.margins.top -\n\t\t\t\tthis.margins.bottom\n\t\t];\n\t\tthis.relativeContainer = c;\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif (!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event, constrainPosition ) {\n\n\t\tvar containment, co, top, left,\n\t\t\to = this.options,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY;\n\n\t\t// Cache the scroll\n\t\tif ( !scrollIsRootNode || !this.offset.scroll ) {\n\t\t\tthis.offset.scroll = {\n\t\t\t\ttop: this.scrollParent.scrollTop(),\n\t\t\t\tleft: this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\t// If we are not dragging yet, we won't check for options\n\t\tif ( constrainPosition ) {\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( this.relativeContainer ){\n\t\t\t\t\tco = this.relativeContainer.offset();\n\t\t\t\t\tcontainment = [\n\t\t\t\t\t\tthis.containment[ 0 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 1 ] + co.top,\n\t\t\t\t\t\tthis.containment[ 2 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 3 ] + co.top\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\tcontainment = this.containment;\n\t\t\t\t}\n\n\t\t\t\tif (event.pageX - this.offset.click.left < containment[0]) {\n\t\t\t\t\tpageX = containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif (event.pageY - this.offset.click.top < containment[1]) {\n\t\t\t\t\tpageY = containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif (event.pageX - this.offset.click.left > containment[2]) {\n\t\t\t\t\tpageX = containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif (event.pageY - this.offset.click.top > containment[3]) {\n\t\t\t\t\tpageY = containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (o.grid) {\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)\n\t\t\t\ttop = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;\n\t\t\t\tpageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;\n\t\t\t\tpageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"y\" ) {\n\t\t\t\tpageX = this.originalPageX;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"x\" ) {\n\t\t\t\tpageY = this.originalPageY;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.top\t-\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top -\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( this.cssPosition === \"fixed\" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left -\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( this.cssPosition === \"fixed\" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis.helper.removeClass(\"ui-draggable-dragging\");\n\t\tif (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t\tif ( this.destroyOnClear ) {\n\t\t\tthis.destroy();\n\t\t}\n\t},\n\n\t_normalizeRightBottom: function() {\n\t\tif ( this.options.axis !== \"y\" && this.helper.css( \"right\" ) !== \"auto\" ) {\n\t\t\tthis.helper.width( this.helper.width() );\n\t\t\tthis.helper.css( \"right\", \"auto\" );\n\t\t}\n\t\tif ( this.options.axis !== \"x\" && this.helper.css( \"bottom\" ) !== \"auto\" ) {\n\t\t\tthis.helper.height( this.helper.height() );\n\t\t\tthis.helper.css( \"bottom\", \"auto\" );\n\t\t}\n\t},\n\n\t// From now on bulk stuff - mainly helpers\n\n\t_trigger: function( type, event, ui ) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call( this, type, [ event, ui, this ], true );\n\n\t\t// Absolute position and offset (see #6884 ) have to be recalculated after plugins\n\t\tif ( /^(drag|start|stop)/.test( type ) ) {\n\t\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\t\t\tui.offset = this.positionAbs;\n\t\t}\n\t\treturn $.Widget.prototype._trigger.call( this, type, event, ui );\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function() {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n});\n\n$.ui.plugin.add( \"draggable\", \"connectToSortable\", {\n\tstart: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t});\n\n\t\tdraggable.sortables = [];\n\t\t$( draggable.options.connectToSortable ).each(function() {\n\t\t\tvar sortable = $( this ).sortable( \"instance\" );\n\n\t\t\tif ( sortable && !sortable.options.disabled ) {\n\t\t\t\tdraggable.sortables.push( sortable );\n\n\t\t\t\t// refreshPositions is called at drag start to refresh the containerCache\n\t\t\t\t// which is used in drag. This ensures it's initialized and synchronized\n\t\t\t\t// with any changes that might have happened on the page since initialization.\n\t\t\t\tsortable.refreshPositions();\n\t\t\t\tsortable._trigger(\"activate\", event, uiSortable);\n\t\t\t}\n\t\t});\n\t},\n\tstop: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t});\n\n\t\tdraggable.cancelHelperRemoval = false;\n\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar sortable = this;\n\n\t\t\tif ( sortable.isOver ) {\n\t\t\t\tsortable.isOver = 0;\n\n\t\t\t\t// Allow this sortable to handle removing the helper\n\t\t\t\tdraggable.cancelHelperRemoval = true;\n\t\t\t\tsortable.cancelHelperRemoval = false;\n\n\t\t\t\t// Use _storedCSS To restore properties in the sortable,\n\t\t\t\t// as this also handles revert (#9675) since the draggable\n\t\t\t\t// may have modified them in unexpected ways (#8809)\n\t\t\t\tsortable._storedCSS = {\n\t\t\t\t\tposition: sortable.placeholder.css( \"position\" ),\n\t\t\t\t\ttop: sortable.placeholder.css( \"top\" ),\n\t\t\t\t\tleft: sortable.placeholder.css( \"left\" )\n\t\t\t\t};\n\n\t\t\t\tsortable._mouseStop(event);\n\n\t\t\t\t// Once drag has ended, the sortable should return to using\n\t\t\t\t// its original helper, not the shared helper from draggable\n\t\t\t\tsortable.options.helper = sortable.options._helper;\n\t\t\t} else {\n\t\t\t\t// Prevent this Sortable from removing the helper.\n\t\t\t\t// However, don't set the draggable to remove the helper\n\t\t\t\t// either as another connected Sortable may yet handle the removal.\n\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\tsortable._trigger( \"deactivate\", event, uiSortable );\n\t\t\t}\n\t\t});\n\t},\n\tdrag: function( event, ui, draggable ) {\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar innermostIntersecting = false,\n\t\t\t\tsortable = this;\n\n\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\tsortable.positionAbs = draggable.positionAbs;\n\t\t\tsortable.helperProportions = draggable.helperProportions;\n\t\t\tsortable.offset.click = draggable.offset.click;\n\n\t\t\tif ( sortable._intersectsWith( sortable.containerCache ) ) {\n\t\t\t\tinnermostIntersecting = true;\n\n\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\t\t\tthis.positionAbs = draggable.positionAbs;\n\t\t\t\t\tthis.helperProportions = draggable.helperProportions;\n\t\t\t\t\tthis.offset.click = draggable.offset.click;\n\n\t\t\t\t\tif ( this !== sortable &&\n\t\t\t\t\t\t\tthis._intersectsWith( this.containerCache ) &&\n\t\t\t\t\t\t\t$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {\n\t\t\t\t\t\tinnermostIntersecting = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn innermostIntersecting;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( innermostIntersecting ) {\n\t\t\t\t// If it intersects, we use a little isOver variable and set it once,\n\t\t\t\t// so that the move-in stuff gets fired only once.\n\t\t\t\tif ( !sortable.isOver ) {\n\t\t\t\t\tsortable.isOver = 1;\n\n\t\t\t\t\t// Store draggable's parent in case we need to reappend to it later.\n\t\t\t\t\tdraggable._parent = ui.helper.parent();\n\n\t\t\t\t\tsortable.currentItem = ui.helper\n\t\t\t\t\t\t.appendTo( sortable.element )\n\t\t\t\t\t\t.data( \"ui-sortable-item\", true );\n\n\t\t\t\t\t// Store helper option to later restore it\n\t\t\t\t\tsortable.options._helper = sortable.options.helper;\n\n\t\t\t\t\tsortable.options.helper = function() {\n\t\t\t\t\t\treturn ui.helper[ 0 ];\n\t\t\t\t\t};\n\n\t\t\t\t\t// Fire the start events of the sortable with our passed browser event,\n\t\t\t\t\t// and our own helper (so it doesn't create a new one)\n\t\t\t\t\tevent.target = sortable.currentItem[ 0 ];\n\t\t\t\t\tsortable._mouseCapture( event, true );\n\t\t\t\t\tsortable._mouseStart( event, true, true );\n\n\t\t\t\t\t// Because the browser event is way off the new appended portlet,\n\t\t\t\t\t// modify necessary variables to reflect the changes\n\t\t\t\t\tsortable.offset.click.top = draggable.offset.click.top;\n\t\t\t\t\tsortable.offset.click.left = draggable.offset.click.left;\n\t\t\t\t\tsortable.offset.parent.left -= draggable.offset.parent.left -\n\t\t\t\t\t\tsortable.offset.parent.left;\n\t\t\t\t\tsortable.offset.parent.top -= draggable.offset.parent.top -\n\t\t\t\t\t\tsortable.offset.parent.top;\n\n\t\t\t\t\tdraggable._trigger( \"toSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is in a valid drop zone,\n\t\t\t\t\t// used solely in the revert option to handle \"valid/invalid\".\n\t\t\t\t\tdraggable.dropped = sortable.element;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables in the case that\n\t\t\t\t\t// adding to one sortable changes the location of the other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t});\n\n\t\t\t\t\t// hack so receive/update callbacks work (mostly)\n\t\t\t\t\tdraggable.currentItem = draggable.element;\n\t\t\t\t\tsortable.fromOutside = draggable;\n\t\t\t\t}\n\n\t\t\t\tif ( sortable.currentItem ) {\n\t\t\t\t\tsortable._mouseDrag( event );\n\t\t\t\t\t// Copy the sortable's position because the draggable's can potentially reflect\n\t\t\t\t\t// a relative position, while sortable is always absolute, which the dragged\n\t\t\t\t\t// element has now become. (#8809)\n\t\t\t\t\tui.position = sortable.position;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t// we fake the drag stop of the sortable, but make sure it doesn't remove\n\t\t\t\t// the helper by using cancelHelperRemoval.\n\t\t\t\tif ( sortable.isOver ) {\n\n\t\t\t\t\tsortable.isOver = 0;\n\t\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\t\t// Calling sortable's mouseStop would trigger a revert,\n\t\t\t\t\t// so revert must be temporarily false until after mouseStop is called.\n\t\t\t\t\tsortable.options._revert = sortable.options.revert;\n\t\t\t\t\tsortable.options.revert = false;\n\n\t\t\t\t\tsortable._trigger( \"out\", event, sortable._uiHash( sortable ) );\n\t\t\t\t\tsortable._mouseStop( event, true );\n\n\t\t\t\t\t// restore sortable behaviors that were modfied\n\t\t\t\t\t// when the draggable entered the sortable area (#9481)\n\t\t\t\t\tsortable.options.revert = sortable.options._revert;\n\t\t\t\t\tsortable.options.helper = sortable.options._helper;\n\n\t\t\t\t\tif ( sortable.placeholder ) {\n\t\t\t\t\t\tsortable.placeholder.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Restore and recalculate the draggable's offset considering the sortable\n\t\t\t\t\t// may have modified them in unexpected ways. (#8809, #10669)\n\t\t\t\t\tui.helper.appendTo( draggable._parent );\n\t\t\t\t\tdraggable._refreshOffsets( event );\n\t\t\t\t\tui.position = draggable._generatePosition( event, true );\n\n\t\t\t\t\tdraggable._trigger( \"fromSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is no longer in a valid drop zone\n\t\t\t\t\tdraggable.dropped = false;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables just in case removing\n\t\t\t\t\t// from one sortable changes the location of other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"cursor\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( \"body\" ),\n\t\t\to = instance.options;\n\n\t\tif (t.css(\"cursor\")) {\n\t\t\to._cursor = t.css(\"cursor\");\n\t\t}\n\t\tt.css(\"cursor\", o.cursor);\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif (o._cursor) {\n\t\t\t$(\"body\").css(\"cursor\", o._cursor);\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"opacity\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\t\tif (t.css(\"opacity\")) {\n\t\t\to._opacity = t.css(\"opacity\");\n\t\t}\n\t\tt.css(\"opacity\", o.opacity);\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif (o._opacity) {\n\t\t\t$(ui.helper).css(\"opacity\", o._opacity);\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"scroll\", {\n\tstart: function( event, ui, i ) {\n\t\tif ( !i.scrollParentNotHidden ) {\n\t\t\ti.scrollParentNotHidden = i.helper.scrollParent( false );\n\t\t}\n\n\t\tif ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== \"HTML\" ) {\n\t\t\ti.overflowOffset = i.scrollParentNotHidden.offset();\n\t\t}\n\t},\n\tdrag: function( event, ui, i  ) {\n\n\t\tvar o = i.options,\n\t\t\tscrolled = false,\n\t\t\tscrollParent = i.scrollParentNotHidden[ 0 ],\n\t\t\tdocument = i.document[ 0 ];\n\n\t\tif ( scrollParent !== document && scrollParent.tagName !== \"HTML\" ) {\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif (!o.axis || o.axis !== \"x\") {\n\t\t\t\tif (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!o.axis || o.axis !== \"y\") {\n\t\t\t\tif (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(i, event);\n\t\t}\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"snap\", {\n\tstart: function( event, ui, i ) {\n\n\t\tvar o = i.options;\n\n\t\ti.snapElements = [];\n\n\t\t$(o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap).each(function() {\n\t\t\tvar $t = $(this),\n\t\t\t\t$o = $t.offset();\n\t\t\tif (this !== i.element[0]) {\n\t\t\t\ti.snapElements.push({\n\t\t\t\t\titem: this,\n\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t},\n\tdrag: function( event, ui, inst ) {\n\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\n\t\t\to = inst.options,\n\t\t\td = o.snapTolerance,\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor (i = inst.snapElements.length - 1; i >= 0; i--){\n\n\t\t\tl = inst.snapElements[i].left - inst.margins.left;\n\t\t\tr = l + inst.snapElements[i].width;\n\t\t\tt = inst.snapElements[i].top - inst.margins.top;\n\t\t\tb = t + inst.snapElements[i].height;\n\n\t\t\tif ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {\n\t\t\t\tif (inst.snapElements[i].snapping) {\n\t\t\t\t\t(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\t\t}\n\t\t\t\tinst.snapElements[i].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (o.snapMode !== \"inner\") {\n\t\t\t\tts = Math.abs(t - y2) <= d;\n\t\t\t\tbs = Math.abs(b - y1) <= d;\n\t\t\t\tls = Math.abs(l - x2) <= d;\n\t\t\t\trs = Math.abs(r - x1) <= d;\n\t\t\t\tif (ts) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t - inst.helperProportions.height, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (bs) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (ls) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l - inst.helperProportions.width }).left;\n\t\t\t\t}\n\t\t\t\tif (rs) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r }).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = (ts || bs || ls || rs);\n\n\t\t\tif (o.snapMode !== \"outer\") {\n\t\t\t\tts = Math.abs(t - y1) <= d;\n\t\t\t\tbs = Math.abs(b - y2) <= d;\n\t\t\t\tls = Math.abs(l - x1) <= d;\n\t\t\t\trs = Math.abs(r - x2) <= d;\n\t\t\t\tif (ts) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (bs) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b - inst.helperProportions.height, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (ls) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l }).left;\n\t\t\t\t}\n\t\t\t\tif (rs) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r - inst.helperProportions.width }).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {\n\t\t\t\t(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\t}\n\t\t\tinst.snapElements[i].snapping = (ts || bs || ls || rs || first);\n\n\t\t}\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"stack\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar min,\n\t\t\to = instance.options,\n\t\t\tgroup = $.makeArray($(o.stack)).sort(function(a, b) {\n\t\t\t\treturn (parseInt($(a).css(\"zIndex\"), 10) || 0) - (parseInt($(b).css(\"zIndex\"), 10) || 0);\n\t\t\t});\n\n\t\tif (!group.length) { return; }\n\n\t\tmin = parseInt($(group[0]).css(\"zIndex\"), 10) || 0;\n\t\t$(group).each(function(i) {\n\t\t\t$(this).css(\"zIndex\", min + i);\n\t\t});\n\t\tthis.css(\"zIndex\", (min + group.length));\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"zIndex\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\n\t\tif (t.css(\"zIndex\")) {\n\t\t\to._zIndex = t.css(\"zIndex\");\n\t\t}\n\t\tt.css(\"zIndex\", o.zIndex);\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\n\t\tif (o._zIndex) {\n\t\t\t$(ui.helper).css(\"zIndex\", o._zIndex);\n\t\t}\n\t}\n});\n\nvar draggable = $.ui.draggable;\n\n\n/*!\n * jQuery UI Resizable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/resizable/\n */\n\n\n$.widget(\"ui.resizable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"resize\",\n\toptions: {\n\t\talsoResize: false,\n\t\tanimate: false,\n\t\tanimateDuration: \"slow\",\n\t\tanimateEasing: \"swing\",\n\t\taspectRatio: false,\n\t\tautoHide: false,\n\t\tcontainment: false,\n\t\tghost: false,\n\t\tgrid: false,\n\t\thandles: \"e,s,se\",\n\t\thelper: false,\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 10,\n\t\tminWidth: 10,\n\t\t// See #7960\n\t\tzIndex: 90,\n\n\t\t// callbacks\n\t\tresize: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_num: function( value ) {\n\t\treturn parseInt( value, 10 ) || 0;\n\t},\n\n\t_isNumber: function( value ) {\n\t\treturn !isNaN( parseInt( value, 10 ) );\n\t},\n\n\t_hasScroll: function( el, a ) {\n\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t},\n\n\t_create: function() {\n\n\t\tvar n, i, handle, axis, hname,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\t\tthis.element.addClass(\"ui-resizable\");\n\n\t\t$.extend(this, {\n\t\t\t_aspectRatio: !!(o.aspectRatio),\n\t\t\taspectRatio: o.aspectRatio,\n\t\t\toriginalElement: this.element,\n\t\t\t_proportionallyResizeElements: [],\n\t\t\t_helper: o.helper || o.ghost || o.animate ? o.helper || \"ui-resizable-helper\" : null\n\t\t});\n\n\t\t// Wrap the element if it cannot hold child nodes\n\t\tif (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {\n\n\t\t\tthis.element.wrap(\n\t\t\t\t$(\"<div class='ui-wrapper' style='overflow: hidden;'></div>\").css({\n\t\t\t\t\tposition: this.element.css(\"position\"),\n\t\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\t\ttop: this.element.css(\"top\"),\n\t\t\t\t\tleft: this.element.css(\"left\")\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tthis.element = this.element.parent().data(\n\t\t\t\t\"ui-resizable\", this.element.resizable( \"instance\" )\n\t\t\t);\n\n\t\t\tthis.elementIsWrapper = true;\n\n\t\t\tthis.element.css({\n\t\t\t\tmarginLeft: this.originalElement.css(\"marginLeft\"),\n\t\t\t\tmarginTop: this.originalElement.css(\"marginTop\"),\n\t\t\t\tmarginRight: this.originalElement.css(\"marginRight\"),\n\t\t\t\tmarginBottom: this.originalElement.css(\"marginBottom\")\n\t\t\t});\n\t\t\tthis.originalElement.css({\n\t\t\t\tmarginLeft: 0,\n\t\t\t\tmarginTop: 0,\n\t\t\t\tmarginRight: 0,\n\t\t\t\tmarginBottom: 0\n\t\t\t});\n\t\t\t// support: Safari\n\t\t\t// Prevent Safari textarea resize\n\t\t\tthis.originalResizeStyle = this.originalElement.css(\"resize\");\n\t\t\tthis.originalElement.css(\"resize\", \"none\");\n\n\t\t\tthis._proportionallyResizeElements.push( this.originalElement.css({\n\t\t\t\tposition: \"static\",\n\t\t\t\tzoom: 1,\n\t\t\t\tdisplay: \"block\"\n\t\t\t}) );\n\n\t\t\t// support: IE9\n\t\t\t// avoid IE jump (hard set the margin)\n\t\t\tthis.originalElement.css({ margin: this.originalElement.css(\"margin\") });\n\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tthis.handles = o.handles ||\n\t\t\t( !$(\".ui-resizable-handle\", this.element).length ?\n\t\t\t\t\"e,s,se\" : {\n\t\t\t\t\tn: \".ui-resizable-n\",\n\t\t\t\t\te: \".ui-resizable-e\",\n\t\t\t\t\ts: \".ui-resizable-s\",\n\t\t\t\t\tw: \".ui-resizable-w\",\n\t\t\t\t\tse: \".ui-resizable-se\",\n\t\t\t\t\tsw: \".ui-resizable-sw\",\n\t\t\t\t\tne: \".ui-resizable-ne\",\n\t\t\t\t\tnw: \".ui-resizable-nw\"\n\t\t\t\t} );\n\n\t\tthis._handles = $();\n\t\tif ( this.handles.constructor === String ) {\n\n\t\t\tif ( this.handles === \"all\") {\n\t\t\t\tthis.handles = \"n,e,s,w,se,sw,ne,nw\";\n\t\t\t}\n\n\t\t\tn = this.handles.split(\",\");\n\t\t\tthis.handles = {};\n\n\t\t\tfor (i = 0; i < n.length; i++) {\n\n\t\t\t\thandle = $.trim(n[i]);\n\t\t\t\thname = \"ui-resizable-\" + handle;\n\t\t\t\taxis = $(\"<div class='ui-resizable-handle \" + hname + \"'></div>\");\n\n\t\t\t\taxis.css({ zIndex: o.zIndex });\n\n\t\t\t\t// TODO : What's going on here?\n\t\t\t\tif (\"se\" === handle) {\n\t\t\t\t\taxis.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\");\n\t\t\t\t}\n\n\t\t\t\tthis.handles[handle] = \".ui-resizable-\" + handle;\n\t\t\t\tthis.element.append(axis);\n\t\t\t}\n\n\t\t}\n\n\t\tthis._renderAxis = function(target) {\n\n\t\t\tvar i, axis, padPos, padWrapper;\n\n\t\t\ttarget = target || this.element;\n\n\t\t\tfor (i in this.handles) {\n\n\t\t\t\tif (this.handles[i].constructor === String) {\n\t\t\t\t\tthis.handles[i] = this.element.children( this.handles[ i ] ).first().show();\n\t\t\t\t} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {\n\t\t\t\t\tthis.handles[ i ] = $( this.handles[ i ] );\n\t\t\t\t\tthis._on( this.handles[ i ], { \"mousedown\": that._mouseDown });\n\t\t\t\t}\n\n\t\t\t\tif (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {\n\n\t\t\t\t\taxis = $(this.handles[i], this.element);\n\n\t\t\t\t\tpadWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();\n\n\t\t\t\t\tpadPos = [ \"padding\",\n\t\t\t\t\t\t/ne|nw|n/.test(i) ? \"Top\" :\n\t\t\t\t\t\t/se|sw|s/.test(i) ? \"Bottom\" :\n\t\t\t\t\t\t/^e$/.test(i) ? \"Right\" : \"Left\" ].join(\"\");\n\n\t\t\t\t\ttarget.css(padPos, padWrapper);\n\n\t\t\t\t\tthis._proportionallyResize();\n\t\t\t\t}\n\n\t\t\t\tthis._handles = this._handles.add( this.handles[ i ] );\n\t\t\t}\n\t\t};\n\n\t\t// TODO: make renderAxis a prototype function\n\t\tthis._renderAxis(this.element);\n\n\t\tthis._handles = this._handles.add( this.element.find( \".ui-resizable-handle\" ) );\n\t\tthis._handles.disableSelection();\n\n\t\tthis._handles.mouseover(function() {\n\t\t\tif (!that.resizing) {\n\t\t\t\tif (this.className) {\n\t\t\t\t\taxis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);\n\t\t\t\t}\n\t\t\t\tthat.axis = axis && axis[1] ? axis[1] : \"se\";\n\t\t\t}\n\t\t});\n\n\t\tif (o.autoHide) {\n\t\t\tthis._handles.hide();\n\t\t\t$(this.element)\n\t\t\t\t.addClass(\"ui-resizable-autohide\")\n\t\t\t\t.mouseenter(function() {\n\t\t\t\t\tif (o.disabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t$(this).removeClass(\"ui-resizable-autohide\");\n\t\t\t\t\tthat._handles.show();\n\t\t\t\t})\n\t\t\t\t.mouseleave(function() {\n\t\t\t\t\tif (o.disabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!that.resizing) {\n\t\t\t\t\t\t$(this).addClass(\"ui-resizable-autohide\");\n\t\t\t\t\t\tthat._handles.hide();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\tthis._mouseInit();\n\t},\n\n\t_destroy: function() {\n\n\t\tthis._mouseDestroy();\n\n\t\tvar wrapper,\n\t\t\t_destroy = function(exp) {\n\t\t\t\t$(exp)\n\t\t\t\t\t.removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\")\n\t\t\t\t\t.removeData(\"resizable\")\n\t\t\t\t\t.removeData(\"ui-resizable\")\n\t\t\t\t\t.unbind(\".resizable\")\n\t\t\t\t\t.find(\".ui-resizable-handle\")\n\t\t\t\t\t\t.remove();\n\t\t\t};\n\n\t\t// TODO: Unwrap at same DOM position\n\t\tif (this.elementIsWrapper) {\n\t\t\t_destroy(this.element);\n\t\t\twrapper = this.element;\n\t\t\tthis.originalElement.css({\n\t\t\t\tposition: wrapper.css(\"position\"),\n\t\t\t\twidth: wrapper.outerWidth(),\n\t\t\t\theight: wrapper.outerHeight(),\n\t\t\t\ttop: wrapper.css(\"top\"),\n\t\t\t\tleft: wrapper.css(\"left\")\n\t\t\t}).insertAfter( wrapper );\n\t\t\twrapper.remove();\n\t\t}\n\n\t\tthis.originalElement.css(\"resize\", this.originalResizeStyle);\n\t\t_destroy(this.originalElement);\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function(event) {\n\t\tvar i, handle,\n\t\t\tcapture = false;\n\n\t\tfor (i in this.handles) {\n\t\t\thandle = $(this.handles[i])[0];\n\t\t\tif (handle === event.target || $.contains(handle, event.target)) {\n\t\t\t\tcapture = true;\n\t\t\t}\n\t\t}\n\n\t\treturn !this.options.disabled && capture;\n\t},\n\n\t_mouseStart: function(event) {\n\n\t\tvar curleft, curtop, cursor,\n\t\t\to = this.options,\n\t\t\tel = this.element;\n\n\t\tthis.resizing = true;\n\n\t\tthis._renderProxy();\n\n\t\tcurleft = this._num(this.helper.css(\"left\"));\n\t\tcurtop = this._num(this.helper.css(\"top\"));\n\n\t\tif (o.containment) {\n\t\t\tcurleft += $(o.containment).scrollLeft() || 0;\n\t\t\tcurtop += $(o.containment).scrollTop() || 0;\n\t\t}\n\n\t\tthis.offset = this.helper.offset();\n\t\tthis.position = { left: curleft, top: curtop };\n\n\t\tthis.size = this._helper ? {\n\t\t\t\twidth: this.helper.width(),\n\t\t\t\theight: this.helper.height()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.originalSize = this._helper ? {\n\t\t\t\twidth: el.outerWidth(),\n\t\t\t\theight: el.outerHeight()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.sizeDiff = {\n\t\t\twidth: el.outerWidth() - el.width(),\n\t\t\theight: el.outerHeight() - el.height()\n\t\t};\n\n\t\tthis.originalPosition = { left: curleft, top: curtop };\n\t\tthis.originalMousePosition = { left: event.pageX, top: event.pageY };\n\n\t\tthis.aspectRatio = (typeof o.aspectRatio === \"number\") ?\n\t\t\to.aspectRatio :\n\t\t\t((this.originalSize.width / this.originalSize.height) || 1);\n\n\t\tcursor = $(\".ui-resizable-\" + this.axis).css(\"cursor\");\n\t\t$(\"body\").css(\"cursor\", cursor === \"auto\" ? this.axis + \"-resize\" : cursor);\n\n\t\tel.addClass(\"ui-resizable-resizing\");\n\t\tthis._propagate(\"start\", event);\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function(event) {\n\n\t\tvar data, props,\n\t\t\tsmp = this.originalMousePosition,\n\t\t\ta = this.axis,\n\t\t\tdx = (event.pageX - smp.left) || 0,\n\t\t\tdy = (event.pageY - smp.top) || 0,\n\t\t\ttrigger = this._change[a];\n\n\t\tthis._updatePrevProperties();\n\n\t\tif (!trigger) {\n\t\t\treturn false;\n\t\t}\n\n\t\tdata = trigger.apply(this, [ event, dx, dy ]);\n\n\t\tthis._updateVirtualBoundaries(event.shiftKey);\n\t\tif (this._aspectRatio || event.shiftKey) {\n\t\t\tdata = this._updateRatio(data, event);\n\t\t}\n\n\t\tdata = this._respectSize(data, event);\n\n\t\tthis._updateCache(data);\n\n\t\tthis._propagate(\"resize\", event);\n\n\t\tprops = this._applyChanges();\n\n\t\tif ( !this._helper && this._proportionallyResizeElements.length ) {\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tif ( !$.isEmptyObject( props ) ) {\n\t\t\tthis._updatePrevProperties();\n\t\t\tthis._trigger( \"resize\", event, this.ui() );\n\t\t\tthis._applyChanges();\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\n\t\tthis.resizing = false;\n\t\tvar pr, ista, soffseth, soffsetw, s, left, top,\n\t\t\to = this.options, that = this;\n\n\t\tif (this._helper) {\n\n\t\t\tpr = this._proportionallyResizeElements;\n\t\t\tista = pr.length && (/textarea/i).test(pr[0].nodeName);\n\t\t\tsoffseth = ista && this._hasScroll(pr[0], \"left\") ? 0 : that.sizeDiff.height;\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width;\n\n\t\t\ts = {\n\t\t\t\twidth: (that.helper.width()  - soffsetw),\n\t\t\t\theight: (that.helper.height() - soffseth)\n\t\t\t};\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) +\n\t\t\t\t(that.position.left - that.originalPosition.left)) || null;\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) +\n\t\t\t\t(that.position.top - that.originalPosition.top)) || null;\n\n\t\t\tif (!o.animate) {\n\t\t\t\tthis.element.css($.extend(s, { top: top, left: left }));\n\t\t\t}\n\n\t\t\tthat.helper.height(that.size.height);\n\t\t\tthat.helper.width(that.size.width);\n\n\t\t\tif (this._helper && !o.animate) {\n\t\t\t\tthis._proportionallyResize();\n\t\t\t}\n\t\t}\n\n\t\t$(\"body\").css(\"cursor\", \"auto\");\n\n\t\tthis.element.removeClass(\"ui-resizable-resizing\");\n\n\t\tthis._propagate(\"stop\", event);\n\n\t\tif (this._helper) {\n\t\t\tthis.helper.remove();\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\t_updatePrevProperties: function() {\n\t\tthis.prevPosition = {\n\t\t\ttop: this.position.top,\n\t\t\tleft: this.position.left\n\t\t};\n\t\tthis.prevSize = {\n\t\t\twidth: this.size.width,\n\t\t\theight: this.size.height\n\t\t};\n\t},\n\n\t_applyChanges: function() {\n\t\tvar props = {};\n\n\t\tif ( this.position.top !== this.prevPosition.top ) {\n\t\t\tprops.top = this.position.top + \"px\";\n\t\t}\n\t\tif ( this.position.left !== this.prevPosition.left ) {\n\t\t\tprops.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( this.size.width !== this.prevSize.width ) {\n\t\t\tprops.width = this.size.width + \"px\";\n\t\t}\n\t\tif ( this.size.height !== this.prevSize.height ) {\n\t\t\tprops.height = this.size.height + \"px\";\n\t\t}\n\n\t\tthis.helper.css( props );\n\n\t\treturn props;\n\t},\n\n\t_updateVirtualBoundaries: function(forceAspectRatio) {\n\t\tvar pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,\n\t\t\to = this.options;\n\n\t\tb = {\n\t\t\tminWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,\n\t\t\tmaxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,\n\t\t\tminHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,\n\t\t\tmaxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity\n\t\t};\n\n\t\tif (this._aspectRatio || forceAspectRatio) {\n\t\t\tpMinWidth = b.minHeight * this.aspectRatio;\n\t\t\tpMinHeight = b.minWidth / this.aspectRatio;\n\t\t\tpMaxWidth = b.maxHeight * this.aspectRatio;\n\t\t\tpMaxHeight = b.maxWidth / this.aspectRatio;\n\n\t\t\tif (pMinWidth > b.minWidth) {\n\t\t\t\tb.minWidth = pMinWidth;\n\t\t\t}\n\t\t\tif (pMinHeight > b.minHeight) {\n\t\t\t\tb.minHeight = pMinHeight;\n\t\t\t}\n\t\t\tif (pMaxWidth < b.maxWidth) {\n\t\t\t\tb.maxWidth = pMaxWidth;\n\t\t\t}\n\t\t\tif (pMaxHeight < b.maxHeight) {\n\t\t\t\tb.maxHeight = pMaxHeight;\n\t\t\t}\n\t\t}\n\t\tthis._vBoundaries = b;\n\t},\n\n\t_updateCache: function(data) {\n\t\tthis.offset = this.helper.offset();\n\t\tif (this._isNumber(data.left)) {\n\t\t\tthis.position.left = data.left;\n\t\t}\n\t\tif (this._isNumber(data.top)) {\n\t\t\tthis.position.top = data.top;\n\t\t}\n\t\tif (this._isNumber(data.height)) {\n\t\t\tthis.size.height = data.height;\n\t\t}\n\t\tif (this._isNumber(data.width)) {\n\t\t\tthis.size.width = data.width;\n\t\t}\n\t},\n\n\t_updateRatio: function( data ) {\n\n\t\tvar cpos = this.position,\n\t\t\tcsize = this.size,\n\t\t\ta = this.axis;\n\n\t\tif (this._isNumber(data.height)) {\n\t\t\tdata.width = (data.height * this.aspectRatio);\n\t\t} else if (this._isNumber(data.width)) {\n\t\t\tdata.height = (data.width / this.aspectRatio);\n\t\t}\n\n\t\tif (a === \"sw\") {\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\n\t\t\tdata.top = null;\n\t\t}\n\t\tif (a === \"nw\") {\n\t\t\tdata.top = cpos.top + (csize.height - data.height);\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_respectSize: function( data ) {\n\n\t\tvar o = this._vBoundaries,\n\t\t\ta = this.axis,\n\t\t\tismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),\n\t\t\tismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),\n\t\t\tisminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),\n\t\t\tisminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),\n\t\t\tdw = this.originalPosition.left + this.originalSize.width,\n\t\t\tdh = this.position.top + this.size.height,\n\t\t\tcw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);\n\t\tif (isminw) {\n\t\t\tdata.width = o.minWidth;\n\t\t}\n\t\tif (isminh) {\n\t\t\tdata.height = o.minHeight;\n\t\t}\n\t\tif (ismaxw) {\n\t\t\tdata.width = o.maxWidth;\n\t\t}\n\t\tif (ismaxh) {\n\t\t\tdata.height = o.maxHeight;\n\t\t}\n\n\t\tif (isminw && cw) {\n\t\t\tdata.left = dw - o.minWidth;\n\t\t}\n\t\tif (ismaxw && cw) {\n\t\t\tdata.left = dw - o.maxWidth;\n\t\t}\n\t\tif (isminh && ch) {\n\t\t\tdata.top = dh - o.minHeight;\n\t\t}\n\t\tif (ismaxh && ch) {\n\t\t\tdata.top = dh - o.maxHeight;\n\t\t}\n\n\t\t// Fixing jump error on top/left - bug #2330\n\t\tif (!data.width && !data.height && !data.left && data.top) {\n\t\t\tdata.top = null;\n\t\t} else if (!data.width && !data.height && !data.top && data.left) {\n\t\t\tdata.left = null;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_getPaddingPlusBorderDimensions: function( element ) {\n\t\tvar i = 0,\n\t\t\twidths = [],\n\t\t\tborders = [\n\t\t\t\telement.css( \"borderTopWidth\" ),\n\t\t\t\telement.css( \"borderRightWidth\" ),\n\t\t\t\telement.css( \"borderBottomWidth\" ),\n\t\t\t\telement.css( \"borderLeftWidth\" )\n\t\t\t],\n\t\t\tpaddings = [\n\t\t\t\telement.css( \"paddingTop\" ),\n\t\t\t\telement.css( \"paddingRight\" ),\n\t\t\t\telement.css( \"paddingBottom\" ),\n\t\t\t\telement.css( \"paddingLeft\" )\n\t\t\t];\n\n\t\tfor ( ; i < 4; i++ ) {\n\t\t\twidths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );\n\t\t\twidths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );\n\t\t}\n\n\t\treturn {\n\t\t\theight: widths[ 0 ] + widths[ 2 ],\n\t\t\twidth: widths[ 1 ] + widths[ 3 ]\n\t\t};\n\t},\n\n\t_proportionallyResize: function() {\n\n\t\tif (!this._proportionallyResizeElements.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar prel,\n\t\t\ti = 0,\n\t\t\telement = this.helper || this.element;\n\n\t\tfor ( ; i < this._proportionallyResizeElements.length; i++) {\n\n\t\t\tprel = this._proportionallyResizeElements[i];\n\n\t\t\t// TODO: Seems like a bug to cache this.outerDimensions\n\t\t\t// considering that we are in a loop.\n\t\t\tif (!this.outerDimensions) {\n\t\t\t\tthis.outerDimensions = this._getPaddingPlusBorderDimensions( prel );\n\t\t\t}\n\n\t\t\tprel.css({\n\t\t\t\theight: (element.height() - this.outerDimensions.height) || 0,\n\t\t\t\twidth: (element.width() - this.outerDimensions.width) || 0\n\t\t\t});\n\n\t\t}\n\n\t},\n\n\t_renderProxy: function() {\n\n\t\tvar el = this.element, o = this.options;\n\t\tthis.elementOffset = el.offset();\n\n\t\tif (this._helper) {\n\n\t\t\tthis.helper = this.helper || $(\"<div style='overflow:hidden;'></div>\");\n\n\t\t\tthis.helper.addClass(this._helper).css({\n\t\t\t\twidth: this.element.outerWidth() - 1,\n\t\t\t\theight: this.element.outerHeight() - 1,\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: this.elementOffset.left + \"px\",\n\t\t\t\ttop: this.elementOffset.top + \"px\",\n\t\t\t\tzIndex: ++o.zIndex //TODO: Don't modify option\n\t\t\t});\n\n\t\t\tthis.helper\n\t\t\t\t.appendTo(\"body\")\n\t\t\t\t.disableSelection();\n\n\t\t} else {\n\t\t\tthis.helper = this.element;\n\t\t}\n\n\t},\n\n\t_change: {\n\t\te: function(event, dx) {\n\t\t\treturn { width: this.originalSize.width + dx };\n\t\t},\n\t\tw: function(event, dx) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { left: sp.left + dx, width: cs.width - dx };\n\t\t},\n\t\tn: function(event, dx, dy) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { top: sp.top + dy, height: cs.height - dy };\n\t\t},\n\t\ts: function(event, dx, dy) {\n\t\t\treturn { height: this.originalSize.height + dy };\n\t\t},\n\t\tse: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.s.apply(this, arguments),\n\t\t\t\tthis._change.e.apply(this, [ event, dx, dy ]));\n\t\t},\n\t\tsw: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.s.apply(this, arguments),\n\t\t\t\tthis._change.w.apply(this, [ event, dx, dy ]));\n\t\t},\n\t\tne: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.n.apply(this, arguments),\n\t\t\t\tthis._change.e.apply(this, [ event, dx, dy ]));\n\t\t},\n\t\tnw: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.n.apply(this, arguments),\n\t\t\t\tthis._change.w.apply(this, [ event, dx, dy ]));\n\t\t}\n\t},\n\n\t_propagate: function(n, event) {\n\t\t$.ui.plugin.call(this, n, [ event, this.ui() ]);\n\t\t(n !== \"resize\" && this._trigger(n, event, this.ui()));\n\t},\n\n\tplugins: {},\n\n\tui: function() {\n\t\treturn {\n\t\t\toriginalElement: this.originalElement,\n\t\t\telement: this.element,\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\tsize: this.size,\n\t\t\toriginalSize: this.originalSize,\n\t\t\toriginalPosition: this.originalPosition\n\t\t};\n\t}\n\n});\n\n/*\n * Resizable Extensions\n */\n\n$.ui.plugin.add(\"resizable\", \"animate\", {\n\n\tstop: function( event ) {\n\t\tvar that = $(this).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tpr = that._proportionallyResizeElements,\n\t\t\tista = pr.length && (/textarea/i).test(pr[0].nodeName),\n\t\t\tsoffseth = ista && that._hasScroll(pr[0], \"left\") ? 0 : that.sizeDiff.height,\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width,\n\t\t\tstyle = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) +\n\t\t\t\t(that.position.left - that.originalPosition.left)) || null,\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) +\n\t\t\t\t(that.position.top - that.originalPosition.top)) || null;\n\n\t\tthat.element.animate(\n\t\t\t$.extend(style, top && left ? { top: top, left: left } : {}), {\n\t\t\t\tduration: o.animateDuration,\n\t\t\t\teasing: o.animateEasing,\n\t\t\t\tstep: function() {\n\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\twidth: parseInt(that.element.css(\"width\"), 10),\n\t\t\t\t\t\theight: parseInt(that.element.css(\"height\"), 10),\n\t\t\t\t\t\ttop: parseInt(that.element.css(\"top\"), 10),\n\t\t\t\t\t\tleft: parseInt(that.element.css(\"left\"), 10)\n\t\t\t\t\t};\n\n\t\t\t\t\tif (pr && pr.length) {\n\t\t\t\t\t\t$(pr[0]).css({ width: data.width, height: data.height });\n\t\t\t\t\t}\n\n\t\t\t\t\t// propagating resize, and updating values for each animation step\n\t\t\t\t\tthat._updateCache(data);\n\t\t\t\t\tthat._propagate(\"resize\", event);\n\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n});\n\n$.ui.plugin.add( \"resizable\", \"containment\", {\n\n\tstart: function() {\n\t\tvar element, p, co, ch, cw, width, height,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tel = that.element,\n\t\t\toc = o.containment,\n\t\t\tce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthat.containerElement = $( ce );\n\n\t\tif ( /document/.test( oc ) || oc === document ) {\n\t\t\tthat.containerOffset = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\t\t\tthat.containerPosition = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: $( document ),\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: $( document ).width(),\n\t\t\t\theight: $( document ).height() || document.body.parentNode.scrollHeight\n\t\t\t};\n\t\t} else {\n\t\t\telement = $( ce );\n\t\t\tp = [];\n\t\t\t$([ \"Top\", \"Right\", \"Left\", \"Bottom\" ]).each(function( i, name ) {\n\t\t\t\tp[ i ] = that._num( element.css( \"padding\" + name ) );\n\t\t\t});\n\n\t\t\tthat.containerOffset = element.offset();\n\t\t\tthat.containerPosition = element.position();\n\t\t\tthat.containerSize = {\n\t\t\t\theight: ( element.innerHeight() - p[ 3 ] ),\n\t\t\t\twidth: ( element.innerWidth() - p[ 1 ] )\n\t\t\t};\n\n\t\t\tco = that.containerOffset;\n\t\t\tch = that.containerSize.height;\n\t\t\tcw = that.containerSize.width;\n\t\t\twidth = ( that._hasScroll ( ce, \"left\" ) ? ce.scrollWidth : cw );\n\t\t\theight = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: ce,\n\t\t\t\tleft: co.left,\n\t\t\t\ttop: co.top,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\t\t}\n\t},\n\n\tresize: function( event ) {\n\t\tvar woset, hoset, isParent, isOffsetRelative,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcp = that.position,\n\t\t\tpRatio = that._aspectRatio || event.shiftKey,\n\t\t\tcop = {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t},\n\t\t\tce = that.containerElement,\n\t\t\tcontinueResize = true;\n\n\t\tif ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\tcop = co;\n\t\t}\n\n\t\tif ( cp.left < ( that._helper ? co.left : 0 ) ) {\n\t\t\tthat.size.width = that.size.width +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.left - co.left ) :\n\t\t\t\t\t( that.position.left - cop.left ) );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.left = o.helper ? co.left : 0;\n\t\t}\n\n\t\tif ( cp.top < ( that._helper ? co.top : 0 ) ) {\n\t\t\tthat.size.height = that.size.height +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.top - co.top ) :\n\t\t\t\t\tthat.position.top );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.top = that._helper ? co.top : 0;\n\t\t}\n\n\t\tisParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );\n\t\tisOffsetRelative = /relative|absolute/.test( that.containerElement.css( \"position\" ) );\n\n\t\tif ( isParent && isOffsetRelative ) {\n\t\t\tthat.offset.left = that.parentData.left + that.position.left;\n\t\t\tthat.offset.top = that.parentData.top + that.position.top;\n\t\t} else {\n\t\t\tthat.offset.left = that.element.offset().left;\n\t\t\tthat.offset.top = that.element.offset().top;\n\t\t}\n\n\t\twoset = Math.abs( that.sizeDiff.width +\n\t\t\t(that._helper ?\n\t\t\t\tthat.offset.left - cop.left :\n\t\t\t\t(that.offset.left - co.left)) );\n\n\t\thoset = Math.abs( that.sizeDiff.height +\n\t\t\t(that._helper ?\n\t\t\t\tthat.offset.top - cop.top :\n\t\t\t\t(that.offset.top - co.top)) );\n\n\t\tif ( woset + that.size.width >= that.parentData.width ) {\n\t\t\tthat.size.width = that.parentData.width - woset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( hoset + that.size.height >= that.parentData.height ) {\n\t\t\tthat.size.height = that.parentData.height - hoset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( !continueResize ) {\n\t\t\tthat.position.left = that.prevPosition.left;\n\t\t\tthat.position.top = that.prevPosition.top;\n\t\t\tthat.size.width = that.prevSize.width;\n\t\t\tthat.size.height = that.prevSize.height;\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcop = that.containerPosition,\n\t\t\tce = that.containerElement,\n\t\t\thelper = $( that.helper ),\n\t\t\tho = helper.offset(),\n\t\t\tw = helper.outerWidth() - that.sizeDiff.width,\n\t\t\th = helper.outerHeight() - that.sizeDiff.height;\n\n\t\tif ( that._helper && !o.animate && ( /relative/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css({\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t}\n\n\t\tif ( that._helper && !o.animate && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css({\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"resizable\", \"alsoResize\", {\n\n\tstart: function() {\n\t\tvar that = $(this).resizable( \"instance\" ),\n\t\t\to = that.options;\n\n\t\t$(o.alsoResize).each(function() {\n\t\t\tvar el = $(this);\n\t\t\tel.data(\"ui-resizable-alsoresize\", {\n\t\t\t\twidth: parseInt(el.width(), 10), height: parseInt(el.height(), 10),\n\t\t\t\tleft: parseInt(el.css(\"left\"), 10), top: parseInt(el.css(\"top\"), 10)\n\t\t\t});\n\t\t});\n\t},\n\n\tresize: function(event, ui) {\n\t\tvar that = $(this).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\tdelta = {\n\t\t\t\theight: (that.size.height - os.height) || 0,\n\t\t\t\twidth: (that.size.width - os.width) || 0,\n\t\t\t\ttop: (that.position.top - op.top) || 0,\n\t\t\t\tleft: (that.position.left - op.left) || 0\n\t\t\t};\n\n\t\t\t$(o.alsoResize).each(function() {\n\t\t\t\tvar el = $(this), start = $(this).data(\"ui-resizable-alsoresize\"), style = {},\n\t\t\t\t\tcss = el.parents(ui.originalElement[0]).length ?\n\t\t\t\t\t\t\t[ \"width\", \"height\" ] :\n\t\t\t\t\t\t\t[ \"width\", \"height\", \"top\", \"left\" ];\n\n\t\t\t\t$.each(css, function(i, prop) {\n\t\t\t\t\tvar sum = (start[prop] || 0) + (delta[prop] || 0);\n\t\t\t\t\tif (sum && sum >= 0) {\n\t\t\t\t\t\tstyle[prop] = sum || null;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tel.css(style);\n\t\t\t});\n\t},\n\n\tstop: function() {\n\t\t$(this).removeData(\"resizable-alsoresize\");\n\t}\n});\n\n$.ui.plugin.add(\"resizable\", \"ghost\", {\n\n\tstart: function() {\n\n\t\tvar that = $(this).resizable( \"instance\" ), o = that.options, cs = that.size;\n\n\t\tthat.ghost = that.originalElement.clone();\n\t\tthat.ghost\n\t\t\t.css({\n\t\t\t\topacity: 0.25,\n\t\t\t\tdisplay: \"block\",\n\t\t\t\tposition: \"relative\",\n\t\t\t\theight: cs.height,\n\t\t\t\twidth: cs.width,\n\t\t\t\tmargin: 0,\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t})\n\t\t\t.addClass(\"ui-resizable-ghost\")\n\t\t\t.addClass(typeof o.ghost === \"string\" ? o.ghost : \"\");\n\n\t\tthat.ghost.appendTo(that.helper);\n\n\t},\n\n\tresize: function() {\n\t\tvar that = $(this).resizable( \"instance\" );\n\t\tif (that.ghost) {\n\t\t\tthat.ghost.css({\n\t\t\t\tposition: \"relative\",\n\t\t\t\theight: that.size.height,\n\t\t\t\twidth: that.size.width\n\t\t\t});\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $(this).resizable( \"instance\" );\n\t\tif (that.ghost && that.helper) {\n\t\t\tthat.helper.get(0).removeChild(that.ghost.get(0));\n\t\t}\n\t}\n\n});\n\n$.ui.plugin.add(\"resizable\", \"grid\", {\n\n\tresize: function() {\n\t\tvar outerDimensions,\n\t\t\tthat = $(this).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tcs = that.size,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\ta = that.axis,\n\t\t\tgrid = typeof o.grid === \"number\" ? [ o.grid, o.grid ] : o.grid,\n\t\t\tgridX = (grid[0] || 1),\n\t\t\tgridY = (grid[1] || 1),\n\t\t\tox = Math.round((cs.width - os.width) / gridX) * gridX,\n\t\t\toy = Math.round((cs.height - os.height) / gridY) * gridY,\n\t\t\tnewWidth = os.width + ox,\n\t\t\tnewHeight = os.height + oy,\n\t\t\tisMaxWidth = o.maxWidth && (o.maxWidth < newWidth),\n\t\t\tisMaxHeight = o.maxHeight && (o.maxHeight < newHeight),\n\t\t\tisMinWidth = o.minWidth && (o.minWidth > newWidth),\n\t\t\tisMinHeight = o.minHeight && (o.minHeight > newHeight);\n\n\t\to.grid = grid;\n\n\t\tif (isMinWidth) {\n\t\t\tnewWidth += gridX;\n\t\t}\n\t\tif (isMinHeight) {\n\t\t\tnewHeight += gridY;\n\t\t}\n\t\tif (isMaxWidth) {\n\t\t\tnewWidth -= gridX;\n\t\t}\n\t\tif (isMaxHeight) {\n\t\t\tnewHeight -= gridY;\n\t\t}\n\n\t\tif (/^(se|s|e)$/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t} else if (/^(ne)$/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.top = op.top - oy;\n\t\t} else if (/^(sw)$/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.left = op.left - ox;\n\t\t} else {\n\t\t\tif ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {\n\t\t\t\touterDimensions = that._getPaddingPlusBorderDimensions( this );\n\t\t\t}\n\n\t\t\tif ( newHeight - gridY > 0 ) {\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top - oy;\n\t\t\t} else {\n\t\t\t\tnewHeight = gridY - outerDimensions.height;\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top + os.height - newHeight;\n\t\t\t}\n\t\t\tif ( newWidth - gridX > 0 ) {\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left - ox;\n\t\t\t} else {\n\t\t\t\tnewWidth = gridX - outerDimensions.width;\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left + os.width - newWidth;\n\t\t\t}\n\t\t}\n\t}\n\n});\n\nvar resizable = $.ui.resizable;\n\n\n/*!\n * jQuery UI Dialog 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/dialog/\n */\n\n\nvar dialog = $.widget( \"ui.dialog\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoOpen: true,\n\t\tbuttons: [],\n\t\tcloseOnEscape: true,\n\t\tcloseText: \"Close\",\n\t\tdialogClass: \"\",\n\t\tdraggable: true,\n\t\thide: null,\n\t\theight: \"auto\",\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 150,\n\t\tminWidth: 150,\n\t\tmodal: false,\n\t\tposition: {\n\t\t\tmy: \"center\",\n\t\t\tat: \"center\",\n\t\t\tof: window,\n\t\t\tcollision: \"fit\",\n\t\t\t// Ensure the titlebar is always visible\n\t\t\tusing: function( pos ) {\n\t\t\t\tvar topOffset = $( this ).css( pos ).offset().top;\n\t\t\t\tif ( topOffset < 0 ) {\n\t\t\t\t\t$( this ).css( \"top\", pos.top - topOffset );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tresizable: true,\n\t\tshow: null,\n\t\ttitle: null,\n\t\twidth: 300,\n\n\t\t// callbacks\n\t\tbeforeClose: null,\n\t\tclose: null,\n\t\tdrag: null,\n\t\tdragStart: null,\n\t\tdragStop: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresize: null,\n\t\tresizeStart: null,\n\t\tresizeStop: null\n\t},\n\n\tsizeRelatedOptions: {\n\t\tbuttons: true,\n\t\theight: true,\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true,\n\t\twidth: true\n\t},\n\n\tresizableRelatedOptions: {\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true\n\t},\n\n\t_create: function() {\n\t\tthis.originalCss = {\n\t\t\tdisplay: this.element[ 0 ].style.display,\n\t\t\twidth: this.element[ 0 ].style.width,\n\t\t\tminHeight: this.element[ 0 ].style.minHeight,\n\t\t\tmaxHeight: this.element[ 0 ].style.maxHeight,\n\t\t\theight: this.element[ 0 ].style.height\n\t\t};\n\t\tthis.originalPosition = {\n\t\t\tparent: this.element.parent(),\n\t\t\tindex: this.element.parent().children().index( this.element )\n\t\t};\n\t\tthis.originalTitle = this.element.attr( \"title\" );\n\t\tthis.options.title = this.options.title || this.originalTitle;\n\n\t\tthis._createWrapper();\n\n\t\tthis.element\n\t\t\t.show()\n\t\t\t.removeAttr( \"title\" )\n\t\t\t.addClass( \"ui-dialog-content ui-widget-content\" )\n\t\t\t.appendTo( this.uiDialog );\n\n\t\tthis._createTitlebar();\n\t\tthis._createButtonPane();\n\n\t\tif ( this.options.draggable && $.fn.draggable ) {\n\t\t\tthis._makeDraggable();\n\t\t}\n\t\tif ( this.options.resizable && $.fn.resizable ) {\n\t\t\tthis._makeResizable();\n\t\t}\n\n\t\tthis._isOpen = false;\n\n\t\tthis._trackFocus();\n\t},\n\n\t_init: function() {\n\t\tif ( this.options.autoOpen ) {\n\t\t\tthis.open();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\t\tif ( element && (element.jquery || element.nodeType) ) {\n\t\t\treturn $( element );\n\t\t}\n\t\treturn this.document.find( element || \"body\" ).eq( 0 );\n\t},\n\n\t_destroy: function() {\n\t\tvar next,\n\t\t\toriginalPosition = this.originalPosition;\n\n\t\tthis._untrackInstance();\n\t\tthis._destroyOverlay();\n\n\t\tthis.element\n\t\t\t.removeUniqueId()\n\t\t\t.removeClass( \"ui-dialog-content ui-widget-content\" )\n\t\t\t.css( this.originalCss )\n\t\t\t// Without detaching first, the following becomes really slow\n\t\t\t.detach();\n\n\t\tthis.uiDialog.stop( true, true ).remove();\n\n\t\tif ( this.originalTitle ) {\n\t\t\tthis.element.attr( \"title\", this.originalTitle );\n\t\t}\n\n\t\tnext = originalPosition.parent.children().eq( originalPosition.index );\n\t\t// Don't try to place the dialog next to itself (#8613)\n\t\tif ( next.length && next[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tnext.before( this.element );\n\t\t} else {\n\t\t\toriginalPosition.parent.append( this.element );\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.uiDialog;\n\t},\n\n\tdisable: $.noop,\n\tenable: $.noop,\n\n\tclose: function( event ) {\n\t\tvar activeElement,\n\t\t\tthat = this;\n\n\t\tif ( !this._isOpen || this._trigger( \"beforeClose\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = false;\n\t\tthis._focusedElement = null;\n\t\tthis._destroyOverlay();\n\t\tthis._untrackInstance();\n\n\t\tif ( !this.opener.filter( \":focusable\" ).focus().length ) {\n\n\t\t\t// support: IE9\n\t\t\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\n\t\t\ttry {\n\t\t\t\tactiveElement = this.document[ 0 ].activeElement;\n\n\t\t\t\t// Support: IE9, IE10\n\t\t\t\t// If the <body> is blurred, IE will switch windows, see #4520\n\t\t\t\tif ( activeElement && activeElement.nodeName.toLowerCase() !== \"body\" ) {\n\n\t\t\t\t\t// Hiding a focused element doesn't trigger blur in WebKit\n\t\t\t\t\t// so in case we have nothing to focus on, explicitly blur the active element\n\t\t\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=47182\n\t\t\t\t\t$( activeElement ).blur();\n\t\t\t\t}\n\t\t\t} catch ( error ) {}\n\t\t}\n\n\t\tthis._hide( this.uiDialog, this.options.hide, function() {\n\t\t\tthat._trigger( \"close\", event );\n\t\t});\n\t},\n\n\tisOpen: function() {\n\t\treturn this._isOpen;\n\t},\n\n\tmoveToTop: function() {\n\t\tthis._moveToTop();\n\t},\n\n\t_moveToTop: function( event, silent ) {\n\t\tvar moved = false,\n\t\t\tzIndices = this.uiDialog.siblings( \".ui-front:visible\" ).map(function() {\n\t\t\t\treturn +$( this ).css( \"z-index\" );\n\t\t\t}).get(),\n\t\t\tzIndexMax = Math.max.apply( null, zIndices );\n\n\t\tif ( zIndexMax >= +this.uiDialog.css( \"z-index\" ) ) {\n\t\t\tthis.uiDialog.css( \"z-index\", zIndexMax + 1 );\n\t\t\tmoved = true;\n\t\t}\n\n\t\tif ( moved && !silent ) {\n\t\t\tthis._trigger( \"focus\", event );\n\t\t}\n\t\treturn moved;\n\t},\n\n\topen: function() {\n\t\tvar that = this;\n\t\tif ( this._isOpen ) {\n\t\t\tif ( this._moveToTop() ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = true;\n\t\tthis.opener = $( this.document[ 0 ].activeElement );\n\n\t\tthis._size();\n\t\tthis._position();\n\t\tthis._createOverlay();\n\t\tthis._moveToTop( null, true );\n\n\t\t// Ensure the overlay is moved to the top with the dialog, but only when\n\t\t// opening. The overlay shouldn't move after the dialog is open so that\n\t\t// modeless dialogs opened after the modal dialog stack properly.\n\t\tif ( this.overlay ) {\n\t\t\tthis.overlay.css( \"z-index\", this.uiDialog.css( \"z-index\" ) - 1 );\n\t\t}\n\n\t\tthis._show( this.uiDialog, this.options.show, function() {\n\t\t\tthat._focusTabbable();\n\t\t\tthat._trigger( \"focus\" );\n\t\t});\n\n\t\t// Track the dialog immediately upon openening in case a focus event\n\t\t// somehow occurs outside of the dialog before an element inside the\n\t\t// dialog is focused (#10152)\n\t\tthis._makeFocusTarget();\n\n\t\tthis._trigger( \"open\" );\n\t},\n\n\t_focusTabbable: function() {\n\t\t// Set focus to the first match:\n\t\t// 1. An element that was focused previously\n\t\t// 2. First element inside the dialog matching [autofocus]\n\t\t// 3. Tabbable element inside the content element\n\t\t// 4. Tabbable element inside the buttonpane\n\t\t// 5. The close button\n\t\t// 6. The dialog itself\n\t\tvar hasFocus = this._focusedElement;\n\t\tif ( !hasFocus ) {\n\t\t\thasFocus = this.element.find( \"[autofocus]\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.element.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogButtonPane.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogTitlebarClose.filter( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialog;\n\t\t}\n\t\thasFocus.eq( 0 ).focus();\n\t},\n\n\t_keepFocus: function( event ) {\n\t\tfunction checkFocus() {\n\t\t\tvar activeElement = this.document[0].activeElement,\n\t\t\t\tisActive = this.uiDialog[0] === activeElement ||\n\t\t\t\t\t$.contains( this.uiDialog[0], activeElement );\n\t\t\tif ( !isActive ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t}\n\t\tevent.preventDefault();\n\t\tcheckFocus.call( this );\n\t\t// support: IE\n\t\t// IE <= 8 doesn't prevent moving focus even with event.preventDefault()\n\t\t// so we check again later\n\t\tthis._delay( checkFocus );\n\t},\n\n\t_createWrapper: function() {\n\t\tthis.uiDialog = $(\"<div>\")\n\t\t\t.addClass( \"ui-dialog ui-widget ui-widget-content ui-corner-all ui-front \" +\n\t\t\t\tthis.options.dialogClass )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\t// Setting tabIndex makes the div focusable\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: \"dialog\"\n\t\t\t})\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._on( this.uiDialog, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&\n\t\t\t\t\t\tevent.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// prevent tabbing out of dialogs\n\t\t\t\tif ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar tabbables = this.uiDialog.find( \":tabbable\" ),\n\t\t\t\t\tfirst = tabbables.filter( \":first\" ),\n\t\t\t\t\tlast = tabbables.filter( \":last\" );\n\n\t\t\t\tif ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tfirst.focus();\n\t\t\t\t\t});\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tlast.focus();\n\t\t\t\t\t});\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\t\t\tmousedown: function( event ) {\n\t\t\t\tif ( this._moveToTop( event ) ) {\n\t\t\t\t\tthis._focusTabbable();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// We assume that any existing aria-describedby attribute means\n\t\t// that the dialog content is marked up properly\n\t\t// otherwise we brute force the content as the description\n\t\tif ( !this.element.find( \"[aria-describedby]\" ).length ) {\n\t\t\tthis.uiDialog.attr({\n\t\t\t\t\"aria-describedby\": this.element.uniqueId().attr( \"id\" )\n\t\t\t});\n\t\t}\n\t},\n\n\t_createTitlebar: function() {\n\t\tvar uiDialogTitle;\n\n\t\tthis.uiDialogTitlebar = $( \"<div>\" )\n\t\t\t.addClass( \"ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix\" )\n\t\t\t.prependTo( this.uiDialog );\n\t\tthis._on( this.uiDialogTitlebar, {\n\t\t\tmousedown: function( event ) {\n\t\t\t\t// Don't prevent click on close button (#8838)\n\t\t\t\t// Focusing a dialog that is partially scrolled out of view\n\t\t\t\t// causes the browser to scroll it into view, preventing the click event\n\t\t\t\tif ( !$( event.target ).closest( \".ui-dialog-titlebar-close\" ) ) {\n\t\t\t\t\t// Dialog isn't getting focus when dragging (#8063)\n\t\t\t\t\tthis.uiDialog.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// support: IE\n\t\t// Use type=\"button\" to prevent enter keypresses in textboxes from closing the\n\t\t// dialog in IE (#9312)\n\t\tthis.uiDialogTitlebarClose = $( \"<button type='button'></button>\" )\n\t\t\t.button({\n\t\t\t\tlabel: this.options.closeText,\n\t\t\t\ticons: {\n\t\t\t\t\tprimary: \"ui-icon-closethick\"\n\t\t\t\t},\n\t\t\t\ttext: false\n\t\t\t})\n\t\t\t.addClass( \"ui-dialog-titlebar-close\" )\n\t\t\t.appendTo( this.uiDialogTitlebar );\n\t\tthis._on( this.uiDialogTitlebarClose, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t});\n\n\t\tuiDialogTitle = $( \"<span>\" )\n\t\t\t.uniqueId()\n\t\t\t.addClass( \"ui-dialog-title\" )\n\t\t\t.prependTo( this.uiDialogTitlebar );\n\t\tthis._title( uiDialogTitle );\n\n\t\tthis.uiDialog.attr({\n\t\t\t\"aria-labelledby\": uiDialogTitle.attr( \"id\" )\n\t\t});\n\t},\n\n\t_title: function( title ) {\n\t\tif ( !this.options.title ) {\n\t\t\ttitle.html( \"&#160;\" );\n\t\t}\n\t\ttitle.text( this.options.title );\n\t},\n\n\t_createButtonPane: function() {\n\t\tthis.uiDialogButtonPane = $( \"<div>\" )\n\t\t\t.addClass( \"ui-dialog-buttonpane ui-widget-content ui-helper-clearfix\" );\n\n\t\tthis.uiButtonSet = $( \"<div>\" )\n\t\t\t.addClass( \"ui-dialog-buttonset\" )\n\t\t\t.appendTo( this.uiDialogButtonPane );\n\n\t\tthis._createButtons();\n\t},\n\n\t_createButtons: function() {\n\t\tvar that = this,\n\t\t\tbuttons = this.options.buttons;\n\n\t\t// if we already have a button pane, remove it\n\t\tthis.uiDialogButtonPane.remove();\n\t\tthis.uiButtonSet.empty();\n\n\t\tif ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {\n\t\t\tthis.uiDialog.removeClass( \"ui-dialog-buttons\" );\n\t\t\treturn;\n\t\t}\n\n\t\t$.each( buttons, function( name, props ) {\n\t\t\tvar click, buttonOptions;\n\t\t\tprops = $.isFunction( props ) ?\n\t\t\t\t{ click: props, text: name } :\n\t\t\t\tprops;\n\t\t\t// Default to a non-submitting button\n\t\t\tprops = $.extend( { type: \"button\" }, props );\n\t\t\t// Change the context for the click callback to be the main element\n\t\t\tclick = props.click;\n\t\t\tprops.click = function() {\n\t\t\t\tclick.apply( that.element[ 0 ], arguments );\n\t\t\t};\n\t\t\tbuttonOptions = {\n\t\t\t\ticons: props.icons,\n\t\t\t\ttext: props.showText\n\t\t\t};\n\t\t\tdelete props.icons;\n\t\t\tdelete props.showText;\n\t\t\t$( \"<button></button>\", props )\n\t\t\t\t.button( buttonOptions )\n\t\t\t\t.appendTo( that.uiButtonSet );\n\t\t});\n\t\tthis.uiDialog.addClass( \"ui-dialog-buttons\" );\n\t\tthis.uiDialogButtonPane.appendTo( this.uiDialog );\n\t},\n\n\t_makeDraggable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\tposition: ui.position,\n\t\t\t\toffset: ui.offset\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.draggable({\n\t\t\tcancel: \".ui-dialog-content, .ui-dialog-titlebar-close\",\n\t\t\thandle: \".ui-dialog-titlebar\",\n\t\t\tcontainment: \"document\",\n\t\t\tstart: function( event, ui ) {\n\t\t\t\t$( this ).addClass( \"ui-dialog-dragging\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"dragStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tdrag: function( event, ui ) {\n\t\t\t\tthat._trigger( \"drag\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar left = ui.offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = ui.offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + (left >= 0 ? \"+\" : \"\") + left + \" \" +\n\t\t\t\t\t\t\"top\" + (top >= 0 ? \"+\" : \"\") + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\t$( this ).removeClass( \"ui-dialog-dragging\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"dragStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t});\n\t},\n\n\t_makeResizable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\thandles = options.resizable,\n\t\t\t// .ui-resizable has position: relative defined in the stylesheet\n\t\t\t// but dialogs have to use absolute or fixed positioning\n\t\t\tposition = this.uiDialog.css(\"position\"),\n\t\t\tresizeHandles = typeof handles === \"string\" ?\n\t\t\t\thandles\t:\n\t\t\t\t\"n,e,s,w,se,sw,ne,nw\";\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\toriginalPosition: ui.originalPosition,\n\t\t\t\toriginalSize: ui.originalSize,\n\t\t\t\tposition: ui.position,\n\t\t\t\tsize: ui.size\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.resizable({\n\t\t\tcancel: \".ui-dialog-content\",\n\t\t\tcontainment: \"document\",\n\t\t\talsoResize: this.element,\n\t\t\tmaxWidth: options.maxWidth,\n\t\t\tmaxHeight: options.maxHeight,\n\t\t\tminWidth: options.minWidth,\n\t\t\tminHeight: this._minHeight(),\n\t\t\thandles: resizeHandles,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\t$( this ).addClass( \"ui-dialog-resizing\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"resizeStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tresize: function( event, ui ) {\n\t\t\t\tthat._trigger( \"resize\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar offset = that.uiDialog.offset(),\n\t\t\t\t\tleft = offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.height = that.uiDialog.height();\n\t\t\t\toptions.width = that.uiDialog.width();\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + (left >= 0 ? \"+\" : \"\") + left + \" \" +\n\t\t\t\t\t\t\"top\" + (top >= 0 ? \"+\" : \"\") + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\t$( this ).removeClass( \"ui-dialog-resizing\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"resizeStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t})\n\t\t.css( \"position\", position );\n\t},\n\n\t_trackFocus: function() {\n\t\tthis._on( this.widget(), {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._makeFocusTarget();\n\t\t\t\tthis._focusedElement = $( event.target );\n\t\t\t}\n\t\t});\n\t},\n\n\t_makeFocusTarget: function() {\n\t\tthis._untrackInstance();\n\t\tthis._trackingInstances().unshift( this );\n\t},\n\n\t_untrackInstance: function() {\n\t\tvar instances = this._trackingInstances(),\n\t\t\texists = $.inArray( this, instances );\n\t\tif ( exists !== -1 ) {\n\t\t\tinstances.splice( exists, 1 );\n\t\t}\n\t},\n\n\t_trackingInstances: function() {\n\t\tvar instances = this.document.data( \"ui-dialog-instances\" );\n\t\tif ( !instances ) {\n\t\t\tinstances = [];\n\t\t\tthis.document.data( \"ui-dialog-instances\", instances );\n\t\t}\n\t\treturn instances;\n\t},\n\n\t_minHeight: function() {\n\t\tvar options = this.options;\n\n\t\treturn options.height === \"auto\" ?\n\t\t\toptions.minHeight :\n\t\t\tMath.min( options.minHeight, options.height );\n\t},\n\n\t_position: function() {\n\t\t// Need to show the dialog to get the actual offset in the position plugin\n\t\tvar isVisible = this.uiDialog.is( \":visible\" );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.show();\n\t\t}\n\t\tthis.uiDialog.position( this.options.position );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.hide();\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tresize = false,\n\t\t\tresizableOptions = {};\n\n\t\t$.each( options, function( key, value ) {\n\t\t\tthat._setOption( key, value );\n\n\t\t\tif ( key in that.sizeRelatedOptions ) {\n\t\t\t\tresize = true;\n\t\t\t}\n\t\t\tif ( key in that.resizableRelatedOptions ) {\n\t\t\t\tresizableOptions[ key ] = value;\n\t\t\t}\n\t\t});\n\n\t\tif ( resize ) {\n\t\t\tthis._size();\n\t\t\tthis._position();\n\t\t}\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", resizableOptions );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar isDraggable, isResizable,\n\t\t\tuiDialog = this.uiDialog;\n\n\t\tif ( key === \"dialogClass\" ) {\n\t\t\tuiDialog\n\t\t\t\t.removeClass( this.options.dialogClass )\n\t\t\t\t.addClass( value );\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.uiDialog.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"buttons\" ) {\n\t\t\tthis._createButtons();\n\t\t}\n\n\t\tif ( key === \"closeText\" ) {\n\t\t\tthis.uiDialogTitlebarClose.button({\n\t\t\t\t// Ensure that we always pass a string\n\t\t\t\tlabel: \"\" + value\n\t\t\t});\n\t\t}\n\n\t\tif ( key === \"draggable\" ) {\n\t\t\tisDraggable = uiDialog.is( \":data(ui-draggable)\" );\n\t\t\tif ( isDraggable && !value ) {\n\t\t\t\tuiDialog.draggable( \"destroy\" );\n\t\t\t}\n\n\t\t\tif ( !isDraggable && value ) {\n\t\t\t\tthis._makeDraggable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"position\" ) {\n\t\t\tthis._position();\n\t\t}\n\n\t\tif ( key === \"resizable\" ) {\n\t\t\t// currently resizable, becoming non-resizable\n\t\t\tisResizable = uiDialog.is( \":data(ui-resizable)\" );\n\t\t\tif ( isResizable && !value ) {\n\t\t\t\tuiDialog.resizable( \"destroy\" );\n\t\t\t}\n\n\t\t\t// currently resizable, changing handles\n\t\t\tif ( isResizable && typeof value === \"string\" ) {\n\t\t\t\tuiDialog.resizable( \"option\", \"handles\", value );\n\t\t\t}\n\n\t\t\t// currently non-resizable, becoming resizable\n\t\t\tif ( !isResizable && value !== false ) {\n\t\t\t\tthis._makeResizable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"title\" ) {\n\t\t\tthis._title( this.uiDialogTitlebar.find( \".ui-dialog-title\" ) );\n\t\t}\n\t},\n\n\t_size: function() {\n\t\t// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\n\t\t// divs will both have width and height set, so we need to reset them\n\t\tvar nonContentHeight, minContentHeight, maxContentHeight,\n\t\t\toptions = this.options;\n\n\t\t// Reset content sizing\n\t\tthis.element.show().css({\n\t\t\twidth: \"auto\",\n\t\t\tminHeight: 0,\n\t\t\tmaxHeight: \"none\",\n\t\t\theight: 0\n\t\t});\n\n\t\tif ( options.minWidth > options.width ) {\n\t\t\toptions.width = options.minWidth;\n\t\t}\n\n\t\t// reset wrapper sizing\n\t\t// determine the height of all the non-content elements\n\t\tnonContentHeight = this.uiDialog.css({\n\t\t\t\theight: \"auto\",\n\t\t\t\twidth: options.width\n\t\t\t})\n\t\t\t.outerHeight();\n\t\tminContentHeight = Math.max( 0, options.minHeight - nonContentHeight );\n\t\tmaxContentHeight = typeof options.maxHeight === \"number\" ?\n\t\t\tMath.max( 0, options.maxHeight - nonContentHeight ) :\n\t\t\t\"none\";\n\n\t\tif ( options.height === \"auto\" ) {\n\t\t\tthis.element.css({\n\t\t\t\tminHeight: minContentHeight,\n\t\t\t\tmaxHeight: maxContentHeight,\n\t\t\t\theight: \"auto\"\n\t\t\t});\n\t\t} else {\n\t\t\tthis.element.height( Math.max( 0, options.height - nonContentHeight ) );\n\t\t}\n\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", \"minHeight\", this._minHeight() );\n\t\t}\n\t},\n\n\t_blockFrames: function() {\n\t\tthis.iframeBlocks = this.document.find( \"iframe\" ).map(function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\twidth: iframe.outerWidth(),\n\t\t\t\t\theight: iframe.outerHeight()\n\t\t\t\t})\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.offset( iframe.offset() )[0];\n\t\t});\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_allowInteraction: function( event ) {\n\t\tif ( $( event.target ).closest( \".ui-dialog\" ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: Remove hack when datepicker implements\n\t\t// the .ui-front logic (#8989)\n\t\treturn !!$( event.target ).closest( \".ui-datepicker\" ).length;\n\t},\n\n\t_createOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We use a delay in case the overlay is created from an\n\t\t// event that we're going to be cancelling (#2804)\n\t\tvar isOpening = true;\n\t\tthis._delay(function() {\n\t\t\tisOpening = false;\n\t\t});\n\n\t\tif ( !this.document.data( \"ui-dialog-overlays\" ) ) {\n\n\t\t\t// Prevent use of anchors and inputs\n\t\t\t// Using _on() for an event handler shared across many instances is\n\t\t\t// safe because the dialogs stack and must be closed in reverse order\n\t\t\tthis._on( this.document, {\n\t\t\t\tfocusin: function( event ) {\n\t\t\t\t\tif ( isOpening ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !this._allowInteraction( event ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis._trackingInstances()[ 0 ]._focusTabbable();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.overlay = $( \"<div>\" )\n\t\t\t.addClass( \"ui-widget-overlay ui-front\" )\n\t\t\t.appendTo( this._appendTo() );\n\t\tthis._on( this.overlay, {\n\t\t\tmousedown: \"_keepFocus\"\n\t\t});\n\t\tthis.document.data( \"ui-dialog-overlays\",\n\t\t\t(this.document.data( \"ui-dialog-overlays\" ) || 0) + 1 );\n\t},\n\n\t_destroyOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.overlay ) {\n\t\t\tvar overlays = this.document.data( \"ui-dialog-overlays\" ) - 1;\n\n\t\t\tif ( !overlays ) {\n\t\t\t\tthis.document\n\t\t\t\t\t.unbind( \"focusin\" )\n\t\t\t\t\t.removeData( \"ui-dialog-overlays\" );\n\t\t\t} else {\n\t\t\t\tthis.document.data( \"ui-dialog-overlays\", overlays );\n\t\t\t}\n\n\t\t\tthis.overlay.remove();\n\t\t\tthis.overlay = null;\n\t\t}\n\t}\n});\n\n\n/*!\n * jQuery UI Droppable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/droppable/\n */\n\n\n$.widget( \"ui.droppable\", {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"drop\",\n\toptions: {\n\t\taccept: \"*\",\n\t\tactiveClass: false,\n\t\taddClasses: true,\n\t\tgreedy: false,\n\t\thoverClass: false,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tdeactivate: null,\n\t\tdrop: null,\n\t\tout: null,\n\t\tover: null\n\t},\n\t_create: function() {\n\n\t\tvar proportions,\n\t\t\to = this.options,\n\t\t\taccept = o.accept;\n\n\t\tthis.isover = false;\n\t\tthis.isout = true;\n\n\t\tthis.accept = $.isFunction( accept ) ? accept : function( d ) {\n\t\t\treturn d.is( accept );\n\t\t};\n\n\t\tthis.proportions = function( /* valueToWrite */ ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\t// Store the droppable's proportions\n\t\t\t\tproportions = arguments[ 0 ];\n\t\t\t} else {\n\t\t\t\t// Retrieve or derive the droppable's proportions\n\t\t\t\treturn proportions ?\n\t\t\t\t\tproportions :\n\t\t\t\t\tproportions = {\n\t\t\t\t\t\twidth: this.element[ 0 ].offsetWidth,\n\t\t\t\t\t\theight: this.element[ 0 ].offsetHeight\n\t\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tthis._addToManager( o.scope );\n\n\t\to.addClasses && this.element.addClass( \"ui-droppable\" );\n\n\t},\n\n\t_addToManager: function( scope ) {\n\t\t// Add the reference and positions to the manager\n\t\t$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];\n\t\t$.ui.ddmanager.droppables[ scope ].push( this );\n\t},\n\n\t_splice: function( drop ) {\n\t\tvar i = 0;\n\t\tfor ( ; i < drop.length; i++ ) {\n\t\t\tif ( drop[ i ] === this ) {\n\t\t\t\tdrop.splice( i, 1 );\n\t\t\t}\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\tthis._splice( drop );\n\n\t\tthis.element.removeClass( \"ui-droppable ui-droppable-disabled\" );\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\tif ( key === \"accept\" ) {\n\t\t\tthis.accept = $.isFunction( value ) ? value : function( d ) {\n\t\t\t\treturn d.is( value );\n\t\t\t};\n\t\t} else if ( key === \"scope\" ) {\n\t\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\t\tthis._splice( drop );\n\t\t\tthis._addToManager( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_activate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\t\tif ( this.options.activeClass ) {\n\t\t\tthis.element.addClass( this.options.activeClass );\n\t\t}\n\t\tif ( draggable ){\n\t\t\tthis._trigger( \"activate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_deactivate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\t\tif ( this.options.activeClass ) {\n\t\t\tthis.element.removeClass( this.options.activeClass );\n\t\t}\n\t\tif ( draggable ){\n\t\t\tthis._trigger( \"deactivate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_over: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.addClass( this.options.hoverClass );\n\t\t\t}\n\t\t\tthis._trigger( \"over\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_out: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\n\t\t\t}\n\t\t\tthis._trigger( \"out\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_drop: function( event, custom ) {\n\n\t\tvar draggable = custom || $.ui.ddmanager.current,\n\t\t\tchildrenIntersection = false;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.element.find( \":data(ui-droppable)\" ).not( \".ui-draggable-dragging\" ).each(function() {\n\t\t\tvar inst = $( this ).droppable( \"instance\" );\n\t\t\tif (\n\t\t\t\tinst.options.greedy &&\n\t\t\t\t!inst.options.disabled &&\n\t\t\t\tinst.options.scope === draggable.options.scope &&\n\t\t\t\tinst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&\n\t\t\t\t$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )\n\t\t\t) { childrenIntersection = true; return false; }\n\t\t});\n\t\tif ( childrenIntersection ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.removeClass( this.options.activeClass );\n\t\t\t}\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\n\t\t\t}\n\t\t\tthis._trigger( \"drop\", event, this.ui( draggable ) );\n\t\t\treturn this.element;\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tui: function( c ) {\n\t\treturn {\n\t\t\tdraggable: ( c.currentItem || c.element ),\n\t\t\thelper: c.helper,\n\t\t\tposition: c.position,\n\t\t\toffset: c.positionAbs\n\t\t};\n\t}\n\n});\n\n$.ui.intersect = (function() {\n\tfunction isOverAxis( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t}\n\n\treturn function( draggable, droppable, toleranceMode, event ) {\n\n\t\tif ( !droppable.offset ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,\n\t\t\ty1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,\n\t\t\tx2 = x1 + draggable.helperProportions.width,\n\t\t\ty2 = y1 + draggable.helperProportions.height,\n\t\t\tl = droppable.offset.left,\n\t\t\tt = droppable.offset.top,\n\t\t\tr = l + droppable.proportions().width,\n\t\t\tb = t + droppable.proportions().height;\n\n\t\tswitch ( toleranceMode ) {\n\t\tcase \"fit\":\n\t\t\treturn ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );\n\t\tcase \"intersect\":\n\t\t\treturn ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half\n\t\tcase \"pointer\":\n\t\t\treturn isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );\n\t\tcase \"touch\":\n\t\t\treturn (\n\t\t\t\t( y1 >= t && y1 <= b ) || // Top edge touching\n\t\t\t\t( y2 >= t && y2 <= b ) || // Bottom edge touching\n\t\t\t\t( y1 < t && y2 > b ) // Surrounded vertically\n\t\t\t) && (\n\t\t\t\t( x1 >= l && x1 <= r ) || // Left edge touching\n\t\t\t\t( x2 >= l && x2 <= r ) || // Right edge touching\n\t\t\t\t( x1 < l && x2 > r ) // Surrounded horizontally\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t};\n})();\n\n/*\n\tThis manager tracks offsets of draggables and droppables\n*/\n$.ui.ddmanager = {\n\tcurrent: null,\n\tdroppables: { \"default\": [] },\n\tprepareOffsets: function( t, event ) {\n\n\t\tvar i, j,\n\t\t\tm = $.ui.ddmanager.droppables[ t.options.scope ] || [],\n\t\t\ttype = event ? event.type : null, // workaround for #2317\n\t\t\tlist = ( t.currentItem || t.element ).find( \":data(ui-droppable)\" ).addBack();\n\n\t\tdroppablesLoop: for ( i = 0; i < m.length; i++ ) {\n\n\t\t\t// No disabled and non-accepted\n\t\t\tif ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Filter out elements in the current dragged item\n\t\t\tfor ( j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === m[ i ].element[ 0 ] ) {\n\t\t\t\t\tm[ i ].proportions().height = 0;\n\t\t\t\t\tcontinue droppablesLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tm[ i ].visible = m[ i ].element.css( \"display\" ) !== \"none\";\n\t\t\tif ( !m[ i ].visible ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Activate the droppable if used directly from draggables\n\t\t\tif ( type === \"mousedown\" ) {\n\t\t\t\tm[ i ]._activate.call( m[ i ], event );\n\t\t\t}\n\n\t\t\tm[ i ].offset = m[ i ].element.offset();\n\t\t\tm[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });\n\n\t\t}\n\n\t},\n\tdrop: function( draggable, event ) {\n\n\t\tvar dropped = false;\n\t\t// Create a copy of the droppables in case the list changes during the drop (#9116)\n\t\t$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {\n\n\t\t\tif ( !this.options ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {\n\t\t\t\tdropped = this._drop.call( this, event ) || dropped;\n\t\t\t}\n\n\t\t\tif ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\t\tthis.isout = true;\n\t\t\t\tthis.isover = false;\n\t\t\t\tthis._deactivate.call( this, event );\n\t\t\t}\n\n\t\t});\n\t\treturn dropped;\n\n\t},\n\tdragStart: function( draggable, event ) {\n\t\t// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)\n\t\tdraggable.element.parentsUntil( \"body\" ).bind( \"scroll.droppable\", function() {\n\t\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t\t}\n\t\t});\n\t},\n\tdrag: function( draggable, event ) {\n\n\t\t// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.\n\t\tif ( draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\n\t\t// Run through all droppables and check their positions based on specific tolerance options\n\t\t$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {\n\n\t\t\tif ( this.options.disabled || this.greedyChild || !this.visible ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar parentInstance, scope, parent,\n\t\t\t\tintersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),\n\t\t\t\tc = !intersects && this.isover ? \"isout\" : ( intersects && !this.isover ? \"isover\" : null );\n\t\t\tif ( !c ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.options.greedy ) {\n\t\t\t\t// find droppable parents with same scope\n\t\t\t\tscope = this.options.scope;\n\t\t\t\tparent = this.element.parents( \":data(ui-droppable)\" ).filter(function() {\n\t\t\t\t\treturn $( this ).droppable( \"instance\" ).options.scope === scope;\n\t\t\t\t});\n\n\t\t\t\tif ( parent.length ) {\n\t\t\t\t\tparentInstance = $( parent[ 0 ] ).droppable( \"instance\" );\n\t\t\t\t\tparentInstance.greedyChild = ( c === \"isover\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// we just moved into a greedy child\n\t\t\tif ( parentInstance && c === \"isover\" ) {\n\t\t\t\tparentInstance.isover = false;\n\t\t\t\tparentInstance.isout = true;\n\t\t\t\tparentInstance._out.call( parentInstance, event );\n\t\t\t}\n\n\t\t\tthis[ c ] = true;\n\t\t\tthis[c === \"isout\" ? \"isover\" : \"isout\"] = false;\n\t\t\tthis[c === \"isover\" ? \"_over\" : \"_out\"].call( this, event );\n\n\t\t\t// we just moved out of a greedy child\n\t\t\tif ( parentInstance && c === \"isout\" ) {\n\t\t\t\tparentInstance.isout = false;\n\t\t\t\tparentInstance.isover = true;\n\t\t\t\tparentInstance._over.call( parentInstance, event );\n\t\t\t}\n\t\t});\n\n\t},\n\tdragStop: function( draggable, event ) {\n\t\tdraggable.element.parentsUntil( \"body\" ).unbind( \"scroll.droppable\" );\n\t\t// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)\n\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\t}\n};\n\nvar droppable = $.ui.droppable;\n\n\n/*!\n * jQuery UI Effects 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/effects-core/\n */\n\n\nvar dataSpace = \"ui-effects-\",\n\n\t// Create a local jQuery because jQuery Color relies on it and the\n\t// global may not exist with AMD and a custom build (#10199)\n\tjQuery = $;\n\n$.effects = {\n\teffect: {}\n};\n\n/*!\n * jQuery Color Animations v2.1.2\n * https://github.com/jquery/jquery-color\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * Date: Wed Jan 16 08:47:09 2013 -0600\n */\n(function( jQuery, undefined ) {\n\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\n\n\t// plusequals test for += 100 -= 100\n\trplusequals = /^([\\-+])=\\s*(\\d+\\.?\\d*)/,\n\t// a set of RE's that can match strings and generate color tuples.\n\tstringParsers = [ {\n\t\t\tre: /rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ],\n\t\t\t\t\texecResult[ 3 ],\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ] * 2.55,\n\t\t\t\t\texecResult[ 2 ] * 2.55,\n\t\t\t\t\texecResult[ 3 ] * 2.55,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9])([a-f0-9])([a-f0-9])/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tspace: \"hsla\",\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ] / 100,\n\t\t\t\t\texecResult[ 3 ] / 100,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t} ],\n\n\t// jQuery.Color( )\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\n\t},\n\tspaces = {\n\t\trgba: {\n\t\t\tprops: {\n\t\t\t\tred: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tgreen: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tblue: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thsla: {\n\t\t\tprops: {\n\t\t\t\thue: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"degrees\"\n\t\t\t\t},\n\t\t\t\tsaturation: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t},\n\t\t\t\tlightness: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tpropTypes = {\n\t\t\"byte\": {\n\t\t\tfloor: true,\n\t\t\tmax: 255\n\t\t},\n\t\t\"percent\": {\n\t\t\tmax: 1\n\t\t},\n\t\t\"degrees\": {\n\t\t\tmod: 360,\n\t\t\tfloor: true\n\t\t}\n\t},\n\tsupport = color.support = {},\n\n\t// element for support tests\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\n\n\t// colors = jQuery.Color.names\n\tcolors,\n\n\t// local aliases of functions called often\n\teach = jQuery.each;\n\n// determine rgba support immediately\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\n\n// define cache name and alpha properties\n// for rgba and hsla spaces\neach( spaces, function( spaceName, space ) {\n\tspace.cache = \"_\" + spaceName;\n\tspace.props.alpha = {\n\t\tidx: 3,\n\t\ttype: \"percent\",\n\t\tdef: 1\n\t};\n});\n\nfunction clamp( value, prop, allowEmpty ) {\n\tvar type = propTypes[ prop.type ] || {};\n\n\tif ( value == null ) {\n\t\treturn (allowEmpty || !prop.def) ? null : prop.def;\n\t}\n\n\t// ~~ is an short way of doing floor for positive numbers\n\tvalue = type.floor ? ~~value : parseFloat( value );\n\n\t// IE will pass in empty strings as value for alpha,\n\t// which will hit this case\n\tif ( isNaN( value ) ) {\n\t\treturn prop.def;\n\t}\n\n\tif ( type.mod ) {\n\t\t// we add mod before modding to make sure that negatives values\n\t\t// get converted properly: -10 -> 350\n\t\treturn (value + type.mod) % type.mod;\n\t}\n\n\t// for now all property types without mod have min and max\n\treturn 0 > value ? 0 : type.max < value ? type.max : value;\n}\n\nfunction stringParse( string ) {\n\tvar inst = color(),\n\t\trgba = inst._rgba = [];\n\n\tstring = string.toLowerCase();\n\n\teach( stringParsers, function( i, parser ) {\n\t\tvar parsed,\n\t\t\tmatch = parser.re.exec( string ),\n\t\t\tvalues = match && parser.parse( match ),\n\t\t\tspaceName = parser.space || \"rgba\";\n\n\t\tif ( values ) {\n\t\t\tparsed = inst[ spaceName ]( values );\n\n\t\t\t// if this was an rgba parse the assignment might happen twice\n\t\t\t// oh well....\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\n\t\t\trgba = inst._rgba = parsed._rgba;\n\n\t\t\t// exit each( stringParsers ) here because we matched\n\t\t\treturn false;\n\t\t}\n\t});\n\n\t// Found a stringParser that handled it\n\tif ( rgba.length ) {\n\n\t\t// if this came from a parsed string, force \"transparent\" when alpha is 0\n\t\t// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\n\t\t\tjQuery.extend( rgba, colors.transparent );\n\t\t}\n\t\treturn inst;\n\t}\n\n\t// named colors\n\treturn colors[ string ];\n}\n\ncolor.fn = jQuery.extend( color.prototype, {\n\tparse: function( red, green, blue, alpha ) {\n\t\tif ( red === undefined ) {\n\t\t\tthis._rgba = [ null, null, null, null ];\n\t\t\treturn this;\n\t\t}\n\t\tif ( red.jquery || red.nodeType ) {\n\t\t\tred = jQuery( red ).css( green );\n\t\t\tgreen = undefined;\n\t\t}\n\n\t\tvar inst = this,\n\t\t\ttype = jQuery.type( red ),\n\t\t\trgba = this._rgba = [];\n\n\t\t// more than 1 argument specified - assume ( red, green, blue, alpha )\n\t\tif ( green !== undefined ) {\n\t\t\tred = [ red, green, blue, alpha ];\n\t\t\ttype = \"array\";\n\t\t}\n\n\t\tif ( type === \"string\" ) {\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\n\t\t}\n\n\t\tif ( type === \"array\" ) {\n\t\t\teach( spaces.rgba.props, function( key, prop ) {\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( type === \"object\" ) {\n\t\t\tif ( red instanceof color ) {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tif ( red[ space.cache ] ) {\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tvar cache = space.cache;\n\t\t\t\t\teach( space.props, function( key, prop ) {\n\n\t\t\t\t\t\t// if the cache doesn't exist, and we know how to convert\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\n\n\t\t\t\t\t\t\t// if the value was null, we don't need to copy it\n\t\t\t\t\t\t\t// if the key was alpha, we don't need to copy it either\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// this is the only case where we allow nulls for ALL properties.\n\t\t\t\t\t\t// call clamp with alwaysAllowEmpty\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\n\t\t\t\t\t});\n\n\t\t\t\t\t// everything defined but alpha?\n\t\t\t\t\tif ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\n\t\t\t\t\t\t// use the default of 1\n\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\n\t\t\t\t\t\tif ( space.from ) {\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t},\n\tis: function( compare ) {\n\t\tvar is = color( compare ),\n\t\t\tsame = true,\n\t\t\tinst = this;\n\n\t\teach( spaces, function( _, space ) {\n\t\t\tvar localCache,\n\t\t\t\tisCache = is[ space.cache ];\n\t\t\tif (isCache) {\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\n\t\t\t\teach( space.props, function( _, prop ) {\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\n\t\t\t\t\t\treturn same;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn same;\n\t\t});\n\t\treturn same;\n\t},\n\t_space: function() {\n\t\tvar used = [],\n\t\t\tinst = this;\n\t\teach( spaces, function( spaceName, space ) {\n\t\t\tif ( inst[ space.cache ] ) {\n\t\t\t\tused.push( spaceName );\n\t\t\t}\n\t\t});\n\t\treturn used.pop();\n\t},\n\ttransition: function( other, distance ) {\n\t\tvar end = color( other ),\n\t\t\tspaceName = end._space(),\n\t\t\tspace = spaces[ spaceName ],\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\n\t\t\tresult = start.slice();\n\n\t\tend = end[ space.cache ];\n\t\teach( space.props, function( key, prop ) {\n\t\t\tvar index = prop.idx,\n\t\t\t\tstartValue = start[ index ],\n\t\t\t\tendValue = end[ index ],\n\t\t\t\ttype = propTypes[ prop.type ] || {};\n\n\t\t\t// if null, don't override start value\n\t\t\tif ( endValue === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// if null - use end\n\t\t\tif ( startValue === null ) {\n\t\t\t\tresult[ index ] = endValue;\n\t\t\t} else {\n\t\t\t\tif ( type.mod ) {\n\t\t\t\t\tif ( endValue - startValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue += type.mod;\n\t\t\t\t\t} else if ( startValue - endValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue -= type.mod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\n\t\t\t}\n\t\t});\n\t\treturn this[ spaceName ]( result );\n\t},\n\tblend: function( opaque ) {\n\t\t// if we are already opaque - return ourself\n\t\tif ( this._rgba[ 3 ] === 1 ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar rgb = this._rgba.slice(),\n\t\t\ta = rgb.pop(),\n\t\t\tblend = color( opaque )._rgba;\n\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\n\t\t}));\n\t},\n\ttoRgbaString: function() {\n\t\tvar prefix = \"rgba(\",\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\n\t\t\t\treturn v == null ? ( i > 2 ? 1 : 0 ) : v;\n\t\t\t});\n\n\t\tif ( rgba[ 3 ] === 1 ) {\n\t\t\trgba.pop();\n\t\t\tprefix = \"rgb(\";\n\t\t}\n\n\t\treturn prefix + rgba.join() + \")\";\n\t},\n\ttoHslaString: function() {\n\t\tvar prefix = \"hsla(\",\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\n\t\t\t\tif ( v == null ) {\n\t\t\t\t\tv = i > 2 ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\t// catch 1 and 2\n\t\t\t\tif ( i && i < 3 ) {\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t});\n\n\t\tif ( hsla[ 3 ] === 1 ) {\n\t\t\thsla.pop();\n\t\t\tprefix = \"hsl(\";\n\t\t}\n\t\treturn prefix + hsla.join() + \")\";\n\t},\n\ttoHexString: function( includeAlpha ) {\n\t\tvar rgba = this._rgba.slice(),\n\t\t\talpha = rgba.pop();\n\n\t\tif ( includeAlpha ) {\n\t\t\trgba.push( ~~( alpha * 255 ) );\n\t\t}\n\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\n\n\t\t\t// default to 0 when nulls exist\n\t\t\tv = ( v || 0 ).toString( 16 );\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\n\t\t}).join(\"\");\n\t},\n\ttoString: function() {\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\n\t}\n});\ncolor.fn.parse.prototype = color.fn;\n\n// hsla conversions adapted from:\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\n\nfunction hue2rgb( p, q, h ) {\n\th = ( h + 1 ) % 1;\n\tif ( h * 6 < 1 ) {\n\t\treturn p + ( q - p ) * h * 6;\n\t}\n\tif ( h * 2 < 1) {\n\t\treturn q;\n\t}\n\tif ( h * 3 < 2 ) {\n\t\treturn p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;\n\t}\n\treturn p;\n}\n\nspaces.hsla.to = function( rgba ) {\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\n\t\treturn [ null, null, null, rgba[ 3 ] ];\n\t}\n\tvar r = rgba[ 0 ] / 255,\n\t\tg = rgba[ 1 ] / 255,\n\t\tb = rgba[ 2 ] / 255,\n\t\ta = rgba[ 3 ],\n\t\tmax = Math.max( r, g, b ),\n\t\tmin = Math.min( r, g, b ),\n\t\tdiff = max - min,\n\t\tadd = max + min,\n\t\tl = add * 0.5,\n\t\th, s;\n\n\tif ( min === max ) {\n\t\th = 0;\n\t} else if ( r === max ) {\n\t\th = ( 60 * ( g - b ) / diff ) + 360;\n\t} else if ( g === max ) {\n\t\th = ( 60 * ( b - r ) / diff ) + 120;\n\t} else {\n\t\th = ( 60 * ( r - g ) / diff ) + 240;\n\t}\n\n\t// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n\t// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\n\tif ( diff === 0 ) {\n\t\ts = 0;\n\t} else if ( l <= 0.5 ) {\n\t\ts = diff / add;\n\t} else {\n\t\ts = diff / ( 2 - add );\n\t}\n\treturn [ Math.round(h) % 360, s, l, a == null ? 1 : a ];\n};\n\nspaces.hsla.from = function( hsla ) {\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\n\t\treturn [ null, null, null, hsla[ 3 ] ];\n\t}\n\tvar h = hsla[ 0 ] / 360,\n\t\ts = hsla[ 1 ],\n\t\tl = hsla[ 2 ],\n\t\ta = hsla[ 3 ],\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\n\t\tp = 2 * l - q;\n\n\treturn [\n\t\tMath.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),\n\t\ta\n\t];\n};\n\neach( spaces, function( spaceName, space ) {\n\tvar props = space.props,\n\t\tcache = space.cache,\n\t\tto = space.to,\n\t\tfrom = space.from;\n\n\t// makes rgba() and hsla()\n\tcolor.fn[ spaceName ] = function( value ) {\n\n\t\t// generate a cache for this space if it doesn't exist\n\t\tif ( to && !this[ cache ] ) {\n\t\t\tthis[ cache ] = to( this._rgba );\n\t\t}\n\t\tif ( value === undefined ) {\n\t\t\treturn this[ cache ].slice();\n\t\t}\n\n\t\tvar ret,\n\t\t\ttype = jQuery.type( value ),\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\n\t\t\tlocal = this[ cache ].slice();\n\n\t\teach( props, function( key, prop ) {\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\n\t\t\tif ( val == null ) {\n\t\t\t\tval = local[ prop.idx ];\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\n\t\t});\n\n\t\tif ( from ) {\n\t\t\tret = color( from( local ) );\n\t\t\tret[ cache ] = local;\n\t\t\treturn ret;\n\t\t} else {\n\t\t\treturn color( local );\n\t\t}\n\t};\n\n\t// makes red() green() blue() alpha() hue() saturation() lightness()\n\teach( props, function( key, prop ) {\n\t\t// alpha is included in more than one space\n\t\tif ( color.fn[ key ] ) {\n\t\t\treturn;\n\t\t}\n\t\tcolor.fn[ key ] = function( value ) {\n\t\t\tvar vtype = jQuery.type( value ),\n\t\t\t\tfn = ( key === \"alpha\" ? ( this._hsla ? \"hsla\" : \"rgba\" ) : spaceName ),\n\t\t\t\tlocal = this[ fn ](),\n\t\t\t\tcur = local[ prop.idx ],\n\t\t\t\tmatch;\n\n\t\t\tif ( vtype === \"undefined\" ) {\n\t\t\t\treturn cur;\n\t\t\t}\n\n\t\t\tif ( vtype === \"function\" ) {\n\t\t\t\tvalue = value.call( this, cur );\n\t\t\t\tvtype = jQuery.type( value );\n\t\t\t}\n\t\t\tif ( value == null && prop.empty ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( vtype === \"string\" ) {\n\t\t\t\tmatch = rplusequals.exec( value );\n\t\t\t\tif ( match ) {\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = value;\n\t\t\treturn this[ fn ]( local );\n\t\t};\n\t});\n});\n\n// add cssHook and .fx.step function for each named hook.\n// accept a space separated string of properties\ncolor.hook = function( hook ) {\n\tvar hooks = hook.split( \" \" );\n\teach( hooks, function( i, hook ) {\n\t\tjQuery.cssHooks[ hook ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar parsed, curElem,\n\t\t\t\t\tbackgroundColor = \"\";\n\n\t\t\t\tif ( value !== \"transparent\" && ( jQuery.type( value ) !== \"string\" || ( parsed = stringParse( value ) ) ) ) {\n\t\t\t\t\tvalue = color( parsed || value );\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t(backgroundColor === \"\" || backgroundColor === \"transparent\") &&\n\t\t\t\t\t\t\tcurElem && curElem.style\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\n\t\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\n\t\t\t\t\t\t\tbackgroundColor :\n\t\t\t\t\t\t\t\"_default\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = value.toRgbaString();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\telem.style[ hook ] = value;\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// wrapped to prevent IE from throwing errors on \"invalid\" values like 'auto' or 'inherit'\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\n\t\t\tif ( !fx.colorInit ) {\n\t\t\t\tfx.start = color( fx.elem, hook );\n\t\t\t\tfx.end = color( fx.end );\n\t\t\t\tfx.colorInit = true;\n\t\t\t}\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\n\t\t};\n\t});\n\n};\n\ncolor.hook( stepHooks );\n\njQuery.cssHooks.borderColor = {\n\texpand: function( value ) {\n\t\tvar expanded = {};\n\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( i, part ) {\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\n\t\t});\n\t\treturn expanded;\n\t}\n};\n\n// Basic color names only.\n// Usage of any of the other color names requires adding yourself or including\n// jquery.color.svg-names.js.\ncolors = jQuery.Color.names = {\n\t// 4.1. Basic color keywords\n\taqua: \"#00ffff\",\n\tblack: \"#000000\",\n\tblue: \"#0000ff\",\n\tfuchsia: \"#ff00ff\",\n\tgray: \"#808080\",\n\tgreen: \"#008000\",\n\tlime: \"#00ff00\",\n\tmaroon: \"#800000\",\n\tnavy: \"#000080\",\n\tolive: \"#808000\",\n\tpurple: \"#800080\",\n\tred: \"#ff0000\",\n\tsilver: \"#c0c0c0\",\n\tteal: \"#008080\",\n\twhite: \"#ffffff\",\n\tyellow: \"#ffff00\",\n\n\t// 4.2.3. \"transparent\" color keyword\n\ttransparent: [ null, null, null, 0 ],\n\n\t_default: \"#ffffff\"\n};\n\n})( jQuery );\n\n/******************************************************************************/\n/****************************** CLASS ANIMATIONS ******************************/\n/******************************************************************************/\n(function() {\n\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\n\tshorthandStyles = {\n\t\tborder: 1,\n\t\tborderBottom: 1,\n\t\tborderColor: 1,\n\t\tborderLeft: 1,\n\t\tborderRight: 1,\n\t\tborderTop: 1,\n\t\tborderWidth: 1,\n\t\tmargin: 1,\n\t\tpadding: 1\n\t};\n\n$.each([ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ], function( _, prop ) {\n\t$.fx.step[ prop ] = function( fx ) {\n\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\n\t\t\tjQuery.style( fx.elem, prop, fx.end );\n\t\t\tfx.setAttr = true;\n\t\t}\n\t};\n});\n\nfunction getElementStyles( elem ) {\n\tvar key, len,\n\t\tstyle = elem.ownerDocument.defaultView ?\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\n\t\t\telem.currentStyle,\n\t\tstyles = {};\n\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\n\t\tlen = style.length;\n\t\twhile ( len-- ) {\n\t\t\tkey = style[ len ];\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ $.camelCase( key ) ] = style[ key ];\n\t\t\t}\n\t\t}\n\t// support: Opera, IE <9\n\t} else {\n\t\tfor ( key in style ) {\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ key ] = style[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn styles;\n}\n\nfunction styleDifference( oldStyle, newStyle ) {\n\tvar diff = {},\n\t\tname, value;\n\n\tfor ( name in newStyle ) {\n\t\tvalue = newStyle[ name ];\n\t\tif ( oldStyle[ name ] !== value ) {\n\t\t\tif ( !shorthandStyles[ name ] ) {\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\n\t\t\t\t\tdiff[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diff;\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n$.effects.animateClass = function( value, duration, easing, callback ) {\n\tvar o = $.speed( duration, easing, callback );\n\n\treturn this.queue( function() {\n\t\tvar animated = $( this ),\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\n\t\t\tapplyClassChange,\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\n\n\t\t// map the animated objects to store the original styles.\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar el = $( this );\n\t\t\treturn {\n\t\t\t\tel: el,\n\t\t\t\tstart: getElementStyles( this )\n\t\t\t};\n\t\t});\n\n\t\t// apply class change\n\t\tapplyClassChange = function() {\n\t\t\t$.each( classAnimationActions, function(i, action) {\n\t\t\t\tif ( value[ action ] ) {\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tapplyClassChange();\n\n\t\t// map all animated objects again - calculate new styles and diff\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\n\t\t\tthis.diff = styleDifference( this.start, this.end );\n\t\t\treturn this;\n\t\t});\n\n\t\t// apply original class\n\t\tanimated.attr( \"class\", baseClass );\n\n\t\t// map all animated objects again - this time collecting a promise\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar styleInfo = this,\n\t\t\t\tdfd = $.Deferred(),\n\t\t\t\topts = $.extend({}, o, {\n\t\t\t\t\tqueue: false,\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tdfd.resolve( styleInfo );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tthis.el.animate( this.diff, opts );\n\t\t\treturn dfd.promise();\n\t\t});\n\n\t\t// once all animations have completed:\n\t\t$.when.apply( $, allAnimations.get() ).done(function() {\n\n\t\t\t// set the final class\n\t\t\tapplyClassChange();\n\n\t\t\t// for each animated element,\n\t\t\t// clear all css properties that were animated\n\t\t\t$.each( arguments, function() {\n\t\t\t\tvar el = this.el;\n\t\t\t\t$.each( this.diff, function(key) {\n\t\t\t\t\tel.css( key, \"\" );\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// this is guarnteed to be there if you use jQuery.speed()\n\t\t\t// it also handles dequeuing the next anim...\n\t\t\to.complete.call( animated[ 0 ] );\n\t\t});\n\t});\n};\n\n$.fn.extend({\n\taddClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn speed ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.addClass ),\n\n\tremoveClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn arguments.length > 1 ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.removeClass ),\n\n\ttoggleClass: (function( orig ) {\n\t\treturn function( classNames, force, speed, easing, callback ) {\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\n\t\t\t\tif ( !speed ) {\n\t\t\t\t\t// without speed parameter\n\t\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t\t(force ? { add: classNames } : { remove: classNames }),\n\t\t\t\t\t\tspeed, easing, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// without force parameter\n\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggleClass ),\n\n\tswitchClass: function( remove, add, speed, easing, callback) {\n\t\treturn $.effects.animateClass.call( this, {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}, speed, easing, callback );\n\t}\n});\n\n})();\n\n/******************************************************************************/\n/*********************************** EFFECTS **********************************/\n/******************************************************************************/\n\n(function() {\n\n$.extend( $.effects, {\n\tversion: \"1.11.4\",\n\n\t// Saves a set of properties in a data storage\n\tsave: function( element, set ) {\n\t\tfor ( var i = 0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Restores a set of previously saved properties from a data storage\n\trestore: function( element, set ) {\n\t\tvar val, i;\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\tval = element.data( dataSpace + set[ i ] );\n\t\t\t\t// support: jQuery 1.6.2\n\t\t\t\t// http://bugs.jquery.com/ticket/9917\n\t\t\t\t// jQuery 1.6.2 incorrectly returns undefined for any falsy value.\n\t\t\t\t// We can't differentiate between \"\" and 0 here, so we just assume\n\t\t\t\t// empty string since it's likely to be a more common value...\n\t\t\t\tif ( val === undefined ) {\n\t\t\t\t\tval = \"\";\n\t\t\t\t}\n\t\t\t\telement.css( set[ i ], val );\n\t\t\t}\n\t\t}\n\t},\n\n\tsetMode: function( el, mode ) {\n\t\tif (mode === \"toggle\") {\n\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n\t\t}\n\t\treturn mode;\n\t},\n\n\t// Translates a [top,left] array into a baseline value\n\t// this should be a little more flexible in the future to handle a string & hash\n\tgetBaseline: function( origin, original ) {\n\t\tvar y, x;\n\t\tswitch ( origin[ 0 ] ) {\n\t\t\tcase \"top\": y = 0; break;\n\t\t\tcase \"middle\": y = 0.5; break;\n\t\t\tcase \"bottom\": y = 1; break;\n\t\t\tdefault: y = origin[ 0 ] / original.height;\n\t\t}\n\t\tswitch ( origin[ 1 ] ) {\n\t\t\tcase \"left\": x = 0; break;\n\t\t\tcase \"center\": x = 0.5; break;\n\t\t\tcase \"right\": x = 1; break;\n\t\t\tdefault: x = origin[ 1 ] / original.width;\n\t\t}\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\n\t// Wraps the element around a wrapper that copies position properties\n\tcreateWrapper: function( element ) {\n\n\t\t// if the element is already wrapped, return it\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" )) {\n\t\t\treturn element.parent();\n\t\t}\n\n\t\t// wrap the element\n\t\tvar props = {\n\t\t\t\twidth: element.outerWidth(true),\n\t\t\t\theight: element.outerHeight(true),\n\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t},\n\t\t\twrapper = $( \"<div></div>\" )\n\t\t\t\t.addClass( \"ui-effects-wrapper\" )\n\t\t\t\t.css({\n\t\t\t\t\tfontSize: \"100%\",\n\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0\n\t\t\t\t}),\n\t\t\t// Store the size in case width/height are defined in % - Fixes #5245\n\t\t\tsize = {\n\t\t\t\twidth: element.width(),\n\t\t\t\theight: element.height()\n\t\t\t},\n\t\t\tactive = document.activeElement;\n\n\t\t// support: Firefox\n\t\t// Firefox incorrectly exposes anonymous content\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\n\t\ttry {\n\t\t\tactive.id;\n\t\t} catch ( e ) {\n\t\t\tactive = document.body;\n\t\t}\n\n\t\telement.wrap( wrapper );\n\n\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t$( active ).focus();\n\t\t}\n\n\t\twrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element\n\n\t\t// transfer positioning properties to the wrapper\n\t\tif ( element.css( \"position\" ) === \"static\" ) {\n\t\t\twrapper.css({ position: \"relative\" });\n\t\t\telement.css({ position: \"relative\" });\n\t\t} else {\n\t\t\t$.extend( props, {\n\t\t\t\tposition: element.css( \"position\" ),\n\t\t\t\tzIndex: element.css( \"z-index\" )\n\t\t\t});\n\t\t\t$.each([ \"top\", \"left\", \"bottom\", \"right\" ], function(i, pos) {\n\t\t\t\tprops[ pos ] = element.css( pos );\n\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n\t\t\t\t\tprops[ pos ] = \"auto\";\n\t\t\t\t}\n\t\t\t});\n\t\t\telement.css({\n\t\t\t\tposition: \"relative\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: \"auto\",\n\t\t\t\tbottom: \"auto\"\n\t\t\t});\n\t\t}\n\t\telement.css(size);\n\n\t\treturn wrapper.css( props ).show();\n\t},\n\n\tremoveWrapper: function( element ) {\n\t\tvar active = document.activeElement;\n\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\telement.parent().replaceWith( element );\n\n\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t$( active ).focus();\n\t\t\t}\n\t\t}\n\n\t\treturn element;\n\t},\n\n\tsetTransition: function( element, list, factor, value ) {\n\t\tvalue = value || {};\n\t\t$.each( list, function( i, x ) {\n\t\t\tvar unit = element.cssUnit( x );\n\t\t\tif ( unit[ 0 ] > 0 ) {\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\n\t\t\t}\n\t\t});\n\t\treturn value;\n\t}\n});\n\n// return an effect options object for the given parameters:\nfunction _normalizeArguments( effect, options, speed, callback ) {\n\n\t// allow passing all options as the first parameter\n\tif ( $.isPlainObject( effect ) ) {\n\t\toptions = effect;\n\t\teffect = effect.effect;\n\t}\n\n\t// convert to an object\n\teffect = { effect: effect };\n\n\t// catch (effect, null, ...)\n\tif ( options == null ) {\n\t\toptions = {};\n\t}\n\n\t// catch (effect, callback)\n\tif ( $.isFunction( options ) ) {\n\t\tcallback = options;\n\t\tspeed = null;\n\t\toptions = {};\n\t}\n\n\t// catch (effect, speed, ?)\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\n\t\tcallback = speed;\n\t\tspeed = options;\n\t\toptions = {};\n\t}\n\n\t// catch (effect, options, callback)\n\tif ( $.isFunction( speed ) ) {\n\t\tcallback = speed;\n\t\tspeed = null;\n\t}\n\n\t// add options to effect\n\tif ( options ) {\n\t\t$.extend( effect, options );\n\t}\n\n\tspeed = speed || options.duration;\n\teffect.duration = $.fx.off ? 0 :\n\t\ttypeof speed === \"number\" ? speed :\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\n\t\t$.fx.speeds._default;\n\n\teffect.complete = callback || options.complete;\n\n\treturn effect;\n}\n\nfunction standardAnimationOption( option ) {\n\t// Valid standard speeds (nothing, number, named speed)\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Invalid strings - treat as \"normal\" speed\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Complete callback\n\tif ( $.isFunction( option ) ) {\n\t\treturn true;\n\t}\n\n\t// Options hash (but not naming an effect)\n\tif ( typeof option === \"object\" && !option.effect ) {\n\t\treturn true;\n\t}\n\n\t// Didn't match any standard API\n\treturn false;\n}\n\n$.fn.extend({\n\teffect: function( /* effect, options, speed, callback */ ) {\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\n\t\t\tmode = args.mode,\n\t\t\tqueue = args.queue,\n\t\t\teffectMethod = $.effects.effect[ args.effect ];\n\n\t\tif ( $.fx.off || !effectMethod ) {\n\t\t\t// delegate to the original method (e.g., .show()) if possible\n\t\t\tif ( mode ) {\n\t\t\t\treturn this[ mode ]( args.duration, args.complete );\n\t\t\t} else {\n\t\t\t\treturn this.each( function() {\n\t\t\t\t\tif ( args.complete ) {\n\t\t\t\t\t\targs.complete.call( this );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction run( next ) {\n\t\t\tvar elem = $( this ),\n\t\t\t\tcomplete = args.complete,\n\t\t\t\tmode = args.mode;\n\n\t\t\tfunction done() {\n\t\t\t\tif ( $.isFunction( complete ) ) {\n\t\t\t\t\tcomplete.call( elem[0] );\n\t\t\t\t}\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the element already has the correct final state, delegate to\n\t\t\t// the core methods so the internal tracking of \"olddisplay\" works.\n\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n\t\t\t\telem[ mode ]();\n\t\t\t\tdone();\n\t\t\t} else {\n\t\t\t\teffectMethod.call( elem[0], args, done );\n\t\t\t}\n\t\t}\n\n\t\treturn queue === false ? this.each( run ) : this.queue( queue || \"fx\", run );\n\t},\n\n\tshow: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"show\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.show ),\n\n\thide: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"hide\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.hide ),\n\n\ttoggle: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"toggle\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggle ),\n\n\t// helper functions\n\tcssUnit: function(key) {\n\t\tvar style = this.css( key ),\n\t\t\tval = [];\n\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\n\t\t\t\tval = [ parseFloat( style ), unit ];\n\t\t\t}\n\t\t});\n\t\treturn val;\n\t}\n});\n\n})();\n\n/******************************************************************************/\n/*********************************** EASING ***********************************/\n/******************************************************************************/\n\n(function() {\n\n// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\nvar baseEasings = {};\n\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\n\tbaseEasings[ name ] = function( p ) {\n\t\treturn Math.pow( p, i + 2 );\n\t};\n});\n\n$.extend( baseEasings, {\n\tSine: function( p ) {\n\t\treturn 1 - Math.cos( p * Math.PI / 2 );\n\t},\n\tCirc: function( p ) {\n\t\treturn 1 - Math.sqrt( 1 - p * p );\n\t},\n\tElastic: function( p ) {\n\t\treturn p === 0 || p === 1 ? p :\n\t\t\t-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );\n\t},\n\tBack: function( p ) {\n\t\treturn p * p * ( 3 * p - 2 );\n\t},\n\tBounce: function( p ) {\n\t\tvar pow2,\n\t\t\tbounce = 4;\n\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}\n\t\treturn 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );\n\t}\n});\n\n$.each( baseEasings, function( name, easeIn ) {\n\t$.easing[ \"easeIn\" + name ] = easeIn;\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\n\t\treturn 1 - easeIn( 1 - p );\n\t};\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\n\t\treturn p < 0.5 ?\n\t\t\teaseIn( p * 2 ) / 2 :\n\t\t\t1 - easeIn( p * -2 + 2 ) / 2;\n\t};\n});\n\n})();\n\nvar effect = $.effects;\n\n\n/*!\n * jQuery UI Effects Blind 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/blind-effect/\n */\n\n\nvar effectBlind = $.effects.effect.blind = function( o, done ) {\n\t// Create element\n\tvar el = $( this ),\n\t\trvertical = /up|down|vertical/,\n\t\trpositivemotion = /up|left|vertical|horizontal/,\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tdirection = o.direction || \"up\",\n\t\tvertical = rvertical.test( direction ),\n\t\tref = vertical ? \"height\" : \"width\",\n\t\tref2 = vertical ? \"top\" : \"left\",\n\t\tmotion = rpositivemotion.test( direction ),\n\t\tanimation = {},\n\t\tshow = mode === \"show\",\n\t\twrapper, distance, margin;\n\n\t// if already wrapped, the wrapper's properties are my property. #6245\n\tif ( el.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t$.effects.save( el.parent(), props );\n\t} else {\n\t\t$.effects.save( el, props );\n\t}\n\tel.show();\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\n\tdistance = wrapper[ ref ]();\n\tmargin = parseFloat( wrapper.css( ref2 ) ) || 0;\n\n\tanimation[ ref ] = show ? distance : 0;\n\tif ( !motion ) {\n\t\tel\n\t\t\t.css( vertical ? \"bottom\" : \"right\", 0 )\n\t\t\t.css( vertical ? \"top\" : \"left\", \"auto\" )\n\t\t\t.css({ position: \"absolute\" });\n\n\t\tanimation[ ref2 ] = show ? margin : distance + margin;\n\t}\n\n\t// start at 0 if we are showing\n\tif ( show ) {\n\t\twrapper.css( ref, 0 );\n\t\tif ( !motion ) {\n\t\t\twrapper.css( ref2, margin + distance );\n\t\t}\n\t}\n\n\t// Animate\n\twrapper.animate( animation, {\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tqueue: false,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Bounce 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/bounce-effect/\n */\n\n\nvar effectBounce = $.effects.effect.bounce = function( o, done ) {\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\n\t\t// defaults:\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\thide = mode === \"hide\",\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"up\",\n\t\tdistance = o.distance,\n\t\ttimes = o.times || 5,\n\n\t\t// number of internal animations\n\t\tanims = times * 2 + ( show || hide ? 1 : 0 ),\n\t\tspeed = o.duration / anims,\n\t\teasing = o.easing,\n\n\t\t// utility:\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ),\n\t\ti,\n\t\tupAnim,\n\t\tdownAnim,\n\n\t\t// we will need to re-assemble the queue to stack our animations in place\n\t\tqueue = el.queue(),\n\t\tqueuelen = queue.length;\n\n\t// Avoid touching opacity to prevent clearType and PNG issues in IE\n\tif ( show || hide ) {\n\t\tprops.push( \"opacity\" );\n\t}\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el ); // Create Wrapper\n\n\t// default distance for the BIGGEST bounce is the outer Distance / 3\n\tif ( !distance ) {\n\t\tdistance = el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]() / 3;\n\t}\n\n\tif ( show ) {\n\t\tdownAnim = { opacity: 1 };\n\t\tdownAnim[ ref ] = 0;\n\n\t\t// if we are showing, force opacity 0 and set the initial position\n\t\t// then do the \"first\" animation\n\t\tel.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion ? -distance * 2 : distance * 2 )\n\t\t\t.animate( downAnim, speed, easing );\n\t}\n\n\t// start at the smallest distance if we are hiding\n\tif ( hide ) {\n\t\tdistance = distance / Math.pow( 2, times - 1 );\n\t}\n\n\tdownAnim = {};\n\tdownAnim[ ref ] = 0;\n\t// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here\n\tfor ( i = 0; i < times; i++ ) {\n\t\tupAnim = {};\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\tel.animate( upAnim, speed, easing )\n\t\t\t.animate( downAnim, speed, easing );\n\n\t\tdistance = hide ? distance * 2 : distance / 2;\n\t}\n\n\t// Last Bounce when Hiding\n\tif ( hide ) {\n\t\tupAnim = { opacity: 0 };\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\tel.animate( upAnim, speed, easing );\n\t}\n\n\tel.queue(function() {\n\t\tif ( hide ) {\n\t\t\tel.hide();\n\t\t}\n\t\t$.effects.restore( el, props );\n\t\t$.effects.removeWrapper( el );\n\t\tdone();\n\t});\n\n\t// inject all the animations we just queued to be first in line (after \"inprogress\")\n\tif ( queuelen > 1) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\tel.dequeue();\n\n};\n\n\n/*!\n * jQuery UI Effects Clip 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/clip-effect/\n */\n\n\nvar effectClip = $.effects.effect.clip = function( o, done ) {\n\t// Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"vertical\",\n\t\tvert = direction === \"vertical\",\n\t\tsize = vert ? \"height\" : \"width\",\n\t\tposition = vert ? \"top\" : \"left\",\n\t\tanimation = {},\n\t\twrapper, animate, distance;\n\n\t// Save & Show\n\t$.effects.save( el, props );\n\tel.show();\n\n\t// Create Wrapper\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\tanimate = ( el[0].tagName === \"IMG\" ) ? wrapper : el;\n\tdistance = animate[ size ]();\n\n\t// Shift\n\tif ( show ) {\n\t\tanimate.css( size, 0 );\n\t\tanimate.css( position, distance / 2 );\n\t}\n\n\t// Create Animation Object:\n\tanimation[ size ] = show ? distance : 0;\n\tanimation[ position ] = show ? 0 : distance / 2;\n\n\t// Animate\n\tanimate.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( !show ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n\n};\n\n\n/*!\n * jQuery UI Effects Drop 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/drop-effect/\n */\n\n\nvar effectDrop = $.effects.effect.drop = function( o, done ) {\n\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"opacity\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ) ? \"pos\" : \"neg\",\n\t\tanimation = {\n\t\t\topacity: show ? 1 : 0\n\t\t},\n\t\tdistance;\n\n\t// Adjust\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ) / 2;\n\n\tif ( show ) {\n\t\tel\n\t\t\t.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion === \"pos\" ? -distance : distance );\n\t}\n\n\t// Animation\n\tanimation[ ref ] = ( show ?\n\t\t( motion === \"pos\" ? \"+=\" : \"-=\" ) :\n\t\t( motion === \"pos\" ? \"-=\" : \"+=\" ) ) +\n\t\tdistance;\n\n\t// Animate\n\tel.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Explode 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/explode-effect/\n */\n\n\nvar effectExplode = $.effects.effect.explode = function( o, done ) {\n\n\tvar rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,\n\t\tcells = rows,\n\t\tel = $( this ),\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\n\t\t// show and then visibility:hidden the element before calculating offset\n\t\toffset = el.show().css( \"visibility\", \"hidden\" ).offset(),\n\n\t\t// width and height of a piece\n\t\twidth = Math.ceil( el.outerWidth() / cells ),\n\t\theight = Math.ceil( el.outerHeight() / rows ),\n\t\tpieces = [],\n\n\t\t// loop\n\t\ti, j, left, top, mx, my;\n\n\t// children animate complete:\n\tfunction childComplete() {\n\t\tpieces.push( this );\n\t\tif ( pieces.length === rows * cells ) {\n\t\t\tanimComplete();\n\t\t}\n\t}\n\n\t// clone the element for each row and cell.\n\tfor ( i = 0; i < rows ; i++ ) { // ===>\n\t\ttop = offset.top + i * height;\n\t\tmy = i - ( rows - 1 ) / 2 ;\n\n\t\tfor ( j = 0; j < cells ; j++ ) { // |||\n\t\t\tleft = offset.left + j * width;\n\t\t\tmx = j - ( cells - 1 ) / 2 ;\n\n\t\t\t// Create a clone of the now hidden main element that will be absolute positioned\n\t\t\t// within a wrapper div off the -left and -top equal to size of our pieces\n\t\t\tel\n\t\t\t\t.clone()\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.wrap( \"<div></div>\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tvisibility: \"visible\",\n\t\t\t\t\tleft: -j * width,\n\t\t\t\t\ttop: -i * height\n\t\t\t\t})\n\n\t\t\t// select the wrapper - make it overflow: hidden and absolute positioned based on\n\t\t\t// where the original was located +left and +top equal to the size of pieces\n\t\t\t\t.parent()\n\t\t\t\t.addClass( \"ui-effects-explode\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height,\n\t\t\t\t\tleft: left + ( show ? mx * width : 0 ),\n\t\t\t\t\ttop: top + ( show ? my * height : 0 ),\n\t\t\t\t\topacity: show ? 0 : 1\n\t\t\t\t}).animate({\n\t\t\t\t\tleft: left + ( show ? 0 : mx * width ),\n\t\t\t\t\ttop: top + ( show ? 0 : my * height ),\n\t\t\t\t\topacity: show ? 1 : 0\n\t\t\t\t}, o.duration || 500, o.easing, childComplete );\n\t\t}\n\t}\n\n\tfunction animComplete() {\n\t\tel.css({\n\t\t\tvisibility: \"visible\"\n\t\t});\n\t\t$( pieces ).remove();\n\t\tif ( !show ) {\n\t\t\tel.hide();\n\t\t}\n\t\tdone();\n\t}\n};\n\n\n/*!\n * jQuery UI Effects Fade 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/fade-effect/\n */\n\n\nvar effectFade = $.effects.effect.fade = function( o, done ) {\n\tvar el = $( this ),\n\t\tmode = $.effects.setMode( el, o.mode || \"toggle\" );\n\n\tel.animate({\n\t\topacity: mode\n\t}, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: done\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Fold 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/fold-effect/\n */\n\n\nvar effectFold = $.effects.effect.fold = function( o, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tsize = o.size || 15,\n\t\tpercent = /([0-9]+)%/.exec( size ),\n\t\thorizFirst = !!o.horizFirst,\n\t\twidthFirst = show !== horizFirst,\n\t\tref = widthFirst ? [ \"width\", \"height\" ] : [ \"height\", \"width\" ],\n\t\tduration = o.duration / 2,\n\t\twrapper, distance,\n\t\tanimation1 = {},\n\t\tanimation2 = {};\n\n\t$.effects.save( el, props );\n\tel.show();\n\n\t// Create Wrapper\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\tdistance = widthFirst ?\n\t\t[ wrapper.width(), wrapper.height() ] :\n\t\t[ wrapper.height(), wrapper.width() ];\n\n\tif ( percent ) {\n\t\tsize = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];\n\t}\n\tif ( show ) {\n\t\twrapper.css( horizFirst ? {\n\t\t\theight: 0,\n\t\t\twidth: size\n\t\t} : {\n\t\t\theight: size,\n\t\t\twidth: 0\n\t\t});\n\t}\n\n\t// Animation\n\tanimation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;\n\tanimation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;\n\n\t// Animate\n\twrapper\n\t\t.animate( animation1, duration, o.easing )\n\t\t.animate( animation2, duration, o.easing, function() {\n\t\t\tif ( hide ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t});\n\n};\n\n\n/*!\n * jQuery UI Effects Highlight 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/highlight-effect/\n */\n\n\nvar effectHighlight = $.effects.effect.highlight = function( o, done ) {\n\tvar elem = $( this ),\n\t\tprops = [ \"backgroundImage\", \"backgroundColor\", \"opacity\" ],\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\n\t\tanimation = {\n\t\t\tbackgroundColor: elem.css( \"backgroundColor\" )\n\t\t};\n\n\tif (mode === \"hide\") {\n\t\tanimation.opacity = 0;\n\t}\n\n\t$.effects.save( elem, props );\n\n\telem\n\t\t.show()\n\t\t.css({\n\t\t\tbackgroundImage: \"none\",\n\t\t\tbackgroundColor: o.color || \"#ffff99\"\n\t\t})\n\t\t.animate( animation, {\n\t\t\tqueue: false,\n\t\t\tduration: o.duration,\n\t\t\teasing: o.easing,\n\t\t\tcomplete: function() {\n\t\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\t\telem.hide();\n\t\t\t\t}\n\t\t\t\t$.effects.restore( elem, props );\n\t\t\t\tdone();\n\t\t\t}\n\t\t});\n};\n\n\n/*!\n * jQuery UI Effects Size 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/size-effect/\n */\n\n\nvar effectSize = $.effects.effect.size = function( o, done ) {\n\n\t// Create element\n\tvar original, baseline, factor,\n\t\tel = $( this ),\n\t\tprops0 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\", \"overflow\", \"opacity\" ],\n\n\t\t// Always restore\n\t\tprops1 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"overflow\", \"opacity\" ],\n\n\t\t// Copy for children\n\t\tprops2 = [ \"width\", \"height\", \"overflow\" ],\n\t\tcProps = [ \"fontSize\" ],\n\t\tvProps = [ \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\" ],\n\t\thProps = [ \"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\" ],\n\n\t\t// Set options\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\trestore = o.restore || mode !== \"effect\",\n\t\tscale = o.scale || \"both\",\n\t\torigin = o.origin || [ \"middle\", \"center\" ],\n\t\tposition = el.css( \"position\" ),\n\t\tprops = restore ? props0 : props1,\n\t\tzero = {\n\t\t\theight: 0,\n\t\t\twidth: 0,\n\t\t\touterHeight: 0,\n\t\t\touterWidth: 0\n\t\t};\n\n\tif ( mode === \"show\" ) {\n\t\tel.show();\n\t}\n\toriginal = {\n\t\theight: el.height(),\n\t\twidth: el.width(),\n\t\touterHeight: el.outerHeight(),\n\t\touterWidth: el.outerWidth()\n\t};\n\n\tif ( o.mode === \"toggle\" && mode === \"show\" ) {\n\t\tel.from = o.to || zero;\n\t\tel.to = o.from || original;\n\t} else {\n\t\tel.from = o.from || ( mode === \"show\" ? zero : original );\n\t\tel.to = o.to || ( mode === \"hide\" ? zero : original );\n\t}\n\n\t// Set scaling factor\n\tfactor = {\n\t\tfrom: {\n\t\t\ty: el.from.height / original.height,\n\t\t\tx: el.from.width / original.width\n\t\t},\n\t\tto: {\n\t\t\ty: el.to.height / original.height,\n\t\t\tx: el.to.width / original.width\n\t\t}\n\t};\n\n\t// Scale the css box\n\tif ( scale === \"box\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tprops = props.concat( vProps );\n\t\t\tel.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );\n\t\t\tel.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );\n\t\t}\n\n\t\t// Horizontal props scaling\n\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\tprops = props.concat( hProps );\n\t\t\tel.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );\n\t\t\tel.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );\n\t\t}\n\t}\n\n\t// Scale the content\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tprops = props.concat( cProps ).concat( props2 );\n\t\t\tel.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );\n\t\t\tel.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );\n\t\t}\n\t}\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\tel.css( \"overflow\", \"hidden\" ).css( el.from );\n\n\t// Adjust\n\tif (origin) { // Calculate baseline shifts\n\t\tbaseline = $.effects.getBaseline( origin, original );\n\t\tel.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;\n\t\tel.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;\n\t\tel.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;\n\t\tel.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;\n\t}\n\tel.css( el.from ); // set top & left\n\n\t// Animate\n\tif ( scale === \"content\" || scale === \"both\" ) { // Scale the children\n\n\t\t// Add margins/font-size\n\t\tvProps = vProps.concat([ \"marginTop\", \"marginBottom\" ]).concat(cProps);\n\t\thProps = hProps.concat([ \"marginLeft\", \"marginRight\" ]);\n\t\tprops2 = props0.concat(vProps).concat(hProps);\n\n\t\tel.find( \"*[width]\" ).each( function() {\n\t\t\tvar child = $( this ),\n\t\t\t\tc_original = {\n\t\t\t\t\theight: child.height(),\n\t\t\t\t\twidth: child.width(),\n\t\t\t\t\touterHeight: child.outerHeight(),\n\t\t\t\t\touterWidth: child.outerWidth()\n\t\t\t\t};\n\t\t\tif (restore) {\n\t\t\t\t$.effects.save(child, props2);\n\t\t\t}\n\n\t\t\tchild.from = {\n\t\t\t\theight: c_original.height * factor.from.y,\n\t\t\t\twidth: c_original.width * factor.from.x,\n\t\t\t\touterHeight: c_original.outerHeight * factor.from.y,\n\t\t\t\touterWidth: c_original.outerWidth * factor.from.x\n\t\t\t};\n\t\t\tchild.to = {\n\t\t\t\theight: c_original.height * factor.to.y,\n\t\t\t\twidth: c_original.width * factor.to.x,\n\t\t\t\touterHeight: c_original.height * factor.to.y,\n\t\t\t\touterWidth: c_original.width * factor.to.x\n\t\t\t};\n\n\t\t\t// Vertical props scaling\n\t\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\t\tchild.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );\n\t\t\t\tchild.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );\n\t\t\t}\n\n\t\t\t// Horizontal props scaling\n\t\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\t\tchild.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );\n\t\t\t\tchild.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );\n\t\t\t}\n\n\t\t\t// Animate children\n\t\t\tchild.css( child.from );\n\t\t\tchild.animate( child.to, o.duration, o.easing, function() {\n\n\t\t\t\t// Restore children\n\t\t\t\tif ( restore ) {\n\t\t\t\t\t$.effects.restore( child, props2 );\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Animate\n\tel.animate( el.to, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( el.to.opacity === 0 ) {\n\t\t\t\tel.css( \"opacity\", el.from.opacity );\n\t\t\t}\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\tif ( !restore ) {\n\n\t\t\t\t// we need to calculate our new positioning based on the scaling\n\t\t\t\tif ( position === \"static\" ) {\n\t\t\t\t\tel.css({\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttop: el.to.top,\n\t\t\t\t\t\tleft: el.to.left\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$.each([ \"top\", \"left\" ], function( idx, pos ) {\n\t\t\t\t\t\tel.css( pos, function( _, str ) {\n\t\t\t\t\t\t\tvar val = parseInt( str, 10 ),\n\t\t\t\t\t\t\t\ttoRef = idx ? el.to.left : el.to.top;\n\n\t\t\t\t\t\t\t// if original was \"auto\", recalculate the new value from wrapper\n\t\t\t\t\t\t\tif ( str === \"auto\" ) {\n\t\t\t\t\t\t\t\treturn toRef + \"px\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn val + toRef + \"px\";\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n\n};\n\n\n/*!\n * jQuery UI Effects Scale 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/scale-effect/\n */\n\n\nvar effectScale = $.effects.effect.scale = function( o, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\toptions = $.extend( true, {}, o ),\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\tpercent = parseInt( o.percent, 10 ) ||\n\t\t\t( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === \"hide\" ? 0 : 100 ) ),\n\t\tdirection = o.direction || \"both\",\n\t\torigin = o.origin,\n\t\toriginal = {\n\t\t\theight: el.height(),\n\t\t\twidth: el.width(),\n\t\t\touterHeight: el.outerHeight(),\n\t\t\touterWidth: el.outerWidth()\n\t\t},\n\t\tfactor = {\n\t\t\ty: direction !== \"horizontal\" ? (percent / 100) : 1,\n\t\t\tx: direction !== \"vertical\" ? (percent / 100) : 1\n\t\t};\n\n\t// We are going to pass this effect to the size effect:\n\toptions.effect = \"size\";\n\toptions.queue = false;\n\toptions.complete = done;\n\n\t// Set default origin and restore for show/hide\n\tif ( mode !== \"effect\" ) {\n\t\toptions.origin = origin || [ \"middle\", \"center\" ];\n\t\toptions.restore = true;\n\t}\n\n\toptions.from = o.from || ( mode === \"show\" ? {\n\t\theight: 0,\n\t\twidth: 0,\n\t\touterHeight: 0,\n\t\touterWidth: 0\n\t} : original );\n\toptions.to = {\n\t\theight: original.height * factor.y,\n\t\twidth: original.width * factor.x,\n\t\touterHeight: original.outerHeight * factor.y,\n\t\touterWidth: original.outerWidth * factor.x\n\t};\n\n\t// Fade option to support puff\n\tif ( options.fade ) {\n\t\tif ( mode === \"show\" ) {\n\t\t\toptions.from.opacity = 0;\n\t\t\toptions.to.opacity = 1;\n\t\t}\n\t\tif ( mode === \"hide\" ) {\n\t\t\toptions.from.opacity = 1;\n\t\t\toptions.to.opacity = 0;\n\t\t}\n\t}\n\n\t// Animate\n\tel.effect( options );\n\n};\n\n\n/*!\n * jQuery UI Effects Puff 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/puff-effect/\n */\n\n\nvar effectPuff = $.effects.effect.puff = function( o, done ) {\n\tvar elem = $( this ),\n\t\tmode = $.effects.setMode( elem, o.mode || \"hide\" ),\n\t\thide = mode === \"hide\",\n\t\tpercent = parseInt( o.percent, 10 ) || 150,\n\t\tfactor = percent / 100,\n\t\toriginal = {\n\t\t\theight: elem.height(),\n\t\t\twidth: elem.width(),\n\t\t\touterHeight: elem.outerHeight(),\n\t\t\touterWidth: elem.outerWidth()\n\t\t};\n\n\t$.extend( o, {\n\t\teffect: \"scale\",\n\t\tqueue: false,\n\t\tfade: true,\n\t\tmode: mode,\n\t\tcomplete: done,\n\t\tpercent: hide ? percent : 100,\n\t\tfrom: hide ?\n\t\t\toriginal :\n\t\t\t{\n\t\t\t\theight: original.height * factor,\n\t\t\t\twidth: original.width * factor,\n\t\t\t\touterHeight: original.outerHeight * factor,\n\t\t\t\touterWidth: original.outerWidth * factor\n\t\t\t}\n\t});\n\n\telem.effect( o );\n};\n\n\n/*!\n * jQuery UI Effects Pulsate 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/pulsate-effect/\n */\n\n\nvar effectPulsate = $.effects.effect.pulsate = function( o, done ) {\n\tvar elem = $( this ),\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tshowhide = ( show || mode === \"hide\" ),\n\n\t\t// showing or hiding leaves of the \"last\" animation\n\t\tanims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),\n\t\tduration = o.duration / anims,\n\t\tanimateTo = 0,\n\t\tqueue = elem.queue(),\n\t\tqueuelen = queue.length,\n\t\ti;\n\n\tif ( show || !elem.is(\":visible\")) {\n\t\telem.css( \"opacity\", 0 ).show();\n\t\tanimateTo = 1;\n\t}\n\n\t// anims - 1 opacity \"toggles\"\n\tfor ( i = 1; i < anims; i++ ) {\n\t\telem.animate({\n\t\t\topacity: animateTo\n\t\t}, duration, o.easing );\n\t\tanimateTo = 1 - animateTo;\n\t}\n\n\telem.animate({\n\t\topacity: animateTo\n\t}, duration, o.easing);\n\n\telem.queue(function() {\n\t\tif ( hide ) {\n\t\t\telem.hide();\n\t\t}\n\t\tdone();\n\t});\n\n\t// We just queued up \"anims\" animations, we need to put them next in the queue\n\tif ( queuelen > 1 ) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\telem.dequeue();\n};\n\n\n/*!\n * jQuery UI Effects Shake 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/shake-effect/\n */\n\n\nvar effectShake = $.effects.effect.shake = function( o, done ) {\n\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\tdirection = o.direction || \"left\",\n\t\tdistance = o.distance || 20,\n\t\ttimes = o.times || 3,\n\t\tanims = times * 2 + 1,\n\t\tspeed = Math.round( o.duration / anims ),\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\n\t\tanimation = {},\n\t\tanimation1 = {},\n\t\tanimation2 = {},\n\t\ti,\n\n\t\t// we will need to re-assemble the queue to stack our animations in place\n\t\tqueue = el.queue(),\n\t\tqueuelen = queue.length;\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\n\t// Animation\n\tanimation[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance;\n\tanimation1[ ref ] = ( positiveMotion ? \"+=\" : \"-=\" ) + distance * 2;\n\tanimation2[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance * 2;\n\n\t// Animate\n\tel.animate( animation, speed, o.easing );\n\n\t// Shakes\n\tfor ( i = 1; i < times; i++ ) {\n\t\tel.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );\n\t}\n\tel\n\t\t.animate( animation1, speed, o.easing )\n\t\t.animate( animation, speed / 2, o.easing )\n\t\t.queue(function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t});\n\n\t// inject all the animations we just queued to be first in line (after \"inprogress\")\n\tif ( queuelen > 1) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\tel.dequeue();\n\n};\n\n\n/*!\n * jQuery UI Effects Slide 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/slide-effect/\n */\n\n\nvar effectSlide = $.effects.effect.slide = function( o, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"show\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"left\",\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\n\t\tdistance,\n\t\tanimation = {};\n\n\t// Adjust\n\t$.effects.save( el, props );\n\tel.show();\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true );\n\n\t$.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\n\tif ( show ) {\n\t\tel.css( ref, positiveMotion ? (isNaN(distance) ? \"-\" + distance : -distance) : distance );\n\t}\n\n\t// Animation\n\tanimation[ ref ] = ( show ?\n\t\t( positiveMotion ? \"+=\" : \"-=\") :\n\t\t( positiveMotion ? \"-=\" : \"+=\")) +\n\t\tdistance;\n\n\t// Animate\n\tel.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Transfer 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/transfer-effect/\n */\n\n\nvar effectTransfer = $.effects.effect.transfer = function( o, done ) {\n\tvar elem = $( this ),\n\t\ttarget = $( o.to ),\n\t\ttargetFixed = target.css( \"position\" ) === \"fixed\",\n\t\tbody = $(\"body\"),\n\t\tfixTop = targetFixed ? body.scrollTop() : 0,\n\t\tfixLeft = targetFixed ? body.scrollLeft() : 0,\n\t\tendPosition = target.offset(),\n\t\tanimation = {\n\t\t\ttop: endPosition.top - fixTop,\n\t\t\tleft: endPosition.left - fixLeft,\n\t\t\theight: target.innerHeight(),\n\t\t\twidth: target.innerWidth()\n\t\t},\n\t\tstartPosition = elem.offset(),\n\t\ttransfer = $( \"<div class='ui-effects-transfer'></div>\" )\n\t\t\t.appendTo( document.body )\n\t\t\t.addClass( o.className )\n\t\t\t.css({\n\t\t\t\ttop: startPosition.top - fixTop,\n\t\t\t\tleft: startPosition.left - fixLeft,\n\t\t\t\theight: elem.innerHeight(),\n\t\t\t\twidth: elem.innerWidth(),\n\t\t\t\tposition: targetFixed ? \"fixed\" : \"absolute\"\n\t\t\t})\n\t\t\t.animate( animation, o.duration, o.easing, function() {\n\t\t\t\ttransfer.remove();\n\t\t\t\tdone();\n\t\t\t});\n};\n\n\n/*!\n * jQuery UI Progressbar 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/progressbar/\n */\n\n\nvar progressbar = $.widget( \"ui.progressbar\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tmax: 100,\n\t\tvalue: 0,\n\n\t\tchange: null,\n\t\tcomplete: null\n\t},\n\n\tmin: 0,\n\n\t_create: function() {\n\t\t// Constrain initial value\n\t\tthis.oldValue = this.options.value = this._constrainedValue();\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.attr({\n\t\t\t\t// Only set static values, aria-valuenow and aria-valuemax are\n\t\t\t\t// set inside _refreshValue()\n\t\t\t\trole: \"progressbar\",\n\t\t\t\t\"aria-valuemin\": this.min\n\t\t\t});\n\n\t\tthis.valueDiv = $( \"<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>\" )\n\t\t\t.appendTo( this.element );\n\n\t\tthis._refreshValue();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-valuemin\" )\n\t\t\t.removeAttr( \"aria-valuemax\" )\n\t\t\t.removeAttr( \"aria-valuenow\" );\n\n\t\tthis.valueDiv.remove();\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\treturn this.options.value;\n\t\t}\n\n\t\tthis.options.value = this._constrainedValue( newValue );\n\t\tthis._refreshValue();\n\t},\n\n\t_constrainedValue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\tnewValue = this.options.value;\n\t\t}\n\n\t\tthis.indeterminate = newValue === false;\n\n\t\t// sanitize value\n\t\tif ( typeof newValue !== \"number\" ) {\n\t\t\tnewValue = 0;\n\t\t}\n\n\t\treturn this.indeterminate ? false :\n\t\t\tMath.min( this.options.max, Math.max( this.min, newValue ) );\n\t},\n\n\t_setOptions: function( options ) {\n\t\t// Ensure \"value\" option is set after other values (like max)\n\t\tvar value = options.value;\n\t\tdelete options.value;\n\n\t\tthis._super( options );\n\n\t\tthis.options.value = this._constrainedValue( value );\n\t\tthis._refreshValue();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"max\" ) {\n\t\t\t// Don't allow a max less than min\n\t\t\tvalue = Math.max( this.min, value );\n\t\t}\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_percentage: function() {\n\t\treturn this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );\n\t},\n\n\t_refreshValue: function() {\n\t\tvar value = this.options.value,\n\t\t\tpercentage = this._percentage();\n\n\t\tthis.valueDiv\n\t\t\t.toggle( this.indeterminate || value > this.min )\n\t\t\t.toggleClass( \"ui-corner-right\", value === this.options.max )\n\t\t\t.width( percentage.toFixed(0) + \"%\" );\n\n\t\tthis.element.toggleClass( \"ui-progressbar-indeterminate\", this.indeterminate );\n\n\t\tif ( this.indeterminate ) {\n\t\t\tthis.element.removeAttr( \"aria-valuenow\" );\n\t\t\tif ( !this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv = $( \"<div class='ui-progressbar-overlay'></div>\" ).appendTo( this.valueDiv );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.element.attr({\n\t\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t\t\"aria-valuenow\": value\n\t\t\t});\n\t\t\tif ( this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv.remove();\n\t\t\t\tthis.overlayDiv = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( this.oldValue !== value ) {\n\t\t\tthis.oldValue = value;\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t\tif ( value === this.options.max ) {\n\t\t\tthis._trigger( \"complete\" );\n\t\t}\n\t}\n});\n\n\n/*!\n * jQuery UI Selectable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/selectable/\n */\n\n\nvar selectable = $.widget(\"ui.selectable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoRefresh: true,\n\t\tdistance: 0,\n\t\tfilter: \"*\",\n\t\ttolerance: \"touch\",\n\n\t\t// callbacks\n\t\tselected: null,\n\t\tselecting: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tunselected: null,\n\t\tunselecting: null\n\t},\n\t_create: function() {\n\t\tvar selectees,\n\t\t\tthat = this;\n\n\t\tthis.element.addClass(\"ui-selectable\");\n\n\t\tthis.dragged = false;\n\n\t\t// cache selectee children based on filter\n\t\tthis.refresh = function() {\n\t\t\tselectees = $(that.options.filter, that.element[0]);\n\t\t\tselectees.addClass(\"ui-selectee\");\n\t\t\tselectees.each(function() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\tpos = $this.offset();\n\t\t\t\t$.data(this, \"selectable-item\", {\n\t\t\t\t\telement: this,\n\t\t\t\t\t$element: $this,\n\t\t\t\t\tleft: pos.left,\n\t\t\t\t\ttop: pos.top,\n\t\t\t\t\tright: pos.left + $this.outerWidth(),\n\t\t\t\t\tbottom: pos.top + $this.outerHeight(),\n\t\t\t\t\tstartselected: false,\n\t\t\t\t\tselected: $this.hasClass(\"ui-selected\"),\n\t\t\t\t\tselecting: $this.hasClass(\"ui-selecting\"),\n\t\t\t\t\tunselecting: $this.hasClass(\"ui-unselecting\")\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\t\tthis.refresh();\n\n\t\tthis.selectees = selectees.addClass(\"ui-selectee\");\n\n\t\tthis._mouseInit();\n\n\t\tthis.helper = $(\"<div class='ui-selectable-helper'></div>\");\n\t},\n\n\t_destroy: function() {\n\t\tthis.selectees\n\t\t\t.removeClass(\"ui-selectee\")\n\t\t\t.removeData(\"selectable-item\");\n\t\tthis.element\n\t\t\t.removeClass(\"ui-selectable ui-selectable-disabled\");\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseStart: function(event) {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.opos = [ event.pageX, event.pageY ];\n\n\t\tif (this.options.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selectees = $(options.filter, this.element[0]);\n\n\t\tthis._trigger(\"start\", event);\n\n\t\t$(options.appendTo).append(this.helper);\n\t\t// position helper (lasso)\n\t\tthis.helper.css({\n\t\t\t\"left\": event.pageX,\n\t\t\t\"top\": event.pageY,\n\t\t\t\"width\": 0,\n\t\t\t\"height\": 0\n\t\t});\n\n\t\tif (options.autoRefresh) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\tthis.selectees.filter(\".ui-selected\").each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.startselected = true;\n\t\t\tif (!event.metaKey && !event.ctrlKey) {\n\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\tselectee.selected = false;\n\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\tselectee.unselecting = true;\n\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t$(event.target).parents().addBack().each(function() {\n\t\t\tvar doSelect,\n\t\t\t\tselectee = $.data(this, \"selectable-item\");\n\t\t\tif (selectee) {\n\t\t\t\tdoSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass(\"ui-selected\");\n\t\t\t\tselectee.$element\n\t\t\t\t\t.removeClass(doSelect ? \"ui-unselecting\" : \"ui-selected\")\n\t\t\t\t\t.addClass(doSelect ? \"ui-selecting\" : \"ui-unselecting\");\n\t\t\t\tselectee.unselecting = !doSelect;\n\t\t\t\tselectee.selecting = doSelect;\n\t\t\t\tselectee.selected = doSelect;\n\t\t\t\t// selectable (UN)SELECTING callback\n\t\t\t\tif (doSelect) {\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_mouseDrag: function(event) {\n\n\t\tthis.dragged = true;\n\n\t\tif (this.options.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tmp,\n\t\t\tthat = this,\n\t\t\toptions = this.options,\n\t\t\tx1 = this.opos[0],\n\t\t\ty1 = this.opos[1],\n\t\t\tx2 = event.pageX,\n\t\t\ty2 = event.pageY;\n\n\t\tif (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }\n\t\tif (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }\n\t\tthis.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });\n\n\t\tthis.selectees.each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\"),\n\t\t\t\thit = false;\n\n\t\t\t//prevent helper from being selected if appendTo: selectable\n\t\t\tif (!selectee || selectee.element === that.element[0]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (options.tolerance === \"touch\") {\n\t\t\t\thit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );\n\t\t\t} else if (options.tolerance === \"fit\") {\n\t\t\t\thit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);\n\t\t\t}\n\n\t\t\tif (hit) {\n\t\t\t\t// SELECT\n\t\t\t\tif (selectee.selected) {\n\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\t\tselectee.selected = false;\n\t\t\t\t}\n\t\t\t\tif (selectee.unselecting) {\n\t\t\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\n\t\t\t\t\tselectee.unselecting = false;\n\t\t\t\t}\n\t\t\t\tif (!selectee.selecting) {\n\t\t\t\t\tselectee.$element.addClass(\"ui-selecting\");\n\t\t\t\t\tselectee.selecting = true;\n\t\t\t\t\t// selectable SELECTING callback\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// UNSELECT\n\t\t\t\tif (selectee.selecting) {\n\t\t\t\t\tif ((event.metaKey || event.ctrlKey) && selectee.startselected) {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-selected\");\n\t\t\t\t\t\tselectee.selected = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tif (selectee.startselected) {\n\t\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (selectee.selected) {\n\t\t\t\t\tif (!event.metaKey && !event.ctrlKey && !selectee.startselected) {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\t\t\tselectee.selected = false;\n\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\t\tvar that = this;\n\n\t\tthis.dragged = false;\n\n\t\t$(\".ui-unselecting\", this.element[0]).each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\n\t\t\tselectee.unselecting = false;\n\t\t\tselectee.startselected = false;\n\t\t\tthat._trigger(\"unselected\", event, {\n\t\t\t\tunselected: selectee.element\n\t\t\t});\n\t\t});\n\t\t$(\".ui-selecting\", this.element[0]).each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.$element.removeClass(\"ui-selecting\").addClass(\"ui-selected\");\n\t\t\tselectee.selecting = false;\n\t\t\tselectee.selected = true;\n\t\t\tselectee.startselected = true;\n\t\t\tthat._trigger(\"selected\", event, {\n\t\t\t\tselected: selectee.element\n\t\t\t});\n\t\t});\n\t\tthis._trigger(\"stop\", event);\n\n\t\tthis.helper.remove();\n\n\t\treturn false;\n\t}\n\n});\n\n\n/*!\n * jQuery UI Selectmenu 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/selectmenu\n */\n\n\nvar selectmenu = $.widget( \"ui.selectmenu\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<select>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tdisabled: null,\n\t\ticons: {\n\t\t\tbutton: \"ui-icon-triangle-1-s\"\n\t\t},\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\twidth: null,\n\n\t\t// callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tvar selectmenuId = this.element.uniqueId().attr( \"id\" );\n\t\tthis.ids = {\n\t\t\telement: selectmenuId,\n\t\t\tbutton: selectmenuId + \"-button\",\n\t\t\tmenu: selectmenuId + \"-menu\"\n\t\t};\n\n\t\tthis._drawButton();\n\t\tthis._drawMenu();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.disable();\n\t\t}\n\t},\n\n\t_drawButton: function() {\n\t\tvar that = this;\n\n\t\t// Associate existing label with the new button\n\t\tthis.label = $( \"label[for='\" + this.ids.element + \"']\" ).attr( \"for\", this.ids.button );\n\t\tthis._on( this.label, {\n\t\t\tclick: function( event ) {\n\t\t\t\tthis.button.focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t});\n\n\t\t// Hide original select element\n\t\tthis.element.hide();\n\n\t\t// Create button\n\t\tthis.button = $( \"<span>\", {\n\t\t\t\"class\": \"ui-selectmenu-button ui-widget ui-state-default ui-corner-all\",\n\t\t\ttabindex: this.options.disabled ? -1 : 0,\n\t\t\tid: this.ids.button,\n\t\t\trole: \"combobox\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-autocomplete\": \"list\",\n\t\t\t\"aria-owns\": this.ids.menu,\n\t\t\t\"aria-haspopup\": \"true\"\n\t\t})\n\t\t\t.insertAfter( this.element );\n\n\t\t$( \"<span>\", {\n\t\t\t\"class\": \"ui-icon \" + this.options.icons.button\n\t\t})\n\t\t\t.prependTo( this.button );\n\n\t\tthis.buttonText = $( \"<span>\", {\n\t\t\t\"class\": \"ui-selectmenu-text\"\n\t\t})\n\t\t\t.appendTo( this.button );\n\n\t\tthis._setText( this.buttonText, this.element.find( \"option:selected\" ).text() );\n\t\tthis._resizeButton();\n\n\t\tthis._on( this.button, this._buttonEvents );\n\t\tthis.button.one( \"focusin\", function() {\n\n\t\t\t// Delay rendering the menu items until the button receives focus.\n\t\t\t// The menu may have already been rendered via a programmatic open.\n\t\t\tif ( !that.menuItems ) {\n\t\t\t\tthat._refreshMenu();\n\t\t\t}\n\t\t});\n\t\tthis._hoverable( this.button );\n\t\tthis._focusable( this.button );\n\t},\n\n\t_drawMenu: function() {\n\t\tvar that = this;\n\n\t\t// Create menu\n\t\tthis.menu = $( \"<ul>\", {\n\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\"aria-labelledby\": this.ids.button,\n\t\t\tid: this.ids.menu\n\t\t});\n\n\t\t// Wrap menu\n\t\tthis.menuWrap = $( \"<div>\", {\n\t\t\t\"class\": \"ui-selectmenu-menu ui-front\"\n\t\t})\n\t\t\t.append( this.menu )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\t// Initialize menu widget\n\t\tthis.menuInstance = this.menu\n\t\t\t.menu({\n\t\t\t\trole: \"listbox\",\n\t\t\t\tselect: function( event, ui ) {\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t// support: IE8\n\t\t\t\t\t// If the item was selected via a click, the text selection\n\t\t\t\t\t// will be destroyed in IE\n\t\t\t\t\tthat._setSelection();\n\n\t\t\t\t\tthat._select( ui.item.data( \"ui-selectmenu-item\" ), event );\n\t\t\t\t},\n\t\t\t\tfocus: function( event, ui ) {\n\t\t\t\t\tvar item = ui.item.data( \"ui-selectmenu-item\" );\n\n\t\t\t\t\t// Prevent inital focus from firing and check if its a newly focused item\n\t\t\t\t\tif ( that.focusIndex != null && item.index !== that.focusIndex ) {\n\t\t\t\t\t\tthat._trigger( \"focus\", event, { item: item } );\n\t\t\t\t\t\tif ( !that.isOpen ) {\n\t\t\t\t\t\t\tthat._select( item, event );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthat.focusIndex = item.index;\n\n\t\t\t\t\tthat.button.attr( \"aria-activedescendant\",\n\t\t\t\t\t\tthat.menuItems.eq( item.index ).attr( \"id\" ) );\n\t\t\t\t}\n\t\t\t})\n\t\t\t.menu( \"instance\" );\n\n\t\t// Adjust menu styles to dropdown\n\t\tthis.menu\n\t\t\t.addClass( \"ui-corner-bottom\" )\n\t\t\t.removeClass( \"ui-corner-all\" );\n\n\t\t// Don't close the menu on mouseleave\n\t\tthis.menuInstance._off( this.menu, \"mouseleave\" );\n\n\t\t// Cancel the menu's collapseAll on document click\n\t\tthis.menuInstance._closeOnDocumentClick = function() {\n\t\t\treturn false;\n\t\t};\n\n\t\t// Selects often contain empty items, but never contain dividers\n\t\tthis.menuInstance._isDivider = function() {\n\t\t\treturn false;\n\t\t};\n\t},\n\n\trefresh: function() {\n\t\tthis._refreshMenu();\n\t\tthis._setText( this.buttonText, this._getSelectedItem().text() );\n\t\tif ( !this.options.width ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_refreshMenu: function() {\n\t\tthis.menu.empty();\n\n\t\tvar item,\n\t\t\toptions = this.element.find( \"option\" );\n\n\t\tif ( !options.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._parseOptions( options );\n\t\tthis._renderMenu( this.menu, this.items );\n\n\t\tthis.menuInstance.refresh();\n\t\tthis.menuItems = this.menu.find( \"li\" ).not( \".ui-selectmenu-optgroup\" );\n\n\t\titem = this._getSelectedItem();\n\n\t\t// Update the menu to have the correct item focused\n\t\tthis.menuInstance.focus( null, item );\n\t\tthis._setAria( item.data( \"ui-selectmenu-item\" ) );\n\n\t\t// Set disabled state\n\t\tthis._setOption( \"disabled\", this.element.prop( \"disabled\" ) );\n\t},\n\n\topen: function( event ) {\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If this is the first time the menu is being opened, render the items\n\t\tif ( !this.menuItems ) {\n\t\t\tthis._refreshMenu();\n\t\t} else {\n\n\t\t\t// Menu clears focus on close, reset focus to selected item\n\t\t\tthis.menu.find( \".ui-state-focus\" ).removeClass( \"ui-state-focus\" );\n\t\t\tthis.menuInstance.focus( null, this._getSelectedItem() );\n\t\t}\n\n\t\tthis.isOpen = true;\n\t\tthis._toggleAttr();\n\t\tthis._resizeMenu();\n\t\tthis._position();\n\n\t\tthis._on( this.document, this._documentClick );\n\n\t\tthis._trigger( \"open\", event );\n\t},\n\n\t_position: function() {\n\t\tthis.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );\n\t},\n\n\tclose: function( event ) {\n\t\tif ( !this.isOpen ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = false;\n\t\tthis._toggleAttr();\n\n\t\tthis.range = null;\n\t\tthis._off( this.document );\n\n\t\tthis._trigger( \"close\", event );\n\t},\n\n\twidget: function() {\n\t\treturn this.button;\n\t},\n\n\tmenuWidget: function() {\n\t\treturn this.menu;\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this,\n\t\t\tcurrentOptgroup = \"\";\n\n\t\t$.each( items, function( index, item ) {\n\t\t\tif ( item.optgroup !== currentOptgroup ) {\n\t\t\t\t$( \"<li>\", {\n\t\t\t\t\t\"class\": \"ui-selectmenu-optgroup ui-menu-divider\" +\n\t\t\t\t\t\t( item.element.parent( \"optgroup\" ).prop( \"disabled\" ) ?\n\t\t\t\t\t\t\t\" ui-state-disabled\" :\n\t\t\t\t\t\t\t\"\" ),\n\t\t\t\t\ttext: item.optgroup\n\t\t\t\t})\n\t\t\t\t\t.appendTo( ul );\n\n\t\t\t\tcurrentOptgroup = item.optgroup;\n\t\t\t}\n\n\t\t\tthat._renderItemData( ul, item );\n\t\t});\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-selectmenu-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\tvar li = $( \"<li>\" );\n\n\t\tif ( item.disabled ) {\n\t\t\tli.addClass( \"ui-state-disabled\" );\n\t\t}\n\t\tthis._setText( li, item.label );\n\n\t\treturn li.appendTo( ul );\n\t},\n\n\t_setText: function( element, value ) {\n\t\tif ( value ) {\n\t\t\telement.text( value );\n\t\t} else {\n\t\t\telement.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_move: function( direction, event ) {\n\t\tvar item, next,\n\t\t\tfilter = \".ui-menu-item\";\n\n\t\tif ( this.isOpen ) {\n\t\t\titem = this.menuItems.eq( this.focusIndex );\n\t\t} else {\n\t\t\titem = this.menuItems.eq( this.element[ 0 ].selectedIndex );\n\t\t\tfilter += \":not(.ui-state-disabled)\";\n\t\t}\n\n\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\tnext = item[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( filter ).eq( -1 );\n\t\t} else {\n\t\t\tnext = item[ direction + \"All\" ]( filter ).eq( 0 );\n\t\t}\n\n\t\tif ( next.length ) {\n\t\t\tthis.menuInstance.focus( event, next );\n\t\t}\n\t},\n\n\t_getSelectedItem: function() {\n\t\treturn this.menuItems.eq( this.element[ 0 ].selectedIndex );\n\t},\n\n\t_toggle: function( event ) {\n\t\tthis[ this.isOpen ? \"close\" : \"open\" ]( event );\n\t},\n\n\t_setSelection: function() {\n\t\tvar selection;\n\n\t\tif ( !this.range ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( window.getSelection ) {\n\t\t\tselection = window.getSelection();\n\t\t\tselection.removeAllRanges();\n\t\t\tselection.addRange( this.range );\n\n\t\t// support: IE8\n\t\t} else {\n\t\t\tthis.range.select();\n\t\t}\n\n\t\t// support: IE\n\t\t// Setting the text selection kills the button focus in IE, but\n\t\t// restoring the focus doesn't kill the selection.\n\t\tthis.button.focus();\n\t},\n\n\t_documentClick: {\n\t\tmousedown: function( event ) {\n\t\t\tif ( !this.isOpen ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !$( event.target ).closest( \".ui-selectmenu-menu, #\" + this.ids.button ).length ) {\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t}\n\t},\n\n\t_buttonEvents: {\n\n\t\t// Prevent text selection from being reset when interacting with the selectmenu (#10144)\n\t\tmousedown: function() {\n\t\t\tvar selection;\n\n\t\t\tif ( window.getSelection ) {\n\t\t\t\tselection = window.getSelection();\n\t\t\t\tif ( selection.rangeCount ) {\n\t\t\t\t\tthis.range = selection.getRangeAt( 0 );\n\t\t\t\t}\n\n\t\t\t// support: IE8\n\t\t\t} else {\n\t\t\t\tthis.range = document.selection.createRange();\n\t\t\t}\n\t\t},\n\n\t\tclick: function( event ) {\n\t\t\tthis._setSelection();\n\t\t\tthis._toggle( event );\n\t\t},\n\n\t\tkeydown: function( event ) {\n\t\t\tvar preventDefault = true;\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.TAB:\n\t\t\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\tpreventDefault = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\t\tthis._toggle( event );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\t\tthis._toggle( event );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._move( \"next\", event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._toggle( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tthis._move( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"first\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"last\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.menu.trigger( event );\n\t\t\t\t\tpreventDefault = false;\n\t\t\t}\n\n\t\t\tif ( preventDefault ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t},\n\n\t_selectFocusedItem: function( event ) {\n\t\tvar item = this.menuItems.eq( this.focusIndex );\n\t\tif ( !item.hasClass( \"ui-state-disabled\" ) ) {\n\t\t\tthis._select( item.data( \"ui-selectmenu-item\" ), event );\n\t\t}\n\t},\n\n\t_select: function( item, event ) {\n\t\tvar oldIndex = this.element[ 0 ].selectedIndex;\n\n\t\t// Change native select element\n\t\tthis.element[ 0 ].selectedIndex = item.index;\n\t\tthis._setText( this.buttonText, item.label );\n\t\tthis._setAria( item );\n\t\tthis._trigger( \"select\", event, { item: item } );\n\n\t\tif ( item.index !== oldIndex ) {\n\t\t\tthis._trigger( \"change\", event, { item: item } );\n\t\t}\n\n\t\tthis.close( event );\n\t},\n\n\t_setAria: function( item ) {\n\t\tvar id = this.menuItems.eq( item.index ).attr( \"id\" );\n\n\t\tthis.button.attr({\n\t\t\t\"aria-labelledby\": id,\n\t\t\t\"aria-activedescendant\": id\n\t\t});\n\t\tthis.menu.attr( \"aria-activedescendant\", id );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.button.find( \"span.ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.button )\n\t\t\t\t.addClass( value.button );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menuWrap.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.menuInstance.option( \"disabled\", value );\n\t\t\tthis.button\n\t\t\t\t.toggleClass( \"ui-state-disabled\", value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\n\t\t\tthis.element.prop( \"disabled\", value );\n\t\t\tif ( value ) {\n\t\t\t\tthis.button.attr( \"tabindex\", -1 );\n\t\t\t\tthis.close();\n\t\t\t} else {\n\t\t\t\tthis.button.attr( \"tabindex\", 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"width\" ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_toggleAttr: function() {\n\t\tthis.button\n\t\t\t.toggleClass( \"ui-corner-top\", this.isOpen )\n\t\t\t.toggleClass( \"ui-corner-all\", !this.isOpen )\n\t\t\t.attr( \"aria-expanded\", this.isOpen );\n\t\tthis.menuWrap.toggleClass( \"ui-selectmenu-open\", this.isOpen );\n\t\tthis.menu.attr( \"aria-hidden\", !this.isOpen );\n\t},\n\n\t_resizeButton: function() {\n\t\tvar width = this.options.width;\n\n\t\tif ( !width ) {\n\t\t\twidth = this.element.show().outerWidth();\n\t\t\tthis.element.hide();\n\t\t}\n\n\t\tthis.button.outerWidth( width );\n\t},\n\n\t_resizeMenu: function() {\n\t\tthis.menu.outerWidth( Math.max(\n\t\t\tthis.button.outerWidth(),\n\n\t\t\t// support: IE10\n\t\t\t// IE10 wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping\n\t\t\tthis.menu.width( \"\" ).outerWidth() + 1\n\t\t) );\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn { disabled: this.element.prop( \"disabled\" ) };\n\t},\n\n\t_parseOptions: function( options ) {\n\t\tvar data = [];\n\t\toptions.each(function( index, item ) {\n\t\t\tvar option = $( item ),\n\t\t\t\toptgroup = option.parent( \"optgroup\" );\n\t\t\tdata.push({\n\t\t\t\telement: option,\n\t\t\t\tindex: index,\n\t\t\t\tvalue: option.val(),\n\t\t\t\tlabel: option.text(),\n\t\t\t\toptgroup: optgroup.attr( \"label\" ) || \"\",\n\t\t\t\tdisabled: optgroup.prop( \"disabled\" ) || option.prop( \"disabled\" )\n\t\t\t});\n\t\t});\n\t\tthis.items = data;\n\t},\n\n\t_destroy: function() {\n\t\tthis.menuWrap.remove();\n\t\tthis.button.remove();\n\t\tthis.element.show();\n\t\tthis.element.removeUniqueId();\n\t\tthis.label.attr( \"for\", this.ids.element );\n\t}\n});\n\n\n/*!\n * jQuery UI Slider 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/slider/\n */\n\n\nvar slider = $.widget( \"ui.slider\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\tanimate: false,\n\t\tdistance: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\torientation: \"horizontal\",\n\t\trange: false,\n\t\tstep: 1,\n\t\tvalue: 0,\n\t\tvalues: null,\n\n\t\t// callbacks\n\t\tchange: null,\n\t\tslide: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t// number of pages in a slider\n\t// (how many times can you page up/down to go through the whole range)\n\tnumPages: 5,\n\n\t_create: function() {\n\t\tthis._keySliding = false;\n\t\tthis._mouseSliding = false;\n\t\tthis._animateOff = true;\n\t\tthis._handleIndex = null;\n\t\tthis._detectOrientation();\n\t\tthis._mouseInit();\n\t\tthis._calculateNewMax();\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-\" + this.orientation +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\");\n\n\t\tthis._refresh();\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\n\t\tthis._animateOff = false;\n\t},\n\n\t_refresh: function() {\n\t\tthis._createRange();\n\t\tthis._createHandles();\n\t\tthis._setupEvents();\n\t\tthis._refreshValue();\n\t},\n\n\t_createHandles: function() {\n\t\tvar i, handleCount,\n\t\t\toptions = this.options,\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ).addClass( \"ui-state-default ui-corner-all\" ),\n\t\t\thandle = \"<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>\",\n\t\t\thandles = [];\n\n\t\thandleCount = ( options.values && options.values.length ) || 1;\n\n\t\tif ( existingHandles.length > handleCount ) {\n\t\t\texistingHandles.slice( handleCount ).remove();\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\n\t\t}\n\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\n\t\t\thandles.push( handle );\n\t\t}\n\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\n\n\t\tthis.handle = this.handles.eq( 0 );\n\n\t\tthis.handles.each(function( i ) {\n\t\t\t$( this ).data( \"ui-slider-handle-index\", i );\n\t\t});\n\t},\n\n\t_createRange: function() {\n\t\tvar options = this.options,\n\t\t\tclasses = \"\";\n\n\t\tif ( options.range ) {\n\t\t\tif ( options.range === true ) {\n\t\t\t\tif ( !options.values ) {\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\n\t\t\t\t\toptions.values = [ options.values[0], options.values[0] ];\n\t\t\t\t} else if ( $.isArray( options.values ) ) {\n\t\t\t\t\toptions.values = options.values.slice(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !this.range || !this.range.length ) {\n\t\t\t\tthis.range = $( \"<div></div>\" )\n\t\t\t\t\t.appendTo( this.element );\n\n\t\t\t\tclasses = \"ui-slider-range\" +\n\t\t\t\t// note: this isn't the most fittingly semantic framework class for this element,\n\t\t\t\t// but worked best visually with a variety of themes\n\t\t\t\t\" ui-widget-header ui-corner-all\";\n\t\t\t} else {\n\t\t\t\tthis.range.removeClass( \"ui-slider-range-min ui-slider-range-max\" )\n\t\t\t\t\t// Handle range switching from true to min/max\n\t\t\t\t\t.css({\n\t\t\t\t\t\t\"left\": \"\",\n\t\t\t\t\t\t\"bottom\": \"\"\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.range.addClass( classes +\n\t\t\t\t( ( options.range === \"min\" || options.range === \"max\" ) ? \" ui-slider-range-\" + options.range : \"\" ) );\n\t\t} else {\n\t\t\tif ( this.range ) {\n\t\t\t\tthis.range.remove();\n\t\t\t}\n\t\t\tthis.range = null;\n\t\t}\n\t},\n\n\t_setupEvents: function() {\n\t\tthis._off( this.handles );\n\t\tthis._on( this.handles, this._handleEvents );\n\t\tthis._hoverable( this.handles );\n\t\tthis._focusable( this.handles );\n\t},\n\n\t_destroy: function() {\n\t\tthis.handles.remove();\n\t\tif ( this.range ) {\n\t\t\tthis.range.remove();\n\t\t}\n\n\t\tthis.element\n\t\t\t.removeClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-horizontal\" +\n\t\t\t\t\" ui-slider-vertical\" +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\" );\n\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\n\t\tif ( o.disabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.elementSize = {\n\t\t\twidth: this.element.outerWidth(),\n\t\t\theight: this.element.outerHeight()\n\t\t};\n\t\tthis.elementOffset = this.element.offset();\n\n\t\tposition = { x: event.pageX, y: event.pageY };\n\t\tnormValue = this._normValueFromMouse( position );\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\n\t\tthis.handles.each(function( i ) {\n\t\t\tvar thisDistance = Math.abs( normValue - that.values(i) );\n\t\t\tif (( distance > thisDistance ) ||\n\t\t\t\t( distance === thisDistance &&\n\t\t\t\t\t(i === that._lastChangedValue || that.values(i) === o.min ))) {\n\t\t\t\tdistance = thisDistance;\n\t\t\t\tclosestHandle = $( this );\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t});\n\n\t\tallowed = this._start( event, index );\n\t\tif ( allowed === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._mouseSliding = true;\n\n\t\tthis._handleIndex = index;\n\n\t\tclosestHandle\n\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t.focus();\n\n\t\toffset = closestHandle.offset();\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() / 2 ),\n\t\t\ttop: event.pageY - offset.top -\n\t\t\t\t( closestHandle.height() / 2 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderTopWidth\"), 10 ) || 0 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderBottomWidth\"), 10 ) || 0) +\n\t\t\t\t( parseInt( closestHandle.css(\"marginTop\"), 10 ) || 0)\n\t\t};\n\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\n\t\t\tthis._slide( event, index, normValue );\n\t\t}\n\t\tthis._animateOff = true;\n\t\treturn true;\n\t},\n\n\t_mouseStart: function() {\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar position = { x: event.pageX, y: event.pageY },\n\t\t\tnormValue = this._normValueFromMouse( position );\n\n\t\tthis._slide( event, this._handleIndex, normValue );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tthis.handles.removeClass( \"ui-state-active\" );\n\t\tthis._mouseSliding = false;\n\n\t\tthis._stop( event, this._handleIndex );\n\t\tthis._change( event, this._handleIndex );\n\n\t\tthis._handleIndex = null;\n\t\tthis._clickOffset = null;\n\t\tthis._animateOff = false;\n\n\t\treturn false;\n\t},\n\n\t_detectOrientation: function() {\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\n\t},\n\n\t_normValueFromMouse: function( position ) {\n\t\tvar pixelTotal,\n\t\t\tpixelMouse,\n\t\t\tpercentMouse,\n\t\t\tvalueTotal,\n\t\t\tvalueMouse;\n\n\t\tif ( this.orientation === \"horizontal\" ) {\n\t\t\tpixelTotal = this.elementSize.width;\n\t\t\tpixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );\n\t\t} else {\n\t\t\tpixelTotal = this.elementSize.height;\n\t\t\tpixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );\n\t\t}\n\n\t\tpercentMouse = ( pixelMouse / pixelTotal );\n\t\tif ( percentMouse > 1 ) {\n\t\t\tpercentMouse = 1;\n\t\t}\n\t\tif ( percentMouse < 0 ) {\n\t\t\tpercentMouse = 0;\n\t\t}\n\t\tif ( this.orientation === \"vertical\" ) {\n\t\t\tpercentMouse = 1 - percentMouse;\n\t\t}\n\n\t\tvalueTotal = this._valueMax() - this._valueMin();\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\n\n\t\treturn this._trimAlignValue( valueMouse );\n\t},\n\n\t_start: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\t\treturn this._trigger( \"start\", event, uiHash );\n\t},\n\n\t_slide: function( event, index, newVal ) {\n\t\tvar otherVal,\n\t\t\tnewValues,\n\t\t\tallowed;\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\totherVal = this.values( index ? 0 : 1 );\n\n\t\t\tif ( ( this.options.values.length === 2 && this.options.range === true ) &&\n\t\t\t\t\t( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )\n\t\t\t\t) {\n\t\t\t\tnewVal = otherVal;\n\t\t\t}\n\n\t\t\tif ( newVal !== this.values( index ) ) {\n\t\t\t\tnewValues = this.values();\n\t\t\t\tnewValues[ index ] = newVal;\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal,\n\t\t\t\t\tvalues: newValues\n\t\t\t\t} );\n\t\t\t\totherVal = this.values( index ? 0 : 1 );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.values( index, newVal );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( newVal !== this.value() ) {\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal\n\t\t\t\t} );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.value( newVal );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_stop: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\n\t\tthis._trigger( \"stop\", event, uiHash );\n\t},\n\n\t_change: function( event, index ) {\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\n\t\t\tvar uiHash = {\n\t\t\t\thandle: this.handles[ index ],\n\t\t\t\tvalue: this.value()\n\t\t\t};\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tuiHash.value = this.values( index );\n\t\t\t\tuiHash.values = this.values();\n\t\t\t}\n\n\t\t\t//store the last changed value index for reference when handles overlap\n\t\t\tthis._lastChangedValue = index;\n\n\t\t\tthis._trigger( \"change\", event, uiHash );\n\t\t}\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( arguments.length ) {\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, 0 );\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._value();\n\t},\n\n\tvalues: function( index, newValue ) {\n\t\tvar vals,\n\t\t\tnewValues,\n\t\t\ti;\n\n\t\tif ( arguments.length > 1 ) {\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, index );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tif ( $.isArray( arguments[ 0 ] ) ) {\n\t\t\t\tvals = this.options.values;\n\t\t\t\tnewValues = arguments[ 0 ];\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._refreshValue();\n\t\t\t} else {\n\t\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\t\treturn this._values( index );\n\t\t\t\t} else {\n\t\t\t\t\treturn this.value();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._values();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar i,\n\t\t\tvalsLength = 0;\n\n\t\tif ( key === \"range\" && this.options.range === true ) {\n\t\t\tif ( value === \"min\" ) {\n\t\t\t\tthis.options.value = this._values( 0 );\n\t\t\t\tthis.options.values = null;\n\t\t\t} else if ( value === \"max\" ) {\n\t\t\t\tthis.options.value = this._values( this.options.values.length - 1 );\n\t\t\t\tthis.options.values = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( $.isArray( this.options.values ) ) {\n\t\t\tvalsLength = this.options.values.length;\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element.toggleClass( \"ui-state-disabled\", !!value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\t\tcase \"orientation\":\n\t\t\t\tthis._detectOrientation();\n\t\t\t\tthis.element\n\t\t\t\t\t.removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\n\t\t\t\t\t.addClass( \"ui-slider-\" + this.orientation );\n\t\t\t\tthis._refreshValue();\n\n\t\t\t\t// Reset positioning from previous orientation\n\t\t\t\tthis.handles.css( value === \"horizontal\" ? \"bottom\" : \"left\", \"\" );\n\t\t\t\tbreak;\n\t\t\tcase \"value\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._change( null, 0 );\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"values\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tfor ( i = 0; i < valsLength; i += 1 ) {\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"step\":\n\t\t\tcase \"min\":\n\t\t\tcase \"max\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._calculateNewMax();\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"range\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refresh();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t//internal value getter\n\t// _value() returns value trimmed by min and max, aligned by step\n\t_value: function() {\n\t\tvar val = this.options.value;\n\t\tval = this._trimAlignValue( val );\n\n\t\treturn val;\n\t},\n\n\t//internal values getter\n\t// _values() returns array of values trimmed by min and max, aligned by step\n\t// _values( index ) returns single value trimmed by min and max, aligned by step\n\t_values: function( index ) {\n\t\tvar val,\n\t\t\tvals,\n\t\t\ti;\n\n\t\tif ( arguments.length ) {\n\t\t\tval = this.options.values[ index ];\n\t\t\tval = this._trimAlignValue( val );\n\n\t\t\treturn val;\n\t\t} else if ( this.options.values && this.options.values.length ) {\n\t\t\t// .slice() creates a copy of the array\n\t\t\t// this copy gets trimmed by min and max and then returned\n\t\t\tvals = this.options.values.slice();\n\t\t\tfor ( i = 0; i < vals.length; i += 1) {\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\n\t\t\t}\n\n\t\t\treturn vals;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\t// returns the step-aligned value that val is closest to, between (inclusive) min and max\n\t_trimAlignValue: function( val ) {\n\t\tif ( val <= this._valueMin() ) {\n\t\t\treturn this._valueMin();\n\t\t}\n\t\tif ( val >= this._valueMax() ) {\n\t\t\treturn this._valueMax();\n\t\t}\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\n\t\t\tvalModStep = (val - this._valueMin()) % step,\n\t\t\talignValue = val - valModStep;\n\n\t\tif ( Math.abs(valModStep) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\t// Since JavaScript has problems with large floats, round\n\t\t// the final value to 5 digits after the decimal point (see #4124)\n\t\treturn parseFloat( alignValue.toFixed(5) );\n\t},\n\n\t_calculateNewMax: function() {\n\t\tvar max = this.options.max,\n\t\t\tmin = this._valueMin(),\n\t\t\tstep = this.options.step,\n\t\t\taboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;\n\t\tmax = aboveMin + min;\n\t\tthis.max = parseFloat( max.toFixed( this._precision() ) );\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_valueMin: function() {\n\t\treturn this.options.min;\n\t},\n\n\t_valueMax: function() {\n\t\treturn this.max;\n\t},\n\n\t_refreshValue: function() {\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\n\t\t\toRange = this.options.range,\n\t\t\to = this.options,\n\t\t\tthat = this,\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\n\t\t\t_set = {};\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tthis.handles.each(function( i ) {\n\t\t\t\tvalPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\t\t\t\tif ( that.options.range === true ) {\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { left: valPercent + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { width: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { bottom: ( valPercent ) + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { height: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastValPercent = valPercent;\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = this.value();\n\t\t\tvalueMin = this._valueMin();\n\t\t\tvalueMax = this._valueMax();\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\n\t\t\t\t\t( value - valueMin ) / ( valueMax - valueMin ) * 100 :\n\t\t\t\t\t0;\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { width: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { width: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { height: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { height: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleEvents: {\n\t\tkeydown: function( event ) {\n\t\t\tvar allowed, curVal, newVal, step,\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\t\t$( event.target ).addClass( \"ui-state-active\" );\n\t\t\t\t\t\tallowed = this._start( event, index );\n\t\t\t\t\t\tif ( allowed === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstep = this.options.step;\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tcurVal = newVal = this.values( index );\n\t\t\t} else {\n\t\t\t\tcurVal = newVal = this.value();\n\t\t\t}\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\t\tnewVal = this._valueMin();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\t\tnewVal = this._valueMax();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._slide( event, index, newVal );\n\t\t},\n\t\tkeyup: function( event ) {\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tif ( this._keySliding ) {\n\t\t\t\tthis._keySliding = false;\n\t\t\t\tthis._stop( event, index );\n\t\t\t\tthis._change( event, index );\n\t\t\t\t$( event.target ).removeClass( \"ui-state-active\" );\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n/*!\n * jQuery UI Sortable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/sortable/\n */\n\n\nvar sortable = $.widget(\"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn (/left|right/).test(item.css(\"float\")) || (/inline|table-cell/).test(item.css(\"display\"));\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis.element.addClass(\"ui-sortable\");\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.element.find( \".ui-sortable-handle\" ).removeClass( \"ui-sortable-handle\" );\n\t\t$.each( this.items, function() {\n\t\t\t( this.instance.options.handle ?\n\t\t\t\tthis.item.find( this.instance.options.handle ) : this.item )\n\t\t\t\t.addClass( \"ui-sortable-handle\" );\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-sortable ui-sortable-disabled\" )\n\t\t\t.find( \".ui-sortable-handle\" )\n\t\t\t\t.removeClass( \"ui-sortable-handle\" );\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[i].item.removeData(this.widgetName + \"-item\");\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function(event, overrideHandle) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif (this.reverting) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(this.options.disabled || this.options.type === \"static\") {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems(event);\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$(event.target).parents().each(function() {\n\t\t\tif($.data(this, that.widgetName + \"-item\") === that) {\n\t\t\t\tcurrentItem = $(this);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif($.data(event.target, that.widgetName + \"-item\") === that) {\n\t\t\tcurrentItem = $(event.target);\n\t\t}\n\n\t\tif(!currentItem) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.options.handle && !overrideHandle) {\n\t\t\t$(this.options.handle, currentItem).find(\"*\").addBack().each(function() {\n\t\t\t\tif(this === event.target) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(!validHandle) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function(event, overrideHandle, noActivation) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend(this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\n\t\t});\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css(\"position\", \"absolute\");\n\t\tthis.cssPosition = this.helper.css(\"position\");\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition(event);\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };\n\n\t\t//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif(o.containment) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet = $( \"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif(o.opacity) { // opacity option\n\t\t\tif (this.helper.css(\"opacity\")) {\n\t\t\t\tthis._storedOpacity = this.helper.css(\"opacity\");\n\t\t\t}\n\t\t\tthis.helper.css(\"opacity\", o.opacity);\n\t\t}\n\n\t\tif(o.zIndex) { // zIndex option\n\t\t\tif (this.helper.css(\"zIndex\")) {\n\t\t\t\tthis._storedZIndex = this.helper.css(\"zIndex\");\n\t\t\t}\n\t\t\tthis.helper.css(\"zIndex\", o.zIndex);\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== \"HTML\") {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"start\", event, this._uiHash());\n\n\t\t//Recache the helper size\n\t\tif(!this._preserveHelperProportions) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis.helper.addClass(\"ui-sortable-helper\");\n\t\tthis._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function(event) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition(event);\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\tif (!this.lastPositionAbs) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif(this.options.scroll) {\n\t\t\tif(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== \"HTML\") {\n\n\t\t\t\tif((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t\tif(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t//Set the helper position\n\t\tif(!this.options.axis || this.options.axis !== \"y\") {\n\t\t\tthis.helper[0].style.left = this.position.left+\"px\";\n\t\t}\n\t\tif(!this.options.axis || this.options.axis !== \"x\") {\n\t\t\tthis.helper[0].style.top = this.position.top+\"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor (i = this.items.length - 1; i >= 0; i--) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[i];\n\t\t\titemElement = item.item[0];\n\t\t\tintersection = this._intersectsWithPointer(item);\n\t\t\tif (!intersection) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif (item.instance !== this.currentContainer) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif (itemElement !== this.currentItem[0] &&\n\t\t\t\tthis.placeholder[intersection === 1 ? \"next\" : \"prev\"]()[0] !== itemElement &&\n\t\t\t\t!$.contains(this.placeholder[0], itemElement) &&\n\t\t\t\t(this.options.type === \"semi-dynamic\" ? !$.contains(this.element[0], itemElement) : true)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif (this.options.tolerance === \"pointer\" || this._intersectsWithSides(item)) {\n\t\t\t\t\tthis._rearrange(event, item);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers(event);\n\n\t\t//Interconnect with droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"sort\", event, this._uiHash());\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function(event, noPropagation) {\n\n\t\tif(!event) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\t$.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\tif(this.options.revert) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {\n\t\t\t\tthat._clear(event);\n\t\t\t});\n\t\t} else {\n\t\t\tthis._clear(event, noPropagation);\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif(this.dragging) {\n\n\t\t\tthis._mouseUp({ target: null });\n\n\t\t\tif(this.options.helper === \"original\") {\n\t\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor (var i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tthis.containers[i]._trigger(\"deactivate\", null, this._uiHash(this));\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", null, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (this.placeholder) {\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\t\tif(this.placeholder[0].parentNode) {\n\t\t\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\t\t\t}\n\t\t\tif(this.options.helper !== \"original\" && this.helper && this.helper[0].parentNode) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend(this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t});\n\n\t\t\tif(this.domPosition.prev) {\n\t\t\t\t$(this.domPosition.prev).after(this.currentItem);\n\t\t\t} else {\n\t\t\t\t$(this.domPosition.parent).prepend(this.currentItem);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$(items).each(function() {\n\t\t\tvar res = ($(o.item || this).attr(o.attribute || \"id\") || \"\").match(o.expression || (/(.+)[\\-=_](.+)/));\n\t\t\tif (res) {\n\t\t\t\tstr.push((o.key || res[1]+\"[]\")+\"=\"+(o.key && o.expression ? res[1] : res[2]));\n\t\t\t}\n\t\t});\n\n\t\tif(!str.length && o.key) {\n\t\t\tstr.push(o.key + \"=\");\n\t\t}\n\n\t\treturn str.join(\"&\");\n\n\t},\n\n\ttoArray: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each(function() { ret.push($(o.item || this).attr(o.attribute || \"id\") || \"\"); });\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function(item) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t(this.options.tolerance !== \"pointer\" && this.helperProportions[this.floating ? \"width\" : \"height\"] > item[this.floating ? \"width\" : \"height\"])\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn (l < x1 + (this.helperProportions.width / 2) && // Right Half\n\t\t\t\tx2 - (this.helperProportions.width / 2) < r && // Left Half\n\t\t\t\tt < y1 + (this.helperProportions.height / 2) && // Bottom Half\n\t\t\t\ty2 - (this.helperProportions.height / 2) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function(item) {\n\n\t\tvar isOverElementHeight = (this.options.axis === \"x\") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),\n\t\t\tisOverElementWidth = (this.options.axis === \"y\") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth,\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (!isOverElement) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.floating ?\n\t\t\t( ((horizontalDirection && horizontalDirection === \"right\") || verticalDirection === \"down\") ? 2 : 1 )\n\t\t\t: ( verticalDirection && (verticalDirection === \"down\" ? 2 : 1) );\n\n\t},\n\n\t_intersectsWithSides: function(item) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),\n\t\t\tisOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (this.floating && horizontalDirection) {\n\t\t\treturn ((horizontalDirection === \"right\" && isOverRightHalf) || (horizontalDirection === \"left\" && !isOverRightHalf));\n\t\t} else {\n\t\t\treturn verticalDirection && ((verticalDirection === \"down\" && isOverBottomHalf) || (verticalDirection === \"up\" && !isOverBottomHalf));\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && (delta > 0 ? \"down\" : \"up\");\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && (delta > 0 ? \"right\" : \"left\");\n\t},\n\n\trefresh: function(event) {\n\t\tthis._refreshItems(event);\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function(connected) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && connected) {\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i], this.document[0]);\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), inst]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), this]);\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor (i = queries.length - 1; i >= 0; i--){\n\t\t\tqueries[i][0].each( addItems );\n\t\t}\n\n\t\treturn $(items);\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find(\":data(\" + this.widgetName + \"-item)\");\n\n\t\tthis.items = $.grep(this.items, function (item) {\n\t\t\tfor (var j=0; j < list.length; j++) {\n\t\t\t\tif(list[j] === item.item[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t},\n\n\t_refreshItems: function(event) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [this];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i], this.document[0]);\n\t\t\t\tfor (j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);\n\t\t\t\t\t\tthis.containers.push(inst);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = queries.length - 1; i >= 0; i--) {\n\t\t\ttargetData = queries[i][1];\n\t\t\t_queries = queries[i][0];\n\n\t\t\tfor (j=0, queriesLength = _queries.length; j < queriesLength; j++) {\n\t\t\t\titem = $(_queries[j]);\n\n\t\t\t\titem.data(this.widgetName + \"-item\", targetData); // Data for target checking (mouse manager)\n\n\t\t\t\titems.push({\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function(fast) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change\n\t\tif(this.offsetParent && this.helper) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor (i = this.items.length - 1; i >= 0; i--){\n\t\t\titem = this.items[i];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;\n\n\t\t\tif (!fast) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif(this.options.custom && this.options.custom.refreshContainers) {\n\t\t\tthis.options.custom.refreshContainers.call(this);\n\t\t} else {\n\t\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tp = this.containers[i].element.offset();\n\t\t\t\tthis.containers[i].containerCache.left = p.left;\n\t\t\t\tthis.containers[i].containerCache.top = p.top;\n\t\t\t\tthis.containers[i].containerCache.width = this.containers[i].element.outerWidth();\n\t\t\t\tthis.containers[i].containerCache.height = this.containers[i].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function(that) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif(!o.placeholder || o.placeholder.constructor === String) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[0].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[0] )\n\t\t\t\t\t\t\t.addClass(className || that.currentItem[0].className+\" ui-sortable-placeholder\")\n\t\t\t\t\t\t\t.removeClass(\"ui-sortable-helper\");\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function(container, p) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified\n\t\t\t\t\tif(className && !o.forcePlaceholderSize) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css(\"paddingTop\")||0, 10) - parseInt(that.currentItem.css(\"paddingBottom\")||0, 10)); }\n\t\t\t\t\tif(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css(\"paddingLeft\")||0, 10) - parseInt(that.currentItem.css(\"paddingRight\")||0, 10)); }\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after(that.placeholder);\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update(that, that.placeholder);\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each(function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t});\n\t},\n\n\t_contactContainers: function(event) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// get innermost container that intersects with item\n\t\tfor (i = this.containers.length - 1; i >= 0; i--) {\n\n\t\t\t// never consider a container that's located within the item itself\n\t\t\tif($.contains(this.currentItem[0], this.containers[i].element[0])) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(this._intersectsWith(this.containers[i].containerCache)) {\n\n\t\t\t\t// if we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[i];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", event, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// if no intersecting containers found, return\n\t\tif(!innermostContainer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// move the item into the container if it's not there already\n\t\tif(this.containers.length === 1) {\n\t\t\tif (!this.containers[innermostIndex].containerCache.over) {\n\t\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t//When entering a new container, we will find the item with the least distance and append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating(this.currentItem);\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"clientX\" : \"clientY\";\n\n\t\t\tfor (j = this.items.length - 1; j >= 0; j--) {\n\t\t\t\tif(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(this.items[j].item[0] === this.currentItem[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[j].item.offset()[posProperty];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\": \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif(!itemWithLeastDistance && !this.options.dropOnEmpty) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.currentContainer === this.containers[innermostIndex]) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);\n\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\tthis.containers[innermostIndex]._trigger(\"change\", event, this._uiHash(this));\n\t\t\tthis.currentContainer = this.containers[innermostIndex];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update(this.currentContainer, this.placeholder);\n\n\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t}\n\n\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem);\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif(!helper.parents(\"body\").length) {\n\t\t\t$(o.appendTo !== \"parent\" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);\n\t\t}\n\n\t\tif(helper[0] === this.currentItem[0]) {\n\t\t\tthis._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css(\"position\"), top: this.currentItem.css(\"top\"), left: this.currentItem.css(\"left\") };\n\t\t}\n\n\t\tif(!helper[0].style.width || o.forceHelperSize) {\n\t\t\thelper.width(this.currentItem.width());\n\t\t}\n\t\tif(!helper[0].style.height || o.forceHelperSize) {\n\t\t\thelper.height(this.currentItem.height());\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif(this.cssPosition === \"absolute\" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this information\n\t\t// with an ugly IE fix\n\t\tif( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === \"html\" && $.ui.ie)) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif(this.cssPosition === \"relative\") {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.currentItem.css(\"marginLeft\"),10) || 0),\n\t\t\ttop: (parseInt(this.currentItem.css(\"marginTop\"),10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif(o.containment === \"parent\") {\n\t\t\to.containment = this.helper[0].parentNode;\n\t\t}\n\t\tif(o.containment === \"document\" || o.containment === \"window\") {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t(o.containment === \"document\" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif(!(/^(document|window|parent)$/).test(o.containment)) {\n\t\t\tce = $(o.containment)[0];\n\t\t\tco = $(o.containment).offset();\n\t\t\tover = ($(ce).css(\"overflow\") !== \"hidden\");\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0) - this.margins.left,\n\t\t\t\tco.top + (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0) - this.margins.top,\n\t\t\t\tco.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left,\n\t\t\t\tco.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif(!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,\n\t\t\tscrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function(event) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif(this.cssPosition === \"relative\" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif(this.originalPosition) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif(this.containment) {\n\t\t\t\tif(event.pageX - this.offset.click.left < this.containment[0]) {\n\t\t\t\t\tpageX = this.containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top < this.containment[1]) {\n\t\t\t\t\tpageY = this.containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif(event.pageX - this.offset.click.left > this.containment[2]) {\n\t\t\t\t\tpageX = this.containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top > this.containment[3]) {\n\t\t\t\t\tpageY = this.containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(o.grid) {\n\t\t\t\ttop = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];\n\t\t\t\tpageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];\n\t\t\t\tpageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.top -\t\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function(event, i, a, hardRefresh) {\n\n\t\ta ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === \"down\" ? i.item[0] : i.item[0].nextSibling));\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay(function() {\n\t\t\tif(counter === this.counter) {\n\t\t\t\tthis.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_clear: function(event, noPropagation) {\n\n\t\tthis.reverting = false;\n\t\t// We delay all events that have to be triggered to after the point where the placeholder has been removed and\n\t\t// everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)\n\t\tif(!this._noFinalSort && this.currentItem.parent().length) {\n\t\t\tthis.placeholder.before(this.currentItem);\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif(this.helper[0] === this.currentItem[0]) {\n\t\t\tfor(i in this._storedCSS) {\n\t\t\t\tif(this._storedCSS[i] === \"auto\" || this._storedCSS[i] === \"static\") {\n\t\t\t\t\tthis._storedCSS[i] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif(this.fromOutside && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"receive\", event, this._uiHash(this.fromOutside)); });\n\t\t}\n\t\tif((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(\".ui-sortable-helper\")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"update\", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif (this !== this.currentContainer) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"remove\", event, this._uiHash()); });\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"receive\", event, this._uiHash(this)); };  }).call(this, this.currentContainer));\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"update\", event, this._uiHash(this));  }; }).call(this, this.currentContainer));\n\t\t\t}\n\t\t}\n\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\tif (!noPropagation) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif(this._storedOpacity) {\n\t\t\tthis.helper.css(\"opacity\", this._storedOpacity);\n\t\t}\n\t\tif(this._storedZIndex) {\n\t\t\tthis.helper.css(\"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex);\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif(!noPropagation) {\n\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif(!noPropagation) {\n\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t} //Trigger all delayed events\n\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ($.Widget.prototype._trigger.apply(this, arguments) === false) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function(_inst) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $([]),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n});\n\n\n/*!\n * jQuery UI Spinner 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/spinner/\n */\n\n\nfunction spinner_modifier( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\nvar spinner = $.widget( \"ui.spinner\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<input>\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = {},\n\t\t\telement = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value !== undefined && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( (delta > 0 ? 1 : -1) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay(function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[0] === this.document[0].activeElement ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[0] === this.document[0].activeElement;\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.focus();\n\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay(function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t});\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t_draw: function() {\n\t\tvar uiSpinner = this.uiSpinner = this.element\n\t\t\t.addClass( \"ui-spinner-input\" )\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t.parent()\n\t\t\t\t// add buttons\n\t\t\t\t.append( this._buttonHtml() );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// button bindings\n\t\tthis.buttons = uiSpinner.find( \".ui-spinner-button\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.button()\n\t\t\t.removeClass( \"ui-corner-all\" );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&\n\t\t\t\tuiSpinner.height() > 0 ) {\n\t\t\tuiSpinner.height( uiSpinner.height() );\n\t\t}\n\n\t\t// disable spinner if element was already disabled\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.disable();\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_uiSpinnerHtml: function() {\n\t\treturn \"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>\";\n\t},\n\n\t_buttonHtml: function() {\n\t\treturn \"\" +\n\t\t\t\"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>\" +\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.up + \"'>&#9650;</span>\" +\n\t\t\t\"</a>\" +\n\t\t\t\"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>\" +\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.down + \"'>&#9660;</span>\" +\n\t\t\t\"</a>\";\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay(function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round(aboveMin / options.step) * options.step;\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// clamp the value\n\t\tif ( options.max !== null && value > options.max) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tvar prevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.buttons.first().find( \".ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.up )\n\t\t\t\t.addClass( value.up );\n\t\t\tthis.buttons.last().find( \".ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.down )\n\t\t\t\t.addClass( value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget().toggleClass( \"ui-state-disabled\", !!value );\n\t\t\tthis.element.prop( \"disabled\", !!value );\n\t\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t\t}\n\t},\n\n\t_setOptions: spinner_modifier(function( options ) {\n\t\tthis._super( options );\n\t}),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr({\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t});\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// if value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-spinner-input\" )\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-valuemin\" )\n\t\t\t.removeAttr( \"aria-valuemax\" )\n\t\t\t.removeAttr( \"aria-valuenow\" );\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinner_modifier(function( steps ) {\n\t\tthis._stepUp( steps );\n\t}),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( (steps || 1) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinner_modifier(function( steps ) {\n\t\tthis._stepDown( steps );\n\t}),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( (steps || 1) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinner_modifier(function( pages ) {\n\t\tthis._stepUp( (pages || 1) * this.options.page );\n\t}),\n\n\tpageDown: spinner_modifier(function( pages ) {\n\t\tthis._stepDown( (pages || 1) * this.options.page );\n\t}),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinner_modifier( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n});\n\n\n/*!\n * jQuery UI Tabs 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/tabs/\n */\n\n\nvar tabs = $.widget( \"ui.tabs\", {\n\tversion: \"1.11.4\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: (function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\t// support: IE7\n\t\t\t// IE7 doesn't normalize the href property when set via script (#9317)\n\t\t\tanchor = anchor.cloneNode( false );\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t})(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.toggleClass( \"ui-tabs-collapsible\", options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t})\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each(function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// no active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( this.document[0].activeElement ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tselectedIndex++;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.UP:\n\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\tgoingForward = false;\n\t\t\t\tselectedIndex--;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tselectedIndex = 0;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\t// Activate only, no collapsing\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\tthis._activate( selectedIndex );\n\t\t\t\treturn;\n\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\t// Determine if we should collapse or activate\n\t\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay(function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.focus();\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).focus();\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\t// don't use the widget factory's disabled handling\n\t\t\tthis._setupDisabled( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value);\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis.element.toggleClass( \"ui-tabs-collapsible\", value );\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t});\n\n\t\tthis._processTabs();\n\n\t\t// was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\t\t// was active, active tab still exists\n\t\t} else {\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setupDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t});\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t});\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.addClass( \"ui-tabs-active ui-state-active\" )\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t});\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList()\n\t\t\t.addClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.attr( \"role\", \"tablist\" )\n\n\t\t\t// Prevent users from focusing disabled tabs via click\n\t\t\t.delegate( \"> li\", \"mousedown\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.delegate( \".ui-tabs-anchor\", \"focus\" + this.eventNamespace, function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.addClass( \"ui-state-default ui-corner-top\" )\n\t\t\t.attr({\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.anchors = this.tabs.map(function() {\n\t\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t\t})\n\t\t\t.addClass( \"ui-tabs-anchor\" )\n\t\t\t.attr({\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each(function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\t\t\t// remote tab\n\t\t\t} else {\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr({\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t});\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t});\n\n\t\tthis.panels\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol,ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"<div>\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setupDisabled: function( disabled ) {\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// disable tabs\n\t\tfor ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\t$( li )\n\t\t\t\t\t.addClass( \"ui-state-disabled\" )\n\t\t\t\t\t.attr( \"aria-disabled\", \"true\" );\n\t\t\t} else {\n\t\t\t\t$( li )\n\t\t\t\t\t.removeClass( \"ui-state-disabled\" )\n\t\t\t\t\t.removeAttr( \"aria-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split(\" \"), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t});\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t});\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.element.children().not( this.panels ).each(function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.panels.each(function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t})\n\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each(function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t}).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\teventData.newTab.closest( \"li\" ).addClass( \"ui-tabs-active ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t});\n\t\t} else {\n\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t});\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter(function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t})\n\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr({\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t});\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler({\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t});\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" + index + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.element.removeClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible\" );\n\n\t\tthis.tablist\n\t\t\t.removeClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.removeAttr( \"role\" );\n\n\t\tthis.anchors\n\t\t\t.removeClass( \"ui-tabs-anchor\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tablist.unbind( this.eventNamespace );\n\n\t\tthis.tabs.add( this.panels ).each(function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this )\n\t\t\t\t\t.removeClass( \"ui-state-default ui-state-active ui-state-disabled \" +\n\t\t\t\t\t\t\"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel\" )\n\t\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t\t.removeAttr( \"aria-live\" )\n\t\t\t\t\t.removeAttr( \"aria-busy\" )\n\t\t\t\t\t.removeAttr( \"aria-selected\" )\n\t\t\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t\t\t.removeAttr( \"role\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.tabs.each(function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\ttab.removeClass( \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\ttab.addClass( \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done(function( response, status, jqXHR ) {\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t})\n\t\t\t\t.fail(function( jqXHR, status ) {\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\t\t\turl: anchor.attr( \"href\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n});\n\n\n/*!\n * jQuery UI Tooltip 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/tooltip/\n */\n\n\nvar tooltip = $.widget( \"ui.tooltip\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tcontent: function() {\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"<a>\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttooltipClass: null,\n\t\ttrack: false,\n\n\t\t// callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = (elem.attr( \"aria-describedby\" ) || \"\").split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = (elem.attr( \"aria-describedby\" ) || \"\").split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on({\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t});\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._disable();\n\t\t}\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"<div>\" )\n\t\t\t.attr({\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t})\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t\t\tthis.options[ key ] = value;\n\t\t\t// disable element style changes\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t});\n\t\t}\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t});\n\n\t\t// remove title attributes to prevent native tooltips\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\telement\n\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_enable: function() {\n\t\t// restore title attributes\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t});\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each(function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[0], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay(function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// jQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t});\n\t\t});\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// if we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\tif ( content.clone ) {\n\t\t\ta11yContent = content.clone();\n\t\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\t} else {\n\t\t\ta11yContent = content;\n\t\t}\n\t\t$( \"<div>\" ).html( a11yContent ).appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t});\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend({\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\tif ( this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval(function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event(event);\n\t\t\t\t\tfakeEvent.currentTarget = target[0];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t});\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t});\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"<div>\" )\n\t\t\t\t.attr( \"role\", \"tooltip\" )\n\t\t\t\t.addClass( \"ui-tooltip ui-widget ui-corner-all ui-widget-content \" +\n\t\t\t\t\t( this.options.tooltipClass || \"\" ) ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\t$( \"<div>\" )\n\t\t\t.addClass( \"ui-tooltip-content\" )\n\t\t\t.appendTo( tooltip );\n\n\t\ttooltip.appendTo( this.document[0].body );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t});\n\t\tthis.liveRegion.remove();\n\t}\n});\n\n\n\n}));","/*! jQuery UI - v1.11.1+CommonJS - 2014-09-17\n* http://jqueryui.com\n* Includes: widget.js\n* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */\n\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([ \"jquery\" ], factory );\n\n\t} else if (typeof exports === \"object\") {\n\t\t// Node/CommonJS:\n\t\tfactory(require(\"jquery\"));\n\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n/*!\n * jQuery UI Widget 1.11.1\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n\n\nvar widget_uuid = 0,\n\twidget_slice = Array.prototype.slice;\n\n$.cleanData = (function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; (elem = elems[i]) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t} catch( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n})( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widget_slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = widget_slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.widget.extend.apply( null, [ options ].concat(args) ) :\n\t\t\toptions;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\treturnValue = instance;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widget_uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled\", !!value );\n\n\t\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\t\tif ( value ) {\n\t\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions({ disabled: false });\n\t},\n\tdisable: function() {\n\t\treturn this._setOptions({ disabled: true });\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) + this.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\nvar widget = $.widget;\n\n\n\n}));\n","/*\n * jQuery Iframe Transport Plugin 1.8.3\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n */\n\n/* global define, require, window, document */\n\n(function (factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        // Register as an anonymous AMD module:\n        define(['jquery'], factory);\n    } else if (typeof exports === 'object') {\n        // Node/CommonJS:\n        factory(require('jquery'));\n    } else {\n        // Browser globals:\n        factory(window.jQuery);\n    }\n}(function ($) {\n    'use strict';\n\n    // Helper variable to create unique names for the transport iframes:\n    var counter = 0;\n\n    // The iframe transport accepts four additional options:\n    // options.fileInput: a jQuery collection of file input fields\n    // options.paramName: the parameter name for the file form data,\n    //  overrides the name property of the file input field(s),\n    //  can be a string or an array of strings.\n    // options.formData: an array of objects with name and value properties,\n    //  equivalent to the return data of .serializeArray(), e.g.:\n    //  [{name: 'a', value: 1}, {name: 'b', value: 2}]\n    // options.initialIframeSrc: the URL of the initial iframe src,\n    //  by default set to \"javascript:false;\"\n    $.ajaxTransport('iframe', function (options) {\n        if (options.async) {\n            // javascript:false as initial iframe src\n            // prevents warning popups on HTTPS in IE6:\n            /*jshint scripturl: true */\n            var initialIframeSrc = options.initialIframeSrc || 'javascript:false;',\n            /*jshint scripturl: false */\n                form,\n                iframe,\n                addParamChar;\n            return {\n                send: function (_, completeCallback) {\n                    form = $('<form style=\"display:none;\"></form>');\n                    form.attr('accept-charset', options.formAcceptCharset);\n                    addParamChar = /\\?/.test(options.url) ? '&' : '?';\n                    // XDomainRequest only supports GET and POST:\n                    if (options.type === 'DELETE') {\n                        options.url = options.url + addParamChar + '_method=DELETE';\n                        options.type = 'POST';\n                    } else if (options.type === 'PUT') {\n                        options.url = options.url + addParamChar + '_method=PUT';\n                        options.type = 'POST';\n                    } else if (options.type === 'PATCH') {\n                        options.url = options.url + addParamChar + '_method=PATCH';\n                        options.type = 'POST';\n                    }\n                    // IE versions below IE8 cannot set the name property of\n                    // elements that have already been added to the DOM,\n                    // so we set the name along with the iframe HTML markup:\n                    counter += 1;\n                    iframe = $(\n                        '<iframe src=\"' + initialIframeSrc +\n                            '\" name=\"iframe-transport-' + counter + '\"></iframe>'\n                    ).bind('load', function () {\n                        var fileInputClones,\n                            paramNames = $.isArray(options.paramName) ?\n                                    options.paramName : [options.paramName];\n                        iframe\n                            .unbind('load')\n                            .bind('load', function () {\n                                var response;\n                                // Wrap in a try/catch block to catch exceptions thrown\n                                // when trying to access cross-domain iframe contents:\n                                try {\n                                    response = iframe.contents();\n                                    // Google Chrome and Firefox do not throw an\n                                    // exception when calling iframe.contents() on\n                                    // cross-domain requests, so we unify the response:\n                                    if (!response.length || !response[0].firstChild) {\n                                        throw new Error();\n                                    }\n                                } catch (e) {\n                                    response = undefined;\n                                }\n                                // The complete callback returns the\n                                // iframe content document as response object:\n                                completeCallback(\n                                    200,\n                                    'success',\n                                    {'iframe': response}\n                                );\n                                // Fix for IE endless progress bar activity bug\n                                // (happens on form submits to iframe targets):\n                                $('<iframe src=\"' + initialIframeSrc + '\"></iframe>')\n                                    .appendTo(form);\n                                window.setTimeout(function () {\n                                    // Removing the form in a setTimeout call\n                                    // allows Chrome's developer tools to display\n                                    // the response result\n                                    form.remove();\n                                }, 0);\n                            });\n                        form\n                            .prop('target', iframe.prop('name'))\n                            .prop('action', options.url)\n                            .prop('method', options.type);\n                        if (options.formData) {\n                            $.each(options.formData, function (index, field) {\n                                $('<input type=\"hidden\"/>')\n                                    .prop('name', field.name)\n                                    .val(field.value)\n                                    .appendTo(form);\n                            });\n                        }\n                        if (options.fileInput && options.fileInput.length &&\n                                options.type === 'POST') {\n                            fileInputClones = options.fileInput.clone();\n                            // Insert a clone for each file input field:\n                            options.fileInput.after(function (index) {\n                                return fileInputClones[index];\n                            });\n                            if (options.paramName) {\n                                options.fileInput.each(function (index) {\n                                    $(this).prop(\n                                        'name',\n                                        paramNames[index] || options.paramName\n                                    );\n                                });\n                            }\n                            // Appending the file input fields to the hidden form\n                            // removes them from their original location:\n                            form\n                                .append(options.fileInput)\n                                .prop('enctype', 'multipart/form-data')\n                                // enctype must be set as encoding for IE:\n                                .prop('encoding', 'multipart/form-data');\n                            // Remove the HTML5 form attribute from the input(s):\n                            options.fileInput.removeAttr('form');\n                        }\n                        form.submit();\n                        // Insert the file input fields at their original location\n                        // by replacing the clones with the originals:\n                        if (fileInputClones && fileInputClones.length) {\n                            options.fileInput.each(function (index, input) {\n                                var clone = $(fileInputClones[index]);\n                                // Restore the original name and form properties:\n                                $(input)\n                                    .prop('name', clone.prop('name'))\n                                    .attr('form', clone.attr('form'));\n                                clone.replaceWith(input);\n                            });\n                        }\n                    });\n                    form.append(iframe).appendTo(document.body);\n                },\n                abort: function () {\n                    if (iframe) {\n                        // javascript:false as iframe src aborts the request\n                        // and prevents warning popups on HTTPS in IE6.\n                        // concat is used to avoid the \"Script URL\" JSLint error:\n                        iframe\n                            .unbind('load')\n                            .prop('src', initialIframeSrc);\n                    }\n                    if (form) {\n                        form.remove();\n                    }\n                }\n            };\n        }\n    });\n\n    // The iframe transport returns the iframe content document as response.\n    // The following adds converters from iframe to text, json, html, xml\n    // and script.\n    // Please note that the Content-Type for JSON responses has to be text/plain\n    // or text/html, if the browser doesn't include application/json in the\n    // Accept header, else IE will show a download dialog.\n    // The Content-Type for XML responses on the other hand has to be always\n    // application/xml or text/xml, so IE properly parses the XML response.\n    // See also\n    // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation\n    $.ajaxSetup({\n        converters: {\n            'iframe text': function (iframe) {\n                return iframe && $(iframe[0].body).text();\n            },\n            'iframe json': function (iframe) {\n                return iframe && $.parseJSON($(iframe[0].body).text());\n            },\n            'iframe html': function (iframe) {\n                return iframe && $(iframe[0].body).html();\n            },\n            'iframe xml': function (iframe) {\n                var xmlDoc = iframe && iframe[0];\n                return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :\n                        $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||\n                            $(xmlDoc.body).html());\n            },\n            'iframe script': function (iframe) {\n                return iframe && $.globalEval($(iframe[0].body).text());\n            }\n        }\n    });\n\n}));\n","/*\n * jQuery File Upload Plugin 5.42.3\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2010, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n/* global define, require, window, document, location, Blob, FormData */\n\n(function (factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        // Register as an anonymous AMD module:\n        define([\n            'jquery',\n            'jquery.ui.widget'\n        ], factory);\n    } else if (typeof exports === 'object') {\n        // Node/CommonJS:\n        factory(\n            require('jquery'),\n            require('./vendor/jquery.ui.widget')\n        );\n    } else {\n        // Browser globals:\n        factory(window.jQuery);\n    }\n}(function ($) {\n    'use strict';\n\n    // Detect file input support, based on\n    // http://viljamis.com/blog/2012/file-upload-support-on-mobile/\n    $.support.fileInput = !(new RegExp(\n        // Handle devices which give false positives for the feature detection:\n        '(Android (1\\\\.[0156]|2\\\\.[01]))' +\n            '|(Windows Phone (OS 7|8\\\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +\n            '|(w(eb)?OSBrowser)|(webOS)' +\n            '|(Kindle/(1\\\\.0|2\\\\.[05]|3\\\\.0))'\n    ).test(window.navigator.userAgent) ||\n        // Feature detection for all other devices:\n        $('<input type=\"file\">').prop('disabled'));\n\n    // The FileReader API is not actually used, but works as feature detection,\n    // as some Safari versions (5?) support XHR file uploads via the FormData API,\n    // but not non-multipart XHR file uploads.\n    // window.XMLHttpRequestUpload is not available on IE10, so we check for\n    // window.ProgressEvent instead to detect XHR2 file upload capability:\n    $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);\n    $.support.xhrFormDataFileUpload = !!window.FormData;\n\n    // Detect support for Blob slicing (required for chunked uploads):\n    $.support.blobSlice = window.Blob && (Blob.prototype.slice ||\n        Blob.prototype.webkitSlice || Blob.prototype.mozSlice);\n\n    // Helper function to create drag handlers for dragover/dragenter/dragleave:\n    function getDragHandler(type) {\n        var isDragOver = type === 'dragover';\n        return function (e) {\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n            var dataTransfer = e.dataTransfer;\n            if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&\n                    this._trigger(\n                        type,\n                        $.Event(type, {delegatedEvent: e})\n                    ) !== false) {\n                e.preventDefault();\n                if (isDragOver) {\n                    dataTransfer.dropEffect = 'copy';\n                }\n            }\n        };\n    }\n\n    // The fileupload widget listens for change events on file input fields defined\n    // via fileInput setting and paste or drop events of the given dropZone.\n    // In addition to the default jQuery Widget methods, the fileupload widget\n    // exposes the \"add\" and \"send\" methods, to add or directly send files using\n    // the fileupload API.\n    // By default, files added via file input selection, paste, drag & drop or\n    // \"add\" method are uploaded immediately, but it is possible to override\n    // the \"add\" callback option to queue file uploads.\n    $.widget('blueimp.fileupload', {\n\n        options: {\n            // The drop target element(s), by the default the complete document.\n            // Set to null to disable drag & drop support:\n            dropZone: $(document),\n            // The paste target element(s), by the default undefined.\n            // Set to a DOM node or jQuery object to enable file pasting:\n            pasteZone: undefined,\n            // The file input field(s), that are listened to for change events.\n            // If undefined, it is set to the file input fields inside\n            // of the widget element on plugin initialization.\n            // Set to null to disable the change listener.\n            fileInput: undefined,\n            // By default, the file input field is replaced with a clone after\n            // each input field change event. This is required for iframe transport\n            // queues and allows change events to be fired for the same file\n            // selection, but can be disabled by setting the following option to false:\n            replaceFileInput: true,\n            // The parameter name for the file form data (the request argument name).\n            // If undefined or empty, the name property of the file input field is\n            // used, or \"files[]\" if the file input name property is also empty,\n            // can be a string or an array of strings:\n            paramName: undefined,\n            // By default, each file of a selection is uploaded using an individual\n            // request for XHR type uploads. Set to false to upload file\n            // selections in one request each:\n            singleFileUploads: true,\n            // To limit the number of files uploaded with one XHR request,\n            // set the following option to an integer greater than 0:\n            limitMultiFileUploads: undefined,\n            // The following option limits the number of files uploaded with one\n            // XHR request to keep the request size under or equal to the defined\n            // limit in bytes:\n            limitMultiFileUploadSize: undefined,\n            // Multipart file uploads add a number of bytes to each uploaded file,\n            // therefore the following option adds an overhead for each file used\n            // in the limitMultiFileUploadSize configuration:\n            limitMultiFileUploadSizeOverhead: 512,\n            // Set the following option to true to issue all file upload requests\n            // in a sequential order:\n            sequentialUploads: false,\n            // To limit the number of concurrent uploads,\n            // set the following option to an integer greater than 0:\n            limitConcurrentUploads: undefined,\n            // Set the following option to true to force iframe transport uploads:\n            forceIframeTransport: false,\n            // Set the following option to the location of a redirect url on the\n            // origin server, for cross-domain iframe transport uploads:\n            redirect: undefined,\n            // The parameter name for the redirect url, sent as part of the form\n            // data and set to 'redirect' if this option is empty:\n            redirectParamName: undefined,\n            // Set the following option to the location of a postMessage window,\n            // to enable postMessage transport uploads:\n            postMessage: undefined,\n            // By default, XHR file uploads are sent as multipart/form-data.\n            // The iframe transport is always using multipart/form-data.\n            // Set to false to enable non-multipart XHR uploads:\n            multipart: true,\n            // To upload large files in smaller chunks, set the following option\n            // to a preferred maximum chunk size. If set to 0, null or undefined,\n            // or the browser does not support the required Blob API, files will\n            // be uploaded as a whole.\n            maxChunkSize: undefined,\n            // When a non-multipart upload or a chunked multipart upload has been\n            // aborted, this option can be used to resume the upload by setting\n            // it to the size of the already uploaded bytes. This option is most\n            // useful when modifying the options object inside of the \"add\" or\n            // \"send\" callbacks, as the options are cloned for each file upload.\n            uploadedBytes: undefined,\n            // By default, failed (abort or error) file uploads are removed from the\n            // global progress calculation. Set the following option to false to\n            // prevent recalculating the global progress data:\n            recalculateProgress: true,\n            // Interval in milliseconds to calculate and trigger progress events:\n            progressInterval: 100,\n            // Interval in milliseconds to calculate progress bitrate:\n            bitrateInterval: 500,\n            // By default, uploads are started automatically when adding files:\n            autoUpload: true,\n\n            // Error and info messages:\n            messages: {\n                uploadedBytes: 'Uploaded bytes exceed file size'\n            },\n\n            // Translation function, gets the message key to be translated\n            // and an object with context specific data as arguments:\n            i18n: function (message, context) {\n                message = this.messages[message] || message.toString();\n                if (context) {\n                    $.each(context, function (key, value) {\n                        message = message.replace('{' + key + '}', value);\n                    });\n                }\n                return message;\n            },\n\n            // Additional form data to be sent along with the file uploads can be set\n            // using this option, which accepts an array of objects with name and\n            // value properties, a function returning such an array, a FormData\n            // object (for XHR file uploads), or a simple object.\n            // The form of the first fileInput is given as parameter to the function:\n            formData: function (form) {\n                return form.serializeArray();\n            },\n\n            // The add callback is invoked as soon as files are added to the fileupload\n            // widget (via file input selection, drag & drop, paste or add API call).\n            // If the singleFileUploads option is enabled, this callback will be\n            // called once for each file in the selection for XHR file uploads, else\n            // once for each file selection.\n            //\n            // The upload starts when the submit method is invoked on the data parameter.\n            // The data object contains a files property holding the added files\n            // and allows you to override plugin options as well as define ajax settings.\n            //\n            // Listeners for this callback can also be bound the following way:\n            // .bind('fileuploadadd', func);\n            //\n            // data.submit() returns a Promise object and allows to attach additional\n            // handlers using jQuery's Deferred callbacks:\n            // data.submit().done(func).fail(func).always(func);\n            add: function (e, data) {\n                if (e.isDefaultPrevented()) {\n                    return false;\n                }\n                if (data.autoUpload || (data.autoUpload !== false &&\n                        $(this).fileupload('option', 'autoUpload'))) {\n                    data.process().done(function () {\n                        data.submit();\n                    });\n                }\n            },\n\n            // Other callbacks:\n\n            // Callback for the submit event of each file upload:\n            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);\n\n            // Callback for the start of each file upload request:\n            // send: function (e, data) {}, // .bind('fileuploadsend', func);\n\n            // Callback for successful uploads:\n            // done: function (e, data) {}, // .bind('fileuploaddone', func);\n\n            // Callback for failed (abort or error) uploads:\n            // fail: function (e, data) {}, // .bind('fileuploadfail', func);\n\n            // Callback for completed (success, abort or error) requests:\n            // always: function (e, data) {}, // .bind('fileuploadalways', func);\n\n            // Callback for upload progress events:\n            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);\n\n            // Callback for global upload progress events:\n            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);\n\n            // Callback for uploads start, equivalent to the global ajaxStart event:\n            // start: function (e) {}, // .bind('fileuploadstart', func);\n\n            // Callback for uploads stop, equivalent to the global ajaxStop event:\n            // stop: function (e) {}, // .bind('fileuploadstop', func);\n\n            // Callback for change events of the fileInput(s):\n            // change: function (e, data) {}, // .bind('fileuploadchange', func);\n\n            // Callback for paste events to the pasteZone(s):\n            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);\n\n            // Callback for drop events of the dropZone(s):\n            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);\n\n            // Callback for dragover events of the dropZone(s):\n            // dragover: function (e) {}, // .bind('fileuploaddragover', func);\n\n            // Callback for the start of each chunk upload request:\n            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);\n\n            // Callback for successful chunk uploads:\n            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);\n\n            // Callback for failed (abort or error) chunk uploads:\n            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);\n\n            // Callback for completed (success, abort or error) chunk upload requests:\n            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);\n\n            // The plugin options are used as settings object for the ajax calls.\n            // The following are jQuery ajax settings required for the file uploads:\n            processData: false,\n            contentType: false,\n            cache: false,\n            timeout: 0\n        },\n\n        // A list of options that require reinitializing event listeners and/or\n        // special initialization code:\n        _specialOptions: [\n            'fileInput',\n            'dropZone',\n            'pasteZone',\n            'multipart',\n            'forceIframeTransport'\n        ],\n\n        _blobSlice: $.support.blobSlice && function () {\n            var slice = this.slice || this.webkitSlice || this.mozSlice;\n            return slice.apply(this, arguments);\n        },\n\n        _BitrateTimer: function () {\n            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());\n            this.loaded = 0;\n            this.bitrate = 0;\n            this.getBitrate = function (now, loaded, interval) {\n                var timeDiff = now - this.timestamp;\n                if (!this.bitrate || !interval || timeDiff > interval) {\n                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;\n                    this.loaded = loaded;\n                    this.timestamp = now;\n                }\n                return this.bitrate;\n            };\n        },\n\n        _isXHRUpload: function (options) {\n            return !options.forceIframeTransport &&\n                ((!options.multipart && $.support.xhrFileUpload) ||\n                $.support.xhrFormDataFileUpload);\n        },\n\n        _getFormData: function (options) {\n            var formData;\n            if ($.type(options.formData) === 'function') {\n                return options.formData(options.form);\n            }\n            if ($.isArray(options.formData)) {\n                return options.formData;\n            }\n            if ($.type(options.formData) === 'object') {\n                formData = [];\n                $.each(options.formData, function (name, value) {\n                    formData.push({name: name, value: value});\n                });\n                return formData;\n            }\n            return [];\n        },\n\n        _getTotal: function (files) {\n            var total = 0;\n            $.each(files, function (index, file) {\n                total += file.size || 1;\n            });\n            return total;\n        },\n\n        _initProgressObject: function (obj) {\n            var progress = {\n                loaded: 0,\n                total: 0,\n                bitrate: 0\n            };\n            if (obj._progress) {\n                $.extend(obj._progress, progress);\n            } else {\n                obj._progress = progress;\n            }\n        },\n\n        _initResponseObject: function (obj) {\n            var prop;\n            if (obj._response) {\n                for (prop in obj._response) {\n                    if (obj._response.hasOwnProperty(prop)) {\n                        delete obj._response[prop];\n                    }\n                }\n            } else {\n                obj._response = {};\n            }\n        },\n\n        _onProgress: function (e, data) {\n            if (e.lengthComputable) {\n                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),\n                    loaded;\n                if (data._time && data.progressInterval &&\n                        (now - data._time < data.progressInterval) &&\n                        e.loaded !== e.total) {\n                    return;\n                }\n                data._time = now;\n                loaded = Math.floor(\n                    e.loaded / e.total * (data.chunkSize || data._progress.total)\n                ) + (data.uploadedBytes || 0);\n                // Add the difference from the previously loaded state\n                // to the global loaded counter:\n                this._progress.loaded += (loaded - data._progress.loaded);\n                this._progress.bitrate = this._bitrateTimer.getBitrate(\n                    now,\n                    this._progress.loaded,\n                    data.bitrateInterval\n                );\n                data._progress.loaded = data.loaded = loaded;\n                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(\n                    now,\n                    loaded,\n                    data.bitrateInterval\n                );\n                // Trigger a custom progress event with a total data property set\n                // to the file size(s) of the current upload and a loaded data\n                // property calculated accordingly:\n                this._trigger(\n                    'progress',\n                    $.Event('progress', {delegatedEvent: e}),\n                    data\n                );\n                // Trigger a global progress event for all current file uploads,\n                // including ajax calls queued for sequential file uploads:\n                this._trigger(\n                    'progressall',\n                    $.Event('progressall', {delegatedEvent: e}),\n                    this._progress\n                );\n            }\n        },\n\n        _initProgressListener: function (options) {\n            var that = this,\n                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();\n            // Accesss to the native XHR object is required to add event listeners\n            // for the upload progress event:\n            if (xhr.upload) {\n                $(xhr.upload).bind('progress', function (e) {\n                    var oe = e.originalEvent;\n                    // Make sure the progress event properties get copied over:\n                    e.lengthComputable = oe.lengthComputable;\n                    e.loaded = oe.loaded;\n                    e.total = oe.total;\n                    that._onProgress(e, options);\n                });\n                options.xhr = function () {\n                    return xhr;\n                };\n            }\n        },\n\n        _isInstanceOf: function (type, obj) {\n            // Cross-frame instanceof check\n            return Object.prototype.toString.call(obj) === '[object ' + type + ']';\n        },\n\n        _initXHRData: function (options) {\n            var that = this,\n                formData,\n                file = options.files[0],\n                // Ignore non-multipart setting if not supported:\n                multipart = options.multipart || !$.support.xhrFileUpload,\n                paramName = $.type(options.paramName) === 'array' ?\n                    options.paramName[0] : options.paramName;\n            options.headers = $.extend({}, options.headers);\n            if (options.contentRange) {\n                options.headers['Content-Range'] = options.contentRange;\n            }\n            if (!multipart || options.blob || !this._isInstanceOf('File', file)) {\n                options.headers['Content-Disposition'] = 'attachment; filename=\"' +\n                    encodeURI(file.name) + '\"';\n            }\n            if (!multipart) {\n                options.contentType = file.type || 'application/octet-stream';\n                options.data = options.blob || file;\n            } else if ($.support.xhrFormDataFileUpload) {\n                if (options.postMessage) {\n                    // window.postMessage does not allow sending FormData\n                    // objects, so we just add the File/Blob objects to\n                    // the formData array and let the postMessage window\n                    // create the FormData object out of this array:\n                    formData = this._getFormData(options);\n                    if (options.blob) {\n                        formData.push({\n                            name: paramName,\n                            value: options.blob\n                        });\n                    } else {\n                        $.each(options.files, function (index, file) {\n                            formData.push({\n                                name: ($.type(options.paramName) === 'array' &&\n                                    options.paramName[index]) || paramName,\n                                value: file\n                            });\n                        });\n                    }\n                } else {\n                    if (that._isInstanceOf('FormData', options.formData)) {\n                        formData = options.formData;\n                    } else {\n                        formData = new FormData();\n                        $.each(this._getFormData(options), function (index, field) {\n                            formData.append(field.name, field.value);\n                        });\n                    }\n                    if (options.blob) {\n                        formData.append(paramName, options.blob, file.name);\n                    } else {\n                        $.each(options.files, function (index, file) {\n                            // This check allows the tests to run with\n                            // dummy objects:\n                            if (that._isInstanceOf('File', file) ||\n                                    that._isInstanceOf('Blob', file)) {\n                                formData.append(\n                                    ($.type(options.paramName) === 'array' &&\n                                        options.paramName[index]) || paramName,\n                                    file,\n                                    file.uploadName || file.name\n                                );\n                            }\n                        });\n                    }\n                }\n                options.data = formData;\n            }\n            // Blob reference is not needed anymore, free memory:\n            options.blob = null;\n        },\n\n        _initIframeSettings: function (options) {\n            var targetHost = $('<a></a>').prop('href', options.url).prop('host');\n            // Setting the dataType to iframe enables the iframe transport:\n            options.dataType = 'iframe ' + (options.dataType || '');\n            // The iframe transport accepts a serialized array as form data:\n            options.formData = this._getFormData(options);\n            // Add redirect url to form data on cross-domain uploads:\n            if (options.redirect && targetHost && targetHost !== location.host) {\n                options.formData.push({\n                    name: options.redirectParamName || 'redirect',\n                    value: options.redirect\n                });\n            }\n        },\n\n        _initDataSettings: function (options) {\n            if (this._isXHRUpload(options)) {\n                if (!this._chunkedUpload(options, true)) {\n                    if (!options.data) {\n                        this._initXHRData(options);\n                    }\n                    this._initProgressListener(options);\n                }\n                if (options.postMessage) {\n                    // Setting the dataType to postmessage enables the\n                    // postMessage transport:\n                    options.dataType = 'postmessage ' + (options.dataType || '');\n                }\n            } else {\n                this._initIframeSettings(options);\n            }\n        },\n\n        _getParamName: function (options) {\n            var fileInput = $(options.fileInput),\n                paramName = options.paramName;\n            if (!paramName) {\n                paramName = [];\n                fileInput.each(function () {\n                    var input = $(this),\n                        name = input.prop('name') || 'files[]',\n                        i = (input.prop('files') || [1]).length;\n                    while (i) {\n                        paramName.push(name);\n                        i -= 1;\n                    }\n                });\n                if (!paramName.length) {\n                    paramName = [fileInput.prop('name') || 'files[]'];\n                }\n            } else if (!$.isArray(paramName)) {\n                paramName = [paramName];\n            }\n            return paramName;\n        },\n\n        _initFormSettings: function (options) {\n            // Retrieve missing options from the input field and the\n            // associated form, if available:\n            if (!options.form || !options.form.length) {\n                options.form = $(options.fileInput.prop('form'));\n                // If the given file input doesn't have an associated form,\n                // use the default widget file input's form:\n                if (!options.form.length) {\n                    options.form = $(this.options.fileInput.prop('form'));\n                }\n            }\n            options.paramName = this._getParamName(options);\n            if (!options.url) {\n                options.url = options.form.prop('action') || location.href;\n            }\n            // The HTTP request method must be \"POST\" or \"PUT\":\n            options.type = (options.type ||\n                ($.type(options.form.prop('method')) === 'string' &&\n                    options.form.prop('method')) || ''\n                ).toUpperCase();\n            if (options.type !== 'POST' && options.type !== 'PUT' &&\n                    options.type !== 'PATCH') {\n                options.type = 'POST';\n            }\n            if (!options.formAcceptCharset) {\n                options.formAcceptCharset = options.form.attr('accept-charset');\n            }\n        },\n\n        _getAJAXSettings: function (data) {\n            var options = $.extend({}, this.options, data);\n            this._initFormSettings(options);\n            this._initDataSettings(options);\n            return options;\n        },\n\n        // jQuery 1.6 doesn't provide .state(),\n        // while jQuery 1.8+ removed .isRejected() and .isResolved():\n        _getDeferredState: function (deferred) {\n            if (deferred.state) {\n                return deferred.state();\n            }\n            if (deferred.isResolved()) {\n                return 'resolved';\n            }\n            if (deferred.isRejected()) {\n                return 'rejected';\n            }\n            return 'pending';\n        },\n\n        // Maps jqXHR callbacks to the equivalent\n        // methods of the given Promise object:\n        _enhancePromise: function (promise) {\n            promise.success = promise.done;\n            promise.error = promise.fail;\n            promise.complete = promise.always;\n            return promise;\n        },\n\n        // Creates and returns a Promise object enhanced with\n        // the jqXHR methods abort, success, error and complete:\n        _getXHRPromise: function (resolveOrReject, context, args) {\n            var dfd = $.Deferred(),\n                promise = dfd.promise();\n            context = context || this.options.context || promise;\n            if (resolveOrReject === true) {\n                dfd.resolveWith(context, args);\n            } else if (resolveOrReject === false) {\n                dfd.rejectWith(context, args);\n            }\n            promise.abort = dfd.promise;\n            return this._enhancePromise(promise);\n        },\n\n        // Adds convenience methods to the data callback argument:\n        _addConvenienceMethods: function (e, data) {\n            var that = this,\n                getPromise = function (args) {\n                    return $.Deferred().resolveWith(that, args).promise();\n                };\n            data.process = function (resolveFunc, rejectFunc) {\n                if (resolveFunc || rejectFunc) {\n                    data._processQueue = this._processQueue =\n                        (this._processQueue || getPromise([this])).pipe(\n                            function () {\n                                if (data.errorThrown) {\n                                    return $.Deferred()\n                                        .rejectWith(that, [data]).promise();\n                                }\n                                return getPromise(arguments);\n                            }\n                        ).pipe(resolveFunc, rejectFunc);\n                }\n                return this._processQueue || getPromise([this]);\n            };\n            data.submit = function () {\n                if (this.state() !== 'pending') {\n                    data.jqXHR = this.jqXHR =\n                        (that._trigger(\n                            'submit',\n                            $.Event('submit', {delegatedEvent: e}),\n                            this\n                        ) !== false) && that._onSend(e, this);\n                }\n                return this.jqXHR || that._getXHRPromise();\n            };\n            data.abort = function () {\n                if (this.jqXHR) {\n                    return this.jqXHR.abort();\n                }\n                this.errorThrown = 'abort';\n                that._trigger('fail', null, this);\n                return that._getXHRPromise(false);\n            };\n            data.state = function () {\n                if (this.jqXHR) {\n                    return that._getDeferredState(this.jqXHR);\n                }\n                if (this._processQueue) {\n                    return that._getDeferredState(this._processQueue);\n                }\n            };\n            data.processing = function () {\n                return !this.jqXHR && this._processQueue && that\n                    ._getDeferredState(this._processQueue) === 'pending';\n            };\n            data.progress = function () {\n                return this._progress;\n            };\n            data.response = function () {\n                return this._response;\n            };\n        },\n\n        // Parses the Range header from the server response\n        // and returns the uploaded bytes:\n        _getUploadedBytes: function (jqXHR) {\n            var range = jqXHR.getResponseHeader('Range'),\n                parts = range && range.split('-'),\n                upperBytesPos = parts && parts.length > 1 &&\n                    parseInt(parts[1], 10);\n            return upperBytesPos && upperBytesPos + 1;\n        },\n\n        // Uploads a file in multiple, sequential requests\n        // by splitting the file up in multiple blob chunks.\n        // If the second parameter is true, only tests if the file\n        // should be uploaded in chunks, but does not invoke any\n        // upload requests:\n        _chunkedUpload: function (options, testOnly) {\n            options.uploadedBytes = options.uploadedBytes || 0;\n            var that = this,\n                file = options.files[0],\n                fs = file.size,\n                ub = options.uploadedBytes,\n                mcs = options.maxChunkSize || fs,\n                slice = this._blobSlice,\n                dfd = $.Deferred(),\n                promise = dfd.promise(),\n                jqXHR,\n                upload;\n            if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||\n                    options.data) {\n                return false;\n            }\n            if (testOnly) {\n                return true;\n            }\n            if (ub >= fs) {\n                file.error = options.i18n('uploadedBytes');\n                return this._getXHRPromise(\n                    false,\n                    options.context,\n                    [null, 'error', file.error]\n                );\n            }\n            // The chunk upload method:\n            upload = function () {\n                // Clone the options object for each chunk upload:\n                var o = $.extend({}, options),\n                    currentLoaded = o._progress.loaded;\n                o.blob = slice.call(\n                    file,\n                    ub,\n                    ub + mcs,\n                    file.type\n                );\n                // Store the current chunk size, as the blob itself\n                // will be dereferenced after data processing:\n                o.chunkSize = o.blob.size;\n                // Expose the chunk bytes position range:\n                o.contentRange = 'bytes ' + ub + '-' +\n                    (ub + o.chunkSize - 1) + '/' + fs;\n                // Process the upload data (the blob and potential form data):\n                that._initXHRData(o);\n                // Add progress listeners for this chunk upload:\n                that._initProgressListener(o);\n                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||\n                        that._getXHRPromise(false, o.context))\n                    .done(function (result, textStatus, jqXHR) {\n                        ub = that._getUploadedBytes(jqXHR) ||\n                            (ub + o.chunkSize);\n                        // Create a progress event if no final progress event\n                        // with loaded equaling total has been triggered\n                        // for this chunk:\n                        if (currentLoaded + o.chunkSize - o._progress.loaded) {\n                            that._onProgress($.Event('progress', {\n                                lengthComputable: true,\n                                loaded: ub - o.uploadedBytes,\n                                total: ub - o.uploadedBytes\n                            }), o);\n                        }\n                        options.uploadedBytes = o.uploadedBytes = ub;\n                        o.result = result;\n                        o.textStatus = textStatus;\n                        o.jqXHR = jqXHR;\n                        that._trigger('chunkdone', null, o);\n                        that._trigger('chunkalways', null, o);\n                        if (ub < fs) {\n                            // File upload not yet complete,\n                            // continue with the next chunk:\n                            upload();\n                        } else {\n                            dfd.resolveWith(\n                                o.context,\n                                [result, textStatus, jqXHR]\n                            );\n                        }\n                    })\n                    .fail(function (jqXHR, textStatus, errorThrown) {\n                        o.jqXHR = jqXHR;\n                        o.textStatus = textStatus;\n                        o.errorThrown = errorThrown;\n                        that._trigger('chunkfail', null, o);\n                        that._trigger('chunkalways', null, o);\n                        dfd.rejectWith(\n                            o.context,\n                            [jqXHR, textStatus, errorThrown]\n                        );\n                    });\n            };\n            this._enhancePromise(promise);\n            promise.abort = function () {\n                return jqXHR.abort();\n            };\n            upload();\n            return promise;\n        },\n\n        _beforeSend: function (e, data) {\n            if (this._active === 0) {\n                // the start callback is triggered when an upload starts\n                // and no other uploads are currently running,\n                // equivalent to the global ajaxStart event:\n                this._trigger('start');\n                // Set timer for global bitrate progress calculation:\n                this._bitrateTimer = new this._BitrateTimer();\n                // Reset the global progress values:\n                this._progress.loaded = this._progress.total = 0;\n                this._progress.bitrate = 0;\n            }\n            // Make sure the container objects for the .response() and\n            // .progress() methods on the data object are available\n            // and reset to their initial state:\n            this._initResponseObject(data);\n            this._initProgressObject(data);\n            data._progress.loaded = data.loaded = data.uploadedBytes || 0;\n            data._progress.total = data.total = this._getTotal(data.files) || 1;\n            data._progress.bitrate = data.bitrate = 0;\n            this._active += 1;\n            // Initialize the global progress values:\n            this._progress.loaded += data.loaded;\n            this._progress.total += data.total;\n        },\n\n        _onDone: function (result, textStatus, jqXHR, options) {\n            var total = options._progress.total,\n                response = options._response;\n            if (options._progress.loaded < total) {\n                // Create a progress event if no final progress event\n                // with loaded equaling total has been triggered:\n                this._onProgress($.Event('progress', {\n                    lengthComputable: true,\n                    loaded: total,\n                    total: total\n                }), options);\n            }\n            response.result = options.result = result;\n            response.textStatus = options.textStatus = textStatus;\n            response.jqXHR = options.jqXHR = jqXHR;\n            this._trigger('done', null, options);\n        },\n\n        _onFail: function (jqXHR, textStatus, errorThrown, options) {\n            var response = options._response;\n            if (options.recalculateProgress) {\n                // Remove the failed (error or abort) file upload from\n                // the global progress calculation:\n                this._progress.loaded -= options._progress.loaded;\n                this._progress.total -= options._progress.total;\n            }\n            response.jqXHR = options.jqXHR = jqXHR;\n            response.textStatus = options.textStatus = textStatus;\n            response.errorThrown = options.errorThrown = errorThrown;\n            this._trigger('fail', null, options);\n        },\n\n        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {\n            // jqXHRorResult, textStatus and jqXHRorError are added to the\n            // options object via done and fail callbacks\n            this._trigger('always', null, options);\n        },\n\n        _onSend: function (e, data) {\n            if (!data.submit) {\n                this._addConvenienceMethods(e, data);\n            }\n            var that = this,\n                jqXHR,\n                aborted,\n                slot,\n                pipe,\n                options = that._getAJAXSettings(data),\n                send = function () {\n                    that._sending += 1;\n                    // Set timer for bitrate progress calculation:\n                    options._bitrateTimer = new that._BitrateTimer();\n                    jqXHR = jqXHR || (\n                        ((aborted || that._trigger(\n                            'send',\n                            $.Event('send', {delegatedEvent: e}),\n                            options\n                        ) === false) &&\n                        that._getXHRPromise(false, options.context, aborted)) ||\n                        that._chunkedUpload(options) || $.ajax(options)\n                    ).done(function (result, textStatus, jqXHR) {\n                        that._onDone(result, textStatus, jqXHR, options);\n                    }).fail(function (jqXHR, textStatus, errorThrown) {\n                        that._onFail(jqXHR, textStatus, errorThrown, options);\n                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {\n                        that._onAlways(\n                            jqXHRorResult,\n                            textStatus,\n                            jqXHRorError,\n                            options\n                        );\n                        that._sending -= 1;\n                        that._active -= 1;\n                        if (options.limitConcurrentUploads &&\n                                options.limitConcurrentUploads > that._sending) {\n                            // Start the next queued upload,\n                            // that has not been aborted:\n                            var nextSlot = that._slots.shift();\n                            while (nextSlot) {\n                                if (that._getDeferredState(nextSlot) === 'pending') {\n                                    nextSlot.resolve();\n                                    break;\n                                }\n                                nextSlot = that._slots.shift();\n                            }\n                        }\n                        if (that._active === 0) {\n                            // The stop callback is triggered when all uploads have\n                            // been completed, equivalent to the global ajaxStop event:\n                            that._trigger('stop');\n                        }\n                    });\n                    return jqXHR;\n                };\n            this._beforeSend(e, options);\n            if (this.options.sequentialUploads ||\n                    (this.options.limitConcurrentUploads &&\n                    this.options.limitConcurrentUploads <= this._sending)) {\n                if (this.options.limitConcurrentUploads > 1) {\n                    slot = $.Deferred();\n                    this._slots.push(slot);\n                    pipe = slot.pipe(send);\n                } else {\n                    this._sequence = this._sequence.pipe(send, send);\n                    pipe = this._sequence;\n                }\n                // Return the piped Promise object, enhanced with an abort method,\n                // which is delegated to the jqXHR object of the current upload,\n                // and jqXHR callbacks mapped to the equivalent Promise methods:\n                pipe.abort = function () {\n                    aborted = [undefined, 'abort', 'abort'];\n                    if (!jqXHR) {\n                        if (slot) {\n                            slot.rejectWith(options.context, aborted);\n                        }\n                        return send();\n                    }\n                    return jqXHR.abort();\n                };\n                return this._enhancePromise(pipe);\n            }\n            return send();\n        },\n\n        _onAdd: function (e, data) {\n            var that = this,\n                result = true,\n                options = $.extend({}, this.options, data),\n                files = data.files,\n                filesLength = files.length,\n                limit = options.limitMultiFileUploads,\n                limitSize = options.limitMultiFileUploadSize,\n                overhead = options.limitMultiFileUploadSizeOverhead,\n                batchSize = 0,\n                paramName = this._getParamName(options),\n                paramNameSet,\n                paramNameSlice,\n                fileSet,\n                i,\n                j = 0;\n            if (!filesLength) {\n                return false;\n            }\n            if (limitSize && files[0].size === undefined) {\n                limitSize = undefined;\n            }\n            if (!(options.singleFileUploads || limit || limitSize) ||\n                    !this._isXHRUpload(options)) {\n                fileSet = [files];\n                paramNameSet = [paramName];\n            } else if (!(options.singleFileUploads || limitSize) && limit) {\n                fileSet = [];\n                paramNameSet = [];\n                for (i = 0; i < filesLength; i += limit) {\n                    fileSet.push(files.slice(i, i + limit));\n                    paramNameSlice = paramName.slice(i, i + limit);\n                    if (!paramNameSlice.length) {\n                        paramNameSlice = paramName;\n                    }\n                    paramNameSet.push(paramNameSlice);\n                }\n            } else if (!options.singleFileUploads && limitSize) {\n                fileSet = [];\n                paramNameSet = [];\n                for (i = 0; i < filesLength; i = i + 1) {\n                    batchSize += files[i].size + overhead;\n                    if (i + 1 === filesLength ||\n                            ((batchSize + files[i + 1].size + overhead) > limitSize) ||\n                            (limit && i + 1 - j >= limit)) {\n                        fileSet.push(files.slice(j, i + 1));\n                        paramNameSlice = paramName.slice(j, i + 1);\n                        if (!paramNameSlice.length) {\n                            paramNameSlice = paramName;\n                        }\n                        paramNameSet.push(paramNameSlice);\n                        j = i + 1;\n                        batchSize = 0;\n                    }\n                }\n            } else {\n                paramNameSet = paramName;\n            }\n            data.originalFiles = files;\n            $.each(fileSet || files, function (index, element) {\n                var newData = $.extend({}, data);\n                newData.files = fileSet ? element : [element];\n                newData.paramName = paramNameSet[index];\n                that._initResponseObject(newData);\n                that._initProgressObject(newData);\n                that._addConvenienceMethods(e, newData);\n                result = that._trigger(\n                    'add',\n                    $.Event('add', {delegatedEvent: e}),\n                    newData\n                );\n                return result;\n            });\n            return result;\n        },\n\n        _replaceFileInput: function (data) {\n            var input = data.fileInput,\n                inputClone = input.clone(true);\n            // Add a reference for the new cloned file input to the data argument:\n            data.fileInputClone = inputClone;\n            $('<form></form>').append(inputClone)[0].reset();\n            // Detaching allows to insert the fileInput on another form\n            // without loosing the file input value:\n            input.after(inputClone).detach();\n            // Avoid memory leaks with the detached file input:\n            $.cleanData(input.unbind('remove'));\n            // Replace the original file input element in the fileInput\n            // elements set with the clone, which has been copied including\n            // event handlers:\n            this.options.fileInput = this.options.fileInput.map(function (i, el) {\n                if (el === input[0]) {\n                    return inputClone[0];\n                }\n                return el;\n            });\n            // If the widget has been initialized on the file input itself,\n            // override this.element with the file input clone:\n            if (input[0] === this.element[0]) {\n                this.element = inputClone;\n            }\n        },\n\n        _handleFileTreeEntry: function (entry, path) {\n            var that = this,\n                dfd = $.Deferred(),\n                errorHandler = function (e) {\n                    if (e && !e.entry) {\n                        e.entry = entry;\n                    }\n                    // Since $.when returns immediately if one\n                    // Deferred is rejected, we use resolve instead.\n                    // This allows valid files and invalid items\n                    // to be returned together in one set:\n                    dfd.resolve([e]);\n                },\n                successHandler = function (entries) {\n                    that._handleFileTreeEntries(\n                        entries,\n                        path + entry.name + '/'\n                    ).done(function (files) {\n                        dfd.resolve(files);\n                    }).fail(errorHandler);\n                },\n                readEntries = function () {\n                    dirReader.readEntries(function (results) {\n                        if (!results.length) {\n                            successHandler(entries);\n                        } else {\n                            entries = entries.concat(results);\n                            readEntries();\n                        }\n                    }, errorHandler);\n                },\n                dirReader, entries = [];\n            path = path || '';\n            if (entry.isFile) {\n                if (entry._file) {\n                    // Workaround for Chrome bug #149735\n                    entry._file.relativePath = path;\n                    dfd.resolve(entry._file);\n                } else {\n                    entry.file(function (file) {\n                        file.relativePath = path;\n                        dfd.resolve(file);\n                    }, errorHandler);\n                }\n            } else if (entry.isDirectory) {\n                dirReader = entry.createReader();\n                readEntries();\n            } else {\n                // Return an empy list for file system items\n                // other than files or directories:\n                dfd.resolve([]);\n            }\n            return dfd.promise();\n        },\n\n        _handleFileTreeEntries: function (entries, path) {\n            var that = this;\n            return $.when.apply(\n                $,\n                $.map(entries, function (entry) {\n                    return that._handleFileTreeEntry(entry, path);\n                })\n            ).pipe(function () {\n                return Array.prototype.concat.apply(\n                    [],\n                    arguments\n                );\n            });\n        },\n\n        _getDroppedFiles: function (dataTransfer) {\n            dataTransfer = dataTransfer || {};\n            var items = dataTransfer.items;\n            if (items && items.length && (items[0].webkitGetAsEntry ||\n                    items[0].getAsEntry)) {\n                return this._handleFileTreeEntries(\n                    $.map(items, function (item) {\n                        var entry;\n                        if (item.webkitGetAsEntry) {\n                            entry = item.webkitGetAsEntry();\n                            if (entry) {\n                                // Workaround for Chrome bug #149735:\n                                entry._file = item.getAsFile();\n                            }\n                            return entry;\n                        }\n                        return item.getAsEntry();\n                    })\n                );\n            }\n            return $.Deferred().resolve(\n                $.makeArray(dataTransfer.files)\n            ).promise();\n        },\n\n        _getSingleFileInputFiles: function (fileInput) {\n            fileInput = $(fileInput);\n            var entries = fileInput.prop('webkitEntries') ||\n                    fileInput.prop('entries'),\n                files,\n                value;\n            if (entries && entries.length) {\n                return this._handleFileTreeEntries(entries);\n            }\n            files = $.makeArray(fileInput.prop('files'));\n            if (!files.length) {\n                value = fileInput.prop('value');\n                if (!value) {\n                    return $.Deferred().resolve([]).promise();\n                }\n                // If the files property is not available, the browser does not\n                // support the File API and we add a pseudo File object with\n                // the input value as name with path information removed:\n                files = [{name: value.replace(/^.*\\\\/, '')}];\n            } else if (files[0].name === undefined && files[0].fileName) {\n                // File normalization for Safari 4 and Firefox 3:\n                $.each(files, function (index, file) {\n                    file.name = file.fileName;\n                    file.size = file.fileSize;\n                });\n            }\n            return $.Deferred().resolve(files).promise();\n        },\n\n        _getFileInputFiles: function (fileInput) {\n            if (!(fileInput instanceof $) || fileInput.length === 1) {\n                return this._getSingleFileInputFiles(fileInput);\n            }\n            return $.when.apply(\n                $,\n                $.map(fileInput, this._getSingleFileInputFiles)\n            ).pipe(function () {\n                return Array.prototype.concat.apply(\n                    [],\n                    arguments\n                );\n            });\n        },\n\n        _onChange: function (e) {\n            var that = this,\n                data = {\n                    fileInput: $(e.target),\n                    form: $(e.target.form)\n                };\n            this._getFileInputFiles(data.fileInput).always(function (files) {\n                data.files = files;\n                if (that.options.replaceFileInput) {\n                    that._replaceFileInput(data);\n                }\n                if (that._trigger(\n                        'change',\n                        $.Event('change', {delegatedEvent: e}),\n                        data\n                    ) !== false) {\n                    that._onAdd(e, data);\n                }\n            });\n        },\n\n        _onPaste: function (e) {\n            var items = e.originalEvent && e.originalEvent.clipboardData &&\n                    e.originalEvent.clipboardData.items,\n                data = {files: []};\n            if (items && items.length) {\n                $.each(items, function (index, item) {\n                    var file = item.getAsFile && item.getAsFile();\n                    if (file) {\n                        data.files.push(file);\n                    }\n                });\n                if (this._trigger(\n                        'paste',\n                        $.Event('paste', {delegatedEvent: e}),\n                        data\n                    ) !== false) {\n                    this._onAdd(e, data);\n                }\n            }\n        },\n\n        _onDrop: function (e) {\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n            var that = this,\n                dataTransfer = e.dataTransfer,\n                data = {};\n            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n                e.preventDefault();\n                this._getDroppedFiles(dataTransfer).always(function (files) {\n                    data.files = files;\n                    if (that._trigger(\n                            'drop',\n                            $.Event('drop', {delegatedEvent: e}),\n                            data\n                        ) !== false) {\n                        that._onAdd(e, data);\n                    }\n                });\n            }\n        },\n\n        _onDragOver: getDragHandler('dragover'),\n\n        _onDragEnter: getDragHandler('dragenter'),\n\n        _onDragLeave: getDragHandler('dragleave'),\n\n        _initEventHandlers: function () {\n            if (this._isXHRUpload(this.options)) {\n                this._on(this.options.dropZone, {\n                    dragover: this._onDragOver,\n                    drop: this._onDrop,\n                    // event.preventDefault() on dragenter is required for IE10+:\n                    dragenter: this._onDragEnter,\n                    // dragleave is not required, but added for completeness:\n                    dragleave: this._onDragLeave\n                });\n                this._on(this.options.pasteZone, {\n                    paste: this._onPaste\n                });\n            }\n            if ($.support.fileInput) {\n                this._on(this.options.fileInput, {\n                    change: this._onChange\n                });\n            }\n        },\n\n        _destroyEventHandlers: function () {\n            this._off(this.options.dropZone, 'dragenter dragleave dragover drop');\n            this._off(this.options.pasteZone, 'paste');\n            this._off(this.options.fileInput, 'change');\n        },\n\n        _setOption: function (key, value) {\n            var reinit = $.inArray(key, this._specialOptions) !== -1;\n            if (reinit) {\n                this._destroyEventHandlers();\n            }\n            this._super(key, value);\n            if (reinit) {\n                this._initSpecialOptions();\n                this._initEventHandlers();\n            }\n        },\n\n        _initSpecialOptions: function () {\n            var options = this.options;\n            if (options.fileInput === undefined) {\n                options.fileInput = this.element.is('input[type=\"file\"]') ?\n                        this.element : this.element.find('input[type=\"file\"]');\n            } else if (!(options.fileInput instanceof $)) {\n                options.fileInput = $(options.fileInput);\n            }\n            if (!(options.dropZone instanceof $)) {\n                options.dropZone = $(options.dropZone);\n            }\n            if (!(options.pasteZone instanceof $)) {\n                options.pasteZone = $(options.pasteZone);\n            }\n        },\n\n        _getRegExp: function (str) {\n            var parts = str.split('/'),\n                modifiers = parts.pop();\n            parts.shift();\n            return new RegExp(parts.join('/'), modifiers);\n        },\n\n        _isRegExpOption: function (key, value) {\n            return key !== 'url' && $.type(value) === 'string' &&\n                /^\\/.*\\/[igm]{0,3}$/.test(value);\n        },\n\n        _initDataAttributes: function () {\n            var that = this,\n                options = this.options,\n                data = this.element.data();\n            // Initialize options set via HTML5 data-attributes:\n            $.each(\n                this.element[0].attributes,\n                function (index, attr) {\n                    var key = attr.name.toLowerCase(),\n                        value;\n                    if (/^data-/.test(key)) {\n                        // Convert hyphen-ated key to camelCase:\n                        key = key.slice(5).replace(/-[a-z]/g, function (str) {\n                            return str.charAt(1).toUpperCase();\n                        });\n                        value = data[key];\n                        if (that._isRegExpOption(key, value)) {\n                            value = that._getRegExp(value);\n                        }\n                        options[key] = value;\n                    }\n                }\n            );\n        },\n\n        _create: function () {\n            this._initDataAttributes();\n            this._initSpecialOptions();\n            this._slots = [];\n            this._sequence = this._getXHRPromise(true);\n            this._sending = this._active = 0;\n            this._initProgressObject(this);\n            this._initEventHandlers();\n        },\n\n        // This method is exposed to the widget API and allows to query\n        // the number of active uploads:\n        active: function () {\n            return this._active;\n        },\n\n        // This method is exposed to the widget API and allows to query\n        // the widget upload progress.\n        // It returns an object with loaded, total and bitrate properties\n        // for the running uploads:\n        progress: function () {\n            return this._progress;\n        },\n\n        // This method is exposed to the widget API and allows adding files\n        // using the fileupload API. The data parameter accepts an object which\n        // must have a files property and can contain additional options:\n        // .fileupload('add', {files: filesList});\n        add: function (data) {\n            var that = this;\n            if (!data || this.options.disabled) {\n                return;\n            }\n            if (data.fileInput && !data.files) {\n                this._getFileInputFiles(data.fileInput).always(function (files) {\n                    data.files = files;\n                    that._onAdd(null, data);\n                });\n            } else {\n                data.files = $.makeArray(data.files);\n                this._onAdd(null, data);\n            }\n        },\n\n        // This method is exposed to the widget API and allows sending files\n        // using the fileupload API. The data parameter accepts an object which\n        // must have a files or fileInput property and can contain additional options:\n        // .fileupload('send', {files: filesList});\n        // The method returns a Promise object for the file upload call.\n        send: function (data) {\n            if (data && !this.options.disabled) {\n                if (data.fileInput && !data.files) {\n                    var that = this,\n                        dfd = $.Deferred(),\n                        promise = dfd.promise(),\n                        jqXHR,\n                        aborted;\n                    promise.abort = function () {\n                        aborted = true;\n                        if (jqXHR) {\n                            return jqXHR.abort();\n                        }\n                        dfd.reject(null, 'abort', 'abort');\n                        return promise;\n                    };\n                    this._getFileInputFiles(data.fileInput).always(\n                        function (files) {\n                            if (aborted) {\n                                return;\n                            }\n                            if (!files.length) {\n                                dfd.reject();\n                                return;\n                            }\n                            data.files = files;\n                            jqXHR = that._onSend(null, data);\n                            jqXHR.then(\n                                function (result, textStatus, jqXHR) {\n                                    dfd.resolve(result, textStatus, jqXHR);\n                                },\n                                function (jqXHR, textStatus, errorThrown) {\n                                    dfd.reject(jqXHR, textStatus, errorThrown);\n                                }\n                            );\n                        }\n                    );\n                    return this._enhancePromise(promise);\n                }\n                data.files = $.makeArray(data.files);\n                if (data.files.length) {\n                    return this._onSend(null, data);\n                }\n            }\n            return this._getXHRPromise(false, data && data.context);\n        }\n\n    });\n\n}));\n","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under the MIT license\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  'use strict';\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.6\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.6\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.6'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.6\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.6'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state += 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked')) changed = false\n        $parent.find('.active').removeClass('active')\n        this.$element.addClass('active')\n      } else if ($input.prop('type') == 'checkbox') {\n        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n        this.$element.toggleClass('active')\n      }\n      $input.prop('checked', this.$element.hasClass('active'))\n      if (changed) $input.trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n      this.$element.toggleClass('active')\n    }\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      Plugin.call($btn, 'toggle')\n      if (!($(e.target).is('input[type=\"radio\"]') || $(e.target).is('input[type=\"checkbox\"]'))) e.preventDefault()\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.6\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      = null\n    this.sliding     = null\n    this.interval    = null\n    this.$active     = null\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.6'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var activeIndex = this.getItemIndex(active)\n    var willWrap = (direction == 'prev' && activeIndex === 0)\n                || (direction == 'next' && activeIndex == (this.$items.length - 1))\n    if (willWrap && !this.options.wrap) return active\n    var delta = direction == 'prev' ? -1 : 1\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var that      = this\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.6\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n                           '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.6'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.6\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.6'\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n    })\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $(document.createElement('div'))\n          .addClass('dropdown-backdrop')\n          .insertAfter($(this))\n          .on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger($.Event('shown.bs.dropdown', relatedTarget))\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive && e.which != 27 || isActive && e.which == 27) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.disabled):visible a'\n    var $items = $parent.find('.dropdown-menu' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--         // up\n    if (e.which == 40 && index < $items.length - 1) index++         // down\n    if (!~index)                                    index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.6\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options             = options\n    this.$body               = $(document.body)\n    this.$element            = $(element)\n    this.$dialog             = this.$element.find('.modal-dialog')\n    this.$backdrop           = null\n    this.isShown             = null\n    this.originalBodyPad     = null\n    this.scrollbarWidth      = 0\n    this.ignoreBackdropClick = false\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.6'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n      that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n      })\n    })\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element.addClass('in')\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$dialog // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .off('click.dismiss.bs.modal')\n      .off('mouseup.dismiss.bs.modal')\n\n    this.$dialog.off('mousedown.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $(document.createElement('div'))\n        .addClass('modal-backdrop ' + animate)\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (this.ignoreBackdropClick) {\n          this.ignoreBackdropClick = false\n          return\n        }\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus()\n          : this.hide()\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    var fullWindowWidth = window.innerWidth\n    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n      var documentElementRect = document.documentElement.getBoundingClientRect()\n      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n    }\n    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    this.originalBodyPad = document.body.style.paddingRight || ''\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', this.originalBodyPad)\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.6\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       = null\n    this.options    = null\n    this.enabled    = null\n    this.timeout    = null\n    this.hoverState = null\n    this.$element   = null\n    this.inState    = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.6'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n    this.inState   = { click: false, hover: false, focus: false }\n\n    if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n    }\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n    }\n\n    if (self.tip().hasClass('in') || self.hoverState == 'in') {\n      self.hoverState = 'in'\n      return\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.isInStateTrue = function () {\n    for (var key in this.inState) {\n      if (this.inState[key]) return true\n    }\n\n    return false\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n    }\n\n    if (self.isInStateTrue()) return\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n      this.$element.trigger('inserted.bs.' + this.type)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var viewportDim = this.getPosition(this.$viewport)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  += marginTop\n    offset.left += marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n    this.arrow()\n      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isVertical ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = $(this.$tip)\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element\n        .removeAttr('aria-describedby')\n        .trigger('hidden.bs.' + that.type)\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && $tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    if (!this.$tip) {\n      this.$tip = $(this.options.template)\n      if (this.$tip.length != 1) {\n        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n      }\n    }\n    return this.$tip\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    if (e) {\n      self.inState.click = !self.inState.click\n      if (self.isInStateTrue()) self.enter(self)\n      else self.leave(self)\n    } else {\n      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n    }\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n      if (that.$tip) {\n        that.$tip.detach()\n      }\n      that.$tip = null\n      that.$arrow = null\n      that.$viewport = null\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.6\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.6'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.6\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    this.$body          = $(document.body)\n    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.6'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var that          = this\n    var offsetMethod  = 'offset'\n    var offsetBase    = 0\n\n    this.offsets      = []\n    this.targets      = []\n    this.scrollHeight = this.getScrollHeight()\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        that.offsets.push(this[0])\n        that.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n      '[data-target=\"' + target + '\"],' +\n      this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.6\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    // jscs:disable requireDollarBeforejQueryAssignment\n    this.element = $(element)\n    // jscs:enable requireDollarBeforejQueryAssignment\n  }\n\n  Tab.VERSION = '3.3.6'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu').length) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.6\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      = null\n    this.unpin        = null\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.6'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n",";(function () {\n\t'use strict';\n\n\t/**\n\t * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n\t *\n\t * @codingstandard ftlabs-jsv2\n\t * @copyright The Financial Times Limited [All Rights Reserved]\n\t * @license MIT License (see LICENSE.txt)\n\t */\n\n\t/*jslint browser:true, node:true*/\n\t/*global define, Event, Node*/\n\n\n\t/**\n\t * Instantiate fast-clicking listeners on the specified layer.\n\t *\n\t * @constructor\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tfunction FastClick(layer, options) {\n\t\tvar oldOnClick;\n\n\t\toptions = options || {};\n\n\t\t/**\n\t\t * Whether a click is currently being tracked.\n\t\t *\n\t\t * @type boolean\n\t\t */\n\t\tthis.trackingClick = false;\n\n\n\t\t/**\n\t\t * Timestamp for when click tracking started.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.trackingClickStart = 0;\n\n\n\t\t/**\n\t\t * The element being tracked for a click.\n\t\t *\n\t\t * @type EventTarget\n\t\t */\n\t\tthis.targetElement = null;\n\n\n\t\t/**\n\t\t * X-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartX = 0;\n\n\n\t\t/**\n\t\t * Y-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartY = 0;\n\n\n\t\t/**\n\t\t * ID of the last touch, retrieved from Touch.identifier.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.lastTouchIdentifier = 0;\n\n\n\t\t/**\n\t\t * Touchmove boundary, beyond which a click will be cancelled.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchBoundary = options.touchBoundary || 10;\n\n\n\t\t/**\n\t\t * The FastClick layer.\n\t\t *\n\t\t * @type Element\n\t\t */\n\t\tthis.layer = layer;\n\n\t\t/**\n\t\t * The minimum time between tap(touchstart and touchend) events\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapDelay = options.tapDelay || 200;\n\n\t\t/**\n\t\t * The maximum time for a tap\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapTimeout = options.tapTimeout || 700;\n\n\t\tif (FastClick.notNeeded(layer)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Some old versions of Android don't have Function.prototype.bind\n\t\tfunction bind(method, context) {\n\t\t\treturn function() { return method.apply(context, arguments); };\n\t\t}\n\n\n\t\tvar methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];\n\t\tvar context = this;\n\t\tfor (var i = 0, l = methods.length; i < l; i++) {\n\t\t\tcontext[methods[i]] = bind(context[methods[i]], context);\n\t\t}\n\n\t\t// Set up event handlers as required\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.addEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.addEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.addEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.addEventListener('click', this.onClick, true);\n\t\tlayer.addEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.addEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.addEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.addEventListener('touchcancel', this.onTouchCancel, false);\n\n\t\t// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick\n\t\t// layer when they are cancelled.\n\t\tif (!Event.prototype.stopImmediatePropagation) {\n\t\t\tlayer.removeEventListener = function(type, callback, capture) {\n\t\t\t\tvar rmv = Node.prototype.removeEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\trmv.call(layer, type, callback.hijacked || callback, capture);\n\t\t\t\t} else {\n\t\t\t\t\trmv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlayer.addEventListener = function(type, callback, capture) {\n\t\t\t\tvar adv = Node.prototype.addEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\tadv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {\n\t\t\t\t\t\tif (!event.propagationStopped) {\n\t\t\t\t\t\t\tcallback(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t}), capture);\n\t\t\t\t} else {\n\t\t\t\t\tadv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// If a handler is already declared in the element's onclick attribute, it will be fired before\n\t\t// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and\n\t\t// adding it as listener.\n\t\tif (typeof layer.onclick === 'function') {\n\n\t\t\t// Android browser on at least 3.2 requires a new reference to the function in layer.onclick\n\t\t\t// - the old one won't work if passed to addEventListener directly.\n\t\t\toldOnClick = layer.onclick;\n\t\t\tlayer.addEventListener('click', function(event) {\n\t\t\t\toldOnClick(event);\n\t\t\t}, false);\n\t\t\tlayer.onclick = null;\n\t\t}\n\t}\n\n\t/**\n\t* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.\n\t*\n\t* @type boolean\n\t*/\n\tvar deviceIsWindowsPhone = navigator.userAgent.indexOf(\"Windows Phone\") >= 0;\n\n\t/**\n\t * Android requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS 4 requires an exception for select elements.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS4 = deviceIsIOS && (/OS 4_\\d(_\\d)?/).test(navigator.userAgent);\n\n\n\t/**\n\t * iOS 6.0-7.* requires the target element to be manually derived\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\\d/).test(navigator.userAgent);\n\n\t/**\n\t * BlackBerry requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;\n\n\t/**\n\t * Determine whether a given element requires a native click.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element needs a native click\n\t */\n\tFastClick.prototype.needsClick = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\n\t\t// Don't send a synthetic click to disabled inputs (issue #62)\n\t\tcase 'button':\n\t\tcase 'select':\n\t\tcase 'textarea':\n\t\t\tif (target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'input':\n\n\t\t\t// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)\n\t\t\tif ((deviceIsIOS && target.type === 'file') || target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'label':\n\t\tcase 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames\n\t\tcase 'video':\n\t\t\treturn true;\n\t\t}\n\n\t\treturn (/\\bneedsclick\\b/).test(target.className);\n\t};\n\n\n\t/**\n\t * Determine whether a given element requires a call to focus to simulate click into element.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.\n\t */\n\tFastClick.prototype.needsFocus = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\t\tcase 'textarea':\n\t\t\treturn true;\n\t\tcase 'select':\n\t\t\treturn !deviceIsAndroid;\n\t\tcase 'input':\n\t\t\tswitch (target.type) {\n\t\t\tcase 'button':\n\t\t\tcase 'checkbox':\n\t\t\tcase 'file':\n\t\t\tcase 'image':\n\t\t\tcase 'radio':\n\t\t\tcase 'submit':\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// No point in attempting to focus disabled inputs\n\t\t\treturn !target.disabled && !target.readOnly;\n\t\tdefault:\n\t\t\treturn (/\\bneedsfocus\\b/).test(target.className);\n\t\t}\n\t};\n\n\n\t/**\n\t * Send a click event to the specified element.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t * @param {Event} event\n\t */\n\tFastClick.prototype.sendClick = function(targetElement, event) {\n\t\tvar clickEvent, touch;\n\n\t\t// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)\n\t\tif (document.activeElement && document.activeElement !== targetElement) {\n\t\t\tdocument.activeElement.blur();\n\t\t}\n\n\t\ttouch = event.changedTouches[0];\n\n\t\t// Synthesise a click event, with an extra attribute so it can be tracked\n\t\tclickEvent = document.createEvent('MouseEvents');\n\t\tclickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\n\t\tclickEvent.forwardedTouchEvent = true;\n\t\ttargetElement.dispatchEvent(clickEvent);\n\t};\n\n\tFastClick.prototype.determineEventType = function(targetElement) {\n\n\t\t//Issue #159: Android Chrome Select Box does not open with a synthetic click event\n\t\tif (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {\n\t\t\treturn 'mousedown';\n\t\t}\n\n\t\treturn 'click';\n\t};\n\n\n\t/**\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.focus = function(targetElement) {\n\t\tvar length;\n\n\t\t// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.\n\t\tif (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {\n\t\t\tlength = targetElement.value.length;\n\t\t\ttargetElement.setSelectionRange(length, length);\n\t\t} else {\n\t\t\ttargetElement.focus();\n\t\t}\n\t};\n\n\n\t/**\n\t * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.updateScrollParent = function(targetElement) {\n\t\tvar scrollParent, parentElement;\n\n\t\tscrollParent = targetElement.fastClickScrollParent;\n\n\t\t// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the\n\t\t// target element was moved to another parent.\n\t\tif (!scrollParent || !scrollParent.contains(targetElement)) {\n\t\t\tparentElement = targetElement;\n\t\t\tdo {\n\t\t\t\tif (parentElement.scrollHeight > parentElement.offsetHeight) {\n\t\t\t\t\tscrollParent = parentElement;\n\t\t\t\t\ttargetElement.fastClickScrollParent = parentElement;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tparentElement = parentElement.parentElement;\n\t\t\t} while (parentElement);\n\t\t}\n\n\t\t// Always update the scroll top tracker if possible.\n\t\tif (scrollParent) {\n\t\t\tscrollParent.fastClickLastScrollTop = scrollParent.scrollTop;\n\t\t}\n\t};\n\n\n\t/**\n\t * @param {EventTarget} targetElement\n\t * @returns {Element|EventTarget}\n\t */\n\tFastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {\n\n\t\t// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.\n\t\tif (eventTarget.nodeType === Node.TEXT_NODE) {\n\t\t\treturn eventTarget.parentNode;\n\t\t}\n\n\t\treturn eventTarget;\n\t};\n\n\n\t/**\n\t * On touch start, record the position and scroll offset.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchStart = function(event) {\n\t\tvar targetElement, touch, selection;\n\n\t\t// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).\n\t\tif (event.targetTouches.length > 1) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttargetElement = this.getTargetElementFromEventTarget(event.target);\n\t\ttouch = event.targetTouches[0];\n\n\t\tif (deviceIsIOS) {\n\n\t\t\t// Only trusted events will deselect text on iOS (issue #49)\n\t\t\tselection = window.getSelection();\n\t\t\tif (selection.rangeCount && !selection.isCollapsed) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!deviceIsIOS4) {\n\n\t\t\t\t// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):\n\t\t\t\t// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched\n\t\t\t\t// with the same identifier as the touch event that previously triggered the click that triggered the alert.\n\t\t\t\t// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an\n\t\t\t\t// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.\n\t\t\t\t// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,\n\t\t\t\t// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,\n\t\t\t\t// random integers, it's safe to to continue if the identifier is 0 here.\n\t\t\t\tif (touch.identifier && touch.identifier === this.lastTouchIdentifier) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.lastTouchIdentifier = touch.identifier;\n\n\t\t\t\t// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:\n\t\t\t\t// 1) the user does a fling scroll on the scrollable layer\n\t\t\t\t// 2) the user stops the fling scroll with another tap\n\t\t\t\t// then the event.target of the last 'touchend' event will be the element that was under the user's finger\n\t\t\t\t// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check\n\t\t\t\t// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).\n\t\t\t\tthis.updateScrollParent(targetElement);\n\t\t\t}\n\t\t}\n\n\t\tthis.trackingClick = true;\n\t\tthis.trackingClickStart = event.timeStamp;\n\t\tthis.targetElement = targetElement;\n\n\t\tthis.touchStartX = touch.pageX;\n\t\tthis.touchStartY = touch.pageY;\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.touchHasMoved = function(event) {\n\t\tvar touch = event.changedTouches[0], boundary = this.touchBoundary;\n\n\t\tif (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Update the last position.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchMove = function(event) {\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If the touch has moved, cancel the click tracking\n\t\tif (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {\n\t\t\tthis.trackingClick = false;\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Attempt to find the labelled control for the given label element.\n\t *\n\t * @param {EventTarget|HTMLLabelElement} labelElement\n\t * @returns {Element|null}\n\t */\n\tFastClick.prototype.findControl = function(labelElement) {\n\n\t\t// Fast path for newer browsers supporting the HTML5 control attribute\n\t\tif (labelElement.control !== undefined) {\n\t\t\treturn labelElement.control;\n\t\t}\n\n\t\t// All browsers under test that support touch events also support the HTML5 htmlFor attribute\n\t\tif (labelElement.htmlFor) {\n\t\t\treturn document.getElementById(labelElement.htmlFor);\n\t\t}\n\n\t\t// If no for attribute exists, attempt to retrieve the first labellable descendant element\n\t\t// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label\n\t\treturn labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');\n\t};\n\n\n\t/**\n\t * On touch end, determine whether to send a click event at once.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchEnd = function(event) {\n\t\tvar forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;\n\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tthis.cancelNextClick = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Reset to prevent wrong click cancel on input (issue #156).\n\t\tthis.cancelNextClick = false;\n\n\t\tthis.lastClickTime = event.timeStamp;\n\n\t\ttrackingClickStart = this.trackingClickStart;\n\t\tthis.trackingClick = false;\n\t\tthis.trackingClickStart = 0;\n\n\t\t// On some iOS devices, the targetElement supplied with the event is invalid if the layer\n\t\t// is performing a transition or scroll, and has to be re-detected manually. Note that\n\t\t// for this to function correctly, it must be called *after* the event target is checked!\n\t\t// See issue #57; also filed as rdar://13048589 .\n\t\tif (deviceIsIOSWithBadTarget) {\n\t\t\ttouch = event.changedTouches[0];\n\n\t\t\t// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null\n\t\t\ttargetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;\n\t\t\ttargetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;\n\t\t}\n\n\t\ttargetTagName = targetElement.tagName.toLowerCase();\n\t\tif (targetTagName === 'label') {\n\t\t\tforElement = this.findControl(targetElement);\n\t\t\tif (forElement) {\n\t\t\t\tthis.focus(targetElement);\n\t\t\t\tif (deviceIsAndroid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\ttargetElement = forElement;\n\t\t\t}\n\t\t} else if (this.needsFocus(targetElement)) {\n\n\t\t\t// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.\n\t\t\t// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).\n\t\t\tif ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.focus(targetElement);\n\t\t\tthis.sendClick(targetElement, event);\n\n\t\t\t// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.\n\t\t\t// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)\n\t\t\tif (!deviceIsIOS || targetTagName !== 'select') {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif (deviceIsIOS && !deviceIsIOS4) {\n\n\t\t\t// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled\n\t\t\t// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).\n\t\t\tscrollParent = targetElement.fastClickScrollParent;\n\t\t\tif (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Prevent the actual click from going though - unless the target node is marked as requiring\n\t\t// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.\n\t\tif (!this.needsClick(targetElement)) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.sendClick(targetElement, event);\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * On touch cancel, stop tracking the click.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.onTouchCancel = function() {\n\t\tthis.trackingClick = false;\n\t\tthis.targetElement = null;\n\t};\n\n\n\t/**\n\t * Determine mouse events which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onMouse = function(event) {\n\n\t\t// If a target element was never set (because a touch event was never fired) allow the event\n\t\tif (!this.targetElement) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (event.forwardedTouchEvent) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Programmatically generated events targeting a specific element should be permitted\n\t\tif (!event.cancelable) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Derive and check the target element to see whether the mouse event needs to be permitted;\n\t\t// unless explicitly enabled, prevent non-touch click events from triggering actions,\n\t\t// to prevent ghost/doubleclicks.\n\t\tif (!this.needsClick(this.targetElement) || this.cancelNextClick) {\n\n\t\t\t// Prevent any user-added listeners declared on FastClick element from being fired.\n\t\t\tif (event.stopImmediatePropagation) {\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t} else {\n\n\t\t\t\t// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t\t\tevent.propagationStopped = true;\n\t\t\t}\n\n\t\t\t// Cancel the event\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the mouse event is permitted, return true for the action to go through.\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * On actual clicks, determine whether this is a touch-generated click, a click action occurring\n\t * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or\n\t * an actual click which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onClick = function(event) {\n\t\tvar permitted;\n\n\t\t// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.\n\t\tif (this.trackingClick) {\n\t\t\tthis.targetElement = null;\n\t\t\tthis.trackingClick = false;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.\n\t\tif (event.target.type === 'submit' && event.detail === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tpermitted = this.onMouse(event);\n\n\t\t// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.\n\t\tif (!permitted) {\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\t// If clicks are permitted, return true for the action to go through.\n\t\treturn permitted;\n\t};\n\n\n\t/**\n\t * Remove all FastClick's event listeners.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.destroy = function() {\n\t\tvar layer = this.layer;\n\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.removeEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.removeEventListener('click', this.onClick, true);\n\t\tlayer.removeEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.removeEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.removeEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.removeEventListener('touchcancel', this.onTouchCancel, false);\n\t};\n\n\n\t/**\n\t * Check whether FastClick is needed.\n\t *\n\t * @param {Element} layer The layer to listen on\n\t */\n\tFastClick.notNeeded = function(layer) {\n\t\tvar metaViewport;\n\t\tvar chromeVersion;\n\t\tvar blackberryVersion;\n\t\tvar firefoxVersion;\n\n\t\t// Devices that don't support touch don't need FastClick\n\t\tif (typeof window.ontouchstart === 'undefined') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Chrome version - zero for other browsers\n\t\tchromeVersion = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (chromeVersion) {\n\n\t\t\tif (deviceIsAndroid) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// Chrome on Android with user-scalable=\"no\" doesn't need FastClick (issue #89)\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// Chrome 32 and above with width=device-width or less don't need FastClick\n\t\t\t\t\tif (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Chrome desktop doesn't need FastClick (issue #15)\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (deviceIsBlackBerry10) {\n\t\t\tblackberryVersion = navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/);\n\n\t\t\t// BlackBerry 10.3+ does not require Fastclick library.\n\t\t\t// https://github.com/ftlabs/fastclick/issues/251\n\t\t\tif (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// user-scalable=no eliminates click delay.\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// width=device-width (or less than device-width) eliminates click delay.\n\t\t\t\t\tif (document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)\n\t\tif (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Firefox version - zero for other browsers\n\t\tfirefoxVersion = +(/Firefox\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (firefoxVersion >= 27) {\n\t\t\t// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896\n\n\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\t\t\tif (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version\n\t\t// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx\n\t\tif (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Factory method for creating a FastClick object\n\t *\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tFastClick.attach = function(layer, options) {\n\t\treturn new FastClick(layer, options);\n\t};\n\n\n\tif (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine(function() {\n\t\t\treturn FastClick;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = FastClick.attach;\n\t\tmodule.exports.FastClick = FastClick;\n\t} else {\n\t\twindow.FastClick = FastClick;\n\t}\n}());\n","/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.3\n *\n */\n(function ($) {\n\n  $.fn.extend({\n    slimScroll: function (options) {\n\n      var defaults = {\n        // width in pixels of the visible scroll area\n        width: 'auto',\n        // height in pixels of the visible scroll area\n        height: '250px',\n        // width in pixels of the scrollbar and rail\n        size: '7px',\n        // scrollbar color, accepts any hex/color value\n        color: '#000',\n        // scrollbar position - left/right\n        position: 'right',\n        // distance in pixels between the side edge and the scrollbar\n        distance: '1px',\n        // default scroll position on load - top / bottom / $('selector')\n        start: 'top',\n        // sets scrollbar opacity\n        opacity: .4,\n        // enables always-on mode for the scrollbar\n        alwaysVisible: false,\n        // check if we should hide the scrollbar when user is hovering over\n        disableFadeOut: false,\n        // sets visibility of the rail\n        railVisible: false,\n        // sets rail color\n        railColor: '#333',\n        // sets rail opacity\n        railOpacity: .2,\n        // whether  we should use jQuery UI Draggable to enable bar dragging\n        railDraggable: true,\n        // defautlt CSS class of the slimscroll rail\n        railClass: 'slimScrollRail',\n        // defautlt CSS class of the slimscroll bar\n        barClass: 'slimScrollBar',\n        // defautlt CSS class of the slimscroll wrapper\n        wrapperClass: 'slimScrollDiv',\n        // check if mousewheel should scroll the window if we reach top/bottom\n        allowPageScroll: false,\n        // scroll amount applied to each mouse wheel step\n        wheelStep: 20,\n        // scroll amount applied when user is using gestures\n        touchScrollStep: 200,\n        // sets border radius\n        borderRadius: '7px',\n        // sets border radius of the rail\n        railBorderRadius: '7px'\n      };\n\n      var o = $.extend(defaults, options);\n\n      // do it for every element that matches selector\n      this.each(function () {\n\n        var isOverPanel, isOverBar, isDragg, queueHide, touchDif,\n                barHeight, percentScroll, lastScroll,\n                divS = '<div></div>',\n                minBarHeight = 30,\n                releaseScroll = false;\n\n        // used in event handlers and for better minification\n        var me = $(this);\n\n        // ensure we are not binding it again\n        if (me.parent().hasClass(o.wrapperClass))\n        {\n          // start from last bar position\n          var offset = me.scrollTop();\n\n          // find bar and rail\n          bar = me.parent().find('.' + o.barClass);\n          rail = me.parent().find('.' + o.railClass);\n\n          getBarHeight();\n\n          // check if we should scroll existing instance\n          if ($.isPlainObject(options))\n          {\n            // Pass height: auto to an existing slimscroll object to force a resize after contents have changed\n            if ('height' in options && options.height == 'auto') {\n              me.parent().css('height', 'auto');\n              me.css('height', 'auto');\n              var height = me.parent().parent().height();\n              me.parent().css('height', height);\n              me.css('height', height);\n            }\n\n            if ('scrollTo' in options)\n            {\n              // jump to a static point\n              offset = parseInt(o.scrollTo);\n            }\n            else if ('scrollBy' in options)\n            {\n              // jump by value pixels\n              offset += parseInt(o.scrollBy);\n            }\n            else if ('destroy' in options)\n            {\n              // remove slimscroll elements\n              bar.remove();\n              rail.remove();\n              me.unwrap();\n              return;\n            }\n\n            // scroll content by the given offset\n            scrollContent(offset, false, true);\n          }\n\n          return;\n        }\n        else if ($.isPlainObject(options))\n        {\n          if ('destroy' in options)\n          {\n            return;\n          }\n        }\n\n        // optionally set height to the parent's height\n        o.height = (o.height == 'auto') ? me.parent().height() : o.height;\n\n        // wrap content\n        var wrapper = $(divS)\n                .addClass(o.wrapperClass)\n                .css({\n                  position: 'relative',\n                  overflow: 'hidden',\n                  width: o.width,\n                  height: o.height\n                });\n\n        // update style for the div\n        me.css({\n          overflow: 'hidden',\n          width: o.width,\n          height: o.height,\n          //Fix for IE10\n          \"-ms-touch-action\": \"none\"\n        });\n\n        // create scrollbar rail\n        var rail = $(divS)\n                .addClass(o.railClass)\n                .css({\n                  width: o.size,\n                  height: '100%',\n                  position: 'absolute',\n                  top: 0,\n                  display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',\n                  'border-radius': o.railBorderRadius,\n                  background: o.railColor,\n                  opacity: o.railOpacity,\n                  zIndex: 90\n                });\n\n        // create scrollbar\n        var bar = $(divS)\n                .addClass(o.barClass)\n                .css({\n                  background: o.color,\n                  width: o.size,\n                  position: 'absolute',\n                  top: 0,\n                  opacity: o.opacity,\n                  display: o.alwaysVisible ? 'block' : 'none',\n                  'border-radius': o.borderRadius,\n                  BorderRadius: o.borderRadius,\n                  MozBorderRadius: o.borderRadius,\n                  WebkitBorderRadius: o.borderRadius,\n                  zIndex: 99\n                });\n\n        // set position\n        var posCss = (o.position == 'right') ? {right: o.distance} : {left: o.distance};\n        rail.css(posCss);\n        bar.css(posCss);\n\n        // wrap it\n        me.wrap(wrapper);\n\n        // append to parent div\n        me.parent().append(bar);\n        me.parent().append(rail);\n\n        // make it draggable and no longer dependent on the jqueryUI\n        if (o.railDraggable) {\n          bar.bind(\"mousedown\", function (e) {\n            var $doc = $(document);\n            isDragg = true;\n            t = parseFloat(bar.css('top'));\n            pageY = e.pageY;\n\n            $doc.bind(\"mousemove.slimscroll\", function (e) {\n              currTop = t + e.pageY - pageY;\n              bar.css('top', currTop);\n              scrollContent(0, bar.position().top, false);// scroll content\n            });\n\n            $doc.bind(\"mouseup.slimscroll\", function (e) {\n              isDragg = false;\n              hideBar();\n              $doc.unbind('.slimscroll');\n            });\n            return false;\n          }).bind(\"selectstart.slimscroll\", function (e) {\n            e.stopPropagation();\n            e.preventDefault();\n            return false;\n          });\n        }\n\n        // on rail over\n        rail.hover(function () {\n          showBar();\n        }, function () {\n          hideBar();\n        });\n\n        // on bar over\n        bar.hover(function () {\n          isOverBar = true;\n        }, function () {\n          isOverBar = false;\n        });\n\n        // show on parent mouseover\n        me.hover(function () {\n          isOverPanel = true;\n          showBar();\n          hideBar();\n        }, function () {\n          isOverPanel = false;\n          hideBar();\n        });\n\n        if (window.navigator.msPointerEnabled) {          \n          // support for mobile\n          me.bind('MSPointerDown', function (e, b) {\n            if (e.originalEvent.targetTouches.length)\n            {\n              // record where touch started\n              touchDif = e.originalEvent.targetTouches[0].pageY;\n            }\n          });\n\n          me.bind('MSPointerMove', function (e) {\n            // prevent scrolling the page if necessary\n            e.originalEvent.preventDefault();\n            if (e.originalEvent.targetTouches.length)\n            {\n              // see how far user swiped\n              var diff = (touchDif - e.originalEvent.targetTouches[0].pageY) / o.touchScrollStep;\n              // scroll content\n              scrollContent(diff, true);\n              touchDif = e.originalEvent.targetTouches[0].pageY;\n              \n            }\n          });\n        } else {\n          // support for mobile\n          me.bind('touchstart', function (e, b) {\n            if (e.originalEvent.touches.length)\n            {\n              // record where touch started\n              touchDif = e.originalEvent.touches[0].pageY;\n            }\n          });\n\n          me.bind('touchmove', function (e) {\n            // prevent scrolling the page if necessary\n            if (!releaseScroll)\n            {\n              e.originalEvent.preventDefault();\n            }\n            if (e.originalEvent.touches.length)\n            {\n              // see how far user swiped\n              var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;\n              // scroll content\n              scrollContent(diff, true);\n              touchDif = e.originalEvent.touches[0].pageY;\n            }\n          });\n        }\n\n        // set up initial height\n        getBarHeight();\n\n        // check start position\n        if (o.start === 'bottom')\n        {\n          // scroll content to bottom\n          bar.css({top: me.outerHeight() - bar.outerHeight()});\n          scrollContent(0, true);\n        }\n        else if (o.start !== 'top')\n        {\n          // assume jQuery selector\n          scrollContent($(o.start).position().top, null, true);\n\n          // make sure bar stays hidden\n          if (!o.alwaysVisible) {\n            bar.hide();\n          }\n        }\n\n        // attach scroll events\n        attachWheel();\n\n        function _onWheel(e)\n        {\n          // use mouse wheel only when mouse is over\n          if (!isOverPanel) {\n            return;\n          }\n\n          var e = e || window.event;\n\n          var delta = 0;\n          if (e.wheelDelta) {\n            delta = -e.wheelDelta / 120;\n          }\n          if (e.detail) {\n            delta = e.detail / 3;\n          }\n\n          var target = e.target || e.srcTarget || e.srcElement;\n          if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {\n            // scroll content\n            scrollContent(delta, true);\n          }\n\n          // stop window scroll\n          if (e.preventDefault && !releaseScroll) {\n            e.preventDefault();\n          }\n          if (!releaseScroll) {\n            e.returnValue = false;\n          }\n        }\n\n        function scrollContent(y, isWheel, isJump)\n        {\n          releaseScroll = false;\n          var delta = y;\n          var maxTop = me.outerHeight() - bar.outerHeight();\n\n          if (isWheel)\n          {\n            // move bar with mouse wheel\n            delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();\n\n            // move bar, make sure it doesn't go out\n            delta = Math.min(Math.max(delta, 0), maxTop);\n\n            // if scrolling down, make sure a fractional change to the\n            // scroll position isn't rounded away when the scrollbar's CSS is set\n            // this flooring of delta would happened automatically when\n            // bar.css is set below, but we floor here for clarity\n            delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);\n\n            // scroll the scrollbar\n            bar.css({top: delta + 'px'});\n          }\n\n          // calculate actual scroll amount\n          percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());\n          delta = percentScroll * (me[0].scrollHeight - me.outerHeight());\n\n          if (isJump)\n          {\n            delta = y;\n            var offsetTop = delta / me[0].scrollHeight * me.outerHeight();\n            offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);\n            bar.css({top: offsetTop + 'px'});\n          }\n\n          // scroll content\n          me.scrollTop(delta);\n\n          // fire scrolling event\n          me.trigger('slimscrolling', ~~delta);\n\n          // ensure bar is visible\n          showBar();\n\n          // trigger hide when scroll is stopped\n          hideBar();\n        }\n\n        function attachWheel()\n        {\n          if (window.addEventListener)\n          {\n            this.addEventListener('DOMMouseScroll', _onWheel, false);\n            this.addEventListener('mousewheel', _onWheel, false);\n          }\n          else\n          {\n            document.attachEvent(\"onmousewheel\", _onWheel)\n          }\n        }\n\n        function getBarHeight()\n        {\n          // calculate scrollbar height and make sure it is not too small\n          barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);\n          bar.css({height: barHeight + 'px'});\n\n          // hide scrollbar if content is not long enough\n          var display = barHeight == me.outerHeight() ? 'none' : 'block';\n          bar.css({display: display});\n        }\n\n        function showBar()\n        {\n          // recalculate bar height\n          getBarHeight();\n          clearTimeout(queueHide);\n\n          // when bar reached top or bottom\n          if (percentScroll == ~~percentScroll)\n          {\n            //release wheel\n            releaseScroll = o.allowPageScroll;\n\n            // publish approporiate event\n            if (lastScroll != percentScroll)\n            {\n              var msg = (~~percentScroll == 0) ? 'top' : 'bottom';\n              me.trigger('slimscroll', msg);\n            }\n          }\n          else\n          {\n            releaseScroll = false;\n          }\n          lastScroll = percentScroll;\n\n          // show only when required\n          if (barHeight >= me.outerHeight()) {\n            //allow window scroll\n            releaseScroll = true;\n            return;\n          }\n          bar.stop(true, true).fadeIn('fast');\n          if (o.railVisible) {\n            rail.stop(true, true).fadeIn('fast');\n          }\n        }\n\n        function hideBar()\n        {\n          // only hide when options allow it\n          if (!o.alwaysVisible)\n          {\n            queueHide = setTimeout(function () {\n              if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)\n              {\n                bar.fadeOut('slow');\n                rail.fadeOut('slow');\n              }\n            }, 1000);\n          }\n        }\n\n      });\n\n      // maintain chainability\n      return this;\n    }\n  });\n\n  $.fn.extend({\n    slimscroll: $.fn.slimScroll\n  });\n\n})(jQuery);\n","/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){\"function\"==typeof define&&define.amd?define([\"jquery\"],a):a(\"object\"==typeof exports?require(\"jquery\"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split(\"/\"),o=s.map,p=o&&o[\"*\"]||{};if(a&&\".\"===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split(\"/\"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,\"\")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],\".\"===m)a.splice(k,1),k-=1;else if(\"..\"===m){if(1===k&&(\"..\"===a[2]||\"..\"===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join(\"/\")}else 0===a.indexOf(\"./\")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split(\"/\"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join(\"/\"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join(\"/\")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join(\"/\"))}return a}function g(a,c){return function(){return n.apply(b,v.call(arguments,0).concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error(\"No \"+a);return q[a]}function k(a){var b,c=a?a.indexOf(\"!\"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+\"!\"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return\"undefined\"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:\"\",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,\"undefined\"===v||\"function\"===v){for(c=!c.length&&d.length?[\"require\",\"exports\",\"module\"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,\"require\"===k)u[n]=p.require(a);else if(\"exports\"===k)u[n]=p.exports(a),s=!0;else if(\"module\"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+\" missing \"+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if(\"string\"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},\"function\"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define(\"almond\",function(){}),b.define(\"jquery\",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error(\"Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page.\"),b}),b.define(\"select2/utils\",[\"jquery\"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];\"function\"==typeof e&&\"constructor\"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice;this.listeners=this.listeners||{},a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),\"*\"in this.listeners&&this.invoke(this.listeners[\"*\"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b=\"\",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split(\"-\"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||\"hidden\"!==f&&\"visible\"!==f?\"scroll\"===e||\"scroll\"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={\"\\\\\":\"&#92;\",\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"/\":\"&#47;\"};return\"string\"!=typeof a?a:String(a).replace(/[&<>\"'\\/\\\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if(\"1.7\"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define(\"select2/results\",[\"jquery\",\"./utils\"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class=\"select2-results__options\" role=\"tree\"></ul>');return this.options.get(\"multiple\")&&b.attr(\"aria-multiselectable\",\"true\"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get(\"escapeMarkup\");this.clear(),this.hideLoading();var d=a('<li role=\"treeitem\" class=\"select2-results__option\"></li>'),e=this.options.get(\"translations\").get(b.message);d.append(c(e(b.args))),this.$results.append(d)},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger(\"results:message\",{message:\"noResults\"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(\".select2-results\");c.append(a)},c.prototype.sort=function(a){var b=this.options.get(\"sorter\");return b(a)},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(\".select2-results__option[aria-selected]\");e.each(function(){var b=a(this),c=a.data(this,\"data\"),e=\"\"+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr(\"aria-selected\",\"true\"):b.attr(\"aria-selected\",\"false\")});var f=e.filter(\"[aria-selected=true]\");f.length>0?f.first().trigger(\"mouseenter\"):e.first().trigger(\"mouseenter\")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get(\"translations\").get(\"searching\"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=\" loading-results\",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(\".loading-results\").remove()},c.prototype.option=function(b){var c=document.createElement(\"li\");c.className=\"select2-results__option\";var d={role:\"treeitem\",\"aria-selected\":\"false\"};b.disabled&&(delete d[\"aria-selected\"],d[\"aria-disabled\"]=\"true\"),null==b.id&&delete d[\"aria-selected\"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role=\"group\",d[\"aria-label\"]=b.text,delete d[\"aria-selected\"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement(\"strong\");h.className=\"select2-results__group\";{a(h)}this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a(\"<ul></ul>\",{\"class\":\"select2-results__options select2-results__options--nested\"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,\"data\",b),c},c.prototype.bind=function(b){var c=this,d=b.id+\"-results\";this.$results.attr(\"id\",d),b.on(\"results:all\",function(a){c.clear(),c.append(a.data),b.isOpen()&&c.setClasses()}),b.on(\"results:append\",function(a){c.append(a.data),b.isOpen()&&c.setClasses()}),b.on(\"query\",function(a){c.showLoading(a)}),b.on(\"select\",function(){b.isOpen()&&c.setClasses()}),b.on(\"unselect\",function(){b.isOpen()&&c.setClasses()}),b.on(\"open\",function(){c.$results.attr(\"aria-expanded\",\"true\"),c.$results.attr(\"aria-hidden\",\"false\"),c.setClasses(),c.ensureHighlightVisible()}),b.on(\"close\",function(){c.$results.attr(\"aria-expanded\",\"false\"),c.$results.attr(\"aria-hidden\",\"true\"),c.$results.removeAttr(\"aria-activedescendant\")}),b.on(\"results:toggle\",function(){var a=c.getHighlightedResults();0!==a.length&&a.trigger(\"mouseup\")}),b.on(\"results:select\",function(){var a=c.getHighlightedResults();if(0!==a.length){var b=a.data(\"data\");\"true\"==a.attr(\"aria-selected\")?c.trigger(\"close\"):c.trigger(\"select\",{data:b})}}),b.on(\"results:previous\",function(){var a=c.getHighlightedResults(),b=c.$results.find(\"[aria-selected]\"),d=b.index(a);if(0!==d){var e=d-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger(\"mouseenter\");var g=c.$results.offset().top,h=f.offset().top,i=c.$results.scrollTop()+(h-g);0===e?c.$results.scrollTop(0):0>h-g&&c.$results.scrollTop(i)}}),b.on(\"results:next\",function(){var a=c.getHighlightedResults(),b=c.$results.find(\"[aria-selected]\"),d=b.index(a),e=d+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger(\"mouseenter\");var g=c.$results.offset().top+c.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=c.$results.scrollTop()+h-g;0===e?c.$results.scrollTop(0):h>g&&c.$results.scrollTop(i)}}),b.on(\"results:focus\",function(a){a.element.addClass(\"select2-results__option--highlighted\")}),b.on(\"results:message\",function(a){c.displayMessage(a)}),a.fn.mousewheel&&this.$results.on(\"mousewheel\",function(a){var b=c.$results.scrollTop(),d=c.$results.get(0).scrollHeight-c.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&d<=c.$results.height();e?(c.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(c.$results.scrollTop(c.$results.get(0).scrollHeight-c.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on(\"mouseup\",\".select2-results__option[aria-selected]\",function(b){var d=a(this),e=d.data(\"data\");return\"true\"===d.attr(\"aria-selected\")?void(c.options.get(\"multiple\")?c.trigger(\"unselect\",{originalEvent:b,data:e}):c.trigger(\"close\")):void c.trigger(\"select\",{originalEvent:b,data:e})}),this.$results.on(\"mouseenter\",\".select2-results__option[aria-selected]\",function(){var b=a(this).data(\"data\");c.getHighlightedResults().removeClass(\"select2-results__option--highlighted\"),c.trigger(\"results:focus\",{data:b,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(\".select2-results__option--highlighted\");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find(\"[aria-selected]\"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get(\"templateResult\"),e=this.options.get(\"escapeMarkup\"),f=d(b);null==f?c.style.display=\"none\":\"string\"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define(\"select2/keys\",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define(\"select2/selection/base\",[\"jquery\",\"../utils\",\"../keys\"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class=\"select2-selection\" role=\"combobox\" aria-autocomplete=\"list\" aria-haspopup=\"true\" aria-expanded=\"false\"></span>');return this._tabindex=0,null!=this.$element.data(\"old-tabindex\")?this._tabindex=this.$element.data(\"old-tabindex\"):null!=this.$element.attr(\"tabindex\")&&(this._tabindex=this.$element.attr(\"tabindex\")),b.attr(\"title\",this.$element.attr(\"title\")),b.attr(\"tabindex\",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a){var b=this,d=(a.id+\"-container\",a.id+\"-results\");this.container=a,this.$selection.on(\"focus\",function(a){b.trigger(\"focus\",a)}),this.$selection.on(\"blur\",function(a){b.trigger(\"blur\",a)}),this.$selection.on(\"keydown\",function(a){b.trigger(\"keypress\",a),a.which===c.SPACE&&a.preventDefault()}),a.on(\"results:focus\",function(a){b.$selection.attr(\"aria-activedescendant\",a.data._resultId)}),a.on(\"selection:update\",function(a){b.update(a.data)}),a.on(\"open\",function(){b.$selection.attr(\"aria-expanded\",\"true\"),b.$selection.attr(\"aria-owns\",d),b._attachCloseHandler(a)}),a.on(\"close\",function(){b.$selection.attr(\"aria-expanded\",\"false\"),b.$selection.removeAttr(\"aria-activedescendant\"),b.$selection.removeAttr(\"aria-owns\"),b.$selection.focus(),b._detachCloseHandler(a)}),a.on(\"enable\",function(){b.$selection.attr(\"tabindex\",b._tabindex)}),a.on(\"disable\",function(){b.$selection.attr(\"tabindex\",\"-1\")})},d.prototype._attachCloseHandler=function(b){a(document.body).on(\"mousedown.select2.\"+b.id,function(b){var c=a(b.target),d=c.closest(\".select2\"),e=a(\".select2.select2-container--open\");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data(\"element\");c.select2(\"close\")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off(\"mousedown.select2.\"+b.id)},d.prototype.position=function(a,b){var c=b.find(\".selection\");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(){throw new Error(\"The `update` method must be defined in child classes.\")},d}),b.define(\"select2/selection/single\",[\"jquery\",\"./base\",\"../utils\",\"../keys\"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass(\"select2-selection--single\"),a.html('<span class=\"select2-selection__rendered\"></span><span class=\"select2-selection__arrow\" role=\"presentation\"><b role=\"presentation\"></b></span>'),a},d.prototype.bind=function(a){var b=this;d.__super__.bind.apply(this,arguments);var c=a.id+\"-container\";this.$selection.find(\".select2-selection__rendered\").attr(\"id\",c),this.$selection.attr(\"aria-labelledby\",c),this.$selection.on(\"mousedown\",function(a){1===a.which&&b.trigger(\"toggle\",{originalEvent:a})}),this.$selection.on(\"focus\",function(){}),this.$selection.on(\"blur\",function(){}),a.on(\"selection:update\",function(a){b.update(a.data)})},d.prototype.clear=function(){this.$selection.find(\".select2-selection__rendered\").empty()},d.prototype.display=function(a){var b=this.options.get(\"templateSelection\"),c=this.options.get(\"escapeMarkup\");return c(b(a))},d.prototype.selectionContainer=function(){return a(\"<span></span>\")},d.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.display(b),d=this.$selection.find(\".select2-selection__rendered\");d.empty().append(c),d.prop(\"title\",b.title||b.text)},d}),b.define(\"select2/selection/multiple\",[\"jquery\",\"./base\",\"../utils\"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass(\"select2-selection--multiple\"),a.html('<ul class=\"select2-selection__rendered\"></ul>'),a},d.prototype.bind=function(){var b=this;d.__super__.bind.apply(this,arguments),this.$selection.on(\"click\",function(a){b.trigger(\"toggle\",{originalEvent:a})}),this.$selection.on(\"click\",\".select2-selection__choice__remove\",function(c){var d=a(this),e=d.parent(),f=e.data(\"data\");b.trigger(\"unselect\",{originalEvent:c,data:f})})},d.prototype.clear=function(){this.$selection.find(\".select2-selection__rendered\").empty()},d.prototype.display=function(a){var b=this.options.get(\"templateSelection\"),c=this.options.get(\"escapeMarkup\");return c(b(a))},d.prototype.selectionContainer=function(){var b=a('<li class=\"select2-selection__choice\"><span class=\"select2-selection__choice__remove\" role=\"presentation\">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.display(e),g=this.selectionContainer();g.append(f),g.prop(\"title\",e.title||e.text),g.data(\"data\",e),b.push(g)}var h=this.$selection.find(\".select2-selection__rendered\");c.appendMany(h,b)}},d}),b.define(\"select2/selection/placeholder\",[\"../utils\"],function(){function a(a,b,c){this.placeholder=this.normalizePlaceholder(c.get(\"placeholder\")),a.call(this,b,c)}return a.prototype.normalizePlaceholder=function(a,b){return\"string\"==typeof b&&(b={id:\"\",text:b}),b},a.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass(\"select2-selection__placeholder\").removeClass(\"select2-selection__choice\"),c},a.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(\".select2-selection__rendered\").append(e)},a}),b.define(\"select2/selection/allowClear\",[\"jquery\",\"../keys\"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get(\"debug\")&&window.console&&console.error&&console.error(\"Select2: The `allowClear` option should be used in combination with the `placeholder` option.\"),this.$selection.on(\"mousedown\",\".select2-selection__clear\",function(a){d._handleClear(a)}),b.on(\"keypress\",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get(\"disabled\")){var c=this.$selection.find(\".select2-selection__clear\");if(0!==c.length){b.stopPropagation();for(var d=c.data(\"data\"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger(\"unselect\",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger(\"change\"),this.trigger(\"toggle\")}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(\".select2-selection__placeholder\").length>0||0===c.length)){var d=a('<span class=\"select2-selection__clear\">&times;</span>');d.data(\"data\",c),this.$selection.find(\".select2-selection__rendered\").prepend(d)}},c}),b.define(\"select2/selection/search\",[\"jquery\",\"../utils\",\"../keys\"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class=\"select2-search select2-search--inline\"><input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"textbox\" /></li>');this.$searchContainer=c,this.$search=c.find(\"input\");var d=b.call(this);return d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on(\"open\",function(){e.$search.attr(\"tabindex\",0),e.$search.focus()}),b.on(\"close\",function(){e.$search.attr(\"tabindex\",-1),e.$search.val(\"\"),e.$search.focus()}),b.on(\"enable\",function(){e.$search.prop(\"disabled\",!1)}),b.on(\"disable\",function(){e.$search.prop(\"disabled\",!0)}),this.$selection.on(\"focusin\",\".select2-search--inline\",function(a){e.trigger(\"focus\",a)}),this.$selection.on(\"focusout\",\".select2-search--inline\",function(a){e.trigger(\"blur\",a)}),this.$selection.on(\"keydown\",\".select2-search--inline\",function(a){a.stopPropagation(),e.trigger(\"keypress\",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&\"\"===e.$search.val()){var d=e.$searchContainer.prev(\".select2-selection__choice\");if(d.length>0){var f=d.data(\"data\");e.searchRemoveChoice(f),a.preventDefault()}}}),this.$selection.on(\"input\",\".select2-search--inline\",function(){e.$selection.off(\"keyup.search\")}),this.$selection.on(\"keyup.search input\",\".select2-search--inline\",function(a){e.handleSearch(a)})},d.prototype.createPlaceholder=function(a,b){this.$search.attr(\"placeholder\",b.text)},d.prototype.update=function(a,b){this.$search.attr(\"placeholder\",\"\"),a.call(this,b),this.$selection.find(\".select2-selection__rendered\").append(this.$searchContainer),this.resizeSearch()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger(\"query\",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger(\"unselect\",{data:b}),this.trigger(\"open\"),this.$search.val(b.text+\" \")},d.prototype.resizeSearch=function(){this.$search.css(\"width\",\"25px\");var a=\"\";if(\"\"!==this.$search.attr(\"placeholder\"))a=this.$selection.find(\".select2-selection__rendered\").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+\"em\"}this.$search.css(\"width\",a)},d}),b.define(\"select2/selection/eventRelay\",[\"jquery\"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=[\"open\",\"opening\",\"close\",\"closing\",\"select\",\"selecting\",\"unselect\",\"unselecting\"],g=[\"opening\",\"closing\",\"selecting\",\"unselecting\"];b.call(this,c,d),c.on(\"*\",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event(\"select2:\"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define(\"select2/translation\",[\"jquery\",\"require\"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define(\"select2/diacritics\",[],function(){var a={\"Ⓐ\":\"A\",\"A\":\"A\",\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ầ\":\"A\",\"Ấ\":\"A\",\"Ẫ\":\"A\",\"Ẩ\":\"A\",\"Ã\":\"A\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ằ\":\"A\",\"Ắ\":\"A\",\"Ẵ\":\"A\",\"Ẳ\":\"A\",\"Ȧ\":\"A\",\"Ǡ\":\"A\",\"Ä\":\"A\",\"Ǟ\":\"A\",\"Ả\":\"A\",\"Å\":\"A\",\"Ǻ\":\"A\",\"Ǎ\":\"A\",\"Ȁ\":\"A\",\"Ȃ\":\"A\",\"Ạ\":\"A\",\"Ậ\":\"A\",\"Ặ\":\"A\",\"Ḁ\":\"A\",\"Ą\":\"A\",\"Ⱥ\":\"A\",\"Ɐ\":\"A\",\"Ꜳ\":\"AA\",\"Æ\":\"AE\",\"Ǽ\":\"AE\",\"Ǣ\":\"AE\",\"Ꜵ\":\"AO\",\"Ꜷ\":\"AU\",\"Ꜹ\":\"AV\",\"Ꜻ\":\"AV\",\"Ꜽ\":\"AY\",\"Ⓑ\":\"B\",\"B\":\"B\",\"Ḃ\":\"B\",\"Ḅ\":\"B\",\"Ḇ\":\"B\",\"Ƀ\":\"B\",\"Ƃ\":\"B\",\"Ɓ\":\"B\",\"Ⓒ\":\"C\",\"C\":\"C\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"Ç\":\"C\",\"Ḉ\":\"C\",\"Ƈ\":\"C\",\"Ȼ\":\"C\",\"Ꜿ\":\"C\",\"Ⓓ\":\"D\",\"D\":\"D\",\"Ḋ\":\"D\",\"Ď\":\"D\",\"Ḍ\":\"D\",\"Ḑ\":\"D\",\"Ḓ\":\"D\",\"Ḏ\":\"D\",\"Đ\":\"D\",\"Ƌ\":\"D\",\"Ɗ\":\"D\",\"Ɖ\":\"D\",\"Ꝺ\":\"D\",\"DZ\":\"DZ\",\"DŽ\":\"DZ\",\"Dz\":\"Dz\",\"Dž\":\"Dz\",\"Ⓔ\":\"E\",\"E\":\"E\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ề\":\"E\",\"Ế\":\"E\",\"Ễ\":\"E\",\"Ể\":\"E\",\"Ẽ\":\"E\",\"Ē\":\"E\",\"Ḕ\":\"E\",\"Ḗ\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ë\":\"E\",\"Ẻ\":\"E\",\"Ě\":\"E\",\"Ȅ\":\"E\",\"Ȇ\":\"E\",\"Ẹ\":\"E\",\"Ệ\":\"E\",\"Ȩ\":\"E\",\"Ḝ\":\"E\",\"Ę\":\"E\",\"Ḙ\":\"E\",\"Ḛ\":\"E\",\"Ɛ\":\"E\",\"Ǝ\":\"E\",\"Ⓕ\":\"F\",\"F\":\"F\",\"Ḟ\":\"F\",\"Ƒ\":\"F\",\"Ꝼ\":\"F\",\"Ⓖ\":\"G\",\"G\":\"G\",\"Ǵ\":\"G\",\"Ĝ\":\"G\",\"Ḡ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ǧ\":\"G\",\"Ģ\":\"G\",\"Ǥ\":\"G\",\"Ɠ\":\"G\",\"Ꞡ\":\"G\",\"Ᵹ\":\"G\",\"Ꝿ\":\"G\",\"Ⓗ\":\"H\",\"H\":\"H\",\"Ĥ\":\"H\",\"Ḣ\":\"H\",\"Ḧ\":\"H\",\"Ȟ\":\"H\",\"Ḥ\":\"H\",\"Ḩ\":\"H\",\"Ḫ\":\"H\",\"Ħ\":\"H\",\"Ⱨ\":\"H\",\"Ⱶ\":\"H\",\"Ɥ\":\"H\",\"Ⓘ\":\"I\",\"I\":\"I\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"İ\":\"I\",\"Ï\":\"I\",\"Ḯ\":\"I\",\"Ỉ\":\"I\",\"Ǐ\":\"I\",\"Ȉ\":\"I\",\"Ȋ\":\"I\",\"Ị\":\"I\",\"Į\":\"I\",\"Ḭ\":\"I\",\"Ɨ\":\"I\",\"Ⓙ\":\"J\",\"J\":\"J\",\"Ĵ\":\"J\",\"Ɉ\":\"J\",\"Ⓚ\":\"K\",\"K\":\"K\",\"Ḱ\":\"K\",\"Ǩ\":\"K\",\"Ḳ\":\"K\",\"Ķ\":\"K\",\"Ḵ\":\"K\",\"Ƙ\":\"K\",\"Ⱪ\":\"K\",\"Ꝁ\":\"K\",\"Ꝃ\":\"K\",\"Ꝅ\":\"K\",\"Ꞣ\":\"K\",\"Ⓛ\":\"L\",\"L\":\"L\",\"Ŀ\":\"L\",\"Ĺ\":\"L\",\"Ľ\":\"L\",\"Ḷ\":\"L\",\"Ḹ\":\"L\",\"Ļ\":\"L\",\"Ḽ\":\"L\",\"Ḻ\":\"L\",\"Ł\":\"L\",\"Ƚ\":\"L\",\"Ɫ\":\"L\",\"Ⱡ\":\"L\",\"Ꝉ\":\"L\",\"Ꝇ\":\"L\",\"Ꞁ\":\"L\",\"LJ\":\"LJ\",\"Lj\":\"Lj\",\"Ⓜ\":\"M\",\"M\":\"M\",\"Ḿ\":\"M\",\"Ṁ\":\"M\",\"Ṃ\":\"M\",\"Ɱ\":\"M\",\"Ɯ\":\"M\",\"Ⓝ\":\"N\",\"N\":\"N\",\"Ǹ\":\"N\",\"Ń\":\"N\",\"Ñ\":\"N\",\"Ṅ\":\"N\",\"Ň\":\"N\",\"Ṇ\":\"N\",\"Ņ\":\"N\",\"Ṋ\":\"N\",\"Ṉ\":\"N\",\"Ƞ\":\"N\",\"Ɲ\":\"N\",\"Ꞑ\":\"N\",\"Ꞥ\":\"N\",\"NJ\":\"NJ\",\"Nj\":\"Nj\",\"Ⓞ\":\"O\",\"O\":\"O\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Ồ\":\"O\",\"Ố\":\"O\",\"Ỗ\":\"O\",\"Ổ\":\"O\",\"Õ\":\"O\",\"Ṍ\":\"O\",\"Ȭ\":\"O\",\"Ṏ\":\"O\",\"Ō\":\"O\",\"Ṑ\":\"O\",\"Ṓ\":\"O\",\"Ŏ\":\"O\",\"Ȯ\":\"O\",\"Ȱ\":\"O\",\"Ö\":\"O\",\"Ȫ\":\"O\",\"Ỏ\":\"O\",\"Ő\":\"O\",\"Ǒ\":\"O\",\"Ȍ\":\"O\",\"Ȏ\":\"O\",\"Ơ\":\"O\",\"Ờ\":\"O\",\"Ớ\":\"O\",\"Ỡ\":\"O\",\"Ở\":\"O\",\"Ợ\":\"O\",\"Ọ\":\"O\",\"Ộ\":\"O\",\"Ǫ\":\"O\",\"Ǭ\":\"O\",\"Ø\":\"O\",\"Ǿ\":\"O\",\"Ɔ\":\"O\",\"Ɵ\":\"O\",\"Ꝋ\":\"O\",\"Ꝍ\":\"O\",\"Ƣ\":\"OI\",\"Ꝏ\":\"OO\",\"Ȣ\":\"OU\",\"Ⓟ\":\"P\",\"P\":\"P\",\"Ṕ\":\"P\",\"Ṗ\":\"P\",\"Ƥ\":\"P\",\"Ᵽ\":\"P\",\"Ꝑ\":\"P\",\"Ꝓ\":\"P\",\"Ꝕ\":\"P\",\"Ⓠ\":\"Q\",\"Q\":\"Q\",\"Ꝗ\":\"Q\",\"Ꝙ\":\"Q\",\"Ɋ\":\"Q\",\"Ⓡ\":\"R\",\"R\":\"R\",\"Ŕ\":\"R\",\"Ṙ\":\"R\",\"Ř\":\"R\",\"Ȑ\":\"R\",\"Ȓ\":\"R\",\"Ṛ\":\"R\",\"Ṝ\":\"R\",\"Ŗ\":\"R\",\"Ṟ\":\"R\",\"Ɍ\":\"R\",\"Ɽ\":\"R\",\"Ꝛ\":\"R\",\"Ꞧ\":\"R\",\"Ꞃ\":\"R\",\"Ⓢ\":\"S\",\"S\":\"S\",\"ẞ\":\"S\",\"Ś\":\"S\",\"Ṥ\":\"S\",\"Ŝ\":\"S\",\"Ṡ\":\"S\",\"Š\":\"S\",\"Ṧ\":\"S\",\"Ṣ\":\"S\",\"Ṩ\":\"S\",\"Ș\":\"S\",\"Ş\":\"S\",\"Ȿ\":\"S\",\"Ꞩ\":\"S\",\"Ꞅ\":\"S\",\"Ⓣ\":\"T\",\"T\":\"T\",\"Ṫ\":\"T\",\"Ť\":\"T\",\"Ṭ\":\"T\",\"Ț\":\"T\",\"Ţ\":\"T\",\"Ṱ\":\"T\",\"Ṯ\":\"T\",\"Ŧ\":\"T\",\"Ƭ\":\"T\",\"Ʈ\":\"T\",\"Ⱦ\":\"T\",\"Ꞇ\":\"T\",\"Ꜩ\":\"TZ\",\"Ⓤ\":\"U\",\"U\":\"U\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ũ\":\"U\",\"Ṹ\":\"U\",\"Ū\":\"U\",\"Ṻ\":\"U\",\"Ŭ\":\"U\",\"Ü\":\"U\",\"Ǜ\":\"U\",\"Ǘ\":\"U\",\"Ǖ\":\"U\",\"Ǚ\":\"U\",\"Ủ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ǔ\":\"U\",\"Ȕ\":\"U\",\"Ȗ\":\"U\",\"Ư\":\"U\",\"Ừ\":\"U\",\"Ứ\":\"U\",\"Ữ\":\"U\",\"Ử\":\"U\",\"Ự\":\"U\",\"Ụ\":\"U\",\"Ṳ\":\"U\",\"Ų\":\"U\",\"Ṷ\":\"U\",\"Ṵ\":\"U\",\"Ʉ\":\"U\",\"Ⓥ\":\"V\",\"V\":\"V\",\"Ṽ\":\"V\",\"Ṿ\":\"V\",\"Ʋ\":\"V\",\"Ꝟ\":\"V\",\"Ʌ\":\"V\",\"Ꝡ\":\"VY\",\"Ⓦ\":\"W\",\"W\":\"W\",\"Ẁ\":\"W\",\"Ẃ\":\"W\",\"Ŵ\":\"W\",\"Ẇ\":\"W\",\"Ẅ\":\"W\",\"Ẉ\":\"W\",\"Ⱳ\":\"W\",\"Ⓧ\":\"X\",\"X\":\"X\",\"Ẋ\":\"X\",\"Ẍ\":\"X\",\"Ⓨ\":\"Y\",\"Y\":\"Y\",\"Ỳ\":\"Y\",\"Ý\":\"Y\",\"Ŷ\":\"Y\",\"Ỹ\":\"Y\",\"Ȳ\":\"Y\",\"Ẏ\":\"Y\",\"Ÿ\":\"Y\",\"Ỷ\":\"Y\",\"Ỵ\":\"Y\",\"Ƴ\":\"Y\",\"Ɏ\":\"Y\",\"Ỿ\":\"Y\",\"Ⓩ\":\"Z\",\"Z\":\"Z\",\"Ź\":\"Z\",\"Ẑ\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"Ẓ\":\"Z\",\"Ẕ\":\"Z\",\"Ƶ\":\"Z\",\"Ȥ\":\"Z\",\"Ɀ\":\"Z\",\"Ⱬ\":\"Z\",\"Ꝣ\":\"Z\",\"ⓐ\":\"a\",\"a\":\"a\",\"ẚ\":\"a\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ầ\":\"a\",\"ấ\":\"a\",\"ẫ\":\"a\",\"ẩ\":\"a\",\"ã\":\"a\",\"ā\":\"a\",\"ă\":\"a\",\"ằ\":\"a\",\"ắ\":\"a\",\"ẵ\":\"a\",\"ẳ\":\"a\",\"ȧ\":\"a\",\"ǡ\":\"a\",\"ä\":\"a\",\"ǟ\":\"a\",\"ả\":\"a\",\"å\":\"a\",\"ǻ\":\"a\",\"ǎ\":\"a\",\"ȁ\":\"a\",\"ȃ\":\"a\",\"ạ\":\"a\",\"ậ\":\"a\",\"ặ\":\"a\",\"ḁ\":\"a\",\"ą\":\"a\",\"ⱥ\":\"a\",\"ɐ\":\"a\",\"ꜳ\":\"aa\",\"æ\":\"ae\",\"ǽ\":\"ae\",\"ǣ\":\"ae\",\"ꜵ\":\"ao\",\"ꜷ\":\"au\",\"ꜹ\":\"av\",\"ꜻ\":\"av\",\"ꜽ\":\"ay\",\"ⓑ\":\"b\",\"b\":\"b\",\"ḃ\":\"b\",\"ḅ\":\"b\",\"ḇ\":\"b\",\"ƀ\":\"b\",\"ƃ\":\"b\",\"ɓ\":\"b\",\"ⓒ\":\"c\",\"c\":\"c\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"ç\":\"c\",\"ḉ\":\"c\",\"ƈ\":\"c\",\"ȼ\":\"c\",\"ꜿ\":\"c\",\"ↄ\":\"c\",\"ⓓ\":\"d\",\"d\":\"d\",\"ḋ\":\"d\",\"ď\":\"d\",\"ḍ\":\"d\",\"ḑ\":\"d\",\"ḓ\":\"d\",\"ḏ\":\"d\",\"đ\":\"d\",\"ƌ\":\"d\",\"ɖ\":\"d\",\"ɗ\":\"d\",\"ꝺ\":\"d\",\"dz\":\"dz\",\"dž\":\"dz\",\"ⓔ\":\"e\",\"e\":\"e\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ề\":\"e\",\"ế\":\"e\",\"ễ\":\"e\",\"ể\":\"e\",\"ẽ\":\"e\",\"ē\":\"e\",\"ḕ\":\"e\",\"ḗ\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ë\":\"e\",\"ẻ\":\"e\",\"ě\":\"e\",\"ȅ\":\"e\",\"ȇ\":\"e\",\"ẹ\":\"e\",\"ệ\":\"e\",\"ȩ\":\"e\",\"ḝ\":\"e\",\"ę\":\"e\",\"ḙ\":\"e\",\"ḛ\":\"e\",\"ɇ\":\"e\",\"ɛ\":\"e\",\"ǝ\":\"e\",\"ⓕ\":\"f\",\"f\":\"f\",\"ḟ\":\"f\",\"ƒ\":\"f\",\"ꝼ\":\"f\",\"ⓖ\":\"g\",\"g\":\"g\",\"ǵ\":\"g\",\"ĝ\":\"g\",\"ḡ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ǧ\":\"g\",\"ģ\":\"g\",\"ǥ\":\"g\",\"ɠ\":\"g\",\"ꞡ\":\"g\",\"ᵹ\":\"g\",\"ꝿ\":\"g\",\"ⓗ\":\"h\",\"h\":\"h\",\"ĥ\":\"h\",\"ḣ\":\"h\",\"ḧ\":\"h\",\"ȟ\":\"h\",\"ḥ\":\"h\",\"ḩ\":\"h\",\"ḫ\":\"h\",\"ẖ\":\"h\",\"ħ\":\"h\",\"ⱨ\":\"h\",\"ⱶ\":\"h\",\"ɥ\":\"h\",\"ƕ\":\"hv\",\"ⓘ\":\"i\",\"i\":\"i\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"ï\":\"i\",\"ḯ\":\"i\",\"ỉ\":\"i\",\"ǐ\":\"i\",\"ȉ\":\"i\",\"ȋ\":\"i\",\"ị\":\"i\",\"į\":\"i\",\"ḭ\":\"i\",\"ɨ\":\"i\",\"ı\":\"i\",\"ⓙ\":\"j\",\"j\":\"j\",\"ĵ\":\"j\",\"ǰ\":\"j\",\"ɉ\":\"j\",\"ⓚ\":\"k\",\"k\":\"k\",\"ḱ\":\"k\",\"ǩ\":\"k\",\"ḳ\":\"k\",\"ķ\":\"k\",\"ḵ\":\"k\",\"ƙ\":\"k\",\"ⱪ\":\"k\",\"ꝁ\":\"k\",\"ꝃ\":\"k\",\"ꝅ\":\"k\",\"ꞣ\":\"k\",\"ⓛ\":\"l\",\"l\":\"l\",\"ŀ\":\"l\",\"ĺ\":\"l\",\"ľ\":\"l\",\"ḷ\":\"l\",\"ḹ\":\"l\",\"ļ\":\"l\",\"ḽ\":\"l\",\"ḻ\":\"l\",\"ſ\":\"l\",\"ł\":\"l\",\"ƚ\":\"l\",\"ɫ\":\"l\",\"ⱡ\":\"l\",\"ꝉ\":\"l\",\"ꞁ\":\"l\",\"ꝇ\":\"l\",\"lj\":\"lj\",\"ⓜ\":\"m\",\"m\":\"m\",\"ḿ\":\"m\",\"ṁ\":\"m\",\"ṃ\":\"m\",\"ɱ\":\"m\",\"ɯ\":\"m\",\"ⓝ\":\"n\",\"n\":\"n\",\"ǹ\":\"n\",\"ń\":\"n\",\"ñ\":\"n\",\"ṅ\":\"n\",\"ň\":\"n\",\"ṇ\":\"n\",\"ņ\":\"n\",\"ṋ\":\"n\",\"ṉ\":\"n\",\"ƞ\":\"n\",\"ɲ\":\"n\",\"ʼn\":\"n\",\"ꞑ\":\"n\",\"ꞥ\":\"n\",\"nj\":\"nj\",\"ⓞ\":\"o\",\"o\":\"o\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"ồ\":\"o\",\"ố\":\"o\",\"ỗ\":\"o\",\"ổ\":\"o\",\"õ\":\"o\",\"ṍ\":\"o\",\"ȭ\":\"o\",\"ṏ\":\"o\",\"ō\":\"o\",\"ṑ\":\"o\",\"ṓ\":\"o\",\"ŏ\":\"o\",\"ȯ\":\"o\",\"ȱ\":\"o\",\"ö\":\"o\",\"ȫ\":\"o\",\"ỏ\":\"o\",\"ő\":\"o\",\"ǒ\":\"o\",\"ȍ\":\"o\",\"ȏ\":\"o\",\"ơ\":\"o\",\"ờ\":\"o\",\"ớ\":\"o\",\"ỡ\":\"o\",\"ở\":\"o\",\"ợ\":\"o\",\"ọ\":\"o\",\"ộ\":\"o\",\"ǫ\":\"o\",\"ǭ\":\"o\",\"ø\":\"o\",\"ǿ\":\"o\",\"ɔ\":\"o\",\"ꝋ\":\"o\",\"ꝍ\":\"o\",\"ɵ\":\"o\",\"ƣ\":\"oi\",\"ȣ\":\"ou\",\"ꝏ\":\"oo\",\"ⓟ\":\"p\",\"p\":\"p\",\"ṕ\":\"p\",\"ṗ\":\"p\",\"ƥ\":\"p\",\"ᵽ\":\"p\",\"ꝑ\":\"p\",\"ꝓ\":\"p\",\"ꝕ\":\"p\",\"ⓠ\":\"q\",\"q\":\"q\",\"ɋ\":\"q\",\"ꝗ\":\"q\",\"ꝙ\":\"q\",\"ⓡ\":\"r\",\"r\":\"r\",\"ŕ\":\"r\",\"ṙ\":\"r\",\"ř\":\"r\",\"ȑ\":\"r\",\"ȓ\":\"r\",\"ṛ\":\"r\",\"ṝ\":\"r\",\"ŗ\":\"r\",\"ṟ\":\"r\",\"ɍ\":\"r\",\"ɽ\":\"r\",\"ꝛ\":\"r\",\"ꞧ\":\"r\",\"ꞃ\":\"r\",\"ⓢ\":\"s\",\"s\":\"s\",\"ß\":\"s\",\"ś\":\"s\",\"ṥ\":\"s\",\"ŝ\":\"s\",\"ṡ\":\"s\",\"š\":\"s\",\"ṧ\":\"s\",\"ṣ\":\"s\",\"ṩ\":\"s\",\"ș\":\"s\",\"ş\":\"s\",\"ȿ\":\"s\",\"ꞩ\":\"s\",\"ꞅ\":\"s\",\"ẛ\":\"s\",\"ⓣ\":\"t\",\"t\":\"t\",\"ṫ\":\"t\",\"ẗ\":\"t\",\"ť\":\"t\",\"ṭ\":\"t\",\"ț\":\"t\",\"ţ\":\"t\",\"ṱ\":\"t\",\"ṯ\":\"t\",\"ŧ\":\"t\",\"ƭ\":\"t\",\"ʈ\":\"t\",\"ⱦ\":\"t\",\"ꞇ\":\"t\",\"ꜩ\":\"tz\",\"ⓤ\":\"u\",\"u\":\"u\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ũ\":\"u\",\"ṹ\":\"u\",\"ū\":\"u\",\"ṻ\":\"u\",\"ŭ\":\"u\",\"ü\":\"u\",\"ǜ\":\"u\",\"ǘ\":\"u\",\"ǖ\":\"u\",\"ǚ\":\"u\",\"ủ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ǔ\":\"u\",\"ȕ\":\"u\",\"ȗ\":\"u\",\"ư\":\"u\",\"ừ\":\"u\",\"ứ\":\"u\",\"ữ\":\"u\",\"ử\":\"u\",\"ự\":\"u\",\"ụ\":\"u\",\"ṳ\":\"u\",\"ų\":\"u\",\"ṷ\":\"u\",\"ṵ\":\"u\",\"ʉ\":\"u\",\"ⓥ\":\"v\",\"v\":\"v\",\"ṽ\":\"v\",\"ṿ\":\"v\",\"ʋ\":\"v\",\"ꝟ\":\"v\",\"ʌ\":\"v\",\"ꝡ\":\"vy\",\"ⓦ\":\"w\",\"w\":\"w\",\"ẁ\":\"w\",\"ẃ\":\"w\",\"ŵ\":\"w\",\"ẇ\":\"w\",\"ẅ\":\"w\",\"ẘ\":\"w\",\"ẉ\":\"w\",\"ⱳ\":\"w\",\"ⓧ\":\"x\",\"x\":\"x\",\"ẋ\":\"x\",\"ẍ\":\"x\",\"ⓨ\":\"y\",\"y\":\"y\",\"ỳ\":\"y\",\"ý\":\"y\",\"ŷ\":\"y\",\"ỹ\":\"y\",\"ȳ\":\"y\",\"ẏ\":\"y\",\"ÿ\":\"y\",\"ỷ\":\"y\",\"ẙ\":\"y\",\"ỵ\":\"y\",\"ƴ\":\"y\",\"ɏ\":\"y\",\"ỿ\":\"y\",\"ⓩ\":\"z\",\"z\":\"z\",\"ź\":\"z\",\"ẑ\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"ẓ\":\"z\",\"ẕ\":\"z\",\"ƶ\":\"z\",\"ȥ\":\"z\",\"ɀ\":\"z\",\"ⱬ\":\"z\",\"ꝣ\":\"z\",\"Ά\":\"Α\",\"Έ\":\"Ε\",\"Ή\":\"Η\",\"Ί\":\"Ι\",\"Ϊ\":\"Ι\",\"Ό\":\"Ο\",\"Ύ\":\"Υ\",\"Ϋ\":\"Υ\",\"Ώ\":\"Ω\",\"ά\":\"α\",\"έ\":\"ε\",\"ή\":\"η\",\"ί\":\"ι\",\"ϊ\":\"ι\",\"ΐ\":\"ι\",\"ό\":\"ο\",\"ύ\":\"υ\",\"ϋ\":\"υ\",\"ΰ\":\"υ\",\"ω\":\"ω\",\"ς\":\"σ\"};return a}),b.define(\"select2/data/base\",[\"../utils\"],function(a){function b(){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(){throw new Error(\"The `current` method must be defined in child classes.\")},b.prototype.query=function(){throw new Error(\"The `query` method must be defined in child classes.\")},b.prototype.bind=function(){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+\"-result-\";return d+=a.generateChars(4),d+=null!=c.id?\"-\"+c.id.toString():\"-\"+a.generateChars(4)},b}),b.define(\"select2/data/select\",[\"./base\",\"../utils\",\"jquery\"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(\":selected\").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is(\"option\"))return a.element.selected=!0,void this.$element.trigger(\"change\");if(this.$element.prop(\"multiple\"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger(\"change\")});else{var d=a.id;this.$element.val(d),this.$element.trigger(\"change\")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop(\"multiple\"))return a.selected=!1,c(a.element).is(\"option\")?(a.element.selected=!1,void this.$element.trigger(\"change\")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger(\"change\")})},d.prototype.bind=function(a){var b=this;this.container=a,a.on(\"select\",function(a){b.select(a.data)}),a.on(\"unselect\",function(a){b.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find(\"*\").each(function(){c.removeData(this,\"data\")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is(\"option\")||b.is(\"optgroup\")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement(\"optgroup\"),b.label=a.text):(b=document.createElement(\"option\"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,\"data\",e),d},d.prototype.item=function(a){var b={};\nif(b=c.data(a[0],\"data\"),null!=b)return b;if(a.is(\"option\"))b={id:a.val(),text:a.text(),disabled:a.prop(\"disabled\"),selected:a.prop(\"selected\"),title:a.prop(\"title\")};else if(a.is(\"optgroup\")){b={text:a.prop(\"label\"),children:[],title:a.prop(\"title\")};for(var d=a.children(\"option\"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],\"data\",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:\"\"},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get(\"matcher\");return c(a,b)},d}),b.define(\"select2/data/array\",[\"./select\",\"../utils\",\"jquery\"],function(a,b,c){function d(a,b){var c=b.get(\"data\")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find(\"option\").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find(\"option\"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=(c.extend(!0,{},l,j),this.option(l));k.replaceWith(m)}else{var n=this.option(j);if(j.children){var o=this.convertToOptions(j.children);b.appendMany(n,o)}h.push(n)}}return h},d}),b.define(\"select2/data/ajax\",[\"./array\",\"../utils\",\"jquery\"],function(a,b,c){function d(b,c){this.ajaxOptions=this._applyDefaults(c.get(\"ajax\")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),a.__super__.constructor.call(this,b,c)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return{q:a.term}},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get(\"debug\")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error(\"Select2: The AJAX results did not return an array in the `results` key of the response.\")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:\"GET\"},this.ajaxOptions);\"function\"==typeof f.url&&(f.url=f.url(a)),\"function\"==typeof f.data&&(f.data=f.data(a)),this.ajaxOptions.delay&&\"\"!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define(\"select2/data/tags\",[\"jquery\"],function(a){function b(b,c,d){var e=d.get(\"tags\"),f=d.get(\"createTag\");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g<e.length;g++){var h=e[g],i=this._normalizeItem(h),j=this.option(i);this.$element.append(j)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr(\"data-select2-tag\",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return\"\"===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(){var b=(this._lastTag,this.$element.find(\"option[data-select2-tag]\"));b.each(function(){this.selected||a(this).remove()})},b}),b.define(\"select2/data/tokenizer\",[\"jquery\"],function(a){function b(a,b,c){var d=c.get(\"tokenizer\");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(\".select2-search__field\")},b.prototype.query=function(a,b,c){function d(a){e.select(a)}var e=this;b.term=b.term||\"\";var f=this.tokenizer(b,this.options,d);f.term!==b.term&&(this.$search.length&&(this.$search.val(f.term),this.$search.focus()),b.term=f.term),a.call(this,b,c)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get(\"tokenSeparators\")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);e(m),g=g.substr(h+1)||\"\",h=0}else h++}return{term:g}},b}),b.define(\"select2/data/minimumInputLength\",[],function(){function a(a,b,c){this.minimumInputLength=c.get(\"minimumInputLength\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||\"\",b.term.length<this.minimumInputLength?void this.trigger(\"results:message\",{message:\"inputTooShort\",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define(\"select2/data/maximumInputLength\",[],function(){function a(a,b,c){this.maximumInputLength=c.get(\"maximumInputLength\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||\"\",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger(\"results:message\",{message:\"inputTooLong\",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define(\"select2/data/maximumSelectionLength\",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get(\"maximumSelectionLength\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger(\"results:message\",{message:\"maximumSelected\",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define(\"select2/dropdown\",[\"jquery\",\"./utils\"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class=\"select2-dropdown\"><span class=\"select2-results\"></span></span>');return b.attr(\"dir\",this.options.get(\"dir\")),this.$dropdown=b,b},c.prototype.position=function(){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define(\"select2/dropdown/search\",[\"jquery\",\"../utils\"],function(a){function b(){}return b.prototype.render=function(b){var c=b.call(this),d=a('<span class=\"select2-search select2-search--dropdown\"><input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"textbox\" /></span>');return this.$searchContainer=d,this.$search=d.find(\"input\"),c.prepend(d),c},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on(\"keydown\",function(a){e.trigger(\"keypress\",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on(\"input\",function(){a(this).off(\"keyup\")}),this.$search.on(\"keyup input\",function(a){e.handleSearch(a)}),c.on(\"open\",function(){e.$search.attr(\"tabindex\",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on(\"close\",function(){e.$search.attr(\"tabindex\",-1),e.$search.val(\"\")}),c.on(\"results:all\",function(a){if(null==a.query.term||\"\"===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass(\"select2-search--hide\"):e.$searchContainer.addClass(\"select2-search--hide\")}})},b.prototype.handleSearch=function(){if(!this._keyUpPrevented){var a=this.$search.val();this.trigger(\"query\",{term:a})}this._keyUpPrevented=!1},b.prototype.showSearch=function(){return!0},b}),b.define(\"select2/dropdown/hidePlaceholder\",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get(\"placeholder\")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return\"string\"==typeof b&&(b={id:\"\",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define(\"select2/dropdown/infiniteScroll\",[\"jquery\"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on(\"query\",function(a){e.lastParams=a,e.loading=!0}),c.on(\"query:append\",function(a){e.lastParams=a,e.loading=!0}),this.$results.on(\"scroll\",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger(\"query:append\",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class=\"option load-more\" role=\"treeitem\"></li>'),c=this.options.get(\"translations\").get(\"loadingMore\");return b.html(c(this.lastParams)),b},b}),b.define(\"select2/dropdown/attachBody\",[\"jquery\",\"../utils\"],function(a,b){function c(a,b,c){this.$dropdownParent=c.get(\"dropdownParent\")||document.body,a.call(this,b,c)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on(\"open\",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on(\"results:all\",function(){d._positionDropdown(),d._resizeDropdown()}),b.on(\"results:append\",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on(\"close\",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on(\"mousedown\",function(a){a.stopPropagation()})},c.prototype.position=function(a,b,c){b.attr(\"class\",c.attr(\"class\")),b.removeClass(\"select2\"),b.addClass(\"select2-container--open\"),b.css({position:\"absolute\",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(\"<span></span>\"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c){var d=this,e=\"scroll.select2.\"+c.id,f=\"resize.select2.\"+c.id,g=\"orientationchange.select2.\"+c.id,h=this.$container.parents().filter(b.hasScroll);h.each(function(){a(this).data(\"select2-scroll-position\",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),h.on(e,function(){var b=a(this).data(\"select2-scroll-position\");a(this).scrollTop(b.y)}),a(window).on(e+\" \"+f+\" \"+g,function(){d._positionDropdown(),d._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c){var d=\"scroll.select2.\"+c.id,e=\"resize.select2.\"+c.id,f=\"orientationchange.select2.\"+c.id,g=this.$container.parents().filter(b.hasScroll);g.off(d),a(window).off(d+\" \"+e+\" \"+f)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass(\"select2-dropdown--above\"),d=this.$dropdown.hasClass(\"select2-dropdown--below\"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom};c||d||(e=\"below\"),k||!j||c?!j&&k&&c&&(e=\"below\"):e=\"above\",(\"above\"==e||c&&\"below\"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass(\"select2-dropdown--below select2-dropdown--above\").addClass(\"select2-dropdown--\"+e),this.$container.removeClass(\"select2-container--below select2-container--above\").addClass(\"select2-container--\"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){this.$dropdownContainer.width();var a={width:this.$container.outerWidth(!1)+\"px\"};this.options.get(\"dropdownAutoWidth\")&&(a.minWidth=a.width,a.width=\"auto\"),this.$dropdown.css(a)},c.prototype._showDropdown=function(){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define(\"select2/dropdown/minimumResultsForSearch\",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get(\"minimumResultsForSearch\"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define(\"select2/dropdown/selectOnClose\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on(\"close\",function(){d._handleSelectOnClose()})},a.prototype._handleSelectOnClose=function(){var a=this.getHighlightedResults();a.length<1||this.trigger(\"select\",{data:a.data(\"data\")})},a}),b.define(\"select2/dropdown/closeOnSelect\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on(\"select\",function(a){d._selectTriggered(a)}),b.on(\"unselect\",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger(\"close\")},a}),b.define(\"select2/i18n/en\",[],function(){return{errorLoading:function(){return\"The results could not be loaded.\"},inputTooLong:function(a){var b=a.input.length-a.maximum,c=\"Please delete \"+b+\" character\";return 1!=b&&(c+=\"s\"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c=\"Please enter \"+b+\" or more characters\";return c},loadingMore:function(){return\"Loading more results…\"},maximumSelected:function(a){var b=\"You can only select \"+a.maximum+\" item\";return 1!=a.maximum&&(b+=\"s\"),b},noResults:function(){return\"No results found\"},searching:function(){return\"Searching…\"}}}),b.define(\"select2/defaults\",[\"jquery\",\"require\",\"./results\",\"./selection/single\",\"./selection/multiple\",\"./selection/placeholder\",\"./selection/allowClear\",\"./selection/search\",\"./selection/eventRelay\",\"./utils\",\"./translation\",\"./diacritics\",\"./data/select\",\"./data/array\",\"./data/ajax\",\"./data/tags\",\"./data/tokenizer\",\"./data/minimumInputLength\",\"./data/maximumInputLength\",\"./data/maximumSelectionLength\",\"./dropdown\",\"./dropdown/search\",\"./dropdown/hidePlaceholder\",\"./dropdown/infiniteScroll\",\"./dropdown/attachBody\",\"./dropdown/minimumResultsForSearch\",\"./dropdown/selectOnClose\",\"./dropdown/closeOnSelect\",\"./i18n/en\"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend({},this.defaults,l),null==l.dataAdapter){if(l.dataAdapter=null!=l.ajax?o:null!=l.data?n:m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+\"compat/query\");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+\"compat/initSelection\");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+\"compat/dropdownCss\");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.selectionAdapter=l.multiple?e:d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+\"compat/containerCss\");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if(\"string\"==typeof l.language)if(l.language.indexOf(\"-\")>0){var H=l.language.split(\"-\"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push(\"en\");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for \"'+M+'\" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+\"en\"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\\u0000-\\u007E]/g,b)}function c(d,e){if(\"\"===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:\"./\",amdLanguageBase:\"./i18n/\",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:\"default\",width:\"resolve\"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define(\"select2/options\",[\"require\",\"jquery\",\"./defaults\",\"./utils\"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is(\"input\")){var f=a(this.get(\"amdBase\")+\"compat/inputData\");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=[\"select2\"];null==this.options.multiple&&(this.options.multiple=a.prop(\"multiple\")),null==this.options.disabled&&(this.options.disabled=a.prop(\"disabled\")),null==this.options.language&&(a.prop(\"lang\")?this.options.language=a.prop(\"lang\").toLowerCase():a.closest(\"[lang]\").prop(\"lang\")&&(this.options.language=a.closest(\"[lang]\").prop(\"lang\"))),null==this.options.dir&&(this.options.dir=a.prop(\"dir\")?a.prop(\"dir\"):a.closest(\"[dir]\").prop(\"dir\")?a.closest(\"[dir]\").prop(\"dir\"):\"ltr\"),a.prop(\"disabled\",this.options.disabled),a.prop(\"multiple\",this.options.multiple),a.data(\"select2Tags\")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags=\"true\"` attributes and will be removed in future versions of Select2.'),a.data(\"data\",a.data(\"select2Tags\")),a.data(\"tags\",!0)),a.data(\"ajaxUrl\")&&(this.options.debug&&window.console&&console.warn&&console.warn(\"Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2.\"),a.attr(\"ajax--url\",a.data(\"ajaxUrl\")),a.data(\"ajax--url\",a.data(\"ajaxUrl\")));var e={};e=b.fn.jquery&&\"1.\"==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define(\"select2/core\",[\"jquery\",\"./options\",\"./utils\",\"./keys\"],function(a,b,c,d){var e=function(a,c){null!=a.data(\"select2\")&&a.data(\"select2\").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr(\"tabindex\")||0;a.data(\"old-tabindex\",d),a.attr(\"tabindex\",\"-1\");var f=this.options.get(\"dataAdapter\");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get(\"selectionAdapter\");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get(\"dropdownAdapter\");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get(\"resultsAdapter\");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger(\"selection:update\",{data:a})}),a.addClass(\"select2-hidden-accessible\"),a.attr(\"aria-hidden\",\"true\"),this._syncAttributes(),a.data(\"select2\",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b=\"\";return b=null!=a.attr(\"id\")?a.attr(\"id\"):null!=a.attr(\"name\")?a.attr(\"name\")+\"-\"+c.generateChars(2):c.generateChars(4),b=\"select2-\"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get(\"width\"));null!=b&&a.css(\"width\",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if(\"resolve\"==b){var d=this._resolveWidth(a,\"style\");return null!=d?d:this._resolveWidth(a,\"element\")}if(\"element\"==b){var e=a.outerWidth(!1);return 0>=e?\"auto\":e+\"px\"}if(\"style\"==b){var f=a.attr(\"style\");if(\"string\"!=typeof f)return null;for(var g=f.split(\";\"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\\s/g,\"\"),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on(\"change.select2\",function(){b.dataAdapter.current(function(a){b.trigger(\"selection:update\",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent(\"onpropertychange\",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener(\"DOMAttrModified\",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on(\"*\",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=[\"toggle\"];this.selection.on(\"toggle\",function(){b.toggleDropdown()}),this.selection.on(\"*\",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on(\"*\",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on(\"*\",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on(\"open\",function(){a.$container.addClass(\"select2-container--open\")}),this.on(\"close\",function(){a.$container.removeClass(\"select2-container--open\")}),this.on(\"enable\",function(){a.$container.removeClass(\"select2-container--disabled\")}),this.on(\"disable\",function(){a.$container.addClass(\"select2-container--disabled\")}),this.on(\"focus\",function(){a.$container.addClass(\"select2-container--focus\")}),this.on(\"blur\",function(){a.$container.removeClass(\"select2-container--focus\")}),this.on(\"query\",function(b){a.isOpen()||a.trigger(\"open\"),this.dataAdapter.query(b,function(c){a.trigger(\"results:all\",{data:c,query:b})})}),this.on(\"query:append\",function(b){this.dataAdapter.query(b,function(c){a.trigger(\"results:append\",{data:c,query:b})})}),this.on(\"keypress\",function(b){var c=b.which;a.isOpen()?c===d.ENTER?(a.trigger(\"results:select\"),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger(\"results:toggle\"),b.preventDefault()):c===d.UP?(a.trigger(\"results:previous\"),b.preventDefault()):c===d.DOWN?(a.trigger(\"results:next\"),b.preventDefault()):(c===d.ESC||c===d.TAB)&&(a.close(),b.preventDefault()):(c===d.ENTER||c===d.SPACE||(c===d.DOWN||c===d.UP)&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set(\"disabled\",this.$element.prop(\"disabled\")),this.options.get(\"disabled\")?(this.isOpen()&&this.close(),this.trigger(\"disable\")):this.trigger(\"enable\")},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:\"opening\",close:\"closing\",select:\"selecting\",unselect:\"unselecting\"};if(a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get(\"disabled\")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||(this.trigger(\"query\",{}),this.trigger(\"open\"))},e.prototype.close=function(){this.isOpen()&&this.trigger(\"close\")},e.prototype.isOpen=function(){return this.$container.hasClass(\"select2-container--open\")},e.prototype.enable=function(a){this.options.get(\"debug\")&&window.console&&console.warn&&console.warn('Select2: The `select2(\"enable\")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop(\"disabled\") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop(\"disabled\",b)},e.prototype.data=function(){this.options.get(\"debug\")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2(\"data\")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get(\"debug\")&&window.console&&console.warn&&console.warn('Select2: The `select2(\"val\")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger(\"change\")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent(\"onpropertychange\",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener(\"DOMAttrModified\",this._sync,!1),this._sync=null,this.$element.off(\".select2\"),this.$element.attr(\"tabindex\",this.$element.data(\"old-tabindex\")),this.$element.removeClass(\"select2-hidden-accessible\"),this.$element.attr(\"aria-hidden\",\"false\"),this.$element.removeData(\"select2\"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class=\"select2 select2-container\"><span class=\"selection\"></span><span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span></span>');return b.attr(\"dir\",this.options.get(\"dir\")),this.$container=b,this.$container.addClass(\"select2-container--\"+this.options.get(\"theme\")),b.data(\"element\",this.$element),b},e}),b.define(\"select2/compat/utils\",[\"jquery\"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr(\"class\")),e&&(e=\"\"+e,a(e.split(/\\s+/)).each(function(){0===this.indexOf(\"select2-\")&&g.push(this)})),e=a.trim(c.attr(\"class\")),e&&(e=\"\"+e,a(e.split(/\\s+/)).each(function(){0!==this.indexOf(\"select2-\")&&(f=d(this),null!=f&&g.push(f))})),b.attr(\"class\",g.join(\" \"))}return{syncCssClasses:b}}),b.define(\"select2/compat/containerCss\",[\"jquery\",\"./utils\"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get(\"containerCssClass\")||\"\";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get(\"adaptContainerCssClass\");if(g=g||c,-1!==f.indexOf(\":all:\")){f=f.replace(\":all\",\"\");var h=g;g=function(a){var b=h(a);return null!=b?b+\" \"+a:a}}var i=this.options.get(\"containerCss\")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define(\"select2/compat/dropdownCss\",[\"jquery\",\"./utils\"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get(\"dropdownCssClass\")||\"\";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get(\"adaptDropdownCssClass\");if(g=g||c,-1!==f.indexOf(\":all:\")){f=f.replace(\":all\",\"\");var h=g;g=function(a){var b=h(a);return null!=b?b+\" \"+a:a}}var i=this.options.get(\"dropdownCss\")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define(\"select2/compat/initSelection\",[\"jquery\"],function(a){function b(a,b,c){c.get(\"debug\")&&window.console&&console.warn&&console.warn(\"Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2\"),this.initSelection=c.get(\"initSelection\"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define(\"select2/compat/inputData\",[\"jquery\"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get(\"valueSeparator\")||\",\",\"hidden\"===b.prop(\"type\")&&c.get(\"debug\")&&console&&console.warn&&console.warn(\"Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead.\"),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get(\"multiple\")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger(\"change\")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger(\"change\")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];\nb.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger(\"change\")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],\"data\")});this._currentData.push.apply(this._currentData,d)},b}),b.define(\"select2/compat/matcher\",[\"jquery\"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||\"\"===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define(\"select2/compat/query\",[],function(){function a(a,b,c){c.get(\"debug\")&&window.console&&console.warn&&console.warn(\"Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2.\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get(\"query\");d.call(null,b)},a}),b.define(\"select2/dropdown/attachContainer\",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(\".dropdown-wrapper\");d.append(b),b.addClass(\"select2-dropdown--below\"),c.addClass(\"select2-container--below\")},a}),b.define(\"select2/dropdown/stopPropagation\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=[\"blur\",\"change\",\"click\",\"dblclick\",\"focus\",\"focusin\",\"focusout\",\"input\",\"keydown\",\"keyup\",\"keypress\",\"mousedown\",\"mouseenter\",\"mouseleave\",\"mousemove\",\"mouseover\",\"mouseup\",\"search\",\"touchend\",\"touchstart\"];this.$dropdown.on(d.join(\" \"),function(a){a.stopPropagation()})},a}),b.define(\"select2/selection/stopPropagation\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=[\"blur\",\"change\",\"click\",\"dblclick\",\"focus\",\"focusin\",\"focusout\",\"input\",\"keydown\",\"keyup\",\"keypress\",\"mousedown\",\"mouseenter\",\"mouseleave\",\"mousemove\",\"mouseover\",\"mouseup\",\"search\",\"touchend\",\"touchstart\"];this.$selection.on(d.join(\" \"),function(a){a.stopPropagation()})},a}),b.define(\"jquery.select2\",[\"jquery\",\"require\",\"./select2/core\",\"./select2/defaults\"],function(a,b,c,d){if(b(\"jquery.mousewheel\"),null==a.fn.select2){var e=[\"open\",\"close\",\"destroy\"];a.fn.select2=function(b){if(b=b||{},\"object\"==typeof b)return this.each(function(){{var d=a.extend({},b,!0);new c(a(this),d)}}),this;if(\"string\"==typeof b){var d=this.data(\"select2\");null==d&&window.console&&console.error&&console.error(\"The select2('\"+b+\"') method was called on an element that is not using Select2.\");var f=Array.prototype.slice.call(arguments,1),g=d[b](f);return a.inArray(b,e)>-1?this:g}throw new Error(\"Invalid arguments for Select2: \"+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),function(c){\"function\"==typeof b.define&&b.define.amd?b.define(\"jquery.mousewheel\",[\"jquery\"],c):\"object\"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type=\"mousewheel\",\"detail\"in g&&(m=-1*g.detail),\"wheelDelta\"in g&&(m=g.wheelDelta),\"wheelDeltaY\"in g&&(m=g.wheelDeltaY),\"wheelDeltaX\"in g&&(l=-1*g.wheelDeltaX),\"axis\"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,\"deltaY\"in g&&(m=-1*g.deltaY,j=m),\"deltaX\"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,\"mousewheel-line-height\");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,\"mousewheel-page-height\");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?\"floor\":\"ceil\"](j/f),l=Math[l>=1?\"floor\":\"ceil\"](l/f),m=Math[m>=1?\"floor\":\"ceil\"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&\"mousewheel\"===a.type&&b%120===0}var e,f,g=[\"wheel\",\"mousewheel\",\"DOMMouseScroll\",\"MozMousePixelScroll\"],h=\"onwheel\"in document||document.documentMode>=9?[\"wheel\"]:[\"mousewheel\",\"DomMouseScroll\",\"MozMousePixelScroll\"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:\"3.1.12\",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,\"mousewheel-line-height\",k.getLineHeight(this)),a.data(this,\"mousewheel-page-height\",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,\"mousewheel-line-height\"),a.removeData(this,\"mousewheel-page-height\")},getLineHeight:function(b){var c=a(b),d=c[\"offsetParent\"in a.fn?\"offsetParent\":\"parent\"]();return d.length||(d=a(\"body\")),parseInt(d.css(\"fontSize\"),10)||parseInt(c.css(\"fontSize\"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind(\"mousewheel\",a):this.trigger(\"mousewheel\")},unmousewheel:function(a){return this.unbind(\"mousewheel\",a)}})}),{define:b.define,require:b.require}}(),c=b.require(\"jquery.select2\");return a.fn.select2.amd=b,c});","/*!\n * Bootstrap Colorpicker\n * http://mjolnic.github.io/bootstrap-colorpicker/\n *\n * Originally written by (c) 2012 Stefan Petre\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0.txt\n *\n * @todo Update DOCS\n */\n(function($) {\n    'use strict';\n\n    // Color object\n    var Color = function(val) {\n        this.value = {\n            h: 0,\n            s: 0,\n            b: 0,\n            a: 1\n        };\n        this.origFormat = null; // original string format\n        if (val) {\n            if (val.toLowerCase !== undefined) {\n                this.setColor(val);\n            } else if (val.h !== undefined) {\n                this.value = val;\n            }\n        }\n    };\n\n    Color.prototype = {\n        constructor: Color,\n        _sanitizeNumber: function(val) {\n            if (typeof val === 'number') {\n                return val;\n            }\n            if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {\n                return 1;\n            }\n            if (val.toLowerCase !== undefined) {\n                return parseFloat(val);\n            }\n            return 1;\n        },\n        //parse a string to HSB\n        setColor: function(strVal) {\n            strVal = strVal.toLowerCase();\n            this.value = this.stringToHSB(strVal) ||  {\n                h: 0,\n                s: 0,\n                b: 0,\n                a: 1\n            };\n        },\n        stringToHSB: function(strVal) {\n            strVal = strVal.toLowerCase();\n            var that = this,\n                result = false;\n            $.each(this.stringParsers, function(i, parser) {\n                var match = parser.re.exec(strVal),\n                    values = match && parser.parse.apply(that, [match]),\n                    format = parser.format || 'rgba';\n                if (values) {\n                    if (format.match(/hsla?/)) {\n                        result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));\n                    } else {\n                        result = that.RGBtoHSB.apply(that, values);\n                    }\n                    that.origFormat = format;\n                    return false;\n                }\n                return true;\n            });\n            return result;\n        },\n        setHue: function(h) {\n            this.value.h = 1 - h;\n        },\n        setSaturation: function(s) {\n            this.value.s = s;\n        },\n        setBrightness: function(b) {\n            this.value.b = 1 - b;\n        },\n        setAlpha: function(a) {\n            this.value.a = parseInt((1 - a) * 100, 10) / 100;\n        },\n        toRGB: function(h, s, v, a) {\n            h = h || this.value.h;\n            s = s || this.value.s;\n            v = v || this.value.b;\n            a = a || this.value.a;\n\n            var r, g, b, i, f, p, q, t;\n            if (h && s === undefined && v === undefined) {\n                s = h.s, v = h.v, h = h.h;\n            }\n            i = Math.floor(h * 6);\n            f = h * 6 - i;\n            p = v * (1 - s);\n            q = v * (1 - f * s);\n            t = v * (1 - (1 - f) * s);\n            switch (i % 6) {\n                case 0:\n                    r = v, g = t, b = p;\n                    break;\n                case 1:\n                    r = q, g = v, b = p;\n                    break;\n                case 2:\n                    r = p, g = v, b = t;\n                    break;\n                case 3:\n                    r = p, g = q, b = v;\n                    break;\n                case 4:\n                    r = t, g = p, b = v;\n                    break;\n                case 5:\n                    r = v, g = p, b = q;\n                    break;\n            }\n            return {\n                r: Math.floor(r * 255),\n                g: Math.floor(g * 255),\n                b: Math.floor(b * 255),\n                a: a\n            };\n        },\n        toHex: function(h, s, b, a) {\n            var rgb = this.toRGB(h, s, b, a);\n            return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);\n        },\n        toHSL: function(h, s, b, a) {\n            h = h || this.value.h;\n            s = s || this.value.s;\n            b = b || this.value.b;\n            a = a || this.value.a;\n\n            var H = h,\n                L = (2 - s) * b,\n                S = s * b;\n            if (L > 0 && L <= 1) {\n                S /= L;\n            } else {\n                S /= 2 - L;\n            }\n            L /= 2;\n            if (S > 1) {\n                S = 1;\n            }\n            return {\n                h: H,\n                s: S,\n                l: L,\n                a: a\n            };\n        },\n        RGBtoHSB: function(r, g, b, a) {\n            r /= 255;\n            g /= 255;\n            b /= 255;\n\n            var H, S, V, C;\n            V = Math.max(r, g, b);\n            C = V - Math.min(r, g, b);\n            H = (C === 0 ? null :\n                V === r ? (g - b) / C :\n                V === g ? (b - r) / C + 2 :\n                (r - g) / C + 4\n            );\n            H = ((H + 360) % 6) * 60 / 360;\n            S = C === 0 ? 0 : C / V;\n            return {\n                h: this._sanitizeNumber(H),\n                s: S,\n                b: V,\n                a: this._sanitizeNumber(a)\n            };\n        },\n        HueToRGB: function(p, q, h) {\n            if (h < 0) {\n                h += 1;\n            } else if (h > 1) {\n                h -= 1;\n            }\n            if ((h * 6) < 1) {\n                return p + (q - p) * h * 6;\n            } else if ((h * 2) < 1) {\n                return q;\n            } else if ((h * 3) < 2) {\n                return p + (q - p) * ((2 / 3) - h) * 6;\n            } else {\n                return p;\n            }\n        },\n        HSLtoRGB: function(h, s, l, a) {\n            if (s < 0) {\n                s = 0;\n            }\n            var q;\n            if (l <= 0.5) {\n                q = l * (1 + s);\n            } else {\n                q = l + s - (l * s);\n            }\n\n            var p = 2 * l - q;\n\n            var tr = h + (1 / 3);\n            var tg = h;\n            var tb = h - (1 / 3);\n\n            var r = Math.round(this.HueToRGB(p, q, tr) * 255);\n            var g = Math.round(this.HueToRGB(p, q, tg) * 255);\n            var b = Math.round(this.HueToRGB(p, q, tb) * 255);\n            return [r, g, b, this._sanitizeNumber(a)];\n        },\n        toString: function(format) {\n            format = format ||  'rgba';\n            switch (format) {\n                case 'rgb':\n                    {\n                        var rgb = this.toRGB();\n                        return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';\n                    }\n                    break;\n                case 'rgba':\n                    {\n                        var rgb = this.toRGB();\n                        return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')';\n                    }\n                    break;\n                case 'hsl':\n                    {\n                        var hsl = this.toHSL();\n                        return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)';\n                    }\n                    break;\n                case 'hsla':\n                    {\n                        var hsl = this.toHSL();\n                        return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')';\n                    }\n                    break;\n                case 'hex':\n                    {\n                        return this.toHex();\n                    }\n                    break;\n                default:\n                    {\n                        return false;\n                    }\n                    break;\n            }\n        },\n        // a set of RE's that can match strings and generate color tuples.\n        // from John Resig color plugin\n        // https://github.com/jquery/jquery-color/\n        stringParsers: [{\n            re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,\n            format: 'hex',\n            parse: function(execResult) {\n                return [\n                    parseInt(execResult[1], 16),\n                    parseInt(execResult[2], 16),\n                    parseInt(execResult[3], 16),\n                    1\n                ];\n            }\n        }, {\n            re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,\n            format: 'hex',\n            parse: function(execResult) {\n                return [\n                    parseInt(execResult[1] + execResult[1], 16),\n                    parseInt(execResult[2] + execResult[2], 16),\n                    parseInt(execResult[3] + execResult[3], 16),\n                    1\n                ];\n            }\n        }, {\n            re: /rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*?\\)/,\n            format: 'rgb',\n            parse: function(execResult) {\n                return [\n                    execResult[1],\n                    execResult[2],\n                    execResult[3],\n                    1\n                ];\n            }\n        }, {\n            re: /rgb\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*?\\)/,\n            format: 'rgb',\n            parse: function(execResult) {\n                return [\n                    2.55 * execResult[1],\n                    2.55 * execResult[2],\n                    2.55 * execResult[3],\n                    1\n                ];\n            }\n        }, {\n            re: /rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n            format: 'rgba',\n            parse: function(execResult) {\n                return [\n                    execResult[1],\n                    execResult[2],\n                    execResult[3],\n                    execResult[4]\n                ];\n            }\n        }, {\n            re: /rgba\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n            format: 'rgba',\n            parse: function(execResult) {\n                return [\n                    2.55 * execResult[1],\n                    2.55 * execResult[2],\n                    2.55 * execResult[3],\n                    execResult[4]\n                ];\n            }\n        }, {\n            re: /hsl\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*?\\)/,\n            format: 'hsl',\n            parse: function(execResult) {\n                return [\n                    execResult[1] / 360,\n                    execResult[2] / 100,\n                    execResult[3] / 100,\n                    execResult[4]\n                ];\n            }\n        }, {\n            re: /hsla\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n            format: 'hsla',\n            parse: function(execResult) {\n                return [\n                    execResult[1] / 360,\n                    execResult[2] / 100,\n                    execResult[3] / 100,\n                    execResult[4]\n                ];\n            }\n        }, {\n            //predefined color name\n            re: /^([a-z]{3,})$/,\n            format: 'alias',\n            parse: function(execResult) {\n                var hexval = this.colorNameToHex(execResult[0]) ||  '#000000';\n                var match = this.stringParsers[0].re.exec(hexval),\n                    values = match && this.stringParsers[0].parse.apply(this, [match]);\n                return values;\n            }\n        }],\n        colorNameToHex: function(name) {\n            // 140 predefined colors from the HTML Colors spec\n            var colors = {\n                \"aliceblue\": \"#f0f8ff\",\n                \"antiquewhite\": \"#faebd7\",\n                \"aqua\": \"#00ffff\",\n                \"aquamarine\": \"#7fffd4\",\n                \"azure\": \"#f0ffff\",\n                \"beige\": \"#f5f5dc\",\n                \"bisque\": \"#ffe4c4\",\n                \"black\": \"#000000\",\n                \"blanchedalmond\": \"#ffebcd\",\n                \"blue\": \"#0000ff\",\n                \"blueviolet\": \"#8a2be2\",\n                \"brown\": \"#a52a2a\",\n                \"burlywood\": \"#deb887\",\n                \"cadetblue\": \"#5f9ea0\",\n                \"chartreuse\": \"#7fff00\",\n                \"chocolate\": \"#d2691e\",\n                \"coral\": \"#ff7f50\",\n                \"cornflowerblue\": \"#6495ed\",\n                \"cornsilk\": \"#fff8dc\",\n                \"crimson\": \"#dc143c\",\n                \"cyan\": \"#00ffff\",\n                \"darkblue\": \"#00008b\",\n                \"darkcyan\": \"#008b8b\",\n                \"darkgoldenrod\": \"#b8860b\",\n                \"darkgray\": \"#a9a9a9\",\n                \"darkgreen\": \"#006400\",\n                \"darkkhaki\": \"#bdb76b\",\n                \"darkmagenta\": \"#8b008b\",\n                \"darkolivegreen\": \"#556b2f\",\n                \"darkorange\": \"#ff8c00\",\n                \"darkorchid\": \"#9932cc\",\n                \"darkred\": \"#8b0000\",\n                \"darksalmon\": \"#e9967a\",\n                \"darkseagreen\": \"#8fbc8f\",\n                \"darkslateblue\": \"#483d8b\",\n                \"darkslategray\": \"#2f4f4f\",\n                \"darkturquoise\": \"#00ced1\",\n                \"darkviolet\": \"#9400d3\",\n                \"deeppink\": \"#ff1493\",\n                \"deepskyblue\": \"#00bfff\",\n                \"dimgray\": \"#696969\",\n                \"dodgerblue\": \"#1e90ff\",\n                \"firebrick\": \"#b22222\",\n                \"floralwhite\": \"#fffaf0\",\n                \"forestgreen\": \"#228b22\",\n                \"fuchsia\": \"#ff00ff\",\n                \"gainsboro\": \"#dcdcdc\",\n                \"ghostwhite\": \"#f8f8ff\",\n                \"gold\": \"#ffd700\",\n                \"goldenrod\": \"#daa520\",\n                \"gray\": \"#808080\",\n                \"green\": \"#008000\",\n                \"greenyellow\": \"#adff2f\",\n                \"honeydew\": \"#f0fff0\",\n                \"hotpink\": \"#ff69b4\",\n                \"indianred \": \"#cd5c5c\",\n                \"indigo \": \"#4b0082\",\n                \"ivory\": \"#fffff0\",\n                \"khaki\": \"#f0e68c\",\n                \"lavender\": \"#e6e6fa\",\n                \"lavenderblush\": \"#fff0f5\",\n                \"lawngreen\": \"#7cfc00\",\n                \"lemonchiffon\": \"#fffacd\",\n                \"lightblue\": \"#add8e6\",\n                \"lightcoral\": \"#f08080\",\n                \"lightcyan\": \"#e0ffff\",\n                \"lightgoldenrodyellow\": \"#fafad2\",\n                \"lightgrey\": \"#d3d3d3\",\n                \"lightgreen\": \"#90ee90\",\n                \"lightpink\": \"#ffb6c1\",\n                \"lightsalmon\": \"#ffa07a\",\n                \"lightseagreen\": \"#20b2aa\",\n                \"lightskyblue\": \"#87cefa\",\n                \"lightslategray\": \"#778899\",\n                \"lightsteelblue\": \"#b0c4de\",\n                \"lightyellow\": \"#ffffe0\",\n                \"lime\": \"#00ff00\",\n                \"limegreen\": \"#32cd32\",\n                \"linen\": \"#faf0e6\",\n                \"magenta\": \"#ff00ff\",\n                \"maroon\": \"#800000\",\n                \"mediumaquamarine\": \"#66cdaa\",\n                \"mediumblue\": \"#0000cd\",\n                \"mediumorchid\": \"#ba55d3\",\n                \"mediumpurple\": \"#9370d8\",\n                \"mediumseagreen\": \"#3cb371\",\n                \"mediumslateblue\": \"#7b68ee\",\n                \"mediumspringgreen\": \"#00fa9a\",\n                \"mediumturquoise\": \"#48d1cc\",\n                \"mediumvioletred\": \"#c71585\",\n                \"midnightblue\": \"#191970\",\n                \"mintcream\": \"#f5fffa\",\n                \"mistyrose\": \"#ffe4e1\",\n                \"moccasin\": \"#ffe4b5\",\n                \"navajowhite\": \"#ffdead\",\n                \"navy\": \"#000080\",\n                \"oldlace\": \"#fdf5e6\",\n                \"olive\": \"#808000\",\n                \"olivedrab\": \"#6b8e23\",\n                \"orange\": \"#ffa500\",\n                \"orangered\": \"#ff4500\",\n                \"orchid\": \"#da70d6\",\n                \"palegoldenrod\": \"#eee8aa\",\n                \"palegreen\": \"#98fb98\",\n                \"paleturquoise\": \"#afeeee\",\n                \"palevioletred\": \"#d87093\",\n                \"papayawhip\": \"#ffefd5\",\n                \"peachpuff\": \"#ffdab9\",\n                \"peru\": \"#cd853f\",\n                \"pink\": \"#ffc0cb\",\n                \"plum\": \"#dda0dd\",\n                \"powderblue\": \"#b0e0e6\",\n                \"purple\": \"#800080\",\n                \"red\": \"#ff0000\",\n                \"rosybrown\": \"#bc8f8f\",\n                \"royalblue\": \"#4169e1\",\n                \"saddlebrown\": \"#8b4513\",\n                \"salmon\": \"#fa8072\",\n                \"sandybrown\": \"#f4a460\",\n                \"seagreen\": \"#2e8b57\",\n                \"seashell\": \"#fff5ee\",\n                \"sienna\": \"#a0522d\",\n                \"silver\": \"#c0c0c0\",\n                \"skyblue\": \"#87ceeb\",\n                \"slateblue\": \"#6a5acd\",\n                \"slategray\": \"#708090\",\n                \"snow\": \"#fffafa\",\n                \"springgreen\": \"#00ff7f\",\n                \"steelblue\": \"#4682b4\",\n                \"tan\": \"#d2b48c\",\n                \"teal\": \"#008080\",\n                \"thistle\": \"#d8bfd8\",\n                \"tomato\": \"#ff6347\",\n                \"turquoise\": \"#40e0d0\",\n                \"violet\": \"#ee82ee\",\n                \"wheat\": \"#f5deb3\",\n                \"white\": \"#ffffff\",\n                \"whitesmoke\": \"#f5f5f5\",\n                \"yellow\": \"#ffff00\",\n                \"yellowgreen\": \"#9acd32\"\n            };\n\n            if (typeof colors[name.toLowerCase()] !== 'undefined') {\n                return colors[name.toLowerCase()];\n            }\n            return false;\n        }\n    };\n\n\n    var defaults = {\n        horizontal: false, // horizontal mode layout ?\n        inline: false, //forces to show the colorpicker as an inline element\n        color: false, //forces a color\n        format: false, //forces a format\n        input: 'input', // children input selector\n        container: false, // container selector\n        component: '.add-on, .input-group-addon', // children component selector\n        sliders: {\n            saturation: {\n                maxLeft: 100,\n                maxTop: 100,\n                callLeft: 'setSaturation',\n                callTop: 'setBrightness'\n            },\n            hue: {\n                maxLeft: 0,\n                maxTop: 100,\n                callLeft: false,\n                callTop: 'setHue'\n            },\n            alpha: {\n                maxLeft: 0,\n                maxTop: 100,\n                callLeft: false,\n                callTop: 'setAlpha'\n            }\n        },\n        slidersHorz: {\n            saturation: {\n                maxLeft: 100,\n                maxTop: 100,\n                callLeft: 'setSaturation',\n                callTop: 'setBrightness'\n            },\n            hue: {\n                maxLeft: 100,\n                maxTop: 0,\n                callLeft: 'setHue',\n                callTop: false\n            },\n            alpha: {\n                maxLeft: 100,\n                maxTop: 0,\n                callLeft: 'setAlpha',\n                callTop: false\n            }\n        },\n        template: '<div class=\"colorpicker dropdown-menu\">' +\n            '<div class=\"colorpicker-saturation\"><i><b></b></i></div>' +\n            '<div class=\"colorpicker-hue\"><i></i></div>' +\n            '<div class=\"colorpicker-alpha\"><i></i></div>' +\n            '<div class=\"colorpicker-color\"><div /></div>' +\n            '</div>'\n    };\n\n    var Colorpicker = function(element, options) {\n        this.element = $(element).addClass('colorpicker-element');\n        this.options = $.extend({}, defaults, this.element.data(), options);\n        this.component = this.options.component;\n        this.component = (this.component !== false) ? this.element.find(this.component) : false;\n        if (this.component && (this.component.length === 0)) {\n            this.component = false;\n        }\n        this.container = (this.options.container === true) ? this.element : this.options.container;\n        this.container = (this.container !== false) ? $(this.container) : false;\n\n        // Is the element an input? Should we search inside for any input?\n        this.input = this.element.is('input') ? this.element : (this.options.input ?\n            this.element.find(this.options.input) : false);\n        if (this.input && (this.input.length === 0)) {\n            this.input = false;\n        }\n        // Set HSB color\n        this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());\n        this.format = this.options.format !== false ? this.options.format : this.color.origFormat;\n\n        // Setup picker\n        this.picker = $(this.options.template);\n        if (this.options.inline) {\n            this.picker.addClass('colorpicker-inline colorpicker-visible');\n        } else {\n            this.picker.addClass('colorpicker-hidden');\n        }\n        if (this.options.horizontal) {\n            this.picker.addClass('colorpicker-horizontal');\n        }\n        if (this.format === 'rgba' || this.format === 'hsla') {\n            this.picker.addClass('colorpicker-with-alpha');\n        }\n        this.picker.on('mousedown.colorpicker', $.proxy(this.mousedown, this));\n        this.picker.appendTo(this.container ? this.container : $('body'));\n\n        // Bind events\n        if (this.input !== false) {\n            this.input.on({\n                'keyup.colorpicker': $.proxy(this.keyup, this)\n            });\n            if (this.component === false) {\n                this.element.on({\n                    'focus.colorpicker': $.proxy(this.show, this)\n                });\n            }\n            if (this.options.inline === false) {\n                this.element.on({\n                    'focusout.colorpicker': $.proxy(this.hide, this)\n                });\n            }\n        }\n\n        if (this.component !== false) {\n            this.component.on({\n                'click.colorpicker': $.proxy(this.show, this)\n            });\n        }\n\n        if ((this.input === false) && (this.component === false)) {\n            this.element.on({\n                'click.colorpicker': $.proxy(this.show, this)\n            });\n        }\n        this.update();\n\n        $($.proxy(function() {\n            this.element.trigger('create');\n        }, this));\n    };\n\n    Colorpicker.version = '2.0.0-beta';\n\n    Colorpicker.Color = Color;\n\n    Colorpicker.prototype = {\n        constructor: Colorpicker,\n        destroy: function() {\n            this.picker.remove();\n            this.element.removeData('colorpicker').off('.colorpicker');\n            if (this.input !== false) {\n                this.input.off('.colorpicker');\n            }\n            if (this.component !== false) {\n                this.component.off('.colorpicker');\n            }\n            this.element.removeClass('colorpicker-element');\n            this.element.trigger({\n                type: 'destroy'\n            });\n        },\n        reposition: function() {\n            if (this.options.inline !== false) {\n                return false;\n            }\n            var offset = this.component ? this.component.offset() : this.element.offset();\n            this.picker.css({\n                top: offset.top + (this.component ? this.component.outerHeight() : this.element.outerHeight()),\n                left: offset.left\n            });\n        },\n        show: function(e) {\n            if (this.isDisabled()) {\n                return false;\n            }\n            this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');\n            this.reposition();\n            $(window).on('resize.colorpicker', $.proxy(this.reposition, this));\n            if (!this.hasInput() && e) {\n                if (e.stopPropagation && e.preventDefault) {\n                    e.stopPropagation();\n                    e.preventDefault();\n                }\n            }\n            if (this.options.inline === false) {\n                $(window.document).on({\n                    'mousedown.colorpicker': $.proxy(this.hide, this)\n                });\n            }\n            this.element.trigger({\n                type: 'showPicker',\n                color: this.color\n            });\n        },\n        hide: function() {\n            this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');\n            $(window).off('resize.colorpicker', this.reposition);\n            $(document).off({\n                'mousedown.colorpicker': this.hide\n            });\n            this.update();\n            this.element.trigger({\n                type: 'hidePicker',\n                color: this.color\n            });\n        },\n        updateData: function(val) {\n            val = val ||  this.color.toString(this.format);\n            this.element.data('color', val);\n            return val;\n        },\n        updateInput: function(val) {\n            val = val ||  this.color.toString(this.format);\n            if (this.input !== false) {\n                this.input.prop('value', val);\n            }\n            return val;\n        },\n        updatePicker: function(val) {\n            if (val !== undefined) {\n                this.color = new Color(val);\n            }\n            var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;\n            var icns = this.picker.find('i');\n            if (icns.length === 0) {\n                return;\n            }\n            if (this.options.horizontal === false) {\n                sl = this.options.sliders;\n                icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()\n                    .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));\n            } else {\n                sl = this.options.slidersHorz;\n                icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()\n                    .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));\n            }\n            icns.eq(0).css({\n                'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,\n                'left': this.color.value.s * sl.saturation.maxLeft\n            });\n            this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));\n            this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());\n            this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));\n            return val;\n        },\n        updateComponent: function(val) {\n            val = val ||  this.color.toString(this.format);\n            if (this.component !== false) {\n                var icn = this.component.find('i').eq(0);\n                if (icn.length > 0) {\n                    icn.css({\n                        'backgroundColor': val\n                    });\n                } else {\n                    this.component.css({\n                        'backgroundColor': val\n                    });\n                }\n            }\n            return val;\n        },\n        update: function(force) {\n            var val = this.updateComponent();\n            if ((this.getValue(false) !== false) || (force === true)) {\n                // Update input/data only if the current value is not blank\n                this.updateInput(val);\n                this.updateData(val);\n            }\n            this.updatePicker();\n            return val;\n\n        },\n        setValue: function(val) { // set color manually\n            this.color = new Color(val);\n            this.update();\n            this.element.trigger({\n                type: 'changeColor',\n                color: this.color,\n                value: val\n            });\n        },\n        getValue: function(defaultValue) {\n            defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;\n            var val;\n            if (this.hasInput()) {\n                val = this.input.val();\n            } else {\n                val = this.element.data('color');\n            }\n            if ((val === undefined) || (val === '') || (val === null)) {\n                // if not defined or empty, return default\n                val = defaultValue;\n            }\n            return val;\n        },\n        hasInput: function() {\n            return (this.input !== false);\n        },\n        isDisabled: function() {\n            if (this.hasInput()) {\n                return (this.input.prop('disabled') === true);\n            }\n            return false;\n        },\n        disable: function() {\n            if (this.hasInput()) {\n                this.input.prop('disabled', true);\n                return true;\n            }\n            return false;\n        },\n        enable: function() {\n            if (this.hasInput()) {\n                this.input.prop('disabled', false);\n                return true;\n            }\n            return false;\n        },\n        currentSlider: null,\n        mousePointer: {\n            left: 0,\n            top: 0\n        },\n        mousedown: function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n\n            var target = $(e.target);\n\n            //detect the slider and set the limits and callbacks\n            var zone = target.closest('div');\n            var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;\n            if (!zone.is('.colorpicker')) {\n                if (zone.is('.colorpicker-saturation')) {\n                    this.currentSlider = $.extend({}, sl.saturation);\n                } else if (zone.is('.colorpicker-hue')) {\n                    this.currentSlider = $.extend({}, sl.hue);\n                } else if (zone.is('.colorpicker-alpha')) {\n                    this.currentSlider = $.extend({}, sl.alpha);\n                } else {\n                    return false;\n                }\n                var offset = zone.offset();\n                //reference to guide's style\n                this.currentSlider.guide = zone.find('i')[0].style;\n                this.currentSlider.left = e.pageX - offset.left;\n                this.currentSlider.top = e.pageY - offset.top;\n                this.mousePointer = {\n                    left: e.pageX,\n                    top: e.pageY\n                };\n                //trigger mousemove to move the guide to the current position\n                $(document).on({\n                    'mousemove.colorpicker': $.proxy(this.mousemove, this),\n                    'mouseup.colorpicker': $.proxy(this.mouseup, this)\n                }).trigger('mousemove');\n            }\n            return false;\n        },\n        mousemove: function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            var left = Math.max(\n                0,\n                Math.min(\n                    this.currentSlider.maxLeft,\n                    this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)\n                )\n            );\n            var top = Math.max(\n                0,\n                Math.min(\n                    this.currentSlider.maxTop,\n                    this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)\n                )\n            );\n            this.currentSlider.guide.left = left + 'px';\n            this.currentSlider.guide.top = top + 'px';\n            if (this.currentSlider.callLeft) {\n                this.color[this.currentSlider.callLeft].call(this.color, left / 100);\n            }\n            if (this.currentSlider.callTop) {\n                this.color[this.currentSlider.callTop].call(this.color, top / 100);\n            }\n            this.update(true);\n\n            this.element.trigger({\n                type: 'changeColor',\n                color: this.color\n            });\n            return false;\n        },\n        mouseup: function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            $(document).off({\n                'mousemove.colorpicker': this.mousemove,\n                'mouseup.colorpicker': this.mouseup\n            });\n            return false;\n        },\n        keyup: function(e) {\n            if ((e.keyCode === 38)) {\n                if (this.color.value.a < 1) {\n                    this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;\n                }\n                this.update(true);\n            } else if ((e.keyCode === 40)) {\n                if (this.color.value.a > 0) {\n                    this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;\n                }\n                this.update(true);\n            } else {\n                var val = this.input.val();\n                this.color = new Color(val);\n                if (this.getValue(false) !== false) {\n                    this.updateData();\n                    this.updateComponent();\n                    this.updatePicker();\n                }\n            }\n            this.element.trigger({\n                type: 'changeColor',\n                color: this.color,\n                value: val\n            });\n        }\n    };\n\n    $.colorpicker = Colorpicker;\n\n    $.fn.colorpicker = function(option) {\n        return this.each(function() {\n            var $this = $(this),\n                inst = $this.data('colorpicker'),\n                options = ((typeof option === 'object') ? option : {});\n            if ((!inst) && (typeof option !== 'string')) {\n                $this.data('colorpicker', new Colorpicker(this, options));\n            } else {\n                if (typeof option === 'string') {\n                    inst[option].apply(inst, Array.prototype.slice.call(arguments, 1));\n                }\n            }\n        });\n    };\n\n    $.fn.colorpicker.constructor = Colorpicker;\n\n})(window.jQuery);\n","/**\n * @author zhixin wen <wenzhixin2010@gmail.com>\n * version: 1.9.1\n * https://github.com/wenzhixin/bootstrap-table/\n */\n\n!function ($) {\n    'use strict';\n\n    // TOOLS DEFINITION\n    // ======================\n\n    var cachedWidth = null;\n\n    // it only does '%s', and return '' when arguments are undefined\n    var sprintf = function (str) {\n        var args = arguments,\n            flag = true,\n            i = 1;\n\n        str = str.replace(/%s/g, function () {\n            var arg = args[i++];\n\n            if (typeof arg === 'undefined') {\n                flag = false;\n                return '';\n            }\n            return arg;\n        });\n        return flag ? str : '';\n    };\n\n    var getPropertyFromOther = function (list, from, to, value) {\n        var result = '';\n        $.each(list, function (i, item) {\n            if (item[from] === value) {\n                result = item[to];\n                return false;\n            }\n            return true;\n        });\n        return result;\n    };\n\n    var getFieldIndex = function (columns, field) {\n        var index = -1;\n\n        $.each(columns, function (i, column) {\n            if (column.field === field) {\n                index = i;\n                return false;\n            }\n            return true;\n        });\n        return index;\n    };\n\n    // http://jsfiddle.net/wenyi/47nz7ez9/3/\n    var setFieldIndex = function (columns) {\n        var i, j, k,\n            totalCol = 0,\n            flag = [];\n\n        for (i = 0; i < columns[0].length; i++) {\n            totalCol += columns[0][i].colspan || 1;\n        }\n\n        for (i = 0; i < columns.length; i++) {\n            flag[i] = [];\n            for (j = 0; j < totalCol; j++) {\n                flag[i][j] = false;\n            }\n        }\n\n        for (i = 0; i < columns.length; i++) {\n            for (j = 0; j < columns[i].length; j++) {\n                var r = columns[i][j],\n                    rowspan = r.rowspan || 1,\n                    colspan = r.colspan || 1,\n                    index = $.inArray(false, flag[i]);\n\n                if (colspan === 1) {\n                    r.fieldIndex = index;\n                    // when field is undefined, use index instead\n                    if (typeof r.field === 'undefined') {\n                        r.field = index;\n                    }\n                }\n\n                for (k = 0; k < rowspan; k++) {\n                    flag[i + k][index] = true;\n                }\n                for (k = 0; k < colspan; k++) {\n                    flag[i][index + k] = true;\n                }\n            }\n        }\n    };\n\n    var getScrollBarWidth = function () {\n        if (cachedWidth === null) {\n            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),\n                outer = $('<div/>').addClass('fixed-table-scroll-outer'),\n                w1, w2;\n\n            outer.append(inner);\n            $('body').append(outer);\n\n            w1 = inner[0].offsetWidth;\n            outer.css('overflow', 'scroll');\n            w2 = inner[0].offsetWidth;\n\n            if (w1 === w2) {\n                w2 = outer[0].clientWidth;\n            }\n\n            outer.remove();\n            cachedWidth = w1 - w2;\n        }\n        return cachedWidth;\n    };\n\n    var calculateObjectValue = function (self, name, args, defaultValue) {\n        var func = name;\n\n        if (typeof name === 'string') {\n            // support obj.func1.func2\n            var names = name.split('.');\n\n            if (names.length > 1) {\n                func = window;\n                $.each(names, function (i, f) {\n                    func = func[f];\n                });\n            } else {\n                func = window[name];\n            }\n        }\n        if (typeof func === 'object') {\n            return func;\n        }\n        if (typeof func === 'function') {\n            return func.apply(self, args);\n        }\n        if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {\n            return sprintf.apply(this, [name].concat(args));\n        }\n        return defaultValue;\n    };\n\n    var compareObjects = function (objectA, objectB, compareLength) {\n        // Create arrays of property names\n        var objectAProperties = Object.getOwnPropertyNames(objectA),\n            objectBProperties = Object.getOwnPropertyNames(objectB),\n            propName = '';\n\n        if (compareLength) {\n            // If number of properties is different, objects are not equivalent\n            if (objectAProperties.length !== objectBProperties.length) {\n                return false;\n            }\n        }\n\n        for (var i = 0; i < objectAProperties.length; i++) {\n            propName = objectAProperties[i];\n\n            // If the property is not in the object B properties, continue with the next property\n            if ($.inArray(propName, objectBProperties) > -1) {\n                // If values of same property are not equal, objects are not equivalent\n                if (objectA[propName] !== objectB[propName]) {\n                    return false;\n                }\n            }\n        }\n\n        // If we made it this far, objects are considered equivalent\n        return true;\n    };\n\n    var escapeHTML = function (text) {\n        if (typeof text === 'string') {\n            return text\n                .replace(/&/g, \"&amp;\")\n                .replace(/</g, \"&lt;\")\n                .replace(/>/g, \"&gt;\")\n                .replace(/\"/g, \"&quot;\")\n                .replace(/'/g, \"&#039;\");\n        }\n        return text;\n    };\n\n    var getRealHeight = function ($el) {\n        var height = 0;\n        $el.children().each(function () {\n            if (height < $(this).outerHeight(true)) {\n                height = $(this).outerHeight(true);\n            }\n        });\n        return height;\n    };\n\n    var getRealDataAttr = function (dataAttr) {\n        for (var attr in dataAttr) {\n            var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();\n            if (auxAttr !== attr) {\n                dataAttr[auxAttr] = dataAttr[attr];\n                delete dataAttr[attr];\n            }\n        }\n\n        return dataAttr;\n    };\n\n    var getItemField = function (item, field) {\n        var value = item;\n\n        if (typeof field !== 'string' || item.hasOwnProperty(field)) {\n            return item[field];\n        }\n        var props = field.split('.');\n        for (var p in props) {\n            value = value[props[p]];\n        }\n        return value;\n    };\n\n    // BOOTSTRAP TABLE CLASS DEFINITION\n    // ======================\n\n    var BootstrapTable = function (el, options) {\n        this.options = options;\n        this.$el = $(el);\n        this.$el_ = this.$el.clone();\n        this.timeoutId_ = 0;\n        this.timeoutFooter_ = 0;\n\n        this.init();\n    };\n\n    BootstrapTable.DEFAULTS = {\n        classes: 'table table-hover',\n        locale: undefined,\n        height: undefined,\n        undefinedText: '-',\n        sortName: undefined,\n        sortOrder: 'asc',\n        striped: false,\n        columns: [[]],\n        data: [],\n        dataField: 'rows',\n        method: 'get',\n        url: undefined,\n        ajax: undefined,\n        cache: true,\n        contentType: 'application/json',\n        dataType: 'json',\n        ajaxOptions: {},\n        queryParams: function (params) {\n            return params;\n        },\n        queryParamsType: 'limit', // undefined\n        responseHandler: function (res) {\n            return res;\n        },\n        pagination: false,\n        onlyInfoPagination: false,\n        sidePagination: 'client', // client or server\n        totalRows: 0, // server side need to set\n        pageNumber: 1,\n        pageSize: 10,\n        pageList: [10, 25, 50, 100],\n        paginationHAlign: 'right', //right, left\n        paginationVAlign: 'bottom', //bottom, top, both\n        paginationDetailHAlign: 'left', //right, left\n        paginationFirstText: '&laquo;',\n        paginationPreText: '&lsaquo;',\n        paginationNextText: '&rsaquo;',\n        paginationLastText: '&raquo;',\n        search: false,\n        strictSearch: false,\n        searchAlign: 'right',\n        selectItemName: 'btSelectItem',\n        showHeader: true,\n        showFooter: false,\n        showColumns: false,\n        showPaginationSwitch: false,\n        showRefresh: false,\n        showToggle: false,\n        buttonsAlign: 'right',\n        smartDisplay: true,\n        minimumCountColumns: 1,\n        idField: undefined,\n        uniqueId: undefined,\n        cardView: false,\n        detailView: false,\n        detailFormatter: function (index, row) {\n            return '';\n        },\n        trimOnSearch: true,\n        clickToSelect: false,\n        singleSelect: false,\n        toolbar: undefined,\n        toolbarAlign: 'left',\n        checkboxHeader: true,\n        sortable: true,\n        silentSort: true,\n        maintainSelected: false,\n        searchTimeOut: 500,\n        searchText: '',\n        iconSize: undefined,\n        iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome)\n        icons: {\n            paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',\n            paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',\n            refresh: 'glyphicon-refresh icon-refresh',\n            toggle: 'glyphicon-list-alt icon-list-alt',\n            columns: 'glyphicon-th icon-th',\n            detailOpen: 'glyphicon-plus icon-plus',\n            detailClose: 'glyphicon-minus icon-minus'\n        },\n\n        rowStyle: function (row, index) {\n            return {};\n        },\n\n        rowAttributes: function (row, index) {\n            return {};\n        },\n\n        onAll: function (name, args) {\n            return false;\n        },\n        onClickCell: function (field, value, row, $element) {\n            return false;\n        },\n        onDblClickCell: function (field, value, row, $element) {\n            return false;\n        },\n        onClickRow: function (item, $element) {\n            return false;\n        },\n        onDblClickRow: function (item, $element) {\n            return false;\n        },\n        onSort: function (name, order) {\n            return false;\n        },\n        onCheck: function (row) {\n            return false;\n        },\n        onUncheck: function (row) {\n            return false;\n        },\n        onCheckAll: function (rows) {\n            return false;\n        },\n        onUncheckAll: function (rows) {\n            return false;\n        },\n        onCheckSome: function (rows) {\n            return false;\n        },\n        onUncheckSome: function (rows) {\n            return false;\n        },\n        onLoadSuccess: function (data) {\n            return false;\n        },\n        onLoadError: function (status) {\n            return false;\n        },\n        onColumnSwitch: function (field, checked) {\n            return false;\n        },\n        onPageChange: function (number, size) {\n            return false;\n        },\n        onSearch: function (text) {\n            return false;\n        },\n        onToggle: function (cardView) {\n            return false;\n        },\n        onPreBody: function (data) {\n            return false;\n        },\n        onPostBody: function () {\n            return false;\n        },\n        onPostHeader: function () {\n            return false;\n        },\n        onExpandRow: function (index, row, $detail) {\n            return false;\n        },\n        onCollapseRow: function (index, row) {\n            return false;\n        },\n        onRefreshOptions: function (options) {\n            return false;\n        },\n        onResetView: function () {\n            return false;\n        }\n    };\n\n    BootstrapTable.LOCALES = [];\n\n    BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {\n        formatLoadingMessage: function () {\n            return 'Loading, please wait...';\n        },\n        formatRecordsPerPage: function (pageNumber) {\n            return sprintf('%s records per page', pageNumber);\n        },\n        formatShowingRows: function (pageFrom, pageTo, totalRows) {\n            return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows);\n        },\n        formatDetailPagination: function (totalRows) {\n            return sprintf('Showing %s rows', totalRows);\n        },\n        formatSearch: function () {\n            return 'Search';\n        },\n        formatNoMatches: function () {\n            return 'No matching records found';\n        },\n        formatPaginationSwitch: function () {\n            return 'Hide/Show pagination';\n        },\n        formatRefresh: function () {\n            return 'Refresh';\n        },\n        formatToggle: function () {\n            return 'Toggle';\n        },\n        formatColumns: function () {\n            return 'Columns';\n        },\n        formatAllRows: function () {\n            return 'All';\n        }\n    };\n\n    $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']);\n\n    BootstrapTable.COLUMN_DEFAULTS = {\n        radio: false,\n        checkbox: false,\n        checkboxEnabled: true,\n        field: undefined,\n        title: undefined,\n        titleTooltip: undefined,\n        'class': undefined,\n        align: undefined, // left, right, center\n        halign: undefined, // left, right, center\n        falign: undefined, // left, right, center\n        valign: undefined, // top, middle, bottom\n        width: undefined,\n        sortable: false,\n        order: 'asc', // asc, desc\n        visible: true,\n        switchable: true,\n        clickToSelect: true,\n        formatter: undefined,\n        footerFormatter: undefined,\n        events: undefined,\n        sorter: undefined,\n        sortName: undefined,\n        cellStyle: undefined,\n        searchable: true,\n        searchFormatter: true,\n        cardVisible: true\n    };\n\n    BootstrapTable.EVENTS = {\n        'all.bs.table': 'onAll',\n        'click-cell.bs.table': 'onClickCell',\n        'dbl-click-cell.bs.table': 'onDblClickCell',\n        'click-row.bs.table': 'onClickRow',\n        'dbl-click-row.bs.table': 'onDblClickRow',\n        'sort.bs.table': 'onSort',\n        'check.bs.table': 'onCheck',\n        'uncheck.bs.table': 'onUncheck',\n        'check-all.bs.table': 'onCheckAll',\n        'uncheck-all.bs.table': 'onUncheckAll',\n        'check-some.bs.table': 'onCheckSome',\n        'uncheck-some.bs.table': 'onUncheckSome',\n        'load-success.bs.table': 'onLoadSuccess',\n        'load-error.bs.table': 'onLoadError',\n        'column-switch.bs.table': 'onColumnSwitch',\n        'page-change.bs.table': 'onPageChange',\n        'search.bs.table': 'onSearch',\n        'toggle.bs.table': 'onToggle',\n        'pre-body.bs.table': 'onPreBody',\n        'post-body.bs.table': 'onPostBody',\n        'post-header.bs.table': 'onPostHeader',\n        'expand-row.bs.table': 'onExpandRow',\n        'collapse-row.bs.table': 'onCollapseRow',\n        'refresh-options.bs.table': 'onRefreshOptions',\n        'reset-view.bs.table': 'onResetView'\n    };\n\n    BootstrapTable.prototype.init = function () {\n        this.initLocale();\n        this.initContainer();\n        this.initTable();\n        this.initHeader();\n        this.initData();\n        this.initFooter();\n        this.initToolbar();\n        this.initPagination();\n        this.initBody();\n        this.initSearchText();\n        this.initServer();\n    };\n\n    BootstrapTable.prototype.initLocale = function () {\n        if (this.options.locale) {\n            var parts = this.options.locale.split(/-|_/);\n            parts[0].toLowerCase();\n            parts[1] && parts[1].toUpperCase();\n            if ($.fn.bootstrapTable.locales[this.options.locale]) {\n                // locale as requested\n                $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);\n            } else if ($.fn.bootstrapTable.locales[parts.join('-')]) {\n                // locale with sep set to - (in case original was specified with _)\n                $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);\n            } else if ($.fn.bootstrapTable.locales[parts[0]]) {\n                // short locale language code (i.e. 'en')\n                $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);\n            }\n        }\n    };\n\n    BootstrapTable.prototype.initContainer = function () {\n        this.$container = $([\n            '<div class=\"bootstrap-table\">',\n            '<div class=\"fixed-table-toolbar\"></div>',\n            this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?\n                '<div class=\"fixed-table-pagination\" style=\"clear: both;\"></div>' :\n                '',\n            '<div class=\"fixed-table-container\">',\n            '<div class=\"fixed-table-header\"><table></table></div>',\n            '<div class=\"fixed-table-body\">',\n            '<div class=\"fixed-table-loading\">',\n            this.options.formatLoadingMessage(),\n            '</div>',\n            '</div>',\n            '<div class=\"fixed-table-footer\"><table><tr></tr></table></div>',\n            this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?\n                '<div class=\"fixed-table-pagination\"></div>' :\n                '',\n            '</div>',\n            '</div>'\n        ].join(''));\n\n        this.$container.insertAfter(this.$el);\n        this.$tableContainer = this.$container.find('.fixed-table-container');\n        this.$tableHeader = this.$container.find('.fixed-table-header');\n        this.$tableBody = this.$container.find('.fixed-table-body');\n        this.$tableLoading = this.$container.find('.fixed-table-loading');\n        this.$tableFooter = this.$container.find('.fixed-table-footer');\n        this.$toolbar = this.$container.find('.fixed-table-toolbar');\n        this.$pagination = this.$container.find('.fixed-table-pagination');\n\n        this.$tableBody.append(this.$el);\n        this.$container.after('<div class=\"clearfix\"></div>');\n\n        this.$el.addClass(this.options.classes);\n        if (this.options.striped) {\n            this.$el.addClass('table-striped');\n        }\n        if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) {\n            this.$tableContainer.addClass('table-no-bordered');\n        }\n    };\n\n    BootstrapTable.prototype.initTable = function () {\n        var that = this,\n            columns = [],\n            data = [];\n\n        this.$header = this.$el.find('>thead');\n        if (!this.$header.length) {\n            this.$header = $('<thead></thead>').appendTo(this.$el);\n        }\n        this.$header.find('tr').each(function () {\n            var column = [];\n\n            $(this).find('th').each(function () {\n                column.push($.extend({}, {\n                    title: $(this).html(),\n                    'class': $(this).attr('class'),\n                    titleTooltip: $(this).attr('title'),\n                    rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,\n                    colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined\n                }, $(this).data()));\n            });\n            columns.push(column);\n        });\n        if (!$.isArray(this.options.columns[0])) {\n            this.options.columns = [this.options.columns];\n        }\n        this.options.columns = $.extend(true, [], columns, this.options.columns);\n        this.columns = [];\n\n        setFieldIndex(this.options.columns);\n        $.each(this.options.columns, function (i, columns) {\n            $.each(columns, function (j, column) {\n                column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column);\n\n                if (typeof column.fieldIndex !== 'undefined') {\n                    that.columns[column.fieldIndex] = column;\n                }\n\n                that.options.columns[i][j] = column;\n            });\n        });\n\n        // if options.data is setting, do not process tbody data\n        if (this.options.data.length) {\n            return;\n        }\n\n        this.$el.find('>tbody>tr').each(function () {\n            var row = {};\n\n            // save tr's id, class and data-* attributes\n            row._id = $(this).attr('id');\n            row._class = $(this).attr('class');\n            row._data = getRealDataAttr($(this).data());\n\n            $(this).find('td').each(function (i) {\n                var field = that.columns[i].field;\n\n                row[field] = $(this).html();\n                // save td's id, class and data-* attributes\n                row['_' + field + '_id'] = $(this).attr('id');\n                row['_' + field + '_class'] = $(this).attr('class');\n                row['_' + field + '_rowspan'] = $(this).attr('rowspan');\n                row['_' + field + '_title'] = $(this).attr('title');\n                row['_' + field + '_data'] = getRealDataAttr($(this).data());\n            });\n            data.push(row);\n        });\n        this.options.data = data;\n    };\n\n    BootstrapTable.prototype.initHeader = function () {\n        var that = this,\n            visibleColumns = {},\n            html = [];\n\n        this.header = {\n            fields: [],\n            styles: [],\n            classes: [],\n            formatters: [],\n            events: [],\n            sorters: [],\n            sortNames: [],\n            cellStyles: [],\n            searchables: []\n        };\n\n        $.each(this.options.columns, function (i, columns) {\n            html.push('<tr>');\n\n            if (i == 0 && !that.options.cardView && that.options.detailView) {\n                html.push(sprintf('<th class=\"detail\" rowspan=\"%s\"><div class=\"fht-cell\"></div></th>',\n                    that.options.columns.length));\n            }\n\n            $.each(columns, function (j, column) {\n                var text = '',\n                    halign = '', // header align style\n                    align = '', // body align style\n                    style = '',\n                    class_ = sprintf(' class=\"%s\"', column['class']),\n                    order = that.options.sortOrder || column.order,\n                    unitWidth = 'px',\n                    width = column.width;\n\n                if (column.width !== undefined && (!that.options.cardView)) {\n                    if (typeof column.width === 'string') {\n                        if (column.width.indexOf('%') !== -1) {\n                            unitWidth = '%';\n                        }\n                    }\n                }\n                if (column.width && typeof column.width === 'string') {\n                    width = column.width.replace('%', '').replace('px', '');\n                }\n\n                halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align);\n                align = sprintf('text-align: %s; ', column.align);\n                style = sprintf('vertical-align: %s; ', column.valign);\n                style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ?\n                    '36px' : (width ? width + unitWidth : undefined));\n\n                if (typeof column.fieldIndex !== 'undefined') {\n                    that.header.fields[column.fieldIndex] = column.field;\n                    that.header.styles[column.fieldIndex] = align + style;\n                    that.header.classes[column.fieldIndex] = class_;\n                    that.header.formatters[column.fieldIndex] = column.formatter;\n                    that.header.events[column.fieldIndex] = column.events;\n                    that.header.sorters[column.fieldIndex] = column.sorter;\n                    that.header.sortNames[column.fieldIndex] = column.sortName;\n                    that.header.cellStyles[column.fieldIndex] = column.cellStyle;\n                    that.header.searchables[column.fieldIndex] = column.searchable;\n\n                    if (!column.visible) {\n                        return;\n                    }\n\n                    if (that.options.cardView && (!column.cardVisible)) {\n                        return;\n                    }\n\n                    visibleColumns[column.field] = column;\n                }\n\n                html.push('<th' + sprintf(' title=\"%s\"', column.titleTooltip),\n                    column.checkbox || column.radio ?\n                        sprintf(' class=\"bs-checkbox %s\"', column['class'] || '') :\n                        class_,\n                    sprintf(' style=\"%s\"', halign + style),\n                    sprintf(' rowspan=\"%s\"', column.rowspan),\n                    sprintf(' colspan=\"%s\"', column.colspan),\n                    sprintf(' data-field=\"%s\"', column.field),\n                    \"tabindex='0'\",\n                    '>');\n\n                html.push(sprintf('<div class=\"th-inner %s\">', that.options.sortable && column.sortable ?\n                    'sortable both' : ''));\n\n                text = column.title;\n\n                if (column.checkbox) {\n                    if (!that.options.singleSelect && that.options.checkboxHeader) {\n                        text = '<input name=\"btSelectAll\" type=\"checkbox\" />';\n                    }\n                    that.header.stateField = column.field;\n                }\n                if (column.radio) {\n                    text = '';\n                    that.header.stateField = column.field;\n                    that.options.singleSelect = true;\n                }\n\n                html.push(text);\n                html.push('</div>');\n                html.push('<div class=\"fht-cell\"></div>');\n                html.push('</div>');\n                html.push('</th>');\n            });\n            html.push('</tr>');\n        });\n\n        this.$header.html(html.join(''));\n        this.$header.find('th[data-field]').each(function (i) {\n            $(this).data(visibleColumns[$(this).data('field')]);\n        });\n        this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {\n            if (that.options.sortable && $(this).parent().data().sortable) {\n                that.onSort(event);\n            }\n        });\n\n        this.$header.children().children().off('keypress').on('keypress', function (event) {\n            if (that.options.sortable && $(this).data().sortable) {\n                var code = event.keyCode || event.which;\n                if (code == 13) { //Enter keycode\n                    that.onSort(event);\n                }\n            }\n        });\n\n        if (!this.options.showHeader || this.options.cardView) {\n            this.$header.hide();\n            this.$tableHeader.hide();\n            this.$tableLoading.css('top', 0);\n        } else {\n            this.$header.show();\n            this.$tableHeader.show();\n            this.$tableLoading.css('top', this.$header.outerHeight() + 1);\n            // Assign the correct sortable arrow\n            this.getCaret();\n        }\n\n        this.$selectAll = this.$header.find('[name=\"btSelectAll\"]');\n        this.$container.off('click', '[name=\"btSelectAll\"]')\n            .on('click', '[name=\"btSelectAll\"]', function () {\n                var checked = $(this).prop('checked');\n                that[checked ? 'checkAll' : 'uncheckAll']();\n                that.updateSelected();\n            });\n    };\n\n    BootstrapTable.prototype.initFooter = function () {\n        if (!this.options.showFooter || this.options.cardView) {\n            this.$tableFooter.hide();\n        } else {\n            this.$tableFooter.show();\n        }\n    };\n\n    /**\n     * @param data\n     * @param type: append / prepend\n     */\n    BootstrapTable.prototype.initData = function (data, type) {\n        if (type === 'append') {\n            this.data = this.data.concat(data);\n        } else if (type === 'prepend') {\n            this.data = [].concat(data).concat(this.data);\n        } else {\n            this.data = data || this.options.data;\n        }\n\n        // Fix #839 Records deleted when adding new row on filtered table\n        if (type === 'append') {\n            this.options.data = this.options.data.concat(data);\n        } else if (type === 'prepend') {\n            this.options.data = [].concat(data).concat(this.options.data);\n        } else {\n            this.options.data = this.data;\n        }\n\n        if (this.options.sidePagination === 'server') {\n            return;\n        }\n        this.initSort();\n    };\n\n    BootstrapTable.prototype.initSort = function () {\n        var that = this,\n            name = this.options.sortName,\n            order = this.options.sortOrder === 'desc' ? -1 : 1,\n            index = $.inArray(this.options.sortName, this.header.fields);\n\n        if (index !== -1) {\n            this.data.sort(function (a, b) {\n                if (that.header.sortNames[index]) {\n                    name = that.header.sortNames[index];\n                }\n                var aa = getItemField(a, name),\n                    bb = getItemField(b, name),\n                    value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]);\n\n                if (value !== undefined) {\n                    return order * value;\n                }\n\n                // Fix #161: undefined or null string sort bug.\n                if (aa === undefined || aa === null) {\n                    aa = '';\n                }\n                if (bb === undefined || bb === null) {\n                    bb = '';\n                }\n\n                // IF both values are numeric, do a numeric comparison\n                if ($.isNumeric(aa) && $.isNumeric(bb)) {\n                    // Convert numerical values form string to float.\n                    aa = parseFloat(aa);\n                    bb = parseFloat(bb);\n                    if (aa < bb) {\n                        return order * -1;\n                    }\n                    return order;\n                }\n\n                if (aa === bb) {\n                    return 0;\n                }\n\n                // If value is not a string, convert to string\n                if (typeof aa !== 'string') {\n                    aa = aa.toString();\n                }\n\n                if (aa.localeCompare(bb) === -1) {\n                    return order * -1;\n                }\n\n                return order;\n            });\n        }\n    };\n\n    BootstrapTable.prototype.onSort = function (event) {\n        var $this = event.type === \"keypress\" ? $(event.currentTarget) : $(event.currentTarget).parent(),\n            $this_ = this.$header.find('th').eq($this.index());\n\n        this.$header.add(this.$header_).find('span.order').remove();\n\n        if (this.options.sortName === $this.data('field')) {\n            this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';\n        } else {\n            this.options.sortName = $this.data('field');\n            this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';\n        }\n        this.trigger('sort', this.options.sortName, this.options.sortOrder);\n\n        $this.add($this_).data('order', this.options.sortOrder);\n\n        // Assign the correct sortable arrow\n        this.getCaret();\n\n        if (this.options.sidePagination === 'server') {\n            this.initServer(this.options.silentSort);\n            return;\n        }\n\n        this.initSort();\n        this.initBody();\n    };\n\n    BootstrapTable.prototype.initToolbar = function () {\n        var that = this,\n            html = [],\n            timeoutId = 0,\n            $keepOpen,\n            $search,\n            switchableCount = 0;\n\n        this.$toolbar.html('');\n\n        if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {\n            $(sprintf('<div class=\"bars pull-%s\"></div>', this.options.toolbarAlign))\n                .appendTo(this.$toolbar)\n                .append($(this.options.toolbar));\n        }\n\n        // showColumns, showToggle, showRefresh\n        html = [sprintf('<div class=\"columns columns-%s btn-group pull-%s\">',\n            this.options.buttonsAlign, this.options.buttonsAlign)];\n\n        if (typeof this.options.icons === 'string') {\n            this.options.icons = calculateObjectValue(null, this.options.icons);\n        }\n\n        if (this.options.showPaginationSwitch) {\n            html.push(sprintf('<button class=\"btn btn-default\" type=\"button\" name=\"paginationSwitch\" title=\"%s\">',\n                    this.options.formatPaginationSwitch()),\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),\n                '</button>');\n        }\n\n        if (this.options.showRefresh) {\n            html.push(sprintf('<button class=\"btn btn-default' +\n                    sprintf(' btn-%s', this.options.iconSize) +\n                    '\" type=\"button\" name=\"refresh\" title=\"%s\">',\n                    this.options.formatRefresh()),\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.refresh),\n                '</button>');\n        }\n\n        if (this.options.showToggle) {\n            html.push(sprintf('<button class=\"btn btn-default' +\n                    sprintf(' btn-%s', this.options.iconSize) +\n                    '\" type=\"button\" name=\"toggle\" title=\"%s\">',\n                    this.options.formatToggle()),\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.toggle),\n                '</button>');\n        }\n\n        if (this.options.showColumns) {\n            html.push(sprintf('<div class=\"keep-open btn-group\" title=\"%s\">',\n                    this.options.formatColumns()),\n                '<button type=\"button\" class=\"btn btn-default' +\n                sprintf(' btn-%s', this.options.iconSize) +\n                ' dropdown-toggle\" data-toggle=\"dropdown\">',\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.columns),\n                ' <span class=\"caret\"></span>',\n                '</button>',\n                '<ul class=\"dropdown-menu\" role=\"menu\">');\n\n            $.each(this.columns, function (i, column) {\n                if (column.radio || column.checkbox) {\n                    return;\n                }\n\n                if (that.options.cardView && (!column.cardVisible)) {\n                    return;\n                }\n\n                var checked = column.visible ? ' checked=\"checked\"' : '';\n\n                if (column.switchable) {\n                    html.push(sprintf('<li>' +\n                        '<label><input type=\"checkbox\" data-field=\"%s\" value=\"%s\"%s> %s</label>' +\n                        '</li>', column.field, i, checked, column.title));\n                    switchableCount++;\n                }\n            });\n            html.push('</ul>',\n                '</div>');\n        }\n\n        html.push('</div>');\n\n        // Fix #188: this.showToolbar is for extentions\n        if (this.showToolbar || html.length > 2) {\n            this.$toolbar.append(html.join(''));\n        }\n\n        if (this.options.showPaginationSwitch) {\n            this.$toolbar.find('button[name=\"paginationSwitch\"]')\n                .off('click').on('click', $.proxy(this.togglePagination, this));\n        }\n\n        if (this.options.showRefresh) {\n            this.$toolbar.find('button[name=\"refresh\"]')\n                .off('click').on('click', $.proxy(this.refresh, this));\n        }\n\n        if (this.options.showToggle) {\n            this.$toolbar.find('button[name=\"toggle\"]')\n                .off('click').on('click', function () {\n                    that.toggleView();\n                });\n        }\n\n        if (this.options.showColumns) {\n            $keepOpen = this.$toolbar.find('.keep-open');\n\n            if (switchableCount <= this.options.minimumCountColumns) {\n                $keepOpen.find('input').prop('disabled', true);\n            }\n\n            $keepOpen.find('li').off('click').on('click', function (event) {\n                event.stopImmediatePropagation();\n            });\n            $keepOpen.find('input').off('click').on('click', function () {\n                var $this = $(this);\n\n                that.toggleColumn(getFieldIndex(that.columns,\n                    $(this).data('field')), $this.prop('checked'), false);\n                that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));\n            });\n        }\n\n        if (this.options.search) {\n            html = [];\n            html.push(\n                '<div class=\"pull-' + this.options.searchAlign + ' search\">',\n                sprintf('<input class=\"form-control' +\n                    sprintf(' input-%s', this.options.iconSize) +\n                    '\" type=\"text\" placeholder=\"%s\">',\n                    this.options.formatSearch()),\n                '</div>');\n\n            this.$toolbar.append(html.join(''));\n            $search = this.$toolbar.find('.search input');\n            $search.off('keyup drop').on('keyup drop', function (event) {\n                clearTimeout(timeoutId); // doesn't matter if it's 0\n                timeoutId = setTimeout(function () {\n                    that.onSearch(event);\n                }, that.options.searchTimeOut);\n            });\n        }\n    };\n\n    BootstrapTable.prototype.onSearch = function (event) {\n        var text = $.trim($(event.currentTarget).val());\n\n        // trim search input\n        if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {\n            $(event.currentTarget).val(text);\n        }\n\n        if (text === this.searchText) {\n            return;\n        }\n        this.searchText = text;\n\n        this.options.pageNumber = 1;\n        this.initSearch();\n        this.updatePagination();\n        this.trigger('search', text);\n    };\n\n    BootstrapTable.prototype.initSearch = function () {\n        var that = this;\n\n        if (this.options.sidePagination !== 'server') {\n            var s = this.searchText && this.searchText.toLowerCase();\n            var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns;\n\n            // Check filter\n            this.data = f ? $.grep(this.options.data, function (item, i) {\n                for (var key in f) {\n                    if ($.isArray(f[key])) {\n                        if ($.inArray(item[key], f[key]) === -1) {\n                            return false;\n                        }\n                    } else if (item[key] !== f[key]) {\n                        return false;\n                    }\n                }\n                return true;\n            }) : this.options.data;\n\n            this.data = s ? $.grep(this.data, function (item, i) {\n                for (var key in item) {\n                    key = $.isNumeric(key) ? parseInt(key, 10) : key;\n                    var value = item[key],\n                        column = that.columns[getFieldIndex(that.columns, key)],\n                        j = $.inArray(key, that.header.fields);\n\n                    // Fix #142: search use formated data\n                    if (column && column.searchFormatter) {\n                        value = calculateObjectValue(column,\n                            that.header.formatters[j], [value, item, i], value);\n                    }\n\n                    var index = $.inArray(key, that.header.fields);\n                    if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {\n                        if (that.options.strictSearch) {\n                            if ((value + '').toLowerCase() === s) {\n                                return true;\n                            }\n                        } else {\n                            if ((value + '').toLowerCase().indexOf(s) !== -1) {\n                                return true;\n                            }\n                        }\n                    }\n                }\n                return false;\n            }) : this.data;\n        }\n    };\n\n    BootstrapTable.prototype.initPagination = function () {\n        if (!this.options.pagination) {\n            this.$pagination.hide();\n            return;\n        } else {\n            this.$pagination.show();\n        }\n\n        var that = this,\n            html = [],\n            $allSelected = false,\n            i, from, to,\n            $pageList,\n            $first, $pre,\n            $next, $last,\n            $number,\n            data = this.getData();\n\n        if (this.options.sidePagination !== 'server') {\n            this.options.totalRows = data.length;\n        }\n\n        this.totalPages = 0;\n        if (this.options.totalRows) {\n            if (this.options.pageSize === this.options.formatAllRows()) {\n                this.options.pageSize = this.options.totalRows;\n                $allSelected = true;\n            } else if (this.options.pageSize === this.options.totalRows) {\n                // Fix #667 Table with pagination,\n                // multiple pages and a search that matches to one page throws exception\n                var pageLst = typeof this.options.pageList === 'string' ?\n                    this.options.pageList.replace('[', '').replace(']', '')\n                        .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList;\n                if ($.inArray(this.options.formatAllRows().toLowerCase(), pageLst)  > -1) {\n                    $allSelected = true;\n                }\n            }\n\n            this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1;\n\n            this.options.totalPages = this.totalPages;\n        }\n        if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) {\n            this.options.pageNumber = this.totalPages;\n        }\n\n        this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1;\n        this.pageTo = this.options.pageNumber * this.options.pageSize;\n        if (this.pageTo > this.options.totalRows) {\n            this.pageTo = this.options.totalRows;\n        }\n\n        html.push(\n            '<div class=\"pull-' + this.options.paginationDetailHAlign + ' pagination-detail\">',\n            '<span class=\"pagination-info\">',\n            this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) :\n            this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows),\n            '</span>');\n\n        if (!this.options.onlyInfoPagination) {\n            html.push('<span class=\"page-list\">');\n\n            var pageNumber = [\n                    sprintf('<span class=\"btn-group %s\">',\n                        this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?\n                            'dropdown' : 'dropup'),\n                    '<button type=\"button\" class=\"btn btn-default ' +\n                    sprintf(' btn-%s', this.options.iconSize) +\n                    ' dropdown-toggle\" data-toggle=\"dropdown\">',\n                    '<span class=\"page-size\">',\n                    $allSelected ? this.options.formatAllRows() : this.options.pageSize,\n                    '</span>',\n                    ' <span class=\"caret\"></span>',\n                    '</button>',\n                    '<ul class=\"dropdown-menu\" role=\"menu\">'\n                ],\n                pageList = this.options.pageList;\n\n            if (typeof this.options.pageList === 'string') {\n                var list = this.options.pageList.replace('[', '').replace(']', '')\n                    .replace(/ /g, '').split(',');\n\n                pageList = [];\n                $.each(list, function (i, value) {\n                    pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ?\n                        that.options.formatAllRows() : +value);\n                });\n            }\n\n            $.each(pageList, function (i, page) {\n                if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) {\n                    var active;\n                    if ($allSelected) {\n                        active = page === that.options.formatAllRows() ? ' class=\"active\"' : '';\n                    } else {\n                        active = page === that.options.pageSize ? ' class=\"active\"' : '';\n                    }\n                    pageNumber.push(sprintf('<li%s><a href=\"javascript:void(0)\">%s</a></li>', active, page));\n                }\n            });\n            pageNumber.push('</ul></span>');\n\n            html.push(this.options.formatRecordsPerPage(pageNumber.join('')));\n            html.push('</span>');\n\n            html.push('</div>',\n                '<div class=\"pull-' + this.options.paginationHAlign + ' pagination\">',\n                '<ul class=\"pagination' + sprintf(' pagination-%s', this.options.iconSize) + '\">',\n                '<li class=\"page-first\"><a href=\"javascript:void(0)\">' + this.options.paginationFirstText + '</a></li>',\n                '<li class=\"page-pre\"><a href=\"javascript:void(0)\">' + this.options.paginationPreText + '</a></li>');\n\n            if (this.totalPages < 5) {\n                from = 1;\n                to = this.totalPages;\n            } else {\n                from = this.options.pageNumber - 2;\n                to = from + 4;\n                if (from < 1) {\n                    from = 1;\n                    to = 5;\n                }\n                if (to > this.totalPages) {\n                    to = this.totalPages;\n                    from = to - 4;\n                }\n            }\n            for (i = from; i <= to; i++) {\n                html.push('<li class=\"page-number' + (i === this.options.pageNumber ? ' active' : '') + '\">',\n                    '<a href=\"javascript:void(0)\">', i, '</a>',\n                    '</li>');\n            }\n\n            html.push(\n                '<li class=\"page-next\"><a href=\"javascript:void(0)\">' + this.options.paginationNextText + '</a></li>',\n                '<li class=\"page-last\"><a href=\"javascript:void(0)\">' + this.options.paginationLastText + '</a></li>',\n                '</ul>',\n                '</div>');\n\n        }\n        this.$pagination.html(html.join(''));\n\n        if (!this.options.onlyInfoPagination) {\n            $pageList = this.$pagination.find('.page-list a');\n            $first = this.$pagination.find('.page-first');\n            $pre = this.$pagination.find('.page-pre');\n            $next = this.$pagination.find('.page-next');\n            $last = this.$pagination.find('.page-last');\n            $number = this.$pagination.find('.page-number');\n\n            if (this.options.pageNumber <= 1) {\n                $first.addClass('disabled');\n                $pre.addClass('disabled');\n            }\n            if (this.options.pageNumber >= this.totalPages) {\n                $next.addClass('disabled');\n                $last.addClass('disabled');\n            }\n            if (this.options.smartDisplay) {\n                if (this.totalPages <= 1) {\n                    this.$pagination.find('div.pagination').hide();\n                }\n                if (pageList.length < 2 || this.options.totalRows <= pageList[0]) {\n                    this.$pagination.find('span.page-list').hide();\n                }\n\n                // when data is empty, hide the pagination\n                this.$pagination[this.getData().length ? 'show' : 'hide']();\n            }\n            if ($allSelected) {\n                this.options.pageSize = this.options.formatAllRows();\n            }\n            $pageList.off('click').on('click', $.proxy(this.onPageListChange, this));\n            $first.off('click').on('click', $.proxy(this.onPageFirst, this));\n            $pre.off('click').on('click', $.proxy(this.onPagePre, this));\n            $next.off('click').on('click', $.proxy(this.onPageNext, this));\n            $last.off('click').on('click', $.proxy(this.onPageLast, this));\n            $number.off('click').on('click', $.proxy(this.onPageNumber, this));\n        }\n    };\n\n    BootstrapTable.prototype.updatePagination = function (event) {\n        // Fix #171: IE disabled button can be clicked bug.\n        if (event && $(event.currentTarget).hasClass('disabled')) {\n            return;\n        }\n\n        if (!this.options.maintainSelected) {\n            this.resetRows();\n        }\n\n        this.initPagination();\n        if (this.options.sidePagination === 'server') {\n            this.initServer();\n        } else {\n            this.initBody();\n        }\n\n        this.trigger('page-change', this.options.pageNumber, this.options.pageSize);\n    };\n\n    BootstrapTable.prototype.onPageListChange = function (event) {\n        var $this = $(event.currentTarget);\n\n        $this.parent().addClass('active').siblings().removeClass('active');\n        this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?\n            this.options.formatAllRows() : +$this.text();\n        this.$toolbar.find('.page-size').text(this.options.pageSize);\n\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageFirst = function (event) {\n        this.options.pageNumber = 1;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPagePre = function (event) {\n        this.options.pageNumber--;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageNext = function (event) {\n        this.options.pageNumber++;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageLast = function (event) {\n        this.options.pageNumber = this.totalPages;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageNumber = function (event) {\n        if (this.options.pageNumber === +$(event.currentTarget).text()) {\n            return;\n        }\n        this.options.pageNumber = +$(event.currentTarget).text();\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.initBody = function (fixedScroll) {\n        var that = this,\n            html = [],\n            data = this.getData();\n\n        this.trigger('pre-body', data);\n\n        this.$body = this.$el.find('>tbody');\n        if (!this.$body.length) {\n            this.$body = $('<tbody></tbody>').appendTo(this.$el);\n        }\n\n        //Fix #389 Bootstrap-table-flatJSON is not working\n\n        if (!this.options.pagination || this.options.sidePagination === 'server') {\n            this.pageFrom = 1;\n            this.pageTo = data.length;\n        }\n\n        for (var i = this.pageFrom - 1; i < this.pageTo; i++) {\n            var key,\n                item = data[i],\n                style = {},\n                csses = [],\n                data_ = '',\n                attributes = {},\n                htmlAttributes = [];\n\n            style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);\n\n            if (style && style.css) {\n                for (key in style.css) {\n                    csses.push(key + ': ' + style.css[key]);\n                }\n            }\n\n            attributes = calculateObjectValue(this.options,\n                this.options.rowAttributes, [item, i], attributes);\n\n            if (attributes) {\n                for (key in attributes) {\n                    htmlAttributes.push(sprintf('%s=\"%s\"', key, escapeHTML(attributes[key])));\n                }\n            }\n\n            if (item._data && !$.isEmptyObject(item._data)) {\n                $.each(item._data, function (k, v) {\n                    // ignore data-index\n                    if (k === 'index') {\n                        return;\n                    }\n                    data_ += sprintf(' data-%s=\"%s\"', k, v);\n                });\n            }\n\n            html.push('<tr',\n                sprintf(' %s', htmlAttributes.join(' ')),\n                sprintf(' id=\"%s\"', $.isArray(item) ? undefined : item._id),\n                sprintf(' class=\"%s\"', style.classes || ($.isArray(item) ? undefined : item._class)),\n                sprintf(' data-index=\"%s\"', i),\n                sprintf(' data-uniqueid=\"%s\"', item[this.options.uniqueId]),\n                sprintf('%s', data_),\n                '>'\n            );\n\n            if (this.options.cardView) {\n                html.push(sprintf('<td colspan=\"%s\">', this.header.fields.length));\n            }\n\n            if (!this.options.cardView && this.options.detailView) {\n                html.push('<td>',\n                    '<a class=\"detail-icon\" href=\"javascript:\">',\n                    sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),\n                    '</a>',\n                    '</td>');\n            }\n\n            $.each(this.header.fields, function (j, field) {\n                var text = '',\n                    value = getItemField(item, field),\n                    type = '',\n                    cellStyle = {},\n                    id_ = '',\n                    class_ = that.header.classes[j],\n                    data_ = '',\n                    rowspan_ = '',\n                    title_ = '',\n                    column = that.columns[getFieldIndex(that.columns, field)];\n\n                if (!column.visible) {\n                    return;\n                }\n\n                style = sprintf('style=\"%s\"', csses.concat(that.header.styles[j]).join('; '));\n\n                value = calculateObjectValue(column,\n                    that.header.formatters[j], [value, item, i], value);\n\n                // handle td's id and class\n                if (item['_' + field + '_id']) {\n                    id_ = sprintf(' id=\"%s\"', item['_' + field + '_id']);\n                }\n                if (item['_' + field + '_class']) {\n                    class_ = sprintf(' class=\"%s\"', item['_' + field + '_class']);\n                }\n                if (item['_' + field + '_rowspan']) {\n                    rowspan_ = sprintf(' rowspan=\"%s\"', item['_' + field + '_rowspan']);\n                }\n                if (item['_' + field + '_title']) {\n                    title_ = sprintf(' title=\"%s\"', item['_' + field + '_title']);\n                }\n                cellStyle = calculateObjectValue(that.header,\n                    that.header.cellStyles[j], [value, item, i], cellStyle);\n                if (cellStyle.classes) {\n                    class_ = sprintf(' class=\"%s\"', cellStyle.classes);\n                }\n                if (cellStyle.css) {\n                    var csses_ = [];\n                    for (var key in cellStyle.css) {\n                        csses_.push(key + ': ' + cellStyle.css[key]);\n                    }\n                    style = sprintf('style=\"%s\"', csses_.concat(that.header.styles[j]).join('; '));\n                }\n\n                if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {\n                    $.each(item['_' + field + '_data'], function (k, v) {\n                        // ignore data-index\n                        if (k === 'index') {\n                            return;\n                        }\n                        data_ += sprintf(' data-%s=\"%s\"', k, v);\n                    });\n                }\n\n                if (column.checkbox || column.radio) {\n                    type = column.checkbox ? 'checkbox' : type;\n                    type = column.radio ? 'radio' : type;\n\n                    text = [that.options.cardView ?\n                        '<div class=\"card-view\">' : '<td class=\"bs-checkbox\">',\n                        '<input' +\n                        sprintf(' data-index=\"%s\"', i) +\n                        sprintf(' name=\"%s\"', that.options.selectItemName) +\n                        sprintf(' type=\"%s\"', type) +\n                        sprintf(' value=\"%s\"', item[that.options.idField]) +\n                        sprintf(' checked=\"%s\"', value === true ||\n                        (value && value.checked) ? 'checked' : undefined) +\n                        sprintf(' disabled=\"%s\"', !column.checkboxEnabled ||\n                        (value && value.disabled) ? 'disabled' : undefined) +\n                        ' />',\n                        that.header.formatters[j] && typeof value === 'string' ? value : '',\n                        that.options.cardView ? '</div>' : '</td>'\n                    ].join('');\n\n                    item[that.header.stateField] = value === true || (value && value.checked);\n                } else {\n                    value = typeof value === 'undefined' || value === null ?\n                        that.options.undefinedText : value;\n\n                    text = that.options.cardView ? ['<div class=\"card-view\">',\n                        that.options.showHeader ? sprintf('<span class=\"title\" %s>%s</span>', style,\n                            getPropertyFromOther(that.columns, 'field', 'title', field)) : '',\n                        sprintf('<span class=\"value\">%s</span>', value),\n                        '</div>'\n                    ].join('') : [sprintf('<td%s %s %s %s %s %s>', id_, class_, style, data_, rowspan_, title_),\n                        value,\n                        '</td>'\n                    ].join('');\n\n                    // Hide empty data on Card view when smartDisplay is set to true.\n                    if (that.options.cardView && that.options.smartDisplay && value === '') {\n                        // Should set a placeholder for event binding correct fieldIndex\n                        text = '<div class=\"card-view\"></div>';\n                    }\n                }\n\n                html.push(text);\n            });\n\n            if (this.options.cardView) {\n                html.push('</td>');\n            }\n\n            html.push('</tr>');\n        }\n\n        // show no records\n        if (!html.length) {\n            html.push('<tr class=\"no-records-found\">',\n                sprintf('<td colspan=\"%s\">%s</td>',\n                    this.$header.find('th').length, this.options.formatNoMatches()),\n                '</tr>');\n        }\n\n        this.$body.html(html.join(''));\n\n        if (!fixedScroll) {\n            this.scrollTo(0);\n        }\n\n        // click to select by column\n        this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {\n            var $td = $(this),\n                $tr = $td.parent(),\n                item = that.data[$tr.data('index')],\n                index = $td[0].cellIndex,\n                field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],\n                column = that.columns[getFieldIndex(that.columns, field)],\n                value = getItemField(item, field);\n\n            if ($td.find('.detail-icon').length) {\n                return;\n            }\n\n            that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);\n            that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);\n\n            // if click to select - then trigger the checkbox/radio click\n            if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {\n                var $selectItem = $tr.find(sprintf('[name=\"%s\"]', that.options.selectItemName));\n                if ($selectItem.length) {\n                    $selectItem[0].click(); // #144: .trigger('click') bug\n                }\n            }\n        });\n\n        this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {\n            var $this = $(this),\n                $tr = $this.parent().parent(),\n                index = $tr.data('index'),\n                row = data[index]; // Fix #980 Detail view, when searching, returns wrong row\n\n            // remove and update\n            if ($tr.next().is('tr.detail-view')) {\n                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));\n                $tr.next().remove();\n                that.trigger('collapse-row', index, row);\n            } else {\n                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));\n                $tr.after(sprintf('<tr class=\"detail-view\"><td colspan=\"%s\">%s</td></tr>',\n                    $tr.find('td').length, calculateObjectValue(that.options,\n                        that.options.detailFormatter, [index, row], '')));\n                that.trigger('expand-row', index, row, $tr.next().find('td'));\n            }\n            that.resetView();\n        });\n\n        this.$selectItem = this.$body.find(sprintf('[name=\"%s\"]', this.options.selectItemName));\n        this.$selectItem.off('click').on('click', function (event) {\n            event.stopImmediatePropagation();\n\n            var $this = $(this),\n                checked = $this.prop('checked'),\n                row = that.data[$this.data('index')];\n\n            if (that.options.maintainSelected && $(this).is(':radio')) {\n                $.each(that.options.data, function (i, row) {\n                    row[that.header.stateField] = false;\n                });\n            }\n\n            row[that.header.stateField] = checked;\n\n            if (that.options.singleSelect) {\n                that.$selectItem.not(this).each(function () {\n                    that.data[$(this).data('index')][that.header.stateField] = false;\n                });\n                that.$selectItem.filter(':checked').not(this).prop('checked', false);\n            }\n\n            that.updateSelected();\n            that.trigger(checked ? 'check' : 'uncheck', row, $this);\n        });\n\n        $.each(this.header.events, function (i, events) {\n            if (!events) {\n                return;\n            }\n            // fix bug, if events is defined with namespace\n            if (typeof events === 'string') {\n                events = calculateObjectValue(null, events);\n            }\n\n            var field = that.header.fields[i],\n                fieldIndex = $.inArray(field, that.getVisibleFields());\n\n            if (that.options.detailView && !that.options.cardView) {\n                fieldIndex += 1;\n            }\n\n            for (var key in events) {\n                that.$body.find('>tr:not(.no-records-found)').each(function () {\n                    var $tr = $(this),\n                        $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),\n                        index = key.indexOf(' '),\n                        name = key.substring(0, index),\n                        el = key.substring(index + 1),\n                        func = events[key];\n\n                    $td.find(el).off(name).on(name, function (e) {\n                        var index = $tr.data('index'),\n                            row = that.data[index],\n                            value = row[field];\n\n                        func.apply(this, [e, value, row, index]);\n                    });\n                });\n            }\n        });\n\n        this.updateSelected();\n        this.resetView();\n\n        this.trigger('post-body');\n    };\n\n    BootstrapTable.prototype.initServer = function (silent, query) {\n        var that = this,\n            data = {},\n            params = {\n                pageSize: this.options.pageSize === this.options.formatAllRows() ?\n                    this.options.totalRows : this.options.pageSize,\n                pageNumber: this.options.pageNumber,\n                searchText: this.searchText,\n                sortName: this.options.sortName,\n                sortOrder: this.options.sortOrder\n            },\n            request;\n\n        if (!this.options.url && !this.options.ajax) {\n            return;\n        }\n\n        if (this.options.queryParamsType === 'limit') {\n            params = {\n                search: params.searchText,\n                sort: params.sortName,\n                order: params.sortOrder\n            };\n            if (this.options.pagination) {\n                params.limit = this.options.pageSize === this.options.formatAllRows() ?\n                    this.options.totalRows : this.options.pageSize;\n                params.offset = this.options.pageSize === this.options.formatAllRows() ?\n                    0 : this.options.pageSize * (this.options.pageNumber - 1);\n            }\n        }\n\n        if (!($.isEmptyObject(this.filterColumnsPartial))) {\n            params['filter'] = JSON.stringify(this.filterColumnsPartial, null);\n        }\n\n        data = calculateObjectValue(this.options, this.options.queryParams, [params], data);\n\n        $.extend(data, query || {});\n\n        // false to stop request\n        if (data === false) {\n            return;\n        }\n\n        if (!silent) {\n            this.$tableLoading.show();\n        }\n        request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), {\n            type: this.options.method,\n            url: this.options.url,\n            data: this.options.contentType === 'application/json' && this.options.method === 'post' ?\n                JSON.stringify(data) : data,\n            cache: this.options.cache,\n            contentType: this.options.contentType,\n            dataType: this.options.dataType,\n            success: function (res) {\n                res = calculateObjectValue(that.options, that.options.responseHandler, [res], res);\n\n                that.load(res);\n                that.trigger('load-success', res);\n            },\n            error: function (res) {\n                that.trigger('load-error', res.status, res);\n            },\n            complete: function () {\n                if (!silent) {\n                    that.$tableLoading.hide();\n                }\n            }\n        });\n\n        if (this.options.ajax) {\n            calculateObjectValue(this, this.options.ajax, [request], null);\n        } else {\n            $.ajax(request);\n        }\n    };\n\n    BootstrapTable.prototype.initSearchText = function () {\n        if (this.options.search) {\n            if (this.options.searchText !== '') {\n                var $search = this.$toolbar.find('.search input');\n                $search.val(this.options.searchText);\n                this.onSearch({currentTarget: $search});\n            }\n        }\n    };\n\n    BootstrapTable.prototype.getCaret = function () {\n        var that = this;\n\n        $.each(this.$header.find('th'), function (i, th) {\n            $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both');\n        });\n    };\n\n    BootstrapTable.prototype.updateSelected = function () {\n        var checkAll = this.$selectItem.filter(':enabled').length &&\n            this.$selectItem.filter(':enabled').length ===\n            this.$selectItem.filter(':enabled').filter(':checked').length;\n\n        this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);\n\n        this.$selectItem.each(function () {\n            $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected');\n        });\n    };\n\n    BootstrapTable.prototype.updateRows = function () {\n        var that = this;\n\n        this.$selectItem.each(function () {\n            that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');\n        });\n    };\n\n    BootstrapTable.prototype.resetRows = function () {\n        var that = this;\n\n        $.each(this.data, function (i, row) {\n            that.$selectAll.prop('checked', false);\n            that.$selectItem.prop('checked', false);\n            if (that.header.stateField) {\n                row[that.header.stateField] = false;\n            }\n        });\n    };\n\n    BootstrapTable.prototype.trigger = function (name) {\n        var args = Array.prototype.slice.call(arguments, 1);\n\n        name += '.bs.table';\n        this.options[BootstrapTable.EVENTS[name]].apply(this.options, args);\n        this.$el.trigger($.Event(name), args);\n\n        this.options.onAll(name, args);\n        this.$el.trigger($.Event('all.bs.table'), [name, args]);\n    };\n\n    BootstrapTable.prototype.resetHeader = function () {\n        // fix #61: the hidden table reset header bug.\n        // fix bug: get $el.css('width') error sometime (height = 500)\n        clearTimeout(this.timeoutId_);\n        this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);\n    };\n\n    BootstrapTable.prototype.fitHeader = function () {\n        var that = this,\n            fixedBody,\n            scrollWidth,\n            focused,\n            focusedTemp;\n\n        if (that.$el.is(':hidden')) {\n            that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100);\n            return;\n        }\n        fixedBody = this.$tableBody.get(0);\n\n        scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth &&\n        fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ?\n            getScrollBarWidth() : 0;\n\n        this.$el.css('margin-top', -this.$header.outerHeight());\n\n        focused = $(':focus');\n        if (focused.length > 0) {\n            var $th = focused.parents('th');\n            if ($th.length > 0) {\n                var dataField = $th.attr('data-field');\n                if (dataField !== undefined) {\n                    var $headerTh = this.$header.find(\"[data-field='\" + dataField + \"']\");\n                    if ($headerTh.length > 0) {\n                        $headerTh.find(\":input\").addClass(\"focus-temp\");\n                    }\n                }\n            }\n        }\n\n        this.$header_ = this.$header.clone(true, true);\n        this.$selectAll_ = this.$header_.find('[name=\"btSelectAll\"]');\n        this.$tableHeader.css({\n            'margin-right': scrollWidth\n        }).find('table').css('width', this.$el.outerWidth())\n            .html('').attr('class', this.$el.attr('class'))\n            .append(this.$header_);\n\n\n        focusedTemp = $('.focus-temp:visible:eq(0)');\n        if (focusedTemp.length > 0) {\n            focusedTemp.focus();\n            this.$header.find('.focus-temp').removeClass('focus-temp');\n        }\n\n        // fix bug: $.data() is not working as expected after $.append()\n        this.$header.find('th[data-field]').each(function (i) {\n            that.$header_.find(sprintf('th[data-field=\"%s\"]', $(this).data('field'))).data($(this).data());\n        });\n\n        var visibleFields = this.getVisibleFields();\n\n        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {\n            var $this = $(this),\n                index = i;\n\n            if (that.options.detailView && !that.options.cardView) {\n                if (i === 0) {\n                    that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());\n                }\n                index = i - 1;\n            }\n\n            that.$header_.find(sprintf('th[data-field=\"%s\"]', visibleFields[index]))\n                .find('.fht-cell').width($this.innerWidth());\n        });\n        // horizontal scroll event\n        // TODO: it's probably better improving the layout than binding to scroll event\n        this.$tableBody.off('scroll').on('scroll', function () {\n            that.$tableHeader.scrollLeft($(this).scrollLeft());\n\n            if (that.options.showFooter && !that.options.cardView) {\n                that.$tableFooter.scrollLeft($(this).scrollLeft());\n            }\n        });\n        that.trigger('post-header');\n    };\n\n    BootstrapTable.prototype.resetFooter = function () {\n        var that = this,\n            data = that.getData(),\n            html = [];\n\n        if (!this.options.showFooter || this.options.cardView) { //do nothing\n            return;\n        }\n\n        if (!this.options.cardView && this.options.detailView) {\n            html.push('<td><div class=\"th-inner\">&nbsp;</div><div class=\"fht-cell\"></div></td>');\n        }\n\n        $.each(this.columns, function (i, column) {\n            var falign = '', // footer align style\n                style = '',\n                class_ = sprintf(' class=\"%s\"', column['class']);\n\n            if (!column.visible) {\n                return;\n            }\n\n            if (that.options.cardView && (!column.cardVisible)) {\n                return;\n            }\n\n            falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align);\n            style = sprintf('vertical-align: %s; ', column.valign);\n\n            html.push('<td', class_, sprintf(' style=\"%s\"', falign + style), '>');\n            html.push('<div class=\"th-inner\">');\n\n            html.push(calculateObjectValue(column, column.footerFormatter, [data], '&nbsp;') || '&nbsp;');\n\n            html.push('</div>');\n            html.push('<div class=\"fht-cell\"></div>');\n            html.push('</div>');\n            html.push('</td>');\n        });\n\n        this.$tableFooter.find('tr').html(html.join(''));\n        clearTimeout(this.timeoutFooter_);\n        this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this),\n            this.$el.is(':hidden') ? 100 : 0);\n    };\n\n    BootstrapTable.prototype.fitFooter = function () {\n        var that = this,\n            $footerTd,\n            elWidth,\n            scrollWidth;\n\n        clearTimeout(this.timeoutFooter_);\n        if (this.$el.is(':hidden')) {\n            this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100);\n            return;\n        }\n\n        elWidth = this.$el.css('width');\n        scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0;\n\n        this.$tableFooter.css({\n            'margin-right': scrollWidth\n        }).find('table').css('width', elWidth)\n            .attr('class', this.$el.attr('class'));\n\n        $footerTd = this.$tableFooter.find('td');\n\n        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {\n            var $this = $(this);\n\n            $footerTd.eq(i).find('.fht-cell').width($this.innerWidth());\n        });\n    };\n\n    BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) {\n        if (index === -1) {\n            return;\n        }\n        this.columns[index].visible = checked;\n        this.initHeader();\n        this.initSearch();\n        this.initPagination();\n        this.initBody();\n\n        if (this.options.showColumns) {\n            var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);\n\n            if (needUpdate) {\n                $items.filter(sprintf('[value=\"%s\"]', index)).prop('checked', checked);\n            }\n\n            if ($items.filter(':checked').length <= this.options.minimumCountColumns) {\n                $items.filter(':checked').prop('disabled', true);\n            }\n        }\n    };\n\n    BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {\n        if (index === -1) {\n            return;\n        }\n\n        this.$body.find(typeof index !== 'undefined' ?\n            sprintf('tr[data-index=\"%s\"]', index) :\n            sprintf('tr[data-uniqueid=\"%s\"]', uniqueId))\n            [visible ? 'show' : 'hide']();\n    };\n\n    BootstrapTable.prototype.getVisibleFields = function () {\n        var that = this,\n            visibleFields = [];\n\n        $.each(this.header.fields, function (j, field) {\n            var column = that.columns[getFieldIndex(that.columns, field)];\n\n            if (!column.visible) {\n                return;\n            }\n            visibleFields.push(field);\n        });\n        return visibleFields;\n    };\n\n    // PUBLIC FUNCTION DEFINITION\n    // =======================\n\n    BootstrapTable.prototype.resetView = function (params) {\n        var padding = 0;\n\n        if (params && params.height) {\n            this.options.height = params.height;\n        }\n\n        this.$selectAll.prop('checked', this.$selectItem.length > 0 &&\n            this.$selectItem.length === this.$selectItem.filter(':checked').length);\n\n        if (this.options.height) {\n            var toolbarHeight = getRealHeight(this.$toolbar),\n                paginationHeight = getRealHeight(this.$pagination),\n                height = this.options.height - toolbarHeight - paginationHeight;\n\n            this.$tableContainer.css('height', height + 'px');\n        }\n\n        if (this.options.cardView) {\n            // remove the element css\n            this.$el.css('margin-top', '0');\n            this.$tableContainer.css('padding-bottom', '0');\n            return;\n        }\n\n        if (this.options.showHeader && this.options.height) {\n            this.$tableHeader.show();\n            this.resetHeader();\n            padding += this.$header.outerHeight();\n        } else {\n            this.$tableHeader.hide();\n            this.trigger('post-header');\n        }\n\n        if (this.options.showFooter) {\n            this.resetFooter();\n            if (this.options.height) {\n                padding += this.$tableFooter.outerHeight() + 1;\n            }\n        }\n\n        // Assign the correct sortable arrow\n        this.getCaret();\n        this.$tableContainer.css('padding-bottom', padding + 'px');\n        this.trigger('reset-view');\n    };\n\n    BootstrapTable.prototype.getData = function (useCurrentPage) {\n        return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?\n            (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) :\n            (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data);\n    };\n\n    BootstrapTable.prototype.load = function (data) {\n        var fixedScroll = false;\n\n        // #431: support pagination\n        if (this.options.sidePagination === 'server') {\n            this.options.totalRows = data.total;\n            fixedScroll = data.fixedScroll;\n            data = data[this.options.dataField];\n        } else if (!$.isArray(data)) { // support fixedScroll\n            fixedScroll = data.fixedScroll;\n            data = data.data;\n        }\n\n        this.initData(data);\n        this.initSearch();\n        this.initPagination();\n        this.initBody(fixedScroll);\n    };\n\n    BootstrapTable.prototype.append = function (data) {\n        this.initData(data, 'append');\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.prepend = function (data) {\n        this.initData(data, 'prepend');\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.remove = function (params) {\n        var len = this.options.data.length,\n            i, row;\n\n        if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {\n            return;\n        }\n\n        for (i = len - 1; i >= 0; i--) {\n            row = this.options.data[i];\n\n            if (!row.hasOwnProperty(params.field)) {\n                continue;\n            }\n            if ($.inArray(row[params.field], params.values) !== -1) {\n                this.options.data.splice(i, 1);\n            }\n        }\n\n        if (len === this.options.data.length) {\n            return;\n        }\n\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.removeAll = function () {\n        if (this.options.data.length > 0) {\n            this.options.data.splice(0, this.options.data.length);\n            this.initSearch();\n            this.initPagination();\n            this.initBody(true);\n        }\n    };\n\n    BootstrapTable.prototype.getRowByUniqueId = function (id) {\n        var uniqueId = this.options.uniqueId,\n            len = this.options.data.length,\n            dataRow = null,\n            i, row, rowUniqueId;\n\n        for (i = len - 1; i >= 0; i--) {\n            row = this.options.data[i];\n\n            if (row.hasOwnProperty(uniqueId)) { // uniqueId is a column\n                rowUniqueId = row[uniqueId];\n            } else if(row._data.hasOwnProperty(uniqueId)) { // uniqueId is a row data property\n                rowUniqueId = row._data[uniqueId];\n            } else {\n                continue;\n            }\n\n            if (typeof rowUniqueId === 'string') {\n                id = id.toString();\n            } else if (typeof rowUniqueId === 'number') {\n                if ((Number(rowUniqueId) === rowUniqueId) && (rowUniqueId % 1 === 0)) {\n                    id = parseInt(id);\n                } else if ((rowUniqueId === Number(rowUniqueId)) && (rowUniqueId !== 0)) {\n                    id = parseFloat(id);\n                }\n            }\n\n            if (rowUniqueId === id) {\n                dataRow = row;\n                break;\n            }\n        }\n\n        return dataRow;\n    };\n\n    BootstrapTable.prototype.removeByUniqueId = function (id) {\n        var len = this.options.data.length,\n            row = this.getRowByUniqueId(id);\n\n        if (row) {\n            this.options.data.splice(this.options.data.indexOf(row), 1);\n        }\n\n        if (len === this.options.data.length) {\n            return;\n        }\n\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.updateByUniqueId = function (params) {\n        var rowId;\n\n        if (!params.hasOwnProperty('id') || !params.hasOwnProperty('row')) {\n            return;\n        }\n\n        rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data);\n\n        if (rowId === -1) {\n            return;\n        }\n\n        $.extend(this.data[rowId], params.row);\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.insertRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {\n            return;\n        }\n        this.data.splice(params.index, 0, params.row);\n        this.initSearch();\n        this.initPagination();\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.updateRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {\n            return;\n        }\n        $.extend(this.data[params.index], params.row);\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.showRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {\n            return;\n        }\n        this.toggleRow(params.index, params.uniqueId, true);\n    };\n\n    BootstrapTable.prototype.hideRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {\n            return;\n        }\n        this.toggleRow(params.index, params.uniqueId, false);\n    };\n\n    BootstrapTable.prototype.getRowsHidden = function (show) {\n        var rows = $(this.$body[0]).children().filter(':hidden'),\n            i = 0;\n        if (show) {\n            for (; i < rows.length; i++) {\n                $(rows[i]).show();\n            }\n        }\n        return rows;\n    };\n\n    BootstrapTable.prototype.mergeCells = function (options) {\n        var row = options.index,\n            col = $.inArray(options.field, this.getVisibleFields()),\n            rowspan = options.rowspan || 1,\n            colspan = options.colspan || 1,\n            i, j,\n            $tr = this.$body.find('>tr'),\n            $td;\n\n        if (this.options.detailView && !this.options.cardView) {\n            col += 1;\n        }\n\n        $td = $tr.eq(row).find('>td').eq(col);\n\n        if (row < 0 || col < 0 || row >= this.data.length) {\n            return;\n        }\n\n        for (i = row; i < row + rowspan; i++) {\n            for (j = col; j < col + colspan; j++) {\n                $tr.eq(i).find('>td').eq(j).hide();\n            }\n        }\n\n        $td.attr('rowspan', rowspan).attr('colspan', colspan).show();\n    };\n\n    BootstrapTable.prototype.updateCell = function (params) {\n        if (!params.hasOwnProperty('index') ||\n            !params.hasOwnProperty('field') ||\n            !params.hasOwnProperty('value')) {\n            return;\n        }\n        this.data[params.index][params.field] = params.value;\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.getOptions = function () {\n        return this.options;\n    };\n\n    BootstrapTable.prototype.getSelections = function () {\n        var that = this;\n\n        return $.grep(this.data, function (row) {\n            return row[that.header.stateField];\n        });\n    };\n\n    BootstrapTable.prototype.getAllSelections = function () {\n        var that = this;\n\n        return $.grep(this.options.data, function (row) {\n            return row[that.header.stateField];\n        });\n    };\n\n    BootstrapTable.prototype.checkAll = function () {\n        this.checkAll_(true);\n    };\n\n    BootstrapTable.prototype.uncheckAll = function () {\n        this.checkAll_(false);\n    };\n\n    BootstrapTable.prototype.checkAll_ = function (checked) {\n        var rows;\n        if (!checked) {\n            rows = this.getSelections();\n        }\n        this.$selectAll.add(this.$selectAll_).prop('checked', checked);\n        this.$selectItem.filter(':enabled').prop('checked', checked);\n        this.updateRows();\n        if (checked) {\n            rows = this.getSelections();\n        }\n        this.trigger(checked ? 'check-all' : 'uncheck-all', rows);\n    };\n\n    BootstrapTable.prototype.check = function (index) {\n        this.check_(true, index);\n    };\n\n    BootstrapTable.prototype.uncheck = function (index) {\n        this.check_(false, index);\n    };\n\n    BootstrapTable.prototype.check_ = function (checked, index) {\n        var $el = this.$selectItem.filter(sprintf('[data-index=\"%s\"]', index)).prop('checked', checked);\n        this.data[index][this.header.stateField] = checked;\n        this.updateSelected();\n        this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el);\n    };\n\n    BootstrapTable.prototype.checkBy = function (obj) {\n        this.checkBy_(true, obj);\n    };\n\n    BootstrapTable.prototype.uncheckBy = function (obj) {\n        this.checkBy_(false, obj);\n    };\n\n    BootstrapTable.prototype.checkBy_ = function (checked, obj) {\n        if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {\n            return;\n        }\n\n        var that = this,\n            rows = [];\n        $.each(this.options.data, function (index, row) {\n            if (!row.hasOwnProperty(obj.field)) {\n                return false;\n            }\n            if ($.inArray(row[obj.field], obj.values) !== -1) {\n                var $el = that.$selectItem.filter(':enabled')\n                    .filter(sprintf('[data-index=\"%s\"]', index)).prop('checked', checked);\n                row[that.header.stateField] = checked;\n                rows.push(row);\n                that.trigger(checked ? 'check' : 'uncheck', row, $el);\n            }\n        });\n        this.updateSelected();\n        this.trigger(checked ? 'check-some' : 'uncheck-some', rows);\n    };\n\n    BootstrapTable.prototype.destroy = function () {\n        this.$el.insertBefore(this.$container);\n        $(this.options.toolbar).insertBefore(this.$el);\n        this.$container.next().remove();\n        this.$container.remove();\n        this.$el.html(this.$el_.html())\n            .css('margin-top', '0')\n            .attr('class', this.$el_.attr('class') || ''); // reset the class\n    };\n\n    BootstrapTable.prototype.showLoading = function () {\n        this.$tableLoading.show();\n    };\n\n    BootstrapTable.prototype.hideLoading = function () {\n        this.$tableLoading.hide();\n    };\n\n    BootstrapTable.prototype.togglePagination = function () {\n        this.options.pagination = !this.options.pagination;\n        var button = this.$toolbar.find('button[name=\"paginationSwitch\"] i');\n        if (this.options.pagination) {\n            button.attr(\"class\", this.options.iconsPrefix + \" \" + this.options.icons.paginationSwitchDown);\n        } else {\n            button.attr(\"class\", this.options.iconsPrefix + \" \" + this.options.icons.paginationSwitchUp);\n        }\n        this.updatePagination();\n    };\n\n    BootstrapTable.prototype.refresh = function (params) {\n        if (params && params.url) {\n            this.options.url = params.url;\n            this.options.pageNumber = 1;\n        }\n        this.initServer(params && params.silent, params && params.query);\n    };\n\n    BootstrapTable.prototype.resetWidth = function () {\n        if (this.options.showHeader && this.options.height) {\n            this.fitHeader();\n        }\n        if (this.options.showFooter) {\n            this.fitFooter();\n        }\n    };\n\n    BootstrapTable.prototype.showColumn = function (field) {\n        this.toggleColumn(getFieldIndex(this.columns, field), true, true);\n    };\n\n    BootstrapTable.prototype.hideColumn = function (field) {\n        this.toggleColumn(getFieldIndex(this.columns, field), false, true);\n    };\n\n    BootstrapTable.prototype.getHiddenColumns = function () {\n        return $.grep(this.columns, function (column) {\n            return !column.visible;\n        });\n    };\n\n    BootstrapTable.prototype.filterBy = function (columns) {\n        this.filterColumns = $.isEmptyObject(columns) ? {} : columns;\n        this.options.pageNumber = 1;\n        this.initSearch();\n        this.updatePagination();\n    };\n\n    BootstrapTable.prototype.scrollTo = function (value) {\n        if (typeof value === 'string') {\n            value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0;\n        }\n        if (typeof value === 'number') {\n            this.$tableBody.scrollTop(value);\n        }\n        if (typeof value === 'undefined') {\n            return this.$tableBody.scrollTop();\n        }\n    };\n\n    BootstrapTable.prototype.getScrollPosition = function () {\n        return this.scrollTo();\n    };\n\n    BootstrapTable.prototype.selectPage = function (page) {\n        if (page > 0 && page <= this.options.totalPages) {\n            this.options.pageNumber = page;\n            this.updatePagination();\n        }\n    };\n\n    BootstrapTable.prototype.prevPage = function () {\n        if (this.options.pageNumber > 1) {\n            this.options.pageNumber--;\n            this.updatePagination();\n        }\n    };\n\n    BootstrapTable.prototype.nextPage = function () {\n        if (this.options.pageNumber < this.options.totalPages) {\n            this.options.pageNumber++;\n            this.updatePagination();\n        }\n    };\n\n    BootstrapTable.prototype.toggleView = function () {\n        this.options.cardView = !this.options.cardView;\n        this.initHeader();\n        // Fixed remove toolbar when click cardView button.\n        //that.initToolbar();\n        this.initBody();\n        this.trigger('toggle', this.options.cardView);\n    };\n\n    BootstrapTable.prototype.refreshOptions = function (options) {\n        //If the objects are equivalent then avoid the call of destroy / init methods\n        if (compareObjects(this.options, options, false)) {\n            return;\n        }\n        this.options = $.extend(this.options, options);\n        this.trigger('refresh-options', this.options);\n        this.destroy();\n        this.init();\n    };\n\n    BootstrapTable.prototype.resetSearch = function (text) {\n        var $search = this.$toolbar.find('.search input');\n        $search.val(text || '');\n        this.onSearch({currentTarget: $search});\n    };\n\n    BootstrapTable.prototype.expandRow_ = function (expand, index) {\n        var $tr = this.$body.find(sprintf('> tr[data-index=\"%s\"]', index));\n        if ($tr.next().is('tr.detail-view') === (expand ? false : true)) {\n            $tr.find('> td > .detail-icon').click();\n        }\n    };\n\n    BootstrapTable.prototype.expandRow = function (index) {\n        this.expandRow_(true, index);\n    };\n\n    BootstrapTable.prototype.collapseRow = function (index) {\n        this.expandRow_(false, index);\n    };\n\n    BootstrapTable.prototype.expandAllRows = function (isSubTable) {\n        if (isSubTable) {\n            var $tr = this.$body.find(sprintf('> tr[data-index=\"%s\"]', 0)),\n                that = this,\n                detailIcon = null,\n                executeInterval = false,\n                idInterval = -1;\n\n            if (!$tr.next().is('tr.detail-view')) {\n                $tr.find('> td > .detail-icon').click();\n                executeInterval = true;\n            } else if (!$tr.next().next().is('tr.detail-view')) {\n                $tr.next().find(\".detail-icon\").click();\n                executeInterval = true;\n            }\n\n            if (executeInterval) {\n                try {\n                    idInterval = setInterval(function () {\n                        detailIcon = that.$body.find(\"tr.detail-view\").last().find(\".detail-icon\");\n                        if (detailIcon.length > 0) {\n                            detailIcon.click();\n                        } else {\n                            clearInterval(idInterval);\n                        }\n                    }, 1);\n                } catch (ex) {\n                    clearInterval(idInterval);\n                }\n            }\n        } else {\n            var trs = this.$body.children();\n            for (var i = 0; i < trs.length; i++) {\n                this.expandRow_(true, $(trs[i]).data(\"index\"));\n            }\n        }\n    };\n\n    BootstrapTable.prototype.collapseAllRows = function (isSubTable) {\n        if (isSubTable) {\n            this.expandRow_(false, 0);\n        } else {\n            var trs = this.$body.children();\n            for (var i = 0; i < trs.length; i++) {\n                this.expandRow_(false, $(trs[i]).data(\"index\"));\n            }\n        }\n    };\n\n    // BOOTSTRAP TABLE PLUGIN DEFINITION\n    // =======================\n\n    var allowedMethods = [\n        'getOptions',\n        'getSelections', 'getAllSelections', 'getData',\n        'load', 'append', 'prepend', 'remove', 'removeAll',\n        'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',\n        'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',\n        'mergeCells',\n        'checkAll', 'uncheckAll',\n        'check', 'uncheck',\n        'checkBy', 'uncheckBy',\n        'refresh',\n        'resetView',\n        'resetWidth',\n        'destroy',\n        'showLoading', 'hideLoading',\n        'showColumn', 'hideColumn', 'getHiddenColumns',\n        'filterBy',\n        'scrollTo',\n        'getScrollPosition',\n        'selectPage', 'prevPage', 'nextPage',\n        'togglePagination',\n        'toggleView',\n        'refreshOptions',\n        'resetSearch',\n        'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows'\n    ];\n\n    $.fn.bootstrapTable = function (option) {\n        var value,\n            args = Array.prototype.slice.call(arguments, 1);\n\n        this.each(function () {\n            var $this = $(this),\n                data = $this.data('bootstrap.table'),\n                options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),\n                    typeof option === 'object' && option);\n\n            if (typeof option === 'string') {\n                if ($.inArray(option, allowedMethods) < 0) {\n                    throw new Error(\"Unknown method: \" + option);\n                }\n\n                if (!data) {\n                    return;\n                }\n\n                value = data[option].apply(data, args);\n\n                if (option === 'destroy') {\n                    $this.removeData('bootstrap.table');\n                }\n            }\n\n            if (!data) {\n                $this.data('bootstrap.table', (data = new BootstrapTable(this, options)));\n            }\n        });\n\n        return typeof value === 'undefined' ? this : value;\n    };\n\n    $.fn.bootstrapTable.Constructor = BootstrapTable;\n    $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;\n    $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;\n    $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;\n    $.fn.bootstrapTable.methods = allowedMethods;\n    $.fn.bootstrapTable.utils = {\n        sprintf: sprintf,\n        getFieldIndex: getFieldIndex,\n        compareObjects: compareObjects,\n        calculateObjectValue: calculateObjectValue\n    };\n\n    // BOOTSTRAP TABLE INIT\n    // =======================\n\n    $(function () {\n        $('[data-toggle=\"table\"]').bootstrapTable();\n    });\n\n}(jQuery);\n","/* =========================================================\n * bootstrap-datepicker.js\n * Repo: https://github.com/eternicode/bootstrap-datepicker/\n * Demo: http://eternicode.github.io/bootstrap-datepicker/\n * Docs: http://bootstrap-datepicker.readthedocs.org/\n * Forked from http://www.eyecon.ro/bootstrap-datepicker\n * =========================================================\n * Started by Stefan Petre; improvements by Andrew Rowls + contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n(function($, undefined){\n\n\tvar $window = $(window);\n\n\tfunction UTCDate(){\n\t\treturn new Date(Date.UTC.apply(Date, arguments));\n\t}\n\tfunction UTCToday(){\n\t\tvar today = new Date();\n\t\treturn UTCDate(today.getFullYear(), today.getMonth(), today.getDate());\n\t}\n\tfunction alias(method){\n\t\treturn function(){\n\t\t\treturn this[method].apply(this, arguments);\n\t\t};\n\t}\n\n\tvar DateArray = (function(){\n\t\tvar extras = {\n\t\t\tget: function(i){\n\t\t\t\treturn this.slice(i)[0];\n\t\t\t},\n\t\t\tcontains: function(d){\n\t\t\t\t// Array.indexOf is not cross-browser;\n\t\t\t\t// $.inArray doesn't work with Dates\n\t\t\t\tvar val = d && d.valueOf();\n\t\t\t\tfor (var i=0, l=this.length; i < l; i++)\n\t\t\t\t\tif (this[i].valueOf() === val)\n\t\t\t\t\t\treturn i;\n\t\t\t\treturn -1;\n\t\t\t},\n\t\t\tremove: function(i){\n\t\t\t\tthis.splice(i,1);\n\t\t\t},\n\t\t\treplace: function(new_array){\n\t\t\t\tif (!new_array)\n\t\t\t\t\treturn;\n\t\t\t\tif (!$.isArray(new_array))\n\t\t\t\t\tnew_array = [new_array];\n\t\t\t\tthis.clear();\n\t\t\t\tthis.push.apply(this, new_array);\n\t\t\t},\n\t\t\tclear: function(){\n\t\t\t\tthis.splice(0);\n\t\t\t},\n\t\t\tcopy: function(){\n\t\t\t\tvar a = new DateArray();\n\t\t\t\ta.replace(this);\n\t\t\t\treturn a;\n\t\t\t}\n\t\t};\n\n\t\treturn function(){\n\t\t\tvar a = [];\n\t\t\ta.push.apply(a, arguments);\n\t\t\t$.extend(a, extras);\n\t\t\treturn a;\n\t\t};\n\t})();\n\n\n\t// Picker object\n\n\tvar Datepicker = function(element, options){\n\t\tthis.dates = new DateArray();\n\t\tthis.viewDate = UTCToday();\n\t\tthis.focusDate = null;\n\n\t\tthis._process_options(options);\n\n\t\tthis.element = $(element);\n\t\tthis.isInline = false;\n\t\tthis.isInput = this.element.is('input');\n\t\tthis.component = this.element.is('.date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;\n\t\tthis.hasInput = this.component && this.element.find('input').length;\n\t\tif (this.component && this.component.length === 0)\n\t\t\tthis.component = false;\n\n\t\tthis.picker = $(DPGlobal.template);\n\t\tthis._buildEvents();\n\t\tthis._attachEvents();\n\n\t\tif (this.isInline){\n\t\t\tthis.picker.addClass('datepicker-inline').appendTo(this.element);\n\t\t}\n\t\telse {\n\t\t\tthis.picker.addClass('datepicker-dropdown dropdown-menu');\n\t\t}\n\n\t\tif (this.o.rtl){\n\t\t\tthis.picker.addClass('datepicker-rtl');\n\t\t}\n\n\t\tthis.viewMode = this.o.startView;\n\n\t\tif (this.o.calendarWeeks)\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.attr('colspan', function(i, val){\n\t\t\t\t\t\t\treturn parseInt(val) + 1;\n\t\t\t\t\t\t});\n\n\t\tthis._allow_update = false;\n\n\t\tthis.setStartDate(this._o.startDate);\n\t\tthis.setEndDate(this._o.endDate);\n\t\tthis.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);\n\n\t\tthis.fillDow();\n\t\tthis.fillMonths();\n\n\t\tthis._allow_update = true;\n\n\t\tthis.update();\n\t\tthis.showMode();\n\n\t\tif (this.isInline){\n\t\t\tthis.show();\n\t\t}\n\t};\n\n\tDatepicker.prototype = {\n\t\tconstructor: Datepicker,\n\n\t\t_process_options: function(opts){\n\t\t\t// Store raw options for reference\n\t\t\tthis._o = $.extend({}, this._o, opts);\n\t\t\t// Processed options\n\t\t\tvar o = this.o = $.extend({}, this._o);\n\n\t\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t\t// fallback to 2 letter code eg \"de\"\n\t\t\tvar lang = o.language;\n\t\t\tif (!dates[lang]){\n\t\t\t\tlang = lang.split('-')[0];\n\t\t\t\tif (!dates[lang])\n\t\t\t\t\tlang = defaults.language;\n\t\t\t}\n\t\t\to.language = lang;\n\n\t\t\tswitch (o.startView){\n\t\t\t\tcase 2:\n\t\t\t\tcase 'decade':\n\t\t\t\t\to.startView = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 'year':\n\t\t\t\t\to.startView = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.startView = 0;\n\t\t\t}\n\n\t\t\tswitch (o.minViewMode){\n\t\t\t\tcase 1:\n\t\t\t\tcase 'months':\n\t\t\t\t\to.minViewMode = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 'years':\n\t\t\t\t\to.minViewMode = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.minViewMode = 0;\n\t\t\t}\n\n\t\t\to.startView = Math.max(o.startView, o.minViewMode);\n\n\t\t\t// true, false, or Number > 0\n\t\t\tif (o.multidate !== true){\n\t\t\t\to.multidate = Number(o.multidate) || false;\n\t\t\t\tif (o.multidate !== false)\n\t\t\t\t\to.multidate = Math.max(0, o.multidate);\n\t\t\t\telse\n\t\t\t\t\to.multidate = 1;\n\t\t\t}\n\t\t\to.multidateSeparator = String(o.multidateSeparator);\n\n\t\t\to.weekStart %= 7;\n\t\t\to.weekEnd = ((o.weekStart + 6) % 7);\n\n\t\t\tvar format = DPGlobal.parseFormat(o.format);\n\t\t\tif (o.startDate !== -Infinity){\n\t\t\t\tif (!!o.startDate){\n\t\t\t\t\tif (o.startDate instanceof Date)\n\t\t\t\t\t\to.startDate = this._local_to_utc(this._zero_time(o.startDate));\n\t\t\t\t\telse\n\t\t\t\t\t\to.startDate = DPGlobal.parseDate(o.startDate, format, o.language);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\to.startDate = -Infinity;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (o.endDate !== Infinity){\n\t\t\t\tif (!!o.endDate){\n\t\t\t\t\tif (o.endDate instanceof Date)\n\t\t\t\t\t\to.endDate = this._local_to_utc(this._zero_time(o.endDate));\n\t\t\t\t\telse\n\t\t\t\t\t\to.endDate = DPGlobal.parseDate(o.endDate, format, o.language);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\to.endDate = Infinity;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled||[];\n\t\t\tif (!$.isArray(o.daysOfWeekDisabled))\n\t\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\\s]*/);\n\t\t\to.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){\n\t\t\t\treturn parseInt(d, 10);\n\t\t\t});\n\n\t\t\tvar plc = String(o.orientation).toLowerCase().split(/\\s+/g),\n\t\t\t\t_plc = o.orientation.toLowerCase();\n\t\t\tplc = $.grep(plc, function(word){\n\t\t\t\treturn (/^auto|left|right|top|bottom$/).test(word);\n\t\t\t});\n\t\t\to.orientation = {x: 'auto', y: 'auto'};\n\t\t\tif (!_plc || _plc === 'auto')\n\t\t\t\t; // no action\n\t\t\telse if (plc.length === 1){\n\t\t\t\tswitch (plc[0]){\n\t\t\t\t\tcase 'top':\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\to.orientation.y = plc[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'left':\n\t\t\t\t\tcase 'right':\n\t\t\t\t\t\to.orientation.x = plc[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_plc = $.grep(plc, function(word){\n\t\t\t\t\treturn (/^left|right$/).test(word);\n\t\t\t\t});\n\t\t\t\to.orientation.x = _plc[0] || 'auto';\n\n\t\t\t\t_plc = $.grep(plc, function(word){\n\t\t\t\t\treturn (/^top|bottom$/).test(word);\n\t\t\t\t});\n\t\t\t\to.orientation.y = _plc[0] || 'auto';\n\t\t\t}\n\t\t},\n\t\t_events: [],\n\t\t_secondaryEvents: [],\n\t\t_applyEvents: function(evs){\n\t\t\tfor (var i=0, el, ch, ev; i < evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tif (evs[i].length === 2){\n\t\t\t\t\tch = undefined;\n\t\t\t\t\tev = evs[i][1];\n\t\t\t\t}\n\t\t\t\telse if (evs[i].length === 3){\n\t\t\t\t\tch = evs[i][1];\n\t\t\t\t\tev = evs[i][2];\n\t\t\t\t}\n\t\t\t\tel.on(ev, ch);\n\t\t\t}\n\t\t},\n\t\t_unapplyEvents: function(evs){\n\t\t\tfor (var i=0, el, ev, ch; i < evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tif (evs[i].length === 2){\n\t\t\t\t\tch = undefined;\n\t\t\t\t\tev = evs[i][1];\n\t\t\t\t}\n\t\t\t\telse if (evs[i].length === 3){\n\t\t\t\t\tch = evs[i][1];\n\t\t\t\t\tev = evs[i][2];\n\t\t\t\t}\n\t\t\t\tel.off(ev, ch);\n\t\t\t}\n\t\t},\n\t\t_buildEvents: function(){\n\t\t\tif (this.isInput){ // single input\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(function(e){\n\t\t\t\t\t\t\tif ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.component && this.hasInput){ // component: input + button\n\t\t\t\tthis._events = [\n\t\t\t\t\t// For components that are not readonly, allow keyboard nav\n\t\t\t\t\t[this.element.find('input'), {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(function(e){\n\t\t\t\t\t\t\tif ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}],\n\t\t\t\t\t[this.component, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.element.is('div')){  // inline datepicker\n\t\t\t\tthis.isInline = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\tthis._events.push(\n\t\t\t\t// Component: listen for blur on element descendants\n\t\t\t\t[this.element, '*', {\n\t\t\t\t\tblur: $.proxy(function(e){\n\t\t\t\t\t\tthis._focused_from = e.target;\n\t\t\t\t\t}, this)\n\t\t\t\t}],\n\t\t\t\t// Input: listen for blur on element\n\t\t\t\t[this.element, {\n\t\t\t\t\tblur: $.proxy(function(e){\n\t\t\t\t\t\tthis._focused_from = e.target;\n\t\t\t\t\t}, this)\n\t\t\t\t}]\n\t\t\t);\n\n\t\t\tthis._secondaryEvents = [\n\t\t\t\t[this.picker, {\n\t\t\t\t\tclick: $.proxy(this.click, this)\n\t\t\t\t}],\n\t\t\t\t[$(window), {\n\t\t\t\t\tresize: $.proxy(this.place, this)\n\t\t\t\t}],\n\t\t\t\t[$(document), {\n\t\t\t\t\t'mousedown touchstart': $.proxy(function(e){\n\t\t\t\t\t\t// Clicked outside the datepicker, hide it\n\t\t\t\t\t\tif (!(\n\t\t\t\t\t\t\tthis.element.is(e.target) ||\n\t\t\t\t\t\t\tthis.element.find(e.target).length ||\n\t\t\t\t\t\t\tthis.picker.is(e.target) ||\n\t\t\t\t\t\t\tthis.picker.find(e.target).length\n\t\t\t\t\t\t)){\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this)\n\t\t\t\t}]\n\t\t\t];\n\t\t},\n\t\t_attachEvents: function(){\n\t\t\tthis._detachEvents();\n\t\t\tthis._applyEvents(this._events);\n\t\t},\n\t\t_detachEvents: function(){\n\t\t\tthis._unapplyEvents(this._events);\n\t\t},\n\t\t_attachSecondaryEvents: function(){\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis._applyEvents(this._secondaryEvents);\n\t\t},\n\t\t_detachSecondaryEvents: function(){\n\t\t\tthis._unapplyEvents(this._secondaryEvents);\n\t\t},\n\t\t_trigger: function(event, altdate){\n\t\t\tvar date = altdate || this.dates.get(-1),\n\t\t\t\tlocal_date = this._utc_to_local(date);\n\n\t\t\tthis.element.trigger({\n\t\t\t\ttype: event,\n\t\t\t\tdate: local_date,\n\t\t\t\tdates: $.map(this.dates, this._utc_to_local),\n\t\t\t\tformat: $.proxy(function(ix, format){\n\t\t\t\t\tif (arguments.length === 0){\n\t\t\t\t\t\tix = this.dates.length - 1;\n\t\t\t\t\t\tformat = this.o.format;\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof ix === 'string'){\n\t\t\t\t\t\tformat = ix;\n\t\t\t\t\t\tix = this.dates.length - 1;\n\t\t\t\t\t}\n\t\t\t\t\tformat = format || this.o.format;\n\t\t\t\t\tvar date = this.dates.get(ix);\n\t\t\t\t\treturn DPGlobal.formatDate(date, format, this.o.language);\n\t\t\t\t}, this)\n\t\t\t});\n\t\t},\n\n\t\tshow: function(){\n\t\t\tif (!this.isInline)\n\t\t\t\tthis.picker.appendTo('body');\n\t\t\tthis.picker.show();\n\t\t\tthis.place();\n\t\t\tthis._attachSecondaryEvents();\n\t\t\tthis._trigger('show');\n\t\t},\n\n\t\thide: function(){\n\t\t\tif (this.isInline)\n\t\t\t\treturn;\n\t\t\tif (!this.picker.is(':visible'))\n\t\t\t\treturn;\n\t\t\tthis.focusDate = null;\n\t\t\tthis.picker.hide().detach();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.viewMode = this.o.startView;\n\t\t\tthis.showMode();\n\n\t\t\tif (\n\t\t\t\tthis.o.forceParse &&\n\t\t\t\t(\n\t\t\t\t\tthis.isInput && this.element.val() ||\n\t\t\t\t\tthis.hasInput && this.element.find('input').val()\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthis.setValue();\n\t\t\tthis._trigger('hide');\n\t\t},\n\n\t\tremove: function(){\n\t\t\tthis.hide();\n\t\t\tthis._detachEvents();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.picker.remove();\n\t\t\tdelete this.element.data().datepicker;\n\t\t\tif (!this.isInput){\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\t\t},\n\n\t\t_utc_to_local: function(utc){\n\t\t\treturn utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000));\n\t\t},\n\t\t_local_to_utc: function(local){\n\t\t\treturn local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));\n\t\t},\n\t\t_zero_time: function(local){\n\t\t\treturn local && new Date(local.getFullYear(), local.getMonth(), local.getDate());\n\t\t},\n\t\t_zero_utc_time: function(utc){\n\t\t\treturn utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()));\n\t\t},\n\n\t\tgetDates: function(){\n\t\t\treturn $.map(this.dates, this._utc_to_local);\n\t\t},\n\n\t\tgetUTCDates: function(){\n\t\t\treturn $.map(this.dates, function(d){\n\t\t\t\treturn new Date(d);\n\t\t\t});\n\t\t},\n\n\t\tgetDate: function(){\n\t\t\treturn this._utc_to_local(this.getUTCDate());\n\t\t},\n\n\t\tgetUTCDate: function(){\n\t\t\treturn new Date(this.dates.get(-1));\n\t\t},\n\n\t\tsetDates: function(){\n\t\t\tvar args = $.isArray(arguments[0]) ? arguments[0] : arguments;\n\t\t\tthis.update.apply(this, args);\n\t\t\tthis._trigger('changeDate');\n\t\t\tthis.setValue();\n\t\t},\n\n\t\tsetUTCDates: function(){\n\t\t\tvar args = $.isArray(arguments[0]) ? arguments[0] : arguments;\n\t\t\tthis.update.apply(this, $.map(args, this._utc_to_local));\n\t\t\tthis._trigger('changeDate');\n\t\t\tthis.setValue();\n\t\t},\n\n\t\tsetDate: alias('setDates'),\n\t\tsetUTCDate: alias('setUTCDates'),\n\n\t\tsetValue: function(){\n\t\t\tvar formatted = this.getFormattedDate();\n\t\t\tif (!this.isInput){\n\t\t\t\tif (this.component){\n\t\t\t\t\tthis.element.find('input').val(formatted).change();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.element.val(formatted).change();\n\t\t\t}\n\t\t},\n\n\t\tgetFormattedDate: function(format){\n\t\t\tif (format === undefined)\n\t\t\t\tformat = this.o.format;\n\n\t\t\tvar lang = this.o.language;\n\t\t\treturn $.map(this.dates, function(d){\n\t\t\t\treturn DPGlobal.formatDate(d, format, lang);\n\t\t\t}).join(this.o.multidateSeparator);\n\t\t},\n\n\t\tsetStartDate: function(startDate){\n\t\t\tthis._process_options({startDate: startDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetEndDate: function(endDate){\n\t\t\tthis._process_options({endDate: endDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetDaysOfWeekDisabled: function(daysOfWeekDisabled){\n\t\t\tthis._process_options({daysOfWeekDisabled: daysOfWeekDisabled});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tplace: function(){\n\t\t\tif (this.isInline)\n\t\t\t\treturn;\n\t\t\tvar calendarWidth = this.picker.outerWidth(),\n\t\t\t\tcalendarHeight = this.picker.outerHeight(),\n\t\t\t\tvisualPadding = 10,\n\t\t\t\twindowWidth = $window.width(),\n\t\t\t\twindowHeight = $window.height(),\n\t\t\t\tscrollTop = $window.scrollTop();\n\n\t\t\tvar zIndex = parseInt(this.element.parents().filter(function(){\n\t\t\t\t\treturn $(this).css('z-index') !== 'auto';\n\t\t\t\t}).first().css('z-index'))+10;\n\t\t\tvar offset = this.component ? this.component.parent().offset() : this.element.offset();\n\t\t\tvar height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);\n\t\t\tvar width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);\n\t\t\tvar left = offset.left,\n\t\t\t\ttop = offset.top;\n\n\t\t\tthis.picker.removeClass(\n\t\t\t\t'datepicker-orient-top datepicker-orient-bottom '+\n\t\t\t\t'datepicker-orient-right datepicker-orient-left'\n\t\t\t);\n\n\t\t\tif (this.o.orientation.x !== 'auto'){\n\t\t\t\tthis.picker.addClass('datepicker-orient-' + this.o.orientation.x);\n\t\t\t\tif (this.o.orientation.x === 'right')\n\t\t\t\t\tleft -= calendarWidth - width;\n\t\t\t}\n\t\t\t// auto x orientation is best-placement: if it crosses a window\n\t\t\t// edge, fudge it sideways\n\t\t\telse {\n\t\t\t\t// Default to left\n\t\t\t\tthis.picker.addClass('datepicker-orient-left');\n\t\t\t\tif (offset.left < 0)\n\t\t\t\t\tleft -= offset.left - visualPadding;\n\t\t\t\telse if (offset.left + calendarWidth > windowWidth)\n\t\t\t\t\tleft = windowWidth - calendarWidth - visualPadding;\n\t\t\t}\n\n\t\t\t// auto y orientation is best-situation: top or bottom, no fudging,\n\t\t\t// decision based on which shows more of the calendar\n\t\t\tvar yorient = this.o.orientation.y,\n\t\t\t\ttop_overflow, bottom_overflow;\n\t\t\tif (yorient === 'auto'){\n\t\t\t\ttop_overflow = -scrollTop + offset.top - calendarHeight;\n\t\t\t\tbottom_overflow = scrollTop + windowHeight - (offset.top + height + calendarHeight);\n\t\t\t\tif (Math.max(top_overflow, bottom_overflow) === bottom_overflow)\n\t\t\t\t\tyorient = 'top';\n\t\t\t\telse\n\t\t\t\t\tyorient = 'bottom';\n\t\t\t}\n\t\t\tthis.picker.addClass('datepicker-orient-' + yorient);\n\t\t\tif (yorient === 'top')\n\t\t\t\ttop += height;\n\t\t\telse\n\t\t\t\ttop -= calendarHeight + parseInt(this.picker.css('padding-top'));\n\n\t\t\tthis.picker.css({\n\t\t\t\ttop: top,\n\t\t\t\tleft: left,\n\t\t\t\tzIndex: zIndex\n\t\t\t});\n\t\t},\n\n\t\t_allow_update: true,\n\t\tupdate: function(){\n\t\t\tif (!this._allow_update)\n\t\t\t\treturn;\n\n\t\t\tvar oldDates = this.dates.copy(),\n\t\t\t\tdates = [],\n\t\t\t\tfromArgs = false;\n\t\t\tif (arguments.length){\n\t\t\t\t$.each(arguments, $.proxy(function(i, date){\n\t\t\t\t\tif (date instanceof Date)\n\t\t\t\t\t\tdate = this._local_to_utc(date);\n\t\t\t\t\tdates.push(date);\n\t\t\t\t}, this));\n\t\t\t\tfromArgs = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdates = this.isInput\n\t\t\t\t\t\t? this.element.val()\n\t\t\t\t\t\t: this.element.data('date') || this.element.find('input').val();\n\t\t\t\tif (dates && this.o.multidate)\n\t\t\t\t\tdates = dates.split(this.o.multidateSeparator);\n\t\t\t\telse\n\t\t\t\t\tdates = [dates];\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\n\t\t\tdates = $.map(dates, $.proxy(function(date){\n\t\t\t\treturn DPGlobal.parseDate(date, this.o.format, this.o.language);\n\t\t\t}, this));\n\t\t\tdates = $.grep(dates, $.proxy(function(date){\n\t\t\t\treturn (\n\t\t\t\t\tdate < this.o.startDate ||\n\t\t\t\t\tdate > this.o.endDate ||\n\t\t\t\t\t!date\n\t\t\t\t);\n\t\t\t}, this), true);\n\t\t\tthis.dates.replace(dates);\n\n\t\t\tif (this.dates.length)\n\t\t\t\tthis.viewDate = new Date(this.dates.get(-1));\n\t\t\telse if (this.viewDate < this.o.startDate)\n\t\t\t\tthis.viewDate = new Date(this.o.startDate);\n\t\t\telse if (this.viewDate > this.o.endDate)\n\t\t\t\tthis.viewDate = new Date(this.o.endDate);\n\n\t\t\tif (fromArgs){\n\t\t\t\t// setting date by clicking\n\t\t\t\tthis.setValue();\n\t\t\t}\n\t\t\telse if (dates.length){\n\t\t\t\t// setting date by typing\n\t\t\t\tif (String(oldDates) !== String(this.dates))\n\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t}\n\t\t\tif (!this.dates.length && oldDates.length)\n\t\t\t\tthis._trigger('clearDate');\n\n\t\t\tthis.fill();\n\t\t},\n\n\t\tfillDow: function(){\n\t\t\tvar dowCnt = this.o.weekStart,\n\t\t\t\thtml = '<tr>';\n\t\t\tif (this.o.calendarWeeks){\n\t\t\t\tvar cell = '<th class=\"cw\">&nbsp;</th>';\n\t\t\t\thtml += cell;\n\t\t\t\tthis.picker.find('.datepicker-days thead tr:first-child').prepend(cell);\n\t\t\t}\n\t\t\twhile (dowCnt < this.o.weekStart + 7){\n\t\t\t\thtml += '<th class=\"dow\">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';\n\t\t\t}\n\t\t\thtml += '</tr>';\n\t\t\tthis.picker.find('.datepicker-days thead').append(html);\n\t\t},\n\n\t\tfillMonths: function(){\n\t\t\tvar html = '',\n\t\t\ti = 0;\n\t\t\twhile (i < 12){\n\t\t\t\thtml += '<span class=\"month\">'+dates[this.o.language].monthsShort[i++]+'</span>';\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-months td').html(html);\n\t\t},\n\n\t\tsetRange: function(range){\n\t\t\tif (!range || !range.length)\n\t\t\t\tdelete this.range;\n\t\t\telse\n\t\t\t\tthis.range = $.map(range, function(d){\n\t\t\t\t\treturn d.valueOf();\n\t\t\t\t});\n\t\t\tthis.fill();\n\t\t},\n\n\t\tgetClassNames: function(date){\n\t\t\tvar cls = [],\n\t\t\t\tyear = this.viewDate.getUTCFullYear(),\n\t\t\t\tmonth = this.viewDate.getUTCMonth(),\n\t\t\t\ttoday = new Date();\n\t\t\tif (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){\n\t\t\t\tcls.push('old');\n\t\t\t}\n\t\t\telse if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){\n\t\t\t\tcls.push('new');\n\t\t\t}\n\t\t\tif (this.focusDate && date.valueOf() === this.focusDate.valueOf())\n\t\t\t\tcls.push('focused');\n\t\t\t// Compare internal UTC date with local today, not UTC today\n\t\t\tif (this.o.todayHighlight &&\n\t\t\t\tdate.getUTCFullYear() === today.getFullYear() &&\n\t\t\t\tdate.getUTCMonth() === today.getMonth() &&\n\t\t\t\tdate.getUTCDate() === today.getDate()){\n\t\t\t\tcls.push('today');\n\t\t\t}\n\t\t\tif (this.dates.contains(date) !== -1)\n\t\t\t\tcls.push('active');\n\t\t\tif (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate ||\n\t\t\t\t$.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1){\n\t\t\t\tcls.push('disabled');\n\t\t\t}\n\t\t\tif (this.range){\n\t\t\t\tif (date > this.range[0] && date < this.range[this.range.length-1]){\n\t\t\t\t\tcls.push('range');\n\t\t\t\t}\n\t\t\t\tif ($.inArray(date.valueOf(), this.range) !== -1){\n\t\t\t\t\tcls.push('selected');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cls;\n\t\t},\n\n\t\tfill: function(){\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth(),\n\t\t\t\tstartYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,\n\t\t\t\tstartMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,\n\t\t\t\tendYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,\n\t\t\t\tendMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,\n\t\t\t\ttodaytxt = dates[this.o.language].today || dates['en'].today || '',\n\t\t\t\tcleartxt = dates[this.o.language].clear || dates['en'].clear || '',\n\t\t\t\ttooltip;\n\t\t\tthis.picker.find('.datepicker-days thead th.datepicker-switch')\n\t\t\t\t\t\t.text(dates[this.o.language].months[month]+' '+year);\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.text(todaytxt)\n\t\t\t\t\t\t.toggle(this.o.todayBtn !== false);\n\t\t\tthis.picker.find('tfoot th.clear')\n\t\t\t\t\t\t.text(cleartxt)\n\t\t\t\t\t\t.toggle(this.o.clearBtn !== false);\n\t\t\tthis.updateNavArrows();\n\t\t\tthis.fillMonths();\n\t\t\tvar prevMonth = UTCDate(year, month-1, 28),\n\t\t\t\tday = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());\n\t\t\tprevMonth.setUTCDate(day);\n\t\t\tprevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);\n\t\t\tvar nextMonth = new Date(prevMonth);\n\t\t\tnextMonth.setUTCDate(nextMonth.getUTCDate() + 42);\n\t\t\tnextMonth = nextMonth.valueOf();\n\t\t\tvar html = [];\n\t\t\tvar clsName;\n\t\t\twhile (prevMonth.valueOf() < nextMonth){\n\t\t\t\tif (prevMonth.getUTCDay() === this.o.weekStart){\n\t\t\t\t\thtml.push('<tr>');\n\t\t\t\t\tif (this.o.calendarWeeks){\n\t\t\t\t\t\t// ISO 8601: First week contains first thursday.\n\t\t\t\t\t\t// ISO also states week starts on Monday, but we can be more abstract here.\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\t// Start of current week: based on weekstart/current date\n\t\t\t\t\t\t\tws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),\n\t\t\t\t\t\t\t// Thursday of this week\n\t\t\t\t\t\t\tth = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),\n\t\t\t\t\t\t\t// First Thursday of year, year from thursday\n\t\t\t\t\t\t\tyth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),\n\t\t\t\t\t\t\t// Calendar week: ms between thursdays, div ms per day, div 7 days\n\t\t\t\t\t\t\tcalWeek =  (th - yth) / 864e5 / 7 + 1;\n\t\t\t\t\t\thtml.push('<td class=\"cw\">'+ calWeek +'</td>');\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tclsName = this.getClassNames(prevMonth);\n\t\t\t\tclsName.push('day');\n\n\t\t\t\tif (this.o.beforeShowDay !== $.noop){\n\t\t\t\t\tvar before = this.o.beforeShowDay(this._utc_to_local(prevMonth));\n\t\t\t\t\tif (before === undefined)\n\t\t\t\t\t\tbefore = {};\n\t\t\t\t\telse if (typeof(before) === 'boolean')\n\t\t\t\t\t\tbefore = {enabled: before};\n\t\t\t\t\telse if (typeof(before) === 'string')\n\t\t\t\t\t\tbefore = {classes: before};\n\t\t\t\t\tif (before.enabled === false)\n\t\t\t\t\t\tclsName.push('disabled');\n\t\t\t\t\tif (before.classes)\n\t\t\t\t\t\tclsName = clsName.concat(before.classes.split(/\\s+/));\n\t\t\t\t\tif (before.tooltip)\n\t\t\t\t\t\ttooltip = before.tooltip;\n\t\t\t\t}\n\n\t\t\t\tclsName = $.unique(clsName);\n\t\t\t\thtml.push('<td class=\"'+clsName.join(' ')+'\"' + (tooltip ? ' title=\"'+tooltip+'\"' : '') + '>'+prevMonth.getUTCDate() + '</td>');\n\t\t\t\tif (prevMonth.getUTCDay() === this.o.weekEnd){\n\t\t\t\t\thtml.push('</tr>');\n\t\t\t\t}\n\t\t\t\tprevMonth.setUTCDate(prevMonth.getUTCDate()+1);\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-days tbody').empty().append(html.join(''));\n\n\t\t\tvar months = this.picker.find('.datepicker-months')\n\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t.text(year)\n\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t.find('span').removeClass('active');\n\n\t\t\t$.each(this.dates, function(i, d){\n\t\t\t\tif (d.getUTCFullYear() === year)\n\t\t\t\t\tmonths.eq(d.getUTCMonth()).addClass('active');\n\t\t\t});\n\n\t\t\tif (year < startYear || year > endYear){\n\t\t\t\tmonths.addClass('disabled');\n\t\t\t}\n\t\t\tif (year === startYear){\n\t\t\t\tmonths.slice(0, startMonth).addClass('disabled');\n\t\t\t}\n\t\t\tif (year === endYear){\n\t\t\t\tmonths.slice(endMonth+1).addClass('disabled');\n\t\t\t}\n\n\t\t\thtml = '';\n\t\t\tyear = parseInt(year/10, 10) * 10;\n\t\t\tvar yearCont = this.picker.find('.datepicker-years')\n\t\t\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t\t\t.text(year + '-' + (year + 9))\n\t\t\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t\t\t.find('td');\n\t\t\tyear -= 1;\n\t\t\tvar years = $.map(this.dates, function(d){\n\t\t\t\t\treturn d.getUTCFullYear();\n\t\t\t\t}),\n\t\t\t\tclasses;\n\t\t\tfor (var i = -1; i < 11; i++){\n\t\t\t\tclasses = ['year'];\n\t\t\t\tif (i === -1)\n\t\t\t\t\tclasses.push('old');\n\t\t\t\telse if (i === 10)\n\t\t\t\t\tclasses.push('new');\n\t\t\t\tif ($.inArray(year, years) !== -1)\n\t\t\t\t\tclasses.push('active');\n\t\t\t\tif (year < startYear || year > endYear)\n\t\t\t\t\tclasses.push('disabled');\n\t\t\t\thtml += '<span class=\"' + classes.join(' ') + '\">'+year+'</span>';\n\t\t\t\tyear += 1;\n\t\t\t}\n\t\t\tyearCont.html(html);\n\t\t},\n\n\t\tupdateNavArrows: function(){\n\t\t\tif (!this._allow_update)\n\t\t\t\treturn;\n\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth();\n\t\t\tswitch (this.viewMode){\n\t\t\t\tcase 0:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()){\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()){\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tclick: function(e){\n\t\t\te.preventDefault();\n\t\t\tvar target = $(e.target).closest('span, td, th'),\n\t\t\t\tyear, month, day;\n\t\t\tif (target.length === 1){\n\t\t\t\tswitch (target[0].nodeName.toLowerCase()){\n\t\t\t\t\tcase 'th':\n\t\t\t\t\t\tswitch (target[0].className){\n\t\t\t\t\t\t\tcase 'datepicker-switch':\n\t\t\t\t\t\t\t\tthis.showMode(1);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'prev':\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tvar dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1);\n\t\t\t\t\t\t\t\tswitch (this.viewMode){\n\t\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveMonth(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveYear(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tif (this.viewMode === 1)\n\t\t\t\t\t\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'today':\n\t\t\t\t\t\t\t\tvar date = new Date();\n\t\t\t\t\t\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\n\t\t\t\t\t\t\t\tthis.showMode(-2);\n\t\t\t\t\t\t\t\tvar which = this.o.todayBtn === 'linked' ? null : 'view';\n\t\t\t\t\t\t\t\tthis._setDate(date, which);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'clear':\n\t\t\t\t\t\t\t\tvar element;\n\t\t\t\t\t\t\t\tif (this.isInput)\n\t\t\t\t\t\t\t\t\telement = this.element;\n\t\t\t\t\t\t\t\telse if (this.component)\n\t\t\t\t\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t\t\t\t\tif (element)\n\t\t\t\t\t\t\t\t\telement.val(\"\").change();\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t\t\t\t\t\tif (this.o.autoclose)\n\t\t\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'span':\n\t\t\t\t\t\tif (!target.is('.disabled')){\n\t\t\t\t\t\t\tthis.viewDate.setUTCDate(1);\n\t\t\t\t\t\t\tif (target.is('.month')){\n\t\t\t\t\t\t\t\tday = 1;\n\t\t\t\t\t\t\t\tmonth = target.parent().find('span').index(target);\n\t\t\t\t\t\t\t\tyear = this.viewDate.getUTCFullYear();\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCMonth(month);\n\t\t\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 1){\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tday = 1;\n\t\t\t\t\t\t\t\tmonth = 0;\n\t\t\t\t\t\t\t\tyear = parseInt(target.text(), 10)||0;\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCFullYear(year);\n\t\t\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 2){\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.showMode(-1);\n\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'td':\n\t\t\t\t\t\tif (target.is('.day') && !target.is('.disabled')){\n\t\t\t\t\t\t\tday = parseInt(target.text(), 10)||1;\n\t\t\t\t\t\t\tyear = this.viewDate.getUTCFullYear();\n\t\t\t\t\t\t\tmonth = this.viewDate.getUTCMonth();\n\t\t\t\t\t\t\tif (target.is('.old')){\n\t\t\t\t\t\t\t\tif (month === 0){\n\t\t\t\t\t\t\t\t\tmonth = 11;\n\t\t\t\t\t\t\t\t\tyear -= 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tmonth -= 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (target.is('.new')){\n\t\t\t\t\t\t\t\tif (month === 11){\n\t\t\t\t\t\t\t\t\tmonth = 0;\n\t\t\t\t\t\t\t\t\tyear += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tmonth += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.picker.is(':visible') && this._focused_from){\n\t\t\t\t$(this._focused_from).focus();\n\t\t\t}\n\t\t\tdelete this._focused_from;\n\t\t},\n\n\t\t_toggle_multidate: function(date){\n\t\t\tvar ix = this.dates.contains(date);\n\t\t\tif (!date){\n\t\t\t\tthis.dates.clear();\n\t\t\t}\n\t\t\telse if (ix !== -1){\n\t\t\t\tthis.dates.remove(ix);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.dates.push(date);\n\t\t\t}\n\t\t\tif (typeof this.o.multidate === 'number')\n\t\t\t\twhile (this.dates.length > this.o.multidate)\n\t\t\t\t\tthis.dates.remove(0);\n\t\t},\n\n\t\t_setDate: function(date, which){\n\t\t\tif (!which || which === 'date')\n\t\t\t\tthis._toggle_multidate(date && new Date(date));\n\t\t\tif (!which || which  === 'view')\n\t\t\t\tthis.viewDate = date && new Date(date);\n\n\t\t\tthis.fill();\n\t\t\tthis.setValue();\n\t\t\tthis._trigger('changeDate');\n\t\t\tvar element;\n\t\t\tif (this.isInput){\n\t\t\t\telement = this.element;\n\t\t\t}\n\t\t\telse if (this.component){\n\t\t\t\telement = this.element.find('input');\n\t\t\t}\n\t\t\tif (element){\n\t\t\t\telement.change();\n\t\t\t}\n\t\t\tif (this.o.autoclose && (!which || which === 'date')){\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t},\n\n\t\tmoveMonth: function(date, dir){\n\t\t\tif (!date)\n\t\t\t\treturn undefined;\n\t\t\tif (!dir)\n\t\t\t\treturn date;\n\t\t\tvar new_date = new Date(date.valueOf()),\n\t\t\t\tday = new_date.getUTCDate(),\n\t\t\t\tmonth = new_date.getUTCMonth(),\n\t\t\t\tmag = Math.abs(dir),\n\t\t\t\tnew_month, test;\n\t\t\tdir = dir > 0 ? 1 : -1;\n\t\t\tif (mag === 1){\n\t\t\t\ttest = dir === -1\n\t\t\t\t\t// If going back one month, make sure month is not current month\n\t\t\t\t\t// (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t? function(){\n\t\t\t\t\t\treturn new_date.getUTCMonth() === month;\n\t\t\t\t\t}\n\t\t\t\t\t// If going forward one month, make sure month is as expected\n\t\t\t\t\t// (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t: function(){\n\t\t\t\t\t\treturn new_date.getUTCMonth() !== new_month;\n\t\t\t\t\t};\n\t\t\t\tnew_month = month + dir;\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t\t// Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11\n\t\t\t\tif (new_month < 0 || new_month > 11)\n\t\t\t\t\tnew_month = (new_month + 12) % 12;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// For magnitudes >1, move one month at a time...\n\t\t\t\tfor (var i=0; i < mag; i++)\n\t\t\t\t\t// ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...\n\t\t\t\t\tnew_date = this.moveMonth(new_date, dir);\n\t\t\t\t// ...then reset the day, keeping it in the new month\n\t\t\t\tnew_month = new_date.getUTCMonth();\n\t\t\t\tnew_date.setUTCDate(day);\n\t\t\t\ttest = function(){\n\t\t\t\t\treturn new_month !== new_date.getUTCMonth();\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Common date-resetting loop -- if date is beyond end of month, make it\n\t\t\t// end of month\n\t\t\twhile (test()){\n\t\t\t\tnew_date.setUTCDate(--day);\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t}\n\t\t\treturn new_date;\n\t\t},\n\n\t\tmoveYear: function(date, dir){\n\t\t\treturn this.moveMonth(date, dir*12);\n\t\t},\n\n\t\tdateWithinRange: function(date){\n\t\t\treturn date >= this.o.startDate && date <= this.o.endDate;\n\t\t},\n\n\t\tkeydown: function(e){\n\t\t\tif (this.picker.is(':not(:visible)')){\n\t\t\t\tif (e.keyCode === 27) // allow escape to hide and re-show picker\n\t\t\t\t\tthis.show();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar dateChanged = false,\n\t\t\t\tdir, newDate, newViewDate,\n\t\t\t\tfocusDate = this.focusDate || this.viewDate;\n\t\t\tswitch (e.keyCode){\n\t\t\t\tcase 27: // escape\n\t\t\t\t\tif (this.focusDate){\n\t\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.hide();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 37: // left\n\t\t\t\tcase 39: // right\n\t\t\t\t\tif (!this.o.keyboardNavigation)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdir = e.keyCode === 37 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewDate = new Date(this.dates.get(-1) || UTCToday());\n\t\t\t\t\t\tnewDate.setUTCDate(newDate.getUTCDate() + dir);\n\t\t\t\t\t\tnewViewDate = new Date(focusDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(focusDate.getUTCDate() + dir);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.focusDate = this.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38: // up\n\t\t\t\tcase 40: // down\n\t\t\t\t\tif (!this.o.keyboardNavigation)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdir = e.keyCode === 38 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewDate = new Date(this.dates.get(-1) || UTCToday());\n\t\t\t\t\t\tnewDate.setUTCDate(newDate.getUTCDate() + dir * 7);\n\t\t\t\t\t\tnewViewDate = new Date(focusDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(focusDate.getUTCDate() + dir * 7);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.focusDate = this.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32: // spacebar\n\t\t\t\t\t// Spacebar is used in manually typing dates in some formats.\n\t\t\t\t\t// As such, its behavior should not be hijacked.\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13: // enter\n\t\t\t\t\tfocusDate = this.focusDate || this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis._toggle_multidate(focusDate);\n\t\t\t\t\tdateChanged = true;\n\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis.setValue();\n\t\t\t\t\tthis.fill();\n\t\t\t\t\tif (this.picker.is(':visible')){\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (this.o.autoclose)\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 9: // tab\n\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis.fill();\n\t\t\t\t\tthis.hide();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (dateChanged){\n\t\t\t\tif (this.dates.length)\n\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t\telse\n\t\t\t\t\tthis._trigger('clearDate');\n\t\t\t\tvar element;\n\t\t\t\tif (this.isInput){\n\t\t\t\t\telement = this.element;\n\t\t\t\t}\n\t\t\t\telse if (this.component){\n\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t}\n\t\t\t\tif (element){\n\t\t\t\t\telement.change();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tshowMode: function(dir){\n\t\t\tif (dir){\n\t\t\t\tthis.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir));\n\t\t\t}\n\t\t\tthis.picker\n\t\t\t\t.find('>div')\n\t\t\t\t.hide()\n\t\t\t\t.filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName)\n\t\t\t\t\t.css('display', 'block');\n\t\t\tthis.updateNavArrows();\n\t\t}\n\t};\n\n\tvar DateRangePicker = function(element, options){\n\t\tthis.element = $(element);\n\t\tthis.inputs = $.map(options.inputs, function(i){\n\t\t\treturn i.jquery ? i[0] : i;\n\t\t});\n\t\tdelete options.inputs;\n\n\t\t$(this.inputs)\n\t\t\t.datepicker(options)\n\t\t\t.bind('changeDate', $.proxy(this.dateUpdated, this));\n\n\t\tthis.pickers = $.map(this.inputs, function(i){\n\t\t\treturn $(i).data('datepicker');\n\t\t});\n\t\tthis.updateDates();\n\t};\n\tDateRangePicker.prototype = {\n\t\tupdateDates: function(){\n\t\t\tthis.dates = $.map(this.pickers, function(i){\n\t\t\t\treturn i.getUTCDate();\n\t\t\t});\n\t\t\tthis.updateRanges();\n\t\t},\n\t\tupdateRanges: function(){\n\t\t\tvar range = $.map(this.dates, function(d){\n\t\t\t\treturn d.valueOf();\n\t\t\t});\n\t\t\t$.each(this.pickers, function(i, p){\n\t\t\t\tp.setRange(range);\n\t\t\t});\n\t\t},\n\t\tdateUpdated: function(e){\n\t\t\t// `this.updating` is a workaround for preventing infinite recursion\n\t\t\t// between `changeDate` triggering and `setUTCDate` calling.  Until\n\t\t\t// there is a better mechanism.\n\t\t\tif (this.updating)\n\t\t\t\treturn;\n\t\t\tthis.updating = true;\n\n\t\t\tvar dp = $(e.target).data('datepicker'),\n\t\t\t\tnew_date = dp.getUTCDate(),\n\t\t\t\ti = $.inArray(e.target, this.inputs),\n\t\t\t\tl = this.inputs.length;\n\t\t\tif (i === -1)\n\t\t\t\treturn;\n\n\t\t\t$.each(this.pickers, function(i, p){\n\t\t\t\tif (!p.getUTCDate())\n\t\t\t\t\tp.setUTCDate(new_date);\n\t\t\t});\n\n\t\t\tif (new_date < this.dates[i]){\n\t\t\t\t// Date being moved earlier/left\n\t\t\t\twhile (i >= 0 && new_date < this.dates[i]){\n\t\t\t\t\tthis.pickers[i--].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (new_date > this.dates[i]){\n\t\t\t\t// Date being moved later/right\n\t\t\t\twhile (i < l && new_date > this.dates[i]){\n\t\t\t\t\tthis.pickers[i++].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateDates();\n\n\t\t\tdelete this.updating;\n\t\t},\n\t\tremove: function(){\n\t\t\t$.map(this.pickers, function(p){ p.remove(); });\n\t\t\tdelete this.element.data().datepicker;\n\t\t}\n\t};\n\n\tfunction opts_from_el(el, prefix){\n\t\t// Derive options from element data-attrs\n\t\tvar data = $(el).data(),\n\t\t\tout = {}, inkey,\n\t\t\treplace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');\n\t\tprefix = new RegExp('^' + prefix.toLowerCase());\n\t\tfunction re_lower(_,a){\n\t\t\treturn a.toLowerCase();\n\t\t}\n\t\tfor (var key in data)\n\t\t\tif (prefix.test(key)){\n\t\t\t\tinkey = key.replace(replace, re_lower);\n\t\t\t\tout[inkey] = data[key];\n\t\t\t}\n\t\treturn out;\n\t}\n\n\tfunction opts_from_locale(lang){\n\t\t// Derive options from locale plugins\n\t\tvar out = {};\n\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t// fallback to 2 letter code eg \"de\"\n\t\tif (!dates[lang]){\n\t\t\tlang = lang.split('-')[0];\n\t\t\tif (!dates[lang])\n\t\t\t\treturn;\n\t\t}\n\t\tvar d = dates[lang];\n\t\t$.each(locale_opts, function(i,k){\n\t\t\tif (k in d)\n\t\t\t\tout[k] = d[k];\n\t\t});\n\t\treturn out;\n\t}\n\n\tvar old = $.fn.datepicker;\n\t$.fn.datepicker = function(option){\n\t\tvar args = Array.apply(null, arguments);\n\t\targs.shift();\n\t\tvar internal_return;\n\t\tthis.each(function(){\n\t\t\tvar $this = $(this),\n\t\t\t\tdata = $this.data('datepicker'),\n\t\t\t\toptions = typeof option === 'object' && option;\n\t\t\tif (!data){\n\t\t\t\tvar elopts = opts_from_el(this, 'date'),\n\t\t\t\t\t// Preliminary otions\n\t\t\t\t\txopts = $.extend({}, defaults, elopts, options),\n\t\t\t\t\tlocopts = opts_from_locale(xopts.language),\n\t\t\t\t\t// Options priority: js args, data-attrs, locales, defaults\n\t\t\t\t\topts = $.extend({}, defaults, locopts, elopts, options);\n\t\t\t\tif ($this.is('.input-daterange') || opts.inputs){\n\t\t\t\t\tvar ropts = {\n\t\t\t\t\t\tinputs: opts.inputs || $this.find('input').toArray()\n\t\t\t\t\t};\n\t\t\t\t\t$this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts))));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$this.data('datepicker', (data = new Datepicker(this, opts)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof option === 'string' && typeof data[option] === 'function'){\n\t\t\t\tinternal_return = data[option].apply(data, args);\n\t\t\t\tif (internal_return !== undefined)\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif (internal_return !== undefined)\n\t\t\treturn internal_return;\n\t\telse\n\t\t\treturn this;\n\t};\n\n\tvar defaults = $.fn.datepicker.defaults = {\n\t\tautoclose: false,\n\t\tbeforeShowDay: $.noop,\n\t\tcalendarWeeks: false,\n\t\tclearBtn: false,\n\t\tdaysOfWeekDisabled: [],\n\t\tendDate: Infinity,\n\t\tforceParse: true,\n\t\tformat: 'mm/dd/yyyy',\n\t\tkeyboardNavigation: true,\n\t\tlanguage: 'en',\n\t\tminViewMode: 0,\n\t\tmultidate: false,\n\t\tmultidateSeparator: ',',\n\t\torientation: \"auto\",\n\t\trtl: false,\n\t\tstartDate: -Infinity,\n\t\tstartView: 0,\n\t\ttodayBtn: false,\n\t\ttodayHighlight: false,\n\t\tweekStart: 0\n\t};\n\tvar locale_opts = $.fn.datepicker.locale_opts = [\n\t\t'format',\n\t\t'rtl',\n\t\t'weekStart'\n\t];\n\t$.fn.datepicker.Constructor = Datepicker;\n\tvar dates = $.fn.datepicker.dates = {\n\t\ten: {\n\t\t\tdays: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"],\n\t\t\tdaysShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n\t\t\tdaysMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"],\n\t\t\tmonths: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tmonthsShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\ttoday: \"Today\",\n\t\t\tclear: \"Clear\"\n\t\t}\n\t};\n\n\tvar DPGlobal = {\n\t\tmodes: [\n\t\t\t{\n\t\t\t\tclsName: 'days',\n\t\t\t\tnavFnc: 'Month',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'months',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'years',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 10\n\t\t}],\n\t\tisLeapYear: function(year){\n\t\t\treturn (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n\t\t},\n\t\tgetDaysInMonth: function(year, month){\n\t\t\treturn [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n\t\t},\n\t\tvalidParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,\n\t\tnonpunctuation: /[^ -\\/:-@\\[\\u3400-\\u9fff-`{-~\\t\\n\\r]+/g,\n\t\tparseFormat: function(format){\n\t\t\t// IE treats \\0 as a string end in inputs (truncating the value),\n\t\t\t// so it's a bad format delimiter, anyway\n\t\t\tvar separators = format.replace(this.validParts, '\\0').split('\\0'),\n\t\t\t\tparts = format.match(this.validParts);\n\t\t\tif (!separators || !separators.length || !parts || parts.length === 0){\n\t\t\t\tthrow new Error(\"Invalid date format.\");\n\t\t\t}\n\t\t\treturn {separators: separators, parts: parts};\n\t\t},\n\t\tparseDate: function(date, format, language){\n\t\t\tif (!date)\n\t\t\t\treturn undefined;\n\t\t\tif (date instanceof Date)\n\t\t\t\treturn date;\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tvar part_re = /([\\-+]\\d+)([dmwy])/,\n\t\t\t\tparts = date.match(/([\\-+]\\d+)([dmwy])/g),\n\t\t\t\tpart, dir, i;\n\t\t\tif (/^[\\-+]\\d+[dmwy]([\\s,]+[\\-+]\\d+[dmwy])*$/.test(date)){\n\t\t\t\tdate = new Date();\n\t\t\t\tfor (i=0; i < parts.length; i++){\n\t\t\t\t\tpart = part_re.exec(parts[i]);\n\t\t\t\t\tdir = parseInt(part[1]);\n\t\t\t\t\tswitch (part[2]){\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'w':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir * 7);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);\n\t\t\t}\n\t\t\tparts = date && date.match(this.nonpunctuation) || [];\n\t\t\tdate = new Date();\n\t\t\tvar parsed = {},\n\t\t\t\tsetters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],\n\t\t\t\tsetters_map = {\n\t\t\t\t\tyyyy: function(d,v){\n\t\t\t\t\t\treturn d.setUTCFullYear(v);\n\t\t\t\t\t},\n\t\t\t\t\tyy: function(d,v){\n\t\t\t\t\t\treturn d.setUTCFullYear(2000+v);\n\t\t\t\t\t},\n\t\t\t\t\tm: function(d,v){\n\t\t\t\t\t\tif (isNaN(d))\n\t\t\t\t\t\t\treturn d;\n\t\t\t\t\t\tv -= 1;\n\t\t\t\t\t\twhile (v < 0) v += 12;\n\t\t\t\t\t\tv %= 12;\n\t\t\t\t\t\td.setUTCMonth(v);\n\t\t\t\t\t\twhile (d.getUTCMonth() !== v)\n\t\t\t\t\t\t\td.setUTCDate(d.getUTCDate()-1);\n\t\t\t\t\t\treturn d;\n\t\t\t\t\t},\n\t\t\t\t\td: function(d,v){\n\t\t\t\t\t\treturn d.setUTCDate(v);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tval, filtered;\n\t\t\tsetters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];\n\t\t\tsetters_map['dd'] = setters_map['d'];\n\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\t\t\tvar fparts = format.parts.slice();\n\t\t\t// Remove noop parts\n\t\t\tif (parts.length !== fparts.length){\n\t\t\t\tfparts = $(fparts).filter(function(i,p){\n\t\t\t\t\treturn $.inArray(p, setters_order) !== -1;\n\t\t\t\t}).toArray();\n\t\t\t}\n\t\t\t// Process remainder\n\t\t\tfunction match_part(){\n\t\t\t\tvar m = this.slice(0, parts[i].length),\n\t\t\t\t\tp = parts[i].slice(0, m.length);\n\t\t\t\treturn m === p;\n\t\t\t}\n\t\t\tif (parts.length === fparts.length){\n\t\t\t\tvar cnt;\n\t\t\t\tfor (i=0, cnt = fparts.length; i < cnt; i++){\n\t\t\t\t\tval = parseInt(parts[i], 10);\n\t\t\t\t\tpart = fparts[i];\n\t\t\t\t\tif (isNaN(val)){\n\t\t\t\t\t\tswitch (part){\n\t\t\t\t\t\t\tcase 'MM':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].months).filter(match_part);\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].months) + 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].monthsShort).filter(match_part);\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].monthsShort) + 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparsed[part] = val;\n\t\t\t\t}\n\t\t\t\tvar _date, s;\n\t\t\t\tfor (i=0; i < setters_order.length; i++){\n\t\t\t\t\ts = setters_order[i];\n\t\t\t\t\tif (s in parsed && !isNaN(parsed[s])){\n\t\t\t\t\t\t_date = new Date(date);\n\t\t\t\t\t\tsetters_map[s](_date, parsed[s]);\n\t\t\t\t\t\tif (!isNaN(_date))\n\t\t\t\t\t\t\tdate = _date;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn date;\n\t\t},\n\t\tformatDate: function(date, format, language){\n\t\t\tif (!date)\n\t\t\t\treturn '';\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tvar val = {\n\t\t\t\td: date.getUTCDate(),\n\t\t\t\tD: dates[language].daysShort[date.getUTCDay()],\n\t\t\t\tDD: dates[language].days[date.getUTCDay()],\n\t\t\t\tm: date.getUTCMonth() + 1,\n\t\t\t\tM: dates[language].monthsShort[date.getUTCMonth()],\n\t\t\t\tMM: dates[language].months[date.getUTCMonth()],\n\t\t\t\tyy: date.getUTCFullYear().toString().substring(2),\n\t\t\t\tyyyy: date.getUTCFullYear()\n\t\t\t};\n\t\t\tval.dd = (val.d < 10 ? '0' : '') + val.d;\n\t\t\tval.mm = (val.m < 10 ? '0' : '') + val.m;\n\t\t\tdate = [];\n\t\t\tvar seps = $.extend([], format.separators);\n\t\t\tfor (var i=0, cnt = format.parts.length; i <= cnt; i++){\n\t\t\t\tif (seps.length)\n\t\t\t\t\tdate.push(seps.shift());\n\t\t\t\tdate.push(val[format.parts[i]]);\n\t\t\t}\n\t\t\treturn date.join('');\n\t\t},\n\t\theadTemplate: '<thead>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th class=\"prev\">&laquo;</th>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"5\" class=\"datepicker-switch\"></th>'+\n\t\t\t\t\t\t\t\t'<th class=\"next\">&raquo;</th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</thead>',\n\t\tcontTemplate: '<tbody><tr><td colspan=\"7\"></td></tr></tbody>',\n\t\tfootTemplate: '<tfoot>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"7\" class=\"today\"></th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"7\" class=\"clear\"></th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</tfoot>'\n\t};\n\tDPGlobal.template = '<div class=\"datepicker\">'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-days\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\t'<tbody></tbody>'+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-months\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-years\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t'</div>';\n\n\t$.fn.datepicker.DPGlobal = DPGlobal;\n\n\n\t/* DATEPICKER NO CONFLICT\n\t* =================== */\n\n\t$.fn.datepicker.noConflict = function(){\n\t\t$.fn.datepicker = old;\n\t\treturn this;\n\t};\n\n\n\t/* DATEPICKER DATA-API\n\t* ================== */\n\n\t$(document).on(\n\t\t'focus.datepicker.data-api click.datepicker.data-api',\n\t\t'[data-provide=\"datepicker\"]',\n\t\tfunction(e){\n\t\t\tvar $this = $(this);\n\t\t\tif ($this.data('datepicker'))\n\t\t\t\treturn;\n\t\t\te.preventDefault();\n\t\t\t// component click requires us to explicitly show it\n\t\t\t$this.datepicker('show');\n\t\t}\n\t);\n\t$(function(){\n\t\t$('[data-provide=\"datepicker-inline\"]').datepicker();\n\t});\n\n}(window.jQuery));\n","/*!\n * Select2 4.0.0\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\n */\n(function (factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(['jquery'], factory);\n  } else if (typeof exports === 'object') {\n    // Node/CommonJS\n    factory(require('jquery'));\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n}(function (jQuery) {\n  // This is needed so we can catch the AMD loader configuration and use it\n  // The inner file should be wrapped (by `banner.start.js`) in a function that\n  // returns the AMD loader references.\n  var S2 =\n(function () {\n  // Restore the Select2 AMD loader so it can be used\n  // Needed mostly in the language files, where the loader is not inserted\n  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {\n    var S2 = jQuery.fn.select2.amd;\n  }\nvar S2;(function () { if (!S2 || !S2.requirejs) {\nif (!S2) { S2 = {}; } else { require = S2; }\n/**\n * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/almond for details\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*jslint sloppy: true */\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n    var main, req, makeMap, handlers,\n        defined = {},\n        waiting = {},\n        config = {},\n        defining = {},\n        hasOwn = Object.prototype.hasOwnProperty,\n        aps = [].slice,\n        jsSuffixRegExp = /\\.js$/;\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    /**\n     * Given a relative module name, like ./something, normalize it to\n     * a real name that can be mapped to a path.\n     * @param {String} name the relative name\n     * @param {String} baseName a real name that the name arg is relative\n     * to.\n     * @returns {String} normalized name\n     */\n    function normalize(name, baseName) {\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n            foundI, foundStarMap, starI, i, j, part,\n            baseParts = baseName && baseName.split(\"/\"),\n            map = config.map,\n            starMap = (map && map['*']) || {};\n\n        //Adjust any relative paths.\n        if (name && name.charAt(0) === \".\") {\n            //If have a base name, try to normalize against it,\n            //otherwise, assume it is a top-level require that will\n            //be relative to baseUrl in the end.\n            if (baseName) {\n                //Convert baseName to array, and lop off the last part,\n                //so that . matches that \"directory\" and not name of the baseName's\n                //module. For instance, baseName of \"one/two/three\", maps to\n                //\"one/two/three.js\", but we want the directory, \"one/two\" for\n                //this normalization.\n                baseParts = baseParts.slice(0, baseParts.length - 1);\n                name = name.split('/');\n                lastIndex = name.length - 1;\n\n                // Node .js allowance:\n                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n                }\n\n                name = baseParts.concat(name);\n\n                //start trimDots\n                for (i = 0; i < name.length; i += 1) {\n                    part = name[i];\n                    if (part === \".\") {\n                        name.splice(i, 1);\n                        i -= 1;\n                    } else if (part === \"..\") {\n                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {\n                            //End of the line. Keep at least one non-dot\n                            //path segment at the front so it can be mapped\n                            //correctly to disk. Otherwise, there is likely\n                            //no path mapping for a path starting with '..'.\n                            //This can still fail, but catches the most reasonable\n                            //uses of ..\n                            break;\n                        } else if (i > 0) {\n                            name.splice(i - 1, 2);\n                            i -= 2;\n                        }\n                    }\n                }\n                //end trimDots\n\n                name = name.join(\"/\");\n            } else if (name.indexOf('./') === 0) {\n                // No baseName, so this is ID is resolved relative\n                // to baseUrl, pull off the leading dot.\n                name = name.substring(2);\n            }\n        }\n\n        //Apply map config if available.\n        if ((baseParts || starMap) && map) {\n            nameParts = name.split('/');\n\n            for (i = nameParts.length; i > 0; i -= 1) {\n                nameSegment = nameParts.slice(0, i).join(\"/\");\n\n                if (baseParts) {\n                    //Find the longest baseName segment match in the config.\n                    //So, do joins on the biggest to smallest lengths of baseParts.\n                    for (j = baseParts.length; j > 0; j -= 1) {\n                        mapValue = map[baseParts.slice(0, j).join('/')];\n\n                        //baseName segment has  config, find if it has one for\n                        //this name.\n                        if (mapValue) {\n                            mapValue = mapValue[nameSegment];\n                            if (mapValue) {\n                                //Match, update name to the new value.\n                                foundMap = mapValue;\n                                foundI = i;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (foundMap) {\n                    break;\n                }\n\n                //Check for a star map match, but just hold on to it,\n                //if there is a shorter segment match later in a matching\n                //config, then favor over this star map.\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\n                    foundStarMap = starMap[nameSegment];\n                    starI = i;\n                }\n            }\n\n            if (!foundMap && foundStarMap) {\n                foundMap = foundStarMap;\n                foundI = starI;\n            }\n\n            if (foundMap) {\n                nameParts.splice(0, foundI, foundMap);\n                name = nameParts.join('/');\n            }\n        }\n\n        return name;\n    }\n\n    function makeRequire(relName, forceSync) {\n        return function () {\n            //A version of a require function that passes a moduleName\n            //value for items that may need to\n            //look up paths relative to the moduleName\n            return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));\n        };\n    }\n\n    function makeNormalize(relName) {\n        return function (name) {\n            return normalize(name, relName);\n        };\n    }\n\n    function makeLoad(depName) {\n        return function (value) {\n            defined[depName] = value;\n        };\n    }\n\n    function callDep(name) {\n        if (hasProp(waiting, name)) {\n            var args = waiting[name];\n            delete waiting[name];\n            defining[name] = true;\n            main.apply(undef, args);\n        }\n\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\n            throw new Error('No ' + name);\n        }\n        return defined[name];\n    }\n\n    //Turns a plugin!resource to [plugin, resource]\n    //with the plugin being undefined if the name\n    //did not have a plugin prefix.\n    function splitPrefix(name) {\n        var prefix,\n            index = name ? name.indexOf('!') : -1;\n        if (index > -1) {\n            prefix = name.substring(0, index);\n            name = name.substring(index + 1, name.length);\n        }\n        return [prefix, name];\n    }\n\n    /**\n     * Makes a name map, normalizing the name, and using a plugin\n     * for normalization if necessary. Grabs a ref to plugin\n     * too, as an optimization.\n     */\n    makeMap = function (name, relName) {\n        var plugin,\n            parts = splitPrefix(name),\n            prefix = parts[0];\n\n        name = parts[1];\n\n        if (prefix) {\n            prefix = normalize(prefix, relName);\n            plugin = callDep(prefix);\n        }\n\n        //Normalize according\n        if (prefix) {\n            if (plugin && plugin.normalize) {\n                name = plugin.normalize(name, makeNormalize(relName));\n            } else {\n                name = normalize(name, relName);\n            }\n        } else {\n            name = normalize(name, relName);\n            parts = splitPrefix(name);\n            prefix = parts[0];\n            name = parts[1];\n            if (prefix) {\n                plugin = callDep(prefix);\n            }\n        }\n\n        //Using ridiculous property names for space reasons\n        return {\n            f: prefix ? prefix + '!' + name : name, //fullName\n            n: name,\n            pr: prefix,\n            p: plugin\n        };\n    };\n\n    function makeConfig(name) {\n        return function () {\n            return (config && config.config && config.config[name]) || {};\n        };\n    }\n\n    handlers = {\n        require: function (name) {\n            return makeRequire(name);\n        },\n        exports: function (name) {\n            var e = defined[name];\n            if (typeof e !== 'undefined') {\n                return e;\n            } else {\n                return (defined[name] = {});\n            }\n        },\n        module: function (name) {\n            return {\n                id: name,\n                uri: '',\n                exports: defined[name],\n                config: makeConfig(name)\n            };\n        }\n    };\n\n    main = function (name, deps, callback, relName) {\n        var cjsModule, depName, ret, map, i,\n            args = [],\n            callbackType = typeof callback,\n            usingExports;\n\n        //Use name if no relName\n        relName = relName || name;\n\n        //Call the callback to define the module, if necessary.\n        if (callbackType === 'undefined' || callbackType === 'function') {\n            //Pull out the defined dependencies and pass the ordered\n            //values to the callback.\n            //Default to [require, exports, module] if no deps\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n            for (i = 0; i < deps.length; i += 1) {\n                map = makeMap(deps[i], relName);\n                depName = map.f;\n\n                //Fast path CommonJS standard dependencies.\n                if (depName === \"require\") {\n                    args[i] = handlers.require(name);\n                } else if (depName === \"exports\") {\n                    //CommonJS module spec 1.1\n                    args[i] = handlers.exports(name);\n                    usingExports = true;\n                } else if (depName === \"module\") {\n                    //CommonJS module spec 1.1\n                    cjsModule = args[i] = handlers.module(name);\n                } else if (hasProp(defined, depName) ||\n                           hasProp(waiting, depName) ||\n                           hasProp(defining, depName)) {\n                    args[i] = callDep(depName);\n                } else if (map.p) {\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n                    args[i] = defined[depName];\n                } else {\n                    throw new Error(name + ' missing ' + depName);\n                }\n            }\n\n            ret = callback ? callback.apply(defined[name], args) : undefined;\n\n            if (name) {\n                //If setting exports via \"module\" is in play,\n                //favor that over return value and exports. After that,\n                //favor a non-undefined return value over exports use.\n                if (cjsModule && cjsModule.exports !== undef &&\n                        cjsModule.exports !== defined[name]) {\n                    defined[name] = cjsModule.exports;\n                } else if (ret !== undef || !usingExports) {\n                    //Use the return value from the function.\n                    defined[name] = ret;\n                }\n            }\n        } else if (name) {\n            //May just be an object definition for the module. Only\n            //worry about defining if have a module name.\n            defined[name] = callback;\n        }\n    };\n\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n        if (typeof deps === \"string\") {\n            if (handlers[deps]) {\n                //callback in this case is really relName\n                return handlers[deps](callback);\n            }\n            //Just return the module wanted. In this scenario, the\n            //deps arg is the module name, and second arg (if passed)\n            //is just the relName.\n            //Normalize module name, if it contains . or ..\n            return callDep(makeMap(deps, callback).f);\n        } else if (!deps.splice) {\n            //deps is a config object, not an array.\n            config = deps;\n            if (config.deps) {\n                req(config.deps, config.callback);\n            }\n            if (!callback) {\n                return;\n            }\n\n            if (callback.splice) {\n                //callback is an array, which means it is a dependency list.\n                //Adjust args if there are dependencies\n                deps = callback;\n                callback = relName;\n                relName = null;\n            } else {\n                deps = undef;\n            }\n        }\n\n        //Support require(['a'])\n        callback = callback || function () {};\n\n        //If relName is a function, it is an errback handler,\n        //so remove it.\n        if (typeof relName === 'function') {\n            relName = forceSync;\n            forceSync = alt;\n        }\n\n        //Simulate async callback;\n        if (forceSync) {\n            main(undef, deps, callback, relName);\n        } else {\n            //Using a non-zero value because of concern for what old browsers\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n            //If want a value immediately, use require('id') instead -- something\n            //that works in almond on the global level, but not guaranteed and\n            //unlikely to work in other AMD implementations.\n            setTimeout(function () {\n                main(undef, deps, callback, relName);\n            }, 4);\n        }\n\n        return req;\n    };\n\n    /**\n     * Just drops the config on the floor, but returns req in case\n     * the config return value is used.\n     */\n    req.config = function (cfg) {\n        return req(cfg);\n    };\n\n    /**\n     * Expose module registry for debugging and tooling\n     */\n    requirejs._defined = defined;\n\n    define = function (name, deps, callback) {\n\n        //This module may not have dependencies\n        if (!deps.splice) {\n            //deps is not an array, so probably means\n            //an object literal or factory function for\n            //the value. Adjust args.\n            callback = deps;\n            deps = [];\n        }\n\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n            waiting[name] = [name, deps, callback];\n        }\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n}());\n\nS2.requirejs = requirejs;S2.require = require;S2.define = define;\n}\n}());\nS2.define(\"almond\", function(){});\n\n/* global jQuery:false, $:false */\nS2.define('jquery',[],function () {\n  var _$ = jQuery || $;\n\n  if (_$ == null && console && console.error) {\n    console.error(\n      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +\n      'found. Make sure that you are including jQuery before Select2 on your ' +\n      'web page.'\n    );\n  }\n\n  return _$;\n});\n\nS2.define('select2/utils',[\n  'jquery'\n], function ($) {\n  var Utils = {};\n\n  Utils.Extend = function (ChildClass, SuperClass) {\n    var __hasProp = {}.hasOwnProperty;\n\n    function BaseConstructor () {\n      this.constructor = ChildClass;\n    }\n\n    for (var key in SuperClass) {\n      if (__hasProp.call(SuperClass, key)) {\n        ChildClass[key] = SuperClass[key];\n      }\n    }\n\n    BaseConstructor.prototype = SuperClass.prototype;\n    ChildClass.prototype = new BaseConstructor();\n    ChildClass.__super__ = SuperClass.prototype;\n\n    return ChildClass;\n  };\n\n  function getMethods (theClass) {\n    var proto = theClass.prototype;\n\n    var methods = [];\n\n    for (var methodName in proto) {\n      var m = proto[methodName];\n\n      if (typeof m !== 'function') {\n        continue;\n      }\n\n      if (methodName === 'constructor') {\n        continue;\n      }\n\n      methods.push(methodName);\n    }\n\n    return methods;\n  }\n\n  Utils.Decorate = function (SuperClass, DecoratorClass) {\n    var decoratedMethods = getMethods(DecoratorClass);\n    var superMethods = getMethods(SuperClass);\n\n    function DecoratedClass () {\n      var unshift = Array.prototype.unshift;\n\n      var argCount = DecoratorClass.prototype.constructor.length;\n\n      var calledConstructor = SuperClass.prototype.constructor;\n\n      if (argCount > 0) {\n        unshift.call(arguments, SuperClass.prototype.constructor);\n\n        calledConstructor = DecoratorClass.prototype.constructor;\n      }\n\n      calledConstructor.apply(this, arguments);\n    }\n\n    DecoratorClass.displayName = SuperClass.displayName;\n\n    function ctr () {\n      this.constructor = DecoratedClass;\n    }\n\n    DecoratedClass.prototype = new ctr();\n\n    for (var m = 0; m < superMethods.length; m++) {\n        var superMethod = superMethods[m];\n\n        DecoratedClass.prototype[superMethod] =\n          SuperClass.prototype[superMethod];\n    }\n\n    var calledMethod = function (methodName) {\n      // Stub out the original method if it's not decorating an actual method\n      var originalMethod = function () {};\n\n      if (methodName in DecoratedClass.prototype) {\n        originalMethod = DecoratedClass.prototype[methodName];\n      }\n\n      var decoratedMethod = DecoratorClass.prototype[methodName];\n\n      return function () {\n        var unshift = Array.prototype.unshift;\n\n        unshift.call(arguments, originalMethod);\n\n        return decoratedMethod.apply(this, arguments);\n      };\n    };\n\n    for (var d = 0; d < decoratedMethods.length; d++) {\n      var decoratedMethod = decoratedMethods[d];\n\n      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n    }\n\n    return DecoratedClass;\n  };\n\n  var Observable = function () {\n    this.listeners = {};\n  };\n\n  Observable.prototype.on = function (event, callback) {\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.listeners[event].push(callback);\n    } else {\n      this.listeners[event] = [callback];\n    }\n  };\n\n  Observable.prototype.trigger = function (event) {\n    var slice = Array.prototype.slice;\n\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.invoke(this.listeners[event], slice.call(arguments, 1));\n    }\n\n    if ('*' in this.listeners) {\n      this.invoke(this.listeners['*'], arguments);\n    }\n  };\n\n  Observable.prototype.invoke = function (listeners, params) {\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      listeners[i].apply(this, params);\n    }\n  };\n\n  Utils.Observable = Observable;\n\n  Utils.generateChars = function (length) {\n    var chars = '';\n\n    for (var i = 0; i < length; i++) {\n      var randomChar = Math.floor(Math.random() * 36);\n      chars += randomChar.toString(36);\n    }\n\n    return chars;\n  };\n\n  Utils.bind = function (func, context) {\n    return function () {\n      func.apply(context, arguments);\n    };\n  };\n\n  Utils._convertData = function (data) {\n    for (var originalKey in data) {\n      var keys = originalKey.split('-');\n\n      var dataLevel = data;\n\n      if (keys.length === 1) {\n        continue;\n      }\n\n      for (var k = 0; k < keys.length; k++) {\n        var key = keys[k];\n\n        // Lowercase the first letter\n        // By default, dash-separated becomes camelCase\n        key = key.substring(0, 1).toLowerCase() + key.substring(1);\n\n        if (!(key in dataLevel)) {\n          dataLevel[key] = {};\n        }\n\n        if (k == keys.length - 1) {\n          dataLevel[key] = data[originalKey];\n        }\n\n        dataLevel = dataLevel[key];\n      }\n\n      delete data[originalKey];\n    }\n\n    return data;\n  };\n\n  Utils.hasScroll = function (index, el) {\n    // Adapted from the function created by @ShadowScripter\n    // and adapted by @BillBarry on the Stack Exchange Code Review website.\n    // The original code can be found at\n    // http://codereview.stackexchange.com/q/13338\n    // and was designed to be used with the Sizzle selector engine.\n\n    var $el = $(el);\n    var overflowX = el.style.overflowX;\n    var overflowY = el.style.overflowY;\n\n    //Check both x and y declarations\n    if (overflowX === overflowY &&\n        (overflowY === 'hidden' || overflowY === 'visible')) {\n      return false;\n    }\n\n    if (overflowX === 'scroll' || overflowY === 'scroll') {\n      return true;\n    }\n\n    return ($el.innerHeight() < el.scrollHeight ||\n      $el.innerWidth() < el.scrollWidth);\n  };\n\n  Utils.escapeMarkup = function (markup) {\n    var replaceMap = {\n      '\\\\': '&#92;',\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      '\\'': '&#39;',\n      '/': '&#47;'\n    };\n\n    // Do not try to escape the markup if it's not a string\n    if (typeof markup !== 'string') {\n      return markup;\n    }\n\n    return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n      return replaceMap[match];\n    });\n  };\n\n  // Append an array of jQuery nodes to a given element.\n  Utils.appendMany = function ($element, $nodes) {\n    // jQuery 1.7.x does not support $.fn.append() with an array\n    // Fall back to a jQuery object collection using $.fn.add()\n    if ($.fn.jquery.substr(0, 3) === '1.7') {\n      var $jqNodes = $();\n\n      $.map($nodes, function (node) {\n        $jqNodes = $jqNodes.add(node);\n      });\n\n      $nodes = $jqNodes;\n    }\n\n    $element.append($nodes);\n  };\n\n  return Utils;\n});\n\nS2.define('select2/results',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Results ($element, options, dataAdapter) {\n    this.$element = $element;\n    this.data = dataAdapter;\n    this.options = options;\n\n    Results.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Results, Utils.Observable);\n\n  Results.prototype.render = function () {\n    var $results = $(\n      '<ul class=\"select2-results__options\" role=\"tree\"></ul>'\n    );\n\n    if (this.options.get('multiple')) {\n      $results.attr('aria-multiselectable', 'true');\n    }\n\n    this.$results = $results;\n\n    return $results;\n  };\n\n  Results.prototype.clear = function () {\n    this.$results.empty();\n  };\n\n  Results.prototype.displayMessage = function (params) {\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    this.clear();\n    this.hideLoading();\n\n    var $message = $(\n      '<li role=\"treeitem\" class=\"select2-results__option\"></li>'\n    );\n\n    var message = this.options.get('translations').get(params.message);\n\n    $message.append(\n      escapeMarkup(\n        message(params.args)\n      )\n    );\n\n    this.$results.append($message);\n  };\n\n  Results.prototype.append = function (data) {\n    this.hideLoading();\n\n    var $options = [];\n\n    if (data.results == null || data.results.length === 0) {\n      if (this.$results.children().length === 0) {\n        this.trigger('results:message', {\n          message: 'noResults'\n        });\n      }\n\n      return;\n    }\n\n    data.results = this.sort(data.results);\n\n    for (var d = 0; d < data.results.length; d++) {\n      var item = data.results[d];\n\n      var $option = this.option(item);\n\n      $options.push($option);\n    }\n\n    this.$results.append($options);\n  };\n\n  Results.prototype.position = function ($results, $dropdown) {\n    var $resultsContainer = $dropdown.find('.select2-results');\n    $resultsContainer.append($results);\n  };\n\n  Results.prototype.sort = function (data) {\n    var sorter = this.options.get('sorter');\n\n    return sorter(data);\n  };\n\n  Results.prototype.setClasses = function () {\n    var self = this;\n\n    this.data.current(function (selected) {\n      var selectedIds = $.map(selected, function (s) {\n        return s.id.toString();\n      });\n\n      var $options = self.$results\n        .find('.select2-results__option[aria-selected]');\n\n      $options.each(function () {\n        var $option = $(this);\n\n        var item = $.data(this, 'data');\n\n        // id needs to be converted to a string when comparing\n        var id = '' + item.id;\n\n        if ((item.element != null && item.element.selected) ||\n            (item.element == null && $.inArray(id, selectedIds) > -1)) {\n          $option.attr('aria-selected', 'true');\n        } else {\n          $option.attr('aria-selected', 'false');\n        }\n      });\n\n      var $selected = $options.filter('[aria-selected=true]');\n\n      // Check if there are any selected options\n      if ($selected.length > 0) {\n        // If there are selected options, highlight the first\n        $selected.first().trigger('mouseenter');\n      } else {\n        // If there are no selected options, highlight the first option\n        // in the dropdown\n        $options.first().trigger('mouseenter');\n      }\n    });\n  };\n\n  Results.prototype.showLoading = function (params) {\n    this.hideLoading();\n\n    var loadingMore = this.options.get('translations').get('searching');\n\n    var loading = {\n      disabled: true,\n      loading: true,\n      text: loadingMore(params)\n    };\n    var $loading = this.option(loading);\n    $loading.className += ' loading-results';\n\n    this.$results.prepend($loading);\n  };\n\n  Results.prototype.hideLoading = function () {\n    this.$results.find('.loading-results').remove();\n  };\n\n  Results.prototype.option = function (data) {\n    var option = document.createElement('li');\n    option.className = 'select2-results__option';\n\n    var attrs = {\n      'role': 'treeitem',\n      'aria-selected': 'false'\n    };\n\n    if (data.disabled) {\n      delete attrs['aria-selected'];\n      attrs['aria-disabled'] = 'true';\n    }\n\n    if (data.id == null) {\n      delete attrs['aria-selected'];\n    }\n\n    if (data._resultId != null) {\n      option.id = data._resultId;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    if (data.children) {\n      attrs.role = 'group';\n      attrs['aria-label'] = data.text;\n      delete attrs['aria-selected'];\n    }\n\n    for (var attr in attrs) {\n      var val = attrs[attr];\n\n      option.setAttribute(attr, val);\n    }\n\n    if (data.children) {\n      var $option = $(option);\n\n      var label = document.createElement('strong');\n      label.className = 'select2-results__group';\n\n      var $label = $(label);\n      this.template(data, label);\n\n      var $children = [];\n\n      for (var c = 0; c < data.children.length; c++) {\n        var child = data.children[c];\n\n        var $child = this.option(child);\n\n        $children.push($child);\n      }\n\n      var $childrenContainer = $('<ul></ul>', {\n        'class': 'select2-results__options select2-results__options--nested'\n      });\n\n      $childrenContainer.append($children);\n\n      $option.append(label);\n      $option.append($childrenContainer);\n    } else {\n      this.template(data, option);\n    }\n\n    $.data(option, 'data', data);\n\n    return option;\n  };\n\n  Results.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-results';\n\n    this.$results.attr('id', id);\n\n    container.on('results:all', function (params) {\n      self.clear();\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('results:append', function (params) {\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('query', function (params) {\n      self.showLoading(params);\n    });\n\n    container.on('select', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('unselect', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expended=\"true\"\n      self.$results.attr('aria-expanded', 'true');\n      self.$results.attr('aria-hidden', 'false');\n\n      self.setClasses();\n      self.ensureHighlightVisible();\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expended=\"false\"\n      self.$results.attr('aria-expanded', 'false');\n      self.$results.attr('aria-hidden', 'true');\n      self.$results.removeAttr('aria-activedescendant');\n    });\n\n    container.on('results:toggle', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      $highlighted.trigger('mouseup');\n    });\n\n    container.on('results:select', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      var data = $highlighted.data('data');\n\n      if ($highlighted.attr('aria-selected') == 'true') {\n        self.trigger('close');\n      } else {\n        self.trigger('select', {\n          data: data\n        });\n      }\n    });\n\n    container.on('results:previous', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      // If we are already at te top, don't move further\n      if (currentIndex === 0) {\n        return;\n      }\n\n      var nextIndex = currentIndex - 1;\n\n      // If none are highlighted, highlight the first\n      if ($highlighted.length === 0) {\n        nextIndex = 0;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top;\n      var nextTop = $next.offset().top;\n      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextTop - currentOffset < 0) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:next', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      var nextIndex = currentIndex + 1;\n\n      // If we are at the last option, stay there\n      if (nextIndex >= $options.length) {\n        return;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var nextBottom = $next.offset().top + $next.outerHeight(false);\n      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextBottom > currentOffset) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      params.element.addClass('select2-results__option--highlighted');\n    });\n\n    container.on('results:message', function (params) {\n      self.displayMessage(params);\n    });\n\n    if ($.fn.mousewheel) {\n      this.$results.on('mousewheel', function (e) {\n        var top = self.$results.scrollTop();\n\n        var bottom = (\n          self.$results.get(0).scrollHeight -\n          self.$results.scrollTop() +\n          e.deltaY\n        );\n\n        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n\n        if (isAtTop) {\n          self.$results.scrollTop(0);\n\n          e.preventDefault();\n          e.stopPropagation();\n        } else if (isAtBottom) {\n          self.$results.scrollTop(\n            self.$results.get(0).scrollHeight - self.$results.height()\n          );\n\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      });\n    }\n\n    this.$results.on('mouseup', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var $this = $(this);\n\n      var data = $this.data('data');\n\n      if ($this.attr('aria-selected') === 'true') {\n        if (self.options.get('multiple')) {\n          self.trigger('unselect', {\n            originalEvent: evt,\n            data: data\n          });\n        } else {\n          self.trigger('close');\n        }\n\n        return;\n      }\n\n      self.trigger('select', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n\n    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var data = $(this).data('data');\n\n      self.getHighlightedResults()\n          .removeClass('select2-results__option--highlighted');\n\n      self.trigger('results:focus', {\n        data: data,\n        element: $(this)\n      });\n    });\n  };\n\n  Results.prototype.getHighlightedResults = function () {\n    var $highlighted = this.$results\n    .find('.select2-results__option--highlighted');\n\n    return $highlighted;\n  };\n\n  Results.prototype.destroy = function () {\n    this.$results.remove();\n  };\n\n  Results.prototype.ensureHighlightVisible = function () {\n    var $highlighted = this.getHighlightedResults();\n\n    if ($highlighted.length === 0) {\n      return;\n    }\n\n    var $options = this.$results.find('[aria-selected]');\n\n    var currentIndex = $options.index($highlighted);\n\n    var currentOffset = this.$results.offset().top;\n    var nextTop = $highlighted.offset().top;\n    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n\n    var offsetDelta = nextTop - currentOffset;\n    nextOffset -= $highlighted.outerHeight(false) * 2;\n\n    if (currentIndex <= 2) {\n      this.$results.scrollTop(0);\n    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n      this.$results.scrollTop(nextOffset);\n    }\n  };\n\n  Results.prototype.template = function (result, container) {\n    var template = this.options.get('templateResult');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    var content = template(result);\n\n    if (content == null) {\n      container.style.display = 'none';\n    } else if (typeof content === 'string') {\n      container.innerHTML = escapeMarkup(content);\n    } else {\n      $(container).append(content);\n    }\n  };\n\n  return Results;\n});\n\nS2.define('select2/keys',[\n\n], function () {\n  var KEYS = {\n    BACKSPACE: 8,\n    TAB: 9,\n    ENTER: 13,\n    SHIFT: 16,\n    CTRL: 17,\n    ALT: 18,\n    ESC: 27,\n    SPACE: 32,\n    PAGE_UP: 33,\n    PAGE_DOWN: 34,\n    END: 35,\n    HOME: 36,\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    DELETE: 46\n  };\n\n  return KEYS;\n});\n\nS2.define('select2/selection/base',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function BaseSelection ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    BaseSelection.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseSelection, Utils.Observable);\n\n  BaseSelection.prototype.render = function () {\n    var $selection = $(\n      '<span class=\"select2-selection\" role=\"combobox\" ' +\n      'aria-autocomplete=\"list\" aria-haspopup=\"true\" aria-expanded=\"false\">' +\n      '</span>'\n    );\n\n    this._tabindex = 0;\n\n    if (this.$element.data('old-tabindex') != null) {\n      this._tabindex = this.$element.data('old-tabindex');\n    } else if (this.$element.attr('tabindex') != null) {\n      this._tabindex = this.$element.attr('tabindex');\n    }\n\n    $selection.attr('title', this.$element.attr('title'));\n    $selection.attr('tabindex', this._tabindex);\n\n    this.$selection = $selection;\n\n    return $selection;\n  };\n\n  BaseSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-container';\n    var resultsId = container.id + '-results';\n\n    this.container = container;\n\n    this.$selection.on('focus', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('blur', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      if (evt.which === KEYS.SPACE) {\n        evt.preventDefault();\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      self.$selection.attr('aria-activedescendant', params.data._resultId);\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expanded=\"true\"\n      self.$selection.attr('aria-expanded', 'true');\n      self.$selection.attr('aria-owns', resultsId);\n\n      self._attachCloseHandler(container);\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expanded=\"false\"\n      self.$selection.attr('aria-expanded', 'false');\n      self.$selection.removeAttr('aria-activedescendant');\n      self.$selection.removeAttr('aria-owns');\n\n      self.$selection.focus();\n\n      self._detachCloseHandler(container);\n    });\n\n    container.on('enable', function () {\n      self.$selection.attr('tabindex', self._tabindex);\n    });\n\n    container.on('disable', function () {\n      self.$selection.attr('tabindex', '-1');\n    });\n  };\n\n  BaseSelection.prototype._attachCloseHandler = function (container) {\n    var self = this;\n\n    $(document.body).on('mousedown.select2.' + container.id, function (e) {\n      var $target = $(e.target);\n\n      var $select = $target.closest('.select2');\n\n      var $all = $('.select2.select2-container--open');\n\n      $all.each(function () {\n        var $this = $(this);\n\n        if (this == $select[0]) {\n          return;\n        }\n\n        var $element = $this.data('element');\n\n        $element.select2('close');\n      });\n    });\n  };\n\n  BaseSelection.prototype._detachCloseHandler = function (container) {\n    $(document.body).off('mousedown.select2.' + container.id);\n  };\n\n  BaseSelection.prototype.position = function ($selection, $container) {\n    var $selectionContainer = $container.find('.selection');\n    $selectionContainer.append($selection);\n  };\n\n  BaseSelection.prototype.destroy = function () {\n    this._detachCloseHandler(this.container);\n  };\n\n  BaseSelection.prototype.update = function (data) {\n    throw new Error('The `update` method must be defined in child classes.');\n  };\n\n  return BaseSelection;\n});\n\nS2.define('select2/selection/single',[\n  'jquery',\n  './base',\n  '../utils',\n  '../keys'\n], function ($, BaseSelection, Utils, KEYS) {\n  function SingleSelection () {\n    SingleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(SingleSelection, BaseSelection);\n\n  SingleSelection.prototype.render = function () {\n    var $selection = SingleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--single');\n\n    $selection.html(\n      '<span class=\"select2-selection__rendered\"></span>' +\n      '<span class=\"select2-selection__arrow\" role=\"presentation\">' +\n        '<b role=\"presentation\"></b>' +\n      '</span>'\n    );\n\n    return $selection;\n  };\n\n  SingleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    SingleSelection.__super__.bind.apply(this, arguments);\n\n    var id = container.id + '-container';\n\n    this.$selection.find('.select2-selection__rendered').attr('id', id);\n    this.$selection.attr('aria-labelledby', id);\n\n    this.$selection.on('mousedown', function (evt) {\n      // Only respond to left clicks\n      if (evt.which !== 1) {\n        return;\n      }\n\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('focus', function (evt) {\n      // User focuses on the container\n    });\n\n    this.$selection.on('blur', function (evt) {\n      // User exits the container\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n  };\n\n  SingleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  SingleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  SingleSelection.prototype.selectionContainer = function () {\n    return $('<span></span>');\n  };\n\n  SingleSelection.prototype.update = function (data) {\n    if (data.length === 0) {\n      this.clear();\n      return;\n    }\n\n    var selection = data[0];\n\n    var formatted = this.display(selection);\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n    $rendered.empty().append(formatted);\n    $rendered.prop('title', selection.title || selection.text);\n  };\n\n  return SingleSelection;\n});\n\nS2.define('select2/selection/multiple',[\n  'jquery',\n  './base',\n  '../utils'\n], function ($, BaseSelection, Utils) {\n  function MultipleSelection ($element, options) {\n    MultipleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(MultipleSelection, BaseSelection);\n\n  MultipleSelection.prototype.render = function () {\n    var $selection = MultipleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--multiple');\n\n    $selection.html(\n      '<ul class=\"select2-selection__rendered\"></ul>'\n    );\n\n    return $selection;\n  };\n\n  MultipleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    MultipleSelection.__super__.bind.apply(this, arguments);\n\n    this.$selection.on('click', function (evt) {\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('click', '.select2-selection__choice__remove',\n      function (evt) {\n      var $remove = $(this);\n      var $selection = $remove.parent();\n\n      var data = $selection.data('data');\n\n      self.trigger('unselect', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n  };\n\n  MultipleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  MultipleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  MultipleSelection.prototype.selectionContainer = function () {\n    var $container = $(\n      '<li class=\"select2-selection__choice\">' +\n        '<span class=\"select2-selection__choice__remove\" role=\"presentation\">' +\n          '&times;' +\n        '</span>' +\n      '</li>'\n    );\n\n    return $container;\n  };\n\n  MultipleSelection.prototype.update = function (data) {\n    this.clear();\n\n    if (data.length === 0) {\n      return;\n    }\n\n    var $selections = [];\n\n    for (var d = 0; d < data.length; d++) {\n      var selection = data[d];\n\n      var formatted = this.display(selection);\n      var $selection = this.selectionContainer();\n\n      $selection.append(formatted);\n      $selection.prop('title', selection.title || selection.text);\n\n      $selection.data('data', selection);\n\n      $selections.push($selection);\n    }\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n\n    Utils.appendMany($rendered, $selections);\n  };\n\n  return MultipleSelection;\n});\n\nS2.define('select2/selection/placeholder',[\n  '../utils'\n], function (Utils) {\n  function Placeholder (decorated, $element, options) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options);\n  }\n\n  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {\n    var $placeholder = this.selectionContainer();\n\n    $placeholder.html(this.display(placeholder));\n    $placeholder.addClass('select2-selection__placeholder')\n                .removeClass('select2-selection__choice');\n\n    return $placeholder;\n  };\n\n  Placeholder.prototype.update = function (decorated, data) {\n    var singlePlaceholder = (\n      data.length == 1 && data[0].id != this.placeholder.id\n    );\n    var multipleSelections = data.length > 1;\n\n    if (multipleSelections || singlePlaceholder) {\n      return decorated.call(this, data);\n    }\n\n    this.clear();\n\n    var $placeholder = this.createPlaceholder(this.placeholder);\n\n    this.$selection.find('.select2-selection__rendered').append($placeholder);\n  };\n\n  return Placeholder;\n});\n\nS2.define('select2/selection/allowClear',[\n  'jquery',\n  '../keys'\n], function ($, KEYS) {\n  function AllowClear () { }\n\n  AllowClear.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    if (this.placeholder == null) {\n      if (this.options.get('debug') && window.console && console.error) {\n        console.error(\n          'Select2: The `allowClear` option should be used in combination ' +\n          'with the `placeholder` option.'\n        );\n      }\n    }\n\n    this.$selection.on('mousedown', '.select2-selection__clear',\n      function (evt) {\n        self._handleClear(evt);\n    });\n\n    container.on('keypress', function (evt) {\n      self._handleKeyboardClear(evt, container);\n    });\n  };\n\n  AllowClear.prototype._handleClear = function (_, evt) {\n    // Ignore the event if it is disabled\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    var $clear = this.$selection.find('.select2-selection__clear');\n\n    // Ignore the event if nothing has been selected\n    if ($clear.length === 0) {\n      return;\n    }\n\n    evt.stopPropagation();\n\n    var data = $clear.data('data');\n\n    for (var d = 0; d < data.length; d++) {\n      var unselectData = {\n        data: data[d]\n      };\n\n      // Trigger the `unselect` event, so people can prevent it from being\n      // cleared.\n      this.trigger('unselect', unselectData);\n\n      // If the event was prevented, don't clear it out.\n      if (unselectData.prevented) {\n        return;\n      }\n    }\n\n    this.$element.val(this.placeholder.id).trigger('change');\n\n    this.trigger('toggle');\n  };\n\n  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {\n    if (container.isOpen()) {\n      return;\n    }\n\n    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n      this._handleClear(evt);\n    }\n  };\n\n  AllowClear.prototype.update = function (decorated, data) {\n    decorated.call(this, data);\n\n    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||\n        data.length === 0) {\n      return;\n    }\n\n    var $remove = $(\n      '<span class=\"select2-selection__clear\">' +\n        '&times;' +\n      '</span>'\n    );\n    $remove.data('data', data);\n\n    this.$selection.find('.select2-selection__rendered').prepend($remove);\n  };\n\n  return AllowClear;\n});\n\nS2.define('select2/selection/search',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function Search (decorated, $element, options) {\n    decorated.call(this, $element, options);\n  }\n\n  Search.prototype.render = function (decorated) {\n    var $search = $(\n      '<li class=\"select2-search select2-search--inline\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</li>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    var $rendered = decorated.call(this);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n      self.$search.focus();\n    });\n\n    container.on('enable', function () {\n      self.$search.prop('disabled', false);\n    });\n\n    container.on('disable', function () {\n      self.$search.prop('disabled', true);\n    });\n\n    this.$selection.on('focusin', '.select2-search--inline', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('focusout', '.select2-search--inline', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', '.select2-search--inline', function (evt) {\n      evt.stopPropagation();\n\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n\n      var key = evt.which;\n\n      if (key === KEYS.BACKSPACE && self.$search.val() === '') {\n        var $previousChoice = self.$searchContainer\n          .prev('.select2-selection__choice');\n\n        if ($previousChoice.length > 0) {\n          var item = $previousChoice.data('data');\n\n          self.searchRemoveChoice(item);\n\n          evt.preventDefault();\n        }\n      }\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$selection.on('input', '.select2-search--inline', function (evt) {\n      // Unbind the duplicated `keyup` event\n      self.$selection.off('keyup.search');\n    });\n\n    this.$selection.on('keyup.search input', '.select2-search--inline',\n        function (evt) {\n      self.handleSearch(evt);\n    });\n  };\n\n  Search.prototype.createPlaceholder = function (decorated, placeholder) {\n    this.$search.attr('placeholder', placeholder.text);\n  };\n\n  Search.prototype.update = function (decorated, data) {\n    this.$search.attr('placeholder', '');\n\n    decorated.call(this, data);\n\n    this.$selection.find('.select2-selection__rendered')\n                   .append(this.$searchContainer);\n\n    this.resizeSearch();\n  };\n\n  Search.prototype.handleSearch = function () {\n    this.resizeSearch();\n\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.searchRemoveChoice = function (decorated, item) {\n    this.trigger('unselect', {\n      data: item\n    });\n\n    this.trigger('open');\n\n    this.$search.val(item.text + ' ');\n  };\n\n  Search.prototype.resizeSearch = function () {\n    this.$search.css('width', '25px');\n\n    var width = '';\n\n    if (this.$search.attr('placeholder') !== '') {\n      width = this.$selection.find('.select2-selection__rendered').innerWidth();\n    } else {\n      var minimumWidth = this.$search.val().length + 1;\n\n      width = (minimumWidth * 0.75) + 'em';\n    }\n\n    this.$search.css('width', width);\n  };\n\n  return Search;\n});\n\nS2.define('select2/selection/eventRelay',[\n  'jquery'\n], function ($) {\n  function EventRelay () { }\n\n  EventRelay.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n    var relayEvents = [\n      'open', 'opening',\n      'close', 'closing',\n      'select', 'selecting',\n      'unselect', 'unselecting'\n    ];\n\n    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];\n\n    decorated.call(this, container, $container);\n\n    container.on('*', function (name, params) {\n      // Ignore events that should not be relayed\n      if ($.inArray(name, relayEvents) === -1) {\n        return;\n      }\n\n      // The parameters should always be an object\n      params = params || {};\n\n      // Generate the jQuery event for the Select2 event\n      var evt = $.Event('select2:' + name, {\n        params: params\n      });\n\n      self.$element.trigger(evt);\n\n      // Only handle preventable events if it was one\n      if ($.inArray(name, preventableEvents) === -1) {\n        return;\n      }\n\n      params.prevented = evt.isDefaultPrevented();\n    });\n  };\n\n  return EventRelay;\n});\n\nS2.define('select2/translation',[\n  'jquery',\n  'require'\n], function ($, require) {\n  function Translation (dict) {\n    this.dict = dict || {};\n  }\n\n  Translation.prototype.all = function () {\n    return this.dict;\n  };\n\n  Translation.prototype.get = function (key) {\n    return this.dict[key];\n  };\n\n  Translation.prototype.extend = function (translation) {\n    this.dict = $.extend({}, translation.all(), this.dict);\n  };\n\n  // Static functions\n\n  Translation._cache = {};\n\n  Translation.loadPath = function (path) {\n    if (!(path in Translation._cache)) {\n      var translations = require(path);\n\n      Translation._cache[path] = translations;\n    }\n\n    return new Translation(Translation._cache[path]);\n  };\n\n  return Translation;\n});\n\nS2.define('select2/diacritics',[\n\n], function () {\n  var diacritics = {\n    '\\u24B6': 'A',\n    '\\uFF21': 'A',\n    '\\u00C0': 'A',\n    '\\u00C1': 'A',\n    '\\u00C2': 'A',\n    '\\u1EA6': 'A',\n    '\\u1EA4': 'A',\n    '\\u1EAA': 'A',\n    '\\u1EA8': 'A',\n    '\\u00C3': 'A',\n    '\\u0100': 'A',\n    '\\u0102': 'A',\n    '\\u1EB0': 'A',\n    '\\u1EAE': 'A',\n    '\\u1EB4': 'A',\n    '\\u1EB2': 'A',\n    '\\u0226': 'A',\n    '\\u01E0': 'A',\n    '\\u00C4': 'A',\n    '\\u01DE': 'A',\n    '\\u1EA2': 'A',\n    '\\u00C5': 'A',\n    '\\u01FA': 'A',\n    '\\u01CD': 'A',\n    '\\u0200': 'A',\n    '\\u0202': 'A',\n    '\\u1EA0': 'A',\n    '\\u1EAC': 'A',\n    '\\u1EB6': 'A',\n    '\\u1E00': 'A',\n    '\\u0104': 'A',\n    '\\u023A': 'A',\n    '\\u2C6F': 'A',\n    '\\uA732': 'AA',\n    '\\u00C6': 'AE',\n    '\\u01FC': 'AE',\n    '\\u01E2': 'AE',\n    '\\uA734': 'AO',\n    '\\uA736': 'AU',\n    '\\uA738': 'AV',\n    '\\uA73A': 'AV',\n    '\\uA73C': 'AY',\n    '\\u24B7': 'B',\n    '\\uFF22': 'B',\n    '\\u1E02': 'B',\n    '\\u1E04': 'B',\n    '\\u1E06': 'B',\n    '\\u0243': 'B',\n    '\\u0182': 'B',\n    '\\u0181': 'B',\n    '\\u24B8': 'C',\n    '\\uFF23': 'C',\n    '\\u0106': 'C',\n    '\\u0108': 'C',\n    '\\u010A': 'C',\n    '\\u010C': 'C',\n    '\\u00C7': 'C',\n    '\\u1E08': 'C',\n    '\\u0187': 'C',\n    '\\u023B': 'C',\n    '\\uA73E': 'C',\n    '\\u24B9': 'D',\n    '\\uFF24': 'D',\n    '\\u1E0A': 'D',\n    '\\u010E': 'D',\n    '\\u1E0C': 'D',\n    '\\u1E10': 'D',\n    '\\u1E12': 'D',\n    '\\u1E0E': 'D',\n    '\\u0110': 'D',\n    '\\u018B': 'D',\n    '\\u018A': 'D',\n    '\\u0189': 'D',\n    '\\uA779': 'D',\n    '\\u01F1': 'DZ',\n    '\\u01C4': 'DZ',\n    '\\u01F2': 'Dz',\n    '\\u01C5': 'Dz',\n    '\\u24BA': 'E',\n    '\\uFF25': 'E',\n    '\\u00C8': 'E',\n    '\\u00C9': 'E',\n    '\\u00CA': 'E',\n    '\\u1EC0': 'E',\n    '\\u1EBE': 'E',\n    '\\u1EC4': 'E',\n    '\\u1EC2': 'E',\n    '\\u1EBC': 'E',\n    '\\u0112': 'E',\n    '\\u1E14': 'E',\n    '\\u1E16': 'E',\n    '\\u0114': 'E',\n    '\\u0116': 'E',\n    '\\u00CB': 'E',\n    '\\u1EBA': 'E',\n    '\\u011A': 'E',\n    '\\u0204': 'E',\n    '\\u0206': 'E',\n    '\\u1EB8': 'E',\n    '\\u1EC6': 'E',\n    '\\u0228': 'E',\n    '\\u1E1C': 'E',\n    '\\u0118': 'E',\n    '\\u1E18': 'E',\n    '\\u1E1A': 'E',\n    '\\u0190': 'E',\n    '\\u018E': 'E',\n    '\\u24BB': 'F',\n    '\\uFF26': 'F',\n    '\\u1E1E': 'F',\n    '\\u0191': 'F',\n    '\\uA77B': 'F',\n    '\\u24BC': 'G',\n    '\\uFF27': 'G',\n    '\\u01F4': 'G',\n    '\\u011C': 'G',\n    '\\u1E20': 'G',\n    '\\u011E': 'G',\n    '\\u0120': 'G',\n    '\\u01E6': 'G',\n    '\\u0122': 'G',\n    '\\u01E4': 'G',\n    '\\u0193': 'G',\n    '\\uA7A0': 'G',\n    '\\uA77D': 'G',\n    '\\uA77E': 'G',\n    '\\u24BD': 'H',\n    '\\uFF28': 'H',\n    '\\u0124': 'H',\n    '\\u1E22': 'H',\n    '\\u1E26': 'H',\n    '\\u021E': 'H',\n    '\\u1E24': 'H',\n    '\\u1E28': 'H',\n    '\\u1E2A': 'H',\n    '\\u0126': 'H',\n    '\\u2C67': 'H',\n    '\\u2C75': 'H',\n    '\\uA78D': 'H',\n    '\\u24BE': 'I',\n    '\\uFF29': 'I',\n    '\\u00CC': 'I',\n    '\\u00CD': 'I',\n    '\\u00CE': 'I',\n    '\\u0128': 'I',\n    '\\u012A': 'I',\n    '\\u012C': 'I',\n    '\\u0130': 'I',\n    '\\u00CF': 'I',\n    '\\u1E2E': 'I',\n    '\\u1EC8': 'I',\n    '\\u01CF': 'I',\n    '\\u0208': 'I',\n    '\\u020A': 'I',\n    '\\u1ECA': 'I',\n    '\\u012E': 'I',\n    '\\u1E2C': 'I',\n    '\\u0197': 'I',\n    '\\u24BF': 'J',\n    '\\uFF2A': 'J',\n    '\\u0134': 'J',\n    '\\u0248': 'J',\n    '\\u24C0': 'K',\n    '\\uFF2B': 'K',\n    '\\u1E30': 'K',\n    '\\u01E8': 'K',\n    '\\u1E32': 'K',\n    '\\u0136': 'K',\n    '\\u1E34': 'K',\n    '\\u0198': 'K',\n    '\\u2C69': 'K',\n    '\\uA740': 'K',\n    '\\uA742': 'K',\n    '\\uA744': 'K',\n    '\\uA7A2': 'K',\n    '\\u24C1': 'L',\n    '\\uFF2C': 'L',\n    '\\u013F': 'L',\n    '\\u0139': 'L',\n    '\\u013D': 'L',\n    '\\u1E36': 'L',\n    '\\u1E38': 'L',\n    '\\u013B': 'L',\n    '\\u1E3C': 'L',\n    '\\u1E3A': 'L',\n    '\\u0141': 'L',\n    '\\u023D': 'L',\n    '\\u2C62': 'L',\n    '\\u2C60': 'L',\n    '\\uA748': 'L',\n    '\\uA746': 'L',\n    '\\uA780': 'L',\n    '\\u01C7': 'LJ',\n    '\\u01C8': 'Lj',\n    '\\u24C2': 'M',\n    '\\uFF2D': 'M',\n    '\\u1E3E': 'M',\n    '\\u1E40': 'M',\n    '\\u1E42': 'M',\n    '\\u2C6E': 'M',\n    '\\u019C': 'M',\n    '\\u24C3': 'N',\n    '\\uFF2E': 'N',\n    '\\u01F8': 'N',\n    '\\u0143': 'N',\n    '\\u00D1': 'N',\n    '\\u1E44': 'N',\n    '\\u0147': 'N',\n    '\\u1E46': 'N',\n    '\\u0145': 'N',\n    '\\u1E4A': 'N',\n    '\\u1E48': 'N',\n    '\\u0220': 'N',\n    '\\u019D': 'N',\n    '\\uA790': 'N',\n    '\\uA7A4': 'N',\n    '\\u01CA': 'NJ',\n    '\\u01CB': 'Nj',\n    '\\u24C4': 'O',\n    '\\uFF2F': 'O',\n    '\\u00D2': 'O',\n    '\\u00D3': 'O',\n    '\\u00D4': 'O',\n    '\\u1ED2': 'O',\n    '\\u1ED0': 'O',\n    '\\u1ED6': 'O',\n    '\\u1ED4': 'O',\n    '\\u00D5': 'O',\n    '\\u1E4C': 'O',\n    '\\u022C': 'O',\n    '\\u1E4E': 'O',\n    '\\u014C': 'O',\n    '\\u1E50': 'O',\n    '\\u1E52': 'O',\n    '\\u014E': 'O',\n    '\\u022E': 'O',\n    '\\u0230': 'O',\n    '\\u00D6': 'O',\n    '\\u022A': 'O',\n    '\\u1ECE': 'O',\n    '\\u0150': 'O',\n    '\\u01D1': 'O',\n    '\\u020C': 'O',\n    '\\u020E': 'O',\n    '\\u01A0': 'O',\n    '\\u1EDC': 'O',\n    '\\u1EDA': 'O',\n    '\\u1EE0': 'O',\n    '\\u1EDE': 'O',\n    '\\u1EE2': 'O',\n    '\\u1ECC': 'O',\n    '\\u1ED8': 'O',\n    '\\u01EA': 'O',\n    '\\u01EC': 'O',\n    '\\u00D8': 'O',\n    '\\u01FE': 'O',\n    '\\u0186': 'O',\n    '\\u019F': 'O',\n    '\\uA74A': 'O',\n    '\\uA74C': 'O',\n    '\\u01A2': 'OI',\n    '\\uA74E': 'OO',\n    '\\u0222': 'OU',\n    '\\u24C5': 'P',\n    '\\uFF30': 'P',\n    '\\u1E54': 'P',\n    '\\u1E56': 'P',\n    '\\u01A4': 'P',\n    '\\u2C63': 'P',\n    '\\uA750': 'P',\n    '\\uA752': 'P',\n    '\\uA754': 'P',\n    '\\u24C6': 'Q',\n    '\\uFF31': 'Q',\n    '\\uA756': 'Q',\n    '\\uA758': 'Q',\n    '\\u024A': 'Q',\n    '\\u24C7': 'R',\n    '\\uFF32': 'R',\n    '\\u0154': 'R',\n    '\\u1E58': 'R',\n    '\\u0158': 'R',\n    '\\u0210': 'R',\n    '\\u0212': 'R',\n    '\\u1E5A': 'R',\n    '\\u1E5C': 'R',\n    '\\u0156': 'R',\n    '\\u1E5E': 'R',\n    '\\u024C': 'R',\n    '\\u2C64': 'R',\n    '\\uA75A': 'R',\n    '\\uA7A6': 'R',\n    '\\uA782': 'R',\n    '\\u24C8': 'S',\n    '\\uFF33': 'S',\n    '\\u1E9E': 'S',\n    '\\u015A': 'S',\n    '\\u1E64': 'S',\n    '\\u015C': 'S',\n    '\\u1E60': 'S',\n    '\\u0160': 'S',\n    '\\u1E66': 'S',\n    '\\u1E62': 'S',\n    '\\u1E68': 'S',\n    '\\u0218': 'S',\n    '\\u015E': 'S',\n    '\\u2C7E': 'S',\n    '\\uA7A8': 'S',\n    '\\uA784': 'S',\n    '\\u24C9': 'T',\n    '\\uFF34': 'T',\n    '\\u1E6A': 'T',\n    '\\u0164': 'T',\n    '\\u1E6C': 'T',\n    '\\u021A': 'T',\n    '\\u0162': 'T',\n    '\\u1E70': 'T',\n    '\\u1E6E': 'T',\n    '\\u0166': 'T',\n    '\\u01AC': 'T',\n    '\\u01AE': 'T',\n    '\\u023E': 'T',\n    '\\uA786': 'T',\n    '\\uA728': 'TZ',\n    '\\u24CA': 'U',\n    '\\uFF35': 'U',\n    '\\u00D9': 'U',\n    '\\u00DA': 'U',\n    '\\u00DB': 'U',\n    '\\u0168': 'U',\n    '\\u1E78': 'U',\n    '\\u016A': 'U',\n    '\\u1E7A': 'U',\n    '\\u016C': 'U',\n    '\\u00DC': 'U',\n    '\\u01DB': 'U',\n    '\\u01D7': 'U',\n    '\\u01D5': 'U',\n    '\\u01D9': 'U',\n    '\\u1EE6': 'U',\n    '\\u016E': 'U',\n    '\\u0170': 'U',\n    '\\u01D3': 'U',\n    '\\u0214': 'U',\n    '\\u0216': 'U',\n    '\\u01AF': 'U',\n    '\\u1EEA': 'U',\n    '\\u1EE8': 'U',\n    '\\u1EEE': 'U',\n    '\\u1EEC': 'U',\n    '\\u1EF0': 'U',\n    '\\u1EE4': 'U',\n    '\\u1E72': 'U',\n    '\\u0172': 'U',\n    '\\u1E76': 'U',\n    '\\u1E74': 'U',\n    '\\u0244': 'U',\n    '\\u24CB': 'V',\n    '\\uFF36': 'V',\n    '\\u1E7C': 'V',\n    '\\u1E7E': 'V',\n    '\\u01B2': 'V',\n    '\\uA75E': 'V',\n    '\\u0245': 'V',\n    '\\uA760': 'VY',\n    '\\u24CC': 'W',\n    '\\uFF37': 'W',\n    '\\u1E80': 'W',\n    '\\u1E82': 'W',\n    '\\u0174': 'W',\n    '\\u1E86': 'W',\n    '\\u1E84': 'W',\n    '\\u1E88': 'W',\n    '\\u2C72': 'W',\n    '\\u24CD': 'X',\n    '\\uFF38': 'X',\n    '\\u1E8A': 'X',\n    '\\u1E8C': 'X',\n    '\\u24CE': 'Y',\n    '\\uFF39': 'Y',\n    '\\u1EF2': 'Y',\n    '\\u00DD': 'Y',\n    '\\u0176': 'Y',\n    '\\u1EF8': 'Y',\n    '\\u0232': 'Y',\n    '\\u1E8E': 'Y',\n    '\\u0178': 'Y',\n    '\\u1EF6': 'Y',\n    '\\u1EF4': 'Y',\n    '\\u01B3': 'Y',\n    '\\u024E': 'Y',\n    '\\u1EFE': 'Y',\n    '\\u24CF': 'Z',\n    '\\uFF3A': 'Z',\n    '\\u0179': 'Z',\n    '\\u1E90': 'Z',\n    '\\u017B': 'Z',\n    '\\u017D': 'Z',\n    '\\u1E92': 'Z',\n    '\\u1E94': 'Z',\n    '\\u01B5': 'Z',\n    '\\u0224': 'Z',\n    '\\u2C7F': 'Z',\n    '\\u2C6B': 'Z',\n    '\\uA762': 'Z',\n    '\\u24D0': 'a',\n    '\\uFF41': 'a',\n    '\\u1E9A': 'a',\n    '\\u00E0': 'a',\n    '\\u00E1': 'a',\n    '\\u00E2': 'a',\n    '\\u1EA7': 'a',\n    '\\u1EA5': 'a',\n    '\\u1EAB': 'a',\n    '\\u1EA9': 'a',\n    '\\u00E3': 'a',\n    '\\u0101': 'a',\n    '\\u0103': 'a',\n    '\\u1EB1': 'a',\n    '\\u1EAF': 'a',\n    '\\u1EB5': 'a',\n    '\\u1EB3': 'a',\n    '\\u0227': 'a',\n    '\\u01E1': 'a',\n    '\\u00E4': 'a',\n    '\\u01DF': 'a',\n    '\\u1EA3': 'a',\n    '\\u00E5': 'a',\n    '\\u01FB': 'a',\n    '\\u01CE': 'a',\n    '\\u0201': 'a',\n    '\\u0203': 'a',\n    '\\u1EA1': 'a',\n    '\\u1EAD': 'a',\n    '\\u1EB7': 'a',\n    '\\u1E01': 'a',\n    '\\u0105': 'a',\n    '\\u2C65': 'a',\n    '\\u0250': 'a',\n    '\\uA733': 'aa',\n    '\\u00E6': 'ae',\n    '\\u01FD': 'ae',\n    '\\u01E3': 'ae',\n    '\\uA735': 'ao',\n    '\\uA737': 'au',\n    '\\uA739': 'av',\n    '\\uA73B': 'av',\n    '\\uA73D': 'ay',\n    '\\u24D1': 'b',\n    '\\uFF42': 'b',\n    '\\u1E03': 'b',\n    '\\u1E05': 'b',\n    '\\u1E07': 'b',\n    '\\u0180': 'b',\n    '\\u0183': 'b',\n    '\\u0253': 'b',\n    '\\u24D2': 'c',\n    '\\uFF43': 'c',\n    '\\u0107': 'c',\n    '\\u0109': 'c',\n    '\\u010B': 'c',\n    '\\u010D': 'c',\n    '\\u00E7': 'c',\n    '\\u1E09': 'c',\n    '\\u0188': 'c',\n    '\\u023C': 'c',\n    '\\uA73F': 'c',\n    '\\u2184': 'c',\n    '\\u24D3': 'd',\n    '\\uFF44': 'd',\n    '\\u1E0B': 'd',\n    '\\u010F': 'd',\n    '\\u1E0D': 'd',\n    '\\u1E11': 'd',\n    '\\u1E13': 'd',\n    '\\u1E0F': 'd',\n    '\\u0111': 'd',\n    '\\u018C': 'd',\n    '\\u0256': 'd',\n    '\\u0257': 'd',\n    '\\uA77A': 'd',\n    '\\u01F3': 'dz',\n    '\\u01C6': 'dz',\n    '\\u24D4': 'e',\n    '\\uFF45': 'e',\n    '\\u00E8': 'e',\n    '\\u00E9': 'e',\n    '\\u00EA': 'e',\n    '\\u1EC1': 'e',\n    '\\u1EBF': 'e',\n    '\\u1EC5': 'e',\n    '\\u1EC3': 'e',\n    '\\u1EBD': 'e',\n    '\\u0113': 'e',\n    '\\u1E15': 'e',\n    '\\u1E17': 'e',\n    '\\u0115': 'e',\n    '\\u0117': 'e',\n    '\\u00EB': 'e',\n    '\\u1EBB': 'e',\n    '\\u011B': 'e',\n    '\\u0205': 'e',\n    '\\u0207': 'e',\n    '\\u1EB9': 'e',\n    '\\u1EC7': 'e',\n    '\\u0229': 'e',\n    '\\u1E1D': 'e',\n    '\\u0119': 'e',\n    '\\u1E19': 'e',\n    '\\u1E1B': 'e',\n    '\\u0247': 'e',\n    '\\u025B': 'e',\n    '\\u01DD': 'e',\n    '\\u24D5': 'f',\n    '\\uFF46': 'f',\n    '\\u1E1F': 'f',\n    '\\u0192': 'f',\n    '\\uA77C': 'f',\n    '\\u24D6': 'g',\n    '\\uFF47': 'g',\n    '\\u01F5': 'g',\n    '\\u011D': 'g',\n    '\\u1E21': 'g',\n    '\\u011F': 'g',\n    '\\u0121': 'g',\n    '\\u01E7': 'g',\n    '\\u0123': 'g',\n    '\\u01E5': 'g',\n    '\\u0260': 'g',\n    '\\uA7A1': 'g',\n    '\\u1D79': 'g',\n    '\\uA77F': 'g',\n    '\\u24D7': 'h',\n    '\\uFF48': 'h',\n    '\\u0125': 'h',\n    '\\u1E23': 'h',\n    '\\u1E27': 'h',\n    '\\u021F': 'h',\n    '\\u1E25': 'h',\n    '\\u1E29': 'h',\n    '\\u1E2B': 'h',\n    '\\u1E96': 'h',\n    '\\u0127': 'h',\n    '\\u2C68': 'h',\n    '\\u2C76': 'h',\n    '\\u0265': 'h',\n    '\\u0195': 'hv',\n    '\\u24D8': 'i',\n    '\\uFF49': 'i',\n    '\\u00EC': 'i',\n    '\\u00ED': 'i',\n    '\\u00EE': 'i',\n    '\\u0129': 'i',\n    '\\u012B': 'i',\n    '\\u012D': 'i',\n    '\\u00EF': 'i',\n    '\\u1E2F': 'i',\n    '\\u1EC9': 'i',\n    '\\u01D0': 'i',\n    '\\u0209': 'i',\n    '\\u020B': 'i',\n    '\\u1ECB': 'i',\n    '\\u012F': 'i',\n    '\\u1E2D': 'i',\n    '\\u0268': 'i',\n    '\\u0131': 'i',\n    '\\u24D9': 'j',\n    '\\uFF4A': 'j',\n    '\\u0135': 'j',\n    '\\u01F0': 'j',\n    '\\u0249': 'j',\n    '\\u24DA': 'k',\n    '\\uFF4B': 'k',\n    '\\u1E31': 'k',\n    '\\u01E9': 'k',\n    '\\u1E33': 'k',\n    '\\u0137': 'k',\n    '\\u1E35': 'k',\n    '\\u0199': 'k',\n    '\\u2C6A': 'k',\n    '\\uA741': 'k',\n    '\\uA743': 'k',\n    '\\uA745': 'k',\n    '\\uA7A3': 'k',\n    '\\u24DB': 'l',\n    '\\uFF4C': 'l',\n    '\\u0140': 'l',\n    '\\u013A': 'l',\n    '\\u013E': 'l',\n    '\\u1E37': 'l',\n    '\\u1E39': 'l',\n    '\\u013C': 'l',\n    '\\u1E3D': 'l',\n    '\\u1E3B': 'l',\n    '\\u017F': 'l',\n    '\\u0142': 'l',\n    '\\u019A': 'l',\n    '\\u026B': 'l',\n    '\\u2C61': 'l',\n    '\\uA749': 'l',\n    '\\uA781': 'l',\n    '\\uA747': 'l',\n    '\\u01C9': 'lj',\n    '\\u24DC': 'm',\n    '\\uFF4D': 'm',\n    '\\u1E3F': 'm',\n    '\\u1E41': 'm',\n    '\\u1E43': 'm',\n    '\\u0271': 'm',\n    '\\u026F': 'm',\n    '\\u24DD': 'n',\n    '\\uFF4E': 'n',\n    '\\u01F9': 'n',\n    '\\u0144': 'n',\n    '\\u00F1': 'n',\n    '\\u1E45': 'n',\n    '\\u0148': 'n',\n    '\\u1E47': 'n',\n    '\\u0146': 'n',\n    '\\u1E4B': 'n',\n    '\\u1E49': 'n',\n    '\\u019E': 'n',\n    '\\u0272': 'n',\n    '\\u0149': 'n',\n    '\\uA791': 'n',\n    '\\uA7A5': 'n',\n    '\\u01CC': 'nj',\n    '\\u24DE': 'o',\n    '\\uFF4F': 'o',\n    '\\u00F2': 'o',\n    '\\u00F3': 'o',\n    '\\u00F4': 'o',\n    '\\u1ED3': 'o',\n    '\\u1ED1': 'o',\n    '\\u1ED7': 'o',\n    '\\u1ED5': 'o',\n    '\\u00F5': 'o',\n    '\\u1E4D': 'o',\n    '\\u022D': 'o',\n    '\\u1E4F': 'o',\n    '\\u014D': 'o',\n    '\\u1E51': 'o',\n    '\\u1E53': 'o',\n    '\\u014F': 'o',\n    '\\u022F': 'o',\n    '\\u0231': 'o',\n    '\\u00F6': 'o',\n    '\\u022B': 'o',\n    '\\u1ECF': 'o',\n    '\\u0151': 'o',\n    '\\u01D2': 'o',\n    '\\u020D': 'o',\n    '\\u020F': 'o',\n    '\\u01A1': 'o',\n    '\\u1EDD': 'o',\n    '\\u1EDB': 'o',\n    '\\u1EE1': 'o',\n    '\\u1EDF': 'o',\n    '\\u1EE3': 'o',\n    '\\u1ECD': 'o',\n    '\\u1ED9': 'o',\n    '\\u01EB': 'o',\n    '\\u01ED': 'o',\n    '\\u00F8': 'o',\n    '\\u01FF': 'o',\n    '\\u0254': 'o',\n    '\\uA74B': 'o',\n    '\\uA74D': 'o',\n    '\\u0275': 'o',\n    '\\u01A3': 'oi',\n    '\\u0223': 'ou',\n    '\\uA74F': 'oo',\n    '\\u24DF': 'p',\n    '\\uFF50': 'p',\n    '\\u1E55': 'p',\n    '\\u1E57': 'p',\n    '\\u01A5': 'p',\n    '\\u1D7D': 'p',\n    '\\uA751': 'p',\n    '\\uA753': 'p',\n    '\\uA755': 'p',\n    '\\u24E0': 'q',\n    '\\uFF51': 'q',\n    '\\u024B': 'q',\n    '\\uA757': 'q',\n    '\\uA759': 'q',\n    '\\u24E1': 'r',\n    '\\uFF52': 'r',\n    '\\u0155': 'r',\n    '\\u1E59': 'r',\n    '\\u0159': 'r',\n    '\\u0211': 'r',\n    '\\u0213': 'r',\n    '\\u1E5B': 'r',\n    '\\u1E5D': 'r',\n    '\\u0157': 'r',\n    '\\u1E5F': 'r',\n    '\\u024D': 'r',\n    '\\u027D': 'r',\n    '\\uA75B': 'r',\n    '\\uA7A7': 'r',\n    '\\uA783': 'r',\n    '\\u24E2': 's',\n    '\\uFF53': 's',\n    '\\u00DF': 's',\n    '\\u015B': 's',\n    '\\u1E65': 's',\n    '\\u015D': 's',\n    '\\u1E61': 's',\n    '\\u0161': 's',\n    '\\u1E67': 's',\n    '\\u1E63': 's',\n    '\\u1E69': 's',\n    '\\u0219': 's',\n    '\\u015F': 's',\n    '\\u023F': 's',\n    '\\uA7A9': 's',\n    '\\uA785': 's',\n    '\\u1E9B': 's',\n    '\\u24E3': 't',\n    '\\uFF54': 't',\n    '\\u1E6B': 't',\n    '\\u1E97': 't',\n    '\\u0165': 't',\n    '\\u1E6D': 't',\n    '\\u021B': 't',\n    '\\u0163': 't',\n    '\\u1E71': 't',\n    '\\u1E6F': 't',\n    '\\u0167': 't',\n    '\\u01AD': 't',\n    '\\u0288': 't',\n    '\\u2C66': 't',\n    '\\uA787': 't',\n    '\\uA729': 'tz',\n    '\\u24E4': 'u',\n    '\\uFF55': 'u',\n    '\\u00F9': 'u',\n    '\\u00FA': 'u',\n    '\\u00FB': 'u',\n    '\\u0169': 'u',\n    '\\u1E79': 'u',\n    '\\u016B': 'u',\n    '\\u1E7B': 'u',\n    '\\u016D': 'u',\n    '\\u00FC': 'u',\n    '\\u01DC': 'u',\n    '\\u01D8': 'u',\n    '\\u01D6': 'u',\n    '\\u01DA': 'u',\n    '\\u1EE7': 'u',\n    '\\u016F': 'u',\n    '\\u0171': 'u',\n    '\\u01D4': 'u',\n    '\\u0215': 'u',\n    '\\u0217': 'u',\n    '\\u01B0': 'u',\n    '\\u1EEB': 'u',\n    '\\u1EE9': 'u',\n    '\\u1EEF': 'u',\n    '\\u1EED': 'u',\n    '\\u1EF1': 'u',\n    '\\u1EE5': 'u',\n    '\\u1E73': 'u',\n    '\\u0173': 'u',\n    '\\u1E77': 'u',\n    '\\u1E75': 'u',\n    '\\u0289': 'u',\n    '\\u24E5': 'v',\n    '\\uFF56': 'v',\n    '\\u1E7D': 'v',\n    '\\u1E7F': 'v',\n    '\\u028B': 'v',\n    '\\uA75F': 'v',\n    '\\u028C': 'v',\n    '\\uA761': 'vy',\n    '\\u24E6': 'w',\n    '\\uFF57': 'w',\n    '\\u1E81': 'w',\n    '\\u1E83': 'w',\n    '\\u0175': 'w',\n    '\\u1E87': 'w',\n    '\\u1E85': 'w',\n    '\\u1E98': 'w',\n    '\\u1E89': 'w',\n    '\\u2C73': 'w',\n    '\\u24E7': 'x',\n    '\\uFF58': 'x',\n    '\\u1E8B': 'x',\n    '\\u1E8D': 'x',\n    '\\u24E8': 'y',\n    '\\uFF59': 'y',\n    '\\u1EF3': 'y',\n    '\\u00FD': 'y',\n    '\\u0177': 'y',\n    '\\u1EF9': 'y',\n    '\\u0233': 'y',\n    '\\u1E8F': 'y',\n    '\\u00FF': 'y',\n    '\\u1EF7': 'y',\n    '\\u1E99': 'y',\n    '\\u1EF5': 'y',\n    '\\u01B4': 'y',\n    '\\u024F': 'y',\n    '\\u1EFF': 'y',\n    '\\u24E9': 'z',\n    '\\uFF5A': 'z',\n    '\\u017A': 'z',\n    '\\u1E91': 'z',\n    '\\u017C': 'z',\n    '\\u017E': 'z',\n    '\\u1E93': 'z',\n    '\\u1E95': 'z',\n    '\\u01B6': 'z',\n    '\\u0225': 'z',\n    '\\u0240': 'z',\n    '\\u2C6C': 'z',\n    '\\uA763': 'z',\n    '\\u0386': '\\u0391',\n    '\\u0388': '\\u0395',\n    '\\u0389': '\\u0397',\n    '\\u038A': '\\u0399',\n    '\\u03AA': '\\u0399',\n    '\\u038C': '\\u039F',\n    '\\u038E': '\\u03A5',\n    '\\u03AB': '\\u03A5',\n    '\\u038F': '\\u03A9',\n    '\\u03AC': '\\u03B1',\n    '\\u03AD': '\\u03B5',\n    '\\u03AE': '\\u03B7',\n    '\\u03AF': '\\u03B9',\n    '\\u03CA': '\\u03B9',\n    '\\u0390': '\\u03B9',\n    '\\u03CC': '\\u03BF',\n    '\\u03CD': '\\u03C5',\n    '\\u03CB': '\\u03C5',\n    '\\u03B0': '\\u03C5',\n    '\\u03C9': '\\u03C9',\n    '\\u03C2': '\\u03C3'\n  };\n\n  return diacritics;\n});\n\nS2.define('select2/data/base',[\n  '../utils'\n], function (Utils) {\n  function BaseAdapter ($element, options) {\n    BaseAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseAdapter, Utils.Observable);\n\n  BaseAdapter.prototype.current = function (callback) {\n    throw new Error('The `current` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.query = function (params, callback) {\n    throw new Error('The `query` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.bind = function (container, $container) {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.destroy = function () {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.generateResultId = function (container, data) {\n    var id = container.id + '-result-';\n\n    id += Utils.generateChars(4);\n\n    if (data.id != null) {\n      id += '-' + data.id.toString();\n    } else {\n      id += '-' + Utils.generateChars(4);\n    }\n    return id;\n  };\n\n  return BaseAdapter;\n});\n\nS2.define('select2/data/select',[\n  './base',\n  '../utils',\n  'jquery'\n], function (BaseAdapter, Utils, $) {\n  function SelectAdapter ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    SelectAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(SelectAdapter, BaseAdapter);\n\n  SelectAdapter.prototype.current = function (callback) {\n    var data = [];\n    var self = this;\n\n    this.$element.find(':selected').each(function () {\n      var $option = $(this);\n\n      var option = self.item($option);\n\n      data.push(option);\n    });\n\n    callback(data);\n  };\n\n  SelectAdapter.prototype.select = function (data) {\n    var self = this;\n\n    data.selected = true;\n\n    // If data.element is a DOM node, use it instead\n    if ($(data.element).is('option')) {\n      data.element.selected = true;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    if (this.$element.prop('multiple')) {\n      this.current(function (currentData) {\n        var val = [];\n\n        data = [data];\n        data.push.apply(data, currentData);\n\n        for (var d = 0; d < data.length; d++) {\n          var id = data[d].id;\n\n          if ($.inArray(id, val) === -1) {\n            val.push(id);\n          }\n        }\n\n        self.$element.val(val);\n        self.$element.trigger('change');\n      });\n    } else {\n      var val = data.id;\n\n      this.$element.val(val);\n      this.$element.trigger('change');\n    }\n  };\n\n  SelectAdapter.prototype.unselect = function (data) {\n    var self = this;\n\n    if (!this.$element.prop('multiple')) {\n      return;\n    }\n\n    data.selected = false;\n\n    if ($(data.element).is('option')) {\n      data.element.selected = false;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    this.current(function (currentData) {\n      var val = [];\n\n      for (var d = 0; d < currentData.length; d++) {\n        var id = currentData[d].id;\n\n        if (id !== data.id && $.inArray(id, val) === -1) {\n          val.push(id);\n        }\n      }\n\n      self.$element.val(val);\n\n      self.$element.trigger('change');\n    });\n  };\n\n  SelectAdapter.prototype.bind = function (container, $container) {\n    var self = this;\n\n    this.container = container;\n\n    container.on('select', function (params) {\n      self.select(params.data);\n    });\n\n    container.on('unselect', function (params) {\n      self.unselect(params.data);\n    });\n  };\n\n  SelectAdapter.prototype.destroy = function () {\n    // Remove anything added to child elements\n    this.$element.find('*').each(function () {\n      // Remove any custom data set by Select2\n      $.removeData(this, 'data');\n    });\n  };\n\n  SelectAdapter.prototype.query = function (params, callback) {\n    var data = [];\n    var self = this;\n\n    var $options = this.$element.children();\n\n    $options.each(function () {\n      var $option = $(this);\n\n      if (!$option.is('option') && !$option.is('optgroup')) {\n        return;\n      }\n\n      var option = self.item($option);\n\n      var matches = self.matches(params, option);\n\n      if (matches !== null) {\n        data.push(matches);\n      }\n    });\n\n    callback({\n      results: data\n    });\n  };\n\n  SelectAdapter.prototype.addOptions = function ($options) {\n    Utils.appendMany(this.$element, $options);\n  };\n\n  SelectAdapter.prototype.option = function (data) {\n    var option;\n\n    if (data.children) {\n      option = document.createElement('optgroup');\n      option.label = data.text;\n    } else {\n      option = document.createElement('option');\n\n      if (option.textContent !== undefined) {\n        option.textContent = data.text;\n      } else {\n        option.innerText = data.text;\n      }\n    }\n\n    if (data.id) {\n      option.value = data.id;\n    }\n\n    if (data.disabled) {\n      option.disabled = true;\n    }\n\n    if (data.selected) {\n      option.selected = true;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    var $option = $(option);\n\n    var normalizedData = this._normalizeItem(data);\n    normalizedData.element = option;\n\n    // Override the option's data with the combined data\n    $.data(option, 'data', normalizedData);\n\n    return $option;\n  };\n\n  SelectAdapter.prototype.item = function ($option) {\n    var data = {};\n\n    data = $.data($option[0], 'data');\n\n    if (data != null) {\n      return data;\n    }\n\n    if ($option.is('option')) {\n      data = {\n        id: $option.val(),\n        text: $option.text(),\n        disabled: $option.prop('disabled'),\n        selected: $option.prop('selected'),\n        title: $option.prop('title')\n      };\n    } else if ($option.is('optgroup')) {\n      data = {\n        text: $option.prop('label'),\n        children: [],\n        title: $option.prop('title')\n      };\n\n      var $children = $option.children('option');\n      var children = [];\n\n      for (var c = 0; c < $children.length; c++) {\n        var $child = $($children[c]);\n\n        var child = this.item($child);\n\n        children.push(child);\n      }\n\n      data.children = children;\n    }\n\n    data = this._normalizeItem(data);\n    data.element = $option[0];\n\n    $.data($option[0], 'data', data);\n\n    return data;\n  };\n\n  SelectAdapter.prototype._normalizeItem = function (item) {\n    if (!$.isPlainObject(item)) {\n      item = {\n        id: item,\n        text: item\n      };\n    }\n\n    item = $.extend({}, {\n      text: ''\n    }, item);\n\n    var defaults = {\n      selected: false,\n      disabled: false\n    };\n\n    if (item.id != null) {\n      item.id = item.id.toString();\n    }\n\n    if (item.text != null) {\n      item.text = item.text.toString();\n    }\n\n    if (item._resultId == null && item.id && this.container != null) {\n      item._resultId = this.generateResultId(this.container, item);\n    }\n\n    return $.extend({}, defaults, item);\n  };\n\n  SelectAdapter.prototype.matches = function (params, data) {\n    var matcher = this.options.get('matcher');\n\n    return matcher(params, data);\n  };\n\n  return SelectAdapter;\n});\n\nS2.define('select2/data/array',[\n  './select',\n  '../utils',\n  'jquery'\n], function (SelectAdapter, Utils, $) {\n  function ArrayAdapter ($element, options) {\n    var data = options.get('data') || [];\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n\n    this.addOptions(this.convertToOptions(data));\n  }\n\n  Utils.Extend(ArrayAdapter, SelectAdapter);\n\n  ArrayAdapter.prototype.select = function (data) {\n    var $option = this.$element.find('option').filter(function (i, elm) {\n      return elm.value == data.id.toString();\n    });\n\n    if ($option.length === 0) {\n      $option = this.option(data);\n\n      this.addOptions($option);\n    }\n\n    ArrayAdapter.__super__.select.call(this, data);\n  };\n\n  ArrayAdapter.prototype.convertToOptions = function (data) {\n    var self = this;\n\n    var $existing = this.$element.find('option');\n    var existingIds = $existing.map(function () {\n      return self.item($(this)).id;\n    }).get();\n\n    var $options = [];\n\n    // Filter out all items except for the one passed in the argument\n    function onlyItem (item) {\n      return function () {\n        return $(this).val() == item.id;\n      };\n    }\n\n    for (var d = 0; d < data.length; d++) {\n      var item = this._normalizeItem(data[d]);\n\n      // Skip items which were pre-loaded, only merge the data\n      if ($.inArray(item.id, existingIds) >= 0) {\n        var $existingOption = $existing.filter(onlyItem(item));\n\n        var existingData = this.item($existingOption);\n        var newData = $.extend(true, {}, existingData, item);\n\n        var $newOption = this.option(existingData);\n\n        $existingOption.replaceWith($newOption);\n\n        continue;\n      }\n\n      var $option = this.option(item);\n\n      if (item.children) {\n        var $children = this.convertToOptions(item.children);\n\n        Utils.appendMany($option, $children);\n      }\n\n      $options.push($option);\n    }\n\n    return $options;\n  };\n\n  return ArrayAdapter;\n});\n\nS2.define('select2/data/ajax',[\n  './array',\n  '../utils',\n  'jquery'\n], function (ArrayAdapter, Utils, $) {\n  function AjaxAdapter ($element, options) {\n    this.ajaxOptions = this._applyDefaults(options.get('ajax'));\n\n    if (this.ajaxOptions.processResults != null) {\n      this.processResults = this.ajaxOptions.processResults;\n    }\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n  }\n\n  Utils.Extend(AjaxAdapter, ArrayAdapter);\n\n  AjaxAdapter.prototype._applyDefaults = function (options) {\n    var defaults = {\n      data: function (params) {\n        return {\n          q: params.term\n        };\n      },\n      transport: function (params, success, failure) {\n        var $request = $.ajax(params);\n\n        $request.then(success);\n        $request.fail(failure);\n\n        return $request;\n      }\n    };\n\n    return $.extend({}, defaults, options, true);\n  };\n\n  AjaxAdapter.prototype.processResults = function (results) {\n    return results;\n  };\n\n  AjaxAdapter.prototype.query = function (params, callback) {\n    var matches = [];\n    var self = this;\n\n    if (this._request != null) {\n      // JSONP requests cannot always be aborted\n      if ($.isFunction(this._request.abort)) {\n        this._request.abort();\n      }\n\n      this._request = null;\n    }\n\n    var options = $.extend({\n      type: 'GET'\n    }, this.ajaxOptions);\n\n    if (typeof options.url === 'function') {\n      options.url = options.url(params);\n    }\n\n    if (typeof options.data === 'function') {\n      options.data = options.data(params);\n    }\n\n    function request () {\n      var $request = options.transport(options, function (data) {\n        var results = self.processResults(data, params);\n\n        if (self.options.get('debug') && window.console && console.error) {\n          // Check to make sure that the response included a `results` key.\n          if (!results || !results.results || !$.isArray(results.results)) {\n            console.error(\n              'Select2: The AJAX results did not return an array in the ' +\n              '`results` key of the response.'\n            );\n          }\n        }\n\n        callback(results);\n      }, function () {\n        // TODO: Handle AJAX errors\n      });\n\n      self._request = $request;\n    }\n\n    if (this.ajaxOptions.delay && params.term !== '') {\n      if (this._queryTimeout) {\n        window.clearTimeout(this._queryTimeout);\n      }\n\n      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n    } else {\n      request();\n    }\n  };\n\n  return AjaxAdapter;\n});\n\nS2.define('select2/data/tags',[\n  'jquery'\n], function ($) {\n  function Tags (decorated, $element, options) {\n    var tags = options.get('tags');\n\n    var createTag = options.get('createTag');\n\n    if (createTag !== undefined) {\n      this.createTag = createTag;\n    }\n\n    decorated.call(this, $element, options);\n\n    if ($.isArray(tags)) {\n      for (var t = 0; t < tags.length; t++) {\n        var tag = tags[t];\n        var item = this._normalizeItem(tag);\n\n        var $option = this.option(item);\n\n        this.$element.append($option);\n      }\n    }\n  }\n\n  Tags.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    this._removeOldTags();\n\n    if (params.term == null || params.page != null) {\n      decorated.call(this, params, callback);\n      return;\n    }\n\n    function wrapper (obj, child) {\n      var data = obj.results;\n\n      for (var i = 0; i < data.length; i++) {\n        var option = data[i];\n\n        var checkChildren = (\n          option.children != null &&\n          !wrapper({\n            results: option.children\n          }, true)\n        );\n\n        var checkText = option.text === params.term;\n\n        if (checkText || checkChildren) {\n          if (child) {\n            return false;\n          }\n\n          obj.data = data;\n          callback(obj);\n\n          return;\n        }\n      }\n\n      if (child) {\n        return true;\n      }\n\n      var tag = self.createTag(params);\n\n      if (tag != null) {\n        var $option = self.option(tag);\n        $option.attr('data-select2-tag', true);\n\n        self.addOptions([$option]);\n\n        self.insertTag(data, tag);\n      }\n\n      obj.results = data;\n\n      callback(obj);\n    }\n\n    decorated.call(this, params, wrapper);\n  };\n\n  Tags.prototype.createTag = function (decorated, params) {\n    var term = $.trim(params.term);\n\n    if (term === '') {\n      return null;\n    }\n\n    return {\n      id: term,\n      text: term\n    };\n  };\n\n  Tags.prototype.insertTag = function (_, data, tag) {\n    data.unshift(tag);\n  };\n\n  Tags.prototype._removeOldTags = function (_) {\n    var tag = this._lastTag;\n\n    var $options = this.$element.find('option[data-select2-tag]');\n\n    $options.each(function () {\n      if (this.selected) {\n        return;\n      }\n\n      $(this).remove();\n    });\n  };\n\n  return Tags;\n});\n\nS2.define('select2/data/tokenizer',[\n  'jquery'\n], function ($) {\n  function Tokenizer (decorated, $element, options) {\n    var tokenizer = options.get('tokenizer');\n\n    if (tokenizer !== undefined) {\n      this.tokenizer = tokenizer;\n    }\n\n    decorated.call(this, $element, options);\n  }\n\n  Tokenizer.prototype.bind = function (decorated, container, $container) {\n    decorated.call(this, container, $container);\n\n    this.$search =  container.dropdown.$search || container.selection.$search ||\n      $container.find('.select2-search__field');\n  };\n\n  Tokenizer.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    function select (data) {\n      self.select(data);\n    }\n\n    params.term = params.term || '';\n\n    var tokenData = this.tokenizer(params, this.options, select);\n\n    if (tokenData.term !== params.term) {\n      // Replace the search term if we have the search box\n      if (this.$search.length) {\n        this.$search.val(tokenData.term);\n        this.$search.focus();\n      }\n\n      params.term = tokenData.term;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {\n    var separators = options.get('tokenSeparators') || [];\n    var term = params.term;\n    var i = 0;\n\n    var createTag = this.createTag || function (params) {\n      return {\n        id: params.term,\n        text: params.term\n      };\n    };\n\n    while (i < term.length) {\n      var termChar = term[i];\n\n      if ($.inArray(termChar, separators) === -1) {\n        i++;\n\n        continue;\n      }\n\n      var part = term.substr(0, i);\n      var partParams = $.extend({}, params, {\n        term: part\n      });\n\n      var data = createTag(partParams);\n\n      callback(data);\n\n      // Reset the term to not include the tokenized portion\n      term = term.substr(i + 1) || '';\n      i = 0;\n    }\n\n    return {\n      term: term\n    };\n  };\n\n  return Tokenizer;\n});\n\nS2.define('select2/data/minimumInputLength',[\n\n], function () {\n  function MinimumInputLength (decorated, $e, options) {\n    this.minimumInputLength = options.get('minimumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MinimumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (params.term.length < this.minimumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooShort',\n        args: {\n          minimum: this.minimumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MinimumInputLength;\n});\n\nS2.define('select2/data/maximumInputLength',[\n\n], function () {\n  function MaximumInputLength (decorated, $e, options) {\n    this.maximumInputLength = options.get('maximumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (this.maximumInputLength > 0 &&\n        params.term.length > this.maximumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooLong',\n        args: {\n          maximum: this.maximumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MaximumInputLength;\n});\n\nS2.define('select2/data/maximumSelectionLength',[\n\n], function (){\n  function MaximumSelectionLength (decorated, $e, options) {\n    this.maximumSelectionLength = options.get('maximumSelectionLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumSelectionLength.prototype.query =\n    function (decorated, params, callback) {\n      var self = this;\n\n      this.current(function (currentData) {\n        var count = currentData != null ? currentData.length : 0;\n        if (self.maximumSelectionLength > 0 &&\n          count >= self.maximumSelectionLength) {\n          self.trigger('results:message', {\n            message: 'maximumSelected',\n            args: {\n              maximum: self.maximumSelectionLength\n            }\n          });\n          return;\n        }\n        decorated.call(self, params, callback);\n      });\n  };\n\n  return MaximumSelectionLength;\n});\n\nS2.define('select2/dropdown',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Dropdown ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    Dropdown.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Dropdown, Utils.Observable);\n\n  Dropdown.prototype.render = function () {\n    var $dropdown = $(\n      '<span class=\"select2-dropdown\">' +\n        '<span class=\"select2-results\"></span>' +\n      '</span>'\n    );\n\n    $dropdown.attr('dir', this.options.get('dir'));\n\n    this.$dropdown = $dropdown;\n\n    return $dropdown;\n  };\n\n  Dropdown.prototype.position = function ($dropdown, $container) {\n    // Should be implmented in subclasses\n  };\n\n  Dropdown.prototype.destroy = function () {\n    // Remove the dropdown from the DOM\n    this.$dropdown.remove();\n  };\n\n  return Dropdown;\n});\n\nS2.define('select2/dropdown/search',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function Search () { }\n\n  Search.prototype.render = function (decorated) {\n    var $rendered = decorated.call(this);\n\n    var $search = $(\n      '<span class=\"select2-search select2-search--dropdown\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</span>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    $rendered.prepend($search);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    this.$search.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$search.on('input', function (evt) {\n      // Unbind the duplicated `keyup` event\n      $(this).off('keyup');\n    });\n\n    this.$search.on('keyup input', function (evt) {\n      self.handleSearch(evt);\n    });\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n\n      window.setTimeout(function () {\n        self.$search.focus();\n      }, 0);\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n    });\n\n    container.on('results:all', function (params) {\n      if (params.query.term == null || params.query.term === '') {\n        var showSearch = self.showSearch(params);\n\n        if (showSearch) {\n          self.$searchContainer.removeClass('select2-search--hide');\n        } else {\n          self.$searchContainer.addClass('select2-search--hide');\n        }\n      }\n    });\n  };\n\n  Search.prototype.handleSearch = function (evt) {\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.showSearch = function (_, params) {\n    return true;\n  };\n\n  return Search;\n});\n\nS2.define('select2/dropdown/hidePlaceholder',[\n\n], function () {\n  function HidePlaceholder (decorated, $element, options, dataAdapter) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  HidePlaceholder.prototype.append = function (decorated, data) {\n    data.results = this.removePlaceholder(data.results);\n\n    decorated.call(this, data);\n  };\n\n  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  HidePlaceholder.prototype.removePlaceholder = function (_, data) {\n    var modifiedData = data.slice(0);\n\n    for (var d = data.length - 1; d >= 0; d--) {\n      var item = data[d];\n\n      if (this.placeholder.id === item.id) {\n        modifiedData.splice(d, 1);\n      }\n    }\n\n    return modifiedData;\n  };\n\n  return HidePlaceholder;\n});\n\nS2.define('select2/dropdown/infiniteScroll',[\n  'jquery'\n], function ($) {\n  function InfiniteScroll (decorated, $element, options, dataAdapter) {\n    this.lastParams = {};\n\n    decorated.call(this, $element, options, dataAdapter);\n\n    this.$loadingMore = this.createLoadingMore();\n    this.loading = false;\n  }\n\n  InfiniteScroll.prototype.append = function (decorated, data) {\n    this.$loadingMore.remove();\n    this.loading = false;\n\n    decorated.call(this, data);\n\n    if (this.showLoadingMore(data)) {\n      this.$results.append(this.$loadingMore);\n    }\n  };\n\n  InfiniteScroll.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('query', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    container.on('query:append', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    this.$results.on('scroll', function () {\n      var isLoadMoreVisible = $.contains(\n        document.documentElement,\n        self.$loadingMore[0]\n      );\n\n      if (self.loading || !isLoadMoreVisible) {\n        return;\n      }\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var loadingMoreOffset = self.$loadingMore.offset().top +\n        self.$loadingMore.outerHeight(false);\n\n      if (currentOffset + 50 >= loadingMoreOffset) {\n        self.loadMore();\n      }\n    });\n  };\n\n  InfiniteScroll.prototype.loadMore = function () {\n    this.loading = true;\n\n    var params = $.extend({}, {page: 1}, this.lastParams);\n\n    params.page++;\n\n    this.trigger('query:append', params);\n  };\n\n  InfiniteScroll.prototype.showLoadingMore = function (_, data) {\n    return data.pagination && data.pagination.more;\n  };\n\n  InfiniteScroll.prototype.createLoadingMore = function () {\n    var $option = $(\n      '<li class=\"option load-more\" role=\"treeitem\"></li>'\n    );\n\n    var message = this.options.get('translations').get('loadingMore');\n\n    $option.html(message(this.lastParams));\n\n    return $option;\n  };\n\n  return InfiniteScroll;\n});\n\nS2.define('select2/dropdown/attachBody',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function AttachBody (decorated, $element, options) {\n    this.$dropdownParent = options.get('dropdownParent') || document.body;\n\n    decorated.call(this, $element, options);\n  }\n\n  AttachBody.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    var setupResultsEvents = false;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self._showDropdown();\n      self._attachPositioningHandler(container);\n\n      if (!setupResultsEvents) {\n        setupResultsEvents = true;\n\n        container.on('results:all', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n\n        container.on('results:append', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n      }\n    });\n\n    container.on('close', function () {\n      self._hideDropdown();\n      self._detachPositioningHandler(container);\n    });\n\n    this.$dropdownContainer.on('mousedown', function (evt) {\n      evt.stopPropagation();\n    });\n  };\n\n  AttachBody.prototype.position = function (decorated, $dropdown, $container) {\n    // Clone all of the container classes\n    $dropdown.attr('class', $container.attr('class'));\n\n    $dropdown.removeClass('select2');\n    $dropdown.addClass('select2-container--open');\n\n    $dropdown.css({\n      position: 'absolute',\n      top: -999999\n    });\n\n    this.$container = $container;\n  };\n\n  AttachBody.prototype.render = function (decorated) {\n    var $container = $('<span></span>');\n\n    var $dropdown = decorated.call(this);\n    $container.append($dropdown);\n\n    this.$dropdownContainer = $container;\n\n    return $container;\n  };\n\n  AttachBody.prototype._hideDropdown = function (decorated) {\n    this.$dropdownContainer.detach();\n  };\n\n  AttachBody.prototype._attachPositioningHandler = function (container) {\n    var self = this;\n\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.each(function () {\n      $(this).data('select2-scroll-position', {\n        x: $(this).scrollLeft(),\n        y: $(this).scrollTop()\n      });\n    });\n\n    $watchers.on(scrollEvent, function (ev) {\n      var position = $(this).data('select2-scroll-position');\n      $(this).scrollTop(position.y);\n    });\n\n    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,\n      function (e) {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n  };\n\n  AttachBody.prototype._detachPositioningHandler = function (container) {\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.off(scrollEvent);\n\n    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);\n  };\n\n  AttachBody.prototype._positionDropdown = function () {\n    var $window = $(window);\n\n    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');\n    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');\n\n    var newDirection = null;\n\n    var position = this.$container.position();\n    var offset = this.$container.offset();\n\n    offset.bottom = offset.top + this.$container.outerHeight(false);\n\n    var container = {\n      height: this.$container.outerHeight(false)\n    };\n\n    container.top = offset.top;\n    container.bottom = offset.top + container.height;\n\n    var dropdown = {\n      height: this.$dropdown.outerHeight(false)\n    };\n\n    var viewport = {\n      top: $window.scrollTop(),\n      bottom: $window.scrollTop() + $window.height()\n    };\n\n    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);\n    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);\n\n    var css = {\n      left: offset.left,\n      top: container.bottom\n    };\n\n    if (!isCurrentlyAbove && !isCurrentlyBelow) {\n      newDirection = 'below';\n    }\n\n    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n      newDirection = 'above';\n    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n      newDirection = 'below';\n    }\n\n    if (newDirection == 'above' ||\n      (isCurrentlyAbove && newDirection !== 'below')) {\n      css.top = container.top - dropdown.height;\n    }\n\n    if (newDirection != null) {\n      this.$dropdown\n        .removeClass('select2-dropdown--below select2-dropdown--above')\n        .addClass('select2-dropdown--' + newDirection);\n      this.$container\n        .removeClass('select2-container--below select2-container--above')\n        .addClass('select2-container--' + newDirection);\n    }\n\n    this.$dropdownContainer.css(css);\n  };\n\n  AttachBody.prototype._resizeDropdown = function () {\n    this.$dropdownContainer.width();\n\n    var css = {\n      width: this.$container.outerWidth(false) + 'px'\n    };\n\n    if (this.options.get('dropdownAutoWidth')) {\n      css.minWidth = css.width;\n      css.width = 'auto';\n    }\n\n    this.$dropdown.css(css);\n  };\n\n  AttachBody.prototype._showDropdown = function (decorated) {\n    this.$dropdownContainer.appendTo(this.$dropdownParent);\n\n    this._positionDropdown();\n    this._resizeDropdown();\n  };\n\n  return AttachBody;\n});\n\nS2.define('select2/dropdown/minimumResultsForSearch',[\n\n], function () {\n  function countResults (data) {\n    var count = 0;\n\n    for (var d = 0; d < data.length; d++) {\n      var item = data[d];\n\n      if (item.children) {\n        count += countResults(item.children);\n      } else {\n        count++;\n      }\n    }\n\n    return count;\n  }\n\n  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {\n    this.minimumResultsForSearch = options.get('minimumResultsForSearch');\n\n    if (this.minimumResultsForSearch < 0) {\n      this.minimumResultsForSearch = Infinity;\n    }\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {\n    if (countResults(params.data.results) < this.minimumResultsForSearch) {\n      return false;\n    }\n\n    return decorated.call(this, params);\n  };\n\n  return MinimumResultsForSearch;\n});\n\nS2.define('select2/dropdown/selectOnClose',[\n\n], function () {\n  function SelectOnClose () { }\n\n  SelectOnClose.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('close', function () {\n      self._handleSelectOnClose();\n    });\n  };\n\n  SelectOnClose.prototype._handleSelectOnClose = function () {\n    var $highlightedResults = this.getHighlightedResults();\n\n    if ($highlightedResults.length < 1) {\n      return;\n    }\n\n    this.trigger('select', {\n        data: $highlightedResults.data('data')\n    });\n  };\n\n  return SelectOnClose;\n});\n\nS2.define('select2/dropdown/closeOnSelect',[\n\n], function () {\n  function CloseOnSelect () { }\n\n  CloseOnSelect.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('select', function (evt) {\n      self._selectTriggered(evt);\n    });\n\n    container.on('unselect', function (evt) {\n      self._selectTriggered(evt);\n    });\n  };\n\n  CloseOnSelect.prototype._selectTriggered = function (_, evt) {\n    var originalEvent = evt.originalEvent;\n\n    // Don't close if the control key is being held\n    if (originalEvent && originalEvent.ctrlKey) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  return CloseOnSelect;\n});\n\nS2.define('select2/i18n/en',[],function () {\n  // English\n  return {\n    errorLoading: function () {\n      return 'The results could not be loaded.';\n    },\n    inputTooLong: function (args) {\n      var overChars = args.input.length - args.maximum;\n\n      var message = 'Please delete ' + overChars + ' character';\n\n      if (overChars != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    inputTooShort: function (args) {\n      var remainingChars = args.minimum - args.input.length;\n\n      var message = 'Please enter ' + remainingChars + ' or more characters';\n\n      return message;\n    },\n    loadingMore: function () {\n      return 'Loading more results…';\n    },\n    maximumSelected: function (args) {\n      var message = 'You can only select ' + args.maximum + ' item';\n\n      if (args.maximum != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    noResults: function () {\n      return 'No results found';\n    },\n    searching: function () {\n      return 'Searching…';\n    }\n  };\n});\n\nS2.define('select2/defaults',[\n  'jquery',\n  'require',\n\n  './results',\n\n  './selection/single',\n  './selection/multiple',\n  './selection/placeholder',\n  './selection/allowClear',\n  './selection/search',\n  './selection/eventRelay',\n\n  './utils',\n  './translation',\n  './diacritics',\n\n  './data/select',\n  './data/array',\n  './data/ajax',\n  './data/tags',\n  './data/tokenizer',\n  './data/minimumInputLength',\n  './data/maximumInputLength',\n  './data/maximumSelectionLength',\n\n  './dropdown',\n  './dropdown/search',\n  './dropdown/hidePlaceholder',\n  './dropdown/infiniteScroll',\n  './dropdown/attachBody',\n  './dropdown/minimumResultsForSearch',\n  './dropdown/selectOnClose',\n  './dropdown/closeOnSelect',\n\n  './i18n/en'\n], function ($, require,\n\n             ResultsList,\n\n             SingleSelection, MultipleSelection, Placeholder, AllowClear,\n             SelectionSearch, EventRelay,\n\n             Utils, Translation, DIACRITICS,\n\n             SelectData, ArrayData, AjaxData, Tags, Tokenizer,\n             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,\n\n             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,\n             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,\n\n             EnglishTranslation) {\n  function Defaults () {\n    this.reset();\n  }\n\n  Defaults.prototype.apply = function (options) {\n    options = $.extend({}, this.defaults, options);\n\n    if (options.dataAdapter == null) {\n      if (options.ajax != null) {\n        options.dataAdapter = AjaxData;\n      } else if (options.data != null) {\n        options.dataAdapter = ArrayData;\n      } else {\n        options.dataAdapter = SelectData;\n      }\n\n      if (options.minimumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MinimumInputLength\n        );\n      }\n\n      if (options.maximumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumInputLength\n        );\n      }\n\n      if (options.maximumSelectionLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumSelectionLength\n        );\n      }\n\n      if (options.tags) {\n        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n      }\n\n      if (options.tokenSeparators != null || options.tokenizer != null) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Tokenizer\n        );\n      }\n\n      if (options.query != null) {\n        var Query = require(options.amdBase + 'compat/query');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Query\n        );\n      }\n\n      if (options.initSelection != null) {\n        var InitSelection = require(options.amdBase + 'compat/initSelection');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          InitSelection\n        );\n      }\n    }\n\n    if (options.resultsAdapter == null) {\n      options.resultsAdapter = ResultsList;\n\n      if (options.ajax != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          InfiniteScroll\n        );\n      }\n\n      if (options.placeholder != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          HidePlaceholder\n        );\n      }\n\n      if (options.selectOnClose) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          SelectOnClose\n        );\n      }\n    }\n\n    if (options.dropdownAdapter == null) {\n      if (options.multiple) {\n        options.dropdownAdapter = Dropdown;\n      } else {\n        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n\n        options.dropdownAdapter = SearchableDropdown;\n      }\n\n      if (options.minimumResultsForSearch !== 0) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          MinimumResultsForSearch\n        );\n      }\n\n      if (options.closeOnSelect) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          CloseOnSelect\n        );\n      }\n\n      if (\n        options.dropdownCssClass != null ||\n        options.dropdownCss != null ||\n        options.adaptDropdownCssClass != null\n      ) {\n        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');\n\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          DropdownCSS\n        );\n      }\n\n      options.dropdownAdapter = Utils.Decorate(\n        options.dropdownAdapter,\n        AttachBody\n      );\n    }\n\n    if (options.selectionAdapter == null) {\n      if (options.multiple) {\n        options.selectionAdapter = MultipleSelection;\n      } else {\n        options.selectionAdapter = SingleSelection;\n      }\n\n      // Add the placeholder mixin if a placeholder was specified\n      if (options.placeholder != null) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          Placeholder\n        );\n      }\n\n      if (options.allowClear) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          AllowClear\n        );\n      }\n\n      if (options.multiple) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          SelectionSearch\n        );\n      }\n\n      if (\n        options.containerCssClass != null ||\n        options.containerCss != null ||\n        options.adaptContainerCssClass != null\n      ) {\n        var ContainerCSS = require(options.amdBase + 'compat/containerCss');\n\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          ContainerCSS\n        );\n      }\n\n      options.selectionAdapter = Utils.Decorate(\n        options.selectionAdapter,\n        EventRelay\n      );\n    }\n\n    if (typeof options.language === 'string') {\n      // Check if the language is specified with a region\n      if (options.language.indexOf('-') > 0) {\n        // Extract the region information if it is included\n        var languageParts = options.language.split('-');\n        var baseLanguage = languageParts[0];\n\n        options.language = [options.language, baseLanguage];\n      } else {\n        options.language = [options.language];\n      }\n    }\n\n    if ($.isArray(options.language)) {\n      var languages = new Translation();\n      options.language.push('en');\n\n      var languageNames = options.language;\n\n      for (var l = 0; l < languageNames.length; l++) {\n        var name = languageNames[l];\n        var language = {};\n\n        try {\n          // Try to load it with the original name\n          language = Translation.loadPath(name);\n        } catch (e) {\n          try {\n            // If we couldn't load it, check if it wasn't the full path\n            name = this.defaults.amdLanguageBase + name;\n            language = Translation.loadPath(name);\n          } catch (ex) {\n            // The translation could not be loaded at all. Sometimes this is\n            // because of a configuration problem, other times this can be\n            // because of how Select2 helps load all possible translation files.\n            if (options.debug && window.console && console.warn) {\n              console.warn(\n                'Select2: The language file for \"' + name + '\" could not be ' +\n                'automatically loaded. A fallback will be used instead.'\n              );\n            }\n\n            continue;\n          }\n        }\n\n        languages.extend(language);\n      }\n\n      options.translations = languages;\n    } else {\n      var baseTranslation = Translation.loadPath(\n        this.defaults.amdLanguageBase + 'en'\n      );\n      var customTranslation = new Translation(options.language);\n\n      customTranslation.extend(baseTranslation);\n\n      options.translations = customTranslation;\n    }\n\n    return options;\n  };\n\n  Defaults.prototype.reset = function () {\n    function stripDiacritics (text) {\n      // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n      function match(a) {\n        return DIACRITICS[a] || a;\n      }\n\n      return text.replace(/[^\\u0000-\\u007E]/g, match);\n    }\n\n    function matcher (params, data) {\n      // Always return the object if there is nothing to compare\n      if ($.trim(params.term) === '') {\n        return data;\n      }\n\n      // Do a recursive check for options with children\n      if (data.children && data.children.length > 0) {\n        // Clone the data object if there are children\n        // This is required as we modify the object to remove any non-matches\n        var match = $.extend(true, {}, data);\n\n        // Check each child of the option\n        for (var c = data.children.length - 1; c >= 0; c--) {\n          var child = data.children[c];\n\n          var matches = matcher(params, child);\n\n          // If there wasn't a match, remove the object in the array\n          if (matches == null) {\n            match.children.splice(c, 1);\n          }\n        }\n\n        // If any children matched, return the new object\n        if (match.children.length > 0) {\n          return match;\n        }\n\n        // If there were no matching children, check just the plain object\n        return matcher(params, match);\n      }\n\n      var original = stripDiacritics(data.text).toUpperCase();\n      var term = stripDiacritics(params.term).toUpperCase();\n\n      // Check if the text contains the term\n      if (original.indexOf(term) > -1) {\n        return data;\n      }\n\n      // If it doesn't contain the term, don't return anything\n      return null;\n    }\n\n    this.defaults = {\n      amdBase: './',\n      amdLanguageBase: './i18n/',\n      closeOnSelect: true,\n      debug: false,\n      dropdownAutoWidth: false,\n      escapeMarkup: Utils.escapeMarkup,\n      language: EnglishTranslation,\n      matcher: matcher,\n      minimumInputLength: 0,\n      maximumInputLength: 0,\n      maximumSelectionLength: 0,\n      minimumResultsForSearch: 0,\n      selectOnClose: false,\n      sorter: function (data) {\n        return data;\n      },\n      templateResult: function (result) {\n        return result.text;\n      },\n      templateSelection: function (selection) {\n        return selection.text;\n      },\n      theme: 'default',\n      width: 'resolve'\n    };\n  };\n\n  Defaults.prototype.set = function (key, value) {\n    var camelKey = $.camelCase(key);\n\n    var data = {};\n    data[camelKey] = value;\n\n    var convertedData = Utils._convertData(data);\n\n    $.extend(this.defaults, convertedData);\n  };\n\n  var defaults = new Defaults();\n\n  return defaults;\n});\n\nS2.define('select2/options',[\n  'require',\n  'jquery',\n  './defaults',\n  './utils'\n], function (require, $, Defaults, Utils) {\n  function Options (options, $element) {\n    this.options = options;\n\n    if ($element != null) {\n      this.fromElement($element);\n    }\n\n    this.options = Defaults.apply(this.options);\n\n    if ($element && $element.is('input')) {\n      var InputCompat = require(this.get('amdBase') + 'compat/inputData');\n\n      this.options.dataAdapter = Utils.Decorate(\n        this.options.dataAdapter,\n        InputCompat\n      );\n    }\n  }\n\n  Options.prototype.fromElement = function ($e) {\n    var excludedData = ['select2'];\n\n    if (this.options.multiple == null) {\n      this.options.multiple = $e.prop('multiple');\n    }\n\n    if (this.options.disabled == null) {\n      this.options.disabled = $e.prop('disabled');\n    }\n\n    if (this.options.language == null) {\n      if ($e.prop('lang')) {\n        this.options.language = $e.prop('lang').toLowerCase();\n      } else if ($e.closest('[lang]').prop('lang')) {\n        this.options.language = $e.closest('[lang]').prop('lang');\n      }\n    }\n\n    if (this.options.dir == null) {\n      if ($e.prop('dir')) {\n        this.options.dir = $e.prop('dir');\n      } else if ($e.closest('[dir]').prop('dir')) {\n        this.options.dir = $e.closest('[dir]').prop('dir');\n      } else {\n        this.options.dir = 'ltr';\n      }\n    }\n\n    $e.prop('disabled', this.options.disabled);\n    $e.prop('multiple', this.options.multiple);\n\n    if ($e.data('select2Tags')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-select2-tags` attribute has been changed to ' +\n          'use the `data-data` and `data-tags=\"true\"` attributes and will be ' +\n          'removed in future versions of Select2.'\n        );\n      }\n\n      $e.data('data', $e.data('select2Tags'));\n      $e.data('tags', true);\n    }\n\n    if ($e.data('ajaxUrl')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-ajax-url` attribute has been changed to ' +\n          '`data-ajax--url` and support for the old attribute will be removed' +\n          ' in future versions of Select2.'\n        );\n      }\n\n      $e.attr('ajax--url', $e.data('ajaxUrl'));\n      $e.data('ajax--url', $e.data('ajaxUrl'));\n    }\n\n    var dataset = {};\n\n    // Prefer the element's `dataset` attribute if it exists\n    // jQuery 1.x does not correctly handle data attributes with multiple dashes\n    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {\n      dataset = $.extend(true, {}, $e[0].dataset, $e.data());\n    } else {\n      dataset = $e.data();\n    }\n\n    var data = $.extend(true, {}, dataset);\n\n    data = Utils._convertData(data);\n\n    for (var key in data) {\n      if ($.inArray(key, excludedData) > -1) {\n        continue;\n      }\n\n      if ($.isPlainObject(this.options[key])) {\n        $.extend(this.options[key], data[key]);\n      } else {\n        this.options[key] = data[key];\n      }\n    }\n\n    return this;\n  };\n\n  Options.prototype.get = function (key) {\n    return this.options[key];\n  };\n\n  Options.prototype.set = function (key, val) {\n    this.options[key] = val;\n  };\n\n  return Options;\n});\n\nS2.define('select2/core',[\n  'jquery',\n  './options',\n  './utils',\n  './keys'\n], function ($, Options, Utils, KEYS) {\n  var Select2 = function ($element, options) {\n    if ($element.data('select2') != null) {\n      $element.data('select2').destroy();\n    }\n\n    this.$element = $element;\n\n    this.id = this._generateId($element);\n\n    options = options || {};\n\n    this.options = new Options(options, $element);\n\n    Select2.__super__.constructor.call(this);\n\n    // Set up the tabindex\n\n    var tabindex = $element.attr('tabindex') || 0;\n    $element.data('old-tabindex', tabindex);\n    $element.attr('tabindex', '-1');\n\n    // Set up containers and adapters\n\n    var DataAdapter = this.options.get('dataAdapter');\n    this.dataAdapter = new DataAdapter($element, this.options);\n\n    var $container = this.render();\n\n    this._placeContainer($container);\n\n    var SelectionAdapter = this.options.get('selectionAdapter');\n    this.selection = new SelectionAdapter($element, this.options);\n    this.$selection = this.selection.render();\n\n    this.selection.position(this.$selection, $container);\n\n    var DropdownAdapter = this.options.get('dropdownAdapter');\n    this.dropdown = new DropdownAdapter($element, this.options);\n    this.$dropdown = this.dropdown.render();\n\n    this.dropdown.position(this.$dropdown, $container);\n\n    var ResultsAdapter = this.options.get('resultsAdapter');\n    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n    this.$results = this.results.render();\n\n    this.results.position(this.$results, this.$dropdown);\n\n    // Bind events\n\n    var self = this;\n\n    // Bind the container to all of the adapters\n    this._bindAdapters();\n\n    // Register any DOM event handlers\n    this._registerDomEvents();\n\n    // Register any internal event handlers\n    this._registerDataEvents();\n    this._registerSelectionEvents();\n    this._registerDropdownEvents();\n    this._registerResultsEvents();\n    this._registerEvents();\n\n    // Set the initial state\n    this.dataAdapter.current(function (initialData) {\n      self.trigger('selection:update', {\n        data: initialData\n      });\n    });\n\n    // Hide the original select\n    $element.addClass('select2-hidden-accessible');\n\t$element.attr('aria-hidden', 'true');\n\t\n    // Synchronize any monitored attributes\n    this._syncAttributes();\n\n    $element.data('select2', this);\n  };\n\n  Utils.Extend(Select2, Utils.Observable);\n\n  Select2.prototype._generateId = function ($element) {\n    var id = '';\n\n    if ($element.attr('id') != null) {\n      id = $element.attr('id');\n    } else if ($element.attr('name') != null) {\n      id = $element.attr('name') + '-' + Utils.generateChars(2);\n    } else {\n      id = Utils.generateChars(4);\n    }\n\n    id = 'select2-' + id;\n\n    return id;\n  };\n\n  Select2.prototype._placeContainer = function ($container) {\n    $container.insertAfter(this.$element);\n\n    var width = this._resolveWidth(this.$element, this.options.get('width'));\n\n    if (width != null) {\n      $container.css('width', width);\n    }\n  };\n\n  Select2.prototype._resolveWidth = function ($element, method) {\n    var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n\n    if (method == 'resolve') {\n      var styleWidth = this._resolveWidth($element, 'style');\n\n      if (styleWidth != null) {\n        return styleWidth;\n      }\n\n      return this._resolveWidth($element, 'element');\n    }\n\n    if (method == 'element') {\n      var elementWidth = $element.outerWidth(false);\n\n      if (elementWidth <= 0) {\n        return 'auto';\n      }\n\n      return elementWidth + 'px';\n    }\n\n    if (method == 'style') {\n      var style = $element.attr('style');\n\n      if (typeof(style) !== 'string') {\n        return null;\n      }\n\n      var attrs = style.split(';');\n\n      for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n        var attr = attrs[i].replace(/\\s/g, '');\n        var matches = attr.match(WIDTH);\n\n        if (matches !== null && matches.length >= 1) {\n          return matches[1];\n        }\n      }\n\n      return null;\n    }\n\n    return method;\n  };\n\n  Select2.prototype._bindAdapters = function () {\n    this.dataAdapter.bind(this, this.$container);\n    this.selection.bind(this, this.$container);\n\n    this.dropdown.bind(this, this.$container);\n    this.results.bind(this, this.$container);\n  };\n\n  Select2.prototype._registerDomEvents = function () {\n    var self = this;\n\n    this.$element.on('change.select2', function () {\n      self.dataAdapter.current(function (data) {\n        self.trigger('selection:update', {\n          data: data\n        });\n      });\n    });\n\n    this._sync = Utils.bind(this._syncAttributes, this);\n\n    if (this.$element[0].attachEvent) {\n      this.$element[0].attachEvent('onpropertychange', this._sync);\n    }\n\n    var observer = window.MutationObserver ||\n      window.WebKitMutationObserver ||\n      window.MozMutationObserver\n    ;\n\n    if (observer != null) {\n      this._observer = new observer(function (mutations) {\n        $.each(mutations, self._sync);\n      });\n      this._observer.observe(this.$element[0], {\n        attributes: true,\n        subtree: false\n      });\n    } else if (this.$element[0].addEventListener) {\n      this.$element[0].addEventListener('DOMAttrModified', self._sync, false);\n    }\n  };\n\n  Select2.prototype._registerDataEvents = function () {\n    var self = this;\n\n    this.dataAdapter.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerSelectionEvents = function () {\n    var self = this;\n    var nonRelayEvents = ['toggle'];\n\n    this.selection.on('toggle', function () {\n      self.toggleDropdown();\n    });\n\n    this.selection.on('*', function (name, params) {\n      if ($.inArray(name, nonRelayEvents) !== -1) {\n        return;\n      }\n\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerDropdownEvents = function () {\n    var self = this;\n\n    this.dropdown.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerResultsEvents = function () {\n    var self = this;\n\n    this.results.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerEvents = function () {\n    var self = this;\n\n    this.on('open', function () {\n      self.$container.addClass('select2-container--open');\n    });\n\n    this.on('close', function () {\n      self.$container.removeClass('select2-container--open');\n    });\n\n    this.on('enable', function () {\n      self.$container.removeClass('select2-container--disabled');\n    });\n\n    this.on('disable', function () {\n      self.$container.addClass('select2-container--disabled');\n    });\n\n    this.on('focus', function () {\n      self.$container.addClass('select2-container--focus');\n    });\n\n    this.on('blur', function () {\n      self.$container.removeClass('select2-container--focus');\n    });\n\n    this.on('query', function (params) {\n      if (!self.isOpen()) {\n        self.trigger('open');\n      }\n\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:all', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('query:append', function (params) {\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:append', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('keypress', function (evt) {\n      var key = evt.which;\n\n      if (self.isOpen()) {\n        if (key === KEYS.ENTER) {\n          self.trigger('results:select');\n\n          evt.preventDefault();\n        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {\n          self.trigger('results:toggle');\n\n          evt.preventDefault();\n        } else if (key === KEYS.UP) {\n          self.trigger('results:previous');\n\n          evt.preventDefault();\n        } else if (key === KEYS.DOWN) {\n          self.trigger('results:next');\n\n          evt.preventDefault();\n        } else if (key === KEYS.ESC || key === KEYS.TAB) {\n          self.close();\n\n          evt.preventDefault();\n        }\n      } else {\n        if (key === KEYS.ENTER || key === KEYS.SPACE ||\n            ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) {\n          self.open();\n\n          evt.preventDefault();\n        }\n      }\n    });\n  };\n\n  Select2.prototype._syncAttributes = function () {\n    this.options.set('disabled', this.$element.prop('disabled'));\n\n    if (this.options.get('disabled')) {\n      if (this.isOpen()) {\n        this.close();\n      }\n\n      this.trigger('disable');\n    } else {\n      this.trigger('enable');\n    }\n  };\n\n  /**\n   * Override the trigger method to automatically trigger pre-events when\n   * there are events that can be prevented.\n   */\n  Select2.prototype.trigger = function (name, args) {\n    var actualTrigger = Select2.__super__.trigger;\n    var preTriggerMap = {\n      'open': 'opening',\n      'close': 'closing',\n      'select': 'selecting',\n      'unselect': 'unselecting'\n    };\n\n    if (name in preTriggerMap) {\n      var preTriggerName = preTriggerMap[name];\n      var preTriggerArgs = {\n        prevented: false,\n        name: name,\n        args: args\n      };\n\n      actualTrigger.call(this, preTriggerName, preTriggerArgs);\n\n      if (preTriggerArgs.prevented) {\n        args.prevented = true;\n\n        return;\n      }\n    }\n\n    actualTrigger.call(this, name, args);\n  };\n\n  Select2.prototype.toggleDropdown = function () {\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  };\n\n  Select2.prototype.open = function () {\n    if (this.isOpen()) {\n      return;\n    }\n\n    this.trigger('query', {});\n\n    this.trigger('open');\n  };\n\n  Select2.prototype.close = function () {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  Select2.prototype.isOpen = function () {\n    return this.$container.hasClass('select2-container--open');\n  };\n\n  Select2.prototype.enable = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"enable\")` method has been deprecated and will' +\n        ' be removed in later Select2 versions. Use $element.prop(\"disabled\")' +\n        ' instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      args = [true];\n    }\n\n    var disabled = !args[0];\n\n    this.$element.prop('disabled', disabled);\n  };\n\n  Select2.prototype.data = function () {\n    if (this.options.get('debug') &&\n        arguments.length > 0 && window.console && console.warn) {\n      console.warn(\n        'Select2: Data can no longer be set using `select2(\"data\")`. You ' +\n        'should consider setting the value instead using `$element.val()`.'\n      );\n    }\n\n    var data = [];\n\n    this.dataAdapter.current(function (currentData) {\n      data = currentData;\n    });\n\n    return data;\n  };\n\n  Select2.prototype.val = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"val\")` method has been deprecated and will be' +\n        ' removed in later Select2 versions. Use $element.val() instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      return this.$element.val();\n    }\n\n    var newVal = args[0];\n\n    if ($.isArray(newVal)) {\n      newVal = $.map(newVal, function (obj) {\n        return obj.toString();\n      });\n    }\n\n    this.$element.val(newVal).trigger('change');\n  };\n\n  Select2.prototype.destroy = function () {\n    this.$container.remove();\n\n    if (this.$element[0].detachEvent) {\n      this.$element[0].detachEvent('onpropertychange', this._sync);\n    }\n\n    if (this._observer != null) {\n      this._observer.disconnect();\n      this._observer = null;\n    } else if (this.$element[0].removeEventListener) {\n      this.$element[0]\n        .removeEventListener('DOMAttrModified', this._sync, false);\n    }\n\n    this._sync = null;\n\n    this.$element.off('.select2');\n    this.$element.attr('tabindex', this.$element.data('old-tabindex'));\n\n    this.$element.removeClass('select2-hidden-accessible');\n\tthis.$element.attr('aria-hidden', 'false');\n    this.$element.removeData('select2');\n\n    this.dataAdapter.destroy();\n    this.selection.destroy();\n    this.dropdown.destroy();\n    this.results.destroy();\n\n    this.dataAdapter = null;\n    this.selection = null;\n    this.dropdown = null;\n    this.results = null;\n  };\n\n  Select2.prototype.render = function () {\n    var $container = $(\n      '<span class=\"select2 select2-container\">' +\n        '<span class=\"selection\"></span>' +\n        '<span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span>' +\n      '</span>'\n    );\n\n    $container.attr('dir', this.options.get('dir'));\n\n    this.$container = $container;\n\n    this.$container.addClass('select2-container--' + this.options.get('theme'));\n\n    $container.data('element', this.$element);\n\n    return $container;\n  };\n\n  return Select2;\n});\n\nS2.define('jquery.select2',[\n  'jquery',\n  'require',\n\n  './select2/core',\n  './select2/defaults'\n], function ($, require, Select2, Defaults) {\n  // Force jQuery.mousewheel to be loaded if it hasn't already\n  require('jquery.mousewheel');\n\n  if ($.fn.select2 == null) {\n    // All methods that should return the element\n    var thisMethods = ['open', 'close', 'destroy'];\n\n    $.fn.select2 = function (options) {\n      options = options || {};\n\n      if (typeof options === 'object') {\n        this.each(function () {\n          var instanceOptions = $.extend({}, options, true);\n\n          var instance = new Select2($(this), instanceOptions);\n        });\n\n        return this;\n      } else if (typeof options === 'string') {\n        var instance = this.data('select2');\n\n        if (instance == null && window.console && console.error) {\n          console.error(\n            'The select2(\\'' + options + '\\') method was called on an ' +\n            'element that is not using Select2.'\n          );\n        }\n\n        var args = Array.prototype.slice.call(arguments, 1);\n\n        var ret = instance[options](args);\n\n        // Check if we should be returning `this`\n        if ($.inArray(options, thisMethods) > -1) {\n          return this;\n        }\n\n        return ret;\n      } else {\n        throw new Error('Invalid arguments for Select2: ' + options);\n      }\n    };\n  }\n\n  if ($.fn.select2.defaults == null) {\n    $.fn.select2.defaults = Defaults;\n  }\n\n  return Select2;\n});\n\nS2.define('jquery.mousewheel',[\n  'jquery'\n], function ($) {\n  // Used to shim jQuery.mousewheel for non-full builds.\n  return $;\n});\n\n  // Return the AMD loader configuration so it can be used outside of this file\n  return {\n    define: S2.define,\n    require: S2.require\n  };\n}());\n\n  // Autoload the jQuery bindings\n  // We know that all of the modules exist above this, so we're safe\n  var select2 = S2.require('jquery.select2');\n\n  // Hold the AMD module references on the jQuery function that was just loaded\n  // This allows Select2 to use the internal loader outside of this file, such\n  // as in the language files.\n  jQuery.fn.select2.amd = S2;\n\n  // Return the Select2 instance for anyone who is importing it.\n  return select2;\n}));\n","/*!\n * iCheck v1.0.1, http://git.io/arlzeA\n * =================================\n * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization\n *\n * (c) 2013 Damir Sultanov, http://fronteed.com\n * MIT Licensed\n */\n\n(function($) {\n\n  // Cached vars\n  var _iCheck = 'iCheck',\n    _iCheckHelper = _iCheck + '-helper',\n    _checkbox = 'checkbox',\n    _radio = 'radio',\n    _checked = 'checked',\n    _unchecked = 'un' + _checked,\n    _disabled = 'disabled',\n    _determinate = 'determinate',\n    _indeterminate = 'in' + _determinate,\n    _update = 'update',\n    _type = 'type',\n    _click = 'click',\n    _touch = 'touchbegin.i touchend.i',\n    _add = 'addClass',\n    _remove = 'removeClass',\n    _callback = 'trigger',\n    _label = 'label',\n    _cursor = 'cursor',\n    _mobile = /ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);\n\n  // Plugin init\n  $.fn[_iCheck] = function(options, fire) {\n\n    // Walker\n    var handle = 'input[type=\"' + _checkbox + '\"], input[type=\"' + _radio + '\"]',\n      stack = $(),\n      walker = function(object) {\n        object.each(function() {\n          var self = $(this);\n\n          if (self.is(handle)) {\n            stack = stack.add(self);\n          } else {\n            stack = stack.add(self.find(handle));\n          }\n        });\n      };\n\n    // Check if we should operate with some method\n    if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) {\n\n      // Normalize method's name\n      options = options.toLowerCase();\n\n      // Find checkboxes and radio buttons\n      walker(this);\n\n      return stack.each(function() {\n        var self = $(this);\n\n        if (options == 'destroy') {\n          tidy(self, 'ifDestroyed');\n        } else {\n          operate(self, true, options);\n        }\n          // Fire method's callback\n        if ($.isFunction(fire)) {\n          fire();\n        }\n      });\n\n    // Customization\n    } else if (typeof options == 'object' || !options) {\n\n      // Check if any options were passed\n      var settings = $.extend({\n          checkedClass: _checked,\n          disabledClass: _disabled,\n          indeterminateClass: _indeterminate,\n          labelHover: true,\n          aria: false\n        }, options),\n\n        selector = settings.handle,\n        hoverClass = settings.hoverClass || 'hover',\n        focusClass = settings.focusClass || 'focus',\n        activeClass = settings.activeClass || 'active',\n        labelHover = !!settings.labelHover,\n        labelHoverClass = settings.labelHoverClass || 'hover',\n\n        // Setup clickable area\n        area = ('' + settings.increaseArea).replace('%', '') | 0;\n\n      // Selector limit\n      if (selector == _checkbox || selector == _radio) {\n        handle = 'input[type=\"' + selector + '\"]';\n      }\n        // Clickable area limit\n      if (area < -50) {\n        area = -50;\n      }\n        // Walk around the selector\n      walker(this);\n\n      return stack.each(function() {\n        var self = $(this);\n\n        // If already customized\n        tidy(self);\n\n        var node = this,\n          id = node.id,\n\n          // Layer styles\n          offset = -area + '%',\n          size = 100 + (area * 2) + '%',\n          layer = {\n            position: 'absolute',\n            top: offset,\n            left: offset,\n            display: 'block',\n            width: size,\n            height: size,\n            margin: 0,\n            padding: 0,\n            background: '#fff',\n            border: 0,\n            opacity: 0\n          },\n\n          // Choose how to hide input\n          hide = _mobile ? {\n            position: 'absolute',\n            visibility: 'hidden'\n          } : area ? layer : {\n            position: 'absolute',\n            opacity: 0\n          },\n\n          // Get proper class\n          className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio,\n\n          // Find assigned labels\n          label = $(_label + '[for=\"' + id + '\"]').add(self.closest(_label)),\n\n          // Check ARIA option\n          aria = !!settings.aria,\n\n          // Set ARIA placeholder\n          ariaID = _iCheck + '-' + Math.random().toString(36).replace('0.', ''),\n\n          // Parent & helper\n          parent = '<div class=\"' + className + '\" ' + (aria ? 'role=\"' + node[_type] + '\" ' : ''),\n          helper;\n\n        // Set ARIA \"labelledby\"\n        if (label.length && aria) {\n          label.each(function() {\n            parent += 'aria-labelledby=\"';\n\n            if (this.id) {\n              parent += this.id;\n            } else {\n              this.id = ariaID;\n              parent += ariaID;\n            }\n\n            parent += '\"';\n          });\n        }\n          // Wrap input\n        parent = self.wrap(parent + '/>')[_callback]('ifCreated').parent().append(settings.insert);\n\n        // Layer addition\n        helper = $('<ins class=\"' + _iCheckHelper + '\"/>').css(layer).appendTo(parent);\n\n        // Finalize customization\n        self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide);\n        !!settings.inheritClass && parent[_add](node.className || '');\n        !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id);\n        parent.css('position') == 'static' && parent.css('position', 'relative');\n        operate(self, true, _update);\n\n        // Label events\n        if (label.length) {\n          label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function(event) {\n            var type = event[_type],\n              item = $(this);\n\n            // Do nothing if input is disabled\n            if (!node[_disabled]) {\n\n              // Click\n              if (type == _click) {\n                if ($(event.target).is('a')) {\n                  return;\n                }\n                operate(self, false, true);\n\n              // Hover state\n              } else if (labelHover) {\n\n                // mouseout|touchend\n                if (/ut|nd/.test(type)) {\n                  parent[_remove](hoverClass);\n                  item[_remove](labelHoverClass);\n                } else {\n                  parent[_add](hoverClass);\n                  item[_add](labelHoverClass);\n                }\n              }\n                if (_mobile) {\n                event.stopPropagation();\n              } else {\n                return false;\n              }\n            }\n          });\n        }\n          // Input events\n        self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function(event) {\n          var type = event[_type],\n            key = event.keyCode;\n\n          // Click\n          if (type == _click) {\n            return false;\n\n          // Keydown\n          } else if (type == 'keydown' && key == 32) {\n            if (!(node[_type] == _radio && node[_checked])) {\n              if (node[_checked]) {\n                off(self, _checked);\n              } else {\n                on(self, _checked);\n              }\n            }\n              return false;\n\n          // Keyup\n          } else if (type == 'keyup' && node[_type] == _radio) {\n            !node[_checked] && on(self, _checked);\n\n          // Focus/blur\n          } else if (/us|ur/.test(type)) {\n            parent[type == 'blur' ? _remove : _add](focusClass);\n          }\n        });\n\n        // Helper events\n        helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function(event) {\n          var type = event[_type],\n\n            // mousedown|mouseup\n            toggle = /wn|up/.test(type) ? activeClass : hoverClass;\n\n          // Do nothing if input is disabled\n          if (!node[_disabled]) {\n\n            // Click\n            if (type == _click) {\n              operate(self, false, true);\n\n            // Active and hover states\n            } else {\n\n              // State is on\n              if (/wn|er|in/.test(type)) {\n\n                // mousedown|mouseover|touchbegin\n                parent[_add](toggle);\n\n              // State is off\n              } else {\n                parent[_remove](toggle + ' ' + activeClass);\n              }\n                // Label hover\n              if (label.length && labelHover && toggle == hoverClass) {\n\n                // mouseout|touchend\n                label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass);\n              }\n            }\n              if (_mobile) {\n              event.stopPropagation();\n            } else {\n              return false;\n            }\n          }\n        });\n      });\n    } else {\n      return this;\n    }\n  };\n\n  // Do something with inputs\n  function operate(input, direct, method) {\n    var node = input[0],\n      state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked,\n      active = method == _update ? {\n        checked: node[_checked],\n        disabled: node[_disabled],\n        indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false'\n      } : node[state];\n\n    // Check, disable or indeterminate\n    if (/^(ch|di|in)/.test(method) && !active) {\n      on(input, state);\n\n    // Uncheck, enable or determinate\n    } else if (/^(un|en|de)/.test(method) && active) {\n      off(input, state);\n\n    // Update\n    } else if (method == _update) {\n\n      // Handle states\n      for (var state in active) {\n        if (active[state]) {\n          on(input, state, true);\n        } else {\n          off(input, state, true);\n        }\n      }\n    } else if (!direct || method == 'toggle') {\n\n      // Helper or label was clicked\n      if (!direct) {\n        input[_callback]('ifClicked');\n      }\n        // Toggle checked state\n      if (active) {\n        if (node[_type] !== _radio) {\n          off(input, state);\n        }\n      } else {\n        on(input, state);\n      }\n    }\n  }\n    // Add checked, disabled or indeterminate state\n  function on(input, state, keep) {\n    var node = input[0],\n      parent = input.parent(),\n      checked = state == _checked,\n      indeterminate = state == _indeterminate,\n      disabled = state == _disabled,\n      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',\n      regular = option(input, callback + capitalize(node[_type])),\n      specific = option(input, state + capitalize(node[_type]));\n\n    // Prevent unnecessary actions\n    if (node[state] !== true) {\n\n      // Toggle assigned radio buttons\n      if (!keep && state == _checked && node[_type] == _radio && node.name) {\n        var form = input.closest('form'),\n          inputs = 'input[name=\"' + node.name + '\"]';\n\n        inputs = form.length ? form.find(inputs) : $(inputs);\n\n        inputs.each(function() {\n          if (this !== node && $(this).data(_iCheck)) {\n            off($(this), state);\n          }\n        });\n      }\n        // Indeterminate state\n      if (indeterminate) {\n\n        // Add indeterminate state\n        node[state] = true;\n\n        // Remove checked state\n        if (node[_checked]) {\n          off(input, _checked, 'force');\n        }\n          // Checked or disabled state\n      } else {\n\n        // Add checked or disabled state\n        if (!keep) {\n          node[state] = true;\n        }\n          // Remove indeterminate state\n        if (checked && node[_indeterminate]) {\n          off(input, _indeterminate, false);\n        }\n      }\n        // Trigger callbacks\n      callbacks(input, checked, state, keep);\n    }\n      // Add proper cursor\n    if (node[_disabled] && !!option(input, _cursor, true)) {\n      parent.find('.' + _iCheckHelper).css(_cursor, 'default');\n    }\n      // Add state class\n    parent[_add](specific || option(input, state) || '');\n\n    // Set ARIA attribute\n    disabled ? parent.attr('aria-disabled', 'true') : parent.attr('aria-checked', indeterminate ? 'mixed' : 'true');\n\n    // Remove regular state class\n    parent[_remove](regular || option(input, callback) || '');\n  }\n    // Remove checked, disabled or indeterminate state\n  function off(input, state, keep) {\n    var node = input[0],\n      parent = input.parent(),\n      checked = state == _checked,\n      indeterminate = state == _indeterminate,\n      disabled = state == _disabled,\n      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',\n      regular = option(input, callback + capitalize(node[_type])),\n      specific = option(input, state + capitalize(node[_type]));\n\n    // Prevent unnecessary actions\n    if (node[state] !== false) {\n\n      // Toggle state\n      if (indeterminate || !keep || keep == 'force') {\n        node[state] = false;\n      }\n        // Trigger callbacks\n      callbacks(input, checked, callback, keep);\n    }\n      // Add proper cursor\n    if (!node[_disabled] && !!option(input, _cursor, true)) {\n      parent.find('.' + _iCheckHelper).css(_cursor, 'pointer');\n    }\n      // Remove state class\n    parent[_remove](specific || option(input, state) || '');\n\n    // Set ARIA attribute\n    disabled ? parent.attr('aria-disabled', 'false') : parent.attr('aria-checked', 'false');\n\n    // Add regular state class\n    parent[_add](regular || option(input, callback) || '');\n  }\n    // Remove all traces\n  function tidy(input, callback) {\n    if (input.data(_iCheck)) {\n\n      // Remove everything except input\n      input.parent().html(input.attr('style', input.data(_iCheck).s || ''));\n\n      // Callback\n      if (callback) {\n        input[_callback](callback);\n      }\n        // Unbind events\n      input.off('.i').unwrap();\n      $(_label + '[for=\"' + input[0].id + '\"]').add(input.closest(_label)).off('.i');\n    }\n  }\n    // Get some option\n  function option(input, state, regular) {\n    if (input.data(_iCheck)) {\n      return input.data(_iCheck).o[state + (regular ? '' : 'Class')];\n    }\n  }\n    // Capitalize some string\n  function capitalize(string) {\n    return string.charAt(0).toUpperCase() + string.slice(1);\n  }\n    // Executable handlers\n  function callbacks(input, checked, callback, keep) {\n    if (!keep) {\n      if (checked) {\n        input[_callback]('ifToggled');\n      }\n        input[_callback]('ifChanged')[_callback]('if' + capitalize(callback));\n    }\n  }\n})(window.jQuery || window.Zepto);\n","\n/*\nLightbox for Bootstrap 3 by @ashleydw\nhttps://github.com/ashleydw/lightbox\n\nLicense: https://github.com/ashleydw/lightbox/blob/master/LICENSE\n */\n\n(function() {\n  \"use strict\";\n  var $, EkkoLightbox;\n\n  $ = jQuery;\n\n  EkkoLightbox = function(element, options) {\n    var content, footer, header;\n    this.options = $.extend({\n      title: null,\n      footer: null,\n      remote: null\n    }, $.fn.ekkoLightbox.defaults, options || {});\n    this.$element = $(element);\n    content = '';\n    this.modal_id = this.options.modal_id ? this.options.modal_id : 'ekkoLightbox-' + Math.floor((Math.random() * 1000) + 1);\n    header = '<div class=\"modal-header\"' + (this.options.title || this.options.always_show_close ? '' : ' style=\"display:none\"') + '><button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button><h4 class=\"modal-title\">' + (this.options.title || \"&nbsp;\") + '</h4></div>';\n    footer = '<div class=\"modal-footer\"' + (this.options.footer ? '' : ' style=\"display:none\"') + '>' + this.options.footer + '</div>';\n    $(document.body).append('<div id=\"' + this.modal_id + '\" class=\"ekko-lightbox modal fade\" tabindex=\"-1\"><div class=\"modal-dialog\"><div class=\"modal-content\">' + header + '<div class=\"modal-body\"><div class=\"ekko-lightbox-container\"><div></div></div></div>' + footer + '</div></div></div>');\n    this.modal = $('#' + this.modal_id);\n    this.modal_dialog = this.modal.find('.modal-dialog').first();\n    this.modal_content = this.modal.find('.modal-content').first();\n    this.modal_body = this.modal.find('.modal-body').first();\n    this.modal_header = this.modal.find('.modal-header').first();\n    this.modal_footer = this.modal.find('.modal-footer').first();\n    this.lightbox_container = this.modal_body.find('.ekko-lightbox-container').first();\n    this.lightbox_body = this.lightbox_container.find('> div:first-child').first();\n    this.showLoading();\n    this.modal_arrows = null;\n    this.border = {\n      top: parseFloat(this.modal_dialog.css('border-top-width')) + parseFloat(this.modal_content.css('border-top-width')) + parseFloat(this.modal_body.css('border-top-width')),\n      right: parseFloat(this.modal_dialog.css('border-right-width')) + parseFloat(this.modal_content.css('border-right-width')) + parseFloat(this.modal_body.css('border-right-width')),\n      bottom: parseFloat(this.modal_dialog.css('border-bottom-width')) + parseFloat(this.modal_content.css('border-bottom-width')) + parseFloat(this.modal_body.css('border-bottom-width')),\n      left: parseFloat(this.modal_dialog.css('border-left-width')) + parseFloat(this.modal_content.css('border-left-width')) + parseFloat(this.modal_body.css('border-left-width'))\n    };\n    this.padding = {\n      top: parseFloat(this.modal_dialog.css('padding-top')) + parseFloat(this.modal_content.css('padding-top')) + parseFloat(this.modal_body.css('padding-top')),\n      right: parseFloat(this.modal_dialog.css('padding-right')) + parseFloat(this.modal_content.css('padding-right')) + parseFloat(this.modal_body.css('padding-right')),\n      bottom: parseFloat(this.modal_dialog.css('padding-bottom')) + parseFloat(this.modal_content.css('padding-bottom')) + parseFloat(this.modal_body.css('padding-bottom')),\n      left: parseFloat(this.modal_dialog.css('padding-left')) + parseFloat(this.modal_content.css('padding-left')) + parseFloat(this.modal_body.css('padding-left'))\n    };\n    this.modal.on('show.bs.modal', this.options.onShow.bind(this)).on('shown.bs.modal', (function(_this) {\n      return function() {\n        _this.modal_shown();\n        return _this.options.onShown.call(_this);\n      };\n    })(this)).on('hide.bs.modal', this.options.onHide.bind(this)).on('hidden.bs.modal', (function(_this) {\n      return function() {\n        if (_this.gallery) {\n          $(document).off('keydown.ekkoLightbox');\n        }\n        _this.modal.remove();\n        return _this.options.onHidden.call(_this);\n      };\n    })(this)).modal('show', options);\n    return this.modal;\n  };\n\n  EkkoLightbox.prototype = {\n    modal_shown: function() {\n      var video_id;\n      if (!this.options.remote) {\n        return this.error('No remote target given');\n      } else {\n        this.gallery = this.$element.data('gallery');\n        if (this.gallery) {\n          if (this.options.gallery_parent_selector === 'document.body' || this.options.gallery_parent_selector === '') {\n            this.gallery_items = $(document.body).find('*[data-gallery=\"' + this.gallery + '\"]');\n          } else {\n            this.gallery_items = this.$element.parents(this.options.gallery_parent_selector).first().find('*[data-gallery=\"' + this.gallery + '\"]');\n          }\n          this.gallery_index = this.gallery_items.index(this.$element);\n          $(document).on('keydown.ekkoLightbox', this.navigate.bind(this));\n          if (this.options.directional_arrows && this.gallery_items.length > 1) {\n            this.lightbox_container.append('<div class=\"ekko-lightbox-nav-overlay\"><a href=\"#\" class=\"' + this.strip_stops(this.options.left_arrow_class) + '\"></a><a href=\"#\" class=\"' + this.strip_stops(this.options.right_arrow_class) + '\"></a></div>');\n            this.modal_arrows = this.lightbox_container.find('div.ekko-lightbox-nav-overlay').first();\n            this.lightbox_container.find('a' + this.strip_spaces(this.options.left_arrow_class)).on('click', (function(_this) {\n              return function(event) {\n                event.preventDefault();\n                return _this.navigate_left();\n              };\n            })(this));\n            this.lightbox_container.find('a' + this.strip_spaces(this.options.right_arrow_class)).on('click', (function(_this) {\n              return function(event) {\n                event.preventDefault();\n                return _this.navigate_right();\n              };\n            })(this));\n          }\n        }\n        if (this.options.type) {\n          if (this.options.type === 'image') {\n            return this.preloadImage(this.options.remote, true);\n          } else if (this.options.type === 'youtube' && (video_id = this.getYoutubeId(this.options.remote))) {\n            return this.showYoutubeVideo(video_id);\n          } else if (this.options.type === 'vimeo') {\n            return this.showVimeoVideo(this.options.remote);\n          } else if (this.options.type === 'instagram') {\n            return this.showInstagramVideo(this.options.remote);\n          } else if (this.options.type === 'url') {\n            return this.loadRemoteContent(this.options.remote);\n          } else if (this.options.type === 'video') {\n            return this.showVideoIframe(this.options.remote);\n          } else {\n            return this.error(\"Could not detect remote target type. Force the type using data-type=\\\"image|youtube|vimeo|instagram|url|video\\\"\");\n          }\n        } else {\n          return this.detectRemoteType(this.options.remote);\n        }\n      }\n    },\n    strip_stops: function(str) {\n      return str.replace(/\\./g, '');\n    },\n    strip_spaces: function(str) {\n      return str.replace(/\\s/g, '');\n    },\n    isImage: function(str) {\n      return str.match(/(^data:image\\/.*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\\?|#).*)?$)/i);\n    },\n    isSwf: function(str) {\n      return str.match(/\\.(swf)((\\?|#).*)?$/i);\n    },\n    getYoutubeId: function(str) {\n      var match;\n      match = str.match(/^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=)([^#\\&\\?]*).*/);\n      if (match && match[2].length === 11) {\n        return match[2];\n      } else {\n        return false;\n      }\n    },\n    getVimeoId: function(str) {\n      if (str.indexOf('vimeo') > 0) {\n        return str;\n      } else {\n        return false;\n      }\n    },\n    getInstagramId: function(str) {\n      if (str.indexOf('instagram') > 0) {\n        return str;\n      } else {\n        return false;\n      }\n    },\n    navigate: function(event) {\n      event = event || window.event;\n      if (event.keyCode === 39 || event.keyCode === 37) {\n        if (event.keyCode === 39) {\n          return this.navigate_right();\n        } else if (event.keyCode === 37) {\n          return this.navigate_left();\n        }\n      }\n    },\n    navigateTo: function(index) {\n      var next, src;\n      if (index < 0 || index > this.gallery_items.length - 1) {\n        return this;\n      }\n      this.showLoading();\n      this.gallery_index = index;\n      this.$element = $(this.gallery_items.get(this.gallery_index));\n      this.updateTitleAndFooter();\n      src = this.$element.attr('data-remote') || this.$element.attr('href');\n      this.detectRemoteType(src, this.$element.attr('data-type') || false);\n      if (this.gallery_index + 1 < this.gallery_items.length) {\n        next = $(this.gallery_items.get(this.gallery_index + 1), false);\n        src = next.attr('data-remote') || next.attr('href');\n        if (next.attr('data-type') === 'image' || this.isImage(src)) {\n          return this.preloadImage(src, false);\n        }\n      }\n    },\n    navigate_left: function() {\n      if (this.gallery_items.length === 1) {\n        return;\n      }\n      if (this.gallery_index === 0) {\n        this.gallery_index = this.gallery_items.length - 1;\n      } else {\n        this.gallery_index--;\n      }\n      this.options.onNavigate.call(this, 'left', this.gallery_index);\n      return this.navigateTo(this.gallery_index);\n    },\n    navigate_right: function() {\n      if (this.gallery_items.length === 1) {\n        return;\n      }\n      if (this.gallery_index === this.gallery_items.length - 1) {\n        this.gallery_index = 0;\n      } else {\n        this.gallery_index++;\n      }\n      this.options.onNavigate.call(this, 'right', this.gallery_index);\n      return this.navigateTo(this.gallery_index);\n    },\n    detectRemoteType: function(src, type) {\n      var video_id;\n      type = type || false;\n      if (type === 'image' || this.isImage(src)) {\n        this.options.type = 'image';\n        return this.preloadImage(src, true);\n      } else if (type === 'youtube' || (video_id = this.getYoutubeId(src))) {\n        this.options.type = 'youtube';\n        return this.showYoutubeVideo(video_id);\n      } else if (type === 'vimeo' || (video_id = this.getVimeoId(src))) {\n        this.options.type = 'vimeo';\n        return this.showVimeoVideo(video_id);\n      } else if (type === 'instagram' || (video_id = this.getInstagramId(src))) {\n        this.options.type = 'instagram';\n        return this.showInstagramVideo(video_id);\n      } else if (type === 'video') {\n        this.options.type = 'video';\n        return this.showVideoIframe(video_id);\n      } else {\n        this.options.type = 'url';\n        return this.loadRemoteContent(src);\n      }\n    },\n    updateTitleAndFooter: function() {\n      var caption, footer, header, title;\n      header = this.modal_content.find('.modal-header');\n      footer = this.modal_content.find('.modal-footer');\n      title = this.$element.data('title') || \"\";\n      caption = this.$element.data('footer') || \"\";\n      if (title || this.options.always_show_close) {\n        header.css('display', '').find('.modal-title').html(title || \"&nbsp;\");\n      } else {\n        header.css('display', 'none');\n      }\n      if (caption) {\n        footer.css('display', '').html(caption);\n      } else {\n        footer.css('display', 'none');\n      }\n      return this;\n    },\n    showLoading: function() {\n      this.lightbox_body.html('<div class=\"modal-loading\">' + this.options.loadingMessage + '</div>');\n      return this;\n    },\n    showYoutubeVideo: function(id) {\n      var height, rel, width;\n      if ((this.$element.attr('data-norelated') != null) || this.options.no_related) {\n        rel = \"&rel=0\";\n      } else {\n        rel = \"\";\n      }\n      width = this.checkDimensions(this.$element.data('width') || 560);\n      height = width / (560 / 315);\n      return this.showVideoIframe('//www.youtube.com/embed/' + id + '?badge=0&autoplay=1&html5=1' + rel, width, height);\n    },\n    showVimeoVideo: function(id) {\n      var height, width;\n      width = this.checkDimensions(this.$element.data('width') || 560);\n      height = width / (500 / 281);\n      return this.showVideoIframe(id + '?autoplay=1', width, height);\n    },\n    showInstagramVideo: function(id) {\n      var height, width;\n      width = this.checkDimensions(this.$element.data('width') || 612);\n      this.resize(width);\n      height = width + 80;\n      this.lightbox_body.html('<iframe width=\"' + width + '\" height=\"' + height + '\" src=\"' + this.addTrailingSlash(id) + 'embed/\" frameborder=\"0\" allowfullscreen></iframe>');\n      this.options.onContentLoaded.call(this);\n      if (this.modal_arrows) {\n        return this.modal_arrows.css('display', 'none');\n      }\n    },\n    showVideoIframe: function(url, width, height) {\n      height = height || width;\n      this.resize(width);\n      this.lightbox_body.html('<div class=\"embed-responsive embed-responsive-16by9\"><iframe width=\"' + width + '\" height=\"' + height + '\" src=\"' + url + '\" frameborder=\"0\" allowfullscreen class=\"embed-responsive-item\"></iframe></div>');\n      this.options.onContentLoaded.call(this);\n      if (this.modal_arrows) {\n        this.modal_arrows.css('display', 'none');\n      }\n      return this;\n    },\n    loadRemoteContent: function(url) {\n      var disableExternalCheck, width;\n      width = this.$element.data('width') || 560;\n      this.resize(width);\n      disableExternalCheck = this.$element.data('disableExternalCheck') || false;\n      if (!disableExternalCheck && !this.isExternal(url)) {\n        this.lightbox_body.load(url, $.proxy((function(_this) {\n          return function() {\n            return _this.$element.trigger('loaded.bs.modal');\n          };\n        })(this)));\n      } else {\n        this.lightbox_body.html('<iframe width=\"' + width + '\" height=\"' + width + '\" src=\"' + url + '\" frameborder=\"0\" allowfullscreen></iframe>');\n        this.options.onContentLoaded.call(this);\n      }\n      if (this.modal_arrows) {\n        this.modal_arrows.css('display', 'none');\n      }\n      return this;\n    },\n    isExternal: function(url) {\n      var match;\n      match = url.match(/^([^:\\/?#]+:)?(?:\\/\\/([^\\/?#]*))?([^?#]+)?(\\?[^#]*)?(#.*)?/);\n      if (typeof match[1] === \"string\" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) {\n        return true;\n      }\n      if (typeof match[2] === \"string\" && match[2].length > 0 && match[2].replace(new RegExp(\":(\" + {\n        \"http:\": 80,\n        \"https:\": 443\n      }[location.protocol] + \")?$\"), \"\") !== location.host) {\n        return true;\n      }\n      return false;\n    },\n    error: function(message) {\n      this.lightbox_body.html(message);\n      return this;\n    },\n    preloadImage: function(src, onLoadShowImage) {\n      var img;\n      img = new Image();\n      if ((onLoadShowImage == null) || onLoadShowImage === true) {\n        img.onload = (function(_this) {\n          return function() {\n            var image;\n            image = $('<img />');\n            image.attr('src', img.src);\n            image.addClass('img-responsive');\n            _this.lightbox_body.html(image);\n            if (_this.modal_arrows) {\n              _this.modal_arrows.css('display', 'block');\n            }\n            return image.load(function() {\n              if (_this.options.scale_height) {\n                _this.scaleHeight(img.height, img.width);\n              } else {\n                _this.resize(img.width);\n              }\n              return _this.options.onContentLoaded.call(_this);\n            });\n          };\n        })(this);\n        img.onerror = (function(_this) {\n          return function() {\n            return _this.error('Failed to load image: ' + src);\n          };\n        })(this);\n      }\n      img.src = src;\n      return img;\n    },\n    scaleHeight: function(height, width) {\n      var border_padding, factor, footer_height, header_height, margins, max_height;\n      header_height = this.modal_header.outerHeight(true) || 0;\n      footer_height = this.modal_footer.outerHeight(true) || 0;\n      if (!this.modal_footer.is(':visible')) {\n        footer_height = 0;\n      }\n      if (!this.modal_header.is(':visible')) {\n        header_height = 0;\n      }\n      border_padding = this.border.top + this.border.bottom + this.padding.top + this.padding.bottom;\n      margins = parseFloat(this.modal_dialog.css('margin-top')) + parseFloat(this.modal_dialog.css('margin-bottom'));\n      max_height = $(window).height() - border_padding - margins - header_height - footer_height;\n      factor = Math.min(max_height / height, 1);\n      this.modal_dialog.css('height', 'auto').css('max-height', max_height);\n      return this.resize(factor * width);\n    },\n    resize: function(width) {\n      var width_total;\n      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;\n      this.modal_dialog.css('width', 'auto').css('max-width', width_total);\n      this.lightbox_container.find('a').css('line-height', function() {\n        return $(this).parent().height() + 'px';\n      });\n      return this;\n    },\n    checkDimensions: function(width) {\n      var body_width, width_total;\n      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;\n      body_width = document.body.clientWidth;\n      if (width_total > body_width) {\n        width = this.modal_body.width();\n      }\n      return width;\n    },\n    close: function() {\n      return this.modal.modal('hide');\n    },\n    addTrailingSlash: function(url) {\n      if (url.substr(-1) !== '/') {\n        url += '/';\n      }\n      return url;\n    }\n  };\n\n  $.fn.ekkoLightbox = function(options) {\n    return this.each(function() {\n      var $this;\n      $this = $(this);\n      options = $.extend({\n        remote: $this.attr('data-remote') || $this.attr('href'),\n        gallery_parent_selector: $this.attr('data-parent'),\n        type: $this.attr('data-type')\n      }, options, $this.data());\n      new EkkoLightbox(this, options);\n      return this;\n    });\n  };\n\n  $.fn.ekkoLightbox.defaults = {\n    gallery_parent_selector: 'document.body',\n    left_arrow_class: '.glyphicon .glyphicon-chevron-left',\n    right_arrow_class: '.glyphicon .glyphicon-chevron-right',\n    directional_arrows: true,\n    type: null,\n    always_show_close: true,\n    no_related: false,\n    scale_height: true,\n    loadingMessage: 'Loading...',\n    onShow: function() {},\n    onShown: function() {},\n    onHide: function() {},\n    onHidden: function() {},\n    onNavigate: function() {},\n    onContentLoaded: function() {}\n  };\n\n}).call(this);\n","/**\n * Module containing core application logic.\n * @param  {jQuery} $        Insulated jQuery object\n * @param  {JSON} settings Insulated `window.snipeit.settings` object.\n * @return {IIFE}          Immediately invoked. Returns self.\n */\n\n\nvar pieOptions = {\n    //Boolean - Whether we should show a stroke on each segment\n    segmentShowStroke: true,\n    //String - The colour of each segment stroke\n    segmentStrokeColor: \"#fff\",\n    //Number - The width of each segment stroke\n    segmentStrokeWidth: 1,\n    //Number - The percentage of the chart that we cut out of the middle\n    percentageInnerCutout: 50, // This is 0 for Pie charts\n    //Number - Amount of animation steps\n    animationSteps: 100,\n    //String - Animation easing effect\n    animationEasing: \"easeOutBounce\",\n    //Boolean - Whether we animate the rotation of the Doughnut\n    animateRotate: true,\n    //Boolean - Whether we animate scaling the Doughnut from the centre\n    animateScale: false,\n    //Boolean - whether to make the chart responsive to window resizing\n    responsive: true,\n    // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container\n    maintainAspectRatio: false,\n\n    //String - A legend template\n    legendTemplate: \"<ul class=\\\"<%=name.toLowerCase()%>-legend\\\"><% for (var i=0; i<segments.length; i++){%><li>\" +\n    \"<i class='fa fa-circle-o' style='color: <%=segments[i].fillColor%>'></i>\" +\n    \"<%if(segments[i].label){%><%=segments[i].label%><%}%> foo</li><%}%></ul>\",\n    //String - A tooltip template\n    tooltipTemplate: \"<%=value %> <%=label%> \"\n};\n//console.dir(pieOptions);\n//Create pie or douhnut chart\n// You can switch between pie and douhnut using the method below.\n//pieChart.Doughnut(PieData, pieOptions);\n//-----------------\n//- END PIE CHART -\n//-----------------\n\n\n\n(function($, settings) {\n    var Components = {};\n    Components.modals = {};\n\n    // confirm delete modal\n    Components.modals.confirmDelete = function() {\n        var $el = $('table');\n\n        var events = {\n            'click': function(evnt) {\n                var $context = $(this);\n                var $dataConfirmModal = $('#dataConfirmModal');\n                var href = $context.attr('href');\n                var message = $context.attr('data-content');\n                var title = $context.attr('data-title');\n\n                $('#myModalLabel').text(title);\n                $dataConfirmModal.find('.modal-body').text(message);\n                $('#dataConfirmOK').attr('href', href);\n                $dataConfirmModal.modal({\n                    show: true\n                });\n                return false;\n            }\n        };\n\n        var render = function() {\n            $el.on('click', '.delete-asset', events['click']);\n        };\n\n        return {\n            render: render\n        };\n    };\n\n\n    /**\n     * Application start point\n     * Component definition stays out of load event, execution only happens.\n     */\n    $(function() {\n        new Components.modals.confirmDelete().render();\n    });\n}(jQuery, window.snipeit.settings));\n\n\n\n","/*! AdminLTE app.js\n * ================\n * Main JS application file for AdminLTE v2. This file\n * should be included in all pages. It controls some layout\n * options and implements exclusive AdminLTE plugins.\n *\n * @Author  Almsaeed Studio\n * @Support <http://www.almsaeedstudio.com>\n * @Email   <support@almsaeedstudio.com>\n * @version 2.3.0\n * @license MIT <http://opensource.org/licenses/MIT>\n */\n\n//Make sure jQuery has been loaded before app.js\nif (typeof jQuery === \"undefined\") {\n  throw new Error(\"AdminLTE requires jQuery\");\n}\n\n\n/* AdminLTE\n *\n * @type Object\n * @description $.AdminLTE is the main object for the template's app.\n *              It's used for implementing functions and options related\n *              to the template. Keeping everything wrapped in an object\n *              prevents conflict with other plugins and is a better\n *              way to organize our code.\n */\n$.AdminLTE = {};\n\n/* --------------------\n * - AdminLTE Options -\n * --------------------\n * Modify these options to suit your implementation\n */\n$.AdminLTE.options = {\n  //Add slimscroll to navbar menus\n  //This requires you to load the slimscroll plugin\n  //in every page before app.js\n  navbarMenuSlimscroll: true,\n  navbarMenuSlimscrollWidth: \"3px\", //The width of the scroll bar\n  navbarMenuHeight: \"200px\", //The height of the inner menu\n  //General animation speed for JS animated elements such as box collapse/expand and\n  //sidebar treeview slide up/down. This options accepts an integer as milliseconds,\n  //'fast', 'normal', or 'slow'\n  animationSpeed: 500,\n  //Sidebar push menu toggle button selector\n  sidebarToggleSelector: \"[data-toggle='offcanvas']\",\n  //Activate sidebar push menu\n  sidebarPushMenu: true,\n  //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)\n  sidebarSlimScroll: true,\n  //Enable sidebar expand on hover effect for sidebar mini\n  //This option is forced to true if both the fixed layout and sidebar mini\n  //are used together\n  sidebarExpandOnHover: false,\n  //BoxRefresh Plugin\n  enableBoxRefresh: true,\n  //Bootstrap.js tooltip\n  enableBSToppltip: true,\n  BSTooltipSelector: \"[data-toggle='tooltip']\",\n  //Enable Fast Click. Fastclick.js creates a more\n  //native touch experience with touch devices. If you\n  //choose to enable the plugin, make sure you load the script\n  //before AdminLTE's app.js\n  enableFastclick: true,\n  //Control Sidebar Options\n  enableControlSidebar: true,\n  controlSidebarOptions: {\n    //Which button should trigger the open/close event\n    toggleBtnSelector: \"[data-toggle='control-sidebar']\",\n    //The sidebar selector\n    selector: \".control-sidebar\",\n    //Enable slide over content\n    slide: true\n  },\n  //Box Widget Plugin. Enable this plugin\n  //to allow boxes to be collapsed and/or removed\n  enableBoxWidget: true,\n  //Box Widget plugin options\n  boxWidgetOptions: {\n    boxWidgetIcons: {\n      //Collapse icon\n      collapse: 'fa-minus',\n      //Open icon\n      open: 'fa-plus',\n      //Remove icon\n      remove: 'fa-times'\n    },\n    boxWidgetSelectors: {\n      //Remove button selector\n      remove: '[data-widget=\"remove\"]',\n      //Collapse button selector\n      collapse: '[data-widget=\"collapse\"]'\n    }\n  },\n  //Direct Chat plugin options\n  directChat: {\n    //Enable direct chat by default\n    enable: true,\n    //The button to open and close the chat contacts pane\n    contactToggleSelector: '[data-widget=\"chat-pane-toggle\"]'\n  },\n  //Define the set of colors to use globally around the website\n  colors: {\n    lightBlue: \"#3c8dbc\",\n    red: \"#f56954\",\n    green: \"#00a65a\",\n    aqua: \"#00c0ef\",\n    yellow: \"#f39c12\",\n    blue: \"#0073b7\",\n    navy: \"#001F3F\",\n    teal: \"#39CCCC\",\n    olive: \"#3D9970\",\n    lime: \"#01FF70\",\n    orange: \"#FF851B\",\n    fuchsia: \"#F012BE\",\n    purple: \"#8E24AA\",\n    maroon: \"#D81B60\",\n    black: \"#222222\",\n    gray: \"#d2d6de\"\n  },\n  //The standard screen sizes that bootstrap uses.\n  //If you change these in the variables.less file, change\n  //them here too.\n  screenSizes: {\n    xs: 480,\n    sm: 768,\n    md: 992,\n    lg: 1200\n  }\n};\n\n/* ------------------\n * - Implementation -\n * ------------------\n * The next block of code implements AdminLTE's\n * functions and plugins as specified by the\n * options above.\n */\n$(function () {\n  \"use strict\";\n\n  //Fix for IE page transitions\n  $(\"body\").removeClass(\"hold-transition\");\n\n  //Extend options if external options exist\n  if (typeof AdminLTEOptions !== \"undefined\") {\n    $.extend(true,\n            $.AdminLTE.options,\n            AdminLTEOptions);\n  }\n\n  //Easy access to options\n  var o = $.AdminLTE.options;\n\n  //Set up the object\n  _init();\n\n  //Activate the layout maker\n  $.AdminLTE.layout.activate();\n\n  //Enable sidebar tree view controls\n  $.AdminLTE.tree('.sidebar');\n\n  //Enable control sidebar\n  if (o.enableControlSidebar) {\n    $.AdminLTE.controlSidebar.activate();\n  }\n\n  //Add slimscroll to navbar dropdown\n  if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {\n    $(\".navbar .menu\").slimscroll({\n      height: o.navbarMenuHeight,\n      alwaysVisible: false,\n      size: o.navbarMenuSlimscrollWidth\n    }).css(\"width\", \"100%\");\n  }\n\n  //Activate sidebar push menu\n  if (o.sidebarPushMenu) {\n    $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);\n  }\n\n  //Activate Bootstrap tooltip\n  if (o.enableBSToppltip) {\n    $('body').tooltip({\n      selector: o.BSTooltipSelector\n    });\n  }\n\n  //Activate box widget\n  if (o.enableBoxWidget) {\n    $.AdminLTE.boxWidget.activate();\n  }\n\n  //Activate fast click\n  if (o.enableFastclick && typeof FastClick != 'undefined') {\n    FastClick.attach(document.body);\n  }\n\n  //Activate direct chat widget\n  if (o.directChat.enable) {\n    $(document).on('click', o.directChat.contactToggleSelector, function () {\n      var box = $(this).parents('.direct-chat').first();\n      box.toggleClass('direct-chat-contacts-open');\n    });\n  }\n\n  /*\n   * INITIALIZE BUTTON TOGGLE\n   * ------------------------\n   */\n  $('.btn-group[data-toggle=\"btn-toggle\"]').each(function () {\n    var group = $(this);\n    $(this).find(\".btn\").on('click', function (e) {\n      group.find(\".btn.active\").removeClass(\"active\");\n      $(this).addClass(\"active\");\n      e.preventDefault();\n    });\n\n  });\n});\n\n/* ----------------------------------\n * - Initialize the AdminLTE Object -\n * ----------------------------------\n * All AdminLTE functions are implemented below.\n */\nfunction _init() {\n  'use strict';\n  /* Layout\n   * ======\n   * Fixes the layout height in case min-height fails.\n   *\n   * @type Object\n   * @usage $.AdminLTE.layout.activate()\n   *        $.AdminLTE.layout.fix()\n   *        $.AdminLTE.layout.fixSidebar()\n   */\n  $.AdminLTE.layout = {\n    activate: function () {\n      var _this = this;\n      _this.fix();\n      _this.fixSidebar();\n      $(window, \".wrapper\").resize(function () {\n        _this.fix();\n        _this.fixSidebar();\n      });\n    },\n    fix: function () {\n      //Get window height and the wrapper height\n      var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();\n      var window_height = $(window).height();\n      var sidebar_height = $(\".sidebar\").height();\n      //Set the min-height of the content and sidebar based on the\n      //the height of the document.\n      if ($(\"body\").hasClass(\"fixed\")) {\n        $(\".content-wrapper, .right-side\").css('min-height', window_height - $('.main-footer').outerHeight());\n      } else {\n        var postSetWidth;\n        if (window_height >= sidebar_height) {\n          $(\".content-wrapper, .right-side\").css('min-height', window_height - neg);\n          postSetWidth = window_height - neg;\n        } else {\n          $(\".content-wrapper, .right-side\").css('min-height', sidebar_height);\n          postSetWidth = sidebar_height;\n        }\n\n        //Fix for the control sidebar height\n        var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);\n        if (typeof controlSidebar !== \"undefined\") {\n          if (controlSidebar.height() > postSetWidth)\n            $(\".content-wrapper, .right-side\").css('min-height', controlSidebar.height());\n        }\n\n      }\n    },\n    fixSidebar: function () {\n      //Make sure the body tag has the .fixed class\n      if (!$(\"body\").hasClass(\"fixed\")) {\n        if (typeof $.fn.slimScroll != 'undefined') {\n          $(\".sidebar\").slimScroll({destroy: true}).height(\"auto\");\n        }\n        return;\n      } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {\n        window.console.error(\"Error: the fixed layout requires the slimscroll plugin!\");\n      }\n      //Enable slimscroll for fixed layout\n      if ($.AdminLTE.options.sidebarSlimScroll) {\n        if (typeof $.fn.slimScroll != 'undefined') {\n          //Destroy if it exists\n          $(\".sidebar\").slimScroll({destroy: true}).height(\"auto\");\n          //Add slimscroll\n          $(\".sidebar\").slimscroll({\n            height: ($(window).height() - $(\".main-header\").height()) + \"px\",\n            color: \"rgba(0,0,0,0.2)\",\n            size: \"3px\"\n          });\n        }\n      }\n    }\n  };\n\n  /* PushMenu()\n   * ==========\n   * Adds the push menu functionality to the sidebar.\n   *\n   * @type Function\n   * @usage: $.AdminLTE.pushMenu(\"[data-toggle='offcanvas']\")\n   */\n  $.AdminLTE.pushMenu = {\n    activate: function (toggleBtn) {\n      //Get the screen sizes\n      var screenSizes = $.AdminLTE.options.screenSizes;\n\n      //Enable sidebar toggle\n      $(toggleBtn).on('click', function (e) {\n        e.preventDefault();\n\n        //Enable sidebar push menu\n        if ($(window).width() > (screenSizes.sm - 1)) {\n          if ($(\"body\").hasClass('sidebar-collapse')) {\n            $(\"body\").removeClass('sidebar-collapse').trigger('expanded.pushMenu');\n          } else {\n            $(\"body\").addClass('sidebar-collapse').trigger('collapsed.pushMenu');\n          }\n        }\n        //Handle sidebar push menu for small screens\n        else {\n          if ($(\"body\").hasClass('sidebar-open')) {\n            $(\"body\").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');\n          } else {\n            $(\"body\").addClass('sidebar-open').trigger('expanded.pushMenu');\n          }\n        }\n      });\n\n      $(\".content-wrapper\").click(function () {\n        //Enable hide menu when clicking on the content-wrapper on small screens\n        if ($(window).width() <= (screenSizes.sm - 1) && $(\"body\").hasClass(\"sidebar-open\")) {\n          $(\"body\").removeClass('sidebar-open');\n        }\n      });\n\n      //Enable expand on hover for sidebar mini\n      if ($.AdminLTE.options.sidebarExpandOnHover\n              || ($('body').hasClass('fixed')\n                      && $('body').hasClass('sidebar-mini'))) {\n        this.expandOnHover();\n      }\n    },\n    expandOnHover: function () {\n      var _this = this;\n      var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;\n      //Expand sidebar on hover\n      $('.main-sidebar').hover(function () {\n        if ($('body').hasClass('sidebar-mini')\n                && $(\"body\").hasClass('sidebar-collapse')\n                && $(window).width() > screenWidth) {\n          _this.expand();\n        }\n      }, function () {\n        if ($('body').hasClass('sidebar-mini')\n                && $('body').hasClass('sidebar-expanded-on-hover')\n                && $(window).width() > screenWidth) {\n          _this.collapse();\n        }\n      });\n    },\n    expand: function () {\n      $(\"body\").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');\n    },\n    collapse: function () {\n      if ($('body').hasClass('sidebar-expanded-on-hover')) {\n        $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');\n      }\n    }\n  };\n\n  /* Tree()\n   * ======\n   * Converts the sidebar into a multilevel\n   * tree view menu.\n   *\n   * @type Function\n   * @Usage: $.AdminLTE.tree('.sidebar')\n   */\n  $.AdminLTE.tree = function (menu) {\n    var _this = this;\n    var animationSpeed = $.AdminLTE.options.animationSpeed;\n    $(document).on('click', menu + ' li a', function (e) {\n      //Get the clicked link and the next element\n      var $this = $(this);\n      var checkElement = $this.next();\n\n      //Check if the next element is a menu and is visible\n      if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {\n        //Close the menu\n        checkElement.slideUp(animationSpeed, function () {\n          checkElement.removeClass('menu-open');\n          //Fix the layout in case the sidebar stretches over the height of the window\n          //_this.layout.fix();\n        });\n        checkElement.parent(\"li\").removeClass(\"active\");\n      }\n      //If the menu is not visible\n      else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {\n        //Get the parent menu\n        var parent = $this.parents('ul').first();\n        //Close all open menus within the parent\n        var ul = parent.find('ul:visible').slideUp(animationSpeed);\n        //Remove the menu-open class from the parent\n        ul.removeClass('menu-open');\n        //Get the parent li\n        var parent_li = $this.parent(\"li\");\n\n        //Open the target menu and add the menu-open class\n        checkElement.slideDown(animationSpeed, function () {\n          //Add the class active to the parent li\n          checkElement.addClass('menu-open');\n          parent.find('li.active').removeClass('active');\n          parent_li.addClass('active');\n          //Fix the layout in case the sidebar stretches over the height of the window\n          _this.layout.fix();\n        });\n      }\n      //if this isn't a link, prevent the page from being redirected\n      if (checkElement.is('.treeview-menu')) {\n        e.preventDefault();\n      }\n    });\n  };\n\n  /* ControlSidebar\n   * ==============\n   * Adds functionality to the right sidebar\n   *\n   * @type Object\n   * @usage $.AdminLTE.controlSidebar.activate(options)\n   */\n  $.AdminLTE.controlSidebar = {\n    //instantiate the object\n    activate: function () {\n      //Get the object\n      var _this = this;\n      //Update options\n      var o = $.AdminLTE.options.controlSidebarOptions;\n      //Get the sidebar\n      var sidebar = $(o.selector);\n      //The toggle button\n      var btn = $(o.toggleBtnSelector);\n\n      //Listen to the click event\n      btn.on('click', function (e) {\n        e.preventDefault();\n        //If the sidebar is not open\n        if (!sidebar.hasClass('control-sidebar-open')\n                && !$('body').hasClass('control-sidebar-open')) {\n          //Open the sidebar\n          _this.open(sidebar, o.slide);\n        } else {\n          _this.close(sidebar, o.slide);\n        }\n      });\n\n      //If the body has a boxed layout, fix the sidebar bg position\n      var bg = $(\".control-sidebar-bg\");\n      _this._fix(bg);\n\n      //If the body has a fixed layout, make the control sidebar fixed\n      if ($('body').hasClass('fixed')) {\n        _this._fixForFixed(sidebar);\n      } else {\n        //If the content height is less than the sidebar's height, force max height\n        if ($('.content-wrapper, .right-side').height() < sidebar.height()) {\n          _this._fixForContent(sidebar);\n        }\n      }\n    },\n    //Open the control sidebar\n    open: function (sidebar, slide) {\n      //Slide over content\n      if (slide) {\n        sidebar.addClass('control-sidebar-open');\n      } else {\n        //Push the content by adding the open class to the body instead\n        //of the sidebar itself\n        $('body').addClass('control-sidebar-open');\n      }\n    },\n    //Close the control sidebar\n    close: function (sidebar, slide) {\n      if (slide) {\n        sidebar.removeClass('control-sidebar-open');\n      } else {\n        $('body').removeClass('control-sidebar-open');\n      }\n    },\n    _fix: function (sidebar) {\n      var _this = this;\n      if ($(\"body\").hasClass('layout-boxed')) {\n        sidebar.css('position', 'absolute');\n        sidebar.height($(\".wrapper\").height());\n        $(window).resize(function () {\n          _this._fix(sidebar);\n        });\n      } else {\n        sidebar.css({\n          'position': 'fixed',\n          'height': 'auto'\n        });\n      }\n    },\n    _fixForFixed: function (sidebar) {\n      sidebar.css({\n        'position': 'fixed',\n        'max-height': '100%',\n        'overflow': 'auto',\n        'padding-bottom': '50px'\n      });\n    },\n    _fixForContent: function (sidebar) {\n      $(\".content-wrapper, .right-side\").css('min-height', sidebar.height());\n    }\n  };\n\n  /* BoxWidget\n   * =========\n   * BoxWidget is a plugin to handle collapsing and\n   * removing boxes from the screen.\n   *\n   * @type Object\n   * @usage $.AdminLTE.boxWidget.activate()\n   *        Set all your options in the main $.AdminLTE.options object\n   */\n  $.AdminLTE.boxWidget = {\n    selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,\n    icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,\n    animationSpeed: $.AdminLTE.options.animationSpeed,\n    activate: function (_box) {\n      var _this = this;\n      if (!_box) {\n        _box = document; // activate all boxes per default\n      }\n      //Listen for collapse event triggers\n      $(_box).on('click', _this.selectors.collapse, function (e) {\n        e.preventDefault();\n        _this.collapse($(this));\n      });\n\n      //Listen for remove event triggers\n      $(_box).on('click', _this.selectors.remove, function (e) {\n        e.preventDefault();\n        _this.remove($(this));\n      });\n    },\n    collapse: function (element) {\n      var _this = this;\n      //Find the box parent\n      var box = element.parents(\".box\").first();\n      //Find the body and the footer\n      var box_content = box.find(\"> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer\");\n      if (!box.hasClass(\"collapsed-box\")) {\n        //Convert minus into plus\n        element.children(\":first\")\n                .removeClass(_this.icons.collapse)\n                .addClass(_this.icons.open);\n        //Hide the content\n        box_content.slideUp(_this.animationSpeed, function () {\n          box.addClass(\"collapsed-box\");\n        });\n      } else {\n        //Convert plus into minus\n        element.children(\":first\")\n                .removeClass(_this.icons.open)\n                .addClass(_this.icons.collapse);\n        //Show the content\n        box_content.slideDown(_this.animationSpeed, function () {\n          box.removeClass(\"collapsed-box\");\n        });\n      }\n    },\n    remove: function (element) {\n      //Find the box parent\n      var box = element.parents(\".box\").first();\n      box.slideUp(this.animationSpeed);\n    }\n  };\n}\n\n/* ------------------\n * - Custom Plugins -\n * ------------------\n * All custom plugins are defined below.\n */\n\n/*\n * BOX REFRESH BUTTON\n * ------------------\n * This is a custom plugin to use with the component BOX. It allows you to add\n * a refresh button to the box. It converts the box's state to a loading state.\n *\n * @type plugin\n * @usage $(\"#box-widget\").boxRefresh( options );\n */\n(function ($) {\n\n  \"use strict\";\n\n  $.fn.boxRefresh = function (options) {\n\n    // Render options\n    var settings = $.extend({\n      //Refresh button selector\n      trigger: \".refresh-btn\",\n      //File source to be loaded (e.g: ajax/src.php)\n      source: \"\",\n      //Callbacks\n      onLoadStart: function (box) {\n        return box;\n      }, //Right after the button has been clicked\n      onLoadDone: function (box) {\n        return box;\n      } //When the source has been loaded\n\n    }, options);\n\n    //The overlay\n    var overlay = $('<div class=\"overlay\"><div class=\"fa fa-refresh fa-spin\"></div></div>');\n\n    return this.each(function () {\n      //if a source is specified\n      if (settings.source === \"\") {\n        if (window.console) {\n          window.console.log(\"Please specify a source first - boxRefresh()\");\n        }\n        return;\n      }\n      //the box\n      var box = $(this);\n      //the button\n      var rBtn = box.find(settings.trigger).first();\n\n      //On trigger click\n      rBtn.on('click', function (e) {\n        e.preventDefault();\n        //Add loading overlay\n        start(box);\n\n        //Perform ajax call\n        box.find(\".box-body\").load(settings.source, function () {\n          done(box);\n        });\n      });\n    });\n\n    function start(box) {\n      //Add overlay and loading img\n      box.append(overlay);\n\n      settings.onLoadStart.call(box);\n    }\n\n    function done(box) {\n      //Remove overlay and loading img\n      box.find(overlay).remove();\n\n      settings.onLoadDone.call(box);\n    }\n\n  };\n\n})(jQuery);\n\n/*\n * EXPLICIT BOX ACTIVATION\n * -----------------------\n * This is a custom plugin to use with the component BOX. It allows you to activate\n * a box inserted in the DOM after the app.js was loaded.\n *\n * @type plugin\n * @usage $(\"#box-widget\").activateBox();\n */\n(function ($) {\n\n  'use strict';\n\n  $.fn.activateBox = function () {\n    $.AdminLTE.boxWidget.activate(this);\n  };\n\n})(jQuery);\n\n/*\n * TODO LIST CUSTOM PLUGIN\n * -----------------------\n * This plugin depends on iCheck plugin for checkbox and radio inputs\n *\n * @type plugin\n * @usage $(\"#todo-widget\").todolist( options );\n */\n(function ($) {\n\n  'use strict';\n\n  $.fn.todolist = function (options) {\n    // Render options\n    var settings = $.extend({\n      //When the user checks the input\n      onCheck: function (ele) {\n        return ele;\n      },\n      //When the user unchecks the input\n      onUncheck: function (ele) {\n        return ele;\n      }\n    }, options);\n\n    return this.each(function () {\n\n      if (typeof $.fn.iCheck != 'undefined') {\n        $('input', this).on('ifChecked', function () {\n          var ele = $(this).parents(\"li\").first();\n          ele.toggleClass(\"done\");\n          settings.onCheck.call(ele);\n        });\n\n        $('input', this).on('ifUnchecked', function () {\n          var ele = $(this).parents(\"li\").first();\n          ele.toggleClass(\"done\");\n          settings.onUncheck.call(ele);\n        });\n      } else {\n        $('input', this).on('change', function () {\n          var ele = $(this).parents(\"li\").first();\n          ele.toggleClass(\"done\");\n          if ($('input', ele).is(\":checked\")) {\n            settings.onCheck.call(ele);\n          } else {\n            settings.onUncheck.call(ele);\n          }\n        });\n      }\n    });\n  };\n}(jQuery));\n\n//-------------\n//- PIE CHART -\n//-------------\n// Get context with jQuery - using jQuery's .get() method.\n\n\n\n"],"sourceRoot":"/source/"}
        \ No newline at end of file
        diff --git a/public/assets/js/app.js b/public/assets/js/app.js
        deleted file mode 100755
        index 561d44830b..0000000000
        --- a/public/assets/js/app.js
        +++ /dev/null
        @@ -1,746 +0,0 @@
        -/*! AdminLTE app.js
        - * ================
        - * Main JS application file for AdminLTE v2. This file
        - * should be included in all pages. It controls some layout
        - * options and implements exclusive AdminLTE plugins.
        - *
        - * @Author  Almsaeed Studio
        - * @Support <http://www.almsaeedstudio.com>
        - * @Email   <support@almsaeedstudio.com>
        - * @version 2.3.0
        - * @license MIT <http://opensource.org/licenses/MIT>
        - */
        -
        -//Make sure jQuery has been loaded before app.js
        -if (typeof jQuery === "undefined") {
        -  throw new Error("AdminLTE requires jQuery");
        -}
        -
        -/* AdminLTE
        - *
        - * @type Object
        - * @description $.AdminLTE is the main object for the template's app.
        - *              It's used for implementing functions and options related
        - *              to the template. Keeping everything wrapped in an object
        - *              prevents conflict with other plugins and is a better
        - *              way to organize our code.
        - */
        -$.AdminLTE = {};
        -
        -/* --------------------
        - * - AdminLTE Options -
        - * --------------------
        - * Modify these options to suit your implementation
        - */
        -$.AdminLTE.options = {
        -  //Add slimscroll to navbar menus
        -  //This requires you to load the slimscroll plugin
        -  //in every page before app.js
        -  navbarMenuSlimscroll: true,
        -  navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar
        -  navbarMenuHeight: "200px", //The height of the inner menu
        -  //General animation speed for JS animated elements such as box collapse/expand and
        -  //sidebar treeview slide up/down. This options accepts an integer as milliseconds,
        -  //'fast', 'normal', or 'slow'
        -  animationSpeed: 500,
        -  //Sidebar push menu toggle button selector
        -  sidebarToggleSelector: "[data-toggle='offcanvas']",
        -  //Activate sidebar push menu
        -  sidebarPushMenu: true,
        -  //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
        -  sidebarSlimScroll: true,
        -  //Enable sidebar expand on hover effect for sidebar mini
        -  //This option is forced to true if both the fixed layout and sidebar mini
        -  //are used together
        -  sidebarExpandOnHover: false,
        -  //BoxRefresh Plugin
        -  enableBoxRefresh: true,
        -  //Bootstrap.js tooltip
        -  enableBSToppltip: true,
        -  BSTooltipSelector: "[data-toggle='tooltip']",
        -  //Enable Fast Click. Fastclick.js creates a more
        -  //native touch experience with touch devices. If you
        -  //choose to enable the plugin, make sure you load the script
        -  //before AdminLTE's app.js
        -  enableFastclick: true,
        -  //Control Sidebar Options
        -  enableControlSidebar: true,
        -  controlSidebarOptions: {
        -    //Which button should trigger the open/close event
        -    toggleBtnSelector: "[data-toggle='control-sidebar']",
        -    //The sidebar selector
        -    selector: ".control-sidebar",
        -    //Enable slide over content
        -    slide: true
        -  },
        -  //Box Widget Plugin. Enable this plugin
        -  //to allow boxes to be collapsed and/or removed
        -  enableBoxWidget: true,
        -  //Box Widget plugin options
        -  boxWidgetOptions: {
        -    boxWidgetIcons: {
        -      //Collapse icon
        -      collapse: 'fa-minus',
        -      //Open icon
        -      open: 'fa-plus',
        -      //Remove icon
        -      remove: 'fa-times'
        -    },
        -    boxWidgetSelectors: {
        -      //Remove button selector
        -      remove: '[data-widget="remove"]',
        -      //Collapse button selector
        -      collapse: '[data-widget="collapse"]'
        -    }
        -  },
        -  //Direct Chat plugin options
        -  directChat: {
        -    //Enable direct chat by default
        -    enable: true,
        -    //The button to open and close the chat contacts pane
        -    contactToggleSelector: '[data-widget="chat-pane-toggle"]'
        -  },
        -  //Define the set of colors to use globally around the website
        -  colors: {
        -    lightBlue: "#3c8dbc",
        -    red: "#f56954",
        -    green: "#00a65a",
        -    aqua: "#00c0ef",
        -    yellow: "#f39c12",
        -    blue: "#0073b7",
        -    navy: "#001F3F",
        -    teal: "#39CCCC",
        -    olive: "#3D9970",
        -    lime: "#01FF70",
        -    orange: "#FF851B",
        -    fuchsia: "#F012BE",
        -    purple: "#8E24AA",
        -    maroon: "#D81B60",
        -    black: "#222222",
        -    gray: "#d2d6de"
        -  },
        -  //The standard screen sizes that bootstrap uses.
        -  //If you change these in the variables.less file, change
        -  //them here too.
        -  screenSizes: {
        -    xs: 480,
        -    sm: 768,
        -    md: 992,
        -    lg: 1200
        -  }
        -};
        -
        -/* ------------------
        - * - Implementation -
        - * ------------------
        - * The next block of code implements AdminLTE's
        - * functions and plugins as specified by the
        - * options above.
        - */
        -$(function () {
        -  "use strict";
        -
        -  //Fix for IE page transitions
        -  $("body").removeClass("hold-transition");
        -
        -  //Extend options if external options exist
        -  if (typeof AdminLTEOptions !== "undefined") {
        -    $.extend(true,
        -            $.AdminLTE.options,
        -            AdminLTEOptions);
        -  }
        -
        -  //Easy access to options
        -  var o = $.AdminLTE.options;
        -
        -  //Set up the object
        -  _init();
        -
        -  //Activate the layout maker
        -  $.AdminLTE.layout.activate();
        -
        -  //Enable sidebar tree view controls
        -  $.AdminLTE.tree('.sidebar');
        -
        -  //Enable control sidebar
        -  if (o.enableControlSidebar) {
        -    $.AdminLTE.controlSidebar.activate();
        -  }
        -
        -  //Add slimscroll to navbar dropdown
        -  if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
        -    $(".navbar .menu").slimscroll({
        -      height: o.navbarMenuHeight,
        -      alwaysVisible: false,
        -      size: o.navbarMenuSlimscrollWidth
        -    }).css("width", "100%");
        -  }
        -
        -  //Activate sidebar push menu
        -  if (o.sidebarPushMenu) {
        -    $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
        -  }
        -
        -  //Activate Bootstrap tooltip
        -  if (o.enableBSToppltip) {
        -    $('body').tooltip({
        -      selector: o.BSTooltipSelector
        -    });
        -  }
        -
        -  //Activate box widget
        -  if (o.enableBoxWidget) {
        -    $.AdminLTE.boxWidget.activate();
        -  }
        -
        -  //Activate fast click
        -  if (o.enableFastclick && typeof FastClick != 'undefined') {
        -    FastClick.attach(document.body);
        -  }
        -
        -  //Activate direct chat widget
        -  if (o.directChat.enable) {
        -    $(document).on('click', o.directChat.contactToggleSelector, function () {
        -      var box = $(this).parents('.direct-chat').first();
        -      box.toggleClass('direct-chat-contacts-open');
        -    });
        -  }
        -
        -  /*
        -   * INITIALIZE BUTTON TOGGLE
        -   * ------------------------
        -   */
        -  $('.btn-group[data-toggle="btn-toggle"]').each(function () {
        -    var group = $(this);
        -    $(this).find(".btn").on('click', function (e) {
        -      group.find(".btn.active").removeClass("active");
        -      $(this).addClass("active");
        -      e.preventDefault();
        -    });
        -
        -  });
        -});
        -
        -/* ----------------------------------
        - * - Initialize the AdminLTE Object -
        - * ----------------------------------
        - * All AdminLTE functions are implemented below.
        - */
        -function _init() {
        -  'use strict';
        -  /* Layout
        -   * ======
        -   * Fixes the layout height in case min-height fails.
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.layout.activate()
        -   *        $.AdminLTE.layout.fix()
        -   *        $.AdminLTE.layout.fixSidebar()
        -   */
        -  $.AdminLTE.layout = {
        -    activate: function () {
        -      var _this = this;
        -      _this.fix();
        -      _this.fixSidebar();
        -      $(window, ".wrapper").resize(function () {
        -        _this.fix();
        -        _this.fixSidebar();
        -      });
        -    },
        -    fix: function () {
        -      //Get window height and the wrapper height
        -      var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();
        -      var window_height = $(window).height();
        -      var sidebar_height = $(".sidebar").height();
        -      //Set the min-height of the content and sidebar based on the
        -      //the height of the document.
        -      if ($("body").hasClass("fixed")) {
        -        $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight());
        -      } else {
        -        var postSetWidth;
        -        if (window_height >= sidebar_height) {
        -          $(".content-wrapper, .right-side").css('min-height', window_height - neg);
        -          postSetWidth = window_height - neg;
        -        } else {
        -          $(".content-wrapper, .right-side").css('min-height', sidebar_height);
        -          postSetWidth = sidebar_height;
        -        }
        -
        -        //Fix for the control sidebar height
        -        var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
        -        if (typeof controlSidebar !== "undefined") {
        -          if (controlSidebar.height() > postSetWidth)
        -            $(".content-wrapper, .right-side").css('min-height', controlSidebar.height());
        -        }
        -
        -      }
        -    },
        -    fixSidebar: function () {
        -      //Make sure the body tag has the .fixed class
        -      if (!$("body").hasClass("fixed")) {
        -        if (typeof $.fn.slimScroll != 'undefined') {
        -          $(".sidebar").slimScroll({destroy: true}).height("auto");
        -        }
        -        return;
        -      } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
        -        window.console.error("Error: the fixed layout requires the slimscroll plugin!");
        -      }
        -      //Enable slimscroll for fixed layout
        -      if ($.AdminLTE.options.sidebarSlimScroll) {
        -        if (typeof $.fn.slimScroll != 'undefined') {
        -          //Destroy if it exists
        -          $(".sidebar").slimScroll({destroy: true}).height("auto");
        -          //Add slimscroll
        -          $(".sidebar").slimscroll({
        -            height: ($(window).height() - $(".main-header").height()) + "px",
        -            color: "rgba(0,0,0,0.2)",
        -            size: "3px"
        -          });
        -        }
        -      }
        -    }
        -  };
        -
        -  /* PushMenu()
        -   * ==========
        -   * Adds the push menu functionality to the sidebar.
        -   *
        -   * @type Function
        -   * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
        -   */
        -  $.AdminLTE.pushMenu = {
        -    activate: function (toggleBtn) {
        -      //Get the screen sizes
        -      var screenSizes = $.AdminLTE.options.screenSizes;
        -
        -      //Enable sidebar toggle
        -      $(toggleBtn).on('click', function (e) {
        -        e.preventDefault();
        -
        -        //Enable sidebar push menu
        -        if ($(window).width() > (screenSizes.sm - 1)) {
        -          if ($("body").hasClass('sidebar-collapse')) {
        -            $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu');
        -          } else {
        -            $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu');
        -          }
        -        }
        -        //Handle sidebar push menu for small screens
        -        else {
        -          if ($("body").hasClass('sidebar-open')) {
        -            $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');
        -          } else {
        -            $("body").addClass('sidebar-open').trigger('expanded.pushMenu');
        -          }
        -        }
        -      });
        -
        -      $(".content-wrapper").click(function () {
        -        //Enable hide menu when clicking on the content-wrapper on small screens
        -        if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) {
        -          $("body").removeClass('sidebar-open');
        -        }
        -      });
        -
        -      //Enable expand on hover for sidebar mini
        -      if ($.AdminLTE.options.sidebarExpandOnHover
        -              || ($('body').hasClass('fixed')
        -                      && $('body').hasClass('sidebar-mini'))) {
        -        this.expandOnHover();
        -      }
        -    },
        -    expandOnHover: function () {
        -      var _this = this;
        -      var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
        -      //Expand sidebar on hover
        -      $('.main-sidebar').hover(function () {
        -        if ($('body').hasClass('sidebar-mini')
        -                && $("body").hasClass('sidebar-collapse')
        -                && $(window).width() > screenWidth) {
        -          _this.expand();
        -        }
        -      }, function () {
        -        if ($('body').hasClass('sidebar-mini')
        -                && $('body').hasClass('sidebar-expanded-on-hover')
        -                && $(window).width() > screenWidth) {
        -          _this.collapse();
        -        }
        -      });
        -    },
        -    expand: function () {
        -      $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
        -    },
        -    collapse: function () {
        -      if ($('body').hasClass('sidebar-expanded-on-hover')) {
        -        $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
        -      }
        -    }
        -  };
        -
        -  /* Tree()
        -   * ======
        -   * Converts the sidebar into a multilevel
        -   * tree view menu.
        -   *
        -   * @type Function
        -   * @Usage: $.AdminLTE.tree('.sidebar')
        -   */
        -  $.AdminLTE.tree = function (menu) {
        -    var _this = this;
        -    var animationSpeed = $.AdminLTE.options.animationSpeed;
        -    $(document).on('click', menu + ' li a', function (e) {
        -      //Get the clicked link and the next element
        -      var $this = $(this);
        -      var checkElement = $this.next();
        -
        -      //Check if the next element is a menu and is visible
        -      if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {
        -        //Close the menu
        -        checkElement.slideUp(animationSpeed, function () {
        -          checkElement.removeClass('menu-open');
        -          //Fix the layout in case the sidebar stretches over the height of the window
        -          //_this.layout.fix();
        -        });
        -        checkElement.parent("li").removeClass("active");
        -      }
        -      //If the menu is not visible
        -      else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
        -        //Get the parent menu
        -        var parent = $this.parents('ul').first();
        -        //Close all open menus within the parent
        -        var ul = parent.find('ul:visible').slideUp(animationSpeed);
        -        //Remove the menu-open class from the parent
        -        ul.removeClass('menu-open');
        -        //Get the parent li
        -        var parent_li = $this.parent("li");
        -
        -        //Open the target menu and add the menu-open class
        -        checkElement.slideDown(animationSpeed, function () {
        -          //Add the class active to the parent li
        -          checkElement.addClass('menu-open');
        -          parent.find('li.active').removeClass('active');
        -          parent_li.addClass('active');
        -          //Fix the layout in case the sidebar stretches over the height of the window
        -          _this.layout.fix();
        -        });
        -      }
        -      //if this isn't a link, prevent the page from being redirected
        -      if (checkElement.is('.treeview-menu')) {
        -        e.preventDefault();
        -      }
        -    });
        -  };
        -
        -  /* ControlSidebar
        -   * ==============
        -   * Adds functionality to the right sidebar
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.controlSidebar.activate(options)
        -   */
        -  $.AdminLTE.controlSidebar = {
        -    //instantiate the object
        -    activate: function () {
        -      //Get the object
        -      var _this = this;
        -      //Update options
        -      var o = $.AdminLTE.options.controlSidebarOptions;
        -      //Get the sidebar
        -      var sidebar = $(o.selector);
        -      //The toggle button
        -      var btn = $(o.toggleBtnSelector);
        -
        -      //Listen to the click event
        -      btn.on('click', function (e) {
        -        e.preventDefault();
        -        //If the sidebar is not open
        -        if (!sidebar.hasClass('control-sidebar-open')
        -                && !$('body').hasClass('control-sidebar-open')) {
        -          //Open the sidebar
        -          _this.open(sidebar, o.slide);
        -        } else {
        -          _this.close(sidebar, o.slide);
        -        }
        -      });
        -
        -      //If the body has a boxed layout, fix the sidebar bg position
        -      var bg = $(".control-sidebar-bg");
        -      _this._fix(bg);
        -
        -      //If the body has a fixed layout, make the control sidebar fixed
        -      if ($('body').hasClass('fixed')) {
        -        _this._fixForFixed(sidebar);
        -      } else {
        -        //If the content height is less than the sidebar's height, force max height
        -        if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
        -          _this._fixForContent(sidebar);
        -        }
        -      }
        -    },
        -    //Open the control sidebar
        -    open: function (sidebar, slide) {
        -      //Slide over content
        -      if (slide) {
        -        sidebar.addClass('control-sidebar-open');
        -      } else {
        -        //Push the content by adding the open class to the body instead
        -        //of the sidebar itself
        -        $('body').addClass('control-sidebar-open');
        -      }
        -    },
        -    //Close the control sidebar
        -    close: function (sidebar, slide) {
        -      if (slide) {
        -        sidebar.removeClass('control-sidebar-open');
        -      } else {
        -        $('body').removeClass('control-sidebar-open');
        -      }
        -    },
        -    _fix: function (sidebar) {
        -      var _this = this;
        -      if ($("body").hasClass('layout-boxed')) {
        -        sidebar.css('position', 'absolute');
        -        sidebar.height($(".wrapper").height());
        -        $(window).resize(function () {
        -          _this._fix(sidebar);
        -        });
        -      } else {
        -        sidebar.css({
        -          'position': 'fixed',
        -          'height': 'auto'
        -        });
        -      }
        -    },
        -    _fixForFixed: function (sidebar) {
        -      sidebar.css({
        -        'position': 'fixed',
        -        'max-height': '100%',
        -        'overflow': 'auto',
        -        'padding-bottom': '50px'
        -      });
        -    },
        -    _fixForContent: function (sidebar) {
        -      $(".content-wrapper, .right-side").css('min-height', sidebar.height());
        -    }
        -  };
        -
        -  /* BoxWidget
        -   * =========
        -   * BoxWidget is a plugin to handle collapsing and
        -   * removing boxes from the screen.
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.boxWidget.activate()
        -   *        Set all your options in the main $.AdminLTE.options object
        -   */
        -  $.AdminLTE.boxWidget = {
        -    selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
        -    icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
        -    animationSpeed: $.AdminLTE.options.animationSpeed,
        -    activate: function (_box) {
        -      var _this = this;
        -      if (!_box) {
        -        _box = document; // activate all boxes per default
        -      }
        -      //Listen for collapse event triggers
        -      $(_box).on('click', _this.selectors.collapse, function (e) {
        -        e.preventDefault();
        -        _this.collapse($(this));
        -      });
        -
        -      //Listen for remove event triggers
        -      $(_box).on('click', _this.selectors.remove, function (e) {
        -        e.preventDefault();
        -        _this.remove($(this));
        -      });
        -    },
        -    collapse: function (element) {
        -      var _this = this;
        -      //Find the box parent
        -      var box = element.parents(".box").first();
        -      //Find the body and the footer
        -      var box_content = box.find("> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer");
        -      if (!box.hasClass("collapsed-box")) {
        -        //Convert minus into plus
        -        element.children(":first")
        -                .removeClass(_this.icons.collapse)
        -                .addClass(_this.icons.open);
        -        //Hide the content
        -        box_content.slideUp(_this.animationSpeed, function () {
        -          box.addClass("collapsed-box");
        -        });
        -      } else {
        -        //Convert plus into minus
        -        element.children(":first")
        -                .removeClass(_this.icons.open)
        -                .addClass(_this.icons.collapse);
        -        //Show the content
        -        box_content.slideDown(_this.animationSpeed, function () {
        -          box.removeClass("collapsed-box");
        -        });
        -      }
        -    },
        -    remove: function (element) {
        -      //Find the box parent
        -      var box = element.parents(".box").first();
        -      box.slideUp(this.animationSpeed);
        -    }
        -  };
        -}
        -
        -/* ------------------
        - * - Custom Plugins -
        - * ------------------
        - * All custom plugins are defined below.
        - */
        -
        -/*
        - * BOX REFRESH BUTTON
        - * ------------------
        - * This is a custom plugin to use with the component BOX. It allows you to add
        - * a refresh button to the box. It converts the box's state to a loading state.
        - *
        - * @type plugin
        - * @usage $("#box-widget").boxRefresh( options );
        - */
        -(function ($) {
        -
        -  "use strict";
        -
        -  $.fn.boxRefresh = function (options) {
        -
        -    // Render options
        -    var settings = $.extend({
        -      //Refresh button selector
        -      trigger: ".refresh-btn",
        -      //File source to be loaded (e.g: ajax/src.php)
        -      source: "",
        -      //Callbacks
        -      onLoadStart: function (box) {
        -        return box;
        -      }, //Right after the button has been clicked
        -      onLoadDone: function (box) {
        -        return box;
        -      } //When the source has been loaded
        -
        -    }, options);
        -
        -    //The overlay
        -    var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
        -
        -    return this.each(function () {
        -      //if a source is specified
        -      if (settings.source === "") {
        -        if (window.console) {
        -          window.console.log("Please specify a source first - boxRefresh()");
        -        }
        -        return;
        -      }
        -      //the box
        -      var box = $(this);
        -      //the button
        -      var rBtn = box.find(settings.trigger).first();
        -
        -      //On trigger click
        -      rBtn.on('click', function (e) {
        -        e.preventDefault();
        -        //Add loading overlay
        -        start(box);
        -
        -        //Perform ajax call
        -        box.find(".box-body").load(settings.source, function () {
        -          done(box);
        -        });
        -      });
        -    });
        -
        -    function start(box) {
        -      //Add overlay and loading img
        -      box.append(overlay);
        -
        -      settings.onLoadStart.call(box);
        -    }
        -
        -    function done(box) {
        -      //Remove overlay and loading img
        -      box.find(overlay).remove();
        -
        -      settings.onLoadDone.call(box);
        -    }
        -
        -  };
        -
        -})(jQuery);
        -
        -/*
        - * EXPLICIT BOX ACTIVATION
        - * -----------------------
        - * This is a custom plugin to use with the component BOX. It allows you to activate
        - * a box inserted in the DOM after the app.js was loaded.
        - *
        - * @type plugin
        - * @usage $("#box-widget").activateBox();
        - */
        -(function ($) {
        -
        -  'use strict';
        -
        -  $.fn.activateBox = function () {
        -    $.AdminLTE.boxWidget.activate(this);
        -  };
        -
        -})(jQuery);
        -
        -/*
        - * TODO LIST CUSTOM PLUGIN
        - * -----------------------
        - * This plugin depends on iCheck plugin for checkbox and radio inputs
        - *
        - * @type plugin
        - * @usage $("#todo-widget").todolist( options );
        - */
        -(function ($) {
        -
        -  'use strict';
        -
        -  $.fn.todolist = function (options) {
        -    // Render options
        -    var settings = $.extend({
        -      //When the user checks the input
        -      onCheck: function (ele) {
        -        return ele;
        -      },
        -      //When the user unchecks the input
        -      onUncheck: function (ele) {
        -        return ele;
        -      }
        -    }, options);
        -
        -    return this.each(function () {
        -
        -      if (typeof $.fn.iCheck != 'undefined') {
        -        $('input', this).on('ifChecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onCheck.call(ele);
        -        });
        -
        -        $('input', this).on('ifUnchecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onUncheck.call(ele);
        -        });
        -      } else {
        -        $('input', this).on('change', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          if ($('input', ele).is(":checked")) {
        -            settings.onCheck.call(ele);
        -          } else {
        -            settings.onUncheck.call(ele);
        -          }
        -        });
        -      }
        -    });
        -  };
        -}(jQuery));
        \ No newline at end of file
        diff --git a/public/build/assets/css/app.css.map b/public/build/assets/css/app.css.map
        deleted file mode 100644
        index e47d8592fc..0000000000
        --- a/public/build/assets/css/app.css.map
        +++ /dev/null
        @@ -1 +0,0 @@
        -{"version":3,"sources":["AdminLTE.css","core.less","bootstrap-less/mixins/clearfix.less","bootstrap-less/mixins/vendor-prefixes.less","bootstrap-less/mixins/grid.less","header.less","mixins.less","sidebar.less","sidebar-mini.less","control-sidebar.less","dropdown.less","bootstrap-less/mixins/border-radius.less","forms.less","progress-bars.less","bootstrap-less/mixins/progress-bar.less","bootstrap-less/mixins/gradients.less","small-box.less","boxes.less","info-box.less","buttons.less","bootstrap-less/mixins/opacity.less","callout.less","alerts.less","navs.less","table.less","labels.less","direct-chat.less","users-list.less","modal.less","login_and_register.less","404_500_errors.less","bootstrap-social.less","bootstrap-less/mixins/buttons.less","fullcalendar.less","select2.less","miscellaneous.less","print.less","skin-blue.css","skin-blue.less","../mixins.less","../bootstrap-less/mixins/vendor-prefixes.less","ekko-lightbox.css","ekko-lightbox.less","overrides.less","overrides.css","fontawesome-animated.css"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,mHAAmH;AACnH;;;GAGG;ACPH;;EAEE,iBAAA;CDSD;ACRC;;EACE,aAAA;CDWH;ACPD;EACE,oCAAA;EACA,mCAAA;EACA,+EAAA;EACA,iBAAA;EACA,mBAAA;EACA,iBAAA;CDSD;AACD,YAAY;ACNZ;EAEE,iBAAA;EACA,iBAAA;EACA,iBAAA;CDOD;AEpBC;;EAEE,aAAA;EACA,eAAA;CFsBH;AEpBC;EACE,YAAA;CFsBH;ACdC;EACE,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,uCAAA;EACA,mBAAA;CDgBH;ACZD;EACE,oDAAA;CDcD;AACD;;;GAGG;ACXH;;;EE0KU,wEAAA;EAAA,gEAAA;EFnKR,mBAAA;EACA,aAAA;CDaD;ACXC;;;EACE,eAAA;CDeH;ACTC;EA8GF;;;IAjHI,eAAA;GDkBD;CACF;ACZC;EA0GF;;;IA5GM,eAAA;GDoBH;CACF;ACbC;EAoGF;;;IE7BE,uCAAA;IAGQ,+BAAA;GHpDP;CACF;ACpBD;;EAEE,iBAAA;EACA,0BAAA;EACA,aAAA;CDsBD;ACpBD;EACE,iBAAA;EACA,cAAA;EACA,YAAA;EACA,8BAAA;CDsBD;AACD,kBAAkB;ACnBlB;;;EAII,gBAAA;CDoBH;ACxBD;EAOI,OAAA;EACA,SAAA;EACA,QAAA;CDoBH;AC7BD;;EAaI,kBAAA;CDoBH;AChBC;EAkEF;;IApEM,mBAAA;GDuBH;CACF;ACrBC;EAEI,gBAAA;CDsBL;ACjBD;;;;;;;EDyBE,gBAAgB;EGsDR,iBAAA;CHlDT;AACD,aAAa;AChBb;EACE,kBAAA;EACA,cAAA;EG3HA,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CJ8ID;AACD,kBAAkB;AClBlB;;;;;;;;;;;;EAYE,2CAAA;CDoBD;AACD,mBAAmB;AClBnB;EACE,eAAA;CDoBD;AClBD;;;EAGE,cAAA;EACA,sBAAA;EACA,eAAA;CDoBD;AACD,iBAAiB;ACjBjB;EACE,sBAAA;EACA,gBAAA;CDmBD;ACrBD;EAKI,YAAA;EACA,eAAA;EACA,gBAAA;CDmBH;AACD;;;GAGG;AK1LH;EACE,mBAAA;EACA,kBAAA;EACA,cAAA;CL4LD;AK/LD;EF2LU,yCAAA;EEpLN,iBAAA;EACA,mBAAA;EACA,aAAA;EACA,iBAAA;EACA,iBAAA;CL8LH;AK7LG;EACE,eAAA;CL+LL;AK5MD;EAkBI,qCAAA;EACA,0BAAA;CL6LH;AK5LG;;EAEE,iCAAA;EACA,qCAAA;CL8LL;AK5LG;EACE,YAAA;EACA,WAAA;CL8LL;AK5LG;EACE,YAAA;CL8LL;AK5LG;EACE,YAAA;CL8LL;AK/ND;;EAuCI,aAAA;CL4LH;AKrLC;EAyNF;;IA7NQ,eAAA;IACA,wBAAA;GL8LL;CACF;AKhLC;EA6MF;IAtNM,YAAA;GL6LH;EK5LG;IACE,oBAAA;GL8LL;EKsBH;IAjNQ,eAAA;IACA,UAAA;GL8LL;CACF;AKtPD;EA6DI,YAAA;EACA,8BAAA;EACA,uBAAA;EACA,mBAAA;EAEA,yBAAA;CL2LH;AK1LG;EACE,iBAAA;CL4LL;AK1LG;EACE,YAAA;CL4LL;AK1LG;;EAEE,wBAAA;CL4LL;AKvQD;EA+EI,cAAA;CL2LH;AK1QD;;;EAsFM,kBAAA;CLyLL;AK/QD;EA4FI,mBAAA;EACA,SAAA;EACA,WAAA;EACA,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;CLsLH;AKxRD;EF2LU,mCAAA;EEnFN,eAAA;EACA,YAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,mBAAA;EACA,aAAA;EACA,4DAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CLsLH;AKxSD;EAuHM,eAAA;CLoLL;AK3SD;EA0HM,cAAA;CLoLL;AK9SD;EA+HI,YAAA;CLkLH;AK7KD;EACE,mBAAA;EACA,0BAAA;CL+KD;AKjLD;EAKI,UAAA;EACA,gBAAA;CL+KH;AKrLD;EAQM,gBAAA;EACA,sBAAA;EACA,kBAAA;EACA,iBAAA;CLgLL;AK3LD;EAgBI,aAAA;EACA,wBAAA;EACA,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;EACA,UAAA;EACA,YAAA;ECxFF,mBAAA;CNuQD;AKvMD;EA2BM,YAAA;EACA,sBAAA;EACA,sBAAA;CL+KL;AK5MD;;;EA+BQ,kBAAA;CLkLP;AKjND;EAmCM,kBAAA;CLiLL;AK/JD;EA8EA;IA1FM,mBAAA;IACA,gBAAA;IACA,OAAA;IACA,SAAA;IACA,YAAA;IACA,oBAAA;IACA,mBAAA;GL+KH;EK3FH;IAlFQ,eAAA;GLgLL;CACF;AK5KD;EACE,YAAA;EACA,UAAA;EACA,UAAA;EACA,mBAAA;CL8KD;AKzJD;EAjBE;IACE,YAAA;GL6KD;EK1KD;IACE,UAAA;IACA,YAAA;GL4KD;EKzKD;IACE,kBAAA;IACA,qBAAA;IACA,kBAAA;GL2KD;CACF;AKtJD;EAhBE;IACE,mBAAA;GLyKD;EK1KD;;IAII,YAAA;IACA,YAAA;GL0KH;EK/KD;IAQI,UAAA;GL0KH;EKlLD;IAWI,aAAA;GL0KH;CACF;AK5JD;EAyBA;IAjCI,sBAAA;GLwKD;EKvIH;IA/BM,eAAA;IACA,mBAAA;IACA,OAAA;IACA,YAAA;GLyKH;CACF;AK7JD;EANE;IACE,mBAAA;GLsKD;CACF;AK3JD;EANE;IACE,mBAAA;GLoKD;CACF;AKxJD;EAPE;IACE,aAAA;GLkKD;CACF;AACD;;;GAGG;AOtaH;;EAEE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,kBAAA;EACA,iBAAA;EACA,aAAA;EACA,aAAA;EJuMQ,uEAAA;EAAA,+DAAA;CHqOT;AOpaC;EAsIF;;IAxIM,mBAAA;GP2aH;CACF;AOvaC;EAmIF;;IJfE,wCAAA;IAGQ,gCAAA;GHwTP;CACF;AO5aC;EA+HF;;IJfE,wCAAA;IAGQ,gCAAA;GHiUP;CACF;AOhbC;EA0HF;;IJfE,mCAAA;IAGQ,2BAAA;GH0UP;CACF;AOtbD;EACE,qBAAA;CPwbD;AOrbD;EAEI,0BAAA;CPsbH;AOjbD;EACE,mBAAA;EACA,YAAA;EACA,cAAA;EACA,iBAAA;CPmbD;AE3dC;;EAEE,aAAA;EACA,eAAA;CF6dH;AE3dC;EACE,YAAA;CF6dH;AO/bD;EAOI,YAAA;EACA,gBAAA;EACA,aAAA;CP2bH;AOpcD;EAYI,0BAAA;EACA,eAAA;EACA,mBAAA;EACA,WAAA;CP2bH;AO1cD;EAiBM,iBAAA;EACA,mBAAA;CP4bL;AO9cD;EAqBM,sBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;CP4bL;AOpdD;;;EA4BQ,kBAAA;CP6bP;AOtbD;EACE,iBAAA;EACA,UAAA;EACA,WAAA;CPwbD;AO3bD;EAMI,mBAAA;EACA,UAAA;EACA,WAAA;CPwbH;AOhcD;EAUM,4BAAA;EACA,eAAA;CPybL;AOpcD;;;EAeQ,YAAA;CP0bP;AOzcD;;EAoBM,gBAAA;EACA,kBAAA;CPybL;AO9cD;EAyBI,6BAAA;EACA,gBAAA;CPwbH;AOldD;EA6BI,YAAA;EACA,aAAA;EACA,WAAA;EACA,mBAAA;EACA,gBAAA;CPwbH;AOzdD;EJoEE,kCAAA;EAGQ,0BAAA;CHwZT;AO/dD;EAwCM,eAAA;CP0bL;AOleD;EA8CI,cAAA;EACA,iBAAA;EACA,WAAA;EACA,UAAA;EACA,kBAAA;CPubH;AOzeD;EAoDM,mBAAA;CPwbL;AO5eD;EAuDM,UAAA;CPwbL;AO/eD;EAyDQ,0BAAA;EACA,eAAA;EACA,gBAAA;CPybP;AOpfD;;;EA+DU,YAAA;CP0bT;AOzfD;;EAmEU,YAAA;CP0bT;AACD;;GAEG;AQpeH;EAvGI;;;IAMI,4BAAA;IACA,aAAA;GR2kBL;EQllBC;ILqIF,mCAAA;IAGQ,2BAAA;IK1HF,sBAAA;IACA,aAAA;GR2kBL;EQ1lBC;IAoBM,mBAAA;GRykBP;EQ7lBC;IAsBQ,gBAAA;GR0kBT;EQhmBC;IAyBQ,6BAAA;GR0kBT;EQvkBO;IAEI,gCAAA;GRwkBX;EQtmBC;IAoCQ,iBAAA;IACA,oBAAA;IACA,gCAAA;GRqkBT;EQjkBO;;IAMI,yBAAA;IACA,mBAAA;IACA,aAAA;IACA,WAAA;GR+jBX;EQxkBO;IAcI,OAAA;IACA,kBAAA;IACA,4BAAA;IACA,0BAAA;GR6jBX;EQ9kBO;IAoBI,UAAA;IACA,eAAA;GR6jBX;EQ5nBC;;;;;;IA6EI,wBAAA;IACA,iCAAA;GRujBL;EQroBC;IAoFM,YAAA;GRojBP;EQxoBC;IAsFQ,eAAA;IACA,mBAAA;IACA,oBAAA;IACA,gBAAA;GRqjBT;EQ9oBC;IA4FQ,cAAA;GRqjBT;EQjpBC;IAkGM,kBAAA;GRkjBP;CACF;AQ3iBD;;;EAGE,oBAAA;EACA,iBAAA;CR6iBD;AQ3iBD;EACE,kBAAA;CR6iBD;AQ3iBD;;EAEE,iBAAA;EACA,oBAAA;CR6iBD;AQ3iBD;EACE,mBAAA;CR6iBD;AQ9iBD;EAGI,mBAAA;EACA,SAAA;EACA,YAAA;EACA,iBAAA;CR8iBH;AACD;;GAEG;ASnrBH;EACE,gBAAA;EACA,cAAA;EACA,UAAA;CTqrBD;ASlrBD;;EAEE,OAAA;EACA,cAAA;EACA,aAAA;ENiLQ,mCAAA;CHsgBT;ASnrBD;EACE,mBAAA;EACA,kBAAA;EACA,cAAA;CTqrBD;AS/qBC;EA4PF;IA/PI,mBAAA;GTsrBD;CACF;AS7rBD;EAUI,mBAAA;CTsrBH;ASlrBG;;EAEE,SAAA;CTorBL;AS/qBD;;EAGI,SAAA;CTgrBH;ASvqBD;EAoOA;;;IAvOM,oBAAA;GTgrBH;CACF;ASzqBK;;;EAGE,qBAAA;CT2qBP;ASjrBD;EHmBE,iBAAA;CNiqBD;ASvqBK;;EAEE,iBAAA;EACA,mBAAA;EACA,mCAAA;EACA,qCAAA;CTyqBP;AS3rBD;EAqBQ,gBAAA;CTyqBP;ASnqBO;;;;EAIE,iBAAA;EACA,mBAAA;EACA,oBAAA;CTqqBT;ASzpBD;EAqLA;IA1LI,eAAA;GTkqBD;ESxeH;IAxLM,oBAAA;GTmqBH;CACF;AS/pBD;EACE,iBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;CTiqBD;AS9pBD;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;CTgqBD;AS7pBD;EACE,iBAAA;EACA,WAAA;EACA,gBAAA;CT+pBD;ASlqBD;EAMI,eAAA;EACA,mBAAA;CT+pBH;AE3wBC;;EAEE,aAAA;EACA,eAAA;CF6wBH;AE3wBC;EACE,YAAA;CF6wBH;AS9qBD;EASM,cAAA;CTwqBL;ASjrBD;EAaI,YAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;CTuqBH;ASzrBD;EAqBI,kBAAA;EACA,gBAAA;CTuqBH;AS7rBD;EAwBM,UAAA;CTwqBL;AShsBD;EA2BM,UAAA;EACA,gBAAA;CTwqBL;ASpsBD;EAgCI,UAAA;CTuqBH;ASnqBD;EACE,eAAA;CTqqBD;ASnqBC;;EAEE,oBAAA;CTqqBH;AS1qBD;EASI,uBAAA;CToqBH;AS7qBD;EAYQ,oBAAA;EACA,eAAA;CToqBP;ASlqBO;;;EAGE,2BAAA;EACA,6BAAA;CToqBT;ASlqBO;;;EAGE,oBAAA;CToqBT;ASlqBO;EACE,YAAA;CToqBT;AS9pBS;;;;EAIE,oBAAA;EACA,YAAA;CTgqBX;AStsBD;;EA+CI,YAAA;CT2pBH;ASrpBO;EACE,oBAAA;CTupBT;AS7sBD;EA0DY,eAAA;CTspBX;AS9oBD;EACE,eAAA;CTgpBD;AS9oBC;;EAEE,oBAAA;EACA,+BAAA;CTgpBH;AStpBD;EAUI,uBAAA;CT+oBH;ASzpBD;EAaQ,oBAAA;EACA,YAAA;CT+oBP;AS7oBO;;;EAGE,2BAAA;EACA,6BAAA;CT+oBT;AS7oBO;;;EAGE,oBAAA;CT+oBT;ASzoBS;;;;EAIE,oBAAA;EACA,YAAA;CT2oBX;AS/qBD;;EA6CI,YAAA;CTsoBH;ASnrBD;EAiDI,mBAAA;CTqoBH;ASloBO;EACE,oBAAA;CTooBT;ASzrBD;EAyDY,eAAA;CTmoBX;AACD;;;GAGG;AACH,wBAAwB;AUn5BxB;EACE,iBAAA;EACA,mBAAA;CVq5BD;AUv5BD;EAII,YAAA;CVs5BH;AU15BD;;;EASI,mBAAA;CVs5BH;AU/5BD;EAYI,0BAAA;EACA,YAAA;CVs5BH;AUn6BD;EAgBI,uBAAA;CVs5BH;AUj5BD;;;EAQI,aAAA;EAEA,iBAAA;EACA,UAAA;EACA,UAAA;CV64BH;AUz5BD;;;EAMM,mBAAA;CVw5BL;AU95BD;;;EJkDE,4BAAA;EACA,6BAAA;EACA,8BAAA;EACA,6BAAA;EIpCE,0BAAA;EACA,kBAAA;EACA,iCAAA;EACA,eAAA;EACA,gBAAA;CVs5BH;AU36BD;;;EJkDE,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,+BAAA;EIzBE,gBAAA;EACA,uBAAA;EACA,kBAAA;EACA,iCAAA;EACA,sBAAA;EAKA,mBAAA;CVo5BH;AUp5BG;EA2RJ;;;IA9RM,2BAAA;IACA,sBAAA;GV65BH;CACF;AU15BG;;;EACE,sBAAA;EACA,oBAAA;CV85BL;AUv8BD;;;EA+CI,kBAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;EACA,mBAAA;CV65BH;AUh9BD;;;EAqDM,eAAA;EACA,oBAAA;EVg6BJ,gCAAgC;EU/5B5B,iCAAA;CVi6BL;AU/5BK;;;EACE,oBAAA;EACA,sBAAA;CVm6BP;AU55BD;EAIM,eAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EACA,cAAA;CV25BL;AUn6BD;;;EAaQ,YAAA;CV25BP;AUn5BD;EAKM,UAAA;EAEA,mBAAA;CVg5BL;AUv5BD;EAUQ,4BAAA;EACA,YAAA;EACA,aAAA;CVg5BP;AU55BD;EAgBQ,WAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;EACA,mBAAA;CV+4BP;AUn6BD;EAuBU,eAAA;EACA,gBAAA;EACA,mBAAA;EACA,OAAA;EACA,SAAA;CV+4BT;AU16BD;EAgCQ,mBAAA;EACA,gBAAA;EACA,eAAA;CV64BP;AEphCC;;EAEE,aAAA;EACA,eAAA;CFshCH;AEphCC;EACE,YAAA;CFshCH;AU34BD;EAGM,cAAA;CV24BL;AU94BD;EAMQ,gBAAA;EACA,WAAA;EACA,mBAAA;EACA,eAAA;CV24BP;AUp5BD;EAaQ,WAAA;EACA,UAAA;CV04BP;AUp4BD;EC/KE,2BAAA;EACC,0BAAA;EDiLC,mBAAA;EACA,oBAAA;EACA,aAAA;CVs4BH;AUp4BG;;EC9KF,gCAAA;EACC,+BAAA;CXsjCF;AUh5BD;EAaM,cAAA;EACA,cAAA;EACA,mBAAA;CVs4BL;AUr5BD;EAkBQ,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,0BAAA;EACA,uCAAA;CVs4BP;AU75BD;EA0BQ,WAAA;EACA,YAAA;EACA,gCAAA;EACA,gBAAA;EAEA,iBAAA;CVq4BP;AUp6BD;EAiCU,eAAA;EACA,gBAAA;CVs4BT;AUx6BD;EAyCM,cAAA;EACA,iCAAA;EACA,8BAAA;CVk4BL;AEllCC;;EAEE,aAAA;EACA,eAAA;CFolCH;AEllCC;EACE,YAAA;CFolCH;AUr7BD;EA8CQ,uBAAA;CV04BP;AUr4BK;EAsHN;IAzHU,4BAAA;IACA,uBAAA;GV44BP;CACF;AU97BD;EAwDM,0BAAA;EACA,cAAA;CVy4BL;AEvmCC;;EAEE,aAAA;EACA,eAAA;CFymCH;AEvmCC;EACE,YAAA;CFymCH;AU18BD;EA4DQ,eAAA;CVi5BP;AU54BO;EAwGR;IA1GY,0BAAA;GVk5BT;CACF;AUl9BD;EAsEI,YAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;EACA,iBAAA;CV+4BH;AUx4BC;EAuFF;IA5FM,YAAA;IACA,gBAAA;IACA,iBAAA;IACA,kBAAA;GVi5BH;CACF;AACD;qEACqE;AU74BrE;EACE,gDAAA;EAAA,wCAAA;EPvPA,qCAAA;EAEQ,6BAAA;CHuoCT;AU94BD;EACE;IACE,+DAAA;IAAA,uDAAA;IACA,oCAAA;IACA,WAAA;GVg5BD;EU74BD;IACE,gEAAA;IAAA,wDAAA;IACA,oCAAA;GV+4BD;EU54BD;IACE,+DAAA;IAAA,uDAAA;IACA,WAAA;GV84BD;EU34BD;IACE,+DAAA;IAAA,uDAAA;GV64BD;EU14BD;IACE,sCAAA;IAAA,8BAAA;GV44BD;CACF;AU14BD;EACE;IACE,+DAAA;IACA,4CAAA;IACA,WAAA;GV44BD;EUz4BD;IACE,gEAAA;IACA,4CAAA;GV24BD;EUx4BD;IACE,+DAAA;IACA,WAAA;GV04BD;EUv4BD;IACE,+DAAA;GVy4BD;EUt4BD;IACE,sCAAA;GVw4BD;CACF;AACD,kCAAkC;AUr4BlC;EAEI,mBAAA;CVs4BH;AUx4BD;EAIM,mBAAA;EACA,SAAA;EACA,WAAA;CVu4BL;AUp3BD;EAdE;IACE,aAAA;GVq4BD;EUt4BD;IAGI,iBAAA;GVs4BH;EUz4BD;IAKM,mBAAA;IACA,UAAA;IACA,WAAA;IACA,uBAAA;IACA,iBAAA;GVu4BL;CACF;AACD;;;GAGG;AY9tCH;ENqEE,iBAAA;EMnEA,iBAAA;EACA,sBAAA;CZguCD;AY/tCC;EACE,sBAAA;EACA,iBAAA;CZiuCH;AY/tCC;;;EAGE,YAAA;EACA,WAAA;CZiuCH;AY9tCC;EACE,yBAAA;EACA,sBAAA;EACA,iBAAA;CZguCH;AY3tCC;EAEI,eAAA;CZ4tCL;AY9tCC;EAKI,sBAAA;EACA,iBAAA;CZ4tCL;AYxtCC;EAEI,eAAA;CZytCL;AY3tCC;EAKI,sBAAA;EACA,iBAAA;CZytCL;AYrtCC;EAEI,eAAA;CZstCL;AYxtCC;EAKI,sBAAA;EACA,iBAAA;CZstCL;AACD,iBAAiB;AYjtCjB;ENcE,iBAAA;EMXE,sBAAA;EACA,uBAAA;CZktCH;AACD,mBAAmB;AY7sCf;;ENIF,iBAAA;CN6sCD;AY3sCD;EACE,gBAAA;CZ6sCD;AACD,gDAAgD;AY1sChD;EACI,kBAAA;CZ4sCH;AYzsCD;;;EAGE,kBAAA;CZ2sCD;AYzsCD;;;EAGE,kBAAA;CZ2sCD;AACD;;;GAGG;AaryCH;;EV+DU,iBAAA;CH2uCT;AavyCC;;;;EPgEA,mBAAA;CN6uCD;AACD,oBAAoB;AaxyCpB;;EAEE,aAAA;Cb0yCD;AazyCC;;;;EPuDA,mBAAA;CNwvCD;Aa3yCD;;EAEE,YAAA;Cb6yCD;Aa5yCC;;;;EPgDA,mBAAA;CNkwCD;Aa9yCD;;EAEE,YAAA;CbgzCD;Aa/yCC;;;;EPyCA,mBAAA;CN4wCD;AACD,mBAAmB;AajzCnB;EACE,mBAAA;EACA,YAAA;EACA,cAAA;EACA,sBAAA;EACA,mBAAA;CbmzCD;AaxzCD;EAOI,YAAA;EACA,mBAAA;EACA,UAAA;CbozCH;AahzCC;;EAEE,YAAA;CbkzCH;Aa/yCC;;EAEE,YAAA;CbizCH;Aa/yCC;;EAEE,WAAA;CbizCH;Aa5yCD;EAEI,iBAAA;Cb6yCH;Aa/yCD;EAKI,aAAA;Cb6yCH;AACD,2DAA2D;AazyC3D;EAEI,UAAA;Cb0yCH;AapyCD;;ECjFE,0BAAA;Cdy3CD;Act3CC;;ECkDE,sMAAA;Cf00CH;Aa1yCD;;ECrFE,0BAAA;Cdm4CD;Ach4CC;;ECkDE,sMAAA;Cfo1CH;Aa/yCD;;EC1FE,0BAAA;Cd64CD;Ac14CC;;ECkDE,sMAAA;Cf81CH;AapzCD;;EC/FE,0BAAA;Cdu5CD;Acp5CC;;ECkDE,sMAAA;Cfw2CH;AazzCD;;ECpGE,0BAAA;Cdi6CD;Ac95CC;;ECkDE,sMAAA;Cfk3CH;AACD;;;GAGG;AgBz6CH;EVoEE,mBAAA;EUlEA,mBAAA;EACA,eAAA;EACA,oBAAA;EACA,yCAAA;ChB26CD;AgBh7CD;EAQI,cAAA;ChB26CH;AgBn7CD;EAYI,mBAAA;EACA,mBAAA;EACA,eAAA;EACA,YAAA;EACA,gCAAA;EACA,eAAA;EACA,YAAA;EACA,+BAAA;EACA,sBAAA;ChB06CH;AgBz6CG;EACE,YAAA;EACA,gCAAA;ChB26CL;AgBl8CD;EA4BI,gBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;EACA,WAAA;ChBy6CH;AgBz8CD;EAqCI,gBAAA;ChBu6CH;AgB58CD;EAuCM,eAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;ChBw6CL;AgBl9CD;;EA+CI,aAAA;ChBu6CH;AgBt9CD;Eb2LU,4BAAA;EatIN,mBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,gBAAA;EACA,2BAAA;ChBu6CH;AgBn6CC;EACE,sBAAA;EACA,eAAA;ChBq6CH;AgBv6CC;EAKI,gBAAA;ChBq6CL;AgBp5CD;EAVE;IACE,mBAAA;GhBi6CD;EgBl6CD;IAGI,cAAA;GhBk6CH;EgBr6CD;IAMI,gBAAA;GhBk6CH;CACF;AACD;;;GAGG;AiBx/CH;EACE,mBAAA;EXoEA,mBAAA;EWlEA,oBAAA;EACA,8BAAA;EACA,oBAAA;EACA,YAAA;EACA,yCAAA;CjB0/CD;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBv/CC;EACE,0BAAA;CjBy/CH;AiBr/CC;;EAGI,cAAA;CjBs/CL;AiBvhDD;EAuCM,iCAAA;EACA,UAAA;CjBm/CL;AiBl/CK;EACE,oBAAA;CjBo/CP;AiB9+CC;EAEI,kBAAA;EACA,eAAA;CjB++CL;AiBliDD;EAwDI,gCAAA;CjB6+CH;AiBriDD;EA2DI,+BAAA;CjB6+CH;AiBt+CC;EACE,cAAA;CjBw+CH;AiBz+CC;EAIM,wBAAA;CjBw+CP;AiBp+CO;;EACE,+BAAA;CjBu+CT;AiBj+CG;EXvCF,0BAAA;CN2gDD;AiBp+CG;EXrCA,YAAA;EACA,oBAAA;EACA,0BAAA;CN4gDH;AiBz+CG;;EXhCE,YAAA;CN6gDL;AiB1+CG;EX1CF,0BAAA;CNuhDD;AiB7+CG;EXxCA,YAAA;EACA,oBAAA;EACA,0BAAA;CNwhDH;AiBl/CG;;EXnCE,YAAA;CNyhDL;AiBn/CG;EX7CF,0BAAA;CNmiDD;AiBt/CG;EX3CA,YAAA;EACA,oBAAA;EACA,0BAAA;CNoiDH;AiB3/CG;;EXtCE,YAAA;CNqiDL;AiB5/CG;EXhDF,0BAAA;CN+iDD;AiB//CG;EX9CA,YAAA;EACA,oBAAA;EACA,0BAAA;CNgjDH;AiBpgDG;;EXzCE,YAAA;CNijDL;AiBrgDG;EXnDF,0BAAA;CN2jDD;AiBxgDG;EXjDA,YAAA;EACA,oBAAA;EACA,0BAAA;CN4jDH;AiB7gDG;;EX5CE,YAAA;CN6jDL;AiB9gDG;EXtDF,0BAAA;CNukDD;AiBjhDG;EXpDA,YAAA;EACA,oBAAA;EACA,0BAAA;CNwkDH;AiBthDG;;EX/CE,YAAA;CNykDL;AiBxjDC;EAmCI,UAAA;EACA,iBAAA;CjBwhDL;AiBphDG;EAEI,YAAA;CjBqhDP;AiBjoDD;EAqHM,mBAAA;CjB+gDL;AiBpoDD;EA4HI,mBAAA;EACA,YAAA;EACA,iBAAA;EACA,gBAAA;EACA,qBAAA;CjB2gDH;AiBvgDD;;;;EAKI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,YAAA;EACA,aAAA;CjBwgDH;AiBjhDD;;EAaI,YAAA;EACA,qCAAA;EX7EF,mBAAA;CNslDD;AiBvhDD;;EAiBM,mBAAA;EACA,SAAA;EACA,UAAA;EACA,mBAAA;EACA,kBAAA;EACA,YAAA;EACA,gBAAA;CjB0gDL;AiBjiDD;;EA4BI,+BAAA;CjBygDH;AEhqDC;;;;;;EAEE,aAAA;EACA,eAAA;CFsqDH;AEpqDC;;;EACE,YAAA;CFwqDH;AiB3gDD;EACE,YAAA;EACA,eAAA;EACA,cAAA;EACA,mBAAA;CjB6gDD;AiB1gDC;EACE,iCAAA;CjB4gDH;AiB3gDG;EACE,oBAAA;CjB6gDL;AiBvhDD;;;;EAmBI,sBAAA;EACA,gBAAA;EACA,UAAA;EACA,eAAA;CjB0gDH;AiBhiDD;;;EA2BI,kBAAA;CjB0gDH;AiBriDD;EA8BI,mBAAA;EACA,YAAA;EACA,SAAA;CjB0gDH;AiB1iDD;EAkCM,mBAAA;CjB2gDL;AiBxgDG;EAEI,SAAA;EACA,WAAA;CjBygDP;AiBlgDD;EACE,aAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;CjBogDD;AiBngDC;;EAEE,eAAA;CjBqgDH;AiBngDC;EACE,iBAAA;CjBqgDH;AiBhgDD;EXjKE,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,+BAAA;EWgKA,cAAA;CjBqgDD;AiBpgDC;EN9OA,6BAAA;EACC,4BAAA;CXqvDF;AiB3gDD;EAQI,iBAAA;CjBsgDH;AiB9gDD;EAaI,gBAAA;CjBogDH;AiBjhDD;EAiBI,cAAA;CjBmgDH;AiBjgDC;EACE,aAAA;CjBmgDH;AiBvhDD;EXjKE,0BAAA;EACA,2BAAA;EACA,8BAAA;EACA,+BAAA;CN2rDD;AiB7hDD;EXjKE,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,6BAAA;CNisDD;AiBngDD;EXjME,0BAAA;EACA,2BAAA;EACA,gCAAA;EACA,+BAAA;EWgMA,8BAAA;EACA,cAAA;EACA,uBAAA;CjBwgDD;AiBtgDD;EAEE,eAAA;CjBugDD;AiBjgDC;EAuMF;IA1MM,YAAA;IACA,mBAAA;GjBwgDH;CACF;AiBngDD;EACE,oBAAA;CjBqgDD;AiBtgDD;EAII,eAAA;EACA,8BAAA;CjBqgDH;AE7xDC;;EAEE,aAAA;EACA,eAAA;CF+xDH;AE7xDC;EACE,YAAA;CF+xDH;AiB5gDG;EACE,iBAAA;CjB8gDL;AiB5gDG;EACE,eAAA;CjB8gDL;AiBxhDD;EAcM,YAAA;CjB6gDL;AiB3hDD;EAkBI,kBAAA;EACA,YAAA;CjB4gDH;AiB/hDD;EAsBI,YAAA;EACA,eAAA;EACA,iBAAA;CjB4gDH;AiBpiDD;EA2BI,iBAAA;EACA,gBAAA;CjB4gDH;AACD,uBAAuB;AiBpgDvB;EACE,UAAA;EACA,WAAA;EACA,iBAAA;EACA,eAAA;CjBsgDD;AiB1gDD;EX5PE,mBAAA;EWoQE,cAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,YAAA;CjBsgDH;AiBrgDG;EACE,iBAAA;CjBugDL;AiBrhDD;EAkBM,qBAAA;CjBsgDL;AiBxhDD;EAsBM,sBAAA;EACA,iBAAA;EACA,iBAAA;CjBqgDL;AiB7hDD;EA6BM,kBAAA;EACA,eAAA;CjBmgDL;AiBjiDD;EAmCM,cAAA;EACA,aAAA;EACA,eAAA;CjBigDL;AiBtiDD;;;EAwCQ,kBAAA;EACA,gBAAA;CjBmgDP;AiB//CG;EACE,sBAAA;CjBigDL;AiB9/CG;EACE,YAAA;CjBggDL;AiBjgDG;EAGI,8BAAA;EACA,iBAAA;CjBigDP;AiBrgDG;EAQI,+BAAA;CjBggDP;AiBzjDD;EAgEI,2BAAA;CjB4/CH;AiB5jDD;EAmEI,2BAAA;CjB4/CH;AiB/jDD;EAsEI,2BAAA;CjB4/CH;AiBlkDD;EAyEI,2BAAA;CjB4/CH;AiBrkDD;EA4EI,2BAAA;CjB4/CH;AiBxkDD;EAgFI,sBAAA;EACA,aAAA;EACA,cAAA;CjB2/CH;AACD,uGAAuG;AiBr/CvG;EACE,2BAAA;CjBu/CD;AiBx/CD;EAKI,oBAAA;CjBs/CH;AE54DC;;EAEE,aAAA;EACA,eAAA;CF84DH;AE54DC;EACE,YAAA;CF84DH;AiBngDD;EAQM,YAAA;EACA,aAAA;EACA,8BAAA;EX/VJ,mBAAA;CN81DD;AiBzgDD;EAeM,0BAAA;CjB6/CL;AiB5gDD;EAkBM,0BAAA;CjB6/CL;AiB/gDD;EAuBM,kBAAA;EACA,kBAAA;CjB2/CL;AiBnhDD;EA0BQ,eAAA;EACA,iBAAA;CjB4/CP;AiBvhDD;EXrVE,mBAAA;EWuXI,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,cAAA;CjBy/CL;AiB9hDD;EAuCQ,kBAAA;EACA,iBAAA;EACA,gBAAA;CjB0/CP;AiBniDD;;EA4CQ,iBAAA;EACA,gBAAA;EACA,mBAAA;EACA,UAAA;CjB2/CP;AE37DC;;EAEE,aAAA;EACA,eAAA;CF67DH;AE37DC;EACE,YAAA;CF67DH;AiBx/CD;EACE,iBAAA;CjB0/CD;AiBr/CD;EAEI,YAAA;CjBs/CH;AACD;;;GAGG;AkBt9DH;EACE,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,yCAAA;EZgEA,mBAAA;EY9DA,oBAAA;ClBw9DD;AkB/9DD;EASI,gBAAA;ClBy9DH;AkBl+DD;EAYI,+BAAA;EACA,4BAAA;EACA,YAAA;ClBy9DH;AkBx9DG;;EZsDF,iBAAA;CNs6DD;AkB3+DD;EAoBM,iBAAA;ClB09DL;AkBt9DD;EZiDE,4BAAA;EACA,2BAAA;EACA,8BAAA;EACA,+BAAA;EYlDA,eAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,+BAAA;ClB29DD;AkBp+DD;EAWI,gBAAA;ClB49DH;AkBz9DD;EACE,kBAAA;EACA,kBAAA;ClB29DD;AkBz9DD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;ClB29DD;AkBz9DD;;EAEE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;ClB29DD;AkBz9DD;EACE,0BAAA;ClB29DD;AkBz9DD;EACE,eAAA;ClB29DD;AkBx9DD;EACE,UAAA;ClB09DD;AACD;;;GAGG;AmB5hEH;EboEE,mBAAA;EHJQ,iBAAA;EgB7DR,8BAAA;CnB+hED;AmB7hEC;EACE,0BAAA;CnB+hEH;AmB3hEC;Eb0DA,iBAAA;EatDE,iBAAA;EACA,kBAAA;CnB6hEH;AmBzhEC;EAGE,iDAAA;CnB2hEH;AmBxhEC;EACE,cAAA;CnB0hEH;AmBthEC;EACE,mBAAA;EACA,iBAAA;CnBwhEH;AmB1hEC;EAII,mBAAA;EACA,OAAA;EACA,SAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;EACA,kBAAA;EC1CJ,WAAA;EAGA,yBAAA;EDyCI,cAAA;EACA,kBAAA;EACA,gBAAA;EACA,eAAA;CnB0hEL;AmBphED;EACE,0BAAA;EACA,YAAA;EACA,mBAAA;CnBshED;AmBrhEC;;;EAGE,0BAAA;CnBuhEH;AmBphED;EACE,0BAAA;EACA,sBAAA;CnBshED;AmBrhEC;;;EACE,0BAAA;CnByhEH;AmBthED;EACE,0BAAA;EACA,sBAAA;CnBwhED;AmBvhEC;;;EACE,0BAAA;CnB2hEH;AmBxhED;EACE,0BAAA;EACA,sBAAA;CnB0hED;AmBzhEC;;;EACE,0BAAA;CnB6hEH;AmB1hED;EACE,0BAAA;EACA,sBAAA;CnB4hED;AmB3hEC;;;EACE,0BAAA;CnB+hEH;AmB5hED;EACE,0BAAA;EACA,sBAAA;CnB8hED;AmB7hEC;;;EACE,0BAAA;CnBiiEH;AmB9hED;EACE,uBAAA;EACA,wBAAA;EACA,YAAA;CnBgiED;AmB/hEC;;;EAGE,gCAAA;EACA,uCAAA;CnBiiEH;AmB9hED;EhB3CU,iBAAA;CH6kET;AmB9hED;EhB/CU,+CAAA;CHilET;AmB9hED;Eb/CE,mBAAA;EaiDA,mBAAA;EACA,kBAAA;EACA,sBAAA;EACA,gBAAA;EACA,aAAA;EACA,mBAAA;EACA,YAAA;EACA,uBAAA;EACA,0BAAA;EACA,gBAAA;CnBgiED;AmB3iED;;;EAcI,gBAAA;EACA,eAAA;CnBkiEH;AmB/hEC;EACE,oBAAA;EACA,YAAA;EACA,mBAAA;CnBiiEH;AmB9hEC;;EAGE,iDAAA;CnBiiEH;AmB5jED;EAgCI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,iBAAA;CnB+hEH;AACD;;;GAGG;AqBzrEH;EfmEE,mBAAA;EejEA,mBAAA;EACA,6BAAA;EACA,4BAAA;CrB2rED;AqB/rED;EAMI,YAAA;EACA,2BAAA;CrB4rEH;AqB3rEG;EACE,YAAA;CrB6rEL;AqBtsED;EAaI,cAAA;EACA,iBAAA;CrB4rEH;AqB1sED;EAiBI,iBAAA;CrB4rEH;AqB7sED;;EAqBI,uBAAA;CrB4rEH;AqBxrEC;EAEE,sBAAA;CrByrEH;AqBvrEC;EAEE,sBAAA;CrBwrEH;AqBtrEC;EAEE,sBAAA;CrBurEH;AqBrrEC;EAEE,sBAAA;CrBsrEH;AACD;;;GAGG;AsBluEH;EhBoEE,mBAAA;CNiqED;AsBruED;EAGI,iBAAA;CtBquEH;AsBxuED;EAMI,mBAAA;CtBquEH;AsB3uED;EASI,YAAA;EFXF,aAAA;EAGA,0BAAA;CpB+uED;AsBruEG;EFbF,aAAA;EAGA,0BAAA;CpBmvED;AsBpvED;EAgBI,YAAA;EACA,2BAAA;CtBuuEH;AsBluED;EAEE,sBAAA;CtBmuED;AsBjuED;;EAGE,sBAAA;CtBkuED;AsBhuED;EAEE,sBAAA;CtBiuED;AsB/tED;EAEE,sBAAA;CtBguED;AACD;;;GAGG;AuBzwEH;;;EAII,YAAA;EACA,oBAAA;CvB0wEH;AACD,eAAe;AuBtwEf;EjB0DE,iBAAA;EiBvDE,kCAAA;EACA,YAAA;CvBuwEH;AuB3wED;;;EAQM,kBAAA;CvBwwEL;AuBhxED;;;EAcI,0BAAA;CvBuwEH;AuBrxED;EAiBI,iBAAA;CvBuwEH;AACD,iBAAiB;AuBpwEjB;EjBqCE,iBAAA;EiBlCE,cAAA;EACA,mCAAA;EACA,YAAA;CvBqwEH;AuB1wED;;EASI,wBAAA;EACA,YAAA;EACA,cAAA;EACA,2BAAA;CvBqwEH;AuBjxED;EAgBI,8BAAA;EACA,YAAA;EACA,oBAAA;EACA,kBAAA;EACA,0BAAA;CvBowEH;AACD,cAAc;AuBhwEd;EACE,oBAAA;EACA,iBAAA;EACA,yCAAA;EACA,mBAAA;CvBkwED;AuBtwED;EAMI,UAAA;EACA,6BAAA;EZjEF,6BAAA;EACC,4BAAA;CXq0EF;AuB5wED;EAUM,kCAAA;EACA,oBAAA;EAuBA,kBAAA;CvB+uEL;AuBjxED;EAaQ,YAAA;EjBDN,iBAAA;CNywED;AuBtwEO;EACE,YAAA;CvBwwET;AuBtwEO;;EAEE,wBAAA;EACA,UAAA;CvBwwET;AuBtwEO;EACE,YAAA;CvBwwET;AuBrwEK;;;EAII,0BAAA;CvBswET;AuBryED;EAsCM,0BAAA;CvBkwEL;AuBjwEK;;EAEE,uBAAA;EACA,YAAA;CvBmwEP;AuB7yED;EA6CQ,8BAAA;EACA,2BAAA;EACA,4BAAA;CvBmwEP;AuBlzED;EAqDM,eAAA;CvBgwEL;AuB/vEK;EAEI,+BAAA;CvBgwET;AuB1vEG;EACE,sBAAA;CvB4vEL;AuB7vEG;EAGI,aAAA;CvB6vEP;AuBhwEG;EAMI,gBAAA;CvB6vEP;AuBnwEG;EAQM,uBAAA;CvB8vET;AuB5vEO;EAEI,2BAAA;EACA,gCAAA;CvB6vEX;AuBx0ED;EAkFM,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,YAAA;CvByvEL;AuB90ED;;;EAyFQ,kBAAA;CvB0vEP;AuBn1ED;EA+FI,iBAAA;EACA,cAAA;EZlJF,gCAAA;EACC,+BAAA;CX04EF;AuBpvEG;;EAEE,wBAAA;EACA,YAAA;CvBsvEL;AACD,gBAAgB;AuBjvEhB;EAEI,oBAAA;EACA,YAAA;CvBkvEH;AuBhvEC;EjBvGA,4BAAA;CN01ED;AACD;;;GAGG;AwBl6EH;;;;;;EAQQ,8BAAA;CxBk6EP;AwB16ED;EAcI,iCAAA;CxB+5EH;AwB76ED;EAkBI,gBAAA;CxB85EH;AwBz5ED;EACE,0BAAA;CxB25ED;AwB55ED;;;;;;EAQQ,0BAAA;CxB45EP;AwBp6ED;;EAeM,yBAAA;CxBy5EL;AwBn5EC;;;EAGE,UAAA;CxBq5EH;AACD,4BAA4B;AwBh5E1B;;;EACE,mBAAA;CxBo5EH;AwBh5ED;EAEI,iBAAA;CxBi5EH;AwBn5ED;EAKI,kBAAA;CxBi5EH;AACD;;;GAGG;AyBr9EH;EACE,0BAAA;EACA,YAAA;CzBu9ED;AACD;;;GAGG;A0B79EH;EfOE,8BAAA;EACC,6BAAA;EeLC,mBAAA;EACA,mBAAA;EACA,WAAA;C1B+9EH;A0B79EC;EvBmIA,mCAAA;EAGQ,2BAAA;CH61ET;A0B79ED;EvB6HE,mCAAA;EAGQ,2BAAA;EuB9HR,cAAA;EACA,cAAA;EACA,eAAA;C1Bk+ED;A0Bh+ED;;EAEE,eAAA;C1Bk+ED;A0Bh+ED;EAEE,oBAAA;C1Bi+ED;AEj/EC;;EAEE,aAAA;EACA,eAAA;CFm/EH;AEj/EC;EACE,YAAA;CFm/EH;A0Bv+ED;;EvBuLU,+CAAA;EAAA,uCAAA;CHuzET;A0B1+ED;EpBsCE,mBAAA;EoBpCA,mBAAA;EACA,kBAAA;EACA,oBAAA;EACA,0BAAA;EACA,qBAAA;EACA,YAAA;C1B4+ED;A0Bz+EC;;EAEE,mBAAA;EACA,YAAA;EACA,UAAA;EACA,0BAAA;EACA,4BAAA;EACA,aAAA;EACA,UAAA;EACA,SAAA;EACA,qBAAA;C1B2+EH;A0Bx+EC;EACE,kBAAA;EACA,iBAAA;C1B0+EH;A0Bx+EC;EACE,kBAAA;EACA,iBAAA;C1B0+EH;A0Bx+EC;EACE,mBAAA;EACA,eAAA;C1B0+EH;A0Bz+EG;;EAEE,YAAA;EACA,WAAA;EACA,gCAAA;EACA,2BAAA;C1B2+EL;A0Bv+ED;EpBLE,mBAAA;EoBOA,YAAA;EACA,YAAA;EACA,aAAA;C1By+ED;A0Bx+EC;EACE,aAAA;C1B0+EH;A0Bv+ED;EACE,eAAA;EACA,mBAAA;EACA,gBAAA;C1By+ED;A0Bv+ED;EACE,iBAAA;C1By+ED;A0Bv+ED;EACE,YAAA;C1By+ED;A0Bt+ED;EvB2CE,mCAAA;EAGQ,2BAAA;CH87ET;A0Bv+ED;EvBsCE,sCAAA;EAGQ,8BAAA;EuBvCR,mBAAA;EACA,OAAA;EACA,UAAA;EACA,cAAA;EACA,YAAA;EACA,oBAAA;EACA,YAAA;EACA,eAAA;C1B4+ED;A0Bx+ED;EAII,4CAAA;EACA,cAAA;EACA,UAAA;C1Bu+EH;AErlFC;;EAEE,aAAA;EACA,eAAA;CFulFH;AErlFC;EACE,YAAA;CFulFH;A0B9+EG;EACE,oBAAA;C1Bg/EL;A0B5+ED;EpBxDE,mBAAA;EoB0DA,YAAA;EACA,YAAA;C1B8+ED;A0B5+ED;EACE,kBAAA;EACA,YAAA;C1B8+ED;A0B5+ED;;EAEE,eAAA;C1B8+ED;A0B5+ED;EACE,iBAAA;C1B8+ED;A0B5+ED;EACE,gBAAA;C1B8+ED;A0B5+ED;EACE,YAAA;EACA,oBAAA;C1B8+ED;A0B5+ED;EACE,YAAA;C1B8+ED;A0B1+ED;EpBhGI,oBAAA;EACA,sBAAA;EACA,YAAA;CN6kFH;AM5kFG;;EAEE,2BAAA;CN8kFL;A0Bh/ED;EpBnGI,oBAAA;EACA,sBAAA;EACA,YAAA;CNslFH;AMrlFG;;EAEE,2BAAA;CNulFL;A0Bt/ED;EpBtGI,oBAAA;EACA,sBAAA;EACA,YAAA;CN+lFH;AM9lFG;;EAEE,2BAAA;CNgmFL;A0B5/ED;EpBzGI,oBAAA;EACA,sBAAA;EACA,YAAA;CNwmFH;AMvmFG;;EAEE,2BAAA;CNymFL;A0BlgFD;EpB5GI,oBAAA;EACA,sBAAA;EACA,YAAA;CNinFH;AMhnFG;;EAEE,2BAAA;CNknFL;AACD;;;GAGG;A2BprFH;EAGI,WAAA;EACA,YAAA;EACA,cAAA;EACA,mBAAA;C3BorFH;A2B1rFD;ErBqEE,mBAAA;EqB5DI,gBAAA;EACA,aAAA;C3BqrFL;A2BlrFK;;EAEE,YAAA;C3BorFP;A2B/qFD;;EAEE,eAAA;C3BirFD;A2B/qFD;EACE,iBAAA;EACA,YAAA;EACA,iBAAA;EACA,oBAAA;EACA,wBAAA;C3BirFD;A2B/qFD;EACE,YAAA;EACA,gBAAA;C3BirFD;AACD;;;GAGG;A4BttFH;EACE,+BAAA;C5BwtFD;A4BttFD;EtBkEE,iBAAA;EHJQ,2CAAA;EyB3DR,UAAA;C5BytFD;A4BrtFD;EA2DA;IzBJU,2CAAA;GHmqFP;CACF;A4B1tFD;EACE,6BAAA;C5B4tFD;A4B1tFD;EACE,0BAAA;C5B4tFD;A4BxtFD;;EAOI,sBAAA;C5BqtFH;A4BltFD;;EAOI,sBAAA;C5B+sFH;A4B5sFD;;EAOI,sBAAA;C5BysFH;A4BtsFD;;EAOI,sBAAA;C5BmsFH;A4BhsFD;;EAOI,sBAAA;C5B6rFH;AACD;;;GAGG;A6BlwFH;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;EACA,iBAAA;C7BowFD;A6BzwFD;;EAOI,YAAA;C7BswFH;A6BlwFD;;EAEE,oBAAA;C7BowFD;A6BjwFD;;EAEE,aAAA;EACA,gBAAA;C7BmwFD;A6B9vFD;EAqBA;;IAxBI,WAAA;IACA,iBAAA;G7BswFD;CACF;A6BnwFD;;EAEE,iBAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;C7BqwFD;A6B1wFD;;EAOI,YAAA;C7BuwFH;A6BpwFD;;EAEE,UAAA;EACA,mBAAA;EACA,0BAAA;C7BswFD;A6BpwFD;EACE,eAAA;C7BswFD;AACD;;;GAGG;A8BtzFH;EACE,aAAA;EACA,yBAAA;C9BwzFD;A8BnzFC;EAyBF;IA5BI,YAAA;G9B0zFD;CACF;A8B/zFD;EAQI,YAAA;EACA,iBAAA;EACA,iBAAA;C9B0zFH;A8BrzFC;EAiBF;IApBM,YAAA;IACA,mBAAA;G9B4zFH;CACF;A8B10FD;EAkBI,mBAAA;EAWA,eAAA;C9BizFH;A8BxzFG;EAUJ;IAZM,eAAA;G9B8zFH;CACF;A8Bn1FD;EAuBM,iBAAA;EACA,gBAAA;C9B+zFL;A8B3zFG;EAIJ;IANQ,mBAAA;G9Bi0FL;CACF;AACD;;;;;;;GAOG;A+B11FH;EACE,mBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;C/B41FD;A+Bl2FD;EAQI,mBAAA;EACA,QAAA;EACA,OAAA;EACA,UAAA;EACA,YAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,2CAAA;C/B61FH;A+B31FC;EACE,mBAAA;C/B61FH;A+B91FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B81FL;A+B31FC;EACE,mBAAA;C/B61FH;A+B91FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B81FL;A+B31FC;EACE,mBAAA;C/B61FH;A+B91FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B81FL;A+Bz1FD;EA3CE,mBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EAwCA,aAAA;EACA,YAAA;EACA,WAAA;C/Bg2FD;A+Bp2FD;EApCI,mBAAA;EACA,QAAA;EACA,OAAA;EACA,UAAA;EACA,YAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,2CAAA;C/B24FH;A+Bz4FC;EACE,mBAAA;C/B24FH;A+B54FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B44FL;A+Bz4FC;EACE,mBAAA;C/B24FH;A+B54FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B44FL;A+Bz4FC;EACE,mBAAA;C/B24FH;A+B54FC;EAGI,kBAAA;EACA,YAAA;EACA,iBAAA;C/B44FL;A+Bv4FD;EAMI,aAAA;EACA,mBAAA;EACA,YAAA;C/Bo4FH;A+Bl4FC;EACE,aAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;C/Bo4FH;A+Bl4FC;EACE,aAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;C/Bo4FH;A+Bl4FC;EACE,aAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;C/Bo4FH;A+B13FD;ECxFE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCq9FD;AgCn9FC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCq9FP;AgCn9FC;;;EAGE,uBAAA;ChCq9FH;AgCh9FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC89FT;A+Bn6FD;ECtDI,eAAA;EACA,uBAAA;ChC49FH;A+Bt6FD;ECzFE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCkgGD;AgChgGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCkgGP;AgChgGC;;;EAGE,uBAAA;ChCkgGH;AgC7/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC2gGT;A+B/8FD;ECvDI,eAAA;EACA,uBAAA;ChCygGH;A+Bl9FD;EC1FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC+iGD;AgC7iGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC+iGP;AgC7iGC;;;EAGE,uBAAA;ChC+iGH;AgC1iGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCwjGT;A+B3/FD;ECxDI,eAAA;EACA,uBAAA;ChCsjGH;A+B9/FD;EC3FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC4lGD;AgC1lGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC4lGP;AgC1lGC;;;EAGE,uBAAA;ChC4lGH;AgCvlGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCqmGT;A+BviGD;ECzDI,eAAA;EACA,uBAAA;ChCmmGH;A+B1iGD;EC5FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCyoGD;AgCvoGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCyoGP;AgCvoGC;;;EAGE,uBAAA;ChCyoGH;AgCpoGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCkpGT;A+BnlGD;EC1DI,eAAA;EACA,uBAAA;ChCgpGH;A+BtlGD;EC7FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCsrGD;AgCprGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCsrGP;AgCprGC;;;EAGE,uBAAA;ChCsrGH;AgCjrGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC+rGT;A+B/nGD;EC3DI,eAAA;EACA,uBAAA;ChC6rGH;A+BloGD;EC9FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCmuGD;AgCjuGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCmuGP;AgCjuGC;;;EAGE,uBAAA;ChCmuGH;AgC9tGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC4uGT;A+B3qGD;EC5DI,eAAA;EACA,uBAAA;ChC0uGH;A+B9qGD;EC/FE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCgxGD;AgC9wGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCgxGP;AgC9wGC;;;EAGE,uBAAA;ChCgxGH;AgC3wGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCyxGT;A+BvtGD;EC7DI,eAAA;EACA,uBAAA;ChCuxGH;A+B1tGD;EChGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC6zGD;AgC3zGC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC6zGP;AgC3zGC;;;EAGE,uBAAA;ChC6zGH;AgCxzGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCs0GT;A+BnwGD;EC9DI,eAAA;EACA,uBAAA;ChCo0GH;A+BtwGD;ECjGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC02GD;AgCx2GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC02GP;AgCx2GC;;;EAGE,uBAAA;ChC02GH;AgCr2GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCm3GT;A+B/yGD;EC/DI,eAAA;EACA,uBAAA;ChCi3GH;A+BlzGD;EClGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCu5GD;AgCr5GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCu5GP;AgCr5GC;;;EAGE,uBAAA;ChCu5GH;AgCl5GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCg6GT;A+B31GD;EChEI,eAAA;EACA,uBAAA;ChC85GH;A+B91GD;ECnGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCo8GD;AgCl8GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCo8GP;AgCl8GC;;;EAGE,uBAAA;ChCo8GH;AgC/7GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC68GT;A+Bv4GD;ECjEI,eAAA;EACA,uBAAA;ChC28GH;A+B14GD;ECpGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCi/GD;AgC/+GC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCi/GP;AgC/+GC;;;EAGE,uBAAA;ChCi/GH;AgC5+GG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC0/GT;A+Bn7GD;EClEI,eAAA;EACA,uBAAA;ChCw/GH;A+Bt7GD;ECrGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC8hHD;AgC5hHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC8hHP;AgC5hHC;;;EAGE,uBAAA;ChC8hHH;AgCzhHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCuiHT;A+B/9GD;ECnEI,eAAA;EACA,uBAAA;ChCqiHH;A+Bl+GD;ECtGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC2kHD;AgCzkHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC2kHP;AgCzkHC;;;EAGE,uBAAA;ChC2kHH;AgCtkHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChColHT;A+B3gHD;ECpEI,eAAA;EACA,uBAAA;ChCklHH;A+B9gHD;ECvGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCwnHD;AgCtnHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCwnHP;AgCtnHC;;;EAGE,uBAAA;ChCwnHH;AgCnnHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCioHT;A+BvjHD;ECrEI,eAAA;EACA,uBAAA;ChC+nHH;A+B1jHD;ECxGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCqqHD;AgCnqHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCqqHP;AgCnqHC;;;EAGE,uBAAA;ChCqqHH;AgChqHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC8qHT;A+BnmHD;ECtEI,eAAA;EACA,uBAAA;ChC4qHH;A+BtmHD;ECzGE,YAAA;EACA,0BAAA;EACA,iCAAA;ChCktHD;AgChtHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChCktHP;AgChtHC;;;EAGE,uBAAA;ChCktHH;AgC7sHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChC2tHT;A+B/oHD;ECvEI,eAAA;EACA,uBAAA;ChCytHH;A+BlpHD;EC1GE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC+vHD;AgC7vHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC+vHP;AgC7vHC;;;EAGE,uBAAA;ChC+vHH;AgC1vHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCwwHT;A+B3rHD;ECxEI,eAAA;EACA,uBAAA;ChCswHH;A+B9rHD;EC3GE,YAAA;EACA,0BAAA;EACA,iCAAA;ChC4yHD;AgC1yHC;;;;;;EAME,YAAA;EACA,0BAAA;EACI,iCAAA;ChC4yHP;AgC1yHC;;;EAGE,uBAAA;ChC4yHH;AgCvyHG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,iCAAA;ChCqzHT;A+BvuHD;ECzEI,eAAA;EACA,uBAAA;ChCmzHH;AACD;;;GAGG;AiC31HH;EACE,oBAAA;EACA,uBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;CjC61HD;AiC51HC;;;EAGE,0BAAA;CjC81HH;AiC11HD;EACE,gBAAA;EACA,mBAAA;EACA,YAAA;EACA,kBAAA;CjC41HD;AiC11HD;EACE,oBAAA;CjC41HD;AiC11HD;EACE,mBAAA;CjC41HD;AiCz1HD;EACE,oBAAA;CjC21HD;AiCz1HD;EACE,YAAA;EACA,UAAA;CjC21HD;AiCz1HD;;EAEE,eAAA;EACA,gBAAA;CjC21HD;AiCz1HD;;EAEE,gBAAA;CjC21HD;AiCz1HD;EACE,cAAA;EACA,UAAA;CjC21HD;AiCz1HD;EACE,gBAAA;EACA,iBAAA;EACA,oBAAA;CjC21HD;AiCz1HD;EACE,iBAAA;EACA,UAAA;EACA,WAAA;CjC21HD;AiC91HD;EAKI,YAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;CjC41HH;AiCp2HD;E9B8JU,0CAAA;EAAA,kCAAA;CH4sHT;AiC/1HK;E9BqFJ,iCAAA;EAGQ,yBAAA;CH6wHT;AiC/1HD;E9BuHU,4BAAA;CH6uHT;AiCj2HD;EACE,kBAAA;EACA,kBAAA;EACA,mBAAA;EACA,yCAAA;EACA,0CAAA;EACA,mBAAA;EACA,aAAA;CjCm2HD;AiCl2HC;EACE,8CAAA;CjCo2HH;AACD;;;GAGG;AkCr7HD;;;;;;EAGE,cAAA;ClC07HH;AkC/7HD;;EAQI,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,aAAA;ClC27HH;AkCx7HD;EACE,sBAAA;ClC07HD;AkCx7HD;EACE,0BAAA;EACA,iBAAA;ClC07HD;AkCx7HD;EACE,0BAAA;EACA,aAAA;ClC07HD;AkCx7HD;EACE,kBAAA;EACA,uBAAA;EAAA,sBAAA;EAAA,kBAAA;EACA,0BAAA;ClC07HD;AkCz7HD;EACE,gBAAA;EACA,iBAAA;EACA,aAAA;EACA,iBAAA;ClC27HD;AkCz7HD;EACE,mBAAA;EACA,mBAAA;ClC27HD;AkCz7HD;EACE,aAAA;EACA,WAAA;ClC27HD;AkCz7HD;EACE,cAAA;ClC27HD;AkCz7HD;;EAGI,0BAAA;ClC07HH;AkCz7HG;;EACE,cAAA;EACA,0BAAA;ClC47HL;AkCx7HD;EACE,YAAA;ClC07HD;AkCx7HD;EACE,uBAAA;ClC07HD;AkCz7HC;;EAEE,YAAA;ClC27HH;AkCt7HD;EAEI,0BAAA;EACA,iBAAA;ClCu7HH;AkCt7HG;EACE,sBAAA;ClCw7HL;AkCr7HC;EACE,sBAAA;ClCu7HH;AkCp7HD;EACE,0BAAA;EACA,sBAAA;EACA,kBAAA;EACA,YAAA;ClCs7HD;AkCp7HD;EACE,kBAAA;EACA,gCAAA;ClCs7HD;AkCr7HC;EACE,YAAA;ClCu7HH;AkCp7HD;EACE,oBAAA;ClCs7HD;AACD;;;GAGG;AmCzhIH;EACE,cAAA;CnC2hID;AmCzhID;EACE,aAAA;CnC2hID;AmCzhID;EACE,oBAAA;CnC2hID;AmCzhID;EACE,iBAAA;CnC2hID;AmCzhID;EACE,kBAAA;CnC2hID;AmCxhID;EACE,gBAAA;CnC0hID;AmCthID;EACE,eAAA;EACA,eAAA;EACA,mBAAA;CnCwhID;AmCvhIC;EACE,oBAAA;CnCyhIH;AmC9hID;EAQI,UAAA;EACA,WAAA;EACA,iBAAA;EACA,gBAAA;CnCyhIH;AmCpiID;EAcI,0BAAA;CnCyhIH;AmCphID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BE,uBAAA;CnCmjID;AmCjjID;EACE,YAAA;EACA,qCAAA;CnCmjID;AmCjjID;EACE,0BAAA;CnCmjID;AmCjjID;EACE,kCAAA;CnCmjID;AmCjjID;;;;;;EACE,qCAAA;CnCwjID;AmCtjID;;;;;EACE,qCAAA;CnC4jID;AmC1jID;;;;;EACE,qCAAA;CnCgkID;AmC9jID;EACE,qCAAA;CnCgkID;AmC9jID;;;EACE,qCAAA;CnCkkID;AmChkID;;;;;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmCpkID;EACE,qCAAA;CnCskID;AmClkID;EACE,YAAA;EACA,qCAAA;CnCokID;AmClkID;EACE,qCAAA;CnCokID;AmClkID;;;EACE,qCAAA;CnCskID;AmCpkID;;;EACE,qCAAA;CnCwkID;AmCtkID;;;EACE,qCAAA;CnC0kID;AmCxkID;EACE,qCAAA;CnC0kID;AmCxkID;;;EACE,qCAAA;CnC4kID;AmC1kID;;;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC5kID;EACE,qCAAA;CnC8kID;AmC1kID;EfnLE,cAAA;EAGA,0BAAA;CpB8vID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,uBAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,0BAAA;CnC2kID;AmCzkID;EACE,eAAA;CnC2kID;AmC1kIC;;EAEE,eAAA;CnC4kIH;AmCzkID;EACE,YAAA;CnC2kID;AmC1kIC;;EAEE,YAAA;CnC4kIH;AmCvkID;EACE,yBAAA;CnCykID;AmCrkID;EACE,qBAAA;CnCukID;AmCpkID;EACE,sBAAA;CnCskID;AmCnkID;EACE,qBAAA;CnCqkID;AmCjkID;EACE,2BAAA;CnCmkID;AmC/jID;;;;EACE,iBAAA;EACA,UAAA;EACA,WAAA;CnCokID;AmCjkID;EAEI,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;CnCkkIH;AmC7jID;E7B1NE,4BAAA;CN0xID;AmC3jIC;;;EACE,iBAAA;CnC+jIH;AmC5jID;EACE,gBAAA;CnC8jID;AmC1jID;EACE,uBAAA;EACA,sBAAA;EACA,uBAAA;CnC4jID;AmCvjID;E7BpOE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BwNA,YAAA;CnC8jID;AmC5jID;E7BxOE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6B4NA,YAAA;CnCmkID;AmCjkID;E7B5OE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BgOA,YAAA;CnCwkID;AmCtkID;E7BhPE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BoOA,YAAA;CnC6kID;AmC3kID;E7BpPE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BwOA,YAAA;CnCklID;AmChlID;E7BxPE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6B4OA,YAAA;CnCulID;AmCrlID;E7B5PE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BgPA,YAAA;CnC4lID;AmC1lID;E7BhQE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6BoPA,YAAA;CnCimID;AmC/lID;E7BpQE,4BAAA;EAYA,yDAAA;EAEA,2HAAA;E6BwPA,YAAA;CnCsmID;AmCpmID;E7BxQE,+BAAA;EAYA,4DAAA;EAEA,8HAAA;E6B4PA,YAAA;CnC2mID;AmCvmID;EAEI,gBAAA;CnCwmIH;AmCnmID;EACE,eAAA;CnCqmID;AmCjmID;EACE,2BAAA;CnCmmID;AmC/lID;EACE,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,YAAA;CnCimID;AmC/lID;EACE,YAAA;EACA,oBAAA;EACA,qBAAA;CnCimID;AmC/lID;EAEI,aAAA;EACA,YAAA;CnCgmIH;AmC/lIG;EACE,YAAA;CnCimIL;AmC3lID;EACE,iBAAA;CnC6lID;AE39IC;;EAEE,aAAA;EACA,eAAA;CF69IH;AE39IC;EACE,YAAA;CF69IH;AmCjmID;EAGI,YAAA;EACA,aAAA;EACA,YAAA;CnCimIH;AmCtmID;;;EAUI,eAAA;EACA,kBAAA;CnCimIH;AmC5mID;EAcI,gBAAA;EACA,iBAAA;CnCimIH;AmChnID;EAkBI,YAAA;EACA,gBAAA;CnCimIH;AmC/lIC;;;EAOI,kBAAA;CnC6lIL;AmCpmIC;EAUI,gBAAA;CnC6lIL;AmCvlID;;;;;EAGE,YAAA;CnC2lID;AmCzlID;;;EACE,sBAAA;EACA,uBAAA;CnC6lID;AmC/lID;EAII,kBAAA;CnC8lIH;AmC3lID;EACE,YAAA;EACA,aAAA;CnC6lID;AmC/lID;EAII,kBAAA;CnC8lIH;AmC3lID;EACE,aAAA;EACA,cAAA;CnC6lID;AmC/lID;EAII,mBAAA;CnC8lIH;AmC1lID;EACE,0BAAA;EACA,aAAA;CnC4lID;AmC1lID;EACE,0BAAA;EACA,aAAA;CnC4lID;AmCzlID;EACE,0BAAA;EACA,aAAA;EACA,oBAAA;EACA,oBAAA;CnC2lID;AmC/lID;EAOI,iBAAA;EACA,kBAAA;EACA,aAAA;EACA,YAAA;CnC2lIH;AmCrmID;EAaI,mBAAA;CnC2lIH;AmCxmID;EAgBI,UAAA;CnC2lIH;AmC3mID;EAmBI,YAAA;CnC2lIH;AmCvlID;EACE,kBAAA;CnCylID;AmCvlID;EACE,UAAA;EACA,oBAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;EACA,WAAA;EACA,mBAAA;EACA,WAAA;CnCylID;AmCvlID;EACE,oBAAA;EACA,wBAAA;EACA,oBAAA;CnCylID;AmCvlID;Ef9fE,cAAA;EAGA,0BAAA;CpBslJD;AmCzlIC;EfhgBA,WAAA;EAGA,2BAAA;CpB0lJD;AmCxlID;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;CnC0lID;AmC7lID;;EAMI,sBAAA;CnC2lIH;AACD;;;GAGG;AoC7jJH;EA1CE;;;;;IACE,wBAAA;GpC8mJD;EoCpmJD;;;IAGE,yBAAA;IACA,wBAAA;IjCyHF,8CAAA;IAGQ,sCAAA;GH8+IP;EoCvmJD;;IAEE,yBAAA;GpCymJD;EoCtmJD;IACE,YAAA;IACA,UAAA;IACA,UAAA;IACA,WAAA;GpCwmJD;EoCtmJD;IACE,YAAA;IACA,mBAAA;GpCwmJD;EoCrmJD;IACE,eAAA;GpCumJD;EoCxmJD;;IAII,8BAAA;GpCwmJH;CACF;;AqCrpJD;;;GAGG;ACMH;ECHE,0BAAA;CFAD;ACGD;ECAI,YAAA;CFAH;ACAD;;;;;;;ECUI,+BAAA;EACA,eAAA;CFDH;ACVD;ECgBI,YAAA;CFHH;AEIG;EACE,eAAA;EACA,+BAAA;CFFL;ACjBD;EAMQ,YAAA;CDcP;ACbO;EACE,0BAAA;CDeT;ACGG;EAZQ;IACE,2CAAA;GDYX;ECqBH;IA9Bc,YAAA;GDYX;ECXW;IACE,oBAAA;GDab;CACF;AClCD;EA8BM,0BAAA;CDOL;ACrCD;EAoCI,wBAAA;CDIH;ACxCD;;;ECsGI,0BAAA;CFzDH;AC7CD;;EC2GM,YAAA;CF1DL;AEgEG;EACE,eAAA;EACA,oBAAA;CF9DL;ACrDD;ECuHM,mCAAA;CF/DL;AEkEG;;EACE,YAAA;EACA,oBAAA;EACA,2BAAA;CF/DL;AC9DD;ECiIM,cAAA;EACA,oBAAA;CFhEL;AClED;ECuII,eAAA;CFlEH;AEmEG;EACE,sBAAA;CFjEL;ACxED;ECgJQ,eAAA;CFrEP;AEuEK;;EACE,YAAA;CFpEP;AC/ED;ECgEE,mBAAA;EA0FE,0BAAA;EACA,kBAAA;CFvEH;ACpFD;;EC6JM,iBAAA;EACA,0BAAA;EACA,8BAAA;EACA,aAAA;ECuBI,iCAAA;CHzFT;AC9FD;ECoKM,YAAA;EAhGJ,4BAAA;EACA,2BAAA;EACA,8BAAA;EACA,+BAAA;CF8BD;AEiEK;;EACE,uBAAA;EACA,YAAA;CF9DP;AEgEK;EACE,wBAAA;CF9DP;AC7GD;EC+KM,YAAA;EA3GJ,0BAAA;EACA,6BAAA;EACA,gCAAA;EACA,6BAAA;CF6CD;ACzED;EAEI,uBAAA;CD0EH;;AIhID;;;;;GAKG;ACGD;EACE,mBAAA;CDDH;ACIC;EACE,aAAA;EACA,mBAAA;EACA,OAAA;EACA,QAAA;EACA,YAAA;EACA,aAAA;CDFH;ACJC;EASI,WAAA;EAIA,yBAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,WAAA;EACA,eAAA;EACA,8BAAA;EACA,uDAAA;EAAA,+CAAA;EACA,aAAA;CDFL;ACIK;EACE,WAAA;CDFP;AC3BD;EAmCI,WAAA;EACA,sBAAA;CDLH;AC/BD;EAwCI,mBAAA;EACA,YAAA;EACA,QAAA;EACA,iBAAA;CDNH;ACrCD;EA+CI,oBAAA;EACA,aAAA;EACA,SAAA;EACA,kBAAA;CDPH;AC3CD;EAsDI,iBAAA;CDRH;;AErDD;EACE,0BAAA;CCCD;ADCD;EACE,uBAAA;EACA,oBAAA;EACA,iBAAA;EACA,eAAA;EACA,YAAA;CCCD;ADED;EACE,gBAAA;CCAD;ADGD;EACI,mBAAA;EACA,iBAAA;CCDH;ADID;EACI,eAAA;CCFH;ADMD;EACA,mBAAA;EACA,cAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,YAAA;EACA,aAAA;CCJC;ADOD;EACE,YAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;CCLD;ADQD;EACE,0BAAA;CCND;ADSD;EACI,YAAA;CCPH;ADUD;EACE,cAAA;EACA,aAAA;CCRD;ADYD;EACE,mBAAA;CCVD;ADaD;EACI,mBAAA;EACA,OAAA;EACA,SAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;EACA,kBAAA;EACA,yBAAA;EACA,WAAA;EACA,cAAA;EACA,kBAAA;EACA,gBAAA;EACA,eAAA;CCXH;ADaD;EACE,gBAAA;CCXD;ADaD;EACE,kBAAA;CCXD;ADaD;EACE,YAAA;EACA,uBAAA;CCXD;ADcD;EACE,eAAA;CCZD;ADcD;EACE,0BAAA;CCZD;ADgBD;EACE,mBAAA;EACA,aAAA;EACA,0BAAA;CCdD;ADiBD;EACE,aAAA;EACA,YAAA;EACA,kBAAA;CCfD;ADsBD;EACE,iBAAA;CCpBD;ADuBD;EACE,cAAA;EACA,cAAA;CCrBD;ADyBD;EACE,YAAA;CCvBD;ADyBD;EACE,eAAA;EACA,qCAAA;CCvBD;AD0BD;;EACE,eAAA;EACA,eAAA;CCvBD;AD0BD;EACQ,oBAAA;EACA,mBAAA;CCxBP;AD0BC;EACI,gBAAA;CCxBL;AD2BD;EACE,eAAA;EACA,8BAAA;EACA,oBAAA;CCzBD;AD4BD;EACE,eAAA;CC1BD;AD6BD;EACE,eAAA;CC3BD;AD8BD;EACE,eAAA;CC5BD;AD+BD;EACE,eAAA;CC7BD;ADgCD;EACE,eAAA;CC9BD;ADiCD;;;;;EACE,YAAA;CC3BD;AD8BD;EACC,gBAAA;EACA,OAAA;EACA,cAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA;EACA,aAAA;EACC,kBAAA;EACA,aAAA;EACA,cAAA;CC5BD;AD8BD;EACC,mBAAA;EACA,iBAAA;EACA,YAAA;EACA,iBAAA;EACA,iBAAA;EACA,8BAAA;CC5BA;AD8BD;EACC,mBAAA;EACA,UAAA;EACA,YAAA;EACA,sBAAA;EACA,qBAAA;EACA,+BAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,YAAA;EACA,sBAAA;EACA,oBAAA;CC5BA;AD8BD;EACC,YAAA;CC5BA;AD8BD;EACC,iBAAA;EACA,iBAAA;EACA,8BAAA;EACA,iCAAA;CC5BA;AD8BD;EACC,8BAAA;EACA,iCAAA;CC5BA;AD8BD;EACC,mBAAA;EACA,eAAA;EACA,cAAA;EACA,YAAA;EACA,sBAAA;CC5BA;AD8BD;EACC,iBAAA;EACA,YAAA;CC5BA;AD8BD;EACC,mBAAA;EACA,UAAA;EACA,YAAA;EACA,YAAA;CC5BA;AD+BA;EACE,gBAAA;EACA,cAAA;CC7BF;ADkCA;EAAY,iBAAA;CC/BZ;AACD,eAAe;ADiCd;EAAY,iCAAA;EAAkC,oBAAA;CC7B9C;AD8BA;EAA8B,WAAA;EAAY,mBAAA;CC1B1C;AD4BA;EAAiD,eAAA;EAAgB,gBAAA;EAAiB,mBAAA;CCvBlF;ADwBA;EAA8C,YAAA;EAAa,gBAAA;CCpB3D;ADqBA;EAA+C,mBAAA;EAAoB,YAAA;EAAa,aAAA;EAAc,eAAA;EAAgB,oBAAA;EAAqB,UAAA;EAAW,UAAA;EAAW,kBAAA;EAAmB,mBAAA;EAAoB,mBAAA;CCThM;ADUA;EAAqD,aAAA;EAAc,YAAA;EAAa,aAAA;EAAc,oBAAA;EAAqB,oBAAA;EAAqB,mBAAA;EAAoB,SAAA;EAAU,UAAA;CCAtK;ADCA;EAA0C,mBAAA;EAAoB,mBAAA;EAAoB,YAAA;EAAa,iBAAA;EAAkB,eAAA;CCMjH;ADLA;EAA0D,WAAA;EAAW,iBAAA;EAAkB,oBAAA;CCUvF;ADTA;EAAmE,YAAA;CCYnE;ADXA;EAAiE,WAAA;CCcjE;ADbA;EAA6E,UAAA;CCgB7E;ADfA;EAA4E,YAAA;CCkB5E;ADjBA;EAAwD,0BAAA;CCoBxD;ADnBA;EAA8D,WAAA;CCsB9D;ADrBA;EAAuD,UAAA;EAAW,WAAA;CCyBlE;ADxBA;EAAsD,WAAA;CC2BtD;AD1BA;EAAuD,qBAAA;CC6BvD;AACD,mBAAmB;AD3BnB;EACE,sBAAA;EACA,YAAA;EACA,iBAAA;EACA,aAAA;EACA,aAAA;EC6BA,iCAAiC;CAClC;AD1BD;EACE,YAAA;CC4BD;ADzBD;EACC,8BAAA;CC2BA;ADvBD;EACE,+BAAA;CCyBD;;ACvTD,eAAe;AA+Df;EACI;IACI,kCAAA;GAdL;EAiBC;IACI,iCAAA;GAfL;EAkBC;IACI,iCAAA;GAhBL;EAmBC;IACI,kCAAA;GAjBL;EAoBC;IACI,kCAAA;GAlBL;EAqBC;IACI,iCAAA;GAnBL;EAsBC;IACI,iCAAA;GApBL;EAuBC;IACI,kCAAA;GArBL;EAwBC;IACI,kCAAA;GAtBL;EAyBC;IACI,iCAAA;GAvBL;EA0BC;IACI,iCAAA;GAxBL;EA2BC;IACI,kCAAA;GAzBL;EA4BC;IACI,kCAAA;GA1BL;EA6BC;IACI,iCAAA;GA3BL;EA8BC;IACI,gCAAA;GA5BL;CACF;AA2JD;EACI;IACI,kCAAA;IAAA,0BAAA;GA3DL;EA8DC;IACI,iCAAA;IAAA,yBAAA;GA5DL;EA+DC;IACI,iCAAA;IAAA,yBAAA;GA7DL;EAgEC;IACI,kCAAA;IAAA,0BAAA;GA9DL;EAiEC;IACI,kCAAA;IAAA,0BAAA;GA/DL;EAkEC;IACI,iCAAA;IAAA,yBAAA;GAhEL;EAmEC;IACI,iCAAA;IAAA,yBAAA;GAjEL;EAoEC;IACI,kCAAA;IAAA,0BAAA;GAlEL;EAqEC;IACI,kCAAA;IAAA,0BAAA;GAnEL;EAsEC;IACI,iCAAA;IAAA,yBAAA;GApEL;EAuEC;IACI,iCAAA;IAAA,yBAAA;GArEL;EAwEC;IACI,kCAAA;IAAA,0BAAA;GAtEL;EAyEC;IACI,kCAAA;IAAA,0BAAA;GAvEL;EA0EC;IACI,iCAAA;IAAA,yBAAA;GAxEL;EA2EC;IACI,gCAAA;IAAA,wBAAA;GAzEL;CACF;AA4ED;;EACI,0CAAA;EACA,6BAAA;EACA,6BAAA;EACA,iCAAA;EAEA,6CAAA;EACA,gCAAA;EACA,gCAAA;EACA,oCAAA;EAEA,yCAAA;EACA,4BAAA;EACA,4BAAA;EACA,gCAAA;EAEA,6CAAA;EAAA,qCAAA;EACA,wBAAA;EACA,wBAAA;EACA,4BAAA;CA5EH;AACD,UAAU;AA6HV;EACI;IACI,kCAAA;GAxFL;EA2FC;IACI,iCAAA;GAzFL;EA4FC;IACI,kCAAA;GA1FL;EA6FC;IACI,iCAAA;GA3FL;EA8FC;IACI,kCAAA;GA5FL;EA+FC;IACI,iCAAA;GA7FL;EAgGC;IACI,kCAAA;GA9FL;EAiGC;IACI,iCAAA;GA/FL;EAkGC;IACI,kCAAA;GAhGL;EAmGC;IACI,iCAAA;GAjGL;EAoGC;IACI,gCAAA;GAlGL;CACF;AAmJD;EACI;IACI,kCAAA;IAAA,0BAAA;GA9GL;EAiHC;IACI,iCAAA;IAAA,yBAAA;GA/GL;EAkHC;IACI,kCAAA;IAAA,0BAAA;GAhHL;EAmHC;IACI,iCAAA;IAAA,yBAAA;GAjHL;EAoHC;IACI,kCAAA;IAAA,0BAAA;GAlHL;EAqHC;IACI,iCAAA;IAAA,yBAAA;GAnHL;EAsHC;IACI,kCAAA;IAAA,0BAAA;GApHL;EAuHC;IACI,iCAAA;IAAA,yBAAA;GArHL;EAwHC;IACI,kCAAA;IAAA,0BAAA;GAtHL;EAyHC;IACI,iCAAA;IAAA,yBAAA;GAvHL;EA0HC;IACI,gCAAA;IAAA,wBAAA;GAxHL;CACF;AA2HD;;EACI,sCAAA;EACA,6BAAA;EACA,6BAAA;EACA,iCAAA;EAEA,yCAAA;EACA,gCAAA;EACA,gCAAA;EACA,oCAAA;EAEA,qCAAA;EACA,4BAAA;EACA,4BAAA;EACA,gCAAA;EAEA,yCAAA;EAAA,iCAAA;EACA,wBAAA;EACA,wBAAA;EACA,4BAAA;CA3HH;AACD,cAAc;AA4Jd;EACI;IACI,sCAAA;GAnIL;EAsIC;IACI,qCAAA;GApIL;EAuIC;IACI,sCAAA;GArIL;EAwIC;IACI,qCAAA;GAtIL;EAyIC;IACI,sCAAA;GAvIL;EA0IC;IACI,qCAAA;GAxIL;EA2IC;IACI,mCAAA;GAzIL;CACF;AA0KD;EACI;IACI,sCAAA;IAAA,8BAAA;GAjJL;EAoJC;IACI,qCAAA;IAAA,6BAAA;GAlJL;EAqJC;IACI,sCAAA;IAAA,8BAAA;GAnJL;EAsJC;IACI,qCAAA;IAAA,6BAAA;GApJL;EAuJC;IACI,sCAAA;IAAA,8BAAA;GArJL;EAwJC;IACI,qCAAA;IAAA,6BAAA;GAtJL;EAyJC;IACI,mCAAA;IAAA,2BAAA;GAvJL;CACF;AA0JD;;EAEI,6CAAA;EAEA,qCAAA;CAvJH;AACD,gBAAgB;AAwLhB;EACI;IACI,mCAAA;GA/JL;EAkKC;IACI,qCAAA;GAhKL;EAmKC;IACI,mCAAA;GAjKL;EAoKC;IACI,qCAAA;GAlKL;EAqKC;IACI,mCAAA;GAnKL;EAsKC;IACI,qCAAA;GApKL;EAuKC;IACI,mCAAA;GArKL;CACF;AAsMD;EACI;IACI,mCAAA;IAAA,2BAAA;GA7KL;EAgLC;IACI,qCAAA;IAAA,6BAAA;GA9KL;EAiLC;IACI,mCAAA;IAAA,2BAAA;GA/KL;EAkLC;IACI,qCAAA;IAAA,6BAAA;GAhLL;EAmLC;IACI,mCAAA;IAAA,2BAAA;GAjLL;EAoLC;IACI,qCAAA;IAAA,6BAAA;GAlLL;EAqLC;IACI,mCAAA;IAAA,2BAAA;GAnLL;CACF;AAsLD;;EAEI,+CAAA;EAEA,uCAAA;CAnLH;AACD,cAAc;AAgMd;EACI;;;IACI,WAAA;GAjLL;EAoLC;;IACI,WAAA;GAjLL;CACF;AA8LD;EACI;;;IACI,WAAA;GA/KL;EAkLC;;IACI,WAAA;GA/KL;CACF;AAkLD;;EAEI,0CAAA;EAEA,kCAAA;CA/KH;AACD,YAAY;AAgMZ;EACI;;;;;IACI,iCAAA;GA3KL;EA8KC;IACI,qCAAA;GA5KL;EA+KC;IACI,qCAAA;GA7KL;CACF;AA8LD;EACI;;;;;IACI,iCAAA;IAAA,yBAAA;GAzKL;EA4KC;IACI,qCAAA;IAAA,6BAAA;GA1KL;EA6KC;IACI,qCAAA;IAAA,6BAAA;GA3KL;CACF;AA8KD;;EAEI,2CAAA;EAEA,mCAAA;CA3KH;AACD,UAAU;AAwLV;EACI;IACI,gCAAA;GA9KL;EAiLC;IACI,kCAAA;GA/KL;CACF;AA4LD;EACI;IACI,gCAAA;IAAA,wBAAA;GAlLL;EAqLC;IACI,kCAAA;IAAA,0BAAA;GAnLL;CACF;AAsLD;;EAEI,6CAAA;EAEA,qCAAA;CAnLH;AACD,WAAW;AAoMX;EACI;IACI,iCAAA;GAvLL;EA0LC;IACI,oCAAA;GAxLL;EA2LC;IACI,iCAAA;GAzLL;CACF;AA0MD;EACI;IACI,iCAAA;IAAA,yBAAA;GA7LL;EAgMC;IACI,oCAAA;IAAA,4BAAA;GA9LL;EAiMC;IACI,iCAAA;IAAA,yBAAA;GA/LL;CACF;AAkMD;;EAEI,4CAAA;EAEA,oCAAA;CA/LH;AACD,WAAW;AAgNX;EACI;IACI,4BAAA;GAnML;EAsMC;IACI,8BAAA;GApML;EAuMC;IACI,4BAAA;GArML;CACF;AAsND;EACI;IACI,8BAAA;IAAA,sBAAA;GAzML;EA4MC;IACI,8BAAA;IAAA,sBAAA;GA1ML;EA6MC;IACI,4BAAA;IAAA,oBAAA;GA3ML;CACF;AA8MD;;EAEI,4CAAA;EAEA,oCAAA;CA3MH;AACD,WAAW;AA8MX;;EACI,6CAAA;CA3MH","file":"app.css","sourcesContent":["/*!\n *   AdminLTE v2.3.0\n *   Author: Almsaeed Studio\n *\t Website: Almsaeed Studio <http://almsaeedstudio.com>\n *   License: Open source - MIT\n *           Please visit http://opensource.org/licenses/MIT for more information\n!*/\n@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);\n/*\n * Core: General Layout Style\n * -------------------------\n */\nhtml,\nbody {\n  min-height: 100%;\n}\n.layout-boxed html,\n.layout-boxed body {\n  height: 100%;\n}\nbody {\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-weight: 400;\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n/* Layout */\n.wrapper {\n  min-height: 100%;\n  position: static;\n  overflow: hidden;\n}\n.wrapper:before,\n.wrapper:after {\n  content: \" \";\n  display: table;\n}\n.wrapper:after {\n  clear: both;\n}\n.layout-boxed .wrapper {\n  max-width: 1250px;\n  margin: 0 auto;\n  min-height: 100%;\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);\n  position: relative;\n}\n.layout-boxed {\n  background: url('../img/boxed-bg.jpg') repeat fixed;\n}\n/*\n * Content Wrapper - contains the main content\n * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```\n */\n.content-wrapper,\n.right-side,\n.main-footer {\n  -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out;\n  margin-left: 230px;\n  z-index: 820;\n}\n.layout-top-nav .content-wrapper,\n.layout-top-nav .right-side,\n.layout-top-nav .main-footer {\n  margin-left: 0;\n}\n@media (max-width: 767px) {\n  .content-wrapper,\n  .right-side,\n  .main-footer {\n    margin-left: 0;\n  }\n}\n@media (min-width: 768px) {\n  .sidebar-collapse .content-wrapper,\n  .sidebar-collapse .right-side,\n  .sidebar-collapse .main-footer {\n    margin-left: 0;\n  }\n}\n@media (max-width: 767px) {\n  .sidebar-open .content-wrapper,\n  .sidebar-open .right-side,\n  .sidebar-open .main-footer {\n    -webkit-transform: translate(230px, 0);\n    -ms-transform: translate(230px, 0);\n    -o-transform: translate(230px, 0);\n    transform: translate(230px, 0);\n  }\n}\n.content-wrapper,\n.right-side {\n  min-height: 100%;\n  background-color: #ecf0f5;\n  z-index: 800;\n}\n.main-footer {\n  background: #fff;\n  padding: 15px;\n  color: #444;\n  border-top: 1px solid #d2d6de;\n}\n/* Fixed layout */\n.fixed .main-header,\n.fixed .main-sidebar,\n.fixed .left-side {\n  position: fixed;\n}\n.fixed .main-header {\n  top: 0;\n  right: 0;\n  left: 0;\n}\n.fixed .content-wrapper,\n.fixed .right-side {\n  padding-top: 50px;\n}\n@media (max-width: 767px) {\n  .fixed .content-wrapper,\n  .fixed .right-side {\n    padding-top: 100px;\n  }\n}\n.fixed.layout-boxed .wrapper {\n  max-width: 100%;\n}\nbody.hold-transition .content-wrapper,\nbody.hold-transition .right-side,\nbody.hold-transition .main-footer,\nbody.hold-transition .main-sidebar,\nbody.hold-transition .left-side,\nbody.hold-transition .main-header > .navbar,\nbody.hold-transition .main-header .logo {\n  /* Fix for IE */\n  -webkit-transition: none;\n  -o-transition: none;\n  transition: none;\n}\n/* Content */\n.content {\n  min-height: 250px;\n  padding: 15px;\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n/* H1 - H6 font */\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: 'Source Sans Pro', sans-serif;\n}\n/* General Links */\na {\n  color: #3c8dbc;\n}\na:hover,\na:active,\na:focus {\n  outline: none;\n  text-decoration: none;\n  color: #72afd2;\n}\n/* Page Header */\n.page-header {\n  margin: 10px 0 20px 0;\n  font-size: 22px;\n}\n.page-header > small {\n  color: #666;\n  display: block;\n  margin-top: 5px;\n}\n/*\n * Component: Main Header\n * ----------------------\n */\n.main-header {\n  position: relative;\n  max-height: 100px;\n  z-index: 1030;\n}\n.main-header > .navbar {\n  -webkit-transition: margin-left 0.3s ease-in-out;\n  -o-transition: margin-left 0.3s ease-in-out;\n  transition: margin-left 0.3s ease-in-out;\n  margin-bottom: 0;\n  margin-left: 230px;\n  border: none;\n  min-height: 50px;\n  border-radius: 0;\n}\n.layout-top-nav .main-header > .navbar {\n  margin-left: 0;\n}\n.main-header #navbar-search-input.form-control {\n  background: rgba(255, 255, 255, 0.2);\n  border-color: transparent;\n}\n.main-header #navbar-search-input.form-control:focus,\n.main-header #navbar-search-input.form-control:active {\n  border-color: rgba(0, 0, 0, 0.1);\n  background: rgba(255, 255, 255, 0.9);\n}\n.main-header #navbar-search-input.form-control::-moz-placeholder {\n  color: #ccc;\n  opacity: 1;\n}\n.main-header #navbar-search-input.form-control:-ms-input-placeholder {\n  color: #ccc;\n}\n.main-header #navbar-search-input.form-control::-webkit-input-placeholder {\n  color: #ccc;\n}\n.main-header .navbar-custom-menu,\n.main-header .navbar-right {\n  float: right;\n}\n@media (max-width: 991px) {\n  .main-header .navbar-custom-menu a,\n  .main-header .navbar-right a {\n    color: inherit;\n    background: transparent;\n  }\n}\n@media (max-width: 767px) {\n  .main-header .navbar-right {\n    float: none;\n  }\n  .navbar-collapse .main-header .navbar-right {\n    margin: 7.5px -15px;\n  }\n  .main-header .navbar-right > li {\n    color: inherit;\n    border: 0;\n  }\n}\n.main-header .sidebar-toggle {\n  float: left;\n  background-color: transparent;\n  background-image: none;\n  padding: 15px 15px;\n  font-family: fontAwesome;\n}\n.main-header .sidebar-toggle:before {\n  content: \"\\f0c9\";\n}\n.main-header .sidebar-toggle:hover {\n  color: #fff;\n}\n.main-header .sidebar-toggle:focus,\n.main-header .sidebar-toggle:active {\n  background: transparent;\n}\n.main-header .sidebar-toggle .icon-bar {\n  display: none;\n}\n.main-header .navbar .nav > li.user > a > .fa,\n.main-header .navbar .nav > li.user > a > .glyphicon,\n.main-header .navbar .nav > li.user > a > .ion {\n  margin-right: 5px;\n}\n.main-header .navbar .nav > li > a > .label {\n  position: absolute;\n  top: 9px;\n  right: 7px;\n  text-align: center;\n  font-size: 9px;\n  padding: 2px 3px;\n  line-height: .9;\n}\n.main-header .logo {\n  -webkit-transition: width 0.3s ease-in-out;\n  -o-transition: width 0.3s ease-in-out;\n  transition: width 0.3s ease-in-out;\n  display: block;\n  float: left;\n  height: 50px;\n  font-size: 20px;\n  line-height: 50px;\n  text-align: center;\n  width: 230px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  padding: 0 15px;\n  font-weight: 300;\n  overflow: hidden;\n}\n.main-header .logo .logo-lg {\n  display: block;\n}\n.main-header .logo .logo-mini {\n  display: none;\n}\n.main-header .navbar-brand {\n  color: #fff;\n}\n.content-header {\n  position: relative;\n  padding: 15px 15px 0 15px;\n}\n.content-header > h1 {\n  margin: 0;\n  font-size: 24px;\n}\n.content-header > h1 > small {\n  font-size: 15px;\n  display: inline-block;\n  padding-left: 4px;\n  font-weight: 300;\n}\n.content-header > .breadcrumb {\n  float: right;\n  background: transparent;\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 12px;\n  padding: 7px 5px;\n  position: absolute;\n  top: 15px;\n  right: 10px;\n  border-radius: 2px;\n}\n.content-header > .breadcrumb > li > a {\n  color: #444;\n  text-decoration: none;\n  display: inline-block;\n}\n.content-header > .breadcrumb > li > a > .fa,\n.content-header > .breadcrumb > li > a > .glyphicon,\n.content-header > .breadcrumb > li > a > .ion {\n  margin-right: 5px;\n}\n.content-header > .breadcrumb > li + li:before {\n  content: '>\\00a0';\n}\n@media (max-width: 991px) {\n  .content-header > .breadcrumb {\n    position: relative;\n    margin-top: 5px;\n    top: 0;\n    right: 0;\n    float: none;\n    background: #d2d6de;\n    padding-left: 10px;\n  }\n  .content-header > .breadcrumb li:before {\n    color: #97a0b3;\n  }\n}\n.navbar-toggle {\n  color: #fff;\n  border: 0;\n  margin: 0;\n  padding: 15px 15px;\n}\n@media (max-width: 991px) {\n  .navbar-custom-menu .navbar-nav > li {\n    float: left;\n  }\n  .navbar-custom-menu .navbar-nav {\n    margin: 0;\n    float: left;\n  }\n  .navbar-custom-menu .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n    line-height: 20px;\n  }\n}\n@media (max-width: 767px) {\n  .main-header {\n    position: relative;\n  }\n  .main-header .logo,\n  .main-header .navbar {\n    width: 100%;\n    float: none;\n  }\n  .main-header .navbar {\n    margin: 0;\n  }\n  .main-header .navbar-custom-menu {\n    float: right;\n  }\n}\n@media (max-width: 991px) {\n  .navbar-collapse.pull-left {\n    float: none!important;\n  }\n  .navbar-collapse.pull-left + .navbar-custom-menu {\n    display: block;\n    position: absolute;\n    top: 0;\n    right: 40px;\n  }\n}\n@media (max-width: 991px) {\n  .content-header {\n    padding-top: 110px;\n  }\n}\n@media (max-width: 991px) {\n  ul.sidebar-menu {\n    padding-top: 120px;\n  }\n}\n@media (max-width: 991px) {\n  .sidebar-toggle-mobile a {\n    color: white;\n  }\n}\n/*\n * Component: Sidebar\n * ------------------\n */\n.main-sidebar,\n.left-side {\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding-top: 50px;\n  min-height: 100%;\n  width: 230px;\n  z-index: 810;\n  -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out;\n  -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out;\n  -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out;\n  transition: transform 0.3s ease-in-out, width 0.3s ease-in-out;\n}\n@media (max-width: 767px) {\n  .main-sidebar,\n  .left-side {\n    padding-top: 100px;\n  }\n}\n@media (max-width: 767px) {\n  .main-sidebar,\n  .left-side {\n    -webkit-transform: translate(-230px, 0);\n    -ms-transform: translate(-230px, 0);\n    -o-transform: translate(-230px, 0);\n    transform: translate(-230px, 0);\n  }\n}\n@media (min-width: 768px) {\n  .sidebar-collapse .main-sidebar,\n  .sidebar-collapse .left-side {\n    -webkit-transform: translate(-230px, 0);\n    -ms-transform: translate(-230px, 0);\n    -o-transform: translate(-230px, 0);\n    transform: translate(-230px, 0);\n  }\n}\n@media (max-width: 767px) {\n  .sidebar-open .main-sidebar,\n  .sidebar-open .left-side {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    -o-transform: translate(0, 0);\n    transform: translate(0, 0);\n  }\n}\n.sidebar {\n  padding-bottom: 10px;\n}\n.sidebar-form input:focus {\n  border-color: transparent;\n}\n.user-panel {\n  position: relative;\n  width: 100%;\n  padding: 10px;\n  overflow: hidden;\n}\n.user-panel:before,\n.user-panel:after {\n  content: \" \";\n  display: table;\n}\n.user-panel:after {\n  clear: both;\n}\n.user-panel > .image > img {\n  width: 100%;\n  max-width: 45px;\n  height: auto;\n}\n.user-panel > .info {\n  padding: 5px 5px 5px 15px;\n  line-height: 1;\n  position: absolute;\n  left: 55px;\n}\n.user-panel > .info > p {\n  font-weight: 600;\n  margin-bottom: 9px;\n}\n.user-panel > .info > a {\n  text-decoration: none;\n  padding-right: 5px;\n  margin-top: 3px;\n  font-size: 11px;\n}\n.user-panel > .info > a > .fa,\n.user-panel > .info > a > .ion,\n.user-panel > .info > a > .glyphicon {\n  margin-right: 3px;\n}\n.sidebar-menu {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.sidebar-menu > li {\n  position: relative;\n  margin: 0;\n  padding: 0;\n}\n.sidebar-menu > li > a {\n  padding: 12px 5px 12px 15px;\n  display: block;\n}\n.sidebar-menu > li > a > .fa,\n.sidebar-menu > li > a > .glyphicon,\n.sidebar-menu > li > a > .ion {\n  width: 20px;\n}\n.sidebar-menu > li .label,\n.sidebar-menu > li .badge {\n  margin-top: 3px;\n  margin-right: 5px;\n}\n.sidebar-menu li.header {\n  padding: 10px 25px 10px 15px;\n  font-size: 12px;\n}\n.sidebar-menu li > a > .fa-angle-left {\n  width: auto;\n  height: auto;\n  padding: 0;\n  margin-right: 10px;\n  margin-top: 3px;\n}\n.sidebar-menu li.active > a > .fa-angle-left {\n  -webkit-transform: rotate(-90deg);\n  -ms-transform: rotate(-90deg);\n  -o-transform: rotate(-90deg);\n  transform: rotate(-90deg);\n}\n.sidebar-menu li.active > .treeview-menu {\n  display: block;\n}\n.sidebar-menu .treeview-menu {\n  display: none;\n  list-style: none;\n  padding: 0;\n  margin: 0;\n  padding-left: 5px;\n}\n.sidebar-menu .treeview-menu .treeview-menu {\n  padding-left: 20px;\n}\n.sidebar-menu .treeview-menu > li {\n  margin: 0;\n}\n.sidebar-menu .treeview-menu > li > a {\n  padding: 5px 5px 5px 15px;\n  display: block;\n  font-size: 14px;\n}\n.sidebar-menu .treeview-menu > li > a > .fa,\n.sidebar-menu .treeview-menu > li > a > .glyphicon,\n.sidebar-menu .treeview-menu > li > a > .ion {\n  width: 20px;\n}\n.sidebar-menu .treeview-menu > li > a > .fa-angle-left,\n.sidebar-menu .treeview-menu > li > a > .fa-angle-down {\n  width: auto;\n}\n/*\n * Component: Sidebar Mini\n */\n@media (min-width: 768px) {\n  .sidebar-mini.sidebar-collapse .content-wrapper,\n  .sidebar-mini.sidebar-collapse .right-side,\n  .sidebar-mini.sidebar-collapse .main-footer {\n    margin-left: 50px!important;\n    z-index: 840;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    -o-transform: translate(0, 0);\n    transform: translate(0, 0);\n    width: 50px!important;\n    z-index: 850;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li {\n    position: relative;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a {\n    margin-right: 0;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span {\n    border-top-right-radius: 4px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span {\n    border-bottom-right-radius: 4px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {\n    padding-top: 5px;\n    padding-bottom: 5px;\n    border-bottom-right-radius: 4px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right),\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {\n    display: block!important;\n    position: absolute;\n    width: 180px;\n    left: 50px;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span {\n    top: 0;\n    margin-left: -3px;\n    padding: 12px 5px 12px 20px;\n    background-color: inherit;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {\n    top: 44px;\n    margin-left: 0;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info,\n  .sidebar-mini.sidebar-collapse .sidebar-form,\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span,\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu,\n  .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right,\n  .sidebar-mini.sidebar-collapse .sidebar-menu li.header {\n    display: none!important;\n    -webkit-transform: translateZ(0);\n  }\n  .sidebar-mini.sidebar-collapse .main-header .logo {\n    width: 50px;\n  }\n  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini {\n    display: block;\n    margin-left: -15px;\n    margin-right: -15px;\n    font-size: 18px;\n  }\n  .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg {\n    display: none;\n  }\n  .sidebar-mini.sidebar-collapse .main-header .navbar {\n    margin-left: 50px;\n  }\n}\n.sidebar-menu,\n.main-sidebar .user-panel,\n.sidebar-menu > li.header {\n  white-space: nowrap;\n  overflow: hidden;\n}\n.sidebar-menu:hover {\n  overflow: visible;\n}\n.sidebar-form,\n.sidebar-menu > li.header {\n  overflow: hidden;\n  text-overflow: clip;\n}\n.sidebar-menu li > a {\n  position: relative;\n}\n.sidebar-menu li > a > .pull-right {\n  position: absolute;\n  top: 50%;\n  right: 10px;\n  margin-top: -7px;\n}\n/*\n * Component: Control sidebar. By default, this is the right sidebar.\n */\n.control-sidebar-bg {\n  position: fixed;\n  z-index: 1000;\n  bottom: 0;\n}\n.control-sidebar-bg,\n.control-sidebar {\n  top: 0;\n  right: -230px;\n  width: 230px;\n  -webkit-transition: right 0.3s ease-in-out;\n  -o-transition: right 0.3s ease-in-out;\n  transition: right 0.3s ease-in-out;\n}\n.control-sidebar {\n  position: absolute;\n  padding-top: 50px;\n  z-index: 1010;\n}\n@media (max-width: 768px) {\n  .control-sidebar {\n    padding-top: 100px;\n  }\n}\n.control-sidebar > .tab-content {\n  padding: 10px 15px;\n}\n.control-sidebar.control-sidebar-open,\n.control-sidebar.control-sidebar-open + .control-sidebar-bg {\n  right: 0;\n}\n.control-sidebar-open .control-sidebar-bg,\n.control-sidebar-open .control-sidebar {\n  right: 0;\n}\n@media (min-width: 768px) {\n  .control-sidebar-open .content-wrapper,\n  .control-sidebar-open .right-side,\n  .control-sidebar-open .main-footer {\n    margin-right: 230px;\n  }\n}\n.nav-tabs.control-sidebar-tabs > li:first-of-type > a,\n.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover,\n.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus {\n  border-left-width: 0;\n}\n.nav-tabs.control-sidebar-tabs > li > a {\n  border-radius: 0;\n}\n.nav-tabs.control-sidebar-tabs > li > a,\n.nav-tabs.control-sidebar-tabs > li > a:hover {\n  border-top: none;\n  border-right: none;\n  border-left: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n}\n.nav-tabs.control-sidebar-tabs > li > a .icon {\n  font-size: 16px;\n}\n.nav-tabs.control-sidebar-tabs > li.active > a,\n.nav-tabs.control-sidebar-tabs > li.active > a:hover,\n.nav-tabs.control-sidebar-tabs > li.active > a:focus,\n.nav-tabs.control-sidebar-tabs > li.active > a:active {\n  border-top: none;\n  border-right: none;\n  border-bottom: none;\n}\n@media (max-width: 768px) {\n  .nav-tabs.control-sidebar-tabs {\n    display: table;\n  }\n  .nav-tabs.control-sidebar-tabs > li {\n    display: table-cell;\n  }\n}\n.control-sidebar-heading {\n  font-weight: 400;\n  font-size: 16px;\n  padding: 10px 0;\n  margin-bottom: 10px;\n}\n.control-sidebar-subheading {\n  display: block;\n  font-weight: 400;\n  font-size: 14px;\n}\n.control-sidebar-menu {\n  list-style: none;\n  padding: 0;\n  margin: 0 -15px;\n}\n.control-sidebar-menu > li > a {\n  display: block;\n  padding: 10px 15px;\n}\n.control-sidebar-menu > li > a:before,\n.control-sidebar-menu > li > a:after {\n  content: \" \";\n  display: table;\n}\n.control-sidebar-menu > li > a:after {\n  clear: both;\n}\n.control-sidebar-menu > li > a > .control-sidebar-subheading {\n  margin-top: 0;\n}\n.control-sidebar-menu .menu-icon {\n  float: left;\n  width: 35px;\n  height: 35px;\n  border-radius: 50%;\n  text-align: center;\n  line-height: 35px;\n}\n.control-sidebar-menu .menu-info {\n  margin-left: 45px;\n  margin-top: 3px;\n}\n.control-sidebar-menu .menu-info > .control-sidebar-subheading {\n  margin: 0;\n}\n.control-sidebar-menu .menu-info > p {\n  margin: 0;\n  font-size: 11px;\n}\n.control-sidebar-menu .progress {\n  margin: 0;\n}\n.control-sidebar-dark {\n  color: #b8c7ce;\n}\n.control-sidebar-dark,\n.control-sidebar-dark + .control-sidebar-bg {\n  background: #222d32;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs {\n  border-bottom: #1c2529;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a {\n  background: #181f23;\n  color: #b8c7ce;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus {\n  border-left-color: #141a1d;\n  border-bottom-color: #141a1d;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active {\n  background: #1c2529;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover {\n  color: #fff;\n}\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus,\n.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active {\n  background: #222d32;\n  color: #fff;\n}\n.control-sidebar-dark .control-sidebar-heading,\n.control-sidebar-dark .control-sidebar-subheading {\n  color: #fff;\n}\n.control-sidebar-dark .control-sidebar-menu > li > a:hover {\n  background: #1e282c;\n}\n.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p {\n  color: #b8c7ce;\n}\n.control-sidebar-light {\n  color: #5e5e5e;\n}\n.control-sidebar-light,\n.control-sidebar-light + .control-sidebar-bg {\n  background: #f9fafc;\n  border-left: 1px solid #d2d6de;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs {\n  border-bottom: #d2d6de;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a {\n  background: #e8ecf4;\n  color: #444;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus {\n  border-left-color: #d2d6de;\n  border-bottom-color: #d2d6de;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active {\n  background: #eff1f7;\n}\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus,\n.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active {\n  background: #f9fafc;\n  color: #111;\n}\n.control-sidebar-light .control-sidebar-heading,\n.control-sidebar-light .control-sidebar-subheading {\n  color: #111;\n}\n.control-sidebar-light .control-sidebar-menu {\n  margin-left: -14px;\n}\n.control-sidebar-light .control-sidebar-menu > li > a:hover {\n  background: #f4f4f5;\n}\n.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p {\n  color: #5e5e5e;\n}\n/*\n * Component: Dropdown menus\n * -------------------------\n */\n/*Dropdowns in general*/\n.dropdown-menu {\n  box-shadow: none;\n  border-color: #eee;\n}\n.dropdown-menu > li > a {\n  color: #777;\n}\n.dropdown-menu > li > a > .glyphicon,\n.dropdown-menu > li > a > .fa,\n.dropdown-menu > li > a > .ion {\n  margin-right: 10px;\n}\n.dropdown-menu > li > a:hover {\n  background-color: #e1e3e9;\n  color: #333;\n}\n.dropdown-menu > .divider {\n  background-color: #eee;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu,\n.navbar-nav > .messages-menu > .dropdown-menu,\n.navbar-nav > .tasks-menu > .dropdown-menu {\n  width: 280px;\n  padding: 0 0 0 0;\n  margin: 0;\n  top: 100%;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li,\n.navbar-nav > .messages-menu > .dropdown-menu > li,\n.navbar-nav > .tasks-menu > .dropdown-menu > li {\n  position: relative;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li.header,\n.navbar-nav > .messages-menu > .dropdown-menu > li.header,\n.navbar-nav > .tasks-menu > .dropdown-menu > li.header {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n  background-color: #ffffff;\n  padding: 7px 10px;\n  border-bottom: 1px solid #f4f4f4;\n  color: #444444;\n  font-size: 14px;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,\n.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,\n.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n  font-size: 12px;\n  background-color: #fff;\n  padding: 7px 10px;\n  border-bottom: 1px solid #eeeeee;\n  color: #444!important;\n  text-align: center;\n}\n@media (max-width: 991px) {\n  .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,\n  .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,\n  .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {\n    background: #fff!important;\n    color: #444!important;\n  }\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover,\n.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover,\n.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover {\n  text-decoration: none;\n  font-weight: normal;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu,\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu {\n  max-height: 200px;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow-x: hidden;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a,\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {\n  display: block;\n  white-space: nowrap;\n  /* Prevent text from breaking */\n  border-bottom: 1px solid #f4f4f4;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover,\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover {\n  background: #f4f4f4;\n  text-decoration: none;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a {\n  color: #444444;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  padding: 10px;\n}\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon,\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa,\n.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion {\n  width: 20px;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a {\n  margin: 0;\n  padding: 10px 10px;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img {\n  margin: auto 10px auto auto;\n  width: 40px;\n  height: 40px;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 {\n  padding: 0;\n  margin: 0 0 0 45px;\n  color: #444444;\n  font-size: 15px;\n  position: relative;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small {\n  color: #999999;\n  font-size: 10px;\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p {\n  margin: 0 0 0 45px;\n  font-size: 12px;\n  color: #888888;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before,\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {\n  content: \" \";\n  display: table;\n}\n.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {\n  clear: both;\n}\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {\n  padding: 10px;\n}\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 {\n  font-size: 14px;\n  padding: 0;\n  margin: 0 0 10px 0;\n  color: #666666;\n}\n.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress {\n  padding: 0;\n  margin: 0;\n}\n.navbar-nav > .user-menu > .dropdown-menu {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  padding: 1px 0 0 0;\n  border-top-width: 0;\n  width: 280px;\n}\n.navbar-nav > .user-menu > .dropdown-menu,\n.navbar-nav > .user-menu > .dropdown-menu > .user-body {\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header {\n  height: 175px;\n  padding: 10px;\n  text-align: center;\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img {\n  z-index: 5;\n  height: 90px;\n  width: 90px;\n  border: 3px solid;\n  border-color: transparent;\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p {\n  z-index: 5;\n  color: #fff;\n  color: rgba(255, 255, 255, 0.8);\n  font-size: 17px;\n  margin-top: 10px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small {\n  display: block;\n  font-size: 12px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body {\n  padding: 15px;\n  border-bottom: 1px solid #f4f4f4;\n  border-top: 1px solid #dddddd;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body:before,\n.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {\n  content: \" \";\n  display: table;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {\n  clear: both;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-body a {\n  color: #444 !important;\n}\n@media (max-width: 991px) {\n  .navbar-nav > .user-menu > .dropdown-menu > .user-body a {\n    background: #fff !important;\n    color: #444 !important;\n  }\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer {\n  background-color: #f9f9f9;\n  padding: 10px;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before,\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {\n  content: \" \";\n  display: table;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {\n  clear: both;\n}\n.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default {\n  color: #666666;\n}\n@media (max-width: 991px) {\n  .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover {\n    background-color: #f9f9f9;\n  }\n}\n.navbar-nav > .user-menu .user-image {\n  float: left;\n  width: 25px;\n  height: 25px;\n  border-radius: 50%;\n  margin-right: 10px;\n  margin-top: -2px;\n}\n@media (max-width: 767px) {\n  .navbar-nav > .user-menu .user-image {\n    float: none;\n    margin-right: 0;\n    margin-top: -8px;\n    line-height: 10px;\n  }\n}\n/* Add fade animation to dropdown menus by appending\n the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/\n.open:not(.dropup) > .animated-dropdown-menu {\n  backface-visibility: visible !important;\n  -webkit-animation: flipInX 0.7s both;\n  -o-animation: flipInX 0.7s both;\n  animation: flipInX 0.7s both;\n}\n@keyframes flipInX {\n  0% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transition-timing-function: ease-in;\n  }\n  60% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    transform: perspective(400px);\n  }\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n  }\n}\n/* Fix dropdown menu in navbars */\n.navbar-custom-menu > .navbar-nav > li {\n  position: relative;\n}\n.navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n  position: absolute;\n  right: 0;\n  left: auto;\n}\n@media (max-width: 991px) {\n  .navbar-custom-menu > .navbar-nav {\n    float: right;\n  }\n  .navbar-custom-menu > .navbar-nav > li {\n    position: static;\n  }\n  .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n    position: absolute;\n    right: 5%;\n    left: auto;\n    border: 1px solid #ddd;\n    background: #fff;\n  }\n}\n/*\n * Component: Form\n * ---------------\n */\n.form-control {\n  border-radius: 0;\n  box-shadow: none;\n  border-color: #d2d6de;\n}\n.form-control:focus {\n  border-color: #3c8dbc;\n  box-shadow: none;\n}\n.form-control::-moz-placeholder,\n.form-control:-ms-input-placeholder,\n.form-control::-webkit-input-placeholder {\n  color: #bbb;\n  opacity: 1;\n}\n.form-control:not(select) {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n.form-group.has-success label {\n  color: #00a65a;\n}\n.form-group.has-success .form-control {\n  border-color: #00a65a;\n  box-shadow: none;\n}\n.form-group.has-warning label {\n  color: #f39c12;\n}\n.form-group.has-warning .form-control {\n  border-color: #f39c12;\n  box-shadow: none;\n}\n.form-group.has-error label {\n  color: #dd4b39;\n}\n.form-group.has-error .form-control {\n  border-color: #dd4b39;\n  box-shadow: none;\n}\n/* Input group */\n.input-group .input-group-addon {\n  border-radius: 0;\n  border-color: #d2d6de;\n  background-color: #fff;\n}\n/* button groups */\n.btn-group-vertical .btn.btn-flat:first-of-type,\n.btn-group-vertical .btn.btn-flat:last-of-type {\n  border-radius: 0;\n}\n.icheck > label {\n  padding-left: 0;\n}\n/* support Font Awesome icons in form-control */\n.form-control-feedback.fa {\n  line-height: 34px;\n}\n.input-lg + .form-control-feedback.fa,\n.input-group-lg + .form-control-feedback.fa,\n.form-group-lg .form-control + .form-control-feedback.fa {\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback.fa,\n.input-group-sm + .form-control-feedback.fa,\n.form-group-sm .form-control + .form-control-feedback.fa {\n  line-height: 30px;\n}\n/*\n * Component: Progress Bar\n * -----------------------\n */\n.progress,\n.progress > .progress-bar {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.progress,\n.progress > .progress-bar,\n.progress .progress-bar,\n.progress > .progress-bar .progress-bar {\n  border-radius: 1px;\n}\n/* size variation */\n.progress.sm,\n.progress-sm {\n  height: 10px;\n}\n.progress.sm,\n.progress-sm,\n.progress.sm .progress-bar,\n.progress-sm .progress-bar {\n  border-radius: 1px;\n}\n.progress.xs,\n.progress-xs {\n  height: 7px;\n}\n.progress.xs,\n.progress-xs,\n.progress.xs .progress-bar,\n.progress-xs .progress-bar {\n  border-radius: 1px;\n}\n.progress.xxs,\n.progress-xxs {\n  height: 3px;\n}\n.progress.xxs,\n.progress-xxs,\n.progress.xxs .progress-bar,\n.progress-xxs .progress-bar {\n  border-radius: 1px;\n}\n/* Vertical bars */\n.progress.vertical {\n  position: relative;\n  width: 30px;\n  height: 200px;\n  display: inline-block;\n  margin-right: 10px;\n}\n.progress.vertical > .progress-bar {\n  width: 100%;\n  position: absolute;\n  bottom: 0;\n}\n.progress.vertical.sm,\n.progress.vertical.progress-sm {\n  width: 20px;\n}\n.progress.vertical.xs,\n.progress.vertical.progress-xs {\n  width: 10px;\n}\n.progress.vertical.xxs,\n.progress.vertical.progress-xxs {\n  width: 3px;\n}\n.progress-group .progress-text {\n  font-weight: 600;\n}\n.progress-group .progress-number {\n  float: right;\n}\n/* Remove margins from progress bars when put in a table */\n.table tr > td .progress {\n  margin: 0;\n}\n.progress-bar-light-blue,\n.progress-bar-primary {\n  background-color: #3c8dbc;\n}\n.progress-striped .progress-bar-light-blue,\n.progress-striped .progress-bar-primary {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-green,\n.progress-bar-success {\n  background-color: #00a65a;\n}\n.progress-striped .progress-bar-green,\n.progress-striped .progress-bar-success {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-aqua,\n.progress-bar-info {\n  background-color: #00c0ef;\n}\n.progress-striped .progress-bar-aqua,\n.progress-striped .progress-bar-info {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-yellow,\n.progress-bar-warning {\n  background-color: #f39c12;\n}\n.progress-striped .progress-bar-yellow,\n.progress-striped .progress-bar-warning {\n  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);\n  background-image: -o-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);\n  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);\n}\n.progress-bar-red,\n.progress-bar-danger {\n  background-color: #dd4b39;\n}\n.progress-striped .progress-bar-red,\n.progress-striped .progress-bar-danger {\n  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);\n  background-image: -o-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);\n  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);\n}\n/*\n * Component: Small Box\n * --------------------\n */\n.small-box {\n  border-radius: 2px;\n  position: relative;\n  display: block;\n  margin-bottom: 20px;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n}\n.small-box > .inner {\n  padding: 10px;\n}\n.small-box > .small-box-footer {\n  position: relative;\n  text-align: center;\n  padding: 3px 0;\n  color: #fff;\n  color: rgba(255, 255, 255, 0.8);\n  display: block;\n  z-index: 10;\n  background: rgba(0, 0, 0, 0.1);\n  text-decoration: none;\n}\n.small-box > .small-box-footer:hover {\n  color: #fff;\n  background: rgba(0, 0, 0, 0.15);\n}\n.small-box h3 {\n  font-size: 38px;\n  font-weight: bold;\n  margin: 0 0 10px 0;\n  white-space: nowrap;\n  padding: 0;\n}\n.small-box p {\n  font-size: 15px;\n}\n.small-box p > small {\n  display: block;\n  color: #f9f9f9;\n  font-size: 13px;\n  margin-top: 5px;\n}\n.small-box h3,\n.small-box p {\n  z-index: 5px;\n}\n.small-box .icon {\n  -webkit-transition: all 0.3s linear;\n  -o-transition: all 0.3s linear;\n  transition: all 0.3s linear;\n  position: absolute;\n  top: -10px;\n  right: 10px;\n  z-index: 0;\n  font-size: 90px;\n  color: rgba(0, 0, 0, 0.15);\n}\n.small-box:hover {\n  text-decoration: none;\n  color: #f9f9f9;\n}\n.small-box:hover .icon {\n  font-size: 95px;\n}\n@media (max-width: 767px) {\n  .small-box {\n    text-align: center;\n  }\n  .small-box .icon {\n    display: none;\n  }\n  .small-box p {\n    font-size: 12px;\n  }\n}\n/*\n * Component: Box\n * --------------\n */\n.box {\n  position: relative;\n  border-radius: 3px;\n  background: #ffffff;\n  border-top: 3px solid #d2d6de;\n  margin-bottom: 20px;\n  width: 100%;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n}\n.box.box-primary {\n  border-top-color: #3c8dbc;\n}\n.box.box-info {\n  border-top-color: #00c0ef;\n}\n.box.box-danger {\n  border-top-color: #dd4b39;\n}\n.box.box-warning {\n  border-top-color: #f39c12;\n}\n.box.box-success {\n  border-top-color: #00a65a;\n}\n.box.box-default {\n  border-top-color: #d2d6de;\n}\n.box.collapsed-box .box-body,\n.box.collapsed-box .box-footer {\n  display: none;\n}\n.box .nav-stacked > li {\n  border-bottom: 1px solid #f4f4f4;\n  margin: 0;\n}\n.box .nav-stacked > li:last-of-type {\n  border-bottom: none;\n}\n.box.height-control .box-body {\n  max-height: 300px;\n  overflow: auto;\n}\n.box .border-right {\n  border-right: 1px solid #f4f4f4;\n}\n.box .border-left {\n  border-left: 1px solid #f4f4f4;\n}\n.box.box-solid {\n  border-top: 0;\n}\n.box.box-solid > .box-header .btn.btn-default {\n  background: transparent;\n}\n.box.box-solid > .box-header .btn:hover,\n.box.box-solid > .box-header a:hover {\n  background: rgba(0, 0, 0, 0.1);\n}\n.box.box-solid.box-default {\n  border: 1px solid #d2d6de;\n}\n.box.box-solid.box-default > .box-header {\n  color: #444;\n  background: #d2d6de;\n  background-color: #d2d6de;\n}\n.box.box-solid.box-default > .box-header a,\n.box.box-solid.box-default > .box-header .btn {\n  color: #444;\n}\n.box.box-solid.box-primary {\n  border: 1px solid #3c8dbc;\n}\n.box.box-solid.box-primary > .box-header {\n  color: #fff;\n  background: #3c8dbc;\n  background-color: #3c8dbc;\n}\n.box.box-solid.box-primary > .box-header a,\n.box.box-solid.box-primary > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-info {\n  border: 1px solid #00c0ef;\n}\n.box.box-solid.box-info > .box-header {\n  color: #fff;\n  background: #00c0ef;\n  background-color: #00c0ef;\n}\n.box.box-solid.box-info > .box-header a,\n.box.box-solid.box-info > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-danger {\n  border: 1px solid #dd4b39;\n}\n.box.box-solid.box-danger > .box-header {\n  color: #fff;\n  background: #dd4b39;\n  background-color: #dd4b39;\n}\n.box.box-solid.box-danger > .box-header a,\n.box.box-solid.box-danger > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-warning {\n  border: 1px solid #f39c12;\n}\n.box.box-solid.box-warning > .box-header {\n  color: #fff;\n  background: #f39c12;\n  background-color: #f39c12;\n}\n.box.box-solid.box-warning > .box-header a,\n.box.box-solid.box-warning > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid.box-success {\n  border: 1px solid #00a65a;\n}\n.box.box-solid.box-success > .box-header {\n  color: #fff;\n  background: #00a65a;\n  background-color: #00a65a;\n}\n.box.box-solid.box-success > .box-header a,\n.box.box-solid.box-success > .box-header .btn {\n  color: #fff;\n}\n.box.box-solid > .box-header > .box-tools .btn {\n  border: 0;\n  box-shadow: none;\n}\n.box.box-solid[class*='bg'] > .box-header {\n  color: #fff;\n}\n.box .box-group > .box {\n  margin-bottom: 5px;\n}\n.box .knob-label {\n  text-align: center;\n  color: #333;\n  font-weight: 100;\n  font-size: 12px;\n  margin-bottom: 0.3em;\n}\n.box > .overlay,\n.overlay-wrapper > .overlay,\n.box > .loading-img,\n.overlay-wrapper > .loading-img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.box .overlay,\n.overlay-wrapper .overlay {\n  z-index: 50;\n  background: rgba(255, 255, 255, 0.7);\n  border-radius: 3px;\n}\n.box .overlay > .fa,\n.overlay-wrapper .overlay > .fa {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin-left: -15px;\n  margin-top: -15px;\n  color: #000;\n  font-size: 30px;\n}\n.box .overlay.dark,\n.overlay-wrapper .overlay.dark {\n  background: rgba(0, 0, 0, 0.5);\n}\n.box-header:before,\n.box-body:before,\n.box-footer:before,\n.box-header:after,\n.box-body:after,\n.box-footer:after {\n  content: \" \";\n  display: table;\n}\n.box-header:after,\n.box-body:after,\n.box-footer:after {\n  clear: both;\n}\n.box-header {\n  color: #444;\n  display: block;\n  padding: 10px;\n  position: relative;\n}\n.box-header.with-border {\n  border-bottom: 1px solid #f4f4f4;\n}\n.collapsed-box .box-header.with-border {\n  border-bottom: none;\n}\n.box-header > .fa,\n.box-header > .glyphicon,\n.box-header > .ion,\n.box-header .box-title {\n  display: inline-block;\n  font-size: 18px;\n  margin: 0;\n  line-height: 1;\n}\n.box-header > .fa,\n.box-header > .glyphicon,\n.box-header > .ion {\n  margin-right: 5px;\n}\n.box-header > .box-tools {\n  position: absolute;\n  right: 10px;\n  top: 5px;\n}\n.box-header > .box-tools [data-toggle=\"tooltip\"] {\n  position: relative;\n}\n.box-header > .box-tools.pull-right .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.btn-box-tool {\n  padding: 5px;\n  font-size: 12px;\n  background: transparent;\n  color: #97a0b3;\n}\n.open .btn-box-tool,\n.btn-box-tool:hover {\n  color: #606c84;\n}\n.btn-box-tool.btn:active {\n  box-shadow: none;\n}\n.box-body {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n  padding: 10px;\n}\n.no-header .box-body {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.box-body > .table {\n  margin-bottom: 0;\n}\n.box-body .fc {\n  margin-top: 5px;\n}\n.box-body .full-width-chart {\n  margin: -19px;\n}\n.box-body.no-padding .full-width-chart {\n  margin: -9px;\n}\n.box-body .box-pane {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 3px;\n}\n.box-body .box-pane-right {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 0;\n}\n.box-footer {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n  border-top: 1px solid #f4f4f4;\n  padding: 10px;\n  background-color: #fff;\n}\n.chart-legend {\n  margin: 10px 0;\n}\n@media (max-width: 991px) {\n  .chart-legend > li {\n    float: left;\n    margin-right: 10px;\n  }\n}\n.box-comments {\n  background: #f7f7f7;\n}\n.box-comments .box-comment {\n  padding: 8px 0;\n  border-bottom: 1px solid #eee;\n}\n.box-comments .box-comment:before,\n.box-comments .box-comment:after {\n  content: \" \";\n  display: table;\n}\n.box-comments .box-comment:after {\n  clear: both;\n}\n.box-comments .box-comment:last-of-type {\n  border-bottom: 0;\n}\n.box-comments .box-comment:first-of-type {\n  padding-top: 0;\n}\n.box-comments .box-comment img {\n  float: left;\n}\n.box-comments .comment-text {\n  margin-left: 40px;\n  color: #555;\n}\n.box-comments .username {\n  color: #444;\n  display: block;\n  font-weight: 600;\n}\n.box-comments .text-muted {\n  font-weight: 400;\n  font-size: 12px;\n}\n/* Widget: TODO LIST */\n.todo-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow: auto;\n}\n.todo-list > li {\n  border-radius: 2px;\n  padding: 10px;\n  background: #f4f4f4;\n  margin-bottom: 2px;\n  border-left: 2px solid #e6e7e8;\n  color: #444;\n}\n.todo-list > li:last-of-type {\n  margin-bottom: 0;\n}\n.todo-list > li > input[type='checkbox'] {\n  margin: 0 10px 0 5px;\n}\n.todo-list > li .text {\n  display: inline-block;\n  margin-left: 5px;\n  font-weight: 600;\n}\n.todo-list > li .label {\n  margin-left: 10px;\n  font-size: 9px;\n}\n.todo-list > li .tools {\n  display: none;\n  float: right;\n  color: #dd4b39;\n}\n.todo-list > li .tools > .fa,\n.todo-list > li .tools > .glyphicon,\n.todo-list > li .tools > .ion {\n  margin-right: 5px;\n  cursor: pointer;\n}\n.todo-list > li:hover .tools {\n  display: inline-block;\n}\n.todo-list > li.done {\n  color: #999;\n}\n.todo-list > li.done .text {\n  text-decoration: line-through;\n  font-weight: 500;\n}\n.todo-list > li.done .label {\n  background: #d2d6de !important;\n}\n.todo-list .danger {\n  border-left-color: #dd4b39;\n}\n.todo-list .warning {\n  border-left-color: #f39c12;\n}\n.todo-list .info {\n  border-left-color: #00c0ef;\n}\n.todo-list .success {\n  border-left-color: #00a65a;\n}\n.todo-list .primary {\n  border-left-color: #3c8dbc;\n}\n.todo-list .handle {\n  display: inline-block;\n  cursor: move;\n  margin: 0 5px;\n}\n/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/\n.chat {\n  padding: 5px 20px 5px 10px;\n}\n.chat .item {\n  margin-bottom: 10px;\n}\n.chat .item:before,\n.chat .item:after {\n  content: \" \";\n  display: table;\n}\n.chat .item:after {\n  clear: both;\n}\n.chat .item > img {\n  width: 40px;\n  height: 40px;\n  border: 2px solid transparent;\n  border-radius: 50%;\n}\n.chat .item > .online {\n  border: 2px solid #00a65a;\n}\n.chat .item > .offline {\n  border: 2px solid #dd4b39;\n}\n.chat .item > .message {\n  margin-left: 55px;\n  margin-top: -40px;\n}\n.chat .item > .message > .name {\n  display: block;\n  font-weight: 600;\n}\n.chat .item > .attachment {\n  border-radius: 3px;\n  background: #f4f4f4;\n  margin-left: 65px;\n  margin-right: 15px;\n  padding: 10px;\n}\n.chat .item > .attachment > h4 {\n  margin: 0 0 5px 0;\n  font-weight: 600;\n  font-size: 14px;\n}\n.chat .item > .attachment > p,\n.chat .item > .attachment > .filename {\n  font-weight: 600;\n  font-size: 13px;\n  font-style: italic;\n  margin: 0;\n}\n.chat .item > .attachment:before,\n.chat .item > .attachment:after {\n  content: \" \";\n  display: table;\n}\n.chat .item > .attachment:after {\n  clear: both;\n}\n.box-input {\n  max-width: 200px;\n}\n.modal .panel-body {\n  color: #444;\n}\n/*\n * Component: Info Box\n * -------------------\n */\n.info-box {\n  display: block;\n  min-height: 90px;\n  background: #fff;\n  width: 100%;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  border-radius: 2px;\n  margin-bottom: 15px;\n}\n.info-box small {\n  font-size: 14px;\n}\n.info-box .progress {\n  background: rgba(0, 0, 0, 0.2);\n  margin: 5px -10px 5px -10px;\n  height: 2px;\n}\n.info-box .progress,\n.info-box .progress .progress-bar {\n  border-radius: 0;\n}\n.info-box .progress .progress-bar {\n  background: #fff;\n}\n.info-box-icon {\n  border-top-left-radius: 2px;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 2px;\n  display: block;\n  float: left;\n  height: 90px;\n  width: 90px;\n  text-align: center;\n  font-size: 45px;\n  line-height: 90px;\n  background: rgba(0, 0, 0, 0.2);\n}\n.info-box-icon > img {\n  max-width: 100%;\n}\n.info-box-content {\n  padding: 5px 10px;\n  margin-left: 90px;\n}\n.info-box-number {\n  display: block;\n  font-weight: bold;\n  font-size: 18px;\n}\n.progress-description,\n.info-box-text {\n  display: block;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.info-box-text {\n  text-transform: uppercase;\n}\n.info-box-more {\n  display: block;\n}\n.progress-description {\n  margin: 0;\n}\n/*\n * Component: Button\n * -----------------\n */\n.btn {\n  border-radius: 3px;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  border: 1px solid transparent;\n}\n.btn.uppercase {\n  text-transform: uppercase;\n}\n.btn.btn-flat {\n  border-radius: 0;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  border-width: 1px;\n}\n.btn:active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn:focus {\n  outline: none;\n}\n.btn.btn-file {\n  position: relative;\n  overflow: hidden;\n}\n.btn.btn-file > input[type='file'] {\n  position: absolute;\n  top: 0;\n  right: 0;\n  min-width: 100%;\n  min-height: 100%;\n  font-size: 100px;\n  text-align: right;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  outline: none;\n  background: white;\n  cursor: inherit;\n  display: block;\n}\n.btn-default {\n  background-color: #f4f4f4;\n  color: #444;\n  border-color: #ddd;\n}\n.btn-default:hover,\n.btn-default:active,\n.btn-default.hover {\n  background-color: #e7e7e7;\n}\n.btn-primary {\n  background-color: #3c8dbc;\n  border-color: #367fa9;\n}\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary.hover {\n  background-color: #367fa9;\n}\n.btn-success {\n  background-color: #00a65a;\n  border-color: #008d4c;\n}\n.btn-success:hover,\n.btn-success:active,\n.btn-success.hover {\n  background-color: #008d4c;\n}\n.btn-info {\n  background-color: #00c0ef;\n  border-color: #00acd6;\n}\n.btn-info:hover,\n.btn-info:active,\n.btn-info.hover {\n  background-color: #00acd6;\n}\n.btn-danger {\n  background-color: #dd4b39;\n  border-color: #d73925;\n}\n.btn-danger:hover,\n.btn-danger:active,\n.btn-danger.hover {\n  background-color: #d73925;\n}\n.btn-warning {\n  background-color: #f39c12;\n  border-color: #e08e0b;\n}\n.btn-warning:hover,\n.btn-warning:active,\n.btn-warning.hover {\n  background-color: #e08e0b;\n}\n.btn-outline {\n  border: 1px solid #fff;\n  background: transparent;\n  color: #fff;\n}\n.btn-outline:hover,\n.btn-outline:focus,\n.btn-outline:active {\n  color: rgba(255, 255, 255, 0.7);\n  border-color: rgba(255, 255, 255, 0.7);\n}\n.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn[class*='bg-']:hover {\n  -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);\n  box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);\n}\n.btn-app {\n  border-radius: 3px;\n  position: relative;\n  padding: 15px 5px;\n  margin: 0 0 10px 10px;\n  min-width: 80px;\n  height: 60px;\n  text-align: center;\n  color: #666;\n  border: 1px solid #ddd;\n  background-color: #f4f4f4;\n  font-size: 12px;\n}\n.btn-app > .fa,\n.btn-app > .glyphicon,\n.btn-app > .ion {\n  font-size: 20px;\n  display: block;\n}\n.btn-app:hover {\n  background: #f4f4f4;\n  color: #444;\n  border-color: #aaa;\n}\n.btn-app:active,\n.btn-app:focus {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-app > .badge {\n  position: absolute;\n  top: -3px;\n  right: -10px;\n  font-size: 10px;\n  font-weight: 400;\n}\n/*\n * Component: Callout\n * ------------------\n */\n.callout {\n  border-radius: 3px;\n  margin: 0 0 20px 0;\n  padding: 15px 30px 15px 15px;\n  border-left: 5px solid #eee;\n}\n.callout a {\n  color: #fff;\n  text-decoration: underline;\n}\n.callout a:hover {\n  color: #eee;\n}\n.callout h4 {\n  margin-top: 0;\n  font-weight: 600;\n}\n.callout p:last-child {\n  margin-bottom: 0;\n}\n.callout code,\n.callout .highlight {\n  background-color: #fff;\n}\n.callout.callout-danger {\n  border-color: #c23321;\n}\n.callout.callout-warning {\n  border-color: #c87f0a;\n}\n.callout.callout-info {\n  border-color: #0097bc;\n}\n.callout.callout-success {\n  border-color: #00733e;\n}\n/*\n * Component: alert\n * ----------------\n */\n.alert {\n  border-radius: 3px;\n}\n.alert h4 {\n  font-weight: 600;\n}\n.alert .icon {\n  margin-right: 10px;\n}\n.alert .close {\n  color: #000;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.alert .close:hover {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.alert a {\n  color: #fff;\n  text-decoration: underline;\n}\n.alert-success {\n  border-color: #008d4c;\n}\n.alert-danger,\n.alert-error {\n  border-color: #d73925;\n}\n.alert-warning {\n  border-color: #e08e0b;\n}\n.alert-info {\n  border-color: #00acd6;\n}\n/*\n * Component: Nav\n * --------------\n */\n.nav > li > a:hover,\n.nav > li > a:active,\n.nav > li > a:focus {\n  color: #444;\n  background: #f7f7f7;\n}\n/* NAV PILLS */\n.nav-pills > li > a {\n  border-radius: 0;\n  border-top: 3px solid transparent;\n  color: #444;\n}\n.nav-pills > li > a > .fa,\n.nav-pills > li > a > .glyphicon,\n.nav-pills > li > a > .ion {\n  margin-right: 5px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  border-top-color: #3c8dbc;\n}\n.nav-pills > li.active > a {\n  font-weight: 600;\n}\n/* NAV STACKED */\n.nav-stacked > li > a {\n  border-radius: 0;\n  border-top: 0;\n  border-left: 3px solid transparent;\n  color: #444;\n}\n.nav-stacked > li.active > a,\n.nav-stacked > li.active > a:hover {\n  background: transparent;\n  color: #444;\n  border-top: 0;\n  border-left-color: #3c8dbc;\n}\n.nav-stacked > li.header {\n  border-bottom: 1px solid #ddd;\n  color: #777;\n  margin-bottom: 10px;\n  padding: 5px 10px;\n  text-transform: uppercase;\n}\n/* NAV TABS */\n.nav-tabs-custom {\n  margin-bottom: 20px;\n  background: #fff;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  border-radius: 3px;\n}\n.nav-tabs-custom > .nav-tabs {\n  margin: 0;\n  border-bottom-color: #f4f4f4;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.nav-tabs-custom > .nav-tabs > li {\n  border-top: 3px solid transparent;\n  margin-bottom: -2px;\n  margin-right: 5px;\n}\n.nav-tabs-custom > .nav-tabs > li > a {\n  color: #444;\n  border-radius: 0;\n}\n.nav-tabs-custom > .nav-tabs > li > a.text-muted {\n  color: #999;\n}\n.nav-tabs-custom > .nav-tabs > li > a,\n.nav-tabs-custom > .nav-tabs > li > a:hover {\n  background: transparent;\n  margin: 0;\n}\n.nav-tabs-custom > .nav-tabs > li > a:hover {\n  color: #999;\n}\n.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover,\n.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus,\n.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active {\n  border-color: transparent;\n}\n.nav-tabs-custom > .nav-tabs > li.active {\n  border-top-color: #3c8dbc;\n}\n.nav-tabs-custom > .nav-tabs > li.active > a,\n.nav-tabs-custom > .nav-tabs > li.active:hover > a {\n  background-color: #fff;\n  color: #444;\n}\n.nav-tabs-custom > .nav-tabs > li.active > a {\n  border-top-color: transparent;\n  border-left-color: #f4f4f4;\n  border-right-color: #f4f4f4;\n}\n.nav-tabs-custom > .nav-tabs > li:first-of-type {\n  margin-left: 0;\n}\n.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a {\n  border-left-color: transparent;\n}\n.nav-tabs-custom > .nav-tabs.pull-right {\n  float: none!important;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li {\n  float: right;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type {\n  margin-right: 0;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a {\n  border-left-width: 1px;\n}\n.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a {\n  border-left-color: #f4f4f4;\n  border-right-color: transparent;\n}\n.nav-tabs-custom > .nav-tabs > li.header {\n  line-height: 35px;\n  padding: 0 10px;\n  font-size: 20px;\n  color: #444;\n}\n.nav-tabs-custom > .nav-tabs > li.header > .fa,\n.nav-tabs-custom > .nav-tabs > li.header > .glyphicon,\n.nav-tabs-custom > .nav-tabs > li.header > .ion {\n  margin-right: 5px;\n}\n.nav-tabs-custom > .tab-content {\n  background: #fff;\n  padding: 10px;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.nav-tabs-custom .dropdown.open > a:active,\n.nav-tabs-custom .dropdown.open > a:focus {\n  background: transparent;\n  color: #999;\n}\n/* PAGINATION */\n.pagination > li > a {\n  background: #fafafa;\n  color: #666;\n}\n.pagination.pagination-flat > li > a {\n  border-radius: 0 !important;\n}\n/*\n * Component: Table\n * ----------------\n */\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  border-top: 1px solid #f4f4f4;\n}\n.table > thead > tr > th {\n  border-bottom: 2px solid #f4f4f4;\n}\n.table tr td .progress {\n  margin-top: 5px;\n}\n.table-bordered {\n  border: 1px solid #f4f4f4;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #f4f4f4;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table.no-border,\n.table.no-border td,\n.table.no-border th {\n  border: 0;\n}\n/* .text-center in tables */\ntable.text-center,\ntable.text-center td,\ntable.text-center th {\n  text-align: center;\n}\n.table.align th {\n  text-align: left;\n}\n.table.align td {\n  text-align: right;\n}\n/*\n * Component: Label\n * ----------------\n */\n.label-default {\n  background-color: #d2d6de;\n  color: #444;\n}\n/*\n * Component: Direct Chat\n * ----------------------\n */\n.direct-chat .box-body {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n  position: relative;\n  overflow-x: hidden;\n  padding: 0;\n}\n.direct-chat.chat-pane-open .direct-chat-contacts {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.direct-chat-messages {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n  padding: 10px;\n  height: 250px;\n  overflow: auto;\n}\n.direct-chat-msg,\n.direct-chat-text {\n  display: block;\n}\n.direct-chat-msg {\n  margin-bottom: 10px;\n}\n.direct-chat-msg:before,\n.direct-chat-msg:after {\n  content: \" \";\n  display: table;\n}\n.direct-chat-msg:after {\n  clear: both;\n}\n.direct-chat-messages,\n.direct-chat-contacts {\n  -webkit-transition: -webkit-transform 0.5s ease-in-out;\n  -moz-transition: -moz-transform 0.5s ease-in-out;\n  -o-transition: -o-transform 0.5s ease-in-out;\n  transition: transform 0.5s ease-in-out;\n}\n.direct-chat-text {\n  border-radius: 5px;\n  position: relative;\n  padding: 5px 10px;\n  background: #d2d6de;\n  border: 1px solid #d2d6de;\n  margin: 5px 0 0 50px;\n  color: #444;\n}\n.direct-chat-text:after,\n.direct-chat-text:before {\n  position: absolute;\n  right: 100%;\n  top: 15px;\n  border: solid transparent;\n  border-right-color: #d2d6de;\n  content: ' ';\n  height: 0;\n  width: 0;\n  pointer-events: none;\n}\n.direct-chat-text:after {\n  border-width: 5px;\n  margin-top: -5px;\n}\n.direct-chat-text:before {\n  border-width: 6px;\n  margin-top: -6px;\n}\n.right .direct-chat-text {\n  margin-right: 50px;\n  margin-left: 0;\n}\n.right .direct-chat-text:after,\n.right .direct-chat-text:before {\n  right: auto;\n  left: 100%;\n  border-right-color: transparent;\n  border-left-color: #d2d6de;\n}\n.direct-chat-img {\n  border-radius: 50%;\n  float: left;\n  width: 40px;\n  height: 40px;\n}\n.right .direct-chat-img {\n  float: right;\n}\n.direct-chat-info {\n  display: block;\n  margin-bottom: 2px;\n  font-size: 12px;\n}\n.direct-chat-name {\n  font-weight: 600;\n}\n.direct-chat-timestamp {\n  color: #999;\n}\n.direct-chat-contacts-open .direct-chat-contacts {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.direct-chat-contacts {\n  -webkit-transform: translate(101%, 0);\n  -ms-transform: translate(101%, 0);\n  -o-transform: translate(101%, 0);\n  transform: translate(101%, 0);\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  height: 250px;\n  width: 100%;\n  background: #222d32;\n  color: #fff;\n  overflow: auto;\n}\n.contacts-list > li {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  padding: 10px;\n  margin: 0;\n}\n.contacts-list > li:before,\n.contacts-list > li:after {\n  content: \" \";\n  display: table;\n}\n.contacts-list > li:after {\n  clear: both;\n}\n.contacts-list > li:last-of-type {\n  border-bottom: none;\n}\n.contacts-list-img {\n  border-radius: 50%;\n  width: 40px;\n  float: left;\n}\n.contacts-list-info {\n  margin-left: 45px;\n  color: #fff;\n}\n.contacts-list-name,\n.contacts-list-status {\n  display: block;\n}\n.contacts-list-name {\n  font-weight: 600;\n}\n.contacts-list-status {\n  font-size: 12px;\n}\n.contacts-list-date {\n  color: #aaa;\n  font-weight: normal;\n}\n.contacts-list-msg {\n  color: #999;\n}\n.direct-chat-danger .right > .direct-chat-text {\n  background: #dd4b39;\n  border-color: #dd4b39;\n  color: #fff;\n}\n.direct-chat-danger .right > .direct-chat-text:after,\n.direct-chat-danger .right > .direct-chat-text:before {\n  border-left-color: #dd4b39;\n}\n.direct-chat-primary .right > .direct-chat-text {\n  background: #3c8dbc;\n  border-color: #3c8dbc;\n  color: #fff;\n}\n.direct-chat-primary .right > .direct-chat-text:after,\n.direct-chat-primary .right > .direct-chat-text:before {\n  border-left-color: #3c8dbc;\n}\n.direct-chat-warning .right > .direct-chat-text {\n  background: #f39c12;\n  border-color: #f39c12;\n  color: #fff;\n}\n.direct-chat-warning .right > .direct-chat-text:after,\n.direct-chat-warning .right > .direct-chat-text:before {\n  border-left-color: #f39c12;\n}\n.direct-chat-info .right > .direct-chat-text {\n  background: #00c0ef;\n  border-color: #00c0ef;\n  color: #fff;\n}\n.direct-chat-info .right > .direct-chat-text:after,\n.direct-chat-info .right > .direct-chat-text:before {\n  border-left-color: #00c0ef;\n}\n.direct-chat-success .right > .direct-chat-text {\n  background: #00a65a;\n  border-color: #00a65a;\n  color: #fff;\n}\n.direct-chat-success .right > .direct-chat-text:after,\n.direct-chat-success .right > .direct-chat-text:before {\n  border-left-color: #00a65a;\n}\n/*\n * Component: Users List\n * ---------------------\n */\n.users-list > li {\n  width: 25%;\n  float: left;\n  padding: 10px;\n  text-align: center;\n}\n.users-list > li img {\n  border-radius: 50%;\n  max-width: 100%;\n  height: auto;\n}\n.users-list > li > a:hover,\n.users-list > li > a:hover .users-list-name {\n  color: #999;\n}\n.users-list-name,\n.users-list-date {\n  display: block;\n}\n.users-list-name {\n  font-weight: 600;\n  color: #444;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.users-list-date {\n  color: #999;\n  font-size: 12px;\n}\n/*\n * Component: modal\n * ----------------\n */\n.modal {\n  background: rgba(0, 0, 0, 0.3);\n}\n.modal-content {\n  border-radius: 0;\n  -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n  border: 0;\n}\n@media (min-width: 768px) {\n  .modal-content {\n    -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n    box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);\n  }\n}\n.modal-header {\n  border-bottom-color: #f4f4f4;\n}\n.modal-footer {\n  border-top-color: #f4f4f4;\n}\n.modal-primary .modal-header,\n.modal-primary .modal-footer {\n  border-color: #307095;\n}\n.modal-warning .modal-header,\n.modal-warning .modal-footer {\n  border-color: #c87f0a;\n}\n.modal-info .modal-header,\n.modal-info .modal-footer {\n  border-color: #0097bc;\n}\n.modal-success .modal-header,\n.modal-success .modal-footer {\n  border-color: #00733e;\n}\n.modal-danger .modal-header,\n.modal-danger .modal-footer {\n  border-color: #c23321;\n}\n/*\n * Page: Login & Register\n * ----------------------\n */\n.login-logo,\n.register-logo {\n  font-size: 35px;\n  text-align: center;\n  margin-bottom: 25px;\n  font-weight: 300;\n}\n.login-logo a,\n.register-logo a {\n  color: #444;\n}\n.login-page,\n.register-page {\n  background: #d2d6de;\n}\n.login-box,\n.register-box {\n  width: 360px;\n  margin: 7% auto;\n}\n@media (max-width: 768px) {\n  .login-box,\n  .register-box {\n    width: 90%;\n    margin-top: 20px;\n  }\n}\n.login-box-body,\n.register-box-body {\n  background: #fff;\n  padding: 20px;\n  border-top: 0;\n  color: #666;\n}\n.login-box-body .form-control-feedback,\n.register-box-body .form-control-feedback {\n  color: #777;\n}\n.login-box-msg,\n.register-box-msg {\n  margin: 0;\n  text-align: center;\n  padding: 0 20px 20px 20px;\n}\n.social-auth-links {\n  margin: 10px 0;\n}\n/*\n * Page: 400 and 500 error pages\n * ------------------------------\n */\n.error-page {\n  width: 600px;\n  margin: 20px auto 0 auto;\n}\n@media (max-width: 991px) {\n  .error-page {\n    width: 100%;\n  }\n}\n.error-page > .headline {\n  float: left;\n  font-size: 100px;\n  font-weight: 300;\n}\n@media (max-width: 991px) {\n  .error-page > .headline {\n    float: none;\n    text-align: center;\n  }\n}\n.error-page > .error-content {\n  margin-left: 190px;\n  display: block;\n}\n@media (max-width: 991px) {\n  .error-page > .error-content {\n    margin-left: 0;\n  }\n}\n.error-page > .error-content > h3 {\n  font-weight: 300;\n  font-size: 25px;\n}\n@media (max-width: 991px) {\n  .error-page > .error-content > h3 {\n    text-align: center;\n  }\n}\n/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2015 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n.btn-social {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.btn-social > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social.btn-lg {\n  padding-left: 61px;\n}\n.btn-social.btn-lg > :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social.btn-sm {\n  padding-left: 38px;\n}\n.btn-social.btn-sm > :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social.btn-xs {\n  padding-left: 30px;\n}\n.btn-social.btn-xs > :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  height: 34px;\n  width: 34px;\n  padding: 0;\n}\n.btn-social-icon > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social-icon.btn-lg {\n  padding-left: 61px;\n}\n.btn-social-icon.btn-lg > :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social-icon.btn-sm {\n  padding-left: 38px;\n}\n.btn-social-icon.btn-sm > :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social-icon.btn-xs {\n  padding-left: 30px;\n}\n.btn-social-icon.btn-xs > :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon > :first-child {\n  border: none;\n  text-align: center;\n  width: 100%;\n}\n.btn-social-icon.btn-lg {\n  height: 45px;\n  width: 45px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-sm {\n  height: 30px;\n  width: 30px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-xs {\n  height: 22px;\n  width: 22px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-adn {\n  color: #fff;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:hover,\n.btn-adn:focus,\n.btn-adn.focus,\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  color: #fff;\n  background-color: #ce563f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  background-image: none;\n}\n.btn-adn.disabled,\n.btn-adn[disabled],\nfieldset[disabled] .btn-adn,\n.btn-adn.disabled:hover,\n.btn-adn[disabled]:hover,\nfieldset[disabled] .btn-adn:hover,\n.btn-adn.disabled:focus,\n.btn-adn[disabled]:focus,\nfieldset[disabled] .btn-adn:focus,\n.btn-adn.disabled.focus,\n.btn-adn[disabled].focus,\nfieldset[disabled] .btn-adn.focus,\n.btn-adn.disabled:active,\n.btn-adn[disabled]:active,\nfieldset[disabled] .btn-adn:active,\n.btn-adn.disabled.active,\n.btn-adn[disabled].active,\nfieldset[disabled] .btn-adn.active {\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn .badge {\n  color: #d87a68;\n  background-color: #fff;\n}\n.btn-bitbucket {\n  color: #fff;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:hover,\n.btn-bitbucket:focus,\n.btn-bitbucket.focus,\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  color: #fff;\n  background-color: #163758;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  background-image: none;\n}\n.btn-bitbucket.disabled,\n.btn-bitbucket[disabled],\nfieldset[disabled] .btn-bitbucket,\n.btn-bitbucket.disabled:hover,\n.btn-bitbucket[disabled]:hover,\nfieldset[disabled] .btn-bitbucket:hover,\n.btn-bitbucket.disabled:focus,\n.btn-bitbucket[disabled]:focus,\nfieldset[disabled] .btn-bitbucket:focus,\n.btn-bitbucket.disabled.focus,\n.btn-bitbucket[disabled].focus,\nfieldset[disabled] .btn-bitbucket.focus,\n.btn-bitbucket.disabled:active,\n.btn-bitbucket[disabled]:active,\nfieldset[disabled] .btn-bitbucket:active,\n.btn-bitbucket.disabled.active,\n.btn-bitbucket[disabled].active,\nfieldset[disabled] .btn-bitbucket.active {\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket .badge {\n  color: #205081;\n  background-color: #fff;\n}\n.btn-dropbox {\n  color: #fff;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:hover,\n.btn-dropbox:focus,\n.btn-dropbox.focus,\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  color: #fff;\n  background-color: #0d6aad;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  background-image: none;\n}\n.btn-dropbox.disabled,\n.btn-dropbox[disabled],\nfieldset[disabled] .btn-dropbox,\n.btn-dropbox.disabled:hover,\n.btn-dropbox[disabled]:hover,\nfieldset[disabled] .btn-dropbox:hover,\n.btn-dropbox.disabled:focus,\n.btn-dropbox[disabled]:focus,\nfieldset[disabled] .btn-dropbox:focus,\n.btn-dropbox.disabled.focus,\n.btn-dropbox[disabled].focus,\nfieldset[disabled] .btn-dropbox.focus,\n.btn-dropbox.disabled:active,\n.btn-dropbox[disabled]:active,\nfieldset[disabled] .btn-dropbox:active,\n.btn-dropbox.disabled.active,\n.btn-dropbox[disabled].active,\nfieldset[disabled] .btn-dropbox.active {\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox .badge {\n  color: #1087dd;\n  background-color: #fff;\n}\n.btn-facebook {\n  color: #fff;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:hover,\n.btn-facebook:focus,\n.btn-facebook.focus,\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  color: #fff;\n  background-color: #2d4373;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  background-image: none;\n}\n.btn-facebook.disabled,\n.btn-facebook[disabled],\nfieldset[disabled] .btn-facebook,\n.btn-facebook.disabled:hover,\n.btn-facebook[disabled]:hover,\nfieldset[disabled] .btn-facebook:hover,\n.btn-facebook.disabled:focus,\n.btn-facebook[disabled]:focus,\nfieldset[disabled] .btn-facebook:focus,\n.btn-facebook.disabled.focus,\n.btn-facebook[disabled].focus,\nfieldset[disabled] .btn-facebook.focus,\n.btn-facebook.disabled:active,\n.btn-facebook[disabled]:active,\nfieldset[disabled] .btn-facebook:active,\n.btn-facebook.disabled.active,\n.btn-facebook[disabled].active,\nfieldset[disabled] .btn-facebook.active {\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook .badge {\n  color: #3b5998;\n  background-color: #fff;\n}\n.btn-flickr {\n  color: #fff;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:hover,\n.btn-flickr:focus,\n.btn-flickr.focus,\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  color: #fff;\n  background-color: #cc006a;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  background-image: none;\n}\n.btn-flickr.disabled,\n.btn-flickr[disabled],\nfieldset[disabled] .btn-flickr,\n.btn-flickr.disabled:hover,\n.btn-flickr[disabled]:hover,\nfieldset[disabled] .btn-flickr:hover,\n.btn-flickr.disabled:focus,\n.btn-flickr[disabled]:focus,\nfieldset[disabled] .btn-flickr:focus,\n.btn-flickr.disabled.focus,\n.btn-flickr[disabled].focus,\nfieldset[disabled] .btn-flickr.focus,\n.btn-flickr.disabled:active,\n.btn-flickr[disabled]:active,\nfieldset[disabled] .btn-flickr:active,\n.btn-flickr.disabled.active,\n.btn-flickr[disabled].active,\nfieldset[disabled] .btn-flickr.active {\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr .badge {\n  color: #ff0084;\n  background-color: #fff;\n}\n.btn-foursquare {\n  color: #fff;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:hover,\n.btn-foursquare:focus,\n.btn-foursquare.focus,\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  color: #fff;\n  background-color: #f71752;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  background-image: none;\n}\n.btn-foursquare.disabled,\n.btn-foursquare[disabled],\nfieldset[disabled] .btn-foursquare,\n.btn-foursquare.disabled:hover,\n.btn-foursquare[disabled]:hover,\nfieldset[disabled] .btn-foursquare:hover,\n.btn-foursquare.disabled:focus,\n.btn-foursquare[disabled]:focus,\nfieldset[disabled] .btn-foursquare:focus,\n.btn-foursquare.disabled.focus,\n.btn-foursquare[disabled].focus,\nfieldset[disabled] .btn-foursquare.focus,\n.btn-foursquare.disabled:active,\n.btn-foursquare[disabled]:active,\nfieldset[disabled] .btn-foursquare:active,\n.btn-foursquare.disabled.active,\n.btn-foursquare[disabled].active,\nfieldset[disabled] .btn-foursquare.active {\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare .badge {\n  color: #f94877;\n  background-color: #fff;\n}\n.btn-github {\n  color: #fff;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:hover,\n.btn-github:focus,\n.btn-github.focus,\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  color: #fff;\n  background-color: #2b2b2b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  background-image: none;\n}\n.btn-github.disabled,\n.btn-github[disabled],\nfieldset[disabled] .btn-github,\n.btn-github.disabled:hover,\n.btn-github[disabled]:hover,\nfieldset[disabled] .btn-github:hover,\n.btn-github.disabled:focus,\n.btn-github[disabled]:focus,\nfieldset[disabled] .btn-github:focus,\n.btn-github.disabled.focus,\n.btn-github[disabled].focus,\nfieldset[disabled] .btn-github.focus,\n.btn-github.disabled:active,\n.btn-github[disabled]:active,\nfieldset[disabled] .btn-github:active,\n.btn-github.disabled.active,\n.btn-github[disabled].active,\nfieldset[disabled] .btn-github.active {\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github .badge {\n  color: #444444;\n  background-color: #fff;\n}\n.btn-google {\n  color: #fff;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google:hover,\n.btn-google:focus,\n.btn-google.focus,\n.btn-google:active,\n.btn-google.active,\n.open > .dropdown-toggle.btn-google {\n  color: #fff;\n  background-color: #c23321;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google:active,\n.btn-google.active,\n.open > .dropdown-toggle.btn-google {\n  background-image: none;\n}\n.btn-google.disabled,\n.btn-google[disabled],\nfieldset[disabled] .btn-google,\n.btn-google.disabled:hover,\n.btn-google[disabled]:hover,\nfieldset[disabled] .btn-google:hover,\n.btn-google.disabled:focus,\n.btn-google[disabled]:focus,\nfieldset[disabled] .btn-google:focus,\n.btn-google.disabled.focus,\n.btn-google[disabled].focus,\nfieldset[disabled] .btn-google.focus,\n.btn-google.disabled:active,\n.btn-google[disabled]:active,\nfieldset[disabled] .btn-google:active,\n.btn-google.disabled.active,\n.btn-google[disabled].active,\nfieldset[disabled] .btn-google.active {\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google .badge {\n  color: #dd4b39;\n  background-color: #fff;\n}\n.btn-instagram {\n  color: #fff;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:hover,\n.btn-instagram:focus,\n.btn-instagram.focus,\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  color: #fff;\n  background-color: #305777;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  background-image: none;\n}\n.btn-instagram.disabled,\n.btn-instagram[disabled],\nfieldset[disabled] .btn-instagram,\n.btn-instagram.disabled:hover,\n.btn-instagram[disabled]:hover,\nfieldset[disabled] .btn-instagram:hover,\n.btn-instagram.disabled:focus,\n.btn-instagram[disabled]:focus,\nfieldset[disabled] .btn-instagram:focus,\n.btn-instagram.disabled.focus,\n.btn-instagram[disabled].focus,\nfieldset[disabled] .btn-instagram.focus,\n.btn-instagram.disabled:active,\n.btn-instagram[disabled]:active,\nfieldset[disabled] .btn-instagram:active,\n.btn-instagram.disabled.active,\n.btn-instagram[disabled].active,\nfieldset[disabled] .btn-instagram.active {\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram .badge {\n  color: #3f729b;\n  background-color: #fff;\n}\n.btn-linkedin {\n  color: #fff;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:hover,\n.btn-linkedin:focus,\n.btn-linkedin.focus,\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  color: #fff;\n  background-color: #005983;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  background-image: none;\n}\n.btn-linkedin.disabled,\n.btn-linkedin[disabled],\nfieldset[disabled] .btn-linkedin,\n.btn-linkedin.disabled:hover,\n.btn-linkedin[disabled]:hover,\nfieldset[disabled] .btn-linkedin:hover,\n.btn-linkedin.disabled:focus,\n.btn-linkedin[disabled]:focus,\nfieldset[disabled] .btn-linkedin:focus,\n.btn-linkedin.disabled.focus,\n.btn-linkedin[disabled].focus,\nfieldset[disabled] .btn-linkedin.focus,\n.btn-linkedin.disabled:active,\n.btn-linkedin[disabled]:active,\nfieldset[disabled] .btn-linkedin:active,\n.btn-linkedin.disabled.active,\n.btn-linkedin[disabled].active,\nfieldset[disabled] .btn-linkedin.active {\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin .badge {\n  color: #007bb6;\n  background-color: #fff;\n}\n.btn-microsoft {\n  color: #fff;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:hover,\n.btn-microsoft:focus,\n.btn-microsoft.focus,\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  color: #fff;\n  background-color: #125acd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  background-image: none;\n}\n.btn-microsoft.disabled,\n.btn-microsoft[disabled],\nfieldset[disabled] .btn-microsoft,\n.btn-microsoft.disabled:hover,\n.btn-microsoft[disabled]:hover,\nfieldset[disabled] .btn-microsoft:hover,\n.btn-microsoft.disabled:focus,\n.btn-microsoft[disabled]:focus,\nfieldset[disabled] .btn-microsoft:focus,\n.btn-microsoft.disabled.focus,\n.btn-microsoft[disabled].focus,\nfieldset[disabled] .btn-microsoft.focus,\n.btn-microsoft.disabled:active,\n.btn-microsoft[disabled]:active,\nfieldset[disabled] .btn-microsoft:active,\n.btn-microsoft.disabled.active,\n.btn-microsoft[disabled].active,\nfieldset[disabled] .btn-microsoft.active {\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft .badge {\n  color: #2672ec;\n  background-color: #fff;\n}\n.btn-openid {\n  color: #fff;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:hover,\n.btn-openid:focus,\n.btn-openid.focus,\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  color: #fff;\n  background-color: #da7908;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  background-image: none;\n}\n.btn-openid.disabled,\n.btn-openid[disabled],\nfieldset[disabled] .btn-openid,\n.btn-openid.disabled:hover,\n.btn-openid[disabled]:hover,\nfieldset[disabled] .btn-openid:hover,\n.btn-openid.disabled:focus,\n.btn-openid[disabled]:focus,\nfieldset[disabled] .btn-openid:focus,\n.btn-openid.disabled.focus,\n.btn-openid[disabled].focus,\nfieldset[disabled] .btn-openid.focus,\n.btn-openid.disabled:active,\n.btn-openid[disabled]:active,\nfieldset[disabled] .btn-openid:active,\n.btn-openid.disabled.active,\n.btn-openid[disabled].active,\nfieldset[disabled] .btn-openid.active {\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid .badge {\n  color: #f7931e;\n  background-color: #fff;\n}\n.btn-pinterest {\n  color: #fff;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:hover,\n.btn-pinterest:focus,\n.btn-pinterest.focus,\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  color: #fff;\n  background-color: #9f191f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  background-image: none;\n}\n.btn-pinterest.disabled,\n.btn-pinterest[disabled],\nfieldset[disabled] .btn-pinterest,\n.btn-pinterest.disabled:hover,\n.btn-pinterest[disabled]:hover,\nfieldset[disabled] .btn-pinterest:hover,\n.btn-pinterest.disabled:focus,\n.btn-pinterest[disabled]:focus,\nfieldset[disabled] .btn-pinterest:focus,\n.btn-pinterest.disabled.focus,\n.btn-pinterest[disabled].focus,\nfieldset[disabled] .btn-pinterest.focus,\n.btn-pinterest.disabled:active,\n.btn-pinterest[disabled]:active,\nfieldset[disabled] .btn-pinterest:active,\n.btn-pinterest.disabled.active,\n.btn-pinterest[disabled].active,\nfieldset[disabled] .btn-pinterest.active {\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest .badge {\n  color: #cb2027;\n  background-color: #fff;\n}\n.btn-reddit {\n  color: #000;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:hover,\n.btn-reddit:focus,\n.btn-reddit.focus,\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  color: #000;\n  background-color: #bcddff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  background-image: none;\n}\n.btn-reddit.disabled,\n.btn-reddit[disabled],\nfieldset[disabled] .btn-reddit,\n.btn-reddit.disabled:hover,\n.btn-reddit[disabled]:hover,\nfieldset[disabled] .btn-reddit:hover,\n.btn-reddit.disabled:focus,\n.btn-reddit[disabled]:focus,\nfieldset[disabled] .btn-reddit:focus,\n.btn-reddit.disabled.focus,\n.btn-reddit[disabled].focus,\nfieldset[disabled] .btn-reddit.focus,\n.btn-reddit.disabled:active,\n.btn-reddit[disabled]:active,\nfieldset[disabled] .btn-reddit:active,\n.btn-reddit.disabled.active,\n.btn-reddit[disabled].active,\nfieldset[disabled] .btn-reddit.active {\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit .badge {\n  color: #eff7ff;\n  background-color: #000;\n}\n.btn-soundcloud {\n  color: #fff;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:hover,\n.btn-soundcloud:focus,\n.btn-soundcloud.focus,\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  color: #fff;\n  background-color: #cc4400;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  background-image: none;\n}\n.btn-soundcloud.disabled,\n.btn-soundcloud[disabled],\nfieldset[disabled] .btn-soundcloud,\n.btn-soundcloud.disabled:hover,\n.btn-soundcloud[disabled]:hover,\nfieldset[disabled] .btn-soundcloud:hover,\n.btn-soundcloud.disabled:focus,\n.btn-soundcloud[disabled]:focus,\nfieldset[disabled] .btn-soundcloud:focus,\n.btn-soundcloud.disabled.focus,\n.btn-soundcloud[disabled].focus,\nfieldset[disabled] .btn-soundcloud.focus,\n.btn-soundcloud.disabled:active,\n.btn-soundcloud[disabled]:active,\nfieldset[disabled] .btn-soundcloud:active,\n.btn-soundcloud.disabled.active,\n.btn-soundcloud[disabled].active,\nfieldset[disabled] .btn-soundcloud.active {\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud .badge {\n  color: #ff5500;\n  background-color: #fff;\n}\n.btn-tumblr {\n  color: #fff;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:hover,\n.btn-tumblr:focus,\n.btn-tumblr.focus,\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  color: #fff;\n  background-color: #1c2d3f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  background-image: none;\n}\n.btn-tumblr.disabled,\n.btn-tumblr[disabled],\nfieldset[disabled] .btn-tumblr,\n.btn-tumblr.disabled:hover,\n.btn-tumblr[disabled]:hover,\nfieldset[disabled] .btn-tumblr:hover,\n.btn-tumblr.disabled:focus,\n.btn-tumblr[disabled]:focus,\nfieldset[disabled] .btn-tumblr:focus,\n.btn-tumblr.disabled.focus,\n.btn-tumblr[disabled].focus,\nfieldset[disabled] .btn-tumblr.focus,\n.btn-tumblr.disabled:active,\n.btn-tumblr[disabled]:active,\nfieldset[disabled] .btn-tumblr:active,\n.btn-tumblr.disabled.active,\n.btn-tumblr[disabled].active,\nfieldset[disabled] .btn-tumblr.active {\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr .badge {\n  color: #2c4762;\n  background-color: #fff;\n}\n.btn-twitter {\n  color: #fff;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:hover,\n.btn-twitter:focus,\n.btn-twitter.focus,\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  color: #fff;\n  background-color: #2795e9;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  background-image: none;\n}\n.btn-twitter.disabled,\n.btn-twitter[disabled],\nfieldset[disabled] .btn-twitter,\n.btn-twitter.disabled:hover,\n.btn-twitter[disabled]:hover,\nfieldset[disabled] .btn-twitter:hover,\n.btn-twitter.disabled:focus,\n.btn-twitter[disabled]:focus,\nfieldset[disabled] .btn-twitter:focus,\n.btn-twitter.disabled.focus,\n.btn-twitter[disabled].focus,\nfieldset[disabled] .btn-twitter.focus,\n.btn-twitter.disabled:active,\n.btn-twitter[disabled]:active,\nfieldset[disabled] .btn-twitter:active,\n.btn-twitter.disabled.active,\n.btn-twitter[disabled].active,\nfieldset[disabled] .btn-twitter.active {\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter .badge {\n  color: #55acee;\n  background-color: #fff;\n}\n.btn-vimeo {\n  color: #fff;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:hover,\n.btn-vimeo:focus,\n.btn-vimeo.focus,\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  color: #fff;\n  background-color: #1295bf;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  background-image: none;\n}\n.btn-vimeo.disabled,\n.btn-vimeo[disabled],\nfieldset[disabled] .btn-vimeo,\n.btn-vimeo.disabled:hover,\n.btn-vimeo[disabled]:hover,\nfieldset[disabled] .btn-vimeo:hover,\n.btn-vimeo.disabled:focus,\n.btn-vimeo[disabled]:focus,\nfieldset[disabled] .btn-vimeo:focus,\n.btn-vimeo.disabled.focus,\n.btn-vimeo[disabled].focus,\nfieldset[disabled] .btn-vimeo.focus,\n.btn-vimeo.disabled:active,\n.btn-vimeo[disabled]:active,\nfieldset[disabled] .btn-vimeo:active,\n.btn-vimeo.disabled.active,\n.btn-vimeo[disabled].active,\nfieldset[disabled] .btn-vimeo.active {\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo .badge {\n  color: #1ab7ea;\n  background-color: #fff;\n}\n.btn-vk {\n  color: #fff;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:hover,\n.btn-vk:focus,\n.btn-vk.focus,\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  color: #fff;\n  background-color: #466482;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  background-image: none;\n}\n.btn-vk.disabled,\n.btn-vk[disabled],\nfieldset[disabled] .btn-vk,\n.btn-vk.disabled:hover,\n.btn-vk[disabled]:hover,\nfieldset[disabled] .btn-vk:hover,\n.btn-vk.disabled:focus,\n.btn-vk[disabled]:focus,\nfieldset[disabled] .btn-vk:focus,\n.btn-vk.disabled.focus,\n.btn-vk[disabled].focus,\nfieldset[disabled] .btn-vk.focus,\n.btn-vk.disabled:active,\n.btn-vk[disabled]:active,\nfieldset[disabled] .btn-vk:active,\n.btn-vk.disabled.active,\n.btn-vk[disabled].active,\nfieldset[disabled] .btn-vk.active {\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk .badge {\n  color: #587ea3;\n  background-color: #fff;\n}\n.btn-yahoo {\n  color: #fff;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:hover,\n.btn-yahoo:focus,\n.btn-yahoo.focus,\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  color: #fff;\n  background-color: #500a6f;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  background-image: none;\n}\n.btn-yahoo.disabled,\n.btn-yahoo[disabled],\nfieldset[disabled] .btn-yahoo,\n.btn-yahoo.disabled:hover,\n.btn-yahoo[disabled]:hover,\nfieldset[disabled] .btn-yahoo:hover,\n.btn-yahoo.disabled:focus,\n.btn-yahoo[disabled]:focus,\nfieldset[disabled] .btn-yahoo:focus,\n.btn-yahoo.disabled.focus,\n.btn-yahoo[disabled].focus,\nfieldset[disabled] .btn-yahoo.focus,\n.btn-yahoo.disabled:active,\n.btn-yahoo[disabled]:active,\nfieldset[disabled] .btn-yahoo:active,\n.btn-yahoo.disabled.active,\n.btn-yahoo[disabled].active,\nfieldset[disabled] .btn-yahoo.active {\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo .badge {\n  color: #720e9e;\n  background-color: #fff;\n}\n/*\n * Plugin: Full Calendar\n * ---------------------\n */\n.fc-button {\n  background: #f4f4f4;\n  background-image: none;\n  color: #444;\n  border-color: #ddd;\n  border-bottom-color: #ddd;\n}\n.fc-button:hover,\n.fc-button:active,\n.fc-button.hover {\n  background-color: #e9e9e9;\n}\n.fc-header-title h2 {\n  font-size: 15px;\n  line-height: 1.6em;\n  color: #666;\n  margin-left: 10px;\n}\n.fc-header-right {\n  padding-right: 10px;\n}\n.fc-header-left {\n  padding-left: 10px;\n}\n.fc-widget-header {\n  background: #fafafa;\n}\n.fc-grid {\n  width: 100%;\n  border: 0;\n}\n.fc-widget-header:first-of-type,\n.fc-widget-content:first-of-type {\n  border-left: 0;\n  border-right: 0;\n}\n.fc-widget-header:last-of-type,\n.fc-widget-content:last-of-type {\n  border-right: 0;\n}\n.fc-toolbar {\n  padding: 10px;\n  margin: 0;\n}\n.fc-day-number {\n  font-size: 20px;\n  font-weight: 300;\n  padding-right: 10px;\n}\n.fc-color-picker {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.fc-color-picker > li {\n  float: left;\n  font-size: 30px;\n  margin-right: 5px;\n  line-height: 30px;\n}\n.fc-color-picker > li .fa {\n  -webkit-transition: -webkit-transform linear 0.3s;\n  -moz-transition: -moz-transform linear 0.3s;\n  -o-transition: -o-transform linear 0.3s;\n  transition: transform linear 0.3s;\n}\n.fc-color-picker > li .fa:hover {\n  -webkit-transform: rotate(30deg);\n  -ms-transform: rotate(30deg);\n  -o-transform: rotate(30deg);\n  transform: rotate(30deg);\n}\n#add-new-event {\n  -webkit-transition: all linear 0.3s;\n  -o-transition: all linear 0.3s;\n  transition: all linear 0.3s;\n}\n.external-event {\n  padding: 5px 10px;\n  font-weight: bold;\n  margin-bottom: 4px;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  border-radius: 3px;\n  cursor: move;\n}\n.external-event:hover {\n  box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);\n}\n/*\n * Plugin: Select2\n * ---------------\n */\n.select2-container--default.select2-container--focus,\n.select2-selection.select2-container--focus,\n.select2-container--default:focus,\n.select2-selection:focus,\n.select2-container--default:active,\n.select2-selection:active {\n  outline: none;\n}\n.select2-container--default .select2-selection--single,\n.select2-selection .select2-selection--single {\n  border: 1px solid #d2d6de;\n  border-radius: 0;\n  padding: 6px 12px;\n  height: 34px;\n}\n.select2-container--default.select2-container--open {\n  border-color: #3c8dbc;\n}\n.select2-dropdown {\n  border: 1px solid #d2d6de;\n  border-radius: 0;\n}\n.select2-container--default .select2-results__option--highlighted[aria-selected] {\n  background-color: #3c8dbc;\n  color: white;\n}\n.select2-results__option {\n  padding: 6px 12px;\n  user-select: none;\n  -webkit-user-select: none;\n}\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-left: 0;\n  padding-right: 0;\n  height: auto;\n  margin-top: -4px;\n}\n.select2-container[dir=\"rtl\"] .select2-selection--single .select2-selection__rendered {\n  padding-right: 6px;\n  padding-left: 20px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow {\n  height: 28px;\n  right: 3px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow b {\n  margin-top: 0;\n}\n.select2-dropdown .select2-search__field,\n.select2-search--inline .select2-search__field {\n  border: 1px solid #d2d6de;\n}\n.select2-dropdown .select2-search__field:focus,\n.select2-search--inline .select2-search__field:focus {\n  outline: none;\n  border: 1px solid #3c8dbc;\n}\n.select2-container--default .select2-results__option[aria-disabled=true] {\n  color: #999;\n}\n.select2-container--default .select2-results__option[aria-selected=true] {\n  background-color: #ddd;\n}\n.select2-container--default .select2-results__option[aria-selected=true],\n.select2-container--default .select2-results__option[aria-selected=true]:hover {\n  color: #444;\n}\n.select2-container--default .select2-selection--multiple {\n  border: 1px solid #d2d6de;\n  border-radius: 0;\n}\n.select2-container--default .select2-selection--multiple:focus {\n  border-color: #3c8dbc;\n}\n.select2-container--default.select2-container--focus .select2-selection--multiple {\n  border-color: #d2d6de;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice {\n  background-color: #3c8dbc;\n  border-color: #367fa9;\n  padding: 1px 10px;\n  color: #fff;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {\n  margin-right: 5px;\n  color: rgba(255, 255, 255, 0.7);\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {\n  color: #fff;\n}\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-right: 10px;\n}\n/*\n * General: Miscellaneous\n * ----------------------\n */\n.pad {\n  padding: 10px;\n}\n.margin {\n  margin: 10px;\n}\n.margin-bottom {\n  margin-bottom: 20px;\n}\n.margin-bottom-none {\n  margin-bottom: 0;\n}\n.margin-r-5 {\n  margin-right: 5px;\n}\n.inline {\n  display: inline;\n}\n.description-block {\n  display: block;\n  margin: 10px 0;\n  text-align: center;\n}\n.description-block.margin-bottom {\n  margin-bottom: 25px;\n}\n.description-block > .description-header {\n  margin: 0;\n  padding: 0;\n  font-weight: 600;\n  font-size: 16px;\n}\n.description-block > .description-text {\n  text-transform: uppercase;\n}\n.bg-red,\n.bg-yellow,\n.bg-aqua,\n.bg-blue,\n.bg-light-blue,\n.bg-green,\n.bg-navy,\n.bg-teal,\n.bg-olive,\n.bg-lime,\n.bg-orange,\n.bg-fuchsia,\n.bg-purple,\n.bg-maroon,\n.bg-black,\n.bg-red-active,\n.bg-yellow-active,\n.bg-aqua-active,\n.bg-blue-active,\n.bg-light-blue-active,\n.bg-green-active,\n.bg-navy-active,\n.bg-teal-active,\n.bg-olive-active,\n.bg-lime-active,\n.bg-orange-active,\n.bg-fuchsia-active,\n.bg-purple-active,\n.bg-maroon-active,\n.bg-black-active,\n.callout.callout-danger,\n.callout.callout-warning,\n.callout.callout-info,\n.callout.callout-success,\n.alert-success,\n.alert-danger,\n.alert-error,\n.alert-warning,\n.alert-info,\n.label-danger,\n.label-info,\n.label-warning,\n.label-primary,\n.label-success,\n.modal-primary .modal-body,\n.modal-primary .modal-header,\n.modal-primary .modal-footer,\n.modal-warning .modal-body,\n.modal-warning .modal-header,\n.modal-warning .modal-footer,\n.modal-info .modal-body,\n.modal-info .modal-header,\n.modal-info .modal-footer,\n.modal-success .modal-body,\n.modal-success .modal-header,\n.modal-success .modal-footer,\n.modal-danger .modal-body,\n.modal-danger .modal-header,\n.modal-danger .modal-footer {\n  color: #fff !important;\n}\n.bg-gray {\n  color: #000;\n  background-color: #d2d6de !important;\n}\n.bg-gray-light {\n  background-color: #f7f7f7;\n}\n.bg-black {\n  background-color: #111 !important;\n}\n.bg-red,\n.callout.callout-danger,\n.alert-danger,\n.alert-error,\n.label-danger,\n.modal-danger .modal-body {\n  background-color: #dd4b39 !important;\n}\n.bg-yellow,\n.callout.callout-warning,\n.alert-warning,\n.label-warning,\n.modal-warning .modal-body {\n  background-color: #f39c12 !important;\n}\n.bg-aqua,\n.callout.callout-info,\n.alert-info,\n.label-info,\n.modal-info .modal-body {\n  background-color: #00c0ef !important;\n}\n.bg-blue {\n  background-color: #0073b7 !important;\n}\n.bg-light-blue,\n.label-primary,\n.modal-primary .modal-body {\n  background-color: #3c8dbc !important;\n}\n.bg-green,\n.callout.callout-success,\n.alert-success,\n.label-success,\n.modal-success .modal-body {\n  background-color: #00a65a !important;\n}\n.bg-navy {\n  background-color: #001F3F !important;\n}\n.bg-teal {\n  background-color: #39CCCC !important;\n}\n.bg-olive {\n  background-color: #3D9970 !important;\n}\n.bg-lime {\n  background-color: #01FF70 !important;\n}\n.bg-orange {\n  background-color: #FF851B !important;\n}\n.bg-fuchsia {\n  background-color: #F012BE !important;\n}\n.bg-purple {\n  background-color: #605ca8 !important;\n}\n.bg-maroon {\n  background-color: #D81B60 !important;\n}\n.bg-gray-active {\n  color: #000;\n  background-color: #b5bbc8 !important;\n}\n.bg-black-active {\n  background-color: #000000 !important;\n}\n.bg-red-active,\n.modal-danger .modal-header,\n.modal-danger .modal-footer {\n  background-color: #d33724 !important;\n}\n.bg-yellow-active,\n.modal-warning .modal-header,\n.modal-warning .modal-footer {\n  background-color: #db8b0b !important;\n}\n.bg-aqua-active,\n.modal-info .modal-header,\n.modal-info .modal-footer {\n  background-color: #00a7d0 !important;\n}\n.bg-blue-active {\n  background-color: #005384 !important;\n}\n.bg-light-blue-active,\n.modal-primary .modal-header,\n.modal-primary .modal-footer {\n  background-color: #357ca5 !important;\n}\n.bg-green-active,\n.modal-success .modal-header,\n.modal-success .modal-footer {\n  background-color: #008d4c !important;\n}\n.bg-navy-active {\n  background-color: #001a35 !important;\n}\n.bg-teal-active {\n  background-color: #30bbbb !important;\n}\n.bg-olive-active {\n  background-color: #368763 !important;\n}\n.bg-lime-active {\n  background-color: #00e765 !important;\n}\n.bg-orange-active {\n  background-color: #ff7701 !important;\n}\n.bg-fuchsia-active {\n  background-color: #db0ead !important;\n}\n.bg-purple-active {\n  background-color: #555299 !important;\n}\n.bg-maroon-active {\n  background-color: #ca195a !important;\n}\n[class^=\"bg-\"].disabled {\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n}\n.text-red {\n  color: #dd4b39 !important;\n}\n.text-yellow {\n  color: #f39c12 !important;\n}\n.text-aqua {\n  color: #00c0ef !important;\n}\n.text-blue {\n  color: #0073b7 !important;\n}\n.text-black {\n  color: #111 !important;\n}\n.text-light-blue {\n  color: #3c8dbc !important;\n}\n.text-green {\n  color: #00a65a !important;\n}\n.text-gray {\n  color: #d2d6de !important;\n}\n.text-navy {\n  color: #001F3F !important;\n}\n.text-teal {\n  color: #39CCCC !important;\n}\n.text-olive {\n  color: #3D9970 !important;\n}\n.text-lime {\n  color: #01FF70 !important;\n}\n.text-orange {\n  color: #FF851B !important;\n}\n.text-fuchsia {\n  color: #F012BE !important;\n}\n.text-purple {\n  color: #605ca8 !important;\n}\n.text-maroon {\n  color: #D81B60 !important;\n}\n.link-muted {\n  color: #7a869d;\n}\n.link-muted:hover,\n.link-muted:focus {\n  color: #606c84;\n}\n.link-black {\n  color: #666;\n}\n.link-black:hover,\n.link-black:focus {\n  color: #999;\n}\n.hide {\n  display: none !important;\n}\n.no-border {\n  border: 0 !important;\n}\n.no-padding {\n  padding: 0 !important;\n}\n.no-margin {\n  margin: 0 !important;\n}\n.no-shadow {\n  box-shadow: none!important;\n}\n.list-unstyled,\n.chart-legend,\n.contacts-list,\n.users-list {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.list-group-unbordered > .list-group-item {\n  border-left: 0;\n  border-right: 0;\n  border-radius: 0;\n  padding-left: 0;\n  padding-right: 0;\n}\n.flat {\n  border-radius: 0 !important;\n}\n.text-bold,\n.text-bold.table td,\n.text-bold.table th {\n  font-weight: 700;\n}\n.text-sm {\n  font-size: 12px;\n}\n.jqstooltip {\n  padding: 5px!important;\n  width: auto!important;\n  height: auto!important;\n}\n.bg-teal-gradient {\n  background: #39CCCC !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39CCCC), color-stop(1, #7adddd)) !important;\n  background: -ms-linear-gradient(bottom, #39CCCC, #7adddd) !important;\n  background: -moz-linear-gradient(center bottom, #39CCCC 0%, #7adddd 100%) !important;\n  background: -o-linear-gradient(#7adddd, #39CCCC) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39CCCC', GradientType=0) !important;\n  color: #fff;\n}\n.bg-light-blue-gradient {\n  background: #3c8dbc !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;\n  background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;\n  background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important;\n  background: -o-linear-gradient(#67a8ce, #3c8dbc) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;\n  color: #fff;\n}\n.bg-blue-gradient {\n  background: #0073b7 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;\n  background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important;\n  background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important;\n  background: -o-linear-gradient(#0089db, #0073b7) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;\n  color: #fff;\n}\n.bg-aqua-gradient {\n  background: #00c0ef !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;\n  background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;\n  background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important;\n  background: -o-linear-gradient(#14d1ff, #00c0ef) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;\n  color: #fff;\n}\n.bg-yellow-gradient {\n  background: #f39c12 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;\n  background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;\n  background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important;\n  background: -o-linear-gradient(#f7bc60, #f39c12) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;\n  color: #fff;\n}\n.bg-purple-gradient {\n  background: #605ca8 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;\n  background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important;\n  background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important;\n  background: -o-linear-gradient(#9491c4, #605ca8) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;\n  color: #fff;\n}\n.bg-green-gradient {\n  background: #00a65a !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;\n  background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;\n  background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important;\n  background: -o-linear-gradient(#00ca6d, #00a65a) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;\n  color: #fff;\n}\n.bg-red-gradient {\n  background: #dd4b39 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;\n  background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important;\n  background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important;\n  background: -o-linear-gradient(#e47365, #dd4b39) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;\n  color: #fff;\n}\n.bg-black-gradient {\n  background: #111 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;\n  background: -ms-linear-gradient(bottom, #111, #2b2b2b) !important;\n  background: -moz-linear-gradient(center bottom, #111 0%, #2b2b2b 100%) !important;\n  background: -o-linear-gradient(#2b2b2b, #111) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111', GradientType=0) !important;\n  color: #fff;\n}\n.bg-maroon-gradient {\n  background: #D81B60 !important;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #D81B60), color-stop(1, #e73f7c)) !important;\n  background: -ms-linear-gradient(bottom, #D81B60, #e73f7c) !important;\n  background: -moz-linear-gradient(center bottom, #D81B60 0%, #e73f7c 100%) !important;\n  background: -o-linear-gradient(#e73f7c, #D81B60) !important;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#D81B60', GradientType=0) !important;\n  color: #fff;\n}\n.description-block .description-icon {\n  font-size: 16px;\n}\n.no-pad-top {\n  padding-top: 0;\n}\n.position-static {\n  position: static!important;\n}\n.list-header {\n  font-size: 15px;\n  padding: 10px 4px;\n  font-weight: bold;\n  color: #666;\n}\n.list-seperator {\n  height: 1px;\n  background: #f4f4f4;\n  margin: 15px 0 9px 0;\n}\n.list-link > a {\n  padding: 4px;\n  color: #777;\n}\n.list-link > a:hover {\n  color: #222;\n}\n.font-light {\n  font-weight: 300;\n}\n.user-block:before,\n.user-block:after {\n  content: \" \";\n  display: table;\n}\n.user-block:after {\n  clear: both;\n}\n.user-block img {\n  width: 40px;\n  height: 40px;\n  float: left;\n}\n.user-block .username,\n.user-block .description,\n.user-block .comment {\n  display: block;\n  margin-left: 50px;\n}\n.user-block .username {\n  font-size: 16px;\n  font-weight: 600;\n}\n.user-block .description {\n  color: #999;\n  font-size: 13px;\n}\n.user-block.user-block-sm .username,\n.user-block.user-block-sm .description,\n.user-block.user-block-sm .comment {\n  margin-left: 40px;\n}\n.user-block.user-block-sm .username {\n  font-size: 14px;\n}\n.img-sm,\n.img-md,\n.img-lg,\n.box-comments .box-comment img,\n.user-block.user-block-sm img {\n  float: left;\n}\n.img-sm,\n.box-comments .box-comment img,\n.user-block.user-block-sm img {\n  width: 30px!important;\n  height: 30px!important;\n}\n.img-sm + .img-push {\n  margin-left: 40px;\n}\n.img-md {\n  width: 60px;\n  height: 60px;\n}\n.img-md + .img-push {\n  margin-left: 70px;\n}\n.img-lg {\n  width: 100px;\n  height: 100px;\n}\n.img-lg + .img-push {\n  margin-left: 110px;\n}\n.img-bordered {\n  border: 3px solid #d2d6de;\n  padding: 3px;\n}\n.img-bordered-sm {\n  border: 2px solid #d2d6de;\n  padding: 2px;\n}\n.attachment-block {\n  border: 1px solid #f4f4f4;\n  padding: 5px;\n  margin-bottom: 10px;\n  background: #f7f7f7;\n}\n.attachment-block .attachment-img {\n  max-width: 100px;\n  max-height: 100px;\n  height: auto;\n  float: left;\n}\n.attachment-block .attachment-pushed {\n  margin-left: 110px;\n}\n.attachment-block .attachment-heading {\n  margin: 0;\n}\n.attachment-block .attachment-text {\n  color: #555;\n}\n.connectedSortable {\n  min-height: 100px;\n}\n.ui-helper-hidden-accessible {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n.sort-highlight {\n  background: #f4f4f4;\n  border: 1px dashed #ddd;\n  margin-bottom: 10px;\n}\n.full-opacity-hover {\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n}\n.full-opacity-hover:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n.chart {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.chart svg,\n.chart canvas {\n  width: 100%!important;\n}\n/*\n * Misc: print\n * -----------\n */\n@media print {\n  .no-print,\n  .main-sidebar,\n  .left-side,\n  .main-header,\n  .content-header {\n    display: none!important;\n  }\n  .content-wrapper,\n  .right-side,\n  .main-footer {\n    margin-left: 0!important;\n    min-height: 0!important;\n    -webkit-transform: translate(0, 0) !important;\n    -ms-transform: translate(0, 0) !important;\n    -o-transform: translate(0, 0) !important;\n    transform: translate(0, 0) !important;\n  }\n  .fixed .content-wrapper,\n  .fixed .right-side {\n    padding-top: 0!important;\n  }\n  .invoice {\n    width: 100%;\n    border: 0;\n    margin: 0;\n    padding: 0;\n  }\n  .invoice-col {\n    float: left;\n    width: 33.3333333%;\n  }\n  .table-responsive {\n    overflow: auto;\n  }\n  .table-responsive > .table tr th,\n  .table-responsive > .table tr td {\n    white-space: normal!important;\n  }\n}\n","/*\n * Core: General Layout Style\n * -------------------------\n */\nhtml,\nbody {\n  min-height: 100%;\n  .layout-boxed & {\n    height: 100%;\n  }\n}\n\nbody {\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-weight: 400;\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n/* Layout */\n.wrapper {\n  .clearfix();\n  min-height: 100%;\n  position: static;\n  overflow: hidden;\n  .layout-boxed & {\n    max-width: 1250px;\n    margin: 0 auto;\n    min-height: 100%;\n    box-shadow: 0 0 8px rgba(0,0,0,0.5);\n    position: relative;\n  }\n}\n\n.layout-boxed {\n  background: url('@{boxed-layout-bg-image-path}') repeat fixed;\n}\n\n/*\n * Content Wrapper - contains the main content\n * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```\n */\n.content-wrapper,\n.right-side,\n.main-footer {\n  //Using disposable variable to join statements with a comma\n  @transition-rule: @transition-speed @transition-fn,\n    margin @transition-speed @transition-fn;\n  .transition-transform(@transition-rule);\n  margin-left: @sidebar-width;\n  z-index: 820;\n  //Top nav layout\n  .layout-top-nav & {\n    margin-left: 0;\n  }\n  @media (max-width: @screen-xs-max) {\n    margin-left: 0;\n  }\n  //When opening the sidebar on large screens\n  .sidebar-collapse & {\n    @media (min-width: @screen-sm) {\n      margin-left: 0;\n    }\n  }\n  //When opening the sidebar on small screens\n  .sidebar-open & {\n    @media (max-width: @screen-xs-max) {\n      .translate(@sidebar-width, 0);\n    }\n  }\n}\n\n.content-wrapper,\n.right-side {\n  min-height: 100%;\n  background-color: @body-bg;\n  z-index: 800;\n}\n.main-footer {\n  background: #fff;\n  padding: 15px;\n  color: #444;\n  border-top: 1px solid @gray;\n}\n\n/* Fixed layout */\n.fixed {\n  .main-header,\n  .main-sidebar,\n  .left-side {\n    position: fixed;\n  }\n  .main-header {\n    top: 0;\n    right: 0;\n    left: 0;\n  }\n  .content-wrapper,\n  .right-side {\n    padding-top: 50px;\n    @media (max-width: @screen-header-collapse) {\n      padding-top: 100px;\n    }\n  }\n  &.layout-boxed {\n    .wrapper {\n      max-width: 100%;\n    }\n  }\n}\n\nbody.hold-transition { \n    .content-wrapper, \n    .right-side, \n    .main-footer, \n    .main-sidebar, \n    .left-side, \n    .main-header > .navbar,\n    .main-header .logo {\n      /* Fix for IE */\n      .transition(none);\n    }\n}\n\n/* Content */\n.content {\n  min-height: 250px;\n  padding: 15px;\n  .container-fixed(@grid-gutter-width);\n}\n\n/* H1 - H6 font */\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: 'Source Sans Pro', sans-serif;\n}\n/* General Links */\na {\n  color: @link-color;\n}\na:hover,\na:active,\na:focus {\n  outline: none;\n  text-decoration: none;\n  color: @link-hover-color;\n}\n\n/* Page Header */\n.page-header {\n  margin: 10px 0 20px 0;\n  font-size: 22px;\n\n  > small {\n    color: #666;\n    display: block;\n    margin-top: 5px;\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n","/*\n * Component: Main Header\n * ----------------------\n */\n\n.main-header {\n  position: relative;\n  max-height: 100px;\n  z-index: 1030;\n  //Navbar\n  > .navbar {\n    .transition(margin-left @transition-speed @transition-fn);\n    margin-bottom: 0;\n    margin-left: @sidebar-width;\n    border: none;\n    min-height: @navbar-height;\n    border-radius: 0;\n    .layout-top-nav & {\n      margin-left: 0;\n    }\n  }\n  //Navbar search text input\n  #navbar-search-input.form-control {\n    background: rgba(255,255,255,.2);\n    border-color: transparent;\n    &:focus,\n      &:active {\n      border-color: rgba(0,0,0,.1);\n      background: rgba(255,255,255,.9);\n    }\n    &::-moz-placeholder {\n      color: #ccc;\n      opacity: 1;\n    }\n    &:-ms-input-placeholder {\n      color: #ccc;\n    }\n    &::-webkit-input-placeholder {\n      color: #ccc;\n    }\n  }\n  //Navbar Right Menu\n  .navbar-custom-menu,\n  .navbar-right {\n    float: right;\n    @media (max-width: @screen-sm-max) {\n       a {\n        color: inherit;\n        background: transparent;\n      }\n    }\n  }\n  .navbar-right {\n    @media (max-width: @screen-header-collapse) {\n      float: none;\n      .navbar-collapse & {\n        margin: 7.5px -15px;\n      }\n      > li {\n        color: inherit;\n        border: 0;\n      }\n    }\n  }\n  //Navbar toggle button\n  .sidebar-toggle {\n    float: left;\n    background-color: transparent;\n    background-image: none;\n    padding: @navbar-padding-vertical @navbar-padding-horizontal;\n    //Add the fontawesome bars icon\n    font-family: fontAwesome;\n    &:before {\n      content: \"\\f0c9\";\n    }\n    &:hover {\n      color: #fff;\n    }\n    &:focus,\n    &:active {\n      background: transparent;\n    }\n  }\n  .sidebar-toggle .icon-bar {\n    display: none;\n  }\n  //Navbar User Menu\n  .navbar .nav > li.user > a {\n    > .fa,\n    > .glyphicon,\n    > .ion {\n      margin-right: 5px;\n    }\n  }\n\n  //Labels in navbar\n  .navbar .nav > li > a > .label {\n    position: absolute;\n    top: 9px;\n    right: 7px;\n    text-align: center;\n    font-size: 9px;\n    padding: 2px 3px;\n    line-height: .9;\n  }\n\n  //Logo bar\n  .logo {\n    .transition(width @transition-speed @transition-fn);\n    display: block;\n    float: left;\n    height: @navbar-height;\n    font-size: 20px;\n    line-height: 50px;\n    text-align: center;\n    width: @sidebar-width;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    padding: 0 15px;\n    font-weight: 300;\n    overflow: hidden;\n    //Add support to sidebar mini by allowing the user to create\n    //2 logo designs. mini and lg\n    .logo-lg {\n      //should be visibile when sidebar isn't collapsed\n      display: block;\n    }\n    .logo-mini {\n      display: none;\n    }\n  }\n  //Navbar Brand. Alternative logo with layout-top-nav\n  .navbar-brand {\n    color: #fff;\n  }\n}\n\n// Content Header\n.content-header {\n  position: relative;\n  padding: 15px 15px 0 15px;\n  // Header Text\n  > h1 {\n    margin: 0;\n    font-size: 24px;\n    > small {\n      font-size: 15px;\n      display: inline-block;\n      padding-left: 4px;\n      font-weight: 300;\n    }\n  }\n\n  > .breadcrumb {\n    float: right;\n    background: transparent;\n    margin-top: 0;\n    margin-bottom: 0;\n    font-size: 12px;\n    padding: 7px 5px;\n    position: absolute;\n    top: 15px;\n    right: 10px;\n    .border-radius(2px);\n    > li > a {\n      color: #444;\n      text-decoration: none;\n      display: inline-block;\n      > .fa, > .glyphicon, > .ion {\n        margin-right: 5px;\n      }\n    }\n    > li + li:before {\n      content: '>\\00a0';\n    }\n  }\n\n  @media (max-width: @screen-sm-max) {\n    > .breadcrumb {\n      position: relative;\n      margin-top: 5px;\n      top: 0;\n      right: 0;\n      float: none;\n      background: @gray;\n      padding-left: 10px;\n      li:before {\n        color: darken(@gray, 20%);\n      }\n    }\n  }\n}\n.navbar-toggle {\n  color: #fff;\n  border: 0;\n  margin: 0;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n}\n//Control navbar scaffolding on x-small screens\n@media (max-width: @screen-sm-max) {\n  .navbar-custom-menu .navbar-nav > li {\n    float: left;\n  }\n  //Dont't let links get full width\n  .navbar-custom-menu .navbar-nav {\n    margin: 0;\n    float: left;\n  }\n\n  .navbar-custom-menu .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n    line-height: 20px;\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-header-collapse) {\n  .main-header {\n    position: relative;\n    .logo,\n    .navbar {\n      width: 100%;\n      float: none;\n    }\n    .navbar {\n      margin: 0;\n    }\n    .navbar-custom-menu {\n      float: right;\n    }\n  }\n}\n\n.navbar-collapse.pull-left {\n  @media(max-width: @screen-sm-max) {\n    float: none!important;\n    + .navbar-custom-menu {\n      display: block;\n      position: absolute;\n      top: 0;\n      right: 40px;\n    }\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-sm-max) {\n  .content-header {\n    padding-top: 110px;\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-sm-max) {\n  ul.sidebar-menu {\n    padding-top: 120px;\n  }\n}\n\n// Collapse header\n@media (max-width: @screen-sm-max) {\n  .sidebar-toggle-mobile a {\n    color: white;\n  }\n}\n\n\n\n","//AdminLTE mixins\n//===============\n\n\n//Changes the color and the hovering properties of the navbar\n.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) {\n  background-color: @color;\n  //Navbar links\n  .nav > li > a {\n    color: @font-color;\n  }\n\n  .nav > li > a:hover,\n    .nav > li > a:active,\n    .nav > li > a:focus,\n    .nav .open > a,\n    .nav .open > a:hover,\n    .nav .open > a:focus,\n    .nav > .active > a {\n    background: @hover-bg;\n    color: @hover-color;\n  }\n\n  //Add color to the sidebar toggle button\n  .sidebar-toggle {\n    color: @font-color;\n    &:hover {\n      color: @hover-color;\n      background: @hover-bg;\n    }\n  }\n}\n\n//Logo color variation\n.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) {\n  background-color: @bg-color;\n  color: @color;\n  border-bottom: @border-bottom-width solid @border-bottom-color;\n\n  &:hover {\n    background-color: darken(@bg-color, 1%);\n  }\n}\n\n//Box solid color variantion creator\n.box-solid-variant(@color; @text-color: #fff) {\n  border: 1px solid @color;\n  > .box-header {\n    color: @text-color;\n    background: @color;\n    background-color: @color;\n    a,\n    .btn {\n      color: @text-color;\n    }\n  }\n}\n\n//Direct Chat Variant\n.direct-chat-variant(@bg-color; @color: #fff) {\n  .right > .direct-chat-text {\n    background: @bg-color;\n    border-color: @bg-color;\n    color: @color;\n    &:after,\n      &:before {\n      border-left-color: @bg-color;\n    }\n  }\n}\n\n//border radius creator\n.border-radius(@radius) {\n  border-radius: @radius;\n}\n//Different radius each side\n.border-radius(@top-left; @top-right; @bottom-left; @bottom-right) {\n  border-top-left-radius: @top-left;\n  border-top-right-radius: @top-right;\n  border-bottom-right-radius: @bottom-right;\n  border-bottom-left-radius: @bottom-left;\n}\n\n//Gradient background\n.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) {\n  background: @color;\n  background: -webkit-gradient(linear,\n    left bottom,\n    left top,\n    color-stop(0, @start),\n    color-stop(1, @stop));\n  background: -ms-linear-gradient(bottom,\n    @start,\n    @stop);\n  background: -moz-linear-gradient(center bottom,\n    @start 0%,\n    @stop 100%);\n  background: -o-linear-gradient(@stop,\n    @start);\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",@stop,@start));\n}\n\n//Added 2.1.0\n//Skins Mixins\n\n//Dark Sidebar Mixin\n.skin-dark-sidebar(@link-hover-border-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-dark-bg;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: #fff;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-dark-bg, 20%);\n      background: darken(@sidebar-dark-bg, 4%);\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n    }\n    //Hover and active states\n    &:hover > a, &.active > a {\n      color: @sidebar-dark-hover-color;\n      background: @sidebar-dark-hover-bg;\n      border-left-color: @link-hover-border-color;\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      margin: 0 1px;\n      background: @sidebar-dark-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-dark-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-dark-submenu-color;\n      }\n      &.active > a, > a:hover {\n        color: @sidebar-dark-submenu-hover-color;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid lighten(@sidebar-dark-bg, 10%);\n    margin: 10px 10px;\n    input[type=\"text\"], .btn {\n      box-shadow: none;\n      background-color: lighten(@sidebar-dark-bg, 10%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus, &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n}\n\n//Light Sidebar Mixin\n.skin-light-sidebar(@icon-active-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-light-bg;\n  }\n  .content-wrapper,\n  .main-footer {\n    border-left: 1px solid @gray;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: @sidebar-light-color;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    .transition(border-left-color .3s ease);\n    //border-left: 3px solid transparent;\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-light-color, 25%);\n      background: @sidebar-light-bg;\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n      font-weight: 600;\n    }\n    //Hover and active states\n    &:hover > a,\n      &.active > a {\n      color: @sidebar-light-hover-color;\n      background: @sidebar-light-hover-bg;\n    }\n    &:hover > a {\n\n    }\n    &.active {\n      border-left-color: @icon-active-color;\n      > a {\n        font-weight: 600;\n      }\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      background: @sidebar-light-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-light-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-light-submenu-color;\n      }\n      &.active > a,\n      > a:hover {\n        color: @sidebar-light-submenu-hover-color;\n      }\n      &.active > a {\n        font-weight: 600;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid @gray;//darken(@sidebar-light-bg, 5%);\n    margin: 10px 10px;\n    input[type=\"text\"],\n    .btn {\n      box-shadow: none;\n      background-color: #fff;//darken(@sidebar-light-bg, 3%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus,\n        &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n  @media(min-width: @screen-sm-min) {\n    &.sidebar-mini.sidebar-collapse {\n      .sidebar-menu > li > .treeview-menu {\n        border-left: 1px solid @gray;\n      }\n    }\n  }\n}\n","/*\n * Component: Sidebar\n * ------------------\n */\n//Main Sidebar\n// ``` .left-side has been deprecated as of 2.0.0 in favor of .main-sidebar ```\n\n.main-sidebar,\n.left-side {\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding-top: 50px;\n  min-height: 100%;\n  width: @sidebar-width;\n  z-index: 810;\n  //Using disposable variable to join statements with a comma\n  @transition-rule: @transition-speed @transition-fn,\n    width @transition-speed @transition-fn;\n  .transition-transform(@transition-rule);\n  @media (max-width: @screen-header-collapse) {\n      padding-top: 100px;\n  }\n  @media (max-width: @screen-xs-max) {\n    .translate(-@sidebar-width, 0);\n  }\n  .sidebar-collapse & {\n    @media (min-width: @screen-sm) {\n      .translate(-@sidebar-width, 0);\n    }\n  }\n  .sidebar-open & {\n    @media (max-width: @screen-xs-max) {\n      .translate(0, 0);\n    }\n  }\n}\n\n.sidebar {\n  padding-bottom: 10px;\n}\n// remove border from form\n.sidebar-form {\n  input:focus {\n    border-color: transparent;\n  }\n}\n\n//Sidebar user panel\n.user-panel {\n  position: relative;\n  width: 100%;\n  padding: 10px;\n  overflow: hidden;\n  .clearfix();\n  > .image > img {\n    width: 100%;\n    max-width: 45px;\n    height: auto;\n  }\n  > .info {\n    padding: 5px 5px 5px 15px;\n    line-height: 1;\n    position: absolute;\n    left: 55px;\n    > p {\n      font-weight: 600;\n      margin-bottom: 9px;\n    }\n    > a {\n      text-decoration: none;\n      padding-right: 5px;\n      margin-top: 3px;\n      font-size: 11px;\n      > .fa,\n      > .ion,\n      > .glyphicon {\n        margin-right: 3px;\n      }\n    }\n  }\n}\n\n// Sidebar menu\n.sidebar-menu {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  //First Level\n  > li {\n    position: relative;\n    margin: 0;\n    padding: 0;\n    > a {\n      padding: 12px 5px 12px 15px;\n      display: block;\n      > .fa,\n      > .glyphicon,\n      > .ion {\n        width: 20px;\n      }\n    }\n    .label,\n    .badge {\n      margin-top: 3px;\n      margin-right: 5px;\n    }\n  }\n  li.header {\n    padding: 10px 25px 10px 15px;\n    font-size: 12px;\n  }\n  li > a > .fa-angle-left {\n    width: auto;\n    height: auto;\n    padding: 0;\n    margin-right: 10px;\n    margin-top: 3px;\n  }\n  li.active {\n    > a > .fa-angle-left {\n      .rotate(-90deg);\n    }\n    > .treeview-menu {\n      display: block;\n    }\n  }\n\n  // Tree view menu\n  .treeview-menu {\n    display: none;\n    list-style: none;\n    padding:0;\n    margin:0;\n    padding-left: 5px;\n    .treeview-menu {\n      padding-left: 20px;\n    }\n    > li {\n      margin: 0;\n      > a {\n        padding: 5px 5px 5px 15px;\n        display: block;\n        font-size: 14px;\n        > .fa,\n        > .glyphicon,\n        > .ion {\n          width: 20px;\n        }\n        > .fa-angle-left,\n        > .fa-angle-down {\n          width: auto;\n        }\n      }\n    }\n  }\n}\n","/*\n * Component: Sidebar Mini\n */\n\n//Add sidebar-mini class to the body tag to activate this feature\n.sidebar-mini {\n  //Sidebar mini should work only on devices larger than @screen-sm\n  @media (min-width: @screen-sm) {\n    //When the sidebar is collapsed...\n    &.sidebar-collapse {\n\n      //Apply the new margining to the main content and footer\n      .content-wrapper,\n      .right-side,\n      .main-footer {\n        margin-left: 50px!important;\n        z-index: 840;\n      }\n\n      //Modify the sidebar to shrink instead of disappearing\n      .main-sidebar {\n        //Don't go away! Just shrink\n        .translate(0, 0);\n        width: 50px!important;\n        z-index: 850;\n      }\n\n      .sidebar-menu {\n        > li {\n          position: relative;\n          > a {\n            margin-right: 0;\n          }\n          > a > span {\n            border-top-right-radius: 4px;\n          }\n\n          &:not(.treeview) {\n            > a > span {\n              border-bottom-right-radius: 4px;\n            }\n          }\n\n          > .treeview-menu {\n            //Add some padding to the treeview menu\n            padding-top: 5px;\n            padding-bottom: 5px;\n            border-bottom-right-radius: 4px;\n          }\n\n          //Show menu items on hover\n          &:hover {\n            > a {\n              //overflow: visible;\n            }\n            > a > span:not(.pull-right),\n              > .treeview-menu {\n              display: block!important;\n              position: absolute;\n              width: @sidebar-width - 50;\n              left: 50px;\n            }\n\n            //position the header & treeview menus\n            > a > span {\n              top: 0;\n              margin-left: -3px;\n              padding: 12px 5px 12px 20px;\n              background-color: inherit;\n            }\n            > .treeview-menu {\n              top: 44px;\n              margin-left: 0;\n            }\n          }\n        }\n      }\n\n      //Make the sidebar links, menus, labels, badges\n      //and angle icons disappear\n      .main-sidebar .user-panel > .info,\n      .sidebar-form,\n      .sidebar-menu > li > a > span,\n      .sidebar-menu > li > .treeview-menu,\n      .sidebar-menu >li > a > .pull-right,\n      .sidebar-menu li.header {\n        display: none!important;\n        -webkit-transform: translateZ(0);\n      }\n\n      .main-header {\n        //Let's make the logo also shrink and the mini logo to appear\n        .logo {\n          width: 50px;\n          > .logo-mini {\n            display: block;\n            margin-left: -15px;\n            margin-right: -15px;\n            font-size: 18px;\n          }\n          > .logo-lg {\n            display: none;\n          }\n        }\n\n        //Since the logo got smaller, we need to fix the navbar's position\n        .navbar {\n          margin-left: 50px;\n        }\n      }\n    }\n  }\n}\n\n//A fix for text overflow while transitioning from sidebar mini to full sidebar\n.sidebar-menu,\n.main-sidebar .user-panel,\n.sidebar-menu > li.header {\n  white-space: nowrap;\n  overflow: hidden;\n}\n.sidebar-menu:hover {\n  overflow: visible;\n}\n.sidebar-form,\n.sidebar-menu > li.header {\n  overflow: hidden;\n  text-overflow: clip;\n}\n.sidebar-menu li > a {\n  position: relative;\n  > .pull-right {\n    position: absolute;\n    top: 50%;\n    right: 10px;\n    margin-top: -7px;\n  }\n}\n","/*\n * Component: Control sidebar. By default, this is the right sidebar.\n */\n//The sidebar's background control class\n//This is a hack to make the background visible while scrolling\n.control-sidebar-bg {\n  position: fixed;\n  z-index: 1000;\n  bottom: 0;\n}\n//Transitions\n.control-sidebar-bg,\n.control-sidebar {\n  top: 0;\n  right: -@control-sidebar-width;\n  width: @control-sidebar-width;\n  .transition(right @transition-speed ease-in-out);\n}\n//The sidebar\n.control-sidebar {\n  position: absolute;\n  padding-top: @navbar-height;\n  z-index: 1010;\n  //Fix position after header collapse\n  @media (max-width: @screen-sm) {\n    padding-top: @navbar-height + 50;\n  }\n  //Tab panes\n  > .tab-content {\n    padding: 10px 15px;\n  }\n  //Open state with slide over content effect\n  &.control-sidebar-open {\n    &,\n    + .control-sidebar-bg {\n      right: 0;\n    }\n  }\n}\n//Open without slide over content\n.control-sidebar-open {\n  .control-sidebar-bg,\n  .control-sidebar {\n    right: 0;\n  }\n  @media(min-width: @screen-sm) {\n    .content-wrapper,\n    .right-side,\n    .main-footer {\n      margin-right: @control-sidebar-width;\n    }\n  }\n}\n//Control sidebar tabs\n.nav-tabs.control-sidebar-tabs {\n  > li {\n    &:first-of-type > a {\n      &,\n      &:hover,\n        &:focus {\n        border-left-width: 0;\n      }\n    }\n    > a {\n      .border-radius(0);\n\n      //Hover and active states\n      &,\n      &:hover {\n        border-top: none;\n        border-right: none;\n        border-left: 1px solid transparent;\n        border-bottom: 1px solid transparent;\n      }\n      .icon {\n        font-size: 16px;\n      }\n    }\n    //Active state\n    &.active {\n      > a {\n        &,\n        &:hover,\n          &:focus,\n          &:active {\n          border-top: none;\n          border-right: none;\n          border-bottom: none;\n        }\n      }\n    }\n  }\n  //Remove responsiveness on small screens\n  @media(max-width: @screen-sm) {\n    display: table;\n    >li {\n      display: table-cell;\n    }\n  }\n}\n//Headings in the sidebar content\n.control-sidebar-heading {\n  font-weight: 400;\n  font-size: 16px;\n  padding: 10px 0;\n  margin-bottom: 10px;\n}\n//Subheadings\n.control-sidebar-subheading {\n  display: block;\n  font-weight: 400;\n  font-size: 14px;\n}\n//Control Sidebar Menu\n.control-sidebar-menu {\n  list-style: none;\n  padding: 0;\n  margin: 0 -15px;\n  > li > a {\n    .clearfix();\n    display: block;\n    padding: 10px 15px;\n    > .control-sidebar-subheading {\n      margin-top: 0;\n    }\n  }\n  .menu-icon {\n    float: left;\n    width: 35px;\n    height: 35px;\n    border-radius: 50%;\n    text-align: center;\n    line-height: 35px;\n  }\n  .menu-info {\n    margin-left: 45px;\n    margin-top: 3px;\n    > .control-sidebar-subheading {\n      margin: 0;\n    }\n    > p {\n      margin: 0;\n      font-size: 11px;\n    }\n  }\n  .progress {\n    margin: 0;\n  }\n}\n//Dark skin\n.control-sidebar-dark {\n  color: @sidebar-dark-color;\n  // Background\n  &,\n  + .control-sidebar-bg {\n    background: @sidebar-dark-bg;\n  }\n  // Sidebar tabs\n  .nav-tabs.control-sidebar-tabs {\n    border-bottom: darken(@sidebar-dark-bg, 3%);\n    > li {\n      > a {\n        background: darken(@sidebar-dark-bg, 5%);\n        color: @sidebar-dark-color;\n        //Hover and active states\n        &,\n        &:hover,\n          &:focus {\n          border-left-color: darken(@sidebar-dark-bg, 7%);\n          border-bottom-color: darken(@sidebar-dark-bg, 7%);          \n        }\n        &:hover,\n          &:focus,\n          &:active {\n          background: darken(@sidebar-dark-bg, 3%);\n        }\n        &:hover {\n          color: #fff;\n        }\n      }\n      //Active state\n      &.active {\n        > a {\n          &,\n          &:hover,\n            &:focus,\n            &:active {\n            background: @sidebar-dark-bg;\n            color: #fff;\n          }\n        }\n      }\n    }\n  }\n  //Heading & subheading\n  .control-sidebar-heading,\n  .control-sidebar-subheading {\n    color: #fff;\n  }\n  //Sidebar list\n  .control-sidebar-menu {\n    > li {\n      > a {\n        &:hover {\n          background: @sidebar-dark-hover-bg;\n        }\n        .menu-info {\n          > p {\n            color: @sidebar-dark-color;\n          }\n        }\n      }\n    }\n  }\n}\n//Light skin\n.control-sidebar-light {\n  color: lighten(@sidebar-light-color, 10%);\n  // Background\n  &,\n  + .control-sidebar-bg {\n    background: @sidebar-light-bg;\n    border-left: 1px solid @gray;\n  }\n  // Sidebar tabs\n  .nav-tabs.control-sidebar-tabs {\n    border-bottom: @gray;\n    > li {\n      > a {\n        background: darken(@sidebar-light-bg, 5%);\n        color: @sidebar-light-color;\n        //Hover and active states\n        &,\n        &:hover,\n          &:focus {\n          border-left-color: @gray;\n          border-bottom-color: @gray;\n        }\n        &:hover,\n          &:focus,\n          &:active {\n          background: darken(@sidebar-light-bg, 3%);\n        }\n      }\n      //Active state\n      &.active {\n        > a {\n          &,\n          &:hover,\n            &:focus,\n            &:active {\n            background: @sidebar-light-bg;\n            color: #111;\n          }\n        }\n      }\n    }\n  }\n  //Heading & subheading\n  .control-sidebar-heading,\n  .control-sidebar-subheading {\n    color: #111;\n  }\n  //Sidebar list\n  .control-sidebar-menu {\n    margin-left: -14px;\n    > li {\n      > a {\n        &:hover {\n          background: @sidebar-light-hover-bg;\n        }\n        .menu-info {\n          > p {\n            color: lighten(@sidebar-light-color, 10%);\n          }\n        }\n      }\n    }\n  }\n}\n","/*\n * Component: Dropdown menus\n * -------------------------\n */\n\n/*Dropdowns in general*/\n.dropdown-menu {\n  box-shadow: none;\n  border-color: #eee;\n  > li > a {\n    color: #777;\n  }\n  > li > a > .glyphicon,\n  > li > a > .fa,\n  > li > a > .ion{\n    margin-right: 10px;\n  }\n  > li > a:hover {\n    background-color: lighten(@gray, 5%);\n    color: #333;\n  }\n  > .divider {\n    background-color: #eee;\n  }\n}\n\n//Navbar custom dropdown menu\n.navbar-nav > .notifications-menu,\n.navbar-nav > .messages-menu,\n.navbar-nav > .tasks-menu {\n  //fix width and padding\n  > .dropdown-menu {\n    > li {\n      position: relative;\n    }\n    width: 280px;\n    //Remove padding and margins\n    padding: 0 0 0 0;\n    margin: 0;\n    top: 100%;\n  }\n  //Define header class\n  > .dropdown-menu > li.header {\n    .border-radius(4px; 4px; 0; 0);\n    background-color: #ffffff;\n    padding: 7px 10px;\n    border-bottom: 1px solid #f4f4f4;\n    color: #444444;\n    font-size: 14px;\n  }\n\n\n  //Define footer class\n  > .dropdown-menu > li.footer > a {\n    .border-radius(0; 0; 4px; 4px);\n    font-size: 12px;\n    background-color: #fff;\n    padding: 7px 10px;\n    border-bottom: 1px solid #eeeeee;\n    color: #444!important;\n    @media (max-width: @screen-sm-max) {\n      background: #fff!important;\n      color: #444!important;\n    }\n    text-align: center;\n    //Hover state\n    &:hover {\n      text-decoration: none;\n      font-weight: normal;\n    }\n  }\n\n  //Clear inner menu padding and margins\n  > .dropdown-menu > li .menu {\n    max-height: 200px;\n    margin: 0;\n    padding: 0;\n    list-style: none;\n    overflow-x: hidden;\n    > li > a {\n      display: block;\n      white-space: nowrap; /* Prevent text from breaking */\n      border-bottom: 1px solid #f4f4f4;\n      // Hove state\n      &:hover {\n        background: #f4f4f4;\n        text-decoration: none;\n      }\n    }\n  }\n}\n\n//Notifications menu\n.navbar-nav > .notifications-menu {\n  > .dropdown-menu > li .menu {\n    // Links inside the menu\n    > li > a {\n      color: #444444;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      padding: 10px;\n      // Icons inside the menu\n      > .glyphicon,\n      > .fa,\n      > .ion {\n        width: 20px;\n      }\n    }\n\n  }\n}\n\n//Messages menu\n.navbar-nav > .messages-menu {\n  //Inner menu\n  > .dropdown-menu > li .menu {\n    // Messages menu item\n    > li > a {\n      margin: 0;\n      //line-height: 20px;\n      padding: 10px 10px;\n      // User image\n      > div > img {\n        margin: auto 10px auto auto;\n        width: 40px;\n        height: 40px;\n      }\n      // Message heading\n      > h4 {\n        padding: 0;\n        margin: 0 0 0 45px;\n        color: #444444;\n        font-size: 15px;\n        position: relative;\n        // Small for message time display\n        > small {\n          color: #999999;\n          font-size: 10px;\n          position: absolute;\n          top: 0;\n          right: 0;\n        }\n      }\n\n      > p {\n        margin: 0 0 0 45px;\n        font-size: 12px;\n        color: #888888;\n      }\n\n      .clearfix();\n\n    }\n\n  }\n}\n//Tasks menu\n.navbar-nav > .tasks-menu {\n  > .dropdown-menu > li .menu {\n    > li > a {\n      padding: 10px;\n\n      > h3 {\n        font-size: 14px;\n        padding: 0;\n        margin: 0 0 10px 0;\n        color: #666666;\n      }\n\n      > .progress {\n        padding: 0;\n        margin: 0;\n      }\n    }\n  }\n}\n//User menu\n.navbar-nav > .user-menu {\n  > .dropdown-menu {\n    .border-top-radius(0);\n    padding: 1px 0 0 0;\n    border-top-width: 0;\n    width: 280px;\n\n    &,\n    > .user-body {\n      .border-bottom-radius(4px);\n    }\n    // Header menu\n    > li.user-header {\n      height: 175px;\n      padding: 10px;\n      text-align: center;\n      // User image\n      > img {\n        z-index: 5;\n        height: 90px;\n        width: 90px;\n        border: 3px solid;\n        border-color: transparent;\n        border-color: rgba(255, 255, 255, 0.2);\n      }\n      > p {\n        z-index: 5;\n        color: #fff;\n        color: rgba(255, 255, 255, 0.8);\n        font-size: 17px;\n        //text-shadow: 2px 2px 3px #333333;\n        margin-top: 10px;\n        > small {\n          display: block;\n          font-size: 12px;\n        }\n      }\n    }\n\n    // Menu Body\n    > .user-body {\n      padding: 15px;\n      border-bottom: 1px solid #f4f4f4;\n      border-top: 1px solid #dddddd;\n      .clearfix();\n      a {\n        color: #444 !important;\n        @media (max-width: @screen-sm-max) {\n          background: #fff !important;\n          color: #444 !important;\n        }\n      }\n    }\n\n    // Menu Footer\n    > .user-footer {\n      background-color: #f9f9f9;\n      padding: 10px;\n      .clearfix();\n      .btn-default {\n        color: #666666;\n        &:hover {\n          @media (max-width: @screen-sm-max) {\n            background-color: #f9f9f9;\n          }\n        }\n      }\n    }\n  }\n  .user-image {\n    float: left;\n    width: 25px;\n    height: 25px;\n    border-radius: 50%;\n    margin-right: 10px;\n    margin-top: -2px;\n    @media (max-width: @screen-xs-max) {\n      float: none;\n      margin-right: 0;\n      margin-top: -8px;\n      line-height: 10px;\n    }\n  }\n}\n\n/* Add fade animation to dropdown menus by appending\n the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/\n.open:not(.dropup) > .animated-dropdown-menu {\n  backface-visibility: visible !important;\n  .animation(flipInX .7s both);\n\n}\n@keyframes flipInX {\n  0% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transition-timing-function: ease-in;\n  }\n\n  60% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  100% {\n    transform: perspective(400px);\n  }\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n  }\n}\n\n/* Fix dropdown menu in navbars */\n.navbar-custom-menu > .navbar-nav {\n  > li {\n    position: relative;\n    > .dropdown-menu {\n      position: absolute;\n      right: 0;\n      left: auto;\n    }\n  }\n}\n@media (max-width: @screen-sm-max) {\n  .navbar-custom-menu > .navbar-nav {\n    float: right;\n    > li {\n      position: static;\n      > .dropdown-menu {\n        position: absolute;\n        right: 5%;\n        left: auto;\n        border: 1px solid #ddd;\n        background: #fff;\n      }\n    }\n  }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n","/*\n * Component: Form\n * ---------------\n */\n.form-control {\n  .border-radius(@input-radius);\n  box-shadow: none;\n  border-color: @gray;\n  &:focus {\n    border-color: @light-blue;\n    box-shadow: none;\n  }\n  &::-moz-placeholder,\n  &:-ms-input-placeholder,\n  &::-webkit-input-placeholder {\n    color: #bbb;\n    opacity: 1;\n  }\n\n  &:not(select) {\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    appearance: none;\n  }\n}\n\n.form-group {\n  &.has-success {\n    label {\n      color: @green;\n    }\n    .form-control {\n      border-color: @green;\n      box-shadow: none;\n    }\n  }\n\n  &.has-warning {\n    label {\n      color: @yellow;\n    }\n    .form-control {\n      border-color: @yellow;\n      box-shadow: none;\n    }\n  }\n\n  &.has-error {\n    label {\n      color: @red;\n    }\n    .form-control {\n      border-color: @red;\n      box-shadow: none;\n    }\n  }\n}\n\n/* Input group */\n.input-group {\n  .input-group-addon {\n    .border-radius(@input-radius);\n    border-color: @gray;\n    background-color: #fff;\n  }\n}\n/* button groups */\n.btn-group-vertical {\n  .btn {\n    &.btn-flat:first-of-type, &.btn-flat:last-of-type {\n      .border-radius(0);\n    }\n  }\n}\n\n.icheck > label {\n  padding-left: 0;\n}\n\n/* support Font Awesome icons in form-control */\n.form-control-feedback.fa {\n    line-height: @input-height-base;\n}\n\n.input-lg + .form-control-feedback.fa,\n.input-group-lg + .form-control-feedback.fa,\n.form-group-lg .form-control + .form-control-feedback.fa {\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback.fa,\n.input-group-sm + .form-control-feedback.fa,\n.form-group-sm .form-control + .form-control-feedback.fa {\n  line-height: @input-height-small;\n}\n","/*\n * Component: Progress Bar\n * -----------------------\n */\n\n//General CSS\n.progress,\n.progress > .progress-bar {\n  .box-shadow(none);\n  &, .progress-bar {\n    .border-radius(@progress-bar-border-radius);\n  }\n}\n\n/* size variation */\n.progress.sm,\n.progress-sm {\n  height: 10px;\n  &, .progress-bar {\n    .border-radius(@progress-bar-sm-border-radius);\n  }\n}\n.progress.xs,\n.progress-xs {\n  height: 7px;\n  &, .progress-bar {\n    .border-radius(@progress-bar-xs-border-radius);\n  }\n}\n.progress.xxs,\n.progress-xxs {\n  height: 3px;\n  &, .progress-bar {\n    .border-radius(@progress-bar-xs-border-radius);\n  }\n}\n/* Vertical bars */\n.progress.vertical {\n  position: relative;\n  width: 30px;\n  height: 200px;\n  display: inline-block;\n  margin-right: 10px;\n  > .progress-bar {\n    width: 100%;\n    position: absolute;\n    bottom: 0;\n  }\n\n  //Sizes\n  &.sm,\n  &.progress-sm{\n    width: 20px;\n  }\n\n  &.xs,\n  &.progress-xs{\n    width: 10px;\n  }\n  &.xxs,\n  &.progress-xxs{\n    width: 3px;\n  }\n}\n\n//Progress Groups\n.progress-group {\n  .progress-text {\n    font-weight: 600;\n  }\n  .progress-number {\n    float: right;\n  }\n}\n\n/* Remove margins from progress bars when put in a table */\n.table {\n  tr > td .progress {\n    margin: 0;\n  }\n}\n\n// Variations\n// -------------------------\n.progress-bar-light-blue,\n.progress-bar-primary {\n  .progress-bar-variant(@light-blue);\n}\n.progress-bar-green,\n.progress-bar-success {\n  .progress-bar-variant(@green);\n}\n\n.progress-bar-aqua,\n.progress-bar-info {\n  .progress-bar-variant(@aqua);\n}\n\n.progress-bar-yellow,\n.progress-bar-warning {\n  .progress-bar-variant(@yellow);\n}\n\n.progress-bar-red,\n.progress-bar-danger {\n  .progress-bar-variant(@red);\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n","// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","/*\n * Component: Small Box\n * --------------------\n */\n\n.small-box {\n  .border-radius(2px);\n  position: relative;\n  display: block;\n  margin-bottom: 20px;\n  box-shadow: @box-boxshadow;\n  // content wrapper\n  > .inner {\n    padding: 10px;\n  }\n\n  > .small-box-footer {\n    position: relative;\n    text-align: center;\n    padding: 3px 0;\n    color: #fff;\n    color: rgba(255, 255, 255, 0.8);\n    display: block;\n    z-index: 10;\n    background: rgba(0,0,0,0.1);\n    text-decoration: none;\n    &:hover {\n      color: #fff;\n      background: rgba(0,0,0,0.15);\n    }\n  }\n\n  h3 {\n    font-size: 38px;\n    font-weight: bold;\n    margin: 0 0 10px 0;\n    white-space: nowrap;\n    padding: 0;\n\n  }\n\n  p {\n    font-size: 15px;\n    > small {\n      display: block;\n      color: #f9f9f9;\n      font-size: 13px;\n      margin-top: 5px;\n    }\n  }\n\n  h3, p {\n    z-index: 5px;\n  }\n\n  // the icon\n  .icon {\n    .transition(all @transition-speed linear);\n    position: absolute;\n    top: -10px;\n    right: 10px;\n    z-index: 0;\n    font-size: 90px;\n    color: rgba(0, 0, 0, 0.15);\n  }\n\n  // Small box hover state\n  &:hover {\n    text-decoration: none;\n    color: #f9f9f9;\n    // Animate icons on small box hover\n    .icon {\n      font-size: 95px;\n    }\n  }\n}\n\n@media (max-width: @screen-xs-max) {\n  // No need for icons on very small devices\n  .small-box {\n    text-align: center;\n    .icon {\n      display: none;\n    }\n    p {\n      font-size: 12px;\n    }\n  }\n}\n","/*\n * Component: Box\n * --------------\n */\n.box {\n  position: relative;\n  .border-radius(@box-border-radius);\n  background: #ffffff;\n  border-top: 3px solid @box-default-border-top-color;\n  margin-bottom: 20px;\n  width: 100%;\n  box-shadow: @box-boxshadow;\n\n  // Box color variations\n  &.box-primary {\n    border-top-color: @light-blue;\n  }\n  &.box-info {\n    border-top-color: @aqua;\n  }\n  &.box-danger {\n    border-top-color: @red;\n  }\n  &.box-warning {\n    border-top-color: @yellow;\n  }\n  &.box-success {\n    border-top-color: @green;\n  }\n  &.box-default {\n    border-top-color: @gray;\n  }\n\n  // collapsed mode\n  &.collapsed-box {\n    .box-body,\n    .box-footer {\n      display: none;\n    }\n  }\n\n  .nav-stacked {\n    > li {\n      border-bottom: 1px solid @box-border-color;\n      margin: 0;\n      &:last-of-type {\n        border-bottom: none;\n      }\n    }\n  }\n\n  // fixed height to 300px\n  &.height-control {\n    .box-body {\n      max-height: 300px;\n      overflow: auto;\n    }\n  }\n\n  .border-right {\n    border-right: 1px solid @box-border-color;\n  }\n  .border-left {\n    border-left: 1px solid @box-border-color;\n  }\n\n  //SOLID BOX\n  //---------\n  //use this class to get a colored header and borders\n\n  &.box-solid {\n    border-top: 0;\n    > .box-header {\n      .btn.btn-default {\n        background: transparent;\n      }\n      .btn,\n      a {\n        &:hover {\n          background: rgba(0,0,0,0.1);\n        }\n      }\n    }\n\n    // Box color variations\n    &.box-default {\n      .box-solid-variant(@gray, #444);\n    }\n    &.box-primary {\n      .box-solid-variant(@light-blue);\n    }\n    &.box-info {\n      .box-solid-variant(@aqua);\n    }\n    &.box-danger {\n      .box-solid-variant(@red);\n    }\n    &.box-warning {\n      .box-solid-variant(@yellow);\n    }\n    &.box-success {\n      .box-solid-variant(@green);\n    }\n\n    > .box-header > .box-tools .btn {\n      border: 0;\n      box-shadow: none;\n    }\n\n    // Fix font color for tiles\n    &[class*='bg'] {\n      > .box-header {\n        color: #fff;\n      }\n    }\n\n  }\n\n  //BOX GROUP\n  .box-group {\n    > .box {\n      margin-bottom: 5px;\n    }\n  }\n\n\n  // jQuery Knob in a box\n  .knob-label {\n    text-align: center;\n    color: #333;\n    font-weight: 100;\n    font-size: 12px;\n    margin-bottom: 0.3em;\n  }\n}\n\n.box,\n.overlay-wrapper {\n  // Box overlay for LOADING STATE effect\n  > .overlay,\n  > .loading-img {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n  }\n\n  .overlay {\n    z-index: 50;\n    background: rgba(255, 255, 255, 0.7);\n    .border-radius(@box-border-radius);\n    > .fa {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      margin-left: -15px;\n      margin-top: -15px;\n      color: #000;\n      font-size: 30px;\n    }\n  }\n\n  .overlay.dark {\n    background: rgba(0, 0, 0, 0.5);\n  }\n}\n\n//Add clearfix to header, body and footer\n.box-header,\n.box-body,\n.box-footer {\n  .clearfix();\n}\n\n//Box header\n.box-header {\n  color: #444;\n  display: block;\n  padding: @box-padding;\n  position: relative;\n\n  //Add bottom border\n  &.with-border {\n    border-bottom: 1px solid @box-border-color;\n    .collapsed-box & {\n      border-bottom: none;\n    }\n  }\n\n  //Icons and box title\n  > .fa,\n  > .glyphicon,\n  > .ion,\n  .box-title {\n    display: inline-block;\n    font-size: 18px;\n    margin: 0;\n    line-height: 1;\n  }\n  > .fa,\n  > .glyphicon,\n  > .ion {\n    margin-right: 5px;\n  }\n  > .box-tools {\n    position: absolute;\n    right: 10px;\n    top: 5px;\n    [data-toggle=\"tooltip\"] {\n      position: relative;\n    }\n\n    &.pull-right {\n      .dropdown-menu {\n        right: 0;\n        left: auto;\n      }\n    }\n  }\n}\n\n//Box Tools Buttons\n.btn-box-tool {\n  padding: 5px;\n  font-size: 12px;\n  background: transparent;\n  color: darken(@box-default-border-top-color, 20%);\n  .open &,\n  &:hover {\n    color: darken(@box-default-border-top-color, 40%);\n  }\n  &.btn:active {\n    box-shadow: none;\n  }\n}\n\n//Box Body\n.box-body {\n  .border-radius(0; 0; @box-border-radius; @box-border-radius);\n  padding: @box-padding;\n  .no-header & {\n    .border-top-radius(@box-border-radius);\n  }\n  // Tables within the box body\n  > .table {\n    margin-bottom: 0;\n  }\n\n  // Calendar within the box body\n  .fc {\n    margin-top: 5px;\n  }\n\n  .full-width-chart {\n    margin: -19px;\n  }\n  &.no-padding .full-width-chart {\n    margin: -9px;\n  }\n\n  .box-pane {\n    .border-radius(0; 0; @box-border-radius; 0);\n  }\n  .box-pane-right {\n    .border-radius(0; 0; 0; @box-border-radius);\n  }\n}\n\n//Box footer\n.box-footer {\n  .border-radius(0; 0; @box-border-radius; @box-border-radius);\n  border-top: 1px solid @box-border-color;\n  padding: @box-padding;\n  background-color: @box-footer-bg;\n}\n.chart-legend {\n  &:extend(.list-unstyled);\n  margin: 10px 0;\n  > li {\n    @media (max-width: @screen-sm-max) {\n      float: left;\n      margin-right: 10px;\n    }\n  }\n}\n\n//Comment Box\n.box-comments {\n  background: #f7f7f7;\n  .box-comment {\n    .clearfix();\n    padding: 8px 0;\n    border-bottom: 1px solid #eee;\n    &:last-of-type {\n      border-bottom: 0;\n    }\n    &:first-of-type {\n      padding-top: 0;\n    }\n    img {\n      &:extend(.img-sm);\n      float: left;\n    }\n  }\n  .comment-text {\n    margin-left: 40px;\n    color: #555;\n  }\n  .username {\n    color: #444;\n    display: block;\n    font-weight: 600;\n  }\n  .text-muted {\n    font-weight: 400;\n    font-size: 12px;\n  }\n}\n\n//Widgets\n//-----------\n\n/* Widget: TODO LIST */\n\n.todo-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow: auto;\n  // Todo list element\n  > li {\n    .border-radius(2px);\n    padding: 10px;\n    background: #f4f4f4;\n    margin-bottom: 2px;\n    border-left: 2px solid #e6e7e8;\n    color: #444;\n    &:last-of-type {\n      margin-bottom: 0;\n    }\n\n    > input[type='checkbox']  {\n      margin: 0 10px 0 5px;\n    }\n\n    .text {\n      display: inline-block;\n      margin-left: 5px;\n      font-weight: 600;\n    }\n\n    // Time labels\n    .label {\n      margin-left: 10px;\n      font-size: 9px;\n    }\n\n    // Tools and options box\n    .tools {\n      display: none;\n      float: right;\n      color: @red;\n      // icons\n      > .fa, > .glyphicon, > .ion {\n        margin-right: 5px;\n        cursor: pointer;\n      }\n\n    }\n    &:hover .tools {\n      display: inline-block;\n    }\n\n    &.done {\n      color: #999;\n      .text {\n        text-decoration: line-through;\n        font-weight: 500;\n      }\n\n      .label {\n        background: @gray!important;\n      }\n    }\n  }\n\n  // Color varaity\n  .danger {\n    border-left-color: @red;\n  }\n  .warning {\n    border-left-color: @yellow;\n  }\n  .info {\n    border-left-color: @aqua;\n  }\n  .success {\n    border-left-color: @green;\n  }\n  .primary {\n    border-left-color: @light-blue;\n  }\n\n  .handle {\n    display: inline-block;\n    cursor: move;\n    margin: 0 5px;\n  }\n\n}\n// END TODO WIDGET\n\n/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/\n.chat {\n  padding: 5px 20px 5px 10px;\n\n  .item {\n    .clearfix();\n    margin-bottom: 10px;\n    // The image\n    > img {\n      width: 40px;\n      height: 40px;\n      border: 2px solid transparent;\n      .border-radius(50%);\n    }\n\n    > .online {\n      border: 2px solid @green;\n    }\n    > .offline {\n      border: 2px solid @red;\n    }\n\n    // The message body\n    > .message {\n      margin-left: 55px;\n      margin-top: -40px;\n      > .name {\n        display: block;\n        font-weight: 600;\n      }\n    }\n\n    // The attachment\n    > .attachment {\n      .border-radius(@attachment-border-radius);\n      background: #f4f4f4;\n      margin-left: 65px;\n      margin-right: 15px;\n      padding: 10px;\n      > h4 {\n        margin: 0 0 5px 0;\n        font-weight: 600;\n        font-size: 14px;\n      }\n      > p, > .filename {\n        font-weight: 600;\n        font-size: 13px;\n        font-style: italic;\n        margin: 0;\n\n      }\n      .clearfix();\n    }\n  }\n\n}\n//END CHAT WIDGET\n\n//Input in box\n.box-input {\n  max-width: 200px;\n}\n\n//A fix for panels body text color when placed within\n// a modal\n.modal {\n  .panel-body {\n    color: #444;\n  }\n}\n","/*\n * Component: Info Box\n * -------------------\n */\n.info-box {\n  display: block;\n  min-height: 90px;\n  background: #fff;\n  width: 100%;\n  box-shadow: @box-boxshadow;\n  .border-radius(2px);\n  margin-bottom: 15px;\n  small {\n    font-size: 14px;\n  }\n  .progress {\n    background: rgba(0,0,0,.2);\n    margin: 5px -10px 5px -10px;\n    height: 2px;\n    &,\n    & .progress-bar {\n      .border-radius(0);\n    }\n    .progress-bar {\n      background: #fff;\n    }\n  }\n}\n.info-box-icon {\n  .border-radius(2px; 0; 2px; 0);\n  display: block;\n  float: left;\n  height: 90px;\n  width: 90px;\n  text-align: center;\n  font-size: 45px;\n  line-height: 90px;\n  background: rgba(0,0,0,0.2);\n  > img {\n    max-width: 100%;\n  }\n}\n.info-box-content {\n  padding: 5px 10px;\n  margin-left: 90px;\n}\n.info-box-number {\n  display: block;\n  font-weight: bold;\n  font-size: 18px;\n}\n.progress-description,\n.info-box-text {\n  display: block;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.info-box-text {\n  text-transform: uppercase;\n}\n.info-box-more {\n  display: block;\n}\n\n.progress-description {\n  margin: 0;\n}\n","/*\n * Component: Button\n * -----------------\n */\n\n.btn {\n  .border-radius(@btn-border-radius);\n  .box-shadow(@btn-boxshadow);\n  border: 1px solid transparent;\n\n  &.uppercase {\n    text-transform: uppercase\n  }\n\n  // Flat buttons\n  &.btn-flat {\n    .border-radius(0);\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n    border-width: 1px;\n  }\n\n  // Active state\n  &:active {\n    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n  }\n\n  &:focus {\n    outline: none;\n  }\n\n  // input file btn\n  &.btn-file {\n    position: relative;\n    overflow: hidden;\n    > input[type='file'] {\n      position: absolute;\n      top: 0;\n      right: 0;\n      min-width: 100%;\n      min-height: 100%;\n      font-size: 100px;\n      text-align: right;\n      .opacity(0);\n      outline: none;\n      background: white;\n      cursor: inherit;\n      display: block;\n    }\n  }\n}\n\n//Button color variations\n.btn-default {\n  background-color: #f4f4f4;\n  color: #444;\n  border-color: #ddd;\n  &:hover,\n    &:active,\n    &.hover {\n    background-color:darken(#f4f4f4, 5%);\n  }\n}\n.btn-primary {\n  background-color: @light-blue;\n  border-color: darken(@light-blue, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@light-blue, 5%);\n  }\n}\n.btn-success {\n  background-color: @green;\n  border-color: darken(@green, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@green, 5%);\n  }\n}\n.btn-info {\n  background-color: @aqua;\n  border-color: darken(@aqua, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@aqua, 5%);\n  }\n}\n.btn-danger {\n  background-color: @red;\n  border-color: darken(@red, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@red, 5%);\n  }\n}\n.btn-warning {\n  background-color: @yellow;\n  border-color: darken(@yellow, 5%);\n  &:hover, &:active, &.hover {\n    background-color: darken(@yellow, 5%);\n  }\n}\n.btn-outline {\n  border: 1px solid #fff;\n  background: transparent;\n  color: #fff;\n  &:hover,\n    &:focus,\n    &:active {\n    color: rgba(255,255,255,.7);\n    border-color: rgba(255,255,255,.7);\n  }\n}\n.btn-link {\n  .box-shadow(none);\n}\n//General .btn with bg class\n.btn[class*='bg-']:hover {\n  .box-shadow(inset 0 0 100px rgba(0,0,0,0.2));\n}\n// Application buttons\n.btn-app {\n  .border-radius(3px);\n  position: relative;\n  padding: 15px 5px;\n  margin: 0 0 10px 10px;\n  min-width: 80px;\n  height: 60px;\n  text-align: center;\n  color: #666;\n  border: 1px solid #ddd;\n  background-color: #f4f4f4;\n  font-size: 12px;\n  //Icons within the btn\n  > .fa, > .glyphicon, > .ion {\n    font-size: 20px;\n    display: block;\n  }\n\n  &:hover {\n    background: #f4f4f4;\n    color: #444;\n    border-color: #aaa;\n  }\n\n  &:active, &:focus {\n    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n    box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n  }\n\n  //The badge\n  > .badge {\n    position: absolute;\n    top: -3px;\n    right: -10px;\n    font-size: 10px;\n    font-weight: 400;\n  }\n}\n","// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","/*\n * Component: Callout\n * ------------------\n */\n\n// Base styles (regardless of theme)\n.callout {\n  .border-radius(3px);\n  margin: 0 0 20px 0;\n  padding: 15px 30px 15px 15px;\n  border-left: 5px solid #eee;\n  a {\n    color: #fff;\n    text-decoration: underline;\n    &:hover {\n      color: #eee;\n    }\n  }\n  h4 {\n    margin-top: 0;\n    font-weight: 600;\n  }\n  p:last-child {\n    margin-bottom: 0;\n  }\n  code,\n  .highlight {\n    background-color: #fff;\n  }\n\n  // Themes for different contexts\n  &.callout-danger {\n    &:extend(.bg-red);\n    border-color: darken(@red, 10%);\n  }\n  &.callout-warning {\n    &:extend(.bg-yellow);\n    border-color: darken(@yellow, 10%);\n  }\n  &.callout-info {\n    &:extend(.bg-aqua);\n    border-color: darken(@aqua, 10%);\n  }\n  &.callout-success {\n    &:extend(.bg-green);\n    border-color: darken(@green, 10%);\n  }\n}\n","/*\n * Component: alert\n * ----------------\n */\n\n.alert {\n  .border-radius(3px);\n  h4 {\n    font-weight: 600;\n  }\n  .icon {\n    margin-right: 10px;\n  }\n  .close {\n    color: #000;\n    .opacity(.2);\n    &:hover {\n      .opacity(.5);\n    }\n  }\n  a {\n    color: #fff;\n    text-decoration: underline;\n  }\n}\n\n//Alert Variants\n.alert-success {\n  &:extend(.bg-green);\n  border-color: darken(@green, 5%);\n}\n.alert-danger,\n.alert-error {\n  &:extend(.bg-red);\n  border-color: darken(@red, 5%);\n}\n.alert-warning {\n  &:extend(.bg-yellow);\n  border-color: darken(@yellow, 5%);\n}\n.alert-info {\n  &:extend(.bg-aqua);\n  border-color: darken(@aqua, 5%);\n}\n","/*\n * Component: Nav\n * --------------\n */\n\n.nav {\n  > li > a:hover,\n    > li > a:active,\n    > li > a:focus {\n    color: #444;\n    background: #f7f7f7;\n  }\n}\n\n/* NAV PILLS */\n.nav-pills {\n  > li > a {\n    .border-radius(0);\n    border-top: 3px solid transparent;\n    color: #444;\n    > .fa,\n    > .glyphicon,\n    > .ion {\n      margin-right: 5px;\n    }\n  }\n  > li.active > a,\n  > li.active > a:hover,\n    > li.active > a:focus {\n    border-top-color: @light-blue;\n  }\n  > li.active > a {\n    font-weight: 600;\n  }\n}\n/* NAV STACKED */\n.nav-stacked {\n  > li > a {\n    .border-radius(0);\n    border-top: 0;\n    border-left: 3px solid transparent;\n    color: #444;\n  }\n  > li.active > a,\n  > li.active > a:hover {\n    background: transparent;\n    color: #444;\n    border-top: 0;\n    border-left-color: @light-blue;\n  }\n\n  > li.header {\n    border-bottom: 1px solid #ddd;\n    color: #777;\n    margin-bottom: 10px;\n    padding: 5px 10px;\n    text-transform: uppercase;\n  }\n}\n\n/* NAV TABS */\n.nav-tabs-custom {\n  margin-bottom: 20px;\n  background: #fff;\n  box-shadow: @box-boxshadow;\n  border-radius: @box-border-radius;\n  > .nav-tabs {\n    margin: 0;\n    border-bottom-color: #f4f4f4;\n    .border-top-radius(@box-border-radius);\n    > li {\n      border-top: 3px solid transparent;\n      margin-bottom: -2px;\n      > a {\n        color: #444;\n        .border-radius(0);\n        &.text-muted {\n          color: #999;\n        }\n        &,\n        &:hover {\n          background: transparent;\n          margin: 0;\n        }\n        &:hover {\n          color: #999;\n        }\n      }\n      &:not(.active) {\n        > a:hover,\n          > a:focus,\n          > a:active {\n          border-color: transparent;\n        }\n      }\n      margin-right: 5px;\n    }\n\n    > li.active {\n      border-top-color: @light-blue;\n      & > a,\n      &:hover > a {\n        background-color: #fff;\n        color: #444;\n      }\n      > a {\n        border-top-color: transparent;\n        border-left-color: #f4f4f4;\n        border-right-color: #f4f4f4;\n      }\n\n    }\n\n    > li:first-of-type {\n      margin-left: 0;\n      &.active {\n        > a {\n          border-left-color: transparent;\n        }\n      }\n    }\n\n    //Pulled to the right\n    &.pull-right {\n      float: none!important;\n      > li {\n        float: right;\n      }\n      > li:first-of-type {\n        margin-right: 0;\n        > a {\n          border-left-width: 1px;\n        }\n        &.active {\n          > a {\n            border-left-color: #f4f4f4;\n            border-right-color: transparent;\n          }\n        }\n      }\n    }\n\n    > li.header {\n      line-height: 35px;\n      padding: 0 10px;\n      font-size: 20px;\n      color: #444;\n      > .fa,\n      > .glyphicon,\n      > .ion {\n        margin-right: 5px;\n      }\n    }\n  }\n\n  > .tab-content {\n    background: #fff;\n    padding: 10px;\n    .border-bottom-radius(@box-border-radius);\n  }\n\n  .dropdown.open > a {\n    &:active,\n      &:focus {\n      background: transparent;\n      color: #999;\n    }\n  }\n}\n\n/* PAGINATION */\n.pagination {\n  > li > a {\n    background: #fafafa;\n    color: #666;    \n  }\n  &.pagination-flat {\n    > li > a {\n      .border-radius(0)!important;\n    }\n  }\n}","/*\n * Component: Table\n * ----------------\n */\n\n.table {\n  //Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border-top: 1px solid @box-border-color;\n      }\n    }\n  }\n  //thead cells\n  > thead > tr > th {\n    border-bottom: 2px solid @box-border-color;\n  }\n  //progress bars in tables\n  tr td .progress {\n    margin-top: 5px;\n  }\n}\n\n//Bordered Table\n.table-bordered {\n  border: 1px solid @box-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @box-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n.table.no-border {\n  &,\n  td,\n  th {\n    border: 0;\n  }\n}\n\n/* .text-center in tables */\ntable.text-center {\n  &, td, th {\n    text-align: center;\n  }\n}\n\n.table.align {\n  th {\n    text-align: left;\n  }\n  td {\n    text-align: right;\n  }\n}\n","/*\n * Component: Label\n * ----------------\n */\n.label-default {\n  background-color: @gray;\n  color: #444;\n}\n.label-danger {\n  &:extend(.bg-red);\n}\n.label-info {\n  &:extend(.bg-aqua);\n}\n.label-warning {\n  &:extend(.bg-yellow);\n}\n.label-primary {\n  &:extend(.bg-light-blue);\n}\n.label-success {\n  &:extend(.bg-green);\n}\n","/*\n * Component: Direct Chat\n * ----------------------\n */\n.direct-chat {\n  .box-body {\n    .border-bottom-radius(0);\n    position: relative;\n    overflow-x: hidden;\n    padding: 0;\n  }\n  &.chat-pane-open {\n    .direct-chat-contacts {\n      .translate(0, 0);\n    }\n  }\n}\n.direct-chat-messages {\n  .translate(0, 0);\n  padding: 10px;\n  height: 250px;\n  overflow: auto;\n}\n.direct-chat-msg,\n.direct-chat-text {\n  display: block;\n}\n.direct-chat-msg {\n  .clearfix();\n  margin-bottom: 10px;\n}\n.direct-chat-messages,\n.direct-chat-contacts {\n  .transition-transform(.5s ease-in-out);\n}\n.direct-chat-text {\n  .border-radius(5px);\n  position: relative;\n  padding: 5px 10px;\n  background: @direct-chat-default-msg-bg;\n  border: 1px solid @direct-chat-default-msg-border-color;\n  margin: 5px 0 0 50px;\n  color: @direct-chat-default-font-color;\n\n  //Create the arrow\n  &:after,\n    &:before {\n    position: absolute;\n    right: 100%;\n    top: 15px;\n    border: solid transparent;\n    border-right-color: @direct-chat-default-msg-border-color;\n    content: ' ';\n    height: 0;\n    width: 0;\n    pointer-events: none;\n  }\n\n  &:after {\n    border-width: 5px;\n    margin-top: -5px;\n  }\n  &:before {\n    border-width: 6px;\n    margin-top: -6px;\n  }\n  .right & {\n    margin-right: 50px;\n    margin-left: 0;\n    &:after,\n      &:before {\n      right: auto;\n      left: 100%;\n      border-right-color: transparent;\n      border-left-color: @direct-chat-default-msg-border-color;\n    }\n  }\n}\n.direct-chat-img {\n  .border-radius(50%);\n  float: left;\n  width: 40px;\n  height: 40px;\n  .right & {\n    float: right;\n  }\n}\n.direct-chat-info {\n  display: block;\n  margin-bottom: 2px;\n  font-size: 12px;\n}\n.direct-chat-name {\n  font-weight: 600;\n}\n.direct-chat-timestamp {\n  color: #999;\n}\n//Direct chat contacts pane\n.direct-chat-contacts-open {\n  .direct-chat-contacts {\n    .translate(0, 0);\n  }\n}\n.direct-chat-contacts {\n  .translate(101%, 0);\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  height: 250px;\n  width: 100%;\n  background: #222d32;\n  color: #fff;\n  overflow: auto;\n}\n\n//Contacts list -- for displaying contacts in direct chat contacts pane\n.contacts-list {\n  &:extend(.list-unstyled);\n  > li {\n    .clearfix();\n    border-bottom: 1px solid rgba(0,0,0,0.2);\n    padding: 10px;\n    margin: 0;\n    &:last-of-type {\n      border-bottom: none;\n    }\n  }\n}\n.contacts-list-img {\n  .border-radius(50%);\n  width: 40px;\n  float: left;\n}\n.contacts-list-info {\n  margin-left: 45px;\n  color: #fff;\n}\n.contacts-list-name,\n.contacts-list-status {\n  display: block;\n}\n.contacts-list-name {\n  font-weight: 600;\n}\n.contacts-list-status {\n  font-size: 12px;\n}\n.contacts-list-date {\n  color: #aaa;\n  font-weight: normal;\n}\n.contacts-list-msg {\n  color: #999;\n}\n\n//Direct Chat Variants\n.direct-chat-danger {\n  .direct-chat-variant(@red);\n}\n.direct-chat-primary {\n  .direct-chat-variant(@light-blue);\n}\n.direct-chat-warning {\n  .direct-chat-variant(@yellow);\n}\n.direct-chat-info {\n  .direct-chat-variant(@aqua);\n}\n.direct-chat-success {\n  .direct-chat-variant(@green);\n}\n","/*\n * Component: Users List\n * ---------------------\n */\n.users-list {\n  &:extend(.list-unstyled);\n  > li {\n    width: 25%;\n    float: left;\n    padding: 10px;\n    text-align: center;\n    img {\n      .border-radius(50%);\n      max-width: 100%;\n      height: auto;\n    }\n    > a:hover {\n      &,\n      .users-list-name {\n        color: #999;\n      }\n    }\n  }\n}\n.users-list-name,\n.users-list-date {\n  display: block;\n}\n.users-list-name {\n  font-weight: 600;\n  color: #444;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.users-list-date {\n  color: #999;\n  font-size: 12px;\n}\n","/*\n * Component: modal\n * ----------------\n */\n.modal {\n  background: rgba(0,0,0,.3);\n}\n.modal-content {\n  .border-radius(0);\n  .box-shadow(0 2px 3px rgba(0,0,0,.125));\n  border: 0;\n  @media (min-width: @screen-sm-min) {\n    .box-shadow(0 2px 3px rgba(0,0,0,.125));\n  }\n}\n.modal-header {\n  border-bottom-color: @box-border-color;\n}\n.modal-footer {\n  border-top-color: @box-border-color;\n}\n\n//Modal variants\n.modal-primary {\n  .modal-body {\n    &:extend(.bg-light-blue);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-light-blue-active);\n    border-color: darken(@light-blue, 10%);\n  }\n}\n.modal-warning {\n  .modal-body {\n    &:extend(.bg-yellow);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-yellow-active);\n    border-color: darken(@yellow, 10%);\n  }\n}\n.modal-info {\n  .modal-body {\n    &:extend(.bg-aqua);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-aqua-active);\n    border-color: darken(@aqua, 10%);\n  }\n}\n.modal-success {\n  .modal-body {\n    &:extend(.bg-green);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-green-active);\n    border-color: darken(@green, 10%);\n  }\n}\n.modal-danger {\n  .modal-body {\n    &:extend(.bg-red);\n  }\n  .modal-header,\n  .modal-footer {\n    &:extend(.bg-red-active);\n    border-color: darken(@red, 10%);\n  }\n}\n","/*\n * Page: Login & Register\n * ----------------------\n */\n\n.login-logo,\n.register-logo {\n  font-size: 35px;\n  text-align: center;\n  margin-bottom: 25px;\n  font-weight: 300;\n  a {\n    color: #444;\n  }\n}\n\n.login-page,\n.register-page {\n  background: @gray;\n}\n\n.login-box,\n.register-box {\n  width: 360px;\n  margin: 7% auto;\n  @media (max-width: @screen-sm) {\n    width: 90%;\n    margin-top: 20px;\n  }\n}\n\n.login-box-body,\n.register-box-body {\n  background: #fff;\n  padding: 20px;\n  border-top: 0;\n  color: #666;\n  .form-control-feedback {\n    color: #777;\n  }\n}\n.login-box-msg,\n.register-box-msg {\n  margin: 0;\n  text-align: center;\n  padding: 0 20px 20px 20px;\n}\n.social-auth-links {\n  margin: 10px 0;\n}\n","/*\n * Page: 400 and 500 error pages\n * ------------------------------\n */\n.error-page {\n  width: 600px;\n  margin: 20px auto 0 auto;\n  @media (max-width: @screen-sm-max) {\n    width: 100%;\n  }\n  //For the error number e.g: 404\n  > .headline {\n    float: left;\n    font-size: 100px;\n    font-weight: 300;\n    @media (max-width: @screen-sm-max) {\n      float: none;\n      text-align: center;\n    }\n  }\n  //For the message\n  > .error-content {\n    margin-left: 190px;\n    @media (max-width: @screen-sm-max) {\n      margin-left: 0;\n    }\n    > h3 {\n      font-weight: 300;\n      font-size: 25px;\n      @media(max-width: @screen-sm-max) {\n        text-align: center;\n      }\n    }\n    display: block;\n  }\n}\n","/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2015 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n\n@bs-height-base: (@line-height-computed + @padding-base-vertical * 2);\n@bs-height-lg:   (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2);\n@bs-height-sm:   (floor(@font-size-small * 1.5) + @padding-small-vertical * 2);\n@bs-height-xs:   (floor(@font-size-small * 1.2) + @padding-small-vertical + 1);\n\n.btn-social {\n  position: relative;\n  padding-left: (@bs-height-base + @padding-base-horizontal);\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  > :first-child {\n    position: absolute;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    width: @bs-height-base;\n    line-height: (@bs-height-base + 2);\n    font-size: 1.6em;\n    text-align: center;\n    border-right: 1px solid rgba(0, 0, 0, 0.2);\n  }\n  &.btn-lg {\n    padding-left: (@bs-height-lg + @padding-large-horizontal);\n    > :first-child {\n      line-height: @bs-height-lg;\n      width: @bs-height-lg;\n      font-size: 1.8em;\n    }\n  }\n  &.btn-sm {\n    padding-left: (@bs-height-sm + @padding-small-horizontal);\n    > :first-child {\n      line-height: @bs-height-sm;\n      width: @bs-height-sm;\n      font-size: 1.4em;\n    }\n  }\n  &.btn-xs {\n    padding-left: (@bs-height-xs + @padding-small-horizontal);\n    > :first-child {\n      line-height: @bs-height-xs;\n      width: @bs-height-xs;\n      font-size: 1.2em;\n    }\n  }\n}\n\n.btn-social-icon {\n  .btn-social;\n  height: (@bs-height-base + 2);\n  width: (@bs-height-base + 2);\n  padding: 0;\n  > :first-child {\n    border: none;\n    text-align: center;\n    width: 100%;\n  }\n  &.btn-lg {\n    height: @bs-height-lg;\n    width: @bs-height-lg;\n    padding-left: 0;\n    padding-right: 0;\n  }\n  &.btn-sm {\n    height: (@bs-height-sm + 2);\n    width: (@bs-height-sm + 2);\n    padding-left: 0;\n    padding-right: 0;\n  }\n  &.btn-xs {\n    height: (@bs-height-xs + 2);\n    width: (@bs-height-xs + 2);\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n.btn-social(@color-bg, @color: #fff) {\n  background-color: @color-bg;\n  .button-variant(@color, @color-bg, rgba(0,0,0,.2));\n}\n\n\n.btn-adn           { .btn-social(#d87a68); }\n.btn-bitbucket     { .btn-social(#205081); }\n.btn-dropbox       { .btn-social(#1087dd); }\n.btn-facebook      { .btn-social(#3b5998); }\n.btn-flickr        { .btn-social(#ff0084); }\n.btn-foursquare    { .btn-social(#f94877); }\n.btn-github        { .btn-social(#444444); }\n.btn-google        { .btn-social(#dd4b39); }\n.btn-instagram     { .btn-social(#3f729b); }\n.btn-linkedin      { .btn-social(#007bb6); }\n.btn-microsoft     { .btn-social(#2672ec); }\n.btn-openid        { .btn-social(#f7931e); }\n.btn-pinterest     { .btn-social(#cb2027); }\n.btn-reddit        { .btn-social(#eff7ff, #000); }\n.btn-soundcloud    { .btn-social(#ff5500); }\n.btn-tumblr        { .btn-social(#2c4762); }\n.btn-twitter       { .btn-social(#55acee); }\n.btn-vimeo         { .btn-social(#1ab7ea); }\n.btn-vk            { .btn-social(#587ea3); }\n.btn-yahoo         { .btn-social(#720e9e); }\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &.focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n","/*\n * Plugin: Full Calendar\n * ---------------------\n */\n//Fullcalendar buttons\n.fc-button {\n  background: #f4f4f4;\n  background-image: none;\n  color: #444;\n  border-color: #ddd;\n  border-bottom-color: #ddd;\n  &:hover,\n    &:active,\n    &.hover {\n    background-color: #e9e9e9;\n  }\n}\n// Calendar title\n.fc-header-title h2 {\n  font-size: 15px;\n  line-height: 1.6em;\n  color: #666;\n  margin-left: 10px;\n}\n.fc-header-right {\n  padding-right: 10px;\n}\n.fc-header-left {\n  padding-left: 10px;\n}\n// Calendar table header cells\n.fc-widget-header {\n  background: #fafafa;\n}\n.fc-grid {\n  width: 100%;\n  border: 0;\n}\n.fc-widget-header:first-of-type,\n.fc-widget-content:first-of-type {\n  border-left: 0;\n  border-right: 0;\n}\n.fc-widget-header:last-of-type,\n.fc-widget-content:last-of-type {\n  border-right: 0;\n}\n.fc-toolbar {\n  padding: @box-padding;\n  margin: 0;\n}\n.fc-day-number {\n  font-size: 20px;\n  font-weight: 300;\n  padding-right: 10px;\n}\n.fc-color-picker {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  > li {\n    float: left;\n    font-size: 30px;\n    margin-right: 5px;\n    line-height: 30px;\n    .fa {\n      .transition-transform(linear .3s);\n      &:hover {\n        .rotate(30deg);\n      }\n    }\n  }\n}\n#add-new-event {\n  .transition(all linear .3s);\n}\n.external-event {\n  padding: 5px 10px;\n  font-weight: bold;\n  margin-bottom: 4px;\n  box-shadow: @box-boxshadow;\n  text-shadow: @box-boxshadow;\n  border-radius: @box-border-radius;\n  cursor: move;\n  &:hover {\n    box-shadow: inset 0 0 90px rgba(0,0,0,0.2);\n  }\n}\n","/*\n * Plugin: Select2\n * ---------------\n */\n\n//Signle select\n.select2-container--default,\n.select2-selection {\n  &.select2-container--focus,\n  &:focus,\n    &:active {\n    outline: none;\n  }\n  .select2-selection--single {\n    border: 1px solid @gray;\n    border-radius: @input-radius;\n    padding: 6px 12px;\n    height: 34px;\n  }\n}\n.select2-container--default.select2-container--open {\n  border-color: @light-blue;\n}\n.select2-dropdown {\n  border: 1px solid @gray;\n  border-radius: @input-radius;\n}\n.select2-container--default .select2-results__option--highlighted[aria-selected] {\n  background-color: @light-blue;\n  color: white;\n}\n.select2-results__option {\n  padding: 6px 12px;\n  user-select: none;\n  -webkit-user-select: none; }\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-left: 0;\n  padding-right: 0;\n  height: auto;\n  margin-top: -4px;\n}\n.select2-container[dir=\"rtl\"] .select2-selection--single .select2-selection__rendered {\n  padding-right: 6px;\n  padding-left: 20px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow {\n  height: 28px;\n  right: 3px;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow b {\n  margin-top: 0;\n}\n.select2-dropdown,\n.select2-search--inline {\n  .select2-search__field {\n    border: 1px solid @gray;\n    &:focus {\n      outline: none;\n      border: 1px solid @light-blue;\n    }\n  }\n}\n.select2-container--default .select2-results__option[aria-disabled=true] {\n  color: #999;\n}\n.select2-container--default .select2-results__option[aria-selected=true] {\n  background-color: #ddd;\n  &,\n  &:hover {\n    color: #444;\n  }\n}\n\n//Multiple select\n.select2-container--default {\n  .select2-selection--multiple {\n    border: 1px solid @gray;\n    border-radius: @input-radius;\n    &:focus {\n      border-color: @light-blue;\n    }\n  }\n  &.select2-container--focus .select2-selection--multiple {\n    border-color: @gray;\n  }\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice {\n  background-color: @light-blue;\n  border-color: darken(@light-blue, 5%);\n  padding: 1px 10px;\n  color: #fff;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {\n  margin-right: 5px;\n  color: rgba(255,255,255,.7);\n  &:hover {\n    color: #fff;\n  }\n}\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-right: 10px;\n}\n","/*\n * General: Miscellaneous\n * ----------------------\n */\n// 10px padding and margins\n.pad {\n  padding: 10px;\n}\n.margin {\n  margin: 10px;\n}\n.margin-bottom {\n  margin-bottom: 20px;\n}\n.margin-bottom-none {\n  margin-bottom: 0;\n}\n.margin-r-5 {\n  margin-right: 5px;\n}\n// Display inline\n.inline {\n  display: inline;\n}\n\n// Description Blocks\n.description-block {\n  display: block;\n  margin: 10px 0;\n  text-align: center;\n  &.margin-bottom {\n    margin-bottom: 25px;\n  }\n  > .description-header {\n    margin: 0;\n    padding: 0;\n    font-weight: 600;\n    font-size: 16px;\n  }\n  > .description-text {\n    text-transform: uppercase;\n  }\n}\n\n// Background colors\n.bg-red,\n.bg-yellow,\n.bg-aqua,\n.bg-blue,\n.bg-light-blue,\n.bg-green,\n.bg-navy,\n.bg-teal,\n.bg-olive,\n.bg-lime,\n.bg-orange ,\n.bg-fuchsia,\n.bg-purple,\n.bg-maroon,\n.bg-black,\n.bg-red-active,\n.bg-yellow-active,\n.bg-aqua-active,\n.bg-blue-active,\n.bg-light-blue-active,\n.bg-green-active,\n.bg-navy-active,\n.bg-teal-active,\n.bg-olive-active,\n.bg-lime-active,\n.bg-orange-active,\n.bg-fuchsia-active,\n.bg-purple-active,\n.bg-maroon-active,\n.bg-black-active {\n  color: #fff !important;\n}\n.bg-gray {\n  color: #000;\n  background-color: @gray!important;\n}\n.bg-gray-light {\n  background-color: #f7f7f7;\n}\n.bg-black {\n  background-color: @black!important;\n}\n.bg-red {\n  background-color: @red !important;\n}\n.bg-yellow {\n  background-color: @yellow !important;\n}\n.bg-aqua {\n  background-color: @aqua !important;\n}\n.bg-blue {\n  background-color: @blue !important;\n}\n.bg-light-blue {\n  background-color: @light-blue !important;\n}\n.bg-green {\n  background-color: @green !important;\n}\n.bg-navy {\n  background-color: @navy !important;\n}\n.bg-teal {\n  background-color: @teal !important;\n}\n.bg-olive {\n  background-color: @olive !important;\n}\n.bg-lime {\n  background-color: @lime !important;\n}\n.bg-orange {\n  background-color: @orange !important;\n}\n.bg-fuchsia {\n  background-color: @fuchsia !important;\n}\n.bg-purple {\n  background-color: @purple !important;\n}\n.bg-maroon {\n  background-color: @maroon !important;\n}\n\n//Set of Active Background Colors\n.bg-gray-active {\n  color: #000;\n  background-color: darken(@gray,10%)!important;\n}\n.bg-black-active {\n  background-color: darken(@black, 10%)!important;\n}\n.bg-red-active {\n  background-color: darken(@red , 6%)!important;\n}\n.bg-yellow-active {\n  background-color: darken(@yellow , 6%)!important;\n}\n.bg-aqua-active {\n  background-color: darken(@aqua , 6%)!important;\n}\n.bg-blue-active {\n  background-color: darken(@blue , 10%)!important;\n}\n.bg-light-blue-active {\n  background-color: darken(@light-blue , 6%)!important;\n}\n.bg-green-active {\n  background-color: darken(@green , 5%)!important;\n}\n.bg-navy-active {\n  background-color: darken(@navy , 2%)!important;\n}\n.bg-teal-active {\n  background-color: darken(@teal , 5%)!important;\n}\n.bg-olive-active {\n  background-color: darken(@olive , 5%)!important;\n}\n.bg-lime-active {\n  background-color: darken(@lime , 5%)!important;\n}\n.bg-orange-active {\n  background-color: darken(@orange , 5%)!important;\n}\n.bg-fuchsia-active {\n  background-color: darken(@fuchsia , 5%)!important;\n}\n.bg-purple-active {\n  background-color: darken(@purple , 5%)!important;\n}\n.bg-maroon-active {\n  background-color: darken(@maroon , 3%)!important;\n}\n\n//Disabled!\n[class^=\"bg-\"].disabled {\n  .opacity(.65);\n}\n\n// Text colors\n.text-red {\n  color: @red !important;\n}\n.text-yellow {\n  color: @yellow !important;\n}\n.text-aqua {\n  color: @aqua !important;\n}\n.text-blue {\n  color: @blue !important;\n}\n.text-black {\n  color: @black!important;\n}\n.text-light-blue {\n  color: @light-blue !important;\n}\n.text-green {\n  color: @green !important;\n}\n.text-gray {\n  color: @gray !important;\n}\n.text-navy {\n  color: @navy !important;\n}\n.text-teal {\n  color: @teal !important;\n}\n.text-olive {\n  color: @olive !important;\n}\n.text-lime {\n  color: @lime !important;\n}\n.text-orange {\n  color: @orange !important;\n}\n.text-fuchsia {\n  color: @fuchsia !important;\n}\n.text-purple {\n  color: @purple !important;\n}\n.text-maroon {\n  color: @maroon !important;\n}\n.link-muted {\n  color: darken(@gray, 30%);\n  &:hover,\n    &:focus {\n    color: darken(@gray, 40%);\n  }\n}\n.link-black {\n  color: #666;\n  &:hover,\n    &:focus {\n    color: #999;\n  }\n}\n\n// Hide elements by display none only\n.hide {\n  display: none !important;\n}\n\n// Remove borders\n.no-border {\n  border: 0 !important;\n}\n// Remove padding\n.no-padding {\n  padding: 0 !important;\n}\n// Remove margins\n.no-margin {\n  margin: 0 !important;\n}\n\n// Remove box shadow\n.no-shadow {\n  box-shadow: none!important;\n}\n\n// Unstyled List\n.list-unstyled {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n.list-group-unbordered {\n  > .list-group-item {\n    border-left: 0;\n    border-right: 0;\n    border-radius: 0; \n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n// Remove border radius\n.flat {\n  .border-radius(0)!important;\n}\n\n.text-bold {\n  &, &.table td, &.table th {\n    font-weight: 700;\n  }\n}\n.text-sm {\n  font-size: 12px;\n}\n\n// _fix for sparkline tooltip\n.jqstooltip{\n  padding: 5px!important;\n  width:auto!important;\n  height:auto!important;\n}\n\n\n// Gradient Background colors\n.bg-teal-gradient {\n  .gradient(@teal; @teal; lighten(@teal, 16%))!important;\n  color: #fff;\n}\n.bg-light-blue-gradient {\n  .gradient(@light-blue; @light-blue; lighten(@light-blue, 12%))!important;\n  color: #fff;\n}\n.bg-blue-gradient {\n  .gradient(@blue; @blue; lighten(@blue, 7%))!important;\n  color: #fff;\n}\n.bg-aqua-gradient {\n  .gradient(@aqua; @aqua; lighten(@aqua, 7%))!important;\n  color: #fff;\n}\n.bg-yellow-gradient {\n  .gradient(@yellow; @yellow; lighten(@yellow, 16%))!important;\n  color: #fff;\n}\n.bg-purple-gradient {\n  .gradient(@purple; @purple; lighten(@purple, 16%))!important;\n  color: #fff;\n}\n.bg-green-gradient {\n  .gradient(@green; @green; lighten(@green, 7%))!important;\n  color: #fff;\n}\n.bg-red-gradient {\n  .gradient(@red; @red; lighten(@red, 10%))!important;\n  color: #fff;\n}\n.bg-black-gradient {\n  .gradient(@black; @black; lighten(@black, 10%))!important;\n  color: #fff;\n}\n.bg-maroon-gradient {\n  .gradient(@maroon; @maroon; lighten(@maroon, 10%))!important;\n  color: #fff;\n}\n\n//Description Block Extension\n.description-block {\n  .description-icon {\n    font-size: 16px;\n  }\n}\n\n//Remove top padding\n.no-pad-top {\n  padding-top: 0;\n}\n\n//Make position static\n.position-static {\n  position: static!important;\n}\n\n//List utility classes\n.list-header {\n  font-size: 15px;\n  padding: 10px 4px;\n  font-weight: bold;\n  color: #666;\n}\n.list-seperator {\n  height: 1px;\n  background: @box-border-color;\n  margin: 15px 0 9px 0;\n}\n.list-link {\n  > a {\n    padding: 4px;\n    color: #777;\n    &:hover {\n      color: #222;\n    }\n  }\n}\n\n//Light font weight\n.font-light {\n  font-weight: 300;\n}\n\n//User block\n.user-block {\n  .clearfix();\n  img {\n    width: 40px;\n    height: 40px;\n    float: left;\n  }\n  .username,\n  .description,\n  .comment {\n    display: block;\n    margin-left: 50px;\n  }\n  .username {\n    font-size: 16px;\n    font-weight: 600;\n  }\n  .description {\n    color: #999;\n    font-size: 13px;\n  }\n  &.user-block-sm {\n    img {\n      &:extend(.img-sm);\n    }\n    .username,\n    .description,\n    .comment {\n      margin-left: 40px;\n    }\n    .username {\n      font-size: 14px;\n    }\n  }\n}\n\n//Image sizes\n.img-sm,\n.img-md,\n.img-lg {\n  float: left;\n}\n.img-sm {\n  width: 30px!important;\n  height: 30px!important;\n  + .img-push {\n    margin-left: 40px;\n  }\n}\n.img-md {\n  width: 60px;\n  height: 60px;\n  + .img-push {\n    margin-left: 70px;\n  }\n}\n.img-lg {\n  width: 100px;\n  height: 100px;\n  + .img-push {\n    margin-left: 110px;\n  }\n}\n// Image bordered\n.img-bordered {\n  border: 3px solid @gray;\n  padding: 3px;\n}\n.img-bordered-sm {\n  border: 2px solid @gray;\n  padding: 2px;\n}\n//General attachemnt block\n.attachment-block {\n  border: 1px solid @box-border-color;\n  padding: 5px;\n  margin-bottom: 10px;\n  background: #f7f7f7;\n\n  .attachment-img {\n    max-width: 100px;\n    max-height: 100px;\n    height: auto;\n    float: left;\n  }\n  .attachment-pushed {\n    margin-left: 110px;\n  }\n  .attachment-heading {\n    margin: 0;\n  }\n  .attachment-text {\n    color: #555;\n  }\n}\n\n.connectedSortable {\n  min-height: 100px;\n}\n.ui-helper-hidden-accessible {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n.sort-highlight {\n  background: #f4f4f4;\n  border: 1px dashed #ddd;\n  margin-bottom: 10px;\n}\n.full-opacity-hover {\n  .opacity(.65);\n  &:hover {\n    .opacity(1);\n  }\n}\n// Charts\n.chart {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n  svg,\n  canvas {\n    width: 100%!important;\n  }\n}\n","/*\n * Misc: print\n * -----------\n */\n@media print {\n  //Add to elements that you do not want to show when printing\n  .no-print {\n    display: none!important;\n  }\n  //Elements that we want to hide when printing\n  .main-sidebar,\n  .left-side,\n  .main-header,\n  .content-header {\n    &:extend(.no-print);\n  }\n  //This is the only element that should appear, so let's remove the margins\n  .content-wrapper,\n  .right-side,\n  .main-footer {\n    margin-left: 0!important;    \n    min-height: 0!important;\n    .translate(0,0)!important;\n  }\n  .fixed .content-wrapper,\n  .fixed .right-side {\n    padding-top: 0!important;\n  }\n  //Invoice printing\n  .invoice {\n    width: 100%;\n    border: 0;\n    margin: 0;\n    padding: 0;\n  }\n  .invoice-col {\n    float: left;\n    width: 33.3333333%;\n  }\n  //Make sure table content displays properly\n  .table-responsive {\n    overflow: auto;\n    > .table tr th,\n    > .table tr td {\n      white-space: normal!important;\n    }\n  }\n}\n","/*\n * Skin: Blue\n * ----------\n */\n.skin-blue .main-header .navbar {\n  background-color: #3c8dbc;\n}\n.skin-blue .main-header .navbar .nav > li > a {\n  color: #fff;\n}\n.skin-blue .main-header .navbar .nav > li > a:hover,\n.skin-blue .main-header .navbar .nav > li > a:active,\n.skin-blue .main-header .navbar .nav > li > a:focus,\n.skin-blue .main-header .navbar .nav .open > a,\n.skin-blue .main-header .navbar .nav .open > a:hover,\n.skin-blue .main-header .navbar .nav .open > a:focus,\n.skin-blue .main-header .navbar .nav > .active > a {\n  background: rgba(0, 0, 0, 0.1);\n  color: #f6f6f6;\n}\n.skin-blue .main-header .navbar .sidebar-toggle {\n  color: #fff;\n}\n.skin-blue .main-header .navbar .sidebar-toggle:hover {\n  color: #f6f6f6;\n  background: rgba(0, 0, 0, 0.1);\n}\n.skin-blue .main-header .navbar .sidebar-toggle {\n  color: #fff;\n}\n.skin-blue .main-header .navbar .sidebar-toggle:hover {\n  background-color: #367fa9;\n}\n@media (max-width: 767px) {\n  .skin-blue .main-header .navbar .dropdown-menu li.divider {\n    background-color: rgba(255, 255, 255, 0.1);\n  }\n  .skin-blue .main-header .navbar .dropdown-menu li a {\n    color: #fff;\n  }\n  .skin-blue .main-header .navbar .dropdown-menu li a:hover {\n    background: #367fa9;\n  }\n}\n.skin-blue .main-header li.user-header {\n  background-color: #3c8dbc;\n}\n.skin-blue .content-header {\n  background: transparent;\n}\n.skin-blue .wrapper,\n.skin-blue .main-sidebar,\n.skin-blue .left-side {\n  background-color: #222d32;\n}\n.skin-blue .user-panel > .info,\n.skin-blue .user-panel > .info > a {\n  color: #fff;\n}\n.skin-blue .sidebar-menu > li.header {\n  color: #4b646f;\n  background: #1a2226;\n}\n.skin-blue .sidebar-menu > li > a {\n  border-left: 3px solid transparent;\n}\n.skin-blue .sidebar-menu > li:hover > a,\n.skin-blue .sidebar-menu > li.active > a {\n  color: #fff;\n  background: #1e282c;\n  border-left-color: #3c8dbc;\n}\n.skin-blue .sidebar-menu > li > .treeview-menu {\n  margin: 0 1px;\n  background: #2c3b41;\n}\n.skin-blue .sidebar a {\n  color: #b8c7ce;\n}\n.skin-blue .sidebar a:hover {\n  text-decoration: none;\n}\n.skin-blue .treeview-menu > li > a {\n  color: #8aa4af;\n}\n.skin-blue .treeview-menu > li.active > a,\n.skin-blue .treeview-menu > li > a:hover {\n  color: #fff;\n}\n.skin-blue .sidebar-form {\n  border-radius: 3px;\n  border: 1px solid #374850;\n  margin: 10px 10px;\n}\n.skin-blue .sidebar-form input[type=\"text\"],\n.skin-blue .sidebar-form .btn {\n  box-shadow: none;\n  background-color: #374850;\n  border: 1px solid transparent;\n  height: 35px;\n  -webkit-transition: all 0.3s ease-in-out;\n  -o-transition: all 0.3s ease-in-out;\n  transition: all 0.3s ease-in-out;\n}\n.skin-blue .sidebar-form input[type=\"text\"] {\n  color: #666;\n  border-top-left-radius: 2px;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 2px;\n}\n.skin-blue .sidebar-form input[type=\"text\"]:focus,\n.skin-blue .sidebar-form input[type=\"text\"]:focus + .input-group-btn .btn {\n  background-color: #fff;\n  color: #666;\n}\n.skin-blue .sidebar-form input[type=\"text\"]:focus + .input-group-btn .btn {\n  border-left-color: #fff;\n}\n.skin-blue .sidebar-form .btn {\n  color: #999;\n  border-top-left-radius: 0;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n  border-bottom-left-radius: 0;\n}\n.skin-blue.layout-top-nav .main-header > .logo .logo-variant {\n  background-color: none;\n}\n","/*\n * Skin: Blue\n * ----------\n */\n@import \"../../less/bootstrap-less/mixins.less\";\n@import \"../../less/bootstrap-less/variables.less\";\n@import \"../variables.less\";\n@import \"../mixins.less\";\n\n.skin-blue {\n  //Navbar\n  .main-header {\n    .navbar {\n      .navbar-variant(@light-blue; #fff);\n      .sidebar-toggle {\n        color: #fff;\n        &:hover {\n          background-color: darken(@light-blue, 5%);\n        }\n      }\n      @media (max-width: @screen-header-collapse) {\n        .dropdown-menu {\n          li {\n            &.divider {\n              background-color: rgba(255, 255, 255, 0.1);\n            }\n            a {\n              color: #fff;\n              &:hover {\n                background: darken(@light-blue, 5%);\n              }\n            }\n          }\n        }\n      }\n    }\n    //Logo\n\n    li.user-header {\n      background-color: @light-blue;\n    }\n  }\n\n  //Content Header\n  .content-header {\n    background: transparent;\n  }\n\n  //Create the sidebar skin\n  .skin-dark-sidebar(@light-blue);\n}\n\n.skin-blue.layout-top-nav .main-header > .logo {\n  .logo-variant {\n    background-color: none;\n  }\n}\n","//AdminLTE mixins\n//===============\n\n\n//Changes the color and the hovering properties of the navbar\n.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) {\n  background-color: @color;\n  //Navbar links\n  .nav > li > a {\n    color: @font-color;\n  }\n\n  .nav > li > a:hover,\n    .nav > li > a:active,\n    .nav > li > a:focus,\n    .nav .open > a,\n    .nav .open > a:hover,\n    .nav .open > a:focus,\n    .nav > .active > a {\n    background: @hover-bg;\n    color: @hover-color;\n  }\n\n  //Add color to the sidebar toggle button\n  .sidebar-toggle {\n    color: @font-color;\n    &:hover {\n      color: @hover-color;\n      background: @hover-bg;\n    }\n  }\n}\n\n//Logo color variation\n.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) {\n  background-color: @bg-color;\n  color: @color;\n  border-bottom: @border-bottom-width solid @border-bottom-color;\n\n  &:hover {\n    background-color: darken(@bg-color, 1%);\n  }\n}\n\n//Box solid color variantion creator\n.box-solid-variant(@color; @text-color: #fff) {\n  border: 1px solid @color;\n  > .box-header {\n    color: @text-color;\n    background: @color;\n    background-color: @color;\n    a,\n    .btn {\n      color: @text-color;\n    }\n  }\n}\n\n//Direct Chat Variant\n.direct-chat-variant(@bg-color; @color: #fff) {\n  .right > .direct-chat-text {\n    background: @bg-color;\n    border-color: @bg-color;\n    color: @color;\n    &:after,\n      &:before {\n      border-left-color: @bg-color;\n    }\n  }\n}\n\n//border radius creator\n.border-radius(@radius) {\n  border-radius: @radius;\n}\n//Different radius each side\n.border-radius(@top-left; @top-right; @bottom-left; @bottom-right) {\n  border-top-left-radius: @top-left;\n  border-top-right-radius: @top-right;\n  border-bottom-right-radius: @bottom-right;\n  border-bottom-left-radius: @bottom-left;\n}\n\n//Gradient background\n.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) {\n  background: @color;\n  background: -webkit-gradient(linear,\n    left bottom,\n    left top,\n    color-stop(0, @start),\n    color-stop(1, @stop));\n  background: -ms-linear-gradient(bottom,\n    @start,\n    @stop);\n  background: -moz-linear-gradient(center bottom,\n    @start 0%,\n    @stop 100%);\n  background: -o-linear-gradient(@stop,\n    @start);\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",@stop,@start));\n}\n\n//Added 2.1.0\n//Skins Mixins\n\n//Dark Sidebar Mixin\n.skin-dark-sidebar(@link-hover-border-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-dark-bg;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: #fff;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-dark-bg, 20%);\n      background: darken(@sidebar-dark-bg, 4%);\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n    }\n    //Hover and active states\n    &:hover > a, &.active > a {\n      color: @sidebar-dark-hover-color;\n      background: @sidebar-dark-hover-bg;\n      border-left-color: @link-hover-border-color;\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      margin: 0 1px;\n      background: @sidebar-dark-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-dark-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-dark-submenu-color;\n      }\n      &.active > a, > a:hover {\n        color: @sidebar-dark-submenu-hover-color;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid lighten(@sidebar-dark-bg, 10%);\n    margin: 10px 10px;\n    input[type=\"text\"], .btn {\n      box-shadow: none;\n      background-color: lighten(@sidebar-dark-bg, 10%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus, &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n}\n\n//Light Sidebar Mixin\n.skin-light-sidebar(@icon-active-color) {\n  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)\n  .wrapper,\n  .main-sidebar,\n  .left-side {\n    background-color: @sidebar-light-bg;\n  }\n  .content-wrapper,\n  .main-footer {\n    border-left: 1px solid @gray;\n  }\n  //User Panel (resides in the sidebar)\n  .user-panel {\n    > .info, > .info > a {\n      color: @sidebar-light-color;\n    }\n  }\n  //Sidebar Menu. First level links\n  .sidebar-menu > li {\n    .transition(border-left-color .3s ease);\n    //border-left: 3px solid transparent;\n    //Section Headning\n    &.header {\n      color: lighten(@sidebar-light-color, 25%);\n      background: @sidebar-light-bg;\n    }\n    //links\n    > a {\n      border-left: 3px solid transparent;\n      font-weight: 600;\n    }\n    //Hover and active states\n    &:hover > a,\n      &.active > a {\n      color: @sidebar-light-hover-color;\n      background: @sidebar-light-hover-bg;\n    }\n    &:hover > a {\n\n    }\n    &.active {\n      border-left-color: @icon-active-color;\n      > a {\n        font-weight: 600;\n      }\n    }\n    //First Level Submenu\n    > .treeview-menu {\n      background: @sidebar-light-submenu-bg;\n    }\n  }\n  //All links within the sidebar menu\n  .sidebar a {\n    color: @sidebar-light-color;\n    &:hover {\n      text-decoration: none;\n    }\n  }\n  //All submenus\n  .treeview-menu {\n    > li {\n      > a {\n        color: @sidebar-light-submenu-color;\n      }\n      &.active > a,\n      > a:hover {\n        color: @sidebar-light-submenu-hover-color;\n      }\n      &.active > a {\n        font-weight: 600;\n      }\n    }\n  }\n  //The sidebar search form\n  .sidebar-form {\n    .border-radius(3px);\n    border: 1px solid @gray;//darken(@sidebar-light-bg, 5%);\n    margin: 10px 10px;\n    input[type=\"text\"],\n    .btn {\n      box-shadow: none;\n      background-color: #fff;//darken(@sidebar-light-bg, 3%);\n      border: 1px solid transparent;\n      height: 35px;\n      .transition(all @transition-speed @transition-fn);\n    }\n    input[type=\"text\"] {\n      color: #666;\n      .border-radius(2px, 0, 2px, 0);\n      &:focus,\n        &:focus + .input-group-btn .btn {\n        background-color: #fff;\n        color: #666;\n      }\n      &:focus + .input-group-btn .btn {\n        border-left-color: #fff;\n      }\n    }\n    .btn {\n      color: #999;\n      .border-radius(0, 2px, 0, 2px);\n    }\n  }\n  @media(min-width: @screen-sm-min) {\n    &.sidebar-mini.sidebar-collapse {\n      .sidebar-menu > li > .treeview-menu {\n        border-left: 1px solid @gray;\n      }\n    }\n  }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","/*!\n * Lightbox for Bootstrap 3 by @ashleydw\n * https://github.com/ashleydw/lightbox\n *\n * License: https://github.com/ashleydw/lightbox/blob/master/LICENSE\n */\n.ekko-lightbox-container {\n  position: relative;\n}\n.ekko-lightbox-nav-overlay {\n  z-index: 100;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.ekko-lightbox-nav-overlay a {\n  opacity: 0;\n  -webkit-transition: opacity 0.5s;\n  -moz-transition: opacity 0.5s;\n  -o-transition: opacity 0.5s;\n  transition: opacity 0.5s;\n  color: #fff;\n  font-size: 30px;\n  height: 100%;\n  width: 49%;\n  display: block;\n  text-shadow: 2px 2px 4px #000;\n  filter: dropshadow(color=#000, offx=2, offy=2);\n  z-index: 100;\n}\n.ekko-lightbox-nav-overlay a:empty {\n  width: 49%;\n}\n.ekko-lightbox a:hover {\n  opacity: 1;\n  text-decoration: none;\n}\n.ekko-lightbox .glyphicon-chevron-left {\n  padding-left: 15px;\n  float: left;\n  left: 0;\n  text-align: left;\n}\n.ekko-lightbox .glyphicon-chevron-right {\n  padding-right: 15px;\n  float: right;\n  right: 0;\n  text-align: right;\n}\n.ekko-lightbox .modal-footer {\n  text-align: left;\n}\n","/*!\n * Lightbox for Bootstrap 3 by @ashleydw\n * https://github.com/ashleydw/lightbox\n *\n * License: https://github.com/ashleydw/lightbox/blob/master/LICENSE\n */\n\n.ekko-lightbox {\n  &-container {\n    position:relative;\n  }\n\n  &-nav-overlay {\n    z-index:100;\n    position: absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n\n    a {\n      opacity: 0;\n      -webkit-transition: opacity 0.5s;\n      -moz-transition: opacity 0.5s;\n      -o-transition: opacity 0.5s;\n      transition: opacity 0.5s;\n      color:#fff;\n      font-size:30px;\n      height: 100%;\n      width:49%;\n      display:block;\n      text-shadow: 2px 2px 4px #000;\n      filter: dropshadow(color=#000, offx=2, offy=2);\n      z-index:100;\n\n      &:empty {\n        width:49%;\n      }\n    }\n  }\n\n  a:hover {\n    opacity: 1;\n    text-decoration: none;\n  }\n\n  .glyphicon-chevron-left {\n    padding-left:15px;\n    float:left;\n    left:0;\n    text-align: left;\n  }\n\n  .glyphicon-chevron-right {\n    padding-right:15px;\n    float:right;\n    right:0;\n    text-align: right;\n  }\n\n  .modal-footer {\n    text-align: left;\n  }\n}",".skin-blue .main-header .logo {\n  background-color: inherit;\n}\n.main-header .logo {\n  width: 100% !important;\n  white-space: nowrap;\n  text-align: left;\n  display: block;\n  clear: both;\n  //text-overflow: hidden;\n}\n.huge {\n  font-size: 40px;\n}\n\n.btn-file {\n    position: relative;\n    overflow: hidden;\n}\n\n.dropdown-menu>li>a {\n    color: #354044;\n}\n\n\n#sort tr.cansort {\nborder-radius: 2px;\npadding: 10px;\nbackground: #f4f4f4;\nmargin-bottom: 3px;\nborder-left: 2px solid #e6e7e8;\ncolor: #444;\ncursor: move;\n}\n\n.user-image-inline {\n  float: left;\n  width: 25px;\n  height: 25px;\n  border-radius: 50%;\n  margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n  background-color: #f4f4f4;\n}\n\na.accordion-header {\n    color: #333;\n}\n\n.dynamic-form-row {\n  padding: 10px;\n  margin: 20px;\n}\n\n\n.handle {\n  padding-left: 10px;\n}\n\n.btn-file input[type=file] {\n    position: absolute;\n    top: 0;\n    right: 0;\n    min-width: 100%;\n    min-height: 100%;\n    font-size: 100px;\n    text-align: right;\n    filter: alpha(opacity=0);\n    opacity: 0;\n    outline: none;\n    background: white;\n    cursor: inherit;\n    display: block;\n}\n.main-footer {\n  font-size: 13px;\n}\n.main-header {\n  max-height: 150px;\n}\n.navbar-brand-img {\n  float: left;\n  padding: 5px 5px 5px 0;\n}\n\n.navbar-nav>.user-menu>.dropdown-menu {\n  width: inherit;\n}\n.main-header .logo {\n  padding: 0px 5px 0px 15px;\n}\n\n\n.sidebar-toggle {\n  margin-left: -48px;\n  z-index: 100;\n  background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n  z-index: 100;\n  width: 50px;\n  padding-top: 10px;\n}\n\n.skin-blue .main-header .navbar .dropdown-menu li a {\n  //color: inherit;\n}\n\n.main-header .sidebar-toggle:before {\n  content: \"\\f0c9\";\n}\n\n.direct-chat-contacts {\n  padding: 10px;\n  height: 150px;\n}\n\n\n.select2-container {\n  width: 100%;\n}\n.error input {\n  color: #dd4b39;\n  border: 2px solid #dd4b39 !important;\n}\n\n.error label, .alert-msg {\n  color: #dd4b39;\n  display: block;\n}\n\n.input-group[class*=\"col-\"] {\n        padding-right: 15px;\n        padding-left: 15px;\n  }\n  .control-label.multiline {\n      padding-top: 10;\n  }\n\n.btn-outline {\n  color: inherit;\n  background-color: transparent;\n  transition: all .5s;\n}\n\n.btn-primary.btn-outline {\n  color: #428bca;\n}\n\n.btn-success.btn-outline {\n  color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n  color: #5bc0de;\n}\n\n.btn-warning.btn-outline {\n  color: #f0ad4e;\n}\n\n.btn-danger.btn-outline {\n  color: #d9534f;\n}\n\n.btn-primary.btn-outline:hover, .btn-success.btn-outline:hover, .btn-info.btn-outline:hover, .btn-warning.btn-outline:hover, .btn-danger.btn-outline:hover {\n  color: #fff;\n}\n\n.slideout-menu {\n\tposition: fixed;\n\ttop: 0;\n\tright: -250px;\n\twidth: 250px;\n\theight: 100%;\n\tbackground: #333;\n\tz-index: 100;\n  margin-top: 100px;\n  color: white;\n  padding: 10px;\n}\n.slideout-menu h3 {\n\tposition: relative;\n\tpadding: 5px 5px;\n\tcolor: #fff;\n\tfont-size: 1.2em;\n\tfont-weight: 400;\n\tborder-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n\tposition: absolute;\n\ttop: 12px;\n\tright: 10px;\n\tdisplay: inline-block;\n\tpadding: 6px 9px 5px;\n\tfont-family: Arial, sans-serif;\n\tfont-weight: bold;\n\tline-height: 1;\n\tbackground: #222;\n\tcolor: #999;\n\ttext-decoration: none;\n\tvertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n\tcolor: #fff;\n}\n.slideout-menu ul {\n\tlist-style: none;\n\tfont-weight: 300;\n\tborder-top: 1px solid #151515;\n\tborder-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n\tborder-top: 1px solid #454545;\n\tborder-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n\tposition: relative;\n\tdisplay: block;\n\tpadding: 10px;\n\tcolor: #999;\n\ttext-decoration: none;\n}\n.slideout-menu ul li a:hover {\n\tbackground: #000;\n\tcolor: #fff;\n}\n.slideout-menu ul li a i {\n\tposition: absolute;\n\ttop: 15px;\n\tright: 10px;\n\topacity: .5;\n}\n\n .btn-box-tool-lg {\n   font-size: 16px;\n   color: orange;\n }\n\n\n\n .bs-wizard {margin-top: 20px;}\n\n /*Form Wizard*/\n .bs-wizard {border-bottom: solid 1px #e0e0e0; padding: 0 0 10px 0;}\n .bs-wizard > .bs-wizard-step {padding: 0; position: relative;}\n .bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n .bs-wizard > .bs-wizard-step .bs-wizard-stepnum {color: #595959; font-size: 16px; margin-bottom: 5px;}\n .bs-wizard > .bs-wizard-step .bs-wizard-info {color: #999; font-size: 14px;}\n .bs-wizard > .bs-wizard-step > .bs-wizard-dot {position: absolute; width: 30px; height: 30px; display: block; background: #fbe8aa; top: 45px; left: 50%; margin-top: -15px; margin-left: -15px; border-radius: 50%;}\n .bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {content: ' '; width: 14px; height: 14px; background: #fbbd19; border-radius: 50px; position: absolute; top: 8px; left: 8px; }\n .bs-wizard > .bs-wizard-step > .progress {position: relative; border-radius: 0px; height: 8px; box-shadow: none; margin: 20px 0;}\n .bs-wizard > .bs-wizard-step > .progress > .progress-bar {width:0px; box-shadow: none; background: #fbe8aa;}\n .bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {width:100%;}\n .bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {width:50%;}\n .bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {width:0%;}\n .bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {width: 100%;}\n .bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {background-color: #f5f5f5;}\n .bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {opacity: 0;}\n .bs-wizard > .bs-wizard-step:first-child  > .progress {left: 50%; width: 50%;}\n .bs-wizard > .bs-wizard-step:last-child  > .progress {width: 50%;}\n .bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot{ pointer-events: none; }\n /*END Form Wizard*/\n\n.left-navblock{\n  display: inline-block;\n  float: left;\n  text-align: left;\n  color: white;\n  padding: 0px;\n  /* adjust based on your layout */\n\n}\n.skin-blue .main-header .navbar .dropdown-menu li a {\n  color: #333;\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n\n.required {\n  border-right: 6px solid orange;\n}\n\n",".skin-blue .main-header .logo {\n  background-color: inherit;\n}\n.main-header .logo {\n  width: 100% !important;\n  white-space: nowrap;\n  text-align: left;\n  display: block;\n  clear: both;\n}\n.huge {\n  font-size: 40px;\n}\n.btn-file {\n  position: relative;\n  overflow: hidden;\n}\n.dropdown-menu > li > a {\n  color: #354044;\n}\n#sort tr.cansort {\n  border-radius: 2px;\n  padding: 10px;\n  background: #f4f4f4;\n  margin-bottom: 3px;\n  border-left: 2px solid #e6e7e8;\n  color: #444;\n  cursor: move;\n}\n.user-image-inline {\n  float: left;\n  width: 25px;\n  height: 25px;\n  border-radius: 50%;\n  margin-right: 10px;\n}\n.input-group .input-group-addon {\n  background-color: #f4f4f4;\n}\na.accordion-header {\n  color: #333;\n}\n.dynamic-form-row {\n  padding: 10px;\n  margin: 20px;\n}\n.handle {\n  padding-left: 10px;\n}\n.btn-file input[type=file] {\n  position: absolute;\n  top: 0;\n  right: 0;\n  min-width: 100%;\n  min-height: 100%;\n  font-size: 100px;\n  text-align: right;\n  filter: alpha(opacity=0);\n  opacity: 0;\n  outline: none;\n  background: white;\n  cursor: inherit;\n  display: block;\n}\n.main-footer {\n  font-size: 13px;\n}\n.main-header {\n  max-height: 150px;\n}\n.navbar-brand-img {\n  float: left;\n  padding: 5px 5px 5px 0;\n}\n.navbar-nav > .user-menu > .dropdown-menu {\n  width: inherit;\n}\n.main-header .logo {\n  padding: 0px 5px 0px 15px;\n}\n.sidebar-toggle {\n  margin-left: -48px;\n  z-index: 100;\n  background-color: inherit;\n}\n.sidebar-toggle-mobile {\n  z-index: 100;\n  width: 50px;\n  padding-top: 10px;\n}\n.main-header .sidebar-toggle:before {\n  content: \"\\f0c9\";\n}\n.direct-chat-contacts {\n  padding: 10px;\n  height: 150px;\n}\n.select2-container {\n  width: 100%;\n}\n.error input {\n  color: #dd4b39;\n  border: 2px solid #dd4b39 !important;\n}\n.error label,\n.alert-msg {\n  color: #dd4b39;\n  display: block;\n}\n.input-group[class*=\"col-\"] {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.control-label.multiline {\n  padding-top: 10;\n}\n.btn-outline {\n  color: inherit;\n  background-color: transparent;\n  transition: all .5s;\n}\n.btn-primary.btn-outline {\n  color: #428bca;\n}\n.btn-success.btn-outline {\n  color: #5cb85c;\n}\n.btn-info.btn-outline {\n  color: #5bc0de;\n}\n.btn-warning.btn-outline {\n  color: #f0ad4e;\n}\n.btn-danger.btn-outline {\n  color: #d9534f;\n}\n.btn-primary.btn-outline:hover,\n.btn-success.btn-outline:hover,\n.btn-info.btn-outline:hover,\n.btn-warning.btn-outline:hover,\n.btn-danger.btn-outline:hover {\n  color: #fff;\n}\n.slideout-menu {\n  position: fixed;\n  top: 0;\n  right: -250px;\n  width: 250px;\n  height: 100%;\n  background: #333;\n  z-index: 100;\n  margin-top: 100px;\n  color: white;\n  padding: 10px;\n}\n.slideout-menu h3 {\n  position: relative;\n  padding: 5px 5px;\n  color: #fff;\n  font-size: 1.2em;\n  font-weight: 400;\n  border-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n  position: absolute;\n  top: 12px;\n  right: 10px;\n  display: inline-block;\n  padding: 6px 9px 5px;\n  font-family: Arial, sans-serif;\n  font-weight: bold;\n  line-height: 1;\n  background: #222;\n  color: #999;\n  text-decoration: none;\n  vertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n  color: #fff;\n}\n.slideout-menu ul {\n  list-style: none;\n  font-weight: 300;\n  border-top: 1px solid #151515;\n  border-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n  border-top: 1px solid #454545;\n  border-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n  position: relative;\n  display: block;\n  padding: 10px;\n  color: #999;\n  text-decoration: none;\n}\n.slideout-menu ul li a:hover {\n  background: #000;\n  color: #fff;\n}\n.slideout-menu ul li a i {\n  position: absolute;\n  top: 15px;\n  right: 10px;\n  opacity: .5;\n}\n.btn-box-tool-lg {\n  font-size: 16px;\n  color: orange;\n}\n.bs-wizard {\n  margin-top: 20px;\n}\n/*Form Wizard*/\n.bs-wizard {\n  border-bottom: solid 1px #e0e0e0;\n  padding: 0 0 10px 0;\n}\n.bs-wizard > .bs-wizard-step {\n  padding: 0;\n  position: relative;\n}\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {\n  color: #595959;\n  font-size: 16px;\n  margin-bottom: 5px;\n}\n.bs-wizard > .bs-wizard-step .bs-wizard-info {\n  color: #999;\n  font-size: 14px;\n}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {\n  position: absolute;\n  width: 30px;\n  height: 30px;\n  display: block;\n  background: #fbe8aa;\n  top: 45px;\n  left: 50%;\n  margin-top: -15px;\n  margin-left: -15px;\n  border-radius: 50%;\n}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {\n  content: ' ';\n  width: 14px;\n  height: 14px;\n  background: #fbbd19;\n  border-radius: 50px;\n  position: absolute;\n  top: 8px;\n  left: 8px;\n}\n.bs-wizard > .bs-wizard-step > .progress {\n  position: relative;\n  border-radius: 0px;\n  height: 8px;\n  box-shadow: none;\n  margin: 20px 0;\n}\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {\n  width: 0px;\n  box-shadow: none;\n  background: #fbe8aa;\n}\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {\n  width: 100%;\n}\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {\n  width: 50%;\n}\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {\n  width: 0%;\n}\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {\n  width: 100%;\n}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {\n  background-color: #f5f5f5;\n}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {\n  opacity: 0;\n}\n.bs-wizard > .bs-wizard-step:first-child > .progress {\n  left: 50%;\n  width: 50%;\n}\n.bs-wizard > .bs-wizard-step:last-child > .progress {\n  width: 50%;\n}\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot {\n  pointer-events: none;\n}\n/*END Form Wizard*/\n.left-navblock {\n  display: inline-block;\n  float: left;\n  text-align: left;\n  color: white;\n  padding: 0px;\n  /* adjust based on your layout */\n}\n.skin-blue .main-header .navbar .dropdown-menu li a {\n  color: #333;\n}\na.logo.no-hover a:hover {\n  background-color: transparent;\n}\n.required {\n  border-right: 6px solid orange;\n}\n","/* WRENCHING */\n@-moz-keyframes wrench {\n    0% {\n        -moz-transform: rotate(-12deg)\n    }\n\n    8% {\n        -moz-transform: rotate(12deg)\n    }\n\n    10% {\n        -moz-transform: rotate(24deg)\n    }\n\n    18% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    20% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    28% {\n        -moz-transform: rotate(24deg)\n    }\n\n    30% {\n        -moz-transform: rotate(24deg)\n    }\n\n    38% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    40% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    48% {\n        -moz-transform: rotate(24deg)\n    }\n\n    50% {\n        -moz-transform: rotate(24deg)\n    }\n\n    58% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    60% {\n        -moz-transform: rotate(-24deg)\n    }\n\n    68% {\n        -moz-transform: rotate(24deg)\n    }\n\n    75% {\n        -moz-transform: rotate(0deg)\n    }\n}\n\n@-webkit-keyframes wrench {\n    0% {\n        -webkit-transform: rotate(-12deg)\n    }\n\n    8% {\n        -webkit-transform: rotate(12deg)\n    }\n\n    10% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    18% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    20% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    28% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    30% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    38% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    40% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    48% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    50% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    58% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    60% {\n        -webkit-transform: rotate(-24deg)\n    }\n\n    68% {\n        -webkit-transform: rotate(24deg)\n    }\n\n    75% {\n        -webkit-transform: rotate(0deg)\n    }\n}\n\n@-o-keyframes wrench {\n    0% {\n        -o-transform: rotate(-12deg)\n    }\n\n    8% {\n        -o-transform: rotate(12deg)\n    }\n\n    10% {\n        -o-transform: rotate(24deg)\n    }\n\n    18% {\n        -o-transform: rotate(-24deg)\n    }\n\n    20% {\n        -o-transform: rotate(-24deg)\n    }\n\n    28% {\n        -o-transform: rotate(24deg)\n    }\n\n    30% {\n        -o-transform: rotate(24deg)\n    }\n\n    38% {\n        -o-transform: rotate(-24deg)\n    }\n\n    40% {\n        -o-transform: rotate(-24deg)\n    }\n\n    48% {\n        -o-transform: rotate(24deg)\n    }\n\n    50% {\n        -o-transform: rotate(24deg)\n    }\n\n    58% {\n        -o-transform: rotate(-24deg)\n    }\n\n    60% {\n        -o-transform: rotate(-24deg)\n    }\n\n    68% {\n        -o-transform: rotate(24deg)\n    }\n\n    75% {\n        -o-transform: rotate(0deg)\n    }\n}\n\n@-ms-keyframes wrench {\n    0% {\n        -ms-transform: rotate(-12deg)\n    }\n\n    8% {\n        -ms-transform: rotate(12deg)\n    }\n\n    10% {\n        -ms-transform: rotate(24deg)\n    }\n\n    18% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    20% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    28% {\n        -ms-transform: rotate(24deg)\n    }\n\n    30% {\n        -ms-transform: rotate(24deg)\n    }\n\n    38% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    40% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    48% {\n        -ms-transform: rotate(24deg)\n    }\n\n    50% {\n        -ms-transform: rotate(24deg)\n    }\n\n    58% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    60% {\n        -ms-transform: rotate(-24deg)\n    }\n\n    68% {\n        -ms-transform: rotate(24deg)\n    }\n\n    75% {\n        -ms-transform: rotate(0deg)\n    }\n}\n\n@keyframes wrench {\n    0% {\n        transform: rotate(-12deg)\n    }\n\n    8% {\n        transform: rotate(12deg)\n    }\n\n    10% {\n        transform: rotate(24deg)\n    }\n\n    18% {\n        transform: rotate(-24deg)\n    }\n\n    20% {\n        transform: rotate(-24deg)\n    }\n\n    28% {\n        transform: rotate(24deg)\n    }\n\n    30% {\n        transform: rotate(24deg)\n    }\n\n    38% {\n        transform: rotate(-24deg)\n    }\n\n    40% {\n        transform: rotate(-24deg)\n    }\n\n    48% {\n        transform: rotate(24deg)\n    }\n\n    50% {\n        transform: rotate(24deg)\n    }\n\n    58% {\n        transform: rotate(-24deg)\n    }\n\n    60% {\n        transform: rotate(-24deg)\n    }\n\n    68% {\n        transform: rotate(24deg)\n    }\n\n    75% {\n        transform: rotate(0deg)\n    }\n}\n\n.faa-wrench.animated, .faa-wrench.animated-hover:hover {\n    -moz-animation: wrench 2.5s ease infinite;\n    -moz-transform-origin-x: 90%;\n    -moz-transform-origin-y: 35%;\n    -moz-transform-origin-z: initial;\n\n    -webkit-animation: wrench 2.5s ease infinite;\n    -webkit-transform-origin-x: 90%;\n    -webkit-transform-origin-y: 35%;\n    -webkit-transform-origin-z: initial;\n\n    -ms-animation: wrench 2.5s ease infinite;\n    -ms-transform-origin-x: 90%;\n    -ms-transform-origin-y: 35%;\n    -ms-transform-origin-z: initial;\n\n    animation: wrench 2.5s ease infinite;\n    transform-origin-x: 90%;\n    transform-origin-y: 35%;\n    transform-origin-z: initial;\n}\n\n/* BELL */\n@-moz-keyframes ring {\n    0% {\n        -moz-transform: rotate(-15deg)\n    }\n\n    2% {\n        -moz-transform: rotate(15deg)\n    }\n\n    4% {\n        -moz-transform: rotate(-18deg)\n    }\n\n    6% {\n        -moz-transform: rotate(18deg)\n    }\n\n    8% {\n        -moz-transform: rotate(-22deg)\n    }\n\n    10% {\n        -moz-transform: rotate(22deg)\n    }\n\n    12% {\n        -moz-transform: rotate(-18deg)\n    }\n\n    14% {\n        -moz-transform: rotate(18deg)\n    }\n\n    16% {\n        -moz-transform: rotate(-12deg)\n    }\n\n    18% {\n        -moz-transform: rotate(12deg)\n    }\n\n    20% {\n        -moz-transform: rotate(0deg)\n    }\n}\n\n@-webkit-keyframes ring {\n    0% {\n        -webkit-transform: rotate(-15deg)\n    }\n\n    2% {\n        -webkit-transform: rotate(15deg)\n    }\n\n    4% {\n        -webkit-transform: rotate(-18deg)\n    }\n\n    6% {\n        -webkit-transform: rotate(18deg)\n    }\n\n    8% {\n        -webkit-transform: rotate(-22deg)\n    }\n\n    10% {\n        -webkit-transform: rotate(22deg)\n    }\n\n    12% {\n        -webkit-transform: rotate(-18deg)\n    }\n\n    14% {\n        -webkit-transform: rotate(18deg)\n    }\n\n    16% {\n        -webkit-transform: rotate(-12deg)\n    }\n\n    18% {\n        -webkit-transform: rotate(12deg)\n    }\n\n    20% {\n        -webkit-transform: rotate(0deg)\n    }\n}\n\n@-ms-keyframes ring {\n    0% {\n        -ms-transform: rotate(-15deg)\n    }\n\n    2% {\n        -ms-transform: rotate(15deg)\n    }\n\n    4% {\n        -ms-transform: rotate(-18deg)\n    }\n\n    6% {\n        -ms-transform: rotate(18deg)\n    }\n\n    8% {\n        -ms-transform: rotate(-22deg)\n    }\n\n    10% {\n        -ms-transform: rotate(22deg)\n    }\n\n    12% {\n        -ms-transform: rotate(-18deg)\n    }\n\n    14% {\n        -ms-transform: rotate(18deg)\n    }\n\n    16% {\n        -ms-transform: rotate(-12deg)\n    }\n\n    18% {\n        -ms-transform: rotate(12deg)\n    }\n\n    20% {\n        -ms-transform: rotate(0deg)\n    }\n}\n\n@keyframes ring {\n    0% {\n        transform: rotate(-15deg)\n    }\n\n    2% {\n        transform: rotate(15deg)\n    }\n\n    4% {\n        transform: rotate(-18deg)\n    }\n\n    6% {\n        transform: rotate(18deg)\n    }\n\n    8% {\n        transform: rotate(-22deg)\n    }\n\n    10% {\n        transform: rotate(22deg)\n    }\n\n    12% {\n        transform: rotate(-18deg)\n    }\n\n    14% {\n        transform: rotate(18deg)\n    }\n\n    16% {\n        transform: rotate(-12deg)\n    }\n\n    18% {\n        transform: rotate(12deg)\n    }\n\n    20% {\n        transform: rotate(0deg)\n    }\n}\n\n.faa-ring.animated, .faa-ring.animated-hover:hover {\n    -moz-animation: ring 2s ease infinite;\n    -moz-transform-origin-x: 50%;\n    -moz-transform-origin-y: 0px;\n    -moz-transform-origin-z: initial;\n\n    -webkit-animation: ring 2s ease infinite;\n    -webkit-transform-origin-x: 50%;\n    -webkit-transform-origin-y: 0px;\n    -webkit-transform-origin-z: initial;\n\n    -ms-animation: ring 2s ease infinite;\n    -ms-transform-origin-x: 50%;\n    -ms-transform-origin-y: 0px;\n    -ms-transform-origin-z: initial;\n\n    animation: ring 2s ease infinite;\n    transform-origin-x: 50%;\n    transform-origin-y: 0px;\n    transform-origin-z: initial;\n}\n\n/* VERTICAL */\n@-moz-keyframes vertical {\n    0% {\n        -moz-transform: translate(0, -3px)\n    }\n\n    4% {\n        -moz-transform: translate(0, 3px)\n    }\n\n    8% {\n        -moz-transform: translate(0, -3px)\n    }\n\n    12% {\n        -moz-transform: translate(0, 3px)\n    }\n\n    16% {\n        -moz-transform: translate(0, -3px)\n    }\n\n    20% {\n        -moz-transform: translate(0, 3px)\n    }\n\n    22% {\n        -moz-transform: translate(0, 0)\n    }\n}\n\n@-webkit-keyframes vertical {\n    0% {\n        -webkit-transform: translate(0, -3px)\n    }\n\n    4% {\n        -webkit-transform: translate(0, 3px)\n    }\n\n    8% {\n        -webkit-transform: translate(0, -3px)\n    }\n\n    12% {\n        -webkit-transform: translate(0, 3px)\n    }\n\n    16% {\n        -webkit-transform: translate(0, -3px)\n    }\n\n    20% {\n        -webkit-transform: translate(0, 3px)\n    }\n\n    22% {\n        -webkit-transform: translate(0, 0)\n    }\n}\n\n@-ms-keyframes vertical {\n    0% {\n        -ms-transform: translate(0, -3px)\n    }\n\n    4% {\n        -ms-transform: translate(0, 3px)\n    }\n\n    8% {\n        -ms-transform: translate(0, -3px)\n    }\n\n    12% {\n        -ms-transform: translate(0, 3px)\n    }\n\n    16% {\n        -ms-transform: translate(0, -3px)\n    }\n\n    20% {\n        -ms-transform: translate(0, 3px)\n    }\n\n    22% {\n        -ms-transform: translate(0, 0)\n    }\n}\n\n@keyframes vertical {\n    0% {\n        transform: translate(0, -3px)\n    }\n\n    4% {\n        transform: translate(0, 3px)\n    }\n\n    8% {\n        transform: translate(0, -3px)\n    }\n\n    12% {\n        transform: translate(0, 3px)\n    }\n\n    16% {\n        transform: translate(0, -3px)\n    }\n\n    20% {\n        transform: translate(0, 3px)\n    }\n\n    22% {\n        transform: translate(0, 0)\n    }\n}\n\n.faa-vertical.animated, .faa-vertical.animated-hover:hover {\n    -moz-animation: vertical 2s ease infinite;\n    -webkit-animation: vertical 2s ease infinite;\n    -ms-animation: vertical 2s ease infinite;\n    animation: vertical 2s ease infinite;\n}\n\n/* HORIZONTAL */\n@-moz-keyframes horizontal {\n    0% {\n        -moz-transform: translate(0, 0)\n    }\n\n    6% {\n        -moz-transform: translate(5px, 0)\n    }\n\n    12% {\n        -moz-transform: translate(0, 0)\n    }\n\n    18% {\n        -moz-transform: translate(5px, 0)\n    }\n\n    24% {\n        -moz-transform: translate(0, 0)\n    }\n\n    30% {\n        -moz-transform: translate(5px, 0)\n    }\n\n    36% {\n        -moz-transform: translate(0, 0)\n    }\n}\n\n@-webkit-keyframes horizontal {\n    0% {\n        -webkit-transform: translate(0, 0)\n    }\n\n    6% {\n        -webkit-transform: translate(5px, 0)\n    }\n\n    12% {\n        -webkit-transform: translate(0, 0)\n    }\n\n    18% {\n        -webkit-transform: translate(5px, 0)\n    }\n\n    24% {\n        -webkit-transform: translate(0, 0)\n    }\n\n    30% {\n        -webkit-transform: translate(5px, 0)\n    }\n\n    36% {\n        -webkit-transform: translate(0, 0)\n    }\n}\n\n@-ms-keyframes horizontal {\n    0% {\n        -ms-transform: translate(0, 0)\n    }\n\n    6% {\n        -ms-transform: translate(5px, 0)\n    }\n\n    12% {\n        -ms-transform: translate(0, 0)\n    }\n\n    18% {\n        -ms-transform: translate(5px, 0)\n    }\n\n    24% {\n        -ms-transform: translate(0, 0)\n    }\n\n    30% {\n        -ms-transform: translate(5px, 0)\n    }\n\n    36% {\n        -ms-transform: translate(0, 0)\n    }\n}\n\n@keyframes horizontal {\n    0% {\n        transform: translate(0, 0)\n    }\n\n    6% {\n        transform: translate(5px, 0)\n    }\n\n    12% {\n        transform: translate(0, 0)\n    }\n\n    18% {\n        transform: translate(5px, 0)\n    }\n\n    24% {\n        transform: translate(0, 0)\n    }\n\n    30% {\n        transform: translate(5px, 0)\n    }\n\n    36% {\n        transform: translate(0, 0)\n    }\n}\n\n.faa-horizontal.animated, .faa-horizontal.animated-hover:hover {\n    -moz-animation: horizontal 2s ease infinite;\n    -webkit-animation: horizontal 2s ease infinite;\n    -ms-animation: horizontal 2s ease infinite;\n    animation: horizontal 2s ease infinite;\n}\n\n/* FLASHING */\n@-moz-keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n@-webkit-keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n@-ms-keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n@keyframes flash {\n    0%, 100%, 50% {\n        opacity: 1\n    }\n\n    25%, 75% {\n        opacity: 0\n    }\n}\n\n.faa-flash.animated, .faa-flash.animated-hover:hover {\n    -moz-animation: flash 2s ease infinite;\n    -webkit-animation: flash 2s ease infinite;\n    -ms-animation: flash 2s ease infinite;\n    animation: flash 2s ease infinite;\n}\n\n/* BOUNCE */\n@-moz-keyframes bounce {\n    0%, 100%, 20%, 50%, 80% {\n        -moz-transform: translateY(0)\n    }\n\n    40% {\n        -moz-transform: translateY(-15px)\n    }\n\n    60% {\n        -moz-transform: translateY(-15px)\n    }\n}\n\n@-webkit-keyframes bounce {\n    0%, 100%, 20%, 50%, 80% {\n        -webkit-transform: translateY(0)\n    }\n\n    40% {\n        -webkit-transform: translateY(-15px)\n    }\n\n    60% {\n        -webkit-transform: translateY(-15px)\n    }\n}\n\n@-ms-keyframes bounce {\n    0%, 100%, 20%, 50%, 80% {\n        -ms-transform: translateY(0)\n    }\n\n    40% {\n        -ms-transform: translateY(-15px)\n    }\n\n    60% {\n        -ms-transform: translateY(-15px)\n    }\n}\n\n@keyframes bounce {\n    0%, 10%, 20%, 50%, 80% {\n        transform: translateY(0)\n    }\n\n    40% {\n        transform: translateY(-15px)\n    }\n\n    60% {\n        transform: translateY(-15px)\n    }\n}\n\n.faa-bounce.animated, .faa-bounce.animated-hover:hover {\n    -moz-animation: bounce 2s ease infinite;\n    -webkit-animation: bounce 2s ease infinite;\n    -ms-animation: bounce 2s ease infinite;\n    animation: bounce 2s ease infinite;\n}\n\n/* SPIN */\n@-moz-keyframes spin {\n    0% {\n        -moz-transform: rotate(0deg)\n    }\n\n    100% {\n        -moz-transform: rotate(359deg)\n    }\n}\n\n@-webkit-keyframes spin {\n    0% {\n        -webkit-transform: rotate(0deg)\n    }\n\n    100% {\n        -webkit-transform: rotate(359deg)\n    }\n}\n\n@-ms-keyframes spin {\n    0% {\n        -ms-transform: rotate(0deg)\n    }\n\n    100% {\n        -ms-transform: rotate(359deg)\n    }\n}\n\n@keyframes spin {\n    0% {\n        transform: rotate(0deg)\n    }\n\n    100% {\n        transform: rotate(359deg)\n    }\n}\n\n.faa-spin.animated, .faa-spin.animated-hover:hover {\n    -moz-animation: spin 1.5s linear infinite;\n    -webkit-animation: spin 1.5s linear infinite;\n    -ms-animation: spin 1.5s linear infinite;\n    animation: spin 1.5s linear infinite;\n}\n\n/* FLOAT */\n@-moz-keyframes float {\n    0% {\n        -moz-transform: translateY(0)\n    }\n\n    50% {\n        -moz-transform: translateY(-6px)\n    }\n\n    100% {\n        -moz-transform: translateY(0)\n    }\n}\n\n@-webkit-keyframes float {\n    0% {\n        -webkit-transform: translateY(0)\n    }\n\n    50% {\n        -webkit-transform: translateY(-6px)\n    }\n\n    100% {\n        -webkit-transform: translateY(0)\n    }\n}\n\n@-ms-keyframes float {\n    0% {\n        -ms-transform: translateY(0)\n    }\n\n    50% {\n        -ms-transform: translateY(-6px)\n    }\n\n    100% {\n        -ms-transform: translateY(0)\n    }\n}\n\n@keyframes float {\n    0% {\n        transform: translateY(0)\n    }\n\n    50% {\n        transform: translateY(-6px)\n    }\n\n    100% {\n        transform: translateY(0)\n    }\n}\n\n.faa-float.animated, .faa-float.animated-hover:hover {\n    - moz-animation: float 2s linear infinite;\n    -webkit-animation: float 2s linear infinite;\n    -ms-animation: float 2s linear infinite;\n    animation: float 2s linear infinite;\n}\n\n/* PULSE */\n@-moz-keyframes pulse {\n    0% {\n        -moz-transform: scale(1.1)\n    }\n\n    50% {\n        -moz-transform: scale(0.8)\n    }\n\n    100% {\n        -moz-transform: scale(1)\n    }\n}\n\n@-webkit-keyframes pulse {\n    0% {\n        -webkit-transform: scale(1)\n    }\n\n    50% {\n        -webkit-transform: scale(0.8)\n    }\n\n    100% {\n        -webkit-transform: scale(1)\n    }\n}\n\n@-ms-keyframes pulse {\n    0% {\n        -ms-transform: scale(1.1)\n    }\n\n    50% {\n        -ms-transform: scale(0.8)\n    }\n\n    100% {\n        -ms-transform: scale(1)\n    }\n}\n\n@keyframes pulse {\n    0% {\n        transform: scale(1.1)\n    }\n\n    50% {\n        transform: scale(0.8)\n    }\n\n    100% {\n        transform: scale(1)\n    }\n}\n\n.faa-pulse.animated, .faa-pulse.animated-hover:hover {\n    -moz-animation: pulse 2s linear infinite;\n    -webkit-animation: pulse 2s linear infinite;\n    -ms-animation: pulse 2s linear infinite;\n    animation: pulse 2s linear infinite;\n}\n\n/* SHAKE */\n.faa-shake.animated, .faa-shake.animated-hover:hover {\n    -webkit-animation: wrench 2.5s ease infinite;\n}\n\n\n"],"sourceRoot":"/source/"}
        \ No newline at end of file
        diff --git a/public/build/assets/css/compiled/app-485a76ec8c.css b/public/build/assets/css/compiled/app-485a76ec8c.css
        deleted file mode 100644
        index 62d7d9da68..0000000000
        --- a/public/build/assets/css/compiled/app-485a76ec8c.css
        +++ /dev/null
        @@ -1,5753 +0,0 @@
        -@charset "UTF-8";
        -@import url(https://fonts.googleapis.com/css?family=Lato);
        -/*!
        - * Bootstrap v3.3.6 (http://getbootstrap.com)
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - */
        -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
        -html {
        -  font-family: sans-serif;
        -  -ms-text-size-adjust: 100%;
        -  -webkit-text-size-adjust: 100%; }
        -
        -body {
        -  margin: 0; }
        -
        -article,
        -aside,
        -details,
        -figcaption,
        -figure,
        -footer,
        -header,
        -hgroup,
        -main,
        -menu,
        -nav,
        -section,
        -summary {
        -  display: block; }
        -
        -audio,
        -canvas,
        -progress,
        -video {
        -  display: inline-block;
        -  vertical-align: baseline; }
        -
        -audio:not([controls]) {
        -  display: none;
        -  height: 0; }
        -
        -[hidden],
        -template {
        -  display: none; }
        -
        -a {
        -  background-color: transparent; }
        -
        -a:active,
        -a:hover {
        -  outline: 0; }
        -
        -abbr[title] {
        -  border-bottom: 1px dotted; }
        -
        -b,
        -strong {
        -  font-weight: bold; }
        -
        -dfn {
        -  font-style: italic; }
        -
        -h1 {
        -  font-size: 2em;
        -  margin: 0.67em 0; }
        -
        -mark {
        -  background: #ff0;
        -  color: #000; }
        -
        -small {
        -  font-size: 80%; }
        -
        -sub,
        -sup {
        -  font-size: 75%;
        -  line-height: 0;
        -  position: relative;
        -  vertical-align: baseline; }
        -
        -sup {
        -  top: -0.5em; }
        -
        -sub {
        -  bottom: -0.25em; }
        -
        -img {
        -  border: 0; }
        -
        -svg:not(:root) {
        -  overflow: hidden; }
        -
        -figure {
        -  margin: 1em 40px; }
        -
        -hr {
        -  box-sizing: content-box;
        -  height: 0; }
        -
        -pre {
        -  overflow: auto; }
        -
        -code,
        -kbd,
        -pre,
        -samp {
        -  font-family: monospace, monospace;
        -  font-size: 1em; }
        -
        -button,
        -input,
        -optgroup,
        -select,
        -textarea {
        -  color: inherit;
        -  font: inherit;
        -  margin: 0; }
        -
        -button {
        -  overflow: visible; }
        -
        -button,
        -select {
        -  text-transform: none; }
        -
        -button,
        -html input[type="button"],
        -input[type="reset"],
        -input[type="submit"] {
        -  -webkit-appearance: button;
        -  cursor: pointer; }
        -
        -button[disabled],
        -html input[disabled] {
        -  cursor: default; }
        -
        -button::-moz-focus-inner,
        -input::-moz-focus-inner {
        -  border: 0;
        -  padding: 0; }
        -
        -input {
        -  line-height: normal; }
        -
        -input[type="checkbox"],
        -input[type="radio"] {
        -  box-sizing: border-box;
        -  padding: 0; }
        -
        -input[type="number"]::-webkit-inner-spin-button,
        -input[type="number"]::-webkit-outer-spin-button {
        -  height: auto; }
        -
        -input[type="search"] {
        -  -webkit-appearance: textfield;
        -  box-sizing: content-box; }
        -
        -input[type="search"]::-webkit-search-cancel-button,
        -input[type="search"]::-webkit-search-decoration {
        -  -webkit-appearance: none; }
        -
        -fieldset {
        -  border: 1px solid #c0c0c0;
        -  margin: 0 2px;
        -  padding: 0.35em 0.625em 0.75em; }
        -
        -legend {
        -  border: 0;
        -  padding: 0; }
        -
        -textarea {
        -  overflow: auto; }
        -
        -optgroup {
        -  font-weight: bold; }
        -
        -table {
        -  border-collapse: collapse;
        -  border-spacing: 0; }
        -
        -td,
        -th {
        -  padding: 0; }
        -
        -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
        -@media print {
        -  *,
        -  *:before,
        -  *:after {
        -    background: transparent !important;
        -    color: #000 !important;
        -    box-shadow: none !important;
        -    text-shadow: none !important; }
        -  a,
        -  a:visited {
        -    text-decoration: underline; }
        -  a[href]:after {
        -    content: " (" attr(href) ")"; }
        -  abbr[title]:after {
        -    content: " (" attr(title) ")"; }
        -  a[href^="#"]:after,
        -  a[href^="javascript:"]: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; }
        -  p,
        -  h2,
        -  h3 {
        -    orphans: 3;
        -    widows: 3; }
        -  h2,
        -  h3 {
        -    page-break-after: avoid; }
        -  .navbar {
        -    display: none; }
        -  .btn > .caret,
        -  .dropup > .btn > .caret {
        -    border-top-color: #000 !important; }
        -  .label {
        -    border: 1px solid #000; }
        -  .table {
        -    border-collapse: collapse !important; }
        -    .table td,
        -    .table th {
        -      background-color: #fff !important; }
        -  .table-bordered th,
        -  .table-bordered td {
        -    border: 1px solid #ddd !important; } }
        -
        -@font-face {
        -  font-family: 'Glyphicons Halflings';
        -  src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot");
        -  src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); }
        -
        -.glyphicon {
        -  position: relative;
        -  top: 1px;
        -  display: inline-block;
        -  font-family: 'Glyphicons Halflings';
        -  font-style: normal;
        -  font-weight: normal;
        -  line-height: 1;
        -  -webkit-font-smoothing: antialiased;
        -  -moz-osx-font-smoothing: grayscale; }
        -
        -.glyphicon-asterisk:before {
        -  content: "\002a"; }
        -
        -.glyphicon-plus:before {
        -  content: "\002b"; }
        -
        -.glyphicon-euro:before,
        -.glyphicon-eur: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"; }
        -
        -.glyphicon-cd:before {
        -  content: "\e201"; }
        -
        -.glyphicon-save-file:before {
        -  content: "\e202"; }
        -
        -.glyphicon-open-file:before {
        -  content: "\e203"; }
        -
        -.glyphicon-level-up:before {
        -  content: "\e204"; }
        -
        -.glyphicon-copy:before {
        -  content: "\e205"; }
        -
        -.glyphicon-paste:before {
        -  content: "\e206"; }
        -
        -.glyphicon-alert:before {
        -  content: "\e209"; }
        -
        -.glyphicon-equalizer:before {
        -  content: "\e210"; }
        -
        -.glyphicon-king:before {
        -  content: "\e211"; }
        -
        -.glyphicon-queen:before {
        -  content: "\e212"; }
        -
        -.glyphicon-pawn:before {
        -  content: "\e213"; }
        -
        -.glyphicon-bishop:before {
        -  content: "\e214"; }
        -
        -.glyphicon-knight:before {
        -  content: "\e215"; }
        -
        -.glyphicon-baby-formula:before {
        -  content: "\e216"; }
        -
        -.glyphicon-tent:before {
        -  content: "\26fa"; }
        -
        -.glyphicon-blackboard:before {
        -  content: "\e218"; }
        -
        -.glyphicon-bed:before {
        -  content: "\e219"; }
        -
        -.glyphicon-apple:before {
        -  content: "\f8ff"; }
        -
        -.glyphicon-erase:before {
        -  content: "\e221"; }
        -
        -.glyphicon-hourglass:before {
        -  content: "\231b"; }
        -
        -.glyphicon-lamp:before {
        -  content: "\e223"; }
        -
        -.glyphicon-duplicate:before {
        -  content: "\e224"; }
        -
        -.glyphicon-piggy-bank:before {
        -  content: "\e225"; }
        -
        -.glyphicon-scissors:before {
        -  content: "\e226"; }
        -
        -.glyphicon-bitcoin:before {
        -  content: "\e227"; }
        -
        -.glyphicon-btc:before {
        -  content: "\e227"; }
        -
        -.glyphicon-xbt:before {
        -  content: "\e227"; }
        -
        -.glyphicon-yen:before {
        -  content: "\00a5"; }
        -
        -.glyphicon-jpy:before {
        -  content: "\00a5"; }
        -
        -.glyphicon-ruble:before {
        -  content: "\20bd"; }
        -
        -.glyphicon-rub:before {
        -  content: "\20bd"; }
        -
        -.glyphicon-scale:before {
        -  content: "\e230"; }
        -
        -.glyphicon-ice-lolly:before {
        -  content: "\e231"; }
        -
        -.glyphicon-ice-lolly-tasted:before {
        -  content: "\e232"; }
        -
        -.glyphicon-education:before {
        -  content: "\e233"; }
        -
        -.glyphicon-option-horizontal:before {
        -  content: "\e234"; }
        -
        -.glyphicon-option-vertical:before {
        -  content: "\e235"; }
        -
        -.glyphicon-menu-hamburger:before {
        -  content: "\e236"; }
        -
        -.glyphicon-modal-window:before {
        -  content: "\e237"; }
        -
        -.glyphicon-oil:before {
        -  content: "\e238"; }
        -
        -.glyphicon-grain:before {
        -  content: "\e239"; }
        -
        -.glyphicon-sunglasses:before {
        -  content: "\e240"; }
        -
        -.glyphicon-text-size:before {
        -  content: "\e241"; }
        -
        -.glyphicon-text-color:before {
        -  content: "\e242"; }
        -
        -.glyphicon-text-background:before {
        -  content: "\e243"; }
        -
        -.glyphicon-object-align-top:before {
        -  content: "\e244"; }
        -
        -.glyphicon-object-align-bottom:before {
        -  content: "\e245"; }
        -
        -.glyphicon-object-align-horizontal:before {
        -  content: "\e246"; }
        -
        -.glyphicon-object-align-left:before {
        -  content: "\e247"; }
        -
        -.glyphicon-object-align-vertical:before {
        -  content: "\e248"; }
        -
        -.glyphicon-object-align-right:before {
        -  content: "\e249"; }
        -
        -.glyphicon-triangle-right:before {
        -  content: "\e250"; }
        -
        -.glyphicon-triangle-left:before {
        -  content: "\e251"; }
        -
        -.glyphicon-triangle-bottom:before {
        -  content: "\e252"; }
        -
        -.glyphicon-triangle-top:before {
        -  content: "\e253"; }
        -
        -.glyphicon-console:before {
        -  content: "\e254"; }
        -
        -.glyphicon-superscript:before {
        -  content: "\e255"; }
        -
        -.glyphicon-subscript:before {
        -  content: "\e256"; }
        -
        -.glyphicon-menu-left:before {
        -  content: "\e257"; }
        -
        -.glyphicon-menu-right:before {
        -  content: "\e258"; }
        -
        -.glyphicon-menu-down:before {
        -  content: "\e259"; }
        -
        -.glyphicon-menu-up:before {
        -  content: "\e260"; }
        -
        -* {
        -  box-sizing: border-box; }
        -
        -*:before,
        -*:after {
        -  box-sizing: border-box; }
        -
        -html {
        -  font-size: 10px;
        -  -webkit-tap-highlight-color: transparent; }
        -
        -body {
        -  font-family: "Lato", sans-serif;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #333333;
        -  background-color: #fff; }
        -
        -input,
        -button,
        -select,
        -textarea {
        -  font-family: inherit;
        -  font-size: inherit;
        -  line-height: inherit; }
        -
        -a {
        -  color: #337ab7;
        -  text-decoration: none; }
        -  a:hover, a:focus {
        -    color: #23527c;
        -    text-decoration: underline; }
        -  a:focus {
        -    outline: thin dotted;
        -    outline: 5px auto -webkit-focus-ring-color;
        -    outline-offset: -2px; }
        -
        -figure {
        -  margin: 0; }
        -
        -img {
        -  vertical-align: middle; }
        -
        -.img-responsive {
        -  display: block;
        -  max-width: 100%;
        -  height: auto; }
        -
        -.img-rounded {
        -  border-radius: 6px; }
        -
        -.img-thumbnail {
        -  padding: 4px;
        -  line-height: 1.428571429;
        -  background-color: #fff;
        -  border: 1px solid #ddd;
        -  border-radius: 4px;
        -  transition: all 0.2s ease-in-out;
        -  display: inline-block;
        -  max-width: 100%;
        -  height: auto; }
        -
        -.img-circle {
        -  border-radius: 50%; }
        -
        -hr {
        -  margin-top: 20px;
        -  margin-bottom: 20px;
        -  border: 0;
        -  border-top: 1px solid #eeeeee; }
        -
        -.sr-only {
        -  position: absolute;
        -  width: 1px;
        -  height: 1px;
        -  margin: -1px;
        -  padding: 0;
        -  overflow: hidden;
        -  clip: rect(0, 0, 0, 0);
        -  border: 0; }
        -
        -.sr-only-focusable:active, .sr-only-focusable:focus {
        -  position: static;
        -  width: auto;
        -  height: auto;
        -  margin: 0;
        -  overflow: visible;
        -  clip: auto; }
        -
        -[role="button"] {
        -  cursor: pointer; }
        -
        -h1, h2, h3, h4, h5, h6,
        -.h1, .h2, .h3, .h4, .h5, .h6 {
        -  font-family: inherit;
        -  font-weight: 500;
        -  line-height: 1.1;
        -  color: inherit; }
        -  h1 small,
        -  h1 .small, h2 small,
        -  h2 .small, h3 small,
        -  h3 .small, h4 small,
        -  h4 .small, h5 small,
        -  h5 .small, h6 small,
        -  h6 .small,
        -  .h1 small,
        -  .h1 .small, .h2 small,
        -  .h2 .small, .h3 small,
        -  .h3 .small, .h4 small,
        -  .h4 .small, .h5 small,
        -  .h5 .small, .h6 small,
        -  .h6 .small {
        -    font-weight: normal;
        -    line-height: 1;
        -    color: #777777; }
        -
        -h1, .h1,
        -h2, .h2,
        -h3, .h3 {
        -  margin-top: 20px;
        -  margin-bottom: 10px; }
        -  h1 small,
        -  h1 .small, .h1 small,
        -  .h1 .small,
        -  h2 small,
        -  h2 .small, .h2 small,
        -  .h2 .small,
        -  h3 small,
        -  h3 .small, .h3 small,
        -  .h3 .small {
        -    font-size: 65%; }
        -
        -h4, .h4,
        -h5, .h5,
        -h6, .h6 {
        -  margin-top: 10px;
        -  margin-bottom: 10px; }
        -  h4 small,
        -  h4 .small, .h4 small,
        -  .h4 .small,
        -  h5 small,
        -  h5 .small, .h5 small,
        -  .h5 .small,
        -  h6 small,
        -  h6 .small, .h6 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: 300;
        -  line-height: 1.4; }
        -  @media (min-width: 768px) {
        -    .lead {
        -      font-size: 21px; } }
        -
        -small,
        -.small {
        -  font-size: 85%; }
        -
        -mark,
        -.mark {
        -  background-color: #fcf8e3;
        -  padding: .2em; }
        -
        -.text-left {
        -  text-align: left; }
        -
        -.text-right {
        -  text-align: right; }
        -
        -.text-center {
        -  text-align: center; }
        -
        -.text-justify {
        -  text-align: justify; }
        -
        -.text-nowrap {
        -  white-space: nowrap; }
        -
        -.text-lowercase {
        -  text-transform: lowercase; }
        -
        -.text-uppercase, .initialism {
        -  text-transform: uppercase; }
        -
        -.text-capitalize {
        -  text-transform: capitalize; }
        -
        -.text-muted {
        -  color: #777777; }
        -
        -.text-primary {
        -  color: #337ab7; }
        -
        -a.text-primary:hover,
        -a.text-primary:focus {
        -  color: #286090; }
        -
        -.text-success {
        -  color: #3c763d; }
        -
        -a.text-success:hover,
        -a.text-success:focus {
        -  color: #2b542c; }
        -
        -.text-info {
        -  color: #31708f; }
        -
        -a.text-info:hover,
        -a.text-info:focus {
        -  color: #245269; }
        -
        -.text-warning {
        -  color: #8a6d3b; }
        -
        -a.text-warning:hover,
        -a.text-warning:focus {
        -  color: #66512c; }
        -
        -.text-danger {
        -  color: #a94442; }
        -
        -a.text-danger:hover,
        -a.text-danger:focus {
        -  color: #843534; }
        -
        -.bg-primary {
        -  color: #fff; }
        -
        -.bg-primary {
        -  background-color: #337ab7; }
        -
        -a.bg-primary:hover,
        -a.bg-primary:focus {
        -  background-color: #286090; }
        -
        -.bg-success {
        -  background-color: #dff0d8; }
        -
        -a.bg-success:hover,
        -a.bg-success:focus {
        -  background-color: #c1e2b3; }
        -
        -.bg-info {
        -  background-color: #d9edf7; }
        -
        -a.bg-info:hover,
        -a.bg-info:focus {
        -  background-color: #afd9ee; }
        -
        -.bg-warning {
        -  background-color: #fcf8e3; }
        -
        -a.bg-warning:hover,
        -a.bg-warning:focus {
        -  background-color: #f7ecb5; }
        -
        -.bg-danger {
        -  background-color: #f2dede; }
        -
        -a.bg-danger:hover,
        -a.bg-danger:focus {
        -  background-color: #e4b9b9; }
        -
        -.page-header {
        -  padding-bottom: 9px;
        -  margin: 40px 0 20px;
        -  border-bottom: 1px solid #eeeeee; }
        -
        -ul,
        -ol {
        -  margin-top: 0;
        -  margin-bottom: 10px; }
        -  ul ul,
        -  ul ol,
        -  ol ul,
        -  ol ol {
        -    margin-bottom: 0; }
        -
        -.list-unstyled {
        -  padding-left: 0;
        -  list-style: none; }
        -
        -.list-inline {
        -  padding-left: 0;
        -  list-style: none;
        -  margin-left: -5px; }
        -  .list-inline > li {
        -    display: inline-block;
        -    padding-left: 5px;
        -    padding-right: 5px; }
        -
        -dl {
        -  margin-top: 0;
        -  margin-bottom: 20px; }
        -
        -dt,
        -dd {
        -  line-height: 1.428571429; }
        -
        -dt {
        -  font-weight: bold; }
        -
        -dd {
        -  margin-left: 0; }
        -
        -.dl-horizontal dd:before, .dl-horizontal dd:after {
        -  content: " ";
        -  display: table; }
        -
        -.dl-horizontal dd:after {
        -  clear: both; }
        -
        -@media (min-width: 768px) {
        -  .dl-horizontal dt {
        -    float: left;
        -    width: 160px;
        -    clear: left;
        -    text-align: right;
        -    overflow: hidden;
        -    text-overflow: ellipsis;
        -    white-space: nowrap; }
        -  .dl-horizontal dd {
        -    margin-left: 180px; } }
        -
        -abbr[title],
        -abbr[data-original-title] {
        -  cursor: help;
        -  border-bottom: 1px dotted #777777; }
        -
        -.initialism {
        -  font-size: 90%; }
        -
        -blockquote {
        -  padding: 10px 20px;
        -  margin: 0 0 20px;
        -  font-size: 17.5px;
        -  border-left: 5px solid #eeeeee; }
        -  blockquote p:last-child,
        -  blockquote ul:last-child,
        -  blockquote ol:last-child {
        -    margin-bottom: 0; }
        -  blockquote footer,
        -  blockquote small,
        -  blockquote .small {
        -    display: block;
        -    font-size: 80%;
        -    line-height: 1.428571429;
        -    color: #777777; }
        -    blockquote footer:before,
        -    blockquote small:before,
        -    blockquote .small:before {
        -      content: '\2014 \00A0'; }
        -
        -.blockquote-reverse,
        -blockquote.pull-right {
        -  padding-right: 15px;
        -  padding-left: 0;
        -  border-right: 5px solid #eeeeee;
        -  border-left: 0;
        -  text-align: right; }
        -  .blockquote-reverse footer:before,
        -  .blockquote-reverse small:before,
        -  .blockquote-reverse .small:before,
        -  blockquote.pull-right footer:before,
        -  blockquote.pull-right small:before,
        -  blockquote.pull-right .small:before {
        -    content: ''; }
        -  .blockquote-reverse footer:after,
        -  .blockquote-reverse small:after,
        -  .blockquote-reverse .small:after,
        -  blockquote.pull-right footer:after,
        -  blockquote.pull-right small:after,
        -  blockquote.pull-right .small:after {
        -    content: '\00A0 \2014'; }
        -
        -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;
        -  background-color: #f9f2f4;
        -  border-radius: 4px; }
        -
        -kbd {
        -  padding: 2px 4px;
        -  font-size: 90%;
        -  color: #fff;
        -  background-color: #333;
        -  border-radius: 3px;
        -  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }
        -  kbd kbd {
        -    padding: 0;
        -    font-size: 100%;
        -    font-weight: bold;
        -    box-shadow: none; }
        -
        -pre {
        -  display: block;
        -  padding: 9.5px;
        -  margin: 0 0 10px;
        -  font-size: 13px;
        -  line-height: 1.428571429;
        -  word-break: break-all;
        -  word-wrap: break-word;
        -  color: #333333;
        -  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 {
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px; }
        -  .container:before, .container:after {
        -    content: " ";
        -    display: table; }
        -  .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; } }
        -
        -.container-fluid {
        -  margin-right: auto;
        -  margin-left: auto;
        -  padding-left: 15px;
        -  padding-right: 15px; }
        -  .container-fluid:before, .container-fluid:after {
        -    content: " ";
        -    display: table; }
        -  .container-fluid:after {
        -    clear: both; }
        -
        -.row {
        -  margin-left: -15px;
        -  margin-right: -15px; }
        -  .row:before, .row:after {
        -    content: " ";
        -    display: table; }
        -  .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-left: 15px;
        -  padding-right: 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-1 {
        -  width: 8.3333333333%; }
        -
        -.col-xs-2 {
        -  width: 16.6666666667%; }
        -
        -.col-xs-3 {
        -  width: 25%; }
        -
        -.col-xs-4 {
        -  width: 33.3333333333%; }
        -
        -.col-xs-5 {
        -  width: 41.6666666667%; }
        -
        -.col-xs-6 {
        -  width: 50%; }
        -
        -.col-xs-7 {
        -  width: 58.3333333333%; }
        -
        -.col-xs-8 {
        -  width: 66.6666666667%; }
        -
        -.col-xs-9 {
        -  width: 75%; }
        -
        -.col-xs-10 {
        -  width: 83.3333333333%; }
        -
        -.col-xs-11 {
        -  width: 91.6666666667%; }
        -
        -.col-xs-12 {
        -  width: 100%; }
        -
        -.col-xs-pull-0 {
        -  right: auto; }
        -
        -.col-xs-pull-1 {
        -  right: 8.3333333333%; }
        -
        -.col-xs-pull-2 {
        -  right: 16.6666666667%; }
        -
        -.col-xs-pull-3 {
        -  right: 25%; }
        -
        -.col-xs-pull-4 {
        -  right: 33.3333333333%; }
        -
        -.col-xs-pull-5 {
        -  right: 41.6666666667%; }
        -
        -.col-xs-pull-6 {
        -  right: 50%; }
        -
        -.col-xs-pull-7 {
        -  right: 58.3333333333%; }
        -
        -.col-xs-pull-8 {
        -  right: 66.6666666667%; }
        -
        -.col-xs-pull-9 {
        -  right: 75%; }
        -
        -.col-xs-pull-10 {
        -  right: 83.3333333333%; }
        -
        -.col-xs-pull-11 {
        -  right: 91.6666666667%; }
        -
        -.col-xs-pull-12 {
        -  right: 100%; }
        -
        -.col-xs-push-0 {
        -  left: auto; }
        -
        -.col-xs-push-1 {
        -  left: 8.3333333333%; }
        -
        -.col-xs-push-2 {
        -  left: 16.6666666667%; }
        -
        -.col-xs-push-3 {
        -  left: 25%; }
        -
        -.col-xs-push-4 {
        -  left: 33.3333333333%; }
        -
        -.col-xs-push-5 {
        -  left: 41.6666666667%; }
        -
        -.col-xs-push-6 {
        -  left: 50%; }
        -
        -.col-xs-push-7 {
        -  left: 58.3333333333%; }
        -
        -.col-xs-push-8 {
        -  left: 66.6666666667%; }
        -
        -.col-xs-push-9 {
        -  left: 75%; }
        -
        -.col-xs-push-10 {
        -  left: 83.3333333333%; }
        -
        -.col-xs-push-11 {
        -  left: 91.6666666667%; }
        -
        -.col-xs-push-12 {
        -  left: 100%; }
        -
        -.col-xs-offset-0 {
        -  margin-left: 0%; }
        -
        -.col-xs-offset-1 {
        -  margin-left: 8.3333333333%; }
        -
        -.col-xs-offset-2 {
        -  margin-left: 16.6666666667%; }
        -
        -.col-xs-offset-3 {
        -  margin-left: 25%; }
        -
        -.col-xs-offset-4 {
        -  margin-left: 33.3333333333%; }
        -
        -.col-xs-offset-5 {
        -  margin-left: 41.6666666667%; }
        -
        -.col-xs-offset-6 {
        -  margin-left: 50%; }
        -
        -.col-xs-offset-7 {
        -  margin-left: 58.3333333333%; }
        -
        -.col-xs-offset-8 {
        -  margin-left: 66.6666666667%; }
        -
        -.col-xs-offset-9 {
        -  margin-left: 75%; }
        -
        -.col-xs-offset-10 {
        -  margin-left: 83.3333333333%; }
        -
        -.col-xs-offset-11 {
        -  margin-left: 91.6666666667%; }
        -
        -.col-xs-offset-12 {
        -  margin-left: 100%; }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-sm-2 {
        -    width: 16.6666666667%; }
        -  .col-sm-3 {
        -    width: 25%; }
        -  .col-sm-4 {
        -    width: 33.3333333333%; }
        -  .col-sm-5 {
        -    width: 41.6666666667%; }
        -  .col-sm-6 {
        -    width: 50%; }
        -  .col-sm-7 {
        -    width: 58.3333333333%; }
        -  .col-sm-8 {
        -    width: 66.6666666667%; }
        -  .col-sm-9 {
        -    width: 75%; }
        -  .col-sm-10 {
        -    width: 83.3333333333%; }
        -  .col-sm-11 {
        -    width: 91.6666666667%; }
        -  .col-sm-12 {
        -    width: 100%; }
        -  .col-sm-pull-0 {
        -    right: auto; }
        -  .col-sm-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-sm-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-sm-pull-3 {
        -    right: 25%; }
        -  .col-sm-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-sm-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-sm-pull-6 {
        -    right: 50%; }
        -  .col-sm-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-sm-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-sm-pull-9 {
        -    right: 75%; }
        -  .col-sm-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-sm-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-sm-pull-12 {
        -    right: 100%; }
        -  .col-sm-push-0 {
        -    left: auto; }
        -  .col-sm-push-1 {
        -    left: 8.3333333333%; }
        -  .col-sm-push-2 {
        -    left: 16.6666666667%; }
        -  .col-sm-push-3 {
        -    left: 25%; }
        -  .col-sm-push-4 {
        -    left: 33.3333333333%; }
        -  .col-sm-push-5 {
        -    left: 41.6666666667%; }
        -  .col-sm-push-6 {
        -    left: 50%; }
        -  .col-sm-push-7 {
        -    left: 58.3333333333%; }
        -  .col-sm-push-8 {
        -    left: 66.6666666667%; }
        -  .col-sm-push-9 {
        -    left: 75%; }
        -  .col-sm-push-10 {
        -    left: 83.3333333333%; }
        -  .col-sm-push-11 {
        -    left: 91.6666666667%; }
        -  .col-sm-push-12 {
        -    left: 100%; }
        -  .col-sm-offset-0 {
        -    margin-left: 0%; }
        -  .col-sm-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-sm-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-sm-offset-3 {
        -    margin-left: 25%; }
        -  .col-sm-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-sm-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-sm-offset-6 {
        -    margin-left: 50%; }
        -  .col-sm-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-sm-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-sm-offset-9 {
        -    margin-left: 75%; }
        -  .col-sm-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-sm-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-sm-offset-12 {
        -    margin-left: 100%; } }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-md-2 {
        -    width: 16.6666666667%; }
        -  .col-md-3 {
        -    width: 25%; }
        -  .col-md-4 {
        -    width: 33.3333333333%; }
        -  .col-md-5 {
        -    width: 41.6666666667%; }
        -  .col-md-6 {
        -    width: 50%; }
        -  .col-md-7 {
        -    width: 58.3333333333%; }
        -  .col-md-8 {
        -    width: 66.6666666667%; }
        -  .col-md-9 {
        -    width: 75%; }
        -  .col-md-10 {
        -    width: 83.3333333333%; }
        -  .col-md-11 {
        -    width: 91.6666666667%; }
        -  .col-md-12 {
        -    width: 100%; }
        -  .col-md-pull-0 {
        -    right: auto; }
        -  .col-md-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-md-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-md-pull-3 {
        -    right: 25%; }
        -  .col-md-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-md-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-md-pull-6 {
        -    right: 50%; }
        -  .col-md-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-md-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-md-pull-9 {
        -    right: 75%; }
        -  .col-md-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-md-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-md-pull-12 {
        -    right: 100%; }
        -  .col-md-push-0 {
        -    left: auto; }
        -  .col-md-push-1 {
        -    left: 8.3333333333%; }
        -  .col-md-push-2 {
        -    left: 16.6666666667%; }
        -  .col-md-push-3 {
        -    left: 25%; }
        -  .col-md-push-4 {
        -    left: 33.3333333333%; }
        -  .col-md-push-5 {
        -    left: 41.6666666667%; }
        -  .col-md-push-6 {
        -    left: 50%; }
        -  .col-md-push-7 {
        -    left: 58.3333333333%; }
        -  .col-md-push-8 {
        -    left: 66.6666666667%; }
        -  .col-md-push-9 {
        -    left: 75%; }
        -  .col-md-push-10 {
        -    left: 83.3333333333%; }
        -  .col-md-push-11 {
        -    left: 91.6666666667%; }
        -  .col-md-push-12 {
        -    left: 100%; }
        -  .col-md-offset-0 {
        -    margin-left: 0%; }
        -  .col-md-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-md-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-md-offset-3 {
        -    margin-left: 25%; }
        -  .col-md-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-md-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-md-offset-6 {
        -    margin-left: 50%; }
        -  .col-md-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-md-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-md-offset-9 {
        -    margin-left: 75%; }
        -  .col-md-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-md-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-md-offset-12 {
        -    margin-left: 100%; } }
        -
        -@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-1 {
        -    width: 8.3333333333%; }
        -  .col-lg-2 {
        -    width: 16.6666666667%; }
        -  .col-lg-3 {
        -    width: 25%; }
        -  .col-lg-4 {
        -    width: 33.3333333333%; }
        -  .col-lg-5 {
        -    width: 41.6666666667%; }
        -  .col-lg-6 {
        -    width: 50%; }
        -  .col-lg-7 {
        -    width: 58.3333333333%; }
        -  .col-lg-8 {
        -    width: 66.6666666667%; }
        -  .col-lg-9 {
        -    width: 75%; }
        -  .col-lg-10 {
        -    width: 83.3333333333%; }
        -  .col-lg-11 {
        -    width: 91.6666666667%; }
        -  .col-lg-12 {
        -    width: 100%; }
        -  .col-lg-pull-0 {
        -    right: auto; }
        -  .col-lg-pull-1 {
        -    right: 8.3333333333%; }
        -  .col-lg-pull-2 {
        -    right: 16.6666666667%; }
        -  .col-lg-pull-3 {
        -    right: 25%; }
        -  .col-lg-pull-4 {
        -    right: 33.3333333333%; }
        -  .col-lg-pull-5 {
        -    right: 41.6666666667%; }
        -  .col-lg-pull-6 {
        -    right: 50%; }
        -  .col-lg-pull-7 {
        -    right: 58.3333333333%; }
        -  .col-lg-pull-8 {
        -    right: 66.6666666667%; }
        -  .col-lg-pull-9 {
        -    right: 75%; }
        -  .col-lg-pull-10 {
        -    right: 83.3333333333%; }
        -  .col-lg-pull-11 {
        -    right: 91.6666666667%; }
        -  .col-lg-pull-12 {
        -    right: 100%; }
        -  .col-lg-push-0 {
        -    left: auto; }
        -  .col-lg-push-1 {
        -    left: 8.3333333333%; }
        -  .col-lg-push-2 {
        -    left: 16.6666666667%; }
        -  .col-lg-push-3 {
        -    left: 25%; }
        -  .col-lg-push-4 {
        -    left: 33.3333333333%; }
        -  .col-lg-push-5 {
        -    left: 41.6666666667%; }
        -  .col-lg-push-6 {
        -    left: 50%; }
        -  .col-lg-push-7 {
        -    left: 58.3333333333%; }
        -  .col-lg-push-8 {
        -    left: 66.6666666667%; }
        -  .col-lg-push-9 {
        -    left: 75%; }
        -  .col-lg-push-10 {
        -    left: 83.3333333333%; }
        -  .col-lg-push-11 {
        -    left: 91.6666666667%; }
        -  .col-lg-push-12 {
        -    left: 100%; }
        -  .col-lg-offset-0 {
        -    margin-left: 0%; }
        -  .col-lg-offset-1 {
        -    margin-left: 8.3333333333%; }
        -  .col-lg-offset-2 {
        -    margin-left: 16.6666666667%; }
        -  .col-lg-offset-3 {
        -    margin-left: 25%; }
        -  .col-lg-offset-4 {
        -    margin-left: 33.3333333333%; }
        -  .col-lg-offset-5 {
        -    margin-left: 41.6666666667%; }
        -  .col-lg-offset-6 {
        -    margin-left: 50%; }
        -  .col-lg-offset-7 {
        -    margin-left: 58.3333333333%; }
        -  .col-lg-offset-8 {
        -    margin-left: 66.6666666667%; }
        -  .col-lg-offset-9 {
        -    margin-left: 75%; }
        -  .col-lg-offset-10 {
        -    margin-left: 83.3333333333%; }
        -  .col-lg-offset-11 {
        -    margin-left: 91.6666666667%; }
        -  .col-lg-offset-12 {
        -    margin-left: 100%; } }
        -
        -table {
        -  background-color: transparent; }
        -
        -caption {
        -  padding-top: 8px;
        -  padding-bottom: 8px;
        -  color: #777777;
        -  text-align: left; }
        -
        -th {
        -  text-align: left; }
        -
        -.table {
        -  width: 100%;
        -  max-width: 100%;
        -  margin-bottom: 20px; }
        -  .table > thead > tr > th,
        -  .table > thead > tr > td,
        -  .table > tbody > tr > th,
        -  .table > tbody > tr > td,
        -  .table > tfoot > tr > th,
        -  .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 > caption + thead > tr:first-child > td,
        -  .table > colgroup + thead > tr:first-child > th,
        -  .table > colgroup + thead > tr:first-child > td,
        -  .table > thead:first-child > tr:first-child > th,
        -  .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 > thead > tr > td,
        -.table-condensed > tbody > tr > th,
        -.table-condensed > tbody > tr > td,
        -.table-condensed > tfoot > tr > th,
        -.table-condensed > tfoot > tr > td {
        -  padding: 5px; }
        -
        -.table-bordered {
        -  border: 1px solid #ddd; }
        -  .table-bordered > thead > tr > th,
        -  .table-bordered > thead > tr > td,
        -  .table-bordered > tbody > tr > th,
        -  .table-bordered > tbody > tr > td,
        -  .table-bordered > tfoot > tr > th,
        -  .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-of-type(odd) {
        -  background-color: #f9f9f9; }
        -
        -.table-hover > tbody > tr:hover {
        -  background-color: #f5f5f5; }
        -
        -table col[class*="col-"] {
        -  position: static;
        -  float: none;
        -  display: table-column; }
        -
        -table td[class*="col-"],
        -table th[class*="col-"] {
        -  position: static;
        -  float: none;
        -  display: table-cell; }
        -
        -.table > thead > tr > td.active,
        -.table > thead > tr > th.active,
        -.table > thead > tr.active > td,
        -.table > thead > tr.active > th,
        -.table > tbody > tr > td.active,
        -.table > tbody > tr > th.active,
        -.table > tbody > tr.active > td,
        -.table > tbody > tr.active > th,
        -.table > tfoot > tr > td.active,
        -.table > tfoot > tr > th.active,
        -.table > tfoot > tr.active > td,
        -.table > tfoot > tr.active > th {
        -  background-color: #f5f5f5; }
        -
        -.table-hover > tbody > tr > td.active:hover,
        -.table-hover > tbody > tr > th.active:hover,
        -.table-hover > tbody > tr.active:hover > td,
        -.table-hover > tbody > tr:hover > .active,
        -.table-hover > tbody > tr.active:hover > th {
        -  background-color: #e8e8e8; }
        -
        -.table > thead > tr > td.success,
        -.table > thead > tr > th.success,
        -.table > thead > tr.success > td,
        -.table > thead > tr.success > th,
        -.table > tbody > tr > td.success,
        -.table > tbody > tr > th.success,
        -.table > tbody > tr.success > td,
        -.table > tbody > tr.success > th,
        -.table > tfoot > tr > td.success,
        -.table > tfoot > tr > th.success,
        -.table > tfoot > tr.success > td,
        -.table > tfoot > tr.success > th {
        -  background-color: #dff0d8; }
        -
        -.table-hover > tbody > tr > td.success:hover,
        -.table-hover > tbody > tr > th.success:hover,
        -.table-hover > tbody > tr.success:hover > td,
        -.table-hover > tbody > tr:hover > .success,
        -.table-hover > tbody > tr.success:hover > th {
        -  background-color: #d0e9c6; }
        -
        -.table > thead > tr > td.info,
        -.table > thead > tr > th.info,
        -.table > thead > tr.info > td,
        -.table > thead > tr.info > th,
        -.table > tbody > tr > td.info,
        -.table > tbody > tr > th.info,
        -.table > tbody > tr.info > td,
        -.table > tbody > tr.info > th,
        -.table > tfoot > tr > td.info,
        -.table > tfoot > tr > th.info,
        -.table > tfoot > tr.info > td,
        -.table > tfoot > tr.info > th {
        -  background-color: #d9edf7; }
        -
        -.table-hover > tbody > tr > td.info:hover,
        -.table-hover > tbody > tr > th.info:hover,
        -.table-hover > tbody > tr.info:hover > td,
        -.table-hover > tbody > tr:hover > .info,
        -.table-hover > tbody > tr.info:hover > th {
        -  background-color: #c4e3f3; }
        -
        -.table > thead > tr > td.warning,
        -.table > thead > tr > th.warning,
        -.table > thead > tr.warning > td,
        -.table > thead > tr.warning > th,
        -.table > tbody > tr > td.warning,
        -.table > tbody > tr > th.warning,
        -.table > tbody > tr.warning > td,
        -.table > tbody > tr.warning > th,
        -.table > tfoot > tr > td.warning,
        -.table > tfoot > tr > th.warning,
        -.table > tfoot > tr.warning > td,
        -.table > tfoot > tr.warning > th {
        -  background-color: #fcf8e3; }
        -
        -.table-hover > tbody > tr > td.warning:hover,
        -.table-hover > tbody > tr > th.warning:hover,
        -.table-hover > tbody > tr.warning:hover > td,
        -.table-hover > tbody > tr:hover > .warning,
        -.table-hover > tbody > tr.warning:hover > th {
        -  background-color: #faf2cc; }
        -
        -.table > thead > tr > td.danger,
        -.table > thead > tr > th.danger,
        -.table > thead > tr.danger > td,
        -.table > thead > tr.danger > th,
        -.table > tbody > tr > td.danger,
        -.table > tbody > tr > th.danger,
        -.table > tbody > tr.danger > td,
        -.table > tbody > tr.danger > th,
        -.table > tfoot > tr > td.danger,
        -.table > tfoot > tr > th.danger,
        -.table > tfoot > tr.danger > td,
        -.table > tfoot > tr.danger > th {
        -  background-color: #f2dede; }
        -
        -.table-hover > tbody > tr > td.danger:hover,
        -.table-hover > tbody > tr > th.danger:hover,
        -.table-hover > tbody > tr.danger:hover > td,
        -.table-hover > tbody > tr:hover > .danger,
        -.table-hover > tbody > tr.danger:hover > th {
        -  background-color: #ebcccc; }
        -
        -.table-responsive {
        -  overflow-x: auto;
        -  min-height: 0.01%; }
        -  @media screen and (max-width: 767px) {
        -    .table-responsive {
        -      width: 100%;
        -      margin-bottom: 15px;
        -      overflow-y: hidden;
        -      -ms-overflow-style: -ms-autohiding-scrollbar;
        -      border: 1px solid #ddd; }
        -      .table-responsive > .table {
        -        margin-bottom: 0; }
        -        .table-responsive > .table > thead > tr > th,
        -        .table-responsive > .table > thead > tr > td,
        -        .table-responsive > .table > tbody > tr > th,
        -        .table-responsive > .table > tbody > tr > td,
        -        .table-responsive > .table > tfoot > tr > th,
        -        .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 > thead > tr > td:first-child,
        -        .table-responsive > .table-bordered > tbody > tr > th:first-child,
        -        .table-responsive > .table-bordered > tbody > tr > td:first-child,
        -        .table-responsive > .table-bordered > tfoot > tr > th: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 > thead > tr > td:last-child,
        -        .table-responsive > .table-bordered > tbody > tr > th:last-child,
        -        .table-responsive > .table-bordered > tbody > tr > td:last-child,
        -        .table-responsive > .table-bordered > tfoot > tr > th: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 > tbody > tr:last-child > td,
        -        .table-responsive > .table-bordered > tfoot > tr:last-child > th,
        -        .table-responsive > .table-bordered > tfoot > tr:last-child > td {
        -          border-bottom: 0; } }
        -
        -fieldset {
        -  padding: 0;
        -  margin: 0;
        -  border: 0;
        -  min-width: 0; }
        -
        -legend {
        -  display: block;
        -  width: 100%;
        -  padding: 0;
        -  margin-bottom: 20px;
        -  font-size: 21px;
        -  line-height: inherit;
        -  color: #333333;
        -  border: 0;
        -  border-bottom: 1px solid #e5e5e5; }
        -
        -label {
        -  display: inline-block;
        -  max-width: 100%;
        -  margin-bottom: 5px;
        -  font-weight: bold; }
        -
        -input[type="search"] {
        -  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; }
        -
        -input[type="range"] {
        -  display: block;
        -  width: 100%; }
        -
        -select[multiple],
        -select[size] {
        -  height: auto; }
        -
        -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; }
        -
        -output {
        -  display: block;
        -  padding-top: 7px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #555555; }
        -
        -.form-control {
        -  display: block;
        -  width: 100%;
        -  height: 34px;
        -  padding: 6px 12px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  color: #555555;
        -  background-color: #fff;
        -  background-image: none;
        -  border: 1px solid #ccc;
        -  border-radius: 4px;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
        -  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
        -  .form-control:focus {
        -    border-color: #66afe9;
        -    outline: 0;
        -    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;
        -    opacity: 1; }
        -  .form-control:-ms-input-placeholder {
        -    color: #999; }
        -  .form-control::-webkit-input-placeholder {
        -    color: #999; }
        -  .form-control::-ms-expand {
        -    border: 0;
        -    background-color: transparent; }
        -  .form-control[disabled], .form-control[readonly],
        -  fieldset[disabled] .form-control {
        -    background-color: #eeeeee;
        -    opacity: 1; }
        -  .form-control[disabled],
        -  fieldset[disabled] .form-control {
        -    cursor: not-allowed; }
        -
        -textarea.form-control {
        -  height: auto; }
        -
        -input[type="search"] {
        -  -webkit-appearance: none; }
        -
        -@media screen and (-webkit-min-device-pixel-ratio: 0) {
        -  input[type="date"].form-control,
        -  input[type="time"].form-control,
        -  input[type="datetime-local"].form-control,
        -  input[type="month"].form-control {
        -    line-height: 34px; }
        -  input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control,
        -  .input-group-sm > input[type="date"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="date"].btn,
        -  .input-group-sm input[type="date"],
        -  input[type="time"].input-sm,
        -  .input-group-sm > input[type="time"].form-control,
        -  .input-group-sm > input[type="time"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="time"].btn,
        -  .input-group-sm
        -  input[type="time"],
        -  input[type="datetime-local"].input-sm,
        -  .input-group-sm > input[type="datetime-local"].form-control,
        -  .input-group-sm > input[type="datetime-local"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
        -  .input-group-sm
        -  input[type="datetime-local"],
        -  input[type="month"].input-sm,
        -  .input-group-sm > input[type="month"].form-control,
        -  .input-group-sm > input[type="month"].input-group-addon,
        -  .input-group-sm > .input-group-btn > input[type="month"].btn,
        -  .input-group-sm
        -  input[type="month"] {
        -    line-height: 30px; }
        -  input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control,
        -  .input-group-lg > input[type="date"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="date"].btn,
        -  .input-group-lg input[type="date"],
        -  input[type="time"].input-lg,
        -  .input-group-lg > input[type="time"].form-control,
        -  .input-group-lg > input[type="time"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="time"].btn,
        -  .input-group-lg
        -  input[type="time"],
        -  input[type="datetime-local"].input-lg,
        -  .input-group-lg > input[type="datetime-local"].form-control,
        -  .input-group-lg > input[type="datetime-local"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
        -  .input-group-lg
        -  input[type="datetime-local"],
        -  input[type="month"].input-lg,
        -  .input-group-lg > input[type="month"].form-control,
        -  .input-group-lg > input[type="month"].input-group-addon,
        -  .input-group-lg > .input-group-btn > input[type="month"].btn,
        -  .input-group-lg
        -  input[type="month"] {
        -    line-height: 46px; } }
        -
        -.form-group {
        -  margin-bottom: 15px; }
        -
        -.radio,
        -.checkbox {
        -  position: relative;
        -  display: block;
        -  margin-top: 10px;
        -  margin-bottom: 10px; }
        -  .radio label,
        -  .checkbox label {
        -    min-height: 20px;
        -    padding-left: 20px;
        -    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"] {
        -  position: absolute;
        -  margin-left: -20px;
        -  margin-top: 4px \9; }
        -
        -.radio + .radio,
        -.checkbox + .checkbox {
        -  margin-top: -5px; }
        -
        -.radio-inline,
        -.checkbox-inline {
        -  position: relative;
        -  display: inline-block;
        -  padding-left: 20px;
        -  margin-bottom: 0;
        -  vertical-align: middle;
        -  font-weight: normal;
        -  cursor: pointer; }
        -
        -.radio-inline + .radio-inline,
        -.checkbox-inline + .checkbox-inline {
        -  margin-top: 0;
        -  margin-left: 10px; }
        -
        -input[type="radio"][disabled], input[type="radio"].disabled,
        -fieldset[disabled] input[type="radio"],
        -input[type="checkbox"][disabled],
        -input[type="checkbox"].disabled,
        -fieldset[disabled]
        -input[type="checkbox"] {
        -  cursor: not-allowed; }
        -
        -.radio-inline.disabled,
        -fieldset[disabled] .radio-inline,
        -.checkbox-inline.disabled,
        -fieldset[disabled]
        -.checkbox-inline {
        -  cursor: not-allowed; }
        -
        -.radio.disabled label,
        -fieldset[disabled] .radio label,
        -.checkbox.disabled label,
        -fieldset[disabled]
        -.checkbox label {
        -  cursor: not-allowed; }
        -
        -.form-control-static {
        -  padding-top: 7px;
        -  padding-bottom: 7px;
        -  margin-bottom: 0;
        -  min-height: 34px; }
        -  .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,
        -  .input-group-lg > .form-control-static.input-group-addon,
        -  .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
        -  .input-group-sm > .form-control-static.input-group-addon,
        -  .input-group-sm > .input-group-btn > .form-control-static.btn {
        -    padding-left: 0;
        -    padding-right: 0; }
        -
        -.input-sm, .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-sm, .input-group-sm > select.form-control,
        -.input-group-sm > select.input-group-addon,
        -.input-group-sm > .input-group-btn > select.btn {
        -  height: 30px;
        -  line-height: 30px; }
        -
        -textarea.input-sm, .input-group-sm > textarea.form-control,
        -.input-group-sm > textarea.input-group-addon,
        -.input-group-sm > .input-group-btn > textarea.btn,
        -select[multiple].input-sm,
        -.input-group-sm > select[multiple].form-control,
        -.input-group-sm > select[multiple].input-group-addon,
        -.input-group-sm > .input-group-btn > select[multiple].btn {
        -  height: auto; }
        -
        -.form-group-sm .form-control {
        -  height: 30px;
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.form-group-sm select.form-control {
        -  height: 30px;
        -  line-height: 30px; }
        -
        -.form-group-sm textarea.form-control,
        -.form-group-sm select[multiple].form-control {
        -  height: auto; }
        -
        -.form-group-sm .form-control-static {
        -  height: 30px;
        -  min-height: 32px;
        -  padding: 6px 10px;
        -  font-size: 12px;
        -  line-height: 1.5; }
        -
        -.input-lg, .input-group-lg > .form-control,
        -.input-group-lg > .input-group-addon,
        -.input-group-lg > .input-group-btn > .btn {
        -  height: 46px;
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -select.input-lg, .input-group-lg > select.form-control,
        -.input-group-lg > select.input-group-addon,
        -.input-group-lg > .input-group-btn > select.btn {
        -  height: 46px;
        -  line-height: 46px; }
        -
        -textarea.input-lg, .input-group-lg > textarea.form-control,
        -.input-group-lg > textarea.input-group-addon,
        -.input-group-lg > .input-group-btn > textarea.btn,
        -select[multiple].input-lg,
        -.input-group-lg > select[multiple].form-control,
        -.input-group-lg > select[multiple].input-group-addon,
        -.input-group-lg > .input-group-btn > select[multiple].btn {
        -  height: auto; }
        -
        -.form-group-lg .form-control {
        -  height: 46px;
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -.form-group-lg select.form-control {
        -  height: 46px;
        -  line-height: 46px; }
        -
        -.form-group-lg textarea.form-control,
        -.form-group-lg select[multiple].form-control {
        -  height: auto; }
        -
        -.form-group-lg .form-control-static {
        -  height: 46px;
        -  min-height: 38px;
        -  padding: 11px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333; }
        -
        -.has-feedback {
        -  position: relative; }
        -  .has-feedback .form-control {
        -    padding-right: 42.5px; }
        -
        -.form-control-feedback {
        -  position: absolute;
        -  top: 0;
        -  right: 0;
        -  z-index: 2;
        -  display: block;
        -  width: 34px;
        -  height: 34px;
        -  line-height: 34px;
        -  text-align: center;
        -  pointer-events: none; }
        -
        -.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,
        -.input-group-lg > .input-group-addon + .form-control-feedback,
        -.input-group-lg > .input-group-btn > .btn + .form-control-feedback,
        -.input-group-lg + .form-control-feedback,
        -.form-group-lg .form-control + .form-control-feedback {
        -  width: 46px;
        -  height: 46px;
        -  line-height: 46px; }
        -
        -.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,
        -.input-group-sm > .input-group-addon + .form-control-feedback,
        -.input-group-sm > .input-group-btn > .btn + .form-control-feedback,
        -.input-group-sm + .form-control-feedback,
        -.form-group-sm .form-control + .form-control-feedback {
        -  width: 30px;
        -  height: 30px;
        -  line-height: 30px; }
        -
        -.has-success .help-block,
        -.has-success .control-label,
        -.has-success .radio,
        -.has-success .checkbox,
        -.has-success .radio-inline,
        -.has-success .checkbox-inline,
        -.has-success.radio label,
        -.has-success.checkbox label,
        -.has-success.radio-inline label,
        -.has-success.checkbox-inline label {
        -  color: #3c763d; }
        -
        -.has-success .form-control {
        -  border-color: #3c763d;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-success .form-control:focus {
        -    border-color: #2b542c;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }
        -
        -.has-success .input-group-addon {
        -  color: #3c763d;
        -  border-color: #3c763d;
        -  background-color: #dff0d8; }
        -
        -.has-success .form-control-feedback {
        -  color: #3c763d; }
        -
        -.has-warning .help-block,
        -.has-warning .control-label,
        -.has-warning .radio,
        -.has-warning .checkbox,
        -.has-warning .radio-inline,
        -.has-warning .checkbox-inline,
        -.has-warning.radio label,
        -.has-warning.checkbox label,
        -.has-warning.radio-inline label,
        -.has-warning.checkbox-inline label {
        -  color: #8a6d3b; }
        -
        -.has-warning .form-control {
        -  border-color: #8a6d3b;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-warning .form-control:focus {
        -    border-color: #66512c;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }
        -
        -.has-warning .input-group-addon {
        -  color: #8a6d3b;
        -  border-color: #8a6d3b;
        -  background-color: #fcf8e3; }
        -
        -.has-warning .form-control-feedback {
        -  color: #8a6d3b; }
        -
        -.has-error .help-block,
        -.has-error .control-label,
        -.has-error .radio,
        -.has-error .checkbox,
        -.has-error .radio-inline,
        -.has-error .checkbox-inline,
        -.has-error.radio label,
        -.has-error.checkbox label,
        -.has-error.radio-inline label,
        -.has-error.checkbox-inline label {
        -  color: #a94442; }
        -
        -.has-error .form-control {
        -  border-color: #a94442;
        -  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
        -  .has-error .form-control:focus {
        -    border-color: #843534;
        -    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }
        -
        -.has-error .input-group-addon {
        -  color: #a94442;
        -  border-color: #a94442;
        -  background-color: #f2dede; }
        -
        -.has-error .form-control-feedback {
        -  color: #a94442; }
        -
        -.has-feedback label ~ .form-control-feedback {
        -  top: 25px; }
        -
        -.has-feedback label.sr-only ~ .form-control-feedback {
        -  top: 0; }
        -
        -.help-block {
        -  display: block;
        -  margin-top: 5px;
        -  margin-bottom: 10px;
        -  color: #737373; }
        -
        -@media (min-width: 768px) {
        -  .form-inline .form-group {
        -    display: inline-block;
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -  .form-inline .form-control {
        -    display: inline-block;
        -    width: auto;
        -    vertical-align: middle; }
        -  .form-inline .form-control-static {
        -    display: inline-block; }
        -  .form-inline .input-group {
        -    display: inline-table;
        -    vertical-align: middle; }
        -    .form-inline .input-group .input-group-addon,
        -    .form-inline .input-group .input-group-btn,
        -    .form-inline .input-group .form-control {
        -      width: auto; }
        -  .form-inline .input-group > .form-control {
        -    width: 100%; }
        -  .form-inline .control-label {
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -  .form-inline .radio,
        -  .form-inline .checkbox {
        -    display: inline-block;
        -    margin-top: 0;
        -    margin-bottom: 0;
        -    vertical-align: middle; }
        -    .form-inline .radio label,
        -    .form-inline .checkbox label {
        -      padding-left: 0; }
        -  .form-inline .radio input[type="radio"],
        -  .form-inline .checkbox input[type="checkbox"] {
        -    position: relative;
        -    margin-left: 0; }
        -  .form-inline .has-feedback .form-control-feedback {
        -    top: 0; } }
        -
        -.form-horizontal .radio,
        -.form-horizontal .checkbox,
        -.form-horizontal .radio-inline,
        -.form-horizontal .checkbox-inline {
        -  margin-top: 0;
        -  margin-bottom: 0;
        -  padding-top: 7px; }
        -
        -.form-horizontal .radio,
        -.form-horizontal .checkbox {
        -  min-height: 27px; }
        -
        -.form-horizontal .form-group {
        -  margin-left: -15px;
        -  margin-right: -15px; }
        -  .form-horizontal .form-group:before, .form-horizontal .form-group:after {
        -    content: " ";
        -    display: table; }
        -  .form-horizontal .form-group:after {
        -    clear: both; }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .control-label {
        -    text-align: right;
        -    margin-bottom: 0;
        -    padding-top: 7px; } }
        -
        -.form-horizontal .has-feedback .form-control-feedback {
        -  right: 15px; }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .form-group-lg .control-label {
        -    padding-top: 11px;
        -    font-size: 18px; } }
        -
        -@media (min-width: 768px) {
        -  .form-horizontal .form-group-sm .control-label {
        -    padding-top: 6px;
        -    font-size: 12px; } }
        -
        -.btn {
        -  display: inline-block;
        -  margin-bottom: 0;
        -  font-weight: normal;
        -  text-align: center;
        -  vertical-align: middle;
        -  -ms-touch-action: manipulation;
        -  touch-action: manipulation;
        -  cursor: pointer;
        -  background-image: none;
        -  border: 1px solid transparent;
        -  white-space: nowrap;
        -  padding: 6px 12px;
        -  font-size: 14px;
        -  line-height: 1.428571429;
        -  border-radius: 4px;
        -  -webkit-user-select: none;
        -  -moz-user-select: none;
        -  -ms-user-select: none;
        -  user-select: none; }
        -  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
        -    outline: thin dotted;
        -    outline: 5px auto -webkit-focus-ring-color;
        -    outline-offset: -2px; }
        -  .btn:hover, .btn:focus, .btn.focus {
        -    color: #333;
        -    text-decoration: none; }
        -  .btn:active, .btn.active {
        -    outline: 0;
        -    background-image: none;
        -    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
        -  .btn.disabled, .btn[disabled],
        -  fieldset[disabled] .btn {
        -    cursor: not-allowed;
        -    opacity: 0.65;
        -    filter: alpha(opacity=65);
        -    box-shadow: none; }
        -
        -a.btn.disabled,
        -fieldset[disabled] a.btn {
        -  pointer-events: none; }
        -
        -.btn-default {
        -  color: #333;
        -  background-color: #fff;
        -  border-color: #ccc; }
        -  .btn-default:focus, .btn-default.focus {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #8c8c8c; }
        -  .btn-default:hover {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #adadad; }
        -  .btn-default:active, .btn-default.active,
        -  .open > .btn-default.dropdown-toggle {
        -    color: #333;
        -    background-color: #e6e6e6;
        -    border-color: #adadad; }
        -    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,
        -    .open > .btn-default.dropdown-toggle:hover,
        -    .open > .btn-default.dropdown-toggle:focus,
        -    .open > .btn-default.dropdown-toggle.focus {
        -      color: #333;
        -      background-color: #d4d4d4;
        -      border-color: #8c8c8c; }
        -  .btn-default:active, .btn-default.active,
        -  .open > .btn-default.dropdown-toggle {
        -    background-image: none; }
        -  .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,
        -  fieldset[disabled] .btn-default:hover,
        -  fieldset[disabled] .btn-default:focus,
        -  fieldset[disabled] .btn-default.focus {
        -    background-color: #fff;
        -    border-color: #ccc; }
        -  .btn-default .badge {
        -    color: #fff;
        -    background-color: #333; }
        -
        -.btn-primary {
        -  color: #fff;
        -  background-color: #337ab7;
        -  border-color: #2e6da4; }
        -  .btn-primary:focus, .btn-primary.focus {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #122b40; }
        -  .btn-primary:hover {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #204d74; }
        -  .btn-primary:active, .btn-primary.active,
        -  .open > .btn-primary.dropdown-toggle {
        -    color: #fff;
        -    background-color: #286090;
        -    border-color: #204d74; }
        -    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,
        -    .open > .btn-primary.dropdown-toggle:hover,
        -    .open > .btn-primary.dropdown-toggle:focus,
        -    .open > .btn-primary.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #204d74;
        -      border-color: #122b40; }
        -  .btn-primary:active, .btn-primary.active,
        -  .open > .btn-primary.dropdown-toggle {
        -    background-image: none; }
        -  .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,
        -  fieldset[disabled] .btn-primary:hover,
        -  fieldset[disabled] .btn-primary:focus,
        -  fieldset[disabled] .btn-primary.focus {
        -    background-color: #337ab7;
        -    border-color: #2e6da4; }
        -  .btn-primary .badge {
        -    color: #337ab7;
        -    background-color: #fff; }
        -
        -.btn-success {
        -  color: #fff;
        -  background-color: #5cb85c;
        -  border-color: #4cae4c; }
        -  .btn-success:focus, .btn-success.focus {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #255625; }
        -  .btn-success:hover {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #398439; }
        -  .btn-success:active, .btn-success.active,
        -  .open > .btn-success.dropdown-toggle {
        -    color: #fff;
        -    background-color: #449d44;
        -    border-color: #398439; }
        -    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,
        -    .open > .btn-success.dropdown-toggle:hover,
        -    .open > .btn-success.dropdown-toggle:focus,
        -    .open > .btn-success.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #398439;
        -      border-color: #255625; }
        -  .btn-success:active, .btn-success.active,
        -  .open > .btn-success.dropdown-toggle {
        -    background-image: none; }
        -  .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,
        -  fieldset[disabled] .btn-success:hover,
        -  fieldset[disabled] .btn-success:focus,
        -  fieldset[disabled] .btn-success.focus {
        -    background-color: #5cb85c;
        -    border-color: #4cae4c; }
        -  .btn-success .badge {
        -    color: #5cb85c;
        -    background-color: #fff; }
        -
        -.btn-info {
        -  color: #fff;
        -  background-color: #5bc0de;
        -  border-color: #46b8da; }
        -  .btn-info:focus, .btn-info.focus {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #1b6d85; }
        -  .btn-info:hover {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #269abc; }
        -  .btn-info:active, .btn-info.active,
        -  .open > .btn-info.dropdown-toggle {
        -    color: #fff;
        -    background-color: #31b0d5;
        -    border-color: #269abc; }
        -    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,
        -    .open > .btn-info.dropdown-toggle:hover,
        -    .open > .btn-info.dropdown-toggle:focus,
        -    .open > .btn-info.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #269abc;
        -      border-color: #1b6d85; }
        -  .btn-info:active, .btn-info.active,
        -  .open > .btn-info.dropdown-toggle {
        -    background-image: none; }
        -  .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,
        -  fieldset[disabled] .btn-info:hover,
        -  fieldset[disabled] .btn-info:focus,
        -  fieldset[disabled] .btn-info.focus {
        -    background-color: #5bc0de;
        -    border-color: #46b8da; }
        -  .btn-info .badge {
        -    color: #5bc0de;
        -    background-color: #fff; }
        -
        -.btn-warning {
        -  color: #fff;
        -  background-color: #f0ad4e;
        -  border-color: #eea236; }
        -  .btn-warning:focus, .btn-warning.focus {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #985f0d; }
        -  .btn-warning:hover {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #d58512; }
        -  .btn-warning:active, .btn-warning.active,
        -  .open > .btn-warning.dropdown-toggle {
        -    color: #fff;
        -    background-color: #ec971f;
        -    border-color: #d58512; }
        -    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,
        -    .open > .btn-warning.dropdown-toggle:hover,
        -    .open > .btn-warning.dropdown-toggle:focus,
        -    .open > .btn-warning.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #d58512;
        -      border-color: #985f0d; }
        -  .btn-warning:active, .btn-warning.active,
        -  .open > .btn-warning.dropdown-toggle {
        -    background-image: none; }
        -  .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,
        -  fieldset[disabled] .btn-warning:hover,
        -  fieldset[disabled] .btn-warning:focus,
        -  fieldset[disabled] .btn-warning.focus {
        -    background-color: #f0ad4e;
        -    border-color: #eea236; }
        -  .btn-warning .badge {
        -    color: #f0ad4e;
        -    background-color: #fff; }
        -
        -.btn-danger {
        -  color: #fff;
        -  background-color: #d9534f;
        -  border-color: #d43f3a; }
        -  .btn-danger:focus, .btn-danger.focus {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #761c19; }
        -  .btn-danger:hover {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #ac2925; }
        -  .btn-danger:active, .btn-danger.active,
        -  .open > .btn-danger.dropdown-toggle {
        -    color: #fff;
        -    background-color: #c9302c;
        -    border-color: #ac2925; }
        -    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,
        -    .open > .btn-danger.dropdown-toggle:hover,
        -    .open > .btn-danger.dropdown-toggle:focus,
        -    .open > .btn-danger.dropdown-toggle.focus {
        -      color: #fff;
        -      background-color: #ac2925;
        -      border-color: #761c19; }
        -  .btn-danger:active, .btn-danger.active,
        -  .open > .btn-danger.dropdown-toggle {
        -    background-image: none; }
        -  .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,
        -  fieldset[disabled] .btn-danger:hover,
        -  fieldset[disabled] .btn-danger:focus,
        -  fieldset[disabled] .btn-danger.focus {
        -    background-color: #d9534f;
        -    border-color: #d43f3a; }
        -  .btn-danger .badge {
        -    color: #d9534f;
        -    background-color: #fff; }
        -
        -.btn-link {
        -  color: #337ab7;
        -  font-weight: normal;
        -  border-radius: 0; }
        -  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],
        -  fieldset[disabled] .btn-link {
        -    background-color: transparent;
        -    box-shadow: none; }
        -  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {
        -    border-color: transparent; }
        -  .btn-link:hover, .btn-link:focus {
        -    color: #23527c;
        -    text-decoration: underline;
        -    background-color: transparent; }
        -  .btn-link[disabled]:hover, .btn-link[disabled]:focus,
        -  fieldset[disabled] .btn-link:hover,
        -  fieldset[disabled] .btn-link:focus {
        -    color: #777777;
        -    text-decoration: none; }
        -
        -.btn-lg, .btn-group-lg > .btn {
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333;
        -  border-radius: 6px; }
        -
        -.btn-sm, .btn-group-sm > .btn {
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.btn-xs, .btn-group-xs > .btn {
        -  padding: 1px 5px;
        -  font-size: 12px;
        -  line-height: 1.5;
        -  border-radius: 3px; }
        -
        -.btn-block {
        -  display: block;
        -  width: 100%; }
        -
        -.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;
        -  transition: opacity 0.15s linear; }
        -  .fade.in {
        -    opacity: 1; }
        -
        -.collapse {
        -  display: none; }
        -  .collapse.in {
        -    display: block; }
        -
        -tr.collapse.in {
        -  display: table-row; }
        -
        -tbody.collapse.in {
        -  display: table-row-group; }
        -
        -.collapsing {
        -  position: relative;
        -  height: 0;
        -  overflow: hidden;
        -  transition-property: height, visibility;
        -  transition-duration: 0.35s;
        -  transition-timing-function: ease; }
        -
        -.caret {
        -  display: inline-block;
        -  width: 0;
        -  height: 0;
        -  margin-left: 2px;
        -  vertical-align: middle;
        -  border-top: 4px dashed;
        -  border-top: 4px solid \9;
        -  border-right: 4px solid transparent;
        -  border-left: 4px solid transparent; }
        -
        -.dropup,
        -.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;
        -  list-style: none;
        -  font-size: 14px;
        -  text-align: left;
        -  background-color: #fff;
        -  border: 1px solid #ccc;
        -  border: 1px solid rgba(0, 0, 0, 0.15);
        -  border-radius: 4px;
        -  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: #333333;
        -    white-space: nowrap; }
        -
        -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
        -  text-decoration: none;
        -  color: #262626;
        -  background-color: #f5f5f5; }
        -
        -.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  outline: 0;
        -  background-color: #337ab7; }
        -
        -.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
        -  color: #777777; }
        -
        -.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
        -  text-decoration: none;
        -  background-color: transparent;
        -  background-image: none;
        -  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
        -  cursor: not-allowed; }
        -
        -.open > .dropdown-menu {
        -  display: block; }
        -
        -.open > a {
        -  outline: 0; }
        -
        -.dropdown-menu-right {
        -  left: auto;
        -  right: 0; }
        -
        -.dropdown-menu-left {
        -  left: 0;
        -  right: auto; }
        -
        -.dropdown-header {
        -  display: block;
        -  padding: 3px 20px;
        -  font-size: 12px;
        -  line-height: 1.428571429;
        -  color: #777777;
        -  white-space: nowrap; }
        -
        -.dropdown-backdrop {
        -  position: fixed;
        -  left: 0;
        -  right: 0;
        -  bottom: 0;
        -  top: 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 dashed;
        -  border-bottom: 4px solid \9;
        -  content: ""; }
        -
        -.dropup .dropdown-menu,
        -.navbar-fixed-bottom .dropdown .dropdown-menu {
        -  top: auto;
        -  bottom: 100%;
        -  margin-bottom: 2px; }
        -
        -@media (min-width: 768px) {
        -  .navbar-right .dropdown-menu {
        -    right: 0;
        -    left: auto; }
        -  .navbar-right .dropdown-menu-left {
        -    left: 0;
        -    right: 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 > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
        -    .btn-group-vertical > .btn:hover,
        -    .btn-group-vertical > .btn:focus,
        -    .btn-group-vertical > .btn:active,
        -    .btn-group-vertical > .btn.active {
        -      z-index: 2; }
        -
        -.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 {
        -  margin-left: -5px; }
        -  .btn-toolbar:before, .btn-toolbar:after {
        -    content: " ";
        -    display: table; }
        -  .btn-toolbar:after {
        -    clear: both; }
        -  .btn-toolbar .btn,
        -  .btn-toolbar .btn-group,
        -  .btn-toolbar .input-group {
        -    float: left; }
        -  .btn-toolbar > .btn,
        -  .btn-toolbar > .btn-group,
        -  .btn-toolbar > .input-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-bottom-right-radius: 0;
        -    border-top-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:not(:last-child) > .btn:last-child,
        -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
        -  border-bottom-right-radius: 0;
        -  border-top-right-radius: 0; }
        -
        -.btn-group > .btn-group:last-child:not(:first-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 > .btn + .dropdown-toggle {
        -  padding-left: 8px;
        -  padding-right: 8px; }
        -
        -.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {
        -  padding-left: 12px;
        -  padding-right: 12px; }
        -
        -.btn-group.open .dropdown-toggle {
        -  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
        -  .btn-group.open .dropdown-toggle.btn-link {
        -    box-shadow: none; }
        -
        -.btn .caret {
        -  margin-left: 0; }
        -
        -.btn-lg .caret, .btn-group-lg > .btn .caret {
        -  border-width: 5px 5px 0;
        -  border-bottom-width: 0; }
        -
        -.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .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 {
        -  content: " ";
        -  display: table; }
        -
        -.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-top-left-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-top-left-radius: 0;
        -  border-bottom-right-radius: 4px;
        -  border-bottom-left-radius: 4px; }
        -
        -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
        -  border-radius: 0; }
        -
        -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
        -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0; }
        -
        -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.btn-group-justified {
        -  display: table;
        -  width: 100%;
        -  table-layout: fixed;
        -  border-collapse: separate; }
        -  .btn-group-justified > .btn,
        -  .btn-group-justified > .btn-group {
        -    float: none;
        -    display: table-cell;
        -    width: 1%; }
        -  .btn-group-justified > .btn-group .btn {
        -    width: 100%; }
        -  .btn-group-justified > .btn-group .dropdown-menu {
        -    left: auto; }
        -
        -[data-toggle="buttons"] > .btn input[type="radio"],
        -[data-toggle="buttons"] > .btn input[type="checkbox"],
        -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
        -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
        -  position: absolute;
        -  clip: rect(0, 0, 0, 0);
        -  pointer-events: none; }
        -
        -.input-group {
        -  position: relative;
        -  display: table;
        -  border-collapse: separate; }
        -  .input-group[class*="col-"] {
        -    float: none;
        -    padding-left: 0;
        -    padding-right: 0; }
        -  .input-group .form-control {
        -    position: relative;
        -    z-index: 2;
        -    float: left;
        -    width: 100%;
        -    margin-bottom: 0; }
        -    .input-group .form-control:focus {
        -      z-index: 3; }
        -
        -.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: 6px 12px;
        -  font-size: 14px;
        -  font-weight: normal;
        -  line-height: 1;
        -  color: #555555;
        -  text-align: center;
        -  background-color: #eeeeee;
        -  border: 1px solid #ccc;
        -  border-radius: 4px; }
        -  .input-group-addon.input-sm,
        -  .input-group-sm > .input-group-addon,
        -  .input-group-sm > .input-group-btn > .input-group-addon.btn {
        -    padding: 5px 10px;
        -    font-size: 12px;
        -    border-radius: 3px; }
        -  .input-group-addon.input-lg,
        -  .input-group-lg > .input-group-addon,
        -  .input-group-lg > .input-group-btn > .input-group-addon.btn {
        -    padding: 10px 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 > .btn-group > .btn,
        -.input-group-btn:first-child > .dropdown-toggle,
        -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
        -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
        -  border-bottom-right-radius: 0;
        -  border-top-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 > .btn-group > .btn,
        -.input-group-btn:last-child > .dropdown-toggle,
        -.input-group-btn:first-child > .btn:not(:first-child),
        -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
        -  border-bottom-left-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.input-group-addon:last-child {
        -  border-left: 0; }
        -
        -.input-group-btn {
        -  position: relative;
        -  font-size: 0;
        -  white-space: nowrap; }
        -  .input-group-btn > .btn {
        -    position: relative; }
        -    .input-group-btn > .btn + .btn {
        -      margin-left: -1px; }
        -    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {
        -      z-index: 2; }
        -  .input-group-btn:first-child > .btn,
        -  .input-group-btn:first-child > .btn-group {
        -    margin-right: -1px; }
        -  .input-group-btn:last-child > .btn,
        -  .input-group-btn:last-child > .btn-group {
        -    z-index: 2;
        -    margin-left: -1px; }
        -
        -.nav {
        -  margin-bottom: 0;
        -  padding-left: 0;
        -  list-style: none; }
        -  .nav:before, .nav:after {
        -    content: " ";
        -    display: table; }
        -  .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: #eeeeee; }
        -    .nav > li.disabled > a {
        -      color: #777777; }
        -      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
        -        color: #777777;
        -        text-decoration: none;
        -        background-color: transparent;
        -        cursor: not-allowed; }
        -  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
        -    background-color: #eeeeee;
        -    border-color: #337ab7; }
        -  .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: #eeeeee #eeeeee #ddd; }
        -    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
        -      color: #555555;
        -      background-color: #fff;
        -      border: 1px solid #ddd;
        -      border-bottom-color: transparent;
        -      cursor: default; }
        -
        -.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: #337ab7; }
        -
        -.nav-stacked > li {
        -  float: none; }
        -  .nav-stacked > li + li {
        -    margin-top: 2px;
        -    margin-left: 0; }
        -
        -.nav-justified, .nav-tabs.nav-justified {
        -  width: 100%; }
        -  .nav-justified > li, .nav-tabs.nav-justified > li {
        -    float: none; }
        -    .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
        -      text-align: center;
        -      margin-bottom: 5px; }
        -  .nav-justified > .dropdown .dropdown-menu {
        -    top: auto;
        -    left: auto; }
        -  @media (min-width: 768px) {
        -    .nav-justified > li, .nav-tabs.nav-justified > li {
        -      display: table-cell;
        -      width: 1%; }
        -      .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
        -        margin-bottom: 0; } }
        -
        -.nav-tabs-justified, .nav-tabs.nav-justified {
        -  border-bottom: 0; }
        -  .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
        -    margin-right: 0;
        -    border-radius: 4px; }
        -  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
        -  .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
        -  .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
        -    border: 1px solid #ddd; }
        -  @media (min-width: 768px) {
        -    .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
        -      border-bottom: 1px solid #ddd;
        -      border-radius: 4px 4px 0 0; }
        -    .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
        -    .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
        -    .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-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 {
        -    content: " ";
        -    display: table; }
        -  .navbar:after {
        -    clear: both; }
        -  @media (min-width: 768px) {
        -    .navbar {
        -      border-radius: 4px; } }
        -
        -.navbar-header:before, .navbar-header:after {
        -  content: " ";
        -  display: table; }
        -
        -.navbar-header:after {
        -  clear: both; }
        -
        -@media (min-width: 768px) {
        -  .navbar-header {
        -    float: left; } }
        -
        -.navbar-collapse {
        -  overflow-x: visible;
        -  padding-right: 15px;
        -  padding-left: 15px;
        -  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 {
        -    content: " ";
        -    display: table; }
        -  .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-left: 0;
        -        padding-right: 0; } }
        -
        -.navbar-fixed-top .navbar-collapse,
        -.navbar-fixed-bottom .navbar-collapse {
        -  max-height: 340px; }
        -  @media (max-device-width: 480px) and (orientation: landscape) {
        -    .navbar-fixed-top .navbar-collapse,
        -    .navbar-fixed-bottom .navbar-collapse {
        -      max-height: 200px; } }
        -
        -.container > .navbar-header,
        -.container > .navbar-collapse,
        -.container-fluid > .navbar-header,
        -.container-fluid > .navbar-collapse {
        -  margin-right: -15px;
        -  margin-left: -15px; }
        -  @media (min-width: 768px) {
        -    .container > .navbar-header,
        -    .container > .navbar-collapse,
        -    .container-fluid > .navbar-header,
        -    .container-fluid > .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;
        -  height: 50px; }
        -  .navbar-brand:hover, .navbar-brand:focus {
        -    text-decoration: none; }
        -  .navbar-brand > img {
        -    display: block; }
        -  @media (min-width: 768px) {
        -    .navbar > .container .navbar-brand,
        -    .navbar > .container-fluid .navbar-brand {
        -      margin-left: -15px; } }
        -
        -.navbar-toggle {
        -  position: relative;
        -  float: right;
        -  margin-right: 15px;
        -  padding: 9px 10px;
        -  margin-top: 8px;
        -  margin-bottom: 8px;
        -  background-color: transparent;
        -  background-image: none;
        -  border: 1px solid transparent;
        -  border-radius: 4px; }
        -  .navbar-toggle:focus {
        -    outline: 0; }
        -  .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-form {
        -  margin-left: -15px;
        -  margin-right: -15px;
        -  padding: 10px 15px;
        -  border-top: 1px solid transparent;
        -  border-bottom: 1px solid transparent;
        -  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
        -  margin-top: 8px;
        -  margin-bottom: 8px; }
        -  @media (min-width: 768px) {
        -    .navbar-form .form-group {
        -      display: inline-block;
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -    .navbar-form .form-control {
        -      display: inline-block;
        -      width: auto;
        -      vertical-align: middle; }
        -    .navbar-form .form-control-static {
        -      display: inline-block; }
        -    .navbar-form .input-group {
        -      display: inline-table;
        -      vertical-align: middle; }
        -      .navbar-form .input-group .input-group-addon,
        -      .navbar-form .input-group .input-group-btn,
        -      .navbar-form .input-group .form-control {
        -        width: auto; }
        -    .navbar-form .input-group > .form-control {
        -      width: 100%; }
        -    .navbar-form .control-label {
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -    .navbar-form .radio,
        -    .navbar-form .checkbox {
        -      display: inline-block;
        -      margin-top: 0;
        -      margin-bottom: 0;
        -      vertical-align: middle; }
        -      .navbar-form .radio label,
        -      .navbar-form .checkbox label {
        -        padding-left: 0; }
        -    .navbar-form .radio input[type="radio"],
        -    .navbar-form .checkbox input[type="checkbox"] {
        -      position: relative;
        -      margin-left: 0; }
        -    .navbar-form .has-feedback .form-control-feedback {
        -      top: 0; } }
        -  @media (max-width: 767px) {
        -    .navbar-form .form-group {
        -      margin-bottom: 5px; }
        -      .navbar-form .form-group:last-child {
        -        margin-bottom: 0; } }
        -  @media (min-width: 768px) {
        -    .navbar-form {
        -      width: auto;
        -      border: 0;
        -      margin-left: 0;
        -      margin-right: 0;
        -      padding-top: 0;
        -      padding-bottom: 0;
        -      box-shadow: none; } }
        -
        -.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 {
        -  margin-bottom: 0;
        -  border-top-right-radius: 4px;
        -  border-top-left-radius: 4px;
        -  border-bottom-right-radius: 0;
        -  border-bottom-left-radius: 0; }
        -
        -.navbar-btn {
        -  margin-top: 8px;
        -  margin-bottom: 8px; }
        -  .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
        -    margin-top: 10px;
        -    margin-bottom: 10px; }
        -  .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
        -    margin-top: 14px;
        -    margin-bottom: 14px; }
        -
        -.navbar-text {
        -  margin-top: 15px;
        -  margin-bottom: 15px; }
        -  @media (min-width: 768px) {
        -    .navbar-text {
        -      float: left;
        -      margin-left: 15px;
        -      margin-right: 15px; } }
        -
        -@media (min-width: 768px) {
        -  .navbar-left {
        -    float: left !important; }
        -  .navbar-right {
        -    float: right !important;
        -    margin-right: -15px; }
        -    .navbar-right ~ .navbar-right {
        -      margin-right: 0; } }
        -
        -.navbar-default {
        -  background-color: #f8f8f8;
        -  border-color: #e7e7e7; }
        -  .navbar-default .navbar-brand {
        -    color: #777; }
        -    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
        -      color: #5e5e5e;
        -      background-color: transparent; }
        -  .navbar-default .navbar-text {
        -    color: #777; }
        -  .navbar-default .navbar-nav > li > a {
        -    color: #777; }
        -    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
        -      color: #333;
        -      background-color: transparent; }
        -  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
        -    color: #555;
        -    background-color: #e7e7e7; }
        -  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {
        -    color: #ccc;
        -    background-color: transparent; }
        -  .navbar-default .navbar-toggle {
        -    border-color: #ddd; }
        -    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
        -      background-color: #ddd; }
        -    .navbar-default .navbar-toggle .icon-bar {
        -      background-color: #888; }
        -  .navbar-default .navbar-collapse,
        -  .navbar-default .navbar-form {
        -    border-color: #e7e7e7; }
        -  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
        -    background-color: #e7e7e7;
        -    color: #555; }
        -  @media (max-width: 767px) {
        -    .navbar-default .navbar-nav .open .dropdown-menu > li > a {
        -      color: #777; }
        -      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
        -        color: #333;
        -        background-color: transparent; }
        -    .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: #555;
        -      background-color: #e7e7e7; }
        -    .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: #ccc;
        -      background-color: transparent; } }
        -  .navbar-default .navbar-link {
        -    color: #777; }
        -    .navbar-default .navbar-link:hover {
        -      color: #333; }
        -  .navbar-default .btn-link {
        -    color: #777; }
        -    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
        -      color: #333; }
        -    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,
        -    fieldset[disabled] .navbar-default .btn-link:hover,
        -    fieldset[disabled] .navbar-default .btn-link:focus {
        -      color: #ccc; }
        -
        -.navbar-inverse {
        -  background-color: #222;
        -  border-color: #090909; }
        -  .navbar-inverse .navbar-brand {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
        -      color: #fff;
        -      background-color: transparent; }
        -  .navbar-inverse .navbar-text {
        -    color: #9d9d9d; }
        -  .navbar-inverse .navbar-nav > li > a {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {
        -      color: #fff;
        -      background-color: transparent; }
        -  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
        -    color: #fff;
        -    background-color: #090909; }
        -  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {
        -    color: #444;
        -    background-color: transparent; }
        -  .navbar-inverse .navbar-toggle {
        -    border-color: #333; }
        -    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
        -      background-color: #333; }
        -    .navbar-inverse .navbar-toggle .icon-bar {
        -      background-color: #fff; }
        -  .navbar-inverse .navbar-collapse,
        -  .navbar-inverse .navbar-form {
        -    border-color: #101010; }
        -  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {
        -    background-color: #090909;
        -    color: #fff; }
        -  @media (max-width: 767px) {
        -    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
        -      border-color: #090909; }
        -    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
        -      background-color: #090909; }
        -    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
        -      color: #9d9d9d; }
        -      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
        -        color: #fff;
        -        background-color: transparent; }
        -    .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: #090909; }
        -    .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: #444;
        -      background-color: transparent; } }
        -  .navbar-inverse .navbar-link {
        -    color: #9d9d9d; }
        -    .navbar-inverse .navbar-link:hover {
        -      color: #fff; }
        -  .navbar-inverse .btn-link {
        -    color: #9d9d9d; }
        -    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
        -      color: #fff; }
        -    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,
        -    fieldset[disabled] .navbar-inverse .btn-link:hover,
        -    fieldset[disabled] .navbar-inverse .btn-link:focus {
        -      color: #444; }
        -
        -.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 {
        -      content: "/ ";
        -      padding: 0 5px;
        -      color: #ccc; }
        -  .breadcrumb > .active {
        -    color: #777777; }
        -
        -.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: 6px 12px;
        -      line-height: 1.428571429;
        -      text-decoration: none;
        -      color: #337ab7;
        -      background-color: #fff;
        -      border: 1px solid #ddd;
        -      margin-left: -1px; }
        -    .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-bottom-right-radius: 4px;
        -      border-top-right-radius: 4px; }
        -  .pagination > li > a:hover, .pagination > li > a:focus,
        -  .pagination > li > span:hover,
        -  .pagination > li > span:focus {
        -    z-index: 2;
        -    color: #23527c;
        -    background-color: #eeeeee;
        -    border-color: #ddd; }
        -  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,
        -  .pagination > .active > span,
        -  .pagination > .active > span:hover,
        -  .pagination > .active > span:focus {
        -    z-index: 3;
        -    color: #fff;
        -    background-color: #337ab7;
        -    border-color: #337ab7;
        -    cursor: default; }
        -  .pagination > .disabled > span,
        -  .pagination > .disabled > span:hover,
        -  .pagination > .disabled > span:focus,
        -  .pagination > .disabled > a,
        -  .pagination > .disabled > a:hover,
        -  .pagination > .disabled > a:focus {
        -    color: #777777;
        -    background-color: #fff;
        -    border-color: #ddd;
        -    cursor: not-allowed; }
        -
        -.pagination-lg > li > a,
        -.pagination-lg > li > span {
        -  padding: 10px 16px;
        -  font-size: 18px;
        -  line-height: 1.3333333; }
        -
        -.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-bottom-right-radius: 6px;
        -  border-top-right-radius: 6px; }
        -
        -.pagination-sm > li > a,
        -.pagination-sm > li > span {
        -  padding: 5px 10px;
        -  font-size: 12px;
        -  line-height: 1.5; }
        -
        -.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-bottom-right-radius: 3px;
        -  border-top-right-radius: 3px; }
        -
        -.pager {
        -  padding-left: 0;
        -  margin: 20px 0;
        -  list-style: none;
        -  text-align: center; }
        -  .pager:before, .pager:after {
        -    content: " ";
        -    display: table; }
        -  .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: #eeeeee; }
        -  .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: #777777;
        -    background-color: #fff;
        -    cursor: not-allowed; }
        -
        -.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:empty {
        -    display: none; }
        -  .btn .label {
        -    position: relative;
        -    top: -1px; }
        -
        -a.label:hover, a.label:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  cursor: pointer; }
        -
        -.label-default {
        -  background-color: #777777; }
        -  .label-default[href]:hover, .label-default[href]:focus {
        -    background-color: #5e5e5e; }
        -
        -.label-primary {
        -  background-color: #337ab7; }
        -  .label-primary[href]:hover, .label-primary[href]:focus {
        -    background-color: #286090; }
        -
        -.label-success {
        -  background-color: #5cb85c; }
        -  .label-success[href]:hover, .label-success[href]:focus {
        -    background-color: #449d44; }
        -
        -.label-info {
        -  background-color: #5bc0de; }
        -  .label-info[href]:hover, .label-info[href]:focus {
        -    background-color: #31b0d5; }
        -
        -.label-warning {
        -  background-color: #f0ad4e; }
        -  .label-warning[href]:hover, .label-warning[href]:focus {
        -    background-color: #ec971f; }
        -
        -.label-danger {
        -  background-color: #d9534f; }
        -  .label-danger[href]:hover, .label-danger[href]:focus {
        -    background-color: #c9302c; }
        -
        -.badge {
        -  display: inline-block;
        -  min-width: 10px;
        -  padding: 3px 7px;
        -  font-size: 12px;
        -  font-weight: bold;
        -  color: #fff;
        -  line-height: 1;
        -  vertical-align: middle;
        -  white-space: nowrap;
        -  text-align: center;
        -  background-color: #777777;
        -  border-radius: 10px; }
        -  .badge:empty {
        -    display: none; }
        -  .btn .badge {
        -    position: relative;
        -    top: -1px; }
        -  .btn-xs .badge, .btn-group-xs > .btn .badge,
        -  .btn-group-xs > .btn .badge {
        -    top: 0;
        -    padding: 1px 5px; }
        -  .list-group-item.active > .badge,
        -  .nav-pills > .active > a > .badge {
        -    color: #337ab7;
        -    background-color: #fff; }
        -  .list-group-item > .badge {
        -    float: right; }
        -  .list-group-item > .badge + .badge {
        -    margin-right: 5px; }
        -  .nav-pills > li > a > .badge {
        -    margin-left: 3px; }
        -
        -a.badge:hover, a.badge:focus {
        -  color: #fff;
        -  text-decoration: none;
        -  cursor: pointer; }
        -
        -.jumbotron {
        -  padding-top: 30px;
        -  padding-bottom: 30px;
        -  margin-bottom: 30px;
        -  color: inherit;
        -  background-color: #eeeeee; }
        -  .jumbotron h1,
        -  .jumbotron .h1 {
        -    color: inherit; }
        -  .jumbotron p {
        -    margin-bottom: 15px;
        -    font-size: 21px;
        -    font-weight: 200; }
        -  .jumbotron > hr {
        -    border-top-color: #d5d5d5; }
        -  .container .jumbotron,
        -  .container-fluid .jumbotron {
        -    border-radius: 6px;
        -    padding-left: 15px;
        -    padding-right: 15px; }
        -  .jumbotron .container {
        -    max-width: 100%; }
        -  @media screen and (min-width: 768px) {
        -    .jumbotron {
        -      padding-top: 48px;
        -      padding-bottom: 48px; }
        -      .container .jumbotron,
        -      .container-fluid .jumbotron {
        -        padding-left: 60px;
        -        padding-right: 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;
        -  transition: border 0.2s ease-in-out; }
        -  .thumbnail > img,
        -  .thumbnail a > img {
        -    display: block;
        -    max-width: 100%;
        -    height: auto;
        -    margin-left: auto;
        -    margin-right: auto; }
        -  .thumbnail .caption {
        -    padding: 9px;
        -    color: #333333; }
        -
        -a.thumbnail:hover,
        -a.thumbnail:focus,
        -a.thumbnail.active {
        -  border-color: #337ab7; }
        -
        -.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,
        -.alert-dismissible {
        -  padding-right: 35px; }
        -  .alert-dismissable .close,
        -  .alert-dismissible .close {
        -    position: relative;
        -    top: -2px;
        -    right: -21px;
        -    color: inherit; }
        -
        -.alert-success {
        -  background-color: #dff0d8;
        -  border-color: #d6e9c6;
        -  color: #3c763d; }
        -  .alert-success hr {
        -    border-top-color: #c9e2b3; }
        -  .alert-success .alert-link {
        -    color: #2b542c; }
        -
        -.alert-info {
        -  background-color: #d9edf7;
        -  border-color: #bce8f1;
        -  color: #31708f; }
        -  .alert-info hr {
        -    border-top-color: #a6e1ec; }
        -  .alert-info .alert-link {
        -    color: #245269; }
        -
        -.alert-warning {
        -  background-color: #fcf8e3;
        -  border-color: #faebcc;
        -  color: #8a6d3b; }
        -  .alert-warning hr {
        -    border-top-color: #f7e1b5; }
        -  .alert-warning .alert-link {
        -    color: #66512c; }
        -
        -.alert-danger {
        -  background-color: #f2dede;
        -  border-color: #ebccd1;
        -  color: #a94442; }
        -  .alert-danger hr {
        -    border-top-color: #e4b9c0; }
        -  .alert-danger .alert-link {
        -    color: #843534; }
        -
        -@-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 {
        -  overflow: hidden;
        -  height: 20px;
        -  margin-bottom: 20px;
        -  background-color: #f5f5f5;
        -  border-radius: 4px;
        -  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: #337ab7;
        -  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
        -  transition: width 0.6s ease; }
        -
        -.progress-striped .progress-bar,
        -.progress-bar-striped {
        -  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,
        -.progress-bar.active {
        -  -webkit-animation: progress-bar-stripes 2s linear infinite;
        -  animation: progress-bar-stripes 2s linear infinite; }
        -
        -.progress-bar-success {
        -  background-color: #5cb85c; }
        -  .progress-striped .progress-bar-success {
        -    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: #5bc0de; }
        -  .progress-striped .progress-bar-info {
        -    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: #f0ad4e; }
        -  .progress-striped .progress-bar-warning {
        -    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: #d9534f; }
        -  .progress-striped .progress-bar-danger {
        -    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 {
        -  margin-top: 15px; }
        -  .media:first-child {
        -    margin-top: 0; }
        -
        -.media,
        -.media-body {
        -  zoom: 1;
        -  overflow: hidden; }
        -
        -.media-body {
        -  width: 10000px; }
        -
        -.media-object {
        -  display: block; }
        -  .media-object.img-thumbnail {
        -    max-width: none; }
        -
        -.media-right,
        -.media > .pull-right {
        -  padding-left: 10px; }
        -
        -.media-left,
        -.media > .pull-left {
        -  padding-right: 10px; }
        -
        -.media-left,
        -.media-right,
        -.media-body {
        -  display: table-cell;
        -  vertical-align: top; }
        -
        -.media-middle {
        -  vertical-align: middle; }
        -
        -.media-bottom {
        -  vertical-align: bottom; }
        -
        -.media-heading {
        -  margin-top: 0;
        -  margin-bottom: 5px; }
        -
        -.media-list {
        -  padding-left: 0;
        -  list-style: none; }
        -
        -.list-group {
        -  margin-bottom: 20px;
        -  padding-left: 0; }
        -
        -.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; }
        -
        -a.list-group-item,
        -button.list-group-item {
        -  color: #555; }
        -  a.list-group-item .list-group-item-heading,
        -  button.list-group-item .list-group-item-heading {
        -    color: #333; }
        -  a.list-group-item:hover, a.list-group-item:focus,
        -  button.list-group-item:hover,
        -  button.list-group-item:focus {
        -    text-decoration: none;
        -    color: #555;
        -    background-color: #f5f5f5; }
        -
        -button.list-group-item {
        -  width: 100%;
        -  text-align: left; }
        -
        -.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
        -  background-color: #eeeeee;
        -  color: #777777;
        -  cursor: not-allowed; }
        -  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {
        -    color: inherit; }
        -  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {
        -    color: #777777; }
        -
        -.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
        -  z-index: 2;
        -  color: #fff;
        -  background-color: #337ab7;
        -  border-color: #337ab7; }
        -  .list-group-item.active .list-group-item-heading,
        -  .list-group-item.active .list-group-item-heading > small,
        -  .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,
        -  .list-group-item.active:hover .list-group-item-heading > small,
        -  .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,
        -  .list-group-item.active:focus .list-group-item-heading > small,
        -  .list-group-item.active:focus .list-group-item-heading > .small {
        -    color: inherit; }
        -  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {
        -    color: #c7ddef; }
        -
        -.list-group-item-success {
        -  color: #3c763d;
        -  background-color: #dff0d8; }
        -
        -a.list-group-item-success,
        -button.list-group-item-success {
        -  color: #3c763d; }
        -  a.list-group-item-success .list-group-item-heading,
        -  button.list-group-item-success .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-success:hover, a.list-group-item-success:focus,
        -  button.list-group-item-success:hover,
        -  button.list-group-item-success:focus {
        -    color: #3c763d;
        -    background-color: #d0e9c6; }
        -  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,
        -  button.list-group-item-success.active,
        -  button.list-group-item-success.active:hover,
        -  button.list-group-item-success.active:focus {
        -    color: #fff;
        -    background-color: #3c763d;
        -    border-color: #3c763d; }
        -
        -.list-group-item-info {
        -  color: #31708f;
        -  background-color: #d9edf7; }
        -
        -a.list-group-item-info,
        -button.list-group-item-info {
        -  color: #31708f; }
        -  a.list-group-item-info .list-group-item-heading,
        -  button.list-group-item-info .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-info:hover, a.list-group-item-info:focus,
        -  button.list-group-item-info:hover,
        -  button.list-group-item-info:focus {
        -    color: #31708f;
        -    background-color: #c4e3f3; }
        -  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,
        -  button.list-group-item-info.active,
        -  button.list-group-item-info.active:hover,
        -  button.list-group-item-info.active:focus {
        -    color: #fff;
        -    background-color: #31708f;
        -    border-color: #31708f; }
        -
        -.list-group-item-warning {
        -  color: #8a6d3b;
        -  background-color: #fcf8e3; }
        -
        -a.list-group-item-warning,
        -button.list-group-item-warning {
        -  color: #8a6d3b; }
        -  a.list-group-item-warning .list-group-item-heading,
        -  button.list-group-item-warning .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-warning:hover, a.list-group-item-warning:focus,
        -  button.list-group-item-warning:hover,
        -  button.list-group-item-warning:focus {
        -    color: #8a6d3b;
        -    background-color: #faf2cc; }
        -  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,
        -  button.list-group-item-warning.active,
        -  button.list-group-item-warning.active:hover,
        -  button.list-group-item-warning.active:focus {
        -    color: #fff;
        -    background-color: #8a6d3b;
        -    border-color: #8a6d3b; }
        -
        -.list-group-item-danger {
        -  color: #a94442;
        -  background-color: #f2dede; }
        -
        -a.list-group-item-danger,
        -button.list-group-item-danger {
        -  color: #a94442; }
        -  a.list-group-item-danger .list-group-item-heading,
        -  button.list-group-item-danger .list-group-item-heading {
        -    color: inherit; }
        -  a.list-group-item-danger:hover, a.list-group-item-danger:focus,
        -  button.list-group-item-danger:hover,
        -  button.list-group-item-danger:focus {
        -    color: #a94442;
        -    background-color: #ebcccc; }
        -  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,
        -  button.list-group-item-danger.active,
        -  button.list-group-item-danger.active:hover,
        -  button.list-group-item-danger.active:focus {
        -    color: #fff;
        -    background-color: #a94442;
        -    border-color: #a94442; }
        -
        -.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;
        -  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }
        -
        -.panel-body {
        -  padding: 15px; }
        -  .panel-body:before, .panel-body:after {
        -    content: " ";
        -    display: table; }
        -  .panel-body:after {
        -    clear: both; }
        -
        -.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,
        -  .panel-title > small,
        -  .panel-title > .small,
        -  .panel-title > small > a,
        -  .panel-title > .small > 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 > .list-group,
        -.panel > .panel-collapse > .list-group {
        -  margin-bottom: 0; }
        -  .panel > .list-group .list-group-item,
        -  .panel > .panel-collapse > .list-group .list-group-item {
        -    border-width: 1px 0;
        -    border-radius: 0; }
        -  .panel > .list-group:first-child .list-group-item:first-child,
        -  .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
        -    border-top: 0;
        -    border-top-right-radius: 3px;
        -    border-top-left-radius: 3px; }
        -  .panel > .list-group:last-child .list-group-item:last-child,
        -  .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
        -    border-bottom: 0;
        -    border-bottom-right-radius: 3px;
        -    border-bottom-left-radius: 3px; }
        -
        -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
        -  border-top-right-radius: 0;
        -  border-top-left-radius: 0; }
        -
        -.panel-heading + .list-group .list-group-item:first-child {
        -  border-top-width: 0; }
        -
        -.list-group + .panel-footer {
        -  border-top-width: 0; }
        -
        -.panel > .table,
        -.panel > .table-responsive > .table,
        -.panel > .panel-collapse > .table {
        -  margin-bottom: 0; }
        -  .panel > .table caption,
        -  .panel > .table-responsive > .table caption,
        -  .panel > .panel-collapse > .table caption {
        -    padding-left: 15px;
        -    padding-right: 15px; }
        -
        -.panel > .table:first-child,
        -.panel > .table-responsive:first-child > .table:first-child {
        -  border-top-right-radius: 3px;
        -  border-top-left-radius: 3px; }
        -  .panel > .table:first-child > thead:first-child > tr:first-child,
        -  .panel > .table:first-child > tbody:first-child > tr:first-child,
        -  .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
        -  .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
        -    border-top-left-radius: 3px;
        -    border-top-right-radius: 3px; }
        -    .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
        -    .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
        -      border-top-left-radius: 3px; }
        -    .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
        -    .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
        -    .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
        -    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
        -      border-top-right-radius: 3px; }
        -
        -.panel > .table:last-child,
        -.panel > .table-responsive:last-child > .table:last-child {
        -  border-bottom-right-radius: 3px;
        -  border-bottom-left-radius: 3px; }
        -  .panel > .table:last-child > tbody:last-child > tr:last-child,
        -  .panel > .table:last-child > tfoot:last-child > tr:last-child,
        -  .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
        -  .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
        -    border-bottom-left-radius: 3px;
        -    border-bottom-right-radius: 3px; }
        -    .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
        -    .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
        -      border-bottom-left-radius: 3px; }
        -    .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
        -    .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
        -    .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
        -    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
        -      border-bottom-right-radius: 3px; }
        -
        -.panel > .panel-body + .table,
        -.panel > .panel-body + .table-responsive,
        -.panel > .table + .panel-body,
        -.panel > .table-responsive + .panel-body {
        -  border-top: 1px solid #ddd; }
        -
        -.panel > .table > tbody:first-child > tr:first-child th,
        -.panel > .table > tbody:first-child > tr: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-bordered > thead > tr > td:first-child,
        -  .panel > .table-bordered > tbody > tr > th:first-child,
        -  .panel > .table-bordered > tbody > tr > td:first-child,
        -  .panel > .table-bordered > tfoot > tr > th:first-child,
        -  .panel > .table-bordered > tfoot > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr > td:last-child,
        -  .panel > .table-bordered > tbody > tr > th:last-child,
        -  .panel > .table-bordered > tbody > tr > td:last-child,
        -  .panel > .table-bordered > tfoot > tr > th:last-child,
        -  .panel > .table-bordered > tfoot > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
        -    border-right: 0; }
        -  .panel > .table-bordered > thead > tr:first-child > td,
        -  .panel > .table-bordered > thead > tr:first-child > th,
        -  .panel > .table-bordered > tbody > tr:first-child > td,
        -  .panel > .table-bordered > tbody > tr:first-child > th,
        -  .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
        -  .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
        -    border-bottom: 0; }
        -  .panel > .table-bordered > tbody > tr:last-child > td,
        -  .panel > .table-bordered > tbody > tr:last-child > th,
        -  .panel > .table-bordered > tfoot > tr:last-child > td,
        -  .panel > .table-bordered > tfoot > tr:last-child > th,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
        -  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
        -  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
        -    border-bottom: 0; }
        -
        -.panel > .table-responsive {
        -  border: 0;
        -  margin-bottom: 0; }
        -
        -.panel-group {
        -  margin-bottom: 20px; }
        -  .panel-group .panel {
        -    margin-bottom: 0;
        -    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,
        -    .panel-group .panel-heading + .panel-collapse > .list-group {
        -      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: #333333;
        -    background-color: #f5f5f5;
        -    border-color: #ddd; }
        -    .panel-default > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #ddd; }
        -    .panel-default > .panel-heading .badge {
        -      color: #f5f5f5;
        -      background-color: #333333; }
        -  .panel-default > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #ddd; }
        -
        -.panel-primary {
        -  border-color: #337ab7; }
        -  .panel-primary > .panel-heading {
        -    color: #fff;
        -    background-color: #337ab7;
        -    border-color: #337ab7; }
        -    .panel-primary > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #337ab7; }
        -    .panel-primary > .panel-heading .badge {
        -      color: #337ab7;
        -      background-color: #fff; }
        -  .panel-primary > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #337ab7; }
        -
        -.panel-success {
        -  border-color: #d6e9c6; }
        -  .panel-success > .panel-heading {
        -    color: #3c763d;
        -    background-color: #dff0d8;
        -    border-color: #d6e9c6; }
        -    .panel-success > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #d6e9c6; }
        -    .panel-success > .panel-heading .badge {
        -      color: #dff0d8;
        -      background-color: #3c763d; }
        -  .panel-success > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #d6e9c6; }
        -
        -.panel-info {
        -  border-color: #bce8f1; }
        -  .panel-info > .panel-heading {
        -    color: #31708f;
        -    background-color: #d9edf7;
        -    border-color: #bce8f1; }
        -    .panel-info > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #bce8f1; }
        -    .panel-info > .panel-heading .badge {
        -      color: #d9edf7;
        -      background-color: #31708f; }
        -  .panel-info > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #bce8f1; }
        -
        -.panel-warning {
        -  border-color: #faebcc; }
        -  .panel-warning > .panel-heading {
        -    color: #8a6d3b;
        -    background-color: #fcf8e3;
        -    border-color: #faebcc; }
        -    .panel-warning > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #faebcc; }
        -    .panel-warning > .panel-heading .badge {
        -      color: #fcf8e3;
        -      background-color: #8a6d3b; }
        -  .panel-warning > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #faebcc; }
        -
        -.panel-danger {
        -  border-color: #ebccd1; }
        -  .panel-danger > .panel-heading {
        -    color: #a94442;
        -    background-color: #f2dede;
        -    border-color: #ebccd1; }
        -    .panel-danger > .panel-heading + .panel-collapse > .panel-body {
        -      border-top-color: #ebccd1; }
        -    .panel-danger > .panel-heading .badge {
        -      color: #f2dede;
        -      background-color: #a94442; }
        -  .panel-danger > .panel-footer + .panel-collapse > .panel-body {
        -    border-bottom-color: #ebccd1; }
        -
        -.embed-responsive {
        -  position: relative;
        -  display: block;
        -  height: 0;
        -  padding: 0;
        -  overflow: hidden; }
        -  .embed-responsive .embed-responsive-item,
        -  .embed-responsive iframe,
        -  .embed-responsive embed,
        -  .embed-responsive object,
        -  .embed-responsive video {
        -    position: absolute;
        -    top: 0;
        -    left: 0;
        -    bottom: 0;
        -    height: 100%;
        -    width: 100%;
        -    border: 0; }
        -
        -.embed-responsive-16by9 {
        -  padding-bottom: 56.25%; }
        -
        -.embed-responsive-4by3 {
        -  padding-bottom: 75%; }
        -
        -.well {
        -  min-height: 20px;
        -  padding: 19px;
        -  margin-bottom: 20px;
        -  background-color: #f5f5f5;
        -  border: 1px solid #e3e3e3;
        -  border-radius: 4px;
        -  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: 0.2;
        -  filter: alpha(opacity=20); }
        -  .close:hover, .close:focus {
        -    color: #000;
        -    text-decoration: none;
        -    cursor: pointer;
        -    opacity: 0.5;
        -    filter: alpha(opacity=50); }
        -
        -button.close {
        -  padding: 0;
        -  cursor: pointer;
        -  background: transparent;
        -  border: 0;
        -  -webkit-appearance: none; }
        -
        -.modal-open {
        -  overflow: hidden; }
        -
        -.modal {
        -  display: none;
        -  overflow: hidden;
        -  position: fixed;
        -  top: 0;
        -  right: 0;
        -  bottom: 0;
        -  left: 0;
        -  z-index: 1050;
        -  -webkit-overflow-scrolling: touch;
        -  outline: 0; }
        -  .modal.fade .modal-dialog {
        -    -webkit-transform: translate(0, -25%);
        -    transform: translate(0, -25%);
        -    transition: -webkit-transform 0.3s ease-out;
        -    transition: transform 0.3s ease-out; }
        -  .modal.in .modal-dialog {
        -    -webkit-transform: translate(0, 0);
        -    transform: translate(0, 0); }
        -
        -.modal-open .modal {
        -  overflow-x: hidden;
        -  overflow-y: auto; }
        -
        -.modal-dialog {
        -  position: relative;
        -  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;
        -  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
        -  background-clip: padding-box;
        -  outline: 0; }
        -
        -.modal-backdrop {
        -  position: fixed;
        -  top: 0;
        -  right: 0;
        -  bottom: 0;
        -  left: 0;
        -  z-index: 1040;
        -  background-color: #000; }
        -  .modal-backdrop.fade {
        -    opacity: 0;
        -    filter: alpha(opacity=0); }
        -  .modal-backdrop.in {
        -    opacity: 0.5;
        -    filter: alpha(opacity=50); }
        -
        -.modal-header {
        -  padding: 15px;
        -  border-bottom: 1px solid #e5e5e5; }
        -  .modal-header:before, .modal-header:after {
        -    content: " ";
        -    display: table; }
        -  .modal-header:after {
        -    clear: both; }
        -
        -.modal-header .close {
        -  margin-top: -2px; }
        -
        -.modal-title {
        -  margin: 0;
        -  line-height: 1.428571429; }
        -
        -.modal-body {
        -  position: relative;
        -  padding: 15px; }
        -
        -.modal-footer {
        -  padding: 15px;
        -  text-align: right;
        -  border-top: 1px solid #e5e5e5; }
        -  .modal-footer:before, .modal-footer:after {
        -    content: " ";
        -    display: table; }
        -  .modal-footer:after {
        -    clear: both; }
        -  .modal-footer .btn + .btn {
        -    margin-left: 5px;
        -    margin-bottom: 0; }
        -  .modal-footer .btn-group .btn + .btn {
        -    margin-left: -1px; }
        -  .modal-footer .btn-block + .btn-block {
        -    margin-left: 0; }
        -
        -.modal-scrollbar-measure {
        -  position: absolute;
        -  top: -9999px;
        -  width: 50px;
        -  height: 50px;
        -  overflow: scroll; }
        -
        -@media (min-width: 768px) {
        -  .modal-dialog {
        -    width: 600px;
        -    margin: 30px auto; }
        -  .modal-content {
        -    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }
        -  .modal-sm {
        -    width: 300px; } }
        -
        -@media (min-width: 992px) {
        -  .modal-lg {
        -    width: 900px; } }
        -
        -.tooltip {
        -  position: absolute;
        -  z-index: 1070;
        -  display: block;
        -  font-family: "Lato", sans-serif;
        -  font-style: normal;
        -  font-weight: normal;
        -  letter-spacing: normal;
        -  line-break: auto;
        -  line-height: 1.428571429;
        -  text-align: left;
        -  text-align: start;
        -  text-decoration: none;
        -  text-shadow: none;
        -  text-transform: none;
        -  white-space: normal;
        -  word-break: normal;
        -  word-spacing: normal;
        -  word-wrap: normal;
        -  font-size: 12px;
        -  opacity: 0;
        -  filter: alpha(opacity=0); }
        -  .tooltip.in {
        -    opacity: 0.9;
        -    filter: alpha(opacity=90); }
        -  .tooltip.top {
        -    margin-top: -3px;
        -    padding: 5px 0; }
        -  .tooltip.right {
        -    margin-left: 3px;
        -    padding: 0 5px; }
        -  .tooltip.bottom {
        -    margin-top: 3px;
        -    padding: 5px 0; }
        -  .tooltip.left {
        -    margin-left: -3px;
        -    padding: 0 5px; }
        -
        -.tooltip-inner {
        -  max-width: 200px;
        -  padding: 3px 8px;
        -  color: #fff;
        -  text-align: center;
        -  background-color: #000;
        -  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-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.top-left .tooltip-arrow {
        -  bottom: 0;
        -  right: 5px;
        -  margin-bottom: -5px;
        -  border-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.top-right .tooltip-arrow {
        -  bottom: 0;
        -  left: 5px;
        -  margin-bottom: -5px;
        -  border-width: 5px 5px 0;
        -  border-top-color: #000; }
        -
        -.tooltip.right .tooltip-arrow {
        -  top: 50%;
        -  left: 0;
        -  margin-top: -5px;
        -  border-width: 5px 5px 5px 0;
        -  border-right-color: #000; }
        -
        -.tooltip.left .tooltip-arrow {
        -  top: 50%;
        -  right: 0;
        -  margin-top: -5px;
        -  border-width: 5px 0 5px 5px;
        -  border-left-color: #000; }
        -
        -.tooltip.bottom .tooltip-arrow {
        -  top: 0;
        -  left: 50%;
        -  margin-left: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.tooltip.bottom-left .tooltip-arrow {
        -  top: 0;
        -  right: 5px;
        -  margin-top: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.tooltip.bottom-right .tooltip-arrow {
        -  top: 0;
        -  left: 5px;
        -  margin-top: -5px;
        -  border-width: 0 5px 5px;
        -  border-bottom-color: #000; }
        -
        -.popover {
        -  position: absolute;
        -  top: 0;
        -  left: 0;
        -  z-index: 1060;
        -  display: none;
        -  max-width: 276px;
        -  padding: 1px;
        -  font-family: "Lato", sans-serif;
        -  font-style: normal;
        -  font-weight: normal;
        -  letter-spacing: normal;
        -  line-break: auto;
        -  line-height: 1.428571429;
        -  text-align: left;
        -  text-align: start;
        -  text-decoration: none;
        -  text-shadow: none;
        -  text-transform: none;
        -  white-space: normal;
        -  word-break: normal;
        -  word-spacing: normal;
        -  word-wrap: normal;
        -  font-size: 14px;
        -  background-color: #fff;
        -  background-clip: padding-box;
        -  border: 1px solid #ccc;
        -  border: 1px solid rgba(0, 0, 0, 0.2);
        -  border-radius: 6px;
        -  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }
        -  .popover.top {
        -    margin-top: -10px; }
        -  .popover.right {
        -    margin-left: 10px; }
        -  .popover.bottom {
        -    margin-top: 10px; }
        -  .popover.left {
        -    margin-left: -10px; }
        -
        -.popover-title {
        -  margin: 0;
        -  padding: 8px 14px;
        -  font-size: 14px;
        -  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 {
        -  left: 50%;
        -  margin-left: -11px;
        -  border-bottom-width: 0;
        -  border-top-color: #999999;
        -  border-top-color: rgba(0, 0, 0, 0.25);
        -  bottom: -11px; }
        -  .popover.top > .arrow:after {
        -    content: " ";
        -    bottom: 1px;
        -    margin-left: -10px;
        -    border-bottom-width: 0;
        -    border-top-color: #fff; }
        -
        -.popover.right > .arrow {
        -  top: 50%;
        -  left: -11px;
        -  margin-top: -11px;
        -  border-left-width: 0;
        -  border-right-color: #999999;
        -  border-right-color: rgba(0, 0, 0, 0.25); }
        -  .popover.right > .arrow:after {
        -    content: " ";
        -    left: 1px;
        -    bottom: -10px;
        -    border-left-width: 0;
        -    border-right-color: #fff; }
        -
        -.popover.bottom > .arrow {
        -  left: 50%;
        -  margin-left: -11px;
        -  border-top-width: 0;
        -  border-bottom-color: #999999;
        -  border-bottom-color: rgba(0, 0, 0, 0.25);
        -  top: -11px; }
        -  .popover.bottom > .arrow:after {
        -    content: " ";
        -    top: 1px;
        -    margin-left: -10px;
        -    border-top-width: 0;
        -    border-bottom-color: #fff; }
        -
        -.popover.left > .arrow {
        -  top: 50%;
        -  right: -11px;
        -  margin-top: -11px;
        -  border-right-width: 0;
        -  border-left-color: #999999;
        -  border-left-color: rgba(0, 0, 0, 0.25); }
        -  .popover.left > .arrow:after {
        -    content: " ";
        -    right: 1px;
        -    border-right-width: 0;
        -    border-left-color: #fff;
        -    bottom: -10px; }
        -
        -.carousel {
        -  position: relative; }
        -
        -.carousel-inner {
        -  position: relative;
        -  overflow: hidden;
        -  width: 100%; }
        -  .carousel-inner > .item {
        -    display: none;
        -    position: relative;
        -    transition: 0.6s ease-in-out left; }
        -    .carousel-inner > .item > img,
        -    .carousel-inner > .item > a > img {
        -      display: block;
        -      max-width: 100%;
        -      height: auto;
        -      line-height: 1; }
        -    @media all and (transform-3d), (-webkit-transform-3d) {
        -      .carousel-inner > .item {
        -        transition: -webkit-transform 0.6s ease-in-out;
        -        transition: transform 0.6s ease-in-out;
        -        -webkit-backface-visibility: hidden;
        -        backface-visibility: hidden;
        -        -webkit-perspective: 1000px;
        -        perspective: 1000px; }
        -        .carousel-inner > .item.next, .carousel-inner > .item.active.right {
        -          -webkit-transform: translate3d(100%, 0, 0);
        -          transform: translate3d(100%, 0, 0);
        -          left: 0; }
        -        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {
        -          -webkit-transform: translate3d(-100%, 0, 0);
        -          transform: translate3d(-100%, 0, 0);
        -          left: 0; }
        -        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {
        -          -webkit-transform: translate3d(0, 0, 0);
        -          transform: translate3d(0, 0, 0);
        -          left: 0; } }
        -  .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;
        -  left: 0;
        -  bottom: 0;
        -  width: 15%;
        -  opacity: 0.5;
        -  filter: alpha(opacity=50);
        -  font-size: 20px;
        -  color: #fff;
        -  text-align: center;
        -  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
        -  background-color: transparent; }
        -  .carousel-control.left {
        -    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 {
        -    left: auto;
        -    right: 0;
        -    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 {
        -    outline: 0;
        -    color: #fff;
        -    text-decoration: none;
        -    opacity: 0.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%;
        -    margin-top: -10px;
        -    z-index: 5;
        -    display: inline-block; }
        -  .carousel-control .icon-prev,
        -  .carousel-control .glyphicon-chevron-left {
        -    left: 50%;
        -    margin-left: -10px; }
        -  .carousel-control .icon-next,
        -  .carousel-control .glyphicon-chevron-right {
        -    right: 50%;
        -    margin-right: -10px; }
        -  .carousel-control .icon-prev,
        -  .carousel-control .icon-next {
        -    width: 20px;
        -    height: 20px;
        -    line-height: 1;
        -    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%;
        -  margin-left: -30%;
        -  padding-left: 0;
        -  list-style: none;
        -  text-align: center; }
        -  .carousel-indicators li {
        -    display: inline-block;
        -    width: 10px;
        -    height: 10px;
        -    margin: 1px;
        -    text-indent: -999px;
        -    border: 1px solid #fff;
        -    border-radius: 10px;
        -    cursor: pointer;
        -    background-color: #000 \9;
        -    background-color: transparent; }
        -  .carousel-indicators .active {
        -    margin: 0;
        -    width: 12px;
        -    height: 12px;
        -    background-color: #fff; }
        -
        -.carousel-caption {
        -  position: absolute;
        -  left: 15%;
        -  right: 15%;
        -  bottom: 20px;
        -  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 .glyphicon-chevron-left,
        -  .carousel-control .glyphicon-chevron-right,
        -  .carousel-control .icon-prev,
        -  .carousel-control .icon-next {
        -    width: 30px;
        -    height: 30px;
        -    margin-top: -10px;
        -    font-size: 30px; }
        -  .carousel-control .glyphicon-chevron-left,
        -  .carousel-control .icon-prev {
        -    margin-left: -10px; }
        -  .carousel-control .glyphicon-chevron-right,
        -  .carousel-control .icon-next {
        -    margin-right: -10px; }
        -  .carousel-caption {
        -    left: 20%;
        -    right: 20%;
        -    padding-bottom: 30px; }
        -  .carousel-indicators {
        -    bottom: 20px; } }
        -
        -.clearfix:before, .clearfix:after {
        -  content: " ";
        -  display: table; }
        -
        -.clearfix:after {
        -  clear: both; }
        -
        -.center-block {
        -  display: block;
        -  margin-left: auto;
        -  margin-right: 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; }
        -
        -.affix {
        -  position: fixed; }
        -
        -@-ms-viewport {
        -  width: device-width; }
        -
        -.visible-xs {
        -  display: none !important; }
        -
        -.visible-sm {
        -  display: none !important; }
        -
        -.visible-md {
        -  display: none !important; }
        -
        -.visible-lg {
        -  display: none !important; }
        -
        -.visible-xs-block,
        -.visible-xs-inline,
        -.visible-xs-inline-block,
        -.visible-sm-block,
        -.visible-sm-inline,
        -.visible-sm-inline-block,
        -.visible-md-block,
        -.visible-md-inline,
        -.visible-md-inline-block,
        -.visible-lg-block,
        -.visible-lg-inline,
        -.visible-lg-inline-block {
        -  display: none !important; }
        -
        -@media (max-width: 767px) {
        -  .visible-xs {
        -    display: block !important; }
        -  table.visible-xs {
        -    display: table !important; }
        -  tr.visible-xs {
        -    display: table-row !important; }
        -  th.visible-xs,
        -  td.visible-xs {
        -    display: table-cell !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-block {
        -    display: block !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-inline {
        -    display: inline !important; } }
        -
        -@media (max-width: 767px) {
        -  .visible-xs-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm {
        -    display: block !important; }
        -  table.visible-sm {
        -    display: table !important; }
        -  tr.visible-sm {
        -    display: table-row !important; }
        -  th.visible-sm,
        -  td.visible-sm {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-block {
        -    display: block !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .visible-sm-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md {
        -    display: block !important; }
        -  table.visible-md {
        -    display: table !important; }
        -  tr.visible-md {
        -    display: table-row !important; }
        -  th.visible-md,
        -  td.visible-md {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-block {
        -    display: block !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .visible-md-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg {
        -    display: block !important; }
        -  table.visible-lg {
        -    display: table !important; }
        -  tr.visible-lg {
        -    display: table-row !important; }
        -  th.visible-lg,
        -  td.visible-lg {
        -    display: table-cell !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-block {
        -    display: block !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-inline {
        -    display: inline !important; } }
        -
        -@media (min-width: 1200px) {
        -  .visible-lg-inline-block {
        -    display: inline-block !important; } }
        -
        -@media (max-width: 767px) {
        -  .hidden-xs {
        -    display: none !important; } }
        -
        -@media (min-width: 768px) and (max-width: 991px) {
        -  .hidden-sm {
        -    display: none !important; } }
        -
        -@media (min-width: 992px) and (max-width: 1199px) {
        -  .hidden-md {
        -    display: none !important; } }
        -
        -@media (min-width: 1200px) {
        -  .hidden-lg {
        -    display: none !important; } }
        -
        -.visible-print {
        -  display: none !important; }
        -
        -@media print {
        -  .visible-print {
        -    display: block !important; }
        -  table.visible-print {
        -    display: table !important; }
        -  tr.visible-print {
        -    display: table-row !important; }
        -  th.visible-print,
        -  td.visible-print {
        -    display: table-cell !important; } }
        -
        -.visible-print-block {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-block {
        -      display: block !important; } }
        -
        -.visible-print-inline {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-inline {
        -      display: inline !important; } }
        -
        -.visible-print-inline-block {
        -  display: none !important; }
        -  @media print {
        -    .visible-print-inline-block {
        -      display: inline-block !important; } }
        -
        -@media print {
        -  .hidden-print {
        -    display: none !important; } }
        -
        -/*# sourceMappingURL=app.css.map */
        diff --git a/public/build/assets/css/compiled/app.css.map b/public/build/assets/css/compiled/app.css.map
        deleted file mode 100644
        index 345d88bf80..0000000000
        --- a/public/build/assets/css/compiled/app.css.map
        +++ /dev/null
        @@ -1 +0,0 @@
        -{"version":3,"sources":["app.css","app.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/_bootstrap.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_normalize.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_print.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_glyphicons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_tab-focus.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_image.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_type.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_background-variant.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_clearfix.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-overflow.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid-framework.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_table-row.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_opacity.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-divider.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-filter.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_border-radius.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_input-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navbar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pager.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_jumbotron.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_thumbnails.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_progress-bars.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_gradients.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_progress-bar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_media.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-embed.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_wells.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_modals.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tooltip.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_center-block.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_hide-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss"],"names":[],"mappings":"AAAA,iBAAiB;ACAjB,0DAAY;ACAZ;;;;GAIG;ACJH,4EAA4E;AAQ5E;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,+BAA+B,EAChC;;AAMD;EACE,UAAU,EACX;;AAYD;;;;;;;;;;;;;EAaE,eAAe,EAChB;;AAOD;;;;EAIE,sBAAsB;EACtB,yBAAyB,EAC1B;;AAOD;EACE,cAAc;EACd,UAAU,EACX;;AH3BD;;EGoCE,cAAc,EACf;;AASD;EACE,8BAA8B,EAC/B;;AAOD;;EAEE,WAAW,EACZ;;AASD;EACE,0BAA0B,EAC3B;;AAMD;;EAEE,kBAAkB,EACnB;;AAMD;EACE,mBAAmB,EACpB;;AAOD;EACE,eAAe;EACf,iBAAiB,EAClB;;AAMD;EACE,iBAAiB;EACjB,YAAY,EACb;;AAMD;EACE,eAAe,EAChB;;AAMD;;EAEE,eAAe;EACf,eAAe;EACf,mBAAmB;EACnB,yBAAyB,EAC1B;;AAED;EACE,YAAY,EACb;;AAED;EACE,gBAAgB,EACjB;;AASD;EACE,UAAU,EACX;;AAMD;EACE,iBAAiB,EAClB;;AASD;EACE,iBAAiB,EAClB;;AAMD;EACE,wBAAwB;EACxB,UAAU,EACX;;AAMD;EACE,eAAe,EAChB;;AAMD;;;;EAIE,kCAAkC;EAClC,eAAe,EAChB;;AAiBD;;;;;EAKE,eAAe;EACf,cAAc;EACd,UAAU,EACX;;AAMD;EACE,kBAAkB,EACnB;;AASD;;EAEE,qBAAqB,EACtB;;AAUD;;;;EAIE,2BAA2B;EAC3B,gBAAgB,EACjB;;AAMD;;EAEE,gBAAgB,EACjB;;AAMD;;EAEE,UAAU;EACV,WAAW,EACZ;;AAOD;EACE,oBAAoB,EACrB;;AAUD;;EAEE,uBAAuB;EACvB,WAAW,EACZ;;AAQD;;EAEE,aAAa,EACd;;AAOD;EACE,8BAA8B;EAC9B,wBAAwB,EACzB;;AAQD;;EAEE,yBAAyB,EAC1B;;AAMD;EACE,0BAA0B;EAC1B,cAAc;EACd,+BAA+B,EAChC;;AAOD;EACE,UAAU;EACV,WAAW,EACZ;;AAMD;EACE,eAAe,EAChB;;AAOD;EACE,kBAAkB,EACnB;;AASD;EACE,0BAA0B;EAC1B,kBAAkB,EACnB;;AAED;;EAEE,WAAW,EACZ;;ACvaD,qFAAqF;AAOrF;EACI;;;IAGI,mCAAmC;IACnC,uBAAuB;IACvB,4BAA4B;IAC5B,6BAA6B,EAChC;EAED;;IAEI,2BAA2B,EAC9B;EAED;IACI,6BAA4B,EAC/B;EAED;IACI,8BAA6B,EAChC;EAID;;IAEI,YAAY,EACf;EAED;;IAEI,uBAAuB;IACvB,yBAAyB,EAC5B;EAED;IACI,4BAA4B,EAC/B;EAED;;IAEI,yBAAyB,EAC5B;EAED;IACI,2BAA2B,EAC9B;EAED;;;IAGI,WAAW;IACX,UAAU,EACb;EAED;;IAEI,wBAAwB,EAC3B;EAKD;IACI,cAAc,EACjB;EACD;;IAGQ,kCAAkC,EACrC;EAEL;IACI,uBAAuB,EAC1B;EAED;IACI,qCAAqC,EAMxC;IAPD;;MAKQ,kCAAkC,EACrC;EAEL;;IAGQ,kCAAkC,EACrC,EAAA;;ACrFP;EACE,oCAAoC;EACpC,gEAAQ;EACR,kbAImM,EAAA;;AAKvM;EACE,mBAAmB;EACnB,SAAS;EACT,sBAAsB;EACtB,oCAAoC;EACpC,mBAAmB;EACnB,oBAAoB;EACpB,eAAe;EACf,oCAAoC;EACpC,mCAAmC,EACpC;;AAGD;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;;EAC+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AASpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;ACxSpE;ECkEU,uBDjEsB,EAC/B;;AACD;;EC+DU,uBD7DsB,EAC/B;;AAKD;EACE,gBAAgB;EAChB,yCAAiC,EAClC;;AAED;EACE,gCL1ByC;EK2BzC,gBEuB4B;EFtB5B,yBEkCmC;EFjCnC,eElB8B;EFmB9B,uBEF0B,EFG3B;;AAGD;;;;EAIE,qBAAqB;EACrB,mBAAmB;EACnB,qBAAqB,EACtB;;AAKD;EACE,eE/B4B;EFgC5B,sBAAsB,EAWvB;EAbD;IAMI,eEjB0B;IFkB1B,2BEhB6B,EFiB9B;EARH;IG3CE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EHoDpB;;AASH;EACE,UAAU,EACX;;AAKD;EACE,uBAAuB,EACxB;;AAGD;EIvEE,eADmC;EAEnC,gBAAgB;EAChB,aAAa,EJuEd;;AAGD;EACE,mBEwB6B,EFvB9B;;AAKD;EACE,aEgpB+B;EF/oB/B,yBE/BmC;EFgCnC,uBElE0B;EFmE1B,uBEipBgC;EFhpBhC,mBEY6B;ED8ErB,iCDzF+B;EIzFvC,sBJ4FoC;EI3FpC,gBAAgB;EAChB,aAAa,EJ2Fd;;AAGD;EACE,mBAAmB,EACpB;;AAKD;EACE,iBEhD6B;EFiD7B,oBEjD6B;EFkD7B,UAAU;EACV,8BErG8B,EFsG/B;;AAOD;EACE,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;EACb,WAAW;EACX,iBAAiB;EACjB,uBAAU;EACV,UAAU,EACX;;AAMD;EAGI,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,UAAU;EACV,kBAAkB;EAClB,WAAW,EACZ;;AN69BH;EMl9BE,gBAAgB,EACjB;;AKxJD;;EAEE,qBH0D+B;EGzD/B,iBH0D2B;EGzD3B,iBH0D2B;EGzD3B,eH0D+B,EGlDhC;EAbD;;;;;;;;;;;;;;IASI,oBAAoB;IACpB,eAAe;IACf,eHL4B,EGM7B;;AAGH;;;EAGE,iBHuC6B;EGtC7B,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAEH;;;EAGE,iBAAkC;EAClC,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAGH;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHCoB,EGDQ;;AACtC;EAAU,gBHSoB,EGTQ;;AAMtC;EACE,iBAAkC,EACnC;;AAED;EACE,oBHG6B;EGF7B,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB,EAKlB;EAHC;IANF;MAOI,gBAA2B,EAE9B,EAAA;;AAOD;;EAEE,eAAgB,EACjB;;AAED;;EAEE,0BH4asC;EG3atC,cAAc,EACf;;AAGD;EAAuB,iBAAiB,EAAI;;AAC5C;EAAuB,kBAAkB,EAAI;;AAC7C;EAAuB,mBAAmB,EAAI;;AAC9C;EAAuB,oBAAoB,EAAI;;AAC/C;EAAuB,oBAAoB,EAAI;;AAG/C;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,2BAA2B,EAAI;;AAGtD;EACE,eHxF8B,EGyF/B;;ACnGC;EACE,eJY0B,EIX3B;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJkfoC,EIjfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJsfoC,EIrfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ0foC,EIzfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ8foC,EI7frC;;AACD;;EACE,eAAa,EACd;;AD6GH;EAGE,YAAY,EACb;;AEtHC;EACE,0BLY0B,EKX3B;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLmfoC,EKlfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLufoC,EKtfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL2foC,EK1frC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL+foC,EK9frC;;AACD;;EACE,0BAAwB,EACzB;;AFgIH;EACE,oBAAuC;EACvC,oBH1E6B;EG2E7B,iCH7H8B,EG8H/B;;AAOD;;EAEE,cAAc;EACd,oBAAqC,EAKtC;EARD;;;;IAMI,iBAAiB,EAClB;;AAWH;EAJE,gBAAgB;EAChB,iBAAiB,EAKlB;;AAID;EAVE,gBAAgB;EAChB,iBAAiB;EAWjB,kBAAkB,EAOnB;EATD;IAKI,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB,EACpB;;AAIH;EACE,cAAc;EACd,oBHzH6B,EG0H9B;;AACD;;EAEE,yBH/HmC,EGgIpC;;AACD;EACE,kBAAkB,EACnB;;AACD;EACE,eAAe,EAChB;;AAOD;EG7LI,aAAa;EACb,eAAe,EAChB;;AH2LH;EGzLI,YAAY,EACb;;AH6LD;EALF;IAOM,YAAY;IACZ,aAA6B;IAC7B,YAAY;IACZ,kBAAkB;IIlNtB,iBAAiB;IACjB,wBAAwB;IACxB,oBAAoB,EJkNjB;EAZL;IAcM,mBH2nB6B,EG1nB9B,EAAA;;AASL;;EAGE,aAAa;EACb,kCH1N8B,EG2N/B;;AACD;EACE,eAAe,EAEhB;;AAGD;EACE,mBHhL6B;EGiL7B,iBHjL6B;EGkL7B,kBH4mB4C;EG3mB5C,+BHrO8B,EG6P/B;EA5BD;;;IAUM,iBAAiB,EAClB;EAXL;;;IAmBI,eAAe;IACf,eAAe;IACf,yBHtMiC;IGuMjC,eHxP4B,EG6P7B;IA3BH;;;MAyBM,uBAAuB,EACxB;;AAOL;;EAEE,oBAAoB;EACpB,gBAAgB;EAChB,gCHtQ8B;EGuQ9B,eAAe;EACf,kBAAkB,EAWnB;EAjBD;;;;;;IAYe,YAAY,EAAI;EAZ/B;;;;;;IAcM,uBAAuB,EACxB;;AAKL;EACE,oBHrO6B;EGsO7B,mBAAmB;EACnB,yBHzOmC,EG0OpC;;AKnSD;;;;EAIE,+DRsCyE,EQrC1E;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,eRmzBmC;EQlzBnC,0BRmzBmC;EQlzBnC,mBR0F6B,EQzF9B;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,YR6yBgC;EQ5yBhC,uBR6yBgC;EQ5yBhC,mBRmF6B;EQlF7B,+CAA+B,EAQhC;EAdD;IASI,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB,EAClB;;AAIH;EACE,eAAe;EACf,eAAgC;EAChC,iBAAkC;EAClC,gBAA2B;EAC3B,yBRkBmC;EQjBnC,sBAAsB;EACtB,sBAAsB;EACtB,eRpC8B;EQqC9B,0BRyxBmC;EQxxBnC,uBR0xBgC;EQzxBhC,mBR0D6B,EQ/C9B;EAtBD;IAeI,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,sBAAsB;IACtB,8BAA8B;IAC9B,iBAAiB,EAClB;;AAIH;EACE,kBR2wBiC;EQ1wBjC,mBAAmB,EACpB;;AC3DD;ECHE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDYpB;EAZD;IHMI,aAAa;IACb,eAAe,EAChB;EGRH;IHUI,YAAY,EACb;EGRD;IAHF;MAII,aT2UiC,ESnUpC,EAAA;EANC;IANF;MAOI,aT6UiC,ESxUpC,EAAA;EAHC;IATF;MAUI,cT+UkC,ES7UrC,EAAA;;AAQD;ECvBE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDsBpB;EAFD;IHdI,aAAa;IACb,eAAe,EAChB;EGYH;IHVI,YAAY,EACb;;AGkBH;ECvBE,mBAAkB;EAClB,oBAAmB,EDwBpB;EAFD;IHvBI,aAAa;IACb,eAAe,EAChB;EGqBH;IHnBI,YAAY,EACb;;AKVD;EACE,mBAAmB;EAEnB,gBAAgB;EAEhB,mBAAmB;EACnB,oBAAoB,EACrB;;AASD;EACE,YAAY,EACb;;AAMC;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAkBD;EACE,YAAY,EACb;;AAPD;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAPD;EACE,WAAW,EACZ;;AAPD;EACE,oBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,WAAgB,EACjB;;AAkBD;EACE,gBAAuB,EACxB;;AAFD;EACE,2BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,kBAAuB,EACxB;;AFEL;EErCE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFWL;EE9CE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFoBL;EEvDE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;ACxDL;EACE,8BZgIyC,EY/H1C;;AACD;EACE,iBZwHiC;EYvHjC,oBZuHiC;EYtHjC,eZG8B;EYF9B,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AAKD;EACE,YAAY;EACZ,gBAAgB;EAChB,oBZyC6B,EYD9B;EA3CD;;;;;;IAWQ,aZiG2B;IYhG3B,yBZ8B6B;IY7B7B,oBAAoB;IACpB,2BZ2G4B,EY1G7B;EAfP;IAoBI,uBAAuB;IACvB,8BZoGgC,EYnGjC;EAtBH;;;;;;IA8BQ,cAAc,EACf;EA/BP;IAoCI,2BZqFgC,EYpFjC;EArCH;IAyCI,uBZjCwB,EYkCzB;;AAMH;;;;;;EAOQ,aZuD2B,EYtD5B;;AAUP;EACE,uBZsDkC,EYrCnC;EAlBD;;;;;;IAQQ,uBZ+C4B,EY9C7B;EATP;;IAeM,yBAAyB,EAC1B;;AASL;EAEI,0BZsBmC,EYrBpC;;AAQH;EAEI,0BZamC,EYZpC;;AAQH;EACE,iBAAiB;EACjB,YAAY;EACZ,sBAAsB,EACvB;;AACD;;EAIM,iBAAiB;EACjB,YAAY;EACZ,oBAAoB,EACrB;;AC7IH;;;;;;;;;;;;EAII,0BbiIiC,EahIlC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb+ekC,Ea9enC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbmfkC,EalfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbufkC,EatfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb2fkC,Ea1fnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;ADwJL;EACE,iBAAiB;EACjB,kBAAkB,EA6DnB;EA3DC;IAJF;MAKI,YAAY;MACZ,oBAAqC;MACrC,mBAAmB;MACnB,6CAA6C;MAC7C,uBZrCgC,EY2FnC;MA/DD;QAaM,iBAAiB,EAalB;QA1BL;;;;;;UAsBY,oBAAoB,EACrB;MAvBX;QA8BM,UAAU,EA+BX;QA7DL;;;;;;UAuCY,eAAe,EAChB;QAxCX;;;;;;UA2CY,gBAAgB,EACjB;QA5CX;;;;UAwDY,iBAAiB,EAClB,EAAA;;AE1NX;EACE,WAAW;EACX,UAAU;EACV,UAAU;EAIV,aAAa,EACd;;AAED;EACE,eAAe;EACf,YAAY;EACZ,WAAW;EACX,oBd0C6B;EczC7B,gBAA2B;EAC3B,qBAAqB;EACrB,edd8B;Ece9B,UAAU;EACV,iCdmMsC,EclMvC;;AAED;EACE,sBAAsB;EACtB,gBAAgB;EAChB,mBAAmB;EACnB,kBAAkB,EACnB;;AAUD;Ef8BU,uBe7BsB,EAC/B;;AAGD;;EAEE,gBAAgB;EAChB,mBAAmB;EACnB,oBAAoB,EACrB;;AAED;EACE,eAAe,EAChB;;AAGD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;;EAEE,aAAa,EACd;;AAGD;;;EbvEE,qBAAqB;EAErB,2CAA2C;EAC3C,qBAAqB,EawEtB;;AAGD;EACE,eAAe;EACf,iBAAoC;EACpC,gBdlC4B;EcmC5B,yBdvBmC;EcwBnC,ed1E8B,Ec2E/B;;AAyBD;EACE,eAAe;EACf,YAAY;EACZ,adiGqD;EchGrD,kBdtB8B;EcuB9B,gBdnE4B;EcoE5B,yBdxDmC;EcyDnC,ed3G8B;Ec4G9B,uBdmEmC;EclEnC,uBAAuB;EACvB,uBdwEmC;EcvEnC,mBdf6B;EDxCrB,iDewDgC;Ef8DhC,yEe7DsE,EAgC/E;EA7CD;ICxDI,sBfsJoC;IerJpC,WAAW;IhBWL,mFgBdS,EAKhB;EDqDH;IfVI,YC2GiC;ID1GjC,WAAW,EACZ;EeQH;IfP4B,YCwGS,EDxGQ;EeO7C;IfNkC,YCuGG,EDvGc;EeMnD;IAuBI,UAAU;IACV,8BAA8B,EAC/B;EAzBH;;IAmCI,0BdrI4B;IcsI5B,WAAW,EACZ;EArCH;;IAyCI,oBd6EwC,Ec5EzC;;AAMH;EACE,aAAa,EACd;;AAUD;EACE,yBAAyB,EAC1B;;AAYD;EACE;;;;IAKI,kBdoBiD,EcnBlD;EANH;;;;;;;;;;;;;;;;;;;;;;IAUI,kBdmBiC,EclBlC;EAXH;;;;;;;;;;;;;;;;;;;;;;IAeI,kBdYgC,EcXjC,EAAA;;AAUL;EACE,oBdKmC,EcJpC;;AAOD;;EAEE,mBAAmB;EACnB,eAAe;EACf,iBAAiB;EACjB,oBAAoB,EASrB;EAdD;;IAQI,iBdtK2B;IcuK3B,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,gBAAgB,EACjB;;AAEH;;;;EAIE,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB,EACpB;;AAED;;EAEE,iBAAiB,EAClB;;AAGD;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB,EACjB;;AACD;;EAEE,cAAc;EACd,kBAAkB,EACnB;;AAMD;;;;;;EAKI,oBd/CwC,EcgDzC;;AAGH;;;;;EAII,oBdvDwC,EcwDzC;;AAGH;;;;;EAKM,oBdhEsC,EciEvC;;AAUL;EAEE,iBAAoC;EACpC,oBAAuC;EAEvC,iBAAiB;EACjB,iBAAkC,EAOnC;EAbD;;;;;IAUI,gBAAgB;IAChB,iBAAiB,EAClB;;ACxPD;;;EACE,afkJmC;EejJnC,kBf6B4B;Ee5B5B,gBfpB0B;EeqB1B,iBfiC2B;EehC3B,mBfoC2B,EenC5B;;AAED;;;EACE,af0ImC;EezInC,kBfyImC,EexIpC;;AAED;;;;;;;EACE,aAAa,EACd;;ADsPH;EAEI,adpHmC;EcqHnC,kBdzO4B;Ec0O5B,gBd1R0B;Ec2R1B,iBdrO2B;EcsO3B,mBdlO2B,EcmO5B;;AAPH;EASI,ad3HmC;Ec4HnC,kBd5HmC,Ec6HpC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,adnImC;EcoInC,iBAAkC;EAClC,kBdzP4B;Ec0P5B,gBd1S0B;Ec2S1B,iBdrP2B,EcsP5B;;AC3RD;;;EACE,afgJkC;Ee/IlC,mBf0B4B;EezB5B,gBfrB0B;EesB1B,uBfgCiC;Ee/BjC,mBfmC2B,EelC5B;;AAED;;;EACE,afwIkC;EevIlC,kBfuIkC,EetInC;;AAED;;;;;;;EACE,aAAa,EACd;;ADgRH;EAEI,adhJkC;EciJlC,mBdtQ4B;EcuQ5B,gBdrT0B;EcsT1B,uBdhQiC;EciQjC,mBd7P2B,Ec8P5B;;AAPH;EASI,advJkC;EcwJlC,kBdxJkC,EcyJnC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ad/JkC;EcgKlC,iBAAkC;EAClC,mBdtR4B;EcuR5B,gBdrU0B;EcsU1B,uBdhRiC,EciRlC;;AAQH;EAEE,mBAAmB,EAMpB;EARD;IAMI,sBAAkC,EACnC;;AAGH;EACE,mBAAmB;EACnB,OAAO;EACP,SAAS;EACT,WAAW;EACX,eAAe;EACf,Yd9LqD;Ec+LrD,ad/LqD;EcgMrD,kBdhMqD;EciMrD,mBAAmB;EACnB,qBAAqB,EACtB;;AACD;;;;;EAGE,YdrMoC;EcsMpC,adtMoC;EcuMpC,kBdvMoC,EcwMrC;;AACD;;;;;EAGE,Yd1MqC;Ec2MrC,ad3MqC;Ec4MrC,kBd5MqC,Ec6MtC;;AAGD;;;;;;;;;;ECxZI,efseoC,EererC;;ADuZH;ECpZI,sBfkeoC;EDlb9B,iDgB/CkC,EAMzC;ED6YH;ICjZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;AD8YL;EC1YI,efwdoC;EevdpC,sBfudoC;EetdpC,0BfudoC,EetdrC;;ADuYH;ECpYI,efkdoC,EejdrC;;ADsYH;;;;;;;;;;EC3ZI,ef8eoC,Ee7erC;;AD0ZH;ECvZI,sBf0eoC;ED1b9B,iDgB/CkC,EAMzC;EDgZH;ICpZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADiZL;EC7YI,efgeoC;Ee/dpC,sBf+doC;Ee9dpC,0Bf+doC,Ee9drC;;AD0YH;ECvYI,ef0doC,EezdrC;;ADyYH;;;;;;;;;;EC9ZI,efkfoC,EejfrC;;AD6ZH;EC1ZI,sBf8eoC;ED9b9B,iDgB/CkC,EAMzC;EDmZH;ICvZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADoZL;EChZI,efoeoC;EenepC,sBfmeoC;EelepC,0BfmeoC,EelerC;;AD6YH;EC1YI,ef8doC,Ee7drC;;AD8YH;EAGI,UAA2B,EAC5B;;AAJH;EAMI,OAAO,EACR;;AASH;EACE,eAAe;EACf,gBAAgB;EAChB,oBAAoB;EACpB,eAAc,EACf;;AAkBC;EAmEF;IAhEM,sBAAsB;IACtB,iBAAiB;IACjB,uBAAuB,EACxB;EA6DL;IAzDM,sBAAsB;IACtB,YAAY;IACZ,uBAAuB,EACxB;EAsDL;IAlDM,sBAAsB,EACvB;EAiDL;IA9CM,sBAAsB;IACtB,uBAAuB,EAOxB;IAsCL;;;MAxCQ,YAAY,EACb;EAuCP;IAlCM,YAAY,EACb;EAiCL;IA9BM,iBAAiB;IACjB,uBAAuB,EACxB;EA4BL;;IAtBM,sBAAsB;IACtB,cAAc;IACd,iBAAiB;IACjB,uBAAuB,EAKxB;IAcL;;MAhBQ,gBAAgB,EACjB;EAeP;;IAXM,mBAAmB;IACnB,eAAe,EAChB;EASL;IALM,OAAO,EACR,EAAA;;AAeL;;;;EASI,cAAc;EACd,iBAAiB;EACjB,iBAAoC,EACrC;;AAZH;;EAiBI,iBAAkC,EACnC;;AAlBH;EJ1hBE,mBAAkB;EAClB,oBAAmB,EIgjBlB;EAvBH;IR1hBI,aAAa;IACb,eAAe,EAChB;EQwhBH;IRthBI,YAAY,EACb;;AQgjBD;EA3BF;IA6BM,kBAAkB;IAClB,iBAAiB;IACjB,iBAAoC,EACrC,EAAA;;AAhCL;EAwCI,YAAY,EACb;;AAOC;EAhDJ;IAkDQ,kBAAqC;IACrC,gBdxiBsB,EcyiBvB,EAAA;;AAIH;EAxDJ;IA0DQ,iBAAqC;IACrC,gBd/iBsB,EcgjBvB,EAAA;;AE7lBP;EACE,sBAAsB;EACtB,iBAAiB;EACjB,oBhB0IqC;EgBzIrC,mBAAmB;EACnB,uBAAuB;EACvB,+BAA2B;EAA3B,2BAA2B;EAC3B,gBAAgB;EAChB,uBAAuB;EACvB,8BAA8B;EAC9B,oBAAoB;EC0CpB,kBjBmC8B;EiBlC9B,gBjBV4B;EiBW5B,yBjBCmC;EiBAnC,mBjB8C6B;ED4G7B,0BiBrMyB;EjBsMtB,uBiBtMsB;EjBuMrB,sBiBvMqB;EjBwMjB,kBiBxMiB,EAkC1B;EA9CD;IfJE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EeqBlB;EApBL;IA0BI,YhBqHiC;IgBpHjC,sBAAsB,EACvB;EA5BH;IAgCI,WAAW;IACX,uBAAuB;IjB4BjB,iDiB3BkC,EACzC;EAnCH;;IAwCI,oBhBuLwC;IkBpO1C,cF8CsB;IE3CtB,0BAAa;InB+DL,iBiBnBkB,EACzB;;AAKH;;EAGI,qBAAqB,EACtB;;AAOH;EC7DE,YjBiJmC;EiBhJnC,uBjBiJmC;EiBhJnC,mBjBiJmC,EgBpFpC;EAFD;ICvDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDoDH;IClDI,YjBsIiC;IiBrIjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+CH;;IC3CI,YjB+HiC;IiB9HjC,0BAAwB;IACpB,sBAAoB,EASzB;IDgCH;;;;MCpCM,YjBwH+B;MiBvH/B,0BAAwB;MACpB,sBAAoB,EACzB;EDiCL;;IC5BI,uBAAuB,EACxB;ED2BH;;;;ICpBM,uBjByG+B;IiBxG3B,mBjByG2B,EiBxGhC;EDkBL;ICdI,YjBmGiC;IiBlGjC,uBjBiGiC,EiBhGlC;;ADeH;EChEE,YjBqJmC;EiBpJnC,0BjBU4B;EiBT5B,sBjBqJqC,EgBrFtC;EAFD;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuDH;ICrDI,YjB0IiC;IiBzIjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkDH;;IC9CI,YjBmIiC;IiBlIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmCH;;;;MCvCM,YjB4H+B;MiB3H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoCL;;IC/BI,uBAAuB,EACxB;ED8BH;;;;ICvBM,0BjB9BwB;IiB+BpB,sBjB6G6B,EiB5GlC;EDqBL;ICjBI,ejBpC0B;IiBqC1B,uBjBqGiC,EiBpGlC;;ADmBH;ECpEE,YjByJmC;EiBxJnC,0BjBW6B;EiBV7B,sBjByJqC,EgBrFtC;EAFD;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED2DH;ICzDI,YjB8IiC;IiB7IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDsDH;;IClDI,YjBuIiC;IiBtIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDuCH;;;;MC3CM,YjBgI+B;MiB/H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDwCL;;ICnCI,uBAAuB,EACxB;EDkCH;;;;IC3BM,0BjB7ByB;IiB8BrB,sBjBiH6B,EiBhHlC;EDyBL;ICrBI,ejBnC2B;IiBoC3B,uBjByGiC,EiBxGlC;;ADuBH;ECxEE,YjB6JmC;EiB5JnC,0BjBY6B;EiBX7B,sBjB6JqC,EgBrFtC;EAFD;IClEI,YjBuJiC;IiBtJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+DH;IC7DI,YjBkJiC;IiBjJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED0DH;;ICtDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID2CH;;;;MC/CM,YjBoI+B;MiBnI/B,0BAAwB;MACpB,sBAAoB,EACzB;ED4CL;;ICvCI,uBAAuB,EACxB;EDsCH;;;;IC/BM,0BjB5ByB;IiB6BrB,sBjBqH6B,EiBpHlC;ED6BL;ICzBI,ejBlC2B;IiBmC3B,uBjB6GiC,EiB5GlC;;AD2BH;EC5EE,YjBiKmC;EiBhKnC,0BjBa6B;EiBZ7B,sBjBiKqC,EgBrFtC;EAFD;ICtEI,YjB2JiC;IiB1JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDmEH;ICjEI,YjBsJiC;IiBrJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED8DH;;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID+CH;;;;MCnDM,YjBwI+B;MiBvI/B,0BAAwB;MACpB,sBAAoB,EACzB;EDgDL;;IC3CI,uBAAuB,EACxB;ED0CH;;;;ICnCM,0BjB3ByB;IiB4BrB,sBjByH6B,EiBxHlC;EDiCL;IC7BI,ejBjC2B;IiBkC3B,uBjBiHiC,EiBhHlC;;AD+BH;EChFE,YjBqKmC;EiBpKnC,0BjBc6B;EiBb7B,sBjBqKqC,EgBrFtC;EAFD;IC1EI,YjB+JiC;IiB9JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuEH;ICrEI,YjB0JiC;IiBzJjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkEH;;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmDH;;;;MCvDM,YjB4I+B;MiB3I/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoDL;;IC/CI,uBAAuB,EACxB;ED8CH;;;;ICvCM,0BjB1ByB;IiB2BrB,sBjB6H6B,EiB5HlC;EDqCL;ICjCI,ejBhC2B;IiBiC3B,uBjBqHiC,EiBpHlC;;ADwCH;EACE,ehB/E4B;EgBgF5B,oBAAoB;EACpB,iBAAiB,EA8BlB;EAjCD;;IAUI,8BAA8B;IjBpCxB,iBiBqCkB,EACzB;EAZH;IAiBI,0BAA0B,EAC3B;EAlBH;IAqBI,ehBhF0B;IgBiF1B,2BhB/E6B;IgBgF7B,8BAA8B,EAC/B;EAxBH;;;IA6BM,ehB9G0B;IgB+G1B,sBAAsB,EACvB;;AAQL;EC1EE,mBjBsC8B;EiBrC9B,gBjBT4B;EiBU5B,uBjB4CmC;EiB3CnC,mBjB+C6B,EgB2B9B;;AACD;EC9EE,kBjByC8B;EiBxC9B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgB8B9B;;AACD;EClFE,iBjB4C6B;EiB3C7B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgBiC9B;;AAMD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;EACE,gBAAgB,EACjB;;AAGD;;;EAII,YAAY,EACb;;AG7JH;EACE,WAAW;EpBiLH,iCoBhL+B,EAIxC;EAND;IAII,WAAW,EACZ;;AAGH;EACE,cAAc,EAKf;EAND;IAGc,eAAe,EAAI;;AAKjC;EAAoB,mBAAmB,EAAI;;AAE3C;EAAoB,yBAAyB,EAAI;;AAEjD;EACE,mBAAmB;EACnB,UAAU;EACV,iBAAiB;EpB+JT,wCoB9JuC;EpBsKvC,2BoBrKyB;EpByKzB,iCoBxKgC,EACzC;;AC9BD;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,uBAAuB;EACvB,uBAAsC;EACtC,yBAAwC;EACxC,oCAAiD;EACjD,mCAAiD,EAClD;;AAGD;;EAEE,mBAAmB,EACpB;;AAGD;EACE,WAAW,EACZ;;AAGD;EACE,mBAAmB;EACnB,UAAU;EACV,QAAQ;EACR,cpBmP6B;EoBlP7B,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,gBpBU4B;EoBT5B,iBAAiB;EACjB,uBpBoMmC;EoBnMnC,uBpBuMmC;EoBtMnC,sCpBoMmC;EoBnMnC,mBpB+D6B;EDxCrB,4CqBtB2B;EACnC,6BAA6B,EAyB9B;EA3CD;IAwBI,SAAS;IACT,WAAW,EACZ;EA1BH;ICzBE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BrB6OsC,EoBxLrC;EA/BH;IAmCI,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ,oBAAoB;IACpB,yBpBNiC;IoBOjC,epB1D4B;IoB2D5B,oBAAoB,EACrB;;AAIH;EAGI,sBAAsB;EACtB,epB0KmC;EoBzKnC,0BpB2KoC,EoB1KrC;;AAIH;EAII,YpBwB4B;EoBvB5B,sBAAsB;EACtB,WAAW;EACX,0BpB5E0B,EoB6E3B;;AAOH;EAII,epB3F4B,EoB4F7B;;AALH;EAUI,sBAAsB;EACtB,8BAA8B;EAC9B,uBAAuB;EE3GzB,oEAAmE;EF6GjE,oBpBoHwC,EoBnHzC;;AAIH;EAGI,eAAe,EAChB;;AAJH;EAQI,WAAW,EACZ;;AAOH;EACE,WAAW;EACX,SAAS,EACV;;AAOD;EACE,QAAQ;EACR,YAAY,EACb;;AAGD;EACE,eAAe;EACf,kBAAkB;EAClB,gBpBtG4B;EoBuG5B,yBpB7FmC;EoB8FnC,epB/I8B;EoBgJ9B,oBAAoB,EACrB;;AAGD;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,UAAU;EACV,OAAO;EACP,aAA0B,EAC3B;;AAGD;EACE,SAAS;EACT,WAAW,EACZ;;AAOD;;EAII,cAAc;EACd,0BAAuC;EACvC,4BAAyC;EACzC,YAAY,EACb;;AARH;;EAWI,UAAU;EACV,aAAa;EACb,mBAAmB,EACpB;;AAQH;EACE;IAEI,SAAS;IAAE,WAAW,EACvB;EAHH;IAOI,QAAQ;IAAE,YAAY,EACvB,EAAA;;AGhNL;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,uBAAuB,EAYxB;EAhBD;;IAMI,mBAAmB;IACnB,YAAY,EAQb;IAfH;;;;;MAaM,WAAW,EACZ;;AAKL;;;;EAKI,kBAAkB,EACnB;;AAIH;EACE,kBAAkB,EAanB;EAdD;IjBnBI,aAAa;IACb,eAAe,EAChB;EiBiBH;IjBfI,YAAY,EACb;EiBcH;;;IAOI,YAAY,EACb;EARH;;;IAYI,iBAAiB,EAClB;;AAGH;EACE,iBAAiB,EAClB;;AAGD;EACE,eAAe,EAIhB;EALD;IChDE,8BDmDgC;IClD7B,2BDkD6B,EAC/B;;AAGH;;EC/CE,6BDiD6B;EChD1B,0BDgD0B,EAC9B;;AAGD;EACE,YAAY,EACb;;AACD;EACE,iBAAiB,EAClB;;AACD;;ECnEE,8BDsEgC;ECrE7B,2BDqE6B,EAC/B;;AAEH;ECjEE,6BDkE6B;ECjE1B,0BDiE0B,EAC9B;;AAGD;;EAEE,WAAW,EACZ;;AAgBD;EACE,kBAAkB;EAClB,mBAAmB,EACpB;;AACD;EACE,mBAAmB;EACnB,oBAAoB,EACrB;;AAID;ExB9CU,iDwB+CgC,EAMzC;EAPD;IxB9CU,iBwBmDkB,EACzB;;AAKH;EACE,eAAe,EAChB;;AAED;EACE,wBAAqD;EACrD,uBAAuB,EACxB;;AAED;EACE,wBvBf6B,EuBgB9B;;AAMD;;;EAII,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,gBAAgB,EACjB;;AARH;EjBhII,aAAa;EACb,eAAe,EAChB;;AiB8HH;EjB5HI,YAAY,EACb;;AiB2HH;EAcM,YAAY,EACb;;AAfL;;;;EAsBI,iBAAiB;EACjB,eAAe,EAChB;;AAGH;EAEI,iBAAiB,EAClB;;AAHH;ECvKE,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BDqKiC;ECpKhC,6BDoKgC,EAChC;;AAPH;ECvKE,2BDgL8B;EC/K7B,0BD+K6B;ECxK9B,gCxBkG6B;EwBjG5B,+BxBiG4B,EuBwE5B;;AAEH;EACE,iBAAiB,EAClB;;AACD;;EC/KE,8BDkLiC;ECjLhC,6BDiLgC,EAChC;;AAEH;EC7LE,2BD8L4B;EC7L3B,0BD6L2B,EAC7B;;AAMD;EACE,eAAe;EACf,YAAY;EACZ,oBAAoB;EACpB,0BAA0B,EAc3B;EAlBD;;IAOI,YAAY;IACZ,oBAAoB;IACpB,UAAU,EACX;EAVH;IAYI,YAAY,EACb;EAbH;IAgBI,WAAW,EACZ;;A/B4oGH;;;;E+BvnGM,mBAAmB;EACnB,uBAAU;EACV,qBAAqB,EACtB;;AE3OL;EACE,mBAAmB;EACnB,eAAe;EACf,0BAA0B,EA2B3B;EA9BD;IAOI,YAAY;IACZ,gBAAgB;IAChB,iBAAiB,EAClB;EAVH;IAeI,mBAAmB;IACnB,WAAW;IAKX,YAAY;IAEZ,YAAY;IACZ,iBAAiB,EAKlB;IA7BH;MA2BM,WAAW,EACZ;;AAuBL;;;EAGE,oBAAoB,EAKrB;EARD;;;IAMI,iBAAiB,EAClB;;AAGH;;EAEE,UAAU;EACV,oBAAoB;EACpB,uBAAuB,EACxB;;AAID;EACE,kBzBkB8B;EyBjB9B,gBzB3B4B;EyB4B5B,oBAAoB;EACpB,eAAe;EACf,ezBpE8B;EyBqE9B,mBAAmB;EACnB,0BzBpE8B;EyBqE9B,uBzB+GmC;EyB9GnC,mBzBwB6B,EyBL9B;EA5BD;;;IAaI,kBzBY4B;IyBX5B,gBzBrC0B;IyBsC1B,mBzBoB2B,EyBnB5B;EAhBH;;;IAkBI,mBzBI4B;IyBH5B,gBzB3C0B;IyB4C1B,mBzBc2B,EyBb5B;EArBH;;IA0BI,cAAc,EACf;;AAIH;;;;;;;EDpGE,8BC2G8B;ED1G3B,2BC0G2B,EAC/B;;AACD;EACE,gBAAgB,EACjB;;AACD;;;;;;;EDxGE,6BC+G6B;ED9G1B,0BC8G0B,EAC9B;;AACD;EACE,eAAe,EAChB;;AAID;EACE,mBAAmB;EAGnB,aAAa;EACb,oBAAoB,EA+BrB;EApCD;IAUI,mBAAmB,EAUpB;IApBH;MAYM,kBAAkB,EACnB;IAbL;MAkBM,WAAW,EACZ;EAnBL;;IA0BM,mBAAmB,EACpB;EA3BL;;IAgCM,WAAW;IACX,kBAAkB,EACnB;;AChKL;EACE,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB,EAyDlB;EA5DD;IpBOI,aAAa;IACb,eAAe,EAChB;EoBTH;IpBWI,YAAY,EACb;EoBZH;IAOI,mBAAmB;IACnB,eAAe,EAyBhB;IAjCH;MAWM,mBAAmB;MACnB,eAAe;MACf,mB1BqZ+C,E0B/YhD;MAnBL;QAgBQ,sBAAsB;QACtB,0B1BVwB,E0BWzB;IAlBP;MAuBM,e1BjB0B,E0B0B3B;MAhCL;QA2BQ,e1BrBwB;Q0BsBxB,sBAAsB;QACtB,8BAA8B;QAC9B,oB1BiMoC,E0BhMrC;EA/BP;IAwCM,0B1BjC0B;I0BkC1B,sB1BhCwB,E0BiCzB;EA1CL;ILHE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BAJgC,EKwD/B;EApDH;IA0DI,gBAAgB,EACjB;;AAQH;EACE,8B1BqW8C,E0BlU/C;EApCD;IAGI,YAAY;IAEZ,oBAAoB,EAyBrB;IA9BH;MASM,kBAAkB;MAClB,yB1BtB+B;M0BuB/B,8BAA8B;MAC9B,2BAA0D,EAI3D;MAhBL;QAcQ,mC1BwVwC,E0BvVzC;IAfP;MAuBQ,e1BrFwB;M0BsFxB,uB1BtEoB;M0BuEpB,uB1BmVwC;M0BlVxC,iCAAiC;MACjC,gBAAgB,EACjB;;AAaP;EAEI,YAAY,EAmBb;EArBH;IAMM,mB1BbyB,E0Bc1B;EAPL;IASM,iBAAiB,EAClB;EAVL;IAiBQ,Y1BnBwB;I0BoBxB,0B1BrHsB,E0BsHvB;;AAOP;EAEI,YAAY,EAKb;EAPH;IAIM,gBAAgB;IAChB,eAAe,EAChB;;AAWL;EACE,YAAY,EAwBb;EAzBD;IAII,YAAY,EAKb;IATH;MAMM,mBAAmB;MACnB,mBAAmB,EACpB;EARL;IAYI,UAAU;IACV,WAAW,EACZ;EAED;IAhBF;MAkBM,oBAAoB;MACpB,UAAU,EAIX;MAvBL;QAqBQ,iBAAiB,EAClB,EAAA;;AAQP;EACE,iBAAiB,EAyBlB;EA1BD;IAKI,gBAAgB;IAChB,mB1BtF2B,E0BuF5B;EAPH;;;IAYI,uB1BgPkD,E0B/OnD;EAED;IAfF;MAiBM,8B1B2OgD;M0B1OhD,2BAA0D,EAC3D;IAnBL;;;MAuBM,0B1BvLsB,E0BwLvB,EAAA;;AASL;EAEI,cAAc,EACf;;AAHH;EAKI,eAAe,EAChB;;AAQH;EAEE,iBAAiB;EF3OjB,2BE6O4B;EF5O3B,0BE4O2B,EAC7B;;ACvOD;EACE,mBAAmB;EACnB,iB3BgWqC;E2B/VrC,oB3BoD6B;E2BnD7B,8BAA8B,EAQ/B;EAZD;IrBKI,aAAa;IACb,eAAe,EAChB;EqBPH;IrBSI,YAAY,EACb;EqBDD;IATF;MAUI,mB3ByF2B,E2BvF9B,EAAA;;AAQD;ErBfI,aAAa;EACb,eAAe,EAChB;;AqBaH;ErBXI,YAAY,EACb;;AqBaD;EAHF;IAII,YAAY,EAEf,EAAA;;AAaD;EACE,oBAAoB;EACpB,oB3B4TsC;E2B3TtC,mB3B2TsC;E2B1TtC,kCAAkC;EAClC,mDAA8B;EAE9B,kCAAkC,EA+BnC;EAtCD;IrBlCI,aAAa;IACb,eAAe,EAChB;EqBgCH;IrB9BI,YAAY,EACb;EqB6BH;IAUI,iBAAiB,EAClB;EAED;IAbF;MAcI,YAAY;MACZ,cAAc;MACd,iBAAiB,EAsBpB;MAtCD;QAmBM,0BAA0B;QAC1B,wBAAwB;QACxB,kBAAkB;QAClB,6BAA6B,EAC9B;MAvBL;QA0BM,oBAAoB,EACrB;MAID;;;QAGE,gBAAgB;QAChB,iBAAiB,EAClB,EAAA;;AAIL;;EAGI,kB3BqRoC,E2BhRrC;EAHC;IALJ;;MAMM,kBAAkB,EAErB,EAAA;;AAQH;;;;EAII,oB3BkQoC;E2BjQpC,mB3BiQoC,E2B3PrC;EAJC;IAPJ;;;;MAQM,gBAAgB;MAChB,eAAgB,EAEnB,EAAA;;AAWH;EACE,c3BoJ6B;E2BnJ7B,sBAAsB,EAKvB;EAHC;IAJF;MAKI,iBAAiB,EAEpB,EAAA;;AAGD;;EAEE,gBAAgB;EAChB,SAAS;EACT,QAAQ;EACR,c3B0I6B,E2BpI9B;EAHC;IARF;;MASI,iBAAiB,EAEpB,EAAA;;AACD;EACE,OAAO;EACP,sBAAsB,EACvB;;AACD;EACE,UAAU;EACV,iBAAiB;EACjB,sBAAsB,EACvB;;AAKD;EACE,YAAY;EACZ,mB3B2MsC;E2B1MtC,gB3BjH4B;E2BkH5B,kB3BrG6B;E2BsG7B,a3BqMqC,E2BpLtC;EAtBD;IASI,sBAAsB,EACvB;EAVH;IAaI,eAAe,EAChB;EAED;IACE;;MAEE,mB3B0LkC,E2BzLnC,EAAA;;AAUL;EACE,mBAAmB;EACnB,aAAa;EACb,mB3B4KsC;E2B3KtC,kBAAkB;EC9LlB,gBAA4B;EAC5B,mBAA+B;ED+L/B,8BAA8B;EAC9B,uBAAuB;EACvB,8BAA8B;EAC9B,mB3B5F6B,E2BkH9B;EA/BD;IAcI,WAAW,EACZ;EAfH;IAmBI,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,mBAAmB,EACpB;EAvBH;IAyBI,gBAAgB,EACjB;EAED;IA5BF;MA6BI,cAAc,EAEjB,EAAA;;AAQD;EACE,oB3BuIsC,E2B1FvC;EA9CD;IAII,kBAAqB;IACrB,qBAAqB;IACrB,kB3B5K2B,E2B6K5B;EAED;IATF;MAYM,iBAAiB;MACjB,YAAY;MACZ,YAAY;MACZ,cAAc;MACd,8BAA8B;MAC9B,UAAU;MACV,iBAAiB,EAYlB;MA9BL;;QAqBQ,2BAA2B,EAC5B;MAtBP;QAwBQ,kB3B9LuB,E2BmMxB;QA7BP;UA2BU,uBAAuB,EACxB,EAAA;EAMP;IAlCF;MAmCI,YAAY;MACZ,UAAU,EAUb;MA9CD;QAuCM,YAAY,EAKb;QA5CL;UAyCQ,kB3BgG2C;U2B/F3C,qB3B+F2C,E2B9F5C,EAAA;;AAWP;EACE,mB3BiFsC;E2BhFtC,oB3BgFsC;E2B/EtC,mB3B+EsC;E2B9EtC,kCAAkC;EAClC,qCAAqC;E5B7N7B,qF4B8NiD;EC7RzD,gBAA4B;EAC5B,mBAA+B,EDyThC;Eb2JC;Ia9LF;MbiMM,sBAAsB;MACtB,iBAAiB;MACjB,uBAAuB,EACxB;IapML;MbwMM,sBAAsB;MACtB,YAAY;MACZ,uBAAuB,EACxB;Ia3ML;Mb+MM,sBAAsB,EACvB;IahNL;MbmNM,sBAAsB;MACtB,uBAAuB,EAOxB;Ma3NL;;;QbyNQ,YAAY,EACb;Ia1NP;Mb+NM,YAAY,EACb;IahOL;MbmOM,iBAAiB;MACjB,uBAAuB,EACxB;IarOL;;Mb2OM,sBAAsB;MACtB,cAAc;MACd,iBAAiB;MACjB,uBAAuB,EAKxB;ManPL;;QbiPQ,gBAAgB,EACjB;IalPP;;MbsPM,mBAAmB;MACnB,eAAe,EAChB;IaxPL;Mb4PM,OAAO,EACR,EAAA;EahPD;IAbJ;MAcM,mBAAmB,EAMtB;MApBH;QAiBQ,iBAAiB,EAClB,EAAA;EAQL;IA1BF;MA2BI,YAAY;MACZ,UAAU;MACV,eAAe;MACf,gBAAgB;MAChB,eAAe;MACf,kBAAkB;M5BxPZ,iB4ByPkB,EAE3B,EAAA;;AAMD;EACE,cAAc;EHpUd,2BGqU4B;EHpU3B,0BGoU2B,EAC7B;;AAED;EACE,iBAAiB;EHzUjB,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BGmU+B;EHlU9B,6BGkU8B,EAChC;;AAOD;EChVE,gBAA4B;EAC5B,mBAA+B,EDwVhC;EATD;IChVE,iBAA4B;IAC5B,oBAA+B,EDoV9B;EALH;IChVE,iBAA4B;IAC5B,oBAA+B,EDuV9B;;AAQH;EChWE,iBAA4B;EAC5B,oBAA+B,EDuWhC;EALC;IAHF;MAII,YAAY;MACZ,kB3BIoC;M2BHpC,mB3BGoC,E2BDvC,EAAA;;AAWD;EACE;IACE,uBAAuB,EACxB;EACD;IACE,wBAAwB;IAC1B,oB3BhBsC,E2BqBrC;IAPD;MAKI,gBAAgB,EACjB,EAAA;;AASL;EACE,0B3BzBwC;E2B0BxC,sB3BzBuC,E2ByJxC;EAlID;IAKI,Y3BzB2C,E2B+B5C;IAXH;MAQM,e3BlB2C;M2BmB3C,8B3BlBgD,E2BmBjD;EAVL;IAcI,Y3BvCmC,E2BwCpC;EAfH;IAmBM,Y3BvCyC,E2B8C1C;IA1BL;MAuBQ,Y3B1CuC;M2B2CvC,8B3B1C8C,E2B2C/C;EAzBP;IA+BQ,Y3BhDuC;I2BiDvC,0B3BhDyC,E2BiD1C;EAjCP;IAuCQ,Y3BtDuC;I2BuDvC,8B3BtD8C,E2BuD/C;EAzCP;IA8CI,mB3BlD2C,E2B0D5C;IAtDH;MAiDM,uB3BvDyC,E2BwD1C;IAlDL;MAoDM,uB3BzDyC,E2B0D1C;EArDL;;IA0DI,sB3BjFqC,E2BkFtC;EA3DH;IAoEQ,0B3BpFyC;I2BqFzC,Y3BtFuC,E2BuFxC;EAGH;IAzEJ;MA6EU,Y3BjGqC,E2BuGtC;MAnFT;QAgFY,Y3BnGmC;Q2BoGnC,8B3BnG0C,E2BoG3C;IAlFX;MAwFY,Y3BzGmC;M2B0GnC,0B3BzGqC,E2B0GtC;IA1FX;MAgGY,Y3B/GmC;M2BgHnC,8B3B/G0C,E2BgH3C,EAAA;EAlGX;IA8GI,Y3BlI2C,E2BsI5C;IAlHH;MAgHM,Y3BnIyC,E2BoI1C;EAjHL;IAqHI,Y3BzI2C,E2BqJ5C;IAjIH;MAwHM,Y3B3IyC,E2B4I1C;IAzHL;;;MA8HQ,Y3B7IuC,E2B8IxC;;AAOP;EACE,uB3BrI8C;E2BsI9C,sB3BrIgD,E2BsQjD;EAnID;IAKI,e3BrI+C,E2B2IhD;IAXH;MAQM,Y3B9H0C;M2B+H1C,8B3B9HiD,E2B+HlD;EAVL;IAcI,e3BnJ+C,E2BoJhD;EAfH;IAmBM,e3BnJ6C,E2B0J9C;IA1BL;MAuBQ,Y3BtJwC;M2BuJxC,8B3BtJ+C,E2BuJhD;EAzBP;IA+BQ,Y3B9JwC;I2B+JxC,0B3B5J0C,E2B6J3C;EAjCP;IAuCQ,Y3BlKwC;I2BmKxC,8B3BlK+C,E2BmKhD;EAzCP;IA+CI,mB3B/J4C,E2BuK7C;IAvDH;MAkDM,uB3BpK0C,E2BqK3C;IAnDL;MAqDM,uB3BtK0C,E2BuK3C;EAtDL;;IA2DI,sBAAoB,EACrB;EA5DH;IAoEQ,0B3BhM0C;I2BiM1C,Y3BpMwC,E2BqMzC;EAGH;IAzEJ;MA6EU,sB3BhNwC,E2BiNzC;IA9ET;MAgFU,0B3BnNwC,E2BoNzC;IAjFT;MAmFU,e3BnNyC,E2ByN1C;MAzFT;QAsFY,Y3BrNoC;Q2BsNpC,8B3BrN2C,E2BsN5C;IAxFX;MA8FY,Y3B7NoC;M2B8NpC,0B3B3NsC,E2B4NvC;IAhGX;MAsGY,Y3BjOoC;M2BkOpC,8B3BjO2C,E2BkO5C,EAAA;EAxGX;IA+GI,e3B/O+C,E2BmPhD;IAnHH;MAiHM,Y3BhP0C,E2BiP3C;EAlHL;IAsHI,e3BtP+C,E2BkQhD;IAlIH;MAyHM,Y3BxP0C,E2ByP3C;IA1HL;;;MA+HQ,Y3B1PwC,E2B2PzC;;AE7oBP;EACE,kB7BqxBkC;E6BpxBlC,oB7B0D6B;E6BzD7B,iBAAiB;EACjB,0B7BoxBqC;E6BnxBrC,mB7BmG6B,E6BlF9B;EAtBD;IAQI,sBAAsB,EASvB;IAjBH;MAaM,cAA2C;MAC3C,eAAe;MACf,Y7B2wB8B,E6B1wB/B;EAhBL;IAoBI,e7BX4B,E6BY7B;;ACvBH;EACE,sBAAsB;EACtB,gBAAgB;EAChB,eAA+B;EAC/B,mB9BsG6B,E8BlC9B;EAxED;IAOI,gBAAgB,EA0BjB;IAjCH;;MAUM,mBAAmB;MACnB,YAAY;MACZ,kB9BgF0B;M8B/E1B,yB9B+C+B;M8B9C/B,sBAAsB;MACtB,e9BDwB;M8BExB,uB9BobqC;M8BnbrC,uB9BobqC;M8BnbrC,kBAAkB,EACnB;IAnBL;;MAuBQ,eAAe;MNXrB,+BxB8F6B;MwB7F1B,4BxB6F0B,E8BjFxB;IAzBP;;MNIE,gCxBsG6B;MwBrG1B,6BxBqG0B,E8B3ExB;EA/BP;;;IAuCM,WAAW;IACX,e9BPwB;I8BQxB,0B9B7B0B;I8B8B1B,mB9B+ZqC,E8B9ZtC;EA3CL;;;;IAmDM,WAAW;IACX,Y9BuZqC;I8BtZrC,0B9BvCwB;I8BwCxB,sB9BxCwB;I8ByCxB,gBAAgB,EACjB;EAxDL;;;;;;IAkEM,e9BvD0B;I8BwD1B,uB9B6YqC;I8B5YrC,mB9B6YqC;I8B5YrC,oB9B+JsC,E8B9JvC;;AAQL;;EC3EM,mB/B4F0B;E+B3F1B,gB/B6CwB;E+B5CxB,uB/BkG+B,E+BjGhC;;ADwEL;;ENlEE,+BxB+F6B;EwB9F1B,4BxB8F0B,E+BhGxB;;ADmEP;;EN1EE,gCxBuG6B;EwBtG1B,6BxBsG0B,E+B1FxB;;ADkEP;;EChFM,kB/B+F0B;E+B9F1B,gB/B8CwB;E+B7CxB,iB/BmGyB,E+BlG1B;;AD6EL;;ENvEE,+BxBgG6B;EwB/F1B,4BxB+F0B,E+BjGxB;;ADwEP;;EN/EE,gCxBwG6B;EwBvG1B,6BxBuG0B,E+B3FxB;;ACfP;EACE,gBAAgB;EAChB,eAA+B;EAC/B,iBAAiB;EACjB,mBAAmB,EA4CpB;EAhDD;I1BUI,aAAa;IACb,eAAe,EAChB;E0BZH;I1BcI,YAAY,EACb;E0BfH;IAOI,gBAAgB,EAejB;IAtBH;;MAUM,sBAAsB;MACtB,kBAAkB;MAClB,uBhCsbqC;MgCrbrC,uBhCsbqC;MgCrbrC,oBhC0cqC,EgCzctC;IAfL;;MAmBM,sBAAsB;MACtB,0BhCV0B,EgCW3B;EArBL;;IA2BM,aAAa,EACd;EA5BL;;IAkCM,YAAY,EACb;EAnCL;;;;IA2CM,ehClC0B;IgCmC1B,uBhCsZqC;IgCrZrC,oBhCqLsC,EgCpLvC;;AC/CL;EACE,gBAAgB;EAChB,wBAAwB;EACxB,eAAe;EACf,kBAAkB;EAClB,eAAe;EACf,YjC+jBgC;EiC9jBhC,mBAAmB;EACnB,oBAAoB;EACpB,yBAAyB;EACzB,qBAAqB,EActB;EAxBD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;;AAIH;EAGI,YjCyiB8B;EiCxiB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AAMH;ECxCE,0BlCW8B,EiC+B/B;EAFD;ICnCM,0BAAwB,EACzB;;ADsCL;EC5CE,0BlCc4B,EiCgC7B;EAFD;ICvCM,0BAAwB,EACzB;;AD0CL;EChDE,0BlCe6B,EiCmC9B;EAFD;IC3CM,0BAAwB,EACzB;;AD8CL;ECpDE,0BlCgB6B,EiCsC9B;EAFD;IC/CM,0BAAwB,EACzB;;ADkDL;ECxDE,0BlCiB6B,EiCyC9B;EAFD;ICnDM,0BAAwB,EACzB;;ADsDL;EC5DE,0BlCkB6B,EiC4C9B;EAFD;ICvDM,0BAAwB,EACzB;;ACHL;EACE,sBAAsB;EACtB,gBAAgB;EAChB,iBAAiB;EACjB,gBnC2C4B;EmC1C5B,kBnCswBgC;EmCrwBhC,YnC2vBgC;EmC1vBhC,enCqwB6B;EmCpwB7B,uBAAuB;EACvB,oBAAoB;EACpB,mBAAmB;EACnB,0BnCH8B;EmCI9B,oBnCiwBgC,EmC1tBjC;EAnDD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;EAED;;IAEE,OAAO;IACP,iBAAiB,EAClB;EAKD;;IAEE,enCzB0B;ImC0B1B,uBnCouB8B,EmCnuB/B;EAED;IACE,aAAa,EACd;EAED;IACE,kBAAkB,EACnB;EAED;IACE,iBAAiB,EAClB;;AAIH;EAGI,YnC0sB8B;EmCzsB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AC7DH;EACE,kBpCqemC;EoCpenC,qBpCoemC;EoCnenC,oBpCmemC;EoClenC,epCmesC;EoCletC,0BpCK8B,EoCsC/B;EAhDD;;IASI,epCgeoC,EoC/drC;EAVH;IAaI,oBAAkC;IAClC,gBpC4diC;IoC3djC,iBAAiB,EAClB;EAhBH;IAmBI,0BAAwB,EACzB;EAED;;IAEE,mBpCiF2B;IoChF3B,mBAAkC;IAClC,oBAAkC,EACnC;EA3BH;IA8BI,gBAAgB,EACjB;EAED;IAjCF;MAkCI,kBAAmC;MACnC,qBAAmC,EAatC;MAXG;;QAEE,mBAAkC;QAClC,oBAAkC,EACnC;MAzCL;;QA6CM,gBpC8b+B,EoC7bhC,EAAA;;AC7CL;EACE,eAAe;EACf,arCquB+B;EqCpuB/B,oBrCwD6B;EqCvD7B,yBrCqDmC;EqCpDnC,uBrCkB0B;EqCjB1B,uBrCquBgC;EqCpuBhC,mBrCgG6B;ED8ErB,oCsC7KkC,EAgB3C;EAxBD;;InCGE,eADmC;IAEnC,gBAAgB;IAChB,aAAa;ImCQX,kBAAkB;IAClB,mBAAmB,EACpB;EAfH;IAqBI,arC6tB6B;IqC5tB7B,erChB4B,EqCiB7B;;AAIH;;;EAGE,sBrCnB4B,EqCoB7B;;AC7BD;EACE,ctC0mBgC;EsCzmBhC,oBtCuD6B;EsCtD7B,8BAA8B;EAC9B,mBtCiG6B,EsC1E9B;EA3BD;IAQI,cAAc;IAEd,eAAe,EAChB;EAXH;IAeI,kBtC8lB8B,EsC7lB/B;EAhBH;;IAqBI,iBAAiB,EAClB;EAtBH;IAyBI,gBAAgB,EACjB;;AAOH;;EAEE,oBAA8B,EAS/B;EAXD;;IAMI,mBAAmB;IACnB,UAAU;IACV,aAAa;IACb,eAAe,EAChB;;AAOH;ECvDE,0BvCqfsC;EuCpftC,sBvCqfqC;EuCpfrC,evCkfsC,EsC3bvC;EAFD;IClDI,0BAAwB,EACzB;EDiDH;IC/CI,eAAa,EACd;;ADkDH;EC3DE,0BvCyfsC;EuCxftC,sBvCyfqC;EuCxfrC,evCsfsC,EsC3bvC;EAFD;ICtDI,0BAAwB,EACzB;EDqDH;ICnDI,eAAa,EACd;;ADsDH;EC/DE,0BvC6fsC;EuC5ftC,sBvC6fqC;EuC5frC,evC0fsC,EsC3bvC;EAFD;IC1DI,0BAAwB,EACzB;EDyDH;ICvDI,eAAa,EACd;;AD0DH;ECnEE,0BvCigBsC;EuChgBtC,sBvCigBqC;EuChgBrC,evC8fsC,EsC3bvC;EAFD;IC9DI,0BAAwB,EACzB;ED6DH;IC3DI,eAAa,EACd;;ACHH;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAInC;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAQnC;EACE,iBAAiB;EACjB,axCsC6B;EwCrC7B,oBxCqC6B;EwCpC7B,0BxCgnBmC;EwC/mBnC,mBxC+E6B;EDxCrB,+CyCtCgC,EACzC;;AAGD;EACE,YAAY;EACZ,UAAU;EACV,aAAa;EACb,gBxCc4B;EwCb5B,kBxCyB6B;EwCxB7B,YxCsmBgC;EwCrmBhC,mBAAmB;EACnB,0BxC1B4B;EDoDpB,+CyCzB+B;EzC+I/B,4ByC9I0B,EACnC;;AAOD;;ECGE,sMAAiC;EDAjC,2BAA2B,EAC5B;;AAMD;;EzC5CE,2DyC8C0D;EzC5ClD,mDyC4CkD,EAC3D;;AAMD;EErEE,0B1Ce6B,EwCwD9B;EEpEC;IDkDA,sMAAiC,EChDhC;;AFoEH;EEzEE,0B1CgB6B,EwC2D9B;EExEC;IDkDA,sMAAiC,EChDhC;;AFwEH;EE7EE,0B1CiB6B,EwC8D9B;EE5EC;IDkDA,sMAAiC,EChDhC;;AF4EH;EEjFE,0B1CkB6B,EwCiE9B;EEhFC;IDkDA,sMAAiC,EChDhC;;ACRH;EAEE,iBAAiB,EAKlB;EAPD;IAKI,cAAc,EACf;;AAGH;;EAEE,QAAQ;EACR,iBAAiB,EAClB;;AAED;EACE,eAAe,EAChB;;AAED;EACE,eAAe,EAMhB;EAPD;IAKI,gBAAgB,EACjB;;AAGH;;EAEE,mBAAmB,EACpB;;AAED;;EAEE,oBAAoB,EACrB;;AAED;;;EAGE,oBAAoB;EACpB,oBAAoB,EACrB;;AAED;EACE,uBAAuB,EACxB;;AAED;EACE,uBAAuB,EACxB;;AAGD;EACE,cAAc;EACd,mBAAmB,EACpB;;AAKD;EACE,gBAAgB;EAChB,iBAAiB,EAClB;;ACxDD;EAEE,oBAAoB;EACpB,gBAAgB,EACjB;;AAOD;EACE,mBAAmB;EACnB,eAAe;EACf,mBAAmB;EAEnB,oBAAoB;EACpB,uB5C0oBkC;E4CzoBlC,uB5C2oBkC,E4CjoBnC;EAjBD;IpBjBE,6BxB0G6B;IwBzG5B,4BxByG4B,E4C7E5B;EAZH;IAcI,iBAAiB;IpBvBnB,gCxBkG6B;IwBjG5B,+BxBiG4B,E4CzE5B;;AASH;;EAEE,Y5C6oBkC,E4ChoBnC;EAfD;;IAKI,Y5C4oBgC,E4C3oBjC;EANH;;;IAWI,sBAAsB;IACtB,Y5CmoBgC;I4CloBhC,0B5CinBmC,E4ChnBpC;;AAGH;EACE,YAAY;EACZ,iBAAiB,EAClB;;AAED;EAKI,0B5CzD4B;E4C0D5B,e5C3D4B;E4C4D5B,oB5C6JwC,E4CpJzC;EAhBH;IAWM,eAAe,EAChB;EAZL;IAcM,e5CnE0B,E4CoE3B;;AAfL;EAsBI,WAAW;EACX,Y5CwB4B;E4CvB5B,0B5C1E0B;E4C2E1B,sB5C3E0B,E4CsF3B;EApCH;;;;;;;IA+BM,eAAe,EAChB;EAhCL;IAkCM,e5C8kBiC,E4C7kBlC;;ACnGH;EACE,e7CmfoC;E6ClfpC,0B7CmfoC,E6ChfrC;;AAED;;EACE,e7C4eoC,E6C1drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CoekC;I6CnelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7C6dkC;I6C5dlC,sB7C4dkC,E6C3dnC;;AAzBH;EACE,e7CufoC;E6CtfpC,0B7CufoC,E6CpfrC;;AAED;;EACE,e7CgfoC,E6C9drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CwekC;I6CvelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CiekC;I6ChelC,sB7CgekC,E6C/dnC;;AAzBH;EACE,e7C2foC;E6C1fpC,0B7C2foC,E6CxfrC;;AAED;;EACE,e7CofoC,E6ClerC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7C4ekC;I6C3elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CqekC;I6CpelC,sB7CoekC,E6CnenC;;AAzBH;EACE,e7C+foC;E6C9fpC,0B7C+foC,E6C5frC;;AAED;;EACE,e7CwfoC,E6CterC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CgfkC;I6C/elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CyekC;I6CxelC,sB7CwekC,E6CvenC;;AD8FL;EACE,cAAc;EACd,mBAAmB,EACpB;;AACD;EACE,iBAAiB;EACjB,iBAAiB,EAClB;;AE3HD;EACE,oB9C0D6B;E8CzD7B,uB9C6rBgC;E8C5rBhC,8BAA8B;EAC9B,mB9CmG6B;EDxCrB,0C+C1D0B,EACnC;;AAGD;EACE,c9CsrBgC,E8CprBjC;EAHD;IxCAI,aAAa;IACb,eAAe,EAChB;EwCFH;IxCII,YAAY,EACb;;AwCCH;EACE,mB9CirBqC;E8ChrBrC,qCAAqC;EtBpBrC,6BsBqBgD;EtBpB/C,4BsBoB+C,EAKjD;EARD;IAMI,eAAe,EAChB;;AAIH;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAe;EACf,eAAe,EAShB;EAbD;;;;;IAWI,eAAe,EAChB;;AAIH;EACE,mB9CspBqC;E8CrpBrC,0B9C2pBmC;E8C1pBnC,2B9CypBgC;EwBjsBhC,gCsByCmD;EtBxClD,+BsBwCkD,EACpD;;AAQD;;EAGI,iBAAiB,EAsBlB;EAzBH;;IAMM,oBAAoB;IACpB,iBAAiB,EAClB;EARL;;IAaQ,cAAc;ItBvEpB,6BsBwEsD;ItBvErD,4BsBuEqD,EACjD;EAfP;;IAqBQ,iBAAiB;ItBvEvB,gCsBwEyD;ItBvExD,+BsBuEwD,EACpD;;AAvBP;EtB1DE,2BsBsFgC;EtBrF/B,0BsBqF+B,EAC7B;;AAIL;EAEI,oBAAoB,EACrB;;AAEH;EACE,oBAAoB,EACrB;;AAOD;;;EAII,iBAAiB,EAMlB;EAVH;;;IAOM,mB9CmlB4B;I8CllB5B,oB9CklB4B,E8CjlB7B;;AATL;;EtBzGE,6BsBuHkD;EtBtHjD,4BsBsHiD,EAkBjD;EAhCH;;;;IAmBQ,4BAA6C;IAC7C,6BAA8C,EAU/C;IA9BP;;;;;;;;MAwBU,4BAA6C,EAC9C;IAzBT;;;;;;;;MA4BU,6BAA8C,EAC/C;;AA7BT;;EtBjGE,gCsBqIqD;EtBpIpD,+BsBoIoD,EAkBpD;EAtDH;;;;IAyCQ,+BAAgD;IAChD,gCAAiD,EAUlD;IApDP;;;;;;;;MA8CU,+BAAgD,EACjD;IA/CT;;;;;;;;MAkDU,gCAAiD,EAClD;;AAnDT;;;;EA2DI,2B9CzBgC,E8C0BjC;;AA5DH;;EA+DI,cAAc,EACf;;AAhEH;;EAmEI,UAAU,EAiCX;EApGH;;;;;;;;;;;;IA0EU,eAAe,EAChB;EA3ET;;;;;;;;;;;;IA8EU,gBAAgB,EACjB;EA/ET;;;;;;;;IAuFU,iBAAiB,EAClB;EAxFT;;;;;;;;IAgGU,iBAAiB,EAClB;;AAjGT;EAsGI,UAAU;EACV,iBAAiB,EAClB;;AASH;EACE,oB9C7J6B,E8CwL9B;EA5BD;IAKI,iBAAiB;IACjB,mB9CtH2B,E8C2H5B;IAXH;MASM,gBAAgB,EACjB;EAVL;IAcI,iBAAiB,EAMlB;IApBH;;MAkBM,2B9C6d4B,E8C5d7B;EAnBL;IAuBI,cAAc,EAIf;IA3BH;MAyBM,8B9Csd4B,E8Crd7B;;AAML;EC1PE,mB/C6sBgC,E8CjdjC;EAFD;ICvPI,e/CM4B;I+CL5B,0B/C0sBiC;I+CzsBjC,mB/CwsB8B,E+C/rB/B;ID4OH;MClPM,uB/CqsB4B,E+CpsB7B;IDiPL;MC/OM,e/CmsB+B;M+ClsB/B,0B/CH0B,E+CI3B;ED6OL;ICzOM,0B/C4rB4B,E+C3rB7B;;AD2OL;EC7PE,sB/Cc4B,E8CiP7B;EAFD;IC1PI,Y/C6sB8B;I+C5sB9B,0B/CU0B;I+CT1B,sB/CS0B,E+CA3B;ID+OH;MCrPM,0B/CMwB,E+CLzB;IDoPL;MClPM,e/CGwB;M+CFxB,uB/CosB4B,E+CnsB7B;EDgPL;IC5OM,6B/CHwB,E+CIzB;;AD8OL;EChQE,sB/CsfqC,E8CpPtC;EAFD;IC7PI,e/CifoC;I+ChfpC,0B/CifoC;I+ChfpC,sB/CifmC,E+CxepC;IDkPH;MCxPM,0B/C8eiC,E+C7elC;IDuPL;MCrPM,e/C0ekC;M+CzelC,0B/CwekC,E+CvenC;EDmPL;IC/OM,6B/CqeiC,E+CpelC;;ADiPL;ECnQE,sB/C0fqC,E8CrPtC;EAFD;IChQI,e/CqfoC;I+CpfpC,0B/CqfoC;I+CpfpC,sB/CqfmC,E+C5epC;IDqPH;MC3PM,0B/CkfiC,E+CjflC;ID0PL;MCxPM,e/C8ekC;M+C7elC,0B/C4ekC,E+C3enC;EDsPL;IClPM,6B/CyeiC,E+CxelC;;ADoPL;ECtQE,sB/C8fqC,E8CtPtC;EAFD;ICnQI,e/CyfoC;I+CxfpC,0B/CyfoC;I+CxfpC,sB/CyfmC,E+ChfpC;IDwPH;MC9PM,0B/CsfiC,E+CrflC;ID6PL;MC3PM,e/CkfkC;M+CjflC,0B/CgfkC,E+C/enC;EDyPL;ICrPM,6B/C6eiC,E+C5elC;;ADuPL;ECzQE,sB/CkgBqC,E8CvPtC;EAFD;ICtQI,e/C6foC;I+C5fpC,0B/C6foC;I+C5fpC,sB/C6fmC,E+CpfpC;ID2PH;MCjQM,0B/C0fiC,E+CzflC;IDgQL;MC9PM,e/CsfkC;M+CrflC,0B/CofkC,E+CnfnC;ED4PL;ICxPM,6B/CifiC,E+ChflC;;ACjBL;EACE,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,WAAW;EACX,iBAAiB,EAelB;EApBD;;;;;IAYI,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,UAAU,EACX;;AAIH;EACE,uBAAuB,EACxB;;AAGD;EACE,oBAAoB,EACrB;;AC5BD;EACE,iBAAiB;EACjB,cAAc;EACd,oBAAoB;EACpB,0BjDqvBmC;EiDpvBnC,0BjDqvBkC;EiDpvBlC,mBjDiG6B;EDxCrB,gDkDxDgC,EAKzC;EAZD;IASI,mBAAmB;IACnB,kCAAkB,EACnB;;AAIH;EACE,cAAc;EACd,mBjDuF6B,EiDtF9B;;AACD;EACE,aAAa;EACb,mBjDoF6B,EiDnF9B;;ACvBD;EACE,aAAa;EACb,gBAA2B;EAC3B,kBlDmzBgC;EkDlzBhC,eAAe;EACf,YlDkzBgC;EkDjzBhC,0BlDkzBwC;EkB1zBxC,agCSmB;EhCNnB,0BAAa,EgCiBd;EAlBD;IAWI,YlD4yB8B;IkD3yB9B,sBAAsB;IACtB,gBAAgB;IhCflB,agCgBqB;IhCbrB,0BAAa,EgCcZ;;AASH;EACE,WAAW;EACX,gBAAgB;EAChB,wBAAwB;EACxB,UAAU;EACV,yBAAyB,EAC1B;;ACzBD;EACE,iBAAiB,EAClB;;AAGD;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDmQ6B;EmDlQ7B,kCAAkC;EAIlC,WAAW,EAQZ;EArBD;IpD0HE,sCAA4B;IAGpB,8BAAoB;IAqEpB,4CoDhLqC;IpDgLrC,oCoDhLqC,EAC5C;EAnBH;IpD0HE,mCAA4B;IAGpB,2BAAoB,EoDzGoB;;AAElD;EACE,mBAAmB;EACnB,iBAAiB,EAClB;;AAGD;EACE,mBAAmB;EACnB,YAAY;EACZ,aAAa,EACd;;AAGD;EACE,mBAAmB;EACnB,uBnDuiBiD;EmDtiBjD,uBnD0iBiD;EmDziBjD,qCnDuiBiD;EmDtiBjD,mBnDuD6B;EDzCrB,yCoDb0B;EAClC,6BAA6B;EAE7B,WAAW,EACZ;;AAGD;EACE,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDoN6B;EmDnN7B,uBnD4hBgC,EmDxhBjC;EAXD;IjC5DE,WiCqE2B;IjClE3B,yBAAa,EiCkEmB;EATlC;IjC5DE,alBimB8B;IkB9lB9B,0BAAa,EiCmEuC;;AAKtD;EACE,cnDugBgC;EmDtgBhC,iCnDshBmC,EmDphBpC;EAJD;I7C/DI,aAAa;IACb,eAAe,EAChB;E6C6DH;I7C3DI,YAAY,EACb;;A6CgEH;EACE,iBAAiB,EAClB;;AAGD;EACE,UAAU;EACV,yBnD5BmC,EmD6BpC;;AAID;EACE,mBAAmB;EACnB,cnDifgC,EmDhfjC;;AAGD;EACE,cnD4egC;EmD3ehC,kBAAkB;EAClB,8BnD6fmC,EmD7epC;EAnBD;I7CvFI,aAAa;IACb,eAAe,EAChB;E6CqFH;I7CnFI,YAAY,EACb;E6CkFH;IAQI,iBAAiB;IACjB,iBAAiB,EAClB;EAVH;IAaI,kBAAkB,EACnB;EAdH;IAiBI,eAAe,EAChB;;AAIH;EACE,mBAAmB;EACnB,aAAa;EACb,YAAY;EACZ,aAAa;EACb,iBAAiB,EAClB;;AAGD;EAEE;IACE,anDme+B;ImDle/B,kBAAkB,EACnB;EACD;IpDtEQ,0CoDuE6B,EACpC;EAGD;IAAY,anD4dqB,EmD5dD,EAAA;;AAGlC;EACE;IAAY,anDsdqB,EmDtdD,EAAA;;AC9IlC;EACE,mBAAmB;EACnB,cpD+Q6B;EoD9Q7B,eAAe;ECRf,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EDHlB,gBpDwC4B;EkBlD5B,WkCYkB;ElCTlB,yBAAa,EkCgBd;EAhBD;IlCHE,alB+gB8B;IkB5gB9B,0BAAa,EkCWoC;EAXnD;IAYa,iBAAkB;IAAE,eAA+B,EAAI;EAZpE;IAaa,iBAAkB;IAAE,epDkgBA,EoDlgBmC;EAbpE;IAca,gBAAkB;IAAE,eAA+B,EAAI;EAdpE;IAea,kBAAkB;IAAE,epDggBA,EoDhgBmC;;AAIpE;EACE,iBpDmfiC;EoDlfjC,iBAAiB;EACjB,YpDmfgC;EoDlfhC,mBAAmB;EACnB,uBpDmfgC;EoDlfhC,mBpD8E6B,EoD7E9B;;AAGD;EACE,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAED;EAEI,UAAU;EACV,UAAU;EACV,kBpDse6B;EoDre7B,wBAAyD;EACzD,uBpDge8B,EoD/d/B;;AAPH;EASI,UAAU;EACV,WpDge6B;EoD/d7B,oBpD+d6B;EoD9d7B,wBAAyD;EACzD,uBpDyd8B,EoDxd/B;;AAdH;EAgBI,UAAU;EACV,UpDyd6B;EoDxd7B,oBpDwd6B;EoDvd7B,wBAAyD;EACzD,uBpDkd8B,EoDjd/B;;AArBH;EAuBI,SAAS;EACT,QAAQ;EACR,iBpDid6B;EoDhd7B,4BAA8E;EAC9E,yBpD2c8B,EoD1c/B;;AA5BH;EA8BI,SAAS;EACT,SAAS;EACT,iBpD0c6B;EoDzc7B,4BpDyc6B;EoDxc7B,wBpDoc8B,EoDnc/B;;AAnCH;EAqCI,OAAO;EACP,UAAU;EACV,kBpDmc6B;EoDlc7B,wBpDkc6B;EoDjc7B,0BpD6b8B,EoD5b/B;;AA1CH;EA4CI,OAAO;EACP,WpD6b6B;EoD5b7B,iBpD4b6B;EoD3b7B,wBpD2b6B;EoD1b7B,0BpDsb8B,EoDrb/B;;AAjDH;EAmDI,OAAO;EACP,UpDsb6B;EoDrb7B,iBpDqb6B;EoDpb7B,wBpDob6B;EoDnb7B,0BpD+a8B,EoD9a/B;;AE9FH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,ctD6Q6B;EsD5Q7B,cAAc;EACd,iBtDshByC;EsDrhBzC,aAAa;EDXb,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;ECAlB,gBtDmC4B;EsDjC5B,uBtD6gBwC;EsD5gBxC,6BAA6B;EAC7B,uBtDihBwC;EsDhhBxC,qCtD8gBwC;EsD7gBxC,mBtDwF6B;EDzCrB,0CuD9C2B,EAOpC;EAzBD;IAqBc,kBtDihB4B,EsDjhBS;EArBnD;IAsBc,kBtDghB4B,EsDhhBS;EAtBnD;IAuBc,iBtD+gB4B,EsD/gBQ;EAvBlD;IAwBc,mBtD8gB4B,EsD9gBU;;AAGpD;EACE,UAAU;EACV,kBAAkB;EAClB,gBtDgB4B;EsDf5B,0BtDogB0C;EsDngB1C,iCAA+B;EAC/B,2BAAwE,EACzE;;AAED;EACE,kBAAkB,EACnB;;AAMD;EAGI,mBAAmB;EACnB,eAAe;EACf,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAEH;EACE,mBtDmfyD,EsDlf1D;;AACD;EACE,mBtD2ewC;EsD1exC,YAAY,EACb;;AAED;EAEI,UAAU;EACV,mBtDyeuD;EsDxevD,uBAAuB;EACvB,0BtD2ewC;EsD1exC,sCtDweyC;EsDvezC,ctDqeuD,EsD7dxD;EAfH;IASM,aAAa;IACb,YAAY;IACZ,mBtD4doC;IsD3dpC,uBAAuB;IACvB,uBtD8coC,EsD7crC;;AAdL;EAiBI,SAAS;EACT,YtD0duD;EsDzdvD,kBtDyduD;EsDxdvD,qBAAqB;EACrB,4BtD2dwC;EsD1dxC,wCtDwdyC,EsDhd1C;EA9BH;IAwBM,aAAa;IACb,UAAU;IACV,ctD6coC;IsD5cpC,qBAAqB;IACrB,yBtD+boC,EsD9brC;;AA7BL;EAgCI,UAAU;EACV,mBtD2cuD;EsD1cvD,oBAAoB;EACpB,6BtD6cwC;EsD5cxC,yCtD0cyC;EsDzczC,WtDucuD,EsD/bxD;EA7CH;IAuCM,aAAa;IACb,SAAS;IACT,mBtD8boC;IsD7bpC,oBAAoB;IACpB,0BtDgboC,EsD/arC;;AA5CL;EAgDI,SAAS;EACT,atD2buD;EsD1bvD,kBtD0buD;EsDzbvD,sBAAsB;EACtB,2BtD4bwC;EsD3bxC,uCtDybyC,EsDjb1C;EA7DH;IAuDM,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,wBtDiaoC;IsDhapC,ctD4aoC,EsD3arC;;AC1HL;EACE,mBAAmB,EACpB;;AAED;EACE,mBAAmB;EACnB,iBAAiB;EACjB,YAAY,EA0Eb;EA7ED;IAMI,cAAc;IACd,mBAAmB;IxD0Kb,kCwDzKkC,EAgCzC;IAxCH;;MrDDE,eADmC;MAEnC,gBAAgB;MAChB,aAAa;MqDaT,eAAe,EAChB;IAGD;MAlBJ;QxDuMU,+CwDpL0C;QxDoL1C,uCwDpL0C;QxD4BlD,oCwD3BuC;QxD6B/B,4BwD7B+B;QxDuIvC,4BwDtI+B;QxDwIvB,oBwDxIuB,EAmB9B;QAxCH;UxDqIE,2CAA8B;UACtB,mCAAsB;UwD5GxB,QAAQ,EACT;QA3BP;UxDqIE,4CAA8B;UACtB,oCAAsB;UwDvGxB,QAAQ,EACT;QAhCP;UxDqIE,wCAA8B;UACtB,gCAAsB;UwDjGxB,QAAQ,EACT,EAAA;EAtCP;;;IA6CI,eAAe,EAChB;EA9CH;IAiDI,QAAQ,EACT;EAlDH;;IAsDI,mBAAmB;IACnB,OAAO;IACP,YAAY,EACb;EAzDH;IA4DI,WAAW,EACZ;EA7DH;IA+DI,YAAY,EACb;EAhEH;;IAmEI,QAAQ,EACT;EApEH;IAuEI,YAAY,EACb;EAxEH;IA0EI,WAAW,EACZ;;AAOH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,UAAU;EACV,WvD4sB+C;EkB1yB/C,alB2yB8C;EkBxyB9C,0BAAa;EqC6Fb,gBvD4sBgD;EuD3sBhD,YvDwsBgD;EuDvsBhD,mBAAmB;EACnB,0CvDosB0D;EuDnsB1D,8BAAsB,EA+DvB;EA1ED;IdjFE,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EciGvJ;EAlBH;IAoBI,WAAW;IACX,SAAS;IdtGX,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EcsGvJ;EAvBH;IA4BI,WAAW;IACX,YvDmrB8C;IuDlrB9C,sBAAsB;IrCvHxB,aqCwHqB;IrCrHrB,0BAAa,EqCsHZ;EAhCH;;;;IAuCI,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,WAAW;IACX,sBAAsB,EACvB;EA5CH;;IA+CI,UAAU;IACV,mBAAmB,EACpB;EAjDH;;IAoDI,WAAW;IACX,oBAAoB,EACrB;EAtDH;;IAyDI,YAAa;IACb,aAAa;IACb,eAAe;IACf,mBAAmB,EACpB;EA7DH;IAkEM,iBAAiB,EAClB;EAnEL;IAuEM,iBAAiB,EAClB;;AASL;EACE,mBAAmB;EACnB,aAAa;EACb,UAAU;EACV,YAAY;EACZ,WAAW;EACX,kBAAkB;EAClB,gBAAgB;EAChB,iBAAiB;EACjB,mBAAmB,EA8BpB;EAvCD;IAYI,sBAAsB;IACtB,YAAa;IACb,aAAa;IACb,YAAY;IACZ,oBAAoB;IACpB,uBvDonB8C;IuDnnB9C,oBAAoB;IACpB,gBAAgB;IAWhB,0BAA0B;IAC1B,8BAAsB,EACvB;EAhCH;IAkCI,UAAU;IACV,YAAa;IACb,aAAa;IACb,uBvD+lB8C,EuD9lB/C;;AAMH;EACE,mBAAmB;EACnB,UAAU;EACV,WAAW;EACX,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,qBAAqB;EACrB,YvDmlBgD;EuDllBhD,mBAAmB;EACnB,0CvDukB0D,EuDnkB3D;EAdD;IAYI,kBAAkB,EACnB;;AAKH;EAGE;;;;IAKI,YAAmC;IACnC,aAAoC;IACpC,kBAAwC;IACxC,gBAAuC,EACxC;EATH;;IAYI,mBAAyC,EAC1C;EAbH;;IAgBI,oBAA0C,EAC3C;EAIH;IACE,UAAU;IACV,WAAW;IACX,qBAAqB,EACtB;EAGD;IACE,aAAa,EACd,EAAA;;ACpQH;ElDOI,aAAa;EACb,eAAe,EAChB;;AkDTH;ElDWI,YAAY,EACb;;AkDTH;ECRE,eAAe;EACf,kBAAkB;EAClB,mBAAmB,EDQpB;;AACD;EACE,wBAAwB,EACzB;;AACD;EACE,uBAAuB,EACxB;;AAOD;EACE,yBAAyB,EAC1B;;AACD;EACE,0BAA0B,EAC3B;;AACD;EACE,mBAAmB,EACpB;;AACD;EEzBE,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,8BAA8B;EAC9B,UAAU,EFuBX;;AAOD;EACE,yBAAyB,EAC1B;;AAMD;EACE,gBAAgB,EACjB;;AGjCC;EACE,oBAAoB,EAAA;;ACNtB;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;ADiBH;;;;;;;;;;;;EAYE,yBAAyB,EAC1B;;AAED;EC5CE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD2CrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC/DE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD8DrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EClFE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADiFrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;ECrGE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADoGrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC9GE;IACE,yBAAyB,EAC1B,EAAA;;ADgHH;EClHE;IACE,yBAAyB,EAC1B,EAAA;;ADoHH;ECtHE;IACE,yBAAyB,EAC1B,EAAA;;ADwHH;EC1HE;IACE,yBAAyB,EAC1B,EAAA;;AAFD;EACE,yBAAyB,EAC1B;;ADqIH;ECjJE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD+IvC;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,0BAA0B,EAE7B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,2BAA2B,EAE9B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,iCAAiC,EAEpC,EAAA;;AAED;EChKE;IACE,yBAAyB,EAC1B,EAAA","file":"app.css","sourcesContent":["@charset \"UTF-8\";\n@import url(https://fonts.googleapis.com/css?family=Lato);\n/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%; }\n\nbody {\n  margin: 0; }\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline; }\n\naudio:not([controls]) {\n  display: none;\n  height: 0; }\n\n[hidden],\ntemplate {\n  display: none; }\n\na {\n  background-color: transparent; }\n\na:active,\na:hover {\n  outline: 0; }\n\nabbr[title] {\n  border-bottom: 1px dotted; }\n\nb,\nstrong {\n  font-weight: bold; }\n\ndfn {\n  font-style: italic; }\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0; }\n\nmark {\n  background: #ff0;\n  color: #000; }\n\nsmall {\n  font-size: 80%; }\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline; }\n\nsup {\n  top: -0.5em; }\n\nsub {\n  bottom: -0.25em; }\n\nimg {\n  border: 0; }\n\nsvg:not(:root) {\n  overflow: hidden; }\n\nfigure {\n  margin: 1em 40px; }\n\nhr {\n  box-sizing: content-box;\n  height: 0; }\n\npre {\n  overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em; }\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0; }\n\nbutton {\n  overflow: visible; }\n\nbutton,\nselect {\n  text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer; }\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0; }\n\ninput {\n  line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0; }\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto; }\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none; }\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em; }\n\nlegend {\n  border: 0;\n  padding: 0; }\n\ntextarea {\n  overflow: auto; }\n\noptgroup {\n  font-weight: bold; }\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0; }\n\ntd,\nth {\n  padding: 0; }\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important; }\n  a,\n  a:visited {\n    text-decoration: underline; }\n  a[href]:after {\n    content: \" (\" attr(href) \")\"; }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\"; }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\"; }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid; }\n  thead {\n    display: table-header-group; }\n  tr,\n  img {\n    page-break-inside: avoid; }\n  img {\n    max-width: 100% !important; }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3; }\n  h2,\n  h3 {\n    page-break-after: avoid; }\n  .navbar {\n    display: none; }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important; }\n  .label {\n    border: 1px solid #000; }\n  .table {\n    border-collapse: collapse !important; }\n    .table td,\n    .table th {\n      background-color: #fff !important; }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important; } }\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot\");\n  src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\"); }\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon-asterisk:before {\n  content: \"\\002a\"; }\n\n.glyphicon-plus:before {\n  content: \"\\002b\"; }\n\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\"; }\n\n.glyphicon-minus:before {\n  content: \"\\2212\"; }\n\n.glyphicon-cloud:before {\n  content: \"\\2601\"; }\n\n.glyphicon-envelope:before {\n  content: \"\\2709\"; }\n\n.glyphicon-pencil:before {\n  content: \"\\270f\"; }\n\n.glyphicon-glass:before {\n  content: \"\\e001\"; }\n\n.glyphicon-music:before {\n  content: \"\\e002\"; }\n\n.glyphicon-search:before {\n  content: \"\\e003\"; }\n\n.glyphicon-heart:before {\n  content: \"\\e005\"; }\n\n.glyphicon-star:before {\n  content: \"\\e006\"; }\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\"; }\n\n.glyphicon-user:before {\n  content: \"\\e008\"; }\n\n.glyphicon-film:before {\n  content: \"\\e009\"; }\n\n.glyphicon-th-large:before {\n  content: \"\\e010\"; }\n\n.glyphicon-th:before {\n  content: \"\\e011\"; }\n\n.glyphicon-th-list:before {\n  content: \"\\e012\"; }\n\n.glyphicon-ok:before {\n  content: \"\\e013\"; }\n\n.glyphicon-remove:before {\n  content: \"\\e014\"; }\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\"; }\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\"; }\n\n.glyphicon-off:before {\n  content: \"\\e017\"; }\n\n.glyphicon-signal:before {\n  content: \"\\e018\"; }\n\n.glyphicon-cog:before {\n  content: \"\\e019\"; }\n\n.glyphicon-trash:before {\n  content: \"\\e020\"; }\n\n.glyphicon-home:before {\n  content: \"\\e021\"; }\n\n.glyphicon-file:before {\n  content: \"\\e022\"; }\n\n.glyphicon-time:before {\n  content: \"\\e023\"; }\n\n.glyphicon-road:before {\n  content: \"\\e024\"; }\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\"; }\n\n.glyphicon-download:before {\n  content: \"\\e026\"; }\n\n.glyphicon-upload:before {\n  content: \"\\e027\"; }\n\n.glyphicon-inbox:before {\n  content: \"\\e028\"; }\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\"; }\n\n.glyphicon-repeat:before {\n  content: \"\\e030\"; }\n\n.glyphicon-refresh:before {\n  content: \"\\e031\"; }\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\"; }\n\n.glyphicon-lock:before {\n  content: \"\\e033\"; }\n\n.glyphicon-flag:before {\n  content: \"\\e034\"; }\n\n.glyphicon-headphones:before {\n  content: \"\\e035\"; }\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\"; }\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\"; }\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\"; }\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\"; }\n\n.glyphicon-barcode:before {\n  content: \"\\e040\"; }\n\n.glyphicon-tag:before {\n  content: \"\\e041\"; }\n\n.glyphicon-tags:before {\n  content: \"\\e042\"; }\n\n.glyphicon-book:before {\n  content: \"\\e043\"; }\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\"; }\n\n.glyphicon-print:before {\n  content: \"\\e045\"; }\n\n.glyphicon-camera:before {\n  content: \"\\e046\"; }\n\n.glyphicon-font:before {\n  content: \"\\e047\"; }\n\n.glyphicon-bold:before {\n  content: \"\\e048\"; }\n\n.glyphicon-italic:before {\n  content: \"\\e049\"; }\n\n.glyphicon-text-height:before {\n  content: \"\\e050\"; }\n\n.glyphicon-text-width:before {\n  content: \"\\e051\"; }\n\n.glyphicon-align-left:before {\n  content: \"\\e052\"; }\n\n.glyphicon-align-center:before {\n  content: \"\\e053\"; }\n\n.glyphicon-align-right:before {\n  content: \"\\e054\"; }\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\"; }\n\n.glyphicon-list:before {\n  content: \"\\e056\"; }\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\"; }\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\"; }\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\"; }\n\n.glyphicon-picture:before {\n  content: \"\\e060\"; }\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\"; }\n\n.glyphicon-adjust:before {\n  content: \"\\e063\"; }\n\n.glyphicon-tint:before {\n  content: \"\\e064\"; }\n\n.glyphicon-edit:before {\n  content: \"\\e065\"; }\n\n.glyphicon-share:before {\n  content: \"\\e066\"; }\n\n.glyphicon-check:before {\n  content: \"\\e067\"; }\n\n.glyphicon-move:before {\n  content: \"\\e068\"; }\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\"; }\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\"; }\n\n.glyphicon-backward:before {\n  content: \"\\e071\"; }\n\n.glyphicon-play:before {\n  content: \"\\e072\"; }\n\n.glyphicon-pause:before {\n  content: \"\\e073\"; }\n\n.glyphicon-stop:before {\n  content: \"\\e074\"; }\n\n.glyphicon-forward:before {\n  content: \"\\e075\"; }\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\"; }\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\"; }\n\n.glyphicon-eject:before {\n  content: \"\\e078\"; }\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\"; }\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\"; }\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\"; }\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\"; }\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\"; }\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\"; }\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\"; }\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\"; }\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\"; }\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\"; }\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\"; }\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\"; }\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\"; }\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\"; }\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\"; }\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\"; }\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\"; }\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\"; }\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\"; }\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\"; }\n\n.glyphicon-gift:before {\n  content: \"\\e102\"; }\n\n.glyphicon-leaf:before {\n  content: \"\\e103\"; }\n\n.glyphicon-fire:before {\n  content: \"\\e104\"; }\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\"; }\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\"; }\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\"; }\n\n.glyphicon-plane:before {\n  content: \"\\e108\"; }\n\n.glyphicon-calendar:before {\n  content: \"\\e109\"; }\n\n.glyphicon-random:before {\n  content: \"\\e110\"; }\n\n.glyphicon-comment:before {\n  content: \"\\e111\"; }\n\n.glyphicon-magnet:before {\n  content: \"\\e112\"; }\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\"; }\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\"; }\n\n.glyphicon-retweet:before {\n  content: \"\\e115\"; }\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\"; }\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\"; }\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\"; }\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\"; }\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\"; }\n\n.glyphicon-hdd:before {\n  content: \"\\e121\"; }\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\"; }\n\n.glyphicon-bell:before {\n  content: \"\\e123\"; }\n\n.glyphicon-certificate:before {\n  content: \"\\e124\"; }\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\"; }\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\"; }\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\"; }\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\"; }\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\"; }\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\"; }\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\"; }\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\"; }\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\"; }\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\"; }\n\n.glyphicon-globe:before {\n  content: \"\\e135\"; }\n\n.glyphicon-wrench:before {\n  content: \"\\e136\"; }\n\n.glyphicon-tasks:before {\n  content: \"\\e137\"; }\n\n.glyphicon-filter:before {\n  content: \"\\e138\"; }\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\"; }\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\"; }\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\"; }\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\"; }\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\"; }\n\n.glyphicon-link:before {\n  content: \"\\e144\"; }\n\n.glyphicon-phone:before {\n  content: \"\\e145\"; }\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\"; }\n\n.glyphicon-usd:before {\n  content: \"\\e148\"; }\n\n.glyphicon-gbp:before {\n  content: \"\\e149\"; }\n\n.glyphicon-sort:before {\n  content: \"\\e150\"; }\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\"; }\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\"; }\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\"; }\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\"; }\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\"; }\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\"; }\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\"; }\n\n.glyphicon-expand:before {\n  content: \"\\e158\"; }\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\"; }\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\"; }\n\n.glyphicon-log-in:before {\n  content: \"\\e161\"; }\n\n.glyphicon-flash:before {\n  content: \"\\e162\"; }\n\n.glyphicon-log-out:before {\n  content: \"\\e163\"; }\n\n.glyphicon-new-window:before {\n  content: \"\\e164\"; }\n\n.glyphicon-record:before {\n  content: \"\\e165\"; }\n\n.glyphicon-save:before {\n  content: \"\\e166\"; }\n\n.glyphicon-open:before {\n  content: \"\\e167\"; }\n\n.glyphicon-saved:before {\n  content: \"\\e168\"; }\n\n.glyphicon-import:before {\n  content: \"\\e169\"; }\n\n.glyphicon-export:before {\n  content: \"\\e170\"; }\n\n.glyphicon-send:before {\n  content: \"\\e171\"; }\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\"; }\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\"; }\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\"; }\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\"; }\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\"; }\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\"; }\n\n.glyphicon-transfer:before {\n  content: \"\\e178\"; }\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\"; }\n\n.glyphicon-header:before {\n  content: \"\\e180\"; }\n\n.glyphicon-compressed:before {\n  content: \"\\e181\"; }\n\n.glyphicon-earphone:before {\n  content: \"\\e182\"; }\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\"; }\n\n.glyphicon-tower:before {\n  content: \"\\e184\"; }\n\n.glyphicon-stats:before {\n  content: \"\\e185\"; }\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\"; }\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\"; }\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\"; }\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\"; }\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\"; }\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\"; }\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\"; }\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\"; }\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\"; }\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\"; }\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\"; }\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\"; }\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\"; }\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\"; }\n\n.glyphicon-cd:before {\n  content: \"\\e201\"; }\n\n.glyphicon-save-file:before {\n  content: \"\\e202\"; }\n\n.glyphicon-open-file:before {\n  content: \"\\e203\"; }\n\n.glyphicon-level-up:before {\n  content: \"\\e204\"; }\n\n.glyphicon-copy:before {\n  content: \"\\e205\"; }\n\n.glyphicon-paste:before {\n  content: \"\\e206\"; }\n\n.glyphicon-alert:before {\n  content: \"\\e209\"; }\n\n.glyphicon-equalizer:before {\n  content: \"\\e210\"; }\n\n.glyphicon-king:before {\n  content: \"\\e211\"; }\n\n.glyphicon-queen:before {\n  content: \"\\e212\"; }\n\n.glyphicon-pawn:before {\n  content: \"\\e213\"; }\n\n.glyphicon-bishop:before {\n  content: \"\\e214\"; }\n\n.glyphicon-knight:before {\n  content: \"\\e215\"; }\n\n.glyphicon-baby-formula:before {\n  content: \"\\e216\"; }\n\n.glyphicon-tent:before {\n  content: \"\\26fa\"; }\n\n.glyphicon-blackboard:before {\n  content: \"\\e218\"; }\n\n.glyphicon-bed:before {\n  content: \"\\e219\"; }\n\n.glyphicon-apple:before {\n  content: \"\\f8ff\"; }\n\n.glyphicon-erase:before {\n  content: \"\\e221\"; }\n\n.glyphicon-hourglass:before {\n  content: \"\\231b\"; }\n\n.glyphicon-lamp:before {\n  content: \"\\e223\"; }\n\n.glyphicon-duplicate:before {\n  content: \"\\e224\"; }\n\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\"; }\n\n.glyphicon-scissors:before {\n  content: \"\\e226\"; }\n\n.glyphicon-bitcoin:before {\n  content: \"\\e227\"; }\n\n.glyphicon-btc:before {\n  content: \"\\e227\"; }\n\n.glyphicon-xbt:before {\n  content: \"\\e227\"; }\n\n.glyphicon-yen:before {\n  content: \"\\00a5\"; }\n\n.glyphicon-jpy:before {\n  content: \"\\00a5\"; }\n\n.glyphicon-ruble:before {\n  content: \"\\20bd\"; }\n\n.glyphicon-rub:before {\n  content: \"\\20bd\"; }\n\n.glyphicon-scale:before {\n  content: \"\\e230\"; }\n\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\"; }\n\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\"; }\n\n.glyphicon-education:before {\n  content: \"\\e233\"; }\n\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\"; }\n\n.glyphicon-option-vertical:before {\n  content: \"\\e235\"; }\n\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\"; }\n\n.glyphicon-modal-window:before {\n  content: \"\\e237\"; }\n\n.glyphicon-oil:before {\n  content: \"\\e238\"; }\n\n.glyphicon-grain:before {\n  content: \"\\e239\"; }\n\n.glyphicon-sunglasses:before {\n  content: \"\\e240\"; }\n\n.glyphicon-text-size:before {\n  content: \"\\e241\"; }\n\n.glyphicon-text-color:before {\n  content: \"\\e242\"; }\n\n.glyphicon-text-background:before {\n  content: \"\\e243\"; }\n\n.glyphicon-object-align-top:before {\n  content: \"\\e244\"; }\n\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\"; }\n\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\"; }\n\n.glyphicon-object-align-left:before {\n  content: \"\\e247\"; }\n\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\"; }\n\n.glyphicon-object-align-right:before {\n  content: \"\\e249\"; }\n\n.glyphicon-triangle-right:before {\n  content: \"\\e250\"; }\n\n.glyphicon-triangle-left:before {\n  content: \"\\e251\"; }\n\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\"; }\n\n.glyphicon-triangle-top:before {\n  content: \"\\e253\"; }\n\n.glyphicon-console:before {\n  content: \"\\e254\"; }\n\n.glyphicon-superscript:before {\n  content: \"\\e255\"; }\n\n.glyphicon-subscript:before {\n  content: \"\\e256\"; }\n\n.glyphicon-menu-left:before {\n  content: \"\\e257\"; }\n\n.glyphicon-menu-right:before {\n  content: \"\\e258\"; }\n\n.glyphicon-menu-down:before {\n  content: \"\\e259\"; }\n\n.glyphicon-menu-up:before {\n  content: \"\\e260\"; }\n\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: transparent; }\n\nbody {\n  font-family: \"Lato\", sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #fff; }\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit; }\n\na {\n  color: #337ab7;\n  text-decoration: none; }\n  a:hover, a:focus {\n    color: #23527c;\n    text-decoration: underline; }\n  a:focus {\n    outline: thin dotted;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px; }\n\nfigure {\n  margin: 0; }\n\nimg {\n  vertical-align: middle; }\n\n.img-responsive {\n  display: block;\n  max-width: 100%;\n  height: auto; }\n\n.img-rounded {\n  border-radius: 6px; }\n\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto; }\n\n.img-circle {\n  border-radius: 50%; }\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee; }\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto; }\n\n[role=\"button\"] {\n  cursor: pointer; }\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit; }\n  h1 small,\n  h1 .small, h2 small,\n  h2 .small, h3 small,\n  h3 .small, h4 small,\n  h4 .small, h5 small,\n  h5 .small, h6 small,\n  h6 .small,\n  .h1 small,\n  .h1 .small, .h2 small,\n  .h2 .small, .h3 small,\n  .h3 .small, .h4 small,\n  .h4 .small, .h5 small,\n  .h5 .small, .h6 small,\n  .h6 .small {\n    font-weight: normal;\n    line-height: 1;\n    color: #777777; }\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: 20px;\n  margin-bottom: 10px; }\n  h1 small,\n  h1 .small, .h1 small,\n  .h1 .small,\n  h2 small,\n  h2 .small, .h2 small,\n  .h2 .small,\n  h3 small,\n  h3 .small, .h3 small,\n  .h3 .small {\n    font-size: 65%; }\n\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: 10px;\n  margin-bottom: 10px; }\n  h4 small,\n  h4 .small, .h4 small,\n  .h4 .small,\n  h5 small,\n  h5 .small, .h5 small,\n  .h5 .small,\n  h6 small,\n  h6 .small, .h6 small,\n  .h6 .small {\n    font-size: 75%; }\n\nh1, .h1 {\n  font-size: 36px; }\n\nh2, .h2 {\n  font-size: 30px; }\n\nh3, .h3 {\n  font-size: 24px; }\n\nh4, .h4 {\n  font-size: 18px; }\n\nh5, .h5 {\n  font-size: 14px; }\n\nh6, .h6 {\n  font-size: 12px; }\n\np {\n  margin: 0 0 10px; }\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4; }\n  @media (min-width: 768px) {\n    .lead {\n      font-size: 21px; } }\n\nsmall,\n.small {\n  font-size: 85%; }\n\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em; }\n\n.text-left {\n  text-align: left; }\n\n.text-right {\n  text-align: right; }\n\n.text-center {\n  text-align: center; }\n\n.text-justify {\n  text-align: justify; }\n\n.text-nowrap {\n  white-space: nowrap; }\n\n.text-lowercase {\n  text-transform: lowercase; }\n\n.text-uppercase, .initialism {\n  text-transform: uppercase; }\n\n.text-capitalize {\n  text-transform: capitalize; }\n\n.text-muted {\n  color: #777777; }\n\n.text-primary {\n  color: #337ab7; }\n\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090; }\n\n.text-success {\n  color: #3c763d; }\n\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c; }\n\n.text-info {\n  color: #31708f; }\n\na.text-info:hover,\na.text-info:focus {\n  color: #245269; }\n\n.text-warning {\n  color: #8a6d3b; }\n\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c; }\n\n.text-danger {\n  color: #a94442; }\n\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534; }\n\n.bg-primary {\n  color: #fff; }\n\n.bg-primary {\n  background-color: #337ab7; }\n\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090; }\n\n.bg-success {\n  background-color: #dff0d8; }\n\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3; }\n\n.bg-info {\n  background-color: #d9edf7; }\n\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee; }\n\n.bg-warning {\n  background-color: #fcf8e3; }\n\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5; }\n\n.bg-danger {\n  background-color: #f2dede; }\n\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9; }\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee; }\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px; }\n  ul ul,\n  ul ol,\n  ol ul,\n  ol ol {\n    margin-bottom: 0; }\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none; }\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px; }\n  .list-inline > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px; }\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px; }\n\ndt,\ndd {\n  line-height: 1.428571429; }\n\ndt {\n  font-weight: bold; }\n\ndd {\n  margin-left: 0; }\n\n.dl-horizontal dd:before, .dl-horizontal dd:after {\n  content: \" \";\n  display: table; }\n\n.dl-horizontal dd:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap; }\n  .dl-horizontal dd {\n    margin-left: 180px; } }\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777; }\n\n.initialism {\n  font-size: 90%; }\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee; }\n  blockquote p:last-child,\n  blockquote ul:last-child,\n  blockquote ol:last-child {\n    margin-bottom: 0; }\n  blockquote footer,\n  blockquote small,\n  blockquote .small {\n    display: block;\n    font-size: 80%;\n    line-height: 1.428571429;\n    color: #777777; }\n    blockquote footer:before,\n    blockquote small:before,\n    blockquote .small:before {\n      content: '\\2014 \\00A0'; }\n\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right; }\n  .blockquote-reverse footer:before,\n  .blockquote-reverse small:before,\n  .blockquote-reverse .small:before,\n  blockquote.pull-right footer:before,\n  blockquote.pull-right small:before,\n  blockquote.pull-right .small:before {\n    content: ''; }\n  .blockquote-reverse footer:after,\n  .blockquote-reverse small:after,\n  .blockquote-reverse .small:after,\n  blockquote.pull-right footer:after,\n  blockquote.pull-right small:after,\n  blockquote.pull-right .small:after {\n    content: '\\00A0 \\2014'; }\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429; }\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px; }\n\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }\n  kbd kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none; }\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px; }\n  pre code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0; }\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll; }\n\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px; }\n  .container:before, .container:after {\n    content: \" \";\n    display: table; }\n  .container:after {\n    clear: both; }\n  @media (min-width: 768px) {\n    .container {\n      width: 750px; } }\n  @media (min-width: 992px) {\n    .container {\n      width: 970px; } }\n  @media (min-width: 1200px) {\n    .container {\n      width: 1170px; } }\n\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px; }\n  .container-fluid:before, .container-fluid:after {\n    content: \" \";\n    display: table; }\n  .container-fluid:after {\n    clear: both; }\n\n.row {\n  margin-left: -15px;\n  margin-right: -15px; }\n  .row:before, .row:after {\n    content: \" \";\n    display: table; }\n  .row:after {\n    clear: both; }\n\n.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 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px; }\n\n.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 {\n  float: left; }\n\n.col-xs-1 {\n  width: 8.3333333333%; }\n\n.col-xs-2 {\n  width: 16.6666666667%; }\n\n.col-xs-3 {\n  width: 25%; }\n\n.col-xs-4 {\n  width: 33.3333333333%; }\n\n.col-xs-5 {\n  width: 41.6666666667%; }\n\n.col-xs-6 {\n  width: 50%; }\n\n.col-xs-7 {\n  width: 58.3333333333%; }\n\n.col-xs-8 {\n  width: 66.6666666667%; }\n\n.col-xs-9 {\n  width: 75%; }\n\n.col-xs-10 {\n  width: 83.3333333333%; }\n\n.col-xs-11 {\n  width: 91.6666666667%; }\n\n.col-xs-12 {\n  width: 100%; }\n\n.col-xs-pull-0 {\n  right: auto; }\n\n.col-xs-pull-1 {\n  right: 8.3333333333%; }\n\n.col-xs-pull-2 {\n  right: 16.6666666667%; }\n\n.col-xs-pull-3 {\n  right: 25%; }\n\n.col-xs-pull-4 {\n  right: 33.3333333333%; }\n\n.col-xs-pull-5 {\n  right: 41.6666666667%; }\n\n.col-xs-pull-6 {\n  right: 50%; }\n\n.col-xs-pull-7 {\n  right: 58.3333333333%; }\n\n.col-xs-pull-8 {\n  right: 66.6666666667%; }\n\n.col-xs-pull-9 {\n  right: 75%; }\n\n.col-xs-pull-10 {\n  right: 83.3333333333%; }\n\n.col-xs-pull-11 {\n  right: 91.6666666667%; }\n\n.col-xs-pull-12 {\n  right: 100%; }\n\n.col-xs-push-0 {\n  left: auto; }\n\n.col-xs-push-1 {\n  left: 8.3333333333%; }\n\n.col-xs-push-2 {\n  left: 16.6666666667%; }\n\n.col-xs-push-3 {\n  left: 25%; }\n\n.col-xs-push-4 {\n  left: 33.3333333333%; }\n\n.col-xs-push-5 {\n  left: 41.6666666667%; }\n\n.col-xs-push-6 {\n  left: 50%; }\n\n.col-xs-push-7 {\n  left: 58.3333333333%; }\n\n.col-xs-push-8 {\n  left: 66.6666666667%; }\n\n.col-xs-push-9 {\n  left: 75%; }\n\n.col-xs-push-10 {\n  left: 83.3333333333%; }\n\n.col-xs-push-11 {\n  left: 91.6666666667%; }\n\n.col-xs-push-12 {\n  left: 100%; }\n\n.col-xs-offset-0 {\n  margin-left: 0%; }\n\n.col-xs-offset-1 {\n  margin-left: 8.3333333333%; }\n\n.col-xs-offset-2 {\n  margin-left: 16.6666666667%; }\n\n.col-xs-offset-3 {\n  margin-left: 25%; }\n\n.col-xs-offset-4 {\n  margin-left: 33.3333333333%; }\n\n.col-xs-offset-5 {\n  margin-left: 41.6666666667%; }\n\n.col-xs-offset-6 {\n  margin-left: 50%; }\n\n.col-xs-offset-7 {\n  margin-left: 58.3333333333%; }\n\n.col-xs-offset-8 {\n  margin-left: 66.6666666667%; }\n\n.col-xs-offset-9 {\n  margin-left: 75%; }\n\n.col-xs-offset-10 {\n  margin-left: 83.3333333333%; }\n\n.col-xs-offset-11 {\n  margin-left: 91.6666666667%; }\n\n.col-xs-offset-12 {\n  margin-left: 100%; }\n\n@media (min-width: 768px) {\n  .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 {\n    float: left; }\n  .col-sm-1 {\n    width: 8.3333333333%; }\n  .col-sm-2 {\n    width: 16.6666666667%; }\n  .col-sm-3 {\n    width: 25%; }\n  .col-sm-4 {\n    width: 33.3333333333%; }\n  .col-sm-5 {\n    width: 41.6666666667%; }\n  .col-sm-6 {\n    width: 50%; }\n  .col-sm-7 {\n    width: 58.3333333333%; }\n  .col-sm-8 {\n    width: 66.6666666667%; }\n  .col-sm-9 {\n    width: 75%; }\n  .col-sm-10 {\n    width: 83.3333333333%; }\n  .col-sm-11 {\n    width: 91.6666666667%; }\n  .col-sm-12 {\n    width: 100%; }\n  .col-sm-pull-0 {\n    right: auto; }\n  .col-sm-pull-1 {\n    right: 8.3333333333%; }\n  .col-sm-pull-2 {\n    right: 16.6666666667%; }\n  .col-sm-pull-3 {\n    right: 25%; }\n  .col-sm-pull-4 {\n    right: 33.3333333333%; }\n  .col-sm-pull-5 {\n    right: 41.6666666667%; }\n  .col-sm-pull-6 {\n    right: 50%; }\n  .col-sm-pull-7 {\n    right: 58.3333333333%; }\n  .col-sm-pull-8 {\n    right: 66.6666666667%; }\n  .col-sm-pull-9 {\n    right: 75%; }\n  .col-sm-pull-10 {\n    right: 83.3333333333%; }\n  .col-sm-pull-11 {\n    right: 91.6666666667%; }\n  .col-sm-pull-12 {\n    right: 100%; }\n  .col-sm-push-0 {\n    left: auto; }\n  .col-sm-push-1 {\n    left: 8.3333333333%; }\n  .col-sm-push-2 {\n    left: 16.6666666667%; }\n  .col-sm-push-3 {\n    left: 25%; }\n  .col-sm-push-4 {\n    left: 33.3333333333%; }\n  .col-sm-push-5 {\n    left: 41.6666666667%; }\n  .col-sm-push-6 {\n    left: 50%; }\n  .col-sm-push-7 {\n    left: 58.3333333333%; }\n  .col-sm-push-8 {\n    left: 66.6666666667%; }\n  .col-sm-push-9 {\n    left: 75%; }\n  .col-sm-push-10 {\n    left: 83.3333333333%; }\n  .col-sm-push-11 {\n    left: 91.6666666667%; }\n  .col-sm-push-12 {\n    left: 100%; }\n  .col-sm-offset-0 {\n    margin-left: 0%; }\n  .col-sm-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-sm-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-sm-offset-3 {\n    margin-left: 25%; }\n  .col-sm-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-sm-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-sm-offset-6 {\n    margin-left: 50%; }\n  .col-sm-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-sm-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-sm-offset-9 {\n    margin-left: 75%; }\n  .col-sm-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-sm-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-sm-offset-12 {\n    margin-left: 100%; } }\n\n@media (min-width: 992px) {\n  .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 {\n    float: left; }\n  .col-md-1 {\n    width: 8.3333333333%; }\n  .col-md-2 {\n    width: 16.6666666667%; }\n  .col-md-3 {\n    width: 25%; }\n  .col-md-4 {\n    width: 33.3333333333%; }\n  .col-md-5 {\n    width: 41.6666666667%; }\n  .col-md-6 {\n    width: 50%; }\n  .col-md-7 {\n    width: 58.3333333333%; }\n  .col-md-8 {\n    width: 66.6666666667%; }\n  .col-md-9 {\n    width: 75%; }\n  .col-md-10 {\n    width: 83.3333333333%; }\n  .col-md-11 {\n    width: 91.6666666667%; }\n  .col-md-12 {\n    width: 100%; }\n  .col-md-pull-0 {\n    right: auto; }\n  .col-md-pull-1 {\n    right: 8.3333333333%; }\n  .col-md-pull-2 {\n    right: 16.6666666667%; }\n  .col-md-pull-3 {\n    right: 25%; }\n  .col-md-pull-4 {\n    right: 33.3333333333%; }\n  .col-md-pull-5 {\n    right: 41.6666666667%; }\n  .col-md-pull-6 {\n    right: 50%; }\n  .col-md-pull-7 {\n    right: 58.3333333333%; }\n  .col-md-pull-8 {\n    right: 66.6666666667%; }\n  .col-md-pull-9 {\n    right: 75%; }\n  .col-md-pull-10 {\n    right: 83.3333333333%; }\n  .col-md-pull-11 {\n    right: 91.6666666667%; }\n  .col-md-pull-12 {\n    right: 100%; }\n  .col-md-push-0 {\n    left: auto; }\n  .col-md-push-1 {\n    left: 8.3333333333%; }\n  .col-md-push-2 {\n    left: 16.6666666667%; }\n  .col-md-push-3 {\n    left: 25%; }\n  .col-md-push-4 {\n    left: 33.3333333333%; }\n  .col-md-push-5 {\n    left: 41.6666666667%; }\n  .col-md-push-6 {\n    left: 50%; }\n  .col-md-push-7 {\n    left: 58.3333333333%; }\n  .col-md-push-8 {\n    left: 66.6666666667%; }\n  .col-md-push-9 {\n    left: 75%; }\n  .col-md-push-10 {\n    left: 83.3333333333%; }\n  .col-md-push-11 {\n    left: 91.6666666667%; }\n  .col-md-push-12 {\n    left: 100%; }\n  .col-md-offset-0 {\n    margin-left: 0%; }\n  .col-md-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-md-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-md-offset-3 {\n    margin-left: 25%; }\n  .col-md-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-md-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-md-offset-6 {\n    margin-left: 50%; }\n  .col-md-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-md-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-md-offset-9 {\n    margin-left: 75%; }\n  .col-md-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-md-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-md-offset-12 {\n    margin-left: 100%; } }\n\n@media (min-width: 1200px) {\n  .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 {\n    float: left; }\n  .col-lg-1 {\n    width: 8.3333333333%; }\n  .col-lg-2 {\n    width: 16.6666666667%; }\n  .col-lg-3 {\n    width: 25%; }\n  .col-lg-4 {\n    width: 33.3333333333%; }\n  .col-lg-5 {\n    width: 41.6666666667%; }\n  .col-lg-6 {\n    width: 50%; }\n  .col-lg-7 {\n    width: 58.3333333333%; }\n  .col-lg-8 {\n    width: 66.6666666667%; }\n  .col-lg-9 {\n    width: 75%; }\n  .col-lg-10 {\n    width: 83.3333333333%; }\n  .col-lg-11 {\n    width: 91.6666666667%; }\n  .col-lg-12 {\n    width: 100%; }\n  .col-lg-pull-0 {\n    right: auto; }\n  .col-lg-pull-1 {\n    right: 8.3333333333%; }\n  .col-lg-pull-2 {\n    right: 16.6666666667%; }\n  .col-lg-pull-3 {\n    right: 25%; }\n  .col-lg-pull-4 {\n    right: 33.3333333333%; }\n  .col-lg-pull-5 {\n    right: 41.6666666667%; }\n  .col-lg-pull-6 {\n    right: 50%; }\n  .col-lg-pull-7 {\n    right: 58.3333333333%; }\n  .col-lg-pull-8 {\n    right: 66.6666666667%; }\n  .col-lg-pull-9 {\n    right: 75%; }\n  .col-lg-pull-10 {\n    right: 83.3333333333%; }\n  .col-lg-pull-11 {\n    right: 91.6666666667%; }\n  .col-lg-pull-12 {\n    right: 100%; }\n  .col-lg-push-0 {\n    left: auto; }\n  .col-lg-push-1 {\n    left: 8.3333333333%; }\n  .col-lg-push-2 {\n    left: 16.6666666667%; }\n  .col-lg-push-3 {\n    left: 25%; }\n  .col-lg-push-4 {\n    left: 33.3333333333%; }\n  .col-lg-push-5 {\n    left: 41.6666666667%; }\n  .col-lg-push-6 {\n    left: 50%; }\n  .col-lg-push-7 {\n    left: 58.3333333333%; }\n  .col-lg-push-8 {\n    left: 66.6666666667%; }\n  .col-lg-push-9 {\n    left: 75%; }\n  .col-lg-push-10 {\n    left: 83.3333333333%; }\n  .col-lg-push-11 {\n    left: 91.6666666667%; }\n  .col-lg-push-12 {\n    left: 100%; }\n  .col-lg-offset-0 {\n    margin-left: 0%; }\n  .col-lg-offset-1 {\n    margin-left: 8.3333333333%; }\n  .col-lg-offset-2 {\n    margin-left: 16.6666666667%; }\n  .col-lg-offset-3 {\n    margin-left: 25%; }\n  .col-lg-offset-4 {\n    margin-left: 33.3333333333%; }\n  .col-lg-offset-5 {\n    margin-left: 41.6666666667%; }\n  .col-lg-offset-6 {\n    margin-left: 50%; }\n  .col-lg-offset-7 {\n    margin-left: 58.3333333333%; }\n  .col-lg-offset-8 {\n    margin-left: 66.6666666667%; }\n  .col-lg-offset-9 {\n    margin-left: 75%; }\n  .col-lg-offset-10 {\n    margin-left: 83.3333333333%; }\n  .col-lg-offset-11 {\n    margin-left: 91.6666666667%; }\n  .col-lg-offset-12 {\n    margin-left: 100%; } }\n\ntable {\n  background-color: transparent; }\n\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left; }\n\nth {\n  text-align: left; }\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px; }\n  .table > thead > tr > th,\n  .table > thead > tr > td,\n  .table > tbody > tr > th,\n  .table > tbody > tr > td,\n  .table > tfoot > tr > th,\n  .table > tfoot > tr > td {\n    padding: 8px;\n    line-height: 1.428571429;\n    vertical-align: top;\n    border-top: 1px solid #ddd; }\n  .table > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid #ddd; }\n  .table > caption + thead > tr:first-child > th,\n  .table > caption + thead > tr:first-child > td,\n  .table > colgroup + thead > tr:first-child > th,\n  .table > colgroup + thead > tr:first-child > td,\n  .table > thead:first-child > tr:first-child > th,\n  .table > thead:first-child > tr:first-child > td {\n    border-top: 0; }\n  .table > tbody + tbody {\n    border-top: 2px solid #ddd; }\n  .table .table {\n    background-color: #fff; }\n\n.table-condensed > thead > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > tfoot > tr > td {\n  padding: 5px; }\n\n.table-bordered {\n  border: 1px solid #ddd; }\n  .table-bordered > thead > tr > th,\n  .table-bordered > thead > tr > td,\n  .table-bordered > tbody > tr > th,\n  .table-bordered > tbody > tr > td,\n  .table-bordered > tfoot > tr > th,\n  .table-bordered > tfoot > tr > td {\n    border: 1px solid #ddd; }\n  .table-bordered > thead > tr > th,\n  .table-bordered > thead > tr > td {\n    border-bottom-width: 2px; }\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell; }\n\n.table > thead > tr > td.active,\n.table > thead > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8; }\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8; }\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6; }\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7; }\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3; }\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc; }\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede; }\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc; }\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; }\n  @media screen and (max-width: 767px) {\n    .table-responsive {\n      width: 100%;\n      margin-bottom: 15px;\n      overflow-y: hidden;\n      -ms-overflow-style: -ms-autohiding-scrollbar;\n      border: 1px solid #ddd; }\n      .table-responsive > .table {\n        margin-bottom: 0; }\n        .table-responsive > .table > thead > tr > th,\n        .table-responsive > .table > thead > tr > td,\n        .table-responsive > .table > tbody > tr > th,\n        .table-responsive > .table > tbody > tr > td,\n        .table-responsive > .table > tfoot > tr > th,\n        .table-responsive > .table > tfoot > tr > td {\n          white-space: nowrap; }\n      .table-responsive > .table-bordered {\n        border: 0; }\n        .table-responsive > .table-bordered > thead > tr > th:first-child,\n        .table-responsive > .table-bordered > thead > tr > td:first-child,\n        .table-responsive > .table-bordered > tbody > tr > th:first-child,\n        .table-responsive > .table-bordered > tbody > tr > td:first-child,\n        .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n        .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n          border-left: 0; }\n        .table-responsive > .table-bordered > thead > tr > th:last-child,\n        .table-responsive > .table-bordered > thead > tr > td:last-child,\n        .table-responsive > .table-bordered > tbody > tr > th:last-child,\n        .table-responsive > .table-bordered > tbody > tr > td:last-child,\n        .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n        .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n          border-right: 0; }\n        .table-responsive > .table-bordered > tbody > tr:last-child > th,\n        .table-responsive > .table-bordered > tbody > tr:last-child > td,\n        .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n        .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n          border-bottom: 0; } }\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0; }\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5; }\n\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold; }\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal; }\n\ninput[type=\"file\"] {\n  display: block; }\n\ninput[type=\"range\"] {\n  display: block;\n  width: 100%; }\n\nselect[multiple],\nselect[size] {\n  height: auto; }\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px; }\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555; }\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }\n  .form-control:focus {\n    border-color: #66afe9;\n    outline: 0;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }\n  .form-control::-moz-placeholder {\n    color: #999;\n    opacity: 1; }\n  .form-control:-ms-input-placeholder {\n    color: #999; }\n  .form-control::-webkit-input-placeholder {\n    color: #999; }\n  .form-control::-ms-expand {\n    border: 0;\n    background-color: transparent; }\n  .form-control[disabled], .form-control[readonly],\n  fieldset[disabled] .form-control {\n    background-color: #eeeeee;\n    opacity: 1; }\n  .form-control[disabled],\n  fieldset[disabled] .form-control {\n    cursor: not-allowed; }\n\ntextarea.form-control {\n  height: auto; }\n\ninput[type=\"search\"] {\n  -webkit-appearance: none; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px; }\n  input[type=\"date\"].input-sm, .input-group-sm > input[type=\"date\"].form-control,\n  .input-group-sm > input[type=\"date\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"date\"].btn,\n  .input-group-sm input[type=\"date\"],\n  input[type=\"time\"].input-sm,\n  .input-group-sm > input[type=\"time\"].form-control,\n  .input-group-sm > input[type=\"time\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"time\"].btn,\n  .input-group-sm\n  input[type=\"time\"],\n  input[type=\"datetime-local\"].input-sm,\n  .input-group-sm > input[type=\"datetime-local\"].form-control,\n  .input-group-sm > input[type=\"datetime-local\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"datetime-local\"].btn,\n  .input-group-sm\n  input[type=\"datetime-local\"],\n  input[type=\"month\"].input-sm,\n  .input-group-sm > input[type=\"month\"].form-control,\n  .input-group-sm > input[type=\"month\"].input-group-addon,\n  .input-group-sm > .input-group-btn > input[type=\"month\"].btn,\n  .input-group-sm\n  input[type=\"month\"] {\n    line-height: 30px; }\n  input[type=\"date\"].input-lg, .input-group-lg > input[type=\"date\"].form-control,\n  .input-group-lg > input[type=\"date\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"date\"].btn,\n  .input-group-lg input[type=\"date\"],\n  input[type=\"time\"].input-lg,\n  .input-group-lg > input[type=\"time\"].form-control,\n  .input-group-lg > input[type=\"time\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"time\"].btn,\n  .input-group-lg\n  input[type=\"time\"],\n  input[type=\"datetime-local\"].input-lg,\n  .input-group-lg > input[type=\"datetime-local\"].form-control,\n  .input-group-lg > input[type=\"datetime-local\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"datetime-local\"].btn,\n  .input-group-lg\n  input[type=\"datetime-local\"],\n  input[type=\"month\"].input-lg,\n  .input-group-lg > input[type=\"month\"].form-control,\n  .input-group-lg > input[type=\"month\"].input-group-addon,\n  .input-group-lg > .input-group-btn > input[type=\"month\"].btn,\n  .input-group-lg\n  input[type=\"month\"] {\n    line-height: 46px; } }\n\n.form-group {\n  margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px; }\n  .radio label,\n  .checkbox label {\n    min-height: 20px;\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer; }\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9; }\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; }\n\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer; }\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; }\n\ninput[type=\"radio\"][disabled], input[type=\"radio\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled]\ninput[type=\"checkbox\"] {\n  cursor: not-allowed; }\n\n.radio-inline.disabled,\nfieldset[disabled] .radio-inline,\n.checkbox-inline.disabled,\nfieldset[disabled]\n.checkbox-inline {\n  cursor: not-allowed; }\n\n.radio.disabled label,\nfieldset[disabled] .radio label,\n.checkbox.disabled label,\nfieldset[disabled]\n.checkbox label {\n  cursor: not-allowed; }\n\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n  min-height: 34px; }\n  .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,\n  .input-group-lg > .form-control-static.input-group-addon,\n  .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,\n  .input-group-sm > .form-control-static.input-group-addon,\n  .input-group-sm > .input-group-btn > .form-control-static.btn {\n    padding-left: 0;\n    padding-right: 0; }\n\n.input-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\nselect.input-sm, .input-group-sm > select.form-control,\n.input-group-sm > select.input-group-addon,\n.input-group-sm > .input-group-btn > select.btn {\n  height: 30px;\n  line-height: 30px; }\n\ntextarea.input-sm, .input-group-sm > textarea.form-control,\n.input-group-sm > textarea.input-group-addon,\n.input-group-sm > .input-group-btn > textarea.btn,\nselect[multiple].input-sm,\n.input-group-sm > select[multiple].form-control,\n.input-group-sm > select[multiple].input-group-addon,\n.input-group-sm > .input-group-btn > select[multiple].btn {\n  height: auto; }\n\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px; }\n\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto; }\n\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5; }\n\n.input-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\nselect.input-lg, .input-group-lg > select.form-control,\n.input-group-lg > select.input-group-addon,\n.input-group-lg > .input-group-btn > select.btn {\n  height: 46px;\n  line-height: 46px; }\n\ntextarea.input-lg, .input-group-lg > textarea.form-control,\n.input-group-lg > textarea.input-group-addon,\n.input-group-lg > .input-group-btn > textarea.btn,\nselect[multiple].input-lg,\n.input-group-lg > select[multiple].form-control,\n.input-group-lg > select[multiple].input-group-addon,\n.input-group-lg > .input-group-btn > select[multiple].btn {\n  height: auto; }\n\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px; }\n\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto; }\n\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333; }\n\n.has-feedback {\n  position: relative; }\n  .has-feedback .form-control {\n    padding-right: 42.5px; }\n\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none; }\n\n.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,\n.input-group-lg > .input-group-addon + .form-control-feedback,\n.input-group-lg > .input-group-btn > .btn + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px; }\n\n.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,\n.input-group-sm > .input-group-addon + .form-control-feedback,\n.input-group-sm > .input-group-btn > .btn + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px; }\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d; }\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-success .form-control:focus {\n    border-color: #2b542c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }\n\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8; }\n\n.has-success .form-control-feedback {\n  color: #3c763d; }\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b; }\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-warning .form-control:focus {\n    border-color: #66512c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }\n\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3; }\n\n.has-warning .form-control-feedback {\n  color: #8a6d3b; }\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442; }\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n  .has-error .form-control:focus {\n    border-color: #843534;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }\n\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede; }\n\n.has-error .form-control-feedback {\n  color: #a94442; }\n\n.has-feedback label ~ .form-control-feedback {\n  top: 25px; }\n\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0; }\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373; }\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle; }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle; }\n  .form-inline .form-control-static {\n    display: inline-block; }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle; }\n    .form-inline .input-group .input-group-addon,\n    .form-inline .input-group .input-group-btn,\n    .form-inline .input-group .form-control {\n      width: auto; }\n  .form-inline .input-group > .form-control {\n    width: 100%; }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle; }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle; }\n    .form-inline .radio label,\n    .form-inline .checkbox label {\n      padding-left: 0; }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0; }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0; } }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px; }\n\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px; }\n  .form-horizontal .form-group:before, .form-horizontal .form-group:after {\n    content: \" \";\n    display: table; }\n  .form-horizontal .form-group:after {\n    clear: both; }\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px; } }\n\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px; }\n\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px; } }\n\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px; } }\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none; }\n  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {\n    outline: thin dotted;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px; }\n  .btn:hover, .btn:focus, .btn.focus {\n    color: #333;\n    text-decoration: none; }\n  .btn:active, .btn.active {\n    outline: 0;\n    background-image: none;\n    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n  .btn.disabled, .btn[disabled],\n  fieldset[disabled] .btn {\n    cursor: not-allowed;\n    opacity: 0.65;\n    filter: alpha(opacity=65);\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none; }\n\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc; }\n  .btn-default:focus, .btn-default.focus {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #8c8c8c; }\n  .btn-default:hover {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #adadad; }\n  .btn-default:active, .btn-default.active,\n  .open > .btn-default.dropdown-toggle {\n    color: #333;\n    background-color: #e6e6e6;\n    border-color: #adadad; }\n    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,\n    .open > .btn-default.dropdown-toggle:hover,\n    .open > .btn-default.dropdown-toggle:focus,\n    .open > .btn-default.dropdown-toggle.focus {\n      color: #333;\n      background-color: #d4d4d4;\n      border-color: #8c8c8c; }\n  .btn-default:active, .btn-default.active,\n  .open > .btn-default.dropdown-toggle {\n    background-image: none; }\n  .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,\n  fieldset[disabled] .btn-default:hover,\n  fieldset[disabled] .btn-default:focus,\n  fieldset[disabled] .btn-default.focus {\n    background-color: #fff;\n    border-color: #ccc; }\n  .btn-default .badge {\n    color: #fff;\n    background-color: #333; }\n\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4; }\n  .btn-primary:focus, .btn-primary.focus {\n    color: #fff;\n    background-color: #286090;\n    border-color: #122b40; }\n  .btn-primary:hover {\n    color: #fff;\n    background-color: #286090;\n    border-color: #204d74; }\n  .btn-primary:active, .btn-primary.active,\n  .open > .btn-primary.dropdown-toggle {\n    color: #fff;\n    background-color: #286090;\n    border-color: #204d74; }\n    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,\n    .open > .btn-primary.dropdown-toggle:hover,\n    .open > .btn-primary.dropdown-toggle:focus,\n    .open > .btn-primary.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #204d74;\n      border-color: #122b40; }\n  .btn-primary:active, .btn-primary.active,\n  .open > .btn-primary.dropdown-toggle {\n    background-image: none; }\n  .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,\n  fieldset[disabled] .btn-primary:hover,\n  fieldset[disabled] .btn-primary:focus,\n  fieldset[disabled] .btn-primary.focus {\n    background-color: #337ab7;\n    border-color: #2e6da4; }\n  .btn-primary .badge {\n    color: #337ab7;\n    background-color: #fff; }\n\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c; }\n  .btn-success:focus, .btn-success.focus {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #255625; }\n  .btn-success:hover {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #398439; }\n  .btn-success:active, .btn-success.active,\n  .open > .btn-success.dropdown-toggle {\n    color: #fff;\n    background-color: #449d44;\n    border-color: #398439; }\n    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,\n    .open > .btn-success.dropdown-toggle:hover,\n    .open > .btn-success.dropdown-toggle:focus,\n    .open > .btn-success.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #398439;\n      border-color: #255625; }\n  .btn-success:active, .btn-success.active,\n  .open > .btn-success.dropdown-toggle {\n    background-image: none; }\n  .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,\n  fieldset[disabled] .btn-success:hover,\n  fieldset[disabled] .btn-success:focus,\n  fieldset[disabled] .btn-success.focus {\n    background-color: #5cb85c;\n    border-color: #4cae4c; }\n  .btn-success .badge {\n    color: #5cb85c;\n    background-color: #fff; }\n\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da; }\n  .btn-info:focus, .btn-info.focus {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #1b6d85; }\n  .btn-info:hover {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #269abc; }\n  .btn-info:active, .btn-info.active,\n  .open > .btn-info.dropdown-toggle {\n    color: #fff;\n    background-color: #31b0d5;\n    border-color: #269abc; }\n    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,\n    .open > .btn-info.dropdown-toggle:hover,\n    .open > .btn-info.dropdown-toggle:focus,\n    .open > .btn-info.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #269abc;\n      border-color: #1b6d85; }\n  .btn-info:active, .btn-info.active,\n  .open > .btn-info.dropdown-toggle {\n    background-image: none; }\n  .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,\n  fieldset[disabled] .btn-info:hover,\n  fieldset[disabled] .btn-info:focus,\n  fieldset[disabled] .btn-info.focus {\n    background-color: #5bc0de;\n    border-color: #46b8da; }\n  .btn-info .badge {\n    color: #5bc0de;\n    background-color: #fff; }\n\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236; }\n  .btn-warning:focus, .btn-warning.focus {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #985f0d; }\n  .btn-warning:hover {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #d58512; }\n  .btn-warning:active, .btn-warning.active,\n  .open > .btn-warning.dropdown-toggle {\n    color: #fff;\n    background-color: #ec971f;\n    border-color: #d58512; }\n    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,\n    .open > .btn-warning.dropdown-toggle:hover,\n    .open > .btn-warning.dropdown-toggle:focus,\n    .open > .btn-warning.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #d58512;\n      border-color: #985f0d; }\n  .btn-warning:active, .btn-warning.active,\n  .open > .btn-warning.dropdown-toggle {\n    background-image: none; }\n  .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,\n  fieldset[disabled] .btn-warning:hover,\n  fieldset[disabled] .btn-warning:focus,\n  fieldset[disabled] .btn-warning.focus {\n    background-color: #f0ad4e;\n    border-color: #eea236; }\n  .btn-warning .badge {\n    color: #f0ad4e;\n    background-color: #fff; }\n\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a; }\n  .btn-danger:focus, .btn-danger.focus {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #761c19; }\n  .btn-danger:hover {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #ac2925; }\n  .btn-danger:active, .btn-danger.active,\n  .open > .btn-danger.dropdown-toggle {\n    color: #fff;\n    background-color: #c9302c;\n    border-color: #ac2925; }\n    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,\n    .open > .btn-danger.dropdown-toggle:hover,\n    .open > .btn-danger.dropdown-toggle:focus,\n    .open > .btn-danger.dropdown-toggle.focus {\n      color: #fff;\n      background-color: #ac2925;\n      border-color: #761c19; }\n  .btn-danger:active, .btn-danger.active,\n  .open > .btn-danger.dropdown-toggle {\n    background-image: none; }\n  .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,\n  fieldset[disabled] .btn-danger:hover,\n  fieldset[disabled] .btn-danger:focus,\n  fieldset[disabled] .btn-danger.focus {\n    background-color: #d9534f;\n    border-color: #d43f3a; }\n  .btn-danger .badge {\n    color: #d9534f;\n    background-color: #fff; }\n\n.btn-link {\n  color: #337ab7;\n  font-weight: normal;\n  border-radius: 0; }\n  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],\n  fieldset[disabled] .btn-link {\n    background-color: transparent;\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {\n    border-color: transparent; }\n  .btn-link:hover, .btn-link:focus {\n    color: #23527c;\n    text-decoration: underline;\n    background-color: transparent; }\n  .btn-link[disabled]:hover, .btn-link[disabled]:focus,\n  fieldset[disabled] .btn-link:hover,\n  fieldset[disabled] .btn-link:focus {\n    color: #777777;\n    text-decoration: none; }\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px; }\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.btn-xs, .btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.btn-block {\n  display: block;\n  width: 100%; }\n\n.btn-block + .btn-block {\n  margin-top: 5px; }\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%; }\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear; }\n  .fade.in {\n    opacity: 1; }\n\n.collapse {\n  display: none; }\n  .collapse.in {\n    display: block; }\n\ntr.collapse.in {\n  display: table-row; }\n\ntbody.collapse.in {\n  display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease; }\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent; }\n\n.dropup,\n.dropdown {\n  position: relative; }\n\n.dropdown-toggle:focus {\n  outline: 0; }\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box; }\n  .dropdown-menu.pull-right {\n    right: 0;\n    left: auto; }\n  .dropdown-menu .divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5; }\n  .dropdown-menu > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: 1.428571429;\n    color: #333333;\n    white-space: nowrap; }\n\n.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5; }\n\n.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #337ab7; }\n\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n  color: #777777; }\n\n.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed; }\n\n.open > .dropdown-menu {\n  display: block; }\n\n.open > a {\n  outline: 0; }\n\n.dropdown-menu-right {\n  left: auto;\n  right: 0; }\n\n.dropdown-menu-left {\n  left: 0;\n  right: auto; }\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #777777;\n  white-space: nowrap; }\n\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990; }\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto; }\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n  content: \"\"; }\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px; }\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto; }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto; } }\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; }\n  .btn-group > .btn,\n  .btn-group-vertical > .btn {\n    position: relative;\n    float: left; }\n    .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n    .btn-group-vertical > .btn:hover,\n    .btn-group-vertical > .btn:focus,\n    .btn-group-vertical > .btn:active,\n    .btn-group-vertical > .btn.active {\n      z-index: 2; }\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px; }\n\n.btn-toolbar {\n  margin-left: -5px; }\n  .btn-toolbar:before, .btn-toolbar:after {\n    content: \" \";\n    display: table; }\n  .btn-toolbar:after {\n    clear: both; }\n  .btn-toolbar .btn,\n  .btn-toolbar .btn-group,\n  .btn-toolbar .input-group {\n    float: left; }\n  .btn-toolbar > .btn,\n  .btn-toolbar > .btn-group,\n  .btn-toolbar > .input-group {\n    margin-left: 5px; }\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0; }\n\n.btn-group > .btn:first-child {\n  margin-left: 0; }\n  .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n    border-bottom-right-radius: 0;\n    border-top-right-radius: 0; }\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group > .btn-group {\n  float: left; }\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0; }\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0; }\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0; }\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px; }\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n  .btn-group.open .dropdown-toggle.btn-link {\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n\n.btn .caret {\n  margin-left: 0; }\n\n.btn-lg .caret, .btn-group-lg > .btn .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0; }\n\n.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {\n  border-width: 0 5px 5px; }\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%; }\n\n.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {\n  content: \" \";\n  display: table; }\n\n.btn-group-vertical > .btn-group:after {\n  clear: both; }\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none; }\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0; }\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0; }\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px; }\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0; }\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate; }\n  .btn-group-justified > .btn,\n  .btn-group-justified > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%; }\n  .btn-group-justified > .btn-group .btn {\n    width: 100%; }\n  .btn-group-justified > .btn-group .dropdown-menu {\n    left: auto; }\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none; }\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate; }\n  .input-group[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0; }\n  .input-group .form-control {\n    position: relative;\n    z-index: 2;\n    float: left;\n    width: 100%;\n    margin-bottom: 0; }\n    .input-group .form-control:focus {\n      z-index: 3; }\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell; }\n  .input-group-addon:not(:first-child):not(:last-child),\n  .input-group-btn:not(:first-child):not(:last-child),\n  .input-group .form-control:not(:first-child):not(:last-child) {\n    border-radius: 0; }\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; }\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 4px; }\n  .input-group-addon.input-sm,\n  .input-group-sm > .input-group-addon,\n  .input-group-sm > .input-group-btn > .input-group-addon.btn {\n    padding: 5px 10px;\n    font-size: 12px;\n    border-radius: 3px; }\n  .input-group-addon.input-lg,\n  .input-group-lg > .input-group-addon,\n  .input-group-lg > .input-group-btn > .input-group-addon.btn {\n    padding: 10px 16px;\n    font-size: 18px;\n    border-radius: 6px; }\n  .input-group-addon input[type=\"radio\"],\n  .input-group-addon input[type=\"checkbox\"] {\n    margin-top: 0; }\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0; }\n\n.input-group-addon:first-child {\n  border-right: 0; }\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0; }\n\n.input-group-addon:last-child {\n  border-left: 0; }\n\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap; }\n  .input-group-btn > .btn {\n    position: relative; }\n    .input-group-btn > .btn + .btn {\n      margin-left: -1px; }\n    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {\n      z-index: 2; }\n  .input-group-btn:first-child > .btn,\n  .input-group-btn:first-child > .btn-group {\n    margin-right: -1px; }\n  .input-group-btn:last-child > .btn,\n  .input-group-btn:last-child > .btn-group {\n    z-index: 2;\n    margin-left: -1px; }\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none; }\n  .nav:before, .nav:after {\n    content: \" \";\n    display: table; }\n  .nav:after {\n    clear: both; }\n  .nav > li {\n    position: relative;\n    display: block; }\n    .nav > li > a {\n      position: relative;\n      display: block;\n      padding: 10px 15px; }\n      .nav > li > a:hover, .nav > li > a:focus {\n        text-decoration: none;\n        background-color: #eeeeee; }\n    .nav > li.disabled > a {\n      color: #777777; }\n      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {\n        color: #777777;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed; }\n  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\n    background-color: #eeeeee;\n    border-color: #337ab7; }\n  .nav .nav-divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5; }\n  .nav > li > a > img {\n    max-width: none; }\n\n.nav-tabs {\n  border-bottom: 1px solid #ddd; }\n  .nav-tabs > li {\n    float: left;\n    margin-bottom: -1px; }\n    .nav-tabs > li > a {\n      margin-right: 2px;\n      line-height: 1.428571429;\n      border: 1px solid transparent;\n      border-radius: 4px 4px 0 0; }\n      .nav-tabs > li > a:hover {\n        border-color: #eeeeee #eeeeee #ddd; }\n    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\n      color: #555555;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      border-bottom-color: transparent;\n      cursor: default; }\n\n.nav-pills > li {\n  float: left; }\n  .nav-pills > li > a {\n    border-radius: 4px; }\n  .nav-pills > li + li {\n    margin-left: 2px; }\n  .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {\n    color: #fff;\n    background-color: #337ab7; }\n\n.nav-stacked > li {\n  float: none; }\n  .nav-stacked > li + li {\n    margin-top: 2px;\n    margin-left: 0; }\n\n.nav-justified, .nav-tabs.nav-justified {\n  width: 100%; }\n  .nav-justified > li, .nav-tabs.nav-justified > li {\n    float: none; }\n    .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n      text-align: center;\n      margin-bottom: 5px; }\n  .nav-justified > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto; }\n  @media (min-width: 768px) {\n    .nav-justified > li, .nav-tabs.nav-justified > li {\n      display: table-cell;\n      width: 1%; }\n      .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n        margin-bottom: 0; } }\n\n.nav-tabs-justified, .nav-tabs.nav-justified {\n  border-bottom: 0; }\n  .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n    margin-right: 0;\n    border-radius: 4px; }\n  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n    border: 1px solid #ddd; }\n  @media (min-width: 768px) {\n    .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n      border-bottom: 1px solid #ddd;\n      border-radius: 4px 4px 0 0; }\n    .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n    .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n    .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n      border-bottom-color: #fff; } }\n\n.tab-content > .tab-pane {\n  display: none; }\n\n.tab-content > .active {\n  display: block; }\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent; }\n  .navbar:before, .navbar:after {\n    content: \" \";\n    display: table; }\n  .navbar:after {\n    clear: both; }\n  @media (min-width: 768px) {\n    .navbar {\n      border-radius: 4px; } }\n\n.navbar-header:before, .navbar-header:after {\n  content: \" \";\n  display: table; }\n\n.navbar-header:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left; } }\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch; }\n  .navbar-collapse:before, .navbar-collapse:after {\n    content: \" \";\n    display: table; }\n  .navbar-collapse:after {\n    clear: both; }\n  .navbar-collapse.in {\n    overflow-y: auto; }\n  @media (min-width: 768px) {\n    .navbar-collapse {\n      width: auto;\n      border-top: 0;\n      box-shadow: none; }\n      .navbar-collapse.collapse {\n        display: block !important;\n        height: auto !important;\n        padding-bottom: 0;\n        overflow: visible !important; }\n      .navbar-collapse.in {\n        overflow-y: visible; }\n      .navbar-fixed-top .navbar-collapse,\n      .navbar-static-top .navbar-collapse,\n      .navbar-fixed-bottom .navbar-collapse {\n        padding-left: 0;\n        padding-right: 0; } }\n\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px; }\n  @media (max-device-width: 480px) and (orientation: landscape) {\n    .navbar-fixed-top .navbar-collapse,\n    .navbar-fixed-bottom .navbar-collapse {\n      max-height: 200px; } }\n\n.container > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px; }\n  @media (min-width: 768px) {\n    .container > .navbar-header,\n    .container > .navbar-collapse,\n    .container-fluid > .navbar-header,\n    .container-fluid > .navbar-collapse {\n      margin-right: 0;\n      margin-left: 0; } }\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px; }\n  @media (min-width: 768px) {\n    .navbar-static-top {\n      border-radius: 0; } }\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030; }\n  @media (min-width: 768px) {\n    .navbar-fixed-top,\n    .navbar-fixed-bottom {\n      border-radius: 0; } }\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px; }\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0; }\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px; }\n  .navbar-brand:hover, .navbar-brand:focus {\n    text-decoration: none; }\n  .navbar-brand > img {\n    display: block; }\n  @media (min-width: 768px) {\n    .navbar > .container .navbar-brand,\n    .navbar > .container-fluid .navbar-brand {\n      margin-left: -15px; } }\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px; }\n  .navbar-toggle:focus {\n    outline: 0; }\n  .navbar-toggle .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px; }\n  .navbar-toggle .icon-bar + .icon-bar {\n    margin-top: 4px; }\n  @media (min-width: 768px) {\n    .navbar-toggle {\n      display: none; } }\n\n.navbar-nav {\n  margin: 7.5px -15px; }\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n    line-height: 20px; }\n  @media (max-width: 767px) {\n    .navbar-nav .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none; }\n      .navbar-nav .open .dropdown-menu > li > a,\n      .navbar-nav .open .dropdown-menu .dropdown-header {\n        padding: 5px 15px 5px 25px; }\n      .navbar-nav .open .dropdown-menu > li > a {\n        line-height: 20px; }\n        .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {\n          background-image: none; } }\n  @media (min-width: 768px) {\n    .navbar-nav {\n      float: left;\n      margin: 0; }\n      .navbar-nav > li {\n        float: left; }\n        .navbar-nav > li > a {\n          padding-top: 15px;\n          padding-bottom: 15px; } }\n\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px; }\n  @media (min-width: 768px) {\n    .navbar-form .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle; }\n    .navbar-form .form-control {\n      display: inline-block;\n      width: auto;\n      vertical-align: middle; }\n    .navbar-form .form-control-static {\n      display: inline-block; }\n    .navbar-form .input-group {\n      display: inline-table;\n      vertical-align: middle; }\n      .navbar-form .input-group .input-group-addon,\n      .navbar-form .input-group .input-group-btn,\n      .navbar-form .input-group .form-control {\n        width: auto; }\n    .navbar-form .input-group > .form-control {\n      width: 100%; }\n    .navbar-form .control-label {\n      margin-bottom: 0;\n      vertical-align: middle; }\n    .navbar-form .radio,\n    .navbar-form .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle; }\n      .navbar-form .radio label,\n      .navbar-form .checkbox label {\n        padding-left: 0; }\n    .navbar-form .radio input[type=\"radio\"],\n    .navbar-form .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0; }\n    .navbar-form .has-feedback .form-control-feedback {\n      top: 0; } }\n  @media (max-width: 767px) {\n    .navbar-form .form-group {\n      margin-bottom: 5px; }\n      .navbar-form .form-group:last-child {\n        margin-bottom: 0; } }\n  @media (min-width: 768px) {\n    .navbar-form {\n      width: auto;\n      border: 0;\n      margin-left: 0;\n      margin-right: 0;\n      padding-top: 0;\n      padding-bottom: 0;\n      -webkit-box-shadow: none;\n      box-shadow: none; } }\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px; }\n  .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {\n    margin-top: 10px;\n    margin-bottom: 10px; }\n  .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {\n    margin-top: 14px;\n    margin-bottom: 14px; }\n\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px; }\n  @media (min-width: 768px) {\n    .navbar-text {\n      float: left;\n      margin-left: 15px;\n      margin-right: 15px; } }\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important; }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px; }\n    .navbar-right ~ .navbar-right {\n      margin-right: 0; } }\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7; }\n  .navbar-default .navbar-brand {\n    color: #777; }\n    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {\n      color: #5e5e5e;\n      background-color: transparent; }\n  .navbar-default .navbar-text {\n    color: #777; }\n  .navbar-default .navbar-nav > li > a {\n    color: #777; }\n    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {\n      color: #333;\n      background-color: transparent; }\n  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7; }\n  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent; }\n  .navbar-default .navbar-toggle {\n    border-color: #ddd; }\n    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n      background-color: #ddd; }\n    .navbar-default .navbar-toggle .icon-bar {\n      background-color: #888; }\n  .navbar-default .navbar-collapse,\n  .navbar-default .navbar-form {\n    border-color: #e7e7e7; }\n  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {\n    background-color: #e7e7e7;\n    color: #555; }\n  @media (max-width: 767px) {\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n      color: #777; }\n      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #333;\n        background-color: transparent; }\n    .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 {\n      color: #555;\n      background-color: #e7e7e7; }\n    .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 {\n      color: #ccc;\n      background-color: transparent; } }\n  .navbar-default .navbar-link {\n    color: #777; }\n    .navbar-default .navbar-link:hover {\n      color: #333; }\n  .navbar-default .btn-link {\n    color: #777; }\n    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {\n      color: #333; }\n    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,\n    fieldset[disabled] .navbar-default .btn-link:hover,\n    fieldset[disabled] .navbar-default .btn-link:focus {\n      color: #ccc; }\n\n.navbar-inverse {\n  background-color: #222;\n  border-color: #090909; }\n  .navbar-inverse .navbar-brand {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {\n      color: #fff;\n      background-color: transparent; }\n  .navbar-inverse .navbar-text {\n    color: #9d9d9d; }\n  .navbar-inverse .navbar-nav > li > a {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {\n      color: #fff;\n      background-color: transparent; }\n  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {\n    color: #fff;\n    background-color: #090909; }\n  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {\n    color: #444;\n    background-color: transparent; }\n  .navbar-inverse .navbar-toggle {\n    border-color: #333; }\n    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {\n      background-color: #333; }\n    .navbar-inverse .navbar-toggle .icon-bar {\n      background-color: #fff; }\n  .navbar-inverse .navbar-collapse,\n  .navbar-inverse .navbar-form {\n    border-color: #101010; }\n  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {\n    background-color: #090909;\n    color: #fff; }\n  @media (max-width: 767px) {\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n      border-color: #090909; }\n    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n      background-color: #090909; }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n      color: #9d9d9d; }\n      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #fff;\n        background-color: transparent; }\n    .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 {\n      color: #fff;\n      background-color: #090909; }\n    .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 {\n      color: #444;\n      background-color: transparent; } }\n  .navbar-inverse .navbar-link {\n    color: #9d9d9d; }\n    .navbar-inverse .navbar-link:hover {\n      color: #fff; }\n  .navbar-inverse .btn-link {\n    color: #9d9d9d; }\n    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {\n      color: #fff; }\n    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,\n    fieldset[disabled] .navbar-inverse .btn-link:hover,\n    fieldset[disabled] .navbar-inverse .btn-link:focus {\n      color: #444; }\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px; }\n  .breadcrumb > li {\n    display: inline-block; }\n    .breadcrumb > li + li:before {\n      content: \"/ \";\n      padding: 0 5px;\n      color: #ccc; }\n  .breadcrumb > .active {\n    color: #777777; }\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px; }\n  .pagination > li {\n    display: inline; }\n    .pagination > li > a,\n    .pagination > li > span {\n      position: relative;\n      float: left;\n      padding: 6px 12px;\n      line-height: 1.428571429;\n      text-decoration: none;\n      color: #337ab7;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      margin-left: -1px; }\n    .pagination > li:first-child > a,\n    .pagination > li:first-child > span {\n      margin-left: 0;\n      border-bottom-left-radius: 4px;\n      border-top-left-radius: 4px; }\n    .pagination > li:last-child > a,\n    .pagination > li:last-child > span {\n      border-bottom-right-radius: 4px;\n      border-top-right-radius: 4px; }\n  .pagination > li > a:hover, .pagination > li > a:focus,\n  .pagination > li > span:hover,\n  .pagination > li > span:focus {\n    z-index: 2;\n    color: #23527c;\n    background-color: #eeeeee;\n    border-color: #ddd; }\n  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,\n  .pagination > .active > span,\n  .pagination > .active > span:hover,\n  .pagination > .active > span:focus {\n    z-index: 3;\n    color: #fff;\n    background-color: #337ab7;\n    border-color: #337ab7;\n    cursor: default; }\n  .pagination > .disabled > span,\n  .pagination > .disabled > span:hover,\n  .pagination > .disabled > span:focus,\n  .pagination > .disabled > a,\n  .pagination > .disabled > a:hover,\n  .pagination > .disabled > a:focus {\n    color: #777777;\n    background-color: #fff;\n    border-color: #ddd;\n    cursor: not-allowed; }\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333; }\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px; }\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px; }\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5; }\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px; }\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px; }\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center; }\n  .pager:before, .pager:after {\n    content: \" \";\n    display: table; }\n  .pager:after {\n    clear: both; }\n  .pager li {\n    display: inline; }\n    .pager li > a,\n    .pager li > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: #fff;\n      border: 1px solid #ddd;\n      border-radius: 15px; }\n    .pager li > a:hover,\n    .pager li > a:focus {\n      text-decoration: none;\n      background-color: #eeeeee; }\n  .pager .next > a,\n  .pager .next > span {\n    float: right; }\n  .pager .previous > a,\n  .pager .previous > span {\n    float: left; }\n  .pager .disabled > a,\n  .pager .disabled > a:hover,\n  .pager .disabled > a:focus,\n  .pager .disabled > span {\n    color: #777777;\n    background-color: #fff;\n    cursor: not-allowed; }\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em; }\n  .label:empty {\n    display: none; }\n  .btn .label {\n    position: relative;\n    top: -1px; }\n\na.label:hover, a.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer; }\n\n.label-default {\n  background-color: #777777; }\n  .label-default[href]:hover, .label-default[href]:focus {\n    background-color: #5e5e5e; }\n\n.label-primary {\n  background-color: #337ab7; }\n  .label-primary[href]:hover, .label-primary[href]:focus {\n    background-color: #286090; }\n\n.label-success {\n  background-color: #5cb85c; }\n  .label-success[href]:hover, .label-success[href]:focus {\n    background-color: #449d44; }\n\n.label-info {\n  background-color: #5bc0de; }\n  .label-info[href]:hover, .label-info[href]:focus {\n    background-color: #31b0d5; }\n\n.label-warning {\n  background-color: #f0ad4e; }\n  .label-warning[href]:hover, .label-warning[href]:focus {\n    background-color: #ec971f; }\n\n.label-danger {\n  background-color: #d9534f; }\n  .label-danger[href]:hover, .label-danger[href]:focus {\n    background-color: #c9302c; }\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #fff;\n  line-height: 1;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px; }\n  .badge:empty {\n    display: none; }\n  .btn .badge {\n    position: relative;\n    top: -1px; }\n  .btn-xs .badge, .btn-group-xs > .btn .badge,\n  .btn-group-xs > .btn .badge {\n    top: 0;\n    padding: 1px 5px; }\n  .list-group-item.active > .badge,\n  .nav-pills > .active > a > .badge {\n    color: #337ab7;\n    background-color: #fff; }\n  .list-group-item > .badge {\n    float: right; }\n  .list-group-item > .badge + .badge {\n    margin-right: 5px; }\n  .nav-pills > li > a > .badge {\n    margin-left: 3px; }\n\na.badge:hover, a.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer; }\n\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee; }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    color: inherit; }\n  .jumbotron p {\n    margin-bottom: 15px;\n    font-size: 21px;\n    font-weight: 200; }\n  .jumbotron > hr {\n    border-top-color: #d5d5d5; }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    border-radius: 6px;\n    padding-left: 15px;\n    padding-right: 15px; }\n  .jumbotron .container {\n    max-width: 100%; }\n  @media screen and (min-width: 768px) {\n    .jumbotron {\n      padding-top: 48px;\n      padding-bottom: 48px; }\n      .container .jumbotron,\n      .container-fluid .jumbotron {\n        padding-left: 60px;\n        padding-right: 60px; }\n      .jumbotron h1,\n      .jumbotron .h1 {\n        font-size: 63px; } }\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out; }\n  .thumbnail > img,\n  .thumbnail a > img {\n    display: block;\n    max-width: 100%;\n    height: auto;\n    margin-left: auto;\n    margin-right: auto; }\n  .thumbnail .caption {\n    padding: 9px;\n    color: #333333; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7; }\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px; }\n  .alert h4 {\n    margin-top: 0;\n    color: inherit; }\n  .alert .alert-link {\n    font-weight: bold; }\n  .alert > p,\n  .alert > ul {\n    margin-bottom: 0; }\n  .alert > p + p {\n    margin-top: 5px; }\n\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px; }\n  .alert-dismissable .close,\n  .alert-dismissible .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit; }\n\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d; }\n  .alert-success hr {\n    border-top-color: #c9e2b3; }\n  .alert-success .alert-link {\n    color: #2b542c; }\n\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f; }\n  .alert-info hr {\n    border-top-color: #a6e1ec; }\n  .alert-info .alert-link {\n    color: #245269; }\n\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b; }\n  .alert-warning hr {\n    border-top-color: #f7e1b5; }\n  .alert-warning .alert-link {\n    color: #66512c; }\n\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442; }\n  .alert-danger hr {\n    border-top-color: #e4b9c0; }\n  .alert-danger .alert-link {\n    color: #843534; }\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0; }\n  to {\n    background-position: 0 0; } }\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0; }\n  to {\n    background-position: 0 0; } }\n\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); }\n\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease; }\n\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  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);\n  background-image: -o-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);\n  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);\n  background-size: 40px 40px; }\n\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite; }\n\n.progress-bar-success {\n  background-color: #5cb85c; }\n  .progress-striped .progress-bar-success {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-info {\n  background-color: #5bc0de; }\n  .progress-striped .progress-bar-info {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-warning {\n  background-color: #f0ad4e; }\n  .progress-striped .progress-bar-warning {\n    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);\n    background-image: -o-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);\n    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); }\n\n.progress-bar-danger {\n  background-color: #d9534f; }\n  .progress-striped .progress-bar-danger {\n    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);\n    background-image: -o-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);\n    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); }\n\n.media {\n  margin-top: 15px; }\n  .media:first-child {\n    margin-top: 0; }\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden; }\n\n.media-body {\n  width: 10000px; }\n\n.media-object {\n  display: block; }\n  .media-object.img-thumbnail {\n    max-width: none; }\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px; }\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px; }\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top; }\n\n.media-middle {\n  vertical-align: middle; }\n\n.media-bottom {\n  vertical-align: bottom; }\n\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px; }\n\n.media-list {\n  padding-left: 0;\n  list-style: none; }\n\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0; }\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd; }\n  .list-group-item:first-child {\n    border-top-right-radius: 4px;\n    border-top-left-radius: 4px; }\n  .list-group-item:last-child {\n    margin-bottom: 0;\n    border-bottom-right-radius: 4px;\n    border-bottom-left-radius: 4px; }\n\na.list-group-item,\nbutton.list-group-item {\n  color: #555; }\n  a.list-group-item .list-group-item-heading,\n  button.list-group-item .list-group-item-heading {\n    color: #333; }\n  a.list-group-item:hover, a.list-group-item:focus,\n  button.list-group-item:hover,\n  button.list-group-item:focus {\n    text-decoration: none;\n    color: #555;\n    background-color: #f5f5f5; }\n\nbutton.list-group-item {\n  width: 100%;\n  text-align: left; }\n\n.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed; }\n  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {\n    color: inherit; }\n  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {\n    color: #777777; }\n\n.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7; }\n  .list-group-item.active .list-group-item-heading,\n  .list-group-item.active .list-group-item-heading > small,\n  .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,\n  .list-group-item.active:hover .list-group-item-heading > small,\n  .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,\n  .list-group-item.active:focus .list-group-item-heading > small,\n  .list-group-item.active:focus .list-group-item-heading > .small {\n    color: inherit; }\n  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {\n    color: #c7ddef; }\n\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8; }\n\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d; }\n  a.list-group-item-success .list-group-item-heading,\n  button.list-group-item-success .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-success:hover, a.list-group-item-success:focus,\n  button.list-group-item-success:hover,\n  button.list-group-item-success:focus {\n    color: #3c763d;\n    background-color: #d0e9c6; }\n  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,\n  button.list-group-item-success.active,\n  button.list-group-item-success.active:hover,\n  button.list-group-item-success.active:focus {\n    color: #fff;\n    background-color: #3c763d;\n    border-color: #3c763d; }\n\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7; }\n\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f; }\n  a.list-group-item-info .list-group-item-heading,\n  button.list-group-item-info .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-info:hover, a.list-group-item-info:focus,\n  button.list-group-item-info:hover,\n  button.list-group-item-info:focus {\n    color: #31708f;\n    background-color: #c4e3f3; }\n  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,\n  button.list-group-item-info.active,\n  button.list-group-item-info.active:hover,\n  button.list-group-item-info.active:focus {\n    color: #fff;\n    background-color: #31708f;\n    border-color: #31708f; }\n\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3; }\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b; }\n  a.list-group-item-warning .list-group-item-heading,\n  button.list-group-item-warning .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-warning:hover, a.list-group-item-warning:focus,\n  button.list-group-item-warning:hover,\n  button.list-group-item-warning:focus {\n    color: #8a6d3b;\n    background-color: #faf2cc; }\n  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,\n  button.list-group-item-warning.active,\n  button.list-group-item-warning.active:hover,\n  button.list-group-item-warning.active:focus {\n    color: #fff;\n    background-color: #8a6d3b;\n    border-color: #8a6d3b; }\n\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede; }\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442; }\n  a.list-group-item-danger .list-group-item-heading,\n  button.list-group-item-danger .list-group-item-heading {\n    color: inherit; }\n  a.list-group-item-danger:hover, a.list-group-item-danger:focus,\n  button.list-group-item-danger:hover,\n  button.list-group-item-danger:focus {\n    color: #a94442;\n    background-color: #ebcccc; }\n  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,\n  button.list-group-item-danger.active,\n  button.list-group-item-danger.active:hover,\n  button.list-group-item-danger.active:focus {\n    color: #fff;\n    background-color: #a94442;\n    border-color: #a94442; }\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px; }\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3; }\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }\n\n.panel-body {\n  padding: 15px; }\n  .panel-body:before, .panel-body:after {\n    content: \" \";\n    display: table; }\n  .panel-body:after {\n    clear: both; }\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px; }\n  .panel-heading > .dropdown .dropdown-toggle {\n    color: inherit; }\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit; }\n  .panel-title > a,\n  .panel-title > small,\n  .panel-title > .small,\n  .panel-title > small > a,\n  .panel-title > .small > a {\n    color: inherit; }\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px; }\n\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0; }\n  .panel > .list-group .list-group-item,\n  .panel > .panel-collapse > .list-group .list-group-item {\n    border-width: 1px 0;\n    border-radius: 0; }\n  .panel > .list-group:first-child .list-group-item:first-child,\n  .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n    border-top: 0;\n    border-top-right-radius: 3px;\n    border-top-left-radius: 3px; }\n  .panel > .list-group:last-child .list-group-item:last-child,\n  .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n    border-bottom: 0;\n    border-bottom-right-radius: 3px;\n    border-bottom-left-radius: 3px; }\n\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0; }\n\n.list-group + .panel-footer {\n  border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0; }\n  .panel > .table caption,\n  .panel > .table-responsive > .table caption,\n  .panel > .panel-collapse > .table caption {\n    padding-left: 15px;\n    padding-right: 15px; }\n\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px; }\n  .panel > .table:first-child > thead:first-child > tr:first-child,\n  .panel > .table:first-child > tbody:first-child > tr:first-child,\n  .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n  .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n    border-top-left-radius: 3px;\n    border-top-right-radius: 3px; }\n    .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n    .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n      border-top-left-radius: 3px; }\n    .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n    .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n    .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n    .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n      border-top-right-radius: 3px; }\n\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px; }\n  .panel > .table:last-child > tbody:last-child > tr:last-child,\n  .panel > .table:last-child > tfoot:last-child > tr:last-child,\n  .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n  .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n    border-bottom-left-radius: 3px;\n    border-bottom-right-radius: 3px; }\n    .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n    .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n      border-bottom-left-radius: 3px; }\n    .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n    .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n    .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n    .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n      border-bottom-right-radius: 3px; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd; }\n\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0; }\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0; }\n  .panel > .table-bordered > thead > tr > th:first-child,\n  .panel > .table-bordered > thead > tr > td:first-child,\n  .panel > .table-bordered > tbody > tr > th:first-child,\n  .panel > .table-bordered > tbody > tr > td:first-child,\n  .panel > .table-bordered > tfoot > tr > th:first-child,\n  .panel > .table-bordered > tfoot > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0; }\n  .panel > .table-bordered > thead > tr > th:last-child,\n  .panel > .table-bordered > thead > tr > td:last-child,\n  .panel > .table-bordered > tbody > tr > th:last-child,\n  .panel > .table-bordered > tbody > tr > td:last-child,\n  .panel > .table-bordered > tfoot > tr > th:last-child,\n  .panel > .table-bordered > tfoot > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0; }\n  .panel > .table-bordered > thead > tr:first-child > td,\n  .panel > .table-bordered > thead > tr:first-child > th,\n  .panel > .table-bordered > tbody > tr:first-child > td,\n  .panel > .table-bordered > tbody > tr:first-child > th,\n  .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n  .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n  .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n    border-bottom: 0; }\n  .panel > .table-bordered > tbody > tr:last-child > td,\n  .panel > .table-bordered > tbody > tr:last-child > th,\n  .panel > .table-bordered > tfoot > tr:last-child > td,\n  .panel > .table-bordered > tfoot > tr:last-child > th,\n  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n  .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n    border-bottom: 0; }\n\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0; }\n\n.panel-group {\n  margin-bottom: 20px; }\n  .panel-group .panel {\n    margin-bottom: 0;\n    border-radius: 4px; }\n    .panel-group .panel + .panel {\n      margin-top: 5px; }\n  .panel-group .panel-heading {\n    border-bottom: 0; }\n    .panel-group .panel-heading + .panel-collapse > .panel-body,\n    .panel-group .panel-heading + .panel-collapse > .list-group {\n      border-top: 1px solid #ddd; }\n  .panel-group .panel-footer {\n    border-top: 0; }\n    .panel-group .panel-footer + .panel-collapse .panel-body {\n      border-bottom: 1px solid #ddd; }\n\n.panel-default {\n  border-color: #ddd; }\n  .panel-default > .panel-heading {\n    color: #333333;\n    background-color: #f5f5f5;\n    border-color: #ddd; }\n    .panel-default > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #ddd; }\n    .panel-default > .panel-heading .badge {\n      color: #f5f5f5;\n      background-color: #333333; }\n  .panel-default > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #ddd; }\n\n.panel-primary {\n  border-color: #337ab7; }\n  .panel-primary > .panel-heading {\n    color: #fff;\n    background-color: #337ab7;\n    border-color: #337ab7; }\n    .panel-primary > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #337ab7; }\n    .panel-primary > .panel-heading .badge {\n      color: #337ab7;\n      background-color: #fff; }\n  .panel-primary > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #337ab7; }\n\n.panel-success {\n  border-color: #d6e9c6; }\n  .panel-success > .panel-heading {\n    color: #3c763d;\n    background-color: #dff0d8;\n    border-color: #d6e9c6; }\n    .panel-success > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #d6e9c6; }\n    .panel-success > .panel-heading .badge {\n      color: #dff0d8;\n      background-color: #3c763d; }\n  .panel-success > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #d6e9c6; }\n\n.panel-info {\n  border-color: #bce8f1; }\n  .panel-info > .panel-heading {\n    color: #31708f;\n    background-color: #d9edf7;\n    border-color: #bce8f1; }\n    .panel-info > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #bce8f1; }\n    .panel-info > .panel-heading .badge {\n      color: #d9edf7;\n      background-color: #31708f; }\n  .panel-info > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #bce8f1; }\n\n.panel-warning {\n  border-color: #faebcc; }\n  .panel-warning > .panel-heading {\n    color: #8a6d3b;\n    background-color: #fcf8e3;\n    border-color: #faebcc; }\n    .panel-warning > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #faebcc; }\n    .panel-warning > .panel-heading .badge {\n      color: #fcf8e3;\n      background-color: #8a6d3b; }\n  .panel-warning > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #faebcc; }\n\n.panel-danger {\n  border-color: #ebccd1; }\n  .panel-danger > .panel-heading {\n    color: #a94442;\n    background-color: #f2dede;\n    border-color: #ebccd1; }\n    .panel-danger > .panel-heading + .panel-collapse > .panel-body {\n      border-top-color: #ebccd1; }\n    .panel-danger > .panel-heading .badge {\n      color: #f2dede;\n      background-color: #a94442; }\n  .panel-danger > .panel-footer + .panel-collapse > .panel-body {\n    border-bottom-color: #ebccd1; }\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden; }\n  .embed-responsive .embed-responsive-item,\n  .embed-responsive iframe,\n  .embed-responsive embed,\n  .embed-responsive object,\n  .embed-responsive video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0; }\n\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%; }\n\n.embed-responsive-4by3 {\n  padding-bottom: 75%; }\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }\n  .well blockquote {\n    border-color: #ddd;\n    border-color: rgba(0, 0, 0, 0.15); }\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px; }\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px; }\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: 0.2;\n  filter: alpha(opacity=20); }\n  .close:hover, .close:focus {\n    color: #000;\n    text-decoration: none;\n    cursor: pointer;\n    opacity: 0.5;\n    filter: alpha(opacity=50); }\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none; }\n\n.modal-open {\n  overflow: hidden; }\n\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0; }\n  .modal.fade .modal-dialog {\n    -webkit-transform: translate(0, -25%);\n    -ms-transform: translate(0, -25%);\n    -o-transform: translate(0, -25%);\n    transform: translate(0, -25%);\n    -webkit-transition: -webkit-transform 0.3s ease-out;\n    -moz-transition: -moz-transform 0.3s ease-out;\n    -o-transition: -o-transform 0.3s ease-out;\n    transition: transform 0.3s ease-out; }\n  .modal.in .modal-dialog {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    -o-transform: translate(0, 0);\n    transform: translate(0, 0); }\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto; }\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px; }\n\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0; }\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000; }\n  .modal-backdrop.fade {\n    opacity: 0;\n    filter: alpha(opacity=0); }\n  .modal-backdrop.in {\n    opacity: 0.5;\n    filter: alpha(opacity=50); }\n\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5; }\n  .modal-header:before, .modal-header:after {\n    content: \" \";\n    display: table; }\n  .modal-header:after {\n    clear: both; }\n\n.modal-header .close {\n  margin-top: -2px; }\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429; }\n\n.modal-body {\n  position: relative;\n  padding: 15px; }\n\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5; }\n  .modal-footer:before, .modal-footer:after {\n    content: \" \";\n    display: table; }\n  .modal-footer:after {\n    clear: both; }\n  .modal-footer .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; }\n  .modal-footer .btn-group .btn + .btn {\n    margin-left: -1px; }\n  .modal-footer .btn-block + .btn-block {\n    margin-left: 0; }\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll; }\n\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto; }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }\n  .modal-sm {\n    width: 300px; } }\n\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px; } }\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Lato\", sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.428571429;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 12px;\n  opacity: 0;\n  filter: alpha(opacity=0); }\n  .tooltip.in {\n    opacity: 0.9;\n    filter: alpha(opacity=90); }\n  .tooltip.top {\n    margin-top: -3px;\n    padding: 5px 0; }\n  .tooltip.right {\n    margin-left: 3px;\n    padding: 0 5px; }\n  .tooltip.bottom {\n    margin-top: 3px;\n    padding: 5px 0; }\n  .tooltip.left {\n    margin-left: -3px;\n    padding: 0 5px; }\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px; }\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid; }\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000; }\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000; }\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000; }\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000; }\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Lato\", sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.428571429;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 14px;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }\n  .popover.top {\n    margin-top: -10px; }\n  .popover.right {\n    margin-left: 10px; }\n  .popover.bottom {\n    margin-top: 10px; }\n  .popover.left {\n    margin-left: -10px; }\n\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0; }\n\n.popover-content {\n  padding: 9px 14px; }\n\n.popover > .arrow, .popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid; }\n\n.popover > .arrow {\n  border-width: 11px; }\n\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\"; }\n\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px; }\n  .popover.top > .arrow:after {\n    content: \" \";\n    bottom: 1px;\n    margin-left: -10px;\n    border-bottom-width: 0;\n    border-top-color: #fff; }\n\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25); }\n  .popover.right > .arrow:after {\n    content: \" \";\n    left: 1px;\n    bottom: -10px;\n    border-left-width: 0;\n    border-right-color: #fff; }\n\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px; }\n  .popover.bottom > .arrow:after {\n    content: \" \";\n    top: 1px;\n    margin-left: -10px;\n    border-top-width: 0;\n    border-bottom-color: #fff; }\n\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25); }\n  .popover.left > .arrow:after {\n    content: \" \";\n    right: 1px;\n    border-right-width: 0;\n    border-left-color: #fff;\n    bottom: -10px; }\n\n.carousel {\n  position: relative; }\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%; }\n  .carousel-inner > .item {\n    display: none;\n    position: relative;\n    -webkit-transition: 0.6s ease-in-out left;\n    -o-transition: 0.6s ease-in-out left;\n    transition: 0.6s ease-in-out left; }\n    .carousel-inner > .item > img,\n    .carousel-inner > .item > a > img {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      line-height: 1; }\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      .carousel-inner > .item {\n        -webkit-transition: -webkit-transform 0.6s ease-in-out;\n        -moz-transition: -moz-transform 0.6s ease-in-out;\n        -o-transition: -o-transform 0.6s ease-in-out;\n        transition: transform 0.6s ease-in-out;\n        -webkit-backface-visibility: hidden;\n        -moz-backface-visibility: hidden;\n        backface-visibility: hidden;\n        -webkit-perspective: 1000px;\n        -moz-perspective: 1000px;\n        perspective: 1000px; }\n        .carousel-inner > .item.next, .carousel-inner > .item.active.right {\n          -webkit-transform: translate3d(100%, 0, 0);\n          transform: translate3d(100%, 0, 0);\n          left: 0; }\n        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {\n          -webkit-transform: translate3d(-100%, 0, 0);\n          transform: translate3d(-100%, 0, 0);\n          left: 0; }\n        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {\n          -webkit-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\n          left: 0; } }\n  .carousel-inner > .active,\n  .carousel-inner > .next,\n  .carousel-inner > .prev {\n    display: block; }\n  .carousel-inner > .active {\n    left: 0; }\n  .carousel-inner > .next,\n  .carousel-inner > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%; }\n  .carousel-inner > .next {\n    left: 100%; }\n  .carousel-inner > .prev {\n    left: -100%; }\n  .carousel-inner > .next.left,\n  .carousel-inner > .prev.right {\n    left: 0; }\n  .carousel-inner > .active.left {\n    left: -100%; }\n  .carousel-inner > .active.right {\n    left: 100%; }\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  background-color: transparent; }\n  .carousel-control.left {\n    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }\n  .carousel-control.right {\n    left: auto;\n    right: 0;\n    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }\n  .carousel-control:hover, .carousel-control:focus {\n    outline: 0;\n    color: #fff;\n    text-decoration: none;\n    opacity: 0.9;\n    filter: alpha(opacity=90); }\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next,\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    margin-top: -10px;\n    z-index: 5;\n    display: inline-block; }\n  .carousel-control .icon-prev,\n  .carousel-control .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px; }\n  .carousel-control .icon-next,\n  .carousel-control .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px; }\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 20px;\n    height: 20px;\n    line-height: 1;\n    font-family: serif; }\n  .carousel-control .icon-prev:before {\n    content: '\\2039'; }\n  .carousel-control .icon-next:before {\n    content: '\\203a'; }\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center; }\n  .carousel-indicators li {\n    display: inline-block;\n    width: 10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid #fff;\n    border-radius: 10px;\n    cursor: pointer;\n    background-color: #000 \\9;\n    background-color: transparent; }\n  .carousel-indicators .active {\n    margin: 0;\n    width: 12px;\n    height: 12px;\n    background-color: #fff; }\n\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }\n  .carousel-caption .btn {\n    text-shadow: none; }\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px; }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px; }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px; }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px; }\n  .carousel-indicators {\n    bottom: 20px; } }\n\n.clearfix:before, .clearfix:after {\n  content: \" \";\n  display: table; }\n\n.clearfix:after {\n  clear: both; }\n\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto; }\n\n.pull-right {\n  float: right !important; }\n\n.pull-left {\n  float: left !important; }\n\n.hide {\n  display: none !important; }\n\n.show {\n  display: block !important; }\n\n.invisible {\n  visibility: hidden; }\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0; }\n\n.hidden {\n  display: none !important; }\n\n.affix {\n  position: fixed; }\n\n@-ms-viewport {\n  width: device-width; }\n\n.visible-xs {\n  display: none !important; }\n\n.visible-sm {\n  display: none !important; }\n\n.visible-md {\n  display: none !important; }\n\n.visible-lg {\n  display: none !important; }\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important; }\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important; }\n  table.visible-xs {\n    display: table !important; }\n  tr.visible-xs {\n    display: table-row !important; }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important; } }\n\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important; }\n  table.visible-sm {\n    display: table !important; }\n  tr.visible-sm {\n    display: table-row !important; }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important; }\n  table.visible-md {\n    display: table !important; }\n  tr.visible-md {\n    display: table-row !important; }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important; }\n  table.visible-lg {\n    display: table !important; }\n  tr.visible-lg {\n    display: table-row !important; }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important; } }\n\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important; } }\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important; } }\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important; } }\n\n.visible-print {\n  display: none !important; }\n\n@media print {\n  .visible-print {\n    display: block !important; }\n  table.visible-print {\n    display: table !important; }\n  tr.visible-print {\n    display: table-row !important; }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important; } }\n\n.visible-print-block {\n  display: none !important; }\n  @media print {\n    .visible-print-block {\n      display: block !important; } }\n\n.visible-print-inline {\n  display: none !important; }\n  @media print {\n    .visible-print-inline {\n      display: inline !important; } }\n\n.visible-print-inline-block {\n  display: none !important; }\n  @media print {\n    .visible-print-inline-block {\n      display: inline-block !important; } }\n\n@media print {\n  .hidden-print {\n    display: none !important; } }\n","@import url(https://fonts.googleapis.com/css?family=Lato);\n$font-family-sans-serif: 'Lato', sans-serif;\n\n@import \"node_modules/bootstrap-sass/assets/stylesheets/bootstrap\";\n","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n// Core variables and mixins\n@import \"bootstrap/variables\";\n@import \"bootstrap/mixins\";\n\n// Reset and dependencies\n@import \"bootstrap/normalize\";\n@import \"bootstrap/print\";\n@import \"bootstrap/glyphicons\";\n\n// Core CSS\n@import \"bootstrap/scaffolding\";\n@import \"bootstrap/type\";\n@import \"bootstrap/code\";\n@import \"bootstrap/grid\";\n@import \"bootstrap/tables\";\n@import \"bootstrap/forms\";\n@import \"bootstrap/buttons\";\n\n// Components\n@import \"bootstrap/component-animations\";\n@import \"bootstrap/dropdowns\";\n@import \"bootstrap/button-groups\";\n@import \"bootstrap/input-groups\";\n@import \"bootstrap/navs\";\n@import \"bootstrap/navbar\";\n@import \"bootstrap/breadcrumbs\";\n@import \"bootstrap/pagination\";\n@import \"bootstrap/pager\";\n@import \"bootstrap/labels\";\n@import \"bootstrap/badges\";\n@import \"bootstrap/jumbotron\";\n@import \"bootstrap/thumbnails\";\n@import \"bootstrap/alerts\";\n@import \"bootstrap/progress-bars\";\n@import \"bootstrap/media\";\n@import \"bootstrap/list-group\";\n@import \"bootstrap/panels\";\n@import \"bootstrap/responsive-embed\";\n@import \"bootstrap/wells\";\n@import \"bootstrap/close\";\n\n// Components w/ JavaScript\n@import \"bootstrap/modals\";\n@import \"bootstrap/tooltip\";\n@import \"bootstrap/popovers\";\n@import \"bootstrap/carousel\";\n\n// Utility classes\n@import \"bootstrap/utilities\";\n@import \"bootstrap/responsive-utilities\";\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n//    without disabling user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n@at-root {\n  // Import the fonts\n  @font-face {\n    font-family: 'Glyphicons Halflings';\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');\n  }\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\002a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  @include box-sizing(border-box);\n}\n*:before,\n*:after {\n  @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: $font-family-base;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $text-color;\n  background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: $link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n  }\n\n  &:focus {\n    @include tab-focus;\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: $thumbnail-padding;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    $line-height-computed;\n  margin-bottom: $line-height-computed;\n  border: 0;\n  border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n  cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n  -webkit-animation: $animation;\n       -o-animation: $animation;\n          animation: $animation;\n}\n@mixin animation-name($name) {\n  -webkit-animation-name: $name;\n          animation-name: $name;\n}\n@mixin animation-duration($duration) {\n  -webkit-animation-duration: $duration;\n          animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n  -webkit-animation-timing-function: $timing-function;\n          animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n  -webkit-animation-delay: $delay;\n          animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n  -webkit-animation-iteration-count: $iteration-count;\n          animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n  -webkit-animation-direction: $direction;\n          animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n  -webkit-animation-fill-mode: $fill-mode;\n          animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility) {\n  -webkit-backface-visibility: $visibility;\n     -moz-backface-visibility: $visibility;\n          backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n          box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n  -webkit-box-sizing: $boxmodel;\n     -moz-box-sizing: $boxmodel;\n          box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n  -webkit-column-count: $column-count;\n     -moz-column-count: $column-count;\n          column-count: $column-count;\n  -webkit-column-gap: $column-gap;\n     -moz-column-gap: $column-gap;\n          column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: $mode;\n     -moz-hyphens: $mode;\n      -ms-hyphens: $mode; // IE10+\n       -o-hyphens: $mode;\n          hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: $color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n  -webkit-transform: scale($ratio);\n      -ms-transform: scale($ratio); // IE9 only\n       -o-transform: scale($ratio);\n          transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n  -webkit-transform: scaleX($ratio);\n      -ms-transform: scaleX($ratio); // IE9 only\n       -o-transform: scaleX($ratio);\n          transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n  -webkit-transform: scaleY($ratio);\n      -ms-transform: scaleY($ratio); // IE9 only\n       -o-transform: scaleY($ratio);\n          transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n  -webkit-transform: skewX($x) skewY($y);\n      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX($x) skewY($y);\n          transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n  -webkit-transform: translate($x, $y);\n      -ms-transform: translate($x, $y); // IE9 only\n       -o-transform: translate($x, $y);\n          transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n  -webkit-transform: translate3d($x, $y, $z);\n          transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees); // IE9 only\n       -o-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n  -webkit-transform: rotateX($degrees);\n      -ms-transform: rotateX($degrees); // IE9 only\n       -o-transform: rotateX($degrees);\n          transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n  -webkit-transform: rotateY($degrees);\n      -ms-transform: rotateY($degrees); // IE9 only\n       -o-transform: rotateY($degrees);\n          transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n  -webkit-perspective: $perspective;\n     -moz-perspective: $perspective;\n          perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n  -webkit-perspective-origin: $perspective;\n     -moz-perspective-origin: $perspective;\n          perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n  -webkit-transform-origin: $origin;\n     -moz-transform-origin: $origin;\n      -ms-transform-origin: $origin; // IE9 only\n          transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n  -webkit-transition: $transition;\n       -o-transition: $transition;\n          transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n  -webkit-transition-property: $transition-property;\n          transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n  -webkit-transition-delay: $transition-delay;\n          transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n  -webkit-transition-duration: $transition-duration;\n          transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n  -webkit-transition-timing-function: $timing-function;\n          transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n  -webkit-transition: -webkit-transform $transition;\n     -moz-transition: -moz-transform $transition;\n       -o-transition: -o-transform $transition;\n          transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n  -webkit-user-select: $select;\n     -moz-user-select: $select;\n      -ms-user-select: $select; // IE10+\n          user-select: $select;\n}\n","$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n$gray-base:              #000 !default;\n$gray-darker:            lighten($gray-base, 13.5%) !default; // #222\n$gray-dark:              lighten($gray-base, 20%) !default;   // #333\n$gray:                   lighten($gray-base, 33.5%) !default; // #555\n$gray-light:             lighten($gray-base, 46.7%) !default; // #777\n$gray-lighter:           lighten($gray-base, 93.5%) !default; // #eee\n\n$brand-primary:         darken(#428bca, 6.5%) !default; // #337ab7\n$brand-success:         #5cb85c !default;\n$brand-info:            #5bc0de !default;\n$brand-warning:         #f0ad4e !default;\n$brand-danger:          #d9534f !default;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n$body-bg:               #fff !default;\n//** Global text color on `<body>`.\n$text-color:            $gray-dark !default;\n\n//** Global textual link color.\n$link-color:            $brand-primary !default;\n//** Link hover color set via `darken()` function.\n$link-hover-color:      darken($link-color, 15%) !default;\n//** Link hover decoration.\n$link-hover-decoration: underline !default;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif:       Georgia, \"Times New Roman\", Times, serif !default;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n$font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base:        $font-family-sans-serif !default;\n\n$font-size-base:          14px !default;\n$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5:            $font-size-base !default;\n$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base:        1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the `<body>`.\n$headings-font-family:    inherit !default;\n$headings-font-weight:    500 !default;\n$headings-line-height:    1.1 !default;\n$headings-color:          inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name:          \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id:        \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical:     6px !default;\n$padding-base-horizontal:   12px !default;\n\n$padding-large-vertical:    10px !default;\n$padding-large-horizontal:  16px !default;\n\n$padding-small-vertical:    5px !default;\n$padding-small-horizontal:  10px !default;\n\n$padding-xs-vertical:       1px !default;\n$padding-xs-horizontal:     5px !default;\n\n$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small:         1.5 !default;\n\n$border-radius-base:        4px !default;\n$border-radius-large:       6px !default;\n$border-radius-small:       3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color:    #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg:       $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n$caret-width-base:          4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large:         5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n$table-cell-padding:            8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding:  5px !default;\n\n//** Default background color used for all tables.\n$table-bg:                      transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent:               #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover:                #f5f5f5 !default;\n$table-bg-active:               $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color:            #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight:                normal !default;\n\n$btn-default-color:              #333 !default;\n$btn-default-bg:                 #fff !default;\n$btn-default-border:             #ccc !default;\n\n$btn-primary-color:              #fff !default;\n$btn-primary-bg:                 $brand-primary !default;\n$btn-primary-border:             darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color:              #fff !default;\n$btn-success-bg:                 $brand-success !default;\n$btn-success-border:             darken($btn-success-bg, 5%) !default;\n\n$btn-info-color:                 #fff !default;\n$btn-info-bg:                    $brand-info !default;\n$btn-info-border:                darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color:              #fff !default;\n$btn-warning-bg:                 $brand-warning !default;\n$btn-warning-border:             darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color:               #fff !default;\n$btn-danger-bg:                  $brand-danger !default;\n$btn-danger-border:              darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color:        $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base:         $border-radius-base !default;\n$btn-border-radius-large:        $border-radius-large !default;\n$btn-border-radius-small:        $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n$input-bg:                       #fff !default;\n//** `<input disabled>` background color\n$input-bg-disabled:              $gray-lighter !default;\n\n//** Text color for `<input>`s\n$input-color:                    $gray !default;\n//** `<input>` border color\n$input-border:                   #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.\n$input-border-radius:            $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large:      $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small:      $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus:             #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder:        #999 !default;\n\n//** Default `.form-control` height\n$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom:       15px !default;\n\n$legend-color:                   $gray-dark !default;\n$legend-border-color:            #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg:           $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled:                not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg:                    #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border:                rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border:       #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg:            #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color:            $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg:         #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color:     $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg:        $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color:   $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color:          $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color:           #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar:            1000 !default;\n$zindex-dropdown:          1000 !default;\n$zindex-popover:           1060 !default;\n$zindex-tooltip:           1070 !default;\n$zindex-navbar-fixed:      1030 !default;\n$zindex-modal-background:  1040 !default;\n$zindex-modal:             1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs:                  480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min:              $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone:               $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm:                  768px !default;\n$screen-sm-min:              $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet:              $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md:                  992px !default;\n$screen-md-min:              $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop:             $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg:                  1200px !default;\n$screen-lg-min:              $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop:          $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max:              ($screen-sm-min - 1) !default;\n$screen-sm-max:              ($screen-md-min - 1) !default;\n$screen-md-max:              ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns:              12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width:         30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint:     $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet:             (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm:                 $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop:            (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md:                 $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop:      (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg:                 $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height:                    50px !default;\n$navbar-margin-bottom:             $line-height-computed !default;\n$navbar-border-radius:             $border-radius-base !default;\n$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height:       340px !default;\n\n$navbar-default-color:             #777 !default;\n$navbar-default-bg:                #f8f8f8 !default;\n$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color:                #777 !default;\n$navbar-default-link-hover-color:          #333 !default;\n$navbar-default-link-hover-bg:             transparent !default;\n$navbar-default-link-active-color:         #555 !default;\n$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color:       #ccc !default;\n$navbar-default-link-disabled-bg:          transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color:               $navbar-default-link-color !default;\n$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg:            transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg:           #ddd !default;\n$navbar-default-toggle-icon-bar-bg:        #888 !default;\n$navbar-default-toggle-border-color:       #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color:                      lighten($gray-light, 15%) !default;\n$navbar-inverse-bg:                         #222 !default;\n$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color:           #fff !default;\n$navbar-inverse-link-hover-bg:              transparent !default;\n$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color:        #444 !default;\n$navbar-inverse-link-disabled-bg:           transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color:          #fff !default;\n$navbar-inverse-brand-hover-bg:             transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg:            #333 !default;\n$navbar-inverse-toggle-icon-bar-bg:         #fff !default;\n$navbar-inverse-toggle-border-color:        #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding:                          10px 15px !default;\n$nav-link-hover-bg:                         $gray-lighter !default;\n\n$nav-disabled-link-color:                   $gray-light !default;\n$nav-disabled-link-hover-color:             $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color:                     #ddd !default;\n\n$nav-tabs-link-hover-border-color:          $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg:             $body-bg !default;\n$nav-tabs-active-link-hover-color:          $gray !default;\n$nav-tabs-active-link-hover-border-color:   #ddd !default;\n\n$nav-tabs-justified-link-border-color:            #ddd !default;\n$nav-tabs-justified-active-link-border-color:     $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius:                   $border-radius-base !default;\n$nav-pills-active-link-hover-bg:            $component-active-bg !default;\n$nav-pills-active-link-hover-color:         $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color:                     $link-color !default;\n$pagination-bg:                        #fff !default;\n$pagination-border:                    #ddd !default;\n\n$pagination-hover-color:               $link-hover-color !default;\n$pagination-hover-bg:                  $gray-lighter !default;\n$pagination-hover-border:              #ddd !default;\n\n$pagination-active-color:              #fff !default;\n$pagination-active-bg:                 $brand-primary !default;\n$pagination-active-border:             $brand-primary !default;\n\n$pagination-disabled-color:            $gray-light !default;\n$pagination-disabled-bg:               #fff !default;\n$pagination-disabled-border:           #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg:                             $pagination-bg !default;\n$pager-border:                         $pagination-border !default;\n$pager-border-radius:                  15px !default;\n\n$pager-hover-bg:                       $pagination-hover-bg !default;\n\n$pager-active-bg:                      $pagination-active-bg !default;\n$pager-active-color:                   $pagination-active-color !default;\n\n$pager-disabled-color:                 $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding:              30px !default;\n$jumbotron-color:                inherit !default;\n$jumbotron-bg:                   $gray-lighter !default;\n$jumbotron-heading-color:        inherit !default;\n$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text:             #3c763d !default;\n$state-success-bg:               #dff0d8 !default;\n$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text:                #31708f !default;\n$state-info-bg:                  #d9edf7 !default;\n$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text:             #8a6d3b !default;\n$state-warning-bg:               #fcf8e3 !default;\n$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text:              #a94442 !default;\n$state-danger-bg:                #f2dede !default;\n$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width:           200px !default;\n//** Tooltip text color\n$tooltip-color:               #fff !default;\n//** Tooltip background color\n$tooltip-bg:                  #000 !default;\n$tooltip-opacity:             .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width:         5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color:         $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg:                          #fff !default;\n//** Popover maximum width\n$popover-max-width:                   276px !default;\n//** Popover border color\n$popover-border-color:                rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color:       #ccc !default;\n\n//** Popover title background color\n$popover-title-bg:                    darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width:                 10px !default;\n//** Popover arrow color\n$popover-arrow-color:                 $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg:            $gray-light !default;\n//** Primary label background color\n$label-primary-bg:            $brand-primary !default;\n//** Success label background color\n$label-success-bg:            $brand-success !default;\n//** Info label background color\n$label-info-bg:               $brand-info !default;\n//** Warning label background color\n$label-warning-bg:            $brand-warning !default;\n//** Danger label background color\n$label-danger-bg:             $brand-danger !default;\n\n//** Default label text color\n$label-color:                 #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color:      #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding:         15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding:         15px !default;\n//** Modal title line-height\n$modal-title-line-height:     $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg:                             #fff !default;\n//** Modal content border color\n$modal-content-border-color:                   rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color:          #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg:           #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity:      .5 !default;\n//** Modal header border color\n$modal-header-border-color:   #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color:   $modal-header-border-color !default;\n\n$modal-lg:                    900px !default;\n$modal-md:                    600px !default;\n$modal-sm:                    300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding:               15px !default;\n$alert-border-radius:         $border-radius-base !default;\n$alert-link-font-weight:      bold !default;\n\n$alert-success-bg:            $state-success-bg !default;\n$alert-success-text:          $state-success-text !default;\n$alert-success-border:        $state-success-border !default;\n\n$alert-info-bg:               $state-info-bg !default;\n$alert-info-text:             $state-info-text !default;\n$alert-info-border:           $state-info-border !default;\n\n$alert-warning-bg:            $state-warning-bg !default;\n$alert-warning-text:          $state-warning-text !default;\n$alert-warning-border:        $state-warning-border !default;\n\n$alert-danger-bg:             $state-danger-bg !default;\n$alert-danger-text:           $state-danger-text !default;\n$alert-danger-border:         $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg:                 #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color:          #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius:      $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg:             $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg:     $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg:     $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg:      $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg:        $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg:                 #fff !default;\n//** `.list-group-item` border color\n$list-group-border:             #ddd !default;\n//** List group border radius\n$list-group-border-radius:      $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg:           #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color:       $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg:          $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border:      $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color:      $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg:         $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color:         #555 !default;\n$list-group-link-hover-color:   $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg:                    #fff !default;\n$panel-body-padding:          15px !default;\n$panel-heading-padding:       10px 15px !default;\n$panel-footer-padding:        $panel-heading-padding !default;\n$panel-border-radius:         $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border:          #ddd !default;\n$panel-footer-bg:             #f5f5f5 !default;\n\n$panel-default-text:          $gray-dark !default;\n$panel-default-border:        #ddd !default;\n$panel-default-heading-bg:    #f5f5f5 !default;\n\n$panel-primary-text:          #fff !default;\n$panel-primary-border:        $brand-primary !default;\n$panel-primary-heading-bg:    $brand-primary !default;\n\n$panel-success-text:          $state-success-text !default;\n$panel-success-border:        $state-success-border !default;\n$panel-success-heading-bg:    $state-success-bg !default;\n\n$panel-info-text:             $state-info-text !default;\n$panel-info-border:           $state-info-border !default;\n$panel-info-heading-bg:       $state-info-bg !default;\n\n$panel-warning-text:          $state-warning-text !default;\n$panel-warning-border:        $state-warning-border !default;\n$panel-warning-heading-bg:    $state-warning-bg !default;\n\n$panel-danger-text:           $state-danger-text !default;\n$panel-danger-border:         $state-danger-border !default;\n$panel-danger-heading-bg:     $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding:           4px !default;\n//** Thumbnail background color\n$thumbnail-bg:                $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border:            #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius:     $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color:     $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding:   9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg:                     #f5f5f5 !default;\n$well-border:                 darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color:                 #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color:      #fff !default;\n$badge-bg:                    $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color:          $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg:             #fff !default;\n\n$badge-font-weight:           bold !default;\n$badge-line-height:           1 !default;\n$badge-border-radius:         10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical:   8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg:                 #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color:              #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color:       $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator:          \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color:                      #fff !default;\n$carousel-control-width:                      15% !default;\n$carousel-control-opacity:                    .5 !default;\n$carousel-control-font-size:                  20px !default;\n\n$carousel-indicator-active-bg:                #fff !default;\n$carousel-indicator-border-color:             #fff !default;\n\n$carousel-caption-color:                      #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight:           bold !default;\n$close-color:                 #000 !default;\n$close-text-shadow:           0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color:                  #c7254e !default;\n$code-bg:                     #f9f2f4 !default;\n\n$kbd-color:                   #fff !default;\n$kbd-bg:                      #333 !default;\n\n$pre-bg:                      #f5f5f5 !default;\n$pre-color:                   $gray-dark !default;\n$pre-border-color:            #ccc !default;\n$pre-scrollable-max-height:   340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted:                  $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color:           $gray-light !default;\n//** Headings small color\n$headings-small-color:        $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color:      $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size:        ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color:     $gray-lighter !default;\n//** Page header border color\n$page-header-border-color:    $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset:        $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border:                   $gray-lighter !default;\n","// WebKit-style focus\n\n@mixin tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n  display: $display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n    background-size: $width-1x $height-1x;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: $headings-font-family;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: $headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: $headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: $line-height-computed;\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: ($line-height-computed / 2);\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: $line-height-computed;\n  font-size: floor(($font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: $screen-sm-min) {\n    font-size: ($font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n  background-color: $state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (($line-height-computed / 2) - 1);\n  margin: ($line-height-computed * 2) 0 $line-height-computed;\n  border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: ($line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n  @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled;\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n  line-height: $line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: $dl-horizontal-breakpoint) {\n    dt {\n      float: left;\n      width: ($dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      @include text-overflow;\n    }\n    dd {\n      margin-left: $dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: ($line-height-computed / 2) $line-height-computed;\n  margin: 0 0 $line-height-computed;\n  font-size: $blockquote-font-size;\n  border-left: 5px solid $blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: $line-height-base;\n    color: $blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid $blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: $line-height-computed;\n  font-style: normal;\n  line-height: $line-height-base;\n}\n","// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n  #{$parent} {\n    color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    color: darken($color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n  #{$parent} {\n    background-color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    background-color: darken($color, 10%);\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n@mixin clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $code-color;\n  background-color: $code-bg;\n  border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  border-radius: $border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (($line-height-computed - 1) / 2);\n  margin: 0 0 ($line-height-computed / 2);\n  font-size: ($font-size-base - 1); // 14px to 13px\n  line-height: $line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: $pre-color;\n  background-color: $pre-bg;\n  border: 1px solid $pre-border-color;\n  border-radius: $border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: $pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  @include container-fixed;\n\n  @media (min-width: $screen-sm-min) {\n    width: $container-sm;\n  }\n  @media (min-width: $screen-md-min) {\n    width: $container-md;\n  }\n  @media (min-width: $screen-lg-min) {\n    width: $container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  @include container-fixed;\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  @include make-row;\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@include make-grid-columns;\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n@include make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: $screen-sm-min) {\n  @include make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: $screen-md-min) {\n  @include make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: $screen-lg-min) {\n  @include make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  floor(($gutter / 2));\n  padding-right: ceil(($gutter / 2));\n  @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n  margin-left:  ceil(($gutter / -2));\n  margin-right: floor(($gutter / -2));\n  @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage(($columns / $grid-columns));\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n  margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n  left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n  right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-sm-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-offset($columns) {\n  @media (min-width: $screen-sm-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-push($columns) {\n  @media (min-width: $screen-sm-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-pull($columns) {\n  @media (min-width: $screen-sm-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-md-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-offset($columns) {\n  @media (min-width: $screen-md-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-push($columns) {\n  @media (min-width: $screen-md-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-pull($columns) {\n  @media (min-width: $screen-md-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-lg-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-offset($columns) {\n  @media (min-width: $screen-lg-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-push($columns) {\n  @media (min-width: $screen-lg-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-pull($columns) {\n  @media (min-width: $screen-lg-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n  }\n  #{$list} {\n    position: relative;\n    // Prevent columns from collapsing when empty\n    min-height: 1px;\n    // Inner gutter via padding\n    padding-left:  ceil(($grid-gutter-width / 2));\n    padding-right: floor(($grid-gutter-width / 2));\n  }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-#{$class}-#{$i}\";\n  }\n  #{$list} {\n    float: left;\n  }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n  @if ($type == width) and ($index > 0) {\n    .col-#{$class}-#{$index} {\n      width: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index > 0) {\n    .col-#{$class}-push-#{$index} {\n      left: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index == 0) {\n    .col-#{$class}-push-0 {\n      left: auto;\n    }\n  }\n  @if ($type == pull) and ($index > 0) {\n    .col-#{$class}-pull-#{$index} {\n      right: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == pull) and ($index == 0) {\n    .col-#{$class}-pull-0 {\n      right: auto;\n    }\n  }\n  @if ($type == offset) {\n    .col-#{$class}-offset-#{$index} {\n      margin-left: percentage(($index / $grid-columns));\n    }\n  }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n  @for $i from 0 through $columns {\n    @include calc-grid-column($i, $class, $type);\n  }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n  @include float-grid-columns($class);\n  @include loop-grid-columns($grid-columns, $class, width);\n  @include loop-grid-columns($grid-columns, $class, pull);\n  @include loop-grid-columns($grid-columns, $class, push);\n  @include loop-grid-columns($grid-columns, $class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: $table-bg;\n}\ncaption {\n  padding-top: $table-cell-padding;\n  padding-bottom: $table-cell-padding;\n  color: $text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: $line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-cell-padding;\n        line-height: $line-height-base;\n        vertical-align: top;\n        border-top: 1px solid $table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid $table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid $table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: $body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid $table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid $table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: $table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: $table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: $screen-xs-max) {\n    width: 100%;\n    margin-bottom: ($line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid $table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.#{$state},\n    > th.#{$state},\n    &.#{$state} > td,\n    &.#{$state} > th {\n      background-color: $background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.#{$state}:hover,\n    > th.#{$state}:hover,\n    &.#{$state}:hover > td,\n    &:hover > .#{$state},\n    &.#{$state}:hover > th {\n      background-color: darken($background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: $line-height-computed;\n  font-size: ($font-size-base * 1.5);\n  line-height: inherit;\n  color: $legend-color;\n  border: 0;\n  border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  @include tab-focus;\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: ($padding-base-vertical + 1);\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n  background-color: $input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid $input-border;\n  border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  @include form-control-focus;\n\n  // Placeholder\n  @include placeholder;\n\n  // Unstyle the caret on `<select>`s in IE10+.\n  &::-ms-expand {\n    border: 0;\n    background-color: transparent;\n  }\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    background-color: $input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n  }\n\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n\n  // [converter] extracted textarea& to textarea.form-control\n}\n\n// Reset height for `textarea`s\ntextarea.form-control {\n  height: auto;\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    &.form-control {\n      line-height: $input-height-base;\n    }\n\n    &.input-sm,\n    .input-group-sm & {\n      line-height: $input-height-small;\n    }\n\n    &.input-lg,\n    .input-group-lg & {\n      line-height: $input-height-large;\n    }\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: $form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: ($padding-base-vertical + 1);\n  padding-bottom: ($padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n  min-height: ($line-height-computed + $font-size-base);\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);\n.form-group-sm {\n  .form-control {\n    height: $input-height-small;\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    line-height: $line-height-small;\n    border-radius: $input-border-radius-small;\n  }\n  select.form-control {\n    height: $input-height-small;\n    line-height: $input-height-small;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: $input-height-small;\n    min-height: ($line-height-computed + $font-size-small);\n    padding: ($padding-small-vertical + 1) $padding-small-horizontal;\n    font-size: $font-size-small;\n    line-height: $line-height-small;\n  }\n}\n\n@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);\n.form-group-lg {\n  .form-control {\n    height: $input-height-large;\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    line-height: $line-height-large;\n    border-radius: $input-border-radius-large;\n  }\n  select.form-control {\n    height: $input-height-large;\n    line-height: $input-height-large;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: $input-height-large;\n    min-height: ($line-height-computed + $font-size-large);\n    padding: ($padding-large-vertical + 1) $padding-large-horizontal;\n    font-size: $font-size-large;\n    line-height: $line-height-large;\n  }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: ($input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: $input-height-base;\n  height: $input-height-base;\n  line-height: $input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: $input-height-large;\n  height: $input-height-large;\n  line-height: $input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: $input-height-small;\n  height: $input-height-small;\n  line-height: $input-height-small;\n}\n\n// Feedback states\n.has-success {\n  @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);\n}\n.has-warning {\n  @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);\n}\n.has-error {\n  @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n    top: ($line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n    top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten($text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n// [converter] extracted from `.form-inline` for libsass compatibility\n@mixin form-inline {\n\n  // Kick in the inline\n  @media (min-width: $screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match.\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n// [converter] extracted as `@mixin form-inline` for libsass compatibility\n.form-inline {\n  @include form-inline;\n}\n\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: ($line-height-computed + ($padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    @include make-row;\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: $screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: floor(($grid-gutter-width / 2));\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: $screen-sm-min) {\n      .control-label {\n        padding-top: ($padding-large-vertical + 1);\n        font-size: $font-size-large;\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: $screen-sm-min) {\n      .control-label {\n        padding-top: ($padding-small-vertical + 1);\n        font-size: $font-size-small;\n      }\n    }\n  }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: $text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: $border-color;\n    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken($border-color, 10%);\n      $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);\n      @include box-shadow($shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: $text-color;\n    border-color: $border-color;\n    background-color: $background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: $text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus($color: $input-border-focus) {\n  $color-rgba: rgba(red($color), green($color), blue($color), .6);\n  &:focus {\n    border-color: $color;\n    outline: 0;\n    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  #{$parent} {\n    height: $input-height;\n    padding: $padding-vertical $padding-horizontal;\n    font-size: $font-size;\n    line-height: $line-height;\n    border-radius: $border-radius;\n  }\n\n  select#{$parent} {\n    height: $input-height;\n    line-height: $input-height;\n  }\n\n  textarea#{$parent},\n  select[multiple]#{$parent} {\n    height: auto;\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: $btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n  @include user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      @include tab-focus;\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: $btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n    @include opacity(.65);\n    @include box-shadow(none);\n  }\n\n  // [converter] extracted a& to a.btn\n}\n\na.btn {\n  &.disabled,\n  fieldset[disabled] & {\n    pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: $link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    @include box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: $btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n\n  &:focus,\n  &.focus {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 25%);\n  }\n  &:hover {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n\n    &:hover,\n    &:focus,\n    &.focus {\n      color: $color;\n      background-color: darken($background, 17%);\n          border-color: darken($border, 25%);\n    }\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus,\n    &.focus {\n      background-color: $background;\n          border-color: $border;\n    }\n  }\n\n  .badge {\n    color: $background;\n    background-color: $color;\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  padding: $padding-vertical $padding-horizontal;\n  font-size: $font-size;\n  line-height: $line-height;\n  border-radius: $border-radius;\n}\n","// Opacity\n\n@mixin opacity($opacity) {\n  opacity: $opacity;\n  // IE8 filter\n  $opacity-ie: ($opacity * 100);\n  filter: alpha(opacity=$opacity-ie);\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  @include transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  // [converter] extracted tr&.in to tr.collapse.in\n  // [converter] extracted tbody&.in to tbody.collapse.in\n}\n\ntr.collapse.in    { display: table-row; }\n\ntbody.collapse.in { display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  @include transition-property(height, visibility);\n  @include transition-duration(.35s);\n  @include transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   $caret-width-base dashed;\n  border-top:   $caret-width-base solid \\9; // IE8\n  border-right: $caret-width-base solid transparent;\n  border-left:  $caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: $zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: $font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: $dropdown-bg;\n  border: 1px solid $dropdown-fallback-border; // IE8 fallback\n  border: 1px solid $dropdown-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    @include nav-divider($dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: $line-height-base;\n    color: $dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $dropdown-link-hover-color;\n    background-color: $dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: $dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    @include reset-filter;\n    cursor: $cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: $font-size-small;\n  line-height: $line-height-base;\n  color: $dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: ($zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: $caret-width-base dashed;\n    border-bottom: $caret-width-base solid \\9; // IE8\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      right: 0; left: auto;\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      left: 0; right: auto;\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n  height: 1px;\n  margin: (($line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: $color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  @include clearfix;\n\n  .btn,\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    @include border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { @extend .btn-xs; }\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: $caret-width-large $caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 $caret-width-large $caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    @include clearfix;\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    @include border-top-radius($btn-border-radius-base);\n    @include border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    @include border-top-radius(0);\n    @include border-bottom-radius($btn-border-radius-base);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","// Single side border-radius\n\n@mixin border-top-radius($radius) {\n  border-top-right-radius: $radius;\n   border-top-left-radius: $radius;\n}\n@mixin border-right-radius($radius) {\n  border-bottom-right-radius: $radius;\n     border-top-right-radius: $radius;\n}\n@mixin border-bottom-radius($radius) {\n  border-bottom-right-radius: $radius;\n   border-bottom-left-radius: $radius;\n}\n@mixin border-left-radius($radius) {\n  border-bottom-left-radius: $radius;\n     border-top-left-radius: $radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n    \n    &:focus {\n      z-index: 3;\n    }\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  @extend .input-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  @extend .input-sm;\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: $input-color;\n  text-align: center;\n  background-color: $input-group-addon-bg;\n  border: 1px solid $input-group-addon-border-color;\n  border-radius: $input-border-radius;\n\n  // Sizing\n  &.input-sm {\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    border-radius: $input-border-radius-small;\n  }\n  &.input-lg {\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    border-radius: $input-border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  @include border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  @include border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      z-index: 2;\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  @include clearfix;\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: $nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: $nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: $nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: $nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: $cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: $nav-link-hover-bg;\n      border-color: $link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    @include nav-divider;\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid $nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: $line-height-base;\n      border: 1px solid transparent;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n      &:hover {\n        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-tabs-active-link-hover-color;\n        background-color: $nav-tabs-active-link-hover-bg;\n        border: 1px solid $nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    @extend .nav-justified;\n    @extend .nav-tabs-justified;\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: $nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-pills-active-link-hover-color;\n        background-color: $nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: $border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid $nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid $nav-tabs-justified-link-border-color;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: $nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  @include border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: $navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: $navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: $navbar-padding-horizontal;\n  padding-left:  $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  @include clearfix;\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: $navbar-collapse-max-height;\n\n    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -$navbar-padding-horizontal;\n    margin-left:  -$navbar-padding-horizontal;\n\n    @media (min-width: $grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: $zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: $zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: $navbar-padding-vertical $navbar-padding-horizontal;\n  font-size: $font-size-large;\n  line-height: $line-height-computed;\n  height: $navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -$navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: $navbar-padding-horizontal;\n  padding: 9px 10px;\n  @include navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: $border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: $line-height-computed;\n  }\n\n  @media (max-width: $grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: $line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    $navbar-padding-vertical;\n        padding-bottom: $navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -$navbar-padding-horizontal;\n  margin-right: -$navbar-padding-horizontal;\n  padding: 10px $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  @include box-shadow($shadow);\n\n  // Mixin behavior for optimum display\n  @include form-inline;\n\n  .form-group {\n    @media (max-width: $grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  @include navbar-vertical-align($input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    @include box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  @include border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  @include border-top-radius($navbar-border-radius);\n  @include border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  @include navbar-vertical-align($input-height-base);\n\n  &.btn-sm {\n    @include navbar-vertical-align($input-height-small);\n  }\n  &.btn-xs {\n    @include navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  @include navbar-vertical-align($line-height-computed);\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin-left: $navbar-padding-horizontal;\n    margin-right: $navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  margin-right: -$navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: $navbar-default-bg;\n  border-color: $navbar-default-border;\n\n  .navbar-brand {\n    color: $navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-brand-hover-color;\n      background-color: $navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-hover-color;\n        background-color: $navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-active-color;\n        background-color: $navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n        background-color: $navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: $navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: $navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-default-link-active-bg;\n        color: $navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: $navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-hover-color;\n            background-color: $navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-active-color;\n            background-color: $navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-disabled-color;\n            background-color: $navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: $navbar-default-link-color;\n    &:hover {\n      color: $navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: $navbar-inverse-bg;\n  border-color: $navbar-inverse-border;\n\n  .navbar-brand {\n    color: $navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-brand-hover-color;\n      background-color: $navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-hover-color;\n        background-color: $navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-active-color;\n        background-color: $navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n        background-color: $navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: $navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken($navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-inverse-link-active-bg;\n        color: $navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: $navbar-inverse-border;\n        }\n        .divider {\n          background-color: $navbar-inverse-border;\n        }\n        > li > a {\n          color: $navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-hover-color;\n            background-color: $navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-active-color;\n            background-color: $navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-disabled-color;\n            background-color: $navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: $navbar-inverse-link-color;\n    &:hover {\n      color: $navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n  margin-top: (($navbar-height - $element-height) / 2);\n  margin-bottom: (($navbar-height - $element-height) / 2);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n  margin-bottom: $line-height-computed;\n  list-style: none;\n  background-color: $breadcrumb-bg;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      // [converter] Workaround for https://github.com/sass/libsass/issues/1115\n      $nbsp: \"\\00a0\";\n      content: \"#{$breadcrumb-separator}#{$nbsp}\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: $breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: $breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: $padding-base-vertical $padding-base-horizontal;\n      line-height: $line-height-base;\n      text-decoration: none;\n      color: $pagination-color;\n      background-color: $pagination-bg;\n      border: 1px solid $pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        @include border-left-radius($border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: $pagination-hover-color;\n      background-color: $pagination-hover-bg;\n      border-color: $pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 3;\n      color: $pagination-active-color;\n      background-color: $pagination-active-bg;\n      border-color: $pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: $pagination-disabled-color;\n      background-color: $pagination-disabled-bg;\n      border-color: $pagination-disabled-border;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n","// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: $padding-vertical $padding-horizontal;\n      font-size: $font-size;\n      line-height: $line-height;\n    }\n    &:first-child {\n      > a,\n      > span {\n        @include border-left-radius($border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  @include clearfix;\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: $pager-bg;\n      border: 1px solid $pager-border;\n      border-radius: $pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: $pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: $pager-disabled-color;\n      background-color: $pager-bg;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: $label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // [converter] extracted a& to a.label\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Add hover effects, but only for links\na.label {\n  &:hover,\n  &:focus {\n    color: $label-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  @include label-variant($label-default-bg);\n}\n\n.label-primary {\n  @include label-variant($label-primary-bg);\n}\n\n.label-success {\n  @include label-variant($label-success-bg);\n}\n\n.label-info {\n  @include label-variant($label-info-bg);\n}\n\n.label-warning {\n  @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n  @include label-variant($label-danger-bg);\n}\n","// Labels\n\n@mixin label-variant($color) {\n  background-color: $color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken($color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: $font-size-small;\n  font-weight: $badge-font-weight;\n  color: $badge-color;\n  line-height: $badge-line-height;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: $badge-bg;\n  border-radius: $badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // [converter] extracted a& to a.badge\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: $badge-active-color;\n    background-color: $badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: $badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding-top:    $jumbotron-padding;\n  padding-bottom: $jumbotron-padding;\n  margin-bottom: $jumbotron-padding;\n  color: $jumbotron-color;\n  background-color: $jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: $jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: ($jumbotron-padding / 2);\n    font-size: $jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken($jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container\n    padding-left:  ($grid-gutter-width / 2);\n    padding-right: ($grid-gutter-width / 2);\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: $screen-sm-min) {\n    padding-top:    ($jumbotron-padding * 1.6);\n    padding-bottom: ($jumbotron-padding * 1.6);\n\n    .container &,\n    .container-fluid & {\n      padding-left:  ($jumbotron-padding * 2);\n      padding-right: ($jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: $jumbotron-heading-font-size;\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: $thumbnail-padding;\n  margin-bottom: $line-height-computed;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    @include img-responsive;\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active\n\n  // Image captions\n  .caption {\n    padding: $thumbnail-caption-padding;\n    color: $thumbnail-caption-color;\n  }\n}\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: $link-color;\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: $alert-padding;\n  margin-bottom: $line-height-computed;\n  border: 1px solid transparent;\n  border-radius: $alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing $headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: $alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: ($alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n","// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n  background-color: $background;\n  border-color: $border;\n  color: $text-color;\n\n  hr {\n    border-top-color: darken($border, 5%);\n  }\n  .alert-link {\n    color: darken($text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: $line-height-computed;\n  margin-bottom: $line-height-computed;\n  background-color: $progress-bg;\n  border-radius: $progress-border-radius;\n  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: $font-size-small;\n  line-height: $line-height-computed;\n  color: $progress-bar-color;\n  text-align: center;\n  background-color: $progress-bar-bg;\n  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  @include transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  @include gradient-striped;\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  @include animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  @include progress-bar-variant($progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  @include progress-bar-variant($progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  @include progress-bar-variant($progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  @include progress-bar-variant($progress-bar-danger-bg);\n}\n","// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n  background-repeat: repeat-x;\n  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// Progress bars\n\n@mixin progress-bar-variant($color) {\n  background-color: $color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    @include gradient-striped;\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n\n  // Fix collapse in webkit from max-width: 100% and display: table-cell.\n  &.img-thumbnail {\n    max-width: none;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: $list-group-bg;\n  border: 1px solid $list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    @include border-top-radius($list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    @include border-bottom-radius($list-group-border-radius);\n  }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n  color: $list-group-link-color;\n\n  .list-group-item-heading {\n    color: $list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $list-group-link-hover-color;\n    background-color: $list-group-hover-bg;\n  }\n}\n\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: $list-group-disabled-bg;\n    color: $list-group-disabled-color;\n    cursor: $cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: $list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: $list-group-active-color;\n    background-color: $list-group-active-bg;\n    border-color: $list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: $list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@include list-group-item-variant(success, $state-success-bg, $state-success-text);\n@include list-group-item-variant(info, $state-info-bg, $state-info-text);\n@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);\n@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n  .list-group-item-#{$state} {\n    color: $color;\n    background-color: $background;\n\n    // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}\n  }\n\n  a.list-group-item-#{$state},\n  button.list-group-item-#{$state} {\n    color: $color;\n\n    .list-group-item-heading {\n      color: inherit;\n    }\n\n    &:hover,\n    &:focus {\n      color: $color;\n      background-color: darken($background, 5%);\n    }\n    &.active,\n    &.active:hover,\n    &.active:focus {\n      color: #fff;\n      background-color: $color;\n      border-color: $color;\n    }\n  }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: $line-height-computed;\n  background-color: $panel-bg;\n  border: 1px solid transparent;\n  border-radius: $panel-border-radius;\n  @include box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: $panel-body-padding;\n  @include clearfix;\n}\n\n// Optional heading\n.panel-heading {\n  padding: $panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  @include border-top-radius(($panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil(($font-size-base * 1.125));\n  color: inherit;\n\n  > a,\n  > small,\n  > .small,\n  > small > a,\n  > .small > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: $panel-footer-padding;\n  background-color: $panel-footer-bg;\n  border-top: 1px solid $panel-inner-border;\n  @include border-bottom-radius(($panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        @include border-top-radius(($panel-border-radius - 1));\n      }\n    }\n\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        @include border-bottom-radius(($panel-border-radius - 1));\n      }\n    }\n  }\n  > .panel-heading + .panel-collapse > .list-group {\n    .list-group-item:first-child {\n      @include border-top-radius(0);\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: $panel-body-padding;\n      padding-right: $panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    @include border-top-radius(($panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: ($panel-border-radius - 1);\n        border-top-right-radius: ($panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: ($panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: ($panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    @include border-bottom-radius(($panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: ($panel-border-radius - 1);\n        border-bottom-right-radius: ($panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: ($panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: ($panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid $table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: $line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: $panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid $panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid $panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);\n}\n.panel-primary {\n  @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);\n}\n.panel-success {\n  @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);\n}\n.panel-info {\n  @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);\n}\n.panel-warning {\n  @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);\n}\n.panel-danger {\n  @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);\n}\n","// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n  border-color: $border;\n\n  & > .panel-heading {\n    color: $heading-text-color;\n    background-color: $heading-bg-color;\n    border-color: $heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: $border;\n    }\n    .badge {\n      color: $heading-bg-color;\n      background-color: $heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: $border;\n    }\n  }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: $well-bg;\n  border: 1px solid $well-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: $border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: $border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: ($font-size-base * 1.5);\n  font-weight: $close-font-weight;\n  line-height: 1;\n  color: $close-color;\n  text-shadow: $close-text-shadow;\n  @include opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: $close-color;\n    text-decoration: none;\n    cursor: pointer;\n    @include opacity(.5);\n  }\n\n  // [converter] extracted button& to button.close\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    @include translate(0, -25%);\n    @include transition-transform(0.3s ease-out);\n  }\n  &.in .modal-dialog { @include translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: $modal-content-bg;\n  border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid $modal-content-border-color;\n  border-radius: $border-radius-large;\n  @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-modal-background;\n  background-color: $modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { @include opacity(0); }\n  &.in { @include opacity($modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: $modal-title-padding;\n  border-bottom: 1px solid $modal-header-border-color;\n  @include clearfix;\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: $modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid $modal-footer-border-color;\n  @include clearfix; // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: $screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: $modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    @include box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: $modal-sm; }\n}\n\n@media (min-width: $screen-md-min) {\n  .modal-lg { width: $modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: $zindex-tooltip;\n  display: block;\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text;\n  font-size: $font-size-small;\n\n  @include opacity(0);\n\n  &.in     { @include opacity($tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: $tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 $tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: $tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 $tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: $tooltip-max-width;\n  padding: 3px 8px;\n  color: $tooltip-color;\n  text-align: center;\n  background-color: $tooltip-bg;\n  border-radius: $border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: $tooltip-arrow-width;\n    margin-bottom: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: $tooltip-arrow-width;\n    margin-bottom: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-right-color: $tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-left-color: $tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: $tooltip-arrow-width;\n    margin-top: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: $tooltip-arrow-width;\n    margin-top: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n}\n","@mixin reset-text() {\n  font-family: $font-family-base;\n  // We deliberately do NOT reset font-size.\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: $line-height-base;\n  text-align: left; // Fallback for where `start` is not supported\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: $zindex-popover;\n  display: none;\n  max-width: $popover-max-width;\n  padding: 1px;\n  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text;\n  font-size: $font-size-base;\n\n  background-color: $popover-bg;\n  background-clip: padding-box;\n  border: 1px solid $popover-fallback-border-color;\n  border: 1px solid $popover-border-color;\n  border-radius: $border-radius-large;\n  @include box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -$popover-arrow-width; }\n  &.right   { margin-left: $popover-arrow-width; }\n  &.bottom  { margin-top: $popover-arrow-width; }\n  &.left    { margin-left: -$popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: $font-size-base;\n  background-color: $popover-title-bg;\n  border-bottom: 1px solid darken($popover-title-bg, 5%);\n  border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: $popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: $popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -$popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: $popover-arrow-outer-color;\n    bottom: -$popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -$popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: $popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -$popover-arrow-outer-width;\n    margin-top: -$popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: $popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -$popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: $popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -$popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: $popover-arrow-outer-color;\n    top: -$popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -$popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: $popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -$popover-arrow-outer-width;\n    margin-top: -$popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: $popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: $popover-arrow-color;\n      bottom: -$popover-arrow-width;\n    }\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    @include transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      @include img-responsive;\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      @include transition-transform(0.6s ease-in-out);\n      @include backface-visibility(hidden);\n      @include perspective(1000px);\n\n      &.next,\n      &.active.right {\n        @include translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        @include translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        @include translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: $carousel-control-width;\n  @include opacity($carousel-control-opacity);\n  font-size: $carousel-control-font-size;\n  color: $carousel-control-color;\n  text-align: center;\n  text-shadow: $carousel-text-shadow;\n  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: $carousel-control-color;\n    text-decoration: none;\n    @include opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    margin-top: -10px;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    line-height: 1;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid $carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: $carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: $carousel-caption-color;\n  text-align: center;\n  text-shadow: $carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: $screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: ($carousel-control-font-size * 1.5);\n      height: ($carousel-control-font-size * 1.5);\n      margin-top: ($carousel-control-font-size / -2);\n      font-size: ($carousel-control-font-size * 1.5);\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: ($carousel-control-font-size / -2);\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: ($carousel-control-font-size / -2);\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  @include clearfix;\n}\n.center-block {\n  @include center-block;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  @include text-hide;\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","// Center-align a block level element\n\n@mixin center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n@mixin hide-text() {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n@mixin text-hide() {\n  @include hide-text;\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@at-root {\n  @-ms-viewport {\n    width: device-width;\n  }\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n\n@include responsive-invisibility('.visible-xs');\n@include responsive-invisibility('.visible-sm');\n@include responsive-invisibility('.visible-md');\n@include responsive-invisibility('.visible-lg');\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n@media (max-width: $screen-xs-max) {\n  @include responsive-visibility('.visible-xs');\n}\n.visible-xs-block {\n  @media (max-width: $screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: $screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: $screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n  @include responsive-visibility('.visible-sm');\n}\n.visible-sm-block {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n  @include responsive-visibility('.visible-md');\n}\n.visible-md-block {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n@media (min-width: $screen-lg-min) {\n  @include responsive-visibility('.visible-lg');\n}\n.visible-lg-block {\n  @media (min-width: $screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: $screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: $screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n@media (max-width: $screen-xs-max) {\n  @include responsive-invisibility('.hidden-xs');\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n  @include responsive-invisibility('.hidden-sm');\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n  @include responsive-invisibility('.hidden-md');\n}\n\n@media (min-width: $screen-lg-min) {\n  @include responsive-invisibility('.hidden-lg');\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n\n@include responsive-invisibility('.visible-print');\n\n@media print {\n  @include responsive-visibility('.visible-print');\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n@media print {\n  @include responsive-invisibility('.hidden-print');\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent hack\n@mixin responsive-visibility($parent) {\n  #{$parent} {\n    display: block !important;\n  }\n  table#{$parent}  { display: table !important; }\n  tr#{$parent}     { display: table-row !important; }\n  th#{$parent},\n  td#{$parent}     { display: table-cell !important; }\n}\n\n// [converter] $parent hack\n@mixin responsive-invisibility($parent) {\n  #{$parent} {\n    display: none !important;\n  }\n}\n"],"sourceRoot":"/source/"}
        \ No newline at end of file
        diff --git a/public/build/assets/js/all-5ba6978224.js b/public/build/assets/js/all-5ba6978224.js
        deleted file mode 100755
        index 0505c3ff91..0000000000
        --- a/public/build/assets/js/all-5ba6978224.js
        +++ /dev/null
        @@ -1,35065 +0,0 @@
        -/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
        -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
        -return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
        -void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
        -
        -/*! jQuery UI - v1.11.4 - 2015-03-11
        -* http://jqueryui.com
        -* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
        -* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
        -
        -(function( factory ) {
        -	if ( typeof define === "function" && define.amd ) {
        -
        -		// AMD. Register as an anonymous module.
        -		define([ "jquery" ], factory );
        -	} else {
        -
        -		// Browser globals
        -		factory( jQuery );
        -	}
        -}(function( $ ) {
        -/*!
        - * jQuery UI Core 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/category/ui-core/
        - */
        -
        -
        -// $.ui might exist from components with no dependencies, e.g., $.ui.position
        -$.ui = $.ui || {};
        -
        -$.extend( $.ui, {
        -	version: "1.11.4",
        -
        -	keyCode: {
        -		BACKSPACE: 8,
        -		COMMA: 188,
        -		DELETE: 46,
        -		DOWN: 40,
        -		END: 35,
        -		ENTER: 13,
        -		ESCAPE: 27,
        -		HOME: 36,
        -		LEFT: 37,
        -		PAGE_DOWN: 34,
        -		PAGE_UP: 33,
        -		PERIOD: 190,
        -		RIGHT: 39,
        -		SPACE: 32,
        -		TAB: 9,
        -		UP: 38
        -	}
        -});
        -
        -// plugins
        -$.fn.extend({
        -	scrollParent: function( includeHidden ) {
        -		var position = this.css( "position" ),
        -			excludeStaticParent = position === "absolute",
        -			overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
        -			scrollParent = this.parents().filter( function() {
        -				var parent = $( this );
        -				if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
        -					return false;
        -				}
        -				return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
        -			}).eq( 0 );
        -
        -		return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
        -	},
        -
        -	uniqueId: (function() {
        -		var uuid = 0;
        -
        -		return function() {
        -			return this.each(function() {
        -				if ( !this.id ) {
        -					this.id = "ui-id-" + ( ++uuid );
        -				}
        -			});
        -		};
        -	})(),
        -
        -	removeUniqueId: function() {
        -		return this.each(function() {
        -			if ( /^ui-id-\d+$/.test( this.id ) ) {
        -				$( this ).removeAttr( "id" );
        -			}
        -		});
        -	}
        -});
        -
        -// selectors
        -function focusable( element, isTabIndexNotNaN ) {
        -	var map, mapName, img,
        -		nodeName = element.nodeName.toLowerCase();
        -	if ( "area" === nodeName ) {
        -		map = element.parentNode;
        -		mapName = map.name;
        -		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
        -			return false;
        -		}
        -		img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
        -		return !!img && visible( img );
        -	}
        -	return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
        -		!element.disabled :
        -		"a" === nodeName ?
        -			element.href || isTabIndexNotNaN :
        -			isTabIndexNotNaN) &&
        -		// the element and all of its ancestors must be visible
        -		visible( element );
        -}
        -
        -function visible( element ) {
        -	return $.expr.filters.visible( element ) &&
        -		!$( element ).parents().addBack().filter(function() {
        -			return $.css( this, "visibility" ) === "hidden";
        -		}).length;
        -}
        -
        -$.extend( $.expr[ ":" ], {
        -	data: $.expr.createPseudo ?
        -		$.expr.createPseudo(function( dataName ) {
        -			return function( elem ) {
        -				return !!$.data( elem, dataName );
        -			};
        -		}) :
        -		// support: jQuery <1.8
        -		function( elem, i, match ) {
        -			return !!$.data( elem, match[ 3 ] );
        -		},
        -
        -	focusable: function( element ) {
        -		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
        -	},
        -
        -	tabbable: function( element ) {
        -		var tabIndex = $.attr( element, "tabindex" ),
        -			isTabIndexNaN = isNaN( tabIndex );
        -		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
        -	}
        -});
        -
        -// support: jQuery <1.8
        -if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
        -	$.each( [ "Width", "Height" ], function( i, name ) {
        -		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
        -			type = name.toLowerCase(),
        -			orig = {
        -				innerWidth: $.fn.innerWidth,
        -				innerHeight: $.fn.innerHeight,
        -				outerWidth: $.fn.outerWidth,
        -				outerHeight: $.fn.outerHeight
        -			};
        -
        -		function reduce( elem, size, border, margin ) {
        -			$.each( side, function() {
        -				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
        -				if ( border ) {
        -					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
        -				}
        -				if ( margin ) {
        -					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
        -				}
        -			});
        -			return size;
        -		}
        -
        -		$.fn[ "inner" + name ] = function( size ) {
        -			if ( size === undefined ) {
        -				return orig[ "inner" + name ].call( this );
        -			}
        -
        -			return this.each(function() {
        -				$( this ).css( type, reduce( this, size ) + "px" );
        -			});
        -		};
        -
        -		$.fn[ "outer" + name] = function( size, margin ) {
        -			if ( typeof size !== "number" ) {
        -				return orig[ "outer" + name ].call( this, size );
        -			}
        -
        -			return this.each(function() {
        -				$( this).css( type, reduce( this, size, true, margin ) + "px" );
        -			});
        -		};
        -	});
        -}
        -
        -// support: jQuery <1.8
        -if ( !$.fn.addBack ) {
        -	$.fn.addBack = function( selector ) {
        -		return this.add( selector == null ?
        -			this.prevObject : this.prevObject.filter( selector )
        -		);
        -	};
        -}
        -
        -// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
        -if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
        -	$.fn.removeData = (function( removeData ) {
        -		return function( key ) {
        -			if ( arguments.length ) {
        -				return removeData.call( this, $.camelCase( key ) );
        -			} else {
        -				return removeData.call( this );
        -			}
        -		};
        -	})( $.fn.removeData );
        -}
        -
        -// deprecated
        -$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
        -
        -$.fn.extend({
        -	focus: (function( orig ) {
        -		return function( delay, fn ) {
        -			return typeof delay === "number" ?
        -				this.each(function() {
        -					var elem = this;
        -					setTimeout(function() {
        -						$( elem ).focus();
        -						if ( fn ) {
        -							fn.call( elem );
        -						}
        -					}, delay );
        -				}) :
        -				orig.apply( this, arguments );
        -		};
        -	})( $.fn.focus ),
        -
        -	disableSelection: (function() {
        -		var eventType = "onselectstart" in document.createElement( "div" ) ?
        -			"selectstart" :
        -			"mousedown";
        -
        -		return function() {
        -			return this.bind( eventType + ".ui-disableSelection", function( event ) {
        -				event.preventDefault();
        -			});
        -		};
        -	})(),
        -
        -	enableSelection: function() {
        -		return this.unbind( ".ui-disableSelection" );
        -	},
        -
        -	zIndex: function( zIndex ) {
        -		if ( zIndex !== undefined ) {
        -			return this.css( "zIndex", zIndex );
        -		}
        -
        -		if ( this.length ) {
        -			var elem = $( this[ 0 ] ), position, value;
        -			while ( elem.length && elem[ 0 ] !== document ) {
        -				// Ignore z-index if position is set to a value where z-index is ignored by the browser
        -				// This makes behavior of this function consistent across browsers
        -				// WebKit always returns auto if the element is positioned
        -				position = elem.css( "position" );
        -				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
        -					// IE returns 0 when zIndex is not specified
        -					// other browsers return a string
        -					// we ignore the case of nested elements with an explicit value of 0
        -					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
        -					value = parseInt( elem.css( "zIndex" ), 10 );
        -					if ( !isNaN( value ) && value !== 0 ) {
        -						return value;
        -					}
        -				}
        -				elem = elem.parent();
        -			}
        -		}
        -
        -		return 0;
        -	}
        -});
        -
        -// $.ui.plugin is deprecated. Use $.widget() extensions instead.
        -$.ui.plugin = {
        -	add: function( module, option, set ) {
        -		var i,
        -			proto = $.ui[ module ].prototype;
        -		for ( i in set ) {
        -			proto.plugins[ i ] = proto.plugins[ i ] || [];
        -			proto.plugins[ i ].push( [ option, set[ i ] ] );
        -		}
        -	},
        -	call: function( instance, name, args, allowDisconnected ) {
        -		var i,
        -			set = instance.plugins[ name ];
        -
        -		if ( !set ) {
        -			return;
        -		}
        -
        -		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
        -			return;
        -		}
        -
        -		for ( i = 0; i < set.length; i++ ) {
        -			if ( instance.options[ set[ i ][ 0 ] ] ) {
        -				set[ i ][ 1 ].apply( instance.element, args );
        -			}
        -		}
        -	}
        -};
        -
        -
        -/*!
        - * jQuery UI Widget 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/jQuery.widget/
        - */
        -
        -
        -var widget_uuid = 0,
        -	widget_slice = Array.prototype.slice;
        -
        -$.cleanData = (function( orig ) {
        -	return function( elems ) {
        -		var events, elem, i;
        -		for ( i = 0; (elem = elems[i]) != null; i++ ) {
        -			try {
        -
        -				// Only trigger remove when necessary to save time
        -				events = $._data( elem, "events" );
        -				if ( events && events.remove ) {
        -					$( elem ).triggerHandler( "remove" );
        -				}
        -
        -			// http://bugs.jquery.com/ticket/8235
        -			} catch ( e ) {}
        -		}
        -		orig( elems );
        -	};
        -})( $.cleanData );
        -
        -$.widget = function( name, base, prototype ) {
        -	var fullName, existingConstructor, constructor, basePrototype,
        -		// proxiedPrototype allows the provided prototype to remain unmodified
        -		// so that it can be used as a mixin for multiple widgets (#8876)
        -		proxiedPrototype = {},
        -		namespace = name.split( "." )[ 0 ];
        -
        -	name = name.split( "." )[ 1 ];
        -	fullName = namespace + "-" + name;
        -
        -	if ( !prototype ) {
        -		prototype = base;
        -		base = $.Widget;
        -	}
        -
        -	// create selector for plugin
        -	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
        -		return !!$.data( elem, fullName );
        -	};
        -
        -	$[ namespace ] = $[ namespace ] || {};
        -	existingConstructor = $[ namespace ][ name ];
        -	constructor = $[ namespace ][ name ] = function( options, element ) {
        -		// allow instantiation without "new" keyword
        -		if ( !this._createWidget ) {
        -			return new constructor( options, element );
        -		}
        -
        -		// allow instantiation without initializing for simple inheritance
        -		// must use "new" keyword (the code above always passes args)
        -		if ( arguments.length ) {
        -			this._createWidget( options, element );
        -		}
        -	};
        -	// extend with the existing constructor to carry over any static properties
        -	$.extend( constructor, existingConstructor, {
        -		version: prototype.version,
        -		// copy the object used to create the prototype in case we need to
        -		// redefine the widget later
        -		_proto: $.extend( {}, prototype ),
        -		// track widgets that inherit from this widget in case this widget is
        -		// redefined after a widget inherits from it
        -		_childConstructors: []
        -	});
        -
        -	basePrototype = new base();
        -	// we need to make the options hash a property directly on the new instance
        -	// otherwise we'll modify the options hash on the prototype that we're
        -	// inheriting from
        -	basePrototype.options = $.widget.extend( {}, basePrototype.options );
        -	$.each( prototype, function( prop, value ) {
        -		if ( !$.isFunction( value ) ) {
        -			proxiedPrototype[ prop ] = value;
        -			return;
        -		}
        -		proxiedPrototype[ prop ] = (function() {
        -			var _super = function() {
        -					return base.prototype[ prop ].apply( this, arguments );
        -				},
        -				_superApply = function( args ) {
        -					return base.prototype[ prop ].apply( this, args );
        -				};
        -			return function() {
        -				var __super = this._super,
        -					__superApply = this._superApply,
        -					returnValue;
        -
        -				this._super = _super;
        -				this._superApply = _superApply;
        -
        -				returnValue = value.apply( this, arguments );
        -
        -				this._super = __super;
        -				this._superApply = __superApply;
        -
        -				return returnValue;
        -			};
        -		})();
        -	});
        -	constructor.prototype = $.widget.extend( basePrototype, {
        -		// TODO: remove support for widgetEventPrefix
        -		// always use the name + a colon as the prefix, e.g., draggable:start
        -		// don't prefix for widgets that aren't DOM-based
        -		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
        -	}, proxiedPrototype, {
        -		constructor: constructor,
        -		namespace: namespace,
        -		widgetName: name,
        -		widgetFullName: fullName
        -	});
        -
        -	// If this widget is being redefined then we need to find all widgets that
        -	// are inheriting from it and redefine all of them so that they inherit from
        -	// the new version of this widget. We're essentially trying to replace one
        -	// level in the prototype chain.
        -	if ( existingConstructor ) {
        -		$.each( existingConstructor._childConstructors, function( i, child ) {
        -			var childPrototype = child.prototype;
        -
        -			// redefine the child widget using the same prototype that was
        -			// originally used, but inherit from the new version of the base
        -			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
        -		});
        -		// remove the list of existing child constructors from the old constructor
        -		// so the old child constructors can be garbage collected
        -		delete existingConstructor._childConstructors;
        -	} else {
        -		base._childConstructors.push( constructor );
        -	}
        -
        -	$.widget.bridge( name, constructor );
        -
        -	return constructor;
        -};
        -
        -$.widget.extend = function( target ) {
        -	var input = widget_slice.call( arguments, 1 ),
        -		inputIndex = 0,
        -		inputLength = input.length,
        -		key,
        -		value;
        -	for ( ; inputIndex < inputLength; inputIndex++ ) {
        -		for ( key in input[ inputIndex ] ) {
        -			value = input[ inputIndex ][ key ];
        -			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
        -				// Clone objects
        -				if ( $.isPlainObject( value ) ) {
        -					target[ key ] = $.isPlainObject( target[ key ] ) ?
        -						$.widget.extend( {}, target[ key ], value ) :
        -						// Don't extend strings, arrays, etc. with objects
        -						$.widget.extend( {}, value );
        -				// Copy everything else by reference
        -				} else {
        -					target[ key ] = value;
        -				}
        -			}
        -		}
        -	}
        -	return target;
        -};
        -
        -$.widget.bridge = function( name, object ) {
        -	var fullName = object.prototype.widgetFullName || name;
        -	$.fn[ name ] = function( options ) {
        -		var isMethodCall = typeof options === "string",
        -			args = widget_slice.call( arguments, 1 ),
        -			returnValue = this;
        -
        -		if ( isMethodCall ) {
        -			this.each(function() {
        -				var methodValue,
        -					instance = $.data( this, fullName );
        -				if ( options === "instance" ) {
        -					returnValue = instance;
        -					return false;
        -				}
        -				if ( !instance ) {
        -					return $.error( "cannot call methods on " + name + " prior to initialization; " +
        -						"attempted to call method '" + options + "'" );
        -				}
        -				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
        -					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
        -				}
        -				methodValue = instance[ options ].apply( instance, args );
        -				if ( methodValue !== instance && methodValue !== undefined ) {
        -					returnValue = methodValue && methodValue.jquery ?
        -						returnValue.pushStack( methodValue.get() ) :
        -						methodValue;
        -					return false;
        -				}
        -			});
        -		} else {
        -
        -			// Allow multiple hashes to be passed on init
        -			if ( args.length ) {
        -				options = $.widget.extend.apply( null, [ options ].concat(args) );
        -			}
        -
        -			this.each(function() {
        -				var instance = $.data( this, fullName );
        -				if ( instance ) {
        -					instance.option( options || {} );
        -					if ( instance._init ) {
        -						instance._init();
        -					}
        -				} else {
        -					$.data( this, fullName, new object( options, this ) );
        -				}
        -			});
        -		}
        -
        -		return returnValue;
        -	};
        -};
        -
        -$.Widget = function( /* options, element */ ) {};
        -$.Widget._childConstructors = [];
        -
        -$.Widget.prototype = {
        -	widgetName: "widget",
        -	widgetEventPrefix: "",
        -	defaultElement: "<div>",
        -	options: {
        -		disabled: false,
        -
        -		// callbacks
        -		create: null
        -	},
        -	_createWidget: function( options, element ) {
        -		element = $( element || this.defaultElement || this )[ 0 ];
        -		this.element = $( element );
        -		this.uuid = widget_uuid++;
        -		this.eventNamespace = "." + this.widgetName + this.uuid;
        -
        -		this.bindings = $();
        -		this.hoverable = $();
        -		this.focusable = $();
        -
        -		if ( element !== this ) {
        -			$.data( element, this.widgetFullName, this );
        -			this._on( true, this.element, {
        -				remove: function( event ) {
        -					if ( event.target === element ) {
        -						this.destroy();
        -					}
        -				}
        -			});
        -			this.document = $( element.style ?
        -				// element within the document
        -				element.ownerDocument :
        -				// element is window or document
        -				element.document || element );
        -			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
        -		}
        -
        -		this.options = $.widget.extend( {},
        -			this.options,
        -			this._getCreateOptions(),
        -			options );
        -
        -		this._create();
        -		this._trigger( "create", null, this._getCreateEventData() );
        -		this._init();
        -	},
        -	_getCreateOptions: $.noop,
        -	_getCreateEventData: $.noop,
        -	_create: $.noop,
        -	_init: $.noop,
        -
        -	destroy: function() {
        -		this._destroy();
        -		// we can probably remove the unbind calls in 2.0
        -		// all event bindings should go through this._on()
        -		this.element
        -			.unbind( this.eventNamespace )
        -			.removeData( this.widgetFullName )
        -			// support: jquery <1.6.3
        -			// http://bugs.jquery.com/ticket/9413
        -			.removeData( $.camelCase( this.widgetFullName ) );
        -		this.widget()
        -			.unbind( this.eventNamespace )
        -			.removeAttr( "aria-disabled" )
        -			.removeClass(
        -				this.widgetFullName + "-disabled " +
        -				"ui-state-disabled" );
        -
        -		// clean up events and states
        -		this.bindings.unbind( this.eventNamespace );
        -		this.hoverable.removeClass( "ui-state-hover" );
        -		this.focusable.removeClass( "ui-state-focus" );
        -	},
        -	_destroy: $.noop,
        -
        -	widget: function() {
        -		return this.element;
        -	},
        -
        -	option: function( key, value ) {
        -		var options = key,
        -			parts,
        -			curOption,
        -			i;
        -
        -		if ( arguments.length === 0 ) {
        -			// don't return a reference to the internal hash
        -			return $.widget.extend( {}, this.options );
        -		}
        -
        -		if ( typeof key === "string" ) {
        -			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
        -			options = {};
        -			parts = key.split( "." );
        -			key = parts.shift();
        -			if ( parts.length ) {
        -				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
        -				for ( i = 0; i < parts.length - 1; i++ ) {
        -					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
        -					curOption = curOption[ parts[ i ] ];
        -				}
        -				key = parts.pop();
        -				if ( arguments.length === 1 ) {
        -					return curOption[ key ] === undefined ? null : curOption[ key ];
        -				}
        -				curOption[ key ] = value;
        -			} else {
        -				if ( arguments.length === 1 ) {
        -					return this.options[ key ] === undefined ? null : this.options[ key ];
        -				}
        -				options[ key ] = value;
        -			}
        -		}
        -
        -		this._setOptions( options );
        -
        -		return this;
        -	},
        -	_setOptions: function( options ) {
        -		var key;
        -
        -		for ( key in options ) {
        -			this._setOption( key, options[ key ] );
        -		}
        -
        -		return this;
        -	},
        -	_setOption: function( key, value ) {
        -		this.options[ key ] = value;
        -
        -		if ( key === "disabled" ) {
        -			this.widget()
        -				.toggleClass( this.widgetFullName + "-disabled", !!value );
        -
        -			// If the widget is becoming disabled, then nothing is interactive
        -			if ( value ) {
        -				this.hoverable.removeClass( "ui-state-hover" );
        -				this.focusable.removeClass( "ui-state-focus" );
        -			}
        -		}
        -
        -		return this;
        -	},
        -
        -	enable: function() {
        -		return this._setOptions({ disabled: false });
        -	},
        -	disable: function() {
        -		return this._setOptions({ disabled: true });
        -	},
        -
        -	_on: function( suppressDisabledCheck, element, handlers ) {
        -		var delegateElement,
        -			instance = this;
        -
        -		// no suppressDisabledCheck flag, shuffle arguments
        -		if ( typeof suppressDisabledCheck !== "boolean" ) {
        -			handlers = element;
        -			element = suppressDisabledCheck;
        -			suppressDisabledCheck = false;
        -		}
        -
        -		// no element argument, shuffle and use this.element
        -		if ( !handlers ) {
        -			handlers = element;
        -			element = this.element;
        -			delegateElement = this.widget();
        -		} else {
        -			element = delegateElement = $( element );
        -			this.bindings = this.bindings.add( element );
        -		}
        -
        -		$.each( handlers, function( event, handler ) {
        -			function handlerProxy() {
        -				// allow widgets to customize the disabled handling
        -				// - disabled as an array instead of boolean
        -				// - disabled class as method for disabling individual parts
        -				if ( !suppressDisabledCheck &&
        -						( instance.options.disabled === true ||
        -							$( this ).hasClass( "ui-state-disabled" ) ) ) {
        -					return;
        -				}
        -				return ( typeof handler === "string" ? instance[ handler ] : handler )
        -					.apply( instance, arguments );
        -			}
        -
        -			// copy the guid so direct unbinding works
        -			if ( typeof handler !== "string" ) {
        -				handlerProxy.guid = handler.guid =
        -					handler.guid || handlerProxy.guid || $.guid++;
        -			}
        -
        -			var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
        -				eventName = match[1] + instance.eventNamespace,
        -				selector = match[2];
        -			if ( selector ) {
        -				delegateElement.delegate( selector, eventName, handlerProxy );
        -			} else {
        -				element.bind( eventName, handlerProxy );
        -			}
        -		});
        -	},
        -
        -	_off: function( element, eventName ) {
        -		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
        -			this.eventNamespace;
        -		element.unbind( eventName ).undelegate( eventName );
        -
        -		// Clear the stack to avoid memory leaks (#10056)
        -		this.bindings = $( this.bindings.not( element ).get() );
        -		this.focusable = $( this.focusable.not( element ).get() );
        -		this.hoverable = $( this.hoverable.not( element ).get() );
        -	},
        -
        -	_delay: function( handler, delay ) {
        -		function handlerProxy() {
        -			return ( typeof handler === "string" ? instance[ handler ] : handler )
        -				.apply( instance, arguments );
        -		}
        -		var instance = this;
        -		return setTimeout( handlerProxy, delay || 0 );
        -	},
        -
        -	_hoverable: function( element ) {
        -		this.hoverable = this.hoverable.add( element );
        -		this._on( element, {
        -			mouseenter: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-hover" );
        -			},
        -			mouseleave: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-hover" );
        -			}
        -		});
        -	},
        -
        -	_focusable: function( element ) {
        -		this.focusable = this.focusable.add( element );
        -		this._on( element, {
        -			focusin: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-focus" );
        -			},
        -			focusout: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-focus" );
        -			}
        -		});
        -	},
        -
        -	_trigger: function( type, event, data ) {
        -		var prop, orig,
        -			callback = this.options[ type ];
        -
        -		data = data || {};
        -		event = $.Event( event );
        -		event.type = ( type === this.widgetEventPrefix ?
        -			type :
        -			this.widgetEventPrefix + type ).toLowerCase();
        -		// the original event may come from any element
        -		// so we need to reset the target on the new event
        -		event.target = this.element[ 0 ];
        -
        -		// copy original event properties over to the new event
        -		orig = event.originalEvent;
        -		if ( orig ) {
        -			for ( prop in orig ) {
        -				if ( !( prop in event ) ) {
        -					event[ prop ] = orig[ prop ];
        -				}
        -			}
        -		}
        -
        -		this.element.trigger( event, data );
        -		return !( $.isFunction( callback ) &&
        -			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
        -			event.isDefaultPrevented() );
        -	}
        -};
        -
        -$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
        -	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
        -		if ( typeof options === "string" ) {
        -			options = { effect: options };
        -		}
        -		var hasOptions,
        -			effectName = !options ?
        -				method :
        -				options === true || typeof options === "number" ?
        -					defaultEffect :
        -					options.effect || defaultEffect;
        -		options = options || {};
        -		if ( typeof options === "number" ) {
        -			options = { duration: options };
        -		}
        -		hasOptions = !$.isEmptyObject( options );
        -		options.complete = callback;
        -		if ( options.delay ) {
        -			element.delay( options.delay );
        -		}
        -		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
        -			element[ method ]( options );
        -		} else if ( effectName !== method && element[ effectName ] ) {
        -			element[ effectName ]( options.duration, options.easing, callback );
        -		} else {
        -			element.queue(function( next ) {
        -				$( this )[ method ]();
        -				if ( callback ) {
        -					callback.call( element[ 0 ] );
        -				}
        -				next();
        -			});
        -		}
        -	};
        -});
        -
        -var widget = $.widget;
        -
        -
        -/*!
        - * jQuery UI Mouse 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/mouse/
        - */
        -
        -
        -var mouseHandled = false;
        -$( document ).mouseup( function() {
        -	mouseHandled = false;
        -});
        -
        -var mouse = $.widget("ui.mouse", {
        -	version: "1.11.4",
        -	options: {
        -		cancel: "input,textarea,button,select,option",
        -		distance: 1,
        -		delay: 0
        -	},
        -	_mouseInit: function() {
        -		var that = this;
        -
        -		this.element
        -			.bind("mousedown." + this.widgetName, function(event) {
        -				return that._mouseDown(event);
        -			})
        -			.bind("click." + this.widgetName, function(event) {
        -				if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
        -					$.removeData(event.target, that.widgetName + ".preventClickEvent");
        -					event.stopImmediatePropagation();
        -					return false;
        -				}
        -			});
        -
        -		this.started = false;
        -	},
        -
        -	// TODO: make sure destroying one instance of mouse doesn't mess with
        -	// other instances of mouse
        -	_mouseDestroy: function() {
        -		this.element.unbind("." + this.widgetName);
        -		if ( this._mouseMoveDelegate ) {
        -			this.document
        -				.unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
        -				.unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
        -		}
        -	},
        -
        -	_mouseDown: function(event) {
        -		// don't let more than one widget handle mouseStart
        -		if ( mouseHandled ) {
        -			return;
        -		}
        -
        -		this._mouseMoved = false;
        -
        -		// we may have missed mouseup (out of window)
        -		(this._mouseStarted && this._mouseUp(event));
        -
        -		this._mouseDownEvent = event;
        -
        -		var that = this,
        -			btnIsLeft = (event.which === 1),
        -			// event.target.nodeName works around a bug in IE 8 with
        -			// disabled inputs (#7620)
        -			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
        -		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
        -			return true;
        -		}
        -
        -		this.mouseDelayMet = !this.options.delay;
        -		if (!this.mouseDelayMet) {
        -			this._mouseDelayTimer = setTimeout(function() {
        -				that.mouseDelayMet = true;
        -			}, this.options.delay);
        -		}
        -
        -		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
        -			this._mouseStarted = (this._mouseStart(event) !== false);
        -			if (!this._mouseStarted) {
        -				event.preventDefault();
        -				return true;
        -			}
        -		}
        -
        -		// Click event may never have fired (Gecko & Opera)
        -		if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
        -			$.removeData(event.target, this.widgetName + ".preventClickEvent");
        -		}
        -
        -		// these delegates are required to keep context
        -		this._mouseMoveDelegate = function(event) {
        -			return that._mouseMove(event);
        -		};
        -		this._mouseUpDelegate = function(event) {
        -			return that._mouseUp(event);
        -		};
        -
        -		this.document
        -			.bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        -			.bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
        -
        -		event.preventDefault();
        -
        -		mouseHandled = true;
        -		return true;
        -	},
        -
        -	_mouseMove: function(event) {
        -		// Only check for mouseups outside the document if you've moved inside the document
        -		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
        -		// fire a mousemove event if content is placed under the cursor. See #7778
        -		// Support: IE <9
        -		if ( this._mouseMoved ) {
        -			// IE mouseup check - mouseup happened when mouse was out of window
        -			if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
        -				return this._mouseUp(event);
        -
        -			// Iframe mouseup check - mouseup occurred in another document
        -			} else if ( !event.which ) {
        -				return this._mouseUp( event );
        -			}
        -		}
        -
        -		if ( event.which || event.button ) {
        -			this._mouseMoved = true;
        -		}
        -
        -		if (this._mouseStarted) {
        -			this._mouseDrag(event);
        -			return event.preventDefault();
        -		}
        -
        -		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
        -			this._mouseStarted =
        -				(this._mouseStart(this._mouseDownEvent, event) !== false);
        -			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
        -		}
        -
        -		return !this._mouseStarted;
        -	},
        -
        -	_mouseUp: function(event) {
        -		this.document
        -			.unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
        -			.unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
        -
        -		if (this._mouseStarted) {
        -			this._mouseStarted = false;
        -
        -			if (event.target === this._mouseDownEvent.target) {
        -				$.data(event.target, this.widgetName + ".preventClickEvent", true);
        -			}
        -
        -			this._mouseStop(event);
        -		}
        -
        -		mouseHandled = false;
        -		return false;
        -	},
        -
        -	_mouseDistanceMet: function(event) {
        -		return (Math.max(
        -				Math.abs(this._mouseDownEvent.pageX - event.pageX),
        -				Math.abs(this._mouseDownEvent.pageY - event.pageY)
        -			) >= this.options.distance
        -		);
        -	},
        -
        -	_mouseDelayMet: function(/* event */) {
        -		return this.mouseDelayMet;
        -	},
        -
        -	// These are placeholder methods, to be overriden by extending plugin
        -	_mouseStart: function(/* event */) {},
        -	_mouseDrag: function(/* event */) {},
        -	_mouseStop: function(/* event */) {},
        -	_mouseCapture: function(/* event */) { return true; }
        -});
        -
        -
        -/*!
        - * jQuery UI Position 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/position/
        - */
        -
        -(function() {
        -
        -$.ui = $.ui || {};
        -
        -var cachedScrollbarWidth, supportsOffsetFractions,
        -	max = Math.max,
        -	abs = Math.abs,
        -	round = Math.round,
        -	rhorizontal = /left|center|right/,
        -	rvertical = /top|center|bottom/,
        -	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
        -	rposition = /^\w+/,
        -	rpercent = /%$/,
        -	_position = $.fn.position;
        -
        -function getOffsets( offsets, width, height ) {
        -	return [
        -		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
        -		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
        -	];
        -}
        -
        -function parseCss( element, property ) {
        -	return parseInt( $.css( element, property ), 10 ) || 0;
        -}
        -
        -function getDimensions( elem ) {
        -	var raw = elem[0];
        -	if ( raw.nodeType === 9 ) {
        -		return {
        -			width: elem.width(),
        -			height: elem.height(),
        -			offset: { top: 0, left: 0 }
        -		};
        -	}
        -	if ( $.isWindow( raw ) ) {
        -		return {
        -			width: elem.width(),
        -			height: elem.height(),
        -			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
        -		};
        -	}
        -	if ( raw.preventDefault ) {
        -		return {
        -			width: 0,
        -			height: 0,
        -			offset: { top: raw.pageY, left: raw.pageX }
        -		};
        -	}
        -	return {
        -		width: elem.outerWidth(),
        -		height: elem.outerHeight(),
        -		offset: elem.offset()
        -	};
        -}
        -
        -$.position = {
        -	scrollbarWidth: function() {
        -		if ( cachedScrollbarWidth !== undefined ) {
        -			return cachedScrollbarWidth;
        -		}
        -		var w1, w2,
        -			div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
        -			innerDiv = div.children()[0];
        -
        -		$( "body" ).append( div );
        -		w1 = innerDiv.offsetWidth;
        -		div.css( "overflow", "scroll" );
        -
        -		w2 = innerDiv.offsetWidth;
        -
        -		if ( w1 === w2 ) {
        -			w2 = div[0].clientWidth;
        -		}
        -
        -		div.remove();
        -
        -		return (cachedScrollbarWidth = w1 - w2);
        -	},
        -	getScrollInfo: function( within ) {
        -		var overflowX = within.isWindow || within.isDocument ? "" :
        -				within.element.css( "overflow-x" ),
        -			overflowY = within.isWindow || within.isDocument ? "" :
        -				within.element.css( "overflow-y" ),
        -			hasOverflowX = overflowX === "scroll" ||
        -				( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
        -			hasOverflowY = overflowY === "scroll" ||
        -				( overflowY === "auto" && within.height < within.element[0].scrollHeight );
        -		return {
        -			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
        -			height: hasOverflowX ? $.position.scrollbarWidth() : 0
        -		};
        -	},
        -	getWithinInfo: function( element ) {
        -		var withinElement = $( element || window ),
        -			isWindow = $.isWindow( withinElement[0] ),
        -			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
        -		return {
        -			element: withinElement,
        -			isWindow: isWindow,
        -			isDocument: isDocument,
        -			offset: withinElement.offset() || { left: 0, top: 0 },
        -			scrollLeft: withinElement.scrollLeft(),
        -			scrollTop: withinElement.scrollTop(),
        -
        -			// support: jQuery 1.6.x
        -			// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
        -			width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
        -			height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
        -		};
        -	}
        -};
        -
        -$.fn.position = function( options ) {
        -	if ( !options || !options.of ) {
        -		return _position.apply( this, arguments );
        -	}
        -
        -	// make a copy, we don't want to modify arguments
        -	options = $.extend( {}, options );
        -
        -	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
        -		target = $( options.of ),
        -		within = $.position.getWithinInfo( options.within ),
        -		scrollInfo = $.position.getScrollInfo( within ),
        -		collision = ( options.collision || "flip" ).split( " " ),
        -		offsets = {};
        -
        -	dimensions = getDimensions( target );
        -	if ( target[0].preventDefault ) {
        -		// force left top to allow flipping
        -		options.at = "left top";
        -	}
        -	targetWidth = dimensions.width;
        -	targetHeight = dimensions.height;
        -	targetOffset = dimensions.offset;
        -	// clone to reuse original targetOffset later
        -	basePosition = $.extend( {}, targetOffset );
        -
        -	// force my and at to have valid horizontal and vertical positions
        -	// if a value is missing or invalid, it will be converted to center
        -	$.each( [ "my", "at" ], function() {
        -		var pos = ( options[ this ] || "" ).split( " " ),
        -			horizontalOffset,
        -			verticalOffset;
        -
        -		if ( pos.length === 1) {
        -			pos = rhorizontal.test( pos[ 0 ] ) ?
        -				pos.concat( [ "center" ] ) :
        -				rvertical.test( pos[ 0 ] ) ?
        -					[ "center" ].concat( pos ) :
        -					[ "center", "center" ];
        -		}
        -		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
        -		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
        -
        -		// calculate offsets
        -		horizontalOffset = roffset.exec( pos[ 0 ] );
        -		verticalOffset = roffset.exec( pos[ 1 ] );
        -		offsets[ this ] = [
        -			horizontalOffset ? horizontalOffset[ 0 ] : 0,
        -			verticalOffset ? verticalOffset[ 0 ] : 0
        -		];
        -
        -		// reduce to just the positions without the offsets
        -		options[ this ] = [
        -			rposition.exec( pos[ 0 ] )[ 0 ],
        -			rposition.exec( pos[ 1 ] )[ 0 ]
        -		];
        -	});
        -
        -	// normalize collision option
        -	if ( collision.length === 1 ) {
        -		collision[ 1 ] = collision[ 0 ];
        -	}
        -
        -	if ( options.at[ 0 ] === "right" ) {
        -		basePosition.left += targetWidth;
        -	} else if ( options.at[ 0 ] === "center" ) {
        -		basePosition.left += targetWidth / 2;
        -	}
        -
        -	if ( options.at[ 1 ] === "bottom" ) {
        -		basePosition.top += targetHeight;
        -	} else if ( options.at[ 1 ] === "center" ) {
        -		basePosition.top += targetHeight / 2;
        -	}
        -
        -	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
        -	basePosition.left += atOffset[ 0 ];
        -	basePosition.top += atOffset[ 1 ];
        -
        -	return this.each(function() {
        -		var collisionPosition, using,
        -			elem = $( this ),
        -			elemWidth = elem.outerWidth(),
        -			elemHeight = elem.outerHeight(),
        -			marginLeft = parseCss( this, "marginLeft" ),
        -			marginTop = parseCss( this, "marginTop" ),
        -			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
        -			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
        -			position = $.extend( {}, basePosition ),
        -			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
        -
        -		if ( options.my[ 0 ] === "right" ) {
        -			position.left -= elemWidth;
        -		} else if ( options.my[ 0 ] === "center" ) {
        -			position.left -= elemWidth / 2;
        -		}
        -
        -		if ( options.my[ 1 ] === "bottom" ) {
        -			position.top -= elemHeight;
        -		} else if ( options.my[ 1 ] === "center" ) {
        -			position.top -= elemHeight / 2;
        -		}
        -
        -		position.left += myOffset[ 0 ];
        -		position.top += myOffset[ 1 ];
        -
        -		// if the browser doesn't support fractions, then round for consistent results
        -		if ( !supportsOffsetFractions ) {
        -			position.left = round( position.left );
        -			position.top = round( position.top );
        -		}
        -
        -		collisionPosition = {
        -			marginLeft: marginLeft,
        -			marginTop: marginTop
        -		};
        -
        -		$.each( [ "left", "top" ], function( i, dir ) {
        -			if ( $.ui.position[ collision[ i ] ] ) {
        -				$.ui.position[ collision[ i ] ][ dir ]( position, {
        -					targetWidth: targetWidth,
        -					targetHeight: targetHeight,
        -					elemWidth: elemWidth,
        -					elemHeight: elemHeight,
        -					collisionPosition: collisionPosition,
        -					collisionWidth: collisionWidth,
        -					collisionHeight: collisionHeight,
        -					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
        -					my: options.my,
        -					at: options.at,
        -					within: within,
        -					elem: elem
        -				});
        -			}
        -		});
        -
        -		if ( options.using ) {
        -			// adds feedback as second argument to using callback, if present
        -			using = function( props ) {
        -				var left = targetOffset.left - position.left,
        -					right = left + targetWidth - elemWidth,
        -					top = targetOffset.top - position.top,
        -					bottom = top + targetHeight - elemHeight,
        -					feedback = {
        -						target: {
        -							element: target,
        -							left: targetOffset.left,
        -							top: targetOffset.top,
        -							width: targetWidth,
        -							height: targetHeight
        -						},
        -						element: {
        -							element: elem,
        -							left: position.left,
        -							top: position.top,
        -							width: elemWidth,
        -							height: elemHeight
        -						},
        -						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
        -						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
        -					};
        -				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
        -					feedback.horizontal = "center";
        -				}
        -				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
        -					feedback.vertical = "middle";
        -				}
        -				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
        -					feedback.important = "horizontal";
        -				} else {
        -					feedback.important = "vertical";
        -				}
        -				options.using.call( this, props, feedback );
        -			};
        -		}
        -
        -		elem.offset( $.extend( position, { using: using } ) );
        -	});
        -};
        -
        -$.ui.position = {
        -	fit: {
        -		left: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
        -				outerWidth = within.width,
        -				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        -				overLeft = withinOffset - collisionPosLeft,
        -				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
        -				newOverRight;
        -
        -			// element is wider than within
        -			if ( data.collisionWidth > outerWidth ) {
        -				// element is initially over the left side of within
        -				if ( overLeft > 0 && overRight <= 0 ) {
        -					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
        -					position.left += overLeft - newOverRight;
        -				// element is initially over right side of within
        -				} else if ( overRight > 0 && overLeft <= 0 ) {
        -					position.left = withinOffset;
        -				// element is initially over both left and right sides of within
        -				} else {
        -					if ( overLeft > overRight ) {
        -						position.left = withinOffset + outerWidth - data.collisionWidth;
        -					} else {
        -						position.left = withinOffset;
        -					}
        -				}
        -			// too far left -> align with left edge
        -			} else if ( overLeft > 0 ) {
        -				position.left += overLeft;
        -			// too far right -> align with right edge
        -			} else if ( overRight > 0 ) {
        -				position.left -= overRight;
        -			// adjust based on position and margin
        -			} else {
        -				position.left = max( position.left - collisionPosLeft, position.left );
        -			}
        -		},
        -		top: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
        -				outerHeight = data.within.height,
        -				collisionPosTop = position.top - data.collisionPosition.marginTop,
        -				overTop = withinOffset - collisionPosTop,
        -				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
        -				newOverBottom;
        -
        -			// element is taller than within
        -			if ( data.collisionHeight > outerHeight ) {
        -				// element is initially over the top of within
        -				if ( overTop > 0 && overBottom <= 0 ) {
        -					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
        -					position.top += overTop - newOverBottom;
        -				// element is initially over bottom of within
        -				} else if ( overBottom > 0 && overTop <= 0 ) {
        -					position.top = withinOffset;
        -				// element is initially over both top and bottom of within
        -				} else {
        -					if ( overTop > overBottom ) {
        -						position.top = withinOffset + outerHeight - data.collisionHeight;
        -					} else {
        -						position.top = withinOffset;
        -					}
        -				}
        -			// too far up -> align with top
        -			} else if ( overTop > 0 ) {
        -				position.top += overTop;
        -			// too far down -> align with bottom edge
        -			} else if ( overBottom > 0 ) {
        -				position.top -= overBottom;
        -			// adjust based on position and margin
        -			} else {
        -				position.top = max( position.top - collisionPosTop, position.top );
        -			}
        -		}
        -	},
        -	flip: {
        -		left: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.offset.left + within.scrollLeft,
        -				outerWidth = within.width,
        -				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
        -				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
        -				overLeft = collisionPosLeft - offsetLeft,
        -				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
        -				myOffset = data.my[ 0 ] === "left" ?
        -					-data.elemWidth :
        -					data.my[ 0 ] === "right" ?
        -						data.elemWidth :
        -						0,
        -				atOffset = data.at[ 0 ] === "left" ?
        -					data.targetWidth :
        -					data.at[ 0 ] === "right" ?
        -						-data.targetWidth :
        -						0,
        -				offset = -2 * data.offset[ 0 ],
        -				newOverRight,
        -				newOverLeft;
        -
        -			if ( overLeft < 0 ) {
        -				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
        -				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
        -					position.left += myOffset + atOffset + offset;
        -				}
        -			} else if ( overRight > 0 ) {
        -				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
        -				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
        -					position.left += myOffset + atOffset + offset;
        -				}
        -			}
        -		},
        -		top: function( position, data ) {
        -			var within = data.within,
        -				withinOffset = within.offset.top + within.scrollTop,
        -				outerHeight = within.height,
        -				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
        -				collisionPosTop = position.top - data.collisionPosition.marginTop,
        -				overTop = collisionPosTop - offsetTop,
        -				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
        -				top = data.my[ 1 ] === "top",
        -				myOffset = top ?
        -					-data.elemHeight :
        -					data.my[ 1 ] === "bottom" ?
        -						data.elemHeight :
        -						0,
        -				atOffset = data.at[ 1 ] === "top" ?
        -					data.targetHeight :
        -					data.at[ 1 ] === "bottom" ?
        -						-data.targetHeight :
        -						0,
        -				offset = -2 * data.offset[ 1 ],
        -				newOverTop,
        -				newOverBottom;
        -			if ( overTop < 0 ) {
        -				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
        -				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
        -					position.top += myOffset + atOffset + offset;
        -				}
        -			} else if ( overBottom > 0 ) {
        -				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
        -				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
        -					position.top += myOffset + atOffset + offset;
        -				}
        -			}
        -		}
        -	},
        -	flipfit: {
        -		left: function() {
        -			$.ui.position.flip.left.apply( this, arguments );
        -			$.ui.position.fit.left.apply( this, arguments );
        -		},
        -		top: function() {
        -			$.ui.position.flip.top.apply( this, arguments );
        -			$.ui.position.fit.top.apply( this, arguments );
        -		}
        -	}
        -};
        -
        -// fraction support test
        -(function() {
        -	var testElement, testElementParent, testElementStyle, offsetLeft, i,
        -		body = document.getElementsByTagName( "body" )[ 0 ],
        -		div = document.createElement( "div" );
        -
        -	//Create a "fake body" for testing based on method used in jQuery.support
        -	testElement = document.createElement( body ? "div" : "body" );
        -	testElementStyle = {
        -		visibility: "hidden",
        -		width: 0,
        -		height: 0,
        -		border: 0,
        -		margin: 0,
        -		background: "none"
        -	};
        -	if ( body ) {
        -		$.extend( testElementStyle, {
        -			position: "absolute",
        -			left: "-1000px",
        -			top: "-1000px"
        -		});
        -	}
        -	for ( i in testElementStyle ) {
        -		testElement.style[ i ] = testElementStyle[ i ];
        -	}
        -	testElement.appendChild( div );
        -	testElementParent = body || document.documentElement;
        -	testElementParent.insertBefore( testElement, testElementParent.firstChild );
        -
        -	div.style.cssText = "position: absolute; left: 10.7432222px;";
        -
        -	offsetLeft = $( div ).offset().left;
        -	supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
        -
        -	testElement.innerHTML = "";
        -	testElementParent.removeChild( testElement );
        -})();
        -
        -})();
        -
        -var position = $.ui.position;
        -
        -
        -/*!
        - * jQuery UI Accordion 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/accordion/
        - */
        -
        -
        -var accordion = $.widget( "ui.accordion", {
        -	version: "1.11.4",
        -	options: {
        -		active: 0,
        -		animate: {},
        -		collapsible: false,
        -		event: "click",
        -		header: "> li > :first-child,> :not(li):even",
        -		heightStyle: "auto",
        -		icons: {
        -			activeHeader: "ui-icon-triangle-1-s",
        -			header: "ui-icon-triangle-1-e"
        -		},
        -
        -		// callbacks
        -		activate: null,
        -		beforeActivate: null
        -	},
        -
        -	hideProps: {
        -		borderTopWidth: "hide",
        -		borderBottomWidth: "hide",
        -		paddingTop: "hide",
        -		paddingBottom: "hide",
        -		height: "hide"
        -	},
        -
        -	showProps: {
        -		borderTopWidth: "show",
        -		borderBottomWidth: "show",
        -		paddingTop: "show",
        -		paddingBottom: "show",
        -		height: "show"
        -	},
        -
        -	_create: function() {
        -		var options = this.options;
        -		this.prevShow = this.prevHide = $();
        -		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
        -			// ARIA
        -			.attr( "role", "tablist" );
        -
        -		// don't allow collapsible: false and active: false / null
        -		if ( !options.collapsible && (options.active === false || options.active == null) ) {
        -			options.active = 0;
        -		}
        -
        -		this._processPanels();
        -		// handle negative values
        -		if ( options.active < 0 ) {
        -			options.active += this.headers.length;
        -		}
        -		this._refresh();
        -	},
        -
        -	_getCreateEventData: function() {
        -		return {
        -			header: this.active,
        -			panel: !this.active.length ? $() : this.active.next()
        -		};
        -	},
        -
        -	_createIcons: function() {
        -		var icons = this.options.icons;
        -		if ( icons ) {
        -			$( "<span>" )
        -				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
        -				.prependTo( this.headers );
        -			this.active.children( ".ui-accordion-header-icon" )
        -				.removeClass( icons.header )
        -				.addClass( icons.activeHeader );
        -			this.headers.addClass( "ui-accordion-icons" );
        -		}
        -	},
        -
        -	_destroyIcons: function() {
        -		this.headers
        -			.removeClass( "ui-accordion-icons" )
        -			.children( ".ui-accordion-header-icon" )
        -				.remove();
        -	},
        -
        -	_destroy: function() {
        -		var contents;
        -
        -		// clean up main element
        -		this.element
        -			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
        -			.removeAttr( "role" );
        -
        -		// clean up headers
        -		this.headers
        -			.removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " +
        -				"ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-expanded" )
        -			.removeAttr( "aria-selected" )
        -			.removeAttr( "aria-controls" )
        -			.removeAttr( "tabIndex" )
        -			.removeUniqueId();
        -
        -		this._destroyIcons();
        -
        -		// clean up content panels
        -		contents = this.headers.next()
        -			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " +
        -				"ui-accordion-content ui-accordion-content-active ui-state-disabled" )
        -			.css( "display", "" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-hidden" )
        -			.removeAttr( "aria-labelledby" )
        -			.removeUniqueId();
        -
        -		if ( this.options.heightStyle !== "content" ) {
        -			contents.css( "height", "" );
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "active" ) {
        -			// _activate() will handle invalid values and update this.options
        -			this._activate( value );
        -			return;
        -		}
        -
        -		if ( key === "event" ) {
        -			if ( this.options.event ) {
        -				this._off( this.headers, this.options.event );
        -			}
        -			this._setupEvents( value );
        -		}
        -
        -		this._super( key, value );
        -
        -		// setting collapsible: false while collapsed; open first panel
        -		if ( key === "collapsible" && !value && this.options.active === false ) {
        -			this._activate( 0 );
        -		}
        -
        -		if ( key === "icons" ) {
        -			this._destroyIcons();
        -			if ( value ) {
        -				this._createIcons();
        -			}
        -		}
        -
        -		// #5332 - opacity doesn't cascade to positioned elements in IE
        -		// so we need to add the disabled class to the headers and panels
        -		if ( key === "disabled" ) {
        -			this.element
        -				.toggleClass( "ui-state-disabled", !!value )
        -				.attr( "aria-disabled", value );
        -			this.headers.add( this.headers.next() )
        -				.toggleClass( "ui-state-disabled", !!value );
        -		}
        -	},
        -
        -	_keydown: function( event ) {
        -		if ( event.altKey || event.ctrlKey ) {
        -			return;
        -		}
        -
        -		var keyCode = $.ui.keyCode,
        -			length = this.headers.length,
        -			currentIndex = this.headers.index( event.target ),
        -			toFocus = false;
        -
        -		switch ( event.keyCode ) {
        -			case keyCode.RIGHT:
        -			case keyCode.DOWN:
        -				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
        -				break;
        -			case keyCode.LEFT:
        -			case keyCode.UP:
        -				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
        -				break;
        -			case keyCode.SPACE:
        -			case keyCode.ENTER:
        -				this._eventHandler( event );
        -				break;
        -			case keyCode.HOME:
        -				toFocus = this.headers[ 0 ];
        -				break;
        -			case keyCode.END:
        -				toFocus = this.headers[ length - 1 ];
        -				break;
        -		}
        -
        -		if ( toFocus ) {
        -			$( event.target ).attr( "tabIndex", -1 );
        -			$( toFocus ).attr( "tabIndex", 0 );
        -			toFocus.focus();
        -			event.preventDefault();
        -		}
        -	},
        -
        -	_panelKeyDown: function( event ) {
        -		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
        -			$( event.currentTarget ).prev().focus();
        -		}
        -	},
        -
        -	refresh: function() {
        -		var options = this.options;
        -		this._processPanels();
        -
        -		// was collapsed or no panel
        -		if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
        -			options.active = false;
        -			this.active = $();
        -		// active false only when collapsible is true
        -		} else if ( options.active === false ) {
        -			this._activate( 0 );
        -		// was active, but active panel is gone
        -		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        -			// all remaining panel are disabled
        -			if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
        -				options.active = false;
        -				this.active = $();
        -			// activate previous panel
        -			} else {
        -				this._activate( Math.max( 0, options.active - 1 ) );
        -			}
        -		// was active, active panel still exists
        -		} else {
        -			// make sure active index is correct
        -			options.active = this.headers.index( this.active );
        -		}
        -
        -		this._destroyIcons();
        -
        -		this._refresh();
        -	},
        -
        -	_processPanels: function() {
        -		var prevHeaders = this.headers,
        -			prevPanels = this.panels;
        -
        -		this.headers = this.element.find( this.options.header )
        -			.addClass( "ui-accordion-header ui-state-default ui-corner-all" );
        -
        -		this.panels = this.headers.next()
        -			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
        -			.filter( ":not(.ui-accordion-content-active)" )
        -			.hide();
        -
        -		// Avoid memory leaks (#10056)
        -		if ( prevPanels ) {
        -			this._off( prevHeaders.not( this.headers ) );
        -			this._off( prevPanels.not( this.panels ) );
        -		}
        -	},
        -
        -	_refresh: function() {
        -		var maxHeight,
        -			options = this.options,
        -			heightStyle = options.heightStyle,
        -			parent = this.element.parent();
        -
        -		this.active = this._findActive( options.active )
        -			.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
        -			.removeClass( "ui-corner-all" );
        -		this.active.next()
        -			.addClass( "ui-accordion-content-active" )
        -			.show();
        -
        -		this.headers
        -			.attr( "role", "tab" )
        -			.each(function() {
        -				var header = $( this ),
        -					headerId = header.uniqueId().attr( "id" ),
        -					panel = header.next(),
        -					panelId = panel.uniqueId().attr( "id" );
        -				header.attr( "aria-controls", panelId );
        -				panel.attr( "aria-labelledby", headerId );
        -			})
        -			.next()
        -				.attr( "role", "tabpanel" );
        -
        -		this.headers
        -			.not( this.active )
        -			.attr({
        -				"aria-selected": "false",
        -				"aria-expanded": "false",
        -				tabIndex: -1
        -			})
        -			.next()
        -				.attr({
        -					"aria-hidden": "true"
        -				})
        -				.hide();
        -
        -		// make sure at least one header is in the tab order
        -		if ( !this.active.length ) {
        -			this.headers.eq( 0 ).attr( "tabIndex", 0 );
        -		} else {
        -			this.active.attr({
        -				"aria-selected": "true",
        -				"aria-expanded": "true",
        -				tabIndex: 0
        -			})
        -			.next()
        -				.attr({
        -					"aria-hidden": "false"
        -				});
        -		}
        -
        -		this._createIcons();
        -
        -		this._setupEvents( options.event );
        -
        -		if ( heightStyle === "fill" ) {
        -			maxHeight = parent.height();
        -			this.element.siblings( ":visible" ).each(function() {
        -				var elem = $( this ),
        -					position = elem.css( "position" );
        -
        -				if ( position === "absolute" || position === "fixed" ) {
        -					return;
        -				}
        -				maxHeight -= elem.outerHeight( true );
        -			});
        -
        -			this.headers.each(function() {
        -				maxHeight -= $( this ).outerHeight( true );
        -			});
        -
        -			this.headers.next()
        -				.each(function() {
        -					$( this ).height( Math.max( 0, maxHeight -
        -						$( this ).innerHeight() + $( this ).height() ) );
        -				})
        -				.css( "overflow", "auto" );
        -		} else if ( heightStyle === "auto" ) {
        -			maxHeight = 0;
        -			this.headers.next()
        -				.each(function() {
        -					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
        -				})
        -				.height( maxHeight );
        -		}
        -	},
        -
        -	_activate: function( index ) {
        -		var active = this._findActive( index )[ 0 ];
        -
        -		// trying to activate the already active panel
        -		if ( active === this.active[ 0 ] ) {
        -			return;
        -		}
        -
        -		// trying to collapse, simulate a click on the currently active header
        -		active = active || this.active[ 0 ];
        -
        -		this._eventHandler({
        -			target: active,
        -			currentTarget: active,
        -			preventDefault: $.noop
        -		});
        -	},
        -
        -	_findActive: function( selector ) {
        -		return typeof selector === "number" ? this.headers.eq( selector ) : $();
        -	},
        -
        -	_setupEvents: function( event ) {
        -		var events = {
        -			keydown: "_keydown"
        -		};
        -		if ( event ) {
        -			$.each( event.split( " " ), function( index, eventName ) {
        -				events[ eventName ] = "_eventHandler";
        -			});
        -		}
        -
        -		this._off( this.headers.add( this.headers.next() ) );
        -		this._on( this.headers, events );
        -		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
        -		this._hoverable( this.headers );
        -		this._focusable( this.headers );
        -	},
        -
        -	_eventHandler: function( event ) {
        -		var options = this.options,
        -			active = this.active,
        -			clicked = $( event.currentTarget ),
        -			clickedIsActive = clicked[ 0 ] === active[ 0 ],
        -			collapsing = clickedIsActive && options.collapsible,
        -			toShow = collapsing ? $() : clicked.next(),
        -			toHide = active.next(),
        -			eventData = {
        -				oldHeader: active,
        -				oldPanel: toHide,
        -				newHeader: collapsing ? $() : clicked,
        -				newPanel: toShow
        -			};
        -
        -		event.preventDefault();
        -
        -		if (
        -				// click on active header, but not collapsible
        -				( clickedIsActive && !options.collapsible ) ||
        -				// allow canceling activation
        -				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        -			return;
        -		}
        -
        -		options.active = collapsing ? false : this.headers.index( clicked );
        -
        -		// when the call to ._toggle() comes after the class changes
        -		// it causes a very odd bug in IE 8 (see #6720)
        -		this.active = clickedIsActive ? $() : clicked;
        -		this._toggle( eventData );
        -
        -		// switch classes
        -		// corner classes on the previously active header stay after the animation
        -		active.removeClass( "ui-accordion-header-active ui-state-active" );
        -		if ( options.icons ) {
        -			active.children( ".ui-accordion-header-icon" )
        -				.removeClass( options.icons.activeHeader )
        -				.addClass( options.icons.header );
        -		}
        -
        -		if ( !clickedIsActive ) {
        -			clicked
        -				.removeClass( "ui-corner-all" )
        -				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
        -			if ( options.icons ) {
        -				clicked.children( ".ui-accordion-header-icon" )
        -					.removeClass( options.icons.header )
        -					.addClass( options.icons.activeHeader );
        -			}
        -
        -			clicked
        -				.next()
        -				.addClass( "ui-accordion-content-active" );
        -		}
        -	},
        -
        -	_toggle: function( data ) {
        -		var toShow = data.newPanel,
        -			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
        -
        -		// handle activating a panel during the animation for another activation
        -		this.prevShow.add( this.prevHide ).stop( true, true );
        -		this.prevShow = toShow;
        -		this.prevHide = toHide;
        -
        -		if ( this.options.animate ) {
        -			this._animate( toShow, toHide, data );
        -		} else {
        -			toHide.hide();
        -			toShow.show();
        -			this._toggleComplete( data );
        -		}
        -
        -		toHide.attr({
        -			"aria-hidden": "true"
        -		});
        -		toHide.prev().attr({
        -			"aria-selected": "false",
        -			"aria-expanded": "false"
        -		});
        -		// if we're switching panels, remove the old header from the tab order
        -		// if we're opening from collapsed state, remove the previous header from the tab order
        -		// if we're collapsing, then keep the collapsing header in the tab order
        -		if ( toShow.length && toHide.length ) {
        -			toHide.prev().attr({
        -				"tabIndex": -1,
        -				"aria-expanded": "false"
        -			});
        -		} else if ( toShow.length ) {
        -			this.headers.filter(function() {
        -				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
        -			})
        -			.attr( "tabIndex", -1 );
        -		}
        -
        -		toShow
        -			.attr( "aria-hidden", "false" )
        -			.prev()
        -				.attr({
        -					"aria-selected": "true",
        -					"aria-expanded": "true",
        -					tabIndex: 0
        -				});
        -	},
        -
        -	_animate: function( toShow, toHide, data ) {
        -		var total, easing, duration,
        -			that = this,
        -			adjust = 0,
        -			boxSizing = toShow.css( "box-sizing" ),
        -			down = toShow.length &&
        -				( !toHide.length || ( toShow.index() < toHide.index() ) ),
        -			animate = this.options.animate || {},
        -			options = down && animate.down || animate,
        -			complete = function() {
        -				that._toggleComplete( data );
        -			};
        -
        -		if ( typeof options === "number" ) {
        -			duration = options;
        -		}
        -		if ( typeof options === "string" ) {
        -			easing = options;
        -		}
        -		// fall back from options to animation in case of partial down settings
        -		easing = easing || options.easing || animate.easing;
        -		duration = duration || options.duration || animate.duration;
        -
        -		if ( !toHide.length ) {
        -			return toShow.animate( this.showProps, duration, easing, complete );
        -		}
        -		if ( !toShow.length ) {
        -			return toHide.animate( this.hideProps, duration, easing, complete );
        -		}
        -
        -		total = toShow.show().outerHeight();
        -		toHide.animate( this.hideProps, {
        -			duration: duration,
        -			easing: easing,
        -			step: function( now, fx ) {
        -				fx.now = Math.round( now );
        -			}
        -		});
        -		toShow
        -			.hide()
        -			.animate( this.showProps, {
        -				duration: duration,
        -				easing: easing,
        -				complete: complete,
        -				step: function( now, fx ) {
        -					fx.now = Math.round( now );
        -					if ( fx.prop !== "height" ) {
        -						if ( boxSizing === "content-box" ) {
        -							adjust += fx.now;
        -						}
        -					} else if ( that.options.heightStyle !== "content" ) {
        -						fx.now = Math.round( total - toHide.outerHeight() - adjust );
        -						adjust = 0;
        -					}
        -				}
        -			});
        -	},
        -
        -	_toggleComplete: function( data ) {
        -		var toHide = data.oldPanel;
        -
        -		toHide
        -			.removeClass( "ui-accordion-content-active" )
        -			.prev()
        -				.removeClass( "ui-corner-top" )
        -				.addClass( "ui-corner-all" );
        -
        -		// Work around for rendering bug in IE (#5421)
        -		if ( toHide.length ) {
        -			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
        -		}
        -		this._trigger( "activate", null, data );
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Menu 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/menu/
        - */
        -
        -
        -var menu = $.widget( "ui.menu", {
        -	version: "1.11.4",
        -	defaultElement: "<ul>",
        -	delay: 300,
        -	options: {
        -		icons: {
        -			submenu: "ui-icon-carat-1-e"
        -		},
        -		items: "> *",
        -		menus: "ul",
        -		position: {
        -			my: "left-1 top",
        -			at: "right top"
        -		},
        -		role: "menu",
        -
        -		// callbacks
        -		blur: null,
        -		focus: null,
        -		select: null
        -	},
        -
        -	_create: function() {
        -		this.activeMenu = this.element;
        -
        -		// Flag used to prevent firing of the click handler
        -		// as the event bubbles up through nested menus
        -		this.mouseHandled = false;
        -		this.element
        -			.uniqueId()
        -			.addClass( "ui-menu ui-widget ui-widget-content" )
        -			.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
        -			.attr({
        -				role: this.options.role,
        -				tabIndex: 0
        -			});
        -
        -		if ( this.options.disabled ) {
        -			this.element
        -				.addClass( "ui-state-disabled" )
        -				.attr( "aria-disabled", "true" );
        -		}
        -
        -		this._on({
        -			// Prevent focus from sticking to links inside menu after clicking
        -			// them (focus should always stay on UL during navigation).
        -			"mousedown .ui-menu-item": function( event ) {
        -				event.preventDefault();
        -			},
        -			"click .ui-menu-item": function( event ) {
        -				var target = $( event.target );
        -				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
        -					this.select( event );
        -
        -					// Only set the mouseHandled flag if the event will bubble, see #9469.
        -					if ( !event.isPropagationStopped() ) {
        -						this.mouseHandled = true;
        -					}
        -
        -					// Open submenu on click
        -					if ( target.has( ".ui-menu" ).length ) {
        -						this.expand( event );
        -					} else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
        -
        -						// Redirect focus to the menu
        -						this.element.trigger( "focus", [ true ] );
        -
        -						// If the active item is on the top level, let it stay active.
        -						// Otherwise, blur the active item since it is no longer visible.
        -						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
        -							clearTimeout( this.timer );
        -						}
        -					}
        -				}
        -			},
        -			"mouseenter .ui-menu-item": function( event ) {
        -				// Ignore mouse events while typeahead is active, see #10458.
        -				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
        -				// is over an item in the menu
        -				if ( this.previousFilter ) {
        -					return;
        -				}
        -				var target = $( event.currentTarget );
        -				// Remove ui-state-active class from siblings of the newly focused menu item
        -				// to avoid a jump caused by adjacent elements both having a class with a border
        -				target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" );
        -				this.focus( event, target );
        -			},
        -			mouseleave: "collapseAll",
        -			"mouseleave .ui-menu": "collapseAll",
        -			focus: function( event, keepActiveItem ) {
        -				// If there's already an active item, keep it active
        -				// If not, activate the first item
        -				var item = this.active || this.element.find( this.options.items ).eq( 0 );
        -
        -				if ( !keepActiveItem ) {
        -					this.focus( event, item );
        -				}
        -			},
        -			blur: function( event ) {
        -				this._delay(function() {
        -					if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
        -						this.collapseAll( event );
        -					}
        -				});
        -			},
        -			keydown: "_keydown"
        -		});
        -
        -		this.refresh();
        -
        -		// Clicks outside of a menu collapse any open menus
        -		this._on( this.document, {
        -			click: function( event ) {
        -				if ( this._closeOnDocumentClick( event ) ) {
        -					this.collapseAll( event );
        -				}
        -
        -				// Reset the mouseHandled flag
        -				this.mouseHandled = false;
        -			}
        -		});
        -	},
        -
        -	_destroy: function() {
        -		// Destroy (sub)menus
        -		this.element
        -			.removeAttr( "aria-activedescendant" )
        -			.find( ".ui-menu" ).addBack()
        -				.removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
        -				.removeAttr( "role" )
        -				.removeAttr( "tabIndex" )
        -				.removeAttr( "aria-labelledby" )
        -				.removeAttr( "aria-expanded" )
        -				.removeAttr( "aria-hidden" )
        -				.removeAttr( "aria-disabled" )
        -				.removeUniqueId()
        -				.show();
        -
        -		// Destroy menu items
        -		this.element.find( ".ui-menu-item" )
        -			.removeClass( "ui-menu-item" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-disabled" )
        -			.removeUniqueId()
        -			.removeClass( "ui-state-hover" )
        -			.removeAttr( "tabIndex" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-haspopup" )
        -			.children().each( function() {
        -				var elem = $( this );
        -				if ( elem.data( "ui-menu-submenu-carat" ) ) {
        -					elem.remove();
        -				}
        -			});
        -
        -		// Destroy menu dividers
        -		this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
        -	},
        -
        -	_keydown: function( event ) {
        -		var match, prev, character, skip,
        -			preventDefault = true;
        -
        -		switch ( event.keyCode ) {
        -		case $.ui.keyCode.PAGE_UP:
        -			this.previousPage( event );
        -			break;
        -		case $.ui.keyCode.PAGE_DOWN:
        -			this.nextPage( event );
        -			break;
        -		case $.ui.keyCode.HOME:
        -			this._move( "first", "first", event );
        -			break;
        -		case $.ui.keyCode.END:
        -			this._move( "last", "last", event );
        -			break;
        -		case $.ui.keyCode.UP:
        -			this.previous( event );
        -			break;
        -		case $.ui.keyCode.DOWN:
        -			this.next( event );
        -			break;
        -		case $.ui.keyCode.LEFT:
        -			this.collapse( event );
        -			break;
        -		case $.ui.keyCode.RIGHT:
        -			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
        -				this.expand( event );
        -			}
        -			break;
        -		case $.ui.keyCode.ENTER:
        -		case $.ui.keyCode.SPACE:
        -			this._activate( event );
        -			break;
        -		case $.ui.keyCode.ESCAPE:
        -			this.collapse( event );
        -			break;
        -		default:
        -			preventDefault = false;
        -			prev = this.previousFilter || "";
        -			character = String.fromCharCode( event.keyCode );
        -			skip = false;
        -
        -			clearTimeout( this.filterTimer );
        -
        -			if ( character === prev ) {
        -				skip = true;
        -			} else {
        -				character = prev + character;
        -			}
        -
        -			match = this._filterMenuItems( character );
        -			match = skip && match.index( this.active.next() ) !== -1 ?
        -				this.active.nextAll( ".ui-menu-item" ) :
        -				match;
        -
        -			// If no matches on the current filter, reset to the last character pressed
        -			// to move down the menu to the first item that starts with that character
        -			if ( !match.length ) {
        -				character = String.fromCharCode( event.keyCode );
        -				match = this._filterMenuItems( character );
        -			}
        -
        -			if ( match.length ) {
        -				this.focus( event, match );
        -				this.previousFilter = character;
        -				this.filterTimer = this._delay(function() {
        -					delete this.previousFilter;
        -				}, 1000 );
        -			} else {
        -				delete this.previousFilter;
        -			}
        -		}
        -
        -		if ( preventDefault ) {
        -			event.preventDefault();
        -		}
        -	},
        -
        -	_activate: function( event ) {
        -		if ( !this.active.is( ".ui-state-disabled" ) ) {
        -			if ( this.active.is( "[aria-haspopup='true']" ) ) {
        -				this.expand( event );
        -			} else {
        -				this.select( event );
        -			}
        -		}
        -	},
        -
        -	refresh: function() {
        -		var menus, items,
        -			that = this,
        -			icon = this.options.icons.submenu,
        -			submenus = this.element.find( this.options.menus );
        -
        -		this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
        -
        -		// Initialize nested menus
        -		submenus.filter( ":not(.ui-menu)" )
        -			.addClass( "ui-menu ui-widget ui-widget-content ui-front" )
        -			.hide()
        -			.attr({
        -				role: this.options.role,
        -				"aria-hidden": "true",
        -				"aria-expanded": "false"
        -			})
        -			.each(function() {
        -				var menu = $( this ),
        -					item = menu.parent(),
        -					submenuCarat = $( "<span>" )
        -						.addClass( "ui-menu-icon ui-icon " + icon )
        -						.data( "ui-menu-submenu-carat", true );
        -
        -				item
        -					.attr( "aria-haspopup", "true" )
        -					.prepend( submenuCarat );
        -				menu.attr( "aria-labelledby", item.attr( "id" ) );
        -			});
        -
        -		menus = submenus.add( this.element );
        -		items = menus.find( this.options.items );
        -
        -		// Initialize menu-items containing spaces and/or dashes only as dividers
        -		items.not( ".ui-menu-item" ).each(function() {
        -			var item = $( this );
        -			if ( that._isDivider( item ) ) {
        -				item.addClass( "ui-widget-content ui-menu-divider" );
        -			}
        -		});
        -
        -		// Don't refresh list items that are already adapted
        -		items.not( ".ui-menu-item, .ui-menu-divider" )
        -			.addClass( "ui-menu-item" )
        -			.uniqueId()
        -			.attr({
        -				tabIndex: -1,
        -				role: this._itemRole()
        -			});
        -
        -		// Add aria-disabled attribute to any disabled menu item
        -		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
        -
        -		// If the active item has been removed, blur the menu
        -		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
        -			this.blur();
        -		}
        -	},
        -
        -	_itemRole: function() {
        -		return {
        -			menu: "menuitem",
        -			listbox: "option"
        -		}[ this.options.role ];
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "icons" ) {
        -			this.element.find( ".ui-menu-icon" )
        -				.removeClass( this.options.icons.submenu )
        -				.addClass( value.submenu );
        -		}
        -		if ( key === "disabled" ) {
        -			this.element
        -				.toggleClass( "ui-state-disabled", !!value )
        -				.attr( "aria-disabled", value );
        -		}
        -		this._super( key, value );
        -	},
        -
        -	focus: function( event, item ) {
        -		var nested, focused;
        -		this.blur( event, event && event.type === "focus" );
        -
        -		this._scrollIntoView( item );
        -
        -		this.active = item.first();
        -		focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" );
        -		// Only update aria-activedescendant if there's a role
        -		// otherwise we assume focus is managed elsewhere
        -		if ( this.options.role ) {
        -			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
        -		}
        -
        -		// Highlight active parent menu item, if any
        -		this.active
        -			.parent()
        -			.closest( ".ui-menu-item" )
        -			.addClass( "ui-state-active" );
        -
        -		if ( event && event.type === "keydown" ) {
        -			this._close();
        -		} else {
        -			this.timer = this._delay(function() {
        -				this._close();
        -			}, this.delay );
        -		}
        -
        -		nested = item.children( ".ui-menu" );
        -		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
        -			this._startOpening(nested);
        -		}
        -		this.activeMenu = item.parent();
        -
        -		this._trigger( "focus", event, { item: item } );
        -	},
        -
        -	_scrollIntoView: function( item ) {
        -		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
        -		if ( this._hasScroll() ) {
        -			borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
        -			paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
        -			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
        -			scroll = this.activeMenu.scrollTop();
        -			elementHeight = this.activeMenu.height();
        -			itemHeight = item.outerHeight();
        -
        -			if ( offset < 0 ) {
        -				this.activeMenu.scrollTop( scroll + offset );
        -			} else if ( offset + itemHeight > elementHeight ) {
        -				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
        -			}
        -		}
        -	},
        -
        -	blur: function( event, fromFocus ) {
        -		if ( !fromFocus ) {
        -			clearTimeout( this.timer );
        -		}
        -
        -		if ( !this.active ) {
        -			return;
        -		}
        -
        -		this.active.removeClass( "ui-state-focus" );
        -		this.active = null;
        -
        -		this._trigger( "blur", event, { item: this.active } );
        -	},
        -
        -	_startOpening: function( submenu ) {
        -		clearTimeout( this.timer );
        -
        -		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
        -		// shift in the submenu position when mousing over the carat icon
        -		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
        -			return;
        -		}
        -
        -		this.timer = this._delay(function() {
        -			this._close();
        -			this._open( submenu );
        -		}, this.delay );
        -	},
        -
        -	_open: function( submenu ) {
        -		var position = $.extend({
        -			of: this.active
        -		}, this.options.position );
        -
        -		clearTimeout( this.timer );
        -		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
        -			.hide()
        -			.attr( "aria-hidden", "true" );
        -
        -		submenu
        -			.show()
        -			.removeAttr( "aria-hidden" )
        -			.attr( "aria-expanded", "true" )
        -			.position( position );
        -	},
        -
        -	collapseAll: function( event, all ) {
        -		clearTimeout( this.timer );
        -		this.timer = this._delay(function() {
        -			// If we were passed an event, look for the submenu that contains the event
        -			var currentMenu = all ? this.element :
        -				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
        -
        -			// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
        -			if ( !currentMenu.length ) {
        -				currentMenu = this.element;
        -			}
        -
        -			this._close( currentMenu );
        -
        -			this.blur( event );
        -			this.activeMenu = currentMenu;
        -		}, this.delay );
        -	},
        -
        -	// With no arguments, closes the currently active menu - if nothing is active
        -	// it closes all menus.  If passed an argument, it will search for menus BELOW
        -	_close: function( startMenu ) {
        -		if ( !startMenu ) {
        -			startMenu = this.active ? this.active.parent() : this.element;
        -		}
        -
        -		startMenu
        -			.find( ".ui-menu" )
        -				.hide()
        -				.attr( "aria-hidden", "true" )
        -				.attr( "aria-expanded", "false" )
        -			.end()
        -			.find( ".ui-state-active" ).not( ".ui-state-focus" )
        -				.removeClass( "ui-state-active" );
        -	},
        -
        -	_closeOnDocumentClick: function( event ) {
        -		return !$( event.target ).closest( ".ui-menu" ).length;
        -	},
        -
        -	_isDivider: function( item ) {
        -
        -		// Match hyphen, em dash, en dash
        -		return !/[^\-\u2014\u2013\s]/.test( item.text() );
        -	},
        -
        -	collapse: function( event ) {
        -		var newItem = this.active &&
        -			this.active.parent().closest( ".ui-menu-item", this.element );
        -		if ( newItem && newItem.length ) {
        -			this._close();
        -			this.focus( event, newItem );
        -		}
        -	},
        -
        -	expand: function( event ) {
        -		var newItem = this.active &&
        -			this.active
        -				.children( ".ui-menu " )
        -				.find( this.options.items )
        -				.first();
        -
        -		if ( newItem && newItem.length ) {
        -			this._open( newItem.parent() );
        -
        -			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
        -			this._delay(function() {
        -				this.focus( event, newItem );
        -			});
        -		}
        -	},
        -
        -	next: function( event ) {
        -		this._move( "next", "first", event );
        -	},
        -
        -	previous: function( event ) {
        -		this._move( "prev", "last", event );
        -	},
        -
        -	isFirstItem: function() {
        -		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
        -	},
        -
        -	isLastItem: function() {
        -		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
        -	},
        -
        -	_move: function( direction, filter, event ) {
        -		var next;
        -		if ( this.active ) {
        -			if ( direction === "first" || direction === "last" ) {
        -				next = this.active
        -					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
        -					.eq( -1 );
        -			} else {
        -				next = this.active
        -					[ direction + "All" ]( ".ui-menu-item" )
        -					.eq( 0 );
        -			}
        -		}
        -		if ( !next || !next.length || !this.active ) {
        -			next = this.activeMenu.find( this.options.items )[ filter ]();
        -		}
        -
        -		this.focus( event, next );
        -	},
        -
        -	nextPage: function( event ) {
        -		var item, base, height;
        -
        -		if ( !this.active ) {
        -			this.next( event );
        -			return;
        -		}
        -		if ( this.isLastItem() ) {
        -			return;
        -		}
        -		if ( this._hasScroll() ) {
        -			base = this.active.offset().top;
        -			height = this.element.height();
        -			this.active.nextAll( ".ui-menu-item" ).each(function() {
        -				item = $( this );
        -				return item.offset().top - base - height < 0;
        -			});
        -
        -			this.focus( event, item );
        -		} else {
        -			this.focus( event, this.activeMenu.find( this.options.items )
        -				[ !this.active ? "first" : "last" ]() );
        -		}
        -	},
        -
        -	previousPage: function( event ) {
        -		var item, base, height;
        -		if ( !this.active ) {
        -			this.next( event );
        -			return;
        -		}
        -		if ( this.isFirstItem() ) {
        -			return;
        -		}
        -		if ( this._hasScroll() ) {
        -			base = this.active.offset().top;
        -			height = this.element.height();
        -			this.active.prevAll( ".ui-menu-item" ).each(function() {
        -				item = $( this );
        -				return item.offset().top - base + height > 0;
        -			});
        -
        -			this.focus( event, item );
        -		} else {
        -			this.focus( event, this.activeMenu.find( this.options.items ).first() );
        -		}
        -	},
        -
        -	_hasScroll: function() {
        -		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
        -	},
        -
        -	select: function( event ) {
        -		// TODO: It should never be possible to not have an active item at this
        -		// point, but the tests don't trigger mouseenter before click.
        -		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
        -		var ui = { item: this.active };
        -		if ( !this.active.has( ".ui-menu" ).length ) {
        -			this.collapseAll( event, true );
        -		}
        -		this._trigger( "select", event, ui );
        -	},
        -
        -	_filterMenuItems: function(character) {
        -		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
        -			regex = new RegExp( "^" + escapedCharacter, "i" );
        -
        -		return this.activeMenu
        -			.find( this.options.items )
        -
        -			// Only match on items, not dividers or other content (#10571)
        -			.filter( ".ui-menu-item" )
        -			.filter(function() {
        -				return regex.test( $.trim( $( this ).text() ) );
        -			});
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Autocomplete 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/autocomplete/
        - */
        -
        -
        -$.widget( "ui.autocomplete", {
        -	version: "1.11.4",
        -	defaultElement: "<input>",
        -	options: {
        -		appendTo: null,
        -		autoFocus: false,
        -		delay: 300,
        -		minLength: 1,
        -		position: {
        -			my: "left top",
        -			at: "left bottom",
        -			collision: "none"
        -		},
        -		source: null,
        -
        -		// callbacks
        -		change: null,
        -		close: null,
        -		focus: null,
        -		open: null,
        -		response: null,
        -		search: null,
        -		select: null
        -	},
        -
        -	requestIndex: 0,
        -	pending: 0,
        -
        -	_create: function() {
        -		// Some browsers only repeat keydown events, not keypress events,
        -		// so we use the suppressKeyPress flag to determine if we've already
        -		// handled the keydown event. #7269
        -		// Unfortunately the code for & in keypress is the same as the up arrow,
        -		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
        -		// events when we know the keydown event was used to modify the
        -		// search term. #7799
        -		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
        -			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
        -			isTextarea = nodeName === "textarea",
        -			isInput = nodeName === "input";
        -
        -		this.isMultiLine =
        -			// Textareas are always multi-line
        -			isTextarea ? true :
        -			// Inputs are always single-line, even if inside a contentEditable element
        -			// IE also treats inputs as contentEditable
        -			isInput ? false :
        -			// All other element types are determined by whether or not they're contentEditable
        -			this.element.prop( "isContentEditable" );
        -
        -		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
        -		this.isNewMenu = true;
        -
        -		this.element
        -			.addClass( "ui-autocomplete-input" )
        -			.attr( "autocomplete", "off" );
        -
        -		this._on( this.element, {
        -			keydown: function( event ) {
        -				if ( this.element.prop( "readOnly" ) ) {
        -					suppressKeyPress = true;
        -					suppressInput = true;
        -					suppressKeyPressRepeat = true;
        -					return;
        -				}
        -
        -				suppressKeyPress = false;
        -				suppressInput = false;
        -				suppressKeyPressRepeat = false;
        -				var keyCode = $.ui.keyCode;
        -				switch ( event.keyCode ) {
        -				case keyCode.PAGE_UP:
        -					suppressKeyPress = true;
        -					this._move( "previousPage", event );
        -					break;
        -				case keyCode.PAGE_DOWN:
        -					suppressKeyPress = true;
        -					this._move( "nextPage", event );
        -					break;
        -				case keyCode.UP:
        -					suppressKeyPress = true;
        -					this._keyEvent( "previous", event );
        -					break;
        -				case keyCode.DOWN:
        -					suppressKeyPress = true;
        -					this._keyEvent( "next", event );
        -					break;
        -				case keyCode.ENTER:
        -					// when menu is open and has focus
        -					if ( this.menu.active ) {
        -						// #6055 - Opera still allows the keypress to occur
        -						// which causes forms to submit
        -						suppressKeyPress = true;
        -						event.preventDefault();
        -						this.menu.select( event );
        -					}
        -					break;
        -				case keyCode.TAB:
        -					if ( this.menu.active ) {
        -						this.menu.select( event );
        -					}
        -					break;
        -				case keyCode.ESCAPE:
        -					if ( this.menu.element.is( ":visible" ) ) {
        -						if ( !this.isMultiLine ) {
        -							this._value( this.term );
        -						}
        -						this.close( event );
        -						// Different browsers have different default behavior for escape
        -						// Single press can mean undo or clear
        -						// Double press in IE means clear the whole form
        -						event.preventDefault();
        -					}
        -					break;
        -				default:
        -					suppressKeyPressRepeat = true;
        -					// search timeout should be triggered before the input value is changed
        -					this._searchTimeout( event );
        -					break;
        -				}
        -			},
        -			keypress: function( event ) {
        -				if ( suppressKeyPress ) {
        -					suppressKeyPress = false;
        -					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        -						event.preventDefault();
        -					}
        -					return;
        -				}
        -				if ( suppressKeyPressRepeat ) {
        -					return;
        -				}
        -
        -				// replicate some key handlers to allow them to repeat in Firefox and Opera
        -				var keyCode = $.ui.keyCode;
        -				switch ( event.keyCode ) {
        -				case keyCode.PAGE_UP:
        -					this._move( "previousPage", event );
        -					break;
        -				case keyCode.PAGE_DOWN:
        -					this._move( "nextPage", event );
        -					break;
        -				case keyCode.UP:
        -					this._keyEvent( "previous", event );
        -					break;
        -				case keyCode.DOWN:
        -					this._keyEvent( "next", event );
        -					break;
        -				}
        -			},
        -			input: function( event ) {
        -				if ( suppressInput ) {
        -					suppressInput = false;
        -					event.preventDefault();
        -					return;
        -				}
        -				this._searchTimeout( event );
        -			},
        -			focus: function() {
        -				this.selectedItem = null;
        -				this.previous = this._value();
        -			},
        -			blur: function( event ) {
        -				if ( this.cancelBlur ) {
        -					delete this.cancelBlur;
        -					return;
        -				}
        -
        -				clearTimeout( this.searching );
        -				this.close( event );
        -				this._change( event );
        -			}
        -		});
        -
        -		this._initSource();
        -		this.menu = $( "<ul>" )
        -			.addClass( "ui-autocomplete ui-front" )
        -			.appendTo( this._appendTo() )
        -			.menu({
        -				// disable ARIA support, the live region takes care of that
        -				role: null
        -			})
        -			.hide()
        -			.menu( "instance" );
        -
        -		this._on( this.menu.element, {
        -			mousedown: function( event ) {
        -				// prevent moving focus out of the text field
        -				event.preventDefault();
        -
        -				// IE doesn't prevent moving focus even with event.preventDefault()
        -				// so we set a flag to know when we should ignore the blur event
        -				this.cancelBlur = true;
        -				this._delay(function() {
        -					delete this.cancelBlur;
        -				});
        -
        -				// clicking on the scrollbar causes focus to shift to the body
        -				// but we can't detect a mouseup or a click immediately afterward
        -				// so we have to track the next mousedown and close the menu if
        -				// the user clicks somewhere outside of the autocomplete
        -				var menuElement = this.menu.element[ 0 ];
        -				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
        -					this._delay(function() {
        -						var that = this;
        -						this.document.one( "mousedown", function( event ) {
        -							if ( event.target !== that.element[ 0 ] &&
        -									event.target !== menuElement &&
        -									!$.contains( menuElement, event.target ) ) {
        -								that.close();
        -							}
        -						});
        -					});
        -				}
        -			},
        -			menufocus: function( event, ui ) {
        -				var label, item;
        -				// support: Firefox
        -				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
        -				if ( this.isNewMenu ) {
        -					this.isNewMenu = false;
        -					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
        -						this.menu.blur();
        -
        -						this.document.one( "mousemove", function() {
        -							$( event.target ).trigger( event.originalEvent );
        -						});
        -
        -						return;
        -					}
        -				}
        -
        -				item = ui.item.data( "ui-autocomplete-item" );
        -				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
        -					// use value to match what will end up in the input, if it was a key event
        -					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
        -						this._value( item.value );
        -					}
        -				}
        -
        -				// Announce the value in the liveRegion
        -				label = ui.item.attr( "aria-label" ) || item.value;
        -				if ( label && $.trim( label ).length ) {
        -					this.liveRegion.children().hide();
        -					$( "<div>" ).text( label ).appendTo( this.liveRegion );
        -				}
        -			},
        -			menuselect: function( event, ui ) {
        -				var item = ui.item.data( "ui-autocomplete-item" ),
        -					previous = this.previous;
        -
        -				// only trigger when focus was lost (click on menu)
        -				if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
        -					this.element.focus();
        -					this.previous = previous;
        -					// #6109 - IE triggers two focus events and the second
        -					// is asynchronous, so we need to reset the previous
        -					// term synchronously and asynchronously :-(
        -					this._delay(function() {
        -						this.previous = previous;
        -						this.selectedItem = item;
        -					});
        -				}
        -
        -				if ( false !== this._trigger( "select", event, { item: item } ) ) {
        -					this._value( item.value );
        -				}
        -				// reset the term after the select event
        -				// this allows custom select handling to work properly
        -				this.term = this._value();
        -
        -				this.close( event );
        -				this.selectedItem = item;
        -			}
        -		});
        -
        -		this.liveRegion = $( "<span>", {
        -				role: "status",
        -				"aria-live": "assertive",
        -				"aria-relevant": "additions"
        -			})
        -			.addClass( "ui-helper-hidden-accessible" )
        -			.appendTo( this.document[ 0 ].body );
        -
        -		// turning off autocomplete prevents the browser from remembering the
        -		// value when navigating through history, so we re-enable autocomplete
        -		// if the page is unloaded before the widget is destroyed. #7790
        -		this._on( this.window, {
        -			beforeunload: function() {
        -				this.element.removeAttr( "autocomplete" );
        -			}
        -		});
        -	},
        -
        -	_destroy: function() {
        -		clearTimeout( this.searching );
        -		this.element
        -			.removeClass( "ui-autocomplete-input" )
        -			.removeAttr( "autocomplete" );
        -		this.menu.element.remove();
        -		this.liveRegion.remove();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -		if ( key === "source" ) {
        -			this._initSource();
        -		}
        -		if ( key === "appendTo" ) {
        -			this.menu.element.appendTo( this._appendTo() );
        -		}
        -		if ( key === "disabled" && value && this.xhr ) {
        -			this.xhr.abort();
        -		}
        -	},
        -
        -	_appendTo: function() {
        -		var element = this.options.appendTo;
        -
        -		if ( element ) {
        -			element = element.jquery || element.nodeType ?
        -				$( element ) :
        -				this.document.find( element ).eq( 0 );
        -		}
        -
        -		if ( !element || !element[ 0 ] ) {
        -			element = this.element.closest( ".ui-front" );
        -		}
        -
        -		if ( !element.length ) {
        -			element = this.document[ 0 ].body;
        -		}
        -
        -		return element;
        -	},
        -
        -	_initSource: function() {
        -		var array, url,
        -			that = this;
        -		if ( $.isArray( this.options.source ) ) {
        -			array = this.options.source;
        -			this.source = function( request, response ) {
        -				response( $.ui.autocomplete.filter( array, request.term ) );
        -			};
        -		} else if ( typeof this.options.source === "string" ) {
        -			url = this.options.source;
        -			this.source = function( request, response ) {
        -				if ( that.xhr ) {
        -					that.xhr.abort();
        -				}
        -				that.xhr = $.ajax({
        -					url: url,
        -					data: request,
        -					dataType: "json",
        -					success: function( data ) {
        -						response( data );
        -					},
        -					error: function() {
        -						response([]);
        -					}
        -				});
        -			};
        -		} else {
        -			this.source = this.options.source;
        -		}
        -	},
        -
        -	_searchTimeout: function( event ) {
        -		clearTimeout( this.searching );
        -		this.searching = this._delay(function() {
        -
        -			// Search if the value has changed, or if the user retypes the same value (see #7434)
        -			var equalValues = this.term === this._value(),
        -				menuVisible = this.menu.element.is( ":visible" ),
        -				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
        -
        -			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
        -				this.selectedItem = null;
        -				this.search( null, event );
        -			}
        -		}, this.options.delay );
        -	},
        -
        -	search: function( value, event ) {
        -		value = value != null ? value : this._value();
        -
        -		// always save the actual value, not the one passed as an argument
        -		this.term = this._value();
        -
        -		if ( value.length < this.options.minLength ) {
        -			return this.close( event );
        -		}
        -
        -		if ( this._trigger( "search", event ) === false ) {
        -			return;
        -		}
        -
        -		return this._search( value );
        -	},
        -
        -	_search: function( value ) {
        -		this.pending++;
        -		this.element.addClass( "ui-autocomplete-loading" );
        -		this.cancelSearch = false;
        -
        -		this.source( { term: value }, this._response() );
        -	},
        -
        -	_response: function() {
        -		var index = ++this.requestIndex;
        -
        -		return $.proxy(function( content ) {
        -			if ( index === this.requestIndex ) {
        -				this.__response( content );
        -			}
        -
        -			this.pending--;
        -			if ( !this.pending ) {
        -				this.element.removeClass( "ui-autocomplete-loading" );
        -			}
        -		}, this );
        -	},
        -
        -	__response: function( content ) {
        -		if ( content ) {
        -			content = this._normalize( content );
        -		}
        -		this._trigger( "response", null, { content: content } );
        -		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
        -			this._suggest( content );
        -			this._trigger( "open" );
        -		} else {
        -			// use ._close() instead of .close() so we don't cancel future searches
        -			this._close();
        -		}
        -	},
        -
        -	close: function( event ) {
        -		this.cancelSearch = true;
        -		this._close( event );
        -	},
        -
        -	_close: function( event ) {
        -		if ( this.menu.element.is( ":visible" ) ) {
        -			this.menu.element.hide();
        -			this.menu.blur();
        -			this.isNewMenu = true;
        -			this._trigger( "close", event );
        -		}
        -	},
        -
        -	_change: function( event ) {
        -		if ( this.previous !== this._value() ) {
        -			this._trigger( "change", event, { item: this.selectedItem } );
        -		}
        -	},
        -
        -	_normalize: function( items ) {
        -		// assume all items have the right format when the first item is complete
        -		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
        -			return items;
        -		}
        -		return $.map( items, function( item ) {
        -			if ( typeof item === "string" ) {
        -				return {
        -					label: item,
        -					value: item
        -				};
        -			}
        -			return $.extend( {}, item, {
        -				label: item.label || item.value,
        -				value: item.value || item.label
        -			});
        -		});
        -	},
        -
        -	_suggest: function( items ) {
        -		var ul = this.menu.element.empty();
        -		this._renderMenu( ul, items );
        -		this.isNewMenu = true;
        -		this.menu.refresh();
        -
        -		// size and position menu
        -		ul.show();
        -		this._resizeMenu();
        -		ul.position( $.extend({
        -			of: this.element
        -		}, this.options.position ) );
        -
        -		if ( this.options.autoFocus ) {
        -			this.menu.next();
        -		}
        -	},
        -
        -	_resizeMenu: function() {
        -		var ul = this.menu.element;
        -		ul.outerWidth( Math.max(
        -			// Firefox wraps long text (possibly a rounding bug)
        -			// so we add 1px to avoid the wrapping (#7513)
        -			ul.width( "" ).outerWidth() + 1,
        -			this.element.outerWidth()
        -		) );
        -	},
        -
        -	_renderMenu: function( ul, items ) {
        -		var that = this;
        -		$.each( items, function( index, item ) {
        -			that._renderItemData( ul, item );
        -		});
        -	},
        -
        -	_renderItemData: function( ul, item ) {
        -		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
        -	},
        -
        -	_renderItem: function( ul, item ) {
        -		return $( "<li>" ).text( item.label ).appendTo( ul );
        -	},
        -
        -	_move: function( direction, event ) {
        -		if ( !this.menu.element.is( ":visible" ) ) {
        -			this.search( null, event );
        -			return;
        -		}
        -		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
        -				this.menu.isLastItem() && /^next/.test( direction ) ) {
        -
        -			if ( !this.isMultiLine ) {
        -				this._value( this.term );
        -			}
        -
        -			this.menu.blur();
        -			return;
        -		}
        -		this.menu[ direction ]( event );
        -	},
        -
        -	widget: function() {
        -		return this.menu.element;
        -	},
        -
        -	_value: function() {
        -		return this.valueMethod.apply( this.element, arguments );
        -	},
        -
        -	_keyEvent: function( keyEvent, event ) {
        -		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
        -			this._move( keyEvent, event );
        -
        -			// prevents moving cursor to beginning/end of the text field in some browsers
        -			event.preventDefault();
        -		}
        -	}
        -});
        -
        -$.extend( $.ui.autocomplete, {
        -	escapeRegex: function( value ) {
        -		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
        -	},
        -	filter: function( array, term ) {
        -		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
        -		return $.grep( array, function( value ) {
        -			return matcher.test( value.label || value.value || value );
        -		});
        -	}
        -});
        -
        -// live region extension, adding a `messages` option
        -// NOTE: This is an experimental API. We are still investigating
        -// a full solution for string manipulation and internationalization.
        -$.widget( "ui.autocomplete", $.ui.autocomplete, {
        -	options: {
        -		messages: {
        -			noResults: "No search results.",
        -			results: function( amount ) {
        -				return amount + ( amount > 1 ? " results are" : " result is" ) +
        -					" available, use up and down arrow keys to navigate.";
        -			}
        -		}
        -	},
        -
        -	__response: function( content ) {
        -		var message;
        -		this._superApply( arguments );
        -		if ( this.options.disabled || this.cancelSearch ) {
        -			return;
        -		}
        -		if ( content && content.length ) {
        -			message = this.options.messages.results( content.length );
        -		} else {
        -			message = this.options.messages.noResults;
        -		}
        -		this.liveRegion.children().hide();
        -		$( "<div>" ).text( message ).appendTo( this.liveRegion );
        -	}
        -});
        -
        -var autocomplete = $.ui.autocomplete;
        -
        -
        -/*!
        - * jQuery UI Button 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/button/
        - */
        -
        -
        -var lastActive,
        -	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
        -	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
        -	formResetHandler = function() {
        -		var form = $( this );
        -		setTimeout(function() {
        -			form.find( ":ui-button" ).button( "refresh" );
        -		}, 1 );
        -	},
        -	radioGroup = function( radio ) {
        -		var name = radio.name,
        -			form = radio.form,
        -			radios = $( [] );
        -		if ( name ) {
        -			name = name.replace( /'/g, "\\'" );
        -			if ( form ) {
        -				radios = $( form ).find( "[name='" + name + "'][type=radio]" );
        -			} else {
        -				radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument )
        -					.filter(function() {
        -						return !this.form;
        -					});
        -			}
        -		}
        -		return radios;
        -	};
        -
        -$.widget( "ui.button", {
        -	version: "1.11.4",
        -	defaultElement: "<button>",
        -	options: {
        -		disabled: null,
        -		text: true,
        -		label: null,
        -		icons: {
        -			primary: null,
        -			secondary: null
        -		}
        -	},
        -	_create: function() {
        -		this.element.closest( "form" )
        -			.unbind( "reset" + this.eventNamespace )
        -			.bind( "reset" + this.eventNamespace, formResetHandler );
        -
        -		if ( typeof this.options.disabled !== "boolean" ) {
        -			this.options.disabled = !!this.element.prop( "disabled" );
        -		} else {
        -			this.element.prop( "disabled", this.options.disabled );
        -		}
        -
        -		this._determineButtonType();
        -		this.hasTitle = !!this.buttonElement.attr( "title" );
        -
        -		var that = this,
        -			options = this.options,
        -			toggleButton = this.type === "checkbox" || this.type === "radio",
        -			activeClass = !toggleButton ? "ui-state-active" : "";
        -
        -		if ( options.label === null ) {
        -			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
        -		}
        -
        -		this._hoverable( this.buttonElement );
        -
        -		this.buttonElement
        -			.addClass( baseClasses )
        -			.attr( "role", "button" )
        -			.bind( "mouseenter" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return;
        -				}
        -				if ( this === lastActive ) {
        -					$( this ).addClass( "ui-state-active" );
        -				}
        -			})
        -			.bind( "mouseleave" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return;
        -				}
        -				$( this ).removeClass( activeClass );
        -			})
        -			.bind( "click" + this.eventNamespace, function( event ) {
        -				if ( options.disabled ) {
        -					event.preventDefault();
        -					event.stopImmediatePropagation();
        -				}
        -			});
        -
        -		// Can't use _focusable() because the element that receives focus
        -		// and the element that gets the ui-state-focus class are different
        -		this._on({
        -			focus: function() {
        -				this.buttonElement.addClass( "ui-state-focus" );
        -			},
        -			blur: function() {
        -				this.buttonElement.removeClass( "ui-state-focus" );
        -			}
        -		});
        -
        -		if ( toggleButton ) {
        -			this.element.bind( "change" + this.eventNamespace, function() {
        -				that.refresh();
        -			});
        -		}
        -
        -		if ( this.type === "checkbox" ) {
        -			this.buttonElement.bind( "click" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return false;
        -				}
        -			});
        -		} else if ( this.type === "radio" ) {
        -			this.buttonElement.bind( "click" + this.eventNamespace, function() {
        -				if ( options.disabled ) {
        -					return false;
        -				}
        -				$( this ).addClass( "ui-state-active" );
        -				that.buttonElement.attr( "aria-pressed", "true" );
        -
        -				var radio = that.element[ 0 ];
        -				radioGroup( radio )
        -					.not( radio )
        -					.map(function() {
        -						return $( this ).button( "widget" )[ 0 ];
        -					})
        -					.removeClass( "ui-state-active" )
        -					.attr( "aria-pressed", "false" );
        -			});
        -		} else {
        -			this.buttonElement
        -				.bind( "mousedown" + this.eventNamespace, function() {
        -					if ( options.disabled ) {
        -						return false;
        -					}
        -					$( this ).addClass( "ui-state-active" );
        -					lastActive = this;
        -					that.document.one( "mouseup", function() {
        -						lastActive = null;
        -					});
        -				})
        -				.bind( "mouseup" + this.eventNamespace, function() {
        -					if ( options.disabled ) {
        -						return false;
        -					}
        -					$( this ).removeClass( "ui-state-active" );
        -				})
        -				.bind( "keydown" + this.eventNamespace, function(event) {
        -					if ( options.disabled ) {
        -						return false;
        -					}
        -					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
        -						$( this ).addClass( "ui-state-active" );
        -					}
        -				})
        -				// see #8559, we bind to blur here in case the button element loses
        -				// focus between keydown and keyup, it would be left in an "active" state
        -				.bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
        -					$( this ).removeClass( "ui-state-active" );
        -				});
        -
        -			if ( this.buttonElement.is("a") ) {
        -				this.buttonElement.keyup(function(event) {
        -					if ( event.keyCode === $.ui.keyCode.SPACE ) {
        -						// TODO pass through original event correctly (just as 2nd argument doesn't work)
        -						$( this ).click();
        -					}
        -				});
        -			}
        -		}
        -
        -		this._setOption( "disabled", options.disabled );
        -		this._resetButton();
        -	},
        -
        -	_determineButtonType: function() {
        -		var ancestor, labelSelector, checked;
        -
        -		if ( this.element.is("[type=checkbox]") ) {
        -			this.type = "checkbox";
        -		} else if ( this.element.is("[type=radio]") ) {
        -			this.type = "radio";
        -		} else if ( this.element.is("input") ) {
        -			this.type = "input";
        -		} else {
        -			this.type = "button";
        -		}
        -
        -		if ( this.type === "checkbox" || this.type === "radio" ) {
        -			// we don't search against the document in case the element
        -			// is disconnected from the DOM
        -			ancestor = this.element.parents().last();
        -			labelSelector = "label[for='" + this.element.attr("id") + "']";
        -			this.buttonElement = ancestor.find( labelSelector );
        -			if ( !this.buttonElement.length ) {
        -				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
        -				this.buttonElement = ancestor.filter( labelSelector );
        -				if ( !this.buttonElement.length ) {
        -					this.buttonElement = ancestor.find( labelSelector );
        -				}
        -			}
        -			this.element.addClass( "ui-helper-hidden-accessible" );
        -
        -			checked = this.element.is( ":checked" );
        -			if ( checked ) {
        -				this.buttonElement.addClass( "ui-state-active" );
        -			}
        -			this.buttonElement.prop( "aria-pressed", checked );
        -		} else {
        -			this.buttonElement = this.element;
        -		}
        -	},
        -
        -	widget: function() {
        -		return this.buttonElement;
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-helper-hidden-accessible" );
        -		this.buttonElement
        -			.removeClass( baseClasses + " ui-state-active " + typeClasses )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-pressed" )
        -			.html( this.buttonElement.find(".ui-button-text").html() );
        -
        -		if ( !this.hasTitle ) {
        -			this.buttonElement.removeAttr( "title" );
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -		if ( key === "disabled" ) {
        -			this.widget().toggleClass( "ui-state-disabled", !!value );
        -			this.element.prop( "disabled", !!value );
        -			if ( value ) {
        -				if ( this.type === "checkbox" || this.type === "radio" ) {
        -					this.buttonElement.removeClass( "ui-state-focus" );
        -				} else {
        -					this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
        -				}
        -			}
        -			return;
        -		}
        -		this._resetButton();
        -	},
        -
        -	refresh: function() {
        -		//See #8237 & #8828
        -		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
        -
        -		if ( isDisabled !== this.options.disabled ) {
        -			this._setOption( "disabled", isDisabled );
        -		}
        -		if ( this.type === "radio" ) {
        -			radioGroup( this.element[0] ).each(function() {
        -				if ( $( this ).is( ":checked" ) ) {
        -					$( this ).button( "widget" )
        -						.addClass( "ui-state-active" )
        -						.attr( "aria-pressed", "true" );
        -				} else {
        -					$( this ).button( "widget" )
        -						.removeClass( "ui-state-active" )
        -						.attr( "aria-pressed", "false" );
        -				}
        -			});
        -		} else if ( this.type === "checkbox" ) {
        -			if ( this.element.is( ":checked" ) ) {
        -				this.buttonElement
        -					.addClass( "ui-state-active" )
        -					.attr( "aria-pressed", "true" );
        -			} else {
        -				this.buttonElement
        -					.removeClass( "ui-state-active" )
        -					.attr( "aria-pressed", "false" );
        -			}
        -		}
        -	},
        -
        -	_resetButton: function() {
        -		if ( this.type === "input" ) {
        -			if ( this.options.label ) {
        -				this.element.val( this.options.label );
        -			}
        -			return;
        -		}
        -		var buttonElement = this.buttonElement.removeClass( typeClasses ),
        -			buttonText = $( "<span></span>", this.document[0] )
        -				.addClass( "ui-button-text" )
        -				.html( this.options.label )
        -				.appendTo( buttonElement.empty() )
        -				.text(),
        -			icons = this.options.icons,
        -			multipleIcons = icons.primary && icons.secondary,
        -			buttonClasses = [];
        -
        -		if ( icons.primary || icons.secondary ) {
        -			if ( this.options.text ) {
        -				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
        -			}
        -
        -			if ( icons.primary ) {
        -				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
        -			}
        -
        -			if ( icons.secondary ) {
        -				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
        -			}
        -
        -			if ( !this.options.text ) {
        -				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
        -
        -				if ( !this.hasTitle ) {
        -					buttonElement.attr( "title", $.trim( buttonText ) );
        -				}
        -			}
        -		} else {
        -			buttonClasses.push( "ui-button-text-only" );
        -		}
        -		buttonElement.addClass( buttonClasses.join( " " ) );
        -	}
        -});
        -
        -$.widget( "ui.buttonset", {
        -	version: "1.11.4",
        -	options: {
        -		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
        -	},
        -
        -	_create: function() {
        -		this.element.addClass( "ui-buttonset" );
        -	},
        -
        -	_init: function() {
        -		this.refresh();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "disabled" ) {
        -			this.buttons.button( "option", key, value );
        -		}
        -
        -		this._super( key, value );
        -	},
        -
        -	refresh: function() {
        -		var rtl = this.element.css( "direction" ) === "rtl",
        -			allButtons = this.element.find( this.options.items ),
        -			existingButtons = allButtons.filter( ":ui-button" );
        -
        -		// Initialize new buttons
        -		allButtons.not( ":ui-button" ).button();
        -
        -		// Refresh existing buttons
        -		existingButtons.button( "refresh" );
        -
        -		this.buttons = allButtons
        -			.map(function() {
        -				return $( this ).button( "widget" )[ 0 ];
        -			})
        -				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
        -				.filter( ":first" )
        -					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
        -				.end()
        -				.filter( ":last" )
        -					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
        -				.end()
        -			.end();
        -	},
        -
        -	_destroy: function() {
        -		this.element.removeClass( "ui-buttonset" );
        -		this.buttons
        -			.map(function() {
        -				return $( this ).button( "widget" )[ 0 ];
        -			})
        -				.removeClass( "ui-corner-left ui-corner-right" )
        -			.end()
        -			.button( "destroy" );
        -	}
        -});
        -
        -var button = $.ui.button;
        -
        -
        -/*!
        - * jQuery UI Datepicker 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/datepicker/
        - */
        -
        -
        -$.extend($.ui, { datepicker: { version: "1.11.4" } });
        -
        -var datepicker_instActive;
        -
        -function datepicker_getZindex( elem ) {
        -	var position, value;
        -	while ( elem.length && elem[ 0 ] !== document ) {
        -		// Ignore z-index if position is set to a value where z-index is ignored by the browser
        -		// This makes behavior of this function consistent across browsers
        -		// WebKit always returns auto if the element is positioned
        -		position = elem.css( "position" );
        -		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
        -			// IE returns 0 when zIndex is not specified
        -			// other browsers return a string
        -			// we ignore the case of nested elements with an explicit value of 0
        -			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
        -			value = parseInt( elem.css( "zIndex" ), 10 );
        -			if ( !isNaN( value ) && value !== 0 ) {
        -				return value;
        -			}
        -		}
        -		elem = elem.parent();
        -	}
        -
        -	return 0;
        -}
        -/* Date picker manager.
        -   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
        -   Settings for (groups of) date pickers are maintained in an instance object,
        -   allowing multiple different settings on the same page. */
        -
        -function Datepicker() {
        -	this._curInst = null; // The current instance in use
        -	this._keyEvent = false; // If the last event was a key event
        -	this._disabledInputs = []; // List of date picker inputs that have been disabled
        -	this._datepickerShowing = false; // True if the popup picker is showing , false if not
        -	this._inDialog = false; // True if showing within a "dialog", false if not
        -	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
        -	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
        -	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
        -	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
        -	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
        -	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
        -	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
        -	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
        -	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
        -	this.regional = []; // Available regional settings, indexed by language code
        -	this.regional[""] = { // Default regional settings
        -		closeText: "Done", // Display text for close link
        -		prevText: "Prev", // Display text for previous month link
        -		nextText: "Next", // Display text for next month link
        -		currentText: "Today", // Display text for current month link
        -		monthNames: ["January","February","March","April","May","June",
        -			"July","August","September","October","November","December"], // Names of months for drop-down and formatting
        -		monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
        -		dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
        -		dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
        -		dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
        -		weekHeader: "Wk", // Column header for week of the year
        -		dateFormat: "mm/dd/yy", // See format options on parseDate
        -		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
        -		isRTL: false, // True if right-to-left language, false if left-to-right
        -		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
        -		yearSuffix: "" // Additional text to append to the year in the month headers
        -	};
        -	this._defaults = { // Global defaults for all the date picker instances
        -		showOn: "focus", // "focus" for popup on focus,
        -			// "button" for trigger button, or "both" for either
        -		showAnim: "fadeIn", // Name of jQuery animation for popup
        -		showOptions: {}, // Options for enhanced animations
        -		defaultDate: null, // Used when field is blank: actual date,
        -			// +/-number for offset from today, null for today
        -		appendText: "", // Display text following the input box, e.g. showing the format
        -		buttonText: "...", // Text for trigger button
        -		buttonImage: "", // URL for trigger button image
        -		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
        -		hideIfNoPrevNext: false, // True to hide next/previous month links
        -			// if not applicable, false to just disable them
        -		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
        -		gotoCurrent: false, // True if today link goes back to current selection instead
        -		changeMonth: false, // True if month can be selected directly, false if only prev/next
        -		changeYear: false, // True if year can be selected directly, false if only prev/next
        -		yearRange: "c-10:c+10", // Range of years to display in drop-down,
        -			// either relative to today's year (-nn:+nn), relative to currently displayed year
        -			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
        -		showOtherMonths: false, // True to show dates in other months, false to leave blank
        -		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
        -		showWeek: false, // True to show week of the year, false to not show it
        -		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
        -			// takes a Date and returns the number of the week for it
        -		shortYearCutoff: "+10", // Short year values < this are in the current century,
        -			// > this are in the previous century,
        -			// string value starting with "+" for current year + value
        -		minDate: null, // The earliest selectable date, or null for no limit
        -		maxDate: null, // The latest selectable date, or null for no limit
        -		duration: "fast", // Duration of display/closure
        -		beforeShowDay: null, // Function that takes a date and returns an array with
        -			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
        -			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
        -		beforeShow: null, // Function that takes an input field and
        -			// returns a set of custom settings for the date picker
        -		onSelect: null, // Define a callback function when a date is selected
        -		onChangeMonthYear: null, // Define a callback function when the month or year is changed
        -		onClose: null, // Define a callback function when the datepicker is closed
        -		numberOfMonths: 1, // Number of months to show at a time
        -		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
        -		stepMonths: 1, // Number of months to step back/forward
        -		stepBigMonths: 12, // Number of months to step back/forward for the big links
        -		altField: "", // Selector for an alternate field to store selected dates into
        -		altFormat: "", // The date format to use for the alternate field
        -		constrainInput: true, // The input is constrained by the current date format
        -		showButtonPanel: false, // True to show button panel, false to not show it
        -		autoSize: false, // True to size the input for the date format, false to leave as is
        -		disabled: false // The initial disabled state
        -	};
        -	$.extend(this._defaults, this.regional[""]);
        -	this.regional.en = $.extend( true, {}, this.regional[ "" ]);
        -	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
        -	this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
        -}
        -
        -$.extend(Datepicker.prototype, {
        -	/* Class name added to elements to indicate already configured with a date picker. */
        -	markerClassName: "hasDatepicker",
        -
        -	//Keep track of the maximum number of rows displayed (see #7043)
        -	maxRows: 4,
        -
        -	// TODO rename to "widget" when switching to widget factory
        -	_widgetDatepicker: function() {
        -		return this.dpDiv;
        -	},
        -
        -	/* Override the default settings for all instances of the date picker.
        -	 * @param  settings  object - the new settings to use as defaults (anonymous object)
        -	 * @return the manager object
        -	 */
        -	setDefaults: function(settings) {
        -		datepicker_extendRemove(this._defaults, settings || {});
        -		return this;
        -	},
        -
        -	/* Attach the date picker to a jQuery selection.
        -	 * @param  target	element - the target input field or division or span
        -	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
        -	 */
        -	_attachDatepicker: function(target, settings) {
        -		var nodeName, inline, inst;
        -		nodeName = target.nodeName.toLowerCase();
        -		inline = (nodeName === "div" || nodeName === "span");
        -		if (!target.id) {
        -			this.uuid += 1;
        -			target.id = "dp" + this.uuid;
        -		}
        -		inst = this._newInst($(target), inline);
        -		inst.settings = $.extend({}, settings || {});
        -		if (nodeName === "input") {
        -			this._connectDatepicker(target, inst);
        -		} else if (inline) {
        -			this._inlineDatepicker(target, inst);
        -		}
        -	},
        -
        -	/* Create a new instance object. */
        -	_newInst: function(target, inline) {
        -		var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
        -		return {id: id, input: target, // associated target
        -			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
        -			drawMonth: 0, drawYear: 0, // month being drawn
        -			inline: inline, // is datepicker inline or not
        -			dpDiv: (!inline ? this.dpDiv : // presentation div
        -			datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
        -	},
        -
        -	/* Attach the date picker to an input field. */
        -	_connectDatepicker: function(target, inst) {
        -		var input = $(target);
        -		inst.append = $([]);
        -		inst.trigger = $([]);
        -		if (input.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -		this._attachments(input, inst);
        -		input.addClass(this.markerClassName).keydown(this._doKeyDown).
        -			keypress(this._doKeyPress).keyup(this._doKeyUp);
        -		this._autoSize(inst);
        -		$.data(target, "datepicker", inst);
        -		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
        -		if( inst.settings.disabled ) {
        -			this._disableDatepicker( target );
        -		}
        -	},
        -
        -	/* Make attachments based on settings. */
        -	_attachments: function(input, inst) {
        -		var showOn, buttonText, buttonImage,
        -			appendText = this._get(inst, "appendText"),
        -			isRTL = this._get(inst, "isRTL");
        -
        -		if (inst.append) {
        -			inst.append.remove();
        -		}
        -		if (appendText) {
        -			inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
        -			input[isRTL ? "before" : "after"](inst.append);
        -		}
        -
        -		input.unbind("focus", this._showDatepicker);
        -
        -		if (inst.trigger) {
        -			inst.trigger.remove();
        -		}
        -
        -		showOn = this._get(inst, "showOn");
        -		if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
        -			input.focus(this._showDatepicker);
        -		}
        -		if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
        -			buttonText = this._get(inst, "buttonText");
        -			buttonImage = this._get(inst, "buttonImage");
        -			inst.trigger = $(this._get(inst, "buttonImageOnly") ?
        -				$("<img/>").addClass(this._triggerClass).
        -					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
        -				$("<button type='button'></button>").addClass(this._triggerClass).
        -					html(!buttonImage ? buttonText : $("<img/>").attr(
        -					{ src:buttonImage, alt:buttonText, title:buttonText })));
        -			input[isRTL ? "before" : "after"](inst.trigger);
        -			inst.trigger.click(function() {
        -				if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
        -					$.datepicker._hideDatepicker();
        -				} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
        -					$.datepicker._hideDatepicker();
        -					$.datepicker._showDatepicker(input[0]);
        -				} else {
        -					$.datepicker._showDatepicker(input[0]);
        -				}
        -				return false;
        -			});
        -		}
        -	},
        -
        -	/* Apply the maximum length for the date format. */
        -	_autoSize: function(inst) {
        -		if (this._get(inst, "autoSize") && !inst.inline) {
        -			var findMax, max, maxI, i,
        -				date = new Date(2009, 12 - 1, 20), // Ensure double digits
        -				dateFormat = this._get(inst, "dateFormat");
        -
        -			if (dateFormat.match(/[DM]/)) {
        -				findMax = function(names) {
        -					max = 0;
        -					maxI = 0;
        -					for (i = 0; i < names.length; i++) {
        -						if (names[i].length > max) {
        -							max = names[i].length;
        -							maxI = i;
        -						}
        -					}
        -					return maxI;
        -				};
        -				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
        -					"monthNames" : "monthNamesShort"))));
        -				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
        -					"dayNames" : "dayNamesShort"))) + 20 - date.getDay());
        -			}
        -			inst.input.attr("size", this._formatDate(inst, date).length);
        -		}
        -	},
        -
        -	/* Attach an inline date picker to a div. */
        -	_inlineDatepicker: function(target, inst) {
        -		var divSpan = $(target);
        -		if (divSpan.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -		divSpan.addClass(this.markerClassName).append(inst.dpDiv);
        -		$.data(target, "datepicker", inst);
        -		this._setDate(inst, this._getDefaultDate(inst), true);
        -		this._updateDatepicker(inst);
        -		this._updateAlternate(inst);
        -		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
        -		if( inst.settings.disabled ) {
        -			this._disableDatepicker( target );
        -		}
        -		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
        -		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
        -		inst.dpDiv.css( "display", "block" );
        -	},
        -
        -	/* Pop-up the date picker in a "dialog" box.
        -	 * @param  input element - ignored
        -	 * @param  date	string or Date - the initial date to display
        -	 * @param  onSelect  function - the function to call when a date is selected
        -	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
        -	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
        -	 *					event - with x/y coordinates or
        -	 *					leave empty for default (screen centre)
        -	 * @return the manager object
        -	 */
        -	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
        -		var id, browserWidth, browserHeight, scrollX, scrollY,
        -			inst = this._dialogInst; // internal instance
        -
        -		if (!inst) {
        -			this.uuid += 1;
        -			id = "dp" + this.uuid;
        -			this._dialogInput = $("<input type='text' id='" + id +
        -				"' style='position: absolute; top: -100px; width: 0px;'/>");
        -			this._dialogInput.keydown(this._doKeyDown);
        -			$("body").append(this._dialogInput);
        -			inst = this._dialogInst = this._newInst(this._dialogInput, false);
        -			inst.settings = {};
        -			$.data(this._dialogInput[0], "datepicker", inst);
        -		}
        -		datepicker_extendRemove(inst.settings, settings || {});
        -		date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
        -		this._dialogInput.val(date);
        -
        -		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
        -		if (!this._pos) {
        -			browserWidth = document.documentElement.clientWidth;
        -			browserHeight = document.documentElement.clientHeight;
        -			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
        -			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
        -			this._pos = // should use actual width/height below
        -				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
        -		}
        -
        -		// move input on screen for focus, but hidden behind dialog
        -		this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
        -		inst.settings.onSelect = onSelect;
        -		this._inDialog = true;
        -		this.dpDiv.addClass(this._dialogClass);
        -		this._showDatepicker(this._dialogInput[0]);
        -		if ($.blockUI) {
        -			$.blockUI(this.dpDiv);
        -		}
        -		$.data(this._dialogInput[0], "datepicker", inst);
        -		return this;
        -	},
        -
        -	/* Detach a datepicker from its control.
        -	 * @param  target	element - the target input field or division or span
        -	 */
        -	_destroyDatepicker: function(target) {
        -		var nodeName,
        -			$target = $(target),
        -			inst = $.data(target, "datepicker");
        -
        -		if (!$target.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -
        -		nodeName = target.nodeName.toLowerCase();
        -		$.removeData(target, "datepicker");
        -		if (nodeName === "input") {
        -			inst.append.remove();
        -			inst.trigger.remove();
        -			$target.removeClass(this.markerClassName).
        -				unbind("focus", this._showDatepicker).
        -				unbind("keydown", this._doKeyDown).
        -				unbind("keypress", this._doKeyPress).
        -				unbind("keyup", this._doKeyUp);
        -		} else if (nodeName === "div" || nodeName === "span") {
        -			$target.removeClass(this.markerClassName).empty();
        -		}
        -
        -		if ( datepicker_instActive === inst ) {
        -			datepicker_instActive = null;
        -		}
        -	},
        -
        -	/* Enable the date picker to a jQuery selection.
        -	 * @param  target	element - the target input field or division or span
        -	 */
        -	_enableDatepicker: function(target) {
        -		var nodeName, inline,
        -			$target = $(target),
        -			inst = $.data(target, "datepicker");
        -
        -		if (!$target.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -
        -		nodeName = target.nodeName.toLowerCase();
        -		if (nodeName === "input") {
        -			target.disabled = false;
        -			inst.trigger.filter("button").
        -				each(function() { this.disabled = false; }).end().
        -				filter("img").css({opacity: "1.0", cursor: ""});
        -		} else if (nodeName === "div" || nodeName === "span") {
        -			inline = $target.children("." + this._inlineClass);
        -			inline.children().removeClass("ui-state-disabled");
        -			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
        -				prop("disabled", false);
        -		}
        -		this._disabledInputs = $.map(this._disabledInputs,
        -			function(value) { return (value === target ? null : value); }); // delete entry
        -	},
        -
        -	/* Disable the date picker to a jQuery selection.
        -	 * @param  target	element - the target input field or division or span
        -	 */
        -	_disableDatepicker: function(target) {
        -		var nodeName, inline,
        -			$target = $(target),
        -			inst = $.data(target, "datepicker");
        -
        -		if (!$target.hasClass(this.markerClassName)) {
        -			return;
        -		}
        -
        -		nodeName = target.nodeName.toLowerCase();
        -		if (nodeName === "input") {
        -			target.disabled = true;
        -			inst.trigger.filter("button").
        -				each(function() { this.disabled = true; }).end().
        -				filter("img").css({opacity: "0.5", cursor: "default"});
        -		} else if (nodeName === "div" || nodeName === "span") {
        -			inline = $target.children("." + this._inlineClass);
        -			inline.children().addClass("ui-state-disabled");
        -			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
        -				prop("disabled", true);
        -		}
        -		this._disabledInputs = $.map(this._disabledInputs,
        -			function(value) { return (value === target ? null : value); }); // delete entry
        -		this._disabledInputs[this._disabledInputs.length] = target;
        -	},
        -
        -	/* Is the first field in a jQuery collection disabled as a datepicker?
        -	 * @param  target	element - the target input field or division or span
        -	 * @return boolean - true if disabled, false if enabled
        -	 */
        -	_isDisabledDatepicker: function(target) {
        -		if (!target) {
        -			return false;
        -		}
        -		for (var i = 0; i < this._disabledInputs.length; i++) {
        -			if (this._disabledInputs[i] === target) {
        -				return true;
        -			}
        -		}
        -		return false;
        -	},
        -
        -	/* Retrieve the instance data for the target control.
        -	 * @param  target  element - the target input field or division or span
        -	 * @return  object - the associated instance data
        -	 * @throws  error if a jQuery problem getting data
        -	 */
        -	_getInst: function(target) {
        -		try {
        -			return $.data(target, "datepicker");
        -		}
        -		catch (err) {
        -			throw "Missing instance data for this datepicker";
        -		}
        -	},
        -
        -	/* Update or retrieve the settings for a date picker attached to an input field or division.
        -	 * @param  target  element - the target input field or division or span
        -	 * @param  name	object - the new settings to update or
        -	 *				string - the name of the setting to change or retrieve,
        -	 *				when retrieving also "all" for all instance settings or
        -	 *				"defaults" for all global defaults
        -	 * @param  value   any - the new value for the setting
        -	 *				(omit if above is an object or to retrieve a value)
        -	 */
        -	_optionDatepicker: function(target, name, value) {
        -		var settings, date, minDate, maxDate,
        -			inst = this._getInst(target);
        -
        -		if (arguments.length === 2 && typeof name === "string") {
        -			return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
        -				(inst ? (name === "all" ? $.extend({}, inst.settings) :
        -				this._get(inst, name)) : null));
        -		}
        -
        -		settings = name || {};
        -		if (typeof name === "string") {
        -			settings = {};
        -			settings[name] = value;
        -		}
        -
        -		if (inst) {
        -			if (this._curInst === inst) {
        -				this._hideDatepicker();
        -			}
        -
        -			date = this._getDateDatepicker(target, true);
        -			minDate = this._getMinMaxDate(inst, "min");
        -			maxDate = this._getMinMaxDate(inst, "max");
        -			datepicker_extendRemove(inst.settings, settings);
        -			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
        -			if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
        -				inst.settings.minDate = this._formatDate(inst, minDate);
        -			}
        -			if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
        -				inst.settings.maxDate = this._formatDate(inst, maxDate);
        -			}
        -			if ( "disabled" in settings ) {
        -				if ( settings.disabled ) {
        -					this._disableDatepicker(target);
        -				} else {
        -					this._enableDatepicker(target);
        -				}
        -			}
        -			this._attachments($(target), inst);
        -			this._autoSize(inst);
        -			this._setDate(inst, date);
        -			this._updateAlternate(inst);
        -			this._updateDatepicker(inst);
        -		}
        -	},
        -
        -	// change method deprecated
        -	_changeDatepicker: function(target, name, value) {
        -		this._optionDatepicker(target, name, value);
        -	},
        -
        -	/* Redraw the date picker attached to an input field or division.
        -	 * @param  target  element - the target input field or division or span
        -	 */
        -	_refreshDatepicker: function(target) {
        -		var inst = this._getInst(target);
        -		if (inst) {
        -			this._updateDatepicker(inst);
        -		}
        -	},
        -
        -	/* Set the dates for a jQuery selection.
        -	 * @param  target element - the target input field or division or span
        -	 * @param  date	Date - the new date
        -	 */
        -	_setDateDatepicker: function(target, date) {
        -		var inst = this._getInst(target);
        -		if (inst) {
        -			this._setDate(inst, date);
        -			this._updateDatepicker(inst);
        -			this._updateAlternate(inst);
        -		}
        -	},
        -
        -	/* Get the date(s) for the first entry in a jQuery selection.
        -	 * @param  target element - the target input field or division or span
        -	 * @param  noDefault boolean - true if no default date is to be used
        -	 * @return Date - the current date
        -	 */
        -	_getDateDatepicker: function(target, noDefault) {
        -		var inst = this._getInst(target);
        -		if (inst && !inst.inline) {
        -			this._setDateFromField(inst, noDefault);
        -		}
        -		return (inst ? this._getDate(inst) : null);
        -	},
        -
        -	/* Handle keystrokes. */
        -	_doKeyDown: function(event) {
        -		var onSelect, dateStr, sel,
        -			inst = $.datepicker._getInst(event.target),
        -			handled = true,
        -			isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
        -
        -		inst._keyEvent = true;
        -		if ($.datepicker._datepickerShowing) {
        -			switch (event.keyCode) {
        -				case 9: $.datepicker._hideDatepicker();
        -						handled = false;
        -						break; // hide on tab out
        -				case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
        -									$.datepicker._currentClass + ")", inst.dpDiv);
        -						if (sel[0]) {
        -							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
        -						}
        -
        -						onSelect = $.datepicker._get(inst, "onSelect");
        -						if (onSelect) {
        -							dateStr = $.datepicker._formatDate(inst);
        -
        -							// trigger custom callback
        -							onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
        -						} else {
        -							$.datepicker._hideDatepicker();
        -						}
        -
        -						return false; // don't submit the form
        -				case 27: $.datepicker._hideDatepicker();
        -						break; // hide on escape
        -				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -							-$.datepicker._get(inst, "stepBigMonths") :
        -							-$.datepicker._get(inst, "stepMonths")), "M");
        -						break; // previous month/year on page up/+ ctrl
        -				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -							+$.datepicker._get(inst, "stepBigMonths") :
        -							+$.datepicker._get(inst, "stepMonths")), "M");
        -						break; // next month/year on page down/+ ctrl
        -				case 35: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._clearDate(event.target);
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // clear on ctrl or command +end
        -				case 36: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._gotoToday(event.target);
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // current on ctrl or command +home
        -				case 37: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						// -1 day on ctrl or command +left
        -						if (event.originalEvent.altKey) {
        -							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -								-$.datepicker._get(inst, "stepBigMonths") :
        -								-$.datepicker._get(inst, "stepMonths")), "M");
        -						}
        -						// next month/year on alt +left on Mac
        -						break;
        -				case 38: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, -7, "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // -1 week on ctrl or command +up
        -				case 39: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						// +1 day on ctrl or command +right
        -						if (event.originalEvent.altKey) {
        -							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
        -								+$.datepicker._get(inst, "stepBigMonths") :
        -								+$.datepicker._get(inst, "stepMonths")), "M");
        -						}
        -						// next month/year on alt +right
        -						break;
        -				case 40: if (event.ctrlKey || event.metaKey) {
        -							$.datepicker._adjustDate(event.target, +7, "D");
        -						}
        -						handled = event.ctrlKey || event.metaKey;
        -						break; // +1 week on ctrl or command +down
        -				default: handled = false;
        -			}
        -		} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
        -			$.datepicker._showDatepicker(this);
        -		} else {
        -			handled = false;
        -		}
        -
        -		if (handled) {
        -			event.preventDefault();
        -			event.stopPropagation();
        -		}
        -	},
        -
        -	/* Filter entered characters - based on date format. */
        -	_doKeyPress: function(event) {
        -		var chars, chr,
        -			inst = $.datepicker._getInst(event.target);
        -
        -		if ($.datepicker._get(inst, "constrainInput")) {
        -			chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
        -			chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
        -			return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
        -		}
        -	},
        -
        -	/* Synchronise manual entry and field/alternate field. */
        -	_doKeyUp: function(event) {
        -		var date,
        -			inst = $.datepicker._getInst(event.target);
        -
        -		if (inst.input.val() !== inst.lastVal) {
        -			try {
        -				date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
        -					(inst.input ? inst.input.val() : null),
        -					$.datepicker._getFormatConfig(inst));
        -
        -				if (date) { // only if valid
        -					$.datepicker._setDateFromField(inst);
        -					$.datepicker._updateAlternate(inst);
        -					$.datepicker._updateDatepicker(inst);
        -				}
        -			}
        -			catch (err) {
        -			}
        -		}
        -		return true;
        -	},
        -
        -	/* Pop-up the date picker for a given input field.
        -	 * If false returned from beforeShow event handler do not show.
        -	 * @param  input  element - the input field attached to the date picker or
        -	 *					event - if triggered by focus
        -	 */
        -	_showDatepicker: function(input) {
        -		input = input.target || input;
        -		if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
        -			input = $("input", input.parentNode)[0];
        -		}
        -
        -		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
        -			return;
        -		}
        -
        -		var inst, beforeShow, beforeShowSettings, isFixed,
        -			offset, showAnim, duration;
        -
        -		inst = $.datepicker._getInst(input);
        -		if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
        -			$.datepicker._curInst.dpDiv.stop(true, true);
        -			if ( inst && $.datepicker._datepickerShowing ) {
        -				$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
        -			}
        -		}
        -
        -		beforeShow = $.datepicker._get(inst, "beforeShow");
        -		beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
        -		if(beforeShowSettings === false){
        -			return;
        -		}
        -		datepicker_extendRemove(inst.settings, beforeShowSettings);
        -
        -		inst.lastVal = null;
        -		$.datepicker._lastInput = input;
        -		$.datepicker._setDateFromField(inst);
        -
        -		if ($.datepicker._inDialog) { // hide cursor
        -			input.value = "";
        -		}
        -		if (!$.datepicker._pos) { // position below input
        -			$.datepicker._pos = $.datepicker._findPos(input);
        -			$.datepicker._pos[1] += input.offsetHeight; // add the height
        -		}
        -
        -		isFixed = false;
        -		$(input).parents().each(function() {
        -			isFixed |= $(this).css("position") === "fixed";
        -			return !isFixed;
        -		});
        -
        -		offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
        -		$.datepicker._pos = null;
        -		//to avoid flashes on Firefox
        -		inst.dpDiv.empty();
        -		// determine sizing offscreen
        -		inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
        -		$.datepicker._updateDatepicker(inst);
        -		// fix width for dynamic number of date pickers
        -		// and adjust position before showing
        -		offset = $.datepicker._checkOffset(inst, offset, isFixed);
        -		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
        -			"static" : (isFixed ? "fixed" : "absolute")), display: "none",
        -			left: offset.left + "px", top: offset.top + "px"});
        -
        -		if (!inst.inline) {
        -			showAnim = $.datepicker._get(inst, "showAnim");
        -			duration = $.datepicker._get(inst, "duration");
        -			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
        -			$.datepicker._datepickerShowing = true;
        -
        -			if ( $.effects && $.effects.effect[ showAnim ] ) {
        -				inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
        -			} else {
        -				inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
        -			}
        -
        -			if ( $.datepicker._shouldFocusInput( inst ) ) {
        -				inst.input.focus();
        -			}
        -
        -			$.datepicker._curInst = inst;
        -		}
        -	},
        -
        -	/* Generate the date picker content. */
        -	_updateDatepicker: function(inst) {
        -		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
        -		datepicker_instActive = inst; // for delegate hover events
        -		inst.dpDiv.empty().append(this._generateHTML(inst));
        -		this._attachHandlers(inst);
        -
        -		var origyearshtml,
        -			numMonths = this._getNumberOfMonths(inst),
        -			cols = numMonths[1],
        -			width = 17,
        -			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
        -
        -		if ( activeCell.length > 0 ) {
        -			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
        -		}
        -
        -		inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
        -		if (cols > 1) {
        -			inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
        -		}
        -		inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
        -			"Class"]("ui-datepicker-multi");
        -		inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
        -			"Class"]("ui-datepicker-rtl");
        -
        -		if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
        -			inst.input.focus();
        -		}
        -
        -		// deffered render of the years select (to avoid flashes on Firefox)
        -		if( inst.yearshtml ){
        -			origyearshtml = inst.yearshtml;
        -			setTimeout(function(){
        -				//assure that inst.yearshtml didn't change.
        -				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
        -					inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
        -				}
        -				origyearshtml = inst.yearshtml = null;
        -			}, 0);
        -		}
        -	},
        -
        -	// #6694 - don't focus the input if it's already focused
        -	// this breaks the change event in IE
        -	// Support: IE and jQuery <1.9
        -	_shouldFocusInput: function( inst ) {
        -		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
        -	},
        -
        -	/* Check positioning to remain on screen. */
        -	_checkOffset: function(inst, offset, isFixed) {
        -		var dpWidth = inst.dpDiv.outerWidth(),
        -			dpHeight = inst.dpDiv.outerHeight(),
        -			inputWidth = inst.input ? inst.input.outerWidth() : 0,
        -			inputHeight = inst.input ? inst.input.outerHeight() : 0,
        -			viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
        -			viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
        -
        -		offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
        -		offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
        -		offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
        -
        -		// now check if datepicker is showing outside window viewport - move to a better place if so.
        -		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
        -			Math.abs(offset.left + dpWidth - viewWidth) : 0);
        -		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
        -			Math.abs(dpHeight + inputHeight) : 0);
        -
        -		return offset;
        -	},
        -
        -	/* Find an object's position on the screen. */
        -	_findPos: function(obj) {
        -		var position,
        -			inst = this._getInst(obj),
        -			isRTL = this._get(inst, "isRTL");
        -
        -		while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
        -			obj = obj[isRTL ? "previousSibling" : "nextSibling"];
        -		}
        -
        -		position = $(obj).offset();
        -		return [position.left, position.top];
        -	},
        -
        -	/* Hide the date picker from view.
        -	 * @param  input  element - the input field attached to the date picker
        -	 */
        -	_hideDatepicker: function(input) {
        -		var showAnim, duration, postProcess, onClose,
        -			inst = this._curInst;
        -
        -		if (!inst || (input && inst !== $.data(input, "datepicker"))) {
        -			return;
        -		}
        -
        -		if (this._datepickerShowing) {
        -			showAnim = this._get(inst, "showAnim");
        -			duration = this._get(inst, "duration");
        -			postProcess = function() {
        -				$.datepicker._tidyDialog(inst);
        -			};
        -
        -			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
        -			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
        -				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
        -			} else {
        -				inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
        -					(showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
        -			}
        -
        -			if (!showAnim) {
        -				postProcess();
        -			}
        -			this._datepickerShowing = false;
        -
        -			onClose = this._get(inst, "onClose");
        -			if (onClose) {
        -				onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
        -			}
        -
        -			this._lastInput = null;
        -			if (this._inDialog) {
        -				this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
        -				if ($.blockUI) {
        -					$.unblockUI();
        -					$("body").append(this.dpDiv);
        -				}
        -			}
        -			this._inDialog = false;
        -		}
        -	},
        -
        -	/* Tidy up after a dialog display. */
        -	_tidyDialog: function(inst) {
        -		inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
        -	},
        -
        -	/* Close date picker if clicked elsewhere. */
        -	_checkExternalClick: function(event) {
        -		if (!$.datepicker._curInst) {
        -			return;
        -		}
        -
        -		var $target = $(event.target),
        -			inst = $.datepicker._getInst($target[0]);
        -
        -		if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
        -				$target.parents("#" + $.datepicker._mainDivId).length === 0 &&
        -				!$target.hasClass($.datepicker.markerClassName) &&
        -				!$target.closest("." + $.datepicker._triggerClass).length &&
        -				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
        -			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
        -				$.datepicker._hideDatepicker();
        -		}
        -	},
        -
        -	/* Adjust one of the date sub-fields. */
        -	_adjustDate: function(id, offset, period) {
        -		var target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		if (this._isDisabledDatepicker(target[0])) {
        -			return;
        -		}
        -		this._adjustInstDate(inst, offset +
        -			(period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
        -			period);
        -		this._updateDatepicker(inst);
        -	},
        -
        -	/* Action for current link. */
        -	_gotoToday: function(id) {
        -		var date,
        -			target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		if (this._get(inst, "gotoCurrent") && inst.currentDay) {
        -			inst.selectedDay = inst.currentDay;
        -			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
        -			inst.drawYear = inst.selectedYear = inst.currentYear;
        -		} else {
        -			date = new Date();
        -			inst.selectedDay = date.getDate();
        -			inst.drawMonth = inst.selectedMonth = date.getMonth();
        -			inst.drawYear = inst.selectedYear = date.getFullYear();
        -		}
        -		this._notifyChange(inst);
        -		this._adjustDate(target);
        -	},
        -
        -	/* Action for selecting a new month/year. */
        -	_selectMonthYear: function(id, select, period) {
        -		var target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		inst["selected" + (period === "M" ? "Month" : "Year")] =
        -		inst["draw" + (period === "M" ? "Month" : "Year")] =
        -			parseInt(select.options[select.selectedIndex].value,10);
        -
        -		this._notifyChange(inst);
        -		this._adjustDate(target);
        -	},
        -
        -	/* Action for selecting a day. */
        -	_selectDay: function(id, month, year, td) {
        -		var inst,
        -			target = $(id);
        -
        -		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
        -			return;
        -		}
        -
        -		inst = this._getInst(target[0]);
        -		inst.selectedDay = inst.currentDay = $("a", td).html();
        -		inst.selectedMonth = inst.currentMonth = month;
        -		inst.selectedYear = inst.currentYear = year;
        -		this._selectDate(id, this._formatDate(inst,
        -			inst.currentDay, inst.currentMonth, inst.currentYear));
        -	},
        -
        -	/* Erase the input field and hide the date picker. */
        -	_clearDate: function(id) {
        -		var target = $(id);
        -		this._selectDate(target, "");
        -	},
        -
        -	/* Update the input field with the selected date. */
        -	_selectDate: function(id, dateStr) {
        -		var onSelect,
        -			target = $(id),
        -			inst = this._getInst(target[0]);
        -
        -		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
        -		if (inst.input) {
        -			inst.input.val(dateStr);
        -		}
        -		this._updateAlternate(inst);
        -
        -		onSelect = this._get(inst, "onSelect");
        -		if (onSelect) {
        -			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
        -		} else if (inst.input) {
        -			inst.input.trigger("change"); // fire the change event
        -		}
        -
        -		if (inst.inline){
        -			this._updateDatepicker(inst);
        -		} else {
        -			this._hideDatepicker();
        -			this._lastInput = inst.input[0];
        -			if (typeof(inst.input[0]) !== "object") {
        -				inst.input.focus(); // restore focus
        -			}
        -			this._lastInput = null;
        -		}
        -	},
        -
        -	/* Update any alternate field to synchronise with the main field. */
        -	_updateAlternate: function(inst) {
        -		var altFormat, date, dateStr,
        -			altField = this._get(inst, "altField");
        -
        -		if (altField) { // update alternate field too
        -			altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
        -			date = this._getDate(inst);
        -			dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
        -			$(altField).each(function() { $(this).val(dateStr); });
        -		}
        -	},
        -
        -	/* Set as beforeShowDay function to prevent selection of weekends.
        -	 * @param  date  Date - the date to customise
        -	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
        -	 */
        -	noWeekends: function(date) {
        -		var day = date.getDay();
        -		return [(day > 0 && day < 6), ""];
        -	},
        -
        -	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
        -	 * @param  date  Date - the date to get the week for
        -	 * @return  number - the number of the week within the year that contains this date
        -	 */
        -	iso8601Week: function(date) {
        -		var time,
        -			checkDate = new Date(date.getTime());
        -
        -		// Find Thursday of this week starting on Monday
        -		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
        -
        -		time = checkDate.getTime();
        -		checkDate.setMonth(0); // Compare with Jan 1
        -		checkDate.setDate(1);
        -		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
        -	},
        -
        -	/* Parse a string value into a date object.
        -	 * See formatDate below for the possible formats.
        -	 *
        -	 * @param  format string - the expected format of the date
        -	 * @param  value string - the date in the above format
        -	 * @param  settings Object - attributes include:
        -	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
        -	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        -	 *					dayNames		string[7] - names of the days from Sunday (optional)
        -	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        -	 *					monthNames		string[12] - names of the months (optional)
        -	 * @return  Date - the extracted date value or null if value is blank
        -	 */
        -	parseDate: function (format, value, settings) {
        -		if (format == null || value == null) {
        -			throw "Invalid arguments";
        -		}
        -
        -		value = (typeof value === "object" ? value.toString() : value + "");
        -		if (value === "") {
        -			return null;
        -		}
        -
        -		var iFormat, dim, extra,
        -			iValue = 0,
        -			shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
        -			shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
        -				new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
        -			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
        -			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
        -			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
        -			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
        -			year = -1,
        -			month = -1,
        -			day = -1,
        -			doy = -1,
        -			literal = false,
        -			date,
        -			// Check whether a format character is doubled
        -			lookAhead = function(match) {
        -				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
        -				if (matches) {
        -					iFormat++;
        -				}
        -				return matches;
        -			},
        -			// Extract a number from the string value
        -			getNumber = function(match) {
        -				var isDoubled = lookAhead(match),
        -					size = (match === "@" ? 14 : (match === "!" ? 20 :
        -					(match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
        -					minSize = (match === "y" ? size : 1),
        -					digits = new RegExp("^\\d{" + minSize + "," + size + "}"),
        -					num = value.substring(iValue).match(digits);
        -				if (!num) {
        -					throw "Missing number at position " + iValue;
        -				}
        -				iValue += num[0].length;
        -				return parseInt(num[0], 10);
        -			},
        -			// Extract a name from the string value and convert to an index
        -			getName = function(match, shortNames, longNames) {
        -				var index = -1,
        -					names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
        -						return [ [k, v] ];
        -					}).sort(function (a, b) {
        -						return -(a[1].length - b[1].length);
        -					});
        -
        -				$.each(names, function (i, pair) {
        -					var name = pair[1];
        -					if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
        -						index = pair[0];
        -						iValue += name.length;
        -						return false;
        -					}
        -				});
        -				if (index !== -1) {
        -					return index + 1;
        -				} else {
        -					throw "Unknown name at position " + iValue;
        -				}
        -			},
        -			// Confirm that a literal character matches the string value
        -			checkLiteral = function() {
        -				if (value.charAt(iValue) !== format.charAt(iFormat)) {
        -					throw "Unexpected literal at position " + iValue;
        -				}
        -				iValue++;
        -			};
        -
        -		for (iFormat = 0; iFormat < format.length; iFormat++) {
        -			if (literal) {
        -				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
        -					literal = false;
        -				} else {
        -					checkLiteral();
        -				}
        -			} else {
        -				switch (format.charAt(iFormat)) {
        -					case "d":
        -						day = getNumber("d");
        -						break;
        -					case "D":
        -						getName("D", dayNamesShort, dayNames);
        -						break;
        -					case "o":
        -						doy = getNumber("o");
        -						break;
        -					case "m":
        -						month = getNumber("m");
        -						break;
        -					case "M":
        -						month = getName("M", monthNamesShort, monthNames);
        -						break;
        -					case "y":
        -						year = getNumber("y");
        -						break;
        -					case "@":
        -						date = new Date(getNumber("@"));
        -						year = date.getFullYear();
        -						month = date.getMonth() + 1;
        -						day = date.getDate();
        -						break;
        -					case "!":
        -						date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
        -						year = date.getFullYear();
        -						month = date.getMonth() + 1;
        -						day = date.getDate();
        -						break;
        -					case "'":
        -						if (lookAhead("'")){
        -							checkLiteral();
        -						} else {
        -							literal = true;
        -						}
        -						break;
        -					default:
        -						checkLiteral();
        -				}
        -			}
        -		}
        -
        -		if (iValue < value.length){
        -			extra = value.substr(iValue);
        -			if (!/^\s+/.test(extra)) {
        -				throw "Extra/unparsed characters found in date: " + extra;
        -			}
        -		}
        -
        -		if (year === -1) {
        -			year = new Date().getFullYear();
        -		} else if (year < 100) {
        -			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
        -				(year <= shortYearCutoff ? 0 : -100);
        -		}
        -
        -		if (doy > -1) {
        -			month = 1;
        -			day = doy;
        -			do {
        -				dim = this._getDaysInMonth(year, month - 1);
        -				if (day <= dim) {
        -					break;
        -				}
        -				month++;
        -				day -= dim;
        -			} while (true);
        -		}
        -
        -		date = this._daylightSavingAdjust(new Date(year, month - 1, day));
        -		if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
        -			throw "Invalid date"; // E.g. 31/02/00
        -		}
        -		return date;
        -	},
        -
        -	/* Standard date formats. */
        -	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
        -	COOKIE: "D, dd M yy",
        -	ISO_8601: "yy-mm-dd",
        -	RFC_822: "D, d M y",
        -	RFC_850: "DD, dd-M-y",
        -	RFC_1036: "D, d M y",
        -	RFC_1123: "D, d M yy",
        -	RFC_2822: "D, d M yy",
        -	RSS: "D, d M y", // RFC 822
        -	TICKS: "!",
        -	TIMESTAMP: "@",
        -	W3C: "yy-mm-dd", // ISO 8601
        -
        -	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
        -		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
        -
        -	/* Format a date object into a string value.
        -	 * The format can be combinations of the following:
        -	 * d  - day of month (no leading zero)
        -	 * dd - day of month (two digit)
        -	 * o  - day of year (no leading zeros)
        -	 * oo - day of year (three digit)
        -	 * D  - day name short
        -	 * DD - day name long
        -	 * m  - month of year (no leading zero)
        -	 * mm - month of year (two digit)
        -	 * M  - month name short
        -	 * MM - month name long
        -	 * y  - year (two digit)
        -	 * yy - year (four digit)
        -	 * @ - Unix timestamp (ms since 01/01/1970)
        -	 * ! - Windows ticks (100ns since 01/01/0001)
        -	 * "..." - literal text
        -	 * '' - single quote
        -	 *
        -	 * @param  format string - the desired format of the date
        -	 * @param  date Date - the date value to format
        -	 * @param  settings Object - attributes include:
        -	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
        -	 *					dayNames		string[7] - names of the days from Sunday (optional)
        -	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
        -	 *					monthNames		string[12] - names of the months (optional)
        -	 * @return  string - the date in the above format
        -	 */
        -	formatDate: function (format, date, settings) {
        -		if (!date) {
        -			return "";
        -		}
        -
        -		var iFormat,
        -			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
        -			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
        -			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
        -			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
        -			// Check whether a format character is doubled
        -			lookAhead = function(match) {
        -				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
        -				if (matches) {
        -					iFormat++;
        -				}
        -				return matches;
        -			},
        -			// Format a number, with leading zero if necessary
        -			formatNumber = function(match, value, len) {
        -				var num = "" + value;
        -				if (lookAhead(match)) {
        -					while (num.length < len) {
        -						num = "0" + num;
        -					}
        -				}
        -				return num;
        -			},
        -			// Format a name, short or long as requested
        -			formatName = function(match, value, shortNames, longNames) {
        -				return (lookAhead(match) ? longNames[value] : shortNames[value]);
        -			},
        -			output = "",
        -			literal = false;
        -
        -		if (date) {
        -			for (iFormat = 0; iFormat < format.length; iFormat++) {
        -				if (literal) {
        -					if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
        -						literal = false;
        -					} else {
        -						output += format.charAt(iFormat);
        -					}
        -				} else {
        -					switch (format.charAt(iFormat)) {
        -						case "d":
        -							output += formatNumber("d", date.getDate(), 2);
        -							break;
        -						case "D":
        -							output += formatName("D", date.getDay(), dayNamesShort, dayNames);
        -							break;
        -						case "o":
        -							output += formatNumber("o",
        -								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
        -							break;
        -						case "m":
        -							output += formatNumber("m", date.getMonth() + 1, 2);
        -							break;
        -						case "M":
        -							output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
        -							break;
        -						case "y":
        -							output += (lookAhead("y") ? date.getFullYear() :
        -								(date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
        -							break;
        -						case "@":
        -							output += date.getTime();
        -							break;
        -						case "!":
        -							output += date.getTime() * 10000 + this._ticksTo1970;
        -							break;
        -						case "'":
        -							if (lookAhead("'")) {
        -								output += "'";
        -							} else {
        -								literal = true;
        -							}
        -							break;
        -						default:
        -							output += format.charAt(iFormat);
        -					}
        -				}
        -			}
        -		}
        -		return output;
        -	},
        -
        -	/* Extract all possible characters from the date format. */
        -	_possibleChars: function (format) {
        -		var iFormat,
        -			chars = "",
        -			literal = false,
        -			// Check whether a format character is doubled
        -			lookAhead = function(match) {
        -				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
        -				if (matches) {
        -					iFormat++;
        -				}
        -				return matches;
        -			};
        -
        -		for (iFormat = 0; iFormat < format.length; iFormat++) {
        -			if (literal) {
        -				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
        -					literal = false;
        -				} else {
        -					chars += format.charAt(iFormat);
        -				}
        -			} else {
        -				switch (format.charAt(iFormat)) {
        -					case "d": case "m": case "y": case "@":
        -						chars += "0123456789";
        -						break;
        -					case "D": case "M":
        -						return null; // Accept anything
        -					case "'":
        -						if (lookAhead("'")) {
        -							chars += "'";
        -						} else {
        -							literal = true;
        -						}
        -						break;
        -					default:
        -						chars += format.charAt(iFormat);
        -				}
        -			}
        -		}
        -		return chars;
        -	},
        -
        -	/* Get a setting value, defaulting if necessary. */
        -	_get: function(inst, name) {
        -		return inst.settings[name] !== undefined ?
        -			inst.settings[name] : this._defaults[name];
        -	},
        -
        -	/* Parse existing date and initialise date picker. */
        -	_setDateFromField: function(inst, noDefault) {
        -		if (inst.input.val() === inst.lastVal) {
        -			return;
        -		}
        -
        -		var dateFormat = this._get(inst, "dateFormat"),
        -			dates = inst.lastVal = inst.input ? inst.input.val() : null,
        -			defaultDate = this._getDefaultDate(inst),
        -			date = defaultDate,
        -			settings = this._getFormatConfig(inst);
        -
        -		try {
        -			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
        -		} catch (event) {
        -			dates = (noDefault ? "" : dates);
        -		}
        -		inst.selectedDay = date.getDate();
        -		inst.drawMonth = inst.selectedMonth = date.getMonth();
        -		inst.drawYear = inst.selectedYear = date.getFullYear();
        -		inst.currentDay = (dates ? date.getDate() : 0);
        -		inst.currentMonth = (dates ? date.getMonth() : 0);
        -		inst.currentYear = (dates ? date.getFullYear() : 0);
        -		this._adjustInstDate(inst);
        -	},
        -
        -	/* Retrieve the default date shown on opening. */
        -	_getDefaultDate: function(inst) {
        -		return this._restrictMinMax(inst,
        -			this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
        -	},
        -
        -	/* A date may be specified as an exact value or a relative one. */
        -	_determineDate: function(inst, date, defaultDate) {
        -		var offsetNumeric = function(offset) {
        -				var date = new Date();
        -				date.setDate(date.getDate() + offset);
        -				return date;
        -			},
        -			offsetString = function(offset) {
        -				try {
        -					return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
        -						offset, $.datepicker._getFormatConfig(inst));
        -				}
        -				catch (e) {
        -					// Ignore
        -				}
        -
        -				var date = (offset.toLowerCase().match(/^c/) ?
        -					$.datepicker._getDate(inst) : null) || new Date(),
        -					year = date.getFullYear(),
        -					month = date.getMonth(),
        -					day = date.getDate(),
        -					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
        -					matches = pattern.exec(offset);
        -
        -				while (matches) {
        -					switch (matches[2] || "d") {
        -						case "d" : case "D" :
        -							day += parseInt(matches[1],10); break;
        -						case "w" : case "W" :
        -							day += parseInt(matches[1],10) * 7; break;
        -						case "m" : case "M" :
        -							month += parseInt(matches[1],10);
        -							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
        -							break;
        -						case "y": case "Y" :
        -							year += parseInt(matches[1],10);
        -							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
        -							break;
        -					}
        -					matches = pattern.exec(offset);
        -				}
        -				return new Date(year, month, day);
        -			},
        -			newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
        -				(typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
        -
        -		newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
        -		if (newDate) {
        -			newDate.setHours(0);
        -			newDate.setMinutes(0);
        -			newDate.setSeconds(0);
        -			newDate.setMilliseconds(0);
        -		}
        -		return this._daylightSavingAdjust(newDate);
        -	},
        -
        -	/* Handle switch to/from daylight saving.
        -	 * Hours may be non-zero on daylight saving cut-over:
        -	 * > 12 when midnight changeover, but then cannot generate
        -	 * midnight datetime, so jump to 1AM, otherwise reset.
        -	 * @param  date  (Date) the date to check
        -	 * @return  (Date) the corrected date
        -	 */
        -	_daylightSavingAdjust: function(date) {
        -		if (!date) {
        -			return null;
        -		}
        -		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
        -		return date;
        -	},
        -
        -	/* Set the date(s) directly. */
        -	_setDate: function(inst, date, noChange) {
        -		var clear = !date,
        -			origMonth = inst.selectedMonth,
        -			origYear = inst.selectedYear,
        -			newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
        -
        -		inst.selectedDay = inst.currentDay = newDate.getDate();
        -		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
        -		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
        -		if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
        -			this._notifyChange(inst);
        -		}
        -		this._adjustInstDate(inst);
        -		if (inst.input) {
        -			inst.input.val(clear ? "" : this._formatDate(inst));
        -		}
        -	},
        -
        -	/* Retrieve the date(s) directly. */
        -	_getDate: function(inst) {
        -		var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
        -			this._daylightSavingAdjust(new Date(
        -			inst.currentYear, inst.currentMonth, inst.currentDay)));
        -			return startDate;
        -	},
        -
        -	/* Attach the onxxx handlers.  These are declared statically so
        -	 * they work with static code transformers like Caja.
        -	 */
        -	_attachHandlers: function(inst) {
        -		var stepMonths = this._get(inst, "stepMonths"),
        -			id = "#" + inst.id.replace( /\\\\/g, "\\" );
        -		inst.dpDiv.find("[data-handler]").map(function () {
        -			var handler = {
        -				prev: function () {
        -					$.datepicker._adjustDate(id, -stepMonths, "M");
        -				},
        -				next: function () {
        -					$.datepicker._adjustDate(id, +stepMonths, "M");
        -				},
        -				hide: function () {
        -					$.datepicker._hideDatepicker();
        -				},
        -				today: function () {
        -					$.datepicker._gotoToday(id);
        -				},
        -				selectDay: function () {
        -					$.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
        -					return false;
        -				},
        -				selectMonth: function () {
        -					$.datepicker._selectMonthYear(id, this, "M");
        -					return false;
        -				},
        -				selectYear: function () {
        -					$.datepicker._selectMonthYear(id, this, "Y");
        -					return false;
        -				}
        -			};
        -			$(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
        -		});
        -	},
        -
        -	/* Generate the HTML for the current state of the date picker. */
        -	_generateHTML: function(inst) {
        -		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
        -			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
        -			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
        -			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
        -			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
        -			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
        -			tempDate = new Date(),
        -			today = this._daylightSavingAdjust(
        -				new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
        -			isRTL = this._get(inst, "isRTL"),
        -			showButtonPanel = this._get(inst, "showButtonPanel"),
        -			hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
        -			navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
        -			numMonths = this._getNumberOfMonths(inst),
        -			showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
        -			stepMonths = this._get(inst, "stepMonths"),
        -			isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
        -			currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
        -				new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
        -			minDate = this._getMinMaxDate(inst, "min"),
        -			maxDate = this._getMinMaxDate(inst, "max"),
        -			drawMonth = inst.drawMonth - showCurrentAtPos,
        -			drawYear = inst.drawYear;
        -
        -		if (drawMonth < 0) {
        -			drawMonth += 12;
        -			drawYear--;
        -		}
        -		if (maxDate) {
        -			maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
        -				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
        -			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
        -			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
        -				drawMonth--;
        -				if (drawMonth < 0) {
        -					drawMonth = 11;
        -					drawYear--;
        -				}
        -			}
        -		}
        -		inst.drawMonth = drawMonth;
        -		inst.drawYear = drawYear;
        -
        -		prevText = this._get(inst, "prevText");
        -		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
        -			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
        -			this._getFormatConfig(inst)));
        -
        -		prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
        -			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
        -			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
        -			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
        -
        -		nextText = this._get(inst, "nextText");
        -		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
        -			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
        -			this._getFormatConfig(inst)));
        -
        -		next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
        -			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
        -			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
        -			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
        -
        -		currentText = this._get(inst, "currentText");
        -		gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
        -		currentText = (!navigationAsDateFormat ? currentText :
        -			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
        -
        -		controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
        -			this._get(inst, "closeText") + "</button>" : "");
        -
        -		buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
        -			(this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
        -			">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
        -
        -		firstDay = parseInt(this._get(inst, "firstDay"),10);
        -		firstDay = (isNaN(firstDay) ? 0 : firstDay);
        -
        -		showWeek = this._get(inst, "showWeek");
        -		dayNames = this._get(inst, "dayNames");
        -		dayNamesMin = this._get(inst, "dayNamesMin");
        -		monthNames = this._get(inst, "monthNames");
        -		monthNamesShort = this._get(inst, "monthNamesShort");
        -		beforeShowDay = this._get(inst, "beforeShowDay");
        -		showOtherMonths = this._get(inst, "showOtherMonths");
        -		selectOtherMonths = this._get(inst, "selectOtherMonths");
        -		defaultDate = this._getDefaultDate(inst);
        -		html = "";
        -		dow;
        -		for (row = 0; row < numMonths[0]; row++) {
        -			group = "";
        -			this.maxRows = 4;
        -			for (col = 0; col < numMonths[1]; col++) {
        -				selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
        -				cornerClass = " ui-corner-all";
        -				calender = "";
        -				if (isMultiMonth) {
        -					calender += "<div class='ui-datepicker-group";
        -					if (numMonths[1] > 1) {
        -						switch (col) {
        -							case 0: calender += " ui-datepicker-group-first";
        -								cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
        -							case numMonths[1]-1: calender += " ui-datepicker-group-last";
        -								cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
        -							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
        -						}
        -					}
        -					calender += "'>";
        -				}
        -				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
        -					(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
        -					(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
        -					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
        -					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
        -					"</div><table class='ui-datepicker-calendar'><thead>" +
        -					"<tr>";
        -				thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
        -				for (dow = 0; dow < 7; dow++) { // days of the week
        -					day = (dow + firstDay) % 7;
        -					thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
        -						"<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
        -				}
        -				calender += thead + "</tr></thead><tbody>";
        -				daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
        -				if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
        -					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
        -				}
        -				leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
        -				curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
        -				numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
        -				this.maxRows = numRows;
        -				printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
        -				for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
        -					calender += "<tr>";
        -					tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
        -						this._get(inst, "calculateWeek")(printDate) + "</td>");
        -					for (dow = 0; dow < 7; dow++) { // create date picker days
        -						daySettings = (beforeShowDay ?
        -							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
        -						otherMonth = (printDate.getMonth() !== drawMonth);
        -						unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
        -							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
        -						tbody += "<td class='" +
        -							((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
        -							(otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
        -							((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
        -							(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
        -							// or defaultDate is current printedDate and defaultDate is selectedDate
        -							" " + this._dayOverClass : "") + // highlight selected day
        -							(unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") +  // highlight unselectable days
        -							(otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
        -							(printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
        -							(printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
        -							((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
        -							(unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
        -							(otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
        -							(unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
        -							(printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
        -							(printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
        -							(otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
        -							"' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
        -						printDate.setDate(printDate.getDate() + 1);
        -						printDate = this._daylightSavingAdjust(printDate);
        -					}
        -					calender += tbody + "</tr>";
        -				}
        -				drawMonth++;
        -				if (drawMonth > 11) {
        -					drawMonth = 0;
        -					drawYear++;
        -				}
        -				calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
        -							((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
        -				group += calender;
        -			}
        -			html += group;
        -		}
        -		html += buttonPanel;
        -		inst._keyEvent = false;
        -		return html;
        -	},
        -
        -	/* Generate the month and year header. */
        -	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
        -			secondary, monthNames, monthNamesShort) {
        -
        -		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
        -			changeMonth = this._get(inst, "changeMonth"),
        -			changeYear = this._get(inst, "changeYear"),
        -			showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
        -			html = "<div class='ui-datepicker-title'>",
        -			monthHtml = "";
        -
        -		// month selection
        -		if (secondary || !changeMonth) {
        -			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
        -		} else {
        -			inMinYear = (minDate && minDate.getFullYear() === drawYear);
        -			inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
        -			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
        -			for ( month = 0; month < 12; month++) {
        -				if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
        -					monthHtml += "<option value='" + month + "'" +
        -						(month === drawMonth ? " selected='selected'" : "") +
        -						">" + monthNamesShort[month] + "</option>";
        -				}
        -			}
        -			monthHtml += "</select>";
        -		}
        -
        -		if (!showMonthAfterYear) {
        -			html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
        -		}
        -
        -		// year selection
        -		if ( !inst.yearshtml ) {
        -			inst.yearshtml = "";
        -			if (secondary || !changeYear) {
        -				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
        -			} else {
        -				// determine range of years to display
        -				years = this._get(inst, "yearRange").split(":");
        -				thisYear = new Date().getFullYear();
        -				determineYear = function(value) {
        -					var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
        -						(value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
        -						parseInt(value, 10)));
        -					return (isNaN(year) ? thisYear : year);
        -				};
        -				year = determineYear(years[0]);
        -				endYear = Math.max(year, determineYear(years[1] || ""));
        -				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
        -				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
        -				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
        -				for (; year <= endYear; year++) {
        -					inst.yearshtml += "<option value='" + year + "'" +
        -						(year === drawYear ? " selected='selected'" : "") +
        -						">" + year + "</option>";
        -				}
        -				inst.yearshtml += "</select>";
        -
        -				html += inst.yearshtml;
        -				inst.yearshtml = null;
        -			}
        -		}
        -
        -		html += this._get(inst, "yearSuffix");
        -		if (showMonthAfterYear) {
        -			html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
        -		}
        -		html += "</div>"; // Close datepicker_header
        -		return html;
        -	},
        -
        -	/* Adjust one of the date sub-fields. */
        -	_adjustInstDate: function(inst, offset, period) {
        -		var year = inst.drawYear + (period === "Y" ? offset : 0),
        -			month = inst.drawMonth + (period === "M" ? offset : 0),
        -			day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
        -			date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
        -
        -		inst.selectedDay = date.getDate();
        -		inst.drawMonth = inst.selectedMonth = date.getMonth();
        -		inst.drawYear = inst.selectedYear = date.getFullYear();
        -		if (period === "M" || period === "Y") {
        -			this._notifyChange(inst);
        -		}
        -	},
        -
        -	/* Ensure a date is within any min/max bounds. */
        -	_restrictMinMax: function(inst, date) {
        -		var minDate = this._getMinMaxDate(inst, "min"),
        -			maxDate = this._getMinMaxDate(inst, "max"),
        -			newDate = (minDate && date < minDate ? minDate : date);
        -		return (maxDate && newDate > maxDate ? maxDate : newDate);
        -	},
        -
        -	/* Notify change of month/year. */
        -	_notifyChange: function(inst) {
        -		var onChange = this._get(inst, "onChangeMonthYear");
        -		if (onChange) {
        -			onChange.apply((inst.input ? inst.input[0] : null),
        -				[inst.selectedYear, inst.selectedMonth + 1, inst]);
        -		}
        -	},
        -
        -	/* Determine the number of months to show. */
        -	_getNumberOfMonths: function(inst) {
        -		var numMonths = this._get(inst, "numberOfMonths");
        -		return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
        -	},
        -
        -	/* Determine the current maximum date - ensure no time components are set. */
        -	_getMinMaxDate: function(inst, minMax) {
        -		return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
        -	},
        -
        -	/* Find the number of days in a given month. */
        -	_getDaysInMonth: function(year, month) {
        -		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
        -	},
        -
        -	/* Find the day of the week of the first of a month. */
        -	_getFirstDayOfMonth: function(year, month) {
        -		return new Date(year, month, 1).getDay();
        -	},
        -
        -	/* Determines if we should allow a "next/prev" month display change. */
        -	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
        -		var numMonths = this._getNumberOfMonths(inst),
        -			date = this._daylightSavingAdjust(new Date(curYear,
        -			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
        -
        -		if (offset < 0) {
        -			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
        -		}
        -		return this._isInRange(inst, date);
        -	},
        -
        -	/* Is the given date in the accepted range? */
        -	_isInRange: function(inst, date) {
        -		var yearSplit, currentYear,
        -			minDate = this._getMinMaxDate(inst, "min"),
        -			maxDate = this._getMinMaxDate(inst, "max"),
        -			minYear = null,
        -			maxYear = null,
        -			years = this._get(inst, "yearRange");
        -			if (years){
        -				yearSplit = years.split(":");
        -				currentYear = new Date().getFullYear();
        -				minYear = parseInt(yearSplit[0], 10);
        -				maxYear = parseInt(yearSplit[1], 10);
        -				if ( yearSplit[0].match(/[+\-].*/) ) {
        -					minYear += currentYear;
        -				}
        -				if ( yearSplit[1].match(/[+\-].*/) ) {
        -					maxYear += currentYear;
        -				}
        -			}
        -
        -		return ((!minDate || date.getTime() >= minDate.getTime()) &&
        -			(!maxDate || date.getTime() <= maxDate.getTime()) &&
        -			(!minYear || date.getFullYear() >= minYear) &&
        -			(!maxYear || date.getFullYear() <= maxYear));
        -	},
        -
        -	/* Provide the configuration settings for formatting/parsing. */
        -	_getFormatConfig: function(inst) {
        -		var shortYearCutoff = this._get(inst, "shortYearCutoff");
        -		shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
        -			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
        -		return {shortYearCutoff: shortYearCutoff,
        -			dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
        -			monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
        -	},
        -
        -	/* Format the given date for display. */
        -	_formatDate: function(inst, day, month, year) {
        -		if (!day) {
        -			inst.currentDay = inst.selectedDay;
        -			inst.currentMonth = inst.selectedMonth;
        -			inst.currentYear = inst.selectedYear;
        -		}
        -		var date = (day ? (typeof day === "object" ? day :
        -			this._daylightSavingAdjust(new Date(year, month, day))) :
        -			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
        -		return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
        -	}
        -});
        -
        -/*
        - * Bind hover events for datepicker elements.
        - * Done via delegate so the binding only occurs once in the lifetime of the parent div.
        - * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
        - */
        -function datepicker_bindHover(dpDiv) {
        -	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
        -	return dpDiv.delegate(selector, "mouseout", function() {
        -			$(this).removeClass("ui-state-hover");
        -			if (this.className.indexOf("ui-datepicker-prev") !== -1) {
        -				$(this).removeClass("ui-datepicker-prev-hover");
        -			}
        -			if (this.className.indexOf("ui-datepicker-next") !== -1) {
        -				$(this).removeClass("ui-datepicker-next-hover");
        -			}
        -		})
        -		.delegate( selector, "mouseover", datepicker_handleMouseover );
        -}
        -
        -function datepicker_handleMouseover() {
        -	if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
        -		$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
        -		$(this).addClass("ui-state-hover");
        -		if (this.className.indexOf("ui-datepicker-prev") !== -1) {
        -			$(this).addClass("ui-datepicker-prev-hover");
        -		}
        -		if (this.className.indexOf("ui-datepicker-next") !== -1) {
        -			$(this).addClass("ui-datepicker-next-hover");
        -		}
        -	}
        -}
        -
        -/* jQuery extend now ignores nulls! */
        -function datepicker_extendRemove(target, props) {
        -	$.extend(target, props);
        -	for (var name in props) {
        -		if (props[name] == null) {
        -			target[name] = props[name];
        -		}
        -	}
        -	return target;
        -}
        -
        -/* Invoke the datepicker functionality.
        -   @param  options  string - a command, optionally followed by additional parameters or
        -					Object - settings for attaching new datepicker functionality
        -   @return  jQuery object */
        -$.fn.datepicker = function(options){
        -
        -	/* Verify an empty collection wasn't passed - Fixes #6976 */
        -	if ( !this.length ) {
        -		return this;
        -	}
        -
        -	/* Initialise the date picker. */
        -	if (!$.datepicker.initialized) {
        -		$(document).mousedown($.datepicker._checkExternalClick);
        -		$.datepicker.initialized = true;
        -	}
        -
        -	/* Append datepicker main container to body if not exist. */
        -	if ($("#"+$.datepicker._mainDivId).length === 0) {
        -		$("body").append($.datepicker.dpDiv);
        -	}
        -
        -	var otherArgs = Array.prototype.slice.call(arguments, 1);
        -	if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
        -		return $.datepicker["_" + options + "Datepicker"].
        -			apply($.datepicker, [this[0]].concat(otherArgs));
        -	}
        -	if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
        -		return $.datepicker["_" + options + "Datepicker"].
        -			apply($.datepicker, [this[0]].concat(otherArgs));
        -	}
        -	return this.each(function() {
        -		typeof options === "string" ?
        -			$.datepicker["_" + options + "Datepicker"].
        -				apply($.datepicker, [this].concat(otherArgs)) :
        -			$.datepicker._attachDatepicker(this, options);
        -	});
        -};
        -
        -$.datepicker = new Datepicker(); // singleton instance
        -$.datepicker.initialized = false;
        -$.datepicker.uuid = new Date().getTime();
        -$.datepicker.version = "1.11.4";
        -
        -var datepicker = $.datepicker;
        -
        -
        -/*!
        - * jQuery UI Draggable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/draggable/
        - */
        -
        -
        -$.widget("ui.draggable", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "drag",
        -	options: {
        -		addClasses: true,
        -		appendTo: "parent",
        -		axis: false,
        -		connectToSortable: false,
        -		containment: false,
        -		cursor: "auto",
        -		cursorAt: false,
        -		grid: false,
        -		handle: false,
        -		helper: "original",
        -		iframeFix: false,
        -		opacity: false,
        -		refreshPositions: false,
        -		revert: false,
        -		revertDuration: 500,
        -		scope: "default",
        -		scroll: true,
        -		scrollSensitivity: 20,
        -		scrollSpeed: 20,
        -		snap: false,
        -		snapMode: "both",
        -		snapTolerance: 20,
        -		stack: false,
        -		zIndex: false,
        -
        -		// callbacks
        -		drag: null,
        -		start: null,
        -		stop: null
        -	},
        -	_create: function() {
        -
        -		if ( this.options.helper === "original" ) {
        -			this._setPositionRelative();
        -		}
        -		if (this.options.addClasses){
        -			this.element.addClass("ui-draggable");
        -		}
        -		if (this.options.disabled){
        -			this.element.addClass("ui-draggable-disabled");
        -		}
        -		this._setHandleClassName();
        -
        -		this._mouseInit();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -		if ( key === "handle" ) {
        -			this._removeHandleClassName();
        -			this._setHandleClassName();
        -		}
        -	},
        -
        -	_destroy: function() {
        -		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
        -			this.destroyOnClear = true;
        -			return;
        -		}
        -		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
        -		this._removeHandleClassName();
        -		this._mouseDestroy();
        -	},
        -
        -	_mouseCapture: function(event) {
        -		var o = this.options;
        -
        -		this._blurActiveElement( event );
        -
        -		// among others, prevent a drag on a resizable-handle
        -		if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
        -			return false;
        -		}
        -
        -		//Quit if we're not on a valid handle
        -		this.handle = this._getHandle(event);
        -		if (!this.handle) {
        -			return false;
        -		}
        -
        -		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
        -
        -		return true;
        -
        -	},
        -
        -	_blockFrames: function( selector ) {
        -		this.iframeBlocks = this.document.find( selector ).map(function() {
        -			var iframe = $( this );
        -
        -			return $( "<div>" )
        -				.css( "position", "absolute" )
        -				.appendTo( iframe.parent() )
        -				.outerWidth( iframe.outerWidth() )
        -				.outerHeight( iframe.outerHeight() )
        -				.offset( iframe.offset() )[ 0 ];
        -		});
        -	},
        -
        -	_unblockFrames: function() {
        -		if ( this.iframeBlocks ) {
        -			this.iframeBlocks.remove();
        -			delete this.iframeBlocks;
        -		}
        -	},
        -
        -	_blurActiveElement: function( event ) {
        -		var document = this.document[ 0 ];
        -
        -		// Only need to blur if the event occurred on the draggable itself, see #10527
        -		if ( !this.handleElement.is( event.target ) ) {
        -			return;
        -		}
        -
        -		// support: IE9
        -		// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
        -		try {
        -
        -			// Support: IE9, IE10
        -			// If the <body> is blurred, IE will switch windows, see #9520
        -			if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
        -
        -				// Blur any element that currently has focus, see #4261
        -				$( document.activeElement ).blur();
        -			}
        -		} catch ( error ) {}
        -	},
        -
        -	_mouseStart: function(event) {
        -
        -		var o = this.options;
        -
        -		//Create and append the visible helper
        -		this.helper = this._createHelper(event);
        -
        -		this.helper.addClass("ui-draggable-dragging");
        -
        -		//Cache the helper size
        -		this._cacheHelperProportions();
        -
        -		//If ddmanager is used for droppables, set the global draggable
        -		if ($.ui.ddmanager) {
        -			$.ui.ddmanager.current = this;
        -		}
        -
        -		/*
        -		 * - Position generation -
        -		 * This block generates everything position related - it's the core of draggables.
        -		 */
        -
        -		//Cache the margins of the original element
        -		this._cacheMargins();
        -
        -		//Store the helper's css position
        -		this.cssPosition = this.helper.css( "position" );
        -		this.scrollParent = this.helper.scrollParent( true );
        -		this.offsetParent = this.helper.offsetParent();
        -		this.hasFixedAncestor = this.helper.parents().filter(function() {
        -				return $( this ).css( "position" ) === "fixed";
        -			}).length > 0;
        -
        -		//The element's absolute position on the page minus margins
        -		this.positionAbs = this.element.offset();
        -		this._refreshOffsets( event );
        -
        -		//Generate the original position
        -		this.originalPosition = this.position = this._generatePosition( event, false );
        -		this.originalPageX = event.pageX;
        -		this.originalPageY = event.pageY;
        -
        -		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        -		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
        -
        -		//Set a containment if given in the options
        -		this._setContainment();
        -
        -		//Trigger event + callbacks
        -		if (this._trigger("start", event) === false) {
        -			this._clear();
        -			return false;
        -		}
        -
        -		//Recache the helper size
        -		this._cacheHelperProportions();
        -
        -		//Prepare the droppable offsets
        -		if ($.ui.ddmanager && !o.dropBehaviour) {
        -			$.ui.ddmanager.prepareOffsets(this, event);
        -		}
        -
        -		// Reset helper's right/bottom css if they're set and set explicit width/height instead
        -		// as this prevents resizing of elements with right/bottom set (see #7772)
        -		this._normalizeRightBottom();
        -
        -		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
        -
        -		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
        -		if ( $.ui.ddmanager ) {
        -			$.ui.ddmanager.dragStart(this, event);
        -		}
        -
        -		return true;
        -	},
        -
        -	_refreshOffsets: function( event ) {
        -		this.offset = {
        -			top: this.positionAbs.top - this.margins.top,
        -			left: this.positionAbs.left - this.margins.left,
        -			scroll: false,
        -			parent: this._getParentOffset(),
        -			relative: this._getRelativeOffset()
        -		};
        -
        -		this.offset.click = {
        -			left: event.pageX - this.offset.left,
        -			top: event.pageY - this.offset.top
        -		};
        -	},
        -
        -	_mouseDrag: function(event, noPropagation) {
        -		// reset any necessary cached properties (see #5009)
        -		if ( this.hasFixedAncestor ) {
        -			this.offset.parent = this._getParentOffset();
        -		}
        -
        -		//Compute the helpers position
        -		this.position = this._generatePosition( event, true );
        -		this.positionAbs = this._convertPositionTo("absolute");
        -
        -		//Call plugins and callbacks and use the resulting position if something is returned
        -		if (!noPropagation) {
        -			var ui = this._uiHash();
        -			if (this._trigger("drag", event, ui) === false) {
        -				this._mouseUp({});
        -				return false;
        -			}
        -			this.position = ui.position;
        -		}
        -
        -		this.helper[ 0 ].style.left = this.position.left + "px";
        -		this.helper[ 0 ].style.top = this.position.top + "px";
        -
        -		if ($.ui.ddmanager) {
        -			$.ui.ddmanager.drag(this, event);
        -		}
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function(event) {
        -
        -		//If we are using droppables, inform the manager about the drop
        -		var that = this,
        -			dropped = false;
        -		if ($.ui.ddmanager && !this.options.dropBehaviour) {
        -			dropped = $.ui.ddmanager.drop(this, event);
        -		}
        -
        -		//if a drop comes from outside (a sortable)
        -		if (this.dropped) {
        -			dropped = this.dropped;
        -			this.dropped = false;
        -		}
        -
        -		if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
        -			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
        -				if (that._trigger("stop", event) !== false) {
        -					that._clear();
        -				}
        -			});
        -		} else {
        -			if (this._trigger("stop", event) !== false) {
        -				this._clear();
        -			}
        -		}
        -
        -		return false;
        -	},
        -
        -	_mouseUp: function( event ) {
        -		this._unblockFrames();
        -
        -		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
        -		if ( $.ui.ddmanager ) {
        -			$.ui.ddmanager.dragStop(this, event);
        -		}
        -
        -		// Only need to focus if the event occurred on the draggable itself, see #10527
        -		if ( this.handleElement.is( event.target ) ) {
        -			// The interaction is over; whether or not the click resulted in a drag, focus the element
        -			this.element.focus();
        -		}
        -
        -		return $.ui.mouse.prototype._mouseUp.call(this, event);
        -	},
        -
        -	cancel: function() {
        -
        -		if (this.helper.is(".ui-draggable-dragging")) {
        -			this._mouseUp({});
        -		} else {
        -			this._clear();
        -		}
        -
        -		return this;
        -
        -	},
        -
        -	_getHandle: function(event) {
        -		return this.options.handle ?
        -			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
        -			true;
        -	},
        -
        -	_setHandleClassName: function() {
        -		this.handleElement = this.options.handle ?
        -			this.element.find( this.options.handle ) : this.element;
        -		this.handleElement.addClass( "ui-draggable-handle" );
        -	},
        -
        -	_removeHandleClassName: function() {
        -		this.handleElement.removeClass( "ui-draggable-handle" );
        -	},
        -
        -	_createHelper: function(event) {
        -
        -		var o = this.options,
        -			helperIsFunction = $.isFunction( o.helper ),
        -			helper = helperIsFunction ?
        -				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
        -				( o.helper === "clone" ?
        -					this.element.clone().removeAttr( "id" ) :
        -					this.element );
        -
        -		if (!helper.parents("body").length) {
        -			helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
        -		}
        -
        -		// http://bugs.jqueryui.com/ticket/9446
        -		// a helper function can return the original element
        -		// which wouldn't have been set to relative in _create
        -		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
        -			this._setPositionRelative();
        -		}
        -
        -		if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
        -			helper.css("position", "absolute");
        -		}
        -
        -		return helper;
        -
        -	},
        -
        -	_setPositionRelative: function() {
        -		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
        -			this.element[ 0 ].style.position = "relative";
        -		}
        -	},
        -
        -	_adjustOffsetFromHelper: function(obj) {
        -		if (typeof obj === "string") {
        -			obj = obj.split(" ");
        -		}
        -		if ($.isArray(obj)) {
        -			obj = { left: +obj[0], top: +obj[1] || 0 };
        -		}
        -		if ("left" in obj) {
        -			this.offset.click.left = obj.left + this.margins.left;
        -		}
        -		if ("right" in obj) {
        -			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        -		}
        -		if ("top" in obj) {
        -			this.offset.click.top = obj.top + this.margins.top;
        -		}
        -		if ("bottom" in obj) {
        -			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        -		}
        -	},
        -
        -	_isRootNode: function( element ) {
        -		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
        -	},
        -
        -	_getParentOffset: function() {
        -
        -		//Get the offsetParent and cache its position
        -		var po = this.offsetParent.offset(),
        -			document = this.document[ 0 ];
        -
        -		// This is a special case where we need to modify a offset calculated on start, since the following happened:
        -		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
        -		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
        -		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
        -		if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
        -			po.left += this.scrollParent.scrollLeft();
        -			po.top += this.scrollParent.scrollTop();
        -		}
        -
        -		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
        -			po = { top: 0, left: 0 };
        -		}
        -
        -		return {
        -			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
        -			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
        -		};
        -
        -	},
        -
        -	_getRelativeOffset: function() {
        -		if ( this.cssPosition !== "relative" ) {
        -			return { top: 0, left: 0 };
        -		}
        -
        -		var p = this.element.position(),
        -			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        -
        -		return {
        -			top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
        -			left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
        -		};
        -
        -	},
        -
        -	_cacheMargins: function() {
        -		this.margins = {
        -			left: (parseInt(this.element.css("marginLeft"), 10) || 0),
        -			top: (parseInt(this.element.css("marginTop"), 10) || 0),
        -			right: (parseInt(this.element.css("marginRight"), 10) || 0),
        -			bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
        -		};
        -	},
        -
        -	_cacheHelperProportions: function() {
        -		this.helperProportions = {
        -			width: this.helper.outerWidth(),
        -			height: this.helper.outerHeight()
        -		};
        -	},
        -
        -	_setContainment: function() {
        -
        -		var isUserScrollable, c, ce,
        -			o = this.options,
        -			document = this.document[ 0 ];
        -
        -		this.relativeContainer = null;
        -
        -		if ( !o.containment ) {
        -			this.containment = null;
        -			return;
        -		}
        -
        -		if ( o.containment === "window" ) {
        -			this.containment = [
        -				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
        -				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
        -				$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
        -				$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
        -			];
        -			return;
        -		}
        -
        -		if ( o.containment === "document") {
        -			this.containment = [
        -				0,
        -				0,
        -				$( document ).width() - this.helperProportions.width - this.margins.left,
        -				( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
        -			];
        -			return;
        -		}
        -
        -		if ( o.containment.constructor === Array ) {
        -			this.containment = o.containment;
        -			return;
        -		}
        -
        -		if ( o.containment === "parent" ) {
        -			o.containment = this.helper[ 0 ].parentNode;
        -		}
        -
        -		c = $( o.containment );
        -		ce = c[ 0 ];
        -
        -		if ( !ce ) {
        -			return;
        -		}
        -
        -		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
        -
        -		this.containment = [
        -			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
        -			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
        -			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
        -				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
        -				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
        -				this.helperProportions.width -
        -				this.margins.left -
        -				this.margins.right,
        -			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
        -				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
        -				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
        -				this.helperProportions.height -
        -				this.margins.top -
        -				this.margins.bottom
        -		];
        -		this.relativeContainer = c;
        -	},
        -
        -	_convertPositionTo: function(d, pos) {
        -
        -		if (!pos) {
        -			pos = this.position;
        -		}
        -
        -		var mod = d === "absolute" ? 1 : -1,
        -			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
        -
        -		return {
        -			top: (
        -				pos.top	+																// The absolute mouse position
        -				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top * mod -										// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
        -			),
        -			left: (
        -				pos.left +																// The absolute mouse position
        -				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
        -			)
        -		};
        -
        -	},
        -
        -	_generatePosition: function( event, constrainPosition ) {
        -
        -		var containment, co, top, left,
        -			o = this.options,
        -			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
        -			pageX = event.pageX,
        -			pageY = event.pageY;
        -
        -		// Cache the scroll
        -		if ( !scrollIsRootNode || !this.offset.scroll ) {
        -			this.offset.scroll = {
        -				top: this.scrollParent.scrollTop(),
        -				left: this.scrollParent.scrollLeft()
        -			};
        -		}
        -
        -		/*
        -		 * - Position constraining -
        -		 * Constrain the position to a mix of grid, containment.
        -		 */
        -
        -		// If we are not dragging yet, we won't check for options
        -		if ( constrainPosition ) {
        -			if ( this.containment ) {
        -				if ( this.relativeContainer ){
        -					co = this.relativeContainer.offset();
        -					containment = [
        -						this.containment[ 0 ] + co.left,
        -						this.containment[ 1 ] + co.top,
        -						this.containment[ 2 ] + co.left,
        -						this.containment[ 3 ] + co.top
        -					];
        -				} else {
        -					containment = this.containment;
        -				}
        -
        -				if (event.pageX - this.offset.click.left < containment[0]) {
        -					pageX = containment[0] + this.offset.click.left;
        -				}
        -				if (event.pageY - this.offset.click.top < containment[1]) {
        -					pageY = containment[1] + this.offset.click.top;
        -				}
        -				if (event.pageX - this.offset.click.left > containment[2]) {
        -					pageX = containment[2] + this.offset.click.left;
        -				}
        -				if (event.pageY - this.offset.click.top > containment[3]) {
        -					pageY = containment[3] + this.offset.click.top;
        -				}
        -			}
        -
        -			if (o.grid) {
        -				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
        -				top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
        -				pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
        -
        -				left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
        -				pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
        -			}
        -
        -			if ( o.axis === "y" ) {
        -				pageX = this.originalPageX;
        -			}
        -
        -			if ( o.axis === "x" ) {
        -				pageY = this.originalPageY;
        -			}
        -		}
        -
        -		return {
        -			top: (
        -				pageY -																	// The absolute mouse position
        -				this.offset.click.top	-												// Click offset (relative to the element)
        -				this.offset.relative.top -												// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
        -				( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
        -			),
        -			left: (
        -				pageX -																	// The absolute mouse position
        -				this.offset.click.left -												// Click offset (relative to the element)
        -				this.offset.relative.left -												// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
        -				( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
        -			)
        -		};
        -
        -	},
        -
        -	_clear: function() {
        -		this.helper.removeClass("ui-draggable-dragging");
        -		if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
        -			this.helper.remove();
        -		}
        -		this.helper = null;
        -		this.cancelHelperRemoval = false;
        -		if ( this.destroyOnClear ) {
        -			this.destroy();
        -		}
        -	},
        -
        -	_normalizeRightBottom: function() {
        -		if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
        -			this.helper.width( this.helper.width() );
        -			this.helper.css( "right", "auto" );
        -		}
        -		if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
        -			this.helper.height( this.helper.height() );
        -			this.helper.css( "bottom", "auto" );
        -		}
        -	},
        -
        -	// From now on bulk stuff - mainly helpers
        -
        -	_trigger: function( type, event, ui ) {
        -		ui = ui || this._uiHash();
        -		$.ui.plugin.call( this, type, [ event, ui, this ], true );
        -
        -		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
        -		if ( /^(drag|start|stop)/.test( type ) ) {
        -			this.positionAbs = this._convertPositionTo( "absolute" );
        -			ui.offset = this.positionAbs;
        -		}
        -		return $.Widget.prototype._trigger.call( this, type, event, ui );
        -	},
        -
        -	plugins: {},
        -
        -	_uiHash: function() {
        -		return {
        -			helper: this.helper,
        -			position: this.position,
        -			originalPosition: this.originalPosition,
        -			offset: this.positionAbs
        -		};
        -	}
        -
        -});
        -
        -$.ui.plugin.add( "draggable", "connectToSortable", {
        -	start: function( event, ui, draggable ) {
        -		var uiSortable = $.extend( {}, ui, {
        -			item: draggable.element
        -		});
        -
        -		draggable.sortables = [];
        -		$( draggable.options.connectToSortable ).each(function() {
        -			var sortable = $( this ).sortable( "instance" );
        -
        -			if ( sortable && !sortable.options.disabled ) {
        -				draggable.sortables.push( sortable );
        -
        -				// refreshPositions is called at drag start to refresh the containerCache
        -				// which is used in drag. This ensures it's initialized and synchronized
        -				// with any changes that might have happened on the page since initialization.
        -				sortable.refreshPositions();
        -				sortable._trigger("activate", event, uiSortable);
        -			}
        -		});
        -	},
        -	stop: function( event, ui, draggable ) {
        -		var uiSortable = $.extend( {}, ui, {
        -			item: draggable.element
        -		});
        -
        -		draggable.cancelHelperRemoval = false;
        -
        -		$.each( draggable.sortables, function() {
        -			var sortable = this;
        -
        -			if ( sortable.isOver ) {
        -				sortable.isOver = 0;
        -
        -				// Allow this sortable to handle removing the helper
        -				draggable.cancelHelperRemoval = true;
        -				sortable.cancelHelperRemoval = false;
        -
        -				// Use _storedCSS To restore properties in the sortable,
        -				// as this also handles revert (#9675) since the draggable
        -				// may have modified them in unexpected ways (#8809)
        -				sortable._storedCSS = {
        -					position: sortable.placeholder.css( "position" ),
        -					top: sortable.placeholder.css( "top" ),
        -					left: sortable.placeholder.css( "left" )
        -				};
        -
        -				sortable._mouseStop(event);
        -
        -				// Once drag has ended, the sortable should return to using
        -				// its original helper, not the shared helper from draggable
        -				sortable.options.helper = sortable.options._helper;
        -			} else {
        -				// Prevent this Sortable from removing the helper.
        -				// However, don't set the draggable to remove the helper
        -				// either as another connected Sortable may yet handle the removal.
        -				sortable.cancelHelperRemoval = true;
        -
        -				sortable._trigger( "deactivate", event, uiSortable );
        -			}
        -		});
        -	},
        -	drag: function( event, ui, draggable ) {
        -		$.each( draggable.sortables, function() {
        -			var innermostIntersecting = false,
        -				sortable = this;
        -
        -			// Copy over variables that sortable's _intersectsWith uses
        -			sortable.positionAbs = draggable.positionAbs;
        -			sortable.helperProportions = draggable.helperProportions;
        -			sortable.offset.click = draggable.offset.click;
        -
        -			if ( sortable._intersectsWith( sortable.containerCache ) ) {
        -				innermostIntersecting = true;
        -
        -				$.each( draggable.sortables, function() {
        -					// Copy over variables that sortable's _intersectsWith uses
        -					this.positionAbs = draggable.positionAbs;
        -					this.helperProportions = draggable.helperProportions;
        -					this.offset.click = draggable.offset.click;
        -
        -					if ( this !== sortable &&
        -							this._intersectsWith( this.containerCache ) &&
        -							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
        -						innermostIntersecting = false;
        -					}
        -
        -					return innermostIntersecting;
        -				});
        -			}
        -
        -			if ( innermostIntersecting ) {
        -				// If it intersects, we use a little isOver variable and set it once,
        -				// so that the move-in stuff gets fired only once.
        -				if ( !sortable.isOver ) {
        -					sortable.isOver = 1;
        -
        -					// Store draggable's parent in case we need to reappend to it later.
        -					draggable._parent = ui.helper.parent();
        -
        -					sortable.currentItem = ui.helper
        -						.appendTo( sortable.element )
        -						.data( "ui-sortable-item", true );
        -
        -					// Store helper option to later restore it
        -					sortable.options._helper = sortable.options.helper;
        -
        -					sortable.options.helper = function() {
        -						return ui.helper[ 0 ];
        -					};
        -
        -					// Fire the start events of the sortable with our passed browser event,
        -					// and our own helper (so it doesn't create a new one)
        -					event.target = sortable.currentItem[ 0 ];
        -					sortable._mouseCapture( event, true );
        -					sortable._mouseStart( event, true, true );
        -
        -					// Because the browser event is way off the new appended portlet,
        -					// modify necessary variables to reflect the changes
        -					sortable.offset.click.top = draggable.offset.click.top;
        -					sortable.offset.click.left = draggable.offset.click.left;
        -					sortable.offset.parent.left -= draggable.offset.parent.left -
        -						sortable.offset.parent.left;
        -					sortable.offset.parent.top -= draggable.offset.parent.top -
        -						sortable.offset.parent.top;
        -
        -					draggable._trigger( "toSortable", event );
        -
        -					// Inform draggable that the helper is in a valid drop zone,
        -					// used solely in the revert option to handle "valid/invalid".
        -					draggable.dropped = sortable.element;
        -
        -					// Need to refreshPositions of all sortables in the case that
        -					// adding to one sortable changes the location of the other sortables (#9675)
        -					$.each( draggable.sortables, function() {
        -						this.refreshPositions();
        -					});
        -
        -					// hack so receive/update callbacks work (mostly)
        -					draggable.currentItem = draggable.element;
        -					sortable.fromOutside = draggable;
        -				}
        -
        -				if ( sortable.currentItem ) {
        -					sortable._mouseDrag( event );
        -					// Copy the sortable's position because the draggable's can potentially reflect
        -					// a relative position, while sortable is always absolute, which the dragged
        -					// element has now become. (#8809)
        -					ui.position = sortable.position;
        -				}
        -			} else {
        -				// If it doesn't intersect with the sortable, and it intersected before,
        -				// we fake the drag stop of the sortable, but make sure it doesn't remove
        -				// the helper by using cancelHelperRemoval.
        -				if ( sortable.isOver ) {
        -
        -					sortable.isOver = 0;
        -					sortable.cancelHelperRemoval = true;
        -
        -					// Calling sortable's mouseStop would trigger a revert,
        -					// so revert must be temporarily false until after mouseStop is called.
        -					sortable.options._revert = sortable.options.revert;
        -					sortable.options.revert = false;
        -
        -					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
        -					sortable._mouseStop( event, true );
        -
        -					// restore sortable behaviors that were modfied
        -					// when the draggable entered the sortable area (#9481)
        -					sortable.options.revert = sortable.options._revert;
        -					sortable.options.helper = sortable.options._helper;
        -
        -					if ( sortable.placeholder ) {
        -						sortable.placeholder.remove();
        -					}
        -
        -					// Restore and recalculate the draggable's offset considering the sortable
        -					// may have modified them in unexpected ways. (#8809, #10669)
        -					ui.helper.appendTo( draggable._parent );
        -					draggable._refreshOffsets( event );
        -					ui.position = draggable._generatePosition( event, true );
        -
        -					draggable._trigger( "fromSortable", event );
        -
        -					// Inform draggable that the helper is no longer in a valid drop zone
        -					draggable.dropped = false;
        -
        -					// Need to refreshPositions of all sortables just in case removing
        -					// from one sortable changes the location of other sortables (#9675)
        -					$.each( draggable.sortables, function() {
        -						this.refreshPositions();
        -					});
        -				}
        -			}
        -		});
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "cursor", {
        -	start: function( event, ui, instance ) {
        -		var t = $( "body" ),
        -			o = instance.options;
        -
        -		if (t.css("cursor")) {
        -			o._cursor = t.css("cursor");
        -		}
        -		t.css("cursor", o.cursor);
        -	},
        -	stop: function( event, ui, instance ) {
        -		var o = instance.options;
        -		if (o._cursor) {
        -			$("body").css("cursor", o._cursor);
        -		}
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "opacity", {
        -	start: function( event, ui, instance ) {
        -		var t = $( ui.helper ),
        -			o = instance.options;
        -		if (t.css("opacity")) {
        -			o._opacity = t.css("opacity");
        -		}
        -		t.css("opacity", o.opacity);
        -	},
        -	stop: function( event, ui, instance ) {
        -		var o = instance.options;
        -		if (o._opacity) {
        -			$(ui.helper).css("opacity", o._opacity);
        -		}
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "scroll", {
        -	start: function( event, ui, i ) {
        -		if ( !i.scrollParentNotHidden ) {
        -			i.scrollParentNotHidden = i.helper.scrollParent( false );
        -		}
        -
        -		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
        -			i.overflowOffset = i.scrollParentNotHidden.offset();
        -		}
        -	},
        -	drag: function( event, ui, i  ) {
        -
        -		var o = i.options,
        -			scrolled = false,
        -			scrollParent = i.scrollParentNotHidden[ 0 ],
        -			document = i.document[ 0 ];
        -
        -		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
        -			if ( !o.axis || o.axis !== "x" ) {
        -				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
        -					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
        -				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
        -					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
        -				}
        -			}
        -
        -			if ( !o.axis || o.axis !== "y" ) {
        -				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
        -					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
        -				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
        -					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
        -				}
        -			}
        -
        -		} else {
        -
        -			if (!o.axis || o.axis !== "x") {
        -				if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
        -					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
        -				} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
        -					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
        -				}
        -			}
        -
        -			if (!o.axis || o.axis !== "y") {
        -				if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
        -					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
        -				} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
        -					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
        -				}
        -			}
        -
        -		}
        -
        -		if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
        -			$.ui.ddmanager.prepareOffsets(i, event);
        -		}
        -
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "snap", {
        -	start: function( event, ui, i ) {
        -
        -		var o = i.options;
        -
        -		i.snapElements = [];
        -
        -		$(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
        -			var $t = $(this),
        -				$o = $t.offset();
        -			if (this !== i.element[0]) {
        -				i.snapElements.push({
        -					item: this,
        -					width: $t.outerWidth(), height: $t.outerHeight(),
        -					top: $o.top, left: $o.left
        -				});
        -			}
        -		});
        -
        -	},
        -	drag: function( event, ui, inst ) {
        -
        -		var ts, bs, ls, rs, l, r, t, b, i, first,
        -			o = inst.options,
        -			d = o.snapTolerance,
        -			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
        -			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
        -
        -		for (i = inst.snapElements.length - 1; i >= 0; i--){
        -
        -			l = inst.snapElements[i].left - inst.margins.left;
        -			r = l + inst.snapElements[i].width;
        -			t = inst.snapElements[i].top - inst.margins.top;
        -			b = t + inst.snapElements[i].height;
        -
        -			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
        -				if (inst.snapElements[i].snapping) {
        -					(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
        -				}
        -				inst.snapElements[i].snapping = false;
        -				continue;
        -			}
        -
        -			if (o.snapMode !== "inner") {
        -				ts = Math.abs(t - y2) <= d;
        -				bs = Math.abs(b - y1) <= d;
        -				ls = Math.abs(l - x2) <= d;
        -				rs = Math.abs(r - x1) <= d;
        -				if (ts) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
        -				}
        -				if (bs) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top;
        -				}
        -				if (ls) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
        -				}
        -				if (rs) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left;
        -				}
        -			}
        -
        -			first = (ts || bs || ls || rs);
        -
        -			if (o.snapMode !== "outer") {
        -				ts = Math.abs(t - y1) <= d;
        -				bs = Math.abs(b - y2) <= d;
        -				ls = Math.abs(l - x1) <= d;
        -				rs = Math.abs(r - x2) <= d;
        -				if (ts) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top;
        -				}
        -				if (bs) {
        -					ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
        -				}
        -				if (ls) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left;
        -				}
        -				if (rs) {
        -					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
        -				}
        -			}
        -
        -			if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
        -				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
        -			}
        -			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
        -
        -		}
        -
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "stack", {
        -	start: function( event, ui, instance ) {
        -		var min,
        -			o = instance.options,
        -			group = $.makeArray($(o.stack)).sort(function(a, b) {
        -				return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
        -			});
        -
        -		if (!group.length) { return; }
        -
        -		min = parseInt($(group[0]).css("zIndex"), 10) || 0;
        -		$(group).each(function(i) {
        -			$(this).css("zIndex", min + i);
        -		});
        -		this.css("zIndex", (min + group.length));
        -	}
        -});
        -
        -$.ui.plugin.add("draggable", "zIndex", {
        -	start: function( event, ui, instance ) {
        -		var t = $( ui.helper ),
        -			o = instance.options;
        -
        -		if (t.css("zIndex")) {
        -			o._zIndex = t.css("zIndex");
        -		}
        -		t.css("zIndex", o.zIndex);
        -	},
        -	stop: function( event, ui, instance ) {
        -		var o = instance.options;
        -
        -		if (o._zIndex) {
        -			$(ui.helper).css("zIndex", o._zIndex);
        -		}
        -	}
        -});
        -
        -var draggable = $.ui.draggable;
        -
        -
        -/*!
        - * jQuery UI Resizable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/resizable/
        - */
        -
        -
        -$.widget("ui.resizable", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "resize",
        -	options: {
        -		alsoResize: false,
        -		animate: false,
        -		animateDuration: "slow",
        -		animateEasing: "swing",
        -		aspectRatio: false,
        -		autoHide: false,
        -		containment: false,
        -		ghost: false,
        -		grid: false,
        -		handles: "e,s,se",
        -		helper: false,
        -		maxHeight: null,
        -		maxWidth: null,
        -		minHeight: 10,
        -		minWidth: 10,
        -		// See #7960
        -		zIndex: 90,
        -
        -		// callbacks
        -		resize: null,
        -		start: null,
        -		stop: null
        -	},
        -
        -	_num: function( value ) {
        -		return parseInt( value, 10 ) || 0;
        -	},
        -
        -	_isNumber: function( value ) {
        -		return !isNaN( parseInt( value, 10 ) );
        -	},
        -
        -	_hasScroll: function( el, a ) {
        -
        -		if ( $( el ).css( "overflow" ) === "hidden") {
        -			return false;
        -		}
        -
        -		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
        -			has = false;
        -
        -		if ( el[ scroll ] > 0 ) {
        -			return true;
        -		}
        -
        -		// TODO: determine which cases actually cause this to happen
        -		// if the element doesn't have the scroll set, see if it's possible to
        -		// set the scroll
        -		el[ scroll ] = 1;
        -		has = ( el[ scroll ] > 0 );
        -		el[ scroll ] = 0;
        -		return has;
        -	},
        -
        -	_create: function() {
        -
        -		var n, i, handle, axis, hname,
        -			that = this,
        -			o = this.options;
        -		this.element.addClass("ui-resizable");
        -
        -		$.extend(this, {
        -			_aspectRatio: !!(o.aspectRatio),
        -			aspectRatio: o.aspectRatio,
        -			originalElement: this.element,
        -			_proportionallyResizeElements: [],
        -			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
        -		});
        -
        -		// Wrap the element if it cannot hold child nodes
        -		if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
        -
        -			this.element.wrap(
        -				$("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
        -					position: this.element.css("position"),
        -					width: this.element.outerWidth(),
        -					height: this.element.outerHeight(),
        -					top: this.element.css("top"),
        -					left: this.element.css("left")
        -				})
        -			);
        -
        -			this.element = this.element.parent().data(
        -				"ui-resizable", this.element.resizable( "instance" )
        -			);
        -
        -			this.elementIsWrapper = true;
        -
        -			this.element.css({
        -				marginLeft: this.originalElement.css("marginLeft"),
        -				marginTop: this.originalElement.css("marginTop"),
        -				marginRight: this.originalElement.css("marginRight"),
        -				marginBottom: this.originalElement.css("marginBottom")
        -			});
        -			this.originalElement.css({
        -				marginLeft: 0,
        -				marginTop: 0,
        -				marginRight: 0,
        -				marginBottom: 0
        -			});
        -			// support: Safari
        -			// Prevent Safari textarea resize
        -			this.originalResizeStyle = this.originalElement.css("resize");
        -			this.originalElement.css("resize", "none");
        -
        -			this._proportionallyResizeElements.push( this.originalElement.css({
        -				position: "static",
        -				zoom: 1,
        -				display: "block"
        -			}) );
        -
        -			// support: IE9
        -			// avoid IE jump (hard set the margin)
        -			this.originalElement.css({ margin: this.originalElement.css("margin") });
        -
        -			this._proportionallyResize();
        -		}
        -
        -		this.handles = o.handles ||
        -			( !$(".ui-resizable-handle", this.element).length ?
        -				"e,s,se" : {
        -					n: ".ui-resizable-n",
        -					e: ".ui-resizable-e",
        -					s: ".ui-resizable-s",
        -					w: ".ui-resizable-w",
        -					se: ".ui-resizable-se",
        -					sw: ".ui-resizable-sw",
        -					ne: ".ui-resizable-ne",
        -					nw: ".ui-resizable-nw"
        -				} );
        -
        -		this._handles = $();
        -		if ( this.handles.constructor === String ) {
        -
        -			if ( this.handles === "all") {
        -				this.handles = "n,e,s,w,se,sw,ne,nw";
        -			}
        -
        -			n = this.handles.split(",");
        -			this.handles = {};
        -
        -			for (i = 0; i < n.length; i++) {
        -
        -				handle = $.trim(n[i]);
        -				hname = "ui-resizable-" + handle;
        -				axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
        -
        -				axis.css({ zIndex: o.zIndex });
        -
        -				// TODO : What's going on here?
        -				if ("se" === handle) {
        -					axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
        -				}
        -
        -				this.handles[handle] = ".ui-resizable-" + handle;
        -				this.element.append(axis);
        -			}
        -
        -		}
        -
        -		this._renderAxis = function(target) {
        -
        -			var i, axis, padPos, padWrapper;
        -
        -			target = target || this.element;
        -
        -			for (i in this.handles) {
        -
        -				if (this.handles[i].constructor === String) {
        -					this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
        -				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
        -					this.handles[ i ] = $( this.handles[ i ] );
        -					this._on( this.handles[ i ], { "mousedown": that._mouseDown });
        -				}
        -
        -				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
        -
        -					axis = $(this.handles[i], this.element);
        -
        -					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
        -
        -					padPos = [ "padding",
        -						/ne|nw|n/.test(i) ? "Top" :
        -						/se|sw|s/.test(i) ? "Bottom" :
        -						/^e$/.test(i) ? "Right" : "Left" ].join("");
        -
        -					target.css(padPos, padWrapper);
        -
        -					this._proportionallyResize();
        -				}
        -
        -				this._handles = this._handles.add( this.handles[ i ] );
        -			}
        -		};
        -
        -		// TODO: make renderAxis a prototype function
        -		this._renderAxis(this.element);
        -
        -		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
        -		this._handles.disableSelection();
        -
        -		this._handles.mouseover(function() {
        -			if (!that.resizing) {
        -				if (this.className) {
        -					axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
        -				}
        -				that.axis = axis && axis[1] ? axis[1] : "se";
        -			}
        -		});
        -
        -		if (o.autoHide) {
        -			this._handles.hide();
        -			$(this.element)
        -				.addClass("ui-resizable-autohide")
        -				.mouseenter(function() {
        -					if (o.disabled) {
        -						return;
        -					}
        -					$(this).removeClass("ui-resizable-autohide");
        -					that._handles.show();
        -				})
        -				.mouseleave(function() {
        -					if (o.disabled) {
        -						return;
        -					}
        -					if (!that.resizing) {
        -						$(this).addClass("ui-resizable-autohide");
        -						that._handles.hide();
        -					}
        -				});
        -		}
        -
        -		this._mouseInit();
        -	},
        -
        -	_destroy: function() {
        -
        -		this._mouseDestroy();
        -
        -		var wrapper,
        -			_destroy = function(exp) {
        -				$(exp)
        -					.removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
        -					.removeData("resizable")
        -					.removeData("ui-resizable")
        -					.unbind(".resizable")
        -					.find(".ui-resizable-handle")
        -						.remove();
        -			};
        -
        -		// TODO: Unwrap at same DOM position
        -		if (this.elementIsWrapper) {
        -			_destroy(this.element);
        -			wrapper = this.element;
        -			this.originalElement.css({
        -				position: wrapper.css("position"),
        -				width: wrapper.outerWidth(),
        -				height: wrapper.outerHeight(),
        -				top: wrapper.css("top"),
        -				left: wrapper.css("left")
        -			}).insertAfter( wrapper );
        -			wrapper.remove();
        -		}
        -
        -		this.originalElement.css("resize", this.originalResizeStyle);
        -		_destroy(this.originalElement);
        -
        -		return this;
        -	},
        -
        -	_mouseCapture: function(event) {
        -		var i, handle,
        -			capture = false;
        -
        -		for (i in this.handles) {
        -			handle = $(this.handles[i])[0];
        -			if (handle === event.target || $.contains(handle, event.target)) {
        -				capture = true;
        -			}
        -		}
        -
        -		return !this.options.disabled && capture;
        -	},
        -
        -	_mouseStart: function(event) {
        -
        -		var curleft, curtop, cursor,
        -			o = this.options,
        -			el = this.element;
        -
        -		this.resizing = true;
        -
        -		this._renderProxy();
        -
        -		curleft = this._num(this.helper.css("left"));
        -		curtop = this._num(this.helper.css("top"));
        -
        -		if (o.containment) {
        -			curleft += $(o.containment).scrollLeft() || 0;
        -			curtop += $(o.containment).scrollTop() || 0;
        -		}
        -
        -		this.offset = this.helper.offset();
        -		this.position = { left: curleft, top: curtop };
        -
        -		this.size = this._helper ? {
        -				width: this.helper.width(),
        -				height: this.helper.height()
        -			} : {
        -				width: el.width(),
        -				height: el.height()
        -			};
        -
        -		this.originalSize = this._helper ? {
        -				width: el.outerWidth(),
        -				height: el.outerHeight()
        -			} : {
        -				width: el.width(),
        -				height: el.height()
        -			};
        -
        -		this.sizeDiff = {
        -			width: el.outerWidth() - el.width(),
        -			height: el.outerHeight() - el.height()
        -		};
        -
        -		this.originalPosition = { left: curleft, top: curtop };
        -		this.originalMousePosition = { left: event.pageX, top: event.pageY };
        -
        -		this.aspectRatio = (typeof o.aspectRatio === "number") ?
        -			o.aspectRatio :
        -			((this.originalSize.width / this.originalSize.height) || 1);
        -
        -		cursor = $(".ui-resizable-" + this.axis).css("cursor");
        -		$("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
        -
        -		el.addClass("ui-resizable-resizing");
        -		this._propagate("start", event);
        -		return true;
        -	},
        -
        -	_mouseDrag: function(event) {
        -
        -		var data, props,
        -			smp = this.originalMousePosition,
        -			a = this.axis,
        -			dx = (event.pageX - smp.left) || 0,
        -			dy = (event.pageY - smp.top) || 0,
        -			trigger = this._change[a];
        -
        -		this._updatePrevProperties();
        -
        -		if (!trigger) {
        -			return false;
        -		}
        -
        -		data = trigger.apply(this, [ event, dx, dy ]);
        -
        -		this._updateVirtualBoundaries(event.shiftKey);
        -		if (this._aspectRatio || event.shiftKey) {
        -			data = this._updateRatio(data, event);
        -		}
        -
        -		data = this._respectSize(data, event);
        -
        -		this._updateCache(data);
        -
        -		this._propagate("resize", event);
        -
        -		props = this._applyChanges();
        -
        -		if ( !this._helper && this._proportionallyResizeElements.length ) {
        -			this._proportionallyResize();
        -		}
        -
        -		if ( !$.isEmptyObject( props ) ) {
        -			this._updatePrevProperties();
        -			this._trigger( "resize", event, this.ui() );
        -			this._applyChanges();
        -		}
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function(event) {
        -
        -		this.resizing = false;
        -		var pr, ista, soffseth, soffsetw, s, left, top,
        -			o = this.options, that = this;
        -
        -		if (this._helper) {
        -
        -			pr = this._proportionallyResizeElements;
        -			ista = pr.length && (/textarea/i).test(pr[0].nodeName);
        -			soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
        -			soffsetw = ista ? 0 : that.sizeDiff.width;
        -
        -			s = {
        -				width: (that.helper.width()  - soffsetw),
        -				height: (that.helper.height() - soffseth)
        -			};
        -			left = (parseInt(that.element.css("left"), 10) +
        -				(that.position.left - that.originalPosition.left)) || null;
        -			top = (parseInt(that.element.css("top"), 10) +
        -				(that.position.top - that.originalPosition.top)) || null;
        -
        -			if (!o.animate) {
        -				this.element.css($.extend(s, { top: top, left: left }));
        -			}
        -
        -			that.helper.height(that.size.height);
        -			that.helper.width(that.size.width);
        -
        -			if (this._helper && !o.animate) {
        -				this._proportionallyResize();
        -			}
        -		}
        -
        -		$("body").css("cursor", "auto");
        -
        -		this.element.removeClass("ui-resizable-resizing");
        -
        -		this._propagate("stop", event);
        -
        -		if (this._helper) {
        -			this.helper.remove();
        -		}
        -
        -		return false;
        -
        -	},
        -
        -	_updatePrevProperties: function() {
        -		this.prevPosition = {
        -			top: this.position.top,
        -			left: this.position.left
        -		};
        -		this.prevSize = {
        -			width: this.size.width,
        -			height: this.size.height
        -		};
        -	},
        -
        -	_applyChanges: function() {
        -		var props = {};
        -
        -		if ( this.position.top !== this.prevPosition.top ) {
        -			props.top = this.position.top + "px";
        -		}
        -		if ( this.position.left !== this.prevPosition.left ) {
        -			props.left = this.position.left + "px";
        -		}
        -		if ( this.size.width !== this.prevSize.width ) {
        -			props.width = this.size.width + "px";
        -		}
        -		if ( this.size.height !== this.prevSize.height ) {
        -			props.height = this.size.height + "px";
        -		}
        -
        -		this.helper.css( props );
        -
        -		return props;
        -	},
        -
        -	_updateVirtualBoundaries: function(forceAspectRatio) {
        -		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
        -			o = this.options;
        -
        -		b = {
        -			minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
        -			maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
        -			minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
        -			maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
        -		};
        -
        -		if (this._aspectRatio || forceAspectRatio) {
        -			pMinWidth = b.minHeight * this.aspectRatio;
        -			pMinHeight = b.minWidth / this.aspectRatio;
        -			pMaxWidth = b.maxHeight * this.aspectRatio;
        -			pMaxHeight = b.maxWidth / this.aspectRatio;
        -
        -			if (pMinWidth > b.minWidth) {
        -				b.minWidth = pMinWidth;
        -			}
        -			if (pMinHeight > b.minHeight) {
        -				b.minHeight = pMinHeight;
        -			}
        -			if (pMaxWidth < b.maxWidth) {
        -				b.maxWidth = pMaxWidth;
        -			}
        -			if (pMaxHeight < b.maxHeight) {
        -				b.maxHeight = pMaxHeight;
        -			}
        -		}
        -		this._vBoundaries = b;
        -	},
        -
        -	_updateCache: function(data) {
        -		this.offset = this.helper.offset();
        -		if (this._isNumber(data.left)) {
        -			this.position.left = data.left;
        -		}
        -		if (this._isNumber(data.top)) {
        -			this.position.top = data.top;
        -		}
        -		if (this._isNumber(data.height)) {
        -			this.size.height = data.height;
        -		}
        -		if (this._isNumber(data.width)) {
        -			this.size.width = data.width;
        -		}
        -	},
        -
        -	_updateRatio: function( data ) {
        -
        -		var cpos = this.position,
        -			csize = this.size,
        -			a = this.axis;
        -
        -		if (this._isNumber(data.height)) {
        -			data.width = (data.height * this.aspectRatio);
        -		} else if (this._isNumber(data.width)) {
        -			data.height = (data.width / this.aspectRatio);
        -		}
        -
        -		if (a === "sw") {
        -			data.left = cpos.left + (csize.width - data.width);
        -			data.top = null;
        -		}
        -		if (a === "nw") {
        -			data.top = cpos.top + (csize.height - data.height);
        -			data.left = cpos.left + (csize.width - data.width);
        -		}
        -
        -		return data;
        -	},
        -
        -	_respectSize: function( data ) {
        -
        -		var o = this._vBoundaries,
        -			a = this.axis,
        -			ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
        -			ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
        -			isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
        -			isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
        -			dw = this.originalPosition.left + this.originalSize.width,
        -			dh = this.position.top + this.size.height,
        -			cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
        -		if (isminw) {
        -			data.width = o.minWidth;
        -		}
        -		if (isminh) {
        -			data.height = o.minHeight;
        -		}
        -		if (ismaxw) {
        -			data.width = o.maxWidth;
        -		}
        -		if (ismaxh) {
        -			data.height = o.maxHeight;
        -		}
        -
        -		if (isminw && cw) {
        -			data.left = dw - o.minWidth;
        -		}
        -		if (ismaxw && cw) {
        -			data.left = dw - o.maxWidth;
        -		}
        -		if (isminh && ch) {
        -			data.top = dh - o.minHeight;
        -		}
        -		if (ismaxh && ch) {
        -			data.top = dh - o.maxHeight;
        -		}
        -
        -		// Fixing jump error on top/left - bug #2330
        -		if (!data.width && !data.height && !data.left && data.top) {
        -			data.top = null;
        -		} else if (!data.width && !data.height && !data.top && data.left) {
        -			data.left = null;
        -		}
        -
        -		return data;
        -	},
        -
        -	_getPaddingPlusBorderDimensions: function( element ) {
        -		var i = 0,
        -			widths = [],
        -			borders = [
        -				element.css( "borderTopWidth" ),
        -				element.css( "borderRightWidth" ),
        -				element.css( "borderBottomWidth" ),
        -				element.css( "borderLeftWidth" )
        -			],
        -			paddings = [
        -				element.css( "paddingTop" ),
        -				element.css( "paddingRight" ),
        -				element.css( "paddingBottom" ),
        -				element.css( "paddingLeft" )
        -			];
        -
        -		for ( ; i < 4; i++ ) {
        -			widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
        -			widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
        -		}
        -
        -		return {
        -			height: widths[ 0 ] + widths[ 2 ],
        -			width: widths[ 1 ] + widths[ 3 ]
        -		};
        -	},
        -
        -	_proportionallyResize: function() {
        -
        -		if (!this._proportionallyResizeElements.length) {
        -			return;
        -		}
        -
        -		var prel,
        -			i = 0,
        -			element = this.helper || this.element;
        -
        -		for ( ; i < this._proportionallyResizeElements.length; i++) {
        -
        -			prel = this._proportionallyResizeElements[i];
        -
        -			// TODO: Seems like a bug to cache this.outerDimensions
        -			// considering that we are in a loop.
        -			if (!this.outerDimensions) {
        -				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
        -			}
        -
        -			prel.css({
        -				height: (element.height() - this.outerDimensions.height) || 0,
        -				width: (element.width() - this.outerDimensions.width) || 0
        -			});
        -
        -		}
        -
        -	},
        -
        -	_renderProxy: function() {
        -
        -		var el = this.element, o = this.options;
        -		this.elementOffset = el.offset();
        -
        -		if (this._helper) {
        -
        -			this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
        -
        -			this.helper.addClass(this._helper).css({
        -				width: this.element.outerWidth() - 1,
        -				height: this.element.outerHeight() - 1,
        -				position: "absolute",
        -				left: this.elementOffset.left + "px",
        -				top: this.elementOffset.top + "px",
        -				zIndex: ++o.zIndex //TODO: Don't modify option
        -			});
        -
        -			this.helper
        -				.appendTo("body")
        -				.disableSelection();
        -
        -		} else {
        -			this.helper = this.element;
        -		}
        -
        -	},
        -
        -	_change: {
        -		e: function(event, dx) {
        -			return { width: this.originalSize.width + dx };
        -		},
        -		w: function(event, dx) {
        -			var cs = this.originalSize, sp = this.originalPosition;
        -			return { left: sp.left + dx, width: cs.width - dx };
        -		},
        -		n: function(event, dx, dy) {
        -			var cs = this.originalSize, sp = this.originalPosition;
        -			return { top: sp.top + dy, height: cs.height - dy };
        -		},
        -		s: function(event, dx, dy) {
        -			return { height: this.originalSize.height + dy };
        -		},
        -		se: function(event, dx, dy) {
        -			return $.extend(this._change.s.apply(this, arguments),
        -				this._change.e.apply(this, [ event, dx, dy ]));
        -		},
        -		sw: function(event, dx, dy) {
        -			return $.extend(this._change.s.apply(this, arguments),
        -				this._change.w.apply(this, [ event, dx, dy ]));
        -		},
        -		ne: function(event, dx, dy) {
        -			return $.extend(this._change.n.apply(this, arguments),
        -				this._change.e.apply(this, [ event, dx, dy ]));
        -		},
        -		nw: function(event, dx, dy) {
        -			return $.extend(this._change.n.apply(this, arguments),
        -				this._change.w.apply(this, [ event, dx, dy ]));
        -		}
        -	},
        -
        -	_propagate: function(n, event) {
        -		$.ui.plugin.call(this, n, [ event, this.ui() ]);
        -		(n !== "resize" && this._trigger(n, event, this.ui()));
        -	},
        -
        -	plugins: {},
        -
        -	ui: function() {
        -		return {
        -			originalElement: this.originalElement,
        -			element: this.element,
        -			helper: this.helper,
        -			position: this.position,
        -			size: this.size,
        -			originalSize: this.originalSize,
        -			originalPosition: this.originalPosition
        -		};
        -	}
        -
        -});
        -
        -/*
        - * Resizable Extensions
        - */
        -
        -$.ui.plugin.add("resizable", "animate", {
        -
        -	stop: function( event ) {
        -		var that = $(this).resizable( "instance" ),
        -			o = that.options,
        -			pr = that._proportionallyResizeElements,
        -			ista = pr.length && (/textarea/i).test(pr[0].nodeName),
        -			soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
        -			soffsetw = ista ? 0 : that.sizeDiff.width,
        -			style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
        -			left = (parseInt(that.element.css("left"), 10) +
        -				(that.position.left - that.originalPosition.left)) || null,
        -			top = (parseInt(that.element.css("top"), 10) +
        -				(that.position.top - that.originalPosition.top)) || null;
        -
        -		that.element.animate(
        -			$.extend(style, top && left ? { top: top, left: left } : {}), {
        -				duration: o.animateDuration,
        -				easing: o.animateEasing,
        -				step: function() {
        -
        -					var data = {
        -						width: parseInt(that.element.css("width"), 10),
        -						height: parseInt(that.element.css("height"), 10),
        -						top: parseInt(that.element.css("top"), 10),
        -						left: parseInt(that.element.css("left"), 10)
        -					};
        -
        -					if (pr && pr.length) {
        -						$(pr[0]).css({ width: data.width, height: data.height });
        -					}
        -
        -					// propagating resize, and updating values for each animation step
        -					that._updateCache(data);
        -					that._propagate("resize", event);
        -
        -				}
        -			}
        -		);
        -	}
        -
        -});
        -
        -$.ui.plugin.add( "resizable", "containment", {
        -
        -	start: function() {
        -		var element, p, co, ch, cw, width, height,
        -			that = $( this ).resizable( "instance" ),
        -			o = that.options,
        -			el = that.element,
        -			oc = o.containment,
        -			ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
        -
        -		if ( !ce ) {
        -			return;
        -		}
        -
        -		that.containerElement = $( ce );
        -
        -		if ( /document/.test( oc ) || oc === document ) {
        -			that.containerOffset = {
        -				left: 0,
        -				top: 0
        -			};
        -			that.containerPosition = {
        -				left: 0,
        -				top: 0
        -			};
        -
        -			that.parentData = {
        -				element: $( document ),
        -				left: 0,
        -				top: 0,
        -				width: $( document ).width(),
        -				height: $( document ).height() || document.body.parentNode.scrollHeight
        -			};
        -		} else {
        -			element = $( ce );
        -			p = [];
        -			$([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
        -				p[ i ] = that._num( element.css( "padding" + name ) );
        -			});
        -
        -			that.containerOffset = element.offset();
        -			that.containerPosition = element.position();
        -			that.containerSize = {
        -				height: ( element.innerHeight() - p[ 3 ] ),
        -				width: ( element.innerWidth() - p[ 1 ] )
        -			};
        -
        -			co = that.containerOffset;
        -			ch = that.containerSize.height;
        -			cw = that.containerSize.width;
        -			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
        -			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
        -
        -			that.parentData = {
        -				element: ce,
        -				left: co.left,
        -				top: co.top,
        -				width: width,
        -				height: height
        -			};
        -		}
        -	},
        -
        -	resize: function( event ) {
        -		var woset, hoset, isParent, isOffsetRelative,
        -			that = $( this ).resizable( "instance" ),
        -			o = that.options,
        -			co = that.containerOffset,
        -			cp = that.position,
        -			pRatio = that._aspectRatio || event.shiftKey,
        -			cop = {
        -				top: 0,
        -				left: 0
        -			},
        -			ce = that.containerElement,
        -			continueResize = true;
        -
        -		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
        -			cop = co;
        -		}
        -
        -		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
        -			that.size.width = that.size.width +
        -				( that._helper ?
        -					( that.position.left - co.left ) :
        -					( that.position.left - cop.left ) );
        -
        -			if ( pRatio ) {
        -				that.size.height = that.size.width / that.aspectRatio;
        -				continueResize = false;
        -			}
        -			that.position.left = o.helper ? co.left : 0;
        -		}
        -
        -		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
        -			that.size.height = that.size.height +
        -				( that._helper ?
        -					( that.position.top - co.top ) :
        -					that.position.top );
        -
        -			if ( pRatio ) {
        -				that.size.width = that.size.height * that.aspectRatio;
        -				continueResize = false;
        -			}
        -			that.position.top = that._helper ? co.top : 0;
        -		}
        -
        -		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
        -		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
        -
        -		if ( isParent && isOffsetRelative ) {
        -			that.offset.left = that.parentData.left + that.position.left;
        -			that.offset.top = that.parentData.top + that.position.top;
        -		} else {
        -			that.offset.left = that.element.offset().left;
        -			that.offset.top = that.element.offset().top;
        -		}
        -
        -		woset = Math.abs( that.sizeDiff.width +
        -			(that._helper ?
        -				that.offset.left - cop.left :
        -				(that.offset.left - co.left)) );
        -
        -		hoset = Math.abs( that.sizeDiff.height +
        -			(that._helper ?
        -				that.offset.top - cop.top :
        -				(that.offset.top - co.top)) );
        -
        -		if ( woset + that.size.width >= that.parentData.width ) {
        -			that.size.width = that.parentData.width - woset;
        -			if ( pRatio ) {
        -				that.size.height = that.size.width / that.aspectRatio;
        -				continueResize = false;
        -			}
        -		}
        -
        -		if ( hoset + that.size.height >= that.parentData.height ) {
        -			that.size.height = that.parentData.height - hoset;
        -			if ( pRatio ) {
        -				that.size.width = that.size.height * that.aspectRatio;
        -				continueResize = false;
        -			}
        -		}
        -
        -		if ( !continueResize ) {
        -			that.position.left = that.prevPosition.left;
        -			that.position.top = that.prevPosition.top;
        -			that.size.width = that.prevSize.width;
        -			that.size.height = that.prevSize.height;
        -		}
        -	},
        -
        -	stop: function() {
        -		var that = $( this ).resizable( "instance" ),
        -			o = that.options,
        -			co = that.containerOffset,
        -			cop = that.containerPosition,
        -			ce = that.containerElement,
        -			helper = $( that.helper ),
        -			ho = helper.offset(),
        -			w = helper.outerWidth() - that.sizeDiff.width,
        -			h = helper.outerHeight() - that.sizeDiff.height;
        -
        -		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
        -			$( this ).css({
        -				left: ho.left - cop.left - co.left,
        -				width: w,
        -				height: h
        -			});
        -		}
        -
        -		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
        -			$( this ).css({
        -				left: ho.left - cop.left - co.left,
        -				width: w,
        -				height: h
        -			});
        -		}
        -	}
        -});
        -
        -$.ui.plugin.add("resizable", "alsoResize", {
        -
        -	start: function() {
        -		var that = $(this).resizable( "instance" ),
        -			o = that.options;
        -
        -		$(o.alsoResize).each(function() {
        -			var el = $(this);
        -			el.data("ui-resizable-alsoresize", {
        -				width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
        -				left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
        -			});
        -		});
        -	},
        -
        -	resize: function(event, ui) {
        -		var that = $(this).resizable( "instance" ),
        -			o = that.options,
        -			os = that.originalSize,
        -			op = that.originalPosition,
        -			delta = {
        -				height: (that.size.height - os.height) || 0,
        -				width: (that.size.width - os.width) || 0,
        -				top: (that.position.top - op.top) || 0,
        -				left: (that.position.left - op.left) || 0
        -			};
        -
        -			$(o.alsoResize).each(function() {
        -				var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
        -					css = el.parents(ui.originalElement[0]).length ?
        -							[ "width", "height" ] :
        -							[ "width", "height", "top", "left" ];
        -
        -				$.each(css, function(i, prop) {
        -					var sum = (start[prop] || 0) + (delta[prop] || 0);
        -					if (sum && sum >= 0) {
        -						style[prop] = sum || null;
        -					}
        -				});
        -
        -				el.css(style);
        -			});
        -	},
        -
        -	stop: function() {
        -		$(this).removeData("resizable-alsoresize");
        -	}
        -});
        -
        -$.ui.plugin.add("resizable", "ghost", {
        -
        -	start: function() {
        -
        -		var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
        -
        -		that.ghost = that.originalElement.clone();
        -		that.ghost
        -			.css({
        -				opacity: 0.25,
        -				display: "block",
        -				position: "relative",
        -				height: cs.height,
        -				width: cs.width,
        -				margin: 0,
        -				left: 0,
        -				top: 0
        -			})
        -			.addClass("ui-resizable-ghost")
        -			.addClass(typeof o.ghost === "string" ? o.ghost : "");
        -
        -		that.ghost.appendTo(that.helper);
        -
        -	},
        -
        -	resize: function() {
        -		var that = $(this).resizable( "instance" );
        -		if (that.ghost) {
        -			that.ghost.css({
        -				position: "relative",
        -				height: that.size.height,
        -				width: that.size.width
        -			});
        -		}
        -	},
        -
        -	stop: function() {
        -		var that = $(this).resizable( "instance" );
        -		if (that.ghost && that.helper) {
        -			that.helper.get(0).removeChild(that.ghost.get(0));
        -		}
        -	}
        -
        -});
        -
        -$.ui.plugin.add("resizable", "grid", {
        -
        -	resize: function() {
        -		var outerDimensions,
        -			that = $(this).resizable( "instance" ),
        -			o = that.options,
        -			cs = that.size,
        -			os = that.originalSize,
        -			op = that.originalPosition,
        -			a = that.axis,
        -			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
        -			gridX = (grid[0] || 1),
        -			gridY = (grid[1] || 1),
        -			ox = Math.round((cs.width - os.width) / gridX) * gridX,
        -			oy = Math.round((cs.height - os.height) / gridY) * gridY,
        -			newWidth = os.width + ox,
        -			newHeight = os.height + oy,
        -			isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
        -			isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
        -			isMinWidth = o.minWidth && (o.minWidth > newWidth),
        -			isMinHeight = o.minHeight && (o.minHeight > newHeight);
        -
        -		o.grid = grid;
        -
        -		if (isMinWidth) {
        -			newWidth += gridX;
        -		}
        -		if (isMinHeight) {
        -			newHeight += gridY;
        -		}
        -		if (isMaxWidth) {
        -			newWidth -= gridX;
        -		}
        -		if (isMaxHeight) {
        -			newHeight -= gridY;
        -		}
        -
        -		if (/^(se|s|e)$/.test(a)) {
        -			that.size.width = newWidth;
        -			that.size.height = newHeight;
        -		} else if (/^(ne)$/.test(a)) {
        -			that.size.width = newWidth;
        -			that.size.height = newHeight;
        -			that.position.top = op.top - oy;
        -		} else if (/^(sw)$/.test(a)) {
        -			that.size.width = newWidth;
        -			that.size.height = newHeight;
        -			that.position.left = op.left - ox;
        -		} else {
        -			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
        -				outerDimensions = that._getPaddingPlusBorderDimensions( this );
        -			}
        -
        -			if ( newHeight - gridY > 0 ) {
        -				that.size.height = newHeight;
        -				that.position.top = op.top - oy;
        -			} else {
        -				newHeight = gridY - outerDimensions.height;
        -				that.size.height = newHeight;
        -				that.position.top = op.top + os.height - newHeight;
        -			}
        -			if ( newWidth - gridX > 0 ) {
        -				that.size.width = newWidth;
        -				that.position.left = op.left - ox;
        -			} else {
        -				newWidth = gridX - outerDimensions.width;
        -				that.size.width = newWidth;
        -				that.position.left = op.left + os.width - newWidth;
        -			}
        -		}
        -	}
        -
        -});
        -
        -var resizable = $.ui.resizable;
        -
        -
        -/*!
        - * jQuery UI Dialog 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/dialog/
        - */
        -
        -
        -var dialog = $.widget( "ui.dialog", {
        -	version: "1.11.4",
        -	options: {
        -		appendTo: "body",
        -		autoOpen: true,
        -		buttons: [],
        -		closeOnEscape: true,
        -		closeText: "Close",
        -		dialogClass: "",
        -		draggable: true,
        -		hide: null,
        -		height: "auto",
        -		maxHeight: null,
        -		maxWidth: null,
        -		minHeight: 150,
        -		minWidth: 150,
        -		modal: false,
        -		position: {
        -			my: "center",
        -			at: "center",
        -			of: window,
        -			collision: "fit",
        -			// Ensure the titlebar is always visible
        -			using: function( pos ) {
        -				var topOffset = $( this ).css( pos ).offset().top;
        -				if ( topOffset < 0 ) {
        -					$( this ).css( "top", pos.top - topOffset );
        -				}
        -			}
        -		},
        -		resizable: true,
        -		show: null,
        -		title: null,
        -		width: 300,
        -
        -		// callbacks
        -		beforeClose: null,
        -		close: null,
        -		drag: null,
        -		dragStart: null,
        -		dragStop: null,
        -		focus: null,
        -		open: null,
        -		resize: null,
        -		resizeStart: null,
        -		resizeStop: null
        -	},
        -
        -	sizeRelatedOptions: {
        -		buttons: true,
        -		height: true,
        -		maxHeight: true,
        -		maxWidth: true,
        -		minHeight: true,
        -		minWidth: true,
        -		width: true
        -	},
        -
        -	resizableRelatedOptions: {
        -		maxHeight: true,
        -		maxWidth: true,
        -		minHeight: true,
        -		minWidth: true
        -	},
        -
        -	_create: function() {
        -		this.originalCss = {
        -			display: this.element[ 0 ].style.display,
        -			width: this.element[ 0 ].style.width,
        -			minHeight: this.element[ 0 ].style.minHeight,
        -			maxHeight: this.element[ 0 ].style.maxHeight,
        -			height: this.element[ 0 ].style.height
        -		};
        -		this.originalPosition = {
        -			parent: this.element.parent(),
        -			index: this.element.parent().children().index( this.element )
        -		};
        -		this.originalTitle = this.element.attr( "title" );
        -		this.options.title = this.options.title || this.originalTitle;
        -
        -		this._createWrapper();
        -
        -		this.element
        -			.show()
        -			.removeAttr( "title" )
        -			.addClass( "ui-dialog-content ui-widget-content" )
        -			.appendTo( this.uiDialog );
        -
        -		this._createTitlebar();
        -		this._createButtonPane();
        -
        -		if ( this.options.draggable && $.fn.draggable ) {
        -			this._makeDraggable();
        -		}
        -		if ( this.options.resizable && $.fn.resizable ) {
        -			this._makeResizable();
        -		}
        -
        -		this._isOpen = false;
        -
        -		this._trackFocus();
        -	},
        -
        -	_init: function() {
        -		if ( this.options.autoOpen ) {
        -			this.open();
        -		}
        -	},
        -
        -	_appendTo: function() {
        -		var element = this.options.appendTo;
        -		if ( element && (element.jquery || element.nodeType) ) {
        -			return $( element );
        -		}
        -		return this.document.find( element || "body" ).eq( 0 );
        -	},
        -
        -	_destroy: function() {
        -		var next,
        -			originalPosition = this.originalPosition;
        -
        -		this._untrackInstance();
        -		this._destroyOverlay();
        -
        -		this.element
        -			.removeUniqueId()
        -			.removeClass( "ui-dialog-content ui-widget-content" )
        -			.css( this.originalCss )
        -			// Without detaching first, the following becomes really slow
        -			.detach();
        -
        -		this.uiDialog.stop( true, true ).remove();
        -
        -		if ( this.originalTitle ) {
        -			this.element.attr( "title", this.originalTitle );
        -		}
        -
        -		next = originalPosition.parent.children().eq( originalPosition.index );
        -		// Don't try to place the dialog next to itself (#8613)
        -		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
        -			next.before( this.element );
        -		} else {
        -			originalPosition.parent.append( this.element );
        -		}
        -	},
        -
        -	widget: function() {
        -		return this.uiDialog;
        -	},
        -
        -	disable: $.noop,
        -	enable: $.noop,
        -
        -	close: function( event ) {
        -		var activeElement,
        -			that = this;
        -
        -		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
        -			return;
        -		}
        -
        -		this._isOpen = false;
        -		this._focusedElement = null;
        -		this._destroyOverlay();
        -		this._untrackInstance();
        -
        -		if ( !this.opener.filter( ":focusable" ).focus().length ) {
        -
        -			// support: IE9
        -			// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
        -			try {
        -				activeElement = this.document[ 0 ].activeElement;
        -
        -				// Support: IE9, IE10
        -				// If the <body> is blurred, IE will switch windows, see #4520
        -				if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) {
        -
        -					// Hiding a focused element doesn't trigger blur in WebKit
        -					// so in case we have nothing to focus on, explicitly blur the active element
        -					// https://bugs.webkit.org/show_bug.cgi?id=47182
        -					$( activeElement ).blur();
        -				}
        -			} catch ( error ) {}
        -		}
        -
        -		this._hide( this.uiDialog, this.options.hide, function() {
        -			that._trigger( "close", event );
        -		});
        -	},
        -
        -	isOpen: function() {
        -		return this._isOpen;
        -	},
        -
        -	moveToTop: function() {
        -		this._moveToTop();
        -	},
        -
        -	_moveToTop: function( event, silent ) {
        -		var moved = false,
        -			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
        -				return +$( this ).css( "z-index" );
        -			}).get(),
        -			zIndexMax = Math.max.apply( null, zIndices );
        -
        -		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
        -			this.uiDialog.css( "z-index", zIndexMax + 1 );
        -			moved = true;
        -		}
        -
        -		if ( moved && !silent ) {
        -			this._trigger( "focus", event );
        -		}
        -		return moved;
        -	},
        -
        -	open: function() {
        -		var that = this;
        -		if ( this._isOpen ) {
        -			if ( this._moveToTop() ) {
        -				this._focusTabbable();
        -			}
        -			return;
        -		}
        -
        -		this._isOpen = true;
        -		this.opener = $( this.document[ 0 ].activeElement );
        -
        -		this._size();
        -		this._position();
        -		this._createOverlay();
        -		this._moveToTop( null, true );
        -
        -		// Ensure the overlay is moved to the top with the dialog, but only when
        -		// opening. The overlay shouldn't move after the dialog is open so that
        -		// modeless dialogs opened after the modal dialog stack properly.
        -		if ( this.overlay ) {
        -			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
        -		}
        -
        -		this._show( this.uiDialog, this.options.show, function() {
        -			that._focusTabbable();
        -			that._trigger( "focus" );
        -		});
        -
        -		// Track the dialog immediately upon openening in case a focus event
        -		// somehow occurs outside of the dialog before an element inside the
        -		// dialog is focused (#10152)
        -		this._makeFocusTarget();
        -
        -		this._trigger( "open" );
        -	},
        -
        -	_focusTabbable: function() {
        -		// Set focus to the first match:
        -		// 1. An element that was focused previously
        -		// 2. First element inside the dialog matching [autofocus]
        -		// 3. Tabbable element inside the content element
        -		// 4. Tabbable element inside the buttonpane
        -		// 5. The close button
        -		// 6. The dialog itself
        -		var hasFocus = this._focusedElement;
        -		if ( !hasFocus ) {
        -			hasFocus = this.element.find( "[autofocus]" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.element.find( ":tabbable" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
        -		}
        -		if ( !hasFocus.length ) {
        -			hasFocus = this.uiDialog;
        -		}
        -		hasFocus.eq( 0 ).focus();
        -	},
        -
        -	_keepFocus: function( event ) {
        -		function checkFocus() {
        -			var activeElement = this.document[0].activeElement,
        -				isActive = this.uiDialog[0] === activeElement ||
        -					$.contains( this.uiDialog[0], activeElement );
        -			if ( !isActive ) {
        -				this._focusTabbable();
        -			}
        -		}
        -		event.preventDefault();
        -		checkFocus.call( this );
        -		// support: IE
        -		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
        -		// so we check again later
        -		this._delay( checkFocus );
        -	},
        -
        -	_createWrapper: function() {
        -		this.uiDialog = $("<div>")
        -			.addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
        -				this.options.dialogClass )
        -			.hide()
        -			.attr({
        -				// Setting tabIndex makes the div focusable
        -				tabIndex: -1,
        -				role: "dialog"
        -			})
        -			.appendTo( this._appendTo() );
        -
        -		this._on( this.uiDialog, {
        -			keydown: function( event ) {
        -				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
        -						event.keyCode === $.ui.keyCode.ESCAPE ) {
        -					event.preventDefault();
        -					this.close( event );
        -					return;
        -				}
        -
        -				// prevent tabbing out of dialogs
        -				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
        -					return;
        -				}
        -				var tabbables = this.uiDialog.find( ":tabbable" ),
        -					first = tabbables.filter( ":first" ),
        -					last = tabbables.filter( ":last" );
        -
        -				if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
        -					this._delay(function() {
        -						first.focus();
        -					});
        -					event.preventDefault();
        -				} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
        -					this._delay(function() {
        -						last.focus();
        -					});
        -					event.preventDefault();
        -				}
        -			},
        -			mousedown: function( event ) {
        -				if ( this._moveToTop( event ) ) {
        -					this._focusTabbable();
        -				}
        -			}
        -		});
        -
        -		// We assume that any existing aria-describedby attribute means
        -		// that the dialog content is marked up properly
        -		// otherwise we brute force the content as the description
        -		if ( !this.element.find( "[aria-describedby]" ).length ) {
        -			this.uiDialog.attr({
        -				"aria-describedby": this.element.uniqueId().attr( "id" )
        -			});
        -		}
        -	},
        -
        -	_createTitlebar: function() {
        -		var uiDialogTitle;
        -
        -		this.uiDialogTitlebar = $( "<div>" )
        -			.addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" )
        -			.prependTo( this.uiDialog );
        -		this._on( this.uiDialogTitlebar, {
        -			mousedown: function( event ) {
        -				// Don't prevent click on close button (#8838)
        -				// Focusing a dialog that is partially scrolled out of view
        -				// causes the browser to scroll it into view, preventing the click event
        -				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
        -					// Dialog isn't getting focus when dragging (#8063)
        -					this.uiDialog.focus();
        -				}
        -			}
        -		});
        -
        -		// support: IE
        -		// Use type="button" to prevent enter keypresses in textboxes from closing the
        -		// dialog in IE (#9312)
        -		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
        -			.button({
        -				label: this.options.closeText,
        -				icons: {
        -					primary: "ui-icon-closethick"
        -				},
        -				text: false
        -			})
        -			.addClass( "ui-dialog-titlebar-close" )
        -			.appendTo( this.uiDialogTitlebar );
        -		this._on( this.uiDialogTitlebarClose, {
        -			click: function( event ) {
        -				event.preventDefault();
        -				this.close( event );
        -			}
        -		});
        -
        -		uiDialogTitle = $( "<span>" )
        -			.uniqueId()
        -			.addClass( "ui-dialog-title" )
        -			.prependTo( this.uiDialogTitlebar );
        -		this._title( uiDialogTitle );
        -
        -		this.uiDialog.attr({
        -			"aria-labelledby": uiDialogTitle.attr( "id" )
        -		});
        -	},
        -
        -	_title: function( title ) {
        -		if ( !this.options.title ) {
        -			title.html( "&#160;" );
        -		}
        -		title.text( this.options.title );
        -	},
        -
        -	_createButtonPane: function() {
        -		this.uiDialogButtonPane = $( "<div>" )
        -			.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
        -
        -		this.uiButtonSet = $( "<div>" )
        -			.addClass( "ui-dialog-buttonset" )
        -			.appendTo( this.uiDialogButtonPane );
        -
        -		this._createButtons();
        -	},
        -
        -	_createButtons: function() {
        -		var that = this,
        -			buttons = this.options.buttons;
        -
        -		// if we already have a button pane, remove it
        -		this.uiDialogButtonPane.remove();
        -		this.uiButtonSet.empty();
        -
        -		if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
        -			this.uiDialog.removeClass( "ui-dialog-buttons" );
        -			return;
        -		}
        -
        -		$.each( buttons, function( name, props ) {
        -			var click, buttonOptions;
        -			props = $.isFunction( props ) ?
        -				{ click: props, text: name } :
        -				props;
        -			// Default to a non-submitting button
        -			props = $.extend( { type: "button" }, props );
        -			// Change the context for the click callback to be the main element
        -			click = props.click;
        -			props.click = function() {
        -				click.apply( that.element[ 0 ], arguments );
        -			};
        -			buttonOptions = {
        -				icons: props.icons,
        -				text: props.showText
        -			};
        -			delete props.icons;
        -			delete props.showText;
        -			$( "<button></button>", props )
        -				.button( buttonOptions )
        -				.appendTo( that.uiButtonSet );
        -		});
        -		this.uiDialog.addClass( "ui-dialog-buttons" );
        -		this.uiDialogButtonPane.appendTo( this.uiDialog );
        -	},
        -
        -	_makeDraggable: function() {
        -		var that = this,
        -			options = this.options;
        -
        -		function filteredUi( ui ) {
        -			return {
        -				position: ui.position,
        -				offset: ui.offset
        -			};
        -		}
        -
        -		this.uiDialog.draggable({
        -			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
        -			handle: ".ui-dialog-titlebar",
        -			containment: "document",
        -			start: function( event, ui ) {
        -				$( this ).addClass( "ui-dialog-dragging" );
        -				that._blockFrames();
        -				that._trigger( "dragStart", event, filteredUi( ui ) );
        -			},
        -			drag: function( event, ui ) {
        -				that._trigger( "drag", event, filteredUi( ui ) );
        -			},
        -			stop: function( event, ui ) {
        -				var left = ui.offset.left - that.document.scrollLeft(),
        -					top = ui.offset.top - that.document.scrollTop();
        -
        -				options.position = {
        -					my: "left top",
        -					at: "left" + (left >= 0 ? "+" : "") + left + " " +
        -						"top" + (top >= 0 ? "+" : "") + top,
        -					of: that.window
        -				};
        -				$( this ).removeClass( "ui-dialog-dragging" );
        -				that._unblockFrames();
        -				that._trigger( "dragStop", event, filteredUi( ui ) );
        -			}
        -		});
        -	},
        -
        -	_makeResizable: function() {
        -		var that = this,
        -			options = this.options,
        -			handles = options.resizable,
        -			// .ui-resizable has position: relative defined in the stylesheet
        -			// but dialogs have to use absolute or fixed positioning
        -			position = this.uiDialog.css("position"),
        -			resizeHandles = typeof handles === "string" ?
        -				handles	:
        -				"n,e,s,w,se,sw,ne,nw";
        -
        -		function filteredUi( ui ) {
        -			return {
        -				originalPosition: ui.originalPosition,
        -				originalSize: ui.originalSize,
        -				position: ui.position,
        -				size: ui.size
        -			};
        -		}
        -
        -		this.uiDialog.resizable({
        -			cancel: ".ui-dialog-content",
        -			containment: "document",
        -			alsoResize: this.element,
        -			maxWidth: options.maxWidth,
        -			maxHeight: options.maxHeight,
        -			minWidth: options.minWidth,
        -			minHeight: this._minHeight(),
        -			handles: resizeHandles,
        -			start: function( event, ui ) {
        -				$( this ).addClass( "ui-dialog-resizing" );
        -				that._blockFrames();
        -				that._trigger( "resizeStart", event, filteredUi( ui ) );
        -			},
        -			resize: function( event, ui ) {
        -				that._trigger( "resize", event, filteredUi( ui ) );
        -			},
        -			stop: function( event, ui ) {
        -				var offset = that.uiDialog.offset(),
        -					left = offset.left - that.document.scrollLeft(),
        -					top = offset.top - that.document.scrollTop();
        -
        -				options.height = that.uiDialog.height();
        -				options.width = that.uiDialog.width();
        -				options.position = {
        -					my: "left top",
        -					at: "left" + (left >= 0 ? "+" : "") + left + " " +
        -						"top" + (top >= 0 ? "+" : "") + top,
        -					of: that.window
        -				};
        -				$( this ).removeClass( "ui-dialog-resizing" );
        -				that._unblockFrames();
        -				that._trigger( "resizeStop", event, filteredUi( ui ) );
        -			}
        -		})
        -		.css( "position", position );
        -	},
        -
        -	_trackFocus: function() {
        -		this._on( this.widget(), {
        -			focusin: function( event ) {
        -				this._makeFocusTarget();
        -				this._focusedElement = $( event.target );
        -			}
        -		});
        -	},
        -
        -	_makeFocusTarget: function() {
        -		this._untrackInstance();
        -		this._trackingInstances().unshift( this );
        -	},
        -
        -	_untrackInstance: function() {
        -		var instances = this._trackingInstances(),
        -			exists = $.inArray( this, instances );
        -		if ( exists !== -1 ) {
        -			instances.splice( exists, 1 );
        -		}
        -	},
        -
        -	_trackingInstances: function() {
        -		var instances = this.document.data( "ui-dialog-instances" );
        -		if ( !instances ) {
        -			instances = [];
        -			this.document.data( "ui-dialog-instances", instances );
        -		}
        -		return instances;
        -	},
        -
        -	_minHeight: function() {
        -		var options = this.options;
        -
        -		return options.height === "auto" ?
        -			options.minHeight :
        -			Math.min( options.minHeight, options.height );
        -	},
        -
        -	_position: function() {
        -		// Need to show the dialog to get the actual offset in the position plugin
        -		var isVisible = this.uiDialog.is( ":visible" );
        -		if ( !isVisible ) {
        -			this.uiDialog.show();
        -		}
        -		this.uiDialog.position( this.options.position );
        -		if ( !isVisible ) {
        -			this.uiDialog.hide();
        -		}
        -	},
        -
        -	_setOptions: function( options ) {
        -		var that = this,
        -			resize = false,
        -			resizableOptions = {};
        -
        -		$.each( options, function( key, value ) {
        -			that._setOption( key, value );
        -
        -			if ( key in that.sizeRelatedOptions ) {
        -				resize = true;
        -			}
        -			if ( key in that.resizableRelatedOptions ) {
        -				resizableOptions[ key ] = value;
        -			}
        -		});
        -
        -		if ( resize ) {
        -			this._size();
        -			this._position();
        -		}
        -		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        -			this.uiDialog.resizable( "option", resizableOptions );
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		var isDraggable, isResizable,
        -			uiDialog = this.uiDialog;
        -
        -		if ( key === "dialogClass" ) {
        -			uiDialog
        -				.removeClass( this.options.dialogClass )
        -				.addClass( value );
        -		}
        -
        -		if ( key === "disabled" ) {
        -			return;
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "appendTo" ) {
        -			this.uiDialog.appendTo( this._appendTo() );
        -		}
        -
        -		if ( key === "buttons" ) {
        -			this._createButtons();
        -		}
        -
        -		if ( key === "closeText" ) {
        -			this.uiDialogTitlebarClose.button({
        -				// Ensure that we always pass a string
        -				label: "" + value
        -			});
        -		}
        -
        -		if ( key === "draggable" ) {
        -			isDraggable = uiDialog.is( ":data(ui-draggable)" );
        -			if ( isDraggable && !value ) {
        -				uiDialog.draggable( "destroy" );
        -			}
        -
        -			if ( !isDraggable && value ) {
        -				this._makeDraggable();
        -			}
        -		}
        -
        -		if ( key === "position" ) {
        -			this._position();
        -		}
        -
        -		if ( key === "resizable" ) {
        -			// currently resizable, becoming non-resizable
        -			isResizable = uiDialog.is( ":data(ui-resizable)" );
        -			if ( isResizable && !value ) {
        -				uiDialog.resizable( "destroy" );
        -			}
        -
        -			// currently resizable, changing handles
        -			if ( isResizable && typeof value === "string" ) {
        -				uiDialog.resizable( "option", "handles", value );
        -			}
        -
        -			// currently non-resizable, becoming resizable
        -			if ( !isResizable && value !== false ) {
        -				this._makeResizable();
        -			}
        -		}
        -
        -		if ( key === "title" ) {
        -			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
        -		}
        -	},
        -
        -	_size: function() {
        -		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
        -		// divs will both have width and height set, so we need to reset them
        -		var nonContentHeight, minContentHeight, maxContentHeight,
        -			options = this.options;
        -
        -		// Reset content sizing
        -		this.element.show().css({
        -			width: "auto",
        -			minHeight: 0,
        -			maxHeight: "none",
        -			height: 0
        -		});
        -
        -		if ( options.minWidth > options.width ) {
        -			options.width = options.minWidth;
        -		}
        -
        -		// reset wrapper sizing
        -		// determine the height of all the non-content elements
        -		nonContentHeight = this.uiDialog.css({
        -				height: "auto",
        -				width: options.width
        -			})
        -			.outerHeight();
        -		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
        -		maxContentHeight = typeof options.maxHeight === "number" ?
        -			Math.max( 0, options.maxHeight - nonContentHeight ) :
        -			"none";
        -
        -		if ( options.height === "auto" ) {
        -			this.element.css({
        -				minHeight: minContentHeight,
        -				maxHeight: maxContentHeight,
        -				height: "auto"
        -			});
        -		} else {
        -			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
        -		}
        -
        -		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
        -			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
        -		}
        -	},
        -
        -	_blockFrames: function() {
        -		this.iframeBlocks = this.document.find( "iframe" ).map(function() {
        -			var iframe = $( this );
        -
        -			return $( "<div>" )
        -				.css({
        -					position: "absolute",
        -					width: iframe.outerWidth(),
        -					height: iframe.outerHeight()
        -				})
        -				.appendTo( iframe.parent() )
        -				.offset( iframe.offset() )[0];
        -		});
        -	},
        -
        -	_unblockFrames: function() {
        -		if ( this.iframeBlocks ) {
        -			this.iframeBlocks.remove();
        -			delete this.iframeBlocks;
        -		}
        -	},
        -
        -	_allowInteraction: function( event ) {
        -		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
        -			return true;
        -		}
        -
        -		// TODO: Remove hack when datepicker implements
        -		// the .ui-front logic (#8989)
        -		return !!$( event.target ).closest( ".ui-datepicker" ).length;
        -	},
        -
        -	_createOverlay: function() {
        -		if ( !this.options.modal ) {
        -			return;
        -		}
        -
        -		// We use a delay in case the overlay is created from an
        -		// event that we're going to be cancelling (#2804)
        -		var isOpening = true;
        -		this._delay(function() {
        -			isOpening = false;
        -		});
        -
        -		if ( !this.document.data( "ui-dialog-overlays" ) ) {
        -
        -			// Prevent use of anchors and inputs
        -			// Using _on() for an event handler shared across many instances is
        -			// safe because the dialogs stack and must be closed in reverse order
        -			this._on( this.document, {
        -				focusin: function( event ) {
        -					if ( isOpening ) {
        -						return;
        -					}
        -
        -					if ( !this._allowInteraction( event ) ) {
        -						event.preventDefault();
        -						this._trackingInstances()[ 0 ]._focusTabbable();
        -					}
        -				}
        -			});
        -		}
        -
        -		this.overlay = $( "<div>" )
        -			.addClass( "ui-widget-overlay ui-front" )
        -			.appendTo( this._appendTo() );
        -		this._on( this.overlay, {
        -			mousedown: "_keepFocus"
        -		});
        -		this.document.data( "ui-dialog-overlays",
        -			(this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
        -	},
        -
        -	_destroyOverlay: function() {
        -		if ( !this.options.modal ) {
        -			return;
        -		}
        -
        -		if ( this.overlay ) {
        -			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
        -
        -			if ( !overlays ) {
        -				this.document
        -					.unbind( "focusin" )
        -					.removeData( "ui-dialog-overlays" );
        -			} else {
        -				this.document.data( "ui-dialog-overlays", overlays );
        -			}
        -
        -			this.overlay.remove();
        -			this.overlay = null;
        -		}
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Droppable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/droppable/
        - */
        -
        -
        -$.widget( "ui.droppable", {
        -	version: "1.11.4",
        -	widgetEventPrefix: "drop",
        -	options: {
        -		accept: "*",
        -		activeClass: false,
        -		addClasses: true,
        -		greedy: false,
        -		hoverClass: false,
        -		scope: "default",
        -		tolerance: "intersect",
        -
        -		// callbacks
        -		activate: null,
        -		deactivate: null,
        -		drop: null,
        -		out: null,
        -		over: null
        -	},
        -	_create: function() {
        -
        -		var proportions,
        -			o = this.options,
        -			accept = o.accept;
        -
        -		this.isover = false;
        -		this.isout = true;
        -
        -		this.accept = $.isFunction( accept ) ? accept : function( d ) {
        -			return d.is( accept );
        -		};
        -
        -		this.proportions = function( /* valueToWrite */ ) {
        -			if ( arguments.length ) {
        -				// Store the droppable's proportions
        -				proportions = arguments[ 0 ];
        -			} else {
        -				// Retrieve or derive the droppable's proportions
        -				return proportions ?
        -					proportions :
        -					proportions = {
        -						width: this.element[ 0 ].offsetWidth,
        -						height: this.element[ 0 ].offsetHeight
        -					};
        -			}
        -		};
        -
        -		this._addToManager( o.scope );
        -
        -		o.addClasses && this.element.addClass( "ui-droppable" );
        -
        -	},
        -
        -	_addToManager: function( scope ) {
        -		// Add the reference and positions to the manager
        -		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
        -		$.ui.ddmanager.droppables[ scope ].push( this );
        -	},
        -
        -	_splice: function( drop ) {
        -		var i = 0;
        -		for ( ; i < drop.length; i++ ) {
        -			if ( drop[ i ] === this ) {
        -				drop.splice( i, 1 );
        -			}
        -		}
        -	},
        -
        -	_destroy: function() {
        -		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        -
        -		this._splice( drop );
        -
        -		this.element.removeClass( "ui-droppable ui-droppable-disabled" );
        -	},
        -
        -	_setOption: function( key, value ) {
        -
        -		if ( key === "accept" ) {
        -			this.accept = $.isFunction( value ) ? value : function( d ) {
        -				return d.is( value );
        -			};
        -		} else if ( key === "scope" ) {
        -			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
        -
        -			this._splice( drop );
        -			this._addToManager( value );
        -		}
        -
        -		this._super( key, value );
        -	},
        -
        -	_activate: function( event ) {
        -		var draggable = $.ui.ddmanager.current;
        -		if ( this.options.activeClass ) {
        -			this.element.addClass( this.options.activeClass );
        -		}
        -		if ( draggable ){
        -			this._trigger( "activate", event, this.ui( draggable ) );
        -		}
        -	},
        -
        -	_deactivate: function( event ) {
        -		var draggable = $.ui.ddmanager.current;
        -		if ( this.options.activeClass ) {
        -			this.element.removeClass( this.options.activeClass );
        -		}
        -		if ( draggable ){
        -			this._trigger( "deactivate", event, this.ui( draggable ) );
        -		}
        -	},
        -
        -	_over: function( event ) {
        -
        -		var draggable = $.ui.ddmanager.current;
        -
        -		// Bail if draggable and droppable are same element
        -		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
        -			return;
        -		}
        -
        -		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -			if ( this.options.hoverClass ) {
        -				this.element.addClass( this.options.hoverClass );
        -			}
        -			this._trigger( "over", event, this.ui( draggable ) );
        -		}
        -
        -	},
        -
        -	_out: function( event ) {
        -
        -		var draggable = $.ui.ddmanager.current;
        -
        -		// Bail if draggable and droppable are same element
        -		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
        -			return;
        -		}
        -
        -		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -			if ( this.options.hoverClass ) {
        -				this.element.removeClass( this.options.hoverClass );
        -			}
        -			this._trigger( "out", event, this.ui( draggable ) );
        -		}
        -
        -	},
        -
        -	_drop: function( event, custom ) {
        -
        -		var draggable = custom || $.ui.ddmanager.current,
        -			childrenIntersection = false;
        -
        -		// Bail if draggable and droppable are same element
        -		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
        -			return false;
        -		}
        -
        -		this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
        -			var inst = $( this ).droppable( "instance" );
        -			if (
        -				inst.options.greedy &&
        -				!inst.options.disabled &&
        -				inst.options.scope === draggable.options.scope &&
        -				inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
        -				$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
        -			) { childrenIntersection = true; return false; }
        -		});
        -		if ( childrenIntersection ) {
        -			return false;
        -		}
        -
        -		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -			if ( this.options.activeClass ) {
        -				this.element.removeClass( this.options.activeClass );
        -			}
        -			if ( this.options.hoverClass ) {
        -				this.element.removeClass( this.options.hoverClass );
        -			}
        -			this._trigger( "drop", event, this.ui( draggable ) );
        -			return this.element;
        -		}
        -
        -		return false;
        -
        -	},
        -
        -	ui: function( c ) {
        -		return {
        -			draggable: ( c.currentItem || c.element ),
        -			helper: c.helper,
        -			position: c.position,
        -			offset: c.positionAbs
        -		};
        -	}
        -
        -});
        -
        -$.ui.intersect = (function() {
        -	function isOverAxis( x, reference, size ) {
        -		return ( x >= reference ) && ( x < ( reference + size ) );
        -	}
        -
        -	return function( draggable, droppable, toleranceMode, event ) {
        -
        -		if ( !droppable.offset ) {
        -			return false;
        -		}
        -
        -		var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
        -			y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
        -			x2 = x1 + draggable.helperProportions.width,
        -			y2 = y1 + draggable.helperProportions.height,
        -			l = droppable.offset.left,
        -			t = droppable.offset.top,
        -			r = l + droppable.proportions().width,
        -			b = t + droppable.proportions().height;
        -
        -		switch ( toleranceMode ) {
        -		case "fit":
        -			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
        -		case "intersect":
        -			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
        -				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
        -				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
        -				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
        -		case "pointer":
        -			return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
        -		case "touch":
        -			return (
        -				( y1 >= t && y1 <= b ) || // Top edge touching
        -				( y2 >= t && y2 <= b ) || // Bottom edge touching
        -				( y1 < t && y2 > b ) // Surrounded vertically
        -			) && (
        -				( x1 >= l && x1 <= r ) || // Left edge touching
        -				( x2 >= l && x2 <= r ) || // Right edge touching
        -				( x1 < l && x2 > r ) // Surrounded horizontally
        -			);
        -		default:
        -			return false;
        -		}
        -	};
        -})();
        -
        -/*
        -	This manager tracks offsets of draggables and droppables
        -*/
        -$.ui.ddmanager = {
        -	current: null,
        -	droppables: { "default": [] },
        -	prepareOffsets: function( t, event ) {
        -
        -		var i, j,
        -			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
        -			type = event ? event.type : null, // workaround for #2317
        -			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
        -
        -		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
        -
        -			// No disabled and non-accepted
        -			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
        -				continue;
        -			}
        -
        -			// Filter out elements in the current dragged item
        -			for ( j = 0; j < list.length; j++ ) {
        -				if ( list[ j ] === m[ i ].element[ 0 ] ) {
        -					m[ i ].proportions().height = 0;
        -					continue droppablesLoop;
        -				}
        -			}
        -
        -			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
        -			if ( !m[ i ].visible ) {
        -				continue;
        -			}
        -
        -			// Activate the droppable if used directly from draggables
        -			if ( type === "mousedown" ) {
        -				m[ i ]._activate.call( m[ i ], event );
        -			}
        -
        -			m[ i ].offset = m[ i ].element.offset();
        -			m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
        -
        -		}
        -
        -	},
        -	drop: function( draggable, event ) {
        -
        -		var dropped = false;
        -		// Create a copy of the droppables in case the list changes during the drop (#9116)
        -		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
        -
        -			if ( !this.options ) {
        -				return;
        -			}
        -			if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
        -				dropped = this._drop.call( this, event ) || dropped;
        -			}
        -
        -			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
        -				this.isout = true;
        -				this.isover = false;
        -				this._deactivate.call( this, event );
        -			}
        -
        -		});
        -		return dropped;
        -
        -	},
        -	dragStart: function( draggable, event ) {
        -		// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
        -		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
        -			if ( !draggable.options.refreshPositions ) {
        -				$.ui.ddmanager.prepareOffsets( draggable, event );
        -			}
        -		});
        -	},
        -	drag: function( draggable, event ) {
        -
        -		// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
        -		if ( draggable.options.refreshPositions ) {
        -			$.ui.ddmanager.prepareOffsets( draggable, event );
        -		}
        -
        -		// Run through all droppables and check their positions based on specific tolerance options
        -		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
        -
        -			if ( this.options.disabled || this.greedyChild || !this.visible ) {
        -				return;
        -			}
        -
        -			var parentInstance, scope, parent,
        -				intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
        -				c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
        -			if ( !c ) {
        -				return;
        -			}
        -
        -			if ( this.options.greedy ) {
        -				// find droppable parents with same scope
        -				scope = this.options.scope;
        -				parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
        -					return $( this ).droppable( "instance" ).options.scope === scope;
        -				});
        -
        -				if ( parent.length ) {
        -					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
        -					parentInstance.greedyChild = ( c === "isover" );
        -				}
        -			}
        -
        -			// we just moved into a greedy child
        -			if ( parentInstance && c === "isover" ) {
        -				parentInstance.isover = false;
        -				parentInstance.isout = true;
        -				parentInstance._out.call( parentInstance, event );
        -			}
        -
        -			this[ c ] = true;
        -			this[c === "isout" ? "isover" : "isout"] = false;
        -			this[c === "isover" ? "_over" : "_out"].call( this, event );
        -
        -			// we just moved out of a greedy child
        -			if ( parentInstance && c === "isout" ) {
        -				parentInstance.isout = false;
        -				parentInstance.isover = true;
        -				parentInstance._over.call( parentInstance, event );
        -			}
        -		});
        -
        -	},
        -	dragStop: function( draggable, event ) {
        -		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
        -		// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
        -		if ( !draggable.options.refreshPositions ) {
        -			$.ui.ddmanager.prepareOffsets( draggable, event );
        -		}
        -	}
        -};
        -
        -var droppable = $.ui.droppable;
        -
        -
        -/*!
        - * jQuery UI Effects 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/category/effects-core/
        - */
        -
        -
        -var dataSpace = "ui-effects-",
        -
        -	// Create a local jQuery because jQuery Color relies on it and the
        -	// global may not exist with AMD and a custom build (#10199)
        -	jQuery = $;
        -
        -$.effects = {
        -	effect: {}
        -};
        -
        -/*!
        - * jQuery Color Animations v2.1.2
        - * https://github.com/jquery/jquery-color
        - *
        - * Copyright 2014 jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * Date: Wed Jan 16 08:47:09 2013 -0600
        - */
        -(function( jQuery, undefined ) {
        -
        -	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
        -
        -	// plusequals test for += 100 -= 100
        -	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
        -	// a set of RE's that can match strings and generate color tuples.
        -	stringParsers = [ {
        -			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        -			parse: function( execResult ) {
        -				return [
        -					execResult[ 1 ],
        -					execResult[ 2 ],
        -					execResult[ 3 ],
        -					execResult[ 4 ]
        -				];
        -			}
        -		}, {
        -			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        -			parse: function( execResult ) {
        -				return [
        -					execResult[ 1 ] * 2.55,
        -					execResult[ 2 ] * 2.55,
        -					execResult[ 3 ] * 2.55,
        -					execResult[ 4 ]
        -				];
        -			}
        -		}, {
        -			// this regex ignores A-F because it's compared against an already lowercased string
        -			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
        -			parse: function( execResult ) {
        -				return [
        -					parseInt( execResult[ 1 ], 16 ),
        -					parseInt( execResult[ 2 ], 16 ),
        -					parseInt( execResult[ 3 ], 16 )
        -				];
        -			}
        -		}, {
        -			// this regex ignores A-F because it's compared against an already lowercased string
        -			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
        -			parse: function( execResult ) {
        -				return [
        -					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
        -					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
        -					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
        -				];
        -			}
        -		}, {
        -			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
        -			space: "hsla",
        -			parse: function( execResult ) {
        -				return [
        -					execResult[ 1 ],
        -					execResult[ 2 ] / 100,
        -					execResult[ 3 ] / 100,
        -					execResult[ 4 ]
        -				];
        -			}
        -		} ],
        -
        -	// jQuery.Color( )
        -	color = jQuery.Color = function( color, green, blue, alpha ) {
        -		return new jQuery.Color.fn.parse( color, green, blue, alpha );
        -	},
        -	spaces = {
        -		rgba: {
        -			props: {
        -				red: {
        -					idx: 0,
        -					type: "byte"
        -				},
        -				green: {
        -					idx: 1,
        -					type: "byte"
        -				},
        -				blue: {
        -					idx: 2,
        -					type: "byte"
        -				}
        -			}
        -		},
        -
        -		hsla: {
        -			props: {
        -				hue: {
        -					idx: 0,
        -					type: "degrees"
        -				},
        -				saturation: {
        -					idx: 1,
        -					type: "percent"
        -				},
        -				lightness: {
        -					idx: 2,
        -					type: "percent"
        -				}
        -			}
        -		}
        -	},
        -	propTypes = {
        -		"byte": {
        -			floor: true,
        -			max: 255
        -		},
        -		"percent": {
        -			max: 1
        -		},
        -		"degrees": {
        -			mod: 360,
        -			floor: true
        -		}
        -	},
        -	support = color.support = {},
        -
        -	// element for support tests
        -	supportElem = jQuery( "<p>" )[ 0 ],
        -
        -	// colors = jQuery.Color.names
        -	colors,
        -
        -	// local aliases of functions called often
        -	each = jQuery.each;
        -
        -// determine rgba support immediately
        -supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
        -support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
        -
        -// define cache name and alpha properties
        -// for rgba and hsla spaces
        -each( spaces, function( spaceName, space ) {
        -	space.cache = "_" + spaceName;
        -	space.props.alpha = {
        -		idx: 3,
        -		type: "percent",
        -		def: 1
        -	};
        -});
        -
        -function clamp( value, prop, allowEmpty ) {
        -	var type = propTypes[ prop.type ] || {};
        -
        -	if ( value == null ) {
        -		return (allowEmpty || !prop.def) ? null : prop.def;
        -	}
        -
        -	// ~~ is an short way of doing floor for positive numbers
        -	value = type.floor ? ~~value : parseFloat( value );
        -
        -	// IE will pass in empty strings as value for alpha,
        -	// which will hit this case
        -	if ( isNaN( value ) ) {
        -		return prop.def;
        -	}
        -
        -	if ( type.mod ) {
        -		// we add mod before modding to make sure that negatives values
        -		// get converted properly: -10 -> 350
        -		return (value + type.mod) % type.mod;
        -	}
        -
        -	// for now all property types without mod have min and max
        -	return 0 > value ? 0 : type.max < value ? type.max : value;
        -}
        -
        -function stringParse( string ) {
        -	var inst = color(),
        -		rgba = inst._rgba = [];
        -
        -	string = string.toLowerCase();
        -
        -	each( stringParsers, function( i, parser ) {
        -		var parsed,
        -			match = parser.re.exec( string ),
        -			values = match && parser.parse( match ),
        -			spaceName = parser.space || "rgba";
        -
        -		if ( values ) {
        -			parsed = inst[ spaceName ]( values );
        -
        -			// if this was an rgba parse the assignment might happen twice
        -			// oh well....
        -			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
        -			rgba = inst._rgba = parsed._rgba;
        -
        -			// exit each( stringParsers ) here because we matched
        -			return false;
        -		}
        -	});
        -
        -	// Found a stringParser that handled it
        -	if ( rgba.length ) {
        -
        -		// if this came from a parsed string, force "transparent" when alpha is 0
        -		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
        -		if ( rgba.join() === "0,0,0,0" ) {
        -			jQuery.extend( rgba, colors.transparent );
        -		}
        -		return inst;
        -	}
        -
        -	// named colors
        -	return colors[ string ];
        -}
        -
        -color.fn = jQuery.extend( color.prototype, {
        -	parse: function( red, green, blue, alpha ) {
        -		if ( red === undefined ) {
        -			this._rgba = [ null, null, null, null ];
        -			return this;
        -		}
        -		if ( red.jquery || red.nodeType ) {
        -			red = jQuery( red ).css( green );
        -			green = undefined;
        -		}
        -
        -		var inst = this,
        -			type = jQuery.type( red ),
        -			rgba = this._rgba = [];
        -
        -		// more than 1 argument specified - assume ( red, green, blue, alpha )
        -		if ( green !== undefined ) {
        -			red = [ red, green, blue, alpha ];
        -			type = "array";
        -		}
        -
        -		if ( type === "string" ) {
        -			return this.parse( stringParse( red ) || colors._default );
        -		}
        -
        -		if ( type === "array" ) {
        -			each( spaces.rgba.props, function( key, prop ) {
        -				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
        -			});
        -			return this;
        -		}
        -
        -		if ( type === "object" ) {
        -			if ( red instanceof color ) {
        -				each( spaces, function( spaceName, space ) {
        -					if ( red[ space.cache ] ) {
        -						inst[ space.cache ] = red[ space.cache ].slice();
        -					}
        -				});
        -			} else {
        -				each( spaces, function( spaceName, space ) {
        -					var cache = space.cache;
        -					each( space.props, function( key, prop ) {
        -
        -						// if the cache doesn't exist, and we know how to convert
        -						if ( !inst[ cache ] && space.to ) {
        -
        -							// if the value was null, we don't need to copy it
        -							// if the key was alpha, we don't need to copy it either
        -							if ( key === "alpha" || red[ key ] == null ) {
        -								return;
        -							}
        -							inst[ cache ] = space.to( inst._rgba );
        -						}
        -
        -						// this is the only case where we allow nulls for ALL properties.
        -						// call clamp with alwaysAllowEmpty
        -						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
        -					});
        -
        -					// everything defined but alpha?
        -					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
        -						// use the default of 1
        -						inst[ cache ][ 3 ] = 1;
        -						if ( space.from ) {
        -							inst._rgba = space.from( inst[ cache ] );
        -						}
        -					}
        -				});
        -			}
        -			return this;
        -		}
        -	},
        -	is: function( compare ) {
        -		var is = color( compare ),
        -			same = true,
        -			inst = this;
        -
        -		each( spaces, function( _, space ) {
        -			var localCache,
        -				isCache = is[ space.cache ];
        -			if (isCache) {
        -				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
        -				each( space.props, function( _, prop ) {
        -					if ( isCache[ prop.idx ] != null ) {
        -						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
        -						return same;
        -					}
        -				});
        -			}
        -			return same;
        -		});
        -		return same;
        -	},
        -	_space: function() {
        -		var used = [],
        -			inst = this;
        -		each( spaces, function( spaceName, space ) {
        -			if ( inst[ space.cache ] ) {
        -				used.push( spaceName );
        -			}
        -		});
        -		return used.pop();
        -	},
        -	transition: function( other, distance ) {
        -		var end = color( other ),
        -			spaceName = end._space(),
        -			space = spaces[ spaceName ],
        -			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
        -			start = startColor[ space.cache ] || space.to( startColor._rgba ),
        -			result = start.slice();
        -
        -		end = end[ space.cache ];
        -		each( space.props, function( key, prop ) {
        -			var index = prop.idx,
        -				startValue = start[ index ],
        -				endValue = end[ index ],
        -				type = propTypes[ prop.type ] || {};
        -
        -			// if null, don't override start value
        -			if ( endValue === null ) {
        -				return;
        -			}
        -			// if null - use end
        -			if ( startValue === null ) {
        -				result[ index ] = endValue;
        -			} else {
        -				if ( type.mod ) {
        -					if ( endValue - startValue > type.mod / 2 ) {
        -						startValue += type.mod;
        -					} else if ( startValue - endValue > type.mod / 2 ) {
        -						startValue -= type.mod;
        -					}
        -				}
        -				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
        -			}
        -		});
        -		return this[ spaceName ]( result );
        -	},
        -	blend: function( opaque ) {
        -		// if we are already opaque - return ourself
        -		if ( this._rgba[ 3 ] === 1 ) {
        -			return this;
        -		}
        -
        -		var rgb = this._rgba.slice(),
        -			a = rgb.pop(),
        -			blend = color( opaque )._rgba;
        -
        -		return color( jQuery.map( rgb, function( v, i ) {
        -			return ( 1 - a ) * blend[ i ] + a * v;
        -		}));
        -	},
        -	toRgbaString: function() {
        -		var prefix = "rgba(",
        -			rgba = jQuery.map( this._rgba, function( v, i ) {
        -				return v == null ? ( i > 2 ? 1 : 0 ) : v;
        -			});
        -
        -		if ( rgba[ 3 ] === 1 ) {
        -			rgba.pop();
        -			prefix = "rgb(";
        -		}
        -
        -		return prefix + rgba.join() + ")";
        -	},
        -	toHslaString: function() {
        -		var prefix = "hsla(",
        -			hsla = jQuery.map( this.hsla(), function( v, i ) {
        -				if ( v == null ) {
        -					v = i > 2 ? 1 : 0;
        -				}
        -
        -				// catch 1 and 2
        -				if ( i && i < 3 ) {
        -					v = Math.round( v * 100 ) + "%";
        -				}
        -				return v;
        -			});
        -
        -		if ( hsla[ 3 ] === 1 ) {
        -			hsla.pop();
        -			prefix = "hsl(";
        -		}
        -		return prefix + hsla.join() + ")";
        -	},
        -	toHexString: function( includeAlpha ) {
        -		var rgba = this._rgba.slice(),
        -			alpha = rgba.pop();
        -
        -		if ( includeAlpha ) {
        -			rgba.push( ~~( alpha * 255 ) );
        -		}
        -
        -		return "#" + jQuery.map( rgba, function( v ) {
        -
        -			// default to 0 when nulls exist
        -			v = ( v || 0 ).toString( 16 );
        -			return v.length === 1 ? "0" + v : v;
        -		}).join("");
        -	},
        -	toString: function() {
        -		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
        -	}
        -});
        -color.fn.parse.prototype = color.fn;
        -
        -// hsla conversions adapted from:
        -// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
        -
        -function hue2rgb( p, q, h ) {
        -	h = ( h + 1 ) % 1;
        -	if ( h * 6 < 1 ) {
        -		return p + ( q - p ) * h * 6;
        -	}
        -	if ( h * 2 < 1) {
        -		return q;
        -	}
        -	if ( h * 3 < 2 ) {
        -		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
        -	}
        -	return p;
        -}
        -
        -spaces.hsla.to = function( rgba ) {
        -	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
        -		return [ null, null, null, rgba[ 3 ] ];
        -	}
        -	var r = rgba[ 0 ] / 255,
        -		g = rgba[ 1 ] / 255,
        -		b = rgba[ 2 ] / 255,
        -		a = rgba[ 3 ],
        -		max = Math.max( r, g, b ),
        -		min = Math.min( r, g, b ),
        -		diff = max - min,
        -		add = max + min,
        -		l = add * 0.5,
        -		h, s;
        -
        -	if ( min === max ) {
        -		h = 0;
        -	} else if ( r === max ) {
        -		h = ( 60 * ( g - b ) / diff ) + 360;
        -	} else if ( g === max ) {
        -		h = ( 60 * ( b - r ) / diff ) + 120;
        -	} else {
        -		h = ( 60 * ( r - g ) / diff ) + 240;
        -	}
        -
        -	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
        -	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
        -	if ( diff === 0 ) {
        -		s = 0;
        -	} else if ( l <= 0.5 ) {
        -		s = diff / add;
        -	} else {
        -		s = diff / ( 2 - add );
        -	}
        -	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
        -};
        -
        -spaces.hsla.from = function( hsla ) {
        -	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
        -		return [ null, null, null, hsla[ 3 ] ];
        -	}
        -	var h = hsla[ 0 ] / 360,
        -		s = hsla[ 1 ],
        -		l = hsla[ 2 ],
        -		a = hsla[ 3 ],
        -		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
        -		p = 2 * l - q;
        -
        -	return [
        -		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
        -		Math.round( hue2rgb( p, q, h ) * 255 ),
        -		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
        -		a
        -	];
        -};
        -
        -each( spaces, function( spaceName, space ) {
        -	var props = space.props,
        -		cache = space.cache,
        -		to = space.to,
        -		from = space.from;
        -
        -	// makes rgba() and hsla()
        -	color.fn[ spaceName ] = function( value ) {
        -
        -		// generate a cache for this space if it doesn't exist
        -		if ( to && !this[ cache ] ) {
        -			this[ cache ] = to( this._rgba );
        -		}
        -		if ( value === undefined ) {
        -			return this[ cache ].slice();
        -		}
        -
        -		var ret,
        -			type = jQuery.type( value ),
        -			arr = ( type === "array" || type === "object" ) ? value : arguments,
        -			local = this[ cache ].slice();
        -
        -		each( props, function( key, prop ) {
        -			var val = arr[ type === "object" ? key : prop.idx ];
        -			if ( val == null ) {
        -				val = local[ prop.idx ];
        -			}
        -			local[ prop.idx ] = clamp( val, prop );
        -		});
        -
        -		if ( from ) {
        -			ret = color( from( local ) );
        -			ret[ cache ] = local;
        -			return ret;
        -		} else {
        -			return color( local );
        -		}
        -	};
        -
        -	// makes red() green() blue() alpha() hue() saturation() lightness()
        -	each( props, function( key, prop ) {
        -		// alpha is included in more than one space
        -		if ( color.fn[ key ] ) {
        -			return;
        -		}
        -		color.fn[ key ] = function( value ) {
        -			var vtype = jQuery.type( value ),
        -				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
        -				local = this[ fn ](),
        -				cur = local[ prop.idx ],
        -				match;
        -
        -			if ( vtype === "undefined" ) {
        -				return cur;
        -			}
        -
        -			if ( vtype === "function" ) {
        -				value = value.call( this, cur );
        -				vtype = jQuery.type( value );
        -			}
        -			if ( value == null && prop.empty ) {
        -				return this;
        -			}
        -			if ( vtype === "string" ) {
        -				match = rplusequals.exec( value );
        -				if ( match ) {
        -					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
        -				}
        -			}
        -			local[ prop.idx ] = value;
        -			return this[ fn ]( local );
        -		};
        -	});
        -});
        -
        -// add cssHook and .fx.step function for each named hook.
        -// accept a space separated string of properties
        -color.hook = function( hook ) {
        -	var hooks = hook.split( " " );
        -	each( hooks, function( i, hook ) {
        -		jQuery.cssHooks[ hook ] = {
        -			set: function( elem, value ) {
        -				var parsed, curElem,
        -					backgroundColor = "";
        -
        -				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
        -					value = color( parsed || value );
        -					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
        -						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
        -						while (
        -							(backgroundColor === "" || backgroundColor === "transparent") &&
        -							curElem && curElem.style
        -						) {
        -							try {
        -								backgroundColor = jQuery.css( curElem, "backgroundColor" );
        -								curElem = curElem.parentNode;
        -							} catch ( e ) {
        -							}
        -						}
        -
        -						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
        -							backgroundColor :
        -							"_default" );
        -					}
        -
        -					value = value.toRgbaString();
        -				}
        -				try {
        -					elem.style[ hook ] = value;
        -				} catch ( e ) {
        -					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
        -				}
        -			}
        -		};
        -		jQuery.fx.step[ hook ] = function( fx ) {
        -			if ( !fx.colorInit ) {
        -				fx.start = color( fx.elem, hook );
        -				fx.end = color( fx.end );
        -				fx.colorInit = true;
        -			}
        -			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
        -		};
        -	});
        -
        -};
        -
        -color.hook( stepHooks );
        -
        -jQuery.cssHooks.borderColor = {
        -	expand: function( value ) {
        -		var expanded = {};
        -
        -		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
        -			expanded[ "border" + part + "Color" ] = value;
        -		});
        -		return expanded;
        -	}
        -};
        -
        -// Basic color names only.
        -// Usage of any of the other color names requires adding yourself or including
        -// jquery.color.svg-names.js.
        -colors = jQuery.Color.names = {
        -	// 4.1. Basic color keywords
        -	aqua: "#00ffff",
        -	black: "#000000",
        -	blue: "#0000ff",
        -	fuchsia: "#ff00ff",
        -	gray: "#808080",
        -	green: "#008000",
        -	lime: "#00ff00",
        -	maroon: "#800000",
        -	navy: "#000080",
        -	olive: "#808000",
        -	purple: "#800080",
        -	red: "#ff0000",
        -	silver: "#c0c0c0",
        -	teal: "#008080",
        -	white: "#ffffff",
        -	yellow: "#ffff00",
        -
        -	// 4.2.3. "transparent" color keyword
        -	transparent: [ null, null, null, 0 ],
        -
        -	_default: "#ffffff"
        -};
        -
        -})( jQuery );
        -
        -/******************************************************************************/
        -/****************************** CLASS ANIMATIONS ******************************/
        -/******************************************************************************/
        -(function() {
        -
        -var classAnimationActions = [ "add", "remove", "toggle" ],
        -	shorthandStyles = {
        -		border: 1,
        -		borderBottom: 1,
        -		borderColor: 1,
        -		borderLeft: 1,
        -		borderRight: 1,
        -		borderTop: 1,
        -		borderWidth: 1,
        -		margin: 1,
        -		padding: 1
        -	};
        -
        -$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
        -	$.fx.step[ prop ] = function( fx ) {
        -		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
        -			jQuery.style( fx.elem, prop, fx.end );
        -			fx.setAttr = true;
        -		}
        -	};
        -});
        -
        -function getElementStyles( elem ) {
        -	var key, len,
        -		style = elem.ownerDocument.defaultView ?
        -			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
        -			elem.currentStyle,
        -		styles = {};
        -
        -	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
        -		len = style.length;
        -		while ( len-- ) {
        -			key = style[ len ];
        -			if ( typeof style[ key ] === "string" ) {
        -				styles[ $.camelCase( key ) ] = style[ key ];
        -			}
        -		}
        -	// support: Opera, IE <9
        -	} else {
        -		for ( key in style ) {
        -			if ( typeof style[ key ] === "string" ) {
        -				styles[ key ] = style[ key ];
        -			}
        -		}
        -	}
        -
        -	return styles;
        -}
        -
        -function styleDifference( oldStyle, newStyle ) {
        -	var diff = {},
        -		name, value;
        -
        -	for ( name in newStyle ) {
        -		value = newStyle[ name ];
        -		if ( oldStyle[ name ] !== value ) {
        -			if ( !shorthandStyles[ name ] ) {
        -				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
        -					diff[ name ] = value;
        -				}
        -			}
        -		}
        -	}
        -
        -	return diff;
        -}
        -
        -// support: jQuery <1.8
        -if ( !$.fn.addBack ) {
        -	$.fn.addBack = function( selector ) {
        -		return this.add( selector == null ?
        -			this.prevObject : this.prevObject.filter( selector )
        -		);
        -	};
        -}
        -
        -$.effects.animateClass = function( value, duration, easing, callback ) {
        -	var o = $.speed( duration, easing, callback );
        -
        -	return this.queue( function() {
        -		var animated = $( this ),
        -			baseClass = animated.attr( "class" ) || "",
        -			applyClassChange,
        -			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
        -
        -		// map the animated objects to store the original styles.
        -		allAnimations = allAnimations.map(function() {
        -			var el = $( this );
        -			return {
        -				el: el,
        -				start: getElementStyles( this )
        -			};
        -		});
        -
        -		// apply class change
        -		applyClassChange = function() {
        -			$.each( classAnimationActions, function(i, action) {
        -				if ( value[ action ] ) {
        -					animated[ action + "Class" ]( value[ action ] );
        -				}
        -			});
        -		};
        -		applyClassChange();
        -
        -		// map all animated objects again - calculate new styles and diff
        -		allAnimations = allAnimations.map(function() {
        -			this.end = getElementStyles( this.el[ 0 ] );
        -			this.diff = styleDifference( this.start, this.end );
        -			return this;
        -		});
        -
        -		// apply original class
        -		animated.attr( "class", baseClass );
        -
        -		// map all animated objects again - this time collecting a promise
        -		allAnimations = allAnimations.map(function() {
        -			var styleInfo = this,
        -				dfd = $.Deferred(),
        -				opts = $.extend({}, o, {
        -					queue: false,
        -					complete: function() {
        -						dfd.resolve( styleInfo );
        -					}
        -				});
        -
        -			this.el.animate( this.diff, opts );
        -			return dfd.promise();
        -		});
        -
        -		// once all animations have completed:
        -		$.when.apply( $, allAnimations.get() ).done(function() {
        -
        -			// set the final class
        -			applyClassChange();
        -
        -			// for each animated element,
        -			// clear all css properties that were animated
        -			$.each( arguments, function() {
        -				var el = this.el;
        -				$.each( this.diff, function(key) {
        -					el.css( key, "" );
        -				});
        -			});
        -
        -			// this is guarnteed to be there if you use jQuery.speed()
        -			// it also handles dequeuing the next anim...
        -			o.complete.call( animated[ 0 ] );
        -		});
        -	});
        -};
        -
        -$.fn.extend({
        -	addClass: (function( orig ) {
        -		return function( classNames, speed, easing, callback ) {
        -			return speed ?
        -				$.effects.animateClass.call( this,
        -					{ add: classNames }, speed, easing, callback ) :
        -				orig.apply( this, arguments );
        -		};
        -	})( $.fn.addClass ),
        -
        -	removeClass: (function( orig ) {
        -		return function( classNames, speed, easing, callback ) {
        -			return arguments.length > 1 ?
        -				$.effects.animateClass.call( this,
        -					{ remove: classNames }, speed, easing, callback ) :
        -				orig.apply( this, arguments );
        -		};
        -	})( $.fn.removeClass ),
        -
        -	toggleClass: (function( orig ) {
        -		return function( classNames, force, speed, easing, callback ) {
        -			if ( typeof force === "boolean" || force === undefined ) {
        -				if ( !speed ) {
        -					// without speed parameter
        -					return orig.apply( this, arguments );
        -				} else {
        -					return $.effects.animateClass.call( this,
        -						(force ? { add: classNames } : { remove: classNames }),
        -						speed, easing, callback );
        -				}
        -			} else {
        -				// without force parameter
        -				return $.effects.animateClass.call( this,
        -					{ toggle: classNames }, force, speed, easing );
        -			}
        -		};
        -	})( $.fn.toggleClass ),
        -
        -	switchClass: function( remove, add, speed, easing, callback) {
        -		return $.effects.animateClass.call( this, {
        -			add: add,
        -			remove: remove
        -		}, speed, easing, callback );
        -	}
        -});
        -
        -})();
        -
        -/******************************************************************************/
        -/*********************************** EFFECTS **********************************/
        -/******************************************************************************/
        -
        -(function() {
        -
        -$.extend( $.effects, {
        -	version: "1.11.4",
        -
        -	// Saves a set of properties in a data storage
        -	save: function( element, set ) {
        -		for ( var i = 0; i < set.length; i++ ) {
        -			if ( set[ i ] !== null ) {
        -				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
        -			}
        -		}
        -	},
        -
        -	// Restores a set of previously saved properties from a data storage
        -	restore: function( element, set ) {
        -		var val, i;
        -		for ( i = 0; i < set.length; i++ ) {
        -			if ( set[ i ] !== null ) {
        -				val = element.data( dataSpace + set[ i ] );
        -				// support: jQuery 1.6.2
        -				// http://bugs.jquery.com/ticket/9917
        -				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
        -				// We can't differentiate between "" and 0 here, so we just assume
        -				// empty string since it's likely to be a more common value...
        -				if ( val === undefined ) {
        -					val = "";
        -				}
        -				element.css( set[ i ], val );
        -			}
        -		}
        -	},
        -
        -	setMode: function( el, mode ) {
        -		if (mode === "toggle") {
        -			mode = el.is( ":hidden" ) ? "show" : "hide";
        -		}
        -		return mode;
        -	},
        -
        -	// Translates a [top,left] array into a baseline value
        -	// this should be a little more flexible in the future to handle a string & hash
        -	getBaseline: function( origin, original ) {
        -		var y, x;
        -		switch ( origin[ 0 ] ) {
        -			case "top": y = 0; break;
        -			case "middle": y = 0.5; break;
        -			case "bottom": y = 1; break;
        -			default: y = origin[ 0 ] / original.height;
        -		}
        -		switch ( origin[ 1 ] ) {
        -			case "left": x = 0; break;
        -			case "center": x = 0.5; break;
        -			case "right": x = 1; break;
        -			default: x = origin[ 1 ] / original.width;
        -		}
        -		return {
        -			x: x,
        -			y: y
        -		};
        -	},
        -
        -	// Wraps the element around a wrapper that copies position properties
        -	createWrapper: function( element ) {
        -
        -		// if the element is already wrapped, return it
        -		if ( element.parent().is( ".ui-effects-wrapper" )) {
        -			return element.parent();
        -		}
        -
        -		// wrap the element
        -		var props = {
        -				width: element.outerWidth(true),
        -				height: element.outerHeight(true),
        -				"float": element.css( "float" )
        -			},
        -			wrapper = $( "<div></div>" )
        -				.addClass( "ui-effects-wrapper" )
        -				.css({
        -					fontSize: "100%",
        -					background: "transparent",
        -					border: "none",
        -					margin: 0,
        -					padding: 0
        -				}),
        -			// Store the size in case width/height are defined in % - Fixes #5245
        -			size = {
        -				width: element.width(),
        -				height: element.height()
        -			},
        -			active = document.activeElement;
        -
        -		// support: Firefox
        -		// Firefox incorrectly exposes anonymous content
        -		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
        -		try {
        -			active.id;
        -		} catch ( e ) {
        -			active = document.body;
        -		}
        -
        -		element.wrap( wrapper );
        -
        -		// Fixes #7595 - Elements lose focus when wrapped.
        -		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        -			$( active ).focus();
        -		}
        -
        -		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
        -
        -		// transfer positioning properties to the wrapper
        -		if ( element.css( "position" ) === "static" ) {
        -			wrapper.css({ position: "relative" });
        -			element.css({ position: "relative" });
        -		} else {
        -			$.extend( props, {
        -				position: element.css( "position" ),
        -				zIndex: element.css( "z-index" )
        -			});
        -			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
        -				props[ pos ] = element.css( pos );
        -				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
        -					props[ pos ] = "auto";
        -				}
        -			});
        -			element.css({
        -				position: "relative",
        -				top: 0,
        -				left: 0,
        -				right: "auto",
        -				bottom: "auto"
        -			});
        -		}
        -		element.css(size);
        -
        -		return wrapper.css( props ).show();
        -	},
        -
        -	removeWrapper: function( element ) {
        -		var active = document.activeElement;
        -
        -		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
        -			element.parent().replaceWith( element );
        -
        -			// Fixes #7595 - Elements lose focus when wrapped.
        -			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
        -				$( active ).focus();
        -			}
        -		}
        -
        -		return element;
        -	},
        -
        -	setTransition: function( element, list, factor, value ) {
        -		value = value || {};
        -		$.each( list, function( i, x ) {
        -			var unit = element.cssUnit( x );
        -			if ( unit[ 0 ] > 0 ) {
        -				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
        -			}
        -		});
        -		return value;
        -	}
        -});
        -
        -// return an effect options object for the given parameters:
        -function _normalizeArguments( effect, options, speed, callback ) {
        -
        -	// allow passing all options as the first parameter
        -	if ( $.isPlainObject( effect ) ) {
        -		options = effect;
        -		effect = effect.effect;
        -	}
        -
        -	// convert to an object
        -	effect = { effect: effect };
        -
        -	// catch (effect, null, ...)
        -	if ( options == null ) {
        -		options = {};
        -	}
        -
        -	// catch (effect, callback)
        -	if ( $.isFunction( options ) ) {
        -		callback = options;
        -		speed = null;
        -		options = {};
        -	}
        -
        -	// catch (effect, speed, ?)
        -	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
        -		callback = speed;
        -		speed = options;
        -		options = {};
        -	}
        -
        -	// catch (effect, options, callback)
        -	if ( $.isFunction( speed ) ) {
        -		callback = speed;
        -		speed = null;
        -	}
        -
        -	// add options to effect
        -	if ( options ) {
        -		$.extend( effect, options );
        -	}
        -
        -	speed = speed || options.duration;
        -	effect.duration = $.fx.off ? 0 :
        -		typeof speed === "number" ? speed :
        -		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
        -		$.fx.speeds._default;
        -
        -	effect.complete = callback || options.complete;
        -
        -	return effect;
        -}
        -
        -function standardAnimationOption( option ) {
        -	// Valid standard speeds (nothing, number, named speed)
        -	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
        -		return true;
        -	}
        -
        -	// Invalid strings - treat as "normal" speed
        -	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
        -		return true;
        -	}
        -
        -	// Complete callback
        -	if ( $.isFunction( option ) ) {
        -		return true;
        -	}
        -
        -	// Options hash (but not naming an effect)
        -	if ( typeof option === "object" && !option.effect ) {
        -		return true;
        -	}
        -
        -	// Didn't match any standard API
        -	return false;
        -}
        -
        -$.fn.extend({
        -	effect: function( /* effect, options, speed, callback */ ) {
        -		var args = _normalizeArguments.apply( this, arguments ),
        -			mode = args.mode,
        -			queue = args.queue,
        -			effectMethod = $.effects.effect[ args.effect ];
        -
        -		if ( $.fx.off || !effectMethod ) {
        -			// delegate to the original method (e.g., .show()) if possible
        -			if ( mode ) {
        -				return this[ mode ]( args.duration, args.complete );
        -			} else {
        -				return this.each( function() {
        -					if ( args.complete ) {
        -						args.complete.call( this );
        -					}
        -				});
        -			}
        -		}
        -
        -		function run( next ) {
        -			var elem = $( this ),
        -				complete = args.complete,
        -				mode = args.mode;
        -
        -			function done() {
        -				if ( $.isFunction( complete ) ) {
        -					complete.call( elem[0] );
        -				}
        -				if ( $.isFunction( next ) ) {
        -					next();
        -				}
        -			}
        -
        -			// If the element already has the correct final state, delegate to
        -			// the core methods so the internal tracking of "olddisplay" works.
        -			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
        -				elem[ mode ]();
        -				done();
        -			} else {
        -				effectMethod.call( elem[0], args, done );
        -			}
        -		}
        -
        -		return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
        -	},
        -
        -	show: (function( orig ) {
        -		return function( option ) {
        -			if ( standardAnimationOption( option ) ) {
        -				return orig.apply( this, arguments );
        -			} else {
        -				var args = _normalizeArguments.apply( this, arguments );
        -				args.mode = "show";
        -				return this.effect.call( this, args );
        -			}
        -		};
        -	})( $.fn.show ),
        -
        -	hide: (function( orig ) {
        -		return function( option ) {
        -			if ( standardAnimationOption( option ) ) {
        -				return orig.apply( this, arguments );
        -			} else {
        -				var args = _normalizeArguments.apply( this, arguments );
        -				args.mode = "hide";
        -				return this.effect.call( this, args );
        -			}
        -		};
        -	})( $.fn.hide ),
        -
        -	toggle: (function( orig ) {
        -		return function( option ) {
        -			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
        -				return orig.apply( this, arguments );
        -			} else {
        -				var args = _normalizeArguments.apply( this, arguments );
        -				args.mode = "toggle";
        -				return this.effect.call( this, args );
        -			}
        -		};
        -	})( $.fn.toggle ),
        -
        -	// helper functions
        -	cssUnit: function(key) {
        -		var style = this.css( key ),
        -			val = [];
        -
        -		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
        -			if ( style.indexOf( unit ) > 0 ) {
        -				val = [ parseFloat( style ), unit ];
        -			}
        -		});
        -		return val;
        -	}
        -});
        -
        -})();
        -
        -/******************************************************************************/
        -/*********************************** EASING ***********************************/
        -/******************************************************************************/
        -
        -(function() {
        -
        -// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
        -
        -var baseEasings = {};
        -
        -$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
        -	baseEasings[ name ] = function( p ) {
        -		return Math.pow( p, i + 2 );
        -	};
        -});
        -
        -$.extend( baseEasings, {
        -	Sine: function( p ) {
        -		return 1 - Math.cos( p * Math.PI / 2 );
        -	},
        -	Circ: function( p ) {
        -		return 1 - Math.sqrt( 1 - p * p );
        -	},
        -	Elastic: function( p ) {
        -		return p === 0 || p === 1 ? p :
        -			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
        -	},
        -	Back: function( p ) {
        -		return p * p * ( 3 * p - 2 );
        -	},
        -	Bounce: function( p ) {
        -		var pow2,
        -			bounce = 4;
        -
        -		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
        -		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
        -	}
        -});
        -
        -$.each( baseEasings, function( name, easeIn ) {
        -	$.easing[ "easeIn" + name ] = easeIn;
        -	$.easing[ "easeOut" + name ] = function( p ) {
        -		return 1 - easeIn( 1 - p );
        -	};
        -	$.easing[ "easeInOut" + name ] = function( p ) {
        -		return p < 0.5 ?
        -			easeIn( p * 2 ) / 2 :
        -			1 - easeIn( p * -2 + 2 ) / 2;
        -	};
        -});
        -
        -})();
        -
        -var effect = $.effects;
        -
        -
        -/*!
        - * jQuery UI Effects Blind 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/blind-effect/
        - */
        -
        -
        -var effectBlind = $.effects.effect.blind = function( o, done ) {
        -	// Create element
        -	var el = $( this ),
        -		rvertical = /up|down|vertical/,
        -		rpositivemotion = /up|left|vertical|horizontal/,
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		direction = o.direction || "up",
        -		vertical = rvertical.test( direction ),
        -		ref = vertical ? "height" : "width",
        -		ref2 = vertical ? "top" : "left",
        -		motion = rpositivemotion.test( direction ),
        -		animation = {},
        -		show = mode === "show",
        -		wrapper, distance, margin;
        -
        -	// if already wrapped, the wrapper's properties are my property. #6245
        -	if ( el.parent().is( ".ui-effects-wrapper" ) ) {
        -		$.effects.save( el.parent(), props );
        -	} else {
        -		$.effects.save( el, props );
        -	}
        -	el.show();
        -	wrapper = $.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -
        -	distance = wrapper[ ref ]();
        -	margin = parseFloat( wrapper.css( ref2 ) ) || 0;
        -
        -	animation[ ref ] = show ? distance : 0;
        -	if ( !motion ) {
        -		el
        -			.css( vertical ? "bottom" : "right", 0 )
        -			.css( vertical ? "top" : "left", "auto" )
        -			.css({ position: "absolute" });
        -
        -		animation[ ref2 ] = show ? margin : distance + margin;
        -	}
        -
        -	// start at 0 if we are showing
        -	if ( show ) {
        -		wrapper.css( ref, 0 );
        -		if ( !motion ) {
        -			wrapper.css( ref2, margin + distance );
        -		}
        -	}
        -
        -	// Animate
        -	wrapper.animate( animation, {
        -		duration: o.duration,
        -		easing: o.easing,
        -		queue: false,
        -		complete: function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Bounce 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/bounce-effect/
        - */
        -
        -
        -var effectBounce = $.effects.effect.bounce = function( o, done ) {
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -
        -		// defaults:
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		hide = mode === "hide",
        -		show = mode === "show",
        -		direction = o.direction || "up",
        -		distance = o.distance,
        -		times = o.times || 5,
        -
        -		// number of internal animations
        -		anims = times * 2 + ( show || hide ? 1 : 0 ),
        -		speed = o.duration / anims,
        -		easing = o.easing,
        -
        -		// utility:
        -		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        -		motion = ( direction === "up" || direction === "left" ),
        -		i,
        -		upAnim,
        -		downAnim,
        -
        -		// we will need to re-assemble the queue to stack our animations in place
        -		queue = el.queue(),
        -		queuelen = queue.length;
        -
        -	// Avoid touching opacity to prevent clearType and PNG issues in IE
        -	if ( show || hide ) {
        -		props.push( "opacity" );
        -	}
        -
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el ); // Create Wrapper
        -
        -	// default distance for the BIGGEST bounce is the outer Distance / 3
        -	if ( !distance ) {
        -		distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
        -	}
        -
        -	if ( show ) {
        -		downAnim = { opacity: 1 };
        -		downAnim[ ref ] = 0;
        -
        -		// if we are showing, force opacity 0 and set the initial position
        -		// then do the "first" animation
        -		el.css( "opacity", 0 )
        -			.css( ref, motion ? -distance * 2 : distance * 2 )
        -			.animate( downAnim, speed, easing );
        -	}
        -
        -	// start at the smallest distance if we are hiding
        -	if ( hide ) {
        -		distance = distance / Math.pow( 2, times - 1 );
        -	}
        -
        -	downAnim = {};
        -	downAnim[ ref ] = 0;
        -	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
        -	for ( i = 0; i < times; i++ ) {
        -		upAnim = {};
        -		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        -
        -		el.animate( upAnim, speed, easing )
        -			.animate( downAnim, speed, easing );
        -
        -		distance = hide ? distance * 2 : distance / 2;
        -	}
        -
        -	// Last Bounce when Hiding
        -	if ( hide ) {
        -		upAnim = { opacity: 0 };
        -		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
        -
        -		el.animate( upAnim, speed, easing );
        -	}
        -
        -	el.queue(function() {
        -		if ( hide ) {
        -			el.hide();
        -		}
        -		$.effects.restore( el, props );
        -		$.effects.removeWrapper( el );
        -		done();
        -	});
        -
        -	// inject all the animations we just queued to be first in line (after "inprogress")
        -	if ( queuelen > 1) {
        -		queue.splice.apply( queue,
        -			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
        -	}
        -	el.dequeue();
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Clip 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/clip-effect/
        - */
        -
        -
        -var effectClip = $.effects.effect.clip = function( o, done ) {
        -	// Create element
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -		direction = o.direction || "vertical",
        -		vert = direction === "vertical",
        -		size = vert ? "height" : "width",
        -		position = vert ? "top" : "left",
        -		animation = {},
        -		wrapper, animate, distance;
        -
        -	// Save & Show
        -	$.effects.save( el, props );
        -	el.show();
        -
        -	// Create Wrapper
        -	wrapper = $.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -	animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
        -	distance = animate[ size ]();
        -
        -	// Shift
        -	if ( show ) {
        -		animate.css( size, 0 );
        -		animate.css( position, distance / 2 );
        -	}
        -
        -	// Create Animation Object:
        -	animation[ size ] = show ? distance : 0;
        -	animation[ position ] = show ? 0 : distance / 2;
        -
        -	// Animate
        -	animate.animate( animation, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( !show ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Drop 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/drop-effect/
        - */
        -
        -
        -var effectDrop = $.effects.effect.drop = function( o, done ) {
        -
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -		direction = o.direction || "left",
        -		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
        -		motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
        -		animation = {
        -			opacity: show ? 1 : 0
        -		},
        -		distance;
        -
        -	// Adjust
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el );
        -
        -	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
        -
        -	if ( show ) {
        -		el
        -			.css( "opacity", 0 )
        -			.css( ref, motion === "pos" ? -distance : distance );
        -	}
        -
        -	// Animation
        -	animation[ ref ] = ( show ?
        -		( motion === "pos" ? "+=" : "-=" ) :
        -		( motion === "pos" ? "-=" : "+=" ) ) +
        -		distance;
        -
        -	// Animate
        -	el.animate( animation, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Explode 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/explode-effect/
        - */
        -
        -
        -var effectExplode = $.effects.effect.explode = function( o, done ) {
        -
        -	var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
        -		cells = rows,
        -		el = $( this ),
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -
        -		// show and then visibility:hidden the element before calculating offset
        -		offset = el.show().css( "visibility", "hidden" ).offset(),
        -
        -		// width and height of a piece
        -		width = Math.ceil( el.outerWidth() / cells ),
        -		height = Math.ceil( el.outerHeight() / rows ),
        -		pieces = [],
        -
        -		// loop
        -		i, j, left, top, mx, my;
        -
        -	// children animate complete:
        -	function childComplete() {
        -		pieces.push( this );
        -		if ( pieces.length === rows * cells ) {
        -			animComplete();
        -		}
        -	}
        -
        -	// clone the element for each row and cell.
        -	for ( i = 0; i < rows ; i++ ) { // ===>
        -		top = offset.top + i * height;
        -		my = i - ( rows - 1 ) / 2 ;
        -
        -		for ( j = 0; j < cells ; j++ ) { // |||
        -			left = offset.left + j * width;
        -			mx = j - ( cells - 1 ) / 2 ;
        -
        -			// Create a clone of the now hidden main element that will be absolute positioned
        -			// within a wrapper div off the -left and -top equal to size of our pieces
        -			el
        -				.clone()
        -				.appendTo( "body" )
        -				.wrap( "<div></div>" )
        -				.css({
        -					position: "absolute",
        -					visibility: "visible",
        -					left: -j * width,
        -					top: -i * height
        -				})
        -
        -			// select the wrapper - make it overflow: hidden and absolute positioned based on
        -			// where the original was located +left and +top equal to the size of pieces
        -				.parent()
        -				.addClass( "ui-effects-explode" )
        -				.css({
        -					position: "absolute",
        -					overflow: "hidden",
        -					width: width,
        -					height: height,
        -					left: left + ( show ? mx * width : 0 ),
        -					top: top + ( show ? my * height : 0 ),
        -					opacity: show ? 0 : 1
        -				}).animate({
        -					left: left + ( show ? 0 : mx * width ),
        -					top: top + ( show ? 0 : my * height ),
        -					opacity: show ? 1 : 0
        -				}, o.duration || 500, o.easing, childComplete );
        -		}
        -	}
        -
        -	function animComplete() {
        -		el.css({
        -			visibility: "visible"
        -		});
        -		$( pieces ).remove();
        -		if ( !show ) {
        -			el.hide();
        -		}
        -		done();
        -	}
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Fade 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/fade-effect/
        - */
        -
        -
        -var effectFade = $.effects.effect.fade = function( o, done ) {
        -	var el = $( this ),
        -		mode = $.effects.setMode( el, o.mode || "toggle" );
        -
        -	el.animate({
        -		opacity: mode
        -	}, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: done
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Fold 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/fold-effect/
        - */
        -
        -
        -var effectFold = $.effects.effect.fold = function( o, done ) {
        -
        -	// Create element
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "hide" ),
        -		show = mode === "show",
        -		hide = mode === "hide",
        -		size = o.size || 15,
        -		percent = /([0-9]+)%/.exec( size ),
        -		horizFirst = !!o.horizFirst,
        -		widthFirst = show !== horizFirst,
        -		ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
        -		duration = o.duration / 2,
        -		wrapper, distance,
        -		animation1 = {},
        -		animation2 = {};
        -
        -	$.effects.save( el, props );
        -	el.show();
        -
        -	// Create Wrapper
        -	wrapper = $.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -	distance = widthFirst ?
        -		[ wrapper.width(), wrapper.height() ] :
        -		[ wrapper.height(), wrapper.width() ];
        -
        -	if ( percent ) {
        -		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
        -	}
        -	if ( show ) {
        -		wrapper.css( horizFirst ? {
        -			height: 0,
        -			width: size
        -		} : {
        -			height: size,
        -			width: 0
        -		});
        -	}
        -
        -	// Animation
        -	animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
        -	animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
        -
        -	// Animate
        -	wrapper
        -		.animate( animation1, duration, o.easing )
        -		.animate( animation2, duration, o.easing, function() {
        -			if ( hide ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		});
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Highlight 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/highlight-effect/
        - */
        -
        -
        -var effectHighlight = $.effects.effect.highlight = function( o, done ) {
        -	var elem = $( this ),
        -		props = [ "backgroundImage", "backgroundColor", "opacity" ],
        -		mode = $.effects.setMode( elem, o.mode || "show" ),
        -		animation = {
        -			backgroundColor: elem.css( "backgroundColor" )
        -		};
        -
        -	if (mode === "hide") {
        -		animation.opacity = 0;
        -	}
        -
        -	$.effects.save( elem, props );
        -
        -	elem
        -		.show()
        -		.css({
        -			backgroundImage: "none",
        -			backgroundColor: o.color || "#ffff99"
        -		})
        -		.animate( animation, {
        -			queue: false,
        -			duration: o.duration,
        -			easing: o.easing,
        -			complete: function() {
        -				if ( mode === "hide" ) {
        -					elem.hide();
        -				}
        -				$.effects.restore( elem, props );
        -				done();
        -			}
        -		});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Size 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/size-effect/
        - */
        -
        -
        -var effectSize = $.effects.effect.size = function( o, done ) {
        -
        -	// Create element
        -	var original, baseline, factor,
        -		el = $( this ),
        -		props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
        -
        -		// Always restore
        -		props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
        -
        -		// Copy for children
        -		props2 = [ "width", "height", "overflow" ],
        -		cProps = [ "fontSize" ],
        -		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
        -		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
        -
        -		// Set options
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		restore = o.restore || mode !== "effect",
        -		scale = o.scale || "both",
        -		origin = o.origin || [ "middle", "center" ],
        -		position = el.css( "position" ),
        -		props = restore ? props0 : props1,
        -		zero = {
        -			height: 0,
        -			width: 0,
        -			outerHeight: 0,
        -			outerWidth: 0
        -		};
        -
        -	if ( mode === "show" ) {
        -		el.show();
        -	}
        -	original = {
        -		height: el.height(),
        -		width: el.width(),
        -		outerHeight: el.outerHeight(),
        -		outerWidth: el.outerWidth()
        -	};
        -
        -	if ( o.mode === "toggle" && mode === "show" ) {
        -		el.from = o.to || zero;
        -		el.to = o.from || original;
        -	} else {
        -		el.from = o.from || ( mode === "show" ? zero : original );
        -		el.to = o.to || ( mode === "hide" ? zero : original );
        -	}
        -
        -	// Set scaling factor
        -	factor = {
        -		from: {
        -			y: el.from.height / original.height,
        -			x: el.from.width / original.width
        -		},
        -		to: {
        -			y: el.to.height / original.height,
        -			x: el.to.width / original.width
        -		}
        -	};
        -
        -	// Scale the css box
        -	if ( scale === "box" || scale === "both" ) {
        -
        -		// Vertical props scaling
        -		if ( factor.from.y !== factor.to.y ) {
        -			props = props.concat( vProps );
        -			el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
        -			el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
        -		}
        -
        -		// Horizontal props scaling
        -		if ( factor.from.x !== factor.to.x ) {
        -			props = props.concat( hProps );
        -			el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
        -			el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
        -		}
        -	}
        -
        -	// Scale the content
        -	if ( scale === "content" || scale === "both" ) {
        -
        -		// Vertical props scaling
        -		if ( factor.from.y !== factor.to.y ) {
        -			props = props.concat( cProps ).concat( props2 );
        -			el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
        -			el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
        -		}
        -	}
        -
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el );
        -	el.css( "overflow", "hidden" ).css( el.from );
        -
        -	// Adjust
        -	if (origin) { // Calculate baseline shifts
        -		baseline = $.effects.getBaseline( origin, original );
        -		el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
        -		el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
        -		el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
        -		el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
        -	}
        -	el.css( el.from ); // set top & left
        -
        -	// Animate
        -	if ( scale === "content" || scale === "both" ) { // Scale the children
        -
        -		// Add margins/font-size
        -		vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
        -		hProps = hProps.concat([ "marginLeft", "marginRight" ]);
        -		props2 = props0.concat(vProps).concat(hProps);
        -
        -		el.find( "*[width]" ).each( function() {
        -			var child = $( this ),
        -				c_original = {
        -					height: child.height(),
        -					width: child.width(),
        -					outerHeight: child.outerHeight(),
        -					outerWidth: child.outerWidth()
        -				};
        -			if (restore) {
        -				$.effects.save(child, props2);
        -			}
        -
        -			child.from = {
        -				height: c_original.height * factor.from.y,
        -				width: c_original.width * factor.from.x,
        -				outerHeight: c_original.outerHeight * factor.from.y,
        -				outerWidth: c_original.outerWidth * factor.from.x
        -			};
        -			child.to = {
        -				height: c_original.height * factor.to.y,
        -				width: c_original.width * factor.to.x,
        -				outerHeight: c_original.height * factor.to.y,
        -				outerWidth: c_original.width * factor.to.x
        -			};
        -
        -			// Vertical props scaling
        -			if ( factor.from.y !== factor.to.y ) {
        -				child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
        -				child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
        -			}
        -
        -			// Horizontal props scaling
        -			if ( factor.from.x !== factor.to.x ) {
        -				child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
        -				child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
        -			}
        -
        -			// Animate children
        -			child.css( child.from );
        -			child.animate( child.to, o.duration, o.easing, function() {
        -
        -				// Restore children
        -				if ( restore ) {
        -					$.effects.restore( child, props2 );
        -				}
        -			});
        -		});
        -	}
        -
        -	// Animate
        -	el.animate( el.to, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( el.to.opacity === 0 ) {
        -				el.css( "opacity", el.from.opacity );
        -			}
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			if ( !restore ) {
        -
        -				// we need to calculate our new positioning based on the scaling
        -				if ( position === "static" ) {
        -					el.css({
        -						position: "relative",
        -						top: el.to.top,
        -						left: el.to.left
        -					});
        -				} else {
        -					$.each([ "top", "left" ], function( idx, pos ) {
        -						el.css( pos, function( _, str ) {
        -							var val = parseInt( str, 10 ),
        -								toRef = idx ? el.to.left : el.to.top;
        -
        -							// if original was "auto", recalculate the new value from wrapper
        -							if ( str === "auto" ) {
        -								return toRef + "px";
        -							}
        -
        -							return val + toRef + "px";
        -						});
        -					});
        -				}
        -			}
        -
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Scale 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/scale-effect/
        - */
        -
        -
        -var effectScale = $.effects.effect.scale = function( o, done ) {
        -
        -	// Create element
        -	var el = $( this ),
        -		options = $.extend( true, {}, o ),
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		percent = parseInt( o.percent, 10 ) ||
        -			( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
        -		direction = o.direction || "both",
        -		origin = o.origin,
        -		original = {
        -			height: el.height(),
        -			width: el.width(),
        -			outerHeight: el.outerHeight(),
        -			outerWidth: el.outerWidth()
        -		},
        -		factor = {
        -			y: direction !== "horizontal" ? (percent / 100) : 1,
        -			x: direction !== "vertical" ? (percent / 100) : 1
        -		};
        -
        -	// We are going to pass this effect to the size effect:
        -	options.effect = "size";
        -	options.queue = false;
        -	options.complete = done;
        -
        -	// Set default origin and restore for show/hide
        -	if ( mode !== "effect" ) {
        -		options.origin = origin || [ "middle", "center" ];
        -		options.restore = true;
        -	}
        -
        -	options.from = o.from || ( mode === "show" ? {
        -		height: 0,
        -		width: 0,
        -		outerHeight: 0,
        -		outerWidth: 0
        -	} : original );
        -	options.to = {
        -		height: original.height * factor.y,
        -		width: original.width * factor.x,
        -		outerHeight: original.outerHeight * factor.y,
        -		outerWidth: original.outerWidth * factor.x
        -	};
        -
        -	// Fade option to support puff
        -	if ( options.fade ) {
        -		if ( mode === "show" ) {
        -			options.from.opacity = 0;
        -			options.to.opacity = 1;
        -		}
        -		if ( mode === "hide" ) {
        -			options.from.opacity = 1;
        -			options.to.opacity = 0;
        -		}
        -	}
        -
        -	// Animate
        -	el.effect( options );
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Puff 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/puff-effect/
        - */
        -
        -
        -var effectPuff = $.effects.effect.puff = function( o, done ) {
        -	var elem = $( this ),
        -		mode = $.effects.setMode( elem, o.mode || "hide" ),
        -		hide = mode === "hide",
        -		percent = parseInt( o.percent, 10 ) || 150,
        -		factor = percent / 100,
        -		original = {
        -			height: elem.height(),
        -			width: elem.width(),
        -			outerHeight: elem.outerHeight(),
        -			outerWidth: elem.outerWidth()
        -		};
        -
        -	$.extend( o, {
        -		effect: "scale",
        -		queue: false,
        -		fade: true,
        -		mode: mode,
        -		complete: done,
        -		percent: hide ? percent : 100,
        -		from: hide ?
        -			original :
        -			{
        -				height: original.height * factor,
        -				width: original.width * factor,
        -				outerHeight: original.outerHeight * factor,
        -				outerWidth: original.outerWidth * factor
        -			}
        -	});
        -
        -	elem.effect( o );
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Pulsate 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/pulsate-effect/
        - */
        -
        -
        -var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
        -	var elem = $( this ),
        -		mode = $.effects.setMode( elem, o.mode || "show" ),
        -		show = mode === "show",
        -		hide = mode === "hide",
        -		showhide = ( show || mode === "hide" ),
        -
        -		// showing or hiding leaves of the "last" animation
        -		anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
        -		duration = o.duration / anims,
        -		animateTo = 0,
        -		queue = elem.queue(),
        -		queuelen = queue.length,
        -		i;
        -
        -	if ( show || !elem.is(":visible")) {
        -		elem.css( "opacity", 0 ).show();
        -		animateTo = 1;
        -	}
        -
        -	// anims - 1 opacity "toggles"
        -	for ( i = 1; i < anims; i++ ) {
        -		elem.animate({
        -			opacity: animateTo
        -		}, duration, o.easing );
        -		animateTo = 1 - animateTo;
        -	}
        -
        -	elem.animate({
        -		opacity: animateTo
        -	}, duration, o.easing);
        -
        -	elem.queue(function() {
        -		if ( hide ) {
        -			elem.hide();
        -		}
        -		done();
        -	});
        -
        -	// We just queued up "anims" animations, we need to put them next in the queue
        -	if ( queuelen > 1 ) {
        -		queue.splice.apply( queue,
        -			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
        -	}
        -	elem.dequeue();
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Shake 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/shake-effect/
        - */
        -
        -
        -var effectShake = $.effects.effect.shake = function( o, done ) {
        -
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
        -		mode = $.effects.setMode( el, o.mode || "effect" ),
        -		direction = o.direction || "left",
        -		distance = o.distance || 20,
        -		times = o.times || 3,
        -		anims = times * 2 + 1,
        -		speed = Math.round( o.duration / anims ),
        -		ref = (direction === "up" || direction === "down") ? "top" : "left",
        -		positiveMotion = (direction === "up" || direction === "left"),
        -		animation = {},
        -		animation1 = {},
        -		animation2 = {},
        -		i,
        -
        -		// we will need to re-assemble the queue to stack our animations in place
        -		queue = el.queue(),
        -		queuelen = queue.length;
        -
        -	$.effects.save( el, props );
        -	el.show();
        -	$.effects.createWrapper( el );
        -
        -	// Animation
        -	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
        -	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
        -	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
        -
        -	// Animate
        -	el.animate( animation, speed, o.easing );
        -
        -	// Shakes
        -	for ( i = 1; i < times; i++ ) {
        -		el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
        -	}
        -	el
        -		.animate( animation1, speed, o.easing )
        -		.animate( animation, speed / 2, o.easing )
        -		.queue(function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		});
        -
        -	// inject all the animations we just queued to be first in line (after "inprogress")
        -	if ( queuelen > 1) {
        -		queue.splice.apply( queue,
        -			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
        -	}
        -	el.dequeue();
        -
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Slide 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/slide-effect/
        - */
        -
        -
        -var effectSlide = $.effects.effect.slide = function( o, done ) {
        -
        -	// Create element
        -	var el = $( this ),
        -		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
        -		mode = $.effects.setMode( el, o.mode || "show" ),
        -		show = mode === "show",
        -		direction = o.direction || "left",
        -		ref = (direction === "up" || direction === "down") ? "top" : "left",
        -		positiveMotion = (direction === "up" || direction === "left"),
        -		distance,
        -		animation = {};
        -
        -	// Adjust
        -	$.effects.save( el, props );
        -	el.show();
        -	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
        -
        -	$.effects.createWrapper( el ).css({
        -		overflow: "hidden"
        -	});
        -
        -	if ( show ) {
        -		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
        -	}
        -
        -	// Animation
        -	animation[ ref ] = ( show ?
        -		( positiveMotion ? "+=" : "-=") :
        -		( positiveMotion ? "-=" : "+=")) +
        -		distance;
        -
        -	// Animate
        -	el.animate( animation, {
        -		queue: false,
        -		duration: o.duration,
        -		easing: o.easing,
        -		complete: function() {
        -			if ( mode === "hide" ) {
        -				el.hide();
        -			}
        -			$.effects.restore( el, props );
        -			$.effects.removeWrapper( el );
        -			done();
        -		}
        -	});
        -};
        -
        -
        -/*!
        - * jQuery UI Effects Transfer 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/transfer-effect/
        - */
        -
        -
        -var effectTransfer = $.effects.effect.transfer = function( o, done ) {
        -	var elem = $( this ),
        -		target = $( o.to ),
        -		targetFixed = target.css( "position" ) === "fixed",
        -		body = $("body"),
        -		fixTop = targetFixed ? body.scrollTop() : 0,
        -		fixLeft = targetFixed ? body.scrollLeft() : 0,
        -		endPosition = target.offset(),
        -		animation = {
        -			top: endPosition.top - fixTop,
        -			left: endPosition.left - fixLeft,
        -			height: target.innerHeight(),
        -			width: target.innerWidth()
        -		},
        -		startPosition = elem.offset(),
        -		transfer = $( "<div class='ui-effects-transfer'></div>" )
        -			.appendTo( document.body )
        -			.addClass( o.className )
        -			.css({
        -				top: startPosition.top - fixTop,
        -				left: startPosition.left - fixLeft,
        -				height: elem.innerHeight(),
        -				width: elem.innerWidth(),
        -				position: targetFixed ? "fixed" : "absolute"
        -			})
        -			.animate( animation, o.duration, o.easing, function() {
        -				transfer.remove();
        -				done();
        -			});
        -};
        -
        -
        -/*!
        - * jQuery UI Progressbar 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/progressbar/
        - */
        -
        -
        -var progressbar = $.widget( "ui.progressbar", {
        -	version: "1.11.4",
        -	options: {
        -		max: 100,
        -		value: 0,
        -
        -		change: null,
        -		complete: null
        -	},
        -
        -	min: 0,
        -
        -	_create: function() {
        -		// Constrain initial value
        -		this.oldValue = this.options.value = this._constrainedValue();
        -
        -		this.element
        -			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
        -			.attr({
        -				// Only set static values, aria-valuenow and aria-valuemax are
        -				// set inside _refreshValue()
        -				role: "progressbar",
        -				"aria-valuemin": this.min
        -			});
        -
        -		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
        -			.appendTo( this.element );
        -
        -		this._refreshValue();
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-valuemin" )
        -			.removeAttr( "aria-valuemax" )
        -			.removeAttr( "aria-valuenow" );
        -
        -		this.valueDiv.remove();
        -	},
        -
        -	value: function( newValue ) {
        -		if ( newValue === undefined ) {
        -			return this.options.value;
        -		}
        -
        -		this.options.value = this._constrainedValue( newValue );
        -		this._refreshValue();
        -	},
        -
        -	_constrainedValue: function( newValue ) {
        -		if ( newValue === undefined ) {
        -			newValue = this.options.value;
        -		}
        -
        -		this.indeterminate = newValue === false;
        -
        -		// sanitize value
        -		if ( typeof newValue !== "number" ) {
        -			newValue = 0;
        -		}
        -
        -		return this.indeterminate ? false :
        -			Math.min( this.options.max, Math.max( this.min, newValue ) );
        -	},
        -
        -	_setOptions: function( options ) {
        -		// Ensure "value" option is set after other values (like max)
        -		var value = options.value;
        -		delete options.value;
        -
        -		this._super( options );
        -
        -		this.options.value = this._constrainedValue( value );
        -		this._refreshValue();
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "max" ) {
        -			// Don't allow a max less than min
        -			value = Math.max( this.min, value );
        -		}
        -		if ( key === "disabled" ) {
        -			this.element
        -				.toggleClass( "ui-state-disabled", !!value )
        -				.attr( "aria-disabled", value );
        -		}
        -		this._super( key, value );
        -	},
        -
        -	_percentage: function() {
        -		return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
        -	},
        -
        -	_refreshValue: function() {
        -		var value = this.options.value,
        -			percentage = this._percentage();
        -
        -		this.valueDiv
        -			.toggle( this.indeterminate || value > this.min )
        -			.toggleClass( "ui-corner-right", value === this.options.max )
        -			.width( percentage.toFixed(0) + "%" );
        -
        -		this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
        -
        -		if ( this.indeterminate ) {
        -			this.element.removeAttr( "aria-valuenow" );
        -			if ( !this.overlayDiv ) {
        -				this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
        -			}
        -		} else {
        -			this.element.attr({
        -				"aria-valuemax": this.options.max,
        -				"aria-valuenow": value
        -			});
        -			if ( this.overlayDiv ) {
        -				this.overlayDiv.remove();
        -				this.overlayDiv = null;
        -			}
        -		}
        -
        -		if ( this.oldValue !== value ) {
        -			this.oldValue = value;
        -			this._trigger( "change" );
        -		}
        -		if ( value === this.options.max ) {
        -			this._trigger( "complete" );
        -		}
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Selectable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/selectable/
        - */
        -
        -
        -var selectable = $.widget("ui.selectable", $.ui.mouse, {
        -	version: "1.11.4",
        -	options: {
        -		appendTo: "body",
        -		autoRefresh: true,
        -		distance: 0,
        -		filter: "*",
        -		tolerance: "touch",
        -
        -		// callbacks
        -		selected: null,
        -		selecting: null,
        -		start: null,
        -		stop: null,
        -		unselected: null,
        -		unselecting: null
        -	},
        -	_create: function() {
        -		var selectees,
        -			that = this;
        -
        -		this.element.addClass("ui-selectable");
        -
        -		this.dragged = false;
        -
        -		// cache selectee children based on filter
        -		this.refresh = function() {
        -			selectees = $(that.options.filter, that.element[0]);
        -			selectees.addClass("ui-selectee");
        -			selectees.each(function() {
        -				var $this = $(this),
        -					pos = $this.offset();
        -				$.data(this, "selectable-item", {
        -					element: this,
        -					$element: $this,
        -					left: pos.left,
        -					top: pos.top,
        -					right: pos.left + $this.outerWidth(),
        -					bottom: pos.top + $this.outerHeight(),
        -					startselected: false,
        -					selected: $this.hasClass("ui-selected"),
        -					selecting: $this.hasClass("ui-selecting"),
        -					unselecting: $this.hasClass("ui-unselecting")
        -				});
        -			});
        -		};
        -		this.refresh();
        -
        -		this.selectees = selectees.addClass("ui-selectee");
        -
        -		this._mouseInit();
        -
        -		this.helper = $("<div class='ui-selectable-helper'></div>");
        -	},
        -
        -	_destroy: function() {
        -		this.selectees
        -			.removeClass("ui-selectee")
        -			.removeData("selectable-item");
        -		this.element
        -			.removeClass("ui-selectable ui-selectable-disabled");
        -		this._mouseDestroy();
        -	},
        -
        -	_mouseStart: function(event) {
        -		var that = this,
        -			options = this.options;
        -
        -		this.opos = [ event.pageX, event.pageY ];
        -
        -		if (this.options.disabled) {
        -			return;
        -		}
        -
        -		this.selectees = $(options.filter, this.element[0]);
        -
        -		this._trigger("start", event);
        -
        -		$(options.appendTo).append(this.helper);
        -		// position helper (lasso)
        -		this.helper.css({
        -			"left": event.pageX,
        -			"top": event.pageY,
        -			"width": 0,
        -			"height": 0
        -		});
        -
        -		if (options.autoRefresh) {
        -			this.refresh();
        -		}
        -
        -		this.selectees.filter(".ui-selected").each(function() {
        -			var selectee = $.data(this, "selectable-item");
        -			selectee.startselected = true;
        -			if (!event.metaKey && !event.ctrlKey) {
        -				selectee.$element.removeClass("ui-selected");
        -				selectee.selected = false;
        -				selectee.$element.addClass("ui-unselecting");
        -				selectee.unselecting = true;
        -				// selectable UNSELECTING callback
        -				that._trigger("unselecting", event, {
        -					unselecting: selectee.element
        -				});
        -			}
        -		});
        -
        -		$(event.target).parents().addBack().each(function() {
        -			var doSelect,
        -				selectee = $.data(this, "selectable-item");
        -			if (selectee) {
        -				doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
        -				selectee.$element
        -					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
        -					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
        -				selectee.unselecting = !doSelect;
        -				selectee.selecting = doSelect;
        -				selectee.selected = doSelect;
        -				// selectable (UN)SELECTING callback
        -				if (doSelect) {
        -					that._trigger("selecting", event, {
        -						selecting: selectee.element
        -					});
        -				} else {
        -					that._trigger("unselecting", event, {
        -						unselecting: selectee.element
        -					});
        -				}
        -				return false;
        -			}
        -		});
        -
        -	},
        -
        -	_mouseDrag: function(event) {
        -
        -		this.dragged = true;
        -
        -		if (this.options.disabled) {
        -			return;
        -		}
        -
        -		var tmp,
        -			that = this,
        -			options = this.options,
        -			x1 = this.opos[0],
        -			y1 = this.opos[1],
        -			x2 = event.pageX,
        -			y2 = event.pageY;
        -
        -		if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
        -		if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
        -		this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
        -
        -		this.selectees.each(function() {
        -			var selectee = $.data(this, "selectable-item"),
        -				hit = false;
        -
        -			//prevent helper from being selected if appendTo: selectable
        -			if (!selectee || selectee.element === that.element[0]) {
        -				return;
        -			}
        -
        -			if (options.tolerance === "touch") {
        -				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
        -			} else if (options.tolerance === "fit") {
        -				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
        -			}
        -
        -			if (hit) {
        -				// SELECT
        -				if (selectee.selected) {
        -					selectee.$element.removeClass("ui-selected");
        -					selectee.selected = false;
        -				}
        -				if (selectee.unselecting) {
        -					selectee.$element.removeClass("ui-unselecting");
        -					selectee.unselecting = false;
        -				}
        -				if (!selectee.selecting) {
        -					selectee.$element.addClass("ui-selecting");
        -					selectee.selecting = true;
        -					// selectable SELECTING callback
        -					that._trigger("selecting", event, {
        -						selecting: selectee.element
        -					});
        -				}
        -			} else {
        -				// UNSELECT
        -				if (selectee.selecting) {
        -					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
        -						selectee.$element.removeClass("ui-selecting");
        -						selectee.selecting = false;
        -						selectee.$element.addClass("ui-selected");
        -						selectee.selected = true;
        -					} else {
        -						selectee.$element.removeClass("ui-selecting");
        -						selectee.selecting = false;
        -						if (selectee.startselected) {
        -							selectee.$element.addClass("ui-unselecting");
        -							selectee.unselecting = true;
        -						}
        -						// selectable UNSELECTING callback
        -						that._trigger("unselecting", event, {
        -							unselecting: selectee.element
        -						});
        -					}
        -				}
        -				if (selectee.selected) {
        -					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
        -						selectee.$element.removeClass("ui-selected");
        -						selectee.selected = false;
        -
        -						selectee.$element.addClass("ui-unselecting");
        -						selectee.unselecting = true;
        -						// selectable UNSELECTING callback
        -						that._trigger("unselecting", event, {
        -							unselecting: selectee.element
        -						});
        -					}
        -				}
        -			}
        -		});
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function(event) {
        -		var that = this;
        -
        -		this.dragged = false;
        -
        -		$(".ui-unselecting", this.element[0]).each(function() {
        -			var selectee = $.data(this, "selectable-item");
        -			selectee.$element.removeClass("ui-unselecting");
        -			selectee.unselecting = false;
        -			selectee.startselected = false;
        -			that._trigger("unselected", event, {
        -				unselected: selectee.element
        -			});
        -		});
        -		$(".ui-selecting", this.element[0]).each(function() {
        -			var selectee = $.data(this, "selectable-item");
        -			selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
        -			selectee.selecting = false;
        -			selectee.selected = true;
        -			selectee.startselected = true;
        -			that._trigger("selected", event, {
        -				selected: selectee.element
        -			});
        -		});
        -		this._trigger("stop", event);
        -
        -		this.helper.remove();
        -
        -		return false;
        -	}
        -
        -});
        -
        -
        -/*!
        - * jQuery UI Selectmenu 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/selectmenu
        - */
        -
        -
        -var selectmenu = $.widget( "ui.selectmenu", {
        -	version: "1.11.4",
        -	defaultElement: "<select>",
        -	options: {
        -		appendTo: null,
        -		disabled: null,
        -		icons: {
        -			button: "ui-icon-triangle-1-s"
        -		},
        -		position: {
        -			my: "left top",
        -			at: "left bottom",
        -			collision: "none"
        -		},
        -		width: null,
        -
        -		// callbacks
        -		change: null,
        -		close: null,
        -		focus: null,
        -		open: null,
        -		select: null
        -	},
        -
        -	_create: function() {
        -		var selectmenuId = this.element.uniqueId().attr( "id" );
        -		this.ids = {
        -			element: selectmenuId,
        -			button: selectmenuId + "-button",
        -			menu: selectmenuId + "-menu"
        -		};
        -
        -		this._drawButton();
        -		this._drawMenu();
        -
        -		if ( this.options.disabled ) {
        -			this.disable();
        -		}
        -	},
        -
        -	_drawButton: function() {
        -		var that = this;
        -
        -		// Associate existing label with the new button
        -		this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button );
        -		this._on( this.label, {
        -			click: function( event ) {
        -				this.button.focus();
        -				event.preventDefault();
        -			}
        -		});
        -
        -		// Hide original select element
        -		this.element.hide();
        -
        -		// Create button
        -		this.button = $( "<span>", {
        -			"class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all",
        -			tabindex: this.options.disabled ? -1 : 0,
        -			id: this.ids.button,
        -			role: "combobox",
        -			"aria-expanded": "false",
        -			"aria-autocomplete": "list",
        -			"aria-owns": this.ids.menu,
        -			"aria-haspopup": "true"
        -		})
        -			.insertAfter( this.element );
        -
        -		$( "<span>", {
        -			"class": "ui-icon " + this.options.icons.button
        -		})
        -			.prependTo( this.button );
        -
        -		this.buttonText = $( "<span>", {
        -			"class": "ui-selectmenu-text"
        -		})
        -			.appendTo( this.button );
        -
        -		this._setText( this.buttonText, this.element.find( "option:selected" ).text() );
        -		this._resizeButton();
        -
        -		this._on( this.button, this._buttonEvents );
        -		this.button.one( "focusin", function() {
        -
        -			// Delay rendering the menu items until the button receives focus.
        -			// The menu may have already been rendered via a programmatic open.
        -			if ( !that.menuItems ) {
        -				that._refreshMenu();
        -			}
        -		});
        -		this._hoverable( this.button );
        -		this._focusable( this.button );
        -	},
        -
        -	_drawMenu: function() {
        -		var that = this;
        -
        -		// Create menu
        -		this.menu = $( "<ul>", {
        -			"aria-hidden": "true",
        -			"aria-labelledby": this.ids.button,
        -			id: this.ids.menu
        -		});
        -
        -		// Wrap menu
        -		this.menuWrap = $( "<div>", {
        -			"class": "ui-selectmenu-menu ui-front"
        -		})
        -			.append( this.menu )
        -			.appendTo( this._appendTo() );
        -
        -		// Initialize menu widget
        -		this.menuInstance = this.menu
        -			.menu({
        -				role: "listbox",
        -				select: function( event, ui ) {
        -					event.preventDefault();
        -
        -					// support: IE8
        -					// If the item was selected via a click, the text selection
        -					// will be destroyed in IE
        -					that._setSelection();
        -
        -					that._select( ui.item.data( "ui-selectmenu-item" ), event );
        -				},
        -				focus: function( event, ui ) {
        -					var item = ui.item.data( "ui-selectmenu-item" );
        -
        -					// Prevent inital focus from firing and check if its a newly focused item
        -					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
        -						that._trigger( "focus", event, { item: item } );
        -						if ( !that.isOpen ) {
        -							that._select( item, event );
        -						}
        -					}
        -					that.focusIndex = item.index;
        -
        -					that.button.attr( "aria-activedescendant",
        -						that.menuItems.eq( item.index ).attr( "id" ) );
        -				}
        -			})
        -			.menu( "instance" );
        -
        -		// Adjust menu styles to dropdown
        -		this.menu
        -			.addClass( "ui-corner-bottom" )
        -			.removeClass( "ui-corner-all" );
        -
        -		// Don't close the menu on mouseleave
        -		this.menuInstance._off( this.menu, "mouseleave" );
        -
        -		// Cancel the menu's collapseAll on document click
        -		this.menuInstance._closeOnDocumentClick = function() {
        -			return false;
        -		};
        -
        -		// Selects often contain empty items, but never contain dividers
        -		this.menuInstance._isDivider = function() {
        -			return false;
        -		};
        -	},
        -
        -	refresh: function() {
        -		this._refreshMenu();
        -		this._setText( this.buttonText, this._getSelectedItem().text() );
        -		if ( !this.options.width ) {
        -			this._resizeButton();
        -		}
        -	},
        -
        -	_refreshMenu: function() {
        -		this.menu.empty();
        -
        -		var item,
        -			options = this.element.find( "option" );
        -
        -		if ( !options.length ) {
        -			return;
        -		}
        -
        -		this._parseOptions( options );
        -		this._renderMenu( this.menu, this.items );
        -
        -		this.menuInstance.refresh();
        -		this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" );
        -
        -		item = this._getSelectedItem();
        -
        -		// Update the menu to have the correct item focused
        -		this.menuInstance.focus( null, item );
        -		this._setAria( item.data( "ui-selectmenu-item" ) );
        -
        -		// Set disabled state
        -		this._setOption( "disabled", this.element.prop( "disabled" ) );
        -	},
        -
        -	open: function( event ) {
        -		if ( this.options.disabled ) {
        -			return;
        -		}
        -
        -		// If this is the first time the menu is being opened, render the items
        -		if ( !this.menuItems ) {
        -			this._refreshMenu();
        -		} else {
        -
        -			// Menu clears focus on close, reset focus to selected item
        -			this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" );
        -			this.menuInstance.focus( null, this._getSelectedItem() );
        -		}
        -
        -		this.isOpen = true;
        -		this._toggleAttr();
        -		this._resizeMenu();
        -		this._position();
        -
        -		this._on( this.document, this._documentClick );
        -
        -		this._trigger( "open", event );
        -	},
        -
        -	_position: function() {
        -		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
        -	},
        -
        -	close: function( event ) {
        -		if ( !this.isOpen ) {
        -			return;
        -		}
        -
        -		this.isOpen = false;
        -		this._toggleAttr();
        -
        -		this.range = null;
        -		this._off( this.document );
        -
        -		this._trigger( "close", event );
        -	},
        -
        -	widget: function() {
        -		return this.button;
        -	},
        -
        -	menuWidget: function() {
        -		return this.menu;
        -	},
        -
        -	_renderMenu: function( ul, items ) {
        -		var that = this,
        -			currentOptgroup = "";
        -
        -		$.each( items, function( index, item ) {
        -			if ( item.optgroup !== currentOptgroup ) {
        -				$( "<li>", {
        -					"class": "ui-selectmenu-optgroup ui-menu-divider" +
        -						( item.element.parent( "optgroup" ).prop( "disabled" ) ?
        -							" ui-state-disabled" :
        -							"" ),
        -					text: item.optgroup
        -				})
        -					.appendTo( ul );
        -
        -				currentOptgroup = item.optgroup;
        -			}
        -
        -			that._renderItemData( ul, item );
        -		});
        -	},
        -
        -	_renderItemData: function( ul, item ) {
        -		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
        -	},
        -
        -	_renderItem: function( ul, item ) {
        -		var li = $( "<li>" );
        -
        -		if ( item.disabled ) {
        -			li.addClass( "ui-state-disabled" );
        -		}
        -		this._setText( li, item.label );
        -
        -		return li.appendTo( ul );
        -	},
        -
        -	_setText: function( element, value ) {
        -		if ( value ) {
        -			element.text( value );
        -		} else {
        -			element.html( "&#160;" );
        -		}
        -	},
        -
        -	_move: function( direction, event ) {
        -		var item, next,
        -			filter = ".ui-menu-item";
        -
        -		if ( this.isOpen ) {
        -			item = this.menuItems.eq( this.focusIndex );
        -		} else {
        -			item = this.menuItems.eq( this.element[ 0 ].selectedIndex );
        -			filter += ":not(.ui-state-disabled)";
        -		}
        -
        -		if ( direction === "first" || direction === "last" ) {
        -			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
        -		} else {
        -			next = item[ direction + "All" ]( filter ).eq( 0 );
        -		}
        -
        -		if ( next.length ) {
        -			this.menuInstance.focus( event, next );
        -		}
        -	},
        -
        -	_getSelectedItem: function() {
        -		return this.menuItems.eq( this.element[ 0 ].selectedIndex );
        -	},
        -
        -	_toggle: function( event ) {
        -		this[ this.isOpen ? "close" : "open" ]( event );
        -	},
        -
        -	_setSelection: function() {
        -		var selection;
        -
        -		if ( !this.range ) {
        -			return;
        -		}
        -
        -		if ( window.getSelection ) {
        -			selection = window.getSelection();
        -			selection.removeAllRanges();
        -			selection.addRange( this.range );
        -
        -		// support: IE8
        -		} else {
        -			this.range.select();
        -		}
        -
        -		// support: IE
        -		// Setting the text selection kills the button focus in IE, but
        -		// restoring the focus doesn't kill the selection.
        -		this.button.focus();
        -	},
        -
        -	_documentClick: {
        -		mousedown: function( event ) {
        -			if ( !this.isOpen ) {
        -				return;
        -			}
        -
        -			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) {
        -				this.close( event );
        -			}
        -		}
        -	},
        -
        -	_buttonEvents: {
        -
        -		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
        -		mousedown: function() {
        -			var selection;
        -
        -			if ( window.getSelection ) {
        -				selection = window.getSelection();
        -				if ( selection.rangeCount ) {
        -					this.range = selection.getRangeAt( 0 );
        -				}
        -
        -			// support: IE8
        -			} else {
        -				this.range = document.selection.createRange();
        -			}
        -		},
        -
        -		click: function( event ) {
        -			this._setSelection();
        -			this._toggle( event );
        -		},
        -
        -		keydown: function( event ) {
        -			var preventDefault = true;
        -			switch ( event.keyCode ) {
        -				case $.ui.keyCode.TAB:
        -				case $.ui.keyCode.ESCAPE:
        -					this.close( event );
        -					preventDefault = false;
        -					break;
        -				case $.ui.keyCode.ENTER:
        -					if ( this.isOpen ) {
        -						this._selectFocusedItem( event );
        -					}
        -					break;
        -				case $.ui.keyCode.UP:
        -					if ( event.altKey ) {
        -						this._toggle( event );
        -					} else {
        -						this._move( "prev", event );
        -					}
        -					break;
        -				case $.ui.keyCode.DOWN:
        -					if ( event.altKey ) {
        -						this._toggle( event );
        -					} else {
        -						this._move( "next", event );
        -					}
        -					break;
        -				case $.ui.keyCode.SPACE:
        -					if ( this.isOpen ) {
        -						this._selectFocusedItem( event );
        -					} else {
        -						this._toggle( event );
        -					}
        -					break;
        -				case $.ui.keyCode.LEFT:
        -					this._move( "prev", event );
        -					break;
        -				case $.ui.keyCode.RIGHT:
        -					this._move( "next", event );
        -					break;
        -				case $.ui.keyCode.HOME:
        -				case $.ui.keyCode.PAGE_UP:
        -					this._move( "first", event );
        -					break;
        -				case $.ui.keyCode.END:
        -				case $.ui.keyCode.PAGE_DOWN:
        -					this._move( "last", event );
        -					break;
        -				default:
        -					this.menu.trigger( event );
        -					preventDefault = false;
        -			}
        -
        -			if ( preventDefault ) {
        -				event.preventDefault();
        -			}
        -		}
        -	},
        -
        -	_selectFocusedItem: function( event ) {
        -		var item = this.menuItems.eq( this.focusIndex );
        -		if ( !item.hasClass( "ui-state-disabled" ) ) {
        -			this._select( item.data( "ui-selectmenu-item" ), event );
        -		}
        -	},
        -
        -	_select: function( item, event ) {
        -		var oldIndex = this.element[ 0 ].selectedIndex;
        -
        -		// Change native select element
        -		this.element[ 0 ].selectedIndex = item.index;
        -		this._setText( this.buttonText, item.label );
        -		this._setAria( item );
        -		this._trigger( "select", event, { item: item } );
        -
        -		if ( item.index !== oldIndex ) {
        -			this._trigger( "change", event, { item: item } );
        -		}
        -
        -		this.close( event );
        -	},
        -
        -	_setAria: function( item ) {
        -		var id = this.menuItems.eq( item.index ).attr( "id" );
        -
        -		this.button.attr({
        -			"aria-labelledby": id,
        -			"aria-activedescendant": id
        -		});
        -		this.menu.attr( "aria-activedescendant", id );
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "icons" ) {
        -			this.button.find( "span.ui-icon" )
        -				.removeClass( this.options.icons.button )
        -				.addClass( value.button );
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "appendTo" ) {
        -			this.menuWrap.appendTo( this._appendTo() );
        -		}
        -
        -		if ( key === "disabled" ) {
        -			this.menuInstance.option( "disabled", value );
        -			this.button
        -				.toggleClass( "ui-state-disabled", value )
        -				.attr( "aria-disabled", value );
        -
        -			this.element.prop( "disabled", value );
        -			if ( value ) {
        -				this.button.attr( "tabindex", -1 );
        -				this.close();
        -			} else {
        -				this.button.attr( "tabindex", 0 );
        -			}
        -		}
        -
        -		if ( key === "width" ) {
        -			this._resizeButton();
        -		}
        -	},
        -
        -	_appendTo: function() {
        -		var element = this.options.appendTo;
        -
        -		if ( element ) {
        -			element = element.jquery || element.nodeType ?
        -				$( element ) :
        -				this.document.find( element ).eq( 0 );
        -		}
        -
        -		if ( !element || !element[ 0 ] ) {
        -			element = this.element.closest( ".ui-front" );
        -		}
        -
        -		if ( !element.length ) {
        -			element = this.document[ 0 ].body;
        -		}
        -
        -		return element;
        -	},
        -
        -	_toggleAttr: function() {
        -		this.button
        -			.toggleClass( "ui-corner-top", this.isOpen )
        -			.toggleClass( "ui-corner-all", !this.isOpen )
        -			.attr( "aria-expanded", this.isOpen );
        -		this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
        -		this.menu.attr( "aria-hidden", !this.isOpen );
        -	},
        -
        -	_resizeButton: function() {
        -		var width = this.options.width;
        -
        -		if ( !width ) {
        -			width = this.element.show().outerWidth();
        -			this.element.hide();
        -		}
        -
        -		this.button.outerWidth( width );
        -	},
        -
        -	_resizeMenu: function() {
        -		this.menu.outerWidth( Math.max(
        -			this.button.outerWidth(),
        -
        -			// support: IE10
        -			// IE10 wraps long text (possibly a rounding bug)
        -			// so we add 1px to avoid the wrapping
        -			this.menu.width( "" ).outerWidth() + 1
        -		) );
        -	},
        -
        -	_getCreateOptions: function() {
        -		return { disabled: this.element.prop( "disabled" ) };
        -	},
        -
        -	_parseOptions: function( options ) {
        -		var data = [];
        -		options.each(function( index, item ) {
        -			var option = $( item ),
        -				optgroup = option.parent( "optgroup" );
        -			data.push({
        -				element: option,
        -				index: index,
        -				value: option.val(),
        -				label: option.text(),
        -				optgroup: optgroup.attr( "label" ) || "",
        -				disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
        -			});
        -		});
        -		this.items = data;
        -	},
        -
        -	_destroy: function() {
        -		this.menuWrap.remove();
        -		this.button.remove();
        -		this.element.show();
        -		this.element.removeUniqueId();
        -		this.label.attr( "for", this.ids.element );
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Slider 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/slider/
        - */
        -
        -
        -var slider = $.widget( "ui.slider", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "slide",
        -
        -	options: {
        -		animate: false,
        -		distance: 0,
        -		max: 100,
        -		min: 0,
        -		orientation: "horizontal",
        -		range: false,
        -		step: 1,
        -		value: 0,
        -		values: null,
        -
        -		// callbacks
        -		change: null,
        -		slide: null,
        -		start: null,
        -		stop: null
        -	},
        -
        -	// number of pages in a slider
        -	// (how many times can you page up/down to go through the whole range)
        -	numPages: 5,
        -
        -	_create: function() {
        -		this._keySliding = false;
        -		this._mouseSliding = false;
        -		this._animateOff = true;
        -		this._handleIndex = null;
        -		this._detectOrientation();
        -		this._mouseInit();
        -		this._calculateNewMax();
        -
        -		this.element
        -			.addClass( "ui-slider" +
        -				" ui-slider-" + this.orientation +
        -				" ui-widget" +
        -				" ui-widget-content" +
        -				" ui-corner-all");
        -
        -		this._refresh();
        -		this._setOption( "disabled", this.options.disabled );
        -
        -		this._animateOff = false;
        -	},
        -
        -	_refresh: function() {
        -		this._createRange();
        -		this._createHandles();
        -		this._setupEvents();
        -		this._refreshValue();
        -	},
        -
        -	_createHandles: function() {
        -		var i, handleCount,
        -			options = this.options,
        -			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
        -			handle = "<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",
        -			handles = [];
        -
        -		handleCount = ( options.values && options.values.length ) || 1;
        -
        -		if ( existingHandles.length > handleCount ) {
        -			existingHandles.slice( handleCount ).remove();
        -			existingHandles = existingHandles.slice( 0, handleCount );
        -		}
        -
        -		for ( i = existingHandles.length; i < handleCount; i++ ) {
        -			handles.push( handle );
        -		}
        -
        -		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
        -
        -		this.handle = this.handles.eq( 0 );
        -
        -		this.handles.each(function( i ) {
        -			$( this ).data( "ui-slider-handle-index", i );
        -		});
        -	},
        -
        -	_createRange: function() {
        -		var options = this.options,
        -			classes = "";
        -
        -		if ( options.range ) {
        -			if ( options.range === true ) {
        -				if ( !options.values ) {
        -					options.values = [ this._valueMin(), this._valueMin() ];
        -				} else if ( options.values.length && options.values.length !== 2 ) {
        -					options.values = [ options.values[0], options.values[0] ];
        -				} else if ( $.isArray( options.values ) ) {
        -					options.values = options.values.slice(0);
        -				}
        -			}
        -
        -			if ( !this.range || !this.range.length ) {
        -				this.range = $( "<div></div>" )
        -					.appendTo( this.element );
        -
        -				classes = "ui-slider-range" +
        -				// note: this isn't the most fittingly semantic framework class for this element,
        -				// but worked best visually with a variety of themes
        -				" ui-widget-header ui-corner-all";
        -			} else {
        -				this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
        -					// Handle range switching from true to min/max
        -					.css({
        -						"left": "",
        -						"bottom": ""
        -					});
        -			}
        -
        -			this.range.addClass( classes +
        -				( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
        -		} else {
        -			if ( this.range ) {
        -				this.range.remove();
        -			}
        -			this.range = null;
        -		}
        -	},
        -
        -	_setupEvents: function() {
        -		this._off( this.handles );
        -		this._on( this.handles, this._handleEvents );
        -		this._hoverable( this.handles );
        -		this._focusable( this.handles );
        -	},
        -
        -	_destroy: function() {
        -		this.handles.remove();
        -		if ( this.range ) {
        -			this.range.remove();
        -		}
        -
        -		this.element
        -			.removeClass( "ui-slider" +
        -				" ui-slider-horizontal" +
        -				" ui-slider-vertical" +
        -				" ui-widget" +
        -				" ui-widget-content" +
        -				" ui-corner-all" );
        -
        -		this._mouseDestroy();
        -	},
        -
        -	_mouseCapture: function( event ) {
        -		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
        -			that = this,
        -			o = this.options;
        -
        -		if ( o.disabled ) {
        -			return false;
        -		}
        -
        -		this.elementSize = {
        -			width: this.element.outerWidth(),
        -			height: this.element.outerHeight()
        -		};
        -		this.elementOffset = this.element.offset();
        -
        -		position = { x: event.pageX, y: event.pageY };
        -		normValue = this._normValueFromMouse( position );
        -		distance = this._valueMax() - this._valueMin() + 1;
        -		this.handles.each(function( i ) {
        -			var thisDistance = Math.abs( normValue - that.values(i) );
        -			if (( distance > thisDistance ) ||
        -				( distance === thisDistance &&
        -					(i === that._lastChangedValue || that.values(i) === o.min ))) {
        -				distance = thisDistance;
        -				closestHandle = $( this );
        -				index = i;
        -			}
        -		});
        -
        -		allowed = this._start( event, index );
        -		if ( allowed === false ) {
        -			return false;
        -		}
        -		this._mouseSliding = true;
        -
        -		this._handleIndex = index;
        -
        -		closestHandle
        -			.addClass( "ui-state-active" )
        -			.focus();
        -
        -		offset = closestHandle.offset();
        -		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
        -		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
        -			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
        -			top: event.pageY - offset.top -
        -				( closestHandle.height() / 2 ) -
        -				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
        -				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
        -				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
        -		};
        -
        -		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
        -			this._slide( event, index, normValue );
        -		}
        -		this._animateOff = true;
        -		return true;
        -	},
        -
        -	_mouseStart: function() {
        -		return true;
        -	},
        -
        -	_mouseDrag: function( event ) {
        -		var position = { x: event.pageX, y: event.pageY },
        -			normValue = this._normValueFromMouse( position );
        -
        -		this._slide( event, this._handleIndex, normValue );
        -
        -		return false;
        -	},
        -
        -	_mouseStop: function( event ) {
        -		this.handles.removeClass( "ui-state-active" );
        -		this._mouseSliding = false;
        -
        -		this._stop( event, this._handleIndex );
        -		this._change( event, this._handleIndex );
        -
        -		this._handleIndex = null;
        -		this._clickOffset = null;
        -		this._animateOff = false;
        -
        -		return false;
        -	},
        -
        -	_detectOrientation: function() {
        -		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
        -	},
        -
        -	_normValueFromMouse: function( position ) {
        -		var pixelTotal,
        -			pixelMouse,
        -			percentMouse,
        -			valueTotal,
        -			valueMouse;
        -
        -		if ( this.orientation === "horizontal" ) {
        -			pixelTotal = this.elementSize.width;
        -			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
        -		} else {
        -			pixelTotal = this.elementSize.height;
        -			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
        -		}
        -
        -		percentMouse = ( pixelMouse / pixelTotal );
        -		if ( percentMouse > 1 ) {
        -			percentMouse = 1;
        -		}
        -		if ( percentMouse < 0 ) {
        -			percentMouse = 0;
        -		}
        -		if ( this.orientation === "vertical" ) {
        -			percentMouse = 1 - percentMouse;
        -		}
        -
        -		valueTotal = this._valueMax() - this._valueMin();
        -		valueMouse = this._valueMin() + percentMouse * valueTotal;
        -
        -		return this._trimAlignValue( valueMouse );
        -	},
        -
        -	_start: function( event, index ) {
        -		var uiHash = {
        -			handle: this.handles[ index ],
        -			value: this.value()
        -		};
        -		if ( this.options.values && this.options.values.length ) {
        -			uiHash.value = this.values( index );
        -			uiHash.values = this.values();
        -		}
        -		return this._trigger( "start", event, uiHash );
        -	},
        -
        -	_slide: function( event, index, newVal ) {
        -		var otherVal,
        -			newValues,
        -			allowed;
        -
        -		if ( this.options.values && this.options.values.length ) {
        -			otherVal = this.values( index ? 0 : 1 );
        -
        -			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
        -					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
        -				) {
        -				newVal = otherVal;
        -			}
        -
        -			if ( newVal !== this.values( index ) ) {
        -				newValues = this.values();
        -				newValues[ index ] = newVal;
        -				// A slide can be canceled by returning false from the slide callback
        -				allowed = this._trigger( "slide", event, {
        -					handle: this.handles[ index ],
        -					value: newVal,
        -					values: newValues
        -				} );
        -				otherVal = this.values( index ? 0 : 1 );
        -				if ( allowed !== false ) {
        -					this.values( index, newVal );
        -				}
        -			}
        -		} else {
        -			if ( newVal !== this.value() ) {
        -				// A slide can be canceled by returning false from the slide callback
        -				allowed = this._trigger( "slide", event, {
        -					handle: this.handles[ index ],
        -					value: newVal
        -				} );
        -				if ( allowed !== false ) {
        -					this.value( newVal );
        -				}
        -			}
        -		}
        -	},
        -
        -	_stop: function( event, index ) {
        -		var uiHash = {
        -			handle: this.handles[ index ],
        -			value: this.value()
        -		};
        -		if ( this.options.values && this.options.values.length ) {
        -			uiHash.value = this.values( index );
        -			uiHash.values = this.values();
        -		}
        -
        -		this._trigger( "stop", event, uiHash );
        -	},
        -
        -	_change: function( event, index ) {
        -		if ( !this._keySliding && !this._mouseSliding ) {
        -			var uiHash = {
        -				handle: this.handles[ index ],
        -				value: this.value()
        -			};
        -			if ( this.options.values && this.options.values.length ) {
        -				uiHash.value = this.values( index );
        -				uiHash.values = this.values();
        -			}
        -
        -			//store the last changed value index for reference when handles overlap
        -			this._lastChangedValue = index;
        -
        -			this._trigger( "change", event, uiHash );
        -		}
        -	},
        -
        -	value: function( newValue ) {
        -		if ( arguments.length ) {
        -			this.options.value = this._trimAlignValue( newValue );
        -			this._refreshValue();
        -			this._change( null, 0 );
        -			return;
        -		}
        -
        -		return this._value();
        -	},
        -
        -	values: function( index, newValue ) {
        -		var vals,
        -			newValues,
        -			i;
        -
        -		if ( arguments.length > 1 ) {
        -			this.options.values[ index ] = this._trimAlignValue( newValue );
        -			this._refreshValue();
        -			this._change( null, index );
        -			return;
        -		}
        -
        -		if ( arguments.length ) {
        -			if ( $.isArray( arguments[ 0 ] ) ) {
        -				vals = this.options.values;
        -				newValues = arguments[ 0 ];
        -				for ( i = 0; i < vals.length; i += 1 ) {
        -					vals[ i ] = this._trimAlignValue( newValues[ i ] );
        -					this._change( null, i );
        -				}
        -				this._refreshValue();
        -			} else {
        -				if ( this.options.values && this.options.values.length ) {
        -					return this._values( index );
        -				} else {
        -					return this.value();
        -				}
        -			}
        -		} else {
        -			return this._values();
        -		}
        -	},
        -
        -	_setOption: function( key, value ) {
        -		var i,
        -			valsLength = 0;
        -
        -		if ( key === "range" && this.options.range === true ) {
        -			if ( value === "min" ) {
        -				this.options.value = this._values( 0 );
        -				this.options.values = null;
        -			} else if ( value === "max" ) {
        -				this.options.value = this._values( this.options.values.length - 1 );
        -				this.options.values = null;
        -			}
        -		}
        -
        -		if ( $.isArray( this.options.values ) ) {
        -			valsLength = this.options.values.length;
        -		}
        -
        -		if ( key === "disabled" ) {
        -			this.element.toggleClass( "ui-state-disabled", !!value );
        -		}
        -
        -		this._super( key, value );
        -
        -		switch ( key ) {
        -			case "orientation":
        -				this._detectOrientation();
        -				this.element
        -					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
        -					.addClass( "ui-slider-" + this.orientation );
        -				this._refreshValue();
        -
        -				// Reset positioning from previous orientation
        -				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
        -				break;
        -			case "value":
        -				this._animateOff = true;
        -				this._refreshValue();
        -				this._change( null, 0 );
        -				this._animateOff = false;
        -				break;
        -			case "values":
        -				this._animateOff = true;
        -				this._refreshValue();
        -				for ( i = 0; i < valsLength; i += 1 ) {
        -					this._change( null, i );
        -				}
        -				this._animateOff = false;
        -				break;
        -			case "step":
        -			case "min":
        -			case "max":
        -				this._animateOff = true;
        -				this._calculateNewMax();
        -				this._refreshValue();
        -				this._animateOff = false;
        -				break;
        -			case "range":
        -				this._animateOff = true;
        -				this._refresh();
        -				this._animateOff = false;
        -				break;
        -		}
        -	},
        -
        -	//internal value getter
        -	// _value() returns value trimmed by min and max, aligned by step
        -	_value: function() {
        -		var val = this.options.value;
        -		val = this._trimAlignValue( val );
        -
        -		return val;
        -	},
        -
        -	//internal values getter
        -	// _values() returns array of values trimmed by min and max, aligned by step
        -	// _values( index ) returns single value trimmed by min and max, aligned by step
        -	_values: function( index ) {
        -		var val,
        -			vals,
        -			i;
        -
        -		if ( arguments.length ) {
        -			val = this.options.values[ index ];
        -			val = this._trimAlignValue( val );
        -
        -			return val;
        -		} else if ( this.options.values && this.options.values.length ) {
        -			// .slice() creates a copy of the array
        -			// this copy gets trimmed by min and max and then returned
        -			vals = this.options.values.slice();
        -			for ( i = 0; i < vals.length; i += 1) {
        -				vals[ i ] = this._trimAlignValue( vals[ i ] );
        -			}
        -
        -			return vals;
        -		} else {
        -			return [];
        -		}
        -	},
        -
        -	// returns the step-aligned value that val is closest to, between (inclusive) min and max
        -	_trimAlignValue: function( val ) {
        -		if ( val <= this._valueMin() ) {
        -			return this._valueMin();
        -		}
        -		if ( val >= this._valueMax() ) {
        -			return this._valueMax();
        -		}
        -		var step = ( this.options.step > 0 ) ? this.options.step : 1,
        -			valModStep = (val - this._valueMin()) % step,
        -			alignValue = val - valModStep;
        -
        -		if ( Math.abs(valModStep) * 2 >= step ) {
        -			alignValue += ( valModStep > 0 ) ? step : ( -step );
        -		}
        -
        -		// Since JavaScript has problems with large floats, round
        -		// the final value to 5 digits after the decimal point (see #4124)
        -		return parseFloat( alignValue.toFixed(5) );
        -	},
        -
        -	_calculateNewMax: function() {
        -		var max = this.options.max,
        -			min = this._valueMin(),
        -			step = this.options.step,
        -			aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;
        -		max = aboveMin + min;
        -		this.max = parseFloat( max.toFixed( this._precision() ) );
        -	},
        -
        -	_precision: function() {
        -		var precision = this._precisionOf( this.options.step );
        -		if ( this.options.min !== null ) {
        -			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        -		}
        -		return precision;
        -	},
        -
        -	_precisionOf: function( num ) {
        -		var str = num.toString(),
        -			decimal = str.indexOf( "." );
        -		return decimal === -1 ? 0 : str.length - decimal - 1;
        -	},
        -
        -	_valueMin: function() {
        -		return this.options.min;
        -	},
        -
        -	_valueMax: function() {
        -		return this.max;
        -	},
        -
        -	_refreshValue: function() {
        -		var lastValPercent, valPercent, value, valueMin, valueMax,
        -			oRange = this.options.range,
        -			o = this.options,
        -			that = this,
        -			animate = ( !this._animateOff ) ? o.animate : false,
        -			_set = {};
        -
        -		if ( this.options.values && this.options.values.length ) {
        -			this.handles.each(function( i ) {
        -				valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
        -				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        -				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        -				if ( that.options.range === true ) {
        -					if ( that.orientation === "horizontal" ) {
        -						if ( i === 0 ) {
        -							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
        -						}
        -						if ( i === 1 ) {
        -							that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
        -						}
        -					} else {
        -						if ( i === 0 ) {
        -							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
        -						}
        -						if ( i === 1 ) {
        -							that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
        -						}
        -					}
        -				}
        -				lastValPercent = valPercent;
        -			});
        -		} else {
        -			value = this.value();
        -			valueMin = this._valueMin();
        -			valueMax = this._valueMax();
        -			valPercent = ( valueMax !== valueMin ) ?
        -					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
        -					0;
        -			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
        -			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
        -
        -			if ( oRange === "min" && this.orientation === "horizontal" ) {
        -				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
        -			}
        -			if ( oRange === "max" && this.orientation === "horizontal" ) {
        -				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
        -			}
        -			if ( oRange === "min" && this.orientation === "vertical" ) {
        -				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
        -			}
        -			if ( oRange === "max" && this.orientation === "vertical" ) {
        -				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
        -			}
        -		}
        -	},
        -
        -	_handleEvents: {
        -		keydown: function( event ) {
        -			var allowed, curVal, newVal, step,
        -				index = $( event.target ).data( "ui-slider-handle-index" );
        -
        -			switch ( event.keyCode ) {
        -				case $.ui.keyCode.HOME:
        -				case $.ui.keyCode.END:
        -				case $.ui.keyCode.PAGE_UP:
        -				case $.ui.keyCode.PAGE_DOWN:
        -				case $.ui.keyCode.UP:
        -				case $.ui.keyCode.RIGHT:
        -				case $.ui.keyCode.DOWN:
        -				case $.ui.keyCode.LEFT:
        -					event.preventDefault();
        -					if ( !this._keySliding ) {
        -						this._keySliding = true;
        -						$( event.target ).addClass( "ui-state-active" );
        -						allowed = this._start( event, index );
        -						if ( allowed === false ) {
        -							return;
        -						}
        -					}
        -					break;
        -			}
        -
        -			step = this.options.step;
        -			if ( this.options.values && this.options.values.length ) {
        -				curVal = newVal = this.values( index );
        -			} else {
        -				curVal = newVal = this.value();
        -			}
        -
        -			switch ( event.keyCode ) {
        -				case $.ui.keyCode.HOME:
        -					newVal = this._valueMin();
        -					break;
        -				case $.ui.keyCode.END:
        -					newVal = this._valueMax();
        -					break;
        -				case $.ui.keyCode.PAGE_UP:
        -					newVal = this._trimAlignValue(
        -						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
        -					);
        -					break;
        -				case $.ui.keyCode.PAGE_DOWN:
        -					newVal = this._trimAlignValue(
        -						curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );
        -					break;
        -				case $.ui.keyCode.UP:
        -				case $.ui.keyCode.RIGHT:
        -					if ( curVal === this._valueMax() ) {
        -						return;
        -					}
        -					newVal = this._trimAlignValue( curVal + step );
        -					break;
        -				case $.ui.keyCode.DOWN:
        -				case $.ui.keyCode.LEFT:
        -					if ( curVal === this._valueMin() ) {
        -						return;
        -					}
        -					newVal = this._trimAlignValue( curVal - step );
        -					break;
        -			}
        -
        -			this._slide( event, index, newVal );
        -		},
        -		keyup: function( event ) {
        -			var index = $( event.target ).data( "ui-slider-handle-index" );
        -
        -			if ( this._keySliding ) {
        -				this._keySliding = false;
        -				this._stop( event, index );
        -				this._change( event, index );
        -				$( event.target ).removeClass( "ui-state-active" );
        -			}
        -		}
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Sortable 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/sortable/
        - */
        -
        -
        -var sortable = $.widget("ui.sortable", $.ui.mouse, {
        -	version: "1.11.4",
        -	widgetEventPrefix: "sort",
        -	ready: false,
        -	options: {
        -		appendTo: "parent",
        -		axis: false,
        -		connectWith: false,
        -		containment: false,
        -		cursor: "auto",
        -		cursorAt: false,
        -		dropOnEmpty: true,
        -		forcePlaceholderSize: false,
        -		forceHelperSize: false,
        -		grid: false,
        -		handle: false,
        -		helper: "original",
        -		items: "> *",
        -		opacity: false,
        -		placeholder: false,
        -		revert: false,
        -		scroll: true,
        -		scrollSensitivity: 20,
        -		scrollSpeed: 20,
        -		scope: "default",
        -		tolerance: "intersect",
        -		zIndex: 1000,
        -
        -		// callbacks
        -		activate: null,
        -		beforeStop: null,
        -		change: null,
        -		deactivate: null,
        -		out: null,
        -		over: null,
        -		receive: null,
        -		remove: null,
        -		sort: null,
        -		start: null,
        -		stop: null,
        -		update: null
        -	},
        -
        -	_isOverAxis: function( x, reference, size ) {
        -		return ( x >= reference ) && ( x < ( reference + size ) );
        -	},
        -
        -	_isFloating: function( item ) {
        -		return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
        -	},
        -
        -	_create: function() {
        -		this.containerCache = {};
        -		this.element.addClass("ui-sortable");
        -
        -		//Get the items
        -		this.refresh();
        -
        -		//Let's determine the parent's offset
        -		this.offset = this.element.offset();
        -
        -		//Initialize mouse events for interaction
        -		this._mouseInit();
        -
        -		this._setHandleClassName();
        -
        -		//We're ready to go
        -		this.ready = true;
        -
        -	},
        -
        -	_setOption: function( key, value ) {
        -		this._super( key, value );
        -
        -		if ( key === "handle" ) {
        -			this._setHandleClassName();
        -		}
        -	},
        -
        -	_setHandleClassName: function() {
        -		this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
        -		$.each( this.items, function() {
        -			( this.instance.options.handle ?
        -				this.item.find( this.instance.options.handle ) : this.item )
        -				.addClass( "ui-sortable-handle" );
        -		});
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-sortable ui-sortable-disabled" )
        -			.find( ".ui-sortable-handle" )
        -				.removeClass( "ui-sortable-handle" );
        -		this._mouseDestroy();
        -
        -		for ( var i = this.items.length - 1; i >= 0; i-- ) {
        -			this.items[i].item.removeData(this.widgetName + "-item");
        -		}
        -
        -		return this;
        -	},
        -
        -	_mouseCapture: function(event, overrideHandle) {
        -		var currentItem = null,
        -			validHandle = false,
        -			that = this;
        -
        -		if (this.reverting) {
        -			return false;
        -		}
        -
        -		if(this.options.disabled || this.options.type === "static") {
        -			return false;
        -		}
        -
        -		//We have to refresh the items data once first
        -		this._refreshItems(event);
        -
        -		//Find out if the clicked node (or one of its parents) is a actual item in this.items
        -		$(event.target).parents().each(function() {
        -			if($.data(this, that.widgetName + "-item") === that) {
        -				currentItem = $(this);
        -				return false;
        -			}
        -		});
        -		if($.data(event.target, that.widgetName + "-item") === that) {
        -			currentItem = $(event.target);
        -		}
        -
        -		if(!currentItem) {
        -			return false;
        -		}
        -		if(this.options.handle && !overrideHandle) {
        -			$(this.options.handle, currentItem).find("*").addBack().each(function() {
        -				if(this === event.target) {
        -					validHandle = true;
        -				}
        -			});
        -			if(!validHandle) {
        -				return false;
        -			}
        -		}
        -
        -		this.currentItem = currentItem;
        -		this._removeCurrentsFromItems();
        -		return true;
        -
        -	},
        -
        -	_mouseStart: function(event, overrideHandle, noActivation) {
        -
        -		var i, body,
        -			o = this.options;
        -
        -		this.currentContainer = this;
        -
        -		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
        -		this.refreshPositions();
        -
        -		//Create and append the visible helper
        -		this.helper = this._createHelper(event);
        -
        -		//Cache the helper size
        -		this._cacheHelperProportions();
        -
        -		/*
        -		 * - Position generation -
        -		 * This block generates everything position related - it's the core of draggables.
        -		 */
        -
        -		//Cache the margins of the original element
        -		this._cacheMargins();
        -
        -		//Get the next scrolling parent
        -		this.scrollParent = this.helper.scrollParent();
        -
        -		//The element's absolute position on the page minus margins
        -		this.offset = this.currentItem.offset();
        -		this.offset = {
        -			top: this.offset.top - this.margins.top,
        -			left: this.offset.left - this.margins.left
        -		};
        -
        -		$.extend(this.offset, {
        -			click: { //Where the click happened, relative to the element
        -				left: event.pageX - this.offset.left,
        -				top: event.pageY - this.offset.top
        -			},
        -			parent: this._getParentOffset(),
        -			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
        -		});
        -
        -		// Only after we got the offset, we can change the helper's position to absolute
        -		// TODO: Still need to figure out a way to make relative sorting possible
        -		this.helper.css("position", "absolute");
        -		this.cssPosition = this.helper.css("position");
        -
        -		//Generate the original position
        -		this.originalPosition = this._generatePosition(event);
        -		this.originalPageX = event.pageX;
        -		this.originalPageY = event.pageY;
        -
        -		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
        -		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
        -
        -		//Cache the former DOM position
        -		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
        -
        -		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
        -		if(this.helper[0] !== this.currentItem[0]) {
        -			this.currentItem.hide();
        -		}
        -
        -		//Create the placeholder
        -		this._createPlaceholder();
        -
        -		//Set a containment if given in the options
        -		if(o.containment) {
        -			this._setContainment();
        -		}
        -
        -		if( o.cursor && o.cursor !== "auto" ) { // cursor option
        -			body = this.document.find( "body" );
        -
        -			// support: IE
        -			this.storedCursor = body.css( "cursor" );
        -			body.css( "cursor", o.cursor );
        -
        -			this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
        -		}
        -
        -		if(o.opacity) { // opacity option
        -			if (this.helper.css("opacity")) {
        -				this._storedOpacity = this.helper.css("opacity");
        -			}
        -			this.helper.css("opacity", o.opacity);
        -		}
        -
        -		if(o.zIndex) { // zIndex option
        -			if (this.helper.css("zIndex")) {
        -				this._storedZIndex = this.helper.css("zIndex");
        -			}
        -			this.helper.css("zIndex", o.zIndex);
        -		}
        -
        -		//Prepare scrolling
        -		if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
        -			this.overflowOffset = this.scrollParent.offset();
        -		}
        -
        -		//Call callbacks
        -		this._trigger("start", event, this._uiHash());
        -
        -		//Recache the helper size
        -		if(!this._preserveHelperProportions) {
        -			this._cacheHelperProportions();
        -		}
        -
        -
        -		//Post "activate" events to possible containers
        -		if( !noActivation ) {
        -			for ( i = this.containers.length - 1; i >= 0; i-- ) {
        -				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
        -			}
        -		}
        -
        -		//Prepare possible droppables
        -		if($.ui.ddmanager) {
        -			$.ui.ddmanager.current = this;
        -		}
        -
        -		if ($.ui.ddmanager && !o.dropBehaviour) {
        -			$.ui.ddmanager.prepareOffsets(this, event);
        -		}
        -
        -		this.dragging = true;
        -
        -		this.helper.addClass("ui-sortable-helper");
        -		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
        -		return true;
        -
        -	},
        -
        -	_mouseDrag: function(event) {
        -		var i, item, itemElement, intersection,
        -			o = this.options,
        -			scrolled = false;
        -
        -		//Compute the helpers position
        -		this.position = this._generatePosition(event);
        -		this.positionAbs = this._convertPositionTo("absolute");
        -
        -		if (!this.lastPositionAbs) {
        -			this.lastPositionAbs = this.positionAbs;
        -		}
        -
        -		//Do scrolling
        -		if(this.options.scroll) {
        -			if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
        -
        -				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
        -				} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
        -				}
        -
        -				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
        -				} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
        -					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
        -				}
        -
        -			} else {
        -
        -				if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
        -					scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
        -				} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
        -					scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
        -				}
        -
        -				if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
        -					scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
        -				} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
        -					scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
        -				}
        -
        -			}
        -
        -			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
        -				$.ui.ddmanager.prepareOffsets(this, event);
        -			}
        -		}
        -
        -		//Regenerate the absolute position used for position checks
        -		this.positionAbs = this._convertPositionTo("absolute");
        -
        -		//Set the helper position
        -		if(!this.options.axis || this.options.axis !== "y") {
        -			this.helper[0].style.left = this.position.left+"px";
        -		}
        -		if(!this.options.axis || this.options.axis !== "x") {
        -			this.helper[0].style.top = this.position.top+"px";
        -		}
        -
        -		//Rearrange
        -		for (i = this.items.length - 1; i >= 0; i--) {
        -
        -			//Cache variables and intersection, continue if no intersection
        -			item = this.items[i];
        -			itemElement = item.item[0];
        -			intersection = this._intersectsWithPointer(item);
        -			if (!intersection) {
        -				continue;
        -			}
        -
        -			// Only put the placeholder inside the current Container, skip all
        -			// items from other containers. This works because when moving
        -			// an item from one container to another the
        -			// currentContainer is switched before the placeholder is moved.
        -			//
        -			// Without this, moving items in "sub-sortables" can cause
        -			// the placeholder to jitter between the outer and inner container.
        -			if (item.instance !== this.currentContainer) {
        -				continue;
        -			}
        -
        -			// cannot intersect with itself
        -			// no useless actions that have been done before
        -			// no action if the item moved is the parent of the item checked
        -			if (itemElement !== this.currentItem[0] &&
        -				this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
        -				!$.contains(this.placeholder[0], itemElement) &&
        -				(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
        -			) {
        -
        -				this.direction = intersection === 1 ? "down" : "up";
        -
        -				if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
        -					this._rearrange(event, item);
        -				} else {
        -					break;
        -				}
        -
        -				this._trigger("change", event, this._uiHash());
        -				break;
        -			}
        -		}
        -
        -		//Post events to containers
        -		this._contactContainers(event);
        -
        -		//Interconnect with droppables
        -		if($.ui.ddmanager) {
        -			$.ui.ddmanager.drag(this, event);
        -		}
        -
        -		//Call callbacks
        -		this._trigger("sort", event, this._uiHash());
        -
        -		this.lastPositionAbs = this.positionAbs;
        -		return false;
        -
        -	},
        -
        -	_mouseStop: function(event, noPropagation) {
        -
        -		if(!event) {
        -			return;
        -		}
        -
        -		//If we are using droppables, inform the manager about the drop
        -		if ($.ui.ddmanager && !this.options.dropBehaviour) {
        -			$.ui.ddmanager.drop(this, event);
        -		}
        -
        -		if(this.options.revert) {
        -			var that = this,
        -				cur = this.placeholder.offset(),
        -				axis = this.options.axis,
        -				animation = {};
        -
        -			if ( !axis || axis === "x" ) {
        -				animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
        -			}
        -			if ( !axis || axis === "y" ) {
        -				animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
        -			}
        -			this.reverting = true;
        -			$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
        -				that._clear(event);
        -			});
        -		} else {
        -			this._clear(event, noPropagation);
        -		}
        -
        -		return false;
        -
        -	},
        -
        -	cancel: function() {
        -
        -		if(this.dragging) {
        -
        -			this._mouseUp({ target: null });
        -
        -			if(this.options.helper === "original") {
        -				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
        -			} else {
        -				this.currentItem.show();
        -			}
        -
        -			//Post deactivating events to containers
        -			for (var i = this.containers.length - 1; i >= 0; i--){
        -				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
        -				if(this.containers[i].containerCache.over) {
        -					this.containers[i]._trigger("out", null, this._uiHash(this));
        -					this.containers[i].containerCache.over = 0;
        -				}
        -			}
        -
        -		}
        -
        -		if (this.placeholder) {
        -			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
        -			if(this.placeholder[0].parentNode) {
        -				this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
        -			}
        -			if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
        -				this.helper.remove();
        -			}
        -
        -			$.extend(this, {
        -				helper: null,
        -				dragging: false,
        -				reverting: false,
        -				_noFinalSort: null
        -			});
        -
        -			if(this.domPosition.prev) {
        -				$(this.domPosition.prev).after(this.currentItem);
        -			} else {
        -				$(this.domPosition.parent).prepend(this.currentItem);
        -			}
        -		}
        -
        -		return this;
        -
        -	},
        -
        -	serialize: function(o) {
        -
        -		var items = this._getItemsAsjQuery(o && o.connected),
        -			str = [];
        -		o = o || {};
        -
        -		$(items).each(function() {
        -			var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
        -			if (res) {
        -				str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
        -			}
        -		});
        -
        -		if(!str.length && o.key) {
        -			str.push(o.key + "=");
        -		}
        -
        -		return str.join("&");
        -
        -	},
        -
        -	toArray: function(o) {
        -
        -		var items = this._getItemsAsjQuery(o && o.connected),
        -			ret = [];
        -
        -		o = o || {};
        -
        -		items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
        -		return ret;
        -
        -	},
        -
        -	/* Be careful with the following core functions */
        -	_intersectsWith: function(item) {
        -
        -		var x1 = this.positionAbs.left,
        -			x2 = x1 + this.helperProportions.width,
        -			y1 = this.positionAbs.top,
        -			y2 = y1 + this.helperProportions.height,
        -			l = item.left,
        -			r = l + item.width,
        -			t = item.top,
        -			b = t + item.height,
        -			dyClick = this.offset.click.top,
        -			dxClick = this.offset.click.left,
        -			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
        -			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
        -			isOverElement = isOverElementHeight && isOverElementWidth;
        -
        -		if ( this.options.tolerance === "pointer" ||
        -			this.options.forcePointerForContainers ||
        -			(this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
        -		) {
        -			return isOverElement;
        -		} else {
        -
        -			return (l < x1 + (this.helperProportions.width / 2) && // Right Half
        -				x2 - (this.helperProportions.width / 2) < r && // Left Half
        -				t < y1 + (this.helperProportions.height / 2) && // Bottom Half
        -				y2 - (this.helperProportions.height / 2) < b ); // Top Half
        -
        -		}
        -	},
        -
        -	_intersectsWithPointer: function(item) {
        -
        -		var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
        -			isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
        -			isOverElement = isOverElementHeight && isOverElementWidth,
        -			verticalDirection = this._getDragVerticalDirection(),
        -			horizontalDirection = this._getDragHorizontalDirection();
        -
        -		if (!isOverElement) {
        -			return false;
        -		}
        -
        -		return this.floating ?
        -			( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
        -			: ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
        -
        -	},
        -
        -	_intersectsWithSides: function(item) {
        -
        -		var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
        -			isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
        -			verticalDirection = this._getDragVerticalDirection(),
        -			horizontalDirection = this._getDragHorizontalDirection();
        -
        -		if (this.floating && horizontalDirection) {
        -			return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
        -		} else {
        -			return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
        -		}
        -
        -	},
        -
        -	_getDragVerticalDirection: function() {
        -		var delta = this.positionAbs.top - this.lastPositionAbs.top;
        -		return delta !== 0 && (delta > 0 ? "down" : "up");
        -	},
        -
        -	_getDragHorizontalDirection: function() {
        -		var delta = this.positionAbs.left - this.lastPositionAbs.left;
        -		return delta !== 0 && (delta > 0 ? "right" : "left");
        -	},
        -
        -	refresh: function(event) {
        -		this._refreshItems(event);
        -		this._setHandleClassName();
        -		this.refreshPositions();
        -		return this;
        -	},
        -
        -	_connectWith: function() {
        -		var options = this.options;
        -		return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
        -	},
        -
        -	_getItemsAsjQuery: function(connected) {
        -
        -		var i, j, cur, inst,
        -			items = [],
        -			queries = [],
        -			connectWith = this._connectWith();
        -
        -		if(connectWith && connected) {
        -			for (i = connectWith.length - 1; i >= 0; i--){
        -				cur = $(connectWith[i], this.document[0]);
        -				for ( j = cur.length - 1; j >= 0; j--){
        -					inst = $.data(cur[j], this.widgetFullName);
        -					if(inst && inst !== this && !inst.options.disabled) {
        -						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
        -					}
        -				}
        -			}
        -		}
        -
        -		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
        -
        -		function addItems() {
        -			items.push( this );
        -		}
        -		for (i = queries.length - 1; i >= 0; i--){
        -			queries[i][0].each( addItems );
        -		}
        -
        -		return $(items);
        -
        -	},
        -
        -	_removeCurrentsFromItems: function() {
        -
        -		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
        -
        -		this.items = $.grep(this.items, function (item) {
        -			for (var j=0; j < list.length; j++) {
        -				if(list[j] === item.item[0]) {
        -					return false;
        -				}
        -			}
        -			return true;
        -		});
        -
        -	},
        -
        -	_refreshItems: function(event) {
        -
        -		this.items = [];
        -		this.containers = [this];
        -
        -		var i, j, cur, inst, targetData, _queries, item, queriesLength,
        -			items = this.items,
        -			queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
        -			connectWith = this._connectWith();
        -
        -		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
        -			for (i = connectWith.length - 1; i >= 0; i--){
        -				cur = $(connectWith[i], this.document[0]);
        -				for (j = cur.length - 1; j >= 0; j--){
        -					inst = $.data(cur[j], this.widgetFullName);
        -					if(inst && inst !== this && !inst.options.disabled) {
        -						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
        -						this.containers.push(inst);
        -					}
        -				}
        -			}
        -		}
        -
        -		for (i = queries.length - 1; i >= 0; i--) {
        -			targetData = queries[i][1];
        -			_queries = queries[i][0];
        -
        -			for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
        -				item = $(_queries[j]);
        -
        -				item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
        -
        -				items.push({
        -					item: item,
        -					instance: targetData,
        -					width: 0, height: 0,
        -					left: 0, top: 0
        -				});
        -			}
        -		}
        -
        -	},
        -
        -	refreshPositions: function(fast) {
        -
        -		// Determine whether items are being displayed horizontally
        -		this.floating = this.items.length ?
        -			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
        -			false;
        -
        -		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
        -		if(this.offsetParent && this.helper) {
        -			this.offset.parent = this._getParentOffset();
        -		}
        -
        -		var i, item, t, p;
        -
        -		for (i = this.items.length - 1; i >= 0; i--){
        -			item = this.items[i];
        -
        -			//We ignore calculating positions of all connected containers when we're not over them
        -			if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
        -				continue;
        -			}
        -
        -			t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
        -
        -			if (!fast) {
        -				item.width = t.outerWidth();
        -				item.height = t.outerHeight();
        -			}
        -
        -			p = t.offset();
        -			item.left = p.left;
        -			item.top = p.top;
        -		}
        -
        -		if(this.options.custom && this.options.custom.refreshContainers) {
        -			this.options.custom.refreshContainers.call(this);
        -		} else {
        -			for (i = this.containers.length - 1; i >= 0; i--){
        -				p = this.containers[i].element.offset();
        -				this.containers[i].containerCache.left = p.left;
        -				this.containers[i].containerCache.top = p.top;
        -				this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
        -				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
        -			}
        -		}
        -
        -		return this;
        -	},
        -
        -	_createPlaceholder: function(that) {
        -		that = that || this;
        -		var className,
        -			o = that.options;
        -
        -		if(!o.placeholder || o.placeholder.constructor === String) {
        -			className = o.placeholder;
        -			o.placeholder = {
        -				element: function() {
        -
        -					var nodeName = that.currentItem[0].nodeName.toLowerCase(),
        -						element = $( "<" + nodeName + ">", that.document[0] )
        -							.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
        -							.removeClass("ui-sortable-helper");
        -
        -					if ( nodeName === "tbody" ) {
        -						that._createTrPlaceholder(
        -							that.currentItem.find( "tr" ).eq( 0 ),
        -							$( "<tr>", that.document[ 0 ] ).appendTo( element )
        -						);
        -					} else if ( nodeName === "tr" ) {
        -						that._createTrPlaceholder( that.currentItem, element );
        -					} else if ( nodeName === "img" ) {
        -						element.attr( "src", that.currentItem.attr( "src" ) );
        -					}
        -
        -					if ( !className ) {
        -						element.css( "visibility", "hidden" );
        -					}
        -
        -					return element;
        -				},
        -				update: function(container, p) {
        -
        -					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
        -					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
        -					if(className && !o.forcePlaceholderSize) {
        -						return;
        -					}
        -
        -					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
        -					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
        -					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
        -				}
        -			};
        -		}
        -
        -		//Create the placeholder
        -		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
        -
        -		//Append it after the actual current item
        -		that.currentItem.after(that.placeholder);
        -
        -		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
        -		o.placeholder.update(that, that.placeholder);
        -
        -	},
        -
        -	_createTrPlaceholder: function( sourceTr, targetTr ) {
        -		var that = this;
        -
        -		sourceTr.children().each(function() {
        -			$( "<td>&#160;</td>", that.document[ 0 ] )
        -				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
        -				.appendTo( targetTr );
        -		});
        -	},
        -
        -	_contactContainers: function(event) {
        -		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
        -			innermostContainer = null,
        -			innermostIndex = null;
        -
        -		// get innermost container that intersects with item
        -		for (i = this.containers.length - 1; i >= 0; i--) {
        -
        -			// never consider a container that's located within the item itself
        -			if($.contains(this.currentItem[0], this.containers[i].element[0])) {
        -				continue;
        -			}
        -
        -			if(this._intersectsWith(this.containers[i].containerCache)) {
        -
        -				// if we've already found a container and it's more "inner" than this, then continue
        -				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
        -					continue;
        -				}
        -
        -				innermostContainer = this.containers[i];
        -				innermostIndex = i;
        -
        -			} else {
        -				// container doesn't intersect. trigger "out" event if necessary
        -				if(this.containers[i].containerCache.over) {
        -					this.containers[i]._trigger("out", event, this._uiHash(this));
        -					this.containers[i].containerCache.over = 0;
        -				}
        -			}
        -
        -		}
        -
        -		// if no intersecting containers found, return
        -		if(!innermostContainer) {
        -			return;
        -		}
        -
        -		// move the item into the container if it's not there already
        -		if(this.containers.length === 1) {
        -			if (!this.containers[innermostIndex].containerCache.over) {
        -				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
        -				this.containers[innermostIndex].containerCache.over = 1;
        -			}
        -		} else {
        -
        -			//When entering a new container, we will find the item with the least distance and append our item near it
        -			dist = 10000;
        -			itemWithLeastDistance = null;
        -			floating = innermostContainer.floating || this._isFloating(this.currentItem);
        -			posProperty = floating ? "left" : "top";
        -			sizeProperty = floating ? "width" : "height";
        -			axis = floating ? "clientX" : "clientY";
        -
        -			for (j = this.items.length - 1; j >= 0; j--) {
        -				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
        -					continue;
        -				}
        -				if(this.items[j].item[0] === this.currentItem[0]) {
        -					continue;
        -				}
        -
        -				cur = this.items[j].item.offset()[posProperty];
        -				nearBottom = false;
        -				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
        -					nearBottom = true;
        -				}
        -
        -				if ( Math.abs( event[ axis ] - cur ) < dist ) {
        -					dist = Math.abs( event[ axis ] - cur );
        -					itemWithLeastDistance = this.items[ j ];
        -					this.direction = nearBottom ? "up": "down";
        -				}
        -			}
        -
        -			//Check if dropOnEmpty is enabled
        -			if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
        -				return;
        -			}
        -
        -			if(this.currentContainer === this.containers[innermostIndex]) {
        -				if ( !this.currentContainer.containerCache.over ) {
        -					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
        -					this.currentContainer.containerCache.over = 1;
        -				}
        -				return;
        -			}
        -
        -			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
        -			this._trigger("change", event, this._uiHash());
        -			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
        -			this.currentContainer = this.containers[innermostIndex];
        -
        -			//Update the placeholder
        -			this.options.placeholder.update(this.currentContainer, this.placeholder);
        -
        -			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
        -			this.containers[innermostIndex].containerCache.over = 1;
        -		}
        -
        -
        -	},
        -
        -	_createHelper: function(event) {
        -
        -		var o = this.options,
        -			helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
        -
        -		//Add the helper to the DOM if that didn't happen already
        -		if(!helper.parents("body").length) {
        -			$(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
        -		}
        -
        -		if(helper[0] === this.currentItem[0]) {
        -			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
        -		}
        -
        -		if(!helper[0].style.width || o.forceHelperSize) {
        -			helper.width(this.currentItem.width());
        -		}
        -		if(!helper[0].style.height || o.forceHelperSize) {
        -			helper.height(this.currentItem.height());
        -		}
        -
        -		return helper;
        -
        -	},
        -
        -	_adjustOffsetFromHelper: function(obj) {
        -		if (typeof obj === "string") {
        -			obj = obj.split(" ");
        -		}
        -		if ($.isArray(obj)) {
        -			obj = {left: +obj[0], top: +obj[1] || 0};
        -		}
        -		if ("left" in obj) {
        -			this.offset.click.left = obj.left + this.margins.left;
        -		}
        -		if ("right" in obj) {
        -			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
        -		}
        -		if ("top" in obj) {
        -			this.offset.click.top = obj.top + this.margins.top;
        -		}
        -		if ("bottom" in obj) {
        -			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
        -		}
        -	},
        -
        -	_getParentOffset: function() {
        -
        -
        -		//Get the offsetParent and cache its position
        -		this.offsetParent = this.helper.offsetParent();
        -		var po = this.offsetParent.offset();
        -
        -		// This is a special case where we need to modify a offset calculated on start, since the following happened:
        -		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
        -		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
        -		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
        -		if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
        -			po.left += this.scrollParent.scrollLeft();
        -			po.top += this.scrollParent.scrollTop();
        -		}
        -
        -		// This needs to be actually done for all browsers, since pageX/pageY includes this information
        -		// with an ugly IE fix
        -		if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
        -			po = { top: 0, left: 0 };
        -		}
        -
        -		return {
        -			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
        -			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
        -		};
        -
        -	},
        -
        -	_getRelativeOffset: function() {
        -
        -		if(this.cssPosition === "relative") {
        -			var p = this.currentItem.position();
        -			return {
        -				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
        -				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
        -			};
        -		} else {
        -			return { top: 0, left: 0 };
        -		}
        -
        -	},
        -
        -	_cacheMargins: function() {
        -		this.margins = {
        -			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
        -			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
        -		};
        -	},
        -
        -	_cacheHelperProportions: function() {
        -		this.helperProportions = {
        -			width: this.helper.outerWidth(),
        -			height: this.helper.outerHeight()
        -		};
        -	},
        -
        -	_setContainment: function() {
        -
        -		var ce, co, over,
        -			o = this.options;
        -		if(o.containment === "parent") {
        -			o.containment = this.helper[0].parentNode;
        -		}
        -		if(o.containment === "document" || o.containment === "window") {
        -			this.containment = [
        -				0 - this.offset.relative.left - this.offset.parent.left,
        -				0 - this.offset.relative.top - this.offset.parent.top,
        -				o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
        -				(o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
        -			];
        -		}
        -
        -		if(!(/^(document|window|parent)$/).test(o.containment)) {
        -			ce = $(o.containment)[0];
        -			co = $(o.containment).offset();
        -			over = ($(ce).css("overflow") !== "hidden");
        -
        -			this.containment = [
        -				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
        -				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
        -				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
        -				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
        -			];
        -		}
        -
        -	},
        -
        -	_convertPositionTo: function(d, pos) {
        -
        -		if(!pos) {
        -			pos = this.position;
        -		}
        -		var mod = d === "absolute" ? 1 : -1,
        -			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
        -			scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
        -
        -		return {
        -			top: (
        -				pos.top	+																// The absolute mouse position
        -				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top * mod -											// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
        -			),
        -			left: (
        -				pos.left +																// The absolute mouse position
        -				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
        -			)
        -		};
        -
        -	},
        -
        -	_generatePosition: function(event) {
        -
        -		var top, left,
        -			o = this.options,
        -			pageX = event.pageX,
        -			pageY = event.pageY,
        -			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
        -
        -		// This is another very weird special case that only happens for relative elements:
        -		// 1. If the css position is relative
        -		// 2. and the scroll parent is the document or similar to the offset parent
        -		// we have to refresh the relative offset during the scroll so there are no jumps
        -		if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
        -			this.offset.relative = this._getRelativeOffset();
        -		}
        -
        -		/*
        -		 * - Position constraining -
        -		 * Constrain the position to a mix of grid, containment.
        -		 */
        -
        -		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
        -
        -			if(this.containment) {
        -				if(event.pageX - this.offset.click.left < this.containment[0]) {
        -					pageX = this.containment[0] + this.offset.click.left;
        -				}
        -				if(event.pageY - this.offset.click.top < this.containment[1]) {
        -					pageY = this.containment[1] + this.offset.click.top;
        -				}
        -				if(event.pageX - this.offset.click.left > this.containment[2]) {
        -					pageX = this.containment[2] + this.offset.click.left;
        -				}
        -				if(event.pageY - this.offset.click.top > this.containment[3]) {
        -					pageY = this.containment[3] + this.offset.click.top;
        -				}
        -			}
        -
        -			if(o.grid) {
        -				top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
        -				pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
        -
        -				left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
        -				pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
        -			}
        -
        -		}
        -
        -		return {
        -			top: (
        -				pageY -																// The absolute mouse position
        -				this.offset.click.top -													// Click offset (relative to the element)
        -				this.offset.relative.top	-											// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
        -			),
        -			left: (
        -				pageX -																// The absolute mouse position
        -				this.offset.click.left -												// Click offset (relative to the element)
        -				this.offset.relative.left	-											// Only for relative positioned nodes: Relative offset from element to offset parent
        -				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
        -				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
        -			)
        -		};
        -
        -	},
        -
        -	_rearrange: function(event, i, a, hardRefresh) {
        -
        -		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
        -
        -		//Various things done here to improve the performance:
        -		// 1. we create a setTimeout, that calls refreshPositions
        -		// 2. on the instance, we have a counter variable, that get's higher after every append
        -		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
        -		// 4. this lets only the last addition to the timeout stack through
        -		this.counter = this.counter ? ++this.counter : 1;
        -		var counter = this.counter;
        -
        -		this._delay(function() {
        -			if(counter === this.counter) {
        -				this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
        -			}
        -		});
        -
        -	},
        -
        -	_clear: function(event, noPropagation) {
        -
        -		this.reverting = false;
        -		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
        -		// everything else normalized again
        -		var i,
        -			delayedTriggers = [];
        -
        -		// We first have to update the dom position of the actual currentItem
        -		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
        -		if(!this._noFinalSort && this.currentItem.parent().length) {
        -			this.placeholder.before(this.currentItem);
        -		}
        -		this._noFinalSort = null;
        -
        -		if(this.helper[0] === this.currentItem[0]) {
        -			for(i in this._storedCSS) {
        -				if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
        -					this._storedCSS[i] = "";
        -				}
        -			}
        -			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
        -		} else {
        -			this.currentItem.show();
        -		}
        -
        -		if(this.fromOutside && !noPropagation) {
        -			delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
        -		}
        -		if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
        -			delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
        -		}
        -
        -		// Check if the items Container has Changed and trigger appropriate
        -		// events.
        -		if (this !== this.currentContainer) {
        -			if(!noPropagation) {
        -				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
        -				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
        -				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
        -			}
        -		}
        -
        -
        -		//Post events to containers
        -		function delayEvent( type, instance, container ) {
        -			return function( event ) {
        -				container._trigger( type, event, instance._uiHash( instance ) );
        -			};
        -		}
        -		for (i = this.containers.length - 1; i >= 0; i--){
        -			if (!noPropagation) {
        -				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
        -			}
        -			if(this.containers[i].containerCache.over) {
        -				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
        -				this.containers[i].containerCache.over = 0;
        -			}
        -		}
        -
        -		//Do what was originally in plugins
        -		if ( this.storedCursor ) {
        -			this.document.find( "body" ).css( "cursor", this.storedCursor );
        -			this.storedStylesheet.remove();
        -		}
        -		if(this._storedOpacity) {
        -			this.helper.css("opacity", this._storedOpacity);
        -		}
        -		if(this._storedZIndex) {
        -			this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
        -		}
        -
        -		this.dragging = false;
        -
        -		if(!noPropagation) {
        -			this._trigger("beforeStop", event, this._uiHash());
        -		}
        -
        -		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
        -		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
        -
        -		if ( !this.cancelHelperRemoval ) {
        -			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
        -				this.helper.remove();
        -			}
        -			this.helper = null;
        -		}
        -
        -		if(!noPropagation) {
        -			for (i=0; i < delayedTriggers.length; i++) {
        -				delayedTriggers[i].call(this, event);
        -			} //Trigger all delayed events
        -			this._trigger("stop", event, this._uiHash());
        -		}
        -
        -		this.fromOutside = false;
        -		return !this.cancelHelperRemoval;
        -
        -	},
        -
        -	_trigger: function() {
        -		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
        -			this.cancel();
        -		}
        -	},
        -
        -	_uiHash: function(_inst) {
        -		var inst = _inst || this;
        -		return {
        -			helper: inst.helper,
        -			placeholder: inst.placeholder || $([]),
        -			position: inst.position,
        -			originalPosition: inst.originalPosition,
        -			offset: inst.positionAbs,
        -			item: inst.currentItem,
        -			sender: _inst ? _inst.element : null
        -		};
        -	}
        -
        -});
        -
        -
        -/*!
        - * jQuery UI Spinner 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/spinner/
        - */
        -
        -
        -function spinner_modifier( fn ) {
        -	return function() {
        -		var previous = this.element.val();
        -		fn.apply( this, arguments );
        -		this._refresh();
        -		if ( previous !== this.element.val() ) {
        -			this._trigger( "change" );
        -		}
        -	};
        -}
        -
        -var spinner = $.widget( "ui.spinner", {
        -	version: "1.11.4",
        -	defaultElement: "<input>",
        -	widgetEventPrefix: "spin",
        -	options: {
        -		culture: null,
        -		icons: {
        -			down: "ui-icon-triangle-1-s",
        -			up: "ui-icon-triangle-1-n"
        -		},
        -		incremental: true,
        -		max: null,
        -		min: null,
        -		numberFormat: null,
        -		page: 10,
        -		step: 1,
        -
        -		change: null,
        -		spin: null,
        -		start: null,
        -		stop: null
        -	},
        -
        -	_create: function() {
        -		// handle string values that need to be parsed
        -		this._setOption( "max", this.options.max );
        -		this._setOption( "min", this.options.min );
        -		this._setOption( "step", this.options.step );
        -
        -		// Only format if there is a value, prevents the field from being marked
        -		// as invalid in Firefox, see #9573.
        -		if ( this.value() !== "" ) {
        -			// Format the value, but don't constrain.
        -			this._value( this.element.val(), true );
        -		}
        -
        -		this._draw();
        -		this._on( this._events );
        -		this._refresh();
        -
        -		// turning off autocomplete prevents the browser from remembering the
        -		// value when navigating through history, so we re-enable autocomplete
        -		// if the page is unloaded before the widget is destroyed. #7790
        -		this._on( this.window, {
        -			beforeunload: function() {
        -				this.element.removeAttr( "autocomplete" );
        -			}
        -		});
        -	},
        -
        -	_getCreateOptions: function() {
        -		var options = {},
        -			element = this.element;
        -
        -		$.each( [ "min", "max", "step" ], function( i, option ) {
        -			var value = element.attr( option );
        -			if ( value !== undefined && value.length ) {
        -				options[ option ] = value;
        -			}
        -		});
        -
        -		return options;
        -	},
        -
        -	_events: {
        -		keydown: function( event ) {
        -			if ( this._start( event ) && this._keydown( event ) ) {
        -				event.preventDefault();
        -			}
        -		},
        -		keyup: "_stop",
        -		focus: function() {
        -			this.previous = this.element.val();
        -		},
        -		blur: function( event ) {
        -			if ( this.cancelBlur ) {
        -				delete this.cancelBlur;
        -				return;
        -			}
        -
        -			this._stop();
        -			this._refresh();
        -			if ( this.previous !== this.element.val() ) {
        -				this._trigger( "change", event );
        -			}
        -		},
        -		mousewheel: function( event, delta ) {
        -			if ( !delta ) {
        -				return;
        -			}
        -			if ( !this.spinning && !this._start( event ) ) {
        -				return false;
        -			}
        -
        -			this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
        -			clearTimeout( this.mousewheelTimer );
        -			this.mousewheelTimer = this._delay(function() {
        -				if ( this.spinning ) {
        -					this._stop( event );
        -				}
        -			}, 100 );
        -			event.preventDefault();
        -		},
        -		"mousedown .ui-spinner-button": function( event ) {
        -			var previous;
        -
        -			// We never want the buttons to have focus; whenever the user is
        -			// interacting with the spinner, the focus should be on the input.
        -			// If the input is focused then this.previous is properly set from
        -			// when the input first received focus. If the input is not focused
        -			// then we need to set this.previous based on the value before spinning.
        -			previous = this.element[0] === this.document[0].activeElement ?
        -				this.previous : this.element.val();
        -			function checkFocus() {
        -				var isActive = this.element[0] === this.document[0].activeElement;
        -				if ( !isActive ) {
        -					this.element.focus();
        -					this.previous = previous;
        -					// support: IE
        -					// IE sets focus asynchronously, so we need to check if focus
        -					// moved off of the input because the user clicked on the button.
        -					this._delay(function() {
        -						this.previous = previous;
        -					});
        -				}
        -			}
        -
        -			// ensure focus is on (or stays on) the text field
        -			event.preventDefault();
        -			checkFocus.call( this );
        -
        -			// support: IE
        -			// IE doesn't prevent moving focus even with event.preventDefault()
        -			// so we set a flag to know when we should ignore the blur event
        -			// and check (again) if focus moved off of the input.
        -			this.cancelBlur = true;
        -			this._delay(function() {
        -				delete this.cancelBlur;
        -				checkFocus.call( this );
        -			});
        -
        -			if ( this._start( event ) === false ) {
        -				return;
        -			}
        -
        -			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        -		},
        -		"mouseup .ui-spinner-button": "_stop",
        -		"mouseenter .ui-spinner-button": function( event ) {
        -			// button will add ui-state-active if mouse was down while mouseleave and kept down
        -			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
        -				return;
        -			}
        -
        -			if ( this._start( event ) === false ) {
        -				return false;
        -			}
        -			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
        -		},
        -		// TODO: do we really want to consider this a stop?
        -		// shouldn't we just stop the repeater and wait until mouseup before
        -		// we trigger the stop event?
        -		"mouseleave .ui-spinner-button": "_stop"
        -	},
        -
        -	_draw: function() {
        -		var uiSpinner = this.uiSpinner = this.element
        -			.addClass( "ui-spinner-input" )
        -			.attr( "autocomplete", "off" )
        -			.wrap( this._uiSpinnerHtml() )
        -			.parent()
        -				// add buttons
        -				.append( this._buttonHtml() );
        -
        -		this.element.attr( "role", "spinbutton" );
        -
        -		// button bindings
        -		this.buttons = uiSpinner.find( ".ui-spinner-button" )
        -			.attr( "tabIndex", -1 )
        -			.button()
        -			.removeClass( "ui-corner-all" );
        -
        -		// IE 6 doesn't understand height: 50% for the buttons
        -		// unless the wrapper has an explicit height
        -		if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
        -				uiSpinner.height() > 0 ) {
        -			uiSpinner.height( uiSpinner.height() );
        -		}
        -
        -		// disable spinner if element was already disabled
        -		if ( this.options.disabled ) {
        -			this.disable();
        -		}
        -	},
        -
        -	_keydown: function( event ) {
        -		var options = this.options,
        -			keyCode = $.ui.keyCode;
        -
        -		switch ( event.keyCode ) {
        -		case keyCode.UP:
        -			this._repeat( null, 1, event );
        -			return true;
        -		case keyCode.DOWN:
        -			this._repeat( null, -1, event );
        -			return true;
        -		case keyCode.PAGE_UP:
        -			this._repeat( null, options.page, event );
        -			return true;
        -		case keyCode.PAGE_DOWN:
        -			this._repeat( null, -options.page, event );
        -			return true;
        -		}
        -
        -		return false;
        -	},
        -
        -	_uiSpinnerHtml: function() {
        -		return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
        -	},
        -
        -	_buttonHtml: function() {
        -		return "" +
        -			"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
        -				"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
        -			"</a>" +
        -			"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
        -				"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
        -			"</a>";
        -	},
        -
        -	_start: function( event ) {
        -		if ( !this.spinning && this._trigger( "start", event ) === false ) {
        -			return false;
        -		}
        -
        -		if ( !this.counter ) {
        -			this.counter = 1;
        -		}
        -		this.spinning = true;
        -		return true;
        -	},
        -
        -	_repeat: function( i, steps, event ) {
        -		i = i || 500;
        -
        -		clearTimeout( this.timer );
        -		this.timer = this._delay(function() {
        -			this._repeat( 40, steps, event );
        -		}, i );
        -
        -		this._spin( steps * this.options.step, event );
        -	},
        -
        -	_spin: function( step, event ) {
        -		var value = this.value() || 0;
        -
        -		if ( !this.counter ) {
        -			this.counter = 1;
        -		}
        -
        -		value = this._adjustValue( value + step * this._increment( this.counter ) );
        -
        -		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
        -			this._value( value );
        -			this.counter++;
        -		}
        -	},
        -
        -	_increment: function( i ) {
        -		var incremental = this.options.incremental;
        -
        -		if ( incremental ) {
        -			return $.isFunction( incremental ) ?
        -				incremental( i ) :
        -				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
        -		}
        -
        -		return 1;
        -	},
        -
        -	_precision: function() {
        -		var precision = this._precisionOf( this.options.step );
        -		if ( this.options.min !== null ) {
        -			precision = Math.max( precision, this._precisionOf( this.options.min ) );
        -		}
        -		return precision;
        -	},
        -
        -	_precisionOf: function( num ) {
        -		var str = num.toString(),
        -			decimal = str.indexOf( "." );
        -		return decimal === -1 ? 0 : str.length - decimal - 1;
        -	},
        -
        -	_adjustValue: function( value ) {
        -		var base, aboveMin,
        -			options = this.options;
        -
        -		// make sure we're at a valid step
        -		// - find out where we are relative to the base (min or 0)
        -		base = options.min !== null ? options.min : 0;
        -		aboveMin = value - base;
        -		// - round to the nearest step
        -		aboveMin = Math.round(aboveMin / options.step) * options.step;
        -		// - rounding is based on 0, so adjust back to our base
        -		value = base + aboveMin;
        -
        -		// fix precision from bad JS floating point math
        -		value = parseFloat( value.toFixed( this._precision() ) );
        -
        -		// clamp the value
        -		if ( options.max !== null && value > options.max) {
        -			return options.max;
        -		}
        -		if ( options.min !== null && value < options.min ) {
        -			return options.min;
        -		}
        -
        -		return value;
        -	},
        -
        -	_stop: function( event ) {
        -		if ( !this.spinning ) {
        -			return;
        -		}
        -
        -		clearTimeout( this.timer );
        -		clearTimeout( this.mousewheelTimer );
        -		this.counter = 0;
        -		this.spinning = false;
        -		this._trigger( "stop", event );
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "culture" || key === "numberFormat" ) {
        -			var prevValue = this._parse( this.element.val() );
        -			this.options[ key ] = value;
        -			this.element.val( this._format( prevValue ) );
        -			return;
        -		}
        -
        -		if ( key === "max" || key === "min" || key === "step" ) {
        -			if ( typeof value === "string" ) {
        -				value = this._parse( value );
        -			}
        -		}
        -		if ( key === "icons" ) {
        -			this.buttons.first().find( ".ui-icon" )
        -				.removeClass( this.options.icons.up )
        -				.addClass( value.up );
        -			this.buttons.last().find( ".ui-icon" )
        -				.removeClass( this.options.icons.down )
        -				.addClass( value.down );
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "disabled" ) {
        -			this.widget().toggleClass( "ui-state-disabled", !!value );
        -			this.element.prop( "disabled", !!value );
        -			this.buttons.button( value ? "disable" : "enable" );
        -		}
        -	},
        -
        -	_setOptions: spinner_modifier(function( options ) {
        -		this._super( options );
        -	}),
        -
        -	_parse: function( val ) {
        -		if ( typeof val === "string" && val !== "" ) {
        -			val = window.Globalize && this.options.numberFormat ?
        -				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
        -		}
        -		return val === "" || isNaN( val ) ? null : val;
        -	},
        -
        -	_format: function( value ) {
        -		if ( value === "" ) {
        -			return "";
        -		}
        -		return window.Globalize && this.options.numberFormat ?
        -			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
        -			value;
        -	},
        -
        -	_refresh: function() {
        -		this.element.attr({
        -			"aria-valuemin": this.options.min,
        -			"aria-valuemax": this.options.max,
        -			// TODO: what should we do with values that can't be parsed?
        -			"aria-valuenow": this._parse( this.element.val() )
        -		});
        -	},
        -
        -	isValid: function() {
        -		var value = this.value();
        -
        -		// null is invalid
        -		if ( value === null ) {
        -			return false;
        -		}
        -
        -		// if value gets adjusted, it's invalid
        -		return value === this._adjustValue( value );
        -	},
        -
        -	// update the value without triggering change
        -	_value: function( value, allowAny ) {
        -		var parsed;
        -		if ( value !== "" ) {
        -			parsed = this._parse( value );
        -			if ( parsed !== null ) {
        -				if ( !allowAny ) {
        -					parsed = this._adjustValue( parsed );
        -				}
        -				value = this._format( parsed );
        -			}
        -		}
        -		this.element.val( value );
        -		this._refresh();
        -	},
        -
        -	_destroy: function() {
        -		this.element
        -			.removeClass( "ui-spinner-input" )
        -			.prop( "disabled", false )
        -			.removeAttr( "autocomplete" )
        -			.removeAttr( "role" )
        -			.removeAttr( "aria-valuemin" )
        -			.removeAttr( "aria-valuemax" )
        -			.removeAttr( "aria-valuenow" );
        -		this.uiSpinner.replaceWith( this.element );
        -	},
        -
        -	stepUp: spinner_modifier(function( steps ) {
        -		this._stepUp( steps );
        -	}),
        -	_stepUp: function( steps ) {
        -		if ( this._start() ) {
        -			this._spin( (steps || 1) * this.options.step );
        -			this._stop();
        -		}
        -	},
        -
        -	stepDown: spinner_modifier(function( steps ) {
        -		this._stepDown( steps );
        -	}),
        -	_stepDown: function( steps ) {
        -		if ( this._start() ) {
        -			this._spin( (steps || 1) * -this.options.step );
        -			this._stop();
        -		}
        -	},
        -
        -	pageUp: spinner_modifier(function( pages ) {
        -		this._stepUp( (pages || 1) * this.options.page );
        -	}),
        -
        -	pageDown: spinner_modifier(function( pages ) {
        -		this._stepDown( (pages || 1) * this.options.page );
        -	}),
        -
        -	value: function( newVal ) {
        -		if ( !arguments.length ) {
        -			return this._parse( this.element.val() );
        -		}
        -		spinner_modifier( this._value ).call( this, newVal );
        -	},
        -
        -	widget: function() {
        -		return this.uiSpinner;
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Tabs 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/tabs/
        - */
        -
        -
        -var tabs = $.widget( "ui.tabs", {
        -	version: "1.11.4",
        -	delay: 300,
        -	options: {
        -		active: null,
        -		collapsible: false,
        -		event: "click",
        -		heightStyle: "content",
        -		hide: null,
        -		show: null,
        -
        -		// callbacks
        -		activate: null,
        -		beforeActivate: null,
        -		beforeLoad: null,
        -		load: null
        -	},
        -
        -	_isLocal: (function() {
        -		var rhash = /#.*$/;
        -
        -		return function( anchor ) {
        -			var anchorUrl, locationUrl;
        -
        -			// support: IE7
        -			// IE7 doesn't normalize the href property when set via script (#9317)
        -			anchor = anchor.cloneNode( false );
        -
        -			anchorUrl = anchor.href.replace( rhash, "" );
        -			locationUrl = location.href.replace( rhash, "" );
        -
        -			// decoding may throw an error if the URL isn't UTF-8 (#9518)
        -			try {
        -				anchorUrl = decodeURIComponent( anchorUrl );
        -			} catch ( error ) {}
        -			try {
        -				locationUrl = decodeURIComponent( locationUrl );
        -			} catch ( error ) {}
        -
        -			return anchor.hash.length > 1 && anchorUrl === locationUrl;
        -		};
        -	})(),
        -
        -	_create: function() {
        -		var that = this,
        -			options = this.options;
        -
        -		this.running = false;
        -
        -		this.element
        -			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
        -			.toggleClass( "ui-tabs-collapsible", options.collapsible );
        -
        -		this._processTabs();
        -		options.active = this._initialActive();
        -
        -		// Take disabling tabs via class attribute from HTML
        -		// into account and update option properly.
        -		if ( $.isArray( options.disabled ) ) {
        -			options.disabled = $.unique( options.disabled.concat(
        -				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
        -					return that.tabs.index( li );
        -				})
        -			) ).sort();
        -		}
        -
        -		// check for length avoids error when initializing empty list
        -		if ( this.options.active !== false && this.anchors.length ) {
        -			this.active = this._findActive( options.active );
        -		} else {
        -			this.active = $();
        -		}
        -
        -		this._refresh();
        -
        -		if ( this.active.length ) {
        -			this.load( options.active );
        -		}
        -	},
        -
        -	_initialActive: function() {
        -		var active = this.options.active,
        -			collapsible = this.options.collapsible,
        -			locationHash = location.hash.substring( 1 );
        -
        -		if ( active === null ) {
        -			// check the fragment identifier in the URL
        -			if ( locationHash ) {
        -				this.tabs.each(function( i, tab ) {
        -					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
        -						active = i;
        -						return false;
        -					}
        -				});
        -			}
        -
        -			// check for a tab marked active via a class
        -			if ( active === null ) {
        -				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
        -			}
        -
        -			// no active tab, set to false
        -			if ( active === null || active === -1 ) {
        -				active = this.tabs.length ? 0 : false;
        -			}
        -		}
        -
        -		// handle numbers: negative, out of range
        -		if ( active !== false ) {
        -			active = this.tabs.index( this.tabs.eq( active ) );
        -			if ( active === -1 ) {
        -				active = collapsible ? false : 0;
        -			}
        -		}
        -
        -		// don't allow collapsible: false and active: false
        -		if ( !collapsible && active === false && this.anchors.length ) {
        -			active = 0;
        -		}
        -
        -		return active;
        -	},
        -
        -	_getCreateEventData: function() {
        -		return {
        -			tab: this.active,
        -			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
        -		};
        -	},
        -
        -	_tabKeydown: function( event ) {
        -		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
        -			selectedIndex = this.tabs.index( focusedTab ),
        -			goingForward = true;
        -
        -		if ( this._handlePageNav( event ) ) {
        -			return;
        -		}
        -
        -		switch ( event.keyCode ) {
        -			case $.ui.keyCode.RIGHT:
        -			case $.ui.keyCode.DOWN:
        -				selectedIndex++;
        -				break;
        -			case $.ui.keyCode.UP:
        -			case $.ui.keyCode.LEFT:
        -				goingForward = false;
        -				selectedIndex--;
        -				break;
        -			case $.ui.keyCode.END:
        -				selectedIndex = this.anchors.length - 1;
        -				break;
        -			case $.ui.keyCode.HOME:
        -				selectedIndex = 0;
        -				break;
        -			case $.ui.keyCode.SPACE:
        -				// Activate only, no collapsing
        -				event.preventDefault();
        -				clearTimeout( this.activating );
        -				this._activate( selectedIndex );
        -				return;
        -			case $.ui.keyCode.ENTER:
        -				// Toggle (cancel delayed activation, allow collapsing)
        -				event.preventDefault();
        -				clearTimeout( this.activating );
        -				// Determine if we should collapse or activate
        -				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
        -				return;
        -			default:
        -				return;
        -		}
        -
        -		// Focus the appropriate tab, based on which key was pressed
        -		event.preventDefault();
        -		clearTimeout( this.activating );
        -		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
        -
        -		// Navigating with control/command key will prevent automatic activation
        -		if ( !event.ctrlKey && !event.metaKey ) {
        -
        -			// Update aria-selected immediately so that AT think the tab is already selected.
        -			// Otherwise AT may confuse the user by stating that they need to activate the tab,
        -			// but the tab will already be activated by the time the announcement finishes.
        -			focusedTab.attr( "aria-selected", "false" );
        -			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
        -
        -			this.activating = this._delay(function() {
        -				this.option( "active", selectedIndex );
        -			}, this.delay );
        -		}
        -	},
        -
        -	_panelKeydown: function( event ) {
        -		if ( this._handlePageNav( event ) ) {
        -			return;
        -		}
        -
        -		// Ctrl+up moves focus to the current tab
        -		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
        -			event.preventDefault();
        -			this.active.focus();
        -		}
        -	},
        -
        -	// Alt+page up/down moves focus to the previous/next tab (and activates)
        -	_handlePageNav: function( event ) {
        -		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
        -			this._activate( this._focusNextTab( this.options.active - 1, false ) );
        -			return true;
        -		}
        -		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
        -			this._activate( this._focusNextTab( this.options.active + 1, true ) );
        -			return true;
        -		}
        -	},
        -
        -	_findNextTab: function( index, goingForward ) {
        -		var lastTabIndex = this.tabs.length - 1;
        -
        -		function constrain() {
        -			if ( index > lastTabIndex ) {
        -				index = 0;
        -			}
        -			if ( index < 0 ) {
        -				index = lastTabIndex;
        -			}
        -			return index;
        -		}
        -
        -		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
        -			index = goingForward ? index + 1 : index - 1;
        -		}
        -
        -		return index;
        -	},
        -
        -	_focusNextTab: function( index, goingForward ) {
        -		index = this._findNextTab( index, goingForward );
        -		this.tabs.eq( index ).focus();
        -		return index;
        -	},
        -
        -	_setOption: function( key, value ) {
        -		if ( key === "active" ) {
        -			// _activate() will handle invalid values and update this.options
        -			this._activate( value );
        -			return;
        -		}
        -
        -		if ( key === "disabled" ) {
        -			// don't use the widget factory's disabled handling
        -			this._setupDisabled( value );
        -			return;
        -		}
        -
        -		this._super( key, value);
        -
        -		if ( key === "collapsible" ) {
        -			this.element.toggleClass( "ui-tabs-collapsible", value );
        -			// Setting collapsible: false while collapsed; open first panel
        -			if ( !value && this.options.active === false ) {
        -				this._activate( 0 );
        -			}
        -		}
        -
        -		if ( key === "event" ) {
        -			this._setupEvents( value );
        -		}
        -
        -		if ( key === "heightStyle" ) {
        -			this._setupHeightStyle( value );
        -		}
        -	},
        -
        -	_sanitizeSelector: function( hash ) {
        -		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
        -	},
        -
        -	refresh: function() {
        -		var options = this.options,
        -			lis = this.tablist.children( ":has(a[href])" );
        -
        -		// get disabled tabs from class attribute from HTML
        -		// this will get converted to a boolean if needed in _refresh()
        -		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
        -			return lis.index( tab );
        -		});
        -
        -		this._processTabs();
        -
        -		// was collapsed or no tabs
        -		if ( options.active === false || !this.anchors.length ) {
        -			options.active = false;
        -			this.active = $();
        -		// was active, but active tab is gone
        -		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
        -			// all remaining tabs are disabled
        -			if ( this.tabs.length === options.disabled.length ) {
        -				options.active = false;
        -				this.active = $();
        -			// activate previous tab
        -			} else {
        -				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
        -			}
        -		// was active, active tab still exists
        -		} else {
        -			// make sure active index is correct
        -			options.active = this.tabs.index( this.active );
        -		}
        -
        -		this._refresh();
        -	},
        -
        -	_refresh: function() {
        -		this._setupDisabled( this.options.disabled );
        -		this._setupEvents( this.options.event );
        -		this._setupHeightStyle( this.options.heightStyle );
        -
        -		this.tabs.not( this.active ).attr({
        -			"aria-selected": "false",
        -			"aria-expanded": "false",
        -			tabIndex: -1
        -		});
        -		this.panels.not( this._getPanelForTab( this.active ) )
        -			.hide()
        -			.attr({
        -				"aria-hidden": "true"
        -			});
        -
        -		// Make sure one tab is in the tab order
        -		if ( !this.active.length ) {
        -			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
        -		} else {
        -			this.active
        -				.addClass( "ui-tabs-active ui-state-active" )
        -				.attr({
        -					"aria-selected": "true",
        -					"aria-expanded": "true",
        -					tabIndex: 0
        -				});
        -			this._getPanelForTab( this.active )
        -				.show()
        -				.attr({
        -					"aria-hidden": "false"
        -				});
        -		}
        -	},
        -
        -	_processTabs: function() {
        -		var that = this,
        -			prevTabs = this.tabs,
        -			prevAnchors = this.anchors,
        -			prevPanels = this.panels;
        -
        -		this.tablist = this._getList()
        -			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
        -			.attr( "role", "tablist" )
        -
        -			// Prevent users from focusing disabled tabs via click
        -			.delegate( "> li", "mousedown" + this.eventNamespace, function( event ) {
        -				if ( $( this ).is( ".ui-state-disabled" ) ) {
        -					event.preventDefault();
        -				}
        -			})
        -
        -			// support: IE <9
        -			// Preventing the default action in mousedown doesn't prevent IE
        -			// from focusing the element, so if the anchor gets focused, blur.
        -			// We don't have to worry about focusing the previously focused
        -			// element since clicking on a non-focusable element should focus
        -			// the body anyway.
        -			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
        -				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
        -					this.blur();
        -				}
        -			});
        -
        -		this.tabs = this.tablist.find( "> li:has(a[href])" )
        -			.addClass( "ui-state-default ui-corner-top" )
        -			.attr({
        -				role: "tab",
        -				tabIndex: -1
        -			});
        -
        -		this.anchors = this.tabs.map(function() {
        -				return $( "a", this )[ 0 ];
        -			})
        -			.addClass( "ui-tabs-anchor" )
        -			.attr({
        -				role: "presentation",
        -				tabIndex: -1
        -			});
        -
        -		this.panels = $();
        -
        -		this.anchors.each(function( i, anchor ) {
        -			var selector, panel, panelId,
        -				anchorId = $( anchor ).uniqueId().attr( "id" ),
        -				tab = $( anchor ).closest( "li" ),
        -				originalAriaControls = tab.attr( "aria-controls" );
        -
        -			// inline tab
        -			if ( that._isLocal( anchor ) ) {
        -				selector = anchor.hash;
        -				panelId = selector.substring( 1 );
        -				panel = that.element.find( that._sanitizeSelector( selector ) );
        -			// remote tab
        -			} else {
        -				// If the tab doesn't already have aria-controls,
        -				// generate an id by using a throw-away element
        -				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
        -				selector = "#" + panelId;
        -				panel = that.element.find( selector );
        -				if ( !panel.length ) {
        -					panel = that._createPanel( panelId );
        -					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
        -				}
        -				panel.attr( "aria-live", "polite" );
        -			}
        -
        -			if ( panel.length) {
        -				that.panels = that.panels.add( panel );
        -			}
        -			if ( originalAriaControls ) {
        -				tab.data( "ui-tabs-aria-controls", originalAriaControls );
        -			}
        -			tab.attr({
        -				"aria-controls": panelId,
        -				"aria-labelledby": anchorId
        -			});
        -			panel.attr( "aria-labelledby", anchorId );
        -		});
        -
        -		this.panels
        -			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
        -			.attr( "role", "tabpanel" );
        -
        -		// Avoid memory leaks (#10056)
        -		if ( prevTabs ) {
        -			this._off( prevTabs.not( this.tabs ) );
        -			this._off( prevAnchors.not( this.anchors ) );
        -			this._off( prevPanels.not( this.panels ) );
        -		}
        -	},
        -
        -	// allow overriding how to find the list for rare usage scenarios (#7715)
        -	_getList: function() {
        -		return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
        -	},
        -
        -	_createPanel: function( id ) {
        -		return $( "<div>" )
        -			.attr( "id", id )
        -			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
        -			.data( "ui-tabs-destroy", true );
        -	},
        -
        -	_setupDisabled: function( disabled ) {
        -		if ( $.isArray( disabled ) ) {
        -			if ( !disabled.length ) {
        -				disabled = false;
        -			} else if ( disabled.length === this.anchors.length ) {
        -				disabled = true;
        -			}
        -		}
        -
        -		// disable tabs
        -		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
        -			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
        -				$( li )
        -					.addClass( "ui-state-disabled" )
        -					.attr( "aria-disabled", "true" );
        -			} else {
        -				$( li )
        -					.removeClass( "ui-state-disabled" )
        -					.removeAttr( "aria-disabled" );
        -			}
        -		}
        -
        -		this.options.disabled = disabled;
        -	},
        -
        -	_setupEvents: function( event ) {
        -		var events = {};
        -		if ( event ) {
        -			$.each( event.split(" "), function( index, eventName ) {
        -				events[ eventName ] = "_eventHandler";
        -			});
        -		}
        -
        -		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
        -		// Always prevent the default action, even when disabled
        -		this._on( true, this.anchors, {
        -			click: function( event ) {
        -				event.preventDefault();
        -			}
        -		});
        -		this._on( this.anchors, events );
        -		this._on( this.tabs, { keydown: "_tabKeydown" } );
        -		this._on( this.panels, { keydown: "_panelKeydown" } );
        -
        -		this._focusable( this.tabs );
        -		this._hoverable( this.tabs );
        -	},
        -
        -	_setupHeightStyle: function( heightStyle ) {
        -		var maxHeight,
        -			parent = this.element.parent();
        -
        -		if ( heightStyle === "fill" ) {
        -			maxHeight = parent.height();
        -			maxHeight -= this.element.outerHeight() - this.element.height();
        -
        -			this.element.siblings( ":visible" ).each(function() {
        -				var elem = $( this ),
        -					position = elem.css( "position" );
        -
        -				if ( position === "absolute" || position === "fixed" ) {
        -					return;
        -				}
        -				maxHeight -= elem.outerHeight( true );
        -			});
        -
        -			this.element.children().not( this.panels ).each(function() {
        -				maxHeight -= $( this ).outerHeight( true );
        -			});
        -
        -			this.panels.each(function() {
        -				$( this ).height( Math.max( 0, maxHeight -
        -					$( this ).innerHeight() + $( this ).height() ) );
        -			})
        -			.css( "overflow", "auto" );
        -		} else if ( heightStyle === "auto" ) {
        -			maxHeight = 0;
        -			this.panels.each(function() {
        -				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
        -			}).height( maxHeight );
        -		}
        -	},
        -
        -	_eventHandler: function( event ) {
        -		var options = this.options,
        -			active = this.active,
        -			anchor = $( event.currentTarget ),
        -			tab = anchor.closest( "li" ),
        -			clickedIsActive = tab[ 0 ] === active[ 0 ],
        -			collapsing = clickedIsActive && options.collapsible,
        -			toShow = collapsing ? $() : this._getPanelForTab( tab ),
        -			toHide = !active.length ? $() : this._getPanelForTab( active ),
        -			eventData = {
        -				oldTab: active,
        -				oldPanel: toHide,
        -				newTab: collapsing ? $() : tab,
        -				newPanel: toShow
        -			};
        -
        -		event.preventDefault();
        -
        -		if ( tab.hasClass( "ui-state-disabled" ) ||
        -				// tab is already loading
        -				tab.hasClass( "ui-tabs-loading" ) ||
        -				// can't switch durning an animation
        -				this.running ||
        -				// click on active header, but not collapsible
        -				( clickedIsActive && !options.collapsible ) ||
        -				// allow canceling activation
        -				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
        -			return;
        -		}
        -
        -		options.active = collapsing ? false : this.tabs.index( tab );
        -
        -		this.active = clickedIsActive ? $() : tab;
        -		if ( this.xhr ) {
        -			this.xhr.abort();
        -		}
        -
        -		if ( !toHide.length && !toShow.length ) {
        -			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
        -		}
        -
        -		if ( toShow.length ) {
        -			this.load( this.tabs.index( tab ), event );
        -		}
        -		this._toggle( event, eventData );
        -	},
        -
        -	// handles show/hide for selecting tabs
        -	_toggle: function( event, eventData ) {
        -		var that = this,
        -			toShow = eventData.newPanel,
        -			toHide = eventData.oldPanel;
        -
        -		this.running = true;
        -
        -		function complete() {
        -			that.running = false;
        -			that._trigger( "activate", event, eventData );
        -		}
        -
        -		function show() {
        -			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
        -
        -			if ( toShow.length && that.options.show ) {
        -				that._show( toShow, that.options.show, complete );
        -			} else {
        -				toShow.show();
        -				complete();
        -			}
        -		}
        -
        -		// start out by hiding, then showing, then completing
        -		if ( toHide.length && this.options.hide ) {
        -			this._hide( toHide, this.options.hide, function() {
        -				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
        -				show();
        -			});
        -		} else {
        -			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
        -			toHide.hide();
        -			show();
        -		}
        -
        -		toHide.attr( "aria-hidden", "true" );
        -		eventData.oldTab.attr({
        -			"aria-selected": "false",
        -			"aria-expanded": "false"
        -		});
        -		// If we're switching tabs, remove the old tab from the tab order.
        -		// If we're opening from collapsed state, remove the previous tab from the tab order.
        -		// If we're collapsing, then keep the collapsing tab in the tab order.
        -		if ( toShow.length && toHide.length ) {
        -			eventData.oldTab.attr( "tabIndex", -1 );
        -		} else if ( toShow.length ) {
        -			this.tabs.filter(function() {
        -				return $( this ).attr( "tabIndex" ) === 0;
        -			})
        -			.attr( "tabIndex", -1 );
        -		}
        -
        -		toShow.attr( "aria-hidden", "false" );
        -		eventData.newTab.attr({
        -			"aria-selected": "true",
        -			"aria-expanded": "true",
        -			tabIndex: 0
        -		});
        -	},
        -
        -	_activate: function( index ) {
        -		var anchor,
        -			active = this._findActive( index );
        -
        -		// trying to activate the already active panel
        -		if ( active[ 0 ] === this.active[ 0 ] ) {
        -			return;
        -		}
        -
        -		// trying to collapse, simulate a click on the current active header
        -		if ( !active.length ) {
        -			active = this.active;
        -		}
        -
        -		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
        -		this._eventHandler({
        -			target: anchor,
        -			currentTarget: anchor,
        -			preventDefault: $.noop
        -		});
        -	},
        -
        -	_findActive: function( index ) {
        -		return index === false ? $() : this.tabs.eq( index );
        -	},
        -
        -	_getIndex: function( index ) {
        -		// meta-function to give users option to provide a href string instead of a numerical index.
        -		if ( typeof index === "string" ) {
        -			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
        -		}
        -
        -		return index;
        -	},
        -
        -	_destroy: function() {
        -		if ( this.xhr ) {
        -			this.xhr.abort();
        -		}
        -
        -		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
        -
        -		this.tablist
        -			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
        -			.removeAttr( "role" );
        -
        -		this.anchors
        -			.removeClass( "ui-tabs-anchor" )
        -			.removeAttr( "role" )
        -			.removeAttr( "tabIndex" )
        -			.removeUniqueId();
        -
        -		this.tablist.unbind( this.eventNamespace );
        -
        -		this.tabs.add( this.panels ).each(function() {
        -			if ( $.data( this, "ui-tabs-destroy" ) ) {
        -				$( this ).remove();
        -			} else {
        -				$( this )
        -					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
        -						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
        -					.removeAttr( "tabIndex" )
        -					.removeAttr( "aria-live" )
        -					.removeAttr( "aria-busy" )
        -					.removeAttr( "aria-selected" )
        -					.removeAttr( "aria-labelledby" )
        -					.removeAttr( "aria-hidden" )
        -					.removeAttr( "aria-expanded" )
        -					.removeAttr( "role" );
        -			}
        -		});
        -
        -		this.tabs.each(function() {
        -			var li = $( this ),
        -				prev = li.data( "ui-tabs-aria-controls" );
        -			if ( prev ) {
        -				li
        -					.attr( "aria-controls", prev )
        -					.removeData( "ui-tabs-aria-controls" );
        -			} else {
        -				li.removeAttr( "aria-controls" );
        -			}
        -		});
        -
        -		this.panels.show();
        -
        -		if ( this.options.heightStyle !== "content" ) {
        -			this.panels.css( "height", "" );
        -		}
        -	},
        -
        -	enable: function( index ) {
        -		var disabled = this.options.disabled;
        -		if ( disabled === false ) {
        -			return;
        -		}
        -
        -		if ( index === undefined ) {
        -			disabled = false;
        -		} else {
        -			index = this._getIndex( index );
        -			if ( $.isArray( disabled ) ) {
        -				disabled = $.map( disabled, function( num ) {
        -					return num !== index ? num : null;
        -				});
        -			} else {
        -				disabled = $.map( this.tabs, function( li, num ) {
        -					return num !== index ? num : null;
        -				});
        -			}
        -		}
        -		this._setupDisabled( disabled );
        -	},
        -
        -	disable: function( index ) {
        -		var disabled = this.options.disabled;
        -		if ( disabled === true ) {
        -			return;
        -		}
        -
        -		if ( index === undefined ) {
        -			disabled = true;
        -		} else {
        -			index = this._getIndex( index );
        -			if ( $.inArray( index, disabled ) !== -1 ) {
        -				return;
        -			}
        -			if ( $.isArray( disabled ) ) {
        -				disabled = $.merge( [ index ], disabled ).sort();
        -			} else {
        -				disabled = [ index ];
        -			}
        -		}
        -		this._setupDisabled( disabled );
        -	},
        -
        -	load: function( index, event ) {
        -		index = this._getIndex( index );
        -		var that = this,
        -			tab = this.tabs.eq( index ),
        -			anchor = tab.find( ".ui-tabs-anchor" ),
        -			panel = this._getPanelForTab( tab ),
        -			eventData = {
        -				tab: tab,
        -				panel: panel
        -			},
        -			complete = function( jqXHR, status ) {
        -				if ( status === "abort" ) {
        -					that.panels.stop( false, true );
        -				}
        -
        -				tab.removeClass( "ui-tabs-loading" );
        -				panel.removeAttr( "aria-busy" );
        -
        -				if ( jqXHR === that.xhr ) {
        -					delete that.xhr;
        -				}
        -			};
        -
        -		// not remote
        -		if ( this._isLocal( anchor[ 0 ] ) ) {
        -			return;
        -		}
        -
        -		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
        -
        -		// support: jQuery <1.8
        -		// jQuery <1.8 returns false if the request is canceled in beforeSend,
        -		// but as of 1.8, $.ajax() always returns a jqXHR object.
        -		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
        -			tab.addClass( "ui-tabs-loading" );
        -			panel.attr( "aria-busy", "true" );
        -
        -			this.xhr
        -				.done(function( response, status, jqXHR ) {
        -					// support: jQuery <1.8
        -					// http://bugs.jquery.com/ticket/11778
        -					setTimeout(function() {
        -						panel.html( response );
        -						that._trigger( "load", event, eventData );
        -
        -						complete( jqXHR, status );
        -					}, 1 );
        -				})
        -				.fail(function( jqXHR, status ) {
        -					// support: jQuery <1.8
        -					// http://bugs.jquery.com/ticket/11778
        -					setTimeout(function() {
        -						complete( jqXHR, status );
        -					}, 1 );
        -				});
        -		}
        -	},
        -
        -	_ajaxSettings: function( anchor, event, eventData ) {
        -		var that = this;
        -		return {
        -			url: anchor.attr( "href" ),
        -			beforeSend: function( jqXHR, settings ) {
        -				return that._trigger( "beforeLoad", event,
        -					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
        -			}
        -		};
        -	},
        -
        -	_getPanelForTab: function( tab ) {
        -		var id = $( tab ).attr( "aria-controls" );
        -		return this.element.find( this._sanitizeSelector( "#" + id ) );
        -	}
        -});
        -
        -
        -/*!
        - * jQuery UI Tooltip 1.11.4
        - * http://jqueryui.com
        - *
        - * Copyright jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/tooltip/
        - */
        -
        -
        -var tooltip = $.widget( "ui.tooltip", {
        -	version: "1.11.4",
        -	options: {
        -		content: function() {
        -			// support: IE<9, Opera in jQuery <1.7
        -			// .text() can't accept undefined, so coerce to a string
        -			var title = $( this ).attr( "title" ) || "";
        -			// Escape title, since we're going from an attribute to raw HTML
        -			return $( "<a>" ).text( title ).html();
        -		},
        -		hide: true,
        -		// Disabled elements have inconsistent behavior across browsers (#8661)
        -		items: "[title]:not([disabled])",
        -		position: {
        -			my: "left top+15",
        -			at: "left bottom",
        -			collision: "flipfit flip"
        -		},
        -		show: true,
        -		tooltipClass: null,
        -		track: false,
        -
        -		// callbacks
        -		close: null,
        -		open: null
        -	},
        -
        -	_addDescribedBy: function( elem, id ) {
        -		var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
        -		describedby.push( id );
        -		elem
        -			.data( "ui-tooltip-id", id )
        -			.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
        -	},
        -
        -	_removeDescribedBy: function( elem ) {
        -		var id = elem.data( "ui-tooltip-id" ),
        -			describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
        -			index = $.inArray( id, describedby );
        -
        -		if ( index !== -1 ) {
        -			describedby.splice( index, 1 );
        -		}
        -
        -		elem.removeData( "ui-tooltip-id" );
        -		describedby = $.trim( describedby.join( " " ) );
        -		if ( describedby ) {
        -			elem.attr( "aria-describedby", describedby );
        -		} else {
        -			elem.removeAttr( "aria-describedby" );
        -		}
        -	},
        -
        -	_create: function() {
        -		this._on({
        -			mouseover: "open",
        -			focusin: "open"
        -		});
        -
        -		// IDs of generated tooltips, needed for destroy
        -		this.tooltips = {};
        -
        -		// IDs of parent tooltips where we removed the title attribute
        -		this.parents = {};
        -
        -		if ( this.options.disabled ) {
        -			this._disable();
        -		}
        -
        -		// Append the aria-live region so tooltips announce correctly
        -		this.liveRegion = $( "<div>" )
        -			.attr({
        -				role: "log",
        -				"aria-live": "assertive",
        -				"aria-relevant": "additions"
        -			})
        -			.addClass( "ui-helper-hidden-accessible" )
        -			.appendTo( this.document[ 0 ].body );
        -	},
        -
        -	_setOption: function( key, value ) {
        -		var that = this;
        -
        -		if ( key === "disabled" ) {
        -			this[ value ? "_disable" : "_enable" ]();
        -			this.options[ key ] = value;
        -			// disable element style changes
        -			return;
        -		}
        -
        -		this._super( key, value );
        -
        -		if ( key === "content" ) {
        -			$.each( this.tooltips, function( id, tooltipData ) {
        -				that._updateContent( tooltipData.element );
        -			});
        -		}
        -	},
        -
        -	_disable: function() {
        -		var that = this;
        -
        -		// close open tooltips
        -		$.each( this.tooltips, function( id, tooltipData ) {
        -			var event = $.Event( "blur" );
        -			event.target = event.currentTarget = tooltipData.element[ 0 ];
        -			that.close( event, true );
        -		});
        -
        -		// remove title attributes to prevent native tooltips
        -		this.element.find( this.options.items ).addBack().each(function() {
        -			var element = $( this );
        -			if ( element.is( "[title]" ) ) {
        -				element
        -					.data( "ui-tooltip-title", element.attr( "title" ) )
        -					.removeAttr( "title" );
        -			}
        -		});
        -	},
        -
        -	_enable: function() {
        -		// restore title attributes
        -		this.element.find( this.options.items ).addBack().each(function() {
        -			var element = $( this );
        -			if ( element.data( "ui-tooltip-title" ) ) {
        -				element.attr( "title", element.data( "ui-tooltip-title" ) );
        -			}
        -		});
        -	},
        -
        -	open: function( event ) {
        -		var that = this,
        -			target = $( event ? event.target : this.element )
        -				// we need closest here due to mouseover bubbling,
        -				// but always pointing at the same event target
        -				.closest( this.options.items );
        -
        -		// No element to show a tooltip for or the tooltip is already open
        -		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
        -			return;
        -		}
        -
        -		if ( target.attr( "title" ) ) {
        -			target.data( "ui-tooltip-title", target.attr( "title" ) );
        -		}
        -
        -		target.data( "ui-tooltip-open", true );
        -
        -		// kill parent tooltips, custom or native, for hover
        -		if ( event && event.type === "mouseover" ) {
        -			target.parents().each(function() {
        -				var parent = $( this ),
        -					blurEvent;
        -				if ( parent.data( "ui-tooltip-open" ) ) {
        -					blurEvent = $.Event( "blur" );
        -					blurEvent.target = blurEvent.currentTarget = this;
        -					that.close( blurEvent, true );
        -				}
        -				if ( parent.attr( "title" ) ) {
        -					parent.uniqueId();
        -					that.parents[ this.id ] = {
        -						element: this,
        -						title: parent.attr( "title" )
        -					};
        -					parent.attr( "title", "" );
        -				}
        -			});
        -		}
        -
        -		this._registerCloseHandlers( event, target );
        -		this._updateContent( target, event );
        -	},
        -
        -	_updateContent: function( target, event ) {
        -		var content,
        -			contentOption = this.options.content,
        -			that = this,
        -			eventType = event ? event.type : null;
        -
        -		if ( typeof contentOption === "string" ) {
        -			return this._open( event, target, contentOption );
        -		}
        -
        -		content = contentOption.call( target[0], function( response ) {
        -
        -			// IE may instantly serve a cached response for ajax requests
        -			// delay this call to _open so the other call to _open runs first
        -			that._delay(function() {
        -
        -				// Ignore async response if tooltip was closed already
        -				if ( !target.data( "ui-tooltip-open" ) ) {
        -					return;
        -				}
        -
        -				// jQuery creates a special event for focusin when it doesn't
        -				// exist natively. To improve performance, the native event
        -				// object is reused and the type is changed. Therefore, we can't
        -				// rely on the type being correct after the event finished
        -				// bubbling, so we set it back to the previous value. (#8740)
        -				if ( event ) {
        -					event.type = eventType;
        -				}
        -				this._open( event, target, response );
        -			});
        -		});
        -		if ( content ) {
        -			this._open( event, target, content );
        -		}
        -	},
        -
        -	_open: function( event, target, content ) {
        -		var tooltipData, tooltip, delayedShow, a11yContent,
        -			positionOption = $.extend( {}, this.options.position );
        -
        -		if ( !content ) {
        -			return;
        -		}
        -
        -		// Content can be updated multiple times. If the tooltip already
        -		// exists, then just update the content and bail.
        -		tooltipData = this._find( target );
        -		if ( tooltipData ) {
        -			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
        -			return;
        -		}
        -
        -		// if we have a title, clear it to prevent the native tooltip
        -		// we have to check first to avoid defining a title if none exists
        -		// (we don't want to cause an element to start matching [title])
        -		//
        -		// We use removeAttr only for key events, to allow IE to export the correct
        -		// accessible attributes. For mouse events, set to empty string to avoid
        -		// native tooltip showing up (happens only when removing inside mouseover).
        -		if ( target.is( "[title]" ) ) {
        -			if ( event && event.type === "mouseover" ) {
        -				target.attr( "title", "" );
        -			} else {
        -				target.removeAttr( "title" );
        -			}
        -		}
        -
        -		tooltipData = this._tooltip( target );
        -		tooltip = tooltipData.tooltip;
        -		this._addDescribedBy( target, tooltip.attr( "id" ) );
        -		tooltip.find( ".ui-tooltip-content" ).html( content );
        -
        -		// Support: Voiceover on OS X, JAWS on IE <= 9
        -		// JAWS announces deletions even when aria-relevant="additions"
        -		// Voiceover will sometimes re-read the entire log region's contents from the beginning
        -		this.liveRegion.children().hide();
        -		if ( content.clone ) {
        -			a11yContent = content.clone();
        -			a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
        -		} else {
        -			a11yContent = content;
        -		}
        -		$( "<div>" ).html( a11yContent ).appendTo( this.liveRegion );
        -
        -		function position( event ) {
        -			positionOption.of = event;
        -			if ( tooltip.is( ":hidden" ) ) {
        -				return;
        -			}
        -			tooltip.position( positionOption );
        -		}
        -		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
        -			this._on( this.document, {
        -				mousemove: position
        -			});
        -			// trigger once to override element-relative positioning
        -			position( event );
        -		} else {
        -			tooltip.position( $.extend({
        -				of: target
        -			}, this.options.position ) );
        -		}
        -
        -		tooltip.hide();
        -
        -		this._show( tooltip, this.options.show );
        -		// Handle tracking tooltips that are shown with a delay (#8644). As soon
        -		// as the tooltip is visible, position the tooltip using the most recent
        -		// event.
        -		if ( this.options.show && this.options.show.delay ) {
        -			delayedShow = this.delayedShow = setInterval(function() {
        -				if ( tooltip.is( ":visible" ) ) {
        -					position( positionOption.of );
        -					clearInterval( delayedShow );
        -				}
        -			}, $.fx.interval );
        -		}
        -
        -		this._trigger( "open", event, { tooltip: tooltip } );
        -	},
        -
        -	_registerCloseHandlers: function( event, target ) {
        -		var events = {
        -			keyup: function( event ) {
        -				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
        -					var fakeEvent = $.Event(event);
        -					fakeEvent.currentTarget = target[0];
        -					this.close( fakeEvent, true );
        -				}
        -			}
        -		};
        -
        -		// Only bind remove handler for delegated targets. Non-delegated
        -		// tooltips will handle this in destroy.
        -		if ( target[ 0 ] !== this.element[ 0 ] ) {
        -			events.remove = function() {
        -				this._removeTooltip( this._find( target ).tooltip );
        -			};
        -		}
        -
        -		if ( !event || event.type === "mouseover" ) {
        -			events.mouseleave = "close";
        -		}
        -		if ( !event || event.type === "focusin" ) {
        -			events.focusout = "close";
        -		}
        -		this._on( true, target, events );
        -	},
        -
        -	close: function( event ) {
        -		var tooltip,
        -			that = this,
        -			target = $( event ? event.currentTarget : this.element ),
        -			tooltipData = this._find( target );
        -
        -		// The tooltip may already be closed
        -		if ( !tooltipData ) {
        -
        -			// We set ui-tooltip-open immediately upon open (in open()), but only set the
        -			// additional data once there's actually content to show (in _open()). So even if the
        -			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
        -			// the period between open() and _open().
        -			target.removeData( "ui-tooltip-open" );
        -			return;
        -		}
        -
        -		tooltip = tooltipData.tooltip;
        -
        -		// disabling closes the tooltip, so we need to track when we're closing
        -		// to avoid an infinite loop in case the tooltip becomes disabled on close
        -		if ( tooltipData.closing ) {
        -			return;
        -		}
        -
        -		// Clear the interval for delayed tracking tooltips
        -		clearInterval( this.delayedShow );
        -
        -		// only set title if we had one before (see comment in _open())
        -		// If the title attribute has changed since open(), don't restore
        -		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
        -			target.attr( "title", target.data( "ui-tooltip-title" ) );
        -		}
        -
        -		this._removeDescribedBy( target );
        -
        -		tooltipData.hiding = true;
        -		tooltip.stop( true );
        -		this._hide( tooltip, this.options.hide, function() {
        -			that._removeTooltip( $( this ) );
        -		});
        -
        -		target.removeData( "ui-tooltip-open" );
        -		this._off( target, "mouseleave focusout keyup" );
        -
        -		// Remove 'remove' binding only on delegated targets
        -		if ( target[ 0 ] !== this.element[ 0 ] ) {
        -			this._off( target, "remove" );
        -		}
        -		this._off( this.document, "mousemove" );
        -
        -		if ( event && event.type === "mouseleave" ) {
        -			$.each( this.parents, function( id, parent ) {
        -				$( parent.element ).attr( "title", parent.title );
        -				delete that.parents[ id ];
        -			});
        -		}
        -
        -		tooltipData.closing = true;
        -		this._trigger( "close", event, { tooltip: tooltip } );
        -		if ( !tooltipData.hiding ) {
        -			tooltipData.closing = false;
        -		}
        -	},
        -
        -	_tooltip: function( element ) {
        -		var tooltip = $( "<div>" )
        -				.attr( "role", "tooltip" )
        -				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
        -					( this.options.tooltipClass || "" ) ),
        -			id = tooltip.uniqueId().attr( "id" );
        -
        -		$( "<div>" )
        -			.addClass( "ui-tooltip-content" )
        -			.appendTo( tooltip );
        -
        -		tooltip.appendTo( this.document[0].body );
        -
        -		return this.tooltips[ id ] = {
        -			element: element,
        -			tooltip: tooltip
        -		};
        -	},
        -
        -	_find: function( target ) {
        -		var id = target.data( "ui-tooltip-id" );
        -		return id ? this.tooltips[ id ] : null;
        -	},
        -
        -	_removeTooltip: function( tooltip ) {
        -		tooltip.remove();
        -		delete this.tooltips[ tooltip.attr( "id" ) ];
        -	},
        -
        -	_destroy: function() {
        -		var that = this;
        -
        -		// close open tooltips
        -		$.each( this.tooltips, function( id, tooltipData ) {
        -			// Delegate to close method to handle common cleanup
        -			var event = $.Event( "blur" ),
        -				element = tooltipData.element;
        -			event.target = event.currentTarget = element[ 0 ];
        -			that.close( event, true );
        -
        -			// Remove immediately; destroying an open tooltip doesn't use the
        -			// hide animation
        -			$( "#" + id ).remove();
        -
        -			// Restore the title
        -			if ( element.data( "ui-tooltip-title" ) ) {
        -				// If the title attribute has changed since open(), don't restore
        -				if ( !element.attr( "title" ) ) {
        -					element.attr( "title", element.data( "ui-tooltip-title" ) );
        -				}
        -				element.removeData( "ui-tooltip-title" );
        -			}
        -		});
        -		this.liveRegion.remove();
        -	}
        -});
        -
        -
        -
        -}));
        -/*! jQuery UI - v1.11.1+CommonJS - 2014-09-17
        -* http://jqueryui.com
        -* Includes: widget.js
        -* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
        -
        -(function( factory ) {
        -	if ( typeof define === "function" && define.amd ) {
        -
        -		// AMD. Register as an anonymous module.
        -		define([ "jquery" ], factory );
        -
        -	} else if (typeof exports === "object") {
        -		// Node/CommonJS:
        -		factory(require("jquery"));
        -
        -	} else {
        -
        -		// Browser globals
        -		factory( jQuery );
        -	}
        -}(function( $ ) {
        -/*!
        - * jQuery UI Widget 1.11.1
        - * http://jqueryui.com
        - *
        - * Copyright 2014 jQuery Foundation and other contributors
        - * Released under the MIT license.
        - * http://jquery.org/license
        - *
        - * http://api.jqueryui.com/jQuery.widget/
        - */
        -
        -
        -var widget_uuid = 0,
        -	widget_slice = Array.prototype.slice;
        -
        -$.cleanData = (function( orig ) {
        -	return function( elems ) {
        -		var events, elem, i;
        -		for ( i = 0; (elem = elems[i]) != null; i++ ) {
        -			try {
        -
        -				// Only trigger remove when necessary to save time
        -				events = $._data( elem, "events" );
        -				if ( events && events.remove ) {
        -					$( elem ).triggerHandler( "remove" );
        -				}
        -
        -			// http://bugs.jquery.com/ticket/8235
        -			} catch( e ) {}
        -		}
        -		orig( elems );
        -	};
        -})( $.cleanData );
        -
        -$.widget = function( name, base, prototype ) {
        -	var fullName, existingConstructor, constructor, basePrototype,
        -		// proxiedPrototype allows the provided prototype to remain unmodified
        -		// so that it can be used as a mixin for multiple widgets (#8876)
        -		proxiedPrototype = {},
        -		namespace = name.split( "." )[ 0 ];
        -
        -	name = name.split( "." )[ 1 ];
        -	fullName = namespace + "-" + name;
        -
        -	if ( !prototype ) {
        -		prototype = base;
        -		base = $.Widget;
        -	}
        -
        -	// create selector for plugin
        -	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
        -		return !!$.data( elem, fullName );
        -	};
        -
        -	$[ namespace ] = $[ namespace ] || {};
        -	existingConstructor = $[ namespace ][ name ];
        -	constructor = $[ namespace ][ name ] = function( options, element ) {
        -		// allow instantiation without "new" keyword
        -		if ( !this._createWidget ) {
        -			return new constructor( options, element );
        -		}
        -
        -		// allow instantiation without initializing for simple inheritance
        -		// must use "new" keyword (the code above always passes args)
        -		if ( arguments.length ) {
        -			this._createWidget( options, element );
        -		}
        -	};
        -	// extend with the existing constructor to carry over any static properties
        -	$.extend( constructor, existingConstructor, {
        -		version: prototype.version,
        -		// copy the object used to create the prototype in case we need to
        -		// redefine the widget later
        -		_proto: $.extend( {}, prototype ),
        -		// track widgets that inherit from this widget in case this widget is
        -		// redefined after a widget inherits from it
        -		_childConstructors: []
        -	});
        -
        -	basePrototype = new base();
        -	// we need to make the options hash a property directly on the new instance
        -	// otherwise we'll modify the options hash on the prototype that we're
        -	// inheriting from
        -	basePrototype.options = $.widget.extend( {}, basePrototype.options );
        -	$.each( prototype, function( prop, value ) {
        -		if ( !$.isFunction( value ) ) {
        -			proxiedPrototype[ prop ] = value;
        -			return;
        -		}
        -		proxiedPrototype[ prop ] = (function() {
        -			var _super = function() {
        -					return base.prototype[ prop ].apply( this, arguments );
        -				},
        -				_superApply = function( args ) {
        -					return base.prototype[ prop ].apply( this, args );
        -				};
        -			return function() {
        -				var __super = this._super,
        -					__superApply = this._superApply,
        -					returnValue;
        -
        -				this._super = _super;
        -				this._superApply = _superApply;
        -
        -				returnValue = value.apply( this, arguments );
        -
        -				this._super = __super;
        -				this._superApply = __superApply;
        -
        -				return returnValue;
        -			};
        -		})();
        -	});
        -	constructor.prototype = $.widget.extend( basePrototype, {
        -		// TODO: remove support for widgetEventPrefix
        -		// always use the name + a colon as the prefix, e.g., draggable:start
        -		// don't prefix for widgets that aren't DOM-based
        -		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
        -	}, proxiedPrototype, {
        -		constructor: constructor,
        -		namespace: namespace,
        -		widgetName: name,
        -		widgetFullName: fullName
        -	});
        -
        -	// If this widget is being redefined then we need to find all widgets that
        -	// are inheriting from it and redefine all of them so that they inherit from
        -	// the new version of this widget. We're essentially trying to replace one
        -	// level in the prototype chain.
        -	if ( existingConstructor ) {
        -		$.each( existingConstructor._childConstructors, function( i, child ) {
        -			var childPrototype = child.prototype;
        -
        -			// redefine the child widget using the same prototype that was
        -			// originally used, but inherit from the new version of the base
        -			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
        -		});
        -		// remove the list of existing child constructors from the old constructor
        -		// so the old child constructors can be garbage collected
        -		delete existingConstructor._childConstructors;
        -	} else {
        -		base._childConstructors.push( constructor );
        -	}
        -
        -	$.widget.bridge( name, constructor );
        -
        -	return constructor;
        -};
        -
        -$.widget.extend = function( target ) {
        -	var input = widget_slice.call( arguments, 1 ),
        -		inputIndex = 0,
        -		inputLength = input.length,
        -		key,
        -		value;
        -	for ( ; inputIndex < inputLength; inputIndex++ ) {
        -		for ( key in input[ inputIndex ] ) {
        -			value = input[ inputIndex ][ key ];
        -			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
        -				// Clone objects
        -				if ( $.isPlainObject( value ) ) {
        -					target[ key ] = $.isPlainObject( target[ key ] ) ?
        -						$.widget.extend( {}, target[ key ], value ) :
        -						// Don't extend strings, arrays, etc. with objects
        -						$.widget.extend( {}, value );
        -				// Copy everything else by reference
        -				} else {
        -					target[ key ] = value;
        -				}
        -			}
        -		}
        -	}
        -	return target;
        -};
        -
        -$.widget.bridge = function( name, object ) {
        -	var fullName = object.prototype.widgetFullName || name;
        -	$.fn[ name ] = function( options ) {
        -		var isMethodCall = typeof options === "string",
        -			args = widget_slice.call( arguments, 1 ),
        -			returnValue = this;
        -
        -		// allow multiple hashes to be passed on init
        -		options = !isMethodCall && args.length ?
        -			$.widget.extend.apply( null, [ options ].concat(args) ) :
        -			options;
        -
        -		if ( isMethodCall ) {
        -			this.each(function() {
        -				var methodValue,
        -					instance = $.data( this, fullName );
        -				if ( options === "instance" ) {
        -					returnValue = instance;
        -					return false;
        -				}
        -				if ( !instance ) {
        -					return $.error( "cannot call methods on " + name + " prior to initialization; " +
        -						"attempted to call method '" + options + "'" );
        -				}
        -				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
        -					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
        -				}
        -				methodValue = instance[ options ].apply( instance, args );
        -				if ( methodValue !== instance && methodValue !== undefined ) {
        -					returnValue = methodValue && methodValue.jquery ?
        -						returnValue.pushStack( methodValue.get() ) :
        -						methodValue;
        -					return false;
        -				}
        -			});
        -		} else {
        -			this.each(function() {
        -				var instance = $.data( this, fullName );
        -				if ( instance ) {
        -					instance.option( options || {} );
        -					if ( instance._init ) {
        -						instance._init();
        -					}
        -				} else {
        -					$.data( this, fullName, new object( options, this ) );
        -				}
        -			});
        -		}
        -
        -		return returnValue;
        -	};
        -};
        -
        -$.Widget = function( /* options, element */ ) {};
        -$.Widget._childConstructors = [];
        -
        -$.Widget.prototype = {
        -	widgetName: "widget",
        -	widgetEventPrefix: "",
        -	defaultElement: "<div>",
        -	options: {
        -		disabled: false,
        -
        -		// callbacks
        -		create: null
        -	},
        -	_createWidget: function( options, element ) {
        -		element = $( element || this.defaultElement || this )[ 0 ];
        -		this.element = $( element );
        -		this.uuid = widget_uuid++;
        -		this.eventNamespace = "." + this.widgetName + this.uuid;
        -		this.options = $.widget.extend( {},
        -			this.options,
        -			this._getCreateOptions(),
        -			options );
        -
        -		this.bindings = $();
        -		this.hoverable = $();
        -		this.focusable = $();
        -
        -		if ( element !== this ) {
        -			$.data( element, this.widgetFullName, this );
        -			this._on( true, this.element, {
        -				remove: function( event ) {
        -					if ( event.target === element ) {
        -						this.destroy();
        -					}
        -				}
        -			});
        -			this.document = $( element.style ?
        -				// element within the document
        -				element.ownerDocument :
        -				// element is window or document
        -				element.document || element );
        -			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
        -		}
        -
        -		this._create();
        -		this._trigger( "create", null, this._getCreateEventData() );
        -		this._init();
        -	},
        -	_getCreateOptions: $.noop,
        -	_getCreateEventData: $.noop,
        -	_create: $.noop,
        -	_init: $.noop,
        -
        -	destroy: function() {
        -		this._destroy();
        -		// we can probably remove the unbind calls in 2.0
        -		// all event bindings should go through this._on()
        -		this.element
        -			.unbind( this.eventNamespace )
        -			.removeData( this.widgetFullName )
        -			// support: jquery <1.6.3
        -			// http://bugs.jquery.com/ticket/9413
        -			.removeData( $.camelCase( this.widgetFullName ) );
        -		this.widget()
        -			.unbind( this.eventNamespace )
        -			.removeAttr( "aria-disabled" )
        -			.removeClass(
        -				this.widgetFullName + "-disabled " +
        -				"ui-state-disabled" );
        -
        -		// clean up events and states
        -		this.bindings.unbind( this.eventNamespace );
        -		this.hoverable.removeClass( "ui-state-hover" );
        -		this.focusable.removeClass( "ui-state-focus" );
        -	},
        -	_destroy: $.noop,
        -
        -	widget: function() {
        -		return this.element;
        -	},
        -
        -	option: function( key, value ) {
        -		var options = key,
        -			parts,
        -			curOption,
        -			i;
        -
        -		if ( arguments.length === 0 ) {
        -			// don't return a reference to the internal hash
        -			return $.widget.extend( {}, this.options );
        -		}
        -
        -		if ( typeof key === "string" ) {
        -			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
        -			options = {};
        -			parts = key.split( "." );
        -			key = parts.shift();
        -			if ( parts.length ) {
        -				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
        -				for ( i = 0; i < parts.length - 1; i++ ) {
        -					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
        -					curOption = curOption[ parts[ i ] ];
        -				}
        -				key = parts.pop();
        -				if ( arguments.length === 1 ) {
        -					return curOption[ key ] === undefined ? null : curOption[ key ];
        -				}
        -				curOption[ key ] = value;
        -			} else {
        -				if ( arguments.length === 1 ) {
        -					return this.options[ key ] === undefined ? null : this.options[ key ];
        -				}
        -				options[ key ] = value;
        -			}
        -		}
        -
        -		this._setOptions( options );
        -
        -		return this;
        -	},
        -	_setOptions: function( options ) {
        -		var key;
        -
        -		for ( key in options ) {
        -			this._setOption( key, options[ key ] );
        -		}
        -
        -		return this;
        -	},
        -	_setOption: function( key, value ) {
        -		this.options[ key ] = value;
        -
        -		if ( key === "disabled" ) {
        -			this.widget()
        -				.toggleClass( this.widgetFullName + "-disabled", !!value );
        -
        -			// If the widget is becoming disabled, then nothing is interactive
        -			if ( value ) {
        -				this.hoverable.removeClass( "ui-state-hover" );
        -				this.focusable.removeClass( "ui-state-focus" );
        -			}
        -		}
        -
        -		return this;
        -	},
        -
        -	enable: function() {
        -		return this._setOptions({ disabled: false });
        -	},
        -	disable: function() {
        -		return this._setOptions({ disabled: true });
        -	},
        -
        -	_on: function( suppressDisabledCheck, element, handlers ) {
        -		var delegateElement,
        -			instance = this;
        -
        -		// no suppressDisabledCheck flag, shuffle arguments
        -		if ( typeof suppressDisabledCheck !== "boolean" ) {
        -			handlers = element;
        -			element = suppressDisabledCheck;
        -			suppressDisabledCheck = false;
        -		}
        -
        -		// no element argument, shuffle and use this.element
        -		if ( !handlers ) {
        -			handlers = element;
        -			element = this.element;
        -			delegateElement = this.widget();
        -		} else {
        -			element = delegateElement = $( element );
        -			this.bindings = this.bindings.add( element );
        -		}
        -
        -		$.each( handlers, function( event, handler ) {
        -			function handlerProxy() {
        -				// allow widgets to customize the disabled handling
        -				// - disabled as an array instead of boolean
        -				// - disabled class as method for disabling individual parts
        -				if ( !suppressDisabledCheck &&
        -						( instance.options.disabled === true ||
        -							$( this ).hasClass( "ui-state-disabled" ) ) ) {
        -					return;
        -				}
        -				return ( typeof handler === "string" ? instance[ handler ] : handler )
        -					.apply( instance, arguments );
        -			}
        -
        -			// copy the guid so direct unbinding works
        -			if ( typeof handler !== "string" ) {
        -				handlerProxy.guid = handler.guid =
        -					handler.guid || handlerProxy.guid || $.guid++;
        -			}
        -
        -			var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
        -				eventName = match[1] + instance.eventNamespace,
        -				selector = match[2];
        -			if ( selector ) {
        -				delegateElement.delegate( selector, eventName, handlerProxy );
        -			} else {
        -				element.bind( eventName, handlerProxy );
        -			}
        -		});
        -	},
        -
        -	_off: function( element, eventName ) {
        -		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
        -		element.unbind( eventName ).undelegate( eventName );
        -	},
        -
        -	_delay: function( handler, delay ) {
        -		function handlerProxy() {
        -			return ( typeof handler === "string" ? instance[ handler ] : handler )
        -				.apply( instance, arguments );
        -		}
        -		var instance = this;
        -		return setTimeout( handlerProxy, delay || 0 );
        -	},
        -
        -	_hoverable: function( element ) {
        -		this.hoverable = this.hoverable.add( element );
        -		this._on( element, {
        -			mouseenter: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-hover" );
        -			},
        -			mouseleave: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-hover" );
        -			}
        -		});
        -	},
        -
        -	_focusable: function( element ) {
        -		this.focusable = this.focusable.add( element );
        -		this._on( element, {
        -			focusin: function( event ) {
        -				$( event.currentTarget ).addClass( "ui-state-focus" );
        -			},
        -			focusout: function( event ) {
        -				$( event.currentTarget ).removeClass( "ui-state-focus" );
        -			}
        -		});
        -	},
        -
        -	_trigger: function( type, event, data ) {
        -		var prop, orig,
        -			callback = this.options[ type ];
        -
        -		data = data || {};
        -		event = $.Event( event );
        -		event.type = ( type === this.widgetEventPrefix ?
        -			type :
        -			this.widgetEventPrefix + type ).toLowerCase();
        -		// the original event may come from any element
        -		// so we need to reset the target on the new event
        -		event.target = this.element[ 0 ];
        -
        -		// copy original event properties over to the new event
        -		orig = event.originalEvent;
        -		if ( orig ) {
        -			for ( prop in orig ) {
        -				if ( !( prop in event ) ) {
        -					event[ prop ] = orig[ prop ];
        -				}
        -			}
        -		}
        -
        -		this.element.trigger( event, data );
        -		return !( $.isFunction( callback ) &&
        -			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
        -			event.isDefaultPrevented() );
        -	}
        -};
        -
        -$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
        -	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
        -		if ( typeof options === "string" ) {
        -			options = { effect: options };
        -		}
        -		var hasOptions,
        -			effectName = !options ?
        -				method :
        -				options === true || typeof options === "number" ?
        -					defaultEffect :
        -					options.effect || defaultEffect;
        -		options = options || {};
        -		if ( typeof options === "number" ) {
        -			options = { duration: options };
        -		}
        -		hasOptions = !$.isEmptyObject( options );
        -		options.complete = callback;
        -		if ( options.delay ) {
        -			element.delay( options.delay );
        -		}
        -		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
        -			element[ method ]( options );
        -		} else if ( effectName !== method && element[ effectName ] ) {
        -			element[ effectName ]( options.duration, options.easing, callback );
        -		} else {
        -			element.queue(function( next ) {
        -				$( this )[ method ]();
        -				if ( callback ) {
        -					callback.call( element[ 0 ] );
        -				}
        -				next();
        -			});
        -		}
        -	};
        -});
        -
        -var widget = $.widget;
        -
        -
        -
        -}));
        -
        -/*
        - * jQuery Iframe Transport Plugin 1.8.3
        - * https://github.com/blueimp/jQuery-File-Upload
        - *
        - * Copyright 2011, Sebastian Tschan
        - * https://blueimp.net
        - *
        - * Licensed under the MIT license:
        - * http://www.opensource.org/licenses/MIT
        - */
        -
        -/* global define, require, window, document */
        -
        -(function (factory) {
        -    'use strict';
        -    if (typeof define === 'function' && define.amd) {
        -        // Register as an anonymous AMD module:
        -        define(['jquery'], factory);
        -    } else if (typeof exports === 'object') {
        -        // Node/CommonJS:
        -        factory(require('jquery'));
        -    } else {
        -        // Browser globals:
        -        factory(window.jQuery);
        -    }
        -}(function ($) {
        -    'use strict';
        -
        -    // Helper variable to create unique names for the transport iframes:
        -    var counter = 0;
        -
        -    // The iframe transport accepts four additional options:
        -    // options.fileInput: a jQuery collection of file input fields
        -    // options.paramName: the parameter name for the file form data,
        -    //  overrides the name property of the file input field(s),
        -    //  can be a string or an array of strings.
        -    // options.formData: an array of objects with name and value properties,
        -    //  equivalent to the return data of .serializeArray(), e.g.:
        -    //  [{name: 'a', value: 1}, {name: 'b', value: 2}]
        -    // options.initialIframeSrc: the URL of the initial iframe src,
        -    //  by default set to "javascript:false;"
        -    $.ajaxTransport('iframe', function (options) {
        -        if (options.async) {
        -            // javascript:false as initial iframe src
        -            // prevents warning popups on HTTPS in IE6:
        -            /*jshint scripturl: true */
        -            var initialIframeSrc = options.initialIframeSrc || 'javascript:false;',
        -            /*jshint scripturl: false */
        -                form,
        -                iframe,
        -                addParamChar;
        -            return {
        -                send: function (_, completeCallback) {
        -                    form = $('<form style="display:none;"></form>');
        -                    form.attr('accept-charset', options.formAcceptCharset);
        -                    addParamChar = /\?/.test(options.url) ? '&' : '?';
        -                    // XDomainRequest only supports GET and POST:
        -                    if (options.type === 'DELETE') {
        -                        options.url = options.url + addParamChar + '_method=DELETE';
        -                        options.type = 'POST';
        -                    } else if (options.type === 'PUT') {
        -                        options.url = options.url + addParamChar + '_method=PUT';
        -                        options.type = 'POST';
        -                    } else if (options.type === 'PATCH') {
        -                        options.url = options.url + addParamChar + '_method=PATCH';
        -                        options.type = 'POST';
        -                    }
        -                    // IE versions below IE8 cannot set the name property of
        -                    // elements that have already been added to the DOM,
        -                    // so we set the name along with the iframe HTML markup:
        -                    counter += 1;
        -                    iframe = $(
        -                        '<iframe src="' + initialIframeSrc +
        -                            '" name="iframe-transport-' + counter + '"></iframe>'
        -                    ).bind('load', function () {
        -                        var fileInputClones,
        -                            paramNames = $.isArray(options.paramName) ?
        -                                    options.paramName : [options.paramName];
        -                        iframe
        -                            .unbind('load')
        -                            .bind('load', function () {
        -                                var response;
        -                                // Wrap in a try/catch block to catch exceptions thrown
        -                                // when trying to access cross-domain iframe contents:
        -                                try {
        -                                    response = iframe.contents();
        -                                    // Google Chrome and Firefox do not throw an
        -                                    // exception when calling iframe.contents() on
        -                                    // cross-domain requests, so we unify the response:
        -                                    if (!response.length || !response[0].firstChild) {
        -                                        throw new Error();
        -                                    }
        -                                } catch (e) {
        -                                    response = undefined;
        -                                }
        -                                // The complete callback returns the
        -                                // iframe content document as response object:
        -                                completeCallback(
        -                                    200,
        -                                    'success',
        -                                    {'iframe': response}
        -                                );
        -                                // Fix for IE endless progress bar activity bug
        -                                // (happens on form submits to iframe targets):
        -                                $('<iframe src="' + initialIframeSrc + '"></iframe>')
        -                                    .appendTo(form);
        -                                window.setTimeout(function () {
        -                                    // Removing the form in a setTimeout call
        -                                    // allows Chrome's developer tools to display
        -                                    // the response result
        -                                    form.remove();
        -                                }, 0);
        -                            });
        -                        form
        -                            .prop('target', iframe.prop('name'))
        -                            .prop('action', options.url)
        -                            .prop('method', options.type);
        -                        if (options.formData) {
        -                            $.each(options.formData, function (index, field) {
        -                                $('<input type="hidden"/>')
        -                                    .prop('name', field.name)
        -                                    .val(field.value)
        -                                    .appendTo(form);
        -                            });
        -                        }
        -                        if (options.fileInput && options.fileInput.length &&
        -                                options.type === 'POST') {
        -                            fileInputClones = options.fileInput.clone();
        -                            // Insert a clone for each file input field:
        -                            options.fileInput.after(function (index) {
        -                                return fileInputClones[index];
        -                            });
        -                            if (options.paramName) {
        -                                options.fileInput.each(function (index) {
        -                                    $(this).prop(
        -                                        'name',
        -                                        paramNames[index] || options.paramName
        -                                    );
        -                                });
        -                            }
        -                            // Appending the file input fields to the hidden form
        -                            // removes them from their original location:
        -                            form
        -                                .append(options.fileInput)
        -                                .prop('enctype', 'multipart/form-data')
        -                                // enctype must be set as encoding for IE:
        -                                .prop('encoding', 'multipart/form-data');
        -                            // Remove the HTML5 form attribute from the input(s):
        -                            options.fileInput.removeAttr('form');
        -                        }
        -                        form.submit();
        -                        // Insert the file input fields at their original location
        -                        // by replacing the clones with the originals:
        -                        if (fileInputClones && fileInputClones.length) {
        -                            options.fileInput.each(function (index, input) {
        -                                var clone = $(fileInputClones[index]);
        -                                // Restore the original name and form properties:
        -                                $(input)
        -                                    .prop('name', clone.prop('name'))
        -                                    .attr('form', clone.attr('form'));
        -                                clone.replaceWith(input);
        -                            });
        -                        }
        -                    });
        -                    form.append(iframe).appendTo(document.body);
        -                },
        -                abort: function () {
        -                    if (iframe) {
        -                        // javascript:false as iframe src aborts the request
        -                        // and prevents warning popups on HTTPS in IE6.
        -                        // concat is used to avoid the "Script URL" JSLint error:
        -                        iframe
        -                            .unbind('load')
        -                            .prop('src', initialIframeSrc);
        -                    }
        -                    if (form) {
        -                        form.remove();
        -                    }
        -                }
        -            };
        -        }
        -    });
        -
        -    // The iframe transport returns the iframe content document as response.
        -    // The following adds converters from iframe to text, json, html, xml
        -    // and script.
        -    // Please note that the Content-Type for JSON responses has to be text/plain
        -    // or text/html, if the browser doesn't include application/json in the
        -    // Accept header, else IE will show a download dialog.
        -    // The Content-Type for XML responses on the other hand has to be always
        -    // application/xml or text/xml, so IE properly parses the XML response.
        -    // See also
        -    // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
        -    $.ajaxSetup({
        -        converters: {
        -            'iframe text': function (iframe) {
        -                return iframe && $(iframe[0].body).text();
        -            },
        -            'iframe json': function (iframe) {
        -                return iframe && $.parseJSON($(iframe[0].body).text());
        -            },
        -            'iframe html': function (iframe) {
        -                return iframe && $(iframe[0].body).html();
        -            },
        -            'iframe xml': function (iframe) {
        -                var xmlDoc = iframe && iframe[0];
        -                return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
        -                        $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
        -                            $(xmlDoc.body).html());
        -            },
        -            'iframe script': function (iframe) {
        -                return iframe && $.globalEval($(iframe[0].body).text());
        -            }
        -        }
        -    });
        -
        -}));
        -
        -/*
        - * jQuery File Upload Plugin 5.42.3
        - * https://github.com/blueimp/jQuery-File-Upload
        - *
        - * Copyright 2010, Sebastian Tschan
        - * https://blueimp.net
        - *
        - * Licensed under the MIT license:
        - * http://www.opensource.org/licenses/MIT
        - */
        -
        -/* jshint nomen:false */
        -/* global define, require, window, document, location, Blob, FormData */
        -
        -(function (factory) {
        -    'use strict';
        -    if (typeof define === 'function' && define.amd) {
        -        // Register as an anonymous AMD module:
        -        define([
        -            'jquery',
        -            'jquery.ui.widget'
        -        ], factory);
        -    } else if (typeof exports === 'object') {
        -        // Node/CommonJS:
        -        factory(
        -            require('jquery'),
        -            require('./vendor/jquery.ui.widget')
        -        );
        -    } else {
        -        // Browser globals:
        -        factory(window.jQuery);
        -    }
        -}(function ($) {
        -    'use strict';
        -
        -    // Detect file input support, based on
        -    // http://viljamis.com/blog/2012/file-upload-support-on-mobile/
        -    $.support.fileInput = !(new RegExp(
        -        // Handle devices which give false positives for the feature detection:
        -        '(Android (1\\.[0156]|2\\.[01]))' +
        -            '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +
        -            '|(w(eb)?OSBrowser)|(webOS)' +
        -            '|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
        -    ).test(window.navigator.userAgent) ||
        -        // Feature detection for all other devices:
        -        $('<input type="file">').prop('disabled'));
        -
        -    // The FileReader API is not actually used, but works as feature detection,
        -    // as some Safari versions (5?) support XHR file uploads via the FormData API,
        -    // but not non-multipart XHR file uploads.
        -    // window.XMLHttpRequestUpload is not available on IE10, so we check for
        -    // window.ProgressEvent instead to detect XHR2 file upload capability:
        -    $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);
        -    $.support.xhrFormDataFileUpload = !!window.FormData;
        -
        -    // Detect support for Blob slicing (required for chunked uploads):
        -    $.support.blobSlice = window.Blob && (Blob.prototype.slice ||
        -        Blob.prototype.webkitSlice || Blob.prototype.mozSlice);
        -
        -    // Helper function to create drag handlers for dragover/dragenter/dragleave:
        -    function getDragHandler(type) {
        -        var isDragOver = type === 'dragover';
        -        return function (e) {
        -            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
        -            var dataTransfer = e.dataTransfer;
        -            if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&
        -                    this._trigger(
        -                        type,
        -                        $.Event(type, {delegatedEvent: e})
        -                    ) !== false) {
        -                e.preventDefault();
        -                if (isDragOver) {
        -                    dataTransfer.dropEffect = 'copy';
        -                }
        -            }
        -        };
        -    }
        -
        -    // The fileupload widget listens for change events on file input fields defined
        -    // via fileInput setting and paste or drop events of the given dropZone.
        -    // In addition to the default jQuery Widget methods, the fileupload widget
        -    // exposes the "add" and "send" methods, to add or directly send files using
        -    // the fileupload API.
        -    // By default, files added via file input selection, paste, drag & drop or
        -    // "add" method are uploaded immediately, but it is possible to override
        -    // the "add" callback option to queue file uploads.
        -    $.widget('blueimp.fileupload', {
        -
        -        options: {
        -            // The drop target element(s), by the default the complete document.
        -            // Set to null to disable drag & drop support:
        -            dropZone: $(document),
        -            // The paste target element(s), by the default undefined.
        -            // Set to a DOM node or jQuery object to enable file pasting:
        -            pasteZone: undefined,
        -            // The file input field(s), that are listened to for change events.
        -            // If undefined, it is set to the file input fields inside
        -            // of the widget element on plugin initialization.
        -            // Set to null to disable the change listener.
        -            fileInput: undefined,
        -            // By default, the file input field is replaced with a clone after
        -            // each input field change event. This is required for iframe transport
        -            // queues and allows change events to be fired for the same file
        -            // selection, but can be disabled by setting the following option to false:
        -            replaceFileInput: true,
        -            // The parameter name for the file form data (the request argument name).
        -            // If undefined or empty, the name property of the file input field is
        -            // used, or "files[]" if the file input name property is also empty,
        -            // can be a string or an array of strings:
        -            paramName: undefined,
        -            // By default, each file of a selection is uploaded using an individual
        -            // request for XHR type uploads. Set to false to upload file
        -            // selections in one request each:
        -            singleFileUploads: true,
        -            // To limit the number of files uploaded with one XHR request,
        -            // set the following option to an integer greater than 0:
        -            limitMultiFileUploads: undefined,
        -            // The following option limits the number of files uploaded with one
        -            // XHR request to keep the request size under or equal to the defined
        -            // limit in bytes:
        -            limitMultiFileUploadSize: undefined,
        -            // Multipart file uploads add a number of bytes to each uploaded file,
        -            // therefore the following option adds an overhead for each file used
        -            // in the limitMultiFileUploadSize configuration:
        -            limitMultiFileUploadSizeOverhead: 512,
        -            // Set the following option to true to issue all file upload requests
        -            // in a sequential order:
        -            sequentialUploads: false,
        -            // To limit the number of concurrent uploads,
        -            // set the following option to an integer greater than 0:
        -            limitConcurrentUploads: undefined,
        -            // Set the following option to true to force iframe transport uploads:
        -            forceIframeTransport: false,
        -            // Set the following option to the location of a redirect url on the
        -            // origin server, for cross-domain iframe transport uploads:
        -            redirect: undefined,
        -            // The parameter name for the redirect url, sent as part of the form
        -            // data and set to 'redirect' if this option is empty:
        -            redirectParamName: undefined,
        -            // Set the following option to the location of a postMessage window,
        -            // to enable postMessage transport uploads:
        -            postMessage: undefined,
        -            // By default, XHR file uploads are sent as multipart/form-data.
        -            // The iframe transport is always using multipart/form-data.
        -            // Set to false to enable non-multipart XHR uploads:
        -            multipart: true,
        -            // To upload large files in smaller chunks, set the following option
        -            // to a preferred maximum chunk size. If set to 0, null or undefined,
        -            // or the browser does not support the required Blob API, files will
        -            // be uploaded as a whole.
        -            maxChunkSize: undefined,
        -            // When a non-multipart upload or a chunked multipart upload has been
        -            // aborted, this option can be used to resume the upload by setting
        -            // it to the size of the already uploaded bytes. This option is most
        -            // useful when modifying the options object inside of the "add" or
        -            // "send" callbacks, as the options are cloned for each file upload.
        -            uploadedBytes: undefined,
        -            // By default, failed (abort or error) file uploads are removed from the
        -            // global progress calculation. Set the following option to false to
        -            // prevent recalculating the global progress data:
        -            recalculateProgress: true,
        -            // Interval in milliseconds to calculate and trigger progress events:
        -            progressInterval: 100,
        -            // Interval in milliseconds to calculate progress bitrate:
        -            bitrateInterval: 500,
        -            // By default, uploads are started automatically when adding files:
        -            autoUpload: true,
        -
        -            // Error and info messages:
        -            messages: {
        -                uploadedBytes: 'Uploaded bytes exceed file size'
        -            },
        -
        -            // Translation function, gets the message key to be translated
        -            // and an object with context specific data as arguments:
        -            i18n: function (message, context) {
        -                message = this.messages[message] || message.toString();
        -                if (context) {
        -                    $.each(context, function (key, value) {
        -                        message = message.replace('{' + key + '}', value);
        -                    });
        -                }
        -                return message;
        -            },
        -
        -            // Additional form data to be sent along with the file uploads can be set
        -            // using this option, which accepts an array of objects with name and
        -            // value properties, a function returning such an array, a FormData
        -            // object (for XHR file uploads), or a simple object.
        -            // The form of the first fileInput is given as parameter to the function:
        -            formData: function (form) {
        -                return form.serializeArray();
        -            },
        -
        -            // The add callback is invoked as soon as files are added to the fileupload
        -            // widget (via file input selection, drag & drop, paste or add API call).
        -            // If the singleFileUploads option is enabled, this callback will be
        -            // called once for each file in the selection for XHR file uploads, else
        -            // once for each file selection.
        -            //
        -            // The upload starts when the submit method is invoked on the data parameter.
        -            // The data object contains a files property holding the added files
        -            // and allows you to override plugin options as well as define ajax settings.
        -            //
        -            // Listeners for this callback can also be bound the following way:
        -            // .bind('fileuploadadd', func);
        -            //
        -            // data.submit() returns a Promise object and allows to attach additional
        -            // handlers using jQuery's Deferred callbacks:
        -            // data.submit().done(func).fail(func).always(func);
        -            add: function (e, data) {
        -                if (e.isDefaultPrevented()) {
        -                    return false;
        -                }
        -                if (data.autoUpload || (data.autoUpload !== false &&
        -                        $(this).fileupload('option', 'autoUpload'))) {
        -                    data.process().done(function () {
        -                        data.submit();
        -                    });
        -                }
        -            },
        -
        -            // Other callbacks:
        -
        -            // Callback for the submit event of each file upload:
        -            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);
        -
        -            // Callback for the start of each file upload request:
        -            // send: function (e, data) {}, // .bind('fileuploadsend', func);
        -
        -            // Callback for successful uploads:
        -            // done: function (e, data) {}, // .bind('fileuploaddone', func);
        -
        -            // Callback for failed (abort or error) uploads:
        -            // fail: function (e, data) {}, // .bind('fileuploadfail', func);
        -
        -            // Callback for completed (success, abort or error) requests:
        -            // always: function (e, data) {}, // .bind('fileuploadalways', func);
        -
        -            // Callback for upload progress events:
        -            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);
        -
        -            // Callback for global upload progress events:
        -            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);
        -
        -            // Callback for uploads start, equivalent to the global ajaxStart event:
        -            // start: function (e) {}, // .bind('fileuploadstart', func);
        -
        -            // Callback for uploads stop, equivalent to the global ajaxStop event:
        -            // stop: function (e) {}, // .bind('fileuploadstop', func);
        -
        -            // Callback for change events of the fileInput(s):
        -            // change: function (e, data) {}, // .bind('fileuploadchange', func);
        -
        -            // Callback for paste events to the pasteZone(s):
        -            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);
        -
        -            // Callback for drop events of the dropZone(s):
        -            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);
        -
        -            // Callback for dragover events of the dropZone(s):
        -            // dragover: function (e) {}, // .bind('fileuploaddragover', func);
        -
        -            // Callback for the start of each chunk upload request:
        -            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
        -
        -            // Callback for successful chunk uploads:
        -            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);
        -
        -            // Callback for failed (abort or error) chunk uploads:
        -            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);
        -
        -            // Callback for completed (success, abort or error) chunk upload requests:
        -            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);
        -
        -            // The plugin options are used as settings object for the ajax calls.
        -            // The following are jQuery ajax settings required for the file uploads:
        -            processData: false,
        -            contentType: false,
        -            cache: false,
        -            timeout: 0
        -        },
        -
        -        // A list of options that require reinitializing event listeners and/or
        -        // special initialization code:
        -        _specialOptions: [
        -            'fileInput',
        -            'dropZone',
        -            'pasteZone',
        -            'multipart',
        -            'forceIframeTransport'
        -        ],
        -
        -        _blobSlice: $.support.blobSlice && function () {
        -            var slice = this.slice || this.webkitSlice || this.mozSlice;
        -            return slice.apply(this, arguments);
        -        },
        -
        -        _BitrateTimer: function () {
        -            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
        -            this.loaded = 0;
        -            this.bitrate = 0;
        -            this.getBitrate = function (now, loaded, interval) {
        -                var timeDiff = now - this.timestamp;
        -                if (!this.bitrate || !interval || timeDiff > interval) {
        -                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
        -                    this.loaded = loaded;
        -                    this.timestamp = now;
        -                }
        -                return this.bitrate;
        -            };
        -        },
        -
        -        _isXHRUpload: function (options) {
        -            return !options.forceIframeTransport &&
        -                ((!options.multipart && $.support.xhrFileUpload) ||
        -                $.support.xhrFormDataFileUpload);
        -        },
        -
        -        _getFormData: function (options) {
        -            var formData;
        -            if ($.type(options.formData) === 'function') {
        -                return options.formData(options.form);
        -            }
        -            if ($.isArray(options.formData)) {
        -                return options.formData;
        -            }
        -            if ($.type(options.formData) === 'object') {
        -                formData = [];
        -                $.each(options.formData, function (name, value) {
        -                    formData.push({name: name, value: value});
        -                });
        -                return formData;
        -            }
        -            return [];
        -        },
        -
        -        _getTotal: function (files) {
        -            var total = 0;
        -            $.each(files, function (index, file) {
        -                total += file.size || 1;
        -            });
        -            return total;
        -        },
        -
        -        _initProgressObject: function (obj) {
        -            var progress = {
        -                loaded: 0,
        -                total: 0,
        -                bitrate: 0
        -            };
        -            if (obj._progress) {
        -                $.extend(obj._progress, progress);
        -            } else {
        -                obj._progress = progress;
        -            }
        -        },
        -
        -        _initResponseObject: function (obj) {
        -            var prop;
        -            if (obj._response) {
        -                for (prop in obj._response) {
        -                    if (obj._response.hasOwnProperty(prop)) {
        -                        delete obj._response[prop];
        -                    }
        -                }
        -            } else {
        -                obj._response = {};
        -            }
        -        },
        -
        -        _onProgress: function (e, data) {
        -            if (e.lengthComputable) {
        -                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),
        -                    loaded;
        -                if (data._time && data.progressInterval &&
        -                        (now - data._time < data.progressInterval) &&
        -                        e.loaded !== e.total) {
        -                    return;
        -                }
        -                data._time = now;
        -                loaded = Math.floor(
        -                    e.loaded / e.total * (data.chunkSize || data._progress.total)
        -                ) + (data.uploadedBytes || 0);
        -                // Add the difference from the previously loaded state
        -                // to the global loaded counter:
        -                this._progress.loaded += (loaded - data._progress.loaded);
        -                this._progress.bitrate = this._bitrateTimer.getBitrate(
        -                    now,
        -                    this._progress.loaded,
        -                    data.bitrateInterval
        -                );
        -                data._progress.loaded = data.loaded = loaded;
        -                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
        -                    now,
        -                    loaded,
        -                    data.bitrateInterval
        -                );
        -                // Trigger a custom progress event with a total data property set
        -                // to the file size(s) of the current upload and a loaded data
        -                // property calculated accordingly:
        -                this._trigger(
        -                    'progress',
        -                    $.Event('progress', {delegatedEvent: e}),
        -                    data
        -                );
        -                // Trigger a global progress event for all current file uploads,
        -                // including ajax calls queued for sequential file uploads:
        -                this._trigger(
        -                    'progressall',
        -                    $.Event('progressall', {delegatedEvent: e}),
        -                    this._progress
        -                );
        -            }
        -        },
        -
        -        _initProgressListener: function (options) {
        -            var that = this,
        -                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();
        -            // Accesss to the native XHR object is required to add event listeners
        -            // for the upload progress event:
        -            if (xhr.upload) {
        -                $(xhr.upload).bind('progress', function (e) {
        -                    var oe = e.originalEvent;
        -                    // Make sure the progress event properties get copied over:
        -                    e.lengthComputable = oe.lengthComputable;
        -                    e.loaded = oe.loaded;
        -                    e.total = oe.total;
        -                    that._onProgress(e, options);
        -                });
        -                options.xhr = function () {
        -                    return xhr;
        -                };
        -            }
        -        },
        -
        -        _isInstanceOf: function (type, obj) {
        -            // Cross-frame instanceof check
        -            return Object.prototype.toString.call(obj) === '[object ' + type + ']';
        -        },
        -
        -        _initXHRData: function (options) {
        -            var that = this,
        -                formData,
        -                file = options.files[0],
        -                // Ignore non-multipart setting if not supported:
        -                multipart = options.multipart || !$.support.xhrFileUpload,
        -                paramName = $.type(options.paramName) === 'array' ?
        -                    options.paramName[0] : options.paramName;
        -            options.headers = $.extend({}, options.headers);
        -            if (options.contentRange) {
        -                options.headers['Content-Range'] = options.contentRange;
        -            }
        -            if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
        -                options.headers['Content-Disposition'] = 'attachment; filename="' +
        -                    encodeURI(file.name) + '"';
        -            }
        -            if (!multipart) {
        -                options.contentType = file.type || 'application/octet-stream';
        -                options.data = options.blob || file;
        -            } else if ($.support.xhrFormDataFileUpload) {
        -                if (options.postMessage) {
        -                    // window.postMessage does not allow sending FormData
        -                    // objects, so we just add the File/Blob objects to
        -                    // the formData array and let the postMessage window
        -                    // create the FormData object out of this array:
        -                    formData = this._getFormData(options);
        -                    if (options.blob) {
        -                        formData.push({
        -                            name: paramName,
        -                            value: options.blob
        -                        });
        -                    } else {
        -                        $.each(options.files, function (index, file) {
        -                            formData.push({
        -                                name: ($.type(options.paramName) === 'array' &&
        -                                    options.paramName[index]) || paramName,
        -                                value: file
        -                            });
        -                        });
        -                    }
        -                } else {
        -                    if (that._isInstanceOf('FormData', options.formData)) {
        -                        formData = options.formData;
        -                    } else {
        -                        formData = new FormData();
        -                        $.each(this._getFormData(options), function (index, field) {
        -                            formData.append(field.name, field.value);
        -                        });
        -                    }
        -                    if (options.blob) {
        -                        formData.append(paramName, options.blob, file.name);
        -                    } else {
        -                        $.each(options.files, function (index, file) {
        -                            // This check allows the tests to run with
        -                            // dummy objects:
        -                            if (that._isInstanceOf('File', file) ||
        -                                    that._isInstanceOf('Blob', file)) {
        -                                formData.append(
        -                                    ($.type(options.paramName) === 'array' &&
        -                                        options.paramName[index]) || paramName,
        -                                    file,
        -                                    file.uploadName || file.name
        -                                );
        -                            }
        -                        });
        -                    }
        -                }
        -                options.data = formData;
        -            }
        -            // Blob reference is not needed anymore, free memory:
        -            options.blob = null;
        -        },
        -
        -        _initIframeSettings: function (options) {
        -            var targetHost = $('<a></a>').prop('href', options.url).prop('host');
        -            // Setting the dataType to iframe enables the iframe transport:
        -            options.dataType = 'iframe ' + (options.dataType || '');
        -            // The iframe transport accepts a serialized array as form data:
        -            options.formData = this._getFormData(options);
        -            // Add redirect url to form data on cross-domain uploads:
        -            if (options.redirect && targetHost && targetHost !== location.host) {
        -                options.formData.push({
        -                    name: options.redirectParamName || 'redirect',
        -                    value: options.redirect
        -                });
        -            }
        -        },
        -
        -        _initDataSettings: function (options) {
        -            if (this._isXHRUpload(options)) {
        -                if (!this._chunkedUpload(options, true)) {
        -                    if (!options.data) {
        -                        this._initXHRData(options);
        -                    }
        -                    this._initProgressListener(options);
        -                }
        -                if (options.postMessage) {
        -                    // Setting the dataType to postmessage enables the
        -                    // postMessage transport:
        -                    options.dataType = 'postmessage ' + (options.dataType || '');
        -                }
        -            } else {
        -                this._initIframeSettings(options);
        -            }
        -        },
        -
        -        _getParamName: function (options) {
        -            var fileInput = $(options.fileInput),
        -                paramName = options.paramName;
        -            if (!paramName) {
        -                paramName = [];
        -                fileInput.each(function () {
        -                    var input = $(this),
        -                        name = input.prop('name') || 'files[]',
        -                        i = (input.prop('files') || [1]).length;
        -                    while (i) {
        -                        paramName.push(name);
        -                        i -= 1;
        -                    }
        -                });
        -                if (!paramName.length) {
        -                    paramName = [fileInput.prop('name') || 'files[]'];
        -                }
        -            } else if (!$.isArray(paramName)) {
        -                paramName = [paramName];
        -            }
        -            return paramName;
        -        },
        -
        -        _initFormSettings: function (options) {
        -            // Retrieve missing options from the input field and the
        -            // associated form, if available:
        -            if (!options.form || !options.form.length) {
        -                options.form = $(options.fileInput.prop('form'));
        -                // If the given file input doesn't have an associated form,
        -                // use the default widget file input's form:
        -                if (!options.form.length) {
        -                    options.form = $(this.options.fileInput.prop('form'));
        -                }
        -            }
        -            options.paramName = this._getParamName(options);
        -            if (!options.url) {
        -                options.url = options.form.prop('action') || location.href;
        -            }
        -            // The HTTP request method must be "POST" or "PUT":
        -            options.type = (options.type ||
        -                ($.type(options.form.prop('method')) === 'string' &&
        -                    options.form.prop('method')) || ''
        -                ).toUpperCase();
        -            if (options.type !== 'POST' && options.type !== 'PUT' &&
        -                    options.type !== 'PATCH') {
        -                options.type = 'POST';
        -            }
        -            if (!options.formAcceptCharset) {
        -                options.formAcceptCharset = options.form.attr('accept-charset');
        -            }
        -        },
        -
        -        _getAJAXSettings: function (data) {
        -            var options = $.extend({}, this.options, data);
        -            this._initFormSettings(options);
        -            this._initDataSettings(options);
        -            return options;
        -        },
        -
        -        // jQuery 1.6 doesn't provide .state(),
        -        // while jQuery 1.8+ removed .isRejected() and .isResolved():
        -        _getDeferredState: function (deferred) {
        -            if (deferred.state) {
        -                return deferred.state();
        -            }
        -            if (deferred.isResolved()) {
        -                return 'resolved';
        -            }
        -            if (deferred.isRejected()) {
        -                return 'rejected';
        -            }
        -            return 'pending';
        -        },
        -
        -        // Maps jqXHR callbacks to the equivalent
        -        // methods of the given Promise object:
        -        _enhancePromise: function (promise) {
        -            promise.success = promise.done;
        -            promise.error = promise.fail;
        -            promise.complete = promise.always;
        -            return promise;
        -        },
        -
        -        // Creates and returns a Promise object enhanced with
        -        // the jqXHR methods abort, success, error and complete:
        -        _getXHRPromise: function (resolveOrReject, context, args) {
        -            var dfd = $.Deferred(),
        -                promise = dfd.promise();
        -            context = context || this.options.context || promise;
        -            if (resolveOrReject === true) {
        -                dfd.resolveWith(context, args);
        -            } else if (resolveOrReject === false) {
        -                dfd.rejectWith(context, args);
        -            }
        -            promise.abort = dfd.promise;
        -            return this._enhancePromise(promise);
        -        },
        -
        -        // Adds convenience methods to the data callback argument:
        -        _addConvenienceMethods: function (e, data) {
        -            var that = this,
        -                getPromise = function (args) {
        -                    return $.Deferred().resolveWith(that, args).promise();
        -                };
        -            data.process = function (resolveFunc, rejectFunc) {
        -                if (resolveFunc || rejectFunc) {
        -                    data._processQueue = this._processQueue =
        -                        (this._processQueue || getPromise([this])).pipe(
        -                            function () {
        -                                if (data.errorThrown) {
        -                                    return $.Deferred()
        -                                        .rejectWith(that, [data]).promise();
        -                                }
        -                                return getPromise(arguments);
        -                            }
        -                        ).pipe(resolveFunc, rejectFunc);
        -                }
        -                return this._processQueue || getPromise([this]);
        -            };
        -            data.submit = function () {
        -                if (this.state() !== 'pending') {
        -                    data.jqXHR = this.jqXHR =
        -                        (that._trigger(
        -                            'submit',
        -                            $.Event('submit', {delegatedEvent: e}),
        -                            this
        -                        ) !== false) && that._onSend(e, this);
        -                }
        -                return this.jqXHR || that._getXHRPromise();
        -            };
        -            data.abort = function () {
        -                if (this.jqXHR) {
        -                    return this.jqXHR.abort();
        -                }
        -                this.errorThrown = 'abort';
        -                that._trigger('fail', null, this);
        -                return that._getXHRPromise(false);
        -            };
        -            data.state = function () {
        -                if (this.jqXHR) {
        -                    return that._getDeferredState(this.jqXHR);
        -                }
        -                if (this._processQueue) {
        -                    return that._getDeferredState(this._processQueue);
        -                }
        -            };
        -            data.processing = function () {
        -                return !this.jqXHR && this._processQueue && that
        -                    ._getDeferredState(this._processQueue) === 'pending';
        -            };
        -            data.progress = function () {
        -                return this._progress;
        -            };
        -            data.response = function () {
        -                return this._response;
        -            };
        -        },
        -
        -        // Parses the Range header from the server response
        -        // and returns the uploaded bytes:
        -        _getUploadedBytes: function (jqXHR) {
        -            var range = jqXHR.getResponseHeader('Range'),
        -                parts = range && range.split('-'),
        -                upperBytesPos = parts && parts.length > 1 &&
        -                    parseInt(parts[1], 10);
        -            return upperBytesPos && upperBytesPos + 1;
        -        },
        -
        -        // Uploads a file in multiple, sequential requests
        -        // by splitting the file up in multiple blob chunks.
        -        // If the second parameter is true, only tests if the file
        -        // should be uploaded in chunks, but does not invoke any
        -        // upload requests:
        -        _chunkedUpload: function (options, testOnly) {
        -            options.uploadedBytes = options.uploadedBytes || 0;
        -            var that = this,
        -                file = options.files[0],
        -                fs = file.size,
        -                ub = options.uploadedBytes,
        -                mcs = options.maxChunkSize || fs,
        -                slice = this._blobSlice,
        -                dfd = $.Deferred(),
        -                promise = dfd.promise(),
        -                jqXHR,
        -                upload;
        -            if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
        -                    options.data) {
        -                return false;
        -            }
        -            if (testOnly) {
        -                return true;
        -            }
        -            if (ub >= fs) {
        -                file.error = options.i18n('uploadedBytes');
        -                return this._getXHRPromise(
        -                    false,
        -                    options.context,
        -                    [null, 'error', file.error]
        -                );
        -            }
        -            // The chunk upload method:
        -            upload = function () {
        -                // Clone the options object for each chunk upload:
        -                var o = $.extend({}, options),
        -                    currentLoaded = o._progress.loaded;
        -                o.blob = slice.call(
        -                    file,
        -                    ub,
        -                    ub + mcs,
        -                    file.type
        -                );
        -                // Store the current chunk size, as the blob itself
        -                // will be dereferenced after data processing:
        -                o.chunkSize = o.blob.size;
        -                // Expose the chunk bytes position range:
        -                o.contentRange = 'bytes ' + ub + '-' +
        -                    (ub + o.chunkSize - 1) + '/' + fs;
        -                // Process the upload data (the blob and potential form data):
        -                that._initXHRData(o);
        -                // Add progress listeners for this chunk upload:
        -                that._initProgressListener(o);
        -                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||
        -                        that._getXHRPromise(false, o.context))
        -                    .done(function (result, textStatus, jqXHR) {
        -                        ub = that._getUploadedBytes(jqXHR) ||
        -                            (ub + o.chunkSize);
        -                        // Create a progress event if no final progress event
        -                        // with loaded equaling total has been triggered
        -                        // for this chunk:
        -                        if (currentLoaded + o.chunkSize - o._progress.loaded) {
        -                            that._onProgress($.Event('progress', {
        -                                lengthComputable: true,
        -                                loaded: ub - o.uploadedBytes,
        -                                total: ub - o.uploadedBytes
        -                            }), o);
        -                        }
        -                        options.uploadedBytes = o.uploadedBytes = ub;
        -                        o.result = result;
        -                        o.textStatus = textStatus;
        -                        o.jqXHR = jqXHR;
        -                        that._trigger('chunkdone', null, o);
        -                        that._trigger('chunkalways', null, o);
        -                        if (ub < fs) {
        -                            // File upload not yet complete,
        -                            // continue with the next chunk:
        -                            upload();
        -                        } else {
        -                            dfd.resolveWith(
        -                                o.context,
        -                                [result, textStatus, jqXHR]
        -                            );
        -                        }
        -                    })
        -                    .fail(function (jqXHR, textStatus, errorThrown) {
        -                        o.jqXHR = jqXHR;
        -                        o.textStatus = textStatus;
        -                        o.errorThrown = errorThrown;
        -                        that._trigger('chunkfail', null, o);
        -                        that._trigger('chunkalways', null, o);
        -                        dfd.rejectWith(
        -                            o.context,
        -                            [jqXHR, textStatus, errorThrown]
        -                        );
        -                    });
        -            };
        -            this._enhancePromise(promise);
        -            promise.abort = function () {
        -                return jqXHR.abort();
        -            };
        -            upload();
        -            return promise;
        -        },
        -
        -        _beforeSend: function (e, data) {
        -            if (this._active === 0) {
        -                // the start callback is triggered when an upload starts
        -                // and no other uploads are currently running,
        -                // equivalent to the global ajaxStart event:
        -                this._trigger('start');
        -                // Set timer for global bitrate progress calculation:
        -                this._bitrateTimer = new this._BitrateTimer();
        -                // Reset the global progress values:
        -                this._progress.loaded = this._progress.total = 0;
        -                this._progress.bitrate = 0;
        -            }
        -            // Make sure the container objects for the .response() and
        -            // .progress() methods on the data object are available
        -            // and reset to their initial state:
        -            this._initResponseObject(data);
        -            this._initProgressObject(data);
        -            data._progress.loaded = data.loaded = data.uploadedBytes || 0;
        -            data._progress.total = data.total = this._getTotal(data.files) || 1;
        -            data._progress.bitrate = data.bitrate = 0;
        -            this._active += 1;
        -            // Initialize the global progress values:
        -            this._progress.loaded += data.loaded;
        -            this._progress.total += data.total;
        -        },
        -
        -        _onDone: function (result, textStatus, jqXHR, options) {
        -            var total = options._progress.total,
        -                response = options._response;
        -            if (options._progress.loaded < total) {
        -                // Create a progress event if no final progress event
        -                // with loaded equaling total has been triggered:
        -                this._onProgress($.Event('progress', {
        -                    lengthComputable: true,
        -                    loaded: total,
        -                    total: total
        -                }), options);
        -            }
        -            response.result = options.result = result;
        -            response.textStatus = options.textStatus = textStatus;
        -            response.jqXHR = options.jqXHR = jqXHR;
        -            this._trigger('done', null, options);
        -        },
        -
        -        _onFail: function (jqXHR, textStatus, errorThrown, options) {
        -            var response = options._response;
        -            if (options.recalculateProgress) {
        -                // Remove the failed (error or abort) file upload from
        -                // the global progress calculation:
        -                this._progress.loaded -= options._progress.loaded;
        -                this._progress.total -= options._progress.total;
        -            }
        -            response.jqXHR = options.jqXHR = jqXHR;
        -            response.textStatus = options.textStatus = textStatus;
        -            response.errorThrown = options.errorThrown = errorThrown;
        -            this._trigger('fail', null, options);
        -        },
        -
        -        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {
        -            // jqXHRorResult, textStatus and jqXHRorError are added to the
        -            // options object via done and fail callbacks
        -            this._trigger('always', null, options);
        -        },
        -
        -        _onSend: function (e, data) {
        -            if (!data.submit) {
        -                this._addConvenienceMethods(e, data);
        -            }
        -            var that = this,
        -                jqXHR,
        -                aborted,
        -                slot,
        -                pipe,
        -                options = that._getAJAXSettings(data),
        -                send = function () {
        -                    that._sending += 1;
        -                    // Set timer for bitrate progress calculation:
        -                    options._bitrateTimer = new that._BitrateTimer();
        -                    jqXHR = jqXHR || (
        -                        ((aborted || that._trigger(
        -                            'send',
        -                            $.Event('send', {delegatedEvent: e}),
        -                            options
        -                        ) === false) &&
        -                        that._getXHRPromise(false, options.context, aborted)) ||
        -                        that._chunkedUpload(options) || $.ajax(options)
        -                    ).done(function (result, textStatus, jqXHR) {
        -                        that._onDone(result, textStatus, jqXHR, options);
        -                    }).fail(function (jqXHR, textStatus, errorThrown) {
        -                        that._onFail(jqXHR, textStatus, errorThrown, options);
        -                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {
        -                        that._onAlways(
        -                            jqXHRorResult,
        -                            textStatus,
        -                            jqXHRorError,
        -                            options
        -                        );
        -                        that._sending -= 1;
        -                        that._active -= 1;
        -                        if (options.limitConcurrentUploads &&
        -                                options.limitConcurrentUploads > that._sending) {
        -                            // Start the next queued upload,
        -                            // that has not been aborted:
        -                            var nextSlot = that._slots.shift();
        -                            while (nextSlot) {
        -                                if (that._getDeferredState(nextSlot) === 'pending') {
        -                                    nextSlot.resolve();
        -                                    break;
        -                                }
        -                                nextSlot = that._slots.shift();
        -                            }
        -                        }
        -                        if (that._active === 0) {
        -                            // The stop callback is triggered when all uploads have
        -                            // been completed, equivalent to the global ajaxStop event:
        -                            that._trigger('stop');
        -                        }
        -                    });
        -                    return jqXHR;
        -                };
        -            this._beforeSend(e, options);
        -            if (this.options.sequentialUploads ||
        -                    (this.options.limitConcurrentUploads &&
        -                    this.options.limitConcurrentUploads <= this._sending)) {
        -                if (this.options.limitConcurrentUploads > 1) {
        -                    slot = $.Deferred();
        -                    this._slots.push(slot);
        -                    pipe = slot.pipe(send);
        -                } else {
        -                    this._sequence = this._sequence.pipe(send, send);
        -                    pipe = this._sequence;
        -                }
        -                // Return the piped Promise object, enhanced with an abort method,
        -                // which is delegated to the jqXHR object of the current upload,
        -                // and jqXHR callbacks mapped to the equivalent Promise methods:
        -                pipe.abort = function () {
        -                    aborted = [undefined, 'abort', 'abort'];
        -                    if (!jqXHR) {
        -                        if (slot) {
        -                            slot.rejectWith(options.context, aborted);
        -                        }
        -                        return send();
        -                    }
        -                    return jqXHR.abort();
        -                };
        -                return this._enhancePromise(pipe);
        -            }
        -            return send();
        -        },
        -
        -        _onAdd: function (e, data) {
        -            var that = this,
        -                result = true,
        -                options = $.extend({}, this.options, data),
        -                files = data.files,
        -                filesLength = files.length,
        -                limit = options.limitMultiFileUploads,
        -                limitSize = options.limitMultiFileUploadSize,
        -                overhead = options.limitMultiFileUploadSizeOverhead,
        -                batchSize = 0,
        -                paramName = this._getParamName(options),
        -                paramNameSet,
        -                paramNameSlice,
        -                fileSet,
        -                i,
        -                j = 0;
        -            if (!filesLength) {
        -                return false;
        -            }
        -            if (limitSize && files[0].size === undefined) {
        -                limitSize = undefined;
        -            }
        -            if (!(options.singleFileUploads || limit || limitSize) ||
        -                    !this._isXHRUpload(options)) {
        -                fileSet = [files];
        -                paramNameSet = [paramName];
        -            } else if (!(options.singleFileUploads || limitSize) && limit) {
        -                fileSet = [];
        -                paramNameSet = [];
        -                for (i = 0; i < filesLength; i += limit) {
        -                    fileSet.push(files.slice(i, i + limit));
        -                    paramNameSlice = paramName.slice(i, i + limit);
        -                    if (!paramNameSlice.length) {
        -                        paramNameSlice = paramName;
        -                    }
        -                    paramNameSet.push(paramNameSlice);
        -                }
        -            } else if (!options.singleFileUploads && limitSize) {
        -                fileSet = [];
        -                paramNameSet = [];
        -                for (i = 0; i < filesLength; i = i + 1) {
        -                    batchSize += files[i].size + overhead;
        -                    if (i + 1 === filesLength ||
        -                            ((batchSize + files[i + 1].size + overhead) > limitSize) ||
        -                            (limit && i + 1 - j >= limit)) {
        -                        fileSet.push(files.slice(j, i + 1));
        -                        paramNameSlice = paramName.slice(j, i + 1);
        -                        if (!paramNameSlice.length) {
        -                            paramNameSlice = paramName;
        -                        }
        -                        paramNameSet.push(paramNameSlice);
        -                        j = i + 1;
        -                        batchSize = 0;
        -                    }
        -                }
        -            } else {
        -                paramNameSet = paramName;
        -            }
        -            data.originalFiles = files;
        -            $.each(fileSet || files, function (index, element) {
        -                var newData = $.extend({}, data);
        -                newData.files = fileSet ? element : [element];
        -                newData.paramName = paramNameSet[index];
        -                that._initResponseObject(newData);
        -                that._initProgressObject(newData);
        -                that._addConvenienceMethods(e, newData);
        -                result = that._trigger(
        -                    'add',
        -                    $.Event('add', {delegatedEvent: e}),
        -                    newData
        -                );
        -                return result;
        -            });
        -            return result;
        -        },
        -
        -        _replaceFileInput: function (data) {
        -            var input = data.fileInput,
        -                inputClone = input.clone(true);
        -            // Add a reference for the new cloned file input to the data argument:
        -            data.fileInputClone = inputClone;
        -            $('<form></form>').append(inputClone)[0].reset();
        -            // Detaching allows to insert the fileInput on another form
        -            // without loosing the file input value:
        -            input.after(inputClone).detach();
        -            // Avoid memory leaks with the detached file input:
        -            $.cleanData(input.unbind('remove'));
        -            // Replace the original file input element in the fileInput
        -            // elements set with the clone, which has been copied including
        -            // event handlers:
        -            this.options.fileInput = this.options.fileInput.map(function (i, el) {
        -                if (el === input[0]) {
        -                    return inputClone[0];
        -                }
        -                return el;
        -            });
        -            // If the widget has been initialized on the file input itself,
        -            // override this.element with the file input clone:
        -            if (input[0] === this.element[0]) {
        -                this.element = inputClone;
        -            }
        -        },
        -
        -        _handleFileTreeEntry: function (entry, path) {
        -            var that = this,
        -                dfd = $.Deferred(),
        -                errorHandler = function (e) {
        -                    if (e && !e.entry) {
        -                        e.entry = entry;
        -                    }
        -                    // Since $.when returns immediately if one
        -                    // Deferred is rejected, we use resolve instead.
        -                    // This allows valid files and invalid items
        -                    // to be returned together in one set:
        -                    dfd.resolve([e]);
        -                },
        -                successHandler = function (entries) {
        -                    that._handleFileTreeEntries(
        -                        entries,
        -                        path + entry.name + '/'
        -                    ).done(function (files) {
        -                        dfd.resolve(files);
        -                    }).fail(errorHandler);
        -                },
        -                readEntries = function () {
        -                    dirReader.readEntries(function (results) {
        -                        if (!results.length) {
        -                            successHandler(entries);
        -                        } else {
        -                            entries = entries.concat(results);
        -                            readEntries();
        -                        }
        -                    }, errorHandler);
        -                },
        -                dirReader, entries = [];
        -            path = path || '';
        -            if (entry.isFile) {
        -                if (entry._file) {
        -                    // Workaround for Chrome bug #149735
        -                    entry._file.relativePath = path;
        -                    dfd.resolve(entry._file);
        -                } else {
        -                    entry.file(function (file) {
        -                        file.relativePath = path;
        -                        dfd.resolve(file);
        -                    }, errorHandler);
        -                }
        -            } else if (entry.isDirectory) {
        -                dirReader = entry.createReader();
        -                readEntries();
        -            } else {
        -                // Return an empy list for file system items
        -                // other than files or directories:
        -                dfd.resolve([]);
        -            }
        -            return dfd.promise();
        -        },
        -
        -        _handleFileTreeEntries: function (entries, path) {
        -            var that = this;
        -            return $.when.apply(
        -                $,
        -                $.map(entries, function (entry) {
        -                    return that._handleFileTreeEntry(entry, path);
        -                })
        -            ).pipe(function () {
        -                return Array.prototype.concat.apply(
        -                    [],
        -                    arguments
        -                );
        -            });
        -        },
        -
        -        _getDroppedFiles: function (dataTransfer) {
        -            dataTransfer = dataTransfer || {};
        -            var items = dataTransfer.items;
        -            if (items && items.length && (items[0].webkitGetAsEntry ||
        -                    items[0].getAsEntry)) {
        -                return this._handleFileTreeEntries(
        -                    $.map(items, function (item) {
        -                        var entry;
        -                        if (item.webkitGetAsEntry) {
        -                            entry = item.webkitGetAsEntry();
        -                            if (entry) {
        -                                // Workaround for Chrome bug #149735:
        -                                entry._file = item.getAsFile();
        -                            }
        -                            return entry;
        -                        }
        -                        return item.getAsEntry();
        -                    })
        -                );
        -            }
        -            return $.Deferred().resolve(
        -                $.makeArray(dataTransfer.files)
        -            ).promise();
        -        },
        -
        -        _getSingleFileInputFiles: function (fileInput) {
        -            fileInput = $(fileInput);
        -            var entries = fileInput.prop('webkitEntries') ||
        -                    fileInput.prop('entries'),
        -                files,
        -                value;
        -            if (entries && entries.length) {
        -                return this._handleFileTreeEntries(entries);
        -            }
        -            files = $.makeArray(fileInput.prop('files'));
        -            if (!files.length) {
        -                value = fileInput.prop('value');
        -                if (!value) {
        -                    return $.Deferred().resolve([]).promise();
        -                }
        -                // If the files property is not available, the browser does not
        -                // support the File API and we add a pseudo File object with
        -                // the input value as name with path information removed:
        -                files = [{name: value.replace(/^.*\\/, '')}];
        -            } else if (files[0].name === undefined && files[0].fileName) {
        -                // File normalization for Safari 4 and Firefox 3:
        -                $.each(files, function (index, file) {
        -                    file.name = file.fileName;
        -                    file.size = file.fileSize;
        -                });
        -            }
        -            return $.Deferred().resolve(files).promise();
        -        },
        -
        -        _getFileInputFiles: function (fileInput) {
        -            if (!(fileInput instanceof $) || fileInput.length === 1) {
        -                return this._getSingleFileInputFiles(fileInput);
        -            }
        -            return $.when.apply(
        -                $,
        -                $.map(fileInput, this._getSingleFileInputFiles)
        -            ).pipe(function () {
        -                return Array.prototype.concat.apply(
        -                    [],
        -                    arguments
        -                );
        -            });
        -        },
        -
        -        _onChange: function (e) {
        -            var that = this,
        -                data = {
        -                    fileInput: $(e.target),
        -                    form: $(e.target.form)
        -                };
        -            this._getFileInputFiles(data.fileInput).always(function (files) {
        -                data.files = files;
        -                if (that.options.replaceFileInput) {
        -                    that._replaceFileInput(data);
        -                }
        -                if (that._trigger(
        -                        'change',
        -                        $.Event('change', {delegatedEvent: e}),
        -                        data
        -                    ) !== false) {
        -                    that._onAdd(e, data);
        -                }
        -            });
        -        },
        -
        -        _onPaste: function (e) {
        -            var items = e.originalEvent && e.originalEvent.clipboardData &&
        -                    e.originalEvent.clipboardData.items,
        -                data = {files: []};
        -            if (items && items.length) {
        -                $.each(items, function (index, item) {
        -                    var file = item.getAsFile && item.getAsFile();
        -                    if (file) {
        -                        data.files.push(file);
        -                    }
        -                });
        -                if (this._trigger(
        -                        'paste',
        -                        $.Event('paste', {delegatedEvent: e}),
        -                        data
        -                    ) !== false) {
        -                    this._onAdd(e, data);
        -                }
        -            }
        -        },
        -
        -        _onDrop: function (e) {
        -            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
        -            var that = this,
        -                dataTransfer = e.dataTransfer,
        -                data = {};
        -            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
        -                e.preventDefault();
        -                this._getDroppedFiles(dataTransfer).always(function (files) {
        -                    data.files = files;
        -                    if (that._trigger(
        -                            'drop',
        -                            $.Event('drop', {delegatedEvent: e}),
        -                            data
        -                        ) !== false) {
        -                        that._onAdd(e, data);
        -                    }
        -                });
        -            }
        -        },
        -
        -        _onDragOver: getDragHandler('dragover'),
        -
        -        _onDragEnter: getDragHandler('dragenter'),
        -
        -        _onDragLeave: getDragHandler('dragleave'),
        -
        -        _initEventHandlers: function () {
        -            if (this._isXHRUpload(this.options)) {
        -                this._on(this.options.dropZone, {
        -                    dragover: this._onDragOver,
        -                    drop: this._onDrop,
        -                    // event.preventDefault() on dragenter is required for IE10+:
        -                    dragenter: this._onDragEnter,
        -                    // dragleave is not required, but added for completeness:
        -                    dragleave: this._onDragLeave
        -                });
        -                this._on(this.options.pasteZone, {
        -                    paste: this._onPaste
        -                });
        -            }
        -            if ($.support.fileInput) {
        -                this._on(this.options.fileInput, {
        -                    change: this._onChange
        -                });
        -            }
        -        },
        -
        -        _destroyEventHandlers: function () {
        -            this._off(this.options.dropZone, 'dragenter dragleave dragover drop');
        -            this._off(this.options.pasteZone, 'paste');
        -            this._off(this.options.fileInput, 'change');
        -        },
        -
        -        _setOption: function (key, value) {
        -            var reinit = $.inArray(key, this._specialOptions) !== -1;
        -            if (reinit) {
        -                this._destroyEventHandlers();
        -            }
        -            this._super(key, value);
        -            if (reinit) {
        -                this._initSpecialOptions();
        -                this._initEventHandlers();
        -            }
        -        },
        -
        -        _initSpecialOptions: function () {
        -            var options = this.options;
        -            if (options.fileInput === undefined) {
        -                options.fileInput = this.element.is('input[type="file"]') ?
        -                        this.element : this.element.find('input[type="file"]');
        -            } else if (!(options.fileInput instanceof $)) {
        -                options.fileInput = $(options.fileInput);
        -            }
        -            if (!(options.dropZone instanceof $)) {
        -                options.dropZone = $(options.dropZone);
        -            }
        -            if (!(options.pasteZone instanceof $)) {
        -                options.pasteZone = $(options.pasteZone);
        -            }
        -        },
        -
        -        _getRegExp: function (str) {
        -            var parts = str.split('/'),
        -                modifiers = parts.pop();
        -            parts.shift();
        -            return new RegExp(parts.join('/'), modifiers);
        -        },
        -
        -        _isRegExpOption: function (key, value) {
        -            return key !== 'url' && $.type(value) === 'string' &&
        -                /^\/.*\/[igm]{0,3}$/.test(value);
        -        },
        -
        -        _initDataAttributes: function () {
        -            var that = this,
        -                options = this.options,
        -                data = this.element.data();
        -            // Initialize options set via HTML5 data-attributes:
        -            $.each(
        -                this.element[0].attributes,
        -                function (index, attr) {
        -                    var key = attr.name.toLowerCase(),
        -                        value;
        -                    if (/^data-/.test(key)) {
        -                        // Convert hyphen-ated key to camelCase:
        -                        key = key.slice(5).replace(/-[a-z]/g, function (str) {
        -                            return str.charAt(1).toUpperCase();
        -                        });
        -                        value = data[key];
        -                        if (that._isRegExpOption(key, value)) {
        -                            value = that._getRegExp(value);
        -                        }
        -                        options[key] = value;
        -                    }
        -                }
        -            );
        -        },
        -
        -        _create: function () {
        -            this._initDataAttributes();
        -            this._initSpecialOptions();
        -            this._slots = [];
        -            this._sequence = this._getXHRPromise(true);
        -            this._sending = this._active = 0;
        -            this._initProgressObject(this);
        -            this._initEventHandlers();
        -        },
        -
        -        // This method is exposed to the widget API and allows to query
        -        // the number of active uploads:
        -        active: function () {
        -            return this._active;
        -        },
        -
        -        // This method is exposed to the widget API and allows to query
        -        // the widget upload progress.
        -        // It returns an object with loaded, total and bitrate properties
        -        // for the running uploads:
        -        progress: function () {
        -            return this._progress;
        -        },
        -
        -        // This method is exposed to the widget API and allows adding files
        -        // using the fileupload API. The data parameter accepts an object which
        -        // must have a files property and can contain additional options:
        -        // .fileupload('add', {files: filesList});
        -        add: function (data) {
        -            var that = this;
        -            if (!data || this.options.disabled) {
        -                return;
        -            }
        -            if (data.fileInput && !data.files) {
        -                this._getFileInputFiles(data.fileInput).always(function (files) {
        -                    data.files = files;
        -                    that._onAdd(null, data);
        -                });
        -            } else {
        -                data.files = $.makeArray(data.files);
        -                this._onAdd(null, data);
        -            }
        -        },
        -
        -        // This method is exposed to the widget API and allows sending files
        -        // using the fileupload API. The data parameter accepts an object which
        -        // must have a files or fileInput property and can contain additional options:
        -        // .fileupload('send', {files: filesList});
        -        // The method returns a Promise object for the file upload call.
        -        send: function (data) {
        -            if (data && !this.options.disabled) {
        -                if (data.fileInput && !data.files) {
        -                    var that = this,
        -                        dfd = $.Deferred(),
        -                        promise = dfd.promise(),
        -                        jqXHR,
        -                        aborted;
        -                    promise.abort = function () {
        -                        aborted = true;
        -                        if (jqXHR) {
        -                            return jqXHR.abort();
        -                        }
        -                        dfd.reject(null, 'abort', 'abort');
        -                        return promise;
        -                    };
        -                    this._getFileInputFiles(data.fileInput).always(
        -                        function (files) {
        -                            if (aborted) {
        -                                return;
        -                            }
        -                            if (!files.length) {
        -                                dfd.reject();
        -                                return;
        -                            }
        -                            data.files = files;
        -                            jqXHR = that._onSend(null, data);
        -                            jqXHR.then(
        -                                function (result, textStatus, jqXHR) {
        -                                    dfd.resolve(result, textStatus, jqXHR);
        -                                },
        -                                function (jqXHR, textStatus, errorThrown) {
        -                                    dfd.reject(jqXHR, textStatus, errorThrown);
        -                                }
        -                            );
        -                        }
        -                    );
        -                    return this._enhancePromise(promise);
        -                }
        -                data.files = $.makeArray(data.files);
        -                if (data.files.length) {
        -                    return this._onSend(null, data);
        -                }
        -            }
        -            return this._getXHRPromise(false, data && data.context);
        -        }
        -
        -    });
        -
        -}));
        -
        -/*!
        - * Bootstrap v3.3.6 (http://getbootstrap.com)
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under the MIT license
        - */
        -
        -if (typeof jQuery === 'undefined') {
        -  throw new Error('Bootstrap\'s JavaScript requires jQuery')
        -}
        -
        -+function ($) {
        -  'use strict';
        -  var version = $.fn.jquery.split(' ')[0].split('.')
        -  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {
        -    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
        -  }
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: transition.js v3.3.6
        - * http://getbootstrap.com/javascript/#transitions
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
        -  // ============================================================
        -
        -  function transitionEnd() {
        -    var el = document.createElement('bootstrap')
        -
        -    var transEndEventNames = {
        -      WebkitTransition : 'webkitTransitionEnd',
        -      MozTransition    : 'transitionend',
        -      OTransition      : 'oTransitionEnd otransitionend',
        -      transition       : 'transitionend'
        -    }
        -
        -    for (var name in transEndEventNames) {
        -      if (el.style[name] !== undefined) {
        -        return { end: transEndEventNames[name] }
        -      }
        -    }
        -
        -    return false // explicit for ie8 (  ._.)
        -  }
        -
        -  // http://blog.alexmaccaw.com/css-transitions
        -  $.fn.emulateTransitionEnd = function (duration) {
        -    var called = false
        -    var $el = this
        -    $(this).one('bsTransitionEnd', function () { called = true })
        -    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
        -    setTimeout(callback, duration)
        -    return this
        -  }
        -
        -  $(function () {
        -    $.support.transition = transitionEnd()
        -
        -    if (!$.support.transition) return
        -
        -    $.event.special.bsTransitionEnd = {
        -      bindType: $.support.transition.end,
        -      delegateType: $.support.transition.end,
        -      handle: function (e) {
        -        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
        -      }
        -    }
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: alert.js v3.3.6
        - * http://getbootstrap.com/javascript/#alerts
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // ALERT CLASS DEFINITION
        -  // ======================
        -
        -  var dismiss = '[data-dismiss="alert"]'
        -  var Alert   = function (el) {
        -    $(el).on('click', dismiss, this.close)
        -  }
        -
        -  Alert.VERSION = '3.3.6'
        -
        -  Alert.TRANSITION_DURATION = 150
        -
        -  Alert.prototype.close = function (e) {
        -    var $this    = $(this)
        -    var selector = $this.attr('data-target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    var $parent = $(selector)
        -
        -    if (e) e.preventDefault()
        -
        -    if (!$parent.length) {
        -      $parent = $this.closest('.alert')
        -    }
        -
        -    $parent.trigger(e = $.Event('close.bs.alert'))
        -
        -    if (e.isDefaultPrevented()) return
        -
        -    $parent.removeClass('in')
        -
        -    function removeElement() {
        -      // detach from parent, fire event then clean up data
        -      $parent.detach().trigger('closed.bs.alert').remove()
        -    }
        -
        -    $.support.transition && $parent.hasClass('fade') ?
        -      $parent
        -        .one('bsTransitionEnd', removeElement)
        -        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
        -      removeElement()
        -  }
        -
        -
        -  // ALERT PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.alert')
        -
        -      if (!data) $this.data('bs.alert', (data = new Alert(this)))
        -      if (typeof option == 'string') data[option].call($this)
        -    })
        -  }
        -
        -  var old = $.fn.alert
        -
        -  $.fn.alert             = Plugin
        -  $.fn.alert.Constructor = Alert
        -
        -
        -  // ALERT NO CONFLICT
        -  // =================
        -
        -  $.fn.alert.noConflict = function () {
        -    $.fn.alert = old
        -    return this
        -  }
        -
        -
        -  // ALERT DATA-API
        -  // ==============
        -
        -  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: button.js v3.3.6
        - * http://getbootstrap.com/javascript/#buttons
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // BUTTON PUBLIC CLASS DEFINITION
        -  // ==============================
        -
        -  var Button = function (element, options) {
        -    this.$element  = $(element)
        -    this.options   = $.extend({}, Button.DEFAULTS, options)
        -    this.isLoading = false
        -  }
        -
        -  Button.VERSION  = '3.3.6'
        -
        -  Button.DEFAULTS = {
        -    loadingText: 'loading...'
        -  }
        -
        -  Button.prototype.setState = function (state) {
        -    var d    = 'disabled'
        -    var $el  = this.$element
        -    var val  = $el.is('input') ? 'val' : 'html'
        -    var data = $el.data()
        -
        -    state += 'Text'
        -
        -    if (data.resetText == null) $el.data('resetText', $el[val]())
        -
        -    // push to event loop to allow forms to submit
        -    setTimeout($.proxy(function () {
        -      $el[val](data[state] == null ? this.options[state] : data[state])
        -
        -      if (state == 'loadingText') {
        -        this.isLoading = true
        -        $el.addClass(d).attr(d, d)
        -      } else if (this.isLoading) {
        -        this.isLoading = false
        -        $el.removeClass(d).removeAttr(d)
        -      }
        -    }, this), 0)
        -  }
        -
        -  Button.prototype.toggle = function () {
        -    var changed = true
        -    var $parent = this.$element.closest('[data-toggle="buttons"]')
        -
        -    if ($parent.length) {
        -      var $input = this.$element.find('input')
        -      if ($input.prop('type') == 'radio') {
        -        if ($input.prop('checked')) changed = false
        -        $parent.find('.active').removeClass('active')
        -        this.$element.addClass('active')
        -      } else if ($input.prop('type') == 'checkbox') {
        -        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
        -        this.$element.toggleClass('active')
        -      }
        -      $input.prop('checked', this.$element.hasClass('active'))
        -      if (changed) $input.trigger('change')
        -    } else {
        -      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
        -      this.$element.toggleClass('active')
        -    }
        -  }
        -
        -
        -  // BUTTON PLUGIN DEFINITION
        -  // ========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.button')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.button', (data = new Button(this, options)))
        -
        -      if (option == 'toggle') data.toggle()
        -      else if (option) data.setState(option)
        -    })
        -  }
        -
        -  var old = $.fn.button
        -
        -  $.fn.button             = Plugin
        -  $.fn.button.Constructor = Button
        -
        -
        -  // BUTTON NO CONFLICT
        -  // ==================
        -
        -  $.fn.button.noConflict = function () {
        -    $.fn.button = old
        -    return this
        -  }
        -
        -
        -  // BUTTON DATA-API
        -  // ===============
        -
        -  $(document)
        -    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        -      var $btn = $(e.target)
        -      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
        -      Plugin.call($btn, 'toggle')
        -      if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
        -    })
        -    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        -      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
        -    })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: carousel.js v3.3.6
        - * http://getbootstrap.com/javascript/#carousel
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // CAROUSEL CLASS DEFINITION
        -  // =========================
        -
        -  var Carousel = function (element, options) {
        -    this.$element    = $(element)
        -    this.$indicators = this.$element.find('.carousel-indicators')
        -    this.options     = options
        -    this.paused      = null
        -    this.sliding     = null
        -    this.interval    = null
        -    this.$active     = null
        -    this.$items      = null
        -
        -    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
        -
        -    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
        -      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
        -      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
        -  }
        -
        -  Carousel.VERSION  = '3.3.6'
        -
        -  Carousel.TRANSITION_DURATION = 600
        -
        -  Carousel.DEFAULTS = {
        -    interval: 5000,
        -    pause: 'hover',
        -    wrap: true,
        -    keyboard: true
        -  }
        -
        -  Carousel.prototype.keydown = function (e) {
        -    if (/input|textarea/i.test(e.target.tagName)) return
        -    switch (e.which) {
        -      case 37: this.prev(); break
        -      case 39: this.next(); break
        -      default: return
        -    }
        -
        -    e.preventDefault()
        -  }
        -
        -  Carousel.prototype.cycle = function (e) {
        -    e || (this.paused = false)
        -
        -    this.interval && clearInterval(this.interval)
        -
        -    this.options.interval
        -      && !this.paused
        -      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
        -
        -    return this
        -  }
        -
        -  Carousel.prototype.getItemIndex = function (item) {
        -    this.$items = item.parent().children('.item')
        -    return this.$items.index(item || this.$active)
        -  }
        -
        -  Carousel.prototype.getItemForDirection = function (direction, active) {
        -    var activeIndex = this.getItemIndex(active)
        -    var willWrap = (direction == 'prev' && activeIndex === 0)
        -                || (direction == 'next' && activeIndex == (this.$items.length - 1))
        -    if (willWrap && !this.options.wrap) return active
        -    var delta = direction == 'prev' ? -1 : 1
        -    var itemIndex = (activeIndex + delta) % this.$items.length
        -    return this.$items.eq(itemIndex)
        -  }
        -
        -  Carousel.prototype.to = function (pos) {
        -    var that        = this
        -    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
        -
        -    if (pos > (this.$items.length - 1) || pos < 0) return
        -
        -    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
        -    if (activeIndex == pos) return this.pause().cycle()
        -
        -    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
        -  }
        -
        -  Carousel.prototype.pause = function (e) {
        -    e || (this.paused = true)
        -
        -    if (this.$element.find('.next, .prev').length && $.support.transition) {
        -      this.$element.trigger($.support.transition.end)
        -      this.cycle(true)
        -    }
        -
        -    this.interval = clearInterval(this.interval)
        -
        -    return this
        -  }
        -
        -  Carousel.prototype.next = function () {
        -    if (this.sliding) return
        -    return this.slide('next')
        -  }
        -
        -  Carousel.prototype.prev = function () {
        -    if (this.sliding) return
        -    return this.slide('prev')
        -  }
        -
        -  Carousel.prototype.slide = function (type, next) {
        -    var $active   = this.$element.find('.item.active')
        -    var $next     = next || this.getItemForDirection(type, $active)
        -    var isCycling = this.interval
        -    var direction = type == 'next' ? 'left' : 'right'
        -    var that      = this
        -
        -    if ($next.hasClass('active')) return (this.sliding = false)
        -
        -    var relatedTarget = $next[0]
        -    var slideEvent = $.Event('slide.bs.carousel', {
        -      relatedTarget: relatedTarget,
        -      direction: direction
        -    })
        -    this.$element.trigger(slideEvent)
        -    if (slideEvent.isDefaultPrevented()) return
        -
        -    this.sliding = true
        -
        -    isCycling && this.pause()
        -
        -    if (this.$indicators.length) {
        -      this.$indicators.find('.active').removeClass('active')
        -      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
        -      $nextIndicator && $nextIndicator.addClass('active')
        -    }
        -
        -    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
        -    if ($.support.transition && this.$element.hasClass('slide')) {
        -      $next.addClass(type)
        -      $next[0].offsetWidth // force reflow
        -      $active.addClass(direction)
        -      $next.addClass(direction)
        -      $active
        -        .one('bsTransitionEnd', function () {
        -          $next.removeClass([type, direction].join(' ')).addClass('active')
        -          $active.removeClass(['active', direction].join(' '))
        -          that.sliding = false
        -          setTimeout(function () {
        -            that.$element.trigger(slidEvent)
        -          }, 0)
        -        })
        -        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
        -    } else {
        -      $active.removeClass('active')
        -      $next.addClass('active')
        -      this.sliding = false
        -      this.$element.trigger(slidEvent)
        -    }
        -
        -    isCycling && this.cycle()
        -
        -    return this
        -  }
        -
        -
        -  // CAROUSEL PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.carousel')
        -      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -      var action  = typeof option == 'string' ? option : options.slide
        -
        -      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
        -      if (typeof option == 'number') data.to(option)
        -      else if (action) data[action]()
        -      else if (options.interval) data.pause().cycle()
        -    })
        -  }
        -
        -  var old = $.fn.carousel
        -
        -  $.fn.carousel             = Plugin
        -  $.fn.carousel.Constructor = Carousel
        -
        -
        -  // CAROUSEL NO CONFLICT
        -  // ====================
        -
        -  $.fn.carousel.noConflict = function () {
        -    $.fn.carousel = old
        -    return this
        -  }
        -
        -
        -  // CAROUSEL DATA-API
        -  // =================
        -
        -  var clickHandler = function (e) {
        -    var href
        -    var $this   = $(this)
        -    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
        -    if (!$target.hasClass('carousel')) return
        -    var options = $.extend({}, $target.data(), $this.data())
        -    var slideIndex = $this.attr('data-slide-to')
        -    if (slideIndex) options.interval = false
        -
        -    Plugin.call($target, options)
        -
        -    if (slideIndex) {
        -      $target.data('bs.carousel').to(slideIndex)
        -    }
        -
        -    e.preventDefault()
        -  }
        -
        -  $(document)
        -    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
        -    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
        -
        -  $(window).on('load', function () {
        -    $('[data-ride="carousel"]').each(function () {
        -      var $carousel = $(this)
        -      Plugin.call($carousel, $carousel.data())
        -    })
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: collapse.js v3.3.6
        - * http://getbootstrap.com/javascript/#collapse
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // COLLAPSE PUBLIC CLASS DEFINITION
        -  // ================================
        -
        -  var Collapse = function (element, options) {
        -    this.$element      = $(element)
        -    this.options       = $.extend({}, Collapse.DEFAULTS, options)
        -    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
        -                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
        -    this.transitioning = null
        -
        -    if (this.options.parent) {
        -      this.$parent = this.getParent()
        -    } else {
        -      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
        -    }
        -
        -    if (this.options.toggle) this.toggle()
        -  }
        -
        -  Collapse.VERSION  = '3.3.6'
        -
        -  Collapse.TRANSITION_DURATION = 350
        -
        -  Collapse.DEFAULTS = {
        -    toggle: true
        -  }
        -
        -  Collapse.prototype.dimension = function () {
        -    var hasWidth = this.$element.hasClass('width')
        -    return hasWidth ? 'width' : 'height'
        -  }
        -
        -  Collapse.prototype.show = function () {
        -    if (this.transitioning || this.$element.hasClass('in')) return
        -
        -    var activesData
        -    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
        -
        -    if (actives && actives.length) {
        -      activesData = actives.data('bs.collapse')
        -      if (activesData && activesData.transitioning) return
        -    }
        -
        -    var startEvent = $.Event('show.bs.collapse')
        -    this.$element.trigger(startEvent)
        -    if (startEvent.isDefaultPrevented()) return
        -
        -    if (actives && actives.length) {
        -      Plugin.call(actives, 'hide')
        -      activesData || actives.data('bs.collapse', null)
        -    }
        -
        -    var dimension = this.dimension()
        -
        -    this.$element
        -      .removeClass('collapse')
        -      .addClass('collapsing')[dimension](0)
        -      .attr('aria-expanded', true)
        -
        -    this.$trigger
        -      .removeClass('collapsed')
        -      .attr('aria-expanded', true)
        -
        -    this.transitioning = 1
        -
        -    var complete = function () {
        -      this.$element
        -        .removeClass('collapsing')
        -        .addClass('collapse in')[dimension]('')
        -      this.transitioning = 0
        -      this.$element
        -        .trigger('shown.bs.collapse')
        -    }
        -
        -    if (!$.support.transition) return complete.call(this)
        -
        -    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
        -
        -    this.$element
        -      .one('bsTransitionEnd', $.proxy(complete, this))
        -      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
        -  }
        -
        -  Collapse.prototype.hide = function () {
        -    if (this.transitioning || !this.$element.hasClass('in')) return
        -
        -    var startEvent = $.Event('hide.bs.collapse')
        -    this.$element.trigger(startEvent)
        -    if (startEvent.isDefaultPrevented()) return
        -
        -    var dimension = this.dimension()
        -
        -    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
        -
        -    this.$element
        -      .addClass('collapsing')
        -      .removeClass('collapse in')
        -      .attr('aria-expanded', false)
        -
        -    this.$trigger
        -      .addClass('collapsed')
        -      .attr('aria-expanded', false)
        -
        -    this.transitioning = 1
        -
        -    var complete = function () {
        -      this.transitioning = 0
        -      this.$element
        -        .removeClass('collapsing')
        -        .addClass('collapse')
        -        .trigger('hidden.bs.collapse')
        -    }
        -
        -    if (!$.support.transition) return complete.call(this)
        -
        -    this.$element
        -      [dimension](0)
        -      .one('bsTransitionEnd', $.proxy(complete, this))
        -      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
        -  }
        -
        -  Collapse.prototype.toggle = function () {
        -    this[this.$element.hasClass('in') ? 'hide' : 'show']()
        -  }
        -
        -  Collapse.prototype.getParent = function () {
        -    return $(this.options.parent)
        -      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
        -      .each($.proxy(function (i, element) {
        -        var $element = $(element)
        -        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
        -      }, this))
        -      .end()
        -  }
        -
        -  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
        -    var isOpen = $element.hasClass('in')
        -
        -    $element.attr('aria-expanded', isOpen)
        -    $trigger
        -      .toggleClass('collapsed', !isOpen)
        -      .attr('aria-expanded', isOpen)
        -  }
        -
        -  function getTargetFromTrigger($trigger) {
        -    var href
        -    var target = $trigger.attr('data-target')
        -      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
        -
        -    return $(target)
        -  }
        -
        -
        -  // COLLAPSE PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.collapse')
        -      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -
        -      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
        -      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.collapse
        -
        -  $.fn.collapse             = Plugin
        -  $.fn.collapse.Constructor = Collapse
        -
        -
        -  // COLLAPSE NO CONFLICT
        -  // ====================
        -
        -  $.fn.collapse.noConflict = function () {
        -    $.fn.collapse = old
        -    return this
        -  }
        -
        -
        -  // COLLAPSE DATA-API
        -  // =================
        -
        -  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
        -    var $this   = $(this)
        -
        -    if (!$this.attr('data-target')) e.preventDefault()
        -
        -    var $target = getTargetFromTrigger($this)
        -    var data    = $target.data('bs.collapse')
        -    var option  = data ? 'toggle' : $this.data()
        -
        -    Plugin.call($target, option)
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: dropdown.js v3.3.6
        - * http://getbootstrap.com/javascript/#dropdowns
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // DROPDOWN CLASS DEFINITION
        -  // =========================
        -
        -  var backdrop = '.dropdown-backdrop'
        -  var toggle   = '[data-toggle="dropdown"]'
        -  var Dropdown = function (element) {
        -    $(element).on('click.bs.dropdown', this.toggle)
        -  }
        -
        -  Dropdown.VERSION = '3.3.6'
        -
        -  function getParent($this) {
        -    var selector = $this.attr('data-target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    var $parent = selector && $(selector)
        -
        -    return $parent && $parent.length ? $parent : $this.parent()
        -  }
        -
        -  function clearMenus(e) {
        -    if (e && e.which === 3) return
        -    $(backdrop).remove()
        -    $(toggle).each(function () {
        -      var $this         = $(this)
        -      var $parent       = getParent($this)
        -      var relatedTarget = { relatedTarget: this }
        -
        -      if (!$parent.hasClass('open')) return
        -
        -      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
        -
        -      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      $this.attr('aria-expanded', 'false')
        -      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
        -    })
        -  }
        -
        -  Dropdown.prototype.toggle = function (e) {
        -    var $this = $(this)
        -
        -    if ($this.is('.disabled, :disabled')) return
        -
        -    var $parent  = getParent($this)
        -    var isActive = $parent.hasClass('open')
        -
        -    clearMenus()
        -
        -    if (!isActive) {
        -      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        -        // if mobile we use a backdrop because click events don't delegate
        -        $(document.createElement('div'))
        -          .addClass('dropdown-backdrop')
        -          .insertAfter($(this))
        -          .on('click', clearMenus)
        -      }
        -
        -      var relatedTarget = { relatedTarget: this }
        -      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      $this
        -        .trigger('focus')
        -        .attr('aria-expanded', 'true')
        -
        -      $parent
        -        .toggleClass('open')
        -        .trigger($.Event('shown.bs.dropdown', relatedTarget))
        -    }
        -
        -    return false
        -  }
        -
        -  Dropdown.prototype.keydown = function (e) {
        -    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
        -
        -    var $this = $(this)
        -
        -    e.preventDefault()
        -    e.stopPropagation()
        -
        -    if ($this.is('.disabled, :disabled')) return
        -
        -    var $parent  = getParent($this)
        -    var isActive = $parent.hasClass('open')
        -
        -    if (!isActive && e.which != 27 || isActive && e.which == 27) {
        -      if (e.which == 27) $parent.find(toggle).trigger('focus')
        -      return $this.trigger('click')
        -    }
        -
        -    var desc = ' li:not(.disabled):visible a'
        -    var $items = $parent.find('.dropdown-menu' + desc)
        -
        -    if (!$items.length) return
        -
        -    var index = $items.index(e.target)
        -
        -    if (e.which == 38 && index > 0)                 index--         // up
        -    if (e.which == 40 && index < $items.length - 1) index++         // down
        -    if (!~index)                                    index = 0
        -
        -    $items.eq(index).trigger('focus')
        -  }
        -
        -
        -  // DROPDOWN PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.dropdown')
        -
        -      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
        -      if (typeof option == 'string') data[option].call($this)
        -    })
        -  }
        -
        -  var old = $.fn.dropdown
        -
        -  $.fn.dropdown             = Plugin
        -  $.fn.dropdown.Constructor = Dropdown
        -
        -
        -  // DROPDOWN NO CONFLICT
        -  // ====================
        -
        -  $.fn.dropdown.noConflict = function () {
        -    $.fn.dropdown = old
        -    return this
        -  }
        -
        -
        -  // APPLY TO STANDARD DROPDOWN ELEMENTS
        -  // ===================================
        -
        -  $(document)
        -    .on('click.bs.dropdown.data-api', clearMenus)
        -    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
        -    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
        -    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
        -    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: modal.js v3.3.6
        - * http://getbootstrap.com/javascript/#modals
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // MODAL CLASS DEFINITION
        -  // ======================
        -
        -  var Modal = function (element, options) {
        -    this.options             = options
        -    this.$body               = $(document.body)
        -    this.$element            = $(element)
        -    this.$dialog             = this.$element.find('.modal-dialog')
        -    this.$backdrop           = null
        -    this.isShown             = null
        -    this.originalBodyPad     = null
        -    this.scrollbarWidth      = 0
        -    this.ignoreBackdropClick = false
        -
        -    if (this.options.remote) {
        -      this.$element
        -        .find('.modal-content')
        -        .load(this.options.remote, $.proxy(function () {
        -          this.$element.trigger('loaded.bs.modal')
        -        }, this))
        -    }
        -  }
        -
        -  Modal.VERSION  = '3.3.6'
        -
        -  Modal.TRANSITION_DURATION = 300
        -  Modal.BACKDROP_TRANSITION_DURATION = 150
        -
        -  Modal.DEFAULTS = {
        -    backdrop: true,
        -    keyboard: true,
        -    show: true
        -  }
        -
        -  Modal.prototype.toggle = function (_relatedTarget) {
        -    return this.isShown ? this.hide() : this.show(_relatedTarget)
        -  }
        -
        -  Modal.prototype.show = function (_relatedTarget) {
        -    var that = this
        -    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
        -
        -    this.$element.trigger(e)
        -
        -    if (this.isShown || e.isDefaultPrevented()) return
        -
        -    this.isShown = true
        -
        -    this.checkScrollbar()
        -    this.setScrollbar()
        -    this.$body.addClass('modal-open')
        -
        -    this.escape()
        -    this.resize()
        -
        -    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
        -
        -    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
        -      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        -        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
        -      })
        -    })
        -
        -    this.backdrop(function () {
        -      var transition = $.support.transition && that.$element.hasClass('fade')
        -
        -      if (!that.$element.parent().length) {
        -        that.$element.appendTo(that.$body) // don't move modals dom position
        -      }
        -
        -      that.$element
        -        .show()
        -        .scrollTop(0)
        -
        -      that.adjustDialog()
        -
        -      if (transition) {
        -        that.$element[0].offsetWidth // force reflow
        -      }
        -
        -      that.$element.addClass('in')
        -
        -      that.enforceFocus()
        -
        -      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
        -
        -      transition ?
        -        that.$dialog // wait for modal to slide in
        -          .one('bsTransitionEnd', function () {
        -            that.$element.trigger('focus').trigger(e)
        -          })
        -          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        -        that.$element.trigger('focus').trigger(e)
        -    })
        -  }
        -
        -  Modal.prototype.hide = function (e) {
        -    if (e) e.preventDefault()
        -
        -    e = $.Event('hide.bs.modal')
        -
        -    this.$element.trigger(e)
        -
        -    if (!this.isShown || e.isDefaultPrevented()) return
        -
        -    this.isShown = false
        -
        -    this.escape()
        -    this.resize()
        -
        -    $(document).off('focusin.bs.modal')
        -
        -    this.$element
        -      .removeClass('in')
        -      .off('click.dismiss.bs.modal')
        -      .off('mouseup.dismiss.bs.modal')
        -
        -    this.$dialog.off('mousedown.dismiss.bs.modal')
        -
        -    $.support.transition && this.$element.hasClass('fade') ?
        -      this.$element
        -        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        -        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        -      this.hideModal()
        -  }
        -
        -  Modal.prototype.enforceFocus = function () {
        -    $(document)
        -      .off('focusin.bs.modal') // guard against infinite focus loop
        -      .on('focusin.bs.modal', $.proxy(function (e) {
        -        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
        -          this.$element.trigger('focus')
        -        }
        -      }, this))
        -  }
        -
        -  Modal.prototype.escape = function () {
        -    if (this.isShown && this.options.keyboard) {
        -      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
        -        e.which == 27 && this.hide()
        -      }, this))
        -    } else if (!this.isShown) {
        -      this.$element.off('keydown.dismiss.bs.modal')
        -    }
        -  }
        -
        -  Modal.prototype.resize = function () {
        -    if (this.isShown) {
        -      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
        -    } else {
        -      $(window).off('resize.bs.modal')
        -    }
        -  }
        -
        -  Modal.prototype.hideModal = function () {
        -    var that = this
        -    this.$element.hide()
        -    this.backdrop(function () {
        -      that.$body.removeClass('modal-open')
        -      that.resetAdjustments()
        -      that.resetScrollbar()
        -      that.$element.trigger('hidden.bs.modal')
        -    })
        -  }
        -
        -  Modal.prototype.removeBackdrop = function () {
        -    this.$backdrop && this.$backdrop.remove()
        -    this.$backdrop = null
        -  }
        -
        -  Modal.prototype.backdrop = function (callback) {
        -    var that = this
        -    var animate = this.$element.hasClass('fade') ? 'fade' : ''
        -
        -    if (this.isShown && this.options.backdrop) {
        -      var doAnimate = $.support.transition && animate
        -
        -      this.$backdrop = $(document.createElement('div'))
        -        .addClass('modal-backdrop ' + animate)
        -        .appendTo(this.$body)
        -
        -      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        -        if (this.ignoreBackdropClick) {
        -          this.ignoreBackdropClick = false
        -          return
        -        }
        -        if (e.target !== e.currentTarget) return
        -        this.options.backdrop == 'static'
        -          ? this.$element[0].focus()
        -          : this.hide()
        -      }, this))
        -
        -      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
        -
        -      this.$backdrop.addClass('in')
        -
        -      if (!callback) return
        -
        -      doAnimate ?
        -        this.$backdrop
        -          .one('bsTransitionEnd', callback)
        -          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        -        callback()
        -
        -    } else if (!this.isShown && this.$backdrop) {
        -      this.$backdrop.removeClass('in')
        -
        -      var callbackRemove = function () {
        -        that.removeBackdrop()
        -        callback && callback()
        -      }
        -      $.support.transition && this.$element.hasClass('fade') ?
        -        this.$backdrop
        -          .one('bsTransitionEnd', callbackRemove)
        -          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        -        callbackRemove()
        -
        -    } else if (callback) {
        -      callback()
        -    }
        -  }
        -
        -  // these following methods are used to handle overflowing modals
        -
        -  Modal.prototype.handleUpdate = function () {
        -    this.adjustDialog()
        -  }
        -
        -  Modal.prototype.adjustDialog = function () {
        -    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
        -
        -    this.$element.css({
        -      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
        -      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
        -    })
        -  }
        -
        -  Modal.prototype.resetAdjustments = function () {
        -    this.$element.css({
        -      paddingLeft: '',
        -      paddingRight: ''
        -    })
        -  }
        -
        -  Modal.prototype.checkScrollbar = function () {
        -    var fullWindowWidth = window.innerWidth
        -    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
        -      var documentElementRect = document.documentElement.getBoundingClientRect()
        -      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
        -    }
        -    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
        -    this.scrollbarWidth = this.measureScrollbar()
        -  }
        -
        -  Modal.prototype.setScrollbar = function () {
        -    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
        -    this.originalBodyPad = document.body.style.paddingRight || ''
        -    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
        -  }
        -
        -  Modal.prototype.resetScrollbar = function () {
        -    this.$body.css('padding-right', this.originalBodyPad)
        -  }
        -
        -  Modal.prototype.measureScrollbar = function () { // thx walsh
        -    var scrollDiv = document.createElement('div')
        -    scrollDiv.className = 'modal-scrollbar-measure'
        -    this.$body.append(scrollDiv)
        -    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
        -    this.$body[0].removeChild(scrollDiv)
        -    return scrollbarWidth
        -  }
        -
        -
        -  // MODAL PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option, _relatedTarget) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.modal')
        -      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -
        -      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
        -      if (typeof option == 'string') data[option](_relatedTarget)
        -      else if (options.show) data.show(_relatedTarget)
        -    })
        -  }
        -
        -  var old = $.fn.modal
        -
        -  $.fn.modal             = Plugin
        -  $.fn.modal.Constructor = Modal
        -
        -
        -  // MODAL NO CONFLICT
        -  // =================
        -
        -  $.fn.modal.noConflict = function () {
        -    $.fn.modal = old
        -    return this
        -  }
        -
        -
        -  // MODAL DATA-API
        -  // ==============
        -
        -  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
        -    var $this   = $(this)
        -    var href    = $this.attr('href')
        -    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
        -    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
        -
        -    if ($this.is('a')) e.preventDefault()
        -
        -    $target.one('show.bs.modal', function (showEvent) {
        -      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
        -      $target.one('hidden.bs.modal', function () {
        -        $this.is(':visible') && $this.trigger('focus')
        -      })
        -    })
        -    Plugin.call($target, option, this)
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: tooltip.js v3.3.6
        - * http://getbootstrap.com/javascript/#tooltip
        - * Inspired by the original jQuery.tipsy by Jason Frame
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // TOOLTIP PUBLIC CLASS DEFINITION
        -  // ===============================
        -
        -  var Tooltip = function (element, options) {
        -    this.type       = null
        -    this.options    = null
        -    this.enabled    = null
        -    this.timeout    = null
        -    this.hoverState = null
        -    this.$element   = null
        -    this.inState    = null
        -
        -    this.init('tooltip', element, options)
        -  }
        -
        -  Tooltip.VERSION  = '3.3.6'
        -
        -  Tooltip.TRANSITION_DURATION = 150
        -
        -  Tooltip.DEFAULTS = {
        -    animation: true,
        -    placement: 'top',
        -    selector: false,
        -    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
        -    trigger: 'hover focus',
        -    title: '',
        -    delay: 0,
        -    html: false,
        -    container: false,
        -    viewport: {
        -      selector: 'body',
        -      padding: 0
        -    }
        -  }
        -
        -  Tooltip.prototype.init = function (type, element, options) {
        -    this.enabled   = true
        -    this.type      = type
        -    this.$element  = $(element)
        -    this.options   = this.getOptions(options)
        -    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
        -    this.inState   = { click: false, hover: false, focus: false }
        -
        -    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
        -      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
        -    }
        -
        -    var triggers = this.options.trigger.split(' ')
        -
        -    for (var i = triggers.length; i--;) {
        -      var trigger = triggers[i]
        -
        -      if (trigger == 'click') {
        -        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
        -      } else if (trigger != 'manual') {
        -        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        -        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
        -
        -        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        -        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
        -      }
        -    }
        -
        -    this.options.selector ?
        -      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
        -      this.fixTitle()
        -  }
        -
        -  Tooltip.prototype.getDefaults = function () {
        -    return Tooltip.DEFAULTS
        -  }
        -
        -  Tooltip.prototype.getOptions = function (options) {
        -    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
        -
        -    if (options.delay && typeof options.delay == 'number') {
        -      options.delay = {
        -        show: options.delay,
        -        hide: options.delay
        -      }
        -    }
        -
        -    return options
        -  }
        -
        -  Tooltip.prototype.getDelegateOptions = function () {
        -    var options  = {}
        -    var defaults = this.getDefaults()
        -
        -    this._options && $.each(this._options, function (key, value) {
        -      if (defaults[key] != value) options[key] = value
        -    })
        -
        -    return options
        -  }
        -
        -  Tooltip.prototype.enter = function (obj) {
        -    var self = obj instanceof this.constructor ?
        -      obj : $(obj.currentTarget).data('bs.' + this.type)
        -
        -    if (!self) {
        -      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        -      $(obj.currentTarget).data('bs.' + this.type, self)
        -    }
        -
        -    if (obj instanceof $.Event) {
        -      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
        -    }
        -
        -    if (self.tip().hasClass('in') || self.hoverState == 'in') {
        -      self.hoverState = 'in'
        -      return
        -    }
        -
        -    clearTimeout(self.timeout)
        -
        -    self.hoverState = 'in'
        -
        -    if (!self.options.delay || !self.options.delay.show) return self.show()
        -
        -    self.timeout = setTimeout(function () {
        -      if (self.hoverState == 'in') self.show()
        -    }, self.options.delay.show)
        -  }
        -
        -  Tooltip.prototype.isInStateTrue = function () {
        -    for (var key in this.inState) {
        -      if (this.inState[key]) return true
        -    }
        -
        -    return false
        -  }
        -
        -  Tooltip.prototype.leave = function (obj) {
        -    var self = obj instanceof this.constructor ?
        -      obj : $(obj.currentTarget).data('bs.' + this.type)
        -
        -    if (!self) {
        -      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        -      $(obj.currentTarget).data('bs.' + this.type, self)
        -    }
        -
        -    if (obj instanceof $.Event) {
        -      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
        -    }
        -
        -    if (self.isInStateTrue()) return
        -
        -    clearTimeout(self.timeout)
        -
        -    self.hoverState = 'out'
        -
        -    if (!self.options.delay || !self.options.delay.hide) return self.hide()
        -
        -    self.timeout = setTimeout(function () {
        -      if (self.hoverState == 'out') self.hide()
        -    }, self.options.delay.hide)
        -  }
        -
        -  Tooltip.prototype.show = function () {
        -    var e = $.Event('show.bs.' + this.type)
        -
        -    if (this.hasContent() && this.enabled) {
        -      this.$element.trigger(e)
        -
        -      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
        -      if (e.isDefaultPrevented() || !inDom) return
        -      var that = this
        -
        -      var $tip = this.tip()
        -
        -      var tipId = this.getUID(this.type)
        -
        -      this.setContent()
        -      $tip.attr('id', tipId)
        -      this.$element.attr('aria-describedby', tipId)
        -
        -      if (this.options.animation) $tip.addClass('fade')
        -
        -      var placement = typeof this.options.placement == 'function' ?
        -        this.options.placement.call(this, $tip[0], this.$element[0]) :
        -        this.options.placement
        -
        -      var autoToken = /\s?auto?\s?/i
        -      var autoPlace = autoToken.test(placement)
        -      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
        -
        -      $tip
        -        .detach()
        -        .css({ top: 0, left: 0, display: 'block' })
        -        .addClass(placement)
        -        .data('bs.' + this.type, this)
        -
        -      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
        -      this.$element.trigger('inserted.bs.' + this.type)
        -
        -      var pos          = this.getPosition()
        -      var actualWidth  = $tip[0].offsetWidth
        -      var actualHeight = $tip[0].offsetHeight
        -
        -      if (autoPlace) {
        -        var orgPlacement = placement
        -        var viewportDim = this.getPosition(this.$viewport)
        -
        -        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
        -                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
        -                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
        -                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
        -                    placement
        -
        -        $tip
        -          .removeClass(orgPlacement)
        -          .addClass(placement)
        -      }
        -
        -      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
        -
        -      this.applyPlacement(calculatedOffset, placement)
        -
        -      var complete = function () {
        -        var prevHoverState = that.hoverState
        -        that.$element.trigger('shown.bs.' + that.type)
        -        that.hoverState = null
        -
        -        if (prevHoverState == 'out') that.leave(that)
        -      }
        -
        -      $.support.transition && this.$tip.hasClass('fade') ?
        -        $tip
        -          .one('bsTransitionEnd', complete)
        -          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        -        complete()
        -    }
        -  }
        -
        -  Tooltip.prototype.applyPlacement = function (offset, placement) {
        -    var $tip   = this.tip()
        -    var width  = $tip[0].offsetWidth
        -    var height = $tip[0].offsetHeight
        -
        -    // manually read margins because getBoundingClientRect includes difference
        -    var marginTop = parseInt($tip.css('margin-top'), 10)
        -    var marginLeft = parseInt($tip.css('margin-left'), 10)
        -
        -    // we must check for NaN for ie 8/9
        -    if (isNaN(marginTop))  marginTop  = 0
        -    if (isNaN(marginLeft)) marginLeft = 0
        -
        -    offset.top  += marginTop
        -    offset.left += marginLeft
        -
        -    // $.fn.offset doesn't round pixel values
        -    // so we use setOffset directly with our own function B-0
        -    $.offset.setOffset($tip[0], $.extend({
        -      using: function (props) {
        -        $tip.css({
        -          top: Math.round(props.top),
        -          left: Math.round(props.left)
        -        })
        -      }
        -    }, offset), 0)
        -
        -    $tip.addClass('in')
        -
        -    // check to see if placing tip in new offset caused the tip to resize itself
        -    var actualWidth  = $tip[0].offsetWidth
        -    var actualHeight = $tip[0].offsetHeight
        -
        -    if (placement == 'top' && actualHeight != height) {
        -      offset.top = offset.top + height - actualHeight
        -    }
        -
        -    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
        -
        -    if (delta.left) offset.left += delta.left
        -    else offset.top += delta.top
        -
        -    var isVertical          = /top|bottom/.test(placement)
        -    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
        -    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
        -
        -    $tip.offset(offset)
        -    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
        -  }
        -
        -  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
        -    this.arrow()
        -      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
        -      .css(isVertical ? 'top' : 'left', '')
        -  }
        -
        -  Tooltip.prototype.setContent = function () {
        -    var $tip  = this.tip()
        -    var title = this.getTitle()
        -
        -    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
        -    $tip.removeClass('fade in top bottom left right')
        -  }
        -
        -  Tooltip.prototype.hide = function (callback) {
        -    var that = this
        -    var $tip = $(this.$tip)
        -    var e    = $.Event('hide.bs.' + this.type)
        -
        -    function complete() {
        -      if (that.hoverState != 'in') $tip.detach()
        -      that.$element
        -        .removeAttr('aria-describedby')
        -        .trigger('hidden.bs.' + that.type)
        -      callback && callback()
        -    }
        -
        -    this.$element.trigger(e)
        -
        -    if (e.isDefaultPrevented()) return
        -
        -    $tip.removeClass('in')
        -
        -    $.support.transition && $tip.hasClass('fade') ?
        -      $tip
        -        .one('bsTransitionEnd', complete)
        -        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        -      complete()
        -
        -    this.hoverState = null
        -
        -    return this
        -  }
        -
        -  Tooltip.prototype.fixTitle = function () {
        -    var $e = this.$element
        -    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
        -      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
        -    }
        -  }
        -
        -  Tooltip.prototype.hasContent = function () {
        -    return this.getTitle()
        -  }
        -
        -  Tooltip.prototype.getPosition = function ($element) {
        -    $element   = $element || this.$element
        -
        -    var el     = $element[0]
        -    var isBody = el.tagName == 'BODY'
        -
        -    var elRect    = el.getBoundingClientRect()
        -    if (elRect.width == null) {
        -      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
        -      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
        -    }
        -    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
        -    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
        -    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
        -
        -    return $.extend({}, elRect, scroll, outerDims, elOffset)
        -  }
        -
        -  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
        -    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
        -           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
        -           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        -        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
        -
        -  }
        -
        -  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
        -    var delta = { top: 0, left: 0 }
        -    if (!this.$viewport) return delta
        -
        -    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
        -    var viewportDimensions = this.getPosition(this.$viewport)
        -
        -    if (/right|left/.test(placement)) {
        -      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
        -      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
        -      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        -        delta.top = viewportDimensions.top - topEdgeOffset
        -      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        -        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
        -      }
        -    } else {
        -      var leftEdgeOffset  = pos.left - viewportPadding
        -      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
        -      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        -        delta.left = viewportDimensions.left - leftEdgeOffset
        -      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
        -        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
        -      }
        -    }
        -
        -    return delta
        -  }
        -
        -  Tooltip.prototype.getTitle = function () {
        -    var title
        -    var $e = this.$element
        -    var o  = this.options
        -
        -    title = $e.attr('data-original-title')
        -      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
        -
        -    return title
        -  }
        -
        -  Tooltip.prototype.getUID = function (prefix) {
        -    do prefix += ~~(Math.random() * 1000000)
        -    while (document.getElementById(prefix))
        -    return prefix
        -  }
        -
        -  Tooltip.prototype.tip = function () {
        -    if (!this.$tip) {
        -      this.$tip = $(this.options.template)
        -      if (this.$tip.length != 1) {
        -        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
        -      }
        -    }
        -    return this.$tip
        -  }
        -
        -  Tooltip.prototype.arrow = function () {
        -    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
        -  }
        -
        -  Tooltip.prototype.enable = function () {
        -    this.enabled = true
        -  }
        -
        -  Tooltip.prototype.disable = function () {
        -    this.enabled = false
        -  }
        -
        -  Tooltip.prototype.toggleEnabled = function () {
        -    this.enabled = !this.enabled
        -  }
        -
        -  Tooltip.prototype.toggle = function (e) {
        -    var self = this
        -    if (e) {
        -      self = $(e.currentTarget).data('bs.' + this.type)
        -      if (!self) {
        -        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        -        $(e.currentTarget).data('bs.' + this.type, self)
        -      }
        -    }
        -
        -    if (e) {
        -      self.inState.click = !self.inState.click
        -      if (self.isInStateTrue()) self.enter(self)
        -      else self.leave(self)
        -    } else {
        -      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
        -    }
        -  }
        -
        -  Tooltip.prototype.destroy = function () {
        -    var that = this
        -    clearTimeout(this.timeout)
        -    this.hide(function () {
        -      that.$element.off('.' + that.type).removeData('bs.' + that.type)
        -      if (that.$tip) {
        -        that.$tip.detach()
        -      }
        -      that.$tip = null
        -      that.$arrow = null
        -      that.$viewport = null
        -    })
        -  }
        -
        -
        -  // TOOLTIP PLUGIN DEFINITION
        -  // =========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.tooltip')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data && /destroy|hide/.test(option)) return
        -      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.tooltip
        -
        -  $.fn.tooltip             = Plugin
        -  $.fn.tooltip.Constructor = Tooltip
        -
        -
        -  // TOOLTIP NO CONFLICT
        -  // ===================
        -
        -  $.fn.tooltip.noConflict = function () {
        -    $.fn.tooltip = old
        -    return this
        -  }
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: popover.js v3.3.6
        - * http://getbootstrap.com/javascript/#popovers
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // POPOVER PUBLIC CLASS DEFINITION
        -  // ===============================
        -
        -  var Popover = function (element, options) {
        -    this.init('popover', element, options)
        -  }
        -
        -  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
        -
        -  Popover.VERSION  = '3.3.6'
        -
        -  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
        -    placement: 'right',
        -    trigger: 'click',
        -    content: '',
        -    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
        -  })
        -
        -
        -  // NOTE: POPOVER EXTENDS tooltip.js
        -  // ================================
        -
        -  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
        -
        -  Popover.prototype.constructor = Popover
        -
        -  Popover.prototype.getDefaults = function () {
        -    return Popover.DEFAULTS
        -  }
        -
        -  Popover.prototype.setContent = function () {
        -    var $tip    = this.tip()
        -    var title   = this.getTitle()
        -    var content = this.getContent()
        -
        -    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
        -    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
        -      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
        -    ](content)
        -
        -    $tip.removeClass('fade top bottom left right in')
        -
        -    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
        -    // this manually by checking the contents.
        -    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
        -  }
        -
        -  Popover.prototype.hasContent = function () {
        -    return this.getTitle() || this.getContent()
        -  }
        -
        -  Popover.prototype.getContent = function () {
        -    var $e = this.$element
        -    var o  = this.options
        -
        -    return $e.attr('data-content')
        -      || (typeof o.content == 'function' ?
        -            o.content.call($e[0]) :
        -            o.content)
        -  }
        -
        -  Popover.prototype.arrow = function () {
        -    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
        -  }
        -
        -
        -  // POPOVER PLUGIN DEFINITION
        -  // =========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.popover')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data && /destroy|hide/.test(option)) return
        -      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.popover
        -
        -  $.fn.popover             = Plugin
        -  $.fn.popover.Constructor = Popover
        -
        -
        -  // POPOVER NO CONFLICT
        -  // ===================
        -
        -  $.fn.popover.noConflict = function () {
        -    $.fn.popover = old
        -    return this
        -  }
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: scrollspy.js v3.3.6
        - * http://getbootstrap.com/javascript/#scrollspy
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // SCROLLSPY CLASS DEFINITION
        -  // ==========================
        -
        -  function ScrollSpy(element, options) {
        -    this.$body          = $(document.body)
        -    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
        -    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
        -    this.selector       = (this.options.target || '') + ' .nav li > a'
        -    this.offsets        = []
        -    this.targets        = []
        -    this.activeTarget   = null
        -    this.scrollHeight   = 0
        -
        -    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
        -    this.refresh()
        -    this.process()
        -  }
        -
        -  ScrollSpy.VERSION  = '3.3.6'
        -
        -  ScrollSpy.DEFAULTS = {
        -    offset: 10
        -  }
        -
        -  ScrollSpy.prototype.getScrollHeight = function () {
        -    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
        -  }
        -
        -  ScrollSpy.prototype.refresh = function () {
        -    var that          = this
        -    var offsetMethod  = 'offset'
        -    var offsetBase    = 0
        -
        -    this.offsets      = []
        -    this.targets      = []
        -    this.scrollHeight = this.getScrollHeight()
        -
        -    if (!$.isWindow(this.$scrollElement[0])) {
        -      offsetMethod = 'position'
        -      offsetBase   = this.$scrollElement.scrollTop()
        -    }
        -
        -    this.$body
        -      .find(this.selector)
        -      .map(function () {
        -        var $el   = $(this)
        -        var href  = $el.data('target') || $el.attr('href')
        -        var $href = /^#./.test(href) && $(href)
        -
        -        return ($href
        -          && $href.length
        -          && $href.is(':visible')
        -          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
        -      })
        -      .sort(function (a, b) { return a[0] - b[0] })
        -      .each(function () {
        -        that.offsets.push(this[0])
        -        that.targets.push(this[1])
        -      })
        -  }
        -
        -  ScrollSpy.prototype.process = function () {
        -    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
        -    var scrollHeight = this.getScrollHeight()
        -    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
        -    var offsets      = this.offsets
        -    var targets      = this.targets
        -    var activeTarget = this.activeTarget
        -    var i
        -
        -    if (this.scrollHeight != scrollHeight) {
        -      this.refresh()
        -    }
        -
        -    if (scrollTop >= maxScroll) {
        -      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
        -    }
        -
        -    if (activeTarget && scrollTop < offsets[0]) {
        -      this.activeTarget = null
        -      return this.clear()
        -    }
        -
        -    for (i = offsets.length; i--;) {
        -      activeTarget != targets[i]
        -        && scrollTop >= offsets[i]
        -        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
        -        && this.activate(targets[i])
        -    }
        -  }
        -
        -  ScrollSpy.prototype.activate = function (target) {
        -    this.activeTarget = target
        -
        -    this.clear()
        -
        -    var selector = this.selector +
        -      '[data-target="' + target + '"],' +
        -      this.selector + '[href="' + target + '"]'
        -
        -    var active = $(selector)
        -      .parents('li')
        -      .addClass('active')
        -
        -    if (active.parent('.dropdown-menu').length) {
        -      active = active
        -        .closest('li.dropdown')
        -        .addClass('active')
        -    }
        -
        -    active.trigger('activate.bs.scrollspy')
        -  }
        -
        -  ScrollSpy.prototype.clear = function () {
        -    $(this.selector)
        -      .parentsUntil(this.options.target, '.active')
        -      .removeClass('active')
        -  }
        -
        -
        -  // SCROLLSPY PLUGIN DEFINITION
        -  // ===========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.scrollspy')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.scrollspy
        -
        -  $.fn.scrollspy             = Plugin
        -  $.fn.scrollspy.Constructor = ScrollSpy
        -
        -
        -  // SCROLLSPY NO CONFLICT
        -  // =====================
        -
        -  $.fn.scrollspy.noConflict = function () {
        -    $.fn.scrollspy = old
        -    return this
        -  }
        -
        -
        -  // SCROLLSPY DATA-API
        -  // ==================
        -
        -  $(window).on('load.bs.scrollspy.data-api', function () {
        -    $('[data-spy="scroll"]').each(function () {
        -      var $spy = $(this)
        -      Plugin.call($spy, $spy.data())
        -    })
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: tab.js v3.3.6
        - * http://getbootstrap.com/javascript/#tabs
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // TAB CLASS DEFINITION
        -  // ====================
        -
        -  var Tab = function (element) {
        -    // jscs:disable requireDollarBeforejQueryAssignment
        -    this.element = $(element)
        -    // jscs:enable requireDollarBeforejQueryAssignment
        -  }
        -
        -  Tab.VERSION = '3.3.6'
        -
        -  Tab.TRANSITION_DURATION = 150
        -
        -  Tab.prototype.show = function () {
        -    var $this    = this.element
        -    var $ul      = $this.closest('ul:not(.dropdown-menu)')
        -    var selector = $this.data('target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    if ($this.parent('li').hasClass('active')) return
        -
        -    var $previous = $ul.find('.active:last a')
        -    var hideEvent = $.Event('hide.bs.tab', {
        -      relatedTarget: $this[0]
        -    })
        -    var showEvent = $.Event('show.bs.tab', {
        -      relatedTarget: $previous[0]
        -    })
        -
        -    $previous.trigger(hideEvent)
        -    $this.trigger(showEvent)
        -
        -    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
        -
        -    var $target = $(selector)
        -
        -    this.activate($this.closest('li'), $ul)
        -    this.activate($target, $target.parent(), function () {
        -      $previous.trigger({
        -        type: 'hidden.bs.tab',
        -        relatedTarget: $this[0]
        -      })
        -      $this.trigger({
        -        type: 'shown.bs.tab',
        -        relatedTarget: $previous[0]
        -      })
        -    })
        -  }
        -
        -  Tab.prototype.activate = function (element, container, callback) {
        -    var $active    = container.find('> .active')
        -    var transition = callback
        -      && $.support.transition
        -      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
        -
        -    function next() {
        -      $active
        -        .removeClass('active')
        -        .find('> .dropdown-menu > .active')
        -          .removeClass('active')
        -        .end()
        -        .find('[data-toggle="tab"]')
        -          .attr('aria-expanded', false)
        -
        -      element
        -        .addClass('active')
        -        .find('[data-toggle="tab"]')
        -          .attr('aria-expanded', true)
        -
        -      if (transition) {
        -        element[0].offsetWidth // reflow for transition
        -        element.addClass('in')
        -      } else {
        -        element.removeClass('fade')
        -      }
        -
        -      if (element.parent('.dropdown-menu').length) {
        -        element
        -          .closest('li.dropdown')
        -            .addClass('active')
        -          .end()
        -          .find('[data-toggle="tab"]')
        -            .attr('aria-expanded', true)
        -      }
        -
        -      callback && callback()
        -    }
        -
        -    $active.length && transition ?
        -      $active
        -        .one('bsTransitionEnd', next)
        -        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
        -      next()
        -
        -    $active.removeClass('in')
        -  }
        -
        -
        -  // TAB PLUGIN DEFINITION
        -  // =====================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.tab')
        -
        -      if (!data) $this.data('bs.tab', (data = new Tab(this)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.tab
        -
        -  $.fn.tab             = Plugin
        -  $.fn.tab.Constructor = Tab
        -
        -
        -  // TAB NO CONFLICT
        -  // ===============
        -
        -  $.fn.tab.noConflict = function () {
        -    $.fn.tab = old
        -    return this
        -  }
        -
        -
        -  // TAB DATA-API
        -  // ============
        -
        -  var clickHandler = function (e) {
        -    e.preventDefault()
        -    Plugin.call($(this), 'show')
        -  }
        -
        -  $(document)
        -    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
        -    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: affix.js v3.3.6
        - * http://getbootstrap.com/javascript/#affix
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // AFFIX CLASS DEFINITION
        -  // ======================
        -
        -  var Affix = function (element, options) {
        -    this.options = $.extend({}, Affix.DEFAULTS, options)
        -
        -    this.$target = $(this.options.target)
        -      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
        -      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
        -
        -    this.$element     = $(element)
        -    this.affixed      = null
        -    this.unpin        = null
        -    this.pinnedOffset = null
        -
        -    this.checkPosition()
        -  }
        -
        -  Affix.VERSION  = '3.3.6'
        -
        -  Affix.RESET    = 'affix affix-top affix-bottom'
        -
        -  Affix.DEFAULTS = {
        -    offset: 0,
        -    target: window
        -  }
        -
        -  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
        -    var scrollTop    = this.$target.scrollTop()
        -    var position     = this.$element.offset()
        -    var targetHeight = this.$target.height()
        -
        -    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
        -
        -    if (this.affixed == 'bottom') {
        -      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
        -      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
        -    }
        -
        -    var initializing   = this.affixed == null
        -    var colliderTop    = initializing ? scrollTop : position.top
        -    var colliderHeight = initializing ? targetHeight : height
        -
        -    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
        -    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
        -
        -    return false
        -  }
        -
        -  Affix.prototype.getPinnedOffset = function () {
        -    if (this.pinnedOffset) return this.pinnedOffset
        -    this.$element.removeClass(Affix.RESET).addClass('affix')
        -    var scrollTop = this.$target.scrollTop()
        -    var position  = this.$element.offset()
        -    return (this.pinnedOffset = position.top - scrollTop)
        -  }
        -
        -  Affix.prototype.checkPositionWithEventLoop = function () {
        -    setTimeout($.proxy(this.checkPosition, this), 1)
        -  }
        -
        -  Affix.prototype.checkPosition = function () {
        -    if (!this.$element.is(':visible')) return
        -
        -    var height       = this.$element.height()
        -    var offset       = this.options.offset
        -    var offsetTop    = offset.top
        -    var offsetBottom = offset.bottom
        -    var scrollHeight = Math.max($(document).height(), $(document.body).height())
        -
        -    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
        -    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
        -    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
        -
        -    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
        -
        -    if (this.affixed != affix) {
        -      if (this.unpin != null) this.$element.css('top', '')
        -
        -      var affixType = 'affix' + (affix ? '-' + affix : '')
        -      var e         = $.Event(affixType + '.bs.affix')
        -
        -      this.$element.trigger(e)
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      this.affixed = affix
        -      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
        -
        -      this.$element
        -        .removeClass(Affix.RESET)
        -        .addClass(affixType)
        -        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
        -    }
        -
        -    if (affix == 'bottom') {
        -      this.$element.offset({
        -        top: scrollHeight - height - offsetBottom
        -      })
        -    }
        -  }
        -
        -
        -  // AFFIX PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.affix')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.affix
        -
        -  $.fn.affix             = Plugin
        -  $.fn.affix.Constructor = Affix
        -
        -
        -  // AFFIX NO CONFLICT
        -  // =================
        -
        -  $.fn.affix.noConflict = function () {
        -    $.fn.affix = old
        -    return this
        -  }
        -
        -
        -  // AFFIX DATA-API
        -  // ==============
        -
        -  $(window).on('load', function () {
        -    $('[data-spy="affix"]').each(function () {
        -      var $spy = $(this)
        -      var data = $spy.data()
        -
        -      data.offset = data.offset || {}
        -
        -      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
        -      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
        -
        -      Plugin.call($spy, data)
        -    })
        -  })
        -
        -}(jQuery);
        -
        -;(function () {
        -	'use strict';
        -
        -	/**
        -	 * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.
        -	 *
        -	 * @codingstandard ftlabs-jsv2
        -	 * @copyright The Financial Times Limited [All Rights Reserved]
        -	 * @license MIT License (see LICENSE.txt)
        -	 */
        -
        -	/*jslint browser:true, node:true*/
        -	/*global define, Event, Node*/
        -
        -
        -	/**
        -	 * Instantiate fast-clicking listeners on the specified layer.
        -	 *
        -	 * @constructor
        -	 * @param {Element} layer The layer to listen on
        -	 * @param {Object} [options={}] The options to override the defaults
        -	 */
        -	function FastClick(layer, options) {
        -		var oldOnClick;
        -
        -		options = options || {};
        -
        -		/**
        -		 * Whether a click is currently being tracked.
        -		 *
        -		 * @type boolean
        -		 */
        -		this.trackingClick = false;
        -
        -
        -		/**
        -		 * Timestamp for when click tracking started.
        -		 *
        -		 * @type number
        -		 */
        -		this.trackingClickStart = 0;
        -
        -
        -		/**
        -		 * The element being tracked for a click.
        -		 *
        -		 * @type EventTarget
        -		 */
        -		this.targetElement = null;
        -
        -
        -		/**
        -		 * X-coordinate of touch start event.
        -		 *
        -		 * @type number
        -		 */
        -		this.touchStartX = 0;
        -
        -
        -		/**
        -		 * Y-coordinate of touch start event.
        -		 *
        -		 * @type number
        -		 */
        -		this.touchStartY = 0;
        -
        -
        -		/**
        -		 * ID of the last touch, retrieved from Touch.identifier.
        -		 *
        -		 * @type number
        -		 */
        -		this.lastTouchIdentifier = 0;
        -
        -
        -		/**
        -		 * Touchmove boundary, beyond which a click will be cancelled.
        -		 *
        -		 * @type number
        -		 */
        -		this.touchBoundary = options.touchBoundary || 10;
        -
        -
        -		/**
        -		 * The FastClick layer.
        -		 *
        -		 * @type Element
        -		 */
        -		this.layer = layer;
        -
        -		/**
        -		 * The minimum time between tap(touchstart and touchend) events
        -		 *
        -		 * @type number
        -		 */
        -		this.tapDelay = options.tapDelay || 200;
        -
        -		/**
        -		 * The maximum time for a tap
        -		 *
        -		 * @type number
        -		 */
        -		this.tapTimeout = options.tapTimeout || 700;
        -
        -		if (FastClick.notNeeded(layer)) {
        -			return;
        -		}
        -
        -		// Some old versions of Android don't have Function.prototype.bind
        -		function bind(method, context) {
        -			return function() { return method.apply(context, arguments); };
        -		}
        -
        -
        -		var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];
        -		var context = this;
        -		for (var i = 0, l = methods.length; i < l; i++) {
        -			context[methods[i]] = bind(context[methods[i]], context);
        -		}
        -
        -		// Set up event handlers as required
        -		if (deviceIsAndroid) {
        -			layer.addEventListener('mouseover', this.onMouse, true);
        -			layer.addEventListener('mousedown', this.onMouse, true);
        -			layer.addEventListener('mouseup', this.onMouse, true);
        -		}
        -
        -		layer.addEventListener('click', this.onClick, true);
        -		layer.addEventListener('touchstart', this.onTouchStart, false);
        -		layer.addEventListener('touchmove', this.onTouchMove, false);
        -		layer.addEventListener('touchend', this.onTouchEnd, false);
        -		layer.addEventListener('touchcancel', this.onTouchCancel, false);
        -
        -		// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
        -		// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick
        -		// layer when they are cancelled.
        -		if (!Event.prototype.stopImmediatePropagation) {
        -			layer.removeEventListener = function(type, callback, capture) {
        -				var rmv = Node.prototype.removeEventListener;
        -				if (type === 'click') {
        -					rmv.call(layer, type, callback.hijacked || callback, capture);
        -				} else {
        -					rmv.call(layer, type, callback, capture);
        -				}
        -			};
        -
        -			layer.addEventListener = function(type, callback, capture) {
        -				var adv = Node.prototype.addEventListener;
        -				if (type === 'click') {
        -					adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {
        -						if (!event.propagationStopped) {
        -							callback(event);
        -						}
        -					}), capture);
        -				} else {
        -					adv.call(layer, type, callback, capture);
        -				}
        -			};
        -		}
        -
        -		// If a handler is already declared in the element's onclick attribute, it will be fired before
        -		// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and
        -		// adding it as listener.
        -		if (typeof layer.onclick === 'function') {
        -
        -			// Android browser on at least 3.2 requires a new reference to the function in layer.onclick
        -			// - the old one won't work if passed to addEventListener directly.
        -			oldOnClick = layer.onclick;
        -			layer.addEventListener('click', function(event) {
        -				oldOnClick(event);
        -			}, false);
        -			layer.onclick = null;
        -		}
        -	}
        -
        -	/**
        -	* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.
        -	*
        -	* @type boolean
        -	*/
        -	var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0;
        -
        -	/**
        -	 * Android requires exceptions.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;
        -
        -
        -	/**
        -	 * iOS requires exceptions.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;
        -
        -
        -	/**
        -	 * iOS 4 requires an exception for select elements.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);
        -
        -
        -	/**
        -	 * iOS 6.0-7.* requires the target element to be manually derived
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent);
        -
        -	/**
        -	 * BlackBerry requires exceptions.
        -	 *
        -	 * @type boolean
        -	 */
        -	var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;
        -
        -	/**
        -	 * Determine whether a given element requires a native click.
        -	 *
        -	 * @param {EventTarget|Element} target Target DOM element
        -	 * @returns {boolean} Returns true if the element needs a native click
        -	 */
        -	FastClick.prototype.needsClick = function(target) {
        -		switch (target.nodeName.toLowerCase()) {
        -
        -		// Don't send a synthetic click to disabled inputs (issue #62)
        -		case 'button':
        -		case 'select':
        -		case 'textarea':
        -			if (target.disabled) {
        -				return true;
        -			}
        -
        -			break;
        -		case 'input':
        -
        -			// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
        -			if ((deviceIsIOS && target.type === 'file') || target.disabled) {
        -				return true;
        -			}
        -
        -			break;
        -		case 'label':
        -		case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames
        -		case 'video':
        -			return true;
        -		}
        -
        -		return (/\bneedsclick\b/).test(target.className);
        -	};
        -
        -
        -	/**
        -	 * Determine whether a given element requires a call to focus to simulate click into element.
        -	 *
        -	 * @param {EventTarget|Element} target Target DOM element
        -	 * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.
        -	 */
        -	FastClick.prototype.needsFocus = function(target) {
        -		switch (target.nodeName.toLowerCase()) {
        -		case 'textarea':
        -			return true;
        -		case 'select':
        -			return !deviceIsAndroid;
        -		case 'input':
        -			switch (target.type) {
        -			case 'button':
        -			case 'checkbox':
        -			case 'file':
        -			case 'image':
        -			case 'radio':
        -			case 'submit':
        -				return false;
        -			}
        -
        -			// No point in attempting to focus disabled inputs
        -			return !target.disabled && !target.readOnly;
        -		default:
        -			return (/\bneedsfocus\b/).test(target.className);
        -		}
        -	};
        -
        -
        -	/**
        -	 * Send a click event to the specified element.
        -	 *
        -	 * @param {EventTarget|Element} targetElement
        -	 * @param {Event} event
        -	 */
        -	FastClick.prototype.sendClick = function(targetElement, event) {
        -		var clickEvent, touch;
        -
        -		// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)
        -		if (document.activeElement && document.activeElement !== targetElement) {
        -			document.activeElement.blur();
        -		}
        -
        -		touch = event.changedTouches[0];
        -
        -		// Synthesise a click event, with an extra attribute so it can be tracked
        -		clickEvent = document.createEvent('MouseEvents');
        -		clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
        -		clickEvent.forwardedTouchEvent = true;
        -		targetElement.dispatchEvent(clickEvent);
        -	};
        -
        -	FastClick.prototype.determineEventType = function(targetElement) {
        -
        -		//Issue #159: Android Chrome Select Box does not open with a synthetic click event
        -		if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {
        -			return 'mousedown';
        -		}
        -
        -		return 'click';
        -	};
        -
        -
        -	/**
        -	 * @param {EventTarget|Element} targetElement
        -	 */
        -	FastClick.prototype.focus = function(targetElement) {
        -		var length;
        -
        -		// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.
        -		if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {
        -			length = targetElement.value.length;
        -			targetElement.setSelectionRange(length, length);
        -		} else {
        -			targetElement.focus();
        -		}
        -	};
        -
        -
        -	/**
        -	 * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.
        -	 *
        -	 * @param {EventTarget|Element} targetElement
        -	 */
        -	FastClick.prototype.updateScrollParent = function(targetElement) {
        -		var scrollParent, parentElement;
        -
        -		scrollParent = targetElement.fastClickScrollParent;
        -
        -		// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the
        -		// target element was moved to another parent.
        -		if (!scrollParent || !scrollParent.contains(targetElement)) {
        -			parentElement = targetElement;
        -			do {
        -				if (parentElement.scrollHeight > parentElement.offsetHeight) {
        -					scrollParent = parentElement;
        -					targetElement.fastClickScrollParent = parentElement;
        -					break;
        -				}
        -
        -				parentElement = parentElement.parentElement;
        -			} while (parentElement);
        -		}
        -
        -		// Always update the scroll top tracker if possible.
        -		if (scrollParent) {
        -			scrollParent.fastClickLastScrollTop = scrollParent.scrollTop;
        -		}
        -	};
        -
        -
        -	/**
        -	 * @param {EventTarget} targetElement
        -	 * @returns {Element|EventTarget}
        -	 */
        -	FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {
        -
        -		// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.
        -		if (eventTarget.nodeType === Node.TEXT_NODE) {
        -			return eventTarget.parentNode;
        -		}
        -
        -		return eventTarget;
        -	};
        -
        -
        -	/**
        -	 * On touch start, record the position and scroll offset.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onTouchStart = function(event) {
        -		var targetElement, touch, selection;
        -
        -		// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).
        -		if (event.targetTouches.length > 1) {
        -			return true;
        -		}
        -
        -		targetElement = this.getTargetElementFromEventTarget(event.target);
        -		touch = event.targetTouches[0];
        -
        -		if (deviceIsIOS) {
        -
        -			// Only trusted events will deselect text on iOS (issue #49)
        -			selection = window.getSelection();
        -			if (selection.rangeCount && !selection.isCollapsed) {
        -				return true;
        -			}
        -
        -			if (!deviceIsIOS4) {
        -
        -				// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):
        -				// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched
        -				// with the same identifier as the touch event that previously triggered the click that triggered the alert.
        -				// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an
        -				// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.
        -				// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,
        -				// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,
        -				// random integers, it's safe to to continue if the identifier is 0 here.
        -				if (touch.identifier && touch.identifier === this.lastTouchIdentifier) {
        -					event.preventDefault();
        -					return false;
        -				}
        -
        -				this.lastTouchIdentifier = touch.identifier;
        -
        -				// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:
        -				// 1) the user does a fling scroll on the scrollable layer
        -				// 2) the user stops the fling scroll with another tap
        -				// then the event.target of the last 'touchend' event will be the element that was under the user's finger
        -				// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check
        -				// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).
        -				this.updateScrollParent(targetElement);
        -			}
        -		}
        -
        -		this.trackingClick = true;
        -		this.trackingClickStart = event.timeStamp;
        -		this.targetElement = targetElement;
        -
        -		this.touchStartX = touch.pageX;
        -		this.touchStartY = touch.pageY;
        -
        -		// Prevent phantom clicks on fast double-tap (issue #36)
        -		if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
        -			event.preventDefault();
        -		}
        -
        -		return true;
        -	};
        -
        -
        -	/**
        -	 * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.touchHasMoved = function(event) {
        -		var touch = event.changedTouches[0], boundary = this.touchBoundary;
        -
        -		if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {
        -			return true;
        -		}
        -
        -		return false;
        -	};
        -
        -
        -	/**
        -	 * Update the last position.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onTouchMove = function(event) {
        -		if (!this.trackingClick) {
        -			return true;
        -		}
        -
        -		// If the touch has moved, cancel the click tracking
        -		if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {
        -			this.trackingClick = false;
        -			this.targetElement = null;
        -		}
        -
        -		return true;
        -	};
        -
        -
        -	/**
        -	 * Attempt to find the labelled control for the given label element.
        -	 *
        -	 * @param {EventTarget|HTMLLabelElement} labelElement
        -	 * @returns {Element|null}
        -	 */
        -	FastClick.prototype.findControl = function(labelElement) {
        -
        -		// Fast path for newer browsers supporting the HTML5 control attribute
        -		if (labelElement.control !== undefined) {
        -			return labelElement.control;
        -		}
        -
        -		// All browsers under test that support touch events also support the HTML5 htmlFor attribute
        -		if (labelElement.htmlFor) {
        -			return document.getElementById(labelElement.htmlFor);
        -		}
        -
        -		// If no for attribute exists, attempt to retrieve the first labellable descendant element
        -		// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label
        -		return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');
        -	};
        -
        -
        -	/**
        -	 * On touch end, determine whether to send a click event at once.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onTouchEnd = function(event) {
        -		var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;
        -
        -		if (!this.trackingClick) {
        -			return true;
        -		}
        -
        -		// Prevent phantom clicks on fast double-tap (issue #36)
        -		if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
        -			this.cancelNextClick = true;
        -			return true;
        -		}
        -
        -		if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {
        -			return true;
        -		}
        -
        -		// Reset to prevent wrong click cancel on input (issue #156).
        -		this.cancelNextClick = false;
        -
        -		this.lastClickTime = event.timeStamp;
        -
        -		trackingClickStart = this.trackingClickStart;
        -		this.trackingClick = false;
        -		this.trackingClickStart = 0;
        -
        -		// On some iOS devices, the targetElement supplied with the event is invalid if the layer
        -		// is performing a transition or scroll, and has to be re-detected manually. Note that
        -		// for this to function correctly, it must be called *after* the event target is checked!
        -		// See issue #57; also filed as rdar://13048589 .
        -		if (deviceIsIOSWithBadTarget) {
        -			touch = event.changedTouches[0];
        -
        -			// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null
        -			targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;
        -			targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;
        -		}
        -
        -		targetTagName = targetElement.tagName.toLowerCase();
        -		if (targetTagName === 'label') {
        -			forElement = this.findControl(targetElement);
        -			if (forElement) {
        -				this.focus(targetElement);
        -				if (deviceIsAndroid) {
        -					return false;
        -				}
        -
        -				targetElement = forElement;
        -			}
        -		} else if (this.needsFocus(targetElement)) {
        -
        -			// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.
        -			// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).
        -			if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
        -				this.targetElement = null;
        -				return false;
        -			}
        -
        -			this.focus(targetElement);
        -			this.sendClick(targetElement, event);
        -
        -			// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.
        -			// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)
        -			if (!deviceIsIOS || targetTagName !== 'select') {
        -				this.targetElement = null;
        -				event.preventDefault();
        -			}
        -
        -			return false;
        -		}
        -
        -		if (deviceIsIOS && !deviceIsIOS4) {
        -
        -			// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled
        -			// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).
        -			scrollParent = targetElement.fastClickScrollParent;
        -			if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {
        -				return true;
        -			}
        -		}
        -
        -		// Prevent the actual click from going though - unless the target node is marked as requiring
        -		// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.
        -		if (!this.needsClick(targetElement)) {
        -			event.preventDefault();
        -			this.sendClick(targetElement, event);
        -		}
        -
        -		return false;
        -	};
        -
        -
        -	/**
        -	 * On touch cancel, stop tracking the click.
        -	 *
        -	 * @returns {void}
        -	 */
        -	FastClick.prototype.onTouchCancel = function() {
        -		this.trackingClick = false;
        -		this.targetElement = null;
        -	};
        -
        -
        -	/**
        -	 * Determine mouse events which should be permitted.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onMouse = function(event) {
        -
        -		// If a target element was never set (because a touch event was never fired) allow the event
        -		if (!this.targetElement) {
        -			return true;
        -		}
        -
        -		if (event.forwardedTouchEvent) {
        -			return true;
        -		}
        -
        -		// Programmatically generated events targeting a specific element should be permitted
        -		if (!event.cancelable) {
        -			return true;
        -		}
        -
        -		// Derive and check the target element to see whether the mouse event needs to be permitted;
        -		// unless explicitly enabled, prevent non-touch click events from triggering actions,
        -		// to prevent ghost/doubleclicks.
        -		if (!this.needsClick(this.targetElement) || this.cancelNextClick) {
        -
        -			// Prevent any user-added listeners declared on FastClick element from being fired.
        -			if (event.stopImmediatePropagation) {
        -				event.stopImmediatePropagation();
        -			} else {
        -
        -				// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
        -				event.propagationStopped = true;
        -			}
        -
        -			// Cancel the event
        -			event.stopPropagation();
        -			event.preventDefault();
        -
        -			return false;
        -		}
        -
        -		// If the mouse event is permitted, return true for the action to go through.
        -		return true;
        -	};
        -
        -
        -	/**
        -	 * On actual clicks, determine whether this is a touch-generated click, a click action occurring
        -	 * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or
        -	 * an actual click which should be permitted.
        -	 *
        -	 * @param {Event} event
        -	 * @returns {boolean}
        -	 */
        -	FastClick.prototype.onClick = function(event) {
        -		var permitted;
        -
        -		// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.
        -		if (this.trackingClick) {
        -			this.targetElement = null;
        -			this.trackingClick = false;
        -			return true;
        -		}
        -
        -		// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.
        -		if (event.target.type === 'submit' && event.detail === 0) {
        -			return true;
        -		}
        -
        -		permitted = this.onMouse(event);
        -
        -		// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.
        -		if (!permitted) {
        -			this.targetElement = null;
        -		}
        -
        -		// If clicks are permitted, return true for the action to go through.
        -		return permitted;
        -	};
        -
        -
        -	/**
        -	 * Remove all FastClick's event listeners.
        -	 *
        -	 * @returns {void}
        -	 */
        -	FastClick.prototype.destroy = function() {
        -		var layer = this.layer;
        -
        -		if (deviceIsAndroid) {
        -			layer.removeEventListener('mouseover', this.onMouse, true);
        -			layer.removeEventListener('mousedown', this.onMouse, true);
        -			layer.removeEventListener('mouseup', this.onMouse, true);
        -		}
        -
        -		layer.removeEventListener('click', this.onClick, true);
        -		layer.removeEventListener('touchstart', this.onTouchStart, false);
        -		layer.removeEventListener('touchmove', this.onTouchMove, false);
        -		layer.removeEventListener('touchend', this.onTouchEnd, false);
        -		layer.removeEventListener('touchcancel', this.onTouchCancel, false);
        -	};
        -
        -
        -	/**
        -	 * Check whether FastClick is needed.
        -	 *
        -	 * @param {Element} layer The layer to listen on
        -	 */
        -	FastClick.notNeeded = function(layer) {
        -		var metaViewport;
        -		var chromeVersion;
        -		var blackberryVersion;
        -		var firefoxVersion;
        -
        -		// Devices that don't support touch don't need FastClick
        -		if (typeof window.ontouchstart === 'undefined') {
        -			return true;
        -		}
        -
        -		// Chrome version - zero for other browsers
        -		chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
        -
        -		if (chromeVersion) {
        -
        -			if (deviceIsAndroid) {
        -				metaViewport = document.querySelector('meta[name=viewport]');
        -
        -				if (metaViewport) {
        -					// Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
        -					if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
        -						return true;
        -					}
        -					// Chrome 32 and above with width=device-width or less don't need FastClick
        -					if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {
        -						return true;
        -					}
        -				}
        -
        -			// Chrome desktop doesn't need FastClick (issue #15)
        -			} else {
        -				return true;
        -			}
        -		}
        -
        -		if (deviceIsBlackBerry10) {
        -			blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/);
        -
        -			// BlackBerry 10.3+ does not require Fastclick library.
        -			// https://github.com/ftlabs/fastclick/issues/251
        -			if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {
        -				metaViewport = document.querySelector('meta[name=viewport]');
        -
        -				if (metaViewport) {
        -					// user-scalable=no eliminates click delay.
        -					if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
        -						return true;
        -					}
        -					// width=device-width (or less than device-width) eliminates click delay.
        -					if (document.documentElement.scrollWidth <= window.outerWidth) {
        -						return true;
        -					}
        -				}
        -			}
        -		}
        -
        -		// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)
        -		if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {
        -			return true;
        -		}
        -
        -		// Firefox version - zero for other browsers
        -		firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
        -
        -		if (firefoxVersion >= 27) {
        -			// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896
        -
        -			metaViewport = document.querySelector('meta[name=viewport]');
        -			if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {
        -				return true;
        -			}
        -		}
        -
        -		// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version
        -		// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx
        -		if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {
        -			return true;
        -		}
        -
        -		return false;
        -	};
        -
        -
        -	/**
        -	 * Factory method for creating a FastClick object
        -	 *
        -	 * @param {Element} layer The layer to listen on
        -	 * @param {Object} [options={}] The options to override the defaults
        -	 */
        -	FastClick.attach = function(layer, options) {
        -		return new FastClick(layer, options);
        -	};
        -
        -
        -	if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {
        -
        -		// AMD. Register as an anonymous module.
        -		define(function() {
        -			return FastClick;
        -		});
        -	} else if (typeof module !== 'undefined' && module.exports) {
        -		module.exports = FastClick.attach;
        -		module.exports.FastClick = FastClick;
        -	} else {
        -		window.FastClick = FastClick;
        -	}
        -}());
        -
        -/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
        - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
        - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
        - *
        - * Version: 1.3.3
        - *
        - */
        -(function ($) {
        -
        -  $.fn.extend({
        -    slimScroll: function (options) {
        -
        -      var defaults = {
        -        // width in pixels of the visible scroll area
        -        width: 'auto',
        -        // height in pixels of the visible scroll area
        -        height: '250px',
        -        // width in pixels of the scrollbar and rail
        -        size: '7px',
        -        // scrollbar color, accepts any hex/color value
        -        color: '#000',
        -        // scrollbar position - left/right
        -        position: 'right',
        -        // distance in pixels between the side edge and the scrollbar
        -        distance: '1px',
        -        // default scroll position on load - top / bottom / $('selector')
        -        start: 'top',
        -        // sets scrollbar opacity
        -        opacity: .4,
        -        // enables always-on mode for the scrollbar
        -        alwaysVisible: false,
        -        // check if we should hide the scrollbar when user is hovering over
        -        disableFadeOut: false,
        -        // sets visibility of the rail
        -        railVisible: false,
        -        // sets rail color
        -        railColor: '#333',
        -        // sets rail opacity
        -        railOpacity: .2,
        -        // whether  we should use jQuery UI Draggable to enable bar dragging
        -        railDraggable: true,
        -        // defautlt CSS class of the slimscroll rail
        -        railClass: 'slimScrollRail',
        -        // defautlt CSS class of the slimscroll bar
        -        barClass: 'slimScrollBar',
        -        // defautlt CSS class of the slimscroll wrapper
        -        wrapperClass: 'slimScrollDiv',
        -        // check if mousewheel should scroll the window if we reach top/bottom
        -        allowPageScroll: false,
        -        // scroll amount applied to each mouse wheel step
        -        wheelStep: 20,
        -        // scroll amount applied when user is using gestures
        -        touchScrollStep: 200,
        -        // sets border radius
        -        borderRadius: '7px',
        -        // sets border radius of the rail
        -        railBorderRadius: '7px'
        -      };
        -
        -      var o = $.extend(defaults, options);
        -
        -      // do it for every element that matches selector
        -      this.each(function () {
        -
        -        var isOverPanel, isOverBar, isDragg, queueHide, touchDif,
        -                barHeight, percentScroll, lastScroll,
        -                divS = '<div></div>',
        -                minBarHeight = 30,
        -                releaseScroll = false;
        -
        -        // used in event handlers and for better minification
        -        var me = $(this);
        -
        -        // ensure we are not binding it again
        -        if (me.parent().hasClass(o.wrapperClass))
        -        {
        -          // start from last bar position
        -          var offset = me.scrollTop();
        -
        -          // find bar and rail
        -          bar = me.parent().find('.' + o.barClass);
        -          rail = me.parent().find('.' + o.railClass);
        -
        -          getBarHeight();
        -
        -          // check if we should scroll existing instance
        -          if ($.isPlainObject(options))
        -          {
        -            // Pass height: auto to an existing slimscroll object to force a resize after contents have changed
        -            if ('height' in options && options.height == 'auto') {
        -              me.parent().css('height', 'auto');
        -              me.css('height', 'auto');
        -              var height = me.parent().parent().height();
        -              me.parent().css('height', height);
        -              me.css('height', height);
        -            }
        -
        -            if ('scrollTo' in options)
        -            {
        -              // jump to a static point
        -              offset = parseInt(o.scrollTo);
        -            }
        -            else if ('scrollBy' in options)
        -            {
        -              // jump by value pixels
        -              offset += parseInt(o.scrollBy);
        -            }
        -            else if ('destroy' in options)
        -            {
        -              // remove slimscroll elements
        -              bar.remove();
        -              rail.remove();
        -              me.unwrap();
        -              return;
        -            }
        -
        -            // scroll content by the given offset
        -            scrollContent(offset, false, true);
        -          }
        -
        -          return;
        -        }
        -        else if ($.isPlainObject(options))
        -        {
        -          if ('destroy' in options)
        -          {
        -            return;
        -          }
        -        }
        -
        -        // optionally set height to the parent's height
        -        o.height = (o.height == 'auto') ? me.parent().height() : o.height;
        -
        -        // wrap content
        -        var wrapper = $(divS)
        -                .addClass(o.wrapperClass)
        -                .css({
        -                  position: 'relative',
        -                  overflow: 'hidden',
        -                  width: o.width,
        -                  height: o.height
        -                });
        -
        -        // update style for the div
        -        me.css({
        -          overflow: 'hidden',
        -          width: o.width,
        -          height: o.height,
        -          //Fix for IE10
        -          "-ms-touch-action": "none"
        -        });
        -
        -        // create scrollbar rail
        -        var rail = $(divS)
        -                .addClass(o.railClass)
        -                .css({
        -                  width: o.size,
        -                  height: '100%',
        -                  position: 'absolute',
        -                  top: 0,
        -                  display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',
        -                  'border-radius': o.railBorderRadius,
        -                  background: o.railColor,
        -                  opacity: o.railOpacity,
        -                  zIndex: 90
        -                });
        -
        -        // create scrollbar
        -        var bar = $(divS)
        -                .addClass(o.barClass)
        -                .css({
        -                  background: o.color,
        -                  width: o.size,
        -                  position: 'absolute',
        -                  top: 0,
        -                  opacity: o.opacity,
        -                  display: o.alwaysVisible ? 'block' : 'none',
        -                  'border-radius': o.borderRadius,
        -                  BorderRadius: o.borderRadius,
        -                  MozBorderRadius: o.borderRadius,
        -                  WebkitBorderRadius: o.borderRadius,
        -                  zIndex: 99
        -                });
        -
        -        // set position
        -        var posCss = (o.position == 'right') ? {right: o.distance} : {left: o.distance};
        -        rail.css(posCss);
        -        bar.css(posCss);
        -
        -        // wrap it
        -        me.wrap(wrapper);
        -
        -        // append to parent div
        -        me.parent().append(bar);
        -        me.parent().append(rail);
        -
        -        // make it draggable and no longer dependent on the jqueryUI
        -        if (o.railDraggable) {
        -          bar.bind("mousedown", function (e) {
        -            var $doc = $(document);
        -            isDragg = true;
        -            t = parseFloat(bar.css('top'));
        -            pageY = e.pageY;
        -
        -            $doc.bind("mousemove.slimscroll", function (e) {
        -              currTop = t + e.pageY - pageY;
        -              bar.css('top', currTop);
        -              scrollContent(0, bar.position().top, false);// scroll content
        -            });
        -
        -            $doc.bind("mouseup.slimscroll", function (e) {
        -              isDragg = false;
        -              hideBar();
        -              $doc.unbind('.slimscroll');
        -            });
        -            return false;
        -          }).bind("selectstart.slimscroll", function (e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -            return false;
        -          });
        -        }
        -
        -        // on rail over
        -        rail.hover(function () {
        -          showBar();
        -        }, function () {
        -          hideBar();
        -        });
        -
        -        // on bar over
        -        bar.hover(function () {
        -          isOverBar = true;
        -        }, function () {
        -          isOverBar = false;
        -        });
        -
        -        // show on parent mouseover
        -        me.hover(function () {
        -          isOverPanel = true;
        -          showBar();
        -          hideBar();
        -        }, function () {
        -          isOverPanel = false;
        -          hideBar();
        -        });
        -
        -        if (window.navigator.msPointerEnabled) {          
        -          // support for mobile
        -          me.bind('MSPointerDown', function (e, b) {
        -            if (e.originalEvent.targetTouches.length)
        -            {
        -              // record where touch started
        -              touchDif = e.originalEvent.targetTouches[0].pageY;
        -            }
        -          });
        -
        -          me.bind('MSPointerMove', function (e) {
        -            // prevent scrolling the page if necessary
        -            e.originalEvent.preventDefault();
        -            if (e.originalEvent.targetTouches.length)
        -            {
        -              // see how far user swiped
        -              var diff = (touchDif - e.originalEvent.targetTouches[0].pageY) / o.touchScrollStep;
        -              // scroll content
        -              scrollContent(diff, true);
        -              touchDif = e.originalEvent.targetTouches[0].pageY;
        -              
        -            }
        -          });
        -        } else {
        -          // support for mobile
        -          me.bind('touchstart', function (e, b) {
        -            if (e.originalEvent.touches.length)
        -            {
        -              // record where touch started
        -              touchDif = e.originalEvent.touches[0].pageY;
        -            }
        -          });
        -
        -          me.bind('touchmove', function (e) {
        -            // prevent scrolling the page if necessary
        -            if (!releaseScroll)
        -            {
        -              e.originalEvent.preventDefault();
        -            }
        -            if (e.originalEvent.touches.length)
        -            {
        -              // see how far user swiped
        -              var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;
        -              // scroll content
        -              scrollContent(diff, true);
        -              touchDif = e.originalEvent.touches[0].pageY;
        -            }
        -          });
        -        }
        -
        -        // set up initial height
        -        getBarHeight();
        -
        -        // check start position
        -        if (o.start === 'bottom')
        -        {
        -          // scroll content to bottom
        -          bar.css({top: me.outerHeight() - bar.outerHeight()});
        -          scrollContent(0, true);
        -        }
        -        else if (o.start !== 'top')
        -        {
        -          // assume jQuery selector
        -          scrollContent($(o.start).position().top, null, true);
        -
        -          // make sure bar stays hidden
        -          if (!o.alwaysVisible) {
        -            bar.hide();
        -          }
        -        }
        -
        -        // attach scroll events
        -        attachWheel();
        -
        -        function _onWheel(e)
        -        {
        -          // use mouse wheel only when mouse is over
        -          if (!isOverPanel) {
        -            return;
        -          }
        -
        -          var e = e || window.event;
        -
        -          var delta = 0;
        -          if (e.wheelDelta) {
        -            delta = -e.wheelDelta / 120;
        -          }
        -          if (e.detail) {
        -            delta = e.detail / 3;
        -          }
        -
        -          var target = e.target || e.srcTarget || e.srcElement;
        -          if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {
        -            // scroll content
        -            scrollContent(delta, true);
        -          }
        -
        -          // stop window scroll
        -          if (e.preventDefault && !releaseScroll) {
        -            e.preventDefault();
        -          }
        -          if (!releaseScroll) {
        -            e.returnValue = false;
        -          }
        -        }
        -
        -        function scrollContent(y, isWheel, isJump)
        -        {
        -          releaseScroll = false;
        -          var delta = y;
        -          var maxTop = me.outerHeight() - bar.outerHeight();
        -
        -          if (isWheel)
        -          {
        -            // move bar with mouse wheel
        -            delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();
        -
        -            // move bar, make sure it doesn't go out
        -            delta = Math.min(Math.max(delta, 0), maxTop);
        -
        -            // if scrolling down, make sure a fractional change to the
        -            // scroll position isn't rounded away when the scrollbar's CSS is set
        -            // this flooring of delta would happened automatically when
        -            // bar.css is set below, but we floor here for clarity
        -            delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);
        -
        -            // scroll the scrollbar
        -            bar.css({top: delta + 'px'});
        -          }
        -
        -          // calculate actual scroll amount
        -          percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());
        -          delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
        -
        -          if (isJump)
        -          {
        -            delta = y;
        -            var offsetTop = delta / me[0].scrollHeight * me.outerHeight();
        -            offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);
        -            bar.css({top: offsetTop + 'px'});
        -          }
        -
        -          // scroll content
        -          me.scrollTop(delta);
        -
        -          // fire scrolling event
        -          me.trigger('slimscrolling', ~~delta);
        -
        -          // ensure bar is visible
        -          showBar();
        -
        -          // trigger hide when scroll is stopped
        -          hideBar();
        -        }
        -
        -        function attachWheel()
        -        {
        -          if (window.addEventListener)
        -          {
        -            this.addEventListener('DOMMouseScroll', _onWheel, false);
        -            this.addEventListener('mousewheel', _onWheel, false);
        -          }
        -          else
        -          {
        -            document.attachEvent("onmousewheel", _onWheel)
        -          }
        -        }
        -
        -        function getBarHeight()
        -        {
        -          // calculate scrollbar height and make sure it is not too small
        -          barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
        -          bar.css({height: barHeight + 'px'});
        -
        -          // hide scrollbar if content is not long enough
        -          var display = barHeight == me.outerHeight() ? 'none' : 'block';
        -          bar.css({display: display});
        -        }
        -
        -        function showBar()
        -        {
        -          // recalculate bar height
        -          getBarHeight();
        -          clearTimeout(queueHide);
        -
        -          // when bar reached top or bottom
        -          if (percentScroll == ~~percentScroll)
        -          {
        -            //release wheel
        -            releaseScroll = o.allowPageScroll;
        -
        -            // publish approporiate event
        -            if (lastScroll != percentScroll)
        -            {
        -              var msg = (~~percentScroll == 0) ? 'top' : 'bottom';
        -              me.trigger('slimscroll', msg);
        -            }
        -          }
        -          else
        -          {
        -            releaseScroll = false;
        -          }
        -          lastScroll = percentScroll;
        -
        -          // show only when required
        -          if (barHeight >= me.outerHeight()) {
        -            //allow window scroll
        -            releaseScroll = true;
        -            return;
        -          }
        -          bar.stop(true, true).fadeIn('fast');
        -          if (o.railVisible) {
        -            rail.stop(true, true).fadeIn('fast');
        -          }
        -        }
        -
        -        function hideBar()
        -        {
        -          // only hide when options allow it
        -          if (!o.alwaysVisible)
        -          {
        -            queueHide = setTimeout(function () {
        -              if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
        -              {
        -                bar.fadeOut('slow');
        -                rail.fadeOut('slow');
        -              }
        -            }, 1000);
        -          }
        -        }
        -
        -      });
        -
        -      // maintain chainability
        -      return this;
        -    }
        -  });
        -
        -  $.fn.extend({
        -    slimscroll: $.fn.slimScroll
        -  });
        -
        -})(jQuery);
        -
        -/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){return n.apply(b,v.call(arguments,0).concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice;this.listeners=this.listeners||{},a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),this.$results.append(d)},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")});var f=e.filter("[aria-selected=true]");f.length>0?f.first().trigger("mouseenter"):e.first().trigger("mouseenter")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";{a(h)}this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b){var c=this,d=b.id+"-results";this.$results.attr("id",d),b.on("results:all",function(a){c.clear(),c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("results:append",function(a){c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("query",function(a){c.showLoading(a)}),b.on("select",function(){b.isOpen()&&c.setClasses()}),b.on("unselect",function(){b.isOpen()&&c.setClasses()}),b.on("open",function(){c.$results.attr("aria-expanded","true"),c.$results.attr("aria-hidden","false"),c.setClasses(),c.ensureHighlightVisible()}),b.on("close",function(){c.$results.attr("aria-expanded","false"),c.$results.attr("aria-hidden","true"),c.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=c.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=c.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?c.trigger("close"):c.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a);if(0!==d){var e=d-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top,h=f.offset().top,i=c.$results.scrollTop()+(h-g);0===e?c.$results.scrollTop(0):0>h-g&&c.$results.scrollTop(i)}}),b.on("results:next",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a),e=d+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top+c.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=c.$results.scrollTop()+h-g;0===e?c.$results.scrollTop(0):h>g&&c.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){c.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=c.$results.scrollTop(),d=c.$results.get(0).scrollHeight-c.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&d<=c.$results.height();e?(c.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(c.$results.scrollTop(c.$results.get(0).scrollHeight-c.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var d=a(this),e=d.data("data");return"true"===d.attr("aria-selected")?void(c.options.get("multiple")?c.trigger("unselect",{originalEvent:b,data:e}):c.trigger("close")):void c.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(){var b=a(this).data("data");c.getHighlightedResults().removeClass("select2-results__option--highlighted"),c.trigger("results:focus",{data:b,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a){var b=this,d=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){b.trigger("focus",a)}),this.$selection.on("blur",function(a){b.trigger("blur",a)}),this.$selection.on("keydown",function(a){b.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){b.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){b.update(a.data)}),a.on("open",function(){b.$selection.attr("aria-expanded","true"),b.$selection.attr("aria-owns",d),b._attachCloseHandler(a)}),a.on("close",function(){b.$selection.attr("aria-expanded","false"),b.$selection.removeAttr("aria-activedescendant"),b.$selection.removeAttr("aria-owns"),b.$selection.focus(),b._detachCloseHandler(a)}),a.on("enable",function(){b.$selection.attr("tabindex",b._tabindex)}),a.on("disable",function(){b.$selection.attr("tabindex","-1")})},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},d.prototype.bind=function(a){var b=this;d.__super__.bind.apply(this,arguments);var c=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",c),this.$selection.attr("aria-labelledby",c),this.$selection.on("mousedown",function(a){1===a.which&&b.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(){}),this.$selection.on("blur",function(){}),a.on("selection:update",function(a){b.update(a.data)})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){return a("<span></span>")},d.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.display(b),d=this.$selection.find(".select2-selection__rendered");d.empty().append(c),d.prop("title",b.title||b.text)},d}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(){var b=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){b.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(c){var d=a(this),e=d.parent(),f=e.data("data");b.trigger("unselect",{originalEvent:c,data:f})})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.display(e),g=this.selectionContainer();g.append(f),g.prop("title",e.title||e.text),g.data("data",e),b.push(g)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(){function a(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},a.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},a}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle")}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus()}),b.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.focus()}),b.on("enable",function(){e.$search.prop("disabled",!1)}),b.on("disable",function(){e.$search.prop("disabled",!0)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e.trigger("blur",a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}}),this.$selection.on("input",".select2-search--inline",function(){e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input",".select2-search--inline",function(a){e.handleSearch(a)})},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.trigger("open"),this.$search.val(b.text+" ")},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a){var b=this;this.container=a,a.on("select",function(a){b.select(a.data)}),a.on("unselect",function(a){b.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};
        -if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=(c.extend(!0,{},l,j),this.option(l));k.replaceWith(m)}else{var n=this.option(j);if(j.children){var o=this.convertToOptions(j.children);b.appendMany(n,o)}h.push(n)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(b,c){this.ajaxOptions=this._applyDefaults(c.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),a.__super__.constructor.call(this,b,c)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return{q:a.term}},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url(a)),"function"==typeof f.data&&(f.data=f.data(a)),this.ajaxOptions.delay&&""!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g<e.length;g++){var h=e[g],i=this._normalizeItem(h),j=this.option(i);this.$element.append(j)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(){var b=(this._lastTag,this.$element.find("option[data-select2-tag]"));b.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(a,b,c){function d(a){e.select(a)}var e=this;b.term=b.term||"";var f=this.tokenizer(b,this.options,d);f.term!==b.term&&(this.$search.length&&(this.$search.val(f.term),this.$search.focus()),b.term=f.term),a.call(this,b,c)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);e(m),g=g.substr(h+1)||"",h=0}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.position=function(){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a){function b(){}return b.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},b.prototype.handleSearch=function(){if(!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},b.prototype.showSearch=function(){return!0},b}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="option load-more" role="treeitem"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(a,b,c){this.$dropdownParent=c.get("dropdownParent")||document.body,a.call(this,b,c)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c){var d=this,e="scroll.select2."+c.id,f="resize.select2."+c.id,g="orientationchange.select2."+c.id,h=this.$container.parents().filter(b.hasScroll);h.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),h.on(e,function(){var b=a(this).data("select2-scroll-position");a(this).scrollTop(b.y)}),a(window).on(e+" "+f+" "+g,function(){d._positionDropdown(),d._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c){var d="scroll.select2."+c.id,e="resize.select2."+c.id,f="orientationchange.select2."+c.id,g=this.$container.parents().filter(b.hasScroll);g.off(d),a(window).off(d+" "+e+" "+f)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom};c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){this.$dropdownContainer.width();var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(){d._handleSelectOnClose()})},a.prototype._handleSelectOnClose=function(){var a=this.getHighlightedResults();a.length<1||this.trigger("select",{data:a.data("data")})},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close")},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend({},this.defaults,l),null==l.dataAdapter){if(l.dataAdapter=null!=l.ajax?o:null!=l.data?n:m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.selectionAdapter=l.multiple?e:d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(this.options.dir=a.prop("dir")?a.prop("dir"):a.closest("[dir]").prop("dir")?a.closest("[dir]").prop("dir"):"ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("focus",function(){a.$container.addClass("select2-container--focus")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open"),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ENTER?(a.trigger("results:select"),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle"),b.preventDefault()):c===d.UP?(a.trigger("results:previous"),b.preventDefault()):c===d.DOWN?(a.trigger("results:next"),b.preventDefault()):(c===d.ESC||c===d.TAB)&&(a.close(),b.preventDefault()):(c===d.ENTER||c===d.SPACE||(c===d.DOWN||c===d.UP)&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable")):this.trigger("enable")},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||(this.trigger("query",{}),this.trigger("open"))},e.prototype.close=function(){this.isOpen()&&this.trigger("close")},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get("multiple")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger("change")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger("change")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];
        -b.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger("change")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],"data")});this._currentData.push.apply(this._currentData,d)},b}),b.define("select2/compat/matcher",["jquery"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||""===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define("select2/compat/query",[],function(){function a(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get("query");d.call(null,b)},a}),b.define("select2/dropdown/attachContainer",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(".dropdown-wrapper");d.append(b),b.addClass("select2-dropdown--below"),c.addClass("select2-container--below")},a}),b.define("select2/dropdown/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("select2/selection/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("jquery.select2",["jquery","require","./select2/core","./select2/defaults"],function(a,b,c,d){if(b("jquery.mousewheel"),null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){{var d=a.extend({},b,!0);new c(a(this),d)}}),this;if("string"==typeof b){var d=this.data("select2");null==d&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2.");var f=Array.prototype.slice.call(arguments,1),g=d[b](f);return a.inArray(b,e)>-1?this:g}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),function(c){"function"==typeof b.define&&b.define.amd?b.define("jquery.mousewheel",["jquery"],c):"object"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
        -/*!
        - * Bootstrap Colorpicker
        - * http://mjolnic.github.io/bootstrap-colorpicker/
        - *
        - * Originally written by (c) 2012 Stefan Petre
        - * Licensed under the Apache License v2.0
        - * http://www.apache.org/licenses/LICENSE-2.0.txt
        - *
        - * @todo Update DOCS
        - */
        -(function($) {
        -    'use strict';
        -
        -    // Color object
        -    var Color = function(val) {
        -        this.value = {
        -            h: 0,
        -            s: 0,
        -            b: 0,
        -            a: 1
        -        };
        -        this.origFormat = null; // original string format
        -        if (val) {
        -            if (val.toLowerCase !== undefined) {
        -                this.setColor(val);
        -            } else if (val.h !== undefined) {
        -                this.value = val;
        -            }
        -        }
        -    };
        -
        -    Color.prototype = {
        -        constructor: Color,
        -        _sanitizeNumber: function(val) {
        -            if (typeof val === 'number') {
        -                return val;
        -            }
        -            if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {
        -                return 1;
        -            }
        -            if (val.toLowerCase !== undefined) {
        -                return parseFloat(val);
        -            }
        -            return 1;
        -        },
        -        //parse a string to HSB
        -        setColor: function(strVal) {
        -            strVal = strVal.toLowerCase();
        -            this.value = this.stringToHSB(strVal) ||  {
        -                h: 0,
        -                s: 0,
        -                b: 0,
        -                a: 1
        -            };
        -        },
        -        stringToHSB: function(strVal) {
        -            strVal = strVal.toLowerCase();
        -            var that = this,
        -                result = false;
        -            $.each(this.stringParsers, function(i, parser) {
        -                var match = parser.re.exec(strVal),
        -                    values = match && parser.parse.apply(that, [match]),
        -                    format = parser.format || 'rgba';
        -                if (values) {
        -                    if (format.match(/hsla?/)) {
        -                        result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));
        -                    } else {
        -                        result = that.RGBtoHSB.apply(that, values);
        -                    }
        -                    that.origFormat = format;
        -                    return false;
        -                }
        -                return true;
        -            });
        -            return result;
        -        },
        -        setHue: function(h) {
        -            this.value.h = 1 - h;
        -        },
        -        setSaturation: function(s) {
        -            this.value.s = s;
        -        },
        -        setBrightness: function(b) {
        -            this.value.b = 1 - b;
        -        },
        -        setAlpha: function(a) {
        -            this.value.a = parseInt((1 - a) * 100, 10) / 100;
        -        },
        -        toRGB: function(h, s, v, a) {
        -            h = h || this.value.h;
        -            s = s || this.value.s;
        -            v = v || this.value.b;
        -            a = a || this.value.a;
        -
        -            var r, g, b, i, f, p, q, t;
        -            if (h && s === undefined && v === undefined) {
        -                s = h.s, v = h.v, h = h.h;
        -            }
        -            i = Math.floor(h * 6);
        -            f = h * 6 - i;
        -            p = v * (1 - s);
        -            q = v * (1 - f * s);
        -            t = v * (1 - (1 - f) * s);
        -            switch (i % 6) {
        -                case 0:
        -                    r = v, g = t, b = p;
        -                    break;
        -                case 1:
        -                    r = q, g = v, b = p;
        -                    break;
        -                case 2:
        -                    r = p, g = v, b = t;
        -                    break;
        -                case 3:
        -                    r = p, g = q, b = v;
        -                    break;
        -                case 4:
        -                    r = t, g = p, b = v;
        -                    break;
        -                case 5:
        -                    r = v, g = p, b = q;
        -                    break;
        -            }
        -            return {
        -                r: Math.floor(r * 255),
        -                g: Math.floor(g * 255),
        -                b: Math.floor(b * 255),
        -                a: a
        -            };
        -        },
        -        toHex: function(h, s, b, a) {
        -            var rgb = this.toRGB(h, s, b, a);
        -            return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
        -        },
        -        toHSL: function(h, s, b, a) {
        -            h = h || this.value.h;
        -            s = s || this.value.s;
        -            b = b || this.value.b;
        -            a = a || this.value.a;
        -
        -            var H = h,
        -                L = (2 - s) * b,
        -                S = s * b;
        -            if (L > 0 && L <= 1) {
        -                S /= L;
        -            } else {
        -                S /= 2 - L;
        -            }
        -            L /= 2;
        -            if (S > 1) {
        -                S = 1;
        -            }
        -            return {
        -                h: H,
        -                s: S,
        -                l: L,
        -                a: a
        -            };
        -        },
        -        RGBtoHSB: function(r, g, b, a) {
        -            r /= 255;
        -            g /= 255;
        -            b /= 255;
        -
        -            var H, S, V, C;
        -            V = Math.max(r, g, b);
        -            C = V - Math.min(r, g, b);
        -            H = (C === 0 ? null :
        -                V === r ? (g - b) / C :
        -                V === g ? (b - r) / C + 2 :
        -                (r - g) / C + 4
        -            );
        -            H = ((H + 360) % 6) * 60 / 360;
        -            S = C === 0 ? 0 : C / V;
        -            return {
        -                h: this._sanitizeNumber(H),
        -                s: S,
        -                b: V,
        -                a: this._sanitizeNumber(a)
        -            };
        -        },
        -        HueToRGB: function(p, q, h) {
        -            if (h < 0) {
        -                h += 1;
        -            } else if (h > 1) {
        -                h -= 1;
        -            }
        -            if ((h * 6) < 1) {
        -                return p + (q - p) * h * 6;
        -            } else if ((h * 2) < 1) {
        -                return q;
        -            } else if ((h * 3) < 2) {
        -                return p + (q - p) * ((2 / 3) - h) * 6;
        -            } else {
        -                return p;
        -            }
        -        },
        -        HSLtoRGB: function(h, s, l, a) {
        -            if (s < 0) {
        -                s = 0;
        -            }
        -            var q;
        -            if (l <= 0.5) {
        -                q = l * (1 + s);
        -            } else {
        -                q = l + s - (l * s);
        -            }
        -
        -            var p = 2 * l - q;
        -
        -            var tr = h + (1 / 3);
        -            var tg = h;
        -            var tb = h - (1 / 3);
        -
        -            var r = Math.round(this.HueToRGB(p, q, tr) * 255);
        -            var g = Math.round(this.HueToRGB(p, q, tg) * 255);
        -            var b = Math.round(this.HueToRGB(p, q, tb) * 255);
        -            return [r, g, b, this._sanitizeNumber(a)];
        -        },
        -        toString: function(format) {
        -            format = format ||  'rgba';
        -            switch (format) {
        -                case 'rgb':
        -                    {
        -                        var rgb = this.toRGB();
        -                        return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';
        -                    }
        -                    break;
        -                case 'rgba':
        -                    {
        -                        var rgb = this.toRGB();
        -                        return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')';
        -                    }
        -                    break;
        -                case 'hsl':
        -                    {
        -                        var hsl = this.toHSL();
        -                        return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)';
        -                    }
        -                    break;
        -                case 'hsla':
        -                    {
        -                        var hsl = this.toHSL();
        -                        return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')';
        -                    }
        -                    break;
        -                case 'hex':
        -                    {
        -                        return this.toHex();
        -                    }
        -                    break;
        -                default:
        -                    {
        -                        return false;
        -                    }
        -                    break;
        -            }
        -        },
        -        // a set of RE's that can match strings and generate color tuples.
        -        // from John Resig color plugin
        -        // https://github.com/jquery/jquery-color/
        -        stringParsers: [{
        -            re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
        -            format: 'hex',
        -            parse: function(execResult) {
        -                return [
        -                    parseInt(execResult[1], 16),
        -                    parseInt(execResult[2], 16),
        -                    parseInt(execResult[3], 16),
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,
        -            format: 'hex',
        -            parse: function(execResult) {
        -                return [
        -                    parseInt(execResult[1] + execResult[1], 16),
        -                    parseInt(execResult[2] + execResult[2], 16),
        -                    parseInt(execResult[3] + execResult[3], 16),
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,
        -            format: 'rgb',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1],
        -                    execResult[2],
        -                    execResult[3],
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
        -            format: 'rgb',
        -            parse: function(execResult) {
        -                return [
        -                    2.55 * execResult[1],
        -                    2.55 * execResult[2],
        -                    2.55 * execResult[3],
        -                    1
        -                ];
        -            }
        -        }, {
        -            re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
        -            format: 'rgba',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1],
        -                    execResult[2],
        -                    execResult[3],
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
        -            format: 'rgba',
        -            parse: function(execResult) {
        -                return [
        -                    2.55 * execResult[1],
        -                    2.55 * execResult[2],
        -                    2.55 * execResult[3],
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
        -            format: 'hsl',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1] / 360,
        -                    execResult[2] / 100,
        -                    execResult[3] / 100,
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
        -            format: 'hsla',
        -            parse: function(execResult) {
        -                return [
        -                    execResult[1] / 360,
        -                    execResult[2] / 100,
        -                    execResult[3] / 100,
        -                    execResult[4]
        -                ];
        -            }
        -        }, {
        -            //predefined color name
        -            re: /^([a-z]{3,})$/,
        -            format: 'alias',
        -            parse: function(execResult) {
        -                var hexval = this.colorNameToHex(execResult[0]) ||  '#000000';
        -                var match = this.stringParsers[0].re.exec(hexval),
        -                    values = match && this.stringParsers[0].parse.apply(this, [match]);
        -                return values;
        -            }
        -        }],
        -        colorNameToHex: function(name) {
        -            // 140 predefined colors from the HTML Colors spec
        -            var colors = {
        -                "aliceblue": "#f0f8ff",
        -                "antiquewhite": "#faebd7",
        -                "aqua": "#00ffff",
        -                "aquamarine": "#7fffd4",
        -                "azure": "#f0ffff",
        -                "beige": "#f5f5dc",
        -                "bisque": "#ffe4c4",
        -                "black": "#000000",
        -                "blanchedalmond": "#ffebcd",
        -                "blue": "#0000ff",
        -                "blueviolet": "#8a2be2",
        -                "brown": "#a52a2a",
        -                "burlywood": "#deb887",
        -                "cadetblue": "#5f9ea0",
        -                "chartreuse": "#7fff00",
        -                "chocolate": "#d2691e",
        -                "coral": "#ff7f50",
        -                "cornflowerblue": "#6495ed",
        -                "cornsilk": "#fff8dc",
        -                "crimson": "#dc143c",
        -                "cyan": "#00ffff",
        -                "darkblue": "#00008b",
        -                "darkcyan": "#008b8b",
        -                "darkgoldenrod": "#b8860b",
        -                "darkgray": "#a9a9a9",
        -                "darkgreen": "#006400",
        -                "darkkhaki": "#bdb76b",
        -                "darkmagenta": "#8b008b",
        -                "darkolivegreen": "#556b2f",
        -                "darkorange": "#ff8c00",
        -                "darkorchid": "#9932cc",
        -                "darkred": "#8b0000",
        -                "darksalmon": "#e9967a",
        -                "darkseagreen": "#8fbc8f",
        -                "darkslateblue": "#483d8b",
        -                "darkslategray": "#2f4f4f",
        -                "darkturquoise": "#00ced1",
        -                "darkviolet": "#9400d3",
        -                "deeppink": "#ff1493",
        -                "deepskyblue": "#00bfff",
        -                "dimgray": "#696969",
        -                "dodgerblue": "#1e90ff",
        -                "firebrick": "#b22222",
        -                "floralwhite": "#fffaf0",
        -                "forestgreen": "#228b22",
        -                "fuchsia": "#ff00ff",
        -                "gainsboro": "#dcdcdc",
        -                "ghostwhite": "#f8f8ff",
        -                "gold": "#ffd700",
        -                "goldenrod": "#daa520",
        -                "gray": "#808080",
        -                "green": "#008000",
        -                "greenyellow": "#adff2f",
        -                "honeydew": "#f0fff0",
        -                "hotpink": "#ff69b4",
        -                "indianred ": "#cd5c5c",
        -                "indigo ": "#4b0082",
        -                "ivory": "#fffff0",
        -                "khaki": "#f0e68c",
        -                "lavender": "#e6e6fa",
        -                "lavenderblush": "#fff0f5",
        -                "lawngreen": "#7cfc00",
        -                "lemonchiffon": "#fffacd",
        -                "lightblue": "#add8e6",
        -                "lightcoral": "#f08080",
        -                "lightcyan": "#e0ffff",
        -                "lightgoldenrodyellow": "#fafad2",
        -                "lightgrey": "#d3d3d3",
        -                "lightgreen": "#90ee90",
        -                "lightpink": "#ffb6c1",
        -                "lightsalmon": "#ffa07a",
        -                "lightseagreen": "#20b2aa",
        -                "lightskyblue": "#87cefa",
        -                "lightslategray": "#778899",
        -                "lightsteelblue": "#b0c4de",
        -                "lightyellow": "#ffffe0",
        -                "lime": "#00ff00",
        -                "limegreen": "#32cd32",
        -                "linen": "#faf0e6",
        -                "magenta": "#ff00ff",
        -                "maroon": "#800000",
        -                "mediumaquamarine": "#66cdaa",
        -                "mediumblue": "#0000cd",
        -                "mediumorchid": "#ba55d3",
        -                "mediumpurple": "#9370d8",
        -                "mediumseagreen": "#3cb371",
        -                "mediumslateblue": "#7b68ee",
        -                "mediumspringgreen": "#00fa9a",
        -                "mediumturquoise": "#48d1cc",
        -                "mediumvioletred": "#c71585",
        -                "midnightblue": "#191970",
        -                "mintcream": "#f5fffa",
        -                "mistyrose": "#ffe4e1",
        -                "moccasin": "#ffe4b5",
        -                "navajowhite": "#ffdead",
        -                "navy": "#000080",
        -                "oldlace": "#fdf5e6",
        -                "olive": "#808000",
        -                "olivedrab": "#6b8e23",
        -                "orange": "#ffa500",
        -                "orangered": "#ff4500",
        -                "orchid": "#da70d6",
        -                "palegoldenrod": "#eee8aa",
        -                "palegreen": "#98fb98",
        -                "paleturquoise": "#afeeee",
        -                "palevioletred": "#d87093",
        -                "papayawhip": "#ffefd5",
        -                "peachpuff": "#ffdab9",
        -                "peru": "#cd853f",
        -                "pink": "#ffc0cb",
        -                "plum": "#dda0dd",
        -                "powderblue": "#b0e0e6",
        -                "purple": "#800080",
        -                "red": "#ff0000",
        -                "rosybrown": "#bc8f8f",
        -                "royalblue": "#4169e1",
        -                "saddlebrown": "#8b4513",
        -                "salmon": "#fa8072",
        -                "sandybrown": "#f4a460",
        -                "seagreen": "#2e8b57",
        -                "seashell": "#fff5ee",
        -                "sienna": "#a0522d",
        -                "silver": "#c0c0c0",
        -                "skyblue": "#87ceeb",
        -                "slateblue": "#6a5acd",
        -                "slategray": "#708090",
        -                "snow": "#fffafa",
        -                "springgreen": "#00ff7f",
        -                "steelblue": "#4682b4",
        -                "tan": "#d2b48c",
        -                "teal": "#008080",
        -                "thistle": "#d8bfd8",
        -                "tomato": "#ff6347",
        -                "turquoise": "#40e0d0",
        -                "violet": "#ee82ee",
        -                "wheat": "#f5deb3",
        -                "white": "#ffffff",
        -                "whitesmoke": "#f5f5f5",
        -                "yellow": "#ffff00",
        -                "yellowgreen": "#9acd32"
        -            };
        -
        -            if (typeof colors[name.toLowerCase()] !== 'undefined') {
        -                return colors[name.toLowerCase()];
        -            }
        -            return false;
        -        }
        -    };
        -
        -
        -    var defaults = {
        -        horizontal: false, // horizontal mode layout ?
        -        inline: false, //forces to show the colorpicker as an inline element
        -        color: false, //forces a color
        -        format: false, //forces a format
        -        input: 'input', // children input selector
        -        container: false, // container selector
        -        component: '.add-on, .input-group-addon', // children component selector
        -        sliders: {
        -            saturation: {
        -                maxLeft: 100,
        -                maxTop: 100,
        -                callLeft: 'setSaturation',
        -                callTop: 'setBrightness'
        -            },
        -            hue: {
        -                maxLeft: 0,
        -                maxTop: 100,
        -                callLeft: false,
        -                callTop: 'setHue'
        -            },
        -            alpha: {
        -                maxLeft: 0,
        -                maxTop: 100,
        -                callLeft: false,
        -                callTop: 'setAlpha'
        -            }
        -        },
        -        slidersHorz: {
        -            saturation: {
        -                maxLeft: 100,
        -                maxTop: 100,
        -                callLeft: 'setSaturation',
        -                callTop: 'setBrightness'
        -            },
        -            hue: {
        -                maxLeft: 100,
        -                maxTop: 0,
        -                callLeft: 'setHue',
        -                callTop: false
        -            },
        -            alpha: {
        -                maxLeft: 100,
        -                maxTop: 0,
        -                callLeft: 'setAlpha',
        -                callTop: false
        -            }
        -        },
        -        template: '<div class="colorpicker dropdown-menu">' +
        -            '<div class="colorpicker-saturation"><i><b></b></i></div>' +
        -            '<div class="colorpicker-hue"><i></i></div>' +
        -            '<div class="colorpicker-alpha"><i></i></div>' +
        -            '<div class="colorpicker-color"><div /></div>' +
        -            '</div>'
        -    };
        -
        -    var Colorpicker = function(element, options) {
        -        this.element = $(element).addClass('colorpicker-element');
        -        this.options = $.extend({}, defaults, this.element.data(), options);
        -        this.component = this.options.component;
        -        this.component = (this.component !== false) ? this.element.find(this.component) : false;
        -        if (this.component && (this.component.length === 0)) {
        -            this.component = false;
        -        }
        -        this.container = (this.options.container === true) ? this.element : this.options.container;
        -        this.container = (this.container !== false) ? $(this.container) : false;
        -
        -        // Is the element an input? Should we search inside for any input?
        -        this.input = this.element.is('input') ? this.element : (this.options.input ?
        -            this.element.find(this.options.input) : false);
        -        if (this.input && (this.input.length === 0)) {
        -            this.input = false;
        -        }
        -        // Set HSB color
        -        this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());
        -        this.format = this.options.format !== false ? this.options.format : this.color.origFormat;
        -
        -        // Setup picker
        -        this.picker = $(this.options.template);
        -        if (this.options.inline) {
        -            this.picker.addClass('colorpicker-inline colorpicker-visible');
        -        } else {
        -            this.picker.addClass('colorpicker-hidden');
        -        }
        -        if (this.options.horizontal) {
        -            this.picker.addClass('colorpicker-horizontal');
        -        }
        -        if (this.format === 'rgba' || this.format === 'hsla') {
        -            this.picker.addClass('colorpicker-with-alpha');
        -        }
        -        this.picker.on('mousedown.colorpicker', $.proxy(this.mousedown, this));
        -        this.picker.appendTo(this.container ? this.container : $('body'));
        -
        -        // Bind events
        -        if (this.input !== false) {
        -            this.input.on({
        -                'keyup.colorpicker': $.proxy(this.keyup, this)
        -            });
        -            if (this.component === false) {
        -                this.element.on({
        -                    'focus.colorpicker': $.proxy(this.show, this)
        -                });
        -            }
        -            if (this.options.inline === false) {
        -                this.element.on({
        -                    'focusout.colorpicker': $.proxy(this.hide, this)
        -                });
        -            }
        -        }
        -
        -        if (this.component !== false) {
        -            this.component.on({
        -                'click.colorpicker': $.proxy(this.show, this)
        -            });
        -        }
        -
        -        if ((this.input === false) && (this.component === false)) {
        -            this.element.on({
        -                'click.colorpicker': $.proxy(this.show, this)
        -            });
        -        }
        -        this.update();
        -
        -        $($.proxy(function() {
        -            this.element.trigger('create');
        -        }, this));
        -    };
        -
        -    Colorpicker.version = '2.0.0-beta';
        -
        -    Colorpicker.Color = Color;
        -
        -    Colorpicker.prototype = {
        -        constructor: Colorpicker,
        -        destroy: function() {
        -            this.picker.remove();
        -            this.element.removeData('colorpicker').off('.colorpicker');
        -            if (this.input !== false) {
        -                this.input.off('.colorpicker');
        -            }
        -            if (this.component !== false) {
        -                this.component.off('.colorpicker');
        -            }
        -            this.element.removeClass('colorpicker-element');
        -            this.element.trigger({
        -                type: 'destroy'
        -            });
        -        },
        -        reposition: function() {
        -            if (this.options.inline !== false) {
        -                return false;
        -            }
        -            var offset = this.component ? this.component.offset() : this.element.offset();
        -            this.picker.css({
        -                top: offset.top + (this.component ? this.component.outerHeight() : this.element.outerHeight()),
        -                left: offset.left
        -            });
        -        },
        -        show: function(e) {
        -            if (this.isDisabled()) {
        -                return false;
        -            }
        -            this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');
        -            this.reposition();
        -            $(window).on('resize.colorpicker', $.proxy(this.reposition, this));
        -            if (!this.hasInput() && e) {
        -                if (e.stopPropagation && e.preventDefault) {
        -                    e.stopPropagation();
        -                    e.preventDefault();
        -                }
        -            }
        -            if (this.options.inline === false) {
        -                $(window.document).on({
        -                    'mousedown.colorpicker': $.proxy(this.hide, this)
        -                });
        -            }
        -            this.element.trigger({
        -                type: 'showPicker',
        -                color: this.color
        -            });
        -        },
        -        hide: function() {
        -            this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');
        -            $(window).off('resize.colorpicker', this.reposition);
        -            $(document).off({
        -                'mousedown.colorpicker': this.hide
        -            });
        -            this.update();
        -            this.element.trigger({
        -                type: 'hidePicker',
        -                color: this.color
        -            });
        -        },
        -        updateData: function(val) {
        -            val = val ||  this.color.toString(this.format);
        -            this.element.data('color', val);
        -            return val;
        -        },
        -        updateInput: function(val) {
        -            val = val ||  this.color.toString(this.format);
        -            if (this.input !== false) {
        -                this.input.prop('value', val);
        -            }
        -            return val;
        -        },
        -        updatePicker: function(val) {
        -            if (val !== undefined) {
        -                this.color = new Color(val);
        -            }
        -            var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;
        -            var icns = this.picker.find('i');
        -            if (icns.length === 0) {
        -                return;
        -            }
        -            if (this.options.horizontal === false) {
        -                sl = this.options.sliders;
        -                icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()
        -                    .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));
        -            } else {
        -                sl = this.options.slidersHorz;
        -                icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()
        -                    .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));
        -            }
        -            icns.eq(0).css({
        -                'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,
        -                'left': this.color.value.s * sl.saturation.maxLeft
        -            });
        -            this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));
        -            this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());
        -            this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));
        -            return val;
        -        },
        -        updateComponent: function(val) {
        -            val = val ||  this.color.toString(this.format);
        -            if (this.component !== false) {
        -                var icn = this.component.find('i').eq(0);
        -                if (icn.length > 0) {
        -                    icn.css({
        -                        'backgroundColor': val
        -                    });
        -                } else {
        -                    this.component.css({
        -                        'backgroundColor': val
        -                    });
        -                }
        -            }
        -            return val;
        -        },
        -        update: function(force) {
        -            var val = this.updateComponent();
        -            if ((this.getValue(false) !== false) || (force === true)) {
        -                // Update input/data only if the current value is not blank
        -                this.updateInput(val);
        -                this.updateData(val);
        -            }
        -            this.updatePicker();
        -            return val;
        -
        -        },
        -        setValue: function(val) { // set color manually
        -            this.color = new Color(val);
        -            this.update();
        -            this.element.trigger({
        -                type: 'changeColor',
        -                color: this.color,
        -                value: val
        -            });
        -        },
        -        getValue: function(defaultValue) {
        -            defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;
        -            var val;
        -            if (this.hasInput()) {
        -                val = this.input.val();
        -            } else {
        -                val = this.element.data('color');
        -            }
        -            if ((val === undefined) || (val === '') || (val === null)) {
        -                // if not defined or empty, return default
        -                val = defaultValue;
        -            }
        -            return val;
        -        },
        -        hasInput: function() {
        -            return (this.input !== false);
        -        },
        -        isDisabled: function() {
        -            if (this.hasInput()) {
        -                return (this.input.prop('disabled') === true);
        -            }
        -            return false;
        -        },
        -        disable: function() {
        -            if (this.hasInput()) {
        -                this.input.prop('disabled', true);
        -                return true;
        -            }
        -            return false;
        -        },
        -        enable: function() {
        -            if (this.hasInput()) {
        -                this.input.prop('disabled', false);
        -                return true;
        -            }
        -            return false;
        -        },
        -        currentSlider: null,
        -        mousePointer: {
        -            left: 0,
        -            top: 0
        -        },
        -        mousedown: function(e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -
        -            var target = $(e.target);
        -
        -            //detect the slider and set the limits and callbacks
        -            var zone = target.closest('div');
        -            var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;
        -            if (!zone.is('.colorpicker')) {
        -                if (zone.is('.colorpicker-saturation')) {
        -                    this.currentSlider = $.extend({}, sl.saturation);
        -                } else if (zone.is('.colorpicker-hue')) {
        -                    this.currentSlider = $.extend({}, sl.hue);
        -                } else if (zone.is('.colorpicker-alpha')) {
        -                    this.currentSlider = $.extend({}, sl.alpha);
        -                } else {
        -                    return false;
        -                }
        -                var offset = zone.offset();
        -                //reference to guide's style
        -                this.currentSlider.guide = zone.find('i')[0].style;
        -                this.currentSlider.left = e.pageX - offset.left;
        -                this.currentSlider.top = e.pageY - offset.top;
        -                this.mousePointer = {
        -                    left: e.pageX,
        -                    top: e.pageY
        -                };
        -                //trigger mousemove to move the guide to the current position
        -                $(document).on({
        -                    'mousemove.colorpicker': $.proxy(this.mousemove, this),
        -                    'mouseup.colorpicker': $.proxy(this.mouseup, this)
        -                }).trigger('mousemove');
        -            }
        -            return false;
        -        },
        -        mousemove: function(e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -            var left = Math.max(
        -                0,
        -                Math.min(
        -                    this.currentSlider.maxLeft,
        -                    this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
        -                )
        -            );
        -            var top = Math.max(
        -                0,
        -                Math.min(
        -                    this.currentSlider.maxTop,
        -                    this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
        -                )
        -            );
        -            this.currentSlider.guide.left = left + 'px';
        -            this.currentSlider.guide.top = top + 'px';
        -            if (this.currentSlider.callLeft) {
        -                this.color[this.currentSlider.callLeft].call(this.color, left / 100);
        -            }
        -            if (this.currentSlider.callTop) {
        -                this.color[this.currentSlider.callTop].call(this.color, top / 100);
        -            }
        -            this.update(true);
        -
        -            this.element.trigger({
        -                type: 'changeColor',
        -                color: this.color
        -            });
        -            return false;
        -        },
        -        mouseup: function(e) {
        -            e.stopPropagation();
        -            e.preventDefault();
        -            $(document).off({
        -                'mousemove.colorpicker': this.mousemove,
        -                'mouseup.colorpicker': this.mouseup
        -            });
        -            return false;
        -        },
        -        keyup: function(e) {
        -            if ((e.keyCode === 38)) {
        -                if (this.color.value.a < 1) {
        -                    this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;
        -                }
        -                this.update(true);
        -            } else if ((e.keyCode === 40)) {
        -                if (this.color.value.a > 0) {
        -                    this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;
        -                }
        -                this.update(true);
        -            } else {
        -                var val = this.input.val();
        -                this.color = new Color(val);
        -                if (this.getValue(false) !== false) {
        -                    this.updateData();
        -                    this.updateComponent();
        -                    this.updatePicker();
        -                }
        -            }
        -            this.element.trigger({
        -                type: 'changeColor',
        -                color: this.color,
        -                value: val
        -            });
        -        }
        -    };
        -
        -    $.colorpicker = Colorpicker;
        -
        -    $.fn.colorpicker = function(option) {
        -        return this.each(function() {
        -            var $this = $(this),
        -                inst = $this.data('colorpicker'),
        -                options = ((typeof option === 'object') ? option : {});
        -            if ((!inst) && (typeof option !== 'string')) {
        -                $this.data('colorpicker', new Colorpicker(this, options));
        -            } else {
        -                if (typeof option === 'string') {
        -                    inst[option].apply(inst, Array.prototype.slice.call(arguments, 1));
        -                }
        -            }
        -        });
        -    };
        -
        -    $.fn.colorpicker.constructor = Colorpicker;
        -
        -})(window.jQuery);
        -
        -/**
        - * @author zhixin wen <wenzhixin2010@gmail.com>
        - * version: 1.9.1
        - * https://github.com/wenzhixin/bootstrap-table/
        - */
        -
        -!function ($) {
        -    'use strict';
        -
        -    // TOOLS DEFINITION
        -    // ======================
        -
        -    var cachedWidth = null;
        -
        -    // it only does '%s', and return '' when arguments are undefined
        -    var sprintf = function (str) {
        -        var args = arguments,
        -            flag = true,
        -            i = 1;
        -
        -        str = str.replace(/%s/g, function () {
        -            var arg = args[i++];
        -
        -            if (typeof arg === 'undefined') {
        -                flag = false;
        -                return '';
        -            }
        -            return arg;
        -        });
        -        return flag ? str : '';
        -    };
        -
        -    var getPropertyFromOther = function (list, from, to, value) {
        -        var result = '';
        -        $.each(list, function (i, item) {
        -            if (item[from] === value) {
        -                result = item[to];
        -                return false;
        -            }
        -            return true;
        -        });
        -        return result;
        -    };
        -
        -    var getFieldIndex = function (columns, field) {
        -        var index = -1;
        -
        -        $.each(columns, function (i, column) {
        -            if (column.field === field) {
        -                index = i;
        -                return false;
        -            }
        -            return true;
        -        });
        -        return index;
        -    };
        -
        -    // http://jsfiddle.net/wenyi/47nz7ez9/3/
        -    var setFieldIndex = function (columns) {
        -        var i, j, k,
        -            totalCol = 0,
        -            flag = [];
        -
        -        for (i = 0; i < columns[0].length; i++) {
        -            totalCol += columns[0][i].colspan || 1;
        -        }
        -
        -        for (i = 0; i < columns.length; i++) {
        -            flag[i] = [];
        -            for (j = 0; j < totalCol; j++) {
        -                flag[i][j] = false;
        -            }
        -        }
        -
        -        for (i = 0; i < columns.length; i++) {
        -            for (j = 0; j < columns[i].length; j++) {
        -                var r = columns[i][j],
        -                    rowspan = r.rowspan || 1,
        -                    colspan = r.colspan || 1,
        -                    index = $.inArray(false, flag[i]);
        -
        -                if (colspan === 1) {
        -                    r.fieldIndex = index;
        -                    // when field is undefined, use index instead
        -                    if (typeof r.field === 'undefined') {
        -                        r.field = index;
        -                    }
        -                }
        -
        -                for (k = 0; k < rowspan; k++) {
        -                    flag[i + k][index] = true;
        -                }
        -                for (k = 0; k < colspan; k++) {
        -                    flag[i][index + k] = true;
        -                }
        -            }
        -        }
        -    };
        -
        -    var getScrollBarWidth = function () {
        -        if (cachedWidth === null) {
        -            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),
        -                outer = $('<div/>').addClass('fixed-table-scroll-outer'),
        -                w1, w2;
        -
        -            outer.append(inner);
        -            $('body').append(outer);
        -
        -            w1 = inner[0].offsetWidth;
        -            outer.css('overflow', 'scroll');
        -            w2 = inner[0].offsetWidth;
        -
        -            if (w1 === w2) {
        -                w2 = outer[0].clientWidth;
        -            }
        -
        -            outer.remove();
        -            cachedWidth = w1 - w2;
        -        }
        -        return cachedWidth;
        -    };
        -
        -    var calculateObjectValue = function (self, name, args, defaultValue) {
        -        var func = name;
        -
        -        if (typeof name === 'string') {
        -            // support obj.func1.func2
        -            var names = name.split('.');
        -
        -            if (names.length > 1) {
        -                func = window;
        -                $.each(names, function (i, f) {
        -                    func = func[f];
        -                });
        -            } else {
        -                func = window[name];
        -            }
        -        }
        -        if (typeof func === 'object') {
        -            return func;
        -        }
        -        if (typeof func === 'function') {
        -            return func.apply(self, args);
        -        }
        -        if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {
        -            return sprintf.apply(this, [name].concat(args));
        -        }
        -        return defaultValue;
        -    };
        -
        -    var compareObjects = function (objectA, objectB, compareLength) {
        -        // Create arrays of property names
        -        var objectAProperties = Object.getOwnPropertyNames(objectA),
        -            objectBProperties = Object.getOwnPropertyNames(objectB),
        -            propName = '';
        -
        -        if (compareLength) {
        -            // If number of properties is different, objects are not equivalent
        -            if (objectAProperties.length !== objectBProperties.length) {
        -                return false;
        -            }
        -        }
        -
        -        for (var i = 0; i < objectAProperties.length; i++) {
        -            propName = objectAProperties[i];
        -
        -            // If the property is not in the object B properties, continue with the next property
        -            if ($.inArray(propName, objectBProperties) > -1) {
        -                // If values of same property are not equal, objects are not equivalent
        -                if (objectA[propName] !== objectB[propName]) {
        -                    return false;
        -                }
        -            }
        -        }
        -
        -        // If we made it this far, objects are considered equivalent
        -        return true;
        -    };
        -
        -    var escapeHTML = function (text) {
        -        if (typeof text === 'string') {
        -            return text
        -                .replace(/&/g, "&amp;")
        -                .replace(/</g, "&lt;")
        -                .replace(/>/g, "&gt;")
        -                .replace(/"/g, "&quot;")
        -                .replace(/'/g, "&#039;");
        -        }
        -        return text;
        -    };
        -
        -    var getRealHeight = function ($el) {
        -        var height = 0;
        -        $el.children().each(function () {
        -            if (height < $(this).outerHeight(true)) {
        -                height = $(this).outerHeight(true);
        -            }
        -        });
        -        return height;
        -    };
        -
        -    var getRealDataAttr = function (dataAttr) {
        -        for (var attr in dataAttr) {
        -            var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();
        -            if (auxAttr !== attr) {
        -                dataAttr[auxAttr] = dataAttr[attr];
        -                delete dataAttr[attr];
        -            }
        -        }
        -
        -        return dataAttr;
        -    };
        -
        -    var getItemField = function (item, field) {
        -        var value = item;
        -
        -        if (typeof field !== 'string' || item.hasOwnProperty(field)) {
        -            return item[field];
        -        }
        -        var props = field.split('.');
        -        for (var p in props) {
        -            value = value[props[p]];
        -        }
        -        return value;
        -    };
        -
        -    // BOOTSTRAP TABLE CLASS DEFINITION
        -    // ======================
        -
        -    var BootstrapTable = function (el, options) {
        -        this.options = options;
        -        this.$el = $(el);
        -        this.$el_ = this.$el.clone();
        -        this.timeoutId_ = 0;
        -        this.timeoutFooter_ = 0;
        -
        -        this.init();
        -    };
        -
        -    BootstrapTable.DEFAULTS = {
        -        classes: 'table table-hover',
        -        locale: undefined,
        -        height: undefined,
        -        undefinedText: '-',
        -        sortName: undefined,
        -        sortOrder: 'asc',
        -        striped: false,
        -        columns: [[]],
        -        data: [],
        -        dataField: 'rows',
        -        method: 'get',
        -        url: undefined,
        -        ajax: undefined,
        -        cache: true,
        -        contentType: 'application/json',
        -        dataType: 'json',
        -        ajaxOptions: {},
        -        queryParams: function (params) {
        -            return params;
        -        },
        -        queryParamsType: 'limit', // undefined
        -        responseHandler: function (res) {
        -            return res;
        -        },
        -        pagination: false,
        -        onlyInfoPagination: false,
        -        sidePagination: 'client', // client or server
        -        totalRows: 0, // server side need to set
        -        pageNumber: 1,
        -        pageSize: 10,
        -        pageList: [10, 25, 50, 100],
        -        paginationHAlign: 'right', //right, left
        -        paginationVAlign: 'bottom', //bottom, top, both
        -        paginationDetailHAlign: 'left', //right, left
        -        paginationFirstText: '&laquo;',
        -        paginationPreText: '&lsaquo;',
        -        paginationNextText: '&rsaquo;',
        -        paginationLastText: '&raquo;',
        -        search: false,
        -        strictSearch: false,
        -        searchAlign: 'right',
        -        selectItemName: 'btSelectItem',
        -        showHeader: true,
        -        showFooter: false,
        -        showColumns: false,
        -        showPaginationSwitch: false,
        -        showRefresh: false,
        -        showToggle: false,
        -        buttonsAlign: 'right',
        -        smartDisplay: true,
        -        minimumCountColumns: 1,
        -        idField: undefined,
        -        uniqueId: undefined,
        -        cardView: false,
        -        detailView: false,
        -        detailFormatter: function (index, row) {
        -            return '';
        -        },
        -        trimOnSearch: true,
        -        clickToSelect: false,
        -        singleSelect: false,
        -        toolbar: undefined,
        -        toolbarAlign: 'left',
        -        checkboxHeader: true,
        -        sortable: true,
        -        silentSort: true,
        -        maintainSelected: false,
        -        searchTimeOut: 500,
        -        searchText: '',
        -        iconSize: undefined,
        -        iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome)
        -        icons: {
        -            paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',
        -            paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',
        -            refresh: 'glyphicon-refresh icon-refresh',
        -            toggle: 'glyphicon-list-alt icon-list-alt',
        -            columns: 'glyphicon-th icon-th',
        -            detailOpen: 'glyphicon-plus icon-plus',
        -            detailClose: 'glyphicon-minus icon-minus'
        -        },
        -
        -        rowStyle: function (row, index) {
        -            return {};
        -        },
        -
        -        rowAttributes: function (row, index) {
        -            return {};
        -        },
        -
        -        onAll: function (name, args) {
        -            return false;
        -        },
        -        onClickCell: function (field, value, row, $element) {
        -            return false;
        -        },
        -        onDblClickCell: function (field, value, row, $element) {
        -            return false;
        -        },
        -        onClickRow: function (item, $element) {
        -            return false;
        -        },
        -        onDblClickRow: function (item, $element) {
        -            return false;
        -        },
        -        onSort: function (name, order) {
        -            return false;
        -        },
        -        onCheck: function (row) {
        -            return false;
        -        },
        -        onUncheck: function (row) {
        -            return false;
        -        },
        -        onCheckAll: function (rows) {
        -            return false;
        -        },
        -        onUncheckAll: function (rows) {
        -            return false;
        -        },
        -        onCheckSome: function (rows) {
        -            return false;
        -        },
        -        onUncheckSome: function (rows) {
        -            return false;
        -        },
        -        onLoadSuccess: function (data) {
        -            return false;
        -        },
        -        onLoadError: function (status) {
        -            return false;
        -        },
        -        onColumnSwitch: function (field, checked) {
        -            return false;
        -        },
        -        onPageChange: function (number, size) {
        -            return false;
        -        },
        -        onSearch: function (text) {
        -            return false;
        -        },
        -        onToggle: function (cardView) {
        -            return false;
        -        },
        -        onPreBody: function (data) {
        -            return false;
        -        },
        -        onPostBody: function () {
        -            return false;
        -        },
        -        onPostHeader: function () {
        -            return false;
        -        },
        -        onExpandRow: function (index, row, $detail) {
        -            return false;
        -        },
        -        onCollapseRow: function (index, row) {
        -            return false;
        -        },
        -        onRefreshOptions: function (options) {
        -            return false;
        -        },
        -        onResetView: function () {
        -            return false;
        -        }
        -    };
        -
        -    BootstrapTable.LOCALES = [];
        -
        -    BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {
        -        formatLoadingMessage: function () {
        -            return 'Loading, please wait...';
        -        },
        -        formatRecordsPerPage: function (pageNumber) {
        -            return sprintf('%s records per page', pageNumber);
        -        },
        -        formatShowingRows: function (pageFrom, pageTo, totalRows) {
        -            return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows);
        -        },
        -        formatDetailPagination: function (totalRows) {
        -            return sprintf('Showing %s rows', totalRows);
        -        },
        -        formatSearch: function () {
        -            return 'Search';
        -        },
        -        formatNoMatches: function () {
        -            return 'No matching records found';
        -        },
        -        formatPaginationSwitch: function () {
        -            return 'Hide/Show pagination';
        -        },
        -        formatRefresh: function () {
        -            return 'Refresh';
        -        },
        -        formatToggle: function () {
        -            return 'Toggle';
        -        },
        -        formatColumns: function () {
        -            return 'Columns';
        -        },
        -        formatAllRows: function () {
        -            return 'All';
        -        }
        -    };
        -
        -    $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']);
        -
        -    BootstrapTable.COLUMN_DEFAULTS = {
        -        radio: false,
        -        checkbox: false,
        -        checkboxEnabled: true,
        -        field: undefined,
        -        title: undefined,
        -        titleTooltip: undefined,
        -        'class': undefined,
        -        align: undefined, // left, right, center
        -        halign: undefined, // left, right, center
        -        falign: undefined, // left, right, center
        -        valign: undefined, // top, middle, bottom
        -        width: undefined,
        -        sortable: false,
        -        order: 'asc', // asc, desc
        -        visible: true,
        -        switchable: true,
        -        clickToSelect: true,
        -        formatter: undefined,
        -        footerFormatter: undefined,
        -        events: undefined,
        -        sorter: undefined,
        -        sortName: undefined,
        -        cellStyle: undefined,
        -        searchable: true,
        -        searchFormatter: true,
        -        cardVisible: true
        -    };
        -
        -    BootstrapTable.EVENTS = {
        -        'all.bs.table': 'onAll',
        -        'click-cell.bs.table': 'onClickCell',
        -        'dbl-click-cell.bs.table': 'onDblClickCell',
        -        'click-row.bs.table': 'onClickRow',
        -        'dbl-click-row.bs.table': 'onDblClickRow',
        -        'sort.bs.table': 'onSort',
        -        'check.bs.table': 'onCheck',
        -        'uncheck.bs.table': 'onUncheck',
        -        'check-all.bs.table': 'onCheckAll',
        -        'uncheck-all.bs.table': 'onUncheckAll',
        -        'check-some.bs.table': 'onCheckSome',
        -        'uncheck-some.bs.table': 'onUncheckSome',
        -        'load-success.bs.table': 'onLoadSuccess',
        -        'load-error.bs.table': 'onLoadError',
        -        'column-switch.bs.table': 'onColumnSwitch',
        -        'page-change.bs.table': 'onPageChange',
        -        'search.bs.table': 'onSearch',
        -        'toggle.bs.table': 'onToggle',
        -        'pre-body.bs.table': 'onPreBody',
        -        'post-body.bs.table': 'onPostBody',
        -        'post-header.bs.table': 'onPostHeader',
        -        'expand-row.bs.table': 'onExpandRow',
        -        'collapse-row.bs.table': 'onCollapseRow',
        -        'refresh-options.bs.table': 'onRefreshOptions',
        -        'reset-view.bs.table': 'onResetView'
        -    };
        -
        -    BootstrapTable.prototype.init = function () {
        -        this.initLocale();
        -        this.initContainer();
        -        this.initTable();
        -        this.initHeader();
        -        this.initData();
        -        this.initFooter();
        -        this.initToolbar();
        -        this.initPagination();
        -        this.initBody();
        -        this.initSearchText();
        -        this.initServer();
        -    };
        -
        -    BootstrapTable.prototype.initLocale = function () {
        -        if (this.options.locale) {
        -            var parts = this.options.locale.split(/-|_/);
        -            parts[0].toLowerCase();
        -            parts[1] && parts[1].toUpperCase();
        -            if ($.fn.bootstrapTable.locales[this.options.locale]) {
        -                // locale as requested
        -                $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);
        -            } else if ($.fn.bootstrapTable.locales[parts.join('-')]) {
        -                // locale with sep set to - (in case original was specified with _)
        -                $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);
        -            } else if ($.fn.bootstrapTable.locales[parts[0]]) {
        -                // short locale language code (i.e. 'en')
        -                $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initContainer = function () {
        -        this.$container = $([
        -            '<div class="bootstrap-table">',
        -            '<div class="fixed-table-toolbar"></div>',
        -            this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
        -                '<div class="fixed-table-pagination" style="clear: both;"></div>' :
        -                '',
        -            '<div class="fixed-table-container">',
        -            '<div class="fixed-table-header"><table></table></div>',
        -            '<div class="fixed-table-body">',
        -            '<div class="fixed-table-loading">',
        -            this.options.formatLoadingMessage(),
        -            '</div>',
        -            '</div>',
        -            '<div class="fixed-table-footer"><table><tr></tr></table></div>',
        -            this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?
        -                '<div class="fixed-table-pagination"></div>' :
        -                '',
        -            '</div>',
        -            '</div>'
        -        ].join(''));
        -
        -        this.$container.insertAfter(this.$el);
        -        this.$tableContainer = this.$container.find('.fixed-table-container');
        -        this.$tableHeader = this.$container.find('.fixed-table-header');
        -        this.$tableBody = this.$container.find('.fixed-table-body');
        -        this.$tableLoading = this.$container.find('.fixed-table-loading');
        -        this.$tableFooter = this.$container.find('.fixed-table-footer');
        -        this.$toolbar = this.$container.find('.fixed-table-toolbar');
        -        this.$pagination = this.$container.find('.fixed-table-pagination');
        -
        -        this.$tableBody.append(this.$el);
        -        this.$container.after('<div class="clearfix"></div>');
        -
        -        this.$el.addClass(this.options.classes);
        -        if (this.options.striped) {
        -            this.$el.addClass('table-striped');
        -        }
        -        if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) {
        -            this.$tableContainer.addClass('table-no-bordered');
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initTable = function () {
        -        var that = this,
        -            columns = [],
        -            data = [];
        -
        -        this.$header = this.$el.find('>thead');
        -        if (!this.$header.length) {
        -            this.$header = $('<thead></thead>').appendTo(this.$el);
        -        }
        -        this.$header.find('tr').each(function () {
        -            var column = [];
        -
        -            $(this).find('th').each(function () {
        -                column.push($.extend({}, {
        -                    title: $(this).html(),
        -                    'class': $(this).attr('class'),
        -                    titleTooltip: $(this).attr('title'),
        -                    rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,
        -                    colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined
        -                }, $(this).data()));
        -            });
        -            columns.push(column);
        -        });
        -        if (!$.isArray(this.options.columns[0])) {
        -            this.options.columns = [this.options.columns];
        -        }
        -        this.options.columns = $.extend(true, [], columns, this.options.columns);
        -        this.columns = [];
        -
        -        setFieldIndex(this.options.columns);
        -        $.each(this.options.columns, function (i, columns) {
        -            $.each(columns, function (j, column) {
        -                column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column);
        -
        -                if (typeof column.fieldIndex !== 'undefined') {
        -                    that.columns[column.fieldIndex] = column;
        -                }
        -
        -                that.options.columns[i][j] = column;
        -            });
        -        });
        -
        -        // if options.data is setting, do not process tbody data
        -        if (this.options.data.length) {
        -            return;
        -        }
        -
        -        this.$el.find('>tbody>tr').each(function () {
        -            var row = {};
        -
        -            // save tr's id, class and data-* attributes
        -            row._id = $(this).attr('id');
        -            row._class = $(this).attr('class');
        -            row._data = getRealDataAttr($(this).data());
        -
        -            $(this).find('td').each(function (i) {
        -                var field = that.columns[i].field;
        -
        -                row[field] = $(this).html();
        -                // save td's id, class and data-* attributes
        -                row['_' + field + '_id'] = $(this).attr('id');
        -                row['_' + field + '_class'] = $(this).attr('class');
        -                row['_' + field + '_rowspan'] = $(this).attr('rowspan');
        -                row['_' + field + '_title'] = $(this).attr('title');
        -                row['_' + field + '_data'] = getRealDataAttr($(this).data());
        -            });
        -            data.push(row);
        -        });
        -        this.options.data = data;
        -    };
        -
        -    BootstrapTable.prototype.initHeader = function () {
        -        var that = this,
        -            visibleColumns = {},
        -            html = [];
        -
        -        this.header = {
        -            fields: [],
        -            styles: [],
        -            classes: [],
        -            formatters: [],
        -            events: [],
        -            sorters: [],
        -            sortNames: [],
        -            cellStyles: [],
        -            searchables: []
        -        };
        -
        -        $.each(this.options.columns, function (i, columns) {
        -            html.push('<tr>');
        -
        -            if (i == 0 && !that.options.cardView && that.options.detailView) {
        -                html.push(sprintf('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',
        -                    that.options.columns.length));
        -            }
        -
        -            $.each(columns, function (j, column) {
        -                var text = '',
        -                    halign = '', // header align style
        -                    align = '', // body align style
        -                    style = '',
        -                    class_ = sprintf(' class="%s"', column['class']),
        -                    order = that.options.sortOrder || column.order,
        -                    unitWidth = 'px',
        -                    width = column.width;
        -
        -                if (column.width !== undefined && (!that.options.cardView)) {
        -                    if (typeof column.width === 'string') {
        -                        if (column.width.indexOf('%') !== -1) {
        -                            unitWidth = '%';
        -                        }
        -                    }
        -                }
        -                if (column.width && typeof column.width === 'string') {
        -                    width = column.width.replace('%', '').replace('px', '');
        -                }
        -
        -                halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align);
        -                align = sprintf('text-align: %s; ', column.align);
        -                style = sprintf('vertical-align: %s; ', column.valign);
        -                style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ?
        -                    '36px' : (width ? width + unitWidth : undefined));
        -
        -                if (typeof column.fieldIndex !== 'undefined') {
        -                    that.header.fields[column.fieldIndex] = column.field;
        -                    that.header.styles[column.fieldIndex] = align + style;
        -                    that.header.classes[column.fieldIndex] = class_;
        -                    that.header.formatters[column.fieldIndex] = column.formatter;
        -                    that.header.events[column.fieldIndex] = column.events;
        -                    that.header.sorters[column.fieldIndex] = column.sorter;
        -                    that.header.sortNames[column.fieldIndex] = column.sortName;
        -                    that.header.cellStyles[column.fieldIndex] = column.cellStyle;
        -                    that.header.searchables[column.fieldIndex] = column.searchable;
        -
        -                    if (!column.visible) {
        -                        return;
        -                    }
        -
        -                    if (that.options.cardView && (!column.cardVisible)) {
        -                        return;
        -                    }
        -
        -                    visibleColumns[column.field] = column;
        -                }
        -
        -                html.push('<th' + sprintf(' title="%s"', column.titleTooltip),
        -                    column.checkbox || column.radio ?
        -                        sprintf(' class="bs-checkbox %s"', column['class'] || '') :
        -                        class_,
        -                    sprintf(' style="%s"', halign + style),
        -                    sprintf(' rowspan="%s"', column.rowspan),
        -                    sprintf(' colspan="%s"', column.colspan),
        -                    sprintf(' data-field="%s"', column.field),
        -                    "tabindex='0'",
        -                    '>');
        -
        -                html.push(sprintf('<div class="th-inner %s">', that.options.sortable && column.sortable ?
        -                    'sortable both' : ''));
        -
        -                text = column.title;
        -
        -                if (column.checkbox) {
        -                    if (!that.options.singleSelect && that.options.checkboxHeader) {
        -                        text = '<input name="btSelectAll" type="checkbox" />';
        -                    }
        -                    that.header.stateField = column.field;
        -                }
        -                if (column.radio) {
        -                    text = '';
        -                    that.header.stateField = column.field;
        -                    that.options.singleSelect = true;
        -                }
        -
        -                html.push(text);
        -                html.push('</div>');
        -                html.push('<div class="fht-cell"></div>');
        -                html.push('</div>');
        -                html.push('</th>');
        -            });
        -            html.push('</tr>');
        -        });
        -
        -        this.$header.html(html.join(''));
        -        this.$header.find('th[data-field]').each(function (i) {
        -            $(this).data(visibleColumns[$(this).data('field')]);
        -        });
        -        this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {
        -            if (that.options.sortable && $(this).parent().data().sortable) {
        -                that.onSort(event);
        -            }
        -        });
        -
        -        this.$header.children().children().off('keypress').on('keypress', function (event) {
        -            if (that.options.sortable && $(this).data().sortable) {
        -                var code = event.keyCode || event.which;
        -                if (code == 13) { //Enter keycode
        -                    that.onSort(event);
        -                }
        -            }
        -        });
        -
        -        if (!this.options.showHeader || this.options.cardView) {
        -            this.$header.hide();
        -            this.$tableHeader.hide();
        -            this.$tableLoading.css('top', 0);
        -        } else {
        -            this.$header.show();
        -            this.$tableHeader.show();
        -            this.$tableLoading.css('top', this.$header.outerHeight() + 1);
        -            // Assign the correct sortable arrow
        -            this.getCaret();
        -        }
        -
        -        this.$selectAll = this.$header.find('[name="btSelectAll"]');
        -        this.$container.off('click', '[name="btSelectAll"]')
        -            .on('click', '[name="btSelectAll"]', function () {
        -                var checked = $(this).prop('checked');
        -                that[checked ? 'checkAll' : 'uncheckAll']();
        -                that.updateSelected();
        -            });
        -    };
        -
        -    BootstrapTable.prototype.initFooter = function () {
        -        if (!this.options.showFooter || this.options.cardView) {
        -            this.$tableFooter.hide();
        -        } else {
        -            this.$tableFooter.show();
        -        }
        -    };
        -
        -    /**
        -     * @param data
        -     * @param type: append / prepend
        -     */
        -    BootstrapTable.prototype.initData = function (data, type) {
        -        if (type === 'append') {
        -            this.data = this.data.concat(data);
        -        } else if (type === 'prepend') {
        -            this.data = [].concat(data).concat(this.data);
        -        } else {
        -            this.data = data || this.options.data;
        -        }
        -
        -        // Fix #839 Records deleted when adding new row on filtered table
        -        if (type === 'append') {
        -            this.options.data = this.options.data.concat(data);
        -        } else if (type === 'prepend') {
        -            this.options.data = [].concat(data).concat(this.options.data);
        -        } else {
        -            this.options.data = this.data;
        -        }
        -
        -        if (this.options.sidePagination === 'server') {
        -            return;
        -        }
        -        this.initSort();
        -    };
        -
        -    BootstrapTable.prototype.initSort = function () {
        -        var that = this,
        -            name = this.options.sortName,
        -            order = this.options.sortOrder === 'desc' ? -1 : 1,
        -            index = $.inArray(this.options.sortName, this.header.fields);
        -
        -        if (index !== -1) {
        -            this.data.sort(function (a, b) {
        -                if (that.header.sortNames[index]) {
        -                    name = that.header.sortNames[index];
        -                }
        -                var aa = getItemField(a, name),
        -                    bb = getItemField(b, name),
        -                    value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]);
        -
        -                if (value !== undefined) {
        -                    return order * value;
        -                }
        -
        -                // Fix #161: undefined or null string sort bug.
        -                if (aa === undefined || aa === null) {
        -                    aa = '';
        -                }
        -                if (bb === undefined || bb === null) {
        -                    bb = '';
        -                }
        -
        -                // IF both values are numeric, do a numeric comparison
        -                if ($.isNumeric(aa) && $.isNumeric(bb)) {
        -                    // Convert numerical values form string to float.
        -                    aa = parseFloat(aa);
        -                    bb = parseFloat(bb);
        -                    if (aa < bb) {
        -                        return order * -1;
        -                    }
        -                    return order;
        -                }
        -
        -                if (aa === bb) {
        -                    return 0;
        -                }
        -
        -                // If value is not a string, convert to string
        -                if (typeof aa !== 'string') {
        -                    aa = aa.toString();
        -                }
        -
        -                if (aa.localeCompare(bb) === -1) {
        -                    return order * -1;
        -                }
        -
        -                return order;
        -            });
        -        }
        -    };
        -
        -    BootstrapTable.prototype.onSort = function (event) {
        -        var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(),
        -            $this_ = this.$header.find('th').eq($this.index());
        -
        -        this.$header.add(this.$header_).find('span.order').remove();
        -
        -        if (this.options.sortName === $this.data('field')) {
        -            this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';
        -        } else {
        -            this.options.sortName = $this.data('field');
        -            this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';
        -        }
        -        this.trigger('sort', this.options.sortName, this.options.sortOrder);
        -
        -        $this.add($this_).data('order', this.options.sortOrder);
        -
        -        // Assign the correct sortable arrow
        -        this.getCaret();
        -
        -        if (this.options.sidePagination === 'server') {
        -            this.initServer(this.options.silentSort);
        -            return;
        -        }
        -
        -        this.initSort();
        -        this.initBody();
        -    };
        -
        -    BootstrapTable.prototype.initToolbar = function () {
        -        var that = this,
        -            html = [],
        -            timeoutId = 0,
        -            $keepOpen,
        -            $search,
        -            switchableCount = 0;
        -
        -        this.$toolbar.html('');
        -
        -        if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {
        -            $(sprintf('<div class="bars pull-%s"></div>', this.options.toolbarAlign))
        -                .appendTo(this.$toolbar)
        -                .append($(this.options.toolbar));
        -        }
        -
        -        // showColumns, showToggle, showRefresh
        -        html = [sprintf('<div class="columns columns-%s btn-group pull-%s">',
        -            this.options.buttonsAlign, this.options.buttonsAlign)];
        -
        -        if (typeof this.options.icons === 'string') {
        -            this.options.icons = calculateObjectValue(null, this.options.icons);
        -        }
        -
        -        if (this.options.showPaginationSwitch) {
        -            html.push(sprintf('<button class="btn btn-default" type="button" name="paginationSwitch" title="%s">',
        -                    this.options.formatPaginationSwitch()),
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),
        -                '</button>');
        -        }
        -
        -        if (this.options.showRefresh) {
        -            html.push(sprintf('<button class="btn btn-default' +
        -                    sprintf(' btn-%s', this.options.iconSize) +
        -                    '" type="button" name="refresh" title="%s">',
        -                    this.options.formatRefresh()),
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.refresh),
        -                '</button>');
        -        }
        -
        -        if (this.options.showToggle) {
        -            html.push(sprintf('<button class="btn btn-default' +
        -                    sprintf(' btn-%s', this.options.iconSize) +
        -                    '" type="button" name="toggle" title="%s">',
        -                    this.options.formatToggle()),
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.toggle),
        -                '</button>');
        -        }
        -
        -        if (this.options.showColumns) {
        -            html.push(sprintf('<div class="keep-open btn-group" title="%s">',
        -                    this.options.formatColumns()),
        -                '<button type="button" class="btn btn-default' +
        -                sprintf(' btn-%s', this.options.iconSize) +
        -                ' dropdown-toggle" data-toggle="dropdown">',
        -                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.columns),
        -                ' <span class="caret"></span>',
        -                '</button>',
        -                '<ul class="dropdown-menu" role="menu">');
        -
        -            $.each(this.columns, function (i, column) {
        -                if (column.radio || column.checkbox) {
        -                    return;
        -                }
        -
        -                if (that.options.cardView && (!column.cardVisible)) {
        -                    return;
        -                }
        -
        -                var checked = column.visible ? ' checked="checked"' : '';
        -
        -                if (column.switchable) {
        -                    html.push(sprintf('<li>' +
        -                        '<label><input type="checkbox" data-field="%s" value="%s"%s> %s</label>' +
        -                        '</li>', column.field, i, checked, column.title));
        -                    switchableCount++;
        -                }
        -            });
        -            html.push('</ul>',
        -                '</div>');
        -        }
        -
        -        html.push('</div>');
        -
        -        // Fix #188: this.showToolbar is for extentions
        -        if (this.showToolbar || html.length > 2) {
        -            this.$toolbar.append(html.join(''));
        -        }
        -
        -        if (this.options.showPaginationSwitch) {
        -            this.$toolbar.find('button[name="paginationSwitch"]')
        -                .off('click').on('click', $.proxy(this.togglePagination, this));
        -        }
        -
        -        if (this.options.showRefresh) {
        -            this.$toolbar.find('button[name="refresh"]')
        -                .off('click').on('click', $.proxy(this.refresh, this));
        -        }
        -
        -        if (this.options.showToggle) {
        -            this.$toolbar.find('button[name="toggle"]')
        -                .off('click').on('click', function () {
        -                    that.toggleView();
        -                });
        -        }
        -
        -        if (this.options.showColumns) {
        -            $keepOpen = this.$toolbar.find('.keep-open');
        -
        -            if (switchableCount <= this.options.minimumCountColumns) {
        -                $keepOpen.find('input').prop('disabled', true);
        -            }
        -
        -            $keepOpen.find('li').off('click').on('click', function (event) {
        -                event.stopImmediatePropagation();
        -            });
        -            $keepOpen.find('input').off('click').on('click', function () {
        -                var $this = $(this);
        -
        -                that.toggleColumn(getFieldIndex(that.columns,
        -                    $(this).data('field')), $this.prop('checked'), false);
        -                that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));
        -            });
        -        }
        -
        -        if (this.options.search) {
        -            html = [];
        -            html.push(
        -                '<div class="pull-' + this.options.searchAlign + ' search">',
        -                sprintf('<input class="form-control' +
        -                    sprintf(' input-%s', this.options.iconSize) +
        -                    '" type="text" placeholder="%s">',
        -                    this.options.formatSearch()),
        -                '</div>');
        -
        -            this.$toolbar.append(html.join(''));
        -            $search = this.$toolbar.find('.search input');
        -            $search.off('keyup drop').on('keyup drop', function (event) {
        -                clearTimeout(timeoutId); // doesn't matter if it's 0
        -                timeoutId = setTimeout(function () {
        -                    that.onSearch(event);
        -                }, that.options.searchTimeOut);
        -            });
        -        }
        -    };
        -
        -    BootstrapTable.prototype.onSearch = function (event) {
        -        var text = $.trim($(event.currentTarget).val());
        -
        -        // trim search input
        -        if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {
        -            $(event.currentTarget).val(text);
        -        }
        -
        -        if (text === this.searchText) {
        -            return;
        -        }
        -        this.searchText = text;
        -
        -        this.options.pageNumber = 1;
        -        this.initSearch();
        -        this.updatePagination();
        -        this.trigger('search', text);
        -    };
        -
        -    BootstrapTable.prototype.initSearch = function () {
        -        var that = this;
        -
        -        if (this.options.sidePagination !== 'server') {
        -            var s = this.searchText && this.searchText.toLowerCase();
        -            var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns;
        -
        -            // Check filter
        -            this.data = f ? $.grep(this.options.data, function (item, i) {
        -                for (var key in f) {
        -                    if ($.isArray(f[key])) {
        -                        if ($.inArray(item[key], f[key]) === -1) {
        -                            return false;
        -                        }
        -                    } else if (item[key] !== f[key]) {
        -                        return false;
        -                    }
        -                }
        -                return true;
        -            }) : this.options.data;
        -
        -            this.data = s ? $.grep(this.data, function (item, i) {
        -                for (var key in item) {
        -                    key = $.isNumeric(key) ? parseInt(key, 10) : key;
        -                    var value = item[key],
        -                        column = that.columns[getFieldIndex(that.columns, key)],
        -                        j = $.inArray(key, that.header.fields);
        -
        -                    // Fix #142: search use formated data
        -                    if (column && column.searchFormatter) {
        -                        value = calculateObjectValue(column,
        -                            that.header.formatters[j], [value, item, i], value);
        -                    }
        -
        -                    var index = $.inArray(key, that.header.fields);
        -                    if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
        -                        if (that.options.strictSearch) {
        -                            if ((value + '').toLowerCase() === s) {
        -                                return true;
        -                            }
        -                        } else {
        -                            if ((value + '').toLowerCase().indexOf(s) !== -1) {
        -                                return true;
        -                            }
        -                        }
        -                    }
        -                }
        -                return false;
        -            }) : this.data;
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initPagination = function () {
        -        if (!this.options.pagination) {
        -            this.$pagination.hide();
        -            return;
        -        } else {
        -            this.$pagination.show();
        -        }
        -
        -        var that = this,
        -            html = [],
        -            $allSelected = false,
        -            i, from, to,
        -            $pageList,
        -            $first, $pre,
        -            $next, $last,
        -            $number,
        -            data = this.getData();
        -
        -        if (this.options.sidePagination !== 'server') {
        -            this.options.totalRows = data.length;
        -        }
        -
        -        this.totalPages = 0;
        -        if (this.options.totalRows) {
        -            if (this.options.pageSize === this.options.formatAllRows()) {
        -                this.options.pageSize = this.options.totalRows;
        -                $allSelected = true;
        -            } else if (this.options.pageSize === this.options.totalRows) {
        -                // Fix #667 Table with pagination,
        -                // multiple pages and a search that matches to one page throws exception
        -                var pageLst = typeof this.options.pageList === 'string' ?
        -                    this.options.pageList.replace('[', '').replace(']', '')
        -                        .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList;
        -                if ($.inArray(this.options.formatAllRows().toLowerCase(), pageLst)  > -1) {
        -                    $allSelected = true;
        -                }
        -            }
        -
        -            this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1;
        -
        -            this.options.totalPages = this.totalPages;
        -        }
        -        if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) {
        -            this.options.pageNumber = this.totalPages;
        -        }
        -
        -        this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1;
        -        this.pageTo = this.options.pageNumber * this.options.pageSize;
        -        if (this.pageTo > this.options.totalRows) {
        -            this.pageTo = this.options.totalRows;
        -        }
        -
        -        html.push(
        -            '<div class="pull-' + this.options.paginationDetailHAlign + ' pagination-detail">',
        -            '<span class="pagination-info">',
        -            this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) :
        -            this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows),
        -            '</span>');
        -
        -        if (!this.options.onlyInfoPagination) {
        -            html.push('<span class="page-list">');
        -
        -            var pageNumber = [
        -                    sprintf('<span class="btn-group %s">',
        -                        this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
        -                            'dropdown' : 'dropup'),
        -                    '<button type="button" class="btn btn-default ' +
        -                    sprintf(' btn-%s', this.options.iconSize) +
        -                    ' dropdown-toggle" data-toggle="dropdown">',
        -                    '<span class="page-size">',
        -                    $allSelected ? this.options.formatAllRows() : this.options.pageSize,
        -                    '</span>',
        -                    ' <span class="caret"></span>',
        -                    '</button>',
        -                    '<ul class="dropdown-menu" role="menu">'
        -                ],
        -                pageList = this.options.pageList;
        -
        -            if (typeof this.options.pageList === 'string') {
        -                var list = this.options.pageList.replace('[', '').replace(']', '')
        -                    .replace(/ /g, '').split(',');
        -
        -                pageList = [];
        -                $.each(list, function (i, value) {
        -                    pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ?
        -                        that.options.formatAllRows() : +value);
        -                });
        -            }
        -
        -            $.each(pageList, function (i, page) {
        -                if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) {
        -                    var active;
        -                    if ($allSelected) {
        -                        active = page === that.options.formatAllRows() ? ' class="active"' : '';
        -                    } else {
        -                        active = page === that.options.pageSize ? ' class="active"' : '';
        -                    }
        -                    pageNumber.push(sprintf('<li%s><a href="javascript:void(0)">%s</a></li>', active, page));
        -                }
        -            });
        -            pageNumber.push('</ul></span>');
        -
        -            html.push(this.options.formatRecordsPerPage(pageNumber.join('')));
        -            html.push('</span>');
        -
        -            html.push('</div>',
        -                '<div class="pull-' + this.options.paginationHAlign + ' pagination">',
        -                '<ul class="pagination' + sprintf(' pagination-%s', this.options.iconSize) + '">',
        -                '<li class="page-first"><a href="javascript:void(0)">' + this.options.paginationFirstText + '</a></li>',
        -                '<li class="page-pre"><a href="javascript:void(0)">' + this.options.paginationPreText + '</a></li>');
        -
        -            if (this.totalPages < 5) {
        -                from = 1;
        -                to = this.totalPages;
        -            } else {
        -                from = this.options.pageNumber - 2;
        -                to = from + 4;
        -                if (from < 1) {
        -                    from = 1;
        -                    to = 5;
        -                }
        -                if (to > this.totalPages) {
        -                    to = this.totalPages;
        -                    from = to - 4;
        -                }
        -            }
        -            for (i = from; i <= to; i++) {
        -                html.push('<li class="page-number' + (i === this.options.pageNumber ? ' active' : '') + '">',
        -                    '<a href="javascript:void(0)">', i, '</a>',
        -                    '</li>');
        -            }
        -
        -            html.push(
        -                '<li class="page-next"><a href="javascript:void(0)">' + this.options.paginationNextText + '</a></li>',
        -                '<li class="page-last"><a href="javascript:void(0)">' + this.options.paginationLastText + '</a></li>',
        -                '</ul>',
        -                '</div>');
        -
        -        }
        -        this.$pagination.html(html.join(''));
        -
        -        if (!this.options.onlyInfoPagination) {
        -            $pageList = this.$pagination.find('.page-list a');
        -            $first = this.$pagination.find('.page-first');
        -            $pre = this.$pagination.find('.page-pre');
        -            $next = this.$pagination.find('.page-next');
        -            $last = this.$pagination.find('.page-last');
        -            $number = this.$pagination.find('.page-number');
        -
        -            if (this.options.pageNumber <= 1) {
        -                $first.addClass('disabled');
        -                $pre.addClass('disabled');
        -            }
        -            if (this.options.pageNumber >= this.totalPages) {
        -                $next.addClass('disabled');
        -                $last.addClass('disabled');
        -            }
        -            if (this.options.smartDisplay) {
        -                if (this.totalPages <= 1) {
        -                    this.$pagination.find('div.pagination').hide();
        -                }
        -                if (pageList.length < 2 || this.options.totalRows <= pageList[0]) {
        -                    this.$pagination.find('span.page-list').hide();
        -                }
        -
        -                // when data is empty, hide the pagination
        -                this.$pagination[this.getData().length ? 'show' : 'hide']();
        -            }
        -            if ($allSelected) {
        -                this.options.pageSize = this.options.formatAllRows();
        -            }
        -            $pageList.off('click').on('click', $.proxy(this.onPageListChange, this));
        -            $first.off('click').on('click', $.proxy(this.onPageFirst, this));
        -            $pre.off('click').on('click', $.proxy(this.onPagePre, this));
        -            $next.off('click').on('click', $.proxy(this.onPageNext, this));
        -            $last.off('click').on('click', $.proxy(this.onPageLast, this));
        -            $number.off('click').on('click', $.proxy(this.onPageNumber, this));
        -        }
        -    };
        -
        -    BootstrapTable.prototype.updatePagination = function (event) {
        -        // Fix #171: IE disabled button can be clicked bug.
        -        if (event && $(event.currentTarget).hasClass('disabled')) {
        -            return;
        -        }
        -
        -        if (!this.options.maintainSelected) {
        -            this.resetRows();
        -        }
        -
        -        this.initPagination();
        -        if (this.options.sidePagination === 'server') {
        -            this.initServer();
        -        } else {
        -            this.initBody();
        -        }
        -
        -        this.trigger('page-change', this.options.pageNumber, this.options.pageSize);
        -    };
        -
        -    BootstrapTable.prototype.onPageListChange = function (event) {
        -        var $this = $(event.currentTarget);
        -
        -        $this.parent().addClass('active').siblings().removeClass('active');
        -        this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?
        -            this.options.formatAllRows() : +$this.text();
        -        this.$toolbar.find('.page-size').text(this.options.pageSize);
        -
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageFirst = function (event) {
        -        this.options.pageNumber = 1;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPagePre = function (event) {
        -        this.options.pageNumber--;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageNext = function (event) {
        -        this.options.pageNumber++;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageLast = function (event) {
        -        this.options.pageNumber = this.totalPages;
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.onPageNumber = function (event) {
        -        if (this.options.pageNumber === +$(event.currentTarget).text()) {
        -            return;
        -        }
        -        this.options.pageNumber = +$(event.currentTarget).text();
        -        this.updatePagination(event);
        -    };
        -
        -    BootstrapTable.prototype.initBody = function (fixedScroll) {
        -        var that = this,
        -            html = [],
        -            data = this.getData();
        -
        -        this.trigger('pre-body', data);
        -
        -        this.$body = this.$el.find('>tbody');
        -        if (!this.$body.length) {
        -            this.$body = $('<tbody></tbody>').appendTo(this.$el);
        -        }
        -
        -        //Fix #389 Bootstrap-table-flatJSON is not working
        -
        -        if (!this.options.pagination || this.options.sidePagination === 'server') {
        -            this.pageFrom = 1;
        -            this.pageTo = data.length;
        -        }
        -
        -        for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
        -            var key,
        -                item = data[i],
        -                style = {},
        -                csses = [],
        -                data_ = '',
        -                attributes = {},
        -                htmlAttributes = [];
        -
        -            style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
        -
        -            if (style && style.css) {
        -                for (key in style.css) {
        -                    csses.push(key + ': ' + style.css[key]);
        -                }
        -            }
        -
        -            attributes = calculateObjectValue(this.options,
        -                this.options.rowAttributes, [item, i], attributes);
        -
        -            if (attributes) {
        -                for (key in attributes) {
        -                    htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
        -                }
        -            }
        -
        -            if (item._data && !$.isEmptyObject(item._data)) {
        -                $.each(item._data, function (k, v) {
        -                    // ignore data-index
        -                    if (k === 'index') {
        -                        return;
        -                    }
        -                    data_ += sprintf(' data-%s="%s"', k, v);
        -                });
        -            }
        -
        -            html.push('<tr',
        -                sprintf(' %s', htmlAttributes.join(' ')),
        -                sprintf(' id="%s"', $.isArray(item) ? undefined : item._id),
        -                sprintf(' class="%s"', style.classes || ($.isArray(item) ? undefined : item._class)),
        -                sprintf(' data-index="%s"', i),
        -                sprintf(' data-uniqueid="%s"', item[this.options.uniqueId]),
        -                sprintf('%s', data_),
        -                '>'
        -            );
        -
        -            if (this.options.cardView) {
        -                html.push(sprintf('<td colspan="%s">', this.header.fields.length));
        -            }
        -
        -            if (!this.options.cardView && this.options.detailView) {
        -                html.push('<td>',
        -                    '<a class="detail-icon" href="javascript:">',
        -                    sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),
        -                    '</a>',
        -                    '</td>');
        -            }
        -
        -            $.each(this.header.fields, function (j, field) {
        -                var text = '',
        -                    value = getItemField(item, field),
        -                    type = '',
        -                    cellStyle = {},
        -                    id_ = '',
        -                    class_ = that.header.classes[j],
        -                    data_ = '',
        -                    rowspan_ = '',
        -                    title_ = '',
        -                    column = that.columns[getFieldIndex(that.columns, field)];
        -
        -                if (!column.visible) {
        -                    return;
        -                }
        -
        -                style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; '));
        -
        -                value = calculateObjectValue(column,
        -                    that.header.formatters[j], [value, item, i], value);
        -
        -                // handle td's id and class
        -                if (item['_' + field + '_id']) {
        -                    id_ = sprintf(' id="%s"', item['_' + field + '_id']);
        -                }
        -                if (item['_' + field + '_class']) {
        -                    class_ = sprintf(' class="%s"', item['_' + field + '_class']);
        -                }
        -                if (item['_' + field + '_rowspan']) {
        -                    rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']);
        -                }
        -                if (item['_' + field + '_title']) {
        -                    title_ = sprintf(' title="%s"', item['_' + field + '_title']);
        -                }
        -                cellStyle = calculateObjectValue(that.header,
        -                    that.header.cellStyles[j], [value, item, i], cellStyle);
        -                if (cellStyle.classes) {
        -                    class_ = sprintf(' class="%s"', cellStyle.classes);
        -                }
        -                if (cellStyle.css) {
        -                    var csses_ = [];
        -                    for (var key in cellStyle.css) {
        -                        csses_.push(key + ': ' + cellStyle.css[key]);
        -                    }
        -                    style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; '));
        -                }
        -
        -                if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {
        -                    $.each(item['_' + field + '_data'], function (k, v) {
        -                        // ignore data-index
        -                        if (k === 'index') {
        -                            return;
        -                        }
        -                        data_ += sprintf(' data-%s="%s"', k, v);
        -                    });
        -                }
        -
        -                if (column.checkbox || column.radio) {
        -                    type = column.checkbox ? 'checkbox' : type;
        -                    type = column.radio ? 'radio' : type;
        -
        -                    text = [that.options.cardView ?
        -                        '<div class="card-view">' : '<td class="bs-checkbox">',
        -                        '<input' +
        -                        sprintf(' data-index="%s"', i) +
        -                        sprintf(' name="%s"', that.options.selectItemName) +
        -                        sprintf(' type="%s"', type) +
        -                        sprintf(' value="%s"', item[that.options.idField]) +
        -                        sprintf(' checked="%s"', value === true ||
        -                        (value && value.checked) ? 'checked' : undefined) +
        -                        sprintf(' disabled="%s"', !column.checkboxEnabled ||
        -                        (value && value.disabled) ? 'disabled' : undefined) +
        -                        ' />',
        -                        that.header.formatters[j] && typeof value === 'string' ? value : '',
        -                        that.options.cardView ? '</div>' : '</td>'
        -                    ].join('');
        -
        -                    item[that.header.stateField] = value === true || (value && value.checked);
        -                } else {
        -                    value = typeof value === 'undefined' || value === null ?
        -                        that.options.undefinedText : value;
        -
        -                    text = that.options.cardView ? ['<div class="card-view">',
        -                        that.options.showHeader ? sprintf('<span class="title" %s>%s</span>', style,
        -                            getPropertyFromOther(that.columns, 'field', 'title', field)) : '',
        -                        sprintf('<span class="value">%s</span>', value),
        -                        '</div>'
        -                    ].join('') : [sprintf('<td%s %s %s %s %s %s>', id_, class_, style, data_, rowspan_, title_),
        -                        value,
        -                        '</td>'
        -                    ].join('');
        -
        -                    // Hide empty data on Card view when smartDisplay is set to true.
        -                    if (that.options.cardView && that.options.smartDisplay && value === '') {
        -                        // Should set a placeholder for event binding correct fieldIndex
        -                        text = '<div class="card-view"></div>';
        -                    }
        -                }
        -
        -                html.push(text);
        -            });
        -
        -            if (this.options.cardView) {
        -                html.push('</td>');
        -            }
        -
        -            html.push('</tr>');
        -        }
        -
        -        // show no records
        -        if (!html.length) {
        -            html.push('<tr class="no-records-found">',
        -                sprintf('<td colspan="%s">%s</td>',
        -                    this.$header.find('th').length, this.options.formatNoMatches()),
        -                '</tr>');
        -        }
        -
        -        this.$body.html(html.join(''));
        -
        -        if (!fixedScroll) {
        -            this.scrollTo(0);
        -        }
        -
        -        // click to select by column
        -        this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {
        -            var $td = $(this),
        -                $tr = $td.parent(),
        -                item = that.data[$tr.data('index')],
        -                index = $td[0].cellIndex,
        -                field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],
        -                column = that.columns[getFieldIndex(that.columns, field)],
        -                value = getItemField(item, field);
        -
        -            if ($td.find('.detail-icon').length) {
        -                return;
        -            }
        -
        -            that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);
        -            that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);
        -
        -            // if click to select - then trigger the checkbox/radio click
        -            if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {
        -                var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName));
        -                if ($selectItem.length) {
        -                    $selectItem[0].click(); // #144: .trigger('click') bug
        -                }
        -            }
        -        });
        -
        -        this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {
        -            var $this = $(this),
        -                $tr = $this.parent().parent(),
        -                index = $tr.data('index'),
        -                row = data[index]; // Fix #980 Detail view, when searching, returns wrong row
        -
        -            // remove and update
        -            if ($tr.next().is('tr.detail-view')) {
        -                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));
        -                $tr.next().remove();
        -                that.trigger('collapse-row', index, row);
        -            } else {
        -                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));
        -                $tr.after(sprintf('<tr class="detail-view"><td colspan="%s">%s</td></tr>',
        -                    $tr.find('td').length, calculateObjectValue(that.options,
        -                        that.options.detailFormatter, [index, row], '')));
        -                that.trigger('expand-row', index, row, $tr.next().find('td'));
        -            }
        -            that.resetView();
        -        });
        -
        -        this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName));
        -        this.$selectItem.off('click').on('click', function (event) {
        -            event.stopImmediatePropagation();
        -
        -            var $this = $(this),
        -                checked = $this.prop('checked'),
        -                row = that.data[$this.data('index')];
        -
        -            if (that.options.maintainSelected && $(this).is(':radio')) {
        -                $.each(that.options.data, function (i, row) {
        -                    row[that.header.stateField] = false;
        -                });
        -            }
        -
        -            row[that.header.stateField] = checked;
        -
        -            if (that.options.singleSelect) {
        -                that.$selectItem.not(this).each(function () {
        -                    that.data[$(this).data('index')][that.header.stateField] = false;
        -                });
        -                that.$selectItem.filter(':checked').not(this).prop('checked', false);
        -            }
        -
        -            that.updateSelected();
        -            that.trigger(checked ? 'check' : 'uncheck', row, $this);
        -        });
        -
        -        $.each(this.header.events, function (i, events) {
        -            if (!events) {
        -                return;
        -            }
        -            // fix bug, if events is defined with namespace
        -            if (typeof events === 'string') {
        -                events = calculateObjectValue(null, events);
        -            }
        -
        -            var field = that.header.fields[i],
        -                fieldIndex = $.inArray(field, that.getVisibleFields());
        -
        -            if (that.options.detailView && !that.options.cardView) {
        -                fieldIndex += 1;
        -            }
        -
        -            for (var key in events) {
        -                that.$body.find('>tr:not(.no-records-found)').each(function () {
        -                    var $tr = $(this),
        -                        $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),
        -                        index = key.indexOf(' '),
        -                        name = key.substring(0, index),
        -                        el = key.substring(index + 1),
        -                        func = events[key];
        -
        -                    $td.find(el).off(name).on(name, function (e) {
        -                        var index = $tr.data('index'),
        -                            row = that.data[index],
        -                            value = row[field];
        -
        -                        func.apply(this, [e, value, row, index]);
        -                    });
        -                });
        -            }
        -        });
        -
        -        this.updateSelected();
        -        this.resetView();
        -
        -        this.trigger('post-body');
        -    };
        -
        -    BootstrapTable.prototype.initServer = function (silent, query) {
        -        var that = this,
        -            data = {},
        -            params = {
        -                pageSize: this.options.pageSize === this.options.formatAllRows() ?
        -                    this.options.totalRows : this.options.pageSize,
        -                pageNumber: this.options.pageNumber,
        -                searchText: this.searchText,
        -                sortName: this.options.sortName,
        -                sortOrder: this.options.sortOrder
        -            },
        -            request;
        -
        -        if (!this.options.url && !this.options.ajax) {
        -            return;
        -        }
        -
        -        if (this.options.queryParamsType === 'limit') {
        -            params = {
        -                search: params.searchText,
        -                sort: params.sortName,
        -                order: params.sortOrder
        -            };
        -            if (this.options.pagination) {
        -                params.limit = this.options.pageSize === this.options.formatAllRows() ?
        -                    this.options.totalRows : this.options.pageSize;
        -                params.offset = this.options.pageSize === this.options.formatAllRows() ?
        -                    0 : this.options.pageSize * (this.options.pageNumber - 1);
        -            }
        -        }
        -
        -        if (!($.isEmptyObject(this.filterColumnsPartial))) {
        -            params['filter'] = JSON.stringify(this.filterColumnsPartial, null);
        -        }
        -
        -        data = calculateObjectValue(this.options, this.options.queryParams, [params], data);
        -
        -        $.extend(data, query || {});
        -
        -        // false to stop request
        -        if (data === false) {
        -            return;
        -        }
        -
        -        if (!silent) {
        -            this.$tableLoading.show();
        -        }
        -        request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), {
        -            type: this.options.method,
        -            url: this.options.url,
        -            data: this.options.contentType === 'application/json' && this.options.method === 'post' ?
        -                JSON.stringify(data) : data,
        -            cache: this.options.cache,
        -            contentType: this.options.contentType,
        -            dataType: this.options.dataType,
        -            success: function (res) {
        -                res = calculateObjectValue(that.options, that.options.responseHandler, [res], res);
        -
        -                that.load(res);
        -                that.trigger('load-success', res);
        -            },
        -            error: function (res) {
        -                that.trigger('load-error', res.status, res);
        -            },
        -            complete: function () {
        -                if (!silent) {
        -                    that.$tableLoading.hide();
        -                }
        -            }
        -        });
        -
        -        if (this.options.ajax) {
        -            calculateObjectValue(this, this.options.ajax, [request], null);
        -        } else {
        -            $.ajax(request);
        -        }
        -    };
        -
        -    BootstrapTable.prototype.initSearchText = function () {
        -        if (this.options.search) {
        -            if (this.options.searchText !== '') {
        -                var $search = this.$toolbar.find('.search input');
        -                $search.val(this.options.searchText);
        -                this.onSearch({currentTarget: $search});
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.getCaret = function () {
        -        var that = this;
        -
        -        $.each(this.$header.find('th'), function (i, th) {
        -            $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both');
        -        });
        -    };
        -
        -    BootstrapTable.prototype.updateSelected = function () {
        -        var checkAll = this.$selectItem.filter(':enabled').length &&
        -            this.$selectItem.filter(':enabled').length ===
        -            this.$selectItem.filter(':enabled').filter(':checked').length;
        -
        -        this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);
        -
        -        this.$selectItem.each(function () {
        -            $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected');
        -        });
        -    };
        -
        -    BootstrapTable.prototype.updateRows = function () {
        -        var that = this;
        -
        -        this.$selectItem.each(function () {
        -            that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');
        -        });
        -    };
        -
        -    BootstrapTable.prototype.resetRows = function () {
        -        var that = this;
        -
        -        $.each(this.data, function (i, row) {
        -            that.$selectAll.prop('checked', false);
        -            that.$selectItem.prop('checked', false);
        -            if (that.header.stateField) {
        -                row[that.header.stateField] = false;
        -            }
        -        });
        -    };
        -
        -    BootstrapTable.prototype.trigger = function (name) {
        -        var args = Array.prototype.slice.call(arguments, 1);
        -
        -        name += '.bs.table';
        -        this.options[BootstrapTable.EVENTS[name]].apply(this.options, args);
        -        this.$el.trigger($.Event(name), args);
        -
        -        this.options.onAll(name, args);
        -        this.$el.trigger($.Event('all.bs.table'), [name, args]);
        -    };
        -
        -    BootstrapTable.prototype.resetHeader = function () {
        -        // fix #61: the hidden table reset header bug.
        -        // fix bug: get $el.css('width') error sometime (height = 500)
        -        clearTimeout(this.timeoutId_);
        -        this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);
        -    };
        -
        -    BootstrapTable.prototype.fitHeader = function () {
        -        var that = this,
        -            fixedBody,
        -            scrollWidth,
        -            focused,
        -            focusedTemp;
        -
        -        if (that.$el.is(':hidden')) {
        -            that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100);
        -            return;
        -        }
        -        fixedBody = this.$tableBody.get(0);
        -
        -        scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth &&
        -        fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ?
        -            getScrollBarWidth() : 0;
        -
        -        this.$el.css('margin-top', -this.$header.outerHeight());
        -
        -        focused = $(':focus');
        -        if (focused.length > 0) {
        -            var $th = focused.parents('th');
        -            if ($th.length > 0) {
        -                var dataField = $th.attr('data-field');
        -                if (dataField !== undefined) {
        -                    var $headerTh = this.$header.find("[data-field='" + dataField + "']");
        -                    if ($headerTh.length > 0) {
        -                        $headerTh.find(":input").addClass("focus-temp");
        -                    }
        -                }
        -            }
        -        }
        -
        -        this.$header_ = this.$header.clone(true, true);
        -        this.$selectAll_ = this.$header_.find('[name="btSelectAll"]');
        -        this.$tableHeader.css({
        -            'margin-right': scrollWidth
        -        }).find('table').css('width', this.$el.outerWidth())
        -            .html('').attr('class', this.$el.attr('class'))
        -            .append(this.$header_);
        -
        -
        -        focusedTemp = $('.focus-temp:visible:eq(0)');
        -        if (focusedTemp.length > 0) {
        -            focusedTemp.focus();
        -            this.$header.find('.focus-temp').removeClass('focus-temp');
        -        }
        -
        -        // fix bug: $.data() is not working as expected after $.append()
        -        this.$header.find('th[data-field]').each(function (i) {
        -            that.$header_.find(sprintf('th[data-field="%s"]', $(this).data('field'))).data($(this).data());
        -        });
        -
        -        var visibleFields = this.getVisibleFields();
        -
        -        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
        -            var $this = $(this),
        -                index = i;
        -
        -            if (that.options.detailView && !that.options.cardView) {
        -                if (i === 0) {
        -                    that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());
        -                }
        -                index = i - 1;
        -            }
        -
        -            that.$header_.find(sprintf('th[data-field="%s"]', visibleFields[index]))
        -                .find('.fht-cell').width($this.innerWidth());
        -        });
        -        // horizontal scroll event
        -        // TODO: it's probably better improving the layout than binding to scroll event
        -        this.$tableBody.off('scroll').on('scroll', function () {
        -            that.$tableHeader.scrollLeft($(this).scrollLeft());
        -
        -            if (that.options.showFooter && !that.options.cardView) {
        -                that.$tableFooter.scrollLeft($(this).scrollLeft());
        -            }
        -        });
        -        that.trigger('post-header');
        -    };
        -
        -    BootstrapTable.prototype.resetFooter = function () {
        -        var that = this,
        -            data = that.getData(),
        -            html = [];
        -
        -        if (!this.options.showFooter || this.options.cardView) { //do nothing
        -            return;
        -        }
        -
        -        if (!this.options.cardView && this.options.detailView) {
        -            html.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>');
        -        }
        -
        -        $.each(this.columns, function (i, column) {
        -            var falign = '', // footer align style
        -                style = '',
        -                class_ = sprintf(' class="%s"', column['class']);
        -
        -            if (!column.visible) {
        -                return;
        -            }
        -
        -            if (that.options.cardView && (!column.cardVisible)) {
        -                return;
        -            }
        -
        -            falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align);
        -            style = sprintf('vertical-align: %s; ', column.valign);
        -
        -            html.push('<td', class_, sprintf(' style="%s"', falign + style), '>');
        -            html.push('<div class="th-inner">');
        -
        -            html.push(calculateObjectValue(column, column.footerFormatter, [data], '&nbsp;') || '&nbsp;');
        -
        -            html.push('</div>');
        -            html.push('<div class="fht-cell"></div>');
        -            html.push('</div>');
        -            html.push('</td>');
        -        });
        -
        -        this.$tableFooter.find('tr').html(html.join(''));
        -        clearTimeout(this.timeoutFooter_);
        -        this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this),
        -            this.$el.is(':hidden') ? 100 : 0);
        -    };
        -
        -    BootstrapTable.prototype.fitFooter = function () {
        -        var that = this,
        -            $footerTd,
        -            elWidth,
        -            scrollWidth;
        -
        -        clearTimeout(this.timeoutFooter_);
        -        if (this.$el.is(':hidden')) {
        -            this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100);
        -            return;
        -        }
        -
        -        elWidth = this.$el.css('width');
        -        scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0;
        -
        -        this.$tableFooter.css({
        -            'margin-right': scrollWidth
        -        }).find('table').css('width', elWidth)
        -            .attr('class', this.$el.attr('class'));
        -
        -        $footerTd = this.$tableFooter.find('td');
        -
        -        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
        -            var $this = $(this);
        -
        -            $footerTd.eq(i).find('.fht-cell').width($this.innerWidth());
        -        });
        -    };
        -
        -    BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) {
        -        if (index === -1) {
        -            return;
        -        }
        -        this.columns[index].visible = checked;
        -        this.initHeader();
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody();
        -
        -        if (this.options.showColumns) {
        -            var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);
        -
        -            if (needUpdate) {
        -                $items.filter(sprintf('[value="%s"]', index)).prop('checked', checked);
        -            }
        -
        -            if ($items.filter(':checked').length <= this.options.minimumCountColumns) {
        -                $items.filter(':checked').prop('disabled', true);
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {
        -        if (index === -1) {
        -            return;
        -        }
        -
        -        this.$body.find(typeof index !== 'undefined' ?
        -            sprintf('tr[data-index="%s"]', index) :
        -            sprintf('tr[data-uniqueid="%s"]', uniqueId))
        -            [visible ? 'show' : 'hide']();
        -    };
        -
        -    BootstrapTable.prototype.getVisibleFields = function () {
        -        var that = this,
        -            visibleFields = [];
        -
        -        $.each(this.header.fields, function (j, field) {
        -            var column = that.columns[getFieldIndex(that.columns, field)];
        -
        -            if (!column.visible) {
        -                return;
        -            }
        -            visibleFields.push(field);
        -        });
        -        return visibleFields;
        -    };
        -
        -    // PUBLIC FUNCTION DEFINITION
        -    // =======================
        -
        -    BootstrapTable.prototype.resetView = function (params) {
        -        var padding = 0;
        -
        -        if (params && params.height) {
        -            this.options.height = params.height;
        -        }
        -
        -        this.$selectAll.prop('checked', this.$selectItem.length > 0 &&
        -            this.$selectItem.length === this.$selectItem.filter(':checked').length);
        -
        -        if (this.options.height) {
        -            var toolbarHeight = getRealHeight(this.$toolbar),
        -                paginationHeight = getRealHeight(this.$pagination),
        -                height = this.options.height - toolbarHeight - paginationHeight;
        -
        -            this.$tableContainer.css('height', height + 'px');
        -        }
        -
        -        if (this.options.cardView) {
        -            // remove the element css
        -            this.$el.css('margin-top', '0');
        -            this.$tableContainer.css('padding-bottom', '0');
        -            return;
        -        }
        -
        -        if (this.options.showHeader && this.options.height) {
        -            this.$tableHeader.show();
        -            this.resetHeader();
        -            padding += this.$header.outerHeight();
        -        } else {
        -            this.$tableHeader.hide();
        -            this.trigger('post-header');
        -        }
        -
        -        if (this.options.showFooter) {
        -            this.resetFooter();
        -            if (this.options.height) {
        -                padding += this.$tableFooter.outerHeight() + 1;
        -            }
        -        }
        -
        -        // Assign the correct sortable arrow
        -        this.getCaret();
        -        this.$tableContainer.css('padding-bottom', padding + 'px');
        -        this.trigger('reset-view');
        -    };
        -
        -    BootstrapTable.prototype.getData = function (useCurrentPage) {
        -        return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?
        -            (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) :
        -            (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data);
        -    };
        -
        -    BootstrapTable.prototype.load = function (data) {
        -        var fixedScroll = false;
        -
        -        // #431: support pagination
        -        if (this.options.sidePagination === 'server') {
        -            this.options.totalRows = data.total;
        -            fixedScroll = data.fixedScroll;
        -            data = data[this.options.dataField];
        -        } else if (!$.isArray(data)) { // support fixedScroll
        -            fixedScroll = data.fixedScroll;
        -            data = data.data;
        -        }
        -
        -        this.initData(data);
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(fixedScroll);
        -    };
        -
        -    BootstrapTable.prototype.append = function (data) {
        -        this.initData(data, 'append');
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.prepend = function (data) {
        -        this.initData(data, 'prepend');
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.remove = function (params) {
        -        var len = this.options.data.length,
        -            i, row;
        -
        -        if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {
        -            return;
        -        }
        -
        -        for (i = len - 1; i >= 0; i--) {
        -            row = this.options.data[i];
        -
        -            if (!row.hasOwnProperty(params.field)) {
        -                continue;
        -            }
        -            if ($.inArray(row[params.field], params.values) !== -1) {
        -                this.options.data.splice(i, 1);
        -            }
        -        }
        -
        -        if (len === this.options.data.length) {
        -            return;
        -        }
        -
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.removeAll = function () {
        -        if (this.options.data.length > 0) {
        -            this.options.data.splice(0, this.options.data.length);
        -            this.initSearch();
        -            this.initPagination();
        -            this.initBody(true);
        -        }
        -    };
        -
        -    BootstrapTable.prototype.getRowByUniqueId = function (id) {
        -        var uniqueId = this.options.uniqueId,
        -            len = this.options.data.length,
        -            dataRow = null,
        -            i, row, rowUniqueId;
        -
        -        for (i = len - 1; i >= 0; i--) {
        -            row = this.options.data[i];
        -
        -            if (row.hasOwnProperty(uniqueId)) { // uniqueId is a column
        -                rowUniqueId = row[uniqueId];
        -            } else if(row._data.hasOwnProperty(uniqueId)) { // uniqueId is a row data property
        -                rowUniqueId = row._data[uniqueId];
        -            } else {
        -                continue;
        -            }
        -
        -            if (typeof rowUniqueId === 'string') {
        -                id = id.toString();
        -            } else if (typeof rowUniqueId === 'number') {
        -                if ((Number(rowUniqueId) === rowUniqueId) && (rowUniqueId % 1 === 0)) {
        -                    id = parseInt(id);
        -                } else if ((rowUniqueId === Number(rowUniqueId)) && (rowUniqueId !== 0)) {
        -                    id = parseFloat(id);
        -                }
        -            }
        -
        -            if (rowUniqueId === id) {
        -                dataRow = row;
        -                break;
        -            }
        -        }
        -
        -        return dataRow;
        -    };
        -
        -    BootstrapTable.prototype.removeByUniqueId = function (id) {
        -        var len = this.options.data.length,
        -            row = this.getRowByUniqueId(id);
        -
        -        if (row) {
        -            this.options.data.splice(this.options.data.indexOf(row), 1);
        -        }
        -
        -        if (len === this.options.data.length) {
        -            return;
        -        }
        -
        -        this.initSearch();
        -        this.initPagination();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.updateByUniqueId = function (params) {
        -        var rowId;
        -
        -        if (!params.hasOwnProperty('id') || !params.hasOwnProperty('row')) {
        -            return;
        -        }
        -
        -        rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data);
        -
        -        if (rowId === -1) {
        -            return;
        -        }
        -
        -        $.extend(this.data[rowId], params.row);
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.insertRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
        -            return;
        -        }
        -        this.data.splice(params.index, 0, params.row);
        -        this.initSearch();
        -        this.initPagination();
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.updateRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
        -            return;
        -        }
        -        $.extend(this.data[params.index], params.row);
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.showRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
        -            return;
        -        }
        -        this.toggleRow(params.index, params.uniqueId, true);
        -    };
        -
        -    BootstrapTable.prototype.hideRow = function (params) {
        -        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
        -            return;
        -        }
        -        this.toggleRow(params.index, params.uniqueId, false);
        -    };
        -
        -    BootstrapTable.prototype.getRowsHidden = function (show) {
        -        var rows = $(this.$body[0]).children().filter(':hidden'),
        -            i = 0;
        -        if (show) {
        -            for (; i < rows.length; i++) {
        -                $(rows[i]).show();
        -            }
        -        }
        -        return rows;
        -    };
        -
        -    BootstrapTable.prototype.mergeCells = function (options) {
        -        var row = options.index,
        -            col = $.inArray(options.field, this.getVisibleFields()),
        -            rowspan = options.rowspan || 1,
        -            colspan = options.colspan || 1,
        -            i, j,
        -            $tr = this.$body.find('>tr'),
        -            $td;
        -
        -        if (this.options.detailView && !this.options.cardView) {
        -            col += 1;
        -        }
        -
        -        $td = $tr.eq(row).find('>td').eq(col);
        -
        -        if (row < 0 || col < 0 || row >= this.data.length) {
        -            return;
        -        }
        -
        -        for (i = row; i < row + rowspan; i++) {
        -            for (j = col; j < col + colspan; j++) {
        -                $tr.eq(i).find('>td').eq(j).hide();
        -            }
        -        }
        -
        -        $td.attr('rowspan', rowspan).attr('colspan', colspan).show();
        -    };
        -
        -    BootstrapTable.prototype.updateCell = function (params) {
        -        if (!params.hasOwnProperty('index') ||
        -            !params.hasOwnProperty('field') ||
        -            !params.hasOwnProperty('value')) {
        -            return;
        -        }
        -        this.data[params.index][params.field] = params.value;
        -        this.initSort();
        -        this.initBody(true);
        -    };
        -
        -    BootstrapTable.prototype.getOptions = function () {
        -        return this.options;
        -    };
        -
        -    BootstrapTable.prototype.getSelections = function () {
        -        var that = this;
        -
        -        return $.grep(this.data, function (row) {
        -            return row[that.header.stateField];
        -        });
        -    };
        -
        -    BootstrapTable.prototype.getAllSelections = function () {
        -        var that = this;
        -
        -        return $.grep(this.options.data, function (row) {
        -            return row[that.header.stateField];
        -        });
        -    };
        -
        -    BootstrapTable.prototype.checkAll = function () {
        -        this.checkAll_(true);
        -    };
        -
        -    BootstrapTable.prototype.uncheckAll = function () {
        -        this.checkAll_(false);
        -    };
        -
        -    BootstrapTable.prototype.checkAll_ = function (checked) {
        -        var rows;
        -        if (!checked) {
        -            rows = this.getSelections();
        -        }
        -        this.$selectAll.add(this.$selectAll_).prop('checked', checked);
        -        this.$selectItem.filter(':enabled').prop('checked', checked);
        -        this.updateRows();
        -        if (checked) {
        -            rows = this.getSelections();
        -        }
        -        this.trigger(checked ? 'check-all' : 'uncheck-all', rows);
        -    };
        -
        -    BootstrapTable.prototype.check = function (index) {
        -        this.check_(true, index);
        -    };
        -
        -    BootstrapTable.prototype.uncheck = function (index) {
        -        this.check_(false, index);
        -    };
        -
        -    BootstrapTable.prototype.check_ = function (checked, index) {
        -        var $el = this.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
        -        this.data[index][this.header.stateField] = checked;
        -        this.updateSelected();
        -        this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el);
        -    };
        -
        -    BootstrapTable.prototype.checkBy = function (obj) {
        -        this.checkBy_(true, obj);
        -    };
        -
        -    BootstrapTable.prototype.uncheckBy = function (obj) {
        -        this.checkBy_(false, obj);
        -    };
        -
        -    BootstrapTable.prototype.checkBy_ = function (checked, obj) {
        -        if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {
        -            return;
        -        }
        -
        -        var that = this,
        -            rows = [];
        -        $.each(this.options.data, function (index, row) {
        -            if (!row.hasOwnProperty(obj.field)) {
        -                return false;
        -            }
        -            if ($.inArray(row[obj.field], obj.values) !== -1) {
        -                var $el = that.$selectItem.filter(':enabled')
        -                    .filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
        -                row[that.header.stateField] = checked;
        -                rows.push(row);
        -                that.trigger(checked ? 'check' : 'uncheck', row, $el);
        -            }
        -        });
        -        this.updateSelected();
        -        this.trigger(checked ? 'check-some' : 'uncheck-some', rows);
        -    };
        -
        -    BootstrapTable.prototype.destroy = function () {
        -        this.$el.insertBefore(this.$container);
        -        $(this.options.toolbar).insertBefore(this.$el);
        -        this.$container.next().remove();
        -        this.$container.remove();
        -        this.$el.html(this.$el_.html())
        -            .css('margin-top', '0')
        -            .attr('class', this.$el_.attr('class') || ''); // reset the class
        -    };
        -
        -    BootstrapTable.prototype.showLoading = function () {
        -        this.$tableLoading.show();
        -    };
        -
        -    BootstrapTable.prototype.hideLoading = function () {
        -        this.$tableLoading.hide();
        -    };
        -
        -    BootstrapTable.prototype.togglePagination = function () {
        -        this.options.pagination = !this.options.pagination;
        -        var button = this.$toolbar.find('button[name="paginationSwitch"] i');
        -        if (this.options.pagination) {
        -            button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown);
        -        } else {
        -            button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp);
        -        }
        -        this.updatePagination();
        -    };
        -
        -    BootstrapTable.prototype.refresh = function (params) {
        -        if (params && params.url) {
        -            this.options.url = params.url;
        -            this.options.pageNumber = 1;
        -        }
        -        this.initServer(params && params.silent, params && params.query);
        -    };
        -
        -    BootstrapTable.prototype.resetWidth = function () {
        -        if (this.options.showHeader && this.options.height) {
        -            this.fitHeader();
        -        }
        -        if (this.options.showFooter) {
        -            this.fitFooter();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.showColumn = function (field) {
        -        this.toggleColumn(getFieldIndex(this.columns, field), true, true);
        -    };
        -
        -    BootstrapTable.prototype.hideColumn = function (field) {
        -        this.toggleColumn(getFieldIndex(this.columns, field), false, true);
        -    };
        -
        -    BootstrapTable.prototype.getHiddenColumns = function () {
        -        return $.grep(this.columns, function (column) {
        -            return !column.visible;
        -        });
        -    };
        -
        -    BootstrapTable.prototype.filterBy = function (columns) {
        -        this.filterColumns = $.isEmptyObject(columns) ? {} : columns;
        -        this.options.pageNumber = 1;
        -        this.initSearch();
        -        this.updatePagination();
        -    };
        -
        -    BootstrapTable.prototype.scrollTo = function (value) {
        -        if (typeof value === 'string') {
        -            value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0;
        -        }
        -        if (typeof value === 'number') {
        -            this.$tableBody.scrollTop(value);
        -        }
        -        if (typeof value === 'undefined') {
        -            return this.$tableBody.scrollTop();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.getScrollPosition = function () {
        -        return this.scrollTo();
        -    };
        -
        -    BootstrapTable.prototype.selectPage = function (page) {
        -        if (page > 0 && page <= this.options.totalPages) {
        -            this.options.pageNumber = page;
        -            this.updatePagination();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.prevPage = function () {
        -        if (this.options.pageNumber > 1) {
        -            this.options.pageNumber--;
        -            this.updatePagination();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.nextPage = function () {
        -        if (this.options.pageNumber < this.options.totalPages) {
        -            this.options.pageNumber++;
        -            this.updatePagination();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.toggleView = function () {
        -        this.options.cardView = !this.options.cardView;
        -        this.initHeader();
        -        // Fixed remove toolbar when click cardView button.
        -        //that.initToolbar();
        -        this.initBody();
        -        this.trigger('toggle', this.options.cardView);
        -    };
        -
        -    BootstrapTable.prototype.refreshOptions = function (options) {
        -        //If the objects are equivalent then avoid the call of destroy / init methods
        -        if (compareObjects(this.options, options, false)) {
        -            return;
        -        }
        -        this.options = $.extend(this.options, options);
        -        this.trigger('refresh-options', this.options);
        -        this.destroy();
        -        this.init();
        -    };
        -
        -    BootstrapTable.prototype.resetSearch = function (text) {
        -        var $search = this.$toolbar.find('.search input');
        -        $search.val(text || '');
        -        this.onSearch({currentTarget: $search});
        -    };
        -
        -    BootstrapTable.prototype.expandRow_ = function (expand, index) {
        -        var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', index));
        -        if ($tr.next().is('tr.detail-view') === (expand ? false : true)) {
        -            $tr.find('> td > .detail-icon').click();
        -        }
        -    };
        -
        -    BootstrapTable.prototype.expandRow = function (index) {
        -        this.expandRow_(true, index);
        -    };
        -
        -    BootstrapTable.prototype.collapseRow = function (index) {
        -        this.expandRow_(false, index);
        -    };
        -
        -    BootstrapTable.prototype.expandAllRows = function (isSubTable) {
        -        if (isSubTable) {
        -            var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', 0)),
        -                that = this,
        -                detailIcon = null,
        -                executeInterval = false,
        -                idInterval = -1;
        -
        -            if (!$tr.next().is('tr.detail-view')) {
        -                $tr.find('> td > .detail-icon').click();
        -                executeInterval = true;
        -            } else if (!$tr.next().next().is('tr.detail-view')) {
        -                $tr.next().find(".detail-icon").click();
        -                executeInterval = true;
        -            }
        -
        -            if (executeInterval) {
        -                try {
        -                    idInterval = setInterval(function () {
        -                        detailIcon = that.$body.find("tr.detail-view").last().find(".detail-icon");
        -                        if (detailIcon.length > 0) {
        -                            detailIcon.click();
        -                        } else {
        -                            clearInterval(idInterval);
        -                        }
        -                    }, 1);
        -                } catch (ex) {
        -                    clearInterval(idInterval);
        -                }
        -            }
        -        } else {
        -            var trs = this.$body.children();
        -            for (var i = 0; i < trs.length; i++) {
        -                this.expandRow_(true, $(trs[i]).data("index"));
        -            }
        -        }
        -    };
        -
        -    BootstrapTable.prototype.collapseAllRows = function (isSubTable) {
        -        if (isSubTable) {
        -            this.expandRow_(false, 0);
        -        } else {
        -            var trs = this.$body.children();
        -            for (var i = 0; i < trs.length; i++) {
        -                this.expandRow_(false, $(trs[i]).data("index"));
        -            }
        -        }
        -    };
        -
        -    // BOOTSTRAP TABLE PLUGIN DEFINITION
        -    // =======================
        -
        -    var allowedMethods = [
        -        'getOptions',
        -        'getSelections', 'getAllSelections', 'getData',
        -        'load', 'append', 'prepend', 'remove', 'removeAll',
        -        'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',
        -        'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',
        -        'mergeCells',
        -        'checkAll', 'uncheckAll',
        -        'check', 'uncheck',
        -        'checkBy', 'uncheckBy',
        -        'refresh',
        -        'resetView',
        -        'resetWidth',
        -        'destroy',
        -        'showLoading', 'hideLoading',
        -        'showColumn', 'hideColumn', 'getHiddenColumns',
        -        'filterBy',
        -        'scrollTo',
        -        'getScrollPosition',
        -        'selectPage', 'prevPage', 'nextPage',
        -        'togglePagination',
        -        'toggleView',
        -        'refreshOptions',
        -        'resetSearch',
        -        'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows'
        -    ];
        -
        -    $.fn.bootstrapTable = function (option) {
        -        var value,
        -            args = Array.prototype.slice.call(arguments, 1);
        -
        -        this.each(function () {
        -            var $this = $(this),
        -                data = $this.data('bootstrap.table'),
        -                options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),
        -                    typeof option === 'object' && option);
        -
        -            if (typeof option === 'string') {
        -                if ($.inArray(option, allowedMethods) < 0) {
        -                    throw new Error("Unknown method: " + option);
        -                }
        -
        -                if (!data) {
        -                    return;
        -                }
        -
        -                value = data[option].apply(data, args);
        -
        -                if (option === 'destroy') {
        -                    $this.removeData('bootstrap.table');
        -                }
        -            }
        -
        -            if (!data) {
        -                $this.data('bootstrap.table', (data = new BootstrapTable(this, options)));
        -            }
        -        });
        -
        -        return typeof value === 'undefined' ? this : value;
        -    };
        -
        -    $.fn.bootstrapTable.Constructor = BootstrapTable;
        -    $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;
        -    $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;
        -    $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;
        -    $.fn.bootstrapTable.methods = allowedMethods;
        -    $.fn.bootstrapTable.utils = {
        -        sprintf: sprintf,
        -        getFieldIndex: getFieldIndex,
        -        compareObjects: compareObjects,
        -        calculateObjectValue: calculateObjectValue
        -    };
        -
        -    // BOOTSTRAP TABLE INIT
        -    // =======================
        -
        -    $(function () {
        -        $('[data-toggle="table"]').bootstrapTable();
        -    });
        -
        -}(jQuery);
        -
        -/* =========================================================
        - * bootstrap-datepicker.js
        - * Repo: https://github.com/eternicode/bootstrap-datepicker/
        - * Demo: http://eternicode.github.io/bootstrap-datepicker/
        - * Docs: http://bootstrap-datepicker.readthedocs.org/
        - * Forked from http://www.eyecon.ro/bootstrap-datepicker
        - * =========================================================
        - * Started by Stefan Petre; improvements by Andrew Rowls + contributors
        - *
        - * Licensed under the Apache License, Version 2.0 (the "License");
        - * you may not use this file except in compliance with the License.
        - * You may obtain a copy of the License at
        - *
        - * http://www.apache.org/licenses/LICENSE-2.0
        - *
        - * Unless required by applicable law or agreed to in writing, software
        - * distributed under the License is distributed on an "AS IS" BASIS,
        - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        - * See the License for the specific language governing permissions and
        - * limitations under the License.
        - * ========================================================= */
        -
        -(function($, undefined){
        -
        -	var $window = $(window);
        -
        -	function UTCDate(){
        -		return new Date(Date.UTC.apply(Date, arguments));
        -	}
        -	function UTCToday(){
        -		var today = new Date();
        -		return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());
        -	}
        -	function alias(method){
        -		return function(){
        -			return this[method].apply(this, arguments);
        -		};
        -	}
        -
        -	var DateArray = (function(){
        -		var extras = {
        -			get: function(i){
        -				return this.slice(i)[0];
        -			},
        -			contains: function(d){
        -				// Array.indexOf is not cross-browser;
        -				// $.inArray doesn't work with Dates
        -				var val = d && d.valueOf();
        -				for (var i=0, l=this.length; i < l; i++)
        -					if (this[i].valueOf() === val)
        -						return i;
        -				return -1;
        -			},
        -			remove: function(i){
        -				this.splice(i,1);
        -			},
        -			replace: function(new_array){
        -				if (!new_array)
        -					return;
        -				if (!$.isArray(new_array))
        -					new_array = [new_array];
        -				this.clear();
        -				this.push.apply(this, new_array);
        -			},
        -			clear: function(){
        -				this.splice(0);
        -			},
        -			copy: function(){
        -				var a = new DateArray();
        -				a.replace(this);
        -				return a;
        -			}
        -		};
        -
        -		return function(){
        -			var a = [];
        -			a.push.apply(a, arguments);
        -			$.extend(a, extras);
        -			return a;
        -		};
        -	})();
        -
        -
        -	// Picker object
        -
        -	var Datepicker = function(element, options){
        -		this.dates = new DateArray();
        -		this.viewDate = UTCToday();
        -		this.focusDate = null;
        -
        -		this._process_options(options);
        -
        -		this.element = $(element);
        -		this.isInline = false;
        -		this.isInput = this.element.is('input');
        -		this.component = this.element.is('.date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;
        -		this.hasInput = this.component && this.element.find('input').length;
        -		if (this.component && this.component.length === 0)
        -			this.component = false;
        -
        -		this.picker = $(DPGlobal.template);
        -		this._buildEvents();
        -		this._attachEvents();
        -
        -		if (this.isInline){
        -			this.picker.addClass('datepicker-inline').appendTo(this.element);
        -		}
        -		else {
        -			this.picker.addClass('datepicker-dropdown dropdown-menu');
        -		}
        -
        -		if (this.o.rtl){
        -			this.picker.addClass('datepicker-rtl');
        -		}
        -
        -		this.viewMode = this.o.startView;
        -
        -		if (this.o.calendarWeeks)
        -			this.picker.find('tfoot th.today')
        -						.attr('colspan', function(i, val){
        -							return parseInt(val) + 1;
        -						});
        -
        -		this._allow_update = false;
        -
        -		this.setStartDate(this._o.startDate);
        -		this.setEndDate(this._o.endDate);
        -		this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);
        -
        -		this.fillDow();
        -		this.fillMonths();
        -
        -		this._allow_update = true;
        -
        -		this.update();
        -		this.showMode();
        -
        -		if (this.isInline){
        -			this.show();
        -		}
        -	};
        -
        -	Datepicker.prototype = {
        -		constructor: Datepicker,
        -
        -		_process_options: function(opts){
        -			// Store raw options for reference
        -			this._o = $.extend({}, this._o, opts);
        -			// Processed options
        -			var o = this.o = $.extend({}, this._o);
        -
        -			// Check if "de-DE" style date is available, if not language should
        -			// fallback to 2 letter code eg "de"
        -			var lang = o.language;
        -			if (!dates[lang]){
        -				lang = lang.split('-')[0];
        -				if (!dates[lang])
        -					lang = defaults.language;
        -			}
        -			o.language = lang;
        -
        -			switch (o.startView){
        -				case 2:
        -				case 'decade':
        -					o.startView = 2;
        -					break;
        -				case 1:
        -				case 'year':
        -					o.startView = 1;
        -					break;
        -				default:
        -					o.startView = 0;
        -			}
        -
        -			switch (o.minViewMode){
        -				case 1:
        -				case 'months':
        -					o.minViewMode = 1;
        -					break;
        -				case 2:
        -				case 'years':
        -					o.minViewMode = 2;
        -					break;
        -				default:
        -					o.minViewMode = 0;
        -			}
        -
        -			o.startView = Math.max(o.startView, o.minViewMode);
        -
        -			// true, false, or Number > 0
        -			if (o.multidate !== true){
        -				o.multidate = Number(o.multidate) || false;
        -				if (o.multidate !== false)
        -					o.multidate = Math.max(0, o.multidate);
        -				else
        -					o.multidate = 1;
        -			}
        -			o.multidateSeparator = String(o.multidateSeparator);
        -
        -			o.weekStart %= 7;
        -			o.weekEnd = ((o.weekStart + 6) % 7);
        -
        -			var format = DPGlobal.parseFormat(o.format);
        -			if (o.startDate !== -Infinity){
        -				if (!!o.startDate){
        -					if (o.startDate instanceof Date)
        -						o.startDate = this._local_to_utc(this._zero_time(o.startDate));
        -					else
        -						o.startDate = DPGlobal.parseDate(o.startDate, format, o.language);
        -				}
        -				else {
        -					o.startDate = -Infinity;
        -				}
        -			}
        -			if (o.endDate !== Infinity){
        -				if (!!o.endDate){
        -					if (o.endDate instanceof Date)
        -						o.endDate = this._local_to_utc(this._zero_time(o.endDate));
        -					else
        -						o.endDate = DPGlobal.parseDate(o.endDate, format, o.language);
        -				}
        -				else {
        -					o.endDate = Infinity;
        -				}
        -			}
        -
        -			o.daysOfWeekDisabled = o.daysOfWeekDisabled||[];
        -			if (!$.isArray(o.daysOfWeekDisabled))
        -				o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/);
        -			o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){
        -				return parseInt(d, 10);
        -			});
        -
        -			var plc = String(o.orientation).toLowerCase().split(/\s+/g),
        -				_plc = o.orientation.toLowerCase();
        -			plc = $.grep(plc, function(word){
        -				return (/^auto|left|right|top|bottom$/).test(word);
        -			});
        -			o.orientation = {x: 'auto', y: 'auto'};
        -			if (!_plc || _plc === 'auto')
        -				; // no action
        -			else if (plc.length === 1){
        -				switch (plc[0]){
        -					case 'top':
        -					case 'bottom':
        -						o.orientation.y = plc[0];
        -						break;
        -					case 'left':
        -					case 'right':
        -						o.orientation.x = plc[0];
        -						break;
        -				}
        -			}
        -			else {
        -				_plc = $.grep(plc, function(word){
        -					return (/^left|right$/).test(word);
        -				});
        -				o.orientation.x = _plc[0] || 'auto';
        -
        -				_plc = $.grep(plc, function(word){
        -					return (/^top|bottom$/).test(word);
        -				});
        -				o.orientation.y = _plc[0] || 'auto';
        -			}
        -		},
        -		_events: [],
        -		_secondaryEvents: [],
        -		_applyEvents: function(evs){
        -			for (var i=0, el, ch, ev; i < evs.length; i++){
        -				el = evs[i][0];
        -				if (evs[i].length === 2){
        -					ch = undefined;
        -					ev = evs[i][1];
        -				}
        -				else if (evs[i].length === 3){
        -					ch = evs[i][1];
        -					ev = evs[i][2];
        -				}
        -				el.on(ev, ch);
        -			}
        -		},
        -		_unapplyEvents: function(evs){
        -			for (var i=0, el, ev, ch; i < evs.length; i++){
        -				el = evs[i][0];
        -				if (evs[i].length === 2){
        -					ch = undefined;
        -					ev = evs[i][1];
        -				}
        -				else if (evs[i].length === 3){
        -					ch = evs[i][1];
        -					ev = evs[i][2];
        -				}
        -				el.off(ev, ch);
        -			}
        -		},
        -		_buildEvents: function(){
        -			if (this.isInput){ // single input
        -				this._events = [
        -					[this.element, {
        -						focus: $.proxy(this.show, this),
        -						keyup: $.proxy(function(e){
        -							if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)
        -								this.update();
        -						}, this),
        -						keydown: $.proxy(this.keydown, this)
        -					}]
        -				];
        -			}
        -			else if (this.component && this.hasInput){ // component: input + button
        -				this._events = [
        -					// For components that are not readonly, allow keyboard nav
        -					[this.element.find('input'), {
        -						focus: $.proxy(this.show, this),
        -						keyup: $.proxy(function(e){
        -							if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)
        -								this.update();
        -						}, this),
        -						keydown: $.proxy(this.keydown, this)
        -					}],
        -					[this.component, {
        -						click: $.proxy(this.show, this)
        -					}]
        -				];
        -			}
        -			else if (this.element.is('div')){  // inline datepicker
        -				this.isInline = true;
        -			}
        -			else {
        -				this._events = [
        -					[this.element, {
        -						click: $.proxy(this.show, this)
        -					}]
        -				];
        -			}
        -			this._events.push(
        -				// Component: listen for blur on element descendants
        -				[this.element, '*', {
        -					blur: $.proxy(function(e){
        -						this._focused_from = e.target;
        -					}, this)
        -				}],
        -				// Input: listen for blur on element
        -				[this.element, {
        -					blur: $.proxy(function(e){
        -						this._focused_from = e.target;
        -					}, this)
        -				}]
        -			);
        -
        -			this._secondaryEvents = [
        -				[this.picker, {
        -					click: $.proxy(this.click, this)
        -				}],
        -				[$(window), {
        -					resize: $.proxy(this.place, this)
        -				}],
        -				[$(document), {
        -					'mousedown touchstart': $.proxy(function(e){
        -						// Clicked outside the datepicker, hide it
        -						if (!(
        -							this.element.is(e.target) ||
        -							this.element.find(e.target).length ||
        -							this.picker.is(e.target) ||
        -							this.picker.find(e.target).length
        -						)){
        -							this.hide();
        -						}
        -					}, this)
        -				}]
        -			];
        -		},
        -		_attachEvents: function(){
        -			this._detachEvents();
        -			this._applyEvents(this._events);
        -		},
        -		_detachEvents: function(){
        -			this._unapplyEvents(this._events);
        -		},
        -		_attachSecondaryEvents: function(){
        -			this._detachSecondaryEvents();
        -			this._applyEvents(this._secondaryEvents);
        -		},
        -		_detachSecondaryEvents: function(){
        -			this._unapplyEvents(this._secondaryEvents);
        -		},
        -		_trigger: function(event, altdate){
        -			var date = altdate || this.dates.get(-1),
        -				local_date = this._utc_to_local(date);
        -
        -			this.element.trigger({
        -				type: event,
        -				date: local_date,
        -				dates: $.map(this.dates, this._utc_to_local),
        -				format: $.proxy(function(ix, format){
        -					if (arguments.length === 0){
        -						ix = this.dates.length - 1;
        -						format = this.o.format;
        -					}
        -					else if (typeof ix === 'string'){
        -						format = ix;
        -						ix = this.dates.length - 1;
        -					}
        -					format = format || this.o.format;
        -					var date = this.dates.get(ix);
        -					return DPGlobal.formatDate(date, format, this.o.language);
        -				}, this)
        -			});
        -		},
        -
        -		show: function(){
        -			if (!this.isInline)
        -				this.picker.appendTo('body');
        -			this.picker.show();
        -			this.place();
        -			this._attachSecondaryEvents();
        -			this._trigger('show');
        -		},
        -
        -		hide: function(){
        -			if (this.isInline)
        -				return;
        -			if (!this.picker.is(':visible'))
        -				return;
        -			this.focusDate = null;
        -			this.picker.hide().detach();
        -			this._detachSecondaryEvents();
        -			this.viewMode = this.o.startView;
        -			this.showMode();
        -
        -			if (
        -				this.o.forceParse &&
        -				(
        -					this.isInput && this.element.val() ||
        -					this.hasInput && this.element.find('input').val()
        -				)
        -			)
        -				this.setValue();
        -			this._trigger('hide');
        -		},
        -
        -		remove: function(){
        -			this.hide();
        -			this._detachEvents();
        -			this._detachSecondaryEvents();
        -			this.picker.remove();
        -			delete this.element.data().datepicker;
        -			if (!this.isInput){
        -				delete this.element.data().date;
        -			}
        -		},
        -
        -		_utc_to_local: function(utc){
        -			return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000));
        -		},
        -		_local_to_utc: function(local){
        -			return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));
        -		},
        -		_zero_time: function(local){
        -			return local && new Date(local.getFullYear(), local.getMonth(), local.getDate());
        -		},
        -		_zero_utc_time: function(utc){
        -			return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()));
        -		},
        -
        -		getDates: function(){
        -			return $.map(this.dates, this._utc_to_local);
        -		},
        -
        -		getUTCDates: function(){
        -			return $.map(this.dates, function(d){
        -				return new Date(d);
        -			});
        -		},
        -
        -		getDate: function(){
        -			return this._utc_to_local(this.getUTCDate());
        -		},
        -
        -		getUTCDate: function(){
        -			return new Date(this.dates.get(-1));
        -		},
        -
        -		setDates: function(){
        -			var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
        -			this.update.apply(this, args);
        -			this._trigger('changeDate');
        -			this.setValue();
        -		},
        -
        -		setUTCDates: function(){
        -			var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
        -			this.update.apply(this, $.map(args, this._utc_to_local));
        -			this._trigger('changeDate');
        -			this.setValue();
        -		},
        -
        -		setDate: alias('setDates'),
        -		setUTCDate: alias('setUTCDates'),
        -
        -		setValue: function(){
        -			var formatted = this.getFormattedDate();
        -			if (!this.isInput){
        -				if (this.component){
        -					this.element.find('input').val(formatted).change();
        -				}
        -			}
        -			else {
        -				this.element.val(formatted).change();
        -			}
        -		},
        -
        -		getFormattedDate: function(format){
        -			if (format === undefined)
        -				format = this.o.format;
        -
        -			var lang = this.o.language;
        -			return $.map(this.dates, function(d){
        -				return DPGlobal.formatDate(d, format, lang);
        -			}).join(this.o.multidateSeparator);
        -		},
        -
        -		setStartDate: function(startDate){
        -			this._process_options({startDate: startDate});
        -			this.update();
        -			this.updateNavArrows();
        -		},
        -
        -		setEndDate: function(endDate){
        -			this._process_options({endDate: endDate});
        -			this.update();
        -			this.updateNavArrows();
        -		},
        -
        -		setDaysOfWeekDisabled: function(daysOfWeekDisabled){
        -			this._process_options({daysOfWeekDisabled: daysOfWeekDisabled});
        -			this.update();
        -			this.updateNavArrows();
        -		},
        -
        -		place: function(){
        -			if (this.isInline)
        -				return;
        -			var calendarWidth = this.picker.outerWidth(),
        -				calendarHeight = this.picker.outerHeight(),
        -				visualPadding = 10,
        -				windowWidth = $window.width(),
        -				windowHeight = $window.height(),
        -				scrollTop = $window.scrollTop();
        -
        -			var zIndex = parseInt(this.element.parents().filter(function(){
        -					return $(this).css('z-index') !== 'auto';
        -				}).first().css('z-index'))+10;
        -			var offset = this.component ? this.component.parent().offset() : this.element.offset();
        -			var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);
        -			var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);
        -			var left = offset.left,
        -				top = offset.top;
        -
        -			this.picker.removeClass(
        -				'datepicker-orient-top datepicker-orient-bottom '+
        -				'datepicker-orient-right datepicker-orient-left'
        -			);
        -
        -			if (this.o.orientation.x !== 'auto'){
        -				this.picker.addClass('datepicker-orient-' + this.o.orientation.x);
        -				if (this.o.orientation.x === 'right')
        -					left -= calendarWidth - width;
        -			}
        -			// auto x orientation is best-placement: if it crosses a window
        -			// edge, fudge it sideways
        -			else {
        -				// Default to left
        -				this.picker.addClass('datepicker-orient-left');
        -				if (offset.left < 0)
        -					left -= offset.left - visualPadding;
        -				else if (offset.left + calendarWidth > windowWidth)
        -					left = windowWidth - calendarWidth - visualPadding;
        -			}
        -
        -			// auto y orientation is best-situation: top or bottom, no fudging,
        -			// decision based on which shows more of the calendar
        -			var yorient = this.o.orientation.y,
        -				top_overflow, bottom_overflow;
        -			if (yorient === 'auto'){
        -				top_overflow = -scrollTop + offset.top - calendarHeight;
        -				bottom_overflow = scrollTop + windowHeight - (offset.top + height + calendarHeight);
        -				if (Math.max(top_overflow, bottom_overflow) === bottom_overflow)
        -					yorient = 'top';
        -				else
        -					yorient = 'bottom';
        -			}
        -			this.picker.addClass('datepicker-orient-' + yorient);
        -			if (yorient === 'top')
        -				top += height;
        -			else
        -				top -= calendarHeight + parseInt(this.picker.css('padding-top'));
        -
        -			this.picker.css({
        -				top: top,
        -				left: left,
        -				zIndex: zIndex
        -			});
        -		},
        -
        -		_allow_update: true,
        -		update: function(){
        -			if (!this._allow_update)
        -				return;
        -
        -			var oldDates = this.dates.copy(),
        -				dates = [],
        -				fromArgs = false;
        -			if (arguments.length){
        -				$.each(arguments, $.proxy(function(i, date){
        -					if (date instanceof Date)
        -						date = this._local_to_utc(date);
        -					dates.push(date);
        -				}, this));
        -				fromArgs = true;
        -			}
        -			else {
        -				dates = this.isInput
        -						? this.element.val()
        -						: this.element.data('date') || this.element.find('input').val();
        -				if (dates && this.o.multidate)
        -					dates = dates.split(this.o.multidateSeparator);
        -				else
        -					dates = [dates];
        -				delete this.element.data().date;
        -			}
        -
        -			dates = $.map(dates, $.proxy(function(date){
        -				return DPGlobal.parseDate(date, this.o.format, this.o.language);
        -			}, this));
        -			dates = $.grep(dates, $.proxy(function(date){
        -				return (
        -					date < this.o.startDate ||
        -					date > this.o.endDate ||
        -					!date
        -				);
        -			}, this), true);
        -			this.dates.replace(dates);
        -
        -			if (this.dates.length)
        -				this.viewDate = new Date(this.dates.get(-1));
        -			else if (this.viewDate < this.o.startDate)
        -				this.viewDate = new Date(this.o.startDate);
        -			else if (this.viewDate > this.o.endDate)
        -				this.viewDate = new Date(this.o.endDate);
        -
        -			if (fromArgs){
        -				// setting date by clicking
        -				this.setValue();
        -			}
        -			else if (dates.length){
        -				// setting date by typing
        -				if (String(oldDates) !== String(this.dates))
        -					this._trigger('changeDate');
        -			}
        -			if (!this.dates.length && oldDates.length)
        -				this._trigger('clearDate');
        -
        -			this.fill();
        -		},
        -
        -		fillDow: function(){
        -			var dowCnt = this.o.weekStart,
        -				html = '<tr>';
        -			if (this.o.calendarWeeks){
        -				var cell = '<th class="cw">&nbsp;</th>';
        -				html += cell;
        -				this.picker.find('.datepicker-days thead tr:first-child').prepend(cell);
        -			}
        -			while (dowCnt < this.o.weekStart + 7){
        -				html += '<th class="dow">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';
        -			}
        -			html += '</tr>';
        -			this.picker.find('.datepicker-days thead').append(html);
        -		},
        -
        -		fillMonths: function(){
        -			var html = '',
        -			i = 0;
        -			while (i < 12){
        -				html += '<span class="month">'+dates[this.o.language].monthsShort[i++]+'</span>';
        -			}
        -			this.picker.find('.datepicker-months td').html(html);
        -		},
        -
        -		setRange: function(range){
        -			if (!range || !range.length)
        -				delete this.range;
        -			else
        -				this.range = $.map(range, function(d){
        -					return d.valueOf();
        -				});
        -			this.fill();
        -		},
        -
        -		getClassNames: function(date){
        -			var cls = [],
        -				year = this.viewDate.getUTCFullYear(),
        -				month = this.viewDate.getUTCMonth(),
        -				today = new Date();
        -			if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){
        -				cls.push('old');
        -			}
        -			else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){
        -				cls.push('new');
        -			}
        -			if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
        -				cls.push('focused');
        -			// Compare internal UTC date with local today, not UTC today
        -			if (this.o.todayHighlight &&
        -				date.getUTCFullYear() === today.getFullYear() &&
        -				date.getUTCMonth() === today.getMonth() &&
        -				date.getUTCDate() === today.getDate()){
        -				cls.push('today');
        -			}
        -			if (this.dates.contains(date) !== -1)
        -				cls.push('active');
        -			if (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate ||
        -				$.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1){
        -				cls.push('disabled');
        -			}
        -			if (this.range){
        -				if (date > this.range[0] && date < this.range[this.range.length-1]){
        -					cls.push('range');
        -				}
        -				if ($.inArray(date.valueOf(), this.range) !== -1){
        -					cls.push('selected');
        -				}
        -			}
        -			return cls;
        -		},
        -
        -		fill: function(){
        -			var d = new Date(this.viewDate),
        -				year = d.getUTCFullYear(),
        -				month = d.getUTCMonth(),
        -				startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
        -				startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
        -				endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
        -				endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
        -				todaytxt = dates[this.o.language].today || dates['en'].today || '',
        -				cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
        -				tooltip;
        -			this.picker.find('.datepicker-days thead th.datepicker-switch')
        -						.text(dates[this.o.language].months[month]+' '+year);
        -			this.picker.find('tfoot th.today')
        -						.text(todaytxt)
        -						.toggle(this.o.todayBtn !== false);
        -			this.picker.find('tfoot th.clear')
        -						.text(cleartxt)
        -						.toggle(this.o.clearBtn !== false);
        -			this.updateNavArrows();
        -			this.fillMonths();
        -			var prevMonth = UTCDate(year, month-1, 28),
        -				day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
        -			prevMonth.setUTCDate(day);
        -			prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);
        -			var nextMonth = new Date(prevMonth);
        -			nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
        -			nextMonth = nextMonth.valueOf();
        -			var html = [];
        -			var clsName;
        -			while (prevMonth.valueOf() < nextMonth){
        -				if (prevMonth.getUTCDay() === this.o.weekStart){
        -					html.push('<tr>');
        -					if (this.o.calendarWeeks){
        -						// ISO 8601: First week contains first thursday.
        -						// ISO also states week starts on Monday, but we can be more abstract here.
        -						var
        -							// Start of current week: based on weekstart/current date
        -							ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),
        -							// Thursday of this week
        -							th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
        -							// First Thursday of year, year from thursday
        -							yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),
        -							// Calendar week: ms between thursdays, div ms per day, div 7 days
        -							calWeek =  (th - yth) / 864e5 / 7 + 1;
        -						html.push('<td class="cw">'+ calWeek +'</td>');
        -
        -					}
        -				}
        -				clsName = this.getClassNames(prevMonth);
        -				clsName.push('day');
        -
        -				if (this.o.beforeShowDay !== $.noop){
        -					var before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
        -					if (before === undefined)
        -						before = {};
        -					else if (typeof(before) === 'boolean')
        -						before = {enabled: before};
        -					else if (typeof(before) === 'string')
        -						before = {classes: before};
        -					if (before.enabled === false)
        -						clsName.push('disabled');
        -					if (before.classes)
        -						clsName = clsName.concat(before.classes.split(/\s+/));
        -					if (before.tooltip)
        -						tooltip = before.tooltip;
        -				}
        -
        -				clsName = $.unique(clsName);
        -				html.push('<td class="'+clsName.join(' ')+'"' + (tooltip ? ' title="'+tooltip+'"' : '') + '>'+prevMonth.getUTCDate() + '</td>');
        -				if (prevMonth.getUTCDay() === this.o.weekEnd){
        -					html.push('</tr>');
        -				}
        -				prevMonth.setUTCDate(prevMonth.getUTCDate()+1);
        -			}
        -			this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
        -
        -			var months = this.picker.find('.datepicker-months')
        -						.find('th:eq(1)')
        -							.text(year)
        -							.end()
        -						.find('span').removeClass('active');
        -
        -			$.each(this.dates, function(i, d){
        -				if (d.getUTCFullYear() === year)
        -					months.eq(d.getUTCMonth()).addClass('active');
        -			});
        -
        -			if (year < startYear || year > endYear){
        -				months.addClass('disabled');
        -			}
        -			if (year === startYear){
        -				months.slice(0, startMonth).addClass('disabled');
        -			}
        -			if (year === endYear){
        -				months.slice(endMonth+1).addClass('disabled');
        -			}
        -
        -			html = '';
        -			year = parseInt(year/10, 10) * 10;
        -			var yearCont = this.picker.find('.datepicker-years')
        -								.find('th:eq(1)')
        -									.text(year + '-' + (year + 9))
        -									.end()
        -								.find('td');
        -			year -= 1;
        -			var years = $.map(this.dates, function(d){
        -					return d.getUTCFullYear();
        -				}),
        -				classes;
        -			for (var i = -1; i < 11; i++){
        -				classes = ['year'];
        -				if (i === -1)
        -					classes.push('old');
        -				else if (i === 10)
        -					classes.push('new');
        -				if ($.inArray(year, years) !== -1)
        -					classes.push('active');
        -				if (year < startYear || year > endYear)
        -					classes.push('disabled');
        -				html += '<span class="' + classes.join(' ') + '">'+year+'</span>';
        -				year += 1;
        -			}
        -			yearCont.html(html);
        -		},
        -
        -		updateNavArrows: function(){
        -			if (!this._allow_update)
        -				return;
        -
        -			var d = new Date(this.viewDate),
        -				year = d.getUTCFullYear(),
        -				month = d.getUTCMonth();
        -			switch (this.viewMode){
        -				case 0:
        -					if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){
        -						this.picker.find('.prev').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.prev').css({visibility: 'visible'});
        -					}
        -					if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){
        -						this.picker.find('.next').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.next').css({visibility: 'visible'});
        -					}
        -					break;
        -				case 1:
        -				case 2:
        -					if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()){
        -						this.picker.find('.prev').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.prev').css({visibility: 'visible'});
        -					}
        -					if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()){
        -						this.picker.find('.next').css({visibility: 'hidden'});
        -					}
        -					else {
        -						this.picker.find('.next').css({visibility: 'visible'});
        -					}
        -					break;
        -			}
        -		},
        -
        -		click: function(e){
        -			e.preventDefault();
        -			var target = $(e.target).closest('span, td, th'),
        -				year, month, day;
        -			if (target.length === 1){
        -				switch (target[0].nodeName.toLowerCase()){
        -					case 'th':
        -						switch (target[0].className){
        -							case 'datepicker-switch':
        -								this.showMode(1);
        -								break;
        -							case 'prev':
        -							case 'next':
        -								var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1);
        -								switch (this.viewMode){
        -									case 0:
        -										this.viewDate = this.moveMonth(this.viewDate, dir);
        -										this._trigger('changeMonth', this.viewDate);
        -										break;
        -									case 1:
        -									case 2:
        -										this.viewDate = this.moveYear(this.viewDate, dir);
        -										if (this.viewMode === 1)
        -											this._trigger('changeYear', this.viewDate);
        -										break;
        -								}
        -								this.fill();
        -								break;
        -							case 'today':
        -								var date = new Date();
        -								date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
        -
        -								this.showMode(-2);
        -								var which = this.o.todayBtn === 'linked' ? null : 'view';
        -								this._setDate(date, which);
        -								break;
        -							case 'clear':
        -								var element;
        -								if (this.isInput)
        -									element = this.element;
        -								else if (this.component)
        -									element = this.element.find('input');
        -								if (element)
        -									element.val("").change();
        -								this.update();
        -								this._trigger('changeDate');
        -								if (this.o.autoclose)
        -									this.hide();
        -								break;
        -						}
        -						break;
        -					case 'span':
        -						if (!target.is('.disabled')){
        -							this.viewDate.setUTCDate(1);
        -							if (target.is('.month')){
        -								day = 1;
        -								month = target.parent().find('span').index(target);
        -								year = this.viewDate.getUTCFullYear();
        -								this.viewDate.setUTCMonth(month);
        -								this._trigger('changeMonth', this.viewDate);
        -								if (this.o.minViewMode === 1){
        -									this._setDate(UTCDate(year, month, day));
        -								}
        -							}
        -							else {
        -								day = 1;
        -								month = 0;
        -								year = parseInt(target.text(), 10)||0;
        -								this.viewDate.setUTCFullYear(year);
        -								this._trigger('changeYear', this.viewDate);
        -								if (this.o.minViewMode === 2){
        -									this._setDate(UTCDate(year, month, day));
        -								}
        -							}
        -							this.showMode(-1);
        -							this.fill();
        -						}
        -						break;
        -					case 'td':
        -						if (target.is('.day') && !target.is('.disabled')){
        -							day = parseInt(target.text(), 10)||1;
        -							year = this.viewDate.getUTCFullYear();
        -							month = this.viewDate.getUTCMonth();
        -							if (target.is('.old')){
        -								if (month === 0){
        -									month = 11;
        -									year -= 1;
        -								}
        -								else {
        -									month -= 1;
        -								}
        -							}
        -							else if (target.is('.new')){
        -								if (month === 11){
        -									month = 0;
        -									year += 1;
        -								}
        -								else {
        -									month += 1;
        -								}
        -							}
        -							this._setDate(UTCDate(year, month, day));
        -						}
        -						break;
        -				}
        -			}
        -			if (this.picker.is(':visible') && this._focused_from){
        -				$(this._focused_from).focus();
        -			}
        -			delete this._focused_from;
        -		},
        -
        -		_toggle_multidate: function(date){
        -			var ix = this.dates.contains(date);
        -			if (!date){
        -				this.dates.clear();
        -			}
        -			else if (ix !== -1){
        -				this.dates.remove(ix);
        -			}
        -			else {
        -				this.dates.push(date);
        -			}
        -			if (typeof this.o.multidate === 'number')
        -				while (this.dates.length > this.o.multidate)
        -					this.dates.remove(0);
        -		},
        -
        -		_setDate: function(date, which){
        -			if (!which || which === 'date')
        -				this._toggle_multidate(date && new Date(date));
        -			if (!which || which  === 'view')
        -				this.viewDate = date && new Date(date);
        -
        -			this.fill();
        -			this.setValue();
        -			this._trigger('changeDate');
        -			var element;
        -			if (this.isInput){
        -				element = this.element;
        -			}
        -			else if (this.component){
        -				element = this.element.find('input');
        -			}
        -			if (element){
        -				element.change();
        -			}
        -			if (this.o.autoclose && (!which || which === 'date')){
        -				this.hide();
        -			}
        -		},
        -
        -		moveMonth: function(date, dir){
        -			if (!date)
        -				return undefined;
        -			if (!dir)
        -				return date;
        -			var new_date = new Date(date.valueOf()),
        -				day = new_date.getUTCDate(),
        -				month = new_date.getUTCMonth(),
        -				mag = Math.abs(dir),
        -				new_month, test;
        -			dir = dir > 0 ? 1 : -1;
        -			if (mag === 1){
        -				test = dir === -1
        -					// If going back one month, make sure month is not current month
        -					// (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
        -					? function(){
        -						return new_date.getUTCMonth() === month;
        -					}
        -					// If going forward one month, make sure month is as expected
        -					// (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
        -					: function(){
        -						return new_date.getUTCMonth() !== new_month;
        -					};
        -				new_month = month + dir;
        -				new_date.setUTCMonth(new_month);
        -				// Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
        -				if (new_month < 0 || new_month > 11)
        -					new_month = (new_month + 12) % 12;
        -			}
        -			else {
        -				// For magnitudes >1, move one month at a time...
        -				for (var i=0; i < mag; i++)
        -					// ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
        -					new_date = this.moveMonth(new_date, dir);
        -				// ...then reset the day, keeping it in the new month
        -				new_month = new_date.getUTCMonth();
        -				new_date.setUTCDate(day);
        -				test = function(){
        -					return new_month !== new_date.getUTCMonth();
        -				};
        -			}
        -			// Common date-resetting loop -- if date is beyond end of month, make it
        -			// end of month
        -			while (test()){
        -				new_date.setUTCDate(--day);
        -				new_date.setUTCMonth(new_month);
        -			}
        -			return new_date;
        -		},
        -
        -		moveYear: function(date, dir){
        -			return this.moveMonth(date, dir*12);
        -		},
        -
        -		dateWithinRange: function(date){
        -			return date >= this.o.startDate && date <= this.o.endDate;
        -		},
        -
        -		keydown: function(e){
        -			if (this.picker.is(':not(:visible)')){
        -				if (e.keyCode === 27) // allow escape to hide and re-show picker
        -					this.show();
        -				return;
        -			}
        -			var dateChanged = false,
        -				dir, newDate, newViewDate,
        -				focusDate = this.focusDate || this.viewDate;
        -			switch (e.keyCode){
        -				case 27: // escape
        -					if (this.focusDate){
        -						this.focusDate = null;
        -						this.viewDate = this.dates.get(-1) || this.viewDate;
        -						this.fill();
        -					}
        -					else
        -						this.hide();
        -					e.preventDefault();
        -					break;
        -				case 37: // left
        -				case 39: // right
        -					if (!this.o.keyboardNavigation)
        -						break;
        -					dir = e.keyCode === 37 ? -1 : 1;
        -					if (e.ctrlKey){
        -						newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveYear(focusDate, dir);
        -						this._trigger('changeYear', this.viewDate);
        -					}
        -					else if (e.shiftKey){
        -						newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveMonth(focusDate, dir);
        -						this._trigger('changeMonth', this.viewDate);
        -					}
        -					else {
        -						newDate = new Date(this.dates.get(-1) || UTCToday());
        -						newDate.setUTCDate(newDate.getUTCDate() + dir);
        -						newViewDate = new Date(focusDate);
        -						newViewDate.setUTCDate(focusDate.getUTCDate() + dir);
        -					}
        -					if (this.dateWithinRange(newDate)){
        -						this.focusDate = this.viewDate = newViewDate;
        -						this.setValue();
        -						this.fill();
        -						e.preventDefault();
        -					}
        -					break;
        -				case 38: // up
        -				case 40: // down
        -					if (!this.o.keyboardNavigation)
        -						break;
        -					dir = e.keyCode === 38 ? -1 : 1;
        -					if (e.ctrlKey){
        -						newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveYear(focusDate, dir);
        -						this._trigger('changeYear', this.viewDate);
        -					}
        -					else if (e.shiftKey){
        -						newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);
        -						newViewDate = this.moveMonth(focusDate, dir);
        -						this._trigger('changeMonth', this.viewDate);
        -					}
        -					else {
        -						newDate = new Date(this.dates.get(-1) || UTCToday());
        -						newDate.setUTCDate(newDate.getUTCDate() + dir * 7);
        -						newViewDate = new Date(focusDate);
        -						newViewDate.setUTCDate(focusDate.getUTCDate() + dir * 7);
        -					}
        -					if (this.dateWithinRange(newDate)){
        -						this.focusDate = this.viewDate = newViewDate;
        -						this.setValue();
        -						this.fill();
        -						e.preventDefault();
        -					}
        -					break;
        -				case 32: // spacebar
        -					// Spacebar is used in manually typing dates in some formats.
        -					// As such, its behavior should not be hijacked.
        -					break;
        -				case 13: // enter
        -					focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
        -					this._toggle_multidate(focusDate);
        -					dateChanged = true;
        -					this.focusDate = null;
        -					this.viewDate = this.dates.get(-1) || this.viewDate;
        -					this.setValue();
        -					this.fill();
        -					if (this.picker.is(':visible')){
        -						e.preventDefault();
        -						if (this.o.autoclose)
        -							this.hide();
        -					}
        -					break;
        -				case 9: // tab
        -					this.focusDate = null;
        -					this.viewDate = this.dates.get(-1) || this.viewDate;
        -					this.fill();
        -					this.hide();
        -					break;
        -			}
        -			if (dateChanged){
        -				if (this.dates.length)
        -					this._trigger('changeDate');
        -				else
        -					this._trigger('clearDate');
        -				var element;
        -				if (this.isInput){
        -					element = this.element;
        -				}
        -				else if (this.component){
        -					element = this.element.find('input');
        -				}
        -				if (element){
        -					element.change();
        -				}
        -			}
        -		},
        -
        -		showMode: function(dir){
        -			if (dir){
        -				this.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir));
        -			}
        -			this.picker
        -				.find('>div')
        -				.hide()
        -				.filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName)
        -					.css('display', 'block');
        -			this.updateNavArrows();
        -		}
        -	};
        -
        -	var DateRangePicker = function(element, options){
        -		this.element = $(element);
        -		this.inputs = $.map(options.inputs, function(i){
        -			return i.jquery ? i[0] : i;
        -		});
        -		delete options.inputs;
        -
        -		$(this.inputs)
        -			.datepicker(options)
        -			.bind('changeDate', $.proxy(this.dateUpdated, this));
        -
        -		this.pickers = $.map(this.inputs, function(i){
        -			return $(i).data('datepicker');
        -		});
        -		this.updateDates();
        -	};
        -	DateRangePicker.prototype = {
        -		updateDates: function(){
        -			this.dates = $.map(this.pickers, function(i){
        -				return i.getUTCDate();
        -			});
        -			this.updateRanges();
        -		},
        -		updateRanges: function(){
        -			var range = $.map(this.dates, function(d){
        -				return d.valueOf();
        -			});
        -			$.each(this.pickers, function(i, p){
        -				p.setRange(range);
        -			});
        -		},
        -		dateUpdated: function(e){
        -			// `this.updating` is a workaround for preventing infinite recursion
        -			// between `changeDate` triggering and `setUTCDate` calling.  Until
        -			// there is a better mechanism.
        -			if (this.updating)
        -				return;
        -			this.updating = true;
        -
        -			var dp = $(e.target).data('datepicker'),
        -				new_date = dp.getUTCDate(),
        -				i = $.inArray(e.target, this.inputs),
        -				l = this.inputs.length;
        -			if (i === -1)
        -				return;
        -
        -			$.each(this.pickers, function(i, p){
        -				if (!p.getUTCDate())
        -					p.setUTCDate(new_date);
        -			});
        -
        -			if (new_date < this.dates[i]){
        -				// Date being moved earlier/left
        -				while (i >= 0 && new_date < this.dates[i]){
        -					this.pickers[i--].setUTCDate(new_date);
        -				}
        -			}
        -			else if (new_date > this.dates[i]){
        -				// Date being moved later/right
        -				while (i < l && new_date > this.dates[i]){
        -					this.pickers[i++].setUTCDate(new_date);
        -				}
        -			}
        -			this.updateDates();
        -
        -			delete this.updating;
        -		},
        -		remove: function(){
        -			$.map(this.pickers, function(p){ p.remove(); });
        -			delete this.element.data().datepicker;
        -		}
        -	};
        -
        -	function opts_from_el(el, prefix){
        -		// Derive options from element data-attrs
        -		var data = $(el).data(),
        -			out = {}, inkey,
        -			replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
        -		prefix = new RegExp('^' + prefix.toLowerCase());
        -		function re_lower(_,a){
        -			return a.toLowerCase();
        -		}
        -		for (var key in data)
        -			if (prefix.test(key)){
        -				inkey = key.replace(replace, re_lower);
        -				out[inkey] = data[key];
        -			}
        -		return out;
        -	}
        -
        -	function opts_from_locale(lang){
        -		// Derive options from locale plugins
        -		var out = {};
        -		// Check if "de-DE" style date is available, if not language should
        -		// fallback to 2 letter code eg "de"
        -		if (!dates[lang]){
        -			lang = lang.split('-')[0];
        -			if (!dates[lang])
        -				return;
        -		}
        -		var d = dates[lang];
        -		$.each(locale_opts, function(i,k){
        -			if (k in d)
        -				out[k] = d[k];
        -		});
        -		return out;
        -	}
        -
        -	var old = $.fn.datepicker;
        -	$.fn.datepicker = function(option){
        -		var args = Array.apply(null, arguments);
        -		args.shift();
        -		var internal_return;
        -		this.each(function(){
        -			var $this = $(this),
        -				data = $this.data('datepicker'),
        -				options = typeof option === 'object' && option;
        -			if (!data){
        -				var elopts = opts_from_el(this, 'date'),
        -					// Preliminary otions
        -					xopts = $.extend({}, defaults, elopts, options),
        -					locopts = opts_from_locale(xopts.language),
        -					// Options priority: js args, data-attrs, locales, defaults
        -					opts = $.extend({}, defaults, locopts, elopts, options);
        -				if ($this.is('.input-daterange') || opts.inputs){
        -					var ropts = {
        -						inputs: opts.inputs || $this.find('input').toArray()
        -					};
        -					$this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts))));
        -				}
        -				else {
        -					$this.data('datepicker', (data = new Datepicker(this, opts)));
        -				}
        -			}
        -			if (typeof option === 'string' && typeof data[option] === 'function'){
        -				internal_return = data[option].apply(data, args);
        -				if (internal_return !== undefined)
        -					return false;
        -			}
        -		});
        -		if (internal_return !== undefined)
        -			return internal_return;
        -		else
        -			return this;
        -	};
        -
        -	var defaults = $.fn.datepicker.defaults = {
        -		autoclose: false,
        -		beforeShowDay: $.noop,
        -		calendarWeeks: false,
        -		clearBtn: false,
        -		daysOfWeekDisabled: [],
        -		endDate: Infinity,
        -		forceParse: true,
        -		format: 'mm/dd/yyyy',
        -		keyboardNavigation: true,
        -		language: 'en',
        -		minViewMode: 0,
        -		multidate: false,
        -		multidateSeparator: ',',
        -		orientation: "auto",
        -		rtl: false,
        -		startDate: -Infinity,
        -		startView: 0,
        -		todayBtn: false,
        -		todayHighlight: false,
        -		weekStart: 0
        -	};
        -	var locale_opts = $.fn.datepicker.locale_opts = [
        -		'format',
        -		'rtl',
        -		'weekStart'
        -	];
        -	$.fn.datepicker.Constructor = Datepicker;
        -	var dates = $.fn.datepicker.dates = {
        -		en: {
        -			days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
        -			daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        -			daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
        -			months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
        -			monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
        -			today: "Today",
        -			clear: "Clear"
        -		}
        -	};
        -
        -	var DPGlobal = {
        -		modes: [
        -			{
        -				clsName: 'days',
        -				navFnc: 'Month',
        -				navStep: 1
        -			},
        -			{
        -				clsName: 'months',
        -				navFnc: 'FullYear',
        -				navStep: 1
        -			},
        -			{
        -				clsName: 'years',
        -				navFnc: 'FullYear',
        -				navStep: 10
        -		}],
        -		isLeapYear: function(year){
        -			return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
        -		},
        -		getDaysInMonth: function(year, month){
        -			return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
        -		},
        -		validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
        -		nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,
        -		parseFormat: function(format){
        -			// IE treats \0 as a string end in inputs (truncating the value),
        -			// so it's a bad format delimiter, anyway
        -			var separators = format.replace(this.validParts, '\0').split('\0'),
        -				parts = format.match(this.validParts);
        -			if (!separators || !separators.length || !parts || parts.length === 0){
        -				throw new Error("Invalid date format.");
        -			}
        -			return {separators: separators, parts: parts};
        -		},
        -		parseDate: function(date, format, language){
        -			if (!date)
        -				return undefined;
        -			if (date instanceof Date)
        -				return date;
        -			if (typeof format === 'string')
        -				format = DPGlobal.parseFormat(format);
        -			var part_re = /([\-+]\d+)([dmwy])/,
        -				parts = date.match(/([\-+]\d+)([dmwy])/g),
        -				part, dir, i;
        -			if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){
        -				date = new Date();
        -				for (i=0; i < parts.length; i++){
        -					part = part_re.exec(parts[i]);
        -					dir = parseInt(part[1]);
        -					switch (part[2]){
        -						case 'd':
        -							date.setUTCDate(date.getUTCDate() + dir);
        -							break;
        -						case 'm':
        -							date = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);
        -							break;
        -						case 'w':
        -							date.setUTCDate(date.getUTCDate() + dir * 7);
        -							break;
        -						case 'y':
        -							date = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);
        -							break;
        -					}
        -				}
        -				return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);
        -			}
        -			parts = date && date.match(this.nonpunctuation) || [];
        -			date = new Date();
        -			var parsed = {},
        -				setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
        -				setters_map = {
        -					yyyy: function(d,v){
        -						return d.setUTCFullYear(v);
        -					},
        -					yy: function(d,v){
        -						return d.setUTCFullYear(2000+v);
        -					},
        -					m: function(d,v){
        -						if (isNaN(d))
        -							return d;
        -						v -= 1;
        -						while (v < 0) v += 12;
        -						v %= 12;
        -						d.setUTCMonth(v);
        -						while (d.getUTCMonth() !== v)
        -							d.setUTCDate(d.getUTCDate()-1);
        -						return d;
        -					},
        -					d: function(d,v){
        -						return d.setUTCDate(v);
        -					}
        -				},
        -				val, filtered;
        -			setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
        -			setters_map['dd'] = setters_map['d'];
        -			date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
        -			var fparts = format.parts.slice();
        -			// Remove noop parts
        -			if (parts.length !== fparts.length){
        -				fparts = $(fparts).filter(function(i,p){
        -					return $.inArray(p, setters_order) !== -1;
        -				}).toArray();
        -			}
        -			// Process remainder
        -			function match_part(){
        -				var m = this.slice(0, parts[i].length),
        -					p = parts[i].slice(0, m.length);
        -				return m === p;
        -			}
        -			if (parts.length === fparts.length){
        -				var cnt;
        -				for (i=0, cnt = fparts.length; i < cnt; i++){
        -					val = parseInt(parts[i], 10);
        -					part = fparts[i];
        -					if (isNaN(val)){
        -						switch (part){
        -							case 'MM':
        -								filtered = $(dates[language].months).filter(match_part);
        -								val = $.inArray(filtered[0], dates[language].months) + 1;
        -								break;
        -							case 'M':
        -								filtered = $(dates[language].monthsShort).filter(match_part);
        -								val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
        -								break;
        -						}
        -					}
        -					parsed[part] = val;
        -				}
        -				var _date, s;
        -				for (i=0; i < setters_order.length; i++){
        -					s = setters_order[i];
        -					if (s in parsed && !isNaN(parsed[s])){
        -						_date = new Date(date);
        -						setters_map[s](_date, parsed[s]);
        -						if (!isNaN(_date))
        -							date = _date;
        -					}
        -				}
        -			}
        -			return date;
        -		},
        -		formatDate: function(date, format, language){
        -			if (!date)
        -				return '';
        -			if (typeof format === 'string')
        -				format = DPGlobal.parseFormat(format);
        -			var val = {
        -				d: date.getUTCDate(),
        -				D: dates[language].daysShort[date.getUTCDay()],
        -				DD: dates[language].days[date.getUTCDay()],
        -				m: date.getUTCMonth() + 1,
        -				M: dates[language].monthsShort[date.getUTCMonth()],
        -				MM: dates[language].months[date.getUTCMonth()],
        -				yy: date.getUTCFullYear().toString().substring(2),
        -				yyyy: date.getUTCFullYear()
        -			};
        -			val.dd = (val.d < 10 ? '0' : '') + val.d;
        -			val.mm = (val.m < 10 ? '0' : '') + val.m;
        -			date = [];
        -			var seps = $.extend([], format.separators);
        -			for (var i=0, cnt = format.parts.length; i <= cnt; i++){
        -				if (seps.length)
        -					date.push(seps.shift());
        -				date.push(val[format.parts[i]]);
        -			}
        -			return date.join('');
        -		},
        -		headTemplate: '<thead>'+
        -							'<tr>'+
        -								'<th class="prev">&laquo;</th>'+
        -								'<th colspan="5" class="datepicker-switch"></th>'+
        -								'<th class="next">&raquo;</th>'+
        -							'</tr>'+
        -						'</thead>',
        -		contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
        -		footTemplate: '<tfoot>'+
        -							'<tr>'+
        -								'<th colspan="7" class="today"></th>'+
        -							'</tr>'+
        -							'<tr>'+
        -								'<th colspan="7" class="clear"></th>'+
        -							'</tr>'+
        -						'</tfoot>'
        -	};
        -	DPGlobal.template = '<div class="datepicker">'+
        -							'<div class="datepicker-days">'+
        -								'<table class="table table-condensed">'+
        -									DPGlobal.headTemplate+
        -									'<tbody></tbody>'+
        -									DPGlobal.footTemplate+
        -								'</table>'+
        -							'</div>'+
        -							'<div class="datepicker-months">'+
        -								'<table class="table table-condensed">'+
        -									DPGlobal.headTemplate+
        -									DPGlobal.contTemplate+
        -									DPGlobal.footTemplate+
        -								'</table>'+
        -							'</div>'+
        -							'<div class="datepicker-years">'+
        -								'<table class="table table-condensed">'+
        -									DPGlobal.headTemplate+
        -									DPGlobal.contTemplate+
        -									DPGlobal.footTemplate+
        -								'</table>'+
        -							'</div>'+
        -						'</div>';
        -
        -	$.fn.datepicker.DPGlobal = DPGlobal;
        -
        -
        -	/* DATEPICKER NO CONFLICT
        -	* =================== */
        -
        -	$.fn.datepicker.noConflict = function(){
        -		$.fn.datepicker = old;
        -		return this;
        -	};
        -
        -
        -	/* DATEPICKER DATA-API
        -	* ================== */
        -
        -	$(document).on(
        -		'focus.datepicker.data-api click.datepicker.data-api',
        -		'[data-provide="datepicker"]',
        -		function(e){
        -			var $this = $(this);
        -			if ($this.data('datepicker'))
        -				return;
        -			e.preventDefault();
        -			// component click requires us to explicitly show it
        -			$this.datepicker('show');
        -		}
        -	);
        -	$(function(){
        -		$('[data-provide="datepicker-inline"]').datepicker();
        -	});
        -
        -}(window.jQuery));
        -
        -/*!
        - * Select2 4.0.0
        - * https://select2.github.io
        - *
        - * Released under the MIT license
        - * https://github.com/select2/select2/blob/master/LICENSE.md
        - */
        -(function (factory) {
        -  if (typeof define === 'function' && define.amd) {
        -    // AMD. Register as an anonymous module.
        -    define(['jquery'], factory);
        -  } else if (typeof exports === 'object') {
        -    // Node/CommonJS
        -    factory(require('jquery'));
        -  } else {
        -    // Browser globals
        -    factory(jQuery);
        -  }
        -}(function (jQuery) {
        -  // This is needed so we can catch the AMD loader configuration and use it
        -  // The inner file should be wrapped (by `banner.start.js`) in a function that
        -  // returns the AMD loader references.
        -  var S2 =
        -(function () {
        -  // Restore the Select2 AMD loader so it can be used
        -  // Needed mostly in the language files, where the loader is not inserted
        -  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
        -    var S2 = jQuery.fn.select2.amd;
        -  }
        -var S2;(function () { if (!S2 || !S2.requirejs) {
        -if (!S2) { S2 = {}; } else { require = S2; }
        -/**
        - * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
        - * Available via the MIT or new BSD license.
        - * see: http://github.com/jrburke/almond for details
        - */
        -//Going sloppy to avoid 'use strict' string cost, but strict practices should
        -//be followed.
        -/*jslint sloppy: true */
        -/*global setTimeout: false */
        -
        -var requirejs, require, define;
        -(function (undef) {
        -    var main, req, makeMap, handlers,
        -        defined = {},
        -        waiting = {},
        -        config = {},
        -        defining = {},
        -        hasOwn = Object.prototype.hasOwnProperty,
        -        aps = [].slice,
        -        jsSuffixRegExp = /\.js$/;
        -
        -    function hasProp(obj, prop) {
        -        return hasOwn.call(obj, prop);
        -    }
        -
        -    /**
        -     * Given a relative module name, like ./something, normalize it to
        -     * a real name that can be mapped to a path.
        -     * @param {String} name the relative name
        -     * @param {String} baseName a real name that the name arg is relative
        -     * to.
        -     * @returns {String} normalized name
        -     */
        -    function normalize(name, baseName) {
        -        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
        -            foundI, foundStarMap, starI, i, j, part,
        -            baseParts = baseName && baseName.split("/"),
        -            map = config.map,
        -            starMap = (map && map['*']) || {};
        -
        -        //Adjust any relative paths.
        -        if (name && name.charAt(0) === ".") {
        -            //If have a base name, try to normalize against it,
        -            //otherwise, assume it is a top-level require that will
        -            //be relative to baseUrl in the end.
        -            if (baseName) {
        -                //Convert baseName to array, and lop off the last part,
        -                //so that . matches that "directory" and not name of the baseName's
        -                //module. For instance, baseName of "one/two/three", maps to
        -                //"one/two/three.js", but we want the directory, "one/two" for
        -                //this normalization.
        -                baseParts = baseParts.slice(0, baseParts.length - 1);
        -                name = name.split('/');
        -                lastIndex = name.length - 1;
        -
        -                // Node .js allowance:
        -                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
        -                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
        -                }
        -
        -                name = baseParts.concat(name);
        -
        -                //start trimDots
        -                for (i = 0; i < name.length; i += 1) {
        -                    part = name[i];
        -                    if (part === ".") {
        -                        name.splice(i, 1);
        -                        i -= 1;
        -                    } else if (part === "..") {
        -                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {
        -                            //End of the line. Keep at least one non-dot
        -                            //path segment at the front so it can be mapped
        -                            //correctly to disk. Otherwise, there is likely
        -                            //no path mapping for a path starting with '..'.
        -                            //This can still fail, but catches the most reasonable
        -                            //uses of ..
        -                            break;
        -                        } else if (i > 0) {
        -                            name.splice(i - 1, 2);
        -                            i -= 2;
        -                        }
        -                    }
        -                }
        -                //end trimDots
        -
        -                name = name.join("/");
        -            } else if (name.indexOf('./') === 0) {
        -                // No baseName, so this is ID is resolved relative
        -                // to baseUrl, pull off the leading dot.
        -                name = name.substring(2);
        -            }
        -        }
        -
        -        //Apply map config if available.
        -        if ((baseParts || starMap) && map) {
        -            nameParts = name.split('/');
        -
        -            for (i = nameParts.length; i > 0; i -= 1) {
        -                nameSegment = nameParts.slice(0, i).join("/");
        -
        -                if (baseParts) {
        -                    //Find the longest baseName segment match in the config.
        -                    //So, do joins on the biggest to smallest lengths of baseParts.
        -                    for (j = baseParts.length; j > 0; j -= 1) {
        -                        mapValue = map[baseParts.slice(0, j).join('/')];
        -
        -                        //baseName segment has  config, find if it has one for
        -                        //this name.
        -                        if (mapValue) {
        -                            mapValue = mapValue[nameSegment];
        -                            if (mapValue) {
        -                                //Match, update name to the new value.
        -                                foundMap = mapValue;
        -                                foundI = i;
        -                                break;
        -                            }
        -                        }
        -                    }
        -                }
        -
        -                if (foundMap) {
        -                    break;
        -                }
        -
        -                //Check for a star map match, but just hold on to it,
        -                //if there is a shorter segment match later in a matching
        -                //config, then favor over this star map.
        -                if (!foundStarMap && starMap && starMap[nameSegment]) {
        -                    foundStarMap = starMap[nameSegment];
        -                    starI = i;
        -                }
        -            }
        -
        -            if (!foundMap && foundStarMap) {
        -                foundMap = foundStarMap;
        -                foundI = starI;
        -            }
        -
        -            if (foundMap) {
        -                nameParts.splice(0, foundI, foundMap);
        -                name = nameParts.join('/');
        -            }
        -        }
        -
        -        return name;
        -    }
        -
        -    function makeRequire(relName, forceSync) {
        -        return function () {
        -            //A version of a require function that passes a moduleName
        -            //value for items that may need to
        -            //look up paths relative to the moduleName
        -            return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
        -        };
        -    }
        -
        -    function makeNormalize(relName) {
        -        return function (name) {
        -            return normalize(name, relName);
        -        };
        -    }
        -
        -    function makeLoad(depName) {
        -        return function (value) {
        -            defined[depName] = value;
        -        };
        -    }
        -
        -    function callDep(name) {
        -        if (hasProp(waiting, name)) {
        -            var args = waiting[name];
        -            delete waiting[name];
        -            defining[name] = true;
        -            main.apply(undef, args);
        -        }
        -
        -        if (!hasProp(defined, name) && !hasProp(defining, name)) {
        -            throw new Error('No ' + name);
        -        }
        -        return defined[name];
        -    }
        -
        -    //Turns a plugin!resource to [plugin, resource]
        -    //with the plugin being undefined if the name
        -    //did not have a plugin prefix.
        -    function splitPrefix(name) {
        -        var prefix,
        -            index = name ? name.indexOf('!') : -1;
        -        if (index > -1) {
        -            prefix = name.substring(0, index);
        -            name = name.substring(index + 1, name.length);
        -        }
        -        return [prefix, name];
        -    }
        -
        -    /**
        -     * Makes a name map, normalizing the name, and using a plugin
        -     * for normalization if necessary. Grabs a ref to plugin
        -     * too, as an optimization.
        -     */
        -    makeMap = function (name, relName) {
        -        var plugin,
        -            parts = splitPrefix(name),
        -            prefix = parts[0];
        -
        -        name = parts[1];
        -
        -        if (prefix) {
        -            prefix = normalize(prefix, relName);
        -            plugin = callDep(prefix);
        -        }
        -
        -        //Normalize according
        -        if (prefix) {
        -            if (plugin && plugin.normalize) {
        -                name = plugin.normalize(name, makeNormalize(relName));
        -            } else {
        -                name = normalize(name, relName);
        -            }
        -        } else {
        -            name = normalize(name, relName);
        -            parts = splitPrefix(name);
        -            prefix = parts[0];
        -            name = parts[1];
        -            if (prefix) {
        -                plugin = callDep(prefix);
        -            }
        -        }
        -
        -        //Using ridiculous property names for space reasons
        -        return {
        -            f: prefix ? prefix + '!' + name : name, //fullName
        -            n: name,
        -            pr: prefix,
        -            p: plugin
        -        };
        -    };
        -
        -    function makeConfig(name) {
        -        return function () {
        -            return (config && config.config && config.config[name]) || {};
        -        };
        -    }
        -
        -    handlers = {
        -        require: function (name) {
        -            return makeRequire(name);
        -        },
        -        exports: function (name) {
        -            var e = defined[name];
        -            if (typeof e !== 'undefined') {
        -                return e;
        -            } else {
        -                return (defined[name] = {});
        -            }
        -        },
        -        module: function (name) {
        -            return {
        -                id: name,
        -                uri: '',
        -                exports: defined[name],
        -                config: makeConfig(name)
        -            };
        -        }
        -    };
        -
        -    main = function (name, deps, callback, relName) {
        -        var cjsModule, depName, ret, map, i,
        -            args = [],
        -            callbackType = typeof callback,
        -            usingExports;
        -
        -        //Use name if no relName
        -        relName = relName || name;
        -
        -        //Call the callback to define the module, if necessary.
        -        if (callbackType === 'undefined' || callbackType === 'function') {
        -            //Pull out the defined dependencies and pass the ordered
        -            //values to the callback.
        -            //Default to [require, exports, module] if no deps
        -            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
        -            for (i = 0; i < deps.length; i += 1) {
        -                map = makeMap(deps[i], relName);
        -                depName = map.f;
        -
        -                //Fast path CommonJS standard dependencies.
        -                if (depName === "require") {
        -                    args[i] = handlers.require(name);
        -                } else if (depName === "exports") {
        -                    //CommonJS module spec 1.1
        -                    args[i] = handlers.exports(name);
        -                    usingExports = true;
        -                } else if (depName === "module") {
        -                    //CommonJS module spec 1.1
        -                    cjsModule = args[i] = handlers.module(name);
        -                } else if (hasProp(defined, depName) ||
        -                           hasProp(waiting, depName) ||
        -                           hasProp(defining, depName)) {
        -                    args[i] = callDep(depName);
        -                } else if (map.p) {
        -                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
        -                    args[i] = defined[depName];
        -                } else {
        -                    throw new Error(name + ' missing ' + depName);
        -                }
        -            }
        -
        -            ret = callback ? callback.apply(defined[name], args) : undefined;
        -
        -            if (name) {
        -                //If setting exports via "module" is in play,
        -                //favor that over return value and exports. After that,
        -                //favor a non-undefined return value over exports use.
        -                if (cjsModule && cjsModule.exports !== undef &&
        -                        cjsModule.exports !== defined[name]) {
        -                    defined[name] = cjsModule.exports;
        -                } else if (ret !== undef || !usingExports) {
        -                    //Use the return value from the function.
        -                    defined[name] = ret;
        -                }
        -            }
        -        } else if (name) {
        -            //May just be an object definition for the module. Only
        -            //worry about defining if have a module name.
        -            defined[name] = callback;
        -        }
        -    };
        -
        -    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
        -        if (typeof deps === "string") {
        -            if (handlers[deps]) {
        -                //callback in this case is really relName
        -                return handlers[deps](callback);
        -            }
        -            //Just return the module wanted. In this scenario, the
        -            //deps arg is the module name, and second arg (if passed)
        -            //is just the relName.
        -            //Normalize module name, if it contains . or ..
        -            return callDep(makeMap(deps, callback).f);
        -        } else if (!deps.splice) {
        -            //deps is a config object, not an array.
        -            config = deps;
        -            if (config.deps) {
        -                req(config.deps, config.callback);
        -            }
        -            if (!callback) {
        -                return;
        -            }
        -
        -            if (callback.splice) {
        -                //callback is an array, which means it is a dependency list.
        -                //Adjust args if there are dependencies
        -                deps = callback;
        -                callback = relName;
        -                relName = null;
        -            } else {
        -                deps = undef;
        -            }
        -        }
        -
        -        //Support require(['a'])
        -        callback = callback || function () {};
        -
        -        //If relName is a function, it is an errback handler,
        -        //so remove it.
        -        if (typeof relName === 'function') {
        -            relName = forceSync;
        -            forceSync = alt;
        -        }
        -
        -        //Simulate async callback;
        -        if (forceSync) {
        -            main(undef, deps, callback, relName);
        -        } else {
        -            //Using a non-zero value because of concern for what old browsers
        -            //do, and latest browsers "upgrade" to 4 if lower value is used:
        -            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
        -            //If want a value immediately, use require('id') instead -- something
        -            //that works in almond on the global level, but not guaranteed and
        -            //unlikely to work in other AMD implementations.
        -            setTimeout(function () {
        -                main(undef, deps, callback, relName);
        -            }, 4);
        -        }
        -
        -        return req;
        -    };
        -
        -    /**
        -     * Just drops the config on the floor, but returns req in case
        -     * the config return value is used.
        -     */
        -    req.config = function (cfg) {
        -        return req(cfg);
        -    };
        -
        -    /**
        -     * Expose module registry for debugging and tooling
        -     */
        -    requirejs._defined = defined;
        -
        -    define = function (name, deps, callback) {
        -
        -        //This module may not have dependencies
        -        if (!deps.splice) {
        -            //deps is not an array, so probably means
        -            //an object literal or factory function for
        -            //the value. Adjust args.
        -            callback = deps;
        -            deps = [];
        -        }
        -
        -        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
        -            waiting[name] = [name, deps, callback];
        -        }
        -    };
        -
        -    define.amd = {
        -        jQuery: true
        -    };
        -}());
        -
        -S2.requirejs = requirejs;S2.require = require;S2.define = define;
        -}
        -}());
        -S2.define("almond", function(){});
        -
        -/* global jQuery:false, $:false */
        -S2.define('jquery',[],function () {
        -  var _$ = jQuery || $;
        -
        -  if (_$ == null && console && console.error) {
        -    console.error(
        -      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
        -      'found. Make sure that you are including jQuery before Select2 on your ' +
        -      'web page.'
        -    );
        -  }
        -
        -  return _$;
        -});
        -
        -S2.define('select2/utils',[
        -  'jquery'
        -], function ($) {
        -  var Utils = {};
        -
        -  Utils.Extend = function (ChildClass, SuperClass) {
        -    var __hasProp = {}.hasOwnProperty;
        -
        -    function BaseConstructor () {
        -      this.constructor = ChildClass;
        -    }
        -
        -    for (var key in SuperClass) {
        -      if (__hasProp.call(SuperClass, key)) {
        -        ChildClass[key] = SuperClass[key];
        -      }
        -    }
        -
        -    BaseConstructor.prototype = SuperClass.prototype;
        -    ChildClass.prototype = new BaseConstructor();
        -    ChildClass.__super__ = SuperClass.prototype;
        -
        -    return ChildClass;
        -  };
        -
        -  function getMethods (theClass) {
        -    var proto = theClass.prototype;
        -
        -    var methods = [];
        -
        -    for (var methodName in proto) {
        -      var m = proto[methodName];
        -
        -      if (typeof m !== 'function') {
        -        continue;
        -      }
        -
        -      if (methodName === 'constructor') {
        -        continue;
        -      }
        -
        -      methods.push(methodName);
        -    }
        -
        -    return methods;
        -  }
        -
        -  Utils.Decorate = function (SuperClass, DecoratorClass) {
        -    var decoratedMethods = getMethods(DecoratorClass);
        -    var superMethods = getMethods(SuperClass);
        -
        -    function DecoratedClass () {
        -      var unshift = Array.prototype.unshift;
        -
        -      var argCount = DecoratorClass.prototype.constructor.length;
        -
        -      var calledConstructor = SuperClass.prototype.constructor;
        -
        -      if (argCount > 0) {
        -        unshift.call(arguments, SuperClass.prototype.constructor);
        -
        -        calledConstructor = DecoratorClass.prototype.constructor;
        -      }
        -
        -      calledConstructor.apply(this, arguments);
        -    }
        -
        -    DecoratorClass.displayName = SuperClass.displayName;
        -
        -    function ctr () {
        -      this.constructor = DecoratedClass;
        -    }
        -
        -    DecoratedClass.prototype = new ctr();
        -
        -    for (var m = 0; m < superMethods.length; m++) {
        -        var superMethod = superMethods[m];
        -
        -        DecoratedClass.prototype[superMethod] =
        -          SuperClass.prototype[superMethod];
        -    }
        -
        -    var calledMethod = function (methodName) {
        -      // Stub out the original method if it's not decorating an actual method
        -      var originalMethod = function () {};
        -
        -      if (methodName in DecoratedClass.prototype) {
        -        originalMethod = DecoratedClass.prototype[methodName];
        -      }
        -
        -      var decoratedMethod = DecoratorClass.prototype[methodName];
        -
        -      return function () {
        -        var unshift = Array.prototype.unshift;
        -
        -        unshift.call(arguments, originalMethod);
        -
        -        return decoratedMethod.apply(this, arguments);
        -      };
        -    };
        -
        -    for (var d = 0; d < decoratedMethods.length; d++) {
        -      var decoratedMethod = decoratedMethods[d];
        -
        -      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
        -    }
        -
        -    return DecoratedClass;
        -  };
        -
        -  var Observable = function () {
        -    this.listeners = {};
        -  };
        -
        -  Observable.prototype.on = function (event, callback) {
        -    this.listeners = this.listeners || {};
        -
        -    if (event in this.listeners) {
        -      this.listeners[event].push(callback);
        -    } else {
        -      this.listeners[event] = [callback];
        -    }
        -  };
        -
        -  Observable.prototype.trigger = function (event) {
        -    var slice = Array.prototype.slice;
        -
        -    this.listeners = this.listeners || {};
        -
        -    if (event in this.listeners) {
        -      this.invoke(this.listeners[event], slice.call(arguments, 1));
        -    }
        -
        -    if ('*' in this.listeners) {
        -      this.invoke(this.listeners['*'], arguments);
        -    }
        -  };
        -
        -  Observable.prototype.invoke = function (listeners, params) {
        -    for (var i = 0, len = listeners.length; i < len; i++) {
        -      listeners[i].apply(this, params);
        -    }
        -  };
        -
        -  Utils.Observable = Observable;
        -
        -  Utils.generateChars = function (length) {
        -    var chars = '';
        -
        -    for (var i = 0; i < length; i++) {
        -      var randomChar = Math.floor(Math.random() * 36);
        -      chars += randomChar.toString(36);
        -    }
        -
        -    return chars;
        -  };
        -
        -  Utils.bind = function (func, context) {
        -    return function () {
        -      func.apply(context, arguments);
        -    };
        -  };
        -
        -  Utils._convertData = function (data) {
        -    for (var originalKey in data) {
        -      var keys = originalKey.split('-');
        -
        -      var dataLevel = data;
        -
        -      if (keys.length === 1) {
        -        continue;
        -      }
        -
        -      for (var k = 0; k < keys.length; k++) {
        -        var key = keys[k];
        -
        -        // Lowercase the first letter
        -        // By default, dash-separated becomes camelCase
        -        key = key.substring(0, 1).toLowerCase() + key.substring(1);
        -
        -        if (!(key in dataLevel)) {
        -          dataLevel[key] = {};
        -        }
        -
        -        if (k == keys.length - 1) {
        -          dataLevel[key] = data[originalKey];
        -        }
        -
        -        dataLevel = dataLevel[key];
        -      }
        -
        -      delete data[originalKey];
        -    }
        -
        -    return data;
        -  };
        -
        -  Utils.hasScroll = function (index, el) {
        -    // Adapted from the function created by @ShadowScripter
        -    // and adapted by @BillBarry on the Stack Exchange Code Review website.
        -    // The original code can be found at
        -    // http://codereview.stackexchange.com/q/13338
        -    // and was designed to be used with the Sizzle selector engine.
        -
        -    var $el = $(el);
        -    var overflowX = el.style.overflowX;
        -    var overflowY = el.style.overflowY;
        -
        -    //Check both x and y declarations
        -    if (overflowX === overflowY &&
        -        (overflowY === 'hidden' || overflowY === 'visible')) {
        -      return false;
        -    }
        -
        -    if (overflowX === 'scroll' || overflowY === 'scroll') {
        -      return true;
        -    }
        -
        -    return ($el.innerHeight() < el.scrollHeight ||
        -      $el.innerWidth() < el.scrollWidth);
        -  };
        -
        -  Utils.escapeMarkup = function (markup) {
        -    var replaceMap = {
        -      '\\': '&#92;',
        -      '&': '&amp;',
        -      '<': '&lt;',
        -      '>': '&gt;',
        -      '"': '&quot;',
        -      '\'': '&#39;',
        -      '/': '&#47;'
        -    };
        -
        -    // Do not try to escape the markup if it's not a string
        -    if (typeof markup !== 'string') {
        -      return markup;
        -    }
        -
        -    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
        -      return replaceMap[match];
        -    });
        -  };
        -
        -  // Append an array of jQuery nodes to a given element.
        -  Utils.appendMany = function ($element, $nodes) {
        -    // jQuery 1.7.x does not support $.fn.append() with an array
        -    // Fall back to a jQuery object collection using $.fn.add()
        -    if ($.fn.jquery.substr(0, 3) === '1.7') {
        -      var $jqNodes = $();
        -
        -      $.map($nodes, function (node) {
        -        $jqNodes = $jqNodes.add(node);
        -      });
        -
        -      $nodes = $jqNodes;
        -    }
        -
        -    $element.append($nodes);
        -  };
        -
        -  return Utils;
        -});
        -
        -S2.define('select2/results',[
        -  'jquery',
        -  './utils'
        -], function ($, Utils) {
        -  function Results ($element, options, dataAdapter) {
        -    this.$element = $element;
        -    this.data = dataAdapter;
        -    this.options = options;
        -
        -    Results.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(Results, Utils.Observable);
        -
        -  Results.prototype.render = function () {
        -    var $results = $(
        -      '<ul class="select2-results__options" role="tree"></ul>'
        -    );
        -
        -    if (this.options.get('multiple')) {
        -      $results.attr('aria-multiselectable', 'true');
        -    }
        -
        -    this.$results = $results;
        -
        -    return $results;
        -  };
        -
        -  Results.prototype.clear = function () {
        -    this.$results.empty();
        -  };
        -
        -  Results.prototype.displayMessage = function (params) {
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    this.clear();
        -    this.hideLoading();
        -
        -    var $message = $(
        -      '<li role="treeitem" class="select2-results__option"></li>'
        -    );
        -
        -    var message = this.options.get('translations').get(params.message);
        -
        -    $message.append(
        -      escapeMarkup(
        -        message(params.args)
        -      )
        -    );
        -
        -    this.$results.append($message);
        -  };
        -
        -  Results.prototype.append = function (data) {
        -    this.hideLoading();
        -
        -    var $options = [];
        -
        -    if (data.results == null || data.results.length === 0) {
        -      if (this.$results.children().length === 0) {
        -        this.trigger('results:message', {
        -          message: 'noResults'
        -        });
        -      }
        -
        -      return;
        -    }
        -
        -    data.results = this.sort(data.results);
        -
        -    for (var d = 0; d < data.results.length; d++) {
        -      var item = data.results[d];
        -
        -      var $option = this.option(item);
        -
        -      $options.push($option);
        -    }
        -
        -    this.$results.append($options);
        -  };
        -
        -  Results.prototype.position = function ($results, $dropdown) {
        -    var $resultsContainer = $dropdown.find('.select2-results');
        -    $resultsContainer.append($results);
        -  };
        -
        -  Results.prototype.sort = function (data) {
        -    var sorter = this.options.get('sorter');
        -
        -    return sorter(data);
        -  };
        -
        -  Results.prototype.setClasses = function () {
        -    var self = this;
        -
        -    this.data.current(function (selected) {
        -      var selectedIds = $.map(selected, function (s) {
        -        return s.id.toString();
        -      });
        -
        -      var $options = self.$results
        -        .find('.select2-results__option[aria-selected]');
        -
        -      $options.each(function () {
        -        var $option = $(this);
        -
        -        var item = $.data(this, 'data');
        -
        -        // id needs to be converted to a string when comparing
        -        var id = '' + item.id;
        -
        -        if ((item.element != null && item.element.selected) ||
        -            (item.element == null && $.inArray(id, selectedIds) > -1)) {
        -          $option.attr('aria-selected', 'true');
        -        } else {
        -          $option.attr('aria-selected', 'false');
        -        }
        -      });
        -
        -      var $selected = $options.filter('[aria-selected=true]');
        -
        -      // Check if there are any selected options
        -      if ($selected.length > 0) {
        -        // If there are selected options, highlight the first
        -        $selected.first().trigger('mouseenter');
        -      } else {
        -        // If there are no selected options, highlight the first option
        -        // in the dropdown
        -        $options.first().trigger('mouseenter');
        -      }
        -    });
        -  };
        -
        -  Results.prototype.showLoading = function (params) {
        -    this.hideLoading();
        -
        -    var loadingMore = this.options.get('translations').get('searching');
        -
        -    var loading = {
        -      disabled: true,
        -      loading: true,
        -      text: loadingMore(params)
        -    };
        -    var $loading = this.option(loading);
        -    $loading.className += ' loading-results';
        -
        -    this.$results.prepend($loading);
        -  };
        -
        -  Results.prototype.hideLoading = function () {
        -    this.$results.find('.loading-results').remove();
        -  };
        -
        -  Results.prototype.option = function (data) {
        -    var option = document.createElement('li');
        -    option.className = 'select2-results__option';
        -
        -    var attrs = {
        -      'role': 'treeitem',
        -      'aria-selected': 'false'
        -    };
        -
        -    if (data.disabled) {
        -      delete attrs['aria-selected'];
        -      attrs['aria-disabled'] = 'true';
        -    }
        -
        -    if (data.id == null) {
        -      delete attrs['aria-selected'];
        -    }
        -
        -    if (data._resultId != null) {
        -      option.id = data._resultId;
        -    }
        -
        -    if (data.title) {
        -      option.title = data.title;
        -    }
        -
        -    if (data.children) {
        -      attrs.role = 'group';
        -      attrs['aria-label'] = data.text;
        -      delete attrs['aria-selected'];
        -    }
        -
        -    for (var attr in attrs) {
        -      var val = attrs[attr];
        -
        -      option.setAttribute(attr, val);
        -    }
        -
        -    if (data.children) {
        -      var $option = $(option);
        -
        -      var label = document.createElement('strong');
        -      label.className = 'select2-results__group';
        -
        -      var $label = $(label);
        -      this.template(data, label);
        -
        -      var $children = [];
        -
        -      for (var c = 0; c < data.children.length; c++) {
        -        var child = data.children[c];
        -
        -        var $child = this.option(child);
        -
        -        $children.push($child);
        -      }
        -
        -      var $childrenContainer = $('<ul></ul>', {
        -        'class': 'select2-results__options select2-results__options--nested'
        -      });
        -
        -      $childrenContainer.append($children);
        -
        -      $option.append(label);
        -      $option.append($childrenContainer);
        -    } else {
        -      this.template(data, option);
        -    }
        -
        -    $.data(option, 'data', data);
        -
        -    return option;
        -  };
        -
        -  Results.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    var id = container.id + '-results';
        -
        -    this.$results.attr('id', id);
        -
        -    container.on('results:all', function (params) {
        -      self.clear();
        -      self.append(params.data);
        -
        -      if (container.isOpen()) {
        -        self.setClasses();
        -      }
        -    });
        -
        -    container.on('results:append', function (params) {
        -      self.append(params.data);
        -
        -      if (container.isOpen()) {
        -        self.setClasses();
        -      }
        -    });
        -
        -    container.on('query', function (params) {
        -      self.showLoading(params);
        -    });
        -
        -    container.on('select', function () {
        -      if (!container.isOpen()) {
        -        return;
        -      }
        -
        -      self.setClasses();
        -    });
        -
        -    container.on('unselect', function () {
        -      if (!container.isOpen()) {
        -        return;
        -      }
        -
        -      self.setClasses();
        -    });
        -
        -    container.on('open', function () {
        -      // When the dropdown is open, aria-expended="true"
        -      self.$results.attr('aria-expanded', 'true');
        -      self.$results.attr('aria-hidden', 'false');
        -
        -      self.setClasses();
        -      self.ensureHighlightVisible();
        -    });
        -
        -    container.on('close', function () {
        -      // When the dropdown is closed, aria-expended="false"
        -      self.$results.attr('aria-expanded', 'false');
        -      self.$results.attr('aria-hidden', 'true');
        -      self.$results.removeAttr('aria-activedescendant');
        -    });
        -
        -    container.on('results:toggle', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      if ($highlighted.length === 0) {
        -        return;
        -      }
        -
        -      $highlighted.trigger('mouseup');
        -    });
        -
        -    container.on('results:select', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      if ($highlighted.length === 0) {
        -        return;
        -      }
        -
        -      var data = $highlighted.data('data');
        -
        -      if ($highlighted.attr('aria-selected') == 'true') {
        -        self.trigger('close');
        -      } else {
        -        self.trigger('select', {
        -          data: data
        -        });
        -      }
        -    });
        -
        -    container.on('results:previous', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      var $options = self.$results.find('[aria-selected]');
        -
        -      var currentIndex = $options.index($highlighted);
        -
        -      // If we are already at te top, don't move further
        -      if (currentIndex === 0) {
        -        return;
        -      }
        -
        -      var nextIndex = currentIndex - 1;
        -
        -      // If none are highlighted, highlight the first
        -      if ($highlighted.length === 0) {
        -        nextIndex = 0;
        -      }
        -
        -      var $next = $options.eq(nextIndex);
        -
        -      $next.trigger('mouseenter');
        -
        -      var currentOffset = self.$results.offset().top;
        -      var nextTop = $next.offset().top;
        -      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
        -
        -      if (nextIndex === 0) {
        -        self.$results.scrollTop(0);
        -      } else if (nextTop - currentOffset < 0) {
        -        self.$results.scrollTop(nextOffset);
        -      }
        -    });
        -
        -    container.on('results:next', function () {
        -      var $highlighted = self.getHighlightedResults();
        -
        -      var $options = self.$results.find('[aria-selected]');
        -
        -      var currentIndex = $options.index($highlighted);
        -
        -      var nextIndex = currentIndex + 1;
        -
        -      // If we are at the last option, stay there
        -      if (nextIndex >= $options.length) {
        -        return;
        -      }
        -
        -      var $next = $options.eq(nextIndex);
        -
        -      $next.trigger('mouseenter');
        -
        -      var currentOffset = self.$results.offset().top +
        -        self.$results.outerHeight(false);
        -      var nextBottom = $next.offset().top + $next.outerHeight(false);
        -      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
        -
        -      if (nextIndex === 0) {
        -        self.$results.scrollTop(0);
        -      } else if (nextBottom > currentOffset) {
        -        self.$results.scrollTop(nextOffset);
        -      }
        -    });
        -
        -    container.on('results:focus', function (params) {
        -      params.element.addClass('select2-results__option--highlighted');
        -    });
        -
        -    container.on('results:message', function (params) {
        -      self.displayMessage(params);
        -    });
        -
        -    if ($.fn.mousewheel) {
        -      this.$results.on('mousewheel', function (e) {
        -        var top = self.$results.scrollTop();
        -
        -        var bottom = (
        -          self.$results.get(0).scrollHeight -
        -          self.$results.scrollTop() +
        -          e.deltaY
        -        );
        -
        -        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
        -        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
        -
        -        if (isAtTop) {
        -          self.$results.scrollTop(0);
        -
        -          e.preventDefault();
        -          e.stopPropagation();
        -        } else if (isAtBottom) {
        -          self.$results.scrollTop(
        -            self.$results.get(0).scrollHeight - self.$results.height()
        -          );
        -
        -          e.preventDefault();
        -          e.stopPropagation();
        -        }
        -      });
        -    }
        -
        -    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
        -      function (evt) {
        -      var $this = $(this);
        -
        -      var data = $this.data('data');
        -
        -      if ($this.attr('aria-selected') === 'true') {
        -        if (self.options.get('multiple')) {
        -          self.trigger('unselect', {
        -            originalEvent: evt,
        -            data: data
        -          });
        -        } else {
        -          self.trigger('close');
        -        }
        -
        -        return;
        -      }
        -
        -      self.trigger('select', {
        -        originalEvent: evt,
        -        data: data
        -      });
        -    });
        -
        -    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
        -      function (evt) {
        -      var data = $(this).data('data');
        -
        -      self.getHighlightedResults()
        -          .removeClass('select2-results__option--highlighted');
        -
        -      self.trigger('results:focus', {
        -        data: data,
        -        element: $(this)
        -      });
        -    });
        -  };
        -
        -  Results.prototype.getHighlightedResults = function () {
        -    var $highlighted = this.$results
        -    .find('.select2-results__option--highlighted');
        -
        -    return $highlighted;
        -  };
        -
        -  Results.prototype.destroy = function () {
        -    this.$results.remove();
        -  };
        -
        -  Results.prototype.ensureHighlightVisible = function () {
        -    var $highlighted = this.getHighlightedResults();
        -
        -    if ($highlighted.length === 0) {
        -      return;
        -    }
        -
        -    var $options = this.$results.find('[aria-selected]');
        -
        -    var currentIndex = $options.index($highlighted);
        -
        -    var currentOffset = this.$results.offset().top;
        -    var nextTop = $highlighted.offset().top;
        -    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
        -
        -    var offsetDelta = nextTop - currentOffset;
        -    nextOffset -= $highlighted.outerHeight(false) * 2;
        -
        -    if (currentIndex <= 2) {
        -      this.$results.scrollTop(0);
        -    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
        -      this.$results.scrollTop(nextOffset);
        -    }
        -  };
        -
        -  Results.prototype.template = function (result, container) {
        -    var template = this.options.get('templateResult');
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    var content = template(result);
        -
        -    if (content == null) {
        -      container.style.display = 'none';
        -    } else if (typeof content === 'string') {
        -      container.innerHTML = escapeMarkup(content);
        -    } else {
        -      $(container).append(content);
        -    }
        -  };
        -
        -  return Results;
        -});
        -
        -S2.define('select2/keys',[
        -
        -], function () {
        -  var KEYS = {
        -    BACKSPACE: 8,
        -    TAB: 9,
        -    ENTER: 13,
        -    SHIFT: 16,
        -    CTRL: 17,
        -    ALT: 18,
        -    ESC: 27,
        -    SPACE: 32,
        -    PAGE_UP: 33,
        -    PAGE_DOWN: 34,
        -    END: 35,
        -    HOME: 36,
        -    LEFT: 37,
        -    UP: 38,
        -    RIGHT: 39,
        -    DOWN: 40,
        -    DELETE: 46
        -  };
        -
        -  return KEYS;
        -});
        -
        -S2.define('select2/selection/base',[
        -  'jquery',
        -  '../utils',
        -  '../keys'
        -], function ($, Utils, KEYS) {
        -  function BaseSelection ($element, options) {
        -    this.$element = $element;
        -    this.options = options;
        -
        -    BaseSelection.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(BaseSelection, Utils.Observable);
        -
        -  BaseSelection.prototype.render = function () {
        -    var $selection = $(
        -      '<span class="select2-selection" role="combobox" ' +
        -      'aria-autocomplete="list" aria-haspopup="true" aria-expanded="false">' +
        -      '</span>'
        -    );
        -
        -    this._tabindex = 0;
        -
        -    if (this.$element.data('old-tabindex') != null) {
        -      this._tabindex = this.$element.data('old-tabindex');
        -    } else if (this.$element.attr('tabindex') != null) {
        -      this._tabindex = this.$element.attr('tabindex');
        -    }
        -
        -    $selection.attr('title', this.$element.attr('title'));
        -    $selection.attr('tabindex', this._tabindex);
        -
        -    this.$selection = $selection;
        -
        -    return $selection;
        -  };
        -
        -  BaseSelection.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    var id = container.id + '-container';
        -    var resultsId = container.id + '-results';
        -
        -    this.container = container;
        -
        -    this.$selection.on('focus', function (evt) {
        -      self.trigger('focus', evt);
        -    });
        -
        -    this.$selection.on('blur', function (evt) {
        -      self.trigger('blur', evt);
        -    });
        -
        -    this.$selection.on('keydown', function (evt) {
        -      self.trigger('keypress', evt);
        -
        -      if (evt.which === KEYS.SPACE) {
        -        evt.preventDefault();
        -      }
        -    });
        -
        -    container.on('results:focus', function (params) {
        -      self.$selection.attr('aria-activedescendant', params.data._resultId);
        -    });
        -
        -    container.on('selection:update', function (params) {
        -      self.update(params.data);
        -    });
        -
        -    container.on('open', function () {
        -      // When the dropdown is open, aria-expanded="true"
        -      self.$selection.attr('aria-expanded', 'true');
        -      self.$selection.attr('aria-owns', resultsId);
        -
        -      self._attachCloseHandler(container);
        -    });
        -
        -    container.on('close', function () {
        -      // When the dropdown is closed, aria-expanded="false"
        -      self.$selection.attr('aria-expanded', 'false');
        -      self.$selection.removeAttr('aria-activedescendant');
        -      self.$selection.removeAttr('aria-owns');
        -
        -      self.$selection.focus();
        -
        -      self._detachCloseHandler(container);
        -    });
        -
        -    container.on('enable', function () {
        -      self.$selection.attr('tabindex', self._tabindex);
        -    });
        -
        -    container.on('disable', function () {
        -      self.$selection.attr('tabindex', '-1');
        -    });
        -  };
        -
        -  BaseSelection.prototype._attachCloseHandler = function (container) {
        -    var self = this;
        -
        -    $(document.body).on('mousedown.select2.' + container.id, function (e) {
        -      var $target = $(e.target);
        -
        -      var $select = $target.closest('.select2');
        -
        -      var $all = $('.select2.select2-container--open');
        -
        -      $all.each(function () {
        -        var $this = $(this);
        -
        -        if (this == $select[0]) {
        -          return;
        -        }
        -
        -        var $element = $this.data('element');
        -
        -        $element.select2('close');
        -      });
        -    });
        -  };
        -
        -  BaseSelection.prototype._detachCloseHandler = function (container) {
        -    $(document.body).off('mousedown.select2.' + container.id);
        -  };
        -
        -  BaseSelection.prototype.position = function ($selection, $container) {
        -    var $selectionContainer = $container.find('.selection');
        -    $selectionContainer.append($selection);
        -  };
        -
        -  BaseSelection.prototype.destroy = function () {
        -    this._detachCloseHandler(this.container);
        -  };
        -
        -  BaseSelection.prototype.update = function (data) {
        -    throw new Error('The `update` method must be defined in child classes.');
        -  };
        -
        -  return BaseSelection;
        -});
        -
        -S2.define('select2/selection/single',[
        -  'jquery',
        -  './base',
        -  '../utils',
        -  '../keys'
        -], function ($, BaseSelection, Utils, KEYS) {
        -  function SingleSelection () {
        -    SingleSelection.__super__.constructor.apply(this, arguments);
        -  }
        -
        -  Utils.Extend(SingleSelection, BaseSelection);
        -
        -  SingleSelection.prototype.render = function () {
        -    var $selection = SingleSelection.__super__.render.call(this);
        -
        -    $selection.addClass('select2-selection--single');
        -
        -    $selection.html(
        -      '<span class="select2-selection__rendered"></span>' +
        -      '<span class="select2-selection__arrow" role="presentation">' +
        -        '<b role="presentation"></b>' +
        -      '</span>'
        -    );
        -
        -    return $selection;
        -  };
        -
        -  SingleSelection.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    SingleSelection.__super__.bind.apply(this, arguments);
        -
        -    var id = container.id + '-container';
        -
        -    this.$selection.find('.select2-selection__rendered').attr('id', id);
        -    this.$selection.attr('aria-labelledby', id);
        -
        -    this.$selection.on('mousedown', function (evt) {
        -      // Only respond to left clicks
        -      if (evt.which !== 1) {
        -        return;
        -      }
        -
        -      self.trigger('toggle', {
        -        originalEvent: evt
        -      });
        -    });
        -
        -    this.$selection.on('focus', function (evt) {
        -      // User focuses on the container
        -    });
        -
        -    this.$selection.on('blur', function (evt) {
        -      // User exits the container
        -    });
        -
        -    container.on('selection:update', function (params) {
        -      self.update(params.data);
        -    });
        -  };
        -
        -  SingleSelection.prototype.clear = function () {
        -    this.$selection.find('.select2-selection__rendered').empty();
        -  };
        -
        -  SingleSelection.prototype.display = function (data) {
        -    var template = this.options.get('templateSelection');
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    return escapeMarkup(template(data));
        -  };
        -
        -  SingleSelection.prototype.selectionContainer = function () {
        -    return $('<span></span>');
        -  };
        -
        -  SingleSelection.prototype.update = function (data) {
        -    if (data.length === 0) {
        -      this.clear();
        -      return;
        -    }
        -
        -    var selection = data[0];
        -
        -    var formatted = this.display(selection);
        -
        -    var $rendered = this.$selection.find('.select2-selection__rendered');
        -    $rendered.empty().append(formatted);
        -    $rendered.prop('title', selection.title || selection.text);
        -  };
        -
        -  return SingleSelection;
        -});
        -
        -S2.define('select2/selection/multiple',[
        -  'jquery',
        -  './base',
        -  '../utils'
        -], function ($, BaseSelection, Utils) {
        -  function MultipleSelection ($element, options) {
        -    MultipleSelection.__super__.constructor.apply(this, arguments);
        -  }
        -
        -  Utils.Extend(MultipleSelection, BaseSelection);
        -
        -  MultipleSelection.prototype.render = function () {
        -    var $selection = MultipleSelection.__super__.render.call(this);
        -
        -    $selection.addClass('select2-selection--multiple');
        -
        -    $selection.html(
        -      '<ul class="select2-selection__rendered"></ul>'
        -    );
        -
        -    return $selection;
        -  };
        -
        -  MultipleSelection.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    MultipleSelection.__super__.bind.apply(this, arguments);
        -
        -    this.$selection.on('click', function (evt) {
        -      self.trigger('toggle', {
        -        originalEvent: evt
        -      });
        -    });
        -
        -    this.$selection.on('click', '.select2-selection__choice__remove',
        -      function (evt) {
        -      var $remove = $(this);
        -      var $selection = $remove.parent();
        -
        -      var data = $selection.data('data');
        -
        -      self.trigger('unselect', {
        -        originalEvent: evt,
        -        data: data
        -      });
        -    });
        -  };
        -
        -  MultipleSelection.prototype.clear = function () {
        -    this.$selection.find('.select2-selection__rendered').empty();
        -  };
        -
        -  MultipleSelection.prototype.display = function (data) {
        -    var template = this.options.get('templateSelection');
        -    var escapeMarkup = this.options.get('escapeMarkup');
        -
        -    return escapeMarkup(template(data));
        -  };
        -
        -  MultipleSelection.prototype.selectionContainer = function () {
        -    var $container = $(
        -      '<li class="select2-selection__choice">' +
        -        '<span class="select2-selection__choice__remove" role="presentation">' +
        -          '&times;' +
        -        '</span>' +
        -      '</li>'
        -    );
        -
        -    return $container;
        -  };
        -
        -  MultipleSelection.prototype.update = function (data) {
        -    this.clear();
        -
        -    if (data.length === 0) {
        -      return;
        -    }
        -
        -    var $selections = [];
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var selection = data[d];
        -
        -      var formatted = this.display(selection);
        -      var $selection = this.selectionContainer();
        -
        -      $selection.append(formatted);
        -      $selection.prop('title', selection.title || selection.text);
        -
        -      $selection.data('data', selection);
        -
        -      $selections.push($selection);
        -    }
        -
        -    var $rendered = this.$selection.find('.select2-selection__rendered');
        -
        -    Utils.appendMany($rendered, $selections);
        -  };
        -
        -  return MultipleSelection;
        -});
        -
        -S2.define('select2/selection/placeholder',[
        -  '../utils'
        -], function (Utils) {
        -  function Placeholder (decorated, $element, options) {
        -    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        -
        -    decorated.call(this, $element, options);
        -  }
        -
        -  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
        -    if (typeof placeholder === 'string') {
        -      placeholder = {
        -        id: '',
        -        text: placeholder
        -      };
        -    }
        -
        -    return placeholder;
        -  };
        -
        -  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
        -    var $placeholder = this.selectionContainer();
        -
        -    $placeholder.html(this.display(placeholder));
        -    $placeholder.addClass('select2-selection__placeholder')
        -                .removeClass('select2-selection__choice');
        -
        -    return $placeholder;
        -  };
        -
        -  Placeholder.prototype.update = function (decorated, data) {
        -    var singlePlaceholder = (
        -      data.length == 1 && data[0].id != this.placeholder.id
        -    );
        -    var multipleSelections = data.length > 1;
        -
        -    if (multipleSelections || singlePlaceholder) {
        -      return decorated.call(this, data);
        -    }
        -
        -    this.clear();
        -
        -    var $placeholder = this.createPlaceholder(this.placeholder);
        -
        -    this.$selection.find('.select2-selection__rendered').append($placeholder);
        -  };
        -
        -  return Placeholder;
        -});
        -
        -S2.define('select2/selection/allowClear',[
        -  'jquery',
        -  '../keys'
        -], function ($, KEYS) {
        -  function AllowClear () { }
        -
        -  AllowClear.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    if (this.placeholder == null) {
        -      if (this.options.get('debug') && window.console && console.error) {
        -        console.error(
        -          'Select2: The `allowClear` option should be used in combination ' +
        -          'with the `placeholder` option.'
        -        );
        -      }
        -    }
        -
        -    this.$selection.on('mousedown', '.select2-selection__clear',
        -      function (evt) {
        -        self._handleClear(evt);
        -    });
        -
        -    container.on('keypress', function (evt) {
        -      self._handleKeyboardClear(evt, container);
        -    });
        -  };
        -
        -  AllowClear.prototype._handleClear = function (_, evt) {
        -    // Ignore the event if it is disabled
        -    if (this.options.get('disabled')) {
        -      return;
        -    }
        -
        -    var $clear = this.$selection.find('.select2-selection__clear');
        -
        -    // Ignore the event if nothing has been selected
        -    if ($clear.length === 0) {
        -      return;
        -    }
        -
        -    evt.stopPropagation();
        -
        -    var data = $clear.data('data');
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var unselectData = {
        -        data: data[d]
        -      };
        -
        -      // Trigger the `unselect` event, so people can prevent it from being
        -      // cleared.
        -      this.trigger('unselect', unselectData);
        -
        -      // If the event was prevented, don't clear it out.
        -      if (unselectData.prevented) {
        -        return;
        -      }
        -    }
        -
        -    this.$element.val(this.placeholder.id).trigger('change');
        -
        -    this.trigger('toggle');
        -  };
        -
        -  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
        -    if (container.isOpen()) {
        -      return;
        -    }
        -
        -    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
        -      this._handleClear(evt);
        -    }
        -  };
        -
        -  AllowClear.prototype.update = function (decorated, data) {
        -    decorated.call(this, data);
        -
        -    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
        -        data.length === 0) {
        -      return;
        -    }
        -
        -    var $remove = $(
        -      '<span class="select2-selection__clear">' +
        -        '&times;' +
        -      '</span>'
        -    );
        -    $remove.data('data', data);
        -
        -    this.$selection.find('.select2-selection__rendered').prepend($remove);
        -  };
        -
        -  return AllowClear;
        -});
        -
        -S2.define('select2/selection/search',[
        -  'jquery',
        -  '../utils',
        -  '../keys'
        -], function ($, Utils, KEYS) {
        -  function Search (decorated, $element, options) {
        -    decorated.call(this, $element, options);
        -  }
        -
        -  Search.prototype.render = function (decorated) {
        -    var $search = $(
        -      '<li class="select2-search select2-search--inline">' +
        -        '<input class="select2-search__field" type="search" tabindex="-1"' +
        -        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        -        ' spellcheck="false" role="textbox" />' +
        -      '</li>'
        -    );
        -
        -    this.$searchContainer = $search;
        -    this.$search = $search.find('input');
        -
        -    var $rendered = decorated.call(this);
        -
        -    return $rendered;
        -  };
        -
        -  Search.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('open', function () {
        -      self.$search.attr('tabindex', 0);
        -
        -      self.$search.focus();
        -    });
        -
        -    container.on('close', function () {
        -      self.$search.attr('tabindex', -1);
        -
        -      self.$search.val('');
        -      self.$search.focus();
        -    });
        -
        -    container.on('enable', function () {
        -      self.$search.prop('disabled', false);
        -    });
        -
        -    container.on('disable', function () {
        -      self.$search.prop('disabled', true);
        -    });
        -
        -    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
        -      self.trigger('focus', evt);
        -    });
        -
        -    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
        -      self.trigger('blur', evt);
        -    });
        -
        -    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
        -      evt.stopPropagation();
        -
        -      self.trigger('keypress', evt);
        -
        -      self._keyUpPrevented = evt.isDefaultPrevented();
        -
        -      var key = evt.which;
        -
        -      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
        -        var $previousChoice = self.$searchContainer
        -          .prev('.select2-selection__choice');
        -
        -        if ($previousChoice.length > 0) {
        -          var item = $previousChoice.data('data');
        -
        -          self.searchRemoveChoice(item);
        -
        -          evt.preventDefault();
        -        }
        -      }
        -    });
        -
        -    // Workaround for browsers which do not support the `input` event
        -    // This will prevent double-triggering of events for browsers which support
        -    // both the `keyup` and `input` events.
        -    this.$selection.on('input', '.select2-search--inline', function (evt) {
        -      // Unbind the duplicated `keyup` event
        -      self.$selection.off('keyup.search');
        -    });
        -
        -    this.$selection.on('keyup.search input', '.select2-search--inline',
        -        function (evt) {
        -      self.handleSearch(evt);
        -    });
        -  };
        -
        -  Search.prototype.createPlaceholder = function (decorated, placeholder) {
        -    this.$search.attr('placeholder', placeholder.text);
        -  };
        -
        -  Search.prototype.update = function (decorated, data) {
        -    this.$search.attr('placeholder', '');
        -
        -    decorated.call(this, data);
        -
        -    this.$selection.find('.select2-selection__rendered')
        -                   .append(this.$searchContainer);
        -
        -    this.resizeSearch();
        -  };
        -
        -  Search.prototype.handleSearch = function () {
        -    this.resizeSearch();
        -
        -    if (!this._keyUpPrevented) {
        -      var input = this.$search.val();
        -
        -      this.trigger('query', {
        -        term: input
        -      });
        -    }
        -
        -    this._keyUpPrevented = false;
        -  };
        -
        -  Search.prototype.searchRemoveChoice = function (decorated, item) {
        -    this.trigger('unselect', {
        -      data: item
        -    });
        -
        -    this.trigger('open');
        -
        -    this.$search.val(item.text + ' ');
        -  };
        -
        -  Search.prototype.resizeSearch = function () {
        -    this.$search.css('width', '25px');
        -
        -    var width = '';
        -
        -    if (this.$search.attr('placeholder') !== '') {
        -      width = this.$selection.find('.select2-selection__rendered').innerWidth();
        -    } else {
        -      var minimumWidth = this.$search.val().length + 1;
        -
        -      width = (minimumWidth * 0.75) + 'em';
        -    }
        -
        -    this.$search.css('width', width);
        -  };
        -
        -  return Search;
        -});
        -
        -S2.define('select2/selection/eventRelay',[
        -  'jquery'
        -], function ($) {
        -  function EventRelay () { }
        -
        -  EventRelay.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -    var relayEvents = [
        -      'open', 'opening',
        -      'close', 'closing',
        -      'select', 'selecting',
        -      'unselect', 'unselecting'
        -    ];
        -
        -    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('*', function (name, params) {
        -      // Ignore events that should not be relayed
        -      if ($.inArray(name, relayEvents) === -1) {
        -        return;
        -      }
        -
        -      // The parameters should always be an object
        -      params = params || {};
        -
        -      // Generate the jQuery event for the Select2 event
        -      var evt = $.Event('select2:' + name, {
        -        params: params
        -      });
        -
        -      self.$element.trigger(evt);
        -
        -      // Only handle preventable events if it was one
        -      if ($.inArray(name, preventableEvents) === -1) {
        -        return;
        -      }
        -
        -      params.prevented = evt.isDefaultPrevented();
        -    });
        -  };
        -
        -  return EventRelay;
        -});
        -
        -S2.define('select2/translation',[
        -  'jquery',
        -  'require'
        -], function ($, require) {
        -  function Translation (dict) {
        -    this.dict = dict || {};
        -  }
        -
        -  Translation.prototype.all = function () {
        -    return this.dict;
        -  };
        -
        -  Translation.prototype.get = function (key) {
        -    return this.dict[key];
        -  };
        -
        -  Translation.prototype.extend = function (translation) {
        -    this.dict = $.extend({}, translation.all(), this.dict);
        -  };
        -
        -  // Static functions
        -
        -  Translation._cache = {};
        -
        -  Translation.loadPath = function (path) {
        -    if (!(path in Translation._cache)) {
        -      var translations = require(path);
        -
        -      Translation._cache[path] = translations;
        -    }
        -
        -    return new Translation(Translation._cache[path]);
        -  };
        -
        -  return Translation;
        -});
        -
        -S2.define('select2/diacritics',[
        -
        -], function () {
        -  var diacritics = {
        -    '\u24B6': 'A',
        -    '\uFF21': 'A',
        -    '\u00C0': 'A',
        -    '\u00C1': 'A',
        -    '\u00C2': 'A',
        -    '\u1EA6': 'A',
        -    '\u1EA4': 'A',
        -    '\u1EAA': 'A',
        -    '\u1EA8': 'A',
        -    '\u00C3': 'A',
        -    '\u0100': 'A',
        -    '\u0102': 'A',
        -    '\u1EB0': 'A',
        -    '\u1EAE': 'A',
        -    '\u1EB4': 'A',
        -    '\u1EB2': 'A',
        -    '\u0226': 'A',
        -    '\u01E0': 'A',
        -    '\u00C4': 'A',
        -    '\u01DE': 'A',
        -    '\u1EA2': 'A',
        -    '\u00C5': 'A',
        -    '\u01FA': 'A',
        -    '\u01CD': 'A',
        -    '\u0200': 'A',
        -    '\u0202': 'A',
        -    '\u1EA0': 'A',
        -    '\u1EAC': 'A',
        -    '\u1EB6': 'A',
        -    '\u1E00': 'A',
        -    '\u0104': 'A',
        -    '\u023A': 'A',
        -    '\u2C6F': 'A',
        -    '\uA732': 'AA',
        -    '\u00C6': 'AE',
        -    '\u01FC': 'AE',
        -    '\u01E2': 'AE',
        -    '\uA734': 'AO',
        -    '\uA736': 'AU',
        -    '\uA738': 'AV',
        -    '\uA73A': 'AV',
        -    '\uA73C': 'AY',
        -    '\u24B7': 'B',
        -    '\uFF22': 'B',
        -    '\u1E02': 'B',
        -    '\u1E04': 'B',
        -    '\u1E06': 'B',
        -    '\u0243': 'B',
        -    '\u0182': 'B',
        -    '\u0181': 'B',
        -    '\u24B8': 'C',
        -    '\uFF23': 'C',
        -    '\u0106': 'C',
        -    '\u0108': 'C',
        -    '\u010A': 'C',
        -    '\u010C': 'C',
        -    '\u00C7': 'C',
        -    '\u1E08': 'C',
        -    '\u0187': 'C',
        -    '\u023B': 'C',
        -    '\uA73E': 'C',
        -    '\u24B9': 'D',
        -    '\uFF24': 'D',
        -    '\u1E0A': 'D',
        -    '\u010E': 'D',
        -    '\u1E0C': 'D',
        -    '\u1E10': 'D',
        -    '\u1E12': 'D',
        -    '\u1E0E': 'D',
        -    '\u0110': 'D',
        -    '\u018B': 'D',
        -    '\u018A': 'D',
        -    '\u0189': 'D',
        -    '\uA779': 'D',
        -    '\u01F1': 'DZ',
        -    '\u01C4': 'DZ',
        -    '\u01F2': 'Dz',
        -    '\u01C5': 'Dz',
        -    '\u24BA': 'E',
        -    '\uFF25': 'E',
        -    '\u00C8': 'E',
        -    '\u00C9': 'E',
        -    '\u00CA': 'E',
        -    '\u1EC0': 'E',
        -    '\u1EBE': 'E',
        -    '\u1EC4': 'E',
        -    '\u1EC2': 'E',
        -    '\u1EBC': 'E',
        -    '\u0112': 'E',
        -    '\u1E14': 'E',
        -    '\u1E16': 'E',
        -    '\u0114': 'E',
        -    '\u0116': 'E',
        -    '\u00CB': 'E',
        -    '\u1EBA': 'E',
        -    '\u011A': 'E',
        -    '\u0204': 'E',
        -    '\u0206': 'E',
        -    '\u1EB8': 'E',
        -    '\u1EC6': 'E',
        -    '\u0228': 'E',
        -    '\u1E1C': 'E',
        -    '\u0118': 'E',
        -    '\u1E18': 'E',
        -    '\u1E1A': 'E',
        -    '\u0190': 'E',
        -    '\u018E': 'E',
        -    '\u24BB': 'F',
        -    '\uFF26': 'F',
        -    '\u1E1E': 'F',
        -    '\u0191': 'F',
        -    '\uA77B': 'F',
        -    '\u24BC': 'G',
        -    '\uFF27': 'G',
        -    '\u01F4': 'G',
        -    '\u011C': 'G',
        -    '\u1E20': 'G',
        -    '\u011E': 'G',
        -    '\u0120': 'G',
        -    '\u01E6': 'G',
        -    '\u0122': 'G',
        -    '\u01E4': 'G',
        -    '\u0193': 'G',
        -    '\uA7A0': 'G',
        -    '\uA77D': 'G',
        -    '\uA77E': 'G',
        -    '\u24BD': 'H',
        -    '\uFF28': 'H',
        -    '\u0124': 'H',
        -    '\u1E22': 'H',
        -    '\u1E26': 'H',
        -    '\u021E': 'H',
        -    '\u1E24': 'H',
        -    '\u1E28': 'H',
        -    '\u1E2A': 'H',
        -    '\u0126': 'H',
        -    '\u2C67': 'H',
        -    '\u2C75': 'H',
        -    '\uA78D': 'H',
        -    '\u24BE': 'I',
        -    '\uFF29': 'I',
        -    '\u00CC': 'I',
        -    '\u00CD': 'I',
        -    '\u00CE': 'I',
        -    '\u0128': 'I',
        -    '\u012A': 'I',
        -    '\u012C': 'I',
        -    '\u0130': 'I',
        -    '\u00CF': 'I',
        -    '\u1E2E': 'I',
        -    '\u1EC8': 'I',
        -    '\u01CF': 'I',
        -    '\u0208': 'I',
        -    '\u020A': 'I',
        -    '\u1ECA': 'I',
        -    '\u012E': 'I',
        -    '\u1E2C': 'I',
        -    '\u0197': 'I',
        -    '\u24BF': 'J',
        -    '\uFF2A': 'J',
        -    '\u0134': 'J',
        -    '\u0248': 'J',
        -    '\u24C0': 'K',
        -    '\uFF2B': 'K',
        -    '\u1E30': 'K',
        -    '\u01E8': 'K',
        -    '\u1E32': 'K',
        -    '\u0136': 'K',
        -    '\u1E34': 'K',
        -    '\u0198': 'K',
        -    '\u2C69': 'K',
        -    '\uA740': 'K',
        -    '\uA742': 'K',
        -    '\uA744': 'K',
        -    '\uA7A2': 'K',
        -    '\u24C1': 'L',
        -    '\uFF2C': 'L',
        -    '\u013F': 'L',
        -    '\u0139': 'L',
        -    '\u013D': 'L',
        -    '\u1E36': 'L',
        -    '\u1E38': 'L',
        -    '\u013B': 'L',
        -    '\u1E3C': 'L',
        -    '\u1E3A': 'L',
        -    '\u0141': 'L',
        -    '\u023D': 'L',
        -    '\u2C62': 'L',
        -    '\u2C60': 'L',
        -    '\uA748': 'L',
        -    '\uA746': 'L',
        -    '\uA780': 'L',
        -    '\u01C7': 'LJ',
        -    '\u01C8': 'Lj',
        -    '\u24C2': 'M',
        -    '\uFF2D': 'M',
        -    '\u1E3E': 'M',
        -    '\u1E40': 'M',
        -    '\u1E42': 'M',
        -    '\u2C6E': 'M',
        -    '\u019C': 'M',
        -    '\u24C3': 'N',
        -    '\uFF2E': 'N',
        -    '\u01F8': 'N',
        -    '\u0143': 'N',
        -    '\u00D1': 'N',
        -    '\u1E44': 'N',
        -    '\u0147': 'N',
        -    '\u1E46': 'N',
        -    '\u0145': 'N',
        -    '\u1E4A': 'N',
        -    '\u1E48': 'N',
        -    '\u0220': 'N',
        -    '\u019D': 'N',
        -    '\uA790': 'N',
        -    '\uA7A4': 'N',
        -    '\u01CA': 'NJ',
        -    '\u01CB': 'Nj',
        -    '\u24C4': 'O',
        -    '\uFF2F': 'O',
        -    '\u00D2': 'O',
        -    '\u00D3': 'O',
        -    '\u00D4': 'O',
        -    '\u1ED2': 'O',
        -    '\u1ED0': 'O',
        -    '\u1ED6': 'O',
        -    '\u1ED4': 'O',
        -    '\u00D5': 'O',
        -    '\u1E4C': 'O',
        -    '\u022C': 'O',
        -    '\u1E4E': 'O',
        -    '\u014C': 'O',
        -    '\u1E50': 'O',
        -    '\u1E52': 'O',
        -    '\u014E': 'O',
        -    '\u022E': 'O',
        -    '\u0230': 'O',
        -    '\u00D6': 'O',
        -    '\u022A': 'O',
        -    '\u1ECE': 'O',
        -    '\u0150': 'O',
        -    '\u01D1': 'O',
        -    '\u020C': 'O',
        -    '\u020E': 'O',
        -    '\u01A0': 'O',
        -    '\u1EDC': 'O',
        -    '\u1EDA': 'O',
        -    '\u1EE0': 'O',
        -    '\u1EDE': 'O',
        -    '\u1EE2': 'O',
        -    '\u1ECC': 'O',
        -    '\u1ED8': 'O',
        -    '\u01EA': 'O',
        -    '\u01EC': 'O',
        -    '\u00D8': 'O',
        -    '\u01FE': 'O',
        -    '\u0186': 'O',
        -    '\u019F': 'O',
        -    '\uA74A': 'O',
        -    '\uA74C': 'O',
        -    '\u01A2': 'OI',
        -    '\uA74E': 'OO',
        -    '\u0222': 'OU',
        -    '\u24C5': 'P',
        -    '\uFF30': 'P',
        -    '\u1E54': 'P',
        -    '\u1E56': 'P',
        -    '\u01A4': 'P',
        -    '\u2C63': 'P',
        -    '\uA750': 'P',
        -    '\uA752': 'P',
        -    '\uA754': 'P',
        -    '\u24C6': 'Q',
        -    '\uFF31': 'Q',
        -    '\uA756': 'Q',
        -    '\uA758': 'Q',
        -    '\u024A': 'Q',
        -    '\u24C7': 'R',
        -    '\uFF32': 'R',
        -    '\u0154': 'R',
        -    '\u1E58': 'R',
        -    '\u0158': 'R',
        -    '\u0210': 'R',
        -    '\u0212': 'R',
        -    '\u1E5A': 'R',
        -    '\u1E5C': 'R',
        -    '\u0156': 'R',
        -    '\u1E5E': 'R',
        -    '\u024C': 'R',
        -    '\u2C64': 'R',
        -    '\uA75A': 'R',
        -    '\uA7A6': 'R',
        -    '\uA782': 'R',
        -    '\u24C8': 'S',
        -    '\uFF33': 'S',
        -    '\u1E9E': 'S',
        -    '\u015A': 'S',
        -    '\u1E64': 'S',
        -    '\u015C': 'S',
        -    '\u1E60': 'S',
        -    '\u0160': 'S',
        -    '\u1E66': 'S',
        -    '\u1E62': 'S',
        -    '\u1E68': 'S',
        -    '\u0218': 'S',
        -    '\u015E': 'S',
        -    '\u2C7E': 'S',
        -    '\uA7A8': 'S',
        -    '\uA784': 'S',
        -    '\u24C9': 'T',
        -    '\uFF34': 'T',
        -    '\u1E6A': 'T',
        -    '\u0164': 'T',
        -    '\u1E6C': 'T',
        -    '\u021A': 'T',
        -    '\u0162': 'T',
        -    '\u1E70': 'T',
        -    '\u1E6E': 'T',
        -    '\u0166': 'T',
        -    '\u01AC': 'T',
        -    '\u01AE': 'T',
        -    '\u023E': 'T',
        -    '\uA786': 'T',
        -    '\uA728': 'TZ',
        -    '\u24CA': 'U',
        -    '\uFF35': 'U',
        -    '\u00D9': 'U',
        -    '\u00DA': 'U',
        -    '\u00DB': 'U',
        -    '\u0168': 'U',
        -    '\u1E78': 'U',
        -    '\u016A': 'U',
        -    '\u1E7A': 'U',
        -    '\u016C': 'U',
        -    '\u00DC': 'U',
        -    '\u01DB': 'U',
        -    '\u01D7': 'U',
        -    '\u01D5': 'U',
        -    '\u01D9': 'U',
        -    '\u1EE6': 'U',
        -    '\u016E': 'U',
        -    '\u0170': 'U',
        -    '\u01D3': 'U',
        -    '\u0214': 'U',
        -    '\u0216': 'U',
        -    '\u01AF': 'U',
        -    '\u1EEA': 'U',
        -    '\u1EE8': 'U',
        -    '\u1EEE': 'U',
        -    '\u1EEC': 'U',
        -    '\u1EF0': 'U',
        -    '\u1EE4': 'U',
        -    '\u1E72': 'U',
        -    '\u0172': 'U',
        -    '\u1E76': 'U',
        -    '\u1E74': 'U',
        -    '\u0244': 'U',
        -    '\u24CB': 'V',
        -    '\uFF36': 'V',
        -    '\u1E7C': 'V',
        -    '\u1E7E': 'V',
        -    '\u01B2': 'V',
        -    '\uA75E': 'V',
        -    '\u0245': 'V',
        -    '\uA760': 'VY',
        -    '\u24CC': 'W',
        -    '\uFF37': 'W',
        -    '\u1E80': 'W',
        -    '\u1E82': 'W',
        -    '\u0174': 'W',
        -    '\u1E86': 'W',
        -    '\u1E84': 'W',
        -    '\u1E88': 'W',
        -    '\u2C72': 'W',
        -    '\u24CD': 'X',
        -    '\uFF38': 'X',
        -    '\u1E8A': 'X',
        -    '\u1E8C': 'X',
        -    '\u24CE': 'Y',
        -    '\uFF39': 'Y',
        -    '\u1EF2': 'Y',
        -    '\u00DD': 'Y',
        -    '\u0176': 'Y',
        -    '\u1EF8': 'Y',
        -    '\u0232': 'Y',
        -    '\u1E8E': 'Y',
        -    '\u0178': 'Y',
        -    '\u1EF6': 'Y',
        -    '\u1EF4': 'Y',
        -    '\u01B3': 'Y',
        -    '\u024E': 'Y',
        -    '\u1EFE': 'Y',
        -    '\u24CF': 'Z',
        -    '\uFF3A': 'Z',
        -    '\u0179': 'Z',
        -    '\u1E90': 'Z',
        -    '\u017B': 'Z',
        -    '\u017D': 'Z',
        -    '\u1E92': 'Z',
        -    '\u1E94': 'Z',
        -    '\u01B5': 'Z',
        -    '\u0224': 'Z',
        -    '\u2C7F': 'Z',
        -    '\u2C6B': 'Z',
        -    '\uA762': 'Z',
        -    '\u24D0': 'a',
        -    '\uFF41': 'a',
        -    '\u1E9A': 'a',
        -    '\u00E0': 'a',
        -    '\u00E1': 'a',
        -    '\u00E2': 'a',
        -    '\u1EA7': 'a',
        -    '\u1EA5': 'a',
        -    '\u1EAB': 'a',
        -    '\u1EA9': 'a',
        -    '\u00E3': 'a',
        -    '\u0101': 'a',
        -    '\u0103': 'a',
        -    '\u1EB1': 'a',
        -    '\u1EAF': 'a',
        -    '\u1EB5': 'a',
        -    '\u1EB3': 'a',
        -    '\u0227': 'a',
        -    '\u01E1': 'a',
        -    '\u00E4': 'a',
        -    '\u01DF': 'a',
        -    '\u1EA3': 'a',
        -    '\u00E5': 'a',
        -    '\u01FB': 'a',
        -    '\u01CE': 'a',
        -    '\u0201': 'a',
        -    '\u0203': 'a',
        -    '\u1EA1': 'a',
        -    '\u1EAD': 'a',
        -    '\u1EB7': 'a',
        -    '\u1E01': 'a',
        -    '\u0105': 'a',
        -    '\u2C65': 'a',
        -    '\u0250': 'a',
        -    '\uA733': 'aa',
        -    '\u00E6': 'ae',
        -    '\u01FD': 'ae',
        -    '\u01E3': 'ae',
        -    '\uA735': 'ao',
        -    '\uA737': 'au',
        -    '\uA739': 'av',
        -    '\uA73B': 'av',
        -    '\uA73D': 'ay',
        -    '\u24D1': 'b',
        -    '\uFF42': 'b',
        -    '\u1E03': 'b',
        -    '\u1E05': 'b',
        -    '\u1E07': 'b',
        -    '\u0180': 'b',
        -    '\u0183': 'b',
        -    '\u0253': 'b',
        -    '\u24D2': 'c',
        -    '\uFF43': 'c',
        -    '\u0107': 'c',
        -    '\u0109': 'c',
        -    '\u010B': 'c',
        -    '\u010D': 'c',
        -    '\u00E7': 'c',
        -    '\u1E09': 'c',
        -    '\u0188': 'c',
        -    '\u023C': 'c',
        -    '\uA73F': 'c',
        -    '\u2184': 'c',
        -    '\u24D3': 'd',
        -    '\uFF44': 'd',
        -    '\u1E0B': 'd',
        -    '\u010F': 'd',
        -    '\u1E0D': 'd',
        -    '\u1E11': 'd',
        -    '\u1E13': 'd',
        -    '\u1E0F': 'd',
        -    '\u0111': 'd',
        -    '\u018C': 'd',
        -    '\u0256': 'd',
        -    '\u0257': 'd',
        -    '\uA77A': 'd',
        -    '\u01F3': 'dz',
        -    '\u01C6': 'dz',
        -    '\u24D4': 'e',
        -    '\uFF45': 'e',
        -    '\u00E8': 'e',
        -    '\u00E9': 'e',
        -    '\u00EA': 'e',
        -    '\u1EC1': 'e',
        -    '\u1EBF': 'e',
        -    '\u1EC5': 'e',
        -    '\u1EC3': 'e',
        -    '\u1EBD': 'e',
        -    '\u0113': 'e',
        -    '\u1E15': 'e',
        -    '\u1E17': 'e',
        -    '\u0115': 'e',
        -    '\u0117': 'e',
        -    '\u00EB': 'e',
        -    '\u1EBB': 'e',
        -    '\u011B': 'e',
        -    '\u0205': 'e',
        -    '\u0207': 'e',
        -    '\u1EB9': 'e',
        -    '\u1EC7': 'e',
        -    '\u0229': 'e',
        -    '\u1E1D': 'e',
        -    '\u0119': 'e',
        -    '\u1E19': 'e',
        -    '\u1E1B': 'e',
        -    '\u0247': 'e',
        -    '\u025B': 'e',
        -    '\u01DD': 'e',
        -    '\u24D5': 'f',
        -    '\uFF46': 'f',
        -    '\u1E1F': 'f',
        -    '\u0192': 'f',
        -    '\uA77C': 'f',
        -    '\u24D6': 'g',
        -    '\uFF47': 'g',
        -    '\u01F5': 'g',
        -    '\u011D': 'g',
        -    '\u1E21': 'g',
        -    '\u011F': 'g',
        -    '\u0121': 'g',
        -    '\u01E7': 'g',
        -    '\u0123': 'g',
        -    '\u01E5': 'g',
        -    '\u0260': 'g',
        -    '\uA7A1': 'g',
        -    '\u1D79': 'g',
        -    '\uA77F': 'g',
        -    '\u24D7': 'h',
        -    '\uFF48': 'h',
        -    '\u0125': 'h',
        -    '\u1E23': 'h',
        -    '\u1E27': 'h',
        -    '\u021F': 'h',
        -    '\u1E25': 'h',
        -    '\u1E29': 'h',
        -    '\u1E2B': 'h',
        -    '\u1E96': 'h',
        -    '\u0127': 'h',
        -    '\u2C68': 'h',
        -    '\u2C76': 'h',
        -    '\u0265': 'h',
        -    '\u0195': 'hv',
        -    '\u24D8': 'i',
        -    '\uFF49': 'i',
        -    '\u00EC': 'i',
        -    '\u00ED': 'i',
        -    '\u00EE': 'i',
        -    '\u0129': 'i',
        -    '\u012B': 'i',
        -    '\u012D': 'i',
        -    '\u00EF': 'i',
        -    '\u1E2F': 'i',
        -    '\u1EC9': 'i',
        -    '\u01D0': 'i',
        -    '\u0209': 'i',
        -    '\u020B': 'i',
        -    '\u1ECB': 'i',
        -    '\u012F': 'i',
        -    '\u1E2D': 'i',
        -    '\u0268': 'i',
        -    '\u0131': 'i',
        -    '\u24D9': 'j',
        -    '\uFF4A': 'j',
        -    '\u0135': 'j',
        -    '\u01F0': 'j',
        -    '\u0249': 'j',
        -    '\u24DA': 'k',
        -    '\uFF4B': 'k',
        -    '\u1E31': 'k',
        -    '\u01E9': 'k',
        -    '\u1E33': 'k',
        -    '\u0137': 'k',
        -    '\u1E35': 'k',
        -    '\u0199': 'k',
        -    '\u2C6A': 'k',
        -    '\uA741': 'k',
        -    '\uA743': 'k',
        -    '\uA745': 'k',
        -    '\uA7A3': 'k',
        -    '\u24DB': 'l',
        -    '\uFF4C': 'l',
        -    '\u0140': 'l',
        -    '\u013A': 'l',
        -    '\u013E': 'l',
        -    '\u1E37': 'l',
        -    '\u1E39': 'l',
        -    '\u013C': 'l',
        -    '\u1E3D': 'l',
        -    '\u1E3B': 'l',
        -    '\u017F': 'l',
        -    '\u0142': 'l',
        -    '\u019A': 'l',
        -    '\u026B': 'l',
        -    '\u2C61': 'l',
        -    '\uA749': 'l',
        -    '\uA781': 'l',
        -    '\uA747': 'l',
        -    '\u01C9': 'lj',
        -    '\u24DC': 'm',
        -    '\uFF4D': 'm',
        -    '\u1E3F': 'm',
        -    '\u1E41': 'm',
        -    '\u1E43': 'm',
        -    '\u0271': 'm',
        -    '\u026F': 'm',
        -    '\u24DD': 'n',
        -    '\uFF4E': 'n',
        -    '\u01F9': 'n',
        -    '\u0144': 'n',
        -    '\u00F1': 'n',
        -    '\u1E45': 'n',
        -    '\u0148': 'n',
        -    '\u1E47': 'n',
        -    '\u0146': 'n',
        -    '\u1E4B': 'n',
        -    '\u1E49': 'n',
        -    '\u019E': 'n',
        -    '\u0272': 'n',
        -    '\u0149': 'n',
        -    '\uA791': 'n',
        -    '\uA7A5': 'n',
        -    '\u01CC': 'nj',
        -    '\u24DE': 'o',
        -    '\uFF4F': 'o',
        -    '\u00F2': 'o',
        -    '\u00F3': 'o',
        -    '\u00F4': 'o',
        -    '\u1ED3': 'o',
        -    '\u1ED1': 'o',
        -    '\u1ED7': 'o',
        -    '\u1ED5': 'o',
        -    '\u00F5': 'o',
        -    '\u1E4D': 'o',
        -    '\u022D': 'o',
        -    '\u1E4F': 'o',
        -    '\u014D': 'o',
        -    '\u1E51': 'o',
        -    '\u1E53': 'o',
        -    '\u014F': 'o',
        -    '\u022F': 'o',
        -    '\u0231': 'o',
        -    '\u00F6': 'o',
        -    '\u022B': 'o',
        -    '\u1ECF': 'o',
        -    '\u0151': 'o',
        -    '\u01D2': 'o',
        -    '\u020D': 'o',
        -    '\u020F': 'o',
        -    '\u01A1': 'o',
        -    '\u1EDD': 'o',
        -    '\u1EDB': 'o',
        -    '\u1EE1': 'o',
        -    '\u1EDF': 'o',
        -    '\u1EE3': 'o',
        -    '\u1ECD': 'o',
        -    '\u1ED9': 'o',
        -    '\u01EB': 'o',
        -    '\u01ED': 'o',
        -    '\u00F8': 'o',
        -    '\u01FF': 'o',
        -    '\u0254': 'o',
        -    '\uA74B': 'o',
        -    '\uA74D': 'o',
        -    '\u0275': 'o',
        -    '\u01A3': 'oi',
        -    '\u0223': 'ou',
        -    '\uA74F': 'oo',
        -    '\u24DF': 'p',
        -    '\uFF50': 'p',
        -    '\u1E55': 'p',
        -    '\u1E57': 'p',
        -    '\u01A5': 'p',
        -    '\u1D7D': 'p',
        -    '\uA751': 'p',
        -    '\uA753': 'p',
        -    '\uA755': 'p',
        -    '\u24E0': 'q',
        -    '\uFF51': 'q',
        -    '\u024B': 'q',
        -    '\uA757': 'q',
        -    '\uA759': 'q',
        -    '\u24E1': 'r',
        -    '\uFF52': 'r',
        -    '\u0155': 'r',
        -    '\u1E59': 'r',
        -    '\u0159': 'r',
        -    '\u0211': 'r',
        -    '\u0213': 'r',
        -    '\u1E5B': 'r',
        -    '\u1E5D': 'r',
        -    '\u0157': 'r',
        -    '\u1E5F': 'r',
        -    '\u024D': 'r',
        -    '\u027D': 'r',
        -    '\uA75B': 'r',
        -    '\uA7A7': 'r',
        -    '\uA783': 'r',
        -    '\u24E2': 's',
        -    '\uFF53': 's',
        -    '\u00DF': 's',
        -    '\u015B': 's',
        -    '\u1E65': 's',
        -    '\u015D': 's',
        -    '\u1E61': 's',
        -    '\u0161': 's',
        -    '\u1E67': 's',
        -    '\u1E63': 's',
        -    '\u1E69': 's',
        -    '\u0219': 's',
        -    '\u015F': 's',
        -    '\u023F': 's',
        -    '\uA7A9': 's',
        -    '\uA785': 's',
        -    '\u1E9B': 's',
        -    '\u24E3': 't',
        -    '\uFF54': 't',
        -    '\u1E6B': 't',
        -    '\u1E97': 't',
        -    '\u0165': 't',
        -    '\u1E6D': 't',
        -    '\u021B': 't',
        -    '\u0163': 't',
        -    '\u1E71': 't',
        -    '\u1E6F': 't',
        -    '\u0167': 't',
        -    '\u01AD': 't',
        -    '\u0288': 't',
        -    '\u2C66': 't',
        -    '\uA787': 't',
        -    '\uA729': 'tz',
        -    '\u24E4': 'u',
        -    '\uFF55': 'u',
        -    '\u00F9': 'u',
        -    '\u00FA': 'u',
        -    '\u00FB': 'u',
        -    '\u0169': 'u',
        -    '\u1E79': 'u',
        -    '\u016B': 'u',
        -    '\u1E7B': 'u',
        -    '\u016D': 'u',
        -    '\u00FC': 'u',
        -    '\u01DC': 'u',
        -    '\u01D8': 'u',
        -    '\u01D6': 'u',
        -    '\u01DA': 'u',
        -    '\u1EE7': 'u',
        -    '\u016F': 'u',
        -    '\u0171': 'u',
        -    '\u01D4': 'u',
        -    '\u0215': 'u',
        -    '\u0217': 'u',
        -    '\u01B0': 'u',
        -    '\u1EEB': 'u',
        -    '\u1EE9': 'u',
        -    '\u1EEF': 'u',
        -    '\u1EED': 'u',
        -    '\u1EF1': 'u',
        -    '\u1EE5': 'u',
        -    '\u1E73': 'u',
        -    '\u0173': 'u',
        -    '\u1E77': 'u',
        -    '\u1E75': 'u',
        -    '\u0289': 'u',
        -    '\u24E5': 'v',
        -    '\uFF56': 'v',
        -    '\u1E7D': 'v',
        -    '\u1E7F': 'v',
        -    '\u028B': 'v',
        -    '\uA75F': 'v',
        -    '\u028C': 'v',
        -    '\uA761': 'vy',
        -    '\u24E6': 'w',
        -    '\uFF57': 'w',
        -    '\u1E81': 'w',
        -    '\u1E83': 'w',
        -    '\u0175': 'w',
        -    '\u1E87': 'w',
        -    '\u1E85': 'w',
        -    '\u1E98': 'w',
        -    '\u1E89': 'w',
        -    '\u2C73': 'w',
        -    '\u24E7': 'x',
        -    '\uFF58': 'x',
        -    '\u1E8B': 'x',
        -    '\u1E8D': 'x',
        -    '\u24E8': 'y',
        -    '\uFF59': 'y',
        -    '\u1EF3': 'y',
        -    '\u00FD': 'y',
        -    '\u0177': 'y',
        -    '\u1EF9': 'y',
        -    '\u0233': 'y',
        -    '\u1E8F': 'y',
        -    '\u00FF': 'y',
        -    '\u1EF7': 'y',
        -    '\u1E99': 'y',
        -    '\u1EF5': 'y',
        -    '\u01B4': 'y',
        -    '\u024F': 'y',
        -    '\u1EFF': 'y',
        -    '\u24E9': 'z',
        -    '\uFF5A': 'z',
        -    '\u017A': 'z',
        -    '\u1E91': 'z',
        -    '\u017C': 'z',
        -    '\u017E': 'z',
        -    '\u1E93': 'z',
        -    '\u1E95': 'z',
        -    '\u01B6': 'z',
        -    '\u0225': 'z',
        -    '\u0240': 'z',
        -    '\u2C6C': 'z',
        -    '\uA763': 'z',
        -    '\u0386': '\u0391',
        -    '\u0388': '\u0395',
        -    '\u0389': '\u0397',
        -    '\u038A': '\u0399',
        -    '\u03AA': '\u0399',
        -    '\u038C': '\u039F',
        -    '\u038E': '\u03A5',
        -    '\u03AB': '\u03A5',
        -    '\u038F': '\u03A9',
        -    '\u03AC': '\u03B1',
        -    '\u03AD': '\u03B5',
        -    '\u03AE': '\u03B7',
        -    '\u03AF': '\u03B9',
        -    '\u03CA': '\u03B9',
        -    '\u0390': '\u03B9',
        -    '\u03CC': '\u03BF',
        -    '\u03CD': '\u03C5',
        -    '\u03CB': '\u03C5',
        -    '\u03B0': '\u03C5',
        -    '\u03C9': '\u03C9',
        -    '\u03C2': '\u03C3'
        -  };
        -
        -  return diacritics;
        -});
        -
        -S2.define('select2/data/base',[
        -  '../utils'
        -], function (Utils) {
        -  function BaseAdapter ($element, options) {
        -    BaseAdapter.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(BaseAdapter, Utils.Observable);
        -
        -  BaseAdapter.prototype.current = function (callback) {
        -    throw new Error('The `current` method must be defined in child classes.');
        -  };
        -
        -  BaseAdapter.prototype.query = function (params, callback) {
        -    throw new Error('The `query` method must be defined in child classes.');
        -  };
        -
        -  BaseAdapter.prototype.bind = function (container, $container) {
        -    // Can be implemented in subclasses
        -  };
        -
        -  BaseAdapter.prototype.destroy = function () {
        -    // Can be implemented in subclasses
        -  };
        -
        -  BaseAdapter.prototype.generateResultId = function (container, data) {
        -    var id = container.id + '-result-';
        -
        -    id += Utils.generateChars(4);
        -
        -    if (data.id != null) {
        -      id += '-' + data.id.toString();
        -    } else {
        -      id += '-' + Utils.generateChars(4);
        -    }
        -    return id;
        -  };
        -
        -  return BaseAdapter;
        -});
        -
        -S2.define('select2/data/select',[
        -  './base',
        -  '../utils',
        -  'jquery'
        -], function (BaseAdapter, Utils, $) {
        -  function SelectAdapter ($element, options) {
        -    this.$element = $element;
        -    this.options = options;
        -
        -    SelectAdapter.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(SelectAdapter, BaseAdapter);
        -
        -  SelectAdapter.prototype.current = function (callback) {
        -    var data = [];
        -    var self = this;
        -
        -    this.$element.find(':selected').each(function () {
        -      var $option = $(this);
        -
        -      var option = self.item($option);
        -
        -      data.push(option);
        -    });
        -
        -    callback(data);
        -  };
        -
        -  SelectAdapter.prototype.select = function (data) {
        -    var self = this;
        -
        -    data.selected = true;
        -
        -    // If data.element is a DOM node, use it instead
        -    if ($(data.element).is('option')) {
        -      data.element.selected = true;
        -
        -      this.$element.trigger('change');
        -
        -      return;
        -    }
        -
        -    if (this.$element.prop('multiple')) {
        -      this.current(function (currentData) {
        -        var val = [];
        -
        -        data = [data];
        -        data.push.apply(data, currentData);
        -
        -        for (var d = 0; d < data.length; d++) {
        -          var id = data[d].id;
        -
        -          if ($.inArray(id, val) === -1) {
        -            val.push(id);
        -          }
        -        }
        -
        -        self.$element.val(val);
        -        self.$element.trigger('change');
        -      });
        -    } else {
        -      var val = data.id;
        -
        -      this.$element.val(val);
        -      this.$element.trigger('change');
        -    }
        -  };
        -
        -  SelectAdapter.prototype.unselect = function (data) {
        -    var self = this;
        -
        -    if (!this.$element.prop('multiple')) {
        -      return;
        -    }
        -
        -    data.selected = false;
        -
        -    if ($(data.element).is('option')) {
        -      data.element.selected = false;
        -
        -      this.$element.trigger('change');
        -
        -      return;
        -    }
        -
        -    this.current(function (currentData) {
        -      var val = [];
        -
        -      for (var d = 0; d < currentData.length; d++) {
        -        var id = currentData[d].id;
        -
        -        if (id !== data.id && $.inArray(id, val) === -1) {
        -          val.push(id);
        -        }
        -      }
        -
        -      self.$element.val(val);
        -
        -      self.$element.trigger('change');
        -    });
        -  };
        -
        -  SelectAdapter.prototype.bind = function (container, $container) {
        -    var self = this;
        -
        -    this.container = container;
        -
        -    container.on('select', function (params) {
        -      self.select(params.data);
        -    });
        -
        -    container.on('unselect', function (params) {
        -      self.unselect(params.data);
        -    });
        -  };
        -
        -  SelectAdapter.prototype.destroy = function () {
        -    // Remove anything added to child elements
        -    this.$element.find('*').each(function () {
        -      // Remove any custom data set by Select2
        -      $.removeData(this, 'data');
        -    });
        -  };
        -
        -  SelectAdapter.prototype.query = function (params, callback) {
        -    var data = [];
        -    var self = this;
        -
        -    var $options = this.$element.children();
        -
        -    $options.each(function () {
        -      var $option = $(this);
        -
        -      if (!$option.is('option') && !$option.is('optgroup')) {
        -        return;
        -      }
        -
        -      var option = self.item($option);
        -
        -      var matches = self.matches(params, option);
        -
        -      if (matches !== null) {
        -        data.push(matches);
        -      }
        -    });
        -
        -    callback({
        -      results: data
        -    });
        -  };
        -
        -  SelectAdapter.prototype.addOptions = function ($options) {
        -    Utils.appendMany(this.$element, $options);
        -  };
        -
        -  SelectAdapter.prototype.option = function (data) {
        -    var option;
        -
        -    if (data.children) {
        -      option = document.createElement('optgroup');
        -      option.label = data.text;
        -    } else {
        -      option = document.createElement('option');
        -
        -      if (option.textContent !== undefined) {
        -        option.textContent = data.text;
        -      } else {
        -        option.innerText = data.text;
        -      }
        -    }
        -
        -    if (data.id) {
        -      option.value = data.id;
        -    }
        -
        -    if (data.disabled) {
        -      option.disabled = true;
        -    }
        -
        -    if (data.selected) {
        -      option.selected = true;
        -    }
        -
        -    if (data.title) {
        -      option.title = data.title;
        -    }
        -
        -    var $option = $(option);
        -
        -    var normalizedData = this._normalizeItem(data);
        -    normalizedData.element = option;
        -
        -    // Override the option's data with the combined data
        -    $.data(option, 'data', normalizedData);
        -
        -    return $option;
        -  };
        -
        -  SelectAdapter.prototype.item = function ($option) {
        -    var data = {};
        -
        -    data = $.data($option[0], 'data');
        -
        -    if (data != null) {
        -      return data;
        -    }
        -
        -    if ($option.is('option')) {
        -      data = {
        -        id: $option.val(),
        -        text: $option.text(),
        -        disabled: $option.prop('disabled'),
        -        selected: $option.prop('selected'),
        -        title: $option.prop('title')
        -      };
        -    } else if ($option.is('optgroup')) {
        -      data = {
        -        text: $option.prop('label'),
        -        children: [],
        -        title: $option.prop('title')
        -      };
        -
        -      var $children = $option.children('option');
        -      var children = [];
        -
        -      for (var c = 0; c < $children.length; c++) {
        -        var $child = $($children[c]);
        -
        -        var child = this.item($child);
        -
        -        children.push(child);
        -      }
        -
        -      data.children = children;
        -    }
        -
        -    data = this._normalizeItem(data);
        -    data.element = $option[0];
        -
        -    $.data($option[0], 'data', data);
        -
        -    return data;
        -  };
        -
        -  SelectAdapter.prototype._normalizeItem = function (item) {
        -    if (!$.isPlainObject(item)) {
        -      item = {
        -        id: item,
        -        text: item
        -      };
        -    }
        -
        -    item = $.extend({}, {
        -      text: ''
        -    }, item);
        -
        -    var defaults = {
        -      selected: false,
        -      disabled: false
        -    };
        -
        -    if (item.id != null) {
        -      item.id = item.id.toString();
        -    }
        -
        -    if (item.text != null) {
        -      item.text = item.text.toString();
        -    }
        -
        -    if (item._resultId == null && item.id && this.container != null) {
        -      item._resultId = this.generateResultId(this.container, item);
        -    }
        -
        -    return $.extend({}, defaults, item);
        -  };
        -
        -  SelectAdapter.prototype.matches = function (params, data) {
        -    var matcher = this.options.get('matcher');
        -
        -    return matcher(params, data);
        -  };
        -
        -  return SelectAdapter;
        -});
        -
        -S2.define('select2/data/array',[
        -  './select',
        -  '../utils',
        -  'jquery'
        -], function (SelectAdapter, Utils, $) {
        -  function ArrayAdapter ($element, options) {
        -    var data = options.get('data') || [];
        -
        -    ArrayAdapter.__super__.constructor.call(this, $element, options);
        -
        -    this.addOptions(this.convertToOptions(data));
        -  }
        -
        -  Utils.Extend(ArrayAdapter, SelectAdapter);
        -
        -  ArrayAdapter.prototype.select = function (data) {
        -    var $option = this.$element.find('option').filter(function (i, elm) {
        -      return elm.value == data.id.toString();
        -    });
        -
        -    if ($option.length === 0) {
        -      $option = this.option(data);
        -
        -      this.addOptions($option);
        -    }
        -
        -    ArrayAdapter.__super__.select.call(this, data);
        -  };
        -
        -  ArrayAdapter.prototype.convertToOptions = function (data) {
        -    var self = this;
        -
        -    var $existing = this.$element.find('option');
        -    var existingIds = $existing.map(function () {
        -      return self.item($(this)).id;
        -    }).get();
        -
        -    var $options = [];
        -
        -    // Filter out all items except for the one passed in the argument
        -    function onlyItem (item) {
        -      return function () {
        -        return $(this).val() == item.id;
        -      };
        -    }
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var item = this._normalizeItem(data[d]);
        -
        -      // Skip items which were pre-loaded, only merge the data
        -      if ($.inArray(item.id, existingIds) >= 0) {
        -        var $existingOption = $existing.filter(onlyItem(item));
        -
        -        var existingData = this.item($existingOption);
        -        var newData = $.extend(true, {}, existingData, item);
        -
        -        var $newOption = this.option(existingData);
        -
        -        $existingOption.replaceWith($newOption);
        -
        -        continue;
        -      }
        -
        -      var $option = this.option(item);
        -
        -      if (item.children) {
        -        var $children = this.convertToOptions(item.children);
        -
        -        Utils.appendMany($option, $children);
        -      }
        -
        -      $options.push($option);
        -    }
        -
        -    return $options;
        -  };
        -
        -  return ArrayAdapter;
        -});
        -
        -S2.define('select2/data/ajax',[
        -  './array',
        -  '../utils',
        -  'jquery'
        -], function (ArrayAdapter, Utils, $) {
        -  function AjaxAdapter ($element, options) {
        -    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
        -
        -    if (this.ajaxOptions.processResults != null) {
        -      this.processResults = this.ajaxOptions.processResults;
        -    }
        -
        -    ArrayAdapter.__super__.constructor.call(this, $element, options);
        -  }
        -
        -  Utils.Extend(AjaxAdapter, ArrayAdapter);
        -
        -  AjaxAdapter.prototype._applyDefaults = function (options) {
        -    var defaults = {
        -      data: function (params) {
        -        return {
        -          q: params.term
        -        };
        -      },
        -      transport: function (params, success, failure) {
        -        var $request = $.ajax(params);
        -
        -        $request.then(success);
        -        $request.fail(failure);
        -
        -        return $request;
        -      }
        -    };
        -
        -    return $.extend({}, defaults, options, true);
        -  };
        -
        -  AjaxAdapter.prototype.processResults = function (results) {
        -    return results;
        -  };
        -
        -  AjaxAdapter.prototype.query = function (params, callback) {
        -    var matches = [];
        -    var self = this;
        -
        -    if (this._request != null) {
        -      // JSONP requests cannot always be aborted
        -      if ($.isFunction(this._request.abort)) {
        -        this._request.abort();
        -      }
        -
        -      this._request = null;
        -    }
        -
        -    var options = $.extend({
        -      type: 'GET'
        -    }, this.ajaxOptions);
        -
        -    if (typeof options.url === 'function') {
        -      options.url = options.url(params);
        -    }
        -
        -    if (typeof options.data === 'function') {
        -      options.data = options.data(params);
        -    }
        -
        -    function request () {
        -      var $request = options.transport(options, function (data) {
        -        var results = self.processResults(data, params);
        -
        -        if (self.options.get('debug') && window.console && console.error) {
        -          // Check to make sure that the response included a `results` key.
        -          if (!results || !results.results || !$.isArray(results.results)) {
        -            console.error(
        -              'Select2: The AJAX results did not return an array in the ' +
        -              '`results` key of the response.'
        -            );
        -          }
        -        }
        -
        -        callback(results);
        -      }, function () {
        -        // TODO: Handle AJAX errors
        -      });
        -
        -      self._request = $request;
        -    }
        -
        -    if (this.ajaxOptions.delay && params.term !== '') {
        -      if (this._queryTimeout) {
        -        window.clearTimeout(this._queryTimeout);
        -      }
        -
        -      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
        -    } else {
        -      request();
        -    }
        -  };
        -
        -  return AjaxAdapter;
        -});
        -
        -S2.define('select2/data/tags',[
        -  'jquery'
        -], function ($) {
        -  function Tags (decorated, $element, options) {
        -    var tags = options.get('tags');
        -
        -    var createTag = options.get('createTag');
        -
        -    if (createTag !== undefined) {
        -      this.createTag = createTag;
        -    }
        -
        -    decorated.call(this, $element, options);
        -
        -    if ($.isArray(tags)) {
        -      for (var t = 0; t < tags.length; t++) {
        -        var tag = tags[t];
        -        var item = this._normalizeItem(tag);
        -
        -        var $option = this.option(item);
        -
        -        this.$element.append($option);
        -      }
        -    }
        -  }
        -
        -  Tags.prototype.query = function (decorated, params, callback) {
        -    var self = this;
        -
        -    this._removeOldTags();
        -
        -    if (params.term == null || params.page != null) {
        -      decorated.call(this, params, callback);
        -      return;
        -    }
        -
        -    function wrapper (obj, child) {
        -      var data = obj.results;
        -
        -      for (var i = 0; i < data.length; i++) {
        -        var option = data[i];
        -
        -        var checkChildren = (
        -          option.children != null &&
        -          !wrapper({
        -            results: option.children
        -          }, true)
        -        );
        -
        -        var checkText = option.text === params.term;
        -
        -        if (checkText || checkChildren) {
        -          if (child) {
        -            return false;
        -          }
        -
        -          obj.data = data;
        -          callback(obj);
        -
        -          return;
        -        }
        -      }
        -
        -      if (child) {
        -        return true;
        -      }
        -
        -      var tag = self.createTag(params);
        -
        -      if (tag != null) {
        -        var $option = self.option(tag);
        -        $option.attr('data-select2-tag', true);
        -
        -        self.addOptions([$option]);
        -
        -        self.insertTag(data, tag);
        -      }
        -
        -      obj.results = data;
        -
        -      callback(obj);
        -    }
        -
        -    decorated.call(this, params, wrapper);
        -  };
        -
        -  Tags.prototype.createTag = function (decorated, params) {
        -    var term = $.trim(params.term);
        -
        -    if (term === '') {
        -      return null;
        -    }
        -
        -    return {
        -      id: term,
        -      text: term
        -    };
        -  };
        -
        -  Tags.prototype.insertTag = function (_, data, tag) {
        -    data.unshift(tag);
        -  };
        -
        -  Tags.prototype._removeOldTags = function (_) {
        -    var tag = this._lastTag;
        -
        -    var $options = this.$element.find('option[data-select2-tag]');
        -
        -    $options.each(function () {
        -      if (this.selected) {
        -        return;
        -      }
        -
        -      $(this).remove();
        -    });
        -  };
        -
        -  return Tags;
        -});
        -
        -S2.define('select2/data/tokenizer',[
        -  'jquery'
        -], function ($) {
        -  function Tokenizer (decorated, $element, options) {
        -    var tokenizer = options.get('tokenizer');
        -
        -    if (tokenizer !== undefined) {
        -      this.tokenizer = tokenizer;
        -    }
        -
        -    decorated.call(this, $element, options);
        -  }
        -
        -  Tokenizer.prototype.bind = function (decorated, container, $container) {
        -    decorated.call(this, container, $container);
        -
        -    this.$search =  container.dropdown.$search || container.selection.$search ||
        -      $container.find('.select2-search__field');
        -  };
        -
        -  Tokenizer.prototype.query = function (decorated, params, callback) {
        -    var self = this;
        -
        -    function select (data) {
        -      self.select(data);
        -    }
        -
        -    params.term = params.term || '';
        -
        -    var tokenData = this.tokenizer(params, this.options, select);
        -
        -    if (tokenData.term !== params.term) {
        -      // Replace the search term if we have the search box
        -      if (this.$search.length) {
        -        this.$search.val(tokenData.term);
        -        this.$search.focus();
        -      }
        -
        -      params.term = tokenData.term;
        -    }
        -
        -    decorated.call(this, params, callback);
        -  };
        -
        -  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
        -    var separators = options.get('tokenSeparators') || [];
        -    var term = params.term;
        -    var i = 0;
        -
        -    var createTag = this.createTag || function (params) {
        -      return {
        -        id: params.term,
        -        text: params.term
        -      };
        -    };
        -
        -    while (i < term.length) {
        -      var termChar = term[i];
        -
        -      if ($.inArray(termChar, separators) === -1) {
        -        i++;
        -
        -        continue;
        -      }
        -
        -      var part = term.substr(0, i);
        -      var partParams = $.extend({}, params, {
        -        term: part
        -      });
        -
        -      var data = createTag(partParams);
        -
        -      callback(data);
        -
        -      // Reset the term to not include the tokenized portion
        -      term = term.substr(i + 1) || '';
        -      i = 0;
        -    }
        -
        -    return {
        -      term: term
        -    };
        -  };
        -
        -  return Tokenizer;
        -});
        -
        -S2.define('select2/data/minimumInputLength',[
        -
        -], function () {
        -  function MinimumInputLength (decorated, $e, options) {
        -    this.minimumInputLength = options.get('minimumInputLength');
        -
        -    decorated.call(this, $e, options);
        -  }
        -
        -  MinimumInputLength.prototype.query = function (decorated, params, callback) {
        -    params.term = params.term || '';
        -
        -    if (params.term.length < this.minimumInputLength) {
        -      this.trigger('results:message', {
        -        message: 'inputTooShort',
        -        args: {
        -          minimum: this.minimumInputLength,
        -          input: params.term,
        -          params: params
        -        }
        -      });
        -
        -      return;
        -    }
        -
        -    decorated.call(this, params, callback);
        -  };
        -
        -  return MinimumInputLength;
        -});
        -
        -S2.define('select2/data/maximumInputLength',[
        -
        -], function () {
        -  function MaximumInputLength (decorated, $e, options) {
        -    this.maximumInputLength = options.get('maximumInputLength');
        -
        -    decorated.call(this, $e, options);
        -  }
        -
        -  MaximumInputLength.prototype.query = function (decorated, params, callback) {
        -    params.term = params.term || '';
        -
        -    if (this.maximumInputLength > 0 &&
        -        params.term.length > this.maximumInputLength) {
        -      this.trigger('results:message', {
        -        message: 'inputTooLong',
        -        args: {
        -          maximum: this.maximumInputLength,
        -          input: params.term,
        -          params: params
        -        }
        -      });
        -
        -      return;
        -    }
        -
        -    decorated.call(this, params, callback);
        -  };
        -
        -  return MaximumInputLength;
        -});
        -
        -S2.define('select2/data/maximumSelectionLength',[
        -
        -], function (){
        -  function MaximumSelectionLength (decorated, $e, options) {
        -    this.maximumSelectionLength = options.get('maximumSelectionLength');
        -
        -    decorated.call(this, $e, options);
        -  }
        -
        -  MaximumSelectionLength.prototype.query =
        -    function (decorated, params, callback) {
        -      var self = this;
        -
        -      this.current(function (currentData) {
        -        var count = currentData != null ? currentData.length : 0;
        -        if (self.maximumSelectionLength > 0 &&
        -          count >= self.maximumSelectionLength) {
        -          self.trigger('results:message', {
        -            message: 'maximumSelected',
        -            args: {
        -              maximum: self.maximumSelectionLength
        -            }
        -          });
        -          return;
        -        }
        -        decorated.call(self, params, callback);
        -      });
        -  };
        -
        -  return MaximumSelectionLength;
        -});
        -
        -S2.define('select2/dropdown',[
        -  'jquery',
        -  './utils'
        -], function ($, Utils) {
        -  function Dropdown ($element, options) {
        -    this.$element = $element;
        -    this.options = options;
        -
        -    Dropdown.__super__.constructor.call(this);
        -  }
        -
        -  Utils.Extend(Dropdown, Utils.Observable);
        -
        -  Dropdown.prototype.render = function () {
        -    var $dropdown = $(
        -      '<span class="select2-dropdown">' +
        -        '<span class="select2-results"></span>' +
        -      '</span>'
        -    );
        -
        -    $dropdown.attr('dir', this.options.get('dir'));
        -
        -    this.$dropdown = $dropdown;
        -
        -    return $dropdown;
        -  };
        -
        -  Dropdown.prototype.position = function ($dropdown, $container) {
        -    // Should be implmented in subclasses
        -  };
        -
        -  Dropdown.prototype.destroy = function () {
        -    // Remove the dropdown from the DOM
        -    this.$dropdown.remove();
        -  };
        -
        -  return Dropdown;
        -});
        -
        -S2.define('select2/dropdown/search',[
        -  'jquery',
        -  '../utils'
        -], function ($, Utils) {
        -  function Search () { }
        -
        -  Search.prototype.render = function (decorated) {
        -    var $rendered = decorated.call(this);
        -
        -    var $search = $(
        -      '<span class="select2-search select2-search--dropdown">' +
        -        '<input class="select2-search__field" type="search" tabindex="-1"' +
        -        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
        -        ' spellcheck="false" role="textbox" />' +
        -      '</span>'
        -    );
        -
        -    this.$searchContainer = $search;
        -    this.$search = $search.find('input');
        -
        -    $rendered.prepend($search);
        -
        -    return $rendered;
        -  };
        -
        -  Search.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    this.$search.on('keydown', function (evt) {
        -      self.trigger('keypress', evt);
        -
        -      self._keyUpPrevented = evt.isDefaultPrevented();
        -    });
        -
        -    // Workaround for browsers which do not support the `input` event
        -    // This will prevent double-triggering of events for browsers which support
        -    // both the `keyup` and `input` events.
        -    this.$search.on('input', function (evt) {
        -      // Unbind the duplicated `keyup` event
        -      $(this).off('keyup');
        -    });
        -
        -    this.$search.on('keyup input', function (evt) {
        -      self.handleSearch(evt);
        -    });
        -
        -    container.on('open', function () {
        -      self.$search.attr('tabindex', 0);
        -
        -      self.$search.focus();
        -
        -      window.setTimeout(function () {
        -        self.$search.focus();
        -      }, 0);
        -    });
        -
        -    container.on('close', function () {
        -      self.$search.attr('tabindex', -1);
        -
        -      self.$search.val('');
        -    });
        -
        -    container.on('results:all', function (params) {
        -      if (params.query.term == null || params.query.term === '') {
        -        var showSearch = self.showSearch(params);
        -
        -        if (showSearch) {
        -          self.$searchContainer.removeClass('select2-search--hide');
        -        } else {
        -          self.$searchContainer.addClass('select2-search--hide');
        -        }
        -      }
        -    });
        -  };
        -
        -  Search.prototype.handleSearch = function (evt) {
        -    if (!this._keyUpPrevented) {
        -      var input = this.$search.val();
        -
        -      this.trigger('query', {
        -        term: input
        -      });
        -    }
        -
        -    this._keyUpPrevented = false;
        -  };
        -
        -  Search.prototype.showSearch = function (_, params) {
        -    return true;
        -  };
        -
        -  return Search;
        -});
        -
        -S2.define('select2/dropdown/hidePlaceholder',[
        -
        -], function () {
        -  function HidePlaceholder (decorated, $element, options, dataAdapter) {
        -    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
        -
        -    decorated.call(this, $element, options, dataAdapter);
        -  }
        -
        -  HidePlaceholder.prototype.append = function (decorated, data) {
        -    data.results = this.removePlaceholder(data.results);
        -
        -    decorated.call(this, data);
        -  };
        -
        -  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
        -    if (typeof placeholder === 'string') {
        -      placeholder = {
        -        id: '',
        -        text: placeholder
        -      };
        -    }
        -
        -    return placeholder;
        -  };
        -
        -  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
        -    var modifiedData = data.slice(0);
        -
        -    for (var d = data.length - 1; d >= 0; d--) {
        -      var item = data[d];
        -
        -      if (this.placeholder.id === item.id) {
        -        modifiedData.splice(d, 1);
        -      }
        -    }
        -
        -    return modifiedData;
        -  };
        -
        -  return HidePlaceholder;
        -});
        -
        -S2.define('select2/dropdown/infiniteScroll',[
        -  'jquery'
        -], function ($) {
        -  function InfiniteScroll (decorated, $element, options, dataAdapter) {
        -    this.lastParams = {};
        -
        -    decorated.call(this, $element, options, dataAdapter);
        -
        -    this.$loadingMore = this.createLoadingMore();
        -    this.loading = false;
        -  }
        -
        -  InfiniteScroll.prototype.append = function (decorated, data) {
        -    this.$loadingMore.remove();
        -    this.loading = false;
        -
        -    decorated.call(this, data);
        -
        -    if (this.showLoadingMore(data)) {
        -      this.$results.append(this.$loadingMore);
        -    }
        -  };
        -
        -  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('query', function (params) {
        -      self.lastParams = params;
        -      self.loading = true;
        -    });
        -
        -    container.on('query:append', function (params) {
        -      self.lastParams = params;
        -      self.loading = true;
        -    });
        -
        -    this.$results.on('scroll', function () {
        -      var isLoadMoreVisible = $.contains(
        -        document.documentElement,
        -        self.$loadingMore[0]
        -      );
        -
        -      if (self.loading || !isLoadMoreVisible) {
        -        return;
        -      }
        -
        -      var currentOffset = self.$results.offset().top +
        -        self.$results.outerHeight(false);
        -      var loadingMoreOffset = self.$loadingMore.offset().top +
        -        self.$loadingMore.outerHeight(false);
        -
        -      if (currentOffset + 50 >= loadingMoreOffset) {
        -        self.loadMore();
        -      }
        -    });
        -  };
        -
        -  InfiniteScroll.prototype.loadMore = function () {
        -    this.loading = true;
        -
        -    var params = $.extend({}, {page: 1}, this.lastParams);
        -
        -    params.page++;
        -
        -    this.trigger('query:append', params);
        -  };
        -
        -  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
        -    return data.pagination && data.pagination.more;
        -  };
        -
        -  InfiniteScroll.prototype.createLoadingMore = function () {
        -    var $option = $(
        -      '<li class="option load-more" role="treeitem"></li>'
        -    );
        -
        -    var message = this.options.get('translations').get('loadingMore');
        -
        -    $option.html(message(this.lastParams));
        -
        -    return $option;
        -  };
        -
        -  return InfiniteScroll;
        -});
        -
        -S2.define('select2/dropdown/attachBody',[
        -  'jquery',
        -  '../utils'
        -], function ($, Utils) {
        -  function AttachBody (decorated, $element, options) {
        -    this.$dropdownParent = options.get('dropdownParent') || document.body;
        -
        -    decorated.call(this, $element, options);
        -  }
        -
        -  AttachBody.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    var setupResultsEvents = false;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('open', function () {
        -      self._showDropdown();
        -      self._attachPositioningHandler(container);
        -
        -      if (!setupResultsEvents) {
        -        setupResultsEvents = true;
        -
        -        container.on('results:all', function () {
        -          self._positionDropdown();
        -          self._resizeDropdown();
        -        });
        -
        -        container.on('results:append', function () {
        -          self._positionDropdown();
        -          self._resizeDropdown();
        -        });
        -      }
        -    });
        -
        -    container.on('close', function () {
        -      self._hideDropdown();
        -      self._detachPositioningHandler(container);
        -    });
        -
        -    this.$dropdownContainer.on('mousedown', function (evt) {
        -      evt.stopPropagation();
        -    });
        -  };
        -
        -  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
        -    // Clone all of the container classes
        -    $dropdown.attr('class', $container.attr('class'));
        -
        -    $dropdown.removeClass('select2');
        -    $dropdown.addClass('select2-container--open');
        -
        -    $dropdown.css({
        -      position: 'absolute',
        -      top: -999999
        -    });
        -
        -    this.$container = $container;
        -  };
        -
        -  AttachBody.prototype.render = function (decorated) {
        -    var $container = $('<span></span>');
        -
        -    var $dropdown = decorated.call(this);
        -    $container.append($dropdown);
        -
        -    this.$dropdownContainer = $container;
        -
        -    return $container;
        -  };
        -
        -  AttachBody.prototype._hideDropdown = function (decorated) {
        -    this.$dropdownContainer.detach();
        -  };
        -
        -  AttachBody.prototype._attachPositioningHandler = function (container) {
        -    var self = this;
        -
        -    var scrollEvent = 'scroll.select2.' + container.id;
        -    var resizeEvent = 'resize.select2.' + container.id;
        -    var orientationEvent = 'orientationchange.select2.' + container.id;
        -
        -    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        -    $watchers.each(function () {
        -      $(this).data('select2-scroll-position', {
        -        x: $(this).scrollLeft(),
        -        y: $(this).scrollTop()
        -      });
        -    });
        -
        -    $watchers.on(scrollEvent, function (ev) {
        -      var position = $(this).data('select2-scroll-position');
        -      $(this).scrollTop(position.y);
        -    });
        -
        -    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
        -      function (e) {
        -      self._positionDropdown();
        -      self._resizeDropdown();
        -    });
        -  };
        -
        -  AttachBody.prototype._detachPositioningHandler = function (container) {
        -    var scrollEvent = 'scroll.select2.' + container.id;
        -    var resizeEvent = 'resize.select2.' + container.id;
        -    var orientationEvent = 'orientationchange.select2.' + container.id;
        -
        -    var $watchers = this.$container.parents().filter(Utils.hasScroll);
        -    $watchers.off(scrollEvent);
        -
        -    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
        -  };
        -
        -  AttachBody.prototype._positionDropdown = function () {
        -    var $window = $(window);
        -
        -    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
        -    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
        -
        -    var newDirection = null;
        -
        -    var position = this.$container.position();
        -    var offset = this.$container.offset();
        -
        -    offset.bottom = offset.top + this.$container.outerHeight(false);
        -
        -    var container = {
        -      height: this.$container.outerHeight(false)
        -    };
        -
        -    container.top = offset.top;
        -    container.bottom = offset.top + container.height;
        -
        -    var dropdown = {
        -      height: this.$dropdown.outerHeight(false)
        -    };
        -
        -    var viewport = {
        -      top: $window.scrollTop(),
        -      bottom: $window.scrollTop() + $window.height()
        -    };
        -
        -    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
        -    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
        -
        -    var css = {
        -      left: offset.left,
        -      top: container.bottom
        -    };
        -
        -    if (!isCurrentlyAbove && !isCurrentlyBelow) {
        -      newDirection = 'below';
        -    }
        -
        -    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
        -      newDirection = 'above';
        -    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
        -      newDirection = 'below';
        -    }
        -
        -    if (newDirection == 'above' ||
        -      (isCurrentlyAbove && newDirection !== 'below')) {
        -      css.top = container.top - dropdown.height;
        -    }
        -
        -    if (newDirection != null) {
        -      this.$dropdown
        -        .removeClass('select2-dropdown--below select2-dropdown--above')
        -        .addClass('select2-dropdown--' + newDirection);
        -      this.$container
        -        .removeClass('select2-container--below select2-container--above')
        -        .addClass('select2-container--' + newDirection);
        -    }
        -
        -    this.$dropdownContainer.css(css);
        -  };
        -
        -  AttachBody.prototype._resizeDropdown = function () {
        -    this.$dropdownContainer.width();
        -
        -    var css = {
        -      width: this.$container.outerWidth(false) + 'px'
        -    };
        -
        -    if (this.options.get('dropdownAutoWidth')) {
        -      css.minWidth = css.width;
        -      css.width = 'auto';
        -    }
        -
        -    this.$dropdown.css(css);
        -  };
        -
        -  AttachBody.prototype._showDropdown = function (decorated) {
        -    this.$dropdownContainer.appendTo(this.$dropdownParent);
        -
        -    this._positionDropdown();
        -    this._resizeDropdown();
        -  };
        -
        -  return AttachBody;
        -});
        -
        -S2.define('select2/dropdown/minimumResultsForSearch',[
        -
        -], function () {
        -  function countResults (data) {
        -    var count = 0;
        -
        -    for (var d = 0; d < data.length; d++) {
        -      var item = data[d];
        -
        -      if (item.children) {
        -        count += countResults(item.children);
        -      } else {
        -        count++;
        -      }
        -    }
        -
        -    return count;
        -  }
        -
        -  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
        -    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
        -
        -    if (this.minimumResultsForSearch < 0) {
        -      this.minimumResultsForSearch = Infinity;
        -    }
        -
        -    decorated.call(this, $element, options, dataAdapter);
        -  }
        -
        -  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
        -    if (countResults(params.data.results) < this.minimumResultsForSearch) {
        -      return false;
        -    }
        -
        -    return decorated.call(this, params);
        -  };
        -
        -  return MinimumResultsForSearch;
        -});
        -
        -S2.define('select2/dropdown/selectOnClose',[
        -
        -], function () {
        -  function SelectOnClose () { }
        -
        -  SelectOnClose.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('close', function () {
        -      self._handleSelectOnClose();
        -    });
        -  };
        -
        -  SelectOnClose.prototype._handleSelectOnClose = function () {
        -    var $highlightedResults = this.getHighlightedResults();
        -
        -    if ($highlightedResults.length < 1) {
        -      return;
        -    }
        -
        -    this.trigger('select', {
        -        data: $highlightedResults.data('data')
        -    });
        -  };
        -
        -  return SelectOnClose;
        -});
        -
        -S2.define('select2/dropdown/closeOnSelect',[
        -
        -], function () {
        -  function CloseOnSelect () { }
        -
        -  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
        -    var self = this;
        -
        -    decorated.call(this, container, $container);
        -
        -    container.on('select', function (evt) {
        -      self._selectTriggered(evt);
        -    });
        -
        -    container.on('unselect', function (evt) {
        -      self._selectTriggered(evt);
        -    });
        -  };
        -
        -  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
        -    var originalEvent = evt.originalEvent;
        -
        -    // Don't close if the control key is being held
        -    if (originalEvent && originalEvent.ctrlKey) {
        -      return;
        -    }
        -
        -    this.trigger('close');
        -  };
        -
        -  return CloseOnSelect;
        -});
        -
        -S2.define('select2/i18n/en',[],function () {
        -  // English
        -  return {
        -    errorLoading: function () {
        -      return 'The results could not be loaded.';
        -    },
        -    inputTooLong: function (args) {
        -      var overChars = args.input.length - args.maximum;
        -
        -      var message = 'Please delete ' + overChars + ' character';
        -
        -      if (overChars != 1) {
        -        message += 's';
        -      }
        -
        -      return message;
        -    },
        -    inputTooShort: function (args) {
        -      var remainingChars = args.minimum - args.input.length;
        -
        -      var message = 'Please enter ' + remainingChars + ' or more characters';
        -
        -      return message;
        -    },
        -    loadingMore: function () {
        -      return 'Loading more results…';
        -    },
        -    maximumSelected: function (args) {
        -      var message = 'You can only select ' + args.maximum + ' item';
        -
        -      if (args.maximum != 1) {
        -        message += 's';
        -      }
        -
        -      return message;
        -    },
        -    noResults: function () {
        -      return 'No results found';
        -    },
        -    searching: function () {
        -      return 'Searching…';
        -    }
        -  };
        -});
        -
        -S2.define('select2/defaults',[
        -  'jquery',
        -  'require',
        -
        -  './results',
        -
        -  './selection/single',
        -  './selection/multiple',
        -  './selection/placeholder',
        -  './selection/allowClear',
        -  './selection/search',
        -  './selection/eventRelay',
        -
        -  './utils',
        -  './translation',
        -  './diacritics',
        -
        -  './data/select',
        -  './data/array',
        -  './data/ajax',
        -  './data/tags',
        -  './data/tokenizer',
        -  './data/minimumInputLength',
        -  './data/maximumInputLength',
        -  './data/maximumSelectionLength',
        -
        -  './dropdown',
        -  './dropdown/search',
        -  './dropdown/hidePlaceholder',
        -  './dropdown/infiniteScroll',
        -  './dropdown/attachBody',
        -  './dropdown/minimumResultsForSearch',
        -  './dropdown/selectOnClose',
        -  './dropdown/closeOnSelect',
        -
        -  './i18n/en'
        -], function ($, require,
        -
        -             ResultsList,
        -
        -             SingleSelection, MultipleSelection, Placeholder, AllowClear,
        -             SelectionSearch, EventRelay,
        -
        -             Utils, Translation, DIACRITICS,
        -
        -             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
        -             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
        -
        -             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
        -             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
        -
        -             EnglishTranslation) {
        -  function Defaults () {
        -    this.reset();
        -  }
        -
        -  Defaults.prototype.apply = function (options) {
        -    options = $.extend({}, this.defaults, options);
        -
        -    if (options.dataAdapter == null) {
        -      if (options.ajax != null) {
        -        options.dataAdapter = AjaxData;
        -      } else if (options.data != null) {
        -        options.dataAdapter = ArrayData;
        -      } else {
        -        options.dataAdapter = SelectData;
        -      }
        -
        -      if (options.minimumInputLength > 0) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          MinimumInputLength
        -        );
        -      }
        -
        -      if (options.maximumInputLength > 0) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          MaximumInputLength
        -        );
        -      }
        -
        -      if (options.maximumSelectionLength > 0) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          MaximumSelectionLength
        -        );
        -      }
        -
        -      if (options.tags) {
        -        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
        -      }
        -
        -      if (options.tokenSeparators != null || options.tokenizer != null) {
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          Tokenizer
        -        );
        -      }
        -
        -      if (options.query != null) {
        -        var Query = require(options.amdBase + 'compat/query');
        -
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          Query
        -        );
        -      }
        -
        -      if (options.initSelection != null) {
        -        var InitSelection = require(options.amdBase + 'compat/initSelection');
        -
        -        options.dataAdapter = Utils.Decorate(
        -          options.dataAdapter,
        -          InitSelection
        -        );
        -      }
        -    }
        -
        -    if (options.resultsAdapter == null) {
        -      options.resultsAdapter = ResultsList;
        -
        -      if (options.ajax != null) {
        -        options.resultsAdapter = Utils.Decorate(
        -          options.resultsAdapter,
        -          InfiniteScroll
        -        );
        -      }
        -
        -      if (options.placeholder != null) {
        -        options.resultsAdapter = Utils.Decorate(
        -          options.resultsAdapter,
        -          HidePlaceholder
        -        );
        -      }
        -
        -      if (options.selectOnClose) {
        -        options.resultsAdapter = Utils.Decorate(
        -          options.resultsAdapter,
        -          SelectOnClose
        -        );
        -      }
        -    }
        -
        -    if (options.dropdownAdapter == null) {
        -      if (options.multiple) {
        -        options.dropdownAdapter = Dropdown;
        -      } else {
        -        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
        -
        -        options.dropdownAdapter = SearchableDropdown;
        -      }
        -
        -      if (options.minimumResultsForSearch !== 0) {
        -        options.dropdownAdapter = Utils.Decorate(
        -          options.dropdownAdapter,
        -          MinimumResultsForSearch
        -        );
        -      }
        -
        -      if (options.closeOnSelect) {
        -        options.dropdownAdapter = Utils.Decorate(
        -          options.dropdownAdapter,
        -          CloseOnSelect
        -        );
        -      }
        -
        -      if (
        -        options.dropdownCssClass != null ||
        -        options.dropdownCss != null ||
        -        options.adaptDropdownCssClass != null
        -      ) {
        -        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
        -
        -        options.dropdownAdapter = Utils.Decorate(
        -          options.dropdownAdapter,
        -          DropdownCSS
        -        );
        -      }
        -
        -      options.dropdownAdapter = Utils.Decorate(
        -        options.dropdownAdapter,
        -        AttachBody
        -      );
        -    }
        -
        -    if (options.selectionAdapter == null) {
        -      if (options.multiple) {
        -        options.selectionAdapter = MultipleSelection;
        -      } else {
        -        options.selectionAdapter = SingleSelection;
        -      }
        -
        -      // Add the placeholder mixin if a placeholder was specified
        -      if (options.placeholder != null) {
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          Placeholder
        -        );
        -      }
        -
        -      if (options.allowClear) {
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          AllowClear
        -        );
        -      }
        -
        -      if (options.multiple) {
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          SelectionSearch
        -        );
        -      }
        -
        -      if (
        -        options.containerCssClass != null ||
        -        options.containerCss != null ||
        -        options.adaptContainerCssClass != null
        -      ) {
        -        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
        -
        -        options.selectionAdapter = Utils.Decorate(
        -          options.selectionAdapter,
        -          ContainerCSS
        -        );
        -      }
        -
        -      options.selectionAdapter = Utils.Decorate(
        -        options.selectionAdapter,
        -        EventRelay
        -      );
        -    }
        -
        -    if (typeof options.language === 'string') {
        -      // Check if the language is specified with a region
        -      if (options.language.indexOf('-') > 0) {
        -        // Extract the region information if it is included
        -        var languageParts = options.language.split('-');
        -        var baseLanguage = languageParts[0];
        -
        -        options.language = [options.language, baseLanguage];
        -      } else {
        -        options.language = [options.language];
        -      }
        -    }
        -
        -    if ($.isArray(options.language)) {
        -      var languages = new Translation();
        -      options.language.push('en');
        -
        -      var languageNames = options.language;
        -
        -      for (var l = 0; l < languageNames.length; l++) {
        -        var name = languageNames[l];
        -        var language = {};
        -
        -        try {
        -          // Try to load it with the original name
        -          language = Translation.loadPath(name);
        -        } catch (e) {
        -          try {
        -            // If we couldn't load it, check if it wasn't the full path
        -            name = this.defaults.amdLanguageBase + name;
        -            language = Translation.loadPath(name);
        -          } catch (ex) {
        -            // The translation could not be loaded at all. Sometimes this is
        -            // because of a configuration problem, other times this can be
        -            // because of how Select2 helps load all possible translation files.
        -            if (options.debug && window.console && console.warn) {
        -              console.warn(
        -                'Select2: The language file for "' + name + '" could not be ' +
        -                'automatically loaded. A fallback will be used instead.'
        -              );
        -            }
        -
        -            continue;
        -          }
        -        }
        -
        -        languages.extend(language);
        -      }
        -
        -      options.translations = languages;
        -    } else {
        -      var baseTranslation = Translation.loadPath(
        -        this.defaults.amdLanguageBase + 'en'
        -      );
        -      var customTranslation = new Translation(options.language);
        -
        -      customTranslation.extend(baseTranslation);
        -
        -      options.translations = customTranslation;
        -    }
        -
        -    return options;
        -  };
        -
        -  Defaults.prototype.reset = function () {
        -    function stripDiacritics (text) {
        -      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
        -      function match(a) {
        -        return DIACRITICS[a] || a;
        -      }
        -
        -      return text.replace(/[^\u0000-\u007E]/g, match);
        -    }
        -
        -    function matcher (params, data) {
        -      // Always return the object if there is nothing to compare
        -      if ($.trim(params.term) === '') {
        -        return data;
        -      }
        -
        -      // Do a recursive check for options with children
        -      if (data.children && data.children.length > 0) {
        -        // Clone the data object if there are children
        -        // This is required as we modify the object to remove any non-matches
        -        var match = $.extend(true, {}, data);
        -
        -        // Check each child of the option
        -        for (var c = data.children.length - 1; c >= 0; c--) {
        -          var child = data.children[c];
        -
        -          var matches = matcher(params, child);
        -
        -          // If there wasn't a match, remove the object in the array
        -          if (matches == null) {
        -            match.children.splice(c, 1);
        -          }
        -        }
        -
        -        // If any children matched, return the new object
        -        if (match.children.length > 0) {
        -          return match;
        -        }
        -
        -        // If there were no matching children, check just the plain object
        -        return matcher(params, match);
        -      }
        -
        -      var original = stripDiacritics(data.text).toUpperCase();
        -      var term = stripDiacritics(params.term).toUpperCase();
        -
        -      // Check if the text contains the term
        -      if (original.indexOf(term) > -1) {
        -        return data;
        -      }
        -
        -      // If it doesn't contain the term, don't return anything
        -      return null;
        -    }
        -
        -    this.defaults = {
        -      amdBase: './',
        -      amdLanguageBase: './i18n/',
        -      closeOnSelect: true,
        -      debug: false,
        -      dropdownAutoWidth: false,
        -      escapeMarkup: Utils.escapeMarkup,
        -      language: EnglishTranslation,
        -      matcher: matcher,
        -      minimumInputLength: 0,
        -      maximumInputLength: 0,
        -      maximumSelectionLength: 0,
        -      minimumResultsForSearch: 0,
        -      selectOnClose: false,
        -      sorter: function (data) {
        -        return data;
        -      },
        -      templateResult: function (result) {
        -        return result.text;
        -      },
        -      templateSelection: function (selection) {
        -        return selection.text;
        -      },
        -      theme: 'default',
        -      width: 'resolve'
        -    };
        -  };
        -
        -  Defaults.prototype.set = function (key, value) {
        -    var camelKey = $.camelCase(key);
        -
        -    var data = {};
        -    data[camelKey] = value;
        -
        -    var convertedData = Utils._convertData(data);
        -
        -    $.extend(this.defaults, convertedData);
        -  };
        -
        -  var defaults = new Defaults();
        -
        -  return defaults;
        -});
        -
        -S2.define('select2/options',[
        -  'require',
        -  'jquery',
        -  './defaults',
        -  './utils'
        -], function (require, $, Defaults, Utils) {
        -  function Options (options, $element) {
        -    this.options = options;
        -
        -    if ($element != null) {
        -      this.fromElement($element);
        -    }
        -
        -    this.options = Defaults.apply(this.options);
        -
        -    if ($element && $element.is('input')) {
        -      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
        -
        -      this.options.dataAdapter = Utils.Decorate(
        -        this.options.dataAdapter,
        -        InputCompat
        -      );
        -    }
        -  }
        -
        -  Options.prototype.fromElement = function ($e) {
        -    var excludedData = ['select2'];
        -
        -    if (this.options.multiple == null) {
        -      this.options.multiple = $e.prop('multiple');
        -    }
        -
        -    if (this.options.disabled == null) {
        -      this.options.disabled = $e.prop('disabled');
        -    }
        -
        -    if (this.options.language == null) {
        -      if ($e.prop('lang')) {
        -        this.options.language = $e.prop('lang').toLowerCase();
        -      } else if ($e.closest('[lang]').prop('lang')) {
        -        this.options.language = $e.closest('[lang]').prop('lang');
        -      }
        -    }
        -
        -    if (this.options.dir == null) {
        -      if ($e.prop('dir')) {
        -        this.options.dir = $e.prop('dir');
        -      } else if ($e.closest('[dir]').prop('dir')) {
        -        this.options.dir = $e.closest('[dir]').prop('dir');
        -      } else {
        -        this.options.dir = 'ltr';
        -      }
        -    }
        -
        -    $e.prop('disabled', this.options.disabled);
        -    $e.prop('multiple', this.options.multiple);
        -
        -    if ($e.data('select2Tags')) {
        -      if (this.options.debug && window.console && console.warn) {
        -        console.warn(
        -          'Select2: The `data-select2-tags` attribute has been changed to ' +
        -          'use the `data-data` and `data-tags="true"` attributes and will be ' +
        -          'removed in future versions of Select2.'
        -        );
        -      }
        -
        -      $e.data('data', $e.data('select2Tags'));
        -      $e.data('tags', true);
        -    }
        -
        -    if ($e.data('ajaxUrl')) {
        -      if (this.options.debug && window.console && console.warn) {
        -        console.warn(
        -          'Select2: The `data-ajax-url` attribute has been changed to ' +
        -          '`data-ajax--url` and support for the old attribute will be removed' +
        -          ' in future versions of Select2.'
        -        );
        -      }
        -
        -      $e.attr('ajax--url', $e.data('ajaxUrl'));
        -      $e.data('ajax--url', $e.data('ajaxUrl'));
        -    }
        -
        -    var dataset = {};
        -
        -    // Prefer the element's `dataset` attribute if it exists
        -    // jQuery 1.x does not correctly handle data attributes with multiple dashes
        -    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
        -      dataset = $.extend(true, {}, $e[0].dataset, $e.data());
        -    } else {
        -      dataset = $e.data();
        -    }
        -
        -    var data = $.extend(true, {}, dataset);
        -
        -    data = Utils._convertData(data);
        -
        -    for (var key in data) {
        -      if ($.inArray(key, excludedData) > -1) {
        -        continue;
        -      }
        -
        -      if ($.isPlainObject(this.options[key])) {
        -        $.extend(this.options[key], data[key]);
        -      } else {
        -        this.options[key] = data[key];
        -      }
        -    }
        -
        -    return this;
        -  };
        -
        -  Options.prototype.get = function (key) {
        -    return this.options[key];
        -  };
        -
        -  Options.prototype.set = function (key, val) {
        -    this.options[key] = val;
        -  };
        -
        -  return Options;
        -});
        -
        -S2.define('select2/core',[
        -  'jquery',
        -  './options',
        -  './utils',
        -  './keys'
        -], function ($, Options, Utils, KEYS) {
        -  var Select2 = function ($element, options) {
        -    if ($element.data('select2') != null) {
        -      $element.data('select2').destroy();
        -    }
        -
        -    this.$element = $element;
        -
        -    this.id = this._generateId($element);
        -
        -    options = options || {};
        -
        -    this.options = new Options(options, $element);
        -
        -    Select2.__super__.constructor.call(this);
        -
        -    // Set up the tabindex
        -
        -    var tabindex = $element.attr('tabindex') || 0;
        -    $element.data('old-tabindex', tabindex);
        -    $element.attr('tabindex', '-1');
        -
        -    // Set up containers and adapters
        -
        -    var DataAdapter = this.options.get('dataAdapter');
        -    this.dataAdapter = new DataAdapter($element, this.options);
        -
        -    var $container = this.render();
        -
        -    this._placeContainer($container);
        -
        -    var SelectionAdapter = this.options.get('selectionAdapter');
        -    this.selection = new SelectionAdapter($element, this.options);
        -    this.$selection = this.selection.render();
        -
        -    this.selection.position(this.$selection, $container);
        -
        -    var DropdownAdapter = this.options.get('dropdownAdapter');
        -    this.dropdown = new DropdownAdapter($element, this.options);
        -    this.$dropdown = this.dropdown.render();
        -
        -    this.dropdown.position(this.$dropdown, $container);
        -
        -    var ResultsAdapter = this.options.get('resultsAdapter');
        -    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
        -    this.$results = this.results.render();
        -
        -    this.results.position(this.$results, this.$dropdown);
        -
        -    // Bind events
        -
        -    var self = this;
        -
        -    // Bind the container to all of the adapters
        -    this._bindAdapters();
        -
        -    // Register any DOM event handlers
        -    this._registerDomEvents();
        -
        -    // Register any internal event handlers
        -    this._registerDataEvents();
        -    this._registerSelectionEvents();
        -    this._registerDropdownEvents();
        -    this._registerResultsEvents();
        -    this._registerEvents();
        -
        -    // Set the initial state
        -    this.dataAdapter.current(function (initialData) {
        -      self.trigger('selection:update', {
        -        data: initialData
        -      });
        -    });
        -
        -    // Hide the original select
        -    $element.addClass('select2-hidden-accessible');
        -	$element.attr('aria-hidden', 'true');
        -	
        -    // Synchronize any monitored attributes
        -    this._syncAttributes();
        -
        -    $element.data('select2', this);
        -  };
        -
        -  Utils.Extend(Select2, Utils.Observable);
        -
        -  Select2.prototype._generateId = function ($element) {
        -    var id = '';
        -
        -    if ($element.attr('id') != null) {
        -      id = $element.attr('id');
        -    } else if ($element.attr('name') != null) {
        -      id = $element.attr('name') + '-' + Utils.generateChars(2);
        -    } else {
        -      id = Utils.generateChars(4);
        -    }
        -
        -    id = 'select2-' + id;
        -
        -    return id;
        -  };
        -
        -  Select2.prototype._placeContainer = function ($container) {
        -    $container.insertAfter(this.$element);
        -
        -    var width = this._resolveWidth(this.$element, this.options.get('width'));
        -
        -    if (width != null) {
        -      $container.css('width', width);
        -    }
        -  };
        -
        -  Select2.prototype._resolveWidth = function ($element, method) {
        -    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
        -
        -    if (method == 'resolve') {
        -      var styleWidth = this._resolveWidth($element, 'style');
        -
        -      if (styleWidth != null) {
        -        return styleWidth;
        -      }
        -
        -      return this._resolveWidth($element, 'element');
        -    }
        -
        -    if (method == 'element') {
        -      var elementWidth = $element.outerWidth(false);
        -
        -      if (elementWidth <= 0) {
        -        return 'auto';
        -      }
        -
        -      return elementWidth + 'px';
        -    }
        -
        -    if (method == 'style') {
        -      var style = $element.attr('style');
        -
        -      if (typeof(style) !== 'string') {
        -        return null;
        -      }
        -
        -      var attrs = style.split(';');
        -
        -      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
        -        var attr = attrs[i].replace(/\s/g, '');
        -        var matches = attr.match(WIDTH);
        -
        -        if (matches !== null && matches.length >= 1) {
        -          return matches[1];
        -        }
        -      }
        -
        -      return null;
        -    }
        -
        -    return method;
        -  };
        -
        -  Select2.prototype._bindAdapters = function () {
        -    this.dataAdapter.bind(this, this.$container);
        -    this.selection.bind(this, this.$container);
        -
        -    this.dropdown.bind(this, this.$container);
        -    this.results.bind(this, this.$container);
        -  };
        -
        -  Select2.prototype._registerDomEvents = function () {
        -    var self = this;
        -
        -    this.$element.on('change.select2', function () {
        -      self.dataAdapter.current(function (data) {
        -        self.trigger('selection:update', {
        -          data: data
        -        });
        -      });
        -    });
        -
        -    this._sync = Utils.bind(this._syncAttributes, this);
        -
        -    if (this.$element[0].attachEvent) {
        -      this.$element[0].attachEvent('onpropertychange', this._sync);
        -    }
        -
        -    var observer = window.MutationObserver ||
        -      window.WebKitMutationObserver ||
        -      window.MozMutationObserver
        -    ;
        -
        -    if (observer != null) {
        -      this._observer = new observer(function (mutations) {
        -        $.each(mutations, self._sync);
        -      });
        -      this._observer.observe(this.$element[0], {
        -        attributes: true,
        -        subtree: false
        -      });
        -    } else if (this.$element[0].addEventListener) {
        -      this.$element[0].addEventListener('DOMAttrModified', self._sync, false);
        -    }
        -  };
        -
        -  Select2.prototype._registerDataEvents = function () {
        -    var self = this;
        -
        -    this.dataAdapter.on('*', function (name, params) {
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerSelectionEvents = function () {
        -    var self = this;
        -    var nonRelayEvents = ['toggle'];
        -
        -    this.selection.on('toggle', function () {
        -      self.toggleDropdown();
        -    });
        -
        -    this.selection.on('*', function (name, params) {
        -      if ($.inArray(name, nonRelayEvents) !== -1) {
        -        return;
        -      }
        -
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerDropdownEvents = function () {
        -    var self = this;
        -
        -    this.dropdown.on('*', function (name, params) {
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerResultsEvents = function () {
        -    var self = this;
        -
        -    this.results.on('*', function (name, params) {
        -      self.trigger(name, params);
        -    });
        -  };
        -
        -  Select2.prototype._registerEvents = function () {
        -    var self = this;
        -
        -    this.on('open', function () {
        -      self.$container.addClass('select2-container--open');
        -    });
        -
        -    this.on('close', function () {
        -      self.$container.removeClass('select2-container--open');
        -    });
        -
        -    this.on('enable', function () {
        -      self.$container.removeClass('select2-container--disabled');
        -    });
        -
        -    this.on('disable', function () {
        -      self.$container.addClass('select2-container--disabled');
        -    });
        -
        -    this.on('focus', function () {
        -      self.$container.addClass('select2-container--focus');
        -    });
        -
        -    this.on('blur', function () {
        -      self.$container.removeClass('select2-container--focus');
        -    });
        -
        -    this.on('query', function (params) {
        -      if (!self.isOpen()) {
        -        self.trigger('open');
        -      }
        -
        -      this.dataAdapter.query(params, function (data) {
        -        self.trigger('results:all', {
        -          data: data,
        -          query: params
        -        });
        -      });
        -    });
        -
        -    this.on('query:append', function (params) {
        -      this.dataAdapter.query(params, function (data) {
        -        self.trigger('results:append', {
        -          data: data,
        -          query: params
        -        });
        -      });
        -    });
        -
        -    this.on('keypress', function (evt) {
        -      var key = evt.which;
        -
        -      if (self.isOpen()) {
        -        if (key === KEYS.ENTER) {
        -          self.trigger('results:select');
        -
        -          evt.preventDefault();
        -        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
        -          self.trigger('results:toggle');
        -
        -          evt.preventDefault();
        -        } else if (key === KEYS.UP) {
        -          self.trigger('results:previous');
        -
        -          evt.preventDefault();
        -        } else if (key === KEYS.DOWN) {
        -          self.trigger('results:next');
        -
        -          evt.preventDefault();
        -        } else if (key === KEYS.ESC || key === KEYS.TAB) {
        -          self.close();
        -
        -          evt.preventDefault();
        -        }
        -      } else {
        -        if (key === KEYS.ENTER || key === KEYS.SPACE ||
        -            ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) {
        -          self.open();
        -
        -          evt.preventDefault();
        -        }
        -      }
        -    });
        -  };
        -
        -  Select2.prototype._syncAttributes = function () {
        -    this.options.set('disabled', this.$element.prop('disabled'));
        -
        -    if (this.options.get('disabled')) {
        -      if (this.isOpen()) {
        -        this.close();
        -      }
        -
        -      this.trigger('disable');
        -    } else {
        -      this.trigger('enable');
        -    }
        -  };
        -
        -  /**
        -   * Override the trigger method to automatically trigger pre-events when
        -   * there are events that can be prevented.
        -   */
        -  Select2.prototype.trigger = function (name, args) {
        -    var actualTrigger = Select2.__super__.trigger;
        -    var preTriggerMap = {
        -      'open': 'opening',
        -      'close': 'closing',
        -      'select': 'selecting',
        -      'unselect': 'unselecting'
        -    };
        -
        -    if (name in preTriggerMap) {
        -      var preTriggerName = preTriggerMap[name];
        -      var preTriggerArgs = {
        -        prevented: false,
        -        name: name,
        -        args: args
        -      };
        -
        -      actualTrigger.call(this, preTriggerName, preTriggerArgs);
        -
        -      if (preTriggerArgs.prevented) {
        -        args.prevented = true;
        -
        -        return;
        -      }
        -    }
        -
        -    actualTrigger.call(this, name, args);
        -  };
        -
        -  Select2.prototype.toggleDropdown = function () {
        -    if (this.options.get('disabled')) {
        -      return;
        -    }
        -
        -    if (this.isOpen()) {
        -      this.close();
        -    } else {
        -      this.open();
        -    }
        -  };
        -
        -  Select2.prototype.open = function () {
        -    if (this.isOpen()) {
        -      return;
        -    }
        -
        -    this.trigger('query', {});
        -
        -    this.trigger('open');
        -  };
        -
        -  Select2.prototype.close = function () {
        -    if (!this.isOpen()) {
        -      return;
        -    }
        -
        -    this.trigger('close');
        -  };
        -
        -  Select2.prototype.isOpen = function () {
        -    return this.$container.hasClass('select2-container--open');
        -  };
        -
        -  Select2.prototype.enable = function (args) {
        -    if (this.options.get('debug') && window.console && console.warn) {
        -      console.warn(
        -        'Select2: The `select2("enable")` method has been deprecated and will' +
        -        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
        -        ' instead.'
        -      );
        -    }
        -
        -    if (args == null || args.length === 0) {
        -      args = [true];
        -    }
        -
        -    var disabled = !args[0];
        -
        -    this.$element.prop('disabled', disabled);
        -  };
        -
        -  Select2.prototype.data = function () {
        -    if (this.options.get('debug') &&
        -        arguments.length > 0 && window.console && console.warn) {
        -      console.warn(
        -        'Select2: Data can no longer be set using `select2("data")`. You ' +
        -        'should consider setting the value instead using `$element.val()`.'
        -      );
        -    }
        -
        -    var data = [];
        -
        -    this.dataAdapter.current(function (currentData) {
        -      data = currentData;
        -    });
        -
        -    return data;
        -  };
        -
        -  Select2.prototype.val = function (args) {
        -    if (this.options.get('debug') && window.console && console.warn) {
        -      console.warn(
        -        'Select2: The `select2("val")` method has been deprecated and will be' +
        -        ' removed in later Select2 versions. Use $element.val() instead.'
        -      );
        -    }
        -
        -    if (args == null || args.length === 0) {
        -      return this.$element.val();
        -    }
        -
        -    var newVal = args[0];
        -
        -    if ($.isArray(newVal)) {
        -      newVal = $.map(newVal, function (obj) {
        -        return obj.toString();
        -      });
        -    }
        -
        -    this.$element.val(newVal).trigger('change');
        -  };
        -
        -  Select2.prototype.destroy = function () {
        -    this.$container.remove();
        -
        -    if (this.$element[0].detachEvent) {
        -      this.$element[0].detachEvent('onpropertychange', this._sync);
        -    }
        -
        -    if (this._observer != null) {
        -      this._observer.disconnect();
        -      this._observer = null;
        -    } else if (this.$element[0].removeEventListener) {
        -      this.$element[0]
        -        .removeEventListener('DOMAttrModified', this._sync, false);
        -    }
        -
        -    this._sync = null;
        -
        -    this.$element.off('.select2');
        -    this.$element.attr('tabindex', this.$element.data('old-tabindex'));
        -
        -    this.$element.removeClass('select2-hidden-accessible');
        -	this.$element.attr('aria-hidden', 'false');
        -    this.$element.removeData('select2');
        -
        -    this.dataAdapter.destroy();
        -    this.selection.destroy();
        -    this.dropdown.destroy();
        -    this.results.destroy();
        -
        -    this.dataAdapter = null;
        -    this.selection = null;
        -    this.dropdown = null;
        -    this.results = null;
        -  };
        -
        -  Select2.prototype.render = function () {
        -    var $container = $(
        -      '<span class="select2 select2-container">' +
        -        '<span class="selection"></span>' +
        -        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
        -      '</span>'
        -    );
        -
        -    $container.attr('dir', this.options.get('dir'));
        -
        -    this.$container = $container;
        -
        -    this.$container.addClass('select2-container--' + this.options.get('theme'));
        -
        -    $container.data('element', this.$element);
        -
        -    return $container;
        -  };
        -
        -  return Select2;
        -});
        -
        -S2.define('jquery.select2',[
        -  'jquery',
        -  'require',
        -
        -  './select2/core',
        -  './select2/defaults'
        -], function ($, require, Select2, Defaults) {
        -  // Force jQuery.mousewheel to be loaded if it hasn't already
        -  require('jquery.mousewheel');
        -
        -  if ($.fn.select2 == null) {
        -    // All methods that should return the element
        -    var thisMethods = ['open', 'close', 'destroy'];
        -
        -    $.fn.select2 = function (options) {
        -      options = options || {};
        -
        -      if (typeof options === 'object') {
        -        this.each(function () {
        -          var instanceOptions = $.extend({}, options, true);
        -
        -          var instance = new Select2($(this), instanceOptions);
        -        });
        -
        -        return this;
        -      } else if (typeof options === 'string') {
        -        var instance = this.data('select2');
        -
        -        if (instance == null && window.console && console.error) {
        -          console.error(
        -            'The select2(\'' + options + '\') method was called on an ' +
        -            'element that is not using Select2.'
        -          );
        -        }
        -
        -        var args = Array.prototype.slice.call(arguments, 1);
        -
        -        var ret = instance[options](args);
        -
        -        // Check if we should be returning `this`
        -        if ($.inArray(options, thisMethods) > -1) {
        -          return this;
        -        }
        -
        -        return ret;
        -      } else {
        -        throw new Error('Invalid arguments for Select2: ' + options);
        -      }
        -    };
        -  }
        -
        -  if ($.fn.select2.defaults == null) {
        -    $.fn.select2.defaults = Defaults;
        -  }
        -
        -  return Select2;
        -});
        -
        -S2.define('jquery.mousewheel',[
        -  'jquery'
        -], function ($) {
        -  // Used to shim jQuery.mousewheel for non-full builds.
        -  return $;
        -});
        -
        -  // Return the AMD loader configuration so it can be used outside of this file
        -  return {
        -    define: S2.define,
        -    require: S2.require
        -  };
        -}());
        -
        -  // Autoload the jQuery bindings
        -  // We know that all of the modules exist above this, so we're safe
        -  var select2 = S2.require('jquery.select2');
        -
        -  // Hold the AMD module references on the jQuery function that was just loaded
        -  // This allows Select2 to use the internal loader outside of this file, such
        -  // as in the language files.
        -  jQuery.fn.select2.amd = S2;
        -
        -  // Return the Select2 instance for anyone who is importing it.
        -  return select2;
        -}));
        -
        -/*!
        - * iCheck v1.0.1, http://git.io/arlzeA
        - * =================================
        - * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization
        - *
        - * (c) 2013 Damir Sultanov, http://fronteed.com
        - * MIT Licensed
        - */
        -
        -(function($) {
        -
        -  // Cached vars
        -  var _iCheck = 'iCheck',
        -    _iCheckHelper = _iCheck + '-helper',
        -    _checkbox = 'checkbox',
        -    _radio = 'radio',
        -    _checked = 'checked',
        -    _unchecked = 'un' + _checked,
        -    _disabled = 'disabled',
        -    _determinate = 'determinate',
        -    _indeterminate = 'in' + _determinate,
        -    _update = 'update',
        -    _type = 'type',
        -    _click = 'click',
        -    _touch = 'touchbegin.i touchend.i',
        -    _add = 'addClass',
        -    _remove = 'removeClass',
        -    _callback = 'trigger',
        -    _label = 'label',
        -    _cursor = 'cursor',
        -    _mobile = /ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);
        -
        -  // Plugin init
        -  $.fn[_iCheck] = function(options, fire) {
        -
        -    // Walker
        -    var handle = 'input[type="' + _checkbox + '"], input[type="' + _radio + '"]',
        -      stack = $(),
        -      walker = function(object) {
        -        object.each(function() {
        -          var self = $(this);
        -
        -          if (self.is(handle)) {
        -            stack = stack.add(self);
        -          } else {
        -            stack = stack.add(self.find(handle));
        -          }
        -        });
        -      };
        -
        -    // Check if we should operate with some method
        -    if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) {
        -
        -      // Normalize method's name
        -      options = options.toLowerCase();
        -
        -      // Find checkboxes and radio buttons
        -      walker(this);
        -
        -      return stack.each(function() {
        -        var self = $(this);
        -
        -        if (options == 'destroy') {
        -          tidy(self, 'ifDestroyed');
        -        } else {
        -          operate(self, true, options);
        -        }
        -          // Fire method's callback
        -        if ($.isFunction(fire)) {
        -          fire();
        -        }
        -      });
        -
        -    // Customization
        -    } else if (typeof options == 'object' || !options) {
        -
        -      // Check if any options were passed
        -      var settings = $.extend({
        -          checkedClass: _checked,
        -          disabledClass: _disabled,
        -          indeterminateClass: _indeterminate,
        -          labelHover: true,
        -          aria: false
        -        }, options),
        -
        -        selector = settings.handle,
        -        hoverClass = settings.hoverClass || 'hover',
        -        focusClass = settings.focusClass || 'focus',
        -        activeClass = settings.activeClass || 'active',
        -        labelHover = !!settings.labelHover,
        -        labelHoverClass = settings.labelHoverClass || 'hover',
        -
        -        // Setup clickable area
        -        area = ('' + settings.increaseArea).replace('%', '') | 0;
        -
        -      // Selector limit
        -      if (selector == _checkbox || selector == _radio) {
        -        handle = 'input[type="' + selector + '"]';
        -      }
        -        // Clickable area limit
        -      if (area < -50) {
        -        area = -50;
        -      }
        -        // Walk around the selector
        -      walker(this);
        -
        -      return stack.each(function() {
        -        var self = $(this);
        -
        -        // If already customized
        -        tidy(self);
        -
        -        var node = this,
        -          id = node.id,
        -
        -          // Layer styles
        -          offset = -area + '%',
        -          size = 100 + (area * 2) + '%',
        -          layer = {
        -            position: 'absolute',
        -            top: offset,
        -            left: offset,
        -            display: 'block',
        -            width: size,
        -            height: size,
        -            margin: 0,
        -            padding: 0,
        -            background: '#fff',
        -            border: 0,
        -            opacity: 0
        -          },
        -
        -          // Choose how to hide input
        -          hide = _mobile ? {
        -            position: 'absolute',
        -            visibility: 'hidden'
        -          } : area ? layer : {
        -            position: 'absolute',
        -            opacity: 0
        -          },
        -
        -          // Get proper class
        -          className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio,
        -
        -          // Find assigned labels
        -          label = $(_label + '[for="' + id + '"]').add(self.closest(_label)),
        -
        -          // Check ARIA option
        -          aria = !!settings.aria,
        -
        -          // Set ARIA placeholder
        -          ariaID = _iCheck + '-' + Math.random().toString(36).replace('0.', ''),
        -
        -          // Parent & helper
        -          parent = '<div class="' + className + '" ' + (aria ? 'role="' + node[_type] + '" ' : ''),
        -          helper;
        -
        -        // Set ARIA "labelledby"
        -        if (label.length && aria) {
        -          label.each(function() {
        -            parent += 'aria-labelledby="';
        -
        -            if (this.id) {
        -              parent += this.id;
        -            } else {
        -              this.id = ariaID;
        -              parent += ariaID;
        -            }
        -
        -            parent += '"';
        -          });
        -        }
        -          // Wrap input
        -        parent = self.wrap(parent + '/>')[_callback]('ifCreated').parent().append(settings.insert);
        -
        -        // Layer addition
        -        helper = $('<ins class="' + _iCheckHelper + '"/>').css(layer).appendTo(parent);
        -
        -        // Finalize customization
        -        self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide);
        -        !!settings.inheritClass && parent[_add](node.className || '');
        -        !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id);
        -        parent.css('position') == 'static' && parent.css('position', 'relative');
        -        operate(self, true, _update);
        -
        -        // Label events
        -        if (label.length) {
        -          label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function(event) {
        -            var type = event[_type],
        -              item = $(this);
        -
        -            // Do nothing if input is disabled
        -            if (!node[_disabled]) {
        -
        -              // Click
        -              if (type == _click) {
        -                if ($(event.target).is('a')) {
        -                  return;
        -                }
        -                operate(self, false, true);
        -
        -              // Hover state
        -              } else if (labelHover) {
        -
        -                // mouseout|touchend
        -                if (/ut|nd/.test(type)) {
        -                  parent[_remove](hoverClass);
        -                  item[_remove](labelHoverClass);
        -                } else {
        -                  parent[_add](hoverClass);
        -                  item[_add](labelHoverClass);
        -                }
        -              }
        -                if (_mobile) {
        -                event.stopPropagation();
        -              } else {
        -                return false;
        -              }
        -            }
        -          });
        -        }
        -          // Input events
        -        self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function(event) {
        -          var type = event[_type],
        -            key = event.keyCode;
        -
        -          // Click
        -          if (type == _click) {
        -            return false;
        -
        -          // Keydown
        -          } else if (type == 'keydown' && key == 32) {
        -            if (!(node[_type] == _radio && node[_checked])) {
        -              if (node[_checked]) {
        -                off(self, _checked);
        -              } else {
        -                on(self, _checked);
        -              }
        -            }
        -              return false;
        -
        -          // Keyup
        -          } else if (type == 'keyup' && node[_type] == _radio) {
        -            !node[_checked] && on(self, _checked);
        -
        -          // Focus/blur
        -          } else if (/us|ur/.test(type)) {
        -            parent[type == 'blur' ? _remove : _add](focusClass);
        -          }
        -        });
        -
        -        // Helper events
        -        helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function(event) {
        -          var type = event[_type],
        -
        -            // mousedown|mouseup
        -            toggle = /wn|up/.test(type) ? activeClass : hoverClass;
        -
        -          // Do nothing if input is disabled
        -          if (!node[_disabled]) {
        -
        -            // Click
        -            if (type == _click) {
        -              operate(self, false, true);
        -
        -            // Active and hover states
        -            } else {
        -
        -              // State is on
        -              if (/wn|er|in/.test(type)) {
        -
        -                // mousedown|mouseover|touchbegin
        -                parent[_add](toggle);
        -
        -              // State is off
        -              } else {
        -                parent[_remove](toggle + ' ' + activeClass);
        -              }
        -                // Label hover
        -              if (label.length && labelHover && toggle == hoverClass) {
        -
        -                // mouseout|touchend
        -                label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass);
        -              }
        -            }
        -              if (_mobile) {
        -              event.stopPropagation();
        -            } else {
        -              return false;
        -            }
        -          }
        -        });
        -      });
        -    } else {
        -      return this;
        -    }
        -  };
        -
        -  // Do something with inputs
        -  function operate(input, direct, method) {
        -    var node = input[0],
        -      state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked,
        -      active = method == _update ? {
        -        checked: node[_checked],
        -        disabled: node[_disabled],
        -        indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false'
        -      } : node[state];
        -
        -    // Check, disable or indeterminate
        -    if (/^(ch|di|in)/.test(method) && !active) {
        -      on(input, state);
        -
        -    // Uncheck, enable or determinate
        -    } else if (/^(un|en|de)/.test(method) && active) {
        -      off(input, state);
        -
        -    // Update
        -    } else if (method == _update) {
        -
        -      // Handle states
        -      for (var state in active) {
        -        if (active[state]) {
        -          on(input, state, true);
        -        } else {
        -          off(input, state, true);
        -        }
        -      }
        -    } else if (!direct || method == 'toggle') {
        -
        -      // Helper or label was clicked
        -      if (!direct) {
        -        input[_callback]('ifClicked');
        -      }
        -        // Toggle checked state
        -      if (active) {
        -        if (node[_type] !== _radio) {
        -          off(input, state);
        -        }
        -      } else {
        -        on(input, state);
        -      }
        -    }
        -  }
        -    // Add checked, disabled or indeterminate state
        -  function on(input, state, keep) {
        -    var node = input[0],
        -      parent = input.parent(),
        -      checked = state == _checked,
        -      indeterminate = state == _indeterminate,
        -      disabled = state == _disabled,
        -      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',
        -      regular = option(input, callback + capitalize(node[_type])),
        -      specific = option(input, state + capitalize(node[_type]));
        -
        -    // Prevent unnecessary actions
        -    if (node[state] !== true) {
        -
        -      // Toggle assigned radio buttons
        -      if (!keep && state == _checked && node[_type] == _radio && node.name) {
        -        var form = input.closest('form'),
        -          inputs = 'input[name="' + node.name + '"]';
        -
        -        inputs = form.length ? form.find(inputs) : $(inputs);
        -
        -        inputs.each(function() {
        -          if (this !== node && $(this).data(_iCheck)) {
        -            off($(this), state);
        -          }
        -        });
        -      }
        -        // Indeterminate state
        -      if (indeterminate) {
        -
        -        // Add indeterminate state
        -        node[state] = true;
        -
        -        // Remove checked state
        -        if (node[_checked]) {
        -          off(input, _checked, 'force');
        -        }
        -          // Checked or disabled state
        -      } else {
        -
        -        // Add checked or disabled state
        -        if (!keep) {
        -          node[state] = true;
        -        }
        -          // Remove indeterminate state
        -        if (checked && node[_indeterminate]) {
        -          off(input, _indeterminate, false);
        -        }
        -      }
        -        // Trigger callbacks
        -      callbacks(input, checked, state, keep);
        -    }
        -      // Add proper cursor
        -    if (node[_disabled] && !!option(input, _cursor, true)) {
        -      parent.find('.' + _iCheckHelper).css(_cursor, 'default');
        -    }
        -      // Add state class
        -    parent[_add](specific || option(input, state) || '');
        -
        -    // Set ARIA attribute
        -    disabled ? parent.attr('aria-disabled', 'true') : parent.attr('aria-checked', indeterminate ? 'mixed' : 'true');
        -
        -    // Remove regular state class
        -    parent[_remove](regular || option(input, callback) || '');
        -  }
        -    // Remove checked, disabled or indeterminate state
        -  function off(input, state, keep) {
        -    var node = input[0],
        -      parent = input.parent(),
        -      checked = state == _checked,
        -      indeterminate = state == _indeterminate,
        -      disabled = state == _disabled,
        -      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',
        -      regular = option(input, callback + capitalize(node[_type])),
        -      specific = option(input, state + capitalize(node[_type]));
        -
        -    // Prevent unnecessary actions
        -    if (node[state] !== false) {
        -
        -      // Toggle state
        -      if (indeterminate || !keep || keep == 'force') {
        -        node[state] = false;
        -      }
        -        // Trigger callbacks
        -      callbacks(input, checked, callback, keep);
        -    }
        -      // Add proper cursor
        -    if (!node[_disabled] && !!option(input, _cursor, true)) {
        -      parent.find('.' + _iCheckHelper).css(_cursor, 'pointer');
        -    }
        -      // Remove state class
        -    parent[_remove](specific || option(input, state) || '');
        -
        -    // Set ARIA attribute
        -    disabled ? parent.attr('aria-disabled', 'false') : parent.attr('aria-checked', 'false');
        -
        -    // Add regular state class
        -    parent[_add](regular || option(input, callback) || '');
        -  }
        -    // Remove all traces
        -  function tidy(input, callback) {
        -    if (input.data(_iCheck)) {
        -
        -      // Remove everything except input
        -      input.parent().html(input.attr('style', input.data(_iCheck).s || ''));
        -
        -      // Callback
        -      if (callback) {
        -        input[_callback](callback);
        -      }
        -        // Unbind events
        -      input.off('.i').unwrap();
        -      $(_label + '[for="' + input[0].id + '"]').add(input.closest(_label)).off('.i');
        -    }
        -  }
        -    // Get some option
        -  function option(input, state, regular) {
        -    if (input.data(_iCheck)) {
        -      return input.data(_iCheck).o[state + (regular ? '' : 'Class')];
        -    }
        -  }
        -    // Capitalize some string
        -  function capitalize(string) {
        -    return string.charAt(0).toUpperCase() + string.slice(1);
        -  }
        -    // Executable handlers
        -  function callbacks(input, checked, callback, keep) {
        -    if (!keep) {
        -      if (checked) {
        -        input[_callback]('ifToggled');
        -      }
        -        input[_callback]('ifChanged')[_callback]('if' + capitalize(callback));
        -    }
        -  }
        -})(window.jQuery || window.Zepto);
        -
        -
        -/*
        -Lightbox for Bootstrap 3 by @ashleydw
        -https://github.com/ashleydw/lightbox
        -
        -License: https://github.com/ashleydw/lightbox/blob/master/LICENSE
        - */
        -
        -(function() {
        -  "use strict";
        -  var $, EkkoLightbox;
        -
        -  $ = jQuery;
        -
        -  EkkoLightbox = function(element, options) {
        -    var content, footer, header;
        -    this.options = $.extend({
        -      title: null,
        -      footer: null,
        -      remote: null
        -    }, $.fn.ekkoLightbox.defaults, options || {});
        -    this.$element = $(element);
        -    content = '';
        -    this.modal_id = this.options.modal_id ? this.options.modal_id : 'ekkoLightbox-' + Math.floor((Math.random() * 1000) + 1);
        -    header = '<div class="modal-header"' + (this.options.title || this.options.always_show_close ? '' : ' style="display:none"') + '><button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button><h4 class="modal-title">' + (this.options.title || "&nbsp;") + '</h4></div>';
        -    footer = '<div class="modal-footer"' + (this.options.footer ? '' : ' style="display:none"') + '>' + this.options.footer + '</div>';
        -    $(document.body).append('<div id="' + this.modal_id + '" class="ekko-lightbox modal fade" tabindex="-1"><div class="modal-dialog"><div class="modal-content">' + header + '<div class="modal-body"><div class="ekko-lightbox-container"><div></div></div></div>' + footer + '</div></div></div>');
        -    this.modal = $('#' + this.modal_id);
        -    this.modal_dialog = this.modal.find('.modal-dialog').first();
        -    this.modal_content = this.modal.find('.modal-content').first();
        -    this.modal_body = this.modal.find('.modal-body').first();
        -    this.modal_header = this.modal.find('.modal-header').first();
        -    this.modal_footer = this.modal.find('.modal-footer').first();
        -    this.lightbox_container = this.modal_body.find('.ekko-lightbox-container').first();
        -    this.lightbox_body = this.lightbox_container.find('> div:first-child').first();
        -    this.showLoading();
        -    this.modal_arrows = null;
        -    this.border = {
        -      top: parseFloat(this.modal_dialog.css('border-top-width')) + parseFloat(this.modal_content.css('border-top-width')) + parseFloat(this.modal_body.css('border-top-width')),
        -      right: parseFloat(this.modal_dialog.css('border-right-width')) + parseFloat(this.modal_content.css('border-right-width')) + parseFloat(this.modal_body.css('border-right-width')),
        -      bottom: parseFloat(this.modal_dialog.css('border-bottom-width')) + parseFloat(this.modal_content.css('border-bottom-width')) + parseFloat(this.modal_body.css('border-bottom-width')),
        -      left: parseFloat(this.modal_dialog.css('border-left-width')) + parseFloat(this.modal_content.css('border-left-width')) + parseFloat(this.modal_body.css('border-left-width'))
        -    };
        -    this.padding = {
        -      top: parseFloat(this.modal_dialog.css('padding-top')) + parseFloat(this.modal_content.css('padding-top')) + parseFloat(this.modal_body.css('padding-top')),
        -      right: parseFloat(this.modal_dialog.css('padding-right')) + parseFloat(this.modal_content.css('padding-right')) + parseFloat(this.modal_body.css('padding-right')),
        -      bottom: parseFloat(this.modal_dialog.css('padding-bottom')) + parseFloat(this.modal_content.css('padding-bottom')) + parseFloat(this.modal_body.css('padding-bottom')),
        -      left: parseFloat(this.modal_dialog.css('padding-left')) + parseFloat(this.modal_content.css('padding-left')) + parseFloat(this.modal_body.css('padding-left'))
        -    };
        -    this.modal.on('show.bs.modal', this.options.onShow.bind(this)).on('shown.bs.modal', (function(_this) {
        -      return function() {
        -        _this.modal_shown();
        -        return _this.options.onShown.call(_this);
        -      };
        -    })(this)).on('hide.bs.modal', this.options.onHide.bind(this)).on('hidden.bs.modal', (function(_this) {
        -      return function() {
        -        if (_this.gallery) {
        -          $(document).off('keydown.ekkoLightbox');
        -        }
        -        _this.modal.remove();
        -        return _this.options.onHidden.call(_this);
        -      };
        -    })(this)).modal('show', options);
        -    return this.modal;
        -  };
        -
        -  EkkoLightbox.prototype = {
        -    modal_shown: function() {
        -      var video_id;
        -      if (!this.options.remote) {
        -        return this.error('No remote target given');
        -      } else {
        -        this.gallery = this.$element.data('gallery');
        -        if (this.gallery) {
        -          if (this.options.gallery_parent_selector === 'document.body' || this.options.gallery_parent_selector === '') {
        -            this.gallery_items = $(document.body).find('*[data-gallery="' + this.gallery + '"]');
        -          } else {
        -            this.gallery_items = this.$element.parents(this.options.gallery_parent_selector).first().find('*[data-gallery="' + this.gallery + '"]');
        -          }
        -          this.gallery_index = this.gallery_items.index(this.$element);
        -          $(document).on('keydown.ekkoLightbox', this.navigate.bind(this));
        -          if (this.options.directional_arrows && this.gallery_items.length > 1) {
        -            this.lightbox_container.append('<div class="ekko-lightbox-nav-overlay"><a href="#" class="' + this.strip_stops(this.options.left_arrow_class) + '"></a><a href="#" class="' + this.strip_stops(this.options.right_arrow_class) + '"></a></div>');
        -            this.modal_arrows = this.lightbox_container.find('div.ekko-lightbox-nav-overlay').first();
        -            this.lightbox_container.find('a' + this.strip_spaces(this.options.left_arrow_class)).on('click', (function(_this) {
        -              return function(event) {
        -                event.preventDefault();
        -                return _this.navigate_left();
        -              };
        -            })(this));
        -            this.lightbox_container.find('a' + this.strip_spaces(this.options.right_arrow_class)).on('click', (function(_this) {
        -              return function(event) {
        -                event.preventDefault();
        -                return _this.navigate_right();
        -              };
        -            })(this));
        -          }
        -        }
        -        if (this.options.type) {
        -          if (this.options.type === 'image') {
        -            return this.preloadImage(this.options.remote, true);
        -          } else if (this.options.type === 'youtube' && (video_id = this.getYoutubeId(this.options.remote))) {
        -            return this.showYoutubeVideo(video_id);
        -          } else if (this.options.type === 'vimeo') {
        -            return this.showVimeoVideo(this.options.remote);
        -          } else if (this.options.type === 'instagram') {
        -            return this.showInstagramVideo(this.options.remote);
        -          } else if (this.options.type === 'url') {
        -            return this.loadRemoteContent(this.options.remote);
        -          } else if (this.options.type === 'video') {
        -            return this.showVideoIframe(this.options.remote);
        -          } else {
        -            return this.error("Could not detect remote target type. Force the type using data-type=\"image|youtube|vimeo|instagram|url|video\"");
        -          }
        -        } else {
        -          return this.detectRemoteType(this.options.remote);
        -        }
        -      }
        -    },
        -    strip_stops: function(str) {
        -      return str.replace(/\./g, '');
        -    },
        -    strip_spaces: function(str) {
        -      return str.replace(/\s/g, '');
        -    },
        -    isImage: function(str) {
        -      return str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);
        -    },
        -    isSwf: function(str) {
        -      return str.match(/\.(swf)((\?|#).*)?$/i);
        -    },
        -    getYoutubeId: function(str) {
        -      var match;
        -      match = str.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);
        -      if (match && match[2].length === 11) {
        -        return match[2];
        -      } else {
        -        return false;
        -      }
        -    },
        -    getVimeoId: function(str) {
        -      if (str.indexOf('vimeo') > 0) {
        -        return str;
        -      } else {
        -        return false;
        -      }
        -    },
        -    getInstagramId: function(str) {
        -      if (str.indexOf('instagram') > 0) {
        -        return str;
        -      } else {
        -        return false;
        -      }
        -    },
        -    navigate: function(event) {
        -      event = event || window.event;
        -      if (event.keyCode === 39 || event.keyCode === 37) {
        -        if (event.keyCode === 39) {
        -          return this.navigate_right();
        -        } else if (event.keyCode === 37) {
        -          return this.navigate_left();
        -        }
        -      }
        -    },
        -    navigateTo: function(index) {
        -      var next, src;
        -      if (index < 0 || index > this.gallery_items.length - 1) {
        -        return this;
        -      }
        -      this.showLoading();
        -      this.gallery_index = index;
        -      this.$element = $(this.gallery_items.get(this.gallery_index));
        -      this.updateTitleAndFooter();
        -      src = this.$element.attr('data-remote') || this.$element.attr('href');
        -      this.detectRemoteType(src, this.$element.attr('data-type') || false);
        -      if (this.gallery_index + 1 < this.gallery_items.length) {
        -        next = $(this.gallery_items.get(this.gallery_index + 1), false);
        -        src = next.attr('data-remote') || next.attr('href');
        -        if (next.attr('data-type') === 'image' || this.isImage(src)) {
        -          return this.preloadImage(src, false);
        -        }
        -      }
        -    },
        -    navigate_left: function() {
        -      if (this.gallery_items.length === 1) {
        -        return;
        -      }
        -      if (this.gallery_index === 0) {
        -        this.gallery_index = this.gallery_items.length - 1;
        -      } else {
        -        this.gallery_index--;
        -      }
        -      this.options.onNavigate.call(this, 'left', this.gallery_index);
        -      return this.navigateTo(this.gallery_index);
        -    },
        -    navigate_right: function() {
        -      if (this.gallery_items.length === 1) {
        -        return;
        -      }
        -      if (this.gallery_index === this.gallery_items.length - 1) {
        -        this.gallery_index = 0;
        -      } else {
        -        this.gallery_index++;
        -      }
        -      this.options.onNavigate.call(this, 'right', this.gallery_index);
        -      return this.navigateTo(this.gallery_index);
        -    },
        -    detectRemoteType: function(src, type) {
        -      var video_id;
        -      type = type || false;
        -      if (type === 'image' || this.isImage(src)) {
        -        this.options.type = 'image';
        -        return this.preloadImage(src, true);
        -      } else if (type === 'youtube' || (video_id = this.getYoutubeId(src))) {
        -        this.options.type = 'youtube';
        -        return this.showYoutubeVideo(video_id);
        -      } else if (type === 'vimeo' || (video_id = this.getVimeoId(src))) {
        -        this.options.type = 'vimeo';
        -        return this.showVimeoVideo(video_id);
        -      } else if (type === 'instagram' || (video_id = this.getInstagramId(src))) {
        -        this.options.type = 'instagram';
        -        return this.showInstagramVideo(video_id);
        -      } else if (type === 'video') {
        -        this.options.type = 'video';
        -        return this.showVideoIframe(video_id);
        -      } else {
        -        this.options.type = 'url';
        -        return this.loadRemoteContent(src);
        -      }
        -    },
        -    updateTitleAndFooter: function() {
        -      var caption, footer, header, title;
        -      header = this.modal_content.find('.modal-header');
        -      footer = this.modal_content.find('.modal-footer');
        -      title = this.$element.data('title') || "";
        -      caption = this.$element.data('footer') || "";
        -      if (title || this.options.always_show_close) {
        -        header.css('display', '').find('.modal-title').html(title || "&nbsp;");
        -      } else {
        -        header.css('display', 'none');
        -      }
        -      if (caption) {
        -        footer.css('display', '').html(caption);
        -      } else {
        -        footer.css('display', 'none');
        -      }
        -      return this;
        -    },
        -    showLoading: function() {
        -      this.lightbox_body.html('<div class="modal-loading">' + this.options.loadingMessage + '</div>');
        -      return this;
        -    },
        -    showYoutubeVideo: function(id) {
        -      var height, rel, width;
        -      if ((this.$element.attr('data-norelated') != null) || this.options.no_related) {
        -        rel = "&rel=0";
        -      } else {
        -        rel = "";
        -      }
        -      width = this.checkDimensions(this.$element.data('width') || 560);
        -      height = width / (560 / 315);
        -      return this.showVideoIframe('//www.youtube.com/embed/' + id + '?badge=0&autoplay=1&html5=1' + rel, width, height);
        -    },
        -    showVimeoVideo: function(id) {
        -      var height, width;
        -      width = this.checkDimensions(this.$element.data('width') || 560);
        -      height = width / (500 / 281);
        -      return this.showVideoIframe(id + '?autoplay=1', width, height);
        -    },
        -    showInstagramVideo: function(id) {
        -      var height, width;
        -      width = this.checkDimensions(this.$element.data('width') || 612);
        -      this.resize(width);
        -      height = width + 80;
        -      this.lightbox_body.html('<iframe width="' + width + '" height="' + height + '" src="' + this.addTrailingSlash(id) + 'embed/" frameborder="0" allowfullscreen></iframe>');
        -      this.options.onContentLoaded.call(this);
        -      if (this.modal_arrows) {
        -        return this.modal_arrows.css('display', 'none');
        -      }
        -    },
        -    showVideoIframe: function(url, width, height) {
        -      height = height || width;
        -      this.resize(width);
        -      this.lightbox_body.html('<div class="embed-responsive embed-responsive-16by9"><iframe width="' + width + '" height="' + height + '" src="' + url + '" frameborder="0" allowfullscreen class="embed-responsive-item"></iframe></div>');
        -      this.options.onContentLoaded.call(this);
        -      if (this.modal_arrows) {
        -        this.modal_arrows.css('display', 'none');
        -      }
        -      return this;
        -    },
        -    loadRemoteContent: function(url) {
        -      var disableExternalCheck, width;
        -      width = this.$element.data('width') || 560;
        -      this.resize(width);
        -      disableExternalCheck = this.$element.data('disableExternalCheck') || false;
        -      if (!disableExternalCheck && !this.isExternal(url)) {
        -        this.lightbox_body.load(url, $.proxy((function(_this) {
        -          return function() {
        -            return _this.$element.trigger('loaded.bs.modal');
        -          };
        -        })(this)));
        -      } else {
        -        this.lightbox_body.html('<iframe width="' + width + '" height="' + width + '" src="' + url + '" frameborder="0" allowfullscreen></iframe>');
        -        this.options.onContentLoaded.call(this);
        -      }
        -      if (this.modal_arrows) {
        -        this.modal_arrows.css('display', 'none');
        -      }
        -      return this;
        -    },
        -    isExternal: function(url) {
        -      var match;
        -      match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
        -      if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) {
        -        return true;
        -      }
        -      if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":(" + {
        -        "http:": 80,
        -        "https:": 443
        -      }[location.protocol] + ")?$"), "") !== location.host) {
        -        return true;
        -      }
        -      return false;
        -    },
        -    error: function(message) {
        -      this.lightbox_body.html(message);
        -      return this;
        -    },
        -    preloadImage: function(src, onLoadShowImage) {
        -      var img;
        -      img = new Image();
        -      if ((onLoadShowImage == null) || onLoadShowImage === true) {
        -        img.onload = (function(_this) {
        -          return function() {
        -            var image;
        -            image = $('<img />');
        -            image.attr('src', img.src);
        -            image.addClass('img-responsive');
        -            _this.lightbox_body.html(image);
        -            if (_this.modal_arrows) {
        -              _this.modal_arrows.css('display', 'block');
        -            }
        -            return image.load(function() {
        -              if (_this.options.scale_height) {
        -                _this.scaleHeight(img.height, img.width);
        -              } else {
        -                _this.resize(img.width);
        -              }
        -              return _this.options.onContentLoaded.call(_this);
        -            });
        -          };
        -        })(this);
        -        img.onerror = (function(_this) {
        -          return function() {
        -            return _this.error('Failed to load image: ' + src);
        -          };
        -        })(this);
        -      }
        -      img.src = src;
        -      return img;
        -    },
        -    scaleHeight: function(height, width) {
        -      var border_padding, factor, footer_height, header_height, margins, max_height;
        -      header_height = this.modal_header.outerHeight(true) || 0;
        -      footer_height = this.modal_footer.outerHeight(true) || 0;
        -      if (!this.modal_footer.is(':visible')) {
        -        footer_height = 0;
        -      }
        -      if (!this.modal_header.is(':visible')) {
        -        header_height = 0;
        -      }
        -      border_padding = this.border.top + this.border.bottom + this.padding.top + this.padding.bottom;
        -      margins = parseFloat(this.modal_dialog.css('margin-top')) + parseFloat(this.modal_dialog.css('margin-bottom'));
        -      max_height = $(window).height() - border_padding - margins - header_height - footer_height;
        -      factor = Math.min(max_height / height, 1);
        -      this.modal_dialog.css('height', 'auto').css('max-height', max_height);
        -      return this.resize(factor * width);
        -    },
        -    resize: function(width) {
        -      var width_total;
        -      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;
        -      this.modal_dialog.css('width', 'auto').css('max-width', width_total);
        -      this.lightbox_container.find('a').css('line-height', function() {
        -        return $(this).parent().height() + 'px';
        -      });
        -      return this;
        -    },
        -    checkDimensions: function(width) {
        -      var body_width, width_total;
        -      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;
        -      body_width = document.body.clientWidth;
        -      if (width_total > body_width) {
        -        width = this.modal_body.width();
        -      }
        -      return width;
        -    },
        -    close: function() {
        -      return this.modal.modal('hide');
        -    },
        -    addTrailingSlash: function(url) {
        -      if (url.substr(-1) !== '/') {
        -        url += '/';
        -      }
        -      return url;
        -    }
        -  };
        -
        -  $.fn.ekkoLightbox = function(options) {
        -    return this.each(function() {
        -      var $this;
        -      $this = $(this);
        -      options = $.extend({
        -        remote: $this.attr('data-remote') || $this.attr('href'),
        -        gallery_parent_selector: $this.attr('data-parent'),
        -        type: $this.attr('data-type')
        -      }, options, $this.data());
        -      new EkkoLightbox(this, options);
        -      return this;
        -    });
        -  };
        -
        -  $.fn.ekkoLightbox.defaults = {
        -    gallery_parent_selector: 'document.body',
        -    left_arrow_class: '.glyphicon .glyphicon-chevron-left',
        -    right_arrow_class: '.glyphicon .glyphicon-chevron-right',
        -    directional_arrows: true,
        -    type: null,
        -    always_show_close: true,
        -    no_related: false,
        -    scale_height: true,
        -    loadingMessage: 'Loading...',
        -    onShow: function() {},
        -    onShown: function() {},
        -    onHide: function() {},
        -    onHidden: function() {},
        -    onNavigate: function() {},
        -    onContentLoaded: function() {}
        -  };
        -
        -}).call(this);
        -
        -/**
        - * Module containing core application logic.
        - * @param  {jQuery} $        Insulated jQuery object
        - * @param  {JSON} settings Insulated `window.snipeit.settings` object.
        - * @return {IIFE}          Immediately invoked. Returns self.
        - */
        -
        -
        -var pieOptions = {
        -    //Boolean - Whether we should show a stroke on each segment
        -    segmentShowStroke: true,
        -    //String - The colour of each segment stroke
        -    segmentStrokeColor: "#fff",
        -    //Number - The width of each segment stroke
        -    segmentStrokeWidth: 1,
        -    //Number - The percentage of the chart that we cut out of the middle
        -    percentageInnerCutout: 50, // This is 0 for Pie charts
        -    //Number - Amount of animation steps
        -    animationSteps: 100,
        -    //String - Animation easing effect
        -    animationEasing: "easeOutBounce",
        -    //Boolean - Whether we animate the rotation of the Doughnut
        -    animateRotate: true,
        -    //Boolean - Whether we animate scaling the Doughnut from the centre
        -    animateScale: false,
        -    //Boolean - whether to make the chart responsive to window resizing
        -    responsive: true,
        -    // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
        -    maintainAspectRatio: false,
        -
        -    //String - A legend template
        -    legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li>" +
        -    "<i class='fa fa-circle-o' style='color: <%=segments[i].fillColor%>'></i>" +
        -    "<%if(segments[i].label){%><%=segments[i].label%><%}%> foo</li><%}%></ul>",
        -    //String - A tooltip template
        -    tooltipTemplate: "<%=value %> <%=label%> "
        -};
        -//console.dir(pieOptions);
        -//Create pie or douhnut chart
        -// You can switch between pie and douhnut using the method below.
        -//pieChart.Doughnut(PieData, pieOptions);
        -//-----------------
        -//- END PIE CHART -
        -//-----------------
        -
        -
        -
        -(function($, settings) {
        -    var Components = {};
        -    Components.modals = {};
        -
        -    // confirm delete modal
        -    Components.modals.confirmDelete = function() {
        -        var $el = $('table');
        -
        -        var events = {
        -            'click': function(evnt) {
        -                var $context = $(this);
        -                var $dataConfirmModal = $('#dataConfirmModal');
        -                var href = $context.attr('href');
        -                var message = $context.attr('data-content');
        -                var title = $context.attr('data-title');
        -
        -                $('#myModalLabel').text(title);
        -                $dataConfirmModal.find('.modal-body').text(message);
        -                $('#dataConfirmOK').attr('href', href);
        -                $dataConfirmModal.modal({
        -                    show: true
        -                });
        -                return false;
        -            }
        -        };
        -
        -        var render = function() {
        -            $el.on('click', '.delete-asset', events['click']);
        -        };
        -
        -        return {
        -            render: render
        -        };
        -    };
        -
        -
        -    /**
        -     * Application start point
        -     * Component definition stays out of load event, execution only happens.
        -     */
        -    $(function() {
        -        new Components.modals.confirmDelete().render();
        -    });
        -}(jQuery, window.snipeit.settings));
        -
        -
        -
        -
        -/*! AdminLTE app.js
        - * ================
        - * Main JS application file for AdminLTE v2. This file
        - * should be included in all pages. It controls some layout
        - * options and implements exclusive AdminLTE plugins.
        - *
        - * @Author  Almsaeed Studio
        - * @Support <http://www.almsaeedstudio.com>
        - * @Email   <support@almsaeedstudio.com>
        - * @version 2.3.0
        - * @license MIT <http://opensource.org/licenses/MIT>
        - */
        -
        -//Make sure jQuery has been loaded before app.js
        -if (typeof jQuery === "undefined") {
        -  throw new Error("AdminLTE requires jQuery");
        -}
        -
        -
        -/* AdminLTE
        - *
        - * @type Object
        - * @description $.AdminLTE is the main object for the template's app.
        - *              It's used for implementing functions and options related
        - *              to the template. Keeping everything wrapped in an object
        - *              prevents conflict with other plugins and is a better
        - *              way to organize our code.
        - */
        -$.AdminLTE = {};
        -
        -/* --------------------
        - * - AdminLTE Options -
        - * --------------------
        - * Modify these options to suit your implementation
        - */
        -$.AdminLTE.options = {
        -  //Add slimscroll to navbar menus
        -  //This requires you to load the slimscroll plugin
        -  //in every page before app.js
        -  navbarMenuSlimscroll: true,
        -  navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar
        -  navbarMenuHeight: "200px", //The height of the inner menu
        -  //General animation speed for JS animated elements such as box collapse/expand and
        -  //sidebar treeview slide up/down. This options accepts an integer as milliseconds,
        -  //'fast', 'normal', or 'slow'
        -  animationSpeed: 500,
        -  //Sidebar push menu toggle button selector
        -  sidebarToggleSelector: "[data-toggle='offcanvas']",
        -  //Activate sidebar push menu
        -  sidebarPushMenu: true,
        -  //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
        -  sidebarSlimScroll: true,
        -  //Enable sidebar expand on hover effect for sidebar mini
        -  //This option is forced to true if both the fixed layout and sidebar mini
        -  //are used together
        -  sidebarExpandOnHover: false,
        -  //BoxRefresh Plugin
        -  enableBoxRefresh: true,
        -  //Bootstrap.js tooltip
        -  enableBSToppltip: true,
        -  BSTooltipSelector: "[data-toggle='tooltip']",
        -  //Enable Fast Click. Fastclick.js creates a more
        -  //native touch experience with touch devices. If you
        -  //choose to enable the plugin, make sure you load the script
        -  //before AdminLTE's app.js
        -  enableFastclick: true,
        -  //Control Sidebar Options
        -  enableControlSidebar: true,
        -  controlSidebarOptions: {
        -    //Which button should trigger the open/close event
        -    toggleBtnSelector: "[data-toggle='control-sidebar']",
        -    //The sidebar selector
        -    selector: ".control-sidebar",
        -    //Enable slide over content
        -    slide: true
        -  },
        -  //Box Widget Plugin. Enable this plugin
        -  //to allow boxes to be collapsed and/or removed
        -  enableBoxWidget: true,
        -  //Box Widget plugin options
        -  boxWidgetOptions: {
        -    boxWidgetIcons: {
        -      //Collapse icon
        -      collapse: 'fa-minus',
        -      //Open icon
        -      open: 'fa-plus',
        -      //Remove icon
        -      remove: 'fa-times'
        -    },
        -    boxWidgetSelectors: {
        -      //Remove button selector
        -      remove: '[data-widget="remove"]',
        -      //Collapse button selector
        -      collapse: '[data-widget="collapse"]'
        -    }
        -  },
        -  //Direct Chat plugin options
        -  directChat: {
        -    //Enable direct chat by default
        -    enable: true,
        -    //The button to open and close the chat contacts pane
        -    contactToggleSelector: '[data-widget="chat-pane-toggle"]'
        -  },
        -  //Define the set of colors to use globally around the website
        -  colors: {
        -    lightBlue: "#3c8dbc",
        -    red: "#f56954",
        -    green: "#00a65a",
        -    aqua: "#00c0ef",
        -    yellow: "#f39c12",
        -    blue: "#0073b7",
        -    navy: "#001F3F",
        -    teal: "#39CCCC",
        -    olive: "#3D9970",
        -    lime: "#01FF70",
        -    orange: "#FF851B",
        -    fuchsia: "#F012BE",
        -    purple: "#8E24AA",
        -    maroon: "#D81B60",
        -    black: "#222222",
        -    gray: "#d2d6de"
        -  },
        -  //The standard screen sizes that bootstrap uses.
        -  //If you change these in the variables.less file, change
        -  //them here too.
        -  screenSizes: {
        -    xs: 480,
        -    sm: 768,
        -    md: 992,
        -    lg: 1200
        -  }
        -};
        -
        -/* ------------------
        - * - Implementation -
        - * ------------------
        - * The next block of code implements AdminLTE's
        - * functions and plugins as specified by the
        - * options above.
        - */
        -$(function () {
        -  "use strict";
        -
        -  //Fix for IE page transitions
        -  $("body").removeClass("hold-transition");
        -
        -  //Extend options if external options exist
        -  if (typeof AdminLTEOptions !== "undefined") {
        -    $.extend(true,
        -            $.AdminLTE.options,
        -            AdminLTEOptions);
        -  }
        -
        -  //Easy access to options
        -  var o = $.AdminLTE.options;
        -
        -  //Set up the object
        -  _init();
        -
        -  //Activate the layout maker
        -  $.AdminLTE.layout.activate();
        -
        -  //Enable sidebar tree view controls
        -  $.AdminLTE.tree('.sidebar');
        -
        -  //Enable control sidebar
        -  if (o.enableControlSidebar) {
        -    $.AdminLTE.controlSidebar.activate();
        -  }
        -
        -  //Add slimscroll to navbar dropdown
        -  if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
        -    $(".navbar .menu").slimscroll({
        -      height: o.navbarMenuHeight,
        -      alwaysVisible: false,
        -      size: o.navbarMenuSlimscrollWidth
        -    }).css("width", "100%");
        -  }
        -
        -  //Activate sidebar push menu
        -  if (o.sidebarPushMenu) {
        -    $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
        -  }
        -
        -  //Activate Bootstrap tooltip
        -  if (o.enableBSToppltip) {
        -    $('body').tooltip({
        -      selector: o.BSTooltipSelector
        -    });
        -  }
        -
        -  //Activate box widget
        -  if (o.enableBoxWidget) {
        -    $.AdminLTE.boxWidget.activate();
        -  }
        -
        -  //Activate fast click
        -  if (o.enableFastclick && typeof FastClick != 'undefined') {
        -    FastClick.attach(document.body);
        -  }
        -
        -  //Activate direct chat widget
        -  if (o.directChat.enable) {
        -    $(document).on('click', o.directChat.contactToggleSelector, function () {
        -      var box = $(this).parents('.direct-chat').first();
        -      box.toggleClass('direct-chat-contacts-open');
        -    });
        -  }
        -
        -  /*
        -   * INITIALIZE BUTTON TOGGLE
        -   * ------------------------
        -   */
        -  $('.btn-group[data-toggle="btn-toggle"]').each(function () {
        -    var group = $(this);
        -    $(this).find(".btn").on('click', function (e) {
        -      group.find(".btn.active").removeClass("active");
        -      $(this).addClass("active");
        -      e.preventDefault();
        -    });
        -
        -  });
        -});
        -
        -/* ----------------------------------
        - * - Initialize the AdminLTE Object -
        - * ----------------------------------
        - * All AdminLTE functions are implemented below.
        - */
        -function _init() {
        -  'use strict';
        -  /* Layout
        -   * ======
        -   * Fixes the layout height in case min-height fails.
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.layout.activate()
        -   *        $.AdminLTE.layout.fix()
        -   *        $.AdminLTE.layout.fixSidebar()
        -   */
        -  $.AdminLTE.layout = {
        -    activate: function () {
        -      var _this = this;
        -      _this.fix();
        -      _this.fixSidebar();
        -      $(window, ".wrapper").resize(function () {
        -        _this.fix();
        -        _this.fixSidebar();
        -      });
        -    },
        -    fix: function () {
        -      //Get window height and the wrapper height
        -      var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();
        -      var window_height = $(window).height();
        -      var sidebar_height = $(".sidebar").height();
        -      //Set the min-height of the content and sidebar based on the
        -      //the height of the document.
        -      if ($("body").hasClass("fixed")) {
        -        $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight());
        -      } else {
        -        var postSetWidth;
        -        if (window_height >= sidebar_height) {
        -          $(".content-wrapper, .right-side").css('min-height', window_height - neg);
        -          postSetWidth = window_height - neg;
        -        } else {
        -          $(".content-wrapper, .right-side").css('min-height', sidebar_height);
        -          postSetWidth = sidebar_height;
        -        }
        -
        -        //Fix for the control sidebar height
        -        var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
        -        if (typeof controlSidebar !== "undefined") {
        -          if (controlSidebar.height() > postSetWidth)
        -            $(".content-wrapper, .right-side").css('min-height', controlSidebar.height());
        -        }
        -
        -      }
        -    },
        -    fixSidebar: function () {
        -      //Make sure the body tag has the .fixed class
        -      if (!$("body").hasClass("fixed")) {
        -        if (typeof $.fn.slimScroll != 'undefined') {
        -          $(".sidebar").slimScroll({destroy: true}).height("auto");
        -        }
        -        return;
        -      } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
        -        window.console.error("Error: the fixed layout requires the slimscroll plugin!");
        -      }
        -      //Enable slimscroll for fixed layout
        -      if ($.AdminLTE.options.sidebarSlimScroll) {
        -        if (typeof $.fn.slimScroll != 'undefined') {
        -          //Destroy if it exists
        -          $(".sidebar").slimScroll({destroy: true}).height("auto");
        -          //Add slimscroll
        -          $(".sidebar").slimscroll({
        -            height: ($(window).height() - $(".main-header").height()) + "px",
        -            color: "rgba(0,0,0,0.2)",
        -            size: "3px"
        -          });
        -        }
        -      }
        -    }
        -  };
        -
        -  /* PushMenu()
        -   * ==========
        -   * Adds the push menu functionality to the sidebar.
        -   *
        -   * @type Function
        -   * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
        -   */
        -  $.AdminLTE.pushMenu = {
        -    activate: function (toggleBtn) {
        -      //Get the screen sizes
        -      var screenSizes = $.AdminLTE.options.screenSizes;
        -
        -      //Enable sidebar toggle
        -      $(toggleBtn).on('click', function (e) {
        -        e.preventDefault();
        -
        -        //Enable sidebar push menu
        -        if ($(window).width() > (screenSizes.sm - 1)) {
        -          if ($("body").hasClass('sidebar-collapse')) {
        -            $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu');
        -          } else {
        -            $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu');
        -          }
        -        }
        -        //Handle sidebar push menu for small screens
        -        else {
        -          if ($("body").hasClass('sidebar-open')) {
        -            $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');
        -          } else {
        -            $("body").addClass('sidebar-open').trigger('expanded.pushMenu');
        -          }
        -        }
        -      });
        -
        -      $(".content-wrapper").click(function () {
        -        //Enable hide menu when clicking on the content-wrapper on small screens
        -        if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) {
        -          $("body").removeClass('sidebar-open');
        -        }
        -      });
        -
        -      //Enable expand on hover for sidebar mini
        -      if ($.AdminLTE.options.sidebarExpandOnHover
        -              || ($('body').hasClass('fixed')
        -                      && $('body').hasClass('sidebar-mini'))) {
        -        this.expandOnHover();
        -      }
        -    },
        -    expandOnHover: function () {
        -      var _this = this;
        -      var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
        -      //Expand sidebar on hover
        -      $('.main-sidebar').hover(function () {
        -        if ($('body').hasClass('sidebar-mini')
        -                && $("body").hasClass('sidebar-collapse')
        -                && $(window).width() > screenWidth) {
        -          _this.expand();
        -        }
        -      }, function () {
        -        if ($('body').hasClass('sidebar-mini')
        -                && $('body').hasClass('sidebar-expanded-on-hover')
        -                && $(window).width() > screenWidth) {
        -          _this.collapse();
        -        }
        -      });
        -    },
        -    expand: function () {
        -      $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
        -    },
        -    collapse: function () {
        -      if ($('body').hasClass('sidebar-expanded-on-hover')) {
        -        $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
        -      }
        -    }
        -  };
        -
        -  /* Tree()
        -   * ======
        -   * Converts the sidebar into a multilevel
        -   * tree view menu.
        -   *
        -   * @type Function
        -   * @Usage: $.AdminLTE.tree('.sidebar')
        -   */
        -  $.AdminLTE.tree = function (menu) {
        -    var _this = this;
        -    var animationSpeed = $.AdminLTE.options.animationSpeed;
        -    $(document).on('click', menu + ' li a', function (e) {
        -      //Get the clicked link and the next element
        -      var $this = $(this);
        -      var checkElement = $this.next();
        -
        -      //Check if the next element is a menu and is visible
        -      if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {
        -        //Close the menu
        -        checkElement.slideUp(animationSpeed, function () {
        -          checkElement.removeClass('menu-open');
        -          //Fix the layout in case the sidebar stretches over the height of the window
        -          //_this.layout.fix();
        -        });
        -        checkElement.parent("li").removeClass("active");
        -      }
        -      //If the menu is not visible
        -      else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
        -        //Get the parent menu
        -        var parent = $this.parents('ul').first();
        -        //Close all open menus within the parent
        -        var ul = parent.find('ul:visible').slideUp(animationSpeed);
        -        //Remove the menu-open class from the parent
        -        ul.removeClass('menu-open');
        -        //Get the parent li
        -        var parent_li = $this.parent("li");
        -
        -        //Open the target menu and add the menu-open class
        -        checkElement.slideDown(animationSpeed, function () {
        -          //Add the class active to the parent li
        -          checkElement.addClass('menu-open');
        -          parent.find('li.active').removeClass('active');
        -          parent_li.addClass('active');
        -          //Fix the layout in case the sidebar stretches over the height of the window
        -          _this.layout.fix();
        -        });
        -      }
        -      //if this isn't a link, prevent the page from being redirected
        -      if (checkElement.is('.treeview-menu')) {
        -        e.preventDefault();
        -      }
        -    });
        -  };
        -
        -  /* ControlSidebar
        -   * ==============
        -   * Adds functionality to the right sidebar
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.controlSidebar.activate(options)
        -   */
        -  $.AdminLTE.controlSidebar = {
        -    //instantiate the object
        -    activate: function () {
        -      //Get the object
        -      var _this = this;
        -      //Update options
        -      var o = $.AdminLTE.options.controlSidebarOptions;
        -      //Get the sidebar
        -      var sidebar = $(o.selector);
        -      //The toggle button
        -      var btn = $(o.toggleBtnSelector);
        -
        -      //Listen to the click event
        -      btn.on('click', function (e) {
        -        e.preventDefault();
        -        //If the sidebar is not open
        -        if (!sidebar.hasClass('control-sidebar-open')
        -                && !$('body').hasClass('control-sidebar-open')) {
        -          //Open the sidebar
        -          _this.open(sidebar, o.slide);
        -        } else {
        -          _this.close(sidebar, o.slide);
        -        }
        -      });
        -
        -      //If the body has a boxed layout, fix the sidebar bg position
        -      var bg = $(".control-sidebar-bg");
        -      _this._fix(bg);
        -
        -      //If the body has a fixed layout, make the control sidebar fixed
        -      if ($('body').hasClass('fixed')) {
        -        _this._fixForFixed(sidebar);
        -      } else {
        -        //If the content height is less than the sidebar's height, force max height
        -        if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
        -          _this._fixForContent(sidebar);
        -        }
        -      }
        -    },
        -    //Open the control sidebar
        -    open: function (sidebar, slide) {
        -      //Slide over content
        -      if (slide) {
        -        sidebar.addClass('control-sidebar-open');
        -      } else {
        -        //Push the content by adding the open class to the body instead
        -        //of the sidebar itself
        -        $('body').addClass('control-sidebar-open');
        -      }
        -    },
        -    //Close the control sidebar
        -    close: function (sidebar, slide) {
        -      if (slide) {
        -        sidebar.removeClass('control-sidebar-open');
        -      } else {
        -        $('body').removeClass('control-sidebar-open');
        -      }
        -    },
        -    _fix: function (sidebar) {
        -      var _this = this;
        -      if ($("body").hasClass('layout-boxed')) {
        -        sidebar.css('position', 'absolute');
        -        sidebar.height($(".wrapper").height());
        -        $(window).resize(function () {
        -          _this._fix(sidebar);
        -        });
        -      } else {
        -        sidebar.css({
        -          'position': 'fixed',
        -          'height': 'auto'
        -        });
        -      }
        -    },
        -    _fixForFixed: function (sidebar) {
        -      sidebar.css({
        -        'position': 'fixed',
        -        'max-height': '100%',
        -        'overflow': 'auto',
        -        'padding-bottom': '50px'
        -      });
        -    },
        -    _fixForContent: function (sidebar) {
        -      $(".content-wrapper, .right-side").css('min-height', sidebar.height());
        -    }
        -  };
        -
        -  /* BoxWidget
        -   * =========
        -   * BoxWidget is a plugin to handle collapsing and
        -   * removing boxes from the screen.
        -   *
        -   * @type Object
        -   * @usage $.AdminLTE.boxWidget.activate()
        -   *        Set all your options in the main $.AdminLTE.options object
        -   */
        -  $.AdminLTE.boxWidget = {
        -    selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
        -    icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
        -    animationSpeed: $.AdminLTE.options.animationSpeed,
        -    activate: function (_box) {
        -      var _this = this;
        -      if (!_box) {
        -        _box = document; // activate all boxes per default
        -      }
        -      //Listen for collapse event triggers
        -      $(_box).on('click', _this.selectors.collapse, function (e) {
        -        e.preventDefault();
        -        _this.collapse($(this));
        -      });
        -
        -      //Listen for remove event triggers
        -      $(_box).on('click', _this.selectors.remove, function (e) {
        -        e.preventDefault();
        -        _this.remove($(this));
        -      });
        -    },
        -    collapse: function (element) {
        -      var _this = this;
        -      //Find the box parent
        -      var box = element.parents(".box").first();
        -      //Find the body and the footer
        -      var box_content = box.find("> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer");
        -      if (!box.hasClass("collapsed-box")) {
        -        //Convert minus into plus
        -        element.children(":first")
        -                .removeClass(_this.icons.collapse)
        -                .addClass(_this.icons.open);
        -        //Hide the content
        -        box_content.slideUp(_this.animationSpeed, function () {
        -          box.addClass("collapsed-box");
        -        });
        -      } else {
        -        //Convert plus into minus
        -        element.children(":first")
        -                .removeClass(_this.icons.open)
        -                .addClass(_this.icons.collapse);
        -        //Show the content
        -        box_content.slideDown(_this.animationSpeed, function () {
        -          box.removeClass("collapsed-box");
        -        });
        -      }
        -    },
        -    remove: function (element) {
        -      //Find the box parent
        -      var box = element.parents(".box").first();
        -      box.slideUp(this.animationSpeed);
        -    }
        -  };
        -}
        -
        -/* ------------------
        - * - Custom Plugins -
        - * ------------------
        - * All custom plugins are defined below.
        - */
        -
        -/*
        - * BOX REFRESH BUTTON
        - * ------------------
        - * This is a custom plugin to use with the component BOX. It allows you to add
        - * a refresh button to the box. It converts the box's state to a loading state.
        - *
        - * @type plugin
        - * @usage $("#box-widget").boxRefresh( options );
        - */
        -(function ($) {
        -
        -  "use strict";
        -
        -  $.fn.boxRefresh = function (options) {
        -
        -    // Render options
        -    var settings = $.extend({
        -      //Refresh button selector
        -      trigger: ".refresh-btn",
        -      //File source to be loaded (e.g: ajax/src.php)
        -      source: "",
        -      //Callbacks
        -      onLoadStart: function (box) {
        -        return box;
        -      }, //Right after the button has been clicked
        -      onLoadDone: function (box) {
        -        return box;
        -      } //When the source has been loaded
        -
        -    }, options);
        -
        -    //The overlay
        -    var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
        -
        -    return this.each(function () {
        -      //if a source is specified
        -      if (settings.source === "") {
        -        if (window.console) {
        -          window.console.log("Please specify a source first - boxRefresh()");
        -        }
        -        return;
        -      }
        -      //the box
        -      var box = $(this);
        -      //the button
        -      var rBtn = box.find(settings.trigger).first();
        -
        -      //On trigger click
        -      rBtn.on('click', function (e) {
        -        e.preventDefault();
        -        //Add loading overlay
        -        start(box);
        -
        -        //Perform ajax call
        -        box.find(".box-body").load(settings.source, function () {
        -          done(box);
        -        });
        -      });
        -    });
        -
        -    function start(box) {
        -      //Add overlay and loading img
        -      box.append(overlay);
        -
        -      settings.onLoadStart.call(box);
        -    }
        -
        -    function done(box) {
        -      //Remove overlay and loading img
        -      box.find(overlay).remove();
        -
        -      settings.onLoadDone.call(box);
        -    }
        -
        -  };
        -
        -})(jQuery);
        -
        -/*
        - * EXPLICIT BOX ACTIVATION
        - * -----------------------
        - * This is a custom plugin to use with the component BOX. It allows you to activate
        - * a box inserted in the DOM after the app.js was loaded.
        - *
        - * @type plugin
        - * @usage $("#box-widget").activateBox();
        - */
        -(function ($) {
        -
        -  'use strict';
        -
        -  $.fn.activateBox = function () {
        -    $.AdminLTE.boxWidget.activate(this);
        -  };
        -
        -})(jQuery);
        -
        -/*
        - * TODO LIST CUSTOM PLUGIN
        - * -----------------------
        - * This plugin depends on iCheck plugin for checkbox and radio inputs
        - *
        - * @type plugin
        - * @usage $("#todo-widget").todolist( options );
        - */
        -(function ($) {
        -
        -  'use strict';
        -
        -  $.fn.todolist = function (options) {
        -    // Render options
        -    var settings = $.extend({
        -      //When the user checks the input
        -      onCheck: function (ele) {
        -        return ele;
        -      },
        -      //When the user unchecks the input
        -      onUncheck: function (ele) {
        -        return ele;
        -      }
        -    }, options);
        -
        -    return this.each(function () {
        -
        -      if (typeof $.fn.iCheck != 'undefined') {
        -        $('input', this).on('ifChecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onCheck.call(ele);
        -        });
        -
        -        $('input', this).on('ifUnchecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onUncheck.call(ele);
        -        });
        -      } else {
        -        $('input', this).on('change', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          if ($('input', ele).is(":checked")) {
        -            settings.onCheck.call(ele);
        -          } else {
        -            settings.onUncheck.call(ele);
        -          }
        -        });
        -      }
        -    });
        -  };
        -}(jQuery));
        -
        -//-------------
        -//- PIE CHART -
        -//-------------
        -// Get context with jQuery - using jQuery's .get() method.
        -
        -
        -
        -
        -//# sourceMappingURL=all.js.map
        diff --git a/public/build/assets/js/all.js.map b/public/build/assets/js/all.js.map
        deleted file mode 100644
        index 4fd717d172..0000000000
        --- a/public/build/assets/js/all.js.map
        +++ /dev/null
        @@ -1 +0,0 @@
        -{"version":3,"sources":["jQuery-2.1.4.min.js","jquery-ui.js","jquery.ui.widget.js","jquery.iframe-transport.js","jquery.fileupload.js","bootstrap.js","fastclick.js","jquery.slimscroll.js","select2.full.min.js","bootstrap-colorpicker.js","bootstrap-table.js","bootstrap-datepicker.js","select2.js","icheck.js","ekko-lightbox.js","snipeit.js","app.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxugBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3zEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACz0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1eA;AACA;AACA;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACr7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACloFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvoDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3xKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"all.js","sourcesContent":["/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */\n!function(a,b){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error(\"jQuery requires a window with a document\");return b(a)}:b(a)}(\"undefined\"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m=\"2.1.4\",n=function(a,b){return new n.fn.init(a,b)},o=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,p=/^-ms-/,q=/-([\\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:\"\",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for(\"boolean\"==typeof g&&(j=g,g=arguments[h]||{},h++),\"object\"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:\"jQuery\"+(m+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return\"function\"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return\"object\"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,\"isPrototypeOf\")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?h[i.call(a)]||\"object\":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf(\"use strict\")?(b=l.createElement(\"script\"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,\"ms-\").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?\"\":(a+\"\").replace(o,\"\")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,\"string\"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return\"string\"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(a,b){h[\"[object \"+b+\"]\"]=b.toLowerCase()});function s(a){var b=\"length\"in a&&a.length,c=n.type(a);return\"function\"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===c||0===b||\"number\"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=\"sizzle\"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",L=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",M=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",N=M.replace(\"w\",\"w#\"),O=\"\\\\[\"+L+\"*(\"+M+\")(?:\"+L+\"*([*^$|!~]?=)\"+L+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+N+\"))|)\"+L+\"*\\\\]\",P=\":(\"+M+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+O+\")*)|.*)\\\\)|)\",Q=new RegExp(L+\"+\",\"g\"),R=new RegExp(\"^\"+L+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+L+\"+$\",\"g\"),S=new RegExp(\"^\"+L+\"*,\"+L+\"*\"),T=new RegExp(\"^\"+L+\"*([>+~]|\"+L+\")\"+L+\"*\"),U=new RegExp(\"=\"+L+\"*([^\\\\]'\\\"]*?)\"+L+\"*\\\\]\",\"g\"),V=new RegExp(P),W=new RegExp(\"^\"+N+\"$\"),X={ID:new RegExp(\"^#(\"+M+\")\"),CLASS:new RegExp(\"^\\\\.(\"+M+\")\"),TAG:new RegExp(\"^(\"+M.replace(\"w\",\"w*\")+\")\"),ATTR:new RegExp(\"^\"+O),PSEUDO:new RegExp(\"^\"+P),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+L+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+L+\"*(?:([+-]|)\"+L+\"*(\\\\d+)|))\"+L+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+K+\")$\",\"i\"),needsContext:new RegExp(\"^\"+L+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+L+\"*((?:-\\\\d)?\\\\d*)\"+L+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\\d$/i,$=/^[^{]+\\{\\s*\\[native \\w/,_=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,aa=/[+~]/,ba=/'|\\\\/g,ca=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+L+\"?|(\"+L+\")|.)\",\"ig\"),da=function(a,b,c){var d=\"0x\"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,\"string\"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&\"object\"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute(\"id\"))?s=r.replace(ba,\"\\\\$&\"):b.setAttribute(\"id\",s),s=\"[id='\"+s+\"'] \",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(\",\")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute(\"id\")}}}return i(a.replace(R,\"$1\"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+\" \")>d.cacheLength&&delete b[a.shift()],b[c+\" \"]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement(\"div\");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split(\"|\"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return\"input\"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return(\"input\"===c||\"button\"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&\"undefined\"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?\"HTML\"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener(\"unload\",ea,!1):e.attachEvent&&e.attachEvent(\"onunload\",ea)),p=!f(g),c.attributes=ja(function(a){return a.className=\"i\",!a.getAttribute(\"className\")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment(\"\")),!a.getElementsByTagName(\"*\").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(\"undefined\"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute(\"id\")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c=\"undefined\"!=typeof a.getAttributeNode&&a.getAttributeNode(\"id\");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return\"undefined\"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if(\"*\"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=\"<a id='\"+u+\"'></a><select id='\"+u+\"-\\f]' msallowcapture=''><option selected=''></option></select>\",a.querySelectorAll(\"[msallowcapture^='']\").length&&q.push(\"[*^$]=\"+L+\"*(?:''|\\\"\\\")\"),a.querySelectorAll(\"[selected]\").length||q.push(\"\\\\[\"+L+\"*(?:value|\"+K+\")\"),a.querySelectorAll(\"[id~=\"+u+\"-]\").length||q.push(\"~=\"),a.querySelectorAll(\":checked\").length||q.push(\":checked\"),a.querySelectorAll(\"a#\"+u+\"+*\").length||q.push(\".#.+[+~]\")}),ja(function(a){var b=g.createElement(\"input\");b.setAttribute(\"type\",\"hidden\"),a.appendChild(b).setAttribute(\"name\",\"D\"),a.querySelectorAll(\"[name=d]\").length&&q.push(\"name\"+L+\"*[*^$|!~]?=\"),a.querySelectorAll(\":enabled\").length||q.push(\":enabled\",\":disabled\"),a.querySelectorAll(\"*,:x\"),q.push(\",.*:\")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,\"div\"),s.call(a,\"[s!='']:x\"),r.push(\"!=\",P)}),q=q.length&&new RegExp(q.join(\"|\")),r=r.length&&new RegExp(r.join(\"|\")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,\"='$1']\"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c=\"\",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if(\"string\"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||\"\").replace(ca,da),\"~=\"===a[2]&&(a[3]=\" \"+a[3]+\" \"),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),\"nth\"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*(\"even\"===a[3]||\"odd\"===a[3])),a[5]=+(a[7]+a[8]||\"odd\"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||\"\":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(\")\",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return\"*\"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+\" \"];return b||(b=new RegExp(\"(^|\"+L+\")\"+a+\"(\"+L+\"|$)\"))&&y(a,function(a){return b.test(\"string\"==typeof a.className&&a.className||\"undefined\"!=typeof a.getAttribute&&a.getAttribute(\"class\")||\"\")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?\"!=\"===b:b?(e+=\"\",\"=\"===b?e===c:\"!=\"===b?e!==c:\"^=\"===b?c&&0===e.indexOf(c):\"*=\"===b?c&&e.indexOf(c)>-1:\"$=\"===b?c&&e.slice(-c.length)===c:\"~=\"===b?(\" \"+e.replace(Q,\" \")+\" \").indexOf(c)>-1:\"|=\"===b?e===c||e.slice(0,c.length+1)===c+\"-\":!1):!0}},CHILD:function(a,b,c,d,e){var f=\"nth\"!==a.slice(0,3),g=\"last\"!==a.slice(-4),h=\"of-type\"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?\"nextSibling\":\"previousSibling\",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p=\"only\"===a&&!o&&\"nextSibling\"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error(\"unsupported pseudo: \"+a);return e[u]?e(b):e.length>1?(c=[a,a,\"\",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,\"$1\"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||\"\")||ga.error(\"unsupported lang: \"+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute(\"xml:lang\")||b.getAttribute(\"lang\"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+\"-\");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&!!a.checked||\"option\"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&\"button\"===a.type||\"button\"===b},text:function(a){var b;return\"input\"===a.nodeName.toLowerCase()&&\"text\"===a.type&&(null==(b=a.getAttribute(\"type\"))||\"text\"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+\" \"];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R,\" \")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d=\"\";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&\"parentNode\"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||\"*\",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[\" \"],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:\" \"===a[i-2].type?\"*\":\"\"})).replace(R,\"$1\"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q=\"0\",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG(\"*\",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+\" \"];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n=\"function\"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&\"ID\"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split(\"\").sort(B).join(\"\")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement(\"div\"))}),ja(function(a){return a.innerHTML=\"<a href='#'></a>\",\"#\"===a.firstChild.getAttribute(\"href\")})||ka(\"type|href|height|width\",function(a,b,c){return c?void 0:a.getAttribute(b,\"type\"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=\"<input/>\",a.firstChild.setAttribute(\"value\",\"\"),\"\"===a.firstChild.getAttribute(\"value\")})||ka(\"value\",function(a,b,c){return c||\"input\"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute(\"disabled\")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[\":\"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,w=/^.[^:#\\[\\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if(\"string\"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=\":not(\"+a+\")\"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if(\"string\"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+\" \"+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,\"string\"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if(\"string\"==typeof a){if(c=\"<\"===a[0]&&\">\"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?\"undefined\"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||\"string\"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?\"string\"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return n.dir(a,\"parentNode\",c)},next:function(a){return D(a,\"nextSibling\")},prev:function(a){return D(a,\"previousSibling\")},nextAll:function(a){return n.dir(a,\"nextSibling\")},prevAll:function(a){return n.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return n.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return n.dir(a,\"previousSibling\",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return\"Until\"!==a.slice(-5)&&(d=c),d&&\"string\"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a=\"string\"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);\"function\"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&\"string\"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[[\"resolve\",\"done\",n.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",n.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",n.Callbacks(\"memory\")]],c=\"pending\",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+\"With\"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+\"With\"](this===e?d:this,arguments),this},e[f[0]+\"With\"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler(\"ready\"),n(l).off(\"ready\"))))}});function I(){l.removeEventListener(\"DOMContentLoaded\",I,!1),a.removeEventListener(\"load\",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),\"complete\"===l.readyState?setTimeout(n.ready):(l.addEventListener(\"DOMContentLoaded\",I,!1),a.addEventListener(\"load\",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if(\"object\"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if(\"string\"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&\"string\"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d=\"data-\"+b.replace(O,\"-$1\").toLowerCase(),c=a.getAttribute(d),\"string\"==typeof c){try{c=\"true\"===c?!0:\"false\"===c?!1:\"null\"===c?null:+c+\"\"===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){\nreturn M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,\"hasDataAttrs\"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf(\"data-\")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,\"hasDataAttrs\",!0)}return e}return\"object\"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf(\"-\")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||\"fx\")+\"queue\",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||\"fx\";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};\"inprogress\"===e&&(e=c.shift(),d--),e&&(\"fx\"===b&&c.unshift(\"inprogress\"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+\"queueHooks\";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks(\"once memory\").add(function(){L.remove(a,[b+\"queue\",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return\"string\"!=typeof a&&(b=a,a=\"fx\",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),\"fx\"===a&&\"inprogress\"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};\"string\"!=typeof a&&(b=a,a=void 0),a=a||\"fx\";while(g--)c=L.get(f[g],a+\"queueHooks\"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,R=[\"Top\",\"Right\",\"Bottom\",\"Left\"],S=function(a,b){return a=b||a,\"none\"===n.css(a,\"display\")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement(\"div\")),c=l.createElement(\"input\");c.setAttribute(\"type\",\"radio\"),c.setAttribute(\"checked\",\"checked\"),c.setAttribute(\"name\",\"t\"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML=\"<textarea>x</textarea>\",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U=\"undefined\";k.focusinBubbles=\"onfocusin\"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(\".\")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp(\"(^|\\\\.)\"+p.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&(\"**\"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,\"events\"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,\"type\")?b.type:b,r=j.call(b,\"namespace\")?b.namespace.split(\".\"):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(\".\")>=0&&(r=q.split(\".\"),q=r.shift(),r.sort()),k=q.indexOf(\":\")<0&&\"on\"+q,b=b[n.expando]?b:new n.Event(q,\"object\"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join(\".\"),b.namespace_re=b.namespace?new RegExp(\"(^|\\\\.)\"+r.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,\"events\")||{})[b.type]&&L.get(g,\"handle\"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,\"events\")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||\"click\"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||\"click\"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+\" \",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:\"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:\"focusin\"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:\"focusout\"},click:{trigger:function(){return\"checkbox\"===this.type&&this.click&&n.nodeName(this,\"input\")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,\"a\")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if(\"object\"==typeof a){\"string\"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&(\"string\"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+\".\"+d.namespace:d.origType,d.selector,d.handler),this;if(\"object\"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||\"function\"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,ba=/<([\\w:]+)/,ca=/<|&#?\\w+;/,da=/<(?:script|style|link)/i,ea=/checked\\s*(?:[^=]|=\\s*.checked.)/i,fa=/^$|\\/(?:java|ecma)script/i,ga=/^true\\/(.*)/,ha=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,ia={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,\"table\")&&n.nodeName(11!==b.nodeType?b:b.firstChild,\"tr\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function ka(a){return a.type=(null!==a.getAttribute(\"type\"))+\"/\"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute(\"type\"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],\"globalEval\",!b||L.get(b[c],\"globalEval\"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||\"*\"):a.querySelectorAll?a.querySelectorAll(b||\"*\"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();\"input\"===c&&T.test(a.type)?b.checked=a.checked:(\"input\"===c||\"textarea\"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,\"script\"),g.length>0&&ma(g,!i&&oa(a,\"script\")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if(\"object\"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement(\"div\")),g=(ba.exec(e)||[\"\",\"\"])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,\"<$1></$2>\")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=\"\"}else l.push(b.createTextNode(e));k.textContent=\"\",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),\"script\"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||\"\")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,\"script\")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent=\"\");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if(\"string\"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(aa,\"<$1></$2>\");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&\"string\"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,\"script\"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,\"script\"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||\"\")&&!L.access(h,\"globalEval\")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,\"\")))}return this}}),n.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],\"display\");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),\"none\"!==c&&c||(qa=(qa||n(\"<iframe frameborder='0' width='0' height='0'/>\")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp(\"^(\"+Q+\")(?!px)[a-z%]+$\",\"i\"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(\"\"!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+\"\":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement(\"div\"),f=l.createElement(\"div\");if(f.style){f.style.backgroundClip=\"content-box\",f.cloneNode(!0).style.backgroundClip=\"\",k.clearCloneStyle=\"content-box\"===f.style.backgroundClip,e.style.cssText=\"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute\",e.appendChild(f);function g(){f.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute\",f.innerHTML=\"\",d.appendChild(e);var g=a.getComputedStyle(f,null);b=\"1%\"!==g.top,c=\"4px\"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement(\"div\"));return c.style.cssText=f.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0\",c.style.marginRight=c.style.width=\"0\",f.style.width=\"1px\",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp(\"^(\"+Q+\")(.*)$\",\"i\"),Ba=new RegExp(\"^([+-])=(\"+Q+\")\",\"i\"),Ca={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Da={letterSpacing:\"0\",fontWeight:\"400\"},Ea=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||\"px\"):b}function Ha(a,b,c,d,e){for(var f=c===(d?\"border\":\"content\")?4:\"width\"===b?1:0,g=0;4>f;f+=2)\"margin\"===c&&(g+=n.css(a,c+R[f],!0,e)),d?(\"content\"===c&&(g-=n.css(a,\"padding\"+R[f],!0,e)),\"margin\"!==c&&(g-=n.css(a,\"border\"+R[f]+\"Width\",!0,e))):(g+=n.css(a,\"padding\"+R[f],!0,e),\"padding\"!==c&&(g+=n.css(a,\"border\"+R[f]+\"Width\",!0,e)));return g}function Ia(a,b,c){var d=!0,e=\"width\"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g=\"border-box\"===n.css(a,\"boxSizing\",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?\"border\":\"content\"),d,f)+\"px\"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,\"olddisplay\"),c=d.style.display,b?(f[g]||\"none\"!==c||(d.style.display=\"\"),\"\"===d.style.display&&S(d)&&(f[g]=L.access(d,\"olddisplay\",ta(d.nodeName)))):(e=S(d),\"none\"===c&&e||L.set(d,\"olddisplay\",e?c:n.css(d,\"display\"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&\"none\"!==d.style.display&&\"\"!==d.style.display||(d.style.display=b?f[g]||\"\":\"none\"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,\"opacity\");return\"\"===c?\"1\":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":\"cssFloat\"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&\"get\"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,\"string\"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f=\"number\"),null!=c&&c===c&&(\"number\"!==f||n.cssNumber[h]||(c+=\"px\"),k.clearCloneStyle||\"\"!==c||0!==b.indexOf(\"background\")||(i[b]=\"inherit\"),g&&\"set\"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&\"get\"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),\"normal\"===e&&b in Da&&(e=Da[b]),\"\"===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each([\"height\",\"width\"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,\"display\"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,\"border-box\"===n.css(a,\"boxSizing\",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:\"inline-block\"},xa,[a,\"marginRight\"]):void 0}),n.each({margin:\"\",padding:\"\",border:\"Width\"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f=\"string\"==typeof c?c.split(\" \"):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return\"boolean\"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||\"swing\",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?\"\":\"px\")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,\"\"),b&&\"auto\"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp(\"^(?:([+-])=|)(\"+Q+\")([a-z%]*)$\",\"i\"),Pa=/queueHooks$/,Qa=[Va],Ra={\"*\":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?\"\":\"px\"),g=(n.cssNumber[a]||\"px\"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||\".5\",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e[\"margin\"+c]=e[\"padding\"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra[\"*\"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,\"fxshow\");c.queue||(h=n._queueHooks(a,\"fx\"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,\"fx\").length||h.empty.fire()})})),1===a.nodeType&&(\"height\"in b||\"width\"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,\"display\"),k=\"none\"===j?L.get(a,\"olddisplay\")||ta(a.nodeName):j,\"inline\"===k&&\"none\"===n.css(a,\"float\")&&(o.display=\"inline-block\")),c.overflow&&(o.overflow=\"hidden\",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||\"toggle\"===e,e===(p?\"hide\":\"show\")){if(\"show\"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))\"inline\"===(\"none\"===j?ta(a.nodeName):j)&&(o.display=j);else{q?\"hidden\"in q&&(p=q.hidden):q=L.access(a,\"fxshow\",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,\"fxshow\");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start=\"width\"===d||\"height\"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&\"expand\"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=[\"*\"]):a=a.split(\" \");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&\"object\"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:\"number\"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue=\"fx\"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,\"finish\"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return\"string\"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||\"fx\",[]),this.each(function(){var b=!0,e=null!=a&&a+\"queueHooks\",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||\"fx\"),this.each(function(){var b,c=L.get(this),d=c[a+\"queue\"],e=c[a+\"queueHooks\"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each([\"toggle\",\"show\",\"hide\"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||\"boolean\"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta(\"show\"),slideUp:Ta(\"hide\"),slideToggle:Ta(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||\"fx\",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement(\"input\"),b=l.createElement(\"select\"),c=b.appendChild(l.createElement(\"option\"));a.type=\"checkbox\",k.checkOn=\"\"!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement(\"input\"),a.value=\"t\",a.type=\"radio\",k.radioValue=\"t\"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),\nvoid 0===c?d&&\"get\"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&\"set\"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+\"\"),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&\"radio\"===b&&n.nodeName(a,\"input\")){var c=a.value;return a.setAttribute(\"type\",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&\"set\"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&\"get\"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute(\"tabindex\")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\\t\\r\\n\\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=\"string\"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||\"\").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ab,\" \"):\" \")){f=0;while(e=b[f++])d.indexOf(\" \"+e+\" \")<0&&(d+=e+\" \");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||\"string\"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||\"\").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ab,\" \"):\"\")){f=0;while(e=b[f++])while(d.indexOf(\" \"+e+\" \")>=0)d=d.replace(\" \"+e+\" \",\" \");g=a?n.trim(d):\"\",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return\"boolean\"==typeof b&&\"string\"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if(\"string\"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||\"boolean\"===c)&&(this.className&&L.set(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":L.get(this,\"__className__\")||\"\")})},hasClass:function(a){for(var b=\" \"+a+\" \",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(\" \"+this[c].className+\" \").replace(ab,\" \").indexOf(b)>=0)return!0;return!1}});var bb=/\\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e=\"\":\"number\"==typeof e?e+=\"\":n.isArray(e)&&(e=n.map(e,function(a){return null==a?\"\":a+\"\"})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&\"set\"in b&&void 0!==b.set(this,e,\"value\")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&\"get\"in b&&void 0!==(c=b.get(e,\"value\"))?c:(c=e.value,\"string\"==typeof c?c.replace(bb,\"\"):null==c?\"\":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,\"value\");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f=\"select-one\"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute(\"disabled\"))||c.parentNode.disabled&&n.nodeName(c.parentNode,\"optgroup\"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each([\"radio\",\"checkbox\"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute(\"value\")?\"on\":a.value})}),n.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,\"**\"):this.off(b,a||\"**\",c)}});var cb=n.now(),db=/\\?/;n.parseJSON=function(a){return JSON.parse(a+\"\")},n.parseXML=function(a){var b,c;if(!a||\"string\"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,\"text/xml\")}catch(d){b=void 0}return(!b||b.getElementsByTagName(\"parsererror\").length)&&n.error(\"Invalid XML: \"+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\\/\\//,kb=/^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,lb={},mb={},nb=\"*/\".concat(\"*\"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){\"string\"!=typeof b&&(c=b,b=\"*\");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])\"+\"===d[0]?(d=d.slice(1)||\"*\",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return\"string\"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e[\"*\"]&&g(\"*\")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while(\"*\"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader(\"Content-Type\"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+\" \"+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if(\"*\"===f)f=i;else if(\"*\"!==i&&i!==f){if(g=j[i+\" \"+f]||j[\"* \"+f],!g)for(e in j)if(h=e.split(\" \"),h[1]===f&&(g=j[i+\" \"+h[0]]||j[\"* \"+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a[\"throws\"])b=g(b);else try{b=g(b)}catch(l){return{state:\"parsererror\",error:g?l:\"No conversion from \"+i+\" to \"+f}}}return{state:\"success\",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:\"GET\",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":nb,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":n.parseJSON,\"text xml\":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){\"object\"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks(\"once memory\"),q=k.statusCode||{},r={},s={},t=0,u=\"canceled\",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+\"\").replace(eb,\"\").replace(jb,pb[1]+\"//\"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||\"*\").toLowerCase().match(E)||[\"\"],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||(\"http:\"===h[1]?\"80\":\"443\"))===(pb[3]||(\"http:\"===pb[1]?\"80\":\"443\")))),k.data&&k.processData&&\"string\"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger(\"ajaxStart\"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?\"&\":\"?\")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,\"$1_=\"+cb++):d+(db.test(d)?\"&\":\"?\")+\"_=\"+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader(\"If-Modified-Since\",n.lastModified[d]),n.etag[d]&&v.setRequestHeader(\"If-None-Match\",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader(\"Content-Type\",k.contentType),v.setRequestHeader(\"Accept\",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+(\"*\"!==k.dataTypes[0]?\", \"+nb+\"; q=0.01\":\"\"):k.accepts[\"*\"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u=\"abort\";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger(\"ajaxSend\",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort(\"timeout\")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,\"No Transport\");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||\"\",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader(\"Last-Modified\"),w&&(n.lastModified[d]=w),w=v.getResponseHeader(\"etag\"),w&&(n.etag[d]=w)),204===a||\"HEAD\"===k.type?x=\"nocontent\":304===a?x=\"notmodified\":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x=\"error\",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+\"\",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?\"ajaxSuccess\":\"ajaxError\",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger(\"ajaxComplete\",[v,k]),--n.active||n.event.trigger(\"ajaxStop\")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,\"json\")},getScript:function(a,b){return n.get(a,void 0,b,\"script\")}}),n.each([\"get\",\"post\"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,\"body\")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\\[\\]$/,xb=/\\r?\\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+\"[\"+(\"object\"==typeof e?b:\"\")+\"]\",e,c,d)});else if(c||\"object\"!==n.type(b))d(a,b);else for(e in b)Ab(a+\"[\"+e+\"]\",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?\"\":b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join(\"&\").replace(vb,\"+\")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,\"elements\");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(\":disabled\")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,\"\\r\\n\")}}):{name:b.name,value:c.replace(xb,\"\\r\\n\")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent(\"onunload\",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&\"withCredentials\"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c[\"X-Requested-With\"]||(c[\"X-Requested-With\"]=\"XMLHttpRequest\");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,\"abort\"===a?f.abort():\"error\"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,\"string\"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b(\"error\"),b=Cb[g]=b(\"abort\");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter(\"script\",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\")}),n.ajaxTransport(\"script\",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n(\"<script>\").prop({async:!0,charset:a.scriptCharset,src:a.url}).on(\"load error\",c=function(a){b.remove(),c=null,a&&e(\"error\"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\\?(?=&|$)|\\?\\?/;n.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var a=Fb.pop()||n.expando+\"_\"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?\"url\":\"string\"==typeof b.data&&!(b.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Gb.test(b.data)&&\"data\");return h||\"jsonp\"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,\"$1\"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?\"&\":\"?\")+b.jsonp+\"=\"+e),b.converters[\"script json\"]=function(){return g||n.error(e+\" was not called\"),g[0]},b.dataTypes[0]=\"json\",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),\"script\"):void 0}),n.parseHTML=function(a,b,c){if(!a||\"string\"!=typeof a)return null;\"boolean\"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if(\"string\"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(\" \");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&\"object\"==typeof b&&(e=\"POST\"),g.length>0&&n.ajax({url:a,type:e,dataType:\"html\",data:b}).done(function(a){f=arguments,g.html(d?n(\"<div>\").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,\"position\"),l=n(a),m={};\"static\"===k&&(a.style.position=\"relative\"),h=l.offset(),f=n.css(a,\"top\"),i=n.css(a,\"left\"),j=(\"absolute\"===k||\"fixed\"===k)&&(f+i).indexOf(\"auto\")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),\"using\"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return\"fixed\"===n.css(c,\"position\")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],\"html\")||(d=a.offset()),d.top+=n.css(a[0],\"borderTopWidth\",!0),d.left+=n.css(a[0],\"borderLeftWidth\",!0)),{top:b.top-d.top-n.css(c,\"marginTop\",!0),left:b.left-d.left-n.css(c,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,\"html\")&&\"static\"===n.css(a,\"position\"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(b,c){var d=\"pageYOffset\"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each([\"top\",\"left\"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+\"px\":c):void 0})}),n.each({Height:\"height\",Width:\"width\"},function(a,b){n.each({padding:\"inner\"+a,content:b,\"\":\"outer\"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||\"boolean\"!=typeof d),g=c||(d===!0||e===!0?\"margin\":\"border\");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement[\"client\"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body[\"scroll\"+a],e[\"scroll\"+a],b.body[\"offset\"+a],e[\"offset\"+a],e[\"client\"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});\n","/*! jQuery UI - v1.11.4 - 2015-03-11\n* http://jqueryui.com\n* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js\n* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */\n\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n/*!\n * jQuery UI Core 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n\n\n// $.ui might exist from components with no dependencies, e.g., $.ui.position\n$.ui = $.ui || {};\n\n$.extend( $.ui, {\n\tversion: \"1.11.4\",\n\n\tkeyCode: {\n\t\tBACKSPACE: 8,\n\t\tCOMMA: 188,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tLEFT: 37,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38\n\t}\n});\n\n// plugins\n$.fn.extend({\n\tscrollParent: function( includeHidden ) {\n\t\tvar position = this.css( \"position\" ),\n\t\t\texcludeStaticParent = position === \"absolute\",\n\t\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\t\tscrollParent = this.parents().filter( function() {\n\t\t\t\tvar parent = $( this );\n\t\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) + parent.css( \"overflow-x\" ) );\n\t\t\t}).eq( 0 );\n\n\t\treturn position === \"fixed\" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;\n\t},\n\n\tuniqueId: (function() {\n\t\tvar uuid = 0;\n\n\t\treturn function() {\n\t\t\treturn this.each(function() {\n\t\t\t\tif ( !this.id ) {\n\t\t\t\t\tthis.id = \"ui-id-\" + ( ++uuid );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t})(),\n\n\tremoveUniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( /^ui-id-\\d+$/.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar map, mapName, img,\n\t\tnodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap='#\" + mapName + \"']\" )[ 0 ];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?\n\t\t!element.disabled :\n\t\t\"a\" === nodeName ?\n\t\t\telement.href || isTabIndexNotNaN :\n\t\t\tisTabIndexNotNaN) &&\n\t\t// the element and all of its ancestors must be visible\n\t\tvisible( element );\n}\n\nfunction visible( element ) {\n\treturn $.expr.filters.visible( element ) &&\n\t\t!$( element ).parents().addBack().filter(function() {\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\n\t\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo(function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t}) :\n\t\t// support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n// support: jQuery <1.8\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t});\n\t\t};\n\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t});\n\t\t};\n\t});\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\n\t$.fn.removeData = (function( removeData ) {\n\t\treturn function( key ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\n\t\t\t} else {\n\t\t\t\treturn removeData.call( this );\n\t\t\t}\n\t\t};\n\t})( $.fn.removeData );\n}\n\n// deprecated\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n$.fn.extend({\n\tfocus: (function( orig ) {\n\t\treturn function( delay, fn ) {\n\t\t\treturn typeof delay === \"number\" ?\n\t\t\t\tthis.each(function() {\n\t\t\t\t\tvar elem = this;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay );\n\t\t\t\t}) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.focus ),\n\n\tdisableSelection: (function() {\n\t\tvar eventType = \"onselectstart\" in document.createElement( \"div\" ) ?\n\t\t\t\"selectstart\" :\n\t\t\t\"mousedown\";\n\n\t\treturn function() {\n\t\t\treturn this.bind( eventType + \".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t\t};\n\t})(),\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n});\n\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\n$.ui.plugin = {\n\tadd: function( module, option, set ) {\n\t\tvar i,\n\t\t\tproto = $.ui[ module ].prototype;\n\t\tfor ( i in set ) {\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t}\n\t},\n\tcall: function( instance, name, args, allowDisconnected ) {\n\t\tvar i,\n\t\t\tset = instance.plugins[ name ];\n\n\t\tif ( !set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n/*!\n * jQuery UI Widget 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n\n\nvar widget_uuid = 0,\n\twidget_slice = Array.prototype.slice;\n\n$.cleanData = (function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; (elem = elems[i]) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n})( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widget_slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = widget_slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\treturnValue = instance;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat(args) );\n\t\t\t}\n\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widget_uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled\", !!value );\n\n\t\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\t\tif ( value ) {\n\t\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions({ disabled: false });\n\t},\n\tdisable: function() {\n\t\treturn this._setOptions({ disabled: true });\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\nvar widget = $.widget;\n\n\n/*!\n * jQuery UI Mouse 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/mouse/\n */\n\n\nvar mouseHandled = false;\n$( document ).mouseup( function() {\n\tmouseHandled = false;\n});\n\nvar mouse = $.widget(\"ui.mouse\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tcancel: \"input,textarea,button,select,option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.bind(\"mousedown.\" + this.widgetName, function(event) {\n\t\t\t\treturn that._mouseDown(event);\n\t\t\t})\n\t\t\t.bind(\"click.\" + this.widgetName, function(event) {\n\t\t\t\tif (true === $.data(event.target, that.widgetName + \".preventClickEvent\")) {\n\t\t\t\t\t$.removeData(event.target, that.widgetName + \".preventClickEvent\");\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.unbind(\".\" + this.widgetName);\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.unbind(\"mousemove.\" + this.widgetName, this._mouseMoveDelegate)\n\t\t\t\t.unbind(\"mouseup.\" + this.widgetName, this._mouseUpDelegate);\n\t\t}\n\t},\n\n\t_mouseDown: function(event) {\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// we may have missed mouseup (out of window)\n\t\t(this._mouseStarted && this._mouseUp(event));\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = (event.which === 1),\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = (typeof this.options.cancel === \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif (!this.mouseDelayMet) {\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay);\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\n\t\t\tif (!this._mouseStarted) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif (true === $.data(event.target, this.widgetName + \".preventClickEvent\")) {\n\t\t\t$.removeData(event.target, this.widgetName + \".preventClickEvent\");\n\t\t}\n\n\t\t// these delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function(event) {\n\t\t\treturn that._mouseMove(event);\n\t\t};\n\t\tthis._mouseUpDelegate = function(event) {\n\t\t\treturn that._mouseUp(event);\n\t\t};\n\n\t\tthis.document\n\t\t\t.bind( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.bind( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function(event) {\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\n\t\t// Support: IE <9\n\t\tif ( this._mouseMoved ) {\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\t\tif ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {\n\t\t\t\treturn this._mouseUp(event);\n\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\n\t\t\t} else if ( !event.which ) {\n\t\t\t\treturn this._mouseUp( event );\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseDrag(event);\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function(event) {\n\t\tthis.document\n\t\t\t.unbind( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.unbind( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif (event.target === this._mouseDownEvent.target) {\n\t\t\t\t$.data(event.target, this.widgetName + \".preventClickEvent\", true);\n\t\t\t}\n\n\t\t\tthis._mouseStop(event);\n\t\t}\n\n\t\tmouseHandled = false;\n\t\treturn false;\n\t},\n\n\t_mouseDistanceMet: function(event) {\n\t\treturn (Math.max(\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function(/* event */) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function(/* event */) {},\n\t_mouseDrag: function(/* event */) {},\n\t_mouseStop: function(/* event */) {},\n\t_mouseCapture: function(/* event */) { return true; }\n});\n\n\n/*!\n * jQuery UI Position 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n\n(function() {\n\n$.ui = $.ui || {};\n\nvar cachedScrollbarWidth, supportsOffsetFractions,\n\tmax = Math.max,\n\tabs = Math.abs,\n\tround = Math.round,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[0];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[0];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[0].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn (cachedScrollbarWidth = w1 - w2);\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[0].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[0].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[0] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: withinElement.offset() || { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\n\t\t\t// support: jQuery 1.6.x\n\t\t\t// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows\n\t\t\twidth: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),\n\t\t\theight: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[0].preventDefault ) {\n\t\t// force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\t// clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t});\n\n\t// normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each(function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) + scrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) + scrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\t// if the browser doesn't support fractions, then round for consistent results\n\t\tif ( !supportsOffsetFractions ) {\n\t\t\tposition.left = round( position.left );\n\t\t\tposition.top = round( position.top );\n\t\t}\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem: elem\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif ( options.using ) {\n\t\t\t// adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t});\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\t\t\t\t// element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\t\t\t\t// element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t// element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\t\t\t// too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\t\t\t\t// element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\t\t\t\t// element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t// element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\t\t\t// too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\tif ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;\n\t\t\t\tif ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n// fraction support test\n(function() {\n\tvar testElement, testElementParent, testElementStyle, offsetLeft, i,\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ],\n\t\tdiv = document.createElement( \"div\" );\n\n\t//Create a \"fake body\" for testing based on method used in jQuery.support\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\n\ttestElementStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\tbackground: \"none\"\n\t};\n\tif ( body ) {\n\t\t$.extend( testElementStyle, {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"-1000px\",\n\t\t\ttop: \"-1000px\"\n\t\t});\n\t}\n\tfor ( i in testElementStyle ) {\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\n\t}\n\ttestElement.appendChild( div );\n\ttestElementParent = body || document.documentElement;\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\n\n\tdiv.style.cssText = \"position: absolute; left: 10.7432222px;\";\n\n\toffsetLeft = $( div ).offset().left;\n\tsupportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;\n\n\ttestElement.innerHTML = \"\";\n\ttestElementParent.removeChild( testElement );\n})();\n\n})();\n\nvar position = $.ui.position;\n\n\n/*!\n * jQuery UI Accordion 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/accordion/\n */\n\n\nvar accordion = $.widget( \"ui.accordion\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tactive: 0,\n\t\tanimate: {},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theader: \"> li > :first-child,> :not(li):even\",\n\t\theightStyle: \"auto\",\n\t\ticons: {\n\t\t\tactiveHeader: \"ui-icon-triangle-1-s\",\n\t\t\theader: \"ui-icon-triangle-1-e\"\n\t\t},\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null\n\t},\n\n\thideProps: {\n\t\tborderTopWidth: \"hide\",\n\t\tborderBottomWidth: \"hide\",\n\t\tpaddingTop: \"hide\",\n\t\tpaddingBottom: \"hide\",\n\t\theight: \"hide\"\n\t},\n\n\tshowProps: {\n\t\tborderTopWidth: \"show\",\n\t\tborderBottomWidth: \"show\",\n\t\tpaddingTop: \"show\",\n\t\tpaddingBottom: \"show\",\n\t\theight: \"show\"\n\t},\n\n\t_create: function() {\n\t\tvar options = this.options;\n\t\tthis.prevShow = this.prevHide = $();\n\t\tthis.element.addClass( \"ui-accordion ui-widget ui-helper-reset\" )\n\t\t\t// ARIA\n\t\t\t.attr( \"role\", \"tablist\" );\n\n\t\t// don't allow collapsible: false and active: false / null\n\t\tif ( !options.collapsible && (options.active === false || options.active == null) ) {\n\t\t\toptions.active = 0;\n\t\t}\n\n\t\tthis._processPanels();\n\t\t// handle negative values\n\t\tif ( options.active < 0 ) {\n\t\t\toptions.active += this.headers.length;\n\t\t}\n\t\tthis._refresh();\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\theader: this.active,\n\t\t\tpanel: !this.active.length ? $() : this.active.next()\n\t\t};\n\t},\n\n\t_createIcons: function() {\n\t\tvar icons = this.options.icons;\n\t\tif ( icons ) {\n\t\t\t$( \"<span>\" )\n\t\t\t\t.addClass( \"ui-accordion-header-icon ui-icon \" + icons.header )\n\t\t\t\t.prependTo( this.headers );\n\t\t\tthis.active.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.removeClass( icons.header )\n\t\t\t\t.addClass( icons.activeHeader );\n\t\t\tthis.headers.addClass( \"ui-accordion-icons\" );\n\t\t}\n\t},\n\n\t_destroyIcons: function() {\n\t\tthis.headers\n\t\t\t.removeClass( \"ui-accordion-icons\" )\n\t\t\t.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.remove();\n\t},\n\n\t_destroy: function() {\n\t\tvar contents;\n\n\t\t// clean up main element\n\t\tthis.element\n\t\t\t.removeClass( \"ui-accordion ui-widget ui-helper-reset\" )\n\t\t\t.removeAttr( \"role\" );\n\n\t\t// clean up headers\n\t\tthis.headers\n\t\t\t.removeClass( \"ui-accordion-header ui-accordion-header-active ui-state-default \" +\n\t\t\t\t\"ui-corner-all ui-state-active ui-state-disabled ui-corner-top\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t.removeAttr( \"aria-selected\" )\n\t\t\t.removeAttr( \"aria-controls\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis._destroyIcons();\n\n\t\t// clean up content panels\n\t\tcontents = this.headers.next()\n\t\t\t.removeClass( \"ui-helper-reset ui-widget-content ui-corner-bottom \" +\n\t\t\t\t\"ui-accordion-content ui-accordion-content-active ui-state-disabled\" )\n\t\t\t.css( \"display\", \"\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t.removeUniqueId();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tcontents.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tif ( this.options.event ) {\n\t\t\t\tthis._off( this.headers, this.options.event );\n\t\t\t}\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\t// setting collapsible: false while collapsed; open first panel\n\t\tif ( key === \"collapsible\" && !value && this.options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t}\n\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis._destroyIcons();\n\t\t\tif ( value ) {\n\t\t\t\tthis._createIcons();\n\t\t\t}\n\t\t}\n\n\t\t// #5332 - opacity doesn't cascade to positioned elements in IE\n\t\t// so we need to add the disabled class to the headers and panels\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t\tthis.headers.add( this.headers.next() )\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tif ( event.altKey || event.ctrlKey ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar keyCode = $.ui.keyCode,\n\t\t\tlength = this.headers.length,\n\t\t\tcurrentIndex = this.headers.index( event.target ),\n\t\t\ttoFocus = false;\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase keyCode.RIGHT:\n\t\t\tcase keyCode.DOWN:\n\t\t\t\ttoFocus = this.headers[ ( currentIndex + 1 ) % length ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.LEFT:\n\t\t\tcase keyCode.UP:\n\t\t\t\ttoFocus = this.headers[ ( currentIndex - 1 + length ) % length ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.SPACE:\n\t\t\tcase keyCode.ENTER:\n\t\t\t\tthis._eventHandler( event );\n\t\t\t\tbreak;\n\t\t\tcase keyCode.HOME:\n\t\t\t\ttoFocus = this.headers[ 0 ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.END:\n\t\t\t\ttoFocus = this.headers[ length - 1 ];\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( toFocus ) {\n\t\t\t$( event.target ).attr( \"tabIndex\", -1 );\n\t\t\t$( toFocus ).attr( \"tabIndex\", 0 );\n\t\t\ttoFocus.focus();\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_panelKeyDown: function( event ) {\n\t\tif ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {\n\t\t\t$( event.currentTarget ).prev().focus();\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options;\n\t\tthis._processPanels();\n\n\t\t// was collapsed or no panel\n\t\tif ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\t\t// active false only when collapsible is true\n\t\t} else if ( options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t// was active, but active panel is gone\n\t\t} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\t// all remaining panel are disabled\n\t\t\tif ( this.headers.length === this.headers.find(\".ui-state-disabled\").length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\t\t\t// activate previous panel\n\t\t\t} else {\n\t\t\t\tthis._activate( Math.max( 0, options.active - 1 ) );\n\t\t\t}\n\t\t// was active, active panel still exists\n\t\t} else {\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.headers.index( this.active );\n\t\t}\n\n\t\tthis._destroyIcons();\n\n\t\tthis._refresh();\n\t},\n\n\t_processPanels: function() {\n\t\tvar prevHeaders = this.headers,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.headers = this.element.find( this.options.header )\n\t\t\t.addClass( \"ui-accordion-header ui-state-default ui-corner-all\" );\n\n\t\tthis.panels = this.headers.next()\n\t\t\t.addClass( \"ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom\" )\n\t\t\t.filter( \":not(.ui-accordion-content-active)\" )\n\t\t\t.hide();\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevPanels ) {\n\t\t\tthis._off( prevHeaders.not( this.headers ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t_refresh: function() {\n\t\tvar maxHeight,\n\t\t\toptions = this.options,\n\t\t\theightStyle = options.heightStyle,\n\t\t\tparent = this.element.parent();\n\n\t\tthis.active = this._findActive( options.active )\n\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" )\n\t\t\t.removeClass( \"ui-corner-all\" );\n\t\tthis.active.next()\n\t\t\t.addClass( \"ui-accordion-content-active\" )\n\t\t\t.show();\n\n\t\tthis.headers\n\t\t\t.attr( \"role\", \"tab\" )\n\t\t\t.each(function() {\n\t\t\t\tvar header = $( this ),\n\t\t\t\t\theaderId = header.uniqueId().attr( \"id\" ),\n\t\t\t\t\tpanel = header.next(),\n\t\t\t\t\tpanelId = panel.uniqueId().attr( \"id\" );\n\t\t\t\theader.attr( \"aria-controls\", panelId );\n\t\t\t\tpanel.attr( \"aria-labelledby\", headerId );\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\tthis.headers\n\t\t\t.not( this.active )\n\t\t\t.attr({\n\t\t\t\t\"aria-selected\": \"false\",\n\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\ttabIndex: -1\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t})\n\t\t\t\t.hide();\n\n\t\t// make sure at least one header is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.headers.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active.attr({\n\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\ttabIndex: 0\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t});\n\t\t}\n\n\t\tthis._createIcons();\n\n\t\tthis._setupEvents( options.event );\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.headers.each(function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.headers.next()\n\t\t\t\t.each(function() {\n\t\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t\t})\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.headers.next()\n\t\t\t\t.each(function() {\n\t\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).css( \"height\", \"\" ).height() );\n\t\t\t\t})\n\t\t\t\t.height( maxHeight );\n\t\t}\n\t},\n\n\t_activate: function( index ) {\n\t\tvar active = this._findActive( index )[ 0 ];\n\n\t\t// trying to activate the already active panel\n\t\tif ( active === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// trying to collapse, simulate a click on the currently active header\n\t\tactive = active || this.active[ 0 ];\n\n\t\tthis._eventHandler({\n\t\t\ttarget: active,\n\t\t\tcurrentTarget: active,\n\t\t\tpreventDefault: $.noop\n\t\t});\n\t},\n\n\t_findActive: function( selector ) {\n\t\treturn typeof selector === \"number\" ? this.headers.eq( selector ) : $();\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tkeydown: \"_keydown\"\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t});\n\t\t}\n\n\t\tthis._off( this.headers.add( this.headers.next() ) );\n\t\tthis._on( this.headers, events );\n\t\tthis._on( this.headers.next(), { keydown: \"_panelKeyDown\" });\n\t\tthis._hoverable( this.headers );\n\t\tthis._focusable( this.headers );\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tclicked = $( event.currentTarget ),\n\t\t\tclickedIsActive = clicked[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : clicked.next(),\n\t\t\ttoHide = active.next(),\n\t\t\teventData = {\n\t\t\t\toldHeader: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewHeader: collapsing ? $() : clicked,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif (\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.headers.index( clicked );\n\n\t\t// when the call to ._toggle() comes after the class changes\n\t\t// it causes a very odd bug in IE 8 (see #6720)\n\t\tthis.active = clickedIsActive ? $() : clicked;\n\t\tthis._toggle( eventData );\n\n\t\t// switch classes\n\t\t// corner classes on the previously active header stay after the animation\n\t\tactive.removeClass( \"ui-accordion-header-active ui-state-active\" );\n\t\tif ( options.icons ) {\n\t\t\tactive.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.removeClass( options.icons.activeHeader )\n\t\t\t\t.addClass( options.icons.header );\n\t\t}\n\n\t\tif ( !clickedIsActive ) {\n\t\t\tclicked\n\t\t\t\t.removeClass( \"ui-corner-all\" )\n\t\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" );\n\t\t\tif ( options.icons ) {\n\t\t\t\tclicked.children( \".ui-accordion-header-icon\" )\n\t\t\t\t\t.removeClass( options.icons.header )\n\t\t\t\t\t.addClass( options.icons.activeHeader );\n\t\t\t}\n\n\t\t\tclicked\n\t\t\t\t.next()\n\t\t\t\t.addClass( \"ui-accordion-content-active\" );\n\t\t}\n\t},\n\n\t_toggle: function( data ) {\n\t\tvar toShow = data.newPanel,\n\t\t\ttoHide = this.prevShow.length ? this.prevShow : data.oldPanel;\n\n\t\t// handle activating a panel during the animation for another activation\n\t\tthis.prevShow.add( this.prevHide ).stop( true, true );\n\t\tthis.prevShow = toShow;\n\t\tthis.prevHide = toHide;\n\n\t\tif ( this.options.animate ) {\n\t\t\tthis._animate( toShow, toHide, data );\n\t\t} else {\n\t\t\ttoHide.hide();\n\t\t\ttoShow.show();\n\t\t\tthis._toggleComplete( data );\n\t\t}\n\n\t\ttoHide.attr({\n\t\t\t\"aria-hidden\": \"true\"\n\t\t});\n\t\ttoHide.prev().attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t});\n\t\t// if we're switching panels, remove the old header from the tab order\n\t\t// if we're opening from collapsed state, remove the previous header from the tab order\n\t\t// if we're collapsing, then keep the collapsing header in the tab order\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\ttoHide.prev().attr({\n\t\t\t\t\"tabIndex\": -1,\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t});\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.headers.filter(function() {\n\t\t\t\treturn parseInt( $( this ).attr( \"tabIndex\" ), 10 ) === 0;\n\t\t\t})\n\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow\n\t\t\t.attr( \"aria-hidden\", \"false\" )\n\t\t\t.prev()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t});\n\t},\n\n\t_animate: function( toShow, toHide, data ) {\n\t\tvar total, easing, duration,\n\t\t\tthat = this,\n\t\t\tadjust = 0,\n\t\t\tboxSizing = toShow.css( \"box-sizing\" ),\n\t\t\tdown = toShow.length &&\n\t\t\t\t( !toHide.length || ( toShow.index() < toHide.index() ) ),\n\t\t\tanimate = this.options.animate || {},\n\t\t\toptions = down && animate.down || animate,\n\t\t\tcomplete = function() {\n\t\t\t\tthat._toggleComplete( data );\n\t\t\t};\n\n\t\tif ( typeof options === \"number\" ) {\n\t\t\tduration = options;\n\t\t}\n\t\tif ( typeof options === \"string\" ) {\n\t\t\teasing = options;\n\t\t}\n\t\t// fall back from options to animation in case of partial down settings\n\t\teasing = easing || options.easing || animate.easing;\n\t\tduration = duration || options.duration || animate.duration;\n\n\t\tif ( !toHide.length ) {\n\t\t\treturn toShow.animate( this.showProps, duration, easing, complete );\n\t\t}\n\t\tif ( !toShow.length ) {\n\t\t\treturn toHide.animate( this.hideProps, duration, easing, complete );\n\t\t}\n\n\t\ttotal = toShow.show().outerHeight();\n\t\ttoHide.animate( this.hideProps, {\n\t\t\tduration: duration,\n\t\t\teasing: easing,\n\t\t\tstep: function( now, fx ) {\n\t\t\t\tfx.now = Math.round( now );\n\t\t\t}\n\t\t});\n\t\ttoShow\n\t\t\t.hide()\n\t\t\t.animate( this.showProps, {\n\t\t\t\tduration: duration,\n\t\t\t\teasing: easing,\n\t\t\t\tcomplete: complete,\n\t\t\t\tstep: function( now, fx ) {\n\t\t\t\t\tfx.now = Math.round( now );\n\t\t\t\t\tif ( fx.prop !== \"height\" ) {\n\t\t\t\t\t\tif ( boxSizing === \"content-box\" ) {\n\t\t\t\t\t\t\tadjust += fx.now;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( that.options.heightStyle !== \"content\" ) {\n\t\t\t\t\t\tfx.now = Math.round( total - toHide.outerHeight() - adjust );\n\t\t\t\t\t\tadjust = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t},\n\n\t_toggleComplete: function( data ) {\n\t\tvar toHide = data.oldPanel;\n\n\t\ttoHide\n\t\t\t.removeClass( \"ui-accordion-content-active\" )\n\t\t\t.prev()\n\t\t\t\t.removeClass( \"ui-corner-top\" )\n\t\t\t\t.addClass( \"ui-corner-all\" );\n\n\t\t// Work around for rendering bug in IE (#5421)\n\t\tif ( toHide.length ) {\n\t\t\ttoHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;\n\t\t}\n\t\tthis._trigger( \"activate\", null, data );\n\t}\n});\n\n\n/*!\n * jQuery UI Menu 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/menu/\n */\n\n\nvar menu = $.widget( \"ui.menu\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<ul>\",\n\tdelay: 300,\n\toptions: {\n\t\ticons: {\n\t\t\tsubmenu: \"ui-icon-carat-1-e\"\n\t\t},\n\t\titems: \"> *\",\n\t\tmenus: \"ul\",\n\t\tposition: {\n\t\t\tmy: \"left-1 top\",\n\t\t\tat: \"right top\"\n\t\t},\n\t\trole: \"menu\",\n\n\t\t// callbacks\n\t\tblur: null,\n\t\tfocus: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tthis.activeMenu = this.element;\n\n\t\t// Flag used to prevent firing of the click handler\n\t\t// as the event bubbles up through nested menus\n\t\tthis.mouseHandled = false;\n\t\tthis.element\n\t\t\t.uniqueId()\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content\" )\n\t\t\t.toggleClass( \"ui-menu-icons\", !!this.element.find( \".ui-icon\" ).length )\n\t\t\t.attr({\n\t\t\t\trole: this.options.role,\n\t\t\t\ttabIndex: 0\n\t\t\t});\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.element\n\t\t\t\t.addClass( \"ui-state-disabled\" )\n\t\t\t\t.attr( \"aria-disabled\", \"true\" );\n\t\t}\n\n\t\tthis._on({\n\t\t\t// Prevent focus from sticking to links inside menu after clicking\n\t\t\t// them (focus should always stay on UL during navigation).\n\t\t\t\"mousedown .ui-menu-item\": function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t},\n\t\t\t\"click .ui-menu-item\": function( event ) {\n\t\t\t\tvar target = $( event.target );\n\t\t\t\tif ( !this.mouseHandled && target.not( \".ui-state-disabled\" ).length ) {\n\t\t\t\t\tthis.select( event );\n\n\t\t\t\t\t// Only set the mouseHandled flag if the event will bubble, see #9469.\n\t\t\t\t\tif ( !event.isPropagationStopped() ) {\n\t\t\t\t\t\tthis.mouseHandled = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Open submenu on click\n\t\t\t\t\tif ( target.has( \".ui-menu\" ).length ) {\n\t\t\t\t\t\tthis.expand( event );\n\t\t\t\t\t} else if ( !this.element.is( \":focus\" ) && $( this.document[ 0 ].activeElement ).closest( \".ui-menu\" ).length ) {\n\n\t\t\t\t\t\t// Redirect focus to the menu\n\t\t\t\t\t\tthis.element.trigger( \"focus\", [ true ] );\n\n\t\t\t\t\t\t// If the active item is on the top level, let it stay active.\n\t\t\t\t\t\t// Otherwise, blur the active item since it is no longer visible.\n\t\t\t\t\t\tif ( this.active && this.active.parents( \".ui-menu\" ).length === 1 ) {\n\t\t\t\t\t\t\tclearTimeout( this.timer );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mouseenter .ui-menu-item\": function( event ) {\n\t\t\t\t// Ignore mouse events while typeahead is active, see #10458.\n\t\t\t\t// Prevents focusing the wrong item when typeahead causes a scroll while the mouse\n\t\t\t\t// is over an item in the menu\n\t\t\t\tif ( this.previousFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar target = $( event.currentTarget );\n\t\t\t\t// Remove ui-state-active class from siblings of the newly focused menu item\n\t\t\t\t// to avoid a jump caused by adjacent elements both having a class with a border\n\t\t\t\ttarget.siblings( \".ui-state-active\" ).removeClass( \"ui-state-active\" );\n\t\t\t\tthis.focus( event, target );\n\t\t\t},\n\t\t\tmouseleave: \"collapseAll\",\n\t\t\t\"mouseleave .ui-menu\": \"collapseAll\",\n\t\t\tfocus: function( event, keepActiveItem ) {\n\t\t\t\t// If there's already an active item, keep it active\n\t\t\t\t// If not, activate the first item\n\t\t\t\tvar item = this.active || this.element.find( this.options.items ).eq( 0 );\n\n\t\t\t\tif ( !keepActiveItem ) {\n\t\t\t\t\tthis.focus( event, item );\n\t\t\t\t}\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tthis._delay(function() {\n\t\t\t\t\tif ( !$.contains( this.element[0], this.document[0].activeElement ) ) {\n\t\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tkeydown: \"_keydown\"\n\t\t});\n\n\t\tthis.refresh();\n\n\t\t// Clicks outside of a menu collapse any open menus\n\t\tthis._on( this.document, {\n\t\t\tclick: function( event ) {\n\t\t\t\tif ( this._closeOnDocumentClick( event ) ) {\n\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t}\n\n\t\t\t\t// Reset the mouseHandled flag\n\t\t\t\tthis.mouseHandled = false;\n\t\t\t}\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\t// Destroy (sub)menus\n\t\tthis.element\n\t\t\t.removeAttr( \"aria-activedescendant\" )\n\t\t\t.find( \".ui-menu\" ).addBack()\n\t\t\t\t.removeClass( \"ui-menu ui-widget ui-widget-content ui-menu-icons ui-front\" )\n\t\t\t\t.removeAttr( \"role\" )\n\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.show();\n\n\t\t// Destroy menu items\n\t\tthis.element.find( \".ui-menu-item\" )\n\t\t\t.removeClass( \"ui-menu-item\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeUniqueId()\n\t\t\t.removeClass( \"ui-state-hover\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-haspopup\" )\n\t\t\t.children().each( function() {\n\t\t\t\tvar elem = $( this );\n\t\t\t\tif ( elem.data( \"ui-menu-submenu-carat\" ) ) {\n\t\t\t\t\telem.remove();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Destroy menu dividers\n\t\tthis.element.find( \".ui-menu-divider\" ).removeClass( \"ui-menu-divider ui-widget-content\" );\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar match, prev, character, skip,\n\t\t\tpreventDefault = true;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\tthis.previousPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\tthis.nextPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tthis._move( \"first\", \"first\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tthis._move( \"last\", \"last\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\t\tthis.previous( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tthis.next( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ENTER:\n\t\tcase $.ui.keyCode.SPACE:\n\t\t\tthis._activate( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpreventDefault = false;\n\t\t\tprev = this.previousFilter || \"\";\n\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\tskip = false;\n\n\t\t\tclearTimeout( this.filterTimer );\n\n\t\t\tif ( character === prev ) {\n\t\t\t\tskip = true;\n\t\t\t} else {\n\t\t\t\tcharacter = prev + character;\n\t\t\t}\n\n\t\t\tmatch = this._filterMenuItems( character );\n\t\t\tmatch = skip && match.index( this.active.next() ) !== -1 ?\n\t\t\t\tthis.active.nextAll( \".ui-menu-item\" ) :\n\t\t\t\tmatch;\n\n\t\t\t// If no matches on the current filter, reset to the last character pressed\n\t\t\t// to move down the menu to the first item that starts with that character\n\t\t\tif ( !match.length ) {\n\t\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\t\tmatch = this._filterMenuItems( character );\n\t\t\t}\n\n\t\t\tif ( match.length ) {\n\t\t\t\tthis.focus( event, match );\n\t\t\t\tthis.previousFilter = character;\n\t\t\t\tthis.filterTimer = this._delay(function() {\n\t\t\t\t\tdelete this.previousFilter;\n\t\t\t\t}, 1000 );\n\t\t\t} else {\n\t\t\t\tdelete this.previousFilter;\n\t\t\t}\n\t\t}\n\n\t\tif ( preventDefault ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_activate: function( event ) {\n\t\tif ( !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\tif ( this.active.is( \"[aria-haspopup='true']\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t} else {\n\t\t\t\tthis.select( event );\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar menus, items,\n\t\t\tthat = this,\n\t\t\ticon = this.options.icons.submenu,\n\t\t\tsubmenus = this.element.find( this.options.menus );\n\n\t\tthis.element.toggleClass( \"ui-menu-icons\", !!this.element.find( \".ui-icon\" ).length );\n\n\t\t// Initialize nested menus\n\t\tsubmenus.filter( \":not(.ui-menu)\" )\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content ui-front\" )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\trole: this.options.role,\n\t\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t})\n\t\t\t.each(function() {\n\t\t\t\tvar menu = $( this ),\n\t\t\t\t\titem = menu.parent(),\n\t\t\t\t\tsubmenuCarat = $( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-menu-icon ui-icon \" + icon )\n\t\t\t\t\t\t.data( \"ui-menu-submenu-carat\", true );\n\n\t\t\t\titem\n\t\t\t\t\t.attr( \"aria-haspopup\", \"true\" )\n\t\t\t\t\t.prepend( submenuCarat );\n\t\t\t\tmenu.attr( \"aria-labelledby\", item.attr( \"id\" ) );\n\t\t\t});\n\n\t\tmenus = submenus.add( this.element );\n\t\titems = menus.find( this.options.items );\n\n\t\t// Initialize menu-items containing spaces and/or dashes only as dividers\n\t\titems.not( \".ui-menu-item\" ).each(function() {\n\t\t\tvar item = $( this );\n\t\t\tif ( that._isDivider( item ) ) {\n\t\t\t\titem.addClass( \"ui-widget-content ui-menu-divider\" );\n\t\t\t}\n\t\t});\n\n\t\t// Don't refresh list items that are already adapted\n\t\titems.not( \".ui-menu-item, .ui-menu-divider\" )\n\t\t\t.addClass( \"ui-menu-item\" )\n\t\t\t.uniqueId()\n\t\t\t.attr({\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: this._itemRole()\n\t\t\t});\n\n\t\t// Add aria-disabled attribute to any disabled menu item\n\t\titems.filter( \".ui-state-disabled\" ).attr( \"aria-disabled\", \"true\" );\n\n\t\t// If the active item has been removed, blur the menu\n\t\tif ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\tthis.blur();\n\t\t}\n\t},\n\n\t_itemRole: function() {\n\t\treturn {\n\t\t\tmenu: \"menuitem\",\n\t\t\tlistbox: \"option\"\n\t\t}[ this.options.role ];\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.element.find( \".ui-menu-icon\" )\n\t\t\t\t.removeClass( this.options.icons.submenu )\n\t\t\t\t.addClass( value.submenu );\n\t\t}\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\tfocus: function( event, item ) {\n\t\tvar nested, focused;\n\t\tthis.blur( event, event && event.type === \"focus\" );\n\n\t\tthis._scrollIntoView( item );\n\n\t\tthis.active = item.first();\n\t\tfocused = this.active.addClass( \"ui-state-focus\" ).removeClass( \"ui-state-active\" );\n\t\t// Only update aria-activedescendant if there's a role\n\t\t// otherwise we assume focus is managed elsewhere\n\t\tif ( this.options.role ) {\n\t\t\tthis.element.attr( \"aria-activedescendant\", focused.attr( \"id\" ) );\n\t\t}\n\n\t\t// Highlight active parent menu item, if any\n\t\tthis.active\n\t\t\t.parent()\n\t\t\t.closest( \".ui-menu-item\" )\n\t\t\t.addClass( \"ui-state-active\" );\n\n\t\tif ( event && event.type === \"keydown\" ) {\n\t\t\tthis._close();\n\t\t} else {\n\t\t\tthis.timer = this._delay(function() {\n\t\t\t\tthis._close();\n\t\t\t}, this.delay );\n\t\t}\n\n\t\tnested = item.children( \".ui-menu\" );\n\t\tif ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {\n\t\t\tthis._startOpening(nested);\n\t\t}\n\t\tthis.activeMenu = item.parent();\n\n\t\tthis._trigger( \"focus\", event, { item: item } );\n\t},\n\n\t_scrollIntoView: function( item ) {\n\t\tvar borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\n\t\tif ( this._hasScroll() ) {\n\t\t\tborderTop = parseFloat( $.css( this.activeMenu[0], \"borderTopWidth\" ) ) || 0;\n\t\t\tpaddingTop = parseFloat( $.css( this.activeMenu[0], \"paddingTop\" ) ) || 0;\n\t\t\toffset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\n\t\t\tscroll = this.activeMenu.scrollTop();\n\t\t\telementHeight = this.activeMenu.height();\n\t\t\titemHeight = item.outerHeight();\n\n\t\t\tif ( offset < 0 ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset );\n\t\t\t} else if ( offset + itemHeight > elementHeight ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\n\t\t\t}\n\t\t}\n\t},\n\n\tblur: function( event, fromFocus ) {\n\t\tif ( !fromFocus ) {\n\t\t\tclearTimeout( this.timer );\n\t\t}\n\n\t\tif ( !this.active ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.active.removeClass( \"ui-state-focus\" );\n\t\tthis.active = null;\n\n\t\tthis._trigger( \"blur\", event, { item: this.active } );\n\t},\n\n\t_startOpening: function( submenu ) {\n\t\tclearTimeout( this.timer );\n\n\t\t// Don't open if already open fixes a Firefox bug that caused a .5 pixel\n\t\t// shift in the submenu position when mousing over the carat icon\n\t\tif ( submenu.attr( \"aria-hidden\" ) !== \"true\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timer = this._delay(function() {\n\t\t\tthis._close();\n\t\t\tthis._open( submenu );\n\t\t}, this.delay );\n\t},\n\n\t_open: function( submenu ) {\n\t\tvar position = $.extend({\n\t\t\tof: this.active\n\t\t}, this.options.position );\n\n\t\tclearTimeout( this.timer );\n\t\tthis.element.find( \".ui-menu\" ).not( submenu.parents( \".ui-menu\" ) )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" );\n\n\t\tsubmenu\n\t\t\t.show()\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.attr( \"aria-expanded\", \"true\" )\n\t\t\t.position( position );\n\t},\n\n\tcollapseAll: function( event, all ) {\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay(function() {\n\t\t\t// If we were passed an event, look for the submenu that contains the event\n\t\t\tvar currentMenu = all ? this.element :\n\t\t\t\t$( event && event.target ).closest( this.element.find( \".ui-menu\" ) );\n\n\t\t\t// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway\n\t\t\tif ( !currentMenu.length ) {\n\t\t\t\tcurrentMenu = this.element;\n\t\t\t}\n\n\t\t\tthis._close( currentMenu );\n\n\t\t\tthis.blur( event );\n\t\t\tthis.activeMenu = currentMenu;\n\t\t}, this.delay );\n\t},\n\n\t// With no arguments, closes the currently active menu - if nothing is active\n\t// it closes all menus.  If passed an argument, it will search for menus BELOW\n\t_close: function( startMenu ) {\n\t\tif ( !startMenu ) {\n\t\t\tstartMenu = this.active ? this.active.parent() : this.element;\n\t\t}\n\n\t\tstartMenu\n\t\t\t.find( \".ui-menu\" )\n\t\t\t\t.hide()\n\t\t\t\t.attr( \"aria-hidden\", \"true\" )\n\t\t\t\t.attr( \"aria-expanded\", \"false\" )\n\t\t\t.end()\n\t\t\t.find( \".ui-state-active\" ).not( \".ui-state-focus\" )\n\t\t\t\t.removeClass( \"ui-state-active\" );\n\t},\n\n\t_closeOnDocumentClick: function( event ) {\n\t\treturn !$( event.target ).closest( \".ui-menu\" ).length;\n\t},\n\n\t_isDivider: function( item ) {\n\n\t\t// Match hyphen, em dash, en dash\n\t\treturn !/[^\\-\\u2014\\u2013\\s]/.test( item.text() );\n\t},\n\n\tcollapse: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active.parent().closest( \".ui-menu-item\", this.element );\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._close();\n\t\t\tthis.focus( event, newItem );\n\t\t}\n\t},\n\n\texpand: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active\n\t\t\t\t.children( \".ui-menu \" )\n\t\t\t\t.find( this.options.items )\n\t\t\t\t.first();\n\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._open( newItem.parent() );\n\n\t\t\t// Delay so Firefox will not hide activedescendant change in expanding submenu from AT\n\t\t\tthis._delay(function() {\n\t\t\t\tthis.focus( event, newItem );\n\t\t\t});\n\t\t}\n\t},\n\n\tnext: function( event ) {\n\t\tthis._move( \"next\", \"first\", event );\n\t},\n\n\tprevious: function( event ) {\n\t\tthis._move( \"prev\", \"last\", event );\n\t},\n\n\tisFirstItem: function() {\n\t\treturn this.active && !this.active.prevAll( \".ui-menu-item\" ).length;\n\t},\n\n\tisLastItem: function() {\n\t\treturn this.active && !this.active.nextAll( \".ui-menu-item\" ).length;\n\t},\n\n\t_move: function( direction, filter, event ) {\n\t\tvar next;\n\t\tif ( this.active ) {\n\t\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( -1 );\n\t\t\t} else {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction + \"All\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( 0 );\n\t\t\t}\n\t\t}\n\t\tif ( !next || !next.length || !this.active ) {\n\t\t\tnext = this.activeMenu.find( this.options.items )[ filter ]();\n\t\t}\n\n\t\tthis.focus( event, next );\n\t},\n\n\tnextPage: function( event ) {\n\t\tvar item, base, height;\n\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isLastItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.nextAll( \".ui-menu-item\" ).each(function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base - height < 0;\n\t\t\t});\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items )\n\t\t\t\t[ !this.active ? \"first\" : \"last\" ]() );\n\t\t}\n\t},\n\n\tpreviousPage: function( event ) {\n\t\tvar item, base, height;\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isFirstItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.prevAll( \".ui-menu-item\" ).each(function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base + height > 0;\n\t\t\t});\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items ).first() );\n\t\t}\n\t},\n\n\t_hasScroll: function() {\n\t\treturn this.element.outerHeight() < this.element.prop( \"scrollHeight\" );\n\t},\n\n\tselect: function( event ) {\n\t\t// TODO: It should never be possible to not have an active item at this\n\t\t// point, but the tests don't trigger mouseenter before click.\n\t\tthis.active = this.active || $( event.target ).closest( \".ui-menu-item\" );\n\t\tvar ui = { item: this.active };\n\t\tif ( !this.active.has( \".ui-menu\" ).length ) {\n\t\t\tthis.collapseAll( event, true );\n\t\t}\n\t\tthis._trigger( \"select\", event, ui );\n\t},\n\n\t_filterMenuItems: function(character) {\n\t\tvar escapedCharacter = character.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" ),\n\t\t\tregex = new RegExp( \"^\" + escapedCharacter, \"i\" );\n\n\t\treturn this.activeMenu\n\t\t\t.find( this.options.items )\n\n\t\t\t// Only match on items, not dividers or other content (#10571)\n\t\t\t.filter( \".ui-menu-item\" )\n\t\t\t.filter(function() {\n\t\t\t\treturn regex.test( $.trim( $( this ).text() ) );\n\t\t\t});\n\t}\n});\n\n\n/*!\n * jQuery UI Autocomplete 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/autocomplete/\n */\n\n\n$.widget( \"ui.autocomplete\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<input>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tautoFocus: false,\n\t\tdelay: 300,\n\t\tminLength: 1,\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\tsource: null,\n\n\t\t// callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresponse: null,\n\t\tsearch: null,\n\t\tselect: null\n\t},\n\n\trequestIndex: 0,\n\tpending: 0,\n\n\t_create: function() {\n\t\t// Some browsers only repeat keydown events, not keypress events,\n\t\t// so we use the suppressKeyPress flag to determine if we've already\n\t\t// handled the keydown event. #7269\n\t\t// Unfortunately the code for & in keypress is the same as the up arrow,\n\t\t// so we use the suppressKeyPressRepeat flag to avoid handling keypress\n\t\t// events when we know the keydown event was used to modify the\n\t\t// search term. #7799\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\n\t\t\tnodeName = this.element[ 0 ].nodeName.toLowerCase(),\n\t\t\tisTextarea = nodeName === \"textarea\",\n\t\t\tisInput = nodeName === \"input\";\n\n\t\tthis.isMultiLine =\n\t\t\t// Textareas are always multi-line\n\t\t\tisTextarea ? true :\n\t\t\t// Inputs are always single-line, even if inside a contentEditable element\n\t\t\t// IE also treats inputs as contentEditable\n\t\t\tisInput ? false :\n\t\t\t// All other element types are determined by whether or not they're contentEditable\n\t\t\tthis.element.prop( \"isContentEditable\" );\n\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\n\t\tthis.isNewMenu = true;\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-autocomplete-input\" )\n\t\t\t.attr( \"autocomplete\", \"off\" );\n\n\t\tthis._on( this.element, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tsuppressInput = true;\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsuppressKeyPress = false;\n\t\t\t\tsuppressInput = false;\n\t\t\t\tsuppressKeyPressRepeat = false;\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ENTER:\n\t\t\t\t\t// when menu is open and has focus\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\t// #6055 - Opera still allows the keypress to occur\n\t\t\t\t\t\t// which causes forms to submit\n\t\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.TAB:\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ESCAPE:\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\t\t\t\tthis._value( this.term );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.close( event );\n\t\t\t\t\t\t// Different browsers have different default behavior for escape\n\t\t\t\t\t\t// Single press can mean undo or clear\n\t\t\t\t\t\t// Double press in IE means clear the whole form\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\t// search timeout should be triggered before the input value is changed\n\t\t\t\t\tthis._searchTimeout( event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeypress: function( event ) {\n\t\t\t\tif ( suppressKeyPress ) {\n\t\t\t\t\tsuppressKeyPress = false;\n\t\t\t\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( suppressKeyPressRepeat ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// replicate some key handlers to allow them to repeat in Firefox and Opera\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tinput: function( event ) {\n\t\t\t\tif ( suppressInput ) {\n\t\t\t\t\tsuppressInput = false;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._searchTimeout( event );\n\t\t\t},\n\t\t\tfocus: function() {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.previous = this._value();\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tif ( this.cancelBlur ) {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tclearTimeout( this.searching );\n\t\t\t\tthis.close( event );\n\t\t\t\tthis._change( event );\n\t\t\t}\n\t\t});\n\n\t\tthis._initSource();\n\t\tthis.menu = $( \"<ul>\" )\n\t\t\t.addClass( \"ui-autocomplete ui-front\" )\n\t\t\t.appendTo( this._appendTo() )\n\t\t\t.menu({\n\t\t\t\t// disable ARIA support, the live region takes care of that\n\t\t\t\trole: null\n\t\t\t})\n\t\t\t.hide()\n\t\t\t.menu( \"instance\" );\n\n\t\tthis._on( this.menu.element, {\n\t\t\tmousedown: function( event ) {\n\t\t\t\t// prevent moving focus out of the text field\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t\tthis.cancelBlur = true;\n\t\t\t\tthis._delay(function() {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t});\n\n\t\t\t\t// clicking on the scrollbar causes focus to shift to the body\n\t\t\t\t// but we can't detect a mouseup or a click immediately afterward\n\t\t\t\t// so we have to track the next mousedown and close the menu if\n\t\t\t\t// the user clicks somewhere outside of the autocomplete\n\t\t\t\tvar menuElement = this.menu.element[ 0 ];\n\t\t\t\tif ( !$( event.target ).closest( \".ui-menu-item\" ).length ) {\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tvar that = this;\n\t\t\t\t\t\tthis.document.one( \"mousedown\", function( event ) {\n\t\t\t\t\t\t\tif ( event.target !== that.element[ 0 ] &&\n\t\t\t\t\t\t\t\t\tevent.target !== menuElement &&\n\t\t\t\t\t\t\t\t\t!$.contains( menuElement, event.target ) ) {\n\t\t\t\t\t\t\t\tthat.close();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenufocus: function( event, ui ) {\n\t\t\t\tvar label, item;\n\t\t\t\t// support: Firefox\n\t\t\t\t// Prevent accidental activation of menu items in Firefox (#7024 #9118)\n\t\t\t\tif ( this.isNewMenu ) {\n\t\t\t\t\tthis.isNewMenu = false;\n\t\t\t\t\tif ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis.menu.blur();\n\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titem = ui.item.data( \"ui-autocomplete-item\" );\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\n\t\t\t\t\t// use value to match what will end up in the input, if it was a key event\n\t\t\t\t\tif ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis._value( item.value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Announce the value in the liveRegion\n\t\t\t\tlabel = ui.item.attr( \"aria-label\" ) || item.value;\n\t\t\t\tif ( label && $.trim( label ).length ) {\n\t\t\t\t\tthis.liveRegion.children().hide();\n\t\t\t\t\t$( \"<div>\" ).text( label ).appendTo( this.liveRegion );\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenuselect: function( event, ui ) {\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\n\t\t\t\t\tprevious = this.previous;\n\n\t\t\t\t// only trigger when focus was lost (click on menu)\n\t\t\t\tif ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {\n\t\t\t\t\tthis.element.focus();\n\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t// #6109 - IE triggers two focus events and the second\n\t\t\t\t\t// is asynchronous, so we need to reset the previous\n\t\t\t\t\t// term synchronously and asynchronously :-(\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\tthis.selectedItem = item;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\n\t\t\t\t\tthis._value( item.value );\n\t\t\t\t}\n\t\t\t\t// reset the term after the select event\n\t\t\t\t// this allows custom select handling to work properly\n\t\t\t\tthis.term = this._value();\n\n\t\t\t\tthis.close( event );\n\t\t\t\tthis.selectedItem = item;\n\t\t\t}\n\t\t});\n\n\t\tthis.liveRegion = $( \"<span>\", {\n\t\t\t\trole: \"status\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t})\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\n\t\t// turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\tclearTimeout( this.searching );\n\t\tthis.element\n\t\t\t.removeClass( \"ui-autocomplete-input\" )\n\t\t\t.removeAttr( \"autocomplete\" );\n\t\tthis.menu.element.remove();\n\t\tthis.liveRegion.remove();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"source\" ) {\n\t\t\tthis._initSource();\n\t\t}\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\n\t\t}\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_initSource: function() {\n\t\tvar array, url,\n\t\t\tthat = this;\n\t\tif ( $.isArray( this.options.source ) ) {\n\t\t\tarray = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\n\t\t\t};\n\t\t} else if ( typeof this.options.source === \"string\" ) {\n\t\t\turl = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tif ( that.xhr ) {\n\t\t\t\t\tthat.xhr.abort();\n\t\t\t\t}\n\t\t\t\tthat.xhr = $.ajax({\n\t\t\t\t\turl: url,\n\t\t\t\t\tdata: request,\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tsuccess: function( data ) {\n\t\t\t\t\t\tresponse( data );\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tresponse([]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t} else {\n\t\t\tthis.source = this.options.source;\n\t\t}\n\t},\n\n\t_searchTimeout: function( event ) {\n\t\tclearTimeout( this.searching );\n\t\tthis.searching = this._delay(function() {\n\n\t\t\t// Search if the value has changed, or if the user retypes the same value (see #7434)\n\t\t\tvar equalValues = this.term === this._value(),\n\t\t\t\tmenuVisible = this.menu.element.is( \":visible\" ),\n\t\t\t\tmodifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n\n\t\t\tif ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.search( null, event );\n\t\t\t}\n\t\t}, this.options.delay );\n\t},\n\n\tsearch: function( value, event ) {\n\t\tvalue = value != null ? value : this._value();\n\n\t\t// always save the actual value, not the one passed as an argument\n\t\tthis.term = this._value();\n\n\t\tif ( value.length < this.options.minLength ) {\n\t\t\treturn this.close( event );\n\t\t}\n\n\t\tif ( this._trigger( \"search\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._search( value );\n\t},\n\n\t_search: function( value ) {\n\t\tthis.pending++;\n\t\tthis.element.addClass( \"ui-autocomplete-loading\" );\n\t\tthis.cancelSearch = false;\n\n\t\tthis.source( { term: value }, this._response() );\n\t},\n\n\t_response: function() {\n\t\tvar index = ++this.requestIndex;\n\n\t\treturn $.proxy(function( content ) {\n\t\t\tif ( index === this.requestIndex ) {\n\t\t\t\tthis.__response( content );\n\t\t\t}\n\n\t\t\tthis.pending--;\n\t\t\tif ( !this.pending ) {\n\t\t\t\tthis.element.removeClass( \"ui-autocomplete-loading\" );\n\t\t\t}\n\t\t}, this );\n\t},\n\n\t__response: function( content ) {\n\t\tif ( content ) {\n\t\t\tcontent = this._normalize( content );\n\t\t}\n\t\tthis._trigger( \"response\", null, { content: content } );\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\n\t\t\tthis._suggest( content );\n\t\t\tthis._trigger( \"open\" );\n\t\t} else {\n\t\t\t// use ._close() instead of .close() so we don't cancel future searches\n\t\t\tthis._close();\n\t\t}\n\t},\n\n\tclose: function( event ) {\n\t\tthis.cancelSearch = true;\n\t\tthis._close( event );\n\t},\n\n\t_close: function( event ) {\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.menu.element.hide();\n\t\t\tthis.menu.blur();\n\t\t\tthis.isNewMenu = true;\n\t\t\tthis._trigger( \"close\", event );\n\t\t}\n\t},\n\n\t_change: function( event ) {\n\t\tif ( this.previous !== this._value() ) {\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\n\t\t}\n\t},\n\n\t_normalize: function( items ) {\n\t\t// assume all items have the right format when the first item is complete\n\t\tif ( items.length && items[ 0 ].label && items[ 0 ].value ) {\n\t\t\treturn items;\n\t\t}\n\t\treturn $.map( items, function( item ) {\n\t\t\tif ( typeof item === \"string\" ) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: item,\n\t\t\t\t\tvalue: item\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn $.extend( {}, item, {\n\t\t\t\tlabel: item.label || item.value,\n\t\t\t\tvalue: item.value || item.label\n\t\t\t});\n\t\t});\n\t},\n\n\t_suggest: function( items ) {\n\t\tvar ul = this.menu.element.empty();\n\t\tthis._renderMenu( ul, items );\n\t\tthis.isNewMenu = true;\n\t\tthis.menu.refresh();\n\n\t\t// size and position menu\n\t\tul.show();\n\t\tthis._resizeMenu();\n\t\tul.position( $.extend({\n\t\t\tof: this.element\n\t\t}, this.options.position ) );\n\n\t\tif ( this.options.autoFocus ) {\n\t\t\tthis.menu.next();\n\t\t}\n\t},\n\n\t_resizeMenu: function() {\n\t\tvar ul = this.menu.element;\n\t\tul.outerWidth( Math.max(\n\t\t\t// Firefox wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping (#7513)\n\t\t\tul.width( \"\" ).outerWidth() + 1,\n\t\t\tthis.element.outerWidth()\n\t\t) );\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this;\n\t\t$.each( items, function( index, item ) {\n\t\t\tthat._renderItemData( ul, item );\n\t\t});\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\treturn $( \"<li>\" ).text( item.label ).appendTo( ul );\n\t},\n\n\t_move: function( direction, event ) {\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.search( null, event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\n\t\t\t\tthis.menu.isLastItem() && /^next/.test( direction ) ) {\n\n\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\tthis._value( this.term );\n\t\t\t}\n\n\t\t\tthis.menu.blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.menu[ direction ]( event );\n\t},\n\n\twidget: function() {\n\t\treturn this.menu.element;\n\t},\n\n\t_value: function() {\n\t\treturn this.valueMethod.apply( this.element, arguments );\n\t},\n\n\t_keyEvent: function( keyEvent, event ) {\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis._move( keyEvent, event );\n\n\t\t\t// prevents moving cursor to beginning/end of the text field in some browsers\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n});\n\n$.extend( $.ui.autocomplete, {\n\tescapeRegex: function( value ) {\n\t\treturn value.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" );\n\t},\n\tfilter: function( array, term ) {\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), \"i\" );\n\t\treturn $.grep( array, function( value ) {\n\t\t\treturn matcher.test( value.label || value.value || value );\n\t\t});\n\t}\n});\n\n// live region extension, adding a `messages` option\n// NOTE: This is an experimental API. We are still investigating\n// a full solution for string manipulation and internationalization.\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\n\toptions: {\n\t\tmessages: {\n\t\t\tnoResults: \"No search results.\",\n\t\t\tresults: function( amount ) {\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\n\t\t\t}\n\t\t}\n\t},\n\n\t__response: function( content ) {\n\t\tvar message;\n\t\tthis._superApply( arguments );\n\t\tif ( this.options.disabled || this.cancelSearch ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( content && content.length ) {\n\t\t\tmessage = this.options.messages.results( content.length );\n\t\t} else {\n\t\t\tmessage = this.options.messages.noResults;\n\t\t}\n\t\tthis.liveRegion.children().hide();\n\t\t$( \"<div>\" ).text( message ).appendTo( this.liveRegion );\n\t}\n});\n\nvar autocomplete = $.ui.autocomplete;\n\n\n/*!\n * jQuery UI Button 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/button/\n */\n\n\nvar lastActive,\n\tbaseClasses = \"ui-button ui-widget ui-state-default ui-corner-all\",\n\ttypeClasses = \"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",\n\tformResetHandler = function() {\n\t\tvar form = $( this );\n\t\tsetTimeout(function() {\n\t\t\tform.find( \":ui-button\" ).button( \"refresh\" );\n\t\t}, 1 );\n\t},\n\tradioGroup = function( radio ) {\n\t\tvar name = radio.name,\n\t\t\tform = radio.form,\n\t\t\tradios = $( [] );\n\t\tif ( name ) {\n\t\t\tname = name.replace( /'/g, \"\\\\'\" );\n\t\t\tif ( form ) {\n\t\t\t\tradios = $( form ).find( \"[name='\" + name + \"'][type=radio]\" );\n\t\t\t} else {\n\t\t\t\tradios = $( \"[name='\" + name + \"'][type=radio]\", radio.ownerDocument )\n\t\t\t\t\t.filter(function() {\n\t\t\t\t\t\treturn !this.form;\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn radios;\n\t};\n\n$.widget( \"ui.button\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<button>\",\n\toptions: {\n\t\tdisabled: null,\n\t\ttext: true,\n\t\tlabel: null,\n\t\ticons: {\n\t\t\tprimary: null,\n\t\t\tsecondary: null\n\t\t}\n\t},\n\t_create: function() {\n\t\tthis.element.closest( \"form\" )\n\t\t\t.unbind( \"reset\" + this.eventNamespace )\n\t\t\t.bind( \"reset\" + this.eventNamespace, formResetHandler );\n\n\t\tif ( typeof this.options.disabled !== \"boolean\" ) {\n\t\t\tthis.options.disabled = !!this.element.prop( \"disabled\" );\n\t\t} else {\n\t\t\tthis.element.prop( \"disabled\", this.options.disabled );\n\t\t}\n\n\t\tthis._determineButtonType();\n\t\tthis.hasTitle = !!this.buttonElement.attr( \"title\" );\n\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\ttoggleButton = this.type === \"checkbox\" || this.type === \"radio\",\n\t\t\tactiveClass = !toggleButton ? \"ui-state-active\" : \"\";\n\n\t\tif ( options.label === null ) {\n\t\t\toptions.label = (this.type === \"input\" ? this.buttonElement.val() : this.buttonElement.html());\n\t\t}\n\n\t\tthis._hoverable( this.buttonElement );\n\n\t\tthis.buttonElement\n\t\t\t.addClass( baseClasses )\n\t\t\t.attr( \"role\", \"button\" )\n\t\t\t.bind( \"mouseenter\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( this === lastActive ) {\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t}\n\t\t\t})\n\t\t\t.bind( \"mouseleave\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$( this ).removeClass( activeClass );\n\t\t\t})\n\t\t\t.bind( \"click\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Can't use _focusable() because the element that receives focus\n\t\t// and the element that gets the ui-state-focus class are different\n\t\tthis._on({\n\t\t\tfocus: function() {\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tblur: function() {\n\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\n\t\tif ( toggleButton ) {\n\t\t\tthis.element.bind( \"change\" + this.eventNamespace, function() {\n\t\t\t\tthat.refresh();\n\t\t\t});\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"radio\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\tthat.buttonElement.attr( \"aria-pressed\", \"true\" );\n\n\t\t\t\tvar radio = that.element[ 0 ];\n\t\t\t\tradioGroup( radio )\n\t\t\t\t\t.not( radio )\n\t\t\t\t\t.map(function() {\n\t\t\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t\t\t})\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t});\n\t\t} else {\n\t\t\tthis.buttonElement\n\t\t\t\t.bind( \"mousedown\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\tlastActive = this;\n\t\t\t\t\tthat.document.one( \"mouseup\", function() {\n\t\t\t\t\t\tlastActive = null;\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.bind( \"mouseup\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t})\n\t\t\t\t.bind( \"keydown\" + this.eventNamespace, function(event) {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {\n\t\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t// see #8559, we bind to blur here in case the button element loses\n\t\t\t\t// focus between keydown and keyup, it would be left in an \"active\" state\n\t\t\t\t.bind( \"keyup\" + this.eventNamespace + \" blur\" + this.eventNamespace, function() {\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t});\n\n\t\t\tif ( this.buttonElement.is(\"a\") ) {\n\t\t\t\tthis.buttonElement.keyup(function(event) {\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\n\t\t\t\t\t\t// TODO pass through original event correctly (just as 2nd argument doesn't work)\n\t\t\t\t\t\t$( this ).click();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis._setOption( \"disabled\", options.disabled );\n\t\tthis._resetButton();\n\t},\n\n\t_determineButtonType: function() {\n\t\tvar ancestor, labelSelector, checked;\n\n\t\tif ( this.element.is(\"[type=checkbox]\") ) {\n\t\t\tthis.type = \"checkbox\";\n\t\t} else if ( this.element.is(\"[type=radio]\") ) {\n\t\t\tthis.type = \"radio\";\n\t\t} else if ( this.element.is(\"input\") ) {\n\t\t\tthis.type = \"input\";\n\t\t} else {\n\t\t\tthis.type = \"button\";\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t// we don't search against the document in case the element\n\t\t\t// is disconnected from the DOM\n\t\t\tancestor = this.element.parents().last();\n\t\t\tlabelSelector = \"label[for='\" + this.element.attr(\"id\") + \"']\";\n\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\tancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();\n\t\t\t\tthis.buttonElement = ancestor.filter( labelSelector );\n\t\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.element.addClass( \"ui-helper-hidden-accessible\" );\n\n\t\t\tchecked = this.element.is( \":checked\" );\n\t\t\tif ( checked ) {\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-active\" );\n\t\t\t}\n\t\t\tthis.buttonElement.prop( \"aria-pressed\", checked );\n\t\t} else {\n\t\t\tthis.buttonElement = this.element;\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.buttonElement;\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-helper-hidden-accessible\" );\n\t\tthis.buttonElement\n\t\t\t.removeClass( baseClasses + \" ui-state-active \" + typeClasses )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-pressed\" )\n\t\t\t.html( this.buttonElement.find(\".ui-button-text\").html() );\n\n\t\tif ( !this.hasTitle ) {\n\t\t\tthis.buttonElement.removeAttr( \"title\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget().toggleClass( \"ui-state-disabled\", !!value );\n\t\t\tthis.element.prop( \"disabled\", !!value );\n\t\t\tif ( value ) {\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\n\t\t\t\t} else {\n\t\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus ui-state-active\" );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis._resetButton();\n\t},\n\n\trefresh: function() {\n\t\t//See #8237 & #8828\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ? this.element.is( \":disabled\" ) : this.element.hasClass( \"ui-button-disabled\" );\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOption( \"disabled\", isDisabled );\n\t\t}\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tradioGroup( this.element[0] ).each(function() {\n\t\t\t\tif ( $( this ).is( \":checked\" ) ) {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"checkbox\" ) {\n\t\t\tif ( this.element.is( \":checked\" ) ) {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t} else {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetButton: function() {\n\t\tif ( this.type === \"input\" ) {\n\t\t\tif ( this.options.label ) {\n\t\t\t\tthis.element.val( this.options.label );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tvar buttonElement = this.buttonElement.removeClass( typeClasses ),\n\t\t\tbuttonText = $( \"<span></span>\", this.document[0] )\n\t\t\t\t.addClass( \"ui-button-text\" )\n\t\t\t\t.html( this.options.label )\n\t\t\t\t.appendTo( buttonElement.empty() )\n\t\t\t\t.text(),\n\t\t\ticons = this.options.icons,\n\t\t\tmultipleIcons = icons.primary && icons.secondary,\n\t\t\tbuttonClasses = [];\n\n\t\tif ( icons.primary || icons.secondary ) {\n\t\t\tif ( this.options.text ) {\n\t\t\t\tbuttonClasses.push( \"ui-button-text-icon\" + ( multipleIcons ? \"s\" : ( icons.primary ? \"-primary\" : \"-secondary\" ) ) );\n\t\t\t}\n\n\t\t\tif ( icons.primary ) {\n\t\t\t\tbuttonElement.prepend( \"<span class='ui-button-icon-primary ui-icon \" + icons.primary + \"'></span>\" );\n\t\t\t}\n\n\t\t\tif ( icons.secondary ) {\n\t\t\t\tbuttonElement.append( \"<span class='ui-button-icon-secondary ui-icon \" + icons.secondary + \"'></span>\" );\n\t\t\t}\n\n\t\t\tif ( !this.options.text ) {\n\t\t\t\tbuttonClasses.push( multipleIcons ? \"ui-button-icons-only\" : \"ui-button-icon-only\" );\n\n\t\t\t\tif ( !this.hasTitle ) {\n\t\t\t\t\tbuttonElement.attr( \"title\", $.trim( buttonText ) );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbuttonClasses.push( \"ui-button-text-only\" );\n\t\t}\n\t\tbuttonElement.addClass( buttonClasses.join( \" \" ) );\n\t}\n});\n\n$.widget( \"ui.buttonset\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\titems: \"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)\"\n\t},\n\n\t_create: function() {\n\t\tthis.element.addClass( \"ui-buttonset\" );\n\t},\n\n\t_init: function() {\n\t\tthis.refresh();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.buttons.button( \"option\", key, value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\trefresh: function() {\n\t\tvar rtl = this.element.css( \"direction\" ) === \"rtl\",\n\t\t\tallButtons = this.element.find( this.options.items ),\n\t\t\texistingButtons = allButtons.filter( \":ui-button\" );\n\n\t\t// Initialize new buttons\n\t\tallButtons.not( \":ui-button\" ).button();\n\n\t\t// Refresh existing buttons\n\t\texistingButtons.button( \"refresh\" );\n\n\t\tthis.buttons = allButtons\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-all ui-corner-left ui-corner-right\" )\n\t\t\t\t.filter( \":first\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-right\" : \"ui-corner-left\" )\n\t\t\t\t.end()\n\t\t\t\t.filter( \":last\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-left\" : \"ui-corner-right\" )\n\t\t\t\t.end()\n\t\t\t.end();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeClass( \"ui-buttonset\" );\n\t\tthis.buttons\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-left ui-corner-right\" )\n\t\t\t.end()\n\t\t\t.button( \"destroy\" );\n\t}\n});\n\nvar button = $.ui.button;\n\n\n/*!\n * jQuery UI Datepicker 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/datepicker/\n */\n\n\n$.extend($.ui, { datepicker: { version: \"1.11.4\" } });\n\nvar datepicker_instActive;\n\nfunction datepicker_getZindex( elem ) {\n\tvar position, value;\n\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t// This makes behavior of this function consistent across browsers\n\t\t// WebKit always returns auto if the element is positioned\n\t\tposition = elem.css( \"position\" );\n\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t// other browsers return a string\n\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\telem = elem.parent();\n\t}\n\n\treturn 0;\n}\n/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. */\n\nfunction Datepicker() {\n\tthis._curInst = null; // The current instance in use\n\tthis._keyEvent = false; // If the last event was a key event\n\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\n\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\n\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\n\tthis._mainDivId = \"ui-datepicker-div\"; // The ID of the main datepicker division\n\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\n\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\n\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\n\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\n\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\n\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\n\tthis.regional = []; // Available regional settings, indexed by language code\n\tthis.regional[\"\"] = { // Default regional settings\n\t\tcloseText: \"Done\", // Display text for close link\n\t\tprevText: \"Prev\", // Display text for previous month link\n\t\tnextText: \"Next\", // Display text for next month link\n\t\tcurrentText: \"Today\", // Display text for current month link\n\t\tmonthNames: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\n\t\t\t\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"], // Names of months for drop-down and formatting\n\t\tmonthNamesShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], // For formatting\n\t\tdayNames: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], // For formatting\n\t\tdayNamesShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], // For formatting\n\t\tdayNamesMin: [\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"], // Column headings for days starting at Sunday\n\t\tweekHeader: \"Wk\", // Column header for week of the year\n\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\n\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\n\t\tisRTL: false, // True if right-to-left language, false if left-to-right\n\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\n\t\tyearSuffix: \"\" // Additional text to append to the year in the month headers\n\t};\n\tthis._defaults = { // Global defaults for all the date picker instances\n\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\n\t\t\t// \"button\" for trigger button, or \"both\" for either\n\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\n\t\tshowOptions: {}, // Options for enhanced animations\n\t\tdefaultDate: null, // Used when field is blank: actual date,\n\t\t\t// +/-number for offset from today, null for today\n\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\n\t\tbuttonText: \"...\", // Text for trigger button\n\t\tbuttonImage: \"\", // URL for trigger button image\n\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\n\t\thideIfNoPrevNext: false, // True to hide next/previous month links\n\t\t\t// if not applicable, false to just disable them\n\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\n\t\tgotoCurrent: false, // True if today link goes back to current selection instead\n\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\n\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\n\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\n\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\n\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\n\t\tshowWeek: false, // True to show week of the year, false to not show it\n\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\n\t\t\t// takes a Date and returns the number of the week for it\n\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\n\t\t\t// > this are in the previous century,\n\t\t\t// string value starting with \"+\" for current year + value\n\t\tminDate: null, // The earliest selectable date, or null for no limit\n\t\tmaxDate: null, // The latest selectable date, or null for no limit\n\t\tduration: \"fast\", // Duration of display/closure\n\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\n\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\tbeforeShow: null, // Function that takes an input field and\n\t\t\t// returns a set of custom settings for the date picker\n\t\tonSelect: null, // Define a callback function when a date is selected\n\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\n\t\tonClose: null, // Define a callback function when the datepicker is closed\n\t\tnumberOfMonths: 1, // Number of months to show at a time\n\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\n\t\tstepMonths: 1, // Number of months to step back/forward\n\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\n\t\taltField: \"\", // Selector for an alternate field to store selected dates into\n\t\taltFormat: \"\", // The date format to use for the alternate field\n\t\tconstrainInput: true, // The input is constrained by the current date format\n\t\tshowButtonPanel: false, // True to show button panel, false to not show it\n\t\tautoSize: false, // True to size the input for the date format, false to leave as is\n\t\tdisabled: false // The initial disabled state\n\t};\n\t$.extend(this._defaults, this.regional[\"\"]);\n\tthis.regional.en = $.extend( true, {}, this.regional[ \"\" ]);\n\tthis.regional[ \"en-US\" ] = $.extend( true, {}, this.regional.en );\n\tthis.dpDiv = datepicker_bindHover($(\"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\"));\n}\n\n$.extend(Datepicker.prototype, {\n\t/* Class name added to elements to indicate already configured with a date picker. */\n\tmarkerClassName: \"hasDatepicker\",\n\n\t//Keep track of the maximum number of rows displayed (see #7043)\n\tmaxRows: 4,\n\n\t// TODO rename to \"widget\" when switching to widget factory\n\t_widgetDatepicker: function() {\n\t\treturn this.dpDiv;\n\t},\n\n\t/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t */\n\tsetDefaults: function(settings) {\n\t\tdatepicker_extendRemove(this._defaults, settings || {});\n\t\treturn this;\n\t},\n\n\t/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t */\n\t_attachDatepicker: function(target, settings) {\n\t\tvar nodeName, inline, inst;\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tinline = (nodeName === \"div\" || nodeName === \"span\");\n\t\tif (!target.id) {\n\t\t\tthis.uuid += 1;\n\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t}\n\t\tinst = this._newInst($(target), inline);\n\t\tinst.settings = $.extend({}, settings || {});\n\t\tif (nodeName === \"input\") {\n\t\t\tthis._connectDatepicker(target, inst);\n\t\t} else if (inline) {\n\t\t\tthis._inlineDatepicker(target, inst);\n\t\t}\n\t},\n\n\t/* Create a new instance object. */\n\t_newInst: function(target, inline) {\n\t\tvar id = target[0].id.replace(/([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\"); // escape jQuery meta chars\n\t\treturn {id: id, input: target, // associated target\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\n\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\n\t\t\tinline: inline, // is datepicker inline or not\n\t\t\tdpDiv: (!inline ? this.dpDiv : // presentation div\n\t\t\tdatepicker_bindHover($(\"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\")))};\n\t},\n\n\t/* Attach the date picker to an input field. */\n\t_connectDatepicker: function(target, inst) {\n\t\tvar input = $(target);\n\t\tinst.append = $([]);\n\t\tinst.trigger = $([]);\n\t\tif (input.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._attachments(input, inst);\n\t\tinput.addClass(this.markerClassName).keydown(this._doKeyDown).\n\t\t\tkeypress(this._doKeyPress).keyup(this._doKeyUp);\n\t\tthis._autoSize(inst);\n\t\t$.data(target, \"datepicker\", inst);\n\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\tif( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t},\n\n\t/* Make attachments based on settings. */\n\t_attachments: function(input, inst) {\n\t\tvar showOn, buttonText, buttonImage,\n\t\t\tappendText = this._get(inst, \"appendText\"),\n\t\t\tisRTL = this._get(inst, \"isRTL\");\n\n\t\tif (inst.append) {\n\t\t\tinst.append.remove();\n\t\t}\n\t\tif (appendText) {\n\t\t\tinst.append = $(\"<span class='\" + this._appendClass + \"'>\" + appendText + \"</span>\");\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.append);\n\t\t}\n\n\t\tinput.unbind(\"focus\", this._showDatepicker);\n\n\t\tif (inst.trigger) {\n\t\t\tinst.trigger.remove();\n\t\t}\n\n\t\tshowOn = this._get(inst, \"showOn\");\n\t\tif (showOn === \"focus\" || showOn === \"both\") { // pop-up date picker when in the marked field\n\t\t\tinput.focus(this._showDatepicker);\n\t\t}\n\t\tif (showOn === \"button\" || showOn === \"both\") { // pop-up date picker when button clicked\n\t\t\tbuttonText = this._get(inst, \"buttonText\");\n\t\t\tbuttonImage = this._get(inst, \"buttonImage\");\n\t\t\tinst.trigger = $(this._get(inst, \"buttonImageOnly\") ?\n\t\t\t\t$(\"<img/>\").addClass(this._triggerClass).\n\t\t\t\t\tattr({ src: buttonImage, alt: buttonText, title: buttonText }) :\n\t\t\t\t$(\"<button type='button'></button>\").addClass(this._triggerClass).\n\t\t\t\t\thtml(!buttonImage ? buttonText : $(\"<img/>\").attr(\n\t\t\t\t\t{ src:buttonImage, alt:buttonText, title:buttonText })));\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.trigger);\n\t\t\tinst.trigger.click(function() {\n\t\t\t\tif ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t} else {\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t},\n\n\t/* Apply the maximum length for the date format. */\n\t_autoSize: function(inst) {\n\t\tif (this._get(inst, \"autoSize\") && !inst.inline) {\n\t\t\tvar findMax, max, maxI, i,\n\t\t\t\tdate = new Date(2009, 12 - 1, 20), // Ensure double digits\n\t\t\t\tdateFormat = this._get(inst, \"dateFormat\");\n\n\t\t\tif (dateFormat.match(/[DM]/)) {\n\t\t\t\tfindMax = function(names) {\n\t\t\t\t\tmax = 0;\n\t\t\t\t\tmaxI = 0;\n\t\t\t\t\tfor (i = 0; i < names.length; i++) {\n\t\t\t\t\t\tif (names[i].length > max) {\n\t\t\t\t\t\t\tmax = names[i].length;\n\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn maxI;\n\t\t\t\t};\n\t\t\t\tdate.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\"))));\n\t\t\t\tdate.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\"))) + 20 - date.getDay());\n\t\t\t}\n\t\t\tinst.input.attr(\"size\", this._formatDate(inst, date).length);\n\t\t}\n\t},\n\n\t/* Attach an inline date picker to a div. */\n\t_inlineDatepicker: function(target, inst) {\n\t\tvar divSpan = $(target);\n\t\tif (divSpan.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\t\tdivSpan.addClass(this.markerClassName).append(inst.dpDiv);\n\t\t$.data(target, \"datepicker\", inst);\n\t\tthis._setDate(inst, this._getDefaultDate(inst), true);\n\t\tthis._updateDatepicker(inst);\n\t\tthis._updateAlternate(inst);\n\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\tif( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\n\t\tinst.dpDiv.css( \"display\", \"block\" );\n\t},\n\n\t/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t */\n\t_dialogDatepicker: function(input, date, onSelect, settings, pos) {\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\n\t\t\tinst = this._dialogInst; // internal instance\n\n\t\tif (!inst) {\n\t\t\tthis.uuid += 1;\n\t\t\tid = \"dp\" + this.uuid;\n\t\t\tthis._dialogInput = $(\"<input type='text' id='\" + id +\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'/>\");\n\t\t\tthis._dialogInput.keydown(this._doKeyDown);\n\t\t\t$(\"body\").append(this._dialogInput);\n\t\t\tinst = this._dialogInst = this._newInst(this._dialogInput, false);\n\t\t\tinst.settings = {};\n\t\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\n\t\t}\n\t\tdatepicker_extendRemove(inst.settings, settings || {});\n\t\tdate = (date && date.constructor === Date ? this._formatDate(inst, date) : date);\n\t\tthis._dialogInput.val(date);\n\n\t\tthis._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);\n\t\tif (!this._pos) {\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\tthis._pos = // should use actual width/height below\n\t\t\t\t[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];\n\t\t}\n\n\t\t// move input on screen for focus, but hidden behind dialog\n\t\tthis._dialogInput.css(\"left\", (this._pos[0] + 20) + \"px\").css(\"top\", this._pos[1] + \"px\");\n\t\tinst.settings.onSelect = onSelect;\n\t\tthis._inDialog = true;\n\t\tthis.dpDiv.addClass(this._dialogClass);\n\t\tthis._showDatepicker(this._dialogInput[0]);\n\t\tif ($.blockUI) {\n\t\t\t$.blockUI(this.dpDiv);\n\t\t}\n\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\n\t\treturn this;\n\t},\n\n\t/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_destroyDatepicker: function(target) {\n\t\tvar nodeName,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, \"datepicker\");\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\t$.removeData(target, \"datepicker\");\n\t\tif (nodeName === \"input\") {\n\t\t\tinst.append.remove();\n\t\t\tinst.trigger.remove();\n\t\t\t$target.removeClass(this.markerClassName).\n\t\t\t\tunbind(\"focus\", this._showDatepicker).\n\t\t\t\tunbind(\"keydown\", this._doKeyDown).\n\t\t\t\tunbind(\"keypress\", this._doKeyPress).\n\t\t\t\tunbind(\"keyup\", this._doKeyUp);\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\t$target.removeClass(this.markerClassName).empty();\n\t\t}\n\n\t\tif ( datepicker_instActive === inst ) {\n\t\t\tdatepicker_instActive = null;\n\t\t}\n\t},\n\n\t/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_enableDatepicker: function(target) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, \"datepicker\");\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif (nodeName === \"input\") {\n\t\t\ttarget.disabled = false;\n\t\t\tinst.trigger.filter(\"button\").\n\t\t\t\teach(function() { this.disabled = false; }).end().\n\t\t\t\tfilter(\"img\").css({opacity: \"1.0\", cursor: \"\"});\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\tinline.children().removeClass(\"ui-state-disabled\");\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\n\t\t\t\tprop(\"disabled\", false);\n\t\t}\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\n\t\t\tfunction(value) { return (value === target ? null : value); }); // delete entry\n\t},\n\n\t/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_disableDatepicker: function(target) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, \"datepicker\");\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif (nodeName === \"input\") {\n\t\t\ttarget.disabled = true;\n\t\t\tinst.trigger.filter(\"button\").\n\t\t\t\teach(function() { this.disabled = true; }).end().\n\t\t\t\tfilter(\"img\").css({opacity: \"0.5\", cursor: \"default\"});\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\tinline.children().addClass(\"ui-state-disabled\");\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\n\t\t\t\tprop(\"disabled\", true);\n\t\t}\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\n\t\t\tfunction(value) { return (value === target ? null : value); }); // delete entry\n\t\tthis._disabledInputs[this._disabledInputs.length] = target;\n\t},\n\n\t/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t */\n\t_isDisabledDatepicker: function(target) {\n\t\tif (!target) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (var i = 0; i < this._disabledInputs.length; i++) {\n\t\t\tif (this._disabledInputs[i] === target) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t */\n\t_getInst: function(target) {\n\t\ttry {\n\t\t\treturn $.data(target, \"datepicker\");\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t}\n\t},\n\n\t/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t */\n\t_optionDatepicker: function(target, name, value) {\n\t\tvar settings, date, minDate, maxDate,\n\t\t\tinst = this._getInst(target);\n\n\t\tif (arguments.length === 2 && typeof name === \"string\") {\n\t\t\treturn (name === \"defaults\" ? $.extend({}, $.datepicker._defaults) :\n\t\t\t\t(inst ? (name === \"all\" ? $.extend({}, inst.settings) :\n\t\t\t\tthis._get(inst, name)) : null));\n\t\t}\n\n\t\tsettings = name || {};\n\t\tif (typeof name === \"string\") {\n\t\t\tsettings = {};\n\t\t\tsettings[name] = value;\n\t\t}\n\n\t\tif (inst) {\n\t\t\tif (this._curInst === inst) {\n\t\t\t\tthis._hideDatepicker();\n\t\t\t}\n\n\t\t\tdate = this._getDateDatepicker(target, true);\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\");\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\");\n\t\t\tdatepicker_extendRemove(inst.settings, settings);\n\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\n\t\t\tif (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {\n\t\t\t\tinst.settings.minDate = this._formatDate(inst, minDate);\n\t\t\t}\n\t\t\tif (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {\n\t\t\t\tinst.settings.maxDate = this._formatDate(inst, maxDate);\n\t\t\t}\n\t\t\tif ( \"disabled\" in settings ) {\n\t\t\t\tif ( settings.disabled ) {\n\t\t\t\t\tthis._disableDatepicker(target);\n\t\t\t\t} else {\n\t\t\t\t\tthis._enableDatepicker(target);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._attachments($(target), inst);\n\t\t\tthis._autoSize(inst);\n\t\t\tthis._setDate(inst, date);\n\t\t\tthis._updateAlternate(inst);\n\t\t\tthis._updateDatepicker(inst);\n\t\t}\n\t},\n\n\t// change method deprecated\n\t_changeDatepicker: function(target, name, value) {\n\t\tthis._optionDatepicker(target, name, value);\n\t},\n\n\t/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t */\n\t_refreshDatepicker: function(target) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst) {\n\t\t\tthis._updateDatepicker(inst);\n\t\t}\n\t},\n\n\t/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t */\n\t_setDateDatepicker: function(target, date) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst) {\n\t\t\tthis._setDate(inst, date);\n\t\t\tthis._updateDatepicker(inst);\n\t\t\tthis._updateAlternate(inst);\n\t\t}\n\t},\n\n\t/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t */\n\t_getDateDatepicker: function(target, noDefault) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst && !inst.inline) {\n\t\t\tthis._setDateFromField(inst, noDefault);\n\t\t}\n\t\treturn (inst ? this._getDate(inst) : null);\n\t},\n\n\t/* Handle keystrokes. */\n\t_doKeyDown: function(event) {\n\t\tvar onSelect, dateStr, sel,\n\t\t\tinst = $.datepicker._getInst(event.target),\n\t\t\thandled = true,\n\t\t\tisRTL = inst.dpDiv.is(\".ui-datepicker-rtl\");\n\n\t\tinst._keyEvent = true;\n\t\tif ($.datepicker._datepickerShowing) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\n\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\tbreak; // hide on tab out\n\t\t\t\tcase 13: sel = $(\"td.\" + $.datepicker._dayOverClass + \":not(.\" +\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv);\n\t\t\t\t\t\tif (sel[0]) {\n\t\t\t\t\t\t\t$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect = $.datepicker._get(inst, \"onSelect\");\n\t\t\t\t\t\tif (onSelect) {\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate(inst);\n\n\t\t\t\t\t\t\t// trigger custom callback\n\t\t\t\t\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false; // don't submit the form\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\n\t\t\t\t\t\tbreak; // hide on escape\n\t\t\t\tcase 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\n\t\t\t\tcase 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\n\t\t\t\tcase 35: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._clearDate(event.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // clear on ctrl or command +end\n\t\t\t\tcase 36: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._gotoToday(event.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // current on ctrl or command +home\n\t\t\t\tcase 37: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t// -1 day on ctrl or command +left\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// next month/year on alt +left on Mac\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 38: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, -7, \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\n\t\t\t\tcase 39: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t// +1 day on ctrl or command +right\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// next month/year on alt +right\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 40: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, +7, \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\n\t\t\t\tdefault: handled = false;\n\t\t\t}\n\t\t} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home\n\t\t\t$.datepicker._showDatepicker(this);\n\t\t} else {\n\t\t\thandled = false;\n\t\t}\n\n\t\tif (handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t/* Filter entered characters - based on date format. */\n\t_doKeyPress: function(event) {\n\t\tvar chars, chr,\n\t\t\tinst = $.datepicker._getInst(event.target);\n\n\t\tif ($.datepicker._get(inst, \"constrainInput\")) {\n\t\t\tchars = $.datepicker._possibleChars($.datepicker._get(inst, \"dateFormat\"));\n\t\t\tchr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);\n\t\t\treturn event.ctrlKey || event.metaKey || (chr < \" \" || !chars || chars.indexOf(chr) > -1);\n\t\t}\n\t},\n\n\t/* Synchronise manual entry and field/alternate field. */\n\t_doKeyUp: function(event) {\n\t\tvar date,\n\t\t\tinst = $.datepicker._getInst(event.target);\n\n\t\tif (inst.input.val() !== inst.lastVal) {\n\t\t\ttry {\n\t\t\t\tdate = $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\n\t\t\t\t\t(inst.input ? inst.input.val() : null),\n\t\t\t\t\t$.datepicker._getFormatConfig(inst));\n\n\t\t\t\tif (date) { // only if valid\n\t\t\t\t\t$.datepicker._setDateFromField(inst);\n\t\t\t\t\t$.datepicker._updateAlternate(inst);\n\t\t\t\t\t$.datepicker._updateDatepicker(inst);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\t/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t */\n\t_showDatepicker: function(input) {\n\t\tinput = input.target || input;\n\t\tif (input.nodeName.toLowerCase() !== \"input\") { // find from button/image trigger\n\t\t\tinput = $(\"input\", input.parentNode)[0];\n\t\t}\n\n\t\tif ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here\n\t\t\treturn;\n\t\t}\n\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\n\t\t\toffset, showAnim, duration;\n\n\t\tinst = $.datepicker._getInst(input);\n\t\tif ($.datepicker._curInst && $.datepicker._curInst !== inst) {\n\t\t\t$.datepicker._curInst.dpDiv.stop(true, true);\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );\n\t\t\t}\n\t\t}\n\n\t\tbeforeShow = $.datepicker._get(inst, \"beforeShow\");\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};\n\t\tif(beforeShowSettings === false){\n\t\t\treturn;\n\t\t}\n\t\tdatepicker_extendRemove(inst.settings, beforeShowSettings);\n\n\t\tinst.lastVal = null;\n\t\t$.datepicker._lastInput = input;\n\t\t$.datepicker._setDateFromField(inst);\n\n\t\tif ($.datepicker._inDialog) { // hide cursor\n\t\t\tinput.value = \"\";\n\t\t}\n\t\tif (!$.datepicker._pos) { // position below input\n\t\t\t$.datepicker._pos = $.datepicker._findPos(input);\n\t\t\t$.datepicker._pos[1] += input.offsetHeight; // add the height\n\t\t}\n\n\t\tisFixed = false;\n\t\t$(input).parents().each(function() {\n\t\t\tisFixed |= $(this).css(\"position\") === \"fixed\";\n\t\t\treturn !isFixed;\n\t\t});\n\n\t\toffset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};\n\t\t$.datepicker._pos = null;\n\t\t//to avoid flashes on Firefox\n\t\tinst.dpDiv.empty();\n\t\t// determine sizing offscreen\n\t\tinst.dpDiv.css({position: \"absolute\", display: \"block\", top: \"-1000px\"});\n\t\t$.datepicker._updateDatepicker(inst);\n\t\t// fix width for dynamic number of date pickers\n\t\t// and adjust position before showing\n\t\toffset = $.datepicker._checkOffset(inst, offset, isFixed);\n\t\tinst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?\n\t\t\t\"static\" : (isFixed ? \"fixed\" : \"absolute\")), display: \"none\",\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\"});\n\n\t\tif (!inst.inline) {\n\t\t\tshowAnim = $.datepicker._get(inst, \"showAnim\");\n\t\t\tduration = $.datepicker._get(inst, \"duration\");\n\t\t\tinst.dpDiv.css( \"z-index\", datepicker_getZindex( $( input ) ) + 1 );\n\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\n\t\t\t\tinst.dpDiv.show(showAnim, $.datepicker._get(inst, \"showOptions\"), duration);\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[showAnim || \"show\"](showAnim ? duration : null);\n\t\t\t}\n\n\t\t\tif ( $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\t\tinst.input.focus();\n\t\t\t}\n\n\t\t\t$.datepicker._curInst = inst;\n\t\t}\n\t},\n\n\t/* Generate the date picker content. */\n\t_updateDatepicker: function(inst) {\n\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\n\t\tdatepicker_instActive = inst; // for delegate hover events\n\t\tinst.dpDiv.empty().append(this._generateHTML(inst));\n\t\tthis._attachHandlers(inst);\n\n\t\tvar origyearshtml,\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\n\t\t\tcols = numMonths[1],\n\t\t\twidth = 17,\n\t\t\tactiveCell = inst.dpDiv.find( \".\" + this._dayOverClass + \" a\" );\n\n\t\tif ( activeCell.length > 0 ) {\n\t\t\tdatepicker_handleMouseover.apply( activeCell.get( 0 ) );\n\t\t}\n\n\t\tinst.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\");\n\t\tif (cols > 1) {\n\t\t\tinst.dpDiv.addClass(\"ui-datepicker-multi-\" + cols).css(\"width\", (width * cols) + \"em\");\n\t\t}\n\t\tinst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? \"add\" : \"remove\") +\n\t\t\t\"Class\"](\"ui-datepicker-multi\");\n\t\tinst.dpDiv[(this._get(inst, \"isRTL\") ? \"add\" : \"remove\") +\n\t\t\t\"Class\"](\"ui-datepicker-rtl\");\n\n\t\tif (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\tinst.input.focus();\n\t\t}\n\n\t\t// deffered render of the years select (to avoid flashes on Firefox)\n\t\tif( inst.yearshtml ){\n\t\t\torigyearshtml = inst.yearshtml;\n\t\t\tsetTimeout(function(){\n\t\t\t\t//assure that inst.yearshtml didn't change.\n\t\t\t\tif( origyearshtml === inst.yearshtml && inst.yearshtml ){\n\t\t\t\t\tinst.dpDiv.find(\"select.ui-datepicker-year:first\").replaceWith(inst.yearshtml);\n\t\t\t\t}\n\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t}, 0);\n\t\t}\n\t},\n\n\t// #6694 - don't focus the input if it's already focused\n\t// this breaks the change event in IE\n\t// Support: IE and jQuery <1.9\n\t_shouldFocusInput: function( inst ) {\n\t\treturn inst.input && inst.input.is( \":visible\" ) && !inst.input.is( \":disabled\" ) && !inst.input.is( \":focus\" );\n\t},\n\n\t/* Check positioning to remain on screen. */\n\t_checkOffset: function(inst, offset, isFixed) {\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\tviewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),\n\t\t\tviewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());\n\n\t\toffset.left -= (this._get(inst, \"isRTL\") ? (dpWidth - inputWidth) : 0);\n\t\toffset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;\n\t\toffset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;\n\n\t\t// now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\toffset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?\n\t\t\tMath.abs(offset.left + dpWidth - viewWidth) : 0);\n\t\toffset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?\n\t\t\tMath.abs(dpHeight + inputHeight) : 0);\n\n\t\treturn offset;\n\t},\n\n\t/* Find an object's position on the screen. */\n\t_findPos: function(obj) {\n\t\tvar position,\n\t\t\tinst = this._getInst(obj),\n\t\t\tisRTL = this._get(inst, \"isRTL\");\n\n\t\twhile (obj && (obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {\n\t\t\tobj = obj[isRTL ? \"previousSibling\" : \"nextSibling\"];\n\t\t}\n\n\t\tposition = $(obj).offset();\n\t\treturn [position.left, position.top];\n\t},\n\n\t/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t */\n\t_hideDatepicker: function(input) {\n\t\tvar showAnim, duration, postProcess, onClose,\n\t\t\tinst = this._curInst;\n\n\t\tif (!inst || (input && inst !== $.data(input, \"datepicker\"))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._datepickerShowing) {\n\t\t\tshowAnim = this._get(inst, \"showAnim\");\n\t\t\tduration = this._get(inst, \"duration\");\n\t\t\tpostProcess = function() {\n\t\t\t\t$.datepicker._tidyDialog(inst);\n\t\t\t};\n\n\t\t\t// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {\n\t\t\t\tinst.dpDiv.hide(showAnim, $.datepicker._get(inst, \"showOptions\"), duration, postProcess);\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[(showAnim === \"slideDown\" ? \"slideUp\" :\n\t\t\t\t\t(showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\"))]((showAnim ? duration : null), postProcess);\n\t\t\t}\n\n\t\t\tif (!showAnim) {\n\t\t\t\tpostProcess();\n\t\t\t}\n\t\t\tthis._datepickerShowing = false;\n\n\t\t\tonClose = this._get(inst, \"onClose\");\n\t\t\tif (onClose) {\n\t\t\t\tonClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : \"\"), inst]);\n\t\t\t}\n\n\t\t\tthis._lastInput = null;\n\t\t\tif (this._inDialog) {\n\t\t\t\tthis._dialogInput.css({ position: \"absolute\", left: \"0\", top: \"-100px\" });\n\t\t\t\tif ($.blockUI) {\n\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t$(\"body\").append(this.dpDiv);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._inDialog = false;\n\t\t}\n\t},\n\n\t/* Tidy up after a dialog display. */\n\t_tidyDialog: function(inst) {\n\t\tinst.dpDiv.removeClass(this._dialogClass).unbind(\".ui-datepicker-calendar\");\n\t},\n\n\t/* Close date picker if clicked elsewhere. */\n\t_checkExternalClick: function(event) {\n\t\tif (!$.datepicker._curInst) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $target = $(event.target),\n\t\t\tinst = $.datepicker._getInst($target[0]);\n\n\t\tif ( ( ( $target[0].id !== $.datepicker._mainDivId &&\n\t\t\t\t$target.parents(\"#\" + $.datepicker._mainDivId).length === 0 &&\n\t\t\t\t!$target.hasClass($.datepicker.markerClassName) &&\n\t\t\t\t!$target.closest(\".\" + $.datepicker._triggerClass).length &&\n\t\t\t\t$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||\n\t\t\t( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {\n\t\t\t\t$.datepicker._hideDatepicker();\n\t\t}\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustDate: function(id, offset, period) {\n\t\tvar target = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tif (this._isDisabledDatepicker(target[0])) {\n\t\t\treturn;\n\t\t}\n\t\tthis._adjustInstDate(inst, offset +\n\t\t\t(period === \"M\" ? this._get(inst, \"showCurrentAtPos\") : 0), // undo positioning\n\t\t\tperiod);\n\t\tthis._updateDatepicker(inst);\n\t},\n\n\t/* Action for current link. */\n\t_gotoToday: function(id) {\n\t\tvar date,\n\t\t\ttarget = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tif (this._get(inst, \"gotoCurrent\") && inst.currentDay) {\n\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t} else {\n\t\t\tdate = new Date();\n\t\t\tinst.selectedDay = date.getDate();\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t}\n\t\tthis._notifyChange(inst);\n\t\tthis._adjustDate(target);\n\t},\n\n\t/* Action for selecting a new month/year. */\n\t_selectMonthYear: function(id, select, period) {\n\t\tvar target = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tinst[\"selected\" + (period === \"M\" ? \"Month\" : \"Year\")] =\n\t\tinst[\"draw\" + (period === \"M\" ? \"Month\" : \"Year\")] =\n\t\t\tparseInt(select.options[select.selectedIndex].value,10);\n\n\t\tthis._notifyChange(inst);\n\t\tthis._adjustDate(target);\n\t},\n\n\t/* Action for selecting a day. */\n\t_selectDay: function(id, month, year, td) {\n\t\tvar inst,\n\t\t\ttarget = $(id);\n\n\t\tif ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {\n\t\t\treturn;\n\t\t}\n\n\t\tinst = this._getInst(target[0]);\n\t\tinst.selectedDay = inst.currentDay = $(\"a\", td).html();\n\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\tinst.selectedYear = inst.currentYear = year;\n\t\tthis._selectDate(id, this._formatDate(inst,\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear));\n\t},\n\n\t/* Erase the input field and hide the date picker. */\n\t_clearDate: function(id) {\n\t\tvar target = $(id);\n\t\tthis._selectDate(target, \"\");\n\t},\n\n\t/* Update the input field with the selected date. */\n\t_selectDate: function(id, dateStr) {\n\t\tvar onSelect,\n\t\t\ttarget = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tdateStr = (dateStr != null ? dateStr : this._formatDate(inst));\n\t\tif (inst.input) {\n\t\t\tinst.input.val(dateStr);\n\t\t}\n\t\tthis._updateAlternate(inst);\n\n\t\tonSelect = this._get(inst, \"onSelect\");\n\t\tif (onSelect) {\n\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback\n\t\t} else if (inst.input) {\n\t\t\tinst.input.trigger(\"change\"); // fire the change event\n\t\t}\n\n\t\tif (inst.inline){\n\t\t\tthis._updateDatepicker(inst);\n\t\t} else {\n\t\t\tthis._hideDatepicker();\n\t\t\tthis._lastInput = inst.input[0];\n\t\t\tif (typeof(inst.input[0]) !== \"object\") {\n\t\t\t\tinst.input.focus(); // restore focus\n\t\t\t}\n\t\t\tthis._lastInput = null;\n\t\t}\n\t},\n\n\t/* Update any alternate field to synchronise with the main field. */\n\t_updateAlternate: function(inst) {\n\t\tvar altFormat, date, dateStr,\n\t\t\taltField = this._get(inst, \"altField\");\n\n\t\tif (altField) { // update alternate field too\n\t\t\taltFormat = this._get(inst, \"altFormat\") || this._get(inst, \"dateFormat\");\n\t\t\tdate = this._getDate(inst);\n\t\t\tdateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));\n\t\t\t$(altField).each(function() { $(this).val(dateStr); });\n\t\t}\n\t},\n\n\t/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t */\n\tnoWeekends: function(date) {\n\t\tvar day = date.getDay();\n\t\treturn [(day > 0 && day < 6), \"\"];\n\t},\n\n\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t */\n\tiso8601Week: function(date) {\n\t\tvar time,\n\t\t\tcheckDate = new Date(date.getTime());\n\n\t\t// Find Thursday of this week starting on Monday\n\t\tcheckDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));\n\n\t\ttime = checkDate.getTime();\n\t\tcheckDate.setMonth(0); // Compare with Jan 1\n\t\tcheckDate.setDate(1);\n\t\treturn Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n\t},\n\n\t/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t */\n\tparseDate: function (format, value, settings) {\n\t\tif (format == null || value == null) {\n\t\t\tthrow \"Invalid arguments\";\n\t\t}\n\n\t\tvalue = (typeof value === \"object\" ? value.toString() : value + \"\");\n\t\tif (value === \"\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar iFormat, dim, extra,\n\t\t\tiValue = 0,\n\t\t\tshortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,\n\t\t\tshortYearCutoff = (typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\t\t\tyear = -1,\n\t\t\tmonth = -1,\n\t\t\tday = -1,\n\t\t\tdoy = -1,\n\t\t\tliteral = false,\n\t\t\tdate,\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\t\t\t// Extract a number from the string value\n\t\t\tgetNumber = function(match) {\n\t\t\t\tvar isDoubled = lookAhead(match),\n\t\t\t\t\tsize = (match === \"@\" ? 14 : (match === \"!\" ? 20 :\n\t\t\t\t\t(match === \"y\" && isDoubled ? 4 : (match === \"o\" ? 3 : 2)))),\n\t\t\t\t\tminSize = (match === \"y\" ? size : 1),\n\t\t\t\t\tdigits = new RegExp(\"^\\\\d{\" + minSize + \",\" + size + \"}\"),\n\t\t\t\t\tnum = value.substring(iValue).match(digits);\n\t\t\t\tif (!num) {\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue += num[0].length;\n\t\t\t\treturn parseInt(num[0], 10);\n\t\t\t},\n\t\t\t// Extract a name from the string value and convert to an index\n\t\t\tgetName = function(match, shortNames, longNames) {\n\t\t\t\tvar index = -1,\n\t\t\t\t\tnames = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {\n\t\t\t\t\t\treturn [ [k, v] ];\n\t\t\t\t\t}).sort(function (a, b) {\n\t\t\t\t\t\treturn -(a[1].length - b[1].length);\n\t\t\t\t\t});\n\n\t\t\t\t$.each(names, function (i, pair) {\n\t\t\t\t\tvar name = pair[1];\n\t\t\t\t\tif (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {\n\t\t\t\t\t\tindex = pair[0];\n\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\treturn index + 1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Confirm that a literal character matches the string value\n\t\t\tcheckLiteral = function() {\n\t\t\t\tif (value.charAt(iValue) !== format.charAt(iFormat)) {\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue++;\n\t\t\t};\n\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\tif (literal) {\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tday = getNumber(\"d\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\tgetName(\"D\", dayNamesShort, dayNames);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\tdoy = getNumber(\"o\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tmonth = getNumber(\"m\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tmonth = getName(\"M\", monthNamesShort, monthNames);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tyear = getNumber(\"y\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\tdate = new Date(getNumber(\"@\"));\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\tdate = new Date((getNumber(\"!\") - this._ticksTo1970) / 10000);\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif (lookAhead(\"'\")){\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (iValue < value.length){\n\t\t\textra = value.substr(iValue);\n\t\t\tif (!/^\\s+/.test(extra)) {\n\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\n\t\t\t}\n\t\t}\n\n\t\tif (year === -1) {\n\t\t\tyear = new Date().getFullYear();\n\t\t} else if (year < 100) {\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\n\t\t\t\t(year <= shortYearCutoff ? 0 : -100);\n\t\t}\n\n\t\tif (doy > -1) {\n\t\t\tmonth = 1;\n\t\t\tday = doy;\n\t\t\tdo {\n\t\t\t\tdim = this._getDaysInMonth(year, month - 1);\n\t\t\t\tif (day <= dim) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmonth++;\n\t\t\t\tday -= dim;\n\t\t\t} while (true);\n\t\t}\n\n\t\tdate = this._daylightSavingAdjust(new Date(year, month - 1, day));\n\t\tif (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {\n\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\n\t\t}\n\t\treturn date;\n\t},\n\n\t/* Standard date formats. */\n\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\n\tCOOKIE: \"D, dd M yy\",\n\tISO_8601: \"yy-mm-dd\",\n\tRFC_822: \"D, d M y\",\n\tRFC_850: \"DD, dd-M-y\",\n\tRFC_1036: \"D, d M y\",\n\tRFC_1123: \"D, d M yy\",\n\tRFC_2822: \"D, d M yy\",\n\tRSS: \"D, d M y\", // RFC 822\n\tTICKS: \"!\",\n\tTIMESTAMP: \"@\",\n\tW3C: \"yy-mm-dd\", // ISO 8601\n\n\t_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +\n\t\tMath.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),\n\n\t/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01/01/1970)\n\t * ! - Windows ticks (100ns since 01/01/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t */\n\tformatDate: function (format, date, settings) {\n\t\tif (!date) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar iFormat,\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\t\t\t// Format a number, with leading zero if necessary\n\t\t\tformatNumber = function(match, value, len) {\n\t\t\t\tvar num = \"\" + value;\n\t\t\t\tif (lookAhead(match)) {\n\t\t\t\t\twhile (num.length < len) {\n\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn num;\n\t\t\t},\n\t\t\t// Format a name, short or long as requested\n\t\t\tformatName = function(match, value, shortNames, longNames) {\n\t\t\t\treturn (lookAhead(match) ? longNames[value] : shortNames[value]);\n\t\t\t},\n\t\t\toutput = \"\",\n\t\t\tliteral = false;\n\n\t\tif (date) {\n\t\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\t\tif (literal) {\n\t\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\toutput += formatNumber(\"d\", date.getDate(), 2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\toutput += formatName(\"D\", date.getDay(), dayNamesShort, dayNames);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\toutput += formatNumber(\"o\",\n\t\t\t\t\t\t\t\tMath.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\toutput += formatNumber(\"m\", date.getMonth() + 1, 2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\toutput += formatName(\"M\", date.getMonth(), monthNamesShort, monthNames);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\toutput += (lookAhead(\"y\") ? date.getFullYear() :\n\t\t\t\t\t\t\t\t(date.getYear() % 100 < 10 ? \"0\" : \"\") + date.getYear() % 100);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t/* Extract all possible characters from the date format. */\n\t_possibleChars: function (format) {\n\t\tvar iFormat,\n\t\t\tchars = \"\",\n\t\t\tliteral = false,\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t};\n\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\tif (literal) {\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\n\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\": case \"M\":\n\t\t\t\t\t\treturn null; // Accept anything\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t},\n\n\t/* Get a setting value, defaulting if necessary. */\n\t_get: function(inst, name) {\n\t\treturn inst.settings[name] !== undefined ?\n\t\t\tinst.settings[name] : this._defaults[name];\n\t},\n\n\t/* Parse existing date and initialise date picker. */\n\t_setDateFromField: function(inst, noDefault) {\n\t\tif (inst.input.val() === inst.lastVal) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar dateFormat = this._get(inst, \"dateFormat\"),\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\tdefaultDate = this._getDefaultDate(inst),\n\t\t\tdate = defaultDate,\n\t\t\tsettings = this._getFormatConfig(inst);\n\n\t\ttry {\n\t\t\tdate = this.parseDate(dateFormat, dates, settings) || defaultDate;\n\t\t} catch (event) {\n\t\t\tdates = (noDefault ? \"\" : dates);\n\t\t}\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tinst.currentDay = (dates ? date.getDate() : 0);\n\t\tinst.currentMonth = (dates ? date.getMonth() : 0);\n\t\tinst.currentYear = (dates ? date.getFullYear() : 0);\n\t\tthis._adjustInstDate(inst);\n\t},\n\n\t/* Retrieve the default date shown on opening. */\n\t_getDefaultDate: function(inst) {\n\t\treturn this._restrictMinMax(inst,\n\t\t\tthis._determineDate(inst, this._get(inst, \"defaultDate\"), new Date()));\n\t},\n\n\t/* A date may be specified as an exact value or a relative one. */\n\t_determineDate: function(inst, date, defaultDate) {\n\t\tvar offsetNumeric = function(offset) {\n\t\t\t\tvar date = new Date();\n\t\t\t\tdate.setDate(date.getDate() + offset);\n\t\t\t\treturn date;\n\t\t\t},\n\t\t\toffsetString = function(offset) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig(inst));\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\tvar date = (offset.toLowerCase().match(/^c/) ?\n\t\t\t\t\t$.datepicker._getDate(inst) : null) || new Date(),\n\t\t\t\t\tyear = date.getFullYear(),\n\t\t\t\t\tmonth = date.getMonth(),\n\t\t\t\t\tday = date.getDate(),\n\t\t\t\t\tpattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\n\t\t\t\t\tmatches = pattern.exec(offset);\n\n\t\t\t\twhile (matches) {\n\t\t\t\t\tswitch (matches[2] || \"d\") {\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\n\t\t\t\t\t\t\tday += parseInt(matches[1],10); break;\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\n\t\t\t\t\t\t\tday += parseInt(matches[1],10) * 7; break;\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\n\t\t\t\t\t\t\tmonth += parseInt(matches[1],10);\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\n\t\t\t\t\t\t\tyear += parseInt(matches[1],10);\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tmatches = pattern.exec(offset);\n\t\t\t\t}\n\t\t\t\treturn new Date(year, month, day);\n\t\t\t},\n\t\t\tnewDate = (date == null || date === \"\" ? defaultDate : (typeof date === \"string\" ? offsetString(date) :\n\t\t\t\t(typeof date === \"number\" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));\n\n\t\tnewDate = (newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate);\n\t\tif (newDate) {\n\t\t\tnewDate.setHours(0);\n\t\t\tnewDate.setMinutes(0);\n\t\t\tnewDate.setSeconds(0);\n\t\t\tnewDate.setMilliseconds(0);\n\t\t}\n\t\treturn this._daylightSavingAdjust(newDate);\n\t},\n\n\t/* Handle switch to/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t */\n\t_daylightSavingAdjust: function(date) {\n\t\tif (!date) {\n\t\t\treturn null;\n\t\t}\n\t\tdate.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\n\t\treturn date;\n\t},\n\n\t/* Set the date(s) directly. */\n\t_setDate: function(inst, date, noChange) {\n\t\tvar clear = !date,\n\t\t\torigMonth = inst.selectedMonth,\n\t\t\torigYear = inst.selectedYear,\n\t\t\tnewDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));\n\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\tif ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {\n\t\t\tthis._notifyChange(inst);\n\t\t}\n\t\tthis._adjustInstDate(inst);\n\t\tif (inst.input) {\n\t\t\tinst.input.val(clear ? \"\" : this._formatDate(inst));\n\t\t}\n\t},\n\n\t/* Retrieve the date(s) directly. */\n\t_getDate: function(inst) {\n\t\tvar startDate = (!inst.currentYear || (inst.input && inst.input.val() === \"\") ? null :\n\t\t\tthis._daylightSavingAdjust(new Date(\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay)));\n\t\t\treturn startDate;\n\t},\n\n\t/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t */\n\t_attachHandlers: function(inst) {\n\t\tvar stepMonths = this._get(inst, \"stepMonths\"),\n\t\t\tid = \"#\" + inst.id.replace( /\\\\\\\\/g, \"\\\\\" );\n\t\tinst.dpDiv.find(\"[data-handler]\").map(function () {\n\t\t\tvar handler = {\n\t\t\t\tprev: function () {\n\t\t\t\t\t$.datepicker._adjustDate(id, -stepMonths, \"M\");\n\t\t\t\t},\n\t\t\t\tnext: function () {\n\t\t\t\t\t$.datepicker._adjustDate(id, +stepMonths, \"M\");\n\t\t\t\t},\n\t\t\t\thide: function () {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t},\n\t\t\t\ttoday: function () {\n\t\t\t\t\t$.datepicker._gotoToday(id);\n\t\t\t\t},\n\t\t\t\tselectDay: function () {\n\t\t\t\t\t$.datepicker._selectDay(id, +this.getAttribute(\"data-month\"), +this.getAttribute(\"data-year\"), this);\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectMonth: function () {\n\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"M\");\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectYear: function () {\n\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"Y\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t$(this).bind(this.getAttribute(\"data-event\"), handler[this.getAttribute(\"data-handler\")]);\n\t\t});\n\t},\n\n\t/* Generate the HTML for the current state of the date picker. */\n\t_generateHTML: function(inst) {\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\n\t\t\ttempDate = new Date(),\n\t\t\ttoday = this._daylightSavingAdjust(\n\t\t\t\tnew Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time\n\t\t\tisRTL = this._get(inst, \"isRTL\"),\n\t\t\tshowButtonPanel = this._get(inst, \"showButtonPanel\"),\n\t\t\thideIfNoPrevNext = this._get(inst, \"hideIfNoPrevNext\"),\n\t\t\tnavigationAsDateFormat = this._get(inst, \"navigationAsDateFormat\"),\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\n\t\t\tshowCurrentAtPos = this._get(inst, \"showCurrentAtPos\"),\n\t\t\tstepMonths = this._get(inst, \"stepMonths\"),\n\t\t\tisMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),\n\t\t\tcurrentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :\n\t\t\t\tnew Date(inst.currentYear, inst.currentMonth, inst.currentDay))),\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\tdrawYear = inst.drawYear;\n\n\t\tif (drawMonth < 0) {\n\t\t\tdrawMonth += 12;\n\t\t\tdrawYear--;\n\t\t}\n\t\tif (maxDate) {\n\t\t\tmaxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),\n\t\t\t\tmaxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));\n\t\t\tmaxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);\n\t\t\twhile (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {\n\t\t\t\tdrawMonth--;\n\t\t\t\tif (drawMonth < 0) {\n\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinst.drawMonth = drawMonth;\n\t\tinst.drawYear = drawYear;\n\n\t\tprevText = this._get(inst, \"prevText\");\n\t\tprevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),\n\t\t\tthis._getFormatConfig(inst)));\n\n\t\tprev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?\n\t\t\t\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'\" +\n\t\t\t\" title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"</span></a>\" :\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\"+ prevText +\"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"</span></a>\"));\n\n\t\tnextText = this._get(inst, \"nextText\");\n\t\tnextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),\n\t\t\tthis._getFormatConfig(inst)));\n\n\t\tnext = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?\n\t\t\t\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'\" +\n\t\t\t\" title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"</span></a>\" :\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\"+ nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"</span></a>\"));\n\n\t\tcurrentText = this._get(inst, \"currentText\");\n\t\tgotoDate = (this._get(inst, \"gotoCurrent\") && inst.currentDay ? currentDate : today);\n\t\tcurrentText = (!navigationAsDateFormat ? currentText :\n\t\t\tthis.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));\n\n\t\tcontrols = (!inst.inline ? \"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\" +\n\t\t\tthis._get(inst, \"closeText\") + \"</button>\" : \"\");\n\n\t\tbuttonPanel = (showButtonPanel) ? \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" + (isRTL ? controls : \"\") +\n\t\t\t(this._isInRange(inst, gotoDate) ? \"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'\" +\n\t\t\t\">\" + currentText + \"</button>\" : \"\") + (isRTL ? \"\" : controls) + \"</div>\" : \"\";\n\n\t\tfirstDay = parseInt(this._get(inst, \"firstDay\"),10);\n\t\tfirstDay = (isNaN(firstDay) ? 0 : firstDay);\n\n\t\tshowWeek = this._get(inst, \"showWeek\");\n\t\tdayNames = this._get(inst, \"dayNames\");\n\t\tdayNamesMin = this._get(inst, \"dayNamesMin\");\n\t\tmonthNames = this._get(inst, \"monthNames\");\n\t\tmonthNamesShort = this._get(inst, \"monthNamesShort\");\n\t\tbeforeShowDay = this._get(inst, \"beforeShowDay\");\n\t\tshowOtherMonths = this._get(inst, \"showOtherMonths\");\n\t\tselectOtherMonths = this._get(inst, \"selectOtherMonths\");\n\t\tdefaultDate = this._getDefaultDate(inst);\n\t\thtml = \"\";\n\t\tdow;\n\t\tfor (row = 0; row < numMonths[0]; row++) {\n\t\t\tgroup = \"\";\n\t\t\tthis.maxRows = 4;\n\t\t\tfor (col = 0; col < numMonths[1]; col++) {\n\t\t\t\tselectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));\n\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\tcalender = \"\";\n\t\t\t\tif (isMultiMonth) {\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\n\t\t\t\t\tif (numMonths[1] > 1) {\n\t\t\t\t\t\tswitch (col) {\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"right\" : \"left\"); break;\n\t\t\t\t\t\t\tcase numMonths[1]-1: calender += \" ui-datepicker-group-last\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"left\" : \"right\"); break;\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcalender += \"'>\";\n\t\t\t\t}\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\n\t\t\t\t\t(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : \"\") +\n\t\t\t\t\t(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : \"\") +\n\t\t\t\t\tthis._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers\n\t\t\t\t\t\"</div><table class='ui-datepicker-calendar'><thead>\" +\n\t\t\t\t\t\"<tr>\";\n\t\t\t\tthead = (showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get(inst, \"weekHeader\") + \"</th>\" : \"\");\n\t\t\t\tfor (dow = 0; dow < 7; dow++) { // days of the week\n\t\t\t\t\tday = (dow + firstDay) % 7;\n\t\t\t\t\tthead += \"<th scope='col'\" + ((dow + firstDay + 6) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\") + \">\" +\n\t\t\t\t\t\t\"<span title='\" + dayNames[day] + \"'>\" + dayNamesMin[day] + \"</span></th>\";\n\t\t\t\t}\n\t\t\t\tcalender += thead + \"</tr></thead><tbody>\";\n\t\t\t\tdaysInMonth = this._getDaysInMonth(drawYear, drawMonth);\n\t\t\t\tif (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {\n\t\t\t\t\tinst.selectedDay = Math.min(inst.selectedDay, daysInMonth);\n\t\t\t\t}\n\t\t\t\tleadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;\n\t\t\t\tcurRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate\n\t\t\t\tnumRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)\n\t\t\t\tthis.maxRows = numRows;\n\t\t\t\tprintDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));\n\t\t\t\tfor (dRow = 0; dRow < numRows; dRow++) { // create date picker rows\n\t\t\t\t\tcalender += \"<tr>\";\n\t\t\t\t\ttbody = (!showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\n\t\t\t\t\t\tthis._get(inst, \"calculateWeek\")(printDate) + \"</td>\");\n\t\t\t\t\tfor (dow = 0; dow < 7; dow++) { // create date picker days\n\t\t\t\t\t\tdaySettings = (beforeShowDay ?\n\t\t\t\t\t\t\tbeforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, \"\"]);\n\t\t\t\t\t\totherMonth = (printDate.getMonth() !== drawMonth);\n\t\t\t\t\t\tunselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||\n\t\t\t\t\t\t\t(minDate && printDate < minDate) || (maxDate && printDate > maxDate);\n\t\t\t\t\t\ttbody += \"<td class='\" +\n\t\t\t\t\t\t\t((dow + firstDay + 6) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\") + // highlight weekends\n\t\t\t\t\t\t\t(otherMonth ? \" ui-datepicker-other-month\" : \"\") + // highlight days from other months\n\t\t\t\t\t\t\t((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key\n\t\t\t\t\t\t\t(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?\n\t\t\t\t\t\t\t// or defaultDate is current printedDate and defaultDate is selectedDate\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\") + // highlight selected day\n\t\t\t\t\t\t\t(unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\": \"\") +  // highlight unselectable days\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[1] + // highlight custom dates\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\") + // highlight selected day\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\")) + \"'\" + // highlight today (if different)\n\t\t\t\t\t\t\t((!otherMonth || showOtherMonths) && daySettings[2] ? \" title='\" + daySettings[2].replace(/'/g, \"&#39;\") + \"'\" : \"\") + // cell title\n\t\t\t\t\t\t\t(unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\") + \">\" + // actions\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \"&#xa0;\" : // display for other months\n\t\t\t\t\t\t\t(unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"</span>\" : \"<a class='ui-state-default\" +\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\") +\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\") + // highlight selected day\n\t\t\t\t\t\t\t(otherMonth ? \" ui-priority-secondary\" : \"\") + // distinguish dates from other months\n\t\t\t\t\t\t\t\"' href='#'>\" + printDate.getDate() + \"</a>\")) + \"</td>\"; // display selectable date\n\t\t\t\t\t\tprintDate.setDate(printDate.getDate() + 1);\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust(printDate);\n\t\t\t\t\t}\n\t\t\t\t\tcalender += tbody + \"</tr>\";\n\t\t\t\t}\n\t\t\t\tdrawMonth++;\n\t\t\t\tif (drawMonth > 11) {\n\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\tdrawYear++;\n\t\t\t\t}\n\t\t\t\tcalender += \"</tbody></table>\" + (isMultiMonth ? \"</div>\" +\n\t\t\t\t\t\t\t((numMonths[0] > 0 && col === numMonths[1]-1) ? \"<div class='ui-datepicker-row-break'></div>\" : \"\") : \"\");\n\t\t\t\tgroup += calender;\n\t\t\t}\n\t\t\thtml += group;\n\t\t}\n\t\thtml += buttonPanel;\n\t\tinst._keyEvent = false;\n\t\treturn html;\n\t},\n\n\t/* Generate the month and year header. */\n\t_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\tsecondary, monthNames, monthNamesShort) {\n\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\n\t\t\tchangeMonth = this._get(inst, \"changeMonth\"),\n\t\t\tchangeYear = this._get(inst, \"changeYear\"),\n\t\t\tshowMonthAfterYear = this._get(inst, \"showMonthAfterYear\"),\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\n\t\t\tmonthHtml = \"\";\n\n\t\t// month selection\n\t\tif (secondary || !changeMonth) {\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[drawMonth] + \"</span>\";\n\t\t} else {\n\t\t\tinMinYear = (minDate && minDate.getFullYear() === drawYear);\n\t\t\tinMaxYear = (maxDate && maxDate.getFullYear() === drawYear);\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\";\n\t\t\tfor ( month = 0; month < 12; month++) {\n\t\t\t\tif ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\n\t\t\t\t\t\t(month === drawMonth ? \" selected='selected'\" : \"\") +\n\t\t\t\t\t\t\">\" + monthNamesShort[month] + \"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonthHtml += \"</select>\";\n\t\t}\n\n\t\tif (!showMonthAfterYear) {\n\t\t\thtml += monthHtml + (secondary || !(changeMonth && changeYear) ? \"&#xa0;\" : \"\");\n\t\t}\n\n\t\t// year selection\n\t\tif ( !inst.yearshtml ) {\n\t\t\tinst.yearshtml = \"\";\n\t\t\tif (secondary || !changeYear) {\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"</span>\";\n\t\t\t} else {\n\t\t\t\t// determine range of years to display\n\t\t\t\tyears = this._get(inst, \"yearRange\").split(\":\");\n\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\tdetermineYear = function(value) {\n\t\t\t\t\tvar year = (value.match(/c[+\\-].*/) ? drawYear + parseInt(value.substring(1), 10) :\n\t\t\t\t\t\t(value.match(/[+\\-].*/) ? thisYear + parseInt(value, 10) :\n\t\t\t\t\t\tparseInt(value, 10)));\n\t\t\t\t\treturn (isNaN(year) ? thisYear : year);\n\t\t\t\t};\n\t\t\t\tyear = determineYear(years[0]);\n\t\t\t\tendYear = Math.max(year, determineYear(years[1] || \"\"));\n\t\t\t\tyear = (minDate ? Math.max(year, minDate.getFullYear()) : year);\n\t\t\t\tendYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";\n\t\t\t\tfor (; year <= endYear; year++) {\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\n\t\t\t\t\t\t(year === drawYear ? \" selected='selected'\" : \"\") +\n\t\t\t\t\t\t\">\" + year + \"</option>\";\n\t\t\t\t}\n\t\t\t\tinst.yearshtml += \"</select>\";\n\n\t\t\t\thtml += inst.yearshtml;\n\t\t\t\tinst.yearshtml = null;\n\t\t\t}\n\t\t}\n\n\t\thtml += this._get(inst, \"yearSuffix\");\n\t\tif (showMonthAfterYear) {\n\t\t\thtml += (secondary || !(changeMonth && changeYear) ? \"&#xa0;\" : \"\") + monthHtml;\n\t\t}\n\t\thtml += \"</div>\"; // Close datepicker_header\n\t\treturn html;\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustInstDate: function(inst, offset, period) {\n\t\tvar year = inst.drawYear + (period === \"Y\" ? offset : 0),\n\t\t\tmonth = inst.drawMonth + (period === \"M\" ? offset : 0),\n\t\t\tday = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === \"D\" ? offset : 0),\n\t\t\tdate = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));\n\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tif (period === \"M\" || period === \"Y\") {\n\t\t\tthis._notifyChange(inst);\n\t\t}\n\t},\n\n\t/* Ensure a date is within any min/max bounds. */\n\t_restrictMinMax: function(inst, date) {\n\t\tvar minDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tnewDate = (minDate && date < minDate ? minDate : date);\n\t\treturn (maxDate && newDate > maxDate ? maxDate : newDate);\n\t},\n\n\t/* Notify change of month/year. */\n\t_notifyChange: function(inst) {\n\t\tvar onChange = this._get(inst, \"onChangeMonthYear\");\n\t\tif (onChange) {\n\t\t\tonChange.apply((inst.input ? inst.input[0] : null),\n\t\t\t\t[inst.selectedYear, inst.selectedMonth + 1, inst]);\n\t\t}\n\t},\n\n\t/* Determine the number of months to show. */\n\t_getNumberOfMonths: function(inst) {\n\t\tvar numMonths = this._get(inst, \"numberOfMonths\");\n\t\treturn (numMonths == null ? [1, 1] : (typeof numMonths === \"number\" ? [1, numMonths] : numMonths));\n\t},\n\n\t/* Determine the current maximum date - ensure no time components are set. */\n\t_getMinMaxDate: function(inst, minMax) {\n\t\treturn this._determineDate(inst, this._get(inst, minMax + \"Date\"), null);\n\t},\n\n\t/* Find the number of days in a given month. */\n\t_getDaysInMonth: function(year, month) {\n\t\treturn 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();\n\t},\n\n\t/* Find the day of the week of the first of a month. */\n\t_getFirstDayOfMonth: function(year, month) {\n\t\treturn new Date(year, month, 1).getDay();\n\t},\n\n\t/* Determines if we should allow a \"next/prev\" month display change. */\n\t_canAdjustMonth: function(inst, offset, curYear, curMonth) {\n\t\tvar numMonths = this._getNumberOfMonths(inst),\n\t\t\tdate = this._daylightSavingAdjust(new Date(curYear,\n\t\t\tcurMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));\n\n\t\tif (offset < 0) {\n\t\t\tdate.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));\n\t\t}\n\t\treturn this._isInRange(inst, date);\n\t},\n\n\t/* Is the given date in the accepted range? */\n\t_isInRange: function(inst, date) {\n\t\tvar yearSplit, currentYear,\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tminYear = null,\n\t\t\tmaxYear = null,\n\t\t\tyears = this._get(inst, \"yearRange\");\n\t\t\tif (years){\n\t\t\t\tyearSplit = years.split(\":\");\n\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\tminYear = parseInt(yearSplit[0], 10);\n\t\t\t\tmaxYear = parseInt(yearSplit[1], 10);\n\t\t\t\tif ( yearSplit[0].match(/[+\\-].*/) ) {\n\t\t\t\t\tminYear += currentYear;\n\t\t\t\t}\n\t\t\t\tif ( yearSplit[1].match(/[+\\-].*/) ) {\n\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn ((!minDate || date.getTime() >= minDate.getTime()) &&\n\t\t\t(!maxDate || date.getTime() <= maxDate.getTime()) &&\n\t\t\t(!minYear || date.getFullYear() >= minYear) &&\n\t\t\t(!maxYear || date.getFullYear() <= maxYear));\n\t},\n\n\t/* Provide the configuration settings for formatting/parsing. */\n\t_getFormatConfig: function(inst) {\n\t\tvar shortYearCutoff = this._get(inst, \"shortYearCutoff\");\n\t\tshortYearCutoff = (typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\n\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));\n\t\treturn {shortYearCutoff: shortYearCutoff,\n\t\t\tdayNamesShort: this._get(inst, \"dayNamesShort\"), dayNames: this._get(inst, \"dayNames\"),\n\t\t\tmonthNamesShort: this._get(inst, \"monthNamesShort\"), monthNames: this._get(inst, \"monthNames\")};\n\t},\n\n\t/* Format the given date for display. */\n\t_formatDate: function(inst, day, month, year) {\n\t\tif (!day) {\n\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\tinst.currentYear = inst.selectedYear;\n\t\t}\n\t\tvar date = (day ? (typeof day === \"object\" ? day :\n\t\t\tthis._daylightSavingAdjust(new Date(year, month, day))) :\n\t\t\tthis._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));\n\t\treturn this.formatDate(this._get(inst, \"dateFormat\"), date, this._getFormatConfig(inst));\n\t}\n});\n\n/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */\nfunction datepicker_bindHover(dpDiv) {\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\treturn dpDiv.delegate(selector, \"mouseout\", function() {\n\t\t\t$(this).removeClass(\"ui-state-hover\");\n\t\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t\t$(this).removeClass(\"ui-datepicker-prev-hover\");\n\t\t\t}\n\t\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t\t$(this).removeClass(\"ui-datepicker-next-hover\");\n\t\t\t}\n\t\t})\n\t\t.delegate( selector, \"mouseover\", datepicker_handleMouseover );\n}\n\nfunction datepicker_handleMouseover() {\n\tif (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {\n\t\t$(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\");\n\t\t$(this).addClass(\"ui-state-hover\");\n\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t$(this).addClass(\"ui-datepicker-prev-hover\");\n\t\t}\n\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t$(this).addClass(\"ui-datepicker-next-hover\");\n\t\t}\n\t}\n}\n\n/* jQuery extend now ignores nulls! */\nfunction datepicker_extendRemove(target, props) {\n\t$.extend(target, props);\n\tfor (var name in props) {\n\t\tif (props[name] == null) {\n\t\t\ttarget[name] = props[name];\n\t\t}\n\t}\n\treturn target;\n}\n\n/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object */\n$.fn.datepicker = function(options){\n\n\t/* Verify an empty collection wasn't passed - Fixes #6976 */\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\t/* Initialise the date picker. */\n\tif (!$.datepicker.initialized) {\n\t\t$(document).mousedown($.datepicker._checkExternalClick);\n\t\t$.datepicker.initialized = true;\n\t}\n\n\t/* Append datepicker main container to body if not exist. */\n\tif ($(\"#\"+$.datepicker._mainDivId).length === 0) {\n\t\t$(\"body\").append($.datepicker.dpDiv);\n\t}\n\n\tvar otherArgs = Array.prototype.slice.call(arguments, 1);\n\tif (typeof options === \"string\" && (options === \"isDisabled\" || options === \"getDate\" || options === \"widget\")) {\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\n\t}\n\tif (options === \"option\" && arguments.length === 2 && typeof arguments[1] === \"string\") {\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\n\t}\n\treturn this.each(function() {\n\t\ttypeof options === \"string\" ?\n\t\t\t$.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\t\tapply($.datepicker, [this].concat(otherArgs)) :\n\t\t\t$.datepicker._attachDatepicker(this, options);\n\t});\n};\n\n$.datepicker = new Datepicker(); // singleton instance\n$.datepicker.initialized = false;\n$.datepicker.uuid = new Date().getTime();\n$.datepicker.version = \"1.11.4\";\n\nvar datepicker = $.datepicker;\n\n\n/*!\n * jQuery UI Draggable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/draggable/\n */\n\n\n$.widget(\"ui.draggable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false,\n\n\t\t// callbacks\n\t\tdrag: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tif ( this.options.helper === \"original\" ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\t\tif (this.options.addClasses){\n\t\t\tthis.element.addClass(\"ui-draggable\");\n\t\t}\n\t\tif (this.options.disabled){\n\t\t\tthis.element.addClass(\"ui-draggable-disabled\");\n\t\t}\n\t\tthis._setHandleClassName();\n\n\t\tthis._mouseInit();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._removeHandleClassName();\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( ( this.helper || this.element ).is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis.destroyOnClear = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.element.removeClass( \"ui-draggable ui-draggable-dragging ui-draggable-disabled\" );\n\t\tthis._removeHandleClassName();\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function(event) {\n\t\tvar o = this.options;\n\n\t\tthis._blurActiveElement( event );\n\n\t\t// among others, prevent a drag on a resizable-handle\n\t\tif (this.helper || o.disabled || $(event.target).closest(\".ui-resizable-handle\").length > 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle(event);\n\t\tif (!this.handle) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._blockFrames( o.iframeFix === true ? \"iframe\" : o.iframeFix );\n\n\t\treturn true;\n\n\t},\n\n\t_blockFrames: function( selector ) {\n\t\tthis.iframeBlocks = this.document.find( selector ).map(function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( \"position\", \"absolute\" )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.outerWidth( iframe.outerWidth() )\n\t\t\t\t.outerHeight( iframe.outerHeight() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t});\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_blurActiveElement: function( event ) {\n\t\tvar document = this.document[ 0 ];\n\n\t\t// Only need to blur if the event occurred on the draggable itself, see #10527\n\t\tif ( !this.handleElement.is( event.target ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// support: IE9\n\t\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\n\t\ttry {\n\n\t\t\t// Support: IE9, IE10\n\t\t\t// If the <body> is blurred, IE will switch windows, see #9520\n\t\t\tif ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== \"body\" ) {\n\n\t\t\t\t// Blur any element that currently has focus, see #4261\n\t\t\t\t$( document.activeElement ).blur();\n\t\t\t}\n\t\t} catch ( error ) {}\n\t},\n\n\t_mouseStart: function(event) {\n\n\t\tvar o = this.options;\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\tthis.helper.addClass(\"ui-draggable-dragging\");\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//If ddmanager is used for droppables, set the global draggable\n\t\tif ($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Store the helper's css position\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\t\tthis.scrollParent = this.helper.scrollParent( true );\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tthis.hasFixedAncestor = this.helper.parents().filter(function() {\n\t\t\t\treturn $( this ).css( \"position\" ) === \"fixed\";\n\t\t\t}).length > 0;\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.positionAbs = this.element.offset();\n\t\tthis._refreshOffsets( event );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition( event, false );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t//Set a containment if given in the options\n\t\tthis._setContainment();\n\n\t\t//Trigger event + callbacks\n\t\tif (this._trigger(\"start\", event) === false) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t//Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//Prepare the droppable offsets\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\t\t// Reset helper's right/bottom css if they're set and set explicit width/height instead\n\t\t// as this prevents resizing of elements with right/bottom set (see #7772)\n\t\tthis._normalizeRightBottom();\n\n\t\tthis._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position\n\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStart(this, event);\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_refreshOffsets: function( event ) {\n\t\tthis.offset = {\n\t\t\ttop: this.positionAbs.top - this.margins.top,\n\t\t\tleft: this.positionAbs.left - this.margins.left,\n\t\t\tscroll: false,\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset()\n\t\t};\n\n\t\tthis.offset.click = {\n\t\t\tleft: event.pageX - this.offset.left,\n\t\t\ttop: event.pageY - this.offset.top\n\t\t};\n\t},\n\n\t_mouseDrag: function(event, noPropagation) {\n\t\t// reset any necessary cached properties (see #5009)\n\t\tif ( this.hasFixedAncestor ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event, true );\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\n\t\tif (!noPropagation) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif (this._trigger(\"drag\", event, ui) === false) {\n\t\t\t\tthis._mouseUp({});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\n\t\tif ($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tvar that = this,\n\t\t\tdropped = false;\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\tdropped = $.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\t//if a drop comes from outside (a sortable)\n\t\tif (this.dropped) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\n\t\tif ((this.options.revert === \"invalid\" && !dropped) || (this.options.revert === \"valid\" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {\n\t\t\t$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {\n\t\t\t\tif (that._trigger(\"stop\", event) !== false) {\n\t\t\t\t\tthat._clear();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif (this._trigger(\"stop\", event) !== false) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis._unblockFrames();\n\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStop(this, event);\n\t\t}\n\n\t\t// Only need to focus if the event occurred on the draggable itself, see #10527\n\t\tif ( this.handleElement.is( event.target ) ) {\n\t\t\t// The interaction is over; whether or not the click resulted in a drag, focus the element\n\t\t\tthis.element.focus();\n\t\t}\n\n\t\treturn $.ui.mouse.prototype._mouseUp.call(this, event);\n\t},\n\n\tcancel: function() {\n\n\t\tif (this.helper.is(\".ui-draggable-dragging\")) {\n\t\t\tthis._mouseUp({});\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t_getHandle: function(event) {\n\t\treturn this.options.handle ?\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\n\t\t\ttrue;\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.handleElement = this.options.handle ?\n\t\t\tthis.element.find( this.options.handle ) : this.element;\n\t\tthis.handleElement.addClass( \"ui-draggable-handle\" );\n\t},\n\n\t_removeHandleClassName: function() {\n\t\tthis.handleElement.removeClass( \"ui-draggable-handle\" );\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelperIsFunction = $.isFunction( o.helper ),\n\t\t\thelper = helperIsFunction ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ?\n\t\t\t\t\tthis.element.clone().removeAttr( \"id\" ) :\n\t\t\t\t\tthis.element );\n\n\t\tif (!helper.parents(\"body\").length) {\n\t\t\thelper.appendTo((o.appendTo === \"parent\" ? this.element[0].parentNode : o.appendTo));\n\t\t}\n\n\t\t// http://bugs.jqueryui.com/ticket/9446\n\t\t// a helper function can return the original element\n\t\t// which wouldn't have been set to relative in _create\n\t\tif ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\n\t\tif (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css(\"position\"))) {\n\t\t\thelper.css(\"position\", \"absolute\");\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_setPositionRelative: function() {\n\t\tif ( !( /^(?:r|a|f)/ ).test( this.element.css( \"position\" ) ) ) {\n\t\t\tthis.element[ 0 ].style.position = \"relative\";\n\t\t}\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = { left: +obj[0], top: +obj[1] || 0 };\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_isRootNode: function( element ) {\n\t\treturn ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tvar po = this.offsetParent.offset(),\n\t\t\tdocument = this.document[ 0 ];\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif (this.cssPosition === \"absolute\" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\tif ( this._isRootNode( this.offsetParent[ 0 ] ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"), 10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"), 10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\t\tif ( this.cssPosition !== \"relative\" ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\tvar p = this.element.position(),\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: p.top - ( parseInt(this.helper.css( \"top\" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),\n\t\t\tleft: p.left - ( parseInt(this.helper.css( \"left\" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )\n\t\t};\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.element.css(\"marginLeft\"), 10) || 0),\n\t\t\ttop: (parseInt(this.element.css(\"marginTop\"), 10) || 0),\n\t\t\tright: (parseInt(this.element.css(\"marginRight\"), 10) || 0),\n\t\t\tbottom: (parseInt(this.element.css(\"marginBottom\"), 10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar isUserScrollable, c, ce,\n\t\t\to = this.options,\n\t\t\tdocument = this.document[ 0 ];\n\n\t\tthis.relativeContainer = null;\n\n\t\tif ( !o.containment ) {\n\t\t\tthis.containment = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"document\") {\n\t\t\tthis.containment = [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t$( document ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment.constructor === Array ) {\n\t\t\tthis.containment = o.containment;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\n\t\tc = $( o.containment );\n\t\tce = c[ 0 ];\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisUserScrollable = /(scroll|auto)/.test( c.css( \"overflow\" ) );\n\n\t\tthis.containment = [\n\t\t\t( parseInt( c.css( \"borderLeftWidth\" ), 10 ) || 0 ) + ( parseInt( c.css( \"paddingLeft\" ), 10 ) || 0 ),\n\t\t\t( parseInt( c.css( \"borderTopWidth\" ), 10 ) || 0 ) + ( parseInt( c.css( \"paddingTop\" ), 10 ) || 0 ),\n\t\t\t( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t( parseInt( c.css( \"borderRightWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.width -\n\t\t\t\tthis.margins.left -\n\t\t\t\tthis.margins.right,\n\t\t\t( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t( parseInt( c.css( \"borderBottomWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.height -\n\t\t\t\tthis.margins.top -\n\t\t\t\tthis.margins.bottom\n\t\t];\n\t\tthis.relativeContainer = c;\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif (!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event, constrainPosition ) {\n\n\t\tvar containment, co, top, left,\n\t\t\to = this.options,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY;\n\n\t\t// Cache the scroll\n\t\tif ( !scrollIsRootNode || !this.offset.scroll ) {\n\t\t\tthis.offset.scroll = {\n\t\t\t\ttop: this.scrollParent.scrollTop(),\n\t\t\t\tleft: this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\t// If we are not dragging yet, we won't check for options\n\t\tif ( constrainPosition ) {\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( this.relativeContainer ){\n\t\t\t\t\tco = this.relativeContainer.offset();\n\t\t\t\t\tcontainment = [\n\t\t\t\t\t\tthis.containment[ 0 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 1 ] + co.top,\n\t\t\t\t\t\tthis.containment[ 2 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 3 ] + co.top\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\tcontainment = this.containment;\n\t\t\t\t}\n\n\t\t\t\tif (event.pageX - this.offset.click.left < containment[0]) {\n\t\t\t\t\tpageX = containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif (event.pageY - this.offset.click.top < containment[1]) {\n\t\t\t\t\tpageY = containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif (event.pageX - this.offset.click.left > containment[2]) {\n\t\t\t\t\tpageX = containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif (event.pageY - this.offset.click.top > containment[3]) {\n\t\t\t\t\tpageY = containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (o.grid) {\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)\n\t\t\t\ttop = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;\n\t\t\t\tpageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;\n\t\t\t\tpageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"y\" ) {\n\t\t\t\tpageX = this.originalPageX;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"x\" ) {\n\t\t\t\tpageY = this.originalPageY;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.top\t-\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top -\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( this.cssPosition === \"fixed\" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left -\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( this.cssPosition === \"fixed\" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis.helper.removeClass(\"ui-draggable-dragging\");\n\t\tif (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t\tif ( this.destroyOnClear ) {\n\t\t\tthis.destroy();\n\t\t}\n\t},\n\n\t_normalizeRightBottom: function() {\n\t\tif ( this.options.axis !== \"y\" && this.helper.css( \"right\" ) !== \"auto\" ) {\n\t\t\tthis.helper.width( this.helper.width() );\n\t\t\tthis.helper.css( \"right\", \"auto\" );\n\t\t}\n\t\tif ( this.options.axis !== \"x\" && this.helper.css( \"bottom\" ) !== \"auto\" ) {\n\t\t\tthis.helper.height( this.helper.height() );\n\t\t\tthis.helper.css( \"bottom\", \"auto\" );\n\t\t}\n\t},\n\n\t// From now on bulk stuff - mainly helpers\n\n\t_trigger: function( type, event, ui ) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call( this, type, [ event, ui, this ], true );\n\n\t\t// Absolute position and offset (see #6884 ) have to be recalculated after plugins\n\t\tif ( /^(drag|start|stop)/.test( type ) ) {\n\t\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\t\t\tui.offset = this.positionAbs;\n\t\t}\n\t\treturn $.Widget.prototype._trigger.call( this, type, event, ui );\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function() {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n});\n\n$.ui.plugin.add( \"draggable\", \"connectToSortable\", {\n\tstart: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t});\n\n\t\tdraggable.sortables = [];\n\t\t$( draggable.options.connectToSortable ).each(function() {\n\t\t\tvar sortable = $( this ).sortable( \"instance\" );\n\n\t\t\tif ( sortable && !sortable.options.disabled ) {\n\t\t\t\tdraggable.sortables.push( sortable );\n\n\t\t\t\t// refreshPositions is called at drag start to refresh the containerCache\n\t\t\t\t// which is used in drag. This ensures it's initialized and synchronized\n\t\t\t\t// with any changes that might have happened on the page since initialization.\n\t\t\t\tsortable.refreshPositions();\n\t\t\t\tsortable._trigger(\"activate\", event, uiSortable);\n\t\t\t}\n\t\t});\n\t},\n\tstop: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t});\n\n\t\tdraggable.cancelHelperRemoval = false;\n\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar sortable = this;\n\n\t\t\tif ( sortable.isOver ) {\n\t\t\t\tsortable.isOver = 0;\n\n\t\t\t\t// Allow this sortable to handle removing the helper\n\t\t\t\tdraggable.cancelHelperRemoval = true;\n\t\t\t\tsortable.cancelHelperRemoval = false;\n\n\t\t\t\t// Use _storedCSS To restore properties in the sortable,\n\t\t\t\t// as this also handles revert (#9675) since the draggable\n\t\t\t\t// may have modified them in unexpected ways (#8809)\n\t\t\t\tsortable._storedCSS = {\n\t\t\t\t\tposition: sortable.placeholder.css( \"position\" ),\n\t\t\t\t\ttop: sortable.placeholder.css( \"top\" ),\n\t\t\t\t\tleft: sortable.placeholder.css( \"left\" )\n\t\t\t\t};\n\n\t\t\t\tsortable._mouseStop(event);\n\n\t\t\t\t// Once drag has ended, the sortable should return to using\n\t\t\t\t// its original helper, not the shared helper from draggable\n\t\t\t\tsortable.options.helper = sortable.options._helper;\n\t\t\t} else {\n\t\t\t\t// Prevent this Sortable from removing the helper.\n\t\t\t\t// However, don't set the draggable to remove the helper\n\t\t\t\t// either as another connected Sortable may yet handle the removal.\n\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\tsortable._trigger( \"deactivate\", event, uiSortable );\n\t\t\t}\n\t\t});\n\t},\n\tdrag: function( event, ui, draggable ) {\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar innermostIntersecting = false,\n\t\t\t\tsortable = this;\n\n\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\tsortable.positionAbs = draggable.positionAbs;\n\t\t\tsortable.helperProportions = draggable.helperProportions;\n\t\t\tsortable.offset.click = draggable.offset.click;\n\n\t\t\tif ( sortable._intersectsWith( sortable.containerCache ) ) {\n\t\t\t\tinnermostIntersecting = true;\n\n\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\t\t\tthis.positionAbs = draggable.positionAbs;\n\t\t\t\t\tthis.helperProportions = draggable.helperProportions;\n\t\t\t\t\tthis.offset.click = draggable.offset.click;\n\n\t\t\t\t\tif ( this !== sortable &&\n\t\t\t\t\t\t\tthis._intersectsWith( this.containerCache ) &&\n\t\t\t\t\t\t\t$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {\n\t\t\t\t\t\tinnermostIntersecting = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn innermostIntersecting;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( innermostIntersecting ) {\n\t\t\t\t// If it intersects, we use a little isOver variable and set it once,\n\t\t\t\t// so that the move-in stuff gets fired only once.\n\t\t\t\tif ( !sortable.isOver ) {\n\t\t\t\t\tsortable.isOver = 1;\n\n\t\t\t\t\t// Store draggable's parent in case we need to reappend to it later.\n\t\t\t\t\tdraggable._parent = ui.helper.parent();\n\n\t\t\t\t\tsortable.currentItem = ui.helper\n\t\t\t\t\t\t.appendTo( sortable.element )\n\t\t\t\t\t\t.data( \"ui-sortable-item\", true );\n\n\t\t\t\t\t// Store helper option to later restore it\n\t\t\t\t\tsortable.options._helper = sortable.options.helper;\n\n\t\t\t\t\tsortable.options.helper = function() {\n\t\t\t\t\t\treturn ui.helper[ 0 ];\n\t\t\t\t\t};\n\n\t\t\t\t\t// Fire the start events of the sortable with our passed browser event,\n\t\t\t\t\t// and our own helper (so it doesn't create a new one)\n\t\t\t\t\tevent.target = sortable.currentItem[ 0 ];\n\t\t\t\t\tsortable._mouseCapture( event, true );\n\t\t\t\t\tsortable._mouseStart( event, true, true );\n\n\t\t\t\t\t// Because the browser event is way off the new appended portlet,\n\t\t\t\t\t// modify necessary variables to reflect the changes\n\t\t\t\t\tsortable.offset.click.top = draggable.offset.click.top;\n\t\t\t\t\tsortable.offset.click.left = draggable.offset.click.left;\n\t\t\t\t\tsortable.offset.parent.left -= draggable.offset.parent.left -\n\t\t\t\t\t\tsortable.offset.parent.left;\n\t\t\t\t\tsortable.offset.parent.top -= draggable.offset.parent.top -\n\t\t\t\t\t\tsortable.offset.parent.top;\n\n\t\t\t\t\tdraggable._trigger( \"toSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is in a valid drop zone,\n\t\t\t\t\t// used solely in the revert option to handle \"valid/invalid\".\n\t\t\t\t\tdraggable.dropped = sortable.element;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables in the case that\n\t\t\t\t\t// adding to one sortable changes the location of the other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t});\n\n\t\t\t\t\t// hack so receive/update callbacks work (mostly)\n\t\t\t\t\tdraggable.currentItem = draggable.element;\n\t\t\t\t\tsortable.fromOutside = draggable;\n\t\t\t\t}\n\n\t\t\t\tif ( sortable.currentItem ) {\n\t\t\t\t\tsortable._mouseDrag( event );\n\t\t\t\t\t// Copy the sortable's position because the draggable's can potentially reflect\n\t\t\t\t\t// a relative position, while sortable is always absolute, which the dragged\n\t\t\t\t\t// element has now become. (#8809)\n\t\t\t\t\tui.position = sortable.position;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t// we fake the drag stop of the sortable, but make sure it doesn't remove\n\t\t\t\t// the helper by using cancelHelperRemoval.\n\t\t\t\tif ( sortable.isOver ) {\n\n\t\t\t\t\tsortable.isOver = 0;\n\t\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\t\t// Calling sortable's mouseStop would trigger a revert,\n\t\t\t\t\t// so revert must be temporarily false until after mouseStop is called.\n\t\t\t\t\tsortable.options._revert = sortable.options.revert;\n\t\t\t\t\tsortable.options.revert = false;\n\n\t\t\t\t\tsortable._trigger( \"out\", event, sortable._uiHash( sortable ) );\n\t\t\t\t\tsortable._mouseStop( event, true );\n\n\t\t\t\t\t// restore sortable behaviors that were modfied\n\t\t\t\t\t// when the draggable entered the sortable area (#9481)\n\t\t\t\t\tsortable.options.revert = sortable.options._revert;\n\t\t\t\t\tsortable.options.helper = sortable.options._helper;\n\n\t\t\t\t\tif ( sortable.placeholder ) {\n\t\t\t\t\t\tsortable.placeholder.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Restore and recalculate the draggable's offset considering the sortable\n\t\t\t\t\t// may have modified them in unexpected ways. (#8809, #10669)\n\t\t\t\t\tui.helper.appendTo( draggable._parent );\n\t\t\t\t\tdraggable._refreshOffsets( event );\n\t\t\t\t\tui.position = draggable._generatePosition( event, true );\n\n\t\t\t\t\tdraggable._trigger( \"fromSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is no longer in a valid drop zone\n\t\t\t\t\tdraggable.dropped = false;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables just in case removing\n\t\t\t\t\t// from one sortable changes the location of other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"cursor\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( \"body\" ),\n\t\t\to = instance.options;\n\n\t\tif (t.css(\"cursor\")) {\n\t\t\to._cursor = t.css(\"cursor\");\n\t\t}\n\t\tt.css(\"cursor\", o.cursor);\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif (o._cursor) {\n\t\t\t$(\"body\").css(\"cursor\", o._cursor);\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"opacity\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\t\tif (t.css(\"opacity\")) {\n\t\t\to._opacity = t.css(\"opacity\");\n\t\t}\n\t\tt.css(\"opacity\", o.opacity);\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif (o._opacity) {\n\t\t\t$(ui.helper).css(\"opacity\", o._opacity);\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"scroll\", {\n\tstart: function( event, ui, i ) {\n\t\tif ( !i.scrollParentNotHidden ) {\n\t\t\ti.scrollParentNotHidden = i.helper.scrollParent( false );\n\t\t}\n\n\t\tif ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== \"HTML\" ) {\n\t\t\ti.overflowOffset = i.scrollParentNotHidden.offset();\n\t\t}\n\t},\n\tdrag: function( event, ui, i  ) {\n\n\t\tvar o = i.options,\n\t\t\tscrolled = false,\n\t\t\tscrollParent = i.scrollParentNotHidden[ 0 ],\n\t\t\tdocument = i.document[ 0 ];\n\n\t\tif ( scrollParent !== document && scrollParent.tagName !== \"HTML\" ) {\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif (!o.axis || o.axis !== \"x\") {\n\t\t\t\tif (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!o.axis || o.axis !== \"y\") {\n\t\t\t\tif (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(i, event);\n\t\t}\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"snap\", {\n\tstart: function( event, ui, i ) {\n\n\t\tvar o = i.options;\n\n\t\ti.snapElements = [];\n\n\t\t$(o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap).each(function() {\n\t\t\tvar $t = $(this),\n\t\t\t\t$o = $t.offset();\n\t\t\tif (this !== i.element[0]) {\n\t\t\t\ti.snapElements.push({\n\t\t\t\t\titem: this,\n\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t},\n\tdrag: function( event, ui, inst ) {\n\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\n\t\t\to = inst.options,\n\t\t\td = o.snapTolerance,\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor (i = inst.snapElements.length - 1; i >= 0; i--){\n\n\t\t\tl = inst.snapElements[i].left - inst.margins.left;\n\t\t\tr = l + inst.snapElements[i].width;\n\t\t\tt = inst.snapElements[i].top - inst.margins.top;\n\t\t\tb = t + inst.snapElements[i].height;\n\n\t\t\tif ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {\n\t\t\t\tif (inst.snapElements[i].snapping) {\n\t\t\t\t\t(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\t\t}\n\t\t\t\tinst.snapElements[i].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (o.snapMode !== \"inner\") {\n\t\t\t\tts = Math.abs(t - y2) <= d;\n\t\t\t\tbs = Math.abs(b - y1) <= d;\n\t\t\t\tls = Math.abs(l - x2) <= d;\n\t\t\t\trs = Math.abs(r - x1) <= d;\n\t\t\t\tif (ts) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t - inst.helperProportions.height, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (bs) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (ls) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l - inst.helperProportions.width }).left;\n\t\t\t\t}\n\t\t\t\tif (rs) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r }).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = (ts || bs || ls || rs);\n\n\t\t\tif (o.snapMode !== \"outer\") {\n\t\t\t\tts = Math.abs(t - y1) <= d;\n\t\t\t\tbs = Math.abs(b - y2) <= d;\n\t\t\t\tls = Math.abs(l - x1) <= d;\n\t\t\t\trs = Math.abs(r - x2) <= d;\n\t\t\t\tif (ts) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (bs) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b - inst.helperProportions.height, left: 0 }).top;\n\t\t\t\t}\n\t\t\t\tif (ls) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l }).left;\n\t\t\t\t}\n\t\t\t\tif (rs) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r - inst.helperProportions.width }).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {\n\t\t\t\t(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\t}\n\t\t\tinst.snapElements[i].snapping = (ts || bs || ls || rs || first);\n\n\t\t}\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"stack\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar min,\n\t\t\to = instance.options,\n\t\t\tgroup = $.makeArray($(o.stack)).sort(function(a, b) {\n\t\t\t\treturn (parseInt($(a).css(\"zIndex\"), 10) || 0) - (parseInt($(b).css(\"zIndex\"), 10) || 0);\n\t\t\t});\n\n\t\tif (!group.length) { return; }\n\n\t\tmin = parseInt($(group[0]).css(\"zIndex\"), 10) || 0;\n\t\t$(group).each(function(i) {\n\t\t\t$(this).css(\"zIndex\", min + i);\n\t\t});\n\t\tthis.css(\"zIndex\", (min + group.length));\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"zIndex\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\n\t\tif (t.css(\"zIndex\")) {\n\t\t\to._zIndex = t.css(\"zIndex\");\n\t\t}\n\t\tt.css(\"zIndex\", o.zIndex);\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\n\t\tif (o._zIndex) {\n\t\t\t$(ui.helper).css(\"zIndex\", o._zIndex);\n\t\t}\n\t}\n});\n\nvar draggable = $.ui.draggable;\n\n\n/*!\n * jQuery UI Resizable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/resizable/\n */\n\n\n$.widget(\"ui.resizable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"resize\",\n\toptions: {\n\t\talsoResize: false,\n\t\tanimate: false,\n\t\tanimateDuration: \"slow\",\n\t\tanimateEasing: \"swing\",\n\t\taspectRatio: false,\n\t\tautoHide: false,\n\t\tcontainment: false,\n\t\tghost: false,\n\t\tgrid: false,\n\t\thandles: \"e,s,se\",\n\t\thelper: false,\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 10,\n\t\tminWidth: 10,\n\t\t// See #7960\n\t\tzIndex: 90,\n\n\t\t// callbacks\n\t\tresize: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_num: function( value ) {\n\t\treturn parseInt( value, 10 ) || 0;\n\t},\n\n\t_isNumber: function( value ) {\n\t\treturn !isNaN( parseInt( value, 10 ) );\n\t},\n\n\t_hasScroll: function( el, a ) {\n\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t},\n\n\t_create: function() {\n\n\t\tvar n, i, handle, axis, hname,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\t\tthis.element.addClass(\"ui-resizable\");\n\n\t\t$.extend(this, {\n\t\t\t_aspectRatio: !!(o.aspectRatio),\n\t\t\taspectRatio: o.aspectRatio,\n\t\t\toriginalElement: this.element,\n\t\t\t_proportionallyResizeElements: [],\n\t\t\t_helper: o.helper || o.ghost || o.animate ? o.helper || \"ui-resizable-helper\" : null\n\t\t});\n\n\t\t// Wrap the element if it cannot hold child nodes\n\t\tif (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {\n\n\t\t\tthis.element.wrap(\n\t\t\t\t$(\"<div class='ui-wrapper' style='overflow: hidden;'></div>\").css({\n\t\t\t\t\tposition: this.element.css(\"position\"),\n\t\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\t\ttop: this.element.css(\"top\"),\n\t\t\t\t\tleft: this.element.css(\"left\")\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tthis.element = this.element.parent().data(\n\t\t\t\t\"ui-resizable\", this.element.resizable( \"instance\" )\n\t\t\t);\n\n\t\t\tthis.elementIsWrapper = true;\n\n\t\t\tthis.element.css({\n\t\t\t\tmarginLeft: this.originalElement.css(\"marginLeft\"),\n\t\t\t\tmarginTop: this.originalElement.css(\"marginTop\"),\n\t\t\t\tmarginRight: this.originalElement.css(\"marginRight\"),\n\t\t\t\tmarginBottom: this.originalElement.css(\"marginBottom\")\n\t\t\t});\n\t\t\tthis.originalElement.css({\n\t\t\t\tmarginLeft: 0,\n\t\t\t\tmarginTop: 0,\n\t\t\t\tmarginRight: 0,\n\t\t\t\tmarginBottom: 0\n\t\t\t});\n\t\t\t// support: Safari\n\t\t\t// Prevent Safari textarea resize\n\t\t\tthis.originalResizeStyle = this.originalElement.css(\"resize\");\n\t\t\tthis.originalElement.css(\"resize\", \"none\");\n\n\t\t\tthis._proportionallyResizeElements.push( this.originalElement.css({\n\t\t\t\tposition: \"static\",\n\t\t\t\tzoom: 1,\n\t\t\t\tdisplay: \"block\"\n\t\t\t}) );\n\n\t\t\t// support: IE9\n\t\t\t// avoid IE jump (hard set the margin)\n\t\t\tthis.originalElement.css({ margin: this.originalElement.css(\"margin\") });\n\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tthis.handles = o.handles ||\n\t\t\t( !$(\".ui-resizable-handle\", this.element).length ?\n\t\t\t\t\"e,s,se\" : {\n\t\t\t\t\tn: \".ui-resizable-n\",\n\t\t\t\t\te: \".ui-resizable-e\",\n\t\t\t\t\ts: \".ui-resizable-s\",\n\t\t\t\t\tw: \".ui-resizable-w\",\n\t\t\t\t\tse: \".ui-resizable-se\",\n\t\t\t\t\tsw: \".ui-resizable-sw\",\n\t\t\t\t\tne: \".ui-resizable-ne\",\n\t\t\t\t\tnw: \".ui-resizable-nw\"\n\t\t\t\t} );\n\n\t\tthis._handles = $();\n\t\tif ( this.handles.constructor === String ) {\n\n\t\t\tif ( this.handles === \"all\") {\n\t\t\t\tthis.handles = \"n,e,s,w,se,sw,ne,nw\";\n\t\t\t}\n\n\t\t\tn = this.handles.split(\",\");\n\t\t\tthis.handles = {};\n\n\t\t\tfor (i = 0; i < n.length; i++) {\n\n\t\t\t\thandle = $.trim(n[i]);\n\t\t\t\thname = \"ui-resizable-\" + handle;\n\t\t\t\taxis = $(\"<div class='ui-resizable-handle \" + hname + \"'></div>\");\n\n\t\t\t\taxis.css({ zIndex: o.zIndex });\n\n\t\t\t\t// TODO : What's going on here?\n\t\t\t\tif (\"se\" === handle) {\n\t\t\t\t\taxis.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\");\n\t\t\t\t}\n\n\t\t\t\tthis.handles[handle] = \".ui-resizable-\" + handle;\n\t\t\t\tthis.element.append(axis);\n\t\t\t}\n\n\t\t}\n\n\t\tthis._renderAxis = function(target) {\n\n\t\t\tvar i, axis, padPos, padWrapper;\n\n\t\t\ttarget = target || this.element;\n\n\t\t\tfor (i in this.handles) {\n\n\t\t\t\tif (this.handles[i].constructor === String) {\n\t\t\t\t\tthis.handles[i] = this.element.children( this.handles[ i ] ).first().show();\n\t\t\t\t} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {\n\t\t\t\t\tthis.handles[ i ] = $( this.handles[ i ] );\n\t\t\t\t\tthis._on( this.handles[ i ], { \"mousedown\": that._mouseDown });\n\t\t\t\t}\n\n\t\t\t\tif (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {\n\n\t\t\t\t\taxis = $(this.handles[i], this.element);\n\n\t\t\t\t\tpadWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();\n\n\t\t\t\t\tpadPos = [ \"padding\",\n\t\t\t\t\t\t/ne|nw|n/.test(i) ? \"Top\" :\n\t\t\t\t\t\t/se|sw|s/.test(i) ? \"Bottom\" :\n\t\t\t\t\t\t/^e$/.test(i) ? \"Right\" : \"Left\" ].join(\"\");\n\n\t\t\t\t\ttarget.css(padPos, padWrapper);\n\n\t\t\t\t\tthis._proportionallyResize();\n\t\t\t\t}\n\n\t\t\t\tthis._handles = this._handles.add( this.handles[ i ] );\n\t\t\t}\n\t\t};\n\n\t\t// TODO: make renderAxis a prototype function\n\t\tthis._renderAxis(this.element);\n\n\t\tthis._handles = this._handles.add( this.element.find( \".ui-resizable-handle\" ) );\n\t\tthis._handles.disableSelection();\n\n\t\tthis._handles.mouseover(function() {\n\t\t\tif (!that.resizing) {\n\t\t\t\tif (this.className) {\n\t\t\t\t\taxis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);\n\t\t\t\t}\n\t\t\t\tthat.axis = axis && axis[1] ? axis[1] : \"se\";\n\t\t\t}\n\t\t});\n\n\t\tif (o.autoHide) {\n\t\t\tthis._handles.hide();\n\t\t\t$(this.element)\n\t\t\t\t.addClass(\"ui-resizable-autohide\")\n\t\t\t\t.mouseenter(function() {\n\t\t\t\t\tif (o.disabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t$(this).removeClass(\"ui-resizable-autohide\");\n\t\t\t\t\tthat._handles.show();\n\t\t\t\t})\n\t\t\t\t.mouseleave(function() {\n\t\t\t\t\tif (o.disabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!that.resizing) {\n\t\t\t\t\t\t$(this).addClass(\"ui-resizable-autohide\");\n\t\t\t\t\t\tthat._handles.hide();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\tthis._mouseInit();\n\t},\n\n\t_destroy: function() {\n\n\t\tthis._mouseDestroy();\n\n\t\tvar wrapper,\n\t\t\t_destroy = function(exp) {\n\t\t\t\t$(exp)\n\t\t\t\t\t.removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\")\n\t\t\t\t\t.removeData(\"resizable\")\n\t\t\t\t\t.removeData(\"ui-resizable\")\n\t\t\t\t\t.unbind(\".resizable\")\n\t\t\t\t\t.find(\".ui-resizable-handle\")\n\t\t\t\t\t\t.remove();\n\t\t\t};\n\n\t\t// TODO: Unwrap at same DOM position\n\t\tif (this.elementIsWrapper) {\n\t\t\t_destroy(this.element);\n\t\t\twrapper = this.element;\n\t\t\tthis.originalElement.css({\n\t\t\t\tposition: wrapper.css(\"position\"),\n\t\t\t\twidth: wrapper.outerWidth(),\n\t\t\t\theight: wrapper.outerHeight(),\n\t\t\t\ttop: wrapper.css(\"top\"),\n\t\t\t\tleft: wrapper.css(\"left\")\n\t\t\t}).insertAfter( wrapper );\n\t\t\twrapper.remove();\n\t\t}\n\n\t\tthis.originalElement.css(\"resize\", this.originalResizeStyle);\n\t\t_destroy(this.originalElement);\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function(event) {\n\t\tvar i, handle,\n\t\t\tcapture = false;\n\n\t\tfor (i in this.handles) {\n\t\t\thandle = $(this.handles[i])[0];\n\t\t\tif (handle === event.target || $.contains(handle, event.target)) {\n\t\t\t\tcapture = true;\n\t\t\t}\n\t\t}\n\n\t\treturn !this.options.disabled && capture;\n\t},\n\n\t_mouseStart: function(event) {\n\n\t\tvar curleft, curtop, cursor,\n\t\t\to = this.options,\n\t\t\tel = this.element;\n\n\t\tthis.resizing = true;\n\n\t\tthis._renderProxy();\n\n\t\tcurleft = this._num(this.helper.css(\"left\"));\n\t\tcurtop = this._num(this.helper.css(\"top\"));\n\n\t\tif (o.containment) {\n\t\t\tcurleft += $(o.containment).scrollLeft() || 0;\n\t\t\tcurtop += $(o.containment).scrollTop() || 0;\n\t\t}\n\n\t\tthis.offset = this.helper.offset();\n\t\tthis.position = { left: curleft, top: curtop };\n\n\t\tthis.size = this._helper ? {\n\t\t\t\twidth: this.helper.width(),\n\t\t\t\theight: this.helper.height()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.originalSize = this._helper ? {\n\t\t\t\twidth: el.outerWidth(),\n\t\t\t\theight: el.outerHeight()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.sizeDiff = {\n\t\t\twidth: el.outerWidth() - el.width(),\n\t\t\theight: el.outerHeight() - el.height()\n\t\t};\n\n\t\tthis.originalPosition = { left: curleft, top: curtop };\n\t\tthis.originalMousePosition = { left: event.pageX, top: event.pageY };\n\n\t\tthis.aspectRatio = (typeof o.aspectRatio === \"number\") ?\n\t\t\to.aspectRatio :\n\t\t\t((this.originalSize.width / this.originalSize.height) || 1);\n\n\t\tcursor = $(\".ui-resizable-\" + this.axis).css(\"cursor\");\n\t\t$(\"body\").css(\"cursor\", cursor === \"auto\" ? this.axis + \"-resize\" : cursor);\n\n\t\tel.addClass(\"ui-resizable-resizing\");\n\t\tthis._propagate(\"start\", event);\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function(event) {\n\n\t\tvar data, props,\n\t\t\tsmp = this.originalMousePosition,\n\t\t\ta = this.axis,\n\t\t\tdx = (event.pageX - smp.left) || 0,\n\t\t\tdy = (event.pageY - smp.top) || 0,\n\t\t\ttrigger = this._change[a];\n\n\t\tthis._updatePrevProperties();\n\n\t\tif (!trigger) {\n\t\t\treturn false;\n\t\t}\n\n\t\tdata = trigger.apply(this, [ event, dx, dy ]);\n\n\t\tthis._updateVirtualBoundaries(event.shiftKey);\n\t\tif (this._aspectRatio || event.shiftKey) {\n\t\t\tdata = this._updateRatio(data, event);\n\t\t}\n\n\t\tdata = this._respectSize(data, event);\n\n\t\tthis._updateCache(data);\n\n\t\tthis._propagate(\"resize\", event);\n\n\t\tprops = this._applyChanges();\n\n\t\tif ( !this._helper && this._proportionallyResizeElements.length ) {\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tif ( !$.isEmptyObject( props ) ) {\n\t\t\tthis._updatePrevProperties();\n\t\t\tthis._trigger( \"resize\", event, this.ui() );\n\t\t\tthis._applyChanges();\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\n\t\tthis.resizing = false;\n\t\tvar pr, ista, soffseth, soffsetw, s, left, top,\n\t\t\to = this.options, that = this;\n\n\t\tif (this._helper) {\n\n\t\t\tpr = this._proportionallyResizeElements;\n\t\t\tista = pr.length && (/textarea/i).test(pr[0].nodeName);\n\t\t\tsoffseth = ista && this._hasScroll(pr[0], \"left\") ? 0 : that.sizeDiff.height;\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width;\n\n\t\t\ts = {\n\t\t\t\twidth: (that.helper.width()  - soffsetw),\n\t\t\t\theight: (that.helper.height() - soffseth)\n\t\t\t};\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) +\n\t\t\t\t(that.position.left - that.originalPosition.left)) || null;\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) +\n\t\t\t\t(that.position.top - that.originalPosition.top)) || null;\n\n\t\t\tif (!o.animate) {\n\t\t\t\tthis.element.css($.extend(s, { top: top, left: left }));\n\t\t\t}\n\n\t\t\tthat.helper.height(that.size.height);\n\t\t\tthat.helper.width(that.size.width);\n\n\t\t\tif (this._helper && !o.animate) {\n\t\t\t\tthis._proportionallyResize();\n\t\t\t}\n\t\t}\n\n\t\t$(\"body\").css(\"cursor\", \"auto\");\n\n\t\tthis.element.removeClass(\"ui-resizable-resizing\");\n\n\t\tthis._propagate(\"stop\", event);\n\n\t\tif (this._helper) {\n\t\t\tthis.helper.remove();\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\t_updatePrevProperties: function() {\n\t\tthis.prevPosition = {\n\t\t\ttop: this.position.top,\n\t\t\tleft: this.position.left\n\t\t};\n\t\tthis.prevSize = {\n\t\t\twidth: this.size.width,\n\t\t\theight: this.size.height\n\t\t};\n\t},\n\n\t_applyChanges: function() {\n\t\tvar props = {};\n\n\t\tif ( this.position.top !== this.prevPosition.top ) {\n\t\t\tprops.top = this.position.top + \"px\";\n\t\t}\n\t\tif ( this.position.left !== this.prevPosition.left ) {\n\t\t\tprops.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( this.size.width !== this.prevSize.width ) {\n\t\t\tprops.width = this.size.width + \"px\";\n\t\t}\n\t\tif ( this.size.height !== this.prevSize.height ) {\n\t\t\tprops.height = this.size.height + \"px\";\n\t\t}\n\n\t\tthis.helper.css( props );\n\n\t\treturn props;\n\t},\n\n\t_updateVirtualBoundaries: function(forceAspectRatio) {\n\t\tvar pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,\n\t\t\to = this.options;\n\n\t\tb = {\n\t\t\tminWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,\n\t\t\tmaxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,\n\t\t\tminHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,\n\t\t\tmaxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity\n\t\t};\n\n\t\tif (this._aspectRatio || forceAspectRatio) {\n\t\t\tpMinWidth = b.minHeight * this.aspectRatio;\n\t\t\tpMinHeight = b.minWidth / this.aspectRatio;\n\t\t\tpMaxWidth = b.maxHeight * this.aspectRatio;\n\t\t\tpMaxHeight = b.maxWidth / this.aspectRatio;\n\n\t\t\tif (pMinWidth > b.minWidth) {\n\t\t\t\tb.minWidth = pMinWidth;\n\t\t\t}\n\t\t\tif (pMinHeight > b.minHeight) {\n\t\t\t\tb.minHeight = pMinHeight;\n\t\t\t}\n\t\t\tif (pMaxWidth < b.maxWidth) {\n\t\t\t\tb.maxWidth = pMaxWidth;\n\t\t\t}\n\t\t\tif (pMaxHeight < b.maxHeight) {\n\t\t\t\tb.maxHeight = pMaxHeight;\n\t\t\t}\n\t\t}\n\t\tthis._vBoundaries = b;\n\t},\n\n\t_updateCache: function(data) {\n\t\tthis.offset = this.helper.offset();\n\t\tif (this._isNumber(data.left)) {\n\t\t\tthis.position.left = data.left;\n\t\t}\n\t\tif (this._isNumber(data.top)) {\n\t\t\tthis.position.top = data.top;\n\t\t}\n\t\tif (this._isNumber(data.height)) {\n\t\t\tthis.size.height = data.height;\n\t\t}\n\t\tif (this._isNumber(data.width)) {\n\t\t\tthis.size.width = data.width;\n\t\t}\n\t},\n\n\t_updateRatio: function( data ) {\n\n\t\tvar cpos = this.position,\n\t\t\tcsize = this.size,\n\t\t\ta = this.axis;\n\n\t\tif (this._isNumber(data.height)) {\n\t\t\tdata.width = (data.height * this.aspectRatio);\n\t\t} else if (this._isNumber(data.width)) {\n\t\t\tdata.height = (data.width / this.aspectRatio);\n\t\t}\n\n\t\tif (a === \"sw\") {\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\n\t\t\tdata.top = null;\n\t\t}\n\t\tif (a === \"nw\") {\n\t\t\tdata.top = cpos.top + (csize.height - data.height);\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_respectSize: function( data ) {\n\n\t\tvar o = this._vBoundaries,\n\t\t\ta = this.axis,\n\t\t\tismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),\n\t\t\tismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),\n\t\t\tisminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),\n\t\t\tisminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),\n\t\t\tdw = this.originalPosition.left + this.originalSize.width,\n\t\t\tdh = this.position.top + this.size.height,\n\t\t\tcw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);\n\t\tif (isminw) {\n\t\t\tdata.width = o.minWidth;\n\t\t}\n\t\tif (isminh) {\n\t\t\tdata.height = o.minHeight;\n\t\t}\n\t\tif (ismaxw) {\n\t\t\tdata.width = o.maxWidth;\n\t\t}\n\t\tif (ismaxh) {\n\t\t\tdata.height = o.maxHeight;\n\t\t}\n\n\t\tif (isminw && cw) {\n\t\t\tdata.left = dw - o.minWidth;\n\t\t}\n\t\tif (ismaxw && cw) {\n\t\t\tdata.left = dw - o.maxWidth;\n\t\t}\n\t\tif (isminh && ch) {\n\t\t\tdata.top = dh - o.minHeight;\n\t\t}\n\t\tif (ismaxh && ch) {\n\t\t\tdata.top = dh - o.maxHeight;\n\t\t}\n\n\t\t// Fixing jump error on top/left - bug #2330\n\t\tif (!data.width && !data.height && !data.left && data.top) {\n\t\t\tdata.top = null;\n\t\t} else if (!data.width && !data.height && !data.top && data.left) {\n\t\t\tdata.left = null;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_getPaddingPlusBorderDimensions: function( element ) {\n\t\tvar i = 0,\n\t\t\twidths = [],\n\t\t\tborders = [\n\t\t\t\telement.css( \"borderTopWidth\" ),\n\t\t\t\telement.css( \"borderRightWidth\" ),\n\t\t\t\telement.css( \"borderBottomWidth\" ),\n\t\t\t\telement.css( \"borderLeftWidth\" )\n\t\t\t],\n\t\t\tpaddings = [\n\t\t\t\telement.css( \"paddingTop\" ),\n\t\t\t\telement.css( \"paddingRight\" ),\n\t\t\t\telement.css( \"paddingBottom\" ),\n\t\t\t\telement.css( \"paddingLeft\" )\n\t\t\t];\n\n\t\tfor ( ; i < 4; i++ ) {\n\t\t\twidths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );\n\t\t\twidths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );\n\t\t}\n\n\t\treturn {\n\t\t\theight: widths[ 0 ] + widths[ 2 ],\n\t\t\twidth: widths[ 1 ] + widths[ 3 ]\n\t\t};\n\t},\n\n\t_proportionallyResize: function() {\n\n\t\tif (!this._proportionallyResizeElements.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar prel,\n\t\t\ti = 0,\n\t\t\telement = this.helper || this.element;\n\n\t\tfor ( ; i < this._proportionallyResizeElements.length; i++) {\n\n\t\t\tprel = this._proportionallyResizeElements[i];\n\n\t\t\t// TODO: Seems like a bug to cache this.outerDimensions\n\t\t\t// considering that we are in a loop.\n\t\t\tif (!this.outerDimensions) {\n\t\t\t\tthis.outerDimensions = this._getPaddingPlusBorderDimensions( prel );\n\t\t\t}\n\n\t\t\tprel.css({\n\t\t\t\theight: (element.height() - this.outerDimensions.height) || 0,\n\t\t\t\twidth: (element.width() - this.outerDimensions.width) || 0\n\t\t\t});\n\n\t\t}\n\n\t},\n\n\t_renderProxy: function() {\n\n\t\tvar el = this.element, o = this.options;\n\t\tthis.elementOffset = el.offset();\n\n\t\tif (this._helper) {\n\n\t\t\tthis.helper = this.helper || $(\"<div style='overflow:hidden;'></div>\");\n\n\t\t\tthis.helper.addClass(this._helper).css({\n\t\t\t\twidth: this.element.outerWidth() - 1,\n\t\t\t\theight: this.element.outerHeight() - 1,\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: this.elementOffset.left + \"px\",\n\t\t\t\ttop: this.elementOffset.top + \"px\",\n\t\t\t\tzIndex: ++o.zIndex //TODO: Don't modify option\n\t\t\t});\n\n\t\t\tthis.helper\n\t\t\t\t.appendTo(\"body\")\n\t\t\t\t.disableSelection();\n\n\t\t} else {\n\t\t\tthis.helper = this.element;\n\t\t}\n\n\t},\n\n\t_change: {\n\t\te: function(event, dx) {\n\t\t\treturn { width: this.originalSize.width + dx };\n\t\t},\n\t\tw: function(event, dx) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { left: sp.left + dx, width: cs.width - dx };\n\t\t},\n\t\tn: function(event, dx, dy) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { top: sp.top + dy, height: cs.height - dy };\n\t\t},\n\t\ts: function(event, dx, dy) {\n\t\t\treturn { height: this.originalSize.height + dy };\n\t\t},\n\t\tse: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.s.apply(this, arguments),\n\t\t\t\tthis._change.e.apply(this, [ event, dx, dy ]));\n\t\t},\n\t\tsw: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.s.apply(this, arguments),\n\t\t\t\tthis._change.w.apply(this, [ event, dx, dy ]));\n\t\t},\n\t\tne: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.n.apply(this, arguments),\n\t\t\t\tthis._change.e.apply(this, [ event, dx, dy ]));\n\t\t},\n\t\tnw: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.n.apply(this, arguments),\n\t\t\t\tthis._change.w.apply(this, [ event, dx, dy ]));\n\t\t}\n\t},\n\n\t_propagate: function(n, event) {\n\t\t$.ui.plugin.call(this, n, [ event, this.ui() ]);\n\t\t(n !== \"resize\" && this._trigger(n, event, this.ui()));\n\t},\n\n\tplugins: {},\n\n\tui: function() {\n\t\treturn {\n\t\t\toriginalElement: this.originalElement,\n\t\t\telement: this.element,\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\tsize: this.size,\n\t\t\toriginalSize: this.originalSize,\n\t\t\toriginalPosition: this.originalPosition\n\t\t};\n\t}\n\n});\n\n/*\n * Resizable Extensions\n */\n\n$.ui.plugin.add(\"resizable\", \"animate\", {\n\n\tstop: function( event ) {\n\t\tvar that = $(this).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tpr = that._proportionallyResizeElements,\n\t\t\tista = pr.length && (/textarea/i).test(pr[0].nodeName),\n\t\t\tsoffseth = ista && that._hasScroll(pr[0], \"left\") ? 0 : that.sizeDiff.height,\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width,\n\t\t\tstyle = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) +\n\t\t\t\t(that.position.left - that.originalPosition.left)) || null,\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) +\n\t\t\t\t(that.position.top - that.originalPosition.top)) || null;\n\n\t\tthat.element.animate(\n\t\t\t$.extend(style, top && left ? { top: top, left: left } : {}), {\n\t\t\t\tduration: o.animateDuration,\n\t\t\t\teasing: o.animateEasing,\n\t\t\t\tstep: function() {\n\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\twidth: parseInt(that.element.css(\"width\"), 10),\n\t\t\t\t\t\theight: parseInt(that.element.css(\"height\"), 10),\n\t\t\t\t\t\ttop: parseInt(that.element.css(\"top\"), 10),\n\t\t\t\t\t\tleft: parseInt(that.element.css(\"left\"), 10)\n\t\t\t\t\t};\n\n\t\t\t\t\tif (pr && pr.length) {\n\t\t\t\t\t\t$(pr[0]).css({ width: data.width, height: data.height });\n\t\t\t\t\t}\n\n\t\t\t\t\t// propagating resize, and updating values for each animation step\n\t\t\t\t\tthat._updateCache(data);\n\t\t\t\t\tthat._propagate(\"resize\", event);\n\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n});\n\n$.ui.plugin.add( \"resizable\", \"containment\", {\n\n\tstart: function() {\n\t\tvar element, p, co, ch, cw, width, height,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tel = that.element,\n\t\t\toc = o.containment,\n\t\t\tce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthat.containerElement = $( ce );\n\n\t\tif ( /document/.test( oc ) || oc === document ) {\n\t\t\tthat.containerOffset = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\t\t\tthat.containerPosition = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: $( document ),\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: $( document ).width(),\n\t\t\t\theight: $( document ).height() || document.body.parentNode.scrollHeight\n\t\t\t};\n\t\t} else {\n\t\t\telement = $( ce );\n\t\t\tp = [];\n\t\t\t$([ \"Top\", \"Right\", \"Left\", \"Bottom\" ]).each(function( i, name ) {\n\t\t\t\tp[ i ] = that._num( element.css( \"padding\" + name ) );\n\t\t\t});\n\n\t\t\tthat.containerOffset = element.offset();\n\t\t\tthat.containerPosition = element.position();\n\t\t\tthat.containerSize = {\n\t\t\t\theight: ( element.innerHeight() - p[ 3 ] ),\n\t\t\t\twidth: ( element.innerWidth() - p[ 1 ] )\n\t\t\t};\n\n\t\t\tco = that.containerOffset;\n\t\t\tch = that.containerSize.height;\n\t\t\tcw = that.containerSize.width;\n\t\t\twidth = ( that._hasScroll ( ce, \"left\" ) ? ce.scrollWidth : cw );\n\t\t\theight = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: ce,\n\t\t\t\tleft: co.left,\n\t\t\t\ttop: co.top,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\t\t}\n\t},\n\n\tresize: function( event ) {\n\t\tvar woset, hoset, isParent, isOffsetRelative,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcp = that.position,\n\t\t\tpRatio = that._aspectRatio || event.shiftKey,\n\t\t\tcop = {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t},\n\t\t\tce = that.containerElement,\n\t\t\tcontinueResize = true;\n\n\t\tif ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\tcop = co;\n\t\t}\n\n\t\tif ( cp.left < ( that._helper ? co.left : 0 ) ) {\n\t\t\tthat.size.width = that.size.width +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.left - co.left ) :\n\t\t\t\t\t( that.position.left - cop.left ) );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.left = o.helper ? co.left : 0;\n\t\t}\n\n\t\tif ( cp.top < ( that._helper ? co.top : 0 ) ) {\n\t\t\tthat.size.height = that.size.height +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.top - co.top ) :\n\t\t\t\t\tthat.position.top );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.top = that._helper ? co.top : 0;\n\t\t}\n\n\t\tisParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );\n\t\tisOffsetRelative = /relative|absolute/.test( that.containerElement.css( \"position\" ) );\n\n\t\tif ( isParent && isOffsetRelative ) {\n\t\t\tthat.offset.left = that.parentData.left + that.position.left;\n\t\t\tthat.offset.top = that.parentData.top + that.position.top;\n\t\t} else {\n\t\t\tthat.offset.left = that.element.offset().left;\n\t\t\tthat.offset.top = that.element.offset().top;\n\t\t}\n\n\t\twoset = Math.abs( that.sizeDiff.width +\n\t\t\t(that._helper ?\n\t\t\t\tthat.offset.left - cop.left :\n\t\t\t\t(that.offset.left - co.left)) );\n\n\t\thoset = Math.abs( that.sizeDiff.height +\n\t\t\t(that._helper ?\n\t\t\t\tthat.offset.top - cop.top :\n\t\t\t\t(that.offset.top - co.top)) );\n\n\t\tif ( woset + that.size.width >= that.parentData.width ) {\n\t\t\tthat.size.width = that.parentData.width - woset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( hoset + that.size.height >= that.parentData.height ) {\n\t\t\tthat.size.height = that.parentData.height - hoset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( !continueResize ) {\n\t\t\tthat.position.left = that.prevPosition.left;\n\t\t\tthat.position.top = that.prevPosition.top;\n\t\t\tthat.size.width = that.prevSize.width;\n\t\t\tthat.size.height = that.prevSize.height;\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcop = that.containerPosition,\n\t\t\tce = that.containerElement,\n\t\t\thelper = $( that.helper ),\n\t\t\tho = helper.offset(),\n\t\t\tw = helper.outerWidth() - that.sizeDiff.width,\n\t\t\th = helper.outerHeight() - that.sizeDiff.height;\n\n\t\tif ( that._helper && !o.animate && ( /relative/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css({\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t}\n\n\t\tif ( that._helper && !o.animate && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css({\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"resizable\", \"alsoResize\", {\n\n\tstart: function() {\n\t\tvar that = $(this).resizable( \"instance\" ),\n\t\t\to = that.options;\n\n\t\t$(o.alsoResize).each(function() {\n\t\t\tvar el = $(this);\n\t\t\tel.data(\"ui-resizable-alsoresize\", {\n\t\t\t\twidth: parseInt(el.width(), 10), height: parseInt(el.height(), 10),\n\t\t\t\tleft: parseInt(el.css(\"left\"), 10), top: parseInt(el.css(\"top\"), 10)\n\t\t\t});\n\t\t});\n\t},\n\n\tresize: function(event, ui) {\n\t\tvar that = $(this).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\tdelta = {\n\t\t\t\theight: (that.size.height - os.height) || 0,\n\t\t\t\twidth: (that.size.width - os.width) || 0,\n\t\t\t\ttop: (that.position.top - op.top) || 0,\n\t\t\t\tleft: (that.position.left - op.left) || 0\n\t\t\t};\n\n\t\t\t$(o.alsoResize).each(function() {\n\t\t\t\tvar el = $(this), start = $(this).data(\"ui-resizable-alsoresize\"), style = {},\n\t\t\t\t\tcss = el.parents(ui.originalElement[0]).length ?\n\t\t\t\t\t\t\t[ \"width\", \"height\" ] :\n\t\t\t\t\t\t\t[ \"width\", \"height\", \"top\", \"left\" ];\n\n\t\t\t\t$.each(css, function(i, prop) {\n\t\t\t\t\tvar sum = (start[prop] || 0) + (delta[prop] || 0);\n\t\t\t\t\tif (sum && sum >= 0) {\n\t\t\t\t\t\tstyle[prop] = sum || null;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tel.css(style);\n\t\t\t});\n\t},\n\n\tstop: function() {\n\t\t$(this).removeData(\"resizable-alsoresize\");\n\t}\n});\n\n$.ui.plugin.add(\"resizable\", \"ghost\", {\n\n\tstart: function() {\n\n\t\tvar that = $(this).resizable( \"instance\" ), o = that.options, cs = that.size;\n\n\t\tthat.ghost = that.originalElement.clone();\n\t\tthat.ghost\n\t\t\t.css({\n\t\t\t\topacity: 0.25,\n\t\t\t\tdisplay: \"block\",\n\t\t\t\tposition: \"relative\",\n\t\t\t\theight: cs.height,\n\t\t\t\twidth: cs.width,\n\t\t\t\tmargin: 0,\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t})\n\t\t\t.addClass(\"ui-resizable-ghost\")\n\t\t\t.addClass(typeof o.ghost === \"string\" ? o.ghost : \"\");\n\n\t\tthat.ghost.appendTo(that.helper);\n\n\t},\n\n\tresize: function() {\n\t\tvar that = $(this).resizable( \"instance\" );\n\t\tif (that.ghost) {\n\t\t\tthat.ghost.css({\n\t\t\t\tposition: \"relative\",\n\t\t\t\theight: that.size.height,\n\t\t\t\twidth: that.size.width\n\t\t\t});\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $(this).resizable( \"instance\" );\n\t\tif (that.ghost && that.helper) {\n\t\t\tthat.helper.get(0).removeChild(that.ghost.get(0));\n\t\t}\n\t}\n\n});\n\n$.ui.plugin.add(\"resizable\", \"grid\", {\n\n\tresize: function() {\n\t\tvar outerDimensions,\n\t\t\tthat = $(this).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tcs = that.size,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\ta = that.axis,\n\t\t\tgrid = typeof o.grid === \"number\" ? [ o.grid, o.grid ] : o.grid,\n\t\t\tgridX = (grid[0] || 1),\n\t\t\tgridY = (grid[1] || 1),\n\t\t\tox = Math.round((cs.width - os.width) / gridX) * gridX,\n\t\t\toy = Math.round((cs.height - os.height) / gridY) * gridY,\n\t\t\tnewWidth = os.width + ox,\n\t\t\tnewHeight = os.height + oy,\n\t\t\tisMaxWidth = o.maxWidth && (o.maxWidth < newWidth),\n\t\t\tisMaxHeight = o.maxHeight && (o.maxHeight < newHeight),\n\t\t\tisMinWidth = o.minWidth && (o.minWidth > newWidth),\n\t\t\tisMinHeight = o.minHeight && (o.minHeight > newHeight);\n\n\t\to.grid = grid;\n\n\t\tif (isMinWidth) {\n\t\t\tnewWidth += gridX;\n\t\t}\n\t\tif (isMinHeight) {\n\t\t\tnewHeight += gridY;\n\t\t}\n\t\tif (isMaxWidth) {\n\t\t\tnewWidth -= gridX;\n\t\t}\n\t\tif (isMaxHeight) {\n\t\t\tnewHeight -= gridY;\n\t\t}\n\n\t\tif (/^(se|s|e)$/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t} else if (/^(ne)$/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.top = op.top - oy;\n\t\t} else if (/^(sw)$/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.left = op.left - ox;\n\t\t} else {\n\t\t\tif ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {\n\t\t\t\touterDimensions = that._getPaddingPlusBorderDimensions( this );\n\t\t\t}\n\n\t\t\tif ( newHeight - gridY > 0 ) {\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top - oy;\n\t\t\t} else {\n\t\t\t\tnewHeight = gridY - outerDimensions.height;\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top + os.height - newHeight;\n\t\t\t}\n\t\t\tif ( newWidth - gridX > 0 ) {\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left - ox;\n\t\t\t} else {\n\t\t\t\tnewWidth = gridX - outerDimensions.width;\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left + os.width - newWidth;\n\t\t\t}\n\t\t}\n\t}\n\n});\n\nvar resizable = $.ui.resizable;\n\n\n/*!\n * jQuery UI Dialog 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/dialog/\n */\n\n\nvar dialog = $.widget( \"ui.dialog\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoOpen: true,\n\t\tbuttons: [],\n\t\tcloseOnEscape: true,\n\t\tcloseText: \"Close\",\n\t\tdialogClass: \"\",\n\t\tdraggable: true,\n\t\thide: null,\n\t\theight: \"auto\",\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 150,\n\t\tminWidth: 150,\n\t\tmodal: false,\n\t\tposition: {\n\t\t\tmy: \"center\",\n\t\t\tat: \"center\",\n\t\t\tof: window,\n\t\t\tcollision: \"fit\",\n\t\t\t// Ensure the titlebar is always visible\n\t\t\tusing: function( pos ) {\n\t\t\t\tvar topOffset = $( this ).css( pos ).offset().top;\n\t\t\t\tif ( topOffset < 0 ) {\n\t\t\t\t\t$( this ).css( \"top\", pos.top - topOffset );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tresizable: true,\n\t\tshow: null,\n\t\ttitle: null,\n\t\twidth: 300,\n\n\t\t// callbacks\n\t\tbeforeClose: null,\n\t\tclose: null,\n\t\tdrag: null,\n\t\tdragStart: null,\n\t\tdragStop: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresize: null,\n\t\tresizeStart: null,\n\t\tresizeStop: null\n\t},\n\n\tsizeRelatedOptions: {\n\t\tbuttons: true,\n\t\theight: true,\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true,\n\t\twidth: true\n\t},\n\n\tresizableRelatedOptions: {\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true\n\t},\n\n\t_create: function() {\n\t\tthis.originalCss = {\n\t\t\tdisplay: this.element[ 0 ].style.display,\n\t\t\twidth: this.element[ 0 ].style.width,\n\t\t\tminHeight: this.element[ 0 ].style.minHeight,\n\t\t\tmaxHeight: this.element[ 0 ].style.maxHeight,\n\t\t\theight: this.element[ 0 ].style.height\n\t\t};\n\t\tthis.originalPosition = {\n\t\t\tparent: this.element.parent(),\n\t\t\tindex: this.element.parent().children().index( this.element )\n\t\t};\n\t\tthis.originalTitle = this.element.attr( \"title\" );\n\t\tthis.options.title = this.options.title || this.originalTitle;\n\n\t\tthis._createWrapper();\n\n\t\tthis.element\n\t\t\t.show()\n\t\t\t.removeAttr( \"title\" )\n\t\t\t.addClass( \"ui-dialog-content ui-widget-content\" )\n\t\t\t.appendTo( this.uiDialog );\n\n\t\tthis._createTitlebar();\n\t\tthis._createButtonPane();\n\n\t\tif ( this.options.draggable && $.fn.draggable ) {\n\t\t\tthis._makeDraggable();\n\t\t}\n\t\tif ( this.options.resizable && $.fn.resizable ) {\n\t\t\tthis._makeResizable();\n\t\t}\n\n\t\tthis._isOpen = false;\n\n\t\tthis._trackFocus();\n\t},\n\n\t_init: function() {\n\t\tif ( this.options.autoOpen ) {\n\t\t\tthis.open();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\t\tif ( element && (element.jquery || element.nodeType) ) {\n\t\t\treturn $( element );\n\t\t}\n\t\treturn this.document.find( element || \"body\" ).eq( 0 );\n\t},\n\n\t_destroy: function() {\n\t\tvar next,\n\t\t\toriginalPosition = this.originalPosition;\n\n\t\tthis._untrackInstance();\n\t\tthis._destroyOverlay();\n\n\t\tthis.element\n\t\t\t.removeUniqueId()\n\t\t\t.removeClass( \"ui-dialog-content ui-widget-content\" )\n\t\t\t.css( this.originalCss )\n\t\t\t// Without detaching first, the following becomes really slow\n\t\t\t.detach();\n\n\t\tthis.uiDialog.stop( true, true ).remove();\n\n\t\tif ( this.originalTitle ) {\n\t\t\tthis.element.attr( \"title\", this.originalTitle );\n\t\t}\n\n\t\tnext = originalPosition.parent.children().eq( originalPosition.index );\n\t\t// Don't try to place the dialog next to itself (#8613)\n\t\tif ( next.length && next[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tnext.before( this.element );\n\t\t} else {\n\t\t\toriginalPosition.parent.append( this.element );\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.uiDialog;\n\t},\n\n\tdisable: $.noop,\n\tenable: $.noop,\n\n\tclose: function( event ) {\n\t\tvar activeElement,\n\t\t\tthat = this;\n\n\t\tif ( !this._isOpen || this._trigger( \"beforeClose\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = false;\n\t\tthis._focusedElement = null;\n\t\tthis._destroyOverlay();\n\t\tthis._untrackInstance();\n\n\t\tif ( !this.opener.filter( \":focusable\" ).focus().length ) {\n\n\t\t\t// support: IE9\n\t\t\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\n\t\t\ttry {\n\t\t\t\tactiveElement = this.document[ 0 ].activeElement;\n\n\t\t\t\t// Support: IE9, IE10\n\t\t\t\t// If the <body> is blurred, IE will switch windows, see #4520\n\t\t\t\tif ( activeElement && activeElement.nodeName.toLowerCase() !== \"body\" ) {\n\n\t\t\t\t\t// Hiding a focused element doesn't trigger blur in WebKit\n\t\t\t\t\t// so in case we have nothing to focus on, explicitly blur the active element\n\t\t\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=47182\n\t\t\t\t\t$( activeElement ).blur();\n\t\t\t\t}\n\t\t\t} catch ( error ) {}\n\t\t}\n\n\t\tthis._hide( this.uiDialog, this.options.hide, function() {\n\t\t\tthat._trigger( \"close\", event );\n\t\t});\n\t},\n\n\tisOpen: function() {\n\t\treturn this._isOpen;\n\t},\n\n\tmoveToTop: function() {\n\t\tthis._moveToTop();\n\t},\n\n\t_moveToTop: function( event, silent ) {\n\t\tvar moved = false,\n\t\t\tzIndices = this.uiDialog.siblings( \".ui-front:visible\" ).map(function() {\n\t\t\t\treturn +$( this ).css( \"z-index\" );\n\t\t\t}).get(),\n\t\t\tzIndexMax = Math.max.apply( null, zIndices );\n\n\t\tif ( zIndexMax >= +this.uiDialog.css( \"z-index\" ) ) {\n\t\t\tthis.uiDialog.css( \"z-index\", zIndexMax + 1 );\n\t\t\tmoved = true;\n\t\t}\n\n\t\tif ( moved && !silent ) {\n\t\t\tthis._trigger( \"focus\", event );\n\t\t}\n\t\treturn moved;\n\t},\n\n\topen: function() {\n\t\tvar that = this;\n\t\tif ( this._isOpen ) {\n\t\t\tif ( this._moveToTop() ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = true;\n\t\tthis.opener = $( this.document[ 0 ].activeElement );\n\n\t\tthis._size();\n\t\tthis._position();\n\t\tthis._createOverlay();\n\t\tthis._moveToTop( null, true );\n\n\t\t// Ensure the overlay is moved to the top with the dialog, but only when\n\t\t// opening. The overlay shouldn't move after the dialog is open so that\n\t\t// modeless dialogs opened after the modal dialog stack properly.\n\t\tif ( this.overlay ) {\n\t\t\tthis.overlay.css( \"z-index\", this.uiDialog.css( \"z-index\" ) - 1 );\n\t\t}\n\n\t\tthis._show( this.uiDialog, this.options.show, function() {\n\t\t\tthat._focusTabbable();\n\t\t\tthat._trigger( \"focus\" );\n\t\t});\n\n\t\t// Track the dialog immediately upon openening in case a focus event\n\t\t// somehow occurs outside of the dialog before an element inside the\n\t\t// dialog is focused (#10152)\n\t\tthis._makeFocusTarget();\n\n\t\tthis._trigger( \"open\" );\n\t},\n\n\t_focusTabbable: function() {\n\t\t// Set focus to the first match:\n\t\t// 1. An element that was focused previously\n\t\t// 2. First element inside the dialog matching [autofocus]\n\t\t// 3. Tabbable element inside the content element\n\t\t// 4. Tabbable element inside the buttonpane\n\t\t// 5. The close button\n\t\t// 6. The dialog itself\n\t\tvar hasFocus = this._focusedElement;\n\t\tif ( !hasFocus ) {\n\t\t\thasFocus = this.element.find( \"[autofocus]\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.element.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogButtonPane.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogTitlebarClose.filter( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialog;\n\t\t}\n\t\thasFocus.eq( 0 ).focus();\n\t},\n\n\t_keepFocus: function( event ) {\n\t\tfunction checkFocus() {\n\t\t\tvar activeElement = this.document[0].activeElement,\n\t\t\t\tisActive = this.uiDialog[0] === activeElement ||\n\t\t\t\t\t$.contains( this.uiDialog[0], activeElement );\n\t\t\tif ( !isActive ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t}\n\t\tevent.preventDefault();\n\t\tcheckFocus.call( this );\n\t\t// support: IE\n\t\t// IE <= 8 doesn't prevent moving focus even with event.preventDefault()\n\t\t// so we check again later\n\t\tthis._delay( checkFocus );\n\t},\n\n\t_createWrapper: function() {\n\t\tthis.uiDialog = $(\"<div>\")\n\t\t\t.addClass( \"ui-dialog ui-widget ui-widget-content ui-corner-all ui-front \" +\n\t\t\t\tthis.options.dialogClass )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\t// Setting tabIndex makes the div focusable\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: \"dialog\"\n\t\t\t})\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._on( this.uiDialog, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&\n\t\t\t\t\t\tevent.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// prevent tabbing out of dialogs\n\t\t\t\tif ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar tabbables = this.uiDialog.find( \":tabbable\" ),\n\t\t\t\t\tfirst = tabbables.filter( \":first\" ),\n\t\t\t\t\tlast = tabbables.filter( \":last\" );\n\n\t\t\t\tif ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tfirst.focus();\n\t\t\t\t\t});\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tlast.focus();\n\t\t\t\t\t});\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\t\t\tmousedown: function( event ) {\n\t\t\t\tif ( this._moveToTop( event ) ) {\n\t\t\t\t\tthis._focusTabbable();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// We assume that any existing aria-describedby attribute means\n\t\t// that the dialog content is marked up properly\n\t\t// otherwise we brute force the content as the description\n\t\tif ( !this.element.find( \"[aria-describedby]\" ).length ) {\n\t\t\tthis.uiDialog.attr({\n\t\t\t\t\"aria-describedby\": this.element.uniqueId().attr( \"id\" )\n\t\t\t});\n\t\t}\n\t},\n\n\t_createTitlebar: function() {\n\t\tvar uiDialogTitle;\n\n\t\tthis.uiDialogTitlebar = $( \"<div>\" )\n\t\t\t.addClass( \"ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix\" )\n\t\t\t.prependTo( this.uiDialog );\n\t\tthis._on( this.uiDialogTitlebar, {\n\t\t\tmousedown: function( event ) {\n\t\t\t\t// Don't prevent click on close button (#8838)\n\t\t\t\t// Focusing a dialog that is partially scrolled out of view\n\t\t\t\t// causes the browser to scroll it into view, preventing the click event\n\t\t\t\tif ( !$( event.target ).closest( \".ui-dialog-titlebar-close\" ) ) {\n\t\t\t\t\t// Dialog isn't getting focus when dragging (#8063)\n\t\t\t\t\tthis.uiDialog.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// support: IE\n\t\t// Use type=\"button\" to prevent enter keypresses in textboxes from closing the\n\t\t// dialog in IE (#9312)\n\t\tthis.uiDialogTitlebarClose = $( \"<button type='button'></button>\" )\n\t\t\t.button({\n\t\t\t\tlabel: this.options.closeText,\n\t\t\t\ticons: {\n\t\t\t\t\tprimary: \"ui-icon-closethick\"\n\t\t\t\t},\n\t\t\t\ttext: false\n\t\t\t})\n\t\t\t.addClass( \"ui-dialog-titlebar-close\" )\n\t\t\t.appendTo( this.uiDialogTitlebar );\n\t\tthis._on( this.uiDialogTitlebarClose, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t});\n\n\t\tuiDialogTitle = $( \"<span>\" )\n\t\t\t.uniqueId()\n\t\t\t.addClass( \"ui-dialog-title\" )\n\t\t\t.prependTo( this.uiDialogTitlebar );\n\t\tthis._title( uiDialogTitle );\n\n\t\tthis.uiDialog.attr({\n\t\t\t\"aria-labelledby\": uiDialogTitle.attr( \"id\" )\n\t\t});\n\t},\n\n\t_title: function( title ) {\n\t\tif ( !this.options.title ) {\n\t\t\ttitle.html( \"&#160;\" );\n\t\t}\n\t\ttitle.text( this.options.title );\n\t},\n\n\t_createButtonPane: function() {\n\t\tthis.uiDialogButtonPane = $( \"<div>\" )\n\t\t\t.addClass( \"ui-dialog-buttonpane ui-widget-content ui-helper-clearfix\" );\n\n\t\tthis.uiButtonSet = $( \"<div>\" )\n\t\t\t.addClass( \"ui-dialog-buttonset\" )\n\t\t\t.appendTo( this.uiDialogButtonPane );\n\n\t\tthis._createButtons();\n\t},\n\n\t_createButtons: function() {\n\t\tvar that = this,\n\t\t\tbuttons = this.options.buttons;\n\n\t\t// if we already have a button pane, remove it\n\t\tthis.uiDialogButtonPane.remove();\n\t\tthis.uiButtonSet.empty();\n\n\t\tif ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {\n\t\t\tthis.uiDialog.removeClass( \"ui-dialog-buttons\" );\n\t\t\treturn;\n\t\t}\n\n\t\t$.each( buttons, function( name, props ) {\n\t\t\tvar click, buttonOptions;\n\t\t\tprops = $.isFunction( props ) ?\n\t\t\t\t{ click: props, text: name } :\n\t\t\t\tprops;\n\t\t\t// Default to a non-submitting button\n\t\t\tprops = $.extend( { type: \"button\" }, props );\n\t\t\t// Change the context for the click callback to be the main element\n\t\t\tclick = props.click;\n\t\t\tprops.click = function() {\n\t\t\t\tclick.apply( that.element[ 0 ], arguments );\n\t\t\t};\n\t\t\tbuttonOptions = {\n\t\t\t\ticons: props.icons,\n\t\t\t\ttext: props.showText\n\t\t\t};\n\t\t\tdelete props.icons;\n\t\t\tdelete props.showText;\n\t\t\t$( \"<button></button>\", props )\n\t\t\t\t.button( buttonOptions )\n\t\t\t\t.appendTo( that.uiButtonSet );\n\t\t});\n\t\tthis.uiDialog.addClass( \"ui-dialog-buttons\" );\n\t\tthis.uiDialogButtonPane.appendTo( this.uiDialog );\n\t},\n\n\t_makeDraggable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\tposition: ui.position,\n\t\t\t\toffset: ui.offset\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.draggable({\n\t\t\tcancel: \".ui-dialog-content, .ui-dialog-titlebar-close\",\n\t\t\thandle: \".ui-dialog-titlebar\",\n\t\t\tcontainment: \"document\",\n\t\t\tstart: function( event, ui ) {\n\t\t\t\t$( this ).addClass( \"ui-dialog-dragging\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"dragStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tdrag: function( event, ui ) {\n\t\t\t\tthat._trigger( \"drag\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar left = ui.offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = ui.offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + (left >= 0 ? \"+\" : \"\") + left + \" \" +\n\t\t\t\t\t\t\"top\" + (top >= 0 ? \"+\" : \"\") + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\t$( this ).removeClass( \"ui-dialog-dragging\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"dragStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t});\n\t},\n\n\t_makeResizable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\thandles = options.resizable,\n\t\t\t// .ui-resizable has position: relative defined in the stylesheet\n\t\t\t// but dialogs have to use absolute or fixed positioning\n\t\t\tposition = this.uiDialog.css(\"position\"),\n\t\t\tresizeHandles = typeof handles === \"string\" ?\n\t\t\t\thandles\t:\n\t\t\t\t\"n,e,s,w,se,sw,ne,nw\";\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\toriginalPosition: ui.originalPosition,\n\t\t\t\toriginalSize: ui.originalSize,\n\t\t\t\tposition: ui.position,\n\t\t\t\tsize: ui.size\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.resizable({\n\t\t\tcancel: \".ui-dialog-content\",\n\t\t\tcontainment: \"document\",\n\t\t\talsoResize: this.element,\n\t\t\tmaxWidth: options.maxWidth,\n\t\t\tmaxHeight: options.maxHeight,\n\t\t\tminWidth: options.minWidth,\n\t\t\tminHeight: this._minHeight(),\n\t\t\thandles: resizeHandles,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\t$( this ).addClass( \"ui-dialog-resizing\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"resizeStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tresize: function( event, ui ) {\n\t\t\t\tthat._trigger( \"resize\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar offset = that.uiDialog.offset(),\n\t\t\t\t\tleft = offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.height = that.uiDialog.height();\n\t\t\t\toptions.width = that.uiDialog.width();\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + (left >= 0 ? \"+\" : \"\") + left + \" \" +\n\t\t\t\t\t\t\"top\" + (top >= 0 ? \"+\" : \"\") + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\t$( this ).removeClass( \"ui-dialog-resizing\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"resizeStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t})\n\t\t.css( \"position\", position );\n\t},\n\n\t_trackFocus: function() {\n\t\tthis._on( this.widget(), {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._makeFocusTarget();\n\t\t\t\tthis._focusedElement = $( event.target );\n\t\t\t}\n\t\t});\n\t},\n\n\t_makeFocusTarget: function() {\n\t\tthis._untrackInstance();\n\t\tthis._trackingInstances().unshift( this );\n\t},\n\n\t_untrackInstance: function() {\n\t\tvar instances = this._trackingInstances(),\n\t\t\texists = $.inArray( this, instances );\n\t\tif ( exists !== -1 ) {\n\t\t\tinstances.splice( exists, 1 );\n\t\t}\n\t},\n\n\t_trackingInstances: function() {\n\t\tvar instances = this.document.data( \"ui-dialog-instances\" );\n\t\tif ( !instances ) {\n\t\t\tinstances = [];\n\t\t\tthis.document.data( \"ui-dialog-instances\", instances );\n\t\t}\n\t\treturn instances;\n\t},\n\n\t_minHeight: function() {\n\t\tvar options = this.options;\n\n\t\treturn options.height === \"auto\" ?\n\t\t\toptions.minHeight :\n\t\t\tMath.min( options.minHeight, options.height );\n\t},\n\n\t_position: function() {\n\t\t// Need to show the dialog to get the actual offset in the position plugin\n\t\tvar isVisible = this.uiDialog.is( \":visible\" );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.show();\n\t\t}\n\t\tthis.uiDialog.position( this.options.position );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.hide();\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tresize = false,\n\t\t\tresizableOptions = {};\n\n\t\t$.each( options, function( key, value ) {\n\t\t\tthat._setOption( key, value );\n\n\t\t\tif ( key in that.sizeRelatedOptions ) {\n\t\t\t\tresize = true;\n\t\t\t}\n\t\t\tif ( key in that.resizableRelatedOptions ) {\n\t\t\t\tresizableOptions[ key ] = value;\n\t\t\t}\n\t\t});\n\n\t\tif ( resize ) {\n\t\t\tthis._size();\n\t\t\tthis._position();\n\t\t}\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", resizableOptions );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar isDraggable, isResizable,\n\t\t\tuiDialog = this.uiDialog;\n\n\t\tif ( key === \"dialogClass\" ) {\n\t\t\tuiDialog\n\t\t\t\t.removeClass( this.options.dialogClass )\n\t\t\t\t.addClass( value );\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.uiDialog.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"buttons\" ) {\n\t\t\tthis._createButtons();\n\t\t}\n\n\t\tif ( key === \"closeText\" ) {\n\t\t\tthis.uiDialogTitlebarClose.button({\n\t\t\t\t// Ensure that we always pass a string\n\t\t\t\tlabel: \"\" + value\n\t\t\t});\n\t\t}\n\n\t\tif ( key === \"draggable\" ) {\n\t\t\tisDraggable = uiDialog.is( \":data(ui-draggable)\" );\n\t\t\tif ( isDraggable && !value ) {\n\t\t\t\tuiDialog.draggable( \"destroy\" );\n\t\t\t}\n\n\t\t\tif ( !isDraggable && value ) {\n\t\t\t\tthis._makeDraggable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"position\" ) {\n\t\t\tthis._position();\n\t\t}\n\n\t\tif ( key === \"resizable\" ) {\n\t\t\t// currently resizable, becoming non-resizable\n\t\t\tisResizable = uiDialog.is( \":data(ui-resizable)\" );\n\t\t\tif ( isResizable && !value ) {\n\t\t\t\tuiDialog.resizable( \"destroy\" );\n\t\t\t}\n\n\t\t\t// currently resizable, changing handles\n\t\t\tif ( isResizable && typeof value === \"string\" ) {\n\t\t\t\tuiDialog.resizable( \"option\", \"handles\", value );\n\t\t\t}\n\n\t\t\t// currently non-resizable, becoming resizable\n\t\t\tif ( !isResizable && value !== false ) {\n\t\t\t\tthis._makeResizable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"title\" ) {\n\t\t\tthis._title( this.uiDialogTitlebar.find( \".ui-dialog-title\" ) );\n\t\t}\n\t},\n\n\t_size: function() {\n\t\t// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\n\t\t// divs will both have width and height set, so we need to reset them\n\t\tvar nonContentHeight, minContentHeight, maxContentHeight,\n\t\t\toptions = this.options;\n\n\t\t// Reset content sizing\n\t\tthis.element.show().css({\n\t\t\twidth: \"auto\",\n\t\t\tminHeight: 0,\n\t\t\tmaxHeight: \"none\",\n\t\t\theight: 0\n\t\t});\n\n\t\tif ( options.minWidth > options.width ) {\n\t\t\toptions.width = options.minWidth;\n\t\t}\n\n\t\t// reset wrapper sizing\n\t\t// determine the height of all the non-content elements\n\t\tnonContentHeight = this.uiDialog.css({\n\t\t\t\theight: \"auto\",\n\t\t\t\twidth: options.width\n\t\t\t})\n\t\t\t.outerHeight();\n\t\tminContentHeight = Math.max( 0, options.minHeight - nonContentHeight );\n\t\tmaxContentHeight = typeof options.maxHeight === \"number\" ?\n\t\t\tMath.max( 0, options.maxHeight - nonContentHeight ) :\n\t\t\t\"none\";\n\n\t\tif ( options.height === \"auto\" ) {\n\t\t\tthis.element.css({\n\t\t\t\tminHeight: minContentHeight,\n\t\t\t\tmaxHeight: maxContentHeight,\n\t\t\t\theight: \"auto\"\n\t\t\t});\n\t\t} else {\n\t\t\tthis.element.height( Math.max( 0, options.height - nonContentHeight ) );\n\t\t}\n\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", \"minHeight\", this._minHeight() );\n\t\t}\n\t},\n\n\t_blockFrames: function() {\n\t\tthis.iframeBlocks = this.document.find( \"iframe\" ).map(function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\twidth: iframe.outerWidth(),\n\t\t\t\t\theight: iframe.outerHeight()\n\t\t\t\t})\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.offset( iframe.offset() )[0];\n\t\t});\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_allowInteraction: function( event ) {\n\t\tif ( $( event.target ).closest( \".ui-dialog\" ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: Remove hack when datepicker implements\n\t\t// the .ui-front logic (#8989)\n\t\treturn !!$( event.target ).closest( \".ui-datepicker\" ).length;\n\t},\n\n\t_createOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We use a delay in case the overlay is created from an\n\t\t// event that we're going to be cancelling (#2804)\n\t\tvar isOpening = true;\n\t\tthis._delay(function() {\n\t\t\tisOpening = false;\n\t\t});\n\n\t\tif ( !this.document.data( \"ui-dialog-overlays\" ) ) {\n\n\t\t\t// Prevent use of anchors and inputs\n\t\t\t// Using _on() for an event handler shared across many instances is\n\t\t\t// safe because the dialogs stack and must be closed in reverse order\n\t\t\tthis._on( this.document, {\n\t\t\t\tfocusin: function( event ) {\n\t\t\t\t\tif ( isOpening ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !this._allowInteraction( event ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis._trackingInstances()[ 0 ]._focusTabbable();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.overlay = $( \"<div>\" )\n\t\t\t.addClass( \"ui-widget-overlay ui-front\" )\n\t\t\t.appendTo( this._appendTo() );\n\t\tthis._on( this.overlay, {\n\t\t\tmousedown: \"_keepFocus\"\n\t\t});\n\t\tthis.document.data( \"ui-dialog-overlays\",\n\t\t\t(this.document.data( \"ui-dialog-overlays\" ) || 0) + 1 );\n\t},\n\n\t_destroyOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.overlay ) {\n\t\t\tvar overlays = this.document.data( \"ui-dialog-overlays\" ) - 1;\n\n\t\t\tif ( !overlays ) {\n\t\t\t\tthis.document\n\t\t\t\t\t.unbind( \"focusin\" )\n\t\t\t\t\t.removeData( \"ui-dialog-overlays\" );\n\t\t\t} else {\n\t\t\t\tthis.document.data( \"ui-dialog-overlays\", overlays );\n\t\t\t}\n\n\t\t\tthis.overlay.remove();\n\t\t\tthis.overlay = null;\n\t\t}\n\t}\n});\n\n\n/*!\n * jQuery UI Droppable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/droppable/\n */\n\n\n$.widget( \"ui.droppable\", {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"drop\",\n\toptions: {\n\t\taccept: \"*\",\n\t\tactiveClass: false,\n\t\taddClasses: true,\n\t\tgreedy: false,\n\t\thoverClass: false,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tdeactivate: null,\n\t\tdrop: null,\n\t\tout: null,\n\t\tover: null\n\t},\n\t_create: function() {\n\n\t\tvar proportions,\n\t\t\to = this.options,\n\t\t\taccept = o.accept;\n\n\t\tthis.isover = false;\n\t\tthis.isout = true;\n\n\t\tthis.accept = $.isFunction( accept ) ? accept : function( d ) {\n\t\t\treturn d.is( accept );\n\t\t};\n\n\t\tthis.proportions = function( /* valueToWrite */ ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\t// Store the droppable's proportions\n\t\t\t\tproportions = arguments[ 0 ];\n\t\t\t} else {\n\t\t\t\t// Retrieve or derive the droppable's proportions\n\t\t\t\treturn proportions ?\n\t\t\t\t\tproportions :\n\t\t\t\t\tproportions = {\n\t\t\t\t\t\twidth: this.element[ 0 ].offsetWidth,\n\t\t\t\t\t\theight: this.element[ 0 ].offsetHeight\n\t\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tthis._addToManager( o.scope );\n\n\t\to.addClasses && this.element.addClass( \"ui-droppable\" );\n\n\t},\n\n\t_addToManager: function( scope ) {\n\t\t// Add the reference and positions to the manager\n\t\t$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];\n\t\t$.ui.ddmanager.droppables[ scope ].push( this );\n\t},\n\n\t_splice: function( drop ) {\n\t\tvar i = 0;\n\t\tfor ( ; i < drop.length; i++ ) {\n\t\t\tif ( drop[ i ] === this ) {\n\t\t\t\tdrop.splice( i, 1 );\n\t\t\t}\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\tthis._splice( drop );\n\n\t\tthis.element.removeClass( \"ui-droppable ui-droppable-disabled\" );\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\tif ( key === \"accept\" ) {\n\t\t\tthis.accept = $.isFunction( value ) ? value : function( d ) {\n\t\t\t\treturn d.is( value );\n\t\t\t};\n\t\t} else if ( key === \"scope\" ) {\n\t\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\t\tthis._splice( drop );\n\t\t\tthis._addToManager( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_activate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\t\tif ( this.options.activeClass ) {\n\t\t\tthis.element.addClass( this.options.activeClass );\n\t\t}\n\t\tif ( draggable ){\n\t\t\tthis._trigger( \"activate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_deactivate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\t\tif ( this.options.activeClass ) {\n\t\t\tthis.element.removeClass( this.options.activeClass );\n\t\t}\n\t\tif ( draggable ){\n\t\t\tthis._trigger( \"deactivate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_over: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.addClass( this.options.hoverClass );\n\t\t\t}\n\t\t\tthis._trigger( \"over\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_out: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\n\t\t\t}\n\t\t\tthis._trigger( \"out\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_drop: function( event, custom ) {\n\n\t\tvar draggable = custom || $.ui.ddmanager.current,\n\t\t\tchildrenIntersection = false;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.element.find( \":data(ui-droppable)\" ).not( \".ui-draggable-dragging\" ).each(function() {\n\t\t\tvar inst = $( this ).droppable( \"instance\" );\n\t\t\tif (\n\t\t\t\tinst.options.greedy &&\n\t\t\t\t!inst.options.disabled &&\n\t\t\t\tinst.options.scope === draggable.options.scope &&\n\t\t\t\tinst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&\n\t\t\t\t$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )\n\t\t\t) { childrenIntersection = true; return false; }\n\t\t});\n\t\tif ( childrenIntersection ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.removeClass( this.options.activeClass );\n\t\t\t}\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\n\t\t\t}\n\t\t\tthis._trigger( \"drop\", event, this.ui( draggable ) );\n\t\t\treturn this.element;\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tui: function( c ) {\n\t\treturn {\n\t\t\tdraggable: ( c.currentItem || c.element ),\n\t\t\thelper: c.helper,\n\t\t\tposition: c.position,\n\t\t\toffset: c.positionAbs\n\t\t};\n\t}\n\n});\n\n$.ui.intersect = (function() {\n\tfunction isOverAxis( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t}\n\n\treturn function( draggable, droppable, toleranceMode, event ) {\n\n\t\tif ( !droppable.offset ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,\n\t\t\ty1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,\n\t\t\tx2 = x1 + draggable.helperProportions.width,\n\t\t\ty2 = y1 + draggable.helperProportions.height,\n\t\t\tl = droppable.offset.left,\n\t\t\tt = droppable.offset.top,\n\t\t\tr = l + droppable.proportions().width,\n\t\t\tb = t + droppable.proportions().height;\n\n\t\tswitch ( toleranceMode ) {\n\t\tcase \"fit\":\n\t\t\treturn ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );\n\t\tcase \"intersect\":\n\t\t\treturn ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half\n\t\tcase \"pointer\":\n\t\t\treturn isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );\n\t\tcase \"touch\":\n\t\t\treturn (\n\t\t\t\t( y1 >= t && y1 <= b ) || // Top edge touching\n\t\t\t\t( y2 >= t && y2 <= b ) || // Bottom edge touching\n\t\t\t\t( y1 < t && y2 > b ) // Surrounded vertically\n\t\t\t) && (\n\t\t\t\t( x1 >= l && x1 <= r ) || // Left edge touching\n\t\t\t\t( x2 >= l && x2 <= r ) || // Right edge touching\n\t\t\t\t( x1 < l && x2 > r ) // Surrounded horizontally\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t};\n})();\n\n/*\n\tThis manager tracks offsets of draggables and droppables\n*/\n$.ui.ddmanager = {\n\tcurrent: null,\n\tdroppables: { \"default\": [] },\n\tprepareOffsets: function( t, event ) {\n\n\t\tvar i, j,\n\t\t\tm = $.ui.ddmanager.droppables[ t.options.scope ] || [],\n\t\t\ttype = event ? event.type : null, // workaround for #2317\n\t\t\tlist = ( t.currentItem || t.element ).find( \":data(ui-droppable)\" ).addBack();\n\n\t\tdroppablesLoop: for ( i = 0; i < m.length; i++ ) {\n\n\t\t\t// No disabled and non-accepted\n\t\t\tif ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Filter out elements in the current dragged item\n\t\t\tfor ( j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === m[ i ].element[ 0 ] ) {\n\t\t\t\t\tm[ i ].proportions().height = 0;\n\t\t\t\t\tcontinue droppablesLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tm[ i ].visible = m[ i ].element.css( \"display\" ) !== \"none\";\n\t\t\tif ( !m[ i ].visible ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Activate the droppable if used directly from draggables\n\t\t\tif ( type === \"mousedown\" ) {\n\t\t\t\tm[ i ]._activate.call( m[ i ], event );\n\t\t\t}\n\n\t\t\tm[ i ].offset = m[ i ].element.offset();\n\t\t\tm[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });\n\n\t\t}\n\n\t},\n\tdrop: function( draggable, event ) {\n\n\t\tvar dropped = false;\n\t\t// Create a copy of the droppables in case the list changes during the drop (#9116)\n\t\t$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {\n\n\t\t\tif ( !this.options ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {\n\t\t\t\tdropped = this._drop.call( this, event ) || dropped;\n\t\t\t}\n\n\t\t\tif ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\n\t\t\t\tthis.isout = true;\n\t\t\t\tthis.isover = false;\n\t\t\t\tthis._deactivate.call( this, event );\n\t\t\t}\n\n\t\t});\n\t\treturn dropped;\n\n\t},\n\tdragStart: function( draggable, event ) {\n\t\t// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)\n\t\tdraggable.element.parentsUntil( \"body\" ).bind( \"scroll.droppable\", function() {\n\t\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t\t}\n\t\t});\n\t},\n\tdrag: function( draggable, event ) {\n\n\t\t// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.\n\t\tif ( draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\n\t\t// Run through all droppables and check their positions based on specific tolerance options\n\t\t$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {\n\n\t\t\tif ( this.options.disabled || this.greedyChild || !this.visible ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar parentInstance, scope, parent,\n\t\t\t\tintersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),\n\t\t\t\tc = !intersects && this.isover ? \"isout\" : ( intersects && !this.isover ? \"isover\" : null );\n\t\t\tif ( !c ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.options.greedy ) {\n\t\t\t\t// find droppable parents with same scope\n\t\t\t\tscope = this.options.scope;\n\t\t\t\tparent = this.element.parents( \":data(ui-droppable)\" ).filter(function() {\n\t\t\t\t\treturn $( this ).droppable( \"instance\" ).options.scope === scope;\n\t\t\t\t});\n\n\t\t\t\tif ( parent.length ) {\n\t\t\t\t\tparentInstance = $( parent[ 0 ] ).droppable( \"instance\" );\n\t\t\t\t\tparentInstance.greedyChild = ( c === \"isover\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// we just moved into a greedy child\n\t\t\tif ( parentInstance && c === \"isover\" ) {\n\t\t\t\tparentInstance.isover = false;\n\t\t\t\tparentInstance.isout = true;\n\t\t\t\tparentInstance._out.call( parentInstance, event );\n\t\t\t}\n\n\t\t\tthis[ c ] = true;\n\t\t\tthis[c === \"isout\" ? \"isover\" : \"isout\"] = false;\n\t\t\tthis[c === \"isover\" ? \"_over\" : \"_out\"].call( this, event );\n\n\t\t\t// we just moved out of a greedy child\n\t\t\tif ( parentInstance && c === \"isout\" ) {\n\t\t\t\tparentInstance.isout = false;\n\t\t\t\tparentInstance.isover = true;\n\t\t\t\tparentInstance._over.call( parentInstance, event );\n\t\t\t}\n\t\t});\n\n\t},\n\tdragStop: function( draggable, event ) {\n\t\tdraggable.element.parentsUntil( \"body\" ).unbind( \"scroll.droppable\" );\n\t\t// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)\n\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\t}\n};\n\nvar droppable = $.ui.droppable;\n\n\n/*!\n * jQuery UI Effects 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/effects-core/\n */\n\n\nvar dataSpace = \"ui-effects-\",\n\n\t// Create a local jQuery because jQuery Color relies on it and the\n\t// global may not exist with AMD and a custom build (#10199)\n\tjQuery = $;\n\n$.effects = {\n\teffect: {}\n};\n\n/*!\n * jQuery Color Animations v2.1.2\n * https://github.com/jquery/jquery-color\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * Date: Wed Jan 16 08:47:09 2013 -0600\n */\n(function( jQuery, undefined ) {\n\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\n\n\t// plusequals test for += 100 -= 100\n\trplusequals = /^([\\-+])=\\s*(\\d+\\.?\\d*)/,\n\t// a set of RE's that can match strings and generate color tuples.\n\tstringParsers = [ {\n\t\t\tre: /rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ],\n\t\t\t\t\texecResult[ 3 ],\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ] * 2.55,\n\t\t\t\t\texecResult[ 2 ] * 2.55,\n\t\t\t\t\texecResult[ 3 ] * 2.55,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9])([a-f0-9])([a-f0-9])/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tspace: \"hsla\",\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ] / 100,\n\t\t\t\t\texecResult[ 3 ] / 100,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t} ],\n\n\t// jQuery.Color( )\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\n\t},\n\tspaces = {\n\t\trgba: {\n\t\t\tprops: {\n\t\t\t\tred: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tgreen: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tblue: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thsla: {\n\t\t\tprops: {\n\t\t\t\thue: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"degrees\"\n\t\t\t\t},\n\t\t\t\tsaturation: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t},\n\t\t\t\tlightness: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tpropTypes = {\n\t\t\"byte\": {\n\t\t\tfloor: true,\n\t\t\tmax: 255\n\t\t},\n\t\t\"percent\": {\n\t\t\tmax: 1\n\t\t},\n\t\t\"degrees\": {\n\t\t\tmod: 360,\n\t\t\tfloor: true\n\t\t}\n\t},\n\tsupport = color.support = {},\n\n\t// element for support tests\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\n\n\t// colors = jQuery.Color.names\n\tcolors,\n\n\t// local aliases of functions called often\n\teach = jQuery.each;\n\n// determine rgba support immediately\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\n\n// define cache name and alpha properties\n// for rgba and hsla spaces\neach( spaces, function( spaceName, space ) {\n\tspace.cache = \"_\" + spaceName;\n\tspace.props.alpha = {\n\t\tidx: 3,\n\t\ttype: \"percent\",\n\t\tdef: 1\n\t};\n});\n\nfunction clamp( value, prop, allowEmpty ) {\n\tvar type = propTypes[ prop.type ] || {};\n\n\tif ( value == null ) {\n\t\treturn (allowEmpty || !prop.def) ? null : prop.def;\n\t}\n\n\t// ~~ is an short way of doing floor for positive numbers\n\tvalue = type.floor ? ~~value : parseFloat( value );\n\n\t// IE will pass in empty strings as value for alpha,\n\t// which will hit this case\n\tif ( isNaN( value ) ) {\n\t\treturn prop.def;\n\t}\n\n\tif ( type.mod ) {\n\t\t// we add mod before modding to make sure that negatives values\n\t\t// get converted properly: -10 -> 350\n\t\treturn (value + type.mod) % type.mod;\n\t}\n\n\t// for now all property types without mod have min and max\n\treturn 0 > value ? 0 : type.max < value ? type.max : value;\n}\n\nfunction stringParse( string ) {\n\tvar inst = color(),\n\t\trgba = inst._rgba = [];\n\n\tstring = string.toLowerCase();\n\n\teach( stringParsers, function( i, parser ) {\n\t\tvar parsed,\n\t\t\tmatch = parser.re.exec( string ),\n\t\t\tvalues = match && parser.parse( match ),\n\t\t\tspaceName = parser.space || \"rgba\";\n\n\t\tif ( values ) {\n\t\t\tparsed = inst[ spaceName ]( values );\n\n\t\t\t// if this was an rgba parse the assignment might happen twice\n\t\t\t// oh well....\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\n\t\t\trgba = inst._rgba = parsed._rgba;\n\n\t\t\t// exit each( stringParsers ) here because we matched\n\t\t\treturn false;\n\t\t}\n\t});\n\n\t// Found a stringParser that handled it\n\tif ( rgba.length ) {\n\n\t\t// if this came from a parsed string, force \"transparent\" when alpha is 0\n\t\t// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\n\t\t\tjQuery.extend( rgba, colors.transparent );\n\t\t}\n\t\treturn inst;\n\t}\n\n\t// named colors\n\treturn colors[ string ];\n}\n\ncolor.fn = jQuery.extend( color.prototype, {\n\tparse: function( red, green, blue, alpha ) {\n\t\tif ( red === undefined ) {\n\t\t\tthis._rgba = [ null, null, null, null ];\n\t\t\treturn this;\n\t\t}\n\t\tif ( red.jquery || red.nodeType ) {\n\t\t\tred = jQuery( red ).css( green );\n\t\t\tgreen = undefined;\n\t\t}\n\n\t\tvar inst = this,\n\t\t\ttype = jQuery.type( red ),\n\t\t\trgba = this._rgba = [];\n\n\t\t// more than 1 argument specified - assume ( red, green, blue, alpha )\n\t\tif ( green !== undefined ) {\n\t\t\tred = [ red, green, blue, alpha ];\n\t\t\ttype = \"array\";\n\t\t}\n\n\t\tif ( type === \"string\" ) {\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\n\t\t}\n\n\t\tif ( type === \"array\" ) {\n\t\t\teach( spaces.rgba.props, function( key, prop ) {\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( type === \"object\" ) {\n\t\t\tif ( red instanceof color ) {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tif ( red[ space.cache ] ) {\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tvar cache = space.cache;\n\t\t\t\t\teach( space.props, function( key, prop ) {\n\n\t\t\t\t\t\t// if the cache doesn't exist, and we know how to convert\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\n\n\t\t\t\t\t\t\t// if the value was null, we don't need to copy it\n\t\t\t\t\t\t\t// if the key was alpha, we don't need to copy it either\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// this is the only case where we allow nulls for ALL properties.\n\t\t\t\t\t\t// call clamp with alwaysAllowEmpty\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\n\t\t\t\t\t});\n\n\t\t\t\t\t// everything defined but alpha?\n\t\t\t\t\tif ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\n\t\t\t\t\t\t// use the default of 1\n\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\n\t\t\t\t\t\tif ( space.from ) {\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t},\n\tis: function( compare ) {\n\t\tvar is = color( compare ),\n\t\t\tsame = true,\n\t\t\tinst = this;\n\n\t\teach( spaces, function( _, space ) {\n\t\t\tvar localCache,\n\t\t\t\tisCache = is[ space.cache ];\n\t\t\tif (isCache) {\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\n\t\t\t\teach( space.props, function( _, prop ) {\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\n\t\t\t\t\t\treturn same;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn same;\n\t\t});\n\t\treturn same;\n\t},\n\t_space: function() {\n\t\tvar used = [],\n\t\t\tinst = this;\n\t\teach( spaces, function( spaceName, space ) {\n\t\t\tif ( inst[ space.cache ] ) {\n\t\t\t\tused.push( spaceName );\n\t\t\t}\n\t\t});\n\t\treturn used.pop();\n\t},\n\ttransition: function( other, distance ) {\n\t\tvar end = color( other ),\n\t\t\tspaceName = end._space(),\n\t\t\tspace = spaces[ spaceName ],\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\n\t\t\tresult = start.slice();\n\n\t\tend = end[ space.cache ];\n\t\teach( space.props, function( key, prop ) {\n\t\t\tvar index = prop.idx,\n\t\t\t\tstartValue = start[ index ],\n\t\t\t\tendValue = end[ index ],\n\t\t\t\ttype = propTypes[ prop.type ] || {};\n\n\t\t\t// if null, don't override start value\n\t\t\tif ( endValue === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// if null - use end\n\t\t\tif ( startValue === null ) {\n\t\t\t\tresult[ index ] = endValue;\n\t\t\t} else {\n\t\t\t\tif ( type.mod ) {\n\t\t\t\t\tif ( endValue - startValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue += type.mod;\n\t\t\t\t\t} else if ( startValue - endValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue -= type.mod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\n\t\t\t}\n\t\t});\n\t\treturn this[ spaceName ]( result );\n\t},\n\tblend: function( opaque ) {\n\t\t// if we are already opaque - return ourself\n\t\tif ( this._rgba[ 3 ] === 1 ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar rgb = this._rgba.slice(),\n\t\t\ta = rgb.pop(),\n\t\t\tblend = color( opaque )._rgba;\n\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\n\t\t}));\n\t},\n\ttoRgbaString: function() {\n\t\tvar prefix = \"rgba(\",\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\n\t\t\t\treturn v == null ? ( i > 2 ? 1 : 0 ) : v;\n\t\t\t});\n\n\t\tif ( rgba[ 3 ] === 1 ) {\n\t\t\trgba.pop();\n\t\t\tprefix = \"rgb(\";\n\t\t}\n\n\t\treturn prefix + rgba.join() + \")\";\n\t},\n\ttoHslaString: function() {\n\t\tvar prefix = \"hsla(\",\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\n\t\t\t\tif ( v == null ) {\n\t\t\t\t\tv = i > 2 ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\t// catch 1 and 2\n\t\t\t\tif ( i && i < 3 ) {\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t});\n\n\t\tif ( hsla[ 3 ] === 1 ) {\n\t\t\thsla.pop();\n\t\t\tprefix = \"hsl(\";\n\t\t}\n\t\treturn prefix + hsla.join() + \")\";\n\t},\n\ttoHexString: function( includeAlpha ) {\n\t\tvar rgba = this._rgba.slice(),\n\t\t\talpha = rgba.pop();\n\n\t\tif ( includeAlpha ) {\n\t\t\trgba.push( ~~( alpha * 255 ) );\n\t\t}\n\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\n\n\t\t\t// default to 0 when nulls exist\n\t\t\tv = ( v || 0 ).toString( 16 );\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\n\t\t}).join(\"\");\n\t},\n\ttoString: function() {\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\n\t}\n});\ncolor.fn.parse.prototype = color.fn;\n\n// hsla conversions adapted from:\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\n\nfunction hue2rgb( p, q, h ) {\n\th = ( h + 1 ) % 1;\n\tif ( h * 6 < 1 ) {\n\t\treturn p + ( q - p ) * h * 6;\n\t}\n\tif ( h * 2 < 1) {\n\t\treturn q;\n\t}\n\tif ( h * 3 < 2 ) {\n\t\treturn p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;\n\t}\n\treturn p;\n}\n\nspaces.hsla.to = function( rgba ) {\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\n\t\treturn [ null, null, null, rgba[ 3 ] ];\n\t}\n\tvar r = rgba[ 0 ] / 255,\n\t\tg = rgba[ 1 ] / 255,\n\t\tb = rgba[ 2 ] / 255,\n\t\ta = rgba[ 3 ],\n\t\tmax = Math.max( r, g, b ),\n\t\tmin = Math.min( r, g, b ),\n\t\tdiff = max - min,\n\t\tadd = max + min,\n\t\tl = add * 0.5,\n\t\th, s;\n\n\tif ( min === max ) {\n\t\th = 0;\n\t} else if ( r === max ) {\n\t\th = ( 60 * ( g - b ) / diff ) + 360;\n\t} else if ( g === max ) {\n\t\th = ( 60 * ( b - r ) / diff ) + 120;\n\t} else {\n\t\th = ( 60 * ( r - g ) / diff ) + 240;\n\t}\n\n\t// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n\t// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\n\tif ( diff === 0 ) {\n\t\ts = 0;\n\t} else if ( l <= 0.5 ) {\n\t\ts = diff / add;\n\t} else {\n\t\ts = diff / ( 2 - add );\n\t}\n\treturn [ Math.round(h) % 360, s, l, a == null ? 1 : a ];\n};\n\nspaces.hsla.from = function( hsla ) {\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\n\t\treturn [ null, null, null, hsla[ 3 ] ];\n\t}\n\tvar h = hsla[ 0 ] / 360,\n\t\ts = hsla[ 1 ],\n\t\tl = hsla[ 2 ],\n\t\ta = hsla[ 3 ],\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\n\t\tp = 2 * l - q;\n\n\treturn [\n\t\tMath.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),\n\t\ta\n\t];\n};\n\neach( spaces, function( spaceName, space ) {\n\tvar props = space.props,\n\t\tcache = space.cache,\n\t\tto = space.to,\n\t\tfrom = space.from;\n\n\t// makes rgba() and hsla()\n\tcolor.fn[ spaceName ] = function( value ) {\n\n\t\t// generate a cache for this space if it doesn't exist\n\t\tif ( to && !this[ cache ] ) {\n\t\t\tthis[ cache ] = to( this._rgba );\n\t\t}\n\t\tif ( value === undefined ) {\n\t\t\treturn this[ cache ].slice();\n\t\t}\n\n\t\tvar ret,\n\t\t\ttype = jQuery.type( value ),\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\n\t\t\tlocal = this[ cache ].slice();\n\n\t\teach( props, function( key, prop ) {\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\n\t\t\tif ( val == null ) {\n\t\t\t\tval = local[ prop.idx ];\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\n\t\t});\n\n\t\tif ( from ) {\n\t\t\tret = color( from( local ) );\n\t\t\tret[ cache ] = local;\n\t\t\treturn ret;\n\t\t} else {\n\t\t\treturn color( local );\n\t\t}\n\t};\n\n\t// makes red() green() blue() alpha() hue() saturation() lightness()\n\teach( props, function( key, prop ) {\n\t\t// alpha is included in more than one space\n\t\tif ( color.fn[ key ] ) {\n\t\t\treturn;\n\t\t}\n\t\tcolor.fn[ key ] = function( value ) {\n\t\t\tvar vtype = jQuery.type( value ),\n\t\t\t\tfn = ( key === \"alpha\" ? ( this._hsla ? \"hsla\" : \"rgba\" ) : spaceName ),\n\t\t\t\tlocal = this[ fn ](),\n\t\t\t\tcur = local[ prop.idx ],\n\t\t\t\tmatch;\n\n\t\t\tif ( vtype === \"undefined\" ) {\n\t\t\t\treturn cur;\n\t\t\t}\n\n\t\t\tif ( vtype === \"function\" ) {\n\t\t\t\tvalue = value.call( this, cur );\n\t\t\t\tvtype = jQuery.type( value );\n\t\t\t}\n\t\t\tif ( value == null && prop.empty ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( vtype === \"string\" ) {\n\t\t\t\tmatch = rplusequals.exec( value );\n\t\t\t\tif ( match ) {\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = value;\n\t\t\treturn this[ fn ]( local );\n\t\t};\n\t});\n});\n\n// add cssHook and .fx.step function for each named hook.\n// accept a space separated string of properties\ncolor.hook = function( hook ) {\n\tvar hooks = hook.split( \" \" );\n\teach( hooks, function( i, hook ) {\n\t\tjQuery.cssHooks[ hook ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar parsed, curElem,\n\t\t\t\t\tbackgroundColor = \"\";\n\n\t\t\t\tif ( value !== \"transparent\" && ( jQuery.type( value ) !== \"string\" || ( parsed = stringParse( value ) ) ) ) {\n\t\t\t\t\tvalue = color( parsed || value );\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t(backgroundColor === \"\" || backgroundColor === \"transparent\") &&\n\t\t\t\t\t\t\tcurElem && curElem.style\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\n\t\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\n\t\t\t\t\t\t\tbackgroundColor :\n\t\t\t\t\t\t\t\"_default\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = value.toRgbaString();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\telem.style[ hook ] = value;\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// wrapped to prevent IE from throwing errors on \"invalid\" values like 'auto' or 'inherit'\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\n\t\t\tif ( !fx.colorInit ) {\n\t\t\t\tfx.start = color( fx.elem, hook );\n\t\t\t\tfx.end = color( fx.end );\n\t\t\t\tfx.colorInit = true;\n\t\t\t}\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\n\t\t};\n\t});\n\n};\n\ncolor.hook( stepHooks );\n\njQuery.cssHooks.borderColor = {\n\texpand: function( value ) {\n\t\tvar expanded = {};\n\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( i, part ) {\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\n\t\t});\n\t\treturn expanded;\n\t}\n};\n\n// Basic color names only.\n// Usage of any of the other color names requires adding yourself or including\n// jquery.color.svg-names.js.\ncolors = jQuery.Color.names = {\n\t// 4.1. Basic color keywords\n\taqua: \"#00ffff\",\n\tblack: \"#000000\",\n\tblue: \"#0000ff\",\n\tfuchsia: \"#ff00ff\",\n\tgray: \"#808080\",\n\tgreen: \"#008000\",\n\tlime: \"#00ff00\",\n\tmaroon: \"#800000\",\n\tnavy: \"#000080\",\n\tolive: \"#808000\",\n\tpurple: \"#800080\",\n\tred: \"#ff0000\",\n\tsilver: \"#c0c0c0\",\n\tteal: \"#008080\",\n\twhite: \"#ffffff\",\n\tyellow: \"#ffff00\",\n\n\t// 4.2.3. \"transparent\" color keyword\n\ttransparent: [ null, null, null, 0 ],\n\n\t_default: \"#ffffff\"\n};\n\n})( jQuery );\n\n/******************************************************************************/\n/****************************** CLASS ANIMATIONS ******************************/\n/******************************************************************************/\n(function() {\n\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\n\tshorthandStyles = {\n\t\tborder: 1,\n\t\tborderBottom: 1,\n\t\tborderColor: 1,\n\t\tborderLeft: 1,\n\t\tborderRight: 1,\n\t\tborderTop: 1,\n\t\tborderWidth: 1,\n\t\tmargin: 1,\n\t\tpadding: 1\n\t};\n\n$.each([ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ], function( _, prop ) {\n\t$.fx.step[ prop ] = function( fx ) {\n\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\n\t\t\tjQuery.style( fx.elem, prop, fx.end );\n\t\t\tfx.setAttr = true;\n\t\t}\n\t};\n});\n\nfunction getElementStyles( elem ) {\n\tvar key, len,\n\t\tstyle = elem.ownerDocument.defaultView ?\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\n\t\t\telem.currentStyle,\n\t\tstyles = {};\n\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\n\t\tlen = style.length;\n\t\twhile ( len-- ) {\n\t\t\tkey = style[ len ];\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ $.camelCase( key ) ] = style[ key ];\n\t\t\t}\n\t\t}\n\t// support: Opera, IE <9\n\t} else {\n\t\tfor ( key in style ) {\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ key ] = style[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn styles;\n}\n\nfunction styleDifference( oldStyle, newStyle ) {\n\tvar diff = {},\n\t\tname, value;\n\n\tfor ( name in newStyle ) {\n\t\tvalue = newStyle[ name ];\n\t\tif ( oldStyle[ name ] !== value ) {\n\t\t\tif ( !shorthandStyles[ name ] ) {\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\n\t\t\t\t\tdiff[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diff;\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n$.effects.animateClass = function( value, duration, easing, callback ) {\n\tvar o = $.speed( duration, easing, callback );\n\n\treturn this.queue( function() {\n\t\tvar animated = $( this ),\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\n\t\t\tapplyClassChange,\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\n\n\t\t// map the animated objects to store the original styles.\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar el = $( this );\n\t\t\treturn {\n\t\t\t\tel: el,\n\t\t\t\tstart: getElementStyles( this )\n\t\t\t};\n\t\t});\n\n\t\t// apply class change\n\t\tapplyClassChange = function() {\n\t\t\t$.each( classAnimationActions, function(i, action) {\n\t\t\t\tif ( value[ action ] ) {\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tapplyClassChange();\n\n\t\t// map all animated objects again - calculate new styles and diff\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\n\t\t\tthis.diff = styleDifference( this.start, this.end );\n\t\t\treturn this;\n\t\t});\n\n\t\t// apply original class\n\t\tanimated.attr( \"class\", baseClass );\n\n\t\t// map all animated objects again - this time collecting a promise\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar styleInfo = this,\n\t\t\t\tdfd = $.Deferred(),\n\t\t\t\topts = $.extend({}, o, {\n\t\t\t\t\tqueue: false,\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tdfd.resolve( styleInfo );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tthis.el.animate( this.diff, opts );\n\t\t\treturn dfd.promise();\n\t\t});\n\n\t\t// once all animations have completed:\n\t\t$.when.apply( $, allAnimations.get() ).done(function() {\n\n\t\t\t// set the final class\n\t\t\tapplyClassChange();\n\n\t\t\t// for each animated element,\n\t\t\t// clear all css properties that were animated\n\t\t\t$.each( arguments, function() {\n\t\t\t\tvar el = this.el;\n\t\t\t\t$.each( this.diff, function(key) {\n\t\t\t\t\tel.css( key, \"\" );\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// this is guarnteed to be there if you use jQuery.speed()\n\t\t\t// it also handles dequeuing the next anim...\n\t\t\to.complete.call( animated[ 0 ] );\n\t\t});\n\t});\n};\n\n$.fn.extend({\n\taddClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn speed ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.addClass ),\n\n\tremoveClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn arguments.length > 1 ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.removeClass ),\n\n\ttoggleClass: (function( orig ) {\n\t\treturn function( classNames, force, speed, easing, callback ) {\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\n\t\t\t\tif ( !speed ) {\n\t\t\t\t\t// without speed parameter\n\t\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t\t(force ? { add: classNames } : { remove: classNames }),\n\t\t\t\t\t\tspeed, easing, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// without force parameter\n\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggleClass ),\n\n\tswitchClass: function( remove, add, speed, easing, callback) {\n\t\treturn $.effects.animateClass.call( this, {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}, speed, easing, callback );\n\t}\n});\n\n})();\n\n/******************************************************************************/\n/*********************************** EFFECTS **********************************/\n/******************************************************************************/\n\n(function() {\n\n$.extend( $.effects, {\n\tversion: \"1.11.4\",\n\n\t// Saves a set of properties in a data storage\n\tsave: function( element, set ) {\n\t\tfor ( var i = 0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Restores a set of previously saved properties from a data storage\n\trestore: function( element, set ) {\n\t\tvar val, i;\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\tval = element.data( dataSpace + set[ i ] );\n\t\t\t\t// support: jQuery 1.6.2\n\t\t\t\t// http://bugs.jquery.com/ticket/9917\n\t\t\t\t// jQuery 1.6.2 incorrectly returns undefined for any falsy value.\n\t\t\t\t// We can't differentiate between \"\" and 0 here, so we just assume\n\t\t\t\t// empty string since it's likely to be a more common value...\n\t\t\t\tif ( val === undefined ) {\n\t\t\t\t\tval = \"\";\n\t\t\t\t}\n\t\t\t\telement.css( set[ i ], val );\n\t\t\t}\n\t\t}\n\t},\n\n\tsetMode: function( el, mode ) {\n\t\tif (mode === \"toggle\") {\n\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n\t\t}\n\t\treturn mode;\n\t},\n\n\t// Translates a [top,left] array into a baseline value\n\t// this should be a little more flexible in the future to handle a string & hash\n\tgetBaseline: function( origin, original ) {\n\t\tvar y, x;\n\t\tswitch ( origin[ 0 ] ) {\n\t\t\tcase \"top\": y = 0; break;\n\t\t\tcase \"middle\": y = 0.5; break;\n\t\t\tcase \"bottom\": y = 1; break;\n\t\t\tdefault: y = origin[ 0 ] / original.height;\n\t\t}\n\t\tswitch ( origin[ 1 ] ) {\n\t\t\tcase \"left\": x = 0; break;\n\t\t\tcase \"center\": x = 0.5; break;\n\t\t\tcase \"right\": x = 1; break;\n\t\t\tdefault: x = origin[ 1 ] / original.width;\n\t\t}\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\n\t// Wraps the element around a wrapper that copies position properties\n\tcreateWrapper: function( element ) {\n\n\t\t// if the element is already wrapped, return it\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" )) {\n\t\t\treturn element.parent();\n\t\t}\n\n\t\t// wrap the element\n\t\tvar props = {\n\t\t\t\twidth: element.outerWidth(true),\n\t\t\t\theight: element.outerHeight(true),\n\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t},\n\t\t\twrapper = $( \"<div></div>\" )\n\t\t\t\t.addClass( \"ui-effects-wrapper\" )\n\t\t\t\t.css({\n\t\t\t\t\tfontSize: \"100%\",\n\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0\n\t\t\t\t}),\n\t\t\t// Store the size in case width/height are defined in % - Fixes #5245\n\t\t\tsize = {\n\t\t\t\twidth: element.width(),\n\t\t\t\theight: element.height()\n\t\t\t},\n\t\t\tactive = document.activeElement;\n\n\t\t// support: Firefox\n\t\t// Firefox incorrectly exposes anonymous content\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\n\t\ttry {\n\t\t\tactive.id;\n\t\t} catch ( e ) {\n\t\t\tactive = document.body;\n\t\t}\n\n\t\telement.wrap( wrapper );\n\n\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t$( active ).focus();\n\t\t}\n\n\t\twrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element\n\n\t\t// transfer positioning properties to the wrapper\n\t\tif ( element.css( \"position\" ) === \"static\" ) {\n\t\t\twrapper.css({ position: \"relative\" });\n\t\t\telement.css({ position: \"relative\" });\n\t\t} else {\n\t\t\t$.extend( props, {\n\t\t\t\tposition: element.css( \"position\" ),\n\t\t\t\tzIndex: element.css( \"z-index\" )\n\t\t\t});\n\t\t\t$.each([ \"top\", \"left\", \"bottom\", \"right\" ], function(i, pos) {\n\t\t\t\tprops[ pos ] = element.css( pos );\n\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n\t\t\t\t\tprops[ pos ] = \"auto\";\n\t\t\t\t}\n\t\t\t});\n\t\t\telement.css({\n\t\t\t\tposition: \"relative\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: \"auto\",\n\t\t\t\tbottom: \"auto\"\n\t\t\t});\n\t\t}\n\t\telement.css(size);\n\n\t\treturn wrapper.css( props ).show();\n\t},\n\n\tremoveWrapper: function( element ) {\n\t\tvar active = document.activeElement;\n\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\telement.parent().replaceWith( element );\n\n\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t$( active ).focus();\n\t\t\t}\n\t\t}\n\n\t\treturn element;\n\t},\n\n\tsetTransition: function( element, list, factor, value ) {\n\t\tvalue = value || {};\n\t\t$.each( list, function( i, x ) {\n\t\t\tvar unit = element.cssUnit( x );\n\t\t\tif ( unit[ 0 ] > 0 ) {\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\n\t\t\t}\n\t\t});\n\t\treturn value;\n\t}\n});\n\n// return an effect options object for the given parameters:\nfunction _normalizeArguments( effect, options, speed, callback ) {\n\n\t// allow passing all options as the first parameter\n\tif ( $.isPlainObject( effect ) ) {\n\t\toptions = effect;\n\t\teffect = effect.effect;\n\t}\n\n\t// convert to an object\n\teffect = { effect: effect };\n\n\t// catch (effect, null, ...)\n\tif ( options == null ) {\n\t\toptions = {};\n\t}\n\n\t// catch (effect, callback)\n\tif ( $.isFunction( options ) ) {\n\t\tcallback = options;\n\t\tspeed = null;\n\t\toptions = {};\n\t}\n\n\t// catch (effect, speed, ?)\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\n\t\tcallback = speed;\n\t\tspeed = options;\n\t\toptions = {};\n\t}\n\n\t// catch (effect, options, callback)\n\tif ( $.isFunction( speed ) ) {\n\t\tcallback = speed;\n\t\tspeed = null;\n\t}\n\n\t// add options to effect\n\tif ( options ) {\n\t\t$.extend( effect, options );\n\t}\n\n\tspeed = speed || options.duration;\n\teffect.duration = $.fx.off ? 0 :\n\t\ttypeof speed === \"number\" ? speed :\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\n\t\t$.fx.speeds._default;\n\n\teffect.complete = callback || options.complete;\n\n\treturn effect;\n}\n\nfunction standardAnimationOption( option ) {\n\t// Valid standard speeds (nothing, number, named speed)\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Invalid strings - treat as \"normal\" speed\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Complete callback\n\tif ( $.isFunction( option ) ) {\n\t\treturn true;\n\t}\n\n\t// Options hash (but not naming an effect)\n\tif ( typeof option === \"object\" && !option.effect ) {\n\t\treturn true;\n\t}\n\n\t// Didn't match any standard API\n\treturn false;\n}\n\n$.fn.extend({\n\teffect: function( /* effect, options, speed, callback */ ) {\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\n\t\t\tmode = args.mode,\n\t\t\tqueue = args.queue,\n\t\t\teffectMethod = $.effects.effect[ args.effect ];\n\n\t\tif ( $.fx.off || !effectMethod ) {\n\t\t\t// delegate to the original method (e.g., .show()) if possible\n\t\t\tif ( mode ) {\n\t\t\t\treturn this[ mode ]( args.duration, args.complete );\n\t\t\t} else {\n\t\t\t\treturn this.each( function() {\n\t\t\t\t\tif ( args.complete ) {\n\t\t\t\t\t\targs.complete.call( this );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction run( next ) {\n\t\t\tvar elem = $( this ),\n\t\t\t\tcomplete = args.complete,\n\t\t\t\tmode = args.mode;\n\n\t\t\tfunction done() {\n\t\t\t\tif ( $.isFunction( complete ) ) {\n\t\t\t\t\tcomplete.call( elem[0] );\n\t\t\t\t}\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the element already has the correct final state, delegate to\n\t\t\t// the core methods so the internal tracking of \"olddisplay\" works.\n\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n\t\t\t\telem[ mode ]();\n\t\t\t\tdone();\n\t\t\t} else {\n\t\t\t\teffectMethod.call( elem[0], args, done );\n\t\t\t}\n\t\t}\n\n\t\treturn queue === false ? this.each( run ) : this.queue( queue || \"fx\", run );\n\t},\n\n\tshow: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"show\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.show ),\n\n\thide: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"hide\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.hide ),\n\n\ttoggle: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"toggle\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggle ),\n\n\t// helper functions\n\tcssUnit: function(key) {\n\t\tvar style = this.css( key ),\n\t\t\tval = [];\n\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\n\t\t\t\tval = [ parseFloat( style ), unit ];\n\t\t\t}\n\t\t});\n\t\treturn val;\n\t}\n});\n\n})();\n\n/******************************************************************************/\n/*********************************** EASING ***********************************/\n/******************************************************************************/\n\n(function() {\n\n// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\nvar baseEasings = {};\n\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\n\tbaseEasings[ name ] = function( p ) {\n\t\treturn Math.pow( p, i + 2 );\n\t};\n});\n\n$.extend( baseEasings, {\n\tSine: function( p ) {\n\t\treturn 1 - Math.cos( p * Math.PI / 2 );\n\t},\n\tCirc: function( p ) {\n\t\treturn 1 - Math.sqrt( 1 - p * p );\n\t},\n\tElastic: function( p ) {\n\t\treturn p === 0 || p === 1 ? p :\n\t\t\t-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );\n\t},\n\tBack: function( p ) {\n\t\treturn p * p * ( 3 * p - 2 );\n\t},\n\tBounce: function( p ) {\n\t\tvar pow2,\n\t\t\tbounce = 4;\n\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}\n\t\treturn 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );\n\t}\n});\n\n$.each( baseEasings, function( name, easeIn ) {\n\t$.easing[ \"easeIn\" + name ] = easeIn;\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\n\t\treturn 1 - easeIn( 1 - p );\n\t};\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\n\t\treturn p < 0.5 ?\n\t\t\teaseIn( p * 2 ) / 2 :\n\t\t\t1 - easeIn( p * -2 + 2 ) / 2;\n\t};\n});\n\n})();\n\nvar effect = $.effects;\n\n\n/*!\n * jQuery UI Effects Blind 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/blind-effect/\n */\n\n\nvar effectBlind = $.effects.effect.blind = function( o, done ) {\n\t// Create element\n\tvar el = $( this ),\n\t\trvertical = /up|down|vertical/,\n\t\trpositivemotion = /up|left|vertical|horizontal/,\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tdirection = o.direction || \"up\",\n\t\tvertical = rvertical.test( direction ),\n\t\tref = vertical ? \"height\" : \"width\",\n\t\tref2 = vertical ? \"top\" : \"left\",\n\t\tmotion = rpositivemotion.test( direction ),\n\t\tanimation = {},\n\t\tshow = mode === \"show\",\n\t\twrapper, distance, margin;\n\n\t// if already wrapped, the wrapper's properties are my property. #6245\n\tif ( el.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t$.effects.save( el.parent(), props );\n\t} else {\n\t\t$.effects.save( el, props );\n\t}\n\tel.show();\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\n\tdistance = wrapper[ ref ]();\n\tmargin = parseFloat( wrapper.css( ref2 ) ) || 0;\n\n\tanimation[ ref ] = show ? distance : 0;\n\tif ( !motion ) {\n\t\tel\n\t\t\t.css( vertical ? \"bottom\" : \"right\", 0 )\n\t\t\t.css( vertical ? \"top\" : \"left\", \"auto\" )\n\t\t\t.css({ position: \"absolute\" });\n\n\t\tanimation[ ref2 ] = show ? margin : distance + margin;\n\t}\n\n\t// start at 0 if we are showing\n\tif ( show ) {\n\t\twrapper.css( ref, 0 );\n\t\tif ( !motion ) {\n\t\t\twrapper.css( ref2, margin + distance );\n\t\t}\n\t}\n\n\t// Animate\n\twrapper.animate( animation, {\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tqueue: false,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Bounce 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/bounce-effect/\n */\n\n\nvar effectBounce = $.effects.effect.bounce = function( o, done ) {\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\n\t\t// defaults:\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\thide = mode === \"hide\",\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"up\",\n\t\tdistance = o.distance,\n\t\ttimes = o.times || 5,\n\n\t\t// number of internal animations\n\t\tanims = times * 2 + ( show || hide ? 1 : 0 ),\n\t\tspeed = o.duration / anims,\n\t\teasing = o.easing,\n\n\t\t// utility:\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ),\n\t\ti,\n\t\tupAnim,\n\t\tdownAnim,\n\n\t\t// we will need to re-assemble the queue to stack our animations in place\n\t\tqueue = el.queue(),\n\t\tqueuelen = queue.length;\n\n\t// Avoid touching opacity to prevent clearType and PNG issues in IE\n\tif ( show || hide ) {\n\t\tprops.push( \"opacity\" );\n\t}\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el ); // Create Wrapper\n\n\t// default distance for the BIGGEST bounce is the outer Distance / 3\n\tif ( !distance ) {\n\t\tdistance = el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]() / 3;\n\t}\n\n\tif ( show ) {\n\t\tdownAnim = { opacity: 1 };\n\t\tdownAnim[ ref ] = 0;\n\n\t\t// if we are showing, force opacity 0 and set the initial position\n\t\t// then do the \"first\" animation\n\t\tel.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion ? -distance * 2 : distance * 2 )\n\t\t\t.animate( downAnim, speed, easing );\n\t}\n\n\t// start at the smallest distance if we are hiding\n\tif ( hide ) {\n\t\tdistance = distance / Math.pow( 2, times - 1 );\n\t}\n\n\tdownAnim = {};\n\tdownAnim[ ref ] = 0;\n\t// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here\n\tfor ( i = 0; i < times; i++ ) {\n\t\tupAnim = {};\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\tel.animate( upAnim, speed, easing )\n\t\t\t.animate( downAnim, speed, easing );\n\n\t\tdistance = hide ? distance * 2 : distance / 2;\n\t}\n\n\t// Last Bounce when Hiding\n\tif ( hide ) {\n\t\tupAnim = { opacity: 0 };\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\tel.animate( upAnim, speed, easing );\n\t}\n\n\tel.queue(function() {\n\t\tif ( hide ) {\n\t\t\tel.hide();\n\t\t}\n\t\t$.effects.restore( el, props );\n\t\t$.effects.removeWrapper( el );\n\t\tdone();\n\t});\n\n\t// inject all the animations we just queued to be first in line (after \"inprogress\")\n\tif ( queuelen > 1) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\tel.dequeue();\n\n};\n\n\n/*!\n * jQuery UI Effects Clip 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/clip-effect/\n */\n\n\nvar effectClip = $.effects.effect.clip = function( o, done ) {\n\t// Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"vertical\",\n\t\tvert = direction === \"vertical\",\n\t\tsize = vert ? \"height\" : \"width\",\n\t\tposition = vert ? \"top\" : \"left\",\n\t\tanimation = {},\n\t\twrapper, animate, distance;\n\n\t// Save & Show\n\t$.effects.save( el, props );\n\tel.show();\n\n\t// Create Wrapper\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\tanimate = ( el[0].tagName === \"IMG\" ) ? wrapper : el;\n\tdistance = animate[ size ]();\n\n\t// Shift\n\tif ( show ) {\n\t\tanimate.css( size, 0 );\n\t\tanimate.css( position, distance / 2 );\n\t}\n\n\t// Create Animation Object:\n\tanimation[ size ] = show ? distance : 0;\n\tanimation[ position ] = show ? 0 : distance / 2;\n\n\t// Animate\n\tanimate.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( !show ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n\n};\n\n\n/*!\n * jQuery UI Effects Drop 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/drop-effect/\n */\n\n\nvar effectDrop = $.effects.effect.drop = function( o, done ) {\n\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"opacity\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ) ? \"pos\" : \"neg\",\n\t\tanimation = {\n\t\t\topacity: show ? 1 : 0\n\t\t},\n\t\tdistance;\n\n\t// Adjust\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ) / 2;\n\n\tif ( show ) {\n\t\tel\n\t\t\t.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion === \"pos\" ? -distance : distance );\n\t}\n\n\t// Animation\n\tanimation[ ref ] = ( show ?\n\t\t( motion === \"pos\" ? \"+=\" : \"-=\" ) :\n\t\t( motion === \"pos\" ? \"-=\" : \"+=\" ) ) +\n\t\tdistance;\n\n\t// Animate\n\tel.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Explode 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/explode-effect/\n */\n\n\nvar effectExplode = $.effects.effect.explode = function( o, done ) {\n\n\tvar rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,\n\t\tcells = rows,\n\t\tel = $( this ),\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\n\t\t// show and then visibility:hidden the element before calculating offset\n\t\toffset = el.show().css( \"visibility\", \"hidden\" ).offset(),\n\n\t\t// width and height of a piece\n\t\twidth = Math.ceil( el.outerWidth() / cells ),\n\t\theight = Math.ceil( el.outerHeight() / rows ),\n\t\tpieces = [],\n\n\t\t// loop\n\t\ti, j, left, top, mx, my;\n\n\t// children animate complete:\n\tfunction childComplete() {\n\t\tpieces.push( this );\n\t\tif ( pieces.length === rows * cells ) {\n\t\t\tanimComplete();\n\t\t}\n\t}\n\n\t// clone the element for each row and cell.\n\tfor ( i = 0; i < rows ; i++ ) { // ===>\n\t\ttop = offset.top + i * height;\n\t\tmy = i - ( rows - 1 ) / 2 ;\n\n\t\tfor ( j = 0; j < cells ; j++ ) { // |||\n\t\t\tleft = offset.left + j * width;\n\t\t\tmx = j - ( cells - 1 ) / 2 ;\n\n\t\t\t// Create a clone of the now hidden main element that will be absolute positioned\n\t\t\t// within a wrapper div off the -left and -top equal to size of our pieces\n\t\t\tel\n\t\t\t\t.clone()\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.wrap( \"<div></div>\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tvisibility: \"visible\",\n\t\t\t\t\tleft: -j * width,\n\t\t\t\t\ttop: -i * height\n\t\t\t\t})\n\n\t\t\t// select the wrapper - make it overflow: hidden and absolute positioned based on\n\t\t\t// where the original was located +left and +top equal to the size of pieces\n\t\t\t\t.parent()\n\t\t\t\t.addClass( \"ui-effects-explode\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height,\n\t\t\t\t\tleft: left + ( show ? mx * width : 0 ),\n\t\t\t\t\ttop: top + ( show ? my * height : 0 ),\n\t\t\t\t\topacity: show ? 0 : 1\n\t\t\t\t}).animate({\n\t\t\t\t\tleft: left + ( show ? 0 : mx * width ),\n\t\t\t\t\ttop: top + ( show ? 0 : my * height ),\n\t\t\t\t\topacity: show ? 1 : 0\n\t\t\t\t}, o.duration || 500, o.easing, childComplete );\n\t\t}\n\t}\n\n\tfunction animComplete() {\n\t\tel.css({\n\t\t\tvisibility: \"visible\"\n\t\t});\n\t\t$( pieces ).remove();\n\t\tif ( !show ) {\n\t\t\tel.hide();\n\t\t}\n\t\tdone();\n\t}\n};\n\n\n/*!\n * jQuery UI Effects Fade 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/fade-effect/\n */\n\n\nvar effectFade = $.effects.effect.fade = function( o, done ) {\n\tvar el = $( this ),\n\t\tmode = $.effects.setMode( el, o.mode || \"toggle\" );\n\n\tel.animate({\n\t\topacity: mode\n\t}, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: done\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Fold 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/fold-effect/\n */\n\n\nvar effectFold = $.effects.effect.fold = function( o, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tsize = o.size || 15,\n\t\tpercent = /([0-9]+)%/.exec( size ),\n\t\thorizFirst = !!o.horizFirst,\n\t\twidthFirst = show !== horizFirst,\n\t\tref = widthFirst ? [ \"width\", \"height\" ] : [ \"height\", \"width\" ],\n\t\tduration = o.duration / 2,\n\t\twrapper, distance,\n\t\tanimation1 = {},\n\t\tanimation2 = {};\n\n\t$.effects.save( el, props );\n\tel.show();\n\n\t// Create Wrapper\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\tdistance = widthFirst ?\n\t\t[ wrapper.width(), wrapper.height() ] :\n\t\t[ wrapper.height(), wrapper.width() ];\n\n\tif ( percent ) {\n\t\tsize = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];\n\t}\n\tif ( show ) {\n\t\twrapper.css( horizFirst ? {\n\t\t\theight: 0,\n\t\t\twidth: size\n\t\t} : {\n\t\t\theight: size,\n\t\t\twidth: 0\n\t\t});\n\t}\n\n\t// Animation\n\tanimation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;\n\tanimation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;\n\n\t// Animate\n\twrapper\n\t\t.animate( animation1, duration, o.easing )\n\t\t.animate( animation2, duration, o.easing, function() {\n\t\t\tif ( hide ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t});\n\n};\n\n\n/*!\n * jQuery UI Effects Highlight 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/highlight-effect/\n */\n\n\nvar effectHighlight = $.effects.effect.highlight = function( o, done ) {\n\tvar elem = $( this ),\n\t\tprops = [ \"backgroundImage\", \"backgroundColor\", \"opacity\" ],\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\n\t\tanimation = {\n\t\t\tbackgroundColor: elem.css( \"backgroundColor\" )\n\t\t};\n\n\tif (mode === \"hide\") {\n\t\tanimation.opacity = 0;\n\t}\n\n\t$.effects.save( elem, props );\n\n\telem\n\t\t.show()\n\t\t.css({\n\t\t\tbackgroundImage: \"none\",\n\t\t\tbackgroundColor: o.color || \"#ffff99\"\n\t\t})\n\t\t.animate( animation, {\n\t\t\tqueue: false,\n\t\t\tduration: o.duration,\n\t\t\teasing: o.easing,\n\t\t\tcomplete: function() {\n\t\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\t\telem.hide();\n\t\t\t\t}\n\t\t\t\t$.effects.restore( elem, props );\n\t\t\t\tdone();\n\t\t\t}\n\t\t});\n};\n\n\n/*!\n * jQuery UI Effects Size 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/size-effect/\n */\n\n\nvar effectSize = $.effects.effect.size = function( o, done ) {\n\n\t// Create element\n\tvar original, baseline, factor,\n\t\tel = $( this ),\n\t\tprops0 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\", \"overflow\", \"opacity\" ],\n\n\t\t// Always restore\n\t\tprops1 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"overflow\", \"opacity\" ],\n\n\t\t// Copy for children\n\t\tprops2 = [ \"width\", \"height\", \"overflow\" ],\n\t\tcProps = [ \"fontSize\" ],\n\t\tvProps = [ \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\" ],\n\t\thProps = [ \"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\" ],\n\n\t\t// Set options\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\trestore = o.restore || mode !== \"effect\",\n\t\tscale = o.scale || \"both\",\n\t\torigin = o.origin || [ \"middle\", \"center\" ],\n\t\tposition = el.css( \"position\" ),\n\t\tprops = restore ? props0 : props1,\n\t\tzero = {\n\t\t\theight: 0,\n\t\t\twidth: 0,\n\t\t\touterHeight: 0,\n\t\t\touterWidth: 0\n\t\t};\n\n\tif ( mode === \"show\" ) {\n\t\tel.show();\n\t}\n\toriginal = {\n\t\theight: el.height(),\n\t\twidth: el.width(),\n\t\touterHeight: el.outerHeight(),\n\t\touterWidth: el.outerWidth()\n\t};\n\n\tif ( o.mode === \"toggle\" && mode === \"show\" ) {\n\t\tel.from = o.to || zero;\n\t\tel.to = o.from || original;\n\t} else {\n\t\tel.from = o.from || ( mode === \"show\" ? zero : original );\n\t\tel.to = o.to || ( mode === \"hide\" ? zero : original );\n\t}\n\n\t// Set scaling factor\n\tfactor = {\n\t\tfrom: {\n\t\t\ty: el.from.height / original.height,\n\t\t\tx: el.from.width / original.width\n\t\t},\n\t\tto: {\n\t\t\ty: el.to.height / original.height,\n\t\t\tx: el.to.width / original.width\n\t\t}\n\t};\n\n\t// Scale the css box\n\tif ( scale === \"box\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tprops = props.concat( vProps );\n\t\t\tel.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );\n\t\t\tel.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );\n\t\t}\n\n\t\t// Horizontal props scaling\n\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\tprops = props.concat( hProps );\n\t\t\tel.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );\n\t\t\tel.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );\n\t\t}\n\t}\n\n\t// Scale the content\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tprops = props.concat( cProps ).concat( props2 );\n\t\t\tel.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );\n\t\t\tel.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );\n\t\t}\n\t}\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\tel.css( \"overflow\", \"hidden\" ).css( el.from );\n\n\t// Adjust\n\tif (origin) { // Calculate baseline shifts\n\t\tbaseline = $.effects.getBaseline( origin, original );\n\t\tel.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;\n\t\tel.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;\n\t\tel.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;\n\t\tel.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;\n\t}\n\tel.css( el.from ); // set top & left\n\n\t// Animate\n\tif ( scale === \"content\" || scale === \"both\" ) { // Scale the children\n\n\t\t// Add margins/font-size\n\t\tvProps = vProps.concat([ \"marginTop\", \"marginBottom\" ]).concat(cProps);\n\t\thProps = hProps.concat([ \"marginLeft\", \"marginRight\" ]);\n\t\tprops2 = props0.concat(vProps).concat(hProps);\n\n\t\tel.find( \"*[width]\" ).each( function() {\n\t\t\tvar child = $( this ),\n\t\t\t\tc_original = {\n\t\t\t\t\theight: child.height(),\n\t\t\t\t\twidth: child.width(),\n\t\t\t\t\touterHeight: child.outerHeight(),\n\t\t\t\t\touterWidth: child.outerWidth()\n\t\t\t\t};\n\t\t\tif (restore) {\n\t\t\t\t$.effects.save(child, props2);\n\t\t\t}\n\n\t\t\tchild.from = {\n\t\t\t\theight: c_original.height * factor.from.y,\n\t\t\t\twidth: c_original.width * factor.from.x,\n\t\t\t\touterHeight: c_original.outerHeight * factor.from.y,\n\t\t\t\touterWidth: c_original.outerWidth * factor.from.x\n\t\t\t};\n\t\t\tchild.to = {\n\t\t\t\theight: c_original.height * factor.to.y,\n\t\t\t\twidth: c_original.width * factor.to.x,\n\t\t\t\touterHeight: c_original.height * factor.to.y,\n\t\t\t\touterWidth: c_original.width * factor.to.x\n\t\t\t};\n\n\t\t\t// Vertical props scaling\n\t\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\t\tchild.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );\n\t\t\t\tchild.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );\n\t\t\t}\n\n\t\t\t// Horizontal props scaling\n\t\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\t\tchild.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );\n\t\t\t\tchild.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );\n\t\t\t}\n\n\t\t\t// Animate children\n\t\t\tchild.css( child.from );\n\t\t\tchild.animate( child.to, o.duration, o.easing, function() {\n\n\t\t\t\t// Restore children\n\t\t\t\tif ( restore ) {\n\t\t\t\t\t$.effects.restore( child, props2 );\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Animate\n\tel.animate( el.to, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( el.to.opacity === 0 ) {\n\t\t\t\tel.css( \"opacity\", el.from.opacity );\n\t\t\t}\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\tif ( !restore ) {\n\n\t\t\t\t// we need to calculate our new positioning based on the scaling\n\t\t\t\tif ( position === \"static\" ) {\n\t\t\t\t\tel.css({\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttop: el.to.top,\n\t\t\t\t\t\tleft: el.to.left\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$.each([ \"top\", \"left\" ], function( idx, pos ) {\n\t\t\t\t\t\tel.css( pos, function( _, str ) {\n\t\t\t\t\t\t\tvar val = parseInt( str, 10 ),\n\t\t\t\t\t\t\t\ttoRef = idx ? el.to.left : el.to.top;\n\n\t\t\t\t\t\t\t// if original was \"auto\", recalculate the new value from wrapper\n\t\t\t\t\t\t\tif ( str === \"auto\" ) {\n\t\t\t\t\t\t\t\treturn toRef + \"px\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn val + toRef + \"px\";\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n\n};\n\n\n/*!\n * jQuery UI Effects Scale 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/scale-effect/\n */\n\n\nvar effectScale = $.effects.effect.scale = function( o, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\toptions = $.extend( true, {}, o ),\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\tpercent = parseInt( o.percent, 10 ) ||\n\t\t\t( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === \"hide\" ? 0 : 100 ) ),\n\t\tdirection = o.direction || \"both\",\n\t\torigin = o.origin,\n\t\toriginal = {\n\t\t\theight: el.height(),\n\t\t\twidth: el.width(),\n\t\t\touterHeight: el.outerHeight(),\n\t\t\touterWidth: el.outerWidth()\n\t\t},\n\t\tfactor = {\n\t\t\ty: direction !== \"horizontal\" ? (percent / 100) : 1,\n\t\t\tx: direction !== \"vertical\" ? (percent / 100) : 1\n\t\t};\n\n\t// We are going to pass this effect to the size effect:\n\toptions.effect = \"size\";\n\toptions.queue = false;\n\toptions.complete = done;\n\n\t// Set default origin and restore for show/hide\n\tif ( mode !== \"effect\" ) {\n\t\toptions.origin = origin || [ \"middle\", \"center\" ];\n\t\toptions.restore = true;\n\t}\n\n\toptions.from = o.from || ( mode === \"show\" ? {\n\t\theight: 0,\n\t\twidth: 0,\n\t\touterHeight: 0,\n\t\touterWidth: 0\n\t} : original );\n\toptions.to = {\n\t\theight: original.height * factor.y,\n\t\twidth: original.width * factor.x,\n\t\touterHeight: original.outerHeight * factor.y,\n\t\touterWidth: original.outerWidth * factor.x\n\t};\n\n\t// Fade option to support puff\n\tif ( options.fade ) {\n\t\tif ( mode === \"show\" ) {\n\t\t\toptions.from.opacity = 0;\n\t\t\toptions.to.opacity = 1;\n\t\t}\n\t\tif ( mode === \"hide\" ) {\n\t\t\toptions.from.opacity = 1;\n\t\t\toptions.to.opacity = 0;\n\t\t}\n\t}\n\n\t// Animate\n\tel.effect( options );\n\n};\n\n\n/*!\n * jQuery UI Effects Puff 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/puff-effect/\n */\n\n\nvar effectPuff = $.effects.effect.puff = function( o, done ) {\n\tvar elem = $( this ),\n\t\tmode = $.effects.setMode( elem, o.mode || \"hide\" ),\n\t\thide = mode === \"hide\",\n\t\tpercent = parseInt( o.percent, 10 ) || 150,\n\t\tfactor = percent / 100,\n\t\toriginal = {\n\t\t\theight: elem.height(),\n\t\t\twidth: elem.width(),\n\t\t\touterHeight: elem.outerHeight(),\n\t\t\touterWidth: elem.outerWidth()\n\t\t};\n\n\t$.extend( o, {\n\t\teffect: \"scale\",\n\t\tqueue: false,\n\t\tfade: true,\n\t\tmode: mode,\n\t\tcomplete: done,\n\t\tpercent: hide ? percent : 100,\n\t\tfrom: hide ?\n\t\t\toriginal :\n\t\t\t{\n\t\t\t\theight: original.height * factor,\n\t\t\t\twidth: original.width * factor,\n\t\t\t\touterHeight: original.outerHeight * factor,\n\t\t\t\touterWidth: original.outerWidth * factor\n\t\t\t}\n\t});\n\n\telem.effect( o );\n};\n\n\n/*!\n * jQuery UI Effects Pulsate 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/pulsate-effect/\n */\n\n\nvar effectPulsate = $.effects.effect.pulsate = function( o, done ) {\n\tvar elem = $( this ),\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tshowhide = ( show || mode === \"hide\" ),\n\n\t\t// showing or hiding leaves of the \"last\" animation\n\t\tanims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),\n\t\tduration = o.duration / anims,\n\t\tanimateTo = 0,\n\t\tqueue = elem.queue(),\n\t\tqueuelen = queue.length,\n\t\ti;\n\n\tif ( show || !elem.is(\":visible\")) {\n\t\telem.css( \"opacity\", 0 ).show();\n\t\tanimateTo = 1;\n\t}\n\n\t// anims - 1 opacity \"toggles\"\n\tfor ( i = 1; i < anims; i++ ) {\n\t\telem.animate({\n\t\t\topacity: animateTo\n\t\t}, duration, o.easing );\n\t\tanimateTo = 1 - animateTo;\n\t}\n\n\telem.animate({\n\t\topacity: animateTo\n\t}, duration, o.easing);\n\n\telem.queue(function() {\n\t\tif ( hide ) {\n\t\t\telem.hide();\n\t\t}\n\t\tdone();\n\t});\n\n\t// We just queued up \"anims\" animations, we need to put them next in the queue\n\tif ( queuelen > 1 ) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\telem.dequeue();\n};\n\n\n/*!\n * jQuery UI Effects Shake 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/shake-effect/\n */\n\n\nvar effectShake = $.effects.effect.shake = function( o, done ) {\n\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\tdirection = o.direction || \"left\",\n\t\tdistance = o.distance || 20,\n\t\ttimes = o.times || 3,\n\t\tanims = times * 2 + 1,\n\t\tspeed = Math.round( o.duration / anims ),\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\n\t\tanimation = {},\n\t\tanimation1 = {},\n\t\tanimation2 = {},\n\t\ti,\n\n\t\t// we will need to re-assemble the queue to stack our animations in place\n\t\tqueue = el.queue(),\n\t\tqueuelen = queue.length;\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\n\t// Animation\n\tanimation[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance;\n\tanimation1[ ref ] = ( positiveMotion ? \"+=\" : \"-=\" ) + distance * 2;\n\tanimation2[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance * 2;\n\n\t// Animate\n\tel.animate( animation, speed, o.easing );\n\n\t// Shakes\n\tfor ( i = 1; i < times; i++ ) {\n\t\tel.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );\n\t}\n\tel\n\t\t.animate( animation1, speed, o.easing )\n\t\t.animate( animation, speed / 2, o.easing )\n\t\t.queue(function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t});\n\n\t// inject all the animations we just queued to be first in line (after \"inprogress\")\n\tif ( queuelen > 1) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\tel.dequeue();\n\n};\n\n\n/*!\n * jQuery UI Effects Slide 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/slide-effect/\n */\n\n\nvar effectSlide = $.effects.effect.slide = function( o, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"show\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"left\",\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\n\t\tdistance,\n\t\tanimation = {};\n\n\t// Adjust\n\t$.effects.save( el, props );\n\tel.show();\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true );\n\n\t$.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\n\tif ( show ) {\n\t\tel.css( ref, positiveMotion ? (isNaN(distance) ? \"-\" + distance : -distance) : distance );\n\t}\n\n\t// Animation\n\tanimation[ ref ] = ( show ?\n\t\t( positiveMotion ? \"+=\" : \"-=\") :\n\t\t( positiveMotion ? \"-=\" : \"+=\")) +\n\t\tdistance;\n\n\t// Animate\n\tel.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n\n/*!\n * jQuery UI Effects Transfer 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/transfer-effect/\n */\n\n\nvar effectTransfer = $.effects.effect.transfer = function( o, done ) {\n\tvar elem = $( this ),\n\t\ttarget = $( o.to ),\n\t\ttargetFixed = target.css( \"position\" ) === \"fixed\",\n\t\tbody = $(\"body\"),\n\t\tfixTop = targetFixed ? body.scrollTop() : 0,\n\t\tfixLeft = targetFixed ? body.scrollLeft() : 0,\n\t\tendPosition = target.offset(),\n\t\tanimation = {\n\t\t\ttop: endPosition.top - fixTop,\n\t\t\tleft: endPosition.left - fixLeft,\n\t\t\theight: target.innerHeight(),\n\t\t\twidth: target.innerWidth()\n\t\t},\n\t\tstartPosition = elem.offset(),\n\t\ttransfer = $( \"<div class='ui-effects-transfer'></div>\" )\n\t\t\t.appendTo( document.body )\n\t\t\t.addClass( o.className )\n\t\t\t.css({\n\t\t\t\ttop: startPosition.top - fixTop,\n\t\t\t\tleft: startPosition.left - fixLeft,\n\t\t\t\theight: elem.innerHeight(),\n\t\t\t\twidth: elem.innerWidth(),\n\t\t\t\tposition: targetFixed ? \"fixed\" : \"absolute\"\n\t\t\t})\n\t\t\t.animate( animation, o.duration, o.easing, function() {\n\t\t\t\ttransfer.remove();\n\t\t\t\tdone();\n\t\t\t});\n};\n\n\n/*!\n * jQuery UI Progressbar 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/progressbar/\n */\n\n\nvar progressbar = $.widget( \"ui.progressbar\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tmax: 100,\n\t\tvalue: 0,\n\n\t\tchange: null,\n\t\tcomplete: null\n\t},\n\n\tmin: 0,\n\n\t_create: function() {\n\t\t// Constrain initial value\n\t\tthis.oldValue = this.options.value = this._constrainedValue();\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.attr({\n\t\t\t\t// Only set static values, aria-valuenow and aria-valuemax are\n\t\t\t\t// set inside _refreshValue()\n\t\t\t\trole: \"progressbar\",\n\t\t\t\t\"aria-valuemin\": this.min\n\t\t\t});\n\n\t\tthis.valueDiv = $( \"<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>\" )\n\t\t\t.appendTo( this.element );\n\n\t\tthis._refreshValue();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-valuemin\" )\n\t\t\t.removeAttr( \"aria-valuemax\" )\n\t\t\t.removeAttr( \"aria-valuenow\" );\n\n\t\tthis.valueDiv.remove();\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\treturn this.options.value;\n\t\t}\n\n\t\tthis.options.value = this._constrainedValue( newValue );\n\t\tthis._refreshValue();\n\t},\n\n\t_constrainedValue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\tnewValue = this.options.value;\n\t\t}\n\n\t\tthis.indeterminate = newValue === false;\n\n\t\t// sanitize value\n\t\tif ( typeof newValue !== \"number\" ) {\n\t\t\tnewValue = 0;\n\t\t}\n\n\t\treturn this.indeterminate ? false :\n\t\t\tMath.min( this.options.max, Math.max( this.min, newValue ) );\n\t},\n\n\t_setOptions: function( options ) {\n\t\t// Ensure \"value\" option is set after other values (like max)\n\t\tvar value = options.value;\n\t\tdelete options.value;\n\n\t\tthis._super( options );\n\n\t\tthis.options.value = this._constrainedValue( value );\n\t\tthis._refreshValue();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"max\" ) {\n\t\t\t// Don't allow a max less than min\n\t\t\tvalue = Math.max( this.min, value );\n\t\t}\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_percentage: function() {\n\t\treturn this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );\n\t},\n\n\t_refreshValue: function() {\n\t\tvar value = this.options.value,\n\t\t\tpercentage = this._percentage();\n\n\t\tthis.valueDiv\n\t\t\t.toggle( this.indeterminate || value > this.min )\n\t\t\t.toggleClass( \"ui-corner-right\", value === this.options.max )\n\t\t\t.width( percentage.toFixed(0) + \"%\" );\n\n\t\tthis.element.toggleClass( \"ui-progressbar-indeterminate\", this.indeterminate );\n\n\t\tif ( this.indeterminate ) {\n\t\t\tthis.element.removeAttr( \"aria-valuenow\" );\n\t\t\tif ( !this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv = $( \"<div class='ui-progressbar-overlay'></div>\" ).appendTo( this.valueDiv );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.element.attr({\n\t\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t\t\"aria-valuenow\": value\n\t\t\t});\n\t\t\tif ( this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv.remove();\n\t\t\t\tthis.overlayDiv = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( this.oldValue !== value ) {\n\t\t\tthis.oldValue = value;\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t\tif ( value === this.options.max ) {\n\t\t\tthis._trigger( \"complete\" );\n\t\t}\n\t}\n});\n\n\n/*!\n * jQuery UI Selectable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/selectable/\n */\n\n\nvar selectable = $.widget(\"ui.selectable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoRefresh: true,\n\t\tdistance: 0,\n\t\tfilter: \"*\",\n\t\ttolerance: \"touch\",\n\n\t\t// callbacks\n\t\tselected: null,\n\t\tselecting: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tunselected: null,\n\t\tunselecting: null\n\t},\n\t_create: function() {\n\t\tvar selectees,\n\t\t\tthat = this;\n\n\t\tthis.element.addClass(\"ui-selectable\");\n\n\t\tthis.dragged = false;\n\n\t\t// cache selectee children based on filter\n\t\tthis.refresh = function() {\n\t\t\tselectees = $(that.options.filter, that.element[0]);\n\t\t\tselectees.addClass(\"ui-selectee\");\n\t\t\tselectees.each(function() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\tpos = $this.offset();\n\t\t\t\t$.data(this, \"selectable-item\", {\n\t\t\t\t\telement: this,\n\t\t\t\t\t$element: $this,\n\t\t\t\t\tleft: pos.left,\n\t\t\t\t\ttop: pos.top,\n\t\t\t\t\tright: pos.left + $this.outerWidth(),\n\t\t\t\t\tbottom: pos.top + $this.outerHeight(),\n\t\t\t\t\tstartselected: false,\n\t\t\t\t\tselected: $this.hasClass(\"ui-selected\"),\n\t\t\t\t\tselecting: $this.hasClass(\"ui-selecting\"),\n\t\t\t\t\tunselecting: $this.hasClass(\"ui-unselecting\")\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\t\tthis.refresh();\n\n\t\tthis.selectees = selectees.addClass(\"ui-selectee\");\n\n\t\tthis._mouseInit();\n\n\t\tthis.helper = $(\"<div class='ui-selectable-helper'></div>\");\n\t},\n\n\t_destroy: function() {\n\t\tthis.selectees\n\t\t\t.removeClass(\"ui-selectee\")\n\t\t\t.removeData(\"selectable-item\");\n\t\tthis.element\n\t\t\t.removeClass(\"ui-selectable ui-selectable-disabled\");\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseStart: function(event) {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.opos = [ event.pageX, event.pageY ];\n\n\t\tif (this.options.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selectees = $(options.filter, this.element[0]);\n\n\t\tthis._trigger(\"start\", event);\n\n\t\t$(options.appendTo).append(this.helper);\n\t\t// position helper (lasso)\n\t\tthis.helper.css({\n\t\t\t\"left\": event.pageX,\n\t\t\t\"top\": event.pageY,\n\t\t\t\"width\": 0,\n\t\t\t\"height\": 0\n\t\t});\n\n\t\tif (options.autoRefresh) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\tthis.selectees.filter(\".ui-selected\").each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.startselected = true;\n\t\t\tif (!event.metaKey && !event.ctrlKey) {\n\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\tselectee.selected = false;\n\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\tselectee.unselecting = true;\n\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t$(event.target).parents().addBack().each(function() {\n\t\t\tvar doSelect,\n\t\t\t\tselectee = $.data(this, \"selectable-item\");\n\t\t\tif (selectee) {\n\t\t\t\tdoSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass(\"ui-selected\");\n\t\t\t\tselectee.$element\n\t\t\t\t\t.removeClass(doSelect ? \"ui-unselecting\" : \"ui-selected\")\n\t\t\t\t\t.addClass(doSelect ? \"ui-selecting\" : \"ui-unselecting\");\n\t\t\t\tselectee.unselecting = !doSelect;\n\t\t\t\tselectee.selecting = doSelect;\n\t\t\t\tselectee.selected = doSelect;\n\t\t\t\t// selectable (UN)SELECTING callback\n\t\t\t\tif (doSelect) {\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_mouseDrag: function(event) {\n\n\t\tthis.dragged = true;\n\n\t\tif (this.options.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tmp,\n\t\t\tthat = this,\n\t\t\toptions = this.options,\n\t\t\tx1 = this.opos[0],\n\t\t\ty1 = this.opos[1],\n\t\t\tx2 = event.pageX,\n\t\t\ty2 = event.pageY;\n\n\t\tif (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }\n\t\tif (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }\n\t\tthis.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });\n\n\t\tthis.selectees.each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\"),\n\t\t\t\thit = false;\n\n\t\t\t//prevent helper from being selected if appendTo: selectable\n\t\t\tif (!selectee || selectee.element === that.element[0]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (options.tolerance === \"touch\") {\n\t\t\t\thit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );\n\t\t\t} else if (options.tolerance === \"fit\") {\n\t\t\t\thit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);\n\t\t\t}\n\n\t\t\tif (hit) {\n\t\t\t\t// SELECT\n\t\t\t\tif (selectee.selected) {\n\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\t\tselectee.selected = false;\n\t\t\t\t}\n\t\t\t\tif (selectee.unselecting) {\n\t\t\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\n\t\t\t\t\tselectee.unselecting = false;\n\t\t\t\t}\n\t\t\t\tif (!selectee.selecting) {\n\t\t\t\t\tselectee.$element.addClass(\"ui-selecting\");\n\t\t\t\t\tselectee.selecting = true;\n\t\t\t\t\t// selectable SELECTING callback\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// UNSELECT\n\t\t\t\tif (selectee.selecting) {\n\t\t\t\t\tif ((event.metaKey || event.ctrlKey) && selectee.startselected) {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-selected\");\n\t\t\t\t\t\tselectee.selected = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tif (selectee.startselected) {\n\t\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (selectee.selected) {\n\t\t\t\t\tif (!event.metaKey && !event.ctrlKey && !selectee.startselected) {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\t\t\tselectee.selected = false;\n\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\t\tvar that = this;\n\n\t\tthis.dragged = false;\n\n\t\t$(\".ui-unselecting\", this.element[0]).each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\n\t\t\tselectee.unselecting = false;\n\t\t\tselectee.startselected = false;\n\t\t\tthat._trigger(\"unselected\", event, {\n\t\t\t\tunselected: selectee.element\n\t\t\t});\n\t\t});\n\t\t$(\".ui-selecting\", this.element[0]).each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.$element.removeClass(\"ui-selecting\").addClass(\"ui-selected\");\n\t\t\tselectee.selecting = false;\n\t\t\tselectee.selected = true;\n\t\t\tselectee.startselected = true;\n\t\t\tthat._trigger(\"selected\", event, {\n\t\t\t\tselected: selectee.element\n\t\t\t});\n\t\t});\n\t\tthis._trigger(\"stop\", event);\n\n\t\tthis.helper.remove();\n\n\t\treturn false;\n\t}\n\n});\n\n\n/*!\n * jQuery UI Selectmenu 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/selectmenu\n */\n\n\nvar selectmenu = $.widget( \"ui.selectmenu\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<select>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tdisabled: null,\n\t\ticons: {\n\t\t\tbutton: \"ui-icon-triangle-1-s\"\n\t\t},\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\twidth: null,\n\n\t\t// callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tvar selectmenuId = this.element.uniqueId().attr( \"id\" );\n\t\tthis.ids = {\n\t\t\telement: selectmenuId,\n\t\t\tbutton: selectmenuId + \"-button\",\n\t\t\tmenu: selectmenuId + \"-menu\"\n\t\t};\n\n\t\tthis._drawButton();\n\t\tthis._drawMenu();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.disable();\n\t\t}\n\t},\n\n\t_drawButton: function() {\n\t\tvar that = this;\n\n\t\t// Associate existing label with the new button\n\t\tthis.label = $( \"label[for='\" + this.ids.element + \"']\" ).attr( \"for\", this.ids.button );\n\t\tthis._on( this.label, {\n\t\t\tclick: function( event ) {\n\t\t\t\tthis.button.focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t});\n\n\t\t// Hide original select element\n\t\tthis.element.hide();\n\n\t\t// Create button\n\t\tthis.button = $( \"<span>\", {\n\t\t\t\"class\": \"ui-selectmenu-button ui-widget ui-state-default ui-corner-all\",\n\t\t\ttabindex: this.options.disabled ? -1 : 0,\n\t\t\tid: this.ids.button,\n\t\t\trole: \"combobox\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-autocomplete\": \"list\",\n\t\t\t\"aria-owns\": this.ids.menu,\n\t\t\t\"aria-haspopup\": \"true\"\n\t\t})\n\t\t\t.insertAfter( this.element );\n\n\t\t$( \"<span>\", {\n\t\t\t\"class\": \"ui-icon \" + this.options.icons.button\n\t\t})\n\t\t\t.prependTo( this.button );\n\n\t\tthis.buttonText = $( \"<span>\", {\n\t\t\t\"class\": \"ui-selectmenu-text\"\n\t\t})\n\t\t\t.appendTo( this.button );\n\n\t\tthis._setText( this.buttonText, this.element.find( \"option:selected\" ).text() );\n\t\tthis._resizeButton();\n\n\t\tthis._on( this.button, this._buttonEvents );\n\t\tthis.button.one( \"focusin\", function() {\n\n\t\t\t// Delay rendering the menu items until the button receives focus.\n\t\t\t// The menu may have already been rendered via a programmatic open.\n\t\t\tif ( !that.menuItems ) {\n\t\t\t\tthat._refreshMenu();\n\t\t\t}\n\t\t});\n\t\tthis._hoverable( this.button );\n\t\tthis._focusable( this.button );\n\t},\n\n\t_drawMenu: function() {\n\t\tvar that = this;\n\n\t\t// Create menu\n\t\tthis.menu = $( \"<ul>\", {\n\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\"aria-labelledby\": this.ids.button,\n\t\t\tid: this.ids.menu\n\t\t});\n\n\t\t// Wrap menu\n\t\tthis.menuWrap = $( \"<div>\", {\n\t\t\t\"class\": \"ui-selectmenu-menu ui-front\"\n\t\t})\n\t\t\t.append( this.menu )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\t// Initialize menu widget\n\t\tthis.menuInstance = this.menu\n\t\t\t.menu({\n\t\t\t\trole: \"listbox\",\n\t\t\t\tselect: function( event, ui ) {\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t// support: IE8\n\t\t\t\t\t// If the item was selected via a click, the text selection\n\t\t\t\t\t// will be destroyed in IE\n\t\t\t\t\tthat._setSelection();\n\n\t\t\t\t\tthat._select( ui.item.data( \"ui-selectmenu-item\" ), event );\n\t\t\t\t},\n\t\t\t\tfocus: function( event, ui ) {\n\t\t\t\t\tvar item = ui.item.data( \"ui-selectmenu-item\" );\n\n\t\t\t\t\t// Prevent inital focus from firing and check if its a newly focused item\n\t\t\t\t\tif ( that.focusIndex != null && item.index !== that.focusIndex ) {\n\t\t\t\t\t\tthat._trigger( \"focus\", event, { item: item } );\n\t\t\t\t\t\tif ( !that.isOpen ) {\n\t\t\t\t\t\t\tthat._select( item, event );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthat.focusIndex = item.index;\n\n\t\t\t\t\tthat.button.attr( \"aria-activedescendant\",\n\t\t\t\t\t\tthat.menuItems.eq( item.index ).attr( \"id\" ) );\n\t\t\t\t}\n\t\t\t})\n\t\t\t.menu( \"instance\" );\n\n\t\t// Adjust menu styles to dropdown\n\t\tthis.menu\n\t\t\t.addClass( \"ui-corner-bottom\" )\n\t\t\t.removeClass( \"ui-corner-all\" );\n\n\t\t// Don't close the menu on mouseleave\n\t\tthis.menuInstance._off( this.menu, \"mouseleave\" );\n\n\t\t// Cancel the menu's collapseAll on document click\n\t\tthis.menuInstance._closeOnDocumentClick = function() {\n\t\t\treturn false;\n\t\t};\n\n\t\t// Selects often contain empty items, but never contain dividers\n\t\tthis.menuInstance._isDivider = function() {\n\t\t\treturn false;\n\t\t};\n\t},\n\n\trefresh: function() {\n\t\tthis._refreshMenu();\n\t\tthis._setText( this.buttonText, this._getSelectedItem().text() );\n\t\tif ( !this.options.width ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_refreshMenu: function() {\n\t\tthis.menu.empty();\n\n\t\tvar item,\n\t\t\toptions = this.element.find( \"option\" );\n\n\t\tif ( !options.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._parseOptions( options );\n\t\tthis._renderMenu( this.menu, this.items );\n\n\t\tthis.menuInstance.refresh();\n\t\tthis.menuItems = this.menu.find( \"li\" ).not( \".ui-selectmenu-optgroup\" );\n\n\t\titem = this._getSelectedItem();\n\n\t\t// Update the menu to have the correct item focused\n\t\tthis.menuInstance.focus( null, item );\n\t\tthis._setAria( item.data( \"ui-selectmenu-item\" ) );\n\n\t\t// Set disabled state\n\t\tthis._setOption( \"disabled\", this.element.prop( \"disabled\" ) );\n\t},\n\n\topen: function( event ) {\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If this is the first time the menu is being opened, render the items\n\t\tif ( !this.menuItems ) {\n\t\t\tthis._refreshMenu();\n\t\t} else {\n\n\t\t\t// Menu clears focus on close, reset focus to selected item\n\t\t\tthis.menu.find( \".ui-state-focus\" ).removeClass( \"ui-state-focus\" );\n\t\t\tthis.menuInstance.focus( null, this._getSelectedItem() );\n\t\t}\n\n\t\tthis.isOpen = true;\n\t\tthis._toggleAttr();\n\t\tthis._resizeMenu();\n\t\tthis._position();\n\n\t\tthis._on( this.document, this._documentClick );\n\n\t\tthis._trigger( \"open\", event );\n\t},\n\n\t_position: function() {\n\t\tthis.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );\n\t},\n\n\tclose: function( event ) {\n\t\tif ( !this.isOpen ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = false;\n\t\tthis._toggleAttr();\n\n\t\tthis.range = null;\n\t\tthis._off( this.document );\n\n\t\tthis._trigger( \"close\", event );\n\t},\n\n\twidget: function() {\n\t\treturn this.button;\n\t},\n\n\tmenuWidget: function() {\n\t\treturn this.menu;\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this,\n\t\t\tcurrentOptgroup = \"\";\n\n\t\t$.each( items, function( index, item ) {\n\t\t\tif ( item.optgroup !== currentOptgroup ) {\n\t\t\t\t$( \"<li>\", {\n\t\t\t\t\t\"class\": \"ui-selectmenu-optgroup ui-menu-divider\" +\n\t\t\t\t\t\t( item.element.parent( \"optgroup\" ).prop( \"disabled\" ) ?\n\t\t\t\t\t\t\t\" ui-state-disabled\" :\n\t\t\t\t\t\t\t\"\" ),\n\t\t\t\t\ttext: item.optgroup\n\t\t\t\t})\n\t\t\t\t\t.appendTo( ul );\n\n\t\t\t\tcurrentOptgroup = item.optgroup;\n\t\t\t}\n\n\t\t\tthat._renderItemData( ul, item );\n\t\t});\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-selectmenu-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\tvar li = $( \"<li>\" );\n\n\t\tif ( item.disabled ) {\n\t\t\tli.addClass( \"ui-state-disabled\" );\n\t\t}\n\t\tthis._setText( li, item.label );\n\n\t\treturn li.appendTo( ul );\n\t},\n\n\t_setText: function( element, value ) {\n\t\tif ( value ) {\n\t\t\telement.text( value );\n\t\t} else {\n\t\t\telement.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_move: function( direction, event ) {\n\t\tvar item, next,\n\t\t\tfilter = \".ui-menu-item\";\n\n\t\tif ( this.isOpen ) {\n\t\t\titem = this.menuItems.eq( this.focusIndex );\n\t\t} else {\n\t\t\titem = this.menuItems.eq( this.element[ 0 ].selectedIndex );\n\t\t\tfilter += \":not(.ui-state-disabled)\";\n\t\t}\n\n\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\tnext = item[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( filter ).eq( -1 );\n\t\t} else {\n\t\t\tnext = item[ direction + \"All\" ]( filter ).eq( 0 );\n\t\t}\n\n\t\tif ( next.length ) {\n\t\t\tthis.menuInstance.focus( event, next );\n\t\t}\n\t},\n\n\t_getSelectedItem: function() {\n\t\treturn this.menuItems.eq( this.element[ 0 ].selectedIndex );\n\t},\n\n\t_toggle: function( event ) {\n\t\tthis[ this.isOpen ? \"close\" : \"open\" ]( event );\n\t},\n\n\t_setSelection: function() {\n\t\tvar selection;\n\n\t\tif ( !this.range ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( window.getSelection ) {\n\t\t\tselection = window.getSelection();\n\t\t\tselection.removeAllRanges();\n\t\t\tselection.addRange( this.range );\n\n\t\t// support: IE8\n\t\t} else {\n\t\t\tthis.range.select();\n\t\t}\n\n\t\t// support: IE\n\t\t// Setting the text selection kills the button focus in IE, but\n\t\t// restoring the focus doesn't kill the selection.\n\t\tthis.button.focus();\n\t},\n\n\t_documentClick: {\n\t\tmousedown: function( event ) {\n\t\t\tif ( !this.isOpen ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !$( event.target ).closest( \".ui-selectmenu-menu, #\" + this.ids.button ).length ) {\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t}\n\t},\n\n\t_buttonEvents: {\n\n\t\t// Prevent text selection from being reset when interacting with the selectmenu (#10144)\n\t\tmousedown: function() {\n\t\t\tvar selection;\n\n\t\t\tif ( window.getSelection ) {\n\t\t\t\tselection = window.getSelection();\n\t\t\t\tif ( selection.rangeCount ) {\n\t\t\t\t\tthis.range = selection.getRangeAt( 0 );\n\t\t\t\t}\n\n\t\t\t// support: IE8\n\t\t\t} else {\n\t\t\t\tthis.range = document.selection.createRange();\n\t\t\t}\n\t\t},\n\n\t\tclick: function( event ) {\n\t\t\tthis._setSelection();\n\t\t\tthis._toggle( event );\n\t\t},\n\n\t\tkeydown: function( event ) {\n\t\t\tvar preventDefault = true;\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.TAB:\n\t\t\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\tpreventDefault = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\t\tthis._toggle( event );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\t\tthis._toggle( event );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._move( \"next\", event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._toggle( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tthis._move( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"first\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"last\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.menu.trigger( event );\n\t\t\t\t\tpreventDefault = false;\n\t\t\t}\n\n\t\t\tif ( preventDefault ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t},\n\n\t_selectFocusedItem: function( event ) {\n\t\tvar item = this.menuItems.eq( this.focusIndex );\n\t\tif ( !item.hasClass( \"ui-state-disabled\" ) ) {\n\t\t\tthis._select( item.data( \"ui-selectmenu-item\" ), event );\n\t\t}\n\t},\n\n\t_select: function( item, event ) {\n\t\tvar oldIndex = this.element[ 0 ].selectedIndex;\n\n\t\t// Change native select element\n\t\tthis.element[ 0 ].selectedIndex = item.index;\n\t\tthis._setText( this.buttonText, item.label );\n\t\tthis._setAria( item );\n\t\tthis._trigger( \"select\", event, { item: item } );\n\n\t\tif ( item.index !== oldIndex ) {\n\t\t\tthis._trigger( \"change\", event, { item: item } );\n\t\t}\n\n\t\tthis.close( event );\n\t},\n\n\t_setAria: function( item ) {\n\t\tvar id = this.menuItems.eq( item.index ).attr( \"id\" );\n\n\t\tthis.button.attr({\n\t\t\t\"aria-labelledby\": id,\n\t\t\t\"aria-activedescendant\": id\n\t\t});\n\t\tthis.menu.attr( \"aria-activedescendant\", id );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.button.find( \"span.ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.button )\n\t\t\t\t.addClass( value.button );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menuWrap.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.menuInstance.option( \"disabled\", value );\n\t\t\tthis.button\n\t\t\t\t.toggleClass( \"ui-state-disabled\", value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\n\t\t\tthis.element.prop( \"disabled\", value );\n\t\t\tif ( value ) {\n\t\t\t\tthis.button.attr( \"tabindex\", -1 );\n\t\t\t\tthis.close();\n\t\t\t} else {\n\t\t\t\tthis.button.attr( \"tabindex\", 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"width\" ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_toggleAttr: function() {\n\t\tthis.button\n\t\t\t.toggleClass( \"ui-corner-top\", this.isOpen )\n\t\t\t.toggleClass( \"ui-corner-all\", !this.isOpen )\n\t\t\t.attr( \"aria-expanded\", this.isOpen );\n\t\tthis.menuWrap.toggleClass( \"ui-selectmenu-open\", this.isOpen );\n\t\tthis.menu.attr( \"aria-hidden\", !this.isOpen );\n\t},\n\n\t_resizeButton: function() {\n\t\tvar width = this.options.width;\n\n\t\tif ( !width ) {\n\t\t\twidth = this.element.show().outerWidth();\n\t\t\tthis.element.hide();\n\t\t}\n\n\t\tthis.button.outerWidth( width );\n\t},\n\n\t_resizeMenu: function() {\n\t\tthis.menu.outerWidth( Math.max(\n\t\t\tthis.button.outerWidth(),\n\n\t\t\t// support: IE10\n\t\t\t// IE10 wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping\n\t\t\tthis.menu.width( \"\" ).outerWidth() + 1\n\t\t) );\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn { disabled: this.element.prop( \"disabled\" ) };\n\t},\n\n\t_parseOptions: function( options ) {\n\t\tvar data = [];\n\t\toptions.each(function( index, item ) {\n\t\t\tvar option = $( item ),\n\t\t\t\toptgroup = option.parent( \"optgroup\" );\n\t\t\tdata.push({\n\t\t\t\telement: option,\n\t\t\t\tindex: index,\n\t\t\t\tvalue: option.val(),\n\t\t\t\tlabel: option.text(),\n\t\t\t\toptgroup: optgroup.attr( \"label\" ) || \"\",\n\t\t\t\tdisabled: optgroup.prop( \"disabled\" ) || option.prop( \"disabled\" )\n\t\t\t});\n\t\t});\n\t\tthis.items = data;\n\t},\n\n\t_destroy: function() {\n\t\tthis.menuWrap.remove();\n\t\tthis.button.remove();\n\t\tthis.element.show();\n\t\tthis.element.removeUniqueId();\n\t\tthis.label.attr( \"for\", this.ids.element );\n\t}\n});\n\n\n/*!\n * jQuery UI Slider 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/slider/\n */\n\n\nvar slider = $.widget( \"ui.slider\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\tanimate: false,\n\t\tdistance: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\torientation: \"horizontal\",\n\t\trange: false,\n\t\tstep: 1,\n\t\tvalue: 0,\n\t\tvalues: null,\n\n\t\t// callbacks\n\t\tchange: null,\n\t\tslide: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t// number of pages in a slider\n\t// (how many times can you page up/down to go through the whole range)\n\tnumPages: 5,\n\n\t_create: function() {\n\t\tthis._keySliding = false;\n\t\tthis._mouseSliding = false;\n\t\tthis._animateOff = true;\n\t\tthis._handleIndex = null;\n\t\tthis._detectOrientation();\n\t\tthis._mouseInit();\n\t\tthis._calculateNewMax();\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-\" + this.orientation +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\");\n\n\t\tthis._refresh();\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\n\t\tthis._animateOff = false;\n\t},\n\n\t_refresh: function() {\n\t\tthis._createRange();\n\t\tthis._createHandles();\n\t\tthis._setupEvents();\n\t\tthis._refreshValue();\n\t},\n\n\t_createHandles: function() {\n\t\tvar i, handleCount,\n\t\t\toptions = this.options,\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ).addClass( \"ui-state-default ui-corner-all\" ),\n\t\t\thandle = \"<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>\",\n\t\t\thandles = [];\n\n\t\thandleCount = ( options.values && options.values.length ) || 1;\n\n\t\tif ( existingHandles.length > handleCount ) {\n\t\t\texistingHandles.slice( handleCount ).remove();\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\n\t\t}\n\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\n\t\t\thandles.push( handle );\n\t\t}\n\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\n\n\t\tthis.handle = this.handles.eq( 0 );\n\n\t\tthis.handles.each(function( i ) {\n\t\t\t$( this ).data( \"ui-slider-handle-index\", i );\n\t\t});\n\t},\n\n\t_createRange: function() {\n\t\tvar options = this.options,\n\t\t\tclasses = \"\";\n\n\t\tif ( options.range ) {\n\t\t\tif ( options.range === true ) {\n\t\t\t\tif ( !options.values ) {\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\n\t\t\t\t\toptions.values = [ options.values[0], options.values[0] ];\n\t\t\t\t} else if ( $.isArray( options.values ) ) {\n\t\t\t\t\toptions.values = options.values.slice(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !this.range || !this.range.length ) {\n\t\t\t\tthis.range = $( \"<div></div>\" )\n\t\t\t\t\t.appendTo( this.element );\n\n\t\t\t\tclasses = \"ui-slider-range\" +\n\t\t\t\t// note: this isn't the most fittingly semantic framework class for this element,\n\t\t\t\t// but worked best visually with a variety of themes\n\t\t\t\t\" ui-widget-header ui-corner-all\";\n\t\t\t} else {\n\t\t\t\tthis.range.removeClass( \"ui-slider-range-min ui-slider-range-max\" )\n\t\t\t\t\t// Handle range switching from true to min/max\n\t\t\t\t\t.css({\n\t\t\t\t\t\t\"left\": \"\",\n\t\t\t\t\t\t\"bottom\": \"\"\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.range.addClass( classes +\n\t\t\t\t( ( options.range === \"min\" || options.range === \"max\" ) ? \" ui-slider-range-\" + options.range : \"\" ) );\n\t\t} else {\n\t\t\tif ( this.range ) {\n\t\t\t\tthis.range.remove();\n\t\t\t}\n\t\t\tthis.range = null;\n\t\t}\n\t},\n\n\t_setupEvents: function() {\n\t\tthis._off( this.handles );\n\t\tthis._on( this.handles, this._handleEvents );\n\t\tthis._hoverable( this.handles );\n\t\tthis._focusable( this.handles );\n\t},\n\n\t_destroy: function() {\n\t\tthis.handles.remove();\n\t\tif ( this.range ) {\n\t\t\tthis.range.remove();\n\t\t}\n\n\t\tthis.element\n\t\t\t.removeClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-horizontal\" +\n\t\t\t\t\" ui-slider-vertical\" +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\" );\n\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\n\t\tif ( o.disabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.elementSize = {\n\t\t\twidth: this.element.outerWidth(),\n\t\t\theight: this.element.outerHeight()\n\t\t};\n\t\tthis.elementOffset = this.element.offset();\n\n\t\tposition = { x: event.pageX, y: event.pageY };\n\t\tnormValue = this._normValueFromMouse( position );\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\n\t\tthis.handles.each(function( i ) {\n\t\t\tvar thisDistance = Math.abs( normValue - that.values(i) );\n\t\t\tif (( distance > thisDistance ) ||\n\t\t\t\t( distance === thisDistance &&\n\t\t\t\t\t(i === that._lastChangedValue || that.values(i) === o.min ))) {\n\t\t\t\tdistance = thisDistance;\n\t\t\t\tclosestHandle = $( this );\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t});\n\n\t\tallowed = this._start( event, index );\n\t\tif ( allowed === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._mouseSliding = true;\n\n\t\tthis._handleIndex = index;\n\n\t\tclosestHandle\n\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t.focus();\n\n\t\toffset = closestHandle.offset();\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() / 2 ),\n\t\t\ttop: event.pageY - offset.top -\n\t\t\t\t( closestHandle.height() / 2 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderTopWidth\"), 10 ) || 0 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderBottomWidth\"), 10 ) || 0) +\n\t\t\t\t( parseInt( closestHandle.css(\"marginTop\"), 10 ) || 0)\n\t\t};\n\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\n\t\t\tthis._slide( event, index, normValue );\n\t\t}\n\t\tthis._animateOff = true;\n\t\treturn true;\n\t},\n\n\t_mouseStart: function() {\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar position = { x: event.pageX, y: event.pageY },\n\t\t\tnormValue = this._normValueFromMouse( position );\n\n\t\tthis._slide( event, this._handleIndex, normValue );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tthis.handles.removeClass( \"ui-state-active\" );\n\t\tthis._mouseSliding = false;\n\n\t\tthis._stop( event, this._handleIndex );\n\t\tthis._change( event, this._handleIndex );\n\n\t\tthis._handleIndex = null;\n\t\tthis._clickOffset = null;\n\t\tthis._animateOff = false;\n\n\t\treturn false;\n\t},\n\n\t_detectOrientation: function() {\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\n\t},\n\n\t_normValueFromMouse: function( position ) {\n\t\tvar pixelTotal,\n\t\t\tpixelMouse,\n\t\t\tpercentMouse,\n\t\t\tvalueTotal,\n\t\t\tvalueMouse;\n\n\t\tif ( this.orientation === \"horizontal\" ) {\n\t\t\tpixelTotal = this.elementSize.width;\n\t\t\tpixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );\n\t\t} else {\n\t\t\tpixelTotal = this.elementSize.height;\n\t\t\tpixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );\n\t\t}\n\n\t\tpercentMouse = ( pixelMouse / pixelTotal );\n\t\tif ( percentMouse > 1 ) {\n\t\t\tpercentMouse = 1;\n\t\t}\n\t\tif ( percentMouse < 0 ) {\n\t\t\tpercentMouse = 0;\n\t\t}\n\t\tif ( this.orientation === \"vertical\" ) {\n\t\t\tpercentMouse = 1 - percentMouse;\n\t\t}\n\n\t\tvalueTotal = this._valueMax() - this._valueMin();\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\n\n\t\treturn this._trimAlignValue( valueMouse );\n\t},\n\n\t_start: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\t\treturn this._trigger( \"start\", event, uiHash );\n\t},\n\n\t_slide: function( event, index, newVal ) {\n\t\tvar otherVal,\n\t\t\tnewValues,\n\t\t\tallowed;\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\totherVal = this.values( index ? 0 : 1 );\n\n\t\t\tif ( ( this.options.values.length === 2 && this.options.range === true ) &&\n\t\t\t\t\t( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )\n\t\t\t\t) {\n\t\t\t\tnewVal = otherVal;\n\t\t\t}\n\n\t\t\tif ( newVal !== this.values( index ) ) {\n\t\t\t\tnewValues = this.values();\n\t\t\t\tnewValues[ index ] = newVal;\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal,\n\t\t\t\t\tvalues: newValues\n\t\t\t\t} );\n\t\t\t\totherVal = this.values( index ? 0 : 1 );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.values( index, newVal );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( newVal !== this.value() ) {\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal\n\t\t\t\t} );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.value( newVal );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_stop: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\n\t\tthis._trigger( \"stop\", event, uiHash );\n\t},\n\n\t_change: function( event, index ) {\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\n\t\t\tvar uiHash = {\n\t\t\t\thandle: this.handles[ index ],\n\t\t\t\tvalue: this.value()\n\t\t\t};\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tuiHash.value = this.values( index );\n\t\t\t\tuiHash.values = this.values();\n\t\t\t}\n\n\t\t\t//store the last changed value index for reference when handles overlap\n\t\t\tthis._lastChangedValue = index;\n\n\t\t\tthis._trigger( \"change\", event, uiHash );\n\t\t}\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( arguments.length ) {\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, 0 );\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._value();\n\t},\n\n\tvalues: function( index, newValue ) {\n\t\tvar vals,\n\t\t\tnewValues,\n\t\t\ti;\n\n\t\tif ( arguments.length > 1 ) {\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, index );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tif ( $.isArray( arguments[ 0 ] ) ) {\n\t\t\t\tvals = this.options.values;\n\t\t\t\tnewValues = arguments[ 0 ];\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._refreshValue();\n\t\t\t} else {\n\t\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\t\treturn this._values( index );\n\t\t\t\t} else {\n\t\t\t\t\treturn this.value();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._values();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar i,\n\t\t\tvalsLength = 0;\n\n\t\tif ( key === \"range\" && this.options.range === true ) {\n\t\t\tif ( value === \"min\" ) {\n\t\t\t\tthis.options.value = this._values( 0 );\n\t\t\t\tthis.options.values = null;\n\t\t\t} else if ( value === \"max\" ) {\n\t\t\t\tthis.options.value = this._values( this.options.values.length - 1 );\n\t\t\t\tthis.options.values = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( $.isArray( this.options.values ) ) {\n\t\t\tvalsLength = this.options.values.length;\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element.toggleClass( \"ui-state-disabled\", !!value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\t\tcase \"orientation\":\n\t\t\t\tthis._detectOrientation();\n\t\t\t\tthis.element\n\t\t\t\t\t.removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\n\t\t\t\t\t.addClass( \"ui-slider-\" + this.orientation );\n\t\t\t\tthis._refreshValue();\n\n\t\t\t\t// Reset positioning from previous orientation\n\t\t\t\tthis.handles.css( value === \"horizontal\" ? \"bottom\" : \"left\", \"\" );\n\t\t\t\tbreak;\n\t\t\tcase \"value\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._change( null, 0 );\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"values\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tfor ( i = 0; i < valsLength; i += 1 ) {\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"step\":\n\t\t\tcase \"min\":\n\t\t\tcase \"max\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._calculateNewMax();\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"range\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refresh();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t//internal value getter\n\t// _value() returns value trimmed by min and max, aligned by step\n\t_value: function() {\n\t\tvar val = this.options.value;\n\t\tval = this._trimAlignValue( val );\n\n\t\treturn val;\n\t},\n\n\t//internal values getter\n\t// _values() returns array of values trimmed by min and max, aligned by step\n\t// _values( index ) returns single value trimmed by min and max, aligned by step\n\t_values: function( index ) {\n\t\tvar val,\n\t\t\tvals,\n\t\t\ti;\n\n\t\tif ( arguments.length ) {\n\t\t\tval = this.options.values[ index ];\n\t\t\tval = this._trimAlignValue( val );\n\n\t\t\treturn val;\n\t\t} else if ( this.options.values && this.options.values.length ) {\n\t\t\t// .slice() creates a copy of the array\n\t\t\t// this copy gets trimmed by min and max and then returned\n\t\t\tvals = this.options.values.slice();\n\t\t\tfor ( i = 0; i < vals.length; i += 1) {\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\n\t\t\t}\n\n\t\t\treturn vals;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\t// returns the step-aligned value that val is closest to, between (inclusive) min and max\n\t_trimAlignValue: function( val ) {\n\t\tif ( val <= this._valueMin() ) {\n\t\t\treturn this._valueMin();\n\t\t}\n\t\tif ( val >= this._valueMax() ) {\n\t\t\treturn this._valueMax();\n\t\t}\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\n\t\t\tvalModStep = (val - this._valueMin()) % step,\n\t\t\talignValue = val - valModStep;\n\n\t\tif ( Math.abs(valModStep) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\t// Since JavaScript has problems with large floats, round\n\t\t// the final value to 5 digits after the decimal point (see #4124)\n\t\treturn parseFloat( alignValue.toFixed(5) );\n\t},\n\n\t_calculateNewMax: function() {\n\t\tvar max = this.options.max,\n\t\t\tmin = this._valueMin(),\n\t\t\tstep = this.options.step,\n\t\t\taboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;\n\t\tmax = aboveMin + min;\n\t\tthis.max = parseFloat( max.toFixed( this._precision() ) );\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_valueMin: function() {\n\t\treturn this.options.min;\n\t},\n\n\t_valueMax: function() {\n\t\treturn this.max;\n\t},\n\n\t_refreshValue: function() {\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\n\t\t\toRange = this.options.range,\n\t\t\to = this.options,\n\t\t\tthat = this,\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\n\t\t\t_set = {};\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tthis.handles.each(function( i ) {\n\t\t\t\tvalPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\t\t\t\tif ( that.options.range === true ) {\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { left: valPercent + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { width: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { bottom: ( valPercent ) + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { height: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastValPercent = valPercent;\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = this.value();\n\t\t\tvalueMin = this._valueMin();\n\t\t\tvalueMax = this._valueMax();\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\n\t\t\t\t\t( value - valueMin ) / ( valueMax - valueMin ) * 100 :\n\t\t\t\t\t0;\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { width: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { width: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { height: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { height: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleEvents: {\n\t\tkeydown: function( event ) {\n\t\t\tvar allowed, curVal, newVal, step,\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\t\t$( event.target ).addClass( \"ui-state-active\" );\n\t\t\t\t\t\tallowed = this._start( event, index );\n\t\t\t\t\t\tif ( allowed === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstep = this.options.step;\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tcurVal = newVal = this.values( index );\n\t\t\t} else {\n\t\t\t\tcurVal = newVal = this.value();\n\t\t\t}\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\t\tnewVal = this._valueMin();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\t\tnewVal = this._valueMax();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._slide( event, index, newVal );\n\t\t},\n\t\tkeyup: function( event ) {\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tif ( this._keySliding ) {\n\t\t\t\tthis._keySliding = false;\n\t\t\t\tthis._stop( event, index );\n\t\t\t\tthis._change( event, index );\n\t\t\t\t$( event.target ).removeClass( \"ui-state-active\" );\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n/*!\n * jQuery UI Sortable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/sortable/\n */\n\n\nvar sortable = $.widget(\"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.11.4\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn (/left|right/).test(item.css(\"float\")) || (/inline|table-cell/).test(item.css(\"display\"));\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis.element.addClass(\"ui-sortable\");\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.element.find( \".ui-sortable-handle\" ).removeClass( \"ui-sortable-handle\" );\n\t\t$.each( this.items, function() {\n\t\t\t( this.instance.options.handle ?\n\t\t\t\tthis.item.find( this.instance.options.handle ) : this.item )\n\t\t\t\t.addClass( \"ui-sortable-handle\" );\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-sortable ui-sortable-disabled\" )\n\t\t\t.find( \".ui-sortable-handle\" )\n\t\t\t\t.removeClass( \"ui-sortable-handle\" );\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[i].item.removeData(this.widgetName + \"-item\");\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function(event, overrideHandle) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif (this.reverting) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(this.options.disabled || this.options.type === \"static\") {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems(event);\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$(event.target).parents().each(function() {\n\t\t\tif($.data(this, that.widgetName + \"-item\") === that) {\n\t\t\t\tcurrentItem = $(this);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif($.data(event.target, that.widgetName + \"-item\") === that) {\n\t\t\tcurrentItem = $(event.target);\n\t\t}\n\n\t\tif(!currentItem) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.options.handle && !overrideHandle) {\n\t\t\t$(this.options.handle, currentItem).find(\"*\").addBack().each(function() {\n\t\t\t\tif(this === event.target) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(!validHandle) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function(event, overrideHandle, noActivation) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend(this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\n\t\t});\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css(\"position\", \"absolute\");\n\t\tthis.cssPosition = this.helper.css(\"position\");\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition(event);\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };\n\n\t\t//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif(o.containment) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet = $( \"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif(o.opacity) { // opacity option\n\t\t\tif (this.helper.css(\"opacity\")) {\n\t\t\t\tthis._storedOpacity = this.helper.css(\"opacity\");\n\t\t\t}\n\t\t\tthis.helper.css(\"opacity\", o.opacity);\n\t\t}\n\n\t\tif(o.zIndex) { // zIndex option\n\t\t\tif (this.helper.css(\"zIndex\")) {\n\t\t\t\tthis._storedZIndex = this.helper.css(\"zIndex\");\n\t\t\t}\n\t\t\tthis.helper.css(\"zIndex\", o.zIndex);\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== \"HTML\") {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"start\", event, this._uiHash());\n\n\t\t//Recache the helper size\n\t\tif(!this._preserveHelperProportions) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis.helper.addClass(\"ui-sortable-helper\");\n\t\tthis._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function(event) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition(event);\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\tif (!this.lastPositionAbs) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif(this.options.scroll) {\n\t\t\tif(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== \"HTML\") {\n\n\t\t\t\tif((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t\tif(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t//Set the helper position\n\t\tif(!this.options.axis || this.options.axis !== \"y\") {\n\t\t\tthis.helper[0].style.left = this.position.left+\"px\";\n\t\t}\n\t\tif(!this.options.axis || this.options.axis !== \"x\") {\n\t\t\tthis.helper[0].style.top = this.position.top+\"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor (i = this.items.length - 1; i >= 0; i--) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[i];\n\t\t\titemElement = item.item[0];\n\t\t\tintersection = this._intersectsWithPointer(item);\n\t\t\tif (!intersection) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif (item.instance !== this.currentContainer) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif (itemElement !== this.currentItem[0] &&\n\t\t\t\tthis.placeholder[intersection === 1 ? \"next\" : \"prev\"]()[0] !== itemElement &&\n\t\t\t\t!$.contains(this.placeholder[0], itemElement) &&\n\t\t\t\t(this.options.type === \"semi-dynamic\" ? !$.contains(this.element[0], itemElement) : true)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif (this.options.tolerance === \"pointer\" || this._intersectsWithSides(item)) {\n\t\t\t\t\tthis._rearrange(event, item);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers(event);\n\n\t\t//Interconnect with droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"sort\", event, this._uiHash());\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function(event, noPropagation) {\n\n\t\tif(!event) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\t$.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\tif(this.options.revert) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {\n\t\t\t\tthat._clear(event);\n\t\t\t});\n\t\t} else {\n\t\t\tthis._clear(event, noPropagation);\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif(this.dragging) {\n\n\t\t\tthis._mouseUp({ target: null });\n\n\t\t\tif(this.options.helper === \"original\") {\n\t\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor (var i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tthis.containers[i]._trigger(\"deactivate\", null, this._uiHash(this));\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", null, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (this.placeholder) {\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\t\tif(this.placeholder[0].parentNode) {\n\t\t\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\t\t\t}\n\t\t\tif(this.options.helper !== \"original\" && this.helper && this.helper[0].parentNode) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend(this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t});\n\n\t\t\tif(this.domPosition.prev) {\n\t\t\t\t$(this.domPosition.prev).after(this.currentItem);\n\t\t\t} else {\n\t\t\t\t$(this.domPosition.parent).prepend(this.currentItem);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$(items).each(function() {\n\t\t\tvar res = ($(o.item || this).attr(o.attribute || \"id\") || \"\").match(o.expression || (/(.+)[\\-=_](.+)/));\n\t\t\tif (res) {\n\t\t\t\tstr.push((o.key || res[1]+\"[]\")+\"=\"+(o.key && o.expression ? res[1] : res[2]));\n\t\t\t}\n\t\t});\n\n\t\tif(!str.length && o.key) {\n\t\t\tstr.push(o.key + \"=\");\n\t\t}\n\n\t\treturn str.join(\"&\");\n\n\t},\n\n\ttoArray: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each(function() { ret.push($(o.item || this).attr(o.attribute || \"id\") || \"\"); });\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function(item) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t(this.options.tolerance !== \"pointer\" && this.helperProportions[this.floating ? \"width\" : \"height\"] > item[this.floating ? \"width\" : \"height\"])\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn (l < x1 + (this.helperProportions.width / 2) && // Right Half\n\t\t\t\tx2 - (this.helperProportions.width / 2) < r && // Left Half\n\t\t\t\tt < y1 + (this.helperProportions.height / 2) && // Bottom Half\n\t\t\t\ty2 - (this.helperProportions.height / 2) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function(item) {\n\n\t\tvar isOverElementHeight = (this.options.axis === \"x\") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),\n\t\t\tisOverElementWidth = (this.options.axis === \"y\") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth,\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (!isOverElement) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.floating ?\n\t\t\t( ((horizontalDirection && horizontalDirection === \"right\") || verticalDirection === \"down\") ? 2 : 1 )\n\t\t\t: ( verticalDirection && (verticalDirection === \"down\" ? 2 : 1) );\n\n\t},\n\n\t_intersectsWithSides: function(item) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),\n\t\t\tisOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (this.floating && horizontalDirection) {\n\t\t\treturn ((horizontalDirection === \"right\" && isOverRightHalf) || (horizontalDirection === \"left\" && !isOverRightHalf));\n\t\t} else {\n\t\t\treturn verticalDirection && ((verticalDirection === \"down\" && isOverBottomHalf) || (verticalDirection === \"up\" && !isOverBottomHalf));\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && (delta > 0 ? \"down\" : \"up\");\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && (delta > 0 ? \"right\" : \"left\");\n\t},\n\n\trefresh: function(event) {\n\t\tthis._refreshItems(event);\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function(connected) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && connected) {\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i], this.document[0]);\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), inst]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), this]);\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor (i = queries.length - 1; i >= 0; i--){\n\t\t\tqueries[i][0].each( addItems );\n\t\t}\n\n\t\treturn $(items);\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find(\":data(\" + this.widgetName + \"-item)\");\n\n\t\tthis.items = $.grep(this.items, function (item) {\n\t\t\tfor (var j=0; j < list.length; j++) {\n\t\t\t\tif(list[j] === item.item[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t},\n\n\t_refreshItems: function(event) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [this];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i], this.document[0]);\n\t\t\t\tfor (j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);\n\t\t\t\t\t\tthis.containers.push(inst);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = queries.length - 1; i >= 0; i--) {\n\t\t\ttargetData = queries[i][1];\n\t\t\t_queries = queries[i][0];\n\n\t\t\tfor (j=0, queriesLength = _queries.length; j < queriesLength; j++) {\n\t\t\t\titem = $(_queries[j]);\n\n\t\t\t\titem.data(this.widgetName + \"-item\", targetData); // Data for target checking (mouse manager)\n\n\t\t\t\titems.push({\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function(fast) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change\n\t\tif(this.offsetParent && this.helper) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor (i = this.items.length - 1; i >= 0; i--){\n\t\t\titem = this.items[i];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;\n\n\t\t\tif (!fast) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif(this.options.custom && this.options.custom.refreshContainers) {\n\t\t\tthis.options.custom.refreshContainers.call(this);\n\t\t} else {\n\t\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tp = this.containers[i].element.offset();\n\t\t\t\tthis.containers[i].containerCache.left = p.left;\n\t\t\t\tthis.containers[i].containerCache.top = p.top;\n\t\t\t\tthis.containers[i].containerCache.width = this.containers[i].element.outerWidth();\n\t\t\t\tthis.containers[i].containerCache.height = this.containers[i].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function(that) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif(!o.placeholder || o.placeholder.constructor === String) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[0].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[0] )\n\t\t\t\t\t\t\t.addClass(className || that.currentItem[0].className+\" ui-sortable-placeholder\")\n\t\t\t\t\t\t\t.removeClass(\"ui-sortable-helper\");\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function(container, p) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified\n\t\t\t\t\tif(className && !o.forcePlaceholderSize) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css(\"paddingTop\")||0, 10) - parseInt(that.currentItem.css(\"paddingBottom\")||0, 10)); }\n\t\t\t\t\tif(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css(\"paddingLeft\")||0, 10) - parseInt(that.currentItem.css(\"paddingRight\")||0, 10)); }\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after(that.placeholder);\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update(that, that.placeholder);\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each(function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t});\n\t},\n\n\t_contactContainers: function(event) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// get innermost container that intersects with item\n\t\tfor (i = this.containers.length - 1; i >= 0; i--) {\n\n\t\t\t// never consider a container that's located within the item itself\n\t\t\tif($.contains(this.currentItem[0], this.containers[i].element[0])) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(this._intersectsWith(this.containers[i].containerCache)) {\n\n\t\t\t\t// if we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[i];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", event, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// if no intersecting containers found, return\n\t\tif(!innermostContainer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// move the item into the container if it's not there already\n\t\tif(this.containers.length === 1) {\n\t\t\tif (!this.containers[innermostIndex].containerCache.over) {\n\t\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t//When entering a new container, we will find the item with the least distance and append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating(this.currentItem);\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"clientX\" : \"clientY\";\n\n\t\t\tfor (j = this.items.length - 1; j >= 0; j--) {\n\t\t\t\tif(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(this.items[j].item[0] === this.currentItem[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[j].item.offset()[posProperty];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\": \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif(!itemWithLeastDistance && !this.options.dropOnEmpty) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.currentContainer === this.containers[innermostIndex]) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);\n\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\tthis.containers[innermostIndex]._trigger(\"change\", event, this._uiHash(this));\n\t\t\tthis.currentContainer = this.containers[innermostIndex];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update(this.currentContainer, this.placeholder);\n\n\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t}\n\n\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem);\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif(!helper.parents(\"body\").length) {\n\t\t\t$(o.appendTo !== \"parent\" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);\n\t\t}\n\n\t\tif(helper[0] === this.currentItem[0]) {\n\t\t\tthis._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css(\"position\"), top: this.currentItem.css(\"top\"), left: this.currentItem.css(\"left\") };\n\t\t}\n\n\t\tif(!helper[0].style.width || o.forceHelperSize) {\n\t\t\thelper.width(this.currentItem.width());\n\t\t}\n\t\tif(!helper[0].style.height || o.forceHelperSize) {\n\t\t\thelper.height(this.currentItem.height());\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif(this.cssPosition === \"absolute\" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this information\n\t\t// with an ugly IE fix\n\t\tif( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === \"html\" && $.ui.ie)) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif(this.cssPosition === \"relative\") {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.currentItem.css(\"marginLeft\"),10) || 0),\n\t\t\ttop: (parseInt(this.currentItem.css(\"marginTop\"),10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif(o.containment === \"parent\") {\n\t\t\to.containment = this.helper[0].parentNode;\n\t\t}\n\t\tif(o.containment === \"document\" || o.containment === \"window\") {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t(o.containment === \"document\" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif(!(/^(document|window|parent)$/).test(o.containment)) {\n\t\t\tce = $(o.containment)[0];\n\t\t\tco = $(o.containment).offset();\n\t\t\tover = ($(ce).css(\"overflow\") !== \"hidden\");\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0) - this.margins.left,\n\t\t\t\tco.top + (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0) - this.margins.top,\n\t\t\t\tco.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left,\n\t\t\t\tco.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif(!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,\n\t\t\tscrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function(event) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif(this.cssPosition === \"relative\" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif(this.originalPosition) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif(this.containment) {\n\t\t\t\tif(event.pageX - this.offset.click.left < this.containment[0]) {\n\t\t\t\t\tpageX = this.containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top < this.containment[1]) {\n\t\t\t\t\tpageY = this.containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif(event.pageX - this.offset.click.left > this.containment[2]) {\n\t\t\t\t\tpageX = this.containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top > this.containment[3]) {\n\t\t\t\t\tpageY = this.containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(o.grid) {\n\t\t\t\ttop = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];\n\t\t\t\tpageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];\n\t\t\t\tpageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.top -\t\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function(event, i, a, hardRefresh) {\n\n\t\ta ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === \"down\" ? i.item[0] : i.item[0].nextSibling));\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay(function() {\n\t\t\tif(counter === this.counter) {\n\t\t\t\tthis.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_clear: function(event, noPropagation) {\n\n\t\tthis.reverting = false;\n\t\t// We delay all events that have to be triggered to after the point where the placeholder has been removed and\n\t\t// everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)\n\t\tif(!this._noFinalSort && this.currentItem.parent().length) {\n\t\t\tthis.placeholder.before(this.currentItem);\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif(this.helper[0] === this.currentItem[0]) {\n\t\t\tfor(i in this._storedCSS) {\n\t\t\t\tif(this._storedCSS[i] === \"auto\" || this._storedCSS[i] === \"static\") {\n\t\t\t\t\tthis._storedCSS[i] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif(this.fromOutside && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"receive\", event, this._uiHash(this.fromOutside)); });\n\t\t}\n\t\tif((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(\".ui-sortable-helper\")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"update\", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif (this !== this.currentContainer) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"remove\", event, this._uiHash()); });\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"receive\", event, this._uiHash(this)); };  }).call(this, this.currentContainer));\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"update\", event, this._uiHash(this));  }; }).call(this, this.currentContainer));\n\t\t\t}\n\t\t}\n\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\tif (!noPropagation) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif(this._storedOpacity) {\n\t\t\tthis.helper.css(\"opacity\", this._storedOpacity);\n\t\t}\n\t\tif(this._storedZIndex) {\n\t\t\tthis.helper.css(\"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex);\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif(!noPropagation) {\n\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif(!noPropagation) {\n\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t} //Trigger all delayed events\n\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ($.Widget.prototype._trigger.apply(this, arguments) === false) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function(_inst) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $([]),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n});\n\n\n/*!\n * jQuery UI Spinner 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/spinner/\n */\n\n\nfunction spinner_modifier( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\nvar spinner = $.widget( \"ui.spinner\", {\n\tversion: \"1.11.4\",\n\tdefaultElement: \"<input>\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = {},\n\t\t\telement = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value !== undefined && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( (delta > 0 ? 1 : -1) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay(function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[0] === this.document[0].activeElement ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[0] === this.document[0].activeElement;\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.focus();\n\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay(function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t});\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t_draw: function() {\n\t\tvar uiSpinner = this.uiSpinner = this.element\n\t\t\t.addClass( \"ui-spinner-input\" )\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t.parent()\n\t\t\t\t// add buttons\n\t\t\t\t.append( this._buttonHtml() );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// button bindings\n\t\tthis.buttons = uiSpinner.find( \".ui-spinner-button\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.button()\n\t\t\t.removeClass( \"ui-corner-all\" );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&\n\t\t\t\tuiSpinner.height() > 0 ) {\n\t\t\tuiSpinner.height( uiSpinner.height() );\n\t\t}\n\n\t\t// disable spinner if element was already disabled\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.disable();\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_uiSpinnerHtml: function() {\n\t\treturn \"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>\";\n\t},\n\n\t_buttonHtml: function() {\n\t\treturn \"\" +\n\t\t\t\"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>\" +\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.up + \"'>&#9650;</span>\" +\n\t\t\t\"</a>\" +\n\t\t\t\"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>\" +\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.down + \"'>&#9660;</span>\" +\n\t\t\t\"</a>\";\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay(function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round(aboveMin / options.step) * options.step;\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// clamp the value\n\t\tif ( options.max !== null && value > options.max) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tvar prevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.buttons.first().find( \".ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.up )\n\t\t\t\t.addClass( value.up );\n\t\t\tthis.buttons.last().find( \".ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.down )\n\t\t\t\t.addClass( value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget().toggleClass( \"ui-state-disabled\", !!value );\n\t\t\tthis.element.prop( \"disabled\", !!value );\n\t\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t\t}\n\t},\n\n\t_setOptions: spinner_modifier(function( options ) {\n\t\tthis._super( options );\n\t}),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr({\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t});\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// if value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-spinner-input\" )\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-valuemin\" )\n\t\t\t.removeAttr( \"aria-valuemax\" )\n\t\t\t.removeAttr( \"aria-valuenow\" );\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinner_modifier(function( steps ) {\n\t\tthis._stepUp( steps );\n\t}),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( (steps || 1) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinner_modifier(function( steps ) {\n\t\tthis._stepDown( steps );\n\t}),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( (steps || 1) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinner_modifier(function( pages ) {\n\t\tthis._stepUp( (pages || 1) * this.options.page );\n\t}),\n\n\tpageDown: spinner_modifier(function( pages ) {\n\t\tthis._stepDown( (pages || 1) * this.options.page );\n\t}),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinner_modifier( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n});\n\n\n/*!\n * jQuery UI Tabs 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/tabs/\n */\n\n\nvar tabs = $.widget( \"ui.tabs\", {\n\tversion: \"1.11.4\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: (function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\t// support: IE7\n\t\t\t// IE7 doesn't normalize the href property when set via script (#9317)\n\t\t\tanchor = anchor.cloneNode( false );\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t})(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.toggleClass( \"ui-tabs-collapsible\", options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t})\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each(function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// no active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( this.document[0].activeElement ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tselectedIndex++;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.UP:\n\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\tgoingForward = false;\n\t\t\t\tselectedIndex--;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tselectedIndex = 0;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\t// Activate only, no collapsing\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\tthis._activate( selectedIndex );\n\t\t\t\treturn;\n\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\t// Determine if we should collapse or activate\n\t\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay(function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.focus();\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).focus();\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\t// don't use the widget factory's disabled handling\n\t\t\tthis._setupDisabled( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value);\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis.element.toggleClass( \"ui-tabs-collapsible\", value );\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t});\n\n\t\tthis._processTabs();\n\n\t\t// was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\t\t// was active, active tab still exists\n\t\t} else {\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setupDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t});\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t});\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.addClass( \"ui-tabs-active ui-state-active\" )\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t});\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList()\n\t\t\t.addClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.attr( \"role\", \"tablist\" )\n\n\t\t\t// Prevent users from focusing disabled tabs via click\n\t\t\t.delegate( \"> li\", \"mousedown\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.delegate( \".ui-tabs-anchor\", \"focus\" + this.eventNamespace, function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.addClass( \"ui-state-default ui-corner-top\" )\n\t\t\t.attr({\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.anchors = this.tabs.map(function() {\n\t\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t\t})\n\t\t\t.addClass( \"ui-tabs-anchor\" )\n\t\t\t.attr({\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each(function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\t\t\t// remote tab\n\t\t\t} else {\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr({\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t});\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t});\n\n\t\tthis.panels\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol,ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"<div>\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setupDisabled: function( disabled ) {\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// disable tabs\n\t\tfor ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\t$( li )\n\t\t\t\t\t.addClass( \"ui-state-disabled\" )\n\t\t\t\t\t.attr( \"aria-disabled\", \"true\" );\n\t\t\t} else {\n\t\t\t\t$( li )\n\t\t\t\t\t.removeClass( \"ui-state-disabled\" )\n\t\t\t\t\t.removeAttr( \"aria-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split(\" \"), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t});\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t});\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.element.children().not( this.panels ).each(function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.panels.each(function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t})\n\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each(function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t}).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\teventData.newTab.closest( \"li\" ).addClass( \"ui-tabs-active ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t});\n\t\t} else {\n\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t});\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter(function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t})\n\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr({\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t});\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler({\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t});\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" + index + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.element.removeClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible\" );\n\n\t\tthis.tablist\n\t\t\t.removeClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.removeAttr( \"role\" );\n\n\t\tthis.anchors\n\t\t\t.removeClass( \"ui-tabs-anchor\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tablist.unbind( this.eventNamespace );\n\n\t\tthis.tabs.add( this.panels ).each(function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this )\n\t\t\t\t\t.removeClass( \"ui-state-default ui-state-active ui-state-disabled \" +\n\t\t\t\t\t\t\"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel\" )\n\t\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t\t.removeAttr( \"aria-live\" )\n\t\t\t\t\t.removeAttr( \"aria-busy\" )\n\t\t\t\t\t.removeAttr( \"aria-selected\" )\n\t\t\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t\t\t.removeAttr( \"role\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.tabs.each(function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\ttab.removeClass( \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\ttab.addClass( \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done(function( response, status, jqXHR ) {\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t})\n\t\t\t\t.fail(function( jqXHR, status ) {\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\t\t\turl: anchor.attr( \"href\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n});\n\n\n/*!\n * jQuery UI Tooltip 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/tooltip/\n */\n\n\nvar tooltip = $.widget( \"ui.tooltip\", {\n\tversion: \"1.11.4\",\n\toptions: {\n\t\tcontent: function() {\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"<a>\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttooltipClass: null,\n\t\ttrack: false,\n\n\t\t// callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = (elem.attr( \"aria-describedby\" ) || \"\").split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = (elem.attr( \"aria-describedby\" ) || \"\").split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on({\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t});\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._disable();\n\t\t}\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"<div>\" )\n\t\t\t.attr({\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t})\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t\t\tthis.options[ key ] = value;\n\t\t\t// disable element style changes\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t});\n\t\t}\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t});\n\n\t\t// remove title attributes to prevent native tooltips\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\telement\n\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_enable: function() {\n\t\t// restore title attributes\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t});\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each(function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[0], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay(function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// jQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t});\n\t\t});\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// if we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\tif ( content.clone ) {\n\t\t\ta11yContent = content.clone();\n\t\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\t} else {\n\t\t\ta11yContent = content;\n\t\t}\n\t\t$( \"<div>\" ).html( a11yContent ).appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t});\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend({\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\tif ( this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval(function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event(event);\n\t\t\t\t\tfakeEvent.currentTarget = target[0];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t});\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t});\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"<div>\" )\n\t\t\t\t.attr( \"role\", \"tooltip\" )\n\t\t\t\t.addClass( \"ui-tooltip ui-widget ui-corner-all ui-widget-content \" +\n\t\t\t\t\t( this.options.tooltipClass || \"\" ) ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\t$( \"<div>\" )\n\t\t\t.addClass( \"ui-tooltip-content\" )\n\t\t\t.appendTo( tooltip );\n\n\t\ttooltip.appendTo( this.document[0].body );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t});\n\t\tthis.liveRegion.remove();\n\t}\n});\n\n\n\n}));","/*! jQuery UI - v1.11.1+CommonJS - 2014-09-17\n* http://jqueryui.com\n* Includes: widget.js\n* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */\n\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([ \"jquery\" ], factory );\n\n\t} else if (typeof exports === \"object\") {\n\t\t// Node/CommonJS:\n\t\tfactory(require(\"jquery\"));\n\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n/*!\n * jQuery UI Widget 1.11.1\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n\n\nvar widget_uuid = 0,\n\twidget_slice = Array.prototype.slice;\n\n$.cleanData = (function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; (elem = elems[i]) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t} catch( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n})( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widget_slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = widget_slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.widget.extend.apply( null, [ options ].concat(args) ) :\n\t\t\toptions;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\treturnValue = instance;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widget_uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled\", !!value );\n\n\t\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\t\tif ( value ) {\n\t\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions({ disabled: false });\n\t},\n\tdisable: function() {\n\t\treturn this._setOptions({ disabled: true });\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) + this.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\nvar widget = $.widget;\n\n\n\n}));\n","/*\n * jQuery Iframe Transport Plugin 1.8.3\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n */\n\n/* global define, require, window, document */\n\n(function (factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        // Register as an anonymous AMD module:\n        define(['jquery'], factory);\n    } else if (typeof exports === 'object') {\n        // Node/CommonJS:\n        factory(require('jquery'));\n    } else {\n        // Browser globals:\n        factory(window.jQuery);\n    }\n}(function ($) {\n    'use strict';\n\n    // Helper variable to create unique names for the transport iframes:\n    var counter = 0;\n\n    // The iframe transport accepts four additional options:\n    // options.fileInput: a jQuery collection of file input fields\n    // options.paramName: the parameter name for the file form data,\n    //  overrides the name property of the file input field(s),\n    //  can be a string or an array of strings.\n    // options.formData: an array of objects with name and value properties,\n    //  equivalent to the return data of .serializeArray(), e.g.:\n    //  [{name: 'a', value: 1}, {name: 'b', value: 2}]\n    // options.initialIframeSrc: the URL of the initial iframe src,\n    //  by default set to \"javascript:false;\"\n    $.ajaxTransport('iframe', function (options) {\n        if (options.async) {\n            // javascript:false as initial iframe src\n            // prevents warning popups on HTTPS in IE6:\n            /*jshint scripturl: true */\n            var initialIframeSrc = options.initialIframeSrc || 'javascript:false;',\n            /*jshint scripturl: false */\n                form,\n                iframe,\n                addParamChar;\n            return {\n                send: function (_, completeCallback) {\n                    form = $('<form style=\"display:none;\"></form>');\n                    form.attr('accept-charset', options.formAcceptCharset);\n                    addParamChar = /\\?/.test(options.url) ? '&' : '?';\n                    // XDomainRequest only supports GET and POST:\n                    if (options.type === 'DELETE') {\n                        options.url = options.url + addParamChar + '_method=DELETE';\n                        options.type = 'POST';\n                    } else if (options.type === 'PUT') {\n                        options.url = options.url + addParamChar + '_method=PUT';\n                        options.type = 'POST';\n                    } else if (options.type === 'PATCH') {\n                        options.url = options.url + addParamChar + '_method=PATCH';\n                        options.type = 'POST';\n                    }\n                    // IE versions below IE8 cannot set the name property of\n                    // elements that have already been added to the DOM,\n                    // so we set the name along with the iframe HTML markup:\n                    counter += 1;\n                    iframe = $(\n                        '<iframe src=\"' + initialIframeSrc +\n                            '\" name=\"iframe-transport-' + counter + '\"></iframe>'\n                    ).bind('load', function () {\n                        var fileInputClones,\n                            paramNames = $.isArray(options.paramName) ?\n                                    options.paramName : [options.paramName];\n                        iframe\n                            .unbind('load')\n                            .bind('load', function () {\n                                var response;\n                                // Wrap in a try/catch block to catch exceptions thrown\n                                // when trying to access cross-domain iframe contents:\n                                try {\n                                    response = iframe.contents();\n                                    // Google Chrome and Firefox do not throw an\n                                    // exception when calling iframe.contents() on\n                                    // cross-domain requests, so we unify the response:\n                                    if (!response.length || !response[0].firstChild) {\n                                        throw new Error();\n                                    }\n                                } catch (e) {\n                                    response = undefined;\n                                }\n                                // The complete callback returns the\n                                // iframe content document as response object:\n                                completeCallback(\n                                    200,\n                                    'success',\n                                    {'iframe': response}\n                                );\n                                // Fix for IE endless progress bar activity bug\n                                // (happens on form submits to iframe targets):\n                                $('<iframe src=\"' + initialIframeSrc + '\"></iframe>')\n                                    .appendTo(form);\n                                window.setTimeout(function () {\n                                    // Removing the form in a setTimeout call\n                                    // allows Chrome's developer tools to display\n                                    // the response result\n                                    form.remove();\n                                }, 0);\n                            });\n                        form\n                            .prop('target', iframe.prop('name'))\n                            .prop('action', options.url)\n                            .prop('method', options.type);\n                        if (options.formData) {\n                            $.each(options.formData, function (index, field) {\n                                $('<input type=\"hidden\"/>')\n                                    .prop('name', field.name)\n                                    .val(field.value)\n                                    .appendTo(form);\n                            });\n                        }\n                        if (options.fileInput && options.fileInput.length &&\n                                options.type === 'POST') {\n                            fileInputClones = options.fileInput.clone();\n                            // Insert a clone for each file input field:\n                            options.fileInput.after(function (index) {\n                                return fileInputClones[index];\n                            });\n                            if (options.paramName) {\n                                options.fileInput.each(function (index) {\n                                    $(this).prop(\n                                        'name',\n                                        paramNames[index] || options.paramName\n                                    );\n                                });\n                            }\n                            // Appending the file input fields to the hidden form\n                            // removes them from their original location:\n                            form\n                                .append(options.fileInput)\n                                .prop('enctype', 'multipart/form-data')\n                                // enctype must be set as encoding for IE:\n                                .prop('encoding', 'multipart/form-data');\n                            // Remove the HTML5 form attribute from the input(s):\n                            options.fileInput.removeAttr('form');\n                        }\n                        form.submit();\n                        // Insert the file input fields at their original location\n                        // by replacing the clones with the originals:\n                        if (fileInputClones && fileInputClones.length) {\n                            options.fileInput.each(function (index, input) {\n                                var clone = $(fileInputClones[index]);\n                                // Restore the original name and form properties:\n                                $(input)\n                                    .prop('name', clone.prop('name'))\n                                    .attr('form', clone.attr('form'));\n                                clone.replaceWith(input);\n                            });\n                        }\n                    });\n                    form.append(iframe).appendTo(document.body);\n                },\n                abort: function () {\n                    if (iframe) {\n                        // javascript:false as iframe src aborts the request\n                        // and prevents warning popups on HTTPS in IE6.\n                        // concat is used to avoid the \"Script URL\" JSLint error:\n                        iframe\n                            .unbind('load')\n                            .prop('src', initialIframeSrc);\n                    }\n                    if (form) {\n                        form.remove();\n                    }\n                }\n            };\n        }\n    });\n\n    // The iframe transport returns the iframe content document as response.\n    // The following adds converters from iframe to text, json, html, xml\n    // and script.\n    // Please note that the Content-Type for JSON responses has to be text/plain\n    // or text/html, if the browser doesn't include application/json in the\n    // Accept header, else IE will show a download dialog.\n    // The Content-Type for XML responses on the other hand has to be always\n    // application/xml or text/xml, so IE properly parses the XML response.\n    // See also\n    // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation\n    $.ajaxSetup({\n        converters: {\n            'iframe text': function (iframe) {\n                return iframe && $(iframe[0].body).text();\n            },\n            'iframe json': function (iframe) {\n                return iframe && $.parseJSON($(iframe[0].body).text());\n            },\n            'iframe html': function (iframe) {\n                return iframe && $(iframe[0].body).html();\n            },\n            'iframe xml': function (iframe) {\n                var xmlDoc = iframe && iframe[0];\n                return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :\n                        $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||\n                            $(xmlDoc.body).html());\n            },\n            'iframe script': function (iframe) {\n                return iframe && $.globalEval($(iframe[0].body).text());\n            }\n        }\n    });\n\n}));\n","/*\n * jQuery File Upload Plugin 5.42.3\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2010, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n/* global define, require, window, document, location, Blob, FormData */\n\n(function (factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        // Register as an anonymous AMD module:\n        define([\n            'jquery',\n            'jquery.ui.widget'\n        ], factory);\n    } else if (typeof exports === 'object') {\n        // Node/CommonJS:\n        factory(\n            require('jquery'),\n            require('./vendor/jquery.ui.widget')\n        );\n    } else {\n        // Browser globals:\n        factory(window.jQuery);\n    }\n}(function ($) {\n    'use strict';\n\n    // Detect file input support, based on\n    // http://viljamis.com/blog/2012/file-upload-support-on-mobile/\n    $.support.fileInput = !(new RegExp(\n        // Handle devices which give false positives for the feature detection:\n        '(Android (1\\\\.[0156]|2\\\\.[01]))' +\n            '|(Windows Phone (OS 7|8\\\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +\n            '|(w(eb)?OSBrowser)|(webOS)' +\n            '|(Kindle/(1\\\\.0|2\\\\.[05]|3\\\\.0))'\n    ).test(window.navigator.userAgent) ||\n        // Feature detection for all other devices:\n        $('<input type=\"file\">').prop('disabled'));\n\n    // The FileReader API is not actually used, but works as feature detection,\n    // as some Safari versions (5?) support XHR file uploads via the FormData API,\n    // but not non-multipart XHR file uploads.\n    // window.XMLHttpRequestUpload is not available on IE10, so we check for\n    // window.ProgressEvent instead to detect XHR2 file upload capability:\n    $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);\n    $.support.xhrFormDataFileUpload = !!window.FormData;\n\n    // Detect support for Blob slicing (required for chunked uploads):\n    $.support.blobSlice = window.Blob && (Blob.prototype.slice ||\n        Blob.prototype.webkitSlice || Blob.prototype.mozSlice);\n\n    // Helper function to create drag handlers for dragover/dragenter/dragleave:\n    function getDragHandler(type) {\n        var isDragOver = type === 'dragover';\n        return function (e) {\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n            var dataTransfer = e.dataTransfer;\n            if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&\n                    this._trigger(\n                        type,\n                        $.Event(type, {delegatedEvent: e})\n                    ) !== false) {\n                e.preventDefault();\n                if (isDragOver) {\n                    dataTransfer.dropEffect = 'copy';\n                }\n            }\n        };\n    }\n\n    // The fileupload widget listens for change events on file input fields defined\n    // via fileInput setting and paste or drop events of the given dropZone.\n    // In addition to the default jQuery Widget methods, the fileupload widget\n    // exposes the \"add\" and \"send\" methods, to add or directly send files using\n    // the fileupload API.\n    // By default, files added via file input selection, paste, drag & drop or\n    // \"add\" method are uploaded immediately, but it is possible to override\n    // the \"add\" callback option to queue file uploads.\n    $.widget('blueimp.fileupload', {\n\n        options: {\n            // The drop target element(s), by the default the complete document.\n            // Set to null to disable drag & drop support:\n            dropZone: $(document),\n            // The paste target element(s), by the default undefined.\n            // Set to a DOM node or jQuery object to enable file pasting:\n            pasteZone: undefined,\n            // The file input field(s), that are listened to for change events.\n            // If undefined, it is set to the file input fields inside\n            // of the widget element on plugin initialization.\n            // Set to null to disable the change listener.\n            fileInput: undefined,\n            // By default, the file input field is replaced with a clone after\n            // each input field change event. This is required for iframe transport\n            // queues and allows change events to be fired for the same file\n            // selection, but can be disabled by setting the following option to false:\n            replaceFileInput: true,\n            // The parameter name for the file form data (the request argument name).\n            // If undefined or empty, the name property of the file input field is\n            // used, or \"files[]\" if the file input name property is also empty,\n            // can be a string or an array of strings:\n            paramName: undefined,\n            // By default, each file of a selection is uploaded using an individual\n            // request for XHR type uploads. Set to false to upload file\n            // selections in one request each:\n            singleFileUploads: true,\n            // To limit the number of files uploaded with one XHR request,\n            // set the following option to an integer greater than 0:\n            limitMultiFileUploads: undefined,\n            // The following option limits the number of files uploaded with one\n            // XHR request to keep the request size under or equal to the defined\n            // limit in bytes:\n            limitMultiFileUploadSize: undefined,\n            // Multipart file uploads add a number of bytes to each uploaded file,\n            // therefore the following option adds an overhead for each file used\n            // in the limitMultiFileUploadSize configuration:\n            limitMultiFileUploadSizeOverhead: 512,\n            // Set the following option to true to issue all file upload requests\n            // in a sequential order:\n            sequentialUploads: false,\n            // To limit the number of concurrent uploads,\n            // set the following option to an integer greater than 0:\n            limitConcurrentUploads: undefined,\n            // Set the following option to true to force iframe transport uploads:\n            forceIframeTransport: false,\n            // Set the following option to the location of a redirect url on the\n            // origin server, for cross-domain iframe transport uploads:\n            redirect: undefined,\n            // The parameter name for the redirect url, sent as part of the form\n            // data and set to 'redirect' if this option is empty:\n            redirectParamName: undefined,\n            // Set the following option to the location of a postMessage window,\n            // to enable postMessage transport uploads:\n            postMessage: undefined,\n            // By default, XHR file uploads are sent as multipart/form-data.\n            // The iframe transport is always using multipart/form-data.\n            // Set to false to enable non-multipart XHR uploads:\n            multipart: true,\n            // To upload large files in smaller chunks, set the following option\n            // to a preferred maximum chunk size. If set to 0, null or undefined,\n            // or the browser does not support the required Blob API, files will\n            // be uploaded as a whole.\n            maxChunkSize: undefined,\n            // When a non-multipart upload or a chunked multipart upload has been\n            // aborted, this option can be used to resume the upload by setting\n            // it to the size of the already uploaded bytes. This option is most\n            // useful when modifying the options object inside of the \"add\" or\n            // \"send\" callbacks, as the options are cloned for each file upload.\n            uploadedBytes: undefined,\n            // By default, failed (abort or error) file uploads are removed from the\n            // global progress calculation. Set the following option to false to\n            // prevent recalculating the global progress data:\n            recalculateProgress: true,\n            // Interval in milliseconds to calculate and trigger progress events:\n            progressInterval: 100,\n            // Interval in milliseconds to calculate progress bitrate:\n            bitrateInterval: 500,\n            // By default, uploads are started automatically when adding files:\n            autoUpload: true,\n\n            // Error and info messages:\n            messages: {\n                uploadedBytes: 'Uploaded bytes exceed file size'\n            },\n\n            // Translation function, gets the message key to be translated\n            // and an object with context specific data as arguments:\n            i18n: function (message, context) {\n                message = this.messages[message] || message.toString();\n                if (context) {\n                    $.each(context, function (key, value) {\n                        message = message.replace('{' + key + '}', value);\n                    });\n                }\n                return message;\n            },\n\n            // Additional form data to be sent along with the file uploads can be set\n            // using this option, which accepts an array of objects with name and\n            // value properties, a function returning such an array, a FormData\n            // object (for XHR file uploads), or a simple object.\n            // The form of the first fileInput is given as parameter to the function:\n            formData: function (form) {\n                return form.serializeArray();\n            },\n\n            // The add callback is invoked as soon as files are added to the fileupload\n            // widget (via file input selection, drag & drop, paste or add API call).\n            // If the singleFileUploads option is enabled, this callback will be\n            // called once for each file in the selection for XHR file uploads, else\n            // once for each file selection.\n            //\n            // The upload starts when the submit method is invoked on the data parameter.\n            // The data object contains a files property holding the added files\n            // and allows you to override plugin options as well as define ajax settings.\n            //\n            // Listeners for this callback can also be bound the following way:\n            // .bind('fileuploadadd', func);\n            //\n            // data.submit() returns a Promise object and allows to attach additional\n            // handlers using jQuery's Deferred callbacks:\n            // data.submit().done(func).fail(func).always(func);\n            add: function (e, data) {\n                if (e.isDefaultPrevented()) {\n                    return false;\n                }\n                if (data.autoUpload || (data.autoUpload !== false &&\n                        $(this).fileupload('option', 'autoUpload'))) {\n                    data.process().done(function () {\n                        data.submit();\n                    });\n                }\n            },\n\n            // Other callbacks:\n\n            // Callback for the submit event of each file upload:\n            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);\n\n            // Callback for the start of each file upload request:\n            // send: function (e, data) {}, // .bind('fileuploadsend', func);\n\n            // Callback for successful uploads:\n            // done: function (e, data) {}, // .bind('fileuploaddone', func);\n\n            // Callback for failed (abort or error) uploads:\n            // fail: function (e, data) {}, // .bind('fileuploadfail', func);\n\n            // Callback for completed (success, abort or error) requests:\n            // always: function (e, data) {}, // .bind('fileuploadalways', func);\n\n            // Callback for upload progress events:\n            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);\n\n            // Callback for global upload progress events:\n            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);\n\n            // Callback for uploads start, equivalent to the global ajaxStart event:\n            // start: function (e) {}, // .bind('fileuploadstart', func);\n\n            // Callback for uploads stop, equivalent to the global ajaxStop event:\n            // stop: function (e) {}, // .bind('fileuploadstop', func);\n\n            // Callback for change events of the fileInput(s):\n            // change: function (e, data) {}, // .bind('fileuploadchange', func);\n\n            // Callback for paste events to the pasteZone(s):\n            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);\n\n            // Callback for drop events of the dropZone(s):\n            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);\n\n            // Callback for dragover events of the dropZone(s):\n            // dragover: function (e) {}, // .bind('fileuploaddragover', func);\n\n            // Callback for the start of each chunk upload request:\n            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);\n\n            // Callback for successful chunk uploads:\n            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);\n\n            // Callback for failed (abort or error) chunk uploads:\n            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);\n\n            // Callback for completed (success, abort or error) chunk upload requests:\n            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);\n\n            // The plugin options are used as settings object for the ajax calls.\n            // The following are jQuery ajax settings required for the file uploads:\n            processData: false,\n            contentType: false,\n            cache: false,\n            timeout: 0\n        },\n\n        // A list of options that require reinitializing event listeners and/or\n        // special initialization code:\n        _specialOptions: [\n            'fileInput',\n            'dropZone',\n            'pasteZone',\n            'multipart',\n            'forceIframeTransport'\n        ],\n\n        _blobSlice: $.support.blobSlice && function () {\n            var slice = this.slice || this.webkitSlice || this.mozSlice;\n            return slice.apply(this, arguments);\n        },\n\n        _BitrateTimer: function () {\n            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());\n            this.loaded = 0;\n            this.bitrate = 0;\n            this.getBitrate = function (now, loaded, interval) {\n                var timeDiff = now - this.timestamp;\n                if (!this.bitrate || !interval || timeDiff > interval) {\n                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;\n                    this.loaded = loaded;\n                    this.timestamp = now;\n                }\n                return this.bitrate;\n            };\n        },\n\n        _isXHRUpload: function (options) {\n            return !options.forceIframeTransport &&\n                ((!options.multipart && $.support.xhrFileUpload) ||\n                $.support.xhrFormDataFileUpload);\n        },\n\n        _getFormData: function (options) {\n            var formData;\n            if ($.type(options.formData) === 'function') {\n                return options.formData(options.form);\n            }\n            if ($.isArray(options.formData)) {\n                return options.formData;\n            }\n            if ($.type(options.formData) === 'object') {\n                formData = [];\n                $.each(options.formData, function (name, value) {\n                    formData.push({name: name, value: value});\n                });\n                return formData;\n            }\n            return [];\n        },\n\n        _getTotal: function (files) {\n            var total = 0;\n            $.each(files, function (index, file) {\n                total += file.size || 1;\n            });\n            return total;\n        },\n\n        _initProgressObject: function (obj) {\n            var progress = {\n                loaded: 0,\n                total: 0,\n                bitrate: 0\n            };\n            if (obj._progress) {\n                $.extend(obj._progress, progress);\n            } else {\n                obj._progress = progress;\n            }\n        },\n\n        _initResponseObject: function (obj) {\n            var prop;\n            if (obj._response) {\n                for (prop in obj._response) {\n                    if (obj._response.hasOwnProperty(prop)) {\n                        delete obj._response[prop];\n                    }\n                }\n            } else {\n                obj._response = {};\n            }\n        },\n\n        _onProgress: function (e, data) {\n            if (e.lengthComputable) {\n                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),\n                    loaded;\n                if (data._time && data.progressInterval &&\n                        (now - data._time < data.progressInterval) &&\n                        e.loaded !== e.total) {\n                    return;\n                }\n                data._time = now;\n                loaded = Math.floor(\n                    e.loaded / e.total * (data.chunkSize || data._progress.total)\n                ) + (data.uploadedBytes || 0);\n                // Add the difference from the previously loaded state\n                // to the global loaded counter:\n                this._progress.loaded += (loaded - data._progress.loaded);\n                this._progress.bitrate = this._bitrateTimer.getBitrate(\n                    now,\n                    this._progress.loaded,\n                    data.bitrateInterval\n                );\n                data._progress.loaded = data.loaded = loaded;\n                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(\n                    now,\n                    loaded,\n                    data.bitrateInterval\n                );\n                // Trigger a custom progress event with a total data property set\n                // to the file size(s) of the current upload and a loaded data\n                // property calculated accordingly:\n                this._trigger(\n                    'progress',\n                    $.Event('progress', {delegatedEvent: e}),\n                    data\n                );\n                // Trigger a global progress event for all current file uploads,\n                // including ajax calls queued for sequential file uploads:\n                this._trigger(\n                    'progressall',\n                    $.Event('progressall', {delegatedEvent: e}),\n                    this._progress\n                );\n            }\n        },\n\n        _initProgressListener: function (options) {\n            var that = this,\n                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();\n            // Accesss to the native XHR object is required to add event listeners\n            // for the upload progress event:\n            if (xhr.upload) {\n                $(xhr.upload).bind('progress', function (e) {\n                    var oe = e.originalEvent;\n                    // Make sure the progress event properties get copied over:\n                    e.lengthComputable = oe.lengthComputable;\n                    e.loaded = oe.loaded;\n                    e.total = oe.total;\n                    that._onProgress(e, options);\n                });\n                options.xhr = function () {\n                    return xhr;\n                };\n            }\n        },\n\n        _isInstanceOf: function (type, obj) {\n            // Cross-frame instanceof check\n            return Object.prototype.toString.call(obj) === '[object ' + type + ']';\n        },\n\n        _initXHRData: function (options) {\n            var that = this,\n                formData,\n                file = options.files[0],\n                // Ignore non-multipart setting if not supported:\n                multipart = options.multipart || !$.support.xhrFileUpload,\n                paramName = $.type(options.paramName) === 'array' ?\n                    options.paramName[0] : options.paramName;\n            options.headers = $.extend({}, options.headers);\n            if (options.contentRange) {\n                options.headers['Content-Range'] = options.contentRange;\n            }\n            if (!multipart || options.blob || !this._isInstanceOf('File', file)) {\n                options.headers['Content-Disposition'] = 'attachment; filename=\"' +\n                    encodeURI(file.name) + '\"';\n            }\n            if (!multipart) {\n                options.contentType = file.type || 'application/octet-stream';\n                options.data = options.blob || file;\n            } else if ($.support.xhrFormDataFileUpload) {\n                if (options.postMessage) {\n                    // window.postMessage does not allow sending FormData\n                    // objects, so we just add the File/Blob objects to\n                    // the formData array and let the postMessage window\n                    // create the FormData object out of this array:\n                    formData = this._getFormData(options);\n                    if (options.blob) {\n                        formData.push({\n                            name: paramName,\n                            value: options.blob\n                        });\n                    } else {\n                        $.each(options.files, function (index, file) {\n                            formData.push({\n                                name: ($.type(options.paramName) === 'array' &&\n                                    options.paramName[index]) || paramName,\n                                value: file\n                            });\n                        });\n                    }\n                } else {\n                    if (that._isInstanceOf('FormData', options.formData)) {\n                        formData = options.formData;\n                    } else {\n                        formData = new FormData();\n                        $.each(this._getFormData(options), function (index, field) {\n                            formData.append(field.name, field.value);\n                        });\n                    }\n                    if (options.blob) {\n                        formData.append(paramName, options.blob, file.name);\n                    } else {\n                        $.each(options.files, function (index, file) {\n                            // This check allows the tests to run with\n                            // dummy objects:\n                            if (that._isInstanceOf('File', file) ||\n                                    that._isInstanceOf('Blob', file)) {\n                                formData.append(\n                                    ($.type(options.paramName) === 'array' &&\n                                        options.paramName[index]) || paramName,\n                                    file,\n                                    file.uploadName || file.name\n                                );\n                            }\n                        });\n                    }\n                }\n                options.data = formData;\n            }\n            // Blob reference is not needed anymore, free memory:\n            options.blob = null;\n        },\n\n        _initIframeSettings: function (options) {\n            var targetHost = $('<a></a>').prop('href', options.url).prop('host');\n            // Setting the dataType to iframe enables the iframe transport:\n            options.dataType = 'iframe ' + (options.dataType || '');\n            // The iframe transport accepts a serialized array as form data:\n            options.formData = this._getFormData(options);\n            // Add redirect url to form data on cross-domain uploads:\n            if (options.redirect && targetHost && targetHost !== location.host) {\n                options.formData.push({\n                    name: options.redirectParamName || 'redirect',\n                    value: options.redirect\n                });\n            }\n        },\n\n        _initDataSettings: function (options) {\n            if (this._isXHRUpload(options)) {\n                if (!this._chunkedUpload(options, true)) {\n                    if (!options.data) {\n                        this._initXHRData(options);\n                    }\n                    this._initProgressListener(options);\n                }\n                if (options.postMessage) {\n                    // Setting the dataType to postmessage enables the\n                    // postMessage transport:\n                    options.dataType = 'postmessage ' + (options.dataType || '');\n                }\n            } else {\n                this._initIframeSettings(options);\n            }\n        },\n\n        _getParamName: function (options) {\n            var fileInput = $(options.fileInput),\n                paramName = options.paramName;\n            if (!paramName) {\n                paramName = [];\n                fileInput.each(function () {\n                    var input = $(this),\n                        name = input.prop('name') || 'files[]',\n                        i = (input.prop('files') || [1]).length;\n                    while (i) {\n                        paramName.push(name);\n                        i -= 1;\n                    }\n                });\n                if (!paramName.length) {\n                    paramName = [fileInput.prop('name') || 'files[]'];\n                }\n            } else if (!$.isArray(paramName)) {\n                paramName = [paramName];\n            }\n            return paramName;\n        },\n\n        _initFormSettings: function (options) {\n            // Retrieve missing options from the input field and the\n            // associated form, if available:\n            if (!options.form || !options.form.length) {\n                options.form = $(options.fileInput.prop('form'));\n                // If the given file input doesn't have an associated form,\n                // use the default widget file input's form:\n                if (!options.form.length) {\n                    options.form = $(this.options.fileInput.prop('form'));\n                }\n            }\n            options.paramName = this._getParamName(options);\n            if (!options.url) {\n                options.url = options.form.prop('action') || location.href;\n            }\n            // The HTTP request method must be \"POST\" or \"PUT\":\n            options.type = (options.type ||\n                ($.type(options.form.prop('method')) === 'string' &&\n                    options.form.prop('method')) || ''\n                ).toUpperCase();\n            if (options.type !== 'POST' && options.type !== 'PUT' &&\n                    options.type !== 'PATCH') {\n                options.type = 'POST';\n            }\n            if (!options.formAcceptCharset) {\n                options.formAcceptCharset = options.form.attr('accept-charset');\n            }\n        },\n\n        _getAJAXSettings: function (data) {\n            var options = $.extend({}, this.options, data);\n            this._initFormSettings(options);\n            this._initDataSettings(options);\n            return options;\n        },\n\n        // jQuery 1.6 doesn't provide .state(),\n        // while jQuery 1.8+ removed .isRejected() and .isResolved():\n        _getDeferredState: function (deferred) {\n            if (deferred.state) {\n                return deferred.state();\n            }\n            if (deferred.isResolved()) {\n                return 'resolved';\n            }\n            if (deferred.isRejected()) {\n                return 'rejected';\n            }\n            return 'pending';\n        },\n\n        // Maps jqXHR callbacks to the equivalent\n        // methods of the given Promise object:\n        _enhancePromise: function (promise) {\n            promise.success = promise.done;\n            promise.error = promise.fail;\n            promise.complete = promise.always;\n            return promise;\n        },\n\n        // Creates and returns a Promise object enhanced with\n        // the jqXHR methods abort, success, error and complete:\n        _getXHRPromise: function (resolveOrReject, context, args) {\n            var dfd = $.Deferred(),\n                promise = dfd.promise();\n            context = context || this.options.context || promise;\n            if (resolveOrReject === true) {\n                dfd.resolveWith(context, args);\n            } else if (resolveOrReject === false) {\n                dfd.rejectWith(context, args);\n            }\n            promise.abort = dfd.promise;\n            return this._enhancePromise(promise);\n        },\n\n        // Adds convenience methods to the data callback argument:\n        _addConvenienceMethods: function (e, data) {\n            var that = this,\n                getPromise = function (args) {\n                    return $.Deferred().resolveWith(that, args).promise();\n                };\n            data.process = function (resolveFunc, rejectFunc) {\n                if (resolveFunc || rejectFunc) {\n                    data._processQueue = this._processQueue =\n                        (this._processQueue || getPromise([this])).pipe(\n                            function () {\n                                if (data.errorThrown) {\n                                    return $.Deferred()\n                                        .rejectWith(that, [data]).promise();\n                                }\n                                return getPromise(arguments);\n                            }\n                        ).pipe(resolveFunc, rejectFunc);\n                }\n                return this._processQueue || getPromise([this]);\n            };\n            data.submit = function () {\n                if (this.state() !== 'pending') {\n                    data.jqXHR = this.jqXHR =\n                        (that._trigger(\n                            'submit',\n                            $.Event('submit', {delegatedEvent: e}),\n                            this\n                        ) !== false) && that._onSend(e, this);\n                }\n                return this.jqXHR || that._getXHRPromise();\n            };\n            data.abort = function () {\n                if (this.jqXHR) {\n                    return this.jqXHR.abort();\n                }\n                this.errorThrown = 'abort';\n                that._trigger('fail', null, this);\n                return that._getXHRPromise(false);\n            };\n            data.state = function () {\n                if (this.jqXHR) {\n                    return that._getDeferredState(this.jqXHR);\n                }\n                if (this._processQueue) {\n                    return that._getDeferredState(this._processQueue);\n                }\n            };\n            data.processing = function () {\n                return !this.jqXHR && this._processQueue && that\n                    ._getDeferredState(this._processQueue) === 'pending';\n            };\n            data.progress = function () {\n                return this._progress;\n            };\n            data.response = function () {\n                return this._response;\n            };\n        },\n\n        // Parses the Range header from the server response\n        // and returns the uploaded bytes:\n        _getUploadedBytes: function (jqXHR) {\n            var range = jqXHR.getResponseHeader('Range'),\n                parts = range && range.split('-'),\n                upperBytesPos = parts && parts.length > 1 &&\n                    parseInt(parts[1], 10);\n            return upperBytesPos && upperBytesPos + 1;\n        },\n\n        // Uploads a file in multiple, sequential requests\n        // by splitting the file up in multiple blob chunks.\n        // If the second parameter is true, only tests if the file\n        // should be uploaded in chunks, but does not invoke any\n        // upload requests:\n        _chunkedUpload: function (options, testOnly) {\n            options.uploadedBytes = options.uploadedBytes || 0;\n            var that = this,\n                file = options.files[0],\n                fs = file.size,\n                ub = options.uploadedBytes,\n                mcs = options.maxChunkSize || fs,\n                slice = this._blobSlice,\n                dfd = $.Deferred(),\n                promise = dfd.promise(),\n                jqXHR,\n                upload;\n            if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||\n                    options.data) {\n                return false;\n            }\n            if (testOnly) {\n                return true;\n            }\n            if (ub >= fs) {\n                file.error = options.i18n('uploadedBytes');\n                return this._getXHRPromise(\n                    false,\n                    options.context,\n                    [null, 'error', file.error]\n                );\n            }\n            // The chunk upload method:\n            upload = function () {\n                // Clone the options object for each chunk upload:\n                var o = $.extend({}, options),\n                    currentLoaded = o._progress.loaded;\n                o.blob = slice.call(\n                    file,\n                    ub,\n                    ub + mcs,\n                    file.type\n                );\n                // Store the current chunk size, as the blob itself\n                // will be dereferenced after data processing:\n                o.chunkSize = o.blob.size;\n                // Expose the chunk bytes position range:\n                o.contentRange = 'bytes ' + ub + '-' +\n                    (ub + o.chunkSize - 1) + '/' + fs;\n                // Process the upload data (the blob and potential form data):\n                that._initXHRData(o);\n                // Add progress listeners for this chunk upload:\n                that._initProgressListener(o);\n                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||\n                        that._getXHRPromise(false, o.context))\n                    .done(function (result, textStatus, jqXHR) {\n                        ub = that._getUploadedBytes(jqXHR) ||\n                            (ub + o.chunkSize);\n                        // Create a progress event if no final progress event\n                        // with loaded equaling total has been triggered\n                        // for this chunk:\n                        if (currentLoaded + o.chunkSize - o._progress.loaded) {\n                            that._onProgress($.Event('progress', {\n                                lengthComputable: true,\n                                loaded: ub - o.uploadedBytes,\n                                total: ub - o.uploadedBytes\n                            }), o);\n                        }\n                        options.uploadedBytes = o.uploadedBytes = ub;\n                        o.result = result;\n                        o.textStatus = textStatus;\n                        o.jqXHR = jqXHR;\n                        that._trigger('chunkdone', null, o);\n                        that._trigger('chunkalways', null, o);\n                        if (ub < fs) {\n                            // File upload not yet complete,\n                            // continue with the next chunk:\n                            upload();\n                        } else {\n                            dfd.resolveWith(\n                                o.context,\n                                [result, textStatus, jqXHR]\n                            );\n                        }\n                    })\n                    .fail(function (jqXHR, textStatus, errorThrown) {\n                        o.jqXHR = jqXHR;\n                        o.textStatus = textStatus;\n                        o.errorThrown = errorThrown;\n                        that._trigger('chunkfail', null, o);\n                        that._trigger('chunkalways', null, o);\n                        dfd.rejectWith(\n                            o.context,\n                            [jqXHR, textStatus, errorThrown]\n                        );\n                    });\n            };\n            this._enhancePromise(promise);\n            promise.abort = function () {\n                return jqXHR.abort();\n            };\n            upload();\n            return promise;\n        },\n\n        _beforeSend: function (e, data) {\n            if (this._active === 0) {\n                // the start callback is triggered when an upload starts\n                // and no other uploads are currently running,\n                // equivalent to the global ajaxStart event:\n                this._trigger('start');\n                // Set timer for global bitrate progress calculation:\n                this._bitrateTimer = new this._BitrateTimer();\n                // Reset the global progress values:\n                this._progress.loaded = this._progress.total = 0;\n                this._progress.bitrate = 0;\n            }\n            // Make sure the container objects for the .response() and\n            // .progress() methods on the data object are available\n            // and reset to their initial state:\n            this._initResponseObject(data);\n            this._initProgressObject(data);\n            data._progress.loaded = data.loaded = data.uploadedBytes || 0;\n            data._progress.total = data.total = this._getTotal(data.files) || 1;\n            data._progress.bitrate = data.bitrate = 0;\n            this._active += 1;\n            // Initialize the global progress values:\n            this._progress.loaded += data.loaded;\n            this._progress.total += data.total;\n        },\n\n        _onDone: function (result, textStatus, jqXHR, options) {\n            var total = options._progress.total,\n                response = options._response;\n            if (options._progress.loaded < total) {\n                // Create a progress event if no final progress event\n                // with loaded equaling total has been triggered:\n                this._onProgress($.Event('progress', {\n                    lengthComputable: true,\n                    loaded: total,\n                    total: total\n                }), options);\n            }\n            response.result = options.result = result;\n            response.textStatus = options.textStatus = textStatus;\n            response.jqXHR = options.jqXHR = jqXHR;\n            this._trigger('done', null, options);\n        },\n\n        _onFail: function (jqXHR, textStatus, errorThrown, options) {\n            var response = options._response;\n            if (options.recalculateProgress) {\n                // Remove the failed (error or abort) file upload from\n                // the global progress calculation:\n                this._progress.loaded -= options._progress.loaded;\n                this._progress.total -= options._progress.total;\n            }\n            response.jqXHR = options.jqXHR = jqXHR;\n            response.textStatus = options.textStatus = textStatus;\n            response.errorThrown = options.errorThrown = errorThrown;\n            this._trigger('fail', null, options);\n        },\n\n        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {\n            // jqXHRorResult, textStatus and jqXHRorError are added to the\n            // options object via done and fail callbacks\n            this._trigger('always', null, options);\n        },\n\n        _onSend: function (e, data) {\n            if (!data.submit) {\n                this._addConvenienceMethods(e, data);\n            }\n            var that = this,\n                jqXHR,\n                aborted,\n                slot,\n                pipe,\n                options = that._getAJAXSettings(data),\n                send = function () {\n                    that._sending += 1;\n                    // Set timer for bitrate progress calculation:\n                    options._bitrateTimer = new that._BitrateTimer();\n                    jqXHR = jqXHR || (\n                        ((aborted || that._trigger(\n                            'send',\n                            $.Event('send', {delegatedEvent: e}),\n                            options\n                        ) === false) &&\n                        that._getXHRPromise(false, options.context, aborted)) ||\n                        that._chunkedUpload(options) || $.ajax(options)\n                    ).done(function (result, textStatus, jqXHR) {\n                        that._onDone(result, textStatus, jqXHR, options);\n                    }).fail(function (jqXHR, textStatus, errorThrown) {\n                        that._onFail(jqXHR, textStatus, errorThrown, options);\n                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {\n                        that._onAlways(\n                            jqXHRorResult,\n                            textStatus,\n                            jqXHRorError,\n                            options\n                        );\n                        that._sending -= 1;\n                        that._active -= 1;\n                        if (options.limitConcurrentUploads &&\n                                options.limitConcurrentUploads > that._sending) {\n                            // Start the next queued upload,\n                            // that has not been aborted:\n                            var nextSlot = that._slots.shift();\n                            while (nextSlot) {\n                                if (that._getDeferredState(nextSlot) === 'pending') {\n                                    nextSlot.resolve();\n                                    break;\n                                }\n                                nextSlot = that._slots.shift();\n                            }\n                        }\n                        if (that._active === 0) {\n                            // The stop callback is triggered when all uploads have\n                            // been completed, equivalent to the global ajaxStop event:\n                            that._trigger('stop');\n                        }\n                    });\n                    return jqXHR;\n                };\n            this._beforeSend(e, options);\n            if (this.options.sequentialUploads ||\n                    (this.options.limitConcurrentUploads &&\n                    this.options.limitConcurrentUploads <= this._sending)) {\n                if (this.options.limitConcurrentUploads > 1) {\n                    slot = $.Deferred();\n                    this._slots.push(slot);\n                    pipe = slot.pipe(send);\n                } else {\n                    this._sequence = this._sequence.pipe(send, send);\n                    pipe = this._sequence;\n                }\n                // Return the piped Promise object, enhanced with an abort method,\n                // which is delegated to the jqXHR object of the current upload,\n                // and jqXHR callbacks mapped to the equivalent Promise methods:\n                pipe.abort = function () {\n                    aborted = [undefined, 'abort', 'abort'];\n                    if (!jqXHR) {\n                        if (slot) {\n                            slot.rejectWith(options.context, aborted);\n                        }\n                        return send();\n                    }\n                    return jqXHR.abort();\n                };\n                return this._enhancePromise(pipe);\n            }\n            return send();\n        },\n\n        _onAdd: function (e, data) {\n            var that = this,\n                result = true,\n                options = $.extend({}, this.options, data),\n                files = data.files,\n                filesLength = files.length,\n                limit = options.limitMultiFileUploads,\n                limitSize = options.limitMultiFileUploadSize,\n                overhead = options.limitMultiFileUploadSizeOverhead,\n                batchSize = 0,\n                paramName = this._getParamName(options),\n                paramNameSet,\n                paramNameSlice,\n                fileSet,\n                i,\n                j = 0;\n            if (!filesLength) {\n                return false;\n            }\n            if (limitSize && files[0].size === undefined) {\n                limitSize = undefined;\n            }\n            if (!(options.singleFileUploads || limit || limitSize) ||\n                    !this._isXHRUpload(options)) {\n                fileSet = [files];\n                paramNameSet = [paramName];\n            } else if (!(options.singleFileUploads || limitSize) && limit) {\n                fileSet = [];\n                paramNameSet = [];\n                for (i = 0; i < filesLength; i += limit) {\n                    fileSet.push(files.slice(i, i + limit));\n                    paramNameSlice = paramName.slice(i, i + limit);\n                    if (!paramNameSlice.length) {\n                        paramNameSlice = paramName;\n                    }\n                    paramNameSet.push(paramNameSlice);\n                }\n            } else if (!options.singleFileUploads && limitSize) {\n                fileSet = [];\n                paramNameSet = [];\n                for (i = 0; i < filesLength; i = i + 1) {\n                    batchSize += files[i].size + overhead;\n                    if (i + 1 === filesLength ||\n                            ((batchSize + files[i + 1].size + overhead) > limitSize) ||\n                            (limit && i + 1 - j >= limit)) {\n                        fileSet.push(files.slice(j, i + 1));\n                        paramNameSlice = paramName.slice(j, i + 1);\n                        if (!paramNameSlice.length) {\n                            paramNameSlice = paramName;\n                        }\n                        paramNameSet.push(paramNameSlice);\n                        j = i + 1;\n                        batchSize = 0;\n                    }\n                }\n            } else {\n                paramNameSet = paramName;\n            }\n            data.originalFiles = files;\n            $.each(fileSet || files, function (index, element) {\n                var newData = $.extend({}, data);\n                newData.files = fileSet ? element : [element];\n                newData.paramName = paramNameSet[index];\n                that._initResponseObject(newData);\n                that._initProgressObject(newData);\n                that._addConvenienceMethods(e, newData);\n                result = that._trigger(\n                    'add',\n                    $.Event('add', {delegatedEvent: e}),\n                    newData\n                );\n                return result;\n            });\n            return result;\n        },\n\n        _replaceFileInput: function (data) {\n            var input = data.fileInput,\n                inputClone = input.clone(true);\n            // Add a reference for the new cloned file input to the data argument:\n            data.fileInputClone = inputClone;\n            $('<form></form>').append(inputClone)[0].reset();\n            // Detaching allows to insert the fileInput on another form\n            // without loosing the file input value:\n            input.after(inputClone).detach();\n            // Avoid memory leaks with the detached file input:\n            $.cleanData(input.unbind('remove'));\n            // Replace the original file input element in the fileInput\n            // elements set with the clone, which has been copied including\n            // event handlers:\n            this.options.fileInput = this.options.fileInput.map(function (i, el) {\n                if (el === input[0]) {\n                    return inputClone[0];\n                }\n                return el;\n            });\n            // If the widget has been initialized on the file input itself,\n            // override this.element with the file input clone:\n            if (input[0] === this.element[0]) {\n                this.element = inputClone;\n            }\n        },\n\n        _handleFileTreeEntry: function (entry, path) {\n            var that = this,\n                dfd = $.Deferred(),\n                errorHandler = function (e) {\n                    if (e && !e.entry) {\n                        e.entry = entry;\n                    }\n                    // Since $.when returns immediately if one\n                    // Deferred is rejected, we use resolve instead.\n                    // This allows valid files and invalid items\n                    // to be returned together in one set:\n                    dfd.resolve([e]);\n                },\n                successHandler = function (entries) {\n                    that._handleFileTreeEntries(\n                        entries,\n                        path + entry.name + '/'\n                    ).done(function (files) {\n                        dfd.resolve(files);\n                    }).fail(errorHandler);\n                },\n                readEntries = function () {\n                    dirReader.readEntries(function (results) {\n                        if (!results.length) {\n                            successHandler(entries);\n                        } else {\n                            entries = entries.concat(results);\n                            readEntries();\n                        }\n                    }, errorHandler);\n                },\n                dirReader, entries = [];\n            path = path || '';\n            if (entry.isFile) {\n                if (entry._file) {\n                    // Workaround for Chrome bug #149735\n                    entry._file.relativePath = path;\n                    dfd.resolve(entry._file);\n                } else {\n                    entry.file(function (file) {\n                        file.relativePath = path;\n                        dfd.resolve(file);\n                    }, errorHandler);\n                }\n            } else if (entry.isDirectory) {\n                dirReader = entry.createReader();\n                readEntries();\n            } else {\n                // Return an empy list for file system items\n                // other than files or directories:\n                dfd.resolve([]);\n            }\n            return dfd.promise();\n        },\n\n        _handleFileTreeEntries: function (entries, path) {\n            var that = this;\n            return $.when.apply(\n                $,\n                $.map(entries, function (entry) {\n                    return that._handleFileTreeEntry(entry, path);\n                })\n            ).pipe(function () {\n                return Array.prototype.concat.apply(\n                    [],\n                    arguments\n                );\n            });\n        },\n\n        _getDroppedFiles: function (dataTransfer) {\n            dataTransfer = dataTransfer || {};\n            var items = dataTransfer.items;\n            if (items && items.length && (items[0].webkitGetAsEntry ||\n                    items[0].getAsEntry)) {\n                return this._handleFileTreeEntries(\n                    $.map(items, function (item) {\n                        var entry;\n                        if (item.webkitGetAsEntry) {\n                            entry = item.webkitGetAsEntry();\n                            if (entry) {\n                                // Workaround for Chrome bug #149735:\n                                entry._file = item.getAsFile();\n                            }\n                            return entry;\n                        }\n                        return item.getAsEntry();\n                    })\n                );\n            }\n            return $.Deferred().resolve(\n                $.makeArray(dataTransfer.files)\n            ).promise();\n        },\n\n        _getSingleFileInputFiles: function (fileInput) {\n            fileInput = $(fileInput);\n            var entries = fileInput.prop('webkitEntries') ||\n                    fileInput.prop('entries'),\n                files,\n                value;\n            if (entries && entries.length) {\n                return this._handleFileTreeEntries(entries);\n            }\n            files = $.makeArray(fileInput.prop('files'));\n            if (!files.length) {\n                value = fileInput.prop('value');\n                if (!value) {\n                    return $.Deferred().resolve([]).promise();\n                }\n                // If the files property is not available, the browser does not\n                // support the File API and we add a pseudo File object with\n                // the input value as name with path information removed:\n                files = [{name: value.replace(/^.*\\\\/, '')}];\n            } else if (files[0].name === undefined && files[0].fileName) {\n                // File normalization for Safari 4 and Firefox 3:\n                $.each(files, function (index, file) {\n                    file.name = file.fileName;\n                    file.size = file.fileSize;\n                });\n            }\n            return $.Deferred().resolve(files).promise();\n        },\n\n        _getFileInputFiles: function (fileInput) {\n            if (!(fileInput instanceof $) || fileInput.length === 1) {\n                return this._getSingleFileInputFiles(fileInput);\n            }\n            return $.when.apply(\n                $,\n                $.map(fileInput, this._getSingleFileInputFiles)\n            ).pipe(function () {\n                return Array.prototype.concat.apply(\n                    [],\n                    arguments\n                );\n            });\n        },\n\n        _onChange: function (e) {\n            var that = this,\n                data = {\n                    fileInput: $(e.target),\n                    form: $(e.target.form)\n                };\n            this._getFileInputFiles(data.fileInput).always(function (files) {\n                data.files = files;\n                if (that.options.replaceFileInput) {\n                    that._replaceFileInput(data);\n                }\n                if (that._trigger(\n                        'change',\n                        $.Event('change', {delegatedEvent: e}),\n                        data\n                    ) !== false) {\n                    that._onAdd(e, data);\n                }\n            });\n        },\n\n        _onPaste: function (e) {\n            var items = e.originalEvent && e.originalEvent.clipboardData &&\n                    e.originalEvent.clipboardData.items,\n                data = {files: []};\n            if (items && items.length) {\n                $.each(items, function (index, item) {\n                    var file = item.getAsFile && item.getAsFile();\n                    if (file) {\n                        data.files.push(file);\n                    }\n                });\n                if (this._trigger(\n                        'paste',\n                        $.Event('paste', {delegatedEvent: e}),\n                        data\n                    ) !== false) {\n                    this._onAdd(e, data);\n                }\n            }\n        },\n\n        _onDrop: function (e) {\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n            var that = this,\n                dataTransfer = e.dataTransfer,\n                data = {};\n            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n                e.preventDefault();\n                this._getDroppedFiles(dataTransfer).always(function (files) {\n                    data.files = files;\n                    if (that._trigger(\n                            'drop',\n                            $.Event('drop', {delegatedEvent: e}),\n                            data\n                        ) !== false) {\n                        that._onAdd(e, data);\n                    }\n                });\n            }\n        },\n\n        _onDragOver: getDragHandler('dragover'),\n\n        _onDragEnter: getDragHandler('dragenter'),\n\n        _onDragLeave: getDragHandler('dragleave'),\n\n        _initEventHandlers: function () {\n            if (this._isXHRUpload(this.options)) {\n                this._on(this.options.dropZone, {\n                    dragover: this._onDragOver,\n                    drop: this._onDrop,\n                    // event.preventDefault() on dragenter is required for IE10+:\n                    dragenter: this._onDragEnter,\n                    // dragleave is not required, but added for completeness:\n                    dragleave: this._onDragLeave\n                });\n                this._on(this.options.pasteZone, {\n                    paste: this._onPaste\n                });\n            }\n            if ($.support.fileInput) {\n                this._on(this.options.fileInput, {\n                    change: this._onChange\n                });\n            }\n        },\n\n        _destroyEventHandlers: function () {\n            this._off(this.options.dropZone, 'dragenter dragleave dragover drop');\n            this._off(this.options.pasteZone, 'paste');\n            this._off(this.options.fileInput, 'change');\n        },\n\n        _setOption: function (key, value) {\n            var reinit = $.inArray(key, this._specialOptions) !== -1;\n            if (reinit) {\n                this._destroyEventHandlers();\n            }\n            this._super(key, value);\n            if (reinit) {\n                this._initSpecialOptions();\n                this._initEventHandlers();\n            }\n        },\n\n        _initSpecialOptions: function () {\n            var options = this.options;\n            if (options.fileInput === undefined) {\n                options.fileInput = this.element.is('input[type=\"file\"]') ?\n                        this.element : this.element.find('input[type=\"file\"]');\n            } else if (!(options.fileInput instanceof $)) {\n                options.fileInput = $(options.fileInput);\n            }\n            if (!(options.dropZone instanceof $)) {\n                options.dropZone = $(options.dropZone);\n            }\n            if (!(options.pasteZone instanceof $)) {\n                options.pasteZone = $(options.pasteZone);\n            }\n        },\n\n        _getRegExp: function (str) {\n            var parts = str.split('/'),\n                modifiers = parts.pop();\n            parts.shift();\n            return new RegExp(parts.join('/'), modifiers);\n        },\n\n        _isRegExpOption: function (key, value) {\n            return key !== 'url' && $.type(value) === 'string' &&\n                /^\\/.*\\/[igm]{0,3}$/.test(value);\n        },\n\n        _initDataAttributes: function () {\n            var that = this,\n                options = this.options,\n                data = this.element.data();\n            // Initialize options set via HTML5 data-attributes:\n            $.each(\n                this.element[0].attributes,\n                function (index, attr) {\n                    var key = attr.name.toLowerCase(),\n                        value;\n                    if (/^data-/.test(key)) {\n                        // Convert hyphen-ated key to camelCase:\n                        key = key.slice(5).replace(/-[a-z]/g, function (str) {\n                            return str.charAt(1).toUpperCase();\n                        });\n                        value = data[key];\n                        if (that._isRegExpOption(key, value)) {\n                            value = that._getRegExp(value);\n                        }\n                        options[key] = value;\n                    }\n                }\n            );\n        },\n\n        _create: function () {\n            this._initDataAttributes();\n            this._initSpecialOptions();\n            this._slots = [];\n            this._sequence = this._getXHRPromise(true);\n            this._sending = this._active = 0;\n            this._initProgressObject(this);\n            this._initEventHandlers();\n        },\n\n        // This method is exposed to the widget API and allows to query\n        // the number of active uploads:\n        active: function () {\n            return this._active;\n        },\n\n        // This method is exposed to the widget API and allows to query\n        // the widget upload progress.\n        // It returns an object with loaded, total and bitrate properties\n        // for the running uploads:\n        progress: function () {\n            return this._progress;\n        },\n\n        // This method is exposed to the widget API and allows adding files\n        // using the fileupload API. The data parameter accepts an object which\n        // must have a files property and can contain additional options:\n        // .fileupload('add', {files: filesList});\n        add: function (data) {\n            var that = this;\n            if (!data || this.options.disabled) {\n                return;\n            }\n            if (data.fileInput && !data.files) {\n                this._getFileInputFiles(data.fileInput).always(function (files) {\n                    data.files = files;\n                    that._onAdd(null, data);\n                });\n            } else {\n                data.files = $.makeArray(data.files);\n                this._onAdd(null, data);\n            }\n        },\n\n        // This method is exposed to the widget API and allows sending files\n        // using the fileupload API. The data parameter accepts an object which\n        // must have a files or fileInput property and can contain additional options:\n        // .fileupload('send', {files: filesList});\n        // The method returns a Promise object for the file upload call.\n        send: function (data) {\n            if (data && !this.options.disabled) {\n                if (data.fileInput && !data.files) {\n                    var that = this,\n                        dfd = $.Deferred(),\n                        promise = dfd.promise(),\n                        jqXHR,\n                        aborted;\n                    promise.abort = function () {\n                        aborted = true;\n                        if (jqXHR) {\n                            return jqXHR.abort();\n                        }\n                        dfd.reject(null, 'abort', 'abort');\n                        return promise;\n                    };\n                    this._getFileInputFiles(data.fileInput).always(\n                        function (files) {\n                            if (aborted) {\n                                return;\n                            }\n                            if (!files.length) {\n                                dfd.reject();\n                                return;\n                            }\n                            data.files = files;\n                            jqXHR = that._onSend(null, data);\n                            jqXHR.then(\n                                function (result, textStatus, jqXHR) {\n                                    dfd.resolve(result, textStatus, jqXHR);\n                                },\n                                function (jqXHR, textStatus, errorThrown) {\n                                    dfd.reject(jqXHR, textStatus, errorThrown);\n                                }\n                            );\n                        }\n                    );\n                    return this._enhancePromise(promise);\n                }\n                data.files = $.makeArray(data.files);\n                if (data.files.length) {\n                    return this._onSend(null, data);\n                }\n            }\n            return this._getXHRPromise(false, data && data.context);\n        }\n\n    });\n\n}));\n","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under the MIT license\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  'use strict';\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.6\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.6\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.6'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.6\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.6'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state += 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked')) changed = false\n        $parent.find('.active').removeClass('active')\n        this.$element.addClass('active')\n      } else if ($input.prop('type') == 'checkbox') {\n        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n        this.$element.toggleClass('active')\n      }\n      $input.prop('checked', this.$element.hasClass('active'))\n      if (changed) $input.trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n      this.$element.toggleClass('active')\n    }\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      Plugin.call($btn, 'toggle')\n      if (!($(e.target).is('input[type=\"radio\"]') || $(e.target).is('input[type=\"checkbox\"]'))) e.preventDefault()\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.6\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      = null\n    this.sliding     = null\n    this.interval    = null\n    this.$active     = null\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.6'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var activeIndex = this.getItemIndex(active)\n    var willWrap = (direction == 'prev' && activeIndex === 0)\n                || (direction == 'next' && activeIndex == (this.$items.length - 1))\n    if (willWrap && !this.options.wrap) return active\n    var delta = direction == 'prev' ? -1 : 1\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var that      = this\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.6\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n                           '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.6'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.6\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.6'\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n    })\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $(document.createElement('div'))\n          .addClass('dropdown-backdrop')\n          .insertAfter($(this))\n          .on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger($.Event('shown.bs.dropdown', relatedTarget))\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive && e.which != 27 || isActive && e.which == 27) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.disabled):visible a'\n    var $items = $parent.find('.dropdown-menu' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--         // up\n    if (e.which == 40 && index < $items.length - 1) index++         // down\n    if (!~index)                                    index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.6\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options             = options\n    this.$body               = $(document.body)\n    this.$element            = $(element)\n    this.$dialog             = this.$element.find('.modal-dialog')\n    this.$backdrop           = null\n    this.isShown             = null\n    this.originalBodyPad     = null\n    this.scrollbarWidth      = 0\n    this.ignoreBackdropClick = false\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.6'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n      that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n      })\n    })\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element.addClass('in')\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$dialog // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .off('click.dismiss.bs.modal')\n      .off('mouseup.dismiss.bs.modal')\n\n    this.$dialog.off('mousedown.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $(document.createElement('div'))\n        .addClass('modal-backdrop ' + animate)\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (this.ignoreBackdropClick) {\n          this.ignoreBackdropClick = false\n          return\n        }\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus()\n          : this.hide()\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    var fullWindowWidth = window.innerWidth\n    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n      var documentElementRect = document.documentElement.getBoundingClientRect()\n      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n    }\n    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    this.originalBodyPad = document.body.style.paddingRight || ''\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', this.originalBodyPad)\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.6\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       = null\n    this.options    = null\n    this.enabled    = null\n    this.timeout    = null\n    this.hoverState = null\n    this.$element   = null\n    this.inState    = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.6'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n    this.inState   = { click: false, hover: false, focus: false }\n\n    if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n    }\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n    }\n\n    if (self.tip().hasClass('in') || self.hoverState == 'in') {\n      self.hoverState = 'in'\n      return\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.isInStateTrue = function () {\n    for (var key in this.inState) {\n      if (this.inState[key]) return true\n    }\n\n    return false\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n    }\n\n    if (self.isInStateTrue()) return\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n      this.$element.trigger('inserted.bs.' + this.type)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var viewportDim = this.getPosition(this.$viewport)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  += marginTop\n    offset.left += marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n    this.arrow()\n      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isVertical ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = $(this.$tip)\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element\n        .removeAttr('aria-describedby')\n        .trigger('hidden.bs.' + that.type)\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && $tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    if (!this.$tip) {\n      this.$tip = $(this.options.template)\n      if (this.$tip.length != 1) {\n        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n      }\n    }\n    return this.$tip\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    if (e) {\n      self.inState.click = !self.inState.click\n      if (self.isInStateTrue()) self.enter(self)\n      else self.leave(self)\n    } else {\n      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n    }\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n      if (that.$tip) {\n        that.$tip.detach()\n      }\n      that.$tip = null\n      that.$arrow = null\n      that.$viewport = null\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.6\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.6'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.6\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    this.$body          = $(document.body)\n    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.6'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var that          = this\n    var offsetMethod  = 'offset'\n    var offsetBase    = 0\n\n    this.offsets      = []\n    this.targets      = []\n    this.scrollHeight = this.getScrollHeight()\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        that.offsets.push(this[0])\n        that.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n      '[data-target=\"' + target + '\"],' +\n      this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.6\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    // jscs:disable requireDollarBeforejQueryAssignment\n    this.element = $(element)\n    // jscs:enable requireDollarBeforejQueryAssignment\n  }\n\n  Tab.VERSION = '3.3.6'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu').length) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.6\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      = null\n    this.unpin        = null\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.6'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n",";(function () {\n\t'use strict';\n\n\t/**\n\t * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n\t *\n\t * @codingstandard ftlabs-jsv2\n\t * @copyright The Financial Times Limited [All Rights Reserved]\n\t * @license MIT License (see LICENSE.txt)\n\t */\n\n\t/*jslint browser:true, node:true*/\n\t/*global define, Event, Node*/\n\n\n\t/**\n\t * Instantiate fast-clicking listeners on the specified layer.\n\t *\n\t * @constructor\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tfunction FastClick(layer, options) {\n\t\tvar oldOnClick;\n\n\t\toptions = options || {};\n\n\t\t/**\n\t\t * Whether a click is currently being tracked.\n\t\t *\n\t\t * @type boolean\n\t\t */\n\t\tthis.trackingClick = false;\n\n\n\t\t/**\n\t\t * Timestamp for when click tracking started.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.trackingClickStart = 0;\n\n\n\t\t/**\n\t\t * The element being tracked for a click.\n\t\t *\n\t\t * @type EventTarget\n\t\t */\n\t\tthis.targetElement = null;\n\n\n\t\t/**\n\t\t * X-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartX = 0;\n\n\n\t\t/**\n\t\t * Y-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartY = 0;\n\n\n\t\t/**\n\t\t * ID of the last touch, retrieved from Touch.identifier.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.lastTouchIdentifier = 0;\n\n\n\t\t/**\n\t\t * Touchmove boundary, beyond which a click will be cancelled.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchBoundary = options.touchBoundary || 10;\n\n\n\t\t/**\n\t\t * The FastClick layer.\n\t\t *\n\t\t * @type Element\n\t\t */\n\t\tthis.layer = layer;\n\n\t\t/**\n\t\t * The minimum time between tap(touchstart and touchend) events\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapDelay = options.tapDelay || 200;\n\n\t\t/**\n\t\t * The maximum time for a tap\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapTimeout = options.tapTimeout || 700;\n\n\t\tif (FastClick.notNeeded(layer)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Some old versions of Android don't have Function.prototype.bind\n\t\tfunction bind(method, context) {\n\t\t\treturn function() { return method.apply(context, arguments); };\n\t\t}\n\n\n\t\tvar methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];\n\t\tvar context = this;\n\t\tfor (var i = 0, l = methods.length; i < l; i++) {\n\t\t\tcontext[methods[i]] = bind(context[methods[i]], context);\n\t\t}\n\n\t\t// Set up event handlers as required\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.addEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.addEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.addEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.addEventListener('click', this.onClick, true);\n\t\tlayer.addEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.addEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.addEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.addEventListener('touchcancel', this.onTouchCancel, false);\n\n\t\t// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick\n\t\t// layer when they are cancelled.\n\t\tif (!Event.prototype.stopImmediatePropagation) {\n\t\t\tlayer.removeEventListener = function(type, callback, capture) {\n\t\t\t\tvar rmv = Node.prototype.removeEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\trmv.call(layer, type, callback.hijacked || callback, capture);\n\t\t\t\t} else {\n\t\t\t\t\trmv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlayer.addEventListener = function(type, callback, capture) {\n\t\t\t\tvar adv = Node.prototype.addEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\tadv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {\n\t\t\t\t\t\tif (!event.propagationStopped) {\n\t\t\t\t\t\t\tcallback(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t}), capture);\n\t\t\t\t} else {\n\t\t\t\t\tadv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// If a handler is already declared in the element's onclick attribute, it will be fired before\n\t\t// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and\n\t\t// adding it as listener.\n\t\tif (typeof layer.onclick === 'function') {\n\n\t\t\t// Android browser on at least 3.2 requires a new reference to the function in layer.onclick\n\t\t\t// - the old one won't work if passed to addEventListener directly.\n\t\t\toldOnClick = layer.onclick;\n\t\t\tlayer.addEventListener('click', function(event) {\n\t\t\t\toldOnClick(event);\n\t\t\t}, false);\n\t\t\tlayer.onclick = null;\n\t\t}\n\t}\n\n\t/**\n\t* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.\n\t*\n\t* @type boolean\n\t*/\n\tvar deviceIsWindowsPhone = navigator.userAgent.indexOf(\"Windows Phone\") >= 0;\n\n\t/**\n\t * Android requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS 4 requires an exception for select elements.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS4 = deviceIsIOS && (/OS 4_\\d(_\\d)?/).test(navigator.userAgent);\n\n\n\t/**\n\t * iOS 6.0-7.* requires the target element to be manually derived\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\\d/).test(navigator.userAgent);\n\n\t/**\n\t * BlackBerry requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;\n\n\t/**\n\t * Determine whether a given element requires a native click.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element needs a native click\n\t */\n\tFastClick.prototype.needsClick = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\n\t\t// Don't send a synthetic click to disabled inputs (issue #62)\n\t\tcase 'button':\n\t\tcase 'select':\n\t\tcase 'textarea':\n\t\t\tif (target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'input':\n\n\t\t\t// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)\n\t\t\tif ((deviceIsIOS && target.type === 'file') || target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'label':\n\t\tcase 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames\n\t\tcase 'video':\n\t\t\treturn true;\n\t\t}\n\n\t\treturn (/\\bneedsclick\\b/).test(target.className);\n\t};\n\n\n\t/**\n\t * Determine whether a given element requires a call to focus to simulate click into element.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.\n\t */\n\tFastClick.prototype.needsFocus = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\t\tcase 'textarea':\n\t\t\treturn true;\n\t\tcase 'select':\n\t\t\treturn !deviceIsAndroid;\n\t\tcase 'input':\n\t\t\tswitch (target.type) {\n\t\t\tcase 'button':\n\t\t\tcase 'checkbox':\n\t\t\tcase 'file':\n\t\t\tcase 'image':\n\t\t\tcase 'radio':\n\t\t\tcase 'submit':\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// No point in attempting to focus disabled inputs\n\t\t\treturn !target.disabled && !target.readOnly;\n\t\tdefault:\n\t\t\treturn (/\\bneedsfocus\\b/).test(target.className);\n\t\t}\n\t};\n\n\n\t/**\n\t * Send a click event to the specified element.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t * @param {Event} event\n\t */\n\tFastClick.prototype.sendClick = function(targetElement, event) {\n\t\tvar clickEvent, touch;\n\n\t\t// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)\n\t\tif (document.activeElement && document.activeElement !== targetElement) {\n\t\t\tdocument.activeElement.blur();\n\t\t}\n\n\t\ttouch = event.changedTouches[0];\n\n\t\t// Synthesise a click event, with an extra attribute so it can be tracked\n\t\tclickEvent = document.createEvent('MouseEvents');\n\t\tclickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\n\t\tclickEvent.forwardedTouchEvent = true;\n\t\ttargetElement.dispatchEvent(clickEvent);\n\t};\n\n\tFastClick.prototype.determineEventType = function(targetElement) {\n\n\t\t//Issue #159: Android Chrome Select Box does not open with a synthetic click event\n\t\tif (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {\n\t\t\treturn 'mousedown';\n\t\t}\n\n\t\treturn 'click';\n\t};\n\n\n\t/**\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.focus = function(targetElement) {\n\t\tvar length;\n\n\t\t// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.\n\t\tif (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {\n\t\t\tlength = targetElement.value.length;\n\t\t\ttargetElement.setSelectionRange(length, length);\n\t\t} else {\n\t\t\ttargetElement.focus();\n\t\t}\n\t};\n\n\n\t/**\n\t * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.updateScrollParent = function(targetElement) {\n\t\tvar scrollParent, parentElement;\n\n\t\tscrollParent = targetElement.fastClickScrollParent;\n\n\t\t// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the\n\t\t// target element was moved to another parent.\n\t\tif (!scrollParent || !scrollParent.contains(targetElement)) {\n\t\t\tparentElement = targetElement;\n\t\t\tdo {\n\t\t\t\tif (parentElement.scrollHeight > parentElement.offsetHeight) {\n\t\t\t\t\tscrollParent = parentElement;\n\t\t\t\t\ttargetElement.fastClickScrollParent = parentElement;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tparentElement = parentElement.parentElement;\n\t\t\t} while (parentElement);\n\t\t}\n\n\t\t// Always update the scroll top tracker if possible.\n\t\tif (scrollParent) {\n\t\t\tscrollParent.fastClickLastScrollTop = scrollParent.scrollTop;\n\t\t}\n\t};\n\n\n\t/**\n\t * @param {EventTarget} targetElement\n\t * @returns {Element|EventTarget}\n\t */\n\tFastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {\n\n\t\t// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.\n\t\tif (eventTarget.nodeType === Node.TEXT_NODE) {\n\t\t\treturn eventTarget.parentNode;\n\t\t}\n\n\t\treturn eventTarget;\n\t};\n\n\n\t/**\n\t * On touch start, record the position and scroll offset.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchStart = function(event) {\n\t\tvar targetElement, touch, selection;\n\n\t\t// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).\n\t\tif (event.targetTouches.length > 1) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttargetElement = this.getTargetElementFromEventTarget(event.target);\n\t\ttouch = event.targetTouches[0];\n\n\t\tif (deviceIsIOS) {\n\n\t\t\t// Only trusted events will deselect text on iOS (issue #49)\n\t\t\tselection = window.getSelection();\n\t\t\tif (selection.rangeCount && !selection.isCollapsed) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!deviceIsIOS4) {\n\n\t\t\t\t// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):\n\t\t\t\t// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched\n\t\t\t\t// with the same identifier as the touch event that previously triggered the click that triggered the alert.\n\t\t\t\t// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an\n\t\t\t\t// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.\n\t\t\t\t// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,\n\t\t\t\t// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,\n\t\t\t\t// random integers, it's safe to to continue if the identifier is 0 here.\n\t\t\t\tif (touch.identifier && touch.identifier === this.lastTouchIdentifier) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.lastTouchIdentifier = touch.identifier;\n\n\t\t\t\t// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:\n\t\t\t\t// 1) the user does a fling scroll on the scrollable layer\n\t\t\t\t// 2) the user stops the fling scroll with another tap\n\t\t\t\t// then the event.target of the last 'touchend' event will be the element that was under the user's finger\n\t\t\t\t// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check\n\t\t\t\t// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).\n\t\t\t\tthis.updateScrollParent(targetElement);\n\t\t\t}\n\t\t}\n\n\t\tthis.trackingClick = true;\n\t\tthis.trackingClickStart = event.timeStamp;\n\t\tthis.targetElement = targetElement;\n\n\t\tthis.touchStartX = touch.pageX;\n\t\tthis.touchStartY = touch.pageY;\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.touchHasMoved = function(event) {\n\t\tvar touch = event.changedTouches[0], boundary = this.touchBoundary;\n\n\t\tif (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Update the last position.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchMove = function(event) {\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If the touch has moved, cancel the click tracking\n\t\tif (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {\n\t\t\tthis.trackingClick = false;\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Attempt to find the labelled control for the given label element.\n\t *\n\t * @param {EventTarget|HTMLLabelElement} labelElement\n\t * @returns {Element|null}\n\t */\n\tFastClick.prototype.findControl = function(labelElement) {\n\n\t\t// Fast path for newer browsers supporting the HTML5 control attribute\n\t\tif (labelElement.control !== undefined) {\n\t\t\treturn labelElement.control;\n\t\t}\n\n\t\t// All browsers under test that support touch events also support the HTML5 htmlFor attribute\n\t\tif (labelElement.htmlFor) {\n\t\t\treturn document.getElementById(labelElement.htmlFor);\n\t\t}\n\n\t\t// If no for attribute exists, attempt to retrieve the first labellable descendant element\n\t\t// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label\n\t\treturn labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');\n\t};\n\n\n\t/**\n\t * On touch end, determine whether to send a click event at once.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchEnd = function(event) {\n\t\tvar forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;\n\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tthis.cancelNextClick = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Reset to prevent wrong click cancel on input (issue #156).\n\t\tthis.cancelNextClick = false;\n\n\t\tthis.lastClickTime = event.timeStamp;\n\n\t\ttrackingClickStart = this.trackingClickStart;\n\t\tthis.trackingClick = false;\n\t\tthis.trackingClickStart = 0;\n\n\t\t// On some iOS devices, the targetElement supplied with the event is invalid if the layer\n\t\t// is performing a transition or scroll, and has to be re-detected manually. Note that\n\t\t// for this to function correctly, it must be called *after* the event target is checked!\n\t\t// See issue #57; also filed as rdar://13048589 .\n\t\tif (deviceIsIOSWithBadTarget) {\n\t\t\ttouch = event.changedTouches[0];\n\n\t\t\t// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null\n\t\t\ttargetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;\n\t\t\ttargetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;\n\t\t}\n\n\t\ttargetTagName = targetElement.tagName.toLowerCase();\n\t\tif (targetTagName === 'label') {\n\t\t\tforElement = this.findControl(targetElement);\n\t\t\tif (forElement) {\n\t\t\t\tthis.focus(targetElement);\n\t\t\t\tif (deviceIsAndroid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\ttargetElement = forElement;\n\t\t\t}\n\t\t} else if (this.needsFocus(targetElement)) {\n\n\t\t\t// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.\n\t\t\t// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).\n\t\t\tif ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.focus(targetElement);\n\t\t\tthis.sendClick(targetElement, event);\n\n\t\t\t// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.\n\t\t\t// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)\n\t\t\tif (!deviceIsIOS || targetTagName !== 'select') {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif (deviceIsIOS && !deviceIsIOS4) {\n\n\t\t\t// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled\n\t\t\t// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).\n\t\t\tscrollParent = targetElement.fastClickScrollParent;\n\t\t\tif (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Prevent the actual click from going though - unless the target node is marked as requiring\n\t\t// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.\n\t\tif (!this.needsClick(targetElement)) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.sendClick(targetElement, event);\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * On touch cancel, stop tracking the click.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.onTouchCancel = function() {\n\t\tthis.trackingClick = false;\n\t\tthis.targetElement = null;\n\t};\n\n\n\t/**\n\t * Determine mouse events which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onMouse = function(event) {\n\n\t\t// If a target element was never set (because a touch event was never fired) allow the event\n\t\tif (!this.targetElement) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (event.forwardedTouchEvent) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Programmatically generated events targeting a specific element should be permitted\n\t\tif (!event.cancelable) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Derive and check the target element to see whether the mouse event needs to be permitted;\n\t\t// unless explicitly enabled, prevent non-touch click events from triggering actions,\n\t\t// to prevent ghost/doubleclicks.\n\t\tif (!this.needsClick(this.targetElement) || this.cancelNextClick) {\n\n\t\t\t// Prevent any user-added listeners declared on FastClick element from being fired.\n\t\t\tif (event.stopImmediatePropagation) {\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t} else {\n\n\t\t\t\t// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t\t\tevent.propagationStopped = true;\n\t\t\t}\n\n\t\t\t// Cancel the event\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the mouse event is permitted, return true for the action to go through.\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * On actual clicks, determine whether this is a touch-generated click, a click action occurring\n\t * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or\n\t * an actual click which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onClick = function(event) {\n\t\tvar permitted;\n\n\t\t// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.\n\t\tif (this.trackingClick) {\n\t\t\tthis.targetElement = null;\n\t\t\tthis.trackingClick = false;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.\n\t\tif (event.target.type === 'submit' && event.detail === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tpermitted = this.onMouse(event);\n\n\t\t// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.\n\t\tif (!permitted) {\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\t// If clicks are permitted, return true for the action to go through.\n\t\treturn permitted;\n\t};\n\n\n\t/**\n\t * Remove all FastClick's event listeners.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.destroy = function() {\n\t\tvar layer = this.layer;\n\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.removeEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.removeEventListener('click', this.onClick, true);\n\t\tlayer.removeEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.removeEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.removeEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.removeEventListener('touchcancel', this.onTouchCancel, false);\n\t};\n\n\n\t/**\n\t * Check whether FastClick is needed.\n\t *\n\t * @param {Element} layer The layer to listen on\n\t */\n\tFastClick.notNeeded = function(layer) {\n\t\tvar metaViewport;\n\t\tvar chromeVersion;\n\t\tvar blackberryVersion;\n\t\tvar firefoxVersion;\n\n\t\t// Devices that don't support touch don't need FastClick\n\t\tif (typeof window.ontouchstart === 'undefined') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Chrome version - zero for other browsers\n\t\tchromeVersion = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (chromeVersion) {\n\n\t\t\tif (deviceIsAndroid) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// Chrome on Android with user-scalable=\"no\" doesn't need FastClick (issue #89)\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// Chrome 32 and above with width=device-width or less don't need FastClick\n\t\t\t\t\tif (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Chrome desktop doesn't need FastClick (issue #15)\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (deviceIsBlackBerry10) {\n\t\t\tblackberryVersion = navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/);\n\n\t\t\t// BlackBerry 10.3+ does not require Fastclick library.\n\t\t\t// https://github.com/ftlabs/fastclick/issues/251\n\t\t\tif (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// user-scalable=no eliminates click delay.\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// width=device-width (or less than device-width) eliminates click delay.\n\t\t\t\t\tif (document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)\n\t\tif (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Firefox version - zero for other browsers\n\t\tfirefoxVersion = +(/Firefox\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (firefoxVersion >= 27) {\n\t\t\t// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896\n\n\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\t\t\tif (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version\n\t\t// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx\n\t\tif (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Factory method for creating a FastClick object\n\t *\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tFastClick.attach = function(layer, options) {\n\t\treturn new FastClick(layer, options);\n\t};\n\n\n\tif (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine(function() {\n\t\t\treturn FastClick;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = FastClick.attach;\n\t\tmodule.exports.FastClick = FastClick;\n\t} else {\n\t\twindow.FastClick = FastClick;\n\t}\n}());\n","/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.3\n *\n */\n(function ($) {\n\n  $.fn.extend({\n    slimScroll: function (options) {\n\n      var defaults = {\n        // width in pixels of the visible scroll area\n        width: 'auto',\n        // height in pixels of the visible scroll area\n        height: '250px',\n        // width in pixels of the scrollbar and rail\n        size: '7px',\n        // scrollbar color, accepts any hex/color value\n        color: '#000',\n        // scrollbar position - left/right\n        position: 'right',\n        // distance in pixels between the side edge and the scrollbar\n        distance: '1px',\n        // default scroll position on load - top / bottom / $('selector')\n        start: 'top',\n        // sets scrollbar opacity\n        opacity: .4,\n        // enables always-on mode for the scrollbar\n        alwaysVisible: false,\n        // check if we should hide the scrollbar when user is hovering over\n        disableFadeOut: false,\n        // sets visibility of the rail\n        railVisible: false,\n        // sets rail color\n        railColor: '#333',\n        // sets rail opacity\n        railOpacity: .2,\n        // whether  we should use jQuery UI Draggable to enable bar dragging\n        railDraggable: true,\n        // defautlt CSS class of the slimscroll rail\n        railClass: 'slimScrollRail',\n        // defautlt CSS class of the slimscroll bar\n        barClass: 'slimScrollBar',\n        // defautlt CSS class of the slimscroll wrapper\n        wrapperClass: 'slimScrollDiv',\n        // check if mousewheel should scroll the window if we reach top/bottom\n        allowPageScroll: false,\n        // scroll amount applied to each mouse wheel step\n        wheelStep: 20,\n        // scroll amount applied when user is using gestures\n        touchScrollStep: 200,\n        // sets border radius\n        borderRadius: '7px',\n        // sets border radius of the rail\n        railBorderRadius: '7px'\n      };\n\n      var o = $.extend(defaults, options);\n\n      // do it for every element that matches selector\n      this.each(function () {\n\n        var isOverPanel, isOverBar, isDragg, queueHide, touchDif,\n                barHeight, percentScroll, lastScroll,\n                divS = '<div></div>',\n                minBarHeight = 30,\n                releaseScroll = false;\n\n        // used in event handlers and for better minification\n        var me = $(this);\n\n        // ensure we are not binding it again\n        if (me.parent().hasClass(o.wrapperClass))\n        {\n          // start from last bar position\n          var offset = me.scrollTop();\n\n          // find bar and rail\n          bar = me.parent().find('.' + o.barClass);\n          rail = me.parent().find('.' + o.railClass);\n\n          getBarHeight();\n\n          // check if we should scroll existing instance\n          if ($.isPlainObject(options))\n          {\n            // Pass height: auto to an existing slimscroll object to force a resize after contents have changed\n            if ('height' in options && options.height == 'auto') {\n              me.parent().css('height', 'auto');\n              me.css('height', 'auto');\n              var height = me.parent().parent().height();\n              me.parent().css('height', height);\n              me.css('height', height);\n            }\n\n            if ('scrollTo' in options)\n            {\n              // jump to a static point\n              offset = parseInt(o.scrollTo);\n            }\n            else if ('scrollBy' in options)\n            {\n              // jump by value pixels\n              offset += parseInt(o.scrollBy);\n            }\n            else if ('destroy' in options)\n            {\n              // remove slimscroll elements\n              bar.remove();\n              rail.remove();\n              me.unwrap();\n              return;\n            }\n\n            // scroll content by the given offset\n            scrollContent(offset, false, true);\n          }\n\n          return;\n        }\n        else if ($.isPlainObject(options))\n        {\n          if ('destroy' in options)\n          {\n            return;\n          }\n        }\n\n        // optionally set height to the parent's height\n        o.height = (o.height == 'auto') ? me.parent().height() : o.height;\n\n        // wrap content\n        var wrapper = $(divS)\n                .addClass(o.wrapperClass)\n                .css({\n                  position: 'relative',\n                  overflow: 'hidden',\n                  width: o.width,\n                  height: o.height\n                });\n\n        // update style for the div\n        me.css({\n          overflow: 'hidden',\n          width: o.width,\n          height: o.height,\n          //Fix for IE10\n          \"-ms-touch-action\": \"none\"\n        });\n\n        // create scrollbar rail\n        var rail = $(divS)\n                .addClass(o.railClass)\n                .css({\n                  width: o.size,\n                  height: '100%',\n                  position: 'absolute',\n                  top: 0,\n                  display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',\n                  'border-radius': o.railBorderRadius,\n                  background: o.railColor,\n                  opacity: o.railOpacity,\n                  zIndex: 90\n                });\n\n        // create scrollbar\n        var bar = $(divS)\n                .addClass(o.barClass)\n                .css({\n                  background: o.color,\n                  width: o.size,\n                  position: 'absolute',\n                  top: 0,\n                  opacity: o.opacity,\n                  display: o.alwaysVisible ? 'block' : 'none',\n                  'border-radius': o.borderRadius,\n                  BorderRadius: o.borderRadius,\n                  MozBorderRadius: o.borderRadius,\n                  WebkitBorderRadius: o.borderRadius,\n                  zIndex: 99\n                });\n\n        // set position\n        var posCss = (o.position == 'right') ? {right: o.distance} : {left: o.distance};\n        rail.css(posCss);\n        bar.css(posCss);\n\n        // wrap it\n        me.wrap(wrapper);\n\n        // append to parent div\n        me.parent().append(bar);\n        me.parent().append(rail);\n\n        // make it draggable and no longer dependent on the jqueryUI\n        if (o.railDraggable) {\n          bar.bind(\"mousedown\", function (e) {\n            var $doc = $(document);\n            isDragg = true;\n            t = parseFloat(bar.css('top'));\n            pageY = e.pageY;\n\n            $doc.bind(\"mousemove.slimscroll\", function (e) {\n              currTop = t + e.pageY - pageY;\n              bar.css('top', currTop);\n              scrollContent(0, bar.position().top, false);// scroll content\n            });\n\n            $doc.bind(\"mouseup.slimscroll\", function (e) {\n              isDragg = false;\n              hideBar();\n              $doc.unbind('.slimscroll');\n            });\n            return false;\n          }).bind(\"selectstart.slimscroll\", function (e) {\n            e.stopPropagation();\n            e.preventDefault();\n            return false;\n          });\n        }\n\n        // on rail over\n        rail.hover(function () {\n          showBar();\n        }, function () {\n          hideBar();\n        });\n\n        // on bar over\n        bar.hover(function () {\n          isOverBar = true;\n        }, function () {\n          isOverBar = false;\n        });\n\n        // show on parent mouseover\n        me.hover(function () {\n          isOverPanel = true;\n          showBar();\n          hideBar();\n        }, function () {\n          isOverPanel = false;\n          hideBar();\n        });\n\n        if (window.navigator.msPointerEnabled) {          \n          // support for mobile\n          me.bind('MSPointerDown', function (e, b) {\n            if (e.originalEvent.targetTouches.length)\n            {\n              // record where touch started\n              touchDif = e.originalEvent.targetTouches[0].pageY;\n            }\n          });\n\n          me.bind('MSPointerMove', function (e) {\n            // prevent scrolling the page if necessary\n            e.originalEvent.preventDefault();\n            if (e.originalEvent.targetTouches.length)\n            {\n              // see how far user swiped\n              var diff = (touchDif - e.originalEvent.targetTouches[0].pageY) / o.touchScrollStep;\n              // scroll content\n              scrollContent(diff, true);\n              touchDif = e.originalEvent.targetTouches[0].pageY;\n              \n            }\n          });\n        } else {\n          // support for mobile\n          me.bind('touchstart', function (e, b) {\n            if (e.originalEvent.touches.length)\n            {\n              // record where touch started\n              touchDif = e.originalEvent.touches[0].pageY;\n            }\n          });\n\n          me.bind('touchmove', function (e) {\n            // prevent scrolling the page if necessary\n            if (!releaseScroll)\n            {\n              e.originalEvent.preventDefault();\n            }\n            if (e.originalEvent.touches.length)\n            {\n              // see how far user swiped\n              var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;\n              // scroll content\n              scrollContent(diff, true);\n              touchDif = e.originalEvent.touches[0].pageY;\n            }\n          });\n        }\n\n        // set up initial height\n        getBarHeight();\n\n        // check start position\n        if (o.start === 'bottom')\n        {\n          // scroll content to bottom\n          bar.css({top: me.outerHeight() - bar.outerHeight()});\n          scrollContent(0, true);\n        }\n        else if (o.start !== 'top')\n        {\n          // assume jQuery selector\n          scrollContent($(o.start).position().top, null, true);\n\n          // make sure bar stays hidden\n          if (!o.alwaysVisible) {\n            bar.hide();\n          }\n        }\n\n        // attach scroll events\n        attachWheel();\n\n        function _onWheel(e)\n        {\n          // use mouse wheel only when mouse is over\n          if (!isOverPanel) {\n            return;\n          }\n\n          var e = e || window.event;\n\n          var delta = 0;\n          if (e.wheelDelta) {\n            delta = -e.wheelDelta / 120;\n          }\n          if (e.detail) {\n            delta = e.detail / 3;\n          }\n\n          var target = e.target || e.srcTarget || e.srcElement;\n          if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {\n            // scroll content\n            scrollContent(delta, true);\n          }\n\n          // stop window scroll\n          if (e.preventDefault && !releaseScroll) {\n            e.preventDefault();\n          }\n          if (!releaseScroll) {\n            e.returnValue = false;\n          }\n        }\n\n        function scrollContent(y, isWheel, isJump)\n        {\n          releaseScroll = false;\n          var delta = y;\n          var maxTop = me.outerHeight() - bar.outerHeight();\n\n          if (isWheel)\n          {\n            // move bar with mouse wheel\n            delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();\n\n            // move bar, make sure it doesn't go out\n            delta = Math.min(Math.max(delta, 0), maxTop);\n\n            // if scrolling down, make sure a fractional change to the\n            // scroll position isn't rounded away when the scrollbar's CSS is set\n            // this flooring of delta would happened automatically when\n            // bar.css is set below, but we floor here for clarity\n            delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);\n\n            // scroll the scrollbar\n            bar.css({top: delta + 'px'});\n          }\n\n          // calculate actual scroll amount\n          percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());\n          delta = percentScroll * (me[0].scrollHeight - me.outerHeight());\n\n          if (isJump)\n          {\n            delta = y;\n            var offsetTop = delta / me[0].scrollHeight * me.outerHeight();\n            offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);\n            bar.css({top: offsetTop + 'px'});\n          }\n\n          // scroll content\n          me.scrollTop(delta);\n\n          // fire scrolling event\n          me.trigger('slimscrolling', ~~delta);\n\n          // ensure bar is visible\n          showBar();\n\n          // trigger hide when scroll is stopped\n          hideBar();\n        }\n\n        function attachWheel()\n        {\n          if (window.addEventListener)\n          {\n            this.addEventListener('DOMMouseScroll', _onWheel, false);\n            this.addEventListener('mousewheel', _onWheel, false);\n          }\n          else\n          {\n            document.attachEvent(\"onmousewheel\", _onWheel)\n          }\n        }\n\n        function getBarHeight()\n        {\n          // calculate scrollbar height and make sure it is not too small\n          barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);\n          bar.css({height: barHeight + 'px'});\n\n          // hide scrollbar if content is not long enough\n          var display = barHeight == me.outerHeight() ? 'none' : 'block';\n          bar.css({display: display});\n        }\n\n        function showBar()\n        {\n          // recalculate bar height\n          getBarHeight();\n          clearTimeout(queueHide);\n\n          // when bar reached top or bottom\n          if (percentScroll == ~~percentScroll)\n          {\n            //release wheel\n            releaseScroll = o.allowPageScroll;\n\n            // publish approporiate event\n            if (lastScroll != percentScroll)\n            {\n              var msg = (~~percentScroll == 0) ? 'top' : 'bottom';\n              me.trigger('slimscroll', msg);\n            }\n          }\n          else\n          {\n            releaseScroll = false;\n          }\n          lastScroll = percentScroll;\n\n          // show only when required\n          if (barHeight >= me.outerHeight()) {\n            //allow window scroll\n            releaseScroll = true;\n            return;\n          }\n          bar.stop(true, true).fadeIn('fast');\n          if (o.railVisible) {\n            rail.stop(true, true).fadeIn('fast');\n          }\n        }\n\n        function hideBar()\n        {\n          // only hide when options allow it\n          if (!o.alwaysVisible)\n          {\n            queueHide = setTimeout(function () {\n              if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)\n              {\n                bar.fadeOut('slow');\n                rail.fadeOut('slow');\n              }\n            }, 1000);\n          }\n        }\n\n      });\n\n      // maintain chainability\n      return this;\n    }\n  });\n\n  $.fn.extend({\n    slimscroll: $.fn.slimScroll\n  });\n\n})(jQuery);\n","/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){\"function\"==typeof define&&define.amd?define([\"jquery\"],a):a(\"object\"==typeof exports?require(\"jquery\"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split(\"/\"),o=s.map,p=o&&o[\"*\"]||{};if(a&&\".\"===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split(\"/\"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,\"\")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],\".\"===m)a.splice(k,1),k-=1;else if(\"..\"===m){if(1===k&&(\"..\"===a[2]||\"..\"===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join(\"/\")}else 0===a.indexOf(\"./\")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split(\"/\"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join(\"/\"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join(\"/\")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join(\"/\"))}return a}function g(a,c){return function(){return n.apply(b,v.call(arguments,0).concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error(\"No \"+a);return q[a]}function k(a){var b,c=a?a.indexOf(\"!\"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+\"!\"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return\"undefined\"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:\"\",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,\"undefined\"===v||\"function\"===v){for(c=!c.length&&d.length?[\"require\",\"exports\",\"module\"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,\"require\"===k)u[n]=p.require(a);else if(\"exports\"===k)u[n]=p.exports(a),s=!0;else if(\"module\"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+\" missing \"+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if(\"string\"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},\"function\"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define(\"almond\",function(){}),b.define(\"jquery\",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error(\"Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page.\"),b}),b.define(\"select2/utils\",[\"jquery\"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];\"function\"==typeof e&&\"constructor\"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice;this.listeners=this.listeners||{},a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),\"*\"in this.listeners&&this.invoke(this.listeners[\"*\"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b=\"\",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split(\"-\"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||\"hidden\"!==f&&\"visible\"!==f?\"scroll\"===e||\"scroll\"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={\"\\\\\":\"&#92;\",\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"/\":\"&#47;\"};return\"string\"!=typeof a?a:String(a).replace(/[&<>\"'\\/\\\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if(\"1.7\"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define(\"select2/results\",[\"jquery\",\"./utils\"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class=\"select2-results__options\" role=\"tree\"></ul>');return this.options.get(\"multiple\")&&b.attr(\"aria-multiselectable\",\"true\"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get(\"escapeMarkup\");this.clear(),this.hideLoading();var d=a('<li role=\"treeitem\" class=\"select2-results__option\"></li>'),e=this.options.get(\"translations\").get(b.message);d.append(c(e(b.args))),this.$results.append(d)},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger(\"results:message\",{message:\"noResults\"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(\".select2-results\");c.append(a)},c.prototype.sort=function(a){var b=this.options.get(\"sorter\");return b(a)},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(\".select2-results__option[aria-selected]\");e.each(function(){var b=a(this),c=a.data(this,\"data\"),e=\"\"+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr(\"aria-selected\",\"true\"):b.attr(\"aria-selected\",\"false\")});var f=e.filter(\"[aria-selected=true]\");f.length>0?f.first().trigger(\"mouseenter\"):e.first().trigger(\"mouseenter\")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get(\"translations\").get(\"searching\"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=\" loading-results\",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(\".loading-results\").remove()},c.prototype.option=function(b){var c=document.createElement(\"li\");c.className=\"select2-results__option\";var d={role:\"treeitem\",\"aria-selected\":\"false\"};b.disabled&&(delete d[\"aria-selected\"],d[\"aria-disabled\"]=\"true\"),null==b.id&&delete d[\"aria-selected\"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role=\"group\",d[\"aria-label\"]=b.text,delete d[\"aria-selected\"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement(\"strong\");h.className=\"select2-results__group\";{a(h)}this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a(\"<ul></ul>\",{\"class\":\"select2-results__options select2-results__options--nested\"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,\"data\",b),c},c.prototype.bind=function(b){var c=this,d=b.id+\"-results\";this.$results.attr(\"id\",d),b.on(\"results:all\",function(a){c.clear(),c.append(a.data),b.isOpen()&&c.setClasses()}),b.on(\"results:append\",function(a){c.append(a.data),b.isOpen()&&c.setClasses()}),b.on(\"query\",function(a){c.showLoading(a)}),b.on(\"select\",function(){b.isOpen()&&c.setClasses()}),b.on(\"unselect\",function(){b.isOpen()&&c.setClasses()}),b.on(\"open\",function(){c.$results.attr(\"aria-expanded\",\"true\"),c.$results.attr(\"aria-hidden\",\"false\"),c.setClasses(),c.ensureHighlightVisible()}),b.on(\"close\",function(){c.$results.attr(\"aria-expanded\",\"false\"),c.$results.attr(\"aria-hidden\",\"true\"),c.$results.removeAttr(\"aria-activedescendant\")}),b.on(\"results:toggle\",function(){var a=c.getHighlightedResults();0!==a.length&&a.trigger(\"mouseup\")}),b.on(\"results:select\",function(){var a=c.getHighlightedResults();if(0!==a.length){var b=a.data(\"data\");\"true\"==a.attr(\"aria-selected\")?c.trigger(\"close\"):c.trigger(\"select\",{data:b})}}),b.on(\"results:previous\",function(){var a=c.getHighlightedResults(),b=c.$results.find(\"[aria-selected]\"),d=b.index(a);if(0!==d){var e=d-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger(\"mouseenter\");var g=c.$results.offset().top,h=f.offset().top,i=c.$results.scrollTop()+(h-g);0===e?c.$results.scrollTop(0):0>h-g&&c.$results.scrollTop(i)}}),b.on(\"results:next\",function(){var a=c.getHighlightedResults(),b=c.$results.find(\"[aria-selected]\"),d=b.index(a),e=d+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger(\"mouseenter\");var g=c.$results.offset().top+c.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=c.$results.scrollTop()+h-g;0===e?c.$results.scrollTop(0):h>g&&c.$results.scrollTop(i)}}),b.on(\"results:focus\",function(a){a.element.addClass(\"select2-results__option--highlighted\")}),b.on(\"results:message\",function(a){c.displayMessage(a)}),a.fn.mousewheel&&this.$results.on(\"mousewheel\",function(a){var b=c.$results.scrollTop(),d=c.$results.get(0).scrollHeight-c.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&d<=c.$results.height();e?(c.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(c.$results.scrollTop(c.$results.get(0).scrollHeight-c.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on(\"mouseup\",\".select2-results__option[aria-selected]\",function(b){var d=a(this),e=d.data(\"data\");return\"true\"===d.attr(\"aria-selected\")?void(c.options.get(\"multiple\")?c.trigger(\"unselect\",{originalEvent:b,data:e}):c.trigger(\"close\")):void c.trigger(\"select\",{originalEvent:b,data:e})}),this.$results.on(\"mouseenter\",\".select2-results__option[aria-selected]\",function(){var b=a(this).data(\"data\");c.getHighlightedResults().removeClass(\"select2-results__option--highlighted\"),c.trigger(\"results:focus\",{data:b,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(\".select2-results__option--highlighted\");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find(\"[aria-selected]\"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get(\"templateResult\"),e=this.options.get(\"escapeMarkup\"),f=d(b);null==f?c.style.display=\"none\":\"string\"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define(\"select2/keys\",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define(\"select2/selection/base\",[\"jquery\",\"../utils\",\"../keys\"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class=\"select2-selection\" role=\"combobox\" aria-autocomplete=\"list\" aria-haspopup=\"true\" aria-expanded=\"false\"></span>');return this._tabindex=0,null!=this.$element.data(\"old-tabindex\")?this._tabindex=this.$element.data(\"old-tabindex\"):null!=this.$element.attr(\"tabindex\")&&(this._tabindex=this.$element.attr(\"tabindex\")),b.attr(\"title\",this.$element.attr(\"title\")),b.attr(\"tabindex\",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a){var b=this,d=(a.id+\"-container\",a.id+\"-results\");this.container=a,this.$selection.on(\"focus\",function(a){b.trigger(\"focus\",a)}),this.$selection.on(\"blur\",function(a){b.trigger(\"blur\",a)}),this.$selection.on(\"keydown\",function(a){b.trigger(\"keypress\",a),a.which===c.SPACE&&a.preventDefault()}),a.on(\"results:focus\",function(a){b.$selection.attr(\"aria-activedescendant\",a.data._resultId)}),a.on(\"selection:update\",function(a){b.update(a.data)}),a.on(\"open\",function(){b.$selection.attr(\"aria-expanded\",\"true\"),b.$selection.attr(\"aria-owns\",d),b._attachCloseHandler(a)}),a.on(\"close\",function(){b.$selection.attr(\"aria-expanded\",\"false\"),b.$selection.removeAttr(\"aria-activedescendant\"),b.$selection.removeAttr(\"aria-owns\"),b.$selection.focus(),b._detachCloseHandler(a)}),a.on(\"enable\",function(){b.$selection.attr(\"tabindex\",b._tabindex)}),a.on(\"disable\",function(){b.$selection.attr(\"tabindex\",\"-1\")})},d.prototype._attachCloseHandler=function(b){a(document.body).on(\"mousedown.select2.\"+b.id,function(b){var c=a(b.target),d=c.closest(\".select2\"),e=a(\".select2.select2-container--open\");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data(\"element\");c.select2(\"close\")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off(\"mousedown.select2.\"+b.id)},d.prototype.position=function(a,b){var c=b.find(\".selection\");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(){throw new Error(\"The `update` method must be defined in child classes.\")},d}),b.define(\"select2/selection/single\",[\"jquery\",\"./base\",\"../utils\",\"../keys\"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass(\"select2-selection--single\"),a.html('<span class=\"select2-selection__rendered\"></span><span class=\"select2-selection__arrow\" role=\"presentation\"><b role=\"presentation\"></b></span>'),a},d.prototype.bind=function(a){var b=this;d.__super__.bind.apply(this,arguments);var c=a.id+\"-container\";this.$selection.find(\".select2-selection__rendered\").attr(\"id\",c),this.$selection.attr(\"aria-labelledby\",c),this.$selection.on(\"mousedown\",function(a){1===a.which&&b.trigger(\"toggle\",{originalEvent:a})}),this.$selection.on(\"focus\",function(){}),this.$selection.on(\"blur\",function(){}),a.on(\"selection:update\",function(a){b.update(a.data)})},d.prototype.clear=function(){this.$selection.find(\".select2-selection__rendered\").empty()},d.prototype.display=function(a){var b=this.options.get(\"templateSelection\"),c=this.options.get(\"escapeMarkup\");return c(b(a))},d.prototype.selectionContainer=function(){return a(\"<span></span>\")},d.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.display(b),d=this.$selection.find(\".select2-selection__rendered\");d.empty().append(c),d.prop(\"title\",b.title||b.text)},d}),b.define(\"select2/selection/multiple\",[\"jquery\",\"./base\",\"../utils\"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass(\"select2-selection--multiple\"),a.html('<ul class=\"select2-selection__rendered\"></ul>'),a},d.prototype.bind=function(){var b=this;d.__super__.bind.apply(this,arguments),this.$selection.on(\"click\",function(a){b.trigger(\"toggle\",{originalEvent:a})}),this.$selection.on(\"click\",\".select2-selection__choice__remove\",function(c){var d=a(this),e=d.parent(),f=e.data(\"data\");b.trigger(\"unselect\",{originalEvent:c,data:f})})},d.prototype.clear=function(){this.$selection.find(\".select2-selection__rendered\").empty()},d.prototype.display=function(a){var b=this.options.get(\"templateSelection\"),c=this.options.get(\"escapeMarkup\");return c(b(a))},d.prototype.selectionContainer=function(){var b=a('<li class=\"select2-selection__choice\"><span class=\"select2-selection__choice__remove\" role=\"presentation\">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.display(e),g=this.selectionContainer();g.append(f),g.prop(\"title\",e.title||e.text),g.data(\"data\",e),b.push(g)}var h=this.$selection.find(\".select2-selection__rendered\");c.appendMany(h,b)}},d}),b.define(\"select2/selection/placeholder\",[\"../utils\"],function(){function a(a,b,c){this.placeholder=this.normalizePlaceholder(c.get(\"placeholder\")),a.call(this,b,c)}return a.prototype.normalizePlaceholder=function(a,b){return\"string\"==typeof b&&(b={id:\"\",text:b}),b},a.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass(\"select2-selection__placeholder\").removeClass(\"select2-selection__choice\"),c},a.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(\".select2-selection__rendered\").append(e)},a}),b.define(\"select2/selection/allowClear\",[\"jquery\",\"../keys\"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get(\"debug\")&&window.console&&console.error&&console.error(\"Select2: The `allowClear` option should be used in combination with the `placeholder` option.\"),this.$selection.on(\"mousedown\",\".select2-selection__clear\",function(a){d._handleClear(a)}),b.on(\"keypress\",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get(\"disabled\")){var c=this.$selection.find(\".select2-selection__clear\");if(0!==c.length){b.stopPropagation();for(var d=c.data(\"data\"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger(\"unselect\",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger(\"change\"),this.trigger(\"toggle\")}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(\".select2-selection__placeholder\").length>0||0===c.length)){var d=a('<span class=\"select2-selection__clear\">&times;</span>');d.data(\"data\",c),this.$selection.find(\".select2-selection__rendered\").prepend(d)}},c}),b.define(\"select2/selection/search\",[\"jquery\",\"../utils\",\"../keys\"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class=\"select2-search select2-search--inline\"><input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"textbox\" /></li>');this.$searchContainer=c,this.$search=c.find(\"input\");var d=b.call(this);return d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on(\"open\",function(){e.$search.attr(\"tabindex\",0),e.$search.focus()}),b.on(\"close\",function(){e.$search.attr(\"tabindex\",-1),e.$search.val(\"\"),e.$search.focus()}),b.on(\"enable\",function(){e.$search.prop(\"disabled\",!1)}),b.on(\"disable\",function(){e.$search.prop(\"disabled\",!0)}),this.$selection.on(\"focusin\",\".select2-search--inline\",function(a){e.trigger(\"focus\",a)}),this.$selection.on(\"focusout\",\".select2-search--inline\",function(a){e.trigger(\"blur\",a)}),this.$selection.on(\"keydown\",\".select2-search--inline\",function(a){a.stopPropagation(),e.trigger(\"keypress\",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&\"\"===e.$search.val()){var d=e.$searchContainer.prev(\".select2-selection__choice\");if(d.length>0){var f=d.data(\"data\");e.searchRemoveChoice(f),a.preventDefault()}}}),this.$selection.on(\"input\",\".select2-search--inline\",function(){e.$selection.off(\"keyup.search\")}),this.$selection.on(\"keyup.search input\",\".select2-search--inline\",function(a){e.handleSearch(a)})},d.prototype.createPlaceholder=function(a,b){this.$search.attr(\"placeholder\",b.text)},d.prototype.update=function(a,b){this.$search.attr(\"placeholder\",\"\"),a.call(this,b),this.$selection.find(\".select2-selection__rendered\").append(this.$searchContainer),this.resizeSearch()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger(\"query\",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger(\"unselect\",{data:b}),this.trigger(\"open\"),this.$search.val(b.text+\" \")},d.prototype.resizeSearch=function(){this.$search.css(\"width\",\"25px\");var a=\"\";if(\"\"!==this.$search.attr(\"placeholder\"))a=this.$selection.find(\".select2-selection__rendered\").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+\"em\"}this.$search.css(\"width\",a)},d}),b.define(\"select2/selection/eventRelay\",[\"jquery\"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=[\"open\",\"opening\",\"close\",\"closing\",\"select\",\"selecting\",\"unselect\",\"unselecting\"],g=[\"opening\",\"closing\",\"selecting\",\"unselecting\"];b.call(this,c,d),c.on(\"*\",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event(\"select2:\"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define(\"select2/translation\",[\"jquery\",\"require\"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define(\"select2/diacritics\",[],function(){var a={\"Ⓐ\":\"A\",\"A\":\"A\",\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ầ\":\"A\",\"Ấ\":\"A\",\"Ẫ\":\"A\",\"Ẩ\":\"A\",\"Ã\":\"A\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ằ\":\"A\",\"Ắ\":\"A\",\"Ẵ\":\"A\",\"Ẳ\":\"A\",\"Ȧ\":\"A\",\"Ǡ\":\"A\",\"Ä\":\"A\",\"Ǟ\":\"A\",\"Ả\":\"A\",\"Å\":\"A\",\"Ǻ\":\"A\",\"Ǎ\":\"A\",\"Ȁ\":\"A\",\"Ȃ\":\"A\",\"Ạ\":\"A\",\"Ậ\":\"A\",\"Ặ\":\"A\",\"Ḁ\":\"A\",\"Ą\":\"A\",\"Ⱥ\":\"A\",\"Ɐ\":\"A\",\"Ꜳ\":\"AA\",\"Æ\":\"AE\",\"Ǽ\":\"AE\",\"Ǣ\":\"AE\",\"Ꜵ\":\"AO\",\"Ꜷ\":\"AU\",\"Ꜹ\":\"AV\",\"Ꜻ\":\"AV\",\"Ꜽ\":\"AY\",\"Ⓑ\":\"B\",\"B\":\"B\",\"Ḃ\":\"B\",\"Ḅ\":\"B\",\"Ḇ\":\"B\",\"Ƀ\":\"B\",\"Ƃ\":\"B\",\"Ɓ\":\"B\",\"Ⓒ\":\"C\",\"C\":\"C\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"Ç\":\"C\",\"Ḉ\":\"C\",\"Ƈ\":\"C\",\"Ȼ\":\"C\",\"Ꜿ\":\"C\",\"Ⓓ\":\"D\",\"D\":\"D\",\"Ḋ\":\"D\",\"Ď\":\"D\",\"Ḍ\":\"D\",\"Ḑ\":\"D\",\"Ḓ\":\"D\",\"Ḏ\":\"D\",\"Đ\":\"D\",\"Ƌ\":\"D\",\"Ɗ\":\"D\",\"Ɖ\":\"D\",\"Ꝺ\":\"D\",\"DZ\":\"DZ\",\"DŽ\":\"DZ\",\"Dz\":\"Dz\",\"Dž\":\"Dz\",\"Ⓔ\":\"E\",\"E\":\"E\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ề\":\"E\",\"Ế\":\"E\",\"Ễ\":\"E\",\"Ể\":\"E\",\"Ẽ\":\"E\",\"Ē\":\"E\",\"Ḕ\":\"E\",\"Ḗ\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ë\":\"E\",\"Ẻ\":\"E\",\"Ě\":\"E\",\"Ȅ\":\"E\",\"Ȇ\":\"E\",\"Ẹ\":\"E\",\"Ệ\":\"E\",\"Ȩ\":\"E\",\"Ḝ\":\"E\",\"Ę\":\"E\",\"Ḙ\":\"E\",\"Ḛ\":\"E\",\"Ɛ\":\"E\",\"Ǝ\":\"E\",\"Ⓕ\":\"F\",\"F\":\"F\",\"Ḟ\":\"F\",\"Ƒ\":\"F\",\"Ꝼ\":\"F\",\"Ⓖ\":\"G\",\"G\":\"G\",\"Ǵ\":\"G\",\"Ĝ\":\"G\",\"Ḡ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ǧ\":\"G\",\"Ģ\":\"G\",\"Ǥ\":\"G\",\"Ɠ\":\"G\",\"Ꞡ\":\"G\",\"Ᵹ\":\"G\",\"Ꝿ\":\"G\",\"Ⓗ\":\"H\",\"H\":\"H\",\"Ĥ\":\"H\",\"Ḣ\":\"H\",\"Ḧ\":\"H\",\"Ȟ\":\"H\",\"Ḥ\":\"H\",\"Ḩ\":\"H\",\"Ḫ\":\"H\",\"Ħ\":\"H\",\"Ⱨ\":\"H\",\"Ⱶ\":\"H\",\"Ɥ\":\"H\",\"Ⓘ\":\"I\",\"I\":\"I\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"İ\":\"I\",\"Ï\":\"I\",\"Ḯ\":\"I\",\"Ỉ\":\"I\",\"Ǐ\":\"I\",\"Ȉ\":\"I\",\"Ȋ\":\"I\",\"Ị\":\"I\",\"Į\":\"I\",\"Ḭ\":\"I\",\"Ɨ\":\"I\",\"Ⓙ\":\"J\",\"J\":\"J\",\"Ĵ\":\"J\",\"Ɉ\":\"J\",\"Ⓚ\":\"K\",\"K\":\"K\",\"Ḱ\":\"K\",\"Ǩ\":\"K\",\"Ḳ\":\"K\",\"Ķ\":\"K\",\"Ḵ\":\"K\",\"Ƙ\":\"K\",\"Ⱪ\":\"K\",\"Ꝁ\":\"K\",\"Ꝃ\":\"K\",\"Ꝅ\":\"K\",\"Ꞣ\":\"K\",\"Ⓛ\":\"L\",\"L\":\"L\",\"Ŀ\":\"L\",\"Ĺ\":\"L\",\"Ľ\":\"L\",\"Ḷ\":\"L\",\"Ḹ\":\"L\",\"Ļ\":\"L\",\"Ḽ\":\"L\",\"Ḻ\":\"L\",\"Ł\":\"L\",\"Ƚ\":\"L\",\"Ɫ\":\"L\",\"Ⱡ\":\"L\",\"Ꝉ\":\"L\",\"Ꝇ\":\"L\",\"Ꞁ\":\"L\",\"LJ\":\"LJ\",\"Lj\":\"Lj\",\"Ⓜ\":\"M\",\"M\":\"M\",\"Ḿ\":\"M\",\"Ṁ\":\"M\",\"Ṃ\":\"M\",\"Ɱ\":\"M\",\"Ɯ\":\"M\",\"Ⓝ\":\"N\",\"N\":\"N\",\"Ǹ\":\"N\",\"Ń\":\"N\",\"Ñ\":\"N\",\"Ṅ\":\"N\",\"Ň\":\"N\",\"Ṇ\":\"N\",\"Ņ\":\"N\",\"Ṋ\":\"N\",\"Ṉ\":\"N\",\"Ƞ\":\"N\",\"Ɲ\":\"N\",\"Ꞑ\":\"N\",\"Ꞥ\":\"N\",\"NJ\":\"NJ\",\"Nj\":\"Nj\",\"Ⓞ\":\"O\",\"O\":\"O\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Ồ\":\"O\",\"Ố\":\"O\",\"Ỗ\":\"O\",\"Ổ\":\"O\",\"Õ\":\"O\",\"Ṍ\":\"O\",\"Ȭ\":\"O\",\"Ṏ\":\"O\",\"Ō\":\"O\",\"Ṑ\":\"O\",\"Ṓ\":\"O\",\"Ŏ\":\"O\",\"Ȯ\":\"O\",\"Ȱ\":\"O\",\"Ö\":\"O\",\"Ȫ\":\"O\",\"Ỏ\":\"O\",\"Ő\":\"O\",\"Ǒ\":\"O\",\"Ȍ\":\"O\",\"Ȏ\":\"O\",\"Ơ\":\"O\",\"Ờ\":\"O\",\"Ớ\":\"O\",\"Ỡ\":\"O\",\"Ở\":\"O\",\"Ợ\":\"O\",\"Ọ\":\"O\",\"Ộ\":\"O\",\"Ǫ\":\"O\",\"Ǭ\":\"O\",\"Ø\":\"O\",\"Ǿ\":\"O\",\"Ɔ\":\"O\",\"Ɵ\":\"O\",\"Ꝋ\":\"O\",\"Ꝍ\":\"O\",\"Ƣ\":\"OI\",\"Ꝏ\":\"OO\",\"Ȣ\":\"OU\",\"Ⓟ\":\"P\",\"P\":\"P\",\"Ṕ\":\"P\",\"Ṗ\":\"P\",\"Ƥ\":\"P\",\"Ᵽ\":\"P\",\"Ꝑ\":\"P\",\"Ꝓ\":\"P\",\"Ꝕ\":\"P\",\"Ⓠ\":\"Q\",\"Q\":\"Q\",\"Ꝗ\":\"Q\",\"Ꝙ\":\"Q\",\"Ɋ\":\"Q\",\"Ⓡ\":\"R\",\"R\":\"R\",\"Ŕ\":\"R\",\"Ṙ\":\"R\",\"Ř\":\"R\",\"Ȑ\":\"R\",\"Ȓ\":\"R\",\"Ṛ\":\"R\",\"Ṝ\":\"R\",\"Ŗ\":\"R\",\"Ṟ\":\"R\",\"Ɍ\":\"R\",\"Ɽ\":\"R\",\"Ꝛ\":\"R\",\"Ꞧ\":\"R\",\"Ꞃ\":\"R\",\"Ⓢ\":\"S\",\"S\":\"S\",\"ẞ\":\"S\",\"Ś\":\"S\",\"Ṥ\":\"S\",\"Ŝ\":\"S\",\"Ṡ\":\"S\",\"Š\":\"S\",\"Ṧ\":\"S\",\"Ṣ\":\"S\",\"Ṩ\":\"S\",\"Ș\":\"S\",\"Ş\":\"S\",\"Ȿ\":\"S\",\"Ꞩ\":\"S\",\"Ꞅ\":\"S\",\"Ⓣ\":\"T\",\"T\":\"T\",\"Ṫ\":\"T\",\"Ť\":\"T\",\"Ṭ\":\"T\",\"Ț\":\"T\",\"Ţ\":\"T\",\"Ṱ\":\"T\",\"Ṯ\":\"T\",\"Ŧ\":\"T\",\"Ƭ\":\"T\",\"Ʈ\":\"T\",\"Ⱦ\":\"T\",\"Ꞇ\":\"T\",\"Ꜩ\":\"TZ\",\"Ⓤ\":\"U\",\"U\":\"U\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ũ\":\"U\",\"Ṹ\":\"U\",\"Ū\":\"U\",\"Ṻ\":\"U\",\"Ŭ\":\"U\",\"Ü\":\"U\",\"Ǜ\":\"U\",\"Ǘ\":\"U\",\"Ǖ\":\"U\",\"Ǚ\":\"U\",\"Ủ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ǔ\":\"U\",\"Ȕ\":\"U\",\"Ȗ\":\"U\",\"Ư\":\"U\",\"Ừ\":\"U\",\"Ứ\":\"U\",\"Ữ\":\"U\",\"Ử\":\"U\",\"Ự\":\"U\",\"Ụ\":\"U\",\"Ṳ\":\"U\",\"Ų\":\"U\",\"Ṷ\":\"U\",\"Ṵ\":\"U\",\"Ʉ\":\"U\",\"Ⓥ\":\"V\",\"V\":\"V\",\"Ṽ\":\"V\",\"Ṿ\":\"V\",\"Ʋ\":\"V\",\"Ꝟ\":\"V\",\"Ʌ\":\"V\",\"Ꝡ\":\"VY\",\"Ⓦ\":\"W\",\"W\":\"W\",\"Ẁ\":\"W\",\"Ẃ\":\"W\",\"Ŵ\":\"W\",\"Ẇ\":\"W\",\"Ẅ\":\"W\",\"Ẉ\":\"W\",\"Ⱳ\":\"W\",\"Ⓧ\":\"X\",\"X\":\"X\",\"Ẋ\":\"X\",\"Ẍ\":\"X\",\"Ⓨ\":\"Y\",\"Y\":\"Y\",\"Ỳ\":\"Y\",\"Ý\":\"Y\",\"Ŷ\":\"Y\",\"Ỹ\":\"Y\",\"Ȳ\":\"Y\",\"Ẏ\":\"Y\",\"Ÿ\":\"Y\",\"Ỷ\":\"Y\",\"Ỵ\":\"Y\",\"Ƴ\":\"Y\",\"Ɏ\":\"Y\",\"Ỿ\":\"Y\",\"Ⓩ\":\"Z\",\"Z\":\"Z\",\"Ź\":\"Z\",\"Ẑ\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"Ẓ\":\"Z\",\"Ẕ\":\"Z\",\"Ƶ\":\"Z\",\"Ȥ\":\"Z\",\"Ɀ\":\"Z\",\"Ⱬ\":\"Z\",\"Ꝣ\":\"Z\",\"ⓐ\":\"a\",\"a\":\"a\",\"ẚ\":\"a\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ầ\":\"a\",\"ấ\":\"a\",\"ẫ\":\"a\",\"ẩ\":\"a\",\"ã\":\"a\",\"ā\":\"a\",\"ă\":\"a\",\"ằ\":\"a\",\"ắ\":\"a\",\"ẵ\":\"a\",\"ẳ\":\"a\",\"ȧ\":\"a\",\"ǡ\":\"a\",\"ä\":\"a\",\"ǟ\":\"a\",\"ả\":\"a\",\"å\":\"a\",\"ǻ\":\"a\",\"ǎ\":\"a\",\"ȁ\":\"a\",\"ȃ\":\"a\",\"ạ\":\"a\",\"ậ\":\"a\",\"ặ\":\"a\",\"ḁ\":\"a\",\"ą\":\"a\",\"ⱥ\":\"a\",\"ɐ\":\"a\",\"ꜳ\":\"aa\",\"æ\":\"ae\",\"ǽ\":\"ae\",\"ǣ\":\"ae\",\"ꜵ\":\"ao\",\"ꜷ\":\"au\",\"ꜹ\":\"av\",\"ꜻ\":\"av\",\"ꜽ\":\"ay\",\"ⓑ\":\"b\",\"b\":\"b\",\"ḃ\":\"b\",\"ḅ\":\"b\",\"ḇ\":\"b\",\"ƀ\":\"b\",\"ƃ\":\"b\",\"ɓ\":\"b\",\"ⓒ\":\"c\",\"c\":\"c\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"ç\":\"c\",\"ḉ\":\"c\",\"ƈ\":\"c\",\"ȼ\":\"c\",\"ꜿ\":\"c\",\"ↄ\":\"c\",\"ⓓ\":\"d\",\"d\":\"d\",\"ḋ\":\"d\",\"ď\":\"d\",\"ḍ\":\"d\",\"ḑ\":\"d\",\"ḓ\":\"d\",\"ḏ\":\"d\",\"đ\":\"d\",\"ƌ\":\"d\",\"ɖ\":\"d\",\"ɗ\":\"d\",\"ꝺ\":\"d\",\"dz\":\"dz\",\"dž\":\"dz\",\"ⓔ\":\"e\",\"e\":\"e\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ề\":\"e\",\"ế\":\"e\",\"ễ\":\"e\",\"ể\":\"e\",\"ẽ\":\"e\",\"ē\":\"e\",\"ḕ\":\"e\",\"ḗ\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ë\":\"e\",\"ẻ\":\"e\",\"ě\":\"e\",\"ȅ\":\"e\",\"ȇ\":\"e\",\"ẹ\":\"e\",\"ệ\":\"e\",\"ȩ\":\"e\",\"ḝ\":\"e\",\"ę\":\"e\",\"ḙ\":\"e\",\"ḛ\":\"e\",\"ɇ\":\"e\",\"ɛ\":\"e\",\"ǝ\":\"e\",\"ⓕ\":\"f\",\"f\":\"f\",\"ḟ\":\"f\",\"ƒ\":\"f\",\"ꝼ\":\"f\",\"ⓖ\":\"g\",\"g\":\"g\",\"ǵ\":\"g\",\"ĝ\":\"g\",\"ḡ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ǧ\":\"g\",\"ģ\":\"g\",\"ǥ\":\"g\",\"ɠ\":\"g\",\"ꞡ\":\"g\",\"ᵹ\":\"g\",\"ꝿ\":\"g\",\"ⓗ\":\"h\",\"h\":\"h\",\"ĥ\":\"h\",\"ḣ\":\"h\",\"ḧ\":\"h\",\"ȟ\":\"h\",\"ḥ\":\"h\",\"ḩ\":\"h\",\"ḫ\":\"h\",\"ẖ\":\"h\",\"ħ\":\"h\",\"ⱨ\":\"h\",\"ⱶ\":\"h\",\"ɥ\":\"h\",\"ƕ\":\"hv\",\"ⓘ\":\"i\",\"i\":\"i\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"ï\":\"i\",\"ḯ\":\"i\",\"ỉ\":\"i\",\"ǐ\":\"i\",\"ȉ\":\"i\",\"ȋ\":\"i\",\"ị\":\"i\",\"į\":\"i\",\"ḭ\":\"i\",\"ɨ\":\"i\",\"ı\":\"i\",\"ⓙ\":\"j\",\"j\":\"j\",\"ĵ\":\"j\",\"ǰ\":\"j\",\"ɉ\":\"j\",\"ⓚ\":\"k\",\"k\":\"k\",\"ḱ\":\"k\",\"ǩ\":\"k\",\"ḳ\":\"k\",\"ķ\":\"k\",\"ḵ\":\"k\",\"ƙ\":\"k\",\"ⱪ\":\"k\",\"ꝁ\":\"k\",\"ꝃ\":\"k\",\"ꝅ\":\"k\",\"ꞣ\":\"k\",\"ⓛ\":\"l\",\"l\":\"l\",\"ŀ\":\"l\",\"ĺ\":\"l\",\"ľ\":\"l\",\"ḷ\":\"l\",\"ḹ\":\"l\",\"ļ\":\"l\",\"ḽ\":\"l\",\"ḻ\":\"l\",\"ſ\":\"l\",\"ł\":\"l\",\"ƚ\":\"l\",\"ɫ\":\"l\",\"ⱡ\":\"l\",\"ꝉ\":\"l\",\"ꞁ\":\"l\",\"ꝇ\":\"l\",\"lj\":\"lj\",\"ⓜ\":\"m\",\"m\":\"m\",\"ḿ\":\"m\",\"ṁ\":\"m\",\"ṃ\":\"m\",\"ɱ\":\"m\",\"ɯ\":\"m\",\"ⓝ\":\"n\",\"n\":\"n\",\"ǹ\":\"n\",\"ń\":\"n\",\"ñ\":\"n\",\"ṅ\":\"n\",\"ň\":\"n\",\"ṇ\":\"n\",\"ņ\":\"n\",\"ṋ\":\"n\",\"ṉ\":\"n\",\"ƞ\":\"n\",\"ɲ\":\"n\",\"ʼn\":\"n\",\"ꞑ\":\"n\",\"ꞥ\":\"n\",\"nj\":\"nj\",\"ⓞ\":\"o\",\"o\":\"o\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"ồ\":\"o\",\"ố\":\"o\",\"ỗ\":\"o\",\"ổ\":\"o\",\"õ\":\"o\",\"ṍ\":\"o\",\"ȭ\":\"o\",\"ṏ\":\"o\",\"ō\":\"o\",\"ṑ\":\"o\",\"ṓ\":\"o\",\"ŏ\":\"o\",\"ȯ\":\"o\",\"ȱ\":\"o\",\"ö\":\"o\",\"ȫ\":\"o\",\"ỏ\":\"o\",\"ő\":\"o\",\"ǒ\":\"o\",\"ȍ\":\"o\",\"ȏ\":\"o\",\"ơ\":\"o\",\"ờ\":\"o\",\"ớ\":\"o\",\"ỡ\":\"o\",\"ở\":\"o\",\"ợ\":\"o\",\"ọ\":\"o\",\"ộ\":\"o\",\"ǫ\":\"o\",\"ǭ\":\"o\",\"ø\":\"o\",\"ǿ\":\"o\",\"ɔ\":\"o\",\"ꝋ\":\"o\",\"ꝍ\":\"o\",\"ɵ\":\"o\",\"ƣ\":\"oi\",\"ȣ\":\"ou\",\"ꝏ\":\"oo\",\"ⓟ\":\"p\",\"p\":\"p\",\"ṕ\":\"p\",\"ṗ\":\"p\",\"ƥ\":\"p\",\"ᵽ\":\"p\",\"ꝑ\":\"p\",\"ꝓ\":\"p\",\"ꝕ\":\"p\",\"ⓠ\":\"q\",\"q\":\"q\",\"ɋ\":\"q\",\"ꝗ\":\"q\",\"ꝙ\":\"q\",\"ⓡ\":\"r\",\"r\":\"r\",\"ŕ\":\"r\",\"ṙ\":\"r\",\"ř\":\"r\",\"ȑ\":\"r\",\"ȓ\":\"r\",\"ṛ\":\"r\",\"ṝ\":\"r\",\"ŗ\":\"r\",\"ṟ\":\"r\",\"ɍ\":\"r\",\"ɽ\":\"r\",\"ꝛ\":\"r\",\"ꞧ\":\"r\",\"ꞃ\":\"r\",\"ⓢ\":\"s\",\"s\":\"s\",\"ß\":\"s\",\"ś\":\"s\",\"ṥ\":\"s\",\"ŝ\":\"s\",\"ṡ\":\"s\",\"š\":\"s\",\"ṧ\":\"s\",\"ṣ\":\"s\",\"ṩ\":\"s\",\"ș\":\"s\",\"ş\":\"s\",\"ȿ\":\"s\",\"ꞩ\":\"s\",\"ꞅ\":\"s\",\"ẛ\":\"s\",\"ⓣ\":\"t\",\"t\":\"t\",\"ṫ\":\"t\",\"ẗ\":\"t\",\"ť\":\"t\",\"ṭ\":\"t\",\"ț\":\"t\",\"ţ\":\"t\",\"ṱ\":\"t\",\"ṯ\":\"t\",\"ŧ\":\"t\",\"ƭ\":\"t\",\"ʈ\":\"t\",\"ⱦ\":\"t\",\"ꞇ\":\"t\",\"ꜩ\":\"tz\",\"ⓤ\":\"u\",\"u\":\"u\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ũ\":\"u\",\"ṹ\":\"u\",\"ū\":\"u\",\"ṻ\":\"u\",\"ŭ\":\"u\",\"ü\":\"u\",\"ǜ\":\"u\",\"ǘ\":\"u\",\"ǖ\":\"u\",\"ǚ\":\"u\",\"ủ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ǔ\":\"u\",\"ȕ\":\"u\",\"ȗ\":\"u\",\"ư\":\"u\",\"ừ\":\"u\",\"ứ\":\"u\",\"ữ\":\"u\",\"ử\":\"u\",\"ự\":\"u\",\"ụ\":\"u\",\"ṳ\":\"u\",\"ų\":\"u\",\"ṷ\":\"u\",\"ṵ\":\"u\",\"ʉ\":\"u\",\"ⓥ\":\"v\",\"v\":\"v\",\"ṽ\":\"v\",\"ṿ\":\"v\",\"ʋ\":\"v\",\"ꝟ\":\"v\",\"ʌ\":\"v\",\"ꝡ\":\"vy\",\"ⓦ\":\"w\",\"w\":\"w\",\"ẁ\":\"w\",\"ẃ\":\"w\",\"ŵ\":\"w\",\"ẇ\":\"w\",\"ẅ\":\"w\",\"ẘ\":\"w\",\"ẉ\":\"w\",\"ⱳ\":\"w\",\"ⓧ\":\"x\",\"x\":\"x\",\"ẋ\":\"x\",\"ẍ\":\"x\",\"ⓨ\":\"y\",\"y\":\"y\",\"ỳ\":\"y\",\"ý\":\"y\",\"ŷ\":\"y\",\"ỹ\":\"y\",\"ȳ\":\"y\",\"ẏ\":\"y\",\"ÿ\":\"y\",\"ỷ\":\"y\",\"ẙ\":\"y\",\"ỵ\":\"y\",\"ƴ\":\"y\",\"ɏ\":\"y\",\"ỿ\":\"y\",\"ⓩ\":\"z\",\"z\":\"z\",\"ź\":\"z\",\"ẑ\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"ẓ\":\"z\",\"ẕ\":\"z\",\"ƶ\":\"z\",\"ȥ\":\"z\",\"ɀ\":\"z\",\"ⱬ\":\"z\",\"ꝣ\":\"z\",\"Ά\":\"Α\",\"Έ\":\"Ε\",\"Ή\":\"Η\",\"Ί\":\"Ι\",\"Ϊ\":\"Ι\",\"Ό\":\"Ο\",\"Ύ\":\"Υ\",\"Ϋ\":\"Υ\",\"Ώ\":\"Ω\",\"ά\":\"α\",\"έ\":\"ε\",\"ή\":\"η\",\"ί\":\"ι\",\"ϊ\":\"ι\",\"ΐ\":\"ι\",\"ό\":\"ο\",\"ύ\":\"υ\",\"ϋ\":\"υ\",\"ΰ\":\"υ\",\"ω\":\"ω\",\"ς\":\"σ\"};return a}),b.define(\"select2/data/base\",[\"../utils\"],function(a){function b(){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(){throw new Error(\"The `current` method must be defined in child classes.\")},b.prototype.query=function(){throw new Error(\"The `query` method must be defined in child classes.\")},b.prototype.bind=function(){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+\"-result-\";return d+=a.generateChars(4),d+=null!=c.id?\"-\"+c.id.toString():\"-\"+a.generateChars(4)},b}),b.define(\"select2/data/select\",[\"./base\",\"../utils\",\"jquery\"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(\":selected\").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is(\"option\"))return a.element.selected=!0,void this.$element.trigger(\"change\");if(this.$element.prop(\"multiple\"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger(\"change\")});else{var d=a.id;this.$element.val(d),this.$element.trigger(\"change\")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop(\"multiple\"))return a.selected=!1,c(a.element).is(\"option\")?(a.element.selected=!1,void this.$element.trigger(\"change\")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger(\"change\")})},d.prototype.bind=function(a){var b=this;this.container=a,a.on(\"select\",function(a){b.select(a.data)}),a.on(\"unselect\",function(a){b.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find(\"*\").each(function(){c.removeData(this,\"data\")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is(\"option\")||b.is(\"optgroup\")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement(\"optgroup\"),b.label=a.text):(b=document.createElement(\"option\"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,\"data\",e),d},d.prototype.item=function(a){var b={};\nif(b=c.data(a[0],\"data\"),null!=b)return b;if(a.is(\"option\"))b={id:a.val(),text:a.text(),disabled:a.prop(\"disabled\"),selected:a.prop(\"selected\"),title:a.prop(\"title\")};else if(a.is(\"optgroup\")){b={text:a.prop(\"label\"),children:[],title:a.prop(\"title\")};for(var d=a.children(\"option\"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],\"data\",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:\"\"},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get(\"matcher\");return c(a,b)},d}),b.define(\"select2/data/array\",[\"./select\",\"../utils\",\"jquery\"],function(a,b,c){function d(a,b){var c=b.get(\"data\")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find(\"option\").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find(\"option\"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=(c.extend(!0,{},l,j),this.option(l));k.replaceWith(m)}else{var n=this.option(j);if(j.children){var o=this.convertToOptions(j.children);b.appendMany(n,o)}h.push(n)}}return h},d}),b.define(\"select2/data/ajax\",[\"./array\",\"../utils\",\"jquery\"],function(a,b,c){function d(b,c){this.ajaxOptions=this._applyDefaults(c.get(\"ajax\")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),a.__super__.constructor.call(this,b,c)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return{q:a.term}},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get(\"debug\")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error(\"Select2: The AJAX results did not return an array in the `results` key of the response.\")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:\"GET\"},this.ajaxOptions);\"function\"==typeof f.url&&(f.url=f.url(a)),\"function\"==typeof f.data&&(f.data=f.data(a)),this.ajaxOptions.delay&&\"\"!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define(\"select2/data/tags\",[\"jquery\"],function(a){function b(b,c,d){var e=d.get(\"tags\"),f=d.get(\"createTag\");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g<e.length;g++){var h=e[g],i=this._normalizeItem(h),j=this.option(i);this.$element.append(j)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr(\"data-select2-tag\",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return\"\"===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(){var b=(this._lastTag,this.$element.find(\"option[data-select2-tag]\"));b.each(function(){this.selected||a(this).remove()})},b}),b.define(\"select2/data/tokenizer\",[\"jquery\"],function(a){function b(a,b,c){var d=c.get(\"tokenizer\");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(\".select2-search__field\")},b.prototype.query=function(a,b,c){function d(a){e.select(a)}var e=this;b.term=b.term||\"\";var f=this.tokenizer(b,this.options,d);f.term!==b.term&&(this.$search.length&&(this.$search.val(f.term),this.$search.focus()),b.term=f.term),a.call(this,b,c)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get(\"tokenSeparators\")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);e(m),g=g.substr(h+1)||\"\",h=0}else h++}return{term:g}},b}),b.define(\"select2/data/minimumInputLength\",[],function(){function a(a,b,c){this.minimumInputLength=c.get(\"minimumInputLength\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||\"\",b.term.length<this.minimumInputLength?void this.trigger(\"results:message\",{message:\"inputTooShort\",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define(\"select2/data/maximumInputLength\",[],function(){function a(a,b,c){this.maximumInputLength=c.get(\"maximumInputLength\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||\"\",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger(\"results:message\",{message:\"inputTooLong\",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define(\"select2/data/maximumSelectionLength\",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get(\"maximumSelectionLength\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger(\"results:message\",{message:\"maximumSelected\",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define(\"select2/dropdown\",[\"jquery\",\"./utils\"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class=\"select2-dropdown\"><span class=\"select2-results\"></span></span>');return b.attr(\"dir\",this.options.get(\"dir\")),this.$dropdown=b,b},c.prototype.position=function(){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define(\"select2/dropdown/search\",[\"jquery\",\"../utils\"],function(a){function b(){}return b.prototype.render=function(b){var c=b.call(this),d=a('<span class=\"select2-search select2-search--dropdown\"><input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"textbox\" /></span>');return this.$searchContainer=d,this.$search=d.find(\"input\"),c.prepend(d),c},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on(\"keydown\",function(a){e.trigger(\"keypress\",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on(\"input\",function(){a(this).off(\"keyup\")}),this.$search.on(\"keyup input\",function(a){e.handleSearch(a)}),c.on(\"open\",function(){e.$search.attr(\"tabindex\",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on(\"close\",function(){e.$search.attr(\"tabindex\",-1),e.$search.val(\"\")}),c.on(\"results:all\",function(a){if(null==a.query.term||\"\"===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass(\"select2-search--hide\"):e.$searchContainer.addClass(\"select2-search--hide\")}})},b.prototype.handleSearch=function(){if(!this._keyUpPrevented){var a=this.$search.val();this.trigger(\"query\",{term:a})}this._keyUpPrevented=!1},b.prototype.showSearch=function(){return!0},b}),b.define(\"select2/dropdown/hidePlaceholder\",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get(\"placeholder\")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return\"string\"==typeof b&&(b={id:\"\",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define(\"select2/dropdown/infiniteScroll\",[\"jquery\"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on(\"query\",function(a){e.lastParams=a,e.loading=!0}),c.on(\"query:append\",function(a){e.lastParams=a,e.loading=!0}),this.$results.on(\"scroll\",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger(\"query:append\",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class=\"option load-more\" role=\"treeitem\"></li>'),c=this.options.get(\"translations\").get(\"loadingMore\");return b.html(c(this.lastParams)),b},b}),b.define(\"select2/dropdown/attachBody\",[\"jquery\",\"../utils\"],function(a,b){function c(a,b,c){this.$dropdownParent=c.get(\"dropdownParent\")||document.body,a.call(this,b,c)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on(\"open\",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on(\"results:all\",function(){d._positionDropdown(),d._resizeDropdown()}),b.on(\"results:append\",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on(\"close\",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on(\"mousedown\",function(a){a.stopPropagation()})},c.prototype.position=function(a,b,c){b.attr(\"class\",c.attr(\"class\")),b.removeClass(\"select2\"),b.addClass(\"select2-container--open\"),b.css({position:\"absolute\",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(\"<span></span>\"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c){var d=this,e=\"scroll.select2.\"+c.id,f=\"resize.select2.\"+c.id,g=\"orientationchange.select2.\"+c.id,h=this.$container.parents().filter(b.hasScroll);h.each(function(){a(this).data(\"select2-scroll-position\",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),h.on(e,function(){var b=a(this).data(\"select2-scroll-position\");a(this).scrollTop(b.y)}),a(window).on(e+\" \"+f+\" \"+g,function(){d._positionDropdown(),d._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c){var d=\"scroll.select2.\"+c.id,e=\"resize.select2.\"+c.id,f=\"orientationchange.select2.\"+c.id,g=this.$container.parents().filter(b.hasScroll);g.off(d),a(window).off(d+\" \"+e+\" \"+f)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass(\"select2-dropdown--above\"),d=this.$dropdown.hasClass(\"select2-dropdown--below\"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom};c||d||(e=\"below\"),k||!j||c?!j&&k&&c&&(e=\"below\"):e=\"above\",(\"above\"==e||c&&\"below\"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass(\"select2-dropdown--below select2-dropdown--above\").addClass(\"select2-dropdown--\"+e),this.$container.removeClass(\"select2-container--below select2-container--above\").addClass(\"select2-container--\"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){this.$dropdownContainer.width();var a={width:this.$container.outerWidth(!1)+\"px\"};this.options.get(\"dropdownAutoWidth\")&&(a.minWidth=a.width,a.width=\"auto\"),this.$dropdown.css(a)},c.prototype._showDropdown=function(){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define(\"select2/dropdown/minimumResultsForSearch\",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get(\"minimumResultsForSearch\"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define(\"select2/dropdown/selectOnClose\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on(\"close\",function(){d._handleSelectOnClose()})},a.prototype._handleSelectOnClose=function(){var a=this.getHighlightedResults();a.length<1||this.trigger(\"select\",{data:a.data(\"data\")})},a}),b.define(\"select2/dropdown/closeOnSelect\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on(\"select\",function(a){d._selectTriggered(a)}),b.on(\"unselect\",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger(\"close\")},a}),b.define(\"select2/i18n/en\",[],function(){return{errorLoading:function(){return\"The results could not be loaded.\"},inputTooLong:function(a){var b=a.input.length-a.maximum,c=\"Please delete \"+b+\" character\";return 1!=b&&(c+=\"s\"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c=\"Please enter \"+b+\" or more characters\";return c},loadingMore:function(){return\"Loading more results…\"},maximumSelected:function(a){var b=\"You can only select \"+a.maximum+\" item\";return 1!=a.maximum&&(b+=\"s\"),b},noResults:function(){return\"No results found\"},searching:function(){return\"Searching…\"}}}),b.define(\"select2/defaults\",[\"jquery\",\"require\",\"./results\",\"./selection/single\",\"./selection/multiple\",\"./selection/placeholder\",\"./selection/allowClear\",\"./selection/search\",\"./selection/eventRelay\",\"./utils\",\"./translation\",\"./diacritics\",\"./data/select\",\"./data/array\",\"./data/ajax\",\"./data/tags\",\"./data/tokenizer\",\"./data/minimumInputLength\",\"./data/maximumInputLength\",\"./data/maximumSelectionLength\",\"./dropdown\",\"./dropdown/search\",\"./dropdown/hidePlaceholder\",\"./dropdown/infiniteScroll\",\"./dropdown/attachBody\",\"./dropdown/minimumResultsForSearch\",\"./dropdown/selectOnClose\",\"./dropdown/closeOnSelect\",\"./i18n/en\"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend({},this.defaults,l),null==l.dataAdapter){if(l.dataAdapter=null!=l.ajax?o:null!=l.data?n:m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+\"compat/query\");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+\"compat/initSelection\");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+\"compat/dropdownCss\");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.selectionAdapter=l.multiple?e:d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+\"compat/containerCss\");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if(\"string\"==typeof l.language)if(l.language.indexOf(\"-\")>0){var H=l.language.split(\"-\"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push(\"en\");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for \"'+M+'\" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+\"en\"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\\u0000-\\u007E]/g,b)}function c(d,e){if(\"\"===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:\"./\",amdLanguageBase:\"./i18n/\",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:\"default\",width:\"resolve\"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define(\"select2/options\",[\"require\",\"jquery\",\"./defaults\",\"./utils\"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is(\"input\")){var f=a(this.get(\"amdBase\")+\"compat/inputData\");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=[\"select2\"];null==this.options.multiple&&(this.options.multiple=a.prop(\"multiple\")),null==this.options.disabled&&(this.options.disabled=a.prop(\"disabled\")),null==this.options.language&&(a.prop(\"lang\")?this.options.language=a.prop(\"lang\").toLowerCase():a.closest(\"[lang]\").prop(\"lang\")&&(this.options.language=a.closest(\"[lang]\").prop(\"lang\"))),null==this.options.dir&&(this.options.dir=a.prop(\"dir\")?a.prop(\"dir\"):a.closest(\"[dir]\").prop(\"dir\")?a.closest(\"[dir]\").prop(\"dir\"):\"ltr\"),a.prop(\"disabled\",this.options.disabled),a.prop(\"multiple\",this.options.multiple),a.data(\"select2Tags\")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags=\"true\"` attributes and will be removed in future versions of Select2.'),a.data(\"data\",a.data(\"select2Tags\")),a.data(\"tags\",!0)),a.data(\"ajaxUrl\")&&(this.options.debug&&window.console&&console.warn&&console.warn(\"Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2.\"),a.attr(\"ajax--url\",a.data(\"ajaxUrl\")),a.data(\"ajax--url\",a.data(\"ajaxUrl\")));var e={};e=b.fn.jquery&&\"1.\"==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define(\"select2/core\",[\"jquery\",\"./options\",\"./utils\",\"./keys\"],function(a,b,c,d){var e=function(a,c){null!=a.data(\"select2\")&&a.data(\"select2\").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr(\"tabindex\")||0;a.data(\"old-tabindex\",d),a.attr(\"tabindex\",\"-1\");var f=this.options.get(\"dataAdapter\");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get(\"selectionAdapter\");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get(\"dropdownAdapter\");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get(\"resultsAdapter\");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger(\"selection:update\",{data:a})}),a.addClass(\"select2-hidden-accessible\"),a.attr(\"aria-hidden\",\"true\"),this._syncAttributes(),a.data(\"select2\",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b=\"\";return b=null!=a.attr(\"id\")?a.attr(\"id\"):null!=a.attr(\"name\")?a.attr(\"name\")+\"-\"+c.generateChars(2):c.generateChars(4),b=\"select2-\"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get(\"width\"));null!=b&&a.css(\"width\",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if(\"resolve\"==b){var d=this._resolveWidth(a,\"style\");return null!=d?d:this._resolveWidth(a,\"element\")}if(\"element\"==b){var e=a.outerWidth(!1);return 0>=e?\"auto\":e+\"px\"}if(\"style\"==b){var f=a.attr(\"style\");if(\"string\"!=typeof f)return null;for(var g=f.split(\";\"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\\s/g,\"\"),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on(\"change.select2\",function(){b.dataAdapter.current(function(a){b.trigger(\"selection:update\",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent(\"onpropertychange\",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener(\"DOMAttrModified\",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on(\"*\",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=[\"toggle\"];this.selection.on(\"toggle\",function(){b.toggleDropdown()}),this.selection.on(\"*\",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on(\"*\",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on(\"*\",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on(\"open\",function(){a.$container.addClass(\"select2-container--open\")}),this.on(\"close\",function(){a.$container.removeClass(\"select2-container--open\")}),this.on(\"enable\",function(){a.$container.removeClass(\"select2-container--disabled\")}),this.on(\"disable\",function(){a.$container.addClass(\"select2-container--disabled\")}),this.on(\"focus\",function(){a.$container.addClass(\"select2-container--focus\")}),this.on(\"blur\",function(){a.$container.removeClass(\"select2-container--focus\")}),this.on(\"query\",function(b){a.isOpen()||a.trigger(\"open\"),this.dataAdapter.query(b,function(c){a.trigger(\"results:all\",{data:c,query:b})})}),this.on(\"query:append\",function(b){this.dataAdapter.query(b,function(c){a.trigger(\"results:append\",{data:c,query:b})})}),this.on(\"keypress\",function(b){var c=b.which;a.isOpen()?c===d.ENTER?(a.trigger(\"results:select\"),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger(\"results:toggle\"),b.preventDefault()):c===d.UP?(a.trigger(\"results:previous\"),b.preventDefault()):c===d.DOWN?(a.trigger(\"results:next\"),b.preventDefault()):(c===d.ESC||c===d.TAB)&&(a.close(),b.preventDefault()):(c===d.ENTER||c===d.SPACE||(c===d.DOWN||c===d.UP)&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set(\"disabled\",this.$element.prop(\"disabled\")),this.options.get(\"disabled\")?(this.isOpen()&&this.close(),this.trigger(\"disable\")):this.trigger(\"enable\")},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:\"opening\",close:\"closing\",select:\"selecting\",unselect:\"unselecting\"};if(a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get(\"disabled\")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||(this.trigger(\"query\",{}),this.trigger(\"open\"))},e.prototype.close=function(){this.isOpen()&&this.trigger(\"close\")},e.prototype.isOpen=function(){return this.$container.hasClass(\"select2-container--open\")},e.prototype.enable=function(a){this.options.get(\"debug\")&&window.console&&console.warn&&console.warn('Select2: The `select2(\"enable\")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop(\"disabled\") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop(\"disabled\",b)},e.prototype.data=function(){this.options.get(\"debug\")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2(\"data\")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get(\"debug\")&&window.console&&console.warn&&console.warn('Select2: The `select2(\"val\")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger(\"change\")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent(\"onpropertychange\",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener(\"DOMAttrModified\",this._sync,!1),this._sync=null,this.$element.off(\".select2\"),this.$element.attr(\"tabindex\",this.$element.data(\"old-tabindex\")),this.$element.removeClass(\"select2-hidden-accessible\"),this.$element.attr(\"aria-hidden\",\"false\"),this.$element.removeData(\"select2\"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class=\"select2 select2-container\"><span class=\"selection\"></span><span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span></span>');return b.attr(\"dir\",this.options.get(\"dir\")),this.$container=b,this.$container.addClass(\"select2-container--\"+this.options.get(\"theme\")),b.data(\"element\",this.$element),b},e}),b.define(\"select2/compat/utils\",[\"jquery\"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr(\"class\")),e&&(e=\"\"+e,a(e.split(/\\s+/)).each(function(){0===this.indexOf(\"select2-\")&&g.push(this)})),e=a.trim(c.attr(\"class\")),e&&(e=\"\"+e,a(e.split(/\\s+/)).each(function(){0!==this.indexOf(\"select2-\")&&(f=d(this),null!=f&&g.push(f))})),b.attr(\"class\",g.join(\" \"))}return{syncCssClasses:b}}),b.define(\"select2/compat/containerCss\",[\"jquery\",\"./utils\"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get(\"containerCssClass\")||\"\";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get(\"adaptContainerCssClass\");if(g=g||c,-1!==f.indexOf(\":all:\")){f=f.replace(\":all\",\"\");var h=g;g=function(a){var b=h(a);return null!=b?b+\" \"+a:a}}var i=this.options.get(\"containerCss\")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define(\"select2/compat/dropdownCss\",[\"jquery\",\"./utils\"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get(\"dropdownCssClass\")||\"\";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get(\"adaptDropdownCssClass\");if(g=g||c,-1!==f.indexOf(\":all:\")){f=f.replace(\":all\",\"\");var h=g;g=function(a){var b=h(a);return null!=b?b+\" \"+a:a}}var i=this.options.get(\"dropdownCss\")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define(\"select2/compat/initSelection\",[\"jquery\"],function(a){function b(a,b,c){c.get(\"debug\")&&window.console&&console.warn&&console.warn(\"Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2\"),this.initSelection=c.get(\"initSelection\"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define(\"select2/compat/inputData\",[\"jquery\"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get(\"valueSeparator\")||\",\",\"hidden\"===b.prop(\"type\")&&c.get(\"debug\")&&console&&console.warn&&console.warn(\"Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead.\"),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get(\"multiple\")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger(\"change\")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger(\"change\")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];\nb.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger(\"change\")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],\"data\")});this._currentData.push.apply(this._currentData,d)},b}),b.define(\"select2/compat/matcher\",[\"jquery\"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||\"\"===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define(\"select2/compat/query\",[],function(){function a(a,b,c){c.get(\"debug\")&&window.console&&console.warn&&console.warn(\"Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2.\"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get(\"query\");d.call(null,b)},a}),b.define(\"select2/dropdown/attachContainer\",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(\".dropdown-wrapper\");d.append(b),b.addClass(\"select2-dropdown--below\"),c.addClass(\"select2-container--below\")},a}),b.define(\"select2/dropdown/stopPropagation\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=[\"blur\",\"change\",\"click\",\"dblclick\",\"focus\",\"focusin\",\"focusout\",\"input\",\"keydown\",\"keyup\",\"keypress\",\"mousedown\",\"mouseenter\",\"mouseleave\",\"mousemove\",\"mouseover\",\"mouseup\",\"search\",\"touchend\",\"touchstart\"];this.$dropdown.on(d.join(\" \"),function(a){a.stopPropagation()})},a}),b.define(\"select2/selection/stopPropagation\",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=[\"blur\",\"change\",\"click\",\"dblclick\",\"focus\",\"focusin\",\"focusout\",\"input\",\"keydown\",\"keyup\",\"keypress\",\"mousedown\",\"mouseenter\",\"mouseleave\",\"mousemove\",\"mouseover\",\"mouseup\",\"search\",\"touchend\",\"touchstart\"];this.$selection.on(d.join(\" \"),function(a){a.stopPropagation()})},a}),b.define(\"jquery.select2\",[\"jquery\",\"require\",\"./select2/core\",\"./select2/defaults\"],function(a,b,c,d){if(b(\"jquery.mousewheel\"),null==a.fn.select2){var e=[\"open\",\"close\",\"destroy\"];a.fn.select2=function(b){if(b=b||{},\"object\"==typeof b)return this.each(function(){{var d=a.extend({},b,!0);new c(a(this),d)}}),this;if(\"string\"==typeof b){var d=this.data(\"select2\");null==d&&window.console&&console.error&&console.error(\"The select2('\"+b+\"') method was called on an element that is not using Select2.\");var f=Array.prototype.slice.call(arguments,1),g=d[b](f);return a.inArray(b,e)>-1?this:g}throw new Error(\"Invalid arguments for Select2: \"+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),function(c){\"function\"==typeof b.define&&b.define.amd?b.define(\"jquery.mousewheel\",[\"jquery\"],c):\"object\"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type=\"mousewheel\",\"detail\"in g&&(m=-1*g.detail),\"wheelDelta\"in g&&(m=g.wheelDelta),\"wheelDeltaY\"in g&&(m=g.wheelDeltaY),\"wheelDeltaX\"in g&&(l=-1*g.wheelDeltaX),\"axis\"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,\"deltaY\"in g&&(m=-1*g.deltaY,j=m),\"deltaX\"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,\"mousewheel-line-height\");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,\"mousewheel-page-height\");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?\"floor\":\"ceil\"](j/f),l=Math[l>=1?\"floor\":\"ceil\"](l/f),m=Math[m>=1?\"floor\":\"ceil\"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&\"mousewheel\"===a.type&&b%120===0}var e,f,g=[\"wheel\",\"mousewheel\",\"DOMMouseScroll\",\"MozMousePixelScroll\"],h=\"onwheel\"in document||document.documentMode>=9?[\"wheel\"]:[\"mousewheel\",\"DomMouseScroll\",\"MozMousePixelScroll\"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:\"3.1.12\",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,\"mousewheel-line-height\",k.getLineHeight(this)),a.data(this,\"mousewheel-page-height\",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,\"mousewheel-line-height\"),a.removeData(this,\"mousewheel-page-height\")},getLineHeight:function(b){var c=a(b),d=c[\"offsetParent\"in a.fn?\"offsetParent\":\"parent\"]();return d.length||(d=a(\"body\")),parseInt(d.css(\"fontSize\"),10)||parseInt(c.css(\"fontSize\"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind(\"mousewheel\",a):this.trigger(\"mousewheel\")},unmousewheel:function(a){return this.unbind(\"mousewheel\",a)}})}),{define:b.define,require:b.require}}(),c=b.require(\"jquery.select2\");return a.fn.select2.amd=b,c});","/*!\n * Bootstrap Colorpicker\n * http://mjolnic.github.io/bootstrap-colorpicker/\n *\n * Originally written by (c) 2012 Stefan Petre\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0.txt\n *\n * @todo Update DOCS\n */\n(function($) {\n    'use strict';\n\n    // Color object\n    var Color = function(val) {\n        this.value = {\n            h: 0,\n            s: 0,\n            b: 0,\n            a: 1\n        };\n        this.origFormat = null; // original string format\n        if (val) {\n            if (val.toLowerCase !== undefined) {\n                this.setColor(val);\n            } else if (val.h !== undefined) {\n                this.value = val;\n            }\n        }\n    };\n\n    Color.prototype = {\n        constructor: Color,\n        _sanitizeNumber: function(val) {\n            if (typeof val === 'number') {\n                return val;\n            }\n            if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {\n                return 1;\n            }\n            if (val.toLowerCase !== undefined) {\n                return parseFloat(val);\n            }\n            return 1;\n        },\n        //parse a string to HSB\n        setColor: function(strVal) {\n            strVal = strVal.toLowerCase();\n            this.value = this.stringToHSB(strVal) ||  {\n                h: 0,\n                s: 0,\n                b: 0,\n                a: 1\n            };\n        },\n        stringToHSB: function(strVal) {\n            strVal = strVal.toLowerCase();\n            var that = this,\n                result = false;\n            $.each(this.stringParsers, function(i, parser) {\n                var match = parser.re.exec(strVal),\n                    values = match && parser.parse.apply(that, [match]),\n                    format = parser.format || 'rgba';\n                if (values) {\n                    if (format.match(/hsla?/)) {\n                        result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));\n                    } else {\n                        result = that.RGBtoHSB.apply(that, values);\n                    }\n                    that.origFormat = format;\n                    return false;\n                }\n                return true;\n            });\n            return result;\n        },\n        setHue: function(h) {\n            this.value.h = 1 - h;\n        },\n        setSaturation: function(s) {\n            this.value.s = s;\n        },\n        setBrightness: function(b) {\n            this.value.b = 1 - b;\n        },\n        setAlpha: function(a) {\n            this.value.a = parseInt((1 - a) * 100, 10) / 100;\n        },\n        toRGB: function(h, s, v, a) {\n            h = h || this.value.h;\n            s = s || this.value.s;\n            v = v || this.value.b;\n            a = a || this.value.a;\n\n            var r, g, b, i, f, p, q, t;\n            if (h && s === undefined && v === undefined) {\n                s = h.s, v = h.v, h = h.h;\n            }\n            i = Math.floor(h * 6);\n            f = h * 6 - i;\n            p = v * (1 - s);\n            q = v * (1 - f * s);\n            t = v * (1 - (1 - f) * s);\n            switch (i % 6) {\n                case 0:\n                    r = v, g = t, b = p;\n                    break;\n                case 1:\n                    r = q, g = v, b = p;\n                    break;\n                case 2:\n                    r = p, g = v, b = t;\n                    break;\n                case 3:\n                    r = p, g = q, b = v;\n                    break;\n                case 4:\n                    r = t, g = p, b = v;\n                    break;\n                case 5:\n                    r = v, g = p, b = q;\n                    break;\n            }\n            return {\n                r: Math.floor(r * 255),\n                g: Math.floor(g * 255),\n                b: Math.floor(b * 255),\n                a: a\n            };\n        },\n        toHex: function(h, s, b, a) {\n            var rgb = this.toRGB(h, s, b, a);\n            return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);\n        },\n        toHSL: function(h, s, b, a) {\n            h = h || this.value.h;\n            s = s || this.value.s;\n            b = b || this.value.b;\n            a = a || this.value.a;\n\n            var H = h,\n                L = (2 - s) * b,\n                S = s * b;\n            if (L > 0 && L <= 1) {\n                S /= L;\n            } else {\n                S /= 2 - L;\n            }\n            L /= 2;\n            if (S > 1) {\n                S = 1;\n            }\n            return {\n                h: H,\n                s: S,\n                l: L,\n                a: a\n            };\n        },\n        RGBtoHSB: function(r, g, b, a) {\n            r /= 255;\n            g /= 255;\n            b /= 255;\n\n            var H, S, V, C;\n            V = Math.max(r, g, b);\n            C = V - Math.min(r, g, b);\n            H = (C === 0 ? null :\n                V === r ? (g - b) / C :\n                V === g ? (b - r) / C + 2 :\n                (r - g) / C + 4\n            );\n            H = ((H + 360) % 6) * 60 / 360;\n            S = C === 0 ? 0 : C / V;\n            return {\n                h: this._sanitizeNumber(H),\n                s: S,\n                b: V,\n                a: this._sanitizeNumber(a)\n            };\n        },\n        HueToRGB: function(p, q, h) {\n            if (h < 0) {\n                h += 1;\n            } else if (h > 1) {\n                h -= 1;\n            }\n            if ((h * 6) < 1) {\n                return p + (q - p) * h * 6;\n            } else if ((h * 2) < 1) {\n                return q;\n            } else if ((h * 3) < 2) {\n                return p + (q - p) * ((2 / 3) - h) * 6;\n            } else {\n                return p;\n            }\n        },\n        HSLtoRGB: function(h, s, l, a) {\n            if (s < 0) {\n                s = 0;\n            }\n            var q;\n            if (l <= 0.5) {\n                q = l * (1 + s);\n            } else {\n                q = l + s - (l * s);\n            }\n\n            var p = 2 * l - q;\n\n            var tr = h + (1 / 3);\n            var tg = h;\n            var tb = h - (1 / 3);\n\n            var r = Math.round(this.HueToRGB(p, q, tr) * 255);\n            var g = Math.round(this.HueToRGB(p, q, tg) * 255);\n            var b = Math.round(this.HueToRGB(p, q, tb) * 255);\n            return [r, g, b, this._sanitizeNumber(a)];\n        },\n        toString: function(format) {\n            format = format ||  'rgba';\n            switch (format) {\n                case 'rgb':\n                    {\n                        var rgb = this.toRGB();\n                        return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';\n                    }\n                    break;\n                case 'rgba':\n                    {\n                        var rgb = this.toRGB();\n                        return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')';\n                    }\n                    break;\n                case 'hsl':\n                    {\n                        var hsl = this.toHSL();\n                        return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)';\n                    }\n                    break;\n                case 'hsla':\n                    {\n                        var hsl = this.toHSL();\n                        return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')';\n                    }\n                    break;\n                case 'hex':\n                    {\n                        return this.toHex();\n                    }\n                    break;\n                default:\n                    {\n                        return false;\n                    }\n                    break;\n            }\n        },\n        // a set of RE's that can match strings and generate color tuples.\n        // from John Resig color plugin\n        // https://github.com/jquery/jquery-color/\n        stringParsers: [{\n            re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,\n            format: 'hex',\n            parse: function(execResult) {\n                return [\n                    parseInt(execResult[1], 16),\n                    parseInt(execResult[2], 16),\n                    parseInt(execResult[3], 16),\n                    1\n                ];\n            }\n        }, {\n            re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,\n            format: 'hex',\n            parse: function(execResult) {\n                return [\n                    parseInt(execResult[1] + execResult[1], 16),\n                    parseInt(execResult[2] + execResult[2], 16),\n                    parseInt(execResult[3] + execResult[3], 16),\n                    1\n                ];\n            }\n        }, {\n            re: /rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*?\\)/,\n            format: 'rgb',\n            parse: function(execResult) {\n                return [\n                    execResult[1],\n                    execResult[2],\n                    execResult[3],\n                    1\n                ];\n            }\n        }, {\n            re: /rgb\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*?\\)/,\n            format: 'rgb',\n            parse: function(execResult) {\n                return [\n                    2.55 * execResult[1],\n                    2.55 * execResult[2],\n                    2.55 * execResult[3],\n                    1\n                ];\n            }\n        }, {\n            re: /rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n            format: 'rgba',\n            parse: function(execResult) {\n                return [\n                    execResult[1],\n                    execResult[2],\n                    execResult[3],\n                    execResult[4]\n                ];\n            }\n        }, {\n            re: /rgba\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n            format: 'rgba',\n            parse: function(execResult) {\n                return [\n                    2.55 * execResult[1],\n                    2.55 * execResult[2],\n                    2.55 * execResult[3],\n                    execResult[4]\n                ];\n            }\n        }, {\n            re: /hsl\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*?\\)/,\n            format: 'hsl',\n            parse: function(execResult) {\n                return [\n                    execResult[1] / 360,\n                    execResult[2] / 100,\n                    execResult[3] / 100,\n                    execResult[4]\n                ];\n            }\n        }, {\n            re: /hsla\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n            format: 'hsla',\n            parse: function(execResult) {\n                return [\n                    execResult[1] / 360,\n                    execResult[2] / 100,\n                    execResult[3] / 100,\n                    execResult[4]\n                ];\n            }\n        }, {\n            //predefined color name\n            re: /^([a-z]{3,})$/,\n            format: 'alias',\n            parse: function(execResult) {\n                var hexval = this.colorNameToHex(execResult[0]) ||  '#000000';\n                var match = this.stringParsers[0].re.exec(hexval),\n                    values = match && this.stringParsers[0].parse.apply(this, [match]);\n                return values;\n            }\n        }],\n        colorNameToHex: function(name) {\n            // 140 predefined colors from the HTML Colors spec\n            var colors = {\n                \"aliceblue\": \"#f0f8ff\",\n                \"antiquewhite\": \"#faebd7\",\n                \"aqua\": \"#00ffff\",\n                \"aquamarine\": \"#7fffd4\",\n                \"azure\": \"#f0ffff\",\n                \"beige\": \"#f5f5dc\",\n                \"bisque\": \"#ffe4c4\",\n                \"black\": \"#000000\",\n                \"blanchedalmond\": \"#ffebcd\",\n                \"blue\": \"#0000ff\",\n                \"blueviolet\": \"#8a2be2\",\n                \"brown\": \"#a52a2a\",\n                \"burlywood\": \"#deb887\",\n                \"cadetblue\": \"#5f9ea0\",\n                \"chartreuse\": \"#7fff00\",\n                \"chocolate\": \"#d2691e\",\n                \"coral\": \"#ff7f50\",\n                \"cornflowerblue\": \"#6495ed\",\n                \"cornsilk\": \"#fff8dc\",\n                \"crimson\": \"#dc143c\",\n                \"cyan\": \"#00ffff\",\n                \"darkblue\": \"#00008b\",\n                \"darkcyan\": \"#008b8b\",\n                \"darkgoldenrod\": \"#b8860b\",\n                \"darkgray\": \"#a9a9a9\",\n                \"darkgreen\": \"#006400\",\n                \"darkkhaki\": \"#bdb76b\",\n                \"darkmagenta\": \"#8b008b\",\n                \"darkolivegreen\": \"#556b2f\",\n                \"darkorange\": \"#ff8c00\",\n                \"darkorchid\": \"#9932cc\",\n                \"darkred\": \"#8b0000\",\n                \"darksalmon\": \"#e9967a\",\n                \"darkseagreen\": \"#8fbc8f\",\n                \"darkslateblue\": \"#483d8b\",\n                \"darkslategray\": \"#2f4f4f\",\n                \"darkturquoise\": \"#00ced1\",\n                \"darkviolet\": \"#9400d3\",\n                \"deeppink\": \"#ff1493\",\n                \"deepskyblue\": \"#00bfff\",\n                \"dimgray\": \"#696969\",\n                \"dodgerblue\": \"#1e90ff\",\n                \"firebrick\": \"#b22222\",\n                \"floralwhite\": \"#fffaf0\",\n                \"forestgreen\": \"#228b22\",\n                \"fuchsia\": \"#ff00ff\",\n                \"gainsboro\": \"#dcdcdc\",\n                \"ghostwhite\": \"#f8f8ff\",\n                \"gold\": \"#ffd700\",\n                \"goldenrod\": \"#daa520\",\n                \"gray\": \"#808080\",\n                \"green\": \"#008000\",\n                \"greenyellow\": \"#adff2f\",\n                \"honeydew\": \"#f0fff0\",\n                \"hotpink\": \"#ff69b4\",\n                \"indianred \": \"#cd5c5c\",\n                \"indigo \": \"#4b0082\",\n                \"ivory\": \"#fffff0\",\n                \"khaki\": \"#f0e68c\",\n                \"lavender\": \"#e6e6fa\",\n                \"lavenderblush\": \"#fff0f5\",\n                \"lawngreen\": \"#7cfc00\",\n                \"lemonchiffon\": \"#fffacd\",\n                \"lightblue\": \"#add8e6\",\n                \"lightcoral\": \"#f08080\",\n                \"lightcyan\": \"#e0ffff\",\n                \"lightgoldenrodyellow\": \"#fafad2\",\n                \"lightgrey\": \"#d3d3d3\",\n                \"lightgreen\": \"#90ee90\",\n                \"lightpink\": \"#ffb6c1\",\n                \"lightsalmon\": \"#ffa07a\",\n                \"lightseagreen\": \"#20b2aa\",\n                \"lightskyblue\": \"#87cefa\",\n                \"lightslategray\": \"#778899\",\n                \"lightsteelblue\": \"#b0c4de\",\n                \"lightyellow\": \"#ffffe0\",\n                \"lime\": \"#00ff00\",\n                \"limegreen\": \"#32cd32\",\n                \"linen\": \"#faf0e6\",\n                \"magenta\": \"#ff00ff\",\n                \"maroon\": \"#800000\",\n                \"mediumaquamarine\": \"#66cdaa\",\n                \"mediumblue\": \"#0000cd\",\n                \"mediumorchid\": \"#ba55d3\",\n                \"mediumpurple\": \"#9370d8\",\n                \"mediumseagreen\": \"#3cb371\",\n                \"mediumslateblue\": \"#7b68ee\",\n                \"mediumspringgreen\": \"#00fa9a\",\n                \"mediumturquoise\": \"#48d1cc\",\n                \"mediumvioletred\": \"#c71585\",\n                \"midnightblue\": \"#191970\",\n                \"mintcream\": \"#f5fffa\",\n                \"mistyrose\": \"#ffe4e1\",\n                \"moccasin\": \"#ffe4b5\",\n                \"navajowhite\": \"#ffdead\",\n                \"navy\": \"#000080\",\n                \"oldlace\": \"#fdf5e6\",\n                \"olive\": \"#808000\",\n                \"olivedrab\": \"#6b8e23\",\n                \"orange\": \"#ffa500\",\n                \"orangered\": \"#ff4500\",\n                \"orchid\": \"#da70d6\",\n                \"palegoldenrod\": \"#eee8aa\",\n                \"palegreen\": \"#98fb98\",\n                \"paleturquoise\": \"#afeeee\",\n                \"palevioletred\": \"#d87093\",\n                \"papayawhip\": \"#ffefd5\",\n                \"peachpuff\": \"#ffdab9\",\n                \"peru\": \"#cd853f\",\n                \"pink\": \"#ffc0cb\",\n                \"plum\": \"#dda0dd\",\n                \"powderblue\": \"#b0e0e6\",\n                \"purple\": \"#800080\",\n                \"red\": \"#ff0000\",\n                \"rosybrown\": \"#bc8f8f\",\n                \"royalblue\": \"#4169e1\",\n                \"saddlebrown\": \"#8b4513\",\n                \"salmon\": \"#fa8072\",\n                \"sandybrown\": \"#f4a460\",\n                \"seagreen\": \"#2e8b57\",\n                \"seashell\": \"#fff5ee\",\n                \"sienna\": \"#a0522d\",\n                \"silver\": \"#c0c0c0\",\n                \"skyblue\": \"#87ceeb\",\n                \"slateblue\": \"#6a5acd\",\n                \"slategray\": \"#708090\",\n                \"snow\": \"#fffafa\",\n                \"springgreen\": \"#00ff7f\",\n                \"steelblue\": \"#4682b4\",\n                \"tan\": \"#d2b48c\",\n                \"teal\": \"#008080\",\n                \"thistle\": \"#d8bfd8\",\n                \"tomato\": \"#ff6347\",\n                \"turquoise\": \"#40e0d0\",\n                \"violet\": \"#ee82ee\",\n                \"wheat\": \"#f5deb3\",\n                \"white\": \"#ffffff\",\n                \"whitesmoke\": \"#f5f5f5\",\n                \"yellow\": \"#ffff00\",\n                \"yellowgreen\": \"#9acd32\"\n            };\n\n            if (typeof colors[name.toLowerCase()] !== 'undefined') {\n                return colors[name.toLowerCase()];\n            }\n            return false;\n        }\n    };\n\n\n    var defaults = {\n        horizontal: false, // horizontal mode layout ?\n        inline: false, //forces to show the colorpicker as an inline element\n        color: false, //forces a color\n        format: false, //forces a format\n        input: 'input', // children input selector\n        container: false, // container selector\n        component: '.add-on, .input-group-addon', // children component selector\n        sliders: {\n            saturation: {\n                maxLeft: 100,\n                maxTop: 100,\n                callLeft: 'setSaturation',\n                callTop: 'setBrightness'\n            },\n            hue: {\n                maxLeft: 0,\n                maxTop: 100,\n                callLeft: false,\n                callTop: 'setHue'\n            },\n            alpha: {\n                maxLeft: 0,\n                maxTop: 100,\n                callLeft: false,\n                callTop: 'setAlpha'\n            }\n        },\n        slidersHorz: {\n            saturation: {\n                maxLeft: 100,\n                maxTop: 100,\n                callLeft: 'setSaturation',\n                callTop: 'setBrightness'\n            },\n            hue: {\n                maxLeft: 100,\n                maxTop: 0,\n                callLeft: 'setHue',\n                callTop: false\n            },\n            alpha: {\n                maxLeft: 100,\n                maxTop: 0,\n                callLeft: 'setAlpha',\n                callTop: false\n            }\n        },\n        template: '<div class=\"colorpicker dropdown-menu\">' +\n            '<div class=\"colorpicker-saturation\"><i><b></b></i></div>' +\n            '<div class=\"colorpicker-hue\"><i></i></div>' +\n            '<div class=\"colorpicker-alpha\"><i></i></div>' +\n            '<div class=\"colorpicker-color\"><div /></div>' +\n            '</div>'\n    };\n\n    var Colorpicker = function(element, options) {\n        this.element = $(element).addClass('colorpicker-element');\n        this.options = $.extend({}, defaults, this.element.data(), options);\n        this.component = this.options.component;\n        this.component = (this.component !== false) ? this.element.find(this.component) : false;\n        if (this.component && (this.component.length === 0)) {\n            this.component = false;\n        }\n        this.container = (this.options.container === true) ? this.element : this.options.container;\n        this.container = (this.container !== false) ? $(this.container) : false;\n\n        // Is the element an input? Should we search inside for any input?\n        this.input = this.element.is('input') ? this.element : (this.options.input ?\n            this.element.find(this.options.input) : false);\n        if (this.input && (this.input.length === 0)) {\n            this.input = false;\n        }\n        // Set HSB color\n        this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());\n        this.format = this.options.format !== false ? this.options.format : this.color.origFormat;\n\n        // Setup picker\n        this.picker = $(this.options.template);\n        if (this.options.inline) {\n            this.picker.addClass('colorpicker-inline colorpicker-visible');\n        } else {\n            this.picker.addClass('colorpicker-hidden');\n        }\n        if (this.options.horizontal) {\n            this.picker.addClass('colorpicker-horizontal');\n        }\n        if (this.format === 'rgba' || this.format === 'hsla') {\n            this.picker.addClass('colorpicker-with-alpha');\n        }\n        this.picker.on('mousedown.colorpicker', $.proxy(this.mousedown, this));\n        this.picker.appendTo(this.container ? this.container : $('body'));\n\n        // Bind events\n        if (this.input !== false) {\n            this.input.on({\n                'keyup.colorpicker': $.proxy(this.keyup, this)\n            });\n            if (this.component === false) {\n                this.element.on({\n                    'focus.colorpicker': $.proxy(this.show, this)\n                });\n            }\n            if (this.options.inline === false) {\n                this.element.on({\n                    'focusout.colorpicker': $.proxy(this.hide, this)\n                });\n            }\n        }\n\n        if (this.component !== false) {\n            this.component.on({\n                'click.colorpicker': $.proxy(this.show, this)\n            });\n        }\n\n        if ((this.input === false) && (this.component === false)) {\n            this.element.on({\n                'click.colorpicker': $.proxy(this.show, this)\n            });\n        }\n        this.update();\n\n        $($.proxy(function() {\n            this.element.trigger('create');\n        }, this));\n    };\n\n    Colorpicker.version = '2.0.0-beta';\n\n    Colorpicker.Color = Color;\n\n    Colorpicker.prototype = {\n        constructor: Colorpicker,\n        destroy: function() {\n            this.picker.remove();\n            this.element.removeData('colorpicker').off('.colorpicker');\n            if (this.input !== false) {\n                this.input.off('.colorpicker');\n            }\n            if (this.component !== false) {\n                this.component.off('.colorpicker');\n            }\n            this.element.removeClass('colorpicker-element');\n            this.element.trigger({\n                type: 'destroy'\n            });\n        },\n        reposition: function() {\n            if (this.options.inline !== false) {\n                return false;\n            }\n            var offset = this.component ? this.component.offset() : this.element.offset();\n            this.picker.css({\n                top: offset.top + (this.component ? this.component.outerHeight() : this.element.outerHeight()),\n                left: offset.left\n            });\n        },\n        show: function(e) {\n            if (this.isDisabled()) {\n                return false;\n            }\n            this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');\n            this.reposition();\n            $(window).on('resize.colorpicker', $.proxy(this.reposition, this));\n            if (!this.hasInput() && e) {\n                if (e.stopPropagation && e.preventDefault) {\n                    e.stopPropagation();\n                    e.preventDefault();\n                }\n            }\n            if (this.options.inline === false) {\n                $(window.document).on({\n                    'mousedown.colorpicker': $.proxy(this.hide, this)\n                });\n            }\n            this.element.trigger({\n                type: 'showPicker',\n                color: this.color\n            });\n        },\n        hide: function() {\n            this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');\n            $(window).off('resize.colorpicker', this.reposition);\n            $(document).off({\n                'mousedown.colorpicker': this.hide\n            });\n            this.update();\n            this.element.trigger({\n                type: 'hidePicker',\n                color: this.color\n            });\n        },\n        updateData: function(val) {\n            val = val ||  this.color.toString(this.format);\n            this.element.data('color', val);\n            return val;\n        },\n        updateInput: function(val) {\n            val = val ||  this.color.toString(this.format);\n            if (this.input !== false) {\n                this.input.prop('value', val);\n            }\n            return val;\n        },\n        updatePicker: function(val) {\n            if (val !== undefined) {\n                this.color = new Color(val);\n            }\n            var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;\n            var icns = this.picker.find('i');\n            if (icns.length === 0) {\n                return;\n            }\n            if (this.options.horizontal === false) {\n                sl = this.options.sliders;\n                icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()\n                    .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));\n            } else {\n                sl = this.options.slidersHorz;\n                icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()\n                    .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));\n            }\n            icns.eq(0).css({\n                'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,\n                'left': this.color.value.s * sl.saturation.maxLeft\n            });\n            this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));\n            this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());\n            this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));\n            return val;\n        },\n        updateComponent: function(val) {\n            val = val ||  this.color.toString(this.format);\n            if (this.component !== false) {\n                var icn = this.component.find('i').eq(0);\n                if (icn.length > 0) {\n                    icn.css({\n                        'backgroundColor': val\n                    });\n                } else {\n                    this.component.css({\n                        'backgroundColor': val\n                    });\n                }\n            }\n            return val;\n        },\n        update: function(force) {\n            var val = this.updateComponent();\n            if ((this.getValue(false) !== false) || (force === true)) {\n                // Update input/data only if the current value is not blank\n                this.updateInput(val);\n                this.updateData(val);\n            }\n            this.updatePicker();\n            return val;\n\n        },\n        setValue: function(val) { // set color manually\n            this.color = new Color(val);\n            this.update();\n            this.element.trigger({\n                type: 'changeColor',\n                color: this.color,\n                value: val\n            });\n        },\n        getValue: function(defaultValue) {\n            defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;\n            var val;\n            if (this.hasInput()) {\n                val = this.input.val();\n            } else {\n                val = this.element.data('color');\n            }\n            if ((val === undefined) || (val === '') || (val === null)) {\n                // if not defined or empty, return default\n                val = defaultValue;\n            }\n            return val;\n        },\n        hasInput: function() {\n            return (this.input !== false);\n        },\n        isDisabled: function() {\n            if (this.hasInput()) {\n                return (this.input.prop('disabled') === true);\n            }\n            return false;\n        },\n        disable: function() {\n            if (this.hasInput()) {\n                this.input.prop('disabled', true);\n                return true;\n            }\n            return false;\n        },\n        enable: function() {\n            if (this.hasInput()) {\n                this.input.prop('disabled', false);\n                return true;\n            }\n            return false;\n        },\n        currentSlider: null,\n        mousePointer: {\n            left: 0,\n            top: 0\n        },\n        mousedown: function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n\n            var target = $(e.target);\n\n            //detect the slider and set the limits and callbacks\n            var zone = target.closest('div');\n            var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;\n            if (!zone.is('.colorpicker')) {\n                if (zone.is('.colorpicker-saturation')) {\n                    this.currentSlider = $.extend({}, sl.saturation);\n                } else if (zone.is('.colorpicker-hue')) {\n                    this.currentSlider = $.extend({}, sl.hue);\n                } else if (zone.is('.colorpicker-alpha')) {\n                    this.currentSlider = $.extend({}, sl.alpha);\n                } else {\n                    return false;\n                }\n                var offset = zone.offset();\n                //reference to guide's style\n                this.currentSlider.guide = zone.find('i')[0].style;\n                this.currentSlider.left = e.pageX - offset.left;\n                this.currentSlider.top = e.pageY - offset.top;\n                this.mousePointer = {\n                    left: e.pageX,\n                    top: e.pageY\n                };\n                //trigger mousemove to move the guide to the current position\n                $(document).on({\n                    'mousemove.colorpicker': $.proxy(this.mousemove, this),\n                    'mouseup.colorpicker': $.proxy(this.mouseup, this)\n                }).trigger('mousemove');\n            }\n            return false;\n        },\n        mousemove: function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            var left = Math.max(\n                0,\n                Math.min(\n                    this.currentSlider.maxLeft,\n                    this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)\n                )\n            );\n            var top = Math.max(\n                0,\n                Math.min(\n                    this.currentSlider.maxTop,\n                    this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)\n                )\n            );\n            this.currentSlider.guide.left = left + 'px';\n            this.currentSlider.guide.top = top + 'px';\n            if (this.currentSlider.callLeft) {\n                this.color[this.currentSlider.callLeft].call(this.color, left / 100);\n            }\n            if (this.currentSlider.callTop) {\n                this.color[this.currentSlider.callTop].call(this.color, top / 100);\n            }\n            this.update(true);\n\n            this.element.trigger({\n                type: 'changeColor',\n                color: this.color\n            });\n            return false;\n        },\n        mouseup: function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            $(document).off({\n                'mousemove.colorpicker': this.mousemove,\n                'mouseup.colorpicker': this.mouseup\n            });\n            return false;\n        },\n        keyup: function(e) {\n            if ((e.keyCode === 38)) {\n                if (this.color.value.a < 1) {\n                    this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;\n                }\n                this.update(true);\n            } else if ((e.keyCode === 40)) {\n                if (this.color.value.a > 0) {\n                    this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;\n                }\n                this.update(true);\n            } else {\n                var val = this.input.val();\n                this.color = new Color(val);\n                if (this.getValue(false) !== false) {\n                    this.updateData();\n                    this.updateComponent();\n                    this.updatePicker();\n                }\n            }\n            this.element.trigger({\n                type: 'changeColor',\n                color: this.color,\n                value: val\n            });\n        }\n    };\n\n    $.colorpicker = Colorpicker;\n\n    $.fn.colorpicker = function(option) {\n        return this.each(function() {\n            var $this = $(this),\n                inst = $this.data('colorpicker'),\n                options = ((typeof option === 'object') ? option : {});\n            if ((!inst) && (typeof option !== 'string')) {\n                $this.data('colorpicker', new Colorpicker(this, options));\n            } else {\n                if (typeof option === 'string') {\n                    inst[option].apply(inst, Array.prototype.slice.call(arguments, 1));\n                }\n            }\n        });\n    };\n\n    $.fn.colorpicker.constructor = Colorpicker;\n\n})(window.jQuery);\n","/**\n * @author zhixin wen <wenzhixin2010@gmail.com>\n * version: 1.9.1\n * https://github.com/wenzhixin/bootstrap-table/\n */\n\n!function ($) {\n    'use strict';\n\n    // TOOLS DEFINITION\n    // ======================\n\n    var cachedWidth = null;\n\n    // it only does '%s', and return '' when arguments are undefined\n    var sprintf = function (str) {\n        var args = arguments,\n            flag = true,\n            i = 1;\n\n        str = str.replace(/%s/g, function () {\n            var arg = args[i++];\n\n            if (typeof arg === 'undefined') {\n                flag = false;\n                return '';\n            }\n            return arg;\n        });\n        return flag ? str : '';\n    };\n\n    var getPropertyFromOther = function (list, from, to, value) {\n        var result = '';\n        $.each(list, function (i, item) {\n            if (item[from] === value) {\n                result = item[to];\n                return false;\n            }\n            return true;\n        });\n        return result;\n    };\n\n    var getFieldIndex = function (columns, field) {\n        var index = -1;\n\n        $.each(columns, function (i, column) {\n            if (column.field === field) {\n                index = i;\n                return false;\n            }\n            return true;\n        });\n        return index;\n    };\n\n    // http://jsfiddle.net/wenyi/47nz7ez9/3/\n    var setFieldIndex = function (columns) {\n        var i, j, k,\n            totalCol = 0,\n            flag = [];\n\n        for (i = 0; i < columns[0].length; i++) {\n            totalCol += columns[0][i].colspan || 1;\n        }\n\n        for (i = 0; i < columns.length; i++) {\n            flag[i] = [];\n            for (j = 0; j < totalCol; j++) {\n                flag[i][j] = false;\n            }\n        }\n\n        for (i = 0; i < columns.length; i++) {\n            for (j = 0; j < columns[i].length; j++) {\n                var r = columns[i][j],\n                    rowspan = r.rowspan || 1,\n                    colspan = r.colspan || 1,\n                    index = $.inArray(false, flag[i]);\n\n                if (colspan === 1) {\n                    r.fieldIndex = index;\n                    // when field is undefined, use index instead\n                    if (typeof r.field === 'undefined') {\n                        r.field = index;\n                    }\n                }\n\n                for (k = 0; k < rowspan; k++) {\n                    flag[i + k][index] = true;\n                }\n                for (k = 0; k < colspan; k++) {\n                    flag[i][index + k] = true;\n                }\n            }\n        }\n    };\n\n    var getScrollBarWidth = function () {\n        if (cachedWidth === null) {\n            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),\n                outer = $('<div/>').addClass('fixed-table-scroll-outer'),\n                w1, w2;\n\n            outer.append(inner);\n            $('body').append(outer);\n\n            w1 = inner[0].offsetWidth;\n            outer.css('overflow', 'scroll');\n            w2 = inner[0].offsetWidth;\n\n            if (w1 === w2) {\n                w2 = outer[0].clientWidth;\n            }\n\n            outer.remove();\n            cachedWidth = w1 - w2;\n        }\n        return cachedWidth;\n    };\n\n    var calculateObjectValue = function (self, name, args, defaultValue) {\n        var func = name;\n\n        if (typeof name === 'string') {\n            // support obj.func1.func2\n            var names = name.split('.');\n\n            if (names.length > 1) {\n                func = window;\n                $.each(names, function (i, f) {\n                    func = func[f];\n                });\n            } else {\n                func = window[name];\n            }\n        }\n        if (typeof func === 'object') {\n            return func;\n        }\n        if (typeof func === 'function') {\n            return func.apply(self, args);\n        }\n        if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {\n            return sprintf.apply(this, [name].concat(args));\n        }\n        return defaultValue;\n    };\n\n    var compareObjects = function (objectA, objectB, compareLength) {\n        // Create arrays of property names\n        var objectAProperties = Object.getOwnPropertyNames(objectA),\n            objectBProperties = Object.getOwnPropertyNames(objectB),\n            propName = '';\n\n        if (compareLength) {\n            // If number of properties is different, objects are not equivalent\n            if (objectAProperties.length !== objectBProperties.length) {\n                return false;\n            }\n        }\n\n        for (var i = 0; i < objectAProperties.length; i++) {\n            propName = objectAProperties[i];\n\n            // If the property is not in the object B properties, continue with the next property\n            if ($.inArray(propName, objectBProperties) > -1) {\n                // If values of same property are not equal, objects are not equivalent\n                if (objectA[propName] !== objectB[propName]) {\n                    return false;\n                }\n            }\n        }\n\n        // If we made it this far, objects are considered equivalent\n        return true;\n    };\n\n    var escapeHTML = function (text) {\n        if (typeof text === 'string') {\n            return text\n                .replace(/&/g, \"&amp;\")\n                .replace(/</g, \"&lt;\")\n                .replace(/>/g, \"&gt;\")\n                .replace(/\"/g, \"&quot;\")\n                .replace(/'/g, \"&#039;\");\n        }\n        return text;\n    };\n\n    var getRealHeight = function ($el) {\n        var height = 0;\n        $el.children().each(function () {\n            if (height < $(this).outerHeight(true)) {\n                height = $(this).outerHeight(true);\n            }\n        });\n        return height;\n    };\n\n    var getRealDataAttr = function (dataAttr) {\n        for (var attr in dataAttr) {\n            var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();\n            if (auxAttr !== attr) {\n                dataAttr[auxAttr] = dataAttr[attr];\n                delete dataAttr[attr];\n            }\n        }\n\n        return dataAttr;\n    };\n\n    var getItemField = function (item, field) {\n        var value = item;\n\n        if (typeof field !== 'string' || item.hasOwnProperty(field)) {\n            return item[field];\n        }\n        var props = field.split('.');\n        for (var p in props) {\n            value = value[props[p]];\n        }\n        return value;\n    };\n\n    // BOOTSTRAP TABLE CLASS DEFINITION\n    // ======================\n\n    var BootstrapTable = function (el, options) {\n        this.options = options;\n        this.$el = $(el);\n        this.$el_ = this.$el.clone();\n        this.timeoutId_ = 0;\n        this.timeoutFooter_ = 0;\n\n        this.init();\n    };\n\n    BootstrapTable.DEFAULTS = {\n        classes: 'table table-hover',\n        locale: undefined,\n        height: undefined,\n        undefinedText: '-',\n        sortName: undefined,\n        sortOrder: 'asc',\n        striped: false,\n        columns: [[]],\n        data: [],\n        dataField: 'rows',\n        method: 'get',\n        url: undefined,\n        ajax: undefined,\n        cache: true,\n        contentType: 'application/json',\n        dataType: 'json',\n        ajaxOptions: {},\n        queryParams: function (params) {\n            return params;\n        },\n        queryParamsType: 'limit', // undefined\n        responseHandler: function (res) {\n            return res;\n        },\n        pagination: false,\n        onlyInfoPagination: false,\n        sidePagination: 'client', // client or server\n        totalRows: 0, // server side need to set\n        pageNumber: 1,\n        pageSize: 10,\n        pageList: [10, 25, 50, 100],\n        paginationHAlign: 'right', //right, left\n        paginationVAlign: 'bottom', //bottom, top, both\n        paginationDetailHAlign: 'left', //right, left\n        paginationFirstText: '&laquo;',\n        paginationPreText: '&lsaquo;',\n        paginationNextText: '&rsaquo;',\n        paginationLastText: '&raquo;',\n        search: false,\n        strictSearch: false,\n        searchAlign: 'right',\n        selectItemName: 'btSelectItem',\n        showHeader: true,\n        showFooter: false,\n        showColumns: false,\n        showPaginationSwitch: false,\n        showRefresh: false,\n        showToggle: false,\n        buttonsAlign: 'right',\n        smartDisplay: true,\n        minimumCountColumns: 1,\n        idField: undefined,\n        uniqueId: undefined,\n        cardView: false,\n        detailView: false,\n        detailFormatter: function (index, row) {\n            return '';\n        },\n        trimOnSearch: true,\n        clickToSelect: false,\n        singleSelect: false,\n        toolbar: undefined,\n        toolbarAlign: 'left',\n        checkboxHeader: true,\n        sortable: true,\n        silentSort: true,\n        maintainSelected: false,\n        searchTimeOut: 500,\n        searchText: '',\n        iconSize: undefined,\n        iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome)\n        icons: {\n            paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',\n            paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',\n            refresh: 'glyphicon-refresh icon-refresh',\n            toggle: 'glyphicon-list-alt icon-list-alt',\n            columns: 'glyphicon-th icon-th',\n            detailOpen: 'glyphicon-plus icon-plus',\n            detailClose: 'glyphicon-minus icon-minus'\n        },\n\n        rowStyle: function (row, index) {\n            return {};\n        },\n\n        rowAttributes: function (row, index) {\n            return {};\n        },\n\n        onAll: function (name, args) {\n            return false;\n        },\n        onClickCell: function (field, value, row, $element) {\n            return false;\n        },\n        onDblClickCell: function (field, value, row, $element) {\n            return false;\n        },\n        onClickRow: function (item, $element) {\n            return false;\n        },\n        onDblClickRow: function (item, $element) {\n            return false;\n        },\n        onSort: function (name, order) {\n            return false;\n        },\n        onCheck: function (row) {\n            return false;\n        },\n        onUncheck: function (row) {\n            return false;\n        },\n        onCheckAll: function (rows) {\n            return false;\n        },\n        onUncheckAll: function (rows) {\n            return false;\n        },\n        onCheckSome: function (rows) {\n            return false;\n        },\n        onUncheckSome: function (rows) {\n            return false;\n        },\n        onLoadSuccess: function (data) {\n            return false;\n        },\n        onLoadError: function (status) {\n            return false;\n        },\n        onColumnSwitch: function (field, checked) {\n            return false;\n        },\n        onPageChange: function (number, size) {\n            return false;\n        },\n        onSearch: function (text) {\n            return false;\n        },\n        onToggle: function (cardView) {\n            return false;\n        },\n        onPreBody: function (data) {\n            return false;\n        },\n        onPostBody: function () {\n            return false;\n        },\n        onPostHeader: function () {\n            return false;\n        },\n        onExpandRow: function (index, row, $detail) {\n            return false;\n        },\n        onCollapseRow: function (index, row) {\n            return false;\n        },\n        onRefreshOptions: function (options) {\n            return false;\n        },\n        onResetView: function () {\n            return false;\n        }\n    };\n\n    BootstrapTable.LOCALES = [];\n\n    BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {\n        formatLoadingMessage: function () {\n            return 'Loading, please wait...';\n        },\n        formatRecordsPerPage: function (pageNumber) {\n            return sprintf('%s records per page', pageNumber);\n        },\n        formatShowingRows: function (pageFrom, pageTo, totalRows) {\n            return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows);\n        },\n        formatDetailPagination: function (totalRows) {\n            return sprintf('Showing %s rows', totalRows);\n        },\n        formatSearch: function () {\n            return 'Search';\n        },\n        formatNoMatches: function () {\n            return 'No matching records found';\n        },\n        formatPaginationSwitch: function () {\n            return 'Hide/Show pagination';\n        },\n        formatRefresh: function () {\n            return 'Refresh';\n        },\n        formatToggle: function () {\n            return 'Toggle';\n        },\n        formatColumns: function () {\n            return 'Columns';\n        },\n        formatAllRows: function () {\n            return 'All';\n        }\n    };\n\n    $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']);\n\n    BootstrapTable.COLUMN_DEFAULTS = {\n        radio: false,\n        checkbox: false,\n        checkboxEnabled: true,\n        field: undefined,\n        title: undefined,\n        titleTooltip: undefined,\n        'class': undefined,\n        align: undefined, // left, right, center\n        halign: undefined, // left, right, center\n        falign: undefined, // left, right, center\n        valign: undefined, // top, middle, bottom\n        width: undefined,\n        sortable: false,\n        order: 'asc', // asc, desc\n        visible: true,\n        switchable: true,\n        clickToSelect: true,\n        formatter: undefined,\n        footerFormatter: undefined,\n        events: undefined,\n        sorter: undefined,\n        sortName: undefined,\n        cellStyle: undefined,\n        searchable: true,\n        searchFormatter: true,\n        cardVisible: true\n    };\n\n    BootstrapTable.EVENTS = {\n        'all.bs.table': 'onAll',\n        'click-cell.bs.table': 'onClickCell',\n        'dbl-click-cell.bs.table': 'onDblClickCell',\n        'click-row.bs.table': 'onClickRow',\n        'dbl-click-row.bs.table': 'onDblClickRow',\n        'sort.bs.table': 'onSort',\n        'check.bs.table': 'onCheck',\n        'uncheck.bs.table': 'onUncheck',\n        'check-all.bs.table': 'onCheckAll',\n        'uncheck-all.bs.table': 'onUncheckAll',\n        'check-some.bs.table': 'onCheckSome',\n        'uncheck-some.bs.table': 'onUncheckSome',\n        'load-success.bs.table': 'onLoadSuccess',\n        'load-error.bs.table': 'onLoadError',\n        'column-switch.bs.table': 'onColumnSwitch',\n        'page-change.bs.table': 'onPageChange',\n        'search.bs.table': 'onSearch',\n        'toggle.bs.table': 'onToggle',\n        'pre-body.bs.table': 'onPreBody',\n        'post-body.bs.table': 'onPostBody',\n        'post-header.bs.table': 'onPostHeader',\n        'expand-row.bs.table': 'onExpandRow',\n        'collapse-row.bs.table': 'onCollapseRow',\n        'refresh-options.bs.table': 'onRefreshOptions',\n        'reset-view.bs.table': 'onResetView'\n    };\n\n    BootstrapTable.prototype.init = function () {\n        this.initLocale();\n        this.initContainer();\n        this.initTable();\n        this.initHeader();\n        this.initData();\n        this.initFooter();\n        this.initToolbar();\n        this.initPagination();\n        this.initBody();\n        this.initSearchText();\n        this.initServer();\n    };\n\n    BootstrapTable.prototype.initLocale = function () {\n        if (this.options.locale) {\n            var parts = this.options.locale.split(/-|_/);\n            parts[0].toLowerCase();\n            parts[1] && parts[1].toUpperCase();\n            if ($.fn.bootstrapTable.locales[this.options.locale]) {\n                // locale as requested\n                $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);\n            } else if ($.fn.bootstrapTable.locales[parts.join('-')]) {\n                // locale with sep set to - (in case original was specified with _)\n                $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);\n            } else if ($.fn.bootstrapTable.locales[parts[0]]) {\n                // short locale language code (i.e. 'en')\n                $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);\n            }\n        }\n    };\n\n    BootstrapTable.prototype.initContainer = function () {\n        this.$container = $([\n            '<div class=\"bootstrap-table\">',\n            '<div class=\"fixed-table-toolbar\"></div>',\n            this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?\n                '<div class=\"fixed-table-pagination\" style=\"clear: both;\"></div>' :\n                '',\n            '<div class=\"fixed-table-container\">',\n            '<div class=\"fixed-table-header\"><table></table></div>',\n            '<div class=\"fixed-table-body\">',\n            '<div class=\"fixed-table-loading\">',\n            this.options.formatLoadingMessage(),\n            '</div>',\n            '</div>',\n            '<div class=\"fixed-table-footer\"><table><tr></tr></table></div>',\n            this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?\n                '<div class=\"fixed-table-pagination\"></div>' :\n                '',\n            '</div>',\n            '</div>'\n        ].join(''));\n\n        this.$container.insertAfter(this.$el);\n        this.$tableContainer = this.$container.find('.fixed-table-container');\n        this.$tableHeader = this.$container.find('.fixed-table-header');\n        this.$tableBody = this.$container.find('.fixed-table-body');\n        this.$tableLoading = this.$container.find('.fixed-table-loading');\n        this.$tableFooter = this.$container.find('.fixed-table-footer');\n        this.$toolbar = this.$container.find('.fixed-table-toolbar');\n        this.$pagination = this.$container.find('.fixed-table-pagination');\n\n        this.$tableBody.append(this.$el);\n        this.$container.after('<div class=\"clearfix\"></div>');\n\n        this.$el.addClass(this.options.classes);\n        if (this.options.striped) {\n            this.$el.addClass('table-striped');\n        }\n        if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) {\n            this.$tableContainer.addClass('table-no-bordered');\n        }\n    };\n\n    BootstrapTable.prototype.initTable = function () {\n        var that = this,\n            columns = [],\n            data = [];\n\n        this.$header = this.$el.find('>thead');\n        if (!this.$header.length) {\n            this.$header = $('<thead></thead>').appendTo(this.$el);\n        }\n        this.$header.find('tr').each(function () {\n            var column = [];\n\n            $(this).find('th').each(function () {\n                column.push($.extend({}, {\n                    title: $(this).html(),\n                    'class': $(this).attr('class'),\n                    titleTooltip: $(this).attr('title'),\n                    rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,\n                    colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined\n                }, $(this).data()));\n            });\n            columns.push(column);\n        });\n        if (!$.isArray(this.options.columns[0])) {\n            this.options.columns = [this.options.columns];\n        }\n        this.options.columns = $.extend(true, [], columns, this.options.columns);\n        this.columns = [];\n\n        setFieldIndex(this.options.columns);\n        $.each(this.options.columns, function (i, columns) {\n            $.each(columns, function (j, column) {\n                column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column);\n\n                if (typeof column.fieldIndex !== 'undefined') {\n                    that.columns[column.fieldIndex] = column;\n                }\n\n                that.options.columns[i][j] = column;\n            });\n        });\n\n        // if options.data is setting, do not process tbody data\n        if (this.options.data.length) {\n            return;\n        }\n\n        this.$el.find('>tbody>tr').each(function () {\n            var row = {};\n\n            // save tr's id, class and data-* attributes\n            row._id = $(this).attr('id');\n            row._class = $(this).attr('class');\n            row._data = getRealDataAttr($(this).data());\n\n            $(this).find('td').each(function (i) {\n                var field = that.columns[i].field;\n\n                row[field] = $(this).html();\n                // save td's id, class and data-* attributes\n                row['_' + field + '_id'] = $(this).attr('id');\n                row['_' + field + '_class'] = $(this).attr('class');\n                row['_' + field + '_rowspan'] = $(this).attr('rowspan');\n                row['_' + field + '_title'] = $(this).attr('title');\n                row['_' + field + '_data'] = getRealDataAttr($(this).data());\n            });\n            data.push(row);\n        });\n        this.options.data = data;\n    };\n\n    BootstrapTable.prototype.initHeader = function () {\n        var that = this,\n            visibleColumns = {},\n            html = [];\n\n        this.header = {\n            fields: [],\n            styles: [],\n            classes: [],\n            formatters: [],\n            events: [],\n            sorters: [],\n            sortNames: [],\n            cellStyles: [],\n            searchables: []\n        };\n\n        $.each(this.options.columns, function (i, columns) {\n            html.push('<tr>');\n\n            if (i == 0 && !that.options.cardView && that.options.detailView) {\n                html.push(sprintf('<th class=\"detail\" rowspan=\"%s\"><div class=\"fht-cell\"></div></th>',\n                    that.options.columns.length));\n            }\n\n            $.each(columns, function (j, column) {\n                var text = '',\n                    halign = '', // header align style\n                    align = '', // body align style\n                    style = '',\n                    class_ = sprintf(' class=\"%s\"', column['class']),\n                    order = that.options.sortOrder || column.order,\n                    unitWidth = 'px',\n                    width = column.width;\n\n                if (column.width !== undefined && (!that.options.cardView)) {\n                    if (typeof column.width === 'string') {\n                        if (column.width.indexOf('%') !== -1) {\n                            unitWidth = '%';\n                        }\n                    }\n                }\n                if (column.width && typeof column.width === 'string') {\n                    width = column.width.replace('%', '').replace('px', '');\n                }\n\n                halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align);\n                align = sprintf('text-align: %s; ', column.align);\n                style = sprintf('vertical-align: %s; ', column.valign);\n                style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ?\n                    '36px' : (width ? width + unitWidth : undefined));\n\n                if (typeof column.fieldIndex !== 'undefined') {\n                    that.header.fields[column.fieldIndex] = column.field;\n                    that.header.styles[column.fieldIndex] = align + style;\n                    that.header.classes[column.fieldIndex] = class_;\n                    that.header.formatters[column.fieldIndex] = column.formatter;\n                    that.header.events[column.fieldIndex] = column.events;\n                    that.header.sorters[column.fieldIndex] = column.sorter;\n                    that.header.sortNames[column.fieldIndex] = column.sortName;\n                    that.header.cellStyles[column.fieldIndex] = column.cellStyle;\n                    that.header.searchables[column.fieldIndex] = column.searchable;\n\n                    if (!column.visible) {\n                        return;\n                    }\n\n                    if (that.options.cardView && (!column.cardVisible)) {\n                        return;\n                    }\n\n                    visibleColumns[column.field] = column;\n                }\n\n                html.push('<th' + sprintf(' title=\"%s\"', column.titleTooltip),\n                    column.checkbox || column.radio ?\n                        sprintf(' class=\"bs-checkbox %s\"', column['class'] || '') :\n                        class_,\n                    sprintf(' style=\"%s\"', halign + style),\n                    sprintf(' rowspan=\"%s\"', column.rowspan),\n                    sprintf(' colspan=\"%s\"', column.colspan),\n                    sprintf(' data-field=\"%s\"', column.field),\n                    \"tabindex='0'\",\n                    '>');\n\n                html.push(sprintf('<div class=\"th-inner %s\">', that.options.sortable && column.sortable ?\n                    'sortable both' : ''));\n\n                text = column.title;\n\n                if (column.checkbox) {\n                    if (!that.options.singleSelect && that.options.checkboxHeader) {\n                        text = '<input name=\"btSelectAll\" type=\"checkbox\" />';\n                    }\n                    that.header.stateField = column.field;\n                }\n                if (column.radio) {\n                    text = '';\n                    that.header.stateField = column.field;\n                    that.options.singleSelect = true;\n                }\n\n                html.push(text);\n                html.push('</div>');\n                html.push('<div class=\"fht-cell\"></div>');\n                html.push('</div>');\n                html.push('</th>');\n            });\n            html.push('</tr>');\n        });\n\n        this.$header.html(html.join(''));\n        this.$header.find('th[data-field]').each(function (i) {\n            $(this).data(visibleColumns[$(this).data('field')]);\n        });\n        this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {\n            if (that.options.sortable && $(this).parent().data().sortable) {\n                that.onSort(event);\n            }\n        });\n\n        this.$header.children().children().off('keypress').on('keypress', function (event) {\n            if (that.options.sortable && $(this).data().sortable) {\n                var code = event.keyCode || event.which;\n                if (code == 13) { //Enter keycode\n                    that.onSort(event);\n                }\n            }\n        });\n\n        if (!this.options.showHeader || this.options.cardView) {\n            this.$header.hide();\n            this.$tableHeader.hide();\n            this.$tableLoading.css('top', 0);\n        } else {\n            this.$header.show();\n            this.$tableHeader.show();\n            this.$tableLoading.css('top', this.$header.outerHeight() + 1);\n            // Assign the correct sortable arrow\n            this.getCaret();\n        }\n\n        this.$selectAll = this.$header.find('[name=\"btSelectAll\"]');\n        this.$container.off('click', '[name=\"btSelectAll\"]')\n            .on('click', '[name=\"btSelectAll\"]', function () {\n                var checked = $(this).prop('checked');\n                that[checked ? 'checkAll' : 'uncheckAll']();\n                that.updateSelected();\n            });\n    };\n\n    BootstrapTable.prototype.initFooter = function () {\n        if (!this.options.showFooter || this.options.cardView) {\n            this.$tableFooter.hide();\n        } else {\n            this.$tableFooter.show();\n        }\n    };\n\n    /**\n     * @param data\n     * @param type: append / prepend\n     */\n    BootstrapTable.prototype.initData = function (data, type) {\n        if (type === 'append') {\n            this.data = this.data.concat(data);\n        } else if (type === 'prepend') {\n            this.data = [].concat(data).concat(this.data);\n        } else {\n            this.data = data || this.options.data;\n        }\n\n        // Fix #839 Records deleted when adding new row on filtered table\n        if (type === 'append') {\n            this.options.data = this.options.data.concat(data);\n        } else if (type === 'prepend') {\n            this.options.data = [].concat(data).concat(this.options.data);\n        } else {\n            this.options.data = this.data;\n        }\n\n        if (this.options.sidePagination === 'server') {\n            return;\n        }\n        this.initSort();\n    };\n\n    BootstrapTable.prototype.initSort = function () {\n        var that = this,\n            name = this.options.sortName,\n            order = this.options.sortOrder === 'desc' ? -1 : 1,\n            index = $.inArray(this.options.sortName, this.header.fields);\n\n        if (index !== -1) {\n            this.data.sort(function (a, b) {\n                if (that.header.sortNames[index]) {\n                    name = that.header.sortNames[index];\n                }\n                var aa = getItemField(a, name),\n                    bb = getItemField(b, name),\n                    value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]);\n\n                if (value !== undefined) {\n                    return order * value;\n                }\n\n                // Fix #161: undefined or null string sort bug.\n                if (aa === undefined || aa === null) {\n                    aa = '';\n                }\n                if (bb === undefined || bb === null) {\n                    bb = '';\n                }\n\n                // IF both values are numeric, do a numeric comparison\n                if ($.isNumeric(aa) && $.isNumeric(bb)) {\n                    // Convert numerical values form string to float.\n                    aa = parseFloat(aa);\n                    bb = parseFloat(bb);\n                    if (aa < bb) {\n                        return order * -1;\n                    }\n                    return order;\n                }\n\n                if (aa === bb) {\n                    return 0;\n                }\n\n                // If value is not a string, convert to string\n                if (typeof aa !== 'string') {\n                    aa = aa.toString();\n                }\n\n                if (aa.localeCompare(bb) === -1) {\n                    return order * -1;\n                }\n\n                return order;\n            });\n        }\n    };\n\n    BootstrapTable.prototype.onSort = function (event) {\n        var $this = event.type === \"keypress\" ? $(event.currentTarget) : $(event.currentTarget).parent(),\n            $this_ = this.$header.find('th').eq($this.index());\n\n        this.$header.add(this.$header_).find('span.order').remove();\n\n        if (this.options.sortName === $this.data('field')) {\n            this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';\n        } else {\n            this.options.sortName = $this.data('field');\n            this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';\n        }\n        this.trigger('sort', this.options.sortName, this.options.sortOrder);\n\n        $this.add($this_).data('order', this.options.sortOrder);\n\n        // Assign the correct sortable arrow\n        this.getCaret();\n\n        if (this.options.sidePagination === 'server') {\n            this.initServer(this.options.silentSort);\n            return;\n        }\n\n        this.initSort();\n        this.initBody();\n    };\n\n    BootstrapTable.prototype.initToolbar = function () {\n        var that = this,\n            html = [],\n            timeoutId = 0,\n            $keepOpen,\n            $search,\n            switchableCount = 0;\n\n        this.$toolbar.html('');\n\n        if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {\n            $(sprintf('<div class=\"bars pull-%s\"></div>', this.options.toolbarAlign))\n                .appendTo(this.$toolbar)\n                .append($(this.options.toolbar));\n        }\n\n        // showColumns, showToggle, showRefresh\n        html = [sprintf('<div class=\"columns columns-%s btn-group pull-%s\">',\n            this.options.buttonsAlign, this.options.buttonsAlign)];\n\n        if (typeof this.options.icons === 'string') {\n            this.options.icons = calculateObjectValue(null, this.options.icons);\n        }\n\n        if (this.options.showPaginationSwitch) {\n            html.push(sprintf('<button class=\"btn btn-default\" type=\"button\" name=\"paginationSwitch\" title=\"%s\">',\n                    this.options.formatPaginationSwitch()),\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),\n                '</button>');\n        }\n\n        if (this.options.showRefresh) {\n            html.push(sprintf('<button class=\"btn btn-default' +\n                    sprintf(' btn-%s', this.options.iconSize) +\n                    '\" type=\"button\" name=\"refresh\" title=\"%s\">',\n                    this.options.formatRefresh()),\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.refresh),\n                '</button>');\n        }\n\n        if (this.options.showToggle) {\n            html.push(sprintf('<button class=\"btn btn-default' +\n                    sprintf(' btn-%s', this.options.iconSize) +\n                    '\" type=\"button\" name=\"toggle\" title=\"%s\">',\n                    this.options.formatToggle()),\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.toggle),\n                '</button>');\n        }\n\n        if (this.options.showColumns) {\n            html.push(sprintf('<div class=\"keep-open btn-group\" title=\"%s\">',\n                    this.options.formatColumns()),\n                '<button type=\"button\" class=\"btn btn-default' +\n                sprintf(' btn-%s', this.options.iconSize) +\n                ' dropdown-toggle\" data-toggle=\"dropdown\">',\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.columns),\n                ' <span class=\"caret\"></span>',\n                '</button>',\n                '<ul class=\"dropdown-menu\" role=\"menu\">');\n\n            $.each(this.columns, function (i, column) {\n                if (column.radio || column.checkbox) {\n                    return;\n                }\n\n                if (that.options.cardView && (!column.cardVisible)) {\n                    return;\n                }\n\n                var checked = column.visible ? ' checked=\"checked\"' : '';\n\n                if (column.switchable) {\n                    html.push(sprintf('<li>' +\n                        '<label><input type=\"checkbox\" data-field=\"%s\" value=\"%s\"%s> %s</label>' +\n                        '</li>', column.field, i, checked, column.title));\n                    switchableCount++;\n                }\n            });\n            html.push('</ul>',\n                '</div>');\n        }\n\n        html.push('</div>');\n\n        // Fix #188: this.showToolbar is for extentions\n        if (this.showToolbar || html.length > 2) {\n            this.$toolbar.append(html.join(''));\n        }\n\n        if (this.options.showPaginationSwitch) {\n            this.$toolbar.find('button[name=\"paginationSwitch\"]')\n                .off('click').on('click', $.proxy(this.togglePagination, this));\n        }\n\n        if (this.options.showRefresh) {\n            this.$toolbar.find('button[name=\"refresh\"]')\n                .off('click').on('click', $.proxy(this.refresh, this));\n        }\n\n        if (this.options.showToggle) {\n            this.$toolbar.find('button[name=\"toggle\"]')\n                .off('click').on('click', function () {\n                    that.toggleView();\n                });\n        }\n\n        if (this.options.showColumns) {\n            $keepOpen = this.$toolbar.find('.keep-open');\n\n            if (switchableCount <= this.options.minimumCountColumns) {\n                $keepOpen.find('input').prop('disabled', true);\n            }\n\n            $keepOpen.find('li').off('click').on('click', function (event) {\n                event.stopImmediatePropagation();\n            });\n            $keepOpen.find('input').off('click').on('click', function () {\n                var $this = $(this);\n\n                that.toggleColumn(getFieldIndex(that.columns,\n                    $(this).data('field')), $this.prop('checked'), false);\n                that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));\n            });\n        }\n\n        if (this.options.search) {\n            html = [];\n            html.push(\n                '<div class=\"pull-' + this.options.searchAlign + ' search\">',\n                sprintf('<input class=\"form-control' +\n                    sprintf(' input-%s', this.options.iconSize) +\n                    '\" type=\"text\" placeholder=\"%s\">',\n                    this.options.formatSearch()),\n                '</div>');\n\n            this.$toolbar.append(html.join(''));\n            $search = this.$toolbar.find('.search input');\n            $search.off('keyup drop').on('keyup drop', function (event) {\n                clearTimeout(timeoutId); // doesn't matter if it's 0\n                timeoutId = setTimeout(function () {\n                    that.onSearch(event);\n                }, that.options.searchTimeOut);\n            });\n        }\n    };\n\n    BootstrapTable.prototype.onSearch = function (event) {\n        var text = $.trim($(event.currentTarget).val());\n\n        // trim search input\n        if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {\n            $(event.currentTarget).val(text);\n        }\n\n        if (text === this.searchText) {\n            return;\n        }\n        this.searchText = text;\n\n        this.options.pageNumber = 1;\n        this.initSearch();\n        this.updatePagination();\n        this.trigger('search', text);\n    };\n\n    BootstrapTable.prototype.initSearch = function () {\n        var that = this;\n\n        if (this.options.sidePagination !== 'server') {\n            var s = this.searchText && this.searchText.toLowerCase();\n            var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns;\n\n            // Check filter\n            this.data = f ? $.grep(this.options.data, function (item, i) {\n                for (var key in f) {\n                    if ($.isArray(f[key])) {\n                        if ($.inArray(item[key], f[key]) === -1) {\n                            return false;\n                        }\n                    } else if (item[key] !== f[key]) {\n                        return false;\n                    }\n                }\n                return true;\n            }) : this.options.data;\n\n            this.data = s ? $.grep(this.data, function (item, i) {\n                for (var key in item) {\n                    key = $.isNumeric(key) ? parseInt(key, 10) : key;\n                    var value = item[key],\n                        column = that.columns[getFieldIndex(that.columns, key)],\n                        j = $.inArray(key, that.header.fields);\n\n                    // Fix #142: search use formated data\n                    if (column && column.searchFormatter) {\n                        value = calculateObjectValue(column,\n                            that.header.formatters[j], [value, item, i], value);\n                    }\n\n                    var index = $.inArray(key, that.header.fields);\n                    if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {\n                        if (that.options.strictSearch) {\n                            if ((value + '').toLowerCase() === s) {\n                                return true;\n                            }\n                        } else {\n                            if ((value + '').toLowerCase().indexOf(s) !== -1) {\n                                return true;\n                            }\n                        }\n                    }\n                }\n                return false;\n            }) : this.data;\n        }\n    };\n\n    BootstrapTable.prototype.initPagination = function () {\n        if (!this.options.pagination) {\n            this.$pagination.hide();\n            return;\n        } else {\n            this.$pagination.show();\n        }\n\n        var that = this,\n            html = [],\n            $allSelected = false,\n            i, from, to,\n            $pageList,\n            $first, $pre,\n            $next, $last,\n            $number,\n            data = this.getData();\n\n        if (this.options.sidePagination !== 'server') {\n            this.options.totalRows = data.length;\n        }\n\n        this.totalPages = 0;\n        if (this.options.totalRows) {\n            if (this.options.pageSize === this.options.formatAllRows()) {\n                this.options.pageSize = this.options.totalRows;\n                $allSelected = true;\n            } else if (this.options.pageSize === this.options.totalRows) {\n                // Fix #667 Table with pagination,\n                // multiple pages and a search that matches to one page throws exception\n                var pageLst = typeof this.options.pageList === 'string' ?\n                    this.options.pageList.replace('[', '').replace(']', '')\n                        .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList;\n                if ($.inArray(this.options.formatAllRows().toLowerCase(), pageLst)  > -1) {\n                    $allSelected = true;\n                }\n            }\n\n            this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1;\n\n            this.options.totalPages = this.totalPages;\n        }\n        if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) {\n            this.options.pageNumber = this.totalPages;\n        }\n\n        this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1;\n        this.pageTo = this.options.pageNumber * this.options.pageSize;\n        if (this.pageTo > this.options.totalRows) {\n            this.pageTo = this.options.totalRows;\n        }\n\n        html.push(\n            '<div class=\"pull-' + this.options.paginationDetailHAlign + ' pagination-detail\">',\n            '<span class=\"pagination-info\">',\n            this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) :\n            this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows),\n            '</span>');\n\n        if (!this.options.onlyInfoPagination) {\n            html.push('<span class=\"page-list\">');\n\n            var pageNumber = [\n                    sprintf('<span class=\"btn-group %s\">',\n                        this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?\n                            'dropdown' : 'dropup'),\n                    '<button type=\"button\" class=\"btn btn-default ' +\n                    sprintf(' btn-%s', this.options.iconSize) +\n                    ' dropdown-toggle\" data-toggle=\"dropdown\">',\n                    '<span class=\"page-size\">',\n                    $allSelected ? this.options.formatAllRows() : this.options.pageSize,\n                    '</span>',\n                    ' <span class=\"caret\"></span>',\n                    '</button>',\n                    '<ul class=\"dropdown-menu\" role=\"menu\">'\n                ],\n                pageList = this.options.pageList;\n\n            if (typeof this.options.pageList === 'string') {\n                var list = this.options.pageList.replace('[', '').replace(']', '')\n                    .replace(/ /g, '').split(',');\n\n                pageList = [];\n                $.each(list, function (i, value) {\n                    pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ?\n                        that.options.formatAllRows() : +value);\n                });\n            }\n\n            $.each(pageList, function (i, page) {\n                if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) {\n                    var active;\n                    if ($allSelected) {\n                        active = page === that.options.formatAllRows() ? ' class=\"active\"' : '';\n                    } else {\n                        active = page === that.options.pageSize ? ' class=\"active\"' : '';\n                    }\n                    pageNumber.push(sprintf('<li%s><a href=\"javascript:void(0)\">%s</a></li>', active, page));\n                }\n            });\n            pageNumber.push('</ul></span>');\n\n            html.push(this.options.formatRecordsPerPage(pageNumber.join('')));\n            html.push('</span>');\n\n            html.push('</div>',\n                '<div class=\"pull-' + this.options.paginationHAlign + ' pagination\">',\n                '<ul class=\"pagination' + sprintf(' pagination-%s', this.options.iconSize) + '\">',\n                '<li class=\"page-first\"><a href=\"javascript:void(0)\">' + this.options.paginationFirstText + '</a></li>',\n                '<li class=\"page-pre\"><a href=\"javascript:void(0)\">' + this.options.paginationPreText + '</a></li>');\n\n            if (this.totalPages < 5) {\n                from = 1;\n                to = this.totalPages;\n            } else {\n                from = this.options.pageNumber - 2;\n                to = from + 4;\n                if (from < 1) {\n                    from = 1;\n                    to = 5;\n                }\n                if (to > this.totalPages) {\n                    to = this.totalPages;\n                    from = to - 4;\n                }\n            }\n            for (i = from; i <= to; i++) {\n                html.push('<li class=\"page-number' + (i === this.options.pageNumber ? ' active' : '') + '\">',\n                    '<a href=\"javascript:void(0)\">', i, '</a>',\n                    '</li>');\n            }\n\n            html.push(\n                '<li class=\"page-next\"><a href=\"javascript:void(0)\">' + this.options.paginationNextText + '</a></li>',\n                '<li class=\"page-last\"><a href=\"javascript:void(0)\">' + this.options.paginationLastText + '</a></li>',\n                '</ul>',\n                '</div>');\n\n        }\n        this.$pagination.html(html.join(''));\n\n        if (!this.options.onlyInfoPagination) {\n            $pageList = this.$pagination.find('.page-list a');\n            $first = this.$pagination.find('.page-first');\n            $pre = this.$pagination.find('.page-pre');\n            $next = this.$pagination.find('.page-next');\n            $last = this.$pagination.find('.page-last');\n            $number = this.$pagination.find('.page-number');\n\n            if (this.options.pageNumber <= 1) {\n                $first.addClass('disabled');\n                $pre.addClass('disabled');\n            }\n            if (this.options.pageNumber >= this.totalPages) {\n                $next.addClass('disabled');\n                $last.addClass('disabled');\n            }\n            if (this.options.smartDisplay) {\n                if (this.totalPages <= 1) {\n                    this.$pagination.find('div.pagination').hide();\n                }\n                if (pageList.length < 2 || this.options.totalRows <= pageList[0]) {\n                    this.$pagination.find('span.page-list').hide();\n                }\n\n                // when data is empty, hide the pagination\n                this.$pagination[this.getData().length ? 'show' : 'hide']();\n            }\n            if ($allSelected) {\n                this.options.pageSize = this.options.formatAllRows();\n            }\n            $pageList.off('click').on('click', $.proxy(this.onPageListChange, this));\n            $first.off('click').on('click', $.proxy(this.onPageFirst, this));\n            $pre.off('click').on('click', $.proxy(this.onPagePre, this));\n            $next.off('click').on('click', $.proxy(this.onPageNext, this));\n            $last.off('click').on('click', $.proxy(this.onPageLast, this));\n            $number.off('click').on('click', $.proxy(this.onPageNumber, this));\n        }\n    };\n\n    BootstrapTable.prototype.updatePagination = function (event) {\n        // Fix #171: IE disabled button can be clicked bug.\n        if (event && $(event.currentTarget).hasClass('disabled')) {\n            return;\n        }\n\n        if (!this.options.maintainSelected) {\n            this.resetRows();\n        }\n\n        this.initPagination();\n        if (this.options.sidePagination === 'server') {\n            this.initServer();\n        } else {\n            this.initBody();\n        }\n\n        this.trigger('page-change', this.options.pageNumber, this.options.pageSize);\n    };\n\n    BootstrapTable.prototype.onPageListChange = function (event) {\n        var $this = $(event.currentTarget);\n\n        $this.parent().addClass('active').siblings().removeClass('active');\n        this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?\n            this.options.formatAllRows() : +$this.text();\n        this.$toolbar.find('.page-size').text(this.options.pageSize);\n\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageFirst = function (event) {\n        this.options.pageNumber = 1;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPagePre = function (event) {\n        this.options.pageNumber--;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageNext = function (event) {\n        this.options.pageNumber++;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageLast = function (event) {\n        this.options.pageNumber = this.totalPages;\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.onPageNumber = function (event) {\n        if (this.options.pageNumber === +$(event.currentTarget).text()) {\n            return;\n        }\n        this.options.pageNumber = +$(event.currentTarget).text();\n        this.updatePagination(event);\n    };\n\n    BootstrapTable.prototype.initBody = function (fixedScroll) {\n        var that = this,\n            html = [],\n            data = this.getData();\n\n        this.trigger('pre-body', data);\n\n        this.$body = this.$el.find('>tbody');\n        if (!this.$body.length) {\n            this.$body = $('<tbody></tbody>').appendTo(this.$el);\n        }\n\n        //Fix #389 Bootstrap-table-flatJSON is not working\n\n        if (!this.options.pagination || this.options.sidePagination === 'server') {\n            this.pageFrom = 1;\n            this.pageTo = data.length;\n        }\n\n        for (var i = this.pageFrom - 1; i < this.pageTo; i++) {\n            var key,\n                item = data[i],\n                style = {},\n                csses = [],\n                data_ = '',\n                attributes = {},\n                htmlAttributes = [];\n\n            style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);\n\n            if (style && style.css) {\n                for (key in style.css) {\n                    csses.push(key + ': ' + style.css[key]);\n                }\n            }\n\n            attributes = calculateObjectValue(this.options,\n                this.options.rowAttributes, [item, i], attributes);\n\n            if (attributes) {\n                for (key in attributes) {\n                    htmlAttributes.push(sprintf('%s=\"%s\"', key, escapeHTML(attributes[key])));\n                }\n            }\n\n            if (item._data && !$.isEmptyObject(item._data)) {\n                $.each(item._data, function (k, v) {\n                    // ignore data-index\n                    if (k === 'index') {\n                        return;\n                    }\n                    data_ += sprintf(' data-%s=\"%s\"', k, v);\n                });\n            }\n\n            html.push('<tr',\n                sprintf(' %s', htmlAttributes.join(' ')),\n                sprintf(' id=\"%s\"', $.isArray(item) ? undefined : item._id),\n                sprintf(' class=\"%s\"', style.classes || ($.isArray(item) ? undefined : item._class)),\n                sprintf(' data-index=\"%s\"', i),\n                sprintf(' data-uniqueid=\"%s\"', item[this.options.uniqueId]),\n                sprintf('%s', data_),\n                '>'\n            );\n\n            if (this.options.cardView) {\n                html.push(sprintf('<td colspan=\"%s\">', this.header.fields.length));\n            }\n\n            if (!this.options.cardView && this.options.detailView) {\n                html.push('<td>',\n                    '<a class=\"detail-icon\" href=\"javascript:\">',\n                    sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),\n                    '</a>',\n                    '</td>');\n            }\n\n            $.each(this.header.fields, function (j, field) {\n                var text = '',\n                    value = getItemField(item, field),\n                    type = '',\n                    cellStyle = {},\n                    id_ = '',\n                    class_ = that.header.classes[j],\n                    data_ = '',\n                    rowspan_ = '',\n                    title_ = '',\n                    column = that.columns[getFieldIndex(that.columns, field)];\n\n                if (!column.visible) {\n                    return;\n                }\n\n                style = sprintf('style=\"%s\"', csses.concat(that.header.styles[j]).join('; '));\n\n                value = calculateObjectValue(column,\n                    that.header.formatters[j], [value, item, i], value);\n\n                // handle td's id and class\n                if (item['_' + field + '_id']) {\n                    id_ = sprintf(' id=\"%s\"', item['_' + field + '_id']);\n                }\n                if (item['_' + field + '_class']) {\n                    class_ = sprintf(' class=\"%s\"', item['_' + field + '_class']);\n                }\n                if (item['_' + field + '_rowspan']) {\n                    rowspan_ = sprintf(' rowspan=\"%s\"', item['_' + field + '_rowspan']);\n                }\n                if (item['_' + field + '_title']) {\n                    title_ = sprintf(' title=\"%s\"', item['_' + field + '_title']);\n                }\n                cellStyle = calculateObjectValue(that.header,\n                    that.header.cellStyles[j], [value, item, i], cellStyle);\n                if (cellStyle.classes) {\n                    class_ = sprintf(' class=\"%s\"', cellStyle.classes);\n                }\n                if (cellStyle.css) {\n                    var csses_ = [];\n                    for (var key in cellStyle.css) {\n                        csses_.push(key + ': ' + cellStyle.css[key]);\n                    }\n                    style = sprintf('style=\"%s\"', csses_.concat(that.header.styles[j]).join('; '));\n                }\n\n                if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {\n                    $.each(item['_' + field + '_data'], function (k, v) {\n                        // ignore data-index\n                        if (k === 'index') {\n                            return;\n                        }\n                        data_ += sprintf(' data-%s=\"%s\"', k, v);\n                    });\n                }\n\n                if (column.checkbox || column.radio) {\n                    type = column.checkbox ? 'checkbox' : type;\n                    type = column.radio ? 'radio' : type;\n\n                    text = [that.options.cardView ?\n                        '<div class=\"card-view\">' : '<td class=\"bs-checkbox\">',\n                        '<input' +\n                        sprintf(' data-index=\"%s\"', i) +\n                        sprintf(' name=\"%s\"', that.options.selectItemName) +\n                        sprintf(' type=\"%s\"', type) +\n                        sprintf(' value=\"%s\"', item[that.options.idField]) +\n                        sprintf(' checked=\"%s\"', value === true ||\n                        (value && value.checked) ? 'checked' : undefined) +\n                        sprintf(' disabled=\"%s\"', !column.checkboxEnabled ||\n                        (value && value.disabled) ? 'disabled' : undefined) +\n                        ' />',\n                        that.header.formatters[j] && typeof value === 'string' ? value : '',\n                        that.options.cardView ? '</div>' : '</td>'\n                    ].join('');\n\n                    item[that.header.stateField] = value === true || (value && value.checked);\n                } else {\n                    value = typeof value === 'undefined' || value === null ?\n                        that.options.undefinedText : value;\n\n                    text = that.options.cardView ? ['<div class=\"card-view\">',\n                        that.options.showHeader ? sprintf('<span class=\"title\" %s>%s</span>', style,\n                            getPropertyFromOther(that.columns, 'field', 'title', field)) : '',\n                        sprintf('<span class=\"value\">%s</span>', value),\n                        '</div>'\n                    ].join('') : [sprintf('<td%s %s %s %s %s %s>', id_, class_, style, data_, rowspan_, title_),\n                        value,\n                        '</td>'\n                    ].join('');\n\n                    // Hide empty data on Card view when smartDisplay is set to true.\n                    if (that.options.cardView && that.options.smartDisplay && value === '') {\n                        // Should set a placeholder for event binding correct fieldIndex\n                        text = '<div class=\"card-view\"></div>';\n                    }\n                }\n\n                html.push(text);\n            });\n\n            if (this.options.cardView) {\n                html.push('</td>');\n            }\n\n            html.push('</tr>');\n        }\n\n        // show no records\n        if (!html.length) {\n            html.push('<tr class=\"no-records-found\">',\n                sprintf('<td colspan=\"%s\">%s</td>',\n                    this.$header.find('th').length, this.options.formatNoMatches()),\n                '</tr>');\n        }\n\n        this.$body.html(html.join(''));\n\n        if (!fixedScroll) {\n            this.scrollTo(0);\n        }\n\n        // click to select by column\n        this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {\n            var $td = $(this),\n                $tr = $td.parent(),\n                item = that.data[$tr.data('index')],\n                index = $td[0].cellIndex,\n                field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],\n                column = that.columns[getFieldIndex(that.columns, field)],\n                value = getItemField(item, field);\n\n            if ($td.find('.detail-icon').length) {\n                return;\n            }\n\n            that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);\n            that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);\n\n            // if click to select - then trigger the checkbox/radio click\n            if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {\n                var $selectItem = $tr.find(sprintf('[name=\"%s\"]', that.options.selectItemName));\n                if ($selectItem.length) {\n                    $selectItem[0].click(); // #144: .trigger('click') bug\n                }\n            }\n        });\n\n        this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {\n            var $this = $(this),\n                $tr = $this.parent().parent(),\n                index = $tr.data('index'),\n                row = data[index]; // Fix #980 Detail view, when searching, returns wrong row\n\n            // remove and update\n            if ($tr.next().is('tr.detail-view')) {\n                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));\n                $tr.next().remove();\n                that.trigger('collapse-row', index, row);\n            } else {\n                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));\n                $tr.after(sprintf('<tr class=\"detail-view\"><td colspan=\"%s\">%s</td></tr>',\n                    $tr.find('td').length, calculateObjectValue(that.options,\n                        that.options.detailFormatter, [index, row], '')));\n                that.trigger('expand-row', index, row, $tr.next().find('td'));\n            }\n            that.resetView();\n        });\n\n        this.$selectItem = this.$body.find(sprintf('[name=\"%s\"]', this.options.selectItemName));\n        this.$selectItem.off('click').on('click', function (event) {\n            event.stopImmediatePropagation();\n\n            var $this = $(this),\n                checked = $this.prop('checked'),\n                row = that.data[$this.data('index')];\n\n            if (that.options.maintainSelected && $(this).is(':radio')) {\n                $.each(that.options.data, function (i, row) {\n                    row[that.header.stateField] = false;\n                });\n            }\n\n            row[that.header.stateField] = checked;\n\n            if (that.options.singleSelect) {\n                that.$selectItem.not(this).each(function () {\n                    that.data[$(this).data('index')][that.header.stateField] = false;\n                });\n                that.$selectItem.filter(':checked').not(this).prop('checked', false);\n            }\n\n            that.updateSelected();\n            that.trigger(checked ? 'check' : 'uncheck', row, $this);\n        });\n\n        $.each(this.header.events, function (i, events) {\n            if (!events) {\n                return;\n            }\n            // fix bug, if events is defined with namespace\n            if (typeof events === 'string') {\n                events = calculateObjectValue(null, events);\n            }\n\n            var field = that.header.fields[i],\n                fieldIndex = $.inArray(field, that.getVisibleFields());\n\n            if (that.options.detailView && !that.options.cardView) {\n                fieldIndex += 1;\n            }\n\n            for (var key in events) {\n                that.$body.find('>tr:not(.no-records-found)').each(function () {\n                    var $tr = $(this),\n                        $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),\n                        index = key.indexOf(' '),\n                        name = key.substring(0, index),\n                        el = key.substring(index + 1),\n                        func = events[key];\n\n                    $td.find(el).off(name).on(name, function (e) {\n                        var index = $tr.data('index'),\n                            row = that.data[index],\n                            value = row[field];\n\n                        func.apply(this, [e, value, row, index]);\n                    });\n                });\n            }\n        });\n\n        this.updateSelected();\n        this.resetView();\n\n        this.trigger('post-body');\n    };\n\n    BootstrapTable.prototype.initServer = function (silent, query) {\n        var that = this,\n            data = {},\n            params = {\n                pageSize: this.options.pageSize === this.options.formatAllRows() ?\n                    this.options.totalRows : this.options.pageSize,\n                pageNumber: this.options.pageNumber,\n                searchText: this.searchText,\n                sortName: this.options.sortName,\n                sortOrder: this.options.sortOrder\n            },\n            request;\n\n        if (!this.options.url && !this.options.ajax) {\n            return;\n        }\n\n        if (this.options.queryParamsType === 'limit') {\n            params = {\n                search: params.searchText,\n                sort: params.sortName,\n                order: params.sortOrder\n            };\n            if (this.options.pagination) {\n                params.limit = this.options.pageSize === this.options.formatAllRows() ?\n                    this.options.totalRows : this.options.pageSize;\n                params.offset = this.options.pageSize === this.options.formatAllRows() ?\n                    0 : this.options.pageSize * (this.options.pageNumber - 1);\n            }\n        }\n\n        if (!($.isEmptyObject(this.filterColumnsPartial))) {\n            params['filter'] = JSON.stringify(this.filterColumnsPartial, null);\n        }\n\n        data = calculateObjectValue(this.options, this.options.queryParams, [params], data);\n\n        $.extend(data, query || {});\n\n        // false to stop request\n        if (data === false) {\n            return;\n        }\n\n        if (!silent) {\n            this.$tableLoading.show();\n        }\n        request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), {\n            type: this.options.method,\n            url: this.options.url,\n            data: this.options.contentType === 'application/json' && this.options.method === 'post' ?\n                JSON.stringify(data) : data,\n            cache: this.options.cache,\n            contentType: this.options.contentType,\n            dataType: this.options.dataType,\n            success: function (res) {\n                res = calculateObjectValue(that.options, that.options.responseHandler, [res], res);\n\n                that.load(res);\n                that.trigger('load-success', res);\n            },\n            error: function (res) {\n                that.trigger('load-error', res.status, res);\n            },\n            complete: function () {\n                if (!silent) {\n                    that.$tableLoading.hide();\n                }\n            }\n        });\n\n        if (this.options.ajax) {\n            calculateObjectValue(this, this.options.ajax, [request], null);\n        } else {\n            $.ajax(request);\n        }\n    };\n\n    BootstrapTable.prototype.initSearchText = function () {\n        if (this.options.search) {\n            if (this.options.searchText !== '') {\n                var $search = this.$toolbar.find('.search input');\n                $search.val(this.options.searchText);\n                this.onSearch({currentTarget: $search});\n            }\n        }\n    };\n\n    BootstrapTable.prototype.getCaret = function () {\n        var that = this;\n\n        $.each(this.$header.find('th'), function (i, th) {\n            $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both');\n        });\n    };\n\n    BootstrapTable.prototype.updateSelected = function () {\n        var checkAll = this.$selectItem.filter(':enabled').length &&\n            this.$selectItem.filter(':enabled').length ===\n            this.$selectItem.filter(':enabled').filter(':checked').length;\n\n        this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);\n\n        this.$selectItem.each(function () {\n            $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected');\n        });\n    };\n\n    BootstrapTable.prototype.updateRows = function () {\n        var that = this;\n\n        this.$selectItem.each(function () {\n            that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');\n        });\n    };\n\n    BootstrapTable.prototype.resetRows = function () {\n        var that = this;\n\n        $.each(this.data, function (i, row) {\n            that.$selectAll.prop('checked', false);\n            that.$selectItem.prop('checked', false);\n            if (that.header.stateField) {\n                row[that.header.stateField] = false;\n            }\n        });\n    };\n\n    BootstrapTable.prototype.trigger = function (name) {\n        var args = Array.prototype.slice.call(arguments, 1);\n\n        name += '.bs.table';\n        this.options[BootstrapTable.EVENTS[name]].apply(this.options, args);\n        this.$el.trigger($.Event(name), args);\n\n        this.options.onAll(name, args);\n        this.$el.trigger($.Event('all.bs.table'), [name, args]);\n    };\n\n    BootstrapTable.prototype.resetHeader = function () {\n        // fix #61: the hidden table reset header bug.\n        // fix bug: get $el.css('width') error sometime (height = 500)\n        clearTimeout(this.timeoutId_);\n        this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);\n    };\n\n    BootstrapTable.prototype.fitHeader = function () {\n        var that = this,\n            fixedBody,\n            scrollWidth,\n            focused,\n            focusedTemp;\n\n        if (that.$el.is(':hidden')) {\n            that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100);\n            return;\n        }\n        fixedBody = this.$tableBody.get(0);\n\n        scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth &&\n        fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ?\n            getScrollBarWidth() : 0;\n\n        this.$el.css('margin-top', -this.$header.outerHeight());\n\n        focused = $(':focus');\n        if (focused.length > 0) {\n            var $th = focused.parents('th');\n            if ($th.length > 0) {\n                var dataField = $th.attr('data-field');\n                if (dataField !== undefined) {\n                    var $headerTh = this.$header.find(\"[data-field='\" + dataField + \"']\");\n                    if ($headerTh.length > 0) {\n                        $headerTh.find(\":input\").addClass(\"focus-temp\");\n                    }\n                }\n            }\n        }\n\n        this.$header_ = this.$header.clone(true, true);\n        this.$selectAll_ = this.$header_.find('[name=\"btSelectAll\"]');\n        this.$tableHeader.css({\n            'margin-right': scrollWidth\n        }).find('table').css('width', this.$el.outerWidth())\n            .html('').attr('class', this.$el.attr('class'))\n            .append(this.$header_);\n\n\n        focusedTemp = $('.focus-temp:visible:eq(0)');\n        if (focusedTemp.length > 0) {\n            focusedTemp.focus();\n            this.$header.find('.focus-temp').removeClass('focus-temp');\n        }\n\n        // fix bug: $.data() is not working as expected after $.append()\n        this.$header.find('th[data-field]').each(function (i) {\n            that.$header_.find(sprintf('th[data-field=\"%s\"]', $(this).data('field'))).data($(this).data());\n        });\n\n        var visibleFields = this.getVisibleFields();\n\n        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {\n            var $this = $(this),\n                index = i;\n\n            if (that.options.detailView && !that.options.cardView) {\n                if (i === 0) {\n                    that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());\n                }\n                index = i - 1;\n            }\n\n            that.$header_.find(sprintf('th[data-field=\"%s\"]', visibleFields[index]))\n                .find('.fht-cell').width($this.innerWidth());\n        });\n        // horizontal scroll event\n        // TODO: it's probably better improving the layout than binding to scroll event\n        this.$tableBody.off('scroll').on('scroll', function () {\n            that.$tableHeader.scrollLeft($(this).scrollLeft());\n\n            if (that.options.showFooter && !that.options.cardView) {\n                that.$tableFooter.scrollLeft($(this).scrollLeft());\n            }\n        });\n        that.trigger('post-header');\n    };\n\n    BootstrapTable.prototype.resetFooter = function () {\n        var that = this,\n            data = that.getData(),\n            html = [];\n\n        if (!this.options.showFooter || this.options.cardView) { //do nothing\n            return;\n        }\n\n        if (!this.options.cardView && this.options.detailView) {\n            html.push('<td><div class=\"th-inner\">&nbsp;</div><div class=\"fht-cell\"></div></td>');\n        }\n\n        $.each(this.columns, function (i, column) {\n            var falign = '', // footer align style\n                style = '',\n                class_ = sprintf(' class=\"%s\"', column['class']);\n\n            if (!column.visible) {\n                return;\n            }\n\n            if (that.options.cardView && (!column.cardVisible)) {\n                return;\n            }\n\n            falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align);\n            style = sprintf('vertical-align: %s; ', column.valign);\n\n            html.push('<td', class_, sprintf(' style=\"%s\"', falign + style), '>');\n            html.push('<div class=\"th-inner\">');\n\n            html.push(calculateObjectValue(column, column.footerFormatter, [data], '&nbsp;') || '&nbsp;');\n\n            html.push('</div>');\n            html.push('<div class=\"fht-cell\"></div>');\n            html.push('</div>');\n            html.push('</td>');\n        });\n\n        this.$tableFooter.find('tr').html(html.join(''));\n        clearTimeout(this.timeoutFooter_);\n        this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this),\n            this.$el.is(':hidden') ? 100 : 0);\n    };\n\n    BootstrapTable.prototype.fitFooter = function () {\n        var that = this,\n            $footerTd,\n            elWidth,\n            scrollWidth;\n\n        clearTimeout(this.timeoutFooter_);\n        if (this.$el.is(':hidden')) {\n            this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100);\n            return;\n        }\n\n        elWidth = this.$el.css('width');\n        scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0;\n\n        this.$tableFooter.css({\n            'margin-right': scrollWidth\n        }).find('table').css('width', elWidth)\n            .attr('class', this.$el.attr('class'));\n\n        $footerTd = this.$tableFooter.find('td');\n\n        this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {\n            var $this = $(this);\n\n            $footerTd.eq(i).find('.fht-cell').width($this.innerWidth());\n        });\n    };\n\n    BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) {\n        if (index === -1) {\n            return;\n        }\n        this.columns[index].visible = checked;\n        this.initHeader();\n        this.initSearch();\n        this.initPagination();\n        this.initBody();\n\n        if (this.options.showColumns) {\n            var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);\n\n            if (needUpdate) {\n                $items.filter(sprintf('[value=\"%s\"]', index)).prop('checked', checked);\n            }\n\n            if ($items.filter(':checked').length <= this.options.minimumCountColumns) {\n                $items.filter(':checked').prop('disabled', true);\n            }\n        }\n    };\n\n    BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {\n        if (index === -1) {\n            return;\n        }\n\n        this.$body.find(typeof index !== 'undefined' ?\n            sprintf('tr[data-index=\"%s\"]', index) :\n            sprintf('tr[data-uniqueid=\"%s\"]', uniqueId))\n            [visible ? 'show' : 'hide']();\n    };\n\n    BootstrapTable.prototype.getVisibleFields = function () {\n        var that = this,\n            visibleFields = [];\n\n        $.each(this.header.fields, function (j, field) {\n            var column = that.columns[getFieldIndex(that.columns, field)];\n\n            if (!column.visible) {\n                return;\n            }\n            visibleFields.push(field);\n        });\n        return visibleFields;\n    };\n\n    // PUBLIC FUNCTION DEFINITION\n    // =======================\n\n    BootstrapTable.prototype.resetView = function (params) {\n        var padding = 0;\n\n        if (params && params.height) {\n            this.options.height = params.height;\n        }\n\n        this.$selectAll.prop('checked', this.$selectItem.length > 0 &&\n            this.$selectItem.length === this.$selectItem.filter(':checked').length);\n\n        if (this.options.height) {\n            var toolbarHeight = getRealHeight(this.$toolbar),\n                paginationHeight = getRealHeight(this.$pagination),\n                height = this.options.height - toolbarHeight - paginationHeight;\n\n            this.$tableContainer.css('height', height + 'px');\n        }\n\n        if (this.options.cardView) {\n            // remove the element css\n            this.$el.css('margin-top', '0');\n            this.$tableContainer.css('padding-bottom', '0');\n            return;\n        }\n\n        if (this.options.showHeader && this.options.height) {\n            this.$tableHeader.show();\n            this.resetHeader();\n            padding += this.$header.outerHeight();\n        } else {\n            this.$tableHeader.hide();\n            this.trigger('post-header');\n        }\n\n        if (this.options.showFooter) {\n            this.resetFooter();\n            if (this.options.height) {\n                padding += this.$tableFooter.outerHeight() + 1;\n            }\n        }\n\n        // Assign the correct sortable arrow\n        this.getCaret();\n        this.$tableContainer.css('padding-bottom', padding + 'px');\n        this.trigger('reset-view');\n    };\n\n    BootstrapTable.prototype.getData = function (useCurrentPage) {\n        return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?\n            (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) :\n            (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data);\n    };\n\n    BootstrapTable.prototype.load = function (data) {\n        var fixedScroll = false;\n\n        // #431: support pagination\n        if (this.options.sidePagination === 'server') {\n            this.options.totalRows = data.total;\n            fixedScroll = data.fixedScroll;\n            data = data[this.options.dataField];\n        } else if (!$.isArray(data)) { // support fixedScroll\n            fixedScroll = data.fixedScroll;\n            data = data.data;\n        }\n\n        this.initData(data);\n        this.initSearch();\n        this.initPagination();\n        this.initBody(fixedScroll);\n    };\n\n    BootstrapTable.prototype.append = function (data) {\n        this.initData(data, 'append');\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.prepend = function (data) {\n        this.initData(data, 'prepend');\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.remove = function (params) {\n        var len = this.options.data.length,\n            i, row;\n\n        if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {\n            return;\n        }\n\n        for (i = len - 1; i >= 0; i--) {\n            row = this.options.data[i];\n\n            if (!row.hasOwnProperty(params.field)) {\n                continue;\n            }\n            if ($.inArray(row[params.field], params.values) !== -1) {\n                this.options.data.splice(i, 1);\n            }\n        }\n\n        if (len === this.options.data.length) {\n            return;\n        }\n\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.removeAll = function () {\n        if (this.options.data.length > 0) {\n            this.options.data.splice(0, this.options.data.length);\n            this.initSearch();\n            this.initPagination();\n            this.initBody(true);\n        }\n    };\n\n    BootstrapTable.prototype.getRowByUniqueId = function (id) {\n        var uniqueId = this.options.uniqueId,\n            len = this.options.data.length,\n            dataRow = null,\n            i, row, rowUniqueId;\n\n        for (i = len - 1; i >= 0; i--) {\n            row = this.options.data[i];\n\n            if (row.hasOwnProperty(uniqueId)) { // uniqueId is a column\n                rowUniqueId = row[uniqueId];\n            } else if(row._data.hasOwnProperty(uniqueId)) { // uniqueId is a row data property\n                rowUniqueId = row._data[uniqueId];\n            } else {\n                continue;\n            }\n\n            if (typeof rowUniqueId === 'string') {\n                id = id.toString();\n            } else if (typeof rowUniqueId === 'number') {\n                if ((Number(rowUniqueId) === rowUniqueId) && (rowUniqueId % 1 === 0)) {\n                    id = parseInt(id);\n                } else if ((rowUniqueId === Number(rowUniqueId)) && (rowUniqueId !== 0)) {\n                    id = parseFloat(id);\n                }\n            }\n\n            if (rowUniqueId === id) {\n                dataRow = row;\n                break;\n            }\n        }\n\n        return dataRow;\n    };\n\n    BootstrapTable.prototype.removeByUniqueId = function (id) {\n        var len = this.options.data.length,\n            row = this.getRowByUniqueId(id);\n\n        if (row) {\n            this.options.data.splice(this.options.data.indexOf(row), 1);\n        }\n\n        if (len === this.options.data.length) {\n            return;\n        }\n\n        this.initSearch();\n        this.initPagination();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.updateByUniqueId = function (params) {\n        var rowId;\n\n        if (!params.hasOwnProperty('id') || !params.hasOwnProperty('row')) {\n            return;\n        }\n\n        rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data);\n\n        if (rowId === -1) {\n            return;\n        }\n\n        $.extend(this.data[rowId], params.row);\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.insertRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {\n            return;\n        }\n        this.data.splice(params.index, 0, params.row);\n        this.initSearch();\n        this.initPagination();\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.updateRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {\n            return;\n        }\n        $.extend(this.data[params.index], params.row);\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.showRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {\n            return;\n        }\n        this.toggleRow(params.index, params.uniqueId, true);\n    };\n\n    BootstrapTable.prototype.hideRow = function (params) {\n        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {\n            return;\n        }\n        this.toggleRow(params.index, params.uniqueId, false);\n    };\n\n    BootstrapTable.prototype.getRowsHidden = function (show) {\n        var rows = $(this.$body[0]).children().filter(':hidden'),\n            i = 0;\n        if (show) {\n            for (; i < rows.length; i++) {\n                $(rows[i]).show();\n            }\n        }\n        return rows;\n    };\n\n    BootstrapTable.prototype.mergeCells = function (options) {\n        var row = options.index,\n            col = $.inArray(options.field, this.getVisibleFields()),\n            rowspan = options.rowspan || 1,\n            colspan = options.colspan || 1,\n            i, j,\n            $tr = this.$body.find('>tr'),\n            $td;\n\n        if (this.options.detailView && !this.options.cardView) {\n            col += 1;\n        }\n\n        $td = $tr.eq(row).find('>td').eq(col);\n\n        if (row < 0 || col < 0 || row >= this.data.length) {\n            return;\n        }\n\n        for (i = row; i < row + rowspan; i++) {\n            for (j = col; j < col + colspan; j++) {\n                $tr.eq(i).find('>td').eq(j).hide();\n            }\n        }\n\n        $td.attr('rowspan', rowspan).attr('colspan', colspan).show();\n    };\n\n    BootstrapTable.prototype.updateCell = function (params) {\n        if (!params.hasOwnProperty('index') ||\n            !params.hasOwnProperty('field') ||\n            !params.hasOwnProperty('value')) {\n            return;\n        }\n        this.data[params.index][params.field] = params.value;\n        this.initSort();\n        this.initBody(true);\n    };\n\n    BootstrapTable.prototype.getOptions = function () {\n        return this.options;\n    };\n\n    BootstrapTable.prototype.getSelections = function () {\n        var that = this;\n\n        return $.grep(this.data, function (row) {\n            return row[that.header.stateField];\n        });\n    };\n\n    BootstrapTable.prototype.getAllSelections = function () {\n        var that = this;\n\n        return $.grep(this.options.data, function (row) {\n            return row[that.header.stateField];\n        });\n    };\n\n    BootstrapTable.prototype.checkAll = function () {\n        this.checkAll_(true);\n    };\n\n    BootstrapTable.prototype.uncheckAll = function () {\n        this.checkAll_(false);\n    };\n\n    BootstrapTable.prototype.checkAll_ = function (checked) {\n        var rows;\n        if (!checked) {\n            rows = this.getSelections();\n        }\n        this.$selectAll.add(this.$selectAll_).prop('checked', checked);\n        this.$selectItem.filter(':enabled').prop('checked', checked);\n        this.updateRows();\n        if (checked) {\n            rows = this.getSelections();\n        }\n        this.trigger(checked ? 'check-all' : 'uncheck-all', rows);\n    };\n\n    BootstrapTable.prototype.check = function (index) {\n        this.check_(true, index);\n    };\n\n    BootstrapTable.prototype.uncheck = function (index) {\n        this.check_(false, index);\n    };\n\n    BootstrapTable.prototype.check_ = function (checked, index) {\n        var $el = this.$selectItem.filter(sprintf('[data-index=\"%s\"]', index)).prop('checked', checked);\n        this.data[index][this.header.stateField] = checked;\n        this.updateSelected();\n        this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el);\n    };\n\n    BootstrapTable.prototype.checkBy = function (obj) {\n        this.checkBy_(true, obj);\n    };\n\n    BootstrapTable.prototype.uncheckBy = function (obj) {\n        this.checkBy_(false, obj);\n    };\n\n    BootstrapTable.prototype.checkBy_ = function (checked, obj) {\n        if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {\n            return;\n        }\n\n        var that = this,\n            rows = [];\n        $.each(this.options.data, function (index, row) {\n            if (!row.hasOwnProperty(obj.field)) {\n                return false;\n            }\n            if ($.inArray(row[obj.field], obj.values) !== -1) {\n                var $el = that.$selectItem.filter(':enabled')\n                    .filter(sprintf('[data-index=\"%s\"]', index)).prop('checked', checked);\n                row[that.header.stateField] = checked;\n                rows.push(row);\n                that.trigger(checked ? 'check' : 'uncheck', row, $el);\n            }\n        });\n        this.updateSelected();\n        this.trigger(checked ? 'check-some' : 'uncheck-some', rows);\n    };\n\n    BootstrapTable.prototype.destroy = function () {\n        this.$el.insertBefore(this.$container);\n        $(this.options.toolbar).insertBefore(this.$el);\n        this.$container.next().remove();\n        this.$container.remove();\n        this.$el.html(this.$el_.html())\n            .css('margin-top', '0')\n            .attr('class', this.$el_.attr('class') || ''); // reset the class\n    };\n\n    BootstrapTable.prototype.showLoading = function () {\n        this.$tableLoading.show();\n    };\n\n    BootstrapTable.prototype.hideLoading = function () {\n        this.$tableLoading.hide();\n    };\n\n    BootstrapTable.prototype.togglePagination = function () {\n        this.options.pagination = !this.options.pagination;\n        var button = this.$toolbar.find('button[name=\"paginationSwitch\"] i');\n        if (this.options.pagination) {\n            button.attr(\"class\", this.options.iconsPrefix + \" \" + this.options.icons.paginationSwitchDown);\n        } else {\n            button.attr(\"class\", this.options.iconsPrefix + \" \" + this.options.icons.paginationSwitchUp);\n        }\n        this.updatePagination();\n    };\n\n    BootstrapTable.prototype.refresh = function (params) {\n        if (params && params.url) {\n            this.options.url = params.url;\n            this.options.pageNumber = 1;\n        }\n        this.initServer(params && params.silent, params && params.query);\n    };\n\n    BootstrapTable.prototype.resetWidth = function () {\n        if (this.options.showHeader && this.options.height) {\n            this.fitHeader();\n        }\n        if (this.options.showFooter) {\n            this.fitFooter();\n        }\n    };\n\n    BootstrapTable.prototype.showColumn = function (field) {\n        this.toggleColumn(getFieldIndex(this.columns, field), true, true);\n    };\n\n    BootstrapTable.prototype.hideColumn = function (field) {\n        this.toggleColumn(getFieldIndex(this.columns, field), false, true);\n    };\n\n    BootstrapTable.prototype.getHiddenColumns = function () {\n        return $.grep(this.columns, function (column) {\n            return !column.visible;\n        });\n    };\n\n    BootstrapTable.prototype.filterBy = function (columns) {\n        this.filterColumns = $.isEmptyObject(columns) ? {} : columns;\n        this.options.pageNumber = 1;\n        this.initSearch();\n        this.updatePagination();\n    };\n\n    BootstrapTable.prototype.scrollTo = function (value) {\n        if (typeof value === 'string') {\n            value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0;\n        }\n        if (typeof value === 'number') {\n            this.$tableBody.scrollTop(value);\n        }\n        if (typeof value === 'undefined') {\n            return this.$tableBody.scrollTop();\n        }\n    };\n\n    BootstrapTable.prototype.getScrollPosition = function () {\n        return this.scrollTo();\n    };\n\n    BootstrapTable.prototype.selectPage = function (page) {\n        if (page > 0 && page <= this.options.totalPages) {\n            this.options.pageNumber = page;\n            this.updatePagination();\n        }\n    };\n\n    BootstrapTable.prototype.prevPage = function () {\n        if (this.options.pageNumber > 1) {\n            this.options.pageNumber--;\n            this.updatePagination();\n        }\n    };\n\n    BootstrapTable.prototype.nextPage = function () {\n        if (this.options.pageNumber < this.options.totalPages) {\n            this.options.pageNumber++;\n            this.updatePagination();\n        }\n    };\n\n    BootstrapTable.prototype.toggleView = function () {\n        this.options.cardView = !this.options.cardView;\n        this.initHeader();\n        // Fixed remove toolbar when click cardView button.\n        //that.initToolbar();\n        this.initBody();\n        this.trigger('toggle', this.options.cardView);\n    };\n\n    BootstrapTable.prototype.refreshOptions = function (options) {\n        //If the objects are equivalent then avoid the call of destroy / init methods\n        if (compareObjects(this.options, options, false)) {\n            return;\n        }\n        this.options = $.extend(this.options, options);\n        this.trigger('refresh-options', this.options);\n        this.destroy();\n        this.init();\n    };\n\n    BootstrapTable.prototype.resetSearch = function (text) {\n        var $search = this.$toolbar.find('.search input');\n        $search.val(text || '');\n        this.onSearch({currentTarget: $search});\n    };\n\n    BootstrapTable.prototype.expandRow_ = function (expand, index) {\n        var $tr = this.$body.find(sprintf('> tr[data-index=\"%s\"]', index));\n        if ($tr.next().is('tr.detail-view') === (expand ? false : true)) {\n            $tr.find('> td > .detail-icon').click();\n        }\n    };\n\n    BootstrapTable.prototype.expandRow = function (index) {\n        this.expandRow_(true, index);\n    };\n\n    BootstrapTable.prototype.collapseRow = function (index) {\n        this.expandRow_(false, index);\n    };\n\n    BootstrapTable.prototype.expandAllRows = function (isSubTable) {\n        if (isSubTable) {\n            var $tr = this.$body.find(sprintf('> tr[data-index=\"%s\"]', 0)),\n                that = this,\n                detailIcon = null,\n                executeInterval = false,\n                idInterval = -1;\n\n            if (!$tr.next().is('tr.detail-view')) {\n                $tr.find('> td > .detail-icon').click();\n                executeInterval = true;\n            } else if (!$tr.next().next().is('tr.detail-view')) {\n                $tr.next().find(\".detail-icon\").click();\n                executeInterval = true;\n            }\n\n            if (executeInterval) {\n                try {\n                    idInterval = setInterval(function () {\n                        detailIcon = that.$body.find(\"tr.detail-view\").last().find(\".detail-icon\");\n                        if (detailIcon.length > 0) {\n                            detailIcon.click();\n                        } else {\n                            clearInterval(idInterval);\n                        }\n                    }, 1);\n                } catch (ex) {\n                    clearInterval(idInterval);\n                }\n            }\n        } else {\n            var trs = this.$body.children();\n            for (var i = 0; i < trs.length; i++) {\n                this.expandRow_(true, $(trs[i]).data(\"index\"));\n            }\n        }\n    };\n\n    BootstrapTable.prototype.collapseAllRows = function (isSubTable) {\n        if (isSubTable) {\n            this.expandRow_(false, 0);\n        } else {\n            var trs = this.$body.children();\n            for (var i = 0; i < trs.length; i++) {\n                this.expandRow_(false, $(trs[i]).data(\"index\"));\n            }\n        }\n    };\n\n    // BOOTSTRAP TABLE PLUGIN DEFINITION\n    // =======================\n\n    var allowedMethods = [\n        'getOptions',\n        'getSelections', 'getAllSelections', 'getData',\n        'load', 'append', 'prepend', 'remove', 'removeAll',\n        'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',\n        'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',\n        'mergeCells',\n        'checkAll', 'uncheckAll',\n        'check', 'uncheck',\n        'checkBy', 'uncheckBy',\n        'refresh',\n        'resetView',\n        'resetWidth',\n        'destroy',\n        'showLoading', 'hideLoading',\n        'showColumn', 'hideColumn', 'getHiddenColumns',\n        'filterBy',\n        'scrollTo',\n        'getScrollPosition',\n        'selectPage', 'prevPage', 'nextPage',\n        'togglePagination',\n        'toggleView',\n        'refreshOptions',\n        'resetSearch',\n        'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows'\n    ];\n\n    $.fn.bootstrapTable = function (option) {\n        var value,\n            args = Array.prototype.slice.call(arguments, 1);\n\n        this.each(function () {\n            var $this = $(this),\n                data = $this.data('bootstrap.table'),\n                options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),\n                    typeof option === 'object' && option);\n\n            if (typeof option === 'string') {\n                if ($.inArray(option, allowedMethods) < 0) {\n                    throw new Error(\"Unknown method: \" + option);\n                }\n\n                if (!data) {\n                    return;\n                }\n\n                value = data[option].apply(data, args);\n\n                if (option === 'destroy') {\n                    $this.removeData('bootstrap.table');\n                }\n            }\n\n            if (!data) {\n                $this.data('bootstrap.table', (data = new BootstrapTable(this, options)));\n            }\n        });\n\n        return typeof value === 'undefined' ? this : value;\n    };\n\n    $.fn.bootstrapTable.Constructor = BootstrapTable;\n    $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;\n    $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;\n    $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;\n    $.fn.bootstrapTable.methods = allowedMethods;\n    $.fn.bootstrapTable.utils = {\n        sprintf: sprintf,\n        getFieldIndex: getFieldIndex,\n        compareObjects: compareObjects,\n        calculateObjectValue: calculateObjectValue\n    };\n\n    // BOOTSTRAP TABLE INIT\n    // =======================\n\n    $(function () {\n        $('[data-toggle=\"table\"]').bootstrapTable();\n    });\n\n}(jQuery);\n","/* =========================================================\n * bootstrap-datepicker.js\n * Repo: https://github.com/eternicode/bootstrap-datepicker/\n * Demo: http://eternicode.github.io/bootstrap-datepicker/\n * Docs: http://bootstrap-datepicker.readthedocs.org/\n * Forked from http://www.eyecon.ro/bootstrap-datepicker\n * =========================================================\n * Started by Stefan Petre; improvements by Andrew Rowls + contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n(function($, undefined){\n\n\tvar $window = $(window);\n\n\tfunction UTCDate(){\n\t\treturn new Date(Date.UTC.apply(Date, arguments));\n\t}\n\tfunction UTCToday(){\n\t\tvar today = new Date();\n\t\treturn UTCDate(today.getFullYear(), today.getMonth(), today.getDate());\n\t}\n\tfunction alias(method){\n\t\treturn function(){\n\t\t\treturn this[method].apply(this, arguments);\n\t\t};\n\t}\n\n\tvar DateArray = (function(){\n\t\tvar extras = {\n\t\t\tget: function(i){\n\t\t\t\treturn this.slice(i)[0];\n\t\t\t},\n\t\t\tcontains: function(d){\n\t\t\t\t// Array.indexOf is not cross-browser;\n\t\t\t\t// $.inArray doesn't work with Dates\n\t\t\t\tvar val = d && d.valueOf();\n\t\t\t\tfor (var i=0, l=this.length; i < l; i++)\n\t\t\t\t\tif (this[i].valueOf() === val)\n\t\t\t\t\t\treturn i;\n\t\t\t\treturn -1;\n\t\t\t},\n\t\t\tremove: function(i){\n\t\t\t\tthis.splice(i,1);\n\t\t\t},\n\t\t\treplace: function(new_array){\n\t\t\t\tif (!new_array)\n\t\t\t\t\treturn;\n\t\t\t\tif (!$.isArray(new_array))\n\t\t\t\t\tnew_array = [new_array];\n\t\t\t\tthis.clear();\n\t\t\t\tthis.push.apply(this, new_array);\n\t\t\t},\n\t\t\tclear: function(){\n\t\t\t\tthis.splice(0);\n\t\t\t},\n\t\t\tcopy: function(){\n\t\t\t\tvar a = new DateArray();\n\t\t\t\ta.replace(this);\n\t\t\t\treturn a;\n\t\t\t}\n\t\t};\n\n\t\treturn function(){\n\t\t\tvar a = [];\n\t\t\ta.push.apply(a, arguments);\n\t\t\t$.extend(a, extras);\n\t\t\treturn a;\n\t\t};\n\t})();\n\n\n\t// Picker object\n\n\tvar Datepicker = function(element, options){\n\t\tthis.dates = new DateArray();\n\t\tthis.viewDate = UTCToday();\n\t\tthis.focusDate = null;\n\n\t\tthis._process_options(options);\n\n\t\tthis.element = $(element);\n\t\tthis.isInline = false;\n\t\tthis.isInput = this.element.is('input');\n\t\tthis.component = this.element.is('.date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;\n\t\tthis.hasInput = this.component && this.element.find('input').length;\n\t\tif (this.component && this.component.length === 0)\n\t\t\tthis.component = false;\n\n\t\tthis.picker = $(DPGlobal.template);\n\t\tthis._buildEvents();\n\t\tthis._attachEvents();\n\n\t\tif (this.isInline){\n\t\t\tthis.picker.addClass('datepicker-inline').appendTo(this.element);\n\t\t}\n\t\telse {\n\t\t\tthis.picker.addClass('datepicker-dropdown dropdown-menu');\n\t\t}\n\n\t\tif (this.o.rtl){\n\t\t\tthis.picker.addClass('datepicker-rtl');\n\t\t}\n\n\t\tthis.viewMode = this.o.startView;\n\n\t\tif (this.o.calendarWeeks)\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.attr('colspan', function(i, val){\n\t\t\t\t\t\t\treturn parseInt(val) + 1;\n\t\t\t\t\t\t});\n\n\t\tthis._allow_update = false;\n\n\t\tthis.setStartDate(this._o.startDate);\n\t\tthis.setEndDate(this._o.endDate);\n\t\tthis.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);\n\n\t\tthis.fillDow();\n\t\tthis.fillMonths();\n\n\t\tthis._allow_update = true;\n\n\t\tthis.update();\n\t\tthis.showMode();\n\n\t\tif (this.isInline){\n\t\t\tthis.show();\n\t\t}\n\t};\n\n\tDatepicker.prototype = {\n\t\tconstructor: Datepicker,\n\n\t\t_process_options: function(opts){\n\t\t\t// Store raw options for reference\n\t\t\tthis._o = $.extend({}, this._o, opts);\n\t\t\t// Processed options\n\t\t\tvar o = this.o = $.extend({}, this._o);\n\n\t\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t\t// fallback to 2 letter code eg \"de\"\n\t\t\tvar lang = o.language;\n\t\t\tif (!dates[lang]){\n\t\t\t\tlang = lang.split('-')[0];\n\t\t\t\tif (!dates[lang])\n\t\t\t\t\tlang = defaults.language;\n\t\t\t}\n\t\t\to.language = lang;\n\n\t\t\tswitch (o.startView){\n\t\t\t\tcase 2:\n\t\t\t\tcase 'decade':\n\t\t\t\t\to.startView = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 'year':\n\t\t\t\t\to.startView = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.startView = 0;\n\t\t\t}\n\n\t\t\tswitch (o.minViewMode){\n\t\t\t\tcase 1:\n\t\t\t\tcase 'months':\n\t\t\t\t\to.minViewMode = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 'years':\n\t\t\t\t\to.minViewMode = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.minViewMode = 0;\n\t\t\t}\n\n\t\t\to.startView = Math.max(o.startView, o.minViewMode);\n\n\t\t\t// true, false, or Number > 0\n\t\t\tif (o.multidate !== true){\n\t\t\t\to.multidate = Number(o.multidate) || false;\n\t\t\t\tif (o.multidate !== false)\n\t\t\t\t\to.multidate = Math.max(0, o.multidate);\n\t\t\t\telse\n\t\t\t\t\to.multidate = 1;\n\t\t\t}\n\t\t\to.multidateSeparator = String(o.multidateSeparator);\n\n\t\t\to.weekStart %= 7;\n\t\t\to.weekEnd = ((o.weekStart + 6) % 7);\n\n\t\t\tvar format = DPGlobal.parseFormat(o.format);\n\t\t\tif (o.startDate !== -Infinity){\n\t\t\t\tif (!!o.startDate){\n\t\t\t\t\tif (o.startDate instanceof Date)\n\t\t\t\t\t\to.startDate = this._local_to_utc(this._zero_time(o.startDate));\n\t\t\t\t\telse\n\t\t\t\t\t\to.startDate = DPGlobal.parseDate(o.startDate, format, o.language);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\to.startDate = -Infinity;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (o.endDate !== Infinity){\n\t\t\t\tif (!!o.endDate){\n\t\t\t\t\tif (o.endDate instanceof Date)\n\t\t\t\t\t\to.endDate = this._local_to_utc(this._zero_time(o.endDate));\n\t\t\t\t\telse\n\t\t\t\t\t\to.endDate = DPGlobal.parseDate(o.endDate, format, o.language);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\to.endDate = Infinity;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled||[];\n\t\t\tif (!$.isArray(o.daysOfWeekDisabled))\n\t\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\\s]*/);\n\t\t\to.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){\n\t\t\t\treturn parseInt(d, 10);\n\t\t\t});\n\n\t\t\tvar plc = String(o.orientation).toLowerCase().split(/\\s+/g),\n\t\t\t\t_plc = o.orientation.toLowerCase();\n\t\t\tplc = $.grep(plc, function(word){\n\t\t\t\treturn (/^auto|left|right|top|bottom$/).test(word);\n\t\t\t});\n\t\t\to.orientation = {x: 'auto', y: 'auto'};\n\t\t\tif (!_plc || _plc === 'auto')\n\t\t\t\t; // no action\n\t\t\telse if (plc.length === 1){\n\t\t\t\tswitch (plc[0]){\n\t\t\t\t\tcase 'top':\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\to.orientation.y = plc[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'left':\n\t\t\t\t\tcase 'right':\n\t\t\t\t\t\to.orientation.x = plc[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_plc = $.grep(plc, function(word){\n\t\t\t\t\treturn (/^left|right$/).test(word);\n\t\t\t\t});\n\t\t\t\to.orientation.x = _plc[0] || 'auto';\n\n\t\t\t\t_plc = $.grep(plc, function(word){\n\t\t\t\t\treturn (/^top|bottom$/).test(word);\n\t\t\t\t});\n\t\t\t\to.orientation.y = _plc[0] || 'auto';\n\t\t\t}\n\t\t},\n\t\t_events: [],\n\t\t_secondaryEvents: [],\n\t\t_applyEvents: function(evs){\n\t\t\tfor (var i=0, el, ch, ev; i < evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tif (evs[i].length === 2){\n\t\t\t\t\tch = undefined;\n\t\t\t\t\tev = evs[i][1];\n\t\t\t\t}\n\t\t\t\telse if (evs[i].length === 3){\n\t\t\t\t\tch = evs[i][1];\n\t\t\t\t\tev = evs[i][2];\n\t\t\t\t}\n\t\t\t\tel.on(ev, ch);\n\t\t\t}\n\t\t},\n\t\t_unapplyEvents: function(evs){\n\t\t\tfor (var i=0, el, ev, ch; i < evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tif (evs[i].length === 2){\n\t\t\t\t\tch = undefined;\n\t\t\t\t\tev = evs[i][1];\n\t\t\t\t}\n\t\t\t\telse if (evs[i].length === 3){\n\t\t\t\t\tch = evs[i][1];\n\t\t\t\t\tev = evs[i][2];\n\t\t\t\t}\n\t\t\t\tel.off(ev, ch);\n\t\t\t}\n\t\t},\n\t\t_buildEvents: function(){\n\t\t\tif (this.isInput){ // single input\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(function(e){\n\t\t\t\t\t\t\tif ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.component && this.hasInput){ // component: input + button\n\t\t\t\tthis._events = [\n\t\t\t\t\t// For components that are not readonly, allow keyboard nav\n\t\t\t\t\t[this.element.find('input'), {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(function(e){\n\t\t\t\t\t\t\tif ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}],\n\t\t\t\t\t[this.component, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.element.is('div')){  // inline datepicker\n\t\t\t\tthis.isInline = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\tthis._events.push(\n\t\t\t\t// Component: listen for blur on element descendants\n\t\t\t\t[this.element, '*', {\n\t\t\t\t\tblur: $.proxy(function(e){\n\t\t\t\t\t\tthis._focused_from = e.target;\n\t\t\t\t\t}, this)\n\t\t\t\t}],\n\t\t\t\t// Input: listen for blur on element\n\t\t\t\t[this.element, {\n\t\t\t\t\tblur: $.proxy(function(e){\n\t\t\t\t\t\tthis._focused_from = e.target;\n\t\t\t\t\t}, this)\n\t\t\t\t}]\n\t\t\t);\n\n\t\t\tthis._secondaryEvents = [\n\t\t\t\t[this.picker, {\n\t\t\t\t\tclick: $.proxy(this.click, this)\n\t\t\t\t}],\n\t\t\t\t[$(window), {\n\t\t\t\t\tresize: $.proxy(this.place, this)\n\t\t\t\t}],\n\t\t\t\t[$(document), {\n\t\t\t\t\t'mousedown touchstart': $.proxy(function(e){\n\t\t\t\t\t\t// Clicked outside the datepicker, hide it\n\t\t\t\t\t\tif (!(\n\t\t\t\t\t\t\tthis.element.is(e.target) ||\n\t\t\t\t\t\t\tthis.element.find(e.target).length ||\n\t\t\t\t\t\t\tthis.picker.is(e.target) ||\n\t\t\t\t\t\t\tthis.picker.find(e.target).length\n\t\t\t\t\t\t)){\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this)\n\t\t\t\t}]\n\t\t\t];\n\t\t},\n\t\t_attachEvents: function(){\n\t\t\tthis._detachEvents();\n\t\t\tthis._applyEvents(this._events);\n\t\t},\n\t\t_detachEvents: function(){\n\t\t\tthis._unapplyEvents(this._events);\n\t\t},\n\t\t_attachSecondaryEvents: function(){\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis._applyEvents(this._secondaryEvents);\n\t\t},\n\t\t_detachSecondaryEvents: function(){\n\t\t\tthis._unapplyEvents(this._secondaryEvents);\n\t\t},\n\t\t_trigger: function(event, altdate){\n\t\t\tvar date = altdate || this.dates.get(-1),\n\t\t\t\tlocal_date = this._utc_to_local(date);\n\n\t\t\tthis.element.trigger({\n\t\t\t\ttype: event,\n\t\t\t\tdate: local_date,\n\t\t\t\tdates: $.map(this.dates, this._utc_to_local),\n\t\t\t\tformat: $.proxy(function(ix, format){\n\t\t\t\t\tif (arguments.length === 0){\n\t\t\t\t\t\tix = this.dates.length - 1;\n\t\t\t\t\t\tformat = this.o.format;\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof ix === 'string'){\n\t\t\t\t\t\tformat = ix;\n\t\t\t\t\t\tix = this.dates.length - 1;\n\t\t\t\t\t}\n\t\t\t\t\tformat = format || this.o.format;\n\t\t\t\t\tvar date = this.dates.get(ix);\n\t\t\t\t\treturn DPGlobal.formatDate(date, format, this.o.language);\n\t\t\t\t}, this)\n\t\t\t});\n\t\t},\n\n\t\tshow: function(){\n\t\t\tif (!this.isInline)\n\t\t\t\tthis.picker.appendTo('body');\n\t\t\tthis.picker.show();\n\t\t\tthis.place();\n\t\t\tthis._attachSecondaryEvents();\n\t\t\tthis._trigger('show');\n\t\t},\n\n\t\thide: function(){\n\t\t\tif (this.isInline)\n\t\t\t\treturn;\n\t\t\tif (!this.picker.is(':visible'))\n\t\t\t\treturn;\n\t\t\tthis.focusDate = null;\n\t\t\tthis.picker.hide().detach();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.viewMode = this.o.startView;\n\t\t\tthis.showMode();\n\n\t\t\tif (\n\t\t\t\tthis.o.forceParse &&\n\t\t\t\t(\n\t\t\t\t\tthis.isInput && this.element.val() ||\n\t\t\t\t\tthis.hasInput && this.element.find('input').val()\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthis.setValue();\n\t\t\tthis._trigger('hide');\n\t\t},\n\n\t\tremove: function(){\n\t\t\tthis.hide();\n\t\t\tthis._detachEvents();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.picker.remove();\n\t\t\tdelete this.element.data().datepicker;\n\t\t\tif (!this.isInput){\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\t\t},\n\n\t\t_utc_to_local: function(utc){\n\t\t\treturn utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000));\n\t\t},\n\t\t_local_to_utc: function(local){\n\t\t\treturn local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));\n\t\t},\n\t\t_zero_time: function(local){\n\t\t\treturn local && new Date(local.getFullYear(), local.getMonth(), local.getDate());\n\t\t},\n\t\t_zero_utc_time: function(utc){\n\t\t\treturn utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()));\n\t\t},\n\n\t\tgetDates: function(){\n\t\t\treturn $.map(this.dates, this._utc_to_local);\n\t\t},\n\n\t\tgetUTCDates: function(){\n\t\t\treturn $.map(this.dates, function(d){\n\t\t\t\treturn new Date(d);\n\t\t\t});\n\t\t},\n\n\t\tgetDate: function(){\n\t\t\treturn this._utc_to_local(this.getUTCDate());\n\t\t},\n\n\t\tgetUTCDate: function(){\n\t\t\treturn new Date(this.dates.get(-1));\n\t\t},\n\n\t\tsetDates: function(){\n\t\t\tvar args = $.isArray(arguments[0]) ? arguments[0] : arguments;\n\t\t\tthis.update.apply(this, args);\n\t\t\tthis._trigger('changeDate');\n\t\t\tthis.setValue();\n\t\t},\n\n\t\tsetUTCDates: function(){\n\t\t\tvar args = $.isArray(arguments[0]) ? arguments[0] : arguments;\n\t\t\tthis.update.apply(this, $.map(args, this._utc_to_local));\n\t\t\tthis._trigger('changeDate');\n\t\t\tthis.setValue();\n\t\t},\n\n\t\tsetDate: alias('setDates'),\n\t\tsetUTCDate: alias('setUTCDates'),\n\n\t\tsetValue: function(){\n\t\t\tvar formatted = this.getFormattedDate();\n\t\t\tif (!this.isInput){\n\t\t\t\tif (this.component){\n\t\t\t\t\tthis.element.find('input').val(formatted).change();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.element.val(formatted).change();\n\t\t\t}\n\t\t},\n\n\t\tgetFormattedDate: function(format){\n\t\t\tif (format === undefined)\n\t\t\t\tformat = this.o.format;\n\n\t\t\tvar lang = this.o.language;\n\t\t\treturn $.map(this.dates, function(d){\n\t\t\t\treturn DPGlobal.formatDate(d, format, lang);\n\t\t\t}).join(this.o.multidateSeparator);\n\t\t},\n\n\t\tsetStartDate: function(startDate){\n\t\t\tthis._process_options({startDate: startDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetEndDate: function(endDate){\n\t\t\tthis._process_options({endDate: endDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetDaysOfWeekDisabled: function(daysOfWeekDisabled){\n\t\t\tthis._process_options({daysOfWeekDisabled: daysOfWeekDisabled});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tplace: function(){\n\t\t\tif (this.isInline)\n\t\t\t\treturn;\n\t\t\tvar calendarWidth = this.picker.outerWidth(),\n\t\t\t\tcalendarHeight = this.picker.outerHeight(),\n\t\t\t\tvisualPadding = 10,\n\t\t\t\twindowWidth = $window.width(),\n\t\t\t\twindowHeight = $window.height(),\n\t\t\t\tscrollTop = $window.scrollTop();\n\n\t\t\tvar zIndex = parseInt(this.element.parents().filter(function(){\n\t\t\t\t\treturn $(this).css('z-index') !== 'auto';\n\t\t\t\t}).first().css('z-index'))+10;\n\t\t\tvar offset = this.component ? this.component.parent().offset() : this.element.offset();\n\t\t\tvar height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);\n\t\t\tvar width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);\n\t\t\tvar left = offset.left,\n\t\t\t\ttop = offset.top;\n\n\t\t\tthis.picker.removeClass(\n\t\t\t\t'datepicker-orient-top datepicker-orient-bottom '+\n\t\t\t\t'datepicker-orient-right datepicker-orient-left'\n\t\t\t);\n\n\t\t\tif (this.o.orientation.x !== 'auto'){\n\t\t\t\tthis.picker.addClass('datepicker-orient-' + this.o.orientation.x);\n\t\t\t\tif (this.o.orientation.x === 'right')\n\t\t\t\t\tleft -= calendarWidth - width;\n\t\t\t}\n\t\t\t// auto x orientation is best-placement: if it crosses a window\n\t\t\t// edge, fudge it sideways\n\t\t\telse {\n\t\t\t\t// Default to left\n\t\t\t\tthis.picker.addClass('datepicker-orient-left');\n\t\t\t\tif (offset.left < 0)\n\t\t\t\t\tleft -= offset.left - visualPadding;\n\t\t\t\telse if (offset.left + calendarWidth > windowWidth)\n\t\t\t\t\tleft = windowWidth - calendarWidth - visualPadding;\n\t\t\t}\n\n\t\t\t// auto y orientation is best-situation: top or bottom, no fudging,\n\t\t\t// decision based on which shows more of the calendar\n\t\t\tvar yorient = this.o.orientation.y,\n\t\t\t\ttop_overflow, bottom_overflow;\n\t\t\tif (yorient === 'auto'){\n\t\t\t\ttop_overflow = -scrollTop + offset.top - calendarHeight;\n\t\t\t\tbottom_overflow = scrollTop + windowHeight - (offset.top + height + calendarHeight);\n\t\t\t\tif (Math.max(top_overflow, bottom_overflow) === bottom_overflow)\n\t\t\t\t\tyorient = 'top';\n\t\t\t\telse\n\t\t\t\t\tyorient = 'bottom';\n\t\t\t}\n\t\t\tthis.picker.addClass('datepicker-orient-' + yorient);\n\t\t\tif (yorient === 'top')\n\t\t\t\ttop += height;\n\t\t\telse\n\t\t\t\ttop -= calendarHeight + parseInt(this.picker.css('padding-top'));\n\n\t\t\tthis.picker.css({\n\t\t\t\ttop: top,\n\t\t\t\tleft: left,\n\t\t\t\tzIndex: zIndex\n\t\t\t});\n\t\t},\n\n\t\t_allow_update: true,\n\t\tupdate: function(){\n\t\t\tif (!this._allow_update)\n\t\t\t\treturn;\n\n\t\t\tvar oldDates = this.dates.copy(),\n\t\t\t\tdates = [],\n\t\t\t\tfromArgs = false;\n\t\t\tif (arguments.length){\n\t\t\t\t$.each(arguments, $.proxy(function(i, date){\n\t\t\t\t\tif (date instanceof Date)\n\t\t\t\t\t\tdate = this._local_to_utc(date);\n\t\t\t\t\tdates.push(date);\n\t\t\t\t}, this));\n\t\t\t\tfromArgs = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdates = this.isInput\n\t\t\t\t\t\t? this.element.val()\n\t\t\t\t\t\t: this.element.data('date') || this.element.find('input').val();\n\t\t\t\tif (dates && this.o.multidate)\n\t\t\t\t\tdates = dates.split(this.o.multidateSeparator);\n\t\t\t\telse\n\t\t\t\t\tdates = [dates];\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\n\t\t\tdates = $.map(dates, $.proxy(function(date){\n\t\t\t\treturn DPGlobal.parseDate(date, this.o.format, this.o.language);\n\t\t\t}, this));\n\t\t\tdates = $.grep(dates, $.proxy(function(date){\n\t\t\t\treturn (\n\t\t\t\t\tdate < this.o.startDate ||\n\t\t\t\t\tdate > this.o.endDate ||\n\t\t\t\t\t!date\n\t\t\t\t);\n\t\t\t}, this), true);\n\t\t\tthis.dates.replace(dates);\n\n\t\t\tif (this.dates.length)\n\t\t\t\tthis.viewDate = new Date(this.dates.get(-1));\n\t\t\telse if (this.viewDate < this.o.startDate)\n\t\t\t\tthis.viewDate = new Date(this.o.startDate);\n\t\t\telse if (this.viewDate > this.o.endDate)\n\t\t\t\tthis.viewDate = new Date(this.o.endDate);\n\n\t\t\tif (fromArgs){\n\t\t\t\t// setting date by clicking\n\t\t\t\tthis.setValue();\n\t\t\t}\n\t\t\telse if (dates.length){\n\t\t\t\t// setting date by typing\n\t\t\t\tif (String(oldDates) !== String(this.dates))\n\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t}\n\t\t\tif (!this.dates.length && oldDates.length)\n\t\t\t\tthis._trigger('clearDate');\n\n\t\t\tthis.fill();\n\t\t},\n\n\t\tfillDow: function(){\n\t\t\tvar dowCnt = this.o.weekStart,\n\t\t\t\thtml = '<tr>';\n\t\t\tif (this.o.calendarWeeks){\n\t\t\t\tvar cell = '<th class=\"cw\">&nbsp;</th>';\n\t\t\t\thtml += cell;\n\t\t\t\tthis.picker.find('.datepicker-days thead tr:first-child').prepend(cell);\n\t\t\t}\n\t\t\twhile (dowCnt < this.o.weekStart + 7){\n\t\t\t\thtml += '<th class=\"dow\">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';\n\t\t\t}\n\t\t\thtml += '</tr>';\n\t\t\tthis.picker.find('.datepicker-days thead').append(html);\n\t\t},\n\n\t\tfillMonths: function(){\n\t\t\tvar html = '',\n\t\t\ti = 0;\n\t\t\twhile (i < 12){\n\t\t\t\thtml += '<span class=\"month\">'+dates[this.o.language].monthsShort[i++]+'</span>';\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-months td').html(html);\n\t\t},\n\n\t\tsetRange: function(range){\n\t\t\tif (!range || !range.length)\n\t\t\t\tdelete this.range;\n\t\t\telse\n\t\t\t\tthis.range = $.map(range, function(d){\n\t\t\t\t\treturn d.valueOf();\n\t\t\t\t});\n\t\t\tthis.fill();\n\t\t},\n\n\t\tgetClassNames: function(date){\n\t\t\tvar cls = [],\n\t\t\t\tyear = this.viewDate.getUTCFullYear(),\n\t\t\t\tmonth = this.viewDate.getUTCMonth(),\n\t\t\t\ttoday = new Date();\n\t\t\tif (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){\n\t\t\t\tcls.push('old');\n\t\t\t}\n\t\t\telse if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){\n\t\t\t\tcls.push('new');\n\t\t\t}\n\t\t\tif (this.focusDate && date.valueOf() === this.focusDate.valueOf())\n\t\t\t\tcls.push('focused');\n\t\t\t// Compare internal UTC date with local today, not UTC today\n\t\t\tif (this.o.todayHighlight &&\n\t\t\t\tdate.getUTCFullYear() === today.getFullYear() &&\n\t\t\t\tdate.getUTCMonth() === today.getMonth() &&\n\t\t\t\tdate.getUTCDate() === today.getDate()){\n\t\t\t\tcls.push('today');\n\t\t\t}\n\t\t\tif (this.dates.contains(date) !== -1)\n\t\t\t\tcls.push('active');\n\t\t\tif (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate ||\n\t\t\t\t$.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1){\n\t\t\t\tcls.push('disabled');\n\t\t\t}\n\t\t\tif (this.range){\n\t\t\t\tif (date > this.range[0] && date < this.range[this.range.length-1]){\n\t\t\t\t\tcls.push('range');\n\t\t\t\t}\n\t\t\t\tif ($.inArray(date.valueOf(), this.range) !== -1){\n\t\t\t\t\tcls.push('selected');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cls;\n\t\t},\n\n\t\tfill: function(){\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth(),\n\t\t\t\tstartYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,\n\t\t\t\tstartMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,\n\t\t\t\tendYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,\n\t\t\t\tendMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,\n\t\t\t\ttodaytxt = dates[this.o.language].today || dates['en'].today || '',\n\t\t\t\tcleartxt = dates[this.o.language].clear || dates['en'].clear || '',\n\t\t\t\ttooltip;\n\t\t\tthis.picker.find('.datepicker-days thead th.datepicker-switch')\n\t\t\t\t\t\t.text(dates[this.o.language].months[month]+' '+year);\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.text(todaytxt)\n\t\t\t\t\t\t.toggle(this.o.todayBtn !== false);\n\t\t\tthis.picker.find('tfoot th.clear')\n\t\t\t\t\t\t.text(cleartxt)\n\t\t\t\t\t\t.toggle(this.o.clearBtn !== false);\n\t\t\tthis.updateNavArrows();\n\t\t\tthis.fillMonths();\n\t\t\tvar prevMonth = UTCDate(year, month-1, 28),\n\t\t\t\tday = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());\n\t\t\tprevMonth.setUTCDate(day);\n\t\t\tprevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);\n\t\t\tvar nextMonth = new Date(prevMonth);\n\t\t\tnextMonth.setUTCDate(nextMonth.getUTCDate() + 42);\n\t\t\tnextMonth = nextMonth.valueOf();\n\t\t\tvar html = [];\n\t\t\tvar clsName;\n\t\t\twhile (prevMonth.valueOf() < nextMonth){\n\t\t\t\tif (prevMonth.getUTCDay() === this.o.weekStart){\n\t\t\t\t\thtml.push('<tr>');\n\t\t\t\t\tif (this.o.calendarWeeks){\n\t\t\t\t\t\t// ISO 8601: First week contains first thursday.\n\t\t\t\t\t\t// ISO also states week starts on Monday, but we can be more abstract here.\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\t// Start of current week: based on weekstart/current date\n\t\t\t\t\t\t\tws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),\n\t\t\t\t\t\t\t// Thursday of this week\n\t\t\t\t\t\t\tth = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),\n\t\t\t\t\t\t\t// First Thursday of year, year from thursday\n\t\t\t\t\t\t\tyth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),\n\t\t\t\t\t\t\t// Calendar week: ms between thursdays, div ms per day, div 7 days\n\t\t\t\t\t\t\tcalWeek =  (th - yth) / 864e5 / 7 + 1;\n\t\t\t\t\t\thtml.push('<td class=\"cw\">'+ calWeek +'</td>');\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tclsName = this.getClassNames(prevMonth);\n\t\t\t\tclsName.push('day');\n\n\t\t\t\tif (this.o.beforeShowDay !== $.noop){\n\t\t\t\t\tvar before = this.o.beforeShowDay(this._utc_to_local(prevMonth));\n\t\t\t\t\tif (before === undefined)\n\t\t\t\t\t\tbefore = {};\n\t\t\t\t\telse if (typeof(before) === 'boolean')\n\t\t\t\t\t\tbefore = {enabled: before};\n\t\t\t\t\telse if (typeof(before) === 'string')\n\t\t\t\t\t\tbefore = {classes: before};\n\t\t\t\t\tif (before.enabled === false)\n\t\t\t\t\t\tclsName.push('disabled');\n\t\t\t\t\tif (before.classes)\n\t\t\t\t\t\tclsName = clsName.concat(before.classes.split(/\\s+/));\n\t\t\t\t\tif (before.tooltip)\n\t\t\t\t\t\ttooltip = before.tooltip;\n\t\t\t\t}\n\n\t\t\t\tclsName = $.unique(clsName);\n\t\t\t\thtml.push('<td class=\"'+clsName.join(' ')+'\"' + (tooltip ? ' title=\"'+tooltip+'\"' : '') + '>'+prevMonth.getUTCDate() + '</td>');\n\t\t\t\tif (prevMonth.getUTCDay() === this.o.weekEnd){\n\t\t\t\t\thtml.push('</tr>');\n\t\t\t\t}\n\t\t\t\tprevMonth.setUTCDate(prevMonth.getUTCDate()+1);\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-days tbody').empty().append(html.join(''));\n\n\t\t\tvar months = this.picker.find('.datepicker-months')\n\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t.text(year)\n\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t.find('span').removeClass('active');\n\n\t\t\t$.each(this.dates, function(i, d){\n\t\t\t\tif (d.getUTCFullYear() === year)\n\t\t\t\t\tmonths.eq(d.getUTCMonth()).addClass('active');\n\t\t\t});\n\n\t\t\tif (year < startYear || year > endYear){\n\t\t\t\tmonths.addClass('disabled');\n\t\t\t}\n\t\t\tif (year === startYear){\n\t\t\t\tmonths.slice(0, startMonth).addClass('disabled');\n\t\t\t}\n\t\t\tif (year === endYear){\n\t\t\t\tmonths.slice(endMonth+1).addClass('disabled');\n\t\t\t}\n\n\t\t\thtml = '';\n\t\t\tyear = parseInt(year/10, 10) * 10;\n\t\t\tvar yearCont = this.picker.find('.datepicker-years')\n\t\t\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t\t\t.text(year + '-' + (year + 9))\n\t\t\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t\t\t.find('td');\n\t\t\tyear -= 1;\n\t\t\tvar years = $.map(this.dates, function(d){\n\t\t\t\t\treturn d.getUTCFullYear();\n\t\t\t\t}),\n\t\t\t\tclasses;\n\t\t\tfor (var i = -1; i < 11; i++){\n\t\t\t\tclasses = ['year'];\n\t\t\t\tif (i === -1)\n\t\t\t\t\tclasses.push('old');\n\t\t\t\telse if (i === 10)\n\t\t\t\t\tclasses.push('new');\n\t\t\t\tif ($.inArray(year, years) !== -1)\n\t\t\t\t\tclasses.push('active');\n\t\t\t\tif (year < startYear || year > endYear)\n\t\t\t\t\tclasses.push('disabled');\n\t\t\t\thtml += '<span class=\"' + classes.join(' ') + '\">'+year+'</span>';\n\t\t\t\tyear += 1;\n\t\t\t}\n\t\t\tyearCont.html(html);\n\t\t},\n\n\t\tupdateNavArrows: function(){\n\t\t\tif (!this._allow_update)\n\t\t\t\treturn;\n\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth();\n\t\t\tswitch (this.viewMode){\n\t\t\t\tcase 0:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()){\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()){\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tclick: function(e){\n\t\t\te.preventDefault();\n\t\t\tvar target = $(e.target).closest('span, td, th'),\n\t\t\t\tyear, month, day;\n\t\t\tif (target.length === 1){\n\t\t\t\tswitch (target[0].nodeName.toLowerCase()){\n\t\t\t\t\tcase 'th':\n\t\t\t\t\t\tswitch (target[0].className){\n\t\t\t\t\t\t\tcase 'datepicker-switch':\n\t\t\t\t\t\t\t\tthis.showMode(1);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'prev':\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tvar dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1);\n\t\t\t\t\t\t\t\tswitch (this.viewMode){\n\t\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveMonth(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveYear(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tif (this.viewMode === 1)\n\t\t\t\t\t\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'today':\n\t\t\t\t\t\t\t\tvar date = new Date();\n\t\t\t\t\t\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\n\t\t\t\t\t\t\t\tthis.showMode(-2);\n\t\t\t\t\t\t\t\tvar which = this.o.todayBtn === 'linked' ? null : 'view';\n\t\t\t\t\t\t\t\tthis._setDate(date, which);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'clear':\n\t\t\t\t\t\t\t\tvar element;\n\t\t\t\t\t\t\t\tif (this.isInput)\n\t\t\t\t\t\t\t\t\telement = this.element;\n\t\t\t\t\t\t\t\telse if (this.component)\n\t\t\t\t\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t\t\t\t\tif (element)\n\t\t\t\t\t\t\t\t\telement.val(\"\").change();\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t\t\t\t\t\tif (this.o.autoclose)\n\t\t\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'span':\n\t\t\t\t\t\tif (!target.is('.disabled')){\n\t\t\t\t\t\t\tthis.viewDate.setUTCDate(1);\n\t\t\t\t\t\t\tif (target.is('.month')){\n\t\t\t\t\t\t\t\tday = 1;\n\t\t\t\t\t\t\t\tmonth = target.parent().find('span').index(target);\n\t\t\t\t\t\t\t\tyear = this.viewDate.getUTCFullYear();\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCMonth(month);\n\t\t\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 1){\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tday = 1;\n\t\t\t\t\t\t\t\tmonth = 0;\n\t\t\t\t\t\t\t\tyear = parseInt(target.text(), 10)||0;\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCFullYear(year);\n\t\t\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 2){\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.showMode(-1);\n\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'td':\n\t\t\t\t\t\tif (target.is('.day') && !target.is('.disabled')){\n\t\t\t\t\t\t\tday = parseInt(target.text(), 10)||1;\n\t\t\t\t\t\t\tyear = this.viewDate.getUTCFullYear();\n\t\t\t\t\t\t\tmonth = this.viewDate.getUTCMonth();\n\t\t\t\t\t\t\tif (target.is('.old')){\n\t\t\t\t\t\t\t\tif (month === 0){\n\t\t\t\t\t\t\t\t\tmonth = 11;\n\t\t\t\t\t\t\t\t\tyear -= 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tmonth -= 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (target.is('.new')){\n\t\t\t\t\t\t\t\tif (month === 11){\n\t\t\t\t\t\t\t\t\tmonth = 0;\n\t\t\t\t\t\t\t\t\tyear += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tmonth += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.picker.is(':visible') && this._focused_from){\n\t\t\t\t$(this._focused_from).focus();\n\t\t\t}\n\t\t\tdelete this._focused_from;\n\t\t},\n\n\t\t_toggle_multidate: function(date){\n\t\t\tvar ix = this.dates.contains(date);\n\t\t\tif (!date){\n\t\t\t\tthis.dates.clear();\n\t\t\t}\n\t\t\telse if (ix !== -1){\n\t\t\t\tthis.dates.remove(ix);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.dates.push(date);\n\t\t\t}\n\t\t\tif (typeof this.o.multidate === 'number')\n\t\t\t\twhile (this.dates.length > this.o.multidate)\n\t\t\t\t\tthis.dates.remove(0);\n\t\t},\n\n\t\t_setDate: function(date, which){\n\t\t\tif (!which || which === 'date')\n\t\t\t\tthis._toggle_multidate(date && new Date(date));\n\t\t\tif (!which || which  === 'view')\n\t\t\t\tthis.viewDate = date && new Date(date);\n\n\t\t\tthis.fill();\n\t\t\tthis.setValue();\n\t\t\tthis._trigger('changeDate');\n\t\t\tvar element;\n\t\t\tif (this.isInput){\n\t\t\t\telement = this.element;\n\t\t\t}\n\t\t\telse if (this.component){\n\t\t\t\telement = this.element.find('input');\n\t\t\t}\n\t\t\tif (element){\n\t\t\t\telement.change();\n\t\t\t}\n\t\t\tif (this.o.autoclose && (!which || which === 'date')){\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t},\n\n\t\tmoveMonth: function(date, dir){\n\t\t\tif (!date)\n\t\t\t\treturn undefined;\n\t\t\tif (!dir)\n\t\t\t\treturn date;\n\t\t\tvar new_date = new Date(date.valueOf()),\n\t\t\t\tday = new_date.getUTCDate(),\n\t\t\t\tmonth = new_date.getUTCMonth(),\n\t\t\t\tmag = Math.abs(dir),\n\t\t\t\tnew_month, test;\n\t\t\tdir = dir > 0 ? 1 : -1;\n\t\t\tif (mag === 1){\n\t\t\t\ttest = dir === -1\n\t\t\t\t\t// If going back one month, make sure month is not current month\n\t\t\t\t\t// (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t? function(){\n\t\t\t\t\t\treturn new_date.getUTCMonth() === month;\n\t\t\t\t\t}\n\t\t\t\t\t// If going forward one month, make sure month is as expected\n\t\t\t\t\t// (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t: function(){\n\t\t\t\t\t\treturn new_date.getUTCMonth() !== new_month;\n\t\t\t\t\t};\n\t\t\t\tnew_month = month + dir;\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t\t// Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11\n\t\t\t\tif (new_month < 0 || new_month > 11)\n\t\t\t\t\tnew_month = (new_month + 12) % 12;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// For magnitudes >1, move one month at a time...\n\t\t\t\tfor (var i=0; i < mag; i++)\n\t\t\t\t\t// ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...\n\t\t\t\t\tnew_date = this.moveMonth(new_date, dir);\n\t\t\t\t// ...then reset the day, keeping it in the new month\n\t\t\t\tnew_month = new_date.getUTCMonth();\n\t\t\t\tnew_date.setUTCDate(day);\n\t\t\t\ttest = function(){\n\t\t\t\t\treturn new_month !== new_date.getUTCMonth();\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Common date-resetting loop -- if date is beyond end of month, make it\n\t\t\t// end of month\n\t\t\twhile (test()){\n\t\t\t\tnew_date.setUTCDate(--day);\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t}\n\t\t\treturn new_date;\n\t\t},\n\n\t\tmoveYear: function(date, dir){\n\t\t\treturn this.moveMonth(date, dir*12);\n\t\t},\n\n\t\tdateWithinRange: function(date){\n\t\t\treturn date >= this.o.startDate && date <= this.o.endDate;\n\t\t},\n\n\t\tkeydown: function(e){\n\t\t\tif (this.picker.is(':not(:visible)')){\n\t\t\t\tif (e.keyCode === 27) // allow escape to hide and re-show picker\n\t\t\t\t\tthis.show();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar dateChanged = false,\n\t\t\t\tdir, newDate, newViewDate,\n\t\t\t\tfocusDate = this.focusDate || this.viewDate;\n\t\t\tswitch (e.keyCode){\n\t\t\t\tcase 27: // escape\n\t\t\t\t\tif (this.focusDate){\n\t\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.hide();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 37: // left\n\t\t\t\tcase 39: // right\n\t\t\t\t\tif (!this.o.keyboardNavigation)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdir = e.keyCode === 37 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewDate = new Date(this.dates.get(-1) || UTCToday());\n\t\t\t\t\t\tnewDate.setUTCDate(newDate.getUTCDate() + dir);\n\t\t\t\t\t\tnewViewDate = new Date(focusDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(focusDate.getUTCDate() + dir);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.focusDate = this.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38: // up\n\t\t\t\tcase 40: // down\n\t\t\t\t\tif (!this.o.keyboardNavigation)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdir = e.keyCode === 38 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewDate = new Date(this.dates.get(-1) || UTCToday());\n\t\t\t\t\t\tnewDate.setUTCDate(newDate.getUTCDate() + dir * 7);\n\t\t\t\t\t\tnewViewDate = new Date(focusDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(focusDate.getUTCDate() + dir * 7);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.focusDate = this.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32: // spacebar\n\t\t\t\t\t// Spacebar is used in manually typing dates in some formats.\n\t\t\t\t\t// As such, its behavior should not be hijacked.\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13: // enter\n\t\t\t\t\tfocusDate = this.focusDate || this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis._toggle_multidate(focusDate);\n\t\t\t\t\tdateChanged = true;\n\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis.setValue();\n\t\t\t\t\tthis.fill();\n\t\t\t\t\tif (this.picker.is(':visible')){\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (this.o.autoclose)\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 9: // tab\n\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis.fill();\n\t\t\t\t\tthis.hide();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (dateChanged){\n\t\t\t\tif (this.dates.length)\n\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t\telse\n\t\t\t\t\tthis._trigger('clearDate');\n\t\t\t\tvar element;\n\t\t\t\tif (this.isInput){\n\t\t\t\t\telement = this.element;\n\t\t\t\t}\n\t\t\t\telse if (this.component){\n\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t}\n\t\t\t\tif (element){\n\t\t\t\t\telement.change();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tshowMode: function(dir){\n\t\t\tif (dir){\n\t\t\t\tthis.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir));\n\t\t\t}\n\t\t\tthis.picker\n\t\t\t\t.find('>div')\n\t\t\t\t.hide()\n\t\t\t\t.filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName)\n\t\t\t\t\t.css('display', 'block');\n\t\t\tthis.updateNavArrows();\n\t\t}\n\t};\n\n\tvar DateRangePicker = function(element, options){\n\t\tthis.element = $(element);\n\t\tthis.inputs = $.map(options.inputs, function(i){\n\t\t\treturn i.jquery ? i[0] : i;\n\t\t});\n\t\tdelete options.inputs;\n\n\t\t$(this.inputs)\n\t\t\t.datepicker(options)\n\t\t\t.bind('changeDate', $.proxy(this.dateUpdated, this));\n\n\t\tthis.pickers = $.map(this.inputs, function(i){\n\t\t\treturn $(i).data('datepicker');\n\t\t});\n\t\tthis.updateDates();\n\t};\n\tDateRangePicker.prototype = {\n\t\tupdateDates: function(){\n\t\t\tthis.dates = $.map(this.pickers, function(i){\n\t\t\t\treturn i.getUTCDate();\n\t\t\t});\n\t\t\tthis.updateRanges();\n\t\t},\n\t\tupdateRanges: function(){\n\t\t\tvar range = $.map(this.dates, function(d){\n\t\t\t\treturn d.valueOf();\n\t\t\t});\n\t\t\t$.each(this.pickers, function(i, p){\n\t\t\t\tp.setRange(range);\n\t\t\t});\n\t\t},\n\t\tdateUpdated: function(e){\n\t\t\t// `this.updating` is a workaround for preventing infinite recursion\n\t\t\t// between `changeDate` triggering and `setUTCDate` calling.  Until\n\t\t\t// there is a better mechanism.\n\t\t\tif (this.updating)\n\t\t\t\treturn;\n\t\t\tthis.updating = true;\n\n\t\t\tvar dp = $(e.target).data('datepicker'),\n\t\t\t\tnew_date = dp.getUTCDate(),\n\t\t\t\ti = $.inArray(e.target, this.inputs),\n\t\t\t\tl = this.inputs.length;\n\t\t\tif (i === -1)\n\t\t\t\treturn;\n\n\t\t\t$.each(this.pickers, function(i, p){\n\t\t\t\tif (!p.getUTCDate())\n\t\t\t\t\tp.setUTCDate(new_date);\n\t\t\t});\n\n\t\t\tif (new_date < this.dates[i]){\n\t\t\t\t// Date being moved earlier/left\n\t\t\t\twhile (i >= 0 && new_date < this.dates[i]){\n\t\t\t\t\tthis.pickers[i--].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (new_date > this.dates[i]){\n\t\t\t\t// Date being moved later/right\n\t\t\t\twhile (i < l && new_date > this.dates[i]){\n\t\t\t\t\tthis.pickers[i++].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateDates();\n\n\t\t\tdelete this.updating;\n\t\t},\n\t\tremove: function(){\n\t\t\t$.map(this.pickers, function(p){ p.remove(); });\n\t\t\tdelete this.element.data().datepicker;\n\t\t}\n\t};\n\n\tfunction opts_from_el(el, prefix){\n\t\t// Derive options from element data-attrs\n\t\tvar data = $(el).data(),\n\t\t\tout = {}, inkey,\n\t\t\treplace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');\n\t\tprefix = new RegExp('^' + prefix.toLowerCase());\n\t\tfunction re_lower(_,a){\n\t\t\treturn a.toLowerCase();\n\t\t}\n\t\tfor (var key in data)\n\t\t\tif (prefix.test(key)){\n\t\t\t\tinkey = key.replace(replace, re_lower);\n\t\t\t\tout[inkey] = data[key];\n\t\t\t}\n\t\treturn out;\n\t}\n\n\tfunction opts_from_locale(lang){\n\t\t// Derive options from locale plugins\n\t\tvar out = {};\n\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t// fallback to 2 letter code eg \"de\"\n\t\tif (!dates[lang]){\n\t\t\tlang = lang.split('-')[0];\n\t\t\tif (!dates[lang])\n\t\t\t\treturn;\n\t\t}\n\t\tvar d = dates[lang];\n\t\t$.each(locale_opts, function(i,k){\n\t\t\tif (k in d)\n\t\t\t\tout[k] = d[k];\n\t\t});\n\t\treturn out;\n\t}\n\n\tvar old = $.fn.datepicker;\n\t$.fn.datepicker = function(option){\n\t\tvar args = Array.apply(null, arguments);\n\t\targs.shift();\n\t\tvar internal_return;\n\t\tthis.each(function(){\n\t\t\tvar $this = $(this),\n\t\t\t\tdata = $this.data('datepicker'),\n\t\t\t\toptions = typeof option === 'object' && option;\n\t\t\tif (!data){\n\t\t\t\tvar elopts = opts_from_el(this, 'date'),\n\t\t\t\t\t// Preliminary otions\n\t\t\t\t\txopts = $.extend({}, defaults, elopts, options),\n\t\t\t\t\tlocopts = opts_from_locale(xopts.language),\n\t\t\t\t\t// Options priority: js args, data-attrs, locales, defaults\n\t\t\t\t\topts = $.extend({}, defaults, locopts, elopts, options);\n\t\t\t\tif ($this.is('.input-daterange') || opts.inputs){\n\t\t\t\t\tvar ropts = {\n\t\t\t\t\t\tinputs: opts.inputs || $this.find('input').toArray()\n\t\t\t\t\t};\n\t\t\t\t\t$this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts))));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$this.data('datepicker', (data = new Datepicker(this, opts)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof option === 'string' && typeof data[option] === 'function'){\n\t\t\t\tinternal_return = data[option].apply(data, args);\n\t\t\t\tif (internal_return !== undefined)\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif (internal_return !== undefined)\n\t\t\treturn internal_return;\n\t\telse\n\t\t\treturn this;\n\t};\n\n\tvar defaults = $.fn.datepicker.defaults = {\n\t\tautoclose: false,\n\t\tbeforeShowDay: $.noop,\n\t\tcalendarWeeks: false,\n\t\tclearBtn: false,\n\t\tdaysOfWeekDisabled: [],\n\t\tendDate: Infinity,\n\t\tforceParse: true,\n\t\tformat: 'mm/dd/yyyy',\n\t\tkeyboardNavigation: true,\n\t\tlanguage: 'en',\n\t\tminViewMode: 0,\n\t\tmultidate: false,\n\t\tmultidateSeparator: ',',\n\t\torientation: \"auto\",\n\t\trtl: false,\n\t\tstartDate: -Infinity,\n\t\tstartView: 0,\n\t\ttodayBtn: false,\n\t\ttodayHighlight: false,\n\t\tweekStart: 0\n\t};\n\tvar locale_opts = $.fn.datepicker.locale_opts = [\n\t\t'format',\n\t\t'rtl',\n\t\t'weekStart'\n\t];\n\t$.fn.datepicker.Constructor = Datepicker;\n\tvar dates = $.fn.datepicker.dates = {\n\t\ten: {\n\t\t\tdays: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"],\n\t\t\tdaysShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n\t\t\tdaysMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"],\n\t\t\tmonths: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tmonthsShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\ttoday: \"Today\",\n\t\t\tclear: \"Clear\"\n\t\t}\n\t};\n\n\tvar DPGlobal = {\n\t\tmodes: [\n\t\t\t{\n\t\t\t\tclsName: 'days',\n\t\t\t\tnavFnc: 'Month',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'months',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'years',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 10\n\t\t}],\n\t\tisLeapYear: function(year){\n\t\t\treturn (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n\t\t},\n\t\tgetDaysInMonth: function(year, month){\n\t\t\treturn [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n\t\t},\n\t\tvalidParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,\n\t\tnonpunctuation: /[^ -\\/:-@\\[\\u3400-\\u9fff-`{-~\\t\\n\\r]+/g,\n\t\tparseFormat: function(format){\n\t\t\t// IE treats \\0 as a string end in inputs (truncating the value),\n\t\t\t// so it's a bad format delimiter, anyway\n\t\t\tvar separators = format.replace(this.validParts, '\\0').split('\\0'),\n\t\t\t\tparts = format.match(this.validParts);\n\t\t\tif (!separators || !separators.length || !parts || parts.length === 0){\n\t\t\t\tthrow new Error(\"Invalid date format.\");\n\t\t\t}\n\t\t\treturn {separators: separators, parts: parts};\n\t\t},\n\t\tparseDate: function(date, format, language){\n\t\t\tif (!date)\n\t\t\t\treturn undefined;\n\t\t\tif (date instanceof Date)\n\t\t\t\treturn date;\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tvar part_re = /([\\-+]\\d+)([dmwy])/,\n\t\t\t\tparts = date.match(/([\\-+]\\d+)([dmwy])/g),\n\t\t\t\tpart, dir, i;\n\t\t\tif (/^[\\-+]\\d+[dmwy]([\\s,]+[\\-+]\\d+[dmwy])*$/.test(date)){\n\t\t\t\tdate = new Date();\n\t\t\t\tfor (i=0; i < parts.length; i++){\n\t\t\t\t\tpart = part_re.exec(parts[i]);\n\t\t\t\t\tdir = parseInt(part[1]);\n\t\t\t\t\tswitch (part[2]){\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'w':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir * 7);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);\n\t\t\t}\n\t\t\tparts = date && date.match(this.nonpunctuation) || [];\n\t\t\tdate = new Date();\n\t\t\tvar parsed = {},\n\t\t\t\tsetters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],\n\t\t\t\tsetters_map = {\n\t\t\t\t\tyyyy: function(d,v){\n\t\t\t\t\t\treturn d.setUTCFullYear(v);\n\t\t\t\t\t},\n\t\t\t\t\tyy: function(d,v){\n\t\t\t\t\t\treturn d.setUTCFullYear(2000+v);\n\t\t\t\t\t},\n\t\t\t\t\tm: function(d,v){\n\t\t\t\t\t\tif (isNaN(d))\n\t\t\t\t\t\t\treturn d;\n\t\t\t\t\t\tv -= 1;\n\t\t\t\t\t\twhile (v < 0) v += 12;\n\t\t\t\t\t\tv %= 12;\n\t\t\t\t\t\td.setUTCMonth(v);\n\t\t\t\t\t\twhile (d.getUTCMonth() !== v)\n\t\t\t\t\t\t\td.setUTCDate(d.getUTCDate()-1);\n\t\t\t\t\t\treturn d;\n\t\t\t\t\t},\n\t\t\t\t\td: function(d,v){\n\t\t\t\t\t\treturn d.setUTCDate(v);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tval, filtered;\n\t\t\tsetters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];\n\t\t\tsetters_map['dd'] = setters_map['d'];\n\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\t\t\tvar fparts = format.parts.slice();\n\t\t\t// Remove noop parts\n\t\t\tif (parts.length !== fparts.length){\n\t\t\t\tfparts = $(fparts).filter(function(i,p){\n\t\t\t\t\treturn $.inArray(p, setters_order) !== -1;\n\t\t\t\t}).toArray();\n\t\t\t}\n\t\t\t// Process remainder\n\t\t\tfunction match_part(){\n\t\t\t\tvar m = this.slice(0, parts[i].length),\n\t\t\t\t\tp = parts[i].slice(0, m.length);\n\t\t\t\treturn m === p;\n\t\t\t}\n\t\t\tif (parts.length === fparts.length){\n\t\t\t\tvar cnt;\n\t\t\t\tfor (i=0, cnt = fparts.length; i < cnt; i++){\n\t\t\t\t\tval = parseInt(parts[i], 10);\n\t\t\t\t\tpart = fparts[i];\n\t\t\t\t\tif (isNaN(val)){\n\t\t\t\t\t\tswitch (part){\n\t\t\t\t\t\t\tcase 'MM':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].months).filter(match_part);\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].months) + 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].monthsShort).filter(match_part);\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].monthsShort) + 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparsed[part] = val;\n\t\t\t\t}\n\t\t\t\tvar _date, s;\n\t\t\t\tfor (i=0; i < setters_order.length; i++){\n\t\t\t\t\ts = setters_order[i];\n\t\t\t\t\tif (s in parsed && !isNaN(parsed[s])){\n\t\t\t\t\t\t_date = new Date(date);\n\t\t\t\t\t\tsetters_map[s](_date, parsed[s]);\n\t\t\t\t\t\tif (!isNaN(_date))\n\t\t\t\t\t\t\tdate = _date;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn date;\n\t\t},\n\t\tformatDate: function(date, format, language){\n\t\t\tif (!date)\n\t\t\t\treturn '';\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tvar val = {\n\t\t\t\td: date.getUTCDate(),\n\t\t\t\tD: dates[language].daysShort[date.getUTCDay()],\n\t\t\t\tDD: dates[language].days[date.getUTCDay()],\n\t\t\t\tm: date.getUTCMonth() + 1,\n\t\t\t\tM: dates[language].monthsShort[date.getUTCMonth()],\n\t\t\t\tMM: dates[language].months[date.getUTCMonth()],\n\t\t\t\tyy: date.getUTCFullYear().toString().substring(2),\n\t\t\t\tyyyy: date.getUTCFullYear()\n\t\t\t};\n\t\t\tval.dd = (val.d < 10 ? '0' : '') + val.d;\n\t\t\tval.mm = (val.m < 10 ? '0' : '') + val.m;\n\t\t\tdate = [];\n\t\t\tvar seps = $.extend([], format.separators);\n\t\t\tfor (var i=0, cnt = format.parts.length; i <= cnt; i++){\n\t\t\t\tif (seps.length)\n\t\t\t\t\tdate.push(seps.shift());\n\t\t\t\tdate.push(val[format.parts[i]]);\n\t\t\t}\n\t\t\treturn date.join('');\n\t\t},\n\t\theadTemplate: '<thead>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th class=\"prev\">&laquo;</th>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"5\" class=\"datepicker-switch\"></th>'+\n\t\t\t\t\t\t\t\t'<th class=\"next\">&raquo;</th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</thead>',\n\t\tcontTemplate: '<tbody><tr><td colspan=\"7\"></td></tr></tbody>',\n\t\tfootTemplate: '<tfoot>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"7\" class=\"today\"></th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"7\" class=\"clear\"></th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</tfoot>'\n\t};\n\tDPGlobal.template = '<div class=\"datepicker\">'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-days\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\t'<tbody></tbody>'+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-months\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-years\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t'</div>';\n\n\t$.fn.datepicker.DPGlobal = DPGlobal;\n\n\n\t/* DATEPICKER NO CONFLICT\n\t* =================== */\n\n\t$.fn.datepicker.noConflict = function(){\n\t\t$.fn.datepicker = old;\n\t\treturn this;\n\t};\n\n\n\t/* DATEPICKER DATA-API\n\t* ================== */\n\n\t$(document).on(\n\t\t'focus.datepicker.data-api click.datepicker.data-api',\n\t\t'[data-provide=\"datepicker\"]',\n\t\tfunction(e){\n\t\t\tvar $this = $(this);\n\t\t\tif ($this.data('datepicker'))\n\t\t\t\treturn;\n\t\t\te.preventDefault();\n\t\t\t// component click requires us to explicitly show it\n\t\t\t$this.datepicker('show');\n\t\t}\n\t);\n\t$(function(){\n\t\t$('[data-provide=\"datepicker-inline\"]').datepicker();\n\t});\n\n}(window.jQuery));\n","/*!\n * Select2 4.0.0\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\n */\n(function (factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(['jquery'], factory);\n  } else if (typeof exports === 'object') {\n    // Node/CommonJS\n    factory(require('jquery'));\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n}(function (jQuery) {\n  // This is needed so we can catch the AMD loader configuration and use it\n  // The inner file should be wrapped (by `banner.start.js`) in a function that\n  // returns the AMD loader references.\n  var S2 =\n(function () {\n  // Restore the Select2 AMD loader so it can be used\n  // Needed mostly in the language files, where the loader is not inserted\n  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {\n    var S2 = jQuery.fn.select2.amd;\n  }\nvar S2;(function () { if (!S2 || !S2.requirejs) {\nif (!S2) { S2 = {}; } else { require = S2; }\n/**\n * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/almond for details\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*jslint sloppy: true */\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n    var main, req, makeMap, handlers,\n        defined = {},\n        waiting = {},\n        config = {},\n        defining = {},\n        hasOwn = Object.prototype.hasOwnProperty,\n        aps = [].slice,\n        jsSuffixRegExp = /\\.js$/;\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    /**\n     * Given a relative module name, like ./something, normalize it to\n     * a real name that can be mapped to a path.\n     * @param {String} name the relative name\n     * @param {String} baseName a real name that the name arg is relative\n     * to.\n     * @returns {String} normalized name\n     */\n    function normalize(name, baseName) {\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n            foundI, foundStarMap, starI, i, j, part,\n            baseParts = baseName && baseName.split(\"/\"),\n            map = config.map,\n            starMap = (map && map['*']) || {};\n\n        //Adjust any relative paths.\n        if (name && name.charAt(0) === \".\") {\n            //If have a base name, try to normalize against it,\n            //otherwise, assume it is a top-level require that will\n            //be relative to baseUrl in the end.\n            if (baseName) {\n                //Convert baseName to array, and lop off the last part,\n                //so that . matches that \"directory\" and not name of the baseName's\n                //module. For instance, baseName of \"one/two/three\", maps to\n                //\"one/two/three.js\", but we want the directory, \"one/two\" for\n                //this normalization.\n                baseParts = baseParts.slice(0, baseParts.length - 1);\n                name = name.split('/');\n                lastIndex = name.length - 1;\n\n                // Node .js allowance:\n                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n                }\n\n                name = baseParts.concat(name);\n\n                //start trimDots\n                for (i = 0; i < name.length; i += 1) {\n                    part = name[i];\n                    if (part === \".\") {\n                        name.splice(i, 1);\n                        i -= 1;\n                    } else if (part === \"..\") {\n                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {\n                            //End of the line. Keep at least one non-dot\n                            //path segment at the front so it can be mapped\n                            //correctly to disk. Otherwise, there is likely\n                            //no path mapping for a path starting with '..'.\n                            //This can still fail, but catches the most reasonable\n                            //uses of ..\n                            break;\n                        } else if (i > 0) {\n                            name.splice(i - 1, 2);\n                            i -= 2;\n                        }\n                    }\n                }\n                //end trimDots\n\n                name = name.join(\"/\");\n            } else if (name.indexOf('./') === 0) {\n                // No baseName, so this is ID is resolved relative\n                // to baseUrl, pull off the leading dot.\n                name = name.substring(2);\n            }\n        }\n\n        //Apply map config if available.\n        if ((baseParts || starMap) && map) {\n            nameParts = name.split('/');\n\n            for (i = nameParts.length; i > 0; i -= 1) {\n                nameSegment = nameParts.slice(0, i).join(\"/\");\n\n                if (baseParts) {\n                    //Find the longest baseName segment match in the config.\n                    //So, do joins on the biggest to smallest lengths of baseParts.\n                    for (j = baseParts.length; j > 0; j -= 1) {\n                        mapValue = map[baseParts.slice(0, j).join('/')];\n\n                        //baseName segment has  config, find if it has one for\n                        //this name.\n                        if (mapValue) {\n                            mapValue = mapValue[nameSegment];\n                            if (mapValue) {\n                                //Match, update name to the new value.\n                                foundMap = mapValue;\n                                foundI = i;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (foundMap) {\n                    break;\n                }\n\n                //Check for a star map match, but just hold on to it,\n                //if there is a shorter segment match later in a matching\n                //config, then favor over this star map.\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\n                    foundStarMap = starMap[nameSegment];\n                    starI = i;\n                }\n            }\n\n            if (!foundMap && foundStarMap) {\n                foundMap = foundStarMap;\n                foundI = starI;\n            }\n\n            if (foundMap) {\n                nameParts.splice(0, foundI, foundMap);\n                name = nameParts.join('/');\n            }\n        }\n\n        return name;\n    }\n\n    function makeRequire(relName, forceSync) {\n        return function () {\n            //A version of a require function that passes a moduleName\n            //value for items that may need to\n            //look up paths relative to the moduleName\n            return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));\n        };\n    }\n\n    function makeNormalize(relName) {\n        return function (name) {\n            return normalize(name, relName);\n        };\n    }\n\n    function makeLoad(depName) {\n        return function (value) {\n            defined[depName] = value;\n        };\n    }\n\n    function callDep(name) {\n        if (hasProp(waiting, name)) {\n            var args = waiting[name];\n            delete waiting[name];\n            defining[name] = true;\n            main.apply(undef, args);\n        }\n\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\n            throw new Error('No ' + name);\n        }\n        return defined[name];\n    }\n\n    //Turns a plugin!resource to [plugin, resource]\n    //with the plugin being undefined if the name\n    //did not have a plugin prefix.\n    function splitPrefix(name) {\n        var prefix,\n            index = name ? name.indexOf('!') : -1;\n        if (index > -1) {\n            prefix = name.substring(0, index);\n            name = name.substring(index + 1, name.length);\n        }\n        return [prefix, name];\n    }\n\n    /**\n     * Makes a name map, normalizing the name, and using a plugin\n     * for normalization if necessary. Grabs a ref to plugin\n     * too, as an optimization.\n     */\n    makeMap = function (name, relName) {\n        var plugin,\n            parts = splitPrefix(name),\n            prefix = parts[0];\n\n        name = parts[1];\n\n        if (prefix) {\n            prefix = normalize(prefix, relName);\n            plugin = callDep(prefix);\n        }\n\n        //Normalize according\n        if (prefix) {\n            if (plugin && plugin.normalize) {\n                name = plugin.normalize(name, makeNormalize(relName));\n            } else {\n                name = normalize(name, relName);\n            }\n        } else {\n            name = normalize(name, relName);\n            parts = splitPrefix(name);\n            prefix = parts[0];\n            name = parts[1];\n            if (prefix) {\n                plugin = callDep(prefix);\n            }\n        }\n\n        //Using ridiculous property names for space reasons\n        return {\n            f: prefix ? prefix + '!' + name : name, //fullName\n            n: name,\n            pr: prefix,\n            p: plugin\n        };\n    };\n\n    function makeConfig(name) {\n        return function () {\n            return (config && config.config && config.config[name]) || {};\n        };\n    }\n\n    handlers = {\n        require: function (name) {\n            return makeRequire(name);\n        },\n        exports: function (name) {\n            var e = defined[name];\n            if (typeof e !== 'undefined') {\n                return e;\n            } else {\n                return (defined[name] = {});\n            }\n        },\n        module: function (name) {\n            return {\n                id: name,\n                uri: '',\n                exports: defined[name],\n                config: makeConfig(name)\n            };\n        }\n    };\n\n    main = function (name, deps, callback, relName) {\n        var cjsModule, depName, ret, map, i,\n            args = [],\n            callbackType = typeof callback,\n            usingExports;\n\n        //Use name if no relName\n        relName = relName || name;\n\n        //Call the callback to define the module, if necessary.\n        if (callbackType === 'undefined' || callbackType === 'function') {\n            //Pull out the defined dependencies and pass the ordered\n            //values to the callback.\n            //Default to [require, exports, module] if no deps\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n            for (i = 0; i < deps.length; i += 1) {\n                map = makeMap(deps[i], relName);\n                depName = map.f;\n\n                //Fast path CommonJS standard dependencies.\n                if (depName === \"require\") {\n                    args[i] = handlers.require(name);\n                } else if (depName === \"exports\") {\n                    //CommonJS module spec 1.1\n                    args[i] = handlers.exports(name);\n                    usingExports = true;\n                } else if (depName === \"module\") {\n                    //CommonJS module spec 1.1\n                    cjsModule = args[i] = handlers.module(name);\n                } else if (hasProp(defined, depName) ||\n                           hasProp(waiting, depName) ||\n                           hasProp(defining, depName)) {\n                    args[i] = callDep(depName);\n                } else if (map.p) {\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n                    args[i] = defined[depName];\n                } else {\n                    throw new Error(name + ' missing ' + depName);\n                }\n            }\n\n            ret = callback ? callback.apply(defined[name], args) : undefined;\n\n            if (name) {\n                //If setting exports via \"module\" is in play,\n                //favor that over return value and exports. After that,\n                //favor a non-undefined return value over exports use.\n                if (cjsModule && cjsModule.exports !== undef &&\n                        cjsModule.exports !== defined[name]) {\n                    defined[name] = cjsModule.exports;\n                } else if (ret !== undef || !usingExports) {\n                    //Use the return value from the function.\n                    defined[name] = ret;\n                }\n            }\n        } else if (name) {\n            //May just be an object definition for the module. Only\n            //worry about defining if have a module name.\n            defined[name] = callback;\n        }\n    };\n\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n        if (typeof deps === \"string\") {\n            if (handlers[deps]) {\n                //callback in this case is really relName\n                return handlers[deps](callback);\n            }\n            //Just return the module wanted. In this scenario, the\n            //deps arg is the module name, and second arg (if passed)\n            //is just the relName.\n            //Normalize module name, if it contains . or ..\n            return callDep(makeMap(deps, callback).f);\n        } else if (!deps.splice) {\n            //deps is a config object, not an array.\n            config = deps;\n            if (config.deps) {\n                req(config.deps, config.callback);\n            }\n            if (!callback) {\n                return;\n            }\n\n            if (callback.splice) {\n                //callback is an array, which means it is a dependency list.\n                //Adjust args if there are dependencies\n                deps = callback;\n                callback = relName;\n                relName = null;\n            } else {\n                deps = undef;\n            }\n        }\n\n        //Support require(['a'])\n        callback = callback || function () {};\n\n        //If relName is a function, it is an errback handler,\n        //so remove it.\n        if (typeof relName === 'function') {\n            relName = forceSync;\n            forceSync = alt;\n        }\n\n        //Simulate async callback;\n        if (forceSync) {\n            main(undef, deps, callback, relName);\n        } else {\n            //Using a non-zero value because of concern for what old browsers\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n            //If want a value immediately, use require('id') instead -- something\n            //that works in almond on the global level, but not guaranteed and\n            //unlikely to work in other AMD implementations.\n            setTimeout(function () {\n                main(undef, deps, callback, relName);\n            }, 4);\n        }\n\n        return req;\n    };\n\n    /**\n     * Just drops the config on the floor, but returns req in case\n     * the config return value is used.\n     */\n    req.config = function (cfg) {\n        return req(cfg);\n    };\n\n    /**\n     * Expose module registry for debugging and tooling\n     */\n    requirejs._defined = defined;\n\n    define = function (name, deps, callback) {\n\n        //This module may not have dependencies\n        if (!deps.splice) {\n            //deps is not an array, so probably means\n            //an object literal or factory function for\n            //the value. Adjust args.\n            callback = deps;\n            deps = [];\n        }\n\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n            waiting[name] = [name, deps, callback];\n        }\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n}());\n\nS2.requirejs = requirejs;S2.require = require;S2.define = define;\n}\n}());\nS2.define(\"almond\", function(){});\n\n/* global jQuery:false, $:false */\nS2.define('jquery',[],function () {\n  var _$ = jQuery || $;\n\n  if (_$ == null && console && console.error) {\n    console.error(\n      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +\n      'found. Make sure that you are including jQuery before Select2 on your ' +\n      'web page.'\n    );\n  }\n\n  return _$;\n});\n\nS2.define('select2/utils',[\n  'jquery'\n], function ($) {\n  var Utils = {};\n\n  Utils.Extend = function (ChildClass, SuperClass) {\n    var __hasProp = {}.hasOwnProperty;\n\n    function BaseConstructor () {\n      this.constructor = ChildClass;\n    }\n\n    for (var key in SuperClass) {\n      if (__hasProp.call(SuperClass, key)) {\n        ChildClass[key] = SuperClass[key];\n      }\n    }\n\n    BaseConstructor.prototype = SuperClass.prototype;\n    ChildClass.prototype = new BaseConstructor();\n    ChildClass.__super__ = SuperClass.prototype;\n\n    return ChildClass;\n  };\n\n  function getMethods (theClass) {\n    var proto = theClass.prototype;\n\n    var methods = [];\n\n    for (var methodName in proto) {\n      var m = proto[methodName];\n\n      if (typeof m !== 'function') {\n        continue;\n      }\n\n      if (methodName === 'constructor') {\n        continue;\n      }\n\n      methods.push(methodName);\n    }\n\n    return methods;\n  }\n\n  Utils.Decorate = function (SuperClass, DecoratorClass) {\n    var decoratedMethods = getMethods(DecoratorClass);\n    var superMethods = getMethods(SuperClass);\n\n    function DecoratedClass () {\n      var unshift = Array.prototype.unshift;\n\n      var argCount = DecoratorClass.prototype.constructor.length;\n\n      var calledConstructor = SuperClass.prototype.constructor;\n\n      if (argCount > 0) {\n        unshift.call(arguments, SuperClass.prototype.constructor);\n\n        calledConstructor = DecoratorClass.prototype.constructor;\n      }\n\n      calledConstructor.apply(this, arguments);\n    }\n\n    DecoratorClass.displayName = SuperClass.displayName;\n\n    function ctr () {\n      this.constructor = DecoratedClass;\n    }\n\n    DecoratedClass.prototype = new ctr();\n\n    for (var m = 0; m < superMethods.length; m++) {\n        var superMethod = superMethods[m];\n\n        DecoratedClass.prototype[superMethod] =\n          SuperClass.prototype[superMethod];\n    }\n\n    var calledMethod = function (methodName) {\n      // Stub out the original method if it's not decorating an actual method\n      var originalMethod = function () {};\n\n      if (methodName in DecoratedClass.prototype) {\n        originalMethod = DecoratedClass.prototype[methodName];\n      }\n\n      var decoratedMethod = DecoratorClass.prototype[methodName];\n\n      return function () {\n        var unshift = Array.prototype.unshift;\n\n        unshift.call(arguments, originalMethod);\n\n        return decoratedMethod.apply(this, arguments);\n      };\n    };\n\n    for (var d = 0; d < decoratedMethods.length; d++) {\n      var decoratedMethod = decoratedMethods[d];\n\n      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n    }\n\n    return DecoratedClass;\n  };\n\n  var Observable = function () {\n    this.listeners = {};\n  };\n\n  Observable.prototype.on = function (event, callback) {\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.listeners[event].push(callback);\n    } else {\n      this.listeners[event] = [callback];\n    }\n  };\n\n  Observable.prototype.trigger = function (event) {\n    var slice = Array.prototype.slice;\n\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.invoke(this.listeners[event], slice.call(arguments, 1));\n    }\n\n    if ('*' in this.listeners) {\n      this.invoke(this.listeners['*'], arguments);\n    }\n  };\n\n  Observable.prototype.invoke = function (listeners, params) {\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      listeners[i].apply(this, params);\n    }\n  };\n\n  Utils.Observable = Observable;\n\n  Utils.generateChars = function (length) {\n    var chars = '';\n\n    for (var i = 0; i < length; i++) {\n      var randomChar = Math.floor(Math.random() * 36);\n      chars += randomChar.toString(36);\n    }\n\n    return chars;\n  };\n\n  Utils.bind = function (func, context) {\n    return function () {\n      func.apply(context, arguments);\n    };\n  };\n\n  Utils._convertData = function (data) {\n    for (var originalKey in data) {\n      var keys = originalKey.split('-');\n\n      var dataLevel = data;\n\n      if (keys.length === 1) {\n        continue;\n      }\n\n      for (var k = 0; k < keys.length; k++) {\n        var key = keys[k];\n\n        // Lowercase the first letter\n        // By default, dash-separated becomes camelCase\n        key = key.substring(0, 1).toLowerCase() + key.substring(1);\n\n        if (!(key in dataLevel)) {\n          dataLevel[key] = {};\n        }\n\n        if (k == keys.length - 1) {\n          dataLevel[key] = data[originalKey];\n        }\n\n        dataLevel = dataLevel[key];\n      }\n\n      delete data[originalKey];\n    }\n\n    return data;\n  };\n\n  Utils.hasScroll = function (index, el) {\n    // Adapted from the function created by @ShadowScripter\n    // and adapted by @BillBarry on the Stack Exchange Code Review website.\n    // The original code can be found at\n    // http://codereview.stackexchange.com/q/13338\n    // and was designed to be used with the Sizzle selector engine.\n\n    var $el = $(el);\n    var overflowX = el.style.overflowX;\n    var overflowY = el.style.overflowY;\n\n    //Check both x and y declarations\n    if (overflowX === overflowY &&\n        (overflowY === 'hidden' || overflowY === 'visible')) {\n      return false;\n    }\n\n    if (overflowX === 'scroll' || overflowY === 'scroll') {\n      return true;\n    }\n\n    return ($el.innerHeight() < el.scrollHeight ||\n      $el.innerWidth() < el.scrollWidth);\n  };\n\n  Utils.escapeMarkup = function (markup) {\n    var replaceMap = {\n      '\\\\': '&#92;',\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      '\\'': '&#39;',\n      '/': '&#47;'\n    };\n\n    // Do not try to escape the markup if it's not a string\n    if (typeof markup !== 'string') {\n      return markup;\n    }\n\n    return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n      return replaceMap[match];\n    });\n  };\n\n  // Append an array of jQuery nodes to a given element.\n  Utils.appendMany = function ($element, $nodes) {\n    // jQuery 1.7.x does not support $.fn.append() with an array\n    // Fall back to a jQuery object collection using $.fn.add()\n    if ($.fn.jquery.substr(0, 3) === '1.7') {\n      var $jqNodes = $();\n\n      $.map($nodes, function (node) {\n        $jqNodes = $jqNodes.add(node);\n      });\n\n      $nodes = $jqNodes;\n    }\n\n    $element.append($nodes);\n  };\n\n  return Utils;\n});\n\nS2.define('select2/results',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Results ($element, options, dataAdapter) {\n    this.$element = $element;\n    this.data = dataAdapter;\n    this.options = options;\n\n    Results.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Results, Utils.Observable);\n\n  Results.prototype.render = function () {\n    var $results = $(\n      '<ul class=\"select2-results__options\" role=\"tree\"></ul>'\n    );\n\n    if (this.options.get('multiple')) {\n      $results.attr('aria-multiselectable', 'true');\n    }\n\n    this.$results = $results;\n\n    return $results;\n  };\n\n  Results.prototype.clear = function () {\n    this.$results.empty();\n  };\n\n  Results.prototype.displayMessage = function (params) {\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    this.clear();\n    this.hideLoading();\n\n    var $message = $(\n      '<li role=\"treeitem\" class=\"select2-results__option\"></li>'\n    );\n\n    var message = this.options.get('translations').get(params.message);\n\n    $message.append(\n      escapeMarkup(\n        message(params.args)\n      )\n    );\n\n    this.$results.append($message);\n  };\n\n  Results.prototype.append = function (data) {\n    this.hideLoading();\n\n    var $options = [];\n\n    if (data.results == null || data.results.length === 0) {\n      if (this.$results.children().length === 0) {\n        this.trigger('results:message', {\n          message: 'noResults'\n        });\n      }\n\n      return;\n    }\n\n    data.results = this.sort(data.results);\n\n    for (var d = 0; d < data.results.length; d++) {\n      var item = data.results[d];\n\n      var $option = this.option(item);\n\n      $options.push($option);\n    }\n\n    this.$results.append($options);\n  };\n\n  Results.prototype.position = function ($results, $dropdown) {\n    var $resultsContainer = $dropdown.find('.select2-results');\n    $resultsContainer.append($results);\n  };\n\n  Results.prototype.sort = function (data) {\n    var sorter = this.options.get('sorter');\n\n    return sorter(data);\n  };\n\n  Results.prototype.setClasses = function () {\n    var self = this;\n\n    this.data.current(function (selected) {\n      var selectedIds = $.map(selected, function (s) {\n        return s.id.toString();\n      });\n\n      var $options = self.$results\n        .find('.select2-results__option[aria-selected]');\n\n      $options.each(function () {\n        var $option = $(this);\n\n        var item = $.data(this, 'data');\n\n        // id needs to be converted to a string when comparing\n        var id = '' + item.id;\n\n        if ((item.element != null && item.element.selected) ||\n            (item.element == null && $.inArray(id, selectedIds) > -1)) {\n          $option.attr('aria-selected', 'true');\n        } else {\n          $option.attr('aria-selected', 'false');\n        }\n      });\n\n      var $selected = $options.filter('[aria-selected=true]');\n\n      // Check if there are any selected options\n      if ($selected.length > 0) {\n        // If there are selected options, highlight the first\n        $selected.first().trigger('mouseenter');\n      } else {\n        // If there are no selected options, highlight the first option\n        // in the dropdown\n        $options.first().trigger('mouseenter');\n      }\n    });\n  };\n\n  Results.prototype.showLoading = function (params) {\n    this.hideLoading();\n\n    var loadingMore = this.options.get('translations').get('searching');\n\n    var loading = {\n      disabled: true,\n      loading: true,\n      text: loadingMore(params)\n    };\n    var $loading = this.option(loading);\n    $loading.className += ' loading-results';\n\n    this.$results.prepend($loading);\n  };\n\n  Results.prototype.hideLoading = function () {\n    this.$results.find('.loading-results').remove();\n  };\n\n  Results.prototype.option = function (data) {\n    var option = document.createElement('li');\n    option.className = 'select2-results__option';\n\n    var attrs = {\n      'role': 'treeitem',\n      'aria-selected': 'false'\n    };\n\n    if (data.disabled) {\n      delete attrs['aria-selected'];\n      attrs['aria-disabled'] = 'true';\n    }\n\n    if (data.id == null) {\n      delete attrs['aria-selected'];\n    }\n\n    if (data._resultId != null) {\n      option.id = data._resultId;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    if (data.children) {\n      attrs.role = 'group';\n      attrs['aria-label'] = data.text;\n      delete attrs['aria-selected'];\n    }\n\n    for (var attr in attrs) {\n      var val = attrs[attr];\n\n      option.setAttribute(attr, val);\n    }\n\n    if (data.children) {\n      var $option = $(option);\n\n      var label = document.createElement('strong');\n      label.className = 'select2-results__group';\n\n      var $label = $(label);\n      this.template(data, label);\n\n      var $children = [];\n\n      for (var c = 0; c < data.children.length; c++) {\n        var child = data.children[c];\n\n        var $child = this.option(child);\n\n        $children.push($child);\n      }\n\n      var $childrenContainer = $('<ul></ul>', {\n        'class': 'select2-results__options select2-results__options--nested'\n      });\n\n      $childrenContainer.append($children);\n\n      $option.append(label);\n      $option.append($childrenContainer);\n    } else {\n      this.template(data, option);\n    }\n\n    $.data(option, 'data', data);\n\n    return option;\n  };\n\n  Results.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-results';\n\n    this.$results.attr('id', id);\n\n    container.on('results:all', function (params) {\n      self.clear();\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('results:append', function (params) {\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('query', function (params) {\n      self.showLoading(params);\n    });\n\n    container.on('select', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('unselect', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expended=\"true\"\n      self.$results.attr('aria-expanded', 'true');\n      self.$results.attr('aria-hidden', 'false');\n\n      self.setClasses();\n      self.ensureHighlightVisible();\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expended=\"false\"\n      self.$results.attr('aria-expanded', 'false');\n      self.$results.attr('aria-hidden', 'true');\n      self.$results.removeAttr('aria-activedescendant');\n    });\n\n    container.on('results:toggle', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      $highlighted.trigger('mouseup');\n    });\n\n    container.on('results:select', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      var data = $highlighted.data('data');\n\n      if ($highlighted.attr('aria-selected') == 'true') {\n        self.trigger('close');\n      } else {\n        self.trigger('select', {\n          data: data\n        });\n      }\n    });\n\n    container.on('results:previous', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      // If we are already at te top, don't move further\n      if (currentIndex === 0) {\n        return;\n      }\n\n      var nextIndex = currentIndex - 1;\n\n      // If none are highlighted, highlight the first\n      if ($highlighted.length === 0) {\n        nextIndex = 0;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top;\n      var nextTop = $next.offset().top;\n      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextTop - currentOffset < 0) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:next', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      var nextIndex = currentIndex + 1;\n\n      // If we are at the last option, stay there\n      if (nextIndex >= $options.length) {\n        return;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var nextBottom = $next.offset().top + $next.outerHeight(false);\n      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextBottom > currentOffset) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      params.element.addClass('select2-results__option--highlighted');\n    });\n\n    container.on('results:message', function (params) {\n      self.displayMessage(params);\n    });\n\n    if ($.fn.mousewheel) {\n      this.$results.on('mousewheel', function (e) {\n        var top = self.$results.scrollTop();\n\n        var bottom = (\n          self.$results.get(0).scrollHeight -\n          self.$results.scrollTop() +\n          e.deltaY\n        );\n\n        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n\n        if (isAtTop) {\n          self.$results.scrollTop(0);\n\n          e.preventDefault();\n          e.stopPropagation();\n        } else if (isAtBottom) {\n          self.$results.scrollTop(\n            self.$results.get(0).scrollHeight - self.$results.height()\n          );\n\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      });\n    }\n\n    this.$results.on('mouseup', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var $this = $(this);\n\n      var data = $this.data('data');\n\n      if ($this.attr('aria-selected') === 'true') {\n        if (self.options.get('multiple')) {\n          self.trigger('unselect', {\n            originalEvent: evt,\n            data: data\n          });\n        } else {\n          self.trigger('close');\n        }\n\n        return;\n      }\n\n      self.trigger('select', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n\n    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var data = $(this).data('data');\n\n      self.getHighlightedResults()\n          .removeClass('select2-results__option--highlighted');\n\n      self.trigger('results:focus', {\n        data: data,\n        element: $(this)\n      });\n    });\n  };\n\n  Results.prototype.getHighlightedResults = function () {\n    var $highlighted = this.$results\n    .find('.select2-results__option--highlighted');\n\n    return $highlighted;\n  };\n\n  Results.prototype.destroy = function () {\n    this.$results.remove();\n  };\n\n  Results.prototype.ensureHighlightVisible = function () {\n    var $highlighted = this.getHighlightedResults();\n\n    if ($highlighted.length === 0) {\n      return;\n    }\n\n    var $options = this.$results.find('[aria-selected]');\n\n    var currentIndex = $options.index($highlighted);\n\n    var currentOffset = this.$results.offset().top;\n    var nextTop = $highlighted.offset().top;\n    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n\n    var offsetDelta = nextTop - currentOffset;\n    nextOffset -= $highlighted.outerHeight(false) * 2;\n\n    if (currentIndex <= 2) {\n      this.$results.scrollTop(0);\n    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n      this.$results.scrollTop(nextOffset);\n    }\n  };\n\n  Results.prototype.template = function (result, container) {\n    var template = this.options.get('templateResult');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    var content = template(result);\n\n    if (content == null) {\n      container.style.display = 'none';\n    } else if (typeof content === 'string') {\n      container.innerHTML = escapeMarkup(content);\n    } else {\n      $(container).append(content);\n    }\n  };\n\n  return Results;\n});\n\nS2.define('select2/keys',[\n\n], function () {\n  var KEYS = {\n    BACKSPACE: 8,\n    TAB: 9,\n    ENTER: 13,\n    SHIFT: 16,\n    CTRL: 17,\n    ALT: 18,\n    ESC: 27,\n    SPACE: 32,\n    PAGE_UP: 33,\n    PAGE_DOWN: 34,\n    END: 35,\n    HOME: 36,\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    DELETE: 46\n  };\n\n  return KEYS;\n});\n\nS2.define('select2/selection/base',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function BaseSelection ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    BaseSelection.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseSelection, Utils.Observable);\n\n  BaseSelection.prototype.render = function () {\n    var $selection = $(\n      '<span class=\"select2-selection\" role=\"combobox\" ' +\n      'aria-autocomplete=\"list\" aria-haspopup=\"true\" aria-expanded=\"false\">' +\n      '</span>'\n    );\n\n    this._tabindex = 0;\n\n    if (this.$element.data('old-tabindex') != null) {\n      this._tabindex = this.$element.data('old-tabindex');\n    } else if (this.$element.attr('tabindex') != null) {\n      this._tabindex = this.$element.attr('tabindex');\n    }\n\n    $selection.attr('title', this.$element.attr('title'));\n    $selection.attr('tabindex', this._tabindex);\n\n    this.$selection = $selection;\n\n    return $selection;\n  };\n\n  BaseSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-container';\n    var resultsId = container.id + '-results';\n\n    this.container = container;\n\n    this.$selection.on('focus', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('blur', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      if (evt.which === KEYS.SPACE) {\n        evt.preventDefault();\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      self.$selection.attr('aria-activedescendant', params.data._resultId);\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expanded=\"true\"\n      self.$selection.attr('aria-expanded', 'true');\n      self.$selection.attr('aria-owns', resultsId);\n\n      self._attachCloseHandler(container);\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expanded=\"false\"\n      self.$selection.attr('aria-expanded', 'false');\n      self.$selection.removeAttr('aria-activedescendant');\n      self.$selection.removeAttr('aria-owns');\n\n      self.$selection.focus();\n\n      self._detachCloseHandler(container);\n    });\n\n    container.on('enable', function () {\n      self.$selection.attr('tabindex', self._tabindex);\n    });\n\n    container.on('disable', function () {\n      self.$selection.attr('tabindex', '-1');\n    });\n  };\n\n  BaseSelection.prototype._attachCloseHandler = function (container) {\n    var self = this;\n\n    $(document.body).on('mousedown.select2.' + container.id, function (e) {\n      var $target = $(e.target);\n\n      var $select = $target.closest('.select2');\n\n      var $all = $('.select2.select2-container--open');\n\n      $all.each(function () {\n        var $this = $(this);\n\n        if (this == $select[0]) {\n          return;\n        }\n\n        var $element = $this.data('element');\n\n        $element.select2('close');\n      });\n    });\n  };\n\n  BaseSelection.prototype._detachCloseHandler = function (container) {\n    $(document.body).off('mousedown.select2.' + container.id);\n  };\n\n  BaseSelection.prototype.position = function ($selection, $container) {\n    var $selectionContainer = $container.find('.selection');\n    $selectionContainer.append($selection);\n  };\n\n  BaseSelection.prototype.destroy = function () {\n    this._detachCloseHandler(this.container);\n  };\n\n  BaseSelection.prototype.update = function (data) {\n    throw new Error('The `update` method must be defined in child classes.');\n  };\n\n  return BaseSelection;\n});\n\nS2.define('select2/selection/single',[\n  'jquery',\n  './base',\n  '../utils',\n  '../keys'\n], function ($, BaseSelection, Utils, KEYS) {\n  function SingleSelection () {\n    SingleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(SingleSelection, BaseSelection);\n\n  SingleSelection.prototype.render = function () {\n    var $selection = SingleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--single');\n\n    $selection.html(\n      '<span class=\"select2-selection__rendered\"></span>' +\n      '<span class=\"select2-selection__arrow\" role=\"presentation\">' +\n        '<b role=\"presentation\"></b>' +\n      '</span>'\n    );\n\n    return $selection;\n  };\n\n  SingleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    SingleSelection.__super__.bind.apply(this, arguments);\n\n    var id = container.id + '-container';\n\n    this.$selection.find('.select2-selection__rendered').attr('id', id);\n    this.$selection.attr('aria-labelledby', id);\n\n    this.$selection.on('mousedown', function (evt) {\n      // Only respond to left clicks\n      if (evt.which !== 1) {\n        return;\n      }\n\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('focus', function (evt) {\n      // User focuses on the container\n    });\n\n    this.$selection.on('blur', function (evt) {\n      // User exits the container\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n  };\n\n  SingleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  SingleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  SingleSelection.prototype.selectionContainer = function () {\n    return $('<span></span>');\n  };\n\n  SingleSelection.prototype.update = function (data) {\n    if (data.length === 0) {\n      this.clear();\n      return;\n    }\n\n    var selection = data[0];\n\n    var formatted = this.display(selection);\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n    $rendered.empty().append(formatted);\n    $rendered.prop('title', selection.title || selection.text);\n  };\n\n  return SingleSelection;\n});\n\nS2.define('select2/selection/multiple',[\n  'jquery',\n  './base',\n  '../utils'\n], function ($, BaseSelection, Utils) {\n  function MultipleSelection ($element, options) {\n    MultipleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(MultipleSelection, BaseSelection);\n\n  MultipleSelection.prototype.render = function () {\n    var $selection = MultipleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--multiple');\n\n    $selection.html(\n      '<ul class=\"select2-selection__rendered\"></ul>'\n    );\n\n    return $selection;\n  };\n\n  MultipleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    MultipleSelection.__super__.bind.apply(this, arguments);\n\n    this.$selection.on('click', function (evt) {\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('click', '.select2-selection__choice__remove',\n      function (evt) {\n      var $remove = $(this);\n      var $selection = $remove.parent();\n\n      var data = $selection.data('data');\n\n      self.trigger('unselect', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n  };\n\n  MultipleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  MultipleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  MultipleSelection.prototype.selectionContainer = function () {\n    var $container = $(\n      '<li class=\"select2-selection__choice\">' +\n        '<span class=\"select2-selection__choice__remove\" role=\"presentation\">' +\n          '&times;' +\n        '</span>' +\n      '</li>'\n    );\n\n    return $container;\n  };\n\n  MultipleSelection.prototype.update = function (data) {\n    this.clear();\n\n    if (data.length === 0) {\n      return;\n    }\n\n    var $selections = [];\n\n    for (var d = 0; d < data.length; d++) {\n      var selection = data[d];\n\n      var formatted = this.display(selection);\n      var $selection = this.selectionContainer();\n\n      $selection.append(formatted);\n      $selection.prop('title', selection.title || selection.text);\n\n      $selection.data('data', selection);\n\n      $selections.push($selection);\n    }\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n\n    Utils.appendMany($rendered, $selections);\n  };\n\n  return MultipleSelection;\n});\n\nS2.define('select2/selection/placeholder',[\n  '../utils'\n], function (Utils) {\n  function Placeholder (decorated, $element, options) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options);\n  }\n\n  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {\n    var $placeholder = this.selectionContainer();\n\n    $placeholder.html(this.display(placeholder));\n    $placeholder.addClass('select2-selection__placeholder')\n                .removeClass('select2-selection__choice');\n\n    return $placeholder;\n  };\n\n  Placeholder.prototype.update = function (decorated, data) {\n    var singlePlaceholder = (\n      data.length == 1 && data[0].id != this.placeholder.id\n    );\n    var multipleSelections = data.length > 1;\n\n    if (multipleSelections || singlePlaceholder) {\n      return decorated.call(this, data);\n    }\n\n    this.clear();\n\n    var $placeholder = this.createPlaceholder(this.placeholder);\n\n    this.$selection.find('.select2-selection__rendered').append($placeholder);\n  };\n\n  return Placeholder;\n});\n\nS2.define('select2/selection/allowClear',[\n  'jquery',\n  '../keys'\n], function ($, KEYS) {\n  function AllowClear () { }\n\n  AllowClear.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    if (this.placeholder == null) {\n      if (this.options.get('debug') && window.console && console.error) {\n        console.error(\n          'Select2: The `allowClear` option should be used in combination ' +\n          'with the `placeholder` option.'\n        );\n      }\n    }\n\n    this.$selection.on('mousedown', '.select2-selection__clear',\n      function (evt) {\n        self._handleClear(evt);\n    });\n\n    container.on('keypress', function (evt) {\n      self._handleKeyboardClear(evt, container);\n    });\n  };\n\n  AllowClear.prototype._handleClear = function (_, evt) {\n    // Ignore the event if it is disabled\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    var $clear = this.$selection.find('.select2-selection__clear');\n\n    // Ignore the event if nothing has been selected\n    if ($clear.length === 0) {\n      return;\n    }\n\n    evt.stopPropagation();\n\n    var data = $clear.data('data');\n\n    for (var d = 0; d < data.length; d++) {\n      var unselectData = {\n        data: data[d]\n      };\n\n      // Trigger the `unselect` event, so people can prevent it from being\n      // cleared.\n      this.trigger('unselect', unselectData);\n\n      // If the event was prevented, don't clear it out.\n      if (unselectData.prevented) {\n        return;\n      }\n    }\n\n    this.$element.val(this.placeholder.id).trigger('change');\n\n    this.trigger('toggle');\n  };\n\n  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {\n    if (container.isOpen()) {\n      return;\n    }\n\n    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n      this._handleClear(evt);\n    }\n  };\n\n  AllowClear.prototype.update = function (decorated, data) {\n    decorated.call(this, data);\n\n    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||\n        data.length === 0) {\n      return;\n    }\n\n    var $remove = $(\n      '<span class=\"select2-selection__clear\">' +\n        '&times;' +\n      '</span>'\n    );\n    $remove.data('data', data);\n\n    this.$selection.find('.select2-selection__rendered').prepend($remove);\n  };\n\n  return AllowClear;\n});\n\nS2.define('select2/selection/search',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function Search (decorated, $element, options) {\n    decorated.call(this, $element, options);\n  }\n\n  Search.prototype.render = function (decorated) {\n    var $search = $(\n      '<li class=\"select2-search select2-search--inline\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</li>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    var $rendered = decorated.call(this);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n      self.$search.focus();\n    });\n\n    container.on('enable', function () {\n      self.$search.prop('disabled', false);\n    });\n\n    container.on('disable', function () {\n      self.$search.prop('disabled', true);\n    });\n\n    this.$selection.on('focusin', '.select2-search--inline', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('focusout', '.select2-search--inline', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', '.select2-search--inline', function (evt) {\n      evt.stopPropagation();\n\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n\n      var key = evt.which;\n\n      if (key === KEYS.BACKSPACE && self.$search.val() === '') {\n        var $previousChoice = self.$searchContainer\n          .prev('.select2-selection__choice');\n\n        if ($previousChoice.length > 0) {\n          var item = $previousChoice.data('data');\n\n          self.searchRemoveChoice(item);\n\n          evt.preventDefault();\n        }\n      }\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$selection.on('input', '.select2-search--inline', function (evt) {\n      // Unbind the duplicated `keyup` event\n      self.$selection.off('keyup.search');\n    });\n\n    this.$selection.on('keyup.search input', '.select2-search--inline',\n        function (evt) {\n      self.handleSearch(evt);\n    });\n  };\n\n  Search.prototype.createPlaceholder = function (decorated, placeholder) {\n    this.$search.attr('placeholder', placeholder.text);\n  };\n\n  Search.prototype.update = function (decorated, data) {\n    this.$search.attr('placeholder', '');\n\n    decorated.call(this, data);\n\n    this.$selection.find('.select2-selection__rendered')\n                   .append(this.$searchContainer);\n\n    this.resizeSearch();\n  };\n\n  Search.prototype.handleSearch = function () {\n    this.resizeSearch();\n\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.searchRemoveChoice = function (decorated, item) {\n    this.trigger('unselect', {\n      data: item\n    });\n\n    this.trigger('open');\n\n    this.$search.val(item.text + ' ');\n  };\n\n  Search.prototype.resizeSearch = function () {\n    this.$search.css('width', '25px');\n\n    var width = '';\n\n    if (this.$search.attr('placeholder') !== '') {\n      width = this.$selection.find('.select2-selection__rendered').innerWidth();\n    } else {\n      var minimumWidth = this.$search.val().length + 1;\n\n      width = (minimumWidth * 0.75) + 'em';\n    }\n\n    this.$search.css('width', width);\n  };\n\n  return Search;\n});\n\nS2.define('select2/selection/eventRelay',[\n  'jquery'\n], function ($) {\n  function EventRelay () { }\n\n  EventRelay.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n    var relayEvents = [\n      'open', 'opening',\n      'close', 'closing',\n      'select', 'selecting',\n      'unselect', 'unselecting'\n    ];\n\n    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];\n\n    decorated.call(this, container, $container);\n\n    container.on('*', function (name, params) {\n      // Ignore events that should not be relayed\n      if ($.inArray(name, relayEvents) === -1) {\n        return;\n      }\n\n      // The parameters should always be an object\n      params = params || {};\n\n      // Generate the jQuery event for the Select2 event\n      var evt = $.Event('select2:' + name, {\n        params: params\n      });\n\n      self.$element.trigger(evt);\n\n      // Only handle preventable events if it was one\n      if ($.inArray(name, preventableEvents) === -1) {\n        return;\n      }\n\n      params.prevented = evt.isDefaultPrevented();\n    });\n  };\n\n  return EventRelay;\n});\n\nS2.define('select2/translation',[\n  'jquery',\n  'require'\n], function ($, require) {\n  function Translation (dict) {\n    this.dict = dict || {};\n  }\n\n  Translation.prototype.all = function () {\n    return this.dict;\n  };\n\n  Translation.prototype.get = function (key) {\n    return this.dict[key];\n  };\n\n  Translation.prototype.extend = function (translation) {\n    this.dict = $.extend({}, translation.all(), this.dict);\n  };\n\n  // Static functions\n\n  Translation._cache = {};\n\n  Translation.loadPath = function (path) {\n    if (!(path in Translation._cache)) {\n      var translations = require(path);\n\n      Translation._cache[path] = translations;\n    }\n\n    return new Translation(Translation._cache[path]);\n  };\n\n  return Translation;\n});\n\nS2.define('select2/diacritics',[\n\n], function () {\n  var diacritics = {\n    '\\u24B6': 'A',\n    '\\uFF21': 'A',\n    '\\u00C0': 'A',\n    '\\u00C1': 'A',\n    '\\u00C2': 'A',\n    '\\u1EA6': 'A',\n    '\\u1EA4': 'A',\n    '\\u1EAA': 'A',\n    '\\u1EA8': 'A',\n    '\\u00C3': 'A',\n    '\\u0100': 'A',\n    '\\u0102': 'A',\n    '\\u1EB0': 'A',\n    '\\u1EAE': 'A',\n    '\\u1EB4': 'A',\n    '\\u1EB2': 'A',\n    '\\u0226': 'A',\n    '\\u01E0': 'A',\n    '\\u00C4': 'A',\n    '\\u01DE': 'A',\n    '\\u1EA2': 'A',\n    '\\u00C5': 'A',\n    '\\u01FA': 'A',\n    '\\u01CD': 'A',\n    '\\u0200': 'A',\n    '\\u0202': 'A',\n    '\\u1EA0': 'A',\n    '\\u1EAC': 'A',\n    '\\u1EB6': 'A',\n    '\\u1E00': 'A',\n    '\\u0104': 'A',\n    '\\u023A': 'A',\n    '\\u2C6F': 'A',\n    '\\uA732': 'AA',\n    '\\u00C6': 'AE',\n    '\\u01FC': 'AE',\n    '\\u01E2': 'AE',\n    '\\uA734': 'AO',\n    '\\uA736': 'AU',\n    '\\uA738': 'AV',\n    '\\uA73A': 'AV',\n    '\\uA73C': 'AY',\n    '\\u24B7': 'B',\n    '\\uFF22': 'B',\n    '\\u1E02': 'B',\n    '\\u1E04': 'B',\n    '\\u1E06': 'B',\n    '\\u0243': 'B',\n    '\\u0182': 'B',\n    '\\u0181': 'B',\n    '\\u24B8': 'C',\n    '\\uFF23': 'C',\n    '\\u0106': 'C',\n    '\\u0108': 'C',\n    '\\u010A': 'C',\n    '\\u010C': 'C',\n    '\\u00C7': 'C',\n    '\\u1E08': 'C',\n    '\\u0187': 'C',\n    '\\u023B': 'C',\n    '\\uA73E': 'C',\n    '\\u24B9': 'D',\n    '\\uFF24': 'D',\n    '\\u1E0A': 'D',\n    '\\u010E': 'D',\n    '\\u1E0C': 'D',\n    '\\u1E10': 'D',\n    '\\u1E12': 'D',\n    '\\u1E0E': 'D',\n    '\\u0110': 'D',\n    '\\u018B': 'D',\n    '\\u018A': 'D',\n    '\\u0189': 'D',\n    '\\uA779': 'D',\n    '\\u01F1': 'DZ',\n    '\\u01C4': 'DZ',\n    '\\u01F2': 'Dz',\n    '\\u01C5': 'Dz',\n    '\\u24BA': 'E',\n    '\\uFF25': 'E',\n    '\\u00C8': 'E',\n    '\\u00C9': 'E',\n    '\\u00CA': 'E',\n    '\\u1EC0': 'E',\n    '\\u1EBE': 'E',\n    '\\u1EC4': 'E',\n    '\\u1EC2': 'E',\n    '\\u1EBC': 'E',\n    '\\u0112': 'E',\n    '\\u1E14': 'E',\n    '\\u1E16': 'E',\n    '\\u0114': 'E',\n    '\\u0116': 'E',\n    '\\u00CB': 'E',\n    '\\u1EBA': 'E',\n    '\\u011A': 'E',\n    '\\u0204': 'E',\n    '\\u0206': 'E',\n    '\\u1EB8': 'E',\n    '\\u1EC6': 'E',\n    '\\u0228': 'E',\n    '\\u1E1C': 'E',\n    '\\u0118': 'E',\n    '\\u1E18': 'E',\n    '\\u1E1A': 'E',\n    '\\u0190': 'E',\n    '\\u018E': 'E',\n    '\\u24BB': 'F',\n    '\\uFF26': 'F',\n    '\\u1E1E': 'F',\n    '\\u0191': 'F',\n    '\\uA77B': 'F',\n    '\\u24BC': 'G',\n    '\\uFF27': 'G',\n    '\\u01F4': 'G',\n    '\\u011C': 'G',\n    '\\u1E20': 'G',\n    '\\u011E': 'G',\n    '\\u0120': 'G',\n    '\\u01E6': 'G',\n    '\\u0122': 'G',\n    '\\u01E4': 'G',\n    '\\u0193': 'G',\n    '\\uA7A0': 'G',\n    '\\uA77D': 'G',\n    '\\uA77E': 'G',\n    '\\u24BD': 'H',\n    '\\uFF28': 'H',\n    '\\u0124': 'H',\n    '\\u1E22': 'H',\n    '\\u1E26': 'H',\n    '\\u021E': 'H',\n    '\\u1E24': 'H',\n    '\\u1E28': 'H',\n    '\\u1E2A': 'H',\n    '\\u0126': 'H',\n    '\\u2C67': 'H',\n    '\\u2C75': 'H',\n    '\\uA78D': 'H',\n    '\\u24BE': 'I',\n    '\\uFF29': 'I',\n    '\\u00CC': 'I',\n    '\\u00CD': 'I',\n    '\\u00CE': 'I',\n    '\\u0128': 'I',\n    '\\u012A': 'I',\n    '\\u012C': 'I',\n    '\\u0130': 'I',\n    '\\u00CF': 'I',\n    '\\u1E2E': 'I',\n    '\\u1EC8': 'I',\n    '\\u01CF': 'I',\n    '\\u0208': 'I',\n    '\\u020A': 'I',\n    '\\u1ECA': 'I',\n    '\\u012E': 'I',\n    '\\u1E2C': 'I',\n    '\\u0197': 'I',\n    '\\u24BF': 'J',\n    '\\uFF2A': 'J',\n    '\\u0134': 'J',\n    '\\u0248': 'J',\n    '\\u24C0': 'K',\n    '\\uFF2B': 'K',\n    '\\u1E30': 'K',\n    '\\u01E8': 'K',\n    '\\u1E32': 'K',\n    '\\u0136': 'K',\n    '\\u1E34': 'K',\n    '\\u0198': 'K',\n    '\\u2C69': 'K',\n    '\\uA740': 'K',\n    '\\uA742': 'K',\n    '\\uA744': 'K',\n    '\\uA7A2': 'K',\n    '\\u24C1': 'L',\n    '\\uFF2C': 'L',\n    '\\u013F': 'L',\n    '\\u0139': 'L',\n    '\\u013D': 'L',\n    '\\u1E36': 'L',\n    '\\u1E38': 'L',\n    '\\u013B': 'L',\n    '\\u1E3C': 'L',\n    '\\u1E3A': 'L',\n    '\\u0141': 'L',\n    '\\u023D': 'L',\n    '\\u2C62': 'L',\n    '\\u2C60': 'L',\n    '\\uA748': 'L',\n    '\\uA746': 'L',\n    '\\uA780': 'L',\n    '\\u01C7': 'LJ',\n    '\\u01C8': 'Lj',\n    '\\u24C2': 'M',\n    '\\uFF2D': 'M',\n    '\\u1E3E': 'M',\n    '\\u1E40': 'M',\n    '\\u1E42': 'M',\n    '\\u2C6E': 'M',\n    '\\u019C': 'M',\n    '\\u24C3': 'N',\n    '\\uFF2E': 'N',\n    '\\u01F8': 'N',\n    '\\u0143': 'N',\n    '\\u00D1': 'N',\n    '\\u1E44': 'N',\n    '\\u0147': 'N',\n    '\\u1E46': 'N',\n    '\\u0145': 'N',\n    '\\u1E4A': 'N',\n    '\\u1E48': 'N',\n    '\\u0220': 'N',\n    '\\u019D': 'N',\n    '\\uA790': 'N',\n    '\\uA7A4': 'N',\n    '\\u01CA': 'NJ',\n    '\\u01CB': 'Nj',\n    '\\u24C4': 'O',\n    '\\uFF2F': 'O',\n    '\\u00D2': 'O',\n    '\\u00D3': 'O',\n    '\\u00D4': 'O',\n    '\\u1ED2': 'O',\n    '\\u1ED0': 'O',\n    '\\u1ED6': 'O',\n    '\\u1ED4': 'O',\n    '\\u00D5': 'O',\n    '\\u1E4C': 'O',\n    '\\u022C': 'O',\n    '\\u1E4E': 'O',\n    '\\u014C': 'O',\n    '\\u1E50': 'O',\n    '\\u1E52': 'O',\n    '\\u014E': 'O',\n    '\\u022E': 'O',\n    '\\u0230': 'O',\n    '\\u00D6': 'O',\n    '\\u022A': 'O',\n    '\\u1ECE': 'O',\n    '\\u0150': 'O',\n    '\\u01D1': 'O',\n    '\\u020C': 'O',\n    '\\u020E': 'O',\n    '\\u01A0': 'O',\n    '\\u1EDC': 'O',\n    '\\u1EDA': 'O',\n    '\\u1EE0': 'O',\n    '\\u1EDE': 'O',\n    '\\u1EE2': 'O',\n    '\\u1ECC': 'O',\n    '\\u1ED8': 'O',\n    '\\u01EA': 'O',\n    '\\u01EC': 'O',\n    '\\u00D8': 'O',\n    '\\u01FE': 'O',\n    '\\u0186': 'O',\n    '\\u019F': 'O',\n    '\\uA74A': 'O',\n    '\\uA74C': 'O',\n    '\\u01A2': 'OI',\n    '\\uA74E': 'OO',\n    '\\u0222': 'OU',\n    '\\u24C5': 'P',\n    '\\uFF30': 'P',\n    '\\u1E54': 'P',\n    '\\u1E56': 'P',\n    '\\u01A4': 'P',\n    '\\u2C63': 'P',\n    '\\uA750': 'P',\n    '\\uA752': 'P',\n    '\\uA754': 'P',\n    '\\u24C6': 'Q',\n    '\\uFF31': 'Q',\n    '\\uA756': 'Q',\n    '\\uA758': 'Q',\n    '\\u024A': 'Q',\n    '\\u24C7': 'R',\n    '\\uFF32': 'R',\n    '\\u0154': 'R',\n    '\\u1E58': 'R',\n    '\\u0158': 'R',\n    '\\u0210': 'R',\n    '\\u0212': 'R',\n    '\\u1E5A': 'R',\n    '\\u1E5C': 'R',\n    '\\u0156': 'R',\n    '\\u1E5E': 'R',\n    '\\u024C': 'R',\n    '\\u2C64': 'R',\n    '\\uA75A': 'R',\n    '\\uA7A6': 'R',\n    '\\uA782': 'R',\n    '\\u24C8': 'S',\n    '\\uFF33': 'S',\n    '\\u1E9E': 'S',\n    '\\u015A': 'S',\n    '\\u1E64': 'S',\n    '\\u015C': 'S',\n    '\\u1E60': 'S',\n    '\\u0160': 'S',\n    '\\u1E66': 'S',\n    '\\u1E62': 'S',\n    '\\u1E68': 'S',\n    '\\u0218': 'S',\n    '\\u015E': 'S',\n    '\\u2C7E': 'S',\n    '\\uA7A8': 'S',\n    '\\uA784': 'S',\n    '\\u24C9': 'T',\n    '\\uFF34': 'T',\n    '\\u1E6A': 'T',\n    '\\u0164': 'T',\n    '\\u1E6C': 'T',\n    '\\u021A': 'T',\n    '\\u0162': 'T',\n    '\\u1E70': 'T',\n    '\\u1E6E': 'T',\n    '\\u0166': 'T',\n    '\\u01AC': 'T',\n    '\\u01AE': 'T',\n    '\\u023E': 'T',\n    '\\uA786': 'T',\n    '\\uA728': 'TZ',\n    '\\u24CA': 'U',\n    '\\uFF35': 'U',\n    '\\u00D9': 'U',\n    '\\u00DA': 'U',\n    '\\u00DB': 'U',\n    '\\u0168': 'U',\n    '\\u1E78': 'U',\n    '\\u016A': 'U',\n    '\\u1E7A': 'U',\n    '\\u016C': 'U',\n    '\\u00DC': 'U',\n    '\\u01DB': 'U',\n    '\\u01D7': 'U',\n    '\\u01D5': 'U',\n    '\\u01D9': 'U',\n    '\\u1EE6': 'U',\n    '\\u016E': 'U',\n    '\\u0170': 'U',\n    '\\u01D3': 'U',\n    '\\u0214': 'U',\n    '\\u0216': 'U',\n    '\\u01AF': 'U',\n    '\\u1EEA': 'U',\n    '\\u1EE8': 'U',\n    '\\u1EEE': 'U',\n    '\\u1EEC': 'U',\n    '\\u1EF0': 'U',\n    '\\u1EE4': 'U',\n    '\\u1E72': 'U',\n    '\\u0172': 'U',\n    '\\u1E76': 'U',\n    '\\u1E74': 'U',\n    '\\u0244': 'U',\n    '\\u24CB': 'V',\n    '\\uFF36': 'V',\n    '\\u1E7C': 'V',\n    '\\u1E7E': 'V',\n    '\\u01B2': 'V',\n    '\\uA75E': 'V',\n    '\\u0245': 'V',\n    '\\uA760': 'VY',\n    '\\u24CC': 'W',\n    '\\uFF37': 'W',\n    '\\u1E80': 'W',\n    '\\u1E82': 'W',\n    '\\u0174': 'W',\n    '\\u1E86': 'W',\n    '\\u1E84': 'W',\n    '\\u1E88': 'W',\n    '\\u2C72': 'W',\n    '\\u24CD': 'X',\n    '\\uFF38': 'X',\n    '\\u1E8A': 'X',\n    '\\u1E8C': 'X',\n    '\\u24CE': 'Y',\n    '\\uFF39': 'Y',\n    '\\u1EF2': 'Y',\n    '\\u00DD': 'Y',\n    '\\u0176': 'Y',\n    '\\u1EF8': 'Y',\n    '\\u0232': 'Y',\n    '\\u1E8E': 'Y',\n    '\\u0178': 'Y',\n    '\\u1EF6': 'Y',\n    '\\u1EF4': 'Y',\n    '\\u01B3': 'Y',\n    '\\u024E': 'Y',\n    '\\u1EFE': 'Y',\n    '\\u24CF': 'Z',\n    '\\uFF3A': 'Z',\n    '\\u0179': 'Z',\n    '\\u1E90': 'Z',\n    '\\u017B': 'Z',\n    '\\u017D': 'Z',\n    '\\u1E92': 'Z',\n    '\\u1E94': 'Z',\n    '\\u01B5': 'Z',\n    '\\u0224': 'Z',\n    '\\u2C7F': 'Z',\n    '\\u2C6B': 'Z',\n    '\\uA762': 'Z',\n    '\\u24D0': 'a',\n    '\\uFF41': 'a',\n    '\\u1E9A': 'a',\n    '\\u00E0': 'a',\n    '\\u00E1': 'a',\n    '\\u00E2': 'a',\n    '\\u1EA7': 'a',\n    '\\u1EA5': 'a',\n    '\\u1EAB': 'a',\n    '\\u1EA9': 'a',\n    '\\u00E3': 'a',\n    '\\u0101': 'a',\n    '\\u0103': 'a',\n    '\\u1EB1': 'a',\n    '\\u1EAF': 'a',\n    '\\u1EB5': 'a',\n    '\\u1EB3': 'a',\n    '\\u0227': 'a',\n    '\\u01E1': 'a',\n    '\\u00E4': 'a',\n    '\\u01DF': 'a',\n    '\\u1EA3': 'a',\n    '\\u00E5': 'a',\n    '\\u01FB': 'a',\n    '\\u01CE': 'a',\n    '\\u0201': 'a',\n    '\\u0203': 'a',\n    '\\u1EA1': 'a',\n    '\\u1EAD': 'a',\n    '\\u1EB7': 'a',\n    '\\u1E01': 'a',\n    '\\u0105': 'a',\n    '\\u2C65': 'a',\n    '\\u0250': 'a',\n    '\\uA733': 'aa',\n    '\\u00E6': 'ae',\n    '\\u01FD': 'ae',\n    '\\u01E3': 'ae',\n    '\\uA735': 'ao',\n    '\\uA737': 'au',\n    '\\uA739': 'av',\n    '\\uA73B': 'av',\n    '\\uA73D': 'ay',\n    '\\u24D1': 'b',\n    '\\uFF42': 'b',\n    '\\u1E03': 'b',\n    '\\u1E05': 'b',\n    '\\u1E07': 'b',\n    '\\u0180': 'b',\n    '\\u0183': 'b',\n    '\\u0253': 'b',\n    '\\u24D2': 'c',\n    '\\uFF43': 'c',\n    '\\u0107': 'c',\n    '\\u0109': 'c',\n    '\\u010B': 'c',\n    '\\u010D': 'c',\n    '\\u00E7': 'c',\n    '\\u1E09': 'c',\n    '\\u0188': 'c',\n    '\\u023C': 'c',\n    '\\uA73F': 'c',\n    '\\u2184': 'c',\n    '\\u24D3': 'd',\n    '\\uFF44': 'd',\n    '\\u1E0B': 'd',\n    '\\u010F': 'd',\n    '\\u1E0D': 'd',\n    '\\u1E11': 'd',\n    '\\u1E13': 'd',\n    '\\u1E0F': 'd',\n    '\\u0111': 'd',\n    '\\u018C': 'd',\n    '\\u0256': 'd',\n    '\\u0257': 'd',\n    '\\uA77A': 'd',\n    '\\u01F3': 'dz',\n    '\\u01C6': 'dz',\n    '\\u24D4': 'e',\n    '\\uFF45': 'e',\n    '\\u00E8': 'e',\n    '\\u00E9': 'e',\n    '\\u00EA': 'e',\n    '\\u1EC1': 'e',\n    '\\u1EBF': 'e',\n    '\\u1EC5': 'e',\n    '\\u1EC3': 'e',\n    '\\u1EBD': 'e',\n    '\\u0113': 'e',\n    '\\u1E15': 'e',\n    '\\u1E17': 'e',\n    '\\u0115': 'e',\n    '\\u0117': 'e',\n    '\\u00EB': 'e',\n    '\\u1EBB': 'e',\n    '\\u011B': 'e',\n    '\\u0205': 'e',\n    '\\u0207': 'e',\n    '\\u1EB9': 'e',\n    '\\u1EC7': 'e',\n    '\\u0229': 'e',\n    '\\u1E1D': 'e',\n    '\\u0119': 'e',\n    '\\u1E19': 'e',\n    '\\u1E1B': 'e',\n    '\\u0247': 'e',\n    '\\u025B': 'e',\n    '\\u01DD': 'e',\n    '\\u24D5': 'f',\n    '\\uFF46': 'f',\n    '\\u1E1F': 'f',\n    '\\u0192': 'f',\n    '\\uA77C': 'f',\n    '\\u24D6': 'g',\n    '\\uFF47': 'g',\n    '\\u01F5': 'g',\n    '\\u011D': 'g',\n    '\\u1E21': 'g',\n    '\\u011F': 'g',\n    '\\u0121': 'g',\n    '\\u01E7': 'g',\n    '\\u0123': 'g',\n    '\\u01E5': 'g',\n    '\\u0260': 'g',\n    '\\uA7A1': 'g',\n    '\\u1D79': 'g',\n    '\\uA77F': 'g',\n    '\\u24D7': 'h',\n    '\\uFF48': 'h',\n    '\\u0125': 'h',\n    '\\u1E23': 'h',\n    '\\u1E27': 'h',\n    '\\u021F': 'h',\n    '\\u1E25': 'h',\n    '\\u1E29': 'h',\n    '\\u1E2B': 'h',\n    '\\u1E96': 'h',\n    '\\u0127': 'h',\n    '\\u2C68': 'h',\n    '\\u2C76': 'h',\n    '\\u0265': 'h',\n    '\\u0195': 'hv',\n    '\\u24D8': 'i',\n    '\\uFF49': 'i',\n    '\\u00EC': 'i',\n    '\\u00ED': 'i',\n    '\\u00EE': 'i',\n    '\\u0129': 'i',\n    '\\u012B': 'i',\n    '\\u012D': 'i',\n    '\\u00EF': 'i',\n    '\\u1E2F': 'i',\n    '\\u1EC9': 'i',\n    '\\u01D0': 'i',\n    '\\u0209': 'i',\n    '\\u020B': 'i',\n    '\\u1ECB': 'i',\n    '\\u012F': 'i',\n    '\\u1E2D': 'i',\n    '\\u0268': 'i',\n    '\\u0131': 'i',\n    '\\u24D9': 'j',\n    '\\uFF4A': 'j',\n    '\\u0135': 'j',\n    '\\u01F0': 'j',\n    '\\u0249': 'j',\n    '\\u24DA': 'k',\n    '\\uFF4B': 'k',\n    '\\u1E31': 'k',\n    '\\u01E9': 'k',\n    '\\u1E33': 'k',\n    '\\u0137': 'k',\n    '\\u1E35': 'k',\n    '\\u0199': 'k',\n    '\\u2C6A': 'k',\n    '\\uA741': 'k',\n    '\\uA743': 'k',\n    '\\uA745': 'k',\n    '\\uA7A3': 'k',\n    '\\u24DB': 'l',\n    '\\uFF4C': 'l',\n    '\\u0140': 'l',\n    '\\u013A': 'l',\n    '\\u013E': 'l',\n    '\\u1E37': 'l',\n    '\\u1E39': 'l',\n    '\\u013C': 'l',\n    '\\u1E3D': 'l',\n    '\\u1E3B': 'l',\n    '\\u017F': 'l',\n    '\\u0142': 'l',\n    '\\u019A': 'l',\n    '\\u026B': 'l',\n    '\\u2C61': 'l',\n    '\\uA749': 'l',\n    '\\uA781': 'l',\n    '\\uA747': 'l',\n    '\\u01C9': 'lj',\n    '\\u24DC': 'm',\n    '\\uFF4D': 'm',\n    '\\u1E3F': 'm',\n    '\\u1E41': 'm',\n    '\\u1E43': 'm',\n    '\\u0271': 'm',\n    '\\u026F': 'm',\n    '\\u24DD': 'n',\n    '\\uFF4E': 'n',\n    '\\u01F9': 'n',\n    '\\u0144': 'n',\n    '\\u00F1': 'n',\n    '\\u1E45': 'n',\n    '\\u0148': 'n',\n    '\\u1E47': 'n',\n    '\\u0146': 'n',\n    '\\u1E4B': 'n',\n    '\\u1E49': 'n',\n    '\\u019E': 'n',\n    '\\u0272': 'n',\n    '\\u0149': 'n',\n    '\\uA791': 'n',\n    '\\uA7A5': 'n',\n    '\\u01CC': 'nj',\n    '\\u24DE': 'o',\n    '\\uFF4F': 'o',\n    '\\u00F2': 'o',\n    '\\u00F3': 'o',\n    '\\u00F4': 'o',\n    '\\u1ED3': 'o',\n    '\\u1ED1': 'o',\n    '\\u1ED7': 'o',\n    '\\u1ED5': 'o',\n    '\\u00F5': 'o',\n    '\\u1E4D': 'o',\n    '\\u022D': 'o',\n    '\\u1E4F': 'o',\n    '\\u014D': 'o',\n    '\\u1E51': 'o',\n    '\\u1E53': 'o',\n    '\\u014F': 'o',\n    '\\u022F': 'o',\n    '\\u0231': 'o',\n    '\\u00F6': 'o',\n    '\\u022B': 'o',\n    '\\u1ECF': 'o',\n    '\\u0151': 'o',\n    '\\u01D2': 'o',\n    '\\u020D': 'o',\n    '\\u020F': 'o',\n    '\\u01A1': 'o',\n    '\\u1EDD': 'o',\n    '\\u1EDB': 'o',\n    '\\u1EE1': 'o',\n    '\\u1EDF': 'o',\n    '\\u1EE3': 'o',\n    '\\u1ECD': 'o',\n    '\\u1ED9': 'o',\n    '\\u01EB': 'o',\n    '\\u01ED': 'o',\n    '\\u00F8': 'o',\n    '\\u01FF': 'o',\n    '\\u0254': 'o',\n    '\\uA74B': 'o',\n    '\\uA74D': 'o',\n    '\\u0275': 'o',\n    '\\u01A3': 'oi',\n    '\\u0223': 'ou',\n    '\\uA74F': 'oo',\n    '\\u24DF': 'p',\n    '\\uFF50': 'p',\n    '\\u1E55': 'p',\n    '\\u1E57': 'p',\n    '\\u01A5': 'p',\n    '\\u1D7D': 'p',\n    '\\uA751': 'p',\n    '\\uA753': 'p',\n    '\\uA755': 'p',\n    '\\u24E0': 'q',\n    '\\uFF51': 'q',\n    '\\u024B': 'q',\n    '\\uA757': 'q',\n    '\\uA759': 'q',\n    '\\u24E1': 'r',\n    '\\uFF52': 'r',\n    '\\u0155': 'r',\n    '\\u1E59': 'r',\n    '\\u0159': 'r',\n    '\\u0211': 'r',\n    '\\u0213': 'r',\n    '\\u1E5B': 'r',\n    '\\u1E5D': 'r',\n    '\\u0157': 'r',\n    '\\u1E5F': 'r',\n    '\\u024D': 'r',\n    '\\u027D': 'r',\n    '\\uA75B': 'r',\n    '\\uA7A7': 'r',\n    '\\uA783': 'r',\n    '\\u24E2': 's',\n    '\\uFF53': 's',\n    '\\u00DF': 's',\n    '\\u015B': 's',\n    '\\u1E65': 's',\n    '\\u015D': 's',\n    '\\u1E61': 's',\n    '\\u0161': 's',\n    '\\u1E67': 's',\n    '\\u1E63': 's',\n    '\\u1E69': 's',\n    '\\u0219': 's',\n    '\\u015F': 's',\n    '\\u023F': 's',\n    '\\uA7A9': 's',\n    '\\uA785': 's',\n    '\\u1E9B': 's',\n    '\\u24E3': 't',\n    '\\uFF54': 't',\n    '\\u1E6B': 't',\n    '\\u1E97': 't',\n    '\\u0165': 't',\n    '\\u1E6D': 't',\n    '\\u021B': 't',\n    '\\u0163': 't',\n    '\\u1E71': 't',\n    '\\u1E6F': 't',\n    '\\u0167': 't',\n    '\\u01AD': 't',\n    '\\u0288': 't',\n    '\\u2C66': 't',\n    '\\uA787': 't',\n    '\\uA729': 'tz',\n    '\\u24E4': 'u',\n    '\\uFF55': 'u',\n    '\\u00F9': 'u',\n    '\\u00FA': 'u',\n    '\\u00FB': 'u',\n    '\\u0169': 'u',\n    '\\u1E79': 'u',\n    '\\u016B': 'u',\n    '\\u1E7B': 'u',\n    '\\u016D': 'u',\n    '\\u00FC': 'u',\n    '\\u01DC': 'u',\n    '\\u01D8': 'u',\n    '\\u01D6': 'u',\n    '\\u01DA': 'u',\n    '\\u1EE7': 'u',\n    '\\u016F': 'u',\n    '\\u0171': 'u',\n    '\\u01D4': 'u',\n    '\\u0215': 'u',\n    '\\u0217': 'u',\n    '\\u01B0': 'u',\n    '\\u1EEB': 'u',\n    '\\u1EE9': 'u',\n    '\\u1EEF': 'u',\n    '\\u1EED': 'u',\n    '\\u1EF1': 'u',\n    '\\u1EE5': 'u',\n    '\\u1E73': 'u',\n    '\\u0173': 'u',\n    '\\u1E77': 'u',\n    '\\u1E75': 'u',\n    '\\u0289': 'u',\n    '\\u24E5': 'v',\n    '\\uFF56': 'v',\n    '\\u1E7D': 'v',\n    '\\u1E7F': 'v',\n    '\\u028B': 'v',\n    '\\uA75F': 'v',\n    '\\u028C': 'v',\n    '\\uA761': 'vy',\n    '\\u24E6': 'w',\n    '\\uFF57': 'w',\n    '\\u1E81': 'w',\n    '\\u1E83': 'w',\n    '\\u0175': 'w',\n    '\\u1E87': 'w',\n    '\\u1E85': 'w',\n    '\\u1E98': 'w',\n    '\\u1E89': 'w',\n    '\\u2C73': 'w',\n    '\\u24E7': 'x',\n    '\\uFF58': 'x',\n    '\\u1E8B': 'x',\n    '\\u1E8D': 'x',\n    '\\u24E8': 'y',\n    '\\uFF59': 'y',\n    '\\u1EF3': 'y',\n    '\\u00FD': 'y',\n    '\\u0177': 'y',\n    '\\u1EF9': 'y',\n    '\\u0233': 'y',\n    '\\u1E8F': 'y',\n    '\\u00FF': 'y',\n    '\\u1EF7': 'y',\n    '\\u1E99': 'y',\n    '\\u1EF5': 'y',\n    '\\u01B4': 'y',\n    '\\u024F': 'y',\n    '\\u1EFF': 'y',\n    '\\u24E9': 'z',\n    '\\uFF5A': 'z',\n    '\\u017A': 'z',\n    '\\u1E91': 'z',\n    '\\u017C': 'z',\n    '\\u017E': 'z',\n    '\\u1E93': 'z',\n    '\\u1E95': 'z',\n    '\\u01B6': 'z',\n    '\\u0225': 'z',\n    '\\u0240': 'z',\n    '\\u2C6C': 'z',\n    '\\uA763': 'z',\n    '\\u0386': '\\u0391',\n    '\\u0388': '\\u0395',\n    '\\u0389': '\\u0397',\n    '\\u038A': '\\u0399',\n    '\\u03AA': '\\u0399',\n    '\\u038C': '\\u039F',\n    '\\u038E': '\\u03A5',\n    '\\u03AB': '\\u03A5',\n    '\\u038F': '\\u03A9',\n    '\\u03AC': '\\u03B1',\n    '\\u03AD': '\\u03B5',\n    '\\u03AE': '\\u03B7',\n    '\\u03AF': '\\u03B9',\n    '\\u03CA': '\\u03B9',\n    '\\u0390': '\\u03B9',\n    '\\u03CC': '\\u03BF',\n    '\\u03CD': '\\u03C5',\n    '\\u03CB': '\\u03C5',\n    '\\u03B0': '\\u03C5',\n    '\\u03C9': '\\u03C9',\n    '\\u03C2': '\\u03C3'\n  };\n\n  return diacritics;\n});\n\nS2.define('select2/data/base',[\n  '../utils'\n], function (Utils) {\n  function BaseAdapter ($element, options) {\n    BaseAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseAdapter, Utils.Observable);\n\n  BaseAdapter.prototype.current = function (callback) {\n    throw new Error('The `current` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.query = function (params, callback) {\n    throw new Error('The `query` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.bind = function (container, $container) {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.destroy = function () {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.generateResultId = function (container, data) {\n    var id = container.id + '-result-';\n\n    id += Utils.generateChars(4);\n\n    if (data.id != null) {\n      id += '-' + data.id.toString();\n    } else {\n      id += '-' + Utils.generateChars(4);\n    }\n    return id;\n  };\n\n  return BaseAdapter;\n});\n\nS2.define('select2/data/select',[\n  './base',\n  '../utils',\n  'jquery'\n], function (BaseAdapter, Utils, $) {\n  function SelectAdapter ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    SelectAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(SelectAdapter, BaseAdapter);\n\n  SelectAdapter.prototype.current = function (callback) {\n    var data = [];\n    var self = this;\n\n    this.$element.find(':selected').each(function () {\n      var $option = $(this);\n\n      var option = self.item($option);\n\n      data.push(option);\n    });\n\n    callback(data);\n  };\n\n  SelectAdapter.prototype.select = function (data) {\n    var self = this;\n\n    data.selected = true;\n\n    // If data.element is a DOM node, use it instead\n    if ($(data.element).is('option')) {\n      data.element.selected = true;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    if (this.$element.prop('multiple')) {\n      this.current(function (currentData) {\n        var val = [];\n\n        data = [data];\n        data.push.apply(data, currentData);\n\n        for (var d = 0; d < data.length; d++) {\n          var id = data[d].id;\n\n          if ($.inArray(id, val) === -1) {\n            val.push(id);\n          }\n        }\n\n        self.$element.val(val);\n        self.$element.trigger('change');\n      });\n    } else {\n      var val = data.id;\n\n      this.$element.val(val);\n      this.$element.trigger('change');\n    }\n  };\n\n  SelectAdapter.prototype.unselect = function (data) {\n    var self = this;\n\n    if (!this.$element.prop('multiple')) {\n      return;\n    }\n\n    data.selected = false;\n\n    if ($(data.element).is('option')) {\n      data.element.selected = false;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    this.current(function (currentData) {\n      var val = [];\n\n      for (var d = 0; d < currentData.length; d++) {\n        var id = currentData[d].id;\n\n        if (id !== data.id && $.inArray(id, val) === -1) {\n          val.push(id);\n        }\n      }\n\n      self.$element.val(val);\n\n      self.$element.trigger('change');\n    });\n  };\n\n  SelectAdapter.prototype.bind = function (container, $container) {\n    var self = this;\n\n    this.container = container;\n\n    container.on('select', function (params) {\n      self.select(params.data);\n    });\n\n    container.on('unselect', function (params) {\n      self.unselect(params.data);\n    });\n  };\n\n  SelectAdapter.prototype.destroy = function () {\n    // Remove anything added to child elements\n    this.$element.find('*').each(function () {\n      // Remove any custom data set by Select2\n      $.removeData(this, 'data');\n    });\n  };\n\n  SelectAdapter.prototype.query = function (params, callback) {\n    var data = [];\n    var self = this;\n\n    var $options = this.$element.children();\n\n    $options.each(function () {\n      var $option = $(this);\n\n      if (!$option.is('option') && !$option.is('optgroup')) {\n        return;\n      }\n\n      var option = self.item($option);\n\n      var matches = self.matches(params, option);\n\n      if (matches !== null) {\n        data.push(matches);\n      }\n    });\n\n    callback({\n      results: data\n    });\n  };\n\n  SelectAdapter.prototype.addOptions = function ($options) {\n    Utils.appendMany(this.$element, $options);\n  };\n\n  SelectAdapter.prototype.option = function (data) {\n    var option;\n\n    if (data.children) {\n      option = document.createElement('optgroup');\n      option.label = data.text;\n    } else {\n      option = document.createElement('option');\n\n      if (option.textContent !== undefined) {\n        option.textContent = data.text;\n      } else {\n        option.innerText = data.text;\n      }\n    }\n\n    if (data.id) {\n      option.value = data.id;\n    }\n\n    if (data.disabled) {\n      option.disabled = true;\n    }\n\n    if (data.selected) {\n      option.selected = true;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    var $option = $(option);\n\n    var normalizedData = this._normalizeItem(data);\n    normalizedData.element = option;\n\n    // Override the option's data with the combined data\n    $.data(option, 'data', normalizedData);\n\n    return $option;\n  };\n\n  SelectAdapter.prototype.item = function ($option) {\n    var data = {};\n\n    data = $.data($option[0], 'data');\n\n    if (data != null) {\n      return data;\n    }\n\n    if ($option.is('option')) {\n      data = {\n        id: $option.val(),\n        text: $option.text(),\n        disabled: $option.prop('disabled'),\n        selected: $option.prop('selected'),\n        title: $option.prop('title')\n      };\n    } else if ($option.is('optgroup')) {\n      data = {\n        text: $option.prop('label'),\n        children: [],\n        title: $option.prop('title')\n      };\n\n      var $children = $option.children('option');\n      var children = [];\n\n      for (var c = 0; c < $children.length; c++) {\n        var $child = $($children[c]);\n\n        var child = this.item($child);\n\n        children.push(child);\n      }\n\n      data.children = children;\n    }\n\n    data = this._normalizeItem(data);\n    data.element = $option[0];\n\n    $.data($option[0], 'data', data);\n\n    return data;\n  };\n\n  SelectAdapter.prototype._normalizeItem = function (item) {\n    if (!$.isPlainObject(item)) {\n      item = {\n        id: item,\n        text: item\n      };\n    }\n\n    item = $.extend({}, {\n      text: ''\n    }, item);\n\n    var defaults = {\n      selected: false,\n      disabled: false\n    };\n\n    if (item.id != null) {\n      item.id = item.id.toString();\n    }\n\n    if (item.text != null) {\n      item.text = item.text.toString();\n    }\n\n    if (item._resultId == null && item.id && this.container != null) {\n      item._resultId = this.generateResultId(this.container, item);\n    }\n\n    return $.extend({}, defaults, item);\n  };\n\n  SelectAdapter.prototype.matches = function (params, data) {\n    var matcher = this.options.get('matcher');\n\n    return matcher(params, data);\n  };\n\n  return SelectAdapter;\n});\n\nS2.define('select2/data/array',[\n  './select',\n  '../utils',\n  'jquery'\n], function (SelectAdapter, Utils, $) {\n  function ArrayAdapter ($element, options) {\n    var data = options.get('data') || [];\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n\n    this.addOptions(this.convertToOptions(data));\n  }\n\n  Utils.Extend(ArrayAdapter, SelectAdapter);\n\n  ArrayAdapter.prototype.select = function (data) {\n    var $option = this.$element.find('option').filter(function (i, elm) {\n      return elm.value == data.id.toString();\n    });\n\n    if ($option.length === 0) {\n      $option = this.option(data);\n\n      this.addOptions($option);\n    }\n\n    ArrayAdapter.__super__.select.call(this, data);\n  };\n\n  ArrayAdapter.prototype.convertToOptions = function (data) {\n    var self = this;\n\n    var $existing = this.$element.find('option');\n    var existingIds = $existing.map(function () {\n      return self.item($(this)).id;\n    }).get();\n\n    var $options = [];\n\n    // Filter out all items except for the one passed in the argument\n    function onlyItem (item) {\n      return function () {\n        return $(this).val() == item.id;\n      };\n    }\n\n    for (var d = 0; d < data.length; d++) {\n      var item = this._normalizeItem(data[d]);\n\n      // Skip items which were pre-loaded, only merge the data\n      if ($.inArray(item.id, existingIds) >= 0) {\n        var $existingOption = $existing.filter(onlyItem(item));\n\n        var existingData = this.item($existingOption);\n        var newData = $.extend(true, {}, existingData, item);\n\n        var $newOption = this.option(existingData);\n\n        $existingOption.replaceWith($newOption);\n\n        continue;\n      }\n\n      var $option = this.option(item);\n\n      if (item.children) {\n        var $children = this.convertToOptions(item.children);\n\n        Utils.appendMany($option, $children);\n      }\n\n      $options.push($option);\n    }\n\n    return $options;\n  };\n\n  return ArrayAdapter;\n});\n\nS2.define('select2/data/ajax',[\n  './array',\n  '../utils',\n  'jquery'\n], function (ArrayAdapter, Utils, $) {\n  function AjaxAdapter ($element, options) {\n    this.ajaxOptions = this._applyDefaults(options.get('ajax'));\n\n    if (this.ajaxOptions.processResults != null) {\n      this.processResults = this.ajaxOptions.processResults;\n    }\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n  }\n\n  Utils.Extend(AjaxAdapter, ArrayAdapter);\n\n  AjaxAdapter.prototype._applyDefaults = function (options) {\n    var defaults = {\n      data: function (params) {\n        return {\n          q: params.term\n        };\n      },\n      transport: function (params, success, failure) {\n        var $request = $.ajax(params);\n\n        $request.then(success);\n        $request.fail(failure);\n\n        return $request;\n      }\n    };\n\n    return $.extend({}, defaults, options, true);\n  };\n\n  AjaxAdapter.prototype.processResults = function (results) {\n    return results;\n  };\n\n  AjaxAdapter.prototype.query = function (params, callback) {\n    var matches = [];\n    var self = this;\n\n    if (this._request != null) {\n      // JSONP requests cannot always be aborted\n      if ($.isFunction(this._request.abort)) {\n        this._request.abort();\n      }\n\n      this._request = null;\n    }\n\n    var options = $.extend({\n      type: 'GET'\n    }, this.ajaxOptions);\n\n    if (typeof options.url === 'function') {\n      options.url = options.url(params);\n    }\n\n    if (typeof options.data === 'function') {\n      options.data = options.data(params);\n    }\n\n    function request () {\n      var $request = options.transport(options, function (data) {\n        var results = self.processResults(data, params);\n\n        if (self.options.get('debug') && window.console && console.error) {\n          // Check to make sure that the response included a `results` key.\n          if (!results || !results.results || !$.isArray(results.results)) {\n            console.error(\n              'Select2: The AJAX results did not return an array in the ' +\n              '`results` key of the response.'\n            );\n          }\n        }\n\n        callback(results);\n      }, function () {\n        // TODO: Handle AJAX errors\n      });\n\n      self._request = $request;\n    }\n\n    if (this.ajaxOptions.delay && params.term !== '') {\n      if (this._queryTimeout) {\n        window.clearTimeout(this._queryTimeout);\n      }\n\n      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n    } else {\n      request();\n    }\n  };\n\n  return AjaxAdapter;\n});\n\nS2.define('select2/data/tags',[\n  'jquery'\n], function ($) {\n  function Tags (decorated, $element, options) {\n    var tags = options.get('tags');\n\n    var createTag = options.get('createTag');\n\n    if (createTag !== undefined) {\n      this.createTag = createTag;\n    }\n\n    decorated.call(this, $element, options);\n\n    if ($.isArray(tags)) {\n      for (var t = 0; t < tags.length; t++) {\n        var tag = tags[t];\n        var item = this._normalizeItem(tag);\n\n        var $option = this.option(item);\n\n        this.$element.append($option);\n      }\n    }\n  }\n\n  Tags.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    this._removeOldTags();\n\n    if (params.term == null || params.page != null) {\n      decorated.call(this, params, callback);\n      return;\n    }\n\n    function wrapper (obj, child) {\n      var data = obj.results;\n\n      for (var i = 0; i < data.length; i++) {\n        var option = data[i];\n\n        var checkChildren = (\n          option.children != null &&\n          !wrapper({\n            results: option.children\n          }, true)\n        );\n\n        var checkText = option.text === params.term;\n\n        if (checkText || checkChildren) {\n          if (child) {\n            return false;\n          }\n\n          obj.data = data;\n          callback(obj);\n\n          return;\n        }\n      }\n\n      if (child) {\n        return true;\n      }\n\n      var tag = self.createTag(params);\n\n      if (tag != null) {\n        var $option = self.option(tag);\n        $option.attr('data-select2-tag', true);\n\n        self.addOptions([$option]);\n\n        self.insertTag(data, tag);\n      }\n\n      obj.results = data;\n\n      callback(obj);\n    }\n\n    decorated.call(this, params, wrapper);\n  };\n\n  Tags.prototype.createTag = function (decorated, params) {\n    var term = $.trim(params.term);\n\n    if (term === '') {\n      return null;\n    }\n\n    return {\n      id: term,\n      text: term\n    };\n  };\n\n  Tags.prototype.insertTag = function (_, data, tag) {\n    data.unshift(tag);\n  };\n\n  Tags.prototype._removeOldTags = function (_) {\n    var tag = this._lastTag;\n\n    var $options = this.$element.find('option[data-select2-tag]');\n\n    $options.each(function () {\n      if (this.selected) {\n        return;\n      }\n\n      $(this).remove();\n    });\n  };\n\n  return Tags;\n});\n\nS2.define('select2/data/tokenizer',[\n  'jquery'\n], function ($) {\n  function Tokenizer (decorated, $element, options) {\n    var tokenizer = options.get('tokenizer');\n\n    if (tokenizer !== undefined) {\n      this.tokenizer = tokenizer;\n    }\n\n    decorated.call(this, $element, options);\n  }\n\n  Tokenizer.prototype.bind = function (decorated, container, $container) {\n    decorated.call(this, container, $container);\n\n    this.$search =  container.dropdown.$search || container.selection.$search ||\n      $container.find('.select2-search__field');\n  };\n\n  Tokenizer.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    function select (data) {\n      self.select(data);\n    }\n\n    params.term = params.term || '';\n\n    var tokenData = this.tokenizer(params, this.options, select);\n\n    if (tokenData.term !== params.term) {\n      // Replace the search term if we have the search box\n      if (this.$search.length) {\n        this.$search.val(tokenData.term);\n        this.$search.focus();\n      }\n\n      params.term = tokenData.term;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {\n    var separators = options.get('tokenSeparators') || [];\n    var term = params.term;\n    var i = 0;\n\n    var createTag = this.createTag || function (params) {\n      return {\n        id: params.term,\n        text: params.term\n      };\n    };\n\n    while (i < term.length) {\n      var termChar = term[i];\n\n      if ($.inArray(termChar, separators) === -1) {\n        i++;\n\n        continue;\n      }\n\n      var part = term.substr(0, i);\n      var partParams = $.extend({}, params, {\n        term: part\n      });\n\n      var data = createTag(partParams);\n\n      callback(data);\n\n      // Reset the term to not include the tokenized portion\n      term = term.substr(i + 1) || '';\n      i = 0;\n    }\n\n    return {\n      term: term\n    };\n  };\n\n  return Tokenizer;\n});\n\nS2.define('select2/data/minimumInputLength',[\n\n], function () {\n  function MinimumInputLength (decorated, $e, options) {\n    this.minimumInputLength = options.get('minimumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MinimumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (params.term.length < this.minimumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooShort',\n        args: {\n          minimum: this.minimumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MinimumInputLength;\n});\n\nS2.define('select2/data/maximumInputLength',[\n\n], function () {\n  function MaximumInputLength (decorated, $e, options) {\n    this.maximumInputLength = options.get('maximumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (this.maximumInputLength > 0 &&\n        params.term.length > this.maximumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooLong',\n        args: {\n          maximum: this.maximumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MaximumInputLength;\n});\n\nS2.define('select2/data/maximumSelectionLength',[\n\n], function (){\n  function MaximumSelectionLength (decorated, $e, options) {\n    this.maximumSelectionLength = options.get('maximumSelectionLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumSelectionLength.prototype.query =\n    function (decorated, params, callback) {\n      var self = this;\n\n      this.current(function (currentData) {\n        var count = currentData != null ? currentData.length : 0;\n        if (self.maximumSelectionLength > 0 &&\n          count >= self.maximumSelectionLength) {\n          self.trigger('results:message', {\n            message: 'maximumSelected',\n            args: {\n              maximum: self.maximumSelectionLength\n            }\n          });\n          return;\n        }\n        decorated.call(self, params, callback);\n      });\n  };\n\n  return MaximumSelectionLength;\n});\n\nS2.define('select2/dropdown',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Dropdown ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    Dropdown.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Dropdown, Utils.Observable);\n\n  Dropdown.prototype.render = function () {\n    var $dropdown = $(\n      '<span class=\"select2-dropdown\">' +\n        '<span class=\"select2-results\"></span>' +\n      '</span>'\n    );\n\n    $dropdown.attr('dir', this.options.get('dir'));\n\n    this.$dropdown = $dropdown;\n\n    return $dropdown;\n  };\n\n  Dropdown.prototype.position = function ($dropdown, $container) {\n    // Should be implmented in subclasses\n  };\n\n  Dropdown.prototype.destroy = function () {\n    // Remove the dropdown from the DOM\n    this.$dropdown.remove();\n  };\n\n  return Dropdown;\n});\n\nS2.define('select2/dropdown/search',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function Search () { }\n\n  Search.prototype.render = function (decorated) {\n    var $rendered = decorated.call(this);\n\n    var $search = $(\n      '<span class=\"select2-search select2-search--dropdown\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</span>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    $rendered.prepend($search);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    this.$search.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$search.on('input', function (evt) {\n      // Unbind the duplicated `keyup` event\n      $(this).off('keyup');\n    });\n\n    this.$search.on('keyup input', function (evt) {\n      self.handleSearch(evt);\n    });\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n\n      window.setTimeout(function () {\n        self.$search.focus();\n      }, 0);\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n    });\n\n    container.on('results:all', function (params) {\n      if (params.query.term == null || params.query.term === '') {\n        var showSearch = self.showSearch(params);\n\n        if (showSearch) {\n          self.$searchContainer.removeClass('select2-search--hide');\n        } else {\n          self.$searchContainer.addClass('select2-search--hide');\n        }\n      }\n    });\n  };\n\n  Search.prototype.handleSearch = function (evt) {\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.showSearch = function (_, params) {\n    return true;\n  };\n\n  return Search;\n});\n\nS2.define('select2/dropdown/hidePlaceholder',[\n\n], function () {\n  function HidePlaceholder (decorated, $element, options, dataAdapter) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  HidePlaceholder.prototype.append = function (decorated, data) {\n    data.results = this.removePlaceholder(data.results);\n\n    decorated.call(this, data);\n  };\n\n  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  HidePlaceholder.prototype.removePlaceholder = function (_, data) {\n    var modifiedData = data.slice(0);\n\n    for (var d = data.length - 1; d >= 0; d--) {\n      var item = data[d];\n\n      if (this.placeholder.id === item.id) {\n        modifiedData.splice(d, 1);\n      }\n    }\n\n    return modifiedData;\n  };\n\n  return HidePlaceholder;\n});\n\nS2.define('select2/dropdown/infiniteScroll',[\n  'jquery'\n], function ($) {\n  function InfiniteScroll (decorated, $element, options, dataAdapter) {\n    this.lastParams = {};\n\n    decorated.call(this, $element, options, dataAdapter);\n\n    this.$loadingMore = this.createLoadingMore();\n    this.loading = false;\n  }\n\n  InfiniteScroll.prototype.append = function (decorated, data) {\n    this.$loadingMore.remove();\n    this.loading = false;\n\n    decorated.call(this, data);\n\n    if (this.showLoadingMore(data)) {\n      this.$results.append(this.$loadingMore);\n    }\n  };\n\n  InfiniteScroll.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('query', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    container.on('query:append', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    this.$results.on('scroll', function () {\n      var isLoadMoreVisible = $.contains(\n        document.documentElement,\n        self.$loadingMore[0]\n      );\n\n      if (self.loading || !isLoadMoreVisible) {\n        return;\n      }\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var loadingMoreOffset = self.$loadingMore.offset().top +\n        self.$loadingMore.outerHeight(false);\n\n      if (currentOffset + 50 >= loadingMoreOffset) {\n        self.loadMore();\n      }\n    });\n  };\n\n  InfiniteScroll.prototype.loadMore = function () {\n    this.loading = true;\n\n    var params = $.extend({}, {page: 1}, this.lastParams);\n\n    params.page++;\n\n    this.trigger('query:append', params);\n  };\n\n  InfiniteScroll.prototype.showLoadingMore = function (_, data) {\n    return data.pagination && data.pagination.more;\n  };\n\n  InfiniteScroll.prototype.createLoadingMore = function () {\n    var $option = $(\n      '<li class=\"option load-more\" role=\"treeitem\"></li>'\n    );\n\n    var message = this.options.get('translations').get('loadingMore');\n\n    $option.html(message(this.lastParams));\n\n    return $option;\n  };\n\n  return InfiniteScroll;\n});\n\nS2.define('select2/dropdown/attachBody',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function AttachBody (decorated, $element, options) {\n    this.$dropdownParent = options.get('dropdownParent') || document.body;\n\n    decorated.call(this, $element, options);\n  }\n\n  AttachBody.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    var setupResultsEvents = false;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self._showDropdown();\n      self._attachPositioningHandler(container);\n\n      if (!setupResultsEvents) {\n        setupResultsEvents = true;\n\n        container.on('results:all', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n\n        container.on('results:append', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n      }\n    });\n\n    container.on('close', function () {\n      self._hideDropdown();\n      self._detachPositioningHandler(container);\n    });\n\n    this.$dropdownContainer.on('mousedown', function (evt) {\n      evt.stopPropagation();\n    });\n  };\n\n  AttachBody.prototype.position = function (decorated, $dropdown, $container) {\n    // Clone all of the container classes\n    $dropdown.attr('class', $container.attr('class'));\n\n    $dropdown.removeClass('select2');\n    $dropdown.addClass('select2-container--open');\n\n    $dropdown.css({\n      position: 'absolute',\n      top: -999999\n    });\n\n    this.$container = $container;\n  };\n\n  AttachBody.prototype.render = function (decorated) {\n    var $container = $('<span></span>');\n\n    var $dropdown = decorated.call(this);\n    $container.append($dropdown);\n\n    this.$dropdownContainer = $container;\n\n    return $container;\n  };\n\n  AttachBody.prototype._hideDropdown = function (decorated) {\n    this.$dropdownContainer.detach();\n  };\n\n  AttachBody.prototype._attachPositioningHandler = function (container) {\n    var self = this;\n\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.each(function () {\n      $(this).data('select2-scroll-position', {\n        x: $(this).scrollLeft(),\n        y: $(this).scrollTop()\n      });\n    });\n\n    $watchers.on(scrollEvent, function (ev) {\n      var position = $(this).data('select2-scroll-position');\n      $(this).scrollTop(position.y);\n    });\n\n    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,\n      function (e) {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n  };\n\n  AttachBody.prototype._detachPositioningHandler = function (container) {\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.off(scrollEvent);\n\n    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);\n  };\n\n  AttachBody.prototype._positionDropdown = function () {\n    var $window = $(window);\n\n    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');\n    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');\n\n    var newDirection = null;\n\n    var position = this.$container.position();\n    var offset = this.$container.offset();\n\n    offset.bottom = offset.top + this.$container.outerHeight(false);\n\n    var container = {\n      height: this.$container.outerHeight(false)\n    };\n\n    container.top = offset.top;\n    container.bottom = offset.top + container.height;\n\n    var dropdown = {\n      height: this.$dropdown.outerHeight(false)\n    };\n\n    var viewport = {\n      top: $window.scrollTop(),\n      bottom: $window.scrollTop() + $window.height()\n    };\n\n    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);\n    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);\n\n    var css = {\n      left: offset.left,\n      top: container.bottom\n    };\n\n    if (!isCurrentlyAbove && !isCurrentlyBelow) {\n      newDirection = 'below';\n    }\n\n    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n      newDirection = 'above';\n    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n      newDirection = 'below';\n    }\n\n    if (newDirection == 'above' ||\n      (isCurrentlyAbove && newDirection !== 'below')) {\n      css.top = container.top - dropdown.height;\n    }\n\n    if (newDirection != null) {\n      this.$dropdown\n        .removeClass('select2-dropdown--below select2-dropdown--above')\n        .addClass('select2-dropdown--' + newDirection);\n      this.$container\n        .removeClass('select2-container--below select2-container--above')\n        .addClass('select2-container--' + newDirection);\n    }\n\n    this.$dropdownContainer.css(css);\n  };\n\n  AttachBody.prototype._resizeDropdown = function () {\n    this.$dropdownContainer.width();\n\n    var css = {\n      width: this.$container.outerWidth(false) + 'px'\n    };\n\n    if (this.options.get('dropdownAutoWidth')) {\n      css.minWidth = css.width;\n      css.width = 'auto';\n    }\n\n    this.$dropdown.css(css);\n  };\n\n  AttachBody.prototype._showDropdown = function (decorated) {\n    this.$dropdownContainer.appendTo(this.$dropdownParent);\n\n    this._positionDropdown();\n    this._resizeDropdown();\n  };\n\n  return AttachBody;\n});\n\nS2.define('select2/dropdown/minimumResultsForSearch',[\n\n], function () {\n  function countResults (data) {\n    var count = 0;\n\n    for (var d = 0; d < data.length; d++) {\n      var item = data[d];\n\n      if (item.children) {\n        count += countResults(item.children);\n      } else {\n        count++;\n      }\n    }\n\n    return count;\n  }\n\n  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {\n    this.minimumResultsForSearch = options.get('minimumResultsForSearch');\n\n    if (this.minimumResultsForSearch < 0) {\n      this.minimumResultsForSearch = Infinity;\n    }\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {\n    if (countResults(params.data.results) < this.minimumResultsForSearch) {\n      return false;\n    }\n\n    return decorated.call(this, params);\n  };\n\n  return MinimumResultsForSearch;\n});\n\nS2.define('select2/dropdown/selectOnClose',[\n\n], function () {\n  function SelectOnClose () { }\n\n  SelectOnClose.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('close', function () {\n      self._handleSelectOnClose();\n    });\n  };\n\n  SelectOnClose.prototype._handleSelectOnClose = function () {\n    var $highlightedResults = this.getHighlightedResults();\n\n    if ($highlightedResults.length < 1) {\n      return;\n    }\n\n    this.trigger('select', {\n        data: $highlightedResults.data('data')\n    });\n  };\n\n  return SelectOnClose;\n});\n\nS2.define('select2/dropdown/closeOnSelect',[\n\n], function () {\n  function CloseOnSelect () { }\n\n  CloseOnSelect.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('select', function (evt) {\n      self._selectTriggered(evt);\n    });\n\n    container.on('unselect', function (evt) {\n      self._selectTriggered(evt);\n    });\n  };\n\n  CloseOnSelect.prototype._selectTriggered = function (_, evt) {\n    var originalEvent = evt.originalEvent;\n\n    // Don't close if the control key is being held\n    if (originalEvent && originalEvent.ctrlKey) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  return CloseOnSelect;\n});\n\nS2.define('select2/i18n/en',[],function () {\n  // English\n  return {\n    errorLoading: function () {\n      return 'The results could not be loaded.';\n    },\n    inputTooLong: function (args) {\n      var overChars = args.input.length - args.maximum;\n\n      var message = 'Please delete ' + overChars + ' character';\n\n      if (overChars != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    inputTooShort: function (args) {\n      var remainingChars = args.minimum - args.input.length;\n\n      var message = 'Please enter ' + remainingChars + ' or more characters';\n\n      return message;\n    },\n    loadingMore: function () {\n      return 'Loading more results…';\n    },\n    maximumSelected: function (args) {\n      var message = 'You can only select ' + args.maximum + ' item';\n\n      if (args.maximum != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    noResults: function () {\n      return 'No results found';\n    },\n    searching: function () {\n      return 'Searching…';\n    }\n  };\n});\n\nS2.define('select2/defaults',[\n  'jquery',\n  'require',\n\n  './results',\n\n  './selection/single',\n  './selection/multiple',\n  './selection/placeholder',\n  './selection/allowClear',\n  './selection/search',\n  './selection/eventRelay',\n\n  './utils',\n  './translation',\n  './diacritics',\n\n  './data/select',\n  './data/array',\n  './data/ajax',\n  './data/tags',\n  './data/tokenizer',\n  './data/minimumInputLength',\n  './data/maximumInputLength',\n  './data/maximumSelectionLength',\n\n  './dropdown',\n  './dropdown/search',\n  './dropdown/hidePlaceholder',\n  './dropdown/infiniteScroll',\n  './dropdown/attachBody',\n  './dropdown/minimumResultsForSearch',\n  './dropdown/selectOnClose',\n  './dropdown/closeOnSelect',\n\n  './i18n/en'\n], function ($, require,\n\n             ResultsList,\n\n             SingleSelection, MultipleSelection, Placeholder, AllowClear,\n             SelectionSearch, EventRelay,\n\n             Utils, Translation, DIACRITICS,\n\n             SelectData, ArrayData, AjaxData, Tags, Tokenizer,\n             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,\n\n             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,\n             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,\n\n             EnglishTranslation) {\n  function Defaults () {\n    this.reset();\n  }\n\n  Defaults.prototype.apply = function (options) {\n    options = $.extend({}, this.defaults, options);\n\n    if (options.dataAdapter == null) {\n      if (options.ajax != null) {\n        options.dataAdapter = AjaxData;\n      } else if (options.data != null) {\n        options.dataAdapter = ArrayData;\n      } else {\n        options.dataAdapter = SelectData;\n      }\n\n      if (options.minimumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MinimumInputLength\n        );\n      }\n\n      if (options.maximumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumInputLength\n        );\n      }\n\n      if (options.maximumSelectionLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumSelectionLength\n        );\n      }\n\n      if (options.tags) {\n        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n      }\n\n      if (options.tokenSeparators != null || options.tokenizer != null) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Tokenizer\n        );\n      }\n\n      if (options.query != null) {\n        var Query = require(options.amdBase + 'compat/query');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Query\n        );\n      }\n\n      if (options.initSelection != null) {\n        var InitSelection = require(options.amdBase + 'compat/initSelection');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          InitSelection\n        );\n      }\n    }\n\n    if (options.resultsAdapter == null) {\n      options.resultsAdapter = ResultsList;\n\n      if (options.ajax != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          InfiniteScroll\n        );\n      }\n\n      if (options.placeholder != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          HidePlaceholder\n        );\n      }\n\n      if (options.selectOnClose) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          SelectOnClose\n        );\n      }\n    }\n\n    if (options.dropdownAdapter == null) {\n      if (options.multiple) {\n        options.dropdownAdapter = Dropdown;\n      } else {\n        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n\n        options.dropdownAdapter = SearchableDropdown;\n      }\n\n      if (options.minimumResultsForSearch !== 0) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          MinimumResultsForSearch\n        );\n      }\n\n      if (options.closeOnSelect) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          CloseOnSelect\n        );\n      }\n\n      if (\n        options.dropdownCssClass != null ||\n        options.dropdownCss != null ||\n        options.adaptDropdownCssClass != null\n      ) {\n        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');\n\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          DropdownCSS\n        );\n      }\n\n      options.dropdownAdapter = Utils.Decorate(\n        options.dropdownAdapter,\n        AttachBody\n      );\n    }\n\n    if (options.selectionAdapter == null) {\n      if (options.multiple) {\n        options.selectionAdapter = MultipleSelection;\n      } else {\n        options.selectionAdapter = SingleSelection;\n      }\n\n      // Add the placeholder mixin if a placeholder was specified\n      if (options.placeholder != null) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          Placeholder\n        );\n      }\n\n      if (options.allowClear) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          AllowClear\n        );\n      }\n\n      if (options.multiple) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          SelectionSearch\n        );\n      }\n\n      if (\n        options.containerCssClass != null ||\n        options.containerCss != null ||\n        options.adaptContainerCssClass != null\n      ) {\n        var ContainerCSS = require(options.amdBase + 'compat/containerCss');\n\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          ContainerCSS\n        );\n      }\n\n      options.selectionAdapter = Utils.Decorate(\n        options.selectionAdapter,\n        EventRelay\n      );\n    }\n\n    if (typeof options.language === 'string') {\n      // Check if the language is specified with a region\n      if (options.language.indexOf('-') > 0) {\n        // Extract the region information if it is included\n        var languageParts = options.language.split('-');\n        var baseLanguage = languageParts[0];\n\n        options.language = [options.language, baseLanguage];\n      } else {\n        options.language = [options.language];\n      }\n    }\n\n    if ($.isArray(options.language)) {\n      var languages = new Translation();\n      options.language.push('en');\n\n      var languageNames = options.language;\n\n      for (var l = 0; l < languageNames.length; l++) {\n        var name = languageNames[l];\n        var language = {};\n\n        try {\n          // Try to load it with the original name\n          language = Translation.loadPath(name);\n        } catch (e) {\n          try {\n            // If we couldn't load it, check if it wasn't the full path\n            name = this.defaults.amdLanguageBase + name;\n            language = Translation.loadPath(name);\n          } catch (ex) {\n            // The translation could not be loaded at all. Sometimes this is\n            // because of a configuration problem, other times this can be\n            // because of how Select2 helps load all possible translation files.\n            if (options.debug && window.console && console.warn) {\n              console.warn(\n                'Select2: The language file for \"' + name + '\" could not be ' +\n                'automatically loaded. A fallback will be used instead.'\n              );\n            }\n\n            continue;\n          }\n        }\n\n        languages.extend(language);\n      }\n\n      options.translations = languages;\n    } else {\n      var baseTranslation = Translation.loadPath(\n        this.defaults.amdLanguageBase + 'en'\n      );\n      var customTranslation = new Translation(options.language);\n\n      customTranslation.extend(baseTranslation);\n\n      options.translations = customTranslation;\n    }\n\n    return options;\n  };\n\n  Defaults.prototype.reset = function () {\n    function stripDiacritics (text) {\n      // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n      function match(a) {\n        return DIACRITICS[a] || a;\n      }\n\n      return text.replace(/[^\\u0000-\\u007E]/g, match);\n    }\n\n    function matcher (params, data) {\n      // Always return the object if there is nothing to compare\n      if ($.trim(params.term) === '') {\n        return data;\n      }\n\n      // Do a recursive check for options with children\n      if (data.children && data.children.length > 0) {\n        // Clone the data object if there are children\n        // This is required as we modify the object to remove any non-matches\n        var match = $.extend(true, {}, data);\n\n        // Check each child of the option\n        for (var c = data.children.length - 1; c >= 0; c--) {\n          var child = data.children[c];\n\n          var matches = matcher(params, child);\n\n          // If there wasn't a match, remove the object in the array\n          if (matches == null) {\n            match.children.splice(c, 1);\n          }\n        }\n\n        // If any children matched, return the new object\n        if (match.children.length > 0) {\n          return match;\n        }\n\n        // If there were no matching children, check just the plain object\n        return matcher(params, match);\n      }\n\n      var original = stripDiacritics(data.text).toUpperCase();\n      var term = stripDiacritics(params.term).toUpperCase();\n\n      // Check if the text contains the term\n      if (original.indexOf(term) > -1) {\n        return data;\n      }\n\n      // If it doesn't contain the term, don't return anything\n      return null;\n    }\n\n    this.defaults = {\n      amdBase: './',\n      amdLanguageBase: './i18n/',\n      closeOnSelect: true,\n      debug: false,\n      dropdownAutoWidth: false,\n      escapeMarkup: Utils.escapeMarkup,\n      language: EnglishTranslation,\n      matcher: matcher,\n      minimumInputLength: 0,\n      maximumInputLength: 0,\n      maximumSelectionLength: 0,\n      minimumResultsForSearch: 0,\n      selectOnClose: false,\n      sorter: function (data) {\n        return data;\n      },\n      templateResult: function (result) {\n        return result.text;\n      },\n      templateSelection: function (selection) {\n        return selection.text;\n      },\n      theme: 'default',\n      width: 'resolve'\n    };\n  };\n\n  Defaults.prototype.set = function (key, value) {\n    var camelKey = $.camelCase(key);\n\n    var data = {};\n    data[camelKey] = value;\n\n    var convertedData = Utils._convertData(data);\n\n    $.extend(this.defaults, convertedData);\n  };\n\n  var defaults = new Defaults();\n\n  return defaults;\n});\n\nS2.define('select2/options',[\n  'require',\n  'jquery',\n  './defaults',\n  './utils'\n], function (require, $, Defaults, Utils) {\n  function Options (options, $element) {\n    this.options = options;\n\n    if ($element != null) {\n      this.fromElement($element);\n    }\n\n    this.options = Defaults.apply(this.options);\n\n    if ($element && $element.is('input')) {\n      var InputCompat = require(this.get('amdBase') + 'compat/inputData');\n\n      this.options.dataAdapter = Utils.Decorate(\n        this.options.dataAdapter,\n        InputCompat\n      );\n    }\n  }\n\n  Options.prototype.fromElement = function ($e) {\n    var excludedData = ['select2'];\n\n    if (this.options.multiple == null) {\n      this.options.multiple = $e.prop('multiple');\n    }\n\n    if (this.options.disabled == null) {\n      this.options.disabled = $e.prop('disabled');\n    }\n\n    if (this.options.language == null) {\n      if ($e.prop('lang')) {\n        this.options.language = $e.prop('lang').toLowerCase();\n      } else if ($e.closest('[lang]').prop('lang')) {\n        this.options.language = $e.closest('[lang]').prop('lang');\n      }\n    }\n\n    if (this.options.dir == null) {\n      if ($e.prop('dir')) {\n        this.options.dir = $e.prop('dir');\n      } else if ($e.closest('[dir]').prop('dir')) {\n        this.options.dir = $e.closest('[dir]').prop('dir');\n      } else {\n        this.options.dir = 'ltr';\n      }\n    }\n\n    $e.prop('disabled', this.options.disabled);\n    $e.prop('multiple', this.options.multiple);\n\n    if ($e.data('select2Tags')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-select2-tags` attribute has been changed to ' +\n          'use the `data-data` and `data-tags=\"true\"` attributes and will be ' +\n          'removed in future versions of Select2.'\n        );\n      }\n\n      $e.data('data', $e.data('select2Tags'));\n      $e.data('tags', true);\n    }\n\n    if ($e.data('ajaxUrl')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-ajax-url` attribute has been changed to ' +\n          '`data-ajax--url` and support for the old attribute will be removed' +\n          ' in future versions of Select2.'\n        );\n      }\n\n      $e.attr('ajax--url', $e.data('ajaxUrl'));\n      $e.data('ajax--url', $e.data('ajaxUrl'));\n    }\n\n    var dataset = {};\n\n    // Prefer the element's `dataset` attribute if it exists\n    // jQuery 1.x does not correctly handle data attributes with multiple dashes\n    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {\n      dataset = $.extend(true, {}, $e[0].dataset, $e.data());\n    } else {\n      dataset = $e.data();\n    }\n\n    var data = $.extend(true, {}, dataset);\n\n    data = Utils._convertData(data);\n\n    for (var key in data) {\n      if ($.inArray(key, excludedData) > -1) {\n        continue;\n      }\n\n      if ($.isPlainObject(this.options[key])) {\n        $.extend(this.options[key], data[key]);\n      } else {\n        this.options[key] = data[key];\n      }\n    }\n\n    return this;\n  };\n\n  Options.prototype.get = function (key) {\n    return this.options[key];\n  };\n\n  Options.prototype.set = function (key, val) {\n    this.options[key] = val;\n  };\n\n  return Options;\n});\n\nS2.define('select2/core',[\n  'jquery',\n  './options',\n  './utils',\n  './keys'\n], function ($, Options, Utils, KEYS) {\n  var Select2 = function ($element, options) {\n    if ($element.data('select2') != null) {\n      $element.data('select2').destroy();\n    }\n\n    this.$element = $element;\n\n    this.id = this._generateId($element);\n\n    options = options || {};\n\n    this.options = new Options(options, $element);\n\n    Select2.__super__.constructor.call(this);\n\n    // Set up the tabindex\n\n    var tabindex = $element.attr('tabindex') || 0;\n    $element.data('old-tabindex', tabindex);\n    $element.attr('tabindex', '-1');\n\n    // Set up containers and adapters\n\n    var DataAdapter = this.options.get('dataAdapter');\n    this.dataAdapter = new DataAdapter($element, this.options);\n\n    var $container = this.render();\n\n    this._placeContainer($container);\n\n    var SelectionAdapter = this.options.get('selectionAdapter');\n    this.selection = new SelectionAdapter($element, this.options);\n    this.$selection = this.selection.render();\n\n    this.selection.position(this.$selection, $container);\n\n    var DropdownAdapter = this.options.get('dropdownAdapter');\n    this.dropdown = new DropdownAdapter($element, this.options);\n    this.$dropdown = this.dropdown.render();\n\n    this.dropdown.position(this.$dropdown, $container);\n\n    var ResultsAdapter = this.options.get('resultsAdapter');\n    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n    this.$results = this.results.render();\n\n    this.results.position(this.$results, this.$dropdown);\n\n    // Bind events\n\n    var self = this;\n\n    // Bind the container to all of the adapters\n    this._bindAdapters();\n\n    // Register any DOM event handlers\n    this._registerDomEvents();\n\n    // Register any internal event handlers\n    this._registerDataEvents();\n    this._registerSelectionEvents();\n    this._registerDropdownEvents();\n    this._registerResultsEvents();\n    this._registerEvents();\n\n    // Set the initial state\n    this.dataAdapter.current(function (initialData) {\n      self.trigger('selection:update', {\n        data: initialData\n      });\n    });\n\n    // Hide the original select\n    $element.addClass('select2-hidden-accessible');\n\t$element.attr('aria-hidden', 'true');\n\t\n    // Synchronize any monitored attributes\n    this._syncAttributes();\n\n    $element.data('select2', this);\n  };\n\n  Utils.Extend(Select2, Utils.Observable);\n\n  Select2.prototype._generateId = function ($element) {\n    var id = '';\n\n    if ($element.attr('id') != null) {\n      id = $element.attr('id');\n    } else if ($element.attr('name') != null) {\n      id = $element.attr('name') + '-' + Utils.generateChars(2);\n    } else {\n      id = Utils.generateChars(4);\n    }\n\n    id = 'select2-' + id;\n\n    return id;\n  };\n\n  Select2.prototype._placeContainer = function ($container) {\n    $container.insertAfter(this.$element);\n\n    var width = this._resolveWidth(this.$element, this.options.get('width'));\n\n    if (width != null) {\n      $container.css('width', width);\n    }\n  };\n\n  Select2.prototype._resolveWidth = function ($element, method) {\n    var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n\n    if (method == 'resolve') {\n      var styleWidth = this._resolveWidth($element, 'style');\n\n      if (styleWidth != null) {\n        return styleWidth;\n      }\n\n      return this._resolveWidth($element, 'element');\n    }\n\n    if (method == 'element') {\n      var elementWidth = $element.outerWidth(false);\n\n      if (elementWidth <= 0) {\n        return 'auto';\n      }\n\n      return elementWidth + 'px';\n    }\n\n    if (method == 'style') {\n      var style = $element.attr('style');\n\n      if (typeof(style) !== 'string') {\n        return null;\n      }\n\n      var attrs = style.split(';');\n\n      for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n        var attr = attrs[i].replace(/\\s/g, '');\n        var matches = attr.match(WIDTH);\n\n        if (matches !== null && matches.length >= 1) {\n          return matches[1];\n        }\n      }\n\n      return null;\n    }\n\n    return method;\n  };\n\n  Select2.prototype._bindAdapters = function () {\n    this.dataAdapter.bind(this, this.$container);\n    this.selection.bind(this, this.$container);\n\n    this.dropdown.bind(this, this.$container);\n    this.results.bind(this, this.$container);\n  };\n\n  Select2.prototype._registerDomEvents = function () {\n    var self = this;\n\n    this.$element.on('change.select2', function () {\n      self.dataAdapter.current(function (data) {\n        self.trigger('selection:update', {\n          data: data\n        });\n      });\n    });\n\n    this._sync = Utils.bind(this._syncAttributes, this);\n\n    if (this.$element[0].attachEvent) {\n      this.$element[0].attachEvent('onpropertychange', this._sync);\n    }\n\n    var observer = window.MutationObserver ||\n      window.WebKitMutationObserver ||\n      window.MozMutationObserver\n    ;\n\n    if (observer != null) {\n      this._observer = new observer(function (mutations) {\n        $.each(mutations, self._sync);\n      });\n      this._observer.observe(this.$element[0], {\n        attributes: true,\n        subtree: false\n      });\n    } else if (this.$element[0].addEventListener) {\n      this.$element[0].addEventListener('DOMAttrModified', self._sync, false);\n    }\n  };\n\n  Select2.prototype._registerDataEvents = function () {\n    var self = this;\n\n    this.dataAdapter.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerSelectionEvents = function () {\n    var self = this;\n    var nonRelayEvents = ['toggle'];\n\n    this.selection.on('toggle', function () {\n      self.toggleDropdown();\n    });\n\n    this.selection.on('*', function (name, params) {\n      if ($.inArray(name, nonRelayEvents) !== -1) {\n        return;\n      }\n\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerDropdownEvents = function () {\n    var self = this;\n\n    this.dropdown.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerResultsEvents = function () {\n    var self = this;\n\n    this.results.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerEvents = function () {\n    var self = this;\n\n    this.on('open', function () {\n      self.$container.addClass('select2-container--open');\n    });\n\n    this.on('close', function () {\n      self.$container.removeClass('select2-container--open');\n    });\n\n    this.on('enable', function () {\n      self.$container.removeClass('select2-container--disabled');\n    });\n\n    this.on('disable', function () {\n      self.$container.addClass('select2-container--disabled');\n    });\n\n    this.on('focus', function () {\n      self.$container.addClass('select2-container--focus');\n    });\n\n    this.on('blur', function () {\n      self.$container.removeClass('select2-container--focus');\n    });\n\n    this.on('query', function (params) {\n      if (!self.isOpen()) {\n        self.trigger('open');\n      }\n\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:all', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('query:append', function (params) {\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:append', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('keypress', function (evt) {\n      var key = evt.which;\n\n      if (self.isOpen()) {\n        if (key === KEYS.ENTER) {\n          self.trigger('results:select');\n\n          evt.preventDefault();\n        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {\n          self.trigger('results:toggle');\n\n          evt.preventDefault();\n        } else if (key === KEYS.UP) {\n          self.trigger('results:previous');\n\n          evt.preventDefault();\n        } else if (key === KEYS.DOWN) {\n          self.trigger('results:next');\n\n          evt.preventDefault();\n        } else if (key === KEYS.ESC || key === KEYS.TAB) {\n          self.close();\n\n          evt.preventDefault();\n        }\n      } else {\n        if (key === KEYS.ENTER || key === KEYS.SPACE ||\n            ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) {\n          self.open();\n\n          evt.preventDefault();\n        }\n      }\n    });\n  };\n\n  Select2.prototype._syncAttributes = function () {\n    this.options.set('disabled', this.$element.prop('disabled'));\n\n    if (this.options.get('disabled')) {\n      if (this.isOpen()) {\n        this.close();\n      }\n\n      this.trigger('disable');\n    } else {\n      this.trigger('enable');\n    }\n  };\n\n  /**\n   * Override the trigger method to automatically trigger pre-events when\n   * there are events that can be prevented.\n   */\n  Select2.prototype.trigger = function (name, args) {\n    var actualTrigger = Select2.__super__.trigger;\n    var preTriggerMap = {\n      'open': 'opening',\n      'close': 'closing',\n      'select': 'selecting',\n      'unselect': 'unselecting'\n    };\n\n    if (name in preTriggerMap) {\n      var preTriggerName = preTriggerMap[name];\n      var preTriggerArgs = {\n        prevented: false,\n        name: name,\n        args: args\n      };\n\n      actualTrigger.call(this, preTriggerName, preTriggerArgs);\n\n      if (preTriggerArgs.prevented) {\n        args.prevented = true;\n\n        return;\n      }\n    }\n\n    actualTrigger.call(this, name, args);\n  };\n\n  Select2.prototype.toggleDropdown = function () {\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  };\n\n  Select2.prototype.open = function () {\n    if (this.isOpen()) {\n      return;\n    }\n\n    this.trigger('query', {});\n\n    this.trigger('open');\n  };\n\n  Select2.prototype.close = function () {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  Select2.prototype.isOpen = function () {\n    return this.$container.hasClass('select2-container--open');\n  };\n\n  Select2.prototype.enable = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"enable\")` method has been deprecated and will' +\n        ' be removed in later Select2 versions. Use $element.prop(\"disabled\")' +\n        ' instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      args = [true];\n    }\n\n    var disabled = !args[0];\n\n    this.$element.prop('disabled', disabled);\n  };\n\n  Select2.prototype.data = function () {\n    if (this.options.get('debug') &&\n        arguments.length > 0 && window.console && console.warn) {\n      console.warn(\n        'Select2: Data can no longer be set using `select2(\"data\")`. You ' +\n        'should consider setting the value instead using `$element.val()`.'\n      );\n    }\n\n    var data = [];\n\n    this.dataAdapter.current(function (currentData) {\n      data = currentData;\n    });\n\n    return data;\n  };\n\n  Select2.prototype.val = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"val\")` method has been deprecated and will be' +\n        ' removed in later Select2 versions. Use $element.val() instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      return this.$element.val();\n    }\n\n    var newVal = args[0];\n\n    if ($.isArray(newVal)) {\n      newVal = $.map(newVal, function (obj) {\n        return obj.toString();\n      });\n    }\n\n    this.$element.val(newVal).trigger('change');\n  };\n\n  Select2.prototype.destroy = function () {\n    this.$container.remove();\n\n    if (this.$element[0].detachEvent) {\n      this.$element[0].detachEvent('onpropertychange', this._sync);\n    }\n\n    if (this._observer != null) {\n      this._observer.disconnect();\n      this._observer = null;\n    } else if (this.$element[0].removeEventListener) {\n      this.$element[0]\n        .removeEventListener('DOMAttrModified', this._sync, false);\n    }\n\n    this._sync = null;\n\n    this.$element.off('.select2');\n    this.$element.attr('tabindex', this.$element.data('old-tabindex'));\n\n    this.$element.removeClass('select2-hidden-accessible');\n\tthis.$element.attr('aria-hidden', 'false');\n    this.$element.removeData('select2');\n\n    this.dataAdapter.destroy();\n    this.selection.destroy();\n    this.dropdown.destroy();\n    this.results.destroy();\n\n    this.dataAdapter = null;\n    this.selection = null;\n    this.dropdown = null;\n    this.results = null;\n  };\n\n  Select2.prototype.render = function () {\n    var $container = $(\n      '<span class=\"select2 select2-container\">' +\n        '<span class=\"selection\"></span>' +\n        '<span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span>' +\n      '</span>'\n    );\n\n    $container.attr('dir', this.options.get('dir'));\n\n    this.$container = $container;\n\n    this.$container.addClass('select2-container--' + this.options.get('theme'));\n\n    $container.data('element', this.$element);\n\n    return $container;\n  };\n\n  return Select2;\n});\n\nS2.define('jquery.select2',[\n  'jquery',\n  'require',\n\n  './select2/core',\n  './select2/defaults'\n], function ($, require, Select2, Defaults) {\n  // Force jQuery.mousewheel to be loaded if it hasn't already\n  require('jquery.mousewheel');\n\n  if ($.fn.select2 == null) {\n    // All methods that should return the element\n    var thisMethods = ['open', 'close', 'destroy'];\n\n    $.fn.select2 = function (options) {\n      options = options || {};\n\n      if (typeof options === 'object') {\n        this.each(function () {\n          var instanceOptions = $.extend({}, options, true);\n\n          var instance = new Select2($(this), instanceOptions);\n        });\n\n        return this;\n      } else if (typeof options === 'string') {\n        var instance = this.data('select2');\n\n        if (instance == null && window.console && console.error) {\n          console.error(\n            'The select2(\\'' + options + '\\') method was called on an ' +\n            'element that is not using Select2.'\n          );\n        }\n\n        var args = Array.prototype.slice.call(arguments, 1);\n\n        var ret = instance[options](args);\n\n        // Check if we should be returning `this`\n        if ($.inArray(options, thisMethods) > -1) {\n          return this;\n        }\n\n        return ret;\n      } else {\n        throw new Error('Invalid arguments for Select2: ' + options);\n      }\n    };\n  }\n\n  if ($.fn.select2.defaults == null) {\n    $.fn.select2.defaults = Defaults;\n  }\n\n  return Select2;\n});\n\nS2.define('jquery.mousewheel',[\n  'jquery'\n], function ($) {\n  // Used to shim jQuery.mousewheel for non-full builds.\n  return $;\n});\n\n  // Return the AMD loader configuration so it can be used outside of this file\n  return {\n    define: S2.define,\n    require: S2.require\n  };\n}());\n\n  // Autoload the jQuery bindings\n  // We know that all of the modules exist above this, so we're safe\n  var select2 = S2.require('jquery.select2');\n\n  // Hold the AMD module references on the jQuery function that was just loaded\n  // This allows Select2 to use the internal loader outside of this file, such\n  // as in the language files.\n  jQuery.fn.select2.amd = S2;\n\n  // Return the Select2 instance for anyone who is importing it.\n  return select2;\n}));\n","/*!\n * iCheck v1.0.1, http://git.io/arlzeA\n * =================================\n * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization\n *\n * (c) 2013 Damir Sultanov, http://fronteed.com\n * MIT Licensed\n */\n\n(function($) {\n\n  // Cached vars\n  var _iCheck = 'iCheck',\n    _iCheckHelper = _iCheck + '-helper',\n    _checkbox = 'checkbox',\n    _radio = 'radio',\n    _checked = 'checked',\n    _unchecked = 'un' + _checked,\n    _disabled = 'disabled',\n    _determinate = 'determinate',\n    _indeterminate = 'in' + _determinate,\n    _update = 'update',\n    _type = 'type',\n    _click = 'click',\n    _touch = 'touchbegin.i touchend.i',\n    _add = 'addClass',\n    _remove = 'removeClass',\n    _callback = 'trigger',\n    _label = 'label',\n    _cursor = 'cursor',\n    _mobile = /ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);\n\n  // Plugin init\n  $.fn[_iCheck] = function(options, fire) {\n\n    // Walker\n    var handle = 'input[type=\"' + _checkbox + '\"], input[type=\"' + _radio + '\"]',\n      stack = $(),\n      walker = function(object) {\n        object.each(function() {\n          var self = $(this);\n\n          if (self.is(handle)) {\n            stack = stack.add(self);\n          } else {\n            stack = stack.add(self.find(handle));\n          }\n        });\n      };\n\n    // Check if we should operate with some method\n    if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) {\n\n      // Normalize method's name\n      options = options.toLowerCase();\n\n      // Find checkboxes and radio buttons\n      walker(this);\n\n      return stack.each(function() {\n        var self = $(this);\n\n        if (options == 'destroy') {\n          tidy(self, 'ifDestroyed');\n        } else {\n          operate(self, true, options);\n        }\n          // Fire method's callback\n        if ($.isFunction(fire)) {\n          fire();\n        }\n      });\n\n    // Customization\n    } else if (typeof options == 'object' || !options) {\n\n      // Check if any options were passed\n      var settings = $.extend({\n          checkedClass: _checked,\n          disabledClass: _disabled,\n          indeterminateClass: _indeterminate,\n          labelHover: true,\n          aria: false\n        }, options),\n\n        selector = settings.handle,\n        hoverClass = settings.hoverClass || 'hover',\n        focusClass = settings.focusClass || 'focus',\n        activeClass = settings.activeClass || 'active',\n        labelHover = !!settings.labelHover,\n        labelHoverClass = settings.labelHoverClass || 'hover',\n\n        // Setup clickable area\n        area = ('' + settings.increaseArea).replace('%', '') | 0;\n\n      // Selector limit\n      if (selector == _checkbox || selector == _radio) {\n        handle = 'input[type=\"' + selector + '\"]';\n      }\n        // Clickable area limit\n      if (area < -50) {\n        area = -50;\n      }\n        // Walk around the selector\n      walker(this);\n\n      return stack.each(function() {\n        var self = $(this);\n\n        // If already customized\n        tidy(self);\n\n        var node = this,\n          id = node.id,\n\n          // Layer styles\n          offset = -area + '%',\n          size = 100 + (area * 2) + '%',\n          layer = {\n            position: 'absolute',\n            top: offset,\n            left: offset,\n            display: 'block',\n            width: size,\n            height: size,\n            margin: 0,\n            padding: 0,\n            background: '#fff',\n            border: 0,\n            opacity: 0\n          },\n\n          // Choose how to hide input\n          hide = _mobile ? {\n            position: 'absolute',\n            visibility: 'hidden'\n          } : area ? layer : {\n            position: 'absolute',\n            opacity: 0\n          },\n\n          // Get proper class\n          className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio,\n\n          // Find assigned labels\n          label = $(_label + '[for=\"' + id + '\"]').add(self.closest(_label)),\n\n          // Check ARIA option\n          aria = !!settings.aria,\n\n          // Set ARIA placeholder\n          ariaID = _iCheck + '-' + Math.random().toString(36).replace('0.', ''),\n\n          // Parent & helper\n          parent = '<div class=\"' + className + '\" ' + (aria ? 'role=\"' + node[_type] + '\" ' : ''),\n          helper;\n\n        // Set ARIA \"labelledby\"\n        if (label.length && aria) {\n          label.each(function() {\n            parent += 'aria-labelledby=\"';\n\n            if (this.id) {\n              parent += this.id;\n            } else {\n              this.id = ariaID;\n              parent += ariaID;\n            }\n\n            parent += '\"';\n          });\n        }\n          // Wrap input\n        parent = self.wrap(parent + '/>')[_callback]('ifCreated').parent().append(settings.insert);\n\n        // Layer addition\n        helper = $('<ins class=\"' + _iCheckHelper + '\"/>').css(layer).appendTo(parent);\n\n        // Finalize customization\n        self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide);\n        !!settings.inheritClass && parent[_add](node.className || '');\n        !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id);\n        parent.css('position') == 'static' && parent.css('position', 'relative');\n        operate(self, true, _update);\n\n        // Label events\n        if (label.length) {\n          label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function(event) {\n            var type = event[_type],\n              item = $(this);\n\n            // Do nothing if input is disabled\n            if (!node[_disabled]) {\n\n              // Click\n              if (type == _click) {\n                if ($(event.target).is('a')) {\n                  return;\n                }\n                operate(self, false, true);\n\n              // Hover state\n              } else if (labelHover) {\n\n                // mouseout|touchend\n                if (/ut|nd/.test(type)) {\n                  parent[_remove](hoverClass);\n                  item[_remove](labelHoverClass);\n                } else {\n                  parent[_add](hoverClass);\n                  item[_add](labelHoverClass);\n                }\n              }\n                if (_mobile) {\n                event.stopPropagation();\n              } else {\n                return false;\n              }\n            }\n          });\n        }\n          // Input events\n        self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function(event) {\n          var type = event[_type],\n            key = event.keyCode;\n\n          // Click\n          if (type == _click) {\n            return false;\n\n          // Keydown\n          } else if (type == 'keydown' && key == 32) {\n            if (!(node[_type] == _radio && node[_checked])) {\n              if (node[_checked]) {\n                off(self, _checked);\n              } else {\n                on(self, _checked);\n              }\n            }\n              return false;\n\n          // Keyup\n          } else if (type == 'keyup' && node[_type] == _radio) {\n            !node[_checked] && on(self, _checked);\n\n          // Focus/blur\n          } else if (/us|ur/.test(type)) {\n            parent[type == 'blur' ? _remove : _add](focusClass);\n          }\n        });\n\n        // Helper events\n        helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function(event) {\n          var type = event[_type],\n\n            // mousedown|mouseup\n            toggle = /wn|up/.test(type) ? activeClass : hoverClass;\n\n          // Do nothing if input is disabled\n          if (!node[_disabled]) {\n\n            // Click\n            if (type == _click) {\n              operate(self, false, true);\n\n            // Active and hover states\n            } else {\n\n              // State is on\n              if (/wn|er|in/.test(type)) {\n\n                // mousedown|mouseover|touchbegin\n                parent[_add](toggle);\n\n              // State is off\n              } else {\n                parent[_remove](toggle + ' ' + activeClass);\n              }\n                // Label hover\n              if (label.length && labelHover && toggle == hoverClass) {\n\n                // mouseout|touchend\n                label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass);\n              }\n            }\n              if (_mobile) {\n              event.stopPropagation();\n            } else {\n              return false;\n            }\n          }\n        });\n      });\n    } else {\n      return this;\n    }\n  };\n\n  // Do something with inputs\n  function operate(input, direct, method) {\n    var node = input[0],\n      state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked,\n      active = method == _update ? {\n        checked: node[_checked],\n        disabled: node[_disabled],\n        indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false'\n      } : node[state];\n\n    // Check, disable or indeterminate\n    if (/^(ch|di|in)/.test(method) && !active) {\n      on(input, state);\n\n    // Uncheck, enable or determinate\n    } else if (/^(un|en|de)/.test(method) && active) {\n      off(input, state);\n\n    // Update\n    } else if (method == _update) {\n\n      // Handle states\n      for (var state in active) {\n        if (active[state]) {\n          on(input, state, true);\n        } else {\n          off(input, state, true);\n        }\n      }\n    } else if (!direct || method == 'toggle') {\n\n      // Helper or label was clicked\n      if (!direct) {\n        input[_callback]('ifClicked');\n      }\n        // Toggle checked state\n      if (active) {\n        if (node[_type] !== _radio) {\n          off(input, state);\n        }\n      } else {\n        on(input, state);\n      }\n    }\n  }\n    // Add checked, disabled or indeterminate state\n  function on(input, state, keep) {\n    var node = input[0],\n      parent = input.parent(),\n      checked = state == _checked,\n      indeterminate = state == _indeterminate,\n      disabled = state == _disabled,\n      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',\n      regular = option(input, callback + capitalize(node[_type])),\n      specific = option(input, state + capitalize(node[_type]));\n\n    // Prevent unnecessary actions\n    if (node[state] !== true) {\n\n      // Toggle assigned radio buttons\n      if (!keep && state == _checked && node[_type] == _radio && node.name) {\n        var form = input.closest('form'),\n          inputs = 'input[name=\"' + node.name + '\"]';\n\n        inputs = form.length ? form.find(inputs) : $(inputs);\n\n        inputs.each(function() {\n          if (this !== node && $(this).data(_iCheck)) {\n            off($(this), state);\n          }\n        });\n      }\n        // Indeterminate state\n      if (indeterminate) {\n\n        // Add indeterminate state\n        node[state] = true;\n\n        // Remove checked state\n        if (node[_checked]) {\n          off(input, _checked, 'force');\n        }\n          // Checked or disabled state\n      } else {\n\n        // Add checked or disabled state\n        if (!keep) {\n          node[state] = true;\n        }\n          // Remove indeterminate state\n        if (checked && node[_indeterminate]) {\n          off(input, _indeterminate, false);\n        }\n      }\n        // Trigger callbacks\n      callbacks(input, checked, state, keep);\n    }\n      // Add proper cursor\n    if (node[_disabled] && !!option(input, _cursor, true)) {\n      parent.find('.' + _iCheckHelper).css(_cursor, 'default');\n    }\n      // Add state class\n    parent[_add](specific || option(input, state) || '');\n\n    // Set ARIA attribute\n    disabled ? parent.attr('aria-disabled', 'true') : parent.attr('aria-checked', indeterminate ? 'mixed' : 'true');\n\n    // Remove regular state class\n    parent[_remove](regular || option(input, callback) || '');\n  }\n    // Remove checked, disabled or indeterminate state\n  function off(input, state, keep) {\n    var node = input[0],\n      parent = input.parent(),\n      checked = state == _checked,\n      indeterminate = state == _indeterminate,\n      disabled = state == _disabled,\n      callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled',\n      regular = option(input, callback + capitalize(node[_type])),\n      specific = option(input, state + capitalize(node[_type]));\n\n    // Prevent unnecessary actions\n    if (node[state] !== false) {\n\n      // Toggle state\n      if (indeterminate || !keep || keep == 'force') {\n        node[state] = false;\n      }\n        // Trigger callbacks\n      callbacks(input, checked, callback, keep);\n    }\n      // Add proper cursor\n    if (!node[_disabled] && !!option(input, _cursor, true)) {\n      parent.find('.' + _iCheckHelper).css(_cursor, 'pointer');\n    }\n      // Remove state class\n    parent[_remove](specific || option(input, state) || '');\n\n    // Set ARIA attribute\n    disabled ? parent.attr('aria-disabled', 'false') : parent.attr('aria-checked', 'false');\n\n    // Add regular state class\n    parent[_add](regular || option(input, callback) || '');\n  }\n    // Remove all traces\n  function tidy(input, callback) {\n    if (input.data(_iCheck)) {\n\n      // Remove everything except input\n      input.parent().html(input.attr('style', input.data(_iCheck).s || ''));\n\n      // Callback\n      if (callback) {\n        input[_callback](callback);\n      }\n        // Unbind events\n      input.off('.i').unwrap();\n      $(_label + '[for=\"' + input[0].id + '\"]').add(input.closest(_label)).off('.i');\n    }\n  }\n    // Get some option\n  function option(input, state, regular) {\n    if (input.data(_iCheck)) {\n      return input.data(_iCheck).o[state + (regular ? '' : 'Class')];\n    }\n  }\n    // Capitalize some string\n  function capitalize(string) {\n    return string.charAt(0).toUpperCase() + string.slice(1);\n  }\n    // Executable handlers\n  function callbacks(input, checked, callback, keep) {\n    if (!keep) {\n      if (checked) {\n        input[_callback]('ifToggled');\n      }\n        input[_callback]('ifChanged')[_callback]('if' + capitalize(callback));\n    }\n  }\n})(window.jQuery || window.Zepto);\n","\n/*\nLightbox for Bootstrap 3 by @ashleydw\nhttps://github.com/ashleydw/lightbox\n\nLicense: https://github.com/ashleydw/lightbox/blob/master/LICENSE\n */\n\n(function() {\n  \"use strict\";\n  var $, EkkoLightbox;\n\n  $ = jQuery;\n\n  EkkoLightbox = function(element, options) {\n    var content, footer, header;\n    this.options = $.extend({\n      title: null,\n      footer: null,\n      remote: null\n    }, $.fn.ekkoLightbox.defaults, options || {});\n    this.$element = $(element);\n    content = '';\n    this.modal_id = this.options.modal_id ? this.options.modal_id : 'ekkoLightbox-' + Math.floor((Math.random() * 1000) + 1);\n    header = '<div class=\"modal-header\"' + (this.options.title || this.options.always_show_close ? '' : ' style=\"display:none\"') + '><button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button><h4 class=\"modal-title\">' + (this.options.title || \"&nbsp;\") + '</h4></div>';\n    footer = '<div class=\"modal-footer\"' + (this.options.footer ? '' : ' style=\"display:none\"') + '>' + this.options.footer + '</div>';\n    $(document.body).append('<div id=\"' + this.modal_id + '\" class=\"ekko-lightbox modal fade\" tabindex=\"-1\"><div class=\"modal-dialog\"><div class=\"modal-content\">' + header + '<div class=\"modal-body\"><div class=\"ekko-lightbox-container\"><div></div></div></div>' + footer + '</div></div></div>');\n    this.modal = $('#' + this.modal_id);\n    this.modal_dialog = this.modal.find('.modal-dialog').first();\n    this.modal_content = this.modal.find('.modal-content').first();\n    this.modal_body = this.modal.find('.modal-body').first();\n    this.modal_header = this.modal.find('.modal-header').first();\n    this.modal_footer = this.modal.find('.modal-footer').first();\n    this.lightbox_container = this.modal_body.find('.ekko-lightbox-container').first();\n    this.lightbox_body = this.lightbox_container.find('> div:first-child').first();\n    this.showLoading();\n    this.modal_arrows = null;\n    this.border = {\n      top: parseFloat(this.modal_dialog.css('border-top-width')) + parseFloat(this.modal_content.css('border-top-width')) + parseFloat(this.modal_body.css('border-top-width')),\n      right: parseFloat(this.modal_dialog.css('border-right-width')) + parseFloat(this.modal_content.css('border-right-width')) + parseFloat(this.modal_body.css('border-right-width')),\n      bottom: parseFloat(this.modal_dialog.css('border-bottom-width')) + parseFloat(this.modal_content.css('border-bottom-width')) + parseFloat(this.modal_body.css('border-bottom-width')),\n      left: parseFloat(this.modal_dialog.css('border-left-width')) + parseFloat(this.modal_content.css('border-left-width')) + parseFloat(this.modal_body.css('border-left-width'))\n    };\n    this.padding = {\n      top: parseFloat(this.modal_dialog.css('padding-top')) + parseFloat(this.modal_content.css('padding-top')) + parseFloat(this.modal_body.css('padding-top')),\n      right: parseFloat(this.modal_dialog.css('padding-right')) + parseFloat(this.modal_content.css('padding-right')) + parseFloat(this.modal_body.css('padding-right')),\n      bottom: parseFloat(this.modal_dialog.css('padding-bottom')) + parseFloat(this.modal_content.css('padding-bottom')) + parseFloat(this.modal_body.css('padding-bottom')),\n      left: parseFloat(this.modal_dialog.css('padding-left')) + parseFloat(this.modal_content.css('padding-left')) + parseFloat(this.modal_body.css('padding-left'))\n    };\n    this.modal.on('show.bs.modal', this.options.onShow.bind(this)).on('shown.bs.modal', (function(_this) {\n      return function() {\n        _this.modal_shown();\n        return _this.options.onShown.call(_this);\n      };\n    })(this)).on('hide.bs.modal', this.options.onHide.bind(this)).on('hidden.bs.modal', (function(_this) {\n      return function() {\n        if (_this.gallery) {\n          $(document).off('keydown.ekkoLightbox');\n        }\n        _this.modal.remove();\n        return _this.options.onHidden.call(_this);\n      };\n    })(this)).modal('show', options);\n    return this.modal;\n  };\n\n  EkkoLightbox.prototype = {\n    modal_shown: function() {\n      var video_id;\n      if (!this.options.remote) {\n        return this.error('No remote target given');\n      } else {\n        this.gallery = this.$element.data('gallery');\n        if (this.gallery) {\n          if (this.options.gallery_parent_selector === 'document.body' || this.options.gallery_parent_selector === '') {\n            this.gallery_items = $(document.body).find('*[data-gallery=\"' + this.gallery + '\"]');\n          } else {\n            this.gallery_items = this.$element.parents(this.options.gallery_parent_selector).first().find('*[data-gallery=\"' + this.gallery + '\"]');\n          }\n          this.gallery_index = this.gallery_items.index(this.$element);\n          $(document).on('keydown.ekkoLightbox', this.navigate.bind(this));\n          if (this.options.directional_arrows && this.gallery_items.length > 1) {\n            this.lightbox_container.append('<div class=\"ekko-lightbox-nav-overlay\"><a href=\"#\" class=\"' + this.strip_stops(this.options.left_arrow_class) + '\"></a><a href=\"#\" class=\"' + this.strip_stops(this.options.right_arrow_class) + '\"></a></div>');\n            this.modal_arrows = this.lightbox_container.find('div.ekko-lightbox-nav-overlay').first();\n            this.lightbox_container.find('a' + this.strip_spaces(this.options.left_arrow_class)).on('click', (function(_this) {\n              return function(event) {\n                event.preventDefault();\n                return _this.navigate_left();\n              };\n            })(this));\n            this.lightbox_container.find('a' + this.strip_spaces(this.options.right_arrow_class)).on('click', (function(_this) {\n              return function(event) {\n                event.preventDefault();\n                return _this.navigate_right();\n              };\n            })(this));\n          }\n        }\n        if (this.options.type) {\n          if (this.options.type === 'image') {\n            return this.preloadImage(this.options.remote, true);\n          } else if (this.options.type === 'youtube' && (video_id = this.getYoutubeId(this.options.remote))) {\n            return this.showYoutubeVideo(video_id);\n          } else if (this.options.type === 'vimeo') {\n            return this.showVimeoVideo(this.options.remote);\n          } else if (this.options.type === 'instagram') {\n            return this.showInstagramVideo(this.options.remote);\n          } else if (this.options.type === 'url') {\n            return this.loadRemoteContent(this.options.remote);\n          } else if (this.options.type === 'video') {\n            return this.showVideoIframe(this.options.remote);\n          } else {\n            return this.error(\"Could not detect remote target type. Force the type using data-type=\\\"image|youtube|vimeo|instagram|url|video\\\"\");\n          }\n        } else {\n          return this.detectRemoteType(this.options.remote);\n        }\n      }\n    },\n    strip_stops: function(str) {\n      return str.replace(/\\./g, '');\n    },\n    strip_spaces: function(str) {\n      return str.replace(/\\s/g, '');\n    },\n    isImage: function(str) {\n      return str.match(/(^data:image\\/.*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\\?|#).*)?$)/i);\n    },\n    isSwf: function(str) {\n      return str.match(/\\.(swf)((\\?|#).*)?$/i);\n    },\n    getYoutubeId: function(str) {\n      var match;\n      match = str.match(/^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=)([^#\\&\\?]*).*/);\n      if (match && match[2].length === 11) {\n        return match[2];\n      } else {\n        return false;\n      }\n    },\n    getVimeoId: function(str) {\n      if (str.indexOf('vimeo') > 0) {\n        return str;\n      } else {\n        return false;\n      }\n    },\n    getInstagramId: function(str) {\n      if (str.indexOf('instagram') > 0) {\n        return str;\n      } else {\n        return false;\n      }\n    },\n    navigate: function(event) {\n      event = event || window.event;\n      if (event.keyCode === 39 || event.keyCode === 37) {\n        if (event.keyCode === 39) {\n          return this.navigate_right();\n        } else if (event.keyCode === 37) {\n          return this.navigate_left();\n        }\n      }\n    },\n    navigateTo: function(index) {\n      var next, src;\n      if (index < 0 || index > this.gallery_items.length - 1) {\n        return this;\n      }\n      this.showLoading();\n      this.gallery_index = index;\n      this.$element = $(this.gallery_items.get(this.gallery_index));\n      this.updateTitleAndFooter();\n      src = this.$element.attr('data-remote') || this.$element.attr('href');\n      this.detectRemoteType(src, this.$element.attr('data-type') || false);\n      if (this.gallery_index + 1 < this.gallery_items.length) {\n        next = $(this.gallery_items.get(this.gallery_index + 1), false);\n        src = next.attr('data-remote') || next.attr('href');\n        if (next.attr('data-type') === 'image' || this.isImage(src)) {\n          return this.preloadImage(src, false);\n        }\n      }\n    },\n    navigate_left: function() {\n      if (this.gallery_items.length === 1) {\n        return;\n      }\n      if (this.gallery_index === 0) {\n        this.gallery_index = this.gallery_items.length - 1;\n      } else {\n        this.gallery_index--;\n      }\n      this.options.onNavigate.call(this, 'left', this.gallery_index);\n      return this.navigateTo(this.gallery_index);\n    },\n    navigate_right: function() {\n      if (this.gallery_items.length === 1) {\n        return;\n      }\n      if (this.gallery_index === this.gallery_items.length - 1) {\n        this.gallery_index = 0;\n      } else {\n        this.gallery_index++;\n      }\n      this.options.onNavigate.call(this, 'right', this.gallery_index);\n      return this.navigateTo(this.gallery_index);\n    },\n    detectRemoteType: function(src, type) {\n      var video_id;\n      type = type || false;\n      if (type === 'image' || this.isImage(src)) {\n        this.options.type = 'image';\n        return this.preloadImage(src, true);\n      } else if (type === 'youtube' || (video_id = this.getYoutubeId(src))) {\n        this.options.type = 'youtube';\n        return this.showYoutubeVideo(video_id);\n      } else if (type === 'vimeo' || (video_id = this.getVimeoId(src))) {\n        this.options.type = 'vimeo';\n        return this.showVimeoVideo(video_id);\n      } else if (type === 'instagram' || (video_id = this.getInstagramId(src))) {\n        this.options.type = 'instagram';\n        return this.showInstagramVideo(video_id);\n      } else if (type === 'video') {\n        this.options.type = 'video';\n        return this.showVideoIframe(video_id);\n      } else {\n        this.options.type = 'url';\n        return this.loadRemoteContent(src);\n      }\n    },\n    updateTitleAndFooter: function() {\n      var caption, footer, header, title;\n      header = this.modal_content.find('.modal-header');\n      footer = this.modal_content.find('.modal-footer');\n      title = this.$element.data('title') || \"\";\n      caption = this.$element.data('footer') || \"\";\n      if (title || this.options.always_show_close) {\n        header.css('display', '').find('.modal-title').html(title || \"&nbsp;\");\n      } else {\n        header.css('display', 'none');\n      }\n      if (caption) {\n        footer.css('display', '').html(caption);\n      } else {\n        footer.css('display', 'none');\n      }\n      return this;\n    },\n    showLoading: function() {\n      this.lightbox_body.html('<div class=\"modal-loading\">' + this.options.loadingMessage + '</div>');\n      return this;\n    },\n    showYoutubeVideo: function(id) {\n      var height, rel, width;\n      if ((this.$element.attr('data-norelated') != null) || this.options.no_related) {\n        rel = \"&rel=0\";\n      } else {\n        rel = \"\";\n      }\n      width = this.checkDimensions(this.$element.data('width') || 560);\n      height = width / (560 / 315);\n      return this.showVideoIframe('//www.youtube.com/embed/' + id + '?badge=0&autoplay=1&html5=1' + rel, width, height);\n    },\n    showVimeoVideo: function(id) {\n      var height, width;\n      width = this.checkDimensions(this.$element.data('width') || 560);\n      height = width / (500 / 281);\n      return this.showVideoIframe(id + '?autoplay=1', width, height);\n    },\n    showInstagramVideo: function(id) {\n      var height, width;\n      width = this.checkDimensions(this.$element.data('width') || 612);\n      this.resize(width);\n      height = width + 80;\n      this.lightbox_body.html('<iframe width=\"' + width + '\" height=\"' + height + '\" src=\"' + this.addTrailingSlash(id) + 'embed/\" frameborder=\"0\" allowfullscreen></iframe>');\n      this.options.onContentLoaded.call(this);\n      if (this.modal_arrows) {\n        return this.modal_arrows.css('display', 'none');\n      }\n    },\n    showVideoIframe: function(url, width, height) {\n      height = height || width;\n      this.resize(width);\n      this.lightbox_body.html('<div class=\"embed-responsive embed-responsive-16by9\"><iframe width=\"' + width + '\" height=\"' + height + '\" src=\"' + url + '\" frameborder=\"0\" allowfullscreen class=\"embed-responsive-item\"></iframe></div>');\n      this.options.onContentLoaded.call(this);\n      if (this.modal_arrows) {\n        this.modal_arrows.css('display', 'none');\n      }\n      return this;\n    },\n    loadRemoteContent: function(url) {\n      var disableExternalCheck, width;\n      width = this.$element.data('width') || 560;\n      this.resize(width);\n      disableExternalCheck = this.$element.data('disableExternalCheck') || false;\n      if (!disableExternalCheck && !this.isExternal(url)) {\n        this.lightbox_body.load(url, $.proxy((function(_this) {\n          return function() {\n            return _this.$element.trigger('loaded.bs.modal');\n          };\n        })(this)));\n      } else {\n        this.lightbox_body.html('<iframe width=\"' + width + '\" height=\"' + width + '\" src=\"' + url + '\" frameborder=\"0\" allowfullscreen></iframe>');\n        this.options.onContentLoaded.call(this);\n      }\n      if (this.modal_arrows) {\n        this.modal_arrows.css('display', 'none');\n      }\n      return this;\n    },\n    isExternal: function(url) {\n      var match;\n      match = url.match(/^([^:\\/?#]+:)?(?:\\/\\/([^\\/?#]*))?([^?#]+)?(\\?[^#]*)?(#.*)?/);\n      if (typeof match[1] === \"string\" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) {\n        return true;\n      }\n      if (typeof match[2] === \"string\" && match[2].length > 0 && match[2].replace(new RegExp(\":(\" + {\n        \"http:\": 80,\n        \"https:\": 443\n      }[location.protocol] + \")?$\"), \"\") !== location.host) {\n        return true;\n      }\n      return false;\n    },\n    error: function(message) {\n      this.lightbox_body.html(message);\n      return this;\n    },\n    preloadImage: function(src, onLoadShowImage) {\n      var img;\n      img = new Image();\n      if ((onLoadShowImage == null) || onLoadShowImage === true) {\n        img.onload = (function(_this) {\n          return function() {\n            var image;\n            image = $('<img />');\n            image.attr('src', img.src);\n            image.addClass('img-responsive');\n            _this.lightbox_body.html(image);\n            if (_this.modal_arrows) {\n              _this.modal_arrows.css('display', 'block');\n            }\n            return image.load(function() {\n              if (_this.options.scale_height) {\n                _this.scaleHeight(img.height, img.width);\n              } else {\n                _this.resize(img.width);\n              }\n              return _this.options.onContentLoaded.call(_this);\n            });\n          };\n        })(this);\n        img.onerror = (function(_this) {\n          return function() {\n            return _this.error('Failed to load image: ' + src);\n          };\n        })(this);\n      }\n      img.src = src;\n      return img;\n    },\n    scaleHeight: function(height, width) {\n      var border_padding, factor, footer_height, header_height, margins, max_height;\n      header_height = this.modal_header.outerHeight(true) || 0;\n      footer_height = this.modal_footer.outerHeight(true) || 0;\n      if (!this.modal_footer.is(':visible')) {\n        footer_height = 0;\n      }\n      if (!this.modal_header.is(':visible')) {\n        header_height = 0;\n      }\n      border_padding = this.border.top + this.border.bottom + this.padding.top + this.padding.bottom;\n      margins = parseFloat(this.modal_dialog.css('margin-top')) + parseFloat(this.modal_dialog.css('margin-bottom'));\n      max_height = $(window).height() - border_padding - margins - header_height - footer_height;\n      factor = Math.min(max_height / height, 1);\n      this.modal_dialog.css('height', 'auto').css('max-height', max_height);\n      return this.resize(factor * width);\n    },\n    resize: function(width) {\n      var width_total;\n      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;\n      this.modal_dialog.css('width', 'auto').css('max-width', width_total);\n      this.lightbox_container.find('a').css('line-height', function() {\n        return $(this).parent().height() + 'px';\n      });\n      return this;\n    },\n    checkDimensions: function(width) {\n      var body_width, width_total;\n      width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;\n      body_width = document.body.clientWidth;\n      if (width_total > body_width) {\n        width = this.modal_body.width();\n      }\n      return width;\n    },\n    close: function() {\n      return this.modal.modal('hide');\n    },\n    addTrailingSlash: function(url) {\n      if (url.substr(-1) !== '/') {\n        url += '/';\n      }\n      return url;\n    }\n  };\n\n  $.fn.ekkoLightbox = function(options) {\n    return this.each(function() {\n      var $this;\n      $this = $(this);\n      options = $.extend({\n        remote: $this.attr('data-remote') || $this.attr('href'),\n        gallery_parent_selector: $this.attr('data-parent'),\n        type: $this.attr('data-type')\n      }, options, $this.data());\n      new EkkoLightbox(this, options);\n      return this;\n    });\n  };\n\n  $.fn.ekkoLightbox.defaults = {\n    gallery_parent_selector: 'document.body',\n    left_arrow_class: '.glyphicon .glyphicon-chevron-left',\n    right_arrow_class: '.glyphicon .glyphicon-chevron-right',\n    directional_arrows: true,\n    type: null,\n    always_show_close: true,\n    no_related: false,\n    scale_height: true,\n    loadingMessage: 'Loading...',\n    onShow: function() {},\n    onShown: function() {},\n    onHide: function() {},\n    onHidden: function() {},\n    onNavigate: function() {},\n    onContentLoaded: function() {}\n  };\n\n}).call(this);\n","/**\n * Module containing core application logic.\n * @param  {jQuery} $        Insulated jQuery object\n * @param  {JSON} settings Insulated `window.snipeit.settings` object.\n * @return {IIFE}          Immediately invoked. Returns self.\n */\n\n\nvar pieOptions = {\n    //Boolean - Whether we should show a stroke on each segment\n    segmentShowStroke: true,\n    //String - The colour of each segment stroke\n    segmentStrokeColor: \"#fff\",\n    //Number - The width of each segment stroke\n    segmentStrokeWidth: 1,\n    //Number - The percentage of the chart that we cut out of the middle\n    percentageInnerCutout: 50, // This is 0 for Pie charts\n    //Number - Amount of animation steps\n    animationSteps: 100,\n    //String - Animation easing effect\n    animationEasing: \"easeOutBounce\",\n    //Boolean - Whether we animate the rotation of the Doughnut\n    animateRotate: true,\n    //Boolean - Whether we animate scaling the Doughnut from the centre\n    animateScale: false,\n    //Boolean - whether to make the chart responsive to window resizing\n    responsive: true,\n    // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container\n    maintainAspectRatio: false,\n\n    //String - A legend template\n    legendTemplate: \"<ul class=\\\"<%=name.toLowerCase()%>-legend\\\"><% for (var i=0; i<segments.length; i++){%><li>\" +\n    \"<i class='fa fa-circle-o' style='color: <%=segments[i].fillColor%>'></i>\" +\n    \"<%if(segments[i].label){%><%=segments[i].label%><%}%> foo</li><%}%></ul>\",\n    //String - A tooltip template\n    tooltipTemplate: \"<%=value %> <%=label%> \"\n};\n//console.dir(pieOptions);\n//Create pie or douhnut chart\n// You can switch between pie and douhnut using the method below.\n//pieChart.Doughnut(PieData, pieOptions);\n//-----------------\n//- END PIE CHART -\n//-----------------\n\n\n\n(function($, settings) {\n    var Components = {};\n    Components.modals = {};\n\n    // confirm delete modal\n    Components.modals.confirmDelete = function() {\n        var $el = $('table');\n\n        var events = {\n            'click': function(evnt) {\n                var $context = $(this);\n                var $dataConfirmModal = $('#dataConfirmModal');\n                var href = $context.attr('href');\n                var message = $context.attr('data-content');\n                var title = $context.attr('data-title');\n\n                $('#myModalLabel').text(title);\n                $dataConfirmModal.find('.modal-body').text(message);\n                $('#dataConfirmOK').attr('href', href);\n                $dataConfirmModal.modal({\n                    show: true\n                });\n                return false;\n            }\n        };\n\n        var render = function() {\n            $el.on('click', '.delete-asset', events['click']);\n        };\n\n        return {\n            render: render\n        };\n    };\n\n\n    /**\n     * Application start point\n     * Component definition stays out of load event, execution only happens.\n     */\n    $(function() {\n        new Components.modals.confirmDelete().render();\n    });\n}(jQuery, window.snipeit.settings));\n\n\n\n","/*! AdminLTE app.js\n * ================\n * Main JS application file for AdminLTE v2. This file\n * should be included in all pages. It controls some layout\n * options and implements exclusive AdminLTE plugins.\n *\n * @Author  Almsaeed Studio\n * @Support <http://www.almsaeedstudio.com>\n * @Email   <support@almsaeedstudio.com>\n * @version 2.3.0\n * @license MIT <http://opensource.org/licenses/MIT>\n */\n\n//Make sure jQuery has been loaded before app.js\nif (typeof jQuery === \"undefined\") {\n  throw new Error(\"AdminLTE requires jQuery\");\n}\n\n\n/* AdminLTE\n *\n * @type Object\n * @description $.AdminLTE is the main object for the template's app.\n *              It's used for implementing functions and options related\n *              to the template. Keeping everything wrapped in an object\n *              prevents conflict with other plugins and is a better\n *              way to organize our code.\n */\n$.AdminLTE = {};\n\n/* --------------------\n * - AdminLTE Options -\n * --------------------\n * Modify these options to suit your implementation\n */\n$.AdminLTE.options = {\n  //Add slimscroll to navbar menus\n  //This requires you to load the slimscroll plugin\n  //in every page before app.js\n  navbarMenuSlimscroll: true,\n  navbarMenuSlimscrollWidth: \"3px\", //The width of the scroll bar\n  navbarMenuHeight: \"200px\", //The height of the inner menu\n  //General animation speed for JS animated elements such as box collapse/expand and\n  //sidebar treeview slide up/down. This options accepts an integer as milliseconds,\n  //'fast', 'normal', or 'slow'\n  animationSpeed: 500,\n  //Sidebar push menu toggle button selector\n  sidebarToggleSelector: \"[data-toggle='offcanvas']\",\n  //Activate sidebar push menu\n  sidebarPushMenu: true,\n  //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)\n  sidebarSlimScroll: true,\n  //Enable sidebar expand on hover effect for sidebar mini\n  //This option is forced to true if both the fixed layout and sidebar mini\n  //are used together\n  sidebarExpandOnHover: false,\n  //BoxRefresh Plugin\n  enableBoxRefresh: true,\n  //Bootstrap.js tooltip\n  enableBSToppltip: true,\n  BSTooltipSelector: \"[data-toggle='tooltip']\",\n  //Enable Fast Click. Fastclick.js creates a more\n  //native touch experience with touch devices. If you\n  //choose to enable the plugin, make sure you load the script\n  //before AdminLTE's app.js\n  enableFastclick: true,\n  //Control Sidebar Options\n  enableControlSidebar: true,\n  controlSidebarOptions: {\n    //Which button should trigger the open/close event\n    toggleBtnSelector: \"[data-toggle='control-sidebar']\",\n    //The sidebar selector\n    selector: \".control-sidebar\",\n    //Enable slide over content\n    slide: true\n  },\n  //Box Widget Plugin. Enable this plugin\n  //to allow boxes to be collapsed and/or removed\n  enableBoxWidget: true,\n  //Box Widget plugin options\n  boxWidgetOptions: {\n    boxWidgetIcons: {\n      //Collapse icon\n      collapse: 'fa-minus',\n      //Open icon\n      open: 'fa-plus',\n      //Remove icon\n      remove: 'fa-times'\n    },\n    boxWidgetSelectors: {\n      //Remove button selector\n      remove: '[data-widget=\"remove\"]',\n      //Collapse button selector\n      collapse: '[data-widget=\"collapse\"]'\n    }\n  },\n  //Direct Chat plugin options\n  directChat: {\n    //Enable direct chat by default\n    enable: true,\n    //The button to open and close the chat contacts pane\n    contactToggleSelector: '[data-widget=\"chat-pane-toggle\"]'\n  },\n  //Define the set of colors to use globally around the website\n  colors: {\n    lightBlue: \"#3c8dbc\",\n    red: \"#f56954\",\n    green: \"#00a65a\",\n    aqua: \"#00c0ef\",\n    yellow: \"#f39c12\",\n    blue: \"#0073b7\",\n    navy: \"#001F3F\",\n    teal: \"#39CCCC\",\n    olive: \"#3D9970\",\n    lime: \"#01FF70\",\n    orange: \"#FF851B\",\n    fuchsia: \"#F012BE\",\n    purple: \"#8E24AA\",\n    maroon: \"#D81B60\",\n    black: \"#222222\",\n    gray: \"#d2d6de\"\n  },\n  //The standard screen sizes that bootstrap uses.\n  //If you change these in the variables.less file, change\n  //them here too.\n  screenSizes: {\n    xs: 480,\n    sm: 768,\n    md: 992,\n    lg: 1200\n  }\n};\n\n/* ------------------\n * - Implementation -\n * ------------------\n * The next block of code implements AdminLTE's\n * functions and plugins as specified by the\n * options above.\n */\n$(function () {\n  \"use strict\";\n\n  //Fix for IE page transitions\n  $(\"body\").removeClass(\"hold-transition\");\n\n  //Extend options if external options exist\n  if (typeof AdminLTEOptions !== \"undefined\") {\n    $.extend(true,\n            $.AdminLTE.options,\n            AdminLTEOptions);\n  }\n\n  //Easy access to options\n  var o = $.AdminLTE.options;\n\n  //Set up the object\n  _init();\n\n  //Activate the layout maker\n  $.AdminLTE.layout.activate();\n\n  //Enable sidebar tree view controls\n  $.AdminLTE.tree('.sidebar');\n\n  //Enable control sidebar\n  if (o.enableControlSidebar) {\n    $.AdminLTE.controlSidebar.activate();\n  }\n\n  //Add slimscroll to navbar dropdown\n  if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {\n    $(\".navbar .menu\").slimscroll({\n      height: o.navbarMenuHeight,\n      alwaysVisible: false,\n      size: o.navbarMenuSlimscrollWidth\n    }).css(\"width\", \"100%\");\n  }\n\n  //Activate sidebar push menu\n  if (o.sidebarPushMenu) {\n    $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);\n  }\n\n  //Activate Bootstrap tooltip\n  if (o.enableBSToppltip) {\n    $('body').tooltip({\n      selector: o.BSTooltipSelector\n    });\n  }\n\n  //Activate box widget\n  if (o.enableBoxWidget) {\n    $.AdminLTE.boxWidget.activate();\n  }\n\n  //Activate fast click\n  if (o.enableFastclick && typeof FastClick != 'undefined') {\n    FastClick.attach(document.body);\n  }\n\n  //Activate direct chat widget\n  if (o.directChat.enable) {\n    $(document).on('click', o.directChat.contactToggleSelector, function () {\n      var box = $(this).parents('.direct-chat').first();\n      box.toggleClass('direct-chat-contacts-open');\n    });\n  }\n\n  /*\n   * INITIALIZE BUTTON TOGGLE\n   * ------------------------\n   */\n  $('.btn-group[data-toggle=\"btn-toggle\"]').each(function () {\n    var group = $(this);\n    $(this).find(\".btn\").on('click', function (e) {\n      group.find(\".btn.active\").removeClass(\"active\");\n      $(this).addClass(\"active\");\n      e.preventDefault();\n    });\n\n  });\n});\n\n/* ----------------------------------\n * - Initialize the AdminLTE Object -\n * ----------------------------------\n * All AdminLTE functions are implemented below.\n */\nfunction _init() {\n  'use strict';\n  /* Layout\n   * ======\n   * Fixes the layout height in case min-height fails.\n   *\n   * @type Object\n   * @usage $.AdminLTE.layout.activate()\n   *        $.AdminLTE.layout.fix()\n   *        $.AdminLTE.layout.fixSidebar()\n   */\n  $.AdminLTE.layout = {\n    activate: function () {\n      var _this = this;\n      _this.fix();\n      _this.fixSidebar();\n      $(window, \".wrapper\").resize(function () {\n        _this.fix();\n        _this.fixSidebar();\n      });\n    },\n    fix: function () {\n      //Get window height and the wrapper height\n      var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();\n      var window_height = $(window).height();\n      var sidebar_height = $(\".sidebar\").height();\n      //Set the min-height of the content and sidebar based on the\n      //the height of the document.\n      if ($(\"body\").hasClass(\"fixed\")) {\n        $(\".content-wrapper, .right-side\").css('min-height', window_height - $('.main-footer').outerHeight());\n      } else {\n        var postSetWidth;\n        if (window_height >= sidebar_height) {\n          $(\".content-wrapper, .right-side\").css('min-height', window_height - neg);\n          postSetWidth = window_height - neg;\n        } else {\n          $(\".content-wrapper, .right-side\").css('min-height', sidebar_height);\n          postSetWidth = sidebar_height;\n        }\n\n        //Fix for the control sidebar height\n        var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);\n        if (typeof controlSidebar !== \"undefined\") {\n          if (controlSidebar.height() > postSetWidth)\n            $(\".content-wrapper, .right-side\").css('min-height', controlSidebar.height());\n        }\n\n      }\n    },\n    fixSidebar: function () {\n      //Make sure the body tag has the .fixed class\n      if (!$(\"body\").hasClass(\"fixed\")) {\n        if (typeof $.fn.slimScroll != 'undefined') {\n          $(\".sidebar\").slimScroll({destroy: true}).height(\"auto\");\n        }\n        return;\n      } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {\n        window.console.error(\"Error: the fixed layout requires the slimscroll plugin!\");\n      }\n      //Enable slimscroll for fixed layout\n      if ($.AdminLTE.options.sidebarSlimScroll) {\n        if (typeof $.fn.slimScroll != 'undefined') {\n          //Destroy if it exists\n          $(\".sidebar\").slimScroll({destroy: true}).height(\"auto\");\n          //Add slimscroll\n          $(\".sidebar\").slimscroll({\n            height: ($(window).height() - $(\".main-header\").height()) + \"px\",\n            color: \"rgba(0,0,0,0.2)\",\n            size: \"3px\"\n          });\n        }\n      }\n    }\n  };\n\n  /* PushMenu()\n   * ==========\n   * Adds the push menu functionality to the sidebar.\n   *\n   * @type Function\n   * @usage: $.AdminLTE.pushMenu(\"[data-toggle='offcanvas']\")\n   */\n  $.AdminLTE.pushMenu = {\n    activate: function (toggleBtn) {\n      //Get the screen sizes\n      var screenSizes = $.AdminLTE.options.screenSizes;\n\n      //Enable sidebar toggle\n      $(toggleBtn).on('click', function (e) {\n        e.preventDefault();\n\n        //Enable sidebar push menu\n        if ($(window).width() > (screenSizes.sm - 1)) {\n          if ($(\"body\").hasClass('sidebar-collapse')) {\n            $(\"body\").removeClass('sidebar-collapse').trigger('expanded.pushMenu');\n          } else {\n            $(\"body\").addClass('sidebar-collapse').trigger('collapsed.pushMenu');\n          }\n        }\n        //Handle sidebar push menu for small screens\n        else {\n          if ($(\"body\").hasClass('sidebar-open')) {\n            $(\"body\").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');\n          } else {\n            $(\"body\").addClass('sidebar-open').trigger('expanded.pushMenu');\n          }\n        }\n      });\n\n      $(\".content-wrapper\").click(function () {\n        //Enable hide menu when clicking on the content-wrapper on small screens\n        if ($(window).width() <= (screenSizes.sm - 1) && $(\"body\").hasClass(\"sidebar-open\")) {\n          $(\"body\").removeClass('sidebar-open');\n        }\n      });\n\n      //Enable expand on hover for sidebar mini\n      if ($.AdminLTE.options.sidebarExpandOnHover\n              || ($('body').hasClass('fixed')\n                      && $('body').hasClass('sidebar-mini'))) {\n        this.expandOnHover();\n      }\n    },\n    expandOnHover: function () {\n      var _this = this;\n      var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;\n      //Expand sidebar on hover\n      $('.main-sidebar').hover(function () {\n        if ($('body').hasClass('sidebar-mini')\n                && $(\"body\").hasClass('sidebar-collapse')\n                && $(window).width() > screenWidth) {\n          _this.expand();\n        }\n      }, function () {\n        if ($('body').hasClass('sidebar-mini')\n                && $('body').hasClass('sidebar-expanded-on-hover')\n                && $(window).width() > screenWidth) {\n          _this.collapse();\n        }\n      });\n    },\n    expand: function () {\n      $(\"body\").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');\n    },\n    collapse: function () {\n      if ($('body').hasClass('sidebar-expanded-on-hover')) {\n        $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');\n      }\n    }\n  };\n\n  /* Tree()\n   * ======\n   * Converts the sidebar into a multilevel\n   * tree view menu.\n   *\n   * @type Function\n   * @Usage: $.AdminLTE.tree('.sidebar')\n   */\n  $.AdminLTE.tree = function (menu) {\n    var _this = this;\n    var animationSpeed = $.AdminLTE.options.animationSpeed;\n    $(document).on('click', menu + ' li a', function (e) {\n      //Get the clicked link and the next element\n      var $this = $(this);\n      var checkElement = $this.next();\n\n      //Check if the next element is a menu and is visible\n      if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {\n        //Close the menu\n        checkElement.slideUp(animationSpeed, function () {\n          checkElement.removeClass('menu-open');\n          //Fix the layout in case the sidebar stretches over the height of the window\n          //_this.layout.fix();\n        });\n        checkElement.parent(\"li\").removeClass(\"active\");\n      }\n      //If the menu is not visible\n      else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {\n        //Get the parent menu\n        var parent = $this.parents('ul').first();\n        //Close all open menus within the parent\n        var ul = parent.find('ul:visible').slideUp(animationSpeed);\n        //Remove the menu-open class from the parent\n        ul.removeClass('menu-open');\n        //Get the parent li\n        var parent_li = $this.parent(\"li\");\n\n        //Open the target menu and add the menu-open class\n        checkElement.slideDown(animationSpeed, function () {\n          //Add the class active to the parent li\n          checkElement.addClass('menu-open');\n          parent.find('li.active').removeClass('active');\n          parent_li.addClass('active');\n          //Fix the layout in case the sidebar stretches over the height of the window\n          _this.layout.fix();\n        });\n      }\n      //if this isn't a link, prevent the page from being redirected\n      if (checkElement.is('.treeview-menu')) {\n        e.preventDefault();\n      }\n    });\n  };\n\n  /* ControlSidebar\n   * ==============\n   * Adds functionality to the right sidebar\n   *\n   * @type Object\n   * @usage $.AdminLTE.controlSidebar.activate(options)\n   */\n  $.AdminLTE.controlSidebar = {\n    //instantiate the object\n    activate: function () {\n      //Get the object\n      var _this = this;\n      //Update options\n      var o = $.AdminLTE.options.controlSidebarOptions;\n      //Get the sidebar\n      var sidebar = $(o.selector);\n      //The toggle button\n      var btn = $(o.toggleBtnSelector);\n\n      //Listen to the click event\n      btn.on('click', function (e) {\n        e.preventDefault();\n        //If the sidebar is not open\n        if (!sidebar.hasClass('control-sidebar-open')\n                && !$('body').hasClass('control-sidebar-open')) {\n          //Open the sidebar\n          _this.open(sidebar, o.slide);\n        } else {\n          _this.close(sidebar, o.slide);\n        }\n      });\n\n      //If the body has a boxed layout, fix the sidebar bg position\n      var bg = $(\".control-sidebar-bg\");\n      _this._fix(bg);\n\n      //If the body has a fixed layout, make the control sidebar fixed\n      if ($('body').hasClass('fixed')) {\n        _this._fixForFixed(sidebar);\n      } else {\n        //If the content height is less than the sidebar's height, force max height\n        if ($('.content-wrapper, .right-side').height() < sidebar.height()) {\n          _this._fixForContent(sidebar);\n        }\n      }\n    },\n    //Open the control sidebar\n    open: function (sidebar, slide) {\n      //Slide over content\n      if (slide) {\n        sidebar.addClass('control-sidebar-open');\n      } else {\n        //Push the content by adding the open class to the body instead\n        //of the sidebar itself\n        $('body').addClass('control-sidebar-open');\n      }\n    },\n    //Close the control sidebar\n    close: function (sidebar, slide) {\n      if (slide) {\n        sidebar.removeClass('control-sidebar-open');\n      } else {\n        $('body').removeClass('control-sidebar-open');\n      }\n    },\n    _fix: function (sidebar) {\n      var _this = this;\n      if ($(\"body\").hasClass('layout-boxed')) {\n        sidebar.css('position', 'absolute');\n        sidebar.height($(\".wrapper\").height());\n        $(window).resize(function () {\n          _this._fix(sidebar);\n        });\n      } else {\n        sidebar.css({\n          'position': 'fixed',\n          'height': 'auto'\n        });\n      }\n    },\n    _fixForFixed: function (sidebar) {\n      sidebar.css({\n        'position': 'fixed',\n        'max-height': '100%',\n        'overflow': 'auto',\n        'padding-bottom': '50px'\n      });\n    },\n    _fixForContent: function (sidebar) {\n      $(\".content-wrapper, .right-side\").css('min-height', sidebar.height());\n    }\n  };\n\n  /* BoxWidget\n   * =========\n   * BoxWidget is a plugin to handle collapsing and\n   * removing boxes from the screen.\n   *\n   * @type Object\n   * @usage $.AdminLTE.boxWidget.activate()\n   *        Set all your options in the main $.AdminLTE.options object\n   */\n  $.AdminLTE.boxWidget = {\n    selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,\n    icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,\n    animationSpeed: $.AdminLTE.options.animationSpeed,\n    activate: function (_box) {\n      var _this = this;\n      if (!_box) {\n        _box = document; // activate all boxes per default\n      }\n      //Listen for collapse event triggers\n      $(_box).on('click', _this.selectors.collapse, function (e) {\n        e.preventDefault();\n        _this.collapse($(this));\n      });\n\n      //Listen for remove event triggers\n      $(_box).on('click', _this.selectors.remove, function (e) {\n        e.preventDefault();\n        _this.remove($(this));\n      });\n    },\n    collapse: function (element) {\n      var _this = this;\n      //Find the box parent\n      var box = element.parents(\".box\").first();\n      //Find the body and the footer\n      var box_content = box.find(\"> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer\");\n      if (!box.hasClass(\"collapsed-box\")) {\n        //Convert minus into plus\n        element.children(\":first\")\n                .removeClass(_this.icons.collapse)\n                .addClass(_this.icons.open);\n        //Hide the content\n        box_content.slideUp(_this.animationSpeed, function () {\n          box.addClass(\"collapsed-box\");\n        });\n      } else {\n        //Convert plus into minus\n        element.children(\":first\")\n                .removeClass(_this.icons.open)\n                .addClass(_this.icons.collapse);\n        //Show the content\n        box_content.slideDown(_this.animationSpeed, function () {\n          box.removeClass(\"collapsed-box\");\n        });\n      }\n    },\n    remove: function (element) {\n      //Find the box parent\n      var box = element.parents(\".box\").first();\n      box.slideUp(this.animationSpeed);\n    }\n  };\n}\n\n/* ------------------\n * - Custom Plugins -\n * ------------------\n * All custom plugins are defined below.\n */\n\n/*\n * BOX REFRESH BUTTON\n * ------------------\n * This is a custom plugin to use with the component BOX. It allows you to add\n * a refresh button to the box. It converts the box's state to a loading state.\n *\n * @type plugin\n * @usage $(\"#box-widget\").boxRefresh( options );\n */\n(function ($) {\n\n  \"use strict\";\n\n  $.fn.boxRefresh = function (options) {\n\n    // Render options\n    var settings = $.extend({\n      //Refresh button selector\n      trigger: \".refresh-btn\",\n      //File source to be loaded (e.g: ajax/src.php)\n      source: \"\",\n      //Callbacks\n      onLoadStart: function (box) {\n        return box;\n      }, //Right after the button has been clicked\n      onLoadDone: function (box) {\n        return box;\n      } //When the source has been loaded\n\n    }, options);\n\n    //The overlay\n    var overlay = $('<div class=\"overlay\"><div class=\"fa fa-refresh fa-spin\"></div></div>');\n\n    return this.each(function () {\n      //if a source is specified\n      if (settings.source === \"\") {\n        if (window.console) {\n          window.console.log(\"Please specify a source first - boxRefresh()\");\n        }\n        return;\n      }\n      //the box\n      var box = $(this);\n      //the button\n      var rBtn = box.find(settings.trigger).first();\n\n      //On trigger click\n      rBtn.on('click', function (e) {\n        e.preventDefault();\n        //Add loading overlay\n        start(box);\n\n        //Perform ajax call\n        box.find(\".box-body\").load(settings.source, function () {\n          done(box);\n        });\n      });\n    });\n\n    function start(box) {\n      //Add overlay and loading img\n      box.append(overlay);\n\n      settings.onLoadStart.call(box);\n    }\n\n    function done(box) {\n      //Remove overlay and loading img\n      box.find(overlay).remove();\n\n      settings.onLoadDone.call(box);\n    }\n\n  };\n\n})(jQuery);\n\n/*\n * EXPLICIT BOX ACTIVATION\n * -----------------------\n * This is a custom plugin to use with the component BOX. It allows you to activate\n * a box inserted in the DOM after the app.js was loaded.\n *\n * @type plugin\n * @usage $(\"#box-widget\").activateBox();\n */\n(function ($) {\n\n  'use strict';\n\n  $.fn.activateBox = function () {\n    $.AdminLTE.boxWidget.activate(this);\n  };\n\n})(jQuery);\n\n/*\n * TODO LIST CUSTOM PLUGIN\n * -----------------------\n * This plugin depends on iCheck plugin for checkbox and radio inputs\n *\n * @type plugin\n * @usage $(\"#todo-widget\").todolist( options );\n */\n(function ($) {\n\n  'use strict';\n\n  $.fn.todolist = function (options) {\n    // Render options\n    var settings = $.extend({\n      //When the user checks the input\n      onCheck: function (ele) {\n        return ele;\n      },\n      //When the user unchecks the input\n      onUncheck: function (ele) {\n        return ele;\n      }\n    }, options);\n\n    return this.each(function () {\n\n      if (typeof $.fn.iCheck != 'undefined') {\n        $('input', this).on('ifChecked', function () {\n          var ele = $(this).parents(\"li\").first();\n          ele.toggleClass(\"done\");\n          settings.onCheck.call(ele);\n        });\n\n        $('input', this).on('ifUnchecked', function () {\n          var ele = $(this).parents(\"li\").first();\n          ele.toggleClass(\"done\");\n          settings.onUncheck.call(ele);\n        });\n      } else {\n        $('input', this).on('change', function () {\n          var ele = $(this).parents(\"li\").first();\n          ele.toggleClass(\"done\");\n          if ($('input', ele).is(\":checked\")) {\n            settings.onCheck.call(ele);\n          } else {\n            settings.onUncheck.call(ele);\n          }\n        });\n      }\n    });\n  };\n}(jQuery));\n\n//-------------\n//- PIE CHART -\n//-------------\n// Get context with jQuery - using jQuery's .get() method.\n\n\n\n"],"sourceRoot":"/source/"}
        \ No newline at end of file
        diff --git a/public/build/rev-manifest.json b/public/build/rev-manifest.json
        deleted file mode 100644
        index 64b525d029..0000000000
        --- a/public/build/rev-manifest.json
        +++ /dev/null
        @@ -1,4 +0,0 @@
        -{
        -  "assets/css/app.css": "assets/css/app-de75b6d10a.css",
        -  "assets/js/all.js": "assets/js/all-5ba6978224.js"
        -}
        \ No newline at end of file
        diff --git a/public/build/assets/css/app-de75b6d10a.css b/public/css/AdminLTE.css
        old mode 100644
        new mode 100755
        similarity index 81%
        rename from public/build/assets/css/app-de75b6d10a.css
        rename to public/css/AdminLTE.css
        index 3578f68047..0128173747
        Binary files a/public/build/assets/css/app-de75b6d10a.css and b/public/css/AdminLTE.css differ
        diff --git a/public/assets/css/AdminLTE.min.css b/public/css/AdminLTE.min.css
        similarity index 99%
        rename from public/assets/css/AdminLTE.min.css
        rename to public/css/AdminLTE.min.css
        index b5ec266b72..396657a381 100755
        Binary files a/public/assets/css/AdminLTE.min.css and b/public/css/AdminLTE.min.css differ
        diff --git a/public/css/all.47a3626f2a026645fe48f025aacc900f.css b/public/css/all.47a3626f2a026645fe48f025aacc900f.css
        new file mode 100644
        index 0000000000..be3881e615
        Binary files /dev/null and b/public/css/all.47a3626f2a026645fe48f025aacc900f.css differ
        diff --git a/public/css/all.62471b1dabf4426689e067404cda00a2.css b/public/css/all.62471b1dabf4426689e067404cda00a2.css
        new file mode 100644
        index 0000000000..20547187db
        Binary files /dev/null and b/public/css/all.62471b1dabf4426689e067404cda00a2.css differ
        diff --git a/public/css/all.c320a5e511c1340ea16bc7facdbdb57b.css b/public/css/all.c320a5e511c1340ea16bc7facdbdb57b.css
        new file mode 100644
        index 0000000000..88519a3d43
        Binary files /dev/null and b/public/css/all.c320a5e511c1340ea16bc7facdbdb57b.css differ
        diff --git a/public/css/all.css b/public/css/all.css
        new file mode 100644
        index 0000000000..88519a3d43
        Binary files /dev/null and b/public/css/all.css differ
        diff --git a/public/css/app.47a3626f2a026645fe48f025aacc900f.css b/public/css/app.47a3626f2a026645fe48f025aacc900f.css
        new file mode 100644
        index 0000000000..be3881e615
        Binary files /dev/null and b/public/css/app.47a3626f2a026645fe48f025aacc900f.css differ
        diff --git a/public/css/app.62471b1dabf4426689e067404cda00a2.css b/public/css/app.62471b1dabf4426689e067404cda00a2.css
        new file mode 100644
        index 0000000000..20547187db
        Binary files /dev/null and b/public/css/app.62471b1dabf4426689e067404cda00a2.css differ
        diff --git a/public/css/app.css b/public/css/app.css
        new file mode 100644
        index 0000000000..ce2844c91a
        Binary files /dev/null and b/public/css/app.css differ
        diff --git a/public/assets/css/bootstrap-table.css b/public/css/bootstrap-table.css
        similarity index 100%
        rename from public/assets/css/bootstrap-table.css
        rename to public/css/bootstrap-table.css
        diff --git a/public/assets/css/bootstrap.css b/public/css/bootstrap.css
        similarity index 100%
        rename from public/assets/css/bootstrap.css
        rename to public/css/bootstrap.css
        diff --git a/public/assets/css/bootstrap.css.map b/public/css/bootstrap.css.map
        similarity index 100%
        rename from public/assets/css/bootstrap.css.map
        rename to public/css/bootstrap.css.map
        diff --git a/public/assets/css/bootstrap.datepicker.css b/public/css/bootstrap.datepicker.css
        similarity index 100%
        rename from public/assets/css/bootstrap.datepicker.css
        rename to public/css/bootstrap.datepicker.css
        diff --git a/public/assets/css/bootstrap.min.css b/public/css/bootstrap.min.css
        similarity index 100%
        rename from public/assets/css/bootstrap.min.css
        rename to public/css/bootstrap.min.css
        diff --git a/public/css/dist/all.css b/public/css/dist/all.css
        new file mode 100644
        index 0000000000..7f8ab24dfa
        Binary files /dev/null and b/public/css/dist/all.css differ
        diff --git a/public/assets/css/ekko-lightbox.css b/public/css/ekko-lightbox.css
        similarity index 100%
        rename from public/assets/css/ekko-lightbox.css
        rename to public/css/ekko-lightbox.css
        diff --git a/public/assets/css/ekko-lightbox.min.css b/public/css/ekko-lightbox.min.css
        similarity index 100%
        rename from public/assets/css/ekko-lightbox.min.css
        rename to public/css/ekko-lightbox.min.css
        diff --git a/public/assets/css/font-awesome.css b/public/css/font-awesome/font-awesome.css
        similarity index 86%
        rename from public/assets/css/font-awesome.css
        rename to public/css/font-awesome/font-awesome.css
        index b2a5fe2f25..ee906a8196 100644
        Binary files a/public/assets/css/font-awesome.css and b/public/css/font-awesome/font-awesome.css differ
        diff --git a/public/css/font-awesome/font-awesome.min.css b/public/css/font-awesome/font-awesome.min.css
        new file mode 100644
        index 0000000000..540440ce89
        Binary files /dev/null and b/public/css/font-awesome/font-awesome.min.css differ
        diff --git a/public/css/fonts/FontAwesome.otf b/public/css/fonts/FontAwesome.otf
        new file mode 100644
        index 0000000000..401ec0f36e
        Binary files /dev/null and b/public/css/fonts/FontAwesome.otf differ
        diff --git a/public/css/fonts/fontawesome-webfont.eot b/public/css/fonts/fontawesome-webfont.eot
        new file mode 100644
        index 0000000000..e9f60ca953
        Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.eot differ
        diff --git a/public/css/fonts/fontawesome-webfont.svg b/public/css/fonts/fontawesome-webfont.svg
        new file mode 100644
        index 0000000000..855c845e53
        Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.svg differ
        diff --git a/public/css/fonts/fontawesome-webfont.ttf b/public/css/fonts/fontawesome-webfont.ttf
        new file mode 100644
        index 0000000000..35acda2fa1
        Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.ttf differ
        diff --git a/public/css/fonts/fontawesome-webfont.woff b/public/css/fonts/fontawesome-webfont.woff
        new file mode 100644
        index 0000000000..400014a4b0
        Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.woff differ
        diff --git a/public/css/fonts/fontawesome-webfont.woff2 b/public/css/fonts/fontawesome-webfont.woff2
        new file mode 100644
        index 0000000000..4d13fc6040
        Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.woff2 differ
        diff --git a/public/assets/css/jquery.typeahead.min.css b/public/css/jquery.typeahead.min.css
        similarity index 100%
        rename from public/assets/css/jquery.typeahead.min.css
        rename to public/css/jquery.typeahead.min.css
        diff --git a/public/assets/css/lib/bootstrap-wysihtml5.css b/public/css/lib/bootstrap-wysihtml5.css
        similarity index 100%
        rename from public/assets/css/lib/bootstrap-wysihtml5.css
        rename to public/css/lib/bootstrap-wysihtml5.css
        diff --git a/public/assets/css/lib/bootstrap.datepicker.css b/public/css/lib/bootstrap.datepicker.css
        similarity index 100%
        rename from public/assets/css/lib/bootstrap.datepicker.css
        rename to public/css/lib/bootstrap.datepicker.css
        diff --git a/public/css/lib/dragtable.css b/public/css/lib/dragtable.css
        new file mode 100644
        index 0000000000..874b0ee24d
        Binary files /dev/null and b/public/css/lib/dragtable.css differ
        diff --git a/public/assets/css/lib/font-awesome.css b/public/css/lib/font-awesome.css
        similarity index 100%
        rename from public/assets/css/lib/font-awesome.css
        rename to public/css/lib/font-awesome.css
        diff --git a/public/assets/css/lib/font-awesome.min.css b/public/css/lib/font-awesome.min.css
        similarity index 100%
        rename from public/assets/css/lib/font-awesome.min.css
        rename to public/css/lib/font-awesome.min.css
        diff --git a/public/assets/css/lib/fullcalendar.css b/public/css/lib/fullcalendar.css
        similarity index 100%
        rename from public/assets/css/lib/fullcalendar.css
        rename to public/css/lib/fullcalendar.css
        diff --git a/public/assets/css/lib/fullcalendar.print.css b/public/css/lib/fullcalendar.print.css
        similarity index 100%
        rename from public/assets/css/lib/fullcalendar.print.css
        rename to public/css/lib/fullcalendar.print.css
        diff --git a/public/assets/css/lib/jquery-ui-1.10.2.custom.css b/public/css/lib/jquery-ui-1.10.2.custom.css
        similarity index 100%
        rename from public/assets/css/lib/jquery-ui-1.10.2.custom.css
        rename to public/css/lib/jquery-ui-1.10.2.custom.css
        diff --git a/public/assets/css/lib/jquery.dataTables.css b/public/css/lib/jquery.dataTables.css
        similarity index 100%
        rename from public/assets/css/lib/jquery.dataTables.css
        rename to public/css/lib/jquery.dataTables.css
        diff --git a/public/assets/css/lib/jquery.fileupload-ui.css b/public/css/lib/jquery.fileupload-ui.css
        similarity index 100%
        rename from public/assets/css/lib/jquery.fileupload-ui.css
        rename to public/css/lib/jquery.fileupload-ui.css
        diff --git a/public/assets/css/lib/jquery.fileupload.css b/public/css/lib/jquery.fileupload.css
        similarity index 100%
        rename from public/assets/css/lib/jquery.fileupload.css
        rename to public/css/lib/jquery.fileupload.css
        diff --git a/public/assets/css/lib/morris.css b/public/css/lib/morris.css
        similarity index 100%
        rename from public/assets/css/lib/morris.css
        rename to public/css/lib/morris.css
        diff --git a/public/assets/css/lib/select2.css b/public/css/lib/select2.css
        similarity index 100%
        rename from public/assets/css/lib/select2.css
        rename to public/css/lib/select2.css
        diff --git a/public/assets/css/lib/select2x2.png b/public/css/lib/select2x2.png
        similarity index 100%
        rename from public/assets/css/lib/select2x2.png
        rename to public/css/lib/select2x2.png
        diff --git a/public/assets/css/lib/uniform.default.css b/public/css/lib/uniform.default.css
        similarity index 100%
        rename from public/assets/css/lib/uniform.default.css
        rename to public/css/lib/uniform.default.css
        diff --git a/public/assets/css/metisMenu.css b/public/css/metisMenu.css
        similarity index 100%
        rename from public/assets/css/metisMenu.css
        rename to public/css/metisMenu.css
        diff --git a/public/assets/css/metisMenu.min.css b/public/css/metisMenu.min.css
        similarity index 100%
        rename from public/assets/css/metisMenu.min.css
        rename to public/css/metisMenu.min.css
        diff --git a/public/assets/css/morris.css b/public/css/morris.css
        similarity index 100%
        rename from public/assets/css/morris.css
        rename to public/css/morris.css
        diff --git a/public/css/overrides.css b/public/css/overrides.css
        new file mode 100644
        index 0000000000..31e60701c8
        Binary files /dev/null and b/public/css/overrides.css differ
        diff --git a/public/assets/css/select2.css b/public/css/select2.css
        similarity index 100%
        rename from public/assets/css/select2.css
        rename to public/css/select2.css
        diff --git a/public/assets/css/select2x2.png b/public/css/select2x2.png
        similarity index 100%
        rename from public/assets/css/select2x2.png
        rename to public/css/select2x2.png
        diff --git a/public/assets/css/signature-pad.css b/public/css/signature-pad.css
        similarity index 100%
        rename from public/assets/css/signature-pad.css
        rename to public/css/signature-pad.css
        diff --git a/public/assets/css/skins/_all-skins.css b/public/css/skins/_all-skins.css
        similarity index 100%
        rename from public/assets/css/skins/_all-skins.css
        rename to public/css/skins/_all-skins.css
        diff --git a/public/assets/css/skins/_all-skins.min.css b/public/css/skins/_all-skins.min.css
        similarity index 100%
        rename from public/assets/css/skins/_all-skins.min.css
        rename to public/css/skins/_all-skins.min.css
        diff --git a/public/assets/css/skins/skin-black-light.css b/public/css/skins/skin-black-light.css
        similarity index 100%
        rename from public/assets/css/skins/skin-black-light.css
        rename to public/css/skins/skin-black-light.css
        diff --git a/public/assets/css/skins/skin-black-light.min.css b/public/css/skins/skin-black-light.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-black-light.min.css
        rename to public/css/skins/skin-black-light.min.css
        diff --git a/public/assets/css/skins/skin-black.css b/public/css/skins/skin-black.css
        similarity index 100%
        rename from public/assets/css/skins/skin-black.css
        rename to public/css/skins/skin-black.css
        diff --git a/public/assets/css/skins/skin-black.min.css b/public/css/skins/skin-black.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-black.min.css
        rename to public/css/skins/skin-black.min.css
        diff --git a/public/assets/css/skins/skin-blue-light.css b/public/css/skins/skin-blue-light.css
        similarity index 100%
        rename from public/assets/css/skins/skin-blue-light.css
        rename to public/css/skins/skin-blue-light.css
        diff --git a/public/assets/css/skins/skin-blue-light.min.css b/public/css/skins/skin-blue-light.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-blue-light.min.css
        rename to public/css/skins/skin-blue-light.min.css
        diff --git a/public/assets/css/skins/skin-blue.css b/public/css/skins/skin-blue.css
        similarity index 100%
        rename from public/assets/css/skins/skin-blue.css
        rename to public/css/skins/skin-blue.css
        diff --git a/public/assets/css/skins/skin-blue.min.css b/public/css/skins/skin-blue.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-blue.min.css
        rename to public/css/skins/skin-blue.min.css
        diff --git a/public/assets/css/skins/skin-green-light.css b/public/css/skins/skin-green-light.css
        similarity index 100%
        rename from public/assets/css/skins/skin-green-light.css
        rename to public/css/skins/skin-green-light.css
        diff --git a/public/assets/css/skins/skin-green-light.min.css b/public/css/skins/skin-green-light.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-green-light.min.css
        rename to public/css/skins/skin-green-light.min.css
        diff --git a/public/assets/css/skins/skin-green.css b/public/css/skins/skin-green.css
        similarity index 100%
        rename from public/assets/css/skins/skin-green.css
        rename to public/css/skins/skin-green.css
        diff --git a/public/assets/css/skins/skin-green.min.css b/public/css/skins/skin-green.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-green.min.css
        rename to public/css/skins/skin-green.min.css
        diff --git a/public/assets/css/skins/skin-purple-light.css b/public/css/skins/skin-purple-light.css
        similarity index 100%
        rename from public/assets/css/skins/skin-purple-light.css
        rename to public/css/skins/skin-purple-light.css
        diff --git a/public/assets/css/skins/skin-purple-light.min.css b/public/css/skins/skin-purple-light.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-purple-light.min.css
        rename to public/css/skins/skin-purple-light.min.css
        diff --git a/public/assets/css/skins/skin-purple.css b/public/css/skins/skin-purple.css
        similarity index 100%
        rename from public/assets/css/skins/skin-purple.css
        rename to public/css/skins/skin-purple.css
        diff --git a/public/assets/css/skins/skin-purple.min.css b/public/css/skins/skin-purple.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-purple.min.css
        rename to public/css/skins/skin-purple.min.css
        diff --git a/public/assets/css/skins/skin-red-light.css b/public/css/skins/skin-red-light.css
        similarity index 100%
        rename from public/assets/css/skins/skin-red-light.css
        rename to public/css/skins/skin-red-light.css
        diff --git a/public/assets/css/skins/skin-red-light.min.css b/public/css/skins/skin-red-light.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-red-light.min.css
        rename to public/css/skins/skin-red-light.min.css
        diff --git a/public/assets/css/skins/skin-red.css b/public/css/skins/skin-red.css
        similarity index 100%
        rename from public/assets/css/skins/skin-red.css
        rename to public/css/skins/skin-red.css
        diff --git a/public/assets/css/skins/skin-red.min.css b/public/css/skins/skin-red.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-red.min.css
        rename to public/css/skins/skin-red.min.css
        diff --git a/public/assets/css/skins/skin-yellow-light.css b/public/css/skins/skin-yellow-light.css
        similarity index 100%
        rename from public/assets/css/skins/skin-yellow-light.css
        rename to public/css/skins/skin-yellow-light.css
        diff --git a/public/assets/css/skins/skin-yellow-light.min.css b/public/css/skins/skin-yellow-light.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-yellow-light.min.css
        rename to public/css/skins/skin-yellow-light.min.css
        diff --git a/public/assets/css/skins/skin-yellow.css b/public/css/skins/skin-yellow.css
        similarity index 100%
        rename from public/assets/css/skins/skin-yellow.css
        rename to public/css/skins/skin-yellow.css
        diff --git a/public/assets/css/skins/skin-yellow.min.css b/public/css/skins/skin-yellow.min.css
        similarity index 100%
        rename from public/assets/css/skins/skin-yellow.min.css
        rename to public/css/skins/skin-yellow.min.css
        diff --git a/public/assets/img/sad-panda.png b/public/img/sad-panda.png
        similarity index 100%
        rename from public/assets/img/sad-panda.png
        rename to public/img/sad-panda.png
        diff --git a/public/index.php b/public/index.php
        index 01ea454daa..348b3d9785 100644
        --- a/public/index.php
        +++ b/public/index.php
        @@ -4,7 +4,7 @@
          * Laravel - A PHP Framework For Web Artisans
          *
          * @package  Laravel
        - * @author   Taylor Otwell <taylorotwell@gmail.com>
        + * @author   Taylor Otwell <taylor@laravel.com>
          */
         
         /*
        @@ -20,7 +20,6 @@
         */
         
         require __DIR__.'/../bootstrap/autoload.php';
        -include '../c3.php';
         
         /*
         |--------------------------------------------------------------------------
        diff --git a/public/js/FileSaver.min.js b/public/js/FileSaver.min.js
        new file mode 100644
        index 0000000000..b1cb31daef
        Binary files /dev/null and b/public/js/FileSaver.min.js differ
        diff --git a/public/js/app.js b/public/js/app.js
        new file mode 100755
        index 0000000000..4c28e585af
        Binary files /dev/null and b/public/js/app.js differ
        diff --git a/public/assets/js/app.min.js b/public/js/app.min.js
        similarity index 100%
        rename from public/assets/js/app.min.js
        rename to public/js/app.min.js
        diff --git a/public/assets/js/bootstrap-table-locale-all.js b/public/js/bootstrap-table-locale-all.js
        similarity index 100%
        rename from public/assets/js/bootstrap-table-locale-all.js
        rename to public/js/bootstrap-table-locale-all.js
        diff --git a/public/assets/js/bootstrap-table-locale-all.min.js b/public/js/bootstrap-table-locale-all.min.js
        similarity index 100%
        rename from public/assets/js/bootstrap-table-locale-all.min.js
        rename to public/js/bootstrap-table-locale-all.min.js
        diff --git a/public/assets/js/bootstrap-table.css b/public/js/bootstrap-table.css
        similarity index 100%
        rename from public/assets/js/bootstrap-table.css
        rename to public/js/bootstrap-table.css
        diff --git a/public/assets/js/bootstrap-table.js b/public/js/bootstrap-table.js
        similarity index 99%
        rename from public/assets/js/bootstrap-table.js
        rename to public/js/bootstrap-table.js
        index f8715e9c4d..1c891bbc54 100755
        Binary files a/public/assets/js/bootstrap-table.js and b/public/js/bootstrap-table.js differ
        diff --git a/public/assets/js/bootstrap-table.min.css b/public/js/bootstrap-table.min.css
        similarity index 100%
        rename from public/assets/js/bootstrap-table.min.css
        rename to public/js/bootstrap-table.min.css
        diff --git a/public/assets/js/bootstrap-table.min.js b/public/js/bootstrap-table.min.js
        similarity index 100%
        rename from public/assets/js/bootstrap-table.min.js
        rename to public/js/bootstrap-table.min.js
        diff --git a/public/assets/js/bootstrap.datepicker.js b/public/js/bootstrap.datepicker.js
        similarity index 100%
        rename from public/assets/js/bootstrap.datepicker.js
        rename to public/js/bootstrap.datepicker.js
        diff --git a/public/assets/js/bootstrap/css/bootstrap.css b/public/js/bootstrap/css/bootstrap.css
        similarity index 100%
        rename from public/assets/js/bootstrap/css/bootstrap.css
        rename to public/js/bootstrap/css/bootstrap.css
        diff --git a/public/assets/js/bootstrap/css/bootstrap.css.map b/public/js/bootstrap/css/bootstrap.css.map
        similarity index 100%
        rename from public/assets/js/bootstrap/css/bootstrap.css.map
        rename to public/js/bootstrap/css/bootstrap.css.map
        diff --git a/public/assets/js/bootstrap/css/bootstrap.min.css b/public/js/bootstrap/css/bootstrap.min.css
        similarity index 100%
        rename from public/assets/js/bootstrap/css/bootstrap.min.css
        rename to public/js/bootstrap/css/bootstrap.min.css
        diff --git a/public/js/bootstrap/fonts/glyphicons-halflings-regular.eot b/public/js/bootstrap/fonts/glyphicons-halflings-regular.eot
        new file mode 100755
        index 0000000000..b93a4953ff
        Binary files /dev/null and b/public/js/bootstrap/fonts/glyphicons-halflings-regular.eot differ
        diff --git a/public/js/bootstrap/fonts/glyphicons-halflings-regular.svg b/public/js/bootstrap/fonts/glyphicons-halflings-regular.svg
        new file mode 100755
        index 0000000000..94fb5490a2
        Binary files /dev/null and b/public/js/bootstrap/fonts/glyphicons-halflings-regular.svg differ
        diff --git a/public/js/bootstrap/fonts/glyphicons-halflings-regular.ttf b/public/js/bootstrap/fonts/glyphicons-halflings-regular.ttf
        new file mode 100755
        index 0000000000..1413fc609a
        Binary files /dev/null and b/public/js/bootstrap/fonts/glyphicons-halflings-regular.ttf differ
        diff --git a/public/js/bootstrap/fonts/glyphicons-halflings-regular.woff b/public/js/bootstrap/fonts/glyphicons-halflings-regular.woff
        new file mode 100755
        index 0000000000..9e612858f8
        Binary files /dev/null and b/public/js/bootstrap/fonts/glyphicons-halflings-regular.woff differ
        diff --git a/public/js/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/public/js/bootstrap/fonts/glyphicons-halflings-regular.woff2
        new file mode 100755
        index 0000000000..64539b54c3
        Binary files /dev/null and b/public/js/bootstrap/fonts/glyphicons-halflings-regular.woff2 differ
        diff --git a/public/assets/js/bootstrap/js/bootstrap.js b/public/js/bootstrap/js/bootstrap.js
        similarity index 100%
        rename from public/assets/js/bootstrap/js/bootstrap.js
        rename to public/js/bootstrap/js/bootstrap.js
        diff --git a/public/assets/js/bootstrap/js/bootstrap.min.js b/public/js/bootstrap/js/bootstrap.min.js
        similarity index 100%
        rename from public/assets/js/bootstrap/js/bootstrap.min.js
        rename to public/js/bootstrap/js/bootstrap.min.js
        diff --git a/public/assets/js/bootstrap/js/npm.js b/public/js/bootstrap/js/npm.js
        similarity index 100%
        rename from public/assets/js/bootstrap/js/npm.js
        rename to public/js/bootstrap/js/npm.js
        diff --git a/public/assets/js/dashboard.js b/public/js/dashboard.js
        similarity index 100%
        rename from public/assets/js/dashboard.js
        rename to public/js/dashboard.js
        diff --git a/public/assets/js/dashboard2.js b/public/js/dashboard2.js
        similarity index 100%
        rename from public/assets/js/dashboard2.js
        rename to public/js/dashboard2.js
        diff --git a/public/assets/js/demo.js b/public/js/demo.js
        similarity index 100%
        rename from public/assets/js/demo.js
        rename to public/js/demo.js
        diff --git a/public/js/dist/all.js b/public/js/dist/all.js
        new file mode 100644
        index 0000000000..81a5936700
        Binary files /dev/null and b/public/js/dist/all.js differ
        diff --git a/public/assets/js/ekko-lightbox.js b/public/js/ekko-lightbox.js
        similarity index 100%
        rename from public/assets/js/ekko-lightbox.js
        rename to public/js/ekko-lightbox.js
        diff --git a/public/assets/js/ekko-lightbox.min.js b/public/js/ekko-lightbox.min.js
        similarity index 100%
        rename from public/assets/js/ekko-lightbox.min.js
        rename to public/js/ekko-lightbox.min.js
        diff --git a/public/js/extensions/accent-neutralise/bootstrap-table-accent-neutralise.js b/public/js/extensions/accent-neutralise/bootstrap-table-accent-neutralise.js
        new file mode 100755
        index 0000000000..dc7b4f08fc
        Binary files /dev/null and b/public/js/extensions/accent-neutralise/bootstrap-table-accent-neutralise.js differ
        diff --git a/public/assets/js/extensions/accent-neutralise/bootstrap-table-accent-neutralise.min.js b/public/js/extensions/accent-neutralise/bootstrap-table-accent-neutralise.min.js
        similarity index 100%
        rename from public/assets/js/extensions/accent-neutralise/bootstrap-table-accent-neutralise.min.js
        rename to public/js/extensions/accent-neutralise/bootstrap-table-accent-neutralise.min.js
        diff --git a/public/assets/js/extensions/angular/bootstrap-table-angular.js b/public/js/extensions/angular/bootstrap-table-angular.js
        similarity index 100%
        rename from public/assets/js/extensions/angular/bootstrap-table-angular.js
        rename to public/js/extensions/angular/bootstrap-table-angular.js
        diff --git a/public/assets/js/extensions/angular/bootstrap-table-angular.min.js b/public/js/extensions/angular/bootstrap-table-angular.min.js
        similarity index 100%
        rename from public/assets/js/extensions/angular/bootstrap-table-angular.min.js
        rename to public/js/extensions/angular/bootstrap-table-angular.min.js
        diff --git a/public/assets/js/extensions/cookie/bootstrap-table-cookie.js b/public/js/extensions/cookie/bootstrap-table-cookie.js
        similarity index 100%
        rename from public/assets/js/extensions/cookie/bootstrap-table-cookie.js
        rename to public/js/extensions/cookie/bootstrap-table-cookie.js
        diff --git a/public/assets/js/extensions/cookie/bootstrap-table-cookie.min.js b/public/js/extensions/cookie/bootstrap-table-cookie.min.js
        similarity index 100%
        rename from public/assets/js/extensions/cookie/bootstrap-table-cookie.min.js
        rename to public/js/extensions/cookie/bootstrap-table-cookie.min.js
        diff --git a/public/assets/js/extensions/editable/bootstrap-table-editable.js b/public/js/extensions/editable/bootstrap-table-editable.js
        similarity index 100%
        rename from public/assets/js/extensions/editable/bootstrap-table-editable.js
        rename to public/js/extensions/editable/bootstrap-table-editable.js
        diff --git a/public/assets/js/extensions/editable/bootstrap-table-editable.min.js b/public/js/extensions/editable/bootstrap-table-editable.min.js
        similarity index 100%
        rename from public/assets/js/extensions/editable/bootstrap-table-editable.min.js
        rename to public/js/extensions/editable/bootstrap-table-editable.min.js
        diff --git a/public/assets/js/extensions/export/bootstrap-table-export.js b/public/js/extensions/export/bootstrap-table-export.js
        similarity index 85%
        rename from public/assets/js/extensions/export/bootstrap-table-export.js
        rename to public/js/extensions/export/bootstrap-table-export.js
        index b260922cd4..ef775c692c 100755
        Binary files a/public/assets/js/extensions/export/bootstrap-table-export.js and b/public/js/extensions/export/bootstrap-table-export.js differ
        diff --git a/public/assets/js/extensions/export/bootstrap-table-export.min.js b/public/js/extensions/export/bootstrap-table-export.min.js
        similarity index 100%
        rename from public/assets/js/extensions/export/bootstrap-table-export.min.js
        rename to public/js/extensions/export/bootstrap-table-export.min.js
        diff --git a/public/assets/js/extensions/export/jquery.base64.js b/public/js/extensions/export/jquery.base64.js
        similarity index 100%
        rename from public/assets/js/extensions/export/jquery.base64.js
        rename to public/js/extensions/export/jquery.base64.js
        diff --git a/public/assets/js/extensions/export/tableExport.js b/public/js/extensions/export/tableExport.js
        similarity index 100%
        rename from public/assets/js/extensions/export/tableExport.js
        rename to public/js/extensions/export/tableExport.js
        diff --git a/public/assets/js/extensions/filter-control/bootstrap-table-filter-control.js b/public/js/extensions/filter-control/bootstrap-table-filter-control.js
        similarity index 100%
        rename from public/assets/js/extensions/filter-control/bootstrap-table-filter-control.js
        rename to public/js/extensions/filter-control/bootstrap-table-filter-control.js
        diff --git a/public/assets/js/extensions/filter-control/bootstrap-table-filter-control.min.js b/public/js/extensions/filter-control/bootstrap-table-filter-control.min.js
        similarity index 100%
        rename from public/assets/js/extensions/filter-control/bootstrap-table-filter-control.min.js
        rename to public/js/extensions/filter-control/bootstrap-table-filter-control.min.js
        diff --git a/public/js/extensions/filter/bootstrap-table-filter.js b/public/js/extensions/filter/bootstrap-table-filter.js
        new file mode 100755
        index 0000000000..14af13da06
        Binary files /dev/null and b/public/js/extensions/filter/bootstrap-table-filter.js differ
        diff --git a/public/assets/js/extensions/filter/bootstrap-table-filter.min.js b/public/js/extensions/filter/bootstrap-table-filter.min.js
        similarity index 100%
        rename from public/assets/js/extensions/filter/bootstrap-table-filter.min.js
        rename to public/js/extensions/filter/bootstrap-table-filter.min.js
        diff --git a/public/js/extensions/flat-json/bootstrap-table-flat-json.js b/public/js/extensions/flat-json/bootstrap-table-flat-json.js
        new file mode 100755
        index 0000000000..4bbf3a2a9e
        Binary files /dev/null and b/public/js/extensions/flat-json/bootstrap-table-flat-json.js differ
        diff --git a/public/assets/js/extensions/flat-json/bootstrap-table-flat-json.min.js b/public/js/extensions/flat-json/bootstrap-table-flat-json.min.js
        similarity index 100%
        rename from public/assets/js/extensions/flat-json/bootstrap-table-flat-json.min.js
        rename to public/js/extensions/flat-json/bootstrap-table-flat-json.min.js
        diff --git a/public/js/extensions/group-by-v2/bootstrap-table-group-by.css b/public/js/extensions/group-by-v2/bootstrap-table-group-by.css
        new file mode 100755
        index 0000000000..80b1161b76
        Binary files /dev/null and b/public/js/extensions/group-by-v2/bootstrap-table-group-by.css differ
        diff --git a/public/js/extensions/group-by-v2/bootstrap-table-group-by.js b/public/js/extensions/group-by-v2/bootstrap-table-group-by.js
        new file mode 100755
        index 0000000000..f9a1092d48
        Binary files /dev/null and b/public/js/extensions/group-by-v2/bootstrap-table-group-by.js differ
        diff --git a/public/assets/js/extensions/group-by-v2/bootstrap-table-group-by.min.js b/public/js/extensions/group-by-v2/bootstrap-table-group-by.min.js
        similarity index 100%
        rename from public/assets/js/extensions/group-by-v2/bootstrap-table-group-by.min.js
        rename to public/js/extensions/group-by-v2/bootstrap-table-group-by.min.js
        diff --git a/public/js/extensions/group-by/bootstrap-table-group-by.css b/public/js/extensions/group-by/bootstrap-table-group-by.css
        new file mode 100755
        index 0000000000..fce5a9a7b1
        Binary files /dev/null and b/public/js/extensions/group-by/bootstrap-table-group-by.css differ
        diff --git a/public/assets/js/extensions/group-by/bootstrap-table-group-by.js b/public/js/extensions/group-by/bootstrap-table-group-by.js
        similarity index 100%
        rename from public/assets/js/extensions/group-by/bootstrap-table-group-by.js
        rename to public/js/extensions/group-by/bootstrap-table-group-by.js
        diff --git a/public/assets/js/extensions/group-by/bootstrap-table-group-by.min.js b/public/js/extensions/group-by/bootstrap-table-group-by.min.js
        similarity index 100%
        rename from public/assets/js/extensions/group-by/bootstrap-table-group-by.min.js
        rename to public/js/extensions/group-by/bootstrap-table-group-by.min.js
        diff --git a/public/assets/js/extensions/key-events/bootstrap-table-key-events.js b/public/js/extensions/key-events/bootstrap-table-key-events.js
        similarity index 100%
        rename from public/assets/js/extensions/key-events/bootstrap-table-key-events.js
        rename to public/js/extensions/key-events/bootstrap-table-key-events.js
        diff --git a/public/assets/js/extensions/key-events/bootstrap-table-key-events.min.js b/public/js/extensions/key-events/bootstrap-table-key-events.min.js
        similarity index 100%
        rename from public/assets/js/extensions/key-events/bootstrap-table-key-events.min.js
        rename to public/js/extensions/key-events/bootstrap-table-key-events.min.js
        diff --git a/public/assets/js/extensions/mobile/bootstrap-table-mobile.js b/public/js/extensions/mobile/bootstrap-table-mobile.js
        similarity index 100%
        rename from public/assets/js/extensions/mobile/bootstrap-table-mobile.js
        rename to public/js/extensions/mobile/bootstrap-table-mobile.js
        diff --git a/public/assets/js/extensions/mobile/bootstrap-table-mobile.min.js b/public/js/extensions/mobile/bootstrap-table-mobile.min.js
        similarity index 100%
        rename from public/assets/js/extensions/mobile/bootstrap-table-mobile.min.js
        rename to public/js/extensions/mobile/bootstrap-table-mobile.min.js
        diff --git a/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.js b/public/js/extensions/multiple-search/bootstrap-table-multiple-search.js
        similarity index 100%
        rename from public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.js
        rename to public/js/extensions/multiple-search/bootstrap-table-multiple-search.js
        diff --git a/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.min.js b/public/js/extensions/multiple-search/bootstrap-table-multiple-search.min.js
        similarity index 100%
        rename from public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.min.js
        rename to public/js/extensions/multiple-search/bootstrap-table-multiple-search.min.js
        diff --git a/public/assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.js b/public/js/extensions/multiple-sort/bootstrap-table-multiple-sort.js
        similarity index 100%
        rename from public/assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.js
        rename to public/js/extensions/multiple-sort/bootstrap-table-multiple-sort.js
        diff --git a/public/assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.min.js b/public/js/extensions/multiple-sort/bootstrap-table-multiple-sort.min.js
        similarity index 100%
        rename from public/assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.min.js
        rename to public/js/extensions/multiple-sort/bootstrap-table-multiple-sort.min.js
        diff --git a/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.js b/public/js/extensions/natural-sorting/bootstrap-table-natural-sorting.js
        similarity index 100%
        rename from public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.js
        rename to public/js/extensions/natural-sorting/bootstrap-table-natural-sorting.js
        diff --git a/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.min.js b/public/js/extensions/natural-sorting/bootstrap-table-natural-sorting.min.js
        similarity index 100%
        rename from public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.min.js
        rename to public/js/extensions/natural-sorting/bootstrap-table-natural-sorting.min.js
        diff --git a/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.js b/public/js/extensions/reorder-columns/bootstrap-table-reorder-columns.js
        similarity index 100%
        rename from public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.js
        rename to public/js/extensions/reorder-columns/bootstrap-table-reorder-columns.js
        diff --git a/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js b/public/js/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js
        similarity index 100%
        rename from public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js
        rename to public/js/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js
        diff --git a/public/js/extensions/reorder-rows/bootstrap-table-reorder-rows.css b/public/js/extensions/reorder-rows/bootstrap-table-reorder-rows.css
        new file mode 100755
        index 0000000000..412ff145e3
        Binary files /dev/null and b/public/js/extensions/reorder-rows/bootstrap-table-reorder-rows.css differ
        diff --git a/public/assets/js/extensions/reorder-rows/bootstrap-table-reorder-rows.js b/public/js/extensions/reorder-rows/bootstrap-table-reorder-rows.js
        similarity index 100%
        rename from public/assets/js/extensions/reorder-rows/bootstrap-table-reorder-rows.js
        rename to public/js/extensions/reorder-rows/bootstrap-table-reorder-rows.js
        diff --git a/public/assets/js/extensions/reorder-rows/bootstrap-table-reorder-rows.min.js b/public/js/extensions/reorder-rows/bootstrap-table-reorder-rows.min.js
        similarity index 100%
        rename from public/assets/js/extensions/reorder-rows/bootstrap-table-reorder-rows.min.js
        rename to public/js/extensions/reorder-rows/bootstrap-table-reorder-rows.min.js
        diff --git a/public/js/extensions/resizable/bootstrap-table-resizable.js b/public/js/extensions/resizable/bootstrap-table-resizable.js
        new file mode 100755
        index 0000000000..8be7b09641
        Binary files /dev/null and b/public/js/extensions/resizable/bootstrap-table-resizable.js differ
        diff --git a/public/assets/js/extensions/resizable/bootstrap-table-resizable.min.js b/public/js/extensions/resizable/bootstrap-table-resizable.min.js
        similarity index 100%
        rename from public/assets/js/extensions/resizable/bootstrap-table-resizable.min.js
        rename to public/js/extensions/resizable/bootstrap-table-resizable.min.js
        diff --git a/public/js/extensions/sticky-header/bootstrap-table-sticky-header.css b/public/js/extensions/sticky-header/bootstrap-table-sticky-header.css
        new file mode 100755
        index 0000000000..d0ea09cbf2
        Binary files /dev/null and b/public/js/extensions/sticky-header/bootstrap-table-sticky-header.css differ
        diff --git a/public/assets/js/extensions/sticky-header/bootstrap-table-sticky-header.js b/public/js/extensions/sticky-header/bootstrap-table-sticky-header.js
        similarity index 100%
        rename from public/assets/js/extensions/sticky-header/bootstrap-table-sticky-header.js
        rename to public/js/extensions/sticky-header/bootstrap-table-sticky-header.js
        diff --git a/public/assets/js/extensions/sticky-header/bootstrap-table-sticky-header.min.js b/public/js/extensions/sticky-header/bootstrap-table-sticky-header.min.js
        similarity index 100%
        rename from public/assets/js/extensions/sticky-header/bootstrap-table-sticky-header.min.js
        rename to public/js/extensions/sticky-header/bootstrap-table-sticky-header.min.js
        diff --git a/public/js/extensions/toolbar/bootstrap-table-toolbar.js b/public/js/extensions/toolbar/bootstrap-table-toolbar.js
        new file mode 100755
        index 0000000000..fd4e585933
        Binary files /dev/null and b/public/js/extensions/toolbar/bootstrap-table-toolbar.js differ
        diff --git a/public/assets/js/extensions/toolbar/bootstrap-table-toolbar.min.js b/public/js/extensions/toolbar/bootstrap-table-toolbar.min.js
        similarity index 100%
        rename from public/assets/js/extensions/toolbar/bootstrap-table-toolbar.min.js
        rename to public/js/extensions/toolbar/bootstrap-table-toolbar.min.js
        diff --git a/public/assets/js/html5.js b/public/js/html5.js
        similarity index 100%
        rename from public/assets/js/html5.js
        rename to public/js/html5.js
        diff --git a/public/assets/js/html5shiv.js b/public/js/html5shiv.js
        similarity index 100%
        rename from public/assets/js/html5shiv.js
        rename to public/js/html5shiv.js
        diff --git a/public/js/jquery.dragtable.js b/public/js/jquery.dragtable.js
        new file mode 100644
        index 0000000000..f42265dfda
        Binary files /dev/null and b/public/js/jquery.dragtable.js differ
        diff --git a/public/assets/js/jquery.fileupload.js b/public/js/jquery.fileupload.js
        similarity index 100%
        rename from public/assets/js/jquery.fileupload.js
        rename to public/js/jquery.fileupload.js
        diff --git a/public/assets/js/jquery.iframe-transport.js b/public/js/jquery.iframe-transport.js
        similarity index 100%
        rename from public/assets/js/jquery.iframe-transport.js
        rename to public/js/jquery.iframe-transport.js
        diff --git a/public/assets/js/jquery.js b/public/js/jquery.js
        similarity index 100%
        rename from public/assets/js/jquery.js
        rename to public/js/jquery.js
        diff --git a/public/assets/js/jquery.typeahead.min.js b/public/js/jquery.typeahead.min.js
        similarity index 100%
        rename from public/assets/js/jquery.typeahead.min.js
        rename to public/js/jquery.typeahead.min.js
        diff --git a/public/assets/js/jquery.ui.widget.js b/public/js/jquery.ui.widget.js
        similarity index 100%
        rename from public/assets/js/jquery.ui.widget.js
        rename to public/js/jquery.ui.widget.js
        diff --git a/public/js/jspdf.min.js b/public/js/jspdf.min.js
        new file mode 100644
        index 0000000000..4ba3b3c17e
        Binary files /dev/null and b/public/js/jspdf.min.js differ
        diff --git a/public/js/jspdf.plugin.autotable.js b/public/js/jspdf.plugin.autotable.js
        new file mode 100644
        index 0000000000..c71922e1ef
        Binary files /dev/null and b/public/js/jspdf.plugin.autotable.js differ
        diff --git a/public/js/locale/bootstrap-table-af-ZA.js b/public/js/locale/bootstrap-table-af-ZA.js
        new file mode 100755
        index 0000000000..1c7ff8891c
        Binary files /dev/null and b/public/js/locale/bootstrap-table-af-ZA.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-af-ZA.min.js b/public/js/locale/bootstrap-table-af-ZA.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-af-ZA.min.js
        rename to public/js/locale/bootstrap-table-af-ZA.min.js
        diff --git a/public/js/locale/bootstrap-table-ar-SA.js b/public/js/locale/bootstrap-table-ar-SA.js
        new file mode 100755
        index 0000000000..c36223633c
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ar-SA.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ar-SA.min.js b/public/js/locale/bootstrap-table-ar-SA.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ar-SA.min.js
        rename to public/js/locale/bootstrap-table-ar-SA.min.js
        diff --git a/public/js/locale/bootstrap-table-ca-ES.js b/public/js/locale/bootstrap-table-ca-ES.js
        new file mode 100755
        index 0000000000..2c992965e7
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ca-ES.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ca-ES.min.js b/public/js/locale/bootstrap-table-ca-ES.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ca-ES.min.js
        rename to public/js/locale/bootstrap-table-ca-ES.min.js
        diff --git a/public/js/locale/bootstrap-table-cs-CZ.js b/public/js/locale/bootstrap-table-cs-CZ.js
        new file mode 100755
        index 0000000000..d8c71307eb
        Binary files /dev/null and b/public/js/locale/bootstrap-table-cs-CZ.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-cs-CZ.min.js b/public/js/locale/bootstrap-table-cs-CZ.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-cs-CZ.min.js
        rename to public/js/locale/bootstrap-table-cs-CZ.min.js
        diff --git a/public/js/locale/bootstrap-table-da-DK.js b/public/js/locale/bootstrap-table-da-DK.js
        new file mode 100755
        index 0000000000..de38a17206
        Binary files /dev/null and b/public/js/locale/bootstrap-table-da-DK.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-da-DK.min.js b/public/js/locale/bootstrap-table-da-DK.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-da-DK.min.js
        rename to public/js/locale/bootstrap-table-da-DK.min.js
        diff --git a/public/js/locale/bootstrap-table-de-DE.js b/public/js/locale/bootstrap-table-de-DE.js
        new file mode 100755
        index 0000000000..efa48319f4
        Binary files /dev/null and b/public/js/locale/bootstrap-table-de-DE.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-de-DE.min.js b/public/js/locale/bootstrap-table-de-DE.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-de-DE.min.js
        rename to public/js/locale/bootstrap-table-de-DE.min.js
        diff --git a/public/js/locale/bootstrap-table-el-GR.js b/public/js/locale/bootstrap-table-el-GR.js
        new file mode 100755
        index 0000000000..dd74491090
        Binary files /dev/null and b/public/js/locale/bootstrap-table-el-GR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-el-GR.min.js b/public/js/locale/bootstrap-table-el-GR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-el-GR.min.js
        rename to public/js/locale/bootstrap-table-el-GR.min.js
        diff --git a/public/assets/js/locale/bootstrap-table-en-US.js b/public/js/locale/bootstrap-table-en-US.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-en-US.js
        rename to public/js/locale/bootstrap-table-en-US.js
        diff --git a/public/assets/js/locale/bootstrap-table-en-US.min.js b/public/js/locale/bootstrap-table-en-US.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-en-US.min.js
        rename to public/js/locale/bootstrap-table-en-US.min.js
        diff --git a/public/js/locale/bootstrap-table-es-AR.js b/public/js/locale/bootstrap-table-es-AR.js
        new file mode 100755
        index 0000000000..6f585f728f
        Binary files /dev/null and b/public/js/locale/bootstrap-table-es-AR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-es-AR.min.js b/public/js/locale/bootstrap-table-es-AR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-es-AR.min.js
        rename to public/js/locale/bootstrap-table-es-AR.min.js
        diff --git a/public/js/locale/bootstrap-table-es-CR.js b/public/js/locale/bootstrap-table-es-CR.js
        new file mode 100755
        index 0000000000..7febab73cd
        Binary files /dev/null and b/public/js/locale/bootstrap-table-es-CR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-es-CR.min.js b/public/js/locale/bootstrap-table-es-CR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-es-CR.min.js
        rename to public/js/locale/bootstrap-table-es-CR.min.js
        diff --git a/public/js/locale/bootstrap-table-es-ES.js b/public/js/locale/bootstrap-table-es-ES.js
        new file mode 100755
        index 0000000000..30448d7d80
        Binary files /dev/null and b/public/js/locale/bootstrap-table-es-ES.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-es-ES.min.js b/public/js/locale/bootstrap-table-es-ES.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-es-ES.min.js
        rename to public/js/locale/bootstrap-table-es-ES.min.js
        diff --git a/public/js/locale/bootstrap-table-es-MX.js b/public/js/locale/bootstrap-table-es-MX.js
        new file mode 100755
        index 0000000000..f745fae2e6
        Binary files /dev/null and b/public/js/locale/bootstrap-table-es-MX.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-es-MX.min.js b/public/js/locale/bootstrap-table-es-MX.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-es-MX.min.js
        rename to public/js/locale/bootstrap-table-es-MX.min.js
        diff --git a/public/js/locale/bootstrap-table-es-NI.js b/public/js/locale/bootstrap-table-es-NI.js
        new file mode 100755
        index 0000000000..2e8aa2ab9f
        Binary files /dev/null and b/public/js/locale/bootstrap-table-es-NI.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-es-NI.min.js b/public/js/locale/bootstrap-table-es-NI.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-es-NI.min.js
        rename to public/js/locale/bootstrap-table-es-NI.min.js
        diff --git a/public/js/locale/bootstrap-table-es-SP.js b/public/js/locale/bootstrap-table-es-SP.js
        new file mode 100755
        index 0000000000..7da9350da8
        Binary files /dev/null and b/public/js/locale/bootstrap-table-es-SP.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-es-SP.min.js b/public/js/locale/bootstrap-table-es-SP.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-es-SP.min.js
        rename to public/js/locale/bootstrap-table-es-SP.min.js
        diff --git a/public/js/locale/bootstrap-table-et-EE.js b/public/js/locale/bootstrap-table-et-EE.js
        new file mode 100755
        index 0000000000..3d71d10285
        Binary files /dev/null and b/public/js/locale/bootstrap-table-et-EE.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-et-EE.min.js b/public/js/locale/bootstrap-table-et-EE.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-et-EE.min.js
        rename to public/js/locale/bootstrap-table-et-EE.min.js
        diff --git a/public/js/locale/bootstrap-table-fa-IR.js b/public/js/locale/bootstrap-table-fa-IR.js
        new file mode 100755
        index 0000000000..4cdee6e5aa
        Binary files /dev/null and b/public/js/locale/bootstrap-table-fa-IR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-fa-IR.min.js b/public/js/locale/bootstrap-table-fa-IR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-fa-IR.min.js
        rename to public/js/locale/bootstrap-table-fa-IR.min.js
        diff --git a/public/js/locale/bootstrap-table-fr-BE.js b/public/js/locale/bootstrap-table-fr-BE.js
        new file mode 100755
        index 0000000000..e4b7cf18e6
        Binary files /dev/null and b/public/js/locale/bootstrap-table-fr-BE.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-fr-BE.min.js b/public/js/locale/bootstrap-table-fr-BE.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-fr-BE.min.js
        rename to public/js/locale/bootstrap-table-fr-BE.min.js
        diff --git a/public/js/locale/bootstrap-table-fr-FR.js b/public/js/locale/bootstrap-table-fr-FR.js
        new file mode 100755
        index 0000000000..802eaf643e
        Binary files /dev/null and b/public/js/locale/bootstrap-table-fr-FR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-fr-FR.min.js b/public/js/locale/bootstrap-table-fr-FR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-fr-FR.min.js
        rename to public/js/locale/bootstrap-table-fr-FR.min.js
        diff --git a/public/js/locale/bootstrap-table-he-IL.js b/public/js/locale/bootstrap-table-he-IL.js
        new file mode 100755
        index 0000000000..6a4a1790d5
        Binary files /dev/null and b/public/js/locale/bootstrap-table-he-IL.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-he-IL.min.js b/public/js/locale/bootstrap-table-he-IL.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-he-IL.min.js
        rename to public/js/locale/bootstrap-table-he-IL.min.js
        diff --git a/public/js/locale/bootstrap-table-hr-HR.js b/public/js/locale/bootstrap-table-hr-HR.js
        new file mode 100755
        index 0000000000..f63a4fe5f4
        Binary files /dev/null and b/public/js/locale/bootstrap-table-hr-HR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-hr-HR.min.js b/public/js/locale/bootstrap-table-hr-HR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-hr-HR.min.js
        rename to public/js/locale/bootstrap-table-hr-HR.min.js
        diff --git a/public/js/locale/bootstrap-table-hu-HU.js b/public/js/locale/bootstrap-table-hu-HU.js
        new file mode 100755
        index 0000000000..353f098359
        Binary files /dev/null and b/public/js/locale/bootstrap-table-hu-HU.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-hu-HU.min.js b/public/js/locale/bootstrap-table-hu-HU.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-hu-HU.min.js
        rename to public/js/locale/bootstrap-table-hu-HU.min.js
        diff --git a/public/assets/js/locale/bootstrap-table-it-IT.js b/public/js/locale/bootstrap-table-it-IT.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-it-IT.js
        rename to public/js/locale/bootstrap-table-it-IT.js
        diff --git a/public/assets/js/locale/bootstrap-table-it-IT.min.js b/public/js/locale/bootstrap-table-it-IT.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-it-IT.min.js
        rename to public/js/locale/bootstrap-table-it-IT.min.js
        diff --git a/public/js/locale/bootstrap-table-ja-JP.js b/public/js/locale/bootstrap-table-ja-JP.js
        new file mode 100755
        index 0000000000..3a0f3eca8f
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ja-JP.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ja-JP.min.js b/public/js/locale/bootstrap-table-ja-JP.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ja-JP.min.js
        rename to public/js/locale/bootstrap-table-ja-JP.min.js
        diff --git a/public/js/locale/bootstrap-table-ka-GE.js b/public/js/locale/bootstrap-table-ka-GE.js
        new file mode 100755
        index 0000000000..05da1421dd
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ka-GE.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ka-GE.min.js b/public/js/locale/bootstrap-table-ka-GE.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ka-GE.min.js
        rename to public/js/locale/bootstrap-table-ka-GE.min.js
        diff --git a/public/js/locale/bootstrap-table-ko-KR.js b/public/js/locale/bootstrap-table-ko-KR.js
        new file mode 100755
        index 0000000000..c8cf703f4e
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ko-KR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ko-KR.min.js b/public/js/locale/bootstrap-table-ko-KR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ko-KR.min.js
        rename to public/js/locale/bootstrap-table-ko-KR.min.js
        diff --git a/public/js/locale/bootstrap-table-ms-MY.js b/public/js/locale/bootstrap-table-ms-MY.js
        new file mode 100755
        index 0000000000..edb5eb61c9
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ms-MY.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ms-MY.min.js b/public/js/locale/bootstrap-table-ms-MY.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ms-MY.min.js
        rename to public/js/locale/bootstrap-table-ms-MY.min.js
        diff --git a/public/js/locale/bootstrap-table-nb-NO.js b/public/js/locale/bootstrap-table-nb-NO.js
        new file mode 100755
        index 0000000000..473051d257
        Binary files /dev/null and b/public/js/locale/bootstrap-table-nb-NO.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-nb-NO.min.js b/public/js/locale/bootstrap-table-nb-NO.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-nb-NO.min.js
        rename to public/js/locale/bootstrap-table-nb-NO.min.js
        diff --git a/public/assets/js/locale/bootstrap-table-nl-NL.js b/public/js/locale/bootstrap-table-nl-NL.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-nl-NL.js
        rename to public/js/locale/bootstrap-table-nl-NL.js
        diff --git a/public/assets/js/locale/bootstrap-table-nl-NL.min.js b/public/js/locale/bootstrap-table-nl-NL.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-nl-NL.min.js
        rename to public/js/locale/bootstrap-table-nl-NL.min.js
        diff --git a/public/js/locale/bootstrap-table-pl-PL.js b/public/js/locale/bootstrap-table-pl-PL.js
        new file mode 100755
        index 0000000000..af79be26dd
        Binary files /dev/null and b/public/js/locale/bootstrap-table-pl-PL.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-pl-PL.min.js b/public/js/locale/bootstrap-table-pl-PL.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-pl-PL.min.js
        rename to public/js/locale/bootstrap-table-pl-PL.min.js
        diff --git a/public/js/locale/bootstrap-table-pt-BR.js b/public/js/locale/bootstrap-table-pt-BR.js
        new file mode 100755
        index 0000000000..63319a1111
        Binary files /dev/null and b/public/js/locale/bootstrap-table-pt-BR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-pt-BR.min.js b/public/js/locale/bootstrap-table-pt-BR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-pt-BR.min.js
        rename to public/js/locale/bootstrap-table-pt-BR.min.js
        diff --git a/public/assets/js/locale/bootstrap-table-pt-PT.js b/public/js/locale/bootstrap-table-pt-PT.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-pt-PT.js
        rename to public/js/locale/bootstrap-table-pt-PT.js
        diff --git a/public/assets/js/locale/bootstrap-table-pt-PT.min.js b/public/js/locale/bootstrap-table-pt-PT.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-pt-PT.min.js
        rename to public/js/locale/bootstrap-table-pt-PT.min.js
        diff --git a/public/js/locale/bootstrap-table-ro-RO.js b/public/js/locale/bootstrap-table-ro-RO.js
        new file mode 100755
        index 0000000000..64cd1a7cb9
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ro-RO.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ro-RO.min.js b/public/js/locale/bootstrap-table-ro-RO.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ro-RO.min.js
        rename to public/js/locale/bootstrap-table-ro-RO.min.js
        diff --git a/public/js/locale/bootstrap-table-ru-RU.js b/public/js/locale/bootstrap-table-ru-RU.js
        new file mode 100755
        index 0000000000..49d6ee271d
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ru-RU.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ru-RU.min.js b/public/js/locale/bootstrap-table-ru-RU.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ru-RU.min.js
        rename to public/js/locale/bootstrap-table-ru-RU.min.js
        diff --git a/public/js/locale/bootstrap-table-sk-SK.js b/public/js/locale/bootstrap-table-sk-SK.js
        new file mode 100755
        index 0000000000..1762762f1f
        Binary files /dev/null and b/public/js/locale/bootstrap-table-sk-SK.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-sk-SK.min.js b/public/js/locale/bootstrap-table-sk-SK.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-sk-SK.min.js
        rename to public/js/locale/bootstrap-table-sk-SK.min.js
        diff --git a/public/js/locale/bootstrap-table-sv-SE.js b/public/js/locale/bootstrap-table-sv-SE.js
        new file mode 100755
        index 0000000000..67b8eb4f6a
        Binary files /dev/null and b/public/js/locale/bootstrap-table-sv-SE.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-sv-SE.min.js b/public/js/locale/bootstrap-table-sv-SE.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-sv-SE.min.js
        rename to public/js/locale/bootstrap-table-sv-SE.min.js
        diff --git a/public/js/locale/bootstrap-table-th-TH.js b/public/js/locale/bootstrap-table-th-TH.js
        new file mode 100755
        index 0000000000..938216888a
        Binary files /dev/null and b/public/js/locale/bootstrap-table-th-TH.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-th-TH.min.js b/public/js/locale/bootstrap-table-th-TH.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-th-TH.min.js
        rename to public/js/locale/bootstrap-table-th-TH.min.js
        diff --git a/public/js/locale/bootstrap-table-tr-TR.js b/public/js/locale/bootstrap-table-tr-TR.js
        new file mode 100755
        index 0000000000..df38a7900a
        Binary files /dev/null and b/public/js/locale/bootstrap-table-tr-TR.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-tr-TR.min.js b/public/js/locale/bootstrap-table-tr-TR.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-tr-TR.min.js
        rename to public/js/locale/bootstrap-table-tr-TR.min.js
        diff --git a/public/assets/js/locale/bootstrap-table-uk-UA.js b/public/js/locale/bootstrap-table-uk-UA.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-uk-UA.js
        rename to public/js/locale/bootstrap-table-uk-UA.js
        diff --git a/public/assets/js/locale/bootstrap-table-uk-UA.min.js b/public/js/locale/bootstrap-table-uk-UA.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-uk-UA.min.js
        rename to public/js/locale/bootstrap-table-uk-UA.min.js
        diff --git a/public/js/locale/bootstrap-table-ur-PK.js b/public/js/locale/bootstrap-table-ur-PK.js
        new file mode 100755
        index 0000000000..466498cf7c
        Binary files /dev/null and b/public/js/locale/bootstrap-table-ur-PK.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-ur-PK.min.js b/public/js/locale/bootstrap-table-ur-PK.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-ur-PK.min.js
        rename to public/js/locale/bootstrap-table-ur-PK.min.js
        diff --git a/public/js/locale/bootstrap-table-vi-VN.js b/public/js/locale/bootstrap-table-vi-VN.js
        new file mode 100755
        index 0000000000..42c81038b3
        Binary files /dev/null and b/public/js/locale/bootstrap-table-vi-VN.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-vi-VN.min.js b/public/js/locale/bootstrap-table-vi-VN.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-vi-VN.min.js
        rename to public/js/locale/bootstrap-table-vi-VN.min.js
        diff --git a/public/assets/js/locale/bootstrap-table-zh-CN.js b/public/js/locale/bootstrap-table-zh-CN.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-zh-CN.js
        rename to public/js/locale/bootstrap-table-zh-CN.js
        diff --git a/public/assets/js/locale/bootstrap-table-zh-CN.min.js b/public/js/locale/bootstrap-table-zh-CN.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-zh-CN.min.js
        rename to public/js/locale/bootstrap-table-zh-CN.min.js
        diff --git a/public/js/locale/bootstrap-table-zh-TW.js b/public/js/locale/bootstrap-table-zh-TW.js
        new file mode 100755
        index 0000000000..ff3484f643
        Binary files /dev/null and b/public/js/locale/bootstrap-table-zh-TW.js differ
        diff --git a/public/assets/js/locale/bootstrap-table-zh-TW.min.js b/public/js/locale/bootstrap-table-zh-TW.min.js
        similarity index 100%
        rename from public/assets/js/locale/bootstrap-table-zh-TW.min.js
        rename to public/js/locale/bootstrap-table-zh-TW.min.js
        diff --git a/public/assets/js/metisMenu.js b/public/js/metisMenu.js
        similarity index 100%
        rename from public/assets/js/metisMenu.js
        rename to public/js/metisMenu.js
        diff --git a/public/assets/js/metisMenu.min.js b/public/js/metisMenu.min.js
        similarity index 100%
        rename from public/assets/js/metisMenu.min.js
        rename to public/js/metisMenu.min.js
        diff --git a/public/assets/js/pGenerator.jquery.js b/public/js/pGenerator.jquery.js
        similarity index 100%
        rename from public/assets/js/pGenerator.jquery.js
        rename to public/js/pGenerator.jquery.js
        diff --git a/public/assets/js/plugins/bootstrap-slider/bootstrap-slider.js b/public/js/plugins/bootstrap-slider/bootstrap-slider.js
        similarity index 100%
        rename from public/assets/js/plugins/bootstrap-slider/bootstrap-slider.js
        rename to public/js/plugins/bootstrap-slider/bootstrap-slider.js
        diff --git a/public/assets/js/plugins/bootstrap-slider/slider.css b/public/js/plugins/bootstrap-slider/slider.css
        similarity index 100%
        rename from public/assets/js/plugins/bootstrap-slider/slider.css
        rename to public/js/plugins/bootstrap-slider/slider.css
        diff --git a/public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js
        similarity index 100%
        rename from public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js
        rename to public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js
        diff --git a/public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js
        similarity index 100%
        rename from public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js
        rename to public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js
        diff --git a/public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.css b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.css
        similarity index 100%
        rename from public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.css
        rename to public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.css
        diff --git a/public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css
        similarity index 100%
        rename from public/assets/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css
        rename to public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css
        diff --git a/public/assets/js/plugins/chartjs/Chart.bundle.js b/public/js/plugins/chartjs/Chart.bundle.js
        similarity index 100%
        rename from public/assets/js/plugins/chartjs/Chart.bundle.js
        rename to public/js/plugins/chartjs/Chart.bundle.js
        diff --git a/public/assets/js/plugins/chartjs/Chart.bundle.min.js b/public/js/plugins/chartjs/Chart.bundle.min.js
        similarity index 100%
        rename from public/assets/js/plugins/chartjs/Chart.bundle.min.js
        rename to public/js/plugins/chartjs/Chart.bundle.min.js
        diff --git a/public/assets/js/plugins/chartjs/Chart.js b/public/js/plugins/chartjs/Chart.js
        similarity index 100%
        rename from public/assets/js/plugins/chartjs/Chart.js
        rename to public/js/plugins/chartjs/Chart.js
        diff --git a/public/assets/js/plugins/chartjs/Chart.min.js b/public/js/plugins/chartjs/Chart.min.js
        similarity index 100%
        rename from public/assets/js/plugins/chartjs/Chart.min.js
        rename to public/js/plugins/chartjs/Chart.min.js
        diff --git a/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.css b/public/js/plugins/colorpicker/bootstrap-colorpicker.css
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/bootstrap-colorpicker.css
        rename to public/js/plugins/colorpicker/bootstrap-colorpicker.css
        diff --git a/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.js b/public/js/plugins/colorpicker/bootstrap-colorpicker.js
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/bootstrap-colorpicker.js
        rename to public/js/plugins/colorpicker/bootstrap-colorpicker.js
        diff --git a/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.min.css b/public/js/plugins/colorpicker/bootstrap-colorpicker.min.css
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/bootstrap-colorpicker.min.css
        rename to public/js/plugins/colorpicker/bootstrap-colorpicker.min.css
        diff --git a/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.min.js b/public/js/plugins/colorpicker/bootstrap-colorpicker.min.js
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/bootstrap-colorpicker.min.js
        rename to public/js/plugins/colorpicker/bootstrap-colorpicker.min.js
        diff --git a/public/assets/js/plugins/colorpicker/img/alpha-horizontal.png b/public/js/plugins/colorpicker/img/alpha-horizontal.png
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/img/alpha-horizontal.png
        rename to public/js/plugins/colorpicker/img/alpha-horizontal.png
        diff --git a/public/assets/js/plugins/colorpicker/img/alpha.png b/public/js/plugins/colorpicker/img/alpha.png
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/img/alpha.png
        rename to public/js/plugins/colorpicker/img/alpha.png
        diff --git a/public/assets/js/plugins/colorpicker/img/hue-horizontal.png b/public/js/plugins/colorpicker/img/hue-horizontal.png
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/img/hue-horizontal.png
        rename to public/js/plugins/colorpicker/img/hue-horizontal.png
        diff --git a/public/assets/js/plugins/colorpicker/img/hue.png b/public/js/plugins/colorpicker/img/hue.png
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/img/hue.png
        rename to public/js/plugins/colorpicker/img/hue.png
        diff --git a/public/assets/js/plugins/colorpicker/img/saturation.png b/public/js/plugins/colorpicker/img/saturation.png
        similarity index 100%
        rename from public/assets/js/plugins/colorpicker/img/saturation.png
        rename to public/js/plugins/colorpicker/img/saturation.png
        diff --git a/public/assets/js/plugins/datepicker/bootstrap-datepicker.css b/public/js/plugins/datepicker/bootstrap-datepicker.css
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/bootstrap-datepicker.css
        rename to public/js/plugins/datepicker/bootstrap-datepicker.css
        diff --git a/public/assets/js/plugins/datepicker/bootstrap-datepicker.js b/public/js/plugins/datepicker/bootstrap-datepicker.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/bootstrap-datepicker.js
        rename to public/js/plugins/datepicker/bootstrap-datepicker.js
        diff --git a/public/assets/js/plugins/datepicker/datepicker3.css b/public/js/plugins/datepicker/datepicker3.css
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/datepicker3.css
        rename to public/js/plugins/datepicker/datepicker3.css
        diff --git a/public/js/plugins/datepicker/locales/bootstrap-datepicker.ar.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ar.js
        new file mode 100755
        index 0000000000..12ae1821d5
        Binary files /dev/null and b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ar.js differ
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.az.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.az.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.az.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.az.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.bg.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.bg.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.bg.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.bg.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ca.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ca.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ca.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.ca.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.cs.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.cs.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.cs.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.cs.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.cy.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.cy.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.cy.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.cy.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.da.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.da.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.da.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.da.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.de.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.de.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.de.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.de.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.el.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.el.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.el.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.el.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.es.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.es.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.es.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.es.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.et.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.et.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.et.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.et.js
        diff --git a/public/js/plugins/datepicker/locales/bootstrap-datepicker.fa.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.fa.js
        new file mode 100755
        index 0000000000..6503c85dd4
        Binary files /dev/null and b/public/js/plugins/datepicker/locales/bootstrap-datepicker.fa.js differ
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.fi.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.fi.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.fi.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.fi.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.fr.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.fr.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.fr.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.fr.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.gl.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.gl.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.gl.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.gl.js
        diff --git a/public/js/plugins/datepicker/locales/bootstrap-datepicker.he.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.he.js
        new file mode 100755
        index 0000000000..2e17393b12
        Binary files /dev/null and b/public/js/plugins/datepicker/locales/bootstrap-datepicker.he.js differ
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.hr.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.hr.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.hr.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.hr.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.hu.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.hu.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.hu.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.hu.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.id.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.id.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.id.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.id.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.is.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.is.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.is.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.is.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.it.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.it.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.it.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.it.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ja.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ja.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ja.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.ja.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ka.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ka.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ka.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.ka.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.kk.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.kk.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.kk.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.kk.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.kr.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.kr.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.kr.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.kr.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.lt.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.lt.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.lt.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.lt.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.lv.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.lv.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.lv.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.lv.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.mk.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.mk.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.mk.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.mk.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ms.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ms.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ms.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.ms.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.nb.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.nb.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.nb.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.nb.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.nl.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.nl.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.nl.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.nl.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.no.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.no.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.no.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.no.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.pl.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.pl.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.pl.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.pl.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.pt.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.pt.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.pt.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.pt.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ro.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ro.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ro.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.ro.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.rs.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.rs.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.rs.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.rs.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ru.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ru.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ru.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.ru.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sk.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.sk.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sk.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.sk.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sl.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.sl.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sl.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.sl.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sq.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.sq.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sq.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.sq.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sv.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.sv.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sv.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.sv.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sw.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.sw.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.sw.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.sw.js
        diff --git a/public/js/plugins/datepicker/locales/bootstrap-datepicker.th.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.th.js
        new file mode 100755
        index 0000000000..562b063c50
        Binary files /dev/null and b/public/js/plugins/datepicker/locales/bootstrap-datepicker.th.js differ
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.tr.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.tr.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.tr.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.tr.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ua.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.ua.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.ua.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.ua.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.vi.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.vi.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.vi.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.vi.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js
        diff --git a/public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js b/public/js/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js
        similarity index 100%
        rename from public/assets/js/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js
        rename to public/js/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js
        diff --git a/public/assets/js/plugins/daterangepicker/daterangepicker-bs3.css b/public/js/plugins/daterangepicker/daterangepicker-bs3.css
        similarity index 100%
        rename from public/assets/js/plugins/daterangepicker/daterangepicker-bs3.css
        rename to public/js/plugins/daterangepicker/daterangepicker-bs3.css
        diff --git a/public/assets/js/plugins/daterangepicker/daterangepicker.js b/public/js/plugins/daterangepicker/daterangepicker.js
        similarity index 100%
        rename from public/assets/js/plugins/daterangepicker/daterangepicker.js
        rename to public/js/plugins/daterangepicker/daterangepicker.js
        diff --git a/public/assets/js/plugins/daterangepicker/moment.js b/public/js/plugins/daterangepicker/moment.js
        similarity index 100%
        rename from public/assets/js/plugins/daterangepicker/moment.js
        rename to public/js/plugins/daterangepicker/moment.js
        diff --git a/public/assets/js/plugins/daterangepicker/moment.min.js b/public/js/plugins/daterangepicker/moment.min.js
        similarity index 100%
        rename from public/assets/js/plugins/daterangepicker/moment.min.js
        rename to public/js/plugins/daterangepicker/moment.min.js
        diff --git a/public/js/plugins/fastclick/fastclick.js b/public/js/plugins/fastclick/fastclick.js
        new file mode 100755
        index 0000000000..3af4f9d6f1
        Binary files /dev/null and b/public/js/plugins/fastclick/fastclick.js differ
        diff --git a/public/assets/js/plugins/fastclick/fastclick.min.js b/public/js/plugins/fastclick/fastclick.min.js
        similarity index 100%
        rename from public/assets/js/plugins/fastclick/fastclick.min.js
        rename to public/js/plugins/fastclick/fastclick.min.js
        diff --git a/public/assets/js/plugins/flot/excanvas.js b/public/js/plugins/flot/excanvas.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/excanvas.js
        rename to public/js/plugins/flot/excanvas.js
        diff --git a/public/assets/js/plugins/flot/excanvas.min.js b/public/js/plugins/flot/excanvas.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/excanvas.min.js
        rename to public/js/plugins/flot/excanvas.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.colorhelpers.js b/public/js/plugins/flot/jquery.colorhelpers.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.colorhelpers.js
        rename to public/js/plugins/flot/jquery.colorhelpers.js
        diff --git a/public/assets/js/plugins/flot/jquery.colorhelpers.min.js b/public/js/plugins/flot/jquery.colorhelpers.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.colorhelpers.min.js
        rename to public/js/plugins/flot/jquery.colorhelpers.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.canvas.js b/public/js/plugins/flot/jquery.flot.canvas.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.canvas.js
        rename to public/js/plugins/flot/jquery.flot.canvas.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.canvas.min.js b/public/js/plugins/flot/jquery.flot.canvas.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.canvas.min.js
        rename to public/js/plugins/flot/jquery.flot.canvas.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.categories.js b/public/js/plugins/flot/jquery.flot.categories.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.categories.js
        rename to public/js/plugins/flot/jquery.flot.categories.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.categories.min.js b/public/js/plugins/flot/jquery.flot.categories.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.categories.min.js
        rename to public/js/plugins/flot/jquery.flot.categories.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.crosshair.js b/public/js/plugins/flot/jquery.flot.crosshair.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.crosshair.js
        rename to public/js/plugins/flot/jquery.flot.crosshair.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.crosshair.min.js b/public/js/plugins/flot/jquery.flot.crosshair.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.crosshair.min.js
        rename to public/js/plugins/flot/jquery.flot.crosshair.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.errorbars.js b/public/js/plugins/flot/jquery.flot.errorbars.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.errorbars.js
        rename to public/js/plugins/flot/jquery.flot.errorbars.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.errorbars.min.js b/public/js/plugins/flot/jquery.flot.errorbars.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.errorbars.min.js
        rename to public/js/plugins/flot/jquery.flot.errorbars.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.fillbetween.js b/public/js/plugins/flot/jquery.flot.fillbetween.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.fillbetween.js
        rename to public/js/plugins/flot/jquery.flot.fillbetween.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.fillbetween.min.js b/public/js/plugins/flot/jquery.flot.fillbetween.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.fillbetween.min.js
        rename to public/js/plugins/flot/jquery.flot.fillbetween.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.image.js b/public/js/plugins/flot/jquery.flot.image.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.image.js
        rename to public/js/plugins/flot/jquery.flot.image.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.image.min.js b/public/js/plugins/flot/jquery.flot.image.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.image.min.js
        rename to public/js/plugins/flot/jquery.flot.image.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.js b/public/js/plugins/flot/jquery.flot.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.js
        rename to public/js/plugins/flot/jquery.flot.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.min.js b/public/js/plugins/flot/jquery.flot.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.min.js
        rename to public/js/plugins/flot/jquery.flot.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.navigate.js b/public/js/plugins/flot/jquery.flot.navigate.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.navigate.js
        rename to public/js/plugins/flot/jquery.flot.navigate.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.navigate.min.js b/public/js/plugins/flot/jquery.flot.navigate.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.navigate.min.js
        rename to public/js/plugins/flot/jquery.flot.navigate.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.pie.js b/public/js/plugins/flot/jquery.flot.pie.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.pie.js
        rename to public/js/plugins/flot/jquery.flot.pie.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.pie.min.js b/public/js/plugins/flot/jquery.flot.pie.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.pie.min.js
        rename to public/js/plugins/flot/jquery.flot.pie.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.resize.js b/public/js/plugins/flot/jquery.flot.resize.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.resize.js
        rename to public/js/plugins/flot/jquery.flot.resize.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.resize.min.js b/public/js/plugins/flot/jquery.flot.resize.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.resize.min.js
        rename to public/js/plugins/flot/jquery.flot.resize.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.selection.js b/public/js/plugins/flot/jquery.flot.selection.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.selection.js
        rename to public/js/plugins/flot/jquery.flot.selection.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.selection.min.js b/public/js/plugins/flot/jquery.flot.selection.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.selection.min.js
        rename to public/js/plugins/flot/jquery.flot.selection.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.stack.js b/public/js/plugins/flot/jquery.flot.stack.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.stack.js
        rename to public/js/plugins/flot/jquery.flot.stack.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.stack.min.js b/public/js/plugins/flot/jquery.flot.stack.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.stack.min.js
        rename to public/js/plugins/flot/jquery.flot.stack.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.symbol.js b/public/js/plugins/flot/jquery.flot.symbol.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.symbol.js
        rename to public/js/plugins/flot/jquery.flot.symbol.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.symbol.min.js b/public/js/plugins/flot/jquery.flot.symbol.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.symbol.min.js
        rename to public/js/plugins/flot/jquery.flot.symbol.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.threshold.js b/public/js/plugins/flot/jquery.flot.threshold.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.threshold.js
        rename to public/js/plugins/flot/jquery.flot.threshold.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.threshold.min.js b/public/js/plugins/flot/jquery.flot.threshold.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.threshold.min.js
        rename to public/js/plugins/flot/jquery.flot.threshold.min.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.time.js b/public/js/plugins/flot/jquery.flot.time.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.time.js
        rename to public/js/plugins/flot/jquery.flot.time.js
        diff --git a/public/assets/js/plugins/flot/jquery.flot.time.min.js b/public/js/plugins/flot/jquery.flot.time.min.js
        similarity index 100%
        rename from public/assets/js/plugins/flot/jquery.flot.time.min.js
        rename to public/js/plugins/flot/jquery.flot.time.min.js
        diff --git a/public/assets/js/plugins/fullcalendar/fullcalendar.css b/public/js/plugins/fullcalendar/fullcalendar.css
        similarity index 100%
        rename from public/assets/js/plugins/fullcalendar/fullcalendar.css
        rename to public/js/plugins/fullcalendar/fullcalendar.css
        diff --git a/public/assets/js/plugins/fullcalendar/fullcalendar.js b/public/js/plugins/fullcalendar/fullcalendar.js
        similarity index 100%
        rename from public/assets/js/plugins/fullcalendar/fullcalendar.js
        rename to public/js/plugins/fullcalendar/fullcalendar.js
        diff --git a/public/assets/js/plugins/fullcalendar/fullcalendar.min.css b/public/js/plugins/fullcalendar/fullcalendar.min.css
        similarity index 100%
        rename from public/assets/js/plugins/fullcalendar/fullcalendar.min.css
        rename to public/js/plugins/fullcalendar/fullcalendar.min.css
        diff --git a/public/assets/js/plugins/fullcalendar/fullcalendar.min.js b/public/js/plugins/fullcalendar/fullcalendar.min.js
        similarity index 100%
        rename from public/assets/js/plugins/fullcalendar/fullcalendar.min.js
        rename to public/js/plugins/fullcalendar/fullcalendar.min.js
        diff --git a/public/assets/js/plugins/fullcalendar/fullcalendar.print.css b/public/js/plugins/fullcalendar/fullcalendar.print.css
        similarity index 100%
        rename from public/assets/js/plugins/fullcalendar/fullcalendar.print.css
        rename to public/js/plugins/fullcalendar/fullcalendar.print.css
        diff --git a/public/js/plugins/iCheck/all.css b/public/js/plugins/iCheck/all.css
        new file mode 100755
        index 0000000000..6439b7429b
        Binary files /dev/null and b/public/js/plugins/iCheck/all.css differ
        diff --git a/public/assets/js/plugins/iCheck/flat/_all.css b/public/js/plugins/iCheck/flat/_all.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/_all.css
        rename to public/js/plugins/iCheck/flat/_all.css
        diff --git a/public/assets/js/plugins/iCheck/flat/aero.css b/public/js/plugins/iCheck/flat/aero.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/aero.css
        rename to public/js/plugins/iCheck/flat/aero.css
        diff --git a/public/js/plugins/iCheck/flat/aero.png b/public/js/plugins/iCheck/flat/aero.png
        new file mode 100755
        index 0000000000..f4277aa4cf
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/aero.png differ
        diff --git a/public/js/plugins/iCheck/flat/aero@2x.png b/public/js/plugins/iCheck/flat/aero@2x.png
        new file mode 100755
        index 0000000000..a9a749459d
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/aero@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/blue.css b/public/js/plugins/iCheck/flat/blue.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/blue.css
        rename to public/js/plugins/iCheck/flat/blue.css
        diff --git a/public/js/plugins/iCheck/flat/blue.png b/public/js/plugins/iCheck/flat/blue.png
        new file mode 100755
        index 0000000000..4b6ef9825e
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/blue.png differ
        diff --git a/public/js/plugins/iCheck/flat/blue@2x.png b/public/js/plugins/iCheck/flat/blue@2x.png
        new file mode 100755
        index 0000000000..d52da05771
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/blue@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/flat.css b/public/js/plugins/iCheck/flat/flat.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/flat.css
        rename to public/js/plugins/iCheck/flat/flat.css
        diff --git a/public/js/plugins/iCheck/flat/flat.png b/public/js/plugins/iCheck/flat/flat.png
        new file mode 100755
        index 0000000000..15af826e0a
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/flat.png differ
        diff --git a/public/js/plugins/iCheck/flat/flat@2x.png b/public/js/plugins/iCheck/flat/flat@2x.png
        new file mode 100755
        index 0000000000..e70e438c5d
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/flat@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/green.css b/public/js/plugins/iCheck/flat/green.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/green.css
        rename to public/js/plugins/iCheck/flat/green.css
        diff --git a/public/js/plugins/iCheck/flat/green.png b/public/js/plugins/iCheck/flat/green.png
        new file mode 100755
        index 0000000000..6b303fbead
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/green.png differ
        diff --git a/public/js/plugins/iCheck/flat/green@2x.png b/public/js/plugins/iCheck/flat/green@2x.png
        new file mode 100755
        index 0000000000..92b4411d90
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/green@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/grey.css b/public/js/plugins/iCheck/flat/grey.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/grey.css
        rename to public/js/plugins/iCheck/flat/grey.css
        diff --git a/public/js/plugins/iCheck/flat/grey.png b/public/js/plugins/iCheck/flat/grey.png
        new file mode 100755
        index 0000000000..c6e2873ed5
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/grey.png differ
        diff --git a/public/js/plugins/iCheck/flat/grey@2x.png b/public/js/plugins/iCheck/flat/grey@2x.png
        new file mode 100755
        index 0000000000..0b47b1c6d9
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/grey@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/orange.css b/public/js/plugins/iCheck/flat/orange.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/orange.css
        rename to public/js/plugins/iCheck/flat/orange.css
        diff --git a/public/js/plugins/iCheck/flat/orange.png b/public/js/plugins/iCheck/flat/orange.png
        new file mode 100755
        index 0000000000..ec2532ebe4
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/orange.png differ
        diff --git a/public/js/plugins/iCheck/flat/orange@2x.png b/public/js/plugins/iCheck/flat/orange@2x.png
        new file mode 100755
        index 0000000000..9350b50624
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/orange@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/pink.css b/public/js/plugins/iCheck/flat/pink.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/pink.css
        rename to public/js/plugins/iCheck/flat/pink.css
        diff --git a/public/js/plugins/iCheck/flat/pink.png b/public/js/plugins/iCheck/flat/pink.png
        new file mode 100755
        index 0000000000..3e65d9dd62
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/pink.png differ
        diff --git a/public/js/plugins/iCheck/flat/pink@2x.png b/public/js/plugins/iCheck/flat/pink@2x.png
        new file mode 100755
        index 0000000000..281ba06bec
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/pink@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/purple.css b/public/js/plugins/iCheck/flat/purple.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/purple.css
        rename to public/js/plugins/iCheck/flat/purple.css
        diff --git a/public/js/plugins/iCheck/flat/purple.png b/public/js/plugins/iCheck/flat/purple.png
        new file mode 100755
        index 0000000000..3699fd5832
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/purple.png differ
        diff --git a/public/js/plugins/iCheck/flat/purple@2x.png b/public/js/plugins/iCheck/flat/purple@2x.png
        new file mode 100755
        index 0000000000..7f4be74a7c
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/purple@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/red.css b/public/js/plugins/iCheck/flat/red.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/red.css
        rename to public/js/plugins/iCheck/flat/red.css
        diff --git a/public/js/plugins/iCheck/flat/red.png b/public/js/plugins/iCheck/flat/red.png
        new file mode 100755
        index 0000000000..0d5ac3819b
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/red.png differ
        diff --git a/public/js/plugins/iCheck/flat/red@2x.png b/public/js/plugins/iCheck/flat/red@2x.png
        new file mode 100755
        index 0000000000..38590d9852
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/red@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/flat/yellow.css b/public/js/plugins/iCheck/flat/yellow.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/flat/yellow.css
        rename to public/js/plugins/iCheck/flat/yellow.css
        diff --git a/public/js/plugins/iCheck/flat/yellow.png b/public/js/plugins/iCheck/flat/yellow.png
        new file mode 100755
        index 0000000000..909dadc529
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/yellow.png differ
        diff --git a/public/js/plugins/iCheck/flat/yellow@2x.png b/public/js/plugins/iCheck/flat/yellow@2x.png
        new file mode 100755
        index 0000000000..9fd5d73393
        Binary files /dev/null and b/public/js/plugins/iCheck/flat/yellow@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/futurico/futurico.css b/public/js/plugins/iCheck/futurico/futurico.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/futurico/futurico.css
        rename to public/js/plugins/iCheck/futurico/futurico.css
        diff --git a/public/js/plugins/iCheck/futurico/futurico.png b/public/js/plugins/iCheck/futurico/futurico.png
        new file mode 100755
        index 0000000000..50d62b5d40
        Binary files /dev/null and b/public/js/plugins/iCheck/futurico/futurico.png differ
        diff --git a/public/js/plugins/iCheck/futurico/futurico@2x.png b/public/js/plugins/iCheck/futurico/futurico@2x.png
        new file mode 100755
        index 0000000000..f7eb45aad0
        Binary files /dev/null and b/public/js/plugins/iCheck/futurico/futurico@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/icheck.js b/public/js/plugins/iCheck/icheck.js
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/icheck.js
        rename to public/js/plugins/iCheck/icheck.js
        diff --git a/public/assets/js/plugins/iCheck/icheck.min.js b/public/js/plugins/iCheck/icheck.min.js
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/icheck.min.js
        rename to public/js/plugins/iCheck/icheck.min.js
        diff --git a/public/assets/js/plugins/iCheck/line/_all.css b/public/js/plugins/iCheck/line/_all.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/_all.css
        rename to public/js/plugins/iCheck/line/_all.css
        diff --git a/public/assets/js/plugins/iCheck/line/aero.css b/public/js/plugins/iCheck/line/aero.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/aero.css
        rename to public/js/plugins/iCheck/line/aero.css
        diff --git a/public/assets/js/plugins/iCheck/line/blue.css b/public/js/plugins/iCheck/line/blue.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/blue.css
        rename to public/js/plugins/iCheck/line/blue.css
        diff --git a/public/assets/js/plugins/iCheck/line/green.css b/public/js/plugins/iCheck/line/green.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/green.css
        rename to public/js/plugins/iCheck/line/green.css
        diff --git a/public/assets/js/plugins/iCheck/line/grey.css b/public/js/plugins/iCheck/line/grey.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/grey.css
        rename to public/js/plugins/iCheck/line/grey.css
        diff --git a/public/assets/js/plugins/iCheck/line/line.css b/public/js/plugins/iCheck/line/line.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/line.css
        rename to public/js/plugins/iCheck/line/line.css
        diff --git a/public/js/plugins/iCheck/line/line.png b/public/js/plugins/iCheck/line/line.png
        new file mode 100755
        index 0000000000..d21d7a7b43
        Binary files /dev/null and b/public/js/plugins/iCheck/line/line.png differ
        diff --git a/public/js/plugins/iCheck/line/line@2x.png b/public/js/plugins/iCheck/line/line@2x.png
        new file mode 100755
        index 0000000000..62900a2d93
        Binary files /dev/null and b/public/js/plugins/iCheck/line/line@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/line/orange.css b/public/js/plugins/iCheck/line/orange.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/orange.css
        rename to public/js/plugins/iCheck/line/orange.css
        diff --git a/public/assets/js/plugins/iCheck/line/pink.css b/public/js/plugins/iCheck/line/pink.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/pink.css
        rename to public/js/plugins/iCheck/line/pink.css
        diff --git a/public/assets/js/plugins/iCheck/line/purple.css b/public/js/plugins/iCheck/line/purple.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/purple.css
        rename to public/js/plugins/iCheck/line/purple.css
        diff --git a/public/assets/js/plugins/iCheck/line/red.css b/public/js/plugins/iCheck/line/red.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/red.css
        rename to public/js/plugins/iCheck/line/red.css
        diff --git a/public/assets/js/plugins/iCheck/line/yellow.css b/public/js/plugins/iCheck/line/yellow.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/line/yellow.css
        rename to public/js/plugins/iCheck/line/yellow.css
        diff --git a/public/assets/js/plugins/iCheck/minimal/_all.css b/public/js/plugins/iCheck/minimal/_all.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/_all.css
        rename to public/js/plugins/iCheck/minimal/_all.css
        diff --git a/public/assets/js/plugins/iCheck/minimal/aero.css b/public/js/plugins/iCheck/minimal/aero.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/aero.css
        rename to public/js/plugins/iCheck/minimal/aero.css
        diff --git a/public/js/plugins/iCheck/minimal/aero.png b/public/js/plugins/iCheck/minimal/aero.png
        new file mode 100755
        index 0000000000..dccf7740c9
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/aero.png differ
        diff --git a/public/js/plugins/iCheck/minimal/aero@2x.png b/public/js/plugins/iCheck/minimal/aero@2x.png
        new file mode 100755
        index 0000000000..5537ee36fe
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/aero@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/blue.css b/public/js/plugins/iCheck/minimal/blue.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/blue.css
        rename to public/js/plugins/iCheck/minimal/blue.css
        diff --git a/public/js/plugins/iCheck/minimal/blue.png b/public/js/plugins/iCheck/minimal/blue.png
        new file mode 100755
        index 0000000000..af04cee596
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/blue.png differ
        diff --git a/public/js/plugins/iCheck/minimal/blue@2x.png b/public/js/plugins/iCheck/minimal/blue@2x.png
        new file mode 100755
        index 0000000000..f19210a9e5
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/blue@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/green.css b/public/js/plugins/iCheck/minimal/green.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/green.css
        rename to public/js/plugins/iCheck/minimal/green.css
        diff --git a/public/js/plugins/iCheck/minimal/green.png b/public/js/plugins/iCheck/minimal/green.png
        new file mode 100755
        index 0000000000..9171ebc7e4
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/green.png differ
        diff --git a/public/js/plugins/iCheck/minimal/green@2x.png b/public/js/plugins/iCheck/minimal/green@2x.png
        new file mode 100755
        index 0000000000..7f18f96a9c
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/green@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/grey.css b/public/js/plugins/iCheck/minimal/grey.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/grey.css
        rename to public/js/plugins/iCheck/minimal/grey.css
        diff --git a/public/js/plugins/iCheck/minimal/grey.png b/public/js/plugins/iCheck/minimal/grey.png
        new file mode 100755
        index 0000000000..22dcdbcfa2
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/grey.png differ
        diff --git a/public/js/plugins/iCheck/minimal/grey@2x.png b/public/js/plugins/iCheck/minimal/grey@2x.png
        new file mode 100755
        index 0000000000..85e82ddda4
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/grey@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/minimal.css b/public/js/plugins/iCheck/minimal/minimal.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/minimal.css
        rename to public/js/plugins/iCheck/minimal/minimal.css
        diff --git a/public/js/plugins/iCheck/minimal/minimal.png b/public/js/plugins/iCheck/minimal/minimal.png
        new file mode 100755
        index 0000000000..943be16fb1
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/minimal.png differ
        diff --git a/public/js/plugins/iCheck/minimal/minimal@2x.png b/public/js/plugins/iCheck/minimal/minimal@2x.png
        new file mode 100755
        index 0000000000..d62291daaa
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/minimal@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/orange.css b/public/js/plugins/iCheck/minimal/orange.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/orange.css
        rename to public/js/plugins/iCheck/minimal/orange.css
        diff --git a/public/js/plugins/iCheck/minimal/orange.png b/public/js/plugins/iCheck/minimal/orange.png
        new file mode 100755
        index 0000000000..f2a314978d
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/orange.png differ
        diff --git a/public/js/plugins/iCheck/minimal/orange@2x.png b/public/js/plugins/iCheck/minimal/orange@2x.png
        new file mode 100755
        index 0000000000..68c835915a
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/orange@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/pink.css b/public/js/plugins/iCheck/minimal/pink.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/pink.css
        rename to public/js/plugins/iCheck/minimal/pink.css
        diff --git a/public/js/plugins/iCheck/minimal/pink.png b/public/js/plugins/iCheck/minimal/pink.png
        new file mode 100755
        index 0000000000..660553c074
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/pink.png differ
        diff --git a/public/js/plugins/iCheck/minimal/pink@2x.png b/public/js/plugins/iCheck/minimal/pink@2x.png
        new file mode 100755
        index 0000000000..7d7b385146
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/pink@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/purple.css b/public/js/plugins/iCheck/minimal/purple.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/purple.css
        rename to public/js/plugins/iCheck/minimal/purple.css
        diff --git a/public/js/plugins/iCheck/minimal/purple.png b/public/js/plugins/iCheck/minimal/purple.png
        new file mode 100755
        index 0000000000..48dec794dd
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/purple.png differ
        diff --git a/public/js/plugins/iCheck/minimal/purple@2x.png b/public/js/plugins/iCheck/minimal/purple@2x.png
        new file mode 100755
        index 0000000000..3bb7041718
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/purple@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/red.css b/public/js/plugins/iCheck/minimal/red.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/red.css
        rename to public/js/plugins/iCheck/minimal/red.css
        diff --git a/public/js/plugins/iCheck/minimal/red.png b/public/js/plugins/iCheck/minimal/red.png
        new file mode 100755
        index 0000000000..4443f80976
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/red.png differ
        diff --git a/public/js/plugins/iCheck/minimal/red@2x.png b/public/js/plugins/iCheck/minimal/red@2x.png
        new file mode 100755
        index 0000000000..2eb55a65c7
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/red@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/minimal/yellow.css b/public/js/plugins/iCheck/minimal/yellow.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/minimal/yellow.css
        rename to public/js/plugins/iCheck/minimal/yellow.css
        diff --git a/public/js/plugins/iCheck/minimal/yellow.png b/public/js/plugins/iCheck/minimal/yellow.png
        new file mode 100755
        index 0000000000..0999b7ecdc
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/yellow.png differ
        diff --git a/public/js/plugins/iCheck/minimal/yellow@2x.png b/public/js/plugins/iCheck/minimal/yellow@2x.png
        new file mode 100755
        index 0000000000..c16f2b7dc5
        Binary files /dev/null and b/public/js/plugins/iCheck/minimal/yellow@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/polaris/polaris.css b/public/js/plugins/iCheck/polaris/polaris.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/polaris/polaris.css
        rename to public/js/plugins/iCheck/polaris/polaris.css
        diff --git a/public/js/plugins/iCheck/polaris/polaris.png b/public/js/plugins/iCheck/polaris/polaris.png
        new file mode 100755
        index 0000000000..60c14e6a88
        Binary files /dev/null and b/public/js/plugins/iCheck/polaris/polaris.png differ
        diff --git a/public/js/plugins/iCheck/polaris/polaris@2x.png b/public/js/plugins/iCheck/polaris/polaris@2x.png
        new file mode 100755
        index 0000000000..c75b82695d
        Binary files /dev/null and b/public/js/plugins/iCheck/polaris/polaris@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/_all.css b/public/js/plugins/iCheck/square/_all.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/_all.css
        rename to public/js/plugins/iCheck/square/_all.css
        diff --git a/public/assets/js/plugins/iCheck/square/aero.css b/public/js/plugins/iCheck/square/aero.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/aero.css
        rename to public/js/plugins/iCheck/square/aero.css
        diff --git a/public/js/plugins/iCheck/square/aero.png b/public/js/plugins/iCheck/square/aero.png
        new file mode 100755
        index 0000000000..1a332e6c57
        Binary files /dev/null and b/public/js/plugins/iCheck/square/aero.png differ
        diff --git a/public/js/plugins/iCheck/square/aero@2x.png b/public/js/plugins/iCheck/square/aero@2x.png
        new file mode 100755
        index 0000000000..07c5a02248
        Binary files /dev/null and b/public/js/plugins/iCheck/square/aero@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/blue.css b/public/js/plugins/iCheck/square/blue.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/blue.css
        rename to public/js/plugins/iCheck/square/blue.css
        diff --git a/public/js/plugins/iCheck/square/blue.png b/public/js/plugins/iCheck/square/blue.png
        new file mode 100755
        index 0000000000..a3e040fcce
        Binary files /dev/null and b/public/js/plugins/iCheck/square/blue.png differ
        diff --git a/public/js/plugins/iCheck/square/blue@2x.png b/public/js/plugins/iCheck/square/blue@2x.png
        new file mode 100755
        index 0000000000..8fdea12f96
        Binary files /dev/null and b/public/js/plugins/iCheck/square/blue@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/green.css b/public/js/plugins/iCheck/square/green.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/green.css
        rename to public/js/plugins/iCheck/square/green.css
        diff --git a/public/js/plugins/iCheck/square/green.png b/public/js/plugins/iCheck/square/green.png
        new file mode 100755
        index 0000000000..465824e70c
        Binary files /dev/null and b/public/js/plugins/iCheck/square/green.png differ
        diff --git a/public/js/plugins/iCheck/square/green@2x.png b/public/js/plugins/iCheck/square/green@2x.png
        new file mode 100755
        index 0000000000..784e874758
        Binary files /dev/null and b/public/js/plugins/iCheck/square/green@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/grey.css b/public/js/plugins/iCheck/square/grey.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/grey.css
        rename to public/js/plugins/iCheck/square/grey.css
        diff --git a/public/js/plugins/iCheck/square/grey.png b/public/js/plugins/iCheck/square/grey.png
        new file mode 100755
        index 0000000000..f69375854d
        Binary files /dev/null and b/public/js/plugins/iCheck/square/grey.png differ
        diff --git a/public/js/plugins/iCheck/square/grey@2x.png b/public/js/plugins/iCheck/square/grey@2x.png
        new file mode 100755
        index 0000000000..5d6341c053
        Binary files /dev/null and b/public/js/plugins/iCheck/square/grey@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/orange.css b/public/js/plugins/iCheck/square/orange.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/orange.css
        rename to public/js/plugins/iCheck/square/orange.css
        diff --git a/public/js/plugins/iCheck/square/orange.png b/public/js/plugins/iCheck/square/orange.png
        new file mode 100755
        index 0000000000..84608500a6
        Binary files /dev/null and b/public/js/plugins/iCheck/square/orange.png differ
        diff --git a/public/js/plugins/iCheck/square/orange@2x.png b/public/js/plugins/iCheck/square/orange@2x.png
        new file mode 100755
        index 0000000000..b1f2319735
        Binary files /dev/null and b/public/js/plugins/iCheck/square/orange@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/pink.css b/public/js/plugins/iCheck/square/pink.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/pink.css
        rename to public/js/plugins/iCheck/square/pink.css
        diff --git a/public/js/plugins/iCheck/square/pink.png b/public/js/plugins/iCheck/square/pink.png
        new file mode 100755
        index 0000000000..9c8b4e2b6c
        Binary files /dev/null and b/public/js/plugins/iCheck/square/pink.png differ
        diff --git a/public/js/plugins/iCheck/square/pink@2x.png b/public/js/plugins/iCheck/square/pink@2x.png
        new file mode 100755
        index 0000000000..b1f3a6eda6
        Binary files /dev/null and b/public/js/plugins/iCheck/square/pink@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/purple.css b/public/js/plugins/iCheck/square/purple.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/purple.css
        rename to public/js/plugins/iCheck/square/purple.css
        diff --git a/public/js/plugins/iCheck/square/purple.png b/public/js/plugins/iCheck/square/purple.png
        new file mode 100755
        index 0000000000..6bfc16a38c
        Binary files /dev/null and b/public/js/plugins/iCheck/square/purple.png differ
        diff --git a/public/js/plugins/iCheck/square/purple@2x.png b/public/js/plugins/iCheck/square/purple@2x.png
        new file mode 100755
        index 0000000000..6d3c8b1af3
        Binary files /dev/null and b/public/js/plugins/iCheck/square/purple@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/red.css b/public/js/plugins/iCheck/square/red.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/red.css
        rename to public/js/plugins/iCheck/square/red.css
        diff --git a/public/js/plugins/iCheck/square/red.png b/public/js/plugins/iCheck/square/red.png
        new file mode 100755
        index 0000000000..749675a979
        Binary files /dev/null and b/public/js/plugins/iCheck/square/red.png differ
        diff --git a/public/js/plugins/iCheck/square/red@2x.png b/public/js/plugins/iCheck/square/red@2x.png
        new file mode 100755
        index 0000000000..c05700a574
        Binary files /dev/null and b/public/js/plugins/iCheck/square/red@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/square.css b/public/js/plugins/iCheck/square/square.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/square.css
        rename to public/js/plugins/iCheck/square/square.css
        diff --git a/public/js/plugins/iCheck/square/square.png b/public/js/plugins/iCheck/square/square.png
        new file mode 100755
        index 0000000000..2a3c88116c
        Binary files /dev/null and b/public/js/plugins/iCheck/square/square.png differ
        diff --git a/public/js/plugins/iCheck/square/square@2x.png b/public/js/plugins/iCheck/square/square@2x.png
        new file mode 100755
        index 0000000000..9b56c448d0
        Binary files /dev/null and b/public/js/plugins/iCheck/square/square@2x.png differ
        diff --git a/public/assets/js/plugins/iCheck/square/yellow.css b/public/js/plugins/iCheck/square/yellow.css
        similarity index 100%
        rename from public/assets/js/plugins/iCheck/square/yellow.css
        rename to public/js/plugins/iCheck/square/yellow.css
        diff --git a/public/js/plugins/iCheck/square/yellow.png b/public/js/plugins/iCheck/square/yellow.png
        new file mode 100755
        index 0000000000..b6c0330909
        Binary files /dev/null and b/public/js/plugins/iCheck/square/yellow.png differ
        diff --git a/public/js/plugins/iCheck/square/yellow@2x.png b/public/js/plugins/iCheck/square/yellow@2x.png
        new file mode 100755
        index 0000000000..6b8e328e1a
        Binary files /dev/null and b/public/js/plugins/iCheck/square/yellow@2x.png differ
        diff --git a/public/assets/js/plugins/input-mask/jquery.inputmask.date.extensions.js b/public/js/plugins/input-mask/jquery.inputmask.date.extensions.js
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/jquery.inputmask.date.extensions.js
        rename to public/js/plugins/input-mask/jquery.inputmask.date.extensions.js
        diff --git a/public/assets/js/plugins/input-mask/jquery.inputmask.extensions.js b/public/js/plugins/input-mask/jquery.inputmask.extensions.js
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/jquery.inputmask.extensions.js
        rename to public/js/plugins/input-mask/jquery.inputmask.extensions.js
        diff --git a/public/assets/js/plugins/input-mask/jquery.inputmask.js b/public/js/plugins/input-mask/jquery.inputmask.js
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/jquery.inputmask.js
        rename to public/js/plugins/input-mask/jquery.inputmask.js
        diff --git a/public/assets/js/plugins/input-mask/jquery.inputmask.numeric.extensions.js b/public/js/plugins/input-mask/jquery.inputmask.numeric.extensions.js
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/jquery.inputmask.numeric.extensions.js
        rename to public/js/plugins/input-mask/jquery.inputmask.numeric.extensions.js
        diff --git a/public/assets/js/plugins/input-mask/jquery.inputmask.phone.extensions.js b/public/js/plugins/input-mask/jquery.inputmask.phone.extensions.js
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/jquery.inputmask.phone.extensions.js
        rename to public/js/plugins/input-mask/jquery.inputmask.phone.extensions.js
        diff --git a/public/assets/js/plugins/input-mask/jquery.inputmask.regex.extensions.js b/public/js/plugins/input-mask/jquery.inputmask.regex.extensions.js
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/jquery.inputmask.regex.extensions.js
        rename to public/js/plugins/input-mask/jquery.inputmask.regex.extensions.js
        diff --git a/public/assets/js/plugins/input-mask/phone-codes/phone-be.json b/public/js/plugins/input-mask/phone-codes/phone-be.json
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/phone-codes/phone-be.json
        rename to public/js/plugins/input-mask/phone-codes/phone-be.json
        diff --git a/public/assets/js/plugins/input-mask/phone-codes/phone-codes.json b/public/js/plugins/input-mask/phone-codes/phone-codes.json
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/phone-codes/phone-codes.json
        rename to public/js/plugins/input-mask/phone-codes/phone-codes.json
        diff --git a/public/assets/js/plugins/input-mask/phone-codes/readme.txt b/public/js/plugins/input-mask/phone-codes/readme.txt
        similarity index 100%
        rename from public/assets/js/plugins/input-mask/phone-codes/readme.txt
        rename to public/js/plugins/input-mask/phone-codes/readme.txt
        diff --git a/public/assets/js/plugins/jQuery/jQuery-2.1.4.min.js b/public/js/plugins/jQuery/jQuery-2.1.4.min.js
        similarity index 100%
        rename from public/assets/js/plugins/jQuery/jQuery-2.1.4.min.js
        rename to public/js/plugins/jQuery/jQuery-2.1.4.min.js
        diff --git a/public/assets/js/plugins/jQueryUI/jquery-ui.js b/public/js/plugins/jQueryUI/jquery-ui.js
        similarity index 100%
        rename from public/assets/js/plugins/jQueryUI/jquery-ui.js
        rename to public/js/plugins/jQueryUI/jquery-ui.js
        diff --git a/public/assets/js/plugins/jQueryUI/jquery-ui.min.js b/public/js/plugins/jQueryUI/jquery-ui.min.js
        similarity index 100%
        rename from public/assets/js/plugins/jQueryUI/jquery-ui.min.js
        rename to public/js/plugins/jQueryUI/jquery-ui.min.js
        diff --git a/public/assets/js/plugins/jvectormap/jquery-jvectormap-1.2.2.css b/public/js/plugins/jvectormap/jquery-jvectormap-1.2.2.css
        similarity index 100%
        rename from public/assets/js/plugins/jvectormap/jquery-jvectormap-1.2.2.css
        rename to public/js/plugins/jvectormap/jquery-jvectormap-1.2.2.css
        diff --git a/public/assets/js/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js b/public/js/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js
        similarity index 100%
        rename from public/assets/js/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js
        rename to public/js/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js
        diff --git a/public/assets/js/plugins/jvectormap/jquery-jvectormap-world-mill-en.js b/public/js/plugins/jvectormap/jquery-jvectormap-world-mill-en.js
        similarity index 100%
        rename from public/assets/js/plugins/jvectormap/jquery-jvectormap-world-mill-en.js
        rename to public/js/plugins/jvectormap/jquery-jvectormap-world-mill-en.js
        diff --git a/public/assets/js/plugins/knob/jquery.knob.js b/public/js/plugins/knob/jquery.knob.js
        similarity index 100%
        rename from public/assets/js/plugins/knob/jquery.knob.js
        rename to public/js/plugins/knob/jquery.knob.js
        diff --git a/public/assets/js/plugins/morris/morris.css b/public/js/plugins/morris/morris.css
        similarity index 100%
        rename from public/assets/js/plugins/morris/morris.css
        rename to public/js/plugins/morris/morris.css
        diff --git a/public/assets/js/plugins/morris/morris.js b/public/js/plugins/morris/morris.js
        similarity index 100%
        rename from public/assets/js/plugins/morris/morris.js
        rename to public/js/plugins/morris/morris.js
        diff --git a/public/assets/js/plugins/morris/morris.min.js b/public/js/plugins/morris/morris.min.js
        similarity index 100%
        rename from public/assets/js/plugins/morris/morris.min.js
        rename to public/js/plugins/morris/morris.min.js
        diff --git a/public/assets/js/plugins/pace/pace.js b/public/js/plugins/pace/pace.js
        similarity index 100%
        rename from public/assets/js/plugins/pace/pace.js
        rename to public/js/plugins/pace/pace.js
        diff --git a/public/assets/js/plugins/select2/i18n/az.js b/public/js/plugins/select2/i18n/az.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/az.js
        rename to public/js/plugins/select2/i18n/az.js
        diff --git a/public/assets/js/plugins/select2/i18n/bg.js b/public/js/plugins/select2/i18n/bg.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/bg.js
        rename to public/js/plugins/select2/i18n/bg.js
        diff --git a/public/assets/js/plugins/select2/i18n/ca.js b/public/js/plugins/select2/i18n/ca.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/ca.js
        rename to public/js/plugins/select2/i18n/ca.js
        diff --git a/public/assets/js/plugins/select2/i18n/cs.js b/public/js/plugins/select2/i18n/cs.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/cs.js
        rename to public/js/plugins/select2/i18n/cs.js
        diff --git a/public/assets/js/plugins/select2/i18n/da.js b/public/js/plugins/select2/i18n/da.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/da.js
        rename to public/js/plugins/select2/i18n/da.js
        diff --git a/public/assets/js/plugins/select2/i18n/de.js b/public/js/plugins/select2/i18n/de.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/de.js
        rename to public/js/plugins/select2/i18n/de.js
        diff --git a/public/assets/js/plugins/select2/i18n/en.js b/public/js/plugins/select2/i18n/en.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/en.js
        rename to public/js/plugins/select2/i18n/en.js
        diff --git a/public/assets/js/plugins/select2/i18n/es.js b/public/js/plugins/select2/i18n/es.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/es.js
        rename to public/js/plugins/select2/i18n/es.js
        diff --git a/public/assets/js/plugins/select2/i18n/et.js b/public/js/plugins/select2/i18n/et.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/et.js
        rename to public/js/plugins/select2/i18n/et.js
        diff --git a/public/assets/js/plugins/select2/i18n/eu.js b/public/js/plugins/select2/i18n/eu.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/eu.js
        rename to public/js/plugins/select2/i18n/eu.js
        diff --git a/public/assets/js/plugins/select2/i18n/fa.js b/public/js/plugins/select2/i18n/fa.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/fa.js
        rename to public/js/plugins/select2/i18n/fa.js
        diff --git a/public/assets/js/plugins/select2/i18n/fi.js b/public/js/plugins/select2/i18n/fi.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/fi.js
        rename to public/js/plugins/select2/i18n/fi.js
        diff --git a/public/assets/js/plugins/select2/i18n/fr.js b/public/js/plugins/select2/i18n/fr.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/fr.js
        rename to public/js/plugins/select2/i18n/fr.js
        diff --git a/public/assets/js/plugins/select2/i18n/gl.js b/public/js/plugins/select2/i18n/gl.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/gl.js
        rename to public/js/plugins/select2/i18n/gl.js
        diff --git a/public/assets/js/plugins/select2/i18n/he.js b/public/js/plugins/select2/i18n/he.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/he.js
        rename to public/js/plugins/select2/i18n/he.js
        diff --git a/public/assets/js/plugins/select2/i18n/hi.js b/public/js/plugins/select2/i18n/hi.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/hi.js
        rename to public/js/plugins/select2/i18n/hi.js
        diff --git a/public/assets/js/plugins/select2/i18n/hr.js b/public/js/plugins/select2/i18n/hr.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/hr.js
        rename to public/js/plugins/select2/i18n/hr.js
        diff --git a/public/assets/js/plugins/select2/i18n/hu.js b/public/js/plugins/select2/i18n/hu.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/hu.js
        rename to public/js/plugins/select2/i18n/hu.js
        diff --git a/public/assets/js/plugins/select2/i18n/id.js b/public/js/plugins/select2/i18n/id.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/id.js
        rename to public/js/plugins/select2/i18n/id.js
        diff --git a/public/assets/js/plugins/select2/i18n/is.js b/public/js/plugins/select2/i18n/is.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/is.js
        rename to public/js/plugins/select2/i18n/is.js
        diff --git a/public/assets/js/plugins/select2/i18n/it.js b/public/js/plugins/select2/i18n/it.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/it.js
        rename to public/js/plugins/select2/i18n/it.js
        diff --git a/public/assets/js/plugins/select2/i18n/ko.js b/public/js/plugins/select2/i18n/ko.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/ko.js
        rename to public/js/plugins/select2/i18n/ko.js
        diff --git a/public/assets/js/plugins/select2/i18n/lt.js b/public/js/plugins/select2/i18n/lt.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/lt.js
        rename to public/js/plugins/select2/i18n/lt.js
        diff --git a/public/assets/js/plugins/select2/i18n/lv.js b/public/js/plugins/select2/i18n/lv.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/lv.js
        rename to public/js/plugins/select2/i18n/lv.js
        diff --git a/public/assets/js/plugins/select2/i18n/mk.js b/public/js/plugins/select2/i18n/mk.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/mk.js
        rename to public/js/plugins/select2/i18n/mk.js
        diff --git a/public/assets/js/plugins/select2/i18n/nb.js b/public/js/plugins/select2/i18n/nb.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/nb.js
        rename to public/js/plugins/select2/i18n/nb.js
        diff --git a/public/assets/js/plugins/select2/i18n/nl.js b/public/js/plugins/select2/i18n/nl.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/nl.js
        rename to public/js/plugins/select2/i18n/nl.js
        diff --git a/public/assets/js/plugins/select2/i18n/pl.js b/public/js/plugins/select2/i18n/pl.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/pl.js
        rename to public/js/plugins/select2/i18n/pl.js
        diff --git a/public/assets/js/plugins/select2/i18n/pt-BR.js b/public/js/plugins/select2/i18n/pt-BR.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/pt-BR.js
        rename to public/js/plugins/select2/i18n/pt-BR.js
        diff --git a/public/assets/js/plugins/select2/i18n/pt.js b/public/js/plugins/select2/i18n/pt.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/pt.js
        rename to public/js/plugins/select2/i18n/pt.js
        diff --git a/public/assets/js/plugins/select2/i18n/ro.js b/public/js/plugins/select2/i18n/ro.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/ro.js
        rename to public/js/plugins/select2/i18n/ro.js
        diff --git a/public/assets/js/plugins/select2/i18n/ru.js b/public/js/plugins/select2/i18n/ru.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/ru.js
        rename to public/js/plugins/select2/i18n/ru.js
        diff --git a/public/assets/js/plugins/select2/i18n/sk.js b/public/js/plugins/select2/i18n/sk.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/sk.js
        rename to public/js/plugins/select2/i18n/sk.js
        diff --git a/public/assets/js/plugins/select2/i18n/sr.js b/public/js/plugins/select2/i18n/sr.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/sr.js
        rename to public/js/plugins/select2/i18n/sr.js
        diff --git a/public/assets/js/plugins/select2/i18n/sv.js b/public/js/plugins/select2/i18n/sv.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/sv.js
        rename to public/js/plugins/select2/i18n/sv.js
        diff --git a/public/assets/js/plugins/select2/i18n/th.js b/public/js/plugins/select2/i18n/th.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/th.js
        rename to public/js/plugins/select2/i18n/th.js
        diff --git a/public/assets/js/plugins/select2/i18n/tr.js b/public/js/plugins/select2/i18n/tr.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/tr.js
        rename to public/js/plugins/select2/i18n/tr.js
        diff --git a/public/assets/js/plugins/select2/i18n/uk.js b/public/js/plugins/select2/i18n/uk.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/uk.js
        rename to public/js/plugins/select2/i18n/uk.js
        diff --git a/public/assets/js/plugins/select2/i18n/vi.js b/public/js/plugins/select2/i18n/vi.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/vi.js
        rename to public/js/plugins/select2/i18n/vi.js
        diff --git a/public/assets/js/plugins/select2/i18n/zh-CN.js b/public/js/plugins/select2/i18n/zh-CN.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/zh-CN.js
        rename to public/js/plugins/select2/i18n/zh-CN.js
        diff --git a/public/assets/js/plugins/select2/i18n/zh-TW.js b/public/js/plugins/select2/i18n/zh-TW.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/i18n/zh-TW.js
        rename to public/js/plugins/select2/i18n/zh-TW.js
        diff --git a/public/assets/js/plugins/select2/select2.css b/public/js/plugins/select2/select2.css
        similarity index 100%
        rename from public/assets/js/plugins/select2/select2.css
        rename to public/js/plugins/select2/select2.css
        diff --git a/public/assets/js/plugins/select2/select2.full.js b/public/js/plugins/select2/select2.full.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/select2.full.js
        rename to public/js/plugins/select2/select2.full.js
        diff --git a/public/assets/js/plugins/select2/select2.full.min.js b/public/js/plugins/select2/select2.full.min.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/select2.full.min.js
        rename to public/js/plugins/select2/select2.full.min.js
        diff --git a/public/assets/js/plugins/select2/select2.js b/public/js/plugins/select2/select2.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/select2.js
        rename to public/js/plugins/select2/select2.js
        diff --git a/public/assets/js/plugins/select2/select2.min.css b/public/js/plugins/select2/select2.min.css
        similarity index 100%
        rename from public/assets/js/plugins/select2/select2.min.css
        rename to public/js/plugins/select2/select2.min.css
        diff --git a/public/assets/js/plugins/select2/select2.min.js b/public/js/plugins/select2/select2.min.js
        similarity index 100%
        rename from public/assets/js/plugins/select2/select2.min.js
        rename to public/js/plugins/select2/select2.min.js
        diff --git a/public/assets/js/plugins/slimScroll/jquery.slimscroll.js b/public/js/plugins/slimScroll/jquery.slimscroll.js
        similarity index 100%
        rename from public/assets/js/plugins/slimScroll/jquery.slimscroll.js
        rename to public/js/plugins/slimScroll/jquery.slimscroll.js
        diff --git a/public/assets/js/plugins/slimScroll/jquery.slimscroll.min.js b/public/js/plugins/slimScroll/jquery.slimscroll.min.js
        similarity index 100%
        rename from public/assets/js/plugins/slimScroll/jquery.slimscroll.min.js
        rename to public/js/plugins/slimScroll/jquery.slimscroll.min.js
        diff --git a/public/assets/js/plugins/sparkline/jquery.sparkline.js b/public/js/plugins/sparkline/jquery.sparkline.js
        similarity index 100%
        rename from public/assets/js/plugins/sparkline/jquery.sparkline.js
        rename to public/js/plugins/sparkline/jquery.sparkline.js
        diff --git a/public/assets/js/plugins/sparkline/jquery.sparkline.min.js b/public/js/plugins/sparkline/jquery.sparkline.min.js
        similarity index 100%
        rename from public/assets/js/plugins/sparkline/jquery.sparkline.min.js
        rename to public/js/plugins/sparkline/jquery.sparkline.min.js
        diff --git a/public/assets/js/plugins/timepicker/bootstrap-timepicker.css b/public/js/plugins/timepicker/bootstrap-timepicker.css
        similarity index 100%
        rename from public/assets/js/plugins/timepicker/bootstrap-timepicker.css
        rename to public/js/plugins/timepicker/bootstrap-timepicker.css
        diff --git a/public/assets/js/plugins/timepicker/bootstrap-timepicker.js b/public/js/plugins/timepicker/bootstrap-timepicker.js
        similarity index 100%
        rename from public/assets/js/plugins/timepicker/bootstrap-timepicker.js
        rename to public/js/plugins/timepicker/bootstrap-timepicker.js
        diff --git a/public/assets/js/plugins/timepicker/bootstrap-timepicker.min.css b/public/js/plugins/timepicker/bootstrap-timepicker.min.css
        similarity index 100%
        rename from public/assets/js/plugins/timepicker/bootstrap-timepicker.min.css
        rename to public/js/plugins/timepicker/bootstrap-timepicker.min.css
        diff --git a/public/assets/js/plugins/timepicker/bootstrap-timepicker.min.js b/public/js/plugins/timepicker/bootstrap-timepicker.min.js
        similarity index 100%
        rename from public/assets/js/plugins/timepicker/bootstrap-timepicker.min.js
        rename to public/js/plugins/timepicker/bootstrap-timepicker.min.js
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/Readme.md b/public/js/respond.js
        old mode 100755
        new mode 100644
        similarity index 100%
        rename from resources/assets/js/plugins/datatables/extensions/Responsive/Readme.md
        rename to public/js/respond.js
        diff --git a/public/assets/js/select2.min.js b/public/js/select2.min.js
        similarity index 100%
        rename from public/assets/js/select2.min.js
        rename to public/js/select2.min.js
        diff --git a/public/assets/js/signature_pad.js b/public/js/signature_pad.js
        similarity index 100%
        rename from public/assets/js/signature_pad.js
        rename to public/js/signature_pad.js
        diff --git a/public/assets/js/signature_pad.min.js b/public/js/signature_pad.min.js
        similarity index 100%
        rename from public/assets/js/signature_pad.min.js
        rename to public/js/signature_pad.min.js
        diff --git a/public/js/vue.js b/public/js/vue.js
        new file mode 100644
        index 0000000000..ccc8a96d88
        Binary files /dev/null and b/public/js/vue.js differ
        diff --git a/public/mix-manifest.json b/public/mix-manifest.json
        new file mode 100644
        index 0000000000..0e67de413f
        --- /dev/null
        +++ b/public/mix-manifest.json
        @@ -0,0 +1,15 @@
        +{
        +  "/build/vue.js": "/build/vue.js",
        +  "/mix.js": "/mix.js",
        +  "/build/app.css": "/build/app.535d8af1016a2377e449920c617f0197.css",
        +  "/build/AdminLTE.css": "/build/AdminLTE.3d8a2b2e33baa060b1b324363ad5e1c2.css",
        +  "/build/overrides.css": "/build/overrides.617623c6a96be3e0cbd11c5d4039ec10.css",
        +  "/css/all.css": "/css/all.css",
        +  "/js/all.js": "/js/all.js",
        +  "/css/app.css": "/css/app.css",
        +  "/css/dist/all.css": "/css/dist/all.css",
        +  "/js/dist/all.js": "/js/dist/all.js",
        +  "/css/AdminLTE.css": "/css/AdminLTE.css",
        +  "/css/overrides.css": "/css/overrides.css",
        +  "/css/skin-blue.css": "/css/skin-blue.css"
        +}
        \ No newline at end of file
        diff --git a/resources/assets/css/font-awesome/font-awesome.css b/resources/assets/css/font-awesome/font-awesome.css
        new file mode 100644
        index 0000000000..ee906a8196
        --- /dev/null
        +++ b/resources/assets/css/font-awesome/font-awesome.css
        @@ -0,0 +1,2337 @@
        +/*!
        + *  Font Awesome 4.7.0 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.7.0');
        +  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
        +  font-weight: normal;
        +  font-style: normal;
        +}
        +.fa {
        +  display: inline-block;
        +  font: normal normal normal 14px/1 FontAwesome;
        +  font-size: inherit;
        +  text-rendering: auto;
        +  -webkit-font-smoothing: antialiased;
        +  -moz-osx-font-smoothing: grayscale;
        +}
        +/* makes the font 33% larger relative to the icon container */
        +.fa-lg {
        +  font-size: 1.33333333em;
        +  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.28571429em;
        +  text-align: center;
        +}
        +.fa-ul {
        +  padding-left: 0;
        +  margin-left: 2.14285714em;
        +  list-style-type: none;
        +}
        +.fa-ul > li {
        +  position: relative;
        +}
        +.fa-li {
        +  position: absolute;
        +  left: -2.14285714em;
        +  width: 2.14285714em;
        +  top: 0.14285714em;
        +  text-align: center;
        +}
        +.fa-li.fa-lg {
        +  left: -1.85714286em;
        +}
        +.fa-border {
        +  padding: .2em .25em .15em;
        +  border: solid 0.08em #eeeeee;
        +  border-radius: .1em;
        +}
        +.fa-pull-left {
        +  float: left;
        +}
        +.fa-pull-right {
        +  float: right;
        +}
        +.fa.fa-pull-left {
        +  margin-right: .3em;
        +}
        +.fa.fa-pull-right {
        +  margin-left: .3em;
        +}
        +/* Deprecated as of 4.4.0 */
        +.pull-right {
        +  float: right;
        +}
        +.pull-left {
        +  float: left;
        +}
        +.fa.pull-left {
        +  margin-right: .3em;
        +}
        +.fa.pull-right {
        +  margin-left: .3em;
        +}
        +.fa-spin {
        +  -webkit-animation: fa-spin 2s infinite linear;
        +  animation: fa-spin 2s infinite linear;
        +}
        +.fa-pulse {
        +  -webkit-animation: fa-spin 1s infinite steps(8);
        +  animation: fa-spin 1s infinite steps(8);
        +}
        +@-webkit-keyframes fa-spin {
        +  0% {
        +    -webkit-transform: rotate(0deg);
        +    transform: rotate(0deg);
        +  }
        +  100% {
        +    -webkit-transform: rotate(359deg);
        +    transform: rotate(359deg);
        +  }
        +}
        +@keyframes fa-spin {
        +  0% {
        +    -webkit-transform: rotate(0deg);
        +    transform: rotate(0deg);
        +  }
        +  100% {
        +    -webkit-transform: rotate(359deg);
        +    transform: rotate(359deg);
        +  }
        +}
        +.fa-rotate-90 {
        +  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
        +  -webkit-transform: rotate(90deg);
        +  -ms-transform: rotate(90deg);
        +  transform: rotate(90deg);
        +}
        +.fa-rotate-180 {
        +  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
        +  -webkit-transform: rotate(180deg);
        +  -ms-transform: rotate(180deg);
        +  transform: rotate(180deg);
        +}
        +.fa-rotate-270 {
        +  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
        +  -webkit-transform: rotate(270deg);
        +  -ms-transform: rotate(270deg);
        +  transform: rotate(270deg);
        +}
        +.fa-flip-horizontal {
        +  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
        +  -webkit-transform: scale(-1, 1);
        +  -ms-transform: scale(-1, 1);
        +  transform: scale(-1, 1);
        +}
        +.fa-flip-vertical {
        +  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
        +  -webkit-transform: scale(1, -1);
        +  -ms-transform: scale(1, -1);
        +  transform: scale(1, -1);
        +}
        +:root .fa-rotate-90,
        +:root .fa-rotate-180,
        +:root .fa-rotate-270,
        +:root .fa-flip-horizontal,
        +:root .fa-flip-vertical {
        +  filter: none;
        +}
        +.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-remove:before,
        +.fa-close:before,
        +.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-photo:before,
        +.fa-image:before,
        +.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,
        +.fa-bar-chart: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-f:before,
        +.fa-facebook:before {
        +  content: "\f09a";
        +}
        +.fa-github:before {
        +  content: "\f09b";
        +}
        +.fa-unlock:before {
        +  content: "\f09c";
        +}
        +.fa-credit-card:before {
        +  content: "\f09d";
        +}
        +.fa-feed:before,
        +.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-navicon:before,
        +.fa-reorder:before,
        +.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-desc:before {
        +  content: "\f0dd";
        +}
        +.fa-sort-up:before,
        +.fa-sort-asc: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-mail-reply-all:before,
        +.fa-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,
        +.fa-gratipay: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";
        +}
        +.fa-space-shuttle:before {
        +  content: "\f197";
        +}
        +.fa-slack:before {
        +  content: "\f198";
        +}
        +.fa-envelope-square:before {
        +  content: "\f199";
        +}
        +.fa-wordpress:before {
        +  content: "\f19a";
        +}
        +.fa-openid:before {
        +  content: "\f19b";
        +}
        +.fa-institution:before,
        +.fa-bank:before,
        +.fa-university:before {
        +  content: "\f19c";
        +}
        +.fa-mortar-board:before,
        +.fa-graduation-cap:before {
        +  content: "\f19d";
        +}
        +.fa-yahoo:before {
        +  content: "\f19e";
        +}
        +.fa-google:before {
        +  content: "\f1a0";
        +}
        +.fa-reddit:before {
        +  content: "\f1a1";
        +}
        +.fa-reddit-square:before {
        +  content: "\f1a2";
        +}
        +.fa-stumbleupon-circle:before {
        +  content: "\f1a3";
        +}
        +.fa-stumbleupon:before {
        +  content: "\f1a4";
        +}
        +.fa-delicious:before {
        +  content: "\f1a5";
        +}
        +.fa-digg:before {
        +  content: "\f1a6";
        +}
        +.fa-pied-piper-pp:before {
        +  content: "\f1a7";
        +}
        +.fa-pied-piper-alt:before {
        +  content: "\f1a8";
        +}
        +.fa-drupal:before {
        +  content: "\f1a9";
        +}
        +.fa-joomla:before {
        +  content: "\f1aa";
        +}
        +.fa-language:before {
        +  content: "\f1ab";
        +}
        +.fa-fax:before {
        +  content: "\f1ac";
        +}
        +.fa-building:before {
        +  content: "\f1ad";
        +}
        +.fa-child:before {
        +  content: "\f1ae";
        +}
        +.fa-paw:before {
        +  content: "\f1b0";
        +}
        +.fa-spoon:before {
        +  content: "\f1b1";
        +}
        +.fa-cube:before {
        +  content: "\f1b2";
        +}
        +.fa-cubes:before {
        +  content: "\f1b3";
        +}
        +.fa-behance:before {
        +  content: "\f1b4";
        +}
        +.fa-behance-square:before {
        +  content: "\f1b5";
        +}
        +.fa-steam:before {
        +  content: "\f1b6";
        +}
        +.fa-steam-square:before {
        +  content: "\f1b7";
        +}
        +.fa-recycle:before {
        +  content: "\f1b8";
        +}
        +.fa-automobile:before,
        +.fa-car:before {
        +  content: "\f1b9";
        +}
        +.fa-cab:before,
        +.fa-taxi:before {
        +  content: "\f1ba";
        +}
        +.fa-tree:before {
        +  content: "\f1bb";
        +}
        +.fa-spotify:before {
        +  content: "\f1bc";
        +}
        +.fa-deviantart:before {
        +  content: "\f1bd";
        +}
        +.fa-soundcloud:before {
        +  content: "\f1be";
        +}
        +.fa-database:before {
        +  content: "\f1c0";
        +}
        +.fa-file-pdf-o:before {
        +  content: "\f1c1";
        +}
        +.fa-file-word-o:before {
        +  content: "\f1c2";
        +}
        +.fa-file-excel-o:before {
        +  content: "\f1c3";
        +}
        +.fa-file-powerpoint-o:before {
        +  content: "\f1c4";
        +}
        +.fa-file-photo-o:before,
        +.fa-file-picture-o:before,
        +.fa-file-image-o:before {
        +  content: "\f1c5";
        +}
        +.fa-file-zip-o:before,
        +.fa-file-archive-o:before {
        +  content: "\f1c6";
        +}
        +.fa-file-sound-o:before,
        +.fa-file-audio-o:before {
        +  content: "\f1c7";
        +}
        +.fa-file-movie-o:before,
        +.fa-file-video-o:before {
        +  content: "\f1c8";
        +}
        +.fa-file-code-o:before {
        +  content: "\f1c9";
        +}
        +.fa-vine:before {
        +  content: "\f1ca";
        +}
        +.fa-codepen:before {
        +  content: "\f1cb";
        +}
        +.fa-jsfiddle:before {
        +  content: "\f1cc";
        +}
        +.fa-life-bouy:before,
        +.fa-life-buoy:before,
        +.fa-life-saver:before,
        +.fa-support:before,
        +.fa-life-ring:before {
        +  content: "\f1cd";
        +}
        +.fa-circle-o-notch:before {
        +  content: "\f1ce";
        +}
        +.fa-ra:before,
        +.fa-resistance:before,
        +.fa-rebel:before {
        +  content: "\f1d0";
        +}
        +.fa-ge:before,
        +.fa-empire:before {
        +  content: "\f1d1";
        +}
        +.fa-git-square:before {
        +  content: "\f1d2";
        +}
        +.fa-git:before {
        +  content: "\f1d3";
        +}
        +.fa-y-combinator-square:before,
        +.fa-yc-square:before,
        +.fa-hacker-news:before {
        +  content: "\f1d4";
        +}
        +.fa-tencent-weibo:before {
        +  content: "\f1d5";
        +}
        +.fa-qq:before {
        +  content: "\f1d6";
        +}
        +.fa-wechat:before,
        +.fa-weixin:before {
        +  content: "\f1d7";
        +}
        +.fa-send:before,
        +.fa-paper-plane:before {
        +  content: "\f1d8";
        +}
        +.fa-send-o:before,
        +.fa-paper-plane-o:before {
        +  content: "\f1d9";
        +}
        +.fa-history:before {
        +  content: "\f1da";
        +}
        +.fa-circle-thin:before {
        +  content: "\f1db";
        +}
        +.fa-header:before {
        +  content: "\f1dc";
        +}
        +.fa-paragraph:before {
        +  content: "\f1dd";
        +}
        +.fa-sliders:before {
        +  content: "\f1de";
        +}
        +.fa-share-alt:before {
        +  content: "\f1e0";
        +}
        +.fa-share-alt-square:before {
        +  content: "\f1e1";
        +}
        +.fa-bomb:before {
        +  content: "\f1e2";
        +}
        +.fa-soccer-ball-o:before,
        +.fa-futbol-o:before {
        +  content: "\f1e3";
        +}
        +.fa-tty:before {
        +  content: "\f1e4";
        +}
        +.fa-binoculars:before {
        +  content: "\f1e5";
        +}
        +.fa-plug:before {
        +  content: "\f1e6";
        +}
        +.fa-slideshare:before {
        +  content: "\f1e7";
        +}
        +.fa-twitch:before {
        +  content: "\f1e8";
        +}
        +.fa-yelp:before {
        +  content: "\f1e9";
        +}
        +.fa-newspaper-o:before {
        +  content: "\f1ea";
        +}
        +.fa-wifi:before {
        +  content: "\f1eb";
        +}
        +.fa-calculator:before {
        +  content: "\f1ec";
        +}
        +.fa-paypal:before {
        +  content: "\f1ed";
        +}
        +.fa-google-wallet:before {
        +  content: "\f1ee";
        +}
        +.fa-cc-visa:before {
        +  content: "\f1f0";
        +}
        +.fa-cc-mastercard:before {
        +  content: "\f1f1";
        +}
        +.fa-cc-discover:before {
        +  content: "\f1f2";
        +}
        +.fa-cc-amex:before {
        +  content: "\f1f3";
        +}
        +.fa-cc-paypal:before {
        +  content: "\f1f4";
        +}
        +.fa-cc-stripe:before {
        +  content: "\f1f5";
        +}
        +.fa-bell-slash:before {
        +  content: "\f1f6";
        +}
        +.fa-bell-slash-o:before {
        +  content: "\f1f7";
        +}
        +.fa-trash:before {
        +  content: "\f1f8";
        +}
        +.fa-copyright:before {
        +  content: "\f1f9";
        +}
        +.fa-at:before {
        +  content: "\f1fa";
        +}
        +.fa-eyedropper:before {
        +  content: "\f1fb";
        +}
        +.fa-paint-brush:before {
        +  content: "\f1fc";
        +}
        +.fa-birthday-cake:before {
        +  content: "\f1fd";
        +}
        +.fa-area-chart:before {
        +  content: "\f1fe";
        +}
        +.fa-pie-chart:before {
        +  content: "\f200";
        +}
        +.fa-line-chart:before {
        +  content: "\f201";
        +}
        +.fa-lastfm:before {
        +  content: "\f202";
        +}
        +.fa-lastfm-square:before {
        +  content: "\f203";
        +}
        +.fa-toggle-off:before {
        +  content: "\f204";
        +}
        +.fa-toggle-on:before {
        +  content: "\f205";
        +}
        +.fa-bicycle:before {
        +  content: "\f206";
        +}
        +.fa-bus:before {
        +  content: "\f207";
        +}
        +.fa-ioxhost:before {
        +  content: "\f208";
        +}
        +.fa-angellist:before {
        +  content: "\f209";
        +}
        +.fa-cc:before {
        +  content: "\f20a";
        +}
        +.fa-shekel:before,
        +.fa-sheqel:before,
        +.fa-ils:before {
        +  content: "\f20b";
        +}
        +.fa-meanpath:before {
        +  content: "\f20c";
        +}
        +.fa-buysellads:before {
        +  content: "\f20d";
        +}
        +.fa-connectdevelop:before {
        +  content: "\f20e";
        +}
        +.fa-dashcube:before {
        +  content: "\f210";
        +}
        +.fa-forumbee:before {
        +  content: "\f211";
        +}
        +.fa-leanpub:before {
        +  content: "\f212";
        +}
        +.fa-sellsy:before {
        +  content: "\f213";
        +}
        +.fa-shirtsinbulk:before {
        +  content: "\f214";
        +}
        +.fa-simplybuilt:before {
        +  content: "\f215";
        +}
        +.fa-skyatlas:before {
        +  content: "\f216";
        +}
        +.fa-cart-plus:before {
        +  content: "\f217";
        +}
        +.fa-cart-arrow-down:before {
        +  content: "\f218";
        +}
        +.fa-diamond:before {
        +  content: "\f219";
        +}
        +.fa-ship:before {
        +  content: "\f21a";
        +}
        +.fa-user-secret:before {
        +  content: "\f21b";
        +}
        +.fa-motorcycle:before {
        +  content: "\f21c";
        +}
        +.fa-street-view:before {
        +  content: "\f21d";
        +}
        +.fa-heartbeat:before {
        +  content: "\f21e";
        +}
        +.fa-venus:before {
        +  content: "\f221";
        +}
        +.fa-mars:before {
        +  content: "\f222";
        +}
        +.fa-mercury:before {
        +  content: "\f223";
        +}
        +.fa-intersex:before,
        +.fa-transgender:before {
        +  content: "\f224";
        +}
        +.fa-transgender-alt:before {
        +  content: "\f225";
        +}
        +.fa-venus-double:before {
        +  content: "\f226";
        +}
        +.fa-mars-double:before {
        +  content: "\f227";
        +}
        +.fa-venus-mars:before {
        +  content: "\f228";
        +}
        +.fa-mars-stroke:before {
        +  content: "\f229";
        +}
        +.fa-mars-stroke-v:before {
        +  content: "\f22a";
        +}
        +.fa-mars-stroke-h:before {
        +  content: "\f22b";
        +}
        +.fa-neuter:before {
        +  content: "\f22c";
        +}
        +.fa-genderless:before {
        +  content: "\f22d";
        +}
        +.fa-facebook-official:before {
        +  content: "\f230";
        +}
        +.fa-pinterest-p:before {
        +  content: "\f231";
        +}
        +.fa-whatsapp:before {
        +  content: "\f232";
        +}
        +.fa-server:before {
        +  content: "\f233";
        +}
        +.fa-user-plus:before {
        +  content: "\f234";
        +}
        +.fa-user-times:before {
        +  content: "\f235";
        +}
        +.fa-hotel:before,
        +.fa-bed:before {
        +  content: "\f236";
        +}
        +.fa-viacoin:before {
        +  content: "\f237";
        +}
        +.fa-train:before {
        +  content: "\f238";
        +}
        +.fa-subway:before {
        +  content: "\f239";
        +}
        +.fa-medium:before {
        +  content: "\f23a";
        +}
        +.fa-yc:before,
        +.fa-y-combinator:before {
        +  content: "\f23b";
        +}
        +.fa-optin-monster:before {
        +  content: "\f23c";
        +}
        +.fa-opencart:before {
        +  content: "\f23d";
        +}
        +.fa-expeditedssl:before {
        +  content: "\f23e";
        +}
        +.fa-battery-4:before,
        +.fa-battery:before,
        +.fa-battery-full:before {
        +  content: "\f240";
        +}
        +.fa-battery-3:before,
        +.fa-battery-three-quarters:before {
        +  content: "\f241";
        +}
        +.fa-battery-2:before,
        +.fa-battery-half:before {
        +  content: "\f242";
        +}
        +.fa-battery-1:before,
        +.fa-battery-quarter:before {
        +  content: "\f243";
        +}
        +.fa-battery-0:before,
        +.fa-battery-empty:before {
        +  content: "\f244";
        +}
        +.fa-mouse-pointer:before {
        +  content: "\f245";
        +}
        +.fa-i-cursor:before {
        +  content: "\f246";
        +}
        +.fa-object-group:before {
        +  content: "\f247";
        +}
        +.fa-object-ungroup:before {
        +  content: "\f248";
        +}
        +.fa-sticky-note:before {
        +  content: "\f249";
        +}
        +.fa-sticky-note-o:before {
        +  content: "\f24a";
        +}
        +.fa-cc-jcb:before {
        +  content: "\f24b";
        +}
        +.fa-cc-diners-club:before {
        +  content: "\f24c";
        +}
        +.fa-clone:before {
        +  content: "\f24d";
        +}
        +.fa-balance-scale:before {
        +  content: "\f24e";
        +}
        +.fa-hourglass-o:before {
        +  content: "\f250";
        +}
        +.fa-hourglass-1:before,
        +.fa-hourglass-start:before {
        +  content: "\f251";
        +}
        +.fa-hourglass-2:before,
        +.fa-hourglass-half:before {
        +  content: "\f252";
        +}
        +.fa-hourglass-3:before,
        +.fa-hourglass-end:before {
        +  content: "\f253";
        +}
        +.fa-hourglass:before {
        +  content: "\f254";
        +}
        +.fa-hand-grab-o:before,
        +.fa-hand-rock-o:before {
        +  content: "\f255";
        +}
        +.fa-hand-stop-o:before,
        +.fa-hand-paper-o:before {
        +  content: "\f256";
        +}
        +.fa-hand-scissors-o:before {
        +  content: "\f257";
        +}
        +.fa-hand-lizard-o:before {
        +  content: "\f258";
        +}
        +.fa-hand-spock-o:before {
        +  content: "\f259";
        +}
        +.fa-hand-pointer-o:before {
        +  content: "\f25a";
        +}
        +.fa-hand-peace-o:before {
        +  content: "\f25b";
        +}
        +.fa-trademark:before {
        +  content: "\f25c";
        +}
        +.fa-registered:before {
        +  content: "\f25d";
        +}
        +.fa-creative-commons:before {
        +  content: "\f25e";
        +}
        +.fa-gg:before {
        +  content: "\f260";
        +}
        +.fa-gg-circle:before {
        +  content: "\f261";
        +}
        +.fa-tripadvisor:before {
        +  content: "\f262";
        +}
        +.fa-odnoklassniki:before {
        +  content: "\f263";
        +}
        +.fa-odnoklassniki-square:before {
        +  content: "\f264";
        +}
        +.fa-get-pocket:before {
        +  content: "\f265";
        +}
        +.fa-wikipedia-w:before {
        +  content: "\f266";
        +}
        +.fa-safari:before {
        +  content: "\f267";
        +}
        +.fa-chrome:before {
        +  content: "\f268";
        +}
        +.fa-firefox:before {
        +  content: "\f269";
        +}
        +.fa-opera:before {
        +  content: "\f26a";
        +}
        +.fa-internet-explorer:before {
        +  content: "\f26b";
        +}
        +.fa-tv:before,
        +.fa-television:before {
        +  content: "\f26c";
        +}
        +.fa-contao:before {
        +  content: "\f26d";
        +}
        +.fa-500px:before {
        +  content: "\f26e";
        +}
        +.fa-amazon:before {
        +  content: "\f270";
        +}
        +.fa-calendar-plus-o:before {
        +  content: "\f271";
        +}
        +.fa-calendar-minus-o:before {
        +  content: "\f272";
        +}
        +.fa-calendar-times-o:before {
        +  content: "\f273";
        +}
        +.fa-calendar-check-o:before {
        +  content: "\f274";
        +}
        +.fa-industry:before {
        +  content: "\f275";
        +}
        +.fa-map-pin:before {
        +  content: "\f276";
        +}
        +.fa-map-signs:before {
        +  content: "\f277";
        +}
        +.fa-map-o:before {
        +  content: "\f278";
        +}
        +.fa-map:before {
        +  content: "\f279";
        +}
        +.fa-commenting:before {
        +  content: "\f27a";
        +}
        +.fa-commenting-o:before {
        +  content: "\f27b";
        +}
        +.fa-houzz:before {
        +  content: "\f27c";
        +}
        +.fa-vimeo:before {
        +  content: "\f27d";
        +}
        +.fa-black-tie:before {
        +  content: "\f27e";
        +}
        +.fa-fonticons:before {
        +  content: "\f280";
        +}
        +.fa-reddit-alien:before {
        +  content: "\f281";
        +}
        +.fa-edge:before {
        +  content: "\f282";
        +}
        +.fa-credit-card-alt:before {
        +  content: "\f283";
        +}
        +.fa-codiepie:before {
        +  content: "\f284";
        +}
        +.fa-modx:before {
        +  content: "\f285";
        +}
        +.fa-fort-awesome:before {
        +  content: "\f286";
        +}
        +.fa-usb:before {
        +  content: "\f287";
        +}
        +.fa-product-hunt:before {
        +  content: "\f288";
        +}
        +.fa-mixcloud:before {
        +  content: "\f289";
        +}
        +.fa-scribd:before {
        +  content: "\f28a";
        +}
        +.fa-pause-circle:before {
        +  content: "\f28b";
        +}
        +.fa-pause-circle-o:before {
        +  content: "\f28c";
        +}
        +.fa-stop-circle:before {
        +  content: "\f28d";
        +}
        +.fa-stop-circle-o:before {
        +  content: "\f28e";
        +}
        +.fa-shopping-bag:before {
        +  content: "\f290";
        +}
        +.fa-shopping-basket:before {
        +  content: "\f291";
        +}
        +.fa-hashtag:before {
        +  content: "\f292";
        +}
        +.fa-bluetooth:before {
        +  content: "\f293";
        +}
        +.fa-bluetooth-b:before {
        +  content: "\f294";
        +}
        +.fa-percent:before {
        +  content: "\f295";
        +}
        +.fa-gitlab:before {
        +  content: "\f296";
        +}
        +.fa-wpbeginner:before {
        +  content: "\f297";
        +}
        +.fa-wpforms:before {
        +  content: "\f298";
        +}
        +.fa-envira:before {
        +  content: "\f299";
        +}
        +.fa-universal-access:before {
        +  content: "\f29a";
        +}
        +.fa-wheelchair-alt:before {
        +  content: "\f29b";
        +}
        +.fa-question-circle-o:before {
        +  content: "\f29c";
        +}
        +.fa-blind:before {
        +  content: "\f29d";
        +}
        +.fa-audio-description:before {
        +  content: "\f29e";
        +}
        +.fa-volume-control-phone:before {
        +  content: "\f2a0";
        +}
        +.fa-braille:before {
        +  content: "\f2a1";
        +}
        +.fa-assistive-listening-systems:before {
        +  content: "\f2a2";
        +}
        +.fa-asl-interpreting:before,
        +.fa-american-sign-language-interpreting:before {
        +  content: "\f2a3";
        +}
        +.fa-deafness:before,
        +.fa-hard-of-hearing:before,
        +.fa-deaf:before {
        +  content: "\f2a4";
        +}
        +.fa-glide:before {
        +  content: "\f2a5";
        +}
        +.fa-glide-g:before {
        +  content: "\f2a6";
        +}
        +.fa-signing:before,
        +.fa-sign-language:before {
        +  content: "\f2a7";
        +}
        +.fa-low-vision:before {
        +  content: "\f2a8";
        +}
        +.fa-viadeo:before {
        +  content: "\f2a9";
        +}
        +.fa-viadeo-square:before {
        +  content: "\f2aa";
        +}
        +.fa-snapchat:before {
        +  content: "\f2ab";
        +}
        +.fa-snapchat-ghost:before {
        +  content: "\f2ac";
        +}
        +.fa-snapchat-square:before {
        +  content: "\f2ad";
        +}
        +.fa-pied-piper:before {
        +  content: "\f2ae";
        +}
        +.fa-first-order:before {
        +  content: "\f2b0";
        +}
        +.fa-yoast:before {
        +  content: "\f2b1";
        +}
        +.fa-themeisle:before {
        +  content: "\f2b2";
        +}
        +.fa-google-plus-circle:before,
        +.fa-google-plus-official:before {
        +  content: "\f2b3";
        +}
        +.fa-fa:before,
        +.fa-font-awesome:before {
        +  content: "\f2b4";
        +}
        +.fa-handshake-o:before {
        +  content: "\f2b5";
        +}
        +.fa-envelope-open:before {
        +  content: "\f2b6";
        +}
        +.fa-envelope-open-o:before {
        +  content: "\f2b7";
        +}
        +.fa-linode:before {
        +  content: "\f2b8";
        +}
        +.fa-address-book:before {
        +  content: "\f2b9";
        +}
        +.fa-address-book-o:before {
        +  content: "\f2ba";
        +}
        +.fa-vcard:before,
        +.fa-address-card:before {
        +  content: "\f2bb";
        +}
        +.fa-vcard-o:before,
        +.fa-address-card-o:before {
        +  content: "\f2bc";
        +}
        +.fa-user-circle:before {
        +  content: "\f2bd";
        +}
        +.fa-user-circle-o:before {
        +  content: "\f2be";
        +}
        +.fa-user-o:before {
        +  content: "\f2c0";
        +}
        +.fa-id-badge:before {
        +  content: "\f2c1";
        +}
        +.fa-drivers-license:before,
        +.fa-id-card:before {
        +  content: "\f2c2";
        +}
        +.fa-drivers-license-o:before,
        +.fa-id-card-o:before {
        +  content: "\f2c3";
        +}
        +.fa-quora:before {
        +  content: "\f2c4";
        +}
        +.fa-free-code-camp:before {
        +  content: "\f2c5";
        +}
        +.fa-telegram:before {
        +  content: "\f2c6";
        +}
        +.fa-thermometer-4:before,
        +.fa-thermometer:before,
        +.fa-thermometer-full:before {
        +  content: "\f2c7";
        +}
        +.fa-thermometer-3:before,
        +.fa-thermometer-three-quarters:before {
        +  content: "\f2c8";
        +}
        +.fa-thermometer-2:before,
        +.fa-thermometer-half:before {
        +  content: "\f2c9";
        +}
        +.fa-thermometer-1:before,
        +.fa-thermometer-quarter:before {
        +  content: "\f2ca";
        +}
        +.fa-thermometer-0:before,
        +.fa-thermometer-empty:before {
        +  content: "\f2cb";
        +}
        +.fa-shower:before {
        +  content: "\f2cc";
        +}
        +.fa-bathtub:before,
        +.fa-s15:before,
        +.fa-bath:before {
        +  content: "\f2cd";
        +}
        +.fa-podcast:before {
        +  content: "\f2ce";
        +}
        +.fa-window-maximize:before {
        +  content: "\f2d0";
        +}
        +.fa-window-minimize:before {
        +  content: "\f2d1";
        +}
        +.fa-window-restore:before {
        +  content: "\f2d2";
        +}
        +.fa-times-rectangle:before,
        +.fa-window-close:before {
        +  content: "\f2d3";
        +}
        +.fa-times-rectangle-o:before,
        +.fa-window-close-o:before {
        +  content: "\f2d4";
        +}
        +.fa-bandcamp:before {
        +  content: "\f2d5";
        +}
        +.fa-grav:before {
        +  content: "\f2d6";
        +}
        +.fa-etsy:before {
        +  content: "\f2d7";
        +}
        +.fa-imdb:before {
        +  content: "\f2d8";
        +}
        +.fa-ravelry:before {
        +  content: "\f2d9";
        +}
        +.fa-eercast:before {
        +  content: "\f2da";
        +}
        +.fa-microchip:before {
        +  content: "\f2db";
        +}
        +.fa-snowflake-o:before {
        +  content: "\f2dc";
        +}
        +.fa-superpowers:before {
        +  content: "\f2dd";
        +}
        +.fa-wpexplorer:before {
        +  content: "\f2de";
        +}
        +.fa-meetup:before {
        +  content: "\f2e0";
        +}
        +.sr-only {
        +  position: absolute;
        +  width: 1px;
        +  height: 1px;
        +  padding: 0;
        +  margin: -1px;
        +  overflow: hidden;
        +  clip: rect(0, 0, 0, 0);
        +  border: 0;
        +}
        +.sr-only-focusable:active,
        +.sr-only-focusable:focus {
        +  position: static;
        +  width: auto;
        +  height: auto;
        +  margin: 0;
        +  overflow: visible;
        +  clip: auto;
        +}
        diff --git a/resources/assets/css/font-awesome/font-awesome.min.css b/resources/assets/css/font-awesome/font-awesome.min.css
        new file mode 100644
        index 0000000000..540440ce89
        --- /dev/null
        +++ b/resources/assets/css/font-awesome/font-awesome.min.css
        @@ -0,0 +1,4 @@
        +/*!
        + *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
        + *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
        + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.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.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.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:#fff}.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-remove:before,.fa-close:before,.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-photo:before,.fa-image:before,.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,.fa-bar-chart: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-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.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-navicon:before,.fa-reorder:before,.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-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc: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-mail-reply-all:before,.fa-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,.fa-gratipay: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"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
        diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js
        index baf9081b89..cdf9b71421 100755
        --- a/resources/assets/js/app.js
        +++ b/resources/assets/js/app.js
        @@ -184,9 +184,11 @@ $(function () {
         
           //Activate Bootstrap tooltip
           if (o.enableBSToppltip) {
        +      $.widget.bridge('uitooltip', $.ui.tooltip);
             $('body').tooltip({
               selector: o.BSTooltipSelector
             });
        +
           }
         
           //Activate box widget
        @@ -691,65 +693,3 @@ function _init() {
           };
         
         })(jQuery);
        -
        -/*
        - * TODO LIST CUSTOM PLUGIN
        - * -----------------------
        - * This plugin depends on iCheck plugin for checkbox and radio inputs
        - *
        - * @type plugin
        - * @usage $("#todo-widget").todolist( options );
        - */
        -(function ($) {
        -
        -  'use strict';
        -
        -  $.fn.todolist = function (options) {
        -    // Render options
        -    var settings = $.extend({
        -      //When the user checks the input
        -      onCheck: function (ele) {
        -        return ele;
        -      },
        -      //When the user unchecks the input
        -      onUncheck: function (ele) {
        -        return ele;
        -      }
        -    }, options);
        -
        -    return this.each(function () {
        -
        -      if (typeof $.fn.iCheck != 'undefined') {
        -        $('input', this).on('ifChecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onCheck.call(ele);
        -        });
        -
        -        $('input', this).on('ifUnchecked', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          settings.onUncheck.call(ele);
        -        });
        -      } else {
        -        $('input', this).on('change', function () {
        -          var ele = $(this).parents("li").first();
        -          ele.toggleClass("done");
        -          if ($('input', ele).is(":checked")) {
        -            settings.onCheck.call(ele);
        -          } else {
        -            settings.onUncheck.call(ele);
        -          }
        -        });
        -      }
        -    });
        -  };
        -}(jQuery));
        -
        -//-------------
        -//- PIE CHART -
        -//-------------
        -// Get context with jQuery - using jQuery's .get() method.
        -
        -
        -
        diff --git a/resources/assets/js/bootstrap-js.js b/resources/assets/js/bootstrap-js.js
        new file mode 100644
        index 0000000000..01fbbcbaa9
        --- /dev/null
        +++ b/resources/assets/js/bootstrap-js.js
        @@ -0,0 +1,2363 @@
        +/*!
        + * Bootstrap v3.3.6 (http://getbootstrap.com)
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under the MIT license
        + */
        +
        +if (typeof jQuery === 'undefined') {
        +  throw new Error('Bootstrap\'s JavaScript requires jQuery')
        +}
        +
        ++function ($) {
        +  'use strict';
        +  var version = $.fn.jquery.split(' ')[0].split('.')
        +  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {
        +    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
        +  }
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: transition.js v3.3.6
        + * http://getbootstrap.com/javascript/#transitions
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
        +  // ============================================================
        +
        +  function transitionEnd() {
        +    var el = document.createElement('bootstrap')
        +
        +    var transEndEventNames = {
        +      WebkitTransition : 'webkitTransitionEnd',
        +      MozTransition    : 'transitionend',
        +      OTransition      : 'oTransitionEnd otransitionend',
        +      transition       : 'transitionend'
        +    }
        +
        +    for (var name in transEndEventNames) {
        +      if (el.style[name] !== undefined) {
        +        return { end: transEndEventNames[name] }
        +      }
        +    }
        +
        +    return false // explicit for ie8 (  ._.)
        +  }
        +
        +  // http://blog.alexmaccaw.com/css-transitions
        +  $.fn.emulateTransitionEnd = function (duration) {
        +    var called = false
        +    var $el = this
        +    $(this).one('bsTransitionEnd', function () { called = true })
        +    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
        +    setTimeout(callback, duration)
        +    return this
        +  }
        +
        +  $(function () {
        +    $.support.transition = transitionEnd()
        +
        +    if (!$.support.transition) return
        +
        +    $.event.special.bsTransitionEnd = {
        +      bindType: $.support.transition.end,
        +      delegateType: $.support.transition.end,
        +      handle: function (e) {
        +        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
        +      }
        +    }
        +  })
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: alert.js v3.3.6
        + * http://getbootstrap.com/javascript/#alerts
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // ALERT CLASS DEFINITION
        +  // ======================
        +
        +  var dismiss = '[data-dismiss="alert"]'
        +  var Alert   = function (el) {
        +    $(el).on('click', dismiss, this.close)
        +  }
        +
        +  Alert.VERSION = '3.3.6'
        +
        +  Alert.TRANSITION_DURATION = 150
        +
        +  Alert.prototype.close = function (e) {
        +    var $this    = $(this)
        +    var selector = $this.attr('data-target')
        +
        +    if (!selector) {
        +      selector = $this.attr('href')
        +      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        +    }
        +
        +    var $parent = $(selector)
        +
        +    if (e) e.preventDefault()
        +
        +    if (!$parent.length) {
        +      $parent = $this.closest('.alert')
        +    }
        +
        +    $parent.trigger(e = $.Event('close.bs.alert'))
        +
        +    if (e.isDefaultPrevented()) return
        +
        +    $parent.removeClass('in')
        +
        +    function removeElement() {
        +      // detach from parent, fire event then clean up data
        +      $parent.detach().trigger('closed.bs.alert').remove()
        +    }
        +
        +    $.support.transition && $parent.hasClass('fade') ?
        +      $parent
        +        .one('bsTransitionEnd', removeElement)
        +        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
        +      removeElement()
        +  }
        +
        +
        +  // ALERT PLUGIN DEFINITION
        +  // =======================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this = $(this)
        +      var data  = $this.data('bs.alert')
        +
        +      if (!data) $this.data('bs.alert', (data = new Alert(this)))
        +      if (typeof option == 'string') data[option].call($this)
        +    })
        +  }
        +
        +  var old = $.fn.alert
        +
        +  $.fn.alert             = Plugin
        +  $.fn.alert.Constructor = Alert
        +
        +
        +  // ALERT NO CONFLICT
        +  // =================
        +
        +  $.fn.alert.noConflict = function () {
        +    $.fn.alert = old
        +    return this
        +  }
        +
        +
        +  // ALERT DATA-API
        +  // ==============
        +
        +  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: button.js v3.3.6
        + * http://getbootstrap.com/javascript/#buttons
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // BUTTON PUBLIC CLASS DEFINITION
        +  // ==============================
        +
        +  var Button = function (element, options) {
        +    this.$element  = $(element)
        +    this.options   = $.extend({}, Button.DEFAULTS, options)
        +    this.isLoading = false
        +  }
        +
        +  Button.VERSION  = '3.3.6'
        +
        +  Button.DEFAULTS = {
        +    loadingText: 'loading...'
        +  }
        +
        +  Button.prototype.setState = function (state) {
        +    var d    = 'disabled'
        +    var $el  = this.$element
        +    var val  = $el.is('input') ? 'val' : 'html'
        +    var data = $el.data()
        +
        +    state += 'Text'
        +
        +    if (data.resetText == null) $el.data('resetText', $el[val]())
        +
        +    // push to event loop to allow forms to submit
        +    setTimeout($.proxy(function () {
        +      $el[val](data[state] == null ? this.options[state] : data[state])
        +
        +      if (state == 'loadingText') {
        +        this.isLoading = true
        +        $el.addClass(d).attr(d, d)
        +      } else if (this.isLoading) {
        +        this.isLoading = false
        +        $el.removeClass(d).removeAttr(d)
        +      }
        +    }, this), 0)
        +  }
        +
        +  Button.prototype.toggle = function () {
        +    var changed = true
        +    var $parent = this.$element.closest('[data-toggle="buttons"]')
        +
        +    if ($parent.length) {
        +      var $input = this.$element.find('input')
        +      if ($input.prop('type') == 'radio') {
        +        if ($input.prop('checked')) changed = false
        +        $parent.find('.active').removeClass('active')
        +        this.$element.addClass('active')
        +      } else if ($input.prop('type') == 'checkbox') {
        +        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
        +        this.$element.toggleClass('active')
        +      }
        +      $input.prop('checked', this.$element.hasClass('active'))
        +      if (changed) $input.trigger('change')
        +    } else {
        +      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
        +      this.$element.toggleClass('active')
        +    }
        +  }
        +
        +
        +  // BUTTON PLUGIN DEFINITION
        +  // ========================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.button')
        +      var options = typeof option == 'object' && option
        +
        +      if (!data) $this.data('bs.button', (data = new Button(this, options)))
        +
        +      if (option == 'toggle') data.toggle()
        +      else if (option) data.setState(option)
        +    })
        +  }
        +
        +  var old = $.fn.button
        +
        +  $.fn.button             = Plugin
        +  $.fn.button.Constructor = Button
        +
        +
        +  // BUTTON NO CONFLICT
        +  // ==================
        +
        +  $.fn.button.noConflict = function () {
        +    $.fn.button = old
        +    return this
        +  }
        +
        +
        +  // BUTTON DATA-API
        +  // ===============
        +
        +  $(document)
        +    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        +      var $btn = $(e.target)
        +      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
        +      Plugin.call($btn, 'toggle')
        +      if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
        +    })
        +    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        +      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
        +    })
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: carousel.js v3.3.6
        + * http://getbootstrap.com/javascript/#carousel
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // CAROUSEL CLASS DEFINITION
        +  // =========================
        +
        +  var Carousel = function (element, options) {
        +    this.$element    = $(element)
        +    this.$indicators = this.$element.find('.carousel-indicators')
        +    this.options     = options
        +    this.paused      = null
        +    this.sliding     = null
        +    this.interval    = null
        +    this.$active     = null
        +    this.$items      = null
        +
        +    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
        +
        +    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
        +      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
        +      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
        +  }
        +
        +  Carousel.VERSION  = '3.3.6'
        +
        +  Carousel.TRANSITION_DURATION = 600
        +
        +  Carousel.DEFAULTS = {
        +    interval: 5000,
        +    pause: 'hover',
        +    wrap: true,
        +    keyboard: true
        +  }
        +
        +  Carousel.prototype.keydown = function (e) {
        +    if (/input|textarea/i.test(e.target.tagName)) return
        +    switch (e.which) {
        +      case 37: this.prev(); break
        +      case 39: this.next(); break
        +      default: return
        +    }
        +
        +    e.preventDefault()
        +  }
        +
        +  Carousel.prototype.cycle = function (e) {
        +    e || (this.paused = false)
        +
        +    this.interval && clearInterval(this.interval)
        +
        +    this.options.interval
        +      && !this.paused
        +      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
        +
        +    return this
        +  }
        +
        +  Carousel.prototype.getItemIndex = function (item) {
        +    this.$items = item.parent().children('.item')
        +    return this.$items.index(item || this.$active)
        +  }
        +
        +  Carousel.prototype.getItemForDirection = function (direction, active) {
        +    var activeIndex = this.getItemIndex(active)
        +    var willWrap = (direction == 'prev' && activeIndex === 0)
        +                || (direction == 'next' && activeIndex == (this.$items.length - 1))
        +    if (willWrap && !this.options.wrap) return active
        +    var delta = direction == 'prev' ? -1 : 1
        +    var itemIndex = (activeIndex + delta) % this.$items.length
        +    return this.$items.eq(itemIndex)
        +  }
        +
        +  Carousel.prototype.to = function (pos) {
        +    var that        = this
        +    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
        +
        +    if (pos > (this.$items.length - 1) || pos < 0) return
        +
        +    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
        +    if (activeIndex == pos) return this.pause().cycle()
        +
        +    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
        +  }
        +
        +  Carousel.prototype.pause = function (e) {
        +    e || (this.paused = true)
        +
        +    if (this.$element.find('.next, .prev').length && $.support.transition) {
        +      this.$element.trigger($.support.transition.end)
        +      this.cycle(true)
        +    }
        +
        +    this.interval = clearInterval(this.interval)
        +
        +    return this
        +  }
        +
        +  Carousel.prototype.next = function () {
        +    if (this.sliding) return
        +    return this.slide('next')
        +  }
        +
        +  Carousel.prototype.prev = function () {
        +    if (this.sliding) return
        +    return this.slide('prev')
        +  }
        +
        +  Carousel.prototype.slide = function (type, next) {
        +    var $active   = this.$element.find('.item.active')
        +    var $next     = next || this.getItemForDirection(type, $active)
        +    var isCycling = this.interval
        +    var direction = type == 'next' ? 'left' : 'right'
        +    var that      = this
        +
        +    if ($next.hasClass('active')) return (this.sliding = false)
        +
        +    var relatedTarget = $next[0]
        +    var slideEvent = $.Event('slide.bs.carousel', {
        +      relatedTarget: relatedTarget,
        +      direction: direction
        +    })
        +    this.$element.trigger(slideEvent)
        +    if (slideEvent.isDefaultPrevented()) return
        +
        +    this.sliding = true
        +
        +    isCycling && this.pause()
        +
        +    if (this.$indicators.length) {
        +      this.$indicators.find('.active').removeClass('active')
        +      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
        +      $nextIndicator && $nextIndicator.addClass('active')
        +    }
        +
        +    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
        +    if ($.support.transition && this.$element.hasClass('slide')) {
        +      $next.addClass(type)
        +      $next[0].offsetWidth // force reflow
        +      $active.addClass(direction)
        +      $next.addClass(direction)
        +      $active
        +        .one('bsTransitionEnd', function () {
        +          $next.removeClass([type, direction].join(' ')).addClass('active')
        +          $active.removeClass(['active', direction].join(' '))
        +          that.sliding = false
        +          setTimeout(function () {
        +            that.$element.trigger(slidEvent)
        +          }, 0)
        +        })
        +        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
        +    } else {
        +      $active.removeClass('active')
        +      $next.addClass('active')
        +      this.sliding = false
        +      this.$element.trigger(slidEvent)
        +    }
        +
        +    isCycling && this.cycle()
        +
        +    return this
        +  }
        +
        +
        +  // CAROUSEL PLUGIN DEFINITION
        +  // ==========================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.carousel')
        +      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
        +      var action  = typeof option == 'string' ? option : options.slide
        +
        +      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
        +      if (typeof option == 'number') data.to(option)
        +      else if (action) data[action]()
        +      else if (options.interval) data.pause().cycle()
        +    })
        +  }
        +
        +  var old = $.fn.carousel
        +
        +  $.fn.carousel             = Plugin
        +  $.fn.carousel.Constructor = Carousel
        +
        +
        +  // CAROUSEL NO CONFLICT
        +  // ====================
        +
        +  $.fn.carousel.noConflict = function () {
        +    $.fn.carousel = old
        +    return this
        +  }
        +
        +
        +  // CAROUSEL DATA-API
        +  // =================
        +
        +  var clickHandler = function (e) {
        +    var href
        +    var $this   = $(this)
        +    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
        +    if (!$target.hasClass('carousel')) return
        +    var options = $.extend({}, $target.data(), $this.data())
        +    var slideIndex = $this.attr('data-slide-to')
        +    if (slideIndex) options.interval = false
        +
        +    Plugin.call($target, options)
        +
        +    if (slideIndex) {
        +      $target.data('bs.carousel').to(slideIndex)
        +    }
        +
        +    e.preventDefault()
        +  }
        +
        +  $(document)
        +    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
        +    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
        +
        +  $(window).on('load', function () {
        +    $('[data-ride="carousel"]').each(function () {
        +      var $carousel = $(this)
        +      Plugin.call($carousel, $carousel.data())
        +    })
        +  })
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: collapse.js v3.3.6
        + * http://getbootstrap.com/javascript/#collapse
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // COLLAPSE PUBLIC CLASS DEFINITION
        +  // ================================
        +
        +  var Collapse = function (element, options) {
        +    this.$element      = $(element)
        +    this.options       = $.extend({}, Collapse.DEFAULTS, options)
        +    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
        +                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
        +    this.transitioning = null
        +
        +    if (this.options.parent) {
        +      this.$parent = this.getParent()
        +    } else {
        +      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
        +    }
        +
        +    if (this.options.toggle) this.toggle()
        +  }
        +
        +  Collapse.VERSION  = '3.3.6'
        +
        +  Collapse.TRANSITION_DURATION = 350
        +
        +  Collapse.DEFAULTS = {
        +    toggle: true
        +  }
        +
        +  Collapse.prototype.dimension = function () {
        +    var hasWidth = this.$element.hasClass('width')
        +    return hasWidth ? 'width' : 'height'
        +  }
        +
        +  Collapse.prototype.show = function () {
        +    if (this.transitioning || this.$element.hasClass('in')) return
        +
        +    var activesData
        +    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
        +
        +    if (actives && actives.length) {
        +      activesData = actives.data('bs.collapse')
        +      if (activesData && activesData.transitioning) return
        +    }
        +
        +    var startEvent = $.Event('show.bs.collapse')
        +    this.$element.trigger(startEvent)
        +    if (startEvent.isDefaultPrevented()) return
        +
        +    if (actives && actives.length) {
        +      Plugin.call(actives, 'hide')
        +      activesData || actives.data('bs.collapse', null)
        +    }
        +
        +    var dimension = this.dimension()
        +
        +    this.$element
        +      .removeClass('collapse')
        +      .addClass('collapsing')[dimension](0)
        +      .attr('aria-expanded', true)
        +
        +    this.$trigger
        +      .removeClass('collapsed')
        +      .attr('aria-expanded', true)
        +
        +    this.transitioning = 1
        +
        +    var complete = function () {
        +      this.$element
        +        .removeClass('collapsing')
        +        .addClass('collapse in')[dimension]('')
        +      this.transitioning = 0
        +      this.$element
        +        .trigger('shown.bs.collapse')
        +    }
        +
        +    if (!$.support.transition) return complete.call(this)
        +
        +    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
        +
        +    this.$element
        +      .one('bsTransitionEnd', $.proxy(complete, this))
        +      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
        +  }
        +
        +  Collapse.prototype.hide = function () {
        +    if (this.transitioning || !this.$element.hasClass('in')) return
        +
        +    var startEvent = $.Event('hide.bs.collapse')
        +    this.$element.trigger(startEvent)
        +    if (startEvent.isDefaultPrevented()) return
        +
        +    var dimension = this.dimension()
        +
        +    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
        +
        +    this.$element
        +      .addClass('collapsing')
        +      .removeClass('collapse in')
        +      .attr('aria-expanded', false)
        +
        +    this.$trigger
        +      .addClass('collapsed')
        +      .attr('aria-expanded', false)
        +
        +    this.transitioning = 1
        +
        +    var complete = function () {
        +      this.transitioning = 0
        +      this.$element
        +        .removeClass('collapsing')
        +        .addClass('collapse')
        +        .trigger('hidden.bs.collapse')
        +    }
        +
        +    if (!$.support.transition) return complete.call(this)
        +
        +    this.$element
        +      [dimension](0)
        +      .one('bsTransitionEnd', $.proxy(complete, this))
        +      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
        +  }
        +
        +  Collapse.prototype.toggle = function () {
        +    this[this.$element.hasClass('in') ? 'hide' : 'show']()
        +  }
        +
        +  Collapse.prototype.getParent = function () {
        +    return $(this.options.parent)
        +      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
        +      .each($.proxy(function (i, element) {
        +        var $element = $(element)
        +        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
        +      }, this))
        +      .end()
        +  }
        +
        +  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
        +    var isOpen = $element.hasClass('in')
        +
        +    $element.attr('aria-expanded', isOpen)
        +    $trigger
        +      .toggleClass('collapsed', !isOpen)
        +      .attr('aria-expanded', isOpen)
        +  }
        +
        +  function getTargetFromTrigger($trigger) {
        +    var href
        +    var target = $trigger.attr('data-target')
        +      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
        +
        +    return $(target)
        +  }
        +
        +
        +  // COLLAPSE PLUGIN DEFINITION
        +  // ==========================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.collapse')
        +      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
        +
        +      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
        +      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
        +      if (typeof option == 'string') data[option]()
        +    })
        +  }
        +
        +  var old = $.fn.collapse
        +
        +  $.fn.collapse             = Plugin
        +  $.fn.collapse.Constructor = Collapse
        +
        +
        +  // COLLAPSE NO CONFLICT
        +  // ====================
        +
        +  $.fn.collapse.noConflict = function () {
        +    $.fn.collapse = old
        +    return this
        +  }
        +
        +
        +  // COLLAPSE DATA-API
        +  // =================
        +
        +  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
        +    var $this   = $(this)
        +
        +    if (!$this.attr('data-target')) e.preventDefault()
        +
        +    var $target = getTargetFromTrigger($this)
        +    var data    = $target.data('bs.collapse')
        +    var option  = data ? 'toggle' : $this.data()
        +
        +    Plugin.call($target, option)
        +  })
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: dropdown.js v3.3.6
        + * http://getbootstrap.com/javascript/#dropdowns
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // DROPDOWN CLASS DEFINITION
        +  // =========================
        +
        +  var backdrop = '.dropdown-backdrop'
        +  var toggle   = '[data-toggle="dropdown"]'
        +  var Dropdown = function (element) {
        +    $(element).on('click.bs.dropdown', this.toggle)
        +  }
        +
        +  Dropdown.VERSION = '3.3.6'
        +
        +  function getParent($this) {
        +    var selector = $this.attr('data-target')
        +
        +    if (!selector) {
        +      selector = $this.attr('href')
        +      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        +    }
        +
        +    var $parent = selector && $(selector)
        +
        +    return $parent && $parent.length ? $parent : $this.parent()
        +  }
        +
        +  function clearMenus(e) {
        +    if (e && e.which === 3) return
        +    $(backdrop).remove()
        +    $(toggle).each(function () {
        +      var $this         = $(this)
        +      var $parent       = getParent($this)
        +      var relatedTarget = { relatedTarget: this }
        +
        +      if (!$parent.hasClass('open')) return
        +
        +      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
        +
        +      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
        +
        +      if (e.isDefaultPrevented()) return
        +
        +      $this.attr('aria-expanded', 'false')
        +      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
        +    })
        +  }
        +
        +  Dropdown.prototype.toggle = function (e) {
        +    var $this = $(this)
        +
        +    if ($this.is('.disabled, :disabled')) return
        +
        +    var $parent  = getParent($this)
        +    var isActive = $parent.hasClass('open')
        +
        +    clearMenus()
        +
        +    if (!isActive) {
        +      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        +        // if mobile we use a backdrop because click events don't delegate
        +        $(document.createElement('div'))
        +          .addClass('dropdown-backdrop')
        +          .insertAfter($(this))
        +          .on('click', clearMenus)
        +      }
        +
        +      var relatedTarget = { relatedTarget: this }
        +      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
        +
        +      if (e.isDefaultPrevented()) return
        +
        +      $this
        +        .trigger('focus')
        +        .attr('aria-expanded', 'true')
        +
        +      $parent
        +        .toggleClass('open')
        +        .trigger($.Event('shown.bs.dropdown', relatedTarget))
        +    }
        +
        +    return false
        +  }
        +
        +  Dropdown.prototype.keydown = function (e) {
        +    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
        +
        +    var $this = $(this)
        +
        +    e.preventDefault()
        +    e.stopPropagation()
        +
        +    if ($this.is('.disabled, :disabled')) return
        +
        +    var $parent  = getParent($this)
        +    var isActive = $parent.hasClass('open')
        +
        +    if (!isActive && e.which != 27 || isActive && e.which == 27) {
        +      if (e.which == 27) $parent.find(toggle).trigger('focus')
        +      return $this.trigger('click')
        +    }
        +
        +    var desc = ' li:not(.disabled):visible a'
        +    var $items = $parent.find('.dropdown-menu' + desc)
        +
        +    if (!$items.length) return
        +
        +    var index = $items.index(e.target)
        +
        +    if (e.which == 38 && index > 0)                 index--         // up
        +    if (e.which == 40 && index < $items.length - 1) index++         // down
        +    if (!~index)                                    index = 0
        +
        +    $items.eq(index).trigger('focus')
        +  }
        +
        +
        +  // DROPDOWN PLUGIN DEFINITION
        +  // ==========================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this = $(this)
        +      var data  = $this.data('bs.dropdown')
        +
        +      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
        +      if (typeof option == 'string') data[option].call($this)
        +    })
        +  }
        +
        +  var old = $.fn.dropdown
        +
        +  $.fn.dropdown             = Plugin
        +  $.fn.dropdown.Constructor = Dropdown
        +
        +
        +  // DROPDOWN NO CONFLICT
        +  // ====================
        +
        +  $.fn.dropdown.noConflict = function () {
        +    $.fn.dropdown = old
        +    return this
        +  }
        +
        +
        +  // APPLY TO STANDARD DROPDOWN ELEMENTS
        +  // ===================================
        +
        +  $(document)
        +    .on('click.bs.dropdown.data-api', clearMenus)
        +    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
        +    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
        +    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
        +    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: modal.js v3.3.6
        + * http://getbootstrap.com/javascript/#modals
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // MODAL CLASS DEFINITION
        +  // ======================
        +
        +  var Modal = function (element, options) {
        +    this.options             = options
        +    this.$body               = $(document.body)
        +    this.$element            = $(element)
        +    this.$dialog             = this.$element.find('.modal-dialog')
        +    this.$backdrop           = null
        +    this.isShown             = null
        +    this.originalBodyPad     = null
        +    this.scrollbarWidth      = 0
        +    this.ignoreBackdropClick = false
        +
        +    if (this.options.remote) {
        +      this.$element
        +        .find('.modal-content')
        +        .load(this.options.remote, $.proxy(function () {
        +          this.$element.trigger('loaded.bs.modal')
        +        }, this))
        +    }
        +  }
        +
        +  Modal.VERSION  = '3.3.6'
        +
        +  Modal.TRANSITION_DURATION = 300
        +  Modal.BACKDROP_TRANSITION_DURATION = 150
        +
        +  Modal.DEFAULTS = {
        +    backdrop: true,
        +    keyboard: true,
        +    show: true
        +  }
        +
        +  Modal.prototype.toggle = function (_relatedTarget) {
        +    return this.isShown ? this.hide() : this.show(_relatedTarget)
        +  }
        +
        +  Modal.prototype.show = function (_relatedTarget) {
        +    var that = this
        +    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
        +
        +    this.$element.trigger(e)
        +
        +    if (this.isShown || e.isDefaultPrevented()) return
        +
        +    this.isShown = true
        +
        +    this.checkScrollbar()
        +    this.setScrollbar()
        +    this.$body.addClass('modal-open')
        +
        +    this.escape()
        +    this.resize()
        +
        +    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
        +
        +    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
        +      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        +        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
        +      })
        +    })
        +
        +    this.backdrop(function () {
        +      var transition = $.support.transition && that.$element.hasClass('fade')
        +
        +      if (!that.$element.parent().length) {
        +        that.$element.appendTo(that.$body) // don't move modals dom position
        +      }
        +
        +      that.$element
        +        .show()
        +        .scrollTop(0)
        +
        +      that.adjustDialog()
        +
        +      if (transition) {
        +        that.$element[0].offsetWidth // force reflow
        +      }
        +
        +      that.$element.addClass('in')
        +
        +      that.enforceFocus()
        +
        +      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
        +
        +      transition ?
        +        that.$dialog // wait for modal to slide in
        +          .one('bsTransitionEnd', function () {
        +            that.$element.trigger('focus').trigger(e)
        +          })
        +          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        +        that.$element.trigger('focus').trigger(e)
        +    })
        +  }
        +
        +  Modal.prototype.hide = function (e) {
        +    if (e) e.preventDefault()
        +
        +    e = $.Event('hide.bs.modal')
        +
        +    this.$element.trigger(e)
        +
        +    if (!this.isShown || e.isDefaultPrevented()) return
        +
        +    this.isShown = false
        +
        +    this.escape()
        +    this.resize()
        +
        +    $(document).off('focusin.bs.modal')
        +
        +    this.$element
        +      .removeClass('in')
        +      .off('click.dismiss.bs.modal')
        +      .off('mouseup.dismiss.bs.modal')
        +
        +    this.$dialog.off('mousedown.dismiss.bs.modal')
        +
        +    $.support.transition && this.$element.hasClass('fade') ?
        +      this.$element
        +        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        +        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        +      this.hideModal()
        +  }
        +
        +  Modal.prototype.enforceFocus = function () {
        +    $(document)
        +      .off('focusin.bs.modal') // guard against infinite focus loop
        +      .on('focusin.bs.modal', $.proxy(function (e) {
        +        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
        +          this.$element.trigger('focus')
        +        }
        +      }, this))
        +  }
        +
        +  Modal.prototype.escape = function () {
        +    if (this.isShown && this.options.keyboard) {
        +      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
        +        e.which == 27 && this.hide()
        +      }, this))
        +    } else if (!this.isShown) {
        +      this.$element.off('keydown.dismiss.bs.modal')
        +    }
        +  }
        +
        +  Modal.prototype.resize = function () {
        +    if (this.isShown) {
        +      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
        +    } else {
        +      $(window).off('resize.bs.modal')
        +    }
        +  }
        +
        +  Modal.prototype.hideModal = function () {
        +    var that = this
        +    this.$element.hide()
        +    this.backdrop(function () {
        +      that.$body.removeClass('modal-open')
        +      that.resetAdjustments()
        +      that.resetScrollbar()
        +      that.$element.trigger('hidden.bs.modal')
        +    })
        +  }
        +
        +  Modal.prototype.removeBackdrop = function () {
        +    this.$backdrop && this.$backdrop.remove()
        +    this.$backdrop = null
        +  }
        +
        +  Modal.prototype.backdrop = function (callback) {
        +    var that = this
        +    var animate = this.$element.hasClass('fade') ? 'fade' : ''
        +
        +    if (this.isShown && this.options.backdrop) {
        +      var doAnimate = $.support.transition && animate
        +
        +      this.$backdrop = $(document.createElement('div'))
        +        .addClass('modal-backdrop ' + animate)
        +        .appendTo(this.$body)
        +
        +      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        +        if (this.ignoreBackdropClick) {
        +          this.ignoreBackdropClick = false
        +          return
        +        }
        +        if (e.target !== e.currentTarget) return
        +        this.options.backdrop == 'static'
        +          ? this.$element[0].focus()
        +          : this.hide()
        +      }, this))
        +
        +      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
        +
        +      this.$backdrop.addClass('in')
        +
        +      if (!callback) return
        +
        +      doAnimate ?
        +        this.$backdrop
        +          .one('bsTransitionEnd', callback)
        +          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        +        callback()
        +
        +    } else if (!this.isShown && this.$backdrop) {
        +      this.$backdrop.removeClass('in')
        +
        +      var callbackRemove = function () {
        +        that.removeBackdrop()
        +        callback && callback()
        +      }
        +      $.support.transition && this.$element.hasClass('fade') ?
        +        this.$backdrop
        +          .one('bsTransitionEnd', callbackRemove)
        +          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        +        callbackRemove()
        +
        +    } else if (callback) {
        +      callback()
        +    }
        +  }
        +
        +  // these following methods are used to handle overflowing modals
        +
        +  Modal.prototype.handleUpdate = function () {
        +    this.adjustDialog()
        +  }
        +
        +  Modal.prototype.adjustDialog = function () {
        +    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
        +
        +    this.$element.css({
        +      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
        +      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
        +    })
        +  }
        +
        +  Modal.prototype.resetAdjustments = function () {
        +    this.$element.css({
        +      paddingLeft: '',
        +      paddingRight: ''
        +    })
        +  }
        +
        +  Modal.prototype.checkScrollbar = function () {
        +    var fullWindowWidth = window.innerWidth
        +    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
        +      var documentElementRect = document.documentElement.getBoundingClientRect()
        +      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
        +    }
        +    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
        +    this.scrollbarWidth = this.measureScrollbar()
        +  }
        +
        +  Modal.prototype.setScrollbar = function () {
        +    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
        +    this.originalBodyPad = document.body.style.paddingRight || ''
        +    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
        +  }
        +
        +  Modal.prototype.resetScrollbar = function () {
        +    this.$body.css('padding-right', this.originalBodyPad)
        +  }
        +
        +  Modal.prototype.measureScrollbar = function () { // thx walsh
        +    var scrollDiv = document.createElement('div')
        +    scrollDiv.className = 'modal-scrollbar-measure'
        +    this.$body.append(scrollDiv)
        +    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
        +    this.$body[0].removeChild(scrollDiv)
        +    return scrollbarWidth
        +  }
        +
        +
        +  // MODAL PLUGIN DEFINITION
        +  // =======================
        +
        +  function Plugin(option, _relatedTarget) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.modal')
        +      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
        +
        +      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
        +      if (typeof option == 'string') data[option](_relatedTarget)
        +      else if (options.show) data.show(_relatedTarget)
        +    })
        +  }
        +
        +  var old = $.fn.modal
        +
        +  $.fn.modal             = Plugin
        +  $.fn.modal.Constructor = Modal
        +
        +
        +  // MODAL NO CONFLICT
        +  // =================
        +
        +  $.fn.modal.noConflict = function () {
        +    $.fn.modal = old
        +    return this
        +  }
        +
        +
        +  // MODAL DATA-API
        +  // ==============
        +
        +  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
        +    var $this   = $(this)
        +    var href    = $this.attr('href')
        +    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
        +    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
        +
        +    if ($this.is('a')) e.preventDefault()
        +
        +    $target.one('show.bs.modal', function (showEvent) {
        +      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
        +      $target.one('hidden.bs.modal', function () {
        +        $this.is(':visible') && $this.trigger('focus')
        +      })
        +    })
        +    Plugin.call($target, option, this)
        +  })
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: tooltip.js v3.3.6
        + * http://getbootstrap.com/javascript/#tooltip
        + * Inspired by the original jQuery.tipsy by Jason Frame
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // TOOLTIP PUBLIC CLASS DEFINITION
        +  // ===============================
        +
        +  var Tooltip = function (element, options) {
        +    this.type       = null
        +    this.options    = null
        +    this.enabled    = null
        +    this.timeout    = null
        +    this.hoverState = null
        +    this.$element   = null
        +    this.inState    = null
        +
        +    this.init('tooltip', element, options)
        +  }
        +
        +  Tooltip.VERSION  = '3.3.6'
        +
        +  Tooltip.TRANSITION_DURATION = 150
        +
        +  Tooltip.DEFAULTS = {
        +    animation: true,
        +    placement: 'top',
        +    selector: false,
        +    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
        +    trigger: 'hover focus',
        +    title: '',
        +    delay: 0,
        +    html: false,
        +    container: false,
        +    viewport: {
        +      selector: 'body',
        +      padding: 0
        +    }
        +  }
        +
        +  Tooltip.prototype.init = function (type, element, options) {
        +    this.enabled   = true
        +    this.type      = type
        +    this.$element  = $(element)
        +    this.options   = this.getOptions(options)
        +    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
        +    this.inState   = { click: false, hover: false, focus: false }
        +
        +    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
        +      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
        +    }
        +
        +    var triggers = this.options.trigger.split(' ')
        +
        +    for (var i = triggers.length; i--;) {
        +      var trigger = triggers[i]
        +
        +      if (trigger == 'click') {
        +        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
        +      } else if (trigger != 'manual') {
        +        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        +        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
        +
        +        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        +        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
        +      }
        +    }
        +
        +    this.options.selector ?
        +      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
        +      this.fixTitle()
        +  }
        +
        +  Tooltip.prototype.getDefaults = function () {
        +    return Tooltip.DEFAULTS
        +  }
        +
        +  Tooltip.prototype.getOptions = function (options) {
        +    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
        +
        +    if (options.delay && typeof options.delay == 'number') {
        +      options.delay = {
        +        show: options.delay,
        +        hide: options.delay
        +      }
        +    }
        +
        +    return options
        +  }
        +
        +  Tooltip.prototype.getDelegateOptions = function () {
        +    var options  = {}
        +    var defaults = this.getDefaults()
        +
        +    this._options && $.each(this._options, function (key, value) {
        +      if (defaults[key] != value) options[key] = value
        +    })
        +
        +    return options
        +  }
        +
        +  Tooltip.prototype.enter = function (obj) {
        +    var self = obj instanceof this.constructor ?
        +      obj : $(obj.currentTarget).data('bs.' + this.type)
        +
        +    if (!self) {
        +      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        +      $(obj.currentTarget).data('bs.' + this.type, self)
        +    }
        +
        +    if (obj instanceof $.Event) {
        +      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
        +    }
        +
        +    if (self.tip().hasClass('in') || self.hoverState == 'in') {
        +      self.hoverState = 'in'
        +      return
        +    }
        +
        +    clearTimeout(self.timeout)
        +
        +    self.hoverState = 'in'
        +
        +    if (!self.options.delay || !self.options.delay.show) return self.show()
        +
        +    self.timeout = setTimeout(function () {
        +      if (self.hoverState == 'in') self.show()
        +    }, self.options.delay.show)
        +  }
        +
        +  Tooltip.prototype.isInStateTrue = function () {
        +    for (var key in this.inState) {
        +      if (this.inState[key]) return true
        +    }
        +
        +    return false
        +  }
        +
        +  Tooltip.prototype.leave = function (obj) {
        +    var self = obj instanceof this.constructor ?
        +      obj : $(obj.currentTarget).data('bs.' + this.type)
        +
        +    if (!self) {
        +      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        +      $(obj.currentTarget).data('bs.' + this.type, self)
        +    }
        +
        +    if (obj instanceof $.Event) {
        +      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
        +    }
        +
        +    if (self.isInStateTrue()) return
        +
        +    clearTimeout(self.timeout)
        +
        +    self.hoverState = 'out'
        +
        +    if (!self.options.delay || !self.options.delay.hide) return self.hide()
        +
        +    self.timeout = setTimeout(function () {
        +      if (self.hoverState == 'out') self.hide()
        +    }, self.options.delay.hide)
        +  }
        +
        +  Tooltip.prototype.show = function () {
        +    var e = $.Event('show.bs.' + this.type)
        +
        +    if (this.hasContent() && this.enabled) {
        +      this.$element.trigger(e)
        +
        +      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
        +      if (e.isDefaultPrevented() || !inDom) return
        +      var that = this
        +
        +      var $tip = this.tip()
        +
        +      var tipId = this.getUID(this.type)
        +
        +      this.setContent()
        +      $tip.attr('id', tipId)
        +      this.$element.attr('aria-describedby', tipId)
        +
        +      if (this.options.animation) $tip.addClass('fade')
        +
        +      var placement = typeof this.options.placement == 'function' ?
        +        this.options.placement.call(this, $tip[0], this.$element[0]) :
        +        this.options.placement
        +
        +      var autoToken = /\s?auto?\s?/i
        +      var autoPlace = autoToken.test(placement)
        +      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
        +
        +      $tip
        +        .detach()
        +        .css({ top: 0, left: 0, display: 'block' })
        +        .addClass(placement)
        +        .data('bs.' + this.type, this)
        +
        +      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
        +      this.$element.trigger('inserted.bs.' + this.type)
        +
        +      var pos          = this.getPosition()
        +      var actualWidth  = $tip[0].offsetWidth
        +      var actualHeight = $tip[0].offsetHeight
        +
        +      if (autoPlace) {
        +        var orgPlacement = placement
        +        var viewportDim = this.getPosition(this.$viewport)
        +
        +        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
        +                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
        +                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
        +                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
        +                    placement
        +
        +        $tip
        +          .removeClass(orgPlacement)
        +          .addClass(placement)
        +      }
        +
        +      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
        +
        +      this.applyPlacement(calculatedOffset, placement)
        +
        +      var complete = function () {
        +        var prevHoverState = that.hoverState
        +        that.$element.trigger('shown.bs.' + that.type)
        +        that.hoverState = null
        +
        +        if (prevHoverState == 'out') that.leave(that)
        +      }
        +
        +      $.support.transition && this.$tip.hasClass('fade') ?
        +        $tip
        +          .one('bsTransitionEnd', complete)
        +          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        +        complete()
        +    }
        +  }
        +
        +  Tooltip.prototype.applyPlacement = function (offset, placement) {
        +    var $tip   = this.tip()
        +    var width  = $tip[0].offsetWidth
        +    var height = $tip[0].offsetHeight
        +
        +    // manually read margins because getBoundingClientRect includes difference
        +    var marginTop = parseInt($tip.css('margin-top'), 10)
        +    var marginLeft = parseInt($tip.css('margin-left'), 10)
        +
        +    // we must check for NaN for ie 8/9
        +    if (isNaN(marginTop))  marginTop  = 0
        +    if (isNaN(marginLeft)) marginLeft = 0
        +
        +    offset.top  += marginTop
        +    offset.left += marginLeft
        +
        +    // $.fn.offset doesn't round pixel values
        +    // so we use setOffset directly with our own function B-0
        +    $.offset.setOffset($tip[0], $.extend({
        +      using: function (props) {
        +        $tip.css({
        +          top: Math.round(props.top),
        +          left: Math.round(props.left)
        +        })
        +      }
        +    }, offset), 0)
        +
        +    $tip.addClass('in')
        +
        +    // check to see if placing tip in new offset caused the tip to resize itself
        +    var actualWidth  = $tip[0].offsetWidth
        +    var actualHeight = $tip[0].offsetHeight
        +
        +    if (placement == 'top' && actualHeight != height) {
        +      offset.top = offset.top + height - actualHeight
        +    }
        +
        +    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
        +
        +    if (delta.left) offset.left += delta.left
        +    else offset.top += delta.top
        +
        +    var isVertical          = /top|bottom/.test(placement)
        +    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
        +    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
        +
        +    $tip.offset(offset)
        +    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
        +  }
        +
        +  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
        +    this.arrow()
        +      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
        +      .css(isVertical ? 'top' : 'left', '')
        +  }
        +
        +  Tooltip.prototype.setContent = function () {
        +    var $tip  = this.tip()
        +    var title = this.getTitle()
        +
        +    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
        +    $tip.removeClass('fade in top bottom left right')
        +  }
        +
        +  Tooltip.prototype.hide = function (callback) {
        +    var that = this
        +    var $tip = $(this.$tip)
        +    var e    = $.Event('hide.bs.' + this.type)
        +
        +    function complete() {
        +      if (that.hoverState != 'in') $tip.detach()
        +      that.$element
        +        .removeAttr('aria-describedby')
        +        .trigger('hidden.bs.' + that.type)
        +      callback && callback()
        +    }
        +
        +    this.$element.trigger(e)
        +
        +    if (e.isDefaultPrevented()) return
        +
        +    $tip.removeClass('in')
        +
        +    $.support.transition && $tip.hasClass('fade') ?
        +      $tip
        +        .one('bsTransitionEnd', complete)
        +        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        +      complete()
        +
        +    this.hoverState = null
        +
        +    return this
        +  }
        +
        +  Tooltip.prototype.fixTitle = function () {
        +    var $e = this.$element
        +    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
        +      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
        +    }
        +  }
        +
        +  Tooltip.prototype.hasContent = function () {
        +    return this.getTitle()
        +  }
        +
        +  Tooltip.prototype.getPosition = function ($element) {
        +    $element   = $element || this.$element
        +
        +    var el     = $element[0]
        +    var isBody = el.tagName == 'BODY'
        +
        +    var elRect    = el.getBoundingClientRect()
        +    if (elRect.width == null) {
        +      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
        +      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
        +    }
        +    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
        +    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
        +    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
        +
        +    return $.extend({}, elRect, scroll, outerDims, elOffset)
        +  }
        +
        +  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
        +    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
        +           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
        +           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        +        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
        +
        +  }
        +
        +  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
        +    var delta = { top: 0, left: 0 }
        +    if (!this.$viewport) return delta
        +
        +    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
        +    var viewportDimensions = this.getPosition(this.$viewport)
        +
        +    if (/right|left/.test(placement)) {
        +      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
        +      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
        +      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        +        delta.top = viewportDimensions.top - topEdgeOffset
        +      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        +        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
        +      }
        +    } else {
        +      var leftEdgeOffset  = pos.left - viewportPadding
        +      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
        +      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        +        delta.left = viewportDimensions.left - leftEdgeOffset
        +      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
        +        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
        +      }
        +    }
        +
        +    return delta
        +  }
        +
        +  Tooltip.prototype.getTitle = function () {
        +    var title
        +    var $e = this.$element
        +    var o  = this.options
        +
        +    title = $e.attr('data-original-title')
        +      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
        +
        +    return title
        +  }
        +
        +  Tooltip.prototype.getUID = function (prefix) {
        +    do prefix += ~~(Math.random() * 1000000)
        +    while (document.getElementById(prefix))
        +    return prefix
        +  }
        +
        +  Tooltip.prototype.tip = function () {
        +    if (!this.$tip) {
        +      this.$tip = $(this.options.template)
        +      if (this.$tip.length != 1) {
        +        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
        +      }
        +    }
        +    return this.$tip
        +  }
        +
        +  Tooltip.prototype.arrow = function () {
        +    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
        +  }
        +
        +  Tooltip.prototype.enable = function () {
        +    this.enabled = true
        +  }
        +
        +  Tooltip.prototype.disable = function () {
        +    this.enabled = false
        +  }
        +
        +  Tooltip.prototype.toggleEnabled = function () {
        +    this.enabled = !this.enabled
        +  }
        +
        +  Tooltip.prototype.toggle = function (e) {
        +    var self = this
        +    if (e) {
        +      self = $(e.currentTarget).data('bs.' + this.type)
        +      if (!self) {
        +        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        +        $(e.currentTarget).data('bs.' + this.type, self)
        +      }
        +    }
        +
        +    if (e) {
        +      self.inState.click = !self.inState.click
        +      if (self.isInStateTrue()) self.enter(self)
        +      else self.leave(self)
        +    } else {
        +      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
        +    }
        +  }
        +
        +  Tooltip.prototype.destroy = function () {
        +    var that = this
        +    clearTimeout(this.timeout)
        +    this.hide(function () {
        +      that.$element.off('.' + that.type).removeData('bs.' + that.type)
        +      if (that.$tip) {
        +        that.$tip.detach()
        +      }
        +      that.$tip = null
        +      that.$arrow = null
        +      that.$viewport = null
        +    })
        +  }
        +
        +
        +  // TOOLTIP PLUGIN DEFINITION
        +  // =========================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.tooltip')
        +      var options = typeof option == 'object' && option
        +
        +      if (!data && /destroy|hide/.test(option)) return
        +      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
        +      if (typeof option == 'string') data[option]()
        +    })
        +  }
        +
        +  var old = $.fn.tooltip
        +
        +  $.fn.tooltip             = Plugin
        +  $.fn.tooltip.Constructor = Tooltip
        +
        +
        +  // TOOLTIP NO CONFLICT
        +  // ===================
        +
        +  $.fn.tooltip.noConflict = function () {
        +    $.fn.tooltip = old
        +    return this
        +  }
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: popover.js v3.3.6
        + * http://getbootstrap.com/javascript/#popovers
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // POPOVER PUBLIC CLASS DEFINITION
        +  // ===============================
        +
        +  var Popover = function (element, options) {
        +    this.init('popover', element, options)
        +  }
        +
        +  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
        +
        +  Popover.VERSION  = '3.3.6'
        +
        +  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
        +    placement: 'right',
        +    trigger: 'click',
        +    content: '',
        +    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
        +  })
        +
        +
        +  // NOTE: POPOVER EXTENDS tooltip.js
        +  // ================================
        +
        +  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
        +
        +  Popover.prototype.constructor = Popover
        +
        +  Popover.prototype.getDefaults = function () {
        +    return Popover.DEFAULTS
        +  }
        +
        +  Popover.prototype.setContent = function () {
        +    var $tip    = this.tip()
        +    var title   = this.getTitle()
        +    var content = this.getContent()
        +
        +    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
        +    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
        +      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
        +    ](content)
        +
        +    $tip.removeClass('fade top bottom left right in')
        +
        +    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
        +    // this manually by checking the contents.
        +    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
        +  }
        +
        +  Popover.prototype.hasContent = function () {
        +    return this.getTitle() || this.getContent()
        +  }
        +
        +  Popover.prototype.getContent = function () {
        +    var $e = this.$element
        +    var o  = this.options
        +
        +    return $e.attr('data-content')
        +      || (typeof o.content == 'function' ?
        +            o.content.call($e[0]) :
        +            o.content)
        +  }
        +
        +  Popover.prototype.arrow = function () {
        +    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
        +  }
        +
        +
        +  // POPOVER PLUGIN DEFINITION
        +  // =========================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.popover')
        +      var options = typeof option == 'object' && option
        +
        +      if (!data && /destroy|hide/.test(option)) return
        +      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
        +      if (typeof option == 'string') data[option]()
        +    })
        +  }
        +
        +  var old = $.fn.popover
        +
        +  $.fn.popover             = Plugin
        +  $.fn.popover.Constructor = Popover
        +
        +
        +  // POPOVER NO CONFLICT
        +  // ===================
        +
        +  $.fn.popover.noConflict = function () {
        +    $.fn.popover = old
        +    return this
        +  }
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: scrollspy.js v3.3.6
        + * http://getbootstrap.com/javascript/#scrollspy
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // SCROLLSPY CLASS DEFINITION
        +  // ==========================
        +
        +  function ScrollSpy(element, options) {
        +    this.$body          = $(document.body)
        +    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
        +    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
        +    this.selector       = (this.options.target || '') + ' .nav li > a'
        +    this.offsets        = []
        +    this.targets        = []
        +    this.activeTarget   = null
        +    this.scrollHeight   = 0
        +
        +    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
        +    this.refresh()
        +    this.process()
        +  }
        +
        +  ScrollSpy.VERSION  = '3.3.6'
        +
        +  ScrollSpy.DEFAULTS = {
        +    offset: 10
        +  }
        +
        +  ScrollSpy.prototype.getScrollHeight = function () {
        +    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
        +  }
        +
        +  ScrollSpy.prototype.refresh = function () {
        +    var that          = this
        +    var offsetMethod  = 'offset'
        +    var offsetBase    = 0
        +
        +    this.offsets      = []
        +    this.targets      = []
        +    this.scrollHeight = this.getScrollHeight()
        +
        +    if (!$.isWindow(this.$scrollElement[0])) {
        +      offsetMethod = 'position'
        +      offsetBase   = this.$scrollElement.scrollTop()
        +    }
        +
        +    this.$body
        +      .find(this.selector)
        +      .map(function () {
        +        var $el   = $(this)
        +        var href  = $el.data('target') || $el.attr('href')
        +        var $href = /^#./.test(href) && $(href)
        +
        +        return ($href
        +          && $href.length
        +          && $href.is(':visible')
        +          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
        +      })
        +      .sort(function (a, b) { return a[0] - b[0] })
        +      .each(function () {
        +        that.offsets.push(this[0])
        +        that.targets.push(this[1])
        +      })
        +  }
        +
        +  ScrollSpy.prototype.process = function () {
        +    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
        +    var scrollHeight = this.getScrollHeight()
        +    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
        +    var offsets      = this.offsets
        +    var targets      = this.targets
        +    var activeTarget = this.activeTarget
        +    var i
        +
        +    if (this.scrollHeight != scrollHeight) {
        +      this.refresh()
        +    }
        +
        +    if (scrollTop >= maxScroll) {
        +      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
        +    }
        +
        +    if (activeTarget && scrollTop < offsets[0]) {
        +      this.activeTarget = null
        +      return this.clear()
        +    }
        +
        +    for (i = offsets.length; i--;) {
        +      activeTarget != targets[i]
        +        && scrollTop >= offsets[i]
        +        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
        +        && this.activate(targets[i])
        +    }
        +  }
        +
        +  ScrollSpy.prototype.activate = function (target) {
        +    this.activeTarget = target
        +
        +    this.clear()
        +
        +    var selector = this.selector +
        +      '[data-target="' + target + '"],' +
        +      this.selector + '[href="' + target + '"]'
        +
        +    var active = $(selector)
        +      .parents('li')
        +      .addClass('active')
        +
        +    if (active.parent('.dropdown-menu').length) {
        +      active = active
        +        .closest('li.dropdown')
        +        .addClass('active')
        +    }
        +
        +    active.trigger('activate.bs.scrollspy')
        +  }
        +
        +  ScrollSpy.prototype.clear = function () {
        +    $(this.selector)
        +      .parentsUntil(this.options.target, '.active')
        +      .removeClass('active')
        +  }
        +
        +
        +  // SCROLLSPY PLUGIN DEFINITION
        +  // ===========================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.scrollspy')
        +      var options = typeof option == 'object' && option
        +
        +      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
        +      if (typeof option == 'string') data[option]()
        +    })
        +  }
        +
        +  var old = $.fn.scrollspy
        +
        +  $.fn.scrollspy             = Plugin
        +  $.fn.scrollspy.Constructor = ScrollSpy
        +
        +
        +  // SCROLLSPY NO CONFLICT
        +  // =====================
        +
        +  $.fn.scrollspy.noConflict = function () {
        +    $.fn.scrollspy = old
        +    return this
        +  }
        +
        +
        +  // SCROLLSPY DATA-API
        +  // ==================
        +
        +  $(window).on('load.bs.scrollspy.data-api', function () {
        +    $('[data-spy="scroll"]').each(function () {
        +      var $spy = $(this)
        +      Plugin.call($spy, $spy.data())
        +    })
        +  })
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: tab.js v3.3.6
        + * http://getbootstrap.com/javascript/#tabs
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // TAB CLASS DEFINITION
        +  // ====================
        +
        +  var Tab = function (element) {
        +    // jscs:disable requireDollarBeforejQueryAssignment
        +    this.element = $(element)
        +    // jscs:enable requireDollarBeforejQueryAssignment
        +  }
        +
        +  Tab.VERSION = '3.3.6'
        +
        +  Tab.TRANSITION_DURATION = 150
        +
        +  Tab.prototype.show = function () {
        +    var $this    = this.element
        +    var $ul      = $this.closest('ul:not(.dropdown-menu)')
        +    var selector = $this.data('target')
        +
        +    if (!selector) {
        +      selector = $this.attr('href')
        +      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        +    }
        +
        +    if ($this.parent('li').hasClass('active')) return
        +
        +    var $previous = $ul.find('.active:last a')
        +    var hideEvent = $.Event('hide.bs.tab', {
        +      relatedTarget: $this[0]
        +    })
        +    var showEvent = $.Event('show.bs.tab', {
        +      relatedTarget: $previous[0]
        +    })
        +
        +    $previous.trigger(hideEvent)
        +    $this.trigger(showEvent)
        +
        +    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
        +
        +    var $target = $(selector)
        +
        +    this.activate($this.closest('li'), $ul)
        +    this.activate($target, $target.parent(), function () {
        +      $previous.trigger({
        +        type: 'hidden.bs.tab',
        +        relatedTarget: $this[0]
        +      })
        +      $this.trigger({
        +        type: 'shown.bs.tab',
        +        relatedTarget: $previous[0]
        +      })
        +    })
        +  }
        +
        +  Tab.prototype.activate = function (element, container, callback) {
        +    var $active    = container.find('> .active')
        +    var transition = callback
        +      && $.support.transition
        +      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
        +
        +    function next() {
        +      $active
        +        .removeClass('active')
        +        .find('> .dropdown-menu > .active')
        +          .removeClass('active')
        +        .end()
        +        .find('[data-toggle="tab"]')
        +          .attr('aria-expanded', false)
        +
        +      element
        +        .addClass('active')
        +        .find('[data-toggle="tab"]')
        +          .attr('aria-expanded', true)
        +
        +      if (transition) {
        +        element[0].offsetWidth // reflow for transition
        +        element.addClass('in')
        +      } else {
        +        element.removeClass('fade')
        +      }
        +
        +      if (element.parent('.dropdown-menu').length) {
        +        element
        +          .closest('li.dropdown')
        +            .addClass('active')
        +          .end()
        +          .find('[data-toggle="tab"]')
        +            .attr('aria-expanded', true)
        +      }
        +
        +      callback && callback()
        +    }
        +
        +    $active.length && transition ?
        +      $active
        +        .one('bsTransitionEnd', next)
        +        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
        +      next()
        +
        +    $active.removeClass('in')
        +  }
        +
        +
        +  // TAB PLUGIN DEFINITION
        +  // =====================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this = $(this)
        +      var data  = $this.data('bs.tab')
        +
        +      if (!data) $this.data('bs.tab', (data = new Tab(this)))
        +      if (typeof option == 'string') data[option]()
        +    })
        +  }
        +
        +  var old = $.fn.tab
        +
        +  $.fn.tab             = Plugin
        +  $.fn.tab.Constructor = Tab
        +
        +
        +  // TAB NO CONFLICT
        +  // ===============
        +
        +  $.fn.tab.noConflict = function () {
        +    $.fn.tab = old
        +    return this
        +  }
        +
        +
        +  // TAB DATA-API
        +  // ============
        +
        +  var clickHandler = function (e) {
        +    e.preventDefault()
        +    Plugin.call($(this), 'show')
        +  }
        +
        +  $(document)
        +    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
        +    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
        +
        +}(jQuery);
        +
        +/* ========================================================================
        + * Bootstrap: affix.js v3.3.6
        + * http://getbootstrap.com/javascript/#affix
        + * ========================================================================
        + * Copyright 2011-2015 Twitter, Inc.
        + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        + * ======================================================================== */
        +
        +
        ++function ($) {
        +  'use strict';
        +
        +  // AFFIX CLASS DEFINITION
        +  // ======================
        +
        +  var Affix = function (element, options) {
        +    this.options = $.extend({}, Affix.DEFAULTS, options)
        +
        +    this.$target = $(this.options.target)
        +      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
        +      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
        +
        +    this.$element     = $(element)
        +    this.affixed      = null
        +    this.unpin        = null
        +    this.pinnedOffset = null
        +
        +    this.checkPosition()
        +  }
        +
        +  Affix.VERSION  = '3.3.6'
        +
        +  Affix.RESET    = 'affix affix-top affix-bottom'
        +
        +  Affix.DEFAULTS = {
        +    offset: 0,
        +    target: window
        +  }
        +
        +  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
        +    var scrollTop    = this.$target.scrollTop()
        +    var position     = this.$element.offset()
        +    var targetHeight = this.$target.height()
        +
        +    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
        +
        +    if (this.affixed == 'bottom') {
        +      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
        +      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
        +    }
        +
        +    var initializing   = this.affixed == null
        +    var colliderTop    = initializing ? scrollTop : position.top
        +    var colliderHeight = initializing ? targetHeight : height
        +
        +    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
        +    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
        +
        +    return false
        +  }
        +
        +  Affix.prototype.getPinnedOffset = function () {
        +    if (this.pinnedOffset) return this.pinnedOffset
        +    this.$element.removeClass(Affix.RESET).addClass('affix')
        +    var scrollTop = this.$target.scrollTop()
        +    var position  = this.$element.offset()
        +    return (this.pinnedOffset = position.top - scrollTop)
        +  }
        +
        +  Affix.prototype.checkPositionWithEventLoop = function () {
        +    setTimeout($.proxy(this.checkPosition, this), 1)
        +  }
        +
        +  Affix.prototype.checkPosition = function () {
        +    if (!this.$element.is(':visible')) return
        +
        +    var height       = this.$element.height()
        +    var offset       = this.options.offset
        +    var offsetTop    = offset.top
        +    var offsetBottom = offset.bottom
        +    var scrollHeight = Math.max($(document).height(), $(document.body).height())
        +
        +    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
        +    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
        +    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
        +
        +    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
        +
        +    if (this.affixed != affix) {
        +      if (this.unpin != null) this.$element.css('top', '')
        +
        +      var affixType = 'affix' + (affix ? '-' + affix : '')
        +      var e         = $.Event(affixType + '.bs.affix')
        +
        +      this.$element.trigger(e)
        +
        +      if (e.isDefaultPrevented()) return
        +
        +      this.affixed = affix
        +      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
        +
        +      this.$element
        +        .removeClass(Affix.RESET)
        +        .addClass(affixType)
        +        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
        +    }
        +
        +    if (affix == 'bottom') {
        +      this.$element.offset({
        +        top: scrollHeight - height - offsetBottom
        +      })
        +    }
        +  }
        +
        +
        +  // AFFIX PLUGIN DEFINITION
        +  // =======================
        +
        +  function Plugin(option) {
        +    return this.each(function () {
        +      var $this   = $(this)
        +      var data    = $this.data('bs.affix')
        +      var options = typeof option == 'object' && option
        +
        +      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
        +      if (typeof option == 'string') data[option]()
        +    })
        +  }
        +
        +  var old = $.fn.affix
        +
        +  $.fn.affix             = Plugin
        +  $.fn.affix.Constructor = Affix
        +
        +
        +  // AFFIX NO CONFLICT
        +  // =================
        +
        +  $.fn.affix.noConflict = function () {
        +    $.fn.affix = old
        +    return this
        +  }
        +
        +
        +  // AFFIX DATA-API
        +  // ==============
        +
        +  $(window).on('load', function () {
        +    $('[data-spy="affix"]').each(function () {
        +      var $spy = $(this)
        +      var data = $spy.data()
        +
        +      data.offset = data.offset || {}
        +
        +      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
        +      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
        +
        +      Plugin.call($spy, data)
        +    })
        +  })
        +
        +}(jQuery);
        diff --git a/resources/assets/js/bootstrap.js b/resources/assets/js/bootstrap.js
        index 01fbbcbaa9..3731604dbd 100755
        --- a/resources/assets/js/bootstrap.js
        +++ b/resources/assets/js/bootstrap.js
        @@ -1,2363 +1,48 @@
        -/*!
        - * Bootstrap v3.3.6 (http://getbootstrap.com)
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under the MIT license
        +
        +window._ = require('lodash');
        +
        +/**
        + * We'll load jQuery and the Bootstrap jQuery plugin which provides support
        + * for JavaScript based Bootstrap features such as modals and tabs. This
        + * code may be modified to fit the specific needs of your application.
          */
         
        -if (typeof jQuery === 'undefined') {
        -  throw new Error('Bootstrap\'s JavaScript requires jQuery')
        -}
        +window.$ = window.jQuery = require('jquery');
        +require('bootstrap-less');
         
        -+function ($) {
        -  'use strict';
        -  var version = $.fn.jquery.split(' ')[0].split('.')
        -  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {
        -    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
        -  }
        -}(jQuery);
        +/**
        + * Vue is a modern JavaScript library for building interactive web interfaces
        + * using reactive data binding and reusable components. Vue's API is clean
        + * and simple, leaving you to focus on building your next great project.
        + */
         
        -/* ========================================================================
        - * Bootstrap: transition.js v3.3.6
        - * http://getbootstrap.com/javascript/#transitions
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        +window.Vue = require('vue');
        +window.eventHub = new Vue();
        +require('vue-resource');
         
        +/**
        + * We'll register a HTTP interceptor to attach the "CSRF" header to each of
        + * the outgoing requests issued by this application. The CSRF middleware
        + * included with Laravel will automatically verify the header's value.
        + */
         
        -+function ($) {
        -  'use strict';
        +Vue.http.interceptors.push((request, next) => {
        +    request.headers.set('X-CSRF-TOKEN', Laravel.csrfToken);
         
        -  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
        -  // ============================================================
        +    next();
        +});
         
        -  function transitionEnd() {
        -    var el = document.createElement('bootstrap')
        +/**
        + * Echo exposes an expressive API for subscribing to channels and listening
        + * for events that are broadcast by Laravel. Echo and event broadcasting
        + * allows your team to easily build robust real-time web applications.
        + */
         
        -    var transEndEventNames = {
        -      WebkitTransition : 'webkitTransitionEnd',
        -      MozTransition    : 'transitionend',
        -      OTransition      : 'oTransitionEnd otransitionend',
        -      transition       : 'transitionend'
        -    }
        +// import Echo from "laravel-echo"
         
        -    for (var name in transEndEventNames) {
        -      if (el.style[name] !== undefined) {
        -        return { end: transEndEventNames[name] }
        -      }
        -    }
        +// window.Echo = new Echo({
        +//     broadcaster: 'pusher',
        +//     key: 'your-pusher-key'
        +// });
         
        -    return false // explicit for ie8 (  ._.)
        -  }
         
        -  // http://blog.alexmaccaw.com/css-transitions
        -  $.fn.emulateTransitionEnd = function (duration) {
        -    var called = false
        -    var $el = this
        -    $(this).one('bsTransitionEnd', function () { called = true })
        -    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
        -    setTimeout(callback, duration)
        -    return this
        -  }
        -
        -  $(function () {
        -    $.support.transition = transitionEnd()
        -
        -    if (!$.support.transition) return
        -
        -    $.event.special.bsTransitionEnd = {
        -      bindType: $.support.transition.end,
        -      delegateType: $.support.transition.end,
        -      handle: function (e) {
        -        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
        -      }
        -    }
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: alert.js v3.3.6
        - * http://getbootstrap.com/javascript/#alerts
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // ALERT CLASS DEFINITION
        -  // ======================
        -
        -  var dismiss = '[data-dismiss="alert"]'
        -  var Alert   = function (el) {
        -    $(el).on('click', dismiss, this.close)
        -  }
        -
        -  Alert.VERSION = '3.3.6'
        -
        -  Alert.TRANSITION_DURATION = 150
        -
        -  Alert.prototype.close = function (e) {
        -    var $this    = $(this)
        -    var selector = $this.attr('data-target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    var $parent = $(selector)
        -
        -    if (e) e.preventDefault()
        -
        -    if (!$parent.length) {
        -      $parent = $this.closest('.alert')
        -    }
        -
        -    $parent.trigger(e = $.Event('close.bs.alert'))
        -
        -    if (e.isDefaultPrevented()) return
        -
        -    $parent.removeClass('in')
        -
        -    function removeElement() {
        -      // detach from parent, fire event then clean up data
        -      $parent.detach().trigger('closed.bs.alert').remove()
        -    }
        -
        -    $.support.transition && $parent.hasClass('fade') ?
        -      $parent
        -        .one('bsTransitionEnd', removeElement)
        -        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
        -      removeElement()
        -  }
        -
        -
        -  // ALERT PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.alert')
        -
        -      if (!data) $this.data('bs.alert', (data = new Alert(this)))
        -      if (typeof option == 'string') data[option].call($this)
        -    })
        -  }
        -
        -  var old = $.fn.alert
        -
        -  $.fn.alert             = Plugin
        -  $.fn.alert.Constructor = Alert
        -
        -
        -  // ALERT NO CONFLICT
        -  // =================
        -
        -  $.fn.alert.noConflict = function () {
        -    $.fn.alert = old
        -    return this
        -  }
        -
        -
        -  // ALERT DATA-API
        -  // ==============
        -
        -  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: button.js v3.3.6
        - * http://getbootstrap.com/javascript/#buttons
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // BUTTON PUBLIC CLASS DEFINITION
        -  // ==============================
        -
        -  var Button = function (element, options) {
        -    this.$element  = $(element)
        -    this.options   = $.extend({}, Button.DEFAULTS, options)
        -    this.isLoading = false
        -  }
        -
        -  Button.VERSION  = '3.3.6'
        -
        -  Button.DEFAULTS = {
        -    loadingText: 'loading...'
        -  }
        -
        -  Button.prototype.setState = function (state) {
        -    var d    = 'disabled'
        -    var $el  = this.$element
        -    var val  = $el.is('input') ? 'val' : 'html'
        -    var data = $el.data()
        -
        -    state += 'Text'
        -
        -    if (data.resetText == null) $el.data('resetText', $el[val]())
        -
        -    // push to event loop to allow forms to submit
        -    setTimeout($.proxy(function () {
        -      $el[val](data[state] == null ? this.options[state] : data[state])
        -
        -      if (state == 'loadingText') {
        -        this.isLoading = true
        -        $el.addClass(d).attr(d, d)
        -      } else if (this.isLoading) {
        -        this.isLoading = false
        -        $el.removeClass(d).removeAttr(d)
        -      }
        -    }, this), 0)
        -  }
        -
        -  Button.prototype.toggle = function () {
        -    var changed = true
        -    var $parent = this.$element.closest('[data-toggle="buttons"]')
        -
        -    if ($parent.length) {
        -      var $input = this.$element.find('input')
        -      if ($input.prop('type') == 'radio') {
        -        if ($input.prop('checked')) changed = false
        -        $parent.find('.active').removeClass('active')
        -        this.$element.addClass('active')
        -      } else if ($input.prop('type') == 'checkbox') {
        -        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
        -        this.$element.toggleClass('active')
        -      }
        -      $input.prop('checked', this.$element.hasClass('active'))
        -      if (changed) $input.trigger('change')
        -    } else {
        -      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
        -      this.$element.toggleClass('active')
        -    }
        -  }
        -
        -
        -  // BUTTON PLUGIN DEFINITION
        -  // ========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.button')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.button', (data = new Button(this, options)))
        -
        -      if (option == 'toggle') data.toggle()
        -      else if (option) data.setState(option)
        -    })
        -  }
        -
        -  var old = $.fn.button
        -
        -  $.fn.button             = Plugin
        -  $.fn.button.Constructor = Button
        -
        -
        -  // BUTTON NO CONFLICT
        -  // ==================
        -
        -  $.fn.button.noConflict = function () {
        -    $.fn.button = old
        -    return this
        -  }
        -
        -
        -  // BUTTON DATA-API
        -  // ===============
        -
        -  $(document)
        -    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        -      var $btn = $(e.target)
        -      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
        -      Plugin.call($btn, 'toggle')
        -      if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
        -    })
        -    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        -      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
        -    })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: carousel.js v3.3.6
        - * http://getbootstrap.com/javascript/#carousel
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // CAROUSEL CLASS DEFINITION
        -  // =========================
        -
        -  var Carousel = function (element, options) {
        -    this.$element    = $(element)
        -    this.$indicators = this.$element.find('.carousel-indicators')
        -    this.options     = options
        -    this.paused      = null
        -    this.sliding     = null
        -    this.interval    = null
        -    this.$active     = null
        -    this.$items      = null
        -
        -    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
        -
        -    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
        -      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
        -      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
        -  }
        -
        -  Carousel.VERSION  = '3.3.6'
        -
        -  Carousel.TRANSITION_DURATION = 600
        -
        -  Carousel.DEFAULTS = {
        -    interval: 5000,
        -    pause: 'hover',
        -    wrap: true,
        -    keyboard: true
        -  }
        -
        -  Carousel.prototype.keydown = function (e) {
        -    if (/input|textarea/i.test(e.target.tagName)) return
        -    switch (e.which) {
        -      case 37: this.prev(); break
        -      case 39: this.next(); break
        -      default: return
        -    }
        -
        -    e.preventDefault()
        -  }
        -
        -  Carousel.prototype.cycle = function (e) {
        -    e || (this.paused = false)
        -
        -    this.interval && clearInterval(this.interval)
        -
        -    this.options.interval
        -      && !this.paused
        -      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
        -
        -    return this
        -  }
        -
        -  Carousel.prototype.getItemIndex = function (item) {
        -    this.$items = item.parent().children('.item')
        -    return this.$items.index(item || this.$active)
        -  }
        -
        -  Carousel.prototype.getItemForDirection = function (direction, active) {
        -    var activeIndex = this.getItemIndex(active)
        -    var willWrap = (direction == 'prev' && activeIndex === 0)
        -                || (direction == 'next' && activeIndex == (this.$items.length - 1))
        -    if (willWrap && !this.options.wrap) return active
        -    var delta = direction == 'prev' ? -1 : 1
        -    var itemIndex = (activeIndex + delta) % this.$items.length
        -    return this.$items.eq(itemIndex)
        -  }
        -
        -  Carousel.prototype.to = function (pos) {
        -    var that        = this
        -    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
        -
        -    if (pos > (this.$items.length - 1) || pos < 0) return
        -
        -    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
        -    if (activeIndex == pos) return this.pause().cycle()
        -
        -    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
        -  }
        -
        -  Carousel.prototype.pause = function (e) {
        -    e || (this.paused = true)
        -
        -    if (this.$element.find('.next, .prev').length && $.support.transition) {
        -      this.$element.trigger($.support.transition.end)
        -      this.cycle(true)
        -    }
        -
        -    this.interval = clearInterval(this.interval)
        -
        -    return this
        -  }
        -
        -  Carousel.prototype.next = function () {
        -    if (this.sliding) return
        -    return this.slide('next')
        -  }
        -
        -  Carousel.prototype.prev = function () {
        -    if (this.sliding) return
        -    return this.slide('prev')
        -  }
        -
        -  Carousel.prototype.slide = function (type, next) {
        -    var $active   = this.$element.find('.item.active')
        -    var $next     = next || this.getItemForDirection(type, $active)
        -    var isCycling = this.interval
        -    var direction = type == 'next' ? 'left' : 'right'
        -    var that      = this
        -
        -    if ($next.hasClass('active')) return (this.sliding = false)
        -
        -    var relatedTarget = $next[0]
        -    var slideEvent = $.Event('slide.bs.carousel', {
        -      relatedTarget: relatedTarget,
        -      direction: direction
        -    })
        -    this.$element.trigger(slideEvent)
        -    if (slideEvent.isDefaultPrevented()) return
        -
        -    this.sliding = true
        -
        -    isCycling && this.pause()
        -
        -    if (this.$indicators.length) {
        -      this.$indicators.find('.active').removeClass('active')
        -      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
        -      $nextIndicator && $nextIndicator.addClass('active')
        -    }
        -
        -    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
        -    if ($.support.transition && this.$element.hasClass('slide')) {
        -      $next.addClass(type)
        -      $next[0].offsetWidth // force reflow
        -      $active.addClass(direction)
        -      $next.addClass(direction)
        -      $active
        -        .one('bsTransitionEnd', function () {
        -          $next.removeClass([type, direction].join(' ')).addClass('active')
        -          $active.removeClass(['active', direction].join(' '))
        -          that.sliding = false
        -          setTimeout(function () {
        -            that.$element.trigger(slidEvent)
        -          }, 0)
        -        })
        -        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
        -    } else {
        -      $active.removeClass('active')
        -      $next.addClass('active')
        -      this.sliding = false
        -      this.$element.trigger(slidEvent)
        -    }
        -
        -    isCycling && this.cycle()
        -
        -    return this
        -  }
        -
        -
        -  // CAROUSEL PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.carousel')
        -      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -      var action  = typeof option == 'string' ? option : options.slide
        -
        -      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
        -      if (typeof option == 'number') data.to(option)
        -      else if (action) data[action]()
        -      else if (options.interval) data.pause().cycle()
        -    })
        -  }
        -
        -  var old = $.fn.carousel
        -
        -  $.fn.carousel             = Plugin
        -  $.fn.carousel.Constructor = Carousel
        -
        -
        -  // CAROUSEL NO CONFLICT
        -  // ====================
        -
        -  $.fn.carousel.noConflict = function () {
        -    $.fn.carousel = old
        -    return this
        -  }
        -
        -
        -  // CAROUSEL DATA-API
        -  // =================
        -
        -  var clickHandler = function (e) {
        -    var href
        -    var $this   = $(this)
        -    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
        -    if (!$target.hasClass('carousel')) return
        -    var options = $.extend({}, $target.data(), $this.data())
        -    var slideIndex = $this.attr('data-slide-to')
        -    if (slideIndex) options.interval = false
        -
        -    Plugin.call($target, options)
        -
        -    if (slideIndex) {
        -      $target.data('bs.carousel').to(slideIndex)
        -    }
        -
        -    e.preventDefault()
        -  }
        -
        -  $(document)
        -    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
        -    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
        -
        -  $(window).on('load', function () {
        -    $('[data-ride="carousel"]').each(function () {
        -      var $carousel = $(this)
        -      Plugin.call($carousel, $carousel.data())
        -    })
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: collapse.js v3.3.6
        - * http://getbootstrap.com/javascript/#collapse
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // COLLAPSE PUBLIC CLASS DEFINITION
        -  // ================================
        -
        -  var Collapse = function (element, options) {
        -    this.$element      = $(element)
        -    this.options       = $.extend({}, Collapse.DEFAULTS, options)
        -    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
        -                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
        -    this.transitioning = null
        -
        -    if (this.options.parent) {
        -      this.$parent = this.getParent()
        -    } else {
        -      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
        -    }
        -
        -    if (this.options.toggle) this.toggle()
        -  }
        -
        -  Collapse.VERSION  = '3.3.6'
        -
        -  Collapse.TRANSITION_DURATION = 350
        -
        -  Collapse.DEFAULTS = {
        -    toggle: true
        -  }
        -
        -  Collapse.prototype.dimension = function () {
        -    var hasWidth = this.$element.hasClass('width')
        -    return hasWidth ? 'width' : 'height'
        -  }
        -
        -  Collapse.prototype.show = function () {
        -    if (this.transitioning || this.$element.hasClass('in')) return
        -
        -    var activesData
        -    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
        -
        -    if (actives && actives.length) {
        -      activesData = actives.data('bs.collapse')
        -      if (activesData && activesData.transitioning) return
        -    }
        -
        -    var startEvent = $.Event('show.bs.collapse')
        -    this.$element.trigger(startEvent)
        -    if (startEvent.isDefaultPrevented()) return
        -
        -    if (actives && actives.length) {
        -      Plugin.call(actives, 'hide')
        -      activesData || actives.data('bs.collapse', null)
        -    }
        -
        -    var dimension = this.dimension()
        -
        -    this.$element
        -      .removeClass('collapse')
        -      .addClass('collapsing')[dimension](0)
        -      .attr('aria-expanded', true)
        -
        -    this.$trigger
        -      .removeClass('collapsed')
        -      .attr('aria-expanded', true)
        -
        -    this.transitioning = 1
        -
        -    var complete = function () {
        -      this.$element
        -        .removeClass('collapsing')
        -        .addClass('collapse in')[dimension]('')
        -      this.transitioning = 0
        -      this.$element
        -        .trigger('shown.bs.collapse')
        -    }
        -
        -    if (!$.support.transition) return complete.call(this)
        -
        -    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
        -
        -    this.$element
        -      .one('bsTransitionEnd', $.proxy(complete, this))
        -      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
        -  }
        -
        -  Collapse.prototype.hide = function () {
        -    if (this.transitioning || !this.$element.hasClass('in')) return
        -
        -    var startEvent = $.Event('hide.bs.collapse')
        -    this.$element.trigger(startEvent)
        -    if (startEvent.isDefaultPrevented()) return
        -
        -    var dimension = this.dimension()
        -
        -    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
        -
        -    this.$element
        -      .addClass('collapsing')
        -      .removeClass('collapse in')
        -      .attr('aria-expanded', false)
        -
        -    this.$trigger
        -      .addClass('collapsed')
        -      .attr('aria-expanded', false)
        -
        -    this.transitioning = 1
        -
        -    var complete = function () {
        -      this.transitioning = 0
        -      this.$element
        -        .removeClass('collapsing')
        -        .addClass('collapse')
        -        .trigger('hidden.bs.collapse')
        -    }
        -
        -    if (!$.support.transition) return complete.call(this)
        -
        -    this.$element
        -      [dimension](0)
        -      .one('bsTransitionEnd', $.proxy(complete, this))
        -      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
        -  }
        -
        -  Collapse.prototype.toggle = function () {
        -    this[this.$element.hasClass('in') ? 'hide' : 'show']()
        -  }
        -
        -  Collapse.prototype.getParent = function () {
        -    return $(this.options.parent)
        -      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
        -      .each($.proxy(function (i, element) {
        -        var $element = $(element)
        -        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
        -      }, this))
        -      .end()
        -  }
        -
        -  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
        -    var isOpen = $element.hasClass('in')
        -
        -    $element.attr('aria-expanded', isOpen)
        -    $trigger
        -      .toggleClass('collapsed', !isOpen)
        -      .attr('aria-expanded', isOpen)
        -  }
        -
        -  function getTargetFromTrigger($trigger) {
        -    var href
        -    var target = $trigger.attr('data-target')
        -      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
        -
        -    return $(target)
        -  }
        -
        -
        -  // COLLAPSE PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.collapse')
        -      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -
        -      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
        -      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.collapse
        -
        -  $.fn.collapse             = Plugin
        -  $.fn.collapse.Constructor = Collapse
        -
        -
        -  // COLLAPSE NO CONFLICT
        -  // ====================
        -
        -  $.fn.collapse.noConflict = function () {
        -    $.fn.collapse = old
        -    return this
        -  }
        -
        -
        -  // COLLAPSE DATA-API
        -  // =================
        -
        -  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
        -    var $this   = $(this)
        -
        -    if (!$this.attr('data-target')) e.preventDefault()
        -
        -    var $target = getTargetFromTrigger($this)
        -    var data    = $target.data('bs.collapse')
        -    var option  = data ? 'toggle' : $this.data()
        -
        -    Plugin.call($target, option)
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: dropdown.js v3.3.6
        - * http://getbootstrap.com/javascript/#dropdowns
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // DROPDOWN CLASS DEFINITION
        -  // =========================
        -
        -  var backdrop = '.dropdown-backdrop'
        -  var toggle   = '[data-toggle="dropdown"]'
        -  var Dropdown = function (element) {
        -    $(element).on('click.bs.dropdown', this.toggle)
        -  }
        -
        -  Dropdown.VERSION = '3.3.6'
        -
        -  function getParent($this) {
        -    var selector = $this.attr('data-target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    var $parent = selector && $(selector)
        -
        -    return $parent && $parent.length ? $parent : $this.parent()
        -  }
        -
        -  function clearMenus(e) {
        -    if (e && e.which === 3) return
        -    $(backdrop).remove()
        -    $(toggle).each(function () {
        -      var $this         = $(this)
        -      var $parent       = getParent($this)
        -      var relatedTarget = { relatedTarget: this }
        -
        -      if (!$parent.hasClass('open')) return
        -
        -      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
        -
        -      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      $this.attr('aria-expanded', 'false')
        -      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
        -    })
        -  }
        -
        -  Dropdown.prototype.toggle = function (e) {
        -    var $this = $(this)
        -
        -    if ($this.is('.disabled, :disabled')) return
        -
        -    var $parent  = getParent($this)
        -    var isActive = $parent.hasClass('open')
        -
        -    clearMenus()
        -
        -    if (!isActive) {
        -      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        -        // if mobile we use a backdrop because click events don't delegate
        -        $(document.createElement('div'))
        -          .addClass('dropdown-backdrop')
        -          .insertAfter($(this))
        -          .on('click', clearMenus)
        -      }
        -
        -      var relatedTarget = { relatedTarget: this }
        -      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      $this
        -        .trigger('focus')
        -        .attr('aria-expanded', 'true')
        -
        -      $parent
        -        .toggleClass('open')
        -        .trigger($.Event('shown.bs.dropdown', relatedTarget))
        -    }
        -
        -    return false
        -  }
        -
        -  Dropdown.prototype.keydown = function (e) {
        -    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
        -
        -    var $this = $(this)
        -
        -    e.preventDefault()
        -    e.stopPropagation()
        -
        -    if ($this.is('.disabled, :disabled')) return
        -
        -    var $parent  = getParent($this)
        -    var isActive = $parent.hasClass('open')
        -
        -    if (!isActive && e.which != 27 || isActive && e.which == 27) {
        -      if (e.which == 27) $parent.find(toggle).trigger('focus')
        -      return $this.trigger('click')
        -    }
        -
        -    var desc = ' li:not(.disabled):visible a'
        -    var $items = $parent.find('.dropdown-menu' + desc)
        -
        -    if (!$items.length) return
        -
        -    var index = $items.index(e.target)
        -
        -    if (e.which == 38 && index > 0)                 index--         // up
        -    if (e.which == 40 && index < $items.length - 1) index++         // down
        -    if (!~index)                                    index = 0
        -
        -    $items.eq(index).trigger('focus')
        -  }
        -
        -
        -  // DROPDOWN PLUGIN DEFINITION
        -  // ==========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.dropdown')
        -
        -      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
        -      if (typeof option == 'string') data[option].call($this)
        -    })
        -  }
        -
        -  var old = $.fn.dropdown
        -
        -  $.fn.dropdown             = Plugin
        -  $.fn.dropdown.Constructor = Dropdown
        -
        -
        -  // DROPDOWN NO CONFLICT
        -  // ====================
        -
        -  $.fn.dropdown.noConflict = function () {
        -    $.fn.dropdown = old
        -    return this
        -  }
        -
        -
        -  // APPLY TO STANDARD DROPDOWN ELEMENTS
        -  // ===================================
        -
        -  $(document)
        -    .on('click.bs.dropdown.data-api', clearMenus)
        -    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
        -    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
        -    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
        -    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: modal.js v3.3.6
        - * http://getbootstrap.com/javascript/#modals
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // MODAL CLASS DEFINITION
        -  // ======================
        -
        -  var Modal = function (element, options) {
        -    this.options             = options
        -    this.$body               = $(document.body)
        -    this.$element            = $(element)
        -    this.$dialog             = this.$element.find('.modal-dialog')
        -    this.$backdrop           = null
        -    this.isShown             = null
        -    this.originalBodyPad     = null
        -    this.scrollbarWidth      = 0
        -    this.ignoreBackdropClick = false
        -
        -    if (this.options.remote) {
        -      this.$element
        -        .find('.modal-content')
        -        .load(this.options.remote, $.proxy(function () {
        -          this.$element.trigger('loaded.bs.modal')
        -        }, this))
        -    }
        -  }
        -
        -  Modal.VERSION  = '3.3.6'
        -
        -  Modal.TRANSITION_DURATION = 300
        -  Modal.BACKDROP_TRANSITION_DURATION = 150
        -
        -  Modal.DEFAULTS = {
        -    backdrop: true,
        -    keyboard: true,
        -    show: true
        -  }
        -
        -  Modal.prototype.toggle = function (_relatedTarget) {
        -    return this.isShown ? this.hide() : this.show(_relatedTarget)
        -  }
        -
        -  Modal.prototype.show = function (_relatedTarget) {
        -    var that = this
        -    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
        -
        -    this.$element.trigger(e)
        -
        -    if (this.isShown || e.isDefaultPrevented()) return
        -
        -    this.isShown = true
        -
        -    this.checkScrollbar()
        -    this.setScrollbar()
        -    this.$body.addClass('modal-open')
        -
        -    this.escape()
        -    this.resize()
        -
        -    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
        -
        -    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
        -      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        -        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
        -      })
        -    })
        -
        -    this.backdrop(function () {
        -      var transition = $.support.transition && that.$element.hasClass('fade')
        -
        -      if (!that.$element.parent().length) {
        -        that.$element.appendTo(that.$body) // don't move modals dom position
        -      }
        -
        -      that.$element
        -        .show()
        -        .scrollTop(0)
        -
        -      that.adjustDialog()
        -
        -      if (transition) {
        -        that.$element[0].offsetWidth // force reflow
        -      }
        -
        -      that.$element.addClass('in')
        -
        -      that.enforceFocus()
        -
        -      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
        -
        -      transition ?
        -        that.$dialog // wait for modal to slide in
        -          .one('bsTransitionEnd', function () {
        -            that.$element.trigger('focus').trigger(e)
        -          })
        -          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        -        that.$element.trigger('focus').trigger(e)
        -    })
        -  }
        -
        -  Modal.prototype.hide = function (e) {
        -    if (e) e.preventDefault()
        -
        -    e = $.Event('hide.bs.modal')
        -
        -    this.$element.trigger(e)
        -
        -    if (!this.isShown || e.isDefaultPrevented()) return
        -
        -    this.isShown = false
        -
        -    this.escape()
        -    this.resize()
        -
        -    $(document).off('focusin.bs.modal')
        -
        -    this.$element
        -      .removeClass('in')
        -      .off('click.dismiss.bs.modal')
        -      .off('mouseup.dismiss.bs.modal')
        -
        -    this.$dialog.off('mousedown.dismiss.bs.modal')
        -
        -    $.support.transition && this.$element.hasClass('fade') ?
        -      this.$element
        -        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        -        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        -      this.hideModal()
        -  }
        -
        -  Modal.prototype.enforceFocus = function () {
        -    $(document)
        -      .off('focusin.bs.modal') // guard against infinite focus loop
        -      .on('focusin.bs.modal', $.proxy(function (e) {
        -        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
        -          this.$element.trigger('focus')
        -        }
        -      }, this))
        -  }
        -
        -  Modal.prototype.escape = function () {
        -    if (this.isShown && this.options.keyboard) {
        -      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
        -        e.which == 27 && this.hide()
        -      }, this))
        -    } else if (!this.isShown) {
        -      this.$element.off('keydown.dismiss.bs.modal')
        -    }
        -  }
        -
        -  Modal.prototype.resize = function () {
        -    if (this.isShown) {
        -      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
        -    } else {
        -      $(window).off('resize.bs.modal')
        -    }
        -  }
        -
        -  Modal.prototype.hideModal = function () {
        -    var that = this
        -    this.$element.hide()
        -    this.backdrop(function () {
        -      that.$body.removeClass('modal-open')
        -      that.resetAdjustments()
        -      that.resetScrollbar()
        -      that.$element.trigger('hidden.bs.modal')
        -    })
        -  }
        -
        -  Modal.prototype.removeBackdrop = function () {
        -    this.$backdrop && this.$backdrop.remove()
        -    this.$backdrop = null
        -  }
        -
        -  Modal.prototype.backdrop = function (callback) {
        -    var that = this
        -    var animate = this.$element.hasClass('fade') ? 'fade' : ''
        -
        -    if (this.isShown && this.options.backdrop) {
        -      var doAnimate = $.support.transition && animate
        -
        -      this.$backdrop = $(document.createElement('div'))
        -        .addClass('modal-backdrop ' + animate)
        -        .appendTo(this.$body)
        -
        -      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        -        if (this.ignoreBackdropClick) {
        -          this.ignoreBackdropClick = false
        -          return
        -        }
        -        if (e.target !== e.currentTarget) return
        -        this.options.backdrop == 'static'
        -          ? this.$element[0].focus()
        -          : this.hide()
        -      }, this))
        -
        -      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
        -
        -      this.$backdrop.addClass('in')
        -
        -      if (!callback) return
        -
        -      doAnimate ?
        -        this.$backdrop
        -          .one('bsTransitionEnd', callback)
        -          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        -        callback()
        -
        -    } else if (!this.isShown && this.$backdrop) {
        -      this.$backdrop.removeClass('in')
        -
        -      var callbackRemove = function () {
        -        that.removeBackdrop()
        -        callback && callback()
        -      }
        -      $.support.transition && this.$element.hasClass('fade') ?
        -        this.$backdrop
        -          .one('bsTransitionEnd', callbackRemove)
        -          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        -        callbackRemove()
        -
        -    } else if (callback) {
        -      callback()
        -    }
        -  }
        -
        -  // these following methods are used to handle overflowing modals
        -
        -  Modal.prototype.handleUpdate = function () {
        -    this.adjustDialog()
        -  }
        -
        -  Modal.prototype.adjustDialog = function () {
        -    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
        -
        -    this.$element.css({
        -      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
        -      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
        -    })
        -  }
        -
        -  Modal.prototype.resetAdjustments = function () {
        -    this.$element.css({
        -      paddingLeft: '',
        -      paddingRight: ''
        -    })
        -  }
        -
        -  Modal.prototype.checkScrollbar = function () {
        -    var fullWindowWidth = window.innerWidth
        -    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
        -      var documentElementRect = document.documentElement.getBoundingClientRect()
        -      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
        -    }
        -    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
        -    this.scrollbarWidth = this.measureScrollbar()
        -  }
        -
        -  Modal.prototype.setScrollbar = function () {
        -    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
        -    this.originalBodyPad = document.body.style.paddingRight || ''
        -    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
        -  }
        -
        -  Modal.prototype.resetScrollbar = function () {
        -    this.$body.css('padding-right', this.originalBodyPad)
        -  }
        -
        -  Modal.prototype.measureScrollbar = function () { // thx walsh
        -    var scrollDiv = document.createElement('div')
        -    scrollDiv.className = 'modal-scrollbar-measure'
        -    this.$body.append(scrollDiv)
        -    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
        -    this.$body[0].removeChild(scrollDiv)
        -    return scrollbarWidth
        -  }
        -
        -
        -  // MODAL PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option, _relatedTarget) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.modal')
        -      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
        -
        -      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
        -      if (typeof option == 'string') data[option](_relatedTarget)
        -      else if (options.show) data.show(_relatedTarget)
        -    })
        -  }
        -
        -  var old = $.fn.modal
        -
        -  $.fn.modal             = Plugin
        -  $.fn.modal.Constructor = Modal
        -
        -
        -  // MODAL NO CONFLICT
        -  // =================
        -
        -  $.fn.modal.noConflict = function () {
        -    $.fn.modal = old
        -    return this
        -  }
        -
        -
        -  // MODAL DATA-API
        -  // ==============
        -
        -  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
        -    var $this   = $(this)
        -    var href    = $this.attr('href')
        -    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
        -    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
        -
        -    if ($this.is('a')) e.preventDefault()
        -
        -    $target.one('show.bs.modal', function (showEvent) {
        -      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
        -      $target.one('hidden.bs.modal', function () {
        -        $this.is(':visible') && $this.trigger('focus')
        -      })
        -    })
        -    Plugin.call($target, option, this)
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: tooltip.js v3.3.6
        - * http://getbootstrap.com/javascript/#tooltip
        - * Inspired by the original jQuery.tipsy by Jason Frame
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // TOOLTIP PUBLIC CLASS DEFINITION
        -  // ===============================
        -
        -  var Tooltip = function (element, options) {
        -    this.type       = null
        -    this.options    = null
        -    this.enabled    = null
        -    this.timeout    = null
        -    this.hoverState = null
        -    this.$element   = null
        -    this.inState    = null
        -
        -    this.init('tooltip', element, options)
        -  }
        -
        -  Tooltip.VERSION  = '3.3.6'
        -
        -  Tooltip.TRANSITION_DURATION = 150
        -
        -  Tooltip.DEFAULTS = {
        -    animation: true,
        -    placement: 'top',
        -    selector: false,
        -    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
        -    trigger: 'hover focus',
        -    title: '',
        -    delay: 0,
        -    html: false,
        -    container: false,
        -    viewport: {
        -      selector: 'body',
        -      padding: 0
        -    }
        -  }
        -
        -  Tooltip.prototype.init = function (type, element, options) {
        -    this.enabled   = true
        -    this.type      = type
        -    this.$element  = $(element)
        -    this.options   = this.getOptions(options)
        -    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
        -    this.inState   = { click: false, hover: false, focus: false }
        -
        -    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
        -      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
        -    }
        -
        -    var triggers = this.options.trigger.split(' ')
        -
        -    for (var i = triggers.length; i--;) {
        -      var trigger = triggers[i]
        -
        -      if (trigger == 'click') {
        -        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
        -      } else if (trigger != 'manual') {
        -        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        -        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
        -
        -        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        -        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
        -      }
        -    }
        -
        -    this.options.selector ?
        -      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
        -      this.fixTitle()
        -  }
        -
        -  Tooltip.prototype.getDefaults = function () {
        -    return Tooltip.DEFAULTS
        -  }
        -
        -  Tooltip.prototype.getOptions = function (options) {
        -    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
        -
        -    if (options.delay && typeof options.delay == 'number') {
        -      options.delay = {
        -        show: options.delay,
        -        hide: options.delay
        -      }
        -    }
        -
        -    return options
        -  }
        -
        -  Tooltip.prototype.getDelegateOptions = function () {
        -    var options  = {}
        -    var defaults = this.getDefaults()
        -
        -    this._options && $.each(this._options, function (key, value) {
        -      if (defaults[key] != value) options[key] = value
        -    })
        -
        -    return options
        -  }
        -
        -  Tooltip.prototype.enter = function (obj) {
        -    var self = obj instanceof this.constructor ?
        -      obj : $(obj.currentTarget).data('bs.' + this.type)
        -
        -    if (!self) {
        -      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        -      $(obj.currentTarget).data('bs.' + this.type, self)
        -    }
        -
        -    if (obj instanceof $.Event) {
        -      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
        -    }
        -
        -    if (self.tip().hasClass('in') || self.hoverState == 'in') {
        -      self.hoverState = 'in'
        -      return
        -    }
        -
        -    clearTimeout(self.timeout)
        -
        -    self.hoverState = 'in'
        -
        -    if (!self.options.delay || !self.options.delay.show) return self.show()
        -
        -    self.timeout = setTimeout(function () {
        -      if (self.hoverState == 'in') self.show()
        -    }, self.options.delay.show)
        -  }
        -
        -  Tooltip.prototype.isInStateTrue = function () {
        -    for (var key in this.inState) {
        -      if (this.inState[key]) return true
        -    }
        -
        -    return false
        -  }
        -
        -  Tooltip.prototype.leave = function (obj) {
        -    var self = obj instanceof this.constructor ?
        -      obj : $(obj.currentTarget).data('bs.' + this.type)
        -
        -    if (!self) {
        -      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        -      $(obj.currentTarget).data('bs.' + this.type, self)
        -    }
        -
        -    if (obj instanceof $.Event) {
        -      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
        -    }
        -
        -    if (self.isInStateTrue()) return
        -
        -    clearTimeout(self.timeout)
        -
        -    self.hoverState = 'out'
        -
        -    if (!self.options.delay || !self.options.delay.hide) return self.hide()
        -
        -    self.timeout = setTimeout(function () {
        -      if (self.hoverState == 'out') self.hide()
        -    }, self.options.delay.hide)
        -  }
        -
        -  Tooltip.prototype.show = function () {
        -    var e = $.Event('show.bs.' + this.type)
        -
        -    if (this.hasContent() && this.enabled) {
        -      this.$element.trigger(e)
        -
        -      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
        -      if (e.isDefaultPrevented() || !inDom) return
        -      var that = this
        -
        -      var $tip = this.tip()
        -
        -      var tipId = this.getUID(this.type)
        -
        -      this.setContent()
        -      $tip.attr('id', tipId)
        -      this.$element.attr('aria-describedby', tipId)
        -
        -      if (this.options.animation) $tip.addClass('fade')
        -
        -      var placement = typeof this.options.placement == 'function' ?
        -        this.options.placement.call(this, $tip[0], this.$element[0]) :
        -        this.options.placement
        -
        -      var autoToken = /\s?auto?\s?/i
        -      var autoPlace = autoToken.test(placement)
        -      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
        -
        -      $tip
        -        .detach()
        -        .css({ top: 0, left: 0, display: 'block' })
        -        .addClass(placement)
        -        .data('bs.' + this.type, this)
        -
        -      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
        -      this.$element.trigger('inserted.bs.' + this.type)
        -
        -      var pos          = this.getPosition()
        -      var actualWidth  = $tip[0].offsetWidth
        -      var actualHeight = $tip[0].offsetHeight
        -
        -      if (autoPlace) {
        -        var orgPlacement = placement
        -        var viewportDim = this.getPosition(this.$viewport)
        -
        -        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
        -                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
        -                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
        -                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
        -                    placement
        -
        -        $tip
        -          .removeClass(orgPlacement)
        -          .addClass(placement)
        -      }
        -
        -      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
        -
        -      this.applyPlacement(calculatedOffset, placement)
        -
        -      var complete = function () {
        -        var prevHoverState = that.hoverState
        -        that.$element.trigger('shown.bs.' + that.type)
        -        that.hoverState = null
        -
        -        if (prevHoverState == 'out') that.leave(that)
        -      }
        -
        -      $.support.transition && this.$tip.hasClass('fade') ?
        -        $tip
        -          .one('bsTransitionEnd', complete)
        -          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        -        complete()
        -    }
        -  }
        -
        -  Tooltip.prototype.applyPlacement = function (offset, placement) {
        -    var $tip   = this.tip()
        -    var width  = $tip[0].offsetWidth
        -    var height = $tip[0].offsetHeight
        -
        -    // manually read margins because getBoundingClientRect includes difference
        -    var marginTop = parseInt($tip.css('margin-top'), 10)
        -    var marginLeft = parseInt($tip.css('margin-left'), 10)
        -
        -    // we must check for NaN for ie 8/9
        -    if (isNaN(marginTop))  marginTop  = 0
        -    if (isNaN(marginLeft)) marginLeft = 0
        -
        -    offset.top  += marginTop
        -    offset.left += marginLeft
        -
        -    // $.fn.offset doesn't round pixel values
        -    // so we use setOffset directly with our own function B-0
        -    $.offset.setOffset($tip[0], $.extend({
        -      using: function (props) {
        -        $tip.css({
        -          top: Math.round(props.top),
        -          left: Math.round(props.left)
        -        })
        -      }
        -    }, offset), 0)
        -
        -    $tip.addClass('in')
        -
        -    // check to see if placing tip in new offset caused the tip to resize itself
        -    var actualWidth  = $tip[0].offsetWidth
        -    var actualHeight = $tip[0].offsetHeight
        -
        -    if (placement == 'top' && actualHeight != height) {
        -      offset.top = offset.top + height - actualHeight
        -    }
        -
        -    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
        -
        -    if (delta.left) offset.left += delta.left
        -    else offset.top += delta.top
        -
        -    var isVertical          = /top|bottom/.test(placement)
        -    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
        -    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
        -
        -    $tip.offset(offset)
        -    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
        -  }
        -
        -  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
        -    this.arrow()
        -      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
        -      .css(isVertical ? 'top' : 'left', '')
        -  }
        -
        -  Tooltip.prototype.setContent = function () {
        -    var $tip  = this.tip()
        -    var title = this.getTitle()
        -
        -    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
        -    $tip.removeClass('fade in top bottom left right')
        -  }
        -
        -  Tooltip.prototype.hide = function (callback) {
        -    var that = this
        -    var $tip = $(this.$tip)
        -    var e    = $.Event('hide.bs.' + this.type)
        -
        -    function complete() {
        -      if (that.hoverState != 'in') $tip.detach()
        -      that.$element
        -        .removeAttr('aria-describedby')
        -        .trigger('hidden.bs.' + that.type)
        -      callback && callback()
        -    }
        -
        -    this.$element.trigger(e)
        -
        -    if (e.isDefaultPrevented()) return
        -
        -    $tip.removeClass('in')
        -
        -    $.support.transition && $tip.hasClass('fade') ?
        -      $tip
        -        .one('bsTransitionEnd', complete)
        -        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        -      complete()
        -
        -    this.hoverState = null
        -
        -    return this
        -  }
        -
        -  Tooltip.prototype.fixTitle = function () {
        -    var $e = this.$element
        -    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
        -      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
        -    }
        -  }
        -
        -  Tooltip.prototype.hasContent = function () {
        -    return this.getTitle()
        -  }
        -
        -  Tooltip.prototype.getPosition = function ($element) {
        -    $element   = $element || this.$element
        -
        -    var el     = $element[0]
        -    var isBody = el.tagName == 'BODY'
        -
        -    var elRect    = el.getBoundingClientRect()
        -    if (elRect.width == null) {
        -      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
        -      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
        -    }
        -    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
        -    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
        -    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
        -
        -    return $.extend({}, elRect, scroll, outerDims, elOffset)
        -  }
        -
        -  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
        -    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
        -           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
        -           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        -        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
        -
        -  }
        -
        -  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
        -    var delta = { top: 0, left: 0 }
        -    if (!this.$viewport) return delta
        -
        -    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
        -    var viewportDimensions = this.getPosition(this.$viewport)
        -
        -    if (/right|left/.test(placement)) {
        -      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
        -      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
        -      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        -        delta.top = viewportDimensions.top - topEdgeOffset
        -      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        -        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
        -      }
        -    } else {
        -      var leftEdgeOffset  = pos.left - viewportPadding
        -      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
        -      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        -        delta.left = viewportDimensions.left - leftEdgeOffset
        -      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
        -        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
        -      }
        -    }
        -
        -    return delta
        -  }
        -
        -  Tooltip.prototype.getTitle = function () {
        -    var title
        -    var $e = this.$element
        -    var o  = this.options
        -
        -    title = $e.attr('data-original-title')
        -      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
        -
        -    return title
        -  }
        -
        -  Tooltip.prototype.getUID = function (prefix) {
        -    do prefix += ~~(Math.random() * 1000000)
        -    while (document.getElementById(prefix))
        -    return prefix
        -  }
        -
        -  Tooltip.prototype.tip = function () {
        -    if (!this.$tip) {
        -      this.$tip = $(this.options.template)
        -      if (this.$tip.length != 1) {
        -        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
        -      }
        -    }
        -    return this.$tip
        -  }
        -
        -  Tooltip.prototype.arrow = function () {
        -    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
        -  }
        -
        -  Tooltip.prototype.enable = function () {
        -    this.enabled = true
        -  }
        -
        -  Tooltip.prototype.disable = function () {
        -    this.enabled = false
        -  }
        -
        -  Tooltip.prototype.toggleEnabled = function () {
        -    this.enabled = !this.enabled
        -  }
        -
        -  Tooltip.prototype.toggle = function (e) {
        -    var self = this
        -    if (e) {
        -      self = $(e.currentTarget).data('bs.' + this.type)
        -      if (!self) {
        -        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        -        $(e.currentTarget).data('bs.' + this.type, self)
        -      }
        -    }
        -
        -    if (e) {
        -      self.inState.click = !self.inState.click
        -      if (self.isInStateTrue()) self.enter(self)
        -      else self.leave(self)
        -    } else {
        -      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
        -    }
        -  }
        -
        -  Tooltip.prototype.destroy = function () {
        -    var that = this
        -    clearTimeout(this.timeout)
        -    this.hide(function () {
        -      that.$element.off('.' + that.type).removeData('bs.' + that.type)
        -      if (that.$tip) {
        -        that.$tip.detach()
        -      }
        -      that.$tip = null
        -      that.$arrow = null
        -      that.$viewport = null
        -    })
        -  }
        -
        -
        -  // TOOLTIP PLUGIN DEFINITION
        -  // =========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.tooltip')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data && /destroy|hide/.test(option)) return
        -      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.tooltip
        -
        -  $.fn.tooltip             = Plugin
        -  $.fn.tooltip.Constructor = Tooltip
        -
        -
        -  // TOOLTIP NO CONFLICT
        -  // ===================
        -
        -  $.fn.tooltip.noConflict = function () {
        -    $.fn.tooltip = old
        -    return this
        -  }
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: popover.js v3.3.6
        - * http://getbootstrap.com/javascript/#popovers
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // POPOVER PUBLIC CLASS DEFINITION
        -  // ===============================
        -
        -  var Popover = function (element, options) {
        -    this.init('popover', element, options)
        -  }
        -
        -  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
        -
        -  Popover.VERSION  = '3.3.6'
        -
        -  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
        -    placement: 'right',
        -    trigger: 'click',
        -    content: '',
        -    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
        -  })
        -
        -
        -  // NOTE: POPOVER EXTENDS tooltip.js
        -  // ================================
        -
        -  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
        -
        -  Popover.prototype.constructor = Popover
        -
        -  Popover.prototype.getDefaults = function () {
        -    return Popover.DEFAULTS
        -  }
        -
        -  Popover.prototype.setContent = function () {
        -    var $tip    = this.tip()
        -    var title   = this.getTitle()
        -    var content = this.getContent()
        -
        -    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
        -    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
        -      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
        -    ](content)
        -
        -    $tip.removeClass('fade top bottom left right in')
        -
        -    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
        -    // this manually by checking the contents.
        -    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
        -  }
        -
        -  Popover.prototype.hasContent = function () {
        -    return this.getTitle() || this.getContent()
        -  }
        -
        -  Popover.prototype.getContent = function () {
        -    var $e = this.$element
        -    var o  = this.options
        -
        -    return $e.attr('data-content')
        -      || (typeof o.content == 'function' ?
        -            o.content.call($e[0]) :
        -            o.content)
        -  }
        -
        -  Popover.prototype.arrow = function () {
        -    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
        -  }
        -
        -
        -  // POPOVER PLUGIN DEFINITION
        -  // =========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.popover')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data && /destroy|hide/.test(option)) return
        -      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.popover
        -
        -  $.fn.popover             = Plugin
        -  $.fn.popover.Constructor = Popover
        -
        -
        -  // POPOVER NO CONFLICT
        -  // ===================
        -
        -  $.fn.popover.noConflict = function () {
        -    $.fn.popover = old
        -    return this
        -  }
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: scrollspy.js v3.3.6
        - * http://getbootstrap.com/javascript/#scrollspy
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // SCROLLSPY CLASS DEFINITION
        -  // ==========================
        -
        -  function ScrollSpy(element, options) {
        -    this.$body          = $(document.body)
        -    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
        -    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
        -    this.selector       = (this.options.target || '') + ' .nav li > a'
        -    this.offsets        = []
        -    this.targets        = []
        -    this.activeTarget   = null
        -    this.scrollHeight   = 0
        -
        -    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
        -    this.refresh()
        -    this.process()
        -  }
        -
        -  ScrollSpy.VERSION  = '3.3.6'
        -
        -  ScrollSpy.DEFAULTS = {
        -    offset: 10
        -  }
        -
        -  ScrollSpy.prototype.getScrollHeight = function () {
        -    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
        -  }
        -
        -  ScrollSpy.prototype.refresh = function () {
        -    var that          = this
        -    var offsetMethod  = 'offset'
        -    var offsetBase    = 0
        -
        -    this.offsets      = []
        -    this.targets      = []
        -    this.scrollHeight = this.getScrollHeight()
        -
        -    if (!$.isWindow(this.$scrollElement[0])) {
        -      offsetMethod = 'position'
        -      offsetBase   = this.$scrollElement.scrollTop()
        -    }
        -
        -    this.$body
        -      .find(this.selector)
        -      .map(function () {
        -        var $el   = $(this)
        -        var href  = $el.data('target') || $el.attr('href')
        -        var $href = /^#./.test(href) && $(href)
        -
        -        return ($href
        -          && $href.length
        -          && $href.is(':visible')
        -          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
        -      })
        -      .sort(function (a, b) { return a[0] - b[0] })
        -      .each(function () {
        -        that.offsets.push(this[0])
        -        that.targets.push(this[1])
        -      })
        -  }
        -
        -  ScrollSpy.prototype.process = function () {
        -    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
        -    var scrollHeight = this.getScrollHeight()
        -    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
        -    var offsets      = this.offsets
        -    var targets      = this.targets
        -    var activeTarget = this.activeTarget
        -    var i
        -
        -    if (this.scrollHeight != scrollHeight) {
        -      this.refresh()
        -    }
        -
        -    if (scrollTop >= maxScroll) {
        -      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
        -    }
        -
        -    if (activeTarget && scrollTop < offsets[0]) {
        -      this.activeTarget = null
        -      return this.clear()
        -    }
        -
        -    for (i = offsets.length; i--;) {
        -      activeTarget != targets[i]
        -        && scrollTop >= offsets[i]
        -        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
        -        && this.activate(targets[i])
        -    }
        -  }
        -
        -  ScrollSpy.prototype.activate = function (target) {
        -    this.activeTarget = target
        -
        -    this.clear()
        -
        -    var selector = this.selector +
        -      '[data-target="' + target + '"],' +
        -      this.selector + '[href="' + target + '"]'
        -
        -    var active = $(selector)
        -      .parents('li')
        -      .addClass('active')
        -
        -    if (active.parent('.dropdown-menu').length) {
        -      active = active
        -        .closest('li.dropdown')
        -        .addClass('active')
        -    }
        -
        -    active.trigger('activate.bs.scrollspy')
        -  }
        -
        -  ScrollSpy.prototype.clear = function () {
        -    $(this.selector)
        -      .parentsUntil(this.options.target, '.active')
        -      .removeClass('active')
        -  }
        -
        -
        -  // SCROLLSPY PLUGIN DEFINITION
        -  // ===========================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.scrollspy')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.scrollspy
        -
        -  $.fn.scrollspy             = Plugin
        -  $.fn.scrollspy.Constructor = ScrollSpy
        -
        -
        -  // SCROLLSPY NO CONFLICT
        -  // =====================
        -
        -  $.fn.scrollspy.noConflict = function () {
        -    $.fn.scrollspy = old
        -    return this
        -  }
        -
        -
        -  // SCROLLSPY DATA-API
        -  // ==================
        -
        -  $(window).on('load.bs.scrollspy.data-api', function () {
        -    $('[data-spy="scroll"]').each(function () {
        -      var $spy = $(this)
        -      Plugin.call($spy, $spy.data())
        -    })
        -  })
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: tab.js v3.3.6
        - * http://getbootstrap.com/javascript/#tabs
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // TAB CLASS DEFINITION
        -  // ====================
        -
        -  var Tab = function (element) {
        -    // jscs:disable requireDollarBeforejQueryAssignment
        -    this.element = $(element)
        -    // jscs:enable requireDollarBeforejQueryAssignment
        -  }
        -
        -  Tab.VERSION = '3.3.6'
        -
        -  Tab.TRANSITION_DURATION = 150
        -
        -  Tab.prototype.show = function () {
        -    var $this    = this.element
        -    var $ul      = $this.closest('ul:not(.dropdown-menu)')
        -    var selector = $this.data('target')
        -
        -    if (!selector) {
        -      selector = $this.attr('href')
        -      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        -    }
        -
        -    if ($this.parent('li').hasClass('active')) return
        -
        -    var $previous = $ul.find('.active:last a')
        -    var hideEvent = $.Event('hide.bs.tab', {
        -      relatedTarget: $this[0]
        -    })
        -    var showEvent = $.Event('show.bs.tab', {
        -      relatedTarget: $previous[0]
        -    })
        -
        -    $previous.trigger(hideEvent)
        -    $this.trigger(showEvent)
        -
        -    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
        -
        -    var $target = $(selector)
        -
        -    this.activate($this.closest('li'), $ul)
        -    this.activate($target, $target.parent(), function () {
        -      $previous.trigger({
        -        type: 'hidden.bs.tab',
        -        relatedTarget: $this[0]
        -      })
        -      $this.trigger({
        -        type: 'shown.bs.tab',
        -        relatedTarget: $previous[0]
        -      })
        -    })
        -  }
        -
        -  Tab.prototype.activate = function (element, container, callback) {
        -    var $active    = container.find('> .active')
        -    var transition = callback
        -      && $.support.transition
        -      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
        -
        -    function next() {
        -      $active
        -        .removeClass('active')
        -        .find('> .dropdown-menu > .active')
        -          .removeClass('active')
        -        .end()
        -        .find('[data-toggle="tab"]')
        -          .attr('aria-expanded', false)
        -
        -      element
        -        .addClass('active')
        -        .find('[data-toggle="tab"]')
        -          .attr('aria-expanded', true)
        -
        -      if (transition) {
        -        element[0].offsetWidth // reflow for transition
        -        element.addClass('in')
        -      } else {
        -        element.removeClass('fade')
        -      }
        -
        -      if (element.parent('.dropdown-menu').length) {
        -        element
        -          .closest('li.dropdown')
        -            .addClass('active')
        -          .end()
        -          .find('[data-toggle="tab"]')
        -            .attr('aria-expanded', true)
        -      }
        -
        -      callback && callback()
        -    }
        -
        -    $active.length && transition ?
        -      $active
        -        .one('bsTransitionEnd', next)
        -        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
        -      next()
        -
        -    $active.removeClass('in')
        -  }
        -
        -
        -  // TAB PLUGIN DEFINITION
        -  // =====================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this = $(this)
        -      var data  = $this.data('bs.tab')
        -
        -      if (!data) $this.data('bs.tab', (data = new Tab(this)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.tab
        -
        -  $.fn.tab             = Plugin
        -  $.fn.tab.Constructor = Tab
        -
        -
        -  // TAB NO CONFLICT
        -  // ===============
        -
        -  $.fn.tab.noConflict = function () {
        -    $.fn.tab = old
        -    return this
        -  }
        -
        -
        -  // TAB DATA-API
        -  // ============
        -
        -  var clickHandler = function (e) {
        -    e.preventDefault()
        -    Plugin.call($(this), 'show')
        -  }
        -
        -  $(document)
        -    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
        -    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
        -
        -}(jQuery);
        -
        -/* ========================================================================
        - * Bootstrap: affix.js v3.3.6
        - * http://getbootstrap.com/javascript/#affix
        - * ========================================================================
        - * Copyright 2011-2015 Twitter, Inc.
        - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        - * ======================================================================== */
        -
        -
        -+function ($) {
        -  'use strict';
        -
        -  // AFFIX CLASS DEFINITION
        -  // ======================
        -
        -  var Affix = function (element, options) {
        -    this.options = $.extend({}, Affix.DEFAULTS, options)
        -
        -    this.$target = $(this.options.target)
        -      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
        -      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
        -
        -    this.$element     = $(element)
        -    this.affixed      = null
        -    this.unpin        = null
        -    this.pinnedOffset = null
        -
        -    this.checkPosition()
        -  }
        -
        -  Affix.VERSION  = '3.3.6'
        -
        -  Affix.RESET    = 'affix affix-top affix-bottom'
        -
        -  Affix.DEFAULTS = {
        -    offset: 0,
        -    target: window
        -  }
        -
        -  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
        -    var scrollTop    = this.$target.scrollTop()
        -    var position     = this.$element.offset()
        -    var targetHeight = this.$target.height()
        -
        -    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
        -
        -    if (this.affixed == 'bottom') {
        -      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
        -      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
        -    }
        -
        -    var initializing   = this.affixed == null
        -    var colliderTop    = initializing ? scrollTop : position.top
        -    var colliderHeight = initializing ? targetHeight : height
        -
        -    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
        -    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
        -
        -    return false
        -  }
        -
        -  Affix.prototype.getPinnedOffset = function () {
        -    if (this.pinnedOffset) return this.pinnedOffset
        -    this.$element.removeClass(Affix.RESET).addClass('affix')
        -    var scrollTop = this.$target.scrollTop()
        -    var position  = this.$element.offset()
        -    return (this.pinnedOffset = position.top - scrollTop)
        -  }
        -
        -  Affix.prototype.checkPositionWithEventLoop = function () {
        -    setTimeout($.proxy(this.checkPosition, this), 1)
        -  }
        -
        -  Affix.prototype.checkPosition = function () {
        -    if (!this.$element.is(':visible')) return
        -
        -    var height       = this.$element.height()
        -    var offset       = this.options.offset
        -    var offsetTop    = offset.top
        -    var offsetBottom = offset.bottom
        -    var scrollHeight = Math.max($(document).height(), $(document.body).height())
        -
        -    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
        -    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
        -    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
        -
        -    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
        -
        -    if (this.affixed != affix) {
        -      if (this.unpin != null) this.$element.css('top', '')
        -
        -      var affixType = 'affix' + (affix ? '-' + affix : '')
        -      var e         = $.Event(affixType + '.bs.affix')
        -
        -      this.$element.trigger(e)
        -
        -      if (e.isDefaultPrevented()) return
        -
        -      this.affixed = affix
        -      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
        -
        -      this.$element
        -        .removeClass(Affix.RESET)
        -        .addClass(affixType)
        -        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
        -    }
        -
        -    if (affix == 'bottom') {
        -      this.$element.offset({
        -        top: scrollHeight - height - offsetBottom
        -      })
        -    }
        -  }
        -
        -
        -  // AFFIX PLUGIN DEFINITION
        -  // =======================
        -
        -  function Plugin(option) {
        -    return this.each(function () {
        -      var $this   = $(this)
        -      var data    = $this.data('bs.affix')
        -      var options = typeof option == 'object' && option
        -
        -      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
        -      if (typeof option == 'string') data[option]()
        -    })
        -  }
        -
        -  var old = $.fn.affix
        -
        -  $.fn.affix             = Plugin
        -  $.fn.affix.Constructor = Affix
        -
        -
        -  // AFFIX NO CONFLICT
        -  // =================
        -
        -  $.fn.affix.noConflict = function () {
        -    $.fn.affix = old
        -    return this
        -  }
        -
        -
        -  // AFFIX DATA-API
        -  // ==============
        -
        -  $(window).on('load', function () {
        -    $('[data-spy="affix"]').each(function () {
        -      var $spy = $(this)
        -      var data = $spy.data()
        -
        -      data.offset = data.offset || {}
        -
        -      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
        -      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
        -
        -      Plugin.call($spy, data)
        -    })
        -  })
        -
        -}(jQuery);
        diff --git a/resources/assets/js/components/alert.vue b/resources/assets/js/components/alert.vue
        new file mode 100644
        index 0000000000..e20394d7eb
        --- /dev/null
        +++ b/resources/assets/js/components/alert.vue
        @@ -0,0 +1,36 @@
        +
        +<style scoped>
        +</style>
        +
        +<template>
        +        <div class="col-md-12" :class="alertType">
        +            <div class="alert" :class="alertClassName">
        +                <button type="button" class="close" @click="hideEvent">&times;</button>
        +                <i class="fa fa-check faa-pulse animated" v-show="alertType == 'success'"></i>
        +                <strong>{{ title }} </strong>
        +                <slot></slot>
        +            </div>
        +        </div>
        +</template>
        +
        +<script>
        +    export default {
        +        /*
        +         * The component's data.
        +         */
        +        props: ['alertType', 'title'],
        +
        +        computed: {
        +            alertClassName() {
        +                return 'alert-' + this.alertType;
        +            }
        +        },
        +
        +        methods: {
        +            hideEvent() {
        +                this.$emit('hide');
        +            }
        +        }
        +    }
        +
        +</script>
        diff --git a/resources/assets/js/components/importer/importer-errors.vue b/resources/assets/js/components/importer/importer-errors.vue
        new file mode 100644
        index 0000000000..adc6841d4d
        --- /dev/null
        +++ b/resources/assets/js/components/importer/importer-errors.vue
        @@ -0,0 +1,42 @@
        +
        +<style scoped>
        +</style>
        +
        +<template>
        +    <div class="box" v-if="errors">
        +  <div class="box-body">
        +    <div class="alert alert-warning">
        +      <strong>Warning</strong> Some Errors occured while importing
        +    </div>
        +
        +    <div class="errors-table">
        +      <table class="table table-striped table-bordered" id="errors-table">
        +        <thead>
        +          <th>Item</th>
        +          <th>Errors</th>
        +        </thead>
        +        <tbody>
        +          <tr v-for="(error, item) in errors">
        +            <td>{{ item }}</td>
        +            <td v-for="(value, field) in error">
        +                <b>{{ field }}:</b>
        +                <span v-for="errorString in value">{{errorString[0]}}</span>
        +              <br />
        +            </td>
        +          </tr>
        +        </tbody>
        +      </table>
        +    </div>
        +  </div>
        +</div>
        +</template>
        +
        +<script>
        +    export default {
        +        /*
        +         * The component's data.
        +         */
        +         props: ['errors'],
        +    }
        +
        +</script>
        diff --git a/resources/assets/js/components/importer/importer-file.vue b/resources/assets/js/components/importer/importer-file.vue
        new file mode 100644
        index 0000000000..e061ade2b3
        --- /dev/null
        +++ b/resources/assets/js/components/importer/importer-file.vue
        @@ -0,0 +1,225 @@
        +<style>
        +tr {
        +    padding-left:30px;
        +}
        +</style>
        +
        +<template>
        +    <tr v-show="processDetail">
        +        <td colspan="3">
        +            <h4 class="modal-title">Import File:</h4>
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12">
        +                    <label for="import-type">Import Type:</label>
        +                </div>
        +                <div class="col-md-4 col-xs-12">
        +                    <select2 :options="options.importTypes" v-model="options.importType">
        +                        <option disabled value="0"></option>
        +                    </select2>
        +                </div>
        +            </div>
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12">
        +                    <label for="import-update">Update Existing Values?:</label>
        +                </div>
        +                <div class="col-md-4 col-xs-12">
        +                    <input type="checkbox" name="import-update" v-model="options.update">
        +                </div>
        +            </div>
        +
        +            <div class="col-md-12" style="padding-top: 30px;">
        +            <table class="table">
        +            <thead>
        +                <th>Header Field</th>
        +                <th>Import Field</th>
        +                <th>Sample Value</th>
        +            </thead>
        +            <tbody>
        +            <template v-for="(header, index) in file.header_row">
        +                <tr>
        +                    <td>
        +                    <label :for="header" class="controllabel">{{ header }}</label>
        +                    </td>
        +                    <td>
        +                        <div required>
        +                            <select2 :options="columns" v-model="columnMappings[header]">
        +                                <option value="0">Do Not Import</option>
        +                            </select2>
        +                        </div>
        +                    </td>
        +                    <td>
        +                        <div>{{ activeFile.first_row[index] }}</div>
        +                    </td>
        +                </tr>
        +                </template>
        +            </tbody>
        +            </table>
        +            </div>
        +        </td>
        +
        +        <td>
        +            <button type="button" class="btn btn-default" @click="processDetail = false">Cancel</button>
        +            <button type="submit" class="btn btn-primary" @click="postSave">Import</button>
        +            <div class="alert alert-success col-md-5 col-md-offset-1" style="text-align:left" v-if="statusText">{{ this.statusText }}</div>
        +        </td>
        +    </tr>
        +</template>
        +
        +<script>
        +    export default {
        +        props: ['file'],
        +        data() {
        +            return {
        +                activeFile: this.file,
        +                processDetail: false,
        +                statusText: null,
        +                options: {
        +                    importType: this.file.import_type,
        +                    update: false,
        +                    importTypes: [
        +                        { id: 'asset', text: 'Assets' },
        +                        { id: 'accessory', text: 'Accessories' },
        +                        { id: 'consumable', text: 'Consumables' },
        +                        { id: 'component', text: 'Components' },
        +                        { id: 'license', text: 'Licenses' },
        +                        { id: 'user', text: 'Users' }
        +                    ],
        +                    statusText: null,
        +                },
        +                columnOptions: {
        +                    general: [
        +                        {id: 'category', text: 'Category' },
        +                        {id: 'company', text: 'Company' },
        +                        {id: 'checkout_to', text: 'Checked out to' },
        +                        {id: 'email', text: 'Email' },
        +                        {id: 'first_name', text: 'First Name' },
        +                        {id: 'item_name', text: 'Item Name' },
        +                        {id: 'last_name', text: 'Last Name' },
        +                        {id: 'location', text: 'Location' },
        +                        {id: 'maintained', text: 'Maintained' },
        +                        {id: 'manufacturer', text: 'Manufacturer' },
        +                        {id: 'notes', text: 'Notes' },
        +                        {id: 'order_number', text: 'Order Number' },
        +                        {id: 'purchase_cost', text: 'Purchase Cost' },
        +                        {id: 'purchase_date', text: 'Purchase Date' },
        +                        {id: 'quantity', text: 'Quantity' },
        +                        {id: 'requestable', text: 'Requestable' },
        +                        {id: 'serial', text: 'Serial Number' },
        +                        {id: 'supplier', text: 'Supplier' },
        +                        {id: 'username', text: 'Username' },
        +                    ],
        +                    assets: [
        +                        {id: 'asset_tag', text: 'Asset Tag' },
        +                        {id: 'asset_model', text: 'Model Name' },
        +                        {id: 'image', text: 'Image Filename' },
        +                        {id: 'model_number', text: 'Model Number' },
        +                        {id: 'name', text: 'Full Name' },
        +                        {id: 'status', text: 'Status' },
        +                        {id: 'warranty_months', text: 'Warranty Months' },
        +                    ],
        +                    licenses: [
        +                        {id: 'expiration_date', text: 'Expiration Date' },
        +                        {id: 'license_email', text: 'Licensed To Email' },
        +                        {id: 'license_name', text: 'Licensed To Name' },
        +                        {id: 'purchase_order', text: 'Purchase Order' },
        +                        {id: 'reassignable', text: 'Reassignable' },
        +                        {id: 'seats', text: 'Seats' },
        +                    ],
        +                    users: [
        +                        {id: 'employee_num', text: 'Employee Number' },
        +                        {id: 'jobtitle', text: 'Job Title' },
        +                        {id: 'phone_number', text: 'Phone Number' },
        +                    ],
        +                    customFields: [],
        +                },
        +                columnMappings: this.file.field_map || {},
        +                activeColumn: null,
        +            }
        +        },
        +        created() {
        +            this.fetchCustomFields();
        +            window.eventHub.$on('showDetails', this.toggleExtendedDisplay)
        +            this.populateSelect2ActiveItems();
        +        },
        +        computed: {
        +            columns() {
        +                switch(this.options.importType) {
        +                    case 'asset':
        +                        return this.columnOptions.general.concat(this.columnOptions.assets).concat(this.columnOptions.customFields);
        +                    case 'license':
        +                        return this.columnOptions.general.concat(this.columnOptions.licenses);
        +                    case 'user':
        +                        return this.columnOptions.general.concat(this.columnOptions.users);
        +                }
        +                return this.columnOptions.general;
        +            }
        +        },
        +        methods: {
        +            fetchCustomFields() {
        +                this.$http.get('/api/v1/fields')
        +                .then( ({data}) => {
        +                    data = data.rows;
        +                    data.forEach((item) => {
        +                        this.columnOptions.customFields.push({
        +                            'id': item.db_column_name,
        +                            'text': item.name,
        +                        })
        +                    })
        +                });
        +            },
        +            postSave() {
        +                this.statusText = "Processing...";
        +                this.$http.post('/api/v1/imports/process/'+this.file.id, {
        +                    'import-update': this.options.update,
        +                    'import-type': this.options.importType,
        +                    'column-mappings': this.columnMappings
        +                }).then( (response) => {
        +                    // Success
        +                    this.statusText = "Success... Redirecting.";
        +                    window.location.href = response.body.messages.redirect_url;
        +                }, (response) => {
        +                    // Failure
        +                    if(response.body.status == 'import-errors') {
        +                        window.eventHub.$emit('importErrors', response.body.messages);
        +                        this.statusText = "Error";
        +                    } else {
        +                        this.$emit('alert', {
        +                            message: response.body.messages,
        +                            type: "danger",
        +                            visible: true,
        +                        })
        +                    }
        +                    this.displayImportModal=false;
        +                });
        +            },
        +            populateSelect2ActiveItems() {
        +                if(this.file.field_map == null) {
        +                    // Begin by populating the active selection in dropdowns with blank values.
        +                    for (var i=0; i < this.file.header_row.length; i++) {
        +                        this.$set(this.columnMappings, this.file.header_row[i], null);
        +                    }
        +                    // Then, for any values that have a likely match, we make that active.
        +                    for(var j=0; j < this.columns.length; j++) {
        +                        let column = this.columns[j];
        +                        let index = this.file.header_row.indexOf(column.text)
        +                        if(index != -1) {
        +                            this.$set(this.columnMappings, this.file.header_row[index], column.id)
        +                        }
        +                    }
        +                }
        +            },
        +            toggleExtendedDisplay(fileId) {
        +                if(fileId == this.file.id) {
        +                    this.processDetail = !this.processDetail
        +                }
        +            },
        +            updateModel(header, value) {
        +                console.log(header, value);
        +                this.columnMappings[header] = value;
        +            }
        +        },
        +        components: {
        +            select2: require('../select2.vue')
        +        }
        +    }
        +</script>
        diff --git a/resources/assets/js/components/importer/importer.vue b/resources/assets/js/components/importer/importer.vue
        new file mode 100644
        index 0000000000..33b19d502f
        --- /dev/null
        +++ b/resources/assets/js/components/importer/importer.vue
        @@ -0,0 +1,118 @@
        +<style scoped>
        +td {
        +    font-size: 13px;
        +}
        +
        +th {
        +    font-size: 13px;
        +}
        +</style>
        +
        +<script>
        +    require('blueimp-file-upload');
        +    export default {
        +        /*
        +         * The component's data.
        +         */
        +        data() {
        +            return {
        +                files: [],
        +                displayImportModal: false,
        +                activeFile: null,
        +                alert: {
        +                    type: null,
        +                    message: null,
        +                    visible: false,
        +                },
        +                importErrors: null,
        +                progress: {
        +                    currentClass: "progress-bar-warning",
        +                    currentPercent: "0",
        +                    statusText: '',
        +                    visible: false
        +                }
        +            };
        +        },
        +
        +        /**
        +         * Prepare the component (Vue 2.x).
        +         */
        +        mounted() {
        +            window.eventHub.$on('importErrors', this.updateImportErrors);
        +            this.fetchFiles();
        +            let vm = this;
        +            $('#fileupload').fileupload({
        +                dataType: 'json',
        +                done(e, data) {
        +                    vm.progress.currentClass="progress-bar-success";
        +                    vm.progress.statusText = "Success!";
        +                    vm.files = data.result.files.concat(vm.files);
        +                    console.log(data.result.header_row);
        +                },
        +                add(e, data) {
        +                    data.headers = {
        +                        "X-Requested-With": 'XMLHttpRequest',
        +                        "X-CSRF-TOKEN": Laravel.csrfToken
        +                    };
        +                    data.process().done( () => {data.submit();});
        +                    vm.progress.visible=true;
        +                },
        +                progress(e, data) {
        +                    var progress = parseInt((data.loaded / data.total * 100, 10));
        +                    vm.progress.currentPercent = progress;
        +                    vm.progress.statusText = progress+'% Complete';
        +                },
        +                fail(e, data) {
        +                    vm.progress.currentClass = "progress-bar-danger";
        +                    // Display any errors returned from the $.ajax()
        +                    vm.progress.statusText = data.jqXHR.responseJSON.messages;
        +                }
        +            })
        +        },
        +
        +        methods: {
        +            fetchFiles() {
        +                this.$http.get('/api/v1/imports')
        +                .then( ({data}) => this.files = data, // Success
        +                    //Fail
        +                (response) => {
        +                    this.alert.type="danger";
        +                    this.alert.visible=true;
        +                    this.alert.message="Something went wrong fetching files...";
        +                });
        +            },
        +            deleteFile(file, key) {
        +                this.$http.delete("/api/v1/imports/"+file.id)
        +                .then((response) => this.files.splice(key, 1), // Success, remove file from array.
        +                    (response) => {// Fail
        +                        this.alert.type="danger";
        +                        this.alert.visible=true;
        +                        this.alert.message=response.body.messages;
        +                    }
        +                );
        +            },
        +            toggleEvent(fileId) {
        +                window.eventHub.$emit('showDetails', fileId)
        +            },
        +            updateAlert(alert) {
        +                this.alert = alert;
        +            },
        +            updateImportErrors(errors) {
        +                this.importErrors = errors;
        +            }
        +        },
        +
        +        computed: {
        +            progressWidth() {
        +                return "width: "+this.progress.currentPercent*10+'%';
        +            }
        +        },
        +
        +        components: {
        +            alert: require('../alert.vue'),
        +            errors: require('./importer-errors.vue'),
        +            importFile: require('./importer-file.vue'),
        +        }
        +    }
        +
        +</script>
        diff --git a/resources/assets/js/components/passport/AuthorizedClients.vue b/resources/assets/js/components/passport/AuthorizedClients.vue
        new file mode 100644
        index 0000000000..7d7e3c283b
        --- /dev/null
        +++ b/resources/assets/js/components/passport/AuthorizedClients.vue
        @@ -0,0 +1,111 @@
        +<style scoped>
        +    .action-link {
        +        cursor: pointer;
        +    }
        +
        +    .m-b-none {
        +        margin-bottom: 0;
        +    }
        +</style>
        +
        +<template>
        +    <div>
        +        <div v-if="tokens.length > 0">
        +            <div class="panel panel-default">
        +                <div class="panel-heading">Authorized Applications</div>
        +
        +                <div class="panel-body">
        +                    <!-- Authorized Tokens -->
        +                    <table class="table table-borderless m-b-none">
        +                        <thead>
        +                            <tr>
        +                                <th>Name</th>
        +                                <th>Scopes</th>
        +                                <th></th>
        +                            </tr>
        +                        </thead>
        +
        +                        <tbody>
        +                            <tr v-for="token in tokens">
        +                                <!-- Client Name -->
        +                                <td style="vertical-align: middle;">
        +                                    {{ token.client.name }}
        +                                </td>
        +
        +                                <!-- Scopes -->
        +                                <td style="vertical-align: middle;">
        +                                    <span v-if="token.scopes.length > 0">
        +                                        {{ token.scopes.join(', ') }}
        +                                    </span>
        +                                </td>
        +
        +                                <!-- Revoke Button -->
        +                                <td style="vertical-align: middle;">
        +                                    <a class="action-link text-danger" @click="revoke(token)">
        +                                        Revoke
        +                                    </a>
        +                                </td>
        +                            </tr>
        +                        </tbody>
        +                    </table>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +</template>
        +
        +<script>
        +    export default {
        +        /*
        +         * The component's data.
        +         */
        +        data() {
        +            return {
        +                tokens: []
        +            };
        +        },
        +
        +        /**
        +         * Prepare the component (Vue 1.x).
        +         */
        +        ready() {
        +            this.prepareComponent();
        +        },
        +
        +        /**
        +         * Prepare the component (Vue 2.x).
        +         */
        +        mounted() {
        +            this.prepareComponent();
        +        },
        +
        +        methods: {
        +            /**
        +             * Prepare the component (Vue 2.x).
        +             */
        +            prepareComponent() {
        +                this.getTokens();
        +            },
        +
        +            /**
        +             * Get all of the authorized tokens for the user.
        +             */
        +            getTokens() {
        +                this.$http.get('/oauth/tokens')
        +                        .then(response => {
        +                            this.tokens = response.data;
        +                        });
        +            },
        +
        +            /**
        +             * Revoke the given token.
        +             */
        +            revoke(token) {
        +                this.$http.delete('/oauth/tokens/' + token.id)
        +                        .then(response => {
        +                            this.getTokens();
        +                        });
        +            }
        +        }
        +    }
        +</script>
        diff --git a/resources/assets/js/components/passport/Clients.vue b/resources/assets/js/components/passport/Clients.vue
        new file mode 100644
        index 0000000000..981a21d84a
        --- /dev/null
        +++ b/resources/assets/js/components/passport/Clients.vue
        @@ -0,0 +1,354 @@
        +<style scoped>
        +    .action-link {
        +        cursor: pointer;
        +    }
        +
        +    .m-b-none {
        +        margin-bottom: 0;
        +    }
        +</style>
        +
        +<template>
        +    <div>
        +        <div class="panel panel-default">
        +            <div class="panel-heading">
        +                <div style="display: flex; justify-content: space-between; align-items: center;">
        +                    <span>
        +                        OAuth Clients
        +                    </span>
        +
        +                    <a class="action-link" @click="showCreateClientForm">
        +                        Create New Client
        +                    </a>
        +                </div>
        +            </div>
        +
        +            <div class="panel-body">
        +                <!-- Current Clients -->
        +                <p class="m-b-none" v-if="clients.length === 0">
        +                    You have not created any OAuth clients.
        +                </p>
        +
        +                <table class="table table-borderless m-b-none" v-if="clients.length > 0">
        +                    <thead>
        +                        <tr>
        +                            <th>Client ID</th>
        +                            <th>Name</th>
        +                            <th>Secret</th>
        +                            <th></th>
        +                            <th></th>
        +                        </tr>
        +                    </thead>
        +
        +                    <tbody>
        +                        <tr v-for="client in clients">
        +                            <!-- ID -->
        +                            <td style="vertical-align: middle;">
        +                                {{ client.id }}
        +                            </td>
        +
        +                            <!-- Name -->
        +                            <td style="vertical-align: middle;">
        +                                {{ client.name }}
        +                            </td>
        +
        +                            <!-- Secret -->
        +                            <td style="vertical-align: middle;">
        +                                <code>{{ client.secret }}</code>
        +                            </td>
        +
        +                            <!-- Edit Button -->
        +                            <td style="vertical-align: middle;">
        +                                <a class="action-link" @click="edit(client)">
        +                                    Edit
        +                                </a>
        +                            </td>
        +
        +                            <!-- Delete Button -->
        +                            <td style="vertical-align: middle;">
        +                                <a class="action-link text-danger" @click="destroy(client)">
        +                                    Delete
        +                                </a>
        +                            </td>
        +                        </tr>
        +                    </tbody>
        +                </table>
        +            </div>
        +        </div>
        +
        +        <!-- Create Client Modal -->
        +        <div class="modal fade" id="modal-create-client" tabindex="-1" role="dialog">
        +            <div class="modal-dialog">
        +                <div class="modal-content">
        +                    <div class="modal-header">
        +                        <button type="button " class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        +
        +                        <h4 class="modal-title">
        +                            Create Client
        +                        </h4>
        +                    </div>
        +
        +                    <div class="modal-body">
        +                        <!-- Form Errors -->
        +                        <div class="alert alert-danger" v-if="createForm.errors.length > 0">
        +                            <p><strong>Whoops!</strong> Something went wrong!</p>
        +                            <br>
        +                            <ul>
        +                                <li v-for="error in createForm.errors">
        +                                    {{ error }}
        +                                </li>
        +                            </ul>
        +                        </div>
        +
        +                        <!-- Create Client Form -->
        +                        <form class="form-horizontal" role="form">
        +                            <!-- Name -->
        +                            <div class="form-group">
        +                                <label class="col-md-3 control-label">Name</label>
        +
        +                                <div class="col-md-7">
        +                                    <input id="create-client-name" type="text" class="form-control"
        +                                                                @keyup.enter="store" v-model="createForm.name">
        +
        +                                    <span class="help-block">
        +                                        Something your users will recognize and trust.
        +                                    </span>
        +                                </div>
        +                            </div>
        +
        +                            <!-- Redirect URL -->
        +                            <div class="form-group">
        +                                <label class="col-md-3 control-label">Redirect URL</label>
        +
        +                                <div class="col-md-7">
        +                                    <input type="text" class="form-control" name="redirect"
        +                                                    @keyup.enter="store" v-model="createForm.redirect">
        +
        +                                    <span class="help-block">
        +                                        Your application's authorization callback URL.
        +                                    </span>
        +                                </div>
        +                            </div>
        +                        </form>
        +                    </div>
        +
        +                    <!-- Modal Actions -->
        +                    <div class="modal-footer">
        +                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        +
        +                        <button type="button" class="btn btn-primary" @click="store">
        +                            Create
        +                        </button>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +
        +        <!-- Edit Client Modal -->
        +        <div class="modal fade" id="modal-edit-client" tabindex="-1" role="dialog">
        +            <div class="modal-dialog">
        +                <div class="modal-content">
        +                    <div class="modal-header">
        +                        <button type="button " class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        +
        +                        <h4 class="modal-title">
        +                            Edit Client
        +                        </h4>
        +                    </div>
        +
        +                    <div class="modal-body">
        +                        <!-- Form Errors -->
        +                        <div class="alert alert-danger" v-if="editForm.errors.length > 0">
        +                            <p><strong>Whoops!</strong> Something went wrong!</p>
        +                            <br>
        +                            <ul>
        +                                <li v-for="error in editForm.errors">
        +                                    {{ error }}
        +                                </li>
        +                            </ul>
        +                        </div>
        +
        +                        <!-- Edit Client Form -->
        +                        <form class="form-horizontal" role="form">
        +                            <!-- Name -->
        +                            <div class="form-group">
        +                                <label class="col-md-3 control-label">Name</label>
        +
        +                                <div class="col-md-7">
        +                                    <input id="edit-client-name" type="text" class="form-control"
        +                                                                @keyup.enter="update" v-model="editForm.name">
        +
        +                                    <span class="help-block">
        +                                        Something your users will recognize and trust.
        +                                    </span>
        +                                </div>
        +                            </div>
        +
        +                            <!-- Redirect URL -->
        +                            <div class="form-group">
        +                                <label class="col-md-3 control-label">Redirect URL</label>
        +
        +                                <div class="col-md-7">
        +                                    <input type="text" class="form-control" name="redirect"
        +                                                    @keyup.enter="update" v-model="editForm.redirect">
        +
        +                                    <span class="help-block">
        +                                        Your application's authorization callback URL.
        +                                    </span>
        +                                </div>
        +                            </div>
        +                        </form>
        +                    </div>
        +
        +                    <!-- Modal Actions -->
        +                    <div class="modal-footer">
        +                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        +
        +                        <button type="button" class="btn btn-primary" @click="update">
        +                            Save Changes
        +                        </button>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +</template>
        +
        +<script>
        +    export default {
        +        /*
        +         * The component's data.
        +         */
        +        data() {
        +            return {
        +                clients: [],
        +
        +                createForm: {
        +                    errors: [],
        +                    name: '',
        +                    redirect: ''
        +                },
        +
        +                editForm: {
        +                    errors: [],
        +                    name: '',
        +                    redirect: ''
        +                }
        +            };
        +        },
        +
        +        /**
        +         * Prepare the component (Vue 1.x).
        +         */
        +        ready() {
        +            this.prepareComponent();
        +        },
        +
        +        /**
        +         * Prepare the component (Vue 2.x).
        +         */
        +        mounted() {
        +            this.prepareComponent();
        +        },
        +
        +        methods: {
        +            /**
        +             * Prepare the component.
        +             */
        +            prepareComponent() {
        +                this.getClients();
        +
        +                $('#modal-create-client').on('shown.bs.modal', () => {
        +                    $('#create-client-name').focus();
        +                });
        +
        +                $('#modal-edit-client').on('shown.bs.modal', () => {
        +                    $('#edit-client-name').focus();
        +                });
        +            },
        +
        +            /**
        +             * Get all of the OAuth clients for the user.
        +             */
        +            getClients() {
        +                this.$http.get('/oauth/clients')
        +                        .then(response => {
        +                            this.clients = response.data;
        +                        });
        +            },
        +
        +            /**
        +             * Show the form for creating new clients.
        +             */
        +            showCreateClientForm() {
        +                $('#modal-create-client').modal('show');
        +            },
        +
        +            /**
        +             * Create a new OAuth client for the user.
        +             */
        +            store() {
        +                this.persistClient(
        +                    'post', '/oauth/clients',
        +                    this.createForm, '#modal-create-client'
        +                );
        +            },
        +
        +            /**
        +             * Edit the given client.
        +             */
        +            edit(client) {
        +                this.editForm.id = client.id;
        +                this.editForm.name = client.name;
        +                this.editForm.redirect = client.redirect;
        +
        +                $('#modal-edit-client').modal('show');
        +            },
        +
        +            /**
        +             * Update the client being edited.
        +             */
        +            update() {
        +                this.persistClient(
        +                    'put', '/oauth/clients/' + this.editForm.id,
        +                    this.editForm, '#modal-edit-client'
        +                );
        +            },
        +
        +            /**
        +             * Persist the client to storage using the given form.
        +             */
        +            persistClient(method, uri, form, modal) {
        +                form.errors = [];
        +
        +                this.$http[method](uri, form)
        +                    .then(response => {
        +                        this.getClients();
        +
        +                        form.name = '';
        +                        form.redirect = '';
        +                        form.errors = [];
        +
        +                        $(modal).modal('hide');
        +                    })
        +                    .catch(response => {
        +                        if (typeof response.data === 'object') {
        +                            form.errors = _.flatten(_.toArray(response.data));
        +                        } else {
        +                            form.errors = ['Something went wrong. Please try again.'];
        +                        }
        +                    });
        +            },
        +
        +            /**
        +             * Destroy the given client.
        +             */
        +            destroy(client) {
        +                this.$http.delete('/oauth/clients/' + client.id)
        +                        .then(response => {
        +                            this.getClients();
        +                        });
        +            }
        +        }
        +    }
        +</script>
        diff --git a/resources/assets/js/components/passport/PersonalAccessTokens.vue b/resources/assets/js/components/passport/PersonalAccessTokens.vue
        new file mode 100644
        index 0000000000..0daf253c0d
        --- /dev/null
        +++ b/resources/assets/js/components/passport/PersonalAccessTokens.vue
        @@ -0,0 +1,303 @@
        +<style scoped>
        +    .action-link {
        +        cursor: pointer;
        +    }
        +
        +    .m-b-none {
        +        margin-bottom: 0;
        +    }
        +</style>
        +
        +<template>
        +    <div>
        +        <div>
        +            <div class="panel panel-default">
        +                <div class="panel-heading">
        +                    <div style="display: flex; justify-content: space-between; align-items: center;">
        +                        <span>
        +                            Personal Access Tokens
        +                        </span>
        +
        +                        <a class="action-link" @click="showCreateTokenForm">
        +                            Create New Token
        +                        </a>
        +                    </div>
        +                </div>
        +
        +                <div class="panel-body">
        +                    <!-- No Tokens Notice -->
        +                    <p class="m-b-none" v-if="tokens.length === 0">
        +                        You have not created any personal access tokens.
        +                    </p>
        +
        +                    <!-- Personal Access Tokens -->
        +                    <table class="table table-borderless m-b-none" v-if="tokens.length > 0">
        +                        <thead>
        +                            <tr>
        +                                <th>Name</th>
        +                                <th></th>
        +                            </tr>
        +                        </thead>
        +
        +                        <tbody>
        +                            <tr v-for="token in tokens">
        +                                <!-- Client Name -->
        +                                <td style="vertical-align: middle;">
        +                                    {{ token.name }}
        +                                </td>
        +
        +                                <!-- Delete Button -->
        +                                <td style="vertical-align: middle;">
        +                                    <a class="action-link text-danger" @click="revoke(token)">
        +                                        Delete
        +                                    </a>
        +                                </td>
        +                            </tr>
        +                        </tbody>
        +                    </table>
        +                </div>
        +            </div>
        +        </div>
        +
        +        <!-- Create Token Modal -->
        +        <div class="modal fade" id="modal-create-token" tabindex="-1" role="dialog">
        +            <div class="modal-dialog">
        +                <div class="modal-content">
        +                    <div class="modal-header">
        +                        <button type="button " class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        +
        +                        <h4 class="modal-title">
        +                            Create Token
        +                        </h4>
        +                    </div>
        +
        +                    <div class="modal-body">
        +                        <!-- Form Errors -->
        +                        <div class="alert alert-danger" v-if="form.errors.length > 0">
        +                            <p><strong>Whoops!</strong> Something went wrong!</p>
        +                            <br>
        +                            <ul>
        +                                <li v-for="error in form.errors">
        +                                    {{ error }}
        +                                </li>
        +                            </ul>
        +                        </div>
        +
        +                        <!-- Create Token Form -->
        +                        <form class="form-horizontal" role="form" @submit.prevent="store">
        +                            <!-- Name -->
        +                            <div class="form-group">
        +                                <label class="col-md-4 control-label">Name</label>
        +
        +                                <div class="col-md-6">
        +                                    <input id="create-token-name" type="text" class="form-control" name="name" v-model="form.name">
        +                                </div>
        +                            </div>
        +
        +                            <!-- Scopes -->
        +                            <div class="form-group" v-if="scopes.length > 0">
        +                                <label class="col-md-4 control-label">Scopes</label>
        +
        +                                <div class="col-md-6">
        +                                    <div v-for="scope in scopes">
        +                                        <div class="checkbox">
        +                                            <label>
        +                                                <input type="checkbox"
        +                                                    @click="toggleScope(scope.id)"
        +                                                    :checked="scopeIsAssigned(scope.id)">
        +
        +                                                    {{ scope.id }}
        +                                            </label>
        +                                        </div>
        +                                    </div>
        +                                </div>
        +                            </div>
        +                        </form>
        +                    </div>
        +
        +                    <!-- Modal Actions -->
        +                    <div class="modal-footer">
        +                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        +
        +                        <button type="button" class="btn btn-primary" @click="store">
        +                            Create
        +                        </button>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +
        +        <!-- Access Token Modal -->
        +        <div class="modal fade" id="modal-access-token" tabindex="-1" role="dialog">
        +            <div class="modal-dialog">
        +                <div class="modal-content">
        +                    <div class="modal-header">
        +                        <button type="button " class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        +
        +                        <h4 class="modal-title">
        +                            Personal Access Token
        +                        </h4>
        +                    </div>
        +
        +                    <div class="modal-body">
        +                        <p>
        +                            Here is your new personal access token. This is the only time it will be shown so don't lose it!
        +                            You may now use this token to make API requests.
        +                        </p>
        +
        +                        <pre><code>{{ accessToken }}</code></pre>
        +                    </div>
        +
        +                    <!-- Modal Actions -->
        +                    <div class="modal-footer">
        +                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +</template>
        +
        +<script>
        +    export default {
        +        /*
        +         * The component's data.
        +         */
        +        data() {
        +            return {
        +                accessToken: null,
        +
        +                tokens: [],
        +                scopes: [],
        +
        +                form: {
        +                    name: '',
        +                    scopes: [],
        +                    errors: []
        +                }
        +            };
        +        },
        +
        +        /**
        +         * Prepare the component (Vue 1.x).
        +         */
        +        ready() {
        +            this.prepareComponent();
        +        },
        +
        +        /**
        +         * Prepare the component (Vue 2.x).
        +         */
        +        mounted() {
        +            this.prepareComponent();
        +        },
        +
        +        methods: {
        +            /**
        +             * Prepare the component.
        +             */
        +            prepareComponent() {
        +                this.getTokens();
        +                this.getScopes();
        +
        +                $('#modal-create-token').on('shown.bs.modal', () => {
        +                    $('#create-token-name').focus();
        +                });
        +            },
        +
        +            /**
        +             * Get all of the personal access tokens for the user.
        +             */
        +            getTokens() {
        +                this.$http.get('/oauth/personal-access-tokens')
        +                        .then(response => {
        +                            this.tokens = response.data;
        +                        });
        +            },
        +
        +            /**
        +             * Get all of the available scopes.
        +             */
        +            getScopes() {
        +                this.$http.get('/oauth/scopes')
        +                        .then(response => {
        +                            this.scopes = response.data;
        +                        });
        +            },
        +
        +            /**
        +             * Show the form for creating new tokens.
        +             */
        +            showCreateTokenForm() {
        +                $('#modal-create-token').modal('show');
        +            },
        +
        +            /**
        +             * Create a new personal access token.
        +             */
        +            store() {
        +                this.accessToken = null;
        +
        +                this.form.errors = [];
        +
        +                this.$http.post('/oauth/personal-access-tokens', this.form)
        +                        .then(response => {
        +                            this.form.name = '';
        +                            this.form.scopes = [];
        +                            this.form.errors = [];
        +
        +                            this.tokens.push(response.data.token);
        +
        +                            this.showAccessToken(response.data.accessToken);
        +                        })
        +                        .catch(response => {
        +                            if (typeof response.data === 'object') {
        +                                this.form.errors = _.flatten(_.toArray(response.data));
        +                            } else {
        +                            console.dir(this.form);
        +                                this.form.errors = ['Something went wrong. Please try again.'];
        +                            }
        +                        });
        +            },
        +
        +            /**
        +             * Toggle the given scope in the list of assigned scopes.
        +             */
        +            toggleScope(scope) {
        +                if (this.scopeIsAssigned(scope)) {
        +                    this.form.scopes = _.reject(this.form.scopes, s => s == scope);
        +                } else {
        +                    this.form.scopes.push(scope);
        +                }
        +            },
        +
        +            /**
        +             * Determine if the given scope has been assigned to the token.
        +             */
        +            scopeIsAssigned(scope) {
        +                return _.indexOf(this.form.scopes, scope) >= 0;
        +            },
        +
        +            /**
        +             * Show the given access token to the user.
        +             */
        +            showAccessToken(accessToken) {
        +                $('#modal-create-token').modal('hide');
        +
        +                this.accessToken = accessToken;
        +
        +                $('#modal-access-token').modal('show');
        +            },
        +
        +            /**
        +             * Revoke the given token.
        +             */
        +            revoke(token) {
        +                this.$http.delete('/oauth/personal-access-tokens/' + token.id)
        +                        .then(response => {
        +                            this.getTokens();
        +                        });
        +            }
        +        }
        +    }
        +</script>
        diff --git a/resources/assets/js/components/select2.vue b/resources/assets/js/components/select2.vue
        new file mode 100644
        index 0000000000..16e01ccb0b
        --- /dev/null
        +++ b/resources/assets/js/components/select2.vue
        @@ -0,0 +1,47 @@
        +
        +<style scoped>
        +    .select2-dropdown {
        +        z-index:9999;
        +    }
        +</style>
        +
        +<template>
        +        <select style="width:100%">
        +            <slot></slot>
        +        </select>
        +</template>
        +
        +<script>
        +    require('select2');
        +    export default {
        +        /*
        +         * The component's data.
        +         */
        +        props: ['options', 'value'],
        +
        +        mounted() {
        +            var vm = this;
        +            $(this.$el)
        +                .select2({
        +                    data: this.options
        +                })
        +                .on('change', function() { vm.$emit('input', this.value) } )
        +                .val(this.value).trigger('change');
        +        },
        +        watch: {
        +            value: function (value) {
        +                $(this.$el).val(value)
        +            },
        +            options: function (options) {
        +                var vm = this;
        +                $(this.$el).select2('destroy').empty().select2({data: options})
        +                .on('change', function() { vm.$emit('input', this.value) } )
        +                .val(this.value).trigger('change');
        +            },
        +            destroyed: function() {
        +                $(this.$el).off().select2('destroy')
        +            }
        +        }
        +    }
        +
        +</script>
        diff --git a/resources/assets/js/plugins/datatables/dataTables.bootstrap.css b/resources/assets/js/plugins/datatables/dataTables.bootstrap.css
        deleted file mode 100755
        index 2ccacaff89..0000000000
        --- a/resources/assets/js/plugins/datatables/dataTables.bootstrap.css
        +++ /dev/null
        @@ -1,372 +0,0 @@
        -div.dataTables_length label {
        -	font-weight: normal;
        -	text-align: left;
        -	white-space: nowrap;
        -}
        -
        -div.dataTables_length select {
        -	width: 75px;
        -	display: inline-block;
        -}
        -
        -div.dataTables_filter {
        -	text-align: right;
        -}
        -
        -div.dataTables_filter label {
        -	font-weight: normal;
        -	white-space: nowrap;
        -	text-align: left;
        -}
        -
        -div.dataTables_filter input {
        -	margin-left: 0.5em;
        -	display: inline-block;
        -	width: auto;
        -}
        -
        -div.dataTables_info {
        -	padding-top: 8px;
        -	white-space: nowrap;
        -}
        -
        -div.dataTables_paginate {
        -	margin: 0;
        -	white-space: nowrap;
        -	text-align: right;
        -}
        -
        -div.dataTables_paginate ul.pagination {
        -	margin: 2px 0;
        -	white-space: nowrap;
        -}
        -
        -@media screen and (max-width: 767px) {
        -	div.dataTables_wrapper > div.row > div,
        -	div.dataTables_length,
        -	div.dataTables_filter,
        -	div.dataTables_info,
        -	div.dataTables_paginate {
        -		text-align: center;
        -	}
        -
        -	div.DTTT {
        -		margin-bottom: 0.5em;
        -	}
        -}
        -
        -
        -table.dataTable td,
        -table.dataTable th {
        -	-webkit-box-sizing: content-box;
        -	-moz-box-sizing: content-box;
        -	box-sizing: content-box;
        -}
        -
        -
        -table.dataTable {
        -	clear: both;
        -	margin-top: 6px !important;
        -	margin-bottom: 6px !important;
        -	max-width: none !important;
        -}
        -
        -table.dataTable thead .sorting,
        -table.dataTable thead .sorting_asc,
        -table.dataTable thead .sorting_desc,
        -table.dataTable thead .sorting_asc_disabled,
        -table.dataTable thead .sorting_desc_disabled {
        -	cursor: pointer;
        -	position: relative;
        -}
        -
        -table.dataTable thead .sorting:after,
        -table.dataTable thead .sorting_asc:after,
        -table.dataTable thead .sorting_desc:after {
        -	position: absolute;
        -	top: 8px;
        -	right: 8px;
        -	display: block;
        -	font-family: 'Glyphicons Halflings';
        -	opacity: 0.5;
        -}
        -table.dataTable thead .sorting:after {
        -	opacity: 0.2;
        -	content: "\e150"; /* sort */
        -}
        -table.dataTable thead .sorting_asc:after {
        -	content: "\e155"; /* sort-by-attributes */
        -}
        -table.dataTable thead .sorting_desc:after {
        -	content: "\e156"; /* sort-by-attributes-alt */
        -}
        -div.dataTables_scrollBody table.dataTable thead .sorting:after,
        -div.dataTables_scrollBody table.dataTable thead .sorting_asc:after,
        -div.dataTables_scrollBody table.dataTable thead .sorting_desc:after {
        -	display: none;
        -}
        -
        -table.dataTable thead .sorting_asc_disabled:after,
        -table.dataTable thead .sorting_desc_disabled:after {
        -	color: #eee;
        -}
        -
        -table.dataTable thead > tr > th {
        -	padding-right: 30px;
        -}
        -
        -table.dataTable th:active {
        -	outline: none;
        -}
        -
        -
        -/* Condensed */
        -table.dataTable.table-condensed thead > tr > th {
        -	padding-right: 20px;
        -}
        -
        -table.dataTable.table-condensed thead .sorting:after,
        -table.dataTable.table-condensed thead .sorting_asc:after,
        -table.dataTable.table-condensed thead .sorting_desc:after {
        -	top: 6px;
        -	right: 6px;
        -}
        -
        -/* Scrolling */
        -div.dataTables_scrollHead table {
        -	margin-bottom: 0 !important;
        -	border-bottom-left-radius: 0;
        -	border-bottom-right-radius: 0;
        -}
        -
        -div.dataTables_scrollHead table thead tr:last-child th:first-child,
        -div.dataTables_scrollHead table thead tr:last-child td:first-child {
        -	border-bottom-left-radius: 0 !important;
        -	border-bottom-right-radius: 0 !important;
        -}
        -
        -div.dataTables_scrollBody table {
        -	border-top: none;
        -	margin-top: 0 !important;
        -	margin-bottom: 0 !important;
        -}
        -
        -div.dataTables_scrollBody tbody tr:first-child th,
        -div.dataTables_scrollBody tbody tr:first-child td {
        -	border-top: none;
        -}
        -
        -div.dataTables_scrollFoot table {
        -	margin-top: 0 !important;
        -	border-top: none;
        -}
        -
        -/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column
        -   width calculations when using scrolling impossible to align columns. We have
        -   to use separate
        - */
        -table.table-bordered.dataTable {
        -	border-collapse: separate !important;
        -}
        -table.table-bordered thead th,
        -table.table-bordered thead td {
        -	border-left-width: 0;
        -	border-top-width: 0;
        -}
        -table.table-bordered tbody th,
        -table.table-bordered tbody td {
        -	border-left-width: 0;
        -	border-bottom-width: 0;
        -}
        -table.table-bordered tfoot th,
        -table.table-bordered tfoot td {
        -    border-left-width: 0;
        -    border-bottom-width: 0;
        -}
        -table.table-bordered th:last-child,
        -table.table-bordered td:last-child {
        -	border-right-width: 0;
        -}
        -div.dataTables_scrollHead table.table-bordered {
        -	border-bottom-width: 0;
        -}
        -
        -
        -
        -
        -/*
        - * TableTools styles
        - */
        -.table.dataTable tbody tr.active td,
        -.table.dataTable tbody tr.active th {
        -	background-color: #08C;
        -	color: white;
        -}
        -
        -.table.dataTable tbody tr.active:hover td,
        -.table.dataTable tbody tr.active:hover th {
        -	background-color: #0075b0 !important;
        -}
        -
        -.table.dataTable tbody tr.active th > a,
        -.table.dataTable tbody tr.active td > a {
        -	color: white;
        -}
        -
        -.table-striped.dataTable tbody tr.active:nth-child(odd) td,
        -.table-striped.dataTable tbody tr.active:nth-child(odd) th {
        -	background-color: #017ebc;
        -}
        -
        -table.DTTT_selectable tbody tr {
        -	cursor: pointer;
        -}
        -
        -div.DTTT .btn:hover {
        -	text-decoration: none !important;
        -}
        -
        -ul.DTTT_dropdown.dropdown-menu {
        -  z-index: 2003;
        -}
        -
        -ul.DTTT_dropdown.dropdown-menu a {
        -	color: #333 !important; /* needed only when demo_page.css is included */
        -}
        -
        -ul.DTTT_dropdown.dropdown-menu li {
        -	position: relative;
        -}
        -
        -ul.DTTT_dropdown.dropdown-menu li:hover a {
        -	background-color: #0088cc;
        -	color: white !important;
        -}
        -
        -div.DTTT_collection_background {
        -	z-index: 2002;	
        -}
        -
        -/* TableTools information display */
        -div.DTTT_print_info {
        -	position: fixed;
        -	top: 50%;
        -	left: 50%;
        -	width: 400px;
        -	height: 150px;
        -	margin-left: -200px;
        -	margin-top: -75px;
        -	text-align: center;
        -	color: #333;
        -	padding: 10px 30px;
        -	opacity: 0.95;
        -
        -	background-color: white;
        -	border: 1px solid rgba(0, 0, 0, 0.2);
        -	border-radius: 6px;
        -	
        -	-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        -	        box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        -}
        -
        -div.DTTT_print_info h6 {
        -	font-weight: normal;
        -	font-size: 28px;
        -	line-height: 28px;
        -	margin: 1em;
        -}
        -
        -div.DTTT_print_info p {
        -	font-size: 14px;
        -	line-height: 20px;
        -}
        -
        -div.dataTables_processing {
        -    position: absolute;
        -    top: 50%;
        -    left: 50%;
        -    width: 100%;
        -    height: 60px;
        -    margin-left: -50%;
        -    margin-top: -25px;
        -    padding-top: 20px;
        -    padding-bottom: 20px;
        -    text-align: center;
        -    font-size: 1.2em;
        -    background-color: white;
        -    background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));
        -    background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
        -    background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
        -    background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
        -    background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
        -    background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
        -}
        -
        -
        -
        -/*
        - * FixedColumns styles
        - */
        -div.DTFC_LeftHeadWrapper table,
        -div.DTFC_LeftFootWrapper table,
        -div.DTFC_RightHeadWrapper table,
        -div.DTFC_RightFootWrapper table,
        -table.DTFC_Cloned tr.even {
        -    background-color: white;
        -    margin-bottom: 0;
        -}
        - 
        -div.DTFC_RightHeadWrapper table ,
        -div.DTFC_LeftHeadWrapper table {
        -	border-bottom: none !important;
        -    margin-bottom: 0 !important;
        -    border-top-right-radius: 0 !important;
        -    border-bottom-left-radius: 0 !important;
        -    border-bottom-right-radius: 0 !important;
        -}
        - 
        -div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
        -div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
        -div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
        -div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
        -    border-bottom-left-radius: 0 !important;
        -    border-bottom-right-radius: 0 !important;
        -}
        - 
        -div.DTFC_RightBodyWrapper table,
        -div.DTFC_LeftBodyWrapper table {
        -    border-top: none;
        -    margin: 0 !important;
        -}
        - 
        -div.DTFC_RightBodyWrapper tbody tr:first-child th,
        -div.DTFC_RightBodyWrapper tbody tr:first-child td,
        -div.DTFC_LeftBodyWrapper tbody tr:first-child th,
        -div.DTFC_LeftBodyWrapper tbody tr:first-child td {
        -    border-top: none;
        -}
        - 
        -div.DTFC_RightFootWrapper table,
        -div.DTFC_LeftFootWrapper table {
        -    border-top: none;
        -    margin-top: 0 !important;
        -}
        -
        -
        -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting:after,
        -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_asc:after,
        -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_desc:after,
        -div.DTFC_RightBodyWrapper table.dataTable thead .sorting:after,
        -div.DTFC_RightBodyWrapper table.dataTable thead .sorting_asc:after,
        -div.DTFC_RightBodyWrapper table.dataTable thead .sorting_desc:after {
        -	display: none;
        -}
        -
        -
        -/*
        - * FixedHeader styles
        - */
        -div.FixedHeader_Cloned table {
        -	margin: 0 !important
        -}
        -
        diff --git a/resources/assets/js/plugins/datatables/dataTables.bootstrap.js b/resources/assets/js/plugins/datatables/dataTables.bootstrap.js
        deleted file mode 100755
        index dcc561fcfd..0000000000
        --- a/resources/assets/js/plugins/datatables/dataTables.bootstrap.js
        +++ /dev/null
        @@ -1,206 +0,0 @@
        -/*! DataTables Bootstrap 3 integration
        - * ©2011-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
        - * DataTables 1.10 or newer.
        - *
        - * This file sets the defaults and adds options to DataTables to style its
        - * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
        - * for further information.
        - */
        -(function(window, document, undefined){
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -
        -/* Set the defaults for DataTables initialisation */
        -$.extend( true, DataTable.defaults, {
        -	dom:
        -		"<'row'<'col-sm-6'l><'col-sm-6'f>>" +
        -		"<'row'<'col-sm-12'tr>>" +
        -		"<'row'<'col-sm-5'i><'col-sm-7'p>>",
        -	renderer: 'bootstrap'
        -} );
        -
        -
        -/* Default class modification */
        -$.extend( DataTable.ext.classes, {
        -	sWrapper:      "dataTables_wrapper form-inline dt-bootstrap",
        -	sFilterInput:  "form-control input-sm",
        -	sLengthSelect: "form-control input-sm"
        -} );
        -
        -
        -/* Bootstrap paging button renderer */
        -DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
        -	var api     = new DataTable.Api( settings );
        -	var classes = settings.oClasses;
        -	var lang    = settings.oLanguage.oPaginate;
        -	var btnDisplay, btnClass, counter=0;
        -
        -	var attach = function( container, buttons ) {
        -		var i, ien, node, button;
        -		var clickHandler = function ( e ) {
        -			e.preventDefault();
        -			if ( !$(e.currentTarget).hasClass('disabled') ) {
        -				api.page( e.data.action ).draw( false );
        -			}
        -		};
        -
        -		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
        -			button = buttons[i];
        -
        -			if ( $.isArray( button ) ) {
        -				attach( container, button );
        -			}
        -			else {
        -				btnDisplay = '';
        -				btnClass = '';
        -
        -				switch ( button ) {
        -					case 'ellipsis':
        -						btnDisplay = '&hellip;';
        -						btnClass = 'disabled';
        -						break;
        -
        -					case 'first':
        -						btnDisplay = lang.sFirst;
        -						btnClass = button + (page > 0 ?
        -							'' : ' disabled');
        -						break;
        -
        -					case 'previous':
        -						btnDisplay = lang.sPrevious;
        -						btnClass = button + (page > 0 ?
        -							'' : ' disabled');
        -						break;
        -
        -					case 'next':
        -						btnDisplay = lang.sNext;
        -						btnClass = button + (page < pages-1 ?
        -							'' : ' disabled');
        -						break;
        -
        -					case 'last':
        -						btnDisplay = lang.sLast;
        -						btnClass = button + (page < pages-1 ?
        -							'' : ' disabled');
        -						break;
        -
        -					default:
        -						btnDisplay = button + 1;
        -						btnClass = page === button ?
        -							'active' : '';
        -						break;
        -				}
        -
        -				if ( btnDisplay ) {
        -					node = $('<li>', {
        -							'class': classes.sPageButton+' '+btnClass,
        -							'id': idx === 0 && typeof button === 'string' ?
        -								settings.sTableId +'_'+ button :
        -								null
        -						} )
        -						.append( $('<a>', {
        -								'href': '#',
        -								'aria-controls': settings.sTableId,
        -								'data-dt-idx': counter,
        -								'tabindex': settings.iTabIndex
        -							} )
        -							.html( btnDisplay )
        -						)
        -						.appendTo( container );
        -
        -					settings.oApi._fnBindAction(
        -						node, {action: button}, clickHandler
        -					);
        -
        -					counter++;
        -				}
        -			}
        -		}
        -	};
        -
        -	// IE9 throws an 'unknown error' if document.activeElement is used
        -	// inside an iframe or frame. 
        -	var activeEl;
        -
        -	try {
        -		// Because this approach is destroying and recreating the paging
        -		// elements, focus is lost on the select button which is bad for
        -		// accessibility. So we want to restore focus once the draw has
        -		// completed
        -		activeEl = $(document.activeElement).data('dt-idx');
        -	}
        -	catch (e) {}
        -
        -	attach(
        -		$(host).empty().html('<ul class="pagination"/>').children('ul'),
        -		buttons
        -	);
        -
        -	if ( activeEl ) {
        -		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
        -	}
        -};
        -
        -
        -/*
        - * TableTools Bootstrap compatibility
        - * Required TableTools 2.1+
        - */
        -if ( DataTable.TableTools ) {
        -	// Set the classes that TableTools uses to something suitable for Bootstrap
        -	$.extend( true, DataTable.TableTools.classes, {
        -		"container": "DTTT btn-group",
        -		"buttons": {
        -			"normal": "btn btn-default",
        -			"disabled": "disabled"
        -		},
        -		"collection": {
        -			"container": "DTTT_dropdown dropdown-menu",
        -			"buttons": {
        -				"normal": "",
        -				"disabled": "disabled"
        -			}
        -		},
        -		"print": {
        -			"info": "DTTT_print_info"
        -		},
        -		"select": {
        -			"row": "active"
        -		}
        -	} );
        -
        -	// Have the collection use a bootstrap compatible drop down
        -	$.extend( true, DataTable.TableTools.DEFAULTS.oTags, {
        -		"collection": {
        -			"container": "ul",
        -			"button": "li",
        -			"liner": "a"
        -		}
        -	} );
        -}
        -
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        -
        diff --git a/resources/assets/js/plugins/datatables/dataTables.bootstrap.min.js b/resources/assets/js/plugins/datatables/dataTables.bootstrap.min.js
        deleted file mode 100755
        index 85f7d06296..0000000000
        --- a/resources/assets/js/plugins/datatables/dataTables.bootstrap.min.js
        +++ /dev/null
        @@ -1,8 +0,0 @@
        -/*!
        - DataTables Bootstrap 3 integration
        - ©2011-2014 SpryMedia Ltd - datatables.net/license
        -*/
        -(function(l,q){var e=function(b,c){b.extend(!0,c.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(c.ext.classes,{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm"});c.ext.renderer.pageButton.bootstrap=function(g,e,r,s,i,m){var t=new c.Api(g),u=g.oClasses,j=g.oLanguage.oPaginate,d,f,n=0,p=function(c,e){var k,h,o,a,l=function(a){a.preventDefault();
        -b(a.currentTarget).hasClass("disabled")||t.page(a.data.action).draw(!1)};k=0;for(h=e.length;k<h;k++)if(a=e[k],b.isArray(a))p(c,a);else{f=d="";switch(a){case "ellipsis":d="&hellip;";f="disabled";break;case "first":d=j.sFirst;f=a+(0<i?"":" disabled");break;case "previous":d=j.sPrevious;f=a+(0<i?"":" disabled");break;case "next":d=j.sNext;f=a+(i<m-1?"":" disabled");break;case "last":d=j.sLast;f=a+(i<m-1?"":" disabled");break;default:d=a+1,f=i===a?"active":""}d&&(o=b("<li>",{"class":u.sPageButton+" "+
        -f,id:0===r&&"string"===typeof a?g.sTableId+"_"+a:null}).append(b("<a>",{href:"#","aria-controls":g.sTableId,"data-dt-idx":n,tabindex:g.iTabIndex}).html(d)).appendTo(c),g.oApi._fnBindAction(o,{action:a},l),n++)}},h;try{h=b(q.activeElement).data("dt-idx")}catch(l){}p(b(e).empty().html('<ul class="pagination"/>').children("ul"),s);h&&b(e).find("[data-dt-idx="+h+"]").focus()};c.TableTools&&(b.extend(!0,c.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"},
        -collection:{container:"DTTT_dropdown dropdown-menu",buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info"},select:{row:"active"}}),b.extend(!0,c.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}))};"function"===typeof define&&define.amd?define(["jquery","datatables"],e):"object"===typeof exports?e(require("jquery"),require("datatables")):jQuery&&e(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/Readme.txt b/resources/assets/js/plugins/datatables/extensions/AutoFill/Readme.txt
        deleted file mode 100755
        index 017d1d0d5f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/Readme.txt
        +++ /dev/null
        @@ -1,38 +0,0 @@
        -# AutoFill
        -
        -AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in information over the selected cells and incrementing numbers as needed. Key features include:
        -
        -* Click and drag cell content insertion
        -* Automatic incrementing of numeric information
        -* Enable and disable on any column
        -* Detailed callback functions for customisation
        -* Support for both DataTables and browser window scrolling
        -
        -
        -# Installation
        -
        -To use AutoFill, first download DataTables ( http://datatables.net/download ) and place the unzipped AutoFill package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -AutoFill is initialised using the `$.fn.dataTable.AutoFill` constructor. For example:
        -
        -```js
        -$(document).ready( function () {
        -    var table = $('#example').dataTable();
        -    new $.fn.dataTable.AutoFill( table );
        -} );
        -```
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/autofill/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of AutoFill and help make it better, please refer to its GitHub repo: https://github.com/DataTables/AutoFill
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.css b/resources/assets/js/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.css
        deleted file mode 100755
        index cab59b3a05..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.css
        +++ /dev/null
        @@ -1,24 +0,0 @@
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * AutoFill styles
        - */
        -
        -div.AutoFill_filler {
        -	display: none;
        -	position: absolute;
        -	height: 14px;
        -	width: 14px;
        -	background: url(../images/filler.png) no-repeat center center;
        -	z-index: 1002;
        -}
        -
        -div.AutoFill_border {
        -	display: none;
        -	position: absolute;
        -	background-color: #0063dc;
        -	z-index: 1001;
        -	
        -	box-shadow: 0px 0px 5px #76b4ff;
        -	-moz-box-shadow: 0px 0px 5px #76b4ff;
        -	-webkit-box-shadow: 0px 0px 5px #76b4ff;
        -}
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.min.css b/resources/assets/js/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.min.css
        deleted file mode 100755
        index b485f2163f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -div.AutoFill_filler{display:none;position:absolute;height:14px;width:14px;background:url(../images/filler.png) no-repeat center center;z-index:1002}div.AutoFill_border{display:none;position:absolute;background-color:#0063dc;z-index:1001;box-shadow:0px 0px 5px #76b4ff;-moz-box-shadow:0px 0px 5px #76b4ff;-webkit-box-shadow:0px 0px 5px #76b4ff}
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/columns.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/columns.html
        deleted file mode 100755
        index d891b139e0..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/columns.html
        +++ /dev/null
        @@ -1,644 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>AutoFill example - Column options</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		"columnDefs": [
        -			{ enable:    false, targets: [-1, -2] },
        -			{ increment: false, targets: 3 }
        -		]
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>Column options</span></h1>
        -
        -			<div class="info">
        -				<p>Columns can be enabled (which they are by default) and disabled from providing the end user with
        -				AutoFill abilities by using either <code>columns</code> or <code>columnDefs</code> and the
        -				<code>enable</code> option. These two arrays work in exactly the same way <a href=
        -				"http://datatables.net/ref/columns">as in DataTables</a>.</p>
        -
        -				<p>This example shows how disabling columns counting from the right hand side of the table can be
        -				achieved. In this case, the last three columns.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		&quot;columnDefs&quot;: [
        -			{ enable:    false, targets: [-1, -2] },
        -			{ increment: false, targets: 3 }
        -		]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./columns.html">Column options</a></li>
        -							<li><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li><a href="./complete-callback.html">Complete callback</a></li>
        -							<li><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/complete-callback.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/complete-callback.html
        deleted file mode 100755
        index 2076d4f20b..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/complete-callback.html
        +++ /dev/null
        @@ -1,652 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>AutoFill example - Complete callback</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		complete: function ( altered ) {
        -			var last = altered[ altered.length-1 ];
        -			alert( 
        -				altered.length+' cells were altered in this auto-fill. The '+
        -				'value of the last cell altered was: '+last.oldValue+' and is '+
        -				'now '+last.newValue
        -			);
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>Complete callback</span></h1>
        -
        -			<div class="info">
        -				<p>AutoFill provides a number of customisable callback functions so you can tailor it's actions to
        -				exactly what you need. This example shows the use of the <code>complete</code> callback function which
        -				is executed at the end of an auto-fill drag, providing information about the cells that were
        -				altered.</p>
        -
        -				<p>For a complete description of the <code>complete</code> callback, please refer to the <a href=
        -				"//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		complete: function ( altered ) {
        -			var last = altered[ altered.length-1 ];
        -			alert( 
        -				altered.length+' cells were altered in this auto-fill. The '+
        -				'value of the last cell altered was: '+last.oldValue+' and is '+
        -				'now '+last.newValue
        -			);
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./columns.html">Column options</a></li>
        -							<li><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li class="active"><a href="./complete-callback.html">Complete callback</a></li>
        -							<li><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-both.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-both.html
        deleted file mode 100755
        index f65076e198..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-both.html
        +++ /dev/null
        @@ -1,641 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>AutoFill example - Horizontal and vertical fill</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		mode: 'both'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>Horizontal and vertical fill</span></h1>
        -
        -			<div class="info">
        -				<p>By default AutoFill will allow the fill to operate only on a single column at a time (i.e.
        -				vertically). However, it has the ability to provide the fill either horizontally, over both axis or
        -				limited to just one axis depending on the direction of the drag. This option is provided by the
        -				<code>mode</code> sanitisation option.</p>
        -
        -				<p>In this case it is set to <code>both</code> (i.e. both horizontal and vertical axis) to provide the
        -				filler along a row, rather than a column.</p>
        -
        -				<p>For the full range of options and syntax for <code>mode</code> please refer to the <a href=
        -				"//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		mode: 'both'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./columns.html">Column options</a></li>
        -							<li><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li class="active"><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li><a href="./complete-callback.html">Complete callback</a></li>
        -							<li><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html
        deleted file mode 100755
        index 13cadac9c6..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html
        +++ /dev/null
        @@ -1,641 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>AutoFill example - Horizontal fill</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		mode: 'x'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>Horizontal fill</span></h1>
        -
        -			<div class="info">
        -				<p>By default AutoFill will allow the fill to operate only on a single column at a time (i.e.
        -				vertically). However, it has the ability to provide the fill either horizontally, over both axis or
        -				limited to just one axis depending on the direction of the drag. This option is provided by the
        -				<code>mode</code> sanitisation option.</p>
        -
        -				<p>In this case it is set to <code>x</code> (i.e. horizontal axis) to provide the filler along a row,
        -				rather than a column.</p>
        -
        -				<p>For the full range of options and syntax for <code>mode</code> please refer to the <a href=
        -				"//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		mode: 'x'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./columns.html">Column options</a></li>
        -							<li><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li class="active"><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li><a href="./complete-callback.html">Complete callback</a></li>
        -							<li><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/index.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/index.html
        deleted file mode 100755
        index 9cade86c27..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/index.html
        +++ /dev/null
        @@ -1,66 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>AutoFill examples - AutoFill examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>AutoFill examples</span></h1>
        -
        -			<div class="info">
        -				<p>AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in
        -				information over the selected cells and incrementing numbers as needed.</p>
        -
        -				<p>Thanks to <a href="http://www.phoniax.no/">Phoniax AS</a> for their sponsorship of this plug-in for
        -				DataTables.</p>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./columns.html">Column options</a></li>
        -							<li><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li><a href="./complete-callback.html">Complete callback</a></li>
        -							<li><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/scrolling.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/scrolling.html
        deleted file mode 100755
        index 66871ec7f0..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/scrolling.html
        +++ /dev/null
        @@ -1,638 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>AutoFill example - Scrolling DataTable</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').dataTable( {
        -		scrollY: 200,
        -		scrollCollapse: false,
        -		paginate: false
        -	} );
        -
        -	new $.fn.dataTable.AutoFill( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>Scrolling DataTable</span></h1>
        -
        -			<div class="info">
        -				<p>When dragging an AutoFill handle, the table (if DataTables scrolling is enabled) or the window will
        -				be automatically scrolled, as you approach the edge of the scrolling component. The example below shows
        -				the effect with DataTables scrolling (and also window if needed).</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').dataTable( {
        -		scrollY: 200,
        -		scrollCollapse: false,
        -		paginate: false
        -	} );
        -
        -	new $.fn.dataTable.AutoFill( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./columns.html">Column options</a></li>
        -							<li class="active"><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li><a href="./complete-callback.html">Complete callback</a></li>
        -							<li><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/simple.html
        deleted file mode 100755
        index ea3db498b4..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/simple.html
        +++ /dev/null
        @@ -1,631 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>AutoFill example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	new $.fn.dataTable.AutoFill( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in
        -				information over the selected cells and incrementing numbers as needed.</p>
        -
        -				<p>AutoFill is initialised using the <code>$.fn.dataTable.AutoFill</code> function as shown in the
        -				example below. It requires one parameter, the DataTable instance that AutoFill is to operate on, and
        -				optionally a second configuration parameter, which is shown in the other AutoFill examples.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	new $.fn.dataTable.AutoFill( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./columns.html">Column options</a></li>
        -							<li><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li><a href="./complete-callback.html">Complete callback</a></li>
        -							<li><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/step-callback.html b/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/step-callback.html
        deleted file mode 100755
        index c1255aaa25..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/examples/step-callback.html
        +++ /dev/null
        @@ -1,660 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>AutoFill example - Step callback</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		columnDefs: [ {
        -			targets: -1,
        -			step: function ( cell, read, last, i, x, y ) {
        -				var val = parseInt( (last || read).replace(/[$,]/g, ''), 10 );
        -				val += (x<0 || y<0 ? -100 : 100); // - if going back up, + if going down
        -
        -				// Format for the currency column
        -				return '$'+val.toString().replace( /\B(?=(\d{3})+(?!\d))/g, ',' );
        -			}
        -		} ]
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>AutoFill example <span>Step callback</span></h1>
        -
        -			<div class="info">
        -				<p>By default, AutoFill will increment cells that contain numbers by a single digit for each cell that
        -				is iterated over (try the <em>Age</em> column below for example). This behaviour can be disabled
        -				completely using the <code>increment</code> column option, but it can also be modified to suit your
        -				requirements through use of the <code>step</code> column callback function.</p>
        -
        -				<p>The <code>step</code> callback is executed for each cell in the auto-fill set and gives complete
        -				control over how data is incremented. The example below shows the step function being used on the
        -				<em>Salary</em> column to increment by 100, rather than 1 for each cell.</p>
        -
        -				<p>For a complete description of the <code>step</code> callback, please refer to the <a href=
        -				"//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.AutoFill( table, {
        -		columnDefs: [ {
        -			targets: -1,
        -			step: function ( cell, read, last, i, x, y ) {
        -				var val = parseInt( (last || read).replace(/[$,]/g, ''), 10 );
        -				val += (x&lt;0 || y&lt;0 ? -100 : 100); // - if going back up, + if going down
        -
        -				// Format for the currency column
        -				return '$'+val.toString().replace( /\B(?=(\d{3})+(?!\d))/g, ',' );
        -			}
        -		} ]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./columns.html">Column options</a></li>
        -							<li><a href="./scrolling.html">Scrolling DataTable</a></li>
        -							<li><a href="./fill-both.html">Horizontal and vertical fill</a></li>
        -							<li><a href="./fill-horizontal.html">Horizontal fill</a></li>
        -							<li><a href="./complete-callback.html">Complete callback</a></li>
        -							<li class="active"><a href="./step-callback.html">Step callback</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/images/filler.png b/resources/assets/js/plugins/datatables/extensions/AutoFill/images/filler.png
        deleted file mode 100755
        index f2af65d8c3..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/AutoFill/images/filler.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js b/resources/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js
        deleted file mode 100755
        index 6bbfa35b93..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js
        +++ /dev/null
        @@ -1,855 +0,0 @@
        -/*! AutoFill 1.2.1
        - * ©2008-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     AutoFill
        - * @description Add Excel like click and drag auto-fill options to DataTables
        - * @version     1.2.1
        - * @file        dataTables.autoFill.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2010-2014 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -(function( window, document, undefined ) {
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -/** 
        - * AutoFill provides Excel like auto-fill features for a DataTable
        - *
        - * @class AutoFill
        - * @constructor
        - * @param {object} oTD DataTables settings object
        - * @param {object} oConfig Configuration object for AutoFill
        - */
        -var AutoFill = function( oDT, oConfig )
        -{
        -	/* Sanity check that we are a new instance */
        -	if ( ! (this instanceof AutoFill) ) {
        -		throw( "Warning: AutoFill must be initialised with the keyword 'new'" );
        -	}
        -
        -	if ( ! $.fn.dataTableExt.fnVersionCheck('1.7.0') ) {
        -		throw( "Warning: AutoFill requires DataTables 1.7 or greater");
        -	}
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public class variables
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	this.c = {};
        -
        -	/**
        -	 * @namespace Settings object which contains customisable information for AutoFill instance
        -	 */
        -	this.s = {
        -		/**
        -		 * @namespace Cached information about the little dragging icon (the filler)
        -		 */
        -		"filler": {
        -			"height": 0,
        -			"width": 0
        -		},
        -
        -		/**
        -		 * @namespace Cached information about the border display
        -		 */
        -		"border": {
        -			"width": 2
        -		},
        -
        -		/**
        -		 * @namespace Store for live information for the current drag
        -		 */
        -		"drag": {
        -			"startX": -1,
        -			"startY": -1,
        -			"startTd": null,
        -			"endTd": null,
        -			"dragging": false
        -		},
        -
        -		/**
        -		 * @namespace Data cache for information that we need for scrolling the screen when we near
        -		 *   the edges
        -		 */
        -		"screen": {
        -			"interval": null,
        -			"y": 0,
        -			"height": 0,
        -			"scrollTop": 0
        -		},
        -
        -		/**
        -		 * @namespace Data cache for the position of the DataTables scrolling element (when scrolling
        -		 *   is enabled)
        -		 */
        -		"scroller": {
        -			"top": 0,
        -			"bottom": 0
        -		},
        -
        -		/**
        -		 * @namespace Information stored for each column. An array of objects
        -		 */
        -		"columns": []
        -	};
        -
        -
        -	/**
        -	 * @namespace Common and useful DOM elements for the class instance
        -	 */
        -	this.dom = {
        -		"table": null,
        -		"filler": null,
        -		"borderTop": null,
        -		"borderRight": null,
        -		"borderBottom": null,
        -		"borderLeft": null,
        -		"currentTarget": null
        -	};
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public class methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Retreieve the settings object from an instance
        -	 *  @method fnSettings
        -	 *  @returns {object} AutoFill settings object
        -	 */
        -	this.fnSettings = function () {
        -		return this.s;
        -	};
        -
        -
        -	/* Constructor logic */
        -	this._fnInit( oDT, oConfig );
        -	return this;
        -};
        -
        -
        -
        -AutoFill.prototype = {
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods (they are of course public in JS, but recommended as private)
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Initialisation
        -	 *  @method _fnInit
        -	 *  @param {object} dt DataTables settings object
        -	 *  @param {object} config Configuration object for AutoFill
        -	 *  @returns void
        -	 */
        -	"_fnInit": function ( dt, config )
        -	{
        -		var
        -			that = this,
        -			i, iLen;
        -
        -		// Use DataTables API to get the settings allowing selectors, instances
        -		// etc to be used, or for backwards compatibility get from the old
        -		// fnSettings method
        -		this.s.dt = DataTable.Api ?
        -			new DataTable.Api( dt ).settings()[0] :
        -			dt.fnSettings();
        -		this.s.init = config || {};
        -		this.dom.table = this.s.dt.nTable;
        -
        -		$.extend( true, this.c, AutoFill.defaults, config );
        -
        -		/* Add and configure the columns */
        -		this._initColumns();
        -
        -		/* Auto Fill click and drag icon */
        -		var filler = $('<div/>', {
        -				'class': 'AutoFill_filler'
        -			} )
        -			.appendTo( 'body' );
        -		this.dom.filler = filler[0];
        -
        -		// Get the height / width of the click element
        -		this.s.filler.height = filler.height();
        -		this.s.filler.width = filler.width();
        -		filler[0].style.display = "none";
        -
        -		/* Border display - one div for each side. We can't just use a single
        -		 * one with a border, as we want the events to effectively pass through
        -		 * the transparent bit of the box
        -		 */
        -		var border;
        -		var appender = document.body;
        -		if ( that.s.dt.oScroll.sY !== "" ) {
        -			that.s.dt.nTable.parentNode.style.position = "relative";
        -			appender = that.s.dt.nTable.parentNode;
        -		}
        -
        -		border = $('<div/>', {
        -			"class": "AutoFill_border"
        -		} );
        -		this.dom.borderTop    = border.clone().appendTo( appender )[0];
        -		this.dom.borderRight  = border.clone().appendTo( appender )[0];
        -		this.dom.borderBottom = border.clone().appendTo( appender )[0];
        -		this.dom.borderLeft   = border.clone().appendTo( appender )[0];
        -
        -		/* Events */
        -		filler.on( 'mousedown.DTAF', function (e) {
        -			this.onselectstart = function() { return false; };
        -			that._fnFillerDragStart.call( that, e );
        -			return false;
        -		} );
        -
        -		$('tbody', this.dom.table).on(
        -			'mouseover.DTAF mouseout.DTAF',
        -			'>tr>td, >tr>th',
        -			function (e) {
        -				that._fnFillerDisplay.call( that, e );
        -			}
        -		);
        -
        -		$(this.dom.table).on( 'destroy.dt.DTAF', function () {
        -			filler.off( 'mousedown.DTAF' ).remove();
        -			$('tbody', this.dom.table).off( 'mouseover.DTAF mouseout.DTAF' );
        -		} );
        -	},
        -
        -
        -	_initColumns: function ( )
        -	{
        -		var that = this;
        -		var i, ien;
        -		var dt = this.s.dt;
        -		var config = this.s.init;
        -
        -		for ( i=0, ien=dt.aoColumns.length ; i<ien ; i++ ) {
        -			this.s.columns[i] = $.extend( true, {}, AutoFill.defaults.column );
        -		}
        -
        -		dt.oApi._fnApplyColumnDefs(
        -			dt,
        -			config.aoColumnDefs || config.columnDefs,
        -			config.aoColumns || config.columns,
        -			function (colIdx, def) {
        -				that._fnColumnOptions( colIdx, def );
        -			}
        -		);
        -
        -		// For columns which don't have read, write, step functions defined,
        -		// use the default ones
        -		for ( i=0, ien=dt.aoColumns.length ; i<ien ; i++ ) {
        -			var column = this.s.columns[i];
        -
        -			if ( ! column.read ) {
        -				column.read = this._fnReadCell;
        -			}
        -			if ( ! column.write ) {
        -				column.read = this._fnWriteCell;
        -			}
        -			if ( ! column.step ) {
        -				column.read = this._fnStep;
        -			}
        -		}
        -	},
        -
        -
        -	"_fnColumnOptions": function ( i, opts )
        -	{
        -		var column = this.s.columns[ i ];
        -		var set = function ( outProp, inProp ) {
        -			if ( opts[ inProp[0] ] !== undefined ) {
        -				column[ outProp ] = opts[ inProp[0] ];
        -			}
        -			if ( opts[ inProp[1] ] !== undefined ) {
        -				column[ outProp ] = opts[ inProp[1] ];
        -			}
        -		};
        -
        -		// Compatibility with the old Hungarian style of notation
        -		set( 'enable',    ['bEnable',     'enable'] );
        -		set( 'read',      ['fnRead',      'read'] );
        -		set( 'write',     ['fnWrite',     'write'] );
        -		set( 'step',      ['fnStep',      'step'] );
        -		set( 'increment', ['bIncrement',  'increment'] );
        -	},
        -
        -
        -	/**
        -	 * Find out the coordinates of a given TD cell in a table
        -	 *  @method  _fnTargetCoords
        -	 *  @param   {Node} nTd
        -	 *  @returns {Object} x and y properties, for the position of the cell in the tables DOM
        -	 */
        -	"_fnTargetCoords": function ( nTd )
        -	{
        -		var nTr = $(nTd).parents('tr')[0];
        -		var position = this.s.dt.oInstance.fnGetPosition( nTd );
        -
        -		return {
        -			"x":      $('td', nTr).index(nTd),
        -			"y":      $('tr', nTr.parentNode).index(nTr),
        -			"row":    position[0],
        -			"column": position[2]
        -		};
        -	},
        -
        -
        -	/**
        -	 * Display the border around one or more cells (from start to end)
        -	 *  @method  _fnUpdateBorder
        -	 *  @param   {Node} nStart Starting cell
        -	 *  @param   {Node} nEnd Ending cell
        -	 *  @returns void
        -	 */
        -	"_fnUpdateBorder": function ( nStart, nEnd )
        -	{
        -		var
        -			border = this.s.border.width,
        -			offsetStart = $(nStart).offset(),
        -			offsetEnd = $(nEnd).offset(),
        -			x1 = offsetStart.left - border,
        -			x2 = offsetEnd.left + $(nEnd).outerWidth(),
        -			y1 = offsetStart.top - border,
        -			y2 = offsetEnd.top + $(nEnd).outerHeight(),
        -			width = offsetEnd.left + $(nEnd).outerWidth() - offsetStart.left + (2*border),
        -			height = offsetEnd.top + $(nEnd).outerHeight() - offsetStart.top + (2*border),
        -			oStyle;
        -
        -		// Recalculate start and end (when dragging "backwards")  
        -		if( offsetStart.left > offsetEnd.left) {
        -			x1 = offsetEnd.left - border;
        -			x2 = offsetStart.left + $(nStart).outerWidth();
        -			width = offsetStart.left + $(nStart).outerWidth() - offsetEnd.left + (2*border);
        -		}
        -
        -		if ( this.s.dt.oScroll.sY !== "" )
        -		{
        -			/* The border elements are inside the DT scroller - so position relative to that */
        -			var
        -				offsetScroll = $(this.s.dt.nTable.parentNode).offset(),
        -				scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(),
        -				scrollLeft = $(this.s.dt.nTable.parentNode).scrollLeft();
        -
        -			x1 -= offsetScroll.left - scrollLeft;
        -			x2 -= offsetScroll.left - scrollLeft;
        -			y1 -= offsetScroll.top - scrollTop;
        -			y2 -= offsetScroll.top - scrollTop;
        -		}
        -
        -		/* Top */
        -		oStyle = this.dom.borderTop.style;
        -		oStyle.top = y1+"px";
        -		oStyle.left = x1+"px";
        -		oStyle.height = this.s.border.width+"px";
        -		oStyle.width = width+"px";
        -
        -		/* Bottom */
        -		oStyle = this.dom.borderBottom.style;
        -		oStyle.top = y2+"px";
        -		oStyle.left = x1+"px";
        -		oStyle.height = this.s.border.width+"px";
        -		oStyle.width = width+"px";
        -
        -		/* Left */
        -		oStyle = this.dom.borderLeft.style;
        -		oStyle.top = y1+"px";
        -		oStyle.left = x1+"px";
        -		oStyle.height = height+"px";
        -		oStyle.width = this.s.border.width+"px";
        -
        -		/* Right */
        -		oStyle = this.dom.borderRight.style;
        -		oStyle.top = y1+"px";
        -		oStyle.left = x2+"px";
        -		oStyle.height = height+"px";
        -		oStyle.width = this.s.border.width+"px";
        -	},
        -
        -
        -	/**
        -	 * Mouse down event handler for starting a drag
        -	 *  @method  _fnFillerDragStart
        -	 *  @param   {Object} e Event object
        -	 *  @returns void
        -	 */
        -	"_fnFillerDragStart": function (e)
        -	{
        -		var that = this;
        -		var startingTd = this.dom.currentTarget;
        -
        -		this.s.drag.dragging = true;
        -
        -		that.dom.borderTop.style.display = "block";
        -		that.dom.borderRight.style.display = "block";
        -		that.dom.borderBottom.style.display = "block";
        -		that.dom.borderLeft.style.display = "block";
        -
        -		var coords = this._fnTargetCoords( startingTd );
        -		this.s.drag.startX = coords.x;
        -		this.s.drag.startY = coords.y;
        -
        -		this.s.drag.startTd = startingTd;
        -		this.s.drag.endTd = startingTd;
        -
        -		this._fnUpdateBorder( startingTd, startingTd );
        -
        -		$(document).bind('mousemove.AutoFill', function (e) {
        -			that._fnFillerDragMove.call( that, e );
        -		} );
        -
        -		$(document).bind('mouseup.AutoFill', function (e) {
        -			that._fnFillerFinish.call( that, e );
        -		} );
        -
        -		/* Scrolling information cache */
        -		this.s.screen.y = e.pageY;
        -		this.s.screen.height = $(window).height();
        -		this.s.screen.scrollTop = $(document).scrollTop();
        -
        -		if ( this.s.dt.oScroll.sY !== "" )
        -		{
        -			this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top;
        -			this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height();
        -		}
        -
        -		/* Scrolling handler - we set an interval (which is cancelled on mouse up) which will fire
        -		 * regularly and see if we need to do any scrolling
        -		 */
        -		this.s.screen.interval = setInterval( function () {
        -			var iScrollTop = $(document).scrollTop();
        -			var iScrollDelta = iScrollTop - that.s.screen.scrollTop;
        -			that.s.screen.y += iScrollDelta;
        -
        -			if ( that.s.screen.height - that.s.screen.y + iScrollTop < 50 )
        -			{
        -				$('html, body').animate( {
        -					"scrollTop": iScrollTop + 50
        -				}, 240, 'linear' );
        -			}
        -			else if ( that.s.screen.y - iScrollTop < 50 )
        -			{
        -				$('html, body').animate( {
        -					"scrollTop": iScrollTop - 50
        -				}, 240, 'linear' );
        -			}
        -
        -			if ( that.s.dt.oScroll.sY !== "" )
        -			{
        -				if ( that.s.screen.y > that.s.scroller.bottom - 50 )
        -				{
        -					$(that.s.dt.nTable.parentNode).animate( {
        -						"scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() + 50
        -					}, 240, 'linear' );
        -				}
        -				else if ( that.s.screen.y < that.s.scroller.top + 50 )
        -				{
        -					$(that.s.dt.nTable.parentNode).animate( {
        -						"scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() - 50
        -					}, 240, 'linear' );
        -				}
        -			}
        -		}, 250 );
        -	},
        -
        -
        -	/**
        -	 * Mouse move event handler for during a move. See if we want to update the display based on the
        -	 * new cursor position
        -	 *  @method  _fnFillerDragMove
        -	 *  @param   {Object} e Event object
        -	 *  @returns void
        -	 */
        -	"_fnFillerDragMove": function (e)
        -	{
        -		if ( e.target && e.target.nodeName.toUpperCase() == "TD" &&
        -			 e.target != this.s.drag.endTd )
        -		{
        -			var coords = this._fnTargetCoords( e.target );
        -
        -			if ( this.c.mode == "y" && coords.x != this.s.drag.startX )
        -			{
        -				e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0];
        -			}
        -			if ( this.c.mode == "x" && coords.y != this.s.drag.startY )
        -			{
        -				e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0];
        -			}
        -
        -			if ( this.c.mode == "either")
        -			{
        -				if(coords.x != this.s.drag.startX )
        -				{
        -					e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0];
        -				}
        -				else if ( coords.y != this.s.drag.startY ) {
        -					e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0];
        -				}
        -			}
        -
        -			// update coords
        -			if ( this.c.mode !== "both" ) {
        -				coords = this._fnTargetCoords( e.target );
        -			}
        -
        -			var drag = this.s.drag;
        -			drag.endTd = e.target;
        -
        -			if ( coords.y >= this.s.drag.startY ) {
        -				this._fnUpdateBorder( drag.startTd, drag.endTd );
        -			}
        -			else {
        -				this._fnUpdateBorder( drag.endTd, drag.startTd );
        -			}
        -			this._fnFillerPosition( e.target );
        -		}
        -
        -		/* Update the screen information so we can perform scrolling */
        -		this.s.screen.y = e.pageY;
        -		this.s.screen.scrollTop = $(document).scrollTop();
        -
        -		if ( this.s.dt.oScroll.sY !== "" )
        -		{
        -			this.s.scroller.scrollTop = $(this.s.dt.nTable.parentNode).scrollTop();
        -			this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top;
        -			this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height();
        -		}
        -	},
        -
        -
        -	/**
        -	 * Mouse release handler - end the drag and take action to update the cells with the needed values
        -	 *  @method  _fnFillerFinish
        -	 *  @param   {Object} e Event object
        -	 *  @returns void
        -	 */
        -	"_fnFillerFinish": function (e)
        -	{
        -		var that = this, i, iLen, j;
        -
        -		$(document).unbind('mousemove.AutoFill mouseup.AutoFill');
        -
        -		this.dom.borderTop.style.display = "none";
        -		this.dom.borderRight.style.display = "none";
        -		this.dom.borderBottom.style.display = "none";
        -		this.dom.borderLeft.style.display = "none";
        -
        -		this.s.drag.dragging = false;
        -
        -		clearInterval( this.s.screen.interval );
        -
        -		var cells = [];
        -		var table = this.dom.table;
        -		var coordsStart = this._fnTargetCoords( this.s.drag.startTd );
        -		var coordsEnd = this._fnTargetCoords( this.s.drag.endTd );
        -		var columnIndex = function ( visIdx ) {
        -			return that.s.dt.oApi._fnVisibleToColumnIndex( that.s.dt, visIdx );
        -		};
        -
        -		// xxx - urgh - there must be a way of reducing this...
        -		if ( coordsStart.y <= coordsEnd.y ) {
        -			for ( i=coordsStart.y ; i<=coordsEnd.y ; i++ ) {
        -				if ( coordsStart.x <= coordsEnd.x ) {
        -					for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) {
        -						cells.push( {
        -							node:   $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0],
        -							x:      j - coordsStart.x,
        -							y:      i - coordsStart.y,
        -							colIdx: columnIndex( j )
        -						} );
        -					}
        -				}
        -				else {
        -					for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) {
        -						cells.push( {
        -							node:   $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0],
        -							x:      j - coordsStart.x,
        -							y:      i - coordsStart.y,
        -							colIdx: columnIndex( j )
        -						} );
        -					}
        -				}
        -			}
        -		}
        -		else {
        -			for ( i=coordsStart.y ; i>=coordsEnd.y ; i-- ) {
        -				if ( coordsStart.x <= coordsEnd.x ) {
        -					for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) {
        -						cells.push( {
        -							node:   $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0],
        -							x:      j - coordsStart.x,
        -							y:      i - coordsStart.y,
        -							colIdx: columnIndex( j )
        -						} );
        -					}
        -				}
        -				else {
        -					for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) {
        -						cells.push( {
        -							node:   $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0],
        -							x:      coordsStart.x - j,
        -							y:      coordsStart.y - i,
        -							colIdx: columnIndex( j )
        -						} );
        -					}
        -				}
        -			}
        -		}
        -
        -		// An auto-fill requires 2 or more cells
        -		if ( cells.length <= 1 ) {
        -			return;
        -		}
        -
        -		var edited = [];
        -		var previous;
        -
        -		for ( i=0, iLen=cells.length ; i<iLen ; i++ ) {
        -			var cell      = cells[i];
        -			var column    = this.s.columns[ cell.colIdx ];
        -			var read      = column.read.call( column, cell.node );
        -			var stepValue = column.step.call( column, cell.node, read, previous, i, cell.x, cell.y );
        -
        -			column.write.call( column, cell.node, stepValue );
        -
        -			previous = stepValue;
        -			edited.push( {
        -				cell:     cell,
        -				colIdx:   cell.colIdx,
        -				newValue: stepValue,
        -				oldValue: read
        -			} );
        -		}
        -
        -		if ( this.c.complete !== null ) {
        -			this.c.complete.call( this, edited );
        -		}
        -
        -		// In 1.10 we can do a static draw
        -		if ( DataTable.Api ) {
        -			new DataTable.Api( this.s.dt ).draw( false );
        -		}
        -		else {
        -			this.s.dt.oInstance.fnDraw();
        -		}
        -	},
        -
        -
        -	/**
        -	 * Display the drag handle on mouse over cell
        -	 *  @method  _fnFillerDisplay
        -	 *  @param   {Object} e Event object
        -	 *  @returns void
        -	 */
        -	"_fnFillerDisplay": function (e)
        -	{
        -		var filler = this.dom.filler;
        -
        -		/* Don't display automatically when dragging */
        -		if ( this.s.drag.dragging)
        -		{
        -			return;
        -		}
        -
        -		/* Check that we are allowed to AutoFill this column or not */
        -		var nTd = (e.target.nodeName.toLowerCase() == 'td') ? e.target : $(e.target).parents('td')[0];
        -		var iX = this._fnTargetCoords(nTd).column;
        -		if ( !this.s.columns[iX].enable )
        -		{
        -			filler.style.display = "none";
        -			return;
        -		}
        -
        -		if (e.type == 'mouseover')
        -		{
        -			this.dom.currentTarget = nTd;
        -			this._fnFillerPosition( nTd );
        -
        -			filler.style.display = "block";
        -		}
        -		else if ( !e.relatedTarget || !e.relatedTarget.className.match(/AutoFill/) )
        -		{
        -			filler.style.display = "none";
        -		}
        -	},
        -
        -
        -	/**
        -	 * Position the filler icon over a cell
        -	 *  @method  _fnFillerPosition
        -	 *  @param   {Node} nTd Cell to position filler icon over
        -	 *  @returns void
        -	 */
        -	"_fnFillerPosition": function ( nTd )
        -	{
        -		var offset = $(nTd).offset();
        -		var filler = this.dom.filler;
        -		filler.style.top = (offset.top - (this.s.filler.height / 2)-1 + $(nTd).outerHeight())+"px";
        -		filler.style.left = (offset.left - (this.s.filler.width / 2)-1 + $(nTd).outerWidth())+"px";
        -	}
        -};
        -
        -
        -// Alias for access
        -DataTable.AutoFill = AutoFill;
        -DataTable.AutoFill = AutoFill;
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Constants
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * AutoFill version
        - *  @constant  version
        - *  @type      String
        - *  @default   See code
        - */
        -AutoFill.version = "1.2.1";
        -
        -
        -/**
        - * AutoFill defaults
        - *  @namespace
        - */
        -AutoFill.defaults = {
        -	/**
        -	 * Mode for dragging (restrict to y-axis only, x-axis only, either one or none):
        -	 *
        -	 *  * `y`      - y-axis only (default)
        -	 *  * `x`      - x-axis only
        -	 *  * `either` - either one, but not both axis at the same time
        -	 *  * `both`   - multiple cells allowed
        -	 *
        -	 * @type {string}
        -	 * @default `y`
        -	 */
        -	mode: 'y',
        -
        -	complete: null,
        -
        -	/**
        -	 * Column definition defaults
        -	 *  @namespace
        -	 */
        -	column: {
        -		/**
        -		 * If AutoFill should be enabled on this column
        -		 *
        -		 * @type {boolean}
        -		 * @default true
        -		 */
        -		enable: true,
        -
        -		/**
        -		 * Allow automatic increment / decrement on this column if a number
        -		 * is found.
        -		 *
        -		 * @type {boolean}
        -		 * @default true
        -		 */
        -		increment: true,
        -
        -		/**
        -		 * Cell read function
        -		 *
        -		 * Default function will simply read the value from the HTML of the
        -		 * cell.
        -		 *
        -		 * @type   {function}
        -		 * @param  {node} cell `th` / `td` element to read the value from
        -		 * @return {string}    Data that has been read
        -		 */
        -		read: function ( cell ) {
        -			return $(cell).html();
        -		},
        -
        -		/**
        -		 * Cell write function
        -		 *
        -		 * Default function will simply write to the HTML and tell the DataTable
        -		 * to update.
        -		 *
        -		 * @type   {function}
        -		 * @param  {node} cell `th` / `td` element to write the value to
        -		 * @return {string}    Data two write
        -		 */
        -		write: function ( cell, val ) {
        -			var table = $(cell).parents('table');
        -			if ( DataTable.Api ) {
        -				// 1.10
        -				table.DataTable().cell( cell ).data( val );
        -			}
        -			else {
        -				// 1.9
        -				var dt = table.dataTable();
        -				var pos = dt.fnGetPosition( cell );
        -				dt.fnUpdate( val, pos[0], pos[2], false );
        -			}
        -		},
        -
        -		/**
        -		 * Step function. This provides the ability to customise how the values
        -		 * are incremented.
        -		 *
        -		 * @param  {node} cell `th` / `td` element that is being operated upon
        -		 * @param  {string} read Cell value from `read` function
        -		 * @param  {string} last Value of the previous cell
        -		 * @param  {integer} i Loop counter
        -		 * @param  {integer} x Cell x-position in the current auto-fill. The
        -		 *   starting cell is coordinate 0 regardless of its physical position
        -		 *   in the DataTable.
        -		 * @param  {integer} y Cell y-position in the current auto-fill. The
        -		 *   starting cell is coordinate 0 regardless of its physical position
        -		 *   in the DataTable.
        -		 * @return {string} Value to write
        -		 */
        -		step: function ( cell, read, last, i, x, y ) {
        -			// Increment a number if it is found
        -			var re = /(\-?\d+)/;
        -			var match = this.increment && last ? last.match(re) : null;
        -			if ( match ) {
        -				return last.replace( re, parseInt(match[1],10) + (x<0 || y<0 ? -1 : 1) );
        -			}
        -			return last === undefined ?
        -				read :
        -				last;
        -		}
        -	}
        -};
        -
        -return AutoFill;
        -};
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.AutoFill ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -}(window, document));
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.min.js b/resources/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.min.js
        deleted file mode 100755
        index 17f316a1a6..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.min.js
        +++ /dev/null
        @@ -1,22 +0,0 @@
        -/*!
        - AutoFill 1.2.1
        - ©2008-2014 SpryMedia Ltd - datatables.net/license
        -*/
        -(function(o,j,m){var l=function(c,k){var h=function(d,b){if(!(this instanceof h))throw"Warning: AutoFill must be initialised with the keyword 'new'";if(!c.fn.dataTableExt.fnVersionCheck("1.7.0"))throw"Warning: AutoFill requires DataTables 1.7 or greater";this.c={};this.s={filler:{height:0,width:0},border:{width:2},drag:{startX:-1,startY:-1,startTd:null,endTd:null,dragging:!1},screen:{interval:null,y:0,height:0,scrollTop:0},scroller:{top:0,bottom:0},columns:[]};this.dom={table:null,filler:null,borderTop:null,
        -borderRight:null,borderBottom:null,borderLeft:null,currentTarget:null};this.fnSettings=function(){return this.s};this._fnInit(d,b);return this};h.prototype={_fnInit:function(d,b){var a=this;this.s.dt=k.Api?(new k.Api(d)).settings()[0]:d.fnSettings();this.s.init=b||{};this.dom.table=this.s.dt.nTable;c.extend(!0,this.c,h.defaults,b);this._initColumns();var e=c("<div/>",{"class":"AutoFill_filler"}).appendTo("body");this.dom.filler=e[0];this.s.filler.height=e.height();this.s.filler.width=e.width();e[0].style.display=
        -"none";var g,f=j.body;""!==a.s.dt.oScroll.sY&&(a.s.dt.nTable.parentNode.style.position="relative",f=a.s.dt.nTable.parentNode);g=c("<div/>",{"class":"AutoFill_border"});this.dom.borderTop=g.clone().appendTo(f)[0];this.dom.borderRight=g.clone().appendTo(f)[0];this.dom.borderBottom=g.clone().appendTo(f)[0];this.dom.borderLeft=g.clone().appendTo(f)[0];e.on("mousedown.DTAF",function(b){this.onselectstart=function(){return false};a._fnFillerDragStart.call(a,b);return false});c("tbody",this.dom.table).on("mouseover.DTAF mouseout.DTAF",
        -">tr>td, >tr>th",function(b){a._fnFillerDisplay.call(a,b)});c(this.dom.table).on("destroy.dt.DTAF",function(){e.off("mousedown.DTAF").remove();c("tbody",this.dom.table).off("mouseover.DTAF mouseout.DTAF")})},_initColumns:function(){var d=this,b,a,e=this.s.dt,g=this.s.init;b=0;for(a=e.aoColumns.length;b<a;b++)this.s.columns[b]=c.extend(!0,{},h.defaults.column);e.oApi._fnApplyColumnDefs(e,g.aoColumnDefs||g.columnDefs,g.aoColumns||g.columns,function(a,b){d._fnColumnOptions(a,b)});b=0;for(a=e.aoColumns.length;b<
        -a;b++)if(e=this.s.columns[b],e.read||(e.read=this._fnReadCell),e.write||(e.read=this._fnWriteCell),!e.step)e.read=this._fnStep},_fnColumnOptions:function(d,b){var a=this.s.columns[d],c=function(c,d){b[d[0]]!==m&&(a[c]=b[d[0]]);b[d[1]]!==m&&(a[c]=b[d[1]])};c("enable",["bEnable","enable"]);c("read",["fnRead","read"]);c("write",["fnWrite","write"]);c("step",["fnStep","step"]);c("increment",["bIncrement","increment"])},_fnTargetCoords:function(d){var b=c(d).parents("tr")[0],a=this.s.dt.oInstance.fnGetPosition(d);
        -return{x:c("td",b).index(d),y:c("tr",b.parentNode).index(b),row:a[0],column:a[2]}},_fnUpdateBorder:function(d,b){var a=this.s.border.width,e=c(d).offset(),g=c(b).offset(),f=e.left-a,i=g.left+c(b).outerWidth(),n=e.top-a,h=g.top+c(b).outerHeight(),j=g.left+c(b).outerWidth()-e.left+2*a,k=g.top+c(b).outerHeight()-e.top+2*a;e.left>g.left&&(f=g.left-a,i=e.left+c(d).outerWidth(),j=e.left+c(d).outerWidth()-g.left+2*a);""!==this.s.dt.oScroll.sY&&(a=c(this.s.dt.nTable.parentNode).offset(),e=c(this.s.dt.nTable.parentNode).scrollTop(),
        -g=c(this.s.dt.nTable.parentNode).scrollLeft(),f-=a.left-g,i-=a.left-g,n-=a.top-e,h-=a.top-e);a=this.dom.borderTop.style;a.top=n+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderBottom.style;a.top=h+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderLeft.style;a.top=n+"px";a.left=f+"px";a.height=k+"px";a.width=this.s.border.width+"px";a=this.dom.borderRight.style;a.top=n+"px";a.left=i+"px";a.height=k+"px";a.width=this.s.border.width+
        -"px"},_fnFillerDragStart:function(d){var b=this,a=this.dom.currentTarget;this.s.drag.dragging=!0;b.dom.borderTop.style.display="block";b.dom.borderRight.style.display="block";b.dom.borderBottom.style.display="block";b.dom.borderLeft.style.display="block";var e=this._fnTargetCoords(a);this.s.drag.startX=e.x;this.s.drag.startY=e.y;this.s.drag.startTd=a;this.s.drag.endTd=a;this._fnUpdateBorder(a,a);c(j).bind("mousemove.AutoFill",function(a){b._fnFillerDragMove.call(b,a)});c(j).bind("mouseup.AutoFill",
        -function(a){b._fnFillerFinish.call(b,a)});this.s.screen.y=d.pageY;this.s.screen.height=c(o).height();this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom=this.s.scroller.top+c(this.s.dt.nTable.parentNode).height());this.s.screen.interval=setInterval(function(){var a=c(j).scrollTop();b.s.screen.y=b.s.screen.y+(a-b.s.screen.scrollTop);b.s.screen.height-b.s.screen.y+a<50?c("html, body").animate({scrollTop:a+
        -50},240,"linear"):b.s.screen.y-a<50&&c("html, body").animate({scrollTop:a-50},240,"linear");b.s.dt.oScroll.sY!==""&&(b.s.screen.y>b.s.scroller.bottom-50?c(b.s.dt.nTable.parentNode).animate({scrollTop:c(b.s.dt.nTable.parentNode).scrollTop()+50},240,"linear"):b.s.screen.y<b.s.scroller.top+50&&c(b.s.dt.nTable.parentNode).animate({scrollTop:c(b.s.dt.nTable.parentNode).scrollTop()-50},240,"linear"))},250)},_fnFillerDragMove:function(d){if(d.target&&"TD"==d.target.nodeName.toUpperCase()&&d.target!=this.s.drag.endTd){var b=
        -this._fnTargetCoords(d.target);"y"==this.c.mode&&b.x!=this.s.drag.startX&&(d.target=c("tbody>tr:eq("+b.y+")>td:eq("+this.s.drag.startX+")",this.dom.table)[0]);"x"==this.c.mode&&b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]);"either"==this.c.mode&&(b.x!=this.s.drag.startX?d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]:b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+b.y+")>td:eq("+this.s.drag.startX+
        -")",this.dom.table)[0]));"both"!==this.c.mode&&(b=this._fnTargetCoords(d.target));var a=this.s.drag;a.endTd=d.target;b.y>=this.s.drag.startY?this._fnUpdateBorder(a.startTd,a.endTd):this._fnUpdateBorder(a.endTd,a.startTd);this._fnFillerPosition(d.target)}this.s.screen.y=d.pageY;this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.scrollTop=c(this.s.dt.nTable.parentNode).scrollTop(),this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom=
        -this.s.scroller.top+c(this.s.dt.nTable.parentNode).height())},_fnFillerFinish:function(){var d=this,b,a;c(j).unbind("mousemove.AutoFill mouseup.AutoFill");this.dom.borderTop.style.display="none";this.dom.borderRight.style.display="none";this.dom.borderBottom.style.display="none";this.dom.borderLeft.style.display="none";this.s.drag.dragging=!1;clearInterval(this.s.screen.interval);var e=[],g=this.dom.table,f=this._fnTargetCoords(this.s.drag.startTd),i=this._fnTargetCoords(this.s.drag.endTd),h=function(a){return d.s.dt.oApi._fnVisibleToColumnIndex(d.s.dt,
        -a)};if(f.y<=i.y)for(b=f.y;b<=i.y;b++)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(b=f.y;b>=i.y;b--)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:f.x-a,y:f.y-
        -b,colIdx:h(a)});if(!(1>=e.length)){var g=[],m;b=0;for(a=e.length;b<a;b++){var f=e[b],i=this.s.columns[f.colIdx],h=i.read.call(i,f.node),l=i.step.call(i,f.node,h,m,b,f.x,f.y);i.write.call(i,f.node,l);m=l;g.push({cell:f,colIdx:f.colIdx,newValue:l,oldValue:h})}null!==this.c.complete&&this.c.complete.call(this,g);k.Api?(new k.Api(this.s.dt)).draw(!1):this.s.dt.oInstance.fnDraw()}},_fnFillerDisplay:function(d){var b=this.dom.filler;if(!this.s.drag.dragging){var a="td"==d.target.nodeName.toLowerCase()?
        -d.target:c(d.target).parents("td")[0],e=this._fnTargetCoords(a).column;if(this.s.columns[e].enable)if("mouseover"==d.type)this.dom.currentTarget=a,this._fnFillerPosition(a),b.style.display="block";else{if(!d.relatedTarget||!d.relatedTarget.className.match(/AutoFill/))b.style.display="none"}else b.style.display="none"}},_fnFillerPosition:function(d){var b=c(d).offset(),a=this.dom.filler;a.style.top=b.top-this.s.filler.height/2-1+c(d).outerHeight()+"px";a.style.left=b.left-this.s.filler.width/2-1+c(d).outerWidth()+
        -"px"}};k.AutoFill=h;k.AutoFill=h;h.version="1.2.1";h.defaults={mode:"y",complete:null,column:{enable:!0,increment:!0,read:function(d){return c(d).html()},write:function(d,b){var a=c(d).parents("table");if(k.Api)a.DataTable().cell(d).data(b);else{var a=a.dataTable(),e=a.fnGetPosition(d);a.fnUpdate(b,e[0],e[2],!1)}},step:function(c,b,a,e,g,f){c=/(\-?\d+)/;return(e=this.increment&&a?a.match(c):null)?a.replace(c,parseInt(e[1],10)+(0>g||0>f?-1:1)):a===m?b:a}}};return h};"function"===typeof define&&define.amd?
        -define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.AutoFill&&l(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/Readme.md b/resources/assets/js/plugins/datatables/extensions/ColReorder/Readme.md
        deleted file mode 100755
        index 217dd60e2c..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/Readme.md
        +++ /dev/null
        @@ -1,39 +0,0 @@
        -# ColReorder
        -
        -ColReorder adds the ability for the end user to click and drag column headers to reorder a table as they see fit, to DataTables. Key features include:
        -
        -* Very easy integration with DataTables
        -* Tight integration with all other DataTables plug-ins
        -* The ability to exclude the first (or more) column from being movable
        -* Predefine a column order
        -* Save staving integration with DataTables
        -
        -
        -# Installation
        -
        -To use ColReorder, first download DataTables ( http://datatables.net/download ) and place the unzipped ColReorder package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -ColReorder is initialised using the `$.fn.dataTable.ColReorder` constructor. For example:
        -
        -```js
        -$(document).ready( function () {
        -    $('#example').DataTable();
        -
        -    new $.fn.dataTable.ColReorder( table );
        -} );
        -```
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/colreorder/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of ColReorder and help make it better, please refer to its GitHub repo: https://github.com/DataTables/ColReorder
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css b/resources/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css
        deleted file mode 100755
        index bdd6aa0b9a..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css
        +++ /dev/null
        @@ -1,14 +0,0 @@
        -/*
        - * Namespace DTCR - "DataTables ColReorder" plug-in
        - */
        -
        -table.DTCR_clonedTable {
        -	background-color: rgba(255, 255, 255, 0.7);
        -	z-index: 202;
        -}
        -
        -div.DTCR_pointer {
        -	width: 1px;
        -	background-color: #0259C4;
        -	z-index: 201;
        -}
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css b/resources/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css
        deleted file mode 100755
        index 77b230e013..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -table.DTCR_clonedTable{background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201}
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/alt_insert.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/alt_insert.html
        deleted file mode 100755
        index 16bedcfee2..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/alt_insert.html
        +++ /dev/null
        @@ -1,637 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Alternative insert styling</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -div.DTCR_pointer {
        -	margin-top: -15px;
        -	margin-left: -9px;
        -	width: 18px;
        -	background: url('../images/insert.png') no-repeat top left;
        -}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Alternative insert styling</span></h1>
        -
        -			<div class="info">
        -				<p>Using CSS it is easy to modify the insert bar to suit your web-site. This example shows how an arrow can be used to show the insert point rather than the
        -				straight bar used in the other examples by simply adding an extra CSS rule to include the image.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">div.DTCR_pointer {
        -	margin-top: -15px;
        -	margin-left: -9px;
        -	width: 18px;
        -	background: url('../images/insert.png') no-repeat top left;
        -}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li class="active"><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/col_filter.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/col_filter.html
        deleted file mode 100755
        index 355ff2b58f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/col_filter.html
        +++ /dev/null
        @@ -1,656 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Individual column filtering</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -    // Setup - add a text input to each footer cell
        -    $('#example tfoot th').each( function () {
        -        var title = $('#example thead th').eq( $(this).index() ).text();
        -        $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
        -    } );
        - 
        -    // DataTable
        -    var table = $('#example').DataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -     
        -    // Apply the filter
        -    $("#example tfoot input").on( 'keyup change', function () {
        -        table
        -            .column( $(this).parent().index()+':visible' )
        -            .search( this.value )
        -            .draw();
        -    } );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Individual column filtering</span></h1>
        -
        -			<div class="info">
        -				<p>This example of how to use ColReorder shows how it can with with DataTables' ability to do individual column filtering. The basic example is exactly the same as
        -				the DataTables column filtering example, but with ColReorder also added to the table (through the <code>R</code> option for <a href=
        -				"//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a>).</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -    // Setup - add a text input to each footer cell
        -    $('#example tfoot th').each( function () {
        -        var title = $('#example thead th').eq( $(this).index() ).text();
        -        $(this).html( '&lt;input type=&quot;text&quot; placeholder=&quot;Search '+title+'&quot; /&gt;' );
        -    } );
        - 
        -    // DataTable
        -    var table = $('#example').DataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -     
        -    // Apply the filter
        -    $(&quot;#example tfoot input&quot;).on( 'keyup change', function () {
        -        table
        -            .column( $(this).parent().index()+':visible' )
        -            .search( this.value )
        -            .draw();
        -    } );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li class="active"><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/colvis.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/colvis.html
        deleted file mode 100755
        index 54c79c2a17..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/colvis.html
        +++ /dev/null
        @@ -1,635 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - ColVis integration</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../ColVis/css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../ColVis/js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -    var table = $('#example').DataTable( {
        -        dom: 'RC<"clear">lfrtip',
        -        columnDefs: [
        -            { visible: false, targets: 1 }
        -        ]
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>ColVis integration</span></h1>
        -
        -			<div class="info">
        -				<p>ColReorder interfaces with the <a href="//datatables.net/extensions/colvis">ColVis extension</a> for DataTables by updating the order of the list of columns
        -				whenever a reorder is done. This is shown in the example below, where one column has been initially hidden to add extra emphasis to ColVis.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -    var table = $('#example').DataTable( {
        -        dom: 'RC&lt;&quot;clear&quot;&gt;lfrtip',
        -        columnDefs: [
        -            { visible: false, targets: 1 }
        -        ]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -						<li><a href="../../ColVis/js/dataTables.colVis.js">../../ColVis/js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -						<li><a href="../../ColVis/css/dataTables.colVis.css">../../ColVis/css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li class="active"><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html
        deleted file mode 100755
        index 0599ba48d3..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html
        +++ /dev/null
        @@ -1,831 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - FixedColumns integration</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../FixedColumns/css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../FixedColumns/js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	window.table = $('#example').DataTable( {
        -		dom: 'Rlfrtip',
        -		scrollX: true,
        -		scrollCollapse: true,
        -		columnDefs: [
        -			{ orderable: false, targets: 0 },
        -			{ orderable: false, targets: -1 }
        -		],
        -		ordering: [[ 1, 'asc' ]],
        -		colReorder: {
        -			fixedColumnsLeft: 1,
        -			fixedColumnsRight: 1
        -		}
        -	} );
        -
        -	window.fc = new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 1,
        -		rightColumns: 1
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>FixedColumns integration</span></h1>
        -
        -			<div class="info">
        -				<p>While ColReorder works with the built-in scrolling options in DataTables (<a href="//datatables.net/reference/option/scrollY"><code class="option" title=
        -				"DataTables initialisation option">scrollY<span>DT</span></code></a> and <a href="//datatables.net/reference/option/scrollX"><code class="option" title=
        -				"DataTables initialisation option">scrollX<span>DT</span></code></a>) and also the <a href="//datatables.net/extensions/fixedcolumns">FixedColumns
        -				extension</a>.</p>
        -
        -				<p>ColReorder provides the <code>fixedColumnsLeft</code> and <code>fixedColumnsRight</code> options which allows you disallow reordering of the fixed columns
        -				(which is required).</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	window.table = $('#example').DataTable( {
        -		dom: 'Rlfrtip',
        -		scrollX: true,
        -		scrollCollapse: true,
        -		columnDefs: [
        -			{ orderable: false, targets: 0 },
        -			{ orderable: false, targets: -1 }
        -		],
        -		ordering: [[ 1, 'asc' ]],
        -		colReorder: {
        -			fixedColumnsLeft: 1,
        -			fixedColumnsRight: 1
        -		}
        -	} );
        -
        -	window.fc = new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 1,
        -		rightColumns: 1
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -						<li><a href="../../FixedColumns/js/dataTables.fixedColumns.js">../../FixedColumns/js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -						<li><a href="../../FixedColumns/css/dataTables.fixedColumns.css">../../FixedColumns/css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li class="active"><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedheader.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedheader.html
        deleted file mode 100755
        index 40f05468ff..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedheader.html
        +++ /dev/null
        @@ -1,635 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - FixedHeader integration</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../FixedHeader/css/dataTables.fixedHeader.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../FixedHeader/js/dataTables.fixedHeader.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').dataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -
        -	new $.fn.dataTable.fixedHeader( table );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>FixedHeader integration</span></h1>
        -
        -			<div class="info">
        -				<p>FixedHeader is a particularly useful plug-in for DataTables, allowing a table header to float at the top of a scrolling window. ColReorder works well with
        -				FixedHeader, allowing you to reorder columns even using the floating header, as shown in the example below.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').dataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -
        -	new $.fn.dataTable.fixedHeader( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -						<li><a href="../../FixedHeader/js/dataTables.fixedHeader.js">../../FixedHeader/js/dataTables.fixedHeader.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -						<li><a href="../../FixedHeader/css/dataTables.fixedHeader.css">../../FixedHeader/css/dataTables.fixedHeader.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li class="active"><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/index.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/index.html
        deleted file mode 100755
        index 65018ab6ff..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/index.html
        +++ /dev/null
        @@ -1,74 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>ColReorder examples - ColReorder examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>ColReorder examples</span></h1>
        -
        -			<div class="info">
        -				<p>ColReorder adds the ability for the end user to click and drag column headers to reorder a table as they see fit, to DataTables. Key features include:</p>
        -
        -				<ul class="markdown">
        -					<li>Very easy integration with DataTables</li>
        -					<li>Tight integration with all other DataTables plug-ins</li>
        -					<li>The ability to exclude the first (or more) column from being movable</li>
        -					<li>Predefine a column order</li>
        -					<li>Save staving integration with DataTables</li>
        -				</ul>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/jqueryui.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/jqueryui.html
        deleted file mode 100755
        index 8eedf9126e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/jqueryui.html
        +++ /dev/null
        @@ -1,635 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - jQuery UI styling</title>
        -	<link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
        -	<link rel="stylesheet" type="text/css" href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../Plugins/integration/jqueryui/dataTables.jqueryui.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.ColReorder( table );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>jQuery UI styling</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows how the jQuery UI ThemeRoller option in DataTables can be used with ColReorder.</p>
        -
        -				<p>The important thing to note here is that it is easier to use <code>new $.fn.dataTable.ColReorder()</code> to add ColReorder to the table rather than <a href=
        -				"//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> as the jQuery UI integration
        -				uses a complex expression for <a href="//datatables.net/reference/option/dom"><code class="option" title=
        -				"DataTables initialisation option">dom<span>DT</span></code></a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').dataTable();
        -
        -	new $.fn.dataTable.ColReorder( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.js">../../Plugins/integration/jqueryui/dataTables.jqueryui.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css</a></li>
        -						<li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">../../Plugins/integration/jqueryui/dataTables.jqueryui.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li class="active"><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/new_init.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/new_init.html
        deleted file mode 100755
        index 01ab2aacde..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/new_init.html
        +++ /dev/null
        @@ -1,626 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Initialisation using `new`</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.ColReorder( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Initialisation using `new`</span></h1>
        -
        -			<div class="info">
        -				<p>As well as providing the option to be initialised through the <code>R</code> option of <a href="//datatables.net/reference/option/dom"><code class="option"
        -				title="DataTables initialisation option">dom<span>DT</span></code></a>, ColReorder can also be added to a DataTable using direct initialisation - <code>new
        -				$.fn.dataTable.ColReorder();</code> as shown in this example.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.ColReorder( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/predefined.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/predefined.html
        deleted file mode 100755
        index 3cbb166397..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/predefined.html
        +++ /dev/null
        @@ -1,636 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Predefined column ordering</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		colReorder: {
        -			order: [ 4, 3, 2, 1, 0, 5 ]
        -		}
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Predefined column ordering</span></h1>
        -
        -			<div class="info">
        -				<p>ColReorder provides the ability to specify a column ordering which is not that of the HTML (which typically you will want) through the parameter
        -				<code>colReorder.order</code>. This is an array of integers with the column ordering you want.</p>
        -
        -				<p>For full information about the ColReorder options, please refer to the <a href="//datatables.net/extensions/colreorder/options">ColReorder options
        -				documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		colReorder: {
        -			order: [ 4, 3, 2, 1, 0, 5 ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li class="active"><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/realtime.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/realtime.html
        deleted file mode 100755
        index c759409aa8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/realtime.html
        +++ /dev/null
        @@ -1,637 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Realtime updating</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		colReorder: {
        -			realtime: true
        -		}
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Realtime updating</span></h1>
        -
        -			<div class="info">
        -				<p>While the ColReorder insertion point indicator can be styled, another option to show the end user what the column will look like when the table has been
        -				reordered is to actually do the reordering while the mouse is still dragging the column header. This is shown in this example and is controlled by the
        -				<code>realtime</code> parameter.</p>
        -
        -				<p>For full information about the ColReorder options, please refer to the <a href="//datatables.net/extensions/colreorder/options">ColReorder options
        -				documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		colReorder: {
        -			realtime: true
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li class="active"><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/reset.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/reset.html
        deleted file mode 100755
        index b2e1fc08ff..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/reset.html
        +++ /dev/null
        @@ -1,649 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Reset ordering API</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		dom: 'Rlfrtip',
        -		colReorder: {
        -			order: [ 4, 3, 2, 1, 0 ]
        -		}
        -	} );
        -	
        -	$('#reset').click( function (e) {
        -		e.preventDefault();
        -		
        -		table.colReorder.reset();
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Reset ordering API</span></h1>
        -
        -			<div class="info">
        -				<p>One useful control option to present the end user when using ColReorder is the ability to reset the column ordering to that which was found in the HTML. This
        -				can be done by calling the <code>reset</code> API function. While ColReorder does not provide a visual element for this itself (in order to provide maximum
        -				flexibility) it is easy to hook to an event handler, as shown in this example.</p>
        -
        -				<p>For full information about the ColReorder API, please refer to the <a href="//datatables.net/extensions/colreorder/api">ColReorder API documentation</a>.</p>
        -			</div><button id="reset">Reset to original HTML order</button><br>
        -			<br>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		dom: 'Rlfrtip',
        -		colReorder: {
        -			order: [ 4, 3, 2, 1, 0 ]
        -		}
        -	} );
        -	
        -	$('#reset').click( function (e) {
        -		e.preventDefault();
        -		
        -		table.colReorder.reset();
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li class="active"><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/scrolling.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/scrolling.html
        deleted file mode 100755
        index 860e665584..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/scrolling.html
        +++ /dev/null
        @@ -1,632 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Scrolling table</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom:     'Rlfrtip',
        -		scrollY: '200px',
        -		paging:  false
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Scrolling table</span></h1>
        -
        -			<div class="info">
        -				<p>This is a simple example to show ColReorder working with DataTables scrolling (<a href="//datatables.net/reference/option/scrollY"><code class="option" title=
        -				"DataTables initialisation option">scrollY<span>DT</span></code></a> and <a href="//datatables.net/reference/option/scrollX"><code class="option" title=
        -				"DataTables initialisation option">scrollX<span>DT</span></code></a>).</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom:     'Rlfrtip',
        -		scrollY: '200px',
        -		paging:  false
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li class="active"><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/server_side.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/server_side.html
        deleted file mode 100755
        index f682b7ab52..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/server_side.html
        +++ /dev/null
        @@ -1,192 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Server-side processing</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		processing: true,
        -		serverSide: true,
        -		ajax: "../../../examples/server_side/scripts/objects.php",
        -		columns: [
        -			{ data: "first_name" },
        -			{ data: "last_name" },
        -			{ data: "position" },
        -			{ data: "office" },
        -			{ data: "start_date" },
        -			{ data: "salary" }
        -		]
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Server-side processing</span></h1>
        -
        -			<div class="info">
        -				<p>Server-side processing can be exceptionally useful in DataTables when dealing with massive data sets, and ColReorder works with this as would be expected.</p>
        -
        -				<p>It is recommend that you use object based data with server-side processing and ColReorder, as this provides easily understandable mapping between the the
        -				columns and the data relation on the server, otherwise you need to work out array indexes on each call!</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		processing: true,
        -		serverSide: true,
        -		ajax: &quot;../../../examples/server_side/scripts/objects.php&quot;,
        -		columns: [
        -			{ data: &quot;first_name&quot; },
        -			{ data: &quot;last_name&quot; },
        -			{ data: &quot;position&quot; },
        -			{ data: &quot;office&quot; },
        -			{ data: &quot;start_date&quot; },
        -			{ data: &quot;salary&quot; }
        -		]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li class="active"><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/simple.html
        deleted file mode 100755
        index 92cffee792..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/simple.html
        +++ /dev/null
        @@ -1,630 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows the basic use case of the ColReorder plug-in. With ColReorder enabled for a table, the user has the ability to click and drag any table
        -				header cell, and drop it where they wish the column to be inserted. The insert point is shown visually, and the column reordering is done as soon as the mouse
        -				button is released.</p>
        -
        -				<p>ColReorder is added to a DataTable through the <code>R</code> character that it adds to DataTables feature plug-ins. This means that you simply add the
        -				character <code>R</code> to the <a href="//datatables.net/reference/option/dom"><code class="option" title=
        -				"DataTables initialisation option">dom<span>DT</span></code></a> parameter for your table to add ColReorder - as shown in the example below.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'Rlfrtip'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/state_save.html b/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/state_save.html
        deleted file mode 100755
        index 6e4e2e9eec..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/examples/state_save.html
        +++ /dev/null
        @@ -1,631 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColReorder example - State saving</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		stateSave: true
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColReorder example <span>State saving</span></h1>
        -
        -			<div class="info">
        -				<p>A useful interaction pattern to use in DataTables is state saving, so when the end user reloads or revisits a page its previous state is retained. ColReorder
        -				works seamlessly with state saving in DataTables (<a href="//datatables.net/reference/option/stateSave"><code class="option" title=
        -				"DataTables initialisation option">stateSave<span>DT</span></code></a>), remembering and restoring the column positions, as well as everything else such as sorting
        -				and filtering.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').dataTable( {
        -		dom: 'Rlfrtip',
        -		stateSave: true
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">Initialisation using `new`</a></li>
        -							<li><a href="./alt_insert.html">Alternative insert styling</a></li>
        -							<li><a href="./realtime.html">Realtime updating</a></li>
        -							<li class="active"><a href="./state_save.html">State saving</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./predefined.html">Predefined column ordering</a></li>
        -							<li><a href="./reset.html">Reset ordering API</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./fixedcolumns.html">FixedColumns integration</a></li>
        -							<li><a href="./fixedheader.html">FixedHeader integration</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./server_side.html">Server-side processing</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/images/insert.png b/resources/assets/js/plugins/datatables/extensions/ColReorder/images/insert.png
        deleted file mode 100755
        index 15d5522da6..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/ColReorder/images/insert.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js b/resources/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js
        deleted file mode 100755
        index c3b2f1e2ad..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js
        +++ /dev/null
        @@ -1,1372 +0,0 @@
        -/*! ColReorder 1.1.3
        - * ©2010-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     ColReorder
        - * @description Provide the ability to reorder columns in a DataTable
        - * @version     1.1.3
        - * @file        dataTables.colReorder.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2010-2014 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -(function(window, document, undefined) {
        -
        -
        -/**
        - * Switch the key value pairing of an index array to be value key (i.e. the old value is now the
        - * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ].
        - *  @method  fnInvertKeyValues
        - *  @param   array aIn Array to switch around
        - *  @returns array
        - */
        -function fnInvertKeyValues( aIn )
        -{
        -	var aRet=[];
        -	for ( var i=0, iLen=aIn.length ; i<iLen ; i++ )
        -	{
        -		aRet[ aIn[i] ] = i;
        -	}
        -	return aRet;
        -}
        -
        -
        -/**
        - * Modify an array by switching the position of two elements
        - *  @method  fnArraySwitch
        - *  @param   array aArray Array to consider, will be modified by reference (i.e. no return)
        - *  @param   int iFrom From point
        - *  @param   int iTo Insert point
        - *  @returns void
        - */
        -function fnArraySwitch( aArray, iFrom, iTo )
        -{
        -	var mStore = aArray.splice( iFrom, 1 )[0];
        -	aArray.splice( iTo, 0, mStore );
        -}
        -
        -
        -/**
        - * Switch the positions of nodes in a parent node (note this is specifically designed for
        - * table rows). Note this function considers all element nodes under the parent!
        - *  @method  fnDomSwitch
        - *  @param   string sTag Tag to consider
        - *  @param   int iFrom Element to move
        - *  @param   int Point to element the element to (before this point), can be null for append
        - *  @returns void
        - */
        -function fnDomSwitch( nParent, iFrom, iTo )
        -{
        -	var anTags = [];
        -	for ( var i=0, iLen=nParent.childNodes.length ; i<iLen ; i++ )
        -	{
        -		if ( nParent.childNodes[i].nodeType == 1 )
        -		{
        -			anTags.push( nParent.childNodes[i] );
        -		}
        -	}
        -	var nStore = anTags[ iFrom ];
        -
        -	if ( iTo !== null )
        -	{
        -		nParent.insertBefore( nStore, anTags[iTo] );
        -	}
        -	else
        -	{
        -		nParent.appendChild( nStore );
        -	}
        -}
        -
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -/**
        - * Plug-in for DataTables which will reorder the internal column structure by taking the column
        - * from one position (iFrom) and insert it into a given point (iTo).
        - *  @method  $.fn.dataTableExt.oApi.fnColReorder
        - *  @param   object oSettings DataTables settings object - automatically added by DataTables!
        - *  @param   int iFrom Take the column to be repositioned from this point
        - *  @param   int iTo and insert it into this point
        - *  @returns void
        - */
        -$.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
        -{
        -	var v110 = $.fn.dataTable.Api ? true : false;
        -	var i, iLen, j, jLen, iCols=oSettings.aoColumns.length, nTrs, oCol;
        -	var attrMap = function ( obj, prop, mapping ) {
        -		if ( ! obj[ prop ] ) {
        -			return;
        -		}
        -
        -		var a = obj[ prop ].split('.');
        -		var num = a.shift();
        -
        -		if ( isNaN( num*1 ) ) {
        -			return;
        -		}
        -
        -		obj[ prop ] = mapping[ num*1 ]+'.'+a.join('.');
        -	};
        -
        -	/* Sanity check in the input */
        -	if ( iFrom == iTo )
        -	{
        -		/* Pointless reorder */
        -		return;
        -	}
        -
        -	if ( iFrom < 0 || iFrom >= iCols )
        -	{
        -		this.oApi._fnLog( oSettings, 1, "ColReorder 'from' index is out of bounds: "+iFrom );
        -		return;
        -	}
        -
        -	if ( iTo < 0 || iTo >= iCols )
        -	{
        -		this.oApi._fnLog( oSettings, 1, "ColReorder 'to' index is out of bounds: "+iTo );
        -		return;
        -	}
        -
        -	/*
        -	 * Calculate the new column array index, so we have a mapping between the old and new
        -	 */
        -	var aiMapping = [];
        -	for ( i=0, iLen=iCols ; i<iLen ; i++ )
        -	{
        -		aiMapping[i] = i;
        -	}
        -	fnArraySwitch( aiMapping, iFrom, iTo );
        -	var aiInvertMapping = fnInvertKeyValues( aiMapping );
        -
        -
        -	/*
        -	 * Convert all internal indexing to the new column order indexes
        -	 */
        -	/* Sorting */
        -	for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
        -	{
        -		oSettings.aaSorting[i][0] = aiInvertMapping[ oSettings.aaSorting[i][0] ];
        -	}
        -
        -	/* Fixed sorting */
        -	if ( oSettings.aaSortingFixed !== null )
        -	{
        -		for ( i=0, iLen=oSettings.aaSortingFixed.length ; i<iLen ; i++ )
        -		{
        -			oSettings.aaSortingFixed[i][0] = aiInvertMapping[ oSettings.aaSortingFixed[i][0] ];
        -		}
        -	}
        -
        -	/* Data column sorting (the column which the sort for a given column should take place on) */
        -	for ( i=0, iLen=iCols ; i<iLen ; i++ )
        -	{
        -		oCol = oSettings.aoColumns[i];
        -		for ( j=0, jLen=oCol.aDataSort.length ; j<jLen ; j++ )
        -		{
        -			oCol.aDataSort[j] = aiInvertMapping[ oCol.aDataSort[j] ];
        -		}
        -
        -		// Update the column indexes
        -		if ( v110 ) {
        -			oCol.idx = aiInvertMapping[ oCol.idx ];
        -		}
        -	}
        -
        -	if ( v110 ) {
        -		// Update 1.10 optimised sort class removal variable
        -		$.each( oSettings.aLastSort, function (i, val) {
        -			oSettings.aLastSort[i].src = aiInvertMapping[ val.src ];
        -		} );
        -	}
        -
        -	/* Update the Get and Set functions for each column */
        -	for ( i=0, iLen=iCols ; i<iLen ; i++ )
        -	{
        -		oCol = oSettings.aoColumns[i];
        -
        -		if ( typeof oCol.mData == 'number' ) {
        -			oCol.mData = aiInvertMapping[ oCol.mData ];
        -
        -			// regenerate the get / set functions
        -			oSettings.oApi._fnColumnOptions( oSettings, i, {} );
        -		}
        -		else if ( $.isPlainObject( oCol.mData ) ) {
        -			// HTML5 data sourced
        -			attrMap( oCol.mData, '_',      aiInvertMapping );
        -			attrMap( oCol.mData, 'filter', aiInvertMapping );
        -			attrMap( oCol.mData, 'sort',   aiInvertMapping );
        -			attrMap( oCol.mData, 'type',   aiInvertMapping );
        -
        -			// regenerate the get / set functions
        -			oSettings.oApi._fnColumnOptions( oSettings, i, {} );
        -		}
        -	}
        -
        -
        -	/*
        -	 * Move the DOM elements
        -	 */
        -	if ( oSettings.aoColumns[iFrom].bVisible )
        -	{
        -		/* Calculate the current visible index and the point to insert the node before. The insert
        -		 * before needs to take into account that there might not be an element to insert before,
        -		 * in which case it will be null, and an appendChild should be used
        -		 */
        -		var iVisibleIndex = this.oApi._fnColumnIndexToVisible( oSettings, iFrom );
        -		var iInsertBeforeIndex = null;
        -
        -		i = iTo < iFrom ? iTo : iTo + 1;
        -		while ( iInsertBeforeIndex === null && i < iCols )
        -		{
        -			iInsertBeforeIndex = this.oApi._fnColumnIndexToVisible( oSettings, i );
        -			i++;
        -		}
        -
        -		/* Header */
        -		nTrs = oSettings.nTHead.getElementsByTagName('tr');
        -		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
        -		{
        -			fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex );
        -		}
        -
        -		/* Footer */
        -		if ( oSettings.nTFoot !== null )
        -		{
        -			nTrs = oSettings.nTFoot.getElementsByTagName('tr');
        -			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
        -			{
        -				fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex );
        -			}
        -		}
        -
        -		/* Body */
        -		for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
        -		{
        -			if ( oSettings.aoData[i].nTr !== null )
        -			{
        -				fnDomSwitch( oSettings.aoData[i].nTr, iVisibleIndex, iInsertBeforeIndex );
        -			}
        -		}
        -	}
        -
        -	/*
        -	 * Move the internal array elements
        -	 */
        -	/* Columns */
        -	fnArraySwitch( oSettings.aoColumns, iFrom, iTo );
        -
        -	/* Search columns */
        -	fnArraySwitch( oSettings.aoPreSearchCols, iFrom, iTo );
        -
        -	/* Array array - internal data anodes cache */
        -	for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
        -	{
        -		var data = oSettings.aoData[i];
        -
        -		if ( v110 ) {
        -			// DataTables 1.10+
        -			if ( data.anCells ) {
        -				fnArraySwitch( data.anCells, iFrom, iTo );
        -			}
        -
        -			// For DOM sourced data, the invalidate will reread the cell into
        -			// the data array, but for data sources as an array, they need to
        -			// be flipped
        -			if ( data.src !== 'dom' && $.isArray( data._aData ) ) {
        -				fnArraySwitch( data._aData, iFrom, iTo );
        -			}
        -		}
        -		else {
        -			// DataTables 1.9-
        -			if ( $.isArray( data._aData ) ) {
        -				fnArraySwitch( data._aData, iFrom, iTo );
        -			}
        -			fnArraySwitch( data._anHidden, iFrom, iTo );
        -		}
        -	}
        -
        -	/* Reposition the header elements in the header layout array */
        -	for ( i=0, iLen=oSettings.aoHeader.length ; i<iLen ; i++ )
        -	{
        -		fnArraySwitch( oSettings.aoHeader[i], iFrom, iTo );
        -	}
        -
        -	if ( oSettings.aoFooter !== null )
        -	{
        -		for ( i=0, iLen=oSettings.aoFooter.length ; i<iLen ; i++ )
        -		{
        -			fnArraySwitch( oSettings.aoFooter[i], iFrom, iTo );
        -		}
        -	}
        -
        -	// In 1.10 we need to invalidate row cached data for sorting, filtering etc
        -	if ( v110 ) {
        -		var api = new $.fn.dataTable.Api( oSettings );
        -		api.rows().invalidate();
        -	}
        -
        -	/*
        -	 * Update DataTables' event handlers
        -	 */
        -
        -	/* Sort listener */
        -	for ( i=0, iLen=iCols ; i<iLen ; i++ )
        -	{
        -		$(oSettings.aoColumns[i].nTh).off('click.DT');
        -		this.oApi._fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
        -	}
        -
        -
        -	/* Fire an event so other plug-ins can update */
        -	$(oSettings.oInstance).trigger( 'column-reorder', [ oSettings, {
        -		"iFrom": iFrom,
        -		"iTo": iTo,
        -		"aiInvertMapping": aiInvertMapping
        -	} ] );
        -};
        -
        -
        -/**
        - * ColReorder provides column visibility control for DataTables
        - * @class ColReorder
        - * @constructor
        - * @param {object} dt DataTables settings object
        - * @param {object} opts ColReorder options
        - */
        -var ColReorder = function( dt, opts )
        -{
        -	var oDTSettings;
        -
        -	if ( $.fn.dataTable.Api ) {
        -		oDTSettings = new $.fn.dataTable.Api( dt ).settings()[0];
        -	}
        -	// 1.9 compatibility
        -	else if ( dt.fnSettings ) {
        -		// DataTables object, convert to the settings object
        -		oDTSettings = dt.fnSettings();
        -	}
        -	else if ( typeof dt === 'string' ) {
        -		// jQuery selector
        -		if ( $.fn.dataTable.fnIsDataTable( $(dt)[0] ) ) {
        -			oDTSettings = $(dt).eq(0).dataTable().fnSettings();
        -		}
        -	}
        -	else if ( dt.nodeName && dt.nodeName.toLowerCase() === 'table' ) {
        -		// Table node
        -		if ( $.fn.dataTable.fnIsDataTable( dt.nodeName ) ) {
        -			oDTSettings = $(dt.nodeName).dataTable().fnSettings();
        -		}
        -	}
        -	else if ( dt instanceof jQuery ) {
        -		// jQuery object
        -		if ( $.fn.dataTable.fnIsDataTable( dt[0] ) ) {
        -			oDTSettings = dt.eq(0).dataTable().fnSettings();
        -		}
        -	}
        -	else {
        -		// DataTables settings object
        -		oDTSettings = dt;
        -	}
        -
        -	// Ensure that we can't initialise on the same table twice
        -	if ( oDTSettings._colReorder ) {
        -		throw "ColReorder already initialised on table #"+oDTSettings.nTable.id;
        -	}
        -
        -	// Convert from camelCase to Hungarian, just as DataTables does
        -	var camelToHungarian = $.fn.dataTable.camelToHungarian;
        -	if ( camelToHungarian ) {
        -		camelToHungarian( ColReorder.defaults, ColReorder.defaults, true );
        -		camelToHungarian( ColReorder.defaults, opts || {} );
        -	}
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public class variables
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * @namespace Settings object which contains customisable information for ColReorder instance
        -	 */
        -	this.s = {
        -		/**
        -		 * DataTables settings object
        -		 *  @property dt
        -		 *  @type     Object
        -		 *  @default  null
        -		 */
        -		"dt": null,
        -
        -		/**
        -		 * Initialisation object used for this instance
        -		 *  @property init
        -		 *  @type     object
        -		 *  @default  {}
        -		 */
        -		"init": $.extend( true, {}, ColReorder.defaults, opts ),
        -
        -		/**
        -		 * Number of columns to fix (not allow to be reordered)
        -		 *  @property fixed
        -		 *  @type     int
        -		 *  @default  0
        -		 */
        -		"fixed": 0,
        -
        -		/**
        -		 * Number of columns to fix counting from right (not allow to be reordered)
        -		 *  @property fixedRight
        -		 *  @type     int
        -		 *  @default  0
        -		 */
        -		"fixedRight": 0,
        -
        -		/**
        -		 * Callback function for once the reorder has been done
        -		 *  @property reorderCallback
        -		 *  @type     function
        -		 *  @default  null
        -		 */
        -		"reorderCallback": null,
        -
        -		/**
        -		 * @namespace Information used for the mouse drag
        -		 */
        -		"mouse": {
        -			"startX": -1,
        -			"startY": -1,
        -			"offsetX": -1,
        -			"offsetY": -1,
        -			"target": -1,
        -			"targetIndex": -1,
        -			"fromIndex": -1
        -		},
        -
        -		/**
        -		 * Information which is used for positioning the insert cusor and knowing where to do the
        -		 * insert. Array of objects with the properties:
        -		 *   x: x-axis position
        -		 *   to: insert point
        -		 *  @property aoTargets
        -		 *  @type     array
        -		 *  @default  []
        -		 */
        -		"aoTargets": []
        -	};
        -
        -
        -	/**
        -	 * @namespace Common and useful DOM elements for the class instance
        -	 */
        -	this.dom = {
        -		/**
        -		 * Dragging element (the one the mouse is moving)
        -		 *  @property drag
        -		 *  @type     element
        -		 *  @default  null
        -		 */
        -		"drag": null,
        -
        -		/**
        -		 * The insert cursor
        -		 *  @property pointer
        -		 *  @type     element
        -		 *  @default  null
        -		 */
        -		"pointer": null
        -	};
        -
        -
        -	/* Constructor logic */
        -	this.s.dt = oDTSettings;
        -	this.s.dt._colReorder = this;
        -	this._fnConstruct();
        -
        -	/* Add destroy callback */
        -	oDTSettings.oApi._fnCallbackReg(oDTSettings, 'aoDestroyCallback', $.proxy(this._fnDestroy, this), 'ColReorder');
        -
        -	return this;
        -};
        -
        -
        -
        -ColReorder.prototype = {
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Reset the column ordering to the original ordering that was detected on
        -	 * start up.
        -	 *  @return {this} Returns `this` for chaining.
        -	 *
        -	 *  @example
        -	 *    // DataTables initialisation with ColReorder
        -	 *    var table = $('#example').dataTable( {
        -	 *        "sDom": 'Rlfrtip'
        -	 *    } );
        -	 *
        -	 *    // Add click event to a button to reset the ordering
        -	 *    $('#resetOrdering').click( function (e) {
        -	 *        e.preventDefault();
        -	 *        $.fn.dataTable.ColReorder( table ).fnReset();
        -	 *    } );
        -	 */
        -	"fnReset": function ()
        -	{
        -		var a = [];
        -		for ( var i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ )
        -		{
        -			a.push( this.s.dt.aoColumns[i]._ColReorder_iOrigCol );
        -		}
        -
        -		this._fnOrderColumns( a );
        -
        -		return this;
        -	},
        -
        -	/**
        -	 * `Deprecated` - Get the current order of the columns, as an array.
        -	 *  @return {array} Array of column identifiers
        -	 *  @deprecated `fnOrder` should be used in preference to this method.
        -	 *      `fnOrder` acts as a getter/setter.
        -	 */
        -	"fnGetCurrentOrder": function ()
        -	{
        -		return this.fnOrder();
        -	},
        -
        -	/**
        -	 * Get the current order of the columns, as an array. Note that the values
        -	 * given in the array are unique identifiers for each column. Currently
        -	 * these are the original ordering of the columns that was detected on
        -	 * start up, but this could potentially change in future.
        -	 *  @return {array} Array of column identifiers
        -	 *
        -	 *  @example
        -	 *    // Get column ordering for the table
        -	 *    var order = $.fn.dataTable.ColReorder( dataTable ).fnOrder();
        -	 *//**
        -	 * Set the order of the columns, from the positions identified in the
        -	 * ordering array given. Note that ColReorder takes a brute force approach
        -	 * to reordering, so it is possible multiple reordering events will occur
        -	 * before the final order is settled upon.
        -	 *  @param {array} [set] Array of column identifiers in the new order. Note
        -	 *    that every column must be included, uniquely, in this array.
        -	 *  @return {this} Returns `this` for chaining.
        -	 *
        -	 *  @example
        -	 *    // Swap the first and second columns
        -	 *    $.fn.dataTable.ColReorder( dataTable ).fnOrder( [1, 0, 2, 3, 4] );
        -	 *
        -	 *  @example
        -	 *    // Move the first column to the end for the table `#example`
        -	 *    var curr = $.fn.dataTable.ColReorder( '#example' ).fnOrder();
        -	 *    var first = curr.shift();
        -	 *    curr.push( first );
        -	 *    $.fn.dataTable.ColReorder( '#example' ).fnOrder( curr );
        -	 *
        -	 *  @example
        -	 *    // Reverse the table's order
        -	 *    $.fn.dataTable.ColReorder( '#example' ).fnOrder(
        -	 *      $.fn.dataTable.ColReorder( '#example' ).fnOrder().reverse()
        -	 *    );
        -	 */
        -	"fnOrder": function ( set )
        -	{
        -		if ( set === undefined )
        -		{
        -			var a = [];
        -			for ( var i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ )
        -			{
        -				a.push( this.s.dt.aoColumns[i]._ColReorder_iOrigCol );
        -			}
        -			return a;
        -		}
        -
        -		this._fnOrderColumns( fnInvertKeyValues( set ) );
        -
        -		return this;
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods (they are of course public in JS, but recommended as private)
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Constructor logic
        -	 *  @method  _fnConstruct
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnConstruct": function ()
        -	{
        -		var that = this;
        -		var iLen = this.s.dt.aoColumns.length;
        -		var i;
        -
        -		/* Columns discounted from reordering - counting left to right */
        -		if ( this.s.init.iFixedColumns )
        -		{
        -			this.s.fixed = this.s.init.iFixedColumns;
        -		}
        -
        -		/* Columns discounted from reordering - counting right to left */
        -		this.s.fixedRight = this.s.init.iFixedColumnsRight ?
        -			this.s.init.iFixedColumnsRight :
        -			0;
        -
        -		/* Drop callback initialisation option */
        -		if ( this.s.init.fnReorderCallback )
        -		{
        -			this.s.reorderCallback = this.s.init.fnReorderCallback;
        -		}
        -
        -		/* Add event handlers for the drag and drop, and also mark the original column order */
        -		for ( i = 0; i < iLen; i++ )
        -		{
        -			if ( i > this.s.fixed-1 && i < iLen - this.s.fixedRight )
        -			{
        -				this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh );
        -			}
        -
        -			/* Mark the original column order for later reference */
        -			this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i;
        -		}
        -
        -		/* State saving */
        -		this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) {
        -			that._fnStateSave.call( that, oData );
        -		}, "ColReorder_State" );
        -
        -		/* An initial column order has been specified */
        -		var aiOrder = null;
        -		if ( this.s.init.aiOrder )
        -		{
        -			aiOrder = this.s.init.aiOrder.slice();
        -		}
        -
        -		/* State loading, overrides the column order given */
        -		if ( this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' &&
        -		  this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length )
        -		{
        -			aiOrder = this.s.dt.oLoadedState.ColReorder;
        -		}
        -
        -		/* If we have an order to apply - do so */
        -		if ( aiOrder )
        -		{
        -			/* We might be called during or after the DataTables initialisation. If before, then we need
        -			 * to wait until the draw is done, if after, then do what we need to do right away
        -			 */
        -			if ( !that.s.dt._bInitComplete )
        -			{
        -				var bDone = false;
        -				this.s.dt.aoDrawCallback.push( {
        -					"fn": function () {
        -						if ( !that.s.dt._bInitComplete && !bDone )
        -						{
        -							bDone = true;
        -							var resort = fnInvertKeyValues( aiOrder );
        -							that._fnOrderColumns.call( that, resort );
        -						}
        -					},
        -					"sName": "ColReorder_Pre"
        -				} );
        -			}
        -			else
        -			{
        -				var resort = fnInvertKeyValues( aiOrder );
        -				that._fnOrderColumns.call( that, resort );
        -			}
        -		}
        -		else {
        -			this._fnSetColumnIndexes();
        -		}
        -	},
        -
        -
        -	/**
        -	 * Set the column order from an array
        -	 *  @method  _fnOrderColumns
        -	 *  @param   array a An array of integers which dictate the column order that should be applied
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnOrderColumns": function ( a )
        -	{
        -		if ( a.length != this.s.dt.aoColumns.length )
        -		{
        -			this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+
        -				"match known number of columns. Skipping." );
        -			return;
        -		}
        -
        -		for ( var i=0, iLen=a.length ; i<iLen ; i++ )
        -		{
        -			var currIndex = $.inArray( i, a );
        -			if ( i != currIndex )
        -			{
        -				/* Reorder our switching array */
        -				fnArraySwitch( a, currIndex, i );
        -
        -				/* Do the column reorder in the table */
        -				this.s.dt.oInstance.fnColReorder( currIndex, i );
        -			}
        -		}
        -
        -		/* When scrolling we need to recalculate the column sizes to allow for the shift */
        -		if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" )
        -		{
        -			this.s.dt.oInstance.fnAdjustColumnSizing( false );
        -		}
        -
        -		/* Save the state */
        -		this.s.dt.oInstance.oApi._fnSaveState( this.s.dt );
        -
        -		this._fnSetColumnIndexes();
        -		
        -		if ( this.s.reorderCallback !== null )
        -		{
        -			this.s.reorderCallback.call( this );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Because we change the indexes of columns in the table, relative to their starting point
        -	 * we need to reorder the state columns to what they are at the starting point so we can
        -	 * then rearrange them again on state load!
        -	 *  @method  _fnStateSave
        -	 *  @param   object oState DataTables state
        -	 *  @returns string JSON encoded cookie string for DataTables
        -	 *  @private
        -	 */
        -	"_fnStateSave": function ( oState )
        -	{
        -		var i, iLen, aCopy, iOrigColumn;
        -		var oSettings = this.s.dt;
        -		var columns = oSettings.aoColumns;
        -
        -		oState.ColReorder = [];
        -
        -		/* Sorting */
        -		if ( oState.aaSorting ) {
        -			// 1.10.0-
        -			for ( i=0 ; i<oState.aaSorting.length ; i++ ) {
        -				oState.aaSorting[i][0] = columns[ oState.aaSorting[i][0] ]._ColReorder_iOrigCol;
        -			}
        -
        -			var aSearchCopy = $.extend( true, [], oState.aoSearchCols );
        -
        -			for ( i=0, iLen=columns.length ; i<iLen ; i++ )
        -			{
        -				iOrigColumn = columns[i]._ColReorder_iOrigCol;
        -
        -				/* Column filter */
        -				oState.aoSearchCols[ iOrigColumn ] = aSearchCopy[i];
        -
        -				/* Visibility */
        -				oState.abVisCols[ iOrigColumn ] = columns[i].bVisible;
        -
        -				/* Column reordering */
        -				oState.ColReorder.push( iOrigColumn );
        -			}
        -		}
        -		else if ( oState.order ) {
        -			// 1.10.1+
        -			for ( i=0 ; i<oState.order.length ; i++ ) {
        -				oState.order[i][0] = columns[ oState.order[i][0] ]._ColReorder_iOrigCol;
        -			}
        -
        -			var stateColumnsCopy = $.extend( true, [], oState.columns );
        -
        -			for ( i=0, iLen=columns.length ; i<iLen ; i++ )
        -			{
        -				iOrigColumn = columns[i]._ColReorder_iOrigCol;
        -
        -				/* Columns */
        -				oState.columns[ iOrigColumn ] = stateColumnsCopy[i];
        -
        -				/* Column reordering */
        -				oState.ColReorder.push( iOrigColumn );
        -			}
        -		}
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Mouse drop and drag
        -	 */
        -
        -	/**
        -	 * Add a mouse down listener to a particluar TH element
        -	 *  @method  _fnMouseListener
        -	 *  @param   int i Column index
        -	 *  @param   element nTh TH element clicked on
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnMouseListener": function ( i, nTh )
        -	{
        -		var that = this;
        -		$(nTh).on( 'mousedown.ColReorder', function (e) {
        -			e.preventDefault();
        -			that._fnMouseDown.call( that, e, nTh );
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Mouse down on a TH element in the table header
        -	 *  @method  _fnMouseDown
        -	 *  @param   event e Mouse event
        -	 *  @param   element nTh TH element to be dragged
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnMouseDown": function ( e, nTh )
        -	{
        -		var that = this;
        -
        -		/* Store information about the mouse position */
        -		var target = $(e.target).closest('th, td');
        -		var offset = target.offset();
        -		var idx = parseInt( $(nTh).attr('data-column-index'), 10 );
        -
        -		if ( idx === undefined ) {
        -			return;
        -		}
        -
        -		this.s.mouse.startX = e.pageX;
        -		this.s.mouse.startY = e.pageY;
        -		this.s.mouse.offsetX = e.pageX - offset.left;
        -		this.s.mouse.offsetY = e.pageY - offset.top;
        -		this.s.mouse.target = this.s.dt.aoColumns[ idx ].nTh;//target[0];
        -		this.s.mouse.targetIndex = idx;
        -		this.s.mouse.fromIndex = idx;
        -
        -		this._fnRegions();
        -
        -		/* Add event handlers to the document */
        -		$(document)
        -			.on( 'mousemove.ColReorder', function (e) {
        -				that._fnMouseMove.call( that, e );
        -			} )
        -			.on( 'mouseup.ColReorder', function (e) {
        -				that._fnMouseUp.call( that, e );
        -			} );
        -	},
        -
        -
        -	/**
        -	 * Deal with a mouse move event while dragging a node
        -	 *  @method  _fnMouseMove
        -	 *  @param   event e Mouse event
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnMouseMove": function ( e )
        -	{
        -		var that = this;
        -
        -		if ( this.dom.drag === null )
        -		{
        -			/* Only create the drag element if the mouse has moved a specific distance from the start
        -			 * point - this allows the user to make small mouse movements when sorting and not have a
        -			 * possibly confusing drag element showing up
        -			 */
        -			if ( Math.pow(
        -				Math.pow(e.pageX - this.s.mouse.startX, 2) +
        -				Math.pow(e.pageY - this.s.mouse.startY, 2), 0.5 ) < 5 )
        -			{
        -				return;
        -			}
        -			this._fnCreateDragNode();
        -		}
        -
        -		/* Position the element - we respect where in the element the click occured */
        -		this.dom.drag.css( {
        -			left: e.pageX - this.s.mouse.offsetX,
        -			top: e.pageY - this.s.mouse.offsetY
        -		} );
        -
        -		/* Based on the current mouse position, calculate where the insert should go */
        -		var bSet = false;
        -		var lastToIndex = this.s.mouse.toIndex;
        -
        -		for ( var i=1, iLen=this.s.aoTargets.length ; i<iLen ; i++ )
        -		{
        -			if ( e.pageX < this.s.aoTargets[i-1].x + ((this.s.aoTargets[i].x-this.s.aoTargets[i-1].x)/2) )
        -			{
        -				this.dom.pointer.css( 'left', this.s.aoTargets[i-1].x );
        -				this.s.mouse.toIndex = this.s.aoTargets[i-1].to;
        -				bSet = true;
        -				break;
        -			}
        -		}
        -
        -		// The insert element wasn't positioned in the array (less than
        -		// operator), so we put it at the end
        -		if ( !bSet )
        -		{
        -			this.dom.pointer.css( 'left', this.s.aoTargets[this.s.aoTargets.length-1].x );
        -			this.s.mouse.toIndex = this.s.aoTargets[this.s.aoTargets.length-1].to;
        -		}
        -
        -		// Perform reordering if realtime updating is on and the column has moved
        -		if ( this.s.init.bRealtime && lastToIndex !== this.s.mouse.toIndex ) {
        -			this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex );
        -			this.s.mouse.fromIndex = this.s.mouse.toIndex;
        -			this._fnRegions();
        -		}
        -	},
        -
        -
        -	/**
        -	 * Finish off the mouse drag and insert the column where needed
        -	 *  @method  _fnMouseUp
        -	 *  @param   event e Mouse event
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnMouseUp": function ( e )
        -	{
        -		var that = this;
        -
        -		$(document).off( 'mousemove.ColReorder mouseup.ColReorder' );
        -
        -		if ( this.dom.drag !== null )
        -		{
        -			/* Remove the guide elements */
        -			this.dom.drag.remove();
        -			this.dom.pointer.remove();
        -			this.dom.drag = null;
        -			this.dom.pointer = null;
        -
        -			/* Actually do the reorder */
        -			this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex );
        -			this._fnSetColumnIndexes();
        -
        -			/* When scrolling we need to recalculate the column sizes to allow for the shift */
        -			if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" )
        -			{
        -				this.s.dt.oInstance.fnAdjustColumnSizing( false );
        -			}
        -
        -			/* Save the state */
        -			this.s.dt.oInstance.oApi._fnSaveState( this.s.dt );
        -
        -			if ( this.s.reorderCallback !== null )
        -			{
        -				this.s.reorderCallback.call( this );
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Calculate a cached array with the points of the column inserts, and the
        -	 * 'to' points
        -	 *  @method  _fnRegions
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnRegions": function ()
        -	{
        -		var aoColumns = this.s.dt.aoColumns;
        -
        -		this.s.aoTargets.splice( 0, this.s.aoTargets.length );
        -
        -		this.s.aoTargets.push( {
        -			"x":  $(this.s.dt.nTable).offset().left,
        -			"to": 0
        -		} );
        -
        -		var iToPoint = 0;
        -		for ( var i=0, iLen=aoColumns.length ; i<iLen ; i++ )
        -		{
        -			/* For the column / header in question, we want it's position to remain the same if the
        -			 * position is just to it's immediate left or right, so we only incremement the counter for
        -			 * other columns
        -			 */
        -			if ( i != this.s.mouse.fromIndex )
        -			{
        -				iToPoint++;
        -			}
        -
        -			if ( aoColumns[i].bVisible )
        -			{
        -				this.s.aoTargets.push( {
        -					"x":  $(aoColumns[i].nTh).offset().left + $(aoColumns[i].nTh).outerWidth(),
        -					"to": iToPoint
        -				} );
        -			}
        -		}
        -
        -		/* Disallow columns for being reordered by drag and drop, counting right to left */
        -		if ( this.s.fixedRight !== 0 )
        -		{
        -			this.s.aoTargets.splice( this.s.aoTargets.length - this.s.fixedRight );
        -		}
        -
        -		/* Disallow columns for being reordered by drag and drop, counting left to right */
        -		if ( this.s.fixed !== 0 )
        -		{
        -			this.s.aoTargets.splice( 0, this.s.fixed );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Copy the TH element that is being drags so the user has the idea that they are actually
        -	 * moving it around the page.
        -	 *  @method  _fnCreateDragNode
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnCreateDragNode": function ()
        -	{
        -		var scrolling = this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "";
        -
        -		var origCell = this.s.dt.aoColumns[ this.s.mouse.targetIndex ].nTh;
        -		var origTr = origCell.parentNode;
        -		var origThead = origTr.parentNode;
        -		var origTable = origThead.parentNode;
        -		var cloneCell = $(origCell).clone();
        -
        -		// This is a slightly odd combination of jQuery and DOM, but it is the
        -		// fastest and least resource intensive way I could think of cloning
        -		// the table with just a single header cell in it.
        -		this.dom.drag = $(origTable.cloneNode(false))
        -			.addClass( 'DTCR_clonedTable' )
        -			.append(
        -				$(origThead.cloneNode(false)).append(
        -					$(origTr.cloneNode(false)).append(
        -						cloneCell[0]
        -					)
        -				)
        -			)
        -			.css( {
        -				position: 'absolute',
        -				top: 0,
        -				left: 0,
        -				width: $(origCell).outerWidth(),
        -				height: $(origCell).outerHeight()
        -			} )
        -			.appendTo( 'body' );
        -
        -		this.dom.pointer = $('<div></div>')
        -			.addClass( 'DTCR_pointer' )
        -			.css( {
        -				position: 'absolute',
        -				top: scrolling ?
        -					$('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top :
        -					$(this.s.dt.nTable).offset().top,
        -				height : scrolling ?
        -					$('div.dataTables_scroll', this.s.dt.nTableWrapper).height() :
        -					$(this.s.dt.nTable).height()
        -			} )
        -			.appendTo( 'body' );
        -	},
        -
        -	/**
        -	 * Clean up ColReorder memory references and event handlers
        -	 *  @method  _fnDestroy
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnDestroy": function ()
        -	{
        -		var i, iLen;
        -
        -		for ( i=0, iLen=this.s.dt.aoDrawCallback.length ; i<iLen ; i++ )
        -		{
        -			if ( this.s.dt.aoDrawCallback[i].sName === 'ColReorder_Pre' )
        -			{
        -				this.s.dt.aoDrawCallback.splice( i, 1 );
        -				break;
        -			}
        -		}
        -
        -		$(this.s.dt.nTHead).find( '*' ).off( '.ColReorder' );
        -
        -		$.each( this.s.dt.aoColumns, function (i, column) {
        -			$(column.nTh).removeAttr('data-column-index');
        -		} );
        -
        -		this.s.dt._colReorder = null;
        -		this.s = null;
        -	},
        -
        -
        -	/**
        -	 * Add a data attribute to the column headers, so we know the index of
        -	 * the row to be reordered. This allows fast detection of the index, and
        -	 * for this plug-in to work with FixedHeader which clones the nodes.
        -	 *  @private
        -	 */
        -	"_fnSetColumnIndexes": function ()
        -	{
        -		$.each( this.s.dt.aoColumns, function (i, column) {
        -			$(column.nTh).attr('data-column-index', i);
        -		} );
        -	}
        -};
        -
        -
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Static parameters
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -
        -/**
        - * ColReorder default settings for initialisation
        - *  @namespace
        - *  @static
        - */
        -ColReorder.defaults = {
        -	/**
        -	 * Predefined ordering for the columns that will be applied automatically
        -	 * on initialisation. If not specified then the order that the columns are
        -	 * found to be in the HTML is the order used.
        -	 *  @type array
        -	 *  @default null
        -	 *  @static
        -	 *  @example
        -	 *      // Using the `oColReorder` option in the DataTables options object
        -	 *      $('#example').dataTable( {
        -	 *          "sDom": 'Rlfrtip',
        -	 *          "oColReorder": {
        -	 *              "aiOrder": [ 4, 3, 2, 1, 0 ]
        -	 *          }
        -	 *      } );
        -	 *
        -	 *  @example
        -	 *      // Using `new` constructor
        -	 *      $('#example').dataTable()
        -	 *
        -	 *      new $.fn.dataTable.ColReorder( '#example', {
        -	 *          "aiOrder": [ 4, 3, 2, 1, 0 ]
        -	 *      } );
        -	 */
        -	aiOrder: null,
        -
        -	/**
        -	 * Redraw the table's column ordering as the end user draws the column
        -	 * (`true`) or wait until the mouse is released (`false` - default). Note
        -	 * that this will perform a redraw on each reordering, which involves an
        -	 * Ajax request each time if you are using server-side processing in
        -	 * DataTables.
        -	 *  @type boolean
        -	 *  @default false
        -	 *  @static
        -	 *  @example
        -	 *      // Using the `oColReorder` option in the DataTables options object
        -	 *      $('#example').dataTable( {
        -	 *          "sDom": 'Rlfrtip',
        -	 *          "oColReorder": {
        -	 *              "bRealtime": true
        -	 *          }
        -	 *      } );
        -	 *
        -	 *  @example
        -	 *      // Using `new` constructor
        -	 *      $('#example').dataTable()
        -	 *
        -	 *      new $.fn.dataTable.ColReorder( '#example', {
        -	 *          "bRealtime": true
        -	 *      } );
        -	 */
        -	bRealtime: false,
        -
        -	/**
        -	 * Indicate how many columns should be fixed in position (counting from the
        -	 * left). This will typically be 1 if used, but can be as high as you like.
        -	 *  @type int
        -	 *  @default 0
        -	 *  @static
        -	 *  @example
        -	 *      // Using the `oColReorder` option in the DataTables options object
        -	 *      $('#example').dataTable( {
        -	 *          "sDom": 'Rlfrtip',
        -	 *          "oColReorder": {
        -	 *              "iFixedColumns": 1
        -	 *          }
        -	 *      } );
        -	 *
        -	 *  @example
        -	 *      // Using `new` constructor
        -	 *      $('#example').dataTable()
        -	 *
        -	 *      new $.fn.dataTable.ColReorder( '#example', {
        -	 *          "iFixedColumns": 1
        -	 *      } );
        -	 */
        -	iFixedColumns: 0,
        -
        -	/**
        -	 * As `iFixedColumnsRight` but counting from the right.
        -	 *  @type int
        -	 *  @default 0
        -	 *  @static
        -	 *  @example
        -	 *      // Using the `oColReorder` option in the DataTables options object
        -	 *      $('#example').dataTable( {
        -	 *          "sDom": 'Rlfrtip',
        -	 *          "oColReorder": {
        -	 *              "iFixedColumnsRight": 1
        -	 *          }
        -	 *      } );
        -	 *
        -	 *  @example
        -	 *      // Using `new` constructor
        -	 *      $('#example').dataTable()
        -	 *
        -	 *      new $.fn.dataTable.ColReorder( '#example', {
        -	 *          "iFixedColumnsRight": 1
        -	 *      } );
        -	 */
        -	iFixedColumnsRight: 0,
        -
        -	/**
        -	 * Callback function that is fired when columns are reordered
        -	 *  @type function():void
        -	 *  @default null
        -	 *  @static
        -	 *  @example
        -	 *      // Using the `oColReorder` option in the DataTables options object
        -	 *      $('#example').dataTable( {
        -	 *          "sDom": 'Rlfrtip',
        -	 *          "oColReorder": {
        -	 *              "fnReorderCallback": function () {
        -	 *                  alert( 'Columns reordered' );
        -	 *              }
        -	 *          }
        -	 *      } );
        -	 *
        -	 *  @example
        -	 *      // Using `new` constructor
        -	 *      $('#example').dataTable()
        -	 *
        -	 *      new $.fn.dataTable.ColReorder( '#example', {
        -	 *          "fnReorderCallback": function () {
        -	 *              alert( 'Columns reordered' );
        -	 *          }
        -	 *      } );
        -	 */
        -	fnReorderCallback: null
        -};
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Constants
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * ColReorder version
        - *  @constant  version
        - *  @type      String
        - *  @default   As code
        - */
        -ColReorder.version = "1.1.3";
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * DataTables interfaces
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -// Expose
        -$.fn.dataTable.ColReorder = ColReorder;
        -$.fn.DataTable.ColReorder = ColReorder;
        -
        -
        -// Register a new feature with DataTables
        -if ( typeof $.fn.dataTable == "function" &&
        -     typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
        -     $.fn.dataTableExt.fnVersionCheck('1.9.3') )
        -{
        -	$.fn.dataTableExt.aoFeatures.push( {
        -		"fnInit": function( settings ) {
        -			var table = settings.oInstance;
        -
        -			if ( ! settings._colReorder ) {
        -				var dtInit = settings.oInit;
        -				var opts = dtInit.colReorder || dtInit.oColReorder || {};
        -
        -				new ColReorder( settings, opts );
        -			}
        -			else {
        -				table.oApi._fnLog( settings, 1, "ColReorder attempted to initialise twice. Ignoring second" );
        -			}
        -
        -			return null; /* No node for DataTables to insert */
        -		},
        -		"cFeature": "R",
        -		"sFeature": "ColReorder"
        -	} );
        -}
        -else {
        -	alert( "Warning: ColReorder requires DataTables 1.9.3 or greater - www.datatables.net/download");
        -}
        -
        -
        -// API augmentation
        -if ( $.fn.dataTable.Api ) {
        -	$.fn.dataTable.Api.register( 'colReorder.reset()', function () {
        -		return this.iterator( 'table', function ( ctx ) {
        -			ctx._colReorder.fnReset();
        -		} );
        -	} );
        -
        -	$.fn.dataTable.Api.register( 'colReorder.order()', function ( set ) {
        -		if ( set ) {
        -			return this.iterator( 'table', function ( ctx ) {
        -				ctx._colReorder.fnOrder( set );
        -			} );
        -		}
        -
        -		return this.context.length ?
        -			this.context[0]._colReorder.fnOrder() :
        -			null;
        -	} );
        -}
        -
        -return ColReorder;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.ColReorder ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.min.js b/resources/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.min.js
        deleted file mode 100755
        index b8758c96d8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.min.js
        +++ /dev/null
        @@ -1,26 +0,0 @@
        -/*!
        - ColReorder 1.1.3
        - ©2010-2014 SpryMedia Ltd - datatables.net/license
        -*/
        -(function(o,r,s){function p(d){for(var f=[],a=0,b=d.length;a<b;a++)f[d[a]]=a;return f}function l(d,f,a){f=d.splice(f,1)[0];d.splice(a,0,f)}function q(d,f,a){for(var b=[],e=0,h=d.childNodes.length;e<h;e++)1==d.childNodes[e].nodeType&&b.push(d.childNodes[e]);f=b[f];null!==a?d.insertBefore(f,b[a]):d.appendChild(f)}o=function(d){d.fn.dataTableExt.oApi.fnColReorder=function(a,b,e){var h=d.fn.dataTable.Api?!0:!1,c,g,f,m,n=a.aoColumns.length,i,j;i=function(a,b,c){if(a[b]){var e=a[b].split("."),d=e.shift();
        -isNaN(1*d)||(a[b]=c[1*d]+"."+e.join("."))}};if(b!=e)if(0>b||b>=n)this.oApi._fnLog(a,1,"ColReorder 'from' index is out of bounds: "+b);else if(0>e||e>=n)this.oApi._fnLog(a,1,"ColReorder 'to' index is out of bounds: "+e);else{f=[];c=0;for(g=n;c<g;c++)f[c]=c;l(f,b,e);var k=p(f);c=0;for(g=a.aaSorting.length;c<g;c++)a.aaSorting[c][0]=k[a.aaSorting[c][0]];if(null!==a.aaSortingFixed){c=0;for(g=a.aaSortingFixed.length;c<g;c++)a.aaSortingFixed[c][0]=k[a.aaSortingFixed[c][0]]}c=0;for(g=n;c<g;c++){j=a.aoColumns[c];
        -f=0;for(m=j.aDataSort.length;f<m;f++)j.aDataSort[f]=k[j.aDataSort[f]];h&&(j.idx=k[j.idx])}h&&d.each(a.aLastSort,function(b,c){a.aLastSort[b].src=k[c.src]});c=0;for(g=n;c<g;c++)j=a.aoColumns[c],"number"==typeof j.mData?(j.mData=k[j.mData],a.oApi._fnColumnOptions(a,c,{})):d.isPlainObject(j.mData)&&(i(j.mData,"_",k),i(j.mData,"filter",k),i(j.mData,"sort",k),i(j.mData,"type",k),a.oApi._fnColumnOptions(a,c,{}));if(a.aoColumns[b].bVisible){f=this.oApi._fnColumnIndexToVisible(a,b);m=null;for(c=e<b?e:e+1;null===
        -m&&c<n;)m=this.oApi._fnColumnIndexToVisible(a,c),c++;i=a.nTHead.getElementsByTagName("tr");c=0;for(g=i.length;c<g;c++)q(i[c],f,m);if(null!==a.nTFoot){i=a.nTFoot.getElementsByTagName("tr");c=0;for(g=i.length;c<g;c++)q(i[c],f,m)}c=0;for(g=a.aoData.length;c<g;c++)null!==a.aoData[c].nTr&&q(a.aoData[c].nTr,f,m)}l(a.aoColumns,b,e);l(a.aoPreSearchCols,b,e);c=0;for(g=a.aoData.length;c<g;c++)i=a.aoData[c],h?(i.anCells&&l(i.anCells,b,e),"dom"!==i.src&&d.isArray(i._aData)&&l(i._aData,b,e)):(d.isArray(i._aData)&&
        -l(i._aData,b,e),l(i._anHidden,b,e));c=0;for(g=a.aoHeader.length;c<g;c++)l(a.aoHeader[c],b,e);if(null!==a.aoFooter){c=0;for(g=a.aoFooter.length;c<g;c++)l(a.aoFooter[c],b,e)}h&&(new d.fn.dataTable.Api(a)).rows().invalidate();c=0;for(g=n;c<g;c++)d(a.aoColumns[c].nTh).off("click.DT"),this.oApi._fnSortAttachListener(a,a.aoColumns[c].nTh,c);d(a.oInstance).trigger("column-reorder",[a,{iFrom:b,iTo:e,aiInvertMapping:k}])}};var f=function(a,b){var e;d.fn.dataTable.Api?e=(new d.fn.dataTable.Api(a)).settings()[0]:
        -a.fnSettings?e=a.fnSettings():"string"===typeof a?d.fn.dataTable.fnIsDataTable(d(a)[0])&&(e=d(a).eq(0).dataTable().fnSettings()):a.nodeName&&"table"===a.nodeName.toLowerCase()?d.fn.dataTable.fnIsDataTable(a.nodeName)&&(e=d(a.nodeName).dataTable().fnSettings()):a instanceof jQuery?d.fn.dataTable.fnIsDataTable(a[0])&&(e=a.eq(0).dataTable().fnSettings()):e=a;if(e._colReorder)throw"ColReorder already initialised on table #"+e.nTable.id;var h=d.fn.dataTable.camelToHungarian;h&&(h(f.defaults,f.defaults,
        -!0),h(f.defaults,b||{}));this.s={dt:null,init:d.extend(!0,{},f.defaults,b),fixed:0,fixedRight:0,reorderCallback:null,mouse:{startX:-1,startY:-1,offsetX:-1,offsetY:-1,target:-1,targetIndex:-1,fromIndex:-1},aoTargets:[]};this.dom={drag:null,pointer:null};this.s.dt=e;this.s.dt._colReorder=this;this._fnConstruct();e.oApi._fnCallbackReg(e,"aoDestroyCallback",d.proxy(this._fnDestroy,this),"ColReorder");return this};f.prototype={fnReset:function(){for(var a=[],b=0,e=this.s.dt.aoColumns.length;b<e;b++)a.push(this.s.dt.aoColumns[b]._ColReorder_iOrigCol);
        -this._fnOrderColumns(a);return this},fnGetCurrentOrder:function(){return this.fnOrder()},fnOrder:function(a){if(a===s){for(var a=[],b=0,e=this.s.dt.aoColumns.length;b<e;b++)a.push(this.s.dt.aoColumns[b]._ColReorder_iOrigCol);return a}this._fnOrderColumns(p(a));return this},_fnConstruct:function(){var a=this,b=this.s.dt.aoColumns.length,e;this.s.init.iFixedColumns&&(this.s.fixed=this.s.init.iFixedColumns);this.s.fixedRight=this.s.init.iFixedColumnsRight?this.s.init.iFixedColumnsRight:0;this.s.init.fnReorderCallback&&
        -(this.s.reorderCallback=this.s.init.fnReorderCallback);for(e=0;e<b;e++)e>this.s.fixed-1&&e<b-this.s.fixedRight&&this._fnMouseListener(e,this.s.dt.aoColumns[e].nTh),this.s.dt.aoColumns[e]._ColReorder_iOrigCol=e;this.s.dt.oApi._fnCallbackReg(this.s.dt,"aoStateSaveParams",function(b,c){a._fnStateSave.call(a,c)},"ColReorder_State");var d=null;this.s.init.aiOrder&&(d=this.s.init.aiOrder.slice());this.s.dt.oLoadedState&&("undefined"!=typeof this.s.dt.oLoadedState.ColReorder&&this.s.dt.oLoadedState.ColReorder.length==
        -this.s.dt.aoColumns.length)&&(d=this.s.dt.oLoadedState.ColReorder);if(d)if(a.s.dt._bInitComplete)b=p(d),a._fnOrderColumns.call(a,b);else{var c=!1;this.s.dt.aoDrawCallback.push({fn:function(){if(!a.s.dt._bInitComplete&&!c){c=true;var b=p(d);a._fnOrderColumns.call(a,b)}},sName:"ColReorder_Pre"})}else this._fnSetColumnIndexes()},_fnOrderColumns:function(a){if(a.length!=this.s.dt.aoColumns.length)this.s.dt.oInstance.oApi._fnLog(this.s.dt,1,"ColReorder - array reorder does not match known number of columns. Skipping.");
        -else{for(var b=0,e=a.length;b<e;b++){var h=d.inArray(b,a);b!=h&&(l(a,h,b),this.s.dt.oInstance.fnColReorder(h,b))}(""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY)&&this.s.dt.oInstance.fnAdjustColumnSizing(!1);this.s.dt.oInstance.oApi._fnSaveState(this.s.dt);this._fnSetColumnIndexes();null!==this.s.reorderCallback&&this.s.reorderCallback.call(this)}},_fnStateSave:function(a){var b,e,h,c=this.s.dt.aoColumns;a.ColReorder=[];if(a.aaSorting){for(b=0;b<a.aaSorting.length;b++)a.aaSorting[b][0]=c[a.aaSorting[b][0]]._ColReorder_iOrigCol;
        -var f=d.extend(!0,[],a.aoSearchCols);b=0;for(e=c.length;b<e;b++)h=c[b]._ColReorder_iOrigCol,a.aoSearchCols[h]=f[b],a.abVisCols[h]=c[b].bVisible,a.ColReorder.push(h)}else if(a.order){for(b=0;b<a.order.length;b++)a.order[b][0]=c[a.order[b][0]]._ColReorder_iOrigCol;f=d.extend(!0,[],a.columns);b=0;for(e=c.length;b<e;b++)h=c[b]._ColReorder_iOrigCol,a.columns[h]=f[b],a.ColReorder.push(h)}},_fnMouseListener:function(a,b){var e=this;d(b).on("mousedown.ColReorder",function(a){a.preventDefault();e._fnMouseDown.call(e,
        -a,b)})},_fnMouseDown:function(a,b){var e=this,f=d(a.target).closest("th, td").offset(),c=parseInt(d(b).attr("data-column-index"),10);c!==s&&(this.s.mouse.startX=a.pageX,this.s.mouse.startY=a.pageY,this.s.mouse.offsetX=a.pageX-f.left,this.s.mouse.offsetY=a.pageY-f.top,this.s.mouse.target=this.s.dt.aoColumns[c].nTh,this.s.mouse.targetIndex=c,this.s.mouse.fromIndex=c,this._fnRegions(),d(r).on("mousemove.ColReorder",function(a){e._fnMouseMove.call(e,a)}).on("mouseup.ColReorder",function(a){e._fnMouseUp.call(e,
        -a)}))},_fnMouseMove:function(a){if(null===this.dom.drag){if(5>Math.pow(Math.pow(a.pageX-this.s.mouse.startX,2)+Math.pow(a.pageY-this.s.mouse.startY,2),0.5))return;this._fnCreateDragNode()}this.dom.drag.css({left:a.pageX-this.s.mouse.offsetX,top:a.pageY-this.s.mouse.offsetY});for(var b=!1,e=this.s.mouse.toIndex,d=1,c=this.s.aoTargets.length;d<c;d++)if(a.pageX<this.s.aoTargets[d-1].x+(this.s.aoTargets[d].x-this.s.aoTargets[d-1].x)/2){this.dom.pointer.css("left",this.s.aoTargets[d-1].x);this.s.mouse.toIndex=
        -this.s.aoTargets[d-1].to;b=!0;break}b||(this.dom.pointer.css("left",this.s.aoTargets[this.s.aoTargets.length-1].x),this.s.mouse.toIndex=this.s.aoTargets[this.s.aoTargets.length-1].to);this.s.init.bRealtime&&e!==this.s.mouse.toIndex&&(this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex,this.s.mouse.toIndex),this.s.mouse.fromIndex=this.s.mouse.toIndex,this._fnRegions())},_fnMouseUp:function(){d(r).off("mousemove.ColReorder mouseup.ColReorder");null!==this.dom.drag&&(this.dom.drag.remove(),this.dom.pointer.remove(),
        -this.dom.drag=null,this.dom.pointer=null,this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex,this.s.mouse.toIndex),this._fnSetColumnIndexes(),(""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY)&&this.s.dt.oInstance.fnAdjustColumnSizing(!1),this.s.dt.oInstance.oApi._fnSaveState(this.s.dt),null!==this.s.reorderCallback&&this.s.reorderCallback.call(this))},_fnRegions:function(){var a=this.s.dt.aoColumns;this.s.aoTargets.splice(0,this.s.aoTargets.length);this.s.aoTargets.push({x:d(this.s.dt.nTable).offset().left,
        -to:0});for(var b=0,e=0,f=a.length;e<f;e++)e!=this.s.mouse.fromIndex&&b++,a[e].bVisible&&this.s.aoTargets.push({x:d(a[e].nTh).offset().left+d(a[e].nTh).outerWidth(),to:b});0!==this.s.fixedRight&&this.s.aoTargets.splice(this.s.aoTargets.length-this.s.fixedRight);0!==this.s.fixed&&this.s.aoTargets.splice(0,this.s.fixed)},_fnCreateDragNode:function(){var a=""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY,b=this.s.dt.aoColumns[this.s.mouse.targetIndex].nTh,e=b.parentNode,f=e.parentNode,c=f.parentNode,
        -g=d(b).clone();this.dom.drag=d(c.cloneNode(!1)).addClass("DTCR_clonedTable").append(d(f.cloneNode(!1)).append(d(e.cloneNode(!1)).append(g[0]))).css({position:"absolute",top:0,left:0,width:d(b).outerWidth(),height:d(b).outerHeight()}).appendTo("body");this.dom.pointer=d("<div></div>").addClass("DTCR_pointer").css({position:"absolute",top:a?d("div.dataTables_scroll",this.s.dt.nTableWrapper).offset().top:d(this.s.dt.nTable).offset().top,height:a?d("div.dataTables_scroll",this.s.dt.nTableWrapper).height():
        -d(this.s.dt.nTable).height()}).appendTo("body")},_fnDestroy:function(){var a,b;a=0;for(b=this.s.dt.aoDrawCallback.length;a<b;a++)if("ColReorder_Pre"===this.s.dt.aoDrawCallback[a].sName){this.s.dt.aoDrawCallback.splice(a,1);break}d(this.s.dt.nTHead).find("*").off(".ColReorder");d.each(this.s.dt.aoColumns,function(a,b){d(b.nTh).removeAttr("data-column-index")});this.s=this.s.dt._colReorder=null},_fnSetColumnIndexes:function(){d.each(this.s.dt.aoColumns,function(a,b){d(b.nTh).attr("data-column-index",
        -a)})}};f.defaults={aiOrder:null,bRealtime:!1,iFixedColumns:0,iFixedColumnsRight:0,fnReorderCallback:null};f.version="1.1.3";d.fn.dataTable.ColReorder=f;d.fn.DataTable.ColReorder=f;"function"==typeof d.fn.dataTable&&"function"==typeof d.fn.dataTableExt.fnVersionCheck&&d.fn.dataTableExt.fnVersionCheck("1.9.3")?d.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInstance;a._colReorder?b.oApi._fnLog(a,1,"ColReorder attempted to initialise twice. Ignoring second"):(b=a.oInit,new f(a,b.colReorder||
        -b.oColReorder||{}));return null},cFeature:"R",sFeature:"ColReorder"}):alert("Warning: ColReorder requires DataTables 1.9.3 or greater - www.datatables.net/download");d.fn.dataTable.Api&&(d.fn.dataTable.Api.register("colReorder.reset()",function(){return this.iterator("table",function(a){a._colReorder.fnReset()})}),d.fn.dataTable.Api.register("colReorder.order()",function(a){return a?this.iterator("table",function(b){b._colReorder.fnOrder(a)}):this.context.length?this.context[0]._colReorder.fnOrder():
        -null}));return f};"function"===typeof define&&define.amd?define(["jquery","datatables"],o):"object"===typeof exports?o(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.ColReorder&&o(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/Readme.md b/resources/assets/js/plugins/datatables/extensions/ColVis/Readme.md
        deleted file mode 100755
        index 62f432d779..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/Readme.md
        +++ /dev/null
        @@ -1,38 +0,0 @@
        -# ColVis
        -
        -ColVis adds a button to the toolbars around DataTables which gives the end user of the table the ability to dynamically change the visibility of the columns in the table:
        -
        -* Dynamically show and hide columns in a table
        -* Very easy integration with DataTables
        -* Ability to exclude columns from being either hidden or shown
        -* Save saving integration with DataTables
        -
        -
        -# Installation
        -
        -To use ColVis, first download DataTables ( http://datatables.net/download ) and place the unzipped ColVis package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -ColVis is initialised using the `C` option that it adds to DataTables' `dom` option. For example:
        -
        -```js
        -$(document).ready( function () {
        -    $('#example').dataTable( {
        -        "dom": 'C<"clear">lfrtip'
        -    } );
        -} );
        -```
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/colvis/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of ColVis and help make it better, please refer to its GitHub repo: https://github.com/DataTables/ColVis
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colVis.css b/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colVis.css
        deleted file mode 100755
        index 51f546de8e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colVis.css
        +++ /dev/null
        @@ -1,185 +0,0 @@
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * ColVis styles
        - */
        -div.ColVis {
        -	float: right;
        -	margin-bottom: 1em;
        -}
        -
        -button.ColVis_Button,
        -ul.ColVis_collection li {
        -	position: relative;
        -	float: left;
        -	margin-right: 3px;
        -	padding: 5px 8px;
        -	border: 1px solid #999;
        -	cursor: pointer;
        -	*cursor: hand;
        -	font-size: 0.88em;
        -	color: black !important;
        -	white-space: nowrap;
        -
        -	-webkit-border-radius: 2px;
        -	   -moz-border-radius: 2px;
        -	    -ms-border-radius: 2px;
        -	     -o-border-radius: 2px;
        -	        border-radius: 2px;
        -
        -	-webkit-box-shadow: 1px 1px 3px #ccc;
        -	   -moz-box-shadow: 1px 1px 3px #ccc;
        -	    -ms-box-shadow: 1px 1px 3px #ccc;
        -	     -o-box-shadow: 1px 1px 3px #ccc;
        -	        box-shadow: 1px 1px 3px #ccc;
        -
        -	/* Generated by http://www.colorzilla.com/gradient-editor/ */
        -	background: #ffffff; /* Old browsers */
        -	background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */
        -}
        -
        -.ColVis_Button:hover,
        -ul.ColVis_collection li:hover {
        -	border: 1px solid #666;
        -	text-decoration: none !important;
        -
        -	-webkit-box-shadow: 1px 1px 3px #999;
        -	   -moz-box-shadow: 1px 1px 3px #999;
        -	    -ms-box-shadow: 1px 1px 3px #999;
        -	     -o-box-shadow: 1px 1px 3px #999;
        -	        box-shadow: 1px 1px 3px #999;
        -
        -	background: #f3f3f3; /* Old browsers */
        -	background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */
        -}
        -
        -button.ColVis_Button {
        -	height: 30px;
        -	padding: 3px 8px;
        -}
        -
        -button.ColVis_Button::-moz-focus-inner { 
        -	border: none !important;
        -	padding: 0;
        -}
        -
        -button.ColVis_Button:active { 
        -	outline: none;
        -}
        -
        -
        -div.ColVis_collectionBackground {
        -	position: fixed;
        -	top: 0;
        -	left: 0;
        -	height: 100%;
        -	width: 100%;
        -	background-color: black;
        -	z-index: 1100;
        -}
        -
        -ul.ColVis_collection {
        -	list-style: none;
        -	width: 150px;
        -	padding: 8px 8px 4px 8px;
        -	margin: 0;
        -	border: 1px solid #ccc;
        -	border: 1px solid rgba( 0, 0, 0, 0.4 );
        -	background-color: #f3f3f3;
        -	background-color: rgba( 255, 255, 255, 0.3 );
        -	overflow: hidden;
        -	z-index: 2002;
        -
        -	-webkit-border-radius: 5px;
        -	   -moz-border-radius: 5px;
        -	    -ms-border-radius: 5px;
        -	     -o-border-radius: 5px;
        -	        border-radius: 5px;
        -	
        -	-webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	   -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	    -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	     -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	        box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -}
        -
        -ul.ColVis_collection li {
        -	position: relative;
        -	height: auto;
        -	left: 0;
        -	right: 0;
        -	padding: 0.5em;
        -
        -	display: block;
        -	float: none;
        -	margin-bottom: 4px;
        -	
        -	-webkit-box-shadow: 1px 1px 3px #999;
        -	   -moz-box-shadow: 1px 1px 3px #999;
        -	    -ms-box-shadow: 1px 1px 3px #999;
        -	     -o-box-shadow: 1px 1px 3px #999;
        -	        box-shadow: 1px 1px 3px #999;
        -}
        -
        -ul.ColVis_collection li {
        -	text-align: left;
        -}
        -
        -ul.ColVis_collection li.ColVis_Button:hover {
        -	border: 1px solid #999;
        -	background-color: #f0f0f0;
        -}
        -
        -ul.ColVis_collection li span {
        -	display: inline-block;
        -	padding-left: 0.5em;
        -	cursor: pointer;
        -}
        -
        -
        -ul.ColVis_collection li.ColVis_Special {
        -	border-color: #555;
        -	background: rgb(237,237,237); /* Old browsers */
        -	background: -webkit-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, rgba(237,237,237,1) 0%, rgba(214,214,214,1) 77%, rgba(232,232,232,1) 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(to bottom, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 ); /* IE6-9 */
        -}
        -
        -ul.ColVis_collection li.ColVis_Special:hover {
        -	background: #e2e2e2; /* Old browsers */
        -	background: -webkit-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 ); /* IE6-9 */
        -}
        -
        -
        -span.ColVis_radio {
        -	display: inline-block;
        -	width: 20px;
        -}
        -
        -div.ColVis_catcher {
        -	position: absolute;
        -	z-index: 1101;
        -}
        -
        -.disabled {
        -	color: #999;
        -}
        -
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colVis.min.css b/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colVis.min.css
        deleted file mode 100755
        index 00ab37d788..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colVis.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -div.ColVis{float:right;margin-bottom:1em}button.ColVis_Button,ul.ColVis_collection li{position:relative;float:left;margin-right:3px;padding:5px 8px;border:1px solid #999;cursor:pointer;*cursor:hand;font-size:0.88em;color:black !important;white-space:nowrap;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;-ms-box-shadow:1px 1px 3px #ccc;-o-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 )}.ColVis_Button:hover,ul.ColVis_collection li:hover{border:1px solid #666;text-decoration:none !important;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background:#f3f3f3;background:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 )}button.ColVis_Button{height:30px;padding:3px 8px}button.ColVis_Button::-moz-focus-inner{border:none !important;padding:0}button.ColVis_Button:active{outline:none}div.ColVis_collectionBackground{position:fixed;top:0;left:0;height:100%;width:100%;background-color:black;z-index:1100}ul.ColVis_collection{list-style:none;width:150px;padding:8px 8px 4px 8px;margin:0;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-moz-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-ms-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-o-box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-shadow:3px 3px 5px rgba(0,0,0,0.3)}ul.ColVis_collection li{position:relative;height:auto;left:0;right:0;padding:0.5em;display:block;float:none;margin-bottom:4px;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999}ul.ColVis_collection li{text-align:left}ul.ColVis_collection li.ColVis_Button:hover{border:1px solid #999;background-color:#f0f0f0}ul.ColVis_collection li span{display:inline-block;padding-left:0.5em;cursor:pointer}ul.ColVis_collection li.ColVis_Special{border-color:#555;background:#ededed;background:-webkit-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-moz-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-ms-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-o-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:linear-gradient(to bottom, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 )}ul.ColVis_collection li.ColVis_Special:hover{background:#e2e2e2;background:-webkit-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-moz-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-ms-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-o-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 )}span.ColVis_radio{display:inline-block;width:20px}div.ColVis_catcher{position:absolute;z-index:1101}.disabled{color:#999}
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colvis.jqueryui.css b/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colvis.jqueryui.css
        deleted file mode 100755
        index 0cdf0baf40..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/css/dataTables.colvis.jqueryui.css
        +++ /dev/null
        @@ -1,41 +0,0 @@
        -
        -button.ColVis_Button,
        -ul.ColVis_collection li {
        -	padding: 0.5em;
        -}
        -
        -ul.ColVis_collection {
        -	margin: 0;
        -	padding: 0;
        -	overflow: hidden;
        -	z-index: 2002;
        -}
        -
        -ul.ColVis_collection li {
        -	clear: both;
        -	display: block;
        -	text-align: left;
        -	margin: -1px 0 0 0;
        -}
        -
        -ul.ColVis_collection li span {
        -	display: inline-block;
        -	padding-left: 0.5em;
        -	cursor: pointer;
        -}
        -
        -div.ColVis_collectionBackground {
        -	position: fixed;
        -	top: 0;
        -	left: 0;
        -	height: 100%;
        -	width: 100%;
        -	background-color: black;
        -	z-index: 1100;
        -}
        -
        -
        -div.ColVis_catcher {
        -	position: absolute;
        -	z-index: 1101;
        -}
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/button_order.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/button_order.html
        deleted file mode 100755
        index 1dffef96ea..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/button_order.html
        +++ /dev/null
        @@ -1,630 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Button ordering</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C<"clear">lfrtip',
        -		colVis: {
        -			order: 'alpha'
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Button ordering</span></h1>
        -
        -			<div class="info">
        -				<p>The list of columns that ColVis displays has two options for the order in which they are displayed. The default mode of operation is to show the buttons in the
        -				same order as they appear in the HTML table, but the second mode of operation is to show the buttons in alphabetical order. This is done by specifying the
        -				<code>order</code> option, set to <code>alpha</code>. Alphabetical button ordering is shown in this example.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		colVis: {
        -			order: 'alpha'
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li class="active"><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/exclude_columns.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/exclude_columns.html
        deleted file mode 100755
        index 2359d122ae..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/exclude_columns.html
        +++ /dev/null
        @@ -1,632 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Exclude columns from list</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C<"clear">lfrtip',
        -		colVis: {
        -			exclude: [ 0 ]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Exclude columns from list</span></h1>
        -
        -			<div class="info">
        -				<p>It can at times be useful to exclude columns from being in the 'show / hide' list (for example if you have hidden information that the end user shouldn't be
        -				able to make visible. This can be done by the <code>exclude</code> ColVis configuration parameter when creating the DataTable. This is simply an array of integers,
        -				indicating which columns should be excluded. This example shows the first column being excluded.</p>
        -
        -				<p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		colVis: {
        -			exclude: [ 0 ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li class="active"><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/group_columns.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/group_columns.html
        deleted file mode 100755
        index 9bf73a7b79..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/group_columns.html
        +++ /dev/null
        @@ -1,656 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Group columns</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C<"clear">lfrtip',
        -		colVis: {
        -			exclude: [],
        -			groups: [
        -				{
        -					title: "Engine",
        -					columns: [ 0, 3 ]
        -				},
        -				{
        -					title: "Client",
        -					columns: [ 1, 2 ]
        -				}
        -			]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Group columns</span></h1>
        -
        -			<div class="info">
        -				<p>It can be useful at times to show and hide multiple columns together - i.e. grouping them together. Groupings are defined by the <code>groups</code> array.
        -				Create a group button by naming it (using the <code>title</code> option) and specifying by index which columns belong to it (using the <code>columns</code>
        -				option).</p>
        -
        -				<p>Note also that this ability to create groups can be used in combination <code>exclude</code> to remove individual columns from the list (should you wish them to
        -				only be used in the groups), or set <code>exclude = [ 'all' ]</code> to show only the grouping buttons (i.e. individual column control buttons will not be
        -				shown).</p>
        -
        -				<p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		colVis: {
        -			exclude: [],
        -			groups: [
        -				{
        -					title: &quot;Engine&quot;,
        -					columns: [ 0, 3 ]
        -				},
        -				{
        -					title: &quot;Client&quot;,
        -					columns: [ 1, 2 ]
        -				}
        -			]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li class="active"><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/index.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/index.html
        deleted file mode 100755
        index 0046c25795..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/index.html
        +++ /dev/null
        @@ -1,72 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>ColVis examples - ColVis examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>ColVis examples</span></h1>
        -
        -			<div class="info">
        -				<p>ColVis adds a button to the toolbars around DataTables which gives the end user of the table the ability to dynamically change the visibility of the columns in
        -				the table:</p>
        -
        -				<ul class="markdown">
        -					<li>Dynamically show and hide columns in a table</li>
        -					<li>Very easy integration with DataTables</li>
        -					<li>Ability to exclude columns from being either hidden or shown</li>
        -					<li>Save saving integration with DataTables</li>
        -				</ul>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/jqueryui.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/jqueryui.html
        deleted file mode 100755
        index 32d176d2d8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/jqueryui.html
        +++ /dev/null
        @@ -1,637 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - jQuery UI styling</title>
        -	<link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
        -	<link rel="stylesheet" type="text/css" href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colvis.jqueryui.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../Plugins/integration/jqueryui/dataTables.jqueryui.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		jQueryUI: true
        -	} );
        -	var colvis = new $.fn.dataTable.ColVis( table );
        -
        -	$( colvis.button() ).insertBefore('div.dataTables_length');
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>jQuery UI styling</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows how the jQuery UI ThemeRoller option in DataTables can be used with ColVis.</p>
        -
        -				<p>The important thing to note here is that it is easier to use <code>new $.fn.dataTable.ColVis()</code> to add ColVis to the table rather than <a href=
        -				"//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> as the jQuery UI integration
        -				uses a complex expression for <a href="//datatables.net/reference/option/dom"><code class="option" title=
        -				"DataTables initialisation option">dom<span>DT</span></code></a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		jQueryUI: true
        -	} );
        -	var colvis = new $.fn.dataTable.ColVis( table );
        -
        -	$( colvis.button() ).insertBefore('div.dataTables_length');
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.js">../../Plugins/integration/jqueryui/dataTables.jqueryui.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css</a></li>
        -						<li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">../../Plugins/integration/jqueryui/dataTables.jqueryui.css</a></li>
        -						<li><a href="../css/dataTables.colvis.jqueryui.css">../css/dataTables.colvis.jqueryui.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li class="active"><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/mouseover.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/mouseover.html
        deleted file mode 100755
        index c3aee004c8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/mouseover.html
        +++ /dev/null
        @@ -1,632 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Mouseover activation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C<"clear">lfrtip',
        -		colVis: {
        -			activate: "mouseover"
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Mouseover activation</span></h1>
        -
        -			<div class="info">
        -				<p>The default activation (showing the columns list) for ColVis is for the user to click the button. This can be altered to a <code>mouseover</code> activation by
        -				making use of the <code>activate</code> initialisation option and setting it to <code class="string" title="String">mouseover</code>. This is shown in the example
        -				below.</p>
        -
        -				<p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		colVis: {
        -			activate: &quot;mouseover&quot;
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li class="active"><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/new_init.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/new_init.html
        deleted file mode 100755
        index 1cfa25c97e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/new_init.html
        +++ /dev/null
        @@ -1,629 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - `new` initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var colvis = new $.fn.dataTable.ColVis( table );
        -
        -	$( colvis.button() ).insertAfter('div.info');
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>`new` initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>As well as providing the option to be initialised through the <code>C</code> option of <a href="//datatables.net/reference/option/dom"><code class="option"
        -				title="DataTables initialisation option">dom<span>DT</span></code></a>, ColVis can also be added to a DataTable using direct initialisation - <code>new
        -				$.fn.dataTable.ColVis();</code> as shown in this example. The ColVis control button it available through its <code>button()</code> method, which can then be used
        -				to attach to the document where you need.</p>
        -
        -				<p>For full information about the ColVis API, please refer to the <a href="//datatables.net/extensions/colvis/api">ColVis API documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var colvis = new $.fn.dataTable.ColVis( table );
        -
        -	$( colvis.button() ).insertAfter('div.info');
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/restore.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/restore.html
        deleted file mode 100755
        index e9a6464026..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/restore.html
        +++ /dev/null
        @@ -1,641 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Restore / show all</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C<"clear">lfrtip',
        -		columnDefs: [
        -			{ visible: false, targets: 2 }
        -		],
        -		colVis: {
        -			restore: "Restore",
        -			showAll: "Show all",
        -			showNone: "Show none"
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Restore / show all</span></h1>
        -
        -			<div class="info">
        -				<p>This demo of ColVis shows its ability to add "Restore", "Show all" and "Show none" buttons to the list of column visibility options. This is done with the
        -				<code>restore</code>, <code>showAll</code> and <code>showNone</code> options which can be enabled individually if needed.</p>
        -
        -				<p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		columnDefs: [
        -			{ visible: false, targets: 2 }
        -		],
        -		colVis: {
        -			restore: &quot;Restore&quot;,
        -			showAll: &quot;Show all&quot;,
        -			showNone: &quot;Show none&quot;
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li class="active"><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/simple.html
        deleted file mode 100755
        index 0772721e74..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/simple.html
        +++ /dev/null
        @@ -1,627 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C<"clear">lfrtip'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>ColVis is a plug-in for DataTables which presents a list of all columns to a user and allows them to select which ones they wish to be visible. Click the 'Show
        -				/ hide columns' button to be presented with a list of columns in the table, and click the buttons to show and hide them as you wish.</p>
        -
        -				<p>ColVis is added to a DataTable by specifying the <code>C</code> option for <a href="//datatables.net/reference/option/dom"><code class="option" title=
        -				"DataTables initialisation option">dom<span>DT</span></code></a>. The example below shows the ColVis button added to the table with a clearing element after
        -				it.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'C&lt;&quot;clear&quot;&gt;lfrtip'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/text.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/text.html
        deleted file mode 100755
        index 7840f74002..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/text.html
        +++ /dev/null
        @@ -1,631 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Custom button text</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		"dom": 'C<"clear">lfrtip',
        -		"colVis": {
        -			"buttonText": "Change columns"
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Custom button text</span></h1>
        -
        -			<div class="info">
        -				<p>You may wish to use your own text in the ColVis button - this is done by making use of the <code>buttonText</code> initialisation option, as shown in this
        -				example.</p>
        -
        -				<p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		&quot;dom&quot;: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		&quot;colVis&quot;: {
        -			&quot;buttonText&quot;: &quot;Change columns&quot;
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li class="active"><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/title_callback.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/title_callback.html
        deleted file mode 100755
        index d20605eafe..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/title_callback.html
        +++ /dev/null
        @@ -1,636 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Column button callback</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		"dom": 'C<"clear">lfrtip',
        -		"colVis": {
        -			"label": function ( index, title, th ) {
        -				return (index+1) +'. '+ title;
        -			}
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Column button callback</span></h1>
        -
        -			<div class="info">
        -				<p>By default ColVis will use the information in the <code class="tag" title="HTML tag">th</code> cell for each column as the button name to use in ColVis, which
        -				might not always be what you want (for example you might has HTML in the cell that you don't want in the button). The <code>label</code> callback provides the
        -				ability to customise the label used for the button.</p>
        -
        -				<p>In this example the column index is prefixed to the column title.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		&quot;dom&quot;: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		&quot;colVis&quot;: {
        -			&quot;label&quot;: function ( index, title, th ) {
        -				return (index+1) +'. '+ title;
        -			}
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li class="active"><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/two_tables.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/two_tables.html
        deleted file mode 100755
        index 3dc0f0acba..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/two_tables.html
        +++ /dev/null
        @@ -1,339 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Two tables with individual controls</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('table.display').DataTable( {
        -		dom: 'C<"clear">lfrtip',
        -		displayLength: 5
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Two tables with individual controls</span></h1>
        -
        -			<div class="info">
        -				<p>It can be useful to have DataTables initialise more than one table with a single call can for them to each have individual ColVis controllers. All this requires
        -				is a suitable jQuery selector to be used, and DataTables and ColVis will take care of the rest - as shown in this example.</p>
        -			</div>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>$183,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>$103,500</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('table.display').DataTable( {
        -		dom: 'C&lt;&quot;clear&quot;&gt;lfrtip',
        -		displayLength: 5
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li class="active"><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/two_tables_identical.html b/resources/assets/js/plugins/datatables/extensions/ColVis/examples/two_tables_identical.html
        deleted file mode 100755
        index 90ffe07883..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/examples/two_tables_identical.html
        +++ /dev/null
        @@ -1,363 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>ColVis example - Two tables with shared controls</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var tables = $('table.display').DataTable( {
        -		displayLength: 5
        -	} );
        -
        -	// When the column visibility changes on the firs table, also change it on
        -	// the others
        -	tables.table(0).on('column-visibility', function ( e, settings, colIdx, visibility ) {
        -		tables.tables(':gt(0)').column( colIdx ).visible( visibility );
        -	} );
        -
        -	// Create ColVis on the first table only
        -	var colvis = new $.fn.dataTable.ColVis( tables.table(0) );
        -	$( colvis.button() ).insertAfter('div.info');
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>ColVis example <span>Two tables with shared controls</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows how the DataTables API can be used with ColVis to use a single ColVis control to effect other tables. This is done by applying ColVis to the
        -				first table and then listening for the <a href="//datatables.net/reference/event/column-visibility"><code class="event" title=
        -				"DataTables event">column-visibility<span>DT</span></code></a> event and updating all other tables when triggered.</p>
        -
        -				<p>This example makes use of the <a href="//datatables.net/reference/api/tables()"><code class="api" title=
        -				"DataTables API method">tables()<span>DT</span></code></a> and <a href="//datatables.net/reference/api/table()"><code class="api" title=
        -				"DataTables API method">table()<span>DT</span></code></a> methods for working with multiple tables, and also initialised ColVis using the <code>new
        -				$.fn.dataTable.ColVis();</code> operator.</p>
        -			</div>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>$183,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>$103,500</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var tables = $('table.display').DataTable( {
        -		displayLength: 5
        -	} );
        -
        -	// When the column visibility changes on the firs table, also change it on
        -	// the others
        -	tables.table(0).on('column-visibility', function ( e, settings, colIdx, visibility ) {
        -		tables.tables(':gt(0)').column( colIdx ).visible( visibility );
        -	} );
        -
        -	// Create ColVis on the first table only
        -	var colvis = new $.fn.dataTable.ColVis( tables.table(0) );
        -	$( colvis.button() ).insertAfter('div.info');
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./new_init.html">`new` initialisation</a></li>
        -							<li><a href="./text.html">Custom button text</a></li>
        -							<li><a href="./exclude_columns.html">Exclude columns from list</a></li>
        -							<li><a href="./title_callback.html">Column button callback</a></li>
        -							<li><a href="./button_order.html">Button ordering</a></li>
        -							<li><a href="./mouseover.html">Mouseover activation</a></li>
        -							<li><a href="./group_columns.html">Group columns</a></li>
        -							<li><a href="./two_tables.html">Two tables with individual controls</a></li>
        -							<li class="active"><a href="./two_tables_identical.html">Two tables with shared controls</a></li>
        -							<li><a href="./restore.html">Restore / show all</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/js/dataTables.colVis.js b/resources/assets/js/plugins/datatables/extensions/ColVis/js/dataTables.colVis.js
        deleted file mode 100755
        index 57a4326a55..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/js/dataTables.colVis.js
        +++ /dev/null
        @@ -1,1123 +0,0 @@
        -/*! ColVis 1.1.2
        - * ©2010-2015 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     ColVis
        - * @description Controls for column visibility in DataTables
        - * @version     1.1.2
        - * @file        dataTables.colReorder.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2010-2015 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -(function(window, document, undefined) {
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -/**
        - * ColVis provides column visibility control for DataTables
        - *
        - * @class ColVis
        - * @constructor
        - * @param {object} DataTables settings object. With DataTables 1.10 this can
        - *   also be and API instance, table node, jQuery collection or jQuery selector.
        - * @param {object} ColVis configuration options
        - */
        -var ColVis = function( oDTSettings, oInit )
        -{
        -	/* Santiy check that we are a new instance */
        -	if ( !this.CLASS || this.CLASS != "ColVis" )
        -	{
        -		alert( "Warning: ColVis must be initialised with the keyword 'new'" );
        -	}
        -
        -	if ( typeof oInit == 'undefined' )
        -	{
        -		oInit = {};
        -	}
        -
        -	var camelToHungarian = $.fn.dataTable.camelToHungarian;
        -	if ( camelToHungarian ) {
        -		camelToHungarian( ColVis.defaults, ColVis.defaults, true );
        -		camelToHungarian( ColVis.defaults, oInit );
        -	}
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public class variables
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * @namespace Settings object which contains customisable information for
        -	 *     ColVis instance. Augmented by ColVis.defaults
        -	 */
        -	this.s = {
        -		/**
        -		 * DataTables settings object
        -		 *  @property dt
        -		 *  @type     Object
        -		 *  @default  null
        -		 */
        -		"dt": null,
        -
        -		/**
        -		 * Customisation object
        -		 *  @property oInit
        -		 *  @type     Object
        -		 *  @default  passed in
        -		 */
        -		"oInit": oInit,
        -
        -		/**
        -		 * Flag to say if the collection is hidden
        -		 *  @property hidden
        -		 *  @type     boolean
        -		 *  @default  true
        -		 */
        -		"hidden": true,
        -
        -		/**
        -		 * Store the original visibility settings so they could be restored
        -		 *  @property abOriginal
        -		 *  @type     Array
        -		 *  @default  []
        -		 */
        -		"abOriginal": []
        -	};
        -
        -
        -	/**
        -	 * @namespace Common and useful DOM elements for the class instance
        -	 */
        -	this.dom = {
        -		/**
        -		 * Wrapper for the button - given back to DataTables as the node to insert
        -		 *  @property wrapper
        -		 *  @type     Node
        -		 *  @default  null
        -		 */
        -		"wrapper": null,
        -
        -		/**
        -		 * Activation button
        -		 *  @property button
        -		 *  @type     Node
        -		 *  @default  null
        -		 */
        -		"button": null,
        -
        -		/**
        -		 * Collection list node
        -		 *  @property collection
        -		 *  @type     Node
        -		 *  @default  null
        -		 */
        -		"collection": null,
        -
        -		/**
        -		 * Background node used for shading the display and event capturing
        -		 *  @property background
        -		 *  @type     Node
        -		 *  @default  null
        -		 */
        -		"background": null,
        -
        -		/**
        -		 * Element to position over the activation button to catch mouse events when using mouseover
        -		 *  @property catcher
        -		 *  @type     Node
        -		 *  @default  null
        -		 */
        -		"catcher": null,
        -
        -		/**
        -		 * List of button elements
        -		 *  @property buttons
        -		 *  @type     Array
        -		 *  @default  []
        -		 */
        -		"buttons": [],
        -
        -		/**
        -		 * List of group button elements
        -		 *  @property groupButtons
        -		 *  @type     Array
        -		 *  @default  []
        -		 */
        -		"groupButtons": [],
        -
        -		/**
        -		 * Restore button
        -		 *  @property restore
        -		 *  @type     Node
        -		 *  @default  null
        -		 */
        -		"restore": null
        -	};
        -
        -	/* Store global reference */
        -	ColVis.aInstances.push( this );
        -
        -	/* Constructor logic */
        -	this.s.dt = $.fn.dataTable.Api ?
        -		new $.fn.dataTable.Api( oDTSettings ).settings()[0] :
        -		oDTSettings;
        -
        -	this._fnConstruct( oInit );
        -	return this;
        -};
        -
        -
        -
        -ColVis.prototype = {
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Get the ColVis instance's control button so it can be injected into the
        -	 * DOM
        -	 *  @method  button
        -	 *  @returns {node} ColVis button
        -	 */
        -	button: function ()
        -	{
        -		return this.dom.wrapper;
        -	},
        -
        -	/**
        -	 * Alias of `rebuild` for backwards compatibility
        -	 *  @method  fnRebuild
        -	 */
        -	"fnRebuild": function ()
        -	{
        -		this.rebuild();
        -	},
        -
        -	/**
        -	 * Rebuild the list of buttons for this instance (i.e. if there is a column
        -	 * header update)
        -	 *  @method  fnRebuild
        -	 */
        -	rebuild: function ()
        -	{
        -		/* Remove the old buttons */
        -		for ( var i=this.dom.buttons.length-1 ; i>=0 ; i-- ) {
        -			this.dom.collection.removeChild( this.dom.buttons[i] );
        -		}
        -		this.dom.buttons.splice( 0, this.dom.buttons.length );
        -		this.dom.groupButtons.splice(0, this.dom.groupButtons.length);
        -
        -		if ( this.dom.restore ) {
        -			this.dom.restore.parentNode( this.dom.restore );
        -		}
        -
        -		/* Re-add them (this is not the optimal way of doing this, it is fast and effective) */
        -		this._fnAddGroups();
        -		this._fnAddButtons();
        -
        -		/* Update the checkboxes */
        -		this._fnDrawCallback();
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods (they are of course public in JS, but recommended as private)
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Constructor logic
        -	 *  @method  _fnConstruct
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnConstruct": function ( init )
        -	{
        -		this._fnApplyCustomisation( init );
        -
        -		var that = this;
        -		var i, iLen;
        -		this.dom.wrapper = document.createElement('div');
        -		this.dom.wrapper.className = "ColVis";
        -
        -		this.dom.button = $( '<button />', {
        -				'class': !this.s.dt.bJUI ?
        -					"ColVis_Button ColVis_MasterButton" :
        -					"ColVis_Button ColVis_MasterButton ui-button ui-state-default"
        -			} )
        -			.append( '<span>'+this.s.buttonText+'</span>' )
        -			.bind( this.s.activate=="mouseover" ? "mouseover" : "click", function (e) {
        -				e.preventDefault();
        -				that._fnCollectionShow();
        -			} )
        -			.appendTo( this.dom.wrapper )[0];
        -
        -		this.dom.catcher = this._fnDomCatcher();
        -		this.dom.collection = this._fnDomCollection();
        -		this.dom.background = this._fnDomBackground();
        -
        -		this._fnAddGroups();
        -		this._fnAddButtons();
        -
        -		/* Store the original visibility information */
        -		for ( i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ )
        -		{
        -			this.s.abOriginal.push( this.s.dt.aoColumns[i].bVisible );
        -		}
        -
        -		/* Update on each draw */
        -		this.s.dt.aoDrawCallback.push( {
        -			"fn": function () {
        -				that._fnDrawCallback.call( that );
        -			},
        -			"sName": "ColVis"
        -		} );
        -
        -		/* If columns are reordered, then we need to update our exclude list and
        -		 * rebuild the displayed list
        -		 */
        -		$(this.s.dt.oInstance).bind( 'column-reorder.dt', function ( e, oSettings, oReorder ) {
        -			for ( i=0, iLen=that.s.aiExclude.length ; i<iLen ; i++ ) {
        -				that.s.aiExclude[i] = oReorder.aiInvertMapping[ that.s.aiExclude[i] ];
        -			}
        -
        -			var mStore = that.s.abOriginal.splice( oReorder.iFrom, 1 )[0];
        -			that.s.abOriginal.splice( oReorder.iTo, 0, mStore );
        -
        -			that.fnRebuild();
        -		} );
        -
        -		$(this.s.dt.oInstance).bind( 'destroy.dt', function () {
        -			$(that.dom.wrapper).remove();
        -		} );
        -
        -		// Set the initial state
        -		this._fnDrawCallback();
        -	},
        -
        -
        -	/**
        -	 * Apply any customisation to the settings from the DataTables initialisation
        -	 *  @method  _fnApplyCustomisation
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnApplyCustomisation": function ( init )
        -	{
        -		$.extend( true, this.s, ColVis.defaults, init );
        -
        -		// Slightly messy overlap for the camelCase notation
        -		if ( ! this.s.showAll && this.s.bShowAll ) {
        -			this.s.showAll = this.s.sShowAll;
        -		}
        -
        -		if ( ! this.s.restore && this.s.bRestore ) {
        -			this.s.restore = this.s.sRestore;
        -		}
        -
        -		// CamelCase to Hungarian for the column groups 
        -		var groups = this.s.groups;
        -		var hungarianGroups = this.s.aoGroups;
        -		if ( groups ) {
        -			for ( var i=0, ien=groups.length ; i<ien ; i++ ) {
        -				if ( groups[i].title ) {
        -					hungarianGroups[i].sTitle = groups[i].title;
        -				}
        -				if ( groups[i].columns ) {
        -					hungarianGroups[i].aiColumns = groups[i].columns;
        -				}
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * On each table draw, check the visibility checkboxes as needed. This allows any process to
        -	 * update the table's column visibility and ColVis will still be accurate.
        -	 *  @method  _fnDrawCallback
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnDrawCallback": function ()
        -	{
        -		var columns = this.s.dt.aoColumns;
        -		var buttons = this.dom.buttons;
        -		var groups = this.s.aoGroups;
        -		var button;
        -
        -		for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
        -			button = buttons[i];
        -
        -			if ( button.__columnIdx !== undefined ) {
        -				$('input', button).prop( 'checked', columns[ button.__columnIdx ].bVisible );
        -			}
        -		}
        -
        -		var allVisible = function ( columnIndeces ) {
        -			for ( var k=0, kLen=columnIndeces.length ; k<kLen ; k++ )
        -			{
        -				if (  columns[columnIndeces[k]].bVisible === false ) { return false; }
        -			}
        -			return true;
        -		};
        -		var allHidden = function ( columnIndeces ) {
        -			for ( var m=0 , mLen=columnIndeces.length ; m<mLen ; m++ )
        -			{
        -				if ( columns[columnIndeces[m]].bVisible === true ) { return false; }
        -			}
        -			return true;
        -		};
        -
        -		for ( var j=0, jLen=groups.length ; j<jLen ; j++ )
        -		{
        -			if ( allVisible(groups[j].aiColumns) )
        -			{
        -				$('input', this.dom.groupButtons[j]).prop('checked', true);
        -				$('input', this.dom.groupButtons[j]).prop('indeterminate', false);
        -			}
        -			else if ( allHidden(groups[j].aiColumns) )
        -			{
        -				$('input', this.dom.groupButtons[j]).prop('checked', false);
        -				$('input', this.dom.groupButtons[j]).prop('indeterminate', false);
        -			}
        -			else
        -			{
        -				$('input', this.dom.groupButtons[j]).prop('indeterminate', true);
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Loop through the groups (provided in the settings) and create a button for each.
        -	 *  @method  _fnAddgroups
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnAddGroups": function ()
        -	{
        -		var nButton;
        -
        -		if ( typeof this.s.aoGroups != 'undefined' )
        -		{
        -			for ( var i=0, iLen=this.s.aoGroups.length ; i<iLen ; i++ )
        -			{
        -				nButton = this._fnDomGroupButton( i );
        -				this.dom.groupButtons.push( nButton );
        -				this.dom.buttons.push( nButton );
        -				this.dom.collection.appendChild( nButton );
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Loop through the columns in the table and as a new button for each one.
        -	 *  @method  _fnAddButtons
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnAddButtons": function ()
        -	{
        -		var
        -			nButton,
        -			columns = this.s.dt.aoColumns;
        -
        -		if ( $.inArray( 'all', this.s.aiExclude ) === -1 ) {
        -			for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
        -			{
        -				if ( $.inArray( i, this.s.aiExclude ) === -1 )
        -				{
        -					nButton = this._fnDomColumnButton( i );
        -					nButton.__columnIdx = i;
        -					this.dom.buttons.push( nButton );
        -				}
        -			}
        -		}
        -
        -		if ( this.s.order === 'alpha' ) {
        -			this.dom.buttons.sort( function ( a, b ) {
        -				var titleA = columns[ a.__columnIdx ].sTitle;
        -				var titleB = columns[ b.__columnIdx ].sTitle;
        -
        -				return titleA === titleB ?
        -					0 :
        -					titleA < titleB ?
        -						-1 :
        -						1;
        -			} );
        -		}
        -
        -		if ( this.s.restore )
        -		{
        -			nButton = this._fnDomRestoreButton();
        -			nButton.className += " ColVis_Restore";
        -			this.dom.buttons.push( nButton );
        -		}
        -
        -		if ( this.s.showAll )
        -		{
        -			nButton = this._fnDomShowXButton( this.s.showAll, true );
        -			nButton.className += " ColVis_ShowAll";
        -			this.dom.buttons.push( nButton );
        -		}
        -
        -		if ( this.s.showNone )
        -		{
        -			nButton = this._fnDomShowXButton( this.s.showNone, false );
        -			nButton.className += " ColVis_ShowNone";
        -			this.dom.buttons.push( nButton );
        -		}
        -
        -		$(this.dom.collection).append( this.dom.buttons );
        -	},
        -
        -
        -	/**
        -	 * Create a button which allows a "restore" action
        -	 *  @method  _fnDomRestoreButton
        -	 *  @returns {Node} Created button
        -	 *  @private
        -	 */
        -	"_fnDomRestoreButton": function ()
        -	{
        -		var
        -			that = this,
        -			dt = this.s.dt;
        -
        -		return $(
        -				'<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+
        -					this.s.restore+
        -				'</li>'
        -			)
        -			.click( function (e) {
        -				for ( var i=0, iLen=that.s.abOriginal.length ; i<iLen ; i++ )
        -				{
        -					that.s.dt.oInstance.fnSetColumnVis( i, that.s.abOriginal[i], false );
        -				}
        -				that._fnAdjustOpenRows();
        -				that.s.dt.oInstance.fnAdjustColumnSizing( false );
        -				that.s.dt.oInstance.fnDraw( false );
        -			} )[0];
        -	},
        -
        -
        -	/**
        -	 * Create a button which allows show all and show node actions
        -	 *  @method  _fnDomShowXButton
        -	 *  @returns {Node} Created button
        -	 *  @private
        -	 */
        -	"_fnDomShowXButton": function ( str, action )
        -	{
        -		var
        -			that = this,
        -			dt = this.s.dt;
        -
        -		return $(
        -				'<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+
        -					str+
        -				'</li>'
        -			)
        -			.click( function (e) {
        -				for ( var i=0, iLen=that.s.abOriginal.length ; i<iLen ; i++ )
        -				{
        -					if (that.s.aiExclude.indexOf(i) === -1)
        -					{
        -						that.s.dt.oInstance.fnSetColumnVis( i, action, false );
        -					}
        -				}
        -				that._fnAdjustOpenRows();
        -				that.s.dt.oInstance.fnAdjustColumnSizing( false );
        -				that.s.dt.oInstance.fnDraw( false );
        -			} )[0];
        -	},
        -
        -
        -	/**
        -	 * Create the DOM for a show / hide group button
        -	 *  @method  _fnDomGroupButton
        -	 *  @param {int} i Group in question, order based on that provided in settings
        -	 *  @returns {Node} Created button
        -	 *  @private
        -	 */
        -	"_fnDomGroupButton": function ( i )
        -	{
        -		var
        -			that = this,
        -			dt = this.s.dt,
        -			oGroup = this.s.aoGroups[i];
        -
        -		return $(
        -				'<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+
        -					'<label>'+
        -						'<input type="checkbox" />'+
        -						'<span>'+oGroup.sTitle+'</span>'+
        -					'</label>'+
        -				'</li>'
        -			)
        -			.click( function (e) {
        -				var showHide = !$('input', this).is(":checked");
        -				if (  e.target.nodeName.toLowerCase() !== "li" )
        -				{
        -					showHide = ! showHide;
        -				}
        -
        -				for ( var j=0 ; j < oGroup.aiColumns.length ; j++ )
        -				{
        -					that.s.dt.oInstance.fnSetColumnVis( oGroup.aiColumns[j], showHide );
        -				}
        -			} )[0];
        -	},
        -
        -
        -	/**
        -	 * Create the DOM for a show / hide button
        -	 *  @method  _fnDomColumnButton
        -	 *  @param {int} i Column in question
        -	 *  @returns {Node} Created button
        -	 *  @private
        -	 */
        -	"_fnDomColumnButton": function ( i )
        -	{
        -		var
        -			that = this,
        -			column = this.s.dt.aoColumns[i],
        -			dt = this.s.dt;
        -
        -		var title = this.s.fnLabel===null ?
        -			column.sTitle :
        -			this.s.fnLabel( i, column.sTitle, column.nTh );
        -
        -		return $(
        -				'<li '+(dt.bJUI ? 'class="ui-button ui-state-default"' : '')+'>'+
        -					'<label>'+
        -						'<input type="checkbox" />'+
        -						'<span>'+title+'</span>'+
        -					'</label>'+
        -				'</li>'
        -			)
        -			.click( function (e) {
        -				var showHide = !$('input', this).is(":checked");
        -				if (  e.target.nodeName.toLowerCase() !== "li" )
        -				{
        -					if ( e.target.nodeName.toLowerCase() == "input" || that.s.fnStateChange === null )
        -					{
        -						showHide = ! showHide;
        -					}
        -				}
        -
        -				/* Need to consider the case where the initialiser created more than one table - change the
        -				 * API index that DataTables is using
        -				 */
        -				var oldIndex = $.fn.dataTableExt.iApiIndex;
        -				$.fn.dataTableExt.iApiIndex = that._fnDataTablesApiIndex.call(that);
        -
        -				// Optimisation for server-side processing when scrolling - don't do a full redraw
        -				if ( dt.oFeatures.bServerSide )
        -				{
        -					that.s.dt.oInstance.fnSetColumnVis( i, showHide, false );
        -					that.s.dt.oInstance.fnAdjustColumnSizing( false );
        -					if (dt.oScroll.sX !== "" || dt.oScroll.sY !== "" )
        -					{
        -						that.s.dt.oInstance.oApi._fnScrollDraw( that.s.dt );
        -					}
        -					that._fnDrawCallback();
        -				}
        -				else
        -				{
        -					that.s.dt.oInstance.fnSetColumnVis( i, showHide );
        -				}
        -
        -				$.fn.dataTableExt.iApiIndex = oldIndex; /* Restore */
        -
        -				if ( that.s.fnStateChange !== null )
        -				{
        -					if ( e.target.nodeName.toLowerCase() == "span" )
        -					{
        -						e.preventDefault();
        -					}
        -					that.s.fnStateChange.call( that, i, showHide );
        -				}
        -			} )[0];
        -	},
        -
        -
        -	/**
        -	 * Get the position in the DataTables instance array of the table for this
        -	 * instance of ColVis
        -	 *  @method  _fnDataTablesApiIndex
        -	 *  @returns {int} Index
        -	 *  @private
        -	 */
        -	"_fnDataTablesApiIndex": function ()
        -	{
        -		for ( var i=0, iLen=this.s.dt.oInstance.length ; i<iLen ; i++ )
        -		{
        -			if ( this.s.dt.oInstance[i] == this.s.dt.nTable )
        -			{
        -				return i;
        -			}
        -		}
        -		return 0;
        -	},
        -
        -
        -	/**
        -	 * Create the element used to contain list the columns (it is shown and
        -	 * hidden as needed)
        -	 *  @method  _fnDomCollection
        -	 *  @returns {Node} div container for the collection
        -	 *  @private
        -	 */
        -	"_fnDomCollection": function ()
        -	{
        -		return $('<ul />', {
        -				'class': !this.s.dt.bJUI ?
        -					"ColVis_collection" :
        -					"ColVis_collection ui-buttonset ui-buttonset-multi"
        -			} )
        -		.css( {
        -			'display': 'none',
        -			'opacity': 0,
        -			'position': ! this.s.bCssPosition ?
        -				'absolute' :
        -				''
        -		} )[0];
        -	},
        -
        -
        -	/**
        -	 * An element to be placed on top of the activate button to catch events
        -	 *  @method  _fnDomCatcher
        -	 *  @returns {Node} div container for the collection
        -	 *  @private
        -	 */
        -	"_fnDomCatcher": function ()
        -	{
        -		var
        -			that = this,
        -			nCatcher = document.createElement('div');
        -		nCatcher.className = "ColVis_catcher";
        -
        -		$(nCatcher).click( function () {
        -			that._fnCollectionHide.call( that, null, null );
        -		} );
        -
        -		return nCatcher;
        -	},
        -
        -
        -	/**
        -	 * Create the element used to shade the background, and capture hide events (it is shown and
        -	 * hidden as needed)
        -	 *  @method  _fnDomBackground
        -	 *  @returns {Node} div container for the background
        -	 *  @private
        -	 */
        -	"_fnDomBackground": function ()
        -	{
        -		var that = this;
        -
        -		var background = $('<div></div>')
        -			.addClass( 'ColVis_collectionBackground' )
        -			.css( 'opacity', 0 )
        -			.click( function () {
        -				that._fnCollectionHide.call( that, null, null );
        -			} );
        -
        -		/* When considering a mouse over action for the activation, we also consider a mouse out
        -		 * which is the same as a mouse over the background - without all the messing around of
        -		 * bubbling events. Use the catcher element to avoid messing around with bubbling
        -		 */
        -		if ( this.s.activate == "mouseover" )
        -		{
        -			background.mouseover( function () {
        -				that.s.overcollection = false;
        -				that._fnCollectionHide.call( that, null, null );
        -			} );
        -		}
        -
        -		return background[0];
        -	},
        -
        -
        -	/**
        -	 * Show the show / hide list and the background
        -	 *  @method  _fnCollectionShow
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnCollectionShow": function ()
        -	{
        -		var that = this, i, iLen, iLeft;
        -		var oPos = $(this.dom.button).offset();
        -		var nHidden = this.dom.collection;
        -		var nBackground = this.dom.background;
        -		var iDivX = parseInt(oPos.left, 10);
        -		var iDivY = parseInt(oPos.top + $(this.dom.button).outerHeight(), 10);
        -
        -		if ( ! this.s.bCssPosition )
        -		{
        -			nHidden.style.top = iDivY+"px";
        -			nHidden.style.left = iDivX+"px";
        -		}
        -
        -		$(nHidden).css( {
        -			'display': 'block',
        -			'opacity': 0
        -		} );
        -
        -		nBackground.style.bottom ='0px';
        -		nBackground.style.right = '0px';
        -
        -		var oStyle = this.dom.catcher.style;
        -		oStyle.height = $(this.dom.button).outerHeight()+"px";
        -		oStyle.width = $(this.dom.button).outerWidth()+"px";
        -		oStyle.top = oPos.top+"px";
        -		oStyle.left = iDivX+"px";
        -
        -		document.body.appendChild( nBackground );
        -		document.body.appendChild( nHidden );
        -		document.body.appendChild( this.dom.catcher );
        -
        -		/* This results in a very small delay for the end user but it allows the animation to be
        -		 * much smoother. If you don't want the animation, then the setTimeout can be removed
        -		 */
        -		$(nHidden).animate({"opacity": 1}, that.s.iOverlayFade);
        -		$(nBackground).animate({"opacity": 0.1}, that.s.iOverlayFade, 'linear', function () {
        -			/* In IE6 if you set the checked attribute of a hidden checkbox, then this is not visually
        -			 * reflected. As such, we need to do it here, once it is visible. Unbelievable.
        -			 */
        -			if ( $.browser && $.browser.msie && $.browser.version == "6.0" )
        -			{
        -				that._fnDrawCallback();
        -			}
        -		});
        -
        -		/* Visual corrections to try and keep the collection visible */
        -		if ( !this.s.bCssPosition )
        -		{
        -			iLeft = ( this.s.sAlign=="left" ) ?
        -				iDivX :
        -				iDivX - $(nHidden).outerWidth() + $(this.dom.button).outerWidth();
        -
        -			nHidden.style.left = iLeft+"px";
        -
        -			var iDivWidth = $(nHidden).outerWidth();
        -			var iDivHeight = $(nHidden).outerHeight();
        -			var iDocWidth = $(document).width();
        -
        -			if ( iLeft + iDivWidth > iDocWidth )
        -			{
        -				nHidden.style.left = (iDocWidth-iDivWidth)+"px";
        -			}
        -		}
        -
        -		this.s.hidden = false;
        -	},
        -
        -
        -	/**
        -	 * Hide the show / hide list and the background
        -	 *  @method  _fnCollectionHide
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnCollectionHide": function (  )
        -	{
        -		var that = this;
        -
        -		if ( !this.s.hidden && this.dom.collection !== null )
        -		{
        -			this.s.hidden = true;
        -
        -			$(this.dom.collection).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {
        -				this.style.display = "none";
        -			} );
        -
        -			$(this.dom.background).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {
        -				document.body.removeChild( that.dom.background );
        -				document.body.removeChild( that.dom.catcher );
        -			} );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Alter the colspan on any fnOpen rows
        -	 */
        -	"_fnAdjustOpenRows": function ()
        -	{
        -		var aoOpen = this.s.dt.aoOpenRows;
        -		var iVisible = this.s.dt.oApi._fnVisbleColumns( this.s.dt );
        -
        -		for ( var i=0, iLen=aoOpen.length ; i<iLen ; i++ ) {
        -			aoOpen[i].nTr.getElementsByTagName('td')[0].colSpan = iVisible;
        -		}
        -	}
        -};
        -
        -
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Static object methods
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * Rebuild the collection for a given table, or all tables if no parameter given
        - *  @method  ColVis.fnRebuild
        - *  @static
        - *  @param   object oTable DataTable instance to consider - optional
        - *  @returns void
        - */
        -ColVis.fnRebuild = function ( oTable )
        -{
        -	var nTable = null;
        -	if ( typeof oTable != 'undefined' )
        -	{
        -		nTable = $.fn.dataTable.Api ?
        -			new $.fn.dataTable.Api( oTable ).table().node() :
        -			oTable.fnSettings().nTable;
        -	}
        -
        -	for ( var i=0, iLen=ColVis.aInstances.length ; i<iLen ; i++ )
        -	{
        -		if ( typeof oTable == 'undefined' || nTable == ColVis.aInstances[i].s.dt.nTable )
        -		{
        -			ColVis.aInstances[i].fnRebuild();
        -		}
        -	}
        -};
        -
        -
        -ColVis.defaults = {
        -	/**
        -	 * Mode of activation. Can be 'click' or 'mouseover'
        -	 *  @property activate
        -	 *  @type     string
        -	 *  @default  click
        -	 */
        -	active: 'click',
        -
        -	/**
        -	 * Text used for the button
        -	 *  @property buttonText
        -	 *  @type     string
        -	 *  @default  Show / hide columns
        -	 */
        -	buttonText: 'Show / hide columns',
        -
        -	/**
        -	 * List of columns (integers) which should be excluded from the list
        -	 *  @property aiExclude
        -	 *  @type     array
        -	 *  @default  []
        -	 */
        -	aiExclude: [],
        -
        -	/**
        -	 * Show restore button
        -	 *  @property bRestore
        -	 *  @type     boolean
        -	 *  @default  false
        -	 */
        -	bRestore: false,
        -
        -	/**
        -	 * Restore button text
        -	 *  @property sRestore
        -	 *  @type     string
        -	 *  @default  Restore original
        -	 */
        -	sRestore: 'Restore original',
        -
        -	/**
        -	 * Show Show-All button
        -	 *  @property bShowAll
        -	 *  @type     boolean
        -	 *  @default  false
        -	 */
        -	bShowAll: false,
        -
        -	/**
        -	 * Show All button text
        -	 *  @property sShowAll
        -	 *  @type     string
        -	 *  @default  Restore original
        -	 */
        -	sShowAll: 'Show All',
        -
        -	/**
        -	 * Position of the collection menu when shown - align "left" or "right"
        -	 *  @property sAlign
        -	 *  @type     string
        -	 *  @default  left
        -	 */
        -	sAlign: 'left',
        -
        -	/**
        -	 * Callback function to tell the user when the state has changed
        -	 *  @property fnStateChange
        -	 *  @type     function
        -	 *  @default  null
        -	 */
        -	fnStateChange: null,
        -
        -	/**
        -	 * Overlay animation duration in mS
        -	 *  @property iOverlayFade
        -	 *  @type     integer|false
        -	 *  @default  500
        -	 */
        -	iOverlayFade: 500,
        -
        -	/**
        -	 * Label callback for column names. Takes three parameters: 1. the
        -	 * column index, 2. the column title detected by DataTables and 3. the
        -	 * TH node for the column
        -	 *  @property fnLabel
        -	 *  @type     function
        -	 *  @default  null
        -	 */
        -	fnLabel: null,
        -
        -	/**
        -	 * Indicate if the column list should be positioned by Javascript,
        -	 * visually below the button or allow CSS to do the positioning
        -	 *  @property bCssPosition
        -	 *  @type     boolean
        -	 *  @default  false
        -	 */
        -	bCssPosition: false,
        -
        -	/**
        -	 * Group buttons
        -	 *  @property aoGroups
        -	 *  @type     array
        -	 *  @default  []
        -	 */
        -	aoGroups: [],
        -
        -	/**
        -	 * Button ordering - 'alpha' (alphabetical) or 'column' (table column
        -	 * order)
        -	 *  @property order
        -	 *  @type     string
        -	 *  @default  column
        -	 */
        -	order: 'column'
        -};
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Static object properties
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * Collection of all ColVis instances
        - *  @property ColVis.aInstances
        - *  @static
        - *  @type     Array
        - *  @default  []
        - */
        -ColVis.aInstances = [];
        -
        -
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Constants
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * Name of this class
        - *  @constant CLASS
        - *  @type     String
        - *  @default  ColVis
        - */
        -ColVis.prototype.CLASS = "ColVis";
        -
        -
        -/**
        - * ColVis version
        - *  @constant  VERSION
        - *  @type      String
        - *  @default   See code
        - */
        -ColVis.VERSION = "1.1.2";
        -ColVis.prototype.VERSION = ColVis.VERSION;
        -
        -
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Initialisation
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/*
        - * Register a new feature with DataTables
        - */
        -if ( typeof $.fn.dataTable == "function" &&
        -     typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
        -     $.fn.dataTableExt.fnVersionCheck('1.7.0') )
        -{
        -	$.fn.dataTableExt.aoFeatures.push( {
        -		"fnInit": function( oDTSettings ) {
        -			var init = oDTSettings.oInit;
        -			var colvis = new ColVis( oDTSettings, init.colVis || init.oColVis || {} );
        -			return colvis.button();
        -		},
        -		"cFeature": "C",
        -		"sFeature": "ColVis"
        -	} );
        -}
        -else
        -{
        -	alert( "Warning: ColVis requires DataTables 1.7 or greater - www.datatables.net/download");
        -}
        -
        -
        -// Make ColVis accessible from the DataTables instance
        -$.fn.dataTable.ColVis = ColVis;
        -$.fn.DataTable.ColVis = ColVis;
        -
        -
        -return ColVis;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.ColVis ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/ColVis/js/dataTables.colVis.min.js b/resources/assets/js/plugins/datatables/extensions/ColVis/js/dataTables.colVis.min.js
        deleted file mode 100755
        index 764b102426..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/ColVis/js/dataTables.colVis.min.js
        +++ /dev/null
        @@ -1,24 +0,0 @@
        -/*!
        - ColVis 1.1.2
        - ©2010-2015 SpryMedia Ltd - datatables.net/license
        -*/
        -(function(j,i,k){j=function(d){var e=function(a,b){(!this.CLASS||"ColVis"!=this.CLASS)&&alert("Warning: ColVis must be initialised with the keyword 'new'");"undefined"==typeof b&&(b={});var c=d.fn.dataTable.camelToHungarian;c&&(c(e.defaults,e.defaults,!0),c(e.defaults,b));this.s={dt:null,oInit:b,hidden:!0,abOriginal:[]};this.dom={wrapper:null,button:null,collection:null,background:null,catcher:null,buttons:[],groupButtons:[],restore:null};e.aInstances.push(this);this.s.dt=d.fn.dataTable.Api?(new d.fn.dataTable.Api(a)).settings()[0]:
        -a;this._fnConstruct(b);return this};e.prototype={button:function(){return this.dom.wrapper},fnRebuild:function(){this.rebuild()},rebuild:function(){for(var a=this.dom.buttons.length-1;0<=a;a--)this.dom.collection.removeChild(this.dom.buttons[a]);this.dom.buttons.splice(0,this.dom.buttons.length);this.dom.groupButtons.splice(0,this.dom.groupButtons.length);this.dom.restore&&this.dom.restore.parentNode(this.dom.restore);this._fnAddGroups();this._fnAddButtons();this._fnDrawCallback()},_fnConstruct:function(a){this._fnApplyCustomisation(a);
        -var b=this,c,f;this.dom.wrapper=i.createElement("div");this.dom.wrapper.className="ColVis";this.dom.button=d("<button />",{"class":!this.s.dt.bJUI?"ColVis_Button ColVis_MasterButton":"ColVis_Button ColVis_MasterButton ui-button ui-state-default"}).append("<span>"+this.s.buttonText+"</span>").bind("mouseover"==this.s.activate?"mouseover":"click",function(a){a.preventDefault();b._fnCollectionShow()}).appendTo(this.dom.wrapper)[0];this.dom.catcher=this._fnDomCatcher();this.dom.collection=this._fnDomCollection();
        -this.dom.background=this._fnDomBackground();this._fnAddGroups();this._fnAddButtons();c=0;for(f=this.s.dt.aoColumns.length;c<f;c++)this.s.abOriginal.push(this.s.dt.aoColumns[c].bVisible);this.s.dt.aoDrawCallback.push({fn:function(){b._fnDrawCallback.call(b)},sName:"ColVis"});d(this.s.dt.oInstance).bind("column-reorder.dt",function(a,d,e){c=0;for(f=b.s.aiExclude.length;c<f;c++)b.s.aiExclude[c]=e.aiInvertMapping[b.s.aiExclude[c]];a=b.s.abOriginal.splice(e.iFrom,1)[0];b.s.abOriginal.splice(e.iTo,0,a);
        -b.fnRebuild()});d(this.s.dt.oInstance).bind("destroy.dt",function(){d(b.dom.wrapper).remove()});this._fnDrawCallback()},_fnApplyCustomisation:function(a){d.extend(!0,this.s,e.defaults,a);!this.s.showAll&&this.s.bShowAll&&(this.s.showAll=this.s.sShowAll);!this.s.restore&&this.s.bRestore&&(this.s.restore=this.s.sRestore);var a=this.s.groups,b=this.s.aoGroups;if(a)for(var c=0,f=a.length;c<f;c++)if(a[c].title&&(b[c].sTitle=a[c].title),a[c].columns)b[c].aiColumns=a[c].columns},_fnDrawCallback:function(){for(var a=
        -this.s.dt.aoColumns,b=this.dom.buttons,c=this.s.aoGroups,f,g=0,h=b.length;g<h;g++)f=b[g],f.__columnIdx!==k&&d("input",f).prop("checked",a[f.__columnIdx].bVisible);b=0;for(f=c.length;b<f;b++){a:{for(var g=c[b].aiColumns,h=0,e=g.length;h<e;h++)if(!1===a[g[h]].bVisible){g=!1;break a}g=!0}if(g)d("input",this.dom.groupButtons[b]).prop("checked",!0),d("input",this.dom.groupButtons[b]).prop("indeterminate",!1);else{a:{g=c[b].aiColumns;h=0;for(e=g.length;h<e;h++)if(!0===a[g[h]].bVisible){g=!1;break a}g=!0}g?
        -(d("input",this.dom.groupButtons[b]).prop("checked",!1),d("input",this.dom.groupButtons[b]).prop("indeterminate",!1)):d("input",this.dom.groupButtons[b]).prop("indeterminate",!0)}}},_fnAddGroups:function(){var a;if("undefined"!=typeof this.s.aoGroups)for(var b=0,c=this.s.aoGroups.length;b<c;b++)a=this._fnDomGroupButton(b),this.dom.groupButtons.push(a),this.dom.buttons.push(a),this.dom.collection.appendChild(a)},_fnAddButtons:function(){var a,b=this.s.dt.aoColumns;if(-1===d.inArray("all",this.s.aiExclude))for(var c=
        -0,f=b.length;c<f;c++)-1===d.inArray(c,this.s.aiExclude)&&(a=this._fnDomColumnButton(c),a.__columnIdx=c,this.dom.buttons.push(a));"alpha"===this.s.order&&this.dom.buttons.sort(function(a,c){var d=b[a.__columnIdx].sTitle,f=b[c.__columnIdx].sTitle;return d===f?0:d<f?-1:1});this.s.restore&&(a=this._fnDomRestoreButton(),a.className+=" ColVis_Restore",this.dom.buttons.push(a));this.s.showAll&&(a=this._fnDomShowXButton(this.s.showAll,!0),a.className+=" ColVis_ShowAll",this.dom.buttons.push(a));this.s.showNone&&
        -(a=this._fnDomShowXButton(this.s.showNone,!1),a.className+=" ColVis_ShowNone",this.dom.buttons.push(a));d(this.dom.collection).append(this.dom.buttons)},_fnDomRestoreButton:function(){var a=this;return d('<li class="ColVis_Special '+(this.s.dt.bJUI?"ui-button ui-state-default":"")+'">'+this.s.restore+"</li>").click(function(){for(var b=0,c=a.s.abOriginal.length;b<c;b++)a.s.dt.oInstance.fnSetColumnVis(b,a.s.abOriginal[b],!1);a._fnAdjustOpenRows();a.s.dt.oInstance.fnAdjustColumnSizing(!1);a.s.dt.oInstance.fnDraw(!1)})[0]},
        -_fnDomShowXButton:function(a,b){var c=this;return d('<li class="ColVis_Special '+(this.s.dt.bJUI?"ui-button ui-state-default":"")+'">'+a+"</li>").click(function(){for(var a=0,d=c.s.abOriginal.length;a<d;a++)-1===c.s.aiExclude.indexOf(a)&&c.s.dt.oInstance.fnSetColumnVis(a,b,!1);c._fnAdjustOpenRows();c.s.dt.oInstance.fnAdjustColumnSizing(!1);c.s.dt.oInstance.fnDraw(!1)})[0]},_fnDomGroupButton:function(a){var b=this,c=this.s.aoGroups[a];return d('<li class="ColVis_Special '+(this.s.dt.bJUI?"ui-button ui-state-default":
        -"")+'"><label><input type="checkbox" /><span>'+c.sTitle+"</span></label></li>").click(function(a){var g=!d("input",this).is(":checked");"li"!==a.target.nodeName.toLowerCase()&&(g=!g);for(a=0;a<c.aiColumns.length;a++)b.s.dt.oInstance.fnSetColumnVis(c.aiColumns[a],g)})[0]},_fnDomColumnButton:function(a){var b=this,c=this.s.dt.aoColumns[a],f=this.s.dt,c=null===this.s.fnLabel?c.sTitle:this.s.fnLabel(a,c.sTitle,c.nTh);return d("<li "+(f.bJUI?'class="ui-button ui-state-default"':"")+'><label><input type="checkbox" /><span>'+
        -c+"</span></label></li>").click(function(c){var e=!d("input",this).is(":checked");if("li"!==c.target.nodeName.toLowerCase()&&("input"==c.target.nodeName.toLowerCase()||null===b.s.fnStateChange))e=!e;var i=d.fn.dataTableExt.iApiIndex;d.fn.dataTableExt.iApiIndex=b._fnDataTablesApiIndex.call(b);f.oFeatures.bServerSide?(b.s.dt.oInstance.fnSetColumnVis(a,e,!1),b.s.dt.oInstance.fnAdjustColumnSizing(!1),(""!==f.oScroll.sX||""!==f.oScroll.sY)&&b.s.dt.oInstance.oApi._fnScrollDraw(b.s.dt),b._fnDrawCallback()):
        -b.s.dt.oInstance.fnSetColumnVis(a,e);d.fn.dataTableExt.iApiIndex=i;null!==b.s.fnStateChange&&("span"==c.target.nodeName.toLowerCase()&&c.preventDefault(),b.s.fnStateChange.call(b,a,e))})[0]},_fnDataTablesApiIndex:function(){for(var a=0,b=this.s.dt.oInstance.length;a<b;a++)if(this.s.dt.oInstance[a]==this.s.dt.nTable)return a;return 0},_fnDomCollection:function(){return d("<ul />",{"class":!this.s.dt.bJUI?"ColVis_collection":"ColVis_collection ui-buttonset ui-buttonset-multi"}).css({display:"none",
        -opacity:0,position:!this.s.bCssPosition?"absolute":""})[0]},_fnDomCatcher:function(){var a=this,b=i.createElement("div");b.className="ColVis_catcher";d(b).click(function(){a._fnCollectionHide.call(a,null,null)});return b},_fnDomBackground:function(){var a=this,b=d("<div></div>").addClass("ColVis_collectionBackground").css("opacity",0).click(function(){a._fnCollectionHide.call(a,null,null)});"mouseover"==this.s.activate&&b.mouseover(function(){a.s.overcollection=!1;a._fnCollectionHide.call(a,null,
        -null)});return b[0]},_fnCollectionShow:function(){var a=this,b;b=d(this.dom.button).offset();var c=this.dom.collection,f=this.dom.background,e=parseInt(b.left,10),h=parseInt(b.top+d(this.dom.button).outerHeight(),10);this.s.bCssPosition||(c.style.top=h+"px",c.style.left=e+"px");d(c).css({display:"block",opacity:0});f.style.bottom="0px";f.style.right="0px";h=this.dom.catcher.style;h.height=d(this.dom.button).outerHeight()+"px";h.width=d(this.dom.button).outerWidth()+"px";h.top=b.top+"px";h.left=e+
        -"px";i.body.appendChild(f);i.body.appendChild(c);i.body.appendChild(this.dom.catcher);d(c).animate({opacity:1},a.s.iOverlayFade);d(f).animate({opacity:0.1},a.s.iOverlayFade,"linear",function(){d.browser&&(d.browser.msie&&d.browser.version=="6.0")&&a._fnDrawCallback()});this.s.bCssPosition||(b="left"==this.s.sAlign?e:e-d(c).outerWidth()+d(this.dom.button).outerWidth(),c.style.left=b+"px",f=d(c).outerWidth(),d(c).outerHeight(),e=d(i).width(),b+f>e&&(c.style.left=e-f+"px"));this.s.hidden=!1},_fnCollectionHide:function(){var a=
        -this;!this.s.hidden&&null!==this.dom.collection&&(this.s.hidden=!0,d(this.dom.collection).animate({opacity:0},a.s.iOverlayFade,function(){this.style.display="none"}),d(this.dom.background).animate({opacity:0},a.s.iOverlayFade,function(){i.body.removeChild(a.dom.background);i.body.removeChild(a.dom.catcher)}))},_fnAdjustOpenRows:function(){for(var a=this.s.dt.aoOpenRows,b=this.s.dt.oApi._fnVisbleColumns(this.s.dt),c=0,d=a.length;c<d;c++)a[c].nTr.getElementsByTagName("td")[0].colSpan=b}};e.fnRebuild=
        -function(a){var b=null;"undefined"!=typeof a&&(b=d.fn.dataTable.Api?(new d.fn.dataTable.Api(a)).table().node():a.fnSettings().nTable);for(var c=0,f=e.aInstances.length;c<f;c++)("undefined"==typeof a||b==e.aInstances[c].s.dt.nTable)&&e.aInstances[c].fnRebuild()};e.defaults={active:"click",buttonText:"Show / hide columns",aiExclude:[],bRestore:!1,sRestore:"Restore original",bShowAll:!1,sShowAll:"Show All",sAlign:"left",fnStateChange:null,iOverlayFade:500,fnLabel:null,bCssPosition:!1,aoGroups:[],order:"column"};
        -e.aInstances=[];e.prototype.CLASS="ColVis";e.VERSION="1.1.2";e.prototype.VERSION=e.VERSION;"function"==typeof d.fn.dataTable&&"function"==typeof d.fn.dataTableExt.fnVersionCheck&&d.fn.dataTableExt.fnVersionCheck("1.7.0")?d.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInit;return(new e(a,b.colVis||b.oColVis||{})).button()},cFeature:"C",sFeature:"ColVis"}):alert("Warning: ColVis requires DataTables 1.7 or greater - www.datatables.net/download");d.fn.dataTable.ColVis=e;return d.fn.DataTable.ColVis=
        -e};"function"===typeof define&&define.amd?define(["jquery","datatables"],j):"object"===typeof exports?j(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.ColVis&&j(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/Readme.md b/resources/assets/js/plugins/datatables/extensions/FixedColumns/Readme.md
        deleted file mode 100755
        index 15d64c3830..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/Readme.md
        +++ /dev/null
        @@ -1,42 +0,0 @@
        -# FixedColumns
        -
        -When making use of DataTables' x-axis scrolling feature (`scrollX`), you may wish to fix the left or right most columns in place. This plug-in for DataTables provides exactly this option (for non-scrolling tables, please use the FixedHeader plug-in, which can fix headers, footers and columns). Key features include:
        -
        -* Freezes the left most column to the side of the table
        -* Option to freeze two or more columns
        -* Full integration with DataTables' scrolling options
        -
        -
        -# Installation
        -
        -To use FixedColumns, first download DataTables ( http://datatables.net/download ) and place the unzipped FixedColumns package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -FixedColumns is initialised using the `$.fn.dataTable.FixedColumns()` constructor. For example:
        -
        -```js
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -```
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/FixedColumns/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of FixedColumns and help make it better, please refer to its GitHub repo: https://github.com/DataTables/FixedColumns
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.css b/resources/assets/js/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.css
        deleted file mode 100755
        index 0d6e18abff..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.css
        +++ /dev/null
        @@ -1,25 +0,0 @@
        -
        -
        -/* Block out what is behind the fixed column's header and footer */
        -table.DTFC_Cloned thead,
        -table.DTFC_Cloned tfoot {
        -	background-color: white;
        -}
        -
        -/* Block out the gap above the scrollbar on the right, when there is a fixed
        - * right column
        - */
        -div.DTFC_Blocker {
        -	background-color: white;
        -}
        -
        -div.DTFC_LeftWrapper table.dataTable,
        -div.DTFC_RightWrapper table.dataTable {
        -	margin-bottom: 0;
        -	z-index: 2;
        -}
        -
        -div.DTFC_LeftWrapper table.dataTable.no-footer,
        -div.DTFC_RightWrapper table.dataTable.no-footer {
        -	border-bottom: none;
        -}
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.min.css b/resources/assets/js/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.min.css
        deleted file mode 100755
        index 71e801b53e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -table.DTFC_Cloned thead,table.DTFC_Cloned tfoot{background-color:white}div.DTFC_Blocker{background-color:white}div.DTFC_LeftWrapper table.dataTable,div.DTFC_RightWrapper table.dataTable{margin-bottom:0;z-index:2}div.DTFC_LeftWrapper table.dataTable.no-footer,div.DTFC_RightWrapper table.dataTable.no-footer{border-bottom:none}
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/bootstrap.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/bootstrap.html
        deleted file mode 100755
        index 24ccd3ec75..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/bootstrap.html
        +++ /dev/null
        @@ -1,819 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Bootstrap</title>
        -	<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
        -	<link rel="stylesheet" type="text/css" href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	body { font-size: 140%; }
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Bootstrap</span></h1>
        -
        -			<div class="info">
        -				<p>When displaying a table which scrolls along the x-axis, it can sometimes be useful to the end user for the left most column to be fixed in place, if it shows
        -				grouping, index or similar information. This is basically the same idea as 'freeze columns' in Excel. This can be achieved with the FixedColumns plug-in for
        -				DataTables, as shown below.</p>
        -
        -				<p>Note that FixedColumns is suitable only for use with the scrolling features in <a href="http://datatables.net">DataTables</a>. If you want to achieve a similar
        -				effect without scrolling enabled, please checkout <a href="http://datatables.net/plug-ins">FixedHeader</a>, also for DataTables.</p>
        -
        -				<p>FixedColumns is initialised using the constructor <code>new $.fn.dataTable.FixedColumns();</code> - shown below.</p>
        -			</div>
        -
        -			<table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -						<li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">body { font-size: 140%; }
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css</a></li>
        -						<li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li class="active"><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/col_filter.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/col_filter.html
        deleted file mode 100755
        index 6220d8f780..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/col_filter.html
        +++ /dev/null
        @@ -1,857 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Individual column filtering</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	// Setup - add a text input to each footer cell
        -	$('#example tfoot th').each( function () {
        -		var title = $('#example thead th').eq( $(this).index() ).text();
        -		$(this).html( '<input type="text" placeholder="Search '+title+'" />' );
        -	} );
        - 
        -	// DataTable
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	 
        -	// Apply the filter
        -	table.columns().indexes().each( function (idx) {
        -		$( 'input', table.column( idx ).footer() ).on( 'keyup change', function () {
        -			table
        -				.column( idx )
        -				.search( this.value )
        -				.draw();
        -		} );
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Individual column filtering</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows FixedColumns being configured with individual column filtering abilities. Note that the event handler for the filtering is applied to the
        -				<code class="tag" title="HTML tag">input</code> elements before FixedColumns is initialised, so when FixedColumns clones nodes it also copies the event.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	// Setup - add a text input to each footer cell
        -	$('#example tfoot th').each( function () {
        -		var title = $('#example thead th').eq( $(this).index() ).text();
        -		$(this).html( '&lt;input type=&quot;text&quot; placeholder=&quot;Search '+title+'&quot; /&gt;' );
        -	} );
        - 
        -	// DataTable
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	 
        -	// Apply the filter
        -	table.columns().indexes().each( function (idx) {
        -		$( 'input', table.column( idx ).footer() ).on( 'keyup change', function () {
        -			table
        -				.column( idx )
        -				.search( this.value )
        -				.draw();
        -		} );
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li class="active"><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/colvis.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/colvis.html
        deleted file mode 100755
        index e5d0aa70b6..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/colvis.html
        +++ /dev/null
        @@ -1,833 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - ColVis integration</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../ColVis/css/dataTables.colVis.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	div.ColVis {
        -		float: left;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../ColVis/js/dataTables.colVis.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		dom:            "Cfrtip",
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 2
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>ColVis integration</span></h1>
        -
        -			<div class="info">
        -				<p>FixedColumns operates with DataTables' built-in column visibility options (<a href="//datatables.net/reference/option/columns.visible"><code class="option"
        -				title="DataTables initialisation option">columns.visible<span>DT</span></code></a> and <a href="//datatables.net/reference/api/column().visible()"><code class=
        -				"api" title="DataTables API method">column().visible()<span>DT</span></code></a>), which columns that are hidden not being shown in the fixed columns. This
        -				integration also means that FixedColumns works well with <a href="http://datatables.net/extensions/colvis">ColVis</a>, with columns that are dynamically shown and
        -				hidden updated immediately in the fixed columns.</p>
        -
        -				<p>The example below shows ColVis and FixedColumns working together. Two columns have been fixed on the left hand side of the table to show FixedColumns ability to
        -				work effortlessly with column visibility.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		dom:            &quot;Cfrtip&quot;,
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 2
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../ColVis/js/dataTables.colVis.js">../../ColVis/js/dataTables.colVis.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	div.ColVis {
        -		float: left;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../ColVis/css/dataTables.colVis.css">../../ColVis/css/dataTables.colVis.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li class="active"><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/css_size.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/css_size.html
        deleted file mode 100755
        index dfa525ed69..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/css_size.html
        +++ /dev/null
        @@ -1,828 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - CSS row sizing</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	tr { height: 50px; }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		heightMatch: 'none'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>CSS row sizing</span></h1>
        -
        -			<div class="info">
        -				<p>Because of the method FixedColumns uses to display the fixed columns, an important consideration is the alignment of the rows due to different heights in the
        -				individual rows of the table. There are two different algorithms in FixedColumns which can be used, or you can switch off automatic row sizing all together. This
        -				is controlled through the <code>heightMatch</code> parameter. If can take the following values:</p>
        -
        -				<ul class="markdown">
        -					<li><code class="string" title="String">none</code> - no automatic row height matching is performed. CSS can be used in this case and is useful when speed is
        -					of primary importance.</li>
        -					<li><code class="string" title="String">semiauto</code> (default) - the height calculation will be performed once, and the result cached to be used again
        -					(<code>fnRecalculateHeight</code> can be used to force recalculation)</li>
        -					<li><code class="string" title="String">auto</code> - height matching is performed on every draw (slowest but must accurate)</li>
        -				</ul>
        -
        -				<p>This example shows row height matching switched off but there is a CSS statement of <code>tr { height: 50px }</code> to force all rows to the same height.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		heightMatch: 'none'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	tr { height: 50px; }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li class="active"><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/index.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/index.html
        deleted file mode 100755
        index 7cb9a0581d..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/index.html
        +++ /dev/null
        @@ -1,74 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>FixedColumns examples - FixedColumns examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>FixedColumns examples</span></h1>
        -
        -			<div class="info">
        -				<p>When making use of DataTables' x-axis scrolling feature (<a href="//datatables.net/reference/option/scrollX"><code class="option" title=
        -				"DataTables initialisation option">scrollX<span>DT</span></code></a>), you may wish to fix the left or right most columns in place. This extension for DataTables
        -				provides exactly this option (for non-scrolling tables, please use the <a href="//datatables.net/extensions/fixedheader">FixedHeader extension</a>, which can fix
        -				headers, footers and columns). Key features include:</p>
        -
        -				<ul class="markdown">
        -					<li>Freezes the left most column to the side of the table</li>
        -					<li>Option to freeze two or more columns</li>
        -					<li>Full integration with DataTables' scrolling options</li>
        -				</ul>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/index_column.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/index_column.html
        deleted file mode 100755
        index e61073ec5a..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/index_column.html
        +++ /dev/null
        @@ -1,932 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Index column</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	/* Styling for the index columns */
        -	th.index,
        -	td.index {
        -		background-color: white !important;
        -		border-top: 1px solid white !important;
        -		border-bottom: none !important;
        -	}
        -	div.DTFC_LeftHeadWrapper table {
        -		border-bottom: 1px solid white !important;
        -	}
        -	div.DTFC_LeftHeadWrapper th {
        -		border-bottom: 1px solid white !important;
        -	}
        -	div.DTFC_LeftBodyWrapper {
        -		border-right: 1px solid black;
        -	}
        -	div.DTFC_LeftFootWrapper th {
        -		border-top: 1px solid white !important;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false,
        -		columnDefs: [ {
        -			sortable: false,
        -			"class": "index",
        -			targets: 0
        -		} ],
        -		order: [[ 1, 'asc' ]]
        -	} );
        -
        -	table.on( 'order.dt search.dt', function () {
        -		table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
        -			cell.innerHTML = i+1;
        -		} );
        -	} ).draw();
        -
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Index column</span></h1>
        -
        -			<div class="info">
        -				<p>A typical interaction to want to perform with a fixed column, is an index column. A method for how this can be achieved with FixedColumns is shown in this
        -				example, building on the <a href="http://datatables.net/examples/api/counter_column">index column</a> example for DataTables. Also shown in this example is how the
        -				fixed column can be styled with CSS to show it more prominently.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th></th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td></td>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false,
        -		columnDefs: [ {
        -			sortable: false,
        -			&quot;class&quot;: &quot;index&quot;,
        -			targets: 0
        -		} ],
        -		order: [[ 1, 'asc' ]]
        -	} );
        -
        -	table.on( 'order.dt search.dt', function () {
        -		table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
        -			cell.innerHTML = i+1;
        -		} );
        -	} ).draw();
        -
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	/* Styling for the index columns */
        -	th.index,
        -	td.index {
        -		background-color: white !important;
        -		border-top: 1px solid white !important;
        -		border-bottom: none !important;
        -	}
        -	div.DTFC_LeftHeadWrapper table {
        -		border-bottom: 1px solid white !important;
        -	}
        -	div.DTFC_LeftHeadWrapper th {
        -		border-bottom: 1px solid white !important;
        -	}
        -	div.DTFC_LeftBodyWrapper {
        -		border-right: 1px solid black;
        -	}
        -	div.DTFC_LeftFootWrapper th {
        -		border-top: 1px solid white !important;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li class="active"><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/left_right_columns.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/left_right_columns.html
        deleted file mode 100755
        index f92789c480..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/left_right_columns.html
        +++ /dev/null
        @@ -1,816 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Left and right fixed columns</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 1,
        -		rightColumns: 1
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Left and right fixed columns</span></h1>
        -
        -			<div class="info">
        -				<p>FixedColumns allows columns to be fixed from both the left and right hand sides of the table. Fixing right hand-side columns is done by using the
        -				<code>rightColumns</code> initialisation parameter, which works just the same as <code>leftColumns</code> does for the left side of the table. This example shows
        -				both the left and right columns being fixed in place.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 1,
        -		rightColumns: 1
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/right_column.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/right_column.html
        deleted file mode 100755
        index d6bf0f8095..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/right_column.html
        +++ /dev/null
        @@ -1,816 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Right column only</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 0,
        -		rightColumns: 1
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Right column only</span></h1>
        -
        -			<div class="info">
        -				<p>FixedColumns has the ability to freeze columns on both the left and right hand sides of the table. By default it will fix the first column on the left, but
        -				using the initialisation parameters <code>leftColumns</code> and <code>rightColumns</code> you can alter this to fix the columns on the right as well. This example
        -				shows a single column fixed in place, in this case the right most column.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 0,
        -		rightColumns: 1
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li class="active"><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/rowspan.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/rowspan.html
        deleted file mode 100755
        index 08085e608f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/rowspan.html
        +++ /dev/null
        @@ -1,657 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Complex headers</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td {
        -		white-space: nowrap;
        -		padding-left: 40px !important;
        -		padding-right: 40px !important;
        -	}
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Complex headers</span></h1>
        -
        -			<div class="info">
        -				<p>If you are using multiple rows in the table header, it can be useful to have a rowspanning cell on the column(s) you have fixed in place - equally at other
        -				times it can be useful to not and make use of the two or more cells per column. FixedColumns builds on the complex header support in DataTables to make this
        -				trivial to use in FixedColumns. Just initialise your FixedColumns instance as you normally would!</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th rowspan="2">Name</th>
        -						<th colspan="2">HR Information</th>
        -						<th colspan="3">Contact</th>
        -					</tr>
        -					<tr>
        -						<th>Position</th>
        -						<th>Salary</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Salary</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>$320,800</td>
        -						<td>Edinburgh</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>$170,750</td>
        -						<td>Tokyo</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>$86,000</td>
        -						<td>San Francisco</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>$433,060</td>
        -						<td>Edinburgh</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>$162,700</td>
        -						<td>Tokyo</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>$372,000</td>
        -						<td>New York</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>$137,500</td>
        -						<td>San Francisco</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>$327,900</td>
        -						<td>Tokyo</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>$205,500</td>
        -						<td>San Francisco</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>$103,600</td>
        -						<td>Edinburgh</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>$90,560</td>
        -						<td>London</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>$342,000</td>
        -						<td>Edinburgh</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>$470,600</td>
        -						<td>San Francisco</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>$313,500</td>
        -						<td>London</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>$385,750</td>
        -						<td>London</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>$198,500</td>
        -						<td>London</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>$725,000</td>
        -						<td>New York</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>$237,500</td>
        -						<td>New York</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>$132,000</td>
        -						<td>London</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>$217,500</td>
        -						<td>Edinburgh</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>$345,000</td>
        -						<td>New York</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>$675,000</td>
        -						<td>New York</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>$106,450</td>
        -						<td>New York</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>$85,600</td>
        -						<td>Sidney</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>$1,200,000</td>
        -						<td>London</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>$92,575</td>
        -						<td>Edinburgh</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>$357,650</td>
        -						<td>Singapore</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>$206,850</td>
        -						<td>San Francisco</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>$850,000</td>
        -						<td>San Francisco</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>$163,000</td>
        -						<td>Tokyo</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>$95,400</td>
        -						<td>Sidney</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>$114,500</td>
        -						<td>London</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>$145,000</td>
        -						<td>London</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>$235,500</td>
        -						<td>San Francisco</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>$324,050</td>
        -						<td>Edinburgh</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>$85,675</td>
        -						<td>San Francisco</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>$164,500</td>
        -						<td>San Francisco</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>$109,850</td>
        -						<td>San Francisco</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>$452,500</td>
        -						<td>San Francisco</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>$136,200</td>
        -						<td>London</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>$645,750</td>
        -						<td>New York</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>$234,500</td>
        -						<td>Singapore</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>$163,500</td>
        -						<td>London</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>$139,575</td>
        -						<td>Tokyo</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>$98,540</td>
        -						<td>New York</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>$87,500</td>
        -						<td>San Francisco</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>$138,575</td>
        -						<td>Singapore</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>$125,250</td>
        -						<td>New York</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>$115,000</td>
        -						<td>San Francisco</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>$75,650</td>
        -						<td>Edinburgh</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>$145,600</td>
        -						<td>New York</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>$356,250</td>
        -						<td>London</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>$103,500</td>
        -						<td>London</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>$86,500</td>
        -						<td>San Francisco</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>$183,000</td>
        -						<td>Edinburgh</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>$183,000</td>
        -						<td>Singapore</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>$112,000</td>
        -						<td>New York</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td {
        -		white-space: nowrap;
        -		padding-left: 40px !important;
        -		padding-right: 40px !important;
        -	}
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li class="active"><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/server-side-processing.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/server-side-processing.html
        deleted file mode 100755
        index 0d976b9f5f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/server-side-processing.html
        +++ /dev/null
        @@ -1,204 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Server-side processing</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 600px;
        -		margin: 0 auto;
        -	}
        -
        -	/* Lots of padding for the cells as SSP has limited data in the demo */
        -	th,
        -	td {
        -		padding-left: 40px !important;
        -		padding-right: 40px !important;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		ajax: "../../../examples/server_side/scripts/server_processing.php",
        -		serverSide: true
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Server-side processing</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows how FixedColumns can be used with server-side processing in DataTables to cope with very large tables. No special considerations are
        -				required, just initialise FixedColumns as you normally would!</p>
        -
        -				<p>Note that the table width is constrained in this example to allow scrolling to occur as the server-side processing data set has a limited number of columns in
        -				this demo!</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		ajax: &quot;../../../examples/server_side/scripts/server_processing.php&quot;,
        -		serverSide: true
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 600px;
        -		margin: 0 auto;
        -	}
        -
        -	/* Lots of padding for the cells as SSP has limited data in the demo */
        -	th,
        -	td {
        -		padding-left: 40px !important;
        -		padding-right: 40px !important;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li class="active"><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/simple.html
        deleted file mode 100755
        index c5b0dcb971..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/simple.html
        +++ /dev/null
        @@ -1,813 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>When displaying a table which scrolls along the x-axis, it can sometimes be useful to the end user for the left most column to be fixed in place, if it shows
        -				grouping, index or similar information. This is basically the same idea as 'freeze columns' in Excel. This can be achieved with the FixedColumns plug-in for
        -				DataTables, as shown below.</p>
        -
        -				<p>Note that FixedColumns is suitable only for use with the scrolling features in <a href="http://datatables.net">DataTables</a>. If you want to achieve a similar
        -				effect without scrolling enabled, please checkout <a href="http://datatables.net/plug-ins">FixedHeader</a>, also for DataTables.</p>
        -
        -				<p>FixedColumns is initialised using the constructor <code>new $.fn.dataTable.FixedColumns();</code> - shown below.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/size_fixed.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/size_fixed.html
        deleted file mode 100755
        index cc17c66afd..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/size_fixed.html
        +++ /dev/null
        @@ -1,824 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Assigned column width</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		margin: 0 auto;
        -	}
        -
        -	div.container {
        -		width: 80%;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').removeAttr('width').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false,
        -		columnDefs: [
        -			{ width: 200, targets: 0 }
        -		]
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Assigned column width</span></h1>
        -
        -			<div class="info">
        -				<p>The columns that are fixed in place by FixedColumns take their width from the parent DataTable. As such, the width of the column can be controlled using the
        -				<a href="//datatables.net/reference/option/columns.width"><code class="option" title="DataTables initialisation option">columns.width<span>DT</span></code></a>
        -				option.</p>
        -
        -				<p>This example shows the first column being set to <code>width: 200px</code> (note that this is not pixel perfect in a table, the browser will make some
        -				adjustments!), a width that is reflected in the fixed column. Resize the browser window horizontally and you will be able to see that the fixed column retains its
        -				width while the scrolling viewport and the table resize.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').removeAttr('width').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false,
        -		columnDefs: [
        -			{ width: 200, targets: 0 }
        -		]
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		margin: 0 auto;
        -	}
        -
        -	div.container {
        -		width: 80%;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li class="active"><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/size_fluid.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/size_fluid.html
        deleted file mode 100755
        index ee533886c8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/size_fluid.html
        +++ /dev/null
        @@ -1,824 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Fluid column width</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		margin: 0 auto;
        -	}
        -
        -	div.container {
        -		width: 80%;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false,
        -		columnDefs: [
        -			{ width: '20%', targets: 0 }
        -		]
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Fluid column width</span></h1>
        -
        -			<div class="info">
        -				<p>The columns that are fixed in place by FixedColumns take their width from the parent DataTable. As such, the width of the column can be controlled using the
        -				<a href="//datatables.net/reference/option/columns.width"><code class="option" title="DataTables initialisation option">columns.width<span>DT</span></code></a>
        -				option.</p>
        -
        -				<p>This example shows the first column being set to <code>width: 20%</code> (note that this is not pixel perfect in a table, the browser will make some
        -				adjustments!), a width that is reflected in the fixed column. Resize the browser window horizontally and you will be able to see that the fixed column retains its
        -				proportional width (again with a small margin dictated by the browser) in the resizing table.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false,
        -		columnDefs: [
        -			{ width: '20%', targets: 0 }
        -		]
        -	} );
        -	new $.fn.dataTable.FixedColumns( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		margin: 0 auto;
        -	}
        -
        -	div.container {
        -		width: 80%;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li class="active"><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/two_columns.html b/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/two_columns.html
        deleted file mode 100755
        index 6c3f233eee..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/examples/two_columns.html
        +++ /dev/null
        @@ -1,810 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedColumns example - Multiple fixed columns</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        "300px",
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 2
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedColumns example <span>Multiple fixed columns</span></h1>
        -
        -			<div class="info">
        -				<p>FixedColumns allows more than one column to be frozen into place using the <code>leftColumns</code> parameter. The example below shows two columns fixed.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY:        &quot;300px&quot;,
        -		scrollX:        true,
        -		scrollCollapse: true,
        -		paging:         false
        -	} );
        -	new $.fn.dataTable.FixedColumns( table, {
        -		leftColumns: 2
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */
        -	th, td { white-space: nowrap; }
        -	div.dataTables_wrapper {
        -		width: 800px;
        -		margin: 0 auto;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./left_right_columns.html">Left and right fixed columns</a></li>
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./two_columns.html">Multiple fixed columns</a></li>
        -							<li><a href="./right_column.html">Right column only</a></li>
        -							<li><a href="./rowspan.html">Complex headers</a></li>
        -							<li><a href="./colvis.html">ColVis integration</a></li>
        -							<li><a href="./server-side-processing.html">Server-side processing</a></li>
        -							<li><a href="./css_size.html">CSS row sizing</a></li>
        -							<li><a href="./size_fixed.html">Assigned column width</a></li>
        -							<li><a href="./size_fluid.html">Fluid column width</a></li>
        -							<li><a href="./col_filter.html">Individual column filtering</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap</a></li>
        -							<li><a href="./index_column.html">Index column</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.js b/resources/assets/js/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.js
        deleted file mode 100755
        index 33c98fad33..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.js
        +++ /dev/null
        @@ -1,1423 +0,0 @@
        -/*! FixedColumns 3.0.4
        - * ©2010-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     FixedColumns
        - * @description Freeze columns in place on a scrolling DataTable
        - * @version     3.0.4
        - * @file        dataTables.fixedColumns.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2010-2014 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -
        -(function(window, document, undefined) {
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -/**
        - * When making use of DataTables' x-axis scrolling feature, you may wish to
        - * fix the left most column in place. This plug-in for DataTables provides
        - * exactly this option (note for non-scrolling tables, please use the
        - * FixedHeader plug-in, which can fix headers, footers and columns). Key
        - * features include:
        - *
        - * * Freezes the left or right most columns to the side of the table
        - * * Option to freeze two or more columns
        - * * Full integration with DataTables' scrolling options
        - * * Speed - FixedColumns is fast in its operation
        - *
        - *  @class
        - *  @constructor
        - *  @global
        - *  @param {object} dt DataTables instance. With DataTables 1.10 this can also
        - *    be a jQuery collection, a jQuery selector, DataTables API instance or
        - *    settings object.
        - *  @param {object} [init={}] Configuration object for FixedColumns. Options are
        - *    defined by {@link FixedColumns.defaults}
        - *
        - *  @requires jQuery 1.7+
        - *  @requires DataTables 1.8.0+
        - *
        - *  @example
        - *      var table = $('#example').dataTable( {
        - *        "scrollX": "100%"
        - *      } );
        - *      new $.fn.dataTable.fixedColumns( table );
        - */
        -var FixedColumns = function ( dt, init ) {
        -	var that = this;
        -
        -	/* Sanity check - you just know it will happen */
        -	if ( ! ( this instanceof FixedColumns ) )
        -	{
        -		alert( "FixedColumns warning: FixedColumns must be initialised with the 'new' keyword." );
        -		return;
        -	}
        -
        -	if ( typeof init == 'undefined' )
        -	{
        -		init = {};
        -	}
        -
        -	// Use the DataTables Hungarian notation mapping method, if it exists to
        -	// provide forwards compatibility for camel case variables
        -	var camelToHungarian = $.fn.dataTable.camelToHungarian;
        -	if ( camelToHungarian ) {
        -		camelToHungarian( FixedColumns.defaults, FixedColumns.defaults, true );
        -		camelToHungarian( FixedColumns.defaults, init );
        -	}
        -
        -	// v1.10 allows the settings object to be got form a number of sources
        -	var dtSettings = $.fn.dataTable.Api ?
        -		new $.fn.dataTable.Api( dt ).settings()[0] :
        -		dt.fnSettings();
        -
        -	/**
        -	 * Settings object which contains customisable information for FixedColumns instance
        -	 * @namespace
        -	 * @extends FixedColumns.defaults
        -	 * @private
        -	 */
        -	this.s = {
        -		/**
        -		 * DataTables settings objects
        -		 *  @type     object
        -		 *  @default  Obtained from DataTables instance
        -		 */
        -		"dt": dtSettings,
        -
        -		/**
        -		 * Number of columns in the DataTable - stored for quick access
        -		 *  @type     int
        -		 *  @default  Obtained from DataTables instance
        -		 */
        -		"iTableColumns": dtSettings.aoColumns.length,
        -
        -		/**
        -		 * Original outer widths of the columns as rendered by DataTables - used to calculate
        -		 * the FixedColumns grid bounding box
        -		 *  @type     array.<int>
        -		 *  @default  []
        -		 */
        -		"aiOuterWidths": [],
        -
        -		/**
        -		 * Original inner widths of the columns as rendered by DataTables - used to apply widths
        -		 * to the columns
        -		 *  @type     array.<int>
        -		 *  @default  []
        -		 */
        -		"aiInnerWidths": []
        -	};
        -
        -
        -	/**
        -	 * DOM elements used by the class instance
        -	 * @namespace
        -	 * @private
        -	 *
        -	 */
        -	this.dom = {
        -		/**
        -		 * DataTables scrolling element
        -		 *  @type     node
        -		 *  @default  null
        -		 */
        -		"scroller": null,
        -
        -		/**
        -		 * DataTables header table
        -		 *  @type     node
        -		 *  @default  null
        -		 */
        -		"header": null,
        -
        -		/**
        -		 * DataTables body table
        -		 *  @type     node
        -		 *  @default  null
        -		 */
        -		"body": null,
        -
        -		/**
        -		 * DataTables footer table
        -		 *  @type     node
        -		 *  @default  null
        -		 */
        -		"footer": null,
        -
        -		/**
        -		 * Display grid elements
        -		 * @namespace
        -		 */
        -		"grid": {
        -			/**
        -			 * Grid wrapper. This is the container element for the 3x3 grid
        -			 *  @type     node
        -			 *  @default  null
        -			 */
        -			"wrapper": null,
        -
        -			/**
        -			 * DataTables scrolling element. This element is the DataTables
        -			 * component in the display grid (making up the main table - i.e.
        -			 * not the fixed columns).
        -			 *  @type     node
        -			 *  @default  null
        -			 */
        -			"dt": null,
        -
        -			/**
        -			 * Left fixed column grid components
        -			 * @namespace
        -			 */
        -			"left": {
        -				"wrapper": null,
        -				"head": null,
        -				"body": null,
        -				"foot": null
        -			},
        -
        -			/**
        -			 * Right fixed column grid components
        -			 * @namespace
        -			 */
        -			"right": {
        -				"wrapper": null,
        -				"head": null,
        -				"body": null,
        -				"foot": null
        -			}
        -		},
        -
        -		/**
        -		 * Cloned table nodes
        -		 * @namespace
        -		 */
        -		"clone": {
        -			/**
        -			 * Left column cloned table nodes
        -			 * @namespace
        -			 */
        -			"left": {
        -				/**
        -				 * Cloned header table
        -				 *  @type     node
        -				 *  @default  null
        -				 */
        -				"header": null,
        -
        -				/**
        -				 * Cloned body table
        -				 *  @type     node
        -				 *  @default  null
        -				 */
        -				"body": null,
        -
        -				/**
        -				 * Cloned footer table
        -				 *  @type     node
        -				 *  @default  null
        -				 */
        -				"footer": null
        -			},
        -
        -			/**
        -			 * Right column cloned table nodes
        -			 * @namespace
        -			 */
        -			"right": {
        -				/**
        -				 * Cloned header table
        -				 *  @type     node
        -				 *  @default  null
        -				 */
        -				"header": null,
        -
        -				/**
        -				 * Cloned body table
        -				 *  @type     node
        -				 *  @default  null
        -				 */
        -				"body": null,
        -
        -				/**
        -				 * Cloned footer table
        -				 *  @type     node
        -				 *  @default  null
        -				 */
        -				"footer": null
        -			}
        -		}
        -	};
        -
        -	/* Attach the instance to the DataTables instance so it can be accessed easily */
        -	dtSettings._oFixedColumns = this;
        -
        -	/* Let's do it */
        -	if ( ! dtSettings._bInitComplete )
        -	{
        -		dtSettings.oApi._fnCallbackReg( dtSettings, 'aoInitComplete', function () {
        -			that._fnConstruct( init );
        -		}, 'FixedColumns' );
        -	}
        -	else
        -	{
        -		this._fnConstruct( init );
        -	}
        -};
        -
        -
        -
        -FixedColumns.prototype = /** @lends FixedColumns.prototype */{
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Update the fixed columns - including headers and footers. Note that FixedColumns will
        -	 * automatically update the display whenever the host DataTable redraws.
        -	 *  @returns {void}
        -	 *  @example
        -	 *      var table = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      var fc = new $.fn.dataTable.fixedColumns( table );
        -	 *
        -	 *      // at some later point when the table has been manipulated....
        -	 *      fc.fnUpdate();
        -	 */
        -	"fnUpdate": function ()
        -	{
        -		this._fnDraw( true );
        -	},
        -
        -
        -	/**
        -	 * Recalculate the resizes of the 3x3 grid that FixedColumns uses for display of the table.
        -	 * This is useful if you update the width of the table container. Note that FixedColumns will
        -	 * perform this function automatically when the window.resize event is fired.
        -	 *  @returns {void}
        -	 *  @example
        -	 *      var table = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      var fc = new $.fn.dataTable.fixedColumns( table );
        -	 *
        -	 *      // Resize the table container and then have FixedColumns adjust its layout....
        -	 *      $('#content').width( 1200 );
        -	 *      fc.fnRedrawLayout();
        -	 */
        -	"fnRedrawLayout": function ()
        -	{
        -		this._fnColCalc();
        -		this._fnGridLayout();
        -		this.fnUpdate();
        -	},
        -
        -
        -	/**
        -	 * Mark a row such that it's height should be recalculated when using 'semiauto' row
        -	 * height matching. This function will have no effect when 'none' or 'auto' row height
        -	 * matching is used.
        -	 *  @param   {Node} nTr TR element that should have it's height recalculated
        -	 *  @returns {void}
        -	 *  @example
        -	 *      var table = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      var fc = new $.fn.dataTable.fixedColumns( table );
        -	 *
        -	 *      // manipulate the table - mark the row as needing an update then update the table
        -	 *      // this allows the redraw performed by DataTables fnUpdate to recalculate the row
        -	 *      // height
        -	 *      fc.fnRecalculateHeight();
        -	 *      table.fnUpdate( $('#example tbody tr:eq(0)')[0], ["insert date", 1, 2, 3 ... ]);
        -	 */
        -	"fnRecalculateHeight": function ( nTr )
        -	{
        -		delete nTr._DTTC_iHeight;
        -		nTr.style.height = 'auto';
        -	},
        -
        -
        -	/**
        -	 * Set the height of a given row - provides cross browser compatibility
        -	 *  @param   {Node} nTarget TR element that should have it's height recalculated
        -	 *  @param   {int} iHeight Height in pixels to set
        -	 *  @returns {void}
        -	 *  @example
        -	 *      var table = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      var fc = new $.fn.dataTable.fixedColumns( table );
        -	 *
        -	 *      // You may want to do this after manipulating a row in the fixed column
        -	 *      fc.fnSetRowHeight( $('#example tbody tr:eq(0)')[0], 50 );
        -	 */
        -	"fnSetRowHeight": function ( nTarget, iHeight )
        -	{
        -		nTarget.style.height = iHeight+"px";
        -	},
        -
        -
        -	/**
        -	 * Get data index information about a row or cell in the table body.
        -	 * This function is functionally identical to fnGetPosition in DataTables,
        -	 * taking the same parameter (TH, TD or TR node) and returning exactly the
        -	 * the same information (data index information). THe difference between
        -	 * the two is that this method takes into account the fixed columns in the
        -	 * table, so you can pass in nodes from the master table, or the cloned
        -	 * tables and get the index position for the data in the main table.
        -	 *  @param {node} node TR, TH or TD element to get the information about
        -	 *  @returns {int} If nNode is given as a TR, then a single index is 
        -	 *    returned, or if given as a cell, an array of [row index, column index
        -	 *    (visible), column index (all)] is given.
        -	 */
        -	"fnGetPosition": function ( node )
        -	{
        -		var idx;
        -		var inst = this.s.dt.oInstance;
        -
        -		if ( ! $(node).parents('.DTFC_Cloned').length )
        -		{
        -			// Not in a cloned table
        -			return inst.fnGetPosition( node );
        -		}
        -		else
        -		{
        -			// Its in the cloned table, so need to look up position
        -			if ( node.nodeName.toLowerCase() === 'tr' ) {
        -				idx = $(node).index();
        -				return inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] );
        -			}
        -			else
        -			{
        -				var colIdx = $(node).index();
        -				idx = $(node.parentNode).index();
        -				var row = inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] );
        -
        -				return [
        -					row,
        -					colIdx,
        -					inst.oApi._fnVisibleToColumnIndex( this.s.dt, colIdx )
        -				];
        -			}
        -		}
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods (they are of course public in JS, but recommended as private)
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Initialisation for FixedColumns
        -	 *  @param   {Object} oInit User settings for initialisation
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnConstruct": function ( oInit )
        -	{
        -		var i, iLen, iWidth,
        -			that = this;
        -
        -		/* Sanity checking */
        -		if ( typeof this.s.dt.oInstance.fnVersionCheck != 'function' ||
        -		     this.s.dt.oInstance.fnVersionCheck( '1.8.0' ) !== true )
        -		{
        -			alert( "FixedColumns "+FixedColumns.VERSION+" required DataTables 1.8.0 or later. "+
        -				"Please upgrade your DataTables installation" );
        -			return;
        -		}
        -
        -		if ( this.s.dt.oScroll.sX === "" )
        -		{
        -			this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "FixedColumns is not needed (no "+
        -				"x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for "+
        -				"column fixing when scrolling is not enabled" );
        -			return;
        -		}
        -
        -		/* Apply the settings from the user / defaults */
        -		this.s = $.extend( true, this.s, FixedColumns.defaults, oInit );
        -
        -		/* Set up the DOM as we need it and cache nodes */
        -		var classes = this.s.dt.oClasses;
        -		this.dom.grid.dt = $(this.s.dt.nTable).parents('div.'+classes.sScrollWrapper)[0];
        -		this.dom.scroller = $('div.'+classes.sScrollBody, this.dom.grid.dt )[0];
        -
        -		/* Set up the DOM that we want for the fixed column layout grid */
        -		this._fnColCalc();
        -		this._fnGridSetup();
        -
        -		/* Event handlers */
        -		var mouseController;
        -
        -		// When the body is scrolled - scroll the left and right columns
        -		$(this.dom.scroller)
        -			.on( 'mouseover.DTFC touchstart.DTFC', function () {
        -				mouseController = 'main';
        -			} )
        -			.on( 'scroll.DTFC', function () {
        -				if ( mouseController === 'main' ) {
        -					if ( that.s.iLeftColumns > 0 ) {
        -						that.dom.grid.left.liner.scrollTop = that.dom.scroller.scrollTop;
        -					}
        -					if ( that.s.iRightColumns > 0 ) {
        -						that.dom.grid.right.liner.scrollTop = that.dom.scroller.scrollTop;
        -					}
        -				}
        -			} );
        -
        -		var wheelType = 'onwheel' in document.createElement('div') ?
        -			'wheel.DTFC' :
        -			'mousewheel.DTFC';
        -
        -		if ( that.s.iLeftColumns > 0 ) {
        -			// When scrolling the left column, scroll the body and right column
        -			$(that.dom.grid.left.liner)
        -				.on( 'mouseover.DTFC touchstart.DTFC', function () {
        -					mouseController = 'left';
        -				} )
        -				.on( 'scroll.DTFC', function () {
        -					if ( mouseController === 'left' ) {
        -						that.dom.scroller.scrollTop = that.dom.grid.left.liner.scrollTop;
        -						if ( that.s.iRightColumns > 0 ) {
        -							that.dom.grid.right.liner.scrollTop = that.dom.grid.left.liner.scrollTop;
        -						}
        -					}
        -				} )
        -				.on( wheelType, function(e) { // xxx update the destroy as well
        -					// Pass horizontal scrolling through
        -					var xDelta = e.type === 'wheel' ?
        -						-e.originalEvent.deltaX :
        -						e.originalEvent.wheelDeltaX;
        -					that.dom.scroller.scrollLeft -= xDelta;
        -				} );
        -		}
        -
        -		if ( that.s.iRightColumns > 0 ) {
        -			// When scrolling the right column, scroll the body and the left column
        -			$(that.dom.grid.right.liner)
        -				.on( 'mouseover.DTFC touchstart.DTFC', function () {
        -					mouseController = 'right';
        -				} )
        -				.on( 'scroll.DTFC', function () {
        -					if ( mouseController === 'right' ) {
        -						that.dom.scroller.scrollTop = that.dom.grid.right.liner.scrollTop;
        -						if ( that.s.iLeftColumns > 0 ) {
        -							that.dom.grid.left.liner.scrollTop = that.dom.grid.right.liner.scrollTop;
        -						}
        -					}
        -				} )
        -				.on( wheelType, function(e) {
        -					// Pass horizontal scrolling through
        -					var xDelta = e.type === 'wheel' ?
        -						-e.originalEvent.deltaX :
        -						e.originalEvent.wheelDeltaX;
        -					that.dom.scroller.scrollLeft -= xDelta;
        -				} );
        -		}
        -
        -		$(window).on( 'resize.DTFC', function () {
        -			that._fnGridLayout.call( that );
        -		} );
        -
        -		var bFirstDraw = true;
        -		var jqTable = $(this.s.dt.nTable);
        -
        -		jqTable
        -			.on( 'draw.dt.DTFC', function () {
        -				that._fnDraw.call( that, bFirstDraw );
        -				bFirstDraw = false;
        -			} )
        -			.on( 'column-sizing.dt.DTFC', function () {
        -				that._fnColCalc();
        -				that._fnGridLayout( that );
        -			} )
        -			.on( 'column-visibility.dt.DTFC', function () {
        -				that._fnColCalc();
        -				that._fnGridLayout( that );
        -				that._fnDraw( true );
        -			} )
        -			.on( 'destroy.dt.DTFC', function () {
        -				jqTable.off( 'column-sizing.dt.DTFC destroy.dt.DTFC draw.dt.DTFC' );
        -
        -				$(that.dom.scroller).off( 'scroll.DTFC mouseover.DTFC' );
        -				$(window).off( 'resize.DTFC' );
        -
        -				$(that.dom.grid.left.liner).off( 'scroll.DTFC mouseover.DTFC '+wheelType );
        -				$(that.dom.grid.left.wrapper).remove();
        -
        -				$(that.dom.grid.right.liner).off( 'scroll.DTFC mouseover.DTFC '+wheelType );
        -				$(that.dom.grid.right.wrapper).remove();
        -			} );
        -
        -		/* Get things right to start with - note that due to adjusting the columns, there must be
        -		 * another redraw of the main table. It doesn't need to be a full redraw however.
        -		 */
        -		this._fnGridLayout();
        -		this.s.dt.oInstance.fnDraw(false);
        -	},
        -
        -
        -	/**
        -	 * Calculate the column widths for the grid layout
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnColCalc": function ()
        -	{
        -		var that = this;
        -		var iLeftWidth = 0;
        -		var iRightWidth = 0;
        -
        -		this.s.aiInnerWidths = [];
        -		this.s.aiOuterWidths = [];
        -
        -		$.each( this.s.dt.aoColumns, function (i, col) {
        -			var th = $(col.nTh);
        -			var border;
        -
        -			if ( ! th.filter(':visible').length ) {
        -				that.s.aiInnerWidths.push( 0 );
        -				that.s.aiOuterWidths.push( 0 );
        -			}
        -			else
        -			{
        -				// Inner width is used to assign widths to cells
        -				// Outer width is used to calculate the container
        -				var iWidth = th.outerWidth();
        -
        -				// When working with the left most-cell, need to add on the
        -				// table's border to the outerWidth, since we need to take
        -				// account of it, but it isn't in any cell
        -				if ( that.s.aiOuterWidths.length === 0 ) {
        -					border = $(that.s.dt.nTable).css('border-left-width');
        -					iWidth += typeof border === 'string' ? 1 : parseInt( border, 10 );
        -				}
        -
        -				// Likewise with the final column on the right
        -				if ( that.s.aiOuterWidths.length === that.s.dt.aoColumns.length-1 ) {
        -					border = $(that.s.dt.nTable).css('border-right-width');
        -					iWidth += typeof border === 'string' ? 1 : parseInt( border, 10 );
        -				}
        -
        -				that.s.aiOuterWidths.push( iWidth );
        -				that.s.aiInnerWidths.push( th.width() );
        -
        -				if ( i < that.s.iLeftColumns )
        -				{
        -					iLeftWidth += iWidth;
        -				}
        -
        -				if ( that.s.iTableColumns-that.s.iRightColumns <= i )
        -				{
        -					iRightWidth += iWidth;
        -				}
        -			}
        -		} );
        -
        -		this.s.iLeftWidth = iLeftWidth;
        -		this.s.iRightWidth = iRightWidth;
        -	},
        -
        -
        -	/**
        -	 * Set up the DOM for the fixed column. The way the layout works is to create a 1x3 grid
        -	 * for the left column, the DataTable (for which we just reuse the scrolling element DataTable
        -	 * puts into the DOM) and the right column. In each of he two fixed column elements there is a
        -	 * grouping wrapper element and then a head, body and footer wrapper. In each of these we then
        -	 * place the cloned header, body or footer tables. This effectively gives as 3x3 grid structure.
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnGridSetup": function ()
        -	{
        -		var that = this;
        -		var oOverflow = this._fnDTOverflow();
        -		var block;
        -
        -		this.dom.body = this.s.dt.nTable;
        -		this.dom.header = this.s.dt.nTHead.parentNode;
        -		this.dom.header.parentNode.parentNode.style.position = "relative";
        -
        -		var nSWrapper =
        -			$('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;">'+
        -				'<div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;">'+
        -					'<div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+
        -					'<div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;">'+
        -						'<div class="DTFC_LeftBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+
        -					'</div>'+
        -					'<div class="DTFC_LeftFootWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+
        -				'</div>'+
        -				'<div class="DTFC_RightWrapper" style="position:absolute; top:0; left:0;">'+
        -					'<div class="DTFC_RightHeadWrapper" style="position:relative; top:0; left:0;">'+
        -						'<div class="DTFC_RightHeadBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+
        -					'</div>'+
        -					'<div class="DTFC_RightBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;">'+
        -						'<div class="DTFC_RightBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+
        -					'</div>'+
        -					'<div class="DTFC_RightFootWrapper" style="position:relative; top:0; left:0;">'+
        -						'<div class="DTFC_RightFootBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+
        -					'</div>'+
        -				'</div>'+
        -			'</div>')[0];
        -		var nLeft = nSWrapper.childNodes[0];
        -		var nRight = nSWrapper.childNodes[1];
        -
        -		this.dom.grid.dt.parentNode.insertBefore( nSWrapper, this.dom.grid.dt );
        -		nSWrapper.appendChild( this.dom.grid.dt );
        -
        -		this.dom.grid.wrapper = nSWrapper;
        -
        -		if ( this.s.iLeftColumns > 0 )
        -		{
        -			this.dom.grid.left.wrapper = nLeft;
        -			this.dom.grid.left.head = nLeft.childNodes[0];
        -			this.dom.grid.left.body = nLeft.childNodes[1];
        -			this.dom.grid.left.liner = $('div.DTFC_LeftBodyLiner', nSWrapper)[0];
        -
        -			nSWrapper.appendChild( nLeft );
        -		}
        -
        -		if ( this.s.iRightColumns > 0 )
        -		{
        -			this.dom.grid.right.wrapper = nRight;
        -			this.dom.grid.right.head = nRight.childNodes[0];
        -			this.dom.grid.right.body = nRight.childNodes[1];
        -			this.dom.grid.right.liner = $('div.DTFC_RightBodyLiner', nSWrapper)[0];
        -
        -			block = $('div.DTFC_RightHeadBlocker', nSWrapper)[0];
        -			block.style.width = oOverflow.bar+"px";
        -			block.style.right = -oOverflow.bar+"px";
        -			this.dom.grid.right.headBlock = block;
        -
        -			block = $('div.DTFC_RightFootBlocker', nSWrapper)[0];
        -			block.style.width = oOverflow.bar+"px";
        -			block.style.right = -oOverflow.bar+"px";
        -			this.dom.grid.right.footBlock = block;
        -
        -			nSWrapper.appendChild( nRight );
        -		}
        -
        -		if ( this.s.dt.nTFoot )
        -		{
        -			this.dom.footer = this.s.dt.nTFoot.parentNode;
        -			if ( this.s.iLeftColumns > 0 )
        -			{
        -				this.dom.grid.left.foot = nLeft.childNodes[2];
        -			}
        -			if ( this.s.iRightColumns > 0 )
        -			{
        -				this.dom.grid.right.foot = nRight.childNodes[2];
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Style and position the grid used for the FixedColumns layout
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnGridLayout": function ()
        -	{
        -		var oGrid = this.dom.grid;
        -		var iWidth = $(oGrid.wrapper).width();
        -		var iBodyHeight = $(this.s.dt.nTable.parentNode).outerHeight();
        -		var iFullHeight = $(this.s.dt.nTable.parentNode.parentNode).outerHeight();
        -		var oOverflow = this._fnDTOverflow();
        -		var
        -			iLeftWidth = this.s.iLeftWidth,
        -			iRightWidth = this.s.iRightWidth,
        -			iRight;
        -		var scrollbarAdjust = function ( node, width ) {
        -			if ( ! oOverflow.bar ) {
        -				// If there is no scrollbar (Macs) we need to hide the auto scrollbar
        -				node.style.width = (width+20)+"px";
        -				node.style.paddingRight = "20px";
        -				node.style.boxSizing = "border-box";
        -			}
        -			else {
        -				// Otherwise just overflow by the scrollbar
        -				node.style.width = (width+oOverflow.bar)+"px";
        -			}
        -		};
        -
        -		// When x scrolling - don't paint the fixed columns over the x scrollbar
        -		if ( oOverflow.x )
        -		{
        -			iBodyHeight -= oOverflow.bar;
        -		}
        -
        -		oGrid.wrapper.style.height = iFullHeight+"px";
        -
        -		if ( this.s.iLeftColumns > 0 )
        -		{
        -			oGrid.left.wrapper.style.width = iLeftWidth+"px";
        -			oGrid.left.wrapper.style.height = "1px";
        -			oGrid.left.body.style.height = iBodyHeight+"px";
        -			if ( oGrid.left.foot ) {
        -				oGrid.left.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; // shift footer for scrollbar
        -			}
        -
        -			scrollbarAdjust( oGrid.left.liner, iLeftWidth );
        -			oGrid.left.liner.style.height = iBodyHeight+"px";
        -		}
        -
        -		if ( this.s.iRightColumns > 0 )
        -		{
        -			iRight = iWidth - iRightWidth;
        -			if ( oOverflow.y )
        -			{
        -				iRight -= oOverflow.bar;
        -			}
        -
        -			oGrid.right.wrapper.style.width = iRightWidth+"px";
        -			oGrid.right.wrapper.style.left = iRight+"px";
        -			oGrid.right.wrapper.style.height = "1px";
        -			oGrid.right.body.style.height = iBodyHeight+"px";
        -			if ( oGrid.right.foot ) {
        -				oGrid.right.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px";
        -			}
        -
        -			scrollbarAdjust( oGrid.right.liner, iRightWidth );
        -			oGrid.right.liner.style.height = iBodyHeight+"px";
        -
        -			oGrid.right.headBlock.style.display = oOverflow.y ? 'block' : 'none';
        -			oGrid.right.footBlock.style.display = oOverflow.y ? 'block' : 'none';
        -		}
        -	},
        -
        -
        -	/**
        -	 * Get information about the DataTable's scrolling state - specifically if the table is scrolling
        -	 * on either the x or y axis, and also the scrollbar width.
        -	 *  @returns {object} Information about the DataTables scrolling state with the properties:
        -	 *    'x', 'y' and 'bar'
        -	 *  @private
        -	 */
        -	"_fnDTOverflow": function ()
        -	{
        -		var nTable = this.s.dt.nTable;
        -		var nTableScrollBody = nTable.parentNode;
        -		var out = {
        -			"x": false,
        -			"y": false,
        -			"bar": this.s.dt.oScroll.iBarWidth
        -		};
        -
        -		if ( nTable.offsetWidth > nTableScrollBody.clientWidth )
        -		{
        -			out.x = true;
        -		}
        -
        -		if ( nTable.offsetHeight > nTableScrollBody.clientHeight )
        -		{
        -			out.y = true;
        -		}
        -
        -		return out;
        -	},
        -
        -
        -	/**
        -	 * Clone and position the fixed columns
        -	 *  @returns {void}
        -	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
        -	 *  @private
        -	 */
        -	"_fnDraw": function ( bAll )
        -	{
        -		this._fnGridLayout();
        -		this._fnCloneLeft( bAll );
        -		this._fnCloneRight( bAll );
        -
        -		/* Draw callback function */
        -		if ( this.s.fnDrawCallback !== null )
        -		{
        -			this.s.fnDrawCallback.call( this, this.dom.clone.left, this.dom.clone.right );
        -		}
        -
        -		/* Event triggering */
        -		$(this).trigger( 'draw.dtfc', {
        -			"leftClone": this.dom.clone.left,
        -			"rightClone": this.dom.clone.right
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Clone the right columns
        -	 *  @returns {void}
        -	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
        -	 *  @private
        -	 */
        -	"_fnCloneRight": function ( bAll )
        -	{
        -		if ( this.s.iRightColumns <= 0 ) {
        -			return;
        -		}
        -
        -		var that = this,
        -			i, jq,
        -			aiColumns = [];
        -
        -		for ( i=this.s.iTableColumns-this.s.iRightColumns ; i<this.s.iTableColumns ; i++ ) {
        -			if ( this.s.dt.aoColumns[i].bVisible ) {
        -				aiColumns.push( i );
        -			}
        -		}
        -
        -		this._fnClone( this.dom.clone.right, this.dom.grid.right, aiColumns, bAll );
        -	},
        -
        -
        -	/**
        -	 * Clone the left columns
        -	 *  @returns {void}
        -	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
        -	 *  @private
        -	 */
        -	"_fnCloneLeft": function ( bAll )
        -	{
        -		if ( this.s.iLeftColumns <= 0 ) {
        -			return;
        -		}
        -
        -		var that = this,
        -			i, jq,
        -			aiColumns = [];
        -
        -		for ( i=0 ; i<this.s.iLeftColumns ; i++ ) {
        -			if ( this.s.dt.aoColumns[i].bVisible ) {
        -				aiColumns.push( i );
        -			}
        -		}
        -
        -		this._fnClone( this.dom.clone.left, this.dom.grid.left, aiColumns, bAll );
        -	},
        -
        -
        -	/**
        -	 * Make a copy of the layout object for a header or footer element from DataTables. Note that
        -	 * this method will clone the nodes in the layout object.
        -	 *  @returns {Array} Copy of the layout array
        -	 *  @param   {Object} aoOriginal Layout array from DataTables (aoHeader or aoFooter)
        -	 *  @param   {Object} aiColumns Columns to copy
        -	 *  @private
        -	 */
        -	"_fnCopyLayout": function ( aoOriginal, aiColumns )
        -	{
        -		var aReturn = [];
        -		var aClones = [];
        -		var aCloned = [];
        -
        -		for ( var i=0, iLen=aoOriginal.length ; i<iLen ; i++ )
        -		{
        -			var aRow = [];
        -			aRow.nTr = $(aoOriginal[i].nTr).clone(true, true)[0];
        -
        -			for ( var j=0, jLen=this.s.iTableColumns ; j<jLen ; j++ )
        -			{
        -				if ( $.inArray( j, aiColumns ) === -1 )
        -				{
        -					continue;
        -				}
        -
        -				var iCloned = $.inArray( aoOriginal[i][j].cell, aCloned );
        -				if ( iCloned === -1 )
        -				{
        -					var nClone = $(aoOriginal[i][j].cell).clone(true, true)[0];
        -					aClones.push( nClone );
        -					aCloned.push( aoOriginal[i][j].cell );
        -
        -					aRow.push( {
        -						"cell": nClone,
        -						"unique": aoOriginal[i][j].unique
        -					} );
        -				}
        -				else
        -				{
        -					aRow.push( {
        -						"cell": aClones[ iCloned ],
        -						"unique": aoOriginal[i][j].unique
        -					} );
        -				}
        -			}
        -
        -			aReturn.push( aRow );
        -		}
        -
        -		return aReturn;
        -	},
        -
        -
        -	/**
        -	 * Clone the DataTable nodes and place them in the DOM (sized correctly)
        -	 *  @returns {void}
        -	 *  @param   {Object} oClone Object containing the header, footer and body cloned DOM elements
        -	 *  @param   {Object} oGrid Grid object containing the display grid elements for the cloned
        -	 *                    column (left or right)
        -	 *  @param   {Array} aiColumns Column indexes which should be operated on from the DataTable
        -	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
        -	 *  @private
        -	 */
        -	"_fnClone": function ( oClone, oGrid, aiColumns, bAll )
        -	{
        -		var that = this,
        -			i, iLen, j, jLen, jq, nTarget, iColumn, nClone, iIndex, aoCloneLayout,
        -			jqCloneThead, aoFixedHeader,
        -			dt = this.s.dt;
        -
        -		/*
        -		 * Header
        -		 */
        -		if ( bAll )
        -		{
        -			if ( oClone.header !== null )
        -			{
        -				oClone.header.parentNode.removeChild( oClone.header );
        -			}
        -			oClone.header = $(this.dom.header).clone(true, true)[0];
        -			oClone.header.className += " DTFC_Cloned";
        -			oClone.header.style.width = "100%";
        -			oGrid.head.appendChild( oClone.header );
        -
        -			/* Copy the DataTables layout cache for the header for our floating column */
        -			aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns );
        -			jqCloneThead = $('>thead', oClone.header);
        -			jqCloneThead.empty();
        -
        -			/* Add the created cloned TR elements to the table */
        -			for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
        -			{
        -				jqCloneThead[0].appendChild( aoCloneLayout[i].nTr );
        -			}
        -
        -			/* Use the handy _fnDrawHead function in DataTables to do the rowspan/colspan
        -			 * calculations for us
        -			 */
        -			dt.oApi._fnDrawHead( dt, aoCloneLayout, true );
        -		}
        -		else
        -		{
        -			/* To ensure that we copy cell classes exactly, regardless of colspan, multiple rows
        -			 * etc, we make a copy of the header from the DataTable again, but don't insert the
        -			 * cloned cells, just copy the classes across. To get the matching layout for the
        -			 * fixed component, we use the DataTables _fnDetectHeader method, allowing 1:1 mapping
        -			 */
        -			aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns );
        -			aoFixedHeader=[];
        -
        -			dt.oApi._fnDetectHeader( aoFixedHeader, $('>thead', oClone.header)[0] );
        -
        -			for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
        -			{
        -				for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ )
        -				{
        -					aoFixedHeader[i][j].cell.className = aoCloneLayout[i][j].cell.className;
        -
        -					// If jQuery UI theming is used we need to copy those elements as well
        -					$('span.DataTables_sort_icon', aoFixedHeader[i][j].cell).each( function () {
        -						this.className = $('span.DataTables_sort_icon', aoCloneLayout[i][j].cell)[0].className;
        -					} );
        -				}
        -			}
        -		}
        -		this._fnEqualiseHeights( 'thead', this.dom.header, oClone.header );
        -
        -		/*
        -		 * Body
        -		 */
        -		if ( this.s.sHeightMatch == 'auto' )
        -		{
        -			/* Remove any heights which have been applied already and let the browser figure it out */
        -			$('>tbody>tr', that.dom.body).css('height', 'auto');
        -		}
        -
        -		if ( oClone.body !== null )
        -		{
        -			oClone.body.parentNode.removeChild( oClone.body );
        -			oClone.body = null;
        -		}
        -
        -		oClone.body = $(this.dom.body).clone(true)[0];
        -		oClone.body.className += " DTFC_Cloned";
        -		oClone.body.style.paddingBottom = dt.oScroll.iBarWidth+"px";
        -		oClone.body.style.marginBottom = (dt.oScroll.iBarWidth*2)+"px"; /* For IE */
        -		if ( oClone.body.getAttribute('id') !== null )
        -		{
        -			oClone.body.removeAttribute('id');
        -		}
        -
        -		$('>thead>tr', oClone.body).empty();
        -		$('>tfoot', oClone.body).remove();
        -
        -		var nBody = $('tbody', oClone.body)[0];
        -		$(nBody).empty();
        -		if ( dt.aiDisplay.length > 0 )
        -		{
        -			/* Copy the DataTables' header elements to force the column width in exactly the
        -			 * same way that DataTables does it - have the header element, apply the width and
        -			 * colapse it down
        -			 */
        -			var nInnerThead = $('>thead>tr', oClone.body)[0];
        -			for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ )
        -			{
        -				iColumn = aiColumns[iIndex];
        -
        -				nClone = $(dt.aoColumns[iColumn].nTh).clone(true)[0];
        -				nClone.innerHTML = "";
        -
        -				var oStyle = nClone.style;
        -				oStyle.paddingTop = "0";
        -				oStyle.paddingBottom = "0";
        -				oStyle.borderTopWidth = "0";
        -				oStyle.borderBottomWidth = "0";
        -				oStyle.height = 0;
        -				oStyle.width = that.s.aiInnerWidths[iColumn]+"px";
        -
        -				nInnerThead.appendChild( nClone );
        -			}
        -
        -			/* Add in the tbody elements, cloning form the master table */
        -			$('>tbody>tr', that.dom.body).each( function (z) {
        -				var n = this.cloneNode(false);
        -				n.removeAttribute('id');
        -				var i = that.s.dt.oFeatures.bServerSide===false ?
        -					that.s.dt.aiDisplay[ that.s.dt._iDisplayStart+z ] : z;
        -				var aTds = that.s.dt.aoData[ i ].anCells || $(this).children('td, th');
        -
        -				for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ )
        -				{
        -					iColumn = aiColumns[iIndex];
        -
        -					if ( aTds.length > 0 )
        -					{
        -						nClone = $( aTds[iColumn] ).clone(true, true)[0];
        -						n.appendChild( nClone );
        -					}
        -				}
        -				nBody.appendChild( n );
        -			} );
        -		}
        -		else
        -		{
        -			$('>tbody>tr', that.dom.body).each( function (z) {
        -				nClone = this.cloneNode(true);
        -				nClone.className += ' DTFC_NoData';
        -				$('td', nClone).html('');
        -				nBody.appendChild( nClone );
        -			} );
        -		}
        -
        -		oClone.body.style.width = "100%";
        -		oClone.body.style.margin = "0";
        -		oClone.body.style.padding = "0";
        -
        -		// Interop with Scroller - need to use a height forcing element in the
        -		// scrolling area in the same way that Scroller does in the body scroll.
        -		if ( dt.oScroller !== undefined )
        -		{
        -			var scrollerForcer = dt.oScroller.dom.force;
        -
        -			if ( ! oGrid.forcer ) {
        -				oGrid.forcer = scrollerForcer.cloneNode( true );
        -				oGrid.liner.appendChild( oGrid.forcer );
        -			}
        -			else {
        -				oGrid.forcer.style.height = scrollerForcer.style.height;
        -			}
        -		}
        -
        -		oGrid.liner.appendChild( oClone.body );
        -
        -		this._fnEqualiseHeights( 'tbody', that.dom.body, oClone.body );
        -
        -		/*
        -		 * Footer
        -		 */
        -		if ( dt.nTFoot !== null )
        -		{
        -			if ( bAll )
        -			{
        -				if ( oClone.footer !== null )
        -				{
        -					oClone.footer.parentNode.removeChild( oClone.footer );
        -				}
        -				oClone.footer = $(this.dom.footer).clone(true, true)[0];
        -				oClone.footer.className += " DTFC_Cloned";
        -				oClone.footer.style.width = "100%";
        -				oGrid.foot.appendChild( oClone.footer );
        -
        -				/* Copy the footer just like we do for the header */
        -				aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns );
        -				var jqCloneTfoot = $('>tfoot', oClone.footer);
        -				jqCloneTfoot.empty();
        -
        -				for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
        -				{
        -					jqCloneTfoot[0].appendChild( aoCloneLayout[i].nTr );
        -				}
        -				dt.oApi._fnDrawHead( dt, aoCloneLayout, true );
        -			}
        -			else
        -			{
        -				aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns );
        -				var aoCurrFooter=[];
        -
        -				dt.oApi._fnDetectHeader( aoCurrFooter, $('>tfoot', oClone.footer)[0] );
        -
        -				for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
        -				{
        -					for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ )
        -					{
        -						aoCurrFooter[i][j].cell.className = aoCloneLayout[i][j].cell.className;
        -					}
        -				}
        -			}
        -			this._fnEqualiseHeights( 'tfoot', this.dom.footer, oClone.footer );
        -		}
        -
        -		/* Equalise the column widths between the header footer and body - body get's priority */
        -		var anUnique = dt.oApi._fnGetUniqueThs( dt, $('>thead', oClone.header)[0] );
        -		$(anUnique).each( function (i) {
        -			iColumn = aiColumns[i];
        -			this.style.width = that.s.aiInnerWidths[iColumn]+"px";
        -		} );
        -
        -		if ( that.s.dt.nTFoot !== null )
        -		{
        -			anUnique = dt.oApi._fnGetUniqueThs( dt, $('>tfoot', oClone.footer)[0] );
        -			$(anUnique).each( function (i) {
        -				iColumn = aiColumns[i];
        -				this.style.width = that.s.aiInnerWidths[iColumn]+"px";
        -			} );
        -		}
        -	},
        -
        -
        -	/**
        -	 * From a given table node (THEAD etc), get a list of TR direct child elements
        -	 *  @param   {Node} nIn Table element to search for TR elements (THEAD, TBODY or TFOOT element)
        -	 *  @returns {Array} List of TR elements found
        -	 *  @private
        -	 */
        -	"_fnGetTrNodes": function ( nIn )
        -	{
        -		var aOut = [];
        -		for ( var i=0, iLen=nIn.childNodes.length ; i<iLen ; i++ )
        -		{
        -			if ( nIn.childNodes[i].nodeName.toUpperCase() == "TR" )
        -			{
        -				aOut.push( nIn.childNodes[i] );
        -			}
        -		}
        -		return aOut;
        -	},
        -
        -
        -	/**
        -	 * Equalise the heights of the rows in a given table node in a cross browser way
        -	 *  @returns {void}
        -	 *  @param   {String} nodeName Node type - thead, tbody or tfoot
        -	 *  @param   {Node} original Original node to take the heights from
        -	 *  @param   {Node} clone Copy the heights to
        -	 *  @private
        -	 */
        -	"_fnEqualiseHeights": function ( nodeName, original, clone )
        -	{
        -		if ( this.s.sHeightMatch == 'none' && nodeName !== 'thead' && nodeName !== 'tfoot' )
        -		{
        -			return;
        -		}
        -
        -		var that = this,
        -			i, iLen, iHeight, iHeight2, iHeightOriginal, iHeightClone,
        -			rootOriginal = original.getElementsByTagName(nodeName)[0],
        -			rootClone    = clone.getElementsByTagName(nodeName)[0],
        -			jqBoxHack    = $('>'+nodeName+'>tr:eq(0)', original).children(':first'),
        -			iBoxHack     = jqBoxHack.outerHeight() - jqBoxHack.height(),
        -			anOriginal   = this._fnGetTrNodes( rootOriginal ),
        -			anClone      = this._fnGetTrNodes( rootClone ),
        -			heights      = [];
        -
        -		for ( i=0, iLen=anClone.length ; i<iLen ; i++ )
        -		{
        -			iHeightOriginal = anOriginal[i].offsetHeight;
        -			iHeightClone = anClone[i].offsetHeight;
        -			iHeight = iHeightClone > iHeightOriginal ? iHeightClone : iHeightOriginal;
        -
        -			if ( this.s.sHeightMatch == 'semiauto' )
        -			{
        -				anOriginal[i]._DTTC_iHeight = iHeight;
        -			}
        -
        -			heights.push( iHeight );
        -		}
        -
        -		for ( i=0, iLen=anClone.length ; i<iLen ; i++ )
        -		{
        -			anClone[i].style.height = heights[i]+"px";
        -			anOriginal[i].style.height = heights[i]+"px";
        -		}
        -	}
        -};
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Statics
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * FixedColumns default settings for initialisation
        - *  @name FixedColumns.defaults
        - *  @namespace
        - *  @static
        - */
        -FixedColumns.defaults = /** @lends FixedColumns.defaults */{
        -	/**
        -	 * Number of left hand columns to fix in position
        -	 *  @type     int
        -	 *  @default  1
        -	 *  @static
        -	 *  @example
        -	 *      var  = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      new $.fn.dataTable.fixedColumns( table, {
        -	 *          "leftColumns": 2
        -	 *      } );
        -	 */
        -	"iLeftColumns": 1,
        -
        -	/**
        -	 * Number of right hand columns to fix in position
        -	 *  @type     int
        -	 *  @default  0
        -	 *  @static
        -	 *  @example
        -	 *      var table = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      new $.fn.dataTable.fixedColumns( table, {
        -	 *          "rightColumns": 1
        -	 *      } );
        -	 */
        -	"iRightColumns": 0,
        -
        -	/**
        -	 * Draw callback function which is called when FixedColumns has redrawn the fixed assets
        -	 *  @type     function(object, object):void
        -	 *  @default  null
        -	 *  @static
        -	 *  @example
        -	 *      var table = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      new $.fn.dataTable.fixedColumns( table, {
        -	 *          "drawCallback": function () {
        -	 *	            alert( "FixedColumns redraw" );
        -	 *	        }
        -	 *      } );
        -	 */
        -	"fnDrawCallback": null,
        -
        -	/**
        -	 * Height matching algorthim to use. This can be "none" which will result in no height
        -	 * matching being applied by FixedColumns (height matching could be forced by CSS in this
        -	 * case), "semiauto" whereby the height calculation will be performed once, and the result
        -	 * cached to be used again (fnRecalculateHeight can be used to force recalculation), or
        -	 * "auto" when height matching is performed on every draw (slowest but must accurate)
        -	 *  @type     string
        -	 *  @default  semiauto
        -	 *  @static
        -	 *  @example
        -	 *      var table = $('#example').dataTable( {
        -	 *          "scrollX": "100%"
        -	 *      } );
        -	 *      new $.fn.dataTable.fixedColumns( table, {
        -	 *          "heightMatch": "auto"
        -	 *      } );
        -	 */
        -	"sHeightMatch": "semiauto"
        -};
        -
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Constants
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * FixedColumns version
        - *  @name      FixedColumns.version
        - *  @type      String
        - *  @default   See code
        - *  @static
        - */
        -FixedColumns.version = "3.0.4";
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Fired events (for documentation)
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -
        -/**
        - * Event fired whenever FixedColumns redraws the fixed columns (i.e. clones the table elements from the main DataTable). This will occur whenever the DataTable that the FixedColumns instance is attached does its own draw.
        - * @name FixedColumns#draw.dtfc
        - * @event
        - * @param {event} e jQuery event object
        - * @param {object} o Event parameters from FixedColumns
        - * @param {object} o.leftClone Instance's object dom.clone.left for easy reference. This object contains references to the left fixed clumn column's nodes
        - * @param {object} o.rightClone Instance's object dom.clone.right for easy reference. This object contains references to the right fixed clumn column's nodes
        - */
        -
        -
        -// Make FixedColumns accessible from the DataTables instance
        -$.fn.dataTable.FixedColumns = FixedColumns;
        -$.fn.DataTable.FixedColumns = FixedColumns;
        -
        -
        -return FixedColumns;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.FixedColumns ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.min.js b/resources/assets/js/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.min.js
        deleted file mode 100755
        index 69878307bc..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.min.js
        +++ /dev/null
        @@ -1,30 +0,0 @@
        -/*!
        - FixedColumns 3.0.4
        - ©2010-2014 SpryMedia Ltd - datatables.net/license
        -*/
        -(function(r,s,t){var p=function(d){var j=function(a,b){var c=this;if(this instanceof j){"undefined"==typeof b&&(b={});var g=d.fn.dataTable.camelToHungarian;g&&(g(j.defaults,j.defaults,!0),g(j.defaults,b));g=d.fn.dataTable.Api?(new d.fn.dataTable.Api(a)).settings()[0]:a.fnSettings();this.s={dt:g,iTableColumns:g.aoColumns.length,aiOuterWidths:[],aiInnerWidths:[]};this.dom={scroller:null,header:null,body:null,footer:null,grid:{wrapper:null,dt:null,left:{wrapper:null,head:null,body:null,foot:null},right:{wrapper:null,
        -head:null,body:null,foot:null}},clone:{left:{header:null,body:null,footer:null},right:{header:null,body:null,footer:null}}};g._oFixedColumns=this;g._bInitComplete?this._fnConstruct(b):g.oApi._fnCallbackReg(g,"aoInitComplete",function(){c._fnConstruct(b)},"FixedColumns")}else alert("FixedColumns warning: FixedColumns must be initialised with the 'new' keyword.")};j.prototype={fnUpdate:function(){this._fnDraw(!0)},fnRedrawLayout:function(){this._fnColCalc();this._fnGridLayout();this.fnUpdate()},fnRecalculateHeight:function(a){delete a._DTTC_iHeight;
        -a.style.height="auto"},fnSetRowHeight:function(a,b){a.style.height=b+"px"},fnGetPosition:function(a){var b=this.s.dt.oInstance;if(d(a).parents(".DTFC_Cloned").length){if("tr"===a.nodeName.toLowerCase())return a=d(a).index(),b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]);var c=d(a).index(),a=d(a.parentNode).index();return[b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]),c,b.oApi._fnVisibleToColumnIndex(this.s.dt,c)]}return b.fnGetPosition(a)},_fnConstruct:function(a){var b=this;if("function"!=typeof this.s.dt.oInstance.fnVersionCheck||
        -!0!==this.s.dt.oInstance.fnVersionCheck("1.8.0"))alert("FixedColumns "+j.VERSION+" required DataTables 1.8.0 or later. Please upgrade your DataTables installation");else if(""===this.s.dt.oScroll.sX)this.s.dt.oInstance.oApi._fnLog(this.s.dt,1,"FixedColumns is not needed (no x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for column fixing when scrolling is not enabled");else{this.s=d.extend(!0,this.s,j.defaults,a);a=this.s.dt.oClasses;this.dom.grid.dt=d(this.s.dt.nTable).parents("div."+
        -a.sScrollWrapper)[0];this.dom.scroller=d("div."+a.sScrollBody,this.dom.grid.dt)[0];this._fnColCalc();this._fnGridSetup();var c;d(this.dom.scroller).on("mouseover.DTFC touchstart.DTFC",function(){c="main"}).on("scroll.DTFC",function(){if("main"===c&&(0<b.s.iLeftColumns&&(b.dom.grid.left.liner.scrollTop=b.dom.scroller.scrollTop),0<b.s.iRightColumns))b.dom.grid.right.liner.scrollTop=b.dom.scroller.scrollTop});var g="onwheel"in s.createElement("div")?"wheel.DTFC":"mousewheel.DTFC";if(0<b.s.iLeftColumns)d(b.dom.grid.left.liner).on("mouseover.DTFC touchstart.DTFC",
        -function(){c="left"}).on("scroll.DTFC",function(){"left"===c&&(b.dom.scroller.scrollTop=b.dom.grid.left.liner.scrollTop,0<b.s.iRightColumns&&(b.dom.grid.right.liner.scrollTop=b.dom.grid.left.liner.scrollTop))}).on(g,function(a){b.dom.scroller.scrollLeft-="wheel"===a.type?-a.originalEvent.deltaX:a.originalEvent.wheelDeltaX});if(0<b.s.iRightColumns)d(b.dom.grid.right.liner).on("mouseover.DTFC touchstart.DTFC",function(){c="right"}).on("scroll.DTFC",function(){"right"===c&&(b.dom.scroller.scrollTop=
        -b.dom.grid.right.liner.scrollTop,0<b.s.iLeftColumns&&(b.dom.grid.left.liner.scrollTop=b.dom.grid.right.liner.scrollTop))}).on(g,function(a){b.dom.scroller.scrollLeft-="wheel"===a.type?-a.originalEvent.deltaX:a.originalEvent.wheelDeltaX});d(r).on("resize.DTFC",function(){b._fnGridLayout.call(b)});var f=!0,e=d(this.s.dt.nTable);e.on("draw.dt.DTFC",function(){b._fnDraw.call(b,f);f=!1}).on("column-sizing.dt.DTFC",function(){b._fnColCalc();b._fnGridLayout(b)}).on("column-visibility.dt.DTFC",function(){b._fnColCalc();
        -b._fnGridLayout(b);b._fnDraw(!0)}).on("destroy.dt.DTFC",function(){e.off("column-sizing.dt.DTFC destroy.dt.DTFC draw.dt.DTFC");d(b.dom.scroller).off("scroll.DTFC mouseover.DTFC");d(r).off("resize.DTFC");d(b.dom.grid.left.liner).off("scroll.DTFC mouseover.DTFC "+g);d(b.dom.grid.left.wrapper).remove();d(b.dom.grid.right.liner).off("scroll.DTFC mouseover.DTFC "+g);d(b.dom.grid.right.wrapper).remove()});this._fnGridLayout();this.s.dt.oInstance.fnDraw(!1)}},_fnColCalc:function(){var a=this,b=0,c=0;this.s.aiInnerWidths=
        -[];this.s.aiOuterWidths=[];d.each(this.s.dt.aoColumns,function(g,f){var e=d(f.nTh),h;if(e.filter(":visible").length){var i=e.outerWidth();0===a.s.aiOuterWidths.length&&(h=d(a.s.dt.nTable).css("border-left-width"),i+="string"===typeof h?1:parseInt(h,10));a.s.aiOuterWidths.length===a.s.dt.aoColumns.length-1&&(h=d(a.s.dt.nTable).css("border-right-width"),i+="string"===typeof h?1:parseInt(h,10));a.s.aiOuterWidths.push(i);a.s.aiInnerWidths.push(e.width());g<a.s.iLeftColumns&&(b+=i);a.s.iTableColumns-a.s.iRightColumns<=
        -g&&(c+=i)}else a.s.aiInnerWidths.push(0),a.s.aiOuterWidths.push(0)});this.s.iLeftWidth=b;this.s.iRightWidth=c},_fnGridSetup:function(){var a=this._fnDTOverflow(),b;this.dom.body=this.s.dt.nTable;this.dom.header=this.s.dt.nTHead.parentNode;this.dom.header.parentNode.parentNode.style.position="relative";var c=d('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;"><div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;"><div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div><div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;"><div class="DTFC_LeftBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div></div><div class="DTFC_LeftFootWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div></div><div class="DTFC_RightWrapper" style="position:absolute; top:0; left:0;"><div class="DTFC_RightHeadWrapper" style="position:relative; top:0; left:0;"><div class="DTFC_RightHeadBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div></div><div class="DTFC_RightBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;"><div class="DTFC_RightBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div></div><div class="DTFC_RightFootWrapper" style="position:relative; top:0; left:0;"><div class="DTFC_RightFootBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div></div></div></div>')[0],
        -g=c.childNodes[0],f=c.childNodes[1];this.dom.grid.dt.parentNode.insertBefore(c,this.dom.grid.dt);c.appendChild(this.dom.grid.dt);this.dom.grid.wrapper=c;0<this.s.iLeftColumns&&(this.dom.grid.left.wrapper=g,this.dom.grid.left.head=g.childNodes[0],this.dom.grid.left.body=g.childNodes[1],this.dom.grid.left.liner=d("div.DTFC_LeftBodyLiner",c)[0],c.appendChild(g));0<this.s.iRightColumns&&(this.dom.grid.right.wrapper=f,this.dom.grid.right.head=f.childNodes[0],this.dom.grid.right.body=f.childNodes[1],this.dom.grid.right.liner=
        -d("div.DTFC_RightBodyLiner",c)[0],b=d("div.DTFC_RightHeadBlocker",c)[0],b.style.width=a.bar+"px",b.style.right=-a.bar+"px",this.dom.grid.right.headBlock=b,b=d("div.DTFC_RightFootBlocker",c)[0],b.style.width=a.bar+"px",b.style.right=-a.bar+"px",this.dom.grid.right.footBlock=b,c.appendChild(f));if(this.s.dt.nTFoot&&(this.dom.footer=this.s.dt.nTFoot.parentNode,0<this.s.iLeftColumns&&(this.dom.grid.left.foot=g.childNodes[2]),0<this.s.iRightColumns))this.dom.grid.right.foot=f.childNodes[2]},_fnGridLayout:function(){var a=
        -this.dom.grid,b=d(a.wrapper).width(),c=d(this.s.dt.nTable.parentNode).outerHeight(),g=d(this.s.dt.nTable.parentNode.parentNode).outerHeight(),f=this._fnDTOverflow(),e=this.s.iLeftWidth,h=this.s.iRightWidth,i=function(a,b){f.bar?a.style.width=b+f.bar+"px":(a.style.width=b+20+"px",a.style.paddingRight="20px",a.style.boxSizing="border-box")};f.x&&(c-=f.bar);a.wrapper.style.height=g+"px";0<this.s.iLeftColumns&&(a.left.wrapper.style.width=e+"px",a.left.wrapper.style.height="1px",a.left.body.style.height=
        -c+"px",a.left.foot&&(a.left.foot.style.top=(f.x?f.bar:0)+"px"),i(a.left.liner,e),a.left.liner.style.height=c+"px");0<this.s.iRightColumns&&(b-=h,f.y&&(b-=f.bar),a.right.wrapper.style.width=h+"px",a.right.wrapper.style.left=b+"px",a.right.wrapper.style.height="1px",a.right.body.style.height=c+"px",a.right.foot&&(a.right.foot.style.top=(f.x?f.bar:0)+"px"),i(a.right.liner,h),a.right.liner.style.height=c+"px",a.right.headBlock.style.display=f.y?"block":"none",a.right.footBlock.style.display=f.y?"block":
        -"none")},_fnDTOverflow:function(){var a=this.s.dt.nTable,b=a.parentNode,c={x:!1,y:!1,bar:this.s.dt.oScroll.iBarWidth};a.offsetWidth>b.clientWidth&&(c.x=!0);a.offsetHeight>b.clientHeight&&(c.y=!0);return c},_fnDraw:function(a){this._fnGridLayout();this._fnCloneLeft(a);this._fnCloneRight(a);null!==this.s.fnDrawCallback&&this.s.fnDrawCallback.call(this,this.dom.clone.left,this.dom.clone.right);d(this).trigger("draw.dtfc",{leftClone:this.dom.clone.left,rightClone:this.dom.clone.right})},_fnCloneRight:function(a){if(!(0>=
        -this.s.iRightColumns)){var b,c=[];for(b=this.s.iTableColumns-this.s.iRightColumns;b<this.s.iTableColumns;b++)this.s.dt.aoColumns[b].bVisible&&c.push(b);this._fnClone(this.dom.clone.right,this.dom.grid.right,c,a)}},_fnCloneLeft:function(a){if(!(0>=this.s.iLeftColumns)){var b,c=[];for(b=0;b<this.s.iLeftColumns;b++)this.s.dt.aoColumns[b].bVisible&&c.push(b);this._fnClone(this.dom.clone.left,this.dom.grid.left,c,a)}},_fnCopyLayout:function(a,b){for(var c=[],g=[],f=[],e=0,h=a.length;e<h;e++){var i=[];
        -i.nTr=d(a[e].nTr).clone(!0,!0)[0];for(var k=0,j=this.s.iTableColumns;k<j;k++)if(-1!==d.inArray(k,b)){var m=d.inArray(a[e][k].cell,f);-1===m?(m=d(a[e][k].cell).clone(!0,!0)[0],g.push(m),f.push(a[e][k].cell),i.push({cell:m,unique:a[e][k].unique})):i.push({cell:g[m],unique:a[e][k].unique})}c.push(i)}return c},_fnClone:function(a,b,c,g){var f=this,e,h,i,k,j,m,o,n,q,l=this.s.dt;if(g){null!==a.header&&a.header.parentNode.removeChild(a.header);a.header=d(this.dom.header).clone(!0,!0)[0];a.header.className+=
        -" DTFC_Cloned";a.header.style.width="100%";b.head.appendChild(a.header);n=this._fnCopyLayout(l.aoHeader,c);k=d(">thead",a.header);k.empty();e=0;for(h=n.length;e<h;e++)k[0].appendChild(n[e].nTr);l.oApi._fnDrawHead(l,n,!0)}else{n=this._fnCopyLayout(l.aoHeader,c);q=[];l.oApi._fnDetectHeader(q,d(">thead",a.header)[0]);e=0;for(h=n.length;e<h;e++){i=0;for(k=n[e].length;i<k;i++)q[e][i].cell.className=n[e][i].cell.className,d("span.DataTables_sort_icon",q[e][i].cell).each(function(){this.className=d("span.DataTables_sort_icon",
        -n[e][i].cell)[0].className})}}this._fnEqualiseHeights("thead",this.dom.header,a.header);"auto"==this.s.sHeightMatch&&d(">tbody>tr",f.dom.body).css("height","auto");null!==a.body&&(a.body.parentNode.removeChild(a.body),a.body=null);a.body=d(this.dom.body).clone(!0)[0];a.body.className+=" DTFC_Cloned";a.body.style.paddingBottom=l.oScroll.iBarWidth+"px";a.body.style.marginBottom=2*l.oScroll.iBarWidth+"px";null!==a.body.getAttribute("id")&&a.body.removeAttribute("id");d(">thead>tr",a.body).empty();d(">tfoot",
        -a.body).remove();var p=d("tbody",a.body)[0];d(p).empty();if(0<l.aiDisplay.length){h=d(">thead>tr",a.body)[0];for(o=0;o<c.length;o++)j=c[o],m=d(l.aoColumns[j].nTh).clone(!0)[0],m.innerHTML="",k=m.style,k.paddingTop="0",k.paddingBottom="0",k.borderTopWidth="0",k.borderBottomWidth="0",k.height=0,k.width=f.s.aiInnerWidths[j]+"px",h.appendChild(m);d(">tbody>tr",f.dom.body).each(function(a){var b=this.cloneNode(false);b.removeAttribute("id");a=f.s.dt.aoData[f.s.dt.oFeatures.bServerSide===false?f.s.dt.aiDisplay[f.s.dt._iDisplayStart+
        -a]:a].anCells||d(this).children("td, th");for(o=0;o<c.length;o++){j=c[o];if(a.length>0){m=d(a[j]).clone(true,true)[0];b.appendChild(m)}}p.appendChild(b)})}else d(">tbody>tr",f.dom.body).each(function(){m=this.cloneNode(true);m.className=m.className+" DTFC_NoData";d("td",m).html("");p.appendChild(m)});a.body.style.width="100%";a.body.style.margin="0";a.body.style.padding="0";l.oScroller!==t&&(h=l.oScroller.dom.force,b.forcer?b.forcer.style.height=h.style.height:(b.forcer=h.cloneNode(!0),b.liner.appendChild(b.forcer)));
        -b.liner.appendChild(a.body);this._fnEqualiseHeights("tbody",f.dom.body,a.body);if(null!==l.nTFoot){if(g){null!==a.footer&&a.footer.parentNode.removeChild(a.footer);a.footer=d(this.dom.footer).clone(!0,!0)[0];a.footer.className+=" DTFC_Cloned";a.footer.style.width="100%";b.foot.appendChild(a.footer);n=this._fnCopyLayout(l.aoFooter,c);b=d(">tfoot",a.footer);b.empty();e=0;for(h=n.length;e<h;e++)b[0].appendChild(n[e].nTr);l.oApi._fnDrawHead(l,n,!0)}else{n=this._fnCopyLayout(l.aoFooter,c);b=[];l.oApi._fnDetectHeader(b,
        -d(">tfoot",a.footer)[0]);e=0;for(h=n.length;e<h;e++){i=0;for(k=n[e].length;i<k;i++)b[e][i].cell.className=n[e][i].cell.className}}this._fnEqualiseHeights("tfoot",this.dom.footer,a.footer)}b=l.oApi._fnGetUniqueThs(l,d(">thead",a.header)[0]);d(b).each(function(a){j=c[a];this.style.width=f.s.aiInnerWidths[j]+"px"});null!==f.s.dt.nTFoot&&(b=l.oApi._fnGetUniqueThs(l,d(">tfoot",a.footer)[0]),d(b).each(function(a){j=c[a];this.style.width=f.s.aiInnerWidths[j]+"px"}))},_fnGetTrNodes:function(a){for(var b=
        -[],c=0,d=a.childNodes.length;c<d;c++)"TR"==a.childNodes[c].nodeName.toUpperCase()&&b.push(a.childNodes[c]);return b},_fnEqualiseHeights:function(a,b,c){if(!("none"==this.s.sHeightMatch&&"thead"!==a&&"tfoot"!==a)){var g,f,e=b.getElementsByTagName(a)[0],c=c.getElementsByTagName(a)[0],a=d(">"+a+">tr:eq(0)",b).children(":first");a.outerHeight();a.height();for(var e=this._fnGetTrNodes(e),b=this._fnGetTrNodes(c),h=[],c=0,a=b.length;c<a;c++)g=e[c].offsetHeight,f=b[c].offsetHeight,g=f>g?f:g,"semiauto"==this.s.sHeightMatch&&
        -(e[c]._DTTC_iHeight=g),h.push(g);c=0;for(a=b.length;c<a;c++)b[c].style.height=h[c]+"px",e[c].style.height=h[c]+"px"}}};j.defaults={iLeftColumns:1,iRightColumns:0,fnDrawCallback:null,sHeightMatch:"semiauto"};j.version="3.0.4";d.fn.dataTable.FixedColumns=j;return d.fn.DataTable.FixedColumns=j};"function"===typeof define&&define.amd?define(["jquery","datatables"],p):"object"===typeof exports?p(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.FixedColumns&&p(jQuery,jQuery.fn.dataTable)})(window,
        -document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/Readme.txt b/resources/assets/js/plugins/datatables/extensions/FixedHeader/Readme.txt
        deleted file mode 100755
        index 875e05176a..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/Readme.txt
        +++ /dev/null
        @@ -1,36 +0,0 @@
        -# FixedHeader
        -
        -At times it can be useful to ensure that column titles will remain always visible on a table, even when a user scrolls down a table. The FixedHeader plug-in for DataTables will float the 'thead' element above the table at all times to help address this issue. The column titles also remain click-able to perform sorting. Key features include:
        -
        -* Fix the header to the top of the window
        -* Ability to fix the footer and left / right columns as well
        -* z-Index ordering options
        -
        -
        -# Installation
        -
        -To use FixedHeader, first download DataTables ( http://datatables.net/download ) and place the unzipped FixedHeader package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -FixedHeader is initialised using the `$.fn.dataTable.FixedHeader()` object. For example:
        -
        -```js
        -$(document).ready( function () {
        -    var table = $('#example').dataTable();
        -    new $.fn.dataTable.FixedHeader( table );
        -} );
        -```
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/FixedHeader/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of FixedHeader and help make it better, please refer to its GitHub repo: https://github.com/DataTables/FixedHeader
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.css b/resources/assets/js/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.css
        deleted file mode 100755
        index 724317a6ed..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.css
        +++ /dev/null
        @@ -1,7 +0,0 @@
        -
        -
        -div.FixedHeader_Cloned th,
        -div.FixedHeader_Cloned td {
        -	background-color: white !important;
        -}
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.min.css b/resources/assets/js/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.min.css
        deleted file mode 100755
        index e276a91a85..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -div.FixedHeader_Cloned th,div.FixedHeader_Cloned td{background-color:white !important}
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/header_footer.html b/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/header_footer.html
        deleted file mode 100755
        index 97aae29842..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/header_footer.html
        +++ /dev/null
        @@ -1,641 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedHeader example - Header and footer fixed</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.FixedHeader( table, {
        -		bottom: true
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedHeader example <span>Header and footer fixed</span></h1>
        -
        -			<div class="info">
        -				<p>FixedHeader provides the ability to fix in place the header, footer, left and right columns of the
        -				table. These are controlled by the options:</p>
        -
        -				<ul class="markdown">
        -					<li><code>top</code> - default true</li>
        -					<li><code>bottom</code> - default false</li>
        -					<li><code>left</code> - default false</li>
        -					<li><code>right</code> - default false</li>
        -				</ul>
        -
        -				<p>This example shows the header and footer of the table fixed by enabling the <code>bottom</code>
        -				option.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.FixedHeader( table, {
        -		bottom: true
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./header_footer.html">Header and footer fixed</a></li>
        -							<li><a href="./top_left_right.html">Header, left and right all fixed</a></li>
        -							<li><a href="./two_tables.html">Multiple tables</a></li>
        -							<li><a href="./zIndexes.html">z-index order control</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/index.html b/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/index.html
        deleted file mode 100755
        index 2198d78c6f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/index.html
        +++ /dev/null
        @@ -1,69 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>FixedHeader examples - FixedHeader examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedHeader example <span>FixedHeader examples</span></h1>
        -
        -			<div class="info">
        -				<p>At times it can be useful to ensure that column titles will remain always visible on a table, even
        -				when a user scrolls down a table. The FixedHeader plug-in for DataTables will float the <code class=
        -				"tag" title="HTML tag">thead</code> element above the table at all times to help address this issue.
        -				The column titles also remain click-able to perform sorting. Key features include:</p>
        -
        -				<ul class="markdown">
        -					<li>Fix the header to the top of the window</li>
        -					<li>Ability to fix the footer and left / right columns as well</li>
        -					<li>z-Index ordering options</li>
        -				</ul>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./header_footer.html">Header and footer fixed</a></li>
        -							<li><a href="./top_left_right.html">Header, left and right all fixed</a></li>
        -							<li><a href="./two_tables.html">Multiple tables</a></li>
        -							<li><a href="./zIndexes.html">z-index order control</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/simple.html
        deleted file mode 100755
        index 1ad6efa778..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/simple.html
        +++ /dev/null
        @@ -1,637 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedHeader example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.FixedHeader( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedHeader example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>When displaying large amounts of data in a table, it can often be useful for the end user to have
        -				the column titles (the <code class="tag" title="HTML tag">thead</code> element as a whole in fact)
        -				always visible. This is particularly true if using DataTables with pagination disabled, or the display
        -				length is set to a high value.</p>
        -
        -				<p>The FixedHeader extension for DataTables will ensure that your column titles will scroll with the
        -				page, showing at the top of the table at all times. Try the demo shown below - you might want to try
        -				resizing the window for full effect! Note also that the column titles remain clickable to perform
        -				sorting on the table.</p>
        -
        -				<p>FixedHeader is initialised using the constructor <code>new $.fn.dataTable.FixedHeader();</code> -
        -				shown below.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.FixedHeader( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./header_footer.html">Header and footer fixed</a></li>
        -							<li><a href="./top_left_right.html">Header, left and right all fixed</a></li>
        -							<li><a href="./two_tables.html">Multiple tables</a></li>
        -							<li><a href="./zIndexes.html">z-index order control</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/top_left_right.html b/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/top_left_right.html
        deleted file mode 100755
        index f15faeb577..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/top_left_right.html
        +++ /dev/null
        @@ -1,236 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedHeader example - Header, left and right all fixed</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.dataTables_wrapper {
        -		width: 150%;
        -	}
        -
        -	div.FixedHeader_Cloned.fixedLeft tbody td {
        -		border-right: 1px solid black;
        -	}
        -
        -	div.FixedHeader_Cloned.fixedRight tbody td {
        -		border-left: 1px solid black;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		"order": [ 1, 'asc' ],
        -		"ajax": "../../../examples/ajax/data/objects.txt",
        -		"columns": [
        -			{ title: '',           data: null, defaultContent: "" },
        -			{ title: 'Name',       data: "name" },
        -			{ title: 'Position',   data: "position" },
        -			{ title: 'Office',     data: "office" },
        -			{ title: 'Extn.',      data: "extn" },
        -			{ title: 'Start date', data: "start_date" },
        -			{ title: 'Salary',     data: "salary" },
        -			{ title: '',           data: null, defaultContent: "" }
        -		],
        -		initComplete: function () {
        -			new $.fn.dataTable.FixedHeader( table, {
        -				left:   true,
        -				right:  true
        -			} );
        -		}
        -	} );
        -
        -	table.on( 'order.dt search.dt', function () {
        -		table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
        -			cell.innerHTML = i+1;
        -		} );
        -
        -		table.column(-1, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
        -			cell.innerHTML = i+1;
        -		} );
        -	} ).draw();
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedHeader example <span>Header, left and right all fixed</span></h1>
        -
        -			<div class="info">
        -				<p>FixedHeader provides the ability to fix in place the header, footer, left and right columns of the
        -				table. These are controlled by the options:</p>
        -
        -				<ul class="markdown">
        -					<li><code>top</code> - default true</li>
        -					<li><code>bottom</code> - default false</li>
        -					<li><code>left</code> - default false</li>
        -					<li><code>right</code> - default false</li>
        -				</ul>
        -
        -				<p>This example shows top, left and right enabled with index columns on the left and right.</p>
        -
        -				<p>Note that in such a situation as this, the <a href=
        -				"//datatables.net/extensions/fixedcolumns">FixedColumns extension</a> might be more useful,
        -				particularly if you want to use the scrolling options built into DataTables.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%"></table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		&quot;order&quot;: [ 1, 'asc' ],
        -		&quot;ajax&quot;: &quot;../../../examples/ajax/data/objects.txt&quot;,
        -		&quot;columns&quot;: [
        -			{ title: '',           data: null, defaultContent: &quot;&quot; },
        -			{ title: 'Name',       data: &quot;name&quot; },
        -			{ title: 'Position',   data: &quot;position&quot; },
        -			{ title: 'Office',     data: &quot;office&quot; },
        -			{ title: 'Extn.',      data: &quot;extn&quot; },
        -			{ title: 'Start date', data: &quot;start_date&quot; },
        -			{ title: 'Salary',     data: &quot;salary&quot; },
        -			{ title: '',           data: null, defaultContent: &quot;&quot; }
        -		],
        -		initComplete: function () {
        -			new $.fn.dataTable.FixedHeader( table, {
        -				left:   true,
        -				right:  true
        -			} );
        -		}
        -	} );
        -
        -	table.on( 'order.dt search.dt', function () {
        -		table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
        -			cell.innerHTML = i+1;
        -		} );
        -
        -		table.column(-1, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
        -			cell.innerHTML = i+1;
        -		} );
        -	} ).draw();
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;">div.dataTables_wrapper {
        -		width: 150%;
        -	}
        -
        -	div.FixedHeader_Cloned.fixedLeft tbody td {
        -		border-right: 1px solid black;
        -	}
        -
        -	div.FixedHeader_Cloned.fixedRight tbody td {
        -		border-left: 1px solid black;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./header_footer.html">Header and footer fixed</a></li>
        -							<li class="active"><a href="./top_left_right.html">Header, left and right all
        -							fixed</a></li>
        -							<li><a href="./two_tables.html">Multiple tables</a></li>
        -							<li><a href="./zIndexes.html">z-index order control</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/two_tables.html b/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/two_tables.html
        deleted file mode 100755
        index 1fbb3dfcb4..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/two_tables.html
        +++ /dev/null
        @@ -1,354 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedHeader example - Multiple tables</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var t1 = $('table.display').eq(0).DataTable();
        -	new $.fn.dataTable.FixedHeader( t1, {
        -		bottom: true
        -	} );
        -
        -	var t2 = $('table.display').eq(1).DataTable();
        -	new $.fn.dataTable.FixedHeader( t2, {
        -		bottom: true
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedHeader example <span>Multiple tables</span></h1>
        -
        -			<div class="info">
        -				<p>The following example shows two DataTables enhanced tables both with FixedHeader enabled on them.
        -				This is done simply by initialising FixedHeader on each table. This example also shows the footer being
        -				fixed in place for the two tables.</p>
        -			</div>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>$183,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>$103,500</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var t1 = $('table.display').eq(0).DataTable();
        -	new $.fn.dataTable.FixedHeader( t1, {
        -		bottom: true
        -	} );
        -
        -	var t2 = $('table.display').eq(1).DataTable();
        -	new $.fn.dataTable.FixedHeader( t2, {
        -		bottom: true
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./header_footer.html">Header and footer fixed</a></li>
        -							<li><a href="./top_left_right.html">Header, left and right all fixed</a></li>
        -							<li class="active"><a href="./two_tables.html">Multiple tables</a></li>
        -							<li><a href="./zIndexes.html">z-index order control</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/zIndexes.html b/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/zIndexes.html
        deleted file mode 100755
        index a3292c4cea..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/examples/zIndexes.html
        +++ /dev/null
        @@ -1,653 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>FixedHeader example - z-index order control</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.dataTables_wrapper {
        -		width: 1500px;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.FixedHeader( table, {
        -		left: true,
        -		zLeft: 105
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>FixedHeader example <span>z-index order control</span></h1>
        -
        -			<div class="info">
        -				<p>When you have two or more columns fixed on a table, there might be occasions when you which to have
        -				one column floating on top of another. This example shows how you can do that with the initialisation
        -				parameters <code>zTop</code>, <code>zBottom</code>, <code>zLeft</code> and <code>zRight</code>. In this
        -				example the left column is set to float on top of the header. The difference is subtle, but can be
        -				effective.</p>
        -
        -				<p>The default zIndexes are:</p>
        -
        -				<ul class="markdown">
        -					<li><code>zTop</code>: 104</li>
        -					<li><code>zBottom</code>: 103</li>
        -					<li><code>zLeft</code>: 102</li>
        -					<li><code>zRight</code>: 101</li>
        -				</ul>
        -
        -				<p>This example shows the left column being floated on top of the header.</p>
        -			</div>
        -
        -			<table id="example" class="stripe row-border order-column" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.FixedHeader( table, {
        -		left: true,
        -		zLeft: 105
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;">div.dataTables_wrapper {
        -		width: 1500px;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./header_footer.html">Header and footer fixed</a></li>
        -							<li><a href="./top_left_right.html">Header, left and right all fixed</a></li>
        -							<li><a href="./two_tables.html">Multiple tables</a></li>
        -							<li class="active"><a href="./zIndexes.html">z-index order control</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.js b/resources/assets/js/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.js
        deleted file mode 100755
        index 90df878678..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.js
        +++ /dev/null
        @@ -1,1028 +0,0 @@
        -/*! FixedHeader 2.1.2
        - * ©2010-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     FixedHeader
        - * @description Fix a table's header or footer, so it is always visible while
        - *              Scrolling
        - * @version     2.1.2
        - * @file        dataTables.fixedHeader.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2009-2014 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -/* Global scope for FixedColumns for backwards compatibility - will be removed
        - * in future. Not documented in 1.1.x.
        - */
        -
        -/* Global scope for FixedColumns */
        -var FixedHeader;
        -
        -(function(window, document, undefined) {
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -/*
        - * Function: FixedHeader
        - * Purpose:  Provide 'fixed' header, footer and columns for a DataTable
        - * Returns:  object:FixedHeader - must be called with 'new'
        - * Inputs:   mixed:mTable - target table
        - *  @param {object} dt DataTables instance or HTML table node. With DataTables
        - *    1.10 this can also be a jQuery collection (with just a single table in its
        - *    result set), a jQuery selector, DataTables API instance or settings
        - *    object.
        - *  @param {object} [oInit] initialisation settings, with the following
        - *    properties (each optional)
        - *    * bool:top -    fix the header (default true)
        - *    * bool:bottom - fix the footer (default false)
        - *    * int:left -    fix the left column(s) (default 0)
        - *    * int:right -   fix the right column(s) (default 0)
        - *    * int:zTop -    fixed header zIndex
        - *    * int:zBottom - fixed footer zIndex
        - *    * int:zLeft -   fixed left zIndex
        - *    * int:zRight -  fixed right zIndex
        - */
        -FixedHeader = function ( mTable, oInit ) {
        -	/* Sanity check - you just know it will happen */
        -	if ( ! this instanceof FixedHeader )
        -	{
        -		alert( "FixedHeader warning: FixedHeader must be initialised with the 'new' keyword." );
        -		return;
        -	}
        -
        -	var that = this;
        -	var oSettings = {
        -		"aoCache": [],
        -		"oSides": {
        -			"top": true,
        -			"bottom": false,
        -			"left": 0,
        -			"right": 0
        -		},
        -		"oZIndexes": {
        -			"top": 104,
        -			"bottom": 103,
        -			"left": 102,
        -			"right": 101
        -		},
        -		"oCloneOnDraw": {
        -			"top": false,
        -			"bottom": false,
        -			"left": true,
        -			"right": true
        -		},
        -		"oMes": {
        -			"iTableWidth": 0,
        -			"iTableHeight": 0,
        -			"iTableLeft": 0,
        -			"iTableRight": 0, /* note this is left+width, not actually "right" */
        -			"iTableTop": 0,
        -			"iTableBottom": 0 /* note this is top+height, not actually "bottom" */
        -		},
        -		"oOffset": {
        -			"top": 0
        -		},
        -		"nTable": null,
        -		"bFooter": false,
        -		"bInitComplete": false
        -	};
        -
        -	/*
        -	 * Function: fnGetSettings
        -	 * Purpose:  Get the settings for this object
        -	 * Returns:  object: - settings object
        -	 * Inputs:   -
        -	 */
        -	this.fnGetSettings = function () {
        -		return oSettings;
        -	};
        -
        -	/*
        -	 * Function: fnUpdate
        -	 * Purpose:  Update the positioning and copies of the fixed elements
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	this.fnUpdate = function () {
        -		this._fnUpdateClones();
        -		this._fnUpdatePositions();
        -	};
        -
        -	/*
        -	 * Function: fnPosition
        -	 * Purpose:  Update the positioning of the fixed elements
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	this.fnPosition = function () {
        -		this._fnUpdatePositions();
        -	};
        -
        -
        -	var dt = $.fn.dataTable.Api ?
        -		new $.fn.dataTable.Api( mTable ).settings()[0] :
        -		mTable.fnSettings();
        -
        -	dt._oPluginFixedHeader = this;
        -
        -	/* Let's do it */
        -	this.fnInit( dt, oInit );
        -
        -};
        -
        -
        -/*
        - * Variable: FixedHeader
        - * Purpose:  Prototype for FixedHeader
        - * Scope:    global
        - */
        -FixedHeader.prototype = {
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Initialisation
        -	 */
        -
        -	/*
        -	 * Function: fnInit
        -	 * Purpose:  The "constructor"
        -	 * Returns:  -
        -	 * Inputs:   {as FixedHeader function}
        -	 */
        -	fnInit: function ( oDtSettings, oInit )
        -	{
        -		var s = this.fnGetSettings();
        -		var that = this;
        -
        -		/* Record the user definable settings */
        -		this.fnInitSettings( s, oInit );
        -
        -		if ( oDtSettings.oScroll.sX !== "" || oDtSettings.oScroll.sY !== "" )
        -		{
        -			alert( "FixedHeader 2 is not supported with DataTables' scrolling mode at this time" );
        -			return;
        -		}
        -
        -		s.nTable = oDtSettings.nTable;
        -		oDtSettings.aoDrawCallback.unshift( {
        -			"fn": function () {
        -				FixedHeader.fnMeasure();
        -				that._fnUpdateClones.call(that);
        -				that._fnUpdatePositions.call(that);
        -			},
        -			"sName": "FixedHeader"
        -		} );
        -
        -		s.bFooter = ($('>tfoot', s.nTable).length > 0) ? true : false;
        -
        -		/* Add the 'sides' that are fixed */
        -		if ( s.oSides.top )
        -		{
        -			s.aoCache.push( that._fnCloneTable( "fixedHeader", "FixedHeader_Header", that._fnCloneThead ) );
        -		}
        -		if ( s.oSides.bottom )
        -		{
        -			s.aoCache.push( that._fnCloneTable( "fixedFooter", "FixedHeader_Footer", that._fnCloneTfoot ) );
        -		}
        -		if ( s.oSides.left )
        -		{
        -			s.aoCache.push( that._fnCloneTable( "fixedLeft", "FixedHeader_Left", that._fnCloneTLeft, s.oSides.left ) );
        -		}
        -		if ( s.oSides.right )
        -		{
        -			s.aoCache.push( that._fnCloneTable( "fixedRight", "FixedHeader_Right", that._fnCloneTRight, s.oSides.right ) );
        -		}
        -
        -		/* Event listeners for window movement */
        -		FixedHeader.afnScroll.push( function () {
        -			that._fnUpdatePositions.call(that);
        -		} );
        -
        -		$(window).resize( function () {
        -			FixedHeader.fnMeasure();
        -			that._fnUpdateClones.call(that);
        -			that._fnUpdatePositions.call(that);
        -		} );
        -
        -		$(s.nTable)
        -			.on('column-reorder.dt', function () {
        -				FixedHeader.fnMeasure();
        -				that._fnUpdateClones( true );
        -				that._fnUpdatePositions();
        -			} )
        -			.on('column-visibility.dt', function () {
        -				FixedHeader.fnMeasure();
        -				that._fnUpdateClones( true );
        -				that._fnUpdatePositions();
        -			} );
        -
        -		/* Get things right to start with */
        -		FixedHeader.fnMeasure();
        -		that._fnUpdateClones();
        -		that._fnUpdatePositions();
        -
        -		s.bInitComplete = true;
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Support functions
        -	 */
        -
        -	/*
        -	 * Function: fnInitSettings
        -	 * Purpose:  Take the user's settings and copy them to our local store
        -	 * Returns:  -
        -	 * Inputs:   object:s - the local settings object
        -	 *           object:oInit - the user's settings object
        -	 */
        -	fnInitSettings: function ( s, oInit )
        -	{
        -		if ( oInit !== undefined )
        -		{
        -			if ( oInit.top !== undefined ) {
        -				s.oSides.top = oInit.top;
        -			}
        -			if ( oInit.bottom !== undefined ) {
        -				s.oSides.bottom = oInit.bottom;
        -			}
        -			if ( typeof oInit.left == 'boolean' ) {
        -				s.oSides.left = oInit.left ? 1 : 0;
        -			}
        -			else if ( oInit.left !== undefined ) {
        -				s.oSides.left = oInit.left;
        -			}
        -			if ( typeof oInit.right == 'boolean' ) {
        -				s.oSides.right = oInit.right ? 1 : 0;
        -			}
        -			else if ( oInit.right !== undefined ) {
        -				s.oSides.right = oInit.right;
        -			}
        -
        -			if ( oInit.zTop !== undefined ) {
        -				s.oZIndexes.top = oInit.zTop;
        -			}
        -			if ( oInit.zBottom !== undefined ) {
        -				s.oZIndexes.bottom = oInit.zBottom;
        -			}
        -			if ( oInit.zLeft !== undefined ) {
        -				s.oZIndexes.left = oInit.zLeft;
        -			}
        -			if ( oInit.zRight !== undefined ) {
        -				s.oZIndexes.right = oInit.zRight;
        -			}
        -
        -			if ( oInit.offsetTop !== undefined ) {
        -				s.oOffset.top = oInit.offsetTop;
        -			}
        -			if ( oInit.alwaysCloneTop !== undefined ) {
        -				s.oCloneOnDraw.top = oInit.alwaysCloneTop;
        -			}
        -			if ( oInit.alwaysCloneBottom !== undefined ) {
        -				s.oCloneOnDraw.bottom = oInit.alwaysCloneBottom;
        -			}
        -			if ( oInit.alwaysCloneLeft !== undefined ) {
        -				s.oCloneOnDraw.left = oInit.alwaysCloneLeft;
        -			}
        -			if ( oInit.alwaysCloneRight !== undefined ) {
        -				s.oCloneOnDraw.right = oInit.alwaysCloneRight;
        -			}
        -		}
        -	},
        -
        -	/*
        -	 * Function: _fnCloneTable
        -	 * Purpose:  Clone the table node and do basic initialisation
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	_fnCloneTable: function ( sType, sClass, fnClone, iCells )
        -	{
        -		var s = this.fnGetSettings();
        -		var nCTable;
        -
        -		/* We know that the table _MUST_ has a DIV wrapped around it, because this is simply how
        -		 * DataTables works. Therefore, we can set this to be relatively position (if it is not
        -		 * alreadu absolute, and use this as the base point for the cloned header
        -		 */
        -		if ( $(s.nTable.parentNode).css('position') != "absolute" )
        -		{
        -			s.nTable.parentNode.style.position = "relative";
        -		}
        -
        -		/* Just a shallow clone will do - we only want the table node */
        -		nCTable = s.nTable.cloneNode( false );
        -		nCTable.removeAttribute( 'id' );
        -
        -		var nDiv = document.createElement( 'div' );
        -		nDiv.style.position = "absolute";
        -		nDiv.style.top = "0px";
        -		nDiv.style.left = "0px";
        -		nDiv.className += " FixedHeader_Cloned "+sType+" "+sClass;
        -
        -		/* Set the zIndexes */
        -		if ( sType == "fixedHeader" )
        -		{
        -			nDiv.style.zIndex = s.oZIndexes.top;
        -		}
        -		if ( sType == "fixedFooter" )
        -		{
        -			nDiv.style.zIndex = s.oZIndexes.bottom;
        -		}
        -		if ( sType == "fixedLeft" )
        -		{
        -			nDiv.style.zIndex = s.oZIndexes.left;
        -		}
        -		else if ( sType == "fixedRight" )
        -		{
        -			nDiv.style.zIndex = s.oZIndexes.right;
        -		}
        -
        -		/* remove margins since we are going to position it absolutely */
        -		nCTable.style.margin = "0";
        -
        -		/* Insert the newly cloned table into the DOM, on top of the "real" header */
        -		nDiv.appendChild( nCTable );
        -		document.body.appendChild( nDiv );
        -
        -		return {
        -			"nNode": nCTable,
        -			"nWrapper": nDiv,
        -			"sType": sType,
        -			"sPosition": "",
        -			"sTop": "",
        -			"sLeft": "",
        -			"fnClone": fnClone,
        -			"iCells": iCells
        -		};
        -	},
        -
        -	/*
        -	 * Function: _fnMeasure
        -	 * Purpose:  Get the current positioning of the table in the DOM
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	_fnMeasure: function ()
        -	{
        -		var
        -			s = this.fnGetSettings(),
        -			m = s.oMes,
        -			jqTable = $(s.nTable),
        -			oOffset = jqTable.offset(),
        -			iParentScrollTop = this._fnSumScroll( s.nTable.parentNode, 'scrollTop' ),
        -			iParentScrollLeft = this._fnSumScroll( s.nTable.parentNode, 'scrollLeft' );
        -
        -		m.iTableWidth = jqTable.outerWidth();
        -		m.iTableHeight = jqTable.outerHeight();
        -		m.iTableLeft = oOffset.left + s.nTable.parentNode.scrollLeft;
        -		m.iTableTop = oOffset.top + iParentScrollTop;
        -		m.iTableRight = m.iTableLeft + m.iTableWidth;
        -		m.iTableRight = FixedHeader.oDoc.iWidth - m.iTableLeft - m.iTableWidth;
        -		m.iTableBottom = FixedHeader.oDoc.iHeight - m.iTableTop - m.iTableHeight;
        -	},
        -
        -	/*
        -	 * Function: _fnSumScroll
        -	 * Purpose:  Sum node parameters all the way to the top
        -	 * Returns:  int: sum
        -	 * Inputs:   node:n - node to consider
        -	 *           string:side - scrollTop or scrollLeft
        -	 */
        -	_fnSumScroll: function ( n, side )
        -	{
        -		var i = n[side];
        -		while ( n = n.parentNode )
        -		{
        -			if ( n.nodeName == 'HTML' || n.nodeName == 'BODY' )
        -			{
        -				break;
        -			}
        -			i = n[side];
        -		}
        -		return i;
        -	},
        -
        -	/*
        -	 * Function: _fnUpdatePositions
        -	 * Purpose:  Loop over the fixed elements for this table and update their positions
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	_fnUpdatePositions: function ()
        -	{
        -		var s = this.fnGetSettings();
        -		this._fnMeasure();
        -
        -		for ( var i=0, iLen=s.aoCache.length ; i<iLen ; i++ )
        -		{
        -			if ( s.aoCache[i].sType == "fixedHeader" )
        -			{
        -				this._fnScrollFixedHeader( s.aoCache[i] );
        -			}
        -			else if ( s.aoCache[i].sType == "fixedFooter" )
        -			{
        -				this._fnScrollFixedFooter( s.aoCache[i] );
        -			}
        -			else if ( s.aoCache[i].sType == "fixedLeft" )
        -			{
        -				this._fnScrollHorizontalLeft( s.aoCache[i] );
        -			}
        -			else
        -			{
        -				this._fnScrollHorizontalRight( s.aoCache[i] );
        -			}
        -		}
        -	},
        -
        -	/*
        -	 * Function: _fnUpdateClones
        -	 * Purpose:  Loop over the fixed elements for this table and call their cloning functions
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	_fnUpdateClones: function ( full )
        -	{
        -		var s = this.fnGetSettings();
        -
        -		if ( full ) {
        -			// This is a little bit of a hack to force a full clone draw. When
        -			// `full` is set to true, we want to reclone the source elements,
        -			// regardless of the clone-on-draw settings
        -			s.bInitComplete = false;
        -		}
        -
        -		for ( var i=0, iLen=s.aoCache.length ; i<iLen ; i++ )
        -		{
        -			s.aoCache[i].fnClone.call( this, s.aoCache[i] );
        -		}
        -
        -		if ( full ) {
        -			s.bInitComplete = true;
        -		}
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Scrolling functions
        -	 */
        -
        -	/*
        -	 * Function: _fnScrollHorizontalLeft
        -	 * Purpose:  Update the positioning of the scrolling elements
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnScrollHorizontalRight: function ( oCache )
        -	{
        -		var
        -			s = this.fnGetSettings(),
        -			oMes = s.oMes,
        -			oWin = FixedHeader.oWin,
        -			oDoc = FixedHeader.oDoc,
        -			nTable = oCache.nWrapper,
        -			iFixedWidth = $(nTable).outerWidth();
        -
        -		if ( oWin.iScrollRight < oMes.iTableRight )
        -		{
        -			/* Fully right aligned */
        -			this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft+oMes.iTableWidth-iFixedWidth)+"px", 'left', nTable.style );
        -		}
        -		else if ( oMes.iTableLeft < oDoc.iWidth-oWin.iScrollRight-iFixedWidth )
        -		{
        -			/* Middle */
        -			this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop-oWin.iScrollTop)+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', (oWin.iWidth-iFixedWidth)+"px", 'left', nTable.style );
        -		}
        -		else
        -		{
        -			/* Fully left aligned */
        -			this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style );
        -		}
        -	},
        -
        -	/*
        -	 * Function: _fnScrollHorizontalLeft
        -	 * Purpose:  Update the positioning of the scrolling elements
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnScrollHorizontalLeft: function ( oCache )
        -	{
        -		var
        -			s = this.fnGetSettings(),
        -			oMes = s.oMes,
        -			oWin = FixedHeader.oWin,
        -			oDoc = FixedHeader.oDoc,
        -			nTable = oCache.nWrapper,
        -			iCellWidth = $(nTable).outerWidth();
        -
        -		if ( oWin.iScrollLeft < oMes.iTableLeft )
        -		{
        -			/* Fully left align */
        -			this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style );
        -		}
        -		else if ( oWin.iScrollLeft < oMes.iTableLeft+oMes.iTableWidth-iCellWidth )
        -		{
        -			this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop-oWin.iScrollTop)+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', "0px", 'left', nTable.style );
        -		}
        -		else
        -		{
        -			/* Fully right align */
        -			this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft+oMes.iTableWidth-iCellWidth)+"px", 'left', nTable.style );
        -		}
        -	},
        -
        -	/*
        -	 * Function: _fnScrollFixedFooter
        -	 * Purpose:  Update the positioning of the scrolling elements
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnScrollFixedFooter: function ( oCache )
        -	{
        -		var
        -			s = this.fnGetSettings(),
        -			oMes = s.oMes,
        -			oWin = FixedHeader.oWin,
        -			oDoc = FixedHeader.oDoc,
        -			nTable = oCache.nWrapper,
        -			iTheadHeight = $("thead", s.nTable).outerHeight(),
        -			iCellHeight = $(nTable).outerHeight();
        -
        -		if ( oWin.iScrollBottom < oMes.iTableBottom )
        -		{
        -			/* Below */
        -			this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop+oMes.iTableHeight-iCellHeight)+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style );
        -		}
        -		else if ( oWin.iScrollBottom < oMes.iTableBottom+oMes.iTableHeight-iCellHeight-iTheadHeight )
        -		{
        -			this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', (oWin.iHeight-iCellHeight)+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft-oWin.iScrollLeft)+"px", 'left', nTable.style );
        -		}
        -		else
        -		{
        -			/* Above */
        -			this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop+iCellHeight)+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style );
        -		}
        -	},
        -
        -	/*
        -	 * Function: _fnScrollFixedHeader
        -	 * Purpose:  Update the positioning of the scrolling elements
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnScrollFixedHeader: function ( oCache )
        -	{
        -		var
        -			s = this.fnGetSettings(),
        -			oMes = s.oMes,
        -			oWin = FixedHeader.oWin,
        -			oDoc = FixedHeader.oDoc,
        -			nTable = oCache.nWrapper,
        -			iTbodyHeight = 0,
        -			anTbodies = s.nTable.getElementsByTagName('tbody');
        -
        -		for (var i = 0; i < anTbodies.length; ++i) {
        -			iTbodyHeight += anTbodies[i].offsetHeight;
        -		}
        -
        -		if ( oMes.iTableTop > oWin.iScrollTop + s.oOffset.top )
        -		{
        -			/* Above the table */
        -			this._fnUpdateCache( oCache, 'sPosition', "absolute", 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style );
        -		}
        -		else if ( oWin.iScrollTop + s.oOffset.top > oMes.iTableTop+iTbodyHeight )
        -		{
        -			/* At the bottom of the table */
        -			this._fnUpdateCache( oCache, 'sPosition', "absolute", 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop+iTbodyHeight)+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style );
        -		}
        -		else
        -		{
        -			/* In the middle of the table */
        -			this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style );
        -			this._fnUpdateCache( oCache, 'sTop', s.oOffset.top+"px", 'top', nTable.style );
        -			this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft-oWin.iScrollLeft)+"px", 'left', nTable.style );
        -		}
        -	},
        -
        -	/*
        -	 * Function: _fnUpdateCache
        -	 * Purpose:  Check the cache and update cache and value if needed
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - local cache object
        -	 *           string:sCache - cache property
        -	 *           string:sSet - value to set
        -	 *           string:sProperty - object property to set
        -	 *           object:oObj - object to update
        -	 */
        -	_fnUpdateCache: function ( oCache, sCache, sSet, sProperty, oObj )
        -	{
        -		if ( oCache[sCache] != sSet )
        -		{
        -			oObj[sProperty] = sSet;
        -			oCache[sCache] = sSet;
        -		}
        -	},
        -
        -
        -
        -	/**
        -	 * Copy the classes of all child nodes from one element to another. This implies
        -	 * that the two have identical structure - no error checking is performed to that
        -	 * fact.
        -	 *  @param {element} source Node to copy classes from
        -	 *  @param {element} dest Node to copy classes too
        -	 */
        -	_fnClassUpdate: function ( source, dest )
        -	{
        -		var that = this;
        -
        -		if ( source.nodeName.toUpperCase() === "TR" || source.nodeName.toUpperCase() === "TH" ||
        -			 source.nodeName.toUpperCase() === "TD" || source.nodeName.toUpperCase() === "SPAN" )
        -		{
        -			dest.className = source.className;
        -		}
        -
        -		$(source).children().each( function (i) {
        -			that._fnClassUpdate( $(source).children()[i], $(dest).children()[i] );
        -		} );
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Cloning functions
        -	 */
        -
        -	/*
        -	 * Function: _fnCloneThead
        -	 * Purpose:  Clone the thead element
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnCloneThead: function ( oCache )
        -	{
        -		var s = this.fnGetSettings();
        -		var nTable = oCache.nNode;
        -
        -		if ( s.bInitComplete && !s.oCloneOnDraw.top )
        -		{
        -			this._fnClassUpdate( $('thead', s.nTable)[0], $('thead', nTable)[0] );
        -			return;
        -		}
        -
        -		/* Set the wrapper width to match that of the cloned table */
        -		var iDtWidth = $(s.nTable).outerWidth();
        -		oCache.nWrapper.style.width = iDtWidth+"px";
        -		nTable.style.width = iDtWidth+"px";
        -
        -		/* Remove any children the cloned table has */
        -		while ( nTable.childNodes.length > 0 )
        -		{
        -			$('thead th', nTable).unbind( 'click' );
        -			nTable.removeChild( nTable.childNodes[0] );
        -		}
        -
        -		/* Clone the DataTables header */
        -		var nThead = $('thead', s.nTable).clone(true)[0];
        -		nTable.appendChild( nThead );
        -
        -		/* Copy the widths across - apparently a clone isn't good enough for this */
        -		var a = [];
        -		var b = [];
        -
        -		$("thead>tr th", s.nTable).each( function (i) {
        -			a.push( $(this).width() );
        -		} );
        -
        -		$("thead>tr td", s.nTable).each( function (i) {
        -			b.push( $(this).width() );
        -		} );
        -
        -		$("thead>tr th", s.nTable).each( function (i) {
        -			$("thead>tr th:eq("+i+")", nTable).width( a[i] );
        -			$(this).width( a[i] );
        -		} );
        -
        -		$("thead>tr td", s.nTable).each( function (i) {
        -			$("thead>tr td:eq("+i+")", nTable).width( b[i] );
        -			$(this).width( b[i] );
        -		} );
        -
        -		// Stop DataTables 1.9 from putting a focus ring on the headers when
        -		// clicked to sort
        -		$('th.sorting, th.sorting_desc, th.sorting_asc', nTable).bind( 'click', function () {
        -			this.blur();
        -		} );
        -	},
        -
        -	/*
        -	 * Function: _fnCloneTfoot
        -	 * Purpose:  Clone the tfoot element
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnCloneTfoot: function ( oCache )
        -	{
        -		var s = this.fnGetSettings();
        -		var nTable = oCache.nNode;
        -
        -		/* Set the wrapper width to match that of the cloned table */
        -		oCache.nWrapper.style.width = $(s.nTable).outerWidth()+"px";
        -
        -		/* Remove any children the cloned table has */
        -		while ( nTable.childNodes.length > 0 )
        -		{
        -			nTable.removeChild( nTable.childNodes[0] );
        -		}
        -
        -		/* Clone the DataTables footer */
        -		var nTfoot = $('tfoot', s.nTable).clone(true)[0];
        -		nTable.appendChild( nTfoot );
        -
        -		/* Copy the widths across - apparently a clone isn't good enough for this */
        -		$("tfoot:eq(0)>tr th", s.nTable).each( function (i) {
        -			$("tfoot:eq(0)>tr th:eq("+i+")", nTable).width( $(this).width() );
        -		} );
        -
        -		$("tfoot:eq(0)>tr td", s.nTable).each( function (i) {
        -			$("tfoot:eq(0)>tr td:eq("+i+")", nTable).width( $(this).width() );
        -		} );
        -	},
        -
        -	/*
        -	 * Function: _fnCloneTLeft
        -	 * Purpose:  Clone the left column(s)
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnCloneTLeft: function ( oCache )
        -	{
        -		var s = this.fnGetSettings();
        -		var nTable = oCache.nNode;
        -		var nBody = $('tbody', s.nTable)[0];
        -
        -		/* Remove any children the cloned table has */
        -		while ( nTable.childNodes.length > 0 )
        -		{
        -			nTable.removeChild( nTable.childNodes[0] );
        -		}
        -
        -		/* Is this the most efficient way to do this - it looks horrible... */
        -		nTable.appendChild( $("thead", s.nTable).clone(true)[0] );
        -		nTable.appendChild( $("tbody", s.nTable).clone(true)[0] );
        -		if ( s.bFooter )
        -		{
        -			nTable.appendChild( $("tfoot", s.nTable).clone(true)[0] );
        -		}
        -
        -		/* Remove unneeded cells */
        -		var sSelector = 'gt(' + (oCache.iCells - 1) + ')';
        -		$('thead tr', nTable).each( function (k) {
        -			$('th:' + sSelector, this).remove();
        -		} );
        -
        -		$('tfoot tr', nTable).each( function (k) {
        -			$('th:' + sSelector, this).remove();
        -		} );
        -
        -		$('tbody tr', nTable).each( function (k) {
        -			$('td:' + sSelector, this).remove();
        -		} );
        -
        -		this.fnEqualiseHeights( 'thead', nBody.parentNode, nTable );
        -		this.fnEqualiseHeights( 'tbody', nBody.parentNode, nTable );
        -		this.fnEqualiseHeights( 'tfoot', nBody.parentNode, nTable );
        -
        -		var iWidth = 0;
        -		for (var i = 0; i < oCache.iCells; i++) {
        -			iWidth += $('thead tr th:eq(' + i + ')', s.nTable).outerWidth();
        -		}
        -		nTable.style.width = iWidth+"px";
        -		oCache.nWrapper.style.width = iWidth+"px";
        -	},
        -
        -	/*
        -	 * Function: _fnCloneTRight
        -	 * Purpose:  Clone the right most column(s)
        -	 * Returns:  -
        -	 * Inputs:   object:oCache - the cached values for this fixed element
        -	 */
        -	_fnCloneTRight: function ( oCache )
        -	{
        -		var s = this.fnGetSettings();
        -		var nBody = $('tbody', s.nTable)[0];
        -		var nTable = oCache.nNode;
        -		var iCols = $('tbody tr:eq(0) td', s.nTable).length;
        -
        -		/* Remove any children the cloned table has */
        -		while ( nTable.childNodes.length > 0 )
        -		{
        -			nTable.removeChild( nTable.childNodes[0] );
        -		}
        -
        -		/* Is this the most efficient way to do this - it looks horrible... */
        -		nTable.appendChild( $("thead", s.nTable).clone(true)[0] );
        -		nTable.appendChild( $("tbody", s.nTable).clone(true)[0] );
        -		if ( s.bFooter )
        -		{
        -			nTable.appendChild( $("tfoot", s.nTable).clone(true)[0] );
        -		}
        -		$('thead tr th:lt('+(iCols-oCache.iCells)+')', nTable).remove();
        -		$('tfoot tr th:lt('+(iCols-oCache.iCells)+')', nTable).remove();
        -
        -		/* Remove unneeded cells */
        -		$('tbody tr', nTable).each( function (k) {
        -			$('td:lt('+(iCols-oCache.iCells)+')', this).remove();
        -		} );
        -
        -		this.fnEqualiseHeights( 'thead', nBody.parentNode, nTable );
        -		this.fnEqualiseHeights( 'tbody', nBody.parentNode, nTable );
        -		this.fnEqualiseHeights( 'tfoot', nBody.parentNode, nTable );
        -
        -		var iWidth = 0;
        -		for (var i = 0; i < oCache.iCells; i++) {
        -			iWidth += $('thead tr th:eq('+(iCols-1-i)+')', s.nTable).outerWidth();
        -		}
        -		nTable.style.width = iWidth+"px";
        -		oCache.nWrapper.style.width = iWidth+"px";
        -	},
        -
        -
        -	/**
        -	 * Equalise the heights of the rows in a given table node in a cross browser way. Note that this
        -	 * is more or less lifted as is from FixedColumns
        -	 *  @method  fnEqualiseHeights
        -	 *  @returns void
        -	 *  @param   {string} parent Node type - thead, tbody or tfoot
        -	 *  @param   {element} original Original node to take the heights from
        -	 *  @param   {element} clone Copy the heights to
        -	 *  @private
        -	 */
        -	"fnEqualiseHeights": function ( parent, original, clone )
        -	{
        -		var that = this;
        -		var originals = $(parent +' tr', original);
        -		var height;
        -
        -		$(parent+' tr', clone).each( function (k) {
        -			height = originals.eq( k ).css('height');
        -
        -			// This is nasty :-(. IE has a sub-pixel error even when setting
        -			// the height below (the Firefox fix) which causes the fixed column
        -			// to go out of alignment. Need to add a pixel before the assignment
        -			// Can this be feature detected? Not sure how...
        -			if ( navigator.appName == 'Microsoft Internet Explorer' ) {
        -				height = parseInt( height, 10 ) + 1;
        -			}
        -
        -			$(this).css( 'height', height );
        -
        -			// For Firefox to work, we need to also set the height of the
        -			// original row, to the value that we read from it! Otherwise there
        -			// is a sub-pixel rounding error
        -			originals.eq( k ).css( 'height', height );
        -		} );
        -	}
        -};
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Static properties and methods
        - *   We use these for speed! This information is common to all instances of FixedHeader, so no
        - * point if having them calculated and stored for each different instance.
        - */
        -
        -/*
        - * Variable: oWin
        - * Purpose:  Store information about the window positioning
        - * Scope:    FixedHeader
        - */
        -FixedHeader.oWin = {
        -	"iScrollTop": 0,
        -	"iScrollRight": 0,
        -	"iScrollBottom": 0,
        -	"iScrollLeft": 0,
        -	"iHeight": 0,
        -	"iWidth": 0
        -};
        -
        -/*
        - * Variable: oDoc
        - * Purpose:  Store information about the document size
        - * Scope:    FixedHeader
        - */
        -FixedHeader.oDoc = {
        -	"iHeight": 0,
        -	"iWidth": 0
        -};
        -
        -/*
        - * Variable: afnScroll
        - * Purpose:  Array of functions that are to be used for the scrolling components
        - * Scope:    FixedHeader
        - */
        -FixedHeader.afnScroll = [];
        -
        -/*
        - * Function: fnMeasure
        - * Purpose:  Update the measurements for the window and document
        - * Returns:  -
        - * Inputs:   -
        - */
        -FixedHeader.fnMeasure = function ()
        -{
        -	var
        -		jqWin = $(window),
        -		jqDoc = $(document),
        -		oWin = FixedHeader.oWin,
        -		oDoc = FixedHeader.oDoc;
        -
        -	oDoc.iHeight = jqDoc.height();
        -	oDoc.iWidth = jqDoc.width();
        -
        -	oWin.iHeight = jqWin.height();
        -	oWin.iWidth = jqWin.width();
        -	oWin.iScrollTop = jqWin.scrollTop();
        -	oWin.iScrollLeft = jqWin.scrollLeft();
        -	oWin.iScrollRight = oDoc.iWidth - oWin.iScrollLeft - oWin.iWidth;
        -	oWin.iScrollBottom = oDoc.iHeight - oWin.iScrollTop - oWin.iHeight;
        -};
        -
        -
        -FixedHeader.version = "2.1.2";
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Global processing
        - */
        -
        -/*
        - * Just one 'scroll' event handler in FixedHeader, which calls the required components. This is
        - * done as an optimisation, to reduce calculation and proagation time
        - */
        -$(window).scroll( function () {
        -	FixedHeader.fnMeasure();
        -
        -	for ( var i=0, iLen=FixedHeader.afnScroll.length ; i<iLen ; i++ ) {
        -		FixedHeader.afnScroll[i]();
        -	}
        -} );
        -
        -
        -$.fn.dataTable.FixedHeader = FixedHeader;
        -$.fn.DataTable.FixedHeader = FixedHeader;
        -
        -
        -return FixedHeader;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.FixedHeader ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.min.js b/resources/assets/js/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.min.js
        deleted file mode 100755
        index 1716091024..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.min.js
        +++ /dev/null
        @@ -1,30 +0,0 @@
        -/*!
        - FixedHeader 2.1.2
        - ©2010-2014 SpryMedia Ltd - datatables.net/license
        -*/
        -var FixedHeader;
        -(function(j,k,h){var l=function(e){FixedHeader=function(a,b){if(!this instanceof FixedHeader)alert("FixedHeader warning: FixedHeader must be initialised with the 'new' keyword.");else{var c={aoCache:[],oSides:{top:!0,bottom:!1,left:0,right:0},oZIndexes:{top:104,bottom:103,left:102,right:101},oCloneOnDraw:{top:!1,bottom:!1,left:!0,right:!0},oMes:{iTableWidth:0,iTableHeight:0,iTableLeft:0,iTableRight:0,iTableTop:0,iTableBottom:0},oOffset:{top:0},nTable:null,bFooter:!1,bInitComplete:!1};this.fnGetSettings=
        -function(){return c};this.fnUpdate=function(){this._fnUpdateClones();this._fnUpdatePositions()};this.fnPosition=function(){this._fnUpdatePositions()};var d=e.fn.dataTable.Api?(new e.fn.dataTable.Api(a)).settings()[0]:a.fnSettings();d._oPluginFixedHeader=this;this.fnInit(d,b)}};FixedHeader.prototype={fnInit:function(a,b){var c=this.fnGetSettings(),d=this;this.fnInitSettings(c,b);""!==a.oScroll.sX||""!==a.oScroll.sY?alert("FixedHeader 2 is not supported with DataTables' scrolling mode at this time"):
        -(c.nTable=a.nTable,a.aoDrawCallback.unshift({fn:function(){FixedHeader.fnMeasure();d._fnUpdateClones.call(d);d._fnUpdatePositions.call(d)},sName:"FixedHeader"}),c.bFooter=0<e(">tfoot",c.nTable).length?!0:!1,c.oSides.top&&c.aoCache.push(d._fnCloneTable("fixedHeader","FixedHeader_Header",d._fnCloneThead)),c.oSides.bottom&&c.aoCache.push(d._fnCloneTable("fixedFooter","FixedHeader_Footer",d._fnCloneTfoot)),c.oSides.left&&c.aoCache.push(d._fnCloneTable("fixedLeft","FixedHeader_Left",d._fnCloneTLeft,c.oSides.left)),
        -c.oSides.right&&c.aoCache.push(d._fnCloneTable("fixedRight","FixedHeader_Right",d._fnCloneTRight,c.oSides.right)),FixedHeader.afnScroll.push(function(){d._fnUpdatePositions.call(d)}),e(j).resize(function(){FixedHeader.fnMeasure();d._fnUpdateClones.call(d);d._fnUpdatePositions.call(d)}),e(c.nTable).on("column-reorder.dt",function(){FixedHeader.fnMeasure();d._fnUpdateClones(!0);d._fnUpdatePositions()}).on("column-visibility.dt",function(){FixedHeader.fnMeasure();d._fnUpdateClones(!0);d._fnUpdatePositions()}),
        -FixedHeader.fnMeasure(),d._fnUpdateClones(),d._fnUpdatePositions(),c.bInitComplete=!0)},fnInitSettings:function(a,b){if(b!==h&&(b.top!==h&&(a.oSides.top=b.top),b.bottom!==h&&(a.oSides.bottom=b.bottom),"boolean"==typeof b.left?a.oSides.left=b.left?1:0:b.left!==h&&(a.oSides.left=b.left),"boolean"==typeof b.right?a.oSides.right=b.right?1:0:b.right!==h&&(a.oSides.right=b.right),b.zTop!==h&&(a.oZIndexes.top=b.zTop),b.zBottom!==h&&(a.oZIndexes.bottom=b.zBottom),b.zLeft!==h&&(a.oZIndexes.left=b.zLeft),b.zRight!==
        -h&&(a.oZIndexes.right=b.zRight),b.offsetTop!==h&&(a.oOffset.top=b.offsetTop),b.alwaysCloneTop!==h&&(a.oCloneOnDraw.top=b.alwaysCloneTop),b.alwaysCloneBottom!==h&&(a.oCloneOnDraw.bottom=b.alwaysCloneBottom),b.alwaysCloneLeft!==h&&(a.oCloneOnDraw.left=b.alwaysCloneLeft),b.alwaysCloneRight!==h))a.oCloneOnDraw.right=b.alwaysCloneRight},_fnCloneTable:function(a,b,c,d){var f=this.fnGetSettings(),g;"absolute"!=e(f.nTable.parentNode).css("position")&&(f.nTable.parentNode.style.position="relative");g=f.nTable.cloneNode(!1);
        -g.removeAttribute("id");var i=k.createElement("div");i.style.position="absolute";i.style.top="0px";i.style.left="0px";i.className+=" FixedHeader_Cloned "+a+" "+b;"fixedHeader"==a&&(i.style.zIndex=f.oZIndexes.top);"fixedFooter"==a&&(i.style.zIndex=f.oZIndexes.bottom);"fixedLeft"==a?i.style.zIndex=f.oZIndexes.left:"fixedRight"==a&&(i.style.zIndex=f.oZIndexes.right);g.style.margin="0";i.appendChild(g);k.body.appendChild(i);return{nNode:g,nWrapper:i,sType:a,sPosition:"",sTop:"",sLeft:"",fnClone:c,iCells:d}},
        -_fnMeasure:function(){var a=this.fnGetSettings(),b=a.oMes,c=e(a.nTable),d=c.offset(),f=this._fnSumScroll(a.nTable.parentNode,"scrollTop");this._fnSumScroll(a.nTable.parentNode,"scrollLeft");b.iTableWidth=c.outerWidth();b.iTableHeight=c.outerHeight();b.iTableLeft=d.left+a.nTable.parentNode.scrollLeft;b.iTableTop=d.top+f;b.iTableRight=b.iTableLeft+b.iTableWidth;b.iTableRight=FixedHeader.oDoc.iWidth-b.iTableLeft-b.iTableWidth;b.iTableBottom=FixedHeader.oDoc.iHeight-b.iTableTop-b.iTableHeight},_fnSumScroll:function(a,
        -b){for(var c=a[b];(a=a.parentNode)&&!("HTML"==a.nodeName||"BODY"==a.nodeName);)c=a[b];return c},_fnUpdatePositions:function(){var a=this.fnGetSettings();this._fnMeasure();for(var b=0,c=a.aoCache.length;b<c;b++)"fixedHeader"==a.aoCache[b].sType?this._fnScrollFixedHeader(a.aoCache[b]):"fixedFooter"==a.aoCache[b].sType?this._fnScrollFixedFooter(a.aoCache[b]):"fixedLeft"==a.aoCache[b].sType?this._fnScrollHorizontalLeft(a.aoCache[b]):this._fnScrollHorizontalRight(a.aoCache[b])},_fnUpdateClones:function(a){var b=
        -this.fnGetSettings();a&&(b.bInitComplete=!1);for(var c=0,d=b.aoCache.length;c<d;c++)b.aoCache[c].fnClone.call(this,b.aoCache[c]);a&&(b.bInitComplete=!0)},_fnScrollHorizontalRight:function(a){var b=this.fnGetSettings().oMes,c=FixedHeader.oWin,d=FixedHeader.oDoc,f=a.nWrapper,g=e(f).outerWidth();c.iScrollRight<b.iTableRight?(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",f.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+b.iTableWidth-
        -g+"px","left",f.style)):b.iTableLeft<d.iWidth-c.iScrollRight-g?(this._fnUpdateCache(a,"sPosition","fixed","position",f.style),this._fnUpdateCache(a,"sTop",b.iTableTop-c.iScrollTop+"px","top",f.style),this._fnUpdateCache(a,"sLeft",c.iWidth-g+"px","left",f.style)):(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",f.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+"px","left",f.style))},_fnScrollHorizontalLeft:function(a){var b=this.fnGetSettings().oMes,
        -c=FixedHeader.oWin,d=a.nWrapper,f=e(d).outerWidth();c.iScrollLeft<b.iTableLeft?(this._fnUpdateCache(a,"sPosition","absolute","position",d.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",d.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+"px","left",d.style)):c.iScrollLeft<b.iTableLeft+b.iTableWidth-f?(this._fnUpdateCache(a,"sPosition","fixed","position",d.style),this._fnUpdateCache(a,"sTop",b.iTableTop-c.iScrollTop+"px","top",d.style),this._fnUpdateCache(a,"sLeft","0px","left",d.style)):
        -(this._fnUpdateCache(a,"sPosition","absolute","position",d.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",d.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+b.iTableWidth-f+"px","left",d.style))},_fnScrollFixedFooter:function(a){var b=this.fnGetSettings(),c=b.oMes,d=FixedHeader.oWin,f=a.nWrapper,b=e("thead",b.nTable).outerHeight(),g=e(f).outerHeight();d.iScrollBottom<c.iTableBottom?(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",c.iTableTop+
        -c.iTableHeight-g+"px","top",f.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",f.style)):d.iScrollBottom<c.iTableBottom+c.iTableHeight-g-b?(this._fnUpdateCache(a,"sPosition","fixed","position",f.style),this._fnUpdateCache(a,"sTop",d.iHeight-g+"px","top",f.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft-d.iScrollLeft+"px","left",f.style)):(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",c.iTableTop+g+"px","top",f.style),this._fnUpdateCache(a,
        -"sLeft",c.iTableLeft+"px","left",f.style))},_fnScrollFixedHeader:function(a){for(var b=this.fnGetSettings(),c=b.oMes,d=FixedHeader.oWin,e=a.nWrapper,g=0,i=b.nTable.getElementsByTagName("tbody"),h=0;h<i.length;++h)g+=i[h].offsetHeight;c.iTableTop>d.iScrollTop+b.oOffset.top?(this._fnUpdateCache(a,"sPosition","absolute","position",e.style),this._fnUpdateCache(a,"sTop",c.iTableTop+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",e.style)):d.iScrollTop+b.oOffset.top>c.iTableTop+
        -g?(this._fnUpdateCache(a,"sPosition","absolute","position",e.style),this._fnUpdateCache(a,"sTop",c.iTableTop+g+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",e.style)):(this._fnUpdateCache(a,"sPosition","fixed","position",e.style),this._fnUpdateCache(a,"sTop",b.oOffset.top+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft-d.iScrollLeft+"px","left",e.style))},_fnUpdateCache:function(a,b,c,d,e){a[b]!=c&&(e[d]=c,a[b]=c)},_fnClassUpdate:function(a,b){var c=this;
        -if("TR"===a.nodeName.toUpperCase()||"TH"===a.nodeName.toUpperCase()||"TD"===a.nodeName.toUpperCase()||"SPAN"===a.nodeName.toUpperCase())b.className=a.className;e(a).children().each(function(d){c._fnClassUpdate(e(a).children()[d],e(b).children()[d])})},_fnCloneThead:function(a){var b=this.fnGetSettings(),c=a.nNode;if(b.bInitComplete&&!b.oCloneOnDraw.top)this._fnClassUpdate(e("thead",b.nTable)[0],e("thead",c)[0]);else{var d=e(b.nTable).outerWidth();a.nWrapper.style.width=d+"px";for(c.style.width=d+
        -"px";0<c.childNodes.length;)e("thead th",c).unbind("click"),c.removeChild(c.childNodes[0]);a=e("thead",b.nTable).clone(!0)[0];c.appendChild(a);var f=[],g=[];e("thead>tr th",b.nTable).each(function(){f.push(e(this).width())});e("thead>tr td",b.nTable).each(function(){g.push(e(this).width())});e("thead>tr th",b.nTable).each(function(a){e("thead>tr th:eq("+a+")",c).width(f[a]);e(this).width(f[a])});e("thead>tr td",b.nTable).each(function(a){e("thead>tr td:eq("+a+")",c).width(g[a]);e(this).width(g[a])});
        -e("th.sorting, th.sorting_desc, th.sorting_asc",c).bind("click",function(){this.blur()})}},_fnCloneTfoot:function(a){var b=this.fnGetSettings(),c=a.nNode;for(a.nWrapper.style.width=e(b.nTable).outerWidth()+"px";0<c.childNodes.length;)c.removeChild(c.childNodes[0]);a=e("tfoot",b.nTable).clone(!0)[0];c.appendChild(a);e("tfoot:eq(0)>tr th",b.nTable).each(function(a){e("tfoot:eq(0)>tr th:eq("+a+")",c).width(e(this).width())});e("tfoot:eq(0)>tr td",b.nTable).each(function(a){e("tfoot:eq(0)>tr td:eq("+
        -a+")",c).width(e(this).width())})},_fnCloneTLeft:function(a){for(var b=this.fnGetSettings(),c=a.nNode,d=e("tbody",b.nTable)[0];0<c.childNodes.length;)c.removeChild(c.childNodes[0]);c.appendChild(e("thead",b.nTable).clone(!0)[0]);c.appendChild(e("tbody",b.nTable).clone(!0)[0]);b.bFooter&&c.appendChild(e("tfoot",b.nTable).clone(!0)[0]);var f="gt("+(a.iCells-1)+")";e("thead tr",c).each(function(){e("th:"+f,this).remove()});e("tfoot tr",c).each(function(){e("th:"+f,this).remove()});e("tbody tr",c).each(function(){e("td:"+
        -f,this).remove()});this.fnEqualiseHeights("thead",d.parentNode,c);this.fnEqualiseHeights("tbody",d.parentNode,c);this.fnEqualiseHeights("tfoot",d.parentNode,c);for(var g=d=0;g<a.iCells;g++)d+=e("thead tr th:eq("+g+")",b.nTable).outerWidth();c.style.width=d+"px";a.nWrapper.style.width=d+"px"},_fnCloneTRight:function(a){for(var b=this.fnGetSettings(),c=e("tbody",b.nTable)[0],d=a.nNode,f=e("tbody tr:eq(0) td",b.nTable).length;0<d.childNodes.length;)d.removeChild(d.childNodes[0]);d.appendChild(e("thead",
        -b.nTable).clone(!0)[0]);d.appendChild(e("tbody",b.nTable).clone(!0)[0]);b.bFooter&&d.appendChild(e("tfoot",b.nTable).clone(!0)[0]);e("thead tr th:lt("+(f-a.iCells)+")",d).remove();e("tfoot tr th:lt("+(f-a.iCells)+")",d).remove();e("tbody tr",d).each(function(){e("td:lt("+(f-a.iCells)+")",this).remove()});this.fnEqualiseHeights("thead",c.parentNode,d);this.fnEqualiseHeights("tbody",c.parentNode,d);this.fnEqualiseHeights("tfoot",c.parentNode,d);for(var g=c=0;g<a.iCells;g++)c+=e("thead tr th:eq("+(f-
        -1-g)+")",b.nTable).outerWidth();d.style.width=c+"px";a.nWrapper.style.width=c+"px"},fnEqualiseHeights:function(a,b,c){var d=e(a+" tr",b),f;e(a+" tr",c).each(function(a){f=d.eq(a).css("height");"Microsoft Internet Explorer"==navigator.appName&&(f=parseInt(f,10)+1);e(this).css("height",f);d.eq(a).css("height",f)})}};FixedHeader.oWin={iScrollTop:0,iScrollRight:0,iScrollBottom:0,iScrollLeft:0,iHeight:0,iWidth:0};FixedHeader.oDoc={iHeight:0,iWidth:0};FixedHeader.afnScroll=[];FixedHeader.fnMeasure=function(){var a=
        -e(j),b=e(k),c=FixedHeader.oWin,d=FixedHeader.oDoc;d.iHeight=b.height();d.iWidth=b.width();c.iHeight=a.height();c.iWidth=a.width();c.iScrollTop=a.scrollTop();c.iScrollLeft=a.scrollLeft();c.iScrollRight=d.iWidth-c.iScrollLeft-c.iWidth;c.iScrollBottom=d.iHeight-c.iScrollTop-c.iHeight};FixedHeader.version="2.1.2";e(j).scroll(function(){FixedHeader.fnMeasure();for(var a=0,b=FixedHeader.afnScroll.length;a<b;a++)FixedHeader.afnScroll[a]()});e.fn.dataTable.FixedHeader=FixedHeader;return e.fn.DataTable.FixedHeader=
        -FixedHeader};"function"===typeof define&&define.amd?define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.FixedHeader&&l(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/Readme.txt b/resources/assets/js/plugins/datatables/extensions/KeyTable/Readme.txt
        deleted file mode 100755
        index 345e9113ba..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/Readme.txt
        +++ /dev/null
        @@ -1,36 +0,0 @@
        -# KeyTable
        -
        -KeyTable provides enhanced accessibility and navigation options for DataTables enhanced tables, by allowing Excel like cell navigation on any table. Events (focus, blur, action etc) can be assigned to individual cells, columns, rows or all cells to allow advanced interaction options.. Key features include:
        -
        -* Easy to use spreadsheet like interaction
        -* Fully integrated with DataTables
        -* Wide range of supported events
        -
        -
        -# Installation
        -
        -To use KeyTable, first download DataTables ( http://datatables.net/download ) and place the unzipped KeyTable package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -KeyTable is initialised using the `C` option that it adds to DataTables' `dom` option. For example:
        -
        -```js
        -$(document).ready( function () {
        -	var table = $('#example').DataTable();
        -	new $.fn.dataTable.KeyTable( table );
        -} );
        -```
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/keytable/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of KeyTable and help make it better, please refer to its GitHub repo: https://github.com/DataTables/KeyTable
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.css b/resources/assets/js/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.css
        deleted file mode 100755
        index 2759df1b2d..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.css
        +++ /dev/null
        @@ -1,7 +0,0 @@
        -
        -
        -table.KeyTable th.focus,
        -table.KeyTable td.focus {
        -	outline: 3px solid #3366FF;
        -	outline-offset: -3px;
        -}
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.min.css b/resources/assets/js/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.min.css
        deleted file mode 100755
        index db04020176..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -table.KeyTable th.focus,table.KeyTable td.focus{outline:3px solid #3366FF;outline-offset:-3px}
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/events.html b/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/events.html
        deleted file mode 100755
        index 2ef0a9f875..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/events.html
        +++ /dev/null
        @@ -1,756 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>KeyTable example - Events</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -function eventMsg ( msg ) {
        -	var n = document.getElementById('info');
        -	n.innerHTML += msg+"<br>";
        -	n.scrollTop = n.scrollHeight;
        -}
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var keys = new $.fn.dataTable.KeyTable( table );
        -
        -	/* Focus handler for all cells in last column */
        -	keys.event.focus( 4, null, function( node, x, y ) {
        -		eventMsg( "Cell "+x+","+y+" focused ('live' event - column)" );
        -	} );
        -	
        -	/* Focus handler for all cells in 8th row */
        -	keys.event.focus( null, 7, function( node, x, y ) {
        -		eventMsg( "Cell "+x+","+y+" focused ('live' event - row)" );
        -	} );
        -	
        -	/* Focus using coords. */
        -	keys.event.focus( 1, 0, function( node ) {
        -		keys.event.remove.focus( node );
        -		eventMsg( "Cell 1,0 focus - this event has now been removed" );
        -	} );
        -	
        -	keys.event.focus( 1, 3, function() {
        -		eventMsg( "Cell 1,3 focus" );
        -	} );
        -	
        -	/* focus with a node */
        -	keys.event.focus( $('#example tbody tr:eq(2) td:eq(0)')[0], function() {
        -		eventMsg( "Cell 0,2 focus" );
        -	} );
        -	
        -	/* Blur using a node */
        -	keys.event.blur( $('#example tbody tr:eq(1) td:eq(2)')[0], function() {
        -		eventMsg( "Cell 1,2 blur" );
        -	} );
        -	
        -	/* Blur using coords */
        -	keys.event.blur( 2, 4, function() {
        -		eventMsg( "Cell 2,4 blur" );
        -	} );
        -	
        -	/* Action */
        -	keys.event.action( 2, 2, function( node ) {
        -		eventMsg( "Cell 2,2 action" );
        -		if ( node.style.fontWeight == "" || node.style.fontWeight == "normal" ) {
        -			node.style.fontWeight = "bold";
        -		}
        -		else {
        -			node.style.fontWeight = "normal";
        -		}
        -	} );
        -	
        -	keys.event.action( 2, 5, function( node ) {
        -		eventMsg( "Cell 2,5 action" );
        -		if ( node.style.fontStyle == "" ) {
        -			node.style.fontStyle = "italic";
        -		}
        -		else {
        -			node.style.fontStyle = "";
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>KeyTable example <span>Events</span></h1>
        -
        -			<div class="info">
        -				<p>KeyTable provides the ability to listen for events such as <code>focus</code>, <code>blur</code>,
        -				<code>esc</code> (the escape key) and 'return' (the return key) can be assigned event handling
        -				functions through KeyTable's the API. This gives you the ability to take an action on a cell.</p>
        -
        -				<p>The example shown below has a few cells (selected at random, but near the top) with blur and focus
        -				events assigned to them. You can also see the navigation around the table using arrow keys.</p>
        -			</div>
        -
        -			<div id="info" class="box">
        -				Event information:<br>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">function eventMsg ( msg ) {
        -	var n = document.getElementById('info');
        -	n.innerHTML += msg+&quot;&lt;br&gt;&quot;;
        -	n.scrollTop = n.scrollHeight;
        -}
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var keys = new $.fn.dataTable.KeyTable( table );
        -
        -	/* Focus handler for all cells in last column */
        -	keys.event.focus( 4, null, function( node, x, y ) {
        -		eventMsg( &quot;Cell &quot;+x+&quot;,&quot;+y+&quot; focused ('live' event - column)&quot; );
        -	} );
        -	
        -	/* Focus handler for all cells in 8th row */
        -	keys.event.focus( null, 7, function( node, x, y ) {
        -		eventMsg( &quot;Cell &quot;+x+&quot;,&quot;+y+&quot; focused ('live' event - row)&quot; );
        -	} );
        -	
        -	/* Focus using coords. */
        -	keys.event.focus( 1, 0, function( node ) {
        -		keys.event.remove.focus( node );
        -		eventMsg( &quot;Cell 1,0 focus - this event has now been removed&quot; );
        -	} );
        -	
        -	keys.event.focus( 1, 3, function() {
        -		eventMsg( &quot;Cell 1,3 focus&quot; );
        -	} );
        -	
        -	/* focus with a node */
        -	keys.event.focus( $('#example tbody tr:eq(2) td:eq(0)')[0], function() {
        -		eventMsg( &quot;Cell 0,2 focus&quot; );
        -	} );
        -	
        -	/* Blur using a node */
        -	keys.event.blur( $('#example tbody tr:eq(1) td:eq(2)')[0], function() {
        -		eventMsg( &quot;Cell 1,2 blur&quot; );
        -	} );
        -	
        -	/* Blur using coords */
        -	keys.event.blur( 2, 4, function() {
        -		eventMsg( &quot;Cell 2,4 blur&quot; );
        -	} );
        -	
        -	/* Action */
        -	keys.event.action( 2, 2, function( node ) {
        -		eventMsg( &quot;Cell 2,2 action&quot; );
        -		if ( node.style.fontWeight == &quot;&quot; || node.style.fontWeight == &quot;normal&quot; ) {
        -			node.style.fontWeight = &quot;bold&quot;;
        -		}
        -		else {
        -			node.style.fontWeight = &quot;normal&quot;;
        -		}
        -	} );
        -	
        -	keys.event.action( 2, 5, function( node ) {
        -		eventMsg( &quot;Cell 2,5 action&quot; );
        -		if ( node.style.fontStyle == &quot;&quot; ) {
        -			node.style.fontStyle = &quot;italic&quot;;
        -		}
        -		else {
        -			node.style.fontStyle = &quot;&quot;;
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./events.html">Events</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./html.html">Plain HTML table</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/html.html b/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/html.html
        deleted file mode 100755
        index a0a0e108b7..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/html.html
        +++ /dev/null
        @@ -1,627 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>KeyTable example - Plain HTML table</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').addClass('KeyTable');
        -	new $.fn.dataTable.KeyTable();
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>KeyTable example <span>Plain HTML table</span></h1>
        -
        -			<div class="info">
        -				<p>As well as being usable with DataTables, KeyTable can also be used with a plain HTML table. Please
        -				note that this ability is deprecated and will be removed in KeyTable 1.3.</p>
        -
        -				<p>This example shows KeyTable being initialised without any parameter, which instructs it to search
        -				for any table with the class <code>KeyTable</code> which will be used.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	$('#example').addClass('KeyTable');
        -	new $.fn.dataTable.KeyTable();
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./events.html">Events</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li class="active"><a href="./html.html">Plain HTML table</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/index.html b/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/index.html
        deleted file mode 100755
        index 71ab0a8f85..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/index.html
        +++ /dev/null
        @@ -1,69 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>KeyTable examples - KeyTable examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>KeyTable example <span>KeyTable examples</span></h1>
        -
        -			<div class="info">
        -				<p>KeyTable provides enhanced accessibility and navigation options for DataTables enhanced tables, by
        -				allowing Excel like cell navigation on any table. Events (focus, blur, action etc) can be assigned to
        -				individual cells, columns, rows or all cells to allow advanced interaction options.. Key features
        -				include:</p>
        -
        -				<ul class="markdown">
        -					<li>Easy to use spreadsheet like interaction</li>
        -					<li>Fully integrated with DataTables</li>
        -					<li>Wide range of supported events</li>
        -					<li>Works without DataTables if you just want a plain table</li>
        -				</ul>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./events.html">Events</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./html.html">Plain HTML table</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/scrolling.html b/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/scrolling.html
        deleted file mode 100755
        index 6df1580538..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/scrolling.html
        +++ /dev/null
        @@ -1,637 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>KeyTable example - Scrolling table</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY: 300,
        -		paging: false
        -	} );
        -
        -	new $.fn.dataTable.KeyTable( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>KeyTable example <span>Scrolling table</span></h1>
        -
        -			<div class="info">
        -				<p>KeyTable supports DataTables' scrolling options (<a href=
        -				"//datatables.net/reference/option/scrollX"><code class="option" title=
        -				"DataTables initialisation option">scrollX<span>DT</span></code></a> and <a href=
        -				"//datatables.net/reference/option/scrollY"><code class="option" title=
        -				"DataTables initialisation option">scrollY<span>DT</span></code></a>) without required any additional
        -				configuration. As the navigation keys are used to alter the focus of the KeyTable, the DataTables
        -				scrolling position is altered to show the focused cell.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY: 300,
        -		paging: false
        -	} );
        -
        -	new $.fn.dataTable.KeyTable( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./events.html">Events</a></li>
        -							<li class="active"><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./html.html">Plain HTML table</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/simple.html
        deleted file mode 100755
        index e18ed1c6d2..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/examples/simple.html
        +++ /dev/null
        @@ -1,631 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>KeyTable example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.KeyTable( table );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>KeyTable example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>KeyTable allows you to use keyboard navigation on a DataTables enhanced table, like an Excel
        -				spreadsheet. The focused cell is shown through the CSS class ('focus') which in the case below is
        -				simply a blue border. Use your keyboard's arrow keys and click the cells in the table to navigate.</p>
        -
        -				<p>This example simply shows key table being initialised on a DataTable, but <a href=
        -				"events.html">events</a> can be listened for through the KeyTable API which provide interaction
        -				options.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.KeyTable( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./events.html">Events</a></li>
        -							<li><a href="./scrolling.html">Scrolling table</a></li>
        -							<li><a href="./html.html">Plain HTML table</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.js b/resources/assets/js/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.js
        deleted file mode 100755
        index f303f76600..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.js
        +++ /dev/null
        @@ -1,1175 +0,0 @@
        -/*! KeyTable 1.2.1
        - * ©2010-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     KeyTable
        - * @description Spreadsheet like keyboard navigation for DataTables
        - * @version     1.2.1
        - * @file        dataTables.keyTable.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2009-2014 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -// Global scope for KeyTable for backwards compatibility. Will be removed in 1.3
        -var KeyTable;
        -
        -
        -(function(window, document, undefined) {
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -KeyTable = function ( oInit )
        -{
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * API parameters
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/*
        -	 * Variable: block
        -	 * Purpose:  Flag whether or not KeyTable events should be processed
        -	 * Scope:    KeyTable - public
        -	 */
        -	this.block = false;
        -
        -	/*
        -	 * Variable: event
        -	 * Purpose:  Container for all event application methods
        -	 * Scope:    KeyTable - public
        -	 * Notes:    This object contains all the public methods for adding and removing events - these
        -	 *           are dynamically added later on
        -	 */
        -	this.event = {
        -		"remove": {}
        -	};
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * API methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/*
        -	 * Function: fnGetCurrentPosition
        -	 * Purpose:  Get the currently focused cell's position
        -	 * Returns:  array int: [ x, y ]
        -	 * Inputs:   void
        -	 */
        -	this.fnGetCurrentPosition = function ()
        -	{
        -		return [ _iOldX, _iOldY ];
        -	};
        -
        -
        -	/*
        -	 * Function: fnGetCurrentData
        -	 * Purpose:  Get the currently focused cell's data (innerHTML)
        -	 * Returns:  string: - data requested
        -	 * Inputs:   void
        -	 */
        -	this.fnGetCurrentData = function ()
        -	{
        -		return _nOldFocus.innerHTML;
        -	};
        -
        -
        -	/*
        -	 * Function: fnGetCurrentTD
        -	 * Purpose:  Get the currently focused cell
        -	 * Returns:  node: - focused element
        -	 * Inputs:   void
        -	 */
        -	this.fnGetCurrentTD = function ()
        -	{
        -		return _nOldFocus;
        -	};
        -
        -
        -	/*
        -	 * Function: fnSetPosition
        -	 * Purpose:  Set the position of the focused cell
        -	 * Returns:  -
        -	 * Inputs:   int:x - x coordinate
        -	 *           int:y - y coordinate
        -	 * Notes:    Thanks to Rohan Daxini for the basis of this function
        -	 */
        -	this.fnSetPosition = function( x, y )
        -	{
        -		if ( typeof x == 'object' && x.nodeName )
        -		{
        -			_fnSetFocus( x );
        -		}
        -		else
        -		{
        -			_fnSetFocus( _fnCellFromCoords(x, y) );
        -		}
        -	};
        -
        -
        -	/*
        -	 * Function: fnBlur
        -	 * Purpose:  Blur the current focus
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	this.fnBlur = function()
        -	{
        -		_fnBlur();
        -	};
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private parameters
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/*
        -	 * Variable: _nBody
        -	 * Purpose:  Body node of the table - cached for renference
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _nBody = null;
        -
        -	/*
        -	 * Variable: 
        -	 * Purpose:  
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _nOldFocus = null;
        -
        -	/*
        -	 * Variable: _iOldX and _iOldY
        -	 * Purpose:  X and Y coords of the old elemet that was focused on
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _iOldX = null;
        -	var _iOldY = null;
        -
        -	/*
        -	 * Variable: _that
        -	 * Purpose:  Scope saving for 'this' after a jQuery event
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _that = null;
        -
        -	/*
        -	 * Variable: sFocusClass
        -	 * Purpose:  Class that should be used for focusing on a cell
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _sFocusClass = "focus";
        -
        -	/*
        -	 * Variable: _bKeyCapture
        -	 * Purpose:  Flag for should KeyTable capture key events or not
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _bKeyCapture = false;
        -
        -	/*
        -	 * Variable: _oaoEvents
        -	 * Purpose:  Event cache object, one array for each supported event for speed of searching
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _oaoEvents = {
        -		"action": [],
        -		"esc": [],
        -		"focus": [],
        -		"blur": []
        -	};
        -
        -	/*
        -	 * Variable: _oDatatable
        -	 * Purpose:  DataTables settings object for if we are actually using a 
        -	 *           DataTables table
        -	 * Scope:    KeyTable - private
        -	 */
        -	var _oDatatable = null;
        -
        -	var _bForm;
        -	var _nInput;
        -	var _bInputFocused = false;
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Key table events
        -	 */
        -
        -	/*
        -	 * Function: _fnEventAddTemplate
        -	 * Purpose:  Create a function (with closure for sKey) event addition API
        -	 * Returns:  function: - template function
        -	 * Inputs:   string:sKey - type of event to detect
        -	 */
        -	function _fnEventAddTemplate( sKey )
        -	{
        -		/*
        -		 * Function: -
        -		 * Purpose:  API function for adding event to cache
        -		 * Returns:  -
        -		 * Inputs:   1. node:x - target node to add event for
        -		 *           2. function:y - callback function to apply
        -		 *         or
        -		 *           1. int:x - x coord. of target cell (can be null for live events)
        -		 *           2. int:y - y coord. of target cell (can be null for live events)
        -		 *           3. function:z - callback function to apply
        -		 * Notes:    This function is (interally) overloaded (in as much as javascript allows for
        -		 *           that) - the target cell can be given by either node or coords.
        -		 */
        -		return function ( x, y, z ) {
        -			if ( (x===null || typeof x == "number") &&
        -				 (y===null || typeof y == "number") &&
        -				 typeof z == "function" )
        -			{
        -				_fnEventAdd( sKey, x, y, z );
        -			}
        -			else if ( typeof x == "object" && typeof y == "function" )
        -			{
        -				var aCoords = _fnCoordsFromCell( x );
        -				_fnEventAdd( sKey, aCoords[0], aCoords[1], y );
        -			}
        -			else
        -			{
        -				alert( "Unhandable event type was added: x" +x+ "  y:" +y+ "  z:" +z );
        -			}
        -		};
        -	}
        -
        -
        -	/*
        -	 * Function: _fnEventRemoveTemplate
        -	 * Purpose:  Create a function (with closure for sKey) event removal API
        -	 * Returns:  function: - template function
        -	 * Inputs:   string:sKey - type of event to detect
        -	 */
        -	function _fnEventRemoveTemplate( sKey )
        -	{
        -		/*
        -		 * Function: -
        -		 * Purpose:  API function for removing event from cache
        -		 * Returns:  int: - number of events removed
        -		 * Inputs:   1. node:x - target node to remove event from
        -		 *           2. function:y - callback function to apply
        -		 *         or
        -		 *           1. int:x - x coord. of target cell (can be null for live events)
        -		 *           2. int:y - y coord. of target cell (can be null for live events)
        -		 *           3. function:z - callback function to remove - optional
        -		 * Notes:    This function is (interally) overloaded (in as much as javascript allows for
        -		 *           that) - the target cell can be given by either node or coords and the function
        -		 *           to remove is optional
        -		 */
        -		return function ( x, y, z ) {
        -			if ( (x===null || typeof arguments[0] == "number") &&
        -				 (y===null || typeof arguments[1] == "number" ) )
        -			{
        -				if ( typeof arguments[2] == "function" )
        -				{
        -					_fnEventRemove( sKey, x, y, z );
        -				}
        -				else
        -				{
        -					_fnEventRemove( sKey, x, y );
        -				}
        -			}
        -			else if ( typeof arguments[0] == "object" )
        -			{
        -				var aCoords = _fnCoordsFromCell( x );
        -				if ( typeof arguments[1] == "function" )
        -				{
        -					_fnEventRemove( sKey, aCoords[0], aCoords[1], y );
        -				}
        -				else
        -				{
        -					_fnEventRemove( sKey, aCoords[0], aCoords[1] );
        -				}
        -			}
        -			else
        -			{
        -				alert( "Unhandable event type was removed: x" +x+ "  y:" +y+ "  z:" +z );
        -			}
        -		};
        -	}
        -
        -	/* Use the template functions to add the event API functions */
        -	for ( var sKey in _oaoEvents )
        -	{
        -		if ( sKey )
        -		{
        -			this.event[sKey] = _fnEventAddTemplate( sKey );
        -			this.event.remove[sKey] = _fnEventRemoveTemplate( sKey );
        -		}
        -	}
        -
        -
        -	/*
        -	 * Function: _fnEventAdd
        -	 * Purpose:  Add an event to the internal cache
        -	 * Returns:  -
        -	 * Inputs:   string:sType - type of event to add, given by the available elements in _oaoEvents
        -	 *           int:x - x-coords to add event to - can be null for "blanket" event
        -	 *           int:y - y-coords to add event to - can be null for "blanket" event
        -	 *           function:fn - callback function for when triggered
        -	 */
        -	function _fnEventAdd( sType, x, y, fn )
        -	{
        -		_oaoEvents[sType].push( {
        -			"x": x,
        -			"y": y,
        -			"fn": fn
        -		} );
        -	}
        -
        -
        -	/*
        -	 * Function: _fnEventRemove
        -	 * Purpose:  Remove an event from the event cache
        -	 * Returns:  int: - number of matching events removed
        -	 * Inputs:   string:sType - type of event to look for
        -	 *           node:nTarget - target table cell
        -	 *           function:fn - optional - remove this function. If not given all handlers of this
        -	 *             type will be removed
        -	 */
        -	function _fnEventRemove( sType, x, y, fn )
        -	{
        -		var iCorrector = 0;
        -
        -		for ( var i=0, iLen=_oaoEvents[sType].length ; i<iLen-iCorrector ; i++ )
        -		{
        -			if ( typeof fn != 'undefined' )
        -			{
        -				if ( _oaoEvents[sType][i-iCorrector].x == x &&
        -					 _oaoEvents[sType][i-iCorrector].y == y &&
        -					   _oaoEvents[sType][i-iCorrector].fn == fn )
        -				{
        -					_oaoEvents[sType].splice( i-iCorrector, 1 );
        -					iCorrector++;
        -				}
        -			}
        -			else
        -			{
        -				if ( _oaoEvents[sType][i-iCorrector].x == x &&
        -					 _oaoEvents[sType][i-iCorrector].y == y )
        -				{
        -					_oaoEvents[sType].splice( i, 1 );
        -					return 1;
        -				}
        -			}
        -		}
        -		return iCorrector;
        -	}
        -
        -
        -	/*
        -	 * Function: _fnEventFire
        -	 * Purpose:  Look thought the events cache and fire off the event of interest
        -	 * Returns:  int:iFired - number of events fired
        -	 * Inputs:   string:sType - type of event to look for
        -	 *           int:x - x coord of cell
        -	 *           int:y - y coord of  ell
        -	 * Notes:    It might be more efficient to return after the first event has been tirggered,
        -	 *           but that would mean that only one function of a particular type can be
        -	 *           subscribed to a particular node.
        -	 */
        -	function _fnEventFire ( sType, x, y )
        -	{
        -		var iFired = 0;
        -		var aEvents = _oaoEvents[sType];
        -		for ( var i=0 ; i<aEvents.length ; i++ )
        -		{
        -			if ( (aEvents[i].x == x     && aEvents[i].y == y    ) ||
        -				 (aEvents[i].x === null && aEvents[i].y == y    ) ||
        -				 (aEvents[i].x == x     && aEvents[i].y === null ) ||
        -				 (aEvents[i].x === null && aEvents[i].y === null )
        -			)
        -			{
        -				aEvents[i].fn( _fnCellFromCoords(x,y), x, y );
        -				iFired++;
        -			}
        -		}
        -		return iFired;
        -	}
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Focus functions
        -	 */
        -
        -	/*
        -	 * Function: _fnSetFocus
        -	 * Purpose:  Set focus on a node, and remove from an old node if needed
        -	 * Returns:  -
        -	 * Inputs:   node:nTarget - node we want to focus on
        -	 *           bool:bAutoScroll - optional - should we scroll the view port to the display
        -	 */
        -	function _fnSetFocus( nTarget, bAutoScroll )
        -	{
        -		/* If node already has focus, just ignore this call */
        -		if ( _nOldFocus == nTarget )
        -		{
        -			return;
        -		}
        -
        -		if ( typeof bAutoScroll == 'undefined' )
        -		{
        -			bAutoScroll = true;
        -		}
        -
        -		/* Remove old focus (with blur event if needed) */
        -		if ( _nOldFocus !== null )
        -		{
        -			_fnRemoveFocus( _nOldFocus );
        -		}
        -
        -		/* Add the new class to highlight the focused cell */
        -		$(nTarget).addClass( _sFocusClass );
        -		$(nTarget).parent().addClass( _sFocusClass );
        -
        -		/* If it's a DataTable then we need to jump the paging to the relevant page */
        -		var oSettings;
        -		if ( _oDatatable )
        -		{
        -			oSettings = _oDatatable;
        -			var iRow = _fnFindDtCell( nTarget )[1];
        -			var bKeyCaptureCache = _bKeyCapture;
        -
        -			/* Page forwards */
        -			while ( iRow >= oSettings.fnDisplayEnd() )
        -			{
        -				if ( oSettings._iDisplayLength >= 0 )
        -				{
        -					/* Make sure we are not over running the display array */
        -					if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
        -					{
        -						oSettings._iDisplayStart += oSettings._iDisplayLength;
        -					}
        -				}
        -				else
        -				{
        -					oSettings._iDisplayStart = 0;
        -				}
        -				_oDatatable.oApi._fnCalculateEnd( oSettings );
        -			}
        -
        -			/* Page backwards */
        -			while ( iRow < oSettings._iDisplayStart )
        -			{
        -				oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
        -					oSettings._iDisplayStart - oSettings._iDisplayLength :
        -					0;
        -
        -				if ( oSettings._iDisplayStart < 0 )
        -				{
        -				  oSettings._iDisplayStart = 0;
        -				}
        -				_oDatatable.oApi._fnCalculateEnd( oSettings );
        -			}
        -
        -			/* Re-draw the table */
        -			_oDatatable.oApi._fnDraw( oSettings );
        -
        -			/* Restore the key capture */
        -			_bKeyCapture = bKeyCaptureCache;
        -		}
        -
        -		/* Cache the information that we are interested in */
        -		var aNewPos = _fnCoordsFromCell( nTarget );
        -		_nOldFocus = nTarget;
        -		_iOldX = aNewPos[0];
        -		_iOldY = aNewPos[1];
        -
        -		var iViewportHeight, iViewportWidth, iScrollTop, iScrollLeft, iHeight, iWidth, aiPos;
        -		if ( bAutoScroll )
        -		{
        -			/* Scroll the viewport such that the new cell is fully visible in the rendered window */
        -			iViewportHeight = $(window).height();
        -			iViewportWidth = $(window).width();
        -			iScrollTop = $(document).scrollTop();
        -			iScrollLeft = $(document).scrollLeft();
        -			iHeight = nTarget.offsetHeight;
        -			iWidth = nTarget.offsetWidth;
        -			aiPos = _fnGetPos( nTarget );
        -
        -			/* Take account of scrolling in DataTables 1.7 - remove scrolling since that would add to
        -			 * the positioning calculation
        -			 */
        -			if ( _oDatatable && typeof oSettings.oScroll != 'undefined' &&
        -			  (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
        -			{
        -				aiPos[1] -= $(oSettings.nTable.parentNode).scrollTop();
        -				aiPos[0] -= $(oSettings.nTable.parentNode).scrollLeft();
        -			}
        -
        -			/* Correct viewport positioning for vertical scrolling */
        -			if ( aiPos[1]+iHeight > iScrollTop+iViewportHeight )
        -			{
        -				/* Displayed element if off the bottom of the viewport */
        -				_fnSetScrollTop( aiPos[1]+iHeight - iViewportHeight );
        -			}
        -			else if ( aiPos[1] < iScrollTop )
        -			{
        -				/* Displayed element if off the top of the viewport */
        -				_fnSetScrollTop( aiPos[1] );
        -			}
        -
        -			/* Correct viewport positioning for horizontal scrolling */
        -			if ( aiPos[0]+iWidth > iScrollLeft+iViewportWidth )
        -			{
        -				/* Displayed element is off the bottom of the viewport */
        -				_fnSetScrollLeft( aiPos[0]+iWidth - iViewportWidth );
        -			}
        -			else if ( aiPos[0] < iScrollLeft )
        -			{
        -				/* Displayed element if off the Left of the viewport */
        -				_fnSetScrollLeft( aiPos[0] );
        -			}
        -		}
        -
        -		/* Take account of scrolling in DataTables 1.7 */
        -		if ( _oDatatable && typeof oSettings.oScroll != 'undefined' &&
        -		  (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
        -		{
        -			var dtScrollBody = oSettings.nTable.parentNode;
        -			iViewportHeight = dtScrollBody.clientHeight;
        -			iViewportWidth = dtScrollBody.clientWidth;
        -			iScrollTop = dtScrollBody.scrollTop;
        -			iScrollLeft = dtScrollBody.scrollLeft;
        -			iHeight = nTarget.offsetHeight;
        -			iWidth = nTarget.offsetWidth;
        -
        -			/* Correct for vertical scrolling */
        -			if ( nTarget.offsetTop + iHeight > iViewportHeight+iScrollTop )
        -			{
        -				dtScrollBody.scrollTop = (nTarget.offsetTop + iHeight) - iViewportHeight;
        -			}
        -			else if ( nTarget.offsetTop < iScrollTop )
        -			{
        -				dtScrollBody.scrollTop = nTarget.offsetTop;
        -			}
        -
        -			/* Correct for horizontal scrolling */
        -			if ( nTarget.offsetLeft + iWidth > iViewportWidth+iScrollLeft )
        -			{
        -				dtScrollBody.scrollLeft = (nTarget.offsetLeft + iWidth) - iViewportWidth;
        -			}
        -			else if ( nTarget.offsetLeft < iScrollLeft )
        -			{
        -				dtScrollBody.scrollLeft = nTarget.offsetLeft;
        -			}
        -		}
        -
        -		/* Focused - so we want to capture the keys */
        -		_fnCaptureKeys();
        -
        -		/* Fire of the focus event if there is one */
        -		_fnEventFire( "focus", _iOldX, _iOldY );
        -	}
        -
        -
        -	/*
        -	 * Function: _fnBlur
        -	 * Purpose:  Blur focus from the whole table
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	function _fnBlur()
        -	{
        -		_fnRemoveFocus( _nOldFocus );
        -		_iOldX = null;
        -		_iOldY = null;
        -		_nOldFocus = null;
        -		_fnReleaseKeys();
        -	}
        -
        -
        -	/*
        -	 * Function: _fnRemoveFocus
        -	 * Purpose:  Remove focus from a cell and fire any blur events which are attached
        -	 * Returns:  -
        -	 * Inputs:   node:nTarget - cell of interest
        -	 */
        -	function _fnRemoveFocus( nTarget )
        -	{
        -		$(nTarget).removeClass( _sFocusClass );
        -		$(nTarget).parent().removeClass( _sFocusClass );
        -		_fnEventFire( "blur", _iOldX, _iOldY );
        -	}
        -
        -
        -	/*
        -	 * Function: _fnClick
        -	 * Purpose:  Focus on the element that has been clicked on by the user
        -	 * Returns:  -
        -	 * Inputs:   event:e - click event
        -	 */
        -	function _fnClick ( e )
        -	{
        -		var nTarget = this;
        -		while ( nTarget.nodeName != "TD" )
        -		{
        -			nTarget = nTarget.parentNode;
        -		}
        -
        -		_fnSetFocus( nTarget );
        -		_fnCaptureKeys();
        -	}
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Key events
        -	 */
        -
        -	/*
        -	 * Function: _fnKey
        -	 * Purpose:  Deal with a key events, be it moving the focus or return etc.
        -	 * Returns:  bool: - allow browser default action
        -	 * Inputs:   event:e - key event
        -	 */
        -	function _fnKey ( e )
        -	{
        -		/* If user or system has blocked KeyTable from doing anything, just ignore this event */
        -		if ( _that.block || !_bKeyCapture )
        -		{
        -			return true;
        -		}
        -
        -		/* If a modifier key is pressed (exapct shift), ignore the event */
        -		if ( e.metaKey || e.altKey || e.ctrlKey )
        -		{
        -			return true;
        -		}
        -		var
        -			x, y,
        -			iTableWidth = _nBody.getElementsByTagName('tr')[0].getElementsByTagName('td').length,
        -			iTableHeight;
        -
        -		/* Get table height and width - done here so as to be dynamic (if table is updated) */
        -		if ( _oDatatable )
        -		{
        -			/* 
        -			 * Locate the current node in the DataTable overriding the old positions - the reason for
        -			 * is is that there might have been some DataTables interaction between the last focus and
        -			 * now
        -			 */
        -			iTableHeight = _oDatatable.aiDisplay.length;
        -
        -			var aDtPos = _fnFindDtCell( _nOldFocus );
        -			if ( aDtPos === null )
        -			{
        -				/* If the table has been updated such that the focused cell can't be seen - do nothing */
        -				return;
        -			}
        -			_iOldX = aDtPos[ 0 ];
        -			_iOldY = aDtPos[ 1 ];
        -		}
        -		else
        -		{
        -			iTableHeight = _nBody.getElementsByTagName('tr').length;
        -		}
        -
        -		/* Capture shift+tab to match the left arrow key */
        -		var iKey = (e.keyCode == 9 && e.shiftKey) ? -1 : e.keyCode;
        -
        -		switch( iKey )
        -		{
        -			case 13: /* return */
        -				e.preventDefault();
        -				e.stopPropagation();
        -				_fnEventFire( "action", _iOldX, _iOldY );
        -				return true;
        -
        -			case 27: /* esc */
        -				if ( !_fnEventFire( "esc", _iOldX, _iOldY ) )
        -				{
        -					/* Only lose focus if there isn't an escape handler on the cell */
        -					_fnBlur();
        -					return;
        -				}
        -				x = _iOldX;
        -				y = _iOldY;
        -				break;
        -
        -			case -1:
        -			case 37: /* left arrow */
        -				if ( _iOldX > 0 ) {
        -					x = _iOldX - 1;
        -					y = _iOldY;
        -				} else if ( _iOldY > 0 ) {
        -					x = iTableWidth-1;
        -					y = _iOldY - 1;
        -				} else {
        -					/* at start of table */
        -					if ( iKey == -1 && _bForm )
        -					{
        -						/* If we are in a form, return focus to the 'input' element such that tabbing will
        -						 * follow correctly in the browser
        -						 */
        -						_bInputFocused = true;
        -						_nInput.focus();
        -
        -						/* This timeout is a little nasty - but IE appears to have some asyhnc behaviour for 
        -						 * focus
        -						 */
        -						setTimeout( function(){ _bInputFocused = false; }, 0 );
        -						_bKeyCapture = false;
        -						_fnBlur();
        -						return true;
        -					}
        -					else
        -					{
        -						return false;
        -					}
        -				}
        -				break;
        -
        -			case 38: /* up arrow */
        -				if ( _iOldY > 0 ) {
        -					x = _iOldX;
        -					y = _iOldY - 1;
        -				} else {
        -					return false;
        -				}
        -				break;
        -
        -			case 36: /* home */
        -				x = _iOldX;
        -				y = 0;
        -				break;
        -
        -			case 33: /* page up */
        -				x = _iOldX;
        -				y = _iOldY - 10;
        -				if (y < 0) {
        -					y = 0;
        -				}
        -				break;
        -
        -			case 9: /* tab */
        -			case 39: /* right arrow */
        -				if ( _iOldX < iTableWidth-1 ) {
        -					x = _iOldX + 1;
        -					y = _iOldY;
        -				} else if ( _iOldY < iTableHeight-1 ) {
        -					x = 0;
        -					y = _iOldY + 1;
        -				} else {
        -					/* at end of table */
        -					if ( iKey == 9 && _bForm )
        -					{
        -						/* If we are in a form, return focus to the 'input' element such that tabbing will
        -						 * follow correctly in the browser
        -						 */
        -						_bInputFocused = true;
        -						_nInput.focus();
        -
        -						/* This timeout is a little nasty - but IE appears to have some asyhnc behaviour for 
        -						 * focus
        -						 */
        -						setTimeout( function(){ _bInputFocused = false; }, 0 );
        -						_bKeyCapture = false;
        -						_fnBlur();
        -						return true;
        -					}
        -					else
        -					{
        -						return false;
        -					}
        -				}
        -				break;
        -
        -			case 40: /* down arrow */
        -				if ( _iOldY < iTableHeight-1 ) {
        -					x = _iOldX;
        -					y = _iOldY + 1;
        -				} else {
        -					return false;
        -				}
        -				break;
        -
        -			case 35: /* end */
        -				x = _iOldX;
        -				y = iTableHeight-1;
        -				break;
        -
        -			case 34: /* page down */
        -				x = _iOldX;
        -				y = _iOldY+10;
        -				if (y > iTableHeight-1) {
        -					y = iTableHeight-1;
        -				}
        -				break;
        -
        -			default: /* Nothing we are interested in */
        -				return true;
        -		}
        -
        -		_fnSetFocus( _fnCellFromCoords(x, y) );
        -		return false;
        -	}
        -
        -
        -	/*
        -	 * Function: _fnCaptureKeys
        -	 * Purpose:  Start capturing key events for this table
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	function _fnCaptureKeys( )
        -	{
        -		if ( !_bKeyCapture )
        -		{
        -			_bKeyCapture = true;
        -		}
        -	}
        -
        -
        -	/*
        -	 * Function: _fnReleaseKeys
        -	 * Purpose:  Stop capturing key events for this table
        -	 * Returns:  -
        -	 * Inputs:   -
        -	 */
        -	function _fnReleaseKeys( )
        -	{
        -		_bKeyCapture = false;
        -	}
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Support functions
        -	 */
        -
        -	/*
        -	 * Function: _fnCellFromCoords
        -	 * Purpose:  Calulate the target TD cell from x and y coordinates
        -	 * Returns:  node: - TD target
        -	 * Inputs:   int:x - x coordinate
        -	 *           int:y - y coordinate
        -	 */
        -	function _fnCellFromCoords( x, y )
        -	{
        -		if ( _oDatatable )
        -		{
        -			if ( typeof _oDatatable.aoData[ _oDatatable.aiDisplay[ y ] ] != 'undefined' )
        -			{
        -				return _oDatatable.aoData[ _oDatatable.aiDisplay[ y ] ].nTr.getElementsByTagName('td')[x];
        -			}
        -			else
        -			{
        -				return null;
        -			}
        -		}
        -		else
        -		{
        -			return $('tr:eq('+y+')>td:eq('+x+')', _nBody )[0];
        -		}
        -	}
        -
        -
        -	/*
        -	 * Function: _fnCoordsFromCell
        -	 * Purpose:  Calculate the x and y position in a table from a TD cell
        -	 * Returns:  array[2] int: [x, y]
        -	 * Inputs:   node:n - TD cell of interest
        -	 * Notes:    Not actually interested in this for DataTables since it might go out of date
        -	 */
        -	function _fnCoordsFromCell( n )
        -	{
        -		if ( _oDatatable )
        -		{
        -			return [
        -				$('td', n.parentNode).index(n),
        -				$('tr', n.parentNode.parentNode).index(n.parentNode) + _oDatatable._iDisplayStart
        -			];
        -		}
        -		else
        -		{
        -			return [
        -				$('td', n.parentNode).index(n),
        -				$('tr', n.parentNode.parentNode).index(n.parentNode)
        -			];
        -		}
        -	}
        -
        -
        -	/*
        -	 * Function: _fnSetScrollTop
        -	 * Purpose:  Set the vertical scrolling position
        -	 * Returns:  -
        -	 * Inputs:   int:iPos - scrolltop
        -	 * Notes:    This is so nasty, but without browser detection you can't tell which you should set
        -	 *           So on browsers that support both, the scroll top will be set twice. I can live with
        -	 *           that :-)
        -	 */
        -	function _fnSetScrollTop( iPos )
        -	{
        -		document.documentElement.scrollTop = iPos;
        -		document.body.scrollTop = iPos;
        -	}
        -
        -
        -	/*
        -	 * Function: _fnSetScrollLeft
        -	 * Purpose:  Set the horizontal scrolling position
        -	 * Returns:  -
        -	 * Inputs:   int:iPos - scrollleft
        -	 */
        -	function _fnSetScrollLeft( iPos )
        -	{
        -		document.documentElement.scrollLeft = iPos;
        -		document.body.scrollLeft = iPos;
        -	}
        -
        -
        -	/*
        -	 * Function: _fnGetPos
        -	 * Purpose:  Get the position of an object on the rendered page
        -	 * Returns:  array[2] int: [left, right]
        -	 * Inputs:   node:obj - element of interest
        -	 */
        -	function _fnGetPos ( obj )
        -	{
        -		var iLeft = 0;
        -		var iTop = 0;
        -
        -		if (obj.offsetParent)
        -		{
        -			iLeft = obj.offsetLeft;
        -			iTop = obj.offsetTop;
        -			obj = obj.offsetParent;
        -			while (obj)
        -			{
        -				iLeft += obj.offsetLeft;
        -				iTop += obj.offsetTop;
        -				obj = obj.offsetParent;
        -			}
        -		}
        -		return [iLeft,iTop];
        -	}
        -
        -
        -	/*
        -	 * Function: _fnFindDtCell
        -	 * Purpose:  Get the coords. of a cell from the DataTables internal information
        -	 * Returns:  array[2] int: [x, y] coords. or null if not found
        -	 * Inputs:   node:nTarget - the node of interest
        -	 */
        -	function _fnFindDtCell( nTarget )
        -	{
        -		for ( var i=0, iLen=_oDatatable.aiDisplay.length ; i<iLen ; i++ )
        -		{
        -			var nTr = _oDatatable.aoData[ _oDatatable.aiDisplay[i] ].nTr;
        -			var nTds = nTr.getElementsByTagName('td');
        -			for ( var j=0, jLen=nTds.length ; j<jLen ; j++ )
        -			{
        -				if ( nTds[j] == nTarget )
        -				{
        -					return [ j, i ];
        -				}
        -			}
        -		}
        -		return null;
        -	}
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Initialisation
        -	 */
        -
        -	/*
        -	 * Function: _fnInit
        -	 * Purpose:  Initialise the KeyTable
        -	 * Returns:  -
        -	 * Inputs:   object:oInit - optional - Initalisation object with the following parameters:
        -	 *   array[2] int:focus - x and y coordinates of the initial target
        -	 *     or
        -	 *     node:focus - the node to set initial focus on
        -	 *   node:table - the table to use, if not given, first table with class 'KeyTable' will be used
        -	 *   string:focusClass - focusing class to give to table elements
        -	 *           object:that - focus
        -	 *   bool:initScroll - scroll the view port on load, default true
        -	 *   int:tabIndex - the tab index to give the hidden input element
        -	 */
        -	function _fnInit( table, datatable, oInit, that )
        -	{
        -		/* Save scope */
        -		_that = that;
        -
        -		/* Capture undefined initialisation and apply the defaults */
        -		if ( typeof oInit == 'undefined' ) {
        -			oInit = {};
        -		}
        -
        -		if ( typeof oInit.focus == 'undefined' ) {
        -			oInit.focus = [0,0];
        -		}
        -
        -		oInit.table = table;
        -		$(oInit.table).addClass('KeyTable');
        -
        -		if ( typeof oInit.focusClass != 'undefined' ) {
        -			_sFocusClass = oInit.focusClass;
        -		}
        -
        -		if ( typeof datatable != 'undefined' ) {
        -			_oDatatable = datatable;
        -		}
        -
        -		if ( typeof oInit.initScroll == 'undefined' ) {
        -			oInit.initScroll = true;
        -		}
        -
        -		if ( typeof oInit.form == 'undefined' ) {
        -			oInit.form = false;
        -		}
        -		_bForm = oInit.form;
        -
        -		/* Cache the tbody node of interest */
        -		_nBody = oInit.table.getElementsByTagName('tbody')[0];
        -
        -		/* If the table is inside a form, then we need a hidden input box which can be used by the
        -		 * browser to catch the browser tabbing for our table
        -		 */
        -		if ( _bForm )
        -		{
        -			var nDiv = document.createElement('div');
        -			_nInput = document.createElement('input');
        -			nDiv.style.height = "1px"; /* Opera requires a little something */
        -			nDiv.style.width = "0px";
        -			nDiv.style.overflow = "hidden";
        -			if ( typeof oInit.tabIndex != 'undefined' )
        -			{
        -				_nInput.tabIndex = oInit.tabIndex;
        -			}
        -			nDiv.appendChild(_nInput);
        -			oInit.table.parentNode.insertBefore( nDiv, oInit.table.nextSibling );
        -
        -			$(_nInput).focus( function () {
        -				/* See if we want to 'tab into' the table or out */
        -				if ( !_bInputFocused )
        -				{
        -					_bKeyCapture = true;
        -					_bInputFocused = false;
        -					if ( typeof oInit.focus.nodeName != "undefined" )
        -					{
        -						_fnSetFocus( oInit.focus, oInit.initScroll );
        -					}
        -					else
        -					{
        -						_fnSetFocus( _fnCellFromCoords( oInit.focus[0], oInit.focus[1]), oInit.initScroll );
        -					}
        -
        -					/* Need to interup the thread for this to work */
        -					setTimeout( function() { _nInput.blur(); }, 0 );
        -				}
        -			} );
        -			_bKeyCapture = false;
        -		}
        -		else
        -		{
        -			/* Set the initial focus on the table */
        -			if ( typeof oInit.focus.nodeName != "undefined" )
        -			{
        -				_fnSetFocus( oInit.focus, oInit.initScroll );
        -			}
        -			else
        -			{
        -				_fnSetFocus( _fnCellFromCoords( oInit.focus[0], oInit.focus[1]), oInit.initScroll );
        -			}
        -			_fnCaptureKeys();
        -		}
        -
        -		/* Add event listeners */
        -		$(document).bind( "keydown", _fnKey );
        -
        -		if ( _oDatatable )
        -		{
        -			$(_oDatatable.nTable).on( 'click', 'td', _fnClick );
        -		}
        -		else
        -		{
        -			$(_nBody).on( 'click', 'td', _fnClick );
        -		}
        -
        -		/* Loose table focus when click outside the table */
        -		$(document).click( function(e) {
        -			var nTarget = e.target;
        -			var bTableClick = false;
        -			while ( nTarget )
        -			{
        -				if ( nTarget == oInit.table )
        -				{
        -					bTableClick = true;
        -					break;
        -				}
        -				nTarget = nTarget.parentNode;
        -			}
        -			if ( !bTableClick )
        -			{
        -				_fnBlur();
        -			}
        -		} );
        -	}
        -
        -	var table, datatable;
        -
        -	if ( oInit === undefined ) {
        -		table = $('table.KeyTable')[0];
        -		datatable = null;
        -	}
        -	else if ( $.isPlainObject( oInit ) ) {
        -		table = oInit.table;
        -		datatable = oInit.datatable;
        -	}
        -	else {
        -		datatable = new $.fn.dataTable.Api( oInit ).settings()[0];
        -		table = datatable.nTable;
        -	}
        -	/* Initialise our new object */
        -	_fnInit( table, datatable, oInit, this );
        -};
        -
        -
        -KeyTable.version = "1.2.1";
        -
        -
        -$.fn.dataTable.KeyTable = KeyTable;
        -$.fn.DataTable.KeyTable = KeyTable;
        -
        -
        -return KeyTable;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.KeyTable ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.min.js b/resources/assets/js/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.min.js
        deleted file mode 100755
        index f4c13d2115..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.min.js
        +++ /dev/null
        @@ -1,18 +0,0 @@
        -/*!
        - KeyTable 1.2.1
        - ©2010-2014 SpryMedia Ltd - datatables.net/license
        -*/
        -var KeyTable;
        -(function(F,n,K){var A=function(d){KeyTable=function(j){function A(a){return function(e,c,p){(null===e||"number"==typeof e)&&(null===c||"number"==typeof c)&&"function"==typeof p?k[a].push({x:e,y:c,fn:p}):"object"==typeof e&&"function"==typeof c?(e=E(e),k[a].push({x:e[0],y:e[1],fn:c})):alert("Unhandable event type was added: x"+e+"  y:"+c+"  z:"+p)}}function L(a){return function(e,c,p){(null===e||"number"==typeof e)&&(null===c||"number"==typeof c)?"function"==typeof p?B(a,e,c,p):B(a,e,c):"object"==
        -typeof e?(e=E(e),"function"==typeof c?B(a,e[0],e[1],c):B(a,e[0],e[1])):alert("Unhandable event type was removed: x"+e+"  y:"+c+"  z:"+p)}}function B(a,e,c,p){for(var h=0,b=0,d=k[a].length;b<d-h;b++)if("undefined"!=typeof p)k[a][b-h].x==e&&(k[a][b-h].y==c&&k[a][b-h].fn==p)&&(k[a].splice(b-h,1),h++);else if(k[a][b-h].x==e&&k[a][b-h].y==c)return k[a].splice(b,1),1;return h}function C(a,e,c){for(var p=0,a=k[a],b=0;b<a.length;b++)if(a[b].x==e&&a[b].y==c||null===a[b].x&&a[b].y==c||a[b].x==e&&null===a[b].y||
        -null===a[b].x&&null===a[b].y)a[b].fn(w(e,c),e,c),p++;return p}function q(a,e){if(t!=a){"undefined"==typeof e&&(e=!0);null!==t&&G(t);d(a).addClass(x);d(a).parent().addClass(x);var c;if(i){c=i;for(var b=H(a)[1],h=o;b>=c.fnDisplayEnd();)0<=c._iDisplayLength?c._iDisplayStart+c._iDisplayLength<c.fnRecordsDisplay()&&(c._iDisplayStart+=c._iDisplayLength):c._iDisplayStart=0,i.oApi._fnCalculateEnd(c);for(;b<c._iDisplayStart;)c._iDisplayStart=0<=c._iDisplayLength?c._iDisplayStart-c._iDisplayLength:0,0>c._iDisplayStart&&
        -(c._iDisplayStart=0),i.oApi._fnCalculateEnd(c);i.oApi._fnDraw(c);o=h}b=E(a);t=a;l=b[0];g=b[1];var r,j,k,m,f;if(e){r=d(F).height();b=d(F).width();j=d(n).scrollTop();h=d(n).scrollLeft();k=a.offsetHeight;m=a.offsetWidth;f=a;var q=0,s=0;if(f.offsetParent){q=f.offsetLeft;s=f.offsetTop;for(f=f.offsetParent;f;)q+=f.offsetLeft,s+=f.offsetTop,f=f.offsetParent}f=[q,s];if(i&&"undefined"!=typeof c.oScroll&&(""!==c.oScroll.sX||""!==c.oScroll.sY))f[1]-=d(c.nTable.parentNode).scrollTop(),f[0]-=d(c.nTable.parentNode).scrollLeft();
        -f[1]+k>j+r?(r=f[1]+k-r,n.documentElement.scrollTop=r,n.body.scrollTop=r):f[1]<j&&(r=f[1],n.documentElement.scrollTop=r,n.body.scrollTop=r);f[0]+m>h+b?(b=f[0]+m-b,n.documentElement.scrollLeft=b,n.body.scrollLeft=b):f[0]<h&&(b=f[0],n.documentElement.scrollLeft=b,n.body.scrollLeft=b)}if(i&&"undefined"!=typeof c.oScroll&&(""!==c.oScroll.sX||""!==c.oScroll.sY))(c=c.nTable.parentNode,r=c.clientHeight,b=c.clientWidth,j=c.scrollTop,h=c.scrollLeft,k=a.offsetHeight,m=a.offsetWidth,a.offsetTop+k>r+j?c.scrollTop=
        -a.offsetTop+k-r:a.offsetTop<j&&(c.scrollTop=a.offsetTop),a.offsetLeft+m>b+h)?c.scrollLeft=a.offsetLeft+m-b:a.offsetLeft<h&&(c.scrollLeft=a.offsetLeft);o||(o=!0);C("focus",l,g)}}function y(){G(t);t=g=l=null;o=!1}function G(a){d(a).removeClass(x);d(a).parent().removeClass(x);C("blur",l,g)}function I(){for(var a=this;"TD"!=a.nodeName;)a=a.parentNode;q(a);o||(o=!0)}function w(a,b){return i?"undefined"!=typeof i.aoData[i.aiDisplay[b]]?i.aoData[i.aiDisplay[b]].nTr.getElementsByTagName("td")[a]:null:d("tr:eq("+
        -b+")>td:eq("+a+")",z)[0]}function E(a){return i?[d("td",a.parentNode).index(a),d("tr",a.parentNode.parentNode).index(a.parentNode)+i._iDisplayStart]:[d("td",a.parentNode).index(a),d("tr",a.parentNode.parentNode).index(a.parentNode)]}function H(a){for(var b=0,c=i.aiDisplay.length;b<c;b++)for(var d=i.aoData[i.aiDisplay[b]].nTr.getElementsByTagName("td"),h=0,g=d.length;h<g;h++)if(d[h]==a)return[h,b];return null}this.block=!1;this.event={remove:{}};this.fnGetCurrentPosition=function(){return[l,g]};this.fnGetCurrentData=
        -function(){return t.innerHTML};this.fnGetCurrentTD=function(){return t};this.fnSetPosition=function(a,b){"object"==typeof a&&a.nodeName?q(a):q(w(a,b))};this.fnBlur=function(){y()};var z=null,t=null,l=null,g=null,J=null,x="focus",o=!1,k={action:[],esc:[],focus:[],blur:[]},i=null,D,s,u=!1,m;for(m in k)m&&(this.event[m]=A(m),this.event.remove[m]=L(m));var v;j===K?(m=d("table.KeyTable")[0],v=null):d.isPlainObject(j)?(m=j.table,v=j.datatable):(v=(new d.fn.dataTable.Api(j)).settings()[0],m=v.nTable);var b=
        -j,J=this;"undefined"==typeof b&&(b={});"undefined"==typeof b.focus&&(b.focus=[0,0]);b.table=m;d(b.table).addClass("KeyTable");"undefined"!=typeof b.focusClass&&(x=b.focusClass);"undefined"!=typeof v&&(i=v);"undefined"==typeof b.initScroll&&(b.initScroll=!0);"undefined"==typeof b.form&&(b.form=!1);D=b.form;z=b.table.getElementsByTagName("tbody")[0];D?(j=n.createElement("div"),s=n.createElement("input"),j.style.height="1px",j.style.width="0px",j.style.overflow="hidden","undefined"!=typeof b.tabIndex&&
        -(s.tabIndex=b.tabIndex),j.appendChild(s),b.table.parentNode.insertBefore(j,b.table.nextSibling),d(s).focus(function(){if(!u){o=true;u=false;typeof b.focus.nodeName!="undefined"?q(b.focus,b.initScroll):q(w(b.focus[0],b.focus[1]),b.initScroll);setTimeout(function(){s.blur()},0)}}),o=!1):("undefined"!=typeof b.focus.nodeName?q(b.focus,b.initScroll):q(w(b.focus[0],b.focus[1]),b.initScroll),o||(o=!0));d(n).bind("keydown",function(a){if(J.block||!o||a.metaKey||a.altKey||a.ctrlKey)return true;var b;b=z.getElementsByTagName("tr")[0].getElementsByTagName("td").length;
        -var c;if(i){c=i.aiDisplay.length;var d=H(t);if(d===null)return;l=d[0];g=d[1]}else c=z.getElementsByTagName("tr").length;d=a.keyCode==9&&a.shiftKey?-1:a.keyCode;switch(d){case 13:a.preventDefault();a.stopPropagation();C("action",l,g);return true;case 27:if(!C("esc",l,g)){y();return}a=l;b=g;break;case -1:case 37:if(l>0){a=l-1;b=g}else if(g>0){a=b-1;b=g-1}else{if(d==-1&&D){u=true;s.focus();setTimeout(function(){u=false},0);o=false;y();return true}return false}break;case 38:if(g>0){a=l;b=g-1}else return false;
        -break;case 36:a=l;b=0;break;case 33:a=l;b=g-10;b<0&&(b=0);break;case 9:case 39:if(l<b-1){a=l+1;b=g}else if(g<c-1){a=0;b=g+1}else{if(d==9&&D){u=true;s.focus();setTimeout(function(){u=false},0);o=false;y();return true}return false}break;case 40:if(g<c-1){a=l;b=g+1}else return false;break;case 35:a=l;b=c-1;break;case 34:a=l;b=g+10;b>c-1&&(b=c-1);break;default:return true}q(w(a,b));return false});if(i)d(i.nTable).on("click","td",I);else d(z).on("click","td",I);d(n).click(function(a){for(var a=a.target,
        -d=false;a;){if(a==b.table){d=true;break}a=a.parentNode}d||y()})};KeyTable.version="1.2.1";d.fn.dataTable.KeyTable=KeyTable;return d.fn.DataTable.KeyTable=KeyTable};"function"===typeof define&&define.amd?define(["jquery","datatables"],A):"object"===typeof exports?A(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.KeyTable&&A(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/css/dataTables.responsive.css b/resources/assets/js/plugins/datatables/extensions/Responsive/css/dataTables.responsive.css
        deleted file mode 100755
        index 1060f9c737..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/css/dataTables.responsive.css
        +++ /dev/null
        @@ -1,106 +0,0 @@
        -table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child,
        -table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child {
        -  position: relative;
        -  padding-left: 30px;
        -  cursor: pointer;
        -}
        -table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child:before,
        -table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child:before {
        -  top: 8px;
        -  left: 4px;
        -  height: 16px;
        -  width: 16px;
        -  display: block;
        -  position: absolute;
        -  color: white;
        -  border: 2px solid white;
        -  border-radius: 16px;
        -  text-align: center;
        -  line-height: 14px;
        -  box-shadow: 0 0 3px #444;
        -  box-sizing: content-box;
        -  content: '+';
        -  background-color: #31b131;
        -}
        -table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child.dataTables_empty:before,
        -table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child.dataTables_empty:before {
        -  display: none;
        -}
        -table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td:first-child:before,
        -table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th:first-child:before {
        -  content: '-';
        -  background-color: #d33333;
        -}
        -table.dataTable.dtr-inline.collapsed > tbody > tr.child td:before {
        -  display: none;
        -}
        -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child,
        -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child {
        -  padding-left: 27px;
        -}
        -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child:before,
        -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child:before {
        -  top: 5px;
        -  left: 4px;
        -  height: 14px;
        -  width: 14px;
        -  border-radius: 14px;
        -  line-height: 12px;
        -}
        -table.dataTable.dtr-column > tbody > tr > td.control,
        -table.dataTable.dtr-column > tbody > tr > th.control {
        -  position: relative;
        -  cursor: pointer;
        -}
        -table.dataTable.dtr-column > tbody > tr > td.control:before,
        -table.dataTable.dtr-column > tbody > tr > th.control:before {
        -  top: 50%;
        -  left: 50%;
        -  height: 16px;
        -  width: 16px;
        -  margin-top: -10px;
        -  margin-left: -10px;
        -  display: block;
        -  position: absolute;
        -  color: white;
        -  border: 2px solid white;
        -  border-radius: 16px;
        -  text-align: center;
        -  line-height: 14px;
        -  box-shadow: 0 0 3px #444;
        -  box-sizing: content-box;
        -  content: '+';
        -  background-color: #31b131;
        -}
        -table.dataTable.dtr-column > tbody > tr.parent td.control:before,
        -table.dataTable.dtr-column > tbody > tr.parent th.control:before {
        -  content: '-';
        -  background-color: #d33333;
        -}
        -table.dataTable > tbody > tr.child {
        -  padding: 0.5em 1em;
        -}
        -table.dataTable > tbody > tr.child:hover {
        -  background: transparent !important;
        -}
        -table.dataTable > tbody > tr.child ul {
        -  display: inline-block;
        -  list-style-type: none;
        -  margin: 0;
        -  padding: 0;
        -}
        -table.dataTable > tbody > tr.child ul li {
        -  border-bottom: 1px solid #efefef;
        -  padding: 0.5em 0;
        -}
        -table.dataTable > tbody > tr.child ul li:first-child {
        -  padding-top: 0;
        -}
        -table.dataTable > tbody > tr.child ul li:last-child {
        -  border-bottom: none;
        -}
        -table.dataTable > tbody > tr.child span.dtr-title {
        -  display: inline-block;
        -  min-width: 75px;
        -  font-weight: bold;
        -}
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/css/dataTables.responsive.scss b/resources/assets/js/plugins/datatables/extensions/Responsive/css/dataTables.responsive.scss
        deleted file mode 100755
        index ed657ff7f0..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/css/dataTables.responsive.scss
        +++ /dev/null
        @@ -1,149 +0,0 @@
        -
        -//
        -// Mixins
        -//
        -@mixin control() {
        -	display: block;
        -	position: absolute;
        -	color: white;
        -	border: 2px solid white;
        -	border-radius: 16px;
        -	text-align: center;
        -	line-height: 14px;
        -	box-shadow: 0 0 3px #444;
        -	box-sizing: content-box;
        -}
        -
        -@mixin control-open() {
        -	content: '+';
        -	background-color: #31b131;
        -}
        -
        -@mixin control-close() {
        -	content: '-';
        -	background-color: #d33333;
        -}
        -
        -
        -//
        -// Table styles
        -//
        -table.dataTable {
        -	// Styling for the `inline` type
        -	&.dtr-inline.collapsed > tbody {
        -		> tr > td:first-child,
        -		> tr > th:first-child {
        -			position: relative;
        -			padding-left: 30px;
        -			cursor: pointer;
        -
        -			&:before {
        -				top: 8px;
        -				left: 4px;
        -				height: 16px;
        -				width: 16px;
        -				@include control;
        -				@include control-open;
        -			}
        -
        -			&.dataTables_empty:before {
        -				display: none;
        -			}
        -		}
        -
        -		> tr.parent {
        -			> td:first-child:before,
        -			> th:first-child:before {
        -				@include control-close;
        -			}
        -		}
        -
        -		> tr.child td:before {
        -			display: none;
        -		}
        -	}
        -
        -	// DataTables' `compact` styling
        -	&.dtr-inline.collapsed.compact > tbody {
        -		> tr > td:first-child,
        -		> tr > th:first-child {
        -			padding-left: 27px;
        -
        -			&:before {
        -				top: 5px;
        -				left: 4px;
        -				height: 14px;
        -				width: 14px;
        -				border-radius: 14px;
        -				line-height: 12px;
        -			}
        -		}
        -	}
        -
        -
        -	// Styling for the `column` type
        -	&.dtr-column > tbody {
        -		> tr > td.control,
        -		> tr > th.control {
        -			position: relative;
        -			cursor: pointer;
        -
        -			&:before {
        -				top: 50%;
        -				left: 50%;
        -				height: 16px;
        -				width: 16px;
        -				margin-top: -10px;
        -				margin-left: -10px;
        -				@include control;
        -				@include control-open;
        -			}
        -		}
        -
        -		> tr.parent {
        -			td.control:before,
        -			th.control:before {
        -				@include control-close;
        -			}
        -		}
        -	}
        -
        -
        -	// Child row styling
        -	> tbody > tr.child {
        -		padding: 0.5em 1em;
        -
        -		&:hover {
        -			background: transparent !important;
        -		}
        -
        -		ul {
        -			display: inline-block;
        -			list-style-type: none;
        -			margin: 0;
        -			padding: 0;
        -
        -			li {
        -				border-bottom: 1px solid #efefef;
        -				padding: 0.5em 0;
        -
        -				&:first-child {
        -					padding-top: 0;
        -				}
        -
        -				&:last-child {
        -					border-bottom: none;
        -				}
        -			}
        -		}
        -
        -		span.dtr-title {
        -			display: inline-block;
        -			min-width: 75px;
        -			font-weight: bold;
        -		}
        -
        -		span.dtr-data {}
        -	}
        -}
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/column-control.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/column-control.html
        deleted file mode 100755
        index 66f213b2e7..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/column-control.html
        +++ /dev/null
        @@ -1,854 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Column controlled child rows</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				type: 'column'
        -			}
        -		},
        -		columnDefs: [ {
        -			className: 'control',
        -			orderable: false,
        -			targets:   0
        -		} ],
        -		order: [ 1, 'asc' ]
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Column controlled child rows</span></h1>
        -
        -			<div class="info">
        -				<p>Responsive has two built in methods for displaying the controlling element of the child rows; <code>inline</code> which is the default option and shows the
        -				control in the first column, and <code>column</code> which set a <em>control column</em> as the control. The control column is shown only when there is some other
        -				column hidden, and is dedicated only to the show / hide control for the rows.</p>
        -
        -				<p>This example shows the <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.type"><code class="option" title=
        -				"Responsive initialisation option">responsive.details.type<span>R</span></code></a> option set to <code>column</code> to activate the control column. Note that by
        -				default the first column is used as the control, so additionally in the initialisation the <a href="//datatables.net/reference/option/order"><code class="option"
        -				title="DataTables initialisation option">order<span>DT</span></code></a> and <a href="//datatables.net/reference/option/columns.orderable"><code class="option"
        -				title="DataTables initialisation option">columns.orderable<span>DT</span></code></a> options are used to disable sorting on this column.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th></th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th></th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td></td>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				type: 'column'
        -			}
        -		},
        -		columnDefs: [ {
        -			className: 'control',
        -			orderable: false,
        -			targets:   0
        -		} ],
        -		order: [ 1, 'asc' ]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Child rows</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./disable-child-rows.html">Disable child rows</a></li>
        -							<li class="active"><a href="./column-control.html">Column controlled child rows</a></li>
        -							<li><a href="./right-column.html">Column control - right</a></li>
        -							<li><a href="./whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="./custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/custom-renderer.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/custom-renderer.html
        deleted file mode 100755
        index cbf8b8bf30..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/custom-renderer.html
        +++ /dev/null
        @@ -1,863 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Custom child row renderer</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				renderer: function ( api, rowIdx ) {
        -					// Select hidden columns for the given row
        -					var data = api.cells( rowIdx, ':hidden' ).eq(0).map( function ( cell ) {
        -						var header = $( api.column( cell.column ).header() );
        -
        -						return '<tr>'+
        -								'<td>'+
        -									header.text()+':'+
        -								'</td> '+
        -								'<td>'+
        -									api.cell( cell ).data()+
        -								'</td>'+
        -							'</tr>';
        -					} ).toArray().join('');
        -
        -					return data ?
        -						$('<table/>').append( data ) :
        -						false;
        -				}
        -			}
        -		}
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Custom child row renderer</span></h1>
        -
        -			<div class="info">
        -				<p>The child row's for a collapsed table in Responsive, by default, show a <code class="tag" title="HTML tag">ul/li</code> list of the data from the hidden
        -				columns. The <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.renderer"><code class="option" title=
        -				"Responsive initialisation option">responsive.details.renderer<span>R</span></code></a> option provide the ability to create your own custom renderer. It is given
        -				two parameters: the DataTables API instance for the table and the row index to use.</p>
        -
        -				<p>This example shows the <a href="//datatables.net/reference/api/cells()"><code class="api" title="DataTables API method">cells()<span>DT</span></code></a> method
        -				being used to select the hidden columns and constructing a table of the data. You could refine the selector to select only certain columns, or show all columns,
        -				etc.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				renderer: function ( api, rowIdx ) {
        -					// Select hidden columns for the given row
        -					var data = api.cells( rowIdx, ':hidden' ).eq(0).map( function ( cell ) {
        -						var header = $( api.column( cell.column ).header() );
        -
        -						return '&lt;tr&gt;'+
        -								'&lt;td&gt;'+
        -									header.text()+':'+
        -								'&lt;/td&gt; '+
        -								'&lt;td&gt;'+
        -									api.cell( cell ).data()+
        -								'&lt;/td&gt;'+
        -							'&lt;/tr&gt;';
        -					} ).toArray().join('');
        -
        -					return data ?
        -						$('&lt;table/&gt;').append( data ) :
        -						false;
        -				}
        -			}
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Child rows</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="./column-control.html">Column controlled child rows</a></li>
        -							<li><a href="./right-column.html">Column control - right</a></li>
        -							<li><a href="./whole-row-control.html">Whole row child row control</a></li>
        -							<li class="active"><a href="./custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/disable-child-rows.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/disable-child-rows.html
        deleted file mode 100755
        index 482e77a3ff..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/disable-child-rows.html
        +++ /dev/null
        @@ -1,819 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Disable child rows</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: false
        -		}
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Disable child rows</span></h1>
        -
        -			<div class="info">
        -				<p>By default, when Responsive collapses a table, it will show an option for the end user to expand the row, showing the details of the hidden columns in a child
        -				row. This can be disabled using the <a href="//datatables.net/extensions/responsive/reference/option/responsive.details"><code class="option" title=
        -				"Responsive initialisation option">responsive.details<span>R</span></code></a> option and setting it to <code>false</code>, as shown in the example below. In this
        -				case the hidden data is not directly accessible to the end user.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: false
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Child rows</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="./column-control.html">Column controlled child rows</a></li>
        -							<li><a href="./right-column.html">Column control - right</a></li>
        -							<li><a href="./whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="./custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/index.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/index.html
        deleted file mode 100755
        index 98b3680ba5..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/index.html
        +++ /dev/null
        @@ -1,72 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -
        -	<title>Responsive examples - Child row control</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Child row control</span></h1>
        -
        -			<div class="info">
        -				<p>When a column is removed from display by Responsive, the data is still available in the table and can be displayed in a DataTables <em>child row</em> (see
        -				<a href="//datatables.net/reference/api/row().child()"><code class="api" title="DataTables API method">row().child()<span>DT</span></code></a>). By default
        -				Responsive will show child row controls in the first column when the table has been collapsed, allowing the end user to show / hide the information from the hidden
        -				columns.</p>
        -
        -				<p>Responsive has a number of options for display of the child rows:</p>
        -
        -				<ul class="markdown">
        -					<li>If child row display is enabled: <a href="//datatables.net/extensions/responsive/reference/option/responsive.details"><code class="option" title=
        -					"Responsive initialisation option">responsive.details<span>R</span></code></a></li>
        -					<li>How the show / hide control is displayed: <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.type"><code class="option"
        -					title="Responsive initialisation option">responsive.details.type<span>R</span></code></a></li>
        -					<li>How the child row is rendered: <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.renderer"><code class="option" title=
        -					"Responsive initialisation option">responsive.details.renderer<span>R</span></code></a></li>
        -				</ul>
        -
        -				<p>This section shows examples of these options being used.</p>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="./disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="./column-control.html">Column controlled child rows</a></li>
        -							<li><a href="./right-column.html">Column control - right</a></li>
        -							<li><a href="./whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="./custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/right-column.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/right-column.html
        deleted file mode 100755
        index 94c4f237eb..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/right-column.html
        +++ /dev/null
        @@ -1,850 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Column control - right</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				type: 'column',
        -				target: -1
        -			}
        -		},
        -		columnDefs: [ {
        -			className: 'control',
        -			orderable: false,
        -			targets:   -1
        -		} ]
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Column control - right</span></h1>
        -
        -			<div class="info">
        -				<p>When using the <code>column</code> child row control type, Responsive has the ability to use any column or element as the show / hide control for the row
        -				details. This is provided through the <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.target"><code class="option" title=
        -				"Responsive initialisation option">responsive.details.target<span>R</span></code></a> option, which can be either a column index, or a jQuery selector.</p>
        -
        -				<p>This example shows the last column in the table being used as the control column.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th></th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th></th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td></td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td></td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				type: 'column',
        -				target: -1
        -			}
        -		},
        -		columnDefs: [ {
        -			className: 'control',
        -			orderable: false,
        -			targets:   -1
        -		} ]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Child rows</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="./column-control.html">Column controlled child rows</a></li>
        -							<li class="active"><a href="./right-column.html">Column control - right</a></li>
        -							<li><a href="./whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="./custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/whole-row-control.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/whole-row-control.html
        deleted file mode 100755
        index 74e1132218..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/child-rows/whole-row-control.html
        +++ /dev/null
        @@ -1,853 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Whole row child row control</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				type: 'column',
        -				target: 'tr'
        -			}
        -		},
        -		columnDefs: [ {
        -			className: 'control',
        -			orderable: false,
        -			targets:   0
        -		} ],
        -		order: [ 1, 'asc' ]
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Whole row child row control</span></h1>
        -
        -			<div class="info">
        -				<p>When using the <code>column</code> details type in Responsive the <a href=
        -				"//datatables.net/extensions/responsive/reference/option/responsive.details.target"><code class="option" title=
        -				"Responsive initialisation option">responsive.details.target<span>R</span></code></a> option provides the ability to control what element is used to show / hide
        -				the child rows when the table is collapsed.</p>
        -
        -				<p>This example uses the <code>tr</code> selector to have the whole row act as the control.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th></th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th></th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td></td>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -					</tr>
        -					<tr>
        -						<td></td>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: {
        -			details: {
        -				type: 'column',
        -				target: 'tr'
        -			}
        -		},
        -		columnDefs: [ {
        -			className: 'control',
        -			orderable: false,
        -			targets:   0
        -		} ],
        -		order: [ 1, 'asc' ]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Child rows</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="./column-control.html">Column controlled child rows</a></li>
        -							<li><a href="./right-column.html">Column control - right</a></li>
        -							<li class="active"><a href="./whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="./custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/auto.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/auto.html
        deleted file mode 100755
        index ef8e27230f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/auto.html
        +++ /dev/null
        @@ -1,813 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Automatic column hiding</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable();
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Automatic column hiding</span></h1>
        -
        -			<div class="info">
        -				<p>Responsive will automatically detect which columns have breakpoint class names assigned to them for visibility control. If no breakpoint class is found for a
        -				column, Responsive will determine automatically if the column should be shown or not at any particular viewport width. This is done by removing columns which cause
        -				the table to overflow the viewport, with the columns being removed from the right.</p>
        -
        -				<p>This example shows that simple case. On a desktop browser resize the window horizontally to see columns added and removed on-the-fly. On a tablet or mobile
        -				browser, change the screen's orientation.</p>
        -			</div>
        -
        -			<table id="example" class="display responsive nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable();
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Display control</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./auto.html">Automatic column hiding</a></li>
        -							<li><a href="./classes.html">Class control</a></li>
        -							<li><a href="./init-classes.html">Assigned class control</a></li>
        -							<li><a href="./fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/classes.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/classes.html
        deleted file mode 100755
        index fda2162779..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/classes.html
        +++ /dev/null
        @@ -1,247 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Class control</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		"ajax": "../../../../examples/ajax/data/objects.txt",
        -		"columns": [
        -			{ "data": "name" },
        -			{ "data": "position" },
        -			{ "data": "office" },
        -			{ "data": "age" },
        -			{ "data": "start_date" },
        -			{ "data": "salary" },
        -			{ "data": "extn" }
        -		]
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Class control</span></h1>
        -
        -			<div class="info">
        -				<p>You can tell Responsive what columns to want to be visible on different devices through the use of class names on the columns. The breakpoints are horizontal
        -				screen resolutions and the defaults are set for common devices:</p>
        -
        -				<ul class="markdown">
        -					<li><code>desktop</code> x &gt;= 1024px</li>
        -					<li><code>tablet-l</code> (landscape) 768 &lt;= x &lt; 1024</li>
        -					<li><code>tablet-p</code> (portrait) 480 &lt;= x &lt; 768</li>
        -					<li><code>mobile-l</code> (landscape) 320 &lt;= x &lt; 480</li>
        -					<li><code>mobile-p</code> (portrait) x &lt; 320</li>
        -				</ul>
        -
        -				<p>You may leave the <code>-[lp]</code> option from the end if you wish to just target all tablet or mobile devices. Additionally to may add <code>min-</code>,
        -				<code>max-</code> or <code>not-</code> as a prefix to the class name to perform logic operations. For example <code>not-mobile</code> would cause a column to
        -				appear as visible on desktop and tablet devices, while <code>min-tablet-l</code> would require at least a horizontal width of 768 for the browser window to be
        -				shown, and be shown at all sizes larger.</p>
        -
        -				<p>Additionally, there are three special class names:</p>
        -
        -				<ul class="markdown">
        -					<li><code>all</code> - Always display</li>
        -					<li><code>none</code> - Don't display as a column, but show in the child row</li>
        -					<li><code>never</code> - Never display</li>
        -					<li><code>control</code> - Used for the <code>column</code> <a href=
        -					"//datatables.net/extensions/responsive/reference/option/responsive.details.type"><code class="option" title=
        -					"Responsive initialisation option">responsive.details.type<span>R</span></code></a> option.</li>
        -				</ul>
        -
        -				<p>Please <a href="//datatables.net/extensions/responsive/">refer to the Responsive manual</a> for further details of these options.</p>
        -
        -				<p>This example shows the <code>salary</code> column visible on a desktop only - <code>office</code> and <code>age</code> require a tablet, while the
        -				<code>position</code> column requires a phone in landscape or larger. The <code>name</code> column is always visible and the <code>start date</code> is never
        -				visible.</p>
        -
        -				<p>This can be useful if you wish to change the format of the data shown on different devices, for example using a combination of <code>mobile</code> and
        -				<code>not-mobile</code> on two different columns would allow information to be formatted suitable for each device type.</p>
        -			</div>
        -
        -			<div id="breakpoint"></div>
        -
        -			<table id="example" class="display responsive" width="100%">
        -				<thead>
        -					<tr>
        -						<th class="all">Name</th>
        -						<th class="min-phone-l">Position</th>
        -						<th class="min-tablet">Office</th>
        -						<th class="min-tablet">Age</th>
        -						<th class="never">Start date</th>
        -						<th class="desktop">Salary</th>
        -						<th class="none">Extn.</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -					</tr>
        -				</tfoot>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		&quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;,
        -		&quot;columns&quot;: [
        -			{ &quot;data&quot;: &quot;name&quot; },
        -			{ &quot;data&quot;: &quot;position&quot; },
        -			{ &quot;data&quot;: &quot;office&quot; },
        -			{ &quot;data&quot;: &quot;age&quot; },
        -			{ &quot;data&quot;: &quot;start_date&quot; },
        -			{ &quot;data&quot;: &quot;salary&quot; },
        -			{ &quot;data&quot;: &quot;extn&quot; }
        -		]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Display control</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./auto.html">Automatic column hiding</a></li>
        -							<li class="active"><a href="./classes.html">Class control</a></li>
        -							<li><a href="./init-classes.html">Assigned class control</a></li>
        -							<li><a href="./fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/complexHeader.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/complexHeader.html
        deleted file mode 100755
        index 04d051cd77..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/complexHeader.html
        +++ /dev/null
        @@ -1,708 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Complex headers (rowspan / colspan)</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	th {
        -		position: relative;
        -		min-height: 41px;
        -	} 
        -	span {
        -		display: block;
        -		position: absolute;
        -		left: 0;
        -		right: 0;
        -		white-space: nowrap;
        -		text-overflow: ellipsis;
        -		overflow: hidden;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	// jQuery update a column title from the demo table to contain a long description
        -	// You would not need to do this in your own code.
        -	$('#example thead tr:eq(0) th:eq(2)').html("This is a really long column title!");
        -	
        -	// Wrap the colspan'ing header cells with a span so they can be positioned
        -	// absolutely - filling the available space, and no more.
        -	$('#example thead th[colspan]').wrapInner( '<span/>' ).append( '&nbsp;' );
        -
        -	// Standard initialisation
        -	$('#example').DataTable( {
        -		responsive: true,
        -		paging: false
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Complex headers (rowspan / colspan)</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows how Responsive can be used with <em>complex headers</em> (i.e. headers that contain <code>colspan</code> attributes for one or more cells).
        -				As Responsive will removed columns one at a time the cell with the <code>colspan</code> attribute can end up forcing the width of a column, disrupting the flow.
        -				Rather than removing all columns under the <code>colspan</code> cell, we want to reduce the amount of text that is visible in that cell. This example shows how
        -				that can be achieved thought a little bit of jQuery and CSS.</p>
        -
        -				<p>We use jQuery to find the header cells which have a <code>colspan</code> attribute and wrap their contents in a <code class="tag" title="HTML tag">span</code>
        -				tag. That <code class="tag" title="HTML tag">span</code> is then set to <code>position: absolute;</code> using <code>text-overflow: ellipsis</code>. The result is
        -				that the text of the <code>colspan</code> cell will reduce automatically to fit the available area based on the contents of the column cells below it.</p>
        -
        -				<p>This functionality is not currently built into Responsive. It likely will be for v1.1.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th rowspan="2">Name</th>
        -						<th colspan="2">HR Information</th>
        -						<th colspan="3">Contact</th>
        -					</tr>
        -					<tr>
        -						<th>Position</th>
        -						<th>Salary</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Salary</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>$320,800</td>
        -						<td>Edinburgh</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>$170,750</td>
        -						<td>Tokyo</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>$86,000</td>
        -						<td>San Francisco</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>$433,060</td>
        -						<td>Edinburgh</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>$162,700</td>
        -						<td>Tokyo</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>$372,000</td>
        -						<td>New York</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>$137,500</td>
        -						<td>San Francisco</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>$327,900</td>
        -						<td>Tokyo</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>$205,500</td>
        -						<td>San Francisco</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>$103,600</td>
        -						<td>Edinburgh</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>$90,560</td>
        -						<td>London</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>$342,000</td>
        -						<td>Edinburgh</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>$470,600</td>
        -						<td>San Francisco</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>$313,500</td>
        -						<td>London</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>$385,750</td>
        -						<td>London</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>$198,500</td>
        -						<td>London</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>$725,000</td>
        -						<td>New York</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>$237,500</td>
        -						<td>New York</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>$132,000</td>
        -						<td>London</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>$217,500</td>
        -						<td>Edinburgh</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>$345,000</td>
        -						<td>New York</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>$675,000</td>
        -						<td>New York</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>$106,450</td>
        -						<td>New York</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>$85,600</td>
        -						<td>Sidney</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>$1,200,000</td>
        -						<td>London</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>$92,575</td>
        -						<td>Edinburgh</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>$357,650</td>
        -						<td>Singapore</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>$206,850</td>
        -						<td>San Francisco</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>$850,000</td>
        -						<td>San Francisco</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>$163,000</td>
        -						<td>Tokyo</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>$95,400</td>
        -						<td>Sidney</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>$114,500</td>
        -						<td>London</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>$145,000</td>
        -						<td>London</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>$235,500</td>
        -						<td>San Francisco</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>$324,050</td>
        -						<td>Edinburgh</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>$85,675</td>
        -						<td>San Francisco</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>$164,500</td>
        -						<td>San Francisco</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>$109,850</td>
        -						<td>San Francisco</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>$452,500</td>
        -						<td>San Francisco</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>$136,200</td>
        -						<td>London</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>$645,750</td>
        -						<td>New York</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>$234,500</td>
        -						<td>Singapore</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>$163,500</td>
        -						<td>London</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>$139,575</td>
        -						<td>Tokyo</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>$98,540</td>
        -						<td>New York</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>$87,500</td>
        -						<td>San Francisco</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>$138,575</td>
        -						<td>Singapore</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>$125,250</td>
        -						<td>New York</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>$115,000</td>
        -						<td>San Francisco</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>$75,650</td>
        -						<td>Edinburgh</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>$145,600</td>
        -						<td>New York</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>$356,250</td>
        -						<td>London</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>$103,500</td>
        -						<td>London</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>$86,500</td>
        -						<td>San Francisco</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>$183,000</td>
        -						<td>Edinburgh</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>$183,000</td>
        -						<td>Singapore</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>$112,000</td>
        -						<td>New York</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	// jQuery update a column title from the demo table to contain a long description
        -	// You would not need to do this in your own code.
        -	$('#example thead tr:eq(0) th:eq(2)').html(&quot;This is a really long column title!&quot;);
        -	
        -	// Wrap the colspan'ing header cells with a span so they can be positioned
        -	// absolutely - filling the available space, and no more.
        -	$('#example thead th[colspan]').wrapInner( '&lt;span/&gt;' ).append( '&amp;nbsp;' );
        -
        -	// Standard initialisation
        -	$('#example').DataTable( {
        -		responsive: true,
        -		paging: false
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">th {
        -		position: relative;
        -		min-height: 41px;
        -	} 
        -	span {
        -		display: block;
        -		position: absolute;
        -		left: 0;
        -		right: 0;
        -		white-space: nowrap;
        -		text-overflow: ellipsis;
        -		overflow: hidden;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Display control</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./auto.html">Automatic column hiding</a></li>
        -							<li><a href="./classes.html">Class control</a></li>
        -							<li><a href="./init-classes.html">Assigned class control</a></li>
        -							<li><a href="./fixedHeader.html">With FixedHeader</a></li>
        -							<li class="active"><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/fixedHeader.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/fixedHeader.html
        deleted file mode 100755
        index fbf57a529e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/fixedHeader.html
        +++ /dev/null
        @@ -1,825 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - With FixedHeader</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../FixedHeader/css/dataTables.fixedHeader.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.container { max-width: 1200px }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../FixedHeader/js/dataTables.fixedHeader.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		responsive: true,
        -		paging: false
        -	} );
        -
        -	new $.fn.dataTable.FixedHeader( table );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>With FixedHeader</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows Responsive being used with the DataTables <a href="http://datatables.net/extensions/fixedheader">FixedHeader</a> extension. FixedHeader will
        -				lock a table's header to the top of the table, ensuring that the user always knows what each column relates to.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		responsive: true,
        -		paging: false
        -	} );
        -
        -	new $.fn.dataTable.FixedHeader( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -						<li><a href="../../../FixedHeader/js/dataTables.fixedHeader.js">../../../FixedHeader/js/dataTables.fixedHeader.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -						<li><a href="../../../FixedHeader/css/dataTables.fixedHeader.css">../../../FixedHeader/css/dataTables.fixedHeader.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Display control</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./auto.html">Automatic column hiding</a></li>
        -							<li><a href="./classes.html">Class control</a></li>
        -							<li><a href="./init-classes.html">Assigned class control</a></li>
        -							<li class="active"><a href="./fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/index.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/index.html
        deleted file mode 100755
        index 3dc1c472c2..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/index.html
        +++ /dev/null
        @@ -1,65 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -
        -	<title>Responsive examples - Display control</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Display control</span></h1>
        -
        -			<div class="info">
        -				<p>Responsive has two basic modes of operation for controlling the visibility of columns at different display sizes. These two modes can be using either separately
        -				or together:</p>
        -
        -				<ul class="markdown">
        -					<li>Manually assigned class names for breakpoints - Assign a column a class name to tell Responsive which breakpoint(s) to show it in.</li>
        -					<li>Automatically - for columns without a breakpoint class name, it will be automatically removed if there is no room available on screen to show it. Columns
        -					are removed from the right, moving left.</li>
        -				</ul>
        -
        -				<p>This section explores these two options.</p>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="./auto.html">Automatic column hiding</a></li>
        -							<li><a href="./classes.html">Class control</a></li>
        -							<li><a href="./init-classes.html">Assigned class control</a></li>
        -							<li><a href="./fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/init-classes.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/init-classes.html
        deleted file mode 100755
        index 2524e42183..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/display-control/init-classes.html
        +++ /dev/null
        @@ -1,215 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Assigned class control</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		"ajax": "../../../../examples/ajax/data/objects.txt",
        -		"columns": [
        -			{ "data": "name",       className: "all" },
        -			{ "data": "position",   className: "min-phone-l" },
        -			{ "data": "office",     className: "min-tablet" },
        -			{ "data": "age",        className: "min-tablet" },
        -			{ "data": "start_date", className: "never" },
        -			{ "data": "salary",     className: "desktop" },
        -			{ "data": "extn",       className: "none" }
        -		]
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Assigned class control</span></h1>
        -
        -			<div class="info">
        -				<p>This example exactly matches the functionality of the <a href="classes.xml">class control example</a> but in this case the classes are assigned using the
        -				<a href="//datatables.net/reference/option/columns.className"><code class="option" title=
        -				"DataTables initialisation option">columns.className<span>DT</span></code></a> option.</p>
        -			</div>
        -
        -			<div id="breakpoint"></div>
        -
        -			<table id="example" class="display responsive" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -					</tr>
        -				</tfoot>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		&quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;,
        -		&quot;columns&quot;: [
        -			{ &quot;data&quot;: &quot;name&quot;,       className: &quot;all&quot; },
        -			{ &quot;data&quot;: &quot;position&quot;,   className: &quot;min-phone-l&quot; },
        -			{ &quot;data&quot;: &quot;office&quot;,     className: &quot;min-tablet&quot; },
        -			{ &quot;data&quot;: &quot;age&quot;,        className: &quot;min-tablet&quot; },
        -			{ &quot;data&quot;: &quot;start_date&quot;, className: &quot;never&quot; },
        -			{ &quot;data&quot;: &quot;salary&quot;,     className: &quot;desktop&quot; },
        -			{ &quot;data&quot;: &quot;extn&quot;,       className: &quot;none&quot; }
        -		]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Display control</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./auto.html">Automatic column hiding</a></li>
        -							<li><a href="./classes.html">Class control</a></li>
        -							<li class="active"><a href="./init-classes.html">Assigned class control</a></li>
        -							<li><a href="./fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/index.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/index.html
        deleted file mode 100755
        index bb2cfbc013..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/index.html
        +++ /dev/null
        @@ -1,86 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>Responsive examples - Responsive DataTables</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Responsive DataTables</span></h1>
        -
        -			<div class="info"></div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="./initialisation/className.html">Class name</a></li>
        -							<li><a href="./initialisation/option.html">Configuration option</a></li>
        -							<li><a href="./initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="./initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="./initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="./styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="./styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="./styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="./display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="./display-control/classes.html">Class control</a></li>
        -							<li><a href="./display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="./display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="./display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="./child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="./child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="./child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="./child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="./child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/ajax.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/ajax.html
        deleted file mode 100755
        index b60ebfc102..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/ajax.html
        +++ /dev/null
        @@ -1,210 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Ajax data</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.container { max-width: 1200px }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		"ajax": "../../../../examples/ajax/data/objects.txt",
        -		"columns": [
        -			{ "data": "name" },
        -			{ "data": "position" },
        -			{ "data": "office" },
        -			{ "data": "extn" },
        -			{ "data": "start_date" },
        -			{ "data": "salary" }
        -		]
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Ajax data</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows the Responsive extension working with <a href="//datatables.net/manual/data">Ajax sourced data</a> in the DataTable. Note that no special
        -				initialisation is required. Responsive is enabled by adding the <code class="string" title="String">responsive</code> class to the <code class="tag" title=
        -				"HTML tag">table</code> element.</p>
        -			</div>
        -
        -			<table id="example" class="display responsive nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		&quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;,
        -		&quot;columns&quot;: [
        -			{ &quot;data&quot;: &quot;name&quot; },
        -			{ &quot;data&quot;: &quot;position&quot; },
        -			{ &quot;data&quot;: &quot;office&quot; },
        -			{ &quot;data&quot;: &quot;extn&quot; },
        -			{ &quot;data&quot;: &quot;start_date&quot; },
        -			{ &quot;data&quot;: &quot;salary&quot; }
        -		]
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Basic initialisation</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./className.html">Class name</a></li>
        -							<li><a href="./option.html">Configuration option</a></li>
        -							<li><a href="./new.html">`new` constructor</a></li>
        -							<li class="active"><a href="./ajax.html">Ajax data</a></li>
        -							<li><a href="./default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/className.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/className.html
        deleted file mode 100755
        index 813b7aff7d..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/className.html
        +++ /dev/null
        @@ -1,812 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Class name</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable();
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Class name</span></h1>
        -
        -			<div class="info">
        -				<p>The easiest way to initialise the Responsive extension for DataTables is simply to add the class <code class="string" title="String">responsive</code> to the
        -				table's class name. When the DataTable is initialised the Responsive extension will automatically enable itself on these tables.</p>
        -
        -				<p>The may also use the class <code>dt-responsive</code> to perform the same action, since <code>responsive</code> may be used in your stylesheet, or may have some
        -				other meaning in a CSS framework being used (for example Bootstrap).</p>
        -			</div>
        -
        -			<table id="example" class="display responsive nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable();
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Basic initialisation</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./className.html">Class name</a></li>
        -							<li><a href="./option.html">Configuration option</a></li>
        -							<li><a href="./new.html">`new` constructor</a></li>
        -							<li><a href="./ajax.html">Ajax data</a></li>
        -							<li><a href="./default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/default.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/default.html
        deleted file mode 100755
        index f196839d5e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/default.html
        +++ /dev/null
        @@ -1,822 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Default initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$.extend( $.fn.dataTable.defaults, {
        -    responsive: true
        -} );
        -
        -$(document).ready(function() {
        -	$('#example').DataTable();
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Default initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>It can often be useful to be able to set a default value for DataTables' initialisation options, providing a common starting point for initialisation when
        -				working with multiple tables over many pages or even just on a single page. DataTables provides that ability through the <code>$.fn.dataTable.defaults</code>
        -				object which can have any of the <a href="//datatables.net/reference/option">initialisation options</a> set.</p>
        -
        -				<p>Extending that ability, Responsive can also be set to initialise by default, as shown in this example thorugh the
        -				<code>$.fn.dataTable.defaults.responsive</code> property. Extending that, <a href="//datatables.net/extensions/responsive/reference/option/">all of the Responsive
        -				options</a> can also be set using this configuration option (i.e. use <code>responsive</code> as an object).</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$.extend( $.fn.dataTable.defaults, {
        -    responsive: true
        -} );
        -
        -$(document).ready(function() {
        -	$('#example').DataTable();
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Basic initialisation</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./className.html">Class name</a></li>
        -							<li><a href="./option.html">Configuration option</a></li>
        -							<li><a href="./new.html">`new` constructor</a></li>
        -							<li><a href="./ajax.html">Ajax data</a></li>
        -							<li class="active"><a href="./default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/index.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/index.html
        deleted file mode 100755
        index 8ca0f94621..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/index.html
        +++ /dev/null
        @@ -1,65 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -
        -	<title>Responsive examples - Initialisation</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>Responsive can be run on a DataTable in a number of different ways:</p>
        -
        -				<ul class="markdown">
        -					<li>By adding the class <code>responsive</code> or <code>dt-responsive</code> to the <code class="tag" title="HTML tag">table</code></li>
        -					<li>Using the <a href="//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title=
        -					"Responsive initialisation option">responsive<span>R</span></code></a> option in the DataTables initialisation</li>
        -					<li>Use the <code>$.fn.dataTable.Responsive</code> constructor.</li>
        -				</ul>
        -
        -				<p>This set of examples demonstrates these initialisation options.</p>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="./className.html">Class name</a></li>
        -							<li><a href="./option.html">Configuration option</a></li>
        -							<li><a href="./new.html">`new` constructor</a></li>
        -							<li><a href="./ajax.html">Ajax data</a></li>
        -							<li><a href="./default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/new.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/new.html
        deleted file mode 100755
        index 07ecd6f91d..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/new.html
        +++ /dev/null
        @@ -1,821 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - `new` constructor</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.container { max-width: 1200px }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.Responsive( table );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>`new` constructor</span></h1>
        -
        -			<div class="info">
        -				<p>Responsive will automatically detect new DataTable instances being created on a page and initialise itself if it find the <a href=
        -				"//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title=
        -				"Responsive initialisation option">responsive<span>R</span></code></a> option or <code>responsive</code> class name on the table, as shown in the other
        -				examples.</p>
        -
        -				<p>The third way of initialising Responsive is manually creating a new instance using the <code>$.fn.dataTable.Responsive</code> class, as shown in this example
        -				(the other two methods are provided using this constructor in a <a href="//datatables.net/reference/event/init"><code class="event" title=
        -				"DataTables event">init<span>DT</span></code></a> event handler!).</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.Responsive( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Basic initialisation</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./className.html">Class name</a></li>
        -							<li><a href="./option.html">Configuration option</a></li>
        -							<li class="active"><a href="./new.html">`new` constructor</a></li>
        -							<li><a href="./ajax.html">Ajax data</a></li>
        -							<li><a href="./default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/option.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/option.html
        deleted file mode 100755
        index 70785d85ed..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/initialisation/option.html
        +++ /dev/null
        @@ -1,820 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Configuration option</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.container { max-width: 1200px }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: true
        -	} );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Configuration option</span></h1>
        -
        -			<div class="info">
        -				<p>The Responsive extension for DataTables can be applied to a DataTable in one of two ways; with a specific class name on the table, or using the DataTables
        -				initialisation options. This method shows the latter, with the <a href="//datatables.net/extensions/responsive/reference/option/responsive"><code class="option"
        -				title="Responsive initialisation option">responsive<span>R</span></code></a> option being set to the boolean value <code>true</code>.</p>
        -
        -				<p>The <a href="//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title=
        -				"Responsive initialisation option">responsive<span>R</span></code></a> option can be given as a boolean value, or as an object with configuration options. If as a
        -				boolean, as in this case, the default options are used.</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		responsive: true
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Basic initialisation</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./className.html">Class name</a></li>
        -							<li class="active"><a href="./option.html">Configuration option</a></li>
        -							<li><a href="./new.html">`new` constructor</a></li>
        -							<li><a href="./ajax.html">Ajax data</a></li>
        -							<li><a href="./default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../styling/index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="../styling/bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="../styling/foundation.html">Foundation styling</a></li>
        -							<li><a href="../styling/scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="../styling/compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/bootstrap.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/bootstrap.html
        deleted file mode 100755
        index 6a7175f1c8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/bootstrap.html
        +++ /dev/null
        @@ -1,831 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Bootstrap styling</title>
        -	<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
        -	<link rel="stylesheet" type="text/css" href="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	body { font-size: 140% }
        -
        -	table.dataTable th,
        -	table.dataTable td {
        -		white-space: nowrap;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable();
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Bootstrap styling</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows DataTables and the Responsive extension being used with the <a href="http://getbootstrap.com">Bootstrap</a> framework providing the styling.
        -				The <a href="//datatables.net/manual/styling/bootstrap">DataTables / Bootstrap integration files</a> prove seamless integration for DataTables to be used in a
        -				Bootstrap page.</p>
        -
        -				<p>Note that the <code>dt-responsive</code> class is used to indicate to the extension that it should be enabled on this page, as <code>responsive</code> <a href=
        -				"http://getbootstrap.com/css/#tables-responsive">has special meaning in Bootstrap</a>. The <a href=
        -				"//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title=
        -				"Responsive initialisation option">responsive<span>R</span></code></a> option could also be used if required.</p>
        -			</div>
        -
        -			<table id="example" class="table table-striped table-hover dt-responsive" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable();
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -						<li><a href="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js">../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">body { font-size: 140% }
        -
        -	table.dataTable th,
        -	table.dataTable td {
        -		white-space: nowrap;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css</a></li>
        -						<li><a href="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Styling</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./foundation.html">Foundation styling</a></li>
        -							<li><a href="./scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="./compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/compact.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/compact.html
        deleted file mode 100755
        index 91d71184a9..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/compact.html
        +++ /dev/null
        @@ -1,816 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Compact styling</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.container { max-width: 1200px }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.Responsive( table );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Compact styling</span></h1>
        -
        -			<div class="info">
        -				<p>DataTables' <a href="http://datatables.net/manual/styling/classes">default stylesheet</a> has a number number of features available that can be enabled by
        -				including a class name on the DataTable. One of those options is <code>compact</code> which displays the DataTable with less whitespace padding that might other be
        -				used to increase the information density of the table. Responsive's own style has support for this <code>compact</code> styling as showing in this example.</p>
        -			</div>
        -
        -			<table id="example" class="display compact nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -
        -	new $.fn.dataTable.Responsive( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Styling</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./foundation.html">Foundation styling</a></li>
        -							<li><a href="./scrolling.html">Vertical scrolling</a></li>
        -							<li class="active"><a href="./compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/foundation.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/foundation.html
        deleted file mode 100755
        index d41ba40745..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/foundation.html
        +++ /dev/null
        @@ -1,822 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Foundation styling</title>
        -	<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/foundation/5.5.1/css/foundation.min.css">
        -	<link rel="stylesheet" type="text/css" href="../../../Plugins/integration/foundation/dataTables.foundation.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	table.dataTable th,
        -	table.dataTable td {
        -		white-space: nowrap;
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../Plugins/integration/foundation/dataTables.foundation.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable();
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Foundation styling</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows DataTables and the Responsive extension being used with the <a href="http://foundation.zurb.com">Foundation</a> framework providing the
        -				styling. The <a href="//datatables.net/manual/styling/foundation">DataTables / Foundation integration files</a> prove seamless integration for DataTables to be
        -				used in a Foundation page.</p>
        -			</div>
        -
        -			<table id="example" class="tdisplay responsive" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable();
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -						<li><a href="../../../Plugins/integration/foundation/dataTables.foundation.js">../../../Plugins/integration/foundation/dataTables.foundation.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">table.dataTable th,
        -	table.dataTable td {
        -		white-space: nowrap;
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="//cdn.jsdelivr.net/foundation/5.5.1/css/foundation.min.css">//cdn.jsdelivr.net/foundation/5.5.1/css/foundation.min.css</a></li>
        -						<li><a href="../../../Plugins/integration/foundation/dataTables.foundation.css">../../../Plugins/integration/foundation/dataTables.foundation.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Styling</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li class="active"><a href="./foundation.html">Foundation styling</a></li>
        -							<li><a href="./scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="./compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/index.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/index.html
        deleted file mode 100755
        index 0de49171fd..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/index.html
        +++ /dev/null
        @@ -1,57 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -
        -	<title>Responsive examples - Styling</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Styling</span></h1>
        -
        -			<div class="info">
        -				<p>Responsive requires very little styling information of its own, with styling needed only for the child row display when the table has been collapsed. As such,
        -				integrating Responsive with your application should be as simple as including the Javascript and base stylesheet! This section shows Responsive being styling using
        -				external CSS frameworks.</p>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Styling</a></h3>
        -						<ul class="toc">
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./foundation.html">Foundation styling</a></li>
        -							<li><a href="./scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="./compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/scrolling.html b/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/scrolling.html
        deleted file mode 100755
        index 94d77ca2e7..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/examples/styling/scrolling.html
        +++ /dev/null
        @@ -1,826 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Responsive example - Vertical scrolling</title>
        -	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	div.container { max-width: 1200px }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY: 300,
        -		paging: false
        -	} );
        -
        -	new $.fn.dataTable.Responsive( table );
        -} );
        -
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Responsive example <span>Vertical scrolling</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows Responsive in use with the <a href="//datatables.net/reference/option/scrollY"><code class="option" title=
        -				"DataTables initialisation option">scrollY<span>DT</span></code></a> option to present a scrolling table (instead of using paging as the other Responsive examples
        -				do). Responsive will automatically work with the table in such a configuration.</p>
        -
        -				<p>Responsive can be used with <a href="//datatables.net/reference/option/scrollX"><code class="option" title=
        -				"DataTables initialisation option">scrollX<span>DT</span></code></a>, however it is relatively pointless as Responsive will remove columns to ensure that there is
        -				no horizontal scrolling!</p>
        -			</div>
        -
        -			<table id="example" class="display nowrap" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -						<th>Extn.</th>
        -						<th>E-mail</th>
        -					</tr>
        -				</thead>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger</td>
        -						<td>Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -						<td>5421</td>
        -						<td>t.nixon@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett</td>
        -						<td>Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -						<td>8422</td>
        -						<td>g.winters@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton</td>
        -						<td>Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -						<td>1562</td>
        -						<td>a.cox@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric</td>
        -						<td>Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -						<td>6224</td>
        -						<td>c.kelly@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Airi</td>
        -						<td>Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -						<td>5407</td>
        -						<td>a.satou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle</td>
        -						<td>Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -						<td>4804</td>
        -						<td>b.williamson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod</td>
        -						<td>Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -						<td>9608</td>
        -						<td>h.chandler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona</td>
        -						<td>Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -						<td>6200</td>
        -						<td>r.davidson@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen</td>
        -						<td>Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -						<td>2360</td>
        -						<td>c.hurst@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya</td>
        -						<td>Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -						<td>1667</td>
        -						<td>s.frost@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jena</td>
        -						<td>Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -						<td>3814</td>
        -						<td>j.gaines@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn</td>
        -						<td>Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -						<td>9497</td>
        -						<td>q.flynn@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Charde</td>
        -						<td>Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -						<td>6741</td>
        -						<td>c.marshall@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Haley</td>
        -						<td>Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -						<td>3597</td>
        -						<td>h.kennedy@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana</td>
        -						<td>Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -						<td>1965</td>
        -						<td>t.fitzpatrick@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -						<td>1581</td>
        -						<td>m.silva@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Paul</td>
        -						<td>Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -						<td>3059</td>
        -						<td>p.byrd@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria</td>
        -						<td>Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -						<td>1721</td>
        -						<td>g.little@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley</td>
        -						<td>Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -						<td>2558</td>
        -						<td>b.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Dai</td>
        -						<td>Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -						<td>2290</td>
        -						<td>d.rios@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette</td>
        -						<td>Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -						<td>1937</td>
        -						<td>j.caldwell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri</td>
        -						<td>Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -						<td>6154</td>
        -						<td>y.berry@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar</td>
        -						<td>Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -						<td>8330</td>
        -						<td>c.vance@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Doris</td>
        -						<td>Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -						<td>3023</td>
        -						<td>d.wilder@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica</td>
        -						<td>Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -						<td>5797</td>
        -						<td>a.ramos@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -						<td>8822</td>
        -						<td>g.joyce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -						<td>9239</td>
        -						<td>j.chang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden</td>
        -						<td>Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -						<td>1314</td>
        -						<td>b.wagner@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona</td>
        -						<td>Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -						<td>2947</td>
        -						<td>f.green@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shou</td>
        -						<td>Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -						<td>8899</td>
        -						<td>s.itou@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle</td>
        -						<td>House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -						<td>2769</td>
        -						<td>m.house@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Suki</td>
        -						<td>Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -						<td>6832</td>
        -						<td>s.burks@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott</td>
        -						<td>Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -						<td>3606</td>
        -						<td>p.bartlett@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin</td>
        -						<td>Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -						<td>2860</td>
        -						<td>g.cortez@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Martena</td>
        -						<td>Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -						<td>8240</td>
        -						<td>m.mccray@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Unity</td>
        -						<td>Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -						<td>5384</td>
        -						<td>u.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Howard</td>
        -						<td>Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -						<td>7031</td>
        -						<td>h.hatfield@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hope</td>
        -						<td>Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -						<td>6318</td>
        -						<td>h.fuentes@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian</td>
        -						<td>Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -						<td>9422</td>
        -						<td>v.harrell@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy</td>
        -						<td>Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -						<td>7580</td>
        -						<td>t.mooney@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson</td>
        -						<td>Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -						<td>1042</td>
        -						<td>j.bradshaw@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia</td>
        -						<td>Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -						<td>2120</td>
        -						<td>o.liang@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno</td>
        -						<td>Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -						<td>6222</td>
        -						<td>b.nash@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura</td>
        -						<td>Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -						<td>9383</td>
        -						<td>s.yamamoto@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Thor</td>
        -						<td>Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -						<td>8327</td>
        -						<td>t.walton@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Finn</td>
        -						<td>Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -						<td>2927</td>
        -						<td>f.camacho@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Serge</td>
        -						<td>Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -						<td>8352</td>
        -						<td>s.baldwin@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida</td>
        -						<td>Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -						<td>7439</td>
        -						<td>z.frank@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita</td>
        -						<td>Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -						<td>4389</td>
        -						<td>z.serrano@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer</td>
        -						<td>Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -						<td>3431</td>
        -						<td>j.acosta@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Cara</td>
        -						<td>Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -						<td>3990</td>
        -						<td>c.stevens@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione</td>
        -						<td>Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -						<td>1016</td>
        -						<td>h.butler@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Lael</td>
        -						<td>Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -						<td>6733</td>
        -						<td>l.greer@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas</td>
        -						<td>Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -						<td>8196</td>
        -						<td>j.alexander@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Shad</td>
        -						<td>Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -						<td>6373</td>
        -						<td>s.decker@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Michael</td>
        -						<td>Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -						<td>5384</td>
        -						<td>m.bruce@datatables.net</td>
        -					</tr>
        -					<tr>
        -						<td>Donna</td>
        -						<td>Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -						<td>4226</td>
        -						<td>d.snider@datatables.net</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		scrollY: 300,
        -		paging: false
        -	} );
        -
        -	new $.fn.dataTable.Responsive( table );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="../initialisation/index.html">Basic initialisation</a></h3>
        -						<ul class="toc">
        -							<li><a href="../initialisation/className.html">Class name</a></li>
        -							<li><a href="../initialisation/option.html">Configuration option</a></li>
        -							<li><a href="../initialisation/new.html">`new` constructor</a></li>
        -							<li><a href="../initialisation/ajax.html">Ajax data</a></li>
        -							<li><a href="../initialisation/default.html">Default initialisation</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Styling</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./foundation.html">Foundation styling</a></li>
        -							<li class="active"><a href="./scrolling.html">Vertical scrolling</a></li>
        -							<li><a href="./compact.html">Compact styling</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../display-control/index.html">Display control</a></h3>
        -						<ul class="toc">
        -							<li><a href="../display-control/auto.html">Automatic column hiding</a></li>
        -							<li><a href="../display-control/classes.html">Class control</a></li>
        -							<li><a href="../display-control/init-classes.html">Assigned class control</a></li>
        -							<li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li>
        -							<li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li>
        -						</ul>
        -					</div>
        -
        -					<div class="toc-group">
        -						<h3><a href="../child-rows/index.html">Child rows</a></h3>
        -						<ul class="toc">
        -							<li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li>
        -							<li><a href="../child-rows/column-control.html">Column controlled child rows</a></li>
        -							<li><a href="../child-rows/right-column.html">Column control - right</a></li>
        -							<li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li>
        -							<li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/js/dataTables.responsive.js b/resources/assets/js/plugins/datatables/extensions/Responsive/js/dataTables.responsive.js
        deleted file mode 100755
        index 5b4743f141..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/js/dataTables.responsive.js
        +++ /dev/null
        @@ -1,873 +0,0 @@
        -/*! Responsive 1.0.6
        - * 2014-2015 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     Responsive
        - * @description Responsive tables plug-in for DataTables
        - * @version     1.0.6
        - * @file        dataTables.responsive.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2014-2015 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -(function(window, document, undefined) {
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -/**
        - * Responsive is a plug-in for the DataTables library that makes use of
        - * DataTables' ability to change the visibility of columns, changing the
        - * visibility of columns so the displayed columns fit into the table container.
        - * The end result is that complex tables will be dynamically adjusted to fit
        - * into the viewport, be it on a desktop, tablet or mobile browser.
        - *
        - * Responsive for DataTables has two modes of operation, which can used
        - * individually or combined:
        - *
        - * * Class name based control - columns assigned class names that match the
        - *   breakpoint logic can be shown / hidden as required for each breakpoint.
        - * * Automatic control - columns are automatically hidden when there is no
        - *   room left to display them. Columns removed from the right.
        - *
        - * In additional to column visibility control, Responsive also has built into
        - * options to use DataTables' child row display to show / hide the information
        - * from the table that has been hidden. There are also two modes of operation
        - * for this child row display:
        - *
        - * * Inline - when the control element that the user can use to show / hide
        - *   child rows is displayed inside the first column of the table.
        - * * Column - where a whole column is dedicated to be the show / hide control.
        - *
        - * Initialisation of Responsive is performed by:
        - *
        - * * Adding the class `responsive` or `dt-responsive` to the table. In this case
        - *   Responsive will automatically be initialised with the default configuration
        - *   options when the DataTable is created.
        - * * Using the `responsive` option in the DataTables configuration options. This
        - *   can also be used to specify the configuration options, or simply set to
        - *   `true` to use the defaults.
        - *
        - *  @class
        - *  @param {object} settings DataTables settings object for the host table
        - *  @param {object} [opts] Configuration options
        - *  @requires jQuery 1.7+
        - *  @requires DataTables 1.10.1+
        - *
        - *  @example
        - *      $('#example').DataTable( {
        - *        responsive: true
        - *      } );
        - *    } );
        - */
        -var Responsive = function ( settings, opts ) {
        -	// Sanity check that we are using DataTables 1.10 or newer
        -	if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.1' ) ) {
        -		throw 'DataTables Responsive requires DataTables 1.10.1 or newer';
        -	}
        -
        -	this.s = {
        -		dt: new DataTable.Api( settings ),
        -		columns: []
        -	};
        -
        -	// Check if responsive has already been initialised on this table
        -	if ( this.s.dt.settings()[0].responsive ) {
        -		return;
        -	}
        -
        -	// details is an object, but for simplicity the user can give it as a string
        -	if ( opts && typeof opts.details === 'string' ) {
        -		opts.details = { type: opts.details };
        -	}
        -
        -	this.c = $.extend( true, {}, Responsive.defaults, DataTable.defaults.responsive, opts );
        -	settings.responsive = this;
        -	this._constructor();
        -};
        -
        -Responsive.prototype = {
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Constructor
        -	 */
        -
        -	/**
        -	 * Initialise the Responsive instance
        -	 *
        -	 * @private
        -	 */
        -	_constructor: function ()
        -	{
        -		var that = this;
        -		var dt = this.s.dt;
        -
        -		dt.settings()[0]._responsive = this;
        -
        -		// Use DataTables' private throttle function to avoid processor thrashing
        -		$(window).on( 'resize.dtr orientationchange.dtr', dt.settings()[0].oApi._fnThrottle( function () {
        -			that._resize();
        -		} ) );
        -
        -		// Destroy event handler
        -		dt.on( 'destroy.dtr', function () {
        -			$(window).off( 'resize.dtr orientationchange.dtr draw.dtr' );
        -		} );
        -
        -		// Reorder the breakpoints array here in case they have been added out
        -		// of order
        -		this.c.breakpoints.sort( function (a, b) {
        -			return a.width < b.width ? 1 :
        -				a.width > b.width ? -1 : 0;
        -		} );
        -
        -		// Determine which columns are already hidden, and should therefore
        -		// remain hidden. todo - should this be done? See thread 22677
        -		//
        -		// this.s.alwaysHidden = dt.columns(':hidden').indexes();
        -
        -		this._classLogic();
        -		this._resizeAuto();
        -
        -		// Details handler
        -		var details = this.c.details;
        -		if ( details.type ) {
        -			that._detailsInit();
        -			this._detailsVis();
        -
        -			dt.on( 'column-visibility.dtr', function () {
        -				that._detailsVis();
        -			} );
        -
        -			// Redraw the details box on each draw. This is used until
        -			// DataTables implements a native `updated` event for rows
        -			dt.on( 'draw.dtr', function () {
        -				dt.rows( {page: 'current'} ).iterator( 'row', function ( settings, idx ) {
        -					var row = dt.row( idx );
        -
        -					if ( row.child.isShown() ) {
        -						var info = that.c.details.renderer( dt, idx );
        -						row.child( info, 'child' ).show();
        -					}
        -				} );
        -			} );
        -
        -			$(dt.table().node()).addClass( 'dtr-'+details.type );
        -		}
        -
        -		// First pass - draw the table for the current viewport size
        -		this._resize();
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods
        -	 */
        -
        -	/**
        -	 * Calculate the visibility for the columns in a table for a given
        -	 * breakpoint. The result is pre-determined based on the class logic if
        -	 * class names are used to control all columns, but the width of the table
        -	 * is also used if there are columns which are to be automatically shown
        -	 * and hidden.
        -	 *
        -	 * @param  {string} breakpoint Breakpoint name to use for the calculation
        -	 * @return {array} Array of boolean values initiating the visibility of each
        -	 *   column.
        -	 *  @private
        -	 */
        -	_columnsVisiblity: function ( breakpoint )
        -	{
        -		var dt = this.s.dt;
        -		var columns = this.s.columns;
        -		var i, ien;
        -
        -		// Class logic - determine which columns are in this breakpoint based
        -		// on the classes. If no class control (i.e. `auto`) then `-` is used
        -		// to indicate this to the rest of the function
        -		var display = $.map( columns, function ( col ) {
        -			return col.auto && col.minWidth === null ?
        -				false :
        -				col.auto === true ?
        -					'-' :
        -					$.inArray( breakpoint, col.includeIn ) !== -1;
        -		} );
        -
        -		// Auto column control - first pass: how much width is taken by the
        -		// ones that must be included from the non-auto columns
        -		var requiredWidth = 0;
        -		for ( i=0, ien=display.length ; i<ien ; i++ ) {
        -			if ( display[i] === true ) {
        -				requiredWidth += columns[i].minWidth;
        -			}
        -		}
        -
        -		// Second pass, use up any remaining width for other columns. For
        -		// scrolling tables we need to subtract the width of the scrollbar. It
        -		// may not be requires which makes this sub-optimal, but it would
        -		// require another full redraw to make complete use of those extra few
        -		// pixels
        -		var scrolling = dt.settings()[0].oScroll;
        -		var bar = scrolling.sY || scrolling.sX ? scrolling.iBarWidth : 0;
        -		var widthAvailable = dt.table().container().offsetWidth - bar;
        -		var usedWidth = widthAvailable - requiredWidth;
        -
        -		// Control column needs to always be included. This makes it sub-
        -		// optimal in terms of using the available with, but to stop layout
        -		// thrashing or overflow. Also we need to account for the control column
        -		// width first so we know how much width is available for the other
        -		// columns, since the control column might not be the first one shown
        -		for ( i=0, ien=display.length ; i<ien ; i++ ) {
        -			if ( columns[i].control ) {
        -				usedWidth -= columns[i].minWidth;
        -			}
        -		}
        -
        -		// Allow columns to be shown (counting from the left) until we run out
        -		// of room
        -		var empty = false;
        -		for ( i=0, ien=display.length ; i<ien ; i++ ) {
        -			if ( display[i] === '-' && ! columns[i].control ) {
        -				// Once we've found a column that won't fit we don't let any
        -				// others display either, or columns might disappear in the
        -				// middle of the table
        -				if ( empty || usedWidth - columns[i].minWidth < 0 ) {
        -					empty = true;
        -					display[i] = false;
        -				}
        -				else {
        -					display[i] = true;
        -				}
        -
        -				usedWidth -= columns[i].minWidth;
        -			}
        -		}
        -
        -		// Determine if the 'control' column should be shown (if there is one).
        -		// This is the case when there is a hidden column (that is not the
        -		// control column). The two loops look inefficient here, but they are
        -		// trivial and will fly through. We need to know the outcome from the
        -		// first , before the action in the second can be taken
        -		var showControl = false;
        -
        -		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
        -			if ( ! columns[i].control && ! columns[i].never && ! display[i] ) {
        -				showControl = true;
        -				break;
        -			}
        -		}
        -
        -		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
        -			if ( columns[i].control ) {
        -				display[i] = showControl;
        -			}
        -		}
        -
        -		// Finally we need to make sure that there is at least one column that
        -		// is visible
        -		if ( $.inArray( true, display ) === -1 ) {
        -			display[0] = true;
        -		}
        -
        -		return display;
        -	},
        -
        -
        -	/**
        -	 * Create the internal `columns` array with information about the columns
        -	 * for the table. This includes determining which breakpoints the column
        -	 * will appear in, based upon class names in the column, which makes up the
        -	 * vast majority of this method.
        -	 *
        -	 * @private
        -	 */
        -	_classLogic: function ()
        -	{
        -		var that = this;
        -		var calc = {};
        -		var breakpoints = this.c.breakpoints;
        -		var columns = this.s.dt.columns().eq(0).map( function (i) {
        -			var className = this.column(i).header().className;
        -
        -			return {
        -				className: className,
        -				includeIn: [],
        -				auto:      false,
        -				control:   false,
        -				never:     className.match(/\bnever\b/) ? true : false
        -			};
        -		} );
        -
        -		// Simply add a breakpoint to `includeIn` array, ensuring that there are
        -		// no duplicates
        -		var add = function ( colIdx, name ) {
        -			var includeIn = columns[ colIdx ].includeIn;
        -
        -			if ( $.inArray( name, includeIn ) === -1 ) {
        -				includeIn.push( name );
        -			}
        -		};
        -
        -		var column = function ( colIdx, name, operator, matched ) {
        -			var size, i, ien;
        -
        -			if ( ! operator ) {
        -				columns[ colIdx ].includeIn.push( name );
        -			}
        -			else if ( operator === 'max-' ) {
        -				// Add this breakpoint and all smaller
        -				size = that._find( name ).width;
        -
        -				for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {
        -					if ( breakpoints[i].width <= size ) {
        -						add( colIdx, breakpoints[i].name );
        -					}
        -				}
        -			}
        -			else if ( operator === 'min-' ) {
        -				// Add this breakpoint and all larger
        -				size = that._find( name ).width;
        -
        -				for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {
        -					if ( breakpoints[i].width >= size ) {
        -						add( colIdx, breakpoints[i].name );
        -					}
        -				}
        -			}
        -			else if ( operator === 'not-' ) {
        -				// Add all but this breakpoint (xxx need extra information)
        -
        -				for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {
        -					if ( breakpoints[i].name.indexOf( matched ) === -1 ) {
        -						add( colIdx, breakpoints[i].name );
        -					}
        -				}
        -			}
        -		};
        -
        -		// Loop over each column and determine if it has a responsive control
        -		// class
        -		columns.each( function ( col, i ) {
        -			var classNames = col.className.split(' ');
        -			var hasClass = false;
        -
        -			// Split the class name up so multiple rules can be applied if needed
        -			for ( var k=0, ken=classNames.length ; k<ken ; k++ ) {
        -				var className = $.trim( classNames[k] );
        -
        -				if ( className === 'all' ) {
        -					// Include in all
        -					hasClass = true;
        -					col.includeIn = $.map( breakpoints, function (a) {
        -						return a.name;
        -					} );
        -					return;
        -				}
        -				else if ( className === 'none' || className === 'never' ) {
        -					// Include in none (default) and no auto
        -					hasClass = true;
        -					return;
        -				}
        -				else if ( className === 'control' ) {
        -					// Special column that is only visible, when one of the other
        -					// columns is hidden. This is used for the details control
        -					hasClass = true;
        -					col.control = true;
        -					return;
        -				}
        -
        -				$.each( breakpoints, function ( j, breakpoint ) {
        -					// Does this column have a class that matches this breakpoint?
        -					var brokenPoint = breakpoint.name.split('-');
        -					var re = new RegExp( '(min\\-|max\\-|not\\-)?('+brokenPoint[0]+')(\\-[_a-zA-Z0-9])?' );
        -					var match = className.match( re );
        -
        -					if ( match ) {
        -						hasClass = true;
        -
        -						if ( match[2] === brokenPoint[0] && match[3] === '-'+brokenPoint[1] ) {
        -							// Class name matches breakpoint name fully
        -							column( i, breakpoint.name, match[1], match[2]+match[3] );
        -						}
        -						else if ( match[2] === brokenPoint[0] && ! match[3] ) {
        -							// Class name matched primary breakpoint name with no qualifier
        -							column( i, breakpoint.name, match[1], match[2] );
        -						}
        -					}
        -				} );
        -			}
        -
        -			// If there was no control class, then automatic sizing is used
        -			if ( ! hasClass ) {
        -				col.auto = true;
        -			}
        -		} );
        -
        -		this.s.columns = columns;
        -	},
        -
        -
        -	/**
        -	 * Initialisation for the details handler
        -	 *
        -	 * @private
        -	 */
        -	_detailsInit: function ()
        -	{
        -		var that    = this;
        -		var dt      = this.s.dt;
        -		var details = this.c.details;
        -
        -		// The inline type always uses the first child as the target
        -		if ( details.type === 'inline' ) {
        -			details.target = 'td:first-child';
        -		}
        -
        -		// type.target can be a string jQuery selector or a column index
        -		var target   = details.target;
        -		var selector = typeof target === 'string' ? target : 'td';
        -
        -		// Click handler to show / hide the details rows when they are available
        -		$( dt.table().body() ).on( 'click', selector, function (e) {
        -			// If the table is not collapsed (i.e. there is no hidden columns)
        -			// then take no action
        -			if ( ! $(dt.table().node()).hasClass('collapsed' ) ) {
        -				return;
        -			}
        -
        -			// Check that the row is actually a DataTable's controlled node
        -			if ( ! dt.row( $(this).closest('tr') ).length ) {
        -				return;
        -			}
        -
        -			// For column index, we determine if we should act or not in the
        -			// handler - otherwise it is already okay
        -			if ( typeof target === 'number' ) {
        -				var targetIdx = target < 0 ?
        -					dt.columns().eq(0).length + target :
        -					target;
        -
        -				if ( dt.cell( this ).index().column !== targetIdx ) {
        -					return;
        -				}
        -			}
        -
        -			// $().closest() includes itself in its check
        -			var row = dt.row( $(this).closest('tr') );
        -
        -			if ( row.child.isShown() ) {
        -				row.child( false );
        -				$( row.node() ).removeClass( 'parent' );
        -			}
        -			else {
        -				var info = that.c.details.renderer( dt, row[0] );
        -				row.child( info, 'child' ).show();
        -				$( row.node() ).addClass( 'parent' );
        -			}
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Update the child rows in the table whenever the column visibility changes
        -	 *
        -	 * @private
        -	 */
        -	_detailsVis: function ()
        -	{
        -		var that = this;
        -		var dt = this.s.dt;
        -
        -		// Find how many columns are hidden
        -		var hiddenColumns = dt.columns().indexes().filter( function ( idx ) {
        -			var col = dt.column( idx );
        -
        -			if ( col.visible() ) {
        -				return null;
        -			}
        -
        -			// Only counts as hidden if it doesn't have the `never` class
        -			return $( col.header() ).hasClass( 'never' ) ? null : idx;
        -		} );
        -		var haveHidden = true;
        -
        -		if ( hiddenColumns.length === 0 || ( hiddenColumns.length === 1 && this.s.columns[ hiddenColumns[0] ].control ) ) {
        -			haveHidden = false;
        -		}
        -
        -		if ( haveHidden ) {
        -			// Show all existing child rows
        -			dt.rows( { page: 'current' } ).eq(0).each( function (idx) {
        -				var row = dt.row( idx );
        -
        -				if ( row.child() ) {
        -					var info = that.c.details.renderer( dt, row[0] );
        -
        -					// The renderer can return false to have no child row
        -					if ( info === false ) {
        -						row.child.hide();
        -					}
        -					else {
        -						row.child( info, 'child' ).show();
        -					}
        -				}
        -			} );
        -		}
        -		else {
        -			// Hide all existing child rows
        -			dt.rows( { page: 'current' } ).eq(0).each( function (idx) {
        -				dt.row( idx ).child.hide();
        -			} );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Find a breakpoint object from a name
        -	 * @param  {string} name Breakpoint name to find
        -	 * @return {object}      Breakpoint description object
        -	 */
        -	_find: function ( name )
        -	{
        -		var breakpoints = this.c.breakpoints;
        -
        -		for ( var i=0, ien=breakpoints.length ; i<ien ; i++ ) {
        -			if ( breakpoints[i].name === name ) {
        -				return breakpoints[i];
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Alter the table display for a resized viewport. This involves first
        -	 * determining what breakpoint the window currently is in, getting the
        -	 * column visibilities to apply and then setting them.
        -	 *
        -	 * @private
        -	 */
        -	_resize: function ()
        -	{
        -		var dt = this.s.dt;
        -		var width = $(window).width();
        -		var breakpoints = this.c.breakpoints;
        -		var breakpoint = breakpoints[0].name;
        -		var columns = this.s.columns;
        -		var i, ien;
        -
        -		// Determine what breakpoint we are currently at
        -		for ( i=breakpoints.length-1 ; i>=0 ; i-- ) {
        -			if ( width <= breakpoints[i].width ) {
        -				breakpoint = breakpoints[i].name;
        -				break;
        -			}
        -		}
        -		
        -		// Show the columns for that break point
        -		var columnsVis = this._columnsVisiblity( breakpoint );
        -
        -		// Set the class before the column visibility is changed so event
        -		// listeners know what the state is. Need to determine if there are
        -		// any columns that are not visible but can be shown
        -		var collapsedClass = false;
        -		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
        -			if ( columnsVis[i] === false && ! columns[i].never ) {
        -				collapsedClass = true;
        -				break;
        -			}
        -		}
        -
        -		$( dt.table().node() ).toggleClass('collapsed', collapsedClass );
        -
        -		dt.columns().eq(0).each( function ( colIdx, i ) {
        -			dt.column( colIdx ).visible( columnsVis[i] );
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Determine the width of each column in the table so the auto column hiding
        -	 * has that information to work with. This method is never going to be 100%
        -	 * perfect since column widths can change slightly per page, but without
        -	 * seriously compromising performance this is quite effective.
        -	 *
        -	 * @private
        -	 */
        -	_resizeAuto: function ()
        -	{
        -		var dt = this.s.dt;
        -		var columns = this.s.columns;
        -
        -		// Are we allowed to do auto sizing?
        -		if ( ! this.c.auto ) {
        -			return;
        -		}
        -
        -		// Are there any columns that actually need auto-sizing, or do they all
        -		// have classes defined
        -		if ( $.inArray( true, $.map( columns, function (c) { return c.auto; } ) ) === -1 ) {
        -			return;
        -		}
        -
        -		// Clone the table with the current data in it
        -		var tableWidth   = dt.table().node().offsetWidth;
        -		var columnWidths = dt.columns;
        -		var clonedTable  = dt.table().node().cloneNode( false );
        -		var clonedHeader = $( dt.table().header().cloneNode( false ) ).appendTo( clonedTable );
        -		var clonedBody   = $( dt.table().body().cloneNode( false ) ).appendTo( clonedTable );
        -
        -		$( dt.table().footer() ).clone( false ).appendTo( clonedTable );
        -
        -		// This is a bit slow, but we need to get a clone of each row that
        -		// includes all columns. As such, try to do this as little as possible.
        -		dt.rows( { page: 'current' } ).indexes().flatten().each( function ( idx ) {
        -			var clone = dt.row( idx ).node().cloneNode( true );
        -			
        -			if ( dt.columns( ':hidden' ).flatten().length ) {
        -				$(clone).append( dt.cells( idx, ':hidden' ).nodes().to$().clone() );
        -			}
        -
        -			$(clone).appendTo( clonedBody );
        -		} );
        -
        -		var cells = dt.columns().header().to$().clone( false );
        -		$('<tr/>')
        -			.append( cells )
        -			.appendTo( clonedHeader );
        -
        -		// In the inline case extra padding is applied to the first column to
        -		// give space for the show / hide icon. We need to use this in the
        -		// calculation
        -		if ( this.c.details.type === 'inline' ) {
        -			$(clonedTable).addClass( 'dtr-inline collapsed' );
        -		}
        -
        -		var inserted = $('<div/>')
        -			.css( {
        -				width: 1,
        -				height: 1,
        -				overflow: 'hidden'
        -			} )
        -			.append( clonedTable );
        -
        -		// Remove columns which are not to be included
        -		inserted.find('th.never, td.never').remove();
        -
        -		inserted.insertBefore( dt.table().node() );
        -
        -		// The cloned header now contains the smallest that each column can be
        -		dt.columns().eq(0).each( function ( idx ) {
        -			columns[idx].minWidth = cells[ idx ].offsetWidth || 0;
        -		} );
        -
        -		inserted.remove();
        -	}
        -};
        -
        -
        -/**
        - * List of default breakpoints. Each item in the array is an object with two
        - * properties:
        - *
        - * * `name` - the breakpoint name.
        - * * `width` - the breakpoint width
        - *
        - * @name Responsive.breakpoints
        - * @static
        - */
        -Responsive.breakpoints = [
        -	{ name: 'desktop',  width: Infinity },
        -	{ name: 'tablet-l', width: 1024 },
        -	{ name: 'tablet-p', width: 768 },
        -	{ name: 'mobile-l', width: 480 },
        -	{ name: 'mobile-p', width: 320 }
        -];
        -
        -
        -/**
        - * Responsive default settings for initialisation
        - *
        - * @namespace
        - * @name Responsive.defaults
        - * @static
        - */
        -Responsive.defaults = {
        -	/**
        -	 * List of breakpoints for the instance. Note that this means that each
        -	 * instance can have its own breakpoints. Additionally, the breakpoints
        -	 * cannot be changed once an instance has been creased.
        -	 *
        -	 * @type {Array}
        -	 * @default Takes the value of `Responsive.breakpoints`
        -	 */
        -	breakpoints: Responsive.breakpoints,
        -
        -	/**
        -	 * Enable / disable auto hiding calculations. It can help to increase
        -	 * performance slightly if you disable this option, but all columns would
        -	 * need to have breakpoint classes assigned to them
        -	 *
        -	 * @type {Boolean}
        -	 * @default  `true`
        -	 */
        -	auto: true,
        -
        -	/**
        -	 * Details control. If given as a string value, the `type` property of the
        -	 * default object is set to that value, and the defaults used for the rest
        -	 * of the object - this is for ease of implementation.
        -	 *
        -	 * The object consists of the following properties:
        -	 *
        -	 * * `renderer` - function that is called for display of the child row data.
        -	 *   The default function will show the data from the hidden columns
        -	 * * `target` - Used as the selector for what objects to attach the child
        -	 *   open / close to
        -	 * * `type` - `false` to disable the details display, `inline` or `column`
        -	 *   for the two control types
        -	 *
        -	 * @type {Object|string}
        -	 */
        -	details: {
        -		renderer: function ( api, rowIdx ) {
        -			var data = api.cells( rowIdx, ':hidden' ).eq(0).map( function ( cell ) {
        -				var header = $( api.column( cell.column ).header() );
        -				var idx = api.cell( cell ).index();
        -
        -				if ( header.hasClass( 'control' ) || header.hasClass( 'never' ) ) {
        -					return '';
        -				}
        -
        -				// Use a non-public DT API method to render the data for display
        -				// This needs to be updated when DT adds a suitable method for
        -				// this type of data retrieval
        -				var dtPrivate = api.settings()[0];
        -				var cellData = dtPrivate.oApi._fnGetCellData(
        -					dtPrivate, idx.row, idx.column, 'display'
        -				);
        -				var title = header.text();
        -				if ( title ) {
        -					title = title + ':';
        -				}
        -
        -				return '<li data-dtr-index="'+idx.column+'">'+
        -						'<span class="dtr-title">'+
        -							title+
        -						'</span> '+
        -						'<span class="dtr-data">'+
        -							cellData+
        -						'</span>'+
        -					'</li>';
        -			} ).toArray().join('');
        -
        -			return data ?
        -				$('<ul data-dtr-index="'+rowIdx+'"/>').append( data ) :
        -				false;
        -		},
        -
        -		target: 0,
        -
        -		type: 'inline'
        -	}
        -};
        -
        -
        -/*
        - * API
        - */
        -var Api = $.fn.dataTable.Api;
        -
        -// Doesn't do anything - work around for a bug in DT... Not documented
        -Api.register( 'responsive()', function () {
        -	return this;
        -} );
        -
        -Api.register( 'responsive.index()', function ( li ) {
        -	li = $(li);
        -
        -	return {
        -		column: li.data('dtr-index'),
        -		row:    li.parent().data('dtr-index')
        -	};
        -} );
        -
        -Api.register( 'responsive.rebuild()', function () {
        -	return this.iterator( 'table', function ( ctx ) {
        -		if ( ctx._responsive ) {
        -			ctx._responsive._classLogic();
        -		}
        -	} );
        -} );
        -
        -Api.register( 'responsive.recalc()', function () {
        -	return this.iterator( 'table', function ( ctx ) {
        -		if ( ctx._responsive ) {
        -			ctx._responsive._resizeAuto();
        -			ctx._responsive._resize();
        -		}
        -	} );
        -} );
        -
        -
        -/**
        - * Version information
        - *
        - * @name Responsive.version
        - * @static
        - */
        -Responsive.version = '1.0.6';
        -
        -
        -$.fn.dataTable.Responsive = Responsive;
        -$.fn.DataTable.Responsive = Responsive;
        -
        -// Attach a listener to the document which listens for DataTables initialisation
        -// events so we can automatically initialise
        -$(document).on( 'init.dt.dtr', function (e, settings, json) {
        -	if ( e.namespace !== 'dt' ) {
        -		return;
        -	}
        -
        -	if ( $(settings.nTable).hasClass( 'responsive' ) ||
        -		 $(settings.nTable).hasClass( 'dt-responsive' ) ||
        -		 settings.oInit.responsive ||
        -		 DataTable.defaults.responsive
        -	) {
        -		var init = settings.oInit.responsive;
        -
        -		if ( init !== false ) {
        -			new Responsive( settings, $.isPlainObject( init ) ? init : {}  );
        -		}
        -	}
        -} );
        -
        -return Responsive;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.Responsive ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js b/resources/assets/js/plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js
        deleted file mode 100755
        index 1142b80178..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js
        +++ /dev/null
        @@ -1,19 +0,0 @@
        -/*!
        - Responsive 1.0.6
        - 2014-2015 SpryMedia Ltd - datatables.net/license
        -*/
        -(function(n,p){var o=function(e,k){var h=function(d,a){if(!k.versionCheck||!k.versionCheck("1.10.1"))throw"DataTables Responsive requires DataTables 1.10.1 or newer";this.s={dt:new k.Api(d),columns:[]};this.s.dt.settings()[0].responsive||(a&&"string"===typeof a.details&&(a.details={type:a.details}),this.c=e.extend(!0,{},h.defaults,k.defaults.responsive,a),d.responsive=this,this._constructor())};h.prototype={_constructor:function(){var d=this,a=this.s.dt;a.settings()[0]._responsive=this;e(n).on("resize.dtr orientationchange.dtr",
        -a.settings()[0].oApi._fnThrottle(function(){d._resize()}));a.on("destroy.dtr",function(){e(n).off("resize.dtr orientationchange.dtr draw.dtr")});this.c.breakpoints.sort(function(a,c){return a.width<c.width?1:a.width>c.width?-1:0});this._classLogic();this._resizeAuto();var c=this.c.details;c.type&&(d._detailsInit(),this._detailsVis(),a.on("column-visibility.dtr",function(){d._detailsVis()}),a.on("draw.dtr",function(){a.rows({page:"current"}).iterator("row",function(b,c){var f=a.row(c);if(f.child.isShown()){var i=
        -d.c.details.renderer(a,c);f.child(i,"child").show()}})}),e(a.table().node()).addClass("dtr-"+c.type));this._resize()},_columnsVisiblity:function(d){var a=this.s.dt,c=this.s.columns,b,g,f=e.map(c,function(a){return a.auto&&null===a.minWidth?!1:!0===a.auto?"-":-1!==e.inArray(d,a.includeIn)}),i=0;b=0;for(g=f.length;b<g;b++)!0===f[b]&&(i+=c[b].minWidth);b=a.settings()[0].oScroll;b=b.sY||b.sX?b.iBarWidth:0;a=a.table().container().offsetWidth-b-i;b=0;for(g=f.length;b<g;b++)c[b].control&&(a-=c[b].minWidth);
        -i=!1;b=0;for(g=f.length;b<g;b++)"-"===f[b]&&!c[b].control&&(i||0>a-c[b].minWidth?(i=!0,f[b]=!1):f[b]=!0,a-=c[b].minWidth);a=!1;b=0;for(g=c.length;b<g;b++)if(!c[b].control&&!c[b].never&&!f[b]){a=!0;break}b=0;for(g=c.length;b<g;b++)c[b].control&&(f[b]=a);-1===e.inArray(!0,f)&&(f[0]=!0);return f},_classLogic:function(){var d=this,a=this.c.breakpoints,c=this.s.dt.columns().eq(0).map(function(a){a=this.column(a).header().className;return{className:a,includeIn:[],auto:!1,control:!1,never:a.match(/\bnever\b/)?
        -!0:!1}}),b=function(a,b){var d=c[a].includeIn;-1===e.inArray(b,d)&&d.push(b)},g=function(f,g,e,j){if(e)if("max-"===e){j=d._find(g).width;g=0;for(e=a.length;g<e;g++)a[g].width<=j&&b(f,a[g].name)}else if("min-"===e){j=d._find(g).width;g=0;for(e=a.length;g<e;g++)a[g].width>=j&&b(f,a[g].name)}else{if("not-"===e){g=0;for(e=a.length;g<e;g++)-1===a[g].name.indexOf(j)&&b(f,a[g].name)}}else c[f].includeIn.push(g)};c.each(function(b,c){for(var d=b.className.split(" "),j=!1,h=0,k=d.length;h<k;h++){var l=e.trim(d[h]);
        -if("all"===l){j=!0;b.includeIn=e.map(a,function(a){return a.name});return}if("none"===l||"never"===l){j=!0;return}if("control"===l){j=!0;b.control=!0;return}e.each(a,function(a,b){var d=b.name.split("-"),e=l.match(RegExp("(min\\-|max\\-|not\\-)?("+d[0]+")(\\-[_a-zA-Z0-9])?"));e&&(j=!0,e[2]===d[0]&&e[3]==="-"+d[1]?g(c,b.name,e[1],e[2]+e[3]):e[2]===d[0]&&!e[3]&&g(c,b.name,e[1],e[2]))})}j||(b.auto=!0)});this.s.columns=c},_detailsInit:function(){var d=this,a=this.s.dt,c=this.c.details;"inline"===c.type&&
        -(c.target="td:first-child");var b=c.target;e(a.table().body()).on("click","string"===typeof b?b:"td",function(){if(e(a.table().node()).hasClass("collapsed")&&a.row(e(this).closest("tr")).length){if(typeof b==="number"){var c=b<0?a.columns().eq(0).length+b:b;if(a.cell(this).index().column!==c)return}c=a.row(e(this).closest("tr"));if(c.child.isShown()){c.child(false);e(c.node()).removeClass("parent")}else{var f=d.c.details.renderer(a,c[0]);c.child(f,"child").show();e(c.node()).addClass("parent")}}})},
        -_detailsVis:function(){var d=this,a=this.s.dt,c=a.columns().indexes().filter(function(b){var c=a.column(b);return c.visible()?null:e(c.header()).hasClass("never")?null:b}),b=!0;if(0===c.length||1===c.length&&this.s.columns[c[0]].control)b=!1;b?a.rows({page:"current"}).eq(0).each(function(b){b=a.row(b);if(b.child()){var c=d.c.details.renderer(a,b[0]);!1===c?b.child.hide():b.child(c,"child").show()}}):a.rows({page:"current"}).eq(0).each(function(b){a.row(b).child.hide()})},_find:function(d){for(var a=
        -this.c.breakpoints,c=0,b=a.length;c<b;c++)if(a[c].name===d)return a[c]},_resize:function(){var d=this.s.dt,a=e(n).width(),c=this.c.breakpoints,b=c[0].name,g=this.s.columns,f;for(f=c.length-1;0<=f;f--)if(a<=c[f].width){b=c[f].name;break}var i=this._columnsVisiblity(b),c=!1;f=0;for(a=g.length;f<a;f++)if(!1===i[f]&&!g[f].never){c=!0;break}e(d.table().node()).toggleClass("collapsed",c);d.columns().eq(0).each(function(a,b){d.column(a).visible(i[b])})},_resizeAuto:function(){var d=this.s.dt,a=this.s.columns;
        -if(this.c.auto&&-1!==e.inArray(!0,e.map(a,function(a){return a.auto}))){d.table().node();var c=d.table().node().cloneNode(!1),b=e(d.table().header().cloneNode(!1)).appendTo(c),g=e(d.table().body().cloneNode(!1)).appendTo(c);e(d.table().footer()).clone(!1).appendTo(c);d.rows({page:"current"}).indexes().flatten().each(function(a){var b=d.row(a).node().cloneNode(!0);d.columns(":hidden").flatten().length&&e(b).append(d.cells(a,":hidden").nodes().to$().clone());e(b).appendTo(g)});var f=d.columns().header().to$().clone(!1);
        -e("<tr/>").append(f).appendTo(b);"inline"===this.c.details.type&&e(c).addClass("dtr-inline collapsed");c=e("<div/>").css({width:1,height:1,overflow:"hidden"}).append(c);c.find("th.never, td.never").remove();c.insertBefore(d.table().node());d.columns().eq(0).each(function(b){a[b].minWidth=f[b].offsetWidth||0});c.remove()}}};h.breakpoints=[{name:"desktop",width:Infinity},{name:"tablet-l",width:1024},{name:"tablet-p",width:768},{name:"mobile-l",width:480},{name:"mobile-p",width:320}];h.defaults={breakpoints:h.breakpoints,
        -auto:!0,details:{renderer:function(d,a){var c=d.cells(a,":hidden").eq(0).map(function(a){var c=e(d.column(a.column).header()),a=d.cell(a).index();if(c.hasClass("control")||c.hasClass("never"))return"";var f=d.settings()[0],f=f.oApi._fnGetCellData(f,a.row,a.column,"display");(c=c.text())&&(c+=":");return'<li data-dtr-index="'+a.column+'"><span class="dtr-title">'+c+'</span> <span class="dtr-data">'+f+"</span></li>"}).toArray().join("");return c?e('<ul data-dtr-index="'+a+'"/>').append(c):!1},target:0,
        -type:"inline"}};var m=e.fn.dataTable.Api;m.register("responsive()",function(){return this});m.register("responsive.index()",function(d){d=e(d);return{column:d.data("dtr-index"),row:d.parent().data("dtr-index")}});m.register("responsive.rebuild()",function(){return this.iterator("table",function(d){d._responsive&&d._responsive._classLogic()})});m.register("responsive.recalc()",function(){return this.iterator("table",function(d){d._responsive&&(d._responsive._resizeAuto(),d._responsive._resize())})});
        -h.version="1.0.6";e.fn.dataTable.Responsive=h;e.fn.DataTable.Responsive=h;e(p).on("init.dt.dtr",function(d,a){if("dt"===d.namespace&&(e(a.nTable).hasClass("responsive")||e(a.nTable).hasClass("dt-responsive")||a.oInit.responsive||k.defaults.responsive)){var c=a.oInit.responsive;!1!==c&&new h(a,e.isPlainObject(c)?c:{})}});return h};"function"===typeof define&&define.amd?define(["jquery","datatables"],o):"object"===typeof exports?o(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.Responsive&&
        -o(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/Readme.txt b/resources/assets/js/plugins/datatables/extensions/Scroller/Readme.txt
        deleted file mode 100755
        index d262eaf8d2..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/Readme.txt
        +++ /dev/null
        @@ -1,43 +0,0 @@
        -# Scroller
        -
        -Scroller is a virtual rendering plug-in for DataTables which allows large datasets to be drawn on screen every quickly. What the virtual rendering means is that only the visible portion of the table (and a bit to either side to make the scrolling smooth) is drawn, while the scrolling container gives the visual impression that the whole table is visible. This is done by making use of the pagination abilities of DataTables and moving the table around in the scrolling container DataTables adds to the page. The scrolling container is forced to the height it would be for the full table display using an extra element.
        -
        -Key features include:
        -
        -* Speed! The aim of Scroller for DataTables is to make rendering large data sets fast
        -* Full compatibility with DataTables' deferred rendering for maximum speed
        -* Integration with state saving in DataTables (scrolling position is saved)
        -* Support for scrolling with millions of rows
        -* Easy to use
        -
        -
        -# Installation
        -
        -To use Scroller, first download DataTables ( http://datatables.net/download ) and place the unzipped Scroller package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -Scroller is initialised by simply including the letter `dt-string S` in the `dt-init dom` for the table you want to have this feature enabled on. Note that the `dt-string S` must come after the `dt-string t` parameter in `dom`. For example:
        -
        -```js
        -$(document).ready( function () {
        -	$('#example').DataTable( {
        -		dom: 'lfrtipS'
        -	} );
        -} );
        -```
        -
        -Note that rows in the table must all be the same height. Information in a cell which expands on to multiple lines will cause some odd behaviour in the scrolling. Additionally, the table's `cellspacing` parameter must be set to 0, again to ensure the information display is correct.
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/scroller/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of Scroller and help make it better, please refer to its GitHub repo: https://github.com/DataTables/Scroller
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/css/dataTables.scroller.css b/resources/assets/js/plugins/datatables/extensions/Scroller/css/dataTables.scroller.css
        deleted file mode 100755
        index 4bbaa5754c..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/css/dataTables.scroller.css
        +++ /dev/null
        @@ -1,44 +0,0 @@
        -
        -/*
        - * Namespace: DTS (DataTables Scroller)
        - */
        -
        -div.DTS tbody th,
        -div.DTS tbody td {
        -	white-space: nowrap;
        -}
        -
        -div.DTS tbody tr.even {
        -	background-color: white;
        -}
        -
        -div.DTS div.DTS_Loading {
        -	position: absolute;
        -	top: 50%;
        -	left: 50%;
        -	width: 200px;
        -	height: 20px;
        -	margin-top: -20px;
        -	margin-left: -100px;
        -	z-index: 1;
        -
        -	border: 1px solid #999;
        -	padding: 20px 0;
        -	text-align: center;
        -	background-color: white;
        -	background-color: rgba(255, 255, 255, 0.5);
        -}
        -
        -div.DTS div.dataTables_scrollHead,
        -div.DTS div.dataTables_scrollFoot {
        -	background-color: white;
        -}
        -
        -div.DTS div.dataTables_scrollBody {
        -	z-index: 2;
        -}
        -
        -div.DTS div.dataTables_scroll {
        -	background: url('../images/loading-background.png') repeat 0 0;
        -}
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/css/dataTables.scroller.min.css b/resources/assets/js/plugins/datatables/extensions/Scroller/css/dataTables.scroller.min.css
        deleted file mode 100755
        index 499b85d60e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/css/dataTables.scroller.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS tbody tr.even{background-color:white}div.DTS div.DTS_Loading{position:absolute;top:50%;left:50%;width:200px;height:20px;margin-top:-20px;margin-left:-100px;z-index:1;border:1px solid #999;padding:20px 0;text-align:center;background-color:white;background-color:rgba(255,255,255,0.5)}div.DTS div.dataTables_scrollHead,div.DTS div.dataTables_scrollFoot{background-color:white}div.DTS div.dataTables_scrollBody{z-index:2}div.DTS div.dataTables_scroll{background:url("../images/loading-background.png") repeat 0 0}
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/api_scrolling.html b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/api_scrolling.html
        deleted file mode 100755
        index 1653d2151f..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/api_scrolling.html
        +++ /dev/null
        @@ -1,174 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Scroller example - API</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax:        "data/2500.txt",
        -		deferRender: true,
        -		dom:         "frtiS",
        -		scrollY:     200,
        -		scrollCollapse: true,
        -		initComplete: function () {
        -			var api = this.api();
        -			api.scroller().scrollToRow( 1000 );
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Scroller example <span>API</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows a trivial use of the API methods that Scroller adds to the DataTables API to
        -				scroll to a row once the table's data has been loaded. In this case
        -				<code>scroller().scrollToRow()</code> is used to jump to row 1000.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>ID</th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>ZIP / Post code</th>
        -						<th>Country</th>
        -					</tr>
        -				</thead>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax:        &quot;data/2500.txt&quot;,
        -		deferRender: true,
        -		dom:         &quot;frtiS&quot;,
        -		scrollY:     200,
        -		scrollCollapse: true,
        -		initComplete: function () {
        -			var api = this.api();
        -			api.scroller().scrollToRow( 1000 );
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./state_saving.html">State saving</a></li>
        -							<li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li>
        -							<li><a href="./server-side_processing.html">Server-side processing (5,000,000
        -							rows)</a></li>
        -							<li class="active"><a href="./api_scrolling.html">API</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/data/2500.txt b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/data/2500.txt
        deleted file mode 100755
        index 4e9f706e74..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/data/2500.txt
        +++ /dev/null
        @@ -1,2502 +0,0 @@
        -{ "aaData": [
        -	[ "1", "Armand", "Warren", "56045", "Taiwan, Province of China" ],
        -	[ "2", "Xenos", "Salas", "71090", "Liberia" ],
        -	[ "3", "Virginia", "Whitaker", "62723", "Nicaragua" ],
        -	[ "4", "Kato", "Patrick", "97662", "Palau" ],
        -	[ "5", "Penelope", "Hensley", "76634", "Greenland" ],
        -	[ "6", "Georgia", "Erickson", "81358", "Bolivia" ],
        -	[ "7", "Shad", "Pena", "20600", "Palestinian Territory, Occupied" ],
        -	[ "8", "Tanisha", "Humphrey", "93371", "Kenya" ],
        -	[ "9", "Claire", "Espinoza", "I8S 2S8", "Panama" ],
        -	[ "10", "Raya", "Tucker", "O8D 8W7", "Botswana" ],
        -	[ "11", "Otto", "Briggs", "57590", "Anguilla" ],
        -	[ "12", "Logan", "Burt", "53041", "Venezuela" ],
        -	[ "13", "Cooper", "Pennington", "36994", "France" ],
        -	[ "14", "Kristen", "Peterson", "52917", "Sao Tome and Principe" ],
        -	[ "15", "Jordan", "Velasquez", "08884", "Switzerland" ],
        -	[ "16", "Zelda", "Freeman", "F9H 1J9", "Holy See (Vatican City State)" ],
        -	[ "17", "Mary", "Pacheco", "A7Y 6X9", "Niger" ],
        -	[ "18", "Tiger", "Robles", "44533", "Malaysia" ],
        -	[ "19", "Zelenia", "Buckner", "Q8N 6E5", "Malawi" ],
        -	[ "20", "Coby", "Johnston", "N6I 2O9", "Rwanda" ],
        -	[ "21", "Gillian", "Strickland", "12258", "Cook Islands" ],
        -	[ "22", "Alfreda", "Mcbride", "K5A 3B6", "Nigeria" ],
        -	[ "23", "Laith", "Ford", "19072", "Czech Republic" ],
        -	[ "24", "Autumn", "Barton", "U9D 9F4", "Angola" ],
        -	[ "25", "Nadine", "Britt", "G4U 8L0", "Liechtenstein" ],
        -	[ "26", "Xaviera", "Hart", "T1N 7D2", "Mali" ],
        -	[ "27", "Neil", "Page", "T3E 9F4", "Korea" ],
        -	[ "28", "Rose", "French", "B7T 8M2", "French Polynesia" ],
        -	[ "29", "Alyssa", "Poole", "S1L 2T5", "Yemen" ],
        -	[ "30", "Chantale", "Lynch", "97316", "United States" ],
        -	[ "31", "Jermaine", "Dawson", "A3H 7A1", "American Samoa" ],
        -	[ "32", "Ann", "Giles", "54258", "Korea" ],
        -	[ "33", "Jerry", "Carr", "04901", "South Georgia and The South Sandwich Islands" ],
        -	[ "34", "Lionel", "Hooper", "67970", "Bahrain" ],
        -	[ "35", "Alyssa", "Hewitt", "R3K 2V8", "Paraguay" ],
        -	[ "36", "Lisandra", "Sheppard", "71886", "Seychelles" ],
        -	[ "37", "Kylan", "Harrison", "96763", "Italy" ],
        -	[ "38", "Kaitlin", "Montgomery", "V5K 5U8", "Niger" ],
        -	[ "39", "Heidi", "Boyd", "B3C 8M9", "Papua New Guinea" ],
        -	[ "40", "Rinah", "Case", "W7M 5K1", "Mali" ],
        -	[ "41", "Thaddeus", "Maynard", "E4V 6W6", "Egypt" ],
        -	[ "42", "Lacota", "Ray", "T3J 8D8", "United Kingdom" ],
        -	[ "43", "Olympia", "Cortez", "F8C 7I5", "Palau" ],
        -	[ "44", "Wendy", "Rojas", "N8T 4K6", "Cook Islands" ],
        -	[ "45", "Arden", "Kelley", "V9N 2T6", "India" ],
        -	[ "46", "Colorado", "Lindsey", "96703", "Chad" ],
        -	[ "47", "Alika", "Weaver", "F6V 1I1", "Bulgaria" ],
        -	[ "48", "Phoebe", "Mack", "E4B 1X2", "El Salvador" ],
        -	[ "49", "Sybill", "Bridges", "Z2G 6A2", "Somalia" ],
        -	[ "50", "Trevor", "Larsen", "K1R 3B9", "United Arab Emirates" ],
        -	[ "51", "Maya", "Battle", "70881", "Australia" ],
        -	[ "52", "Charity", "Walton", "I4I 5R9", "Swaziland" ],
        -	[ "53", "Lane", "Sloan", "79076", "Nauru" ],
        -	[ "54", "Christopher", "Watson", "35116", "Suriname" ],
        -	[ "55", "Clementine", "Shelton", "98232", "Venezuela" ],
        -	[ "56", "Basil", "Hood", "J9I 1R2", "Tonga" ],
        -	[ "57", "Meghan", "Pacheco", "H5Z 6B1", "Dominican Republic" ],
        -	[ "58", "Brennan", "Potts", "51743", "Turkey" ],
        -	[ "59", "Lawrence", "Duran", "63266", "Uruguay" ],
        -	[ "60", "Ina", "Head", "S8P 9J5", "Romania" ],
        -	[ "61", "Castor", "Jacobson", "C9F 6C9", "Albania" ],
        -	[ "62", "Daquan", "Holden", "38571", "Ireland" ],
        -	[ "63", "Donna", "Valencia", "J7B 3I0", "Portugal" ],
        -	[ "64", "Kessie", "Phelps", "61063", "Georgia" ],
        -	[ "65", "Dillon", "Garcia", "13652", "Holy See (Vatican City State)" ],
        -	[ "66", "Russell", "Sweeney", "T8P 2O6", "Saint Kitts and Nevis" ],
        -	[ "67", "Zelda", "Berg", "84946", "Afghanistan" ],
        -	[ "68", "Dexter", "Mann", "73596", "Thailand" ],
        -	[ "69", "Maisie", "Miller", "X3M 6C1", "Seychelles" ],
        -	[ "70", "Lynn", "Mitchell", "N5B 3Z9", "Wallis and Futuna" ],
        -	[ "71", "Gay", "Medina", "66692", "Germany" ],
        -	[ "72", "Olga", "Clark", "M6B 7B6", "Kuwait" ],
        -	[ "73", "Brianna", "Obrien", "Z6Z 5R3", "Bahrain" ],
        -	[ "74", "Daria", "Byers", "R9T 4N7", "Ghana" ],
        -	[ "75", "Chiquita", "Barker", "28435", "Ireland" ],
        -	[ "76", "Gray", "Salazar", "58618", "Chile" ],
        -	[ "77", "Delilah", "Kirby", "42811", "Oman" ],
        -	[ "78", "Xanthus", "Holland", "B8Q 9C4", "Antigua and Barbuda" ],
        -	[ "79", "Reuben", "Brennan", "44693", "Czech Republic" ],
        -	[ "80", "Alden", "Long", "94236", "Slovakia" ],
        -	[ "81", "Blythe", "Bender", "04812", "Guam" ],
        -	[ "82", "Aileen", "Burgess", "47942", "Djibouti" ],
        -	[ "83", "Zeus", "Craig", "43002", "Nicaragua" ],
        -	[ "84", "Jade", "Garza", "F2X 8F3", "New Zealand" ],
        -	[ "85", "Noah", "Barrera", "K9C 8U0", "Malawi" ],
        -	[ "86", "Quyn", "Robertson", "H3X 6J9", "Bosnia and Herzegovina" ],
        -	[ "87", "Serena", "Cabrera", "83671", "Slovenia" ],
        -	[ "88", "Charity", "Chase", "T9Q 7C4", "Solomon Islands" ],
        -	[ "89", "Athena", "Grimes", "62801", "Aruba" ],
        -	[ "90", "Mallory", "Middleton", "D2V 1M5", "Italy" ],
        -	[ "91", "Xenos", "Jones", "46642", "Singapore" ],
        -	[ "92", "Tate", "Gregory", "66538", "Zimbabwe" ],
        -	[ "93", "Blaze", "Taylor", "70282", "Paraguay" ],
        -	[ "94", "Jena", "Duncan", "63057", "Cambodia" ],
        -	[ "95", "Thaddeus", "Chase", "66762", "Netherlands Antilles" ],
        -	[ "96", "Guinevere", "Mcgee", "O9G 4S2", "Lebanon" ],
        -	[ "97", "Kermit", "Ramsey", "41214", "Dominican Republic" ],
        -	[ "98", "Josephine", "Gallagher", "04960", "French Southern Territories" ],
        -	[ "99", "Amela", "Morales", "M9I 1X5", "Sudan" ],
        -	[ "100", "Rina", "Yates", "G3T 7M9", "Dominica" ],
        -	[ "101", "Orson", "Norris", "21660", "Sierra Leone" ],
        -	[ "102", "Graiden", "Silva", "98191", "Saint Lucia" ],
        -	[ "103", "Amaya", "Hood", "45779", "India" ],
        -	[ "104", "Fatima", "Fitzpatrick", "I4R 9Q8", "Viet Nam" ],
        -	[ "105", "Judith", "Stokes", "97596", "Sudan" ],
        -	[ "106", "Jared", "Vaughn", "75521", "Benin" ],
        -	[ "107", "Mira", "Morgan", "35169", "Martinique" ],
        -	[ "108", "Walter", "Perkins", "28618", "San Marino" ],
        -	[ "109", "Megan", "Maxwell", "K6X 3J4", "Oman" ],
        -	[ "110", "Christine", "Christensen", "M7S 8G8", "Netherlands Antilles" ],
        -	[ "111", "Tanner", "Guerra", "S3K 6Y5", "Finland" ],
        -	[ "112", "Meghan", "Rowland", "K7U 3A1", "Rwanda" ],
        -	[ "113", "Patrick", "Mitchell", "V3F 5C4", "Oman" ],
        -	[ "114", "Jackson", "Sanders", "83229", "Greenland" ],
        -	[ "115", "Omar", "Savage", "14082", "Korea" ],
        -	[ "116", "Ulla", "Larsen", "Q2P 4L8", "French Southern Territories" ],
        -	[ "117", "Hop", "Gates", "D9G 9J4", "Poland" ],
        -	[ "118", "Astra", "Mendoza", "R3D 2H9", "Saint Vincent and The Grenadines" ],
        -	[ "119", "Denise", "Cardenas", "73138", "Sao Tome and Principe" ],
        -	[ "120", "Melodie", "Roberts", "L1G 4H2", "India" ],
        -	[ "121", "Cedric", "Joseph", "M4V 8O9", "Korea, Republic of" ],
        -	[ "122", "Linda", "Horn", "24465", "Bosnia and Herzegovina" ],
        -	[ "123", "Mary", "Lyons", "22324", "Norfolk Island" ],
        -	[ "124", "Ciara", "Mcknight", "30784", "Anguilla" ],
        -	[ "125", "Vaughan", "Santiago", "65037", "Guyana" ],
        -	[ "126", "Lamar", "Shepherd", "58040", "France" ],
        -	[ "127", "Xavier", "Webster", "68321", "Afghanistan" ],
        -	[ "128", "Ainsley", "Banks", "46902", "Pakistan" ],
        -	[ "129", "Alika", "Love", "L5O 4B3", "Iran, Islamic Republic of" ],
        -	[ "130", "Maite", "Dickson", "37405", "Saint Kitts and Nevis" ],
        -	[ "131", "Kimberley", "Morrow", "F7C 7J0", "Lebanon" ],
        -	[ "132", "Eugenia", "Stafford", "36282", "Nicaragua" ],
        -	[ "133", "Mira", "Gill", "K1T 8U1", "Uruguay" ],
        -	[ "134", "Herman", "Francis", "C2G 8G9", "Northern Mariana Islands" ],
        -	[ "135", "Veronica", "Peters", "74146", "Cook Islands" ],
        -	[ "136", "Axel", "Cochran", "32240", "Central African Republic" ],
        -	[ "137", "Edan", "Howe", "51862", "Mali" ],
        -	[ "138", "Ignacia", "Bruce", "Q8T 5Q1", "Sao Tome and Principe" ],
        -	[ "139", "Jana", "Mcguire", "89412", "Czech Republic" ],
        -	[ "140", "Alice", "Underwood", "74535", "Slovakia" ],
        -	[ "141", "Tobias", "Kent", "33601", "South Georgia and The South Sandwich Islands" ],
        -	[ "142", "Nasim", "Coleman", "19377", "United States Minor Outlying Islands" ],
        -	[ "143", "Geoffrey", "Byers", "85753", "Netherlands Antilles" ],
        -	[ "144", "Odette", "Sawyer", "55418", "Tunisia" ],
        -	[ "145", "Chaney", "Flowers", "F4W 7O7", "Maldives" ],
        -	[ "146", "Shelly", "Glover", "M5Y 4A6", "Taiwan, Province of China" ],
        -	[ "147", "Uriel", "Thornton", "Z6Q 5B7", "Myanmar" ],
        -	[ "148", "Clio", "Nicholson", "Y8S 7P2", "Martinique" ],
        -	[ "149", "Jana", "Foley", "B1O 9J5", "United Arab Emirates" ],
        -	[ "150", "Fulton", "Rasmussen", "39194", "Solomon Islands" ],
        -	[ "151", "Lisandra", "Boyd", "J2Z 2V7", "French Guiana" ],
        -	[ "152", "Brennan", "Lopez", "Q4M 7Y4", "Burkina Faso" ],
        -	[ "153", "Martha", "Washington", "M7S 4U6", "Iran, Islamic Republic of" ],
        -	[ "154", "Dara", "Ramos", "07799", "Portugal" ],
        -	[ "155", "Virginia", "Harris", "01246", "Bermuda" ],
        -	[ "156", "Maryam", "Patrick", "Y3J 4Y0", "Rwanda" ],
        -	[ "157", "Shana", "Mullen", "61169", "Togo" ],
        -	[ "158", "Rowan", "Hahn", "K6D 5T4", "Guinea-bissau" ],
        -	[ "159", "Hermione", "Shepherd", "M4F 7T6", "Ireland" ],
        -	[ "160", "Jada", "Bright", "P1Z 7E6", "French Southern Territories" ],
        -	[ "161", "Scarlet", "Bray", "57161", "Austria" ],
        -	[ "162", "Haviva", "Conner", "M4T 8O4", "Bermuda" ],
        -	[ "163", "Myra", "Briggs", "Q4B 6L7", "Kenya" ],
        -	[ "164", "Hall", "Floyd", "40411", "Bangladesh" ],
        -	[ "165", "Kyle", "Marquez", "J4T 7C6", "Djibouti" ],
        -	[ "166", "Claudia", "Long", "R7B 1T6", "Macedonia" ],
        -	[ "167", "Hasad", "Clemons", "94009", "Bosnia and Herzegovina" ],
        -	[ "168", "Kameko", "Reeves", "G4V 6D5", "Singapore" ],
        -	[ "169", "Angelica", "Bailey", "Z3Y 7I0", "Micronesia" ],
        -	[ "170", "Shelley", "Jennings", "O3A 9H0", "Christmas Island" ],
        -	[ "171", "Rafael", "Randolph", "Y4L 8B5", "Germany" ],
        -	[ "172", "Winter", "Kinney", "A3K 9A7", "Saint Lucia" ],
        -	[ "173", "Brian", "Larsen", "53752", "Comoros" ],
        -	[ "174", "Melvin", "Cooper", "72416", "Czech Republic" ],
        -	[ "175", "Gil", "Valencia", "95798", "Uganda" ],
        -	[ "176", "Uma", "Cummings", "84649", "Jordan" ],
        -	[ "177", "Micah", "Shannon", "H9L 8R6", "Ghana" ],
        -	[ "178", "Ahmed", "Weiss", "05291", "American Samoa" ],
        -	[ "179", "Hop", "Foster", "W9C 7J7", "Panama" ],
        -	[ "180", "Todd", "Barnett", "T9R 7J4", "Seychelles" ],
        -	[ "181", "Byron", "Meyers", "J4G 9P2", "Congo" ],
        -	[ "182", "Hadassah", "Barnett", "U1A 8V3", "Paraguay" ],
        -	[ "183", "Hermione", "Luna", "L4G 2E5", "New Zealand" ],
        -	[ "184", "Marsden", "Alvarado", "U1V 1Y4", "Aruba" ],
        -	[ "185", "Britanni", "Gregory", "C8O 2T4", "Kazakhstan" ],
        -	[ "186", "Brenda", "Oneil", "R9Q 9B7", "Gibraltar" ],
        -	[ "187", "Reuben", "Hopkins", "C2D 9D0", "Bhutan" ],
        -	[ "188", "Sonia", "Sandoval", "Y2G 5I0", "Guatemala" ],
        -	[ "189", "Yasir", "Holcomb", "A1H 6Y3", "Angola" ],
        -	[ "190", "Aristotle", "Rosa", "51870", "Indonesia" ],
        -	[ "191", "Uriah", "Blair", "X8K 1B9", "Suriname" ],
        -	[ "192", "Vaughan", "Sharp", "L2F 5N8", "Faroe Islands" ],
        -	[ "193", "Cooper", "Beard", "80399", "United States Minor Outlying Islands" ],
        -	[ "194", "Riley", "Greene", "44728", "Russian Federation" ],
        -	[ "195", "Rashad", "Flowers", "L6N 8U7", "Mongolia" ],
        -	[ "196", "Yvonne", "Wilson", "18599", "Svalbard and Jan Mayen" ],
        -	[ "197", "Martena", "Ayers", "A8Z 5F7", "Oman" ],
        -	[ "198", "Eagan", "Cline", "T9P 4L4", "Solomon Islands" ],
        -	[ "199", "Dawn", "Carrillo", "T6O 6E5", "Malawi" ],
        -	[ "200", "Ali", "Singleton", "G6F 3B4", "Italy" ],
        -	[ "201", "Christopher", "Beach", "01655", "Palau" ],
        -	[ "202", "Emma", "Cummings", "W1B 4R6", "Dominica" ],
        -	[ "203", "Ishmael", "Gray", "76928", "Egypt" ],
        -	[ "204", "Megan", "Hines", "F7X 2X5", "New Zealand" ],
        -	[ "205", "Emmanuel", "Steele", "09729", "Netherlands" ],
        -	[ "206", "Alea", "Burris", "08485", "Guatemala" ],
        -	[ "207", "Martina", "Todd", "46863", "Christmas Island" ],
        -	[ "208", "Len", "Valentine", "S6Z 5S8", "Slovenia" ],
        -	[ "209", "Jorden", "Salazar", "U4D 8H6", "Austria" ],
        -	[ "210", "Yvette", "Bradford", "17275", "Heard Island and Mcdonald Islands" ],
        -	[ "211", "Elvis", "Mcmahon", "27586", "Marshall Islands" ],
        -	[ "212", "Gray", "Bonner", "N4V 3U9", "Moldova" ],
        -	[ "213", "Yoshi", "Singleton", "86603", "United Kingdom" ],
        -	[ "214", "Amena", "Burks", "93820", "Reunion" ],
        -	[ "215", "Ocean", "Maldonado", "72026", "Ireland" ],
        -	[ "216", "Allen", "Foley", "75363", "Kiribati" ],
        -	[ "217", "Duncan", "Jimenez", "H3H 3G6", "Oman" ],
        -	[ "218", "Ira", "Maxwell", "53136", "French Polynesia" ],
        -	[ "219", "Astra", "Moon", "D7W 8G2", "Dominican Republic" ],
        -	[ "220", "Orson", "Myers", "06049", "Mali" ],
        -	[ "221", "Brandon", "Estes", "D2B 7P2", "Kenya" ],
        -	[ "222", "Halee", "Luna", "54733", "Moldova" ],
        -	[ "223", "Jillian", "Gonzalez", "E8W 3L9", "Ecuador" ],
        -	[ "224", "Julie", "Acosta", "X7M 1T2", "Equatorial Guinea" ],
        -	[ "225", "Quemby", "Foster", "48596", "Eritrea" ],
        -	[ "226", "Erich", "Chavez", "W4P 7G8", "Mayotte" ],
        -	[ "227", "Roary", "Mcknight", "K9K 2K4", "Chile" ],
        -	[ "228", "Mufutau", "Henderson", "81377", "Mayotte" ],
        -	[ "229", "Herman", "Ferguson", "69405", "Japan" ],
        -	[ "230", "Abdul", "Franks", "L1V 8X2", "Portugal" ],
        -	[ "231", "Dominic", "Logan", "98770", "Saint Lucia" ],
        -	[ "232", "Isadora", "Solis", "Y3A 6H5", "Portugal" ],
        -	[ "233", "Lester", "Davis", "30339", "British Indian Ocean Territory" ],
        -	[ "234", "Joel", "Rojas", "N8E 5T9", "Bahrain" ],
        -	[ "235", "Quinlan", "Carroll", "55785", "Australia" ],
        -	[ "236", "Guinevere", "Pickett", "A7Y 3V3", "Netherlands Antilles" ],
        -	[ "237", "Nita", "Hopkins", "88370", "Albania" ],
        -	[ "238", "Hayley", "Buckley", "F1V 7P5", "Togo" ],
        -	[ "239", "Colorado", "Reyes", "18798", "Congo" ],
        -	[ "240", "Tashya", "Bartlett", "48537", "Sierra Leone" ],
        -	[ "241", "Isabella", "Keith", "48878", "Kiribati" ],
        -	[ "242", "Jessica", "Noble", "D6C 9T9", "Svalbard and Jan Mayen" ],
        -	[ "243", "Cairo", "Edwards", "40598", "Nepal" ],
        -	[ "244", "Camille", "Bradley", "I4U 8F6", "Fiji" ],
        -	[ "245", "Quin", "Mcgee", "O5D 2P0", "Poland" ],
        -	[ "246", "Rina", "Guzman", "44940", "Bahrain" ],
        -	[ "247", "Glenna", "Kirkland", "Z1L 4W2", "San Marino" ],
        -	[ "248", "Tarik", "Todd", "77228", "Turks and Caicos Islands" ],
        -	[ "249", "Yardley", "Burris", "M6U 9D7", "New Caledonia" ],
        -	[ "250", "Hashim", "Casey", "17722", "Lesotho" ],
        -	[ "251", "Maggie", "Raymond", "62540", "Uganda" ],
        -	[ "252", "Christian", "Mcdonald", "R8K 2M1", "United Arab Emirates" ],
        -	[ "253", "Colt", "Cobb", "75393", "Moldova" ],
        -	[ "254", "Aline", "Graves", "I1C 9I6", "Holy See (Vatican City State)" ],
        -	[ "255", "Farrah", "Cannon", "H5W 2Y0", "Bhutan" ],
        -	[ "256", "Wynne", "Ayers", "B6X 6Y8", "Western Sahara" ],
        -	[ "257", "Teegan", "Avery", "33643", "San Marino" ],
        -	[ "258", "Shana", "Sloan", "K9P 9V7", "Gabon" ],
        -	[ "259", "Britanney", "Cook", "Y5D 6K7", "Romania" ],
        -	[ "260", "Kuame", "Schroeder", "12859", "Syrian Arab Republic" ],
        -	[ "261", "Valentine", "Joseph", "P2S 6T6", "Mayotte" ],
        -	[ "262", "Joelle", "Keller", "U6F 3T7", "Fiji" ],
        -	[ "263", "Elaine", "Hickman", "28056", "Tuvalu" ],
        -	[ "264", "Ivor", "Malone", "H2Z 5X5", "Virgin Islands, British" ],
        -	[ "265", "Maris", "Jefferson", "12474", "Czech Republic" ],
        -	[ "266", "Josephine", "Zimmerman", "Z5J 2I4", "Angola" ],
        -	[ "267", "Baker", "Wooten", "X4K 2L8", "Austria" ],
        -	[ "268", "Alyssa", "Mitchell", "97712", "Antarctica" ],
        -	[ "269", "Carlos", "Pearson", "85838", "Gambia" ],
        -	[ "270", "Luke", "Richardson", "73867", "Christmas Island" ],
        -	[ "271", "Davis", "Gardner", "U2E 4D9", "Chile" ],
        -	[ "272", "Thomas", "Conner", "92487", "Mozambique" ],
        -	[ "273", "Kieran", "Baird", "X9G 6G1", "Iceland" ],
        -	[ "274", "Cheyenne", "Morris", "F5V 4S2", "Greece" ],
        -	[ "275", "Hillary", "Reeves", "89804", "Slovakia" ],
        -	[ "276", "Ryder", "Long", "32725", "New Caledonia" ],
        -	[ "277", "Ariel", "Colon", "50675", "Estonia" ],
        -	[ "278", "Vanna", "Hess", "79057", "Saudi Arabia" ],
        -	[ "279", "Hayley", "Cherry", "B5E 9X4", "United States Minor Outlying Islands" ],
        -	[ "280", "Knox", "Blair", "75626", "Central African Republic" ],
        -	[ "281", "Astra", "Mcdaniel", "24493", "Bermuda" ],
        -	[ "282", "Teegan", "Ford", "A8U 1K9", "Iran, Islamic Republic of" ],
        -	[ "283", "Harrison", "Jackson", "43519", "Marshall Islands" ],
        -	[ "284", "Melyssa", "Lawson", "O7E 8E6", "Belize" ],
        -	[ "285", "Shaine", "Francis", "Q5K 5I4", "India" ],
        -	[ "286", "August", "Reed", "S9R 1O8", "Ghana" ],
        -	[ "287", "Aphrodite", "Zimmerman", "28336", "Lesotho" ],
        -	[ "288", "Declan", "Walters", "08662", "Rwanda" ],
        -	[ "289", "Brody", "Pate", "G2G 9D9", "Serbia and Montenegro" ],
        -	[ "290", "Bradley", "Odom", "L2R 6Z9", "Jordan" ],
        -	[ "291", "Phillip", "Cleveland", "E4D 1B7", "Paraguay" ],
        -	[ "292", "Silas", "Wiggins", "F9F 5X3", "Bahrain" ],
        -	[ "293", "Keely", "Donaldson", "B5H 7F2", "Vanuatu" ],
        -	[ "294", "Hammett", "Lancaster", "H2P 4E6", "Svalbard and Jan Mayen" ],
        -	[ "295", "Kiara", "Clarke", "50885", "Thailand" ],
        -	[ "296", "Ayanna", "Wiley", "20773", "Morocco" ],
        -	[ "297", "Tashya", "Stanley", "F5J 5R9", "New Caledonia" ],
        -	[ "298", "Margaret", "Barker", "J5A 9N8", "Marshall Islands" ],
        -	[ "299", "Xandra", "English", "92299", "Korea, Republic of" ],
        -	[ "300", "Jane", "Brock", "86140", "Yemen" ],
        -	[ "301", "Lunea", "Garrett", "96730", "New Caledonia" ],
        -	[ "302", "Slade", "Everett", "16105", "Malawi" ],
        -	[ "303", "Scott", "Booker", "G8V 2R4", "Macedonia" ],
        -	[ "304", "Candice", "Decker", "E5R 2D4", "China" ],
        -	[ "305", "Armando", "Bridges", "87959", "Falkland Islands (Malvinas)" ],
        -	[ "306", "Clayton", "Whitley", "Q6O 4M7", "British Indian Ocean Territory" ],
        -	[ "307", "Driscoll", "Duncan", "M2J 9V5", "Argentina" ],
        -	[ "308", "Devin", "Stafford", "L8F 2V7", "Svalbard and Jan Mayen" ],
        -	[ "309", "Bell", "York", "E5B 7X5", "Lebanon" ],
        -	[ "310", "Haley", "Becker", "19759", "Bhutan" ],
        -	[ "311", "Chava", "Santiago", "04396", "Israel" ],
        -	[ "312", "David", "Mccall", "62087", "Norfolk Island" ],
        -	[ "313", "Clinton", "Jacobson", "06168", "Guam" ],
        -	[ "314", "Melvin", "Kaufman", "C4E 9N6", "Gambia" ],
        -	[ "315", "Dai", "Shepherd", "37490", "Saudi Arabia" ],
        -	[ "316", "Zahir", "Chase", "44340", "Turkey" ],
        -	[ "317", "Leilani", "Parrish", "62576", "Cocos (Keeling) Islands" ],
        -	[ "318", "Oleg", "Wilkins", "Z7S 8Z4", "Latvia" ],
        -	[ "319", "Pearl", "Pena", "82526", "Saudi Arabia" ],
        -	[ "320", "Kelly", "Moody", "W7U 5Y3", "Burundi" ],
        -	[ "321", "Marcia", "Kennedy", "85952", "Panama" ],
        -	[ "322", "Cailin", "Burnett", "M2Z 3L5", "Guyana" ],
        -	[ "323", "Ciara", "Small", "X6C 6M6", "Tanzania, United Republic of" ],
        -	[ "324", "Lillian", "Massey", "Z8A 5U5", "Algeria" ],
        -	[ "325", "Garrett", "Elliott", "R5P 6T0", "Canada" ],
        -	[ "326", "Inga", "Daniels", "40156", "Cocos (Keeling) Islands" ],
        -	[ "327", "Barry", "Pena", "03593", "Tonga" ],
        -	[ "328", "Penelope", "Mcintyre", "29293", "Burkina Faso" ],
        -	[ "329", "Dante", "Kirk", "74038", "Lesotho" ],
        -	[ "330", "Owen", "Cole", "17968", "Rwanda" ],
        -	[ "331", "Brittany", "Edwards", "24507", "Paraguay" ],
        -	[ "332", "Zeph", "Bentley", "12000", "Guam" ],
        -	[ "333", "Ruth", "Palmer", "E8V 9A5", "Ghana" ],
        -	[ "334", "Driscoll", "Ellis", "X1X 2N5", "Angola" ],
        -	[ "335", "Mohammad", "Guerra", "Y9N 3Y5", "Mongolia" ],
        -	[ "336", "Clio", "Baldwin", "67557", "Morocco" ],
        -	[ "337", "Virginia", "Duncan", "J8D 4T2", "Haiti" ],
        -	[ "338", "Dieter", "Sanchez", "H7E 2H4", "Romania" ],
        -	[ "339", "Quinn", "Hurst", "K4E 2X6", "Reunion" ],
        -	[ "340", "Coby", "Kelly", "S1H 8N0", "Equatorial Guinea" ],
        -	[ "341", "Raja", "Solis", "S5G 9T5", "Grenada" ],
        -	[ "342", "Jordan", "Riddle", "J7M 5X3", "Svalbard and Jan Mayen" ],
        -	[ "343", "Dora", "Knox", "25054", "Libyan Arab Jamahiriya" ],
        -	[ "344", "Brendan", "Reilly", "U9U 3F7", "Armenia" ],
        -	[ "345", "Melyssa", "Reyes", "11285", "Viet Nam" ],
        -	[ "346", "Knox", "Rivera", "N8Z 7J0", "Nepal" ],
        -	[ "347", "Quynn", "Irwin", "26524", "Chile" ],
        -	[ "348", "Colin", "Coleman", "22833", "United Arab Emirates" ],
        -	[ "349", "Sybil", "Delgado", "99947", "Belize" ],
        -	[ "350", "Macaulay", "Salinas", "48521", "Heard Island and Mcdonald Islands" ],
        -	[ "351", "Garrison", "Hogan", "68950", "India" ],
        -	[ "352", "Ronan", "Guerra", "55445", "Angola" ],
        -	[ "353", "Regina", "Andrews", "H3E 3T0", "Central African Republic" ],
        -	[ "354", "Colorado", "Joyce", "V6X 5K8", "Anguilla" ],
        -	[ "355", "Basia", "Banks", "85049", "Grenada" ],
        -	[ "356", "Adena", "Berg", "04135", "New Caledonia" ],
        -	[ "357", "Wade", "Richardson", "C8M 9J3", "Dominican Republic" ],
        -	[ "358", "Cody", "Montoya", "22018", "Solomon Islands" ],
        -	[ "359", "Faith", "Barnett", "61475", "China" ],
        -	[ "360", "Cody", "Witt", "C8I 2Q8", "Congo" ],
        -	[ "361", "Brenden", "Carlson", "74007", "Marshall Islands" ],
        -	[ "362", "Gil", "Brooks", "U4S 5N1", "Saint Vincent and The Grenadines" ],
        -	[ "363", "Kirestin", "Watts", "H8I 1D5", "Myanmar" ],
        -	[ "364", "Amelia", "Gilliam", "11461", "Chile" ],
        -	[ "365", "Noelani", "Rhodes", "83320", "Cuba" ],
        -	[ "366", "Len", "Trevino", "W9F 2U5", "Armenia" ],
        -	[ "367", "Galvin", "Middleton", "86707", "Thailand" ],
        -	[ "368", "Germaine", "Bridges", "90283", "Japan" ],
        -	[ "369", "Rose", "Hines", "W7L 7Q6", "Congo" ],
        -	[ "370", "Hop", "Mueller", "I3E 2X8", "Angola" ],
        -	[ "371", "Iliana", "Williamson", "56758", "Lebanon" ],
        -	[ "372", "Raja", "Price", "49603", "Armenia" ],
        -	[ "373", "Jeanette", "Hatfield", "E3K 5N5", "India" ],
        -	[ "374", "Brittany", "Christensen", "04750", "Uruguay" ],
        -	[ "375", "Inga", "Prince", "D4X 6J5", "Switzerland" ],
        -	[ "376", "Cherokee", "Ballard", "U1O 1M0", "Rwanda" ],
        -	[ "377", "Deirdre", "Watson", "46983", "Sri Lanka" ],
        -	[ "378", "Amanda", "Parrish", "99838", "Hong Kong" ],
        -	[ "379", "Leo", "Shannon", "L3N 3J0", "Brunei Darussalam" ],
        -	[ "380", "Kimberly", "Clemons", "88734", "South Africa" ],
        -	[ "381", "Seth", "Langley", "D6A 1Q9", "Guyana" ],
        -	[ "382", "Carol", "Blankenship", "X5N 2A7", "Angola" ],
        -	[ "383", "Dora", "Flores", "F8F 1O5", "Poland" ],
        -	[ "384", "Chava", "Dickson", "P8B 6W6", "Comoros" ],
        -	[ "385", "Trevor", "Mcdowell", "31382", "Solomon Islands" ],
        -	[ "386", "Alec", "Valentine", "P2R 4K7", "Greenland" ],
        -	[ "387", "Philip", "Jenkins", "Q7X 5U5", "Aruba" ],
        -	[ "388", "Kim", "Bowen", "69873", "Saint Kitts and Nevis" ],
        -	[ "389", "Allegra", "Oconnor", "X3Y 1X3", "Holy See (Vatican City State)" ],
        -	[ "390", "Daria", "Briggs", "A7Z 7P4", "Serbia and Montenegro" ],
        -	[ "391", "Amelia", "Wiley", "D4S 1G5", "Montserrat" ],
        -	[ "392", "Erica", "Aguirre", "H5L 2O3", "Andorra" ],
        -	[ "393", "Kibo", "Sawyer", "30638", "Guyana" ],
        -	[ "394", "Jackson", "Meyers", "P4N 9D6", "Bangladesh" ],
        -	[ "395", "Kirk", "Baxter", "F3M 7S6", "Estonia" ],
        -	[ "396", "Sybil", "Christian", "B3Q 2X0", "South Georgia and The South Sandwich Islands" ],
        -	[ "397", "Ina", "Mercer", "N4S 1K8", "Korea" ],
        -	[ "398", "Kiara", "Whitehead", "86023", "Nicaragua" ],
        -	[ "399", "Vielka", "Hays", "29845", "Malta" ],
        -	[ "400", "Stacey", "Carlson", "53218", "Cook Islands" ],
        -	[ "401", "Selma", "Lloyd", "78256", "Turkey" ],
        -	[ "402", "Rhoda", "Mcintosh", "G8X 1C8", "Guatemala" ],
        -	[ "403", "Teagan", "Ochoa", "99752", "Barbados" ],
        -	[ "404", "Rebecca", "Carver", "82661", "Saint Kitts and Nevis" ],
        -	[ "405", "Yael", "Woodward", "66095", "Niger" ],
        -	[ "406", "Calvin", "Huffman", "82172", "Somalia" ],
        -	[ "407", "Sopoline", "Walters", "K5L 3I7", "Spain" ],
        -	[ "408", "Hollee", "Powell", "05572", "Samoa" ],
        -	[ "409", "Fiona", "Frank", "74456", "Timor-leste" ],
        -	[ "410", "Alana", "Hubbard", "76011", "Lithuania" ],
        -	[ "411", "Lillian", "Garcia", "J5Z 2O5", "Sierra Leone" ],
        -	[ "412", "Tad", "Mcleod", "B6A 8Z4", "Australia" ],
        -	[ "413", "Hadassah", "Hall", "47417", "China" ],
        -	[ "414", "Regan", "Summers", "X4L 4I6", "Honduras" ],
        -	[ "415", "Herrod", "Erickson", "R8G 3V0", "Israel" ],
        -	[ "416", "Autumn", "Rojas", "31205", "Cocos (Keeling) Islands" ],
        -	[ "417", "Castor", "Mooney", "92737", "Grenada" ],
        -	[ "418", "Wesley", "Holman", "57125", "Greenland" ],
        -	[ "419", "Kitra", "Wooten", "Q6X 4Y0", "Mongolia" ],
        -	[ "420", "Buckminster", "Rice", "U8B 7B8", "Tokelau" ],
        -	[ "421", "Xavier", "Hardin", "18280", "Iran, Islamic Republic of" ],
        -	[ "422", "Sopoline", "Fleming", "78437", "Singapore" ],
        -	[ "423", "Sydney", "Salinas", "23801", "Cook Islands" ],
        -	[ "424", "Bethany", "Rosales", "89650", "United States" ],
        -	[ "425", "Deirdre", "Hensley", "F3X 1B7", "Micronesia" ],
        -	[ "426", "Bernard", "Vargas", "S4D 9T0", "Uzbekistan" ],
        -	[ "427", "Merrill", "Compton", "17713", "Suriname" ],
        -	[ "428", "Carly", "Baird", "D3H 5G3", "United States Minor Outlying Islands" ],
        -	[ "429", "Grace", "Phelps", "64695", "Nauru" ],
        -	[ "430", "Kareem", "Stone", "65572", "Netherlands" ],
        -	[ "431", "Susan", "Newton", "04627", "Anguilla" ],
        -	[ "432", "Laura", "Miranda", "E1G 2R7", "Finland" ],
        -	[ "433", "Madaline", "Pugh", "J9A 9M5", "Senegal" ],
        -	[ "434", "Sophia", "Mendez", "33789", "Timor-leste" ],
        -	[ "435", "Roary", "Greene", "61774", "Canada" ],
        -	[ "436", "Amos", "Gilliam", "94933", "Sri Lanka" ],
        -	[ "437", "Ivory", "Joyner", "15379", "San Marino" ],
        -	[ "438", "Jorden", "Robbins", "43400", "Russian Federation" ],
        -	[ "439", "Merritt", "Holcomb", "R1I 3C7", "Brazil" ],
        -	[ "440", "Iliana", "Johnston", "U9W 8N2", "Trinidad and Tobago" ],
        -	[ "441", "Ivana", "Patterson", "G5O 6A5", "Georgia" ],
        -	[ "442", "Sydney", "Mccullough", "W9M 2H5", "American Samoa" ],
        -	[ "443", "Alvin", "Fulton", "X8A 8R5", "Antigua and Barbuda" ],
        -	[ "444", "Alfreda", "Lopez", "42499", "Montserrat" ],
        -	[ "445", "Ethan", "Bird", "W9A 8M1", "British Indian Ocean Territory" ],
        -	[ "446", "Zeus", "Logan", "01682", "San Marino" ],
        -	[ "447", "Nehru", "Andrews", "W8J 3C8", "Dominican Republic" ],
        -	[ "448", "Donna", "Booth", "64754", "Nepal" ],
        -	[ "449", "Cruz", "Bruce", "17429", "Burundi" ],
        -	[ "450", "Ronan", "Saunders", "69957", "South Africa" ],
        -	[ "451", "Jordan", "Barnes", "D8K 9L8", "Dominica" ],
        -	[ "452", "Carly", "Love", "D8Z 3P4", "Mauritania" ],
        -	[ "453", "Mari", "George", "60260", "Japan" ],
        -	[ "454", "Karly", "Hodges", "15790", "South Georgia and The South Sandwich Islands" ],
        -	[ "455", "Rana", "Logan", "M1R 6Y6", "Bosnia and Herzegovina" ],
        -	[ "456", "Theodore", "Sims", "C7A 8T2", "Barbados" ],
        -	[ "457", "Quin", "Thompson", "26884", "Bouvet Island" ],
        -	[ "458", "Kimberley", "Sloan", "S5T 8E3", "Costa Rica" ],
        -	[ "459", "Upton", "Valenzuela", "Z6J 6Q1", "Macao" ],
        -	[ "460", "Clinton", "Williams", "Z3O 7C4", "Germany" ],
        -	[ "461", "Samson", "Mathis", "G1T 1V9", "Senegal" ],
        -	[ "462", "Michelle", "Frost", "87113", "Serbia and Montenegro" ],
        -	[ "463", "Tyrone", "Coffey", "80705", "Albania" ],
        -	[ "464", "Alea", "Delaney", "E4S 4K4", "Guyana" ],
        -	[ "465", "Dominique", "Schwartz", "81368", "Falkland Islands (Malvinas)" ],
        -	[ "466", "Benedict", "Norton", "D1C 9C8", "Cyprus" ],
        -	[ "467", "Vaughan", "Stein", "R7K 1L8", "Egypt" ],
        -	[ "468", "Charles", "Foley", "20434", "Anguilla" ],
        -	[ "469", "Arden", "Ramos", "54065", "Gibraltar" ],
        -	[ "470", "Dillon", "Patel", "L6H 1H6", "Liberia" ],
        -	[ "471", "Gretchen", "Davenport", "57188", "Equatorial Guinea" ],
        -	[ "472", "Ivy", "Randall", "52617", "Costa Rica" ],
        -	[ "473", "Brett", "Baird", "45791", "Hungary" ],
        -	[ "474", "Wyoming", "Sparks", "11266", "Luxembourg" ],
        -	[ "475", "Rashad", "Roy", "47012", "Guam" ],
        -	[ "476", "Sopoline", "Le", "M1G 2P8", "United Arab Emirates" ],
        -	[ "477", "Ursa", "Haynes", "53774", "British Indian Ocean Territory" ],
        -	[ "478", "Maia", "Vincent", "26773", "New Caledonia" ],
        -	[ "479", "Salvador", "Pace", "S9E 2C4", "Egypt" ],
        -	[ "480", "Bethany", "Wilcox", "F2H 7N0", "Uzbekistan" ],
        -	[ "481", "Sara", "Brooks", "08176", "Holy See (Vatican City State)" ],
        -	[ "482", "Lillith", "Sampson", "75576", "British Indian Ocean Territory" ],
        -	[ "483", "Brynne", "Browning", "N4K 7P6", "Peru" ],
        -	[ "484", "Beck", "Tran", "06815", "Cambodia" ],
        -	[ "485", "Peter", "Hurley", "05770", "Rwanda" ],
        -	[ "486", "Buffy", "Sharpe", "H8F 8G6", "Georgia" ],
        -	[ "487", "Harrison", "Cross", "Y1A 1R8", "United Kingdom" ],
        -	[ "488", "Ursa", "Wolf", "J8C 9Q8", "French Polynesia" ],
        -	[ "489", "Nayda", "Vasquez", "05523", "Taiwan, Province of China" ],
        -	[ "490", "Gretchen", "Walters", "28628", "Seychelles" ],
        -	[ "491", "Adrian", "Hickman", "17956", "El Salvador" ],
        -	[ "492", "Laura", "Moon", "32103", "Myanmar" ],
        -	[ "493", "Kellie", "Barnett", "L5Z 2U8", "Saint Helena" ],
        -	[ "494", "Illana", "Stanton", "Z5D 2G0", "Australia" ],
        -	[ "495", "Jescie", "Santiago", "D9L 4B5", "Cambodia" ],
        -	[ "496", "Laura", "Hopkins", "X6V 9S5", "Netherlands Antilles" ],
        -	[ "497", "Vielka", "Harding", "U6A 9T2", "Cambodia" ],
        -	[ "498", "Walter", "Gentry", "L3X 9Q9", "Slovenia" ],
        -	[ "499", "Sara", "Atkinson", "67146", "Guinea" ],
        -	[ "500", "Yolanda", "Chambers", "Q8D 3W0", "Zimbabwe" ],
        -	[ "501", "Josiah", "Villarreal", "I1V 6Y7", "Burkina Faso" ],
        -	[ "502", "Hayfa", "Bowman", "77148", "Saudi Arabia" ],
        -	[ "503", "Colette", "Conley", "41232", "Estonia" ],
        -	[ "504", "Lana", "Doyle", "32962", "Cuba" ],
        -	[ "505", "Keegan", "Goodwin", "M2P 1X3", "Cocos (Keeling) Islands" ],
        -	[ "506", "Nina", "Cross", "49580", "Germany" ],
        -	[ "507", "Xenos", "Cervantes", "K6X 7W8", "Mauritius" ],
        -	[ "508", "Jared", "Hester", "30156", "Uzbekistan" ],
        -	[ "509", "Damon", "Curry", "U2J 2D8", "Pitcairn" ],
        -	[ "510", "Amery", "Savage", "O1S 2Z4", "Turkmenistan" ],
        -	[ "511", "Brian", "Wilkinson", "J6O 4T0", "Luxembourg" ],
        -	[ "512", "Ivory", "Mckinney", "L3E 8M2", "Lithuania" ],
        -	[ "513", "Eric", "Dalton", "Y1L 6F4", "Ethiopia" ],
        -	[ "514", "Brandon", "Callahan", "K6Q 9B4", "Haiti" ],
        -	[ "515", "Phillip", "Mclean", "18836", "Ethiopia" ],
        -	[ "516", "Carly", "Greer", "16811", "Mayotte" ],
        -	[ "517", "Stone", "Ware", "58795", "Moldova" ],
        -	[ "518", "Xena", "Hayden", "97158", "Chad" ],
        -	[ "519", "Catherine", "Leonard", "77868", "Azerbaijan" ],
        -	[ "520", "Bernard", "Horton", "04270", "Yemen" ],
        -	[ "521", "Olga", "Richmond", "89169", "Lebanon" ],
        -	[ "522", "Iris", "Cummings", "78836", "Falkland Islands (Malvinas)" ],
        -	[ "523", "Beau", "Mccall", "78638", "Monaco" ],
        -	[ "524", "Michael", "Humphrey", "Q1A 2W9", "Tokelau" ],
        -	[ "525", "Oren", "Stevens", "F4V 9G7", "Heard Island and Mcdonald Islands" ],
        -	[ "526", "Ima", "Shelton", "19295", "Mozambique" ],
        -	[ "527", "Merritt", "Morrison", "K6W 5R0", "Georgia" ],
        -	[ "528", "Vera", "Cherry", "54993", "Angola" ],
        -	[ "529", "Grant", "Turner", "B4V 2J0", "Saint Helena" ],
        -	[ "530", "Odette", "Snyder", "N9L 2V8", "Chad" ],
        -	[ "531", "Uma", "Stewart", "E9A 6X9", "Bhutan" ],
        -	[ "532", "Kylee", "Best", "11393", "Malaysia" ],
        -	[ "533", "Nicholas", "Mercado", "85179", "Switzerland" ],
        -	[ "534", "Nathaniel", "Stuart", "M1Q 6Z6", "Mongolia" ],
        -	[ "535", "Ruth", "Conrad", "T7G 9V6", "Guadeloupe" ],
        -	[ "536", "Deanna", "Dudley", "79721", "Kiribati" ],
        -	[ "537", "David", "Thornton", "C6R 2G3", "Netherlands Antilles" ],
        -	[ "538", "Jane", "Ashley", "48711", "Rwanda" ],
        -	[ "539", "Nero", "Curry", "20590", "Denmark" ],
        -	[ "540", "Kellie", "Poole", "46053", "Martinique" ],
        -	[ "541", "Freya", "Burch", "W5R 8Y5", "Northern Mariana Islands" ],
        -	[ "542", "Maxwell", "Mcbride", "D4W 4M3", "Paraguay" ],
        -	[ "543", "Dawn", "Sargent", "85956", "Gibraltar" ],
        -	[ "544", "Lilah", "Matthews", "J4D 8A9", "Montserrat" ],
        -	[ "545", "Salvador", "Burns", "28067", "Bhutan" ],
        -	[ "546", "Ezekiel", "Ayala", "67153", "Wallis and Futuna" ],
        -	[ "547", "Evan", "Barker", "83026", "Puerto Rico" ],
        -	[ "548", "Jemima", "Case", "U3S 7N6", "Georgia" ],
        -	[ "549", "Belle", "Mcconnell", "H4S 9F8", "Angola" ],
        -	[ "550", "Doris", "Mays", "57387", "Tonga" ],
        -	[ "551", "Carson", "Buchanan", "20457", "Guatemala" ],
        -	[ "552", "Calista", "Lamb", "26851", "Gibraltar" ],
        -	[ "553", "Remedios", "Haley", "A9K 5M1", "Tokelau" ],
        -	[ "554", "Odette", "Mccarty", "Y8B 3V4", "Marshall Islands" ],
        -	[ "555", "Libby", "Pugh", "93261", "Netherlands" ],
        -	[ "556", "Bo", "Maldonado", "C1H 1K7", "Oman" ],
        -	[ "557", "Cameron", "Beasley", "41821", "Northern Mariana Islands" ],
        -	[ "558", "Chadwick", "Crosby", "62855", "New Caledonia" ],
        -	[ "559", "Steven", "Barrett", "92102", "Pakistan" ],
        -	[ "560", "Jonas", "Valdez", "N3V 4R9", "Bulgaria" ],
        -	[ "561", "Harlan", "Larsen", "Z8F 6A0", "Cayman Islands" ],
        -	[ "562", "Iola", "Joyner", "D1J 4C3", "Italy" ],
        -	[ "563", "Abra", "Medina", "Q9O 5J2", "Cambodia" ],
        -	[ "564", "Solomon", "Davidson", "91317", "Turkmenistan" ],
        -	[ "565", "Alisa", "Kim", "33036", "Austria" ],
        -	[ "566", "Deacon", "Silva", "Z5L 6M0", "Djibouti" ],
        -	[ "567", "Bree", "Landry", "43135", "Czech Republic" ],
        -	[ "568", "Molly", "Leach", "71714", "Botswana" ],
        -	[ "569", "Idona", "Cain", "A2J 1R8", "South Georgia and The South Sandwich Islands" ],
        -	[ "570", "Aileen", "Salinas", "90344", "Uzbekistan" ],
        -	[ "571", "Dominique", "Cooper", "31803", "Sao Tome and Principe" ],
        -	[ "572", "Lunea", "Pollard", "S9R 7B0", "Sweden" ],
        -	[ "573", "Leo", "Combs", "W7E 8T4", "Ukraine" ],
        -	[ "574", "Illiana", "Donovan", "D8K 3R4", "Palau" ],
        -	[ "575", "Orlando", "Vaughan", "Q4I 3E3", "Bosnia and Herzegovina" ],
        -	[ "576", "Yuri", "Blake", "I9W 5U5", "Seychelles" ],
        -	[ "577", "Amanda", "Baldwin", "19752", "Turkmenistan" ],
        -	[ "578", "Hanna", "Emerson", "73316", "Antigua and Barbuda" ],
        -	[ "579", "Xyla", "Atkins", "11151", "Uganda" ],
        -	[ "580", "Nathaniel", "Patterson", "00391", "Portugal" ],
        -	[ "581", "Naida", "Cote", "17484", "Mauritius" ],
        -	[ "582", "Scarlett", "Little", "V8N 8A6", "Sao Tome and Principe" ],
        -	[ "583", "Odessa", "Kerr", "56456", "Sweden" ],
        -	[ "584", "Kamal", "Richardson", "F6S 4I1", "Algeria" ],
        -	[ "585", "Griffith", "Morton", "I5H 2Z0", "Vanuatu" ],
        -	[ "586", "Orli", "Santana", "48213", "Burundi" ],
        -	[ "587", "Courtney", "Cook", "R3O 3A9", "Cape Verde" ],
        -	[ "588", "Jolene", "Wallace", "F6Q 7W8", "Zambia" ],
        -	[ "589", "Bert", "Sharp", "X7T 7Z8", "Paraguay" ],
        -	[ "590", "Ila", "Carver", "E4M 7P4", "Paraguay" ],
        -	[ "591", "Merrill", "Wall", "49416", "Fiji" ],
        -	[ "592", "Hanae", "Espinoza", "Y6D 6K8", "Turkey" ],
        -	[ "593", "Stephanie", "Bond", "Z1Q 3P3", "Algeria" ],
        -	[ "594", "Lionel", "Leonard", "U8O 7G6", "Nauru" ],
        -	[ "595", "Faith", "Ramirez", "75181", "Slovakia" ],
        -	[ "596", "Fritz", "Glass", "62878", "El Salvador" ],
        -	[ "597", "Raya", "Gardner", "L3E 2C7", "India" ],
        -	[ "598", "Brynne", "Price", "W1S 6O9", "Lithuania" ],
        -	[ "599", "Karen", "Gray", "O4X 8F6", "Albania" ],
        -	[ "600", "Perry", "Goodwin", "44266", "Libyan Arab Jamahiriya" ],
        -	[ "601", "Dylan", "Glover", "76573", "Estonia" ],
        -	[ "602", "Melinda", "Holloway", "07861", "Grenada" ],
        -	[ "603", "Rahim", "Robinson", "D7M 1E8", "Madagascar" ],
        -	[ "604", "Ori", "Oconnor", "10386", "Antarctica" ],
        -	[ "605", "Candace", "Preston", "03610", "Denmark" ],
        -	[ "606", "Wing", "Howe", "E6U 3H2", "Burundi" ],
        -	[ "607", "Lucy", "Eaton", "26436", "Guinea" ],
        -	[ "608", "Ignatius", "Blevins", "93597", "Serbia and Montenegro" ],
        -	[ "609", "Nadine", "Franco", "80096", "Tonga" ],
        -	[ "610", "Shoshana", "Walters", "S4F 5O8", "Micronesia" ],
        -	[ "611", "Remedios", "Buckner", "29213", "Antigua and Barbuda" ],
        -	[ "612", "Adam", "Horne", "F8V 1V8", "Oman" ],
        -	[ "613", "Kieran", "Saunders", "I7A 7Y5", "Japan" ],
        -	[ "614", "Isabelle", "Fletcher", "K2K 3K5", "Norway" ],
        -	[ "615", "Ryder", "Ballard", "38518", "Tanzania, United Republic of" ],
        -	[ "616", "Nina", "Guerrero", "61142", "Saint Kitts and Nevis" ],
        -	[ "617", "Sheila", "Poole", "E2H 6I6", "Denmark" ],
        -	[ "618", "Melyssa", "Mcdaniel", "08247", "Netherlands Antilles" ],
        -	[ "619", "Leila", "Vang", "Q5Z 3S1", "United States Minor Outlying Islands" ],
        -	[ "620", "Grady", "Aguilar", "R1I 8I8", "Slovenia" ],
        -	[ "621", "Plato", "Terrell", "23916", "Kuwait" ],
        -	[ "622", "Rama", "Perkins", "56506", "Russian Federation" ],
        -	[ "623", "Boris", "Chaney", "66737", "Antigua and Barbuda" ],
        -	[ "624", "Edward", "Clarke", "30722", "Iraq" ],
        -	[ "625", "Skyler", "Wise", "53248", "Taiwan, Province of China" ],
        -	[ "626", "Uta", "Cox", "85242", "Malawi" ],
        -	[ "627", "Lesley", "Watkins", "26710", "Estonia" ],
        -	[ "628", "Gray", "Harrison", "C5L 9Y7", "Nepal" ],
        -	[ "629", "Joan", "Flores", "J5Q 2B9", "Tajikistan" ],
        -	[ "630", "Reece", "Lott", "85152", "Algeria" ],
        -	[ "631", "Jerome", "Faulkner", "V1K 3N2", "Kiribati" ],
        -	[ "632", "Jackson", "Hudson", "85932", "Botswana" ],
        -	[ "633", "Uma", "Booker", "79755", "Senegal" ],
        -	[ "634", "Katelyn", "Gillespie", "Q8P 4V9", "Eritrea" ],
        -	[ "635", "Clio", "Tillman", "67552", "Liberia" ],
        -	[ "636", "Anjolie", "Nixon", "36615", "Botswana" ],
        -	[ "637", "Nell", "Lee", "T9S 4R3", "French Southern Territories" ],
        -	[ "638", "Anthony", "Aguirre", "85443", "Morocco" ],
        -	[ "639", "Aaron", "Green", "90326", "Faroe Islands" ],
        -	[ "640", "Galvin", "Yang", "A4X 8H6", "Ukraine" ],
        -	[ "641", "Yoshi", "Strickland", "52538", "Brazil" ],
        -	[ "642", "Brenden", "Kirkland", "X7P 8V9", "Turks and Caicos Islands" ],
        -	[ "643", "Bree", "Stone", "U4L 2H2", "Hong Kong" ],
        -	[ "644", "Quin", "Tanner", "U4A 1X4", "Faroe Islands" ],
        -	[ "645", "Camilla", "Heath", "91749", "Andorra" ],
        -	[ "646", "Xaviera", "Bullock", "I4U 7W0", "Libyan Arab Jamahiriya" ],
        -	[ "647", "Kay", "Rowe", "59689", "Iceland" ],
        -	[ "648", "Lance", "Bond", "66558", "Spain" ],
        -	[ "649", "Fredericka", "Langley", "48782", "Cayman Islands" ],
        -	[ "650", "Charles", "Avila", "42037", "Papua New Guinea" ],
        -	[ "651", "Ramona", "Rios", "T5M 3E1", "Argentina" ],
        -	[ "652", "Ezekiel", "Young", "W8X 4S7", "French Polynesia" ],
        -	[ "653", "Celeste", "Dodson", "19140", "Benin" ],
        -	[ "654", "Frances", "Mcintosh", "91246", "Swaziland" ],
        -	[ "655", "Deanna", "Hyde", "J8P 3T5", "Croatia" ],
        -	[ "656", "Dahlia", "Blair", "45364", "Kazakhstan" ],
        -	[ "657", "Jade", "Hayes", "I5Q 3S9", "Malawi" ],
        -	[ "658", "Robin", "Bullock", "G9Q 2P8", "Ireland" ],
        -	[ "659", "Nasim", "Bond", "I2V 8N4", "Macedonia" ],
        -	[ "660", "Axel", "Pickett", "18370", "Saint Vincent and The Grenadines" ],
        -	[ "661", "Pearl", "Lee", "G1R 3R8", "Poland" ],
        -	[ "662", "Garth", "Meyers", "90308", "Georgia" ],
        -	[ "663", "Ivory", "Rios", "S8F 8R5", "Mexico" ],
        -	[ "664", "Jerome", "Lambert", "N1Q 6R8", "Saint Lucia" ],
        -	[ "665", "Meredith", "Clark", "27720", "Cocos (Keeling) Islands" ],
        -	[ "666", "Armando", "Holcomb", "M6D 4X0", "Oman" ],
        -	[ "667", "Rowan", "Page", "00307", "Nauru" ],
        -	[ "668", "Kyla", "Brown", "F4W 4C5", "Holy See (Vatican City State)" ],
        -	[ "669", "Leigh", "Sosa", "28499", "Uruguay" ],
        -	[ "670", "Shafira", "Forbes", "26526", "Honduras" ],
        -	[ "671", "Maxine", "Mueller", "90923", "Kazakhstan" ],
        -	[ "672", "Joy", "Sargent", "K6T 3W5", "Malawi" ],
        -	[ "673", "Lamar", "Roberts", "R5F 9C8", "Poland" ],
        -	[ "674", "Madonna", "Love", "15514", "Cyprus" ],
        -	[ "675", "Uriel", "Ware", "Z6V 5J1", "Singapore" ],
        -	[ "676", "Bevis", "Erickson", "M3X 9M8", "Brunei Darussalam" ],
        -	[ "677", "Grant", "Velasquez", "96942", "Antarctica" ],
        -	[ "678", "Lars", "Bullock", "14772", "Guyana" ],
        -	[ "679", "Maryam", "Jones", "01854", "Togo" ],
        -	[ "680", "Blythe", "Goodwin", "51731", "New Caledonia" ],
        -	[ "681", "Kane", "Wiggins", "55727", "Kiribati" ],
        -	[ "682", "Brian", "Rosales", "25896", "Cape Verde" ],
        -	[ "683", "Blaze", "Leach", "P6J 3E5", "Northern Mariana Islands" ],
        -	[ "684", "Cameron", "Neal", "82248", "Marshall Islands" ],
        -	[ "685", "Lydia", "Cunningham", "Q1V 8P7", "San Marino" ],
        -	[ "686", "Troy", "Cook", "32106", "British Indian Ocean Territory" ],
        -	[ "687", "Alexander", "Valenzuela", "S8Z 6B2", "Guadeloupe" ],
        -	[ "688", "Garth", "Beck", "46344", "Cook Islands" ],
        -	[ "689", "Hillary", "Nunez", "29462", "Sri Lanka" ],
        -	[ "690", "Hunter", "Sawyer", "W9M 6T4", "Saint Lucia" ],
        -	[ "691", "Jaquelyn", "Everett", "T1X 2U2", "Guinea-bissau" ],
        -	[ "692", "Indira", "Ortega", "43047", "Italy" ],
        -	[ "693", "Josiah", "Hinton", "N5F 5Y8", "Andorra" ],
        -	[ "694", "Bruno", "Gay", "E3U 3D9", "Palau" ],
        -	[ "695", "Melissa", "Blackburn", "S4V 1K2", "Virgin Islands, U.S." ],
        -	[ "696", "Zeus", "Dawson", "K5S 6Z6", "Belgium" ],
        -	[ "697", "Castor", "Mcmahon", "H3R 1O8", "Cambodia" ],
        -	[ "698", "Elizabeth", "Beasley", "98178", "Northern Mariana Islands" ],
        -	[ "699", "Jescie", "Lee", "08056", "Eritrea" ],
        -	[ "700", "Dennis", "Chapman", "T4O 1Q2", "Bangladesh" ],
        -	[ "701", "Basia", "Wallace", "U3Y 7C1", "Pitcairn" ],
        -	[ "702", "Dante", "Brewer", "53544", "Bosnia and Herzegovina" ],
        -	[ "703", "Adrienne", "Glenn", "32378", "Austria" ],
        -	[ "704", "Kellie", "Acevedo", "51723", "Italy" ],
        -	[ "705", "Scarlet", "Mclaughlin", "43509", "Kiribati" ],
        -	[ "706", "Lillith", "Mullins", "S6L 4Y6", "Kyrgyzstan" ],
        -	[ "707", "Maxine", "Atkins", "Z5T 5R5", "Denmark" ],
        -	[ "708", "Nicholas", "Rose", "40286", "Macedonia" ],
        -	[ "709", "Zenia", "Pugh", "28682", "Venezuela" ],
        -	[ "710", "Keely", "Turner", "34939", "New Zealand" ],
        -	[ "711", "Maisie", "Walton", "S6M 5C5", "Cameroon" ],
        -	[ "712", "Michelle", "Salinas", "T7A 9N6", "Nicaragua" ],
        -	[ "713", "Reece", "Clements", "73923", "Austria" ],
        -	[ "714", "Eliana", "Fox", "V3Y 5T4", "Denmark" ],
        -	[ "715", "Kennedy", "Mullins", "43213", "Virgin Islands, British" ],
        -	[ "716", "Alea", "Glover", "M6P 3Z5", "Turkmenistan" ],
        -	[ "717", "Scarlett", "Hunt", "41461", "Montserrat" ],
        -	[ "718", "Rooney", "Kane", "T8A 3E2", "Madagascar" ],
        -	[ "719", "Cairo", "Ray", "L6M 1E7", "Canada" ],
        -	[ "720", "Wendy", "Burks", "R8V 8F5", "Virgin Islands, U.S." ],
        -	[ "721", "Christine", "Suarez", "67369", "Georgia" ],
        -	[ "722", "Graiden", "Le", "K4M 9V5", "New Caledonia" ],
        -	[ "723", "Zane", "Nunez", "60548", "Haiti" ],
        -	[ "724", "Ali", "Bell", "U4Y 4C3", "Togo" ],
        -	[ "725", "Marsden", "Leon", "39374", "Venezuela" ],
        -	[ "726", "Holmes", "Kidd", "B6K 7Q9", "Iraq" ],
        -	[ "727", "Cameron", "Gardner", "88627", "Brazil" ],
        -	[ "728", "Ava", "George", "K1Z 7Y2", "Monaco" ],
        -	[ "729", "Chantale", "Holland", "H1B 9L8", "Afghanistan" ],
        -	[ "730", "Alika", "Middleton", "W8X 7O1", "Korea" ],
        -	[ "731", "Cameran", "Zimmerman", "78576", "Benin" ],
        -	[ "732", "Barrett", "Blair", "51161", "Virgin Islands, U.S." ],
        -	[ "733", "Brielle", "Ballard", "59538", "Iceland" ],
        -	[ "734", "Teagan", "Morales", "40107", "Kenya" ],
        -	[ "735", "Lunea", "Cantu", "14690", "Oman" ],
        -	[ "736", "Robin", "Gilmore", "17972", "Nauru" ],
        -	[ "737", "Hall", "Mccarty", "86141", "China" ],
        -	[ "738", "Olga", "Rasmussen", "58309", "Virgin Islands, British" ],
        -	[ "739", "Mark", "Griffin", "51542", "Argentina" ],
        -	[ "740", "Medge", "Carrillo", "23192", "Pitcairn" ],
        -	[ "741", "Susan", "Mosley", "32128", "Turkmenistan" ],
        -	[ "742", "Zelda", "Valdez", "46831", "New Caledonia" ],
        -	[ "743", "Ruth", "Donaldson", "F9I 7G7", "Ukraine" ],
        -	[ "744", "Kirby", "Workman", "36679", "Rwanda" ],
        -	[ "745", "Alexa", "King", "66513", "Liberia" ],
        -	[ "746", "Ronan", "Gross", "K2S 6D0", "Saint Lucia" ],
        -	[ "747", "Kylee", "Dillon", "P7Y 1I5", "Faroe Islands" ],
        -	[ "748", "Brenda", "Weaver", "99365", "Uzbekistan" ],
        -	[ "749", "Aristotle", "Orr", "43451", "Canada" ],
        -	[ "750", "Jaquelyn", "Tyler", "B9Q 7P5", "Brunei Darussalam" ],
        -	[ "751", "Madeline", "Stewart", "D4D 2J4", "Zimbabwe" ],
        -	[ "752", "Lacota", "Glass", "89124", "Israel" ],
        -	[ "753", "Adrian", "Ashley", "N8M 4L1", "Sri Lanka" ],
        -	[ "754", "Ignatius", "Waller", "12053", "Thailand" ],
        -	[ "755", "Raven", "Stevens", "88768", "Estonia" ],
        -	[ "756", "Carly", "Camacho", "27075", "Vanuatu" ],
        -	[ "757", "Lee", "Calderon", "19501", "Pitcairn" ],
        -	[ "758", "Amos", "Briggs", "I6A 3L8", "Saint Kitts and Nevis" ],
        -	[ "759", "Cheryl", "Valencia", "90517", "Denmark" ],
        -	[ "760", "Kenyon", "Franco", "B2S 2E2", "Western Sahara" ],
        -	[ "761", "Damian", "Acosta", "A2S 6D0", "Bahamas" ],
        -	[ "762", "Brenda", "Zamora", "T9E 7L3", "Finland" ],
        -	[ "763", "Connor", "Atkinson", "03975", "Sierra Leone" ],
        -	[ "764", "Kaseem", "Waters", "A2K 2X0", "China" ],
        -	[ "765", "Zephania", "Whitfield", "A4Z 9P7", "Eritrea" ],
        -	[ "766", "Emmanuel", "Ballard", "G1M 6Y2", "Finland" ],
        -	[ "767", "Amos", "Walters", "43184", "Oman" ],
        -	[ "768", "Urielle", "Browning", "19959", "Panama" ],
        -	[ "769", "TaShya", "Summers", "B9V 3Y3", "Micronesia" ],
        -	[ "770", "Jermaine", "Mcgee", "X8A 4E1", "Cape Verde" ],
        -	[ "771", "Chaney", "Berry", "G2H 2C8", "Uganda" ],
        -	[ "772", "Jaime", "May", "49723", "Eritrea" ],
        -	[ "773", "Olga", "Cohen", "13403", "Macao" ],
        -	[ "774", "Jacob", "Vaughn", "U7G 1V5", "Greece" ],
        -	[ "775", "Kelly", "Mcdonald", "Z3B 5G7", "Kiribati" ],
        -	[ "776", "Emi", "Gilbert", "W1L 2M4", "Nicaragua" ],
        -	[ "777", "Francis", "Nunez", "K4U 6M5", "Lithuania" ],
        -	[ "778", "Noel", "Nelson", "Z5T 1Y0", "Nauru" ],
        -	[ "779", "Ora", "Ellison", "Y5I 4R8", "Burundi" ],
        -	[ "780", "Kirby", "Glass", "J5X 2E3", "Argentina" ],
        -	[ "781", "Hayley", "Tate", "V1T 6B6", "Greece" ],
        -	[ "782", "Mohammad", "Leblanc", "E3S 5R3", "Oman" ],
        -	[ "783", "Lionel", "Todd", "A1Z 9E1", "Macedonia" ],
        -	[ "784", "Courtney", "Mckay", "D4I 8Z3", "Fiji" ],
        -	[ "785", "Reagan", "West", "84159", "Equatorial Guinea" ],
        -	[ "786", "Noel", "Strickland", "Q7K 6S3", "Mozambique" ],
        -	[ "787", "Lara", "Porter", "49872", "Nigeria" ],
        -	[ "788", "Kyra", "Haley", "I9E 2K3", "Dominican Republic" ],
        -	[ "789", "Wynter", "Beasley", "66330", "Heard Island and Mcdonald Islands" ],
        -	[ "790", "Vladimir", "Briggs", "99538", "Burkina Faso" ],
        -	[ "791", "Rafael", "Campbell", "V8L 2S6", "Algeria" ],
        -	[ "792", "Buffy", "Wilder", "N3U 2X0", "Bahrain" ],
        -	[ "793", "Nyssa", "Dawson", "38434", "Spain" ],
        -	[ "794", "Sylvia", "Swanson", "39714", "Azerbaijan" ],
        -	[ "795", "Jolie", "Diaz", "A1J 5I1", "Cuba" ],
        -	[ "796", "Rosalyn", "Mcdaniel", "F3T 6E2", "Benin" ],
        -	[ "797", "Nelle", "Prince", "K1M 4U6", "Maldives" ],
        -	[ "798", "Luke", "Knight", "05930", "Seychelles" ],
        -	[ "799", "Macaulay", "Conway", "79707", "American Samoa" ],
        -	[ "800", "Freya", "Webb", "U2H 2D7", "Ireland" ],
        -	[ "801", "Clinton", "Meyers", "S9I 7N2", "Malta" ],
        -	[ "802", "Rudyard", "Chandler", "40347", "Bahrain" ],
        -	[ "803", "Courtney", "Hoover", "12325", "French Polynesia" ],
        -	[ "804", "Melissa", "Davenport", "K7P 1S8", "Canada" ],
        -	[ "805", "Noelle", "Nieves", "87427", "Martinique" ],
        -	[ "806", "Myles", "Hart", "V6T 1W0", "Niue" ],
        -	[ "807", "Jasper", "Campos", "78143", "Faroe Islands" ],
        -	[ "808", "Ariana", "Valentine", "J4X 2D4", "Ecuador" ],
        -	[ "809", "Vanna", "Fletcher", "M4Z 1F9", "Faroe Islands" ],
        -	[ "810", "Elijah", "Harper", "Y1B 7E4", "New Zealand" ],
        -	[ "811", "Leilani", "Nunez", "K9W 4F0", "United Arab Emirates" ],
        -	[ "812", "Maia", "Huber", "V4L 8M6", "United Kingdom" ],
        -	[ "813", "Richard", "Riddle", "U8C 8Q2", "Niue" ],
        -	[ "814", "Harper", "Blanchard", "10904", "Cameroon" ],
        -	[ "815", "Aurelia", "Trujillo", "01646", "Dominican Republic" ],
        -	[ "816", "Anthony", "Owen", "J2I 2B4", "Palestinian Territory, Occupied" ],
        -	[ "817", "Kelsie", "Roy", "M3J 6K3", "Maldives" ],
        -	[ "818", "James", "Pearson", "94810", "Mexico" ],
        -	[ "819", "Igor", "Marshall", "Y8M 2D6", "Palau" ],
        -	[ "820", "Aquila", "Willis", "20354", "Samoa" ],
        -	[ "821", "Randall", "Sheppard", "73577", "Sierra Leone" ],
        -	[ "822", "Gray", "Myers", "53651", "Gibraltar" ],
        -	[ "823", "Dana", "Camacho", "89571", "Reunion" ],
        -	[ "824", "Berk", "Hopper", "17794", "Cook Islands" ],
        -	[ "825", "Shannon", "Barry", "70536", "Bouvet Island" ],
        -	[ "826", "Dahlia", "Herman", "F8L 1Q3", "Lesotho" ],
        -	[ "827", "Gillian", "Hayes", "O2C 7X8", "Tajikistan" ],
        -	[ "828", "Leo", "Bolton", "P6V 6E1", "Dominica" ],
        -	[ "829", "Vivien", "Best", "E5E 6N8", "Cuba" ],
        -	[ "830", "Clayton", "Bradley", "E7R 3M5", "Zimbabwe" ],
        -	[ "831", "Lesley", "Collins", "16592", "Mali" ],
        -	[ "832", "Holly", "Hensley", "49080", "Tunisia" ],
        -	[ "833", "Larissa", "Velazquez", "41068", "Haiti" ],
        -	[ "834", "Delilah", "Mejia", "A5I 9Q9", "Croatia" ],
        -	[ "835", "Drew", "Roberson", "U7E 3R1", "Somalia" ],
        -	[ "836", "Jenette", "Patel", "64084", "Denmark" ],
        -	[ "837", "Gillian", "Cleveland", "05659", "Syrian Arab Republic" ],
        -	[ "838", "Noelle", "Lara", "U1N 6V6", "Sri Lanka" ],
        -	[ "839", "Celeste", "Rollins", "26590", "Mayotte" ],
        -	[ "840", "Elvis", "Fletcher", "M8V 6J4", "Bahamas" ],
        -	[ "841", "Caesar", "Hays", "E3D 3T7", "Malta" ],
        -	[ "842", "Rama", "Weber", "25880", "Malta" ],
        -	[ "843", "Lael", "Page", "57135", "Anguilla" ],
        -	[ "844", "Omar", "Hammond", "90213", "Belarus" ],
        -	[ "845", "Simone", "Mcintosh", "L5P 1S0", "Bhutan" ],
        -	[ "846", "Gay", "Harper", "56404", "Virgin Islands, U.S." ],
        -	[ "847", "Joel", "Holman", "C1F 1C4", "Saint Lucia" ],
        -	[ "848", "Clayton", "Pennington", "57003", "Kazakhstan" ],
        -	[ "849", "Susan", "Mckee", "I5U 8F2", "Taiwan, Province of China" ],
        -	[ "850", "Jenna", "Stein", "P2K 6L4", "Reunion" ],
        -	[ "851", "Madonna", "Joyner", "Q4Q 4K6", "Guadeloupe" ],
        -	[ "852", "Deirdre", "Ingram", "N7U 3N9", "Monaco" ],
        -	[ "853", "Juliet", "Hodges", "U2Q 2T0", "Uzbekistan" ],
        -	[ "854", "Naomi", "Rice", "O6T 2Z1", "Nicaragua" ],
        -	[ "855", "Leila", "Alvarado", "Z2V 7L3", "Suriname" ],
        -	[ "856", "George", "Leon", "L6M 1V2", "Norway" ],
        -	[ "857", "Rama", "Cruz", "Y2S 7K6", "Kenya" ],
        -	[ "858", "Clarke", "Mckinney", "34622", "Viet Nam" ],
        -	[ "859", "Savannah", "Bailey", "L3O 1U6", "Solomon Islands" ],
        -	[ "860", "Maxwell", "Gibson", "R9K 9Q1", "Virgin Islands, British" ],
        -	[ "861", "Devin", "Humphrey", "74821", "Costa Rica" ],
        -	[ "862", "Kadeem", "Larsen", "43178", "Luxembourg" ],
        -	[ "863", "Elvis", "Todd", "O3O 3G9", "Azerbaijan" ],
        -	[ "864", "Levi", "Montoya", "G1Y 1N8", "Venezuela" ],
        -	[ "865", "Risa", "Barnes", "86118", "Benin" ],
        -	[ "866", "Dillon", "Riggs", "O3Y 8V2", "Greenland" ],
        -	[ "867", "Stewart", "Marshall", "V8G 8S2", "Mexico" ],
        -	[ "868", "Camden", "Goff", "N3W 2L0", "Bahrain" ],
        -	[ "869", "Sheila", "Meadows", "T6K 7M2", "Yemen" ],
        -	[ "870", "Hop", "Berger", "Q8B 9R7", "Germany" ],
        -	[ "871", "Charissa", "Wilkerson", "08090", "Burundi" ],
        -	[ "872", "Raphael", "Carey", "03667", "United Kingdom" ],
        -	[ "873", "Micah", "Hood", "T9N 4T5", "Georgia" ],
        -	[ "874", "Cathleen", "Mccall", "N6H 6N3", "Tanzania, United Republic of" ],
        -	[ "875", "Lisandra", "Poole", "S7O 1J1", "Greece" ],
        -	[ "876", "Stone", "Blackwell", "90654", "Serbia and Montenegro" ],
        -	[ "877", "Serena", "Mann", "32305", "Trinidad and Tobago" ],
        -	[ "878", "Scarlet", "Turner", "D7Y 8N4", "Oman" ],
        -	[ "879", "Zenaida", "Carrillo", "60361", "Montserrat" ],
        -	[ "880", "Jaime", "Dalton", "F4E 6R5", "Iraq" ],
        -	[ "881", "Wesley", "Drake", "D8J 9U2", "Bulgaria" ],
        -	[ "882", "Armand", "Chandler", "X8Z 9E6", "Saint Kitts and Nevis" ],
        -	[ "883", "Inez", "Dillard", "59975", "Eritrea" ],
        -	[ "884", "Roanna", "Floyd", "65958", "Bolivia" ],
        -	[ "885", "Timon", "Dalton", "O3Q 5B5", "Colombia" ],
        -	[ "886", "Ifeoma", "Lamb", "J9A 9X0", "Papua New Guinea" ],
        -	[ "887", "Brody", "Cash", "75525", "Kazakhstan" ],
        -	[ "888", "Dawn", "Wise", "G7X 5J3", "Samoa" ],
        -	[ "889", "Chaney", "Bartlett", "11112", "Ecuador" ],
        -	[ "890", "Galvin", "Merritt", "59635", "Bahrain" ],
        -	[ "891", "Cynthia", "Nash", "U5P 1H4", "Switzerland" ],
        -	[ "892", "Tara", "Austin", "Q6X 8U0", "Burundi" ],
        -	[ "893", "Roanna", "Petty", "28524", "Northern Mariana Islands" ],
        -	[ "894", "Palmer", "Mcdowell", "78234", "United States Minor Outlying Islands" ],
        -	[ "895", "Sade", "Patton", "28984", "Czech Republic" ],
        -	[ "896", "Yoko", "Compton", "62165", "Saint Kitts and Nevis" ],
        -	[ "897", "Regan", "Mccarthy", "C5D 6G0", "Lebanon" ],
        -	[ "898", "Norman", "Nixon", "E4C 4G0", "Virgin Islands, U.S." ],
        -	[ "899", "Jocelyn", "Baldwin", "X9R 2B3", "Macedonia" ],
        -	[ "900", "Jaquelyn", "Berg", "N6X 6E1", "Saint Lucia" ],
        -	[ "901", "Zane", "Nelson", "G9P 4J8", "Macao" ],
        -	[ "902", "Judith", "Elliott", "R4I 4O3", "Iraq" ],
        -	[ "903", "Maia", "Ellis", "S9V 6P0", "Bahrain" ],
        -	[ "904", "Mechelle", "Stevens", "43406", "Bouvet Island" ],
        -	[ "905", "Sylvester", "Duran", "K5D 8W5", "Costa Rica" ],
        -	[ "906", "Unity", "Cooke", "64362", "Ecuador" ],
        -	[ "907", "Karly", "Velazquez", "43286", "Guam" ],
        -	[ "908", "Damian", "Yates", "84910", "Thailand" ],
        -	[ "909", "Linus", "Gross", "31808", "Israel" ],
        -	[ "910", "Cooper", "Franco", "36700", "Yemen" ],
        -	[ "911", "Gail", "Jones", "09157", "Turkey" ],
        -	[ "912", "Hayfa", "Bennett", "59422", "France" ],
        -	[ "913", "Hermione", "Barber", "I6W 8Z5", "Mozambique" ],
        -	[ "914", "Hedy", "Stevens", "35535", "Cuba" ],
        -	[ "915", "Galvin", "Frederick", "J2W 9A3", "Virgin Islands, British" ],
        -	[ "916", "Lamar", "Rush", "P4O 3H4", "Austria" ],
        -	[ "917", "Brenda", "Walter", "K8Q 9H9", "Tajikistan" ],
        -	[ "918", "Ria", "Guy", "12801", "Gibraltar" ],
        -	[ "919", "Bruno", "Lynch", "I6U 7D0", "Greenland" ],
        -	[ "920", "Kirk", "Pearson", "66242", "Falkland Islands (Malvinas)" ],
        -	[ "921", "Owen", "Sosa", "61483", "Martinique" ],
        -	[ "922", "Rajah", "Mccarty", "G9K 6L2", "Faroe Islands" ],
        -	[ "923", "Erasmus", "Malone", "D6H 7H5", "Sierra Leone" ],
        -	[ "924", "Raja", "Hale", "85590", "Guadeloupe" ],
        -	[ "925", "Logan", "Christensen", "Y6L 8Z0", "Guatemala" ],
        -	[ "926", "Kirestin", "Griffith", "47900", "Micronesia" ],
        -	[ "927", "Kato", "Reeves", "93779", "Uruguay" ],
        -	[ "928", "Jonah", "Suarez", "13708", "Spain" ],
        -	[ "929", "Adam", "Lynn", "E1P 1L3", "Indonesia" ],
        -	[ "930", "Quinn", "Mckinney", "99683", "Faroe Islands" ],
        -	[ "931", "Whilemina", "Macias", "32145", "Iceland" ],
        -	[ "932", "Gillian", "Osborne", "L3L 6G0", "Italy" ],
        -	[ "933", "Venus", "Zamora", "28318", "Comoros" ],
        -	[ "934", "Allegra", "Eaton", "P5X 9S0", "Antarctica" ],
        -	[ "935", "Driscoll", "Preston", "R3L 9R0", "Niue" ],
        -	[ "936", "Joel", "Spencer", "12006", "Monaco" ],
        -	[ "937", "Lucius", "Sharp", "B8V 6U7", "Dominica" ],
        -	[ "938", "Curran", "Robinson", "82216", "Romania" ],
        -	[ "939", "Kerry", "Espinoza", "N4B 7Q1", "Guatemala" ],
        -	[ "940", "Isaac", "Kline", "85674", "Costa Rica" ],
        -	[ "941", "Neil", "Harrison", "I5A 2S2", "Greenland" ],
        -	[ "942", "Ezra", "Rodriguez", "D6P 5Q3", "Angola" ],
        -	[ "943", "Galvin", "Jefferson", "D6H 7G0", "Macedonia" ],
        -	[ "944", "Joseph", "Hahn", "Z8V 9B5", "Uganda" ],
        -	[ "945", "Naida", "Hammond", "40105", "Philippines" ],
        -	[ "946", "Brenna", "Everett", "41704", "Indonesia" ],
        -	[ "947", "Rae", "Parks", "79077", "Sweden" ],
        -	[ "948", "Jessica", "Richard", "Y3I 5R3", "Uganda" ],
        -	[ "949", "Rachel", "Marks", "16157", "Cameroon" ],
        -	[ "950", "Maxwell", "Ferguson", "V6A 6M0", "Ukraine" ],
        -	[ "951", "Alyssa", "Beard", "13936", "Antarctica" ],
        -	[ "952", "Camille", "Gill", "V9Q 9P7", "New Caledonia" ],
        -	[ "953", "Cora", "Bond", "M9X 1A4", "Seychelles" ],
        -	[ "954", "Peter", "Acosta", "07937", "Chile" ],
        -	[ "955", "Ella", "Poole", "A3F 9Z1", "Panama" ],
        -	[ "956", "Ashely", "Guerrero", "37436", "Central African Republic" ],
        -	[ "957", "Mikayla", "Johnston", "L9W 5T8", "Cameroon" ],
        -	[ "958", "Ora", "Weaver", "65897", "Turks and Caicos Islands" ],
        -	[ "959", "Timon", "Barnes", "R6J 1J7", "Djibouti" ],
        -	[ "960", "Jamalia", "Wade", "22211", "United States" ],
        -	[ "961", "Bradley", "Haney", "K1H 1Q1", "Western Sahara" ],
        -	[ "962", "Lance", "Le", "H4R 9T7", "Botswana" ],
        -	[ "963", "Ethan", "Rich", "T8N 1C6", "Netherlands" ],
        -	[ "964", "Jeanette", "Carver", "G1E 5C8", "Cook Islands" ],
        -	[ "965", "Ocean", "Marquez", "15084", "Pakistan" ],
        -	[ "966", "Ifeoma", "Cleveland", "R9D 6M1", "French Guiana" ],
        -	[ "967", "Sylvia", "Herring", "U4R 8P1", "Thailand" ],
        -	[ "968", "Clare", "Huffman", "Q5G 2Q0", "Niger" ],
        -	[ "969", "Colton", "Leach", "V3F 9W6", "Syrian Arab Republic" ],
        -	[ "970", "Maryam", "Hoover", "Y7U 6N3", "Slovakia" ],
        -	[ "971", "Nola", "Snider", "54275", "Bosnia and Herzegovina" ],
        -	[ "972", "Kameko", "Cote", "M3C 8N0", "Cambodia" ],
        -	[ "973", "Julian", "Pugh", "B6E 7J7", "Mauritania" ],
        -	[ "974", "Xena", "Lott", "52294", "Estonia" ],
        -	[ "975", "Fuller", "Kirk", "65396", "Qatar" ],
        -	[ "976", "Lance", "Knox", "78074", "Serbia and Montenegro" ],
        -	[ "977", "Hedwig", "Beck", "T5P 4C8", "Dominican Republic" ],
        -	[ "978", "Martena", "Diaz", "65420", "Saint Pierre and Miquelon" ],
        -	[ "979", "Shafira", "David", "74843", "Senegal" ],
        -	[ "980", "Shafira", "Clark", "T6F 5C7", "Mongolia" ],
        -	[ "981", "Georgia", "Booth", "28183", "Japan" ],
        -	[ "982", "Cameron", "Austin", "I2J 1R1", "Bahrain" ],
        -	[ "983", "Vanna", "Hyde", "82434", "Croatia" ],
        -	[ "984", "Deanna", "Park", "68486", "Zimbabwe" ],
        -	[ "985", "Grady", "Freeman", "U4O 1Q9", "Belarus" ],
        -	[ "986", "Sandra", "Knapp", "31413", "Sudan" ],
        -	[ "987", "Dorian", "Joseph", "90768", "Lithuania" ],
        -	[ "988", "Adria", "Bonner", "15899", "Mongolia" ],
        -	[ "989", "Sebastian", "Guzman", "G9L 9G5", "Yemen" ],
        -	[ "990", "Angelica", "Puckett", "W8D 8W8", "Virgin Islands, U.S." ],
        -	[ "991", "Connor", "Parks", "26175", "Virgin Islands, U.S." ],
        -	[ "992", "Yardley", "Griffith", "H3L 2U3", "Saint Pierre and Miquelon" ],
        -	[ "993", "Charissa", "Beck", "30611", "Zambia" ],
        -	[ "994", "Calvin", "Russo", "79906", "Chile" ],
        -	[ "995", "Yoshi", "Durham", "N2J 8M8", "China" ],
        -	[ "996", "Finn", "Buck", "Q9F 9Z8", "Iraq" ],
        -	[ "997", "Kessie", "Holden", "C4A 1J0", "Syrian Arab Republic" ],
        -	[ "998", "Chloe", "Richards", "63091", "Canada" ],
        -	[ "999", "Uriel", "Snyder", "95487", "Pakistan" ],
        -	[ "1000", "Maite", "Cash", "90705", "Syrian Arab Republic" ],
        -	[ "1001", "Cameron", "Schwartz", "82778", "Taiwan, Province of China" ],
        -	[ "1002", "Faith", "Jimenez", "J6K 2P9", "Saint Pierre and Miquelon" ],
        -	[ "1003", "Otto", "Hancock", "34535", "Andorra" ],
        -	[ "1004", "Harlan", "Blackwell", "N8Y 4E6", "Qatar" ],
        -	[ "1005", "Fitzgerald", "Gilliam", "Y9J 6J5", "Burkina Faso" ],
        -	[ "1006", "Lev", "Ballard", "01956", "American Samoa" ],
        -	[ "1007", "Freya", "Brown", "01190", "Portugal" ],
        -	[ "1008", "Harding", "Osborn", "14814", "San Marino" ],
        -	[ "1009", "Alexander", "Howard", "81842", "Reunion" ],
        -	[ "1010", "Ori", "Marsh", "77738", "Saint Helena" ],
        -	[ "1011", "Brennan", "Rich", "18690", "Cambodia" ],
        -	[ "1012", "Dawn", "Christensen", "Y8F 7R3", "Mali" ],
        -	[ "1013", "Ahmed", "Pearson", "62230", "Sudan" ],
        -	[ "1014", "Tanek", "Head", "25744", "Kiribati" ],
        -	[ "1015", "Meredith", "Cantu", "E6X 2L1", "Kenya" ],
        -	[ "1016", "Levi", "Fisher", "I9Y 9G2", "Djibouti" ],
        -	[ "1017", "Katell", "Cameron", "10278", "Denmark" ],
        -	[ "1018", "Ina", "Orr", "P7H 2O3", "Congo" ],
        -	[ "1019", "Beck", "Hayden", "15115", "Saint Lucia" ],
        -	[ "1020", "Cassady", "Wagner", "R9H 8C5", "Estonia" ],
        -	[ "1021", "Amena", "Herrera", "13286", "Bahrain" ],
        -	[ "1022", "Tarik", "Gross", "C3X 3W0", "Azerbaijan" ],
        -	[ "1023", "Marshall", "Collier", "13416", "Dominica" ],
        -	[ "1024", "Kirestin", "Callahan", "15429", "Micronesia" ],
        -	[ "1025", "Sasha", "Rice", "O6H 6X2", "Denmark" ],
        -	[ "1026", "Ross", "Gonzalez", "D3B 3R5", "Sudan" ],
        -	[ "1027", "Veda", "Arnold", "56611", "Swaziland" ],
        -	[ "1028", "Ferdinand", "Macias", "P1Q 3I2", "Colombia" ],
        -	[ "1029", "Mohammad", "Reed", "74005", "Bhutan" ],
        -	[ "1030", "Reagan", "Sandoval", "19275", "Pitcairn" ],
        -	[ "1031", "Debra", "Nelson", "85945", "Ukraine" ],
        -	[ "1032", "Cleo", "Robertson", "84072", "Guadeloupe" ],
        -	[ "1033", "Tanya", "Vance", "C1F 7F1", "Romania" ],
        -	[ "1034", "Desirae", "Wooten", "74659", "Mongolia" ],
        -	[ "1035", "Hiram", "Estes", "Q5Z 5A0", "Namibia" ],
        -	[ "1036", "Medge", "Weiss", "67079", "Azerbaijan" ],
        -	[ "1037", "Hu", "Chase", "87562", "Cuba" ],
        -	[ "1038", "Shafira", "Everett", "18983", "Georgia" ],
        -	[ "1039", "Mannix", "Lamb", "45542", "Venezuela" ],
        -	[ "1040", "Germaine", "Harvey", "I9G 1U0", "Falkland Islands (Malvinas)" ],
        -	[ "1041", "Brenna", "Leonard", "55573", "New Zealand" ],
        -	[ "1042", "Kylie", "Rivas", "U9J 3O9", "Djibouti" ],
        -	[ "1043", "Alexandra", "Rich", "T4O 6S6", "Cuba" ],
        -	[ "1044", "Dorian", "Spears", "00456", "Brazil" ],
        -	[ "1045", "Laurel", "Abbott", "45449", "Switzerland" ],
        -	[ "1046", "Gabriel", "Drake", "U1S 5O2", "Trinidad and Tobago" ],
        -	[ "1047", "Priscilla", "Mercer", "01401", "Serbia and Montenegro" ],
        -	[ "1048", "Darius", "Hoffman", "49694", "Greece" ],
        -	[ "1049", "Caesar", "Patton", "42322", "Suriname" ],
        -	[ "1050", "Susan", "Clayton", "W1G 5C3", "Maldives" ],
        -	[ "1051", "Zane", "Dunlap", "73722", "Oman" ],
        -	[ "1052", "Leah", "Fuentes", "60412", "Luxembourg" ],
        -	[ "1053", "Yardley", "Hansen", "03194", "Mauritius" ],
        -	[ "1054", "Ingrid", "Talley", "37315", "Solomon Islands" ],
        -	[ "1055", "Demetria", "Evans", "30587", "Tajikistan" ],
        -	[ "1056", "Ignacia", "Alford", "01282", "Bouvet Island" ],
        -	[ "1057", "Destiny", "Wade", "L5R 3V3", "Uganda" ],
        -	[ "1058", "Alden", "Mason", "V7D 2V6", "Dominican Republic" ],
        -	[ "1059", "Pamela", "Wilcox", "L1I 6I1", "Canada" ],
        -	[ "1060", "Melvin", "Buckley", "05478", "Hungary" ],
        -	[ "1061", "Eve", "Holcomb", "B6B 8T1", "Cook Islands" ],
        -	[ "1062", "Arthur", "Weeks", "R5P 7U2", "Bangladesh" ],
        -	[ "1063", "Marah", "Levine", "10075", "Somalia" ],
        -	[ "1064", "Keiko", "Freeman", "90950", "Faroe Islands" ],
        -	[ "1065", "Dorian", "Rose", "T5M 4Z0", "Fiji" ],
        -	[ "1066", "Desirae", "Velez", "T4E 8K2", "Afghanistan" ],
        -	[ "1067", "Rebekah", "Lucas", "T9A 8V5", "Tunisia" ],
        -	[ "1068", "Sylvester", "Copeland", "W6R 3B6", "Jamaica" ],
        -	[ "1069", "Alea", "Preston", "31050", "Netherlands Antilles" ],
        -	[ "1070", "Aphrodite", "Gordon", "T7C 6T8", "Sao Tome and Principe" ],
        -	[ "1071", "Yael", "Delaney", "G9W 9P1", "Mexico" ],
        -	[ "1072", "Sierra", "Perez", "R3O 8H0", "Slovenia" ],
        -	[ "1073", "Avram", "Briggs", "05221", "Norfolk Island" ],
        -	[ "1074", "Troy", "Poole", "W7Q 8O5", "Malta" ],
        -	[ "1075", "Gavin", "Sandoval", "37352", "Greece" ],
        -	[ "1076", "Nerea", "Stokes", "N2Q 6S9", "United States" ],
        -	[ "1077", "Genevieve", "Ramirez", "53829", "Mali" ],
        -	[ "1078", "Oliver", "Boone", "M1Q 8V9", "Bolivia" ],
        -	[ "1079", "Lars", "Ramirez", "L2R 6V2", "Bosnia and Herzegovina" ],
        -	[ "1080", "Abbot", "Horton", "R1R 1V8", "Netherlands Antilles" ],
        -	[ "1081", "Abra", "Avila", "41608", "Congo" ],
        -	[ "1082", "Candice", "Christian", "13930", "Faroe Islands" ],
        -	[ "1083", "Flavia", "Miranda", "93964", "Estonia" ],
        -	[ "1084", "Medge", "Drake", "Q7C 2E2", "Belize" ],
        -	[ "1085", "Lee", "Montgomery", "H3T 4Q6", "Costa Rica" ],
        -	[ "1086", "Aline", "Ratliff", "99839", "Macao" ],
        -	[ "1087", "Shafira", "Fox", "A9S 7C8", "Palestinian Territory, Occupied" ],
        -	[ "1088", "Orson", "Greene", "K9L 7R8", "Myanmar" ],
        -	[ "1089", "Henry", "Joyner", "55853", "South Africa" ],
        -	[ "1090", "Keely", "Boyer", "08996", "Liberia" ],
        -	[ "1091", "Jerome", "Jones", "31770", "Saint Lucia" ],
        -	[ "1092", "Hermione", "Dunlap", "U2R 7R2", "Moldova" ],
        -	[ "1093", "Lenore", "Powers", "73772", "Tunisia" ],
        -	[ "1094", "Alden", "Newman", "V4C 3O8", "Bhutan" ],
        -	[ "1095", "Jasper", "Blevins", "K2H 5W0", "Paraguay" ],
        -	[ "1096", "Robert", "Bender", "R5F 1H9", "Philippines" ],
        -	[ "1097", "Bo", "Richard", "N5R 6T2", "Trinidad and Tobago" ],
        -	[ "1098", "Iliana", "Mcpherson", "23758", "Bangladesh" ],
        -	[ "1099", "Alfreda", "Camacho", "35387", "Saint Helena" ],
        -	[ "1100", "Kirsten", "Giles", "14079", "Romania" ],
        -	[ "1101", "Harlan", "Crawford", "84847", "French Polynesia" ],
        -	[ "1102", "Wynne", "Bauer", "W9D 6F6", "Kazakhstan" ],
        -	[ "1103", "Connor", "Melton", "E2F 4Q2", "Angola" ],
        -	[ "1104", "Evelyn", "Barry", "I9H 8W7", "Turkmenistan" ],
        -	[ "1105", "Barry", "Stephens", "07823", "Gibraltar" ],
        -	[ "1106", "Ferris", "Farrell", "I7H 5Z6", "Saint Vincent and The Grenadines" ],
        -	[ "1107", "Ursa", "Carr", "31124", "Chad" ],
        -	[ "1108", "Laith", "Johnson", "10428", "Cyprus" ],
        -	[ "1109", "Harlan", "Frank", "J6K 7I6", "Gambia" ],
        -	[ "1110", "Gregory", "Ratliff", "P1C 8H2", "Chile" ],
        -	[ "1111", "Rina", "Holloway", "Y7N 1E7", "Estonia" ],
        -	[ "1112", "Maris", "Joyner", "T6R 2H9", "France" ],
        -	[ "1113", "Galvin", "Webster", "V8E 9U4", "Croatia" ],
        -	[ "1114", "Farrah", "Bean", "H2B 8E2", "Palestinian Territory, Occupied" ],
        -	[ "1115", "Martha", "Schroeder", "14485", "Georgia" ],
        -	[ "1116", "Mari", "Boone", "D4C 1Q0", "Comoros" ],
        -	[ "1117", "Nadine", "Mercado", "35046", "Syrian Arab Republic" ],
        -	[ "1118", "Isadora", "Keith", "R5H 8Y7", "Mayotte" ],
        -	[ "1119", "Quinn", "William", "V8Q 3Y6", "India" ],
        -	[ "1120", "Justina", "Gilbert", "11271", "Yemen" ],
        -	[ "1121", "Jordan", "Hull", "F4Z 7R8", "Lesotho" ],
        -	[ "1122", "Mechelle", "Davenport", "A9Z 8P2", "Bermuda" ],
        -	[ "1123", "Isabelle", "Webster", "60972", "Zimbabwe" ],
        -	[ "1124", "Armand", "Butler", "Y3F 4H9", "Nicaragua" ],
        -	[ "1125", "Herman", "Beach", "Q8N 6V3", "Cape Verde" ],
        -	[ "1126", "Brianna", "Love", "D9B 2W8", "Sierra Leone" ],
        -	[ "1127", "Joy", "Brown", "O7V 7C1", "Djibouti" ],
        -	[ "1128", "Amena", "Moss", "P8D 1L9", "Andorra" ],
        -	[ "1129", "Zeph", "Whitehead", "01513", "Tanzania, United Republic of" ],
        -	[ "1130", "Logan", "Matthews", "73541", "Finland" ],
        -	[ "1131", "Amela", "Gregory", "65323", "Swaziland" ],
        -	[ "1132", "Zoe", "Owen", "V5L 5O6", "Zambia" ],
        -	[ "1133", "September", "Hewitt", "R8K 4G9", "Congo" ],
        -	[ "1134", "Holly", "Walter", "S2E 3M4", "Serbia and Montenegro" ],
        -	[ "1135", "Zeph", "Beach", "J6Z 8B5", "Ecuador" ],
        -	[ "1136", "Morgan", "Decker", "M9H 8I5", "Uruguay" ],
        -	[ "1137", "Malcolm", "Maldonado", "S6F 8X6", "Netherlands" ],
        -	[ "1138", "Fay", "Day", "B9R 1U7", "Seychelles" ],
        -	[ "1139", "Charles", "Juarez", "62791", "Virgin Islands, U.S." ],
        -	[ "1140", "Amery", "Stout", "L9A 1F8", "Central African Republic" ],
        -	[ "1141", "Irene", "Ferrell", "52649", "Norway" ],
        -	[ "1142", "Dean", "Stout", "N5C 2S8", "Uruguay" ],
        -	[ "1143", "Eric", "Baxter", "82082", "Chile" ],
        -	[ "1144", "Shelley", "Larsen", "Y4T 4P3", "Antarctica" ],
        -	[ "1145", "Rigel", "Ellis", "E3S 6K8", "Zimbabwe" ],
        -	[ "1146", "Maite", "Rosa", "F6C 5Q9", "Zambia" ],
        -	[ "1147", "Serena", "Blanchard", "99373", "Estonia" ],
        -	[ "1148", "Melanie", "Berger", "C5P 4E2", "Mozambique" ],
        -	[ "1149", "Noah", "Spence", "B8H 7X7", "Martinique" ],
        -	[ "1150", "Elliott", "Pierce", "W5B 8V7", "Swaziland" ],
        -	[ "1151", "Ahmed", "Chang", "E9X 7J0", "Bulgaria" ],
        -	[ "1152", "Ross", "Figueroa", "22458", "China" ],
        -	[ "1153", "Gary", "Calderon", "V3C 4J8", "Algeria" ],
        -	[ "1154", "Montana", "Franklin", "94093", "Haiti" ],
        -	[ "1155", "Rae", "Curry", "45477", "Morocco" ],
        -	[ "1156", "Jillian", "Hogan", "N8L 4B5", "Iceland" ],
        -	[ "1157", "Mia", "Kaufman", "54758", "Burkina Faso" ],
        -	[ "1158", "Remedios", "Wilkerson", "75420", "Saint Vincent and The Grenadines" ],
        -	[ "1159", "Xanthus", "Baldwin", "13961", "Congo" ],
        -	[ "1160", "Madeline", "Gates", "76351", "Saint Helena" ],
        -	[ "1161", "Leroy", "Craig", "12770", "Finland" ],
        -	[ "1162", "Melanie", "Carpenter", "C3B 8L4", "Mayotte" ],
        -	[ "1163", "Ashely", "Mcneil", "E7E 9K5", "French Southern Territories" ],
        -	[ "1164", "Karina", "Mcneil", "39956", "United Arab Emirates" ],
        -	[ "1165", "Nina", "Mills", "92913", "Saint Kitts and Nevis" ],
        -	[ "1166", "Ashton", "Singleton", "73890", "Libyan Arab Jamahiriya" ],
        -	[ "1167", "Meghan", "Black", "31814", "Armenia" ],
        -	[ "1168", "Jolene", "Pope", "U6K 7O6", "Venezuela" ],
        -	[ "1169", "Abel", "Boyd", "37110", "Botswana" ],
        -	[ "1170", "Tiger", "Coffey", "Y6P 3S4", "Faroe Islands" ],
        -	[ "1171", "Aileen", "Rowe", "F7G 8D9", "Netherlands Antilles" ],
        -	[ "1172", "Bryar", "Forbes", "T2N 5H6", "Saint Vincent and The Grenadines" ],
        -	[ "1173", "Vera", "Hoffman", "36299", "Guadeloupe" ],
        -	[ "1174", "Hadassah", "Wright", "S8J 5B2", "Peru" ],
        -	[ "1175", "Bruce", "Blair", "Q8E 7K6", "Cape Verde" ],
        -	[ "1176", "Brianna", "Wolf", "V8S 5A6", "Bahamas" ],
        -	[ "1177", "Kimberley", "Reed", "17652", "Tajikistan" ],
        -	[ "1178", "Colin", "Phelps", "42334", "Brunei Darussalam" ],
        -	[ "1179", "Gil", "Britt", "U3N 6C2", "Swaziland" ],
        -	[ "1180", "Hasad", "Pena", "09526", "United States" ],
        -	[ "1181", "Violet", "Dixon", "48691", "Micronesia" ],
        -	[ "1182", "Uriel", "Bowen", "Z7F 7A7", "Uzbekistan" ],
        -	[ "1183", "Madeline", "Keller", "18227", "Iran, Islamic Republic of" ],
        -	[ "1184", "Buffy", "Mckee", "23861", "Ethiopia" ],
        -	[ "1185", "Doris", "Martin", "V8N 8O7", "Liberia" ],
        -	[ "1186", "Mia", "Burke", "64582", "Virgin Islands, British" ],
        -	[ "1187", "William", "Kemp", "63587", "Tuvalu" ],
        -	[ "1188", "Stacy", "Quinn", "01390", "Nauru" ],
        -	[ "1189", "Halla", "Solomon", "31138", "Pakistan" ],
        -	[ "1190", "Kasimir", "Rodriguez", "67823", "Costa Rica" ],
        -	[ "1191", "Davis", "Lawrence", "27918", "Rwanda" ],
        -	[ "1192", "Nigel", "Bryan", "L5U 2U9", "Seychelles" ],
        -	[ "1193", "Ivana", "Stone", "94862", "Niue" ],
        -	[ "1194", "Naomi", "Yang", "68985", "Haiti" ],
        -	[ "1195", "Roanna", "Brown", "51196", "India" ],
        -	[ "1196", "Colorado", "Chavez", "45634", "Brazil" ],
        -	[ "1197", "Illana", "Levy", "V1A 7R8", "Jordan" ],
        -	[ "1198", "Ali", "Lowe", "N8K 1Y5", "Hungary" ],
        -	[ "1199", "Virginia", "Witt", "Y3O 5W8", "Azerbaijan" ],
        -	[ "1200", "Howard", "Flores", "I9C 3Q7", "Fiji" ],
        -	[ "1201", "Walter", "Odom", "78418", "Thailand" ],
        -	[ "1202", "Thor", "Craig", "00935", "Jamaica" ],
        -	[ "1203", "Petra", "Barry", "E5L 5K5", "Finland" ],
        -	[ "1204", "Lev", "Ellison", "I6S 1K1", "Mongolia" ],
        -	[ "1205", "Roth", "Osborne", "15014", "Swaziland" ],
        -	[ "1206", "Lucius", "Baldwin", "12766", "China" ],
        -	[ "1207", "Candice", "Hyde", "B5E 4B8", "Bahamas" ],
        -	[ "1208", "Maggy", "Bailey", "76781", "Northern Mariana Islands" ],
        -	[ "1209", "Beatrice", "Gregory", "S5S 8S4", "Rwanda" ],
        -	[ "1210", "Adrian", "Bowman", "58500", "Vanuatu" ],
        -	[ "1211", "Brenden", "Chandler", "50326", "Thailand" ],
        -	[ "1212", "Jada", "Richmond", "15990", "Saint Vincent and The Grenadines" ],
        -	[ "1213", "Sawyer", "Page", "G2W 7R7", "Somalia" ],
        -	[ "1214", "Haley", "Jordan", "U7X 4U2", "Equatorial Guinea" ],
        -	[ "1215", "Ruby", "Watson", "30990", "Romania" ],
        -	[ "1216", "Jocelyn", "Knowles", "78987", "Lebanon" ],
        -	[ "1217", "Preston", "Stevenson", "F3L 9B3", "Mali" ],
        -	[ "1218", "Kimberly", "Merritt", "38779", "Venezuela" ],
        -	[ "1219", "Herrod", "Burke", "56225", "French Guiana" ],
        -	[ "1220", "Solomon", "Shannon", "67980", "Cape Verde" ],
        -	[ "1221", "Bradley", "Stokes", "10213", "Botswana" ],
        -	[ "1222", "Grace", "Kinney", "67923", "Montserrat" ],
        -	[ "1223", "Celeste", "Clark", "S7M 6I2", "Guatemala" ],
        -	[ "1224", "Patricia", "Frank", "05615", "Venezuela" ],
        -	[ "1225", "Madonna", "Alford", "10878", "Brunei Darussalam" ],
        -	[ "1226", "May", "Rios", "N7O 2L0", "Georgia" ],
        -	[ "1227", "Driscoll", "Roach", "Y7F 9F8", "Palestinian Territory, Occupied" ],
        -	[ "1228", "Idona", "Cruz", "T6Q 8L4", "Iraq" ],
        -	[ "1229", "Sydney", "Delacruz", "69511", "United Arab Emirates" ],
        -	[ "1230", "Gillian", "Huff", "52624", "French Southern Territories" ],
        -	[ "1231", "Minerva", "Rosario", "29195", "Andorra" ],
        -	[ "1232", "Kerry", "Alvarado", "L3Q 2V5", "Portugal" ],
        -	[ "1233", "Amos", "Bass", "26389", "Holy See (Vatican City State)" ],
        -	[ "1234", "Deanna", "Parks", "57376", "Estonia" ],
        -	[ "1235", "Fitzgerald", "Green", "M3P 9N2", "Slovenia" ],
        -	[ "1236", "Sade", "Hinton", "35561", "Barbados" ],
        -	[ "1237", "Suki", "Parsons", "44591", "Syrian Arab Republic" ],
        -	[ "1238", "Orli", "Weeks", "K2W 9L4", "Peru" ],
        -	[ "1239", "Nicholas", "Copeland", "I5W 7A4", "French Guiana" ],
        -	[ "1240", "Guy", "Vang", "22277", "Pitcairn" ],
        -	[ "1241", "Hunter", "Goodman", "72290", "Malaysia" ],
        -	[ "1242", "Noble", "Rich", "I3B 6T9", "Gibraltar" ],
        -	[ "1243", "Delilah", "Zamora", "96328", "New Zealand" ],
        -	[ "1244", "Sybil", "Mercer", "93665", "Namibia" ],
        -	[ "1245", "Scarlett", "Brock", "Z2E 3J2", "Central African Republic" ],
        -	[ "1246", "Channing", "Alexander", "W5V 8D2", "San Marino" ],
        -	[ "1247", "Carolyn", "Boyle", "Q5Z 9E6", "Gabon" ],
        -	[ "1248", "Irene", "Jennings", "F3H 4O6", "Saint Helena" ],
        -	[ "1249", "Bianca", "Pratt", "66354", "Malaysia" ],
        -	[ "1250", "Dexter", "Cole", "56106", "French Southern Territories" ],
        -	[ "1251", "Berk", "Velez", "26759", "Lesotho" ],
        -	[ "1252", "Barrett", "Richardson", "59446", "Cocos (Keeling) Islands" ],
        -	[ "1253", "Scarlet", "Jacobs", "G9A 7L6", "Dominica" ],
        -	[ "1254", "Aiko", "Brooks", "R6R 9E4", "Liberia" ],
        -	[ "1255", "Jacob", "Moore", "P2Y 6P3", "Cambodia" ],
        -	[ "1256", "Madeline", "Bishop", "D4I 2E7", "Dominican Republic" ],
        -	[ "1257", "Jarrod", "Evans", "C9O 7V7", "Taiwan, Province of China" ],
        -	[ "1258", "Beverly", "Witt", "64850", "Denmark" ],
        -	[ "1259", "Karyn", "Rhodes", "D6G 5Z3", "Cape Verde" ],
        -	[ "1260", "Imani", "Quinn", "01897", "Macao" ],
        -	[ "1261", "Athena", "Eaton", "03568", "Syrian Arab Republic" ],
        -	[ "1262", "Raymond", "Valdez", "21037", "Romania" ],
        -	[ "1263", "Christopher", "Ferguson", "64945", "Indonesia" ],
        -	[ "1264", "Latifah", "Harris", "91381", "Suriname" ],
        -	[ "1265", "Dacey", "Wagner", "81483", "Qatar" ],
        -	[ "1266", "Summer", "Myers", "H6A 1G5", "Angola" ],
        -	[ "1267", "Jasmine", "Rivera", "Y4W 8P2", "Virgin Islands, British" ],
        -	[ "1268", "Cairo", "Massey", "Q6Y 7A7", "Poland" ],
        -	[ "1269", "Jena", "Hill", "89480", "United States Minor Outlying Islands" ],
        -	[ "1270", "Ava", "Benson", "L9H 8V1", "Sri Lanka" ],
        -	[ "1271", "Gillian", "Mercado", "A9W 6V5", "Norway" ],
        -	[ "1272", "Peter", "Marquez", "I5B 3W9", "Guyana" ],
        -	[ "1273", "Price", "Coleman", "X8G 2S0", "Burkina Faso" ],
        -	[ "1274", "Shana", "Harper", "L2B 3U9", "Malaysia" ],
        -	[ "1275", "Serina", "Matthews", "58061", "Lithuania" ],
        -	[ "1276", "Aretha", "Bryant", "Y8J 7A5", "Tonga" ],
        -	[ "1277", "Wesley", "Craig", "20141", "Australia" ],
        -	[ "1278", "Martena", "Mercer", "P6X 2L9", "Sudan" ],
        -	[ "1279", "Tamara", "Dennis", "D3H 9R0", "Mali" ],
        -	[ "1280", "Phelan", "Pena", "D2H 2H7", "United States Minor Outlying Islands" ],
        -	[ "1281", "Rebecca", "Kinney", "B5Z 9S4", "Antarctica" ],
        -	[ "1282", "Josephine", "Delgado", "81010", "Algeria" ],
        -	[ "1283", "Kieran", "Estes", "70093", "Bermuda" ],
        -	[ "1284", "Tamara", "Williamson", "90905", "French Guiana" ],
        -	[ "1285", "Dora", "Serrano", "W8K 6R5", "Nauru" ],
        -	[ "1286", "Morgan", "Bass", "B6F 8R2", "Madagascar" ],
        -	[ "1287", "Margaret", "Austin", "D2C 2C1", "Belgium" ],
        -	[ "1288", "Nasim", "Berry", "J9X 7M5", "Heard Island and Mcdonald Islands" ],
        -	[ "1289", "Jelani", "Rutledge", "34552", "Bolivia" ],
        -	[ "1290", "Cassady", "Hardin", "I2K 4H6", "Hong Kong" ],
        -	[ "1291", "Jenette", "Thornton", "44943", "Uganda" ],
        -	[ "1292", "Alexandra", "Sims", "93937", "Australia" ],
        -	[ "1293", "Ross", "Higgins", "61993", "Nicaragua" ],
        -	[ "1294", "Penelope", "Henson", "90344", "Trinidad and Tobago" ],
        -	[ "1295", "Yoshi", "Blackwell", "C8D 1T4", "Costa Rica" ],
        -	[ "1296", "Daria", "Rodriquez", "X3C 6L0", "Iceland" ],
        -	[ "1297", "Wesley", "Waller", "43947", "Myanmar" ],
        -	[ "1298", "Adam", "Hayden", "88969", "Italy" ],
        -	[ "1299", "Charity", "William", "46439", "Greece" ],
        -	[ "1300", "Ronan", "Hopper", "51955", "Zambia" ],
        -	[ "1301", "Geraldine", "Hatfield", "W9S 7T5", "Luxembourg" ],
        -	[ "1302", "Barry", "Nicholson", "79625", "Liechtenstein" ],
        -	[ "1303", "Donovan", "Ortiz", "68119", "Macao" ],
        -	[ "1304", "Jeanette", "Cooper", "D5P 9L2", "Sri Lanka" ],
        -	[ "1305", "Isadora", "Stephenson", "P4X 4H5", "Mauritania" ],
        -	[ "1306", "Hall", "Hays", "J2Z 2H1", "Svalbard and Jan Mayen" ],
        -	[ "1307", "Idola", "Roberson", "89249", "Niue" ],
        -	[ "1308", "Olympia", "Dennis", "69498", "Guinea" ],
        -	[ "1309", "Naida", "Palmer", "19840", "Gambia" ],
        -	[ "1310", "Maxine", "Rollins", "87856", "Belize" ],
        -	[ "1311", "Rooney", "Phelps", "48424", "Italy" ],
        -	[ "1312", "Shelly", "Edwards", "O7O 1U4", "Mali" ],
        -	[ "1313", "Cassidy", "Holcomb", "98785", "Colombia" ],
        -	[ "1314", "Sybil", "Moran", "F3C 6E4", "Switzerland" ],
        -	[ "1315", "Mufutau", "Larson", "00276", "British Indian Ocean Territory" ],
        -	[ "1316", "Fiona", "Bryant", "U7Y 7N6", "Cocos (Keeling) Islands" ],
        -	[ "1317", "Lenore", "Boyle", "H5G 6P9", "Sudan" ],
        -	[ "1318", "Ignacia", "Avila", "Y5M 1S2", "Romania" ],
        -	[ "1319", "Wendy", "Stein", "25422", "Taiwan, Province of China" ],
        -	[ "1320", "Garrison", "Bass", "B9J 6D9", "Romania" ],
        -	[ "1321", "Curran", "Roy", "X2F 4P2", "Taiwan, Province of China" ],
        -	[ "1322", "Oliver", "Beach", "N6J 1C5", "Kazakhstan" ],
        -	[ "1323", "Bo", "Duran", "D5C 5C2", "Eritrea" ],
        -	[ "1324", "Tashya", "Morrow", "N2J 7O9", "Rwanda" ],
        -	[ "1325", "Cheryl", "Powell", "72413", "Niger" ],
        -	[ "1326", "Justin", "Roth", "18779", "Brunei Darussalam" ],
        -	[ "1327", "Nathaniel", "Foster", "04955", "Bermuda" ],
        -	[ "1328", "Candace", "Nunez", "G7Z 1N2", "Moldova" ],
        -	[ "1329", "Nero", "West", "K3Q 6B3", "Myanmar" ],
        -	[ "1330", "Brendan", "Mcintyre", "C4E 5H7", "Argentina" ],
        -	[ "1331", "Chaney", "Stafford", "V3X 8J4", "Benin" ],
        -	[ "1332", "Sylvia", "Velez", "95851", "Iraq" ],
        -	[ "1333", "Azalia", "Castro", "55986", "Israel" ],
        -	[ "1334", "Emily", "Hogan", "74667", "Botswana" ],
        -	[ "1335", "Buckminster", "Hurst", "N9C 2X6", "Reunion" ],
        -	[ "1336", "Rinah", "Rodriquez", "31896", "Guinea-bissau" ],
        -	[ "1337", "Nash", "Barnett", "Y8X 7H5", "China" ],
        -	[ "1338", "Xanthus", "Barker", "11212", "Trinidad and Tobago" ],
        -	[ "1339", "Minerva", "Huber", "M6M 9U3", "Equatorial Guinea" ],
        -	[ "1340", "Kaseem", "Tillman", "86565", "Bulgaria" ],
        -	[ "1341", "Cassidy", "Dejesus", "93205", "Sierra Leone" ],
        -	[ "1342", "Sheila", "Munoz", "26473", "Benin" ],
        -	[ "1343", "Florence", "Yates", "M5O 1J1", "Russian Federation" ],
        -	[ "1344", "Isadora", "Wagner", "88381", "Philippines" ],
        -	[ "1345", "Hilel", "Kramer", "E5D 4F5", "Lebanon" ],
        -	[ "1346", "Stewart", "Lawson", "67313", "Malaysia" ],
        -	[ "1347", "Ira", "Duffy", "52841", "Greece" ],
        -	[ "1348", "Ignatius", "Robinson", "10035", "Russian Federation" ],
        -	[ "1349", "Baxter", "Carroll", "92288", "Albania" ],
        -	[ "1350", "Palmer", "James", "N5X 5B1", "Germany" ],
        -	[ "1351", "Ava", "Eaton", "76497", "Egypt" ],
        -	[ "1352", "Kiona", "Smith", "09402", "Belize" ],
        -	[ "1353", "Brian", "Barlow", "00156", "Panama" ],
        -	[ "1354", "Nolan", "Rosa", "J2O 9W2", "Uruguay" ],
        -	[ "1355", "Teegan", "Burnett", "02401", "Italy" ],
        -	[ "1356", "Erin", "Knox", "95496", "Egypt" ],
        -	[ "1357", "Amela", "Sanford", "59890", "Virgin Islands, U.S." ],
        -	[ "1358", "Quemby", "Hensley", "17698", "Tuvalu" ],
        -	[ "1359", "Ava", "York", "J1M 1A0", "Nigeria" ],
        -	[ "1360", "Vivien", "Ware", "N9S 1W6", "Bahamas" ],
        -	[ "1361", "Nyssa", "Lamb", "97964", "Estonia" ],
        -	[ "1362", "Brenna", "Slater", "L4P 5V6", "British Indian Ocean Territory" ],
        -	[ "1363", "Kennan", "Larsen", "M2A 4X0", "Angola" ],
        -	[ "1364", "Linda", "Luna", "P8C 4S8", "Gambia" ],
        -	[ "1365", "Boris", "Poole", "U7J 4G1", "Aruba" ],
        -	[ "1366", "Lyle", "Cote", "F5J 3Y2", "Somalia" ],
        -	[ "1367", "Oleg", "Knapp", "K4C 5T8", "Guinea" ],
        -	[ "1368", "Hanae", "Brown", "51395", "Nepal" ],
        -	[ "1369", "India", "Hyde", "E8P 7E8", "Belize" ],
        -	[ "1370", "Madeson", "Hodge", "23265", "Gambia" ],
        -	[ "1371", "Thaddeus", "Hester", "Y7S 5W1", "Saint Helena" ],
        -	[ "1372", "Aaron", "Kemp", "A1Q 8R3", "Albania" ],
        -	[ "1373", "Aurelia", "Thornton", "P8T 9D4", "Swaziland" ],
        -	[ "1374", "Preston", "Sharpe", "97472", "Niue" ],
        -	[ "1375", "Grace", "Gregory", "51767", "Burkina Faso" ],
        -	[ "1376", "Nicole", "Hicks", "81040", "Burkina Faso" ],
        -	[ "1377", "Hall", "Randall", "X1C 7A8", "Cambodia" ],
        -	[ "1378", "Burke", "Silva", "57219", "Romania" ],
        -	[ "1379", "Talon", "Kline", "28200", "Argentina" ],
        -	[ "1380", "Cassady", "Duncan", "Y2M 8F5", "Kenya" ],
        -	[ "1381", "Brielle", "Reed", "06254", "Greece" ],
        -	[ "1382", "Claire", "Stein", "50289", "Viet Nam" ],
        -	[ "1383", "Fleur", "Cabrera", "30131", "Indonesia" ],
        -	[ "1384", "Ella", "Ellison", "Q7Q 4R2", "Netherlands Antilles" ],
        -	[ "1385", "Zachery", "Wolf", "A9Q 6A8", "Jamaica" ],
        -	[ "1386", "Emerson", "Brewer", "Y4R 9M9", "Bosnia and Herzegovina" ],
        -	[ "1387", "Sarah", "Brooks", "27281", "Pitcairn" ],
        -	[ "1388", "Kylan", "Garrison", "S8E 7L8", "Djibouti" ],
        -	[ "1389", "Guinevere", "Mills", "75612", "Comoros" ],
        -	[ "1390", "Claudia", "Stevenson", "73390", "Colombia" ],
        -	[ "1391", "Valentine", "Burton", "Z9P 7R8", "Nauru" ],
        -	[ "1392", "Raymond", "Mclean", "L8W 2K5", "Brunei Darussalam" ],
        -	[ "1393", "Juliet", "Combs", "88712", "Samoa" ],
        -	[ "1394", "Lawrence", "Williamson", "32528", "Netherlands Antilles" ],
        -	[ "1395", "Inga", "Rivers", "12850", "Kuwait" ],
        -	[ "1396", "Mira", "Zimmerman", "D1I 1W2", "Ireland" ],
        -	[ "1397", "Hilda", "Stafford", "11054", "Cuba" ],
        -	[ "1398", "Tanek", "Kim", "88590", "Cayman Islands" ],
        -	[ "1399", "Bryar", "Mcintyre", "H6F 4S5", "Russian Federation" ],
        -	[ "1400", "Sean", "Reed", "P2V 8J9", "Malta" ],
        -	[ "1401", "Serena", "Henderson", "Z5C 8A0", "Madagascar" ],
        -	[ "1402", "Hedley", "Parks", "L8S 6F4", "Angola" ],
        -	[ "1403", "Alice", "Quinn", "06084", "Senegal" ],
        -	[ "1404", "Linda", "Burgess", "H1E 7C0", "Turkmenistan" ],
        -	[ "1405", "Hilda", "Burns", "Q9Q 4S2", "Kyrgyzstan" ],
        -	[ "1406", "Griffith", "Watts", "D4J 7N2", "United States Minor Outlying Islands" ],
        -	[ "1407", "Camden", "Glenn", "12939", "Russian Federation" ],
        -	[ "1408", "Tallulah", "Rush", "G9V 3N2", "Turkey" ],
        -	[ "1409", "Hasad", "Salinas", "H3F 7P9", "Cameroon" ],
        -	[ "1410", "Violet", "Chavez", "T2H 9C6", "Virgin Islands, U.S." ],
        -	[ "1411", "Declan", "Hurley", "32614", "Iran, Islamic Republic of" ],
        -	[ "1412", "Robin", "Dean", "34266", "Northern Mariana Islands" ],
        -	[ "1413", "Mariko", "Avila", "B8F 8Y5", "Burundi" ],
        -	[ "1414", "Bradley", "Pugh", "11453", "Sri Lanka" ],
        -	[ "1415", "Herman", "Hernandez", "F3C 6S2", "Chile" ],
        -	[ "1416", "Montana", "Wynn", "B3M 8M2", "Aruba" ],
        -	[ "1417", "Erin", "Melton", "17022", "France" ],
        -	[ "1418", "Zachery", "Small", "L5O 7O1", "French Southern Territories" ],
        -	[ "1419", "Melanie", "Rivera", "07922", "Korea" ],
        -	[ "1420", "Blossom", "Chase", "75493", "Mauritius" ],
        -	[ "1421", "Stephanie", "Taylor", "U8K 3I9", "Bahamas" ],
        -	[ "1422", "Carter", "Fulton", "T4F 8D1", "Turks and Caicos Islands" ],
        -	[ "1423", "Celeste", "Medina", "75629", "Lebanon" ],
        -	[ "1424", "Katell", "Guzman", "15409", "United Arab Emirates" ],
        -	[ "1425", "Howard", "Rowland", "29003", "Liberia" ],
        -	[ "1426", "Reece", "Taylor", "W8G 7P7", "Samoa" ],
        -	[ "1427", "Bradley", "Peterson", "52568", "Singapore" ],
        -	[ "1428", "Ulric", "Hancock", "07437", "Bolivia" ],
        -	[ "1429", "Francis", "Rogers", "15904", "Albania" ],
        -	[ "1430", "Tatiana", "Mccray", "19604", "Belize" ],
        -	[ "1431", "Merrill", "Rowe", "68539", "Ethiopia" ],
        -	[ "1432", "Kiara", "Taylor", "F6D 8V7", "Burkina Faso" ],
        -	[ "1433", "Buffy", "Shannon", "61880", "Kiribati" ],
        -	[ "1434", "Amber", "Farmer", "K5F 1J7", "Barbados" ],
        -	[ "1435", "Blake", "Wilkins", "O1L 2G2", "Virgin Islands, U.S." ],
        -	[ "1436", "Aimee", "Fulton", "18626", "Chad" ],
        -	[ "1437", "Kai", "Montgomery", "U6S 4W7", "Costa Rica" ],
        -	[ "1438", "Latifah", "Bell", "74589", "Chad" ],
        -	[ "1439", "Ronan", "Herring", "01710", "Palestinian Territory, Occupied" ],
        -	[ "1440", "Macy", "Skinner", "78054", "Gibraltar" ],
        -	[ "1441", "Ignatius", "Berg", "59756", "Liechtenstein" ],
        -	[ "1442", "Prescott", "Pratt", "V6H 6P4", "Kuwait" ],
        -	[ "1443", "Deborah", "Hebert", "11480", "Liberia" ],
        -	[ "1444", "Quentin", "Jones", "G8W 8U6", "Slovenia" ],
        -	[ "1445", "Duncan", "Parsons", "Z9F 5G8", "Cambodia" ],
        -	[ "1446", "Sheila", "George", "18033", "Trinidad and Tobago" ],
        -	[ "1447", "Alyssa", "Padilla", "V3O 6C3", "Qatar" ],
        -	[ "1448", "Amelia", "Orr", "51943", "Canada" ],
        -	[ "1449", "Bethany", "Thomas", "33451", "Liberia" ],
        -	[ "1450", "Kellie", "Pitts", "G4S 1Q3", "Panama" ],
        -	[ "1451", "Stone", "Stout", "L4C 9N0", "Latvia" ],
        -	[ "1452", "Brynne", "Bailey", "B1M 4O0", "Ukraine" ],
        -	[ "1453", "Aquila", "Hurley", "41312", "United Kingdom" ],
        -	[ "1454", "David", "Bradshaw", "11152", "Denmark" ],
        -	[ "1455", "Ryan", "Gates", "Z7O 1U0", "Austria" ],
        -	[ "1456", "Kyle", "Weber", "39871", "Guyana" ],
        -	[ "1457", "Declan", "Moore", "K3B 6L2", "Gibraltar" ],
        -	[ "1458", "Theodore", "Hickman", "W8E 6K1", "Mauritius" ],
        -	[ "1459", "Rebekah", "Merritt", "44042", "Mauritania" ],
        -	[ "1460", "Meredith", "Powell", "98238", "Bhutan" ],
        -	[ "1461", "Paki", "Simmons", "34122", "Norway" ],
        -	[ "1462", "Carissa", "Ballard", "20095", "Antarctica" ],
        -	[ "1463", "James", "Wilson", "96376", "Venezuela" ],
        -	[ "1464", "Pamela", "Gamble", "U7F 7B6", "Turkmenistan" ],
        -	[ "1465", "Rogan", "Davenport", "E6S 4R7", "French Polynesia" ],
        -	[ "1466", "Daphne", "Pearson", "G2H 9M0", "American Samoa" ],
        -	[ "1467", "Maxwell", "Nash", "87205", "Guadeloupe" ],
        -	[ "1468", "Hayes", "Salazar", "55712", "American Samoa" ],
        -	[ "1469", "Justin", "Conner", "03924", "United Kingdom" ],
        -	[ "1470", "Blythe", "Joyner", "T6H 3M0", "Montserrat" ],
        -	[ "1471", "Herrod", "Spears", "19474", "Philippines" ],
        -	[ "1472", "Yvette", "Joyce", "R7Y 7B8", "Botswana" ],
        -	[ "1473", "Chloe", "Reid", "K4Y 1R2", "Philippines" ],
        -	[ "1474", "MacKensie", "Branch", "J5E 3X8", "Saint Kitts and Nevis" ],
        -	[ "1475", "Nasim", "Buchanan", "M4E 4D2", "Portugal" ],
        -	[ "1476", "Aileen", "Rasmussen", "H2V 3F4", "Dominica" ],
        -	[ "1477", "Nicole", "Mullins", "U6Q 9X5", "New Caledonia" ],
        -	[ "1478", "David", "Luna", "11935", "Svalbard and Jan Mayen" ],
        -	[ "1479", "Germaine", "Massey", "G3N 4C7", "Colombia" ],
        -	[ "1480", "Matthew", "Knowles", "V4D 4Z0", "Turkey" ],
        -	[ "1481", "Timon", "Rowe", "14024", "Morocco" ],
        -	[ "1482", "Gail", "Young", "68293", "Bhutan" ],
        -	[ "1483", "Mariam", "Mejia", "O3P 4Q7", "Singapore" ],
        -	[ "1484", "Carla", "Norris", "D7A 3F1", "Liberia" ],
        -	[ "1485", "Ainsley", "Donaldson", "H4Z 1Q8", "Tanzania, United Republic of" ],
        -	[ "1486", "Avye", "Raymond", "44808", "Namibia" ],
        -	[ "1487", "Amanda", "Sargent", "O7F 3S4", "Afghanistan" ],
        -	[ "1488", "Tiger", "Chambers", "I3K 7H4", "United States" ],
        -	[ "1489", "Dylan", "Ford", "04043", "Solomon Islands" ],
        -	[ "1490", "Kaitlin", "Franklin", "99451", "Namibia" ],
        -	[ "1491", "Hayes", "Craft", "D6H 4Y6", "Christmas Island" ],
        -	[ "1492", "Nolan", "Sullivan", "31246", "United States Minor Outlying Islands" ],
        -	[ "1493", "Jennifer", "Romero", "E7I 1R7", "Latvia" ],
        -	[ "1494", "Deanna", "Wall", "36109", "Nepal" ],
        -	[ "1495", "Dara", "Valenzuela", "18359", "Martinique" ],
        -	[ "1496", "Iris", "Blanchard", "84392", "Turks and Caicos Islands" ],
        -	[ "1497", "Rhea", "Burgess", "T7Y 7C5", "Liberia" ],
        -	[ "1498", "Karina", "Small", "B2F 2X5", "Bermuda" ],
        -	[ "1499", "Victor", "Case", "49492", "Vanuatu" ],
        -	[ "1500", "Rose", "Terry", "B4G 8I0", "Timor-leste" ],
        -	[ "1501", "Wyatt", "Berg", "K3B 5N2", "Vanuatu" ],
        -	[ "1502", "Zephania", "Herrera", "E6R 2A5", "Romania" ],
        -	[ "1503", "Felix", "Johns", "X8U 2P1", "Angola" ],
        -	[ "1504", "Melyssa", "George", "M4J 5X8", "Uzbekistan" ],
        -	[ "1505", "Robert", "Spears", "61322", "Papua New Guinea" ],
        -	[ "1506", "Myra", "Wood", "50638", "Afghanistan" ],
        -	[ "1507", "Sean", "Kerr", "40094", "Guadeloupe" ],
        -	[ "1508", "Wesley", "Mcclain", "H7F 1H3", "Mongolia" ],
        -	[ "1509", "Ishmael", "Hoover", "42503", "Czech Republic" ],
        -	[ "1510", "Ocean", "Parker", "L3Z 8G0", "Guyana" ],
        -	[ "1511", "Berk", "Clay", "B6Q 7V7", "Botswana" ],
        -	[ "1512", "Daquan", "Harrison", "78004", "Niger" ],
        -	[ "1513", "Ramona", "Burris", "66986", "Palau" ],
        -	[ "1514", "Jaden", "Miranda", "80086", "Madagascar" ],
        -	[ "1515", "Solomon", "Kirk", "R7M 3M3", "Slovenia" ],
        -	[ "1516", "Tanek", "Rosales", "X5B 5D0", "Tonga" ],
        -	[ "1517", "Jack", "Cooke", "46356", "French Southern Territories" ],
        -	[ "1518", "Naomi", "Sykes", "76541", "Marshall Islands" ],
        -	[ "1519", "Moana", "Vinson", "K4R 3U7", "Saint Pierre and Miquelon" ],
        -	[ "1520", "Kaye", "Sweet", "S6S 2G0", "Dominican Republic" ],
        -	[ "1521", "Bruno", "Beard", "20686", "Israel" ],
        -	[ "1522", "Helen", "Richards", "66393", "Argentina" ],
        -	[ "1523", "Gisela", "Owens", "S8Q 4L3", "Haiti" ],
        -	[ "1524", "Ivy", "Garrett", "P6G 8S8", "United Arab Emirates" ],
        -	[ "1525", "Malik", "Osborne", "78332", "Tajikistan" ],
        -	[ "1526", "Whoopi", "Franco", "T3T 5Y1", "Serbia and Montenegro" ],
        -	[ "1527", "Basil", "Baker", "61233", "Cuba" ],
        -	[ "1528", "Linda", "King", "31410", "Falkland Islands (Malvinas)" ],
        -	[ "1529", "Allegra", "Hobbs", "F2C 9M8", "Andorra" ],
        -	[ "1530", "Kirsten", "Elliott", "T8C 4X3", "Haiti" ],
        -	[ "1531", "Joseph", "Ortiz", "40165", "Falkland Islands (Malvinas)" ],
        -	[ "1532", "Pearl", "Mccormick", "93914", "Falkland Islands (Malvinas)" ],
        -	[ "1533", "Fritz", "Austin", "A3S 7C8", "Canada" ],
        -	[ "1534", "Lunea", "Hickman", "25676", "Cameroon" ],
        -	[ "1535", "Inga", "Cortez", "14707", "Comoros" ],
        -	[ "1536", "Claudia", "Long", "74877", "Tokelau" ],
        -	[ "1537", "Judah", "Williamson", "S9N 6F0", "Paraguay" ],
        -	[ "1538", "Eve", "Beasley", "K8Z 5H7", "Honduras" ],
        -	[ "1539", "Tad", "Lang", "29577", "Equatorial Guinea" ],
        -	[ "1540", "Jack", "Lawson", "46631", "Costa Rica" ],
        -	[ "1541", "Vaughan", "Barron", "N9L 9T4", "Chile" ],
        -	[ "1542", "Solomon", "Bowman", "05734", "Cocos (Keeling) Islands" ],
        -	[ "1543", "Nash", "Giles", "64600", "Denmark" ],
        -	[ "1544", "Xander", "Eaton", "84933", "Bosnia and Herzegovina" ],
        -	[ "1545", "Hanna", "Hull", "61062", "Namibia" ],
        -	[ "1546", "Lee", "Gaines", "V7H 6H7", "Suriname" ],
        -	[ "1547", "Brian", "Sutton", "60055", "Timor-leste" ],
        -	[ "1548", "Azalia", "Henson", "D9J 8E4", "Antarctica" ],
        -	[ "1549", "Russell", "Avila", "01774", "China" ],
        -	[ "1550", "Marsden", "Leblanc", "30201", "New Caledonia" ],
        -	[ "1551", "Tad", "Nichols", "K5V 6N1", "Monaco" ],
        -	[ "1552", "Eliana", "Savage", "06807", "Central African Republic" ],
        -	[ "1553", "Madeline", "Conway", "83513", "Latvia" ],
        -	[ "1554", "Kai", "Caldwell", "S1K 2Q2", "Indonesia" ],
        -	[ "1555", "Wynne", "Goodman", "U9Y 8P7", "Gibraltar" ],
        -	[ "1556", "Nora", "Dudley", "52688", "Netherlands Antilles" ],
        -	[ "1557", "Anastasia", "Gates", "T7T 8C8", "Morocco" ],
        -	[ "1558", "Lester", "Good", "76376", "Heard Island and Mcdonald Islands" ],
        -	[ "1559", "Craig", "Skinner", "S7B 3Z6", "Madagascar" ],
        -	[ "1560", "Kibo", "Craft", "M5C 2I9", "Hong Kong" ],
        -	[ "1561", "Carlos", "Buck", "89343", "Northern Mariana Islands" ],
        -	[ "1562", "Ivor", "Mooney", "M9D 2Y3", "Korea" ],
        -	[ "1563", "Armand", "Shields", "E8O 7X6", "Uzbekistan" ],
        -	[ "1564", "Grace", "Weeks", "G5B 3W5", "Nicaragua" ],
        -	[ "1565", "Reagan", "Mann", "J2E 5I1", "San Marino" ],
        -	[ "1566", "Quin", "Nolan", "Q9E 2Q0", "Turkey" ],
        -	[ "1567", "Kareem", "Jefferson", "91393", "Zambia" ],
        -	[ "1568", "Erica", "Mccoy", "C3P 3L0", "Viet Nam" ],
        -	[ "1569", "Sybill", "Larsen", "J3U 3L9", "Sierra Leone" ],
        -	[ "1570", "Angela", "Weber", "46559", "Croatia" ],
        -	[ "1571", "Mannix", "Noel", "94029", "Belgium" ],
        -	[ "1572", "Martina", "Travis", "20063", "Solomon Islands" ],
        -	[ "1573", "Dominic", "Whitehead", "83547", "Gibraltar" ],
        -	[ "1574", "Vladimir", "Hunter", "L3I 4G7", "Reunion" ],
        -	[ "1575", "Farrah", "Alexander", "18538", "Croatia" ],
        -	[ "1576", "Hop", "Burns", "X1C 7J6", "Saint Lucia" ],
        -	[ "1577", "Zelda", "Trevino", "L8P 7E9", "Guinea" ],
        -	[ "1578", "Nehru", "Decker", "Q1P 4Q9", "Western Sahara" ],
        -	[ "1579", "Shay", "Goff", "68576", "Sweden" ],
        -	[ "1580", "Dominic", "Martin", "C1M 9P2", "Denmark" ],
        -	[ "1581", "Heather", "Doyle", "Y7R 9H1", "Iran, Islamic Republic of" ],
        -	[ "1582", "Honorato", "Rojas", "29414", "India" ],
        -	[ "1583", "Florence", "England", "64669", "China" ],
        -	[ "1584", "Zane", "Reyes", "84771", "Heard Island and Mcdonald Islands" ],
        -	[ "1585", "Scarlett", "Poole", "36928", "Algeria" ],
        -	[ "1586", "Dieter", "Brennan", "Y8V 5L2", "Colombia" ],
        -	[ "1587", "Jamal", "Whitney", "33428", "Turkey" ],
        -	[ "1588", "Evan", "Guy", "72119", "Slovakia" ],
        -	[ "1589", "Candace", "Bauer", "C8L 1P2", "Macedonia" ],
        -	[ "1590", "Naomi", "Pennington", "17350", "Tonga" ],
        -	[ "1591", "Celeste", "Banks", "R8R 4C8", "Anguilla" ],
        -	[ "1592", "Basil", "Elliott", "80065", "Singapore" ],
        -	[ "1593", "Darryl", "Wise", "33140", "Brunei Darussalam" ],
        -	[ "1594", "Marny", "Walls", "S1K 4V1", "Western Sahara" ],
        -	[ "1595", "Anastasia", "Meyer", "Z1F 8C2", "El Salvador" ],
        -	[ "1596", "Brynne", "Rivera", "48070", "Mexico" ],
        -	[ "1597", "Macey", "Johnston", "X9E 9J5", "Guadeloupe" ],
        -	[ "1598", "Bethany", "Marks", "46648", "Bhutan" ],
        -	[ "1599", "Kiayada", "Glass", "13661", "Christmas Island" ],
        -	[ "1600", "Veda", "Bowers", "D7S 1S9", "Korea" ],
        -	[ "1601", "Dante", "Kirk", "58404", "Guinea" ],
        -	[ "1602", "Judah", "Sloan", "04528", "Andorra" ],
        -	[ "1603", "Serena", "Giles", "12139", "Papua New Guinea" ],
        -	[ "1604", "Chase", "Hull", "27203", "Guinea-bissau" ],
        -	[ "1605", "Wallace", "Poole", "58919", "Christmas Island" ],
        -	[ "1606", "Deacon", "Lynn", "Z1H 9G4", "Kenya" ],
        -	[ "1607", "Igor", "Duncan", "X2V 2X1", "Christmas Island" ],
        -	[ "1608", "Walker", "Hopkins", "67256", "Bosnia and Herzegovina" ],
        -	[ "1609", "Serena", "Burnett", "Q4C 7Q0", "Canada" ],
        -	[ "1610", "Hedwig", "Burgess", "O2J 7A5", "Rwanda" ],
        -	[ "1611", "Amal", "Richmond", "34506", "Australia" ],
        -	[ "1612", "Rhona", "Gomez", "W2C 3I7", "Oman" ],
        -	[ "1613", "Kai", "Acosta", "N2O 7M2", "Uganda" ],
        -	[ "1614", "Henry", "Roman", "78113", "Guadeloupe" ],
        -	[ "1615", "Chester", "Good", "88809", "Norway" ],
        -	[ "1616", "Cleo", "Tanner", "73924", "Uganda" ],
        -	[ "1617", "Emi", "Lloyd", "59746", "South Africa" ],
        -	[ "1618", "Christopher", "Lopez", "76264", "Libyan Arab Jamahiriya" ],
        -	[ "1619", "Yvonne", "Mathews", "68655", "Saint Lucia" ],
        -	[ "1620", "Kimberly", "Mullen", "D6J 9G3", "Virgin Islands, British" ],
        -	[ "1621", "Hanna", "Slater", "F8F 9K5", "Montserrat" ],
        -	[ "1622", "Laura", "Dennis", "J6U 2G3", "Viet Nam" ],
        -	[ "1623", "Rogan", "Richards", "R1D 1B3", "Argentina" ],
        -	[ "1624", "Mira", "Rodriquez", "C3D 3E5", "Guinea" ],
        -	[ "1625", "Ezra", "Myers", "Y7Z 7X2", "Kuwait" ],
        -	[ "1626", "Jocelyn", "Martin", "E2F 3F2", "Algeria" ],
        -	[ "1627", "Denton", "Lee", "80903", "Congo" ],
        -	[ "1628", "Grace", "Leach", "86865", "Spain" ],
        -	[ "1629", "Clark", "Morrow", "12834", "Northern Mariana Islands" ],
        -	[ "1630", "Armando", "Calhoun", "I3I 1D4", "Spain" ],
        -	[ "1631", "George", "Decker", "R1B 6Q9", "Mali" ],
        -	[ "1632", "Jerome", "Salazar", "03831", "Faroe Islands" ],
        -	[ "1633", "Logan", "Santiago", "46269", "Hungary" ],
        -	[ "1634", "Gavin", "Tate", "Y3L 6G5", "Italy" ],
        -	[ "1635", "Chloe", "Jennings", "D9B 2H9", "Cambodia" ],
        -	[ "1636", "Rashad", "Knox", "T1V 4G5", "Germany" ],
        -	[ "1637", "Jin", "Roberts", "82928", "Azerbaijan" ],
        -	[ "1638", "Amity", "Guerrero", "F4G 2L4", "Viet Nam" ],
        -	[ "1639", "Carter", "Roberson", "53651", "Niue" ],
        -	[ "1640", "Slade", "Carson", "H9E 1G1", "Guyana" ],
        -	[ "1641", "Buckminster", "Christensen", "F5J 6T5", "Algeria" ],
        -	[ "1642", "Fallon", "Peters", "D9Y 5Q4", "Ethiopia" ],
        -	[ "1643", "Amy", "Barry", "D6F 3R4", "New Caledonia" ],
        -	[ "1644", "Calvin", "Buck", "18354", "Macedonia" ],
        -	[ "1645", "Kaye", "Haynes", "D9K 1X8", "Italy" ],
        -	[ "1646", "Shea", "Hammond", "R7P 3X8", "Guam" ],
        -	[ "1647", "Kiara", "Franks", "01185", "Mozambique" ],
        -	[ "1648", "Armando", "Oneil", "88972", "Bahrain" ],
        -	[ "1649", "Lesley", "Allen", "05171", "Belgium" ],
        -	[ "1650", "Ignatius", "Barrett", "94084", "Georgia" ],
        -	[ "1651", "Graham", "Maldonado", "76354", "Dominican Republic" ],
        -	[ "1652", "Briar", "Roman", "P9M 3A9", "Cayman Islands" ],
        -	[ "1653", "Germane", "Colon", "U3X 7S9", "Brazil" ],
        -	[ "1654", "Alvin", "Mcpherson", "58411", "Guinea" ],
        -	[ "1655", "Belle", "Sandoval", "87172", "Cyprus" ],
        -	[ "1656", "Eric", "Caldwell", "63246", "Guinea" ],
        -	[ "1657", "Nadine", "Dale", "T6E 4B0", "Denmark" ],
        -	[ "1658", "Dora", "Jimenez", "85463", "Nauru" ],
        -	[ "1659", "Mohammad", "Strickland", "H8B 9G2", "Japan" ],
        -	[ "1660", "Reagan", "Preston", "G5E 8S5", "Honduras" ],
        -	[ "1661", "Tamekah", "Daniel", "Z3X 6Q6", "Belarus" ],
        -	[ "1662", "Halee", "Mills", "23332", "Mayotte" ],
        -	[ "1663", "Courtney", "England", "09751", "Saint Kitts and Nevis" ],
        -	[ "1664", "Dai", "Arnold", "A2N 9J4", "Argentina" ],
        -	[ "1665", "Priscilla", "Reyes", "G2B 5M4", "Azerbaijan" ],
        -	[ "1666", "Brenda", "Stanley", "I6O 3I1", "Hungary" ],
        -	[ "1667", "Kasper", "Washington", "H4K 8K7", "Serbia and Montenegro" ],
        -	[ "1668", "Suki", "Hendricks", "L1K 5O9", "Norway" ],
        -	[ "1669", "Rebekah", "Mccormick", "89543", "Slovenia" ],
        -	[ "1670", "Oprah", "Rodriquez", "90034", "Costa Rica" ],
        -	[ "1671", "Ivory", "Matthews", "T9J 2A7", "Panama" ],
        -	[ "1672", "Ferris", "Garner", "93583", "Niue" ],
        -	[ "1673", "Melvin", "White", "X5U 9N8", "Nigeria" ],
        -	[ "1674", "Henry", "Swanson", "E7V 2C9", "Northern Mariana Islands" ],
        -	[ "1675", "Hadassah", "Eaton", "52798", "Albania" ],
        -	[ "1676", "Lisandra", "Sykes", "90838", "Namibia" ],
        -	[ "1677", "Honorato", "Bradshaw", "W3D 1Z9", "United States" ],
        -	[ "1678", "Aurelia", "Paul", "Z6E 6W9", "Malaysia" ],
        -	[ "1679", "Arthur", "Mann", "74673", "Bhutan" ],
        -	[ "1680", "Melissa", "Hernandez", "11742", "Dominican Republic" ],
        -	[ "1681", "Bert", "Mosley", "N2K 5U5", "Kuwait" ],
        -	[ "1682", "Sigourney", "Sharpe", "30204", "South Africa" ],
        -	[ "1683", "Ifeoma", "Woods", "39850", "Haiti" ],
        -	[ "1684", "Tyler", "Medina", "K6L 9V8", "Indonesia" ],
        -	[ "1685", "Karleigh", "Griffin", "G8Z 6W2", "Canada" ],
        -	[ "1686", "Brianna", "Collins", "11919", "New Caledonia" ],
        -	[ "1687", "Allistair", "Hampton", "O1X 2N7", "Cocos (Keeling) Islands" ],
        -	[ "1688", "Carla", "Manning", "76866", "Svalbard and Jan Mayen" ],
        -	[ "1689", "Jakeem", "Brewer", "Y1T 1D7", "Comoros" ],
        -	[ "1690", "Price", "Guerrero", "S7Z 8O1", "Christmas Island" ],
        -	[ "1691", "Harlan", "Sandoval", "58527", "Czech Republic" ],
        -	[ "1692", "Marcia", "Robinson", "64662", "Uganda" ],
        -	[ "1693", "Sylvester", "Hewitt", "81468", "Honduras" ],
        -	[ "1694", "Dawn", "Wood", "77743", "Malawi" ],
        -	[ "1695", "Farrah", "Nielsen", "E4N 9A9", "Christmas Island" ],
        -	[ "1696", "Tanisha", "Benjamin", "L2J 3G7", "Cape Verde" ],
        -	[ "1697", "Cherokee", "Atkins", "L7D 2L5", "Moldova" ],
        -	[ "1698", "Madaline", "Elliott", "H7K 8R4", "Barbados" ],
        -	[ "1699", "Odysseus", "Roy", "65008", "Slovakia" ],
        -	[ "1700", "Eaton", "Stein", "Z2V 7H0", "Moldova" ],
        -	[ "1701", "Rachel", "Hurley", "L6L 2B2", "Antigua and Barbuda" ],
        -	[ "1702", "Stacey", "Hardin", "O9U 1B7", "Montserrat" ],
        -	[ "1703", "Grady", "Montgomery", "75852", "Guinea-bissau" ],
        -	[ "1704", "Serena", "Douglas", "F5M 8Z6", "Mauritius" ],
        -	[ "1705", "Ralph", "Duke", "H7X 3M9", "Tunisia" ],
        -	[ "1706", "Charles", "Moody", "86445", "Pitcairn" ],
        -	[ "1707", "Mariam", "Lara", "07952", "United Kingdom" ],
        -	[ "1708", "Whitney", "Garza", "74001", "Norfolk Island" ],
        -	[ "1709", "Beverly", "Thornton", "69847", "Canada" ],
        -	[ "1710", "Helen", "Gentry", "Z8S 7U4", "Reunion" ],
        -	[ "1711", "Janna", "Gould", "W6C 6E1", "Burundi" ],
        -	[ "1712", "Jana", "Hooper", "A1R 9Y0", "Yemen" ],
        -	[ "1713", "Zachary", "Nicholson", "49616", "Gabon" ],
        -	[ "1714", "Julian", "Davis", "37608", "Anguilla" ],
        -	[ "1715", "Gay", "Knox", "51952", "Croatia" ],
        -	[ "1716", "Iola", "Moses", "16601", "French Polynesia" ],
        -	[ "1717", "Allegra", "Holder", "C9R 8J3", "Dominican Republic" ],
        -	[ "1718", "Cecilia", "Shannon", "62624", "Reunion" ],
        -	[ "1719", "Cora", "Peterson", "I9V 5P5", "Chad" ],
        -	[ "1720", "Stewart", "Mathews", "A5H 1E1", "Mexico" ],
        -	[ "1721", "Kathleen", "Lynn", "82408", "Honduras" ],
        -	[ "1722", "William", "Schneider", "25823", "Tajikistan" ],
        -	[ "1723", "Alice", "Mcconnell", "50155", "Russian Federation" ],
        -	[ "1724", "Timon", "Dillon", "93171", "Croatia" ],
        -	[ "1725", "Tanek", "Ellison", "Y7Q 5B1", "Malawi" ],
        -	[ "1726", "Tamekah", "Cummings", "03764", "Afghanistan" ],
        -	[ "1727", "Charlotte", "Chaney", "U7Y 7B0", "Kyrgyzstan" ],
        -	[ "1728", "Jason", "Conway", "37713", "Martinique" ],
        -	[ "1729", "Graiden", "Combs", "40454", "Turkmenistan" ],
        -	[ "1730", "Virginia", "Ortiz", "K9N 2Q4", "Malta" ],
        -	[ "1731", "Thomas", "Cannon", "W1H 3T9", "Cuba" ],
        -	[ "1732", "Galena", "Dominguez", "68072", "India" ],
        -	[ "1733", "Vaughan", "Petty", "15200", "Lesotho" ],
        -	[ "1734", "Buffy", "Saunders", "K1W 3B1", "Burkina Faso" ],
        -	[ "1735", "Chava", "Hill", "93461", "Iran, Islamic Republic of" ],
        -	[ "1736", "Sage", "Hampton", "R8Y 8J1", "Malta" ],
        -	[ "1737", "Nathaniel", "Whitney", "89097", "Ukraine" ],
        -	[ "1738", "Hector", "Hayden", "70774", "Netherlands" ],
        -	[ "1739", "Mercedes", "Freeman", "80848", "Croatia" ],
        -	[ "1740", "Vance", "Spencer", "25484", "Guyana" ],
        -	[ "1741", "Josephine", "Stevens", "E4D 9D1", "Netherlands Antilles" ],
        -	[ "1742", "Barbara", "Mcclure", "22602", "Cambodia" ],
        -	[ "1743", "Sydney", "Holder", "X4G 1Z7", "British Indian Ocean Territory" ],
        -	[ "1744", "Velma", "Evans", "83914", "New Zealand" ],
        -	[ "1745", "Francis", "Lane", "12545", "Serbia and Montenegro" ],
        -	[ "1746", "Garrison", "Brock", "19993", "Eritrea" ],
        -	[ "1747", "Quentin", "Santiago", "07085", "Norfolk Island" ],
        -	[ "1748", "Ivory", "Wilkerson", "79440", "Libyan Arab Jamahiriya" ],
        -	[ "1749", "Karyn", "Buckner", "D1Y 7D8", "Cocos (Keeling) Islands" ],
        -	[ "1750", "Mari", "Bright", "24721", "Pakistan" ],
        -	[ "1751", "Dexter", "Garrison", "X3X 7G3", "Western Sahara" ],
        -	[ "1752", "Venus", "Acevedo", "V2F 8C0", "Poland" ],
        -	[ "1753", "Nayda", "Camacho", "F6H 6J5", "Northern Mariana Islands" ],
        -	[ "1754", "Avye", "Hartman", "G6V 2H0", "Hong Kong" ],
        -	[ "1755", "Kerry", "Baird", "M3Q 7B7", "Russian Federation" ],
        -	[ "1756", "Uma", "Herman", "C9A 4P3", "Libyan Arab Jamahiriya" ],
        -	[ "1757", "Amaya", "Roman", "97179", "Iceland" ],
        -	[ "1758", "Bruce", "Joyce", "18344", "Denmark" ],
        -	[ "1759", "Jarrod", "Alvarez", "59269", "Liberia" ],
        -	[ "1760", "Olivia", "Reilly", "99058", "Malaysia" ],
        -	[ "1761", "Benedict", "Hensley", "23105", "Uganda" ],
        -	[ "1762", "Lavinia", "Hunter", "44729", "Maldives" ],
        -	[ "1763", "Bradley", "Gomez", "65125", "Belize" ],
        -	[ "1764", "Keely", "Burris", "18390", "Brunei Darussalam" ],
        -	[ "1765", "Autumn", "England", "E5D 7A5", "Kyrgyzstan" ],
        -	[ "1766", "Jane", "Blair", "S1W 4O0", "Bangladesh" ],
        -	[ "1767", "Chancellor", "Barrett", "E9F 1I1", "Fiji" ],
        -	[ "1768", "Whitney", "Morin", "G5T 4E7", "Aruba" ],
        -	[ "1769", "Madeline", "Sparks", "W7L 7E0", "Belize" ],
        -	[ "1770", "Dale", "Estes", "82712", "Guam" ],
        -	[ "1771", "Hakeem", "Buck", "O6K 1I8", "Singapore" ],
        -	[ "1772", "Alexandra", "Burns", "12697", "Portugal" ],
        -	[ "1773", "Winifred", "Gill", "Z8B 8B8", "Uruguay" ],
        -	[ "1774", "Gail", "Gomez", "S1V 3N8", "American Samoa" ],
        -	[ "1775", "Moana", "Brady", "18835", "Wallis and Futuna" ],
        -	[ "1776", "Martha", "Oliver", "81962", "Bolivia" ],
        -	[ "1777", "Nayda", "Wooten", "00071", "Palau" ],
        -	[ "1778", "Bryar", "Collier", "50631", "Mexico" ],
        -	[ "1779", "Penelope", "Bradshaw", "A6A 9M2", "Lebanon" ],
        -	[ "1780", "Wyatt", "Lara", "75486", "Slovenia" ],
        -	[ "1781", "Wang", "Odonnell", "N5X 1N5", "Bahamas" ],
        -	[ "1782", "Chiquita", "Harrell", "21691", "Guadeloupe" ],
        -	[ "1783", "Byron", "Blankenship", "M8A 3L4", "Syrian Arab Republic" ],
        -	[ "1784", "Holmes", "Stokes", "81039", "Mauritania" ],
        -	[ "1785", "Naomi", "Phillips", "56287", "Switzerland" ],
        -	[ "1786", "Quyn", "Johnson", "D2T 6B7", "Czech Republic" ],
        -	[ "1787", "Gillian", "Sanders", "50542", "Colombia" ],
        -	[ "1788", "Hope", "Benjamin", "67423", "Bolivia" ],
        -	[ "1789", "Bryar", "Dean", "U9V 9E5", "Guatemala" ],
        -	[ "1790", "Karyn", "Swanson", "S6H 3R8", "Israel" ],
        -	[ "1791", "Amena", "David", "02286", "French Polynesia" ],
        -	[ "1792", "Ira", "Joyner", "37335", "Cayman Islands" ],
        -	[ "1793", "Tanek", "Oneil", "75041", "Slovenia" ],
        -	[ "1794", "Dolan", "Miles", "K7Q 9U8", "Maldives" ],
        -	[ "1795", "Wang", "Keith", "88116", "Congo" ],
        -	[ "1796", "Wylie", "Bryant", "93369", "Andorra" ],
        -	[ "1797", "Heather", "Bryant", "78015", "French Polynesia" ],
        -	[ "1798", "Regina", "Wagner", "29087", "Virgin Islands, British" ],
        -	[ "1799", "Nathan", "Bush", "J5S 9L0", "Viet Nam" ],
        -	[ "1800", "Charity", "Dawson", "29508", "Greece" ],
        -	[ "1801", "Ulric", "Guzman", "I6R 6P6", "Micronesia" ],
        -	[ "1802", "Keefe", "Scott", "J1R 8T6", "Uzbekistan" ],
        -	[ "1803", "Florence", "Price", "U7P 8F6", "Taiwan, Province of China" ],
        -	[ "1804", "Griffith", "England", "92557", "China" ],
        -	[ "1805", "Kay", "Nielsen", "85991", "Suriname" ],
        -	[ "1806", "Tamekah", "Blackburn", "47324", "Panama" ],
        -	[ "1807", "Indira", "Crosby", "64463", "Trinidad and Tobago" ],
        -	[ "1808", "Pamela", "Vasquez", "K2Q 9A1", "Ghana" ],
        -	[ "1809", "Patricia", "Haley", "51509", "Jordan" ],
        -	[ "1810", "Nevada", "Prince", "41315", "Tokelau" ],
        -	[ "1811", "Martin", "Wilkerson", "Y8X 4Y5", "Palestinian Territory, Occupied" ],
        -	[ "1812", "Deirdre", "Castaneda", "X1S 5E2", "Bahrain" ],
        -	[ "1813", "Cara", "Flynn", "68372", "Azerbaijan" ],
        -	[ "1814", "Sylvia", "Alexander", "E5F 9M5", "Svalbard and Jan Mayen" ],
        -	[ "1815", "Macon", "Suarez", "69866", "Tunisia" ],
        -	[ "1816", "Hammett", "Haney", "09768", "Bangladesh" ],
        -	[ "1817", "Geoffrey", "Simmons", "61986", "Burundi" ],
        -	[ "1818", "Danielle", "Kelly", "71568", "Mali" ],
        -	[ "1819", "Wing", "Brown", "U4D 6L1", "Uzbekistan" ],
        -	[ "1820", "Len", "Barber", "40311", "Suriname" ],
        -	[ "1821", "Richard", "Wilson", "W9E 6D7", "Finland" ],
        -	[ "1822", "Keaton", "Hayes", "55696", "Slovakia" ],
        -	[ "1823", "Dora", "Chaney", "57297", "United States Minor Outlying Islands" ],
        -	[ "1824", "Alexandra", "Pruitt", "17207", "Turkmenistan" ],
        -	[ "1825", "Deanna", "Gomez", "C9M 9K0", "Paraguay" ],
        -	[ "1826", "Laura", "Downs", "74422", "Antigua and Barbuda" ],
        -	[ "1827", "Jolene", "Lucas", "K9E 6U4", "Tokelau" ],
        -	[ "1828", "Lucy", "Marquez", "L1N 4O4", "Argentina" ],
        -	[ "1829", "Abbot", "Bishop", "G8W 7I1", "Guinea-bissau" ],
        -	[ "1830", "Aaron", "Bowman", "K8A 5K7", "Greece" ],
        -	[ "1831", "Candace", "Lee", "58901", "Turks and Caicos Islands" ],
        -	[ "1832", "Larissa", "Allen", "O1I 4X0", "Belgium" ],
        -	[ "1833", "Linda", "Malone", "31211", "United Arab Emirates" ],
        -	[ "1834", "Grace", "Daugherty", "62610", "Cyprus" ],
        -	[ "1835", "Kyra", "Berry", "T2F 3E5", "Netherlands Antilles" ],
        -	[ "1836", "Hadassah", "Willis", "C7H 5V4", "El Salvador" ],
        -	[ "1837", "Kyle", "Fitzgerald", "X1V 2R9", "Croatia" ],
        -	[ "1838", "Graiden", "Atkinson", "L9Q 6H8", "Thailand" ],
        -	[ "1839", "Raymond", "Fletcher", "59574", "Argentina" ],
        -	[ "1840", "Keaton", "Barnett", "O2G 6B4", "Papua New Guinea" ],
        -	[ "1841", "Farrah", "Kramer", "21928", "Netherlands Antilles" ],
        -	[ "1842", "Christian", "Sellers", "55504", "Timor-leste" ],
        -	[ "1843", "Keith", "Cohen", "D9T 7D0", "Italy" ],
        -	[ "1844", "Karleigh", "Bruce", "F2A 5H9", "Montserrat" ],
        -	[ "1845", "Julie", "Avery", "T4T 3Y7", "Nepal" ],
        -	[ "1846", "Hollee", "Deleon", "47524", "Oman" ],
        -	[ "1847", "Charity", "Booker", "61071", "Cocos (Keeling) Islands" ],
        -	[ "1848", "Flynn", "Bond", "E8L 9D2", "Afghanistan" ],
        -	[ "1849", "Sybill", "Roth", "16453", "Saudi Arabia" ],
        -	[ "1850", "Alyssa", "Juarez", "04466", "Singapore" ],
        -	[ "1851", "Jennifer", "Odonnell", "59277", "Tuvalu" ],
        -	[ "1852", "Carissa", "Byrd", "80861", "Palau" ],
        -	[ "1853", "Coby", "Barrett", "04665", "Congo" ],
        -	[ "1854", "Bertha", "Paul", "46442", "Andorra" ],
        -	[ "1855", "Hayden", "Dennis", "K7E 3O1", "France" ],
        -	[ "1856", "Kadeem", "Berry", "39544", "Vanuatu" ],
        -	[ "1857", "Clayton", "Burns", "C2A 6W5", "Andorra" ],
        -	[ "1858", "Breanna", "Hardy", "12284", "Norway" ],
        -	[ "1859", "Yael", "Hester", "69399", "Hong Kong" ],
        -	[ "1860", "Hunter", "Harding", "M4O 6N5", "Bosnia and Herzegovina" ],
        -	[ "1861", "Breanna", "Sutton", "N2C 6K3", "Singapore" ],
        -	[ "1862", "Bo", "Huffman", "54558", "Taiwan, Province of China" ],
        -	[ "1863", "Zena", "Potts", "80326", "Czech Republic" ],
        -	[ "1864", "Lucian", "Sykes", "D4M 6M5", "Trinidad and Tobago" ],
        -	[ "1865", "Gabriel", "Shepherd", "77631", "Bahrain" ],
        -	[ "1866", "Vivian", "Gould", "29510", "Norway" ],
        -	[ "1867", "Ina", "Sherman", "08122", "Portugal" ],
        -	[ "1868", "Constance", "Parsons", "D6E 9J8", "Armenia" ],
        -	[ "1869", "Tallulah", "Woodard", "51380", "Bahamas" ],
        -	[ "1870", "Amos", "Morris", "37846", "Switzerland" ],
        -	[ "1871", "Charles", "Kinney", "45961", "Marshall Islands" ],
        -	[ "1872", "Colby", "Camacho", "02978", "Niger" ],
        -	[ "1873", "Ora", "Hays", "B6F 9Z9", "Martinique" ],
        -	[ "1874", "Ariel", "Cannon", "04559", "Burundi" ],
        -	[ "1875", "Beatrice", "Hull", "66569", "Saint Pierre and Miquelon" ],
        -	[ "1876", "Stacey", "Morrow", "53760", "Zimbabwe" ],
        -	[ "1877", "Naida", "Thomas", "43434", "Virgin Islands, U.S." ],
        -	[ "1878", "Holly", "Holcomb", "31997", "Kazakhstan" ],
        -	[ "1879", "Lee", "Davenport", "99355", "Central African Republic" ],
        -	[ "1880", "Gary", "Higgins", "18703", "Norway" ],
        -	[ "1881", "Kay", "Wolf", "25509", "Switzerland" ],
        -	[ "1882", "Destiny", "Patel", "Q3X 2F8", "Ghana" ],
        -	[ "1883", "Clayton", "Middleton", "Y5C 1I8", "Antigua and Barbuda" ],
        -	[ "1884", "May", "Rivers", "26782", "Uzbekistan" ],
        -	[ "1885", "Hadassah", "Caldwell", "64493", "Chile" ],
        -	[ "1886", "Penelope", "Gentry", "V5N 7A6", "Kyrgyzstan" ],
        -	[ "1887", "James", "Boyle", "95421", "Indonesia" ],
        -	[ "1888", "Yuli", "Cardenas", "W4U 5U1", "Solomon Islands" ],
        -	[ "1889", "George", "Simpson", "30385", "Brazil" ],
        -	[ "1890", "Thaddeus", "Ferrell", "E6Z 2D4", "Norfolk Island" ],
        -	[ "1891", "Piper", "Morrow", "S6I 1L8", "Estonia" ],
        -	[ "1892", "Xaviera", "Heath", "L8I 5G1", "Afghanistan" ],
        -	[ "1893", "Odette", "Patton", "L2S 4I8", "Bosnia and Herzegovina" ],
        -	[ "1894", "Stewart", "Phillips", "E8E 5W6", "El Salvador" ],
        -	[ "1895", "Kellie", "Cooper", "77401", "Cape Verde" ],
        -	[ "1896", "Kathleen", "Salinas", "F3O 4Z9", "Sierra Leone" ],
        -	[ "1897", "Fallon", "Bennett", "X3P 7L1", "Macedonia" ],
        -	[ "1898", "Jesse", "Guerrero", "I2B 1Q0", "Finland" ],
        -	[ "1899", "Zenaida", "Mcguire", "M5R 1X6", "Kenya" ],
        -	[ "1900", "Carolyn", "Richards", "03060", "Paraguay" ],
        -	[ "1901", "Ulla", "Bruce", "20940", "Cambodia" ],
        -	[ "1902", "Adrian", "Shaffer", "M5O 9Y2", "Thailand" ],
        -	[ "1903", "Callum", "Russo", "L3U 5S8", "Holy See (Vatican City State)" ],
        -	[ "1904", "Echo", "Mathews", "49158", "Spain" ],
        -	[ "1905", "Driscoll", "Buckner", "70115", "Solomon Islands" ],
        -	[ "1906", "Nayda", "Phillips", "Y7D 4A9", "Singapore" ],
        -	[ "1907", "Piper", "Livingston", "51701", "Anguilla" ],
        -	[ "1908", "Zoe", "Hoover", "C8D 8W2", "Iraq" ],
        -	[ "1909", "Veronica", "Montoya", "G6B 9S4", "Egypt" ],
        -	[ "1910", "Kato", "Richmond", "41268", "Saint Helena" ],
        -	[ "1911", "Kevyn", "Lancaster", "71863", "Montserrat" ],
        -	[ "1912", "Rowan", "Carr", "90825", "Ethiopia" ],
        -	[ "1913", "Alec", "Wells", "C9P 8I7", "Netherlands" ],
        -	[ "1914", "Graham", "Shields", "S4B 5O9", "Norfolk Island" ],
        -	[ "1915", "Pearl", "Austin", "43642", "Bermuda" ],
        -	[ "1916", "Dana", "Pugh", "H4C 2A9", "Tuvalu" ],
        -	[ "1917", "Lucy", "Ellis", "31272", "Cameroon" ],
        -	[ "1918", "Logan", "Wright", "18651", "Honduras" ],
        -	[ "1919", "Chantale", "Velasquez", "A5D 3X2", "Burundi" ],
        -	[ "1920", "Linda", "Ingram", "R1P 1G8", "Myanmar" ],
        -	[ "1921", "Ginger", "Howell", "Q5D 4E6", "Pakistan" ],
        -	[ "1922", "Unity", "Lester", "P7M 7A4", "Gibraltar" ],
        -	[ "1923", "Brett", "Rutledge", "Q1E 2B4", "Thailand" ],
        -	[ "1924", "Stewart", "Morrow", "84299", "Mali" ],
        -	[ "1925", "Declan", "Aguilar", "35400", "Kenya" ],
        -	[ "1926", "Shad", "Simpson", "N8E 2U3", "Saint Pierre and Miquelon" ],
        -	[ "1927", "Alma", "Benton", "Q6C 5D2", "Pakistan" ],
        -	[ "1928", "Herman", "Bailey", "P5K 2X4", "Ireland" ],
        -	[ "1929", "Keegan", "Mendez", "19421", "Lesotho" ],
        -	[ "1930", "Erasmus", "Foreman", "J9T 1A2", "Panama" ],
        -	[ "1931", "Tarik", "Meyers", "Z8V 5F9", "Cape Verde" ],
        -	[ "1932", "Donovan", "Knox", "B8N 1G7", "Iceland" ],
        -	[ "1933", "Chloe", "Mccray", "67537", "United Arab Emirates" ],
        -	[ "1934", "Marvin", "Edwards", "21809", "Ukraine" ],
        -	[ "1935", "Freya", "Watkins", "80099", "Central African Republic" ],
        -	[ "1936", "Jerry", "Morgan", "C7U 7H5", "Guinea" ],
        -	[ "1937", "Yardley", "Marsh", "23654", "India" ],
        -	[ "1938", "Ava", "Mueller", "83374", "Greece" ],
        -	[ "1939", "Silas", "Joseph", "P5M 7F2", "Sweden" ],
        -	[ "1940", "Winifred", "Solis", "12335", "Viet Nam" ],
        -	[ "1941", "Virginia", "Cantu", "K4C 3S5", "Yemen" ],
        -	[ "1942", "Sade", "Cole", "40295", "Spain" ],
        -	[ "1943", "Ethan", "Hodges", "R7W 8X2", "Congo" ],
        -	[ "1944", "Barbara", "Day", "K6L 7S6", "Nigeria" ],
        -	[ "1945", "Conan", "Simon", "22124", "Guyana" ],
        -	[ "1946", "Lars", "Puckett", "R6Y 4N7", "Trinidad and Tobago" ],
        -	[ "1947", "Quin", "Ewing", "99053", "American Samoa" ],
        -	[ "1948", "Ali", "Haynes", "N6Z 7X0", "China" ],
        -	[ "1949", "Sara", "Wagner", "74544", "Chad" ],
        -	[ "1950", "Griffith", "Fuentes", "R1W 6Z9", "Slovenia" ],
        -	[ "1951", "Sharon", "Crane", "I2Z 9D6", "Philippines" ],
        -	[ "1952", "Marsden", "Acosta", "K6C 8C5", "Jordan" ],
        -	[ "1953", "Whoopi", "Villarreal", "E2O 1T5", "Svalbard and Jan Mayen" ],
        -	[ "1954", "Bruno", "Ball", "31931", "Barbados" ],
        -	[ "1955", "Ulric", "Young", "T4R 3M5", "Solomon Islands" ],
        -	[ "1956", "Noah", "Gonzalez", "L3O 6V5", "Mayotte" ],
        -	[ "1957", "Cheryl", "Gilliam", "F4Q 4H9", "Albania" ],
        -	[ "1958", "Bo", "Rowe", "67020", "Jamaica" ],
        -	[ "1959", "Kelly", "Alexander", "P8Y 9K5", "Somalia" ],
        -	[ "1960", "Hop", "Navarro", "O1G 9R6", "Cayman Islands" ],
        -	[ "1961", "Zachery", "Howard", "67147", "Fiji" ],
        -	[ "1962", "Elvis", "Daugherty", "X8V 7S7", "Jordan" ],
        -	[ "1963", "Mallory", "Hensley", "A5S 1U6", "Swaziland" ],
        -	[ "1964", "Fulton", "Williams", "P4C 4O5", "Viet Nam" ],
        -	[ "1965", "Madison", "Pittman", "F8G 1P9", "Chile" ],
        -	[ "1966", "Kermit", "Bradford", "W2T 6I5", "Uganda" ],
        -	[ "1967", "Gabriel", "Ballard", "N5M 6W0", "Andorra" ],
        -	[ "1968", "Jasmine", "Barber", "M2Z 7G5", "French Guiana" ],
        -	[ "1969", "Thane", "Koch", "21097", "Armenia" ],
        -	[ "1970", "Montana", "Oneal", "L2A 9Q6", "South Africa" ],
        -	[ "1971", "Brett", "Coleman", "79399", "Luxembourg" ],
        -	[ "1972", "Ivy", "Jimenez", "28549", "Senegal" ],
        -	[ "1973", "Shad", "Melton", "Z8N 4Z5", "Cook Islands" ],
        -	[ "1974", "Suki", "Vance", "H1A 1Z3", "Ireland" ],
        -	[ "1975", "Jin", "Hodges", "L2I 3T8", "France" ],
        -	[ "1976", "Diana", "Booth", "M3V 1S8", "Iran, Islamic Republic of" ],
        -	[ "1977", "Martha", "Nunez", "27837", "Northern Mariana Islands" ],
        -	[ "1978", "Silas", "Ayers", "17121", "United States" ],
        -	[ "1979", "Ainsley", "Whitaker", "42695", "Dominica" ],
        -	[ "1980", "Dillon", "Tucker", "N3R 3P3", "Botswana" ],
        -	[ "1981", "Lillian", "West", "57665", "Palau" ],
        -	[ "1982", "Talon", "Hart", "Z6T 4W3", "Serbia and Montenegro" ],
        -	[ "1983", "Desiree", "Booth", "Q1W 9S1", "Gambia" ],
        -	[ "1984", "Chastity", "Merrill", "F3B 9W7", "Puerto Rico" ],
        -	[ "1985", "Nichole", "Leon", "T7V 5D6", "Belize" ],
        -	[ "1986", "Rafael", "Washington", "87676", "Eritrea" ],
        -	[ "1987", "Samson", "Mathews", "G7Q 5V6", "Burkina Faso" ],
        -	[ "1988", "Jasper", "Campbell", "23791", "Thailand" ],
        -	[ "1989", "Mason", "Harrington", "R9R 5S3", "Nigeria" ],
        -	[ "1990", "Jameson", "Frederick", "R1N 4S0", "Guyana" ],
        -	[ "1991", "Cadman", "Woodard", "43080", "Gambia" ],
        -	[ "1992", "Catherine", "Gill", "W4W 8A4", "Philippines" ],
        -	[ "1993", "Yael", "Richards", "99504", "Kenya" ],
        -	[ "1994", "Porter", "Finley", "C8Z 5E0", "Brunei Darussalam" ],
        -	[ "1995", "Alden", "Merritt", "P4E 9F0", "Mali" ],
        -	[ "1996", "Kaye", "Andrews", "I5I 3A4", "Cayman Islands" ],
        -	[ "1997", "Luke", "Bryant", "F3Z 2U1", "Kuwait" ],
        -	[ "1998", "Heather", "Blackburn", "L1T 6B9", "Mongolia" ],
        -	[ "1999", "Gage", "Sykes", "L9Q 7E6", "Palestinian Territory, Occupied" ],
        -	[ "2000", "Kaseem", "Harris", "B9O 1C3", "Korea" ],
        -	[ "2001", "Quail", "Leonard", "88755", "Burkina Faso" ],
        -	[ "2002", "Dennis", "Craft", "13309", "Namibia" ],
        -	[ "2003", "Ivor", "Forbes", "C3P 2E1", "Malta" ],
        -	[ "2004", "Cade", "Herman", "R1E 5X9", "Sri Lanka" ],
        -	[ "2005", "Larissa", "Santiago", "57781", "Dominica" ],
        -	[ "2006", "Hyatt", "Tillman", "45071", "Ghana" ],
        -	[ "2007", "Timothy", "Rodgers", "F8W 9W0", "Andorra" ],
        -	[ "2008", "Hanae", "Powell", "F8B 7P7", "Luxembourg" ],
        -	[ "2009", "Ima", "Pennington", "Z5W 5N5", "Latvia" ],
        -	[ "2010", "Laurel", "Bell", "16805", "Venezuela" ],
        -	[ "2011", "Avye", "Long", "04794", "Dominica" ],
        -	[ "2012", "Lysandra", "Pierce", "H7O 3F4", "Zimbabwe" ],
        -	[ "2013", "Eve", "Pollard", "L5K 6E2", "Algeria" ],
        -	[ "2014", "Ina", "Mcdowell", "65712", "Saint Lucia" ],
        -	[ "2015", "Meredith", "Serrano", "V8M 6K7", "Libyan Arab Jamahiriya" ],
        -	[ "2016", "Daphne", "Irwin", "89933", "Mongolia" ],
        -	[ "2017", "Adam", "Henson", "F6U 9D5", "Chile" ],
        -	[ "2018", "Amery", "Hoover", "13408", "Mongolia" ],
        -	[ "2019", "Quamar", "Hendricks", "20310", "Gambia" ],
        -	[ "2020", "Ori", "Wheeler", "89005", "Nigeria" ],
        -	[ "2021", "Zena", "Douglas", "Z1O 6F9", "Serbia and Montenegro" ],
        -	[ "2022", "Buckminster", "Huffman", "R4V 9L2", "Mali" ],
        -	[ "2023", "Harlan", "Gamble", "U4I 7M4", "Guyana" ],
        -	[ "2024", "Dalton", "Cline", "63829", "Tonga" ],
        -	[ "2025", "Martha", "Weber", "Z9B 4T0", "Bangladesh" ],
        -	[ "2026", "Vernon", "Francis", "M5A 9X7", "Tokelau" ],
        -	[ "2027", "Janna", "Velazquez", "67406", "Qatar" ],
        -	[ "2028", "Fuller", "Keller", "80871", "Burkina Faso" ],
        -	[ "2029", "Jamal", "Spears", "42197", "Norfolk Island" ],
        -	[ "2030", "Christen", "Holcomb", "29806", "Norway" ],
        -	[ "2031", "Mary", "Carter", "C6W 9K9", "Belgium" ],
        -	[ "2032", "Colorado", "Austin", "62904", "Cook Islands" ],
        -	[ "2033", "Fritz", "Hunt", "X8G 2V0", "Morocco" ],
        -	[ "2034", "Isabella", "Bush", "17676", "Monaco" ],
        -	[ "2035", "Adam", "Gilliam", "H7K 9X3", "Indonesia" ],
        -	[ "2036", "John", "Austin", "O7X 4Z0", "Czech Republic" ],
        -	[ "2037", "Cassady", "Yates", "68835", "Christmas Island" ],
        -	[ "2038", "Ori", "Cantrell", "56920", "Guinea" ],
        -	[ "2039", "May", "Horn", "47805", "Kuwait" ],
        -	[ "2040", "Skyler", "Clarke", "64131", "Lebanon" ],
        -	[ "2041", "Levi", "Foster", "S5Q 4B2", "Germany" ],
        -	[ "2042", "Veda", "Wilkinson", "L7Z 9M8", "Niger" ],
        -	[ "2043", "Brendan", "Levine", "L5B 9P4", "Nepal" ],
        -	[ "2044", "Carson", "Sullivan", "93066", "United Arab Emirates" ],
        -	[ "2045", "Steven", "Spencer", "F1V 9A7", "Pitcairn" ],
        -	[ "2046", "Halla", "Michael", "N1U 1E7", "Seychelles" ],
        -	[ "2047", "Jamal", "Hobbs", "G3D 6J7", "New Caledonia" ],
        -	[ "2048", "Steel", "Bush", "U8F 6T2", "Belize" ],
        -	[ "2049", "Ahmed", "Dennis", "M6E 3P3", "Afghanistan" ],
        -	[ "2050", "Aspen", "Estes", "32157", "American Samoa" ],
        -	[ "2051", "Peter", "Kelly", "91773", "Morocco" ],
        -	[ "2052", "Xandra", "Grimes", "66702", "Tokelau" ],
        -	[ "2053", "Michael", "Battle", "J2J 2N5", "Honduras" ],
        -	[ "2054", "Steel", "Wiggins", "34625", "United States Minor Outlying Islands" ],
        -	[ "2055", "Holmes", "Christian", "45402", "Liechtenstein" ],
        -	[ "2056", "Charles", "Barrett", "O4N 9N8", "Lebanon" ],
        -	[ "2057", "Hermione", "Soto", "C8E 4H8", "Congo" ],
        -	[ "2058", "Elton", "Maxwell", "89033", "Madagascar" ],
        -	[ "2059", "Zelda", "Burks", "B7W 5G7", "Sweden" ],
        -	[ "2060", "Lynn", "David", "P3D 5K5", "Chad" ],
        -	[ "2061", "Margaret", "Neal", "47438", "Western Sahara" ],
        -	[ "2062", "David", "Vaughan", "E3L 8D9", "Tokelau" ],
        -	[ "2063", "Vladimir", "Mcfarland", "U9V 1B3", "Belgium" ],
        -	[ "2064", "Uriah", "Harrington", "77051", "United Arab Emirates" ],
        -	[ "2065", "Noel", "Merritt", "J3G 7S1", "Dominican Republic" ],
        -	[ "2066", "Christine", "Key", "54543", "Niger" ],
        -	[ "2067", "Illana", "Hendricks", "07584", "Montserrat" ],
        -	[ "2068", "Pearl", "Lewis", "U5D 2V3", "Libyan Arab Jamahiriya" ],
        -	[ "2069", "Victoria", "Bullock", "17462", "Mauritania" ],
        -	[ "2070", "Benedict", "Marsh", "61479", "Guyana" ],
        -	[ "2071", "Quemby", "Washington", "99774", "French Polynesia" ],
        -	[ "2072", "Shelley", "Noble", "U8S 5Z4", "Philippines" ],
        -	[ "2073", "Olivia", "Britt", "72344", "Holy See (Vatican City State)" ],
        -	[ "2074", "Oleg", "Hendrix", "67567", "Cuba" ],
        -	[ "2075", "Hermione", "Gutierrez", "J5K 2J1", "Mozambique" ],
        -	[ "2076", "Myra", "Dean", "03485", "Andorra" ],
        -	[ "2077", "Deacon", "Moore", "34501", "Tunisia" ],
        -	[ "2078", "Dai", "Baird", "B2P 4R0", "Cambodia" ],
        -	[ "2079", "Levi", "Melton", "K7T 4B1", "Zimbabwe" ],
        -	[ "2080", "Ocean", "Dalton", "66801", "Gabon" ],
        -	[ "2081", "Selma", "Harding", "D7N 3J9", "Kyrgyzstan" ],
        -	[ "2082", "Maisie", "Gill", "56324", "Morocco" ],
        -	[ "2083", "Hillary", "Horne", "Y6O 6G3", "Cyprus" ],
        -	[ "2084", "Joel", "Stokes", "77952", "Burundi" ],
        -	[ "2085", "Channing", "Patterson", "G6B 8H4", "China" ],
        -	[ "2086", "Elliott", "Cleveland", "H3J 9U9", "Namibia" ],
        -	[ "2087", "Petra", "Gay", "44314", "Palestinian Territory, Occupied" ],
        -	[ "2088", "May", "Hatfield", "48918", "Faroe Islands" ],
        -	[ "2089", "Jemima", "Francis", "14347", "Libyan Arab Jamahiriya" ],
        -	[ "2090", "Kyla", "Hale", "46200", "Cocos (Keeling) Islands" ],
        -	[ "2091", "Veda", "Bruce", "F5W 9A6", "Mauritania" ],
        -	[ "2092", "Sybill", "Avila", "58663", "Angola" ],
        -	[ "2093", "Charissa", "Salazar", "35271", "Faroe Islands" ],
        -	[ "2094", "Steven", "Allison", "E5L 4A3", "Wallis and Futuna" ],
        -	[ "2095", "Kane", "Parks", "D5C 6K7", "Norfolk Island" ],
        -	[ "2096", "Alika", "Bishop", "S3P 3O3", "China" ],
        -	[ "2097", "James", "Bonner", "33277", "Canada" ],
        -	[ "2098", "Yoko", "Foster", "B5J 6P9", "Croatia" ],
        -	[ "2099", "Ivy", "Riggs", "94420", "Kiribati" ],
        -	[ "2100", "Urielle", "Rosa", "V6W 2A0", "Falkland Islands (Malvinas)" ],
        -	[ "2101", "Armando", "Shepherd", "Y5C 5W6", "Panama" ],
        -	[ "2102", "Haley", "Ingram", "B4H 5U5", "Fiji" ],
        -	[ "2103", "Brielle", "Dyer", "P2S 4H7", "Malawi" ],
        -	[ "2104", "Francis", "Brady", "24239", "Uruguay" ],
        -	[ "2105", "Fiona", "Webster", "72015", "Belize" ],
        -	[ "2106", "Aiko", "Santos", "K4H 1N0", "Saint Vincent and The Grenadines" ],
        -	[ "2107", "Amir", "Rivas", "02737", "Papua New Guinea" ],
        -	[ "2108", "Mira", "Kerr", "W6E 6Y2", "Sri Lanka" ],
        -	[ "2109", "Harrison", "Jensen", "50193", "Heard Island and Mcdonald Islands" ],
        -	[ "2110", "Merrill", "Randall", "21534", "Colombia" ],
        -	[ "2111", "Benjamin", "Howe", "N8M 4N6", "Turkmenistan" ],
        -	[ "2112", "Melyssa", "Kidd", "97657", "Cameroon" ],
        -	[ "2113", "Henry", "Moore", "95626", "Botswana" ],
        -	[ "2114", "Nash", "Peters", "K3V 9F3", "Wallis and Futuna" ],
        -	[ "2115", "Iliana", "Holt", "E9F 2Q8", "Netherlands Antilles" ],
        -	[ "2116", "Naomi", "Hood", "P6D 2G3", "Anguilla" ],
        -	[ "2117", "Ainsley", "Barron", "94273", "New Caledonia" ],
        -	[ "2118", "Daphne", "Acevedo", "A9I 9E4", "Bermuda" ],
        -	[ "2119", "Kiona", "Keith", "62523", "Saint Lucia" ],
        -	[ "2120", "Kirsten", "Mcgee", "97481", "Macedonia" ],
        -	[ "2121", "Emerald", "Franklin", "Q2I 6D6", "Botswana" ],
        -	[ "2122", "Hall", "Schroeder", "I2D 9L7", "Kenya" ],
        -	[ "2123", "Amaya", "Lynch", "50534", "Costa Rica" ],
        -	[ "2124", "Randall", "Hanson", "B4R 2S3", "United Arab Emirates" ],
        -	[ "2125", "Sasha", "Clarke", "50972", "United States Minor Outlying Islands" ],
        -	[ "2126", "Susan", "Sutton", "Z4T 6K3", "Solomon Islands" ],
        -	[ "2127", "Hiram", "Torres", "C8O 5O7", "Botswana" ],
        -	[ "2128", "Melanie", "Calhoun", "87097", "New Zealand" ],
        -	[ "2129", "Courtney", "Sutton", "07944", "Spain" ],
        -	[ "2130", "Reuben", "Beard", "U6Z 8N5", "Faroe Islands" ],
        -	[ "2131", "Jarrod", "Payne", "94171", "Turkey" ],
        -	[ "2132", "Vincent", "Potts", "V5Z 9G9", "Madagascar" ],
        -	[ "2133", "Kaye", "Kent", "O1B 2Z9", "Fiji" ],
        -	[ "2134", "Carol", "Green", "78719", "Comoros" ],
        -	[ "2135", "Cairo", "Combs", "G3C 8F0", "Indonesia" ],
        -	[ "2136", "Ebony", "Parker", "77377", "Portugal" ],
        -	[ "2137", "Gary", "Shaffer", "F1B 9W7", "French Guiana" ],
        -	[ "2138", "Gay", "Jimenez", "05726", "Nepal" ],
        -	[ "2139", "Patience", "Bryan", "60437", "Macao" ],
        -	[ "2140", "Zenaida", "Bowen", "V3S 1G7", "Mauritania" ],
        -	[ "2141", "Isaac", "Aguirre", "X8S 9K4", "Bermuda" ],
        -	[ "2142", "Lacy", "Harrell", "67362", "Bhutan" ],
        -	[ "2143", "Jael", "Grimes", "95612", "Anguilla" ],
        -	[ "2144", "Catherine", "Galloway", "45834", "Suriname" ],
        -	[ "2145", "Donna", "Burt", "N8C 2M8", "Burkina Faso" ],
        -	[ "2146", "Colleen", "Ball", "N3E 4U8", "Libyan Arab Jamahiriya" ],
        -	[ "2147", "Lael", "Brady", "01369", "Macedonia" ],
        -	[ "2148", "Kermit", "Logan", "Y5P 8Q8", "Honduras" ],
        -	[ "2149", "Katelyn", "Orr", "R7X 9W3", "Switzerland" ],
        -	[ "2150", "Alisa", "Glenn", "17831", "Timor-leste" ],
        -	[ "2151", "Lee", "Bean", "89445", "Guam" ],
        -	[ "2152", "Maryam", "Cotton", "57924", "Gambia" ],
        -	[ "2153", "Amena", "Love", "X1Z 6F7", "Thailand" ],
        -	[ "2154", "Tallulah", "Case", "87477", "Ecuador" ],
        -	[ "2155", "Carlos", "Sanford", "F6S 8J6", "Iraq" ],
        -	[ "2156", "Quamar", "David", "D5F 2M8", "Gabon" ],
        -	[ "2157", "Cassady", "Mays", "12786", "Netherlands" ],
        -	[ "2158", "Jenna", "Rowland", "88845", "China" ],
        -	[ "2159", "Justin", "Tanner", "66071", "Nepal" ],
        -	[ "2160", "Riley", "Santiago", "F8K 2Y6", "Gabon" ],
        -	[ "2161", "Iris", "Gallegos", "K9C 3T9", "Niue" ],
        -	[ "2162", "Kato", "Osborn", "N4C 2L8", "Puerto Rico" ],
        -	[ "2163", "Imogene", "Schroeder", "79710", "United States Minor Outlying Islands" ],
        -	[ "2164", "Olympia", "Hebert", "D4W 1L0", "Saint Lucia" ],
        -	[ "2165", "Skyler", "Burnett", "B2R 5H7", "Antarctica" ],
        -	[ "2166", "Faith", "Sims", "88476", "Egypt" ],
        -	[ "2167", "Emily", "Odom", "U7O 2P6", "Kuwait" ],
        -	[ "2168", "Carly", "Washington", "46063", "Benin" ],
        -	[ "2169", "Jolene", "Meyer", "B2B 9A4", "Australia" ],
        -	[ "2170", "Ayanna", "Conrad", "84360", "Northern Mariana Islands" ],
        -	[ "2171", "Violet", "Blankenship", "W2B 3U1", "New Caledonia" ],
        -	[ "2172", "Rhona", "Gallegos", "10931", "Montserrat" ],
        -	[ "2173", "Alice", "Hodges", "96181", "Burkina Faso" ],
        -	[ "2174", "Brody", "Sandoval", "68959", "Pitcairn" ],
        -	[ "2175", "Isabella", "Dunlap", "U8U 7Y8", "Afghanistan" ],
        -	[ "2176", "Jordan", "Golden", "55152", "Guam" ],
        -	[ "2177", "Gillian", "Thomas", "75633", "Djibouti" ],
        -	[ "2178", "Hollee", "Clay", "79847", "Panama" ],
        -	[ "2179", "Dane", "Knapp", "89535", "Armenia" ],
        -	[ "2180", "Avram", "Martin", "T4S 4E2", "Madagascar" ],
        -	[ "2181", "Fuller", "Newman", "47317", "Jamaica" ],
        -	[ "2182", "Nina", "Berry", "81360", "Mongolia" ],
        -	[ "2183", "Akeem", "Pratt", "56230", "Colombia" ],
        -	[ "2184", "Lacy", "Hayes", "U7T 4F5", "Cyprus" ],
        -	[ "2185", "Alfonso", "Mcclure", "06797", "Swaziland" ],
        -	[ "2186", "Cedric", "Love", "64720", "Bermuda" ],
        -	[ "2187", "Astra", "Fernandez", "H3I 1B0", "Mongolia" ],
        -	[ "2188", "Iliana", "Durham", "R8C 7M8", "Spain" ],
        -	[ "2189", "Gwendolyn", "Livingston", "C7X 5L1", "Northern Mariana Islands" ],
        -	[ "2190", "Caldwell", "Anderson", "69099", "Kuwait" ],
        -	[ "2191", "Risa", "Mejia", "P7A 4U7", "Israel" ],
        -	[ "2192", "Dora", "Navarro", "L6G 2O8", "Ireland" ],
        -	[ "2193", "Kirk", "Dean", "I2T 3E6", "Pitcairn" ],
        -	[ "2194", "Jackson", "Harvey", "53467", "Myanmar" ],
        -	[ "2195", "Thane", "Ballard", "87240", "Solomon Islands" ],
        -	[ "2196", "Nadine", "Estes", "62003", "Malta" ],
        -	[ "2197", "Candace", "Nunez", "57223", "Virgin Islands, British" ],
        -	[ "2198", "Zelda", "Odom", "X4V 7F5", "Mongolia" ],
        -	[ "2199", "Wylie", "Ayala", "S4I 4Q4", "Djibouti" ],
        -	[ "2200", "Azalia", "Page", "57239", "Korea, Republic of" ],
        -	[ "2201", "Joshua", "Burch", "R7B 1N7", "Samoa" ],
        -	[ "2202", "Basil", "Ramos", "71614", "Tunisia" ],
        -	[ "2203", "Jessica", "Shields", "U2D 4X3", "Syrian Arab Republic" ],
        -	[ "2204", "Clio", "Singleton", "I1B 1B0", "Ghana" ],
        -	[ "2205", "Astra", "Dotson", "62378", "Turks and Caicos Islands" ],
        -	[ "2206", "Hamish", "Tucker", "E4Z 3N3", "Anguilla" ],
        -	[ "2207", "Rachel", "Matthews", "U4I 8M3", "Trinidad and Tobago" ],
        -	[ "2208", "Clayton", "Ball", "95319", "India" ],
        -	[ "2209", "Quinn", "Wilkinson", "Y6M 3Q7", "Virgin Islands, U.S." ],
        -	[ "2210", "Phelan", "Talley", "00543", "Philippines" ],
        -	[ "2211", "Carol", "Brock", "M6X 4E2", "Gibraltar" ],
        -	[ "2212", "Nomlanga", "Robles", "56511", "Viet Nam" ],
        -	[ "2213", "Adrian", "Clay", "79479", "France" ],
        -	[ "2214", "Sara", "Riley", "B9N 5P4", "Peru" ],
        -	[ "2215", "Christine", "Sweeney", "W1Z 4S4", "French Polynesia" ],
        -	[ "2216", "Leilani", "Johnston", "W1C 8M8", "American Samoa" ],
        -	[ "2217", "Melyssa", "Lambert", "V1B 4P6", "Iraq" ],
        -	[ "2218", "Talon", "Delacruz", "Y3N 9R2", "Bulgaria" ],
        -	[ "2219", "Garth", "Jennings", "59667", "Malta" ],
        -	[ "2220", "Naida", "Coleman", "45456", "Finland" ],
        -	[ "2221", "Indigo", "Lopez", "77160", "Pitcairn" ],
        -	[ "2222", "Asher", "French", "99064", "British Indian Ocean Territory" ],
        -	[ "2223", "Vivian", "Mcgowan", "46310", "Oman" ],
        -	[ "2224", "Gwendolyn", "Cervantes", "48905", "Cocos (Keeling) Islands" ],
        -	[ "2225", "Logan", "Reid", "87376", "Ethiopia" ],
        -	[ "2226", "Bryar", "Wolfe", "75860", "Comoros" ],
        -	[ "2227", "Demetrius", "Hutchinson", "97252", "Dominican Republic" ],
        -	[ "2228", "Freya", "Becker", "04872", "United States" ],
        -	[ "2229", "Abel", "Brooks", "I7O 1M1", "Comoros" ],
        -	[ "2230", "Silas", "Mcguire", "04101", "Indonesia" ],
        -	[ "2231", "Quinn", "Fletcher", "B6E 2B0", "Niger" ],
        -	[ "2232", "Rooney", "Holden", "29294", "Micronesia" ],
        -	[ "2233", "Iris", "Hale", "N7W 6E9", "Greenland" ],
        -	[ "2234", "Candace", "Barry", "U8I 5A4", "Germany" ],
        -	[ "2235", "Yetta", "Ball", "62055", "Switzerland" ],
        -	[ "2236", "Dai", "Bentley", "P2Y 4C5", "Dominica" ],
        -	[ "2237", "Gannon", "Dunlap", "45728", "Fiji" ],
        -	[ "2238", "Chelsea", "Mays", "36498", "Guinea" ],
        -	[ "2239", "Ruth", "Mcguire", "62924", "Maldives" ],
        -	[ "2240", "Melissa", "Durham", "D6S 1A2", "Armenia" ],
        -	[ "2241", "Eaton", "Salinas", "53689", "Somalia" ],
        -	[ "2242", "Driscoll", "Cunningham", "31194", "Sweden" ],
        -	[ "2243", "Bevis", "Acosta", "V4M 9Z2", "Jamaica" ],
        -	[ "2244", "Anastasia", "Mcknight", "24878", "Sao Tome and Principe" ],
        -	[ "2245", "Anika", "Rowland", "45287", "Chile" ],
        -	[ "2246", "Dexter", "Rollins", "00684", "Iran, Islamic Republic of" ],
        -	[ "2247", "Brielle", "Irwin", "V4U 7R2", "Belgium" ],
        -	[ "2248", "Ocean", "Fields", "08544", "Croatia" ],
        -	[ "2249", "Sonia", "Solis", "C4X 1L5", "Niue" ],
        -	[ "2250", "Joseph", "Haney", "29567", "Argentina" ],
        -	[ "2251", "Lamar", "Heath", "81699", "Italy" ],
        -	[ "2252", "Raya", "Jordan", "R6K 7B3", "Spain" ],
        -	[ "2253", "Brody", "Frost", "34564", "Dominican Republic" ],
        -	[ "2254", "Ann", "Hawkins", "S3A 5K7", "Yemen" ],
        -	[ "2255", "Phillip", "Lindsay", "80544", "Sierra Leone" ],
        -	[ "2256", "Willa", "Maynard", "A6A 4C5", "Mexico" ],
        -	[ "2257", "Carolyn", "Mercer", "V8Z 1X5", "Zimbabwe" ],
        -	[ "2258", "Justin", "Cole", "68764", "Saint Vincent and The Grenadines" ],
        -	[ "2259", "Emmanuel", "Parks", "99769", "Latvia" ],
        -	[ "2260", "Isaiah", "Salazar", "H1K 1X3", "Turks and Caicos Islands" ],
        -	[ "2261", "Vance", "Porter", "49607", "Costa Rica" ],
        -	[ "2262", "Igor", "Kim", "99489", "Turkmenistan" ],
        -	[ "2263", "Emi", "Graves", "F4M 5L8", "El Salvador" ],
        -	[ "2264", "Griffith", "Monroe", "11550", "Tanzania, United Republic of" ],
        -	[ "2265", "Iliana", "Coffey", "30220", "Albania" ],
        -	[ "2266", "Jemima", "Guthrie", "69283", "Saint Pierre and Miquelon" ],
        -	[ "2267", "Zenia", "Farrell", "91872", "Tanzania, United Republic of" ],
        -	[ "2268", "Lucas", "Chambers", "L5Z 1W0", "Bouvet Island" ],
        -	[ "2269", "Zenaida", "Valenzuela", "31700", "Guam" ],
        -	[ "2270", "Bradley", "Wynn", "21222", "Lithuania" ],
        -	[ "2271", "Maite", "Richard", "H4D 7X0", "Cameroon" ],
        -	[ "2272", "Moses", "House", "Y3Z 3K7", "Saint Vincent and The Grenadines" ],
        -	[ "2273", "Erich", "Petersen", "U4N 9R7", "Rwanda" ],
        -	[ "2274", "Stephanie", "Zimmerman", "70097", "Malawi" ],
        -	[ "2275", "Rylee", "Schneider", "15645", "Gibraltar" ],
        -	[ "2276", "Zia", "Craig", "H1K 1N9", "Norway" ],
        -	[ "2277", "Fiona", "Chaney", "Y4U 7K8", "San Marino" ],
        -	[ "2278", "Gil", "Sherman", "64720", "Wallis and Futuna" ],
        -	[ "2279", "Raja", "Sandoval", "11225", "Lithuania" ],
        -	[ "2280", "Illana", "Wyatt", "A2M 9O2", "Brazil" ],
        -	[ "2281", "Declan", "Howell", "E9V 8J5", "San Marino" ],
        -	[ "2282", "Warren", "Cooper", "47160", "Guyana" ],
        -	[ "2283", "Alyssa", "Juarez", "S7G 8F2", "Sweden" ],
        -	[ "2284", "Quynn", "Long", "P1P 5Y4", "Mexico" ],
        -	[ "2285", "Dalton", "Booker", "I5T 1R3", "Mauritius" ],
        -	[ "2286", "Lunea", "Mclaughlin", "I3F 6D4", "Togo" ],
        -	[ "2287", "Irene", "Brock", "04760", "Tajikistan" ],
        -	[ "2288", "Raven", "Floyd", "R2N 2Y5", "Philippines" ],
        -	[ "2289", "Nichole", "Farmer", "81213", "Seychelles" ],
        -	[ "2290", "Sophia", "Mcdonald", "86291", "Chile" ],
        -	[ "2291", "Nehru", "Matthews", "60732", "Central African Republic" ],
        -	[ "2292", "Marah", "Nelson", "44533", "Kenya" ],
        -	[ "2293", "Marvin", "Lyons", "M7Y 1Q6", "Somalia" ],
        -	[ "2294", "Ian", "Fernandez", "D9U 8B6", "Turkey" ],
        -	[ "2295", "Gretchen", "Dotson", "48294", "China" ],
        -	[ "2296", "Brady", "Weaver", "S4U 4I8", "Burundi" ],
        -	[ "2297", "Ella", "Salas", "73771", "Sao Tome and Principe" ],
        -	[ "2298", "Martha", "Irwin", "06554", "Timor-leste" ],
        -	[ "2299", "Penelope", "Pratt", "S1R 4L4", "Gabon" ],
        -	[ "2300", "Kenyon", "Dale", "64548", "Zimbabwe" ],
        -	[ "2301", "Henry", "Myers", "07614", "United Arab Emirates" ],
        -	[ "2302", "Chaney", "Dunlap", "18388", "French Southern Territories" ],
        -	[ "2303", "Palmer", "Le", "10807", "Colombia" ],
        -	[ "2304", "Kaseem", "Madden", "U4E 6L9", "Guyana" ],
        -	[ "2305", "Grant", "Anthony", "F3K 4D8", "Trinidad and Tobago" ],
        -	[ "2306", "Denton", "Moore", "I5O 4I5", "Belize" ],
        -	[ "2307", "Regan", "Pittman", "U8T 9M1", "Romania" ],
        -	[ "2308", "Valentine", "Hunt", "E9O 6H6", "Poland" ],
        -	[ "2309", "Abraham", "Love", "X1T 4K0", "Philippines" ],
        -	[ "2310", "Maggie", "Gaines", "W5Z 6L4", "Chad" ],
        -	[ "2311", "Kylynn", "Sears", "53419", "Ghana" ],
        -	[ "2312", "Abel", "Hudson", "O6C 6K5", "Malaysia" ],
        -	[ "2313", "Aladdin", "Brady", "16465", "Antarctica" ],
        -	[ "2314", "Laurel", "Bush", "42295", "Kyrgyzstan" ],
        -	[ "2315", "Cameron", "Shepherd", "Y8R 5L7", "Finland" ],
        -	[ "2316", "Colin", "Barker", "H8Q 5L0", "Aruba" ],
        -	[ "2317", "Nichole", "Stephens", "B8P 3D5", "Qatar" ],
        -	[ "2318", "Mary", "Dorsey", "J7D 1E5", "Iceland" ],
        -	[ "2319", "Yetta", "Dillon", "I7X 9D3", "Hong Kong" ],
        -	[ "2320", "Hope", "May", "L5W 1T9", "Taiwan, Province of China" ],
        -	[ "2321", "Daphne", "Barr", "W2B 9G2", "Korea, Republic of" ],
        -	[ "2322", "Melissa", "Hartman", "17607", "Reunion" ],
        -	[ "2323", "Acton", "Merritt", "U7M 3Q5", "Cape Verde" ],
        -	[ "2324", "Alika", "Weeks", "45475", "Singapore" ],
        -	[ "2325", "Fitzgerald", "Rowe", "Z3Z 2B6", "Israel" ],
        -	[ "2326", "Frances", "Valentine", "54329", "Kyrgyzstan" ],
        -	[ "2327", "Hollee", "Poole", "56101", "Saint Kitts and Nevis" ],
        -	[ "2328", "Melissa", "Stafford", "R5C 7V0", "Philippines" ],
        -	[ "2329", "Patience", "Jones", "61516", "Mauritius" ],
        -	[ "2330", "Uta", "Sloan", "K1B 9R2", "Timor-leste" ],
        -	[ "2331", "Brent", "West", "69310", "Burundi" ],
        -	[ "2332", "Otto", "Olsen", "88849", "Monaco" ],
        -	[ "2333", "Blossom", "Soto", "E2Q 6E6", "Ukraine" ],
        -	[ "2334", "Anastasia", "Stanton", "S8D 3U5", "Mexico" ],
        -	[ "2335", "Nyssa", "Massey", "A4G 8G7", "Ireland" ],
        -	[ "2336", "Brian", "Moreno", "T6O 4D7", "Myanmar" ],
        -	[ "2337", "Fiona", "Price", "03826", "Benin" ],
        -	[ "2338", "Wyoming", "Knowles", "I5M 7T3", "Chad" ],
        -	[ "2339", "Iola", "Noble", "95251", "Tunisia" ],
        -	[ "2340", "Cameran", "Montgomery", "35748", "Korea" ],
        -	[ "2341", "Wesley", "Sims", "J6O 7C0", "Hungary" ],
        -	[ "2342", "Mona", "Gates", "J6Y 3E2", "Tokelau" ],
        -	[ "2343", "Dominique", "Sellers", "G6U 7I2", "Sudan" ],
        -	[ "2344", "Destiny", "Frazier", "Y2P 5X6", "Madagascar" ],
        -	[ "2345", "Kelsie", "Stokes", "78561", "Yemen" ],
        -	[ "2346", "Julie", "Jordan", "U5H 4H0", "Myanmar" ],
        -	[ "2347", "Xaviera", "Hodge", "36452", "Turkey" ],
        -	[ "2348", "Cain", "Boyd", "74543", "Lebanon" ],
        -	[ "2349", "Devin", "Burch", "94879", "Cyprus" ],
        -	[ "2350", "Michelle", "Manning", "V7T 4A3", "New Zealand" ],
        -	[ "2351", "Quintessa", "Chapman", "95379", "Faroe Islands" ],
        -	[ "2352", "Danielle", "Wells", "27722", "Colombia" ],
        -	[ "2353", "Faith", "Decker", "04881", "Canada" ],
        -	[ "2354", "Gannon", "Chapman", "07687", "Israel" ],
        -	[ "2355", "Jayme", "Black", "A6L 9W1", "Jordan" ],
        -	[ "2356", "Zenia", "Cooley", "A6X 1B7", "Greenland" ],
        -	[ "2357", "Maris", "Burton", "J4G 1Y0", "Ecuador" ],
        -	[ "2358", "Rina", "Vazquez", "G3V 7G6", "Russian Federation" ],
        -	[ "2359", "Nina", "Stanton", "E7Z 1W0", "Dominica" ],
        -	[ "2360", "Alexandra", "Jenkins", "C6N 4R4", "Morocco" ],
        -	[ "2361", "Jerome", "Chen", "68955", "Israel" ],
        -	[ "2362", "Clementine", "Robbins", "X7I 7T3", "Croatia" ],
        -	[ "2363", "Nigel", "Guthrie", "A4N 6X8", "French Southern Territories" ],
        -	[ "2364", "Xaviera", "Griffith", "90489", "Cuba" ],
        -	[ "2365", "Marsden", "Best", "U4B 5R7", "Estonia" ],
        -	[ "2366", "Ebony", "Benson", "H7C 7F7", "Anguilla" ],
        -	[ "2367", "Kylie", "Hansen", "38932", "Eritrea" ],
        -	[ "2368", "Iola", "Copeland", "P4X 9M4", "Rwanda" ],
        -	[ "2369", "Jorden", "Green", "48018", "Namibia" ],
        -	[ "2370", "Hamish", "Porter", "L6F 8L1", "Taiwan, Province of China" ],
        -	[ "2371", "Ezra", "Taylor", "09148", "French Southern Territories" ],
        -	[ "2372", "Dara", "Pratt", "00558", "Saint Kitts and Nevis" ],
        -	[ "2373", "Oliver", "Holt", "C4N 5Z7", "Thailand" ],
        -	[ "2374", "Kato", "Mcgee", "17017", "Micronesia" ],
        -	[ "2375", "Fuller", "Rogers", "M8F 6Y7", "French Polynesia" ],
        -	[ "2376", "Carol", "Stuart", "55980", "Sudan" ],
        -	[ "2377", "Wayne", "Nichols", "37344", "Chile" ],
        -	[ "2378", "Lars", "Gilbert", "27076", "Micronesia" ],
        -	[ "2379", "Todd", "Rollins", "M4I 4X8", "Virgin Islands, U.S." ],
        -	[ "2380", "Colorado", "Justice", "68795", "Yemen" ],
        -	[ "2381", "Jordan", "Chang", "11149", "Mayotte" ],
        -	[ "2382", "Troy", "Haynes", "N2N 1N8", "Reunion" ],
        -	[ "2383", "Amity", "Snyder", "17785", "Argentina" ],
        -	[ "2384", "Kennan", "Turner", "30041", "Brazil" ],
        -	[ "2385", "Dorothy", "Gates", "B7Z 6V4", "Ghana" ],
        -	[ "2386", "Ariana", "Rojas", "70797", "Eritrea" ],
        -	[ "2387", "Desirae", "Joyner", "63493", "Maldives" ],
        -	[ "2388", "Marsden", "Barton", "36343", "Chile" ],
        -	[ "2389", "Graham", "Greer", "65152", "Cayman Islands" ],
        -	[ "2390", "Cameron", "Edwards", "89276", "Montserrat" ],
        -	[ "2391", "Bradley", "White", "80364", "United Kingdom" ],
        -	[ "2392", "Finn", "Cote", "G9P 1P0", "Ghana" ],
        -	[ "2393", "Geoffrey", "Becker", "O5G 4L4", "Wallis and Futuna" ],
        -	[ "2394", "Hayden", "Estes", "Q8G 7F9", "Togo" ],
        -	[ "2395", "Quinlan", "Garrett", "R2C 3E7", "Uganda" ],
        -	[ "2396", "Haviva", "Harrington", "64198", "Bahamas" ],
        -	[ "2397", "Brennan", "Hodge", "35327", "Paraguay" ],
        -	[ "2398", "Halee", "Sykes", "S6J 4S4", "Costa Rica" ],
        -	[ "2399", "Mikayla", "Ruiz", "21686", "Malaysia" ],
        -	[ "2400", "Macy", "Stanley", "F6D 6C4", "Luxembourg" ],
        -	[ "2401", "Petra", "Miles", "O7X 2D2", "Tokelau" ],
        -	[ "2402", "Oprah", "Mendez", "88994", "France" ],
        -	[ "2403", "Upton", "Silva", "17878", "French Southern Territories" ],
        -	[ "2404", "Wade", "Pennington", "S8J 3P2", "Malaysia" ],
        -	[ "2405", "Gannon", "Riddle", "I4A 2H9", "Somalia" ],
        -	[ "2406", "Jana", "Myers", "04982", "Philippines" ],
        -	[ "2407", "Brooke", "Hale", "98272", "Lithuania" ],
        -	[ "2408", "Hashim", "Mendez", "00144", "Saint Helena" ],
        -	[ "2409", "Blythe", "Hanson", "U5Z 6P4", "Saint Helena" ],
        -	[ "2410", "Michelle", "Madden", "B4R 1I9", "Ireland" ],
        -	[ "2411", "Deirdre", "Patton", "B4H 1N7", "Georgia" ],
        -	[ "2412", "Nathaniel", "Chandler", "W1V 8R4", "Sierra Leone" ],
        -	[ "2413", "Tamekah", "Murray", "I8M 1W8", "Guatemala" ],
        -	[ "2414", "Naida", "Boyle", "V4S 2N2", "United Arab Emirates" ],
        -	[ "2415", "Hiroko", "Winters", "K8G 3R9", "Barbados" ],
        -	[ "2416", "Palmer", "Guy", "A4H 5L1", "Saudi Arabia" ],
        -	[ "2417", "Hermione", "Nicholson", "76147", "Marshall Islands" ],
        -	[ "2418", "Russell", "Boyd", "66149", "Switzerland" ],
        -	[ "2419", "Gretchen", "Robles", "B9L 1J7", "Spain" ],
        -	[ "2420", "Leah", "Gibbs", "16682", "Vanuatu" ],
        -	[ "2421", "Amir", "Carlson", "A5C 6F2", "Myanmar" ],
        -	[ "2422", "Merrill", "Ratliff", "A6E 9B2", "Tonga" ],
        -	[ "2423", "Wyatt", "David", "P8G 2M1", "Kiribati" ],
        -	[ "2424", "Violet", "Boyle", "P5X 7B0", "Denmark" ],
        -	[ "2425", "Jared", "Myers", "22131", "Kyrgyzstan" ],
        -	[ "2426", "Lavinia", "Stephenson", "55537", "Turks and Caicos Islands" ],
        -	[ "2427", "Zachary", "Tyson", "C4O 7V4", "Macedonia" ],
        -	[ "2428", "Emma", "Clark", "A7Z 2Z1", "Guam" ],
        -	[ "2429", "Aaron", "Montoya", "Q3U 2X1", "Bahrain" ],
        -	[ "2430", "Dylan", "Roach", "81238", "French Guiana" ],
        -	[ "2431", "Baxter", "Rosario", "H7B 1R2", "Suriname" ],
        -	[ "2432", "Shad", "Bolton", "D1W 5X0", "Barbados" ],
        -	[ "2433", "Hasad", "Hines", "D9U 3H1", "Ukraine" ],
        -	[ "2434", "Maggy", "French", "M3E 5H8", "Nicaragua" ],
        -	[ "2435", "Evangeline", "Jenkins", "57732", "Nigeria" ],
        -	[ "2436", "Eaton", "Shannon", "56854", "Namibia" ],
        -	[ "2437", "Keaton", "Barber", "G5V 7T0", "Svalbard and Jan Mayen" ],
        -	[ "2438", "Lester", "Love", "J5Q 8H3", "United Kingdom" ],
        -	[ "2439", "Olivia", "Foley", "16284", "Mayotte" ],
        -	[ "2440", "Inez", "Craig", "98947", "Poland" ],
        -	[ "2441", "Desirae", "Jacobson", "25950", "French Polynesia" ],
        -	[ "2442", "Amethyst", "Robertson", "78840", "Timor-leste" ],
        -	[ "2443", "Rahim", "Day", "61420", "Maldives" ],
        -	[ "2444", "Kevyn", "Mccarty", "X7T 8Z3", "Guam" ],
        -	[ "2445", "Logan", "Malone", "B6F 8N0", "Madagascar" ],
        -	[ "2446", "Kathleen", "Cote", "L4R 6W9", "Congo" ],
        -	[ "2447", "Porter", "Mclean", "G1Z 1W9", "Mauritius" ],
        -	[ "2448", "Reagan", "Chapman", "86314", "Palestinian Territory, Occupied" ],
        -	[ "2449", "Veda", "Harrington", "R7W 1K4", "Congo" ],
        -	[ "2450", "Dominique", "Hewitt", "P5K 7L4", "San Marino" ],
        -	[ "2451", "Zelda", "Orr", "Z5B 6V1", "Greenland" ],
        -	[ "2452", "Natalie", "Kane", "10491", "Belgium" ],
        -	[ "2453", "Elizabeth", "Bright", "R3V 2R4", "Bangladesh" ],
        -	[ "2454", "Evan", "Knapp", "W3Z 3I5", "Mauritius" ],
        -	[ "2455", "Unity", "Armstrong", "82986", "Kiribati" ],
        -	[ "2456", "Arden", "Winters", "C7D 4M2", "Sweden" ],
        -	[ "2457", "Hayfa", "Henderson", "B8Z 3V3", "Latvia" ],
        -	[ "2458", "Ocean", "Delacruz", "Z3Z 2H8", "Tonga" ],
        -	[ "2459", "Carter", "Harding", "R1Z 8J4", "Ireland" ],
        -	[ "2460", "Harriet", "Simmons", "54757", "Indonesia" ],
        -	[ "2461", "Sopoline", "Hicks", "I5A 6O2", "Argentina" ],
        -	[ "2462", "Jenette", "Ramos", "I4V 3H6", "Portugal" ],
        -	[ "2463", "Abigail", "Berg", "E6P 6L0", "United States" ],
        -	[ "2464", "Sybill", "Fox", "02319", "Svalbard and Jan Mayen" ],
        -	[ "2465", "Wyoming", "Jarvis", "I1R 7V9", "Palestinian Territory, Occupied" ],
        -	[ "2466", "Cynthia", "English", "17983", "Israel" ],
        -	[ "2467", "Jerry", "Little", "33846", "Mauritius" ],
        -	[ "2468", "Quintessa", "Donaldson", "V4N 2K1", "China" ],
        -	[ "2469", "Anne", "Potter", "78596", "United States Minor Outlying Islands" ],
        -	[ "2470", "Madonna", "Hart", "A4A 4T8", "Bahrain" ],
        -	[ "2471", "Madeline", "Walls", "Y3D 4T3", "Comoros" ],
        -	[ "2472", "Fleur", "Blevins", "D1T 9P6", "Guinea-bissau" ],
        -	[ "2473", "Jaden", "Webb", "13917", "Lesotho" ],
        -	[ "2474", "Abdul", "Fleming", "A8A 3Y3", "Canada" ],
        -	[ "2475", "Blaze", "Carroll", "41059", "Marshall Islands" ],
        -	[ "2476", "David", "Hoover", "29132", "Algeria" ],
        -	[ "2477", "Renee", "Nieves", "35843", "Egypt" ],
        -	[ "2478", "Jaime", "Mcclure", "R5K 6B5", "Liechtenstein" ],
        -	[ "2479", "Deborah", "Fletcher", "70399", "Equatorial Guinea" ],
        -	[ "2480", "Otto", "Lopez", "72417", "Belarus" ],
        -	[ "2481", "Bo", "Walls", "F4M 8X8", "Latvia" ],
        -	[ "2482", "Jamal", "Adams", "N9X 3A2", "Spain" ],
        -	[ "2483", "Silas", "Gardner", "25259", "French Guiana" ],
        -	[ "2484", "Aladdin", "Morin", "45179", "Sweden" ],
        -	[ "2485", "Dawn", "Grant", "53613", "Grenada" ],
        -	[ "2486", "Forrest", "Gay", "53606", "Cayman Islands" ],
        -	[ "2487", "Lavinia", "Murphy", "S5L 6X9", "Turkey" ],
        -	[ "2488", "Sylvia", "Wolfe", "37280", "Indonesia" ],
        -	[ "2489", "Wynter", "Adkins", "37391", "Russian Federation" ],
        -	[ "2490", "Iola", "Frank", "I9H 1K7", "Nigeria" ],
        -	[ "2491", "Emmanuel", "Hester", "Z6E 3I4", "Guinea" ],
        -	[ "2492", "Karina", "Christian", "V8M 6F3", "Honduras" ],
        -	[ "2493", "Malcolm", "Holden", "I7J 6U7", "Austria" ],
        -	[ "2494", "Moana", "Holmes", "80402", "Israel" ],
        -	[ "2495", "Ramona", "Hewitt", "U6B 7A6", "Guadeloupe" ],
        -	[ "2496", "Nicholas", "Terry", "V8J 5D9", "Costa Rica" ],
        -	[ "2497", "Erica", "Dunlap", "91596", "Kazakhstan" ],
        -	[ "2498", "Logan", "Harper", "R7V 3T5", "Guinea-bissau" ],
        -	[ "2499", "Bert", "Ortega", "74557", "Paraguay" ],
        -	[ "2500", "Cameron", "Ortiz", "P9C 5B6", "Eritrea" ]
        -] }
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/data/ssp.php b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/data/ssp.php
        deleted file mode 100755
        index 71057e9e9a..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/data/ssp.php
        +++ /dev/null
        @@ -1,58 +0,0 @@
        -<?php
        -
        -/*
        - * DataTables example server-side processing script.
        - *
        - * Please note that this script is intentionally extremely simply to show how
        - * server-side processing can be implemented, and probably shouldn't be used as
        - * the basis for a large complex system. It is suitable for simple use cases as
        - * for learning.
        - *
        - * See http://datatables.net/usage/server-side for full details on the server-
        - * side processing requirements of DataTables.
        - *
        - * @license MIT - http://datatables.net/license_mit
        - */
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Easy set variables
        - */
        -
        -// DB table to use
        -$table = 'massive';
        -
        -// Table's primary key
        -$primaryKey = 'id';
        -
        -// Array of database columns which should be read and sent back to DataTables.
        -// The `db` parameter represents the column name in the database, while the `dt`
        -// parameter represents the DataTables column identifier. In this case simple
        -// indexes
        -$columns = array(
        -	array( 'db' => 'id',         'dt' => 0 ),
        -	array( 'db' => 'firstname',  'dt' => 1 ),
        -	array( 'db' => 'surname',    'dt' => 2 ),
        -	array( 'db' => 'zip',        'dt' => 3 ),
        -	array( 'db' => 'country',    'dt' => 4 )
        -);
        -
        -// SQL server connection information
        -$sql_details = array(
        -	'user' => '',
        -	'pass' => '',
        -	'db'   => '',
        -	'host' => ''
        -);
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * If you just want to use the basic configuration for DataTables with PHP
        - * server-side, there is no need to edit below this line.
        - */
        -
        -require( '../../../../examples/server_side/scripts/ssp.class.php' );
        -
        -echo json_encode(
        -	SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
        -);
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/index.html b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/index.html
        deleted file mode 100755
        index f0b5bcb6f7..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/index.html
        +++ /dev/null
        @@ -1,83 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>Scroller examples - Scroller examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Scroller example <span>Scroller examples</span></h1>
        -
        -			<div class="info">
        -				<p>Scroller is a virtual rendering plug-in for DataTables which allows large datasets to be drawn on
        -				screen every quickly. What the virtual rendering means is that only the visible portion of the table
        -				(and a bit to either side to make the scrolling smooth) is drawn, while the scrolling container gives
        -				the visual impression that the whole table is visible. This is done by making use of the pagination
        -				abilities of DataTables and moving the table around in the scrolling container DataTables adds to the
        -				page. The scrolling container is forced to the height it would be for the full table display using an
        -				extra element.</p>
        -
        -				<p>Scroller is initialised by simply including the letter <code>S</code> in the <a href=
        -				"//datatables.net/reference/option/dom"><code class="option" title=
        -				"DataTables initialisation option">dom<span>DT</span></code></a> for the table you want to have this
        -				feature enabled on. Note that the <code>S</code> must come after the <code>t</code> parameter in
        -				<a href="//datatables.net/reference/option/dom"><code class="option" title=
        -				"DataTables initialisation option">dom<span>DT</span></code></a>.</p>
        -
        -				<p>Key features include:</p>
        -
        -				<ul class="markdown">
        -					<li>Speed! The aim of Scroller for DataTables is to make rendering large data sets fast</li>
        -					<li>Full compatibility with DataTables' deferred rendering for maximum speed</li>
        -					<li>Integration with state saving in DataTables (scrolling position is saved)</li>
        -					<li>Easy to use</li>
        -				</ul>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./state_saving.html">State saving</a></li>
        -							<li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li>
        -							<li><a href="./server-side_processing.html">Server-side processing (5,000,000
        -							rows)</a></li>
        -							<li><a href="./api_scrolling.html">API</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/large_js_source.html b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/large_js_source.html
        deleted file mode 100755
        index 9d39ffafe8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/large_js_source.html
        +++ /dev/null
        @@ -1,182 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Scroller example - Client-side data source (50,000 rows)</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -	$(document).ready(function() {
        -		var data = [];
        -		for ( var i=0 ; i<50000 ; i++ ) {
        -			data.push( [ i, i, i, i, i ] );
        -		}
        -		
        -		var oTable = $('#example').dataTable( {
        -			data:           data,
        -			deferRender:    true,
        -			dom:            "frtiS",
        -			scrollY:        200,
        -			scrollCollapse: true
        -		} );
        -	} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Scroller example <span>Client-side data source (50,000 rows)</span></h1>
        -
        -			<div class="info">
        -				<p>This example is completely artificial in that the data generated is created on the client-side by
        -				just looping around a Javascript array and then passing that to DataTables. However, it does show quite
        -				nicely that DataTables and Scroller can cope with large amounts of data on the client-side quite
        -				nicely. Typically data such as this would be Ajax sourced and server-side processing should be
        -				considered.</p>
        -
        -				<p>Please be aware that the performance of this page will depend on your browser as the array of data
        -				is generated - for example IE6 will crawl!</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>ID</th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>ZIP / Post code</th>
        -						<th>Country</th>
        -					</tr>
        -				</thead>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -		var data = [];
        -		for ( var i=0 ; i&lt;50000 ; i++ ) {
        -			data.push( [ i, i, i, i, i ] );
        -		}
        -		
        -		var oTable = $('#example').dataTable( {
        -			data:           data,
        -			deferRender:    true,
        -			dom:            &quot;frtiS&quot;,
        -			scrollY:        200,
        -			scrollCollapse: true
        -		} );
        -	} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./state_saving.html">State saving</a></li>
        -							<li class="active"><a href="./large_js_source.html">Client-side data source (50,000
        -							rows)</a></li>
        -							<li><a href="./server-side_processing.html">Server-side processing (5,000,000
        -							rows)</a></li>
        -							<li><a href="./api_scrolling.html">API</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/server-side_processing.html b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/server-side_processing.html
        deleted file mode 100755
        index b1650a990c..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/server-side_processing.html
        +++ /dev/null
        @@ -1,220 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Scroller example - Server-side processing (5,000,000 rows)</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		serverSide: true,
        -		ordering: false,
        -		searching: false,
        -		ajax: function ( data, callback, settings ) {
        -			var out = [];
        -
        -			for ( var i=data.start, ien=data.start+data.length ; i<ien ; i++ ) {
        -				out.push( [ i+'-1', i+'-2', i+'-3', i+'-4', i+'-5' ] );
        -			}
        -
        -			setTimeout( function () {
        -				callback( {
        -					draw: data.draw,
        -					data: out,
        -					recordsTotal: 5000000,
        -					recordsFiltered: 5000000
        -				} );
        -			}, 50 );
        -		},
        -		dom: "rtiS",
        -		scrollY: 200,
        -		scroller: {
        -			loadingIndicator: true
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Scroller example <span>Server-side processing (5,000,000 rows)</span></h1>
        -
        -			<div class="info">
        -				<p>DataTables' server-side processing mode is a feature that naturally fits in with Scroller perfectly.
        -				Server-side processing can be used to show large data sets, with the server being used to do the data
        -				processing, and Scroller optimising the display of the data in a scrolling viewport.</p>
        -
        -				<p>When using server-side processing, Scroller will wait a small amount of time to allow the scrolling
        -				to finish before requesting more data from the server (200mS by default). This prevents you from DoSing
        -				your own server!</p>
        -
        -				<p>This example shows Scroller using server-side processing mode and 5 million rows.
        -				<strong>Important</strong> This particular example uses <a href=
        -				"//datatables.net/reference/option/ajax"><code class="option" title=
        -				"DataTables initialisation option">ajax<span>DT</span></code></a> as a function to 'fake' the data to
        -				show Scroller's ability to show large data sets. It does not have a real database behind it! You would
        -				normally not use <a href="//datatables.net/reference/option/ajax"><code class="option" title=
        -				"DataTables initialisation option">ajax<span>DT</span></code></a> as a function to generate data, but
        -				rather as a url for where to fetch the real data!</p>
        -
        -				<p>In this example we also enable the <code>loadingIndicator</code> option of Scroller to show the end
        -				user what is happening when they scroll passed the currently loaded data.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>ID</th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>ZIP / Post code</th>
        -						<th>Country</th>
        -					</tr>
        -				</thead>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		serverSide: true,
        -		ordering: false,
        -		searching: false,
        -		ajax: function ( data, callback, settings ) {
        -			var out = [];
        -
        -			for ( var i=data.start, ien=data.start+data.length ; i&lt;ien ; i++ ) {
        -				out.push( [ i+'-1', i+'-2', i+'-3', i+'-4', i+'-5' ] );
        -			}
        -
        -			setTimeout( function () {
        -				callback( {
        -					draw: data.draw,
        -					data: out,
        -					recordsTotal: 5000000,
        -					recordsFiltered: 5000000
        -				} );
        -			}, 50 );
        -		},
        -		dom: &quot;rtiS&quot;,
        -		scrollY: 200,
        -		scroller: {
        -			loadingIndicator: true
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./state_saving.html">State saving</a></li>
        -							<li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li>
        -							<li class="active"><a href="./server-side_processing.html">Server-side processing
        -							(5,000,000 rows)</a></li>
        -							<li><a href="./api_scrolling.html">API</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/simple.html
        deleted file mode 100755
        index 6d54a6c7e6..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/simple.html
        +++ /dev/null
        @@ -1,175 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Scroller example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax:           "data/2500.txt",
        -		deferRender:    true,
        -		dom:            "frtiS",
        -		scrollY:        200,
        -		scrollCollapse: true
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Scroller example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>Scroller is a plug-in for DataTables which enhances DataTables' built-in scrolling features to allow
        -				large amounts of data to be rendered on page very quickly. This is done by Scroller through the use of
        -				a virtual rendering technique that will render only the part of the table that is actually required for
        -				the current view.</p>
        -
        -				<p>Note that Scroller assumes that all rows are of the same height (in order to preform the required
        -				calculations. You can use <code>td { white-space: nowrap; }</code> in your CSS to ensure that text in
        -				rows does not wrap.</p>
        -
        -				<p>This example shows how Scroller for DataTables can be initialised by simply including the character
        -				<code>S</code> in sDom (note that the <code>S</code> must come after the <code>t</code> in sDom).
        -				Deferred rendering an and Ajax data source are also used in this example.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>ID</th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>ZIP / Post code</th>
        -						<th>Country</th>
        -					</tr>
        -				</thead>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax:           &quot;data/2500.txt&quot;,
        -		deferRender:    true,
        -		dom:            &quot;frtiS&quot;,
        -		scrollY:        200,
        -		scrollCollapse: true
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./state_saving.html">State saving</a></li>
        -							<li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li>
        -							<li><a href="./server-side_processing.html">Server-side processing (5,000,000
        -							rows)</a></li>
        -							<li><a href="./api_scrolling.html">API</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/state_saving.html b/resources/assets/js/plugins/datatables/extensions/Scroller/examples/state_saving.html
        deleted file mode 100755
        index 3dc8c3decd..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/examples/state_saving.html
        +++ /dev/null
        @@ -1,170 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>Scroller example - State saving</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax:           "data/2500.txt",
        -		deferRender:    true,
        -		dom:            "frtiS",
        -		scrollY:        200,
        -		scrollCollapse: true,
        -		stateSave:      true
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>Scroller example <span>State saving</span></h1>
        -
        -			<div class="info">
        -				<p>Scroller will automatically integrate with DataTables in order to save the scrolling position of the
        -				table, if state saving is enabled in the DataTable (<a href=
        -				"//datatables.net/reference/option/stateSave"><code class="option" title=
        -				"DataTables initialisation option">stateSave<span>DT</span></code></a>). This example shows that in
        -				practice - to demonstrate, scroll the table and then reload the page.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>ID</th>
        -						<th>First name</th>
        -						<th>Last name</th>
        -						<th>ZIP / Post code</th>
        -						<th>Country</th>
        -					</tr>
        -				</thead>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this
        -					example:</p><code class="multiline brush: js;">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax:           &quot;data/2500.txt&quot;,
        -		deferRender:    true,
        -		dom:            &quot;frtiS&quot;,
        -		scrollY:        200,
        -		scrollCollapse: true,
        -		stateSave:      true
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this
        -					example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href=
        -						"../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
        -					DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
        -						files (below), in order to correctly display the table. The additional CSS used is shown
        -						below:</p><code class="multiline brush: js;"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the
        -					table:</p>
        -
        -					<ul>
        -						<li><a href=
        -						"../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
        -					will update automatically as any additional data is loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note
        -					that this is just an example script using PHP. Server-side processing scripts can be written in any
        -					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
        -					DataTables documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./state_saving.html">State saving</a></li>
        -							<li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li>
        -							<li><a href="./server-side_processing.html">Server-side processing (5,000,000
        -							rows)</a></li>
        -							<li><a href="./api_scrolling.html">API</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
        -					information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
        -					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
        -					DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href=
        -					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/images/loading-background.png b/resources/assets/js/plugins/datatables/extensions/Scroller/images/loading-background.png
        deleted file mode 100755
        index 2d815070cb..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/Scroller/images/loading-background.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/js/dataTables.scroller.js b/resources/assets/js/plugins/datatables/extensions/Scroller/js/dataTables.scroller.js
        deleted file mode 100755
        index 2beecdbdb8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/js/dataTables.scroller.js
        +++ /dev/null
        @@ -1,1262 +0,0 @@
        -/*! Scroller 1.2.2
        - * ©2011-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     Scroller
        - * @description Virtual rendering for DataTables
        - * @version     1.2.2
        - * @file        dataTables.scroller.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2011-2014 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -(function(window, document, undefined){
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -/**
        - * Scroller is a virtual rendering plug-in for DataTables which allows large
        - * datasets to be drawn on screen every quickly. What the virtual rendering means
        - * is that only the visible portion of the table (and a bit to either side to make
        - * the scrolling smooth) is drawn, while the scrolling container gives the
        - * visual impression that the whole table is visible. This is done by making use
        - * of the pagination abilities of DataTables and moving the table around in the
        - * scrolling container DataTables adds to the page. The scrolling container is
        - * forced to the height it would be for the full table display using an extra
        - * element.
        - *
        - * Note that rows in the table MUST all be the same height. Information in a cell
        - * which expands on to multiple lines will cause some odd behaviour in the scrolling.
        - *
        - * Scroller is initialised by simply including the letter 'S' in the sDom for the
        - * table you want to have this feature enabled on. Note that the 'S' must come
        - * AFTER the 't' parameter in `dom`.
        - *
        - * Key features include:
        - *   <ul class="limit_length">
        - *     <li>Speed! The aim of Scroller for DataTables is to make rendering large data sets fast</li>
        - *     <li>Full compatibility with deferred rendering in DataTables 1.9 for maximum speed</li>
        - *     <li>Display millions of rows</li>
        - *     <li>Integration with state saving in DataTables (scrolling position is saved)</li>
        - *     <li>Easy to use</li>
        - *   </ul>
        - *
        - *  @class
        - *  @constructor
        - *  @global
        - *  @param {object} oDT DataTables settings object
        - *  @param {object} [oOpts={}] Configuration object for FixedColumns. Options 
        - *    are defined by {@link Scroller.defaults}
        - *
        - *  @requires jQuery 1.7+
        - *  @requires DataTables 1.9.0+
        - *
        - *  @example
        - *    $(document).ready(function() {
        - *        $('#example').dataTable( {
        - *            "sScrollY": "200px",
        - *            "sAjaxSource": "media/dataset/large.txt",
        - *            "sDom": "frtiS",
        - *            "bDeferRender": true
        - *        } );
        - *    } );
        - */
        -var Scroller = function ( oDTSettings, oOpts ) {
        -	/* Sanity check - you just know it will happen */
        -	if ( ! this instanceof Scroller )
        -	{
        -		alert( "Scroller warning: Scroller must be initialised with the 'new' keyword." );
        -		return;
        -	}
        -
        -	if ( typeof oOpts == 'undefined' )
        -	{
        -		oOpts = {};
        -	}
        -
        -	/**
        -	 * Settings object which contains customisable information for the Scroller instance
        -	 * @namespace
        -	 * @private
        -	 * @extends Scroller.defaults
        -	 */
        -	this.s = {
        -		/**
        -		 * DataTables settings object
        -		 *  @type     object
        -		 *  @default  Passed in as first parameter to constructor
        -		 */
        -		"dt": oDTSettings,
        -
        -		/**
        -		 * Pixel location of the top of the drawn table in the viewport
        -		 *  @type     int
        -		 *  @default  0
        -		 */
        -		"tableTop": 0,
        -
        -		/**
        -		 * Pixel location of the bottom of the drawn table in the viewport
        -		 *  @type     int
        -		 *  @default  0
        -		 */
        -		"tableBottom": 0,
        -
        -		/**
        -		 * Pixel location of the boundary for when the next data set should be loaded and drawn
        -		 * when scrolling up the way.
        -		 *  @type     int
        -		 *  @default  0
        -		 *  @private
        -		 */
        -		"redrawTop": 0,
        -
        -		/**
        -		 * Pixel location of the boundary for when the next data set should be loaded and drawn
        -		 * when scrolling down the way. Note that this is actually calculated as the offset from
        -		 * the top.
        -		 *  @type     int
        -		 *  @default  0
        -		 *  @private
        -		 */
        -		"redrawBottom": 0,
        -
        -		/**
        -		 * Auto row height or not indicator
        -		 *  @type     bool
        -		 *  @default  0
        -		 */
        -		"autoHeight": true,
        -
        -		/**
        -		 * Number of rows calculated as visible in the visible viewport
        -		 *  @type     int
        -		 *  @default  0
        -		 */
        -		"viewportRows": 0,
        -
        -		/**
        -		 * setTimeout reference for state saving, used when state saving is enabled in the DataTable
        -		 * and when the user scrolls the viewport in order to stop the cookie set taking too much
        -		 * CPU!
        -		 *  @type     int
        -		 *  @default  0
        -		 */
        -		"stateTO": null,
        -
        -		/**
        -		 * setTimeout reference for the redraw, used when server-side processing is enabled in the
        -		 * DataTables in order to prevent DoSing the server
        -		 *  @type     int
        -		 *  @default  null
        -		 */
        -		"drawTO": null,
        -
        -		heights: {
        -			jump: null,
        -			page: null,
        -			virtual: null,
        -			scroll: null,
        -
        -			/**
        -			 * Height of rows in the table
        -			 *  @type     int
        -			 *  @default  0
        -			 */
        -			row: null,
        -
        -			/**
        -			 * Pixel height of the viewport
        -			 *  @type     int
        -			 *  @default  0
        -			 */
        -			viewport: null
        -		},
        -
        -		topRowFloat: 0,
        -		scrollDrawDiff: null,
        -		loaderVisible: false
        -	};
        -
        -	// @todo The defaults should extend a `c` property and the internal settings
        -	// only held in the `s` property. At the moment they are mixed
        -	this.s = $.extend( this.s, Scroller.oDefaults, oOpts );
        -
        -	// Workaround for row height being read from height object (see above comment)
        -	this.s.heights.row = this.s.rowHeight;
        -
        -	/**
        -	 * DOM elements used by the class instance
        -	 * @private
        -	 * @namespace
        -	 *
        -	 */
        -	this.dom = {
        -		"force":    document.createElement('div'),
        -		"scroller": null,
        -		"table":    null,
        -		"loader":   null
        -	};
        -
        -	/* Attach the instance to the DataTables instance so it can be accessed */
        -	this.s.dt.oScroller = this;
        -
        -	/* Let's do it */
        -	this._fnConstruct();
        -};
        -
        -
        -
        -Scroller.prototype = /** @lends Scroller.prototype */{
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Calculate the pixel position from the top of the scrolling container for
        -	 * a given row
        -	 *  @param {int} iRow Row number to calculate the position of
        -	 *  @returns {int} Pixels
        -	 *  @example
        -	 *    $(document).ready(function() {
        -	 *      $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sAjaxSource": "media/dataset/large.txt",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "fnInitComplete": function (o) {
        -	 *          // Find where row 25 is
        -	 *          alert( o.oScroller.fnRowToPixels( 25 ) );
        -	 *        }
        -	 *      } );
        -	 *    } );
        -	 */
        -	"fnRowToPixels": function ( rowIdx, intParse, virtual )
        -	{
        -		var pixels;
        -
        -		if ( virtual ) {
        -			pixels = this._domain( 'virtualToPhysical', rowIdx * this.s.heights.row );
        -		}
        -		else {
        -			var diff = rowIdx - this.s.baseRowTop;
        -			pixels = this.s.baseScrollTop + (diff * this.s.heights.row);
        -		}
        -
        -		return intParse || intParse === undefined ?
        -			parseInt( pixels, 10 ) :
        -			pixels;
        -	},
        -
        -
        -	/**
        -	 * Calculate the row number that will be found at the given pixel position
        -	 * (y-scroll).
        -	 *
        -	 * Please note that when the height of the full table exceeds 1 million
        -	 * pixels, Scroller switches into a non-linear mode for the scrollbar to fit
        -	 * all of the records into a finite area, but this function returns a linear
        -	 * value (relative to the last non-linear positioning).
        -	 *  @param {int} iPixels Offset from top to calculate the row number of
        -	 *  @param {int} [intParse=true] If an integer value should be returned
        -	 *  @param {int} [virtual=false] Perform the calculations in the virtual domain
        -	 *  @returns {int} Row index
        -	 *  @example
        -	 *    $(document).ready(function() {
        -	 *      $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sAjaxSource": "media/dataset/large.txt",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "fnInitComplete": function (o) {
        -	 *          // Find what row number is at 500px
        -	 *          alert( o.oScroller.fnPixelsToRow( 500 ) );
        -	 *        }
        -	 *      } );
        -	 *    } );
        -	 */
        -	"fnPixelsToRow": function ( pixels, intParse, virtual )
        -	{
        -		var diff = pixels - this.s.baseScrollTop;
        -		var row = virtual ?
        -			this._domain( 'physicalToVirtual', pixels ) / this.s.heights.row :
        -			( diff / this.s.heights.row ) + this.s.baseRowTop;
        -
        -		return intParse || intParse === undefined ?
        -			parseInt( row, 10 ) :
        -			row;
        -	},
        -
        -
        -	/**
        -	 * Calculate the row number that will be found at the given pixel position (y-scroll)
        -	 *  @param {int} iRow Row index to scroll to
        -	 *  @param {bool} [bAnimate=true] Animate the transition or not
        -	 *  @returns {void}
        -	 *  @example
        -	 *    $(document).ready(function() {
        -	 *      $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sAjaxSource": "media/dataset/large.txt",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "fnInitComplete": function (o) {
        -	 *          // Immediately scroll to row 1000
        -	 *          o.oScroller.fnScrollToRow( 1000 );
        -	 *        }
        -	 *      } );
        -	 *     
        -	 *      // Sometime later on use the following to scroll to row 500...
        -	 *          var oSettings = $('#example').dataTable().fnSettings();
        -	 *      oSettings.oScroller.fnScrollToRow( 500 );
        -	 *    } );
        -	 */
        -	"fnScrollToRow": function ( iRow, bAnimate )
        -	{
        -		var that = this;
        -		var ani = false;
        -		var px = this.fnRowToPixels( iRow );
        -
        -		// We need to know if the table will redraw or not before doing the
        -		// scroll. If it will not redraw, then we need to use the currently
        -		// displayed table, and scroll with the physical pixels. Otherwise, we
        -		// need to calculate the table's new position from the virtual
        -		// transform.
        -		var preRows = ((this.s.displayBuffer-1)/2) * this.s.viewportRows;
        -		var drawRow = iRow - preRows;
        -		if ( drawRow < 0 ) {
        -			drawRow = 0;
        -		}
        -
        -		if ( (px > this.s.redrawBottom || px < this.s.redrawTop) && this.s.dt._iDisplayStart !== drawRow ) {
        -			ani = true;
        -			px = this.fnRowToPixels( iRow, false, true );
        -		}
        -
        -		if ( typeof bAnimate == 'undefined' || bAnimate )
        -		{
        -			this.s.ani = ani;
        -			$(this.dom.scroller).animate( {
        -				"scrollTop": px
        -			}, function () {
        -				// This needs to happen after the animation has completed and
        -				// the final scroll event fired
        -				setTimeout( function () {
        -					that.s.ani = false;
        -				}, 25 );
        -			} );
        -		}
        -		else
        -		{
        -			$(this.dom.scroller).scrollTop( px );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Calculate and store information about how many rows are to be displayed
        -	 * in the scrolling viewport, based on current dimensions in the browser's
        -	 * rendering. This can be particularly useful if the table is initially
        -	 * drawn in a hidden element - for example in a tab.
        -	 *  @param {bool} [bRedraw=true] Redraw the table automatically after the recalculation, with
        -	 *    the new dimensions forming the basis for the draw.
        -	 *  @returns {void}
        -	 *  @example
        -	 *    $(document).ready(function() {
        -	 *      // Make the example container hidden to throw off the browser's sizing
        -	 *      document.getElementById('container').style.display = "none";
        -	 *      var oTable = $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sAjaxSource": "media/dataset/large.txt",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "fnInitComplete": function (o) {
        -	 *          // Immediately scroll to row 1000
        -	 *          o.oScroller.fnScrollToRow( 1000 );
        -	 *        }
        -	 *      } );
        -	 *     
        -	 *      setTimeout( function () {
        -	 *        // Make the example container visible and recalculate the scroller sizes
        -	 *        document.getElementById('container').style.display = "block";
        -	 *        oTable.fnSettings().oScroller.fnMeasure();
        -	 *      }, 3000 );
        -	 */
        -	"fnMeasure": function ( bRedraw )
        -	{
        -		if ( this.s.autoHeight )
        -		{
        -			this._fnCalcRowHeight();
        -		}
        -
        -		var heights = this.s.heights;
        -
        -		heights.viewport = $(this.dom.scroller).height();
        -		this.s.viewportRows = parseInt( heights.viewport / heights.row, 10 )+1;
        -		this.s.dt._iDisplayLength = this.s.viewportRows * this.s.displayBuffer;
        -
        -		if ( bRedraw === undefined || bRedraw )
        -		{
        -			this.s.dt.oInstance.fnDraw();
        -		}
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods (they are of course public in JS, but recommended as private)
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Initialisation for Scroller
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnConstruct": function ()
        -	{
        -		var that = this;
        -
        -		/* Sanity check */
        -		if ( !this.s.dt.oFeatures.bPaginate ) {
        -			this.s.dt.oApi._fnLog( this.s.dt, 0, 'Pagination must be enabled for Scroller' );
        -			return;
        -		}
        -
        -		/* Insert a div element that we can use to force the DT scrolling container to
        -		 * the height that would be required if the whole table was being displayed
        -		 */
        -		this.dom.force.style.position = "absolute";
        -		this.dom.force.style.top = "0px";
        -		this.dom.force.style.left = "0px";
        -		this.dom.force.style.width = "1px";
        -
        -		this.dom.scroller = $('div.'+this.s.dt.oClasses.sScrollBody, this.s.dt.nTableWrapper)[0];
        -		this.dom.scroller.appendChild( this.dom.force );
        -		this.dom.scroller.style.position = "relative";
        -
        -		this.dom.table = $('>table', this.dom.scroller)[0];
        -		this.dom.table.style.position = "absolute";
        -		this.dom.table.style.top = "0px";
        -		this.dom.table.style.left = "0px";
        -
        -		// Add class to 'announce' that we are a Scroller table
        -		$(this.s.dt.nTableWrapper).addClass('DTS');
        -
        -		// Add a 'loading' indicator
        -		if ( this.s.loadingIndicator )
        -		{
        -			this.dom.loader = $('<div class="DTS_Loading">'+this.s.dt.oLanguage.sLoadingRecords+'</div>')
        -				.css('display', 'none');
        -
        -			$(this.dom.scroller.parentNode)
        -				.css('position', 'relative')
        -				.append( this.dom.loader );
        -		}
        -
        -		/* Initial size calculations */
        -		if ( this.s.heights.row && this.s.heights.row != 'auto' )
        -		{
        -			this.s.autoHeight = false;
        -		}
        -		this.fnMeasure( false );
        -
        -		/* Scrolling callback to see if a page change is needed - use a throttled
        -		 * function for the save save callback so we aren't hitting it on every
        -		 * scroll
        -		 */
        -		this.s.ingnoreScroll = true;
        -		this.s.stateSaveThrottle = this.s.dt.oApi._fnThrottle( function () {
        -			that.s.dt.oApi._fnSaveState( that.s.dt );
        -		}, 500 );
        -		$(this.dom.scroller).on( 'scroll.DTS', function (e) {
        -			that._fnScroll.call( that );
        -		} );
        -
        -		/* In iOS we catch the touchstart event in case the user tries to scroll
        -		 * while the display is already scrolling
        -		 */
        -		$(this.dom.scroller).on('touchstart.DTS', function () {
        -			that._fnScroll.call( that );
        -		} );
        -
        -		/* Update the scroller when the DataTable is redrawn */
        -		this.s.dt.aoDrawCallback.push( {
        -			"fn": function () {
        -				if ( that.s.dt.bInitialised ) {
        -					that._fnDrawCallback.call( that );
        -				}
        -			},
        -			"sName": "Scroller"
        -		} );
        -
        -		/* On resize, update the information element, since the number of rows shown might change */
        -		$(window).on( 'resize.DTS', function () {
        -			that.fnMeasure( false );
        -			that._fnInfo();
        -		} );
        -
        -		/* Add a state saving parameter to the DT state saving so we can restore the exact
        -		 * position of the scrolling
        -		 */
        -		var initialStateSave = true;
        -		this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) {
        -			/* Set iScroller to saved scroll position on initialization.
        -			 */
        -			if(initialStateSave && that.s.dt.oLoadedState){
        -				oData.iScroller = that.s.dt.oLoadedState.iScroller;
        -				oData.iScrollerTopRow = that.s.dt.oLoadedState.iScrollerTopRow;
        -				initialStateSave = false;
        -			} else {
        -				oData.iScroller = that.dom.scroller.scrollTop;
        -				oData.iScrollerTopRow = that.s.topRowFloat;
        -			}
        -		}, "Scroller_State" );
        -
        -		if ( this.s.dt.oLoadedState ) {
        -			this.s.topRowFloat = this.s.dt.oLoadedState.iScrollerTopRow || 0;
        -		}
        -
        -		/* Destructor */
        -		this.s.dt.aoDestroyCallback.push( {
        -			"sName": "Scroller",
        -			"fn": function () {
        -				$(window).off( 'resize.DTS' );
        -				$(that.dom.scroller).off('touchstart.DTS scroll.DTS');
        -				$(that.s.dt.nTableWrapper).removeClass('DTS');
        -				$('div.DTS_Loading', that.dom.scroller.parentNode).remove();
        -
        -				that.dom.table.style.position = "";
        -				that.dom.table.style.top = "";
        -				that.dom.table.style.left = "";
        -			}
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Scrolling function - fired whenever the scrolling position is changed.
        -	 * This method needs to use the stored values to see if the table should be
        -	 * redrawn as we are moving towards the end of the information that is
        -	 * currently drawn or not. If needed, then it will redraw the table based on
        -	 * the new position.
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnScroll": function ()
        -	{
        -		var
        -			that = this,
        -			heights = this.s.heights,
        -			iScrollTop = this.dom.scroller.scrollTop,
        -			iTopRow;
        -
        -		if ( this.s.skip ) {
        -			return;
        -		}
        -
        -		if ( this.s.ingnoreScroll ) {
        -			return;
        -		}
        -
        -		/* If the table has been sorted or filtered, then we use the redraw that
        -		 * DataTables as done, rather than performing our own
        -		 */
        -		if ( this.s.dt.bFiltered || this.s.dt.bSorted ) {
        -			this.s.lastScrollTop = 0;
        -			return;
        -		}
        -
        -		/* Update the table's information display for what is now in the viewport */
        -		this._fnInfo();
        -
        -		/* We don't want to state save on every scroll event - that's heavy
        -		 * handed, so use a timeout to update the state saving only when the
        -		 * scrolling has finished
        -		 */
        -		clearTimeout( this.s.stateTO );
        -		this.s.stateTO = setTimeout( function () {
        -			that.s.dt.oApi._fnSaveState( that.s.dt );
        -		}, 250 );
        -
        -		/* Check if the scroll point is outside the trigger boundary which would required
        -		 * a DataTables redraw
        -		 */
        -		if ( iScrollTop < this.s.redrawTop || iScrollTop > this.s.redrawBottom ) {
        -			var preRows = Math.ceil( ((this.s.displayBuffer-1)/2) * this.s.viewportRows );
        -
        -			if ( Math.abs( iScrollTop - this.s.lastScrollTop ) > heights.viewport || this.s.ani ) {
        -				iTopRow = parseInt(this._domain( 'physicalToVirtual', iScrollTop ) / heights.row, 10) - preRows;
        -				this.s.topRowFloat = (this._domain( 'physicalToVirtual', iScrollTop ) / heights.row);
        -			}
        -			else {
        -				iTopRow = this.fnPixelsToRow( iScrollTop ) - preRows;
        -				this.s.topRowFloat = this.fnPixelsToRow( iScrollTop, false );
        -			}
        -
        -			if ( iTopRow <= 0 ) {
        -				/* At the start of the table */
        -				iTopRow = 0;
        -			}
        -			else if ( iTopRow + this.s.dt._iDisplayLength > this.s.dt.fnRecordsDisplay() ) {
        -				/* At the end of the table */
        -				iTopRow = this.s.dt.fnRecordsDisplay() - this.s.dt._iDisplayLength;
        -				if ( iTopRow < 0 ) {
        -					iTopRow = 0;
        -				}
        -			}
        -			else if ( iTopRow % 2 !== 0 ) {
        -				// For the row-striping classes (odd/even) we want only to start
        -				// on evens otherwise the stripes will change between draws and
        -				// look rubbish
        -				iTopRow++;
        -			}
        -
        -			if ( iTopRow != this.s.dt._iDisplayStart ) {
        -				/* Cache the new table position for quick lookups */
        -				this.s.tableTop = $(this.s.dt.nTable).offset().top;
        -				this.s.tableBottom = $(this.s.dt.nTable).height() + this.s.tableTop;
        -
        -				var draw =  function () {
        -					if ( that.s.scrollDrawReq === null ) {
        -						that.s.scrollDrawReq = iScrollTop;
        -					}
        -
        -					that.s.dt._iDisplayStart = iTopRow;
        -					if ( that.s.dt.oApi._fnCalculateEnd ) { // Removed in 1.10
        -						that.s.dt.oApi._fnCalculateEnd( that.s.dt );
        -					}
        -					that.s.dt.oApi._fnDraw( that.s.dt );
        -				};
        -
        -				/* Do the DataTables redraw based on the calculated start point - note that when
        -				 * using server-side processing we introduce a small delay to not DoS the server...
        -				 */
        -				if ( this.s.dt.oFeatures.bServerSide ) {
        -					clearTimeout( this.s.drawTO );
        -					this.s.drawTO = setTimeout( draw, this.s.serverWait );
        -				}
        -				else {
        -					draw();
        -				}
        -
        -				if ( this.dom.loader && ! this.s.loaderVisible ) {
        -					this.dom.loader.css( 'display', 'block' );
        -					this.s.loaderVisible = true;
        -				}
        -			}
        -		}
        -
        -		this.s.lastScrollTop = iScrollTop;
        -		this.s.stateSaveThrottle();
        -	},
        -
        -
        -	/**
        -	 * Convert from one domain to another. The physical domain is the actual
        -	 * pixel count on the screen, while the virtual is if we had browsers which
        -	 * had scrolling containers of infinite height (i.e. the absolute value)
        -	 *
        -	 *  @param {string} dir Domain transform direction, `virtualToPhysical` or
        -	 *    `physicalToVirtual` 
        -	 *  @returns {number} Calculated transform
        -	 *  @private
        -	 */
        -	_domain: function ( dir, val )
        -	{
        -		var heights = this.s.heights;
        -		var coeff;
        -
        -		// If the virtual and physical height match, then we use a linear
        -		// transform between the two, allowing the scrollbar to be linear
        -		if ( heights.virtual === heights.scroll ) {
        -			coeff = (heights.virtual-heights.viewport) / (heights.scroll-heights.viewport);
        -
        -			if ( dir === 'virtualToPhysical' ) {
        -				return val / coeff;
        -			}
        -			else if ( dir === 'physicalToVirtual' ) {
        -				return val * coeff;
        -			}
        -		}
        -
        -		// Otherwise, we want a non-linear scrollbar to take account of the
        -		// redrawing regions at the start and end of the table, otherwise these
        -		// can stutter badly - on large tables 30px (for example) scroll might
        -		// be hundreds of rows, so the table would be redrawing every few px at
        -		// the start and end. Use a simple quadratic to stop this. It does mean
        -		// the scrollbar is non-linear, but with such massive data sets, the
        -		// scrollbar is going to be a best guess anyway
        -		var xMax = (heights.scroll - heights.viewport) / 2;
        -		var yMax = (heights.virtual - heights.viewport) / 2;
        -
        -		coeff = yMax / ( xMax * xMax );
        -
        -		if ( dir === 'virtualToPhysical' ) {
        -			if ( val < yMax ) {
        -				return Math.pow(val / coeff, 0.5);
        -			}
        -			else {
        -				val = (yMax*2) - val;
        -				return val < 0 ?
        -					heights.scroll :
        -					(xMax*2) - Math.pow(val / coeff, 0.5);
        -			}
        -		}
        -		else if ( dir === 'physicalToVirtual' ) {
        -			if ( val < xMax ) {
        -				return val * val * coeff;
        -			}
        -			else {
        -				val = (xMax*2) - val;
        -				return val < 0 ?
        -					heights.virtual :
        -					(yMax*2) - (val * val * coeff);
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Draw callback function which is fired when the DataTable is redrawn. The main function of
        -	 * this method is to position the drawn table correctly the scrolling container for the rows
        -	 * that is displays as a result of the scrolling position.
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnDrawCallback": function ()
        -	{
        -		var
        -			that = this,
        -			heights = this.s.heights,
        -			iScrollTop = this.dom.scroller.scrollTop,
        -			iActualScrollTop = iScrollTop,
        -			iScrollBottom = iScrollTop + heights.viewport,
        -			iTableHeight = $(this.s.dt.nTable).height(),
        -			displayStart = this.s.dt._iDisplayStart,
        -			displayLen = this.s.dt._iDisplayLength,
        -			displayEnd = this.s.dt.fnRecordsDisplay();
        -
        -		// Disable the scroll event listener while we are updating the DOM
        -		this.s.skip = true;
        -
        -		// Resize the scroll forcing element
        -		this._fnScrollForce();
        -
        -		// Reposition the scrolling for the updated virtual position if needed
        -		if ( displayStart === 0 ) {
        -			// Linear calculation at the top of the table
        -			iScrollTop = this.s.topRowFloat * heights.row;
        -		}
        -		else if ( displayStart + displayLen >= displayEnd ) {
        -			// Linear calculation that the bottom as well
        -			iScrollTop = heights.scroll - ((displayEnd - this.s.topRowFloat) * heights.row);
        -		}
        -		else {
        -			// Domain scaled in the middle
        -			iScrollTop = this._domain( 'virtualToPhysical', this.s.topRowFloat * heights.row );
        -		}
        -
        -		this.dom.scroller.scrollTop = iScrollTop;
        -
        -		// Store positional information so positional calculations can be based
        -		// upon the current table draw position
        -		this.s.baseScrollTop = iScrollTop;
        -		this.s.baseRowTop = this.s.topRowFloat;
        -
        -		// Position the table in the virtual scroller
        -		var tableTop = iScrollTop - ((this.s.topRowFloat - displayStart) * heights.row);
        -		if ( displayStart === 0 ) {
        -			tableTop = 0;
        -		}
        -		else if ( displayStart + displayLen >= displayEnd ) {
        -			tableTop = heights.scroll - iTableHeight;
        -		}
        -
        -		this.dom.table.style.top = tableTop+'px';
        -
        -		/* Cache some information for the scroller */
        -		this.s.tableTop = tableTop;
        -		this.s.tableBottom = iTableHeight + this.s.tableTop;
        -
        -		// Calculate the boundaries for where a redraw will be triggered by the
        -		// scroll event listener
        -		var boundaryPx = (iScrollTop - this.s.tableTop) * this.s.boundaryScale;
        -		this.s.redrawTop = iScrollTop - boundaryPx;
        -		this.s.redrawBottom = iScrollTop + boundaryPx;
        -
        -		this.s.skip = false;
        -
        -		// Restore the scrolling position that was saved by DataTable's state
        -		// saving Note that this is done on the second draw when data is Ajax
        -		// sourced, and the first draw when DOM soured
        -		if ( this.s.dt.oFeatures.bStateSave && this.s.dt.oLoadedState !== null &&
        -			 typeof this.s.dt.oLoadedState.iScroller != 'undefined' )
        -		{
        -			// A quirk of DataTables is that the draw callback will occur on an
        -			// empty set if Ajax sourced, but not if server-side processing.
        -			var ajaxSourced = (this.s.dt.sAjaxSource || that.s.dt.ajax) && ! this.s.dt.oFeatures.bServerSide ?
        -				true :
        -				false;
        -
        -			if ( ( ajaxSourced && this.s.dt.iDraw == 2) ||
        -			     (!ajaxSourced && this.s.dt.iDraw == 1) )
        -			{
        -				setTimeout( function () {
        -					$(that.dom.scroller).scrollTop( that.s.dt.oLoadedState.iScroller );
        -					that.s.redrawTop = that.s.dt.oLoadedState.iScroller - (heights.viewport/2);
        -
        -					// In order to prevent layout thrashing we need another
        -					// small delay
        -					setTimeout( function () {
        -						that.s.ingnoreScroll = false;
        -					}, 0 );
        -				}, 0 );
        -			}
        -		}
        -		else {
        -			that.s.ingnoreScroll = false;
        -		}
        -
        -		// Because of the order of the DT callbacks, the info update will
        -		// take precedence over the one we want here. So a 'thread' break is
        -		// needed
        -		setTimeout( function () {
        -			that._fnInfo.call( that );
        -		}, 0 );
        -
        -		// Hide the loading indicator
        -		if ( this.dom.loader && this.s.loaderVisible ) {
        -			this.dom.loader.css( 'display', 'none' );
        -			this.s.loaderVisible = false;
        -		}
        -	},
        -
        -
        -	/**
        -	 * Force the scrolling container to have height beyond that of just the
        -	 * table that has been drawn so the user can scroll the whole data set.
        -	 *
        -	 * Note that if the calculated required scrolling height exceeds a maximum
        -	 * value (1 million pixels - hard-coded) the forcing element will be set
        -	 * only to that maximum value and virtual / physical domain transforms will
        -	 * be used to allow Scroller to display tables of any number of records.
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	_fnScrollForce: function ()
        -	{
        -		var heights = this.s.heights;
        -		var max = 1000000;
        -
        -		heights.virtual = heights.row * this.s.dt.fnRecordsDisplay();
        -		heights.scroll = heights.virtual;
        -
        -		if ( heights.scroll > max ) {
        -			heights.scroll = max;
        -		}
        -
        -		this.dom.force.style.height = heights.scroll+"px";
        -	},
        -
        -
        -	/**
        -	 * Automatic calculation of table row height. This is just a little tricky here as using
        -	 * initialisation DataTables has tale the table out of the document, so we need to create
        -	 * a new table and insert it into the document, calculate the row height and then whip the
        -	 * table out.
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnCalcRowHeight": function ()
        -	{
        -		var dt = this.s.dt;
        -		var origTable = dt.nTable;
        -		var nTable = origTable.cloneNode( false );
        -		var tbody = $('<tbody/>').appendTo( nTable );
        -		var container = $(
        -			'<div class="'+dt.oClasses.sWrapper+' DTS">'+
        -				'<div class="'+dt.oClasses.sScrollWrapper+'">'+
        -					'<div class="'+dt.oClasses.sScrollBody+'"></div>'+
        -				'</div>'+
        -			'</div>'
        -		);
        -
        -		// Want 3 rows in the sizing table so :first-child and :last-child
        -		// CSS styles don't come into play - take the size of the middle row
        -		$('tbody tr:lt(4)', origTable).clone().appendTo( tbody );
        -		while( $('tr', tbody).length < 3 ) {
        -			tbody.append( '<tr><td>&nbsp;</td></tr>' );
        -		}
        -
        -		$('div.'+dt.oClasses.sScrollBody, container).append( nTable );
        -
        -		var appendTo;
        -		if (dt._bInitComplete) {
        -			appendTo = origTable.parentNode;
        -		} else {
        -			if (!this.s.dt.nHolding) {
        -				this.s.dt.nHolding = $( '<div></div>' ).insertBefore( this.s.dt.nTable );
        -			}
        -			appendTo = this.s.dt.nHolding;
        -		}
        -
        -		container.appendTo( appendTo );
        -		this.s.heights.row = $('tr', tbody).eq(1).outerHeight();
        -		container.remove();
        -	},
        -
        -
        -	/**
        -	 * Update any information elements that are controlled by the DataTable based on the scrolling
        -	 * viewport and what rows are visible in it. This function basically acts in the same way as
        -	 * _fnUpdateInfo in DataTables, and effectively replaces that function.
        -	 *  @returns {void}
        -	 *  @private
        -	 */
        -	"_fnInfo": function ()
        -	{
        -		if ( !this.s.dt.oFeatures.bInfo )
        -		{
        -			return;
        -		}
        -
        -		var
        -			dt = this.s.dt,
        -			language = dt.oLanguage,
        -			iScrollTop = this.dom.scroller.scrollTop,
        -			iStart = Math.floor( this.fnPixelsToRow(iScrollTop, false, this.s.ani)+1 ),
        -			iMax = dt.fnRecordsTotal(),
        -			iTotal = dt.fnRecordsDisplay(),
        -			iPossibleEnd = Math.ceil( this.fnPixelsToRow(iScrollTop+this.s.heights.viewport, false, this.s.ani) ),
        -			iEnd = iTotal < iPossibleEnd ? iTotal : iPossibleEnd,
        -			sStart = dt.fnFormatNumber( iStart ),
        -			sEnd = dt.fnFormatNumber( iEnd ),
        -			sMax = dt.fnFormatNumber( iMax ),
        -			sTotal = dt.fnFormatNumber( iTotal ),
        -			sOut;
        -
        -		if ( dt.fnRecordsDisplay() === 0 &&
        -			   dt.fnRecordsDisplay() == dt.fnRecordsTotal() )
        -		{
        -			/* Empty record set */
        -			sOut = language.sInfoEmpty+ language.sInfoPostFix;
        -		}
        -		else if ( dt.fnRecordsDisplay() === 0 )
        -		{
        -			/* Empty record set after filtering */
        -			sOut = language.sInfoEmpty +' '+
        -				language.sInfoFiltered.replace('_MAX_', sMax)+
        -					language.sInfoPostFix;
        -		}
        -		else if ( dt.fnRecordsDisplay() == dt.fnRecordsTotal() )
        -		{
        -			/* Normal record set */
        -			sOut = language.sInfo.
        -					replace('_START_', sStart).
        -					replace('_END_',   sEnd).
        -					replace('_MAX_',   sMax).
        -					replace('_TOTAL_', sTotal)+
        -				language.sInfoPostFix;
        -		}
        -		else
        -		{
        -			/* Record set after filtering */
        -			sOut = language.sInfo.
        -					replace('_START_', sStart).
        -					replace('_END_',   sEnd).
        -					replace('_MAX_',   sMax).
        -					replace('_TOTAL_', sTotal) +' '+
        -				language.sInfoFiltered.replace(
        -					'_MAX_',
        -					dt.fnFormatNumber(dt.fnRecordsTotal())
        -				)+
        -				language.sInfoPostFix;
        -		}
        -
        -		var callback = language.fnInfoCallback;
        -		if ( callback ) {
        -			sOut = callback.call( dt.oInstance,
        -				dt, iStart, iEnd, iMax, iTotal, sOut
        -			);
        -		}
        -
        -		var n = dt.aanFeatures.i;
        -		if ( typeof n != 'undefined' )
        -		{
        -			for ( var i=0, iLen=n.length ; i<iLen ; i++ )
        -			{
        -				$(n[i]).html( sOut );
        -			}
        -		}
        -	}
        -};
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Statics
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -
        -/**
        - * Scroller default settings for initialisation
        - *  @namespace
        - *  @name Scroller.defaults
        - *  @static
        - */
        -Scroller.defaults = /** @lends Scroller.defaults */{
        -	/**
        -	 * Indicate if Scroller show show trace information on the console or not. This can be
        -	 * useful when debugging Scroller or if just curious as to what it is doing, but should
        -	 * be turned off for production.
        -	 *  @type     bool
        -	 *  @default  false
        -	 *  @static
        -	 *  @example
        -	 *    var oTable = $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "oScroller": {
        -	 *          "trace": true
        -	 *        }
        -	 *    } );
        -	 */
        -	"trace": false,
        -
        -	/**
        -	 * Scroller will attempt to automatically calculate the height of rows for it's internal
        -	 * calculations. However the height that is used can be overridden using this parameter.
        -	 *  @type     int|string
        -	 *  @default  auto
        -	 *  @static
        -	 *  @example
        -	 *    var oTable = $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "oScroller": {
        -	 *          "rowHeight": 30
        -	 *        }
        -	 *    } );
        -	 */
        -	"rowHeight": "auto",
        -
        -	/**
        -	 * When using server-side processing, Scroller will wait a small amount of time to allow
        -	 * the scrolling to finish before requesting more data from the server. This prevents
        -	 * you from DoSing your own server! The wait time can be configured by this parameter.
        -	 *  @type     int
        -	 *  @default  200
        -	 *  @static
        -	 *  @example
        -	 *    var oTable = $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "oScroller": {
        -	 *          "serverWait": 100
        -	 *        }
        -	 *    } );
        -	 */
        -	"serverWait": 200,
        -
        -	/**
        -	 * The display buffer is what Scroller uses to calculate how many rows it should pre-fetch
        -	 * for scrolling. Scroller automatically adjusts DataTables' display length to pre-fetch
        -	 * rows that will be shown in "near scrolling" (i.e. just beyond the current display area).
        -	 * The value is based upon the number of rows that can be displayed in the viewport (i.e.
        -	 * a value of 1), and will apply the display range to records before before and after the
        -	 * current viewport - i.e. a factor of 3 will allow Scroller to pre-fetch 1 viewport's worth
        -	 * of rows before the current viewport, the current viewport's rows and 1 viewport's worth
        -	 * of rows after the current viewport. Adjusting this value can be useful for ensuring
        -	 * smooth scrolling based on your data set.
        -	 *  @type     int
        -	 *  @default  7
        -	 *  @static
        -	 *  @example
        -	 *    var oTable = $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "oScroller": {
        -	 *          "displayBuffer": 10
        -	 *        }
        -	 *    } );
        -	 */
        -	"displayBuffer": 9,
        -
        -	/**
        -	 * Scroller uses the boundary scaling factor to decide when to redraw the table - which it
        -	 * typically does before you reach the end of the currently loaded data set (in order to
        -	 * allow the data to look continuous to a user scrolling through the data). If given as 0
        -	 * then the table will be redrawn whenever the viewport is scrolled, while 1 would not
        -	 * redraw the table until the currently loaded data has all been shown. You will want
        -	 * something in the middle - the default factor of 0.5 is usually suitable.
        -	 *  @type     float
        -	 *  @default  0.5
        -	 *  @static
        -	 *  @example
        -	 *    var oTable = $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "oScroller": {
        -	 *          "boundaryScale": 0.75
        -	 *        }
        -	 *    } );
        -	 */
        -	"boundaryScale": 0.5,
        -
        -	/**
        -	 * Show (or not) the loading element in the background of the table. Note that you should
        -	 * include the dataTables.scroller.css file for this to be displayed correctly.
        -	 *  @type     boolean
        -	 *  @default  false
        -	 *  @static
        -	 *  @example
        -	 *    var oTable = $('#example').dataTable( {
        -	 *        "sScrollY": "200px",
        -	 *        "sDom": "frtiS",
        -	 *        "bDeferRender": true,
        -	 *        "oScroller": {
        -	 *          "loadingIndicator": true
        -	 *        }
        -	 *    } );
        -	 */
        -	"loadingIndicator": false
        -};
        -
        -Scroller.oDefaults = Scroller.defaults;
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Constants
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * Scroller version
        - *  @type      String
        - *  @default   See code
        - *  @name      Scroller.version
        - *  @static
        - */
        -Scroller.version = "1.2.2";
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Initialisation
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/*
        - * Register a new feature with DataTables
        - */
        -if ( typeof $.fn.dataTable == "function" &&
        -     typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
        -     $.fn.dataTableExt.fnVersionCheck('1.9.0') )
        -{
        -	$.fn.dataTableExt.aoFeatures.push( {
        -		"fnInit": function( oDTSettings ) {
        -			var init = oDTSettings.oInit;
        -			var opts = init.scroller || init.oScroller || {};
        -			var oScroller = new Scroller( oDTSettings, opts );
        -			return oScroller.dom.wrapper;
        -		},
        -		"cFeature": "S",
        -		"sFeature": "Scroller"
        -	} );
        -}
        -else
        -{
        -	alert( "Warning: Scroller requires DataTables 1.9.0 or greater - www.datatables.net/download");
        -}
        -
        -
        -// Attach Scroller to DataTables so it can be accessed as an 'extra'
        -$.fn.dataTable.Scroller = Scroller;
        -$.fn.DataTable.Scroller = Scroller;
        -
        -
        -// DataTables 1.10 API method aliases
        -if ( $.fn.dataTable.Api ) {
        -	var Api = $.fn.dataTable.Api;
        -
        -	Api.register( 'scroller()', function () {
        -		return this;
        -	} );
        -
        -	Api.register( 'scroller().rowToPixels()', function ( rowIdx, intParse, virtual ) {
        -		var ctx = this.context;
        -
        -		if ( ctx.length && ctx[0].oScroller ) {
        -			return ctx[0].oScroller.fnRowToPixels( rowIdx, intParse, virtual );
        -		}
        -		// undefined
        -	} );
        -
        -	Api.register( 'scroller().pixelsToRow()', function ( pixels, intParse, virtual ) {
        -		var ctx = this.context;
        -
        -		if ( ctx.length && ctx[0].oScroller ) {
        -			return ctx[0].oScroller.fnPixelsToRow( pixels, intParse, virtual );
        -		}
        -		// undefined
        -	} );
        -
        -	Api.register( 'scroller().scrollToRow()', function ( row, ani ) {
        -		this.iterator( 'table', function ( ctx ) {
        -			if ( ctx.oScroller ) {
        -				ctx.oScroller.fnScrollToRow( row, ani );
        -			}
        -		} );
        -
        -		return this;
        -	} );
        -
        -	Api.register( 'scroller().measure()', function ( redraw ) {
        -		this.iterator( 'table', function ( ctx ) {
        -			if ( ctx.oScroller ) {
        -				ctx.oScroller.fnMeasure( redraw );
        -			}
        -		} );
        -
        -		return this;
        -	} );
        -}
        -
        -
        -return Scroller;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.Scroller ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/Scroller/js/dataTables.scroller.min.js b/resources/assets/js/plugins/datatables/extensions/Scroller/js/dataTables.scroller.min.js
        deleted file mode 100755
        index d7aad08b48..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/Scroller/js/dataTables.scroller.min.js
        +++ /dev/null
        @@ -1,25 +0,0 @@
        -/*!
        - Scroller 1.2.2
        - ©2011-2014 SpryMedia Ltd - datatables.net/license
        -*/
        -(function(m,n,k){var l=function(e){var g=function(a,b){!this instanceof g?alert("Scroller warning: Scroller must be initialised with the 'new' keyword."):("undefined"==typeof b&&(b={}),this.s={dt:a,tableTop:0,tableBottom:0,redrawTop:0,redrawBottom:0,autoHeight:!0,viewportRows:0,stateTO:null,drawTO:null,heights:{jump:null,page:null,virtual:null,scroll:null,row:null,viewport:null},topRowFloat:0,scrollDrawDiff:null,loaderVisible:!1},this.s=e.extend(this.s,g.oDefaults,b),this.s.heights.row=this.s.rowHeight,
        -this.dom={force:n.createElement("div"),scroller:null,table:null,loader:null},this.s.dt.oScroller=this,this._fnConstruct())};g.prototype={fnRowToPixels:function(a,b,c){a=c?this._domain("virtualToPhysical",a*this.s.heights.row):this.s.baseScrollTop+(a-this.s.baseRowTop)*this.s.heights.row;return b||b===k?parseInt(a,10):a},fnPixelsToRow:function(a,b,c){var d=a-this.s.baseScrollTop,a=c?this._domain("physicalToVirtual",a)/this.s.heights.row:d/this.s.heights.row+this.s.baseRowTop;return b||b===k?parseInt(a,
        -10):a},fnScrollToRow:function(a,b){var c=this,d=!1,f=this.fnRowToPixels(a),h=a-(this.s.displayBuffer-1)/2*this.s.viewportRows;0>h&&(h=0);if((f>this.s.redrawBottom||f<this.s.redrawTop)&&this.s.dt._iDisplayStart!==h)d=!0,f=this.fnRowToPixels(a,!1,!0);"undefined"==typeof b||b?(this.s.ani=d,e(this.dom.scroller).animate({scrollTop:f},function(){setTimeout(function(){c.s.ani=!1},25)})):e(this.dom.scroller).scrollTop(f)},fnMeasure:function(a){this.s.autoHeight&&this._fnCalcRowHeight();var b=this.s.heights;
        -b.viewport=e(this.dom.scroller).height();this.s.viewportRows=parseInt(b.viewport/b.row,10)+1;this.s.dt._iDisplayLength=this.s.viewportRows*this.s.displayBuffer;(a===k||a)&&this.s.dt.oInstance.fnDraw()},_fnConstruct:function(){var a=this;if(this.s.dt.oFeatures.bPaginate){this.dom.force.style.position="absolute";this.dom.force.style.top="0px";this.dom.force.style.left="0px";this.dom.force.style.width="1px";this.dom.scroller=e("div."+this.s.dt.oClasses.sScrollBody,this.s.dt.nTableWrapper)[0];this.dom.scroller.appendChild(this.dom.force);
        -this.dom.scroller.style.position="relative";this.dom.table=e(">table",this.dom.scroller)[0];this.dom.table.style.position="absolute";this.dom.table.style.top="0px";this.dom.table.style.left="0px";e(this.s.dt.nTableWrapper).addClass("DTS");this.s.loadingIndicator&&(this.dom.loader=e('<div class="DTS_Loading">'+this.s.dt.oLanguage.sLoadingRecords+"</div>").css("display","none"),e(this.dom.scroller.parentNode).css("position","relative").append(this.dom.loader));this.s.heights.row&&"auto"!=this.s.heights.row&&
        -(this.s.autoHeight=!1);this.fnMeasure(!1);this.s.ingnoreScroll=!0;this.s.stateSaveThrottle=this.s.dt.oApi._fnThrottle(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},500);e(this.dom.scroller).on("scroll.DTS",function(){a._fnScroll.call(a)});e(this.dom.scroller).on("touchstart.DTS",function(){a._fnScroll.call(a)});this.s.dt.aoDrawCallback.push({fn:function(){a.s.dt.bInitialised&&a._fnDrawCallback.call(a)},sName:"Scroller"});e(m).on("resize.DTS",function(){a.fnMeasure(false);a._fnInfo()});var b=!0;this.s.dt.oApi._fnCallbackReg(this.s.dt,
        -"aoStateSaveParams",function(c,d){if(b&&a.s.dt.oLoadedState){d.iScroller=a.s.dt.oLoadedState.iScroller;d.iScrollerTopRow=a.s.dt.oLoadedState.iScrollerTopRow;b=false}else{d.iScroller=a.dom.scroller.scrollTop;d.iScrollerTopRow=a.s.topRowFloat}},"Scroller_State");this.s.dt.oLoadedState&&(this.s.topRowFloat=this.s.dt.oLoadedState.iScrollerTopRow||0);this.s.dt.aoDestroyCallback.push({sName:"Scroller",fn:function(){e(m).off("resize.DTS");e(a.dom.scroller).off("touchstart.DTS scroll.DTS");e(a.s.dt.nTableWrapper).removeClass("DTS");
        -e("div.DTS_Loading",a.dom.scroller.parentNode).remove();a.dom.table.style.position="";a.dom.table.style.top="";a.dom.table.style.left=""}})}else this.s.dt.oApi._fnLog(this.s.dt,0,"Pagination must be enabled for Scroller")},_fnScroll:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d;if(!this.s.skip&&!this.s.ingnoreScroll)if(this.s.dt.bFiltered||this.s.dt.bSorted)this.s.lastScrollTop=0;else{this._fnInfo();clearTimeout(this.s.stateTO);this.s.stateTO=setTimeout(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},
        -250);if(c<this.s.redrawTop||c>this.s.redrawBottom){var f=Math.ceil((this.s.displayBuffer-1)/2*this.s.viewportRows);Math.abs(c-this.s.lastScrollTop)>b.viewport||this.s.ani?(d=parseInt(this._domain("physicalToVirtual",c)/b.row,10)-f,this.s.topRowFloat=this._domain("physicalToVirtual",c)/b.row):(d=this.fnPixelsToRow(c)-f,this.s.topRowFloat=this.fnPixelsToRow(c,!1));0>=d?d=0:d+this.s.dt._iDisplayLength>this.s.dt.fnRecordsDisplay()?(d=this.s.dt.fnRecordsDisplay()-this.s.dt._iDisplayLength,0>d&&(d=0)):
        -0!==d%2&&d++;if(d!=this.s.dt._iDisplayStart&&(this.s.tableTop=e(this.s.dt.nTable).offset().top,this.s.tableBottom=e(this.s.dt.nTable).height()+this.s.tableTop,b=function(){if(a.s.scrollDrawReq===null)a.s.scrollDrawReq=c;a.s.dt._iDisplayStart=d;a.s.dt.oApi._fnCalculateEnd&&a.s.dt.oApi._fnCalculateEnd(a.s.dt);a.s.dt.oApi._fnDraw(a.s.dt)},this.s.dt.oFeatures.bServerSide?(clearTimeout(this.s.drawTO),this.s.drawTO=setTimeout(b,this.s.serverWait)):b(),this.dom.loader&&!this.s.loaderVisible))this.dom.loader.css("display",
        -"block"),this.s.loaderVisible=!0}this.s.lastScrollTop=c;this.s.stateSaveThrottle()}},_domain:function(a,b){var c=this.s.heights,d;if(c.virtual===c.scroll){d=(c.virtual-c.viewport)/(c.scroll-c.viewport);if("virtualToPhysical"===a)return b/d;if("physicalToVirtual"===a)return b*d}var e=(c.scroll-c.viewport)/2,h=(c.virtual-c.viewport)/2;d=h/(e*e);if("virtualToPhysical"===a){if(b<h)return Math.pow(b/d,0.5);b=2*h-b;return 0>b?c.scroll:2*e-Math.pow(b/d,0.5)}if("physicalToVirtual"===a){if(b<e)return b*b*
        -d;b=2*e-b;return 0>b?c.virtual:2*h-b*b*d}},_fnDrawCallback:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d=e(this.s.dt.nTable).height(),f=this.s.dt._iDisplayStart,h=this.s.dt._iDisplayLength,g=this.s.dt.fnRecordsDisplay();this.s.skip=!0;this._fnScrollForce();c=0===f?this.s.topRowFloat*b.row:f+h>=g?b.scroll-(g-this.s.topRowFloat)*b.row:this._domain("virtualToPhysical",this.s.topRowFloat*b.row);this.dom.scroller.scrollTop=c;this.s.baseScrollTop=c;this.s.baseRowTop=this.s.topRowFloat;
        -var j=c-(this.s.topRowFloat-f)*b.row;0===f?j=0:f+h>=g&&(j=b.scroll-d);this.dom.table.style.top=j+"px";this.s.tableTop=j;this.s.tableBottom=d+this.s.tableTop;d=(c-this.s.tableTop)*this.s.boundaryScale;this.s.redrawTop=c-d;this.s.redrawBottom=c+d;this.s.skip=!1;this.s.dt.oFeatures.bStateSave&&null!==this.s.dt.oLoadedState&&"undefined"!=typeof this.s.dt.oLoadedState.iScroller?((c=(this.s.dt.sAjaxSource||a.s.dt.ajax)&&!this.s.dt.oFeatures.bServerSide?!0:!1)&&2==this.s.dt.iDraw||!c&&1==this.s.dt.iDraw)&&
        -setTimeout(function(){e(a.dom.scroller).scrollTop(a.s.dt.oLoadedState.iScroller);a.s.redrawTop=a.s.dt.oLoadedState.iScroller-b.viewport/2;setTimeout(function(){a.s.ingnoreScroll=!1},0)},0):a.s.ingnoreScroll=!1;setTimeout(function(){a._fnInfo.call(a)},0);this.dom.loader&&this.s.loaderVisible&&(this.dom.loader.css("display","none"),this.s.loaderVisible=!1)},_fnScrollForce:function(){var a=this.s.heights;a.virtual=a.row*this.s.dt.fnRecordsDisplay();a.scroll=a.virtual;1E6<a.scroll&&(a.scroll=1E6);this.dom.force.style.height=
        -a.scroll+"px"},_fnCalcRowHeight:function(){var a=this.s.dt,b=a.nTable,c=b.cloneNode(!1),d=e("<tbody/>").appendTo(c),f=e('<div class="'+a.oClasses.sWrapper+' DTS"><div class="'+a.oClasses.sScrollWrapper+'"><div class="'+a.oClasses.sScrollBody+'"></div></div></div>');for(e("tbody tr:lt(4)",b).clone().appendTo(d);3>e("tr",d).length;)d.append("<tr><td>&nbsp;</td></tr>");e("div."+a.oClasses.sScrollBody,f).append(c);a._bInitComplete?a=b.parentNode:(this.s.dt.nHolding||(this.s.dt.nHolding=e("<div></div>").insertBefore(this.s.dt.nTable)),
        -a=this.s.dt.nHolding);f.appendTo(a);this.s.heights.row=e("tr",d).eq(1).outerHeight();f.remove()},_fnInfo:function(){if(this.s.dt.oFeatures.bInfo){var a=this.s.dt,b=a.oLanguage,c=this.dom.scroller.scrollTop,d=Math.floor(this.fnPixelsToRow(c,!1,this.s.ani)+1),f=a.fnRecordsTotal(),h=a.fnRecordsDisplay(),c=Math.ceil(this.fnPixelsToRow(c+this.s.heights.viewport,!1,this.s.ani)),c=h<c?h:c,g=a.fnFormatNumber(d),j=a.fnFormatNumber(c),i=a.fnFormatNumber(f),k=a.fnFormatNumber(h),g=0===a.fnRecordsDisplay()&&
        -a.fnRecordsDisplay()==a.fnRecordsTotal()?b.sInfoEmpty+b.sInfoPostFix:0===a.fnRecordsDisplay()?b.sInfoEmpty+" "+b.sInfoFiltered.replace("_MAX_",i)+b.sInfoPostFix:a.fnRecordsDisplay()==a.fnRecordsTotal()?b.sInfo.replace("_START_",g).replace("_END_",j).replace("_MAX_",i).replace("_TOTAL_",k)+b.sInfoPostFix:b.sInfo.replace("_START_",g).replace("_END_",j).replace("_MAX_",i).replace("_TOTAL_",k)+" "+b.sInfoFiltered.replace("_MAX_",a.fnFormatNumber(a.fnRecordsTotal()))+b.sInfoPostFix;(b=b.fnInfoCallback)&&
        -(g=b.call(a.oInstance,a,d,c,f,h,g));a=a.aanFeatures.i;if("undefined"!=typeof a){d=0;for(f=a.length;d<f;d++)e(a[d]).html(g)}}}};g.defaults={trace:!1,rowHeight:"auto",serverWait:200,displayBuffer:9,boundaryScale:0.5,loadingIndicator:!1};g.oDefaults=g.defaults;g.version="1.2.2";"function"==typeof e.fn.dataTable&&"function"==typeof e.fn.dataTableExt.fnVersionCheck&&e.fn.dataTableExt.fnVersionCheck("1.9.0")?e.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInit;return(new g(a,b.scroller||
        -b.oScroller||{})).dom.wrapper},cFeature:"S",sFeature:"Scroller"}):alert("Warning: Scroller requires DataTables 1.9.0 or greater - www.datatables.net/download");e.fn.dataTable.Scroller=g;e.fn.DataTable.Scroller=g;if(e.fn.dataTable.Api){var i=e.fn.dataTable.Api;i.register("scroller()",function(){return this});i.register("scroller().rowToPixels()",function(a,b,c){var d=this.context;if(d.length&&d[0].oScroller)return d[0].oScroller.fnRowToPixels(a,b,c)});i.register("scroller().pixelsToRow()",function(a,
        -b,c){var d=this.context;if(d.length&&d[0].oScroller)return d[0].oScroller.fnPixelsToRow(a,b,c)});i.register("scroller().scrollToRow()",function(a,b){this.iterator("table",function(c){c.oScroller&&c.oScroller.fnScrollToRow(a,b)});return this});i.register("scroller().measure()",function(a){this.iterator("table",function(b){b.oScroller&&b.oScroller.fnMeasure(a)});return this})}return g};"function"===typeof define&&define.amd?define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),
        -require("datatables")):jQuery&&!jQuery.fn.dataTable.Scroller&&l(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/Readme.md b/resources/assets/js/plugins/datatables/extensions/TableTools/Readme.md
        deleted file mode 100755
        index d83ea9f596..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/Readme.md
        +++ /dev/null
        @@ -1,41 +0,0 @@
        -# TableTools
        -
        -TableTools is a plug-in for the DataTables HTML table enhancer, which adds a highly customisable button toolbar to a DataTable. Key features include:
        -
        -* Copy to clipboard
        -* Save table data as CSV, XLS or PDF files
        -* Print view for clean printing
        -* Row selection options
        -* Easy use predefined buttons
        -* Simple customisation of buttons
        -* Well defined API for advanced control
        -
        -
        -# Installation
        -
        -To use TableTools, first download DataTables ( http://datatables.net/download ) and place the unzipped TableTools package into a `extensions` directory in the DataTables package (in DataTables 1.9- use the `extras` directory). This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser.
        -
        -
        -# Basic usage
        -
        -TableTools is initialised using the `T` option that it adds to DataTables' `dom` option. For example:
        -
        -```js
        -$(document).ready( function () {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip'
        -	} );
        -} );
        -```
        -
        -
        -# Documentation / support
        -
        -* Documentation: http://datatables.net/extensions/tabletools/
        -* DataTables support forums: http://datatables.net/forums
        -
        -
        -# GitHub
        -
        -If you fancy getting involved with the development of TableTools and help make it better, please refer to its GitHub repo: https://github.com/DataTables/TableTools
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.css b/resources/assets/js/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.css
        deleted file mode 100755
        index c959b111f4..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.css
        +++ /dev/null
        @@ -1,361 +0,0 @@
        -/*
        - * File:        TableTools.css
        - * Description: Styles for TableTools 2
        - * Author:      Allan Jardine (www.sprymedia.co.uk)
        - * Language:    Javascript
        - * License:     GPL v2 / 3 point BSD
        - * Project:     DataTables
        - * 
        - * Copyright 2009-2012 Allan Jardine, all rights reserved.
        - *
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - *
        - * CSS name space:
        - *   DTTT                  DataTables TableTools
        - *
        - * Style sheet provides:
        - *   CONTAINER             TableTools container element and styles applying to all components
        - *   BUTTON_STYLES         Action specific button styles
        - *   SELECTING             Row selection styles
        - *   COLLECTIONS           Drop down list (collection) styles
        - *   PRINTING              Print display styles
        - */
        -
        -
        -/*
        - * CONTAINER
        - * TableTools container element and styles applying to all components
        - */
        -div.DTTT_container {
        -	position: relative;
        -	float: right;
        -	margin-bottom: 1em;
        -}
        -
        -@media screen and (max-width: 640px) {
        -	div.DTTT_container {
        -		float: none !important;
        -		text-align: center;
        -	}
        -
        -	div.DTTT_container:after {
        -		visibility: hidden;
        -		display: block;
        -		content: "";
        -		clear: both;
        -		height: 0;
        -	}
        -}
        -
        -
        -button.DTTT_button,
        -div.DTTT_button,
        -a.DTTT_button {
        -	position: relative;
        -	display: inline-block;
        -	margin-right: 3px;
        -	padding: 5px 8px;
        -	border: 1px solid #999;
        -	cursor: pointer;
        -	*cursor: hand;
        -	font-size: 0.88em;
        -	color: black !important;
        -
        -	-webkit-border-radius: 2px;
        -	   -moz-border-radius: 2px;
        -	    -ms-border-radius: 2px;
        -	     -o-border-radius: 2px;
        -	        border-radius: 2px;
        -
        -	-webkit-box-shadow: 1px 1px 3px #ccc;
        -	   -moz-box-shadow: 1px 1px 3px #ccc;
        -	    -ms-box-shadow: 1px 1px 3px #ccc;
        -	     -o-box-shadow: 1px 1px 3px #ccc;
        -	        box-shadow: 1px 1px 3px #ccc;
        -
        -	/* Generated by http://www.colorzilla.com/gradient-editor/ */
        -	background: #ffffff; /* Old browsers */
        -	background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */
        -}
        -
        -
        -/* Buttons are cunning border-box sizing - we can't just use that for A and DIV due to IE6/7 */
        -button.DTTT_button {
        -	height: 30px;
        -	padding: 3px 8px;
        -}
        -
        -.DTTT_button embed { 
        -	outline: none;
        -}
        -
        -button.DTTT_button:hover:not(.DTTT_disabled),
        -div.DTTT_button:hover:not(.DTTT_disabled),
        -a.DTTT_button:hover:not(.DTTT_disabled) {
        -	border: 1px solid #666;
        -	text-decoration: none !important;
        -
        -	-webkit-box-shadow: 1px 1px 3px #999;
        -	   -moz-box-shadow: 1px 1px 3px #999;
        -	    -ms-box-shadow: 1px 1px 3px #999;
        -	     -o-box-shadow: 1px 1px 3px #999;
        -	        box-shadow: 1px 1px 3px #999;
        -
        -	background: #f3f3f3; /* Old browsers */
        -	background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */
        -}
        -
        -button.DTTT_button:focus,
        -div.DTTT_button:focus,
        -a.DTTT_button:focus {
        -	border: 1px solid #426c9e;
        -	text-shadow: 0 1px 0 #c4def1;
        -	outline: none;
        -
        -	background-color: #a3d0ef 100%;
        -	background-image: -webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
        -	background-image:    -moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
        -	background-image:     -ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
        -	background-image:      -o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
        -	background-image:         linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
        -	filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef');
        -}
        -
        -button.DTTT_button:active:not(.DTTT_disabled),
        -div.DTTT_button:active:not(.DTTT_disabled),
        -a.DTTT_button:active:not(.DTTT_disabled) {
        -	-webkit-box-shadow: inset 1px 1px 3px #999999;
        -	-moz-box-shadow: inset 1px 1px 3px #999999;
        -	box-shadow: inset 1px 1px 3px #999999;
        -}
        -
        -button.DTTT_disabled,
        -div.DTTT_disabled,
        -a.DTTT_disabled {
        -	color: #999 !important;
        -	border: 1px solid #d0d0d0;
        -	cursor: default;
        -	background: #ffffff; /* Old browsers */
        -	background: -webkit-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa',GradientType=0 ); /* IE6-9 */
        -}
        -
        -
        -
        -/*
        - * BUTTON_STYLES
        - * Action specific button styles
        - * If you want images - comment this back in
        -
        -a.DTTT_button_csv,
        -a.DTTT_button_xls,
        -a.DTTT_button_copy,
        -a.DTTT_button_pdf,
        -a.DTTT_button_print {
        -	padding-right: 0px;
        -}
        -
        -a.DTTT_button_csv span,
        -a.DTTT_button_xls span,
        -a.DTTT_button_copy span,
        -a.DTTT_button_pdf span,
        -a.DTTT_button_print span {
        -	display: inline-block;
        -	height: 24px;
        -	line-height: 24px;
        -	padding-right: 30px;
        -}
        -
        -
        -a.DTTT_button_csv span { background: url(../images/csv.png) no-repeat bottom right; }
        -a.DTTT_button_csv:hover span { background: url(../images/csv_hover.png) no-repeat center right; }
        -
        -a.DTTT_button_xls span { background: url(../images/xls.png) no-repeat center right; }
        -a.DTTT_button_xls:hover span { background: #f0f0f0 url(../images/xls_hover.png) no-repeat center right; }
        -
        -a.DTTT_button_copy span { background: url(../images/copy.png) no-repeat center right; }
        -a.DTTT_button_copy:hover span { background: #f0f0f0 url(../images/copy_hover.png) no-repeat center right; }
        -
        -a.DTTT_button_pdf span { background: url(../images/pdf.png) no-repeat center right; }
        -a.DTTT_button_pdf:hover span { background: #f0f0f0 url(../images/pdf_hover.png) no-repeat center right; }
        -
        -a.DTTT_button_print span { background: url(../images/print.png) no-repeat center right; }
        -a.DTTT_button_print:hover span { background: #f0f0f0 url(../images/print_hover.png) no-repeat center right; }
        -
        - */
        -
        -button.DTTT_button_collection span {
        -	padding-right: 17px;
        -	background: url(../images/collection.png) no-repeat center right;
        -}
        -
        -button.DTTT_button_collection:hover span {
        -	padding-right: 17px;
        -	background: #f0f0f0 url(../images/collection_hover.png) no-repeat center right;
        -}
        -
        -
        -/*
        - * SELECTING
        - * Row selection styles
        - */
        -table.DTTT_selectable tbody tr {
        -	cursor: pointer;
        -	*cursor: hand;
        -}
        -
        -table.dataTable tr.DTTT_selected.odd {
        -	background-color: #9FAFD1;
        -}
        -
        -table.dataTable tr.DTTT_selected.odd td.sorting_1 {
        -	background-color: #9FAFD1;
        -}
        -
        -table.dataTable tr.DTTT_selected.odd td.sorting_2 {
        -	background-color: #9FAFD1;
        -}
        -
        -table.dataTable tr.DTTT_selected.odd td.sorting_3 {
        -	background-color: #9FAFD1;
        -}
        -
        -
        -table.dataTable tr.DTTT_selected.even {
        -	background-color: #B0BED9;
        -}
        -
        -table.dataTable tr.DTTT_selected.even td.sorting_1 {
        -	background-color: #B0BED9;
        -}
        -
        -table.dataTable tr.DTTT_selected.even td.sorting_2 {
        -	background-color: #B0BED9;
        -}
        -
        -table.dataTable tr.DTTT_selected.even td.sorting_3 {
        -	background-color: #B0BED9;
        -}
        -
        -
        -/*
        - * COLLECTIONS
        - * Drop down list (collection) styles
        - */
        -
        -div.DTTT_collection {
        -	width: 150px;
        -	padding: 8px 8px 4px 8px;
        -	border: 1px solid #ccc;
        -	border: 1px solid rgba( 0, 0, 0, 0.4 );
        -	background-color: #f3f3f3;
        -	background-color: rgba( 255, 255, 255, 0.3 );
        -	overflow: hidden;
        -	z-index: 2002;
        -
        -	-webkit-border-radius: 5px;
        -	   -moz-border-radius: 5px;
        -	    -ms-border-radius: 5px;
        -	     -o-border-radius: 5px;
        -	        border-radius: 5px;
        -	
        -	-webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	   -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	    -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	     -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -	        box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
        -}
        -
        -div.DTTT_collection_background {
        -	background: black;
        -	z-index: 2001;
        -}
        -
        -div.DTTT_collection button.DTTT_button,
        -div.DTTT_collection div.DTTT_button,
        -div.DTTT_collection a.DTTT_button {
        -	position: relative;
        -	left: 0;
        -	right: 0;
        -
        -	display: block;
        -	float: none;
        -	margin-bottom: 4px;
        -	
        -	-webkit-box-shadow: 1px 1px 3px #999;
        -	   -moz-box-shadow: 1px 1px 3px #999;
        -	    -ms-box-shadow: 1px 1px 3px #999;
        -	     -o-box-shadow: 1px 1px 3px #999;
        -	        box-shadow: 1px 1px 3px #999;
        -}
        -
        -
        -/*
        - * PRINTING
        - * Print display styles
        - */
        -
        -.DTTT_print_info {
        -	position: fixed;
        -	top: 50%;
        -	left: 50%;
        -	width: 400px;
        -	height: 150px;
        -	margin-left: -200px;
        -	margin-top: -75px;
        -	text-align: center;
        -	color: #333;
        -	padding: 10px 30px;
        -
        -	background: #ffffff; /* Old browsers */
        -	background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */
        -	background:    -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */
        -	background:     -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */
        -	background:      -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */
        -	background:         linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */
        -	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */
        -	
        -	opacity: 0.95;
        -
        -	border: 1px solid black;
        -	border: 1px solid rgba(0, 0, 0, 0.5);
        -	
        -	-webkit-border-radius: 6px;
        -	   -moz-border-radius: 6px;
        -	    -ms-border-radius: 6px;
        -	     -o-border-radius: 6px;
        -	        border-radius: 6px;
        -	
        -	-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        -	   -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        -	    -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        -	     -o-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        -	        box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        -}
        -
        -.DTTT_print_info h6 {
        -	font-weight: normal;
        -	font-size: 28px;
        -	line-height: 28px;
        -	margin: 1em;
        -}
        -
        -.DTTT_print_info p {
        -	font-size: 14px;
        -	line-height: 20px;
        -}
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.min.css b/resources/assets/js/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.min.css
        deleted file mode 100755
        index 61a89d5239..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -div.DTTT_container{position:relative;float:right;margin-bottom:1em}@media screen and (max-width: 640px){div.DTTT_container{float:none !important;text-align:center}div.DTTT_container:after{visibility:hidden;display:block;content:"";clear:both;height:0}}button.DTTT_button,div.DTTT_button,a.DTTT_button{position:relative;display:inline-block;margin-right:3px;padding:5px 8px;border:1px solid #999;cursor:pointer;*cursor:hand;font-size:0.88em;color:black !important;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;-ms-box-shadow:1px 1px 3px #ccc;-o-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 )}button.DTTT_button{height:30px;padding:3px 8px}.DTTT_button embed{outline:none}button.DTTT_button:hover:not(.DTTT_disabled),div.DTTT_button:hover:not(.DTTT_disabled),a.DTTT_button:hover:not(.DTTT_disabled){border:1px solid #666;text-decoration:none !important;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background:#f3f3f3;background:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 )}button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus{border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#a3d0ef 100%;background-image:-webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef')}button.DTTT_button:active:not(.DTTT_disabled),div.DTTT_button:active:not(.DTTT_disabled),a.DTTT_button:active:not(.DTTT_disabled){-webkit-box-shadow:inset 1px 1px 3px #999999;-moz-box-shadow:inset 1px 1px 3px #999999;box-shadow:inset 1px 1px 3px #999999}button.DTTT_disabled,div.DTTT_disabled,a.DTTT_disabled{color:#999 !important;border:1px solid #d0d0d0;cursor:default;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-moz-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-ms-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-o-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fafafa',GradientType=0 )}button.DTTT_button_collection span{padding-right:17px;background:url(../images/collection.png) no-repeat center right}button.DTTT_button_collection:hover span{padding-right:17px;background:#f0f0f0 url(../images/collection_hover.png) no-repeat center right}table.DTTT_selectable tbody tr{cursor:pointer;*cursor:hand}table.dataTable tr.DTTT_selected.odd{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_1{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_2{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_3{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.even{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_1{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_2{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_3{background-color:#B0BED9}div.DTTT_collection{width:150px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-moz-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-ms-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-o-box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-shadow:3px 3px 5px rgba(0,0,0,0.3)}div.DTTT_collection_background{background:black;z-index:2001}div.DTTT_collection button.DTTT_button,div.DTTT_collection div.DTTT_button,div.DTTT_collection a.DTTT_button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999}.DTTT_print_info{position:fixed;top:50%;left:50%;width:400px;height:150px;margin-left:-200px;margin-top:-75px;text-align:center;color:#333;padding:10px 30px;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 );opacity:0.95;border:1px solid black;border:1px solid rgba(0,0,0,0.5);-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.5);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.5);-ms-box-shadow:0 3px 7px rgba(0,0,0,0.5);-o-box-shadow:0 3px 7px rgba(0,0,0,0.5);box-shadow:0 3px 7px rgba(0,0,0,0.5)}.DTTT_print_info h6{font-weight:normal;font-size:28px;line-height:28px;margin:1em}.DTTT_print_info p{font-size:14px;line-height:20px}
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/ajax.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/ajax.html
        deleted file mode 100755
        index a37670a328..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/ajax.html
        +++ /dev/null
        @@ -1,190 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Ajax loaded data</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		"ajax": "../../../../examples/ajax/data/objects.txt",
        -		"columns": [
        -			{ "data": "name" },
        -			{ "data": "position" },
        -			{ "data": "office" },
        -			{ "data": "extn" },
        -			{ "data": "start_date" },
        -			{ "data": "salary" }
        -		],
        -		deferRender: true
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Ajax loaded data</span></h1>
        -
        -			<div class="info">
        -				<p>This TableTools example shows DataTables using its ability to <a href="//datatables.net/manual/data#Objects">Ajax load object based data</a> and operate in
        -				exactly the same manner as when the data is read directly from the document.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Extn.</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		&quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;,
        -		&quot;columns&quot;: [
        -			{ &quot;data&quot;: &quot;name&quot; },
        -			{ &quot;data&quot;: &quot;position&quot; },
        -			{ &quot;data&quot;: &quot;office&quot; },
        -			{ &quot;data&quot;: &quot;extn&quot; },
        -			{ &quot;data&quot;: &quot;start_date&quot; },
        -			{ &quot;data&quot;: &quot;salary&quot; }
        -		],
        -		deferRender: true
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li class="active"><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/alter_buttons.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/alter_buttons.html
        deleted file mode 100755
        index 87c41481f0..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/alter_buttons.html
        +++ /dev/null
        @@ -1,637 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Button arrangement</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			"aButtons": [ "copy", "print" ]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Button arrangement</span></h1>
        -
        -			<div class="info">
        -				<p>TableTools makes it very simple to arrange the buttons in the toolbar as you see fit. Using the <code>aButtons</code> parameter you can use any of the <a href=
        -				"http://datatables.net/extensions/tabletools/buttons">predefined buttons</a> or <a href="http://datatables.net/extensions/tabletools/button_options">customised
        -				buttons</a>. The example below shows how TableTools can be initialised to provide only the 'copy-to-clipboard' and 'print view' options (i.e. no save to local file
        -				option is available).</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			&quot;aButtons&quot;: [ &quot;copy&quot;, &quot;print&quot; ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li class="active"><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/bootstrap.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/bootstrap.html
        deleted file mode 100755
        index 24b2c0bb2b..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/bootstrap.html
        +++ /dev/null
        @@ -1,645 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Bootstrap styling</title>
        -	<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
        -	<link rel="stylesheet" type="text/css" href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	body { font-size: 140%; }
        -	div.DTTT { margin-bottom: 0.5em; float: right; }
        -	div.dataTables_wrapper { clear: both; }
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var tt = new $.fn.dataTable.TableTools( table );
        -
        -	$( tt.fnContainer() ).insertBefore('div.dataTables_wrapper');
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Bootstrap styling</span></h1>
        -
        -			<div class="info">
        -				<p><a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a> is a very powerful design framework for allowing you to very quickly create applications
        -				with a unified look and feel. <a href="http://datatables.net/manual/styling/bootstrap">DataTables integrates well</a> with Bootstrap, and so does TableTools.</p>
        -
        -				<p>This example shows the default Bootstrap theme being used with a Bootstrap styled DataTable. The <a href="new_init.html"><code>new</code></a> form of
        -				initialising TableTools is used here, as the Bootstrap integration uses a complex <a href="//datatables.net/reference/option/dom"><code class="option" title=
        -				"DataTables initialisation option">dom<span>DT</span></code></a> option (it is possible to provide a custom <a href=
        -				"//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> option if you want to, this is
        -				just for simplicity!).</p>
        -			</div>
        -
        -			<table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var tt = new $.fn.dataTable.TableTools( table );
        -
        -	$( tt.fnContainer() ).insertBefore('div.dataTables_wrapper');
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -						<li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">body { font-size: 140%; }
        -	div.DTTT { margin-bottom: 0.5em; float: right; }
        -	div.dataTables_wrapper { clear: both; }</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css</a></li>
        -						<li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li class="active"><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/button_text.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/button_text.html
        deleted file mode 100755
        index 20565db1a2..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/button_text.html
        +++ /dev/null
        @@ -1,669 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Custom button text</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		"dom": 'T<"clear">lfrtip',
        -		"tableTools": {
        -			"aButtons": [
        -				{
        -					"sExtends": "copy",
        -					"sButtonText": "Copy to clipboard"
        -				},
        -				{
        -					"sExtends": "csv",
        -					"sButtonText": "Save to CSV"
        -				},
        -				{
        -					"sExtends": "xls",
        -					"oSelectorOpts": {
        -						page: 'current'
        -					}
        -				}
        -			]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Custom button text</span></h1>
        -
        -			<div class="info">
        -				<p>You may wish to set your own text for the buttons in the TableTools toolbar, rather than relying on the default built-in text. This is done by overriding the
        -				<code>sButtonText</code> parameter of whatever button you wish to alter. The way TableTools allows you to alter a predefined button is by 'extending' it (using the
        -				<code>sExtends</code> parameter) and then setting the overriding parameter.</p>
        -
        -				<p>A full list of the parameters which can be used is <a href="http://datatables.net/extensions/tabletools/button_options">available on the DataTables.net
        -				web-site</a>. This example shows how to set the button text as required.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		&quot;dom&quot;: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		&quot;tableTools&quot;: {
        -			&quot;aButtons&quot;: [
        -				{
        -					&quot;sExtends&quot;: &quot;copy&quot;,
        -					&quot;sButtonText&quot;: &quot;Copy to clipboard&quot;
        -				},
        -				{
        -					&quot;sExtends&quot;: &quot;csv&quot;,
        -					&quot;sButtonText&quot;: &quot;Save to CSV&quot;
        -				},
        -				{
        -					&quot;sExtends&quot;: &quot;xls&quot;,
        -					&quot;oSelectorOpts&quot;: {
        -						page: 'current'
        -					}
        -				}
        -			]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li class="active"><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/collection.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/collection.html
        deleted file mode 100755
        index 26b4a20959..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/collection.html
        +++ /dev/null
        @@ -1,654 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Button collections</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		"dom": 'T<"clear">lfrtip',
        -		"tableTools": {
        -			"aButtons": [
        -				"copy",
        -				"print",
        -				{
        -					"sExtends":    "collection",
        -					"sButtonText": "Save",
        -					"aButtons":    [ "csv", "xls", "pdf" ]
        -				}
        -			]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Button collections</span></h1>
        -
        -			<div class="info">
        -				<p>TableTools provides the ability to group buttons into a hidden drop down list, which is activated by clicking on a top-level button. This is achieved by
        -				extending the 'collection' predefined button type and setting it's <code>aButtons</code> parameter with the same options as the top level buttons (note that you
        -				cannot currently use a collection within a collection).</p>
        -
        -				<p>The example below shows the file save buttons grouped into a collection, while the copy and print buttons are left on the top level.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		&quot;dom&quot;: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		&quot;tableTools&quot;: {
        -			&quot;aButtons&quot;: [
        -				&quot;copy&quot;,
        -				&quot;print&quot;,
        -				{
        -					&quot;sExtends&quot;:    &quot;collection&quot;,
        -					&quot;sButtonText&quot;: &quot;Save&quot;,
        -					&quot;aButtons&quot;:    [ &quot;csv&quot;, &quot;xls&quot;, &quot;pdf&quot; ]
        -				}
        -			]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li class="active"><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/defaults.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/defaults.html
        deleted file mode 100755
        index e821b4aca8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/defaults.html
        +++ /dev/null
        @@ -1,634 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Defaults</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$.fn.dataTable.TableTools.defaults.aButtons = [ "copy", "csv", "xls" ];
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Defaults</span></h1>
        -
        -			<div class="info">
        -				<p>TableTools provides the ability to override the default initialisation parameters that are used when creating a new instance. This this particularly useful if
        -				you have multiple tables which you want to have the same TableTools behaviour - rather than declaring the structure multiple times, you can just set the defaults
        -				once. This example shows how to alter the default buttons.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$.fn.dataTable.TableTools.defaults.aButtons = [ &quot;copy&quot;, &quot;csv&quot;, &quot;xls&quot; ];
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li class="active"><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/index.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/index.html
        deleted file mode 100755
        index f975882350..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/index.html
        +++ /dev/null
        @@ -1,80 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -
        -	<title>TableTools examples - TableTools examples</title>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>TableTools examples</span></h1>
        -
        -			<div class="info">
        -				<p>TableTools is a plug-in for the DataTables HTML table enhancer, which adds a highly customisable button toolbar to a DataTable. Key features include:</p>
        -
        -				<ul class="markdown">
        -					<li>Copy to clipboard</li>
        -					<li>Save table data as CSV, XLS or PDF files</li>
        -					<li>Print view for clean printing</li>
        -					<li>Row selection options</li>
        -					<li>Easy use predefined buttons</li>
        -					<li>Simple customisation of buttons</li>
        -					<li>Well defined API for advanced control</li>
        -				</ul>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/jqueryui.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/jqueryui.html
        deleted file mode 100755
        index d075c9094d..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/jqueryui.html
        +++ /dev/null
        @@ -1,637 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - jQuery UI styling</title>
        -	<link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
        -	<link rel="stylesheet" type="text/css" href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../Plugins/integration/jqueryui/dataTables.jqueryui.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		lengthChange: false
        -	} );
        -
        -	var tt = new $.fn.dataTable.TableTools( table );
        -	$( tt.fnContainer() ).insertBefore('div.dataTables_filter');
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>jQuery UI styling</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows the TableTools buttons being styled by jQuery UI ThemeRoller. This allows the TableTools buttons to have the same look-and-feel as other
        -				buttons on your site if you are already using jQuery UI.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable( {
        -		lengthChange: false
        -	} );
        -
        -	var tt = new $.fn.dataTable.TableTools( table );
        -	$( tt.fnContainer() ).insertBefore('div.dataTables_filter');
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -						<li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.js">../../Plugins/integration/jqueryui/dataTables.jqueryui.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css</a></li>
        -						<li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">../../Plugins/integration/jqueryui/dataTables.jqueryui.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li class="active"><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/multi_instance.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/multi_instance.html
        deleted file mode 100755
        index caf3317a95..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/multi_instance.html
        +++ /dev/null
        @@ -1,638 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Multiple toolbars</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip<"clear spacer">T',
        -		tableTools: {
        -			"aButtons": [ "copy", "print" ]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Multiple toolbars</span></h1>
        -
        -			<div class="info">
        -				<p>Like all DataTables control elements, TableTools can have multiple instances specified in the <a href="//datatables.net/reference/option/dom"><code class=
        -				"option" title="DataTables initialisation option">dom<span>DT</span></code></a> parameter of DataTables. This will create two TableTools toolbars next to the
        -				table, providing the same functions.</p>
        -
        -				<p>An example of when this might be useful is to show the toolbar both above and below the table - as is done in this example.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip&lt;&quot;clear spacer&quot;&gt;T',
        -		tableTools: {
        -			&quot;aButtons&quot;: [ &quot;copy&quot;, &quot;print&quot; ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li class="active"><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/multiple_tables.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/multiple_tables.html
        deleted file mode 100755
        index e39d4d094e..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/multiple_tables.html
        +++ /dev/null
        @@ -1,343 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Multiple tables</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Multiple tables</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows how multiple tables can be initialised with DataTables and TableTools in a single call to the <code>$().DataTable()</code> function.
        -				Basically it works as you would expect - no special considerations need be made!</p>
        -			</div>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>$183,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<table id="" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>$103,500</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li class="active"><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/new_init.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/new_init.html
        deleted file mode 100755
        index 129f9e8a70..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/new_init.html
        +++ /dev/null
        @@ -1,644 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Initialisation with `new`</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var tt = new $.fn.dataTable.TableTools( table, {
        -		sRowSelect: 'single'
        -	} );
        -
        -	$( tt.fnContainer() ).insertAfter('div.info');
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Initialisation with `new`</span></h1>
        -
        -			<div class="info">
        -				<p>Typically when working with TableTools, the initialisation and insertion into the DOM will be done automatically by DataTables, through the use of the <a href=
        -				"//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> parameter. However, it is also
        -				possible to initialise TableTools manually as shown in the example below using <code>new $.fn.dataTable.TableTools();</code>. The constructor for TableTools takes
        -				two parameters:</p>
        -
        -				<ol class="markdown">
        -					<li>The DataTable that the newly created TableTools instance should attach to</li>
        -					<li>Optionally - A list of options</li>
        -				</ol>
        -
        -				<p>Once initialised you can insert the TableTools tool bar node anywhere you wish into the DOM using the <code>fnContainer()</code> API method to get the node.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	var table = $('#example').DataTable();
        -	var tt = new $.fn.dataTable.TableTools( table, {
        -		sRowSelect: 'single'
        -	} );
        -
        -	$( tt.fnContainer() ).insertAfter('div.info');
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li class="active"><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/pdf_message.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/pdf_message.html
        deleted file mode 100755
        index 18afd9e766..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/pdf_message.html
        +++ /dev/null
        @@ -1,655 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - PDF message</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			"aButtons": [
        -				"copy",
        -				"csv",
        -				"xls",
        -				{
        -					"sExtends": "pdf",
        -					"sPdfOrientation": "landscape",
        -					"sPdfMessage": "Your custom message would go here."
        -				},
        -				"print"
        -			]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>PDF message</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows how you can add a message to the saved PDF using the <code>sPdfMessage</code> parameter. It also shows that the orientation of the output PDF
        -				can be changed to landscape which is useful if you have a lot of columns.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			&quot;aButtons&quot;: [
        -				&quot;copy&quot;,
        -				&quot;csv&quot;,
        -				&quot;xls&quot;,
        -				{
        -					&quot;sExtends&quot;: &quot;pdf&quot;,
        -					&quot;sPdfOrientation&quot;: &quot;landscape&quot;,
        -					&quot;sPdfMessage&quot;: &quot;Your custom message would go here.&quot;
        -				},
        -				&quot;print&quot;
        -			]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li class="active"><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/plug-in.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/plug-in.html
        deleted file mode 100755
        index 0c6bfb0178..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/plug-in.html
        +++ /dev/null
        @@ -1,682 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Plug-in button types</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$.fn.dataTable.TableTools.buttons.copy_to_div = $.extend(
        -	true,
        -	{},
        -	$.fn.dataTable.TableTools.buttonBase,
        -	{
        -		"sNewLine":    "<br>",
        -		"sButtonText": "Copy to element",
        -		"target":      "",
        -		"fnClick": function( button, conf ) {
        -			$(conf.target).html( this.fnGetTableData(conf) );
        -		}
        -	}
        -);
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			"aButtons": [ {
        -				"sExtends":    "copy_to_div",
        -				"sButtonText": "Copy to HTML",
        -				"target":      "#copy"
        -			} ]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Plug-in button types</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows now a plug-in button type can be created for TableTools. Button types are attached to the <code>$.fn.dataTable.TableTools.buttons</code>
        -				object and extend <code>$.fn.dataTable.TableTools.buttonBase</code>. All of the <a href="//datatables.net/extensions/tabletools/button_options">button options
        -				defined in the documentation</a> are available and can be overridden as required. Finally to use the button simply include its name in the <code>aButtons</code>
        -				array or use it as a button extender (<code>sExtends</code>).</p>
        -
        -				<p>This example shows a button which will simply get the data contents of a table and set that as the contents of another element.</p>
        -			</div>
        -
        -			<div id="copy" class="box" style="height: 100px; overflow: auto">
        -				Copy output will go here
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$.fn.dataTable.TableTools.buttons.copy_to_div = $.extend(
        -	true,
        -	{},
        -	$.fn.dataTable.TableTools.buttonBase,
        -	{
        -		&quot;sNewLine&quot;:    &quot;&lt;br&gt;&quot;,
        -		&quot;sButtonText&quot;: &quot;Copy to element&quot;,
        -		&quot;target&quot;:      &quot;&quot;,
        -		&quot;fnClick&quot;: function( button, conf ) {
        -			$(conf.target).html( this.fnGetTableData(conf) );
        -		}
        -	}
        -);
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			&quot;aButtons&quot;: [ {
        -				&quot;sExtends&quot;:    &quot;copy_to_div&quot;,
        -				&quot;sButtonText&quot;: &quot;Copy to HTML&quot;,
        -				&quot;target&quot;:      &quot;#copy&quot;
        -			} ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li class="active"><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_column.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_column.html
        deleted file mode 100755
        index e8e370633d..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_column.html
        +++ /dev/null
        @@ -1,228 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Row selection - row selector on specific cells</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	tr td:first-child {
        -		text-align: center;
        -	}
        -
        -	tr td:first-child:before {
        -		content: "\f096"; /* fa-square-o */
        -		font-family: FontAwesome;
        -	}
        -
        -	tr.selected td:first-child:before {
        -		content: "\f046"; /* fa-check-square-o */
        -	}
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax: "../../../examples/ajax/data/objects.txt",
        -		columns: [
        -			{ data: null, defaultContent: '', orderable: false },
        -			{ data: 'name' },
        -			{ data: 'position' },
        -			{ data: 'office' },
        -			{ data: 'extn' },
        -			{ data: 'start_date' },
        -			{ data: 'salary' }
        -		],
        -		order: [ 1, 'asc' ],
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			sRowSelect:   'os',
        -			sRowSelector: 'td:first-child',
        -			aButtons:     [ 'select_all', 'select_none' ]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Row selection - row selector on specific cells</span></h1>
        -
        -			<div class="info">
        -				<p>By default, TableTools' row selector option will register a row selection click on any part of the row. Although this is often desirable, you might wish at
        -				times to limit the row selection to just a single column, or other elements in the row. This might be useful, for example, with <a href=
        -				"//editor.datatables.net">Editor's</a> inline editing, so you don't select the row on click of a cell that is to be edited.</p>
        -
        -				<p>The <code>sRowSelector</code> method provides this ability, allowing a custom jQuery selector to be passed in. TableTools will use the parent row of any element
        -				that is selected by the end user.</p>
        -
        -				<p>In this case, the row selector is attached to the cells in the first column of the table, and <a href="http://fortawesome.github.io/Font-Awesome">Font
        -				Awesome</a> is used to display a checkbox indicating the selection state of the row, in addition to the row background colouring.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>
        -
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		ajax: &quot;../../../examples/ajax/data/objects.txt&quot;,
        -		columns: [
        -			{ data: null, defaultContent: '', orderable: false },
        -			{ data: 'name' },
        -			{ data: 'position' },
        -			{ data: 'office' },
        -			{ data: 'extn' },
        -			{ data: 'start_date' },
        -			{ data: 'salary' }
        -		],
        -		order: [ 1, 'asc' ],
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			sRowSelect:   'os',
        -			sRowSelector: 'td:first-child',
        -			aButtons:     [ 'select_all', 'select_none' ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css">tr td:first-child {
        -		text-align: center;
        -	}
        -
        -	tr td:first-child:before {
        -		content: &quot;\f096&quot;; /* fa-square-o */
        -		font-family: FontAwesome;
        -	}
        -
        -	tr.selected td:first-child:before {
        -		content: &quot;\f046&quot;; /* fa-check-square-o */
        -	}</code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -						<li><a href=
        -						"//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css">//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li class="active"><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_multi.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_multi.html
        deleted file mode 100755
        index cbcca65fd8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_multi.html
        +++ /dev/null
        @@ -1,649 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Row selection - multi-row select</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			"sRowSelect": "multi",
        -			"aButtons": [ "select_all", "select_none" ]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Row selection - multi-row select</span></h1>
        -
        -			<div class="info">
        -				<p>As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. TableTools has four row selection modes of
        -				operation:</p>
        -
        -				<ul class="markdown">
        -					<li><code>none</code> - Default, where no user row selection options are available</li>
        -					<li><code>single</code> - A single row can be selected</li>
        -					<li><code>multi</code> - Multiple rows can be selected simply by clicking on the rows</li>
        -					<li><code>os</code> - Operating System like selection where you can use the shift and ctrl / cmd keys on your keyboard to add / remove rows from the
        -					selection.</li>
        -				</ul>
        -
        -				<p>This example shows the <code>multi</code> select option. There are also a number of <a href="http://datatables.net/extras/tabletools/buttons">pre-defined
        -				buttons</a> to provide functions such as select-all and select-none, as shown in this example.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			&quot;sRowSelect&quot;: &quot;multi&quot;,
        -			&quot;aButtons&quot;: [ &quot;select_all&quot;, &quot;select_none&quot; ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li class="active"><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_os.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_os.html
        deleted file mode 100755
        index 54e0afe8d6..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_os.html
        +++ /dev/null
        @@ -1,649 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Row selection - operating system style</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			"sRowSelect": "os",
        -			"aButtons": [ "select_all", "select_none" ]
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Row selection - operating system style</span></h1>
        -
        -			<div class="info">
        -				<p>As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. TableTools has four row selection modes of
        -				operation:</p>
        -
        -				<ul class="markdown">
        -					<li><code>none</code> - Default, where no user row selection options are available</li>
        -					<li><code>single</code> - A single row can be selected</li>
        -					<li><code>multi</code> - Multiple rows can be selected simply by clicking on the rows</li>
        -					<li><code>os</code> - Operating System like selection where you can use the shift and ctrl / cmd keys on your keyboard to add / remove rows from the
        -					selection.</li>
        -				</ul>
        -
        -				<p>This example shows the <code>os</code> select option. Without keyboard interaction a single row can be selected at a time, but multiple rows can be selected in
        -				a range using the shift key, while rows can be added and removed from the selection using the ctrl / cmd key.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			&quot;sRowSelect&quot;: &quot;os&quot;,
        -			&quot;aButtons&quot;: [ &quot;select_all&quot;, &quot;select_none&quot; ]
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li class="active"><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_single.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_single.html
        deleted file mode 100755
        index 33cff2ff95..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/select_single.html
        +++ /dev/null
        @@ -1,646 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Row selection - single row select</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			"sRowSelect": "single"
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Row selection - single row select</span></h1>
        -
        -			<div class="info">
        -				<p>As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. TableTools has four row selection modes of
        -				operation:</p>
        -
        -				<ul class="markdown">
        -					<li><code>none</code> - Default, where no user row selection options are available</li>
        -					<li><code>single</code> - A single row can be selected</li>
        -					<li><code>multi</code> - Multiple rows can be selected simply by clicking on the rows</li>
        -					<li><code>os</code> - Operating System like selection where you can use the shift and ctrl / cmd keys on your keyboard to add / remove rows from the
        -					selection.</li>
        -				</ul>
        -
        -				<p>This example shows the <code>single</code> select option.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			&quot;sRowSelect&quot;: &quot;single&quot;
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li class="active"><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/simple.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/simple.html
        deleted file mode 100755
        index dbc77e4744..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/simple.html
        +++ /dev/null
        @@ -1,633 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Basic initialisation</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip'
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Basic initialisation</span></h1>
        -
        -			<div class="info">
        -				<p>This example shows the basic initialisation of TableTools by simply including the <code class="string" title="String">T</code> option in DataTables' <a href=
        -				"//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> parameter. This tell DataTables
        -				to insert the TableTools toolbar in that location. Remember to include the Javascript and CSS source files as well!</p>
        -
        -				<p>It is worth noting that you might need to <a href="swf_path.html">set the <code>sSwfPath</code> parameter</a> to tell TableTools where to find the SWF file for
        -				copy and file save.</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip'
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li class="active"><a href="./simple.html">Basic initialisation</a></li>
        -							<li><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/swf_path.html b/resources/assets/js/plugins/datatables/extensions/TableTools/examples/swf_path.html
        deleted file mode 100755
        index 0ab0c136e8..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/examples/swf_path.html
        +++ /dev/null
        @@ -1,639 +0,0 @@
        -<!DOCTYPE html>
        -<html>
        -<head>
        -	<meta charset="utf-8">
        -	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
        -	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
        -
        -	<title>TableTools example - Setting the SWF path</title>
        -	<link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css">
        -	<link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css">
        -	<link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css">
        -	<style type="text/css" class="init">
        -
        -	</style>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script>
        -	<script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script>
        -	<script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script>
        -	<script type="text/javascript" language="javascript" class="init">
        -
        -
        -$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T<"clear">lfrtip',
        -		tableTools: {
        -			"sSwfPath": "../swf/copy_csv_xls_pdf.swf"
        -		}
        -	} );
        -} );
        -
        -
        -	</script>
        -</head>
        -
        -<body class="dt-example">
        -	<div class="container">
        -		<section>
        -			<h1>TableTools example <span>Setting the SWF path</span></h1>
        -
        -			<div class="info">
        -				<p>TableTools uses a Flash SWF file to provide the ability to copy text to the system clipboard and save files locally. TableTools must be able to load the SWF
        -				file in order to provide these facilities. If you aren't using the same directory structure as the TableTools package, you will need to set the
        -				<code>sSwfPath</code> TableTools parameter, as shown in this example.</p>
        -
        -				<p>Note that TableTools ships with two different SWF files - the only difference between them is that one of them provides the ability to save PDF files while the
        -				other doesn't. The trade off is that the PDF capable file is significantly larger in size (56K v 2K).</p>
        -			</div>
        -
        -			<table id="example" class="display" cellspacing="0" width="100%">
        -				<thead>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</thead>
        -
        -				<tfoot>
        -					<tr>
        -						<th>Name</th>
        -						<th>Position</th>
        -						<th>Office</th>
        -						<th>Age</th>
        -						<th>Start date</th>
        -						<th>Salary</th>
        -					</tr>
        -				</tfoot>
        -
        -				<tbody>
        -					<tr>
        -						<td>Tiger Nixon</td>
        -						<td>System Architect</td>
        -						<td>Edinburgh</td>
        -						<td>61</td>
        -						<td>2011/04/25</td>
        -						<td>$320,800</td>
        -					</tr>
        -					<tr>
        -						<td>Garrett Winters</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>63</td>
        -						<td>2011/07/25</td>
        -						<td>$170,750</td>
        -					</tr>
        -					<tr>
        -						<td>Ashton Cox</td>
        -						<td>Junior Technical Author</td>
        -						<td>San Francisco</td>
        -						<td>66</td>
        -						<td>2009/01/12</td>
        -						<td>$86,000</td>
        -					</tr>
        -					<tr>
        -						<td>Cedric Kelly</td>
        -						<td>Senior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2012/03/29</td>
        -						<td>$433,060</td>
        -					</tr>
        -					<tr>
        -						<td>Airi Satou</td>
        -						<td>Accountant</td>
        -						<td>Tokyo</td>
        -						<td>33</td>
        -						<td>2008/11/28</td>
        -						<td>$162,700</td>
        -					</tr>
        -					<tr>
        -						<td>Brielle Williamson</td>
        -						<td>Integration Specialist</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2012/12/02</td>
        -						<td>$372,000</td>
        -					</tr>
        -					<tr>
        -						<td>Herrod Chandler</td>
        -						<td>Sales Assistant</td>
        -						<td>San Francisco</td>
        -						<td>59</td>
        -						<td>2012/08/06</td>
        -						<td>$137,500</td>
        -					</tr>
        -					<tr>
        -						<td>Rhona Davidson</td>
        -						<td>Integration Specialist</td>
        -						<td>Tokyo</td>
        -						<td>55</td>
        -						<td>2010/10/14</td>
        -						<td>$327,900</td>
        -					</tr>
        -					<tr>
        -						<td>Colleen Hurst</td>
        -						<td>Javascript Developer</td>
        -						<td>San Francisco</td>
        -						<td>39</td>
        -						<td>2009/09/15</td>
        -						<td>$205,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sonya Frost</td>
        -						<td>Software Engineer</td>
        -						<td>Edinburgh</td>
        -						<td>23</td>
        -						<td>2008/12/13</td>
        -						<td>$103,600</td>
        -					</tr>
        -					<tr>
        -						<td>Jena Gaines</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>30</td>
        -						<td>2008/12/19</td>
        -						<td>$90,560</td>
        -					</tr>
        -					<tr>
        -						<td>Quinn Flynn</td>
        -						<td>Support Lead</td>
        -						<td>Edinburgh</td>
        -						<td>22</td>
        -						<td>2013/03/03</td>
        -						<td>$342,000</td>
        -					</tr>
        -					<tr>
        -						<td>Charde Marshall</td>
        -						<td>Regional Director</td>
        -						<td>San Francisco</td>
        -						<td>36</td>
        -						<td>2008/10/16</td>
        -						<td>$470,600</td>
        -					</tr>
        -					<tr>
        -						<td>Haley Kennedy</td>
        -						<td>Senior Marketing Designer</td>
        -						<td>London</td>
        -						<td>43</td>
        -						<td>2012/12/18</td>
        -						<td>$313,500</td>
        -					</tr>
        -					<tr>
        -						<td>Tatyana Fitzpatrick</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>19</td>
        -						<td>2010/03/17</td>
        -						<td>$385,750</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Silva</td>
        -						<td>Marketing Designer</td>
        -						<td>London</td>
        -						<td>66</td>
        -						<td>2012/11/27</td>
        -						<td>$198,500</td>
        -					</tr>
        -					<tr>
        -						<td>Paul Byrd</td>
        -						<td>Chief Financial Officer (CFO)</td>
        -						<td>New York</td>
        -						<td>64</td>
        -						<td>2010/06/09</td>
        -						<td>$725,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gloria Little</td>
        -						<td>Systems Administrator</td>
        -						<td>New York</td>
        -						<td>59</td>
        -						<td>2009/04/10</td>
        -						<td>$237,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bradley Greer</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>41</td>
        -						<td>2012/10/13</td>
        -						<td>$132,000</td>
        -					</tr>
        -					<tr>
        -						<td>Dai Rios</td>
        -						<td>Personnel Lead</td>
        -						<td>Edinburgh</td>
        -						<td>35</td>
        -						<td>2012/09/26</td>
        -						<td>$217,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jenette Caldwell</td>
        -						<td>Development Lead</td>
        -						<td>New York</td>
        -						<td>30</td>
        -						<td>2011/09/03</td>
        -						<td>$345,000</td>
        -					</tr>
        -					<tr>
        -						<td>Yuri Berry</td>
        -						<td>Chief Marketing Officer (CMO)</td>
        -						<td>New York</td>
        -						<td>40</td>
        -						<td>2009/06/25</td>
        -						<td>$675,000</td>
        -					</tr>
        -					<tr>
        -						<td>Caesar Vance</td>
        -						<td>Pre-Sales Support</td>
        -						<td>New York</td>
        -						<td>21</td>
        -						<td>2011/12/12</td>
        -						<td>$106,450</td>
        -					</tr>
        -					<tr>
        -						<td>Doris Wilder</td>
        -						<td>Sales Assistant</td>
        -						<td>Sidney</td>
        -						<td>23</td>
        -						<td>2010/09/20</td>
        -						<td>$85,600</td>
        -					</tr>
        -					<tr>
        -						<td>Angelica Ramos</td>
        -						<td>Chief Executive Officer (CEO)</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2009/10/09</td>
        -						<td>$1,200,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Joyce</td>
        -						<td>Developer</td>
        -						<td>Edinburgh</td>
        -						<td>42</td>
        -						<td>2010/12/22</td>
        -						<td>$92,575</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Chang</td>
        -						<td>Regional Director</td>
        -						<td>Singapore</td>
        -						<td>28</td>
        -						<td>2010/11/14</td>
        -						<td>$357,650</td>
        -					</tr>
        -					<tr>
        -						<td>Brenden Wagner</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>28</td>
        -						<td>2011/06/07</td>
        -						<td>$206,850</td>
        -					</tr>
        -					<tr>
        -						<td>Fiona Green</td>
        -						<td>Chief Operating Officer (COO)</td>
        -						<td>San Francisco</td>
        -						<td>48</td>
        -						<td>2010/03/11</td>
        -						<td>$850,000</td>
        -					</tr>
        -					<tr>
        -						<td>Shou Itou</td>
        -						<td>Regional Marketing</td>
        -						<td>Tokyo</td>
        -						<td>20</td>
        -						<td>2011/08/14</td>
        -						<td>$163,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michelle House</td>
        -						<td>Integration Specialist</td>
        -						<td>Sidney</td>
        -						<td>37</td>
        -						<td>2011/06/02</td>
        -						<td>$95,400</td>
        -					</tr>
        -					<tr>
        -						<td>Suki Burks</td>
        -						<td>Developer</td>
        -						<td>London</td>
        -						<td>53</td>
        -						<td>2009/10/22</td>
        -						<td>$114,500</td>
        -					</tr>
        -					<tr>
        -						<td>Prescott Bartlett</td>
        -						<td>Technical Author</td>
        -						<td>London</td>
        -						<td>27</td>
        -						<td>2011/05/07</td>
        -						<td>$145,000</td>
        -					</tr>
        -					<tr>
        -						<td>Gavin Cortez</td>
        -						<td>Team Leader</td>
        -						<td>San Francisco</td>
        -						<td>22</td>
        -						<td>2008/10/26</td>
        -						<td>$235,500</td>
        -					</tr>
        -					<tr>
        -						<td>Martena Mccray</td>
        -						<td>Post-Sales support</td>
        -						<td>Edinburgh</td>
        -						<td>46</td>
        -						<td>2011/03/09</td>
        -						<td>$324,050</td>
        -					</tr>
        -					<tr>
        -						<td>Unity Butler</td>
        -						<td>Marketing Designer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/12/09</td>
        -						<td>$85,675</td>
        -					</tr>
        -					<tr>
        -						<td>Howard Hatfield</td>
        -						<td>Office Manager</td>
        -						<td>San Francisco</td>
        -						<td>51</td>
        -						<td>2008/12/16</td>
        -						<td>$164,500</td>
        -					</tr>
        -					<tr>
        -						<td>Hope Fuentes</td>
        -						<td>Secretary</td>
        -						<td>San Francisco</td>
        -						<td>41</td>
        -						<td>2010/02/12</td>
        -						<td>$109,850</td>
        -					</tr>
        -					<tr>
        -						<td>Vivian Harrell</td>
        -						<td>Financial Controller</td>
        -						<td>San Francisco</td>
        -						<td>62</td>
        -						<td>2009/02/14</td>
        -						<td>$452,500</td>
        -					</tr>
        -					<tr>
        -						<td>Timothy Mooney</td>
        -						<td>Office Manager</td>
        -						<td>London</td>
        -						<td>37</td>
        -						<td>2008/12/11</td>
        -						<td>$136,200</td>
        -					</tr>
        -					<tr>
        -						<td>Jackson Bradshaw</td>
        -						<td>Director</td>
        -						<td>New York</td>
        -						<td>65</td>
        -						<td>2008/09/26</td>
        -						<td>$645,750</td>
        -					</tr>
        -					<tr>
        -						<td>Olivia Liang</td>
        -						<td>Support Engineer</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2011/02/03</td>
        -						<td>$234,500</td>
        -					</tr>
        -					<tr>
        -						<td>Bruno Nash</td>
        -						<td>Software Engineer</td>
        -						<td>London</td>
        -						<td>38</td>
        -						<td>2011/05/03</td>
        -						<td>$163,500</td>
        -					</tr>
        -					<tr>
        -						<td>Sakura Yamamoto</td>
        -						<td>Support Engineer</td>
        -						<td>Tokyo</td>
        -						<td>37</td>
        -						<td>2009/08/19</td>
        -						<td>$139,575</td>
        -					</tr>
        -					<tr>
        -						<td>Thor Walton</td>
        -						<td>Developer</td>
        -						<td>New York</td>
        -						<td>61</td>
        -						<td>2013/08/11</td>
        -						<td>$98,540</td>
        -					</tr>
        -					<tr>
        -						<td>Finn Camacho</td>
        -						<td>Support Engineer</td>
        -						<td>San Francisco</td>
        -						<td>47</td>
        -						<td>2009/07/07</td>
        -						<td>$87,500</td>
        -					</tr>
        -					<tr>
        -						<td>Serge Baldwin</td>
        -						<td>Data Coordinator</td>
        -						<td>Singapore</td>
        -						<td>64</td>
        -						<td>2012/04/09</td>
        -						<td>$138,575</td>
        -					</tr>
        -					<tr>
        -						<td>Zenaida Frank</td>
        -						<td>Software Engineer</td>
        -						<td>New York</td>
        -						<td>63</td>
        -						<td>2010/01/04</td>
        -						<td>$125,250</td>
        -					</tr>
        -					<tr>
        -						<td>Zorita Serrano</td>
        -						<td>Software Engineer</td>
        -						<td>San Francisco</td>
        -						<td>56</td>
        -						<td>2012/06/01</td>
        -						<td>$115,000</td>
        -					</tr>
        -					<tr>
        -						<td>Jennifer Acosta</td>
        -						<td>Junior Javascript Developer</td>
        -						<td>Edinburgh</td>
        -						<td>43</td>
        -						<td>2013/02/01</td>
        -						<td>$75,650</td>
        -					</tr>
        -					<tr>
        -						<td>Cara Stevens</td>
        -						<td>Sales Assistant</td>
        -						<td>New York</td>
        -						<td>46</td>
        -						<td>2011/12/06</td>
        -						<td>$145,600</td>
        -					</tr>
        -					<tr>
        -						<td>Hermione Butler</td>
        -						<td>Regional Director</td>
        -						<td>London</td>
        -						<td>47</td>
        -						<td>2011/03/21</td>
        -						<td>$356,250</td>
        -					</tr>
        -					<tr>
        -						<td>Lael Greer</td>
        -						<td>Systems Administrator</td>
        -						<td>London</td>
        -						<td>21</td>
        -						<td>2009/02/27</td>
        -						<td>$103,500</td>
        -					</tr>
        -					<tr>
        -						<td>Jonas Alexander</td>
        -						<td>Developer</td>
        -						<td>San Francisco</td>
        -						<td>30</td>
        -						<td>2010/07/14</td>
        -						<td>$86,500</td>
        -					</tr>
        -					<tr>
        -						<td>Shad Decker</td>
        -						<td>Regional Director</td>
        -						<td>Edinburgh</td>
        -						<td>51</td>
        -						<td>2008/11/13</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Michael Bruce</td>
        -						<td>Javascript Developer</td>
        -						<td>Singapore</td>
        -						<td>29</td>
        -						<td>2011/06/27</td>
        -						<td>$183,000</td>
        -					</tr>
        -					<tr>
        -						<td>Donna Snider</td>
        -						<td>Customer Support</td>
        -						<td>New York</td>
        -						<td>27</td>
        -						<td>2011/01/25</td>
        -						<td>$112,000</td>
        -					</tr>
        -				</tbody>
        -			</table>
        -
        -			<ul class="tabs">
        -				<li class="active">Javascript</li>
        -				<li>HTML</li>
        -				<li>CSS</li>
        -				<li>Ajax</li>
        -				<li>Server-side script</li>
        -			</ul>
        -
        -			<div class="tabs">
        -				<div class="js">
        -					<p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() {
        -	$('#example').DataTable( {
        -		dom: 'T&lt;&quot;clear&quot;&gt;lfrtip',
        -		tableTools: {
        -			&quot;sSwfPath&quot;: &quot;../swf/copy_csv_xls_pdf.swf&quot;
        -		}
        -	} );
        -} );</code>
        -
        -					<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li>
        -						<li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li>
        -						<li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="table">
        -					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
        -				</div>
        -
        -				<div class="css">
        -					<div>
        -						<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
        -						additional CSS used is shown below:</p><code class="multiline language-css"></code>
        -					</div>
        -
        -					<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
        -
        -					<ul>
        -						<li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li>
        -						<li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li>
        -					</ul>
        -				</div>
        -
        -				<div class="ajax">
        -					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
        -					loaded.</p>
        -				</div>
        -
        -				<div class="php">
        -					<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
        -					processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
        -					documentation</a>.</p>
        -				</div>
        -			</div>
        -		</section>
        -	</div>
        -
        -	<section>
        -		<div class="footer">
        -			<div class="gradient"></div>
        -
        -			<div class="liner">
        -				<h2>Other examples</h2>
        -
        -				<div class="toc">
        -					<div class="toc-group">
        -						<h3><a href="./index.html">Examples</a></h3>
        -						<ul class="toc active">
        -							<li><a href="./simple.html">Basic initialisation</a></li>
        -							<li class="active"><a href="./swf_path.html">Setting the SWF path</a></li>
        -							<li><a href="./new_init.html">Initialisation with `new`</a></li>
        -							<li><a href="./defaults.html">Defaults</a></li>
        -							<li><a href="./select_single.html">Row selection - single row select</a></li>
        -							<li><a href="./select_multi.html">Row selection - multi-row select</a></li>
        -							<li><a href="./select_os.html">Row selection - operating system style</a></li>
        -							<li><a href="./select_column.html">Row selection - row selector on specific cells</a></li>
        -							<li><a href="./multiple_tables.html">Multiple tables</a></li>
        -							<li><a href="./multi_instance.html">Multiple toolbars</a></li>
        -							<li><a href="./collection.html">Button collections</a></li>
        -							<li><a href="./plug-in.html">Plug-in button types</a></li>
        -							<li><a href="./button_text.html">Custom button text</a></li>
        -							<li><a href="./alter_buttons.html">Button arrangement</a></li>
        -							<li><a href="./ajax.html">Ajax loaded data</a></li>
        -							<li><a href="./pdf_message.html">PDF message</a></li>
        -							<li><a href="./bootstrap.html">Bootstrap styling</a></li>
        -							<li><a href="./jqueryui.html">jQuery UI styling</a></li>
        -						</ul>
        -					</div>
        -				</div>
        -
        -				<div class="epilogue">
        -					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
        -					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a>
        -					which extend the capabilities of DataTables.</p>
        -
        -					<p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br>
        -					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
        -				</div>
        -			</div>
        -		</div>
        -	</section>
        -</body>
        -</html>
        \ No newline at end of file
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/collection.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/collection.png
        deleted file mode 100755
        index 5dd4dfdf69..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/collection.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/collection_hover.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/collection_hover.png
        deleted file mode 100755
        index 7b37b1e963..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/collection_hover.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/copy.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/copy.png
        deleted file mode 100755
        index 5b01ab165a..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/copy.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/copy_hover.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/copy_hover.png
        deleted file mode 100755
        index 039a7fc32b..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/copy_hover.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/csv.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/csv.png
        deleted file mode 100755
        index 43df1559f7..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/csv.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/csv_hover.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/csv_hover.png
        deleted file mode 100755
        index 10b34d3b90..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/csv_hover.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/pdf.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/pdf.png
        deleted file mode 100755
        index 1b038d0884..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/pdf.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/pdf_hover.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/pdf_hover.png
        deleted file mode 100755
        index eb06855f4f..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/pdf_hover.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/print.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/print.png
        deleted file mode 100755
        index 2db08242a0..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/print.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/print_hover.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/print_hover.png
        deleted file mode 100755
        index 9808a9cc9c..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/print_hover.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/collection.psd b/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/collection.psd
        deleted file mode 100755
        index 7eb7caf2cc..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/collection.psd and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/copy document.psd b/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/copy document.psd
        deleted file mode 100755
        index ca207adc60..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/copy document.psd and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/file_types.psd b/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/file_types.psd
        deleted file mode 100755
        index 0f280ad520..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/file_types.psd and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/printer.psd b/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/printer.psd
        deleted file mode 100755
        index 8c33f7aaad..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/psd/printer.psd and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/xls.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/xls.png
        deleted file mode 100755
        index 5aaf40d0e3..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/xls.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/images/xls_hover.png b/resources/assets/js/plugins/datatables/extensions/TableTools/images/xls_hover.png
        deleted file mode 100755
        index 5b1930afd8..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/images/xls_hover.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.js b/resources/assets/js/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.js
        deleted file mode 100755
        index 749fcd8c6a..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.js
        +++ /dev/null
        @@ -1,3230 +0,0 @@
        -/*! TableTools 2.2.4
        - * 2009-2015 SpryMedia Ltd - datatables.net/license
        - *
        - * ZeroClipboard 1.0.4
        - * Author: Joseph Huckaby - MIT licensed
        - */
        -
        -/**
        - * @summary     TableTools
        - * @description Tools and buttons for DataTables
        - * @version     2.2.4
        - * @file        dataTables.tableTools.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2009-2015 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license/mit
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -
        -/* Global scope for TableTools for backwards compatibility.
        - * Will be removed in 2.3
        - */
        -var TableTools;
        -
        -(function(window, document, undefined) {
        -
        -
        -var factory = function( $, DataTable ) {
        -"use strict";
        -
        -
        -//include ZeroClipboard.js
        -/* ZeroClipboard 1.0.4
        - * Author: Joseph Huckaby
        - */
        -
        -var ZeroClipboard_TableTools = {
        -
        -	version: "1.0.4-TableTools2",
        -	clients: {}, // registered upload clients on page, indexed by id
        -	moviePath: '', // URL to movie
        -	nextId: 1, // ID of next movie
        -
        -	$: function(thingy) {
        -		// simple DOM lookup utility function
        -		if (typeof(thingy) == 'string') {
        -			thingy = document.getElementById(thingy);
        -		}
        -		if (!thingy.addClass) {
        -			// extend element with a few useful methods
        -			thingy.hide = function() { this.style.display = 'none'; };
        -			thingy.show = function() { this.style.display = ''; };
        -			thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
        -			thingy.removeClass = function(name) {
        -				this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
        -			};
        -			thingy.hasClass = function(name) {
        -				return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
        -			};
        -		}
        -		return thingy;
        -	},
        -
        -	setMoviePath: function(path) {
        -		// set path to ZeroClipboard.swf
        -		this.moviePath = path;
        -	},
        -
        -	dispatch: function(id, eventName, args) {
        -		// receive event from flash movie, send to client
        -		var client = this.clients[id];
        -		if (client) {
        -			client.receiveEvent(eventName, args);
        -		}
        -	},
        -
        -	register: function(id, client) {
        -		// register new client to receive events
        -		this.clients[id] = client;
        -	},
        -
        -	getDOMObjectPosition: function(obj) {
        -		// get absolute coordinates for dom element
        -		var info = {
        -			left: 0,
        -			top: 0,
        -			width: obj.width ? obj.width : obj.offsetWidth,
        -			height: obj.height ? obj.height : obj.offsetHeight
        -		};
        -
        -		if ( obj.style.width !== "" ) {
        -			info.width = obj.style.width.replace("px","");
        -		}
        -
        -		if ( obj.style.height !== "" ) {
        -			info.height = obj.style.height.replace("px","");
        -		}
        -
        -		while (obj) {
        -			info.left += obj.offsetLeft;
        -			info.top += obj.offsetTop;
        -			obj = obj.offsetParent;
        -		}
        -
        -		return info;
        -	},
        -
        -	Client: function(elem) {
        -		// constructor for new simple upload client
        -		this.handlers = {};
        -
        -		// unique ID
        -		this.id = ZeroClipboard_TableTools.nextId++;
        -		this.movieId = 'ZeroClipboard_TableToolsMovie_' + this.id;
        -
        -		// register client with singleton to receive flash events
        -		ZeroClipboard_TableTools.register(this.id, this);
        -
        -		// create movie
        -		if (elem) {
        -			this.glue(elem);
        -		}
        -	}
        -};
        -
        -ZeroClipboard_TableTools.Client.prototype = {
        -
        -	id: 0, // unique ID for us
        -	ready: false, // whether movie is ready to receive events or not
        -	movie: null, // reference to movie object
        -	clipText: '', // text to copy to clipboard
        -	fileName: '', // default file save name
        -	action: 'copy', // action to perform
        -	handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
        -	cssEffects: true, // enable CSS mouse effects on dom container
        -	handlers: null, // user event handlers
        -	sized: false,
        -
        -	glue: function(elem, title) {
        -		// glue to DOM element
        -		// elem can be ID or actual DOM element object
        -		this.domElement = ZeroClipboard_TableTools.$(elem);
        -
        -		// float just above object, or zIndex 99 if dom element isn't set
        -		var zIndex = 99;
        -		if (this.domElement.style.zIndex) {
        -			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
        -		}
        -
        -		// find X/Y position of domElement
        -		var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
        -
        -		// create floating DIV above element
        -		this.div = document.createElement('div');
        -		var style = this.div.style;
        -		style.position = 'absolute';
        -		style.left = '0px';
        -		style.top = '0px';
        -		style.width = (box.width) + 'px';
        -		style.height = box.height + 'px';
        -		style.zIndex = zIndex;
        -
        -		if ( typeof title != "undefined" && title !== "" ) {
        -			this.div.title = title;
        -		}
        -		if ( box.width !== 0 && box.height !== 0 ) {
        -			this.sized = true;
        -		}
        -
        -		// style.backgroundColor = '#f00'; // debug
        -		if ( this.domElement ) {
        -			this.domElement.appendChild(this.div);
        -			this.div.innerHTML = this.getHTML( box.width, box.height ).replace(/&/g, '&amp;');
        -		}
        -	},
        -
        -	positionElement: function() {
        -		var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
        -		var style = this.div.style;
        -
        -		style.position = 'absolute';
        -		//style.left = (this.domElement.offsetLeft)+'px';
        -		//style.top = this.domElement.offsetTop+'px';
        -		style.width = box.width + 'px';
        -		style.height = box.height + 'px';
        -
        -		if ( box.width !== 0 && box.height !== 0 ) {
        -			this.sized = true;
        -		} else {
        -			return;
        -		}
        -
        -		var flash = this.div.childNodes[0];
        -		flash.width = box.width;
        -		flash.height = box.height;
        -	},
        -
        -	getHTML: function(width, height) {
        -		// return HTML for movie
        -		var html = '';
        -		var flashvars = 'id=' + this.id +
        -			'&width=' + width +
        -			'&height=' + height;
        -
        -		if (navigator.userAgent.match(/MSIE/)) {
        -			// IE gets an OBJECT tag
        -			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
        -			html += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard_TableTools.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
        -		}
        -		else {
        -			// all other browsers get an EMBED tag
        -			html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard_TableTools.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
        -		}
        -		return html;
        -	},
        -
        -	hide: function() {
        -		// temporarily hide floater offscreen
        -		if (this.div) {
        -			this.div.style.left = '-2000px';
        -		}
        -	},
        -
        -	show: function() {
        -		// show ourselves after a call to hide()
        -		this.reposition();
        -	},
        -
        -	destroy: function() {
        -		// destroy control and floater
        -		if (this.domElement && this.div) {
        -			this.hide();
        -			this.div.innerHTML = '';
        -
        -			var body = document.getElementsByTagName('body')[0];
        -			try { body.removeChild( this.div ); } catch(e) {}
        -
        -			this.domElement = null;
        -			this.div = null;
        -		}
        -	},
        -
        -	reposition: function(elem) {
        -		// reposition our floating div, optionally to new container
        -		// warning: container CANNOT change size, only position
        -		if (elem) {
        -			this.domElement = ZeroClipboard_TableTools.$(elem);
        -			if (!this.domElement) {
        -				this.hide();
        -			}
        -		}
        -
        -		if (this.domElement && this.div) {
        -			var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
        -			var style = this.div.style;
        -			style.left = '' + box.left + 'px';
        -			style.top = '' + box.top + 'px';
        -		}
        -	},
        -
        -	clearText: function() {
        -		// clear the text to be copy / saved
        -		this.clipText = '';
        -		if (this.ready) {
        -			this.movie.clearText();
        -		}
        -	},
        -
        -	appendText: function(newText) {
        -		// append text to that which is to be copied / saved
        -		this.clipText += newText;
        -		if (this.ready) { this.movie.appendText(newText) ;}
        -	},
        -
        -	setText: function(newText) {
        -		// set text to be copied to be copied / saved
        -		this.clipText = newText;
        -		if (this.ready) { this.movie.setText(newText) ;}
        -	},
        -
        -	setCharSet: function(charSet) {
        -		// set the character set (UTF16LE or UTF8)
        -		this.charSet = charSet;
        -		if (this.ready) { this.movie.setCharSet(charSet) ;}
        -	},
        -
        -	setBomInc: function(bomInc) {
        -		// set if the BOM should be included or not
        -		this.incBom = bomInc;
        -		if (this.ready) { this.movie.setBomInc(bomInc) ;}
        -	},
        -
        -	setFileName: function(newText) {
        -		// set the file name
        -		this.fileName = newText;
        -		if (this.ready) {
        -			this.movie.setFileName(newText);
        -		}
        -	},
        -
        -	setAction: function(newText) {
        -		// set action (save or copy)
        -		this.action = newText;
        -		if (this.ready) {
        -			this.movie.setAction(newText);
        -		}
        -	},
        -
        -	addEventListener: function(eventName, func) {
        -		// add user event listener for event
        -		// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
        -		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
        -		if (!this.handlers[eventName]) {
        -			this.handlers[eventName] = [];
        -		}
        -		this.handlers[eventName].push(func);
        -	},
        -
        -	setHandCursor: function(enabled) {
        -		// enable hand cursor (true), or default arrow cursor (false)
        -		this.handCursorEnabled = enabled;
        -		if (this.ready) {
        -			this.movie.setHandCursor(enabled);
        -		}
        -	},
        -
        -	setCSSEffects: function(enabled) {
        -		// enable or disable CSS effects on DOM container
        -		this.cssEffects = !!enabled;
        -	},
        -
        -	receiveEvent: function(eventName, args) {
        -		var self;
        -
        -		// receive event from flash
        -		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
        -
        -		// special behavior for certain events
        -		switch (eventName) {
        -			case 'load':
        -				// movie claims it is ready, but in IE this isn't always the case...
        -				// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
        -				this.movie = document.getElementById(this.movieId);
        -				if (!this.movie) {
        -					self = this;
        -					setTimeout( function() { self.receiveEvent('load', null); }, 1 );
        -					return;
        -				}
        -
        -				// firefox on pc needs a "kick" in order to set these in certain cases
        -				if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
        -					self = this;
        -					setTimeout( function() { self.receiveEvent('load', null); }, 100 );
        -					this.ready = true;
        -					return;
        -				}
        -
        -				this.ready = true;
        -				this.movie.clearText();
        -				this.movie.appendText( this.clipText );
        -				this.movie.setFileName( this.fileName );
        -				this.movie.setAction( this.action );
        -				this.movie.setCharSet( this.charSet );
        -				this.movie.setBomInc( this.incBom );
        -				this.movie.setHandCursor( this.handCursorEnabled );
        -				break;
        -
        -			case 'mouseover':
        -				if (this.domElement && this.cssEffects) {
        -					//this.domElement.addClass('hover');
        -					if (this.recoverActive) {
        -						this.domElement.addClass('active');
        -					}
        -				}
        -				break;
        -
        -			case 'mouseout':
        -				if (this.domElement && this.cssEffects) {
        -					this.recoverActive = false;
        -					if (this.domElement.hasClass('active')) {
        -						this.domElement.removeClass('active');
        -						this.recoverActive = true;
        -					}
        -					//this.domElement.removeClass('hover');
        -				}
        -				break;
        -
        -			case 'mousedown':
        -				if (this.domElement && this.cssEffects) {
        -					this.domElement.addClass('active');
        -				}
        -				break;
        -
        -			case 'mouseup':
        -				if (this.domElement && this.cssEffects) {
        -					this.domElement.removeClass('active');
        -					this.recoverActive = false;
        -				}
        -				break;
        -		} // switch eventName
        -
        -		if (this.handlers[eventName]) {
        -			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
        -				var func = this.handlers[eventName][idx];
        -
        -				if (typeof(func) == 'function') {
        -					// actual function reference
        -					func(this, args);
        -				}
        -				else if ((typeof(func) == 'object') && (func.length == 2)) {
        -					// PHP style object + method, i.e. [myObject, 'myMethod']
        -					func[0][ func[1] ](this, args);
        -				}
        -				else if (typeof(func) == 'string') {
        -					// name of function
        -					window[func](this, args);
        -				}
        -			} // foreach event handler defined
        -		} // user defined handler for event
        -	}
        -
        -};
        -
        -// For the Flash binding to work, ZeroClipboard_TableTools must be on the global
        -// object list
        -window.ZeroClipboard_TableTools = ZeroClipboard_TableTools;
        -//include TableTools.js
        -/* TableTools
        - * 2009-2015 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/*globals TableTools,ZeroClipboard_TableTools*/
        -
        -
        -(function($, window, document) {
        -
        -/** 
        - * TableTools provides flexible buttons and other tools for a DataTables enhanced table
        - * @class TableTools
        - * @constructor
        - * @param {Object} oDT DataTables instance. When using DataTables 1.10 this can
        - *   also be a jQuery collection, jQuery selector, table node, DataTables API
        - *   instance or DataTables settings object.
        - * @param {Object} oOpts TableTools options
        - * @param {String} oOpts.sSwfPath ZeroClipboard SWF path
        - * @param {String} oOpts.sRowSelect Row selection options - 'none', 'single', 'multi' or 'os'
        - * @param {Function} oOpts.fnPreRowSelect Callback function just prior to row selection
        - * @param {Function} oOpts.fnRowSelected Callback function just after row selection
        - * @param {Function} oOpts.fnRowDeselected Callback function when row is deselected
        - * @param {Array} oOpts.aButtons List of buttons to be used
        - */
        -TableTools = function( oDT, oOpts )
        -{
        -	/* Santiy check that we are a new instance */
        -	if ( ! this instanceof TableTools )
        -	{
        -		alert( "Warning: TableTools must be initialised with the keyword 'new'" );
        -	}
        -
        -	// In 1.10 we can use the API to get the settings object from a number of
        -	// sources
        -	var dtSettings = $.fn.dataTable.Api ?
        -		new $.fn.dataTable.Api( oDT ).settings()[0] :
        -		oDT.fnSettings();
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public class variables
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * @namespace Settings object which contains customisable information for TableTools instance
        -	 */
        -	this.s = {
        -		/**
        -		 * Store 'this' so the instance can be retrieved from the settings object
        -		 * @property that
        -		 * @type	 object
        -		 * @default  this
        -		 */
        -		"that": this,
        -
        -		/** 
        -		 * DataTables settings objects
        -		 * @property dt
        -		 * @type	 object
        -		 * @default  <i>From the oDT init option</i>
        -		 */
        -		"dt": dtSettings,
        -
        -		/**
        -		 * @namespace Print specific information
        -		 */
        -		"print": {
        -			/** 
        -			 * DataTables draw 'start' point before the printing display was shown
        -			 *  @property saveStart
        -			 *  @type	 int
        -			 *  @default  -1
        -			 */
        -			"saveStart": -1,
        -
        -			/** 
        -			 * DataTables draw 'length' point before the printing display was shown
        -			 *  @property saveLength
        -			 *  @type	 int
        -			 *  @default  -1
        -			 */
        -			"saveLength": -1,
        -
        -			/** 
        -			 * Page scrolling point before the printing display was shown so it can be restored
        -			 *  @property saveScroll
        -			 *  @type	 int
        -			 *  @default  -1
        -			 */
        -			"saveScroll": -1,
        -
        -			/** 
        -			 * Wrapped function to end the print display (to maintain scope)
        -			 *  @property funcEnd
        -			 *  @type	 Function
        -			 *  @default  function () {}
        -			 */
        -			"funcEnd": function () {}
        -		},
        -
        -		/**
        -		 * A unique ID is assigned to each button in each instance
        -		 * @property buttonCounter
        -		 *  @type	 int
        -		 * @default  0
        -		 */
        -		"buttonCounter": 0,
        -
        -		/**
        -		 * @namespace Select rows specific information
        -		 */
        -		"select": {
        -			/**
        -			 * Select type - can be 'none', 'single' or 'multi'
        -			 * @property type
        -			 *  @type	 string
        -			 * @default  ""
        -			 */
        -			"type": "",
        -
        -			/**
        -			 * Array of nodes which are currently selected
        -			 *  @property selected
        -			 *  @type	 array
        -			 *  @default  []
        -			 */
        -			"selected": [],
        -
        -			/**
        -			 * Function to run before the selection can take place. Will cancel the select if the
        -			 * function returns false
        -			 *  @property preRowSelect
        -			 *  @type	 Function
        -			 *  @default  null
        -			 */
        -			"preRowSelect": null,
        -
        -			/**
        -			 * Function to run when a row is selected
        -			 *  @property postSelected
        -			 *  @type	 Function
        -			 *  @default  null
        -			 */
        -			"postSelected": null,
        -
        -			/**
        -			 * Function to run when a row is deselected
        -			 *  @property postDeselected
        -			 *  @type	 Function
        -			 *  @default  null
        -			 */
        -			"postDeselected": null,
        -
        -			/**
        -			 * Indicate if all rows are selected (needed for server-side processing)
        -			 *  @property all
        -			 *  @type	 boolean
        -			 *  @default  false
        -			 */
        -			"all": false,
        -
        -			/**
        -			 * Class name to add to selected TR nodes
        -			 *  @property selectedClass
        -			 *  @type	 String
        -			 *  @default  ""
        -			 */
        -			"selectedClass": ""
        -		},
        -
        -		/**
        -		 * Store of the user input customisation object
        -		 *  @property custom
        -		 *  @type	 object
        -		 *  @default  {}
        -		 */
        -		"custom": {},
        -
        -		/**
        -		 * SWF movie path
        -		 *  @property swfPath
        -		 *  @type	 string
        -		 *  @default  ""
        -		 */
        -		"swfPath": "",
        -
        -		/**
        -		 * Default button set
        -		 *  @property buttonSet
        -		 *  @type	 array
        -		 *  @default  []
        -		 */
        -		"buttonSet": [],
        -
        -		/**
        -		 * When there is more than one TableTools instance for a DataTable, there must be a 
        -		 * master which controls events (row selection etc)
        -		 *  @property master
        -		 *  @type	 boolean
        -		 *  @default  false
        -		 */
        -		"master": false,
        -
        -		/**
        -		 * Tag names that are used for creating collections and buttons
        -		 *  @namesapce
        -		 */
        -		"tags": {}
        -	};
        -
        -
        -	/**
        -	 * @namespace Common and useful DOM elements for the class instance
        -	 */
        -	this.dom = {
        -		/**
        -		 * DIV element that is create and all TableTools buttons (and their children) put into
        -		 *  @property container
        -		 *  @type	 node
        -		 *  @default  null
        -		 */
        -		"container": null,
        -
        -		/**
        -		 * The table node to which TableTools will be applied
        -		 *  @property table
        -		 *  @type	 node
        -		 *  @default  null
        -		 */
        -		"table": null,
        -
        -		/**
        -		 * @namespace Nodes used for the print display
        -		 */
        -		"print": {
        -			/**
        -			 * Nodes which have been removed from the display by setting them to display none
        -			 *  @property hidden
        -			 *  @type	 array
        -			 *  @default  []
        -			 */
        -			"hidden": [],
        -
        -			/**
        -			 * The information display saying telling the user about the print display
        -			 *  @property message
        -			 *  @type	 node
        -			 *  @default  null
        -			 */
        -			"message": null
        -	  },
        -
        -		/**
        -		 * @namespace Nodes used for a collection display. This contains the currently used collection
        -		 */
        -		"collection": {
        -			/**
        -			 * The div wrapper containing the buttons in the collection (i.e. the menu)
        -			 *  @property collection
        -			 *  @type	 node
        -			 *  @default  null
        -			 */
        -			"collection": null,
        -
        -			/**
        -			 * Background display to provide focus and capture events
        -			 *  @property background
        -			 *  @type	 node
        -			 *  @default  null
        -			 */
        -			"background": null
        -		}
        -	};
        -
        -	/**
        -	 * @namespace Name space for the classes that this TableTools instance will use
        -	 * @extends TableTools.classes
        -	 */
        -	this.classes = $.extend( true, {}, TableTools.classes );
        -	if ( this.s.dt.bJUI )
        -	{
        -		$.extend( true, this.classes, TableTools.classes_themeroller );
        -	}
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public class methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Retreieve the settings object from an instance
        -	 *  @method fnSettings
        -	 *  @returns {object} TableTools settings object
        -	 */
        -	this.fnSettings = function () {
        -		return this.s;
        -	};
        -
        -
        -	/* Constructor logic */
        -	if ( typeof oOpts == 'undefined' )
        -	{
        -		oOpts = {};
        -	}
        -
        -
        -	TableTools._aInstances.push( this );
        -	this._fnConstruct( oOpts );
        -
        -	return this;
        -};
        -
        -
        -
        -TableTools.prototype = {
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Public methods
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Retreieve the settings object from an instance
        -	 *  @returns {array} List of TR nodes which are currently selected
        -	 *  @param {boolean} [filtered=false] Get only selected rows which are  
        -	 *    available given the filtering applied to the table. By default
        -	 *    this is false -  i.e. all rows, regardless of filtering are 
        -	      selected.
        -	 */
        -	"fnGetSelected": function ( filtered )
        -	{
        -		var
        -			out = [],
        -			data = this.s.dt.aoData,
        -			displayed = this.s.dt.aiDisplay,
        -			i, iLen;
        -
        -		if ( filtered )
        -		{
        -			// Only consider filtered rows
        -			for ( i=0, iLen=displayed.length ; i<iLen ; i++ )
        -			{
        -				if ( data[ displayed[i] ]._DTTT_selected )
        -				{
        -					out.push( data[ displayed[i] ].nTr );
        -				}
        -			}
        -		}
        -		else
        -		{
        -			// Use all rows
        -			for ( i=0, iLen=data.length ; i<iLen ; i++ )
        -			{
        -				if ( data[i]._DTTT_selected )
        -				{
        -					out.push( data[i].nTr );
        -				}
        -			}
        -		}
        -
        -		return out;
        -	},
        -
        -
        -	/**
        -	 * Get the data source objects/arrays from DataTables for the selected rows (same as
        -	 * fnGetSelected followed by fnGetData on each row from the table)
        -	 *  @returns {array} Data from the TR nodes which are currently selected
        -	 */
        -	"fnGetSelectedData": function ()
        -	{
        -		var out = [];
        -		var data=this.s.dt.aoData;
        -		var i, iLen;
        -
        -		for ( i=0, iLen=data.length ; i<iLen ; i++ )
        -		{
        -			if ( data[i]._DTTT_selected )
        -			{
        -				out.push( this.s.dt.oInstance.fnGetData(i) );
        -			}
        -		}
        -
        -		return out;
        -	},
        -
        -
        -	/**
        -	 * Get the indexes of the selected rows
        -	 *  @returns {array} List of row indexes
        -	 *  @param {boolean} [filtered=false] Get only selected rows which are  
        -	 *    available given the filtering applied to the table. By default
        -	 *    this is false -  i.e. all rows, regardless of filtering are 
        -	      selected.
        -	 */
        -	"fnGetSelectedIndexes": function ( filtered )
        -	{
        -		var
        -			out = [],
        -			data = this.s.dt.aoData,
        -			displayed = this.s.dt.aiDisplay,
        -			i, iLen;
        -
        -		if ( filtered )
        -		{
        -			// Only consider filtered rows
        -			for ( i=0, iLen=displayed.length ; i<iLen ; i++ )
        -			{
        -				if ( data[ displayed[i] ]._DTTT_selected )
        -				{
        -					out.push( displayed[i] );
        -				}
        -			}
        -		}
        -		else
        -		{
        -			// Use all rows
        -			for ( i=0, iLen=data.length ; i<iLen ; i++ )
        -			{
        -				if ( data[i]._DTTT_selected )
        -				{
        -					out.push( i );
        -				}
        -			}
        -		}
        -
        -		return out;
        -	},
        -
        -
        -	/**
        -	 * Check to see if a current row is selected or not
        -	 *  @param {Node} n TR node to check if it is currently selected or not
        -	 *  @returns {Boolean} true if select, false otherwise
        -	 */
        -	"fnIsSelected": function ( n )
        -	{
        -		var pos = this.s.dt.oInstance.fnGetPosition( n );
        -		return (this.s.dt.aoData[pos]._DTTT_selected===true) ? true : false;
        -	},
        -
        -
        -	/**
        -	 * Select all rows in the table
        -	 *  @param {boolean} [filtered=false] Select only rows which are available 
        -	 *    given the filtering applied to the table. By default this is false - 
        -	 *    i.e. all rows, regardless of filtering are selected.
        -	 */
        -	"fnSelectAll": function ( filtered )
        -	{
        -		this._fnRowSelect( filtered ?
        -			this.s.dt.aiDisplay :
        -			this.s.dt.aoData
        -		);
        -	},
        -
        -
        -	/**
        -	 * Deselect all rows in the table
        -	 *  @param {boolean} [filtered=false] Deselect only rows which are available 
        -	 *    given the filtering applied to the table. By default this is false - 
        -	 *    i.e. all rows, regardless of filtering are deselected.
        -	 */
        -	"fnSelectNone": function ( filtered )
        -	{
        -		this._fnRowDeselect( this.fnGetSelectedIndexes(filtered) );
        -	},
        -
        -
        -	/**
        -	 * Select row(s)
        -	 *  @param {node|object|array} n The row(s) to select. Can be a single DOM
        -	 *    TR node, an array of TR nodes or a jQuery object.
        -	 */
        -	"fnSelect": function ( n )
        -	{
        -		if ( this.s.select.type == "single" )
        -		{
        -			this.fnSelectNone();
        -			this._fnRowSelect( n );
        -		}
        -		else
        -		{
        -			this._fnRowSelect( n );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Deselect row(s)
        -	 *  @param {node|object|array} n The row(s) to deselect. Can be a single DOM
        -	 *    TR node, an array of TR nodes or a jQuery object.
        -	 */
        -	"fnDeselect": function ( n )
        -	{
        -		this._fnRowDeselect( n );
        -	},
        -
        -
        -	/**
        -	 * Get the title of the document - useful for file names. The title is retrieved from either
        -	 * the configuration object's 'title' parameter, or the HTML document title
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns {String} Button title
        -	 */
        -	"fnGetTitle": function( oConfig )
        -	{
        -		var sTitle = "";
        -		if ( typeof oConfig.sTitle != 'undefined' && oConfig.sTitle !== "" ) {
        -			sTitle = oConfig.sTitle;
        -		} else {
        -			var anTitle = document.getElementsByTagName('title');
        -			if ( anTitle.length > 0 )
        -			{
        -				sTitle = anTitle[0].innerHTML;
        -			}
        -		}
        -
        -		/* Strip characters which the OS will object to - checking for UTF8 support in the scripting
        -		 * engine
        -		 */
        -		if ( "\u00A1".toString().length < 4 ) {
        -			return sTitle.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");
        -		} else {
        -			return sTitle.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g, "");
        -		}
        -	},
        -
        -
        -	/**
        -	 * Calculate a unity array with the column width by proportion for a set of columns to be
        -	 * included for a button. This is particularly useful for PDF creation, where we can use the
        -	 * column widths calculated by the browser to size the columns in the PDF.
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns {Array} Unity array of column ratios
        -	 */
        -	"fnCalcColRatios": function ( oConfig )
        -	{
        -		var
        -			aoCols = this.s.dt.aoColumns,
        -			aColumnsInc = this._fnColumnTargets( oConfig.mColumns ),
        -			aColWidths = [],
        -			iWidth = 0, iTotal = 0, i, iLen;
        -
        -		for ( i=0, iLen=aColumnsInc.length ; i<iLen ; i++ )
        -		{
        -			if ( aColumnsInc[i] )
        -			{
        -				iWidth = aoCols[i].nTh.offsetWidth;
        -				iTotal += iWidth;
        -				aColWidths.push( iWidth );
        -			}
        -		}
        -
        -		for ( i=0, iLen=aColWidths.length ; i<iLen ; i++ )
        -		{
        -			aColWidths[i] = aColWidths[i] / iTotal;
        -		}
        -
        -		return aColWidths.join('\t');
        -	},
        -
        -
        -	/**
        -	 * Get the information contained in a table as a string
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns {String} Table data as a string
        -	 */
        -	"fnGetTableData": function ( oConfig )
        -	{
        -		/* In future this could be used to get data from a plain HTML source as well as DataTables */
        -		if ( this.s.dt )
        -		{
        -			return this._fnGetDataTablesData( oConfig );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Pass text to a flash button instance, which will be used on the button's click handler
        -	 *  @param   {Object} clip Flash button object
        -	 *  @param   {String} text Text to set
        -	 */
        -	"fnSetText": function ( clip, text )
        -	{
        -		this._fnFlashSetText( clip, text );
        -	},
        -
        -
        -	/**
        -	 * Resize the flash elements of the buttons attached to this TableTools instance - this is
        -	 * useful for when initialising TableTools when it is hidden (display:none) since sizes can't
        -	 * be calculated at that time.
        -	 */
        -	"fnResizeButtons": function ()
        -	{
        -		for ( var cli in ZeroClipboard_TableTools.clients )
        -		{
        -			if ( cli )
        -			{
        -				var client = ZeroClipboard_TableTools.clients[cli];
        -				if ( typeof client.domElement != 'undefined' &&
        -					 client.domElement.parentNode )
        -				{
        -					client.positionElement();
        -				}
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Check to see if any of the ZeroClipboard client's attached need to be resized
        -	 */
        -	"fnResizeRequired": function ()
        -	{
        -		for ( var cli in ZeroClipboard_TableTools.clients )
        -		{
        -			if ( cli )
        -			{
        -				var client = ZeroClipboard_TableTools.clients[cli];
        -				if ( typeof client.domElement != 'undefined' &&
        -					 client.domElement.parentNode == this.dom.container &&
        -					 client.sized === false )
        -				{
        -					return true;
        -				}
        -			}
        -		}
        -		return false;
        -	},
        -
        -
        -	/**
        -	 * Programmatically enable or disable the print view
        -	 *  @param {boolean} [bView=true] Show the print view if true or not given. If false, then
        -	 *    terminate the print view and return to normal.
        -	 *  @param {object} [oConfig={}] Configuration for the print view
        -	 *  @param {boolean} [oConfig.bShowAll=false] Show all rows in the table if true
        -	 *  @param {string} [oConfig.sInfo] Information message, displayed as an overlay to the
        -	 *    user to let them know what the print view is.
        -	 *  @param {string} [oConfig.sMessage] HTML string to show at the top of the document - will
        -	 *    be included in the printed document.
        -	 */
        -	"fnPrint": function ( bView, oConfig )
        -	{
        -		if ( oConfig === undefined )
        -		{
        -			oConfig = {};
        -		}
        -
        -		if ( bView === undefined || bView )
        -		{
        -			this._fnPrintStart( oConfig );
        -		}
        -		else
        -		{
        -			this._fnPrintEnd();
        -		}
        -	},
        -
        -
        -	/**
        -	 * Show a message to the end user which is nicely styled
        -	 *  @param {string} message The HTML string to show to the user
        -	 *  @param {int} time The duration the message is to be shown on screen for (mS)
        -	 */
        -	"fnInfo": function ( message, time ) {
        -		var info = $('<div/>')
        -			.addClass( this.classes.print.info )
        -			.html( message )
        -			.appendTo( 'body' );
        -
        -		setTimeout( function() {
        -			info.fadeOut( "normal", function() {
        -				info.remove();
        -			} );
        -		}, time );
        -	},
        -
        -
        -
        -	/**
        -	 * Get the container element of the instance for attaching to the DOM
        -	 *   @returns {node} DOM node
        -	 */
        -	"fnContainer": function () {
        -		return this.dom.container;
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Private methods (they are of course public in JS, but recommended as private)
        -	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -	/**
        -	 * Constructor logic
        -	 *  @method  _fnConstruct
        -	 *  @param   {Object} oOpts Same as TableTools constructor
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnConstruct": function ( oOpts )
        -	{
        -		var that = this;
        -
        -		this._fnCustomiseSettings( oOpts );
        -
        -		/* Container element */
        -		this.dom.container = document.createElement( this.s.tags.container );
        -		this.dom.container.className = this.classes.container;
        -
        -		/* Row selection config */
        -		if ( this.s.select.type != 'none' )
        -		{
        -			this._fnRowSelectConfig();
        -		}
        -
        -		/* Buttons */
        -		this._fnButtonDefinations( this.s.buttonSet, this.dom.container );
        -
        -		/* Destructor */
        -		this.s.dt.aoDestroyCallback.push( {
        -			"sName": "TableTools",
        -			"fn": function () {
        -				$(that.s.dt.nTBody)
        -					.off( 'click.DTTT_Select', that.s.custom.sRowSelector )
        -					.off( 'mousedown.DTTT_Select', 'tr' )
        -					.off( 'mouseup.DTTT_Select', 'tr' );
        -
        -				$(that.dom.container).empty();
        -
        -				// Remove the instance
        -				var idx = $.inArray( that, TableTools._aInstances );
        -				if ( idx !== -1 ) {
        -					TableTools._aInstances.splice( idx, 1 );
        -				}
        -			}
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Take the user defined settings and the default settings and combine them.
        -	 *  @method  _fnCustomiseSettings
        -	 *  @param   {Object} oOpts Same as TableTools constructor
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnCustomiseSettings": function ( oOpts )
        -	{
        -		/* Is this the master control instance or not? */
        -		if ( typeof this.s.dt._TableToolsInit == 'undefined' )
        -		{
        -			this.s.master = true;
        -			this.s.dt._TableToolsInit = true;
        -		}
        -
        -		/* We can use the table node from comparisons to group controls */
        -		this.dom.table = this.s.dt.nTable;
        -
        -		/* Clone the defaults and then the user options */
        -		this.s.custom = $.extend( {}, TableTools.DEFAULTS, oOpts );
        -
        -		/* Flash file location */
        -		this.s.swfPath = this.s.custom.sSwfPath;
        -		if ( typeof ZeroClipboard_TableTools != 'undefined' )
        -		{
        -			ZeroClipboard_TableTools.moviePath = this.s.swfPath;
        -		}
        -
        -		/* Table row selecting */
        -		this.s.select.type = this.s.custom.sRowSelect;
        -		this.s.select.preRowSelect = this.s.custom.fnPreRowSelect;
        -		this.s.select.postSelected = this.s.custom.fnRowSelected;
        -		this.s.select.postDeselected = this.s.custom.fnRowDeselected;
        -
        -		// Backwards compatibility - allow the user to specify a custom class in the initialiser
        -		if ( this.s.custom.sSelectedClass )
        -		{
        -			this.classes.select.row = this.s.custom.sSelectedClass;
        -		}
        -
        -		this.s.tags = this.s.custom.oTags;
        -
        -		/* Button set */
        -		this.s.buttonSet = this.s.custom.aButtons;
        -	},
        -
        -
        -	/**
        -	 * Take the user input arrays and expand them to be fully defined, and then add them to a given
        -	 * DOM element
        -	 *  @method  _fnButtonDefinations
        -	 *  @param {array} buttonSet Set of user defined buttons
        -	 *  @param {node} wrapper Node to add the created buttons to
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnButtonDefinations": function ( buttonSet, wrapper )
        -	{
        -		var buttonDef;
        -
        -		for ( var i=0, iLen=buttonSet.length ; i<iLen ; i++ )
        -		{
        -			if ( typeof buttonSet[i] == "string" )
        -			{
        -				if ( typeof TableTools.BUTTONS[ buttonSet[i] ] == 'undefined' )
        -				{
        -					alert( "TableTools: Warning - unknown button type: "+buttonSet[i] );
        -					continue;
        -				}
        -				buttonDef = $.extend( {}, TableTools.BUTTONS[ buttonSet[i] ], true );
        -			}
        -			else
        -			{
        -				if ( typeof TableTools.BUTTONS[ buttonSet[i].sExtends ] == 'undefined' )
        -				{
        -					alert( "TableTools: Warning - unknown button type: "+buttonSet[i].sExtends );
        -					continue;
        -				}
        -				var o = $.extend( {}, TableTools.BUTTONS[ buttonSet[i].sExtends ], true );
        -				buttonDef = $.extend( o, buttonSet[i], true );
        -			}
        -
        -			var button = this._fnCreateButton(
        -				buttonDef,
        -				$(wrapper).hasClass(this.classes.collection.container)
        -			);
        -
        -			if ( button ) {
        -				wrapper.appendChild( button );
        -			}
        -		}
        -	},
        -
        -
        -	/**
        -	 * Create and configure a TableTools button
        -	 *  @method  _fnCreateButton
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns {Node} Button element
        -	 *  @private 
        -	 */
        -	"_fnCreateButton": function ( oConfig, bCollectionButton )
        -	{
        -	  var nButton = this._fnButtonBase( oConfig, bCollectionButton );
        -
        -		if ( oConfig.sAction.match(/flash/) )
        -		{
        -			if ( ! this._fnHasFlash() ) {
        -				return false;
        -			}
        -
        -			this._fnFlashConfig( nButton, oConfig );
        -		}
        -		else if ( oConfig.sAction == "text" )
        -		{
        -			this._fnTextConfig( nButton, oConfig );
        -		}
        -		else if ( oConfig.sAction == "div" )
        -		{
        -			this._fnTextConfig( nButton, oConfig );
        -		}
        -		else if ( oConfig.sAction == "collection" )
        -		{
        -			this._fnTextConfig( nButton, oConfig );
        -			this._fnCollectionConfig( nButton, oConfig );
        -		}
        -
        -		if ( this.s.dt.iTabIndex !== -1 ) {
        -			$(nButton)
        -				.attr( 'tabindex', this.s.dt.iTabIndex )
        -				.attr( 'aria-controls', this.s.dt.sTableId )
        -				.on( 'keyup.DTTT', function (e) {
        -					// Trigger the click event on return key when focused.
        -					// Note that for Flash buttons this has no effect since we
        -					// can't programmatically trigger the Flash export
        -					if ( e.keyCode === 13 ) {
        -						e.stopPropagation();
        -
        -						$(this).trigger( 'click' );
        -					}
        -				} )
        -				.on( 'mousedown.DTTT', function (e) {
        -					// On mousedown we want to stop the focus occurring on the
        -					// button, focus is used only for the keyboard navigation.
        -					// But using preventDefault for the flash buttons stops the
        -					// flash action. However, it is not the button that gets
        -					// focused but the flash element for flash buttons, so this
        -					// works
        -					if ( ! oConfig.sAction.match(/flash/) ) {
        -						e.preventDefault();
        -					}
        -				} );
        -		}
        -
        -		return nButton;
        -	},
        -
        -
        -	/**
        -	 * Create the DOM needed for the button and apply some base properties. All buttons start here
        -	 *  @method  _fnButtonBase
        -	 *  @param   {o} oConfig Button configuration object
        -	 *  @returns {Node} DIV element for the button
        -	 *  @private
        -	 */
        -	"_fnButtonBase": function ( o, bCollectionButton )
        -	{
        -		var sTag, sLiner, sClass;
        -
        -		if ( bCollectionButton )
        -		{
        -			sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.collection.button;
        -			sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.collection.liner;
        -			sClass = this.classes.collection.buttons.normal;
        -		}
        -		else
        -		{
        -			sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.button;
        -			sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.liner;
        -			sClass = this.classes.buttons.normal;
        -		}
        -
        -		var
        -		  nButton = document.createElement( sTag ),
        -		  nSpan = document.createElement( sLiner ),
        -		  masterS = this._fnGetMasterSettings();
        -
        -		nButton.className = sClass+" "+o.sButtonClass;
        -		nButton.setAttribute('id', "ToolTables_"+this.s.dt.sInstance+"_"+masterS.buttonCounter );
        -		nButton.appendChild( nSpan );
        -		nSpan.innerHTML = o.sButtonText;
        -
        -		masterS.buttonCounter++;
        -
        -		return nButton;
        -	},
        -
        -
        -	/**
        -	 * Get the settings object for the master instance. When more than one TableTools instance is
        -	 * assigned to a DataTable, only one of them can be the 'master' (for the select rows). As such,
        -	 * we will typically want to interact with that master for global properties.
        -	 *  @method  _fnGetMasterSettings
        -	 *  @returns {Object} TableTools settings object
        -	 *  @private 
        -	 */
        -	"_fnGetMasterSettings": function ()
        -	{
        -		if ( this.s.master )
        -		{
        -			return this.s;
        -		}
        -		else
        -		{
        -			/* Look for the master which has the same DT as this one */
        -			var instances = TableTools._aInstances;
        -			for ( var i=0, iLen=instances.length ; i<iLen ; i++ )
        -			{
        -				if ( this.dom.table == instances[i].s.dt.nTable )
        -				{
        -					return instances[i].s;
        -				}
        -			}
        -		}
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Button collection functions
        -	 */
        -
        -	/**
        -	 * Create a collection button, when activated will present a drop down list of other buttons
        -	 *  @param   {Node} nButton Button to use for the collection activation
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnCollectionConfig": function ( nButton, oConfig )
        -	{
        -		var nHidden = document.createElement( this.s.tags.collection.container );
        -		nHidden.style.display = "none";
        -		nHidden.className = this.classes.collection.container;
        -		oConfig._collection = nHidden;
        -		document.body.appendChild( nHidden );
        -
        -		this._fnButtonDefinations( oConfig.aButtons, nHidden );
        -	},
        -
        -
        -	/**
        -	 * Show a button collection
        -	 *  @param   {Node} nButton Button to use for the collection
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnCollectionShow": function ( nButton, oConfig )
        -	{
        -		var
        -			that = this,
        -			oPos = $(nButton).offset(),
        -			nHidden = oConfig._collection,
        -			iDivX = oPos.left,
        -			iDivY = oPos.top + $(nButton).outerHeight(),
        -			iWinHeight = $(window).height(), iDocHeight = $(document).height(),
        -			iWinWidth = $(window).width(), iDocWidth = $(document).width();
        -
        -		nHidden.style.position = "absolute";
        -		nHidden.style.left = iDivX+"px";
        -		nHidden.style.top = iDivY+"px";
        -		nHidden.style.display = "block";
        -		$(nHidden).css('opacity',0);
        -
        -		var nBackground = document.createElement('div');
        -		nBackground.style.position = "absolute";
        -		nBackground.style.left = "0px";
        -		nBackground.style.top = "0px";
        -		nBackground.style.height = ((iWinHeight>iDocHeight)? iWinHeight : iDocHeight) +"px";
        -		nBackground.style.width = ((iWinWidth>iDocWidth)? iWinWidth : iDocWidth) +"px";
        -		nBackground.className = this.classes.collection.background;
        -		$(nBackground).css('opacity',0);
        -
        -		document.body.appendChild( nBackground );
        -		document.body.appendChild( nHidden );
        -
        -		/* Visual corrections to try and keep the collection visible */
        -		var iDivWidth = $(nHidden).outerWidth();
        -		var iDivHeight = $(nHidden).outerHeight();
        -
        -		if ( iDivX + iDivWidth > iDocWidth )
        -		{
        -			nHidden.style.left = (iDocWidth-iDivWidth)+"px";
        -		}
        -
        -		if ( iDivY + iDivHeight > iDocHeight )
        -		{
        -			nHidden.style.top = (iDivY-iDivHeight-$(nButton).outerHeight())+"px";
        -		}
        -
        -		this.dom.collection.collection = nHidden;
        -		this.dom.collection.background = nBackground;
        -
        -		/* This results in a very small delay for the end user but it allows the animation to be
        -		 * much smoother. If you don't want the animation, then the setTimeout can be removed
        -		 */
        -		setTimeout( function () {
        -			$(nHidden).animate({"opacity": 1}, 500);
        -			$(nBackground).animate({"opacity": 0.25}, 500);
        -		}, 10 );
        -
        -		/* Resize the buttons to the Flash contents fit */
        -		this.fnResizeButtons();
        -
        -		/* Event handler to remove the collection display */
        -		$(nBackground).click( function () {
        -			that._fnCollectionHide.call( that, null, null );
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Hide a button collection
        -	 *  @param   {Node} nButton Button to use for the collection
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns void
        -	 *  @private
        -	 */
        -	"_fnCollectionHide": function ( nButton, oConfig )
        -	{
        -		if ( oConfig !== null && oConfig.sExtends == 'collection' )
        -		{
        -			return;
        -		}
        -
        -		if ( this.dom.collection.collection !== null )
        -		{
        -			$(this.dom.collection.collection).animate({"opacity": 0}, 500, function (e) {
        -				this.style.display = "none";
        -			} );
        -
        -			$(this.dom.collection.background).animate({"opacity": 0}, 500, function (e) {
        -				this.parentNode.removeChild( this );
        -			} );
        -
        -			this.dom.collection.collection = null;
        -			this.dom.collection.background = null;
        -		}
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Row selection functions
        -	 */
        -
        -	/**
        -	 * Add event handlers to a table to allow for row selection
        -	 *  @method  _fnRowSelectConfig
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnRowSelectConfig": function ()
        -	{
        -		if ( this.s.master )
        -		{
        -			var
        -				that = this,
        -				i, iLen,
        -				dt = this.s.dt,
        -				aoOpenRows = this.s.dt.aoOpenRows;
        -
        -			$(dt.nTable).addClass( this.classes.select.table );
        -
        -			// When using OS style selection, we want to cancel the shift text
        -			// selection, but only when the shift key is used (so you can
        -			// actually still select text in the table)
        -			if ( this.s.select.type === 'os' ) {
        -				$(dt.nTBody).on( 'mousedown.DTTT_Select', 'tr', function(e) {
        -					if ( e.shiftKey ) {
        -
        -						$(dt.nTBody)
        -							.css( '-moz-user-select', 'none' )
        -							.one('selectstart.DTTT_Select', 'tr', function () {
        -								return false;
        -							} );
        -					}
        -				} );
        -
        -				$(dt.nTBody).on( 'mouseup.DTTT_Select', 'tr', function(e) {
        -					$(dt.nTBody).css( '-moz-user-select', '' );
        -				} );
        -			}
        -
        -			// Row selection
        -			$(dt.nTBody).on( 'click.DTTT_Select', this.s.custom.sRowSelector, function(e) {
        -				var row = this.nodeName.toLowerCase() === 'tr' ?
        -					this :
        -					$(this).parents('tr')[0];
        -
        -				var select = that.s.select;
        -				var pos = that.s.dt.oInstance.fnGetPosition( row );
        -
        -				/* Sub-table must be ignored (odd that the selector won't do this with >) */
        -				if ( row.parentNode != dt.nTBody ) {
        -					return;
        -				}
        -
        -				/* Check that we are actually working with a DataTables controlled row */
        -				if ( dt.oInstance.fnGetData(row) === null ) {
        -				    return;
        -				}
        -
        -				// Shift click, ctrl click and simple click handling to make
        -				// row selection a lot like a file system in desktop OSs
        -				if ( select.type == 'os' ) {
        -					if ( e.ctrlKey || e.metaKey ) {
        -						// Add or remove from the selection
        -						if ( that.fnIsSelected( row ) ) {
        -							that._fnRowDeselect( row, e );
        -						}
        -						else {
        -							that._fnRowSelect( row, e );
        -						}
        -					}
        -					else if ( e.shiftKey ) {
        -						// Add a range of rows, from the last selected row to
        -						// this one
        -						var rowIdxs = that.s.dt.aiDisplay.slice(); // visible rows
        -						var idx1 = $.inArray( select.lastRow, rowIdxs );
        -						var idx2 = $.inArray( pos, rowIdxs );
        -
        -						if ( that.fnGetSelected().length === 0 || idx1 === -1 ) {
        -							// select from top to here - slightly odd, but both
        -							// Windows and Mac OS do this
        -							rowIdxs.splice( $.inArray( pos, rowIdxs )+1, rowIdxs.length );
        -						}
        -						else {
        -							// reverse so we can shift click 'up' as well as down
        -							if ( idx1 > idx2 ) {
        -								var tmp = idx2;
        -								idx2 = idx1;
        -								idx1 = tmp;
        -							}
        -
        -							rowIdxs.splice( idx2+1, rowIdxs.length );
        -							rowIdxs.splice( 0, idx1 );
        -						}
        -
        -						if ( ! that.fnIsSelected( row ) ) {
        -							// Select range
        -							that._fnRowSelect( rowIdxs, e );
        -						}
        -						else {
        -							// Deselect range - need to keep the clicked on row selected
        -							rowIdxs.splice( $.inArray( pos, rowIdxs ), 1 );
        -							that._fnRowDeselect( rowIdxs, e );
        -						}
        -					}
        -					else {
        -						// No cmd or shift click. Deselect current if selected,
        -						// or select this row only
        -						if ( that.fnIsSelected( row ) && that.fnGetSelected().length === 1 ) {
        -							that._fnRowDeselect( row, e );
        -						}
        -						else {
        -							that.fnSelectNone();
        -							that._fnRowSelect( row, e );
        -						}
        -					}
        -				}
        -				else if ( that.fnIsSelected( row ) ) {
        -					that._fnRowDeselect( row, e );
        -				}
        -				else if ( select.type == "single" ) {
        -					that.fnSelectNone();
        -					that._fnRowSelect( row, e );
        -				}
        -				else if ( select.type == "multi" ) {
        -					that._fnRowSelect( row, e );
        -				}
        -
        -				select.lastRow = pos;
        -			} );//.on('selectstart', function () { return false; } );
        -
        -			// Bind a listener to the DataTable for when new rows are created.
        -			// This allows rows to be visually selected when they should be and
        -			// deferred rendering is used.
        -			dt.oApi._fnCallbackReg( dt, 'aoRowCreatedCallback', function (tr, data, index) {
        -				if ( dt.aoData[index]._DTTT_selected ) {
        -					$(tr).addClass( that.classes.select.row );
        -				}
        -			}, 'TableTools-SelectAll' );
        -		}
        -	},
        -
        -	/**
        -	 * Select rows
        -	 *  @param   {*} src Rows to select - see _fnSelectData for a description of valid inputs
        -	 *  @private 
        -	 */
        -	"_fnRowSelect": function ( src, e )
        -	{
        -		var
        -			that = this,
        -			data = this._fnSelectData( src ),
        -			firstTr = data.length===0 ? null : data[0].nTr,
        -			anSelected = [],
        -			i, len;
        -
        -		// Get all the rows that will be selected
        -		for ( i=0, len=data.length ; i<len ; i++ )
        -		{
        -			if ( data[i].nTr )
        -			{
        -				anSelected.push( data[i].nTr );
        -			}
        -		}
        -
        -		// User defined pre-selection function
        -		if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anSelected, true) )
        -		{
        -			return;
        -		}
        -
        -		// Mark them as selected
        -		for ( i=0, len=data.length ; i<len ; i++ )
        -		{
        -			data[i]._DTTT_selected = true;
        -
        -			if ( data[i].nTr )
        -			{
        -				$(data[i].nTr).addClass( that.classes.select.row );
        -			}
        -		}
        -
        -		// Post-selection function
        -		if ( this.s.select.postSelected !== null )
        -		{
        -			this.s.select.postSelected.call( this, anSelected );
        -		}
        -
        -		TableTools._fnEventDispatch( this, 'select', anSelected, true );
        -	},
        -
        -	/**
        -	 * Deselect rows
        -	 *  @param   {*} src Rows to deselect - see _fnSelectData for a description of valid inputs
        -	 *  @private 
        -	 */
        -	"_fnRowDeselect": function ( src, e )
        -	{
        -		var
        -			that = this,
        -			data = this._fnSelectData( src ),
        -			firstTr = data.length===0 ? null : data[0].nTr,
        -			anDeselectedTrs = [],
        -			i, len;
        -
        -		// Get all the rows that will be deselected
        -		for ( i=0, len=data.length ; i<len ; i++ )
        -		{
        -			if ( data[i].nTr )
        -			{
        -				anDeselectedTrs.push( data[i].nTr );
        -			}
        -		}
        -
        -		// User defined pre-selection function
        -		if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anDeselectedTrs, false) )
        -		{
        -			return;
        -		}
        -
        -		// Mark them as deselected
        -		for ( i=0, len=data.length ; i<len ; i++ )
        -		{
        -			data[i]._DTTT_selected = false;
        -
        -			if ( data[i].nTr )
        -			{
        -				$(data[i].nTr).removeClass( that.classes.select.row );
        -			}
        -		}
        -
        -		// Post-deselection function
        -		if ( this.s.select.postDeselected !== null )
        -		{
        -			this.s.select.postDeselected.call( this, anDeselectedTrs );
        -		}
        -
        -		TableTools._fnEventDispatch( this, 'select', anDeselectedTrs, false );
        -	},
        -
        -	/**
        -	 * Take a data source for row selection and convert it into aoData points for the DT
        -	 *   @param {*} src Can be a single DOM TR node, an array of TR nodes (including a
        -	 *     a jQuery object), a single aoData point from DataTables, an array of aoData
        -	 *     points or an array of aoData indexes
        -	 *   @returns {array} An array of aoData points
        -	 */
        -	"_fnSelectData": function ( src )
        -	{
        -		var out = [], pos, i, iLen;
        -
        -		if ( src.nodeName )
        -		{
        -			// Single node
        -			pos = this.s.dt.oInstance.fnGetPosition( src );
        -			out.push( this.s.dt.aoData[pos] );
        -		}
        -		else if ( typeof src.length !== 'undefined' )
        -		{
        -			// jQuery object or an array of nodes, or aoData points
        -			for ( i=0, iLen=src.length ; i<iLen ; i++ )
        -			{
        -				if ( src[i].nodeName )
        -				{
        -					pos = this.s.dt.oInstance.fnGetPosition( src[i] );
        -					out.push( this.s.dt.aoData[pos] );
        -				}
        -				else if ( typeof src[i] === 'number' )
        -				{
        -					out.push( this.s.dt.aoData[ src[i] ] );
        -				}
        -				else
        -				{
        -					out.push( src[i] );
        -				}
        -			}
        -
        -			return out;
        -		}
        -		else if ( typeof src === 'number' )
        -		{
        -			out.push(this.s.dt.aoData[src]);
        -		}
        -		else
        -		{
        -			// A single aoData point
        -			out.push( src );
        -		}
        -
        -		return out;
        -	},
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Text button functions
        -	 */
        -
        -	/**
        -	 * Configure a text based button for interaction events
        -	 *  @method  _fnTextConfig
        -	 *  @param   {Node} nButton Button element which is being considered
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnTextConfig": function ( nButton, oConfig )
        -	{
        -		var that = this;
        -
        -		if ( oConfig.fnInit !== null )
        -		{
        -			oConfig.fnInit.call( this, nButton, oConfig );
        -		}
        -
        -		if ( oConfig.sToolTip !== "" )
        -		{
        -			nButton.title = oConfig.sToolTip;
        -		}
        -
        -		$(nButton).hover( function () {
        -			if ( oConfig.fnMouseover !== null )
        -			{
        -				oConfig.fnMouseover.call( this, nButton, oConfig, null );
        -			}
        -		}, function () {
        -			if ( oConfig.fnMouseout !== null )
        -			{
        -				oConfig.fnMouseout.call( this, nButton, oConfig, null );
        -			}
        -		} );
        -
        -		if ( oConfig.fnSelect !== null )
        -		{
        -			TableTools._fnEventListen( this, 'select', function (n) {
        -				oConfig.fnSelect.call( that, nButton, oConfig, n );
        -			} );
        -		}
        -
        -		$(nButton).click( function (e) {
        -			//e.preventDefault();
        -
        -			if ( oConfig.fnClick !== null )
        -			{
        -				oConfig.fnClick.call( that, nButton, oConfig, null, e );
        -			}
        -
        -			/* Provide a complete function to match the behaviour of the flash elements */
        -			if ( oConfig.fnComplete !== null )
        -			{
        -				oConfig.fnComplete.call( that, nButton, oConfig, null, null );
        -			}
        -
        -			that._fnCollectionHide( nButton, oConfig );
        -		} );
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Flash button functions
        -	 */
        -	
        -	/**
        -	 * Check if the Flash plug-in is available
        -	 *  @method  _fnHasFlash
        -	 *  @returns {boolean} `true` if Flash available, `false` otherwise
        -	 *  @private 
        -	 */
        -	"_fnHasFlash": function ()
        -	{
        -		try {
        -			var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
        -			if (fo) {
        -				return true;
        -			}
        -		}
        -		catch (e) {
        -			if (
        -				navigator.mimeTypes &&
        -				navigator.mimeTypes['application/x-shockwave-flash'] !== undefined &&
        -				navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin
        -			) {
        -				return true;
        -			}
        -		}
        -
        -		return false;
        -	},
        -
        -
        -	/**
        -	 * Configure a flash based button for interaction events
        -	 *  @method  _fnFlashConfig
        -	 *  @param   {Node} nButton Button element which is being considered
        -	 *  @param   {o} oConfig Button configuration object
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnFlashConfig": function ( nButton, oConfig )
        -	{
        -		var that = this;
        -		var flash = new ZeroClipboard_TableTools.Client();
        -
        -		if ( oConfig.fnInit !== null )
        -		{
        -			oConfig.fnInit.call( this, nButton, oConfig );
        -		}
        -
        -		flash.setHandCursor( true );
        -
        -		if ( oConfig.sAction == "flash_save" )
        -		{
        -			flash.setAction( 'save' );
        -			flash.setCharSet( (oConfig.sCharSet=="utf16le") ? 'UTF16LE' : 'UTF8' );
        -			flash.setBomInc( oConfig.bBomInc );
        -			flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) );
        -		}
        -		else if ( oConfig.sAction == "flash_pdf" )
        -		{
        -			flash.setAction( 'pdf' );
        -			flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) );
        -		}
        -		else
        -		{
        -			flash.setAction( 'copy' );
        -		}
        -
        -		flash.addEventListener('mouseOver', function(client) {
        -			if ( oConfig.fnMouseover !== null )
        -			{
        -				oConfig.fnMouseover.call( that, nButton, oConfig, flash );
        -			}
        -		} );
        -
        -		flash.addEventListener('mouseOut', function(client) {
        -			if ( oConfig.fnMouseout !== null )
        -			{
        -				oConfig.fnMouseout.call( that, nButton, oConfig, flash );
        -			}
        -		} );
        -
        -		flash.addEventListener('mouseDown', function(client) {
        -			if ( oConfig.fnClick !== null )
        -			{
        -				oConfig.fnClick.call( that, nButton, oConfig, flash );
        -			}
        -		} );
        -
        -		flash.addEventListener('complete', function (client, text) {
        -			if ( oConfig.fnComplete !== null )
        -			{
        -				oConfig.fnComplete.call( that, nButton, oConfig, flash, text );
        -			}
        -			that._fnCollectionHide( nButton, oConfig );
        -		} );
        -
        -		if ( oConfig.fnSelect !== null )
        -		{
        -			TableTools._fnEventListen( this, 'select', function (n) {
        -				oConfig.fnSelect.call( that, nButton, oConfig, n );
        -			} );
        -		}
        -
        -		this._fnFlashGlue( flash, nButton, oConfig.sToolTip );
        -	},
        -
        -
        -	/**
        -	 * Wait until the id is in the DOM before we "glue" the swf. Note that this function will call
        -	 * itself (using setTimeout) until it completes successfully
        -	 *  @method  _fnFlashGlue
        -	 *  @param   {Object} clip Zero clipboard object
        -	 *  @param   {Node} node node to glue swf to
        -	 *  @param   {String} text title of the flash movie
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnFlashGlue": function ( flash, node, text )
        -	{
        -		var that = this;
        -		var id = node.getAttribute('id');
        -
        -		if ( document.getElementById(id) )
        -		{
        -			flash.glue( node, text );
        -		}
        -		else
        -		{
        -			setTimeout( function () {
        -				that._fnFlashGlue( flash, node, text );
        -			}, 100 );
        -		}
        -	},
        -
        -
        -	/**
        -	 * Set the text for the flash clip to deal with
        -	 * 
        -	 * This function is required for large information sets. There is a limit on the 
        -	 * amount of data that can be transferred between Javascript and Flash in a single call, so
        -	 * we use this method to build up the text in Flash by sending over chunks. It is estimated
        -	 * that the data limit is around 64k, although it is undocumented, and appears to be different
        -	 * between different flash versions. We chunk at 8KiB.
        -	 *  @method  _fnFlashSetText
        -	 *  @param   {Object} clip the ZeroClipboard object
        -	 *  @param   {String} sData the data to be set
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnFlashSetText": function ( clip, sData )
        -	{
        -		var asData = this._fnChunkData( sData, 8192 );
        -
        -		clip.clearText();
        -		for ( var i=0, iLen=asData.length ; i<iLen ; i++ )
        -		{
        -			clip.appendText( asData[i] );
        -		}
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Data retrieval functions
        -	 */
        -
        -	/**
        -	 * Convert the mixed columns variable into a boolean array the same size as the columns, which
        -	 * indicates which columns we want to include
        -	 *  @method  _fnColumnTargets
        -	 *  @param   {String|Array} mColumns The columns to be included in data retrieval. If a string
        -	 *			 then it can take the value of "visible" or "hidden" (to include all visible or
        -	 *			 hidden columns respectively). Or an array of column indexes
        -	 *  @returns {Array} A boolean array the length of the columns of the table, which each value
        -	 *			 indicating if the column is to be included or not
        -	 *  @private 
        -	 */
        -	"_fnColumnTargets": function ( mColumns )
        -	{
        -		var aColumns = [];
        -		var dt = this.s.dt;
        -		var i, iLen;
        -		var columns = dt.aoColumns;
        -		var columnCount = columns.length;
        -
        -		if ( typeof mColumns == "function" )
        -		{
        -			var a = mColumns.call( this, dt );
        -
        -			for ( i=0, iLen=columnCount ; i<iLen ; i++ )
        -			{
        -				aColumns.push( $.inArray( i, a ) !== -1 ? true : false );
        -			}
        -		}
        -		else if ( typeof mColumns == "object" )
        -		{
        -			for ( i=0, iLen=columnCount ; i<iLen ; i++ )
        -			{
        -				aColumns.push( false );
        -			}
        -
        -			for ( i=0, iLen=mColumns.length ; i<iLen ; i++ )
        -			{
        -				aColumns[ mColumns[i] ] = true;
        -			}
        -		}
        -		else if ( mColumns == "visible" )
        -		{
        -			for ( i=0, iLen=columnCount ; i<iLen ; i++ )
        -			{
        -				aColumns.push( columns[i].bVisible ? true : false );
        -			}
        -		}
        -		else if ( mColumns == "hidden" )
        -		{
        -			for ( i=0, iLen=columnCount ; i<iLen ; i++ )
        -			{
        -				aColumns.push( columns[i].bVisible ? false : true );
        -			}
        -		}
        -		else if ( mColumns == "sortable" )
        -		{
        -			for ( i=0, iLen=columnCount ; i<iLen ; i++ )
        -			{
        -				aColumns.push( columns[i].bSortable ? true : false );
        -			}
        -		}
        -		else /* all */
        -		{
        -			for ( i=0, iLen=columnCount ; i<iLen ; i++ )
        -			{
        -				aColumns.push( true );
        -			}
        -		}
        -
        -		return aColumns;
        -	},
        -
        -
        -	/**
        -	 * New line character(s) depend on the platforms
        -	 *  @method  method
        -	 *  @param   {Object} oConfig Button configuration object - only interested in oConfig.sNewLine
        -	 *  @returns {String} Newline character
        -	 */
        -	"_fnNewline": function ( oConfig )
        -	{
        -		if ( oConfig.sNewLine == "auto" )
        -		{
        -			return navigator.userAgent.match(/Windows/) ? "\r\n" : "\n";
        -		}
        -		else
        -		{
        -			return oConfig.sNewLine;
        -		}
        -	},
        -
        -
        -	/**
        -	 * Get data from DataTables' internals and format it for output
        -	 *  @method  _fnGetDataTablesData
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @param   {String} oConfig.sFieldBoundary Field boundary for the data cells in the string
        -	 *  @param   {String} oConfig.sFieldSeperator Field separator for the data cells
        -	 *  @param   {String} oConfig.sNewline New line options
        -	 *  @param   {Mixed} oConfig.mColumns Which columns should be included in the output
        -	 *  @param   {Boolean} oConfig.bHeader Include the header
        -	 *  @param   {Boolean} oConfig.bFooter Include the footer
        -	 *  @param   {Boolean} oConfig.bSelectedOnly Include only the selected rows in the output
        -	 *  @returns {String} Concatenated string of data
        -	 *  @private 
        -	 */
        -	"_fnGetDataTablesData": function ( oConfig )
        -	{
        -		var i, iLen, j, jLen;
        -		var aRow, aData=[], sLoopData='', arr;
        -		var dt = this.s.dt, tr, child;
        -		var regex = new RegExp(oConfig.sFieldBoundary, "g"); /* Do it here for speed */
        -		var aColumnsInc = this._fnColumnTargets( oConfig.mColumns );
        -		var bSelectedOnly = (typeof oConfig.bSelectedOnly != 'undefined') ? oConfig.bSelectedOnly : false;
        -
        -		/*
        -		 * Header
        -		 */
        -		if ( oConfig.bHeader )
        -		{
        -			aRow = [];
        -
        -			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
        -			{
        -				if ( aColumnsInc[i] )
        -				{
        -					sLoopData = dt.aoColumns[i].sTitle.replace(/\n/g," ").replace( /<.*?>/g, "" ).replace(/^\s+|\s+$/g,"");
        -					sLoopData = this._fnHtmlDecode( sLoopData );
        -
        -					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
        -				}
        -			}
        -
        -			aData.push( aRow.join(oConfig.sFieldSeperator) );
        -		}
        -
        -		bSelectedOnly = true;
        -
        -		/*
        -		 * Body
        -		 */
        -		var aDataIndex;
        -		var aSelected = this.fnGetSelectedIndexes();
        -		bSelectedOnly = this.s.select.type !== "none" && bSelectedOnly && aSelected.length !== 0;
        -
        -		if ( bSelectedOnly ) {
        -			// Use the selected indexes
        -			aDataIndex = aSelected;
        -		}
        -		else if ( DataTable.Api ) {
        -			// 1.10+ style
        -			aDataIndex = new DataTable.Api( dt )
        -				.rows( oConfig.oSelectorOpts )
        -				.indexes()
        -				.flatten()
        -				.toArray();
        -		}
        -		else {
        -			// 1.9- style
        -			aDataIndex = dt.oInstance
        -				.$('tr', oConfig.oSelectorOpts)
        -				.map( function (id, row) {
        -					return dt.oInstance.fnGetPosition( row );
        -				} )
        -				.get();
        -		}
        -
        -		for ( j=0, jLen=aDataIndex.length ; j<jLen ; j++ )
        -		{
        -			tr = dt.aoData[ aDataIndex[j] ].nTr;
        -			aRow = [];
        -
        -			/* Columns */
        -			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
        -			{
        -				if ( aColumnsInc[i] )
        -				{
        -					/* Convert to strings (with small optimisation) */
        -					var mTypeData = dt.oApi._fnGetCellData( dt, aDataIndex[j], i, 'display' );
        -					if ( oConfig.fnCellRender )
        -					{
        -						sLoopData = oConfig.fnCellRender( mTypeData, i, tr, aDataIndex[j] )+"";
        -					}
        -					else if ( typeof mTypeData == "string" )
        -					{
        -						/* Strip newlines, replace img tags with alt attr. and finally strip html... */
        -						sLoopData = mTypeData.replace(/\n/g," ");
        -						sLoopData =
        -						    sLoopData.replace(/<img.*?\s+alt\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+)).*?>/gi,
        -						        '$1$2$3');
        -						sLoopData = sLoopData.replace( /<.*?>/g, "" );
        -					}
        -					else
        -					{
        -						sLoopData = mTypeData+"";
        -					}
        -
        -					/* Trim and clean the data */
        -					sLoopData = sLoopData.replace(/^\s+/, '').replace(/\s+$/, '');
        -					sLoopData = this._fnHtmlDecode( sLoopData );
        -
        -					/* Bound it and add it to the total data */
        -					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
        -				}
        -			}
        -
        -			aData.push( aRow.join(oConfig.sFieldSeperator) );
        -
        -			/* Details rows from fnOpen */
        -			if ( oConfig.bOpenRows )
        -			{
        -				arr = $.grep(dt.aoOpenRows, function(o) { return o.nParent === tr; });
        -
        -				if ( arr.length === 1 )
        -				{
        -					sLoopData = this._fnBoundData( $('td', arr[0].nTr).html(), oConfig.sFieldBoundary, regex );
        -					aData.push( sLoopData );
        -				}
        -			}
        -		}
        -
        -		/*
        -		 * Footer
        -		 */
        -		if ( oConfig.bFooter && dt.nTFoot !== null )
        -		{
        -			aRow = [];
        -
        -			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
        -			{
        -				if ( aColumnsInc[i] && dt.aoColumns[i].nTf !== null )
        -				{
        -					sLoopData = dt.aoColumns[i].nTf.innerHTML.replace(/\n/g," ").replace( /<.*?>/g, "" );
        -					sLoopData = this._fnHtmlDecode( sLoopData );
        -
        -					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
        -				}
        -			}
        -
        -			aData.push( aRow.join(oConfig.sFieldSeperator) );
        -		}
        -
        -		var _sLastData = aData.join( this._fnNewline(oConfig) );
        -		return _sLastData;
        -	},
        -
        -
        -	/**
        -	 * Wrap data up with a boundary string
        -	 *  @method  _fnBoundData
        -	 *  @param   {String} sData data to bound
        -	 *  @param   {String} sBoundary bounding char(s)
        -	 *  @param   {RegExp} regex search for the bounding chars - constructed outside for efficiency
        -	 *			 in the loop
        -	 *  @returns {String} bound data
        -	 *  @private 
        -	 */
        -	"_fnBoundData": function ( sData, sBoundary, regex )
        -	{
        -		if ( sBoundary === "" )
        -		{
        -			return sData;
        -		}
        -		else
        -		{
        -			return sBoundary + sData.replace(regex, sBoundary+sBoundary) + sBoundary;
        -		}
        -	},
        -
        -
        -	/**
        -	 * Break a string up into an array of smaller strings
        -	 *  @method  _fnChunkData
        -	 *  @param   {String} sData data to be broken up
        -	 *  @param   {Int} iSize chunk size
        -	 *  @returns {Array} String array of broken up text
        -	 *  @private 
        -	 */
        -	"_fnChunkData": function ( sData, iSize )
        -	{
        -		var asReturn = [];
        -		var iStrlen = sData.length;
        -
        -		for ( var i=0 ; i<iStrlen ; i+=iSize )
        -		{
        -			if ( i+iSize < iStrlen )
        -			{
        -				asReturn.push( sData.substring( i, i+iSize ) );
        -			}
        -			else
        -			{
        -				asReturn.push( sData.substring( i, iStrlen ) );
        -			}
        -		}
        -
        -		return asReturn;
        -	},
        -
        -
        -	/**
        -	 * Decode HTML entities
        -	 *  @method  _fnHtmlDecode
        -	 *  @param   {String} sData encoded string
        -	 *  @returns {String} decoded string
        -	 *  @private 
        -	 */
        -	"_fnHtmlDecode": function ( sData )
        -	{
        -		if ( sData.indexOf('&') === -1 )
        -		{
        -			return sData;
        -		}
        -
        -		var n = document.createElement('div');
        -
        -		return sData.replace( /&([^\s]*?);/g, function( match, match2 ) {
        -			if ( match.substr(1, 1) === '#' )
        -			{
        -				return String.fromCharCode( Number(match2.substr(1)) );
        -			}
        -			else
        -			{
        -				n.innerHTML = match;
        -				return n.childNodes[0].nodeValue;
        -			}
        -		} );
        -	},
        -
        -
        -
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Printing functions
        -	 */
        -
        -	/**
        -	 * Show print display
        -	 *  @method  _fnPrintStart
        -	 *  @param   {Event} e Event object
        -	 *  @param   {Object} oConfig Button configuration object
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnPrintStart": function ( oConfig )
        -	{
        -	  var that = this;
        -	  var oSetDT = this.s.dt;
        -
        -		/* Parse through the DOM hiding everything that isn't needed for the table */
        -		this._fnPrintHideNodes( oSetDT.nTable );
        -
        -		/* Show the whole table */
        -		this.s.print.saveStart = oSetDT._iDisplayStart;
        -		this.s.print.saveLength = oSetDT._iDisplayLength;
        -
        -		if ( oConfig.bShowAll )
        -		{
        -			oSetDT._iDisplayStart = 0;
        -			oSetDT._iDisplayLength = -1;
        -			if ( oSetDT.oApi._fnCalculateEnd ) {
        -				oSetDT.oApi._fnCalculateEnd( oSetDT );
        -			}
        -			oSetDT.oApi._fnDraw( oSetDT );
        -		}
        -
        -		/* Adjust the display for scrolling which might be done by DataTables */
        -		if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
        -		{
        -			this._fnPrintScrollStart( oSetDT );
        -
        -			// If the table redraws while in print view, the DataTables scrolling
        -			// setup would hide the header, so we need to readd it on draw
        -			$(this.s.dt.nTable).bind('draw.DTTT_Print', function () {
        -				that._fnPrintScrollStart( oSetDT );
        -			} );
        -		}
        -
        -		/* Remove the other DataTables feature nodes - but leave the table! and info div */
        -		var anFeature = oSetDT.aanFeatures;
        -		for ( var cFeature in anFeature )
        -		{
        -			if ( cFeature != 'i' && cFeature != 't' && cFeature.length == 1 )
        -			{
        -				for ( var i=0, iLen=anFeature[cFeature].length ; i<iLen ; i++ )
        -				{
        -					this.dom.print.hidden.push( {
        -						"node": anFeature[cFeature][i],
        -						"display": "block"
        -					} );
        -					anFeature[cFeature][i].style.display = "none";
        -				}
        -			}
        -		}
        -
        -		/* Print class can be used for styling */
        -		$(document.body).addClass( this.classes.print.body );
        -
        -		/* Show information message to let the user know what is happening */
        -		if ( oConfig.sInfo !== "" )
        -		{
        -			this.fnInfo( oConfig.sInfo, 3000 );
        -		}
        -
        -		/* Add a message at the top of the page */
        -		if ( oConfig.sMessage )
        -		{
        -			$('<div/>')
        -				.addClass( this.classes.print.message )
        -				.html( oConfig.sMessage )
        -				.prependTo( 'body' );
        -		}
        -
        -		/* Cache the scrolling and the jump to the top of the page */
        -		this.s.print.saveScroll = $(window).scrollTop();
        -		window.scrollTo( 0, 0 );
        -
        -		/* Bind a key event listener to the document for the escape key -
        -		 * it is removed in the callback
        -		 */
        -		$(document).bind( "keydown.DTTT", function(e) {
        -			/* Only interested in the escape key */
        -			if ( e.keyCode == 27 )
        -			{
        -				e.preventDefault();
        -				that._fnPrintEnd.call( that, e );
        -			}
        -		} );
        -	},
        -
        -
        -	/**
        -	 * Printing is finished, resume normal display
        -	 *  @method  _fnPrintEnd
        -	 *  @param   {Event} e Event object
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnPrintEnd": function ( e )
        -	{
        -		var that = this;
        -		var oSetDT = this.s.dt;
        -		var oSetPrint = this.s.print;
        -		var oDomPrint = this.dom.print;
        -
        -		/* Show all hidden nodes */
        -		this._fnPrintShowNodes();
        -
        -		/* Restore DataTables' scrolling */
        -		if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
        -		{
        -			$(this.s.dt.nTable).unbind('draw.DTTT_Print');
        -
        -			this._fnPrintScrollEnd();
        -		}
        -
        -		/* Restore the scroll */
        -		window.scrollTo( 0, oSetPrint.saveScroll );
        -
        -		/* Drop the print message */
        -		$('div.'+this.classes.print.message).remove();
        -
        -		/* Styling class */
        -		$(document.body).removeClass( 'DTTT_Print' );
        -
        -		/* Restore the table length */
        -		oSetDT._iDisplayStart = oSetPrint.saveStart;
        -		oSetDT._iDisplayLength = oSetPrint.saveLength;
        -		if ( oSetDT.oApi._fnCalculateEnd ) {
        -			oSetDT.oApi._fnCalculateEnd( oSetDT );
        -		}
        -		oSetDT.oApi._fnDraw( oSetDT );
        -
        -		$(document).unbind( "keydown.DTTT" );
        -	},
        -
        -
        -	/**
        -	 * Take account of scrolling in DataTables by showing the full table
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnPrintScrollStart": function ()
        -	{
        -		var
        -			oSetDT = this.s.dt,
        -			nScrollHeadInner = oSetDT.nScrollHead.getElementsByTagName('div')[0],
        -			nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
        -			nScrollBody = oSetDT.nTable.parentNode,
        -			nTheadSize, nTfootSize;
        -
        -		/* Copy the header in the thead in the body table, this way we show one single table when
        -		 * in print view. Note that this section of code is more or less verbatim from DT 1.7.0
        -		 */
        -		nTheadSize = oSetDT.nTable.getElementsByTagName('thead');
        -		if ( nTheadSize.length > 0 )
        -		{
        -			oSetDT.nTable.removeChild( nTheadSize[0] );
        -		}
        -
        -		if ( oSetDT.nTFoot !== null )
        -		{
        -			nTfootSize = oSetDT.nTable.getElementsByTagName('tfoot');
        -			if ( nTfootSize.length > 0 )
        -			{
        -				oSetDT.nTable.removeChild( nTfootSize[0] );
        -			}
        -		}
        -
        -		nTheadSize = oSetDT.nTHead.cloneNode(true);
        -		oSetDT.nTable.insertBefore( nTheadSize, oSetDT.nTable.childNodes[0] );
        -
        -		if ( oSetDT.nTFoot !== null )
        -		{
        -			nTfootSize = oSetDT.nTFoot.cloneNode(true);
        -			oSetDT.nTable.insertBefore( nTfootSize, oSetDT.nTable.childNodes[1] );
        -		}
        -
        -		/* Now adjust the table's viewport so we can actually see it */
        -		if ( oSetDT.oScroll.sX !== "" )
        -		{
        -			oSetDT.nTable.style.width = $(oSetDT.nTable).outerWidth()+"px";
        -			nScrollBody.style.width = $(oSetDT.nTable).outerWidth()+"px";
        -			nScrollBody.style.overflow = "visible";
        -		}
        -
        -		if ( oSetDT.oScroll.sY !== "" )
        -		{
        -			nScrollBody.style.height = $(oSetDT.nTable).outerHeight()+"px";
        -			nScrollBody.style.overflow = "visible";
        -		}
        -	},
        -
        -
        -	/**
        -	 * Take account of scrolling in DataTables by showing the full table. Note that the redraw of
        -	 * the DataTable that we do will actually deal with the majority of the hard work here
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnPrintScrollEnd": function ()
        -	{
        -		var
        -			oSetDT = this.s.dt,
        -			nScrollBody = oSetDT.nTable.parentNode;
        -
        -		if ( oSetDT.oScroll.sX !== "" )
        -		{
        -			nScrollBody.style.width = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sX );
        -			nScrollBody.style.overflow = "auto";
        -		}
        -
        -		if ( oSetDT.oScroll.sY !== "" )
        -		{
        -			nScrollBody.style.height = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sY );
        -			nScrollBody.style.overflow = "auto";
        -		}
        -	},
        -
        -
        -	/**
        -	 * Resume the display of all TableTools hidden nodes
        -	 *  @method  _fnPrintShowNodes
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnPrintShowNodes": function ( )
        -	{
        -	  var anHidden = this.dom.print.hidden;
        -
        -		for ( var i=0, iLen=anHidden.length ; i<iLen ; i++ )
        -		{
        -			anHidden[i].node.style.display = anHidden[i].display;
        -		}
        -		anHidden.splice( 0, anHidden.length );
        -	},
        -
        -
        -	/**
        -	 * Hide nodes which are not needed in order to display the table. Note that this function is
        -	 * recursive
        -	 *  @method  _fnPrintHideNodes
        -	 *  @param   {Node} nNode Element which should be showing in a 'print' display
        -	 *  @returns void
        -	 *  @private 
        -	 */
        -	"_fnPrintHideNodes": function ( nNode )
        -	{
        -		var anHidden = this.dom.print.hidden;
        -
        -		var nParent = nNode.parentNode;
        -		var nChildren = nParent.childNodes;
        -		for ( var i=0, iLen=nChildren.length ; i<iLen ; i++ )
        -		{
        -			if ( nChildren[i] != nNode && nChildren[i].nodeType == 1 )
        -			{
        -				/* If our node is shown (don't want to show nodes which were previously hidden) */
        -				var sDisplay = $(nChildren[i]).css("display");
        -				if ( sDisplay != "none" )
        -				{
        -					/* Cache the node and it's previous state so we can restore it */
        -					anHidden.push( {
        -						"node": nChildren[i],
        -						"display": sDisplay
        -					} );
        -					nChildren[i].style.display = "none";
        -				}
        -			}
        -		}
        -
        -		if ( nParent.nodeName.toUpperCase() != "BODY" )
        -		{
        -			this._fnPrintHideNodes( nParent );
        -		}
        -	}
        -};
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Static variables
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * Store of all instances that have been created of TableTools, so one can look up other (when
        - * there is need of a master)
        - *  @property _aInstances
        - *  @type	 Array
        - *  @default  []
        - *  @private
        - */
        -TableTools._aInstances = [];
        -
        -
        -/**
        - * Store of all listeners and their callback functions
        - *  @property _aListeners
        - *  @type	 Array
        - *  @default  []
        - */
        -TableTools._aListeners = [];
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Static methods
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/**
        - * Get an array of all the master instances
        - *  @method  fnGetMasters
        - *  @returns {Array} List of master TableTools instances
        - *  @static
        - */
        -TableTools.fnGetMasters = function ()
        -{
        -	var a = [];
        -	for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ )
        -	{
        -		if ( TableTools._aInstances[i].s.master )
        -		{
        -			a.push( TableTools._aInstances[i] );
        -		}
        -	}
        -	return a;
        -};
        -
        -/**
        - * Get the master instance for a table node (or id if a string is given)
        - *  @method  fnGetInstance
        - *  @returns {Object} ID of table OR table node, for which we want the TableTools instance
        - *  @static
        - */
        -TableTools.fnGetInstance = function ( node )
        -{
        -	if ( typeof node != 'object' )
        -	{
        -		node = document.getElementById(node);
        -	}
        -
        -	for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ )
        -	{
        -		if ( TableTools._aInstances[i].s.master && TableTools._aInstances[i].dom.table == node )
        -		{
        -			return TableTools._aInstances[i];
        -		}
        -	}
        -	return null;
        -};
        -
        -
        -/**
        - * Add a listener for a specific event
        - *  @method  _fnEventListen
        - *  @param   {Object} that Scope of the listening function (i.e. 'this' in the caller)
        - *  @param   {String} type Event type
        - *  @param   {Function} fn Function
        - *  @returns void
        - *  @private
        - *  @static
        - */
        -TableTools._fnEventListen = function ( that, type, fn )
        -{
        -	TableTools._aListeners.push( {
        -		"that": that,
        -		"type": type,
        -		"fn": fn
        -	} );
        -};
        -
        -
        -/**
        - * An event has occurred - look up every listener and fire it off. We check that the event we are
        - * going to fire is attached to the same table (using the table node as reference) before firing
        - *  @method  _fnEventDispatch
        - *  @param   {Object} that Scope of the listening function (i.e. 'this' in the caller)
        - *  @param   {String} type Event type
        - *  @param   {Node} node Element that the event occurred on (may be null)
        - *  @param   {boolean} [selected] Indicate if the node was selected (true) or deselected (false)
        - *  @returns void
        - *  @private
        - *  @static
        - */
        -TableTools._fnEventDispatch = function ( that, type, node, selected )
        -{
        -	var listeners = TableTools._aListeners;
        -	for ( var i=0, iLen=listeners.length ; i<iLen ; i++ )
        -	{
        -		if ( that.dom.table == listeners[i].that.dom.table && listeners[i].type == type )
        -		{
        -			listeners[i].fn( node, selected );
        -		}
        -	}
        -};
        -
        -
        -
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Constants
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -
        -
        -TableTools.buttonBase = {
        -	// Button base
        -	"sAction": "text",
        -	"sTag": "default",
        -	"sLinerTag": "default",
        -	"sButtonClass": "DTTT_button_text",
        -	"sButtonText": "Button text",
        -	"sTitle": "",
        -	"sToolTip": "",
        -
        -	// Common button specific options
        -	"sCharSet": "utf8",
        -	"bBomInc": false,
        -	"sFileName": "*.csv",
        -	"sFieldBoundary": "",
        -	"sFieldSeperator": "\t",
        -	"sNewLine": "auto",
        -	"mColumns": "all", /* "all", "visible", "hidden" or array of column integers */
        -	"bHeader": true,
        -	"bFooter": true,
        -	"bOpenRows": false,
        -	"bSelectedOnly": false,
        -	"oSelectorOpts": undefined, // See http://datatables.net/docs/DataTables/1.9.4/#$ for full options
        -
        -	// Callbacks
        -	"fnMouseover": null,
        -	"fnMouseout": null,
        -	"fnClick": null,
        -	"fnSelect": null,
        -	"fnComplete": null,
        -	"fnInit": null,
        -	"fnCellRender": null
        -};
        -
        -
        -/**
        - * @namespace Default button configurations
        - */
        -TableTools.BUTTONS = {
        -	"csv": $.extend( {}, TableTools.buttonBase, {
        -		"sAction": "flash_save",
        -		"sButtonClass": "DTTT_button_csv",
        -		"sButtonText": "CSV",
        -		"sFieldBoundary": '"',
        -		"sFieldSeperator": ",",
        -		"fnClick": function( nButton, oConfig, flash ) {
        -			this.fnSetText( flash, this.fnGetTableData(oConfig) );
        -		}
        -	} ),
        -
        -	"xls": $.extend( {}, TableTools.buttonBase, {
        -		"sAction": "flash_save",
        -		"sCharSet": "utf16le",
        -		"bBomInc": true,
        -		"sButtonClass": "DTTT_button_xls",
        -		"sButtonText": "Excel",
        -		"fnClick": function( nButton, oConfig, flash ) {
        -			this.fnSetText( flash, this.fnGetTableData(oConfig) );
        -		}
        -	} ),
        -
        -	"copy": $.extend( {}, TableTools.buttonBase, {
        -		"sAction": "flash_copy",
        -		"sButtonClass": "DTTT_button_copy",
        -		"sButtonText": "Copy",
        -		"fnClick": function( nButton, oConfig, flash ) {
        -			this.fnSetText( flash, this.fnGetTableData(oConfig) );
        -		},
        -		"fnComplete": function(nButton, oConfig, flash, text) {
        -			var lines = text.split('\n').length;
        -            if (oConfig.bHeader) lines--;
        -            if (this.s.dt.nTFoot !== null && oConfig.bFooter) lines--;
        -			var plural = (lines==1) ? "" : "s";
        -			this.fnInfo( '<h6>Table copied</h6>'+
        -				'<p>Copied '+lines+' row'+plural+' to the clipboard.</p>',
        -				1500
        -			);
        -		}
        -	} ),
        -
        -	"pdf": $.extend( {}, TableTools.buttonBase, {
        -		"sAction": "flash_pdf",
        -		"sNewLine": "\n",
        -		"sFileName": "*.pdf",
        -		"sButtonClass": "DTTT_button_pdf",
        -		"sButtonText": "PDF",
        -		"sPdfOrientation": "portrait",
        -		"sPdfSize": "A4",
        -		"sPdfMessage": "",
        -		"fnClick": function( nButton, oConfig, flash ) {
        -			this.fnSetText( flash,
        -				"title:"+ this.fnGetTitle(oConfig) +"\n"+
        -				"message:"+ oConfig.sPdfMessage +"\n"+
        -				"colWidth:"+ this.fnCalcColRatios(oConfig) +"\n"+
        -				"orientation:"+ oConfig.sPdfOrientation +"\n"+
        -				"size:"+ oConfig.sPdfSize +"\n"+
        -				"--/TableToolsOpts--\n" +
        -				this.fnGetTableData(oConfig)
        -			);
        -		}
        -	} ),
        -
        -	"print": $.extend( {}, TableTools.buttonBase, {
        -		"sInfo": "<h6>Print view</h6><p>Please use your browser's print function to "+
        -		  "print this table. Press escape when finished.</p>",
        -		"sMessage": null,
        -		"bShowAll": true,
        -		"sToolTip": "View print view",
        -		"sButtonClass": "DTTT_button_print",
        -		"sButtonText": "Print",
        -		"fnClick": function ( nButton, oConfig ) {
        -			this.fnPrint( true, oConfig );
        -		}
        -	} ),
        -
        -	"text": $.extend( {}, TableTools.buttonBase ),
        -
        -	"select": $.extend( {}, TableTools.buttonBase, {
        -		"sButtonText": "Select button",
        -		"fnSelect": function( nButton, oConfig ) {
        -			if ( this.fnGetSelected().length !== 0 ) {
        -				$(nButton).removeClass( this.classes.buttons.disabled );
        -			} else {
        -				$(nButton).addClass( this.classes.buttons.disabled );
        -			}
        -		},
        -		"fnInit": function( nButton, oConfig ) {
        -			$(nButton).addClass( this.classes.buttons.disabled );
        -		}
        -	} ),
        -
        -	"select_single": $.extend( {}, TableTools.buttonBase, {
        -		"sButtonText": "Select button",
        -		"fnSelect": function( nButton, oConfig ) {
        -			var iSelected = this.fnGetSelected().length;
        -			if ( iSelected == 1 ) {
        -				$(nButton).removeClass( this.classes.buttons.disabled );
        -			} else {
        -				$(nButton).addClass( this.classes.buttons.disabled );
        -			}
        -		},
        -		"fnInit": function( nButton, oConfig ) {
        -			$(nButton).addClass( this.classes.buttons.disabled );
        -		}
        -	} ),
        -
        -	"select_all": $.extend( {}, TableTools.buttonBase, {
        -		"sButtonText": "Select all",
        -		"fnClick": function( nButton, oConfig ) {
        -			this.fnSelectAll();
        -		},
        -		"fnSelect": function( nButton, oConfig ) {
        -			if ( this.fnGetSelected().length == this.s.dt.fnRecordsDisplay() ) {
        -				$(nButton).addClass( this.classes.buttons.disabled );
        -			} else {
        -				$(nButton).removeClass( this.classes.buttons.disabled );
        -			}
        -		}
        -	} ),
        -
        -	"select_none": $.extend( {}, TableTools.buttonBase, {
        -		"sButtonText": "Deselect all",
        -		"fnClick": function( nButton, oConfig ) {
        -			this.fnSelectNone();
        -		},
        -		"fnSelect": function( nButton, oConfig ) {
        -			if ( this.fnGetSelected().length !== 0 ) {
        -				$(nButton).removeClass( this.classes.buttons.disabled );
        -			} else {
        -				$(nButton).addClass( this.classes.buttons.disabled );
        -			}
        -		},
        -		"fnInit": function( nButton, oConfig ) {
        -			$(nButton).addClass( this.classes.buttons.disabled );
        -		}
        -	} ),
        -
        -	"ajax": $.extend( {}, TableTools.buttonBase, {
        -		"sAjaxUrl": "/xhr.php",
        -		"sButtonText": "Ajax button",
        -		"fnClick": function( nButton, oConfig ) {
        -			var sData = this.fnGetTableData(oConfig);
        -			$.ajax( {
        -				"url": oConfig.sAjaxUrl,
        -				"data": [
        -					{ "name": "tableData", "value": sData }
        -				],
        -				"success": oConfig.fnAjaxComplete,
        -				"dataType": "json",
        -				"type": "POST",
        -				"cache": false,
        -				"error": function () {
        -					alert( "Error detected when sending table data to server" );
        -				}
        -			} );
        -		},
        -		"fnAjaxComplete": function( json ) {
        -			alert( 'Ajax complete' );
        -		}
        -	} ),
        -
        -	"div": $.extend( {}, TableTools.buttonBase, {
        -		"sAction": "div",
        -		"sTag": "div",
        -		"sButtonClass": "DTTT_nonbutton",
        -		"sButtonText": "Text button"
        -	} ),
        -
        -	"collection": $.extend( {}, TableTools.buttonBase, {
        -		"sAction": "collection",
        -		"sButtonClass": "DTTT_button_collection",
        -		"sButtonText": "Collection",
        -		"fnClick": function( nButton, oConfig ) {
        -			this._fnCollectionShow(nButton, oConfig);
        -		}
        -	} )
        -};
        -/*
        - *  on* callback parameters:
        - *     1. node - button element
        - *     2. object - configuration object for this button
        - *     3. object - ZeroClipboard reference (flash button only)
        - *     4. string - Returned string from Flash (flash button only - and only on 'complete')
        - */
        -
        -// Alias to match the other plug-ins styling
        -TableTools.buttons = TableTools.BUTTONS;
        -
        -
        -/**
        - * @namespace Classes used by TableTools - allows the styles to be override easily.
        - *   Note that when TableTools initialises it will take a copy of the classes object
        - *   and will use its internal copy for the remainder of its run time.
        - */
        -TableTools.classes = {
        -	"container": "DTTT_container",
        -	"buttons": {
        -		"normal": "DTTT_button",
        -		"disabled": "DTTT_disabled"
        -	},
        -	"collection": {
        -		"container": "DTTT_collection",
        -		"background": "DTTT_collection_background",
        -		"buttons": {
        -			"normal": "DTTT_button",
        -			"disabled": "DTTT_disabled"
        -		}
        -	},
        -	"select": {
        -		"table": "DTTT_selectable",
        -		"row": "DTTT_selected selected"
        -	},
        -	"print": {
        -		"body": "DTTT_Print",
        -		"info": "DTTT_print_info",
        -		"message": "DTTT_PrintMessage"
        -	}
        -};
        -
        -
        -/**
        - * @namespace ThemeRoller classes - built in for compatibility with DataTables' 
        - *   bJQueryUI option.
        - */
        -TableTools.classes_themeroller = {
        -	"container": "DTTT_container ui-buttonset ui-buttonset-multi",
        -	"buttons": {
        -		"normal": "DTTT_button ui-button ui-state-default"
        -	},
        -	"collection": {
        -		"container": "DTTT_collection ui-buttonset ui-buttonset-multi"
        -	}
        -};
        -
        -
        -/**
        - * @namespace TableTools default settings for initialisation
        - */
        -TableTools.DEFAULTS = {
        -	"sSwfPath":        "../swf/copy_csv_xls_pdf.swf",
        -	"sRowSelect":      "none",
        -	"sRowSelector":    "tr",
        -	"sSelectedClass":  null,
        -	"fnPreRowSelect":  null,
        -	"fnRowSelected":   null,
        -	"fnRowDeselected": null,
        -	"aButtons":        [ "copy", "csv", "xls", "pdf", "print" ],
        -	"oTags": {
        -		"container": "div",
        -		"button": "a", // We really want to use buttons here, but Firefox and IE ignore the
        -		                 // click on the Flash element in the button (but not mouse[in|out]).
        -		"liner": "span",
        -		"collection": {
        -			"container": "div",
        -			"button": "a",
        -			"liner": "span"
        -		}
        -	}
        -};
        -
        -// Alias to match the other plug-ins
        -TableTools.defaults = TableTools.DEFAULTS;
        -
        -
        -/**
        - * Name of this class
        - *  @constant CLASS
        - *  @type	 String
        - *  @default  TableTools
        - */
        -TableTools.prototype.CLASS = "TableTools";
        -
        -
        -/**
        - * TableTools version
        - *  @constant  VERSION
        - *  @type	  String
        - *  @default   See code
        - */
        -TableTools.version = "2.2.4";
        -
        -
        -
        -// DataTables 1.10 API
        -// 
        -// This will be extended in a big way in in TableTools 3 to provide API methods
        -// such as rows().select() and rows.selected() etc, but for the moment the
        -// tabletools() method simply returns the instance.
        -
        -if ( $.fn.dataTable.Api ) {
        -	$.fn.dataTable.Api.register( 'tabletools()', function () {
        -		var tt = null;
        -
        -		if ( this.context.length > 0 ) {
        -			tt = TableTools.fnGetInstance( this.context[0].nTable );
        -		}
        -
        -		return tt;
        -	} );
        -}
        -
        -
        -
        -
        -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        - * Initialisation
        - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        -
        -/*
        - * Register a new feature with DataTables
        - */
        -if ( typeof $.fn.dataTable == "function" &&
        -	 typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
        -	 $.fn.dataTableExt.fnVersionCheck('1.9.0') )
        -{
        -	$.fn.dataTableExt.aoFeatures.push( {
        -		"fnInit": function( oDTSettings ) {
        -			var init = oDTSettings.oInit;
        -			var opts = init ?
        -				init.tableTools || init.oTableTools || {} :
        -				{};
        -
        -			return new TableTools( oDTSettings.oInstance, opts ).dom.container;
        -		},
        -		"cFeature": "T",
        -		"sFeature": "TableTools"
        -	} );
        -}
        -else
        -{
        -	alert( "Warning: TableTools requires DataTables 1.9.0 or newer - www.datatables.net/download");
        -}
        -
        -$.fn.DataTable.TableTools = TableTools;
        -
        -})(jQuery, window, document);
        -
        -/*
        - * Register a new feature with DataTables
        - */
        -if ( typeof $.fn.dataTable == "function" &&
        -	 typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
        -	 $.fn.dataTableExt.fnVersionCheck('1.9.0') )
        -{
        -	$.fn.dataTableExt.aoFeatures.push( {
        -		"fnInit": function( oDTSettings ) {
        -			var oOpts = typeof oDTSettings.oInit.oTableTools != 'undefined' ?
        -				oDTSettings.oInit.oTableTools : {};
        -
        -			var oTT = new TableTools( oDTSettings.oInstance, oOpts );
        -			TableTools._aInstances.push( oTT );
        -
        -			return oTT.dom.container;
        -		},
        -		"cFeature": "T",
        -		"sFeature": "TableTools"
        -	} );
        -}
        -else
        -{
        -	alert( "Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download");
        -}
        -
        -
        -$.fn.dataTable.TableTools = TableTools;
        -$.fn.DataTable.TableTools = TableTools;
        -
        -
        -return TableTools;
        -}; // /factory
        -
        -
        -// Define as an AMD module if possible
        -if ( typeof define === 'function' && define.amd ) {
        -	define( ['jquery', 'datatables'], factory );
        -}
        -else if ( typeof exports === 'object' ) {
        -    // Node/CommonJS
        -    factory( require('jquery'), require('datatables') );
        -}
        -else if ( jQuery && !jQuery.fn.dataTable.TableTools ) {
        -	// Otherwise simply initialise as normal, stopping multiple evaluation
        -	factory( jQuery, jQuery.fn.dataTable );
        -}
        -
        -
        -})(window, document);
        -
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.min.js b/resources/assets/js/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.min.js
        deleted file mode 100755
        index e8c87056b4..0000000000
        --- a/resources/assets/js/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.min.js
        +++ /dev/null
        @@ -1,70 +0,0 @@
        -/*!
        - TableTools 2.2.4
        - 2009-2015 SpryMedia Ltd - datatables.net/license
        -
        - ZeroClipboard 1.0.4
        - Author: Joseph Huckaby - MIT licensed
        -*/
        -var TableTools;
        -(function(n,k,q){var p=function(m,p){var g={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=k.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show=function(){this.style.display=""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/,"")},a.hasClass=function(a){return!!this.className.match(RegExp("\\s*"+a+
        -"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,c){(a=this.clients[a])&&a.receiveEvent(b,c)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a){var b={left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!==a.style.width&&(b.width=a.style.width.replace("px",""));""!==a.style.height&&(b.height=a.style.height.replace("px",""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b},
        -Client:function(a){this.handlers={};this.id=g.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;g.register(this.id,this);a&&this.glue(a)}};g.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"",action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,glue:function(a,b){this.domElement=g.$(a);var c=99;this.domElement.style.zIndex&&(c=parseInt(this.domElement.style.zIndex,10)+1);var d=g.getDOMObjectPosition(this.domElement);this.div=k.createElement("div");var f=
        -this.div.style;f.position="absolute";f.left="0px";f.top="0px";f.width=d.width+"px";f.height=d.height+"px";f.zIndex=c;"undefined"!=typeof b&&""!==b&&(this.div.title=b);0!==d.width&&0!==d.height&&(this.sized=!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(d.width,d.height).replace(/&/g,"&amp;"))},positionElement:function(){var a=g.getDOMObjectPosition(this.domElement),b=this.div.style;b.position="absolute";b.width=a.width+"px";b.height=a.height+"px";0!==a.width&&
        -0!==a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var c="",d="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/))var f=location.href.match(/^https/i)?"https://":"http://",c=c+('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+f+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+a+'" height="'+b+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+
        -g.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+d+'"/><param name="wmode" value="transparent"/></object>');else c+='<embed id="'+this.movieId+'" src="'+g.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+a+'" height="'+b+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+
        -d+'" wmode="transparent" />';return c},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide();this.div.innerHTML="";var a=k.getElementsByTagName("body")[0];try{a.removeChild(this.div)}catch(b){}this.div=this.domElement=null}},reposition:function(a){a&&((this.domElement=g.$(a))||this.hide());if(this.domElement&&this.div){var a=g.getDOMObjectPosition(this.domElement),b=this.div.style;b.left=""+a.left+
        -"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+=a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setCharSet:function(a){this.charSet=a;this.ready&&this.movie.setCharSet(a)},setBomInc:function(a){this.incBom=a;this.ready&&this.movie.setBomInc(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)},setAction:function(a){this.action=
        -a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){var c,a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=k.getElementById(this.movieId);if(!this.movie){c=this;setTimeout(function(){c.receiveEvent("load",
        -null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){c=this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=!0;return}this.ready=!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setCharSet(this.charSet);this.movie.setBomInc(this.incBom);this.movie.setHandCursor(this.handCursorEnabled);break;case "mouseover":this.domElement&&this.cssEffects&&
        -this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var d=0,f=this.handlers[a].length;d<
        -f;d++){var e=this.handlers[a][d];if("function"==typeof e)e(this,b);else if("object"==typeof e&&2==e.length)e[0][e[1]](this,b);else if("string"==typeof e)n[e](this,b)}}};n.ZeroClipboard_TableTools=g;var e=jQuery;TableTools=function(a,b){!this instanceof TableTools&&alert("Warning: TableTools must be initialised with the keyword 'new'");this.s={that:this,dt:e.fn.dataTable.Api?(new e.fn.dataTable.Api(a)).settings()[0]:a.fnSettings(),print:{saveStart:-1,saveLength:-1,saveScroll:-1,funcEnd:function(){}},
        -buttonCounter:0,select:{type:"",selected:[],preRowSelect:null,postSelected:null,postDeselected:null,all:!1,selectedClass:""},custom:{},swfPath:"",buttonSet:[],master:!1,tags:{}};this.dom={container:null,table:null,print:{hidden:[],message:null},collection:{collection:null,background:null}};this.classes=e.extend(!0,{},TableTools.classes);this.s.dt.bJUI&&e.extend(!0,this.classes,TableTools.classes_themeroller);this.fnSettings=function(){return this.s};"undefined"==typeof b&&(b={});TableTools._aInstances.push(this);
        -this._fnConstruct(b);return this};TableTools.prototype={fnGetSelected:function(a){var b=[],c=this.s.dt.aoData,d=this.s.dt.aiDisplay,f;if(a){a=0;for(f=d.length;a<f;a++)c[d[a]]._DTTT_selected&&b.push(c[d[a]].nTr)}else{a=0;for(f=c.length;a<f;a++)c[a]._DTTT_selected&&b.push(c[a].nTr)}return b},fnGetSelectedData:function(){var a=[],b=this.s.dt.aoData,c,d;c=0;for(d=b.length;c<d;c++)b[c]._DTTT_selected&&a.push(this.s.dt.oInstance.fnGetData(c));return a},fnGetSelectedIndexes:function(a){var b=[],c=this.s.dt.aoData,
        -d=this.s.dt.aiDisplay,f;if(a){a=0;for(f=d.length;a<f;a++)c[d[a]]._DTTT_selected&&b.push(d[a])}else{a=0;for(f=c.length;a<f;a++)c[a]._DTTT_selected&&b.push(a)}return b},fnIsSelected:function(a){a=this.s.dt.oInstance.fnGetPosition(a);return!0===this.s.dt.aoData[a]._DTTT_selected?!0:!1},fnSelectAll:function(a){this._fnRowSelect(a?this.s.dt.aiDisplay:this.s.dt.aoData)},fnSelectNone:function(a){this._fnRowDeselect(this.fnGetSelectedIndexes(a))},fnSelect:function(a){"single"==this.s.select.type&&this.fnSelectNone();
        -this._fnRowSelect(a)},fnDeselect:function(a){this._fnRowDeselect(a)},fnGetTitle:function(a){var b="";"undefined"!=typeof a.sTitle&&""!==a.sTitle?b=a.sTitle:(a=k.getElementsByTagName("title"),0<a.length&&(b=a[0].innerHTML));return 4>"¡".toString().length?b.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g,""):b.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g,"")},fnCalcColRatios:function(a){var b=this.s.dt.aoColumns,a=this._fnColumnTargets(a.mColumns),c=[],d=0,f=0,e,i;e=0;for(i=a.length;e<i;e++)a[e]&&(d=b[e].nTh.offsetWidth,
        -f+=d,c.push(d));e=0;for(i=c.length;e<i;e++)c[e]/=f;return c.join("\t")},fnGetTableData:function(a){if(this.s.dt)return this._fnGetDataTablesData(a)},fnSetText:function(a,b){this._fnFlashSetText(a,b)},fnResizeButtons:function(){for(var a in g.clients)if(a){var b=g.clients[a];"undefined"!=typeof b.domElement&&b.domElement.parentNode&&b.positionElement()}},fnResizeRequired:function(){for(var a in g.clients)if(a){var b=g.clients[a];if("undefined"!=typeof b.domElement&&b.domElement.parentNode==this.dom.container&&
        -!1===b.sized)return!0}return!1},fnPrint:function(a,b){b===q&&(b={});a===q||a?this._fnPrintStart(b):this._fnPrintEnd()},fnInfo:function(a,b){var c=e("<div/>").addClass(this.classes.print.info).html(a).appendTo("body");setTimeout(function(){c.fadeOut("normal",function(){c.remove()})},b)},fnContainer:function(){return this.dom.container},_fnConstruct:function(a){var b=this;this._fnCustomiseSettings(a);this.dom.container=k.createElement(this.s.tags.container);this.dom.container.className=this.classes.container;
        -"none"!=this.s.select.type&&this._fnRowSelectConfig();this._fnButtonDefinations(this.s.buttonSet,this.dom.container);this.s.dt.aoDestroyCallback.push({sName:"TableTools",fn:function(){e(b.s.dt.nTBody).off("click.DTTT_Select",b.s.custom.sRowSelector).off("mousedown.DTTT_Select","tr").off("mouseup.DTTT_Select","tr");e(b.dom.container).empty();var a=e.inArray(b,TableTools._aInstances);-1!==a&&TableTools._aInstances.splice(a,1)}})},_fnCustomiseSettings:function(a){"undefined"==typeof this.s.dt._TableToolsInit&&
        -(this.s.master=!0,this.s.dt._TableToolsInit=!0);this.dom.table=this.s.dt.nTable;this.s.custom=e.extend({},TableTools.DEFAULTS,a);this.s.swfPath=this.s.custom.sSwfPath;"undefined"!=typeof g&&(g.moviePath=this.s.swfPath);this.s.select.type=this.s.custom.sRowSelect;this.s.select.preRowSelect=this.s.custom.fnPreRowSelect;this.s.select.postSelected=this.s.custom.fnRowSelected;this.s.select.postDeselected=this.s.custom.fnRowDeselected;this.s.custom.sSelectedClass&&(this.classes.select.row=this.s.custom.sSelectedClass);
        -this.s.tags=this.s.custom.oTags;this.s.buttonSet=this.s.custom.aButtons},_fnButtonDefinations:function(a,b){for(var c,d=0,f=a.length;d<f;d++){if("string"==typeof a[d]){if("undefined"==typeof TableTools.BUTTONS[a[d]]){alert("TableTools: Warning - unknown button type: "+a[d]);continue}c=e.extend({},TableTools.BUTTONS[a[d]],!0)}else{if("undefined"==typeof TableTools.BUTTONS[a[d].sExtends]){alert("TableTools: Warning - unknown button type: "+a[d].sExtends);continue}c=e.extend({},TableTools.BUTTONS[a[d].sExtends],
        -!0);c=e.extend(c,a[d],!0)}(c=this._fnCreateButton(c,e(b).hasClass(this.classes.collection.container)))&&b.appendChild(c)}},_fnCreateButton:function(a,b){var c=this._fnButtonBase(a,b);if(a.sAction.match(/flash/)){if(!this._fnHasFlash())return!1;this._fnFlashConfig(c,a)}else"text"==a.sAction?this._fnTextConfig(c,a):"div"==a.sAction?this._fnTextConfig(c,a):"collection"==a.sAction&&(this._fnTextConfig(c,a),this._fnCollectionConfig(c,a));if(-1!==this.s.dt.iTabIndex)e(c).attr("tabindex",this.s.dt.iTabIndex).attr("aria-controls",
        -this.s.dt.sTableId).on("keyup.DTTT",function(a){13===a.keyCode&&(a.stopPropagation(),e(this).trigger("click"))}).on("mousedown.DTTT",function(b){a.sAction.match(/flash/)||b.preventDefault()});return c},_fnButtonBase:function(a,b){var c,d,f;b?(c=a.sTag&&"default"!==a.sTag?a.sTag:this.s.tags.collection.button,d=a.sLinerTag&&"default"!==a.sLinerTag?a.sLiner:this.s.tags.collection.liner,f=this.classes.collection.buttons.normal):(c=a.sTag&&"default"!==a.sTag?a.sTag:this.s.tags.button,d=a.sLinerTag&&"default"!==
        -a.sLinerTag?a.sLiner:this.s.tags.liner,f=this.classes.buttons.normal);c=k.createElement(c);d=k.createElement(d);var e=this._fnGetMasterSettings();c.className=f+" "+a.sButtonClass;c.setAttribute("id","ToolTables_"+this.s.dt.sInstance+"_"+e.buttonCounter);c.appendChild(d);d.innerHTML=a.sButtonText;e.buttonCounter++;return c},_fnGetMasterSettings:function(){if(this.s.master)return this.s;for(var a=TableTools._aInstances,b=0,c=a.length;b<c;b++)if(this.dom.table==a[b].s.dt.nTable)return a[b].s},_fnCollectionConfig:function(a,
        -b){var c=k.createElement(this.s.tags.collection.container);c.style.display="none";c.className=this.classes.collection.container;b._collection=c;k.body.appendChild(c);this._fnButtonDefinations(b.aButtons,c)},_fnCollectionShow:function(a,b){var c=this,d=e(a).offset(),f=b._collection,j=d.left,d=d.top+e(a).outerHeight(),i=e(n).height(),h=e(k).height(),o=e(n).width(),g=e(k).width();f.style.position="absolute";f.style.left=j+"px";f.style.top=d+"px";f.style.display="block";e(f).css("opacity",0);var l=k.createElement("div");
        -l.style.position="absolute";l.style.left="0px";l.style.top="0px";l.style.height=(i>h?i:h)+"px";l.style.width=(o>g?o:g)+"px";l.className=this.classes.collection.background;e(l).css("opacity",0);k.body.appendChild(l);k.body.appendChild(f);i=e(f).outerWidth();o=e(f).outerHeight();j+i>g&&(f.style.left=g-i+"px");d+o>h&&(f.style.top=d-o-e(a).outerHeight()+"px");this.dom.collection.collection=f;this.dom.collection.background=l;setTimeout(function(){e(f).animate({opacity:1},500);e(l).animate({opacity:0.25},
        -500)},10);this.fnResizeButtons();e(l).click(function(){c._fnCollectionHide.call(c,null,null)})},_fnCollectionHide:function(a,b){!(null!==b&&"collection"==b.sExtends)&&null!==this.dom.collection.collection&&(e(this.dom.collection.collection).animate({opacity:0},500,function(){this.style.display="none"}),e(this.dom.collection.background).animate({opacity:0},500,function(){this.parentNode.removeChild(this)}),this.dom.collection.collection=null,this.dom.collection.background=null)},_fnRowSelectConfig:function(){if(this.s.master){var a=
        -this,b=this.s.dt;e(b.nTable).addClass(this.classes.select.table);"os"===this.s.select.type&&(e(b.nTBody).on("mousedown.DTTT_Select","tr",function(a){if(a.shiftKey)e(b.nTBody).css("-moz-user-select","none").one("selectstart.DTTT_Select","tr",function(){return!1})}),e(b.nTBody).on("mouseup.DTTT_Select","tr",function(){e(b.nTBody).css("-moz-user-select","")}));e(b.nTBody).on("click.DTTT_Select",this.s.custom.sRowSelector,function(c){var d=this.nodeName.toLowerCase()==="tr"?this:e(this).parents("tr")[0],
        -f=a.s.select,j=a.s.dt.oInstance.fnGetPosition(d);if(d.parentNode==b.nTBody&&b.oInstance.fnGetData(d)!==null){if(f.type=="os")if(c.ctrlKey||c.metaKey)a.fnIsSelected(d)?a._fnRowDeselect(d,c):a._fnRowSelect(d,c);else if(c.shiftKey){var i=a.s.dt.aiDisplay.slice(),h=e.inArray(f.lastRow,i),o=e.inArray(j,i);if(a.fnGetSelected().length===0||h===-1)i.splice(e.inArray(j,i)+1,i.length);else{if(h>o)var g=o,o=h,h=g;i.splice(o+1,i.length);i.splice(0,h)}if(a.fnIsSelected(d)){i.splice(e.inArray(j,i),1);a._fnRowDeselect(i,
        -c)}else a._fnRowSelect(i,c)}else if(a.fnIsSelected(d)&&a.fnGetSelected().length===1)a._fnRowDeselect(d,c);else{a.fnSelectNone();a._fnRowSelect(d,c)}else if(a.fnIsSelected(d))a._fnRowDeselect(d,c);else if(f.type=="single"){a.fnSelectNone();a._fnRowSelect(d,c)}else f.type=="multi"&&a._fnRowSelect(d,c);f.lastRow=j}});b.oApi._fnCallbackReg(b,"aoRowCreatedCallback",function(c,d,f){b.aoData[f]._DTTT_selected&&e(c).addClass(a.classes.select.row)},"TableTools-SelectAll")}},_fnRowSelect:function(a,b){var c=
        -this._fnSelectData(a),d=[],f,j;f=0;for(j=c.length;f<j;f++)c[f].nTr&&d.push(c[f].nTr);if(null===this.s.select.preRowSelect||this.s.select.preRowSelect.call(this,b,d,!0)){f=0;for(j=c.length;f<j;f++)c[f]._DTTT_selected=!0,c[f].nTr&&e(c[f].nTr).addClass(this.classes.select.row);null!==this.s.select.postSelected&&this.s.select.postSelected.call(this,d);TableTools._fnEventDispatch(this,"select",d,!0)}},_fnRowDeselect:function(a,b){var c=this._fnSelectData(a),d=[],f,j;f=0;for(j=c.length;f<j;f++)c[f].nTr&&
        -d.push(c[f].nTr);if(null===this.s.select.preRowSelect||this.s.select.preRowSelect.call(this,b,d,!1)){f=0;for(j=c.length;f<j;f++)c[f]._DTTT_selected=!1,c[f].nTr&&e(c[f].nTr).removeClass(this.classes.select.row);null!==this.s.select.postDeselected&&this.s.select.postDeselected.call(this,d);TableTools._fnEventDispatch(this,"select",d,!1)}},_fnSelectData:function(a){var b=[],c,d,f;if(a.nodeName)c=this.s.dt.oInstance.fnGetPosition(a),b.push(this.s.dt.aoData[c]);else if("undefined"!==typeof a.length){d=
        -0;for(f=a.length;d<f;d++)a[d].nodeName?(c=this.s.dt.oInstance.fnGetPosition(a[d]),b.push(this.s.dt.aoData[c])):"number"===typeof a[d]?b.push(this.s.dt.aoData[a[d]]):b.push(a[d])}else"number"===typeof a?b.push(this.s.dt.aoData[a]):b.push(a);return b},_fnTextConfig:function(a,b){var c=this;null!==b.fnInit&&b.fnInit.call(this,a,b);""!==b.sToolTip&&(a.title=b.sToolTip);e(a).hover(function(){b.fnMouseover!==null&&b.fnMouseover.call(this,a,b,null)},function(){b.fnMouseout!==null&&b.fnMouseout.call(this,
        -a,b,null)});null!==b.fnSelect&&TableTools._fnEventListen(this,"select",function(d){b.fnSelect.call(c,a,b,d)});e(a).click(function(d){b.fnClick!==null&&b.fnClick.call(c,a,b,null,d);b.fnComplete!==null&&b.fnComplete.call(c,a,b,null,null);c._fnCollectionHide(a,b)})},_fnHasFlash:function(){try{if(new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))return!0}catch(a){if(navigator.mimeTypes&&navigator.mimeTypes["application/x-shockwave-flash"]!==q&&navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)return!0}return!1},
        -_fnFlashConfig:function(a,b){var c=this,d=new g.Client;null!==b.fnInit&&b.fnInit.call(this,a,b);d.setHandCursor(!0);"flash_save"==b.sAction?(d.setAction("save"),d.setCharSet("utf16le"==b.sCharSet?"UTF16LE":"UTF8"),d.setBomInc(b.bBomInc),d.setFileName(b.sFileName.replace("*",this.fnGetTitle(b)))):"flash_pdf"==b.sAction?(d.setAction("pdf"),d.setFileName(b.sFileName.replace("*",this.fnGetTitle(b)))):d.setAction("copy");d.addEventListener("mouseOver",function(){b.fnMouseover!==null&&b.fnMouseover.call(c,
        -a,b,d)});d.addEventListener("mouseOut",function(){b.fnMouseout!==null&&b.fnMouseout.call(c,a,b,d)});d.addEventListener("mouseDown",function(){b.fnClick!==null&&b.fnClick.call(c,a,b,d)});d.addEventListener("complete",function(f,e){b.fnComplete!==null&&b.fnComplete.call(c,a,b,d,e);c._fnCollectionHide(a,b)});null!==b.fnSelect&&TableTools._fnEventListen(this,"select",function(d){b.fnSelect.call(c,a,b,d)});this._fnFlashGlue(d,a,b.sToolTip)},_fnFlashGlue:function(a,b,c){var d=this,f=b.getAttribute("id");
        -k.getElementById(f)?a.glue(b,c):setTimeout(function(){d._fnFlashGlue(a,b,c)},100)},_fnFlashSetText:function(a,b){var c=this._fnChunkData(b,8192);a.clearText();for(var d=0,f=c.length;d<f;d++)a.appendText(c[d])},_fnColumnTargets:function(a){var b=[],c=this.s.dt,d,f=c.aoColumns;d=f.length;if("function"==typeof a){a=a.call(this,c);for(c=0;c<d;c++)b.push(-1!==e.inArray(c,a)?!0:!1)}else if("object"==typeof a){for(c=0;c<d;c++)b.push(!1);c=0;for(d=a.length;c<d;c++)b[a[c]]=!0}else if("visible"==a)for(c=0;c<
        -d;c++)b.push(f[c].bVisible?!0:!1);else if("hidden"==a)for(c=0;c<d;c++)b.push(f[c].bVisible?!1:!0);else if("sortable"==a)for(c=0;c<d;c++)b.push(f[c].bSortable?!0:!1);else for(c=0;c<d;c++)b.push(!0);return b},_fnNewline:function(a){return"auto"==a.sNewLine?navigator.userAgent.match(/Windows/)?"\r\n":"\n":a.sNewLine},_fnGetDataTablesData:function(a){var b,c,d,f,j,i=[],h="",g=this.s.dt,k,l=RegExp(a.sFieldBoundary,"g"),n=this._fnColumnTargets(a.mColumns);d="undefined"!=typeof a.bSelectedOnly?a.bSelectedOnly:
        -!1;if(a.bHeader){j=[];b=0;for(c=g.aoColumns.length;b<c;b++)n[b]&&(h=g.aoColumns[b].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,""),h=this._fnHtmlDecode(h),j.push(this._fnBoundData(h,a.sFieldBoundary,l)));i.push(j.join(a.sFieldSeperator))}d=!0;var m;f=this.fnGetSelectedIndexes();m=(d="none"!==this.s.select.type&&d&&0!==f.length)?f:p.Api?(new p.Api(g)).rows(a.oSelectorOpts).indexes().flatten().toArray():g.oInstance.$("tr",a.oSelectorOpts).map(function(a,b){return g.oInstance.fnGetPosition(b)}).get();
        -d=0;for(f=m.length;d<f;d++){k=g.aoData[m[d]].nTr;j=[];b=0;for(c=g.aoColumns.length;b<c;b++)n[b]&&(h=g.oApi._fnGetCellData(g,m[d],b,"display"),a.fnCellRender?h=a.fnCellRender(h,b,k,m[d])+"":"string"==typeof h?(h=h.replace(/\n/g," "),h=h.replace(/<img.*?\s+alt\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+)).*?>/gi,"$1$2$3"),h=h.replace(/<.*?>/g,"")):h+="",h=h.replace(/^\s+/,"").replace(/\s+$/,""),h=this._fnHtmlDecode(h),j.push(this._fnBoundData(h,a.sFieldBoundary,l)));i.push(j.join(a.sFieldSeperator));a.bOpenRows&&
        -(b=e.grep(g.aoOpenRows,function(a){return a.nParent===k}),1===b.length&&(h=this._fnBoundData(e("td",b[0].nTr).html(),a.sFieldBoundary,l),i.push(h)))}if(a.bFooter&&null!==g.nTFoot){j=[];b=0;for(c=g.aoColumns.length;b<c;b++)n[b]&&null!==g.aoColumns[b].nTf&&(h=g.aoColumns[b].nTf.innerHTML.replace(/\n/g," ").replace(/<.*?>/g,""),h=this._fnHtmlDecode(h),j.push(this._fnBoundData(h,a.sFieldBoundary,l)));i.push(j.join(a.sFieldSeperator))}return i.join(this._fnNewline(a))},_fnBoundData:function(a,b,c){return""===
        -b?a:b+a.replace(c,b+b)+b},_fnChunkData:function(a,b){for(var c=[],d=a.length,f=0;f<d;f+=b)f+b<d?c.push(a.substring(f,f+b)):c.push(a.substring(f,d));return c},_fnHtmlDecode:function(a){if(-1===a.indexOf("&"))return a;var b=k.createElement("div");return a.replace(/&([^\s]*?);/g,function(a,d){if("#"===a.substr(1,1))return String.fromCharCode(Number(d.substr(1)));b.innerHTML=a;return b.childNodes[0].nodeValue})},_fnPrintStart:function(a){var b=this,c=this.s.dt;this._fnPrintHideNodes(c.nTable);this.s.print.saveStart=
        -c._iDisplayStart;this.s.print.saveLength=c._iDisplayLength;a.bShowAll&&(c._iDisplayStart=0,c._iDisplayLength=-1,c.oApi._fnCalculateEnd&&c.oApi._fnCalculateEnd(c),c.oApi._fnDraw(c));if(""!==c.oScroll.sX||""!==c.oScroll.sY)this._fnPrintScrollStart(c),e(this.s.dt.nTable).bind("draw.DTTT_Print",function(){b._fnPrintScrollStart(c)});var d=c.aanFeatures,f;for(f in d)if("i"!=f&&"t"!=f&&1==f.length)for(var g=0,i=d[f].length;g<i;g++)this.dom.print.hidden.push({node:d[f][g],display:"block"}),d[f][g].style.display=
        -"none";e(k.body).addClass(this.classes.print.body);""!==a.sInfo&&this.fnInfo(a.sInfo,3E3);a.sMessage&&e("<div/>").addClass(this.classes.print.message).html(a.sMessage).prependTo("body");this.s.print.saveScroll=e(n).scrollTop();n.scrollTo(0,0);e(k).bind("keydown.DTTT",function(a){if(a.keyCode==27){a.preventDefault();b._fnPrintEnd.call(b,a)}})},_fnPrintEnd:function(){var a=this.s.dt,b=this.s.print;this._fnPrintShowNodes();if(""!==a.oScroll.sX||""!==a.oScroll.sY)e(this.s.dt.nTable).unbind("draw.DTTT_Print"),
        -this._fnPrintScrollEnd();n.scrollTo(0,b.saveScroll);e("div."+this.classes.print.message).remove();e(k.body).removeClass("DTTT_Print");a._iDisplayStart=b.saveStart;a._iDisplayLength=b.saveLength;a.oApi._fnCalculateEnd&&a.oApi._fnCalculateEnd(a);a.oApi._fnDraw(a);e(k).unbind("keydown.DTTT")},_fnPrintScrollStart:function(){var a=this.s.dt;a.nScrollHead.getElementsByTagName("div")[0].getElementsByTagName("table");var b=a.nTable.parentNode,c;c=a.nTable.getElementsByTagName("thead");0<c.length&&a.nTable.removeChild(c[0]);
        -null!==a.nTFoot&&(c=a.nTable.getElementsByTagName("tfoot"),0<c.length&&a.nTable.removeChild(c[0]));c=a.nTHead.cloneNode(!0);a.nTable.insertBefore(c,a.nTable.childNodes[0]);null!==a.nTFoot&&(c=a.nTFoot.cloneNode(!0),a.nTable.insertBefore(c,a.nTable.childNodes[1]));""!==a.oScroll.sX&&(a.nTable.style.width=e(a.nTable).outerWidth()+"px",b.style.width=e(a.nTable).outerWidth()+"px",b.style.overflow="visible");""!==a.oScroll.sY&&(b.style.height=e(a.nTable).outerHeight()+"px",b.style.overflow="visible")},
        -_fnPrintScrollEnd:function(){var a=this.s.dt,b=a.nTable.parentNode;""!==a.oScroll.sX&&(b.style.width=a.oApi._fnStringToCss(a.oScroll.sX),b.style.overflow="auto");""!==a.oScroll.sY&&(b.style.height=a.oApi._fnStringToCss(a.oScroll.sY),b.style.overflow="auto")},_fnPrintShowNodes:function(){for(var a=this.dom.print.hidden,b=0,c=a.length;b<c;b++)a[b].node.style.display=a[b].display;a.splice(0,a.length)},_fnPrintHideNodes:function(a){for(var b=this.dom.print.hidden,c=a.parentNode,d=c.childNodes,f=0,g=d.length;f<
        -g;f++)if(d[f]!=a&&1==d[f].nodeType){var i=e(d[f]).css("display");"none"!=i&&(b.push({node:d[f],display:i}),d[f].style.display="none")}"BODY"!=c.nodeName.toUpperCase()&&this._fnPrintHideNodes(c)}};TableTools._aInstances=[];TableTools._aListeners=[];TableTools.fnGetMasters=function(){for(var a=[],b=0,c=TableTools._aInstances.length;b<c;b++)TableTools._aInstances[b].s.master&&a.push(TableTools._aInstances[b]);return a};TableTools.fnGetInstance=function(a){"object"!=typeof a&&(a=k.getElementById(a));
        -for(var b=0,c=TableTools._aInstances.length;b<c;b++)if(TableTools._aInstances[b].s.master&&TableTools._aInstances[b].dom.table==a)return TableTools._aInstances[b];return null};TableTools._fnEventListen=function(a,b,c){TableTools._aListeners.push({that:a,type:b,fn:c})};TableTools._fnEventDispatch=function(a,b,c,d){for(var f=TableTools._aListeners,e=0,g=f.length;e<g;e++)a.dom.table==f[e].that.dom.table&&f[e].type==b&&f[e].fn(c,d)};TableTools.buttonBase={sAction:"text",sTag:"default",sLinerTag:"default",
        -sButtonClass:"DTTT_button_text",sButtonText:"Button text",sTitle:"",sToolTip:"",sCharSet:"utf8",bBomInc:!1,sFileName:"*.csv",sFieldBoundary:"",sFieldSeperator:"\t",sNewLine:"auto",mColumns:"all",bHeader:!0,bFooter:!0,bOpenRows:!1,bSelectedOnly:!1,oSelectorOpts:q,fnMouseover:null,fnMouseout:null,fnClick:null,fnSelect:null,fnComplete:null,fnInit:null,fnCellRender:null};TableTools.BUTTONS={csv:e.extend({},TableTools.buttonBase,{sAction:"flash_save",sButtonClass:"DTTT_button_csv",sButtonText:"CSV",sFieldBoundary:'"',
        -sFieldSeperator:",",fnClick:function(a,b,c){this.fnSetText(c,this.fnGetTableData(b))}}),xls:e.extend({},TableTools.buttonBase,{sAction:"flash_save",sCharSet:"utf16le",bBomInc:!0,sButtonClass:"DTTT_button_xls",sButtonText:"Excel",fnClick:function(a,b,c){this.fnSetText(c,this.fnGetTableData(b))}}),copy:e.extend({},TableTools.buttonBase,{sAction:"flash_copy",sButtonClass:"DTTT_button_copy",sButtonText:"Copy",fnClick:function(a,b,c){this.fnSetText(c,this.fnGetTableData(b))},fnComplete:function(a,b,c,
        -d){a=d.split("\n").length;b.bHeader&&a--;null!==this.s.dt.nTFoot&&b.bFooter&&a--;this.fnInfo("<h6>Table copied</h6><p>Copied "+a+" row"+(1==a?"":"s")+" to the clipboard.</p>",1500)}}),pdf:e.extend({},TableTools.buttonBase,{sAction:"flash_pdf",sNewLine:"\n",sFileName:"*.pdf",sButtonClass:"DTTT_button_pdf",sButtonText:"PDF",sPdfOrientation:"portrait",sPdfSize:"A4",sPdfMessage:"",fnClick:function(a,b,c){this.fnSetText(c,"title:"+this.fnGetTitle(b)+"\nmessage:"+b.sPdfMessage+"\ncolWidth:"+this.fnCalcColRatios(b)+
        -"\norientation:"+b.sPdfOrientation+"\nsize:"+b.sPdfSize+"\n--/TableToolsOpts--\n"+this.fnGetTableData(b))}}),print:e.extend({},TableTools.buttonBase,{sInfo:"<h6>Print view</h6><p>Please use your browser's print function to print this table. Press escape when finished.</p>",sMessage:null,bShowAll:!0,sToolTip:"View print view",sButtonClass:"DTTT_button_print",sButtonText:"Print",fnClick:function(a,b){this.fnPrint(!0,b)}}),text:e.extend({},TableTools.buttonBase),select:e.extend({},TableTools.buttonBase,
        -{sButtonText:"Select button",fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),select_single:e.extend({},TableTools.buttonBase,{sButtonText:"Select button",fnSelect:function(a){1==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),
        -select_all:e.extend({},TableTools.buttonBase,{sButtonText:"Select all",fnClick:function(){this.fnSelectAll()},fnSelect:function(a){this.fnGetSelected().length==this.s.dt.fnRecordsDisplay()?e(a).addClass(this.classes.buttons.disabled):e(a).removeClass(this.classes.buttons.disabled)}}),select_none:e.extend({},TableTools.buttonBase,{sButtonText:"Deselect all",fnClick:function(){this.fnSelectNone()},fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},
        -fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),ajax:e.extend({},TableTools.buttonBase,{sAjaxUrl:"/xhr.php",sButtonText:"Ajax button",fnClick:function(a,b){var c=this.fnGetTableData(b);e.ajax({url:b.sAjaxUrl,data:[{name:"tableData",value:c}],success:b.fnAjaxComplete,dataType:"json",type:"POST",cache:!1,error:function(){alert("Error detected when sending table data to server")}})},fnAjaxComplete:function(){alert("Ajax complete")}}),div:e.extend({},TableTools.buttonBase,{sAction:"div",
        -sTag:"div",sButtonClass:"DTTT_nonbutton",sButtonText:"Text button"}),collection:e.extend({},TableTools.buttonBase,{sAction:"collection",sButtonClass:"DTTT_button_collection",sButtonText:"Collection",fnClick:function(a,b){this._fnCollectionShow(a,b)}})};TableTools.buttons=TableTools.BUTTONS;TableTools.classes={container:"DTTT_container",buttons:{normal:"DTTT_button",disabled:"DTTT_disabled"},collection:{container:"DTTT_collection",background:"DTTT_collection_background",buttons:{normal:"DTTT_button",
        -disabled:"DTTT_disabled"}},select:{table:"DTTT_selectable",row:"DTTT_selected selected"},print:{body:"DTTT_Print",info:"DTTT_print_info",message:"DTTT_PrintMessage"}};TableTools.classes_themeroller={container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}};TableTools.DEFAULTS={sSwfPath:"../swf/copy_csv_xls_pdf.swf",sRowSelect:"none",sRowSelector:"tr",sSelectedClass:null,
        -fnPreRowSelect:null,fnRowSelected:null,fnRowDeselected:null,aButtons:["copy","csv","xls","pdf","print"],oTags:{container:"div",button:"a",liner:"span",collection:{container:"div",button:"a",liner:"span"}}};TableTools.defaults=TableTools.DEFAULTS;TableTools.prototype.CLASS="TableTools";TableTools.version="2.2.4";e.fn.dataTable.Api&&e.fn.dataTable.Api.register("tabletools()",function(){var a=null;0<this.context.length&&(a=TableTools.fnGetInstance(this.context[0].nTable));return a});"function"==typeof e.fn.dataTable&&
        -"function"==typeof e.fn.dataTableExt.fnVersionCheck&&e.fn.dataTableExt.fnVersionCheck("1.9.0")?e.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInit;return(new TableTools(a.oInstance,b?b.tableTools||b.oTableTools||{}:{})).dom.container},cFeature:"T",sFeature:"TableTools"}):alert("Warning: TableTools requires DataTables 1.9.0 or newer - www.datatables.net/download");e.fn.DataTable.TableTools=TableTools;"function"==typeof m.fn.dataTable&&"function"==typeof m.fn.dataTableExt.fnVersionCheck&&
        -m.fn.dataTableExt.fnVersionCheck("1.9.0")?m.fn.dataTableExt.aoFeatures.push({fnInit:function(a){a=new TableTools(a.oInstance,"undefined"!=typeof a.oInit.oTableTools?a.oInit.oTableTools:{});TableTools._aInstances.push(a);return a.dom.container},cFeature:"T",sFeature:"TableTools"}):alert("Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download");m.fn.dataTable.TableTools=TableTools;return m.fn.DataTable.TableTools=TableTools};"function"===typeof define&&define.amd?define(["jquery",
        -"datatables"],p):"object"===typeof exports?p(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.TableTools&&p(jQuery,jQuery.fn.dataTable)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/swf/copy_csv_xls.swf b/resources/assets/js/plugins/datatables/extensions/TableTools/swf/copy_csv_xls.swf
        deleted file mode 100755
        index 8976009d55..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/swf/copy_csv_xls.swf and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/extensions/TableTools/swf/copy_csv_xls_pdf.swf b/resources/assets/js/plugins/datatables/extensions/TableTools/swf/copy_csv_xls_pdf.swf
        deleted file mode 100755
        index 10f6d950f8..0000000000
        Binary files a/resources/assets/js/plugins/datatables/extensions/TableTools/swf/copy_csv_xls_pdf.swf and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/images/sort_asc.png b/resources/assets/js/plugins/datatables/images/sort_asc.png
        deleted file mode 100755
        index e1ba61a805..0000000000
        Binary files a/resources/assets/js/plugins/datatables/images/sort_asc.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/images/sort_asc_disabled.png b/resources/assets/js/plugins/datatables/images/sort_asc_disabled.png
        deleted file mode 100755
        index fb11dfe24a..0000000000
        Binary files a/resources/assets/js/plugins/datatables/images/sort_asc_disabled.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/images/sort_both.png b/resources/assets/js/plugins/datatables/images/sort_both.png
        deleted file mode 100755
        index af5bc7c5a1..0000000000
        Binary files a/resources/assets/js/plugins/datatables/images/sort_both.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/images/sort_desc.png b/resources/assets/js/plugins/datatables/images/sort_desc.png
        deleted file mode 100755
        index 0e156deb5f..0000000000
        Binary files a/resources/assets/js/plugins/datatables/images/sort_desc.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/images/sort_desc_disabled.png b/resources/assets/js/plugins/datatables/images/sort_desc_disabled.png
        deleted file mode 100755
        index c9fdd8a150..0000000000
        Binary files a/resources/assets/js/plugins/datatables/images/sort_desc_disabled.png and /dev/null differ
        diff --git a/resources/assets/js/plugins/datatables/jquery.dataTables.css b/resources/assets/js/plugins/datatables/jquery.dataTables.css
        deleted file mode 100755
        index eec02ef59b..0000000000
        --- a/resources/assets/js/plugins/datatables/jquery.dataTables.css
        +++ /dev/null
        @@ -1,455 +0,0 @@
        -/*
        - * Table styles
        - */
        -table.dataTable {
        -  width: 100%;
        -  margin: 0 auto;
        -  clear: both;
        -  border-collapse: separate;
        -  border-spacing: 0;
        -  /*
        -   * Header and footer styles
        -   */
        -  /*
        -   * Body styles
        -   */
        -}
        -table.dataTable thead th,
        -table.dataTable tfoot th {
        -  font-weight: bold;
        -}
        -table.dataTable thead th,
        -table.dataTable thead td {
        -  padding: 10px 18px;
        -  border-bottom: 1px solid #111;
        -}
        -table.dataTable thead th:active,
        -table.dataTable thead td:active {
        -  outline: none;
        -}
        -table.dataTable tfoot th,
        -table.dataTable tfoot td {
        -  padding: 10px 18px 6px 18px;
        -  border-top: 1px solid #111;
        -}
        -table.dataTable thead .sorting,
        -table.dataTable thead .sorting_asc,
        -table.dataTable thead .sorting_desc {
        -  cursor: pointer;
        -  *cursor: hand;
        -}
        -table.dataTable thead .sorting,
        -table.dataTable thead .sorting_asc,
        -table.dataTable thead .sorting_desc,
        -table.dataTable thead .sorting_asc_disabled,
        -table.dataTable thead .sorting_desc_disabled {
        -  background-repeat: no-repeat;
        -  background-position: center right;
        -}
        -table.dataTable thead .sorting {
        -  background-image: url("../images/sort_both.png");
        -}
        -table.dataTable thead .sorting_asc {
        -  background-image: url("../images/sort_asc.png");
        -}
        -table.dataTable thead .sorting_desc {
        -  background-image: url("../images/sort_desc.png");
        -}
        -table.dataTable thead .sorting_asc_disabled {
        -  background-image: url("../images/sort_asc_disabled.png");
        -}
        -table.dataTable thead .sorting_desc_disabled {
        -  background-image: url("../images/sort_desc_disabled.png");
        -}
        -table.dataTable tbody tr {
        -  background-color: #ffffff;
        -}
        -table.dataTable tbody tr.selected {
        -  background-color: #B0BED9;
        -}
        -table.dataTable tbody th,
        -table.dataTable tbody td {
        -  padding: 8px 10px;
        -}
        -table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
        -  border-top: 1px solid #ddd;
        -}
        -table.dataTable.row-border tbody tr:first-child th,
        -table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
        -table.dataTable.display tbody tr:first-child td {
        -  border-top: none;
        -}
        -table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
        -  border-top: 1px solid #ddd;
        -  border-right: 1px solid #ddd;
        -}
        -table.dataTable.cell-border tbody tr th:first-child,
        -table.dataTable.cell-border tbody tr td:first-child {
        -  border-left: 1px solid #ddd;
        -}
        -table.dataTable.cell-border tbody tr:first-child th,
        -table.dataTable.cell-border tbody tr:first-child td {
        -  border-top: none;
        -}
        -table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
        -  background-color: #f9f9f9;
        -}
        -table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
        -  background-color: #abb9d3;
        -}
        -table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
        -  background-color: whitesmoke;
        -}
        -table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
        -  background-color: #a9b7d1;
        -}
        -table.dataTable.order-column tbody tr > .sorting_1,
        -table.dataTable.order-column tbody tr > .sorting_2,
        -table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
        -table.dataTable.display tbody tr > .sorting_2,
        -table.dataTable.display tbody tr > .sorting_3 {
        -  background-color: #f9f9f9;
        -}
        -table.dataTable.order-column tbody tr.selected > .sorting_1,
        -table.dataTable.order-column tbody tr.selected > .sorting_2,
        -table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
        -table.dataTable.display tbody tr.selected > .sorting_2,
        -table.dataTable.display tbody tr.selected > .sorting_3 {
        -  background-color: #acbad4;
        -}
        -table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
        -  background-color: #f1f1f1;
        -}
        -table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
        -  background-color: #f3f3f3;
        -}
        -table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
        -  background-color: whitesmoke;
        -}
        -table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
        -  background-color: #a6b3cd;
        -}
        -table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
        -  background-color: #a7b5ce;
        -}
        -table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
        -  background-color: #a9b6d0;
        -}
        -table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
        -  background-color: #f9f9f9;
        -}
        -table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
        -  background-color: #fbfbfb;
        -}
        -table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
        -  background-color: #fdfdfd;
        -}
        -table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
        -  background-color: #acbad4;
        -}
        -table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
        -  background-color: #adbbd6;
        -}
        -table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
        -  background-color: #afbdd8;
        -}
        -table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
        -  background-color: #eaeaea;
        -}
        -table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
        -  background-color: #ebebeb;
        -}
        -table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
        -  background-color: #eeeeee;
        -}
        -table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
        -  background-color: #a1aec7;
        -}
        -table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
        -  background-color: #a2afc8;
        -}
        -table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
        -  background-color: #a4b2cb;
        -}
        -table.dataTable.no-footer {
        -  border-bottom: 1px solid #111;
        -}
        -table.dataTable.nowrap th, table.dataTable.nowrap td {
        -  white-space: nowrap;
        -}
        -table.dataTable.compact thead th,
        -table.dataTable.compact thead td {
        -  padding: 4px 17px 4px 4px;
        -}
        -table.dataTable.compact tfoot th,
        -table.dataTable.compact tfoot td {
        -  padding: 4px;
        -}
        -table.dataTable.compact tbody th,
        -table.dataTable.compact tbody td {
        -  padding: 4px;
        -}
        -table.dataTable th.dt-left,
        -table.dataTable td.dt-left {
        -  text-align: left;
        -}
        -table.dataTable th.dt-center,
        -table.dataTable td.dt-center,
        -table.dataTable td.dataTables_empty {
        -  text-align: center;
        -}
        -table.dataTable th.dt-right,
        -table.dataTable td.dt-right {
        -  text-align: right;
        -}
        -table.dataTable th.dt-justify,
        -table.dataTable td.dt-justify {
        -  text-align: justify;
        -}
        -table.dataTable th.dt-nowrap,
        -table.dataTable td.dt-nowrap {
        -  white-space: nowrap;
        -}
        -table.dataTable thead th.dt-head-left,
        -table.dataTable thead td.dt-head-left,
        -table.dataTable tfoot th.dt-head-left,
        -table.dataTable tfoot td.dt-head-left {
        -  text-align: left;
        -}
        -table.dataTable thead th.dt-head-center,
        -table.dataTable thead td.dt-head-center,
        -table.dataTable tfoot th.dt-head-center,
        -table.dataTable tfoot td.dt-head-center {
        -  text-align: center;
        -}
        -table.dataTable thead th.dt-head-right,
        -table.dataTable thead td.dt-head-right,
        -table.dataTable tfoot th.dt-head-right,
        -table.dataTable tfoot td.dt-head-right {
        -  text-align: right;
        -}
        -table.dataTable thead th.dt-head-justify,
        -table.dataTable thead td.dt-head-justify,
        -table.dataTable tfoot th.dt-head-justify,
        -table.dataTable tfoot td.dt-head-justify {
        -  text-align: justify;
        -}
        -table.dataTable thead th.dt-head-nowrap,
        -table.dataTable thead td.dt-head-nowrap,
        -table.dataTable tfoot th.dt-head-nowrap,
        -table.dataTable tfoot td.dt-head-nowrap {
        -  white-space: nowrap;
        -}
        -table.dataTable tbody th.dt-body-left,
        -table.dataTable tbody td.dt-body-left {
        -  text-align: left;
        -}
        -table.dataTable tbody th.dt-body-center,
        -table.dataTable tbody td.dt-body-center {
        -  text-align: center;
        -}
        -table.dataTable tbody th.dt-body-right,
        -table.dataTable tbody td.dt-body-right {
        -  text-align: right;
        -}
        -table.dataTable tbody th.dt-body-justify,
        -table.dataTable tbody td.dt-body-justify {
        -  text-align: justify;
        -}
        -table.dataTable tbody th.dt-body-nowrap,
        -table.dataTable tbody td.dt-body-nowrap {
        -  white-space: nowrap;
        -}
        -
        -table.dataTable,
        -table.dataTable th,
        -table.dataTable td {
        -  -webkit-box-sizing: content-box;
        -  -moz-box-sizing: content-box;
        -  box-sizing: content-box;
        -}
        -
        -/*
        - * Control feature layout
        - */
        -.dataTables_wrapper {
        -  position: relative;
        -  clear: both;
        -  *zoom: 1;
        -  zoom: 1;
        -}
        -.dataTables_wrapper .dataTables_length {
        -  float: left;
        -}
        -.dataTables_wrapper .dataTables_filter {
        -  float: right;
        -  text-align: right;
        -}
        -.dataTables_wrapper .dataTables_filter input {
        -  margin-left: 0.5em;
        -}
        -.dataTables_wrapper .dataTables_info {
        -  clear: both;
        -  float: left;
        -  padding-top: 0.755em;
        -}
        -.dataTables_wrapper .dataTables_paginate {
        -  float: right;
        -  text-align: right;
        -  padding-top: 0.25em;
        -}
        -.dataTables_wrapper .dataTables_paginate .paginate_button {
        -  box-sizing: border-box;
        -  display: inline-block;
        -  min-width: 1.5em;
        -  padding: 0.5em 1em;
        -  margin-left: 2px;
        -  text-align: center;
        -  text-decoration: none !important;
        -  cursor: pointer;
        -  *cursor: hand;
        -  color: #333 !important;
        -  border: 1px solid transparent;
        -}
        -.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
        -  color: #333 !important;
        -  border: 1px solid #cacaca;
        -  background-color: white;
        -  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
        -  /* Chrome,Safari4+ */
        -  background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
        -  /* Chrome10+,Safari5.1+ */
        -  background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
        -  /* FF3.6+ */
        -  background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
        -  /* IE10+ */
        -  background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
        -  /* Opera 11.10+ */
        -  background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
        -  /* W3C */
        -}
        -.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
        -  cursor: default;
        -  color: #666 !important;
        -  border: 1px solid transparent;
        -  background: transparent;
        -  box-shadow: none;
        -}
        -.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
        -  color: white !important;
        -  border: 1px solid #111;
        -  background-color: #585858;
        -  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
        -  /* Chrome,Safari4+ */
        -  background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
        -  /* Chrome10+,Safari5.1+ */
        -  background: -moz-linear-gradient(top, #585858 0%, #111 100%);
        -  /* FF3.6+ */
        -  background: -ms-linear-gradient(top, #585858 0%, #111 100%);
        -  /* IE10+ */
        -  background: -o-linear-gradient(top, #585858 0%, #111 100%);
        -  /* Opera 11.10+ */
        -  background: linear-gradient(to bottom, #585858 0%, #111 100%);
        -  /* W3C */
        -}
        -.dataTables_wrapper .dataTables_paginate .paginate_button:active {
        -  outline: none;
        -  background-color: #2b2b2b;
        -  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
        -  /* Chrome,Safari4+ */
        -  background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
        -  /* Chrome10+,Safari5.1+ */
        -  background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
        -  /* FF3.6+ */
        -  background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
        -  /* IE10+ */
        -  background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
        -  /* Opera 11.10+ */
        -  background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
        -  /* W3C */
        -  box-shadow: inset 0 0 3px #111;
        -}
        -.dataTables_wrapper .dataTables_paginate .ellipsis {
        -  padding: 0 1em;
        -}
        -.dataTables_wrapper .dataTables_processing {
        -  position: absolute;
        -  top: 50%;
        -  left: 50%;
        -  width: 100%;
        -  height: 40px;
        -  margin-left: -50%;
        -  margin-top: -25px;
        -  padding-top: 20px;
        -  text-align: center;
        -  font-size: 1.2em;
        -  background-color: white;
        -  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
        -  /* Chrome,Safari4+ */
        -  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* Chrome10+,Safari5.1+ */
        -  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* FF3.6+ */
        -  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* IE10+ */
        -  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* Opera 11.10+ */
        -  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* W3C */
        -}
        -.dataTables_wrapper .dataTables_length,
        -.dataTables_wrapper .dataTables_filter,
        -.dataTables_wrapper .dataTables_info,
        -.dataTables_wrapper .dataTables_processing,
        -.dataTables_wrapper .dataTables_paginate {
        -  color: #333;
        -}
        -.dataTables_wrapper .dataTables_scroll {
        -  clear: both;
        -}
        -.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
        -  *margin-top: -1px;
        -  -webkit-overflow-scrolling: touch;
        -}
        -.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
        -.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
        -  height: 0;
        -  overflow: hidden;
        -  margin: 0 !important;
        -  padding: 0 !important;
        -}
        -.dataTables_wrapper.no-footer .dataTables_scrollBody {
        -  border-bottom: 1px solid #111;
        -}
        -.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
        -.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
        -  border-bottom: none;
        -}
        -.dataTables_wrapper:after {
        -  visibility: hidden;
        -  display: block;
        -  content: "";
        -  clear: both;
        -  height: 0;
        -}
        -
        -@media screen and (max-width: 767px) {
        -  .dataTables_wrapper .dataTables_info,
        -  .dataTables_wrapper .dataTables_paginate {
        -    float: none;
        -    text-align: center;
        -  }
        -  .dataTables_wrapper .dataTables_paginate {
        -    margin-top: 0.5em;
        -  }
        -}
        -@media screen and (max-width: 640px) {
        -  .dataTables_wrapper .dataTables_length,
        -  .dataTables_wrapper .dataTables_filter {
        -    float: none;
        -    text-align: center;
        -  }
        -  .dataTables_wrapper .dataTables_filter {
        -    margin-top: 0.5em;
        -  }
        -}
        diff --git a/resources/assets/js/plugins/datatables/jquery.dataTables.js b/resources/assets/js/plugins/datatables/jquery.dataTables.js
        deleted file mode 100755
        index 2a9bdb36e7..0000000000
        --- a/resources/assets/js/plugins/datatables/jquery.dataTables.js
        +++ /dev/null
        @@ -1,14951 +0,0 @@
        -/*! DataTables 1.10.7
        - * ©2008-2014 SpryMedia Ltd - datatables.net/license
        - */
        -
        -/**
        - * @summary     DataTables
        - * @description Paginate, search and order HTML tables
        - * @version     1.10.7
        - * @file        jquery.dataTables.js
        - * @author      SpryMedia Ltd (www.sprymedia.co.uk)
        - * @contact     www.sprymedia.co.uk/contact
        - * @copyright   Copyright 2008-2014 SpryMedia Ltd.
        - *
        - * This source file is free software, available under the following license:
        - *   MIT license - http://datatables.net/license
        - *
        - * This source file is distributed in the hope that it will be useful, but
        - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
        - *
        - * For details please refer to: http://www.datatables.net
        - */
        -
        -/*jslint evil: true, undef: true, browser: true */
        -/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnScrollBarWidth,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
        -
        -(/** @lends <global> */function( window, document, undefined ) {
        -
        -(function( factory ) {
        -	"use strict";
        -
        -	if ( typeof define === 'function' && define.amd ) {
        -		// Define as an AMD module if possible
        -		define( 'datatables', ['jquery'], factory );
        -	}
        -    else if ( typeof exports === 'object' ) {
        -        // Node/CommonJS
        -        module.exports = factory( require( 'jquery' ) );
        -    }
        -	else if ( jQuery && !jQuery.fn.dataTable ) {
        -		// Define using browser globals otherwise
        -		// Prevent multiple instantiations if the script is loaded twice
        -		factory( jQuery );
        -	}
        -}
        -(/** @lends <global> */function( $ ) {
        -	"use strict";
        -
        -	/**
        -	 * DataTables is a plug-in for the jQuery Javascript library. It is a highly
        -	 * flexible tool, based upon the foundations of progressive enhancement,
        -	 * which will add advanced interaction controls to any HTML table. For a
        -	 * full list of features please refer to
        -	 * [DataTables.net](href="http://datatables.net).
        -	 *
        -	 * Note that the `DataTable` object is not a global variable but is aliased
        -	 * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
        -	 * be  accessed.
        -	 *
        -	 *  @class
        -	 *  @param {object} [init={}] Configuration object for DataTables. Options
        -	 *    are defined by {@link DataTable.defaults}
        -	 *  @requires jQuery 1.7+
        -	 *
        -	 *  @example
        -	 *    // Basic initialisation
        -	 *    $(document).ready( function {
        -	 *      $('#example').dataTable();
        -	 *    } );
        -	 *
        -	 *  @example
        -	 *    // Initialisation with configuration options - in this case, disable
        -	 *    // pagination and sorting.
        -	 *    $(document).ready( function {
        -	 *      $('#example').dataTable( {
        -	 *        "paginate": false,
        -	 *        "sort": false
        -	 *      } );
        -	 *    } );
        -	 */
        -	var DataTable;
        -
        -	
        -	/*
        -	 * It is useful to have variables which are scoped locally so only the
        -	 * DataTables functions can access them and they don't leak into global space.
        -	 * At the same time these functions are often useful over multiple files in the
        -	 * core and API, so we list, or at least document, all variables which are used
        -	 * by DataTables as private variables here. This also ensures that there is no
        -	 * clashing of variable names and that they can easily referenced for reuse.
        -	 */
        -	
        -	
        -	// Defined else where
        -	//  _selector_run
        -	//  _selector_opts
        -	//  _selector_first
        -	//  _selector_row_indexes
        -	
        -	var _ext; // DataTable.ext
        -	var _Api; // DataTable.Api
        -	var _api_register; // DataTable.Api.register
        -	var _api_registerPlural; // DataTable.Api.registerPlural
        -	
        -	var _re_dic = {};
        -	var _re_new_lines = /[\r\n]/g;
        -	var _re_html = /<.*?>/g;
        -	var _re_date_start = /^[\w\+\-]/;
        -	var _re_date_end = /[\w\+\-]$/;
        -	
        -	// Escape regular expression special characters
        -	var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
        -	
        -	// http://en.wikipedia.org/wiki/Foreign_exchange_market
        -	// - \u20BD - Russian ruble.
        -	// - \u20a9 - South Korean Won
        -	// - \u20BA - Turkish Lira
        -	// - \u20B9 - Indian Rupee
        -	// - R - Brazil (R$) and South Africa
        -	// - fr - Swiss Franc
        -	// - kr - Swedish krona, Norwegian krone and Danish krone
        -	// - \u2009 is thin space and \u202F is narrow no-break space, both used in many
        -	//   standards as thousands separators.
        -	var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
        -	
        -	
        -	var _empty = function ( d ) {
        -		return !d || d === true || d === '-' ? true : false;
        -	};
        -	
        -	
        -	var _intVal = function ( s ) {
        -		var integer = parseInt( s, 10 );
        -		return !isNaN(integer) && isFinite(s) ? integer : null;
        -	};
        -	
        -	// Convert from a formatted number with characters other than `.` as the
        -	// decimal place, to a Javascript number
        -	var _numToDecimal = function ( num, decimalPoint ) {
        -		// Cache created regular expressions for speed as this function is called often
        -		if ( ! _re_dic[ decimalPoint ] ) {
        -			_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
        -		}
        -		return typeof num === 'string' && decimalPoint !== '.' ?
        -			num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
        -			num;
        -	};
        -	
        -	
        -	var _isNumber = function ( d, decimalPoint, formatted ) {
        -		var strType = typeof d === 'string';
        -	
        -		// If empty return immediately so there must be a number if it is a
        -		// formatted string (this stops the string "k", or "kr", etc being detected
        -		// as a formatted number for currency
        -		if ( _empty( d ) ) {
        -			return true;
        -		}
        -	
        -		if ( decimalPoint && strType ) {
        -			d = _numToDecimal( d, decimalPoint );
        -		}
        -	
        -		if ( formatted && strType ) {
        -			d = d.replace( _re_formatted_numeric, '' );
        -		}
        -	
        -		return !isNaN( parseFloat(d) ) && isFinite( d );
        -	};
        -	
        -	
        -	// A string without HTML in it can be considered to be HTML still
        -	var _isHtml = function ( d ) {
        -		return _empty( d ) || typeof d === 'string';
        -	};
        -	
        -	
        -	var _htmlNumeric = function ( d, decimalPoint, formatted ) {
        -		if ( _empty( d ) ) {
        -			return true;
        -		}
        -	
        -		var html = _isHtml( d );
        -		return ! html ?
        -			null :
        -			_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
        -				true :
        -				null;
        -	};
        -	
        -	
        -	var _pluck = function ( a, prop, prop2 ) {
        -		var out = [];
        -		var i=0, ien=a.length;
        -	
        -		// Could have the test in the loop for slightly smaller code, but speed
        -		// is essential here
        -		if ( prop2 !== undefined ) {
        -			for ( ; i<ien ; i++ ) {
        -				if ( a[i] && a[i][ prop ] ) {
        -					out.push( a[i][ prop ][ prop2 ] );
        -				}
        -			}
        -		}
        -		else {
        -			for ( ; i<ien ; i++ ) {
        -				if ( a[i] ) {
        -					out.push( a[i][ prop ] );
        -				}
        -			}
        -		}
        -	
        -		return out;
        -	};
        -	
        -	
        -	// Basically the same as _pluck, but rather than looping over `a` we use `order`
        -	// as the indexes to pick from `a`
        -	var _pluck_order = function ( a, order, prop, prop2 )
        -	{
        -		var out = [];
        -		var i=0, ien=order.length;
        -	
        -		// Could have the test in the loop for slightly smaller code, but speed
        -		// is essential here
        -		if ( prop2 !== undefined ) {
        -			for ( ; i<ien ; i++ ) {
        -				if ( a[ order[i] ][ prop ] ) {
        -					out.push( a[ order[i] ][ prop ][ prop2 ] );
        -				}
        -			}
        -		}
        -		else {
        -			for ( ; i<ien ; i++ ) {
        -				out.push( a[ order[i] ][ prop ] );
        -			}
        -		}
        -	
        -		return out;
        -	};
        -	
        -	
        -	var _range = function ( len, start )
        -	{
        -		var out = [];
        -		var end;
        -	
        -		if ( start === undefined ) {
        -			start = 0;
        -			end = len;
        -		}
        -		else {
        -			end = start;
        -			start = len;
        -		}
        -	
        -		for ( var i=start ; i<end ; i++ ) {
        -			out.push( i );
        -		}
        -	
        -		return out;
        -	};
        -	
        -	
        -	var _removeEmpty = function ( a )
        -	{
        -		var out = [];
        -	
        -		for ( var i=0, ien=a.length ; i<ien ; i++ ) {
        -			if ( a[i] ) { // careful - will remove all falsy values!
        -				out.push( a[i] );
        -			}
        -		}
        -	
        -		return out;
        -	};
        -	
        -	
        -	var _stripHtml = function ( d ) {
        -		return d.replace( _re_html, '' );
        -	};
        -	
        -	
        -	/**
        -	 * Find the unique elements in a source array.
        -	 *
        -	 * @param  {array} src Source array
        -	 * @return {array} Array of unique items
        -	 * @ignore
        -	 */
        -	var _unique = function ( src )
        -	{
        -		// A faster unique method is to use object keys to identify used values,
        -		// but this doesn't work with arrays or objects, which we must also
        -		// consider. See jsperf.com/compare-array-unique-versions/4 for more
        -		// information.
        -		var
        -			out = [],
        -			val,
        -			i, ien=src.length,
        -			j, k=0;
        -	
        -		again: for ( i=0 ; i<ien ; i++ ) {
        -			val = src[i];
        -	
        -			for ( j=0 ; j<k ; j++ ) {
        -				if ( out[j] === val ) {
        -					continue again;
        -				}
        -			}
        -	
        -			out.push( val );
        -			k++;
        -		}
        -	
        -		return out;
        -	};
        -	
        -	
        -	
        -	/**
        -	 * Create a mapping object that allows camel case parameters to be looked up
        -	 * for their Hungarian counterparts. The mapping is stored in a private
        -	 * parameter called `_hungarianMap` which can be accessed on the source object.
        -	 *  @param {object} o
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnHungarianMap ( o )
        -	{
        -		var
        -			hungarian = 'a aa ai ao as b fn i m o s ',
        -			match,
        -			newKey,
        -			map = {};
        -	
        -		$.each( o, function (key, val) {
        -			match = key.match(/^([^A-Z]+?)([A-Z])/);
        -	
        -			if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
        -			{
        -				newKey = key.replace( match[0], match[2].toLowerCase() );
        -				map[ newKey ] = key;
        -	
        -				if ( match[1] === 'o' )
        -				{
        -					_fnHungarianMap( o[key] );
        -				}
        -			}
        -		} );
        -	
        -		o._hungarianMap = map;
        -	}
        -	
        -	
        -	/**
        -	 * Convert from camel case parameters to Hungarian, based on a Hungarian map
        -	 * created by _fnHungarianMap.
        -	 *  @param {object} src The model object which holds all parameters that can be
        -	 *    mapped.
        -	 *  @param {object} user The object to convert from camel case to Hungarian.
        -	 *  @param {boolean} force When set to `true`, properties which already have a
        -	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
        -	 *    won't be.
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnCamelToHungarian ( src, user, force )
        -	{
        -		if ( ! src._hungarianMap ) {
        -			_fnHungarianMap( src );
        -		}
        -	
        -		var hungarianKey;
        -	
        -		$.each( user, function (key, val) {
        -			hungarianKey = src._hungarianMap[ key ];
        -	
        -			if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
        -			{
        -				// For objects, we need to buzz down into the object to copy parameters
        -				if ( hungarianKey.charAt(0) === 'o' )
        -				{
        -					// Copy the camelCase options over to the hungarian
        -					if ( ! user[ hungarianKey ] ) {
        -						user[ hungarianKey ] = {};
        -					}
        -					$.extend( true, user[hungarianKey], user[key] );
        -	
        -					_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
        -				}
        -				else {
        -					user[hungarianKey] = user[ key ];
        -				}
        -			}
        -		} );
        -	}
        -	
        -	
        -	/**
        -	 * Language compatibility - when certain options are given, and others aren't, we
        -	 * need to duplicate the values over, in order to provide backwards compatibility
        -	 * with older language files.
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnLanguageCompat( lang )
        -	{
        -		var defaults = DataTable.defaults.oLanguage;
        -		var zeroRecords = lang.sZeroRecords;
        -	
        -		/* Backwards compatibility - if there is no sEmptyTable given, then use the same as
        -		 * sZeroRecords - assuming that is given.
        -		 */
        -		if ( ! lang.sEmptyTable && zeroRecords &&
        -			defaults.sEmptyTable === "No data available in table" )
        -		{
        -			_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
        -		}
        -	
        -		/* Likewise with loading records */
        -		if ( ! lang.sLoadingRecords && zeroRecords &&
        -			defaults.sLoadingRecords === "Loading..." )
        -		{
        -			_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
        -		}
        -	
        -		// Old parameter name of the thousands separator mapped onto the new
        -		if ( lang.sInfoThousands ) {
        -			lang.sThousands = lang.sInfoThousands;
        -		}
        -	
        -		var decimal = lang.sDecimal;
        -		if ( decimal ) {
        -			_addNumericSort( decimal );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Map one parameter onto another
        -	 *  @param {object} o Object to map
        -	 *  @param {*} knew The new parameter name
        -	 *  @param {*} old The old parameter name
        -	 */
        -	var _fnCompatMap = function ( o, knew, old ) {
        -		if ( o[ knew ] !== undefined ) {
        -			o[ old ] = o[ knew ];
        -		}
        -	};
        -	
        -	
        -	/**
        -	 * Provide backwards compatibility for the main DT options. Note that the new
        -	 * options are mapped onto the old parameters, so this is an external interface
        -	 * change only.
        -	 *  @param {object} init Object to map
        -	 */
        -	function _fnCompatOpts ( init )
        -	{
        -		_fnCompatMap( init, 'ordering',      'bSort' );
        -		_fnCompatMap( init, 'orderMulti',    'bSortMulti' );
        -		_fnCompatMap( init, 'orderClasses',  'bSortClasses' );
        -		_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
        -		_fnCompatMap( init, 'order',         'aaSorting' );
        -		_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );
        -		_fnCompatMap( init, 'paging',        'bPaginate' );
        -		_fnCompatMap( init, 'pagingType',    'sPaginationType' );
        -		_fnCompatMap( init, 'pageLength',    'iDisplayLength' );
        -		_fnCompatMap( init, 'searching',     'bFilter' );
        -	
        -		// Column search objects are in an array, so it needs to be converted
        -		// element by element
        -		var searchCols = init.aoSearchCols;
        -	
        -		if ( searchCols ) {
        -			for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
        -				if ( searchCols[i] ) {
        -					_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
        -				}
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Provide backwards compatibility for column options. Note that the new options
        -	 * are mapped onto the old parameters, so this is an external interface change
        -	 * only.
        -	 *  @param {object} init Object to map
        -	 */
        -	function _fnCompatCols ( init )
        -	{
        -		_fnCompatMap( init, 'orderable',     'bSortable' );
        -		_fnCompatMap( init, 'orderData',     'aDataSort' );
        -		_fnCompatMap( init, 'orderSequence', 'asSorting' );
        -		_fnCompatMap( init, 'orderDataType', 'sortDataType' );
        -	
        -		// orderData can be given as an integer
        -		var dataSort = init.aDataSort;
        -		if ( dataSort && ! $.isArray( dataSort ) ) {
        -			init.aDataSort = [ dataSort ];
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Browser feature detection for capabilities, quirks
        -	 *  @param {object} settings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnBrowserDetect( settings )
        -	{
        -		var browser = settings.oBrowser;
        -	
        -		// Scrolling feature / quirks detection
        -		var n = $('<div/>')
        -			.css( {
        -				position: 'absolute',
        -				top: 0,
        -				left: 0,
        -				height: 1,
        -				width: 1,
        -				overflow: 'hidden'
        -			} )
        -			.append(
        -				$('<div/>')
        -					.css( {
        -						position: 'absolute',
        -						top: 1,
        -						left: 1,
        -						width: 100,
        -						overflow: 'scroll'
        -					} )
        -					.append(
        -						$('<div class="test"/>')
        -							.css( {
        -								width: '100%',
        -								height: 10
        -							} )
        -					)
        -			)
        -			.appendTo( 'body' );
        -	
        -		var test = n.find('.test');
        -	
        -		// IE6/7 will oversize a width 100% element inside a scrolling element, to
        -		// include the width of the scrollbar, while other browsers ensure the inner
        -		// element is contained without forcing scrolling
        -		browser.bScrollOversize = test[0].offsetWidth === 100;
        -	
        -		// In rtl text layout, some browsers (most, but not all) will place the
        -		// scrollbar on the left, rather than the right.
        -		browser.bScrollbarLeft = Math.round( test.offset().left ) !== 1;
        -	
        -		n.remove();
        -	}
        -	
        -	
        -	/**
        -	 * Array.prototype reduce[Right] method, used for browsers which don't support
        -	 * JS 1.6. Done this way to reduce code size, since we iterate either way
        -	 *  @param {object} settings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnReduce ( that, fn, init, start, end, inc )
        -	{
        -		var
        -			i = start,
        -			value,
        -			isSet = false;
        -	
        -		if ( init !== undefined ) {
        -			value = init;
        -			isSet = true;
        -		}
        -	
        -		while ( i !== end ) {
        -			if ( ! that.hasOwnProperty(i) ) {
        -				continue;
        -			}
        -	
        -			value = isSet ?
        -				fn( value, that[i], i, that ) :
        -				that[i];
        -	
        -			isSet = true;
        -			i += inc;
        -		}
        -	
        -		return value;
        -	}
        -	
        -	/**
        -	 * Add a column to the list used for the table with default values
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {node} nTh The th element for this column
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAddColumn( oSettings, nTh )
        -	{
        -		// Add column to aoColumns array
        -		var oDefaults = DataTable.defaults.column;
        -		var iCol = oSettings.aoColumns.length;
        -		var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
        -			"nTh": nTh ? nTh : document.createElement('th'),
        -			"sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
        -			"aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
        -			"mData": oDefaults.mData ? oDefaults.mData : iCol,
        -			idx: iCol
        -		} );
        -		oSettings.aoColumns.push( oCol );
        -	
        -		// Add search object for column specific search. Note that the `searchCols[ iCol ]`
        -		// passed into extend can be undefined. This allows the user to give a default
        -		// with only some of the parameters defined, and also not give a default
        -		var searchCols = oSettings.aoPreSearchCols;
        -		searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
        -	
        -		// Use the default column options function to initialise classes etc
        -		_fnColumnOptions( oSettings, iCol, $(nTh).data() );
        -	}
        -	
        -	
        -	/**
        -	 * Apply options for a column
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {int} iCol column index to consider
        -	 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnColumnOptions( oSettings, iCol, oOptions )
        -	{
        -		var oCol = oSettings.aoColumns[ iCol ];
        -		var oClasses = oSettings.oClasses;
        -		var th = $(oCol.nTh);
        -	
        -		// Try to get width information from the DOM. We can't get it from CSS
        -		// as we'd need to parse the CSS stylesheet. `width` option can override
        -		if ( ! oCol.sWidthOrig ) {
        -			// Width attribute
        -			oCol.sWidthOrig = th.attr('width') || null;
        -	
        -			// Style attribute
        -			var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
        -			if ( t ) {
        -				oCol.sWidthOrig = t[1];
        -			}
        -		}
        -	
        -		/* User specified column options */
        -		if ( oOptions !== undefined && oOptions !== null )
        -		{
        -			// Backwards compatibility
        -			_fnCompatCols( oOptions );
        -	
        -			// Map camel case parameters to their Hungarian counterparts
        -			_fnCamelToHungarian( DataTable.defaults.column, oOptions );
        -	
        -			/* Backwards compatibility for mDataProp */
        -			if ( oOptions.mDataProp !== undefined && !oOptions.mData )
        -			{
        -				oOptions.mData = oOptions.mDataProp;
        -			}
        -	
        -			if ( oOptions.sType )
        -			{
        -				oCol._sManualType = oOptions.sType;
        -			}
        -	
        -			// `class` is a reserved word in Javascript, so we need to provide
        -			// the ability to use a valid name for the camel case input
        -			if ( oOptions.className && ! oOptions.sClass )
        -			{
        -				oOptions.sClass = oOptions.className;
        -			}
        -	
        -			$.extend( oCol, oOptions );
        -			_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
        -	
        -			/* iDataSort to be applied (backwards compatibility), but aDataSort will take
        -			 * priority if defined
        -			 */
        -			if ( oOptions.iDataSort !== undefined )
        -			{
        -				oCol.aDataSort = [ oOptions.iDataSort ];
        -			}
        -			_fnMap( oCol, oOptions, "aDataSort" );
        -		}
        -	
        -		/* Cache the data get and set functions for speed */
        -		var mDataSrc = oCol.mData;
        -		var mData = _fnGetObjectDataFn( mDataSrc );
        -		var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
        -	
        -		var attrTest = function( src ) {
        -			return typeof src === 'string' && src.indexOf('@') !== -1;
        -		};
        -		oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
        -			attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
        -		);
        -	
        -		oCol.fnGetData = function (rowData, type, meta) {
        -			var innerData = mData( rowData, type, undefined, meta );
        -	
        -			return mRender && type ?
        -				mRender( innerData, type, rowData, meta ) :
        -				innerData;
        -		};
        -		oCol.fnSetData = function ( rowData, val, meta ) {
        -			return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
        -		};
        -	
        -		// Indicate if DataTables should read DOM data as an object or array
        -		// Used in _fnGetRowElements
        -		if ( typeof mDataSrc !== 'number' ) {
        -			oSettings._rowReadObject = true;
        -		}
        -	
        -		/* Feature sorting overrides column specific when off */
        -		if ( !oSettings.oFeatures.bSort )
        -		{
        -			oCol.bSortable = false;
        -			th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
        -		}
        -	
        -		/* Check that the class assignment is correct for sorting */
        -		var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
        -		var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
        -		if ( !oCol.bSortable || (!bAsc && !bDesc) )
        -		{
        -			oCol.sSortingClass = oClasses.sSortableNone;
        -			oCol.sSortingClassJUI = "";
        -		}
        -		else if ( bAsc && !bDesc )
        -		{
        -			oCol.sSortingClass = oClasses.sSortableAsc;
        -			oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
        -		}
        -		else if ( !bAsc && bDesc )
        -		{
        -			oCol.sSortingClass = oClasses.sSortableDesc;
        -			oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
        -		}
        -		else
        -		{
        -			oCol.sSortingClass = oClasses.sSortable;
        -			oCol.sSortingClassJUI = oClasses.sSortJUI;
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Adjust the table column widths for new data. Note: you would probably want to
        -	 * do a redraw after calling this function!
        -	 *  @param {object} settings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAdjustColumnSizing ( settings )
        -	{
        -		/* Not interested in doing column width calculation if auto-width is disabled */
        -		if ( settings.oFeatures.bAutoWidth !== false )
        -		{
        -			var columns = settings.aoColumns;
        -	
        -			_fnCalculateColumnWidths( settings );
        -			for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
        -			{
        -				columns[i].nTh.style.width = columns[i].sWidth;
        -			}
        -		}
        -	
        -		var scroll = settings.oScroll;
        -		if ( scroll.sY !== '' || scroll.sX !== '')
        -		{
        -			_fnScrollDraw( settings );
        -		}
        -	
        -		_fnCallbackFire( settings, null, 'column-sizing', [settings] );
        -	}
        -	
        -	
        -	/**
        -	 * Covert the index of a visible column to the index in the data array (take account
        -	 * of hidden columns)
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {int} iMatch Visible column index to lookup
        -	 *  @returns {int} i the data index
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnVisibleToColumnIndex( oSettings, iMatch )
        -	{
        -		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
        -	
        -		return typeof aiVis[iMatch] === 'number' ?
        -			aiVis[iMatch] :
        -			null;
        -	}
        -	
        -	
        -	/**
        -	 * Covert the index of an index in the data array and convert it to the visible
        -	 *   column index (take account of hidden columns)
        -	 *  @param {int} iMatch Column index to lookup
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @returns {int} i the data index
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnColumnIndexToVisible( oSettings, iMatch )
        -	{
        -		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
        -		var iPos = $.inArray( iMatch, aiVis );
        -	
        -		return iPos !== -1 ? iPos : null;
        -	}
        -	
        -	
        -	/**
        -	 * Get the number of visible columns
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @returns {int} i the number of visible columns
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnVisbleColumns( oSettings )
        -	{
        -		return _fnGetColumns( oSettings, 'bVisible' ).length;
        -	}
        -	
        -	
        -	/**
        -	 * Get an array of column indexes that match a given property
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {string} sParam Parameter in aoColumns to look for - typically
        -	 *    bVisible or bSearchable
        -	 *  @returns {array} Array of indexes with matched properties
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnGetColumns( oSettings, sParam )
        -	{
        -		var a = [];
        -	
        -		$.map( oSettings.aoColumns, function(val, i) {
        -			if ( val[sParam] ) {
        -				a.push( i );
        -			}
        -		} );
        -	
        -		return a;
        -	}
        -	
        -	
        -	/**
        -	 * Calculate the 'type' of a column
        -	 *  @param {object} settings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnColumnTypes ( settings )
        -	{
        -		var columns = settings.aoColumns;
        -		var data = settings.aoData;
        -		var types = DataTable.ext.type.detect;
        -		var i, ien, j, jen, k, ken;
        -		var col, cell, detectedType, cache;
        -	
        -		// For each column, spin over the 
        -		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
        -			col = columns[i];
        -			cache = [];
        -	
        -			if ( ! col.sType && col._sManualType ) {
        -				col.sType = col._sManualType;
        -			}
        -			else if ( ! col.sType ) {
        -				for ( j=0, jen=types.length ; j<jen ; j++ ) {
        -					for ( k=0, ken=data.length ; k<ken ; k++ ) {
        -						// Use a cache array so we only need to get the type data
        -						// from the formatter once (when using multiple detectors)
        -						if ( cache[k] === undefined ) {
        -							cache[k] = _fnGetCellData( settings, k, i, 'type' );
        -						}
        -	
        -						detectedType = types[j]( cache[k], settings );
        -	
        -						// If null, then this type can't apply to this column, so
        -						// rather than testing all cells, break out. There is an
        -						// exception for the last type which is `html`. We need to
        -						// scan all rows since it is possible to mix string and HTML
        -						// types
        -						if ( ! detectedType && j !== types.length-1 ) {
        -							break;
        -						}
        -	
        -						// Only a single match is needed for html type since it is
        -						// bottom of the pile and very similar to string
        -						if ( detectedType === 'html' ) {
        -							break;
        -						}
        -					}
        -	
        -					// Type is valid for all data points in the column - use this
        -					// type
        -					if ( detectedType ) {
        -						col.sType = detectedType;
        -						break;
        -					}
        -				}
        -	
        -				// Fall back - if no type was detected, always use string
        -				if ( ! col.sType ) {
        -					col.sType = 'string';
        -				}
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Take the column definitions and static columns arrays and calculate how
        -	 * they relate to column indexes. The callback function will then apply the
        -	 * definition found for a column to a suitable configuration object.
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
        -	 *  @param {array} aoCols The aoColumns array that defines columns individually
        -	 *  @param {function} fn Callback function - takes two parameters, the calculated
        -	 *    column index and the definition for that column.
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
        -	{
        -		var i, iLen, j, jLen, k, kLen, def;
        -		var columns = oSettings.aoColumns;
        -	
        -		// Column definitions with aTargets
        -		if ( aoColDefs )
        -		{
        -			/* Loop over the definitions array - loop in reverse so first instance has priority */
        -			for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
        -			{
        -				def = aoColDefs[i];
        -	
        -				/* Each definition can target multiple columns, as it is an array */
        -				var aTargets = def.targets !== undefined ?
        -					def.targets :
        -					def.aTargets;
        -	
        -				if ( ! $.isArray( aTargets ) )
        -				{
        -					aTargets = [ aTargets ];
        -				}
        -	
        -				for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
        -				{
        -					if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
        -					{
        -						/* Add columns that we don't yet know about */
        -						while( columns.length <= aTargets[j] )
        -						{
        -							_fnAddColumn( oSettings );
        -						}
        -	
        -						/* Integer, basic index */
        -						fn( aTargets[j], def );
        -					}
        -					else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
        -					{
        -						/* Negative integer, right to left column counting */
        -						fn( columns.length+aTargets[j], def );
        -					}
        -					else if ( typeof aTargets[j] === 'string' )
        -					{
        -						/* Class name matching on TH element */
        -						for ( k=0, kLen=columns.length ; k<kLen ; k++ )
        -						{
        -							if ( aTargets[j] == "_all" ||
        -							     $(columns[k].nTh).hasClass( aTargets[j] ) )
        -							{
        -								fn( k, def );
        -							}
        -						}
        -					}
        -				}
        -			}
        -		}
        -	
        -		// Statically defined columns array
        -		if ( aoCols )
        -		{
        -			for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
        -			{
        -				fn( i, aoCols[i] );
        -			}
        -		}
        -	}
        -	
        -	/**
        -	 * Add a data array to the table, creating DOM node etc. This is the parallel to
        -	 * _fnGatherData, but for adding rows from a Javascript source, rather than a
        -	 * DOM source.
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {array} aData data array to be added
        -	 *  @param {node} [nTr] TR element to add to the table - optional. If not given,
        -	 *    DataTables will create a row automatically
        -	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
        -	 *    if nTr is.
        -	 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAddData ( oSettings, aDataIn, nTr, anTds )
        -	{
        -		/* Create the object for storing information about this new row */
        -		var iRow = oSettings.aoData.length;
        -		var oData = $.extend( true, {}, DataTable.models.oRow, {
        -			src: nTr ? 'dom' : 'data'
        -		} );
        -	
        -		oData._aData = aDataIn;
        -		oSettings.aoData.push( oData );
        -	
        -		/* Create the cells */
        -		var nTd, sThisType;
        -		var columns = oSettings.aoColumns;
        -		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
        -		{
        -			// When working with a row, the data source object must be populated. In
        -			// all other cases, the data source object is already populated, so we
        -			// don't overwrite it, which might break bindings etc
        -			if ( nTr ) {
        -				_fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
        -			}
        -			columns[i].sType = null;
        -		}
        -	
        -		/* Add to the display array */
        -		oSettings.aiDisplayMaster.push( iRow );
        -	
        -		/* Create the DOM information, or register it if already present */
        -		if ( nTr || ! oSettings.oFeatures.bDeferRender )
        -		{
        -			_fnCreateTr( oSettings, iRow, nTr, anTds );
        -		}
        -	
        -		return iRow;
        -	}
        -	
        -	
        -	/**
        -	 * Add one or more TR elements to the table. Generally we'd expect to
        -	 * use this for reading data from a DOM sourced table, but it could be
        -	 * used for an TR element. Note that if a TR is given, it is used (i.e.
        -	 * it is not cloned).
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {array|node|jQuery} trs The TR element(s) to add to the table
        -	 *  @returns {array} Array of indexes for the added rows
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAddTr( settings, trs )
        -	{
        -		var row;
        -	
        -		// Allow an individual node to be passed in
        -		if ( ! (trs instanceof $) ) {
        -			trs = $(trs);
        -		}
        -	
        -		return trs.map( function (i, el) {
        -			row = _fnGetRowElements( settings, el );
        -			return _fnAddData( settings, row.data, el, row.cells );
        -		} );
        -	}
        -	
        -	
        -	/**
        -	 * Take a TR element and convert it to an index in aoData
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {node} n the TR element to find
        -	 *  @returns {int} index if the node is found, null if not
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnNodeToDataIndex( oSettings, n )
        -	{
        -		return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
        -	}
        -	
        -	
        -	/**
        -	 * Take a TD element and convert it into a column data index (not the visible index)
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {int} iRow The row number the TD/TH can be found in
        -	 *  @param {node} n The TD/TH element to find
        -	 *  @returns {int} index if the node is found, -1 if not
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnNodeToColumnIndex( oSettings, iRow, n )
        -	{
        -		return $.inArray( n, oSettings.aoData[ iRow ].anCells );
        -	}
        -	
        -	
        -	/**
        -	 * Get the data for a given cell from the internal cache, taking into account data mapping
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {int} rowIdx aoData row id
        -	 *  @param {int} colIdx Column index
        -	 *  @param {string} type data get type ('display', 'type' 'filter' 'sort')
        -	 *  @returns {*} Cell data
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnGetCellData( settings, rowIdx, colIdx, type )
        -	{
        -		var draw           = settings.iDraw;
        -		var col            = settings.aoColumns[colIdx];
        -		var rowData        = settings.aoData[rowIdx]._aData;
        -		var defaultContent = col.sDefaultContent;
        -		var cellData       = col.fnGetData( rowData, type, {
        -			settings: settings,
        -			row:      rowIdx,
        -			col:      colIdx
        -		} );
        -	
        -		if ( cellData === undefined ) {
        -			if ( settings.iDrawError != draw && defaultContent === null ) {
        -				_fnLog( settings, 0, "Requested unknown parameter "+
        -					(typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
        -					" for row "+rowIdx, 4 );
        -				settings.iDrawError = draw;
        -			}
        -			return defaultContent;
        -		}
        -	
        -		/* When the data source is null, we can use default column data */
        -		if ( (cellData === rowData || cellData === null) && defaultContent !== null ) {
        -			cellData = defaultContent;
        -		}
        -		else if ( typeof cellData === 'function' ) {
        -			// If the data source is a function, then we run it and use the return,
        -			// executing in the scope of the data object (for instances)
        -			return cellData.call( rowData );
        -		}
        -	
        -		if ( cellData === null && type == 'display' ) {
        -			return '';
        -		}
        -		return cellData;
        -	}
        -	
        -	
        -	/**
        -	 * Set the value for a specific cell, into the internal data cache
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {int} rowIdx aoData row id
        -	 *  @param {int} colIdx Column index
        -	 *  @param {*} val Value to set
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSetCellData( settings, rowIdx, colIdx, val )
        -	{
        -		var col     = settings.aoColumns[colIdx];
        -		var rowData = settings.aoData[rowIdx]._aData;
        -	
        -		col.fnSetData( rowData, val, {
        -			settings: settings,
        -			row:      rowIdx,
        -			col:      colIdx
        -		}  );
        -	}
        -	
        -	
        -	// Private variable that is used to match action syntax in the data property object
        -	var __reArray = /\[.*?\]$/;
        -	var __reFn = /\(\)$/;
        -	
        -	/**
        -	 * Split string on periods, taking into account escaped periods
        -	 * @param  {string} str String to split
        -	 * @return {array} Split string
        -	 */
        -	function _fnSplitObjNotation( str )
        -	{
        -		return $.map( str.match(/(\\.|[^\.])+/g), function ( s ) {
        -			return s.replace(/\\./g, '.');
        -		} );
        -	}
        -	
        -	
        -	/**
        -	 * Return a function that can be used to get data from a source object, taking
        -	 * into account the ability to use nested objects as a source
        -	 *  @param {string|int|function} mSource The data source for the object
        -	 *  @returns {function} Data get function
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnGetObjectDataFn( mSource )
        -	{
        -		if ( $.isPlainObject( mSource ) )
        -		{
        -			/* Build an object of get functions, and wrap them in a single call */
        -			var o = {};
        -			$.each( mSource, function (key, val) {
        -				if ( val ) {
        -					o[key] = _fnGetObjectDataFn( val );
        -				}
        -			} );
        -	
        -			return function (data, type, row, meta) {
        -				var t = o[type] || o._;
        -				return t !== undefined ?
        -					t(data, type, row, meta) :
        -					data;
        -			};
        -		}
        -		else if ( mSource === null )
        -		{
        -			/* Give an empty string for rendering / sorting etc */
        -			return function (data) { // type, row and meta also passed, but not used
        -				return data;
        -			};
        -		}
        -		else if ( typeof mSource === 'function' )
        -		{
        -			return function (data, type, row, meta) {
        -				return mSource( data, type, row, meta );
        -			};
        -		}
        -		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
        -			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
        -		{
        -			/* If there is a . in the source string then the data source is in a
        -			 * nested object so we loop over the data for each level to get the next
        -			 * level down. On each loop we test for undefined, and if found immediately
        -			 * return. This allows entire objects to be missing and sDefaultContent to
        -			 * be used if defined, rather than throwing an error
        -			 */
        -			var fetchData = function (data, type, src) {
        -				var arrayNotation, funcNotation, out, innerSrc;
        -	
        -				if ( src !== "" )
        -				{
        -					var a = _fnSplitObjNotation( src );
        -	
        -					for ( var i=0, iLen=a.length ; i<iLen ; i++ )
        -					{
        -						// Check if we are dealing with special notation
        -						arrayNotation = a[i].match(__reArray);
        -						funcNotation = a[i].match(__reFn);
        -	
        -						if ( arrayNotation )
        -						{
        -							// Array notation
        -							a[i] = a[i].replace(__reArray, '');
        -	
        -							// Condition allows simply [] to be passed in
        -							if ( a[i] !== "" ) {
        -								data = data[ a[i] ];
        -							}
        -							out = [];
        -	
        -							// Get the remainder of the nested object to get
        -							a.splice( 0, i+1 );
        -							innerSrc = a.join('.');
        -	
        -							// Traverse each entry in the array getting the properties requested
        -							for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
        -								out.push( fetchData( data[j], type, innerSrc ) );
        -							}
        -	
        -							// If a string is given in between the array notation indicators, that
        -							// is used to join the strings together, otherwise an array is returned
        -							var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
        -							data = (join==="") ? out : out.join(join);
        -	
        -							// The inner call to fetchData has already traversed through the remainder
        -							// of the source requested, so we exit from the loop
        -							break;
        -						}
        -						else if ( funcNotation )
        -						{
        -							// Function call
        -							a[i] = a[i].replace(__reFn, '');
        -							data = data[ a[i] ]();
        -							continue;
        -						}
        -	
        -						if ( data === null || data[ a[i] ] === undefined )
        -						{
        -							return undefined;
        -						}
        -						data = data[ a[i] ];
        -					}
        -				}
        -	
        -				return data;
        -			};
        -	
        -			return function (data, type) { // row and meta also passed, but not used
        -				return fetchData( data, type, mSource );
        -			};
        -		}
        -		else
        -		{
        -			/* Array or flat object mapping */
        -			return function (data, type) { // row and meta also passed, but not used
        -				return data[mSource];
        -			};
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Return a function that can be used to set data from a source object, taking
        -	 * into account the ability to use nested objects as a source
        -	 *  @param {string|int|function} mSource The data source for the object
        -	 *  @returns {function} Data set function
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSetObjectDataFn( mSource )
        -	{
        -		if ( $.isPlainObject( mSource ) )
        -		{
        -			/* Unlike get, only the underscore (global) option is used for for
        -			 * setting data since we don't know the type here. This is why an object
        -			 * option is not documented for `mData` (which is read/write), but it is
        -			 * for `mRender` which is read only.
        -			 */
        -			return _fnSetObjectDataFn( mSource._ );
        -		}
        -		else if ( mSource === null )
        -		{
        -			/* Nothing to do when the data source is null */
        -			return function () {};
        -		}
        -		else if ( typeof mSource === 'function' )
        -		{
        -			return function (data, val, meta) {
        -				mSource( data, 'set', val, meta );
        -			};
        -		}
        -		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
        -			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
        -		{
        -			/* Like the get, we need to get data from a nested object */
        -			var setData = function (data, val, src) {
        -				var a = _fnSplitObjNotation( src ), b;
        -				var aLast = a[a.length-1];
        -				var arrayNotation, funcNotation, o, innerSrc;
        -	
        -				for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
        -				{
        -					// Check if we are dealing with an array notation request
        -					arrayNotation = a[i].match(__reArray);
        -					funcNotation = a[i].match(__reFn);
        -	
        -					if ( arrayNotation )
        -					{
        -						a[i] = a[i].replace(__reArray, '');
        -						data[ a[i] ] = [];
        -	
        -						// Get the remainder of the nested object to set so we can recurse
        -						b = a.slice();
        -						b.splice( 0, i+1 );
        -						innerSrc = b.join('.');
        -	
        -						// Traverse each entry in the array setting the properties requested
        -						for ( var j=0, jLen=val.length ; j<jLen ; j++ )
        -						{
        -							o = {};
        -							setData( o, val[j], innerSrc );
        -							data[ a[i] ].push( o );
        -						}
        -	
        -						// The inner call to setData has already traversed through the remainder
        -						// of the source and has set the data, thus we can exit here
        -						return;
        -					}
        -					else if ( funcNotation )
        -					{
        -						// Function call
        -						a[i] = a[i].replace(__reFn, '');
        -						data = data[ a[i] ]( val );
        -					}
        -	
        -					// If the nested object doesn't currently exist - since we are
        -					// trying to set the value - create it
        -					if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
        -					{
        -						data[ a[i] ] = {};
        -					}
        -					data = data[ a[i] ];
        -				}
        -	
        -				// Last item in the input - i.e, the actual set
        -				if ( aLast.match(__reFn ) )
        -				{
        -					// Function call
        -					data = data[ aLast.replace(__reFn, '') ]( val );
        -				}
        -				else
        -				{
        -					// If array notation is used, we just want to strip it and use the property name
        -					// and assign the value. If it isn't used, then we get the result we want anyway
        -					data[ aLast.replace(__reArray, '') ] = val;
        -				}
        -			};
        -	
        -			return function (data, val) { // meta is also passed in, but not used
        -				return setData( data, val, mSource );
        -			};
        -		}
        -		else
        -		{
        -			/* Array or flat object mapping */
        -			return function (data, val) { // meta is also passed in, but not used
        -				data[mSource] = val;
        -			};
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Return an array with the full table data
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @returns array {array} aData Master data array
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnGetDataMaster ( settings )
        -	{
        -		return _pluck( settings.aoData, '_aData' );
        -	}
        -	
        -	
        -	/**
        -	 * Nuke the table
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnClearTable( settings )
        -	{
        -		settings.aoData.length = 0;
        -		settings.aiDisplayMaster.length = 0;
        -		settings.aiDisplay.length = 0;
        -	}
        -	
        -	
        -	 /**
        -	 * Take an array of integers (index array) and remove a target integer (value - not
        -	 * the key!)
        -	 *  @param {array} a Index array to target
        -	 *  @param {int} iTarget value to find
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnDeleteIndex( a, iTarget, splice )
        -	{
        -		var iTargetIndex = -1;
        -	
        -		for ( var i=0, iLen=a.length ; i<iLen ; i++ )
        -		{
        -			if ( a[i] == iTarget )
        -			{
        -				iTargetIndex = i;
        -			}
        -			else if ( a[i] > iTarget )
        -			{
        -				a[i]--;
        -			}
        -		}
        -	
        -		if ( iTargetIndex != -1 && splice === undefined )
        -		{
        -			a.splice( iTargetIndex, 1 );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Mark cached data as invalid such that a re-read of the data will occur when
        -	 * the cached data is next requested. Also update from the data source object.
        -	 *
        -	 * @param {object} settings DataTables settings object
        -	 * @param {int}    rowIdx   Row index to invalidate
        -	 * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
        -	 *     or 'data'
        -	 * @param {int}    [colIdx] Column index to invalidate. If undefined the whole
        -	 *     row will be invalidated
        -	 * @memberof DataTable#oApi
        -	 *
        -	 * @todo For the modularisation of v1.11 this will need to become a callback, so
        -	 *   the sort and filter methods can subscribe to it. That will required
        -	 *   initialisation options for sorting, which is why it is not already baked in
        -	 */
        -	function _fnInvalidate( settings, rowIdx, src, colIdx )
        -	{
        -		var row = settings.aoData[ rowIdx ];
        -		var i, ien;
        -		var cellWrite = function ( cell, col ) {
        -			// This is very frustrating, but in IE if you just write directly
        -			// to innerHTML, and elements that are overwritten are GC'ed,
        -			// even if there is a reference to them elsewhere
        -			while ( cell.childNodes.length ) {
        -				cell.removeChild( cell.firstChild );
        -			}
        -	
        -			cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
        -		};
        -	
        -		// Are we reading last data from DOM or the data object?
        -		if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
        -			// Read the data from the DOM
        -			row._aData = _fnGetRowElements(
        -					settings, row, colIdx, colIdx === undefined ? undefined : row._aData
        -				)
        -				.data;
        -		}
        -		else {
        -			// Reading from data object, update the DOM
        -			var cells = row.anCells;
        -	
        -			if ( cells ) {
        -				if ( colIdx !== undefined ) {
        -					cellWrite( cells[colIdx], colIdx );
        -				}
        -				else {
        -					for ( i=0, ien=cells.length ; i<ien ; i++ ) {
        -						cellWrite( cells[i], i );
        -					}
        -				}
        -			}
        -		}
        -	
        -		// For both row and cell invalidation, the cached data for sorting and
        -		// filtering is nulled out
        -		row._aSortData = null;
        -		row._aFilterData = null;
        -	
        -		// Invalidate the type for a specific column (if given) or all columns since
        -		// the data might have changed
        -		var cols = settings.aoColumns;
        -		if ( colIdx !== undefined ) {
        -			cols[ colIdx ].sType = null;
        -		}
        -		else {
        -			for ( i=0, ien=cols.length ; i<ien ; i++ ) {
        -				cols[i].sType = null;
        -			}
        -	
        -			// Update DataTables special `DT_*` attributes for the row
        -			_fnRowAttributes( row );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Build a data source object from an HTML row, reading the contents of the
        -	 * cells that are in the row.
        -	 *
        -	 * @param {object} settings DataTables settings object
        -	 * @param {node|object} TR element from which to read data or existing row
        -	 *   object from which to re-read the data from the cells
        -	 * @param {int} [colIdx] Optional column index
        -	 * @param {array|object} [d] Data source object. If `colIdx` is given then this
        -	 *   parameter should also be given and will be used to write the data into.
        -	 *   Only the column in question will be written
        -	 * @returns {object} Object with two parameters: `data` the data read, in
        -	 *   document order, and `cells` and array of nodes (they can be useful to the
        -	 *   caller, so rather than needing a second traversal to get them, just return
        -	 *   them from here).
        -	 * @memberof DataTable#oApi
        -	 */
        -	function _fnGetRowElements( settings, row, colIdx, d )
        -	{
        -		var
        -			tds = [],
        -			td = row.firstChild,
        -			name, col, o, i=0, contents,
        -			columns = settings.aoColumns,
        -			objectRead = settings._rowReadObject;
        -	
        -		// Allow the data object to be passed in, or construct
        -		d = d || objectRead ? {} : [];
        -	
        -		var attr = function ( str, td  ) {
        -			if ( typeof str === 'string' ) {
        -				var idx = str.indexOf('@');
        -	
        -				if ( idx !== -1 ) {
        -					var attr = str.substring( idx+1 );
        -					var setter = _fnSetObjectDataFn( str );
        -					setter( d, td.getAttribute( attr ) );
        -				}
        -			}
        -		};
        -	
        -		// Read data from a cell and store into the data object
        -		var cellProcess = function ( cell ) {
        -			if ( colIdx === undefined || colIdx === i ) {
        -				col = columns[i];
        -				contents = $.trim(cell.innerHTML);
        -	
        -				if ( col && col._bAttrSrc ) {
        -					var setter = _fnSetObjectDataFn( col.mData._ );
        -					setter( d, contents );
        -	
        -					attr( col.mData.sort, cell );
        -					attr( col.mData.type, cell );
        -					attr( col.mData.filter, cell );
        -				}
        -				else {
        -					// Depending on the `data` option for the columns the data can
        -					// be read to either an object or an array.
        -					if ( objectRead ) {
        -						if ( ! col._setter ) {
        -							// Cache the setter function
        -							col._setter = _fnSetObjectDataFn( col.mData );
        -						}
        -						col._setter( d, contents );
        -					}
        -					else {
        -						d[i] = contents;
        -					}
        -				}
        -			}
        -	
        -			i++;
        -		};
        -	
        -		if ( td ) {
        -			// `tr` element was passed in
        -			while ( td ) {
        -				name = td.nodeName.toUpperCase();
        -	
        -				if ( name == "TD" || name == "TH" ) {
        -					cellProcess( td );
        -					tds.push( td );
        -				}
        -	
        -				td = td.nextSibling;
        -			}
        -		}
        -		else {
        -			// Existing row object passed in
        -			tds = row.anCells;
        -			
        -			for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
        -				cellProcess( tds[j] );
        -			}
        -		}
        -	
        -		return {
        -			data: d,
        -			cells: tds
        -		};
        -	}
        -	/**
        -	 * Create a new TR element (and it's TD children) for a row
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {int} iRow Row to consider
        -	 *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,
        -	 *    DataTables will create a row automatically
        -	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
        -	 *    if nTr is.
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
        -	{
        -		var
        -			row = oSettings.aoData[iRow],
        -			rowData = row._aData,
        -			cells = [],
        -			nTr, nTd, oCol,
        -			i, iLen;
        -	
        -		if ( row.nTr === null )
        -		{
        -			nTr = nTrIn || document.createElement('tr');
        -	
        -			row.nTr = nTr;
        -			row.anCells = cells;
        -	
        -			/* Use a private property on the node to allow reserve mapping from the node
        -			 * to the aoData array for fast look up
        -			 */
        -			nTr._DT_RowIndex = iRow;
        -	
        -			/* Special parameters can be given by the data source to be used on the row */
        -			_fnRowAttributes( row );
        -	
        -			/* Process each column */
        -			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
        -			{
        -				oCol = oSettings.aoColumns[i];
        -	
        -				nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
        -				cells.push( nTd );
        -	
        -				// Need to create the HTML if new, or if a rendering function is defined
        -				if ( !nTrIn || oCol.mRender || oCol.mData !== i )
        -				{
        -					nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
        -				}
        -	
        -				/* Add user defined class */
        -				if ( oCol.sClass )
        -				{
        -					nTd.className += ' '+oCol.sClass;
        -				}
        -	
        -				// Visibility - add or remove as required
        -				if ( oCol.bVisible && ! nTrIn )
        -				{
        -					nTr.appendChild( nTd );
        -				}
        -				else if ( ! oCol.bVisible && nTrIn )
        -				{
        -					nTd.parentNode.removeChild( nTd );
        -				}
        -	
        -				if ( oCol.fnCreatedCell )
        -				{
        -					oCol.fnCreatedCell.call( oSettings.oInstance,
        -						nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
        -					);
        -				}
        -			}
        -	
        -			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );
        -		}
        -	
        -		// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
        -		// and deployed
        -		row.nTr.setAttribute( 'role', 'row' );
        -	}
        -	
        -	
        -	/**
        -	 * Add attributes to a row based on the special `DT_*` parameters in a data
        -	 * source object.
        -	 *  @param {object} DataTables row object for the row to be modified
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnRowAttributes( row )
        -	{
        -		var tr = row.nTr;
        -		var data = row._aData;
        -	
        -		if ( tr ) {
        -			if ( data.DT_RowId ) {
        -				tr.id = data.DT_RowId;
        -			}
        -	
        -			if ( data.DT_RowClass ) {
        -				// Remove any classes added by DT_RowClass before
        -				var a = data.DT_RowClass.split(' ');
        -				row.__rowc = row.__rowc ?
        -					_unique( row.__rowc.concat( a ) ) :
        -					a;
        -	
        -				$(tr)
        -					.removeClass( row.__rowc.join(' ') )
        -					.addClass( data.DT_RowClass );
        -			}
        -	
        -			if ( data.DT_RowAttr ) {
        -				$(tr).attr( data.DT_RowAttr );
        -			}
        -	
        -			if ( data.DT_RowData ) {
        -				$(tr).data( data.DT_RowData );
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Create the HTML header for the table
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnBuildHead( oSettings )
        -	{
        -		var i, ien, cell, row, column;
        -		var thead = oSettings.nTHead;
        -		var tfoot = oSettings.nTFoot;
        -		var createHeader = $('th, td', thead).length === 0;
        -		var classes = oSettings.oClasses;
        -		var columns = oSettings.aoColumns;
        -	
        -		if ( createHeader ) {
        -			row = $('<tr/>').appendTo( thead );
        -		}
        -	
        -		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
        -			column = columns[i];
        -			cell = $( column.nTh ).addClass( column.sClass );
        -	
        -			if ( createHeader ) {
        -				cell.appendTo( row );
        -			}
        -	
        -			// 1.11 move into sorting
        -			if ( oSettings.oFeatures.bSort ) {
        -				cell.addClass( column.sSortingClass );
        -	
        -				if ( column.bSortable !== false ) {
        -					cell
        -						.attr( 'tabindex', oSettings.iTabIndex )
        -						.attr( 'aria-controls', oSettings.sTableId );
        -	
        -					_fnSortAttachListener( oSettings, column.nTh, i );
        -				}
        -			}
        -	
        -			if ( column.sTitle != cell.html() ) {
        -				cell.html( column.sTitle );
        -			}
        -	
        -			_fnRenderer( oSettings, 'header' )(
        -				oSettings, cell, column, classes
        -			);
        -		}
        -	
        -		if ( createHeader ) {
        -			_fnDetectHeader( oSettings.aoHeader, thead );
        -		}
        -		
        -		/* ARIA role for the rows */
        -	 	$(thead).find('>tr').attr('role', 'row');
        -	
        -		/* Deal with the footer - add classes if required */
        -		$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
        -		$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
        -	
        -		// Cache the footer cells. Note that we only take the cells from the first
        -		// row in the footer. If there is more than one row the user wants to
        -		// interact with, they need to use the table().foot() method. Note also this
        -		// allows cells to be used for multiple columns using colspan
        -		if ( tfoot !== null ) {
        -			var cells = oSettings.aoFooter[0];
        -	
        -			for ( i=0, ien=cells.length ; i<ien ; i++ ) {
        -				column = columns[i];
        -				column.nTf = cells[i].cell;
        -	
        -				if ( column.sClass ) {
        -					$(column.nTf).addClass( column.sClass );
        -				}
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Draw the header (or footer) element based on the column visibility states. The
        -	 * methodology here is to use the layout array from _fnDetectHeader, modified for
        -	 * the instantaneous column visibility, to construct the new layout. The grid is
        -	 * traversed over cell at a time in a rows x columns grid fashion, although each
        -	 * cell insert can cover multiple elements in the grid - which is tracks using the
        -	 * aApplied array. Cell inserts in the grid will only occur where there isn't
        -	 * already a cell in that position.
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param array {objects} aoSource Layout array from _fnDetectHeader
        -	 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
        -	{
        -		var i, iLen, j, jLen, k, kLen, n, nLocalTr;
        -		var aoLocal = [];
        -		var aApplied = [];
        -		var iColumns = oSettings.aoColumns.length;
        -		var iRowspan, iColspan;
        -	
        -		if ( ! aoSource )
        -		{
        -			return;
        -		}
        -	
        -		if (  bIncludeHidden === undefined )
        -		{
        -			bIncludeHidden = false;
        -		}
        -	
        -		/* Make a copy of the master layout array, but without the visible columns in it */
        -		for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
        -		{
        -			aoLocal[i] = aoSource[i].slice();
        -			aoLocal[i].nTr = aoSource[i].nTr;
        -	
        -			/* Remove any columns which are currently hidden */
        -			for ( j=iColumns-1 ; j>=0 ; j-- )
        -			{
        -				if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
        -				{
        -					aoLocal[i].splice( j, 1 );
        -				}
        -			}
        -	
        -			/* Prep the applied array - it needs an element for each row */
        -			aApplied.push( [] );
        -		}
        -	
        -		for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
        -		{
        -			nLocalTr = aoLocal[i].nTr;
        -	
        -			/* All cells are going to be replaced, so empty out the row */
        -			if ( nLocalTr )
        -			{
        -				while( (n = nLocalTr.firstChild) )
        -				{
        -					nLocalTr.removeChild( n );
        -				}
        -			}
        -	
        -			for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
        -			{
        -				iRowspan = 1;
        -				iColspan = 1;
        -	
        -				/* Check to see if there is already a cell (row/colspan) covering our target
        -				 * insert point. If there is, then there is nothing to do.
        -				 */
        -				if ( aApplied[i][j] === undefined )
        -				{
        -					nLocalTr.appendChild( aoLocal[i][j].cell );
        -					aApplied[i][j] = 1;
        -	
        -					/* Expand the cell to cover as many rows as needed */
        -					while ( aoLocal[i+iRowspan] !== undefined &&
        -					        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
        -					{
        -						aApplied[i+iRowspan][j] = 1;
        -						iRowspan++;
        -					}
        -	
        -					/* Expand the cell to cover as many columns as needed */
        -					while ( aoLocal[i][j+iColspan] !== undefined &&
        -					        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
        -					{
        -						/* Must update the applied array over the rows for the columns */
        -						for ( k=0 ; k<iRowspan ; k++ )
        -						{
        -							aApplied[i+k][j+iColspan] = 1;
        -						}
        -						iColspan++;
        -					}
        -	
        -					/* Do the actual expansion in the DOM */
        -					$(aoLocal[i][j].cell)
        -						.attr('rowspan', iRowspan)
        -						.attr('colspan', iColspan);
        -				}
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Insert the required TR nodes into the table for display
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnDraw( oSettings )
        -	{
        -		/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
        -		var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
        -		if ( $.inArray( false, aPreDraw ) !== -1 )
        -		{
        -			_fnProcessingDisplay( oSettings, false );
        -			return;
        -		}
        -	
        -		var i, iLen, n;
        -		var anRows = [];
        -		var iRowCount = 0;
        -		var asStripeClasses = oSettings.asStripeClasses;
        -		var iStripes = asStripeClasses.length;
        -		var iOpenRows = oSettings.aoOpenRows.length;
        -		var oLang = oSettings.oLanguage;
        -		var iInitDisplayStart = oSettings.iInitDisplayStart;
        -		var bServerSide = _fnDataSource( oSettings ) == 'ssp';
        -		var aiDisplay = oSettings.aiDisplay;
        -	
        -		oSettings.bDrawing = true;
        -	
        -		/* Check and see if we have an initial draw position from state saving */
        -		if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
        -		{
        -			oSettings._iDisplayStart = bServerSide ?
        -				iInitDisplayStart :
        -				iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
        -					0 :
        -					iInitDisplayStart;
        -	
        -			oSettings.iInitDisplayStart = -1;
        -		}
        -	
        -		var iDisplayStart = oSettings._iDisplayStart;
        -		var iDisplayEnd = oSettings.fnDisplayEnd();
        -	
        -		/* Server-side processing draw intercept */
        -		if ( oSettings.bDeferLoading )
        -		{
        -			oSettings.bDeferLoading = false;
        -			oSettings.iDraw++;
        -			_fnProcessingDisplay( oSettings, false );
        -		}
        -		else if ( !bServerSide )
        -		{
        -			oSettings.iDraw++;
        -		}
        -		else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
        -		{
        -			return;
        -		}
        -	
        -		if ( aiDisplay.length !== 0 )
        -		{
        -			var iStart = bServerSide ? 0 : iDisplayStart;
        -			var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
        -	
        -			for ( var j=iStart ; j<iEnd ; j++ )
        -			{
        -				var iDataIndex = aiDisplay[j];
        -				var aoData = oSettings.aoData[ iDataIndex ];
        -				if ( aoData.nTr === null )
        -				{
        -					_fnCreateTr( oSettings, iDataIndex );
        -				}
        -	
        -				var nRow = aoData.nTr;
        -	
        -				/* Remove the old striping classes and then add the new one */
        -				if ( iStripes !== 0 )
        -				{
        -					var sStripe = asStripeClasses[ iRowCount % iStripes ];
        -					if ( aoData._sRowStripe != sStripe )
        -					{
        -						$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
        -						aoData._sRowStripe = sStripe;
        -					}
        -				}
        -	
        -				// Row callback functions - might want to manipulate the row
        -				// iRowCount and j are not currently documented. Are they at all
        -				// useful?
        -				_fnCallbackFire( oSettings, 'aoRowCallback', null,
        -					[nRow, aoData._aData, iRowCount, j] );
        -	
        -				anRows.push( nRow );
        -				iRowCount++;
        -			}
        -		}
        -		else
        -		{
        -			/* Table is empty - create a row with an empty message in it */
        -			var sZero = oLang.sZeroRecords;
        -			if ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )
        -			{
        -				sZero = oLang.sLoadingRecords;
        -			}
        -			else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
        -			{
        -				sZero = oLang.sEmptyTable;
        -			}
        -	
        -			anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
        -				.append( $('<td />', {
        -					'valign':  'top',
        -					'colSpan': _fnVisbleColumns( oSettings ),
        -					'class':   oSettings.oClasses.sRowEmpty
        -				} ).html( sZero ) )[0];
        -		}
        -	
        -		/* Header and footer callbacks */
        -		_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
        -			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
        -	
        -		_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
        -			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
        -	
        -		var body = $(oSettings.nTBody);
        -	
        -		body.children().detach();
        -		body.append( $(anRows) );
        -	
        -		/* Call all required callback functions for the end of a draw */
        -		_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
        -	
        -		/* Draw is complete, sorting and filtering must be as well */
        -		oSettings.bSorted = false;
        -		oSettings.bFiltered = false;
        -		oSettings.bDrawing = false;
        -	}
        -	
        -	
        -	/**
        -	 * Redraw the table - taking account of the various features which are enabled
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {boolean} [holdPosition] Keep the current paging position. By default
        -	 *    the paging is reset to the first page
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnReDraw( settings, holdPosition )
        -	{
        -		var
        -			features = settings.oFeatures,
        -			sort     = features.bSort,
        -			filter   = features.bFilter;
        -	
        -		if ( sort ) {
        -			_fnSort( settings );
        -		}
        -	
        -		if ( filter ) {
        -			_fnFilterComplete( settings, settings.oPreviousSearch );
        -		}
        -		else {
        -			// No filtering, so we want to just use the display master
        -			settings.aiDisplay = settings.aiDisplayMaster.slice();
        -		}
        -	
        -		if ( holdPosition !== true ) {
        -			settings._iDisplayStart = 0;
        -		}
        -	
        -		// Let any modules know about the draw hold position state (used by
        -		// scrolling internally)
        -		settings._drawHold = holdPosition;
        -	
        -		_fnDraw( settings );
        -	
        -		settings._drawHold = false;
        -	}
        -	
        -	
        -	/**
        -	 * Add the options to the page HTML for the table
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAddOptionsHtml ( oSettings )
        -	{
        -		var classes = oSettings.oClasses;
        -		var table = $(oSettings.nTable);
        -		var holding = $('<div/>').insertBefore( table ); // Holding element for speed
        -		var features = oSettings.oFeatures;
        -	
        -		// All DataTables are wrapped in a div
        -		var insert = $('<div/>', {
        -			id:      oSettings.sTableId+'_wrapper',
        -			'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
        -		} );
        -	
        -		oSettings.nHolding = holding[0];
        -		oSettings.nTableWrapper = insert[0];
        -		oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
        -	
        -		/* Loop over the user set positioning and place the elements as needed */
        -		var aDom = oSettings.sDom.split('');
        -		var featureNode, cOption, nNewNode, cNext, sAttr, j;
        -		for ( var i=0 ; i<aDom.length ; i++ )
        -		{
        -			featureNode = null;
        -			cOption = aDom[i];
        -	
        -			if ( cOption == '<' )
        -			{
        -				/* New container div */
        -				nNewNode = $('<div/>')[0];
        -	
        -				/* Check to see if we should append an id and/or a class name to the container */
        -				cNext = aDom[i+1];
        -				if ( cNext == "'" || cNext == '"' )
        -				{
        -					sAttr = "";
        -					j = 2;
        -					while ( aDom[i+j] != cNext )
        -					{
        -						sAttr += aDom[i+j];
        -						j++;
        -					}
        -	
        -					/* Replace jQuery UI constants @todo depreciated */
        -					if ( sAttr == "H" )
        -					{
        -						sAttr = classes.sJUIHeader;
        -					}
        -					else if ( sAttr == "F" )
        -					{
        -						sAttr = classes.sJUIFooter;
        -					}
        -	
        -					/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
        -					 * breaks the string into parts and applies them as needed
        -					 */
        -					if ( sAttr.indexOf('.') != -1 )
        -					{
        -						var aSplit = sAttr.split('.');
        -						nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
        -						nNewNode.className = aSplit[1];
        -					}
        -					else if ( sAttr.charAt(0) == "#" )
        -					{
        -						nNewNode.id = sAttr.substr(1, sAttr.length-1);
        -					}
        -					else
        -					{
        -						nNewNode.className = sAttr;
        -					}
        -	
        -					i += j; /* Move along the position array */
        -				}
        -	
        -				insert.append( nNewNode );
        -				insert = $(nNewNode);
        -			}
        -			else if ( cOption == '>' )
        -			{
        -				/* End container div */
        -				insert = insert.parent();
        -			}
        -			// @todo Move options into their own plugins?
        -			else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
        -			{
        -				/* Length */
        -				featureNode = _fnFeatureHtmlLength( oSettings );
        -			}
        -			else if ( cOption == 'f' && features.bFilter )
        -			{
        -				/* Filter */
        -				featureNode = _fnFeatureHtmlFilter( oSettings );
        -			}
        -			else if ( cOption == 'r' && features.bProcessing )
        -			{
        -				/* pRocessing */
        -				featureNode = _fnFeatureHtmlProcessing( oSettings );
        -			}
        -			else if ( cOption == 't' )
        -			{
        -				/* Table */
        -				featureNode = _fnFeatureHtmlTable( oSettings );
        -			}
        -			else if ( cOption ==  'i' && features.bInfo )
        -			{
        -				/* Info */
        -				featureNode = _fnFeatureHtmlInfo( oSettings );
        -			}
        -			else if ( cOption == 'p' && features.bPaginate )
        -			{
        -				/* Pagination */
        -				featureNode = _fnFeatureHtmlPaginate( oSettings );
        -			}
        -			else if ( DataTable.ext.feature.length !== 0 )
        -			{
        -				/* Plug-in features */
        -				var aoFeatures = DataTable.ext.feature;
        -				for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
        -				{
        -					if ( cOption == aoFeatures[k].cFeature )
        -					{
        -						featureNode = aoFeatures[k].fnInit( oSettings );
        -						break;
        -					}
        -				}
        -			}
        -	
        -			/* Add to the 2D features array */
        -			if ( featureNode )
        -			{
        -				var aanFeatures = oSettings.aanFeatures;
        -	
        -				if ( ! aanFeatures[cOption] )
        -				{
        -					aanFeatures[cOption] = [];
        -				}
        -	
        -				aanFeatures[cOption].push( featureNode );
        -				insert.append( featureNode );
        -			}
        -		}
        -	
        -		/* Built our DOM structure - replace the holding div with what we want */
        -		holding.replaceWith( insert );
        -	}
        -	
        -	
        -	/**
        -	 * Use the DOM source to create up an array of header cells. The idea here is to
        -	 * create a layout grid (array) of rows x columns, which contains a reference
        -	 * to the cell that that point in the grid (regardless of col/rowspan), such that
        -	 * any column / row could be removed and the new grid constructed
        -	 *  @param array {object} aLayout Array to store the calculated layout in
        -	 *  @param {node} nThead The header/footer element for the table
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnDetectHeader ( aLayout, nThead )
        -	{
        -		var nTrs = $(nThead).children('tr');
        -		var nTr, nCell;
        -		var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
        -		var bUnique;
        -		var fnShiftCol = function ( a, i, j ) {
        -			var k = a[i];
        -	                while ( k[j] ) {
        -				j++;
        -			}
        -			return j;
        -		};
        -	
        -		aLayout.splice( 0, aLayout.length );
        -	
        -		/* We know how many rows there are in the layout - so prep it */
        -		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
        -		{
        -			aLayout.push( [] );
        -		}
        -	
        -		/* Calculate a layout array */
        -		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
        -		{
        -			nTr = nTrs[i];
        -			iColumn = 0;
        -	
        -			/* For every cell in the row... */
        -			nCell = nTr.firstChild;
        -			while ( nCell ) {
        -				if ( nCell.nodeName.toUpperCase() == "TD" ||
        -				     nCell.nodeName.toUpperCase() == "TH" )
        -				{
        -					/* Get the col and rowspan attributes from the DOM and sanitise them */
        -					iColspan = nCell.getAttribute('colspan') * 1;
        -					iRowspan = nCell.getAttribute('rowspan') * 1;
        -					iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
        -					iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
        -	
        -					/* There might be colspan cells already in this row, so shift our target
        -					 * accordingly
        -					 */
        -					iColShifted = fnShiftCol( aLayout, i, iColumn );
        -	
        -					/* Cache calculation for unique columns */
        -					bUnique = iColspan === 1 ? true : false;
        -	
        -					/* If there is col / rowspan, copy the information into the layout grid */
        -					for ( l=0 ; l<iColspan ; l++ )
        -					{
        -						for ( k=0 ; k<iRowspan ; k++ )
        -						{
        -							aLayout[i+k][iColShifted+l] = {
        -								"cell": nCell,
        -								"unique": bUnique
        -							};
        -							aLayout[i+k].nTr = nTr;
        -						}
        -					}
        -				}
        -				nCell = nCell.nextSibling;
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Get an array of unique th elements, one for each column
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {node} nHeader automatically detect the layout from this node - optional
        -	 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
        -	 *  @returns array {node} aReturn list of unique th's
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
        -	{
        -		var aReturn = [];
        -		if ( !aLayout )
        -		{
        -			aLayout = oSettings.aoHeader;
        -			if ( nHeader )
        -			{
        -				aLayout = [];
        -				_fnDetectHeader( aLayout, nHeader );
        -			}
        -		}
        -	
        -		for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
        -		{
        -			for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
        -			{
        -				if ( aLayout[i][j].unique &&
        -					 (!aReturn[j] || !oSettings.bSortCellsTop) )
        -				{
        -					aReturn[j] = aLayout[i][j].cell;
        -				}
        -			}
        -		}
        -	
        -		return aReturn;
        -	}
        -	
        -	/**
        -	 * Create an Ajax call based on the table's settings, taking into account that
        -	 * parameters can have multiple forms, and backwards compatibility.
        -	 *
        -	 * @param {object} oSettings dataTables settings object
        -	 * @param {array} data Data to send to the server, required by
        -	 *     DataTables - may be augmented by developer callbacks
        -	 * @param {function} fn Callback function to run when data is obtained
        -	 */
        -	function _fnBuildAjax( oSettings, data, fn )
        -	{
        -		// Compatibility with 1.9-, allow fnServerData and event to manipulate
        -		_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
        -	
        -		// Convert to object based for 1.10+ if using the old array scheme which can
        -		// come from server-side processing or serverParams
        -		if ( data && $.isArray(data) ) {
        -			var tmp = {};
        -			var rbracket = /(.*?)\[\]$/;
        -	
        -			$.each( data, function (key, val) {
        -				var match = val.name.match(rbracket);
        -	
        -				if ( match ) {
        -					// Support for arrays
        -					var name = match[0];
        -	
        -					if ( ! tmp[ name ] ) {
        -						tmp[ name ] = [];
        -					}
        -					tmp[ name ].push( val.value );
        -				}
        -				else {
        -					tmp[val.name] = val.value;
        -				}
        -			} );
        -			data = tmp;
        -		}
        -	
        -		var ajaxData;
        -		var ajax = oSettings.ajax;
        -		var instance = oSettings.oInstance;
        -		var callback = function ( json ) {
        -			_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
        -			fn( json );
        -		};
        -	
        -		if ( $.isPlainObject( ajax ) && ajax.data )
        -		{
        -			ajaxData = ajax.data;
        -	
        -			var newData = $.isFunction( ajaxData ) ?
        -				ajaxData( data, oSettings ) :  // fn can manipulate data or return
        -				ajaxData;                      // an object object or array to merge
        -	
        -			// If the function returned something, use that alone
        -			data = $.isFunction( ajaxData ) && newData ?
        -				newData :
        -				$.extend( true, data, newData );
        -	
        -			// Remove the data property as we've resolved it already and don't want
        -			// jQuery to do it again (it is restored at the end of the function)
        -			delete ajax.data;
        -		}
        -	
        -		var baseAjax = {
        -			"data": data,
        -			"success": function (json) {
        -				var error = json.error || json.sError;
        -				if ( error ) {
        -					_fnLog( oSettings, 0, error );
        -				}
        -	
        -				oSettings.json = json;
        -				callback( json );
        -			},
        -			"dataType": "json",
        -			"cache": false,
        -			"type": oSettings.sServerMethod,
        -			"error": function (xhr, error, thrown) {
        -				var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );
        -	
        -				if ( $.inArray( true, ret ) === -1 ) {
        -					if ( error == "parsererror" ) {
        -						_fnLog( oSettings, 0, 'Invalid JSON response', 1 );
        -					}
        -					else if ( xhr.readyState === 4 ) {
        -						_fnLog( oSettings, 0, 'Ajax error', 7 );
        -					}
        -				}
        -	
        -				_fnProcessingDisplay( oSettings, false );
        -			}
        -		};
        -	
        -		// Store the data submitted for the API
        -		oSettings.oAjaxData = data;
        -	
        -		// Allow plug-ins and external processes to modify the data
        -		_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );
        -	
        -		if ( oSettings.fnServerData )
        -		{
        -			// DataTables 1.9- compatibility
        -			oSettings.fnServerData.call( instance,
        -				oSettings.sAjaxSource,
        -				$.map( data, function (val, key) { // Need to convert back to 1.9 trad format
        -					return { name: key, value: val };
        -				} ),
        -				callback,
        -				oSettings
        -			);
        -		}
        -		else if ( oSettings.sAjaxSource || typeof ajax === 'string' )
        -		{
        -			// DataTables 1.9- compatibility
        -			oSettings.jqXHR = $.ajax( $.extend( baseAjax, {
        -				url: ajax || oSettings.sAjaxSource
        -			} ) );
        -		}
        -		else if ( $.isFunction( ajax ) )
        -		{
        -			// Is a function - let the caller define what needs to be done
        -			oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
        -		}
        -		else
        -		{
        -			// Object to extend the base settings
        -			oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );
        -	
        -			// Restore for next time around
        -			ajax.data = ajaxData;
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Update the table using an Ajax call
        -	 *  @param {object} settings dataTables settings object
        -	 *  @returns {boolean} Block the table drawing or not
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAjaxUpdate( settings )
        -	{
        -		if ( settings.bAjaxDataGet ) {
        -			settings.iDraw++;
        -			_fnProcessingDisplay( settings, true );
        -	
        -			_fnBuildAjax(
        -				settings,
        -				_fnAjaxParameters( settings ),
        -				function(json) {
        -					_fnAjaxUpdateDraw( settings, json );
        -				}
        -			);
        -	
        -			return false;
        -		}
        -		return true;
        -	}
        -	
        -	
        -	/**
        -	 * Build up the parameters in an object needed for a server-side processing
        -	 * request. Note that this is basically done twice, is different ways - a modern
        -	 * method which is used by default in DataTables 1.10 which uses objects and
        -	 * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
        -	 * the sAjaxSource option is used in the initialisation, or the legacyAjax
        -	 * option is set.
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @returns {bool} block the table drawing or not
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAjaxParameters( settings )
        -	{
        -		var
        -			columns = settings.aoColumns,
        -			columnCount = columns.length,
        -			features = settings.oFeatures,
        -			preSearch = settings.oPreviousSearch,
        -			preColSearch = settings.aoPreSearchCols,
        -			i, data = [], dataProp, column, columnSearch,
        -			sort = _fnSortFlatten( settings ),
        -			displayStart = settings._iDisplayStart,
        -			displayLength = features.bPaginate !== false ?
        -				settings._iDisplayLength :
        -				-1;
        -	
        -		var param = function ( name, value ) {
        -			data.push( { 'name': name, 'value': value } );
        -		};
        -	
        -		// DataTables 1.9- compatible method
        -		param( 'sEcho',          settings.iDraw );
        -		param( 'iColumns',       columnCount );
        -		param( 'sColumns',       _pluck( columns, 'sName' ).join(',') );
        -		param( 'iDisplayStart',  displayStart );
        -		param( 'iDisplayLength', displayLength );
        -	
        -		// DataTables 1.10+ method
        -		var d = {
        -			draw:    settings.iDraw,
        -			columns: [],
        -			order:   [],
        -			start:   displayStart,
        -			length:  displayLength,
        -			search:  {
        -				value: preSearch.sSearch,
        -				regex: preSearch.bRegex
        -			}
        -		};
        -	
        -		for ( i=0 ; i<columnCount ; i++ ) {
        -			column = columns[i];
        -			columnSearch = preColSearch[i];
        -			dataProp = typeof column.mData=="function" ? 'function' : column.mData ;
        -	
        -			d.columns.push( {
        -				data:       dataProp,
        -				name:       column.sName,
        -				searchable: column.bSearchable,
        -				orderable:  column.bSortable,
        -				search:     {
        -					value: columnSearch.sSearch,
        -					regex: columnSearch.bRegex
        -				}
        -			} );
        -	
        -			param( "mDataProp_"+i, dataProp );
        -	
        -			if ( features.bFilter ) {
        -				param( 'sSearch_'+i,     columnSearch.sSearch );
        -				param( 'bRegex_'+i,      columnSearch.bRegex );
        -				param( 'bSearchable_'+i, column.bSearchable );
        -			}
        -	
        -			if ( features.bSort ) {
        -				param( 'bSortable_'+i, column.bSortable );
        -			}
        -		}
        -	
        -		if ( features.bFilter ) {
        -			param( 'sSearch', preSearch.sSearch );
        -			param( 'bRegex', preSearch.bRegex );
        -		}
        -	
        -		if ( features.bSort ) {
        -			$.each( sort, function ( i, val ) {
        -				d.order.push( { column: val.col, dir: val.dir } );
        -	
        -				param( 'iSortCol_'+i, val.col );
        -				param( 'sSortDir_'+i, val.dir );
        -			} );
        -	
        -			param( 'iSortingCols', sort.length );
        -		}
        -	
        -		// If the legacy.ajax parameter is null, then we automatically decide which
        -		// form to use, based on sAjaxSource
        -		var legacy = DataTable.ext.legacy.ajax;
        -		if ( legacy === null ) {
        -			return settings.sAjaxSource ? data : d;
        -		}
        -	
        -		// Otherwise, if legacy has been specified then we use that to decide on the
        -		// form
        -		return legacy ? data : d;
        -	}
        -	
        -	
        -	/**
        -	 * Data the data from the server (nuking the old) and redraw the table
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {object} json json data return from the server.
        -	 *  @param {string} json.sEcho Tracking flag for DataTables to match requests
        -	 *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
        -	 *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
        -	 *  @param {array} json.aaData The data to display on this page
        -	 *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnAjaxUpdateDraw ( settings, json )
        -	{
        -		// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
        -		// Support both
        -		var compat = function ( old, modern ) {
        -			return json[old] !== undefined ? json[old] : json[modern];
        -		};
        -	
        -		var data = _fnAjaxDataSrc( settings, json );
        -		var draw            = compat( 'sEcho',                'draw' );
        -		var recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );
        -		var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );
        -	
        -		if ( draw ) {
        -			// Protect against out of sequence returns
        -			if ( draw*1 < settings.iDraw ) {
        -				return;
        -			}
        -			settings.iDraw = draw * 1;
        -		}
        -	
        -		_fnClearTable( settings );
        -		settings._iRecordsTotal   = parseInt(recordsTotal, 10);
        -		settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
        -	
        -		for ( var i=0, ien=data.length ; i<ien ; i++ ) {
        -			_fnAddData( settings, data[i] );
        -		}
        -		settings.aiDisplay = settings.aiDisplayMaster.slice();
        -	
        -		settings.bAjaxDataGet = false;
        -		_fnDraw( settings );
        -	
        -		if ( ! settings._bInitComplete ) {
        -			_fnInitComplete( settings, json );
        -		}
        -	
        -		settings.bAjaxDataGet = true;
        -		_fnProcessingDisplay( settings, false );
        -	}
        -	
        -	
        -	/**
        -	 * Get the data from the JSON data source to use for drawing a table. Using
        -	 * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
        -	 * source object, or from a processing function.
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param  {object} json Data source object / array from the server
        -	 *  @return {array} Array of data to use
        -	 */
        -	function _fnAjaxDataSrc ( oSettings, json )
        -	{
        -		var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?
        -			oSettings.ajax.dataSrc :
        -			oSettings.sAjaxDataProp; // Compatibility with 1.9-.
        -	
        -		// Compatibility with 1.9-. In order to read from aaData, check if the
        -		// default has been changed, if not, check for aaData
        -		if ( dataSrc === 'data' ) {
        -			return json.aaData || json[dataSrc];
        -		}
        -	
        -		return dataSrc !== "" ?
        -			_fnGetObjectDataFn( dataSrc )( json ) :
        -			json;
        -	}
        -	
        -	/**
        -	 * Generate the node required for filtering text
        -	 *  @returns {node} Filter control element
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFeatureHtmlFilter ( settings )
        -	{
        -		var classes = settings.oClasses;
        -		var tableId = settings.sTableId;
        -		var language = settings.oLanguage;
        -		var previousSearch = settings.oPreviousSearch;
        -		var features = settings.aanFeatures;
        -		var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
        -	
        -		var str = language.sSearch;
        -		str = str.match(/_INPUT_/) ?
        -			str.replace('_INPUT_', input) :
        -			str+input;
        -	
        -		var filter = $('<div/>', {
        -				'id': ! features.f ? tableId+'_filter' : null,
        -				'class': classes.sFilter
        -			} )
        -			.append( $('<label/>' ).append( str ) );
        -	
        -		var searchFn = function() {
        -			/* Update all other filter input elements for the new display */
        -			var n = features.f;
        -			var val = !this.value ? "" : this.value; // mental IE8 fix :-(
        -	
        -			/* Now do the filter */
        -			if ( val != previousSearch.sSearch ) {
        -				_fnFilterComplete( settings, {
        -					"sSearch": val,
        -					"bRegex": previousSearch.bRegex,
        -					"bSmart": previousSearch.bSmart ,
        -					"bCaseInsensitive": previousSearch.bCaseInsensitive
        -				} );
        -	
        -				// Need to redraw, without resorting
        -				settings._iDisplayStart = 0;
        -				_fnDraw( settings );
        -			}
        -		};
        -	
        -		var searchDelay = settings.searchDelay !== null ?
        -			settings.searchDelay :
        -			_fnDataSource( settings ) === 'ssp' ?
        -				400 :
        -				0;
        -	
        -		var jqFilter = $('input', filter)
        -			.val( previousSearch.sSearch )
        -			.attr( 'placeholder', language.sSearchPlaceholder )
        -			.bind(
        -				'keyup.DT search.DT input.DT paste.DT cut.DT',
        -				searchDelay ?
        -					_fnThrottle( searchFn, searchDelay ) :
        -					searchFn
        -			)
        -			.bind( 'keypress.DT', function(e) {
        -				/* Prevent form submission */
        -				if ( e.keyCode == 13 ) {
        -					return false;
        -				}
        -			} )
        -			.attr('aria-controls', tableId);
        -	
        -		// Update the input elements whenever the table is filtered
        -		$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
        -			if ( settings === s ) {
        -				// IE9 throws an 'unknown error' if document.activeElement is used
        -				// inside an iframe or frame...
        -				try {
        -					if ( jqFilter[0] !== document.activeElement ) {
        -						jqFilter.val( previousSearch.sSearch );
        -					}
        -				}
        -				catch ( e ) {}
        -			}
        -		} );
        -	
        -		return filter[0];
        -	}
        -	
        -	
        -	/**
        -	 * Filter the table using both the global filter and column based filtering
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {object} oSearch search information
        -	 *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFilterComplete ( oSettings, oInput, iForce )
        -	{
        -		var oPrevSearch = oSettings.oPreviousSearch;
        -		var aoPrevSearch = oSettings.aoPreSearchCols;
        -		var fnSaveFilter = function ( oFilter ) {
        -			/* Save the filtering values */
        -			oPrevSearch.sSearch = oFilter.sSearch;
        -			oPrevSearch.bRegex = oFilter.bRegex;
        -			oPrevSearch.bSmart = oFilter.bSmart;
        -			oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
        -		};
        -		var fnRegex = function ( o ) {
        -			// Backwards compatibility with the bEscapeRegex option
        -			return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
        -		};
        -	
        -		// Resolve any column types that are unknown due to addition or invalidation
        -		// @todo As per sort - can this be moved into an event handler?
        -		_fnColumnTypes( oSettings );
        -	
        -		/* In server-side processing all filtering is done by the server, so no point hanging around here */
        -		if ( _fnDataSource( oSettings ) != 'ssp' )
        -		{
        -			/* Global filter */
        -			_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
        -			fnSaveFilter( oInput );
        -	
        -			/* Now do the individual column filter */
        -			for ( var i=0 ; i<aoPrevSearch.length ; i++ )
        -			{
        -				_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
        -					aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
        -			}
        -	
        -			/* Custom filtering */
        -			_fnFilterCustom( oSettings );
        -		}
        -		else
        -		{
        -			fnSaveFilter( oInput );
        -		}
        -	
        -		/* Tell the draw function we have been filtering */
        -		oSettings.bFiltered = true;
        -		_fnCallbackFire( oSettings, null, 'search', [oSettings] );
        -	}
        -	
        -	
        -	/**
        -	 * Apply custom filtering functions
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFilterCustom( settings )
        -	{
        -		var filters = DataTable.ext.search;
        -		var displayRows = settings.aiDisplay;
        -		var row, rowIdx;
        -	
        -		for ( var i=0, ien=filters.length ; i<ien ; i++ ) {
        -			var rows = [];
        -	
        -			// Loop over each row and see if it should be included
        -			for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {
        -				rowIdx = displayRows[ j ];
        -				row = settings.aoData[ rowIdx ];
        -	
        -				if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {
        -					rows.push( rowIdx );
        -				}
        -			}
        -	
        -			// So the array reference doesn't break set the results into the
        -			// existing array
        -			displayRows.length = 0;
        -			displayRows.push.apply( displayRows, rows );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Filter the table on a per-column basis
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {string} sInput string to filter on
        -	 *  @param {int} iColumn column to filter
        -	 *  @param {bool} bRegex treat search string as a regular expression or not
        -	 *  @param {bool} bSmart use smart filtering or not
        -	 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )
        -	{
        -		if ( searchStr === '' ) {
        -			return;
        -		}
        -	
        -		var data;
        -		var display = settings.aiDisplay;
        -		var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );
        -	
        -		for ( var i=display.length-1 ; i>=0 ; i-- ) {
        -			data = settings.aoData[ display[i] ]._aFilterData[ colIdx ];
        -	
        -			if ( ! rpSearch.test( data ) ) {
        -				display.splice( i, 1 );
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Filter the data table based on user input and draw the table
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {string} input string to filter on
        -	 *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)
        -	 *  @param {bool} regex treat as a regular expression or not
        -	 *  @param {bool} smart perform smart filtering or not
        -	 *  @param {bool} caseInsensitive Do case insenstive matching or not
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
        -	{
        -		var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );
        -		var prevSearch = settings.oPreviousSearch.sSearch;
        -		var displayMaster = settings.aiDisplayMaster;
        -		var display, invalidated, i;
        -	
        -		// Need to take account of custom filtering functions - always filter
        -		if ( DataTable.ext.search.length !== 0 ) {
        -			force = true;
        -		}
        -	
        -		// Check if any of the rows were invalidated
        -		invalidated = _fnFilterData( settings );
        -	
        -		// If the input is blank - we just want the full data set
        -		if ( input.length <= 0 ) {
        -			settings.aiDisplay = displayMaster.slice();
        -		}
        -		else {
        -			// New search - start from the master array
        -			if ( invalidated ||
        -				 force ||
        -				 prevSearch.length > input.length ||
        -				 input.indexOf(prevSearch) !== 0 ||
        -				 settings.bSorted // On resort, the display master needs to be
        -				                  // re-filtered since indexes will have changed
        -			) {
        -				settings.aiDisplay = displayMaster.slice();
        -			}
        -	
        -			// Search the display array
        -			display = settings.aiDisplay;
        -	
        -			for ( i=display.length-1 ; i>=0 ; i-- ) {
        -				if ( ! rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {
        -					display.splice( i, 1 );
        -				}
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Build a regular expression object suitable for searching a table
        -	 *  @param {string} sSearch string to search for
        -	 *  @param {bool} bRegex treat as a regular expression or not
        -	 *  @param {bool} bSmart perform smart filtering or not
        -	 *  @param {bool} bCaseInsensitive Do case insensitive matching or not
        -	 *  @returns {RegExp} constructed object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
        -	{
        -		search = regex ?
        -			search :
        -			_fnEscapeRegex( search );
        -		
        -		if ( smart ) {
        -			/* For smart filtering we want to allow the search to work regardless of
        -			 * word order. We also want double quoted text to be preserved, so word
        -			 * order is important - a la google. So this is what we want to
        -			 * generate:
        -			 * 
        -			 * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
        -			 */
        -			var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) {
        -				if ( word.charAt(0) === '"' ) {
        -					var m = word.match( /^"(.*)"$/ );
        -					word = m ? m[1] : word;
        -				}
        -	
        -				return word.replace('"', '');
        -			} );
        -	
        -			search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';
        -		}
        -	
        -		return new RegExp( search, caseInsensitive ? 'i' : '' );
        -	}
        -	
        -	
        -	/**
        -	 * Escape a string such that it can be used in a regular expression
        -	 *  @param {string} sVal string to escape
        -	 *  @returns {string} escaped string
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnEscapeRegex ( sVal )
        -	{
        -		return sVal.replace( _re_escape_regex, '\\$1' );
        -	}
        -	
        -	
        -	
        -	var __filter_div = $('<div>')[0];
        -	var __filter_div_textContent = __filter_div.textContent !== undefined;
        -	
        -	// Update the filtering data for each row if needed (by invalidation or first run)
        -	function _fnFilterData ( settings )
        -	{
        -		var columns = settings.aoColumns;
        -		var column;
        -		var i, j, ien, jen, filterData, cellData, row;
        -		var fomatters = DataTable.ext.type.search;
        -		var wasInvalidated = false;
        -	
        -		for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
        -			row = settings.aoData[i];
        -	
        -			if ( ! row._aFilterData ) {
        -				filterData = [];
        -	
        -				for ( j=0, jen=columns.length ; j<jen ; j++ ) {
        -					column = columns[j];
        -	
        -					if ( column.bSearchable ) {
        -						cellData = _fnGetCellData( settings, i, j, 'filter' );
        -	
        -						if ( fomatters[ column.sType ] ) {
        -							cellData = fomatters[ column.sType ]( cellData );
        -						}
        -	
        -						// Search in DataTables 1.10 is string based. In 1.11 this
        -						// should be altered to also allow strict type checking.
        -						if ( cellData === null ) {
        -							cellData = '';
        -						}
        -	
        -						if ( typeof cellData !== 'string' && cellData.toString ) {
        -							cellData = cellData.toString();
        -						}
        -					}
        -					else {
        -						cellData = '';
        -					}
        -	
        -					// If it looks like there is an HTML entity in the string,
        -					// attempt to decode it so sorting works as expected. Note that
        -					// we could use a single line of jQuery to do this, but the DOM
        -					// method used here is much faster http://jsperf.com/html-decode
        -					if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
        -						__filter_div.innerHTML = cellData;
        -						cellData = __filter_div_textContent ?
        -							__filter_div.textContent :
        -							__filter_div.innerText;
        -					}
        -	
        -					if ( cellData.replace ) {
        -						cellData = cellData.replace(/[\r\n]/g, '');
        -					}
        -	
        -					filterData.push( cellData );
        -				}
        -	
        -				row._aFilterData = filterData;
        -				row._sFilterRow = filterData.join('  ');
        -				wasInvalidated = true;
        -			}
        -		}
        -	
        -		return wasInvalidated;
        -	}
        -	
        -	
        -	/**
        -	 * Convert from the internal Hungarian notation to camelCase for external
        -	 * interaction
        -	 *  @param {object} obj Object to convert
        -	 *  @returns {object} Inverted object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSearchToCamel ( obj )
        -	{
        -		return {
        -			search:          obj.sSearch,
        -			smart:           obj.bSmart,
        -			regex:           obj.bRegex,
        -			caseInsensitive: obj.bCaseInsensitive
        -		};
        -	}
        -	
        -	
        -	
        -	/**
        -	 * Convert from camelCase notation to the internal Hungarian. We could use the
        -	 * Hungarian convert function here, but this is cleaner
        -	 *  @param {object} obj Object to convert
        -	 *  @returns {object} Inverted object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSearchToHung ( obj )
        -	{
        -		return {
        -			sSearch:          obj.search,
        -			bSmart:           obj.smart,
        -			bRegex:           obj.regex,
        -			bCaseInsensitive: obj.caseInsensitive
        -		};
        -	}
        -	
        -	/**
        -	 * Generate the node required for the info display
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @returns {node} Information element
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFeatureHtmlInfo ( settings )
        -	{
        -		var
        -			tid = settings.sTableId,
        -			nodes = settings.aanFeatures.i,
        -			n = $('<div/>', {
        -				'class': settings.oClasses.sInfo,
        -				'id': ! nodes ? tid+'_info' : null
        -			} );
        -	
        -		if ( ! nodes ) {
        -			// Update display on each draw
        -			settings.aoDrawCallback.push( {
        -				"fn": _fnUpdateInfo,
        -				"sName": "information"
        -			} );
        -	
        -			n
        -				.attr( 'role', 'status' )
        -				.attr( 'aria-live', 'polite' );
        -	
        -			// Table is described by our info div
        -			$(settings.nTable).attr( 'aria-describedby', tid+'_info' );
        -		}
        -	
        -		return n[0];
        -	}
        -	
        -	
        -	/**
        -	 * Update the information elements in the display
        -	 *  @param {object} settings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnUpdateInfo ( settings )
        -	{
        -		/* Show information about the table */
        -		var nodes = settings.aanFeatures.i;
        -		if ( nodes.length === 0 ) {
        -			return;
        -		}
        -	
        -		var
        -			lang  = settings.oLanguage,
        -			start = settings._iDisplayStart+1,
        -			end   = settings.fnDisplayEnd(),
        -			max   = settings.fnRecordsTotal(),
        -			total = settings.fnRecordsDisplay(),
        -			out   = total ?
        -				lang.sInfo :
        -				lang.sInfoEmpty;
        -	
        -		if ( total !== max ) {
        -			/* Record set after filtering */
        -			out += ' ' + lang.sInfoFiltered;
        -		}
        -	
        -		// Convert the macros
        -		out += lang.sInfoPostFix;
        -		out = _fnInfoMacros( settings, out );
        -	
        -		var callback = lang.fnInfoCallback;
        -		if ( callback !== null ) {
        -			out = callback.call( settings.oInstance,
        -				settings, start, end, max, total, out
        -			);
        -		}
        -	
        -		$(nodes).html( out );
        -	}
        -	
        -	
        -	function _fnInfoMacros ( settings, str )
        -	{
        -		// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
        -		// internally
        -		var
        -			formatter  = settings.fnFormatNumber,
        -			start      = settings._iDisplayStart+1,
        -			len        = settings._iDisplayLength,
        -			vis        = settings.fnRecordsDisplay(),
        -			all        = len === -1;
        -	
        -		return str.
        -			replace(/_START_/g, formatter.call( settings, start ) ).
        -			replace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).
        -			replace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).
        -			replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
        -			replace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
        -			replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
        -	}
        -	
        -	
        -	
        -	/**
        -	 * Draw the table for the first time, adding all required features
        -	 *  @param {object} settings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnInitialise ( settings )
        -	{
        -		var i, iLen, iAjaxStart=settings.iInitDisplayStart;
        -		var columns = settings.aoColumns, column;
        -		var features = settings.oFeatures;
        -	
        -		/* Ensure that the table data is fully initialised */
        -		if ( ! settings.bInitialised ) {
        -			setTimeout( function(){ _fnInitialise( settings ); }, 200 );
        -			return;
        -		}
        -	
        -		/* Show the display HTML options */
        -		_fnAddOptionsHtml( settings );
        -	
        -		/* Build and draw the header / footer for the table */
        -		_fnBuildHead( settings );
        -		_fnDrawHead( settings, settings.aoHeader );
        -		_fnDrawHead( settings, settings.aoFooter );
        -	
        -		/* Okay to show that something is going on now */
        -		_fnProcessingDisplay( settings, true );
        -	
        -		/* Calculate sizes for columns */
        -		if ( features.bAutoWidth ) {
        -			_fnCalculateColumnWidths( settings );
        -		}
        -	
        -		for ( i=0, iLen=columns.length ; i<iLen ; i++ ) {
        -			column = columns[i];
        -	
        -			if ( column.sWidth ) {
        -				column.nTh.style.width = _fnStringToCss( column.sWidth );
        -			}
        -		}
        -	
        -		// If there is default sorting required - let's do it. The sort function
        -		// will do the drawing for us. Otherwise we draw the table regardless of the
        -		// Ajax source - this allows the table to look initialised for Ajax sourcing
        -		// data (show 'loading' message possibly)
        -		_fnReDraw( settings );
        -	
        -		// Server-side processing init complete is done by _fnAjaxUpdateDraw
        -		var dataSrc = _fnDataSource( settings );
        -		if ( dataSrc != 'ssp' ) {
        -			// if there is an ajax source load the data
        -			if ( dataSrc == 'ajax' ) {
        -				_fnBuildAjax( settings, [], function(json) {
        -					var aData = _fnAjaxDataSrc( settings, json );
        -	
        -					// Got the data - add it to the table
        -					for ( i=0 ; i<aData.length ; i++ ) {
        -						_fnAddData( settings, aData[i] );
        -					}
        -	
        -					// Reset the init display for cookie saving. We've already done
        -					// a filter, and therefore cleared it before. So we need to make
        -					// it appear 'fresh'
        -					settings.iInitDisplayStart = iAjaxStart;
        -	
        -					_fnReDraw( settings );
        -	
        -					_fnProcessingDisplay( settings, false );
        -					_fnInitComplete( settings, json );
        -				}, settings );
        -			}
        -			else {
        -				_fnProcessingDisplay( settings, false );
        -				_fnInitComplete( settings );
        -			}
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Draw the table for the first time, adding all required features
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
        -	 *    with client-side processing (optional)
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnInitComplete ( settings, json )
        -	{
        -		settings._bInitComplete = true;
        -	
        -		// On an Ajax load we now have data and therefore want to apply the column
        -		// sizing
        -		if ( json ) {
        -			_fnAdjustColumnSizing( settings );
        -		}
        -	
        -		_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );
        -	}
        -	
        -	
        -	function _fnLengthChange ( settings, val )
        -	{
        -		var len = parseInt( val, 10 );
        -		settings._iDisplayLength = len;
        -	
        -		_fnLengthOverflow( settings );
        -	
        -		// Fire length change event
        -		_fnCallbackFire( settings, null, 'length', [settings, len] );
        -	}
        -	
        -	
        -	/**
        -	 * Generate the node required for user display length changing
        -	 *  @param {object} settings dataTables settings object
        -	 *  @returns {node} Display length feature node
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFeatureHtmlLength ( settings )
        -	{
        -		var
        -			classes  = settings.oClasses,
        -			tableId  = settings.sTableId,
        -			menu     = settings.aLengthMenu,
        -			d2       = $.isArray( menu[0] ),
        -			lengths  = d2 ? menu[0] : menu,
        -			language = d2 ? menu[1] : menu;
        -	
        -		var select = $('<select/>', {
        -			'name':          tableId+'_length',
        -			'aria-controls': tableId,
        -			'class':         classes.sLengthSelect
        -		} );
        -	
        -		for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
        -			select[0][ i ] = new Option( language[i], lengths[i] );
        -		}
        -	
        -		var div = $('<div><label/></div>').addClass( classes.sLength );
        -		if ( ! settings.aanFeatures.l ) {
        -			div[0].id = tableId+'_length';
        -		}
        -	
        -		div.children().append(
        -			settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
        -		);
        -	
        -		// Can't use `select` variable as user might provide their own and the
        -		// reference is broken by the use of outerHTML
        -		$('select', div)
        -			.val( settings._iDisplayLength )
        -			.bind( 'change.DT', function(e) {
        -				_fnLengthChange( settings, $(this).val() );
        -				_fnDraw( settings );
        -			} );
        -	
        -		// Update node value whenever anything changes the table's length
        -		$(settings.nTable).bind( 'length.dt.DT', function (e, s, len) {
        -			if ( settings === s ) {
        -				$('select', div).val( len );
        -			}
        -		} );
        -	
        -		return div[0];
        -	}
        -	
        -	
        -	
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Note that most of the paging logic is done in
        -	 * DataTable.ext.pager
        -	 */
        -	
        -	/**
        -	 * Generate the node required for default pagination
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @returns {node} Pagination feature node
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFeatureHtmlPaginate ( settings )
        -	{
        -		var
        -			type   = settings.sPaginationType,
        -			plugin = DataTable.ext.pager[ type ],
        -			modern = typeof plugin === 'function',
        -			redraw = function( settings ) {
        -				_fnDraw( settings );
        -			},
        -			node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],
        -			features = settings.aanFeatures;
        -	
        -		if ( ! modern ) {
        -			plugin.fnInit( settings, node, redraw );
        -		}
        -	
        -		/* Add a draw callback for the pagination on first instance, to update the paging display */
        -		if ( ! features.p )
        -		{
        -			node.id = settings.sTableId+'_paginate';
        -	
        -			settings.aoDrawCallback.push( {
        -				"fn": function( settings ) {
        -					if ( modern ) {
        -						var
        -							start      = settings._iDisplayStart,
        -							len        = settings._iDisplayLength,
        -							visRecords = settings.fnRecordsDisplay(),
        -							all        = len === -1,
        -							page = all ? 0 : Math.ceil( start / len ),
        -							pages = all ? 1 : Math.ceil( visRecords / len ),
        -							buttons = plugin(page, pages),
        -							i, ien;
        -	
        -						for ( i=0, ien=features.p.length ; i<ien ; i++ ) {
        -							_fnRenderer( settings, 'pageButton' )(
        -								settings, features.p[i], i, buttons, page, pages
        -							);
        -						}
        -					}
        -					else {
        -						plugin.fnUpdate( settings, redraw );
        -					}
        -				},
        -				"sName": "pagination"
        -			} );
        -		}
        -	
        -		return node;
        -	}
        -	
        -	
        -	/**
        -	 * Alter the display settings to change the page
        -	 *  @param {object} settings DataTables settings object
        -	 *  @param {string|int} action Paging action to take: "first", "previous",
        -	 *    "next" or "last" or page number to jump to (integer)
        -	 *  @param [bool] redraw Automatically draw the update or not
        -	 *  @returns {bool} true page has changed, false - no change
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnPageChange ( settings, action, redraw )
        -	{
        -		var
        -			start     = settings._iDisplayStart,
        -			len       = settings._iDisplayLength,
        -			records   = settings.fnRecordsDisplay();
        -	
        -		if ( records === 0 || len === -1 )
        -		{
        -			start = 0;
        -		}
        -		else if ( typeof action === "number" )
        -		{
        -			start = action * len;
        -	
        -			if ( start > records )
        -			{
        -				start = 0;
        -			}
        -		}
        -		else if ( action == "first" )
        -		{
        -			start = 0;
        -		}
        -		else if ( action == "previous" )
        -		{
        -			start = len >= 0 ?
        -				start - len :
        -				0;
        -	
        -			if ( start < 0 )
        -			{
        -			  start = 0;
        -			}
        -		}
        -		else if ( action == "next" )
        -		{
        -			if ( start + len < records )
        -			{
        -				start += len;
        -			}
        -		}
        -		else if ( action == "last" )
        -		{
        -			start = Math.floor( (records-1) / len) * len;
        -		}
        -		else
        -		{
        -			_fnLog( settings, 0, "Unknown paging action: "+action, 5 );
        -		}
        -	
        -		var changed = settings._iDisplayStart !== start;
        -		settings._iDisplayStart = start;
        -	
        -		if ( changed ) {
        -			_fnCallbackFire( settings, null, 'page', [settings] );
        -	
        -			if ( redraw ) {
        -				_fnDraw( settings );
        -			}
        -		}
        -	
        -		return changed;
        -	}
        -	
        -	
        -	
        -	/**
        -	 * Generate the node required for the processing node
        -	 *  @param {object} settings dataTables settings object
        -	 *  @returns {node} Processing element
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFeatureHtmlProcessing ( settings )
        -	{
        -		return $('<div/>', {
        -				'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
        -				'class': settings.oClasses.sProcessing
        -			} )
        -			.html( settings.oLanguage.sProcessing )
        -			.insertBefore( settings.nTable )[0];
        -	}
        -	
        -	
        -	/**
        -	 * Display or hide the processing indicator
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {bool} show Show the processing indicator (true) or not (false)
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnProcessingDisplay ( settings, show )
        -	{
        -		if ( settings.oFeatures.bProcessing ) {
        -			$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
        -		}
        -	
        -		_fnCallbackFire( settings, null, 'processing', [settings, show] );
        -	}
        -	
        -	/**
        -	 * Add any control elements for the table - specifically scrolling
        -	 *  @param {object} settings dataTables settings object
        -	 *  @returns {node} Node to add to the DOM
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnFeatureHtmlTable ( settings )
        -	{
        -		var table = $(settings.nTable);
        -	
        -		// Add the ARIA grid role to the table
        -		table.attr( 'role', 'grid' );
        -	
        -		// Scrolling from here on in
        -		var scroll = settings.oScroll;
        -	
        -		if ( scroll.sX === '' && scroll.sY === '' ) {
        -			return settings.nTable;
        -		}
        -	
        -		var scrollX = scroll.sX;
        -		var scrollY = scroll.sY;
        -		var classes = settings.oClasses;
        -		var caption = table.children('caption');
        -		var captionSide = caption.length ? caption[0]._captionSide : null;
        -		var headerClone = $( table[0].cloneNode(false) );
        -		var footerClone = $( table[0].cloneNode(false) );
        -		var footer = table.children('tfoot');
        -		var _div = '<div/>';
        -		var size = function ( s ) {
        -			return !s ? null : _fnStringToCss( s );
        -		};
        -	
        -		// This is fairly messy, but with x scrolling enabled, if the table has a
        -		// width attribute, regardless of any width applied using the column width
        -		// options, the browser will shrink or grow the table as needed to fit into
        -		// that 100%. That would make the width options useless. So we remove it.
        -		// This is okay, under the assumption that width:100% is applied to the
        -		// table in CSS (it is in the default stylesheet) which will set the table
        -		// width as appropriate (the attribute and css behave differently...)
        -		if ( scroll.sX && table.attr('width') === '100%' ) {
        -			table.removeAttr('width');
        -		}
        -	
        -		if ( ! footer.length ) {
        -			footer = null;
        -		}
        -	
        -		/*
        -		 * The HTML structure that we want to generate in this function is:
        -		 *  div - scroller
        -		 *    div - scroll head
        -		 *      div - scroll head inner
        -		 *        table - scroll head table
        -		 *          thead - thead
        -		 *    div - scroll body
        -		 *      table - table (master table)
        -		 *        thead - thead clone for sizing
        -		 *        tbody - tbody
        -		 *    div - scroll foot
        -		 *      div - scroll foot inner
        -		 *        table - scroll foot table
        -		 *          tfoot - tfoot
        -		 */
        -		var scroller = $( _div, { 'class': classes.sScrollWrapper } )
        -			.append(
        -				$(_div, { 'class': classes.sScrollHead } )
        -					.css( {
        -						overflow: 'hidden',
        -						position: 'relative',
        -						border: 0,
        -						width: scrollX ? size(scrollX) : '100%'
        -					} )
        -					.append(
        -						$(_div, { 'class': classes.sScrollHeadInner } )
        -							.css( {
        -								'box-sizing': 'content-box',
        -								width: scroll.sXInner || '100%'
        -							} )
        -							.append(
        -								headerClone
        -									.removeAttr('id')
        -									.css( 'margin-left', 0 )
        -									.append( captionSide === 'top' ? caption : null )
        -									.append(
        -										table.children('thead')
        -									)
        -							)
        -					)
        -			)
        -			.append(
        -				$(_div, { 'class': classes.sScrollBody } )
        -					.css( {
        -						overflow: 'auto',
        -						height: size( scrollY ),
        -						width: size( scrollX )
        -					} )
        -					.append( table )
        -			);
        -	
        -		if ( footer ) {
        -			scroller.append(
        -				$(_div, { 'class': classes.sScrollFoot } )
        -					.css( {
        -						overflow: 'hidden',
        -						border: 0,
        -						width: scrollX ? size(scrollX) : '100%'
        -					} )
        -					.append(
        -						$(_div, { 'class': classes.sScrollFootInner } )
        -							.append(
        -								footerClone
        -									.removeAttr('id')
        -									.css( 'margin-left', 0 )
        -									.append( captionSide === 'bottom' ? caption : null )
        -									.append(
        -										table.children('tfoot')
        -									)
        -							)
        -					)
        -			);
        -		}
        -	
        -		var children = scroller.children();
        -		var scrollHead = children[0];
        -		var scrollBody = children[1];
        -		var scrollFoot = footer ? children[2] : null;
        -	
        -		// When the body is scrolled, then we also want to scroll the headers
        -		if ( scrollX ) {
        -			$(scrollBody).on( 'scroll.DT', function (e) {
        -				var scrollLeft = this.scrollLeft;
        -	
        -				scrollHead.scrollLeft = scrollLeft;
        -	
        -				if ( footer ) {
        -					scrollFoot.scrollLeft = scrollLeft;
        -				}
        -			} );
        -		}
        -	
        -		settings.nScrollHead = scrollHead;
        -		settings.nScrollBody = scrollBody;
        -		settings.nScrollFoot = scrollFoot;
        -	
        -		// On redraw - align columns
        -		settings.aoDrawCallback.push( {
        -			"fn": _fnScrollDraw,
        -			"sName": "scrolling"
        -		} );
        -	
        -		return scroller[0];
        -	}
        -	
        -	
        -	
        -	/**
        -	 * Update the header, footer and body tables for resizing - i.e. column
        -	 * alignment.
        -	 *
        -	 * Welcome to the most horrible function DataTables. The process that this
        -	 * function follows is basically:
        -	 *   1. Re-create the table inside the scrolling div
        -	 *   2. Take live measurements from the DOM
        -	 *   3. Apply the measurements to align the columns
        -	 *   4. Clean up
        -	 *
        -	 *  @param {object} settings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnScrollDraw ( settings )
        -	{
        -		// Given that this is such a monster function, a lot of variables are use
        -		// to try and keep the minimised size as small as possible
        -		var
        -			scroll         = settings.oScroll,
        -			scrollX        = scroll.sX,
        -			scrollXInner   = scroll.sXInner,
        -			scrollY        = scroll.sY,
        -			barWidth       = scroll.iBarWidth,
        -			divHeader      = $(settings.nScrollHead),
        -			divHeaderStyle = divHeader[0].style,
        -			divHeaderInner = divHeader.children('div'),
        -			divHeaderInnerStyle = divHeaderInner[0].style,
        -			divHeaderTable = divHeaderInner.children('table'),
        -			divBodyEl      = settings.nScrollBody,
        -			divBody        = $(divBodyEl),
        -			divBodyStyle   = divBodyEl.style,
        -			divFooter      = $(settings.nScrollFoot),
        -			divFooterInner = divFooter.children('div'),
        -			divFooterTable = divFooterInner.children('table'),
        -			header         = $(settings.nTHead),
        -			table          = $(settings.nTable),
        -			tableEl        = table[0],
        -			tableStyle     = tableEl.style,
        -			footer         = settings.nTFoot ? $(settings.nTFoot) : null,
        -			browser        = settings.oBrowser,
        -			ie67           = browser.bScrollOversize,
        -			headerTrgEls, footerTrgEls,
        -			headerSrcEls, footerSrcEls,
        -			headerCopy, footerCopy,
        -			headerWidths=[], footerWidths=[],
        -			headerContent=[],
        -			idx, correction, sanityWidth,
        -			zeroOut = function(nSizer) {
        -				var style = nSizer.style;
        -				style.paddingTop = "0";
        -				style.paddingBottom = "0";
        -				style.borderTopWidth = "0";
        -				style.borderBottomWidth = "0";
        -				style.height = 0;
        -			};
        -	
        -		/*
        -		 * 1. Re-create the table inside the scrolling div
        -		 */
        -	
        -		// Remove the old minimised thead and tfoot elements in the inner table
        -		table.children('thead, tfoot').remove();
        -	
        -		// Clone the current header and footer elements and then place it into the inner table
        -		headerCopy = header.clone().prependTo( table );
        -		headerTrgEls = header.find('tr'); // original header is in its own table
        -		headerSrcEls = headerCopy.find('tr');
        -		headerCopy.find('th, td').removeAttr('tabindex');
        -	
        -		if ( footer ) {
        -			footerCopy = footer.clone().prependTo( table );
        -			footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
        -			footerSrcEls = footerCopy.find('tr');
        -		}
        -	
        -	
        -		/*
        -		 * 2. Take live measurements from the DOM - do not alter the DOM itself!
        -		 */
        -	
        -		// Remove old sizing and apply the calculated column widths
        -		// Get the unique column headers in the newly created (cloned) header. We want to apply the
        -		// calculated sizes to this header
        -		if ( ! scrollX )
        -		{
        -			divBodyStyle.width = '100%';
        -			divHeader[0].style.width = '100%';
        -		}
        -	
        -		$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
        -			idx = _fnVisibleToColumnIndex( settings, i );
        -			el.style.width = settings.aoColumns[idx].sWidth;
        -		} );
        -	
        -		if ( footer ) {
        -			_fnApplyToChildren( function(n) {
        -				n.style.width = "";
        -			}, footerSrcEls );
        -		}
        -	
        -		// If scroll collapse is enabled, when we put the headers back into the body for sizing, we
        -		// will end up forcing the scrollbar to appear, making our measurements wrong for when we
        -		// then hide it (end of this function), so add the header height to the body scroller.
        -		if ( scroll.bCollapse && scrollY !== "" ) {
        -			divBodyStyle.height = (divBody[0].offsetHeight + header[0].offsetHeight)+"px";
        -		}
        -	
        -		// Size the table as a whole
        -		sanityWidth = table.outerWidth();
        -		if ( scrollX === "" ) {
        -			// No x scrolling
        -			tableStyle.width = "100%";
        -	
        -			// IE7 will make the width of the table when 100% include the scrollbar
        -			// - which is shouldn't. When there is a scrollbar we need to take this
        -			// into account.
        -			if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
        -				divBody.css('overflow-y') == "scroll")
        -			) {
        -				tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
        -			}
        -		}
        -		else
        -		{
        -			// x scrolling
        -			if ( scrollXInner !== "" ) {
        -				// x scroll inner has been given - use it
        -				tableStyle.width = _fnStringToCss(scrollXInner);
        -			}
        -			else if ( sanityWidth == divBody.width() && divBody.height() < table.height() ) {
        -				// There is y-scrolling - try to take account of the y scroll bar
        -				tableStyle.width = _fnStringToCss( sanityWidth-barWidth );
        -				if ( table.outerWidth() > sanityWidth-barWidth ) {
        -					// Not possible to take account of it
        -					tableStyle.width = _fnStringToCss( sanityWidth );
        -				}
        -			}
        -			else {
        -				// When all else fails
        -				tableStyle.width = _fnStringToCss( sanityWidth );
        -			}
        -		}
        -	
        -		// Recalculate the sanity width - now that we've applied the required width,
        -		// before it was a temporary variable. This is required because the column
        -		// width calculation is done before this table DOM is created.
        -		sanityWidth = table.outerWidth();
        -	
        -		// Hidden header should have zero height, so remove padding and borders. Then
        -		// set the width based on the real headers
        -	
        -		// Apply all styles in one pass
        -		_fnApplyToChildren( zeroOut, headerSrcEls );
        -	
        -		// Read all widths in next pass
        -		_fnApplyToChildren( function(nSizer) {
        -			headerContent.push( nSizer.innerHTML );
        -			headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
        -		}, headerSrcEls );
        -	
        -		// Apply all widths in final pass
        -		_fnApplyToChildren( function(nToSize, i) {
        -			nToSize.style.width = headerWidths[i];
        -		}, headerTrgEls );
        -	
        -		$(headerSrcEls).height(0);
        -	
        -		/* Same again with the footer if we have one */
        -		if ( footer )
        -		{
        -			_fnApplyToChildren( zeroOut, footerSrcEls );
        -	
        -			_fnApplyToChildren( function(nSizer) {
        -				footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
        -			}, footerSrcEls );
        -	
        -			_fnApplyToChildren( function(nToSize, i) {
        -				nToSize.style.width = footerWidths[i];
        -			}, footerTrgEls );
        -	
        -			$(footerSrcEls).height(0);
        -		}
        -	
        -	
        -		/*
        -		 * 3. Apply the measurements
        -		 */
        -	
        -		// "Hide" the header and footer that we used for the sizing. We need to keep
        -		// the content of the cell so that the width applied to the header and body
        -		// both match, but we want to hide it completely. We want to also fix their
        -		// width to what they currently are
        -		_fnApplyToChildren( function(nSizer, i) {
        -			nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+headerContent[i]+'</div>';
        -			nSizer.style.width = headerWidths[i];
        -		}, headerSrcEls );
        -	
        -		if ( footer )
        -		{
        -			_fnApplyToChildren( function(nSizer, i) {
        -				nSizer.innerHTML = "";
        -				nSizer.style.width = footerWidths[i];
        -			}, footerSrcEls );
        -		}
        -	
        -		// Sanity check that the table is of a sensible width. If not then we are going to get
        -		// misalignment - try to prevent this by not allowing the table to shrink below its min width
        -		if ( table.outerWidth() < sanityWidth )
        -		{
        -			// The min width depends upon if we have a vertical scrollbar visible or not */
        -			correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
        -				divBody.css('overflow-y') == "scroll")) ?
        -					sanityWidth+barWidth :
        -					sanityWidth;
        -	
        -			// IE6/7 are a law unto themselves...
        -			if ( ie67 && (divBodyEl.scrollHeight >
        -				divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
        -			) {
        -				tableStyle.width = _fnStringToCss( correction-barWidth );
        -			}
        -	
        -			// And give the user a warning that we've stopped the table getting too small
        -			if ( scrollX === "" || scrollXInner !== "" ) {
        -				_fnLog( settings, 1, 'Possible column misalignment', 6 );
        -			}
        -		}
        -		else
        -		{
        -			correction = '100%';
        -		}
        -	
        -		// Apply to the container elements
        -		divBodyStyle.width = _fnStringToCss( correction );
        -		divHeaderStyle.width = _fnStringToCss( correction );
        -	
        -		if ( footer ) {
        -			settings.nScrollFoot.style.width = _fnStringToCss( correction );
        -		}
        -	
        -	
        -		/*
        -		 * 4. Clean up
        -		 */
        -		if ( ! scrollY ) {
        -			/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
        -			 * the scrollbar height from the visible display, rather than adding it on. We need to
        -			 * set the height in order to sort this. Don't want to do it in any other browsers.
        -			 */
        -			if ( ie67 ) {
        -				divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
        -			}
        -		}
        -	
        -		if ( scrollY && scroll.bCollapse ) {
        -			divBodyStyle.height = _fnStringToCss( scrollY );
        -	
        -			var iExtra = (scrollX && tableEl.offsetWidth > divBodyEl.offsetWidth) ?
        -				barWidth :
        -				0;
        -	
        -			if ( tableEl.offsetHeight < divBodyEl.offsetHeight ) {
        -				divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+iExtra );
        -			}
        -		}
        -	
        -		/* Finally set the width's of the header and footer tables */
        -		var iOuterWidth = table.outerWidth();
        -		divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
        -		divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
        -	
        -		// Figure out if there are scrollbar present - if so then we need a the header and footer to
        -		// provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
        -		var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
        -		var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
        -		divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
        -	
        -		if ( footer ) {
        -			divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
        -			divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
        -			divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
        -		}
        -	
        -		/* Adjust the position of the header in case we loose the y-scrollbar */
        -		divBody.scroll();
        -	
        -		// If sorting or filtering has occurred, jump the scrolling back to the top
        -		// only if we aren't holding the position
        -		if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
        -			divBodyEl.scrollTop = 0;
        -		}
        -	}
        -	
        -	
        -	
        -	/**
        -	 * Apply a given function to the display child nodes of an element array (typically
        -	 * TD children of TR rows
        -	 *  @param {function} fn Method to apply to the objects
        -	 *  @param array {nodes} an1 List of elements to look through for display children
        -	 *  @param array {nodes} an2 Another list (identical structure to the first) - optional
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnApplyToChildren( fn, an1, an2 )
        -	{
        -		var index=0, i=0, iLen=an1.length;
        -		var nNode1, nNode2;
        -	
        -		while ( i < iLen ) {
        -			nNode1 = an1[i].firstChild;
        -			nNode2 = an2 ? an2[i].firstChild : null;
        -	
        -			while ( nNode1 ) {
        -				if ( nNode1.nodeType === 1 ) {
        -					if ( an2 ) {
        -						fn( nNode1, nNode2, index );
        -					}
        -					else {
        -						fn( nNode1, index );
        -					}
        -	
        -					index++;
        -				}
        -	
        -				nNode1 = nNode1.nextSibling;
        -				nNode2 = an2 ? nNode2.nextSibling : null;
        -			}
        -	
        -			i++;
        -		}
        -	}
        -	
        -	
        -	
        -	var __re_html_remove = /<.*?>/g;
        -	
        -	
        -	/**
        -	 * Calculate the width of columns for the table
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnCalculateColumnWidths ( oSettings )
        -	{
        -		var
        -			table = oSettings.nTable,
        -			columns = oSettings.aoColumns,
        -			scroll = oSettings.oScroll,
        -			scrollY = scroll.sY,
        -			scrollX = scroll.sX,
        -			scrollXInner = scroll.sXInner,
        -			columnCount = columns.length,
        -			visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
        -			headerCells = $('th', oSettings.nTHead),
        -			tableWidthAttr = table.getAttribute('width'), // from DOM element
        -			tableContainer = table.parentNode,
        -			userInputs = false,
        -			i, column, columnIdx, width, outerWidth;
        -	
        -		var styleWidth = table.style.width;
        -		if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
        -			tableWidthAttr = styleWidth;
        -		}
        -	
        -		/* Convert any user input sizes into pixel sizes */
        -		for ( i=0 ; i<visibleColumns.length ; i++ ) {
        -			column = columns[ visibleColumns[i] ];
        -	
        -			if ( column.sWidth !== null ) {
        -				column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );
        -	
        -				userInputs = true;
        -			}
        -		}
        -	
        -		/* If the number of columns in the DOM equals the number that we have to
        -		 * process in DataTables, then we can use the offsets that are created by
        -		 * the web- browser. No custom sizes can be set in order for this to happen,
        -		 * nor scrolling used
        -		 */
        -		if ( ! userInputs && ! scrollX && ! scrollY &&
        -		    columnCount == _fnVisbleColumns( oSettings ) &&
        -			columnCount == headerCells.length
        -		) {
        -			for ( i=0 ; i<columnCount ; i++ ) {
        -				columns[i].sWidth = _fnStringToCss( headerCells.eq(i).width() );
        -			}
        -		}
        -		else
        -		{
        -			// Otherwise construct a single row, worst case, table with the widest
        -			// node in the data, assign any user defined widths, then insert it into
        -			// the DOM and allow the browser to do all the hard work of calculating
        -			// table widths
        -			var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table
        -				.css( 'visibility', 'hidden' )
        -				.removeAttr( 'id' );
        -	
        -			// Clean up the table body
        -			tmpTable.find('tbody tr').remove();
        -			var tr = $('<tr/>').appendTo( tmpTable.find('tbody') );
        -	
        -			// Remove any assigned widths from the footer (from scrolling)
        -			tmpTable.find('tfoot th, tfoot td').css('width', '');
        -	
        -			// Apply custom sizing to the cloned header
        -			headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
        -	
        -			for ( i=0 ; i<visibleColumns.length ; i++ ) {
        -				column = columns[ visibleColumns[i] ];
        -	
        -				headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?
        -					_fnStringToCss( column.sWidthOrig ) :
        -					'';
        -			}
        -	
        -			// Find the widest cell for each column and put it into the table
        -			if ( oSettings.aoData.length ) {
        -				for ( i=0 ; i<visibleColumns.length ; i++ ) {
        -					columnIdx = visibleColumns[i];
        -					column = columns[ columnIdx ];
        -	
        -					$( _fnGetWidestNode( oSettings, columnIdx ) )
        -						.clone( false )
        -						.append( column.sContentPadding )
        -						.appendTo( tr );
        -				}
        -			}
        -	
        -			// Table has been built, attach to the document so we can work with it
        -			tmpTable.appendTo( tableContainer );
        -	
        -			// When scrolling (X or Y) we want to set the width of the table as 
        -			// appropriate. However, when not scrolling leave the table width as it
        -			// is. This results in slightly different, but I think correct behaviour
        -			if ( scrollX && scrollXInner ) {
        -				tmpTable.width( scrollXInner );
        -			}
        -			else if ( scrollX ) {
        -				tmpTable.css( 'width', 'auto' );
        -	
        -				if ( tmpTable.width() < tableContainer.offsetWidth ) {
        -					tmpTable.width( tableContainer.offsetWidth );
        -				}
        -			}
        -			else if ( scrollY ) {
        -				tmpTable.width( tableContainer.offsetWidth );
        -			}
        -			else if ( tableWidthAttr ) {
        -				tmpTable.width( tableWidthAttr );
        -			}
        -	
        -			// Take into account the y scrollbar
        -			_fnScrollingWidthAdjust( oSettings, tmpTable[0] );
        -	
        -			// Browsers need a bit of a hand when a width is assigned to any columns
        -			// when x-scrolling as they tend to collapse the table to the min-width,
        -			// even if we sent the column widths. So we need to keep track of what
        -			// the table width should be by summing the user given values, and the
        -			// automatic values
        -			if ( scrollX )
        -			{
        -				var total = 0;
        -	
        -				for ( i=0 ; i<visibleColumns.length ; i++ ) {
        -					column = columns[ visibleColumns[i] ];
        -					outerWidth = $(headerCells[i]).outerWidth();
        -	
        -					total += column.sWidthOrig === null ?
        -						outerWidth :
        -						parseInt( column.sWidth, 10 ) + outerWidth - $(headerCells[i]).width();
        -				}
        -	
        -				tmpTable.width( _fnStringToCss( total ) );
        -				table.style.width = _fnStringToCss( total );
        -			}
        -	
        -			// Get the width of each column in the constructed table
        -			for ( i=0 ; i<visibleColumns.length ; i++ ) {
        -				column = columns[ visibleColumns[i] ];
        -				width = $(headerCells[i]).width();
        -	
        -				if ( width ) {
        -					column.sWidth = _fnStringToCss( width );
        -				}
        -			}
        -	
        -			table.style.width = _fnStringToCss( tmpTable.css('width') );
        -	
        -			// Finished with the table - ditch it
        -			tmpTable.remove();
        -		}
        -	
        -		// If there is a width attr, we want to attach an event listener which
        -		// allows the table sizing to automatically adjust when the window is
        -		// resized. Use the width attr rather than CSS, since we can't know if the
        -		// CSS is a relative value or absolute - DOM read is always px.
        -		if ( tableWidthAttr ) {
        -			table.style.width = _fnStringToCss( tableWidthAttr );
        -		}
        -	
        -		if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {
        -			var bindResize = function () {
        -				$(window).bind('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {
        -					_fnAdjustColumnSizing( oSettings );
        -				} ) );
        -			};
        -	
        -			// IE6/7 will crash if we bind a resize event handler on page load.
        -			// To be removed in 1.11 which drops IE6/7 support
        -			if ( oSettings.oBrowser.bScrollOversize ) {
        -				setTimeout( bindResize, 1000 );
        -			}
        -			else {
        -				bindResize();
        -			}
        -	
        -			oSettings._reszEvt = true;
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Throttle the calls to a function. Arguments and context are maintained for
        -	 * the throttled function
        -	 *  @param {function} fn Function to be called
        -	 *  @param {int} [freq=200] call frequency in mS
        -	 *  @returns {function} wrapped function
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnThrottle( fn, freq ) {
        -		var
        -			frequency = freq !== undefined ? freq : 200,
        -			last,
        -			timer;
        -	
        -		return function () {
        -			var
        -				that = this,
        -				now  = +new Date(),
        -				args = arguments;
        -	
        -			if ( last && now < last + frequency ) {
        -				clearTimeout( timer );
        -	
        -				timer = setTimeout( function () {
        -					last = undefined;
        -					fn.apply( that, args );
        -				}, frequency );
        -			}
        -			else {
        -				last = now;
        -				fn.apply( that, args );
        -			}
        -		};
        -	}
        -	
        -	
        -	/**
        -	 * Convert a CSS unit width to pixels (e.g. 2em)
        -	 *  @param {string} width width to be converted
        -	 *  @param {node} parent parent to get the with for (required for relative widths) - optional
        -	 *  @returns {int} width in pixels
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnConvertToWidth ( width, parent )
        -	{
        -		if ( ! width ) {
        -			return 0;
        -		}
        -	
        -		var n = $('<div/>')
        -			.css( 'width', _fnStringToCss( width ) )
        -			.appendTo( parent || document.body );
        -	
        -		var val = n[0].offsetWidth;
        -		n.remove();
        -	
        -		return val;
        -	}
        -	
        -	
        -	/**
        -	 * Adjust a table's width to take account of vertical scroll bar
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {node} n table node
        -	 *  @memberof DataTable#oApi
        -	 */
        -	
        -	function _fnScrollingWidthAdjust ( settings, n )
        -	{
        -		var scroll = settings.oScroll;
        -	
        -		if ( scroll.sX || scroll.sY ) {
        -			// When y-scrolling only, we want to remove the width of the scroll bar
        -			// so the table + scroll bar will fit into the area available, otherwise
        -			// we fix the table at its current size with no adjustment
        -			var correction = ! scroll.sX ? scroll.iBarWidth : 0;
        -			n.style.width = _fnStringToCss( $(n).outerWidth() - correction );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Get the widest node
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {int} colIdx column of interest
        -	 *  @returns {node} widest table node
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnGetWidestNode( settings, colIdx )
        -	{
        -		var idx = _fnGetMaxLenString( settings, colIdx );
        -		if ( idx < 0 ) {
        -			return null;
        -		}
        -	
        -		var data = settings.aoData[ idx ];
        -		return ! data.nTr ? // Might not have been created when deferred rendering
        -			$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
        -			data.anCells[ colIdx ];
        -	}
        -	
        -	
        -	/**
        -	 * Get the maximum strlen for each data column
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {int} colIdx column of interest
        -	 *  @returns {string} max string length for each column
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnGetMaxLenString( settings, colIdx )
        -	{
        -		var s, max=-1, maxIdx = -1;
        -	
        -		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
        -			s = _fnGetCellData( settings, i, colIdx, 'display' )+'';
        -			s = s.replace( __re_html_remove, '' );
        -	
        -			if ( s.length > max ) {
        -				max = s.length;
        -				maxIdx = i;
        -			}
        -		}
        -	
        -		return maxIdx;
        -	}
        -	
        -	
        -	/**
        -	 * Append a CSS unit (only if required) to a string
        -	 *  @param {string} value to css-ify
        -	 *  @returns {string} value with css unit
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnStringToCss( s )
        -	{
        -		if ( s === null ) {
        -			return '0px';
        -		}
        -	
        -		if ( typeof s == 'number' ) {
        -			return s < 0 ?
        -				'0px' :
        -				s+'px';
        -		}
        -	
        -		// Check it has a unit character already
        -		return s.match(/\d$/) ?
        -			s+'px' :
        -			s;
        -	}
        -	
        -	
        -	/**
        -	 * Get the width of a scroll bar in this browser being used
        -	 *  @returns {int} width in pixels
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnScrollBarWidth ()
        -	{
        -		// On first run a static variable is set, since this is only needed once.
        -		// Subsequent runs will just use the previously calculated value
        -		var width = DataTable.__scrollbarWidth;
        -	
        -		if ( width === undefined ) {
        -			var sizer = $('<p/>').css( {
        -					position: 'absolute',
        -					top: 0,
        -					left: 0,
        -					width: '100%',
        -					height: 150,
        -					padding: 0,
        -					overflow: 'scroll',
        -					visibility: 'hidden'
        -				} )
        -				.appendTo('body');
        -	
        -			width = sizer[0].offsetWidth - sizer[0].clientWidth;
        -			DataTable.__scrollbarWidth = width;
        -	
        -			sizer.remove();
        -		}
        -	
        -		return width;
        -	}
        -	
        -	
        -	
        -	function _fnSortFlatten ( settings )
        -	{
        -		var
        -			i, iLen, k, kLen,
        -			aSort = [],
        -			aiOrig = [],
        -			aoColumns = settings.aoColumns,
        -			aDataSort, iCol, sType, srcCol,
        -			fixed = settings.aaSortingFixed,
        -			fixedObj = $.isPlainObject( fixed ),
        -			nestedSort = [],
        -			add = function ( a ) {
        -				if ( a.length && ! $.isArray( a[0] ) ) {
        -					// 1D array
        -					nestedSort.push( a );
        -				}
        -				else {
        -					// 2D array
        -					nestedSort.push.apply( nestedSort, a );
        -				}
        -			};
        -	
        -		// Build the sort array, with pre-fix and post-fix options if they have been
        -		// specified
        -		if ( $.isArray( fixed ) ) {
        -			add( fixed );
        -		}
        -	
        -		if ( fixedObj && fixed.pre ) {
        -			add( fixed.pre );
        -		}
        -	
        -		add( settings.aaSorting );
        -	
        -		if (fixedObj && fixed.post ) {
        -			add( fixed.post );
        -		}
        -	
        -		for ( i=0 ; i<nestedSort.length ; i++ )
        -		{
        -			srcCol = nestedSort[i][0];
        -			aDataSort = aoColumns[ srcCol ].aDataSort;
        -	
        -			for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
        -			{
        -				iCol = aDataSort[k];
        -				sType = aoColumns[ iCol ].sType || 'string';
        -	
        -				if ( nestedSort[i]._idx === undefined ) {
        -					nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );
        -				}
        -	
        -				aSort.push( {
        -					src:       srcCol,
        -					col:       iCol,
        -					dir:       nestedSort[i][1],
        -					index:     nestedSort[i]._idx,
        -					type:      sType,
        -					formatter: DataTable.ext.type.order[ sType+"-pre" ]
        -				} );
        -			}
        -		}
        -	
        -		return aSort;
        -	}
        -	
        -	/**
        -	 * Change the order of the table
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 *  @todo This really needs split up!
        -	 */
        -	function _fnSort ( oSettings )
        -	{
        -		var
        -			i, ien, iLen, j, jLen, k, kLen,
        -			sDataType, nTh,
        -			aiOrig = [],
        -			oExtSort = DataTable.ext.type.order,
        -			aoData = oSettings.aoData,
        -			aoColumns = oSettings.aoColumns,
        -			aDataSort, data, iCol, sType, oSort,
        -			formatters = 0,
        -			sortCol,
        -			displayMaster = oSettings.aiDisplayMaster,
        -			aSort;
        -	
        -		// Resolve any column types that are unknown due to addition or invalidation
        -		// @todo Can this be moved into a 'data-ready' handler which is called when
        -		//   data is going to be used in the table?
        -		_fnColumnTypes( oSettings );
        -	
        -		aSort = _fnSortFlatten( oSettings );
        -	
        -		for ( i=0, ien=aSort.length ; i<ien ; i++ ) {
        -			sortCol = aSort[i];
        -	
        -			// Track if we can use the fast sort algorithm
        -			if ( sortCol.formatter ) {
        -				formatters++;
        -			}
        -	
        -			// Load the data needed for the sort, for each cell
        -			_fnSortData( oSettings, sortCol.col );
        -		}
        -	
        -		/* No sorting required if server-side or no sorting array */
        -		if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )
        -		{
        -			// Create a value - key array of the current row positions such that we can use their
        -			// current position during the sort, if values match, in order to perform stable sorting
        -			for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {
        -				aiOrig[ displayMaster[i] ] = i;
        -			}
        -	
        -			/* Do the sort - here we want multi-column sorting based on a given data source (column)
        -			 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
        -			 * follow on it's own, but this is what we want (example two column sorting):
        -			 *  fnLocalSorting = function(a,b){
        -			 *    var iTest;
        -			 *    iTest = oSort['string-asc']('data11', 'data12');
        -			 *      if (iTest !== 0)
        -			 *        return iTest;
        -			 *    iTest = oSort['numeric-desc']('data21', 'data22');
        -			 *    if (iTest !== 0)
        -			 *      return iTest;
        -			 *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
        -			 *  }
        -			 * Basically we have a test for each sorting column, if the data in that column is equal,
        -			 * test the next column. If all columns match, then we use a numeric sort on the row
        -			 * positions in the original data array to provide a stable sort.
        -			 *
        -			 * Note - I know it seems excessive to have two sorting methods, but the first is around
        -			 * 15% faster, so the second is only maintained for backwards compatibility with sorting
        -			 * methods which do not have a pre-sort formatting function.
        -			 */
        -			if ( formatters === aSort.length ) {
        -				// All sort types have formatting functions
        -				displayMaster.sort( function ( a, b ) {
        -					var
        -						x, y, k, test, sort,
        -						len=aSort.length,
        -						dataA = aoData[a]._aSortData,
        -						dataB = aoData[b]._aSortData;
        -	
        -					for ( k=0 ; k<len ; k++ ) {
        -						sort = aSort[k];
        -	
        -						x = dataA[ sort.col ];
        -						y = dataB[ sort.col ];
        -	
        -						test = x<y ? -1 : x>y ? 1 : 0;
        -						if ( test !== 0 ) {
        -							return sort.dir === 'asc' ? test : -test;
        -						}
        -					}
        -	
        -					x = aiOrig[a];
        -					y = aiOrig[b];
        -					return x<y ? -1 : x>y ? 1 : 0;
        -				} );
        -			}
        -			else {
        -				// Depreciated - remove in 1.11 (providing a plug-in option)
        -				// Not all sort types have formatting methods, so we have to call their sorting
        -				// methods.
        -				displayMaster.sort( function ( a, b ) {
        -					var
        -						x, y, k, l, test, sort, fn,
        -						len=aSort.length,
        -						dataA = aoData[a]._aSortData,
        -						dataB = aoData[b]._aSortData;
        -	
        -					for ( k=0 ; k<len ; k++ ) {
        -						sort = aSort[k];
        -	
        -						x = dataA[ sort.col ];
        -						y = dataB[ sort.col ];
        -	
        -						fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ];
        -						test = fn( x, y );
        -						if ( test !== 0 ) {
        -							return test;
        -						}
        -					}
        -	
        -					x = aiOrig[a];
        -					y = aiOrig[b];
        -					return x<y ? -1 : x>y ? 1 : 0;
        -				} );
        -			}
        -		}
        -	
        -		/* Tell the draw function that we have sorted the data */
        -		oSettings.bSorted = true;
        -	}
        -	
        -	
        -	function _fnSortAria ( settings )
        -	{
        -		var label;
        -		var nextSort;
        -		var columns = settings.aoColumns;
        -		var aSort = _fnSortFlatten( settings );
        -		var oAria = settings.oLanguage.oAria;
        -	
        -		// ARIA attributes - need to loop all columns, to update all (removing old
        -		// attributes as needed)
        -		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
        -		{
        -			var col = columns[i];
        -			var asSorting = col.asSorting;
        -			var sTitle = col.sTitle.replace( /<.*?>/g, "" );
        -			var th = col.nTh;
        -	
        -			// IE7 is throwing an error when setting these properties with jQuery's
        -			// attr() and removeAttr() methods...
        -			th.removeAttribute('aria-sort');
        -	
        -			/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
        -			if ( col.bSortable ) {
        -				if ( aSort.length > 0 && aSort[0].col == i ) {
        -					th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
        -					nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
        -				}
        -				else {
        -					nextSort = asSorting[0];
        -				}
        -	
        -				label = sTitle + ( nextSort === "asc" ?
        -					oAria.sSortAscending :
        -					oAria.sSortDescending
        -				);
        -			}
        -			else {
        -				label = sTitle;
        -			}
        -	
        -			th.setAttribute('aria-label', label);
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Function to run on user sort request
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {node} attachTo node to attach the handler to
        -	 *  @param {int} colIdx column sorting index
        -	 *  @param {boolean} [append=false] Append the requested sort to the existing
        -	 *    sort if true (i.e. multi-column sort)
        -	 *  @param {function} [callback] callback function
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSortListener ( settings, colIdx, append, callback )
        -	{
        -		var col = settings.aoColumns[ colIdx ];
        -		var sorting = settings.aaSorting;
        -		var asSorting = col.asSorting;
        -		var nextSortIdx;
        -		var next = function ( a, overflow ) {
        -			var idx = a._idx;
        -			if ( idx === undefined ) {
        -				idx = $.inArray( a[1], asSorting );
        -			}
        -	
        -			return idx+1 < asSorting.length ?
        -				idx+1 :
        -				overflow ?
        -					null :
        -					0;
        -		};
        -	
        -		// Convert to 2D array if needed
        -		if ( typeof sorting[0] === 'number' ) {
        -			sorting = settings.aaSorting = [ sorting ];
        -		}
        -	
        -		// If appending the sort then we are multi-column sorting
        -		if ( append && settings.oFeatures.bSortMulti ) {
        -			// Are we already doing some kind of sort on this column?
        -			var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
        -	
        -			if ( sortIdx !== -1 ) {
        -				// Yes, modify the sort
        -				nextSortIdx = next( sorting[sortIdx], true );
        -	
        -				if ( nextSortIdx === null && sorting.length === 1 ) {
        -					nextSortIdx = 0; // can't remove sorting completely
        -				}
        -	
        -				if ( nextSortIdx === null ) {
        -					sorting.splice( sortIdx, 1 );
        -				}
        -				else {
        -					sorting[sortIdx][1] = asSorting[ nextSortIdx ];
        -					sorting[sortIdx]._idx = nextSortIdx;
        -				}
        -			}
        -			else {
        -				// No sort on this column yet
        -				sorting.push( [ colIdx, asSorting[0], 0 ] );
        -				sorting[sorting.length-1]._idx = 0;
        -			}
        -		}
        -		else if ( sorting.length && sorting[0][0] == colIdx ) {
        -			// Single column - already sorting on this column, modify the sort
        -			nextSortIdx = next( sorting[0] );
        -	
        -			sorting.length = 1;
        -			sorting[0][1] = asSorting[ nextSortIdx ];
        -			sorting[0]._idx = nextSortIdx;
        -		}
        -		else {
        -			// Single column - sort only on this column
        -			sorting.length = 0;
        -			sorting.push( [ colIdx, asSorting[0] ] );
        -			sorting[0]._idx = 0;
        -		}
        -	
        -		// Run the sort by calling a full redraw
        -		_fnReDraw( settings );
        -	
        -		// callback used for async user interaction
        -		if ( typeof callback == 'function' ) {
        -			callback( settings );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Attach a sort handler (click) to a node
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {node} attachTo node to attach the handler to
        -	 *  @param {int} colIdx column sorting index
        -	 *  @param {function} [callback] callback function
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
        -	{
        -		var col = settings.aoColumns[ colIdx ];
        -	
        -		_fnBindAction( attachTo, {}, function (e) {
        -			/* If the column is not sortable - don't to anything */
        -			if ( col.bSortable === false ) {
        -				return;
        -			}
        -	
        -			// If processing is enabled use a timeout to allow the processing
        -			// display to be shown - otherwise to it synchronously
        -			if ( settings.oFeatures.bProcessing ) {
        -				_fnProcessingDisplay( settings, true );
        -	
        -				setTimeout( function() {
        -					_fnSortListener( settings, colIdx, e.shiftKey, callback );
        -	
        -					// In server-side processing, the draw callback will remove the
        -					// processing display
        -					if ( _fnDataSource( settings ) !== 'ssp' ) {
        -						_fnProcessingDisplay( settings, false );
        -					}
        -				}, 0 );
        -			}
        -			else {
        -				_fnSortListener( settings, colIdx, e.shiftKey, callback );
        -			}
        -		} );
        -	}
        -	
        -	
        -	/**
        -	 * Set the sorting classes on table's body, Note: it is safe to call this function
        -	 * when bSort and bSortClasses are false
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSortingClasses( settings )
        -	{
        -		var oldSort = settings.aLastSort;
        -		var sortClass = settings.oClasses.sSortColumn;
        -		var sort = _fnSortFlatten( settings );
        -		var features = settings.oFeatures;
        -		var i, ien, colIdx;
        -	
        -		if ( features.bSort && features.bSortClasses ) {
        -			// Remove old sorting classes
        -			for ( i=0, ien=oldSort.length ; i<ien ; i++ ) {
        -				colIdx = oldSort[i].src;
        -	
        -				// Remove column sorting
        -				$( _pluck( settings.aoData, 'anCells', colIdx ) )
        -					.removeClass( sortClass + (i<2 ? i+1 : 3) );
        -			}
        -	
        -			// Add new column sorting
        -			for ( i=0, ien=sort.length ; i<ien ; i++ ) {
        -				colIdx = sort[i].src;
        -	
        -				$( _pluck( settings.aoData, 'anCells', colIdx ) )
        -					.addClass( sortClass + (i<2 ? i+1 : 3) );
        -			}
        -		}
        -	
        -		settings.aLastSort = sort;
        -	}
        -	
        -	
        -	// Get the data to sort a column, be it from cache, fresh (populating the
        -	// cache), or from a sort formatter
        -	function _fnSortData( settings, idx )
        -	{
        -		// Custom sorting function - provided by the sort data type
        -		var column = settings.aoColumns[ idx ];
        -		var customSort = DataTable.ext.order[ column.sSortDataType ];
        -		var customData;
        -	
        -		if ( customSort ) {
        -			customData = customSort.call( settings.oInstance, settings, idx,
        -				_fnColumnIndexToVisible( settings, idx )
        -			);
        -		}
        -	
        -		// Use / populate cache
        -		var row, cellData;
        -		var formatter = DataTable.ext.type.order[ column.sType+"-pre" ];
        -	
        -		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
        -			row = settings.aoData[i];
        -	
        -			if ( ! row._aSortData ) {
        -				row._aSortData = [];
        -			}
        -	
        -			if ( ! row._aSortData[idx] || customSort ) {
        -				cellData = customSort ?
        -					customData[i] : // If there was a custom sort function, use data from there
        -					_fnGetCellData( settings, i, idx, 'sort' );
        -	
        -				row._aSortData[ idx ] = formatter ?
        -					formatter( cellData ) :
        -					cellData;
        -			}
        -		}
        -	}
        -	
        -	
        -	
        -	/**
        -	 * Save the state of a table
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSaveState ( settings )
        -	{
        -		if ( !settings.oFeatures.bStateSave || settings.bDestroying )
        -		{
        -			return;
        -		}
        -	
        -		/* Store the interesting variables */
        -		var state = {
        -			time:    +new Date(),
        -			start:   settings._iDisplayStart,
        -			length:  settings._iDisplayLength,
        -			order:   $.extend( true, [], settings.aaSorting ),
        -			search:  _fnSearchToCamel( settings.oPreviousSearch ),
        -			columns: $.map( settings.aoColumns, function ( col, i ) {
        -				return {
        -					visible: col.bVisible,
        -					search: _fnSearchToCamel( settings.aoPreSearchCols[i] )
        -				};
        -			} )
        -		};
        -	
        -		_fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] );
        -	
        -		settings.oSavedState = state;
        -		settings.fnStateSaveCallback.call( settings.oInstance, settings, state );
        -	}
        -	
        -	
        -	/**
        -	 * Attempt to load a saved table state
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {object} oInit DataTables init object so we can override settings
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnLoadState ( settings, oInit )
        -	{
        -		var i, ien;
        -		var columns = settings.aoColumns;
        -	
        -		if ( ! settings.oFeatures.bStateSave ) {
        -			return;
        -		}
        -	
        -		var state = settings.fnStateLoadCallback.call( settings.oInstance, settings );
        -		if ( ! state || ! state.time ) {
        -			return;
        -		}
        -	
        -		/* Allow custom and plug-in manipulation functions to alter the saved data set and
        -		 * cancelling of loading by returning false
        -		 */
        -		var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, state] );
        -		if ( $.inArray( false, abStateLoad ) !== -1 ) {
        -			return;
        -		}
        -	
        -		/* Reject old data */
        -		var duration = settings.iStateDuration;
        -		if ( duration > 0 && state.time < +new Date() - (duration*1000) ) {
        -			return;
        -		}
        -	
        -		// Number of columns have changed - all bets are off, no restore of settings
        -		if ( columns.length !== state.columns.length ) {
        -			return;
        -		}
        -	
        -		// Store the saved state so it might be accessed at any time
        -		settings.oLoadedState = $.extend( true, {}, state );
        -	
        -		// Restore key features - todo - for 1.11 this needs to be done by
        -		// subscribed events
        -		if ( state.start !== undefined ) {
        -			settings._iDisplayStart    = state.start;
        -			settings.iInitDisplayStart = state.start;
        -		}
        -		if ( state.length !== undefined ) {
        -			settings._iDisplayLength   = state.length;
        -		}
        -	
        -		// Order
        -		if ( state.order !== undefined ) {
        -			settings.aaSorting = [];
        -			$.each( state.order, function ( i, col ) {
        -				settings.aaSorting.push( col[0] >= columns.length ?
        -					[ 0, col[1] ] :
        -					col
        -				);
        -			} );
        -		}
        -	
        -		// Search
        -		if ( state.search !== undefined ) {
        -			$.extend( settings.oPreviousSearch, _fnSearchToHung( state.search ) );
        -		}
        -	
        -		// Columns
        -		for ( i=0, ien=state.columns.length ; i<ien ; i++ ) {
        -			var col = state.columns[i];
        -	
        -			// Visibility
        -			if ( col.visible !== undefined ) {
        -				columns[i].bVisible = col.visible;
        -			}
        -	
        -			// Search
        -			if ( col.search !== undefined ) {
        -				$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );
        -			}
        -		}
        -	
        -		_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, state] );
        -	}
        -	
        -	
        -	/**
        -	 * Return the settings object for a particular table
        -	 *  @param {node} table table we are using as a dataTable
        -	 *  @returns {object} Settings object - or null if not found
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnSettingsFromNode ( table )
        -	{
        -		var settings = DataTable.settings;
        -		var idx = $.inArray( table, _pluck( settings, 'nTable' ) );
        -	
        -		return idx !== -1 ?
        -			settings[ idx ] :
        -			null;
        -	}
        -	
        -	
        -	/**
        -	 * Log an error message
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {int} level log error messages, or display them to the user
        -	 *  @param {string} msg error message
        -	 *  @param {int} tn Technical note id to get more information about the error.
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnLog( settings, level, msg, tn )
        -	{
        -		msg = 'DataTables warning: '+
        -			(settings!==null ? 'table id='+settings.sTableId+' - ' : '')+msg;
        -	
        -		if ( tn ) {
        -			msg += '. For more information about this error, please see '+
        -			'http://datatables.net/tn/'+tn;
        -		}
        -	
        -		if ( ! level  ) {
        -			// Backwards compatibility pre 1.10
        -			var ext = DataTable.ext;
        -			var type = ext.sErrMode || ext.errMode;
        -	
        -			_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
        -	
        -			if ( type == 'alert' ) {
        -				alert( msg );
        -			}
        -			else if ( type == 'throw' ) {
        -				throw new Error(msg);
        -			}
        -			else if ( typeof type == 'function' ) {
        -				type( settings, tn, msg );
        -			}
        -		}
        -		else if ( window.console && console.log ) {
        -			console.log( msg );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * See if a property is defined on one object, if so assign it to the other object
        -	 *  @param {object} ret target object
        -	 *  @param {object} src source object
        -	 *  @param {string} name property
        -	 *  @param {string} [mappedName] name to map too - optional, name used if not given
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnMap( ret, src, name, mappedName )
        -	{
        -		if ( $.isArray( name ) ) {
        -			$.each( name, function (i, val) {
        -				if ( $.isArray( val ) ) {
        -					_fnMap( ret, src, val[0], val[1] );
        -				}
        -				else {
        -					_fnMap( ret, src, val );
        -				}
        -			} );
        -	
        -			return;
        -		}
        -	
        -		if ( mappedName === undefined ) {
        -			mappedName = name;
        -		}
        -	
        -		if ( src[name] !== undefined ) {
        -			ret[mappedName] = src[name];
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Extend objects - very similar to jQuery.extend, but deep copy objects, and
        -	 * shallow copy arrays. The reason we need to do this, is that we don't want to
        -	 * deep copy array init values (such as aaSorting) since the dev wouldn't be
        -	 * able to override them, but we do want to deep copy arrays.
        -	 *  @param {object} out Object to extend
        -	 *  @param {object} extender Object from which the properties will be applied to
        -	 *      out
        -	 *  @param {boolean} breakRefs If true, then arrays will be sliced to take an
        -	 *      independent copy with the exception of the `data` or `aaData` parameters
        -	 *      if they are present. This is so you can pass in a collection to
        -	 *      DataTables and have that used as your data source without breaking the
        -	 *      references
        -	 *  @returns {object} out Reference, just for convenience - out === the return.
        -	 *  @memberof DataTable#oApi
        -	 *  @todo This doesn't take account of arrays inside the deep copied objects.
        -	 */
        -	function _fnExtend( out, extender, breakRefs )
        -	{
        -		var val;
        -	
        -		for ( var prop in extender ) {
        -			if ( extender.hasOwnProperty(prop) ) {
        -				val = extender[prop];
        -	
        -				if ( $.isPlainObject( val ) ) {
        -					if ( ! $.isPlainObject( out[prop] ) ) {
        -						out[prop] = {};
        -					}
        -					$.extend( true, out[prop], val );
        -				}
        -				else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {
        -					out[prop] = val.slice();
        -				}
        -				else {
        -					out[prop] = val;
        -				}
        -			}
        -		}
        -	
        -		return out;
        -	}
        -	
        -	
        -	/**
        -	 * Bind an event handers to allow a click or return key to activate the callback.
        -	 * This is good for accessibility since a return on the keyboard will have the
        -	 * same effect as a click, if the element has focus.
        -	 *  @param {element} n Element to bind the action to
        -	 *  @param {object} oData Data object to pass to the triggered function
        -	 *  @param {function} fn Callback function for when the event is triggered
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnBindAction( n, oData, fn )
        -	{
        -		$(n)
        -			.bind( 'click.DT', oData, function (e) {
        -					n.blur(); // Remove focus outline for mouse users
        -					fn(e);
        -				} )
        -			.bind( 'keypress.DT', oData, function (e){
        -					if ( e.which === 13 ) {
        -						e.preventDefault();
        -						fn(e);
        -					}
        -				} )
        -			.bind( 'selectstart.DT', function () {
        -					/* Take the brutal approach to cancelling text selection */
        -					return false;
        -				} );
        -	}
        -	
        -	
        -	/**
        -	 * Register a callback function. Easily allows a callback function to be added to
        -	 * an array store of callback functions that can then all be called together.
        -	 *  @param {object} oSettings dataTables settings object
        -	 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
        -	 *  @param {function} fn Function to be called back
        -	 *  @param {string} sName Identifying name for the callback (i.e. a label)
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnCallbackReg( oSettings, sStore, fn, sName )
        -	{
        -		if ( fn )
        -		{
        -			oSettings[sStore].push( {
        -				"fn": fn,
        -				"sName": sName
        -			} );
        -		}
        -	}
        -	
        -	
        -	/**
        -	 * Fire callback functions and trigger events. Note that the loop over the
        -	 * callback array store is done backwards! Further note that you do not want to
        -	 * fire off triggers in time sensitive applications (for example cell creation)
        -	 * as its slow.
        -	 *  @param {object} settings dataTables settings object
        -	 *  @param {string} callbackArr Name of the array storage for the callbacks in
        -	 *      oSettings
        -	 *  @param {string} eventName Name of the jQuery custom event to trigger. If
        -	 *      null no trigger is fired
        -	 *  @param {array} args Array of arguments to pass to the callback function /
        -	 *      trigger
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnCallbackFire( settings, callbackArr, eventName, args )
        -	{
        -		var ret = [];
        -	
        -		if ( callbackArr ) {
        -			ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {
        -				return val.fn.apply( settings.oInstance, args );
        -			} );
        -		}
        -	
        -		if ( eventName !== null ) {
        -			var e = $.Event( eventName+'.dt' );
        -	
        -			$(settings.nTable).trigger( e, args );
        -	
        -			ret.push( e.result );
        -		}
        -	
        -		return ret;
        -	}
        -	
        -	
        -	function _fnLengthOverflow ( settings )
        -	{
        -		var
        -			start = settings._iDisplayStart,
        -			end = settings.fnDisplayEnd(),
        -			len = settings._iDisplayLength;
        -	
        -		/* If we have space to show extra rows (backing up from the end point - then do so */
        -		if ( start >= end )
        -		{
        -			start = end - len;
        -		}
        -	
        -		// Keep the start record on the current page
        -		start -= (start % len);
        -	
        -		if ( len === -1 || start < 0 )
        -		{
        -			start = 0;
        -		}
        -	
        -		settings._iDisplayStart = start;
        -	}
        -	
        -	
        -	function _fnRenderer( settings, type )
        -	{
        -		var renderer = settings.renderer;
        -		var host = DataTable.ext.renderer[type];
        -	
        -		if ( $.isPlainObject( renderer ) && renderer[type] ) {
        -			// Specific renderer for this type. If available use it, otherwise use
        -			// the default.
        -			return host[renderer[type]] || host._;
        -		}
        -		else if ( typeof renderer === 'string' ) {
        -			// Common renderer - if there is one available for this type use it,
        -			// otherwise use the default
        -			return host[renderer] || host._;
        -		}
        -	
        -		// Use the default
        -		return host._;
        -	}
        -	
        -	
        -	/**
        -	 * Detect the data source being used for the table. Used to simplify the code
        -	 * a little (ajax) and to make it compress a little smaller.
        -	 *
        -	 *  @param {object} settings dataTables settings object
        -	 *  @returns {string} Data source
        -	 *  @memberof DataTable#oApi
        -	 */
        -	function _fnDataSource ( settings )
        -	{
        -		if ( settings.oFeatures.bServerSide ) {
        -			return 'ssp';
        -		}
        -		else if ( settings.ajax || settings.sAjaxSource ) {
        -			return 'ajax';
        -		}
        -		return 'dom';
        -	}
        -	
        -
        -	DataTable = function( options )
        -	{
        -		/**
        -		 * Perform a jQuery selector action on the table's TR elements (from the tbody) and
        -		 * return the resulting jQuery object.
        -		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
        -		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
        -		 *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
        -		 *    criterion ("applied") or all TR elements (i.e. no filter).
        -		 *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
        -		 *    Can be either 'current', whereby the current sorting of the table is used, or
        -		 *    'original' whereby the original order the data was read into the table is used.
        -		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
        -		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
        -		 *    'current' and filter is 'applied', regardless of what they might be given as.
        -		 *  @returns {object} jQuery object, filtered by the given selector.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Highlight every second row
        -		 *      oTable.$('tr:odd').css('backgroundColor', 'blue');
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Filter to rows with 'Webkit' in them, add a background colour and then
        -		 *      // remove the filter, thus highlighting the 'Webkit' rows only.
        -		 *      oTable.fnFilter('Webkit');
        -		 *      oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
        -		 *      oTable.fnFilter('');
        -		 *    } );
        -		 */
        -		this.$ = function ( sSelector, oOpts )
        -		{
        -			return this.api(true).$( sSelector, oOpts );
        -		};
        -		
        -		
        -		/**
        -		 * Almost identical to $ in operation, but in this case returns the data for the matched
        -		 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
        -		 * rather than any descendants, so the data can be obtained for the row/cell. If matching
        -		 * rows are found, the data returned is the original data array/object that was used to
        -		 * create the row (or a generated array if from a DOM source).
        -		 *
        -		 * This method is often useful in-combination with $ where both functions are given the
        -		 * same parameters and the array indexes will match identically.
        -		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
        -		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
        -		 *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
        -		 *    criterion ("applied") or all elements (i.e. no filter).
        -		 *  @param {string} [oOpts.order=current] Order of the data in the processed array.
        -		 *    Can be either 'current', whereby the current sorting of the table is used, or
        -		 *    'original' whereby the original order the data was read into the table is used.
        -		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
        -		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
        -		 *    'current' and filter is 'applied', regardless of what they might be given as.
        -		 *  @returns {array} Data for the matched elements. If any elements, as a result of the
        -		 *    selector, were not TR, TD or TH elements in the DataTable, they will have a null
        -		 *    entry in the array.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Get the data from the first row in the table
        -		 *      var data = oTable._('tr:first');
        -		 *
        -		 *      // Do something useful with the data
        -		 *      alert( "First cell is: "+data[0] );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Filter to 'Webkit' and get all data for
        -		 *      oTable.fnFilter('Webkit');
        -		 *      var data = oTable._('tr', {"search": "applied"});
        -		 *
        -		 *      // Do something with the data
        -		 *      alert( data.length+" rows matched the search" );
        -		 *    } );
        -		 */
        -		this._ = function ( sSelector, oOpts )
        -		{
        -			return this.api(true).rows( sSelector, oOpts ).data();
        -		};
        -		
        -		
        -		/**
        -		 * Create a DataTables Api instance, with the currently selected tables for
        -		 * the Api's context.
        -		 * @param {boolean} [traditional=false] Set the API instance's context to be
        -		 *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was
        -		 *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),
        -		 *   or if all tables captured in the jQuery object should be used.
        -		 * @return {DataTables.Api}
        -		 */
        -		this.api = function ( traditional )
        -		{
        -			return traditional ?
        -				new _Api(
        -					_fnSettingsFromNode( this[ _ext.iApiIndex ] )
        -				) :
        -				new _Api( this );
        -		};
        -		
        -		
        -		/**
        -		 * Add a single new row or multiple rows of data to the table. Please note
        -		 * that this is suitable for client-side processing only - if you are using
        -		 * server-side processing (i.e. "bServerSide": true), then to add data, you
        -		 * must add it to the data source, i.e. the server-side, through an Ajax call.
        -		 *  @param {array|object} data The data to be added to the table. This can be:
        -		 *    <ul>
        -		 *      <li>1D array of data - add a single row with the data provided</li>
        -		 *      <li>2D array of arrays - add multiple rows in a single call</li>
        -		 *      <li>object - data object when using <i>mData</i></li>
        -		 *      <li>array of objects - multiple data objects when using <i>mData</i></li>
        -		 *    </ul>
        -		 *  @param {bool} [redraw=true] redraw the table or not
        -		 *  @returns {array} An array of integers, representing the list of indexes in
        -		 *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
        -		 *    the table.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    // Global var for counter
        -		 *    var giCount = 2;
        -		 *
        -		 *    $(document).ready(function() {
        -		 *      $('#example').dataTable();
        -		 *    } );
        -		 *
        -		 *    function fnClickAddRow() {
        -		 *      $('#example').dataTable().fnAddData( [
        -		 *        giCount+".1",
        -		 *        giCount+".2",
        -		 *        giCount+".3",
        -		 *        giCount+".4" ]
        -		 *      );
        -		 *
        -		 *      giCount++;
        -		 *    }
        -		 */
        -		this.fnAddData = function( data, redraw )
        -		{
        -			var api = this.api( true );
        -		
        -			/* Check if we want to add multiple rows or not */
        -			var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
        -				api.rows.add( data ) :
        -				api.row.add( data );
        -		
        -			if ( redraw === undefined || redraw ) {
        -				api.draw();
        -			}
        -		
        -			return rows.flatten().toArray();
        -		};
        -		
        -		
        -		/**
        -		 * This function will make DataTables recalculate the column sizes, based on the data
        -		 * contained in the table and the sizes applied to the columns (in the DOM, CSS or
        -		 * through the sWidth parameter). This can be useful when the width of the table's
        -		 * parent element changes (for example a window resize).
        -		 *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable( {
        -		 *        "sScrollY": "200px",
        -		 *        "bPaginate": false
        -		 *      } );
        -		 *
        -		 *      $(window).bind('resize', function () {
        -		 *        oTable.fnAdjustColumnSizing();
        -		 *      } );
        -		 *    } );
        -		 */
        -		this.fnAdjustColumnSizing = function ( bRedraw )
        -		{
        -			var api = this.api( true ).columns.adjust();
        -			var settings = api.settings()[0];
        -			var scroll = settings.oScroll;
        -		
        -			if ( bRedraw === undefined || bRedraw ) {
        -				api.draw( false );
        -			}
        -			else if ( scroll.sX !== "" || scroll.sY !== "" ) {
        -				/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
        -				_fnScrollDraw( settings );
        -			}
        -		};
        -		
        -		
        -		/**
        -		 * Quickly and simply clear a table
        -		 *  @param {bool} [bRedraw=true] redraw the table or not
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
        -		 *      oTable.fnClearTable();
        -		 *    } );
        -		 */
        -		this.fnClearTable = function( bRedraw )
        -		{
        -			var api = this.api( true ).clear();
        -		
        -			if ( bRedraw === undefined || bRedraw ) {
        -				api.draw();
        -			}
        -		};
        -		
        -		
        -		/**
        -		 * The exact opposite of 'opening' a row, this function will close any rows which
        -		 * are currently 'open'.
        -		 *  @param {node} nTr the table row to 'close'
        -		 *  @returns {int} 0 on success, or 1 if failed (can't find the row)
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable;
        -		 *
        -		 *      // 'open' an information row when a row is clicked on
        -		 *      $('#example tbody tr').click( function () {
        -		 *        if ( oTable.fnIsOpen(this) ) {
        -		 *          oTable.fnClose( this );
        -		 *        } else {
        -		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
        -		 *        }
        -		 *      } );
        -		 *
        -		 *      oTable = $('#example').dataTable();
        -		 *    } );
        -		 */
        -		this.fnClose = function( nTr )
        -		{
        -			this.api( true ).row( nTr ).child.hide();
        -		};
        -		
        -		
        -		/**
        -		 * Remove a row for the table
        -		 *  @param {mixed} target The index of the row from aoData to be deleted, or
        -		 *    the TR element you want to delete
        -		 *  @param {function|null} [callBack] Callback function
        -		 *  @param {bool} [redraw=true] Redraw the table or not
        -		 *  @returns {array} The row that was deleted
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Immediately remove the first row
        -		 *      oTable.fnDeleteRow( 0 );
        -		 *    } );
        -		 */
        -		this.fnDeleteRow = function( target, callback, redraw )
        -		{
        -			var api = this.api( true );
        -			var rows = api.rows( target );
        -			var settings = rows.settings()[0];
        -			var data = settings.aoData[ rows[0][0] ];
        -		
        -			rows.remove();
        -		
        -			if ( callback ) {
        -				callback.call( this, settings, data );
        -			}
        -		
        -			if ( redraw === undefined || redraw ) {
        -				api.draw();
        -			}
        -		
        -			return data;
        -		};
        -		
        -		
        -		/**
        -		 * Restore the table to it's original state in the DOM by removing all of DataTables
        -		 * enhancements, alterations to the DOM structure of the table and event listeners.
        -		 *  @param {boolean} [remove=false] Completely remove the table from the DOM
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
        -		 *      var oTable = $('#example').dataTable();
        -		 *      oTable.fnDestroy();
        -		 *    } );
        -		 */
        -		this.fnDestroy = function ( remove )
        -		{
        -			this.api( true ).destroy( remove );
        -		};
        -		
        -		
        -		/**
        -		 * Redraw the table
        -		 *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
        -		 *      oTable.fnDraw();
        -		 *    } );
        -		 */
        -		this.fnDraw = function( complete )
        -		{
        -			// Note that this isn't an exact match to the old call to _fnDraw - it takes
        -			// into account the new data, but can hold position.
        -			this.api( true ).draw( complete );
        -		};
        -		
        -		
        -		/**
        -		 * Filter the input based on data
        -		 *  @param {string} sInput String to filter the table on
        -		 *  @param {int|null} [iColumn] Column to limit filtering to
        -		 *  @param {bool} [bRegex=false] Treat as regular expression or not
        -		 *  @param {bool} [bSmart=true] Perform smart filtering or not
        -		 *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
        -		 *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Sometime later - filter...
        -		 *      oTable.fnFilter( 'test string' );
        -		 *    } );
        -		 */
        -		this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
        -		{
        -			var api = this.api( true );
        -		
        -			if ( iColumn === null || iColumn === undefined ) {
        -				api.search( sInput, bRegex, bSmart, bCaseInsensitive );
        -			}
        -			else {
        -				api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
        -			}
        -		
        -			api.draw();
        -		};
        -		
        -		
        -		/**
        -		 * Get the data for the whole table, an individual row or an individual cell based on the
        -		 * provided parameters.
        -		 *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
        -		 *    a TR node then the data source for the whole row will be returned. If given as a
        -		 *    TD/TH cell node then iCol will be automatically calculated and the data for the
        -		 *    cell returned. If given as an integer, then this is treated as the aoData internal
        -		 *    data index for the row (see fnGetPosition) and the data for that row used.
        -		 *  @param {int} [col] Optional column index that you want the data of.
        -		 *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
        -		 *    returned. If mRow is defined, just data for that row, and is iCol is
        -		 *    defined, only data for the designated cell is returned.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    // Row data
        -		 *    $(document).ready(function() {
        -		 *      oTable = $('#example').dataTable();
        -		 *
        -		 *      oTable.$('tr').click( function () {
        -		 *        var data = oTable.fnGetData( this );
        -		 *        // ... do something with the array / object of data for the row
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Individual cell data
        -		 *    $(document).ready(function() {
        -		 *      oTable = $('#example').dataTable();
        -		 *
        -		 *      oTable.$('td').click( function () {
        -		 *        var sData = oTable.fnGetData( this );
        -		 *        alert( 'The cell clicked on had the value of '+sData );
        -		 *      } );
        -		 *    } );
        -		 */
        -		this.fnGetData = function( src, col )
        -		{
        -			var api = this.api( true );
        -		
        -			if ( src !== undefined ) {
        -				var type = src.nodeName ? src.nodeName.toLowerCase() : '';
        -		
        -				return col !== undefined || type == 'td' || type == 'th' ?
        -					api.cell( src, col ).data() :
        -					api.row( src ).data() || null;
        -			}
        -		
        -			return api.data().toArray();
        -		};
        -		
        -		
        -		/**
        -		 * Get an array of the TR nodes that are used in the table's body. Note that you will
        -		 * typically want to use the '$' API method in preference to this as it is more
        -		 * flexible.
        -		 *  @param {int} [iRow] Optional row index for the TR element you want
        -		 *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
        -		 *    in the table's body, or iRow is defined, just the TR element requested.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Get the nodes from the table
        -		 *      var nNodes = oTable.fnGetNodes( );
        -		 *    } );
        -		 */
        -		this.fnGetNodes = function( iRow )
        -		{
        -			var api = this.api( true );
        -		
        -			return iRow !== undefined ?
        -				api.row( iRow ).node() :
        -				api.rows().nodes().flatten().toArray();
        -		};
        -		
        -		
        -		/**
        -		 * Get the array indexes of a particular cell from it's DOM element
        -		 * and column index including hidden columns
        -		 *  @param {node} node this can either be a TR, TD or TH in the table's body
        -		 *  @returns {int} If nNode is given as a TR, then a single index is returned, or
        -		 *    if given as a cell, an array of [row index, column index (visible),
        -		 *    column index (all)] is given.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      $('#example tbody td').click( function () {
        -		 *        // Get the position of the current data from the node
        -		 *        var aPos = oTable.fnGetPosition( this );
        -		 *
        -		 *        // Get the data array for this row
        -		 *        var aData = oTable.fnGetData( aPos[0] );
        -		 *
        -		 *        // Update the data array and return the value
        -		 *        aData[ aPos[1] ] = 'clicked';
        -		 *        this.innerHTML = 'clicked';
        -		 *      } );
        -		 *
        -		 *      // Init DataTables
        -		 *      oTable = $('#example').dataTable();
        -		 *    } );
        -		 */
        -		this.fnGetPosition = function( node )
        -		{
        -			var api = this.api( true );
        -			var nodeName = node.nodeName.toUpperCase();
        -		
        -			if ( nodeName == 'TR' ) {
        -				return api.row( node ).index();
        -			}
        -			else if ( nodeName == 'TD' || nodeName == 'TH' ) {
        -				var cell = api.cell( node ).index();
        -		
        -				return [
        -					cell.row,
        -					cell.columnVisible,
        -					cell.column
        -				];
        -			}
        -			return null;
        -		};
        -		
        -		
        -		/**
        -		 * Check to see if a row is 'open' or not.
        -		 *  @param {node} nTr the table row to check
        -		 *  @returns {boolean} true if the row is currently open, false otherwise
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable;
        -		 *
        -		 *      // 'open' an information row when a row is clicked on
        -		 *      $('#example tbody tr').click( function () {
        -		 *        if ( oTable.fnIsOpen(this) ) {
        -		 *          oTable.fnClose( this );
        -		 *        } else {
        -		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
        -		 *        }
        -		 *      } );
        -		 *
        -		 *      oTable = $('#example').dataTable();
        -		 *    } );
        -		 */
        -		this.fnIsOpen = function( nTr )
        -		{
        -			return this.api( true ).row( nTr ).child.isShown();
        -		};
        -		
        -		
        -		/**
        -		 * This function will place a new row directly after a row which is currently
        -		 * on display on the page, with the HTML contents that is passed into the
        -		 * function. This can be used, for example, to ask for confirmation that a
        -		 * particular record should be deleted.
        -		 *  @param {node} nTr The table row to 'open'
        -		 *  @param {string|node|jQuery} mHtml The HTML to put into the row
        -		 *  @param {string} sClass Class to give the new TD cell
        -		 *  @returns {node} The row opened. Note that if the table row passed in as the
        -		 *    first parameter, is not found in the table, this method will silently
        -		 *    return.
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable;
        -		 *
        -		 *      // 'open' an information row when a row is clicked on
        -		 *      $('#example tbody tr').click( function () {
        -		 *        if ( oTable.fnIsOpen(this) ) {
        -		 *          oTable.fnClose( this );
        -		 *        } else {
        -		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
        -		 *        }
        -		 *      } );
        -		 *
        -		 *      oTable = $('#example').dataTable();
        -		 *    } );
        -		 */
        -		this.fnOpen = function( nTr, mHtml, sClass )
        -		{
        -			return this.api( true )
        -				.row( nTr )
        -				.child( mHtml, sClass )
        -				.show()
        -				.child()[0];
        -		};
        -		
        -		
        -		/**
        -		 * Change the pagination - provides the internal logic for pagination in a simple API
        -		 * function. With this function you can have a DataTables table go to the next,
        -		 * previous, first or last pages.
        -		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
        -		 *    or page number to jump to (integer), note that page 0 is the first page.
        -		 *  @param {bool} [bRedraw=true] Redraw the table or not
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *      oTable.fnPageChange( 'next' );
        -		 *    } );
        -		 */
        -		this.fnPageChange = function ( mAction, bRedraw )
        -		{
        -			var api = this.api( true ).page( mAction );
        -		
        -			if ( bRedraw === undefined || bRedraw ) {
        -				api.draw(false);
        -			}
        -		};
        -		
        -		
        -		/**
        -		 * Show a particular column
        -		 *  @param {int} iCol The column whose display should be changed
        -		 *  @param {bool} bShow Show (true) or hide (false) the column
        -		 *  @param {bool} [bRedraw=true] Redraw the table or not
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Hide the second column after initialisation
        -		 *      oTable.fnSetColumnVis( 1, false );
        -		 *    } );
        -		 */
        -		this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
        -		{
        -			var api = this.api( true ).column( iCol ).visible( bShow );
        -		
        -			if ( bRedraw === undefined || bRedraw ) {
        -				api.columns.adjust().draw();
        -			}
        -		};
        -		
        -		
        -		/**
        -		 * Get the settings for a particular table for external manipulation
        -		 *  @returns {object} DataTables settings object. See
        -		 *    {@link DataTable.models.oSettings}
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *      var oSettings = oTable.fnSettings();
        -		 *
        -		 *      // Show an example parameter from the settings
        -		 *      alert( oSettings._iDisplayStart );
        -		 *    } );
        -		 */
        -		this.fnSettings = function()
        -		{
        -			return _fnSettingsFromNode( this[_ext.iApiIndex] );
        -		};
        -		
        -		
        -		/**
        -		 * Sort the table by a particular column
        -		 *  @param {int} iCol the data index to sort on. Note that this will not match the
        -		 *    'display index' if you have hidden data entries
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Sort immediately with columns 0 and 1
        -		 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
        -		 *    } );
        -		 */
        -		this.fnSort = function( aaSort )
        -		{
        -			this.api( true ).order( aaSort ).draw();
        -		};
        -		
        -		
        -		/**
        -		 * Attach a sort listener to an element for a given column
        -		 *  @param {node} nNode the element to attach the sort listener to
        -		 *  @param {int} iColumn the column that a click on this node will sort on
        -		 *  @param {function} [fnCallback] callback function when sort is run
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *
        -		 *      // Sort on column 1, when 'sorter' is clicked on
        -		 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
        -		 *    } );
        -		 */
        -		this.fnSortListener = function( nNode, iColumn, fnCallback )
        -		{
        -			this.api( true ).order.listener( nNode, iColumn, fnCallback );
        -		};
        -		
        -		
        -		/**
        -		 * Update a table cell or row - this method will accept either a single value to
        -		 * update the cell with, an array of values with one element for each column or
        -		 * an object in the same format as the original data source. The function is
        -		 * self-referencing in order to make the multi column updates easier.
        -		 *  @param {object|array|string} mData Data to update the cell/row with
        -		 *  @param {node|int} mRow TR element you want to update or the aoData index
        -		 *  @param {int} [iColumn] The column to update, give as null or undefined to
        -		 *    update a whole row.
        -		 *  @param {bool} [bRedraw=true] Redraw the table or not
        -		 *  @param {bool} [bAction=true] Perform pre-draw actions or not
        -		 *  @returns {int} 0 on success, 1 on error
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
        -		 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
        -		 *    } );
        -		 */
        -		this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
        -		{
        -			var api = this.api( true );
        -		
        -			if ( iColumn === undefined || iColumn === null ) {
        -				api.row( mRow ).data( mData );
        -			}
        -			else {
        -				api.cell( mRow, iColumn ).data( mData );
        -			}
        -		
        -			if ( bAction === undefined || bAction ) {
        -				api.columns.adjust();
        -			}
        -		
        -			if ( bRedraw === undefined || bRedraw ) {
        -				api.draw();
        -			}
        -			return 0;
        -		};
        -		
        -		
        -		/**
        -		 * Provide a common method for plug-ins to check the version of DataTables being used, in order
        -		 * to ensure compatibility.
        -		 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
        -		 *    formats "X" and "X.Y" are also acceptable.
        -		 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
        -		 *    version, or false if this version of DataTales is not suitable
        -		 *  @method
        -		 *  @dtopt API
        -		 *  @deprecated Since v1.10
        -		 *
        -		 *  @example
        -		 *    $(document).ready(function() {
        -		 *      var oTable = $('#example').dataTable();
        -		 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
        -		 *    } );
        -		 */
        -		this.fnVersionCheck = _ext.fnVersionCheck;
        -		
        -
        -		var _that = this;
        -		var emptyInit = options === undefined;
        -		var len = this.length;
        -
        -		if ( emptyInit ) {
        -			options = {};
        -		}
        -
        -		this.oApi = this.internal = _ext.internal;
        -
        -		// Extend with old style plug-in API methods
        -		for ( var fn in DataTable.ext.internal ) {
        -			if ( fn ) {
        -				this[fn] = _fnExternApiFunc(fn);
        -			}
        -		}
        -
        -		this.each(function() {
        -			// For each initialisation we want to give it a clean initialisation
        -			// object that can be bashed around
        -			var o = {};
        -			var oInit = len > 1 ? // optimisation for single table case
        -				_fnExtend( o, options, true ) :
        -				options;
        -
        -			/*global oInit,_that,emptyInit*/
        -			var i=0, iLen, j, jLen, k, kLen;
        -			var sId = this.getAttribute( 'id' );
        -			var bInitHandedOff = false;
        -			var defaults = DataTable.defaults;
        -			var $this = $(this);
        -			
        -			
        -			/* Sanity check */
        -			if ( this.nodeName.toLowerCase() != 'table' )
        -			{
        -				_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
        -				return;
        -			}
        -			
        -			/* Backwards compatibility for the defaults */
        -			_fnCompatOpts( defaults );
        -			_fnCompatCols( defaults.column );
        -			
        -			/* Convert the camel-case defaults to Hungarian */
        -			_fnCamelToHungarian( defaults, defaults, true );
        -			_fnCamelToHungarian( defaults.column, defaults.column, true );
        -			
        -			/* Setting up the initialisation object */
        -			_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
        -			
        -			
        -			
        -			/* Check to see if we are re-initialising a table */
        -			var allSettings = DataTable.settings;
        -			for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
        -			{
        -				var s = allSettings[i];
        -			
        -				/* Base check on table node */
        -				if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )
        -				{
        -					var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
        -					var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
        -			
        -					if ( emptyInit || bRetrieve )
        -					{
        -						return s.oInstance;
        -					}
        -					else if ( bDestroy )
        -					{
        -						s.oInstance.fnDestroy();
        -						break;
        -					}
        -					else
        -					{
        -						_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
        -						return;
        -					}
        -				}
        -			
        -				/* If the element we are initialising has the same ID as a table which was previously
        -				 * initialised, but the table nodes don't match (from before) then we destroy the old
        -				 * instance by simply deleting it. This is under the assumption that the table has been
        -				 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
        -				 */
        -				if ( s.sTableId == this.id )
        -				{
        -					allSettings.splice( i, 1 );
        -					break;
        -				}
        -			}
        -			
        -			/* Ensure the table has an ID - required for accessibility */
        -			if ( sId === null || sId === "" )
        -			{
        -				sId = "DataTables_Table_"+(DataTable.ext._unique++);
        -				this.id = sId;
        -			}
        -			
        -			/* Create the settings object for this table and set some of the default parameters */
        -			var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
        -				"sDestroyWidth": $this[0].style.width,
        -				"sInstance":     sId,
        -				"sTableId":      sId
        -			} );
        -			oSettings.nTable = this;
        -			oSettings.oApi   = _that.internal;
        -			oSettings.oInit  = oInit;
        -			
        -			allSettings.push( oSettings );
        -			
        -			// Need to add the instance after the instance after the settings object has been added
        -			// to the settings array, so we can self reference the table instance if more than one
        -			oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
        -			
        -			// Backwards compatibility, before we apply all the defaults
        -			_fnCompatOpts( oInit );
        -			
        -			if ( oInit.oLanguage )
        -			{
        -				_fnLanguageCompat( oInit.oLanguage );
        -			}
        -			
        -			// If the length menu is given, but the init display length is not, use the length menu
        -			if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
        -			{
        -				oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
        -					oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
        -			}
        -			
        -			// Apply the defaults and init options to make a single init object will all
        -			// options defined from defaults and instance options.
        -			oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
        -			
        -			
        -			// Map the initialisation options onto the settings object
        -			_fnMap( oSettings.oFeatures, oInit, [
        -				"bPaginate",
        -				"bLengthChange",
        -				"bFilter",
        -				"bSort",
        -				"bSortMulti",
        -				"bInfo",
        -				"bProcessing",
        -				"bAutoWidth",
        -				"bSortClasses",
        -				"bServerSide",
        -				"bDeferRender"
        -			] );
        -			_fnMap( oSettings, oInit, [
        -				"asStripeClasses",
        -				"ajax",
        -				"fnServerData",
        -				"fnFormatNumber",
        -				"sServerMethod",
        -				"aaSorting",
        -				"aaSortingFixed",
        -				"aLengthMenu",
        -				"sPaginationType",
        -				"sAjaxSource",
        -				"sAjaxDataProp",
        -				"iStateDuration",
        -				"sDom",
        -				"bSortCellsTop",
        -				"iTabIndex",
        -				"fnStateLoadCallback",
        -				"fnStateSaveCallback",
        -				"renderer",
        -				"searchDelay",
        -				[ "iCookieDuration", "iStateDuration" ], // backwards compat
        -				[ "oSearch", "oPreviousSearch" ],
        -				[ "aoSearchCols", "aoPreSearchCols" ],
        -				[ "iDisplayLength", "_iDisplayLength" ],
        -				[ "bJQueryUI", "bJUI" ]
        -			] );
        -			_fnMap( oSettings.oScroll, oInit, [
        -				[ "sScrollX", "sX" ],
        -				[ "sScrollXInner", "sXInner" ],
        -				[ "sScrollY", "sY" ],
        -				[ "bScrollCollapse", "bCollapse" ]
        -			] );
        -			_fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
        -			
        -			/* Callback functions which are array driven */
        -			_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
        -			_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
        -			_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
        -			_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
        -			_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
        -			_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
        -			_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
        -			_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
        -			_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
        -			_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
        -			_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
        -			
        -			var oClasses = oSettings.oClasses;
        -			
        -			// @todo Remove in 1.11
        -			if ( oInit.bJQueryUI )
        -			{
        -				/* Use the JUI classes object for display. You could clone the oStdClasses object if
        -				 * you want to have multiple tables with multiple independent classes
        -				 */
        -				$.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );
        -			
        -				if ( oInit.sDom === defaults.sDom && defaults.sDom === "lfrtip" )
        -				{
        -					/* Set the DOM to use a layout suitable for jQuery UI's theming */
        -					oSettings.sDom = '<"H"lfr>t<"F"ip>';
        -				}
        -			
        -				if ( ! oSettings.renderer ) {
        -					oSettings.renderer = 'jqueryui';
        -				}
        -				else if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {
        -					oSettings.renderer.header = 'jqueryui';
        -				}
        -			}
        -			else
        -			{
        -				$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
        -			}
        -			$this.addClass( oClasses.sTable );
        -			
        -			/* Calculate the scroll bar width and cache it for use later on */
        -			if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
        -			{
        -				oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
        -			}
        -			if ( oSettings.oScroll.sX === true ) { // Easy initialisation of x-scrolling
        -				oSettings.oScroll.sX = '100%';
        -			}
        -			
        -			if ( oSettings.iInitDisplayStart === undefined )
        -			{
        -				/* Display start point, taking into account the save saving */
        -				oSettings.iInitDisplayStart = oInit.iDisplayStart;
        -				oSettings._iDisplayStart = oInit.iDisplayStart;
        -			}
        -			
        -			if ( oInit.iDeferLoading !== null )
        -			{
        -				oSettings.bDeferLoading = true;
        -				var tmp = $.isArray( oInit.iDeferLoading );
        -				oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
        -				oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
        -			}
        -			
        -			/* Language definitions */
        -			var oLanguage = oSettings.oLanguage;
        -			$.extend( true, oLanguage, oInit.oLanguage );
        -			
        -			if ( oLanguage.sUrl !== "" )
        -			{
        -				/* Get the language definitions from a file - because this Ajax call makes the language
        -				 * get async to the remainder of this function we use bInitHandedOff to indicate that
        -				 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
        -				 */
        -				$.ajax( {
        -					dataType: 'json',
        -					url: oLanguage.sUrl,
        -					success: function ( json ) {
        -						_fnLanguageCompat( json );
        -						_fnCamelToHungarian( defaults.oLanguage, json );
        -						$.extend( true, oLanguage, json );
        -						_fnInitialise( oSettings );
        -					},
        -					error: function () {
        -						// Error occurred loading language file, continue on as best we can
        -						_fnInitialise( oSettings );
        -					}
        -				} );
        -				bInitHandedOff = true;
        -			}
        -			
        -			/*
        -			 * Stripes
        -			 */
        -			if ( oInit.asStripeClasses === null )
        -			{
        -				oSettings.asStripeClasses =[
        -					oClasses.sStripeOdd,
        -					oClasses.sStripeEven
        -				];
        -			}
        -			
        -			/* Remove row stripe classes if they are already on the table row */
        -			var stripeClasses = oSettings.asStripeClasses;
        -			var rowOne = $this.children('tbody').find('tr').eq(0);
        -			if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
        -				return rowOne.hasClass(el);
        -			} ) ) !== -1 ) {
        -				$('tbody tr', this).removeClass( stripeClasses.join(' ') );
        -				oSettings.asDestroyStripes = stripeClasses.slice();
        -			}
        -			
        -			/*
        -			 * Columns
        -			 * See if we should load columns automatically or use defined ones
        -			 */
        -			var anThs = [];
        -			var aoColumnsInit;
        -			var nThead = this.getElementsByTagName('thead');
        -			if ( nThead.length !== 0 )
        -			{
        -				_fnDetectHeader( oSettings.aoHeader, nThead[0] );
        -				anThs = _fnGetUniqueThs( oSettings );
        -			}
        -			
        -			/* If not given a column array, generate one with nulls */
        -			if ( oInit.aoColumns === null )
        -			{
        -				aoColumnsInit = [];
        -				for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
        -				{
        -					aoColumnsInit.push( null );
        -				}
        -			}
        -			else
        -			{
        -				aoColumnsInit = oInit.aoColumns;
        -			}
        -			
        -			/* Add the columns */
        -			for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
        -			{
        -				_fnAddColumn( oSettings, anThs ? anThs[i] : null );
        -			}
        -			
        -			/* Apply the column definitions */
        -			_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
        -				_fnColumnOptions( oSettings, iCol, oDef );
        -			} );
        -			
        -			/* HTML5 attribute detection - build an mData object automatically if the
        -			 * attributes are found
        -			 */
        -			if ( rowOne.length ) {
        -				var a = function ( cell, name ) {
        -					return cell.getAttribute( 'data-'+name ) !== null ? name : null;
        -				};
        -			
        -				$.each( _fnGetRowElements( oSettings, rowOne[0] ).cells, function (i, cell) {
        -					var col = oSettings.aoColumns[i];
        -			
        -					if ( col.mData === i ) {
        -						var sort = a( cell, 'sort' ) || a( cell, 'order' );
        -						var filter = a( cell, 'filter' ) || a( cell, 'search' );
        -			
        -						if ( sort !== null || filter !== null ) {
        -							col.mData = {
        -								_:      i+'.display',
        -								sort:   sort !== null   ? i+'.@data-'+sort   : undefined,
        -								type:   sort !== null   ? i+'.@data-'+sort   : undefined,
        -								filter: filter !== null ? i+'.@data-'+filter : undefined
        -							};
        -			
        -							_fnColumnOptions( oSettings, i );
        -						}
        -					}
        -				} );
        -			}
        -			
        -			var features = oSettings.oFeatures;
        -			
        -			/* Must be done after everything which can be overridden by the state saving! */
        -			if ( oInit.bStateSave )
        -			{
        -				features.bStateSave = true;
        -				_fnLoadState( oSettings, oInit );
        -				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
        -			}
        -			
        -			
        -			/*
        -			 * Sorting
        -			 * @todo For modularisation (1.11) this needs to do into a sort start up handler
        -			 */
        -			
        -			// If aaSorting is not defined, then we use the first indicator in asSorting
        -			// in case that has been altered, so the default sort reflects that option
        -			if ( oInit.aaSorting === undefined )
        -			{
        -				var sorting = oSettings.aaSorting;
        -				for ( i=0, iLen=sorting.length ; i<iLen ; i++ )
        -				{
        -					sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
        -				}
        -			}
        -			
        -			/* Do a first pass on the sorting classes (allows any size changes to be taken into
        -			 * account, and also will apply sorting disabled classes if disabled
        -			 */
        -			_fnSortingClasses( oSettings );
        -			
        -			if ( features.bSort )
        -			{
        -				_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
        -					if ( oSettings.bSorted ) {
        -						var aSort = _fnSortFlatten( oSettings );
        -						var sortedColumns = {};
        -			
        -						$.each( aSort, function (i, val) {
        -							sortedColumns[ val.src ] = val.dir;
        -						} );
        -			
        -						_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
        -						_fnSortAria( oSettings );
        -					}
        -				} );
        -			}
        -			
        -			_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
        -				if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
        -					_fnSortingClasses( oSettings );
        -				}
        -			}, 'sc' );
        -			
        -			
        -			/*
        -			 * Final init
        -			 * Cache the header, body and footer as required, creating them if needed
        -			 */
        -			
        -			/* Browser support detection */
        -			_fnBrowserDetect( oSettings );
        -			
        -			// Work around for Webkit bug 83867 - store the caption-side before removing from doc
        -			var captions = $this.children('caption').each( function () {
        -				this._captionSide = $this.css('caption-side');
        -			} );
        -			
        -			var thead = $this.children('thead');
        -			if ( thead.length === 0 )
        -			{
        -				thead = $('<thead/>').appendTo(this);
        -			}
        -			oSettings.nTHead = thead[0];
        -			
        -			var tbody = $this.children('tbody');
        -			if ( tbody.length === 0 )
        -			{
        -				tbody = $('<tbody/>').appendTo(this);
        -			}
        -			oSettings.nTBody = tbody[0];
        -			
        -			var tfoot = $this.children('tfoot');
        -			if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
        -			{
        -				// If we are a scrolling table, and no footer has been given, then we need to create
        -				// a tfoot element for the caption element to be appended to
        -				tfoot = $('<tfoot/>').appendTo(this);
        -			}
        -			
        -			if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
        -				$this.addClass( oClasses.sNoFooter );
        -			}
        -			else if ( tfoot.length > 0 ) {
        -				oSettings.nTFoot = tfoot[0];
        -				_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
        -			}
        -			
        -			/* Check if there is data passing into the constructor */
        -			if ( oInit.aaData )
        -			{
        -				for ( i=0 ; i<oInit.aaData.length ; i++ )
        -				{
        -					_fnAddData( oSettings, oInit.aaData[ i ] );
        -				}
        -			}
        -			else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' )
        -			{
        -				/* Grab the data from the page - only do this when deferred loading or no Ajax
        -				 * source since there is no point in reading the DOM data if we are then going
        -				 * to replace it with Ajax data
        -				 */
        -				_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
        -			}
        -			
        -			/* Copy the data index array */
        -			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
        -			
        -			/* Initialisation complete - table can be drawn */
        -			oSettings.bInitialised = true;
        -			
        -			/* Check if we need to initialise the table (it might not have been handed off to the
        -			 * language processor)
        -			 */
        -			if ( bInitHandedOff === false )
        -			{
        -				_fnInitialise( oSettings );
        -			}
        -		} );
        -		_that = null;
        -		return this;
        -	};
        -
        -	
        -	
        -	/**
        -	 * Computed structure of the DataTables API, defined by the options passed to
        -	 * `DataTable.Api.register()` when building the API.
        -	 *
        -	 * The structure is built in order to speed creation and extension of the Api
        -	 * objects since the extensions are effectively pre-parsed.
        -	 *
        -	 * The array is an array of objects with the following structure, where this
        -	 * base array represents the Api prototype base:
        -	 *
        -	 *     [
        -	 *       {
        -	 *         name:      'data'                -- string   - Property name
        -	 *         val:       function () {},       -- function - Api method (or undefined if just an object
        -	 *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
        -	 *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
        -	 *       },
        -	 *       {
        -	 *         name:     'row'
        -	 *         val:       {},
        -	 *         methodExt: [ ... ],
        -	 *         propExt:   [
        -	 *           {
        -	 *             name:      'data'
        -	 *             val:       function () {},
        -	 *             methodExt: [ ... ],
        -	 *             propExt:   [ ... ]
        -	 *           },
        -	 *           ...
        -	 *         ]
        -	 *       }
        -	 *     ]
        -	 *
        -	 * @type {Array}
        -	 * @ignore
        -	 */
        -	var __apiStruct = [];
        -	
        -	
        -	/**
        -	 * `Array.prototype` reference.
        -	 *
        -	 * @type object
        -	 * @ignore
        -	 */
        -	var __arrayProto = Array.prototype;
        -	
        -	
        -	/**
        -	 * Abstraction for `context` parameter of the `Api` constructor to allow it to
        -	 * take several different forms for ease of use.
        -	 *
        -	 * Each of the input parameter types will be converted to a DataTables settings
        -	 * object where possible.
        -	 *
        -	 * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one
        -	 *   of:
        -	 *
        -	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
        -	 *     with be found and used.
        -	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
        -	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
        -	 *   * `object` - DataTables settings object
        -	 *   * `DataTables.Api` - API instance
        -	 * @return {array|null} Matching DataTables settings objects. `null` or
        -	 *   `undefined` is returned if no matching DataTable is found.
        -	 * @ignore
        -	 */
        -	var _toSettings = function ( mixed )
        -	{
        -		var idx, jq;
        -		var settings = DataTable.settings;
        -		var tables = $.map( settings, function (el, i) {
        -			return el.nTable;
        -		} );
        -	
        -		if ( ! mixed ) {
        -			return [];
        -		}
        -		else if ( mixed.nTable && mixed.oApi ) {
        -			// DataTables settings object
        -			return [ mixed ];
        -		}
        -		else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
        -			// Table node
        -			idx = $.inArray( mixed, tables );
        -			return idx !== -1 ? [ settings[idx] ] : null;
        -		}
        -		else if ( mixed && typeof mixed.settings === 'function' ) {
        -			return mixed.settings().toArray();
        -		}
        -		else if ( typeof mixed === 'string' ) {
        -			// jQuery selector
        -			jq = $(mixed);
        -		}
        -		else if ( mixed instanceof $ ) {
        -			// jQuery object (also DataTables instance)
        -			jq = mixed;
        -		}
        -	
        -		if ( jq ) {
        -			return jq.map( function(i) {
        -				idx = $.inArray( this, tables );
        -				return idx !== -1 ? settings[idx] : null;
        -			} ).toArray();
        -		}
        -	};
        -	
        -	
        -	/**
        -	 * DataTables API class - used to control and interface with  one or more
        -	 * DataTables enhanced tables.
        -	 *
        -	 * The API class is heavily based on jQuery, presenting a chainable interface
        -	 * that you can use to interact with tables. Each instance of the API class has
        -	 * a "context" - i.e. the tables that it will operate on. This could be a single
        -	 * table, all tables on a page or a sub-set thereof.
        -	 *
        -	 * Additionally the API is designed to allow you to easily work with the data in
        -	 * the tables, retrieving and manipulating it as required. This is done by
        -	 * presenting the API class as an array like interface. The contents of the
        -	 * array depend upon the actions requested by each method (for example
        -	 * `rows().nodes()` will return an array of nodes, while `rows().data()` will
        -	 * return an array of objects or arrays depending upon your table's
        -	 * configuration). The API object has a number of array like methods (`push`,
        -	 * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
        -	 * `unique` etc) to assist your working with the data held in a table.
        -	 *
        -	 * Most methods (those which return an Api instance) are chainable, which means
        -	 * the return from a method call also has all of the methods available that the
        -	 * top level object had. For example, these two calls are equivalent:
        -	 *
        -	 *     // Not chained
        -	 *     api.row.add( {...} );
        -	 *     api.draw();
        -	 *
        -	 *     // Chained
        -	 *     api.row.add( {...} ).draw();
        -	 *
        -	 * @class DataTable.Api
        -	 * @param {array|object|string|jQuery} context DataTable identifier. This is
        -	 *   used to define which DataTables enhanced tables this API will operate on.
        -	 *   Can be one of:
        -	 *
        -	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
        -	 *     with be found and used.
        -	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
        -	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
        -	 *   * `object` - DataTables settings object
        -	 * @param {array} [data] Data to initialise the Api instance with.
        -	 *
        -	 * @example
        -	 *   // Direct initialisation during DataTables construction
        -	 *   var api = $('#example').DataTable();
        -	 *
        -	 * @example
        -	 *   // Initialisation using a DataTables jQuery object
        -	 *   var api = $('#example').dataTable().api();
        -	 *
        -	 * @example
        -	 *   // Initialisation as a constructor
        -	 *   var api = new $.fn.DataTable.Api( 'table.dataTable' );
        -	 */
        -	_Api = function ( context, data )
        -	{
        -		if ( ! (this instanceof _Api) ) {
        -			return new _Api( context, data );
        -		}
        -	
        -		var settings = [];
        -		var ctxSettings = function ( o ) {
        -			var a = _toSettings( o );
        -			if ( a ) {
        -				settings.push.apply( settings, a );
        -			}
        -		};
        -	
        -		if ( $.isArray( context ) ) {
        -			for ( var i=0, ien=context.length ; i<ien ; i++ ) {
        -				ctxSettings( context[i] );
        -			}
        -		}
        -		else {
        -			ctxSettings( context );
        -		}
        -	
        -		// Remove duplicates
        -		this.context = _unique( settings );
        -	
        -		// Initial data
        -		if ( data ) {
        -			this.push.apply( this, data.toArray ? data.toArray() : data );
        -		}
        -	
        -		// selector
        -		this.selector = {
        -			rows: null,
        -			cols: null,
        -			opts: null
        -		};
        -	
        -		_Api.extend( this, this, __apiStruct );
        -	};
        -	
        -	DataTable.Api = _Api;
        -	
        -	_Api.prototype = /** @lends DataTables.Api */{
        -		any: function ()
        -		{
        -			return this.flatten().length !== 0;
        -		},
        -	
        -	
        -		concat:  __arrayProto.concat,
        -	
        -	
        -		context: [], // array of table settings objects
        -	
        -	
        -		each: function ( fn )
        -		{
        -			for ( var i=0, ien=this.length ; i<ien; i++ ) {
        -				fn.call( this, this[i], i, this );
        -			}
        -	
        -			return this;
        -		},
        -	
        -	
        -		eq: function ( idx )
        -		{
        -			var ctx = this.context;
        -	
        -			return ctx.length > idx ?
        -				new _Api( ctx[idx], this[idx] ) :
        -				null;
        -		},
        -	
        -	
        -		filter: function ( fn )
        -		{
        -			var a = [];
        -	
        -			if ( __arrayProto.filter ) {
        -				a = __arrayProto.filter.call( this, fn, this );
        -			}
        -			else {
        -				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
        -				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
        -					if ( fn.call( this, this[i], i, this ) ) {
        -						a.push( this[i] );
        -					}
        -				}
        -			}
        -	
        -			return new _Api( this.context, a );
        -		},
        -	
        -	
        -		flatten: function ()
        -		{
        -			var a = [];
        -			return new _Api( this.context, a.concat.apply( a, this.toArray() ) );
        -		},
        -	
        -	
        -		join:    __arrayProto.join,
        -	
        -	
        -		indexOf: __arrayProto.indexOf || function (obj, start)
        -		{
        -			for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {
        -				if ( this[i] === obj ) {
        -					return i;
        -				}
        -			}
        -			return -1;
        -		},
        -	
        -		iterator: function ( flatten, type, fn, alwaysNew ) {
        -			var
        -				a = [], ret,
        -				i, ien, j, jen,
        -				context = this.context,
        -				rows, items, item,
        -				selector = this.selector;
        -	
        -			// Argument shifting
        -			if ( typeof flatten === 'string' ) {
        -				alwaysNew = fn;
        -				fn = type;
        -				type = flatten;
        -				flatten = false;
        -			}
        -	
        -			for ( i=0, ien=context.length ; i<ien ; i++ ) {
        -				var apiInst = new _Api( context[i] );
        -	
        -				if ( type === 'table' ) {
        -					ret = fn.call( apiInst, context[i], i );
        -	
        -					if ( ret !== undefined ) {
        -						a.push( ret );
        -					}
        -				}
        -				else if ( type === 'columns' || type === 'rows' ) {
        -					// this has same length as context - one entry for each table
        -					ret = fn.call( apiInst, context[i], this[i], i );
        -	
        -					if ( ret !== undefined ) {
        -						a.push( ret );
        -					}
        -				}
        -				else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {
        -					// columns and rows share the same structure.
        -					// 'this' is an array of column indexes for each context
        -					items = this[i];
        -	
        -					if ( type === 'column-rows' ) {
        -						rows = _selector_row_indexes( context[i], selector.opts );
        -					}
        -	
        -					for ( j=0, jen=items.length ; j<jen ; j++ ) {
        -						item = items[j];
        -	
        -						if ( type === 'cell' ) {
        -							ret = fn.call( apiInst, context[i], item.row, item.column, i, j );
        -						}
        -						else {
        -							ret = fn.call( apiInst, context[i], item, i, j, rows );
        -						}
        -	
        -						if ( ret !== undefined ) {
        -							a.push( ret );
        -						}
        -					}
        -				}
        -			}
        -	
        -			if ( a.length || alwaysNew ) {
        -				var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );
        -				var apiSelector = api.selector;
        -				apiSelector.rows = selector.rows;
        -				apiSelector.cols = selector.cols;
        -				apiSelector.opts = selector.opts;
        -				return api;
        -			}
        -			return this;
        -		},
        -	
        -	
        -		lastIndexOf: __arrayProto.lastIndexOf || function (obj, start)
        -		{
        -			// Bit cheeky...
        -			return this.indexOf.apply( this.toArray.reverse(), arguments );
        -		},
        -	
        -	
        -		length:  0,
        -	
        -	
        -		map: function ( fn )
        -		{
        -			var a = [];
        -	
        -			if ( __arrayProto.map ) {
        -				a = __arrayProto.map.call( this, fn, this );
        -			}
        -			else {
        -				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
        -				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
        -					a.push( fn.call( this, this[i], i ) );
        -				}
        -			}
        -	
        -			return new _Api( this.context, a );
        -		},
        -	
        -	
        -		pluck: function ( prop )
        -		{
        -			return this.map( function ( el ) {
        -				return el[ prop ];
        -			} );
        -		},
        -	
        -		pop:     __arrayProto.pop,
        -	
        -	
        -		push:    __arrayProto.push,
        -	
        -	
        -		// Does not return an API instance
        -		reduce: __arrayProto.reduce || function ( fn, init )
        -		{
        -			return _fnReduce( this, fn, init, 0, this.length, 1 );
        -		},
        -	
        -	
        -		reduceRight: __arrayProto.reduceRight || function ( fn, init )
        -		{
        -			return _fnReduce( this, fn, init, this.length-1, -1, -1 );
        -		},
        -	
        -	
        -		reverse: __arrayProto.reverse,
        -	
        -	
        -		// Object with rows, columns and opts
        -		selector: null,
        -	
        -	
        -		shift:   __arrayProto.shift,
        -	
        -	
        -		sort:    __arrayProto.sort, // ? name - order?
        -	
        -	
        -		splice:  __arrayProto.splice,
        -	
        -	
        -		toArray: function ()
        -		{
        -			return __arrayProto.slice.call( this );
        -		},
        -	
        -	
        -		to$: function ()
        -		{
        -			return $( this );
        -		},
        -	
        -	
        -		toJQuery: function ()
        -		{
        -			return $( this );
        -		},
        -	
        -	
        -		unique: function ()
        -		{
        -			return new _Api( this.context, _unique(this) );
        -		},
        -	
        -	
        -		unshift: __arrayProto.unshift
        -	};
        -	
        -	
        -	_Api.extend = function ( scope, obj, ext )
        -	{
        -		// Only extend API instances and static properties of the API
        -		if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {
        -			return;
        -		}
        -	
        -		var
        -			i, ien,
        -			j, jen,
        -			struct, inner,
        -			methodScoping = function ( scope, fn, struc ) {
        -				return function () {
        -					var ret = fn.apply( scope, arguments );
        -	
        -					// Method extension
        -					_Api.extend( ret, ret, struc.methodExt );
        -					return ret;
        -				};
        -			};
        -	
        -		for ( i=0, ien=ext.length ; i<ien ; i++ ) {
        -			struct = ext[i];
        -	
        -			// Value
        -			obj[ struct.name ] = typeof struct.val === 'function' ?
        -				methodScoping( scope, struct.val, struct ) :
        -				$.isPlainObject( struct.val ) ?
        -					{} :
        -					struct.val;
        -	
        -			obj[ struct.name ].__dt_wrapper = true;
        -	
        -			// Property extension
        -			_Api.extend( scope, obj[ struct.name ], struct.propExt );
        -		}
        -	};
        -	
        -	
        -	// @todo - Is there need for an augment function?
        -	// _Api.augment = function ( inst, name )
        -	// {
        -	// 	// Find src object in the structure from the name
        -	// 	var parts = name.split('.');
        -	
        -	// 	_Api.extend( inst, obj );
        -	// };
        -	
        -	
        -	//     [
        -	//       {
        -	//         name:      'data'                -- string   - Property name
        -	//         val:       function () {},       -- function - Api method (or undefined if just an object
        -	//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
        -	//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
        -	//       },
        -	//       {
        -	//         name:     'row'
        -	//         val:       {},
        -	//         methodExt: [ ... ],
        -	//         propExt:   [
        -	//           {
        -	//             name:      'data'
        -	//             val:       function () {},
        -	//             methodExt: [ ... ],
        -	//             propExt:   [ ... ]
        -	//           },
        -	//           ...
        -	//         ]
        -	//       }
        -	//     ]
        -	
        -	_Api.register = _api_register = function ( name, val )
        -	{
        -		if ( $.isArray( name ) ) {
        -			for ( var j=0, jen=name.length ; j<jen ; j++ ) {
        -				_Api.register( name[j], val );
        -			}
        -			return;
        -		}
        -	
        -		var
        -			i, ien,
        -			heir = name.split('.'),
        -			struct = __apiStruct,
        -			key, method;
        -	
        -		var find = function ( src, name ) {
        -			for ( var i=0, ien=src.length ; i<ien ; i++ ) {
        -				if ( src[i].name === name ) {
        -					return src[i];
        -				}
        -			}
        -			return null;
        -		};
        -	
        -		for ( i=0, ien=heir.length ; i<ien ; i++ ) {
        -			method = heir[i].indexOf('()') !== -1;
        -			key = method ?
        -				heir[i].replace('()', '') :
        -				heir[i];
        -	
        -			var src = find( struct, key );
        -			if ( ! src ) {
        -				src = {
        -					name:      key,
        -					val:       {},
        -					methodExt: [],
        -					propExt:   []
        -				};
        -				struct.push( src );
        -			}
        -	
        -			if ( i === ien-1 ) {
        -				src.val = val;
        -			}
        -			else {
        -				struct = method ?
        -					src.methodExt :
        -					src.propExt;
        -			}
        -		}
        -	};
        -	
        -	
        -	_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {
        -		_Api.register( pluralName, val );
        -	
        -		_Api.register( singularName, function () {
        -			var ret = val.apply( this, arguments );
        -	
        -			if ( ret === this ) {
        -				// Returned item is the API instance that was passed in, return it
        -				return this;
        -			}
        -			else if ( ret instanceof _Api ) {
        -				// New API instance returned, want the value from the first item
        -				// in the returned array for the singular result.
        -				return ret.length ?
        -					$.isArray( ret[0] ) ?
        -						new _Api( ret.context, ret[0] ) : // Array results are 'enhanced'
        -						ret[0] :
        -					undefined;
        -			}
        -	
        -			// Non-API return - just fire it back
        -			return ret;
        -		} );
        -	};
        -	
        -	
        -	/**
        -	 * Selector for HTML tables. Apply the given selector to the give array of
        -	 * DataTables settings objects.
        -	 *
        -	 * @param {string|integer} [selector] jQuery selector string or integer
        -	 * @param  {array} Array of DataTables settings objects to be filtered
        -	 * @return {array}
        -	 * @ignore
        -	 */
        -	var __table_selector = function ( selector, a )
        -	{
        -		// Integer is used to pick out a table by index
        -		if ( typeof selector === 'number' ) {
        -			return [ a[ selector ] ];
        -		}
        -	
        -		// Perform a jQuery selector on the table nodes
        -		var nodes = $.map( a, function (el, i) {
        -			return el.nTable;
        -		} );
        -	
        -		return $(nodes)
        -			.filter( selector )
        -			.map( function (i) {
        -				// Need to translate back from the table node to the settings
        -				var idx = $.inArray( this, nodes );
        -				return a[ idx ];
        -			} )
        -			.toArray();
        -	};
        -	
        -	
        -	
        -	/**
        -	 * Context selector for the API's context (i.e. the tables the API instance
        -	 * refers to.
        -	 *
        -	 * @name    DataTable.Api#tables
        -	 * @param {string|integer} [selector] Selector to pick which tables the iterator
        -	 *   should operate on. If not given, all tables in the current context are
        -	 *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to
        -	 *   select multiple tables or as an integer to select a single table.
        -	 * @returns {DataTable.Api} Returns a new API instance if a selector is given.
        -	 */
        -	_api_register( 'tables()', function ( selector ) {
        -		// A new instance is created if there was a selector specified
        -		return selector ?
        -			new _Api( __table_selector( selector, this.context ) ) :
        -			this;
        -	} );
        -	
        -	
        -	_api_register( 'table()', function ( selector ) {
        -		var tables = this.tables( selector );
        -		var ctx = tables.context;
        -	
        -		// Truncate to the first matched table
        -		return ctx.length ?
        -			new _Api( ctx[0] ) :
        -			tables;
        -	} );
        -	
        -	
        -	_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {
        -		return this.iterator( 'table', function ( ctx ) {
        -			return ctx.nTable;
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'tables().body()', 'table().body()' , function () {
        -		return this.iterator( 'table', function ( ctx ) {
        -			return ctx.nTBody;
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'tables().header()', 'table().header()' , function () {
        -		return this.iterator( 'table', function ( ctx ) {
        -			return ctx.nTHead;
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {
        -		return this.iterator( 'table', function ( ctx ) {
        -			return ctx.nTFoot;
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'tables().containers()', 'table().container()' , function () {
        -		return this.iterator( 'table', function ( ctx ) {
        -			return ctx.nTableWrapper;
        -		}, 1 );
        -	} );
        -	
        -	
        -	
        -	/**
        -	 * Redraw the tables in the current context.
        -	 *
        -	 * @param {boolean} [reset=true] Reset (default) or hold the current paging
        -	 *   position. A full re-sort and re-filter is performed when this method is
        -	 *   called, which is why the pagination reset is the default action.
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'draw()', function ( resetPaging ) {
        -		return this.iterator( 'table', function ( settings ) {
        -			_fnReDraw( settings, resetPaging===false );
        -		} );
        -	} );
        -	
        -	
        -	
        -	/**
        -	 * Get the current page index.
        -	 *
        -	 * @return {integer} Current page index (zero based)
        -	 *//**
        -	 * Set the current page.
        -	 *
        -	 * Note that if you attempt to show a page which does not exist, DataTables will
        -	 * not throw an error, but rather reset the paging.
        -	 *
        -	 * @param {integer|string} action The paging action to take. This can be one of:
        -	 *  * `integer` - The page index to jump to
        -	 *  * `string` - An action to take:
        -	 *    * `first` - Jump to first page.
        -	 *    * `next` - Jump to the next page
        -	 *    * `previous` - Jump to previous page
        -	 *    * `last` - Jump to the last page.
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'page()', function ( action ) {
        -		if ( action === undefined ) {
        -			return this.page.info().page; // not an expensive call
        -		}
        -	
        -		// else, have an action to take on all tables
        -		return this.iterator( 'table', function ( settings ) {
        -			_fnPageChange( settings, action );
        -		} );
        -	} );
        -	
        -	
        -	/**
        -	 * Paging information for the first table in the current context.
        -	 *
        -	 * If you require paging information for another table, use the `table()` method
        -	 * with a suitable selector.
        -	 *
        -	 * @return {object} Object with the following properties set:
        -	 *  * `page` - Current page index (zero based - i.e. the first page is `0`)
        -	 *  * `pages` - Total number of pages
        -	 *  * `start` - Display index for the first record shown on the current page
        -	 *  * `end` - Display index for the last record shown on the current page
        -	 *  * `length` - Display length (number of records). Note that generally `start
        -	 *    + length = end`, but this is not always true, for example if there are
        -	 *    only 2 records to show on the final page, with a length of 10.
        -	 *  * `recordsTotal` - Full data set length
        -	 *  * `recordsDisplay` - Data set length once the current filtering criterion
        -	 *    are applied.
        -	 */
        -	_api_register( 'page.info()', function ( action ) {
        -		if ( this.context.length === 0 ) {
        -			return undefined;
        -		}
        -	
        -		var
        -			settings   = this.context[0],
        -			start      = settings._iDisplayStart,
        -			len        = settings._iDisplayLength,
        -			visRecords = settings.fnRecordsDisplay(),
        -			all        = len === -1;
        -	
        -		return {
        -			"page":           all ? 0 : Math.floor( start / len ),
        -			"pages":          all ? 1 : Math.ceil( visRecords / len ),
        -			"start":          start,
        -			"end":            settings.fnDisplayEnd(),
        -			"length":         len,
        -			"recordsTotal":   settings.fnRecordsTotal(),
        -			"recordsDisplay": visRecords
        -		};
        -	} );
        -	
        -	
        -	/**
        -	 * Get the current page length.
        -	 *
        -	 * @return {integer} Current page length. Note `-1` indicates that all records
        -	 *   are to be shown.
        -	 *//**
        -	 * Set the current page length.
        -	 *
        -	 * @param {integer} Page length to set. Use `-1` to show all records.
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'page.len()', function ( len ) {
        -		// Note that we can't call this function 'length()' because `length`
        -		// is a Javascript property of functions which defines how many arguments
        -		// the function expects.
        -		if ( len === undefined ) {
        -			return this.context.length !== 0 ?
        -				this.context[0]._iDisplayLength :
        -				undefined;
        -		}
        -	
        -		// else, set the page length
        -		return this.iterator( 'table', function ( settings ) {
        -			_fnLengthChange( settings, len );
        -		} );
        -	} );
        -	
        -	
        -	
        -	var __reload = function ( settings, holdPosition, callback ) {
        -		// Use the draw event to trigger a callback
        -		if ( callback ) {
        -			var api = new _Api( settings );
        -	
        -			api.one( 'draw', function () {
        -				callback( api.ajax.json() );
        -			} );
        -		}
        -	
        -		if ( _fnDataSource( settings ) == 'ssp' ) {
        -			_fnReDraw( settings, holdPosition );
        -		}
        -		else {
        -			// Trigger xhr
        -			_fnProcessingDisplay( settings, true );
        -	
        -			_fnBuildAjax( settings, [], function( json ) {
        -				_fnClearTable( settings );
        -	
        -				var data = _fnAjaxDataSrc( settings, json );
        -				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
        -					_fnAddData( settings, data[i] );
        -				}
        -	
        -				_fnReDraw( settings, holdPosition );
        -				_fnProcessingDisplay( settings, false );
        -			} );
        -		}
        -	};
        -	
        -	
        -	/**
        -	 * Get the JSON response from the last Ajax request that DataTables made to the
        -	 * server. Note that this returns the JSON from the first table in the current
        -	 * context.
        -	 *
        -	 * @return {object} JSON received from the server.
        -	 */
        -	_api_register( 'ajax.json()', function () {
        -		var ctx = this.context;
        -	
        -		if ( ctx.length > 0 ) {
        -			return ctx[0].json;
        -		}
        -	
        -		// else return undefined;
        -	} );
        -	
        -	
        -	/**
        -	 * Get the data submitted in the last Ajax request
        -	 */
        -	_api_register( 'ajax.params()', function () {
        -		var ctx = this.context;
        -	
        -		if ( ctx.length > 0 ) {
        -			return ctx[0].oAjaxData;
        -		}
        -	
        -		// else return undefined;
        -	} );
        -	
        -	
        -	/**
        -	 * Reload tables from the Ajax data source. Note that this function will
        -	 * automatically re-draw the table when the remote data has been loaded.
        -	 *
        -	 * @param {boolean} [reset=true] Reset (default) or hold the current paging
        -	 *   position. A full re-sort and re-filter is performed when this method is
        -	 *   called, which is why the pagination reset is the default action.
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'ajax.reload()', function ( callback, resetPaging ) {
        -		return this.iterator( 'table', function (settings) {
        -			__reload( settings, resetPaging===false, callback );
        -		} );
        -	} );
        -	
        -	
        -	/**
        -	 * Get the current Ajax URL. Note that this returns the URL from the first
        -	 * table in the current context.
        -	 *
        -	 * @return {string} Current Ajax source URL
        -	 *//**
        -	 * Set the Ajax URL. Note that this will set the URL for all tables in the
        -	 * current context.
        -	 *
        -	 * @param {string} url URL to set.
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'ajax.url()', function ( url ) {
        -		var ctx = this.context;
        -	
        -		if ( url === undefined ) {
        -			// get
        -			if ( ctx.length === 0 ) {
        -				return undefined;
        -			}
        -			ctx = ctx[0];
        -	
        -			return ctx.ajax ?
        -				$.isPlainObject( ctx.ajax ) ?
        -					ctx.ajax.url :
        -					ctx.ajax :
        -				ctx.sAjaxSource;
        -		}
        -	
        -		// set
        -		return this.iterator( 'table', function ( settings ) {
        -			if ( $.isPlainObject( settings.ajax ) ) {
        -				settings.ajax.url = url;
        -			}
        -			else {
        -				settings.ajax = url;
        -			}
        -			// No need to consider sAjaxSource here since DataTables gives priority
        -			// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
        -			// value of `sAjaxSource` redundant.
        -		} );
        -	} );
        -	
        -	
        -	/**
        -	 * Load data from the newly set Ajax URL. Note that this method is only
        -	 * available when `ajax.url()` is used to set a URL. Additionally, this method
        -	 * has the same effect as calling `ajax.reload()` but is provided for
        -	 * convenience when setting a new URL. Like `ajax.reload()` it will
        -	 * automatically redraw the table once the remote data has been loaded.
        -	 *
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
        -		// Same as a reload, but makes sense to present it for easy access after a
        -		// url change
        -		return this.iterator( 'table', function ( ctx ) {
        -			__reload( ctx, resetPaging===false, callback );
        -		} );
        -	} );
        -	
        -	
        -	
        -	
        -	var _selector_run = function ( type, selector, selectFn, settings, opts )
        -	{
        -		var
        -			out = [], res,
        -			a, i, ien, j, jen,
        -			selectorType = typeof selector;
        -	
        -		// Can't just check for isArray here, as an API or jQuery instance might be
        -		// given with their array like look
        -		if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
        -			selector = [ selector ];
        -		}
        -	
        -		for ( i=0, ien=selector.length ; i<ien ; i++ ) {
        -			a = selector[i] && selector[i].split ?
        -				selector[i].split(',') :
        -				[ selector[i] ];
        -	
        -			for ( j=0, jen=a.length ; j<jen ; j++ ) {
        -				res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );
        -	
        -				if ( res && res.length ) {
        -					out.push.apply( out, res );
        -				}
        -			}
        -		}
        -	
        -		// selector extensions
        -		var ext = _ext.selector[ type ];
        -		if ( ext.length ) {
        -			for ( i=0, ien=ext.length ; i<ien ; i++ ) {
        -				out = ext[i]( settings, opts, out );
        -			}
        -		}
        -	
        -		return out;
        -	};
        -	
        -	
        -	var _selector_opts = function ( opts )
        -	{
        -		if ( ! opts ) {
        -			opts = {};
        -		}
        -	
        -		// Backwards compatibility for 1.9- which used the terminology filter rather
        -		// than search
        -		if ( opts.filter && opts.search === undefined ) {
        -			opts.search = opts.filter;
        -		}
        -	
        -		return $.extend( {
        -			search: 'none',
        -			order: 'current',
        -			page: 'all'
        -		}, opts );
        -	};
        -	
        -	
        -	var _selector_first = function ( inst )
        -	{
        -		// Reduce the API instance to the first item found
        -		for ( var i=0, ien=inst.length ; i<ien ; i++ ) {
        -			if ( inst[i].length > 0 ) {
        -				// Assign the first element to the first item in the instance
        -				// and truncate the instance and context
        -				inst[0] = inst[i];
        -				inst[0].length = 1;
        -				inst.length = 1;
        -				inst.context = [ inst.context[i] ];
        -	
        -				return inst;
        -			}
        -		}
        -	
        -		// Not found - return an empty instance
        -		inst.length = 0;
        -		return inst;
        -	};
        -	
        -	
        -	var _selector_row_indexes = function ( settings, opts )
        -	{
        -		var
        -			i, ien, tmp, a=[],
        -			displayFiltered = settings.aiDisplay,
        -			displayMaster = settings.aiDisplayMaster;
        -	
        -		var
        -			search = opts.search,  // none, applied, removed
        -			order  = opts.order,   // applied, current, index (original - compatibility with 1.9)
        -			page   = opts.page;    // all, current
        -	
        -		if ( _fnDataSource( settings ) == 'ssp' ) {
        -			// In server-side processing mode, most options are irrelevant since
        -			// rows not shown don't exist and the index order is the applied order
        -			// Removed is a special case - for consistency just return an empty
        -			// array
        -			return search === 'removed' ?
        -				[] :
        -				_range( 0, displayMaster.length );
        -		}
        -		else if ( page == 'current' ) {
        -			// Current page implies that order=current and fitler=applied, since it is
        -			// fairly senseless otherwise, regardless of what order and search actually
        -			// are
        -			for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {
        -				a.push( displayFiltered[i] );
        -			}
        -		}
        -		else if ( order == 'current' || order == 'applied' ) {
        -			a = search == 'none' ?
        -				displayMaster.slice() :                      // no search
        -				search == 'applied' ?
        -					displayFiltered.slice() :                // applied search
        -					$.map( displayMaster, function (el, i) { // removed search
        -						return $.inArray( el, displayFiltered ) === -1 ? el : null;
        -					} );
        -		}
        -		else if ( order == 'index' || order == 'original' ) {
        -			for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
        -				if ( search == 'none' ) {
        -					a.push( i );
        -				}
        -				else { // applied | removed
        -					tmp = $.inArray( i, displayFiltered );
        -	
        -					if ((tmp === -1 && search == 'removed') ||
        -						(tmp >= 0   && search == 'applied') )
        -					{
        -						a.push( i );
        -					}
        -				}
        -			}
        -		}
        -	
        -		return a;
        -	};
        -	
        -	
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Rows
        -	 *
        -	 * {}          - no selector - use all available rows
        -	 * {integer}   - row aoData index
        -	 * {node}      - TR node
        -	 * {string}    - jQuery selector to apply to the TR elements
        -	 * {array}     - jQuery array of nodes, or simply an array of TR nodes
        -	 *
        -	 */
        -	
        -	
        -	var __row_selector = function ( settings, selector, opts )
        -	{
        -		var run = function ( sel ) {
        -			var selInt = _intVal( sel );
        -			var i, ien;
        -	
        -			// Short cut - selector is a number and no options provided (default is
        -			// all records, so no need to check if the index is in there, since it
        -			// must be - dev error if the index doesn't exist).
        -			if ( selInt !== null && ! opts ) {
        -				return [ selInt ];
        -			}
        -	
        -			var rows = _selector_row_indexes( settings, opts );
        -	
        -			if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
        -				// Selector - integer
        -				return [ selInt ];
        -			}
        -			else if ( ! sel ) {
        -				// Selector - none
        -				return rows;
        -			}
        -	
        -			// Selector - function
        -			if ( typeof sel === 'function' ) {
        -				return $.map( rows, function (idx) {
        -					var row = settings.aoData[ idx ];
        -					return sel( idx, row._aData, row.nTr ) ? idx : null;
        -				} );
        -			}
        -	
        -			// Get nodes in the order from the `rows` array with null values removed
        -			var nodes = _removeEmpty(
        -				_pluck_order( settings.aoData, rows, 'nTr' )
        -			);
        -	
        -			// Selector - node
        -			if ( sel.nodeName ) {
        -				if ( $.inArray( sel, nodes ) !== -1 ) {
        -					return [ sel._DT_RowIndex ]; // sel is a TR node that is in the table
        -					                             // and DataTables adds a prop for fast lookup
        -				}
        -			}
        -	
        -			// Selector - jQuery selector string, array of nodes or jQuery object/
        -			// As jQuery's .filter() allows jQuery objects to be passed in filter,
        -			// it also allows arrays, so this will cope with all three options
        -			return $(nodes)
        -				.filter( sel )
        -				.map( function () {
        -					return this._DT_RowIndex;
        -				} )
        -				.toArray();
        -		};
        -	
        -		return _selector_run( 'row', selector, run, settings, opts );
        -	};
        -	
        -	
        -	_api_register( 'rows()', function ( selector, opts ) {
        -		// argument shifting
        -		if ( selector === undefined ) {
        -			selector = '';
        -		}
        -		else if ( $.isPlainObject( selector ) ) {
        -			opts = selector;
        -			selector = '';
        -		}
        -	
        -		opts = _selector_opts( opts );
        -	
        -		var inst = this.iterator( 'table', function ( settings ) {
        -			return __row_selector( settings, selector, opts );
        -		}, 1 );
        -	
        -		// Want argument shifting here and in __row_selector?
        -		inst.selector.rows = selector;
        -		inst.selector.opts = opts;
        -	
        -		return inst;
        -	} );
        -	
        -	_api_register( 'rows().nodes()', function () {
        -		return this.iterator( 'row', function ( settings, row ) {
        -			return settings.aoData[ row ].nTr || undefined;
        -		}, 1 );
        -	} );
        -	
        -	_api_register( 'rows().data()', function () {
        -		return this.iterator( true, 'rows', function ( settings, rows ) {
        -			return _pluck_order( settings.aoData, rows, '_aData' );
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
        -		return this.iterator( 'row', function ( settings, row ) {
        -			var r = settings.aoData[ row ];
        -			return type === 'search' ? r._aFilterData : r._aSortData;
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
        -		return this.iterator( 'row', function ( settings, row ) {
        -			_fnInvalidate( settings, row, src );
        -		} );
        -	} );
        -	
        -	_api_registerPlural( 'rows().indexes()', 'row().index()', function () {
        -		return this.iterator( 'row', function ( settings, row ) {
        -			return row;
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'rows().remove()', 'row().remove()', function () {
        -		var that = this;
        -	
        -		return this.iterator( 'row', function ( settings, row, thatIdx ) {
        -			var data = settings.aoData;
        -	
        -			data.splice( row, 1 );
        -	
        -			// Update the _DT_RowIndex parameter on all rows in the table
        -			for ( var i=0, ien=data.length ; i<ien ; i++ ) {
        -				if ( data[i].nTr !== null ) {
        -					data[i].nTr._DT_RowIndex = i;
        -				}
        -			}
        -	
        -			// Remove the target row from the search array
        -			var displayIndex = $.inArray( row, settings.aiDisplay );
        -	
        -			// Delete from the display arrays
        -			_fnDeleteIndex( settings.aiDisplayMaster, row );
        -			_fnDeleteIndex( settings.aiDisplay, row );
        -			_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
        -	
        -			// Check for an 'overflow' they case for displaying the table
        -			_fnLengthOverflow( settings );
        -		} );
        -	} );
        -	
        -	
        -	_api_register( 'rows.add()', function ( rows ) {
        -		var newRows = this.iterator( 'table', function ( settings ) {
        -				var row, i, ien;
        -				var out = [];
        -	
        -				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
        -					row = rows[i];
        -	
        -					if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
        -						out.push( _fnAddTr( settings, row )[0] );
        -					}
        -					else {
        -						out.push( _fnAddData( settings, row ) );
        -					}
        -				}
        -	
        -				return out;
        -			}, 1 );
        -	
        -		// Return an Api.rows() extended instance, so rows().nodes() etc can be used
        -		var modRows = this.rows( -1 );
        -		modRows.pop();
        -		modRows.push.apply( modRows, newRows.toArray() );
        -	
        -		return modRows;
        -	} );
        -	
        -	
        -	
        -	
        -	
        -	/**
        -	 *
        -	 */
        -	_api_register( 'row()', function ( selector, opts ) {
        -		return _selector_first( this.rows( selector, opts ) );
        -	} );
        -	
        -	
        -	_api_register( 'row().data()', function ( data ) {
        -		var ctx = this.context;
        -	
        -		if ( data === undefined ) {
        -			// Get
        -			return ctx.length && this.length ?
        -				ctx[0].aoData[ this[0] ]._aData :
        -				undefined;
        -		}
        -	
        -		// Set
        -		ctx[0].aoData[ this[0] ]._aData = data;
        -	
        -		// Automatically invalidate
        -		_fnInvalidate( ctx[0], this[0], 'data' );
        -	
        -		return this;
        -	} );
        -	
        -	
        -	_api_register( 'row().node()', function () {
        -		var ctx = this.context;
        -	
        -		return ctx.length && this.length ?
        -			ctx[0].aoData[ this[0] ].nTr || null :
        -			null;
        -	} );
        -	
        -	
        -	_api_register( 'row.add()', function ( row ) {
        -		// Allow a jQuery object to be passed in - only a single row is added from
        -		// it though - the first element in the set
        -		if ( row instanceof $ && row.length ) {
        -			row = row[0];
        -		}
        -	
        -		var rows = this.iterator( 'table', function ( settings ) {
        -			if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
        -				return _fnAddTr( settings, row )[0];
        -			}
        -			return _fnAddData( settings, row );
        -		} );
        -	
        -		// Return an Api.rows() extended instance, with the newly added row selected
        -		return this.row( rows[0] );
        -	} );
        -	
        -	
        -	
        -	var __details_add = function ( ctx, row, data, klass )
        -	{
        -		// Convert to array of TR elements
        -		var rows = [];
        -		var addRow = function ( r, k ) {
        -			// Recursion to allow for arrays of jQuery objects
        -			if ( $.isArray( r ) || r instanceof $ ) {
        -				for ( var i=0, ien=r.length ; i<ien ; i++ ) {
        -					addRow( r[i], k );
        -				}
        -				return;
        -			}
        -	
        -			// If we get a TR element, then just add it directly - up to the dev
        -			// to add the correct number of columns etc
        -			if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {
        -				rows.push( r );
        -			}
        -			else {
        -				// Otherwise create a row with a wrapper
        -				var created = $('<tr><td/></tr>').addClass( k );
        -				$('td', created)
        -					.addClass( k )
        -					.html( r )
        -					[0].colSpan = _fnVisbleColumns( ctx );
        -	
        -				rows.push( created[0] );
        -			}
        -		};
        -	
        -		addRow( data, klass );
        -	
        -		if ( row._details ) {
        -			row._details.remove();
        -		}
        -	
        -		row._details = $(rows);
        -	
        -		// If the children were already shown, that state should be retained
        -		if ( row._detailsShow ) {
        -			row._details.insertAfter( row.nTr );
        -		}
        -	};
        -	
        -	
        -	var __details_remove = function ( api, idx )
        -	{
        -		var ctx = api.context;
        -	
        -		if ( ctx.length ) {
        -			var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
        -	
        -			if ( row._details ) {
        -				row._details.remove();
        -	
        -				row._detailsShow = undefined;
        -				row._details = undefined;
        -			}
        -		}
        -	};
        -	
        -	
        -	var __details_display = function ( api, show ) {
        -		var ctx = api.context;
        -	
        -		if ( ctx.length && api.length ) {
        -			var row = ctx[0].aoData[ api[0] ];
        -	
        -			if ( row._details ) {
        -				row._detailsShow = show;
        -	
        -				if ( show ) {
        -					row._details.insertAfter( row.nTr );
        -				}
        -				else {
        -					row._details.detach();
        -				}
        -	
        -				__details_events( ctx[0] );
        -			}
        -		}
        -	};
        -	
        -	
        -	var __details_events = function ( settings )
        -	{
        -		var api = new _Api( settings );
        -		var namespace = '.dt.DT_details';
        -		var drawEvent = 'draw'+namespace;
        -		var colvisEvent = 'column-visibility'+namespace;
        -		var destroyEvent = 'destroy'+namespace;
        -		var data = settings.aoData;
        -	
        -		api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
        -	
        -		if ( _pluck( data, '_details' ).length > 0 ) {
        -			// On each draw, insert the required elements into the document
        -			api.on( drawEvent, function ( e, ctx ) {
        -				if ( settings !== ctx ) {
        -					return;
        -				}
        -	
        -				api.rows( {page:'current'} ).eq(0).each( function (idx) {
        -					// Internal data grab
        -					var row = data[ idx ];
        -	
        -					if ( row._detailsShow ) {
        -						row._details.insertAfter( row.nTr );
        -					}
        -				} );
        -			} );
        -	
        -			// Column visibility change - update the colspan
        -			api.on( colvisEvent, function ( e, ctx, idx, vis ) {
        -				if ( settings !== ctx ) {
        -					return;
        -				}
        -	
        -				// Update the colspan for the details rows (note, only if it already has
        -				// a colspan)
        -				var row, visible = _fnVisbleColumns( ctx );
        -	
        -				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
        -					row = data[i];
        -	
        -					if ( row._details ) {
        -						row._details.children('td[colspan]').attr('colspan', visible );
        -					}
        -				}
        -			} );
        -	
        -			// Table destroyed - nuke any child rows
        -			api.on( destroyEvent, function ( e, ctx ) {
        -				if ( settings !== ctx ) {
        -					return;
        -				}
        -	
        -				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
        -					if ( data[i]._details ) {
        -						__details_remove( api, i );
        -					}
        -				}
        -			} );
        -		}
        -	};
        -	
        -	// Strings for the method names to help minification
        -	var _emp = '';
        -	var _child_obj = _emp+'row().child';
        -	var _child_mth = _child_obj+'()';
        -	
        -	// data can be:
        -	//  tr
        -	//  string
        -	//  jQuery or array of any of the above
        -	_api_register( _child_mth, function ( data, klass ) {
        -		var ctx = this.context;
        -	
        -		if ( data === undefined ) {
        -			// get
        -			return ctx.length && this.length ?
        -				ctx[0].aoData[ this[0] ]._details :
        -				undefined;
        -		}
        -		else if ( data === true ) {
        -			// show
        -			this.child.show();
        -		}
        -		else if ( data === false ) {
        -			// remove
        -			__details_remove( this );
        -		}
        -		else if ( ctx.length && this.length ) {
        -			// set
        -			__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );
        -		}
        -	
        -		return this;
        -	} );
        -	
        -	
        -	_api_register( [
        -		_child_obj+'.show()',
        -		_child_mth+'.show()' // only when `child()` was called with parameters (without
        -	], function ( show ) {   // it returns an object and this method is not executed)
        -		__details_display( this, true );
        -		return this;
        -	} );
        -	
        -	
        -	_api_register( [
        -		_child_obj+'.hide()',
        -		_child_mth+'.hide()' // only when `child()` was called with parameters (without
        -	], function () {         // it returns an object and this method is not executed)
        -		__details_display( this, false );
        -		return this;
        -	} );
        -	
        -	
        -	_api_register( [
        -		_child_obj+'.remove()',
        -		_child_mth+'.remove()' // only when `child()` was called with parameters (without
        -	], function () {           // it returns an object and this method is not executed)
        -		__details_remove( this );
        -		return this;
        -	} );
        -	
        -	
        -	_api_register( _child_obj+'.isShown()', function () {
        -		var ctx = this.context;
        -	
        -		if ( ctx.length && this.length ) {
        -			// _detailsShown as false or undefined will fall through to return false
        -			return ctx[0].aoData[ this[0] ]._detailsShow || false;
        -		}
        -		return false;
        -	} );
        -	
        -	
        -	
        -	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        -	 * Columns
        -	 *
        -	 * {integer}           - column index (>=0 count from left, <0 count from right)
        -	 * "{integer}:visIdx"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)
        -	 * "{integer}:visible" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)
        -	 * "{string}:name"     - column name
        -	 * "{string}"          - jQuery selector on column header nodes
        -	 *
        -	 */
        -	
        -	// can be an array of these items, comma separated list, or an array of comma
        -	// separated lists
        -	
        -	var __re_column_selector = /^(.+):(name|visIdx|visible)$/;
        -	
        -	
        -	// r1 and r2 are redundant - but it means that the parameters match for the
        -	// iterator callback in columns().data()
        -	var __columnData = function ( settings, column, r1, r2, rows ) {
        -		var a = [];
        -		for ( var row=0, ien=rows.length ; row<ien ; row++ ) {
        -			a.push( _fnGetCellData( settings, rows[row], column ) );
        -		}
        -		return a;
        -	};
        -	
        -	
        -	var __column_selector = function ( settings, selector, opts )
        -	{
        -		var
        -			columns = settings.aoColumns,
        -			names = _pluck( columns, 'sName' ),
        -			nodes = _pluck( columns, 'nTh' );
        -	
        -		var run = function ( s ) {
        -			var selInt = _intVal( s );
        -	
        -			// Selector - all
        -			if ( s === '' ) {
        -				return _range( columns.length );
        -			}
        -			
        -			// Selector - index
        -			if ( selInt !== null ) {
        -				return [ selInt >= 0 ?
        -					selInt : // Count from left
        -					columns.length + selInt // Count from right (+ because its a negative value)
        -				];
        -			}
        -			
        -			// Selector = function
        -			if ( typeof s === 'function' ) {
        -				var rows = _selector_row_indexes( settings, opts );
        -	
        -				return $.map( columns, function (col, idx) {
        -					return s(
        -							idx,
        -							__columnData( settings, idx, 0, 0, rows ),
        -							nodes[ idx ]
        -						) ? idx : null;
        -				} );
        -			}
        -	
        -			// jQuery or string selector
        -			var match = typeof s === 'string' ?
        -				s.match( __re_column_selector ) :
        -				'';
        -	
        -			if ( match ) {
        -				switch( match[2] ) {
        -					case 'visIdx':
        -					case 'visible':
        -						var idx = parseInt( match[1], 10 );
        -						// Visible index given, convert to column index
        -						if ( idx < 0 ) {
        -							// Counting from the right
        -							var visColumns = $.map( columns, function (col,i) {
        -								return col.bVisible ? i : null;
        -							} );
        -							return [ visColumns[ visColumns.length + idx ] ];
        -						}
        -						// Counting from the left
        -						return [ _fnVisibleToColumnIndex( settings, idx ) ];
        -	
        -					case 'name':
        -						// match by name. `names` is column index complete and in order
        -						return $.map( names, function (name, i) {
        -							return name === match[1] ? i : null;
        -						} );
        -				}
        -			}
        -			else {
        -				// jQuery selector on the TH elements for the columns
        -				return $( nodes )
        -					.filter( s )
        -					.map( function () {
        -						return $.inArray( this, nodes ); // `nodes` is column index complete and in order
        -					} )
        -					.toArray();
        -			}
        -		};
        -	
        -		return _selector_run( 'column', selector, run, settings, opts );
        -	};
        -	
        -	
        -	var __setColumnVis = function ( settings, column, vis, recalc ) {
        -		var
        -			cols = settings.aoColumns,
        -			col  = cols[ column ],
        -			data = settings.aoData,
        -			row, cells, i, ien, tr;
        -	
        -		// Get
        -		if ( vis === undefined ) {
        -			return col.bVisible;
        -		}
        -	
        -		// Set
        -		// No change
        -		if ( col.bVisible === vis ) {
        -			return;
        -		}
        -	
        -		if ( vis ) {
        -			// Insert column
        -			// Need to decide if we should use appendChild or insertBefore
        -			var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
        -	
        -			for ( i=0, ien=data.length ; i<ien ; i++ ) {
        -				tr = data[i].nTr;
        -				cells = data[i].anCells;
        -	
        -				if ( tr ) {
        -					// insertBefore can act like appendChild if 2nd arg is null
        -					tr.insertBefore( cells[ column ], cells[ insertBefore ] || null );
        -				}
        -			}
        -		}
        -		else {
        -			// Remove column
        -			$( _pluck( settings.aoData, 'anCells', column ) ).detach();
        -		}
        -	
        -		// Common actions
        -		col.bVisible = vis;
        -		_fnDrawHead( settings, settings.aoHeader );
        -		_fnDrawHead( settings, settings.aoFooter );
        -	
        -		if ( recalc === undefined || recalc ) {
        -			// Automatically adjust column sizing
        -			_fnAdjustColumnSizing( settings );
        -	
        -			// Realign columns for scrolling
        -			if ( settings.oScroll.sX || settings.oScroll.sY ) {
        -				_fnScrollDraw( settings );
        -			}
        -		}
        -	
        -		_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis] );
        -	
        -		_fnSaveState( settings );
        -	};
        -	
        -	
        -	_api_register( 'columns()', function ( selector, opts ) {
        -		// argument shifting
        -		if ( selector === undefined ) {
        -			selector = '';
        -		}
        -		else if ( $.isPlainObject( selector ) ) {
        -			opts = selector;
        -			selector = '';
        -		}
        -	
        -		opts = _selector_opts( opts );
        -	
        -		var inst = this.iterator( 'table', function ( settings ) {
        -			return __column_selector( settings, selector, opts );
        -		}, 1 );
        -	
        -		// Want argument shifting here and in _row_selector?
        -		inst.selector.cols = selector;
        -		inst.selector.opts = opts;
        -	
        -		return inst;
        -	} );
        -	
        -	_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {
        -		return this.iterator( 'column', function ( settings, column ) {
        -			return settings.aoColumns[column].nTh;
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {
        -		return this.iterator( 'column', function ( settings, column ) {
        -			return settings.aoColumns[column].nTf;
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'columns().data()', 'column().data()', function () {
        -		return this.iterator( 'column-rows', __columnData, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {
        -		return this.iterator( 'column', function ( settings, column ) {
        -			return settings.aoColumns[column].mData;
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {
        -		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
        -			return _pluck_order( settings.aoData, rows,
        -				type === 'search' ? '_aFilterData' : '_aSortData', column
        -			);
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {
        -		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
        -			return _pluck_order( settings.aoData, rows, 'anCells', column ) ;
        -		}, 1 );
        -	} );
        -	
        -	_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {
        -		return this.iterator( 'column', function ( settings, column ) {
        -			if ( vis === undefined ) {
        -				return settings.aoColumns[ column ].bVisible;
        -			} // else
        -			__setColumnVis( settings, column, vis, calc );
        -		} );
        -	} );
        -	
        -	_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {
        -		return this.iterator( 'column', function ( settings, column ) {
        -			return type === 'visible' ?
        -				_fnColumnIndexToVisible( settings, column ) :
        -				column;
        -		}, 1 );
        -	} );
        -	
        -	_api_register( 'columns.adjust()', function () {
        -		return this.iterator( 'table', function ( settings ) {
        -			_fnAdjustColumnSizing( settings );
        -		}, 1 );
        -	} );
        -	
        -	_api_register( 'column.index()', function ( type, idx ) {
        -		if ( this.context.length !== 0 ) {
        -			var ctx = this.context[0];
        -	
        -			if ( type === 'fromVisible' || type === 'toData' ) {
        -				return _fnVisibleToColumnIndex( ctx, idx );
        -			}
        -			else if ( type === 'fromData' || type === 'toVisible' ) {
        -				return _fnColumnIndexToVisible( ctx, idx );
        -			}
        -		}
        -	} );
        -	
        -	_api_register( 'column()', function ( selector, opts ) {
        -		return _selector_first( this.columns( selector, opts ) );
        -	} );
        -	
        -	
        -	
        -	
        -	var __cell_selector = function ( settings, selector, opts )
        -	{
        -		var data = settings.aoData;
        -		var rows = _selector_row_indexes( settings, opts );
        -		var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );
        -		var allCells = $( [].concat.apply([], cells) );
        -		var row;
        -		var columns = settings.aoColumns.length;
        -		var a, i, ien, j, o, host;
        -	
        -		var run = function ( s ) {
        -			var fnSelector = typeof s === 'function';
        -	
        -			if ( s === null || s === undefined || fnSelector ) {
        -				// All cells and function selectors
        -				a = [];
        -	
        -				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
        -					row = rows[i];
        -	
        -					for ( j=0 ; j<columns ; j++ ) {
        -						o = {
        -							row: row,
        -							column: j
        -						};
        -	
        -						if ( fnSelector ) {
        -							// Selector - function
        -							host = settings.aoData[ row ];
        -	
        -							if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {
        -								a.push( o );
        -							}
        -						}
        -						else {
        -							// Selector - all
        -							a.push( o );
        -						}
        -					}
        -				}
        -	
        -				return a;
        -			}
        -			
        -			// Selector - index
        -			if ( $.isPlainObject( s ) ) {
        -				return [s];
        -			}
        -	
        -			// Selector - jQuery filtered cells
        -			return allCells
        -				.filter( s )
        -				.map( function (i, el) {
        -					row = el.parentNode._DT_RowIndex;
        -	
        -					return {
        -						row: row,
        -						column: $.inArray( el, data[ row ].anCells )
        -					};
        -				} )
        -				.toArray();
        -		};
        -	
        -		return _selector_run( 'cell', selector, run, settings, opts );
        -	};
        -	
        -	
        -	
        -	
        -	_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {
        -		// Argument shifting
        -		if ( $.isPlainObject( rowSelector ) ) {
        -			// Indexes
        -			if ( rowSelector.row === undefined ) {
        -				// Selector options in first parameter
        -				opts = rowSelector;
        -				rowSelector = null;
        -			}
        -			else {
        -				// Cell index objects in first parameter
        -				opts = columnSelector;
        -				columnSelector = null;
        -			}
        -		}
        -		if ( $.isPlainObject( columnSelector ) ) {
        -			opts = columnSelector;
        -			columnSelector = null;
        -		}
        -	
        -		// Cell selector
        -		if ( columnSelector === null || columnSelector === undefined ) {
        -			return this.iterator( 'table', function ( settings ) {
        -				return __cell_selector( settings, rowSelector, _selector_opts( opts ) );
        -			} );
        -		}
        -	
        -		// Row + column selector
        -		var columns = this.columns( columnSelector, opts );
        -		var rows = this.rows( rowSelector, opts );
        -		var a, i, ien, j, jen;
        -	
        -		var cells = this.iterator( 'table', function ( settings, idx ) {
        -			a = [];
        -	
        -			for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
        -				for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {
        -					a.push( {
        -						row:    rows[idx][i],
        -						column: columns[idx][j]
        -					} );
        -				}
        -			}
        -	
        -			return a;
        -		}, 1 );
        -	
        -		$.extend( cells.selector, {
        -			cols: columnSelector,
        -			rows: rowSelector,
        -			opts: opts
        -		} );
        -	
        -		return cells;
        -	} );
        -	
        -	
        -	_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {
        -		return this.iterator( 'cell', function ( settings, row, column ) {
        -			var cells = settings.aoData[ row ].anCells;
        -			return cells ?
        -				cells[ column ] :
        -				undefined;
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_register( 'cells().data()', function () {
        -		return this.iterator( 'cell', function ( settings, row, column ) {
        -			return _fnGetCellData( settings, row, column );
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {
        -		type = type === 'search' ? '_aFilterData' : '_aSortData';
        -	
        -		return this.iterator( 'cell', function ( settings, row, column ) {
        -			return settings.aoData[ row ][ type ][ column ];
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {
        -		return this.iterator( 'cell', function ( settings, row, column ) {
        -			return _fnGetCellData( settings, row, column, type );
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {
        -		return this.iterator( 'cell', function ( settings, row, column ) {
        -			return {
        -				row: row,
        -				column: column,
        -				columnVisible: _fnColumnIndexToVisible( settings, column )
        -			};
        -		}, 1 );
        -	} );
        -	
        -	
        -	_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {
        -		return this.iterator( 'cell', function ( settings, row, column ) {
        -			_fnInvalidate( settings, row, src, column );
        -		} );
        -	} );
        -	
        -	
        -	
        -	_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {
        -		return _selector_first( this.cells( rowSelector, columnSelector, opts ) );
        -	} );
        -	
        -	
        -	_api_register( 'cell().data()', function ( data ) {
        -		var ctx = this.context;
        -		var cell = this[0];
        -	
        -		if ( data === undefined ) {
        -			// Get
        -			return ctx.length && cell.length ?
        -				_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :
        -				undefined;
        -		}
        -	
        -		// Set
        -		_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );
        -		_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );
        -	
        -		return this;
        -	} );
        -	
        -	
        -	
        -	/**
        -	 * Get current ordering (sorting) that has been applied to the table.
        -	 *
        -	 * @returns {array} 2D array containing the sorting information for the first
        -	 *   table in the current context. Each element in the parent array represents
        -	 *   a column being sorted upon (i.e. multi-sorting with two columns would have
        -	 *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is
        -	 *   the column index that the sorting condition applies to, the second is the
        -	 *   direction of the sort (`desc` or `asc`) and, optionally, the third is the
        -	 *   index of the sorting order from the `column.sorting` initialisation array.
        -	 *//**
        -	 * Set the ordering for the table.
        -	 *
        -	 * @param {integer} order Column index to sort upon.
        -	 * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)
        -	 * @returns {DataTables.Api} this
        -	 *//**
        -	 * Set the ordering for the table.
        -	 *
        -	 * @param {array} order 1D array of sorting information to be applied.
        -	 * @param {array} [...] Optional additional sorting conditions
        -	 * @returns {DataTables.Api} this
        -	 *//**
        -	 * Set the ordering for the table.
        -	 *
        -	 * @param {array} order 2D array of sorting information to be applied.
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'order()', function ( order, dir ) {
        -		var ctx = this.context;
        -	
        -		if ( order === undefined ) {
        -			// get
        -			return ctx.length !== 0 ?
        -				ctx[0].aaSorting :
        -				undefined;
        -		}
        -	
        -		// set
        -		if ( typeof order === 'number' ) {
        -			// Simple column / direction passed in
        -			order = [ [ order, dir ] ];
        -		}
        -		else if ( ! $.isArray( order[0] ) ) {
        -			// Arguments passed in (list of 1D arrays)
        -			order = Array.prototype.slice.call( arguments );
        -		}
        -		// otherwise a 2D array was passed in
        -	
        -		return this.iterator( 'table', function ( settings ) {
        -			settings.aaSorting = order.slice();
        -		} );
        -	} );
        -	
        -	
        -	/**
        -	 * Attach a sort listener to an element for a given column
        -	 *
        -	 * @param {node|jQuery|string} node Identifier for the element(s) to attach the
        -	 *   listener to. This can take the form of a single DOM node, a jQuery
        -	 *   collection of nodes or a jQuery selector which will identify the node(s).
        -	 * @param {integer} column the column that a click on this node will sort on
        -	 * @param {function} [callback] callback function when sort is run
        -	 * @returns {DataTables.Api} this
        -	 */
        -	_api_register( 'order.listener()', function ( node, column, callback ) {
        -		return this.iterator( 'table', function ( settings ) {
        -			_fnSortAttachListener( settings, node, column, callback );
        -		} );
        -	} );
        -	
        -	
        -	// Order by the selected column(s)
        -	_api_register( [
        -		'columns().order()',
        -		'column().order()'
        -	], function ( dir ) {
        -		var that = this;
        -	
        -		return this.iterator( 'table', function ( settings, i ) {
        -			var sort = [];
        -	
        -			$.each( that[i], function (j, col) {
        -				sort.push( [ col, dir ] );
        -			} );
        -	
        -			settings.aaSorting = sort;
        -		} );
        -	} );
        -	
        -	
        -	
        -	_api_register( 'search()', function ( input, regex, smart, caseInsen ) {
        -		var ctx = this.context;
        -	
        -		if ( input === undefined ) {
        -			// get
        -			return ctx.length !== 0 ?
        -				ctx[0].oPreviousSearch.sSearch :
        -				undefined;
        -		}
        -	
        -		// set
        -		return this.iterator( 'table', function ( settings ) {
        -			if ( ! settings.oFeatures.bFilter ) {
        -				return;
        -			}
        -	
        -			_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {
        -				"sSearch": input+"",
        -				"bRegex":  regex === null ? false : regex,
        -				"bSmart":  smart === null ? true  : smart,
        -				"bCaseInsensitive": caseInsen === null ? true : caseInsen
        -			} ), 1 );
        -		} );
        -	} );
        -	
        -	
        -	_api_registerPlural(
        -		'columns().search()',
        -		'column().search()',
        -		function ( input, regex, smart, caseInsen ) {
        -			return this.iterator( 'column', function ( settings, column ) {
        -				var preSearch = settings.aoPreSearchCols;
        -	
        -				if ( input === undefined ) {
        -					// get
        -					return preSearch[ column ].sSearch;
        -				}
        -	
        -				// set
        -				if ( ! settings.oFeatures.bFilter ) {
        -					return;
        -				}
        -	
        -				$.extend( preSearch[ column ], {
        -					"sSearch": input+"",
        -					"bRegex":  regex === null ? false : regex,
        -					"bSmart":  smart === null ? true  : smart,
        -					"bCaseInsensitive": caseInsen === null ? true : caseInsen
        -				} );
        -	
        -				_fnFilterComplete( settings, settings.oPreviousSearch, 1 );
        -			} );
        -		}
        -	);
        -	
        -	/*
        -	 * State API methods
        -	 */
        -	
        -	_api_register( 'state()', function () {
        -		return this.context.length ?
        -			this.context[0].oSavedState :
        -			null;
        -	} );
        -	
        -	
        -	_api_register( 'state.clear()', function () {
        -		return this.iterator( 'table', function ( settings ) {
        -			// Save an empty object
        -			settings.fnStateSaveCallback.call( settings.oInstance, settings, {} );
        -		} );
        -	} );
        -	
        -	
        -	_api_register( 'state.loaded()', function () {
        -		return this.context.length ?
        -			this.context[0].oLoadedState :
        -			null;
        -	} );
        -	
        -	
        -	_api_register( 'state.save()', function () {
        -		return this.iterator( 'table', function ( settings ) {
        -			_fnSaveState( settings );
        -		} );
        -	} );
        -	
        -	
        -	
        -	/**
        -	 * Provide a common method for plug-ins to check the version of DataTables being
        -	 * used, in order to ensure compatibility.
        -	 *
        -	 *  @param {string} version Version string to check for, in the format "X.Y.Z".
        -	 *    Note that the formats "X" and "X.Y" are also acceptable.
        -	 *  @returns {boolean} true if this version of DataTables is greater or equal to
        -	 *    the required version, or false if this version of DataTales is not
        -	 *    suitable
        -	 *  @static
        -	 *  @dtopt API-Static
        -	 *
        -	 *  @example
        -	 *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );
        -	 */
        -	DataTable.versionCheck = DataTable.fnVersionCheck = function( version )
        -	{
        -		var aThis = DataTable.version.split('.');
        -		var aThat = version.split('.');
        -		var iThis, iThat;
        -	
        -		for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {
        -			iThis = parseInt( aThis[i], 10 ) || 0;
        -			iThat = parseInt( aThat[i], 10 ) || 0;
        -	
        -			// Parts are the same, keep comparing
        -			if (iThis === iThat) {
        -				continue;
        -			}
        -	
        -			// Parts are different, return immediately
        -			return iThis > iThat;
        -		}
        -	
        -		return true;
        -	};
        -	
        -	
        -	/**
        -	 * Check if a `<table>` node is a DataTable table already or not.
        -	 *
        -	 *  @param {node|jquery|string} table Table node, jQuery object or jQuery
        -	 *      selector for the table to test. Note that if more than more than one
        -	 *      table is passed on, only the first will be checked
        -	 *  @returns {boolean} true the table given is a DataTable, or false otherwise
        -	 *  @static
        -	 *  @dtopt API-Static
        -	 *
        -	 *  @example
        -	 *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
        -	 *      $('#example').dataTable();
        -	 *    }
        -	 */
        -	DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
        -	{
        -		var t = $(table).get(0);
        -		var is = false;
        -	
        -		$.each( DataTable.settings, function (i, o) {
        -			var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
        -			var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
        -	
        -			if ( o.nTable === t || head === t || foot === t ) {
        -				is = true;
        -			}
        -		} );
        -	
        -		return is;
        -	};
        -	
        -	
        -	/**
        -	 * Get all DataTable tables that have been initialised - optionally you can
        -	 * select to get only currently visible tables.
        -	 *
        -	 *  @param {boolean} [visible=false] Flag to indicate if you want all (default)
        -	 *    or visible tables only.
        -	 *  @returns {array} Array of `table` nodes (not DataTable instances) which are
        -	 *    DataTables
        -	 *  @static
        -	 *  @dtopt API-Static
        -	 *
        -	 *  @example
        -	 *    $.each( $.fn.dataTable.tables(true), function () {
        -	 *      $(table).DataTable().columns.adjust();
        -	 *    } );
        -	 */
        -	DataTable.tables = DataTable.fnTables = function ( visible )
        -	{
        -		return $.map( DataTable.settings, function (o) {
        -			if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
        -				return o.nTable;
        -			}
        -		} );
        -	};
        -	
        -	
        -	/**
        -	 * DataTables utility methods
        -	 * 
        -	 * This namespace provides helper methods that DataTables uses internally to
        -	 * create a DataTable, but which are not exclusively used only for DataTables.
        -	 * These methods can be used by extension authors to save the duplication of
        -	 * code.
        -	 *
        -	 *  @namespace
        -	 */
        -	DataTable.util = {
        -		/**
        -		 * Throttle the calls to a function. Arguments and context are maintained
        -		 * for the throttled function.
        -		 *
        -		 * @param {function} fn Function to be called
        -		 * @param {integer} freq Call frequency in mS
        -		 * @return {function} Wrapped function
        -		 */
        -		throttle: _fnThrottle,
        -	
        -	
        -		/**
        -		 * Escape a string such that it can be used in a regular expression
        -		 *
        -		 *  @param {string} sVal string to escape
        -		 *  @returns {string} escaped string
        -		 */
        -		escapeRegex: _fnEscapeRegex
        -	};
        -	
        -	
        -	/**
        -	 * Convert from camel case parameters to Hungarian notation. This is made public
        -	 * for the extensions to provide the same ability as DataTables core to accept
        -	 * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
        -	 * parameters.
        -	 *
        -	 *  @param {object} src The model object which holds all parameters that can be
        -	 *    mapped.
        -	 *  @param {object} user The object to convert from camel case to Hungarian.
        -	 *  @param {boolean} force When set to `true`, properties which already have a
        -	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
        -	 *    won't be.
        -	 */
        -	DataTable.camelToHungarian = _fnCamelToHungarian;
        -	
        -	
        -	
        -	/**
        -	 *
        -	 */
        -	_api_register( '$()', function ( selector, opts ) {
        -		var
        -			rows   = this.rows( opts ).nodes(), // Get all rows
        -			jqRows = $(rows);
        -	
        -		return $( [].concat(
        -			jqRows.filter( selector ).toArray(),
        -			jqRows.find( selector ).toArray()
        -		) );
        -	} );
        -	
        -	
        -	// jQuery functions to operate on the tables
        -	$.each( [ 'on', 'one', 'off' ], function (i, key) {
        -		_api_register( key+'()', function ( /* event, handler */ ) {
        -			var args = Array.prototype.slice.call(arguments);
        -	
        -			// Add the `dt` namespace automatically if it isn't already present
        -			if ( ! args[0].match(/\.dt\b/) ) {
        -				args[0] += '.dt';
        -			}
        -	
        -			var inst = $( this.tables().nodes() );
        -			inst[key].apply( inst, args );
        -			return this;
        -		} );
        -	} );
        -	
        -	
        -	_api_register( 'clear()', function () {
        -		return this.iterator( 'table', function ( settings ) {
        -			_fnClearTable( settings );
        -		} );
        -	} );
        -	
        -	
        -	_api_register( 'settings()', function () {
        -		return new _Api( this.context, this.context );
        -	} );
        -	
        -	
        -	_api_register( 'init()', function () {
        -		var ctx = this.context;
        -		return ctx.length ? ctx[0].oInit : null;
        -	} );
        -	
        -	
        -	_api_register( 'data()', function () {
        -		return this.iterator( 'table', function ( settings ) {
        -			return _pluck( settings.aoData, '_aData' );
        -		} ).flatten();
        -	} );
        -	
        -	
        -	_api_register( 'destroy()', function ( remove ) {
        -		remove = remove || false;
        -	
        -		return this.iterator( 'table', function ( settings ) {
        -			var orig      = settings.nTableWrapper.parentNode;
        -			var classes   = settings.oClasses;
        -			var table     = settings.nTable;
        -			var tbody     = settings.nTBody;
        -			var thead     = settings.nTHead;
        -			var tfoot     = settings.nTFoot;
        -			var jqTable   = $(table);
        -			var jqTbody   = $(tbody);
        -			var jqWrapper = $(settings.nTableWrapper);
        -			var rows      = $.map( settings.aoData, function (r) { return r.nTr; } );
        -			var i, ien;
        -	
        -			// Flag to note that the table is currently being destroyed - no action
        -			// should be taken
        -			settings.bDestroying = true;
        -	
        -			// Fire off the destroy callbacks for plug-ins etc
        -			_fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
        -	
        -			// If not being removed from the document, make all columns visible
        -			if ( ! remove ) {
        -				new _Api( settings ).columns().visible( true );
        -			}
        -	
        -			// Blitz all `DT` namespaced events (these are internal events, the
        -			// lowercase, `dt` events are user subscribed and they are responsible
        -			// for removing them
        -			jqWrapper.unbind('.DT').find(':not(tbody *)').unbind('.DT');
        -			$(window).unbind('.DT-'+settings.sInstance);
        -	
        -			// When scrolling we had to break the table up - restore it
        -			if ( table != thead.parentNode ) {
        -				jqTable.children('thead').detach();
        -				jqTable.append( thead );
        -			}
        -	
        -			if ( tfoot && table != tfoot.parentNode ) {
        -				jqTable.children('tfoot').detach();
        -				jqTable.append( tfoot );
        -			}
        -	
        -			// Remove the DataTables generated nodes, events and classes
        -			jqTable.detach();
        -			jqWrapper.detach();
        -	
        -			settings.aaSorting = [];
        -			settings.aaSortingFixed = [];
        -			_fnSortingClasses( settings );
        -	
        -			$( rows ).removeClass( settings.asStripeClasses.join(' ') );
        -	
        -			$('th, td', thead).removeClass( classes.sSortable+' '+
        -				classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
        -			);
        -	
        -			if ( settings.bJUI ) {
        -				$('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach();
        -				$('th, td', thead).each( function () {
        -					var wrapper = $('div.'+classes.sSortJUIWrapper, this);
        -					$(this).append( wrapper.contents() );
        -					wrapper.detach();
        -				} );
        -			}
        -	
        -			if ( ! remove && orig ) {
        -				// insertBefore acts like appendChild if !arg[1]
        -				orig.insertBefore( table, settings.nTableReinsertBefore );
        -			}
        -	
        -			// Add the TR elements back into the table in their original order
        -			jqTbody.children().detach();
        -			jqTbody.append( rows );
        -	
        -			// Restore the width of the original table - was read from the style property,
        -			// so we can restore directly to that
        -			jqTable
        -				.css( 'width', settings.sDestroyWidth )
        -				.removeClass( classes.sTable );
        -	
        -			// If the were originally stripe classes - then we add them back here.
        -			// Note this is not fool proof (for example if not all rows had stripe
        -			// classes - but it's a good effort without getting carried away
        -			ien = settings.asDestroyStripes.length;
        -	
        -			if ( ien ) {
        -				jqTbody.children().each( function (i) {
        -					$(this).addClass( settings.asDestroyStripes[i % ien] );
        -				} );
        -			}
        -	
        -			/* Remove the settings object from the settings array */
        -			var idx = $.inArray( settings, DataTable.settings );
        -			if ( idx !== -1 ) {
        -				DataTable.settings.splice( idx, 1 );
        -			}
        -		} );
        -	} );
        -	
        -	
        -	// Add the `every()` method for rows, columns and cells in a compact form
        -	$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
        -		_api_register( type+'s().every()', function ( fn ) {
        -			return this.iterator( type, function ( settings, idx, idx2 ) {
        -				// idx2 is undefined for rows and columns.
        -				fn.call( new _Api( settings )[ type ]( idx, idx2 ) );
        -			} );
        -		} );
        -	} );
        -	
        -	
        -	// i18n method for extensions to be able to use the language object from the
        -	// DataTable
        -	_api_register( 'i18n()', function ( token, def, plural ) {
        -		var ctx = this.context[0];
        -		var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
        -	
        -		if ( resolved === undefined ) {
        -			resolved = def;
        -		}
        -	
        -		if ( plural !== undefined && $.isPlainObject( resolved ) ) {
        -			resolved = resolved[ plural ] !== undefined ?
        -				resolved[ plural ] :
        -				resolved._;
        -		}
        -	
        -		return resolved.replace( '%d', plural ); // nb: plural might be undefined,
        -	} );
        -
        -	/**
        -	 * Version string for plug-ins to check compatibility. Allowed format is
        -	 * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
        -	 * only for non-release builds. See http://semver.org/ for more information.
        -	 *  @member
        -	 *  @type string
        -	 *  @default Version number
        -	 */
        -	DataTable.version = "1.10.7";
        -
        -	/**
        -	 * Private data store, containing all of the settings objects that are
        -	 * created for the tables on a given page.
        -	 *
        -	 * Note that the `DataTable.settings` object is aliased to
        -	 * `jQuery.fn.dataTableExt` through which it may be accessed and
        -	 * manipulated, or `jQuery.fn.dataTable.settings`.
        -	 *  @member
        -	 *  @type array
        -	 *  @default []
        -	 *  @private
        -	 */
        -	DataTable.settings = [];
        -
        -	/**
        -	 * Object models container, for the various models that DataTables has
        -	 * available to it. These models define the objects that are used to hold
        -	 * the active state and configuration of the table.
        -	 *  @namespace
        -	 */
        -	DataTable.models = {};
        -	
        -	
        -	
        -	/**
        -	 * Template object for the way in which DataTables holds information about
        -	 * search information for the global filter and individual column filters.
        -	 *  @namespace
        -	 */
        -	DataTable.models.oSearch = {
        -		/**
        -		 * Flag to indicate if the filtering should be case insensitive or not
        -		 *  @type boolean
        -		 *  @default true
        -		 */
        -		"bCaseInsensitive": true,
        -	
        -		/**
        -		 * Applied search term
        -		 *  @type string
        -		 *  @default <i>Empty string</i>
        -		 */
        -		"sSearch": "",
        -	
        -		/**
        -		 * Flag to indicate if the search term should be interpreted as a
        -		 * regular expression (true) or not (false) and therefore and special
        -		 * regex characters escaped.
        -		 *  @type boolean
        -		 *  @default false
        -		 */
        -		"bRegex": false,
        -	
        -		/**
        -		 * Flag to indicate if DataTables is to use its smart filtering or not.
        -		 *  @type boolean
        -		 *  @default true
        -		 */
        -		"bSmart": true
        -	};
        -	
        -	
        -	
        -	
        -	/**
        -	 * Template object for the way in which DataTables holds information about
        -	 * each individual row. This is the object format used for the settings
        -	 * aoData array.
        -	 *  @namespace
        -	 */
        -	DataTable.models.oRow = {
        -		/**
        -		 * TR element for the row
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTr": null,
        -	
        -		/**
        -		 * Array of TD elements for each row. This is null until the row has been
        -		 * created.
        -		 *  @type array nodes
        -		 *  @default []
        -		 */
        -		"anCells": null,
        -	
        -		/**
        -		 * Data object from the original data source for the row. This is either
        -		 * an array if using the traditional form of DataTables, or an object if
        -		 * using mData options. The exact type will depend on the passed in
        -		 * data from the data source, or will be an array if using DOM a data
        -		 * source.
        -		 *  @type array|object
        -		 *  @default []
        -		 */
        -		"_aData": [],
        -	
        -		/**
        -		 * Sorting data cache - this array is ostensibly the same length as the
        -		 * number of columns (although each index is generated only as it is
        -		 * needed), and holds the data that is used for sorting each column in the
        -		 * row. We do this cache generation at the start of the sort in order that
        -		 * the formatting of the sort data need be done only once for each cell
        -		 * per sort. This array should not be read from or written to by anything
        -		 * other than the master sorting methods.
        -		 *  @type array
        -		 *  @default null
        -		 *  @private
        -		 */
        -		"_aSortData": null,
        -	
        -		/**
        -		 * Per cell filtering data cache. As per the sort data cache, used to
        -		 * increase the performance of the filtering in DataTables
        -		 *  @type array
        -		 *  @default null
        -		 *  @private
        -		 */
        -		"_aFilterData": null,
        -	
        -		/**
        -		 * Filtering data cache. This is the same as the cell filtering cache, but
        -		 * in this case a string rather than an array. This is easily computed with
        -		 * a join on `_aFilterData`, but is provided as a cache so the join isn't
        -		 * needed on every search (memory traded for performance)
        -		 *  @type array
        -		 *  @default null
        -		 *  @private
        -		 */
        -		"_sFilterRow": null,
        -	
        -		/**
        -		 * Cache of the class name that DataTables has applied to the row, so we
        -		 * can quickly look at this variable rather than needing to do a DOM check
        -		 * on className for the nTr property.
        -		 *  @type string
        -		 *  @default <i>Empty string</i>
        -		 *  @private
        -		 */
        -		"_sRowStripe": "",
        -	
        -		/**
        -		 * Denote if the original data source was from the DOM, or the data source
        -		 * object. This is used for invalidating data, so DataTables can
        -		 * automatically read data from the original source, unless uninstructed
        -		 * otherwise.
        -		 *  @type string
        -		 *  @default null
        -		 *  @private
        -		 */
        -		"src": null
        -	};
        -	
        -	
        -	/**
        -	 * Template object for the column information object in DataTables. This object
        -	 * is held in the settings aoColumns array and contains all the information that
        -	 * DataTables needs about each individual column.
        -	 *
        -	 * Note that this object is related to {@link DataTable.defaults.column}
        -	 * but this one is the internal data store for DataTables's cache of columns.
        -	 * It should NOT be manipulated outside of DataTables. Any configuration should
        -	 * be done through the initialisation options.
        -	 *  @namespace
        -	 */
        -	DataTable.models.oColumn = {
        -		/**
        -		 * Column index. This could be worked out on-the-fly with $.inArray, but it
        -		 * is faster to just hold it as a variable
        -		 *  @type integer
        -		 *  @default null
        -		 */
        -		"idx": null,
        -	
        -		/**
        -		 * A list of the columns that sorting should occur on when this column
        -		 * is sorted. That this property is an array allows multi-column sorting
        -		 * to be defined for a column (for example first name / last name columns
        -		 * would benefit from this). The values are integers pointing to the
        -		 * columns to be sorted on (typically it will be a single integer pointing
        -		 * at itself, but that doesn't need to be the case).
        -		 *  @type array
        -		 */
        -		"aDataSort": null,
        -	
        -		/**
        -		 * Define the sorting directions that are applied to the column, in sequence
        -		 * as the column is repeatedly sorted upon - i.e. the first value is used
        -		 * as the sorting direction when the column if first sorted (clicked on).
        -		 * Sort it again (click again) and it will move on to the next index.
        -		 * Repeat until loop.
        -		 *  @type array
        -		 */
        -		"asSorting": null,
        -	
        -		/**
        -		 * Flag to indicate if the column is searchable, and thus should be included
        -		 * in the filtering or not.
        -		 *  @type boolean
        -		 */
        -		"bSearchable": null,
        -	
        -		/**
        -		 * Flag to indicate if the column is sortable or not.
        -		 *  @type boolean
        -		 */
        -		"bSortable": null,
        -	
        -		/**
        -		 * Flag to indicate if the column is currently visible in the table or not
        -		 *  @type boolean
        -		 */
        -		"bVisible": null,
        -	
        -		/**
        -		 * Store for manual type assignment using the `column.type` option. This
        -		 * is held in store so we can manipulate the column's `sType` property.
        -		 *  @type string
        -		 *  @default null
        -		 *  @private
        -		 */
        -		"_sManualType": null,
        -	
        -		/**
        -		 * Flag to indicate if HTML5 data attributes should be used as the data
        -		 * source for filtering or sorting. True is either are.
        -		 *  @type boolean
        -		 *  @default false
        -		 *  @private
        -		 */
        -		"_bAttrSrc": false,
        -	
        -		/**
        -		 * Developer definable function that is called whenever a cell is created (Ajax source,
        -		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
        -		 * allowing you to modify the DOM element (add background colour for example) when the
        -		 * element is available.
        -		 *  @type function
        -		 *  @param {element} nTd The TD node that has been created
        -		 *  @param {*} sData The Data for the cell
        -		 *  @param {array|object} oData The data for the whole row
        -		 *  @param {int} iRow The row index for the aoData data store
        -		 *  @default null
        -		 */
        -		"fnCreatedCell": null,
        -	
        -		/**
        -		 * Function to get data from a cell in a column. You should <b>never</b>
        -		 * access data directly through _aData internally in DataTables - always use
        -		 * the method attached to this property. It allows mData to function as
        -		 * required. This function is automatically assigned by the column
        -		 * initialisation method
        -		 *  @type function
        -		 *  @param {array|object} oData The data array/object for the array
        -		 *    (i.e. aoData[]._aData)
        -		 *  @param {string} sSpecific The specific data type you want to get -
        -		 *    'display', 'type' 'filter' 'sort'
        -		 *  @returns {*} The data for the cell from the given row's data
        -		 *  @default null
        -		 */
        -		"fnGetData": null,
        -	
        -		/**
        -		 * Function to set data for a cell in the column. You should <b>never</b>
        -		 * set the data directly to _aData internally in DataTables - always use
        -		 * this method. It allows mData to function as required. This function
        -		 * is automatically assigned by the column initialisation method
        -		 *  @type function
        -		 *  @param {array|object} oData The data array/object for the array
        -		 *    (i.e. aoData[]._aData)
        -		 *  @param {*} sValue Value to set
        -		 *  @default null
        -		 */
        -		"fnSetData": null,
        -	
        -		/**
        -		 * Property to read the value for the cells in the column from the data
        -		 * source array / object. If null, then the default content is used, if a
        -		 * function is given then the return from the function is used.
        -		 *  @type function|int|string|null
        -		 *  @default null
        -		 */
        -		"mData": null,
        -	
        -		/**
        -		 * Partner property to mData which is used (only when defined) to get
        -		 * the data - i.e. it is basically the same as mData, but without the
        -		 * 'set' option, and also the data fed to it is the result from mData.
        -		 * This is the rendering method to match the data method of mData.
        -		 *  @type function|int|string|null
        -		 *  @default null
        -		 */
        -		"mRender": null,
        -	
        -		/**
        -		 * Unique header TH/TD element for this column - this is what the sorting
        -		 * listener is attached to (if sorting is enabled.)
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTh": null,
        -	
        -		/**
        -		 * Unique footer TH/TD element for this column (if there is one). Not used
        -		 * in DataTables as such, but can be used for plug-ins to reference the
        -		 * footer for each column.
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTf": null,
        -	
        -		/**
        -		 * The class to apply to all TD elements in the table's TBODY for the column
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sClass": null,
        -	
        -		/**
        -		 * When DataTables calculates the column widths to assign to each column,
        -		 * it finds the longest string in each column and then constructs a
        -		 * temporary table and reads the widths from that. The problem with this
        -		 * is that "mmm" is much wider then "iiii", but the latter is a longer
        -		 * string - thus the calculation can go wrong (doing it properly and putting
        -		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
        -		 * a "work around" we provide this option. It will append its value to the
        -		 * text that is found to be the longest string for the column - i.e. padding.
        -		 *  @type string
        -		 */
        -		"sContentPadding": null,
        -	
        -		/**
        -		 * Allows a default value to be given for a column's data, and will be used
        -		 * whenever a null data source is encountered (this can be because mData
        -		 * is set to null, or because the data source itself is null).
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sDefaultContent": null,
        -	
        -		/**
        -		 * Name for the column, allowing reference to the column by name as well as
        -		 * by index (needs a lookup to work by name).
        -		 *  @type string
        -		 */
        -		"sName": null,
        -	
        -		/**
        -		 * Custom sorting data type - defines which of the available plug-ins in
        -		 * afnSortData the custom sorting will use - if any is defined.
        -		 *  @type string
        -		 *  @default std
        -		 */
        -		"sSortDataType": 'std',
        -	
        -		/**
        -		 * Class to be applied to the header element when sorting on this column
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sSortingClass": null,
        -	
        -		/**
        -		 * Class to be applied to the header element when sorting on this column -
        -		 * when jQuery UI theming is used.
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sSortingClassJUI": null,
        -	
        -		/**
        -		 * Title of the column - what is seen in the TH element (nTh).
        -		 *  @type string
        -		 */
        -		"sTitle": null,
        -	
        -		/**
        -		 * Column sorting and filtering type
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sType": null,
        -	
        -		/**
        -		 * Width of the column
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sWidth": null,
        -	
        -		/**
        -		 * Width of the column when it was first "encountered"
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sWidthOrig": null
        -	};
        -	
        -	
        -	/*
        -	 * Developer note: The properties of the object below are given in Hungarian
        -	 * notation, that was used as the interface for DataTables prior to v1.10, however
        -	 * from v1.10 onwards the primary interface is camel case. In order to avoid
        -	 * breaking backwards compatibility utterly with this change, the Hungarian
        -	 * version is still, internally the primary interface, but is is not documented
        -	 * - hence the @name tags in each doc comment. This allows a Javascript function
        -	 * to create a map from Hungarian notation to camel case (going the other direction
        -	 * would require each property to be listed, which would at around 3K to the size
        -	 * of DataTables, while this method is about a 0.5K hit.
        -	 *
        -	 * Ultimately this does pave the way for Hungarian notation to be dropped
        -	 * completely, but that is a massive amount of work and will break current
        -	 * installs (therefore is on-hold until v2).
        -	 */
        -	
        -	/**
        -	 * Initialisation options that can be given to DataTables at initialisation
        -	 * time.
        -	 *  @namespace
        -	 */
        -	DataTable.defaults = {
        -		/**
        -		 * An array of data to use for the table, passed in at initialisation which
        -		 * will be used in preference to any data which is already in the DOM. This is
        -		 * particularly useful for constructing tables purely in Javascript, for
        -		 * example with a custom Ajax call.
        -		 *  @type array
        -		 *  @default null
        -		 *
        -		 *  @dtopt Option
        -		 *  @name DataTable.defaults.data
        -		 *
        -		 *  @example
        -		 *    // Using a 2D array data source
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "data": [
        -		 *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
        -		 *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
        -		 *        ],
        -		 *        "columns": [
        -		 *          { "title": "Engine" },
        -		 *          { "title": "Browser" },
        -		 *          { "title": "Platform" },
        -		 *          { "title": "Version" },
        -		 *          { "title": "Grade" }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using an array of objects as a data source (`data`)
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "data": [
        -		 *          {
        -		 *            "engine":   "Trident",
        -		 *            "browser":  "Internet Explorer 4.0",
        -		 *            "platform": "Win 95+",
        -		 *            "version":  4,
        -		 *            "grade":    "X"
        -		 *          },
        -		 *          {
        -		 *            "engine":   "Trident",
        -		 *            "browser":  "Internet Explorer 5.0",
        -		 *            "platform": "Win 95+",
        -		 *            "version":  5,
        -		 *            "grade":    "C"
        -		 *          }
        -		 *        ],
        -		 *        "columns": [
        -		 *          { "title": "Engine",   "data": "engine" },
        -		 *          { "title": "Browser",  "data": "browser" },
        -		 *          { "title": "Platform", "data": "platform" },
        -		 *          { "title": "Version",  "data": "version" },
        -		 *          { "title": "Grade",    "data": "grade" }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"aaData": null,
        -	
        -	
        -		/**
        -		 * If ordering is enabled, then DataTables will perform a first pass sort on
        -		 * initialisation. You can define which column(s) the sort is performed
        -		 * upon, and the sorting direction, with this variable. The `sorting` array
        -		 * should contain an array for each column to be sorted initially containing
        -		 * the column's index and a direction string ('asc' or 'desc').
        -		 *  @type array
        -		 *  @default [[0,'asc']]
        -		 *
        -		 *  @dtopt Option
        -		 *  @name DataTable.defaults.order
        -		 *
        -		 *  @example
        -		 *    // Sort by 3rd column first, and then 4th column
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "order": [[2,'asc'], [3,'desc']]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *    // No initial sorting
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "order": []
        -		 *      } );
        -		 *    } );
        -		 */
        -		"aaSorting": [[0,'asc']],
        -	
        -	
        -		/**
        -		 * This parameter is basically identical to the `sorting` parameter, but
        -		 * cannot be overridden by user interaction with the table. What this means
        -		 * is that you could have a column (visible or hidden) which the sorting
        -		 * will always be forced on first - any sorting after that (from the user)
        -		 * will then be performed as required. This can be useful for grouping rows
        -		 * together.
        -		 *  @type array
        -		 *  @default null
        -		 *
        -		 *  @dtopt Option
        -		 *  @name DataTable.defaults.orderFixed
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "orderFixed": [[0,'asc']]
        -		 *      } );
        -		 *    } )
        -		 */
        -		"aaSortingFixed": [],
        -	
        -	
        -		/**
        -		 * DataTables can be instructed to load data to display in the table from a
        -		 * Ajax source. This option defines how that Ajax call is made and where to.
        -		 *
        -		 * The `ajax` property has three different modes of operation, depending on
        -		 * how it is defined. These are:
        -		 *
        -		 * * `string` - Set the URL from where the data should be loaded from.
        -		 * * `object` - Define properties for `jQuery.ajax`.
        -		 * * `function` - Custom data get function
        -		 *
        -		 * `string`
        -		 * --------
        -		 *
        -		 * As a string, the `ajax` property simply defines the URL from which
        -		 * DataTables will load data.
        -		 *
        -		 * `object`
        -		 * --------
        -		 *
        -		 * As an object, the parameters in the object are passed to
        -		 * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
        -		 * of the Ajax request. DataTables has a number of default parameters which
        -		 * you can override using this option. Please refer to the jQuery
        -		 * documentation for a full description of the options available, although
        -		 * the following parameters provide additional options in DataTables or
        -		 * require special consideration:
        -		 *
        -		 * * `data` - As with jQuery, `data` can be provided as an object, but it
        -		 *   can also be used as a function to manipulate the data DataTables sends
        -		 *   to the server. The function takes a single parameter, an object of
        -		 *   parameters with the values that DataTables has readied for sending. An
        -		 *   object may be returned which will be merged into the DataTables
        -		 *   defaults, or you can add the items to the object that was passed in and
        -		 *   not return anything from the function. This supersedes `fnServerParams`
        -		 *   from DataTables 1.9-.
        -		 *
        -		 * * `dataSrc` - By default DataTables will look for the property `data` (or
        -		 *   `aaData` for compatibility with DataTables 1.9-) when obtaining data
        -		 *   from an Ajax source or for server-side processing - this parameter
        -		 *   allows that property to be changed. You can use Javascript dotted
        -		 *   object notation to get a data source for multiple levels of nesting, or
        -		 *   it my be used as a function. As a function it takes a single parameter,
        -		 *   the JSON returned from the server, which can be manipulated as
        -		 *   required, with the returned value being that used by DataTables as the
        -		 *   data source for the table. This supersedes `sAjaxDataProp` from
        -		 *   DataTables 1.9-.
        -		 *
        -		 * * `success` - Should not be overridden it is used internally in
        -		 *   DataTables. To manipulate / transform the data returned by the server
        -		 *   use `ajax.dataSrc`, or use `ajax` as a function (see below).
        -		 *
        -		 * `function`
        -		 * ----------
        -		 *
        -		 * As a function, making the Ajax call is left up to yourself allowing
        -		 * complete control of the Ajax request. Indeed, if desired, a method other
        -		 * than Ajax could be used to obtain the required data, such as Web storage
        -		 * or an AIR database.
        -		 *
        -		 * The function is given four parameters and no return is required. The
        -		 * parameters are:
        -		 *
        -		 * 1. _object_ - Data to send to the server
        -		 * 2. _function_ - Callback function that must be executed when the required
        -		 *    data has been obtained. That data should be passed into the callback
        -		 *    as the only parameter
        -		 * 3. _object_ - DataTables settings object for the table
        -		 *
        -		 * Note that this supersedes `fnServerData` from DataTables 1.9-.
        -		 *
        -		 *  @type string|object|function
        -		 *  @default null
        -		 *
        -		 *  @dtopt Option
        -		 *  @name DataTable.defaults.ajax
        -		 *  @since 1.10.0
        -		 *
        -		 * @example
        -		 *   // Get JSON data from a file via Ajax.
        -		 *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
        -		 *   $('#example').dataTable( {
        -		 *     "ajax": "data.json"
        -		 *   } );
        -		 *
        -		 * @example
        -		 *   // Get JSON data from a file via Ajax, using `dataSrc` to change
        -		 *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
        -		 *   $('#example').dataTable( {
        -		 *     "ajax": {
        -		 *       "url": "data.json",
        -		 *       "dataSrc": "tableData"
        -		 *     }
        -		 *   } );
        -		 *
        -		 * @example
        -		 *   // Get JSON data from a file via Ajax, using `dataSrc` to read data
        -		 *   // from a plain array rather than an array in an object
        -		 *   $('#example').dataTable( {
        -		 *     "ajax": {
        -		 *       "url": "data.json",
        -		 *       "dataSrc": ""
        -		 *     }
        -		 *   } );
        -		 *
        -		 * @example
        -		 *   // Manipulate the data returned from the server - add a link to data
        -		 *   // (note this can, should, be done using `render` for the column - this
        -		 *   // is just a simple example of how the data can be manipulated).
        -		 *   $('#example').dataTable( {
        -		 *     "ajax": {
        -		 *       "url": "data.json",
        -		 *       "dataSrc": function ( json ) {
        -		 *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {
        -		 *           json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>';
        -		 *         }
        -		 *         return json;
        -		 *       }
        -		 *     }
        -		 *   } );
        -		 *
        -		 * @example
        -		 *   // Add data to the request
        -		 *   $('#example').dataTable( {
        -		 *     "ajax": {
        -		 *       "url": "data.json",
        -		 *       "data": function ( d ) {
        -		 *         return {
        -		 *           "extra_search": $('#extra').val()
        -		 *         };
        -		 *       }
        -		 *     }
        -		 *   } );
        -		 *
        -		 * @example
        -		 *   // Send request as POST
        -		 *   $('#example').dataTable( {
        -		 *     "ajax": {
        -		 *       "url": "data.json",
        -		 *       "type": "POST"
        -		 *     }
        -		 *   } );
        -		 *
        -		 * @example
        -		 *   // Get the data from localStorage (could interface with a form for
        -		 *   // adding, editing and removing rows).
        -		 *   $('#example').dataTable( {
        -		 *     "ajax": function (data, callback, settings) {
        -		 *       callback(
        -		 *         JSON.parse( localStorage.getItem('dataTablesData') )
        -		 *       );
        -		 *     }
        -		 *   } );
        -		 */
        -		"ajax": null,
        -	
        -	
        -		/**
        -		 * This parameter allows you to readily specify the entries in the length drop
        -		 * down menu that DataTables shows when pagination is enabled. It can be
        -		 * either a 1D array of options which will be used for both the displayed
        -		 * option and the value, or a 2D array which will use the array in the first
        -		 * position as the value, and the array in the second position as the
        -		 * displayed options (useful for language strings such as 'All').
        -		 *
        -		 * Note that the `pageLength` property will be automatically set to the
        -		 * first value given in this array, unless `pageLength` is also provided.
        -		 *  @type array
        -		 *  @default [ 10, 25, 50, 100 ]
        -		 *
        -		 *  @dtopt Option
        -		 *  @name DataTable.defaults.lengthMenu
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"aLengthMenu": [ 10, 25, 50, 100 ],
        -	
        -	
        -		/**
        -		 * The `columns` option in the initialisation parameter allows you to define
        -		 * details about the way individual columns behave. For a full list of
        -		 * column options that can be set, please see
        -		 * {@link DataTable.defaults.column}. Note that if you use `columns` to
        -		 * define your columns, you must have an entry in the array for every single
        -		 * column that you have in your table (these can be null if you don't which
        -		 * to specify any options).
        -		 *  @member
        -		 *
        -		 *  @name DataTable.defaults.column
        -		 */
        -		"aoColumns": null,
        -	
        -		/**
        -		 * Very similar to `columns`, `columnDefs` allows you to target a specific
        -		 * column, multiple columns, or all columns, using the `targets` property of
        -		 * each object in the array. This allows great flexibility when creating
        -		 * tables, as the `columnDefs` arrays can be of any length, targeting the
        -		 * columns you specifically want. `columnDefs` may use any of the column
        -		 * options available: {@link DataTable.defaults.column}, but it _must_
        -		 * have `targets` defined in each object in the array. Values in the `targets`
        -		 * array may be:
        -		 *   <ul>
        -		 *     <li>a string - class name will be matched on the TH for the column</li>
        -		 *     <li>0 or a positive integer - column index counting from the left</li>
        -		 *     <li>a negative integer - column index counting from the right</li>
        -		 *     <li>the string "_all" - all columns (i.e. assign a default)</li>
        -		 *   </ul>
        -		 *  @member
        -		 *
        -		 *  @name DataTable.defaults.columnDefs
        -		 */
        -		"aoColumnDefs": null,
        -	
        -	
        -		/**
        -		 * Basically the same as `search`, this parameter defines the individual column
        -		 * filtering state at initialisation time. The array must be of the same size
        -		 * as the number of columns, and each element be an object with the parameters
        -		 * `search` and `escapeRegex` (the latter is optional). 'null' is also
        -		 * accepted and the default will be used.
        -		 *  @type array
        -		 *  @default []
        -		 *
        -		 *  @dtopt Option
        -		 *  @name DataTable.defaults.searchCols
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "searchCols": [
        -		 *          null,
        -		 *          { "search": "My filter" },
        -		 *          null,
        -		 *          { "search": "^[0-9]", "escapeRegex": false }
        -		 *        ]
        -		 *      } );
        -		 *    } )
        -		 */
        -		"aoSearchCols": [],
        -	
        -	
        -		/**
        -		 * An array of CSS classes that should be applied to displayed rows. This
        -		 * array may be of any length, and DataTables will apply each class
        -		 * sequentially, looping when required.
        -		 *  @type array
        -		 *  @default null <i>Will take the values determined by the `oClasses.stripe*`
        -		 *    options</i>
        -		 *
        -		 *  @dtopt Option
        -		 *  @name DataTable.defaults.stripeClasses
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
        -		 *      } );
        -		 *    } )
        -		 */
        -		"asStripeClasses": null,
        -	
        -	
        -		/**
        -		 * Enable or disable automatic column width calculation. This can be disabled
        -		 * as an optimisation (it takes some time to calculate the widths) if the
        -		 * tables widths are passed in using `columns`.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.autoWidth
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "autoWidth": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bAutoWidth": true,
        -	
        -	
        -		/**
        -		 * Deferred rendering can provide DataTables with a huge speed boost when you
        -		 * are using an Ajax or JS data source for the table. This option, when set to
        -		 * true, will cause DataTables to defer the creation of the table elements for
        -		 * each row until they are needed for a draw - saving a significant amount of
        -		 * time.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.deferRender
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "ajax": "sources/arrays.txt",
        -		 *        "deferRender": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bDeferRender": false,
        -	
        -	
        -		/**
        -		 * Replace a DataTable which matches the given selector and replace it with
        -		 * one which has the properties of the new initialisation object passed. If no
        -		 * table matches the selector, then the new DataTable will be constructed as
        -		 * per normal.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.destroy
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "srollY": "200px",
        -		 *        "paginate": false
        -		 *      } );
        -		 *
        -		 *      // Some time later....
        -		 *      $('#example').dataTable( {
        -		 *        "filter": false,
        -		 *        "destroy": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bDestroy": false,
        -	
        -	
        -		/**
        -		 * Enable or disable filtering of data. Filtering in DataTables is "smart" in
        -		 * that it allows the end user to input multiple words (space separated) and
        -		 * will match a row containing those words, even if not in the order that was
        -		 * specified (this allow matching across multiple columns). Note that if you
        -		 * wish to use filtering in DataTables this must remain 'true' - to remove the
        -		 * default filtering input box and retain filtering abilities, please use
        -		 * {@link DataTable.defaults.dom}.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.searching
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "searching": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bFilter": true,
        -	
        -	
        -		/**
        -		 * Enable or disable the table information display. This shows information
        -		 * about the data that is currently visible on the page, including information
        -		 * about filtered data if that action is being performed.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.info
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "info": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bInfo": true,
        -	
        -	
        -		/**
        -		 * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
        -		 * slightly different and additional mark-up from what DataTables has
        -		 * traditionally used).
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.jQueryUI
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "jQueryUI": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bJQueryUI": false,
        -	
        -	
        -		/**
        -		 * Allows the end user to select the size of a formatted page from a select
        -		 * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.lengthChange
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "lengthChange": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bLengthChange": true,
        -	
        -	
        -		/**
        -		 * Enable or disable pagination.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.paging
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "paging": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bPaginate": true,
        -	
        -	
        -		/**
        -		 * Enable or disable the display of a 'processing' indicator when the table is
        -		 * being processed (e.g. a sort). This is particularly useful for tables with
        -		 * large amounts of data where it can take a noticeable amount of time to sort
        -		 * the entries.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.processing
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "processing": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bProcessing": false,
        -	
        -	
        -		/**
        -		 * Retrieve the DataTables object for the given selector. Note that if the
        -		 * table has already been initialised, this parameter will cause DataTables
        -		 * to simply return the object that has already been set up - it will not take
        -		 * account of any changes you might have made to the initialisation object
        -		 * passed to DataTables (setting this parameter to true is an acknowledgement
        -		 * that you understand this). `destroy` can be used to reinitialise a table if
        -		 * you need.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.retrieve
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      initTable();
        -		 *      tableActions();
        -		 *    } );
        -		 *
        -		 *    function initTable ()
        -		 *    {
        -		 *      return $('#example').dataTable( {
        -		 *        "scrollY": "200px",
        -		 *        "paginate": false,
        -		 *        "retrieve": true
        -		 *      } );
        -		 *    }
        -		 *
        -		 *    function tableActions ()
        -		 *    {
        -		 *      var table = initTable();
        -		 *      // perform API operations with oTable
        -		 *    }
        -		 */
        -		"bRetrieve": false,
        -	
        -	
        -		/**
        -		 * When vertical (y) scrolling is enabled, DataTables will force the height of
        -		 * the table's viewport to the given height at all times (useful for layout).
        -		 * However, this can look odd when filtering data down to a small data set,
        -		 * and the footer is left "floating" further down. This parameter (when
        -		 * enabled) will cause DataTables to collapse the table's viewport down when
        -		 * the result set will fit within the given Y height.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.scrollCollapse
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "scrollY": "200",
        -		 *        "scrollCollapse": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bScrollCollapse": false,
        -	
        -	
        -		/**
        -		 * Configure DataTables to use server-side processing. Note that the
        -		 * `ajax` parameter must also be given in order to give DataTables a
        -		 * source to obtain the required data for each draw.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Features
        -		 *  @dtopt Server-side
        -		 *  @name DataTable.defaults.serverSide
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "serverSide": true,
        -		 *        "ajax": "xhr.php"
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bServerSide": false,
        -	
        -	
        -		/**
        -		 * Enable or disable sorting of columns. Sorting of individual columns can be
        -		 * disabled by the `sortable` option for each column.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.ordering
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "ordering": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bSort": true,
        -	
        -	
        -		/**
        -		 * Enable or display DataTables' ability to sort multiple columns at the
        -		 * same time (activated by shift-click by the user).
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.orderMulti
        -		 *
        -		 *  @example
        -		 *    // Disable multiple column sorting ability
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "orderMulti": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bSortMulti": true,
        -	
        -	
        -		/**
        -		 * Allows control over whether DataTables should use the top (true) unique
        -		 * cell that is found for a single column, or the bottom (false - default).
        -		 * This is useful when using complex headers.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.orderCellsTop
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "orderCellsTop": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bSortCellsTop": false,
        -	
        -	
        -		/**
        -		 * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
        -		 * `sorting\_3` to the columns which are currently being sorted on. This is
        -		 * presented as a feature switch as it can increase processing time (while
        -		 * classes are removed and added) so for large data sets you might want to
        -		 * turn this off.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.orderClasses
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "orderClasses": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bSortClasses": true,
        -	
        -	
        -		/**
        -		 * Enable or disable state saving. When enabled HTML5 `localStorage` will be
        -		 * used to save table display information such as pagination information,
        -		 * display length, filtering and sorting. As such when the end user reloads
        -		 * the page the display display will match what thy had previously set up.
        -		 *
        -		 * Due to the use of `localStorage` the default state saving is not supported
        -		 * in IE6 or 7. If state saving is required in those browsers, use
        -		 * `stateSaveCallback` to provide a storage solution such as cookies.
        -		 *  @type boolean
        -		 *  @default false
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.stateSave
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function () {
        -		 *      $('#example').dataTable( {
        -		 *        "stateSave": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"bStateSave": false,
        -	
        -	
        -		/**
        -		 * This function is called when a TR element is created (and all TD child
        -		 * elements have been inserted), or registered if using a DOM source, allowing
        -		 * manipulation of the TR element (adding classes etc).
        -		 *  @type function
        -		 *  @param {node} row "TR" element for the current row
        -		 *  @param {array} data Raw data array for this row
        -		 *  @param {int} dataIndex The index of this row in the internal aoData array
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.createdRow
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "createdRow": function( row, data, dataIndex ) {
        -		 *          // Bold the grade for all 'A' grade browsers
        -		 *          if ( data[4] == "A" )
        -		 *          {
        -		 *            $('td:eq(4)', row).html( '<b>A</b>' );
        -		 *          }
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnCreatedRow": null,
        -	
        -	
        -		/**
        -		 * This function is called on every 'draw' event, and allows you to
        -		 * dynamically modify any aspect you want about the created DOM.
        -		 *  @type function
        -		 *  @param {object} settings DataTables settings object
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.drawCallback
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "drawCallback": function( settings ) {
        -		 *          alert( 'DataTables has redrawn the table' );
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnDrawCallback": null,
        -	
        -	
        -		/**
        -		 * Identical to fnHeaderCallback() but for the table footer this function
        -		 * allows you to modify the table footer on every 'draw' event.
        -		 *  @type function
        -		 *  @param {node} foot "TR" element for the footer
        -		 *  @param {array} data Full table data (as derived from the original HTML)
        -		 *  @param {int} start Index for the current display starting point in the
        -		 *    display array
        -		 *  @param {int} end Index for the current display ending point in the
        -		 *    display array
        -		 *  @param {array int} display Index array to translate the visual position
        -		 *    to the full data array
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.footerCallback
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "footerCallback": function( tfoot, data, start, end, display ) {
        -		 *          tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
        -		 *        }
        -		 *      } );
        -		 *    } )
        -		 */
        -		"fnFooterCallback": null,
        -	
        -	
        -		/**
        -		 * When rendering large numbers in the information element for the table
        -		 * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
        -		 * to have a comma separator for the 'thousands' units (e.g. 1 million is
        -		 * rendered as "1,000,000") to help readability for the end user. This
        -		 * function will override the default method DataTables uses.
        -		 *  @type function
        -		 *  @member
        -		 *  @param {int} toFormat number to be formatted
        -		 *  @returns {string} formatted string for DataTables to show the number
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.formatNumber
        -		 *
        -		 *  @example
        -		 *    // Format a number using a single quote for the separator (note that
        -		 *    // this can also be done with the language.thousands option)
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "formatNumber": function ( toFormat ) {
        -		 *          return toFormat.toString().replace(
        -		 *            /\B(?=(\d{3})+(?!\d))/g, "'"
        -		 *          );
        -		 *        };
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnFormatNumber": function ( toFormat ) {
        -			return toFormat.toString().replace(
        -				/\B(?=(\d{3})+(?!\d))/g,
        -				this.oLanguage.sThousands
        -			);
        -		},
        -	
        -	
        -		/**
        -		 * This function is called on every 'draw' event, and allows you to
        -		 * dynamically modify the header row. This can be used to calculate and
        -		 * display useful information about the table.
        -		 *  @type function
        -		 *  @param {node} head "TR" element for the header
        -		 *  @param {array} data Full table data (as derived from the original HTML)
        -		 *  @param {int} start Index for the current display starting point in the
        -		 *    display array
        -		 *  @param {int} end Index for the current display ending point in the
        -		 *    display array
        -		 *  @param {array int} display Index array to translate the visual position
        -		 *    to the full data array
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.headerCallback
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "fheaderCallback": function( head, data, start, end, display ) {
        -		 *          head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
        -		 *        }
        -		 *      } );
        -		 *    } )
        -		 */
        -		"fnHeaderCallback": null,
        -	
        -	
        -		/**
        -		 * The information element can be used to convey information about the current
        -		 * state of the table. Although the internationalisation options presented by
        -		 * DataTables are quite capable of dealing with most customisations, there may
        -		 * be times where you wish to customise the string further. This callback
        -		 * allows you to do exactly that.
        -		 *  @type function
        -		 *  @param {object} oSettings DataTables settings object
        -		 *  @param {int} start Starting position in data for the draw
        -		 *  @param {int} end End position in data for the draw
        -		 *  @param {int} max Total number of rows in the table (regardless of
        -		 *    filtering)
        -		 *  @param {int} total Total number of rows in the data set, after filtering
        -		 *  @param {string} pre The string that DataTables has formatted using it's
        -		 *    own rules
        -		 *  @returns {string} The string to be displayed in the information element.
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.infoCallback
        -		 *
        -		 *  @example
        -		 *    $('#example').dataTable( {
        -		 *      "infoCallback": function( settings, start, end, max, total, pre ) {
        -		 *        return start +" to "+ end;
        -		 *      }
        -		 *    } );
        -		 */
        -		"fnInfoCallback": null,
        -	
        -	
        -		/**
        -		 * Called when the table has been initialised. Normally DataTables will
        -		 * initialise sequentially and there will be no need for this function,
        -		 * however, this does not hold true when using external language information
        -		 * since that is obtained using an async XHR call.
        -		 *  @type function
        -		 *  @param {object} settings DataTables settings object
        -		 *  @param {object} json The JSON object request from the server - only
        -		 *    present if client-side Ajax sourced data is used
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.initComplete
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "initComplete": function(settings, json) {
        -		 *          alert( 'DataTables has finished its initialisation.' );
        -		 *        }
        -		 *      } );
        -		 *    } )
        -		 */
        -		"fnInitComplete": null,
        -	
        -	
        -		/**
        -		 * Called at the very start of each table draw and can be used to cancel the
        -		 * draw by returning false, any other return (including undefined) results in
        -		 * the full draw occurring).
        -		 *  @type function
        -		 *  @param {object} settings DataTables settings object
        -		 *  @returns {boolean} False will cancel the draw, anything else (including no
        -		 *    return) will allow it to complete.
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.preDrawCallback
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "preDrawCallback": function( settings ) {
        -		 *          if ( $('#test').val() == 1 ) {
        -		 *            return false;
        -		 *          }
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnPreDrawCallback": null,
        -	
        -	
        -		/**
        -		 * This function allows you to 'post process' each row after it have been
        -		 * generated for each table draw, but before it is rendered on screen. This
        -		 * function might be used for setting the row class name etc.
        -		 *  @type function
        -		 *  @param {node} row "TR" element for the current row
        -		 *  @param {array} data Raw data array for this row
        -		 *  @param {int} displayIndex The display index for the current table draw
        -		 *  @param {int} displayIndexFull The index of the data in the full list of
        -		 *    rows (after filtering)
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.rowCallback
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
        -		 *          // Bold the grade for all 'A' grade browsers
        -		 *          if ( data[4] == "A" ) {
        -		 *            $('td:eq(4)', row).html( '<b>A</b>' );
        -		 *          }
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnRowCallback": null,
        -	
        -	
        -		/**
        -		 * __Deprecated__ The functionality provided by this parameter has now been
        -		 * superseded by that provided through `ajax`, which should be used instead.
        -		 *
        -		 * This parameter allows you to override the default function which obtains
        -		 * the data from the server so something more suitable for your application.
        -		 * For example you could use POST data, or pull information from a Gears or
        -		 * AIR database.
        -		 *  @type function
        -		 *  @member
        -		 *  @param {string} source HTTP source to obtain the data from (`ajax`)
        -		 *  @param {array} data A key/value pair object containing the data to send
        -		 *    to the server
        -		 *  @param {function} callback to be called on completion of the data get
        -		 *    process that will draw the data on the page.
        -		 *  @param {object} settings DataTables settings object
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @dtopt Server-side
        -		 *  @name DataTable.defaults.serverData
        -		 *
        -		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
        -		 */
        -		"fnServerData": null,
        -	
        -	
        -		/**
        -		 * __Deprecated__ The functionality provided by this parameter has now been
        -		 * superseded by that provided through `ajax`, which should be used instead.
        -		 *
        -		 *  It is often useful to send extra data to the server when making an Ajax
        -		 * request - for example custom filtering information, and this callback
        -		 * function makes it trivial to send extra information to the server. The
        -		 * passed in parameter is the data set that has been constructed by
        -		 * DataTables, and you can add to this or modify it as you require.
        -		 *  @type function
        -		 *  @param {array} data Data array (array of objects which are name/value
        -		 *    pairs) that has been constructed by DataTables and will be sent to the
        -		 *    server. In the case of Ajax sourced data with server-side processing
        -		 *    this will be an empty array, for server-side processing there will be a
        -		 *    significant number of parameters!
        -		 *  @returns {undefined} Ensure that you modify the data array passed in,
        -		 *    as this is passed by reference.
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @dtopt Server-side
        -		 *  @name DataTable.defaults.serverParams
        -		 *
        -		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
        -		 */
        -		"fnServerParams": null,
        -	
        -	
        -		/**
        -		 * Load the table state. With this function you can define from where, and how, the
        -		 * state of a table is loaded. By default DataTables will load from `localStorage`
        -		 * but you might wish to use a server-side database or cookies.
        -		 *  @type function
        -		 *  @member
        -		 *  @param {object} settings DataTables settings object
        -		 *  @return {object} The DataTables state object to be loaded
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.stateLoadCallback
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stateSave": true,
        -		 *        "stateLoadCallback": function (settings) {
        -		 *          var o;
        -		 *
        -		 *          // Send an Ajax request to the server to get the data. Note that
        -		 *          // this is a synchronous request.
        -		 *          $.ajax( {
        -		 *            "url": "/state_load",
        -		 *            "async": false,
        -		 *            "dataType": "json",
        -		 *            "success": function (json) {
        -		 *              o = json;
        -		 *            }
        -		 *          } );
        -		 *
        -		 *          return o;
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnStateLoadCallback": function ( settings ) {
        -			try {
        -				return JSON.parse(
        -					(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
        -						'DataTables_'+settings.sInstance+'_'+location.pathname
        -					)
        -				);
        -			} catch (e) {}
        -		},
        -	
        -	
        -		/**
        -		 * Callback which allows modification of the saved state prior to loading that state.
        -		 * This callback is called when the table is loading state from the stored data, but
        -		 * prior to the settings object being modified by the saved state. Note that for
        -		 * plug-in authors, you should use the `stateLoadParams` event to load parameters for
        -		 * a plug-in.
        -		 *  @type function
        -		 *  @param {object} settings DataTables settings object
        -		 *  @param {object} data The state object that is to be loaded
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.stateLoadParams
        -		 *
        -		 *  @example
        -		 *    // Remove a saved filter, so filtering is never loaded
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stateSave": true,
        -		 *        "stateLoadParams": function (settings, data) {
        -		 *          data.oSearch.sSearch = "";
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Disallow state loading by returning false
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stateSave": true,
        -		 *        "stateLoadParams": function (settings, data) {
        -		 *          return false;
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnStateLoadParams": null,
        -	
        -	
        -		/**
        -		 * Callback that is called when the state has been loaded from the state saving method
        -		 * and the DataTables settings object has been modified as a result of the loaded state.
        -		 *  @type function
        -		 *  @param {object} settings DataTables settings object
        -		 *  @param {object} data The state object that was loaded
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.stateLoaded
        -		 *
        -		 *  @example
        -		 *    // Show an alert with the filtering value that was saved
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stateSave": true,
        -		 *        "stateLoaded": function (settings, data) {
        -		 *          alert( 'Saved filter was: '+data.oSearch.sSearch );
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnStateLoaded": null,
        -	
        -	
        -		/**
        -		 * Save the table state. This function allows you to define where and how the state
        -		 * information for the table is stored By default DataTables will use `localStorage`
        -		 * but you might wish to use a server-side database or cookies.
        -		 *  @type function
        -		 *  @member
        -		 *  @param {object} settings DataTables settings object
        -		 *  @param {object} data The state object to be saved
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.stateSaveCallback
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stateSave": true,
        -		 *        "stateSaveCallback": function (settings, data) {
        -		 *          // Send an Ajax request to the server with the state object
        -		 *          $.ajax( {
        -		 *            "url": "/state_save",
        -		 *            "data": data,
        -		 *            "dataType": "json",
        -		 *            "method": "POST"
        -		 *            "success": function () {}
        -		 *          } );
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnStateSaveCallback": function ( settings, data ) {
        -			try {
        -				(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
        -					'DataTables_'+settings.sInstance+'_'+location.pathname,
        -					JSON.stringify( data )
        -				);
        -			} catch (e) {}
        -		},
        -	
        -	
        -		/**
        -		 * Callback which allows modification of the state to be saved. Called when the table
        -		 * has changed state a new state save is required. This method allows modification of
        -		 * the state saving object prior to actually doing the save, including addition or
        -		 * other state properties or modification. Note that for plug-in authors, you should
        -		 * use the `stateSaveParams` event to save parameters for a plug-in.
        -		 *  @type function
        -		 *  @param {object} settings DataTables settings object
        -		 *  @param {object} data The state object to be saved
        -		 *
        -		 *  @dtopt Callbacks
        -		 *  @name DataTable.defaults.stateSaveParams
        -		 *
        -		 *  @example
        -		 *    // Remove a saved filter, so filtering is never saved
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stateSave": true,
        -		 *        "stateSaveParams": function (settings, data) {
        -		 *          data.oSearch.sSearch = "";
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"fnStateSaveParams": null,
        -	
        -	
        -		/**
        -		 * Duration for which the saved state information is considered valid. After this period
        -		 * has elapsed the state will be returned to the default.
        -		 * Value is given in seconds.
        -		 *  @type int
        -		 *  @default 7200 <i>(2 hours)</i>
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.stateDuration
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "stateDuration": 60*60*24; // 1 day
        -		 *      } );
        -		 *    } )
        -		 */
        -		"iStateDuration": 7200,
        -	
        -	
        -		/**
        -		 * When enabled DataTables will not make a request to the server for the first
        -		 * page draw - rather it will use the data already on the page (no sorting etc
        -		 * will be applied to it), thus saving on an XHR at load time. `deferLoading`
        -		 * is used to indicate that deferred loading is required, but it is also used
        -		 * to tell DataTables how many records there are in the full table (allowing
        -		 * the information element and pagination to be displayed correctly). In the case
        -		 * where a filtering is applied to the table on initial load, this can be
        -		 * indicated by giving the parameter as an array, where the first element is
        -		 * the number of records available after filtering and the second element is the
        -		 * number of records without filtering (allowing the table information element
        -		 * to be shown correctly).
        -		 *  @type int | array
        -		 *  @default null
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.deferLoading
        -		 *
        -		 *  @example
        -		 *    // 57 records available in the table, no filtering applied
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "serverSide": true,
        -		 *        "ajax": "scripts/server_processing.php",
        -		 *        "deferLoading": 57
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // 57 records after filtering, 100 without filtering (an initial filter applied)
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "serverSide": true,
        -		 *        "ajax": "scripts/server_processing.php",
        -		 *        "deferLoading": [ 57, 100 ],
        -		 *        "search": {
        -		 *          "search": "my_filter"
        -		 *        }
        -		 *      } );
        -		 *    } );
        -		 */
        -		"iDeferLoading": null,
        -	
        -	
        -		/**
        -		 * Number of rows to display on a single page when using pagination. If
        -		 * feature enabled (`lengthChange`) then the end user will be able to override
        -		 * this to a custom setting using a pop-up menu.
        -		 *  @type int
        -		 *  @default 10
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.pageLength
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "pageLength": 50
        -		 *      } );
        -		 *    } )
        -		 */
        -		"iDisplayLength": 10,
        -	
        -	
        -		/**
        -		 * Define the starting point for data display when using DataTables with
        -		 * pagination. Note that this parameter is the number of records, rather than
        -		 * the page number, so if you have 10 records per page and want to start on
        -		 * the third page, it should be "20".
        -		 *  @type int
        -		 *  @default 0
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.displayStart
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "displayStart": 20
        -		 *      } );
        -		 *    } )
        -		 */
        -		"iDisplayStart": 0,
        -	
        -	
        -		/**
        -		 * By default DataTables allows keyboard navigation of the table (sorting, paging,
        -		 * and filtering) by adding a `tabindex` attribute to the required elements. This
        -		 * allows you to tab through the controls and press the enter key to activate them.
        -		 * The tabindex is default 0, meaning that the tab follows the flow of the document.
        -		 * You can overrule this using this parameter if you wish. Use a value of -1 to
        -		 * disable built-in keyboard navigation.
        -		 *  @type int
        -		 *  @default 0
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.tabIndex
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "tabIndex": 1
        -		 *      } );
        -		 *    } );
        -		 */
        -		"iTabIndex": 0,
        -	
        -	
        -		/**
        -		 * Classes that DataTables assigns to the various components and features
        -		 * that it adds to the HTML table. This allows classes to be configured
        -		 * during initialisation in addition to through the static
        -		 * {@link DataTable.ext.oStdClasses} object).
        -		 *  @namespace
        -		 *  @name DataTable.defaults.classes
        -		 */
        -		"oClasses": {},
        -	
        -	
        -		/**
        -		 * All strings that DataTables uses in the user interface that it creates
        -		 * are defined in this object, allowing you to modified them individually or
        -		 * completely replace them all as required.
        -		 *  @namespace
        -		 *  @name DataTable.defaults.language
        -		 */
        -		"oLanguage": {
        -			/**
        -			 * Strings that are used for WAI-ARIA labels and controls only (these are not
        -			 * actually visible on the page, but will be read by screenreaders, and thus
        -			 * must be internationalised as well).
        -			 *  @namespace
        -			 *  @name DataTable.defaults.language.aria
        -			 */
        -			"oAria": {
        -				/**
        -				 * ARIA label that is added to the table headers when the column may be
        -				 * sorted ascending by activing the column (click or return when focused).
        -				 * Note that the column header is prefixed to this string.
        -				 *  @type string
        -				 *  @default : activate to sort column ascending
        -				 *
        -				 *  @dtopt Language
        -				 *  @name DataTable.defaults.language.aria.sortAscending
        -				 *
        -				 *  @example
        -				 *    $(document).ready( function() {
        -				 *      $('#example').dataTable( {
        -				 *        "language": {
        -				 *          "aria": {
        -				 *            "sortAscending": " - click/return to sort ascending"
        -				 *          }
        -				 *        }
        -				 *      } );
        -				 *    } );
        -				 */
        -				"sSortAscending": ": activate to sort column ascending",
        -	
        -				/**
        -				 * ARIA label that is added to the table headers when the column may be
        -				 * sorted descending by activing the column (click or return when focused).
        -				 * Note that the column header is prefixed to this string.
        -				 *  @type string
        -				 *  @default : activate to sort column ascending
        -				 *
        -				 *  @dtopt Language
        -				 *  @name DataTable.defaults.language.aria.sortDescending
        -				 *
        -				 *  @example
        -				 *    $(document).ready( function() {
        -				 *      $('#example').dataTable( {
        -				 *        "language": {
        -				 *          "aria": {
        -				 *            "sortDescending": " - click/return to sort descending"
        -				 *          }
        -				 *        }
        -				 *      } );
        -				 *    } );
        -				 */
        -				"sSortDescending": ": activate to sort column descending"
        -			},
        -	
        -			/**
        -			 * Pagination string used by DataTables for the built-in pagination
        -			 * control types.
        -			 *  @namespace
        -			 *  @name DataTable.defaults.language.paginate
        -			 */
        -			"oPaginate": {
        -				/**
        -				 * Text to use when using the 'full_numbers' type of pagination for the
        -				 * button to take the user to the first page.
        -				 *  @type string
        -				 *  @default First
        -				 *
        -				 *  @dtopt Language
        -				 *  @name DataTable.defaults.language.paginate.first
        -				 *
        -				 *  @example
        -				 *    $(document).ready( function() {
        -				 *      $('#example').dataTable( {
        -				 *        "language": {
        -				 *          "paginate": {
        -				 *            "first": "First page"
        -				 *          }
        -				 *        }
        -				 *      } );
        -				 *    } );
        -				 */
        -				"sFirst": "First",
        -	
        -	
        -				/**
        -				 * Text to use when using the 'full_numbers' type of pagination for the
        -				 * button to take the user to the last page.
        -				 *  @type string
        -				 *  @default Last
        -				 *
        -				 *  @dtopt Language
        -				 *  @name DataTable.defaults.language.paginate.last
        -				 *
        -				 *  @example
        -				 *    $(document).ready( function() {
        -				 *      $('#example').dataTable( {
        -				 *        "language": {
        -				 *          "paginate": {
        -				 *            "last": "Last page"
        -				 *          }
        -				 *        }
        -				 *      } );
        -				 *    } );
        -				 */
        -				"sLast": "Last",
        -	
        -	
        -				/**
        -				 * Text to use for the 'next' pagination button (to take the user to the
        -				 * next page).
        -				 *  @type string
        -				 *  @default Next
        -				 *
        -				 *  @dtopt Language
        -				 *  @name DataTable.defaults.language.paginate.next
        -				 *
        -				 *  @example
        -				 *    $(document).ready( function() {
        -				 *      $('#example').dataTable( {
        -				 *        "language": {
        -				 *          "paginate": {
        -				 *            "next": "Next page"
        -				 *          }
        -				 *        }
        -				 *      } );
        -				 *    } );
        -				 */
        -				"sNext": "Next",
        -	
        -	
        -				/**
        -				 * Text to use for the 'previous' pagination button (to take the user to
        -				 * the previous page).
        -				 *  @type string
        -				 *  @default Previous
        -				 *
        -				 *  @dtopt Language
        -				 *  @name DataTable.defaults.language.paginate.previous
        -				 *
        -				 *  @example
        -				 *    $(document).ready( function() {
        -				 *      $('#example').dataTable( {
        -				 *        "language": {
        -				 *          "paginate": {
        -				 *            "previous": "Previous page"
        -				 *          }
        -				 *        }
        -				 *      } );
        -				 *    } );
        -				 */
        -				"sPrevious": "Previous"
        -			},
        -	
        -			/**
        -			 * This string is shown in preference to `zeroRecords` when the table is
        -			 * empty of data (regardless of filtering). Note that this is an optional
        -			 * parameter - if it is not given, the value of `zeroRecords` will be used
        -			 * instead (either the default or given value).
        -			 *  @type string
        -			 *  @default No data available in table
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.emptyTable
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "emptyTable": "No data available in table"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sEmptyTable": "No data available in table",
        -	
        -	
        -			/**
        -			 * This string gives information to the end user about the information
        -			 * that is current on display on the page. The following tokens can be
        -			 * used in the string and will be dynamically replaced as the table
        -			 * display updates. This tokens can be placed anywhere in the string, or
        -			 * removed as needed by the language requires:
        -			 *
        -			 * * `\_START\_` - Display index of the first record on the current page
        -			 * * `\_END\_` - Display index of the last record on the current page
        -			 * * `\_TOTAL\_` - Number of records in the table after filtering
        -			 * * `\_MAX\_` - Number of records in the table without filtering
        -			 * * `\_PAGE\_` - Current page number
        -			 * * `\_PAGES\_` - Total number of pages of data in the table
        -			 *
        -			 *  @type string
        -			 *  @default Showing _START_ to _END_ of _TOTAL_ entries
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.info
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "info": "Showing page _PAGE_ of _PAGES_"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
        -	
        -	
        -			/**
        -			 * Display information string for when the table is empty. Typically the
        -			 * format of this string should match `info`.
        -			 *  @type string
        -			 *  @default Showing 0 to 0 of 0 entries
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.infoEmpty
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "infoEmpty": "No entries to show"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sInfoEmpty": "Showing 0 to 0 of 0 entries",
        -	
        -	
        -			/**
        -			 * When a user filters the information in a table, this string is appended
        -			 * to the information (`info`) to give an idea of how strong the filtering
        -			 * is. The variable _MAX_ is dynamically updated.
        -			 *  @type string
        -			 *  @default (filtered from _MAX_ total entries)
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.infoFiltered
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "infoFiltered": " - filtering from _MAX_ records"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sInfoFiltered": "(filtered from _MAX_ total entries)",
        -	
        -	
        -			/**
        -			 * If can be useful to append extra information to the info string at times,
        -			 * and this variable does exactly that. This information will be appended to
        -			 * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
        -			 * being used) at all times.
        -			 *  @type string
        -			 *  @default <i>Empty string</i>
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.infoPostFix
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "infoPostFix": "All records shown are derived from real information."
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sInfoPostFix": "",
        -	
        -	
        -			/**
        -			 * This decimal place operator is a little different from the other
        -			 * language options since DataTables doesn't output floating point
        -			 * numbers, so it won't ever use this for display of a number. Rather,
        -			 * what this parameter does is modify the sort methods of the table so
        -			 * that numbers which are in a format which has a character other than
        -			 * a period (`.`) as a decimal place will be sorted numerically.
        -			 *
        -			 * Note that numbers with different decimal places cannot be shown in
        -			 * the same table and still be sortable, the table must be consistent.
        -			 * However, multiple different tables on the page can use different
        -			 * decimal place characters.
        -			 *  @type string
        -			 *  @default 
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.decimal
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "decimal": ","
        -			 *          "thousands": "."
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sDecimal": "",
        -	
        -	
        -			/**
        -			 * DataTables has a build in number formatter (`formatNumber`) which is
        -			 * used to format large numbers that are used in the table information.
        -			 * By default a comma is used, but this can be trivially changed to any
        -			 * character you wish with this parameter.
        -			 *  @type string
        -			 *  @default ,
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.thousands
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "thousands": "'"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sThousands": ",",
        -	
        -	
        -			/**
        -			 * Detail the action that will be taken when the drop down menu for the
        -			 * pagination length option is changed. The '_MENU_' variable is replaced
        -			 * with a default select list of 10, 25, 50 and 100, and can be replaced
        -			 * with a custom select box if required.
        -			 *  @type string
        -			 *  @default Show _MENU_ entries
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.lengthMenu
        -			 *
        -			 *  @example
        -			 *    // Language change only
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "lengthMenu": "Display _MENU_ records"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 *
        -			 *  @example
        -			 *    // Language and options change
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "lengthMenu": 'Display <select>'+
        -			 *            '<option value="10">10</option>'+
        -			 *            '<option value="20">20</option>'+
        -			 *            '<option value="30">30</option>'+
        -			 *            '<option value="40">40</option>'+
        -			 *            '<option value="50">50</option>'+
        -			 *            '<option value="-1">All</option>'+
        -			 *            '</select> records'
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sLengthMenu": "Show _MENU_ entries",
        -	
        -	
        -			/**
        -			 * When using Ajax sourced data and during the first draw when DataTables is
        -			 * gathering the data, this message is shown in an empty row in the table to
        -			 * indicate to the end user the the data is being loaded. Note that this
        -			 * parameter is not used when loading data by server-side processing, just
        -			 * Ajax sourced data with client-side processing.
        -			 *  @type string
        -			 *  @default Loading...
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.loadingRecords
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "loadingRecords": "Please wait - loading..."
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sLoadingRecords": "Loading...",
        -	
        -	
        -			/**
        -			 * Text which is displayed when the table is processing a user action
        -			 * (usually a sort command or similar).
        -			 *  @type string
        -			 *  @default Processing...
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.processing
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "processing": "DataTables is currently busy"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sProcessing": "Processing...",
        -	
        -	
        -			/**
        -			 * Details the actions that will be taken when the user types into the
        -			 * filtering input text box. The variable "_INPUT_", if used in the string,
        -			 * is replaced with the HTML text box for the filtering input allowing
        -			 * control over where it appears in the string. If "_INPUT_" is not given
        -			 * then the input box is appended to the string automatically.
        -			 *  @type string
        -			 *  @default Search:
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.search
        -			 *
        -			 *  @example
        -			 *    // Input text box will be appended at the end automatically
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "search": "Filter records:"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 *
        -			 *  @example
        -			 *    // Specify where the filter should appear
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "search": "Apply filter _INPUT_ to table"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sSearch": "Search:",
        -	
        -	
        -			/**
        -			 * Assign a `placeholder` attribute to the search `input` element
        -			 *  @type string
        -			 *  @default 
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.searchPlaceholder
        -			 */
        -			"sSearchPlaceholder": "",
        -	
        -	
        -			/**
        -			 * All of the language information can be stored in a file on the
        -			 * server-side, which DataTables will look up if this parameter is passed.
        -			 * It must store the URL of the language file, which is in a JSON format,
        -			 * and the object has the same properties as the oLanguage object in the
        -			 * initialiser object (i.e. the above parameters). Please refer to one of
        -			 * the example language files to see how this works in action.
        -			 *  @type string
        -			 *  @default <i>Empty string - i.e. disabled</i>
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.url
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sUrl": "",
        -	
        -	
        -			/**
        -			 * Text shown inside the table records when the is no information to be
        -			 * displayed after filtering. `emptyTable` is shown when there is simply no
        -			 * information in the table at all (regardless of filtering).
        -			 *  @type string
        -			 *  @default No matching records found
        -			 *
        -			 *  @dtopt Language
        -			 *  @name DataTable.defaults.language.zeroRecords
        -			 *
        -			 *  @example
        -			 *    $(document).ready( function() {
        -			 *      $('#example').dataTable( {
        -			 *        "language": {
        -			 *          "zeroRecords": "No records to display"
        -			 *        }
        -			 *      } );
        -			 *    } );
        -			 */
        -			"sZeroRecords": "No matching records found"
        -		},
        -	
        -	
        -		/**
        -		 * This parameter allows you to have define the global filtering state at
        -		 * initialisation time. As an object the `search` parameter must be
        -		 * defined, but all other parameters are optional. When `regex` is true,
        -		 * the search string will be treated as a regular expression, when false
        -		 * (default) it will be treated as a straight string. When `smart`
        -		 * DataTables will use it's smart filtering methods (to word match at
        -		 * any point in the data), when false this will not be done.
        -		 *  @namespace
        -		 *  @extends DataTable.models.oSearch
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.search
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "search": {"search": "Initial search"}
        -		 *      } );
        -		 *    } )
        -		 */
        -		"oSearch": $.extend( {}, DataTable.models.oSearch ),
        -	
        -	
        -		/**
        -		 * __Deprecated__ The functionality provided by this parameter has now been
        -		 * superseded by that provided through `ajax`, which should be used instead.
        -		 *
        -		 * By default DataTables will look for the property `data` (or `aaData` for
        -		 * compatibility with DataTables 1.9-) when obtaining data from an Ajax
        -		 * source or for server-side processing - this parameter allows that
        -		 * property to be changed. You can use Javascript dotted object notation to
        -		 * get a data source for multiple levels of nesting.
        -		 *  @type string
        -		 *  @default data
        -		 *
        -		 *  @dtopt Options
        -		 *  @dtopt Server-side
        -		 *  @name DataTable.defaults.ajaxDataProp
        -		 *
        -		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
        -		 */
        -		"sAjaxDataProp": "data",
        -	
        -	
        -		/**
        -		 * __Deprecated__ The functionality provided by this parameter has now been
        -		 * superseded by that provided through `ajax`, which should be used instead.
        -		 *
        -		 * You can instruct DataTables to load data from an external
        -		 * source using this parameter (use aData if you want to pass data in you
        -		 * already have). Simply provide a url a JSON object can be obtained from.
        -		 *  @type string
        -		 *  @default null
        -		 *
        -		 *  @dtopt Options
        -		 *  @dtopt Server-side
        -		 *  @name DataTable.defaults.ajaxSource
        -		 *
        -		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
        -		 */
        -		"sAjaxSource": null,
        -	
        -	
        -		/**
        -		 * This initialisation variable allows you to specify exactly where in the
        -		 * DOM you want DataTables to inject the various controls it adds to the page
        -		 * (for example you might want the pagination controls at the top of the
        -		 * table). DIV elements (with or without a custom class) can also be added to
        -		 * aid styling. The follow syntax is used:
        -		 *   <ul>
        -		 *     <li>The following options are allowed:
        -		 *       <ul>
        -		 *         <li>'l' - Length changing</li>
        -		 *         <li>'f' - Filtering input</li>
        -		 *         <li>'t' - The table!</li>
        -		 *         <li>'i' - Information</li>
        -		 *         <li>'p' - Pagination</li>
        -		 *         <li>'r' - pRocessing</li>
        -		 *       </ul>
        -		 *     </li>
        -		 *     <li>The following constants are allowed:
        -		 *       <ul>
        -		 *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
        -		 *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
        -		 *       </ul>
        -		 *     </li>
        -		 *     <li>The following syntax is expected:
        -		 *       <ul>
        -		 *         <li>'&lt;' and '&gt;' - div elements</li>
        -		 *         <li>'&lt;"class" and '&gt;' - div with a class</li>
        -		 *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
        -		 *       </ul>
        -		 *     </li>
        -		 *     <li>Examples:
        -		 *       <ul>
        -		 *         <li>'&lt;"wrapper"flipt&gt;'</li>
        -		 *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
        -		 *       </ul>
        -		 *     </li>
        -		 *   </ul>
        -		 *  @type string
        -		 *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>
        -		 *    <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i>
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.dom
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sDom": "lfrtip",
        -	
        -	
        -		/**
        -		 * Search delay option. This will throttle full table searches that use the
        -		 * DataTables provided search input element (it does not effect calls to
        -		 * `dt-api search()`, providing a delay before the search is made.
        -		 *  @type integer
        -		 *  @default 0
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.searchDelay
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "searchDelay": 200
        -		 *      } );
        -		 *    } )
        -		 */
        -		"searchDelay": null,
        -	
        -	
        -		/**
        -		 * DataTables features four different built-in options for the buttons to
        -		 * display for pagination control:
        -		 *
        -		 * * `simple` - 'Previous' and 'Next' buttons only
        -		 * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
        -		 * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
        -		 * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus
        -		 *   page numbers
        -		 *  
        -		 * Further methods can be added using {@link DataTable.ext.oPagination}.
        -		 *  @type string
        -		 *  @default simple_numbers
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.pagingType
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "pagingType": "full_numbers"
        -		 *      } );
        -		 *    } )
        -		 */
        -		"sPaginationType": "simple_numbers",
        -	
        -	
        -		/**
        -		 * Enable horizontal scrolling. When a table is too wide to fit into a
        -		 * certain layout, or you have a large number of columns in the table, you
        -		 * can enable x-scrolling to show the table in a viewport, which can be
        -		 * scrolled. This property can be `true` which will allow the table to
        -		 * scroll horizontally when needed, or any CSS unit, or a number (in which
        -		 * case it will be treated as a pixel measurement). Setting as simply `true`
        -		 * is recommended.
        -		 *  @type boolean|string
        -		 *  @default <i>blank string - i.e. disabled</i>
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.scrollX
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "scrollX": true,
        -		 *        "scrollCollapse": true
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sScrollX": "",
        -	
        -	
        -		/**
        -		 * This property can be used to force a DataTable to use more width than it
        -		 * might otherwise do when x-scrolling is enabled. For example if you have a
        -		 * table which requires to be well spaced, this parameter is useful for
        -		 * "over-sizing" the table, and thus forcing scrolling. This property can by
        -		 * any CSS unit, or a number (in which case it will be treated as a pixel
        -		 * measurement).
        -		 *  @type string
        -		 *  @default <i>blank string - i.e. disabled</i>
        -		 *
        -		 *  @dtopt Options
        -		 *  @name DataTable.defaults.scrollXInner
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "scrollX": "100%",
        -		 *        "scrollXInner": "110%"
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sScrollXInner": "",
        -	
        -	
        -		/**
        -		 * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
        -		 * to the given height, and enable scrolling for any data which overflows the
        -		 * current viewport. This can be used as an alternative to paging to display
        -		 * a lot of data in a small area (although paging and scrolling can both be
        -		 * enabled at the same time). This property can be any CSS unit, or a number
        -		 * (in which case it will be treated as a pixel measurement).
        -		 *  @type string
        -		 *  @default <i>blank string - i.e. disabled</i>
        -		 *
        -		 *  @dtopt Features
        -		 *  @name DataTable.defaults.scrollY
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "scrollY": "200px",
        -		 *        "paginate": false
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sScrollY": "",
        -	
        -	
        -		/**
        -		 * __Deprecated__ The functionality provided by this parameter has now been
        -		 * superseded by that provided through `ajax`, which should be used instead.
        -		 *
        -		 * Set the HTTP method that is used to make the Ajax call for server-side
        -		 * processing or Ajax sourced data.
        -		 *  @type string
        -		 *  @default GET
        -		 *
        -		 *  @dtopt Options
        -		 *  @dtopt Server-side
        -		 *  @name DataTable.defaults.serverMethod
        -		 *
        -		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
        -		 */
        -		"sServerMethod": "GET",
        -	
        -	
        -		/**
        -		 * DataTables makes use of renderers when displaying HTML elements for
        -		 * a table. These renderers can be added or modified by plug-ins to
        -		 * generate suitable mark-up for a site. For example the Bootstrap
        -		 * integration plug-in for DataTables uses a paging button renderer to
        -		 * display pagination buttons in the mark-up required by Bootstrap.
        -		 *
        -		 * For further information about the renderers available see
        -		 * DataTable.ext.renderer
        -		 *  @type string|object
        -		 *  @default null
        -		 *
        -		 *  @name DataTable.defaults.renderer
        -		 *
        -		 */
        -		"renderer": null
        -	};
        -	
        -	_fnHungarianMap( DataTable.defaults );
        -	
        -	
        -	
        -	/*
        -	 * Developer note - See note in model.defaults.js about the use of Hungarian
        -	 * notation and camel case.
        -	 */
        -	
        -	/**
        -	 * Column options that can be given to DataTables at initialisation time.
        -	 *  @namespace
        -	 */
        -	DataTable.defaults.column = {
        -		/**
        -		 * Define which column(s) an order will occur on for this column. This
        -		 * allows a column's ordering to take multiple columns into account when
        -		 * doing a sort or use the data from a different column. For example first
        -		 * name / last name columns make sense to do a multi-column sort over the
        -		 * two columns.
        -		 *  @type array|int
        -		 *  @default null <i>Takes the value of the column index automatically</i>
        -		 *
        -		 *  @name DataTable.defaults.column.orderData
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "orderData": [ 0, 1 ], "targets": [ 0 ] },
        -		 *          { "orderData": [ 1, 0 ], "targets": [ 1 ] },
        -		 *          { "orderData": 2, "targets": [ 2 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "orderData": [ 0, 1 ] },
        -		 *          { "orderData": [ 1, 0 ] },
        -		 *          { "orderData": 2 },
        -		 *          null,
        -		 *          null
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"aDataSort": null,
        -		"iDataSort": -1,
        -	
        -	
        -		/**
        -		 * You can control the default ordering direction, and even alter the
        -		 * behaviour of the sort handler (i.e. only allow ascending ordering etc)
        -		 * using this parameter.
        -		 *  @type array
        -		 *  @default [ 'asc', 'desc' ]
        -		 *
        -		 *  @name DataTable.defaults.column.orderSequence
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "orderSequence": [ "asc" ], "targets": [ 1 ] },
        -		 *          { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
        -		 *          { "orderSequence": [ "desc" ], "targets": [ 3 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          null,
        -		 *          { "orderSequence": [ "asc" ] },
        -		 *          { "orderSequence": [ "desc", "asc", "asc" ] },
        -		 *          { "orderSequence": [ "desc" ] },
        -		 *          null
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"asSorting": [ 'asc', 'desc' ],
        -	
        -	
        -		/**
        -		 * Enable or disable filtering on the data in this column.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @name DataTable.defaults.column.searchable
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "searchable": false, "targets": [ 0 ] }
        -		 *        ] } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "searchable": false },
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          null
        -		 *        ] } );
        -		 *    } );
        -		 */
        -		"bSearchable": true,
        -	
        -	
        -		/**
        -		 * Enable or disable ordering on this column.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @name DataTable.defaults.column.orderable
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "orderable": false, "targets": [ 0 ] }
        -		 *        ] } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "orderable": false },
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          null
        -		 *        ] } );
        -		 *    } );
        -		 */
        -		"bSortable": true,
        -	
        -	
        -		/**
        -		 * Enable or disable the display of this column.
        -		 *  @type boolean
        -		 *  @default true
        -		 *
        -		 *  @name DataTable.defaults.column.visible
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "visible": false, "targets": [ 0 ] }
        -		 *        ] } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "visible": false },
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          null
        -		 *        ] } );
        -		 *    } );
        -		 */
        -		"bVisible": true,
        -	
        -	
        -		/**
        -		 * Developer definable function that is called whenever a cell is created (Ajax source,
        -		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
        -		 * allowing you to modify the DOM element (add background colour for example) when the
        -		 * element is available.
        -		 *  @type function
        -		 *  @param {element} td The TD node that has been created
        -		 *  @param {*} cellData The Data for the cell
        -		 *  @param {array|object} rowData The data for the whole row
        -		 *  @param {int} row The row index for the aoData data store
        -		 *  @param {int} col The column index for aoColumns
        -		 *
        -		 *  @name DataTable.defaults.column.createdCell
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [3],
        -		 *          "createdCell": function (td, cellData, rowData, row, col) {
        -		 *            if ( cellData == "1.7" ) {
        -		 *              $(td).css('color', 'blue')
        -		 *            }
        -		 *          }
        -		 *        } ]
        -		 *      });
        -		 *    } );
        -		 */
        -		"fnCreatedCell": null,
        -	
        -	
        -		/**
        -		 * This parameter has been replaced by `data` in DataTables to ensure naming
        -		 * consistency. `dataProp` can still be used, as there is backwards
        -		 * compatibility in DataTables for this option, but it is strongly
        -		 * recommended that you use `data` in preference to `dataProp`.
        -		 *  @name DataTable.defaults.column.dataProp
        -		 */
        -	
        -	
        -		/**
        -		 * This property can be used to read data from any data source property,
        -		 * including deeply nested objects / properties. `data` can be given in a
        -		 * number of different ways which effect its behaviour:
        -		 *
        -		 * * `integer` - treated as an array index for the data source. This is the
        -		 *   default that DataTables uses (incrementally increased for each column).
        -		 * * `string` - read an object property from the data source. There are
        -		 *   three 'special' options that can be used in the string to alter how
        -		 *   DataTables reads the data from the source object:
        -		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
        -		 *      Javascript to read from nested objects, so to can the options
        -		 *      specified in `data`. For example: `browser.version` or
        -		 *      `browser.name`. If your object parameter name contains a period, use
        -		 *      `\\` to escape it - i.e. `first\\.name`.
        -		 *    * `[]` - Array notation. DataTables can automatically combine data
        -		 *      from and array source, joining the data with the characters provided
        -		 *      between the two brackets. For example: `name[, ]` would provide a
        -		 *      comma-space separated list from the source array. If no characters
        -		 *      are provided between the brackets, the original array source is
        -		 *      returned.
        -		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
        -		 *      execute a function of the name given. For example: `browser()` for a
        -		 *      simple function on the data source, `browser.version()` for a
        -		 *      function in a nested property or even `browser().version` to get an
        -		 *      object property if the function called returns an object. Note that
        -		 *      function notation is recommended for use in `render` rather than
        -		 *      `data` as it is much simpler to use as a renderer.
        -		 * * `null` - use the original data source for the row rather than plucking
        -		 *   data directly from it. This action has effects on two other
        -		 *   initialisation options:
        -		 *    * `defaultContent` - When null is given as the `data` option and
        -		 *      `defaultContent` is specified for the column, the value defined by
        -		 *      `defaultContent` will be used for the cell.
        -		 *    * `render` - When null is used for the `data` option and the `render`
        -		 *      option is specified for the column, the whole data source for the
        -		 *      row is used for the renderer.
        -		 * * `function` - the function given will be executed whenever DataTables
        -		 *   needs to set or get the data for a cell in the column. The function
        -		 *   takes three parameters:
        -		 *    * Parameters:
        -		 *      * `{array|object}` The data source for the row
        -		 *      * `{string}` The type call data requested - this will be 'set' when
        -		 *        setting data or 'filter', 'display', 'type', 'sort' or undefined
        -		 *        when gathering data. Note that when `undefined` is given for the
        -		 *        type DataTables expects to get the raw data for the object back<
        -		 *      * `{*}` Data to set when the second parameter is 'set'.
        -		 *    * Return:
        -		 *      * The return value from the function is not required when 'set' is
        -		 *        the type of call, but otherwise the return is what will be used
        -		 *        for the data requested.
        -		 *
        -		 * Note that `data` is a getter and setter option. If you just require
        -		 * formatting of data for output, you will likely want to use `render` which
        -		 * is simply a getter and thus simpler to use.
        -		 *
        -		 * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
        -		 * name change reflects the flexibility of this property and is consistent
        -		 * with the naming of mRender. If 'mDataProp' is given, then it will still
        -		 * be used by DataTables, as it automatically maps the old name to the new
        -		 * if required.
        -		 *
        -		 *  @type string|int|function|null
        -		 *  @default null <i>Use automatically calculated column index</i>
        -		 *
        -		 *  @name DataTable.defaults.column.data
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Read table data from objects
        -		 *    // JSON structure for each row:
        -		 *    //   {
        -		 *    //      "engine": {value},
        -		 *    //      "browser": {value},
        -		 *    //      "platform": {value},
        -		 *    //      "version": {value},
        -		 *    //      "grade": {value}
        -		 *    //   }
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "ajaxSource": "sources/objects.txt",
        -		 *        "columns": [
        -		 *          { "data": "engine" },
        -		 *          { "data": "browser" },
        -		 *          { "data": "platform" },
        -		 *          { "data": "version" },
        -		 *          { "data": "grade" }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Read information from deeply nested objects
        -		 *    // JSON structure for each row:
        -		 *    //   {
        -		 *    //      "engine": {value},
        -		 *    //      "browser": {value},
        -		 *    //      "platform": {
        -		 *    //         "inner": {value}
        -		 *    //      },
        -		 *    //      "details": [
        -		 *    //         {value}, {value}
        -		 *    //      ]
        -		 *    //   }
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "ajaxSource": "sources/deep.txt",
        -		 *        "columns": [
        -		 *          { "data": "engine" },
        -		 *          { "data": "browser" },
        -		 *          { "data": "platform.inner" },
        -		 *          { "data": "platform.details.0" },
        -		 *          { "data": "platform.details.1" }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `data` as a function to provide different information for
        -		 *    // sorting, filtering and display. In this case, currency (price)
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [ 0 ],
        -		 *          "data": function ( source, type, val ) {
        -		 *            if (type === 'set') {
        -		 *              source.price = val;
        -		 *              // Store the computed dislay and filter values for efficiency
        -		 *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
        -		 *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
        -		 *              return;
        -		 *            }
        -		 *            else if (type === 'display') {
        -		 *              return source.price_display;
        -		 *            }
        -		 *            else if (type === 'filter') {
        -		 *              return source.price_filter;
        -		 *            }
        -		 *            // 'sort', 'type' and undefined all just use the integer
        -		 *            return source.price;
        -		 *          }
        -		 *        } ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using default content
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [ 0 ],
        -		 *          "data": null,
        -		 *          "defaultContent": "Click to edit"
        -		 *        } ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using array notation - outputting a list from an array
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [ 0 ],
        -		 *          "data": "name[, ]"
        -		 *        } ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 */
        -		"mData": null,
        -	
        -	
        -		/**
        -		 * This property is the rendering partner to `data` and it is suggested that
        -		 * when you want to manipulate data for display (including filtering,
        -		 * sorting etc) without altering the underlying data for the table, use this
        -		 * property. `render` can be considered to be the the read only companion to
        -		 * `data` which is read / write (then as such more complex). Like `data`
        -		 * this option can be given in a number of different ways to effect its
        -		 * behaviour:
        -		 *
        -		 * * `integer` - treated as an array index for the data source. This is the
        -		 *   default that DataTables uses (incrementally increased for each column).
        -		 * * `string` - read an object property from the data source. There are
        -		 *   three 'special' options that can be used in the string to alter how
        -		 *   DataTables reads the data from the source object:
        -		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
        -		 *      Javascript to read from nested objects, so to can the options
        -		 *      specified in `data`. For example: `browser.version` or
        -		 *      `browser.name`. If your object parameter name contains a period, use
        -		 *      `\\` to escape it - i.e. `first\\.name`.
        -		 *    * `[]` - Array notation. DataTables can automatically combine data
        -		 *      from and array source, joining the data with the characters provided
        -		 *      between the two brackets. For example: `name[, ]` would provide a
        -		 *      comma-space separated list from the source array. If no characters
        -		 *      are provided between the brackets, the original array source is
        -		 *      returned.
        -		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
        -		 *      execute a function of the name given. For example: `browser()` for a
        -		 *      simple function on the data source, `browser.version()` for a
        -		 *      function in a nested property or even `browser().version` to get an
        -		 *      object property if the function called returns an object.
        -		 * * `object` - use different data for the different data types requested by
        -		 *   DataTables ('filter', 'display', 'type' or 'sort'). The property names
        -		 *   of the object is the data type the property refers to and the value can
        -		 *   defined using an integer, string or function using the same rules as
        -		 *   `render` normally does. Note that an `_` option _must_ be specified.
        -		 *   This is the default value to use if you haven't specified a value for
        -		 *   the data type requested by DataTables.
        -		 * * `function` - the function given will be executed whenever DataTables
        -		 *   needs to set or get the data for a cell in the column. The function
        -		 *   takes three parameters:
        -		 *    * Parameters:
        -		 *      * {array|object} The data source for the row (based on `data`)
        -		 *      * {string} The type call data requested - this will be 'filter',
        -		 *        'display', 'type' or 'sort'.
        -		 *      * {array|object} The full data source for the row (not based on
        -		 *        `data`)
        -		 *    * Return:
        -		 *      * The return value from the function is what will be used for the
        -		 *        data requested.
        -		 *
        -		 *  @type string|int|function|object|null
        -		 *  @default null Use the data source value.
        -		 *
        -		 *  @name DataTable.defaults.column.render
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Create a comma separated list from an array of objects
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "ajaxSource": "sources/deep.txt",
        -		 *        "columns": [
        -		 *          { "data": "engine" },
        -		 *          { "data": "browser" },
        -		 *          {
        -		 *            "data": "platform",
        -		 *            "render": "[, ].name"
        -		 *          }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Execute a function to obtain data
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [ 0 ],
        -		 *          "data": null, // Use the full data source object for the renderer's source
        -		 *          "render": "browserName()"
        -		 *        } ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // As an object, extracting different data for the different types
        -		 *    // This would be used with a data source such as:
        -		 *    //   { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
        -		 *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
        -		 *    // (which has both forms) is used for filtering for if a user inputs either format, while
        -		 *    // the formatted phone number is the one that is shown in the table.
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [ 0 ],
        -		 *          "data": null, // Use the full data source object for the renderer's source
        -		 *          "render": {
        -		 *            "_": "phone",
        -		 *            "filter": "phone_filter",
        -		 *            "display": "phone_display"
        -		 *          }
        -		 *        } ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Use as a function to create a link from the data source
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [ 0 ],
        -		 *          "data": "download_link",
        -		 *          "render": function ( data, type, full ) {
        -		 *            return '<a href="'+data+'">Download</a>';
        -		 *          }
        -		 *        } ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"mRender": null,
        -	
        -	
        -		/**
        -		 * Change the cell type created for the column - either TD cells or TH cells. This
        -		 * can be useful as TH cells have semantic meaning in the table body, allowing them
        -		 * to act as a header for a row (you may wish to add scope='row' to the TH elements).
        -		 *  @type string
        -		 *  @default td
        -		 *
        -		 *  @name DataTable.defaults.column.cellType
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Make the first column use TH cells
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [ {
        -		 *          "targets": [ 0 ],
        -		 *          "cellType": "th"
        -		 *        } ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sCellType": "td",
        -	
        -	
        -		/**
        -		 * Class to give to each cell in this column.
        -		 *  @type string
        -		 *  @default <i>Empty string</i>
        -		 *
        -		 *  @name DataTable.defaults.column.class
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "class": "my_class", "targets": [ 0 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "class": "my_class" },
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          null
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sClass": "",
        -	
        -		/**
        -		 * When DataTables calculates the column widths to assign to each column,
        -		 * it finds the longest string in each column and then constructs a
        -		 * temporary table and reads the widths from that. The problem with this
        -		 * is that "mmm" is much wider then "iiii", but the latter is a longer
        -		 * string - thus the calculation can go wrong (doing it properly and putting
        -		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
        -		 * a "work around" we provide this option. It will append its value to the
        -		 * text that is found to be the longest string for the column - i.e. padding.
        -		 * Generally you shouldn't need this!
        -		 *  @type string
        -		 *  @default <i>Empty string<i>
        -		 *
        -		 *  @name DataTable.defaults.column.contentPadding
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          {
        -		 *            "contentPadding": "mmm"
        -		 *          }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sContentPadding": "",
        -	
        -	
        -		/**
        -		 * Allows a default value to be given for a column's data, and will be used
        -		 * whenever a null data source is encountered (this can be because `data`
        -		 * is set to null, or because the data source itself is null).
        -		 *  @type string
        -		 *  @default null
        -		 *
        -		 *  @name DataTable.defaults.column.defaultContent
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          {
        -		 *            "data": null,
        -		 *            "defaultContent": "Edit",
        -		 *            "targets": [ -1 ]
        -		 *          }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          {
        -		 *            "data": null,
        -		 *            "defaultContent": "Edit"
        -		 *          }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sDefaultContent": null,
        -	
        -	
        -		/**
        -		 * This parameter is only used in DataTables' server-side processing. It can
        -		 * be exceptionally useful to know what columns are being displayed on the
        -		 * client side, and to map these to database fields. When defined, the names
        -		 * also allow DataTables to reorder information from the server if it comes
        -		 * back in an unexpected order (i.e. if you switch your columns around on the
        -		 * client-side, your server-side code does not also need updating).
        -		 *  @type string
        -		 *  @default <i>Empty string</i>
        -		 *
        -		 *  @name DataTable.defaults.column.name
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "name": "engine", "targets": [ 0 ] },
        -		 *          { "name": "browser", "targets": [ 1 ] },
        -		 *          { "name": "platform", "targets": [ 2 ] },
        -		 *          { "name": "version", "targets": [ 3 ] },
        -		 *          { "name": "grade", "targets": [ 4 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "name": "engine" },
        -		 *          { "name": "browser" },
        -		 *          { "name": "platform" },
        -		 *          { "name": "version" },
        -		 *          { "name": "grade" }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sName": "",
        -	
        -	
        -		/**
        -		 * Defines a data source type for the ordering which can be used to read
        -		 * real-time information from the table (updating the internally cached
        -		 * version) prior to ordering. This allows ordering to occur on user
        -		 * editable elements such as form inputs.
        -		 *  @type string
        -		 *  @default std
        -		 *
        -		 *  @name DataTable.defaults.column.orderDataType
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
        -		 *          { "type": "numeric", "targets": [ 3 ] },
        -		 *          { "orderDataType": "dom-select", "targets": [ 4 ] },
        -		 *          { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          null,
        -		 *          null,
        -		 *          { "orderDataType": "dom-text" },
        -		 *          { "orderDataType": "dom-text", "type": "numeric" },
        -		 *          { "orderDataType": "dom-select" },
        -		 *          { "orderDataType": "dom-checkbox" }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sSortDataType": "std",
        -	
        -	
        -		/**
        -		 * The title of this column.
        -		 *  @type string
        -		 *  @default null <i>Derived from the 'TH' value for this column in the
        -		 *    original HTML table.</i>
        -		 *
        -		 *  @name DataTable.defaults.column.title
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "title": "My column title", "targets": [ 0 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "title": "My column title" },
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          null
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sTitle": null,
        -	
        -	
        -		/**
        -		 * The type allows you to specify how the data for this column will be
        -		 * ordered. Four types (string, numeric, date and html (which will strip
        -		 * HTML tags before ordering)) are currently available. Note that only date
        -		 * formats understood by Javascript's Date() object will be accepted as type
        -		 * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
        -		 * 'numeric', 'date' or 'html' (by default). Further types can be adding
        -		 * through plug-ins.
        -		 *  @type string
        -		 *  @default null <i>Auto-detected from raw data</i>
        -		 *
        -		 *  @name DataTable.defaults.column.type
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "type": "html", "targets": [ 0 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "type": "html" },
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          null
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sType": null,
        -	
        -	
        -		/**
        -		 * Defining the width of the column, this parameter may take any CSS value
        -		 * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
        -		 * been given a specific width through this interface ensuring that the table
        -		 * remains readable.
        -		 *  @type string
        -		 *  @default null <i>Automatic</i>
        -		 *
        -		 *  @name DataTable.defaults.column.width
        -		 *  @dtopt Columns
        -		 *
        -		 *  @example
        -		 *    // Using `columnDefs`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columnDefs": [
        -		 *          { "width": "20%", "targets": [ 0 ] }
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 *
        -		 *  @example
        -		 *    // Using `columns`
        -		 *    $(document).ready( function() {
        -		 *      $('#example').dataTable( {
        -		 *        "columns": [
        -		 *          { "width": "20%" },
        -		 *          null,
        -		 *          null,
        -		 *          null,
        -		 *          null
        -		 *        ]
        -		 *      } );
        -		 *    } );
        -		 */
        -		"sWidth": null
        -	};
        -	
        -	_fnHungarianMap( DataTable.defaults.column );
        -	
        -	
        -	
        -	/**
        -	 * DataTables settings object - this holds all the information needed for a
        -	 * given table, including configuration, data and current application of the
        -	 * table options. DataTables does not have a single instance for each DataTable
        -	 * with the settings attached to that instance, but rather instances of the
        -	 * DataTable "class" are created on-the-fly as needed (typically by a
        -	 * $().dataTable() call) and the settings object is then applied to that
        -	 * instance.
        -	 *
        -	 * Note that this object is related to {@link DataTable.defaults} but this
        -	 * one is the internal data store for DataTables's cache of columns. It should
        -	 * NOT be manipulated outside of DataTables. Any configuration should be done
        -	 * through the initialisation options.
        -	 *  @namespace
        -	 *  @todo Really should attach the settings object to individual instances so we
        -	 *    don't need to create new instances on each $().dataTable() call (if the
        -	 *    table already exists). It would also save passing oSettings around and
        -	 *    into every single function. However, this is a very significant
        -	 *    architecture change for DataTables and will almost certainly break
        -	 *    backwards compatibility with older installations. This is something that
        -	 *    will be done in 2.0.
        -	 */
        -	DataTable.models.oSettings = {
        -		/**
        -		 * Primary features of DataTables and their enablement state.
        -		 *  @namespace
        -		 */
        -		"oFeatures": {
        -	
        -			/**
        -			 * Flag to say if DataTables should automatically try to calculate the
        -			 * optimum table and columns widths (true) or not (false).
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bAutoWidth": null,
        -	
        -			/**
        -			 * Delay the creation of TR and TD elements until they are actually
        -			 * needed by a driven page draw. This can give a significant speed
        -			 * increase for Ajax source and Javascript source data, but makes no
        -			 * difference at all fro DOM and server-side processing tables.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bDeferRender": null,
        -	
        -			/**
        -			 * Enable filtering on the table or not. Note that if this is disabled
        -			 * then there is no filtering at all on the table, including fnFilter.
        -			 * To just remove the filtering input use sDom and remove the 'f' option.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bFilter": null,
        -	
        -			/**
        -			 * Table information element (the 'Showing x of y records' div) enable
        -			 * flag.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bInfo": null,
        -	
        -			/**
        -			 * Present a user control allowing the end user to change the page size
        -			 * when pagination is enabled.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bLengthChange": null,
        -	
        -			/**
        -			 * Pagination enabled or not. Note that if this is disabled then length
        -			 * changing must also be disabled.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bPaginate": null,
        -	
        -			/**
        -			 * Processing indicator enable flag whenever DataTables is enacting a
        -			 * user request - typically an Ajax request for server-side processing.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bProcessing": null,
        -	
        -			/**
        -			 * Server-side processing enabled flag - when enabled DataTables will
        -			 * get all data from the server for every draw - there is no filtering,
        -			 * sorting or paging done on the client-side.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bServerSide": null,
        -	
        -			/**
        -			 * Sorting enablement flag.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bSort": null,
        -	
        -			/**
        -			 * Multi-column sorting
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bSortMulti": null,
        -	
        -			/**
        -			 * Apply a class to the columns which are being sorted to provide a
        -			 * visual highlight or not. This can slow things down when enabled since
        -			 * there is a lot of DOM interaction.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bSortClasses": null,
        -	
        -			/**
        -			 * State saving enablement flag.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bStateSave": null
        -		},
        -	
        -	
        -		/**
        -		 * Scrolling settings for a table.
        -		 *  @namespace
        -		 */
        -		"oScroll": {
        -			/**
        -			 * When the table is shorter in height than sScrollY, collapse the
        -			 * table container down to the height of the table (when true).
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type boolean
        -			 */
        -			"bCollapse": null,
        -	
        -			/**
        -			 * Width of the scrollbar for the web-browser's platform. Calculated
        -			 * during table initialisation.
        -			 *  @type int
        -			 *  @default 0
        -			 */
        -			"iBarWidth": 0,
        -	
        -			/**
        -			 * Viewport width for horizontal scrolling. Horizontal scrolling is
        -			 * disabled if an empty string.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type string
        -			 */
        -			"sX": null,
        -	
        -			/**
        -			 * Width to expand the table to when using x-scrolling. Typically you
        -			 * should not need to use this.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type string
        -			 *  @deprecated
        -			 */
        -			"sXInner": null,
        -	
        -			/**
        -			 * Viewport height for vertical scrolling. Vertical scrolling is disabled
        -			 * if an empty string.
        -			 * Note that this parameter will be set by the initialisation routine. To
        -			 * set a default use {@link DataTable.defaults}.
        -			 *  @type string
        -			 */
        -			"sY": null
        -		},
        -	
        -		/**
        -		 * Language information for the table.
        -		 *  @namespace
        -		 *  @extends DataTable.defaults.oLanguage
        -		 */
        -		"oLanguage": {
        -			/**
        -			 * Information callback function. See
        -			 * {@link DataTable.defaults.fnInfoCallback}
        -			 *  @type function
        -			 *  @default null
        -			 */
        -			"fnInfoCallback": null
        -		},
        -	
        -		/**
        -		 * Browser support parameters
        -		 *  @namespace
        -		 */
        -		"oBrowser": {
        -			/**
        -			 * Indicate if the browser incorrectly calculates width:100% inside a
        -			 * scrolling element (IE6/7)
        -			 *  @type boolean
        -			 *  @default false
        -			 */
        -			"bScrollOversize": false,
        -	
        -			/**
        -			 * Determine if the vertical scrollbar is on the right or left of the
        -			 * scrolling container - needed for rtl language layout, although not
        -			 * all browsers move the scrollbar (Safari).
        -			 *  @type boolean
        -			 *  @default false
        -			 */
        -			"bScrollbarLeft": false
        -		},
        -	
        -	
        -		"ajax": null,
        -	
        -	
        -		/**
        -		 * Array referencing the nodes which are used for the features. The
        -		 * parameters of this object match what is allowed by sDom - i.e.
        -		 *   <ul>
        -		 *     <li>'l' - Length changing</li>
        -		 *     <li>'f' - Filtering input</li>
        -		 *     <li>'t' - The table!</li>
        -		 *     <li>'i' - Information</li>
        -		 *     <li>'p' - Pagination</li>
        -		 *     <li>'r' - pRocessing</li>
        -		 *   </ul>
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aanFeatures": [],
        -	
        -		/**
        -		 * Store data information - see {@link DataTable.models.oRow} for detailed
        -		 * information.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoData": [],
        -	
        -		/**
        -		 * Array of indexes which are in the current display (after filtering etc)
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aiDisplay": [],
        -	
        -		/**
        -		 * Array of indexes for display - no filtering
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aiDisplayMaster": [],
        -	
        -		/**
        -		 * Store information about each column that is in use
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoColumns": [],
        -	
        -		/**
        -		 * Store information about the table's header
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoHeader": [],
        -	
        -		/**
        -		 * Store information about the table's footer
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoFooter": [],
        -	
        -		/**
        -		 * Store the applied global search information in case we want to force a
        -		 * research or compare the old search to a new one.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @namespace
        -		 *  @extends DataTable.models.oSearch
        -		 */
        -		"oPreviousSearch": {},
        -	
        -		/**
        -		 * Store the applied search for each column - see
        -		 * {@link DataTable.models.oSearch} for the format that is used for the
        -		 * filtering information for each column.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoPreSearchCols": [],
        -	
        -		/**
        -		 * Sorting that is applied to the table. Note that the inner arrays are
        -		 * used in the following manner:
        -		 * <ul>
        -		 *   <li>Index 0 - column number</li>
        -		 *   <li>Index 1 - current sorting direction</li>
        -		 * </ul>
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type array
        -		 *  @todo These inner arrays should really be objects
        -		 */
        -		"aaSorting": null,
        -	
        -		/**
        -		 * Sorting that is always applied to the table (i.e. prefixed in front of
        -		 * aaSorting).
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aaSortingFixed": [],
        -	
        -		/**
        -		 * Classes to use for the striping of a table.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"asStripeClasses": null,
        -	
        -		/**
        -		 * If restoring a table - we should restore its striping classes as well
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"asDestroyStripes": [],
        -	
        -		/**
        -		 * If restoring a table - we should restore its width
        -		 *  @type int
        -		 *  @default 0
        -		 */
        -		"sDestroyWidth": 0,
        -	
        -		/**
        -		 * Callback functions array for every time a row is inserted (i.e. on a draw).
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoRowCallback": [],
        -	
        -		/**
        -		 * Callback functions for the header on each draw.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoHeaderCallback": [],
        -	
        -		/**
        -		 * Callback function for the footer on each draw.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoFooterCallback": [],
        -	
        -		/**
        -		 * Array of callback functions for draw callback functions
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoDrawCallback": [],
        -	
        -		/**
        -		 * Array of callback functions for row created function
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoRowCreatedCallback": [],
        -	
        -		/**
        -		 * Callback functions for just before the table is redrawn. A return of
        -		 * false will be used to cancel the draw.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoPreDrawCallback": [],
        -	
        -		/**
        -		 * Callback functions for when the table has been initialised.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoInitComplete": [],
        -	
        -	
        -		/**
        -		 * Callbacks for modifying the settings to be stored for state saving, prior to
        -		 * saving state.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoStateSaveParams": [],
        -	
        -		/**
        -		 * Callbacks for modifying the settings that have been stored for state saving
        -		 * prior to using the stored values to restore the state.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoStateLoadParams": [],
        -	
        -		/**
        -		 * Callbacks for operating on the settings object once the saved state has been
        -		 * loaded
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoStateLoaded": [],
        -	
        -		/**
        -		 * Cache the table ID for quick access
        -		 *  @type string
        -		 *  @default <i>Empty string</i>
        -		 */
        -		"sTableId": "",
        -	
        -		/**
        -		 * The TABLE node for the main table
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTable": null,
        -	
        -		/**
        -		 * Permanent ref to the thead element
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTHead": null,
        -	
        -		/**
        -		 * Permanent ref to the tfoot element - if it exists
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTFoot": null,
        -	
        -		/**
        -		 * Permanent ref to the tbody element
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTBody": null,
        -	
        -		/**
        -		 * Cache the wrapper node (contains all DataTables controlled elements)
        -		 *  @type node
        -		 *  @default null
        -		 */
        -		"nTableWrapper": null,
        -	
        -		/**
        -		 * Indicate if when using server-side processing the loading of data
        -		 * should be deferred until the second draw.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type boolean
        -		 *  @default false
        -		 */
        -		"bDeferLoading": false,
        -	
        -		/**
        -		 * Indicate if all required information has been read in
        -		 *  @type boolean
        -		 *  @default false
        -		 */
        -		"bInitialised": false,
        -	
        -		/**
        -		 * Information about open rows. Each object in the array has the parameters
        -		 * 'nTr' and 'nParent'
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoOpenRows": [],
        -	
        -		/**
        -		 * Dictate the positioning of DataTables' control elements - see
        -		 * {@link DataTable.model.oInit.sDom}.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sDom": null,
        -	
        -		/**
        -		 * Search delay (in mS)
        -		 *  @type integer
        -		 *  @default null
        -		 */
        -		"searchDelay": null,
        -	
        -		/**
        -		 * Which type of pagination should be used.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type string
        -		 *  @default two_button
        -		 */
        -		"sPaginationType": "two_button",
        -	
        -		/**
        -		 * The state duration (for `stateSave`) in seconds.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type int
        -		 *  @default 0
        -		 */
        -		"iStateDuration": 0,
        -	
        -		/**
        -		 * Array of callback functions for state saving. Each array element is an
        -		 * object with the following parameters:
        -		 *   <ul>
        -		 *     <li>function:fn - function to call. Takes two parameters, oSettings
        -		 *       and the JSON string to save that has been thus far created. Returns
        -		 *       a JSON string to be inserted into a json object
        -		 *       (i.e. '"param": [ 0, 1, 2]')</li>
        -		 *     <li>string:sName - name of callback</li>
        -		 *   </ul>
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoStateSave": [],
        -	
        -		/**
        -		 * Array of callback functions for state loading. Each array element is an
        -		 * object with the following parameters:
        -		 *   <ul>
        -		 *     <li>function:fn - function to call. Takes two parameters, oSettings
        -		 *       and the object stored. May return false to cancel state loading</li>
        -		 *     <li>string:sName - name of callback</li>
        -		 *   </ul>
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoStateLoad": [],
        -	
        -		/**
        -		 * State that was saved. Useful for back reference
        -		 *  @type object
        -		 *  @default null
        -		 */
        -		"oSavedState": null,
        -	
        -		/**
        -		 * State that was loaded. Useful for back reference
        -		 *  @type object
        -		 *  @default null
        -		 */
        -		"oLoadedState": null,
        -	
        -		/**
        -		 * Source url for AJAX data for the table.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sAjaxSource": null,
        -	
        -		/**
        -		 * Property from a given object from which to read the table data from. This
        -		 * can be an empty string (when not server-side processing), in which case
        -		 * it is  assumed an an array is given directly.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type string
        -		 */
        -		"sAjaxDataProp": null,
        -	
        -		/**
        -		 * Note if draw should be blocked while getting data
        -		 *  @type boolean
        -		 *  @default true
        -		 */
        -		"bAjaxDataGet": true,
        -	
        -		/**
        -		 * The last jQuery XHR object that was used for server-side data gathering.
        -		 * This can be used for working with the XHR information in one of the
        -		 * callbacks
        -		 *  @type object
        -		 *  @default null
        -		 */
        -		"jqXHR": null,
        -	
        -		/**
        -		 * JSON returned from the server in the last Ajax request
        -		 *  @type object
        -		 *  @default undefined
        -		 */
        -		"json": undefined,
        -	
        -		/**
        -		 * Data submitted as part of the last Ajax request
        -		 *  @type object
        -		 *  @default undefined
        -		 */
        -		"oAjaxData": undefined,
        -	
        -		/**
        -		 * Function to get the server-side data.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type function
        -		 */
        -		"fnServerData": null,
        -	
        -		/**
        -		 * Functions which are called prior to sending an Ajax request so extra
        -		 * parameters can easily be sent to the server
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoServerParams": [],
        -	
        -		/**
        -		 * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
        -		 * required).
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type string
        -		 */
        -		"sServerMethod": null,
        -	
        -		/**
        -		 * Format numbers for display.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type function
        -		 */
        -		"fnFormatNumber": null,
        -	
        -		/**
        -		 * List of options that can be used for the user selectable length menu.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aLengthMenu": null,
        -	
        -		/**
        -		 * Counter for the draws that the table does. Also used as a tracker for
        -		 * server-side processing
        -		 *  @type int
        -		 *  @default 0
        -		 */
        -		"iDraw": 0,
        -	
        -		/**
        -		 * Indicate if a redraw is being done - useful for Ajax
        -		 *  @type boolean
        -		 *  @default false
        -		 */
        -		"bDrawing": false,
        -	
        -		/**
        -		 * Draw index (iDraw) of the last error when parsing the returned data
        -		 *  @type int
        -		 *  @default -1
        -		 */
        -		"iDrawError": -1,
        -	
        -		/**
        -		 * Paging display length
        -		 *  @type int
        -		 *  @default 10
        -		 */
        -		"_iDisplayLength": 10,
        -	
        -		/**
        -		 * Paging start point - aiDisplay index
        -		 *  @type int
        -		 *  @default 0
        -		 */
        -		"_iDisplayStart": 0,
        -	
        -		/**
        -		 * Server-side processing - number of records in the result set
        -		 * (i.e. before filtering), Use fnRecordsTotal rather than
        -		 * this property to get the value of the number of records, regardless of
        -		 * the server-side processing setting.
        -		 *  @type int
        -		 *  @default 0
        -		 *  @private
        -		 */
        -		"_iRecordsTotal": 0,
        -	
        -		/**
        -		 * Server-side processing - number of records in the current display set
        -		 * (i.e. after filtering). Use fnRecordsDisplay rather than
        -		 * this property to get the value of the number of records, regardless of
        -		 * the server-side processing setting.
        -		 *  @type boolean
        -		 *  @default 0
        -		 *  @private
        -		 */
        -		"_iRecordsDisplay": 0,
        -	
        -		/**
        -		 * Flag to indicate if jQuery UI marking and classes should be used.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type boolean
        -		 */
        -		"bJUI": null,
        -	
        -		/**
        -		 * The classes to use for the table
        -		 *  @type object
        -		 *  @default {}
        -		 */
        -		"oClasses": {},
        -	
        -		/**
        -		 * Flag attached to the settings object so you can check in the draw
        -		 * callback if filtering has been done in the draw. Deprecated in favour of
        -		 * events.
        -		 *  @type boolean
        -		 *  @default false
        -		 *  @deprecated
        -		 */
        -		"bFiltered": false,
        -	
        -		/**
        -		 * Flag attached to the settings object so you can check in the draw
        -		 * callback if sorting has been done in the draw. Deprecated in favour of
        -		 * events.
        -		 *  @type boolean
        -		 *  @default false
        -		 *  @deprecated
        -		 */
        -		"bSorted": false,
        -	
        -		/**
        -		 * Indicate that if multiple rows are in the header and there is more than
        -		 * one unique cell per column, if the top one (true) or bottom one (false)
        -		 * should be used for sorting / title by DataTables.
        -		 * Note that this parameter will be set by the initialisation routine. To
        -		 * set a default use {@link DataTable.defaults}.
        -		 *  @type boolean
        -		 */
        -		"bSortCellsTop": null,
        -	
        -		/**
        -		 * Initialisation object that is used for the table
        -		 *  @type object
        -		 *  @default null
        -		 */
        -		"oInit": null,
        -	
        -		/**
        -		 * Destroy callback functions - for plug-ins to attach themselves to the
        -		 * destroy so they can clean up markup and events.
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aoDestroyCallback": [],
        -	
        -	
        -		/**
        -		 * Get the number of records in the current record set, before filtering
        -		 *  @type function
        -		 */
        -		"fnRecordsTotal": function ()
        -		{
        -			return _fnDataSource( this ) == 'ssp' ?
        -				this._iRecordsTotal * 1 :
        -				this.aiDisplayMaster.length;
        -		},
        -	
        -		/**
        -		 * Get the number of records in the current record set, after filtering
        -		 *  @type function
        -		 */
        -		"fnRecordsDisplay": function ()
        -		{
        -			return _fnDataSource( this ) == 'ssp' ?
        -				this._iRecordsDisplay * 1 :
        -				this.aiDisplay.length;
        -		},
        -	
        -		/**
        -		 * Get the display end point - aiDisplay index
        -		 *  @type function
        -		 */
        -		"fnDisplayEnd": function ()
        -		{
        -			var
        -				len      = this._iDisplayLength,
        -				start    = this._iDisplayStart,
        -				calc     = start + len,
        -				records  = this.aiDisplay.length,
        -				features = this.oFeatures,
        -				paginate = features.bPaginate;
        -	
        -			if ( features.bServerSide ) {
        -				return paginate === false || len === -1 ?
        -					start + records :
        -					Math.min( start+len, this._iRecordsDisplay );
        -			}
        -			else {
        -				return ! paginate || calc>records || len===-1 ?
        -					records :
        -					calc;
        -			}
        -		},
        -	
        -		/**
        -		 * The DataTables object for this table
        -		 *  @type object
        -		 *  @default null
        -		 */
        -		"oInstance": null,
        -	
        -		/**
        -		 * Unique identifier for each instance of the DataTables object. If there
        -		 * is an ID on the table node, then it takes that value, otherwise an
        -		 * incrementing internal counter is used.
        -		 *  @type string
        -		 *  @default null
        -		 */
        -		"sInstance": null,
        -	
        -		/**
        -		 * tabindex attribute value that is added to DataTables control elements, allowing
        -		 * keyboard navigation of the table and its controls.
        -		 */
        -		"iTabIndex": 0,
        -	
        -		/**
        -		 * DIV container for the footer scrolling table if scrolling
        -		 */
        -		"nScrollHead": null,
        -	
        -		/**
        -		 * DIV container for the footer scrolling table if scrolling
        -		 */
        -		"nScrollFoot": null,
        -	
        -		/**
        -		 * Last applied sort
        -		 *  @type array
        -		 *  @default []
        -		 */
        -		"aLastSort": [],
        -	
        -		/**
        -		 * Stored plug-in instances
        -		 *  @type object
        -		 *  @default {}
        -		 */
        -		"oPlugins": {}
        -	};
        -
        -	/**
        -	 * Extension object for DataTables that is used to provide all extension
        -	 * options.
        -	 *
        -	 * Note that the `DataTable.ext` object is available through
        -	 * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
        -	 * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
        -	 *  @namespace
        -	 *  @extends DataTable.models.ext
        -	 */
        -	
        -	
        -	/**
        -	 * DataTables extensions
        -	 * 
        -	 * This namespace acts as a collection area for plug-ins that can be used to
        -	 * extend DataTables capabilities. Indeed many of the build in methods
        -	 * use this method to provide their own capabilities (sorting methods for
        -	 * example).
        -	 *
        -	 * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
        -	 * reasons
        -	 *
        -	 *  @namespace
        -	 */
        -	DataTable.ext = _ext = {
        -		/**
        -		 * Buttons. For use with the Buttons extension for DataTables. This is
        -		 * defined here so other extensions can define buttons regardless of load
        -		 * order. It is _not_ used by DataTables core.
        -		 *
        -		 *  @type object
        -		 *  @default {}
        -		 */
        -		buttons: {},
        -	
        -	
        -		/**
        -		 * Element class names
        -		 *
        -		 *  @type object
        -		 *  @default {}
        -		 */
        -		classes: {},
        -	
        -	
        -		/**
        -		 * Error reporting.
        -		 * 
        -		 * How should DataTables report an error. Can take the value 'alert',
        -		 * 'throw', 'none' or a function.
        -		 *
        -		 *  @type string|function
        -		 *  @default alert
        -		 */
        -		errMode: "alert",
        -	
        -	
        -		/**
        -		 * Feature plug-ins.
        -		 * 
        -		 * This is an array of objects which describe the feature plug-ins that are
        -		 * available to DataTables. These feature plug-ins are then available for
        -		 * use through the `dom` initialisation option.
        -		 * 
        -		 * Each feature plug-in is described by an object which must have the
        -		 * following properties:
        -		 * 
        -		 * * `fnInit` - function that is used to initialise the plug-in,
        -		 * * `cFeature` - a character so the feature can be enabled by the `dom`
        -		 *   instillation option. This is case sensitive.
        -		 *
        -		 * The `fnInit` function has the following input parameters:
        -		 *
        -		 * 1. `{object}` DataTables settings object: see
        -		 *    {@link DataTable.models.oSettings}
        -		 *
        -		 * And the following return is expected:
        -		 * 
        -		 * * {node|null} The element which contains your feature. Note that the
        -		 *   return may also be void if your plug-in does not require to inject any
        -		 *   DOM elements into DataTables control (`dom`) - for example this might
        -		 *   be useful when developing a plug-in which allows table control via
        -		 *   keyboard entry
        -		 *
        -		 *  @type array
        -		 *
        -		 *  @example
        -		 *    $.fn.dataTable.ext.features.push( {
        -		 *      "fnInit": function( oSettings ) {
        -		 *        return new TableTools( { "oDTSettings": oSettings } );
        -		 *      },
        -		 *      "cFeature": "T"
        -		 *    } );
        -		 */
        -		feature: [],
        -	
        -	
        -		/**
        -		 * Row searching.
        -		 * 
        -		 * This method of searching is complimentary to the default type based
        -		 * searching, and a lot more comprehensive as it allows you complete control
        -		 * over the searching logic. Each element in this array is a function
        -		 * (parameters described below) that is called for every row in the table,
        -		 * and your logic decides if it should be included in the searching data set
        -		 * or not.
        -		 *
        -		 * Searching functions have the following input parameters:
        -		 *
        -		 * 1. `{object}` DataTables settings object: see
        -		 *    {@link DataTable.models.oSettings}
        -		 * 2. `{array|object}` Data for the row to be processed (same as the
        -		 *    original format that was passed in as the data source, or an array
        -		 *    from a DOM data source
        -		 * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
        -		 *    can be useful to retrieve the `TR` element if you need DOM interaction.
        -		 *
        -		 * And the following return is expected:
        -		 *
        -		 * * {boolean} Include the row in the searched result set (true) or not
        -		 *   (false)
        -		 *
        -		 * Note that as with the main search ability in DataTables, technically this
        -		 * is "filtering", since it is subtractive. However, for consistency in
        -		 * naming we call it searching here.
        -		 *
        -		 *  @type array
        -		 *  @default []
        -		 *
        -		 *  @example
        -		 *    // The following example shows custom search being applied to the
        -		 *    // fourth column (i.e. the data[3] index) based on two input values
        -		 *    // from the end-user, matching the data in a certain range.
        -		 *    $.fn.dataTable.ext.search.push(
        -		 *      function( settings, data, dataIndex ) {
        -		 *        var min = document.getElementById('min').value * 1;
        -		 *        var max = document.getElementById('max').value * 1;
        -		 *        var version = data[3] == "-" ? 0 : data[3]*1;
        -		 *
        -		 *        if ( min == "" && max == "" ) {
        -		 *          return true;
        -		 *        }
        -		 *        else if ( min == "" && version < max ) {
        -		 *          return true;
        -		 *        }
        -		 *        else if ( min < version && "" == max ) {
        -		 *          return true;
        -		 *        }
        -		 *        else if ( min < version && version < max ) {
        -		 *          return true;
        -		 *        }
        -		 *        return false;
        -		 *      }
        -		 *    );
        -		 */
        -		search: [],
        -	
        -	
        -		/**
        -		 * Selector extensions
        -		 *
        -		 * The `selector` option can be used to extend the options available for the
        -		 * selector modifier options (`selector-modifier` object data type) that
        -		 * each of the three built in selector types offer (row, column and cell +
        -		 * their plural counterparts). For example the Select extension uses this
        -		 * mechanism to provide an option to select only rows, columns and cells
        -		 * that have been marked as selected by the end user (`{selected: true}`),
        -		 * which can be used in conjunction with the existing built in selector
        -		 * options.
        -		 *
        -		 * Each property is an array to which functions can be pushed. The functions
        -		 * take three attributes:
        -		 *
        -		 * * Settings object for the host table
        -		 * * Options object (`selector-modifier` object type)
        -		 * * Array of selected item indexes
        -		 *
        -		 * The return is an array of the resulting item indexes after the custom
        -		 * selector has been applied.
        -		 *
        -		 *  @type object
        -		 */
        -		selector: {
        -			cell: [],
        -			column: [],
        -			row: []
        -		},
        -	
        -	
        -		/**
        -		 * Internal functions, exposed for used in plug-ins.
        -		 * 
        -		 * Please note that you should not need to use the internal methods for
        -		 * anything other than a plug-in (and even then, try to avoid if possible).
        -		 * The internal function may change between releases.
        -		 *
        -		 *  @type object
        -		 *  @default {}
        -		 */
        -		internal: {},
        -	
        -	
        -		/**
        -		 * Legacy configuration options. Enable and disable legacy options that
        -		 * are available in DataTables.
        -		 *
        -		 *  @type object
        -		 */
        -		legacy: {
        -			/**
        -			 * Enable / disable DataTables 1.9 compatible server-side processing
        -			 * requests
        -			 *
        -			 *  @type boolean
        -			 *  @default null
        -			 */
        -			ajax: null
        -		},
        -	
        -	
        -		/**
        -		 * Pagination plug-in methods.
        -		 * 
        -		 * Each entry in this object is a function and defines which buttons should
        -		 * be shown by the pagination rendering method that is used for the table:
        -		 * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
        -		 * buttons are displayed in the document, while the functions here tell it
        -		 * what buttons to display. This is done by returning an array of button
        -		 * descriptions (what each button will do).
        -		 *
        -		 * Pagination types (the four built in options and any additional plug-in
        -		 * options defined here) can be used through the `paginationType`
        -		 * initialisation parameter.
        -		 *
        -		 * The functions defined take two parameters:
        -		 *
        -		 * 1. `{int} page` The current page index
        -		 * 2. `{int} pages` The number of pages in the table
        -		 *
        -		 * Each function is expected to return an array where each element of the
        -		 * array can be one of:
        -		 *
        -		 * * `first` - Jump to first page when activated
        -		 * * `last` - Jump to last page when activated
        -		 * * `previous` - Show previous page when activated
        -		 * * `next` - Show next page when activated
        -		 * * `{int}` - Show page of the index given
        -		 * * `{array}` - A nested array containing the above elements to add a
        -		 *   containing 'DIV' element (might be useful for styling).
        -		 *
        -		 * Note that DataTables v1.9- used this object slightly differently whereby
        -		 * an object with two functions would be defined for each plug-in. That
        -		 * ability is still supported by DataTables 1.10+ to provide backwards
        -		 * compatibility, but this option of use is now decremented and no longer
        -		 * documented in DataTables 1.10+.
        -		 *
        -		 *  @type object
        -		 *  @default {}
        -		 *
        -		 *  @example
        -		 *    // Show previous, next and current page buttons only
        -		 *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
        -		 *      return [ 'previous', page, 'next' ];
        -		 *    };
        -		 */
        -		pager: {},
        -	
        -	
        -		renderer: {
        -			pageButton: {},
        -			header: {}
        -		},
        -	
        -	
        -		/**
        -		 * Ordering plug-ins - custom data source
        -		 * 
        -		 * The extension options for ordering of data available here is complimentary
        -		 * to the default type based ordering that DataTables typically uses. It
        -		 * allows much greater control over the the data that is being used to
        -		 * order a column, but is necessarily therefore more complex.
        -		 * 
        -		 * This type of ordering is useful if you want to do ordering based on data
        -		 * live from the DOM (for example the contents of an 'input' element) rather
        -		 * than just the static string that DataTables knows of.
        -		 * 
        -		 * The way these plug-ins work is that you create an array of the values you
        -		 * wish to be ordering for the column in question and then return that
        -		 * array. The data in the array much be in the index order of the rows in
        -		 * the table (not the currently ordering order!). Which order data gathering
        -		 * function is run here depends on the `dt-init columns.orderDataType`
        -		 * parameter that is used for the column (if any).
        -		 *
        -		 * The functions defined take two parameters:
        -		 *
        -		 * 1. `{object}` DataTables settings object: see
        -		 *    {@link DataTable.models.oSettings}
        -		 * 2. `{int}` Target column index
        -		 *
        -		 * Each function is expected to return an array:
        -		 *
        -		 * * `{array}` Data for the column to be ordering upon
        -		 *
        -		 *  @type array
        -		 *
        -		 *  @example
        -		 *    // Ordering using `input` node values
        -		 *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )
        -		 *    {
        -		 *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
        -		 *        return $('input', td).val();
        -		 *      } );
        -		 *    }
        -		 */
        -		order: {},
        -	
        -	
        -		/**
        -		 * Type based plug-ins.
        -		 *
        -		 * Each column in DataTables has a type assigned to it, either by automatic
        -		 * detection or by direct assignment using the `type` option for the column.
        -		 * The type of a column will effect how it is ordering and search (plug-ins
        -		 * can also make use of the column type if required).
        -		 *
        -		 * @namespace
        -		 */
        -		type: {
        -			/**
        -			 * Type detection functions.
        -			 *
        -			 * The functions defined in this object are used to automatically detect
        -			 * a column's type, making initialisation of DataTables super easy, even
        -			 * when complex data is in the table.
        -			 *
        -			 * The functions defined take two parameters:
        -			 *
        -		     *  1. `{*}` Data from the column cell to be analysed
        -		     *  2. `{settings}` DataTables settings object. This can be used to
        -		     *     perform context specific type detection - for example detection
        -		     *     based on language settings such as using a comma for a decimal
        -		     *     place. Generally speaking the options from the settings will not
        -		     *     be required
        -			 *
        -			 * Each function is expected to return:
        -			 *
        -			 * * `{string|null}` Data type detected, or null if unknown (and thus
        -			 *   pass it on to the other type detection functions.
        -			 *
        -			 *  @type array
        -			 *
        -			 *  @example
        -			 *    // Currency type detection plug-in:
        -			 *    $.fn.dataTable.ext.type.detect.push(
        -			 *      function ( data, settings ) {
        -			 *        // Check the numeric part
        -			 *        if ( ! $.isNumeric( data.substring(1) ) ) {
        -			 *          return null;
        -			 *        }
        -			 *
        -			 *        // Check prefixed by currency
        -			 *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {
        -			 *          return 'currency';
        -			 *        }
        -			 *        return null;
        -			 *      }
        -			 *    );
        -			 */
        -			detect: [],
        -	
        -	
        -			/**
        -			 * Type based search formatting.
        -			 *
        -			 * The type based searching functions can be used to pre-format the
        -			 * data to be search on. For example, it can be used to strip HTML
        -			 * tags or to de-format telephone numbers for numeric only searching.
        -			 *
        -			 * Note that is a search is not defined for a column of a given type,
        -			 * no search formatting will be performed.
        -			 * 
        -			 * Pre-processing of searching data plug-ins - When you assign the sType
        -			 * for a column (or have it automatically detected for you by DataTables
        -			 * or a type detection plug-in), you will typically be using this for
        -			 * custom sorting, but it can also be used to provide custom searching
        -			 * by allowing you to pre-processing the data and returning the data in
        -			 * the format that should be searched upon. This is done by adding
        -			 * functions this object with a parameter name which matches the sType
        -			 * for that target column. This is the corollary of <i>afnSortData</i>
        -			 * for searching data.
        -			 *
        -			 * The functions defined take a single parameter:
        -			 *
        -		     *  1. `{*}` Data from the column cell to be prepared for searching
        -			 *
        -			 * Each function is expected to return:
        -			 *
        -			 * * `{string|null}` Formatted string that will be used for the searching.
        -			 *
        -			 *  @type object
        -			 *  @default {}
        -			 *
        -			 *  @example
        -			 *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
        -			 *      return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
        -			 *    }
        -			 */
        -			search: {},
        -	
        -	
        -			/**
        -			 * Type based ordering.
        -			 *
        -			 * The column type tells DataTables what ordering to apply to the table
        -			 * when a column is sorted upon. The order for each type that is defined,
        -			 * is defined by the functions available in this object.
        -			 *
        -			 * Each ordering option can be described by three properties added to
        -			 * this object:
        -			 *
        -			 * * `{type}-pre` - Pre-formatting function
        -			 * * `{type}-asc` - Ascending order function
        -			 * * `{type}-desc` - Descending order function
        -			 *
        -			 * All three can be used together, only `{type}-pre` or only
        -			 * `{type}-asc` and `{type}-desc` together. It is generally recommended
        -			 * that only `{type}-pre` is used, as this provides the optimal
        -			 * implementation in terms of speed, although the others are provided
        -			 * for compatibility with existing Javascript sort functions.
        -			 *
        -			 * `{type}-pre`: Functions defined take a single parameter:
        -			 *
        -		     *  1. `{*}` Data from the column cell to be prepared for ordering
        -			 *
        -			 * And return:
        -			 *
        -			 * * `{*}` Data to be sorted upon
        -			 *
        -			 * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
        -			 * functions, taking two parameters:
        -			 *
        -		     *  1. `{*}` Data to compare to the second parameter
        -		     *  2. `{*}` Data to compare to the first parameter
        -			 *
        -			 * And returning:
        -			 *
        -			 * * `{*}` Ordering match: <0 if first parameter should be sorted lower
        -			 *   than the second parameter, ===0 if the two parameters are equal and
        -			 *   >0 if the first parameter should be sorted height than the second
        -			 *   parameter.
        -			 * 
        -			 *  @type object
        -			 *  @default {}
        -			 *
        -			 *  @example
        -			 *    // Numeric ordering of formatted numbers with a pre-formatter
        -			 *    $.extend( $.fn.dataTable.ext.type.order, {
        -			 *      "string-pre": function(x) {
        -			 *        a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
        -			 *        return parseFloat( a );
        -			 *      }
        -			 *    } );
        -			 *
        -			 *  @example
        -			 *    // Case-sensitive string ordering, with no pre-formatting method
        -			 *    $.extend( $.fn.dataTable.ext.order, {
        -			 *      "string-case-asc": function(x,y) {
        -			 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
        -			 *      },
        -			 *      "string-case-desc": function(x,y) {
        -			 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
        -			 *      }
        -			 *    } );
        -			 */
        -			order: {}
        -		},
        -	
        -		/**
        -		 * Unique DataTables instance counter
        -		 *
        -		 * @type int
        -		 * @private
        -		 */
        -		_unique: 0,
        -	
        -	
        -		//
        -		// Depreciated
        -		// The following properties are retained for backwards compatiblity only.
        -		// The should not be used in new projects and will be removed in a future
        -		// version
        -		//
        -	
        -		/**
        -		 * Version check function.
        -		 *  @type function
        -		 *  @depreciated Since 1.10
        -		 */
        -		fnVersionCheck: DataTable.fnVersionCheck,
        -	
        -	
        -		/**
        -		 * Index for what 'this' index API functions should use
        -		 *  @type int
        -		 *  @deprecated Since v1.10
        -		 */
        -		iApiIndex: 0,
        -	
        -	
        -		/**
        -		 * jQuery UI class container
        -		 *  @type object
        -		 *  @deprecated Since v1.10
        -		 */
        -		oJUIClasses: {},
        -	
        -	
        -		/**
        -		 * Software version
        -		 *  @type string
        -		 *  @deprecated Since v1.10
        -		 */
        -		sVersion: DataTable.version
        -	};
        -	
        -	
        -	//
        -	// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
        -	//
        -	$.extend( _ext, {
        -		afnFiltering: _ext.search,
        -		aTypes:       _ext.type.detect,
        -		ofnSearch:    _ext.type.search,
        -		oSort:        _ext.type.order,
        -		afnSortData:  _ext.order,
        -		aoFeatures:   _ext.feature,
        -		oApi:         _ext.internal,
        -		oStdClasses:  _ext.classes,
        -		oPagination:  _ext.pager
        -	} );
        -	
        -	
        -	$.extend( DataTable.ext.classes, {
        -		"sTable": "dataTable",
        -		"sNoFooter": "no-footer",
        -	
        -		/* Paging buttons */
        -		"sPageButton": "paginate_button",
        -		"sPageButtonActive": "current",
        -		"sPageButtonDisabled": "disabled",
        -	
        -		/* Striping classes */
        -		"sStripeOdd": "odd",
        -		"sStripeEven": "even",
        -	
        -		/* Empty row */
        -		"sRowEmpty": "dataTables_empty",
        -	
        -		/* Features */
        -		"sWrapper": "dataTables_wrapper",
        -		"sFilter": "dataTables_filter",
        -		"sInfo": "dataTables_info",
        -		"sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
        -		"sLength": "dataTables_length",
        -		"sProcessing": "dataTables_processing",
        -	
        -		/* Sorting */
        -		"sSortAsc": "sorting_asc",
        -		"sSortDesc": "sorting_desc",
        -		"sSortable": "sorting", /* Sortable in both directions */
        -		"sSortableAsc": "sorting_asc_disabled",
        -		"sSortableDesc": "sorting_desc_disabled",
        -		"sSortableNone": "sorting_disabled",
        -		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
        -	
        -		/* Filtering */
        -		"sFilterInput": "",
        -	
        -		/* Page length */
        -		"sLengthSelect": "",
        -	
        -		/* Scrolling */
        -		"sScrollWrapper": "dataTables_scroll",
        -		"sScrollHead": "dataTables_scrollHead",
        -		"sScrollHeadInner": "dataTables_scrollHeadInner",
        -		"sScrollBody": "dataTables_scrollBody",
        -		"sScrollFoot": "dataTables_scrollFoot",
        -		"sScrollFootInner": "dataTables_scrollFootInner",
        -	
        -		/* Misc */
        -		"sHeaderTH": "",
        -		"sFooterTH": "",
        -	
        -		// Deprecated
        -		"sSortJUIAsc": "",
        -		"sSortJUIDesc": "",
        -		"sSortJUI": "",
        -		"sSortJUIAscAllowed": "",
        -		"sSortJUIDescAllowed": "",
        -		"sSortJUIWrapper": "",
        -		"sSortIcon": "",
        -		"sJUIHeader": "",
        -		"sJUIFooter": ""
        -	} );
        -	
        -	
        -	(function() {
        -	
        -	// Reused strings for better compression. Closure compiler appears to have a
        -	// weird edge case where it is trying to expand strings rather than use the
        -	// variable version. This results in about 200 bytes being added, for very
        -	// little preference benefit since it this run on script load only.
        -	var _empty = '';
        -	_empty = '';
        -	
        -	var _stateDefault = _empty + 'ui-state-default';
        -	var _sortIcon     = _empty + 'css_right ui-icon ui-icon-';
        -	var _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix';
        -	
        -	$.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, {
        -		/* Full numbers paging buttons */
        -		"sPageButton":         "fg-button ui-button "+_stateDefault,
        -		"sPageButtonActive":   "ui-state-disabled",
        -		"sPageButtonDisabled": "ui-state-disabled",
        -	
        -		/* Features */
        -		"sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
        -			"ui-buttonset-multi paging_", /* Note that the type is postfixed */
        -	
        -		/* Sorting */
        -		"sSortAsc":            _stateDefault+" sorting_asc",
        -		"sSortDesc":           _stateDefault+" sorting_desc",
        -		"sSortable":           _stateDefault+" sorting",
        -		"sSortableAsc":        _stateDefault+" sorting_asc_disabled",
        -		"sSortableDesc":       _stateDefault+" sorting_desc_disabled",
        -		"sSortableNone":       _stateDefault+" sorting_disabled",
        -		"sSortJUIAsc":         _sortIcon+"triangle-1-n",
        -		"sSortJUIDesc":        _sortIcon+"triangle-1-s",
        -		"sSortJUI":            _sortIcon+"carat-2-n-s",
        -		"sSortJUIAscAllowed":  _sortIcon+"carat-1-n",
        -		"sSortJUIDescAllowed": _sortIcon+"carat-1-s",
        -		"sSortJUIWrapper":     "DataTables_sort_wrapper",
        -		"sSortIcon":           "DataTables_sort_icon",
        -	
        -		/* Scrolling */
        -		"sScrollHead": "dataTables_scrollHead "+_stateDefault,
        -		"sScrollFoot": "dataTables_scrollFoot "+_stateDefault,
        -	
        -		/* Misc */
        -		"sHeaderTH":  _stateDefault,
        -		"sFooterTH":  _stateDefault,
        -		"sJUIHeader": _headerFooter+" ui-corner-tl ui-corner-tr",
        -		"sJUIFooter": _headerFooter+" ui-corner-bl ui-corner-br"
        -	} );
        -	
        -	}());
        -	
        -	
        -	
        -	var extPagination = DataTable.ext.pager;
        -	
        -	function _numbers ( page, pages ) {
        -		var
        -			numbers = [],
        -			buttons = extPagination.numbers_length,
        -			half = Math.floor( buttons / 2 ),
        -			i = 1;
        -	
        -		if ( pages <= buttons ) {
        -			numbers = _range( 0, pages );
        -		}
        -		else if ( page <= half ) {
        -			numbers = _range( 0, buttons-2 );
        -			numbers.push( 'ellipsis' );
        -			numbers.push( pages-1 );
        -		}
        -		else if ( page >= pages - 1 - half ) {
        -			numbers = _range( pages-(buttons-2), pages );
        -			numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
        -			numbers.splice( 0, 0, 0 );
        -		}
        -		else {
        -			numbers = _range( page-half+2, page+half-1 );
        -			numbers.push( 'ellipsis' );
        -			numbers.push( pages-1 );
        -			numbers.splice( 0, 0, 'ellipsis' );
        -			numbers.splice( 0, 0, 0 );
        -		}
        -	
        -		numbers.DT_el = 'span';
        -		return numbers;
        -	}
        -	
        -	
        -	$.extend( extPagination, {
        -		simple: function ( page, pages ) {
        -			return [ 'previous', 'next' ];
        -		},
        -	
        -		full: function ( page, pages ) {
        -			return [  'first', 'previous', 'next', 'last' ];
        -		},
        -	
        -		simple_numbers: function ( page, pages ) {
        -			return [ 'previous', _numbers(page, pages), 'next' ];
        -		},
        -	
        -		full_numbers: function ( page, pages ) {
        -			return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
        -		},
        -	
        -		// For testing and plug-ins to use
        -		_numbers: _numbers,
        -	
        -		// Number of number buttons (including ellipsis) to show. _Must be odd!_
        -		numbers_length: 7
        -	} );
        -	
        -	
        -	$.extend( true, DataTable.ext.renderer, {
        -		pageButton: {
        -			_: function ( settings, host, idx, buttons, page, pages ) {
        -				var classes = settings.oClasses;
        -				var lang = settings.oLanguage.oPaginate;
        -				var btnDisplay, btnClass, counter=0;
        -	
        -				var attach = function( container, buttons ) {
        -					var i, ien, node, button;
        -					var clickHandler = function ( e ) {
        -						_fnPageChange( settings, e.data.action, true );
        -					};
        -	
        -					for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
        -						button = buttons[i];
        -	
        -						if ( $.isArray( button ) ) {
        -							var inner = $( '<'+(button.DT_el || 'div')+'/>' )
        -								.appendTo( container );
        -							attach( inner, button );
        -						}
        -						else {
        -							btnDisplay = '';
        -							btnClass = '';
        -	
        -							switch ( button ) {
        -								case 'ellipsis':
        -									container.append('<span class="ellipsis">&#x2026;</span>');
        -									break;
        -	
        -								case 'first':
        -									btnDisplay = lang.sFirst;
        -									btnClass = button + (page > 0 ?
        -										'' : ' '+classes.sPageButtonDisabled);
        -									break;
        -	
        -								case 'previous':
        -									btnDisplay = lang.sPrevious;
        -									btnClass = button + (page > 0 ?
        -										'' : ' '+classes.sPageButtonDisabled);
        -									break;
        -	
        -								case 'next':
        -									btnDisplay = lang.sNext;
        -									btnClass = button + (page < pages-1 ?
        -										'' : ' '+classes.sPageButtonDisabled);
        -									break;
        -	
        -								case 'last':
        -									btnDisplay = lang.sLast;
        -									btnClass = button + (page < pages-1 ?
        -										'' : ' '+classes.sPageButtonDisabled);
        -									break;
        -	
        -								default:
        -									btnDisplay = button + 1;
        -									btnClass = page === button ?
        -										classes.sPageButtonActive : '';
        -									break;
        -							}
        -	
        -							if ( btnDisplay ) {
        -								node = $('<a>', {
        -										'class': classes.sPageButton+' '+btnClass,
        -										'aria-controls': settings.sTableId,
        -										'data-dt-idx': counter,
        -										'tabindex': settings.iTabIndex,
        -										'id': idx === 0 && typeof button === 'string' ?
        -											settings.sTableId +'_'+ button :
        -											null
        -									} )
        -									.html( btnDisplay )
        -									.appendTo( container );
        -	
        -								_fnBindAction(
        -									node, {action: button}, clickHandler
        -								);
        -	
        -								counter++;
        -							}
        -						}
        -					}
        -				};
        -	
        -				// IE9 throws an 'unknown error' if document.activeElement is used
        -				// inside an iframe or frame. Try / catch the error. Not good for
        -				// accessibility, but neither are frames.
        -				var activeEl;
        -	
        -				try {
        -					// Because this approach is destroying and recreating the paging
        -					// elements, focus is lost on the select button which is bad for
        -					// accessibility. So we want to restore focus once the draw has
        -					// completed
        -					activeEl = $(document.activeElement).data('dt-idx');
        -				}
        -				catch (e) {}
        -	
        -				attach( $(host).empty(), buttons );
        -	
        -				if ( activeEl ) {
        -					$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
        -				}
        -			}
        -		}
        -	} );
        -	
        -	
        -	
        -	// Built in type detection. See model.ext.aTypes for information about
        -	// what is required from this methods.
        -	$.extend( DataTable.ext.type.detect, [
        -		// Plain numbers - first since V8 detects some plain numbers as dates
        -		// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
        -		function ( d, settings )
        -		{
        -			var decimal = settings.oLanguage.sDecimal;
        -			return _isNumber( d, decimal ) ? 'num'+decimal : null;
        -		},
        -	
        -		// Dates (only those recognised by the browser's Date.parse)
        -		function ( d, settings )
        -		{
        -			// V8 will remove any unknown characters at the start and end of the
        -			// expression, leading to false matches such as `$245.12` or `10%` being
        -			// a valid date. See forum thread 18941 for detail.
        -			if ( d && !(d instanceof Date) && ( ! _re_date_start.test(d) || ! _re_date_end.test(d) ) ) {
        -				return null;
        -			}
        -			var parsed = Date.parse(d);
        -			return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
        -		},
        -	
        -		// Formatted numbers
        -		function ( d, settings )
        -		{
        -			var decimal = settings.oLanguage.sDecimal;
        -			return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
        -		},
        -	
        -		// HTML numeric
        -		function ( d, settings )
        -		{
        -			var decimal = settings.oLanguage.sDecimal;
        -			return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
        -		},
        -	
        -		// HTML numeric, formatted
        -		function ( d, settings )
        -		{
        -			var decimal = settings.oLanguage.sDecimal;
        -			return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
        -		},
        -	
        -		// HTML (this is strict checking - there must be html)
        -		function ( d, settings )
        -		{
        -			return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
        -				'html' : null;
        -		}
        -	] );
        -	
        -	
        -	
        -	// Filter formatting functions. See model.ext.ofnSearch for information about
        -	// what is required from these methods.
        -	// 
        -	// Note that additional search methods are added for the html numbers and
        -	// html formatted numbers by `_addNumericSort()` when we know what the decimal
        -	// place is
        -	
        -	
        -	$.extend( DataTable.ext.type.search, {
        -		html: function ( data ) {
        -			return _empty(data) ?
        -				data :
        -				typeof data === 'string' ?
        -					data
        -						.replace( _re_new_lines, " " )
        -						.replace( _re_html, "" ) :
        -					'';
        -		},
        -	
        -		string: function ( data ) {
        -			return _empty(data) ?
        -				data :
        -				typeof data === 'string' ?
        -					data.replace( _re_new_lines, " " ) :
        -					data;
        -		}
        -	} );
        -	
        -	
        -	
        -	var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
        -		if ( d !== 0 && (!d || d === '-') ) {
        -			return -Infinity;
        -		}
        -	
        -		// If a decimal place other than `.` is used, it needs to be given to the
        -		// function so we can detect it and replace with a `.` which is the only
        -		// decimal place Javascript recognises - it is not locale aware.
        -		if ( decimalPlace ) {
        -			d = _numToDecimal( d, decimalPlace );
        -		}
        -	
        -		if ( d.replace ) {
        -			if ( re1 ) {
        -				d = d.replace( re1, '' );
        -			}
        -	
        -			if ( re2 ) {
        -				d = d.replace( re2, '' );
        -			}
        -		}
        -	
        -		return d * 1;
        -	};
        -	
        -	
        -	// Add the numeric 'deformatting' functions for sorting and search. This is done
        -	// in a function to provide an easy ability for the language options to add
        -	// additional methods if a non-period decimal place is used.
        -	function _addNumericSort ( decimalPlace ) {
        -		$.each(
        -			{
        -				// Plain numbers
        -				"num": function ( d ) {
        -					return __numericReplace( d, decimalPlace );
        -				},
        -	
        -				// Formatted numbers
        -				"num-fmt": function ( d ) {
        -					return __numericReplace( d, decimalPlace, _re_formatted_numeric );
        -				},
        -	
        -				// HTML numeric
        -				"html-num": function ( d ) {
        -					return __numericReplace( d, decimalPlace, _re_html );
        -				},
        -	
        -				// HTML numeric, formatted
        -				"html-num-fmt": function ( d ) {
        -					return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
        -				}
        -			},
        -			function ( key, fn ) {
        -				// Add the ordering method
        -				_ext.type.order[ key+decimalPlace+'-pre' ] = fn;
        -	
        -				// For HTML types add a search formatter that will strip the HTML
        -				if ( key.match(/^html\-/) ) {
        -					_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
        -				}
        -			}
        -		);
        -	}
        -	
        -	
        -	// Default sort methods
        -	$.extend( _ext.type.order, {
        -		// Dates
        -		"date-pre": function ( d ) {
        -			return Date.parse( d ) || 0;
        -		},
        -	
        -		// html
        -		"html-pre": function ( a ) {
        -			return _empty(a) ?
        -				'' :
        -				a.replace ?
        -					a.replace( /<.*?>/g, "" ).toLowerCase() :
        -					a+'';
        -		},
        -	
        -		// string
        -		"string-pre": function ( a ) {
        -			// This is a little complex, but faster than always calling toString,
        -			// http://jsperf.com/tostring-v-check
        -			return _empty(a) ?
        -				'' :
        -				typeof a === 'string' ?
        -					a.toLowerCase() :
        -					! a.toString ?
        -						'' :
        -						a.toString();
        -		},
        -	
        -		// string-asc and -desc are retained only for compatibility with the old
        -		// sort methods
        -		"string-asc": function ( x, y ) {
        -			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
        -		},
        -	
        -		"string-desc": function ( x, y ) {
        -			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
        -		}
        -	} );
        -	
        -	
        -	// Numeric sorting types - order doesn't matter here
        -	_addNumericSort( '' );
        -	
        -	
        -	$.extend( true, DataTable.ext.renderer, {
        -		header: {
        -			_: function ( settings, cell, column, classes ) {
        -				// No additional mark-up required
        -				// Attach a sort listener to update on sort - note that using the
        -				// `DT` namespace will allow the event to be removed automatically
        -				// on destroy, while the `dt` namespaced event is the one we are
        -				// listening for
        -				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
        -					if ( settings !== ctx ) { // need to check this this is the host
        -						return;               // table, not a nested one
        -					}
        -	
        -					var colIdx = column.idx;
        -	
        -					cell
        -						.removeClass(
        -							column.sSortingClass +' '+
        -							classes.sSortAsc +' '+
        -							classes.sSortDesc
        -						)
        -						.addClass( columns[ colIdx ] == 'asc' ?
        -							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
        -								classes.sSortDesc :
        -								column.sSortingClass
        -						);
        -				} );
        -			},
        -	
        -			jqueryui: function ( settings, cell, column, classes ) {
        -				$('<div/>')
        -					.addClass( classes.sSortJUIWrapper )
        -					.append( cell.contents() )
        -					.append( $('<span/>')
        -						.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
        -					)
        -					.appendTo( cell );
        -	
        -				// Attach a sort listener to update on sort
        -				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
        -					if ( settings !== ctx ) {
        -						return;
        -					}
        -	
        -					var colIdx = column.idx;
        -	
        -					cell
        -						.removeClass( classes.sSortAsc +" "+classes.sSortDesc )
        -						.addClass( columns[ colIdx ] == 'asc' ?
        -							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
        -								classes.sSortDesc :
        -								column.sSortingClass
        -						);
        -	
        -					cell
        -						.find( 'span.'+classes.sSortIcon )
        -						.removeClass(
        -							classes.sSortJUIAsc +" "+
        -							classes.sSortJUIDesc +" "+
        -							classes.sSortJUI +" "+
        -							classes.sSortJUIAscAllowed +" "+
        -							classes.sSortJUIDescAllowed
        -						)
        -						.addClass( columns[ colIdx ] == 'asc' ?
        -							classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
        -								classes.sSortJUIDesc :
        -								column.sSortingClassJUI
        -						);
        -				} );
        -			}
        -		}
        -	} );
        -	
        -	/*
        -	 * Public helper functions. These aren't used internally by DataTables, or
        -	 * called by any of the options passed into DataTables, but they can be used
        -	 * externally by developers working with DataTables. They are helper functions
        -	 * to make working with DataTables a little bit easier.
        -	 */
        -	
        -	/**
        -	 * Helpers for `columns.render`.
        -	 *
        -	 * The options defined here can be used with the `columns.render` initialisation
        -	 * option to provide a display renderer. The following functions are defined:
        -	 *
        -	 * * `number` - Will format numeric data (defined by `columns.data`) for
        -	 *   display, retaining the original unformatted data for sorting and filtering.
        -	 *   It takes 4 parameters:
        -	 *   * `string` - Thousands grouping separator
        -	 *   * `string` - Decimal point indicator
        -	 *   * `integer` - Number of decimal points to show
        -	 *   * `string` (optional) - Prefix.
        -	 *
        -	 * @example
        -	 *   // Column definition using the number renderer
        -	 *   {
        -	 *     data: "salary",
        -	 *     render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
        -	 *   }
        -	 *
        -	 * @namespace
        -	 */
        -	DataTable.render = {
        -		number: function ( thousands, decimal, precision, prefix ) {
        -			return {
        -				display: function ( d ) {
        -					if ( typeof d !== 'number' && typeof d !== 'string' ) {
        -						return d;
        -					}
        -	
        -					var negative = d < 0 ? '-' : '';
        -					d = Math.abs( parseFloat( d ) );
        -	
        -					var intPart = parseInt( d, 10 );
        -					var floatPart = precision ?
        -						decimal+(d - intPart).toFixed( precision ).substring( 2 ):
        -						'';
        -	
        -					return negative + (prefix||'') +
        -						intPart.toString().replace(
        -							/\B(?=(\d{3})+(?!\d))/g, thousands
        -						) +
        -						floatPart;
        -				}
        -			};
        -		}
        -	};
        -	
        -	
        -	/*
        -	 * This is really a good bit rubbish this method of exposing the internal methods
        -	 * publicly... - To be fixed in 2.0 using methods on the prototype
        -	 */
        -	
        -	
        -	/**
        -	 * Create a wrapper function for exporting an internal functions to an external API.
        -	 *  @param {string} fn API function name
        -	 *  @returns {function} wrapped function
        -	 *  @memberof DataTable#internal
        -	 */
        -	function _fnExternApiFunc (fn)
        -	{
        -		return function() {
        -			var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
        -				Array.prototype.slice.call(arguments)
        -			);
        -			return DataTable.ext.internal[fn].apply( this, args );
        -		};
        -	}
        -	
        -	
        -	/**
        -	 * Reference to internal functions for use by plug-in developers. Note that
        -	 * these methods are references to internal functions and are considered to be
        -	 * private. If you use these methods, be aware that they are liable to change
        -	 * between versions.
        -	 *  @namespace
        -	 */
        -	$.extend( DataTable.ext.internal, {
        -		_fnExternApiFunc: _fnExternApiFunc,
        -		_fnBuildAjax: _fnBuildAjax,
        -		_fnAjaxUpdate: _fnAjaxUpdate,
        -		_fnAjaxParameters: _fnAjaxParameters,
        -		_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
        -		_fnAjaxDataSrc: _fnAjaxDataSrc,
        -		_fnAddColumn: _fnAddColumn,
        -		_fnColumnOptions: _fnColumnOptions,
        -		_fnAdjustColumnSizing: _fnAdjustColumnSizing,
        -		_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
        -		_fnColumnIndexToVisible: _fnColumnIndexToVisible,
        -		_fnVisbleColumns: _fnVisbleColumns,
        -		_fnGetColumns: _fnGetColumns,
        -		_fnColumnTypes: _fnColumnTypes,
        -		_fnApplyColumnDefs: _fnApplyColumnDefs,
        -		_fnHungarianMap: _fnHungarianMap,
        -		_fnCamelToHungarian: _fnCamelToHungarian,
        -		_fnLanguageCompat: _fnLanguageCompat,
        -		_fnBrowserDetect: _fnBrowserDetect,
        -		_fnAddData: _fnAddData,
        -		_fnAddTr: _fnAddTr,
        -		_fnNodeToDataIndex: _fnNodeToDataIndex,
        -		_fnNodeToColumnIndex: _fnNodeToColumnIndex,
        -		_fnGetCellData: _fnGetCellData,
        -		_fnSetCellData: _fnSetCellData,
        -		_fnSplitObjNotation: _fnSplitObjNotation,
        -		_fnGetObjectDataFn: _fnGetObjectDataFn,
        -		_fnSetObjectDataFn: _fnSetObjectDataFn,
        -		_fnGetDataMaster: _fnGetDataMaster,
        -		_fnClearTable: _fnClearTable,
        -		_fnDeleteIndex: _fnDeleteIndex,
        -		_fnInvalidate: _fnInvalidate,
        -		_fnGetRowElements: _fnGetRowElements,
        -		_fnCreateTr: _fnCreateTr,
        -		_fnBuildHead: _fnBuildHead,
        -		_fnDrawHead: _fnDrawHead,
        -		_fnDraw: _fnDraw,
        -		_fnReDraw: _fnReDraw,
        -		_fnAddOptionsHtml: _fnAddOptionsHtml,
        -		_fnDetectHeader: _fnDetectHeader,
        -		_fnGetUniqueThs: _fnGetUniqueThs,
        -		_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
        -		_fnFilterComplete: _fnFilterComplete,
        -		_fnFilterCustom: _fnFilterCustom,
        -		_fnFilterColumn: _fnFilterColumn,
        -		_fnFilter: _fnFilter,
        -		_fnFilterCreateSearch: _fnFilterCreateSearch,
        -		_fnEscapeRegex: _fnEscapeRegex,
        -		_fnFilterData: _fnFilterData,
        -		_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
        -		_fnUpdateInfo: _fnUpdateInfo,
        -		_fnInfoMacros: _fnInfoMacros,
        -		_fnInitialise: _fnInitialise,
        -		_fnInitComplete: _fnInitComplete,
        -		_fnLengthChange: _fnLengthChange,
        -		_fnFeatureHtmlLength: _fnFeatureHtmlLength,
        -		_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
        -		_fnPageChange: _fnPageChange,
        -		_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
        -		_fnProcessingDisplay: _fnProcessingDisplay,
        -		_fnFeatureHtmlTable: _fnFeatureHtmlTable,
        -		_fnScrollDraw: _fnScrollDraw,
        -		_fnApplyToChildren: _fnApplyToChildren,
        -		_fnCalculateColumnWidths: _fnCalculateColumnWidths,
        -		_fnThrottle: _fnThrottle,
        -		_fnConvertToWidth: _fnConvertToWidth,
        -		_fnScrollingWidthAdjust: _fnScrollingWidthAdjust,
        -		_fnGetWidestNode: _fnGetWidestNode,
        -		_fnGetMaxLenString: _fnGetMaxLenString,
        -		_fnStringToCss: _fnStringToCss,
        -		_fnScrollBarWidth: _fnScrollBarWidth,
        -		_fnSortFlatten: _fnSortFlatten,
        -		_fnSort: _fnSort,
        -		_fnSortAria: _fnSortAria,
        -		_fnSortListener: _fnSortListener,
        -		_fnSortAttachListener: _fnSortAttachListener,
        -		_fnSortingClasses: _fnSortingClasses,
        -		_fnSortData: _fnSortData,
        -		_fnSaveState: _fnSaveState,
        -		_fnLoadState: _fnLoadState,
        -		_fnSettingsFromNode: _fnSettingsFromNode,
        -		_fnLog: _fnLog,
        -		_fnMap: _fnMap,
        -		_fnBindAction: _fnBindAction,
        -		_fnCallbackReg: _fnCallbackReg,
        -		_fnCallbackFire: _fnCallbackFire,
        -		_fnLengthOverflow: _fnLengthOverflow,
        -		_fnRenderer: _fnRenderer,
        -		_fnDataSource: _fnDataSource,
        -		_fnRowAttributes: _fnRowAttributes,
        -		_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
        -		                                // in 1.10, so this dead-end function is
        -		                                // added to prevent errors
        -	} );
        -	
        -
        -	// jQuery access
        -	$.fn.dataTable = DataTable;
        -
        -	// Legacy aliases
        -	$.fn.dataTableSettings = DataTable.settings;
        -	$.fn.dataTableExt = DataTable.ext;
        -
        -	// With a capital `D` we return a DataTables API instance rather than a
        -	// jQuery object
        -	$.fn.DataTable = function ( opts ) {
        -		return $(this).dataTable( opts ).api();
        -	};
        -
        -	// All properties that are available to $.fn.dataTable should also be
        -	// available on $.fn.DataTable
        -	$.each( DataTable, function ( prop, val ) {
        -		$.fn.DataTable[ prop ] = val;
        -	} );
        -
        -
        -	// Information about events fired by DataTables - for documentation.
        -	/**
        -	 * Draw event, fired whenever the table is redrawn on the page, at the same
        -	 * point as fnDrawCallback. This may be useful for binding events or
        -	 * performing calculations when the table is altered at all.
        -	 *  @name DataTable#draw.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 */
        -
        -	/**
        -	 * Search event, fired when the searching applied to the table (using the
        -	 * built-in global search, or column filters) is altered.
        -	 *  @name DataTable#search.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 */
        -
        -	/**
        -	 * Page change event, fired when the paging of the table is altered.
        -	 *  @name DataTable#page.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 */
        -
        -	/**
        -	 * Order event, fired when the ordering applied to the table is altered.
        -	 *  @name DataTable#order.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 */
        -
        -	/**
        -	 * DataTables initialisation complete event, fired when the table is fully
        -	 * drawn, including Ajax data loaded, if Ajax data is required.
        -	 *  @name DataTable#init.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} oSettings DataTables settings object
        -	 *  @param {object} json The JSON object request from the server - only
        -	 *    present if client-side Ajax sourced data is used</li></ol>
        -	 */
        -
        -	/**
        -	 * State save event, fired when the table has changed state a new state save
        -	 * is required. This event allows modification of the state saving object
        -	 * prior to actually doing the save, including addition or other state
        -	 * properties (for plug-ins) or modification of a DataTables core property.
        -	 *  @name DataTable#stateSaveParams.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} oSettings DataTables settings object
        -	 *  @param {object} json The state information to be saved
        -	 */
        -
        -	/**
        -	 * State load event, fired when the table is loading state from the stored
        -	 * data, but prior to the settings object being modified by the saved state
        -	 * - allowing modification of the saved state is required or loading of
        -	 * state for a plug-in.
        -	 *  @name DataTable#stateLoadParams.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} oSettings DataTables settings object
        -	 *  @param {object} json The saved state information
        -	 */
        -
        -	/**
        -	 * State loaded event, fired when state has been loaded from stored data and
        -	 * the settings object has been modified by the loaded data.
        -	 *  @name DataTable#stateLoaded.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} oSettings DataTables settings object
        -	 *  @param {object} json The saved state information
        -	 */
        -
        -	/**
        -	 * Processing event, fired when DataTables is doing some kind of processing
        -	 * (be it, order, searcg or anything else). It can be used to indicate to
        -	 * the end user that there is something happening, or that something has
        -	 * finished.
        -	 *  @name DataTable#processing.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} oSettings DataTables settings object
        -	 *  @param {boolean} bShow Flag for if DataTables is doing processing or not
        -	 */
        -
        -	/**
        -	 * Ajax (XHR) event, fired whenever an Ajax request is completed from a
        -	 * request to made to the server for new data. This event is called before
        -	 * DataTables processed the returned data, so it can also be used to pre-
        -	 * process the data returned from the server, if needed.
        -	 *
        -	 * Note that this trigger is called in `fnServerData`, if you override
        -	 * `fnServerData` and which to use this event, you need to trigger it in you
        -	 * success function.
        -	 *  @name DataTable#xhr.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 *  @param {object} json JSON returned from the server
        -	 *
        -	 *  @example
        -	 *     // Use a custom property returned from the server in another DOM element
        -	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
        -	 *       $('#status').html( json.status );
        -	 *     } );
        -	 *
        -	 *  @example
        -	 *     // Pre-process the data returned from the server
        -	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
        -	 *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
        -	 *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
        -	 *       }
        -	 *       // Note no return - manipulate the data directly in the JSON object.
        -	 *     } );
        -	 */
        -
        -	/**
        -	 * Destroy event, fired when the DataTable is destroyed by calling fnDestroy
        -	 * or passing the bDestroy:true parameter in the initialisation object. This
        -	 * can be used to remove bound events, added DOM nodes, etc.
        -	 *  @name DataTable#destroy.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 */
        -
        -	/**
        -	 * Page length change event, fired when number of records to show on each
        -	 * page (the length) is changed.
        -	 *  @name DataTable#length.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 *  @param {integer} len New length
        -	 */
        -
        -	/**
        -	 * Column sizing has changed.
        -	 *  @name DataTable#column-sizing.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 */
        -
        -	/**
        -	 * Column visibility has changed.
        -	 *  @name DataTable#column-visibility.dt
        -	 *  @event
        -	 *  @param {event} e jQuery event object
        -	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
        -	 *  @param {int} column Column index
        -	 *  @param {bool} vis `false` if column now hidden, or `true` if visible
        -	 */
        -
        -	return $.fn.dataTable;
        -}));
        -
        -}(window, document));
        -
        diff --git a/resources/assets/js/plugins/datatables/jquery.dataTables.min.css b/resources/assets/js/plugins/datatables/jquery.dataTables.min.css
        deleted file mode 100755
        index 2edb32f7c7..0000000000
        --- a/resources/assets/js/plugins/datatables/jquery.dataTables.min.css
        +++ /dev/null
        @@ -1 +0,0 @@
        -table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}
        diff --git a/resources/assets/js/plugins/datatables/jquery.dataTables.min.js b/resources/assets/js/plugins/datatables/jquery.dataTables.min.js
        deleted file mode 100755
        index 85dd817e13..0000000000
        --- a/resources/assets/js/plugins/datatables/jquery.dataTables.min.js
        +++ /dev/null
        @@ -1,160 +0,0 @@
        -/*! DataTables 1.10.7
        - * ©2008-2015 SpryMedia Ltd - datatables.net/license
        - */
        -(function(Ea,Q,k){var P=function(h){function W(a){var b,c,e={};h.each(a,function(d){if((b=d.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=d.replace(b[0],b[2].toLowerCase()),e[c]=d,"o"===b[1]&&W(a[d])});a._hungarianMap=e}function H(a,b,c){a._hungarianMap||W(a);var e;h.each(b,function(d){e=a._hungarianMap[d];if(e!==k&&(c||b[e]===k))"o"===e.charAt(0)?(b[e]||(b[e]={}),h.extend(!0,b[e],b[d]),H(a[e],b[e],c)):b[e]=b[d]})}function P(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;
        -!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&E(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&E(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");
        -A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&H(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){var a=a.oBrowser,b=h("<div/>").css({position:"absolute",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",
        -top:1,left:1,width:100,overflow:"scroll"}).append(h('<div class="test"/>').css({width:"100%",height:10}))).appendTo("body"),c=b.find(".test");a.bScrollOversize=100===c[0].offsetWidth;a.bScrollbarLeft=1!==Math.round(c.offset().left);b.remove()}function hb(a,b,c,e,d,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;e!==d;)a.hasOwnProperty(e)&&(g=j?b(g,a[e],e,a):a[e],j=!0,e+=f);return g}function Fa(a,b){var c=m.defaults.column,e=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:Q.createElement("th"),sTitle:c.sTitle?
        -c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[e],mData:c.mData?c.mData:e,idx:e});a.aoColumns.push(c);c=a.aoPreSearchCols;c[e]=h.extend({},m.models.oSearch,c[e]);ka(a,e,h(b).data())}function ka(a,b,c){var b=a.aoColumns[b],e=a.oClasses,d=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=d.attr("width")||null;var f=(d.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),H(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&
        -(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),E(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),E(b,c,"aDataSort"));var g=b.mData,j=R(g),i=b.mRender?R(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var e=j(a,b,k,c);return i&&b?i(e,b,a,c):e};b.fnSetData=function(a,b,c){return S(g)(a,b,c)};"number"!==typeof g&&
        -(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,d.addClass(e.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=e.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=e.sSortableAsc,b.sSortingClassJUI=e.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=e.sSortableDesc,b.sSortingClassJUI=e.sSortJUIDescAllowed):(b.sSortingClass=e.sSortable,b.sSortingClassJUI=e.sSortJUI)}function X(a){if(!1!==a.oFeatures.bAutoWidth){var b=
        -a.aoColumns;Ga(a);for(var c=0,e=b.length;c<e;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&Y(a);w(a,null,"column-sizing",[a])}function la(a,b){var c=Z(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=Z(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function aa(a){return Z(a,"bVisible").length}function Z(a,b){var c=[];h.map(a.aoColumns,function(a,d){a[b]&&c.push(d)});return c}function Ha(a){var b=a.aoColumns,c=a.aoData,e=m.ext.type.detect,d,
        -f,g,j,i,h,l,q,n;d=0;for(f=b.length;d<f;d++)if(l=b[d],n=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=e.length;g<j;g++){i=0;for(h=c.length;i<h;i++){n[i]===k&&(n[i]=x(a,i,d,"type"));q=e[g](n[i],a);if(!q&&g!==e.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function ib(a,b,c,e){var d,f,g,j,i,o,l=a.aoColumns;if(b)for(d=b.length-1;0<=d;d--){o=b[d];var q=o.targets!==k?o.targets:o.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<
        -g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Fa(a);e(q[f],o)}else if("number"===typeof q[f]&&0>q[f])e(l.length+q[f],o);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&e(j,o)}}if(c){d=0;for(a=c.length;d<a;d++)e(d,c[d])}}function K(a,b,c,e){var d=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data"});f._aData=b;a.aoData.push(f);for(var b=a.aoColumns,f=0,g=b.length;f<g;f++)c&&Ia(a,d,f,x(a,d,f)),b[f].sType=null;a.aiDisplayMaster.push(d);
        -(c||!a.oFeatures.bDeferRender)&&Ja(a,d,c,e);return d}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,d){c=na(a,d);return K(a,c.data,d,c.cells)})}function x(a,b,c,e){var d=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,c=f.fnGetData(g,e,{settings:a,row:b,col:c});if(c===k)return a.iDrawError!=d&&null===j&&(I(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b,4),a.iDrawError=d),j;if((c===g||null===c)&&
        -null!==j)c=j;else if("function"===typeof c)return c.call(g);return null===c&&"display"==e?"":c}function Ia(a,b,c,e){a.aoColumns[c].fnSetData(a.aoData[b]._aData,e,{settings:a,row:b,col:c})}function Ka(a){return h.map(a.match(/(\\.|[^\.])+/g),function(a){return a.replace(/\\./g,".")})}function R(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=R(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,
        -c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=Ka(f);for(var i=0,h=j.length;i<h;i++){f=j[i].match(ba);g=j[i].match(T);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");i=0;for(h=a.length;i<h;i++)g.push(c(a[i],b,j));a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(T,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===
        -k)return k;a=a[j[i]]}}return a};return function(b,d){return c(b,d,a)}}return function(b){return b[a]}}function S(a){if(h.isPlainObject(a))return S(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,e,d){a(b,"set",e,d)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,e,d){var d=Ka(d),f;f=d[d.length-1];for(var g,j,i=0,h=d.length-1;i<h;i++){g=d[i].match(ba);j=d[i].match(T);if(g){d[i]=d[i].replace(ba,"");a[d[i]]=[];
        -f=d.slice();f.splice(0,i+1);g=f.join(".");j=0;for(h=e.length;j<h;j++)f={},b(f,e[j],g),a[d[i]].push(f);return}j&&(d[i]=d[i].replace(T,""),a=a[d[i]](e));if(null===a[d[i]]||a[d[i]]===k)a[d[i]]={};a=a[d[i]]}if(f.match(T))a[f.replace(T,"")](e);else a[f.replace(ba,"")]=e};return function(c,e){return b(c,e,a)}}return function(b,e){b[a]=e}}function La(a){return D(a.aoData,"_aData")}function oa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0}function pa(a,b,c){for(var e=-1,d=0,f=a.length;d<
        -f;d++)a[d]==b?e=d:a[d]>b&&a[d]--; -1!=e&&c===k&&a.splice(e,1)}function ca(a,b,c,e){var d=a.aoData[b],f,g=function(c,f){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=x(a,b,f,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===d.src)d._aData=na(a,d,e,e===k?k:d._aData).data;else{var j=d.anCells;if(j)if(e!==k)g(j[e],e);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}d._aSortData=null;d._aFilterData=null;g=a.aoColumns;if(e!==k)g[e].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;
        -Ma(d)}}function na(a,b,c,e){var d=[],f=b.firstChild,g,j=0,i,o=a.aoColumns,l=a._rowReadObject,e=e||l?{}:[],q=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),S(a)(e,b.getAttribute(c)))}},a=function(a){if(c===k||c===j)g=o[j],i=h.trim(a.innerHTML),g&&g._bAttrSrc?(S(g.mData._)(e,i),q(g.mData.sort,a),q(g.mData.type,a),q(g.mData.filter,a)):l?(g._setter||(g._setter=S(g.mData)),g._setter(e,i)):e[j]=i;j++};if(f)for(;f;){b=f.nodeName.toUpperCase();if("TD"==b||"TH"==b)a(f),
        -d.push(f);f=f.nextSibling}else{d=b.anCells;f=0;for(b=d.length;f<b;f++)a(d[f])}return{data:e,cells:d}}function Ja(a,b,c,e){var d=a.aoData[b],f=d._aData,g=[],j,i,h,l,q;if(null===d.nTr){j=c||Q.createElement("tr");d.nTr=j;d.anCells=g;j._DT_RowIndex=b;Ma(d);l=0;for(q=a.aoColumns.length;l<q;l++){h=a.aoColumns[l];i=c?e[l]:Q.createElement(h.sCellType);g.push(i);if(!c||h.mRender||h.mData!==l)i.innerHTML=x(a,b,l,"display");h.sClass&&(i.className+=" "+h.sClass);h.bVisible&&!c?j.appendChild(i):!h.bVisible&&c&&
        -i.parentNode.removeChild(i);h.fnCreatedCell&&h.fnCreatedCell.call(a.oInstance,i,x(a,b,l),f,b,l)}w(a,"aoRowCreatedCallback",null,[j,f,b])}d.nTr.setAttribute("role","row")}function Ma(a){var b=a.nTr,c=a._aData;if(b){c.DT_RowId&&(b.id=c.DT_RowId);if(c.DT_RowClass){var e=c.DT_RowClass.split(" ");a.__rowc=a.__rowc?Na(a.__rowc.concat(e)):e;h(b).removeClass(a.__rowc.join(" ")).addClass(c.DT_RowClass)}c.DT_RowAttr&&h(b).attr(c.DT_RowAttr);c.DT_RowData&&h(b).data(c.DT_RowData)}}function jb(a){var b,c,e,d,
        -f,g=a.nTHead,j=a.nTFoot,i=0===h("th, td",g).length,o=a.oClasses,l=a.aoColumns;i&&(d=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],e=h(f.nTh).addClass(f.sClass),i&&e.appendTo(d),a.oFeatures.bSort&&(e.addClass(f.sSortingClass),!1!==f.bSortable&&(e.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=e.html()&&e.html(f.sTitle),Pa(a,"header")(a,e,f,o);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(o.sHeaderTH);
        -h(j).find(">tr>th, >tr>td").addClass(o.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var e,d,f,g=[],j=[],i=a.aoColumns.length,o;if(b){c===k&&(c=!1);e=0;for(d=b.length;e<d;e++){g[e]=b[e].slice();g[e].nTr=b[e].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[e].splice(f,1);j.push([])}e=0;for(d=g.length;e<d;e++){if(a=g[e].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[e].length;f<b;f++)if(o=
        -i=1,j[e][f]===k){a.appendChild(g[e][f].cell);for(j[e][f]=1;g[e+i]!==k&&g[e][f].cell==g[e+i][f].cell;)j[e+i][f]=1,i++;for(;g[e][f+o]!==k&&g[e][f].cell==g[e][f+o].cell;){for(c=0;c<i;c++)j[e+c][f+o]=1;o++}h(g[e][f].cell).attr("rowspan",i).attr("colspan",o)}}}}function M(a){var b=w(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,e=a.asStripeClasses,d=e.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==B(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=
        -j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,o=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!kb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:o;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==d){var n=e[c%d];q._sRowStripe!=n&&(h(l).removeClass(q._sRowStripe).addClass(n),q._sRowStripe=n)}w(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,
        -1==a.iDraw&&"ajax"==B(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":d?e[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];w(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],La(a),g,o,i]);w(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],La(a),g,o,i]);e=h(a.nTBody);e.children().detach();e.append(h(b));w(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=
        -!1}}function N(a,b){var c=a.oFeatures,e=c.bFilter;c.bSort&&lb(a);e?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;M(a);a._drawHold=!1}function mb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),e=a.oFeatures,d=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=d[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,o,l,q,n=0;n<f.length;n++){g=
        -null;j=f[n];if("<"==j){i=h("<div/>")[0];o=f[n+1];if("'"==o||'"'==o){l="";for(q=2;f[n+q]!=o;)l+=f[n+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(o=l.split("."),i.id=o[0].substr(1,o[0].length-1),i.className=o[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;n+=q}d.append(i);d=h(i)}else if(">"==j)d=d.parent();else if("l"==j&&e.bPaginate&&e.bLengthChange)g=nb(a);else if("f"==j&&e.bFilter)g=ob(a);else if("r"==j&&e.bProcessing)g=pb(a);else if("t"==j)g=qb(a);else if("i"==
        -j&&e.bInfo)g=rb(a);else if("p"==j&&e.bPaginate)g=sb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(o=i.length;q<o;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),d.append(g))}c.replaceWith(d)}function da(a,b){var c=h(b).children("tr"),e,d,f,g,j,i,o,l,q,n;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){e=c[f];for(d=e.firstChild;d;){if("TD"==d.nodeName.toUpperCase()||"TH"==d.nodeName.toUpperCase()){l=
        -1*d.getAttribute("colspan");q=1*d.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;o=g;n=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][o+j]={cell:d,unique:n},a[f+g].nTr=e}d=d.nextSibling}}}function qa(a,b,c){var e=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,d=c.length;b<d;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!e[f]||!a.bSortCellsTop))e[f]=c[b][f].cell;return e}function ra(a,b,c){w(a,"aoServerParams","serverParams",[b]);
        -if(b&&h.isArray(b)){var e={},d=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(d);c?(c=c[0],e[c]||(e[c]=[]),e[c].push(b.value)):e[b.name]=b.value});b=e}var f,g=a.ajax,j=a.oInstance,i=function(b){w(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var o=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&o?o:h.extend(!0,b,o);delete g.data}o={data:b,success:function(b){var c=b.error||b.sError;c&&I(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,
        -c){var f=w(a,null,"xhr",[a,null,a.jqXHR]);-1===h.inArray(!0,f)&&("parsererror"==c?I(a,0,"Invalid JSON response",1):4===b.readyState&&I(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;w(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(o,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(o,g)),g.data=f)}function kb(a){return a.bAjaxDataGet?
        -(a.iDraw++,C(a,!0),ra(a,tb(a),function(b){ub(a,b)}),!1):!0}function tb(a){var b=a.aoColumns,c=b.length,e=a.oFeatures,d=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,o,l,q=U(a);g=a._iDisplayStart;i=!1!==e.bPaginate?a._iDisplayLength:-1;var n=function(a,b){j.push({name:a,value:b})};n("sEcho",a.iDraw);n("iColumns",c);n("sColumns",D(b,"sName").join(","));n("iDisplayStart",g);n("iDisplayLength",i);var k={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:d.sSearch,regex:d.bRegex}};for(g=
        -0;g<c;g++)o=b[g],l=f[g],i="function"==typeof o.mData?"function":o.mData,k.columns.push({data:i,name:o.sName,searchable:o.bSearchable,orderable:o.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),n("mDataProp_"+g,i),e.bFilter&&(n("sSearch_"+g,l.sSearch),n("bRegex_"+g,l.bRegex),n("bSearchable_"+g,o.bSearchable)),e.bSort&&n("bSortable_"+g,o.bSortable);e.bFilter&&(n("sSearch",d.sSearch),n("bRegex",d.bRegex));e.bSort&&(h.each(q,function(a,b){k.order.push({column:b.col,dir:b.dir});n("iSortCol_"+a,b.col);
        -n("sSortDir_"+a,b.dir)}),n("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:k:b?j:k}function ub(a,b){var c=sa(a,b),e=b.sEcho!==k?b.sEcho:b.draw,d=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(e){if(1*e<a.iDraw)return;a.iDraw=1*e}oa(a);a._iRecordsTotal=parseInt(d,10);a._iRecordsDisplay=parseInt(f,10);e=0;for(d=c.length;e<d;e++)K(a,c[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;
        -M(a);a._bInitComplete||ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?R(c)(b):b}function ob(a){var b=a.oClasses,c=a.sTableId,e=a.oLanguage,d=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=e.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),
        -f=function(){var b=!this.value?"":this.value;b!=d.sSearch&&(fa(a,{sSearch:b,bRegex:d.bRegex,bSmart:d.bSmart,bCaseInsensitive:d.bCaseInsensitive}),a._iDisplayStart=0,M(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===B(a)?400:0,i=h("input",b).val(d.sSearch).attr("placeholder",e.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==
        -Q.activeElement&&i.val(d.sSearch)}catch(f){}});return b[0]}function fa(a,b,c){var e=a.oPreviousSearch,d=a.aoPreSearchCols,f=function(a){e.sSearch=a.sSearch;e.bRegex=a.bRegex;e.bSmart=a.bSmart;e.bCaseInsensitive=a.bCaseInsensitive};Ha(a);if("ssp"!=B(a)){vb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<d.length;b++)wb(a,d[b].sSearch,b,d[b].bEscapeRegex!==k?!d[b].bEscapeRegex:d[b].bRegex,d[b].bSmart,d[b].bCaseInsensitive);xb(a)}else f(b);a.bFiltered=
        -!0;w(a,null,"search",[a])}function xb(a){for(var b=m.ext.search,c=a.aiDisplay,e,d,f=0,g=b.length;f<g;f++){for(var j=[],i=0,h=c.length;i<h;i++)d=c[i],e=a.aoData[d],b[f](a,e._aFilterData,d,e._aData,i)&&j.push(d);c.length=0;c.push.apply(c,j)}}function wb(a,b,c,e,d,f){if(""!==b)for(var g=a.aiDisplay,e=Qa(b,e,d,f),d=g.length-1;0<=d;d--)b=a.aoData[g[d]]._aFilterData[c],e.test(b)||g.splice(d,1)}function vb(a,b,c,e,d,f){var e=Qa(b,e,d,f),d=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&
        -(c=!0);g=yb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(g||c||d.length>b.length||0!==b.indexOf(d)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)e.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,e){a=b?a:va(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,e?"i":"")}function va(a){return a.replace(Yb,"\\$1")}
        -function yb(a){var b=a.aoColumns,c,e,d,f,g,j,i,h,l=m.ext.type.search;c=!1;e=0;for(f=a.aoData.length;e<f;e++)if(h=a.aoData[e],!h._aFilterData){j=[];d=0;for(g=b.length;d<g;d++)c=b[d],c.bSearchable?(i=x(a,e,d,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(wa.innerHTML=i,i=Zb?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join("  ");c=!0}return c}
        -function zb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Ab(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function rb(a){var b=a.sTableId,c=a.aanFeatures.i,e=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Bb,sName:"information"}),e.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return e[0]}function Bb(a){var b=
        -a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,e=a._iDisplayStart+1,d=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Cb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,e,d,f,g,j));h(b).html(j)}}function Cb(a,b){var c=a.fnFormatNumber,e=a._iDisplayStart+1,d=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===d;return b.replace(/_START_/g,c.call(a,e)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,
        -c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(e/d))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/d)))}function ga(a){var b,c,e=a.iInitDisplayStart,d=a.aoColumns,f;c=a.oFeatures;if(a.bInitialised){mb(a);jb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ga(a);b=0;for(c=d.length;b<c;b++)f=d[b],f.sWidth&&(f.nTh.style.width=s(f.sWidth));N(a);d=B(a);"ssp"!=d&&("ajax"==d?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)K(a,f[b]);
        -a.iInitDisplayStart=e;N(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a)))}else setTimeout(function(){ga(a)},200)}function ta(a,b){a._bInitComplete=!0;b&&X(a);w(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);w(a,null,"length",[a,c])}function nb(a){for(var b=a.oClasses,c=a.sTableId,e=a.aLengthMenu,d=h.isArray(e[0]),f=d?e[0]:e,e=d?e[1]:e,d=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)d[0][g]=new Option(e[g],
        -f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",d[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());M(a)});h(a.nTable).bind("length.dt.DT",function(b,c,f){a===c&&h("select",i).val(f)});return i[0]}function sb(a){var b=a.sPaginationType,c=m.ext.pager[b],e="function"===typeof c,d=function(a){M(a)},b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],
        -f=a.aanFeatures;e||c.fnInit(a,b,d);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(e){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),q,l=0;for(q=f.p.length;l<q;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,d)},sName:"pagination"}));return b}function Ta(a,b,c){var e=a._iDisplayStart,d=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===d?e=0:"number"===typeof b?(e=b*d,e>f&&(e=0)):
        -"first"==b?e=0:"previous"==b?(e=0<=d?e-d:0,0>e&&(e=0)):"next"==b?e+d<f&&(e+=d):"last"==b?e=Math.floor((f-1)/d)*d:I(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==e;a._iDisplayStart=e;b&&(w(a,null,"page",[a]),c&&M(a));return b}function pb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");w(a,
        -null,"processing",[a,b])}function qb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var e=c.sX,d=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),o=h(b[0].cloneNode(!1)),l=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");l.length||(l=null);c=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,
        -width:e?!e?null:s(e):"100%"}).append(h("<div/>",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({overflow:"auto",height:!d?null:s(d),width:!e?null:s(e)}).append(b));l&&c.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:e?!e?null:s(e):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(o.removeAttr("id").css("margin-left",
        -0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=c.children(),q=b[0],f=b[1],n=l?b[2]:null;if(e)h(f).on("scroll.DT",function(){var a=this.scrollLeft;q.scrollLeft=a;l&&(n.scrollLeft=a)});a.nScrollHead=q;a.nScrollBody=f;a.nScrollFoot=n;a.aoDrawCallback.push({fn:Y,sName:"scrolling"});return c[0]}function Y(a){var b=a.oScroll,c=b.sX,e=b.sXInner,d=b.sY,f=b.iBarWidth,g=h(a.nScrollHead),j=g[0].style,i=g.children("div"),o=i[0].style,l=i.children("table"),i=a.nScrollBody,q=h(i),n=i.style,
        -k=h(a.nScrollFoot).children("div"),p=k.children("table"),m=h(a.nTHead),r=h(a.nTable),t=r[0],O=t.style,L=a.nTFoot?h(a.nTFoot):null,ha=a.oBrowser,w=ha.bScrollOversize,v,u,y,x,z,A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};r.children("thead, tfoot").remove();z=m.clone().prependTo(r);v=m.find("tr");y=z.find("tr");z.find("th, td").removeAttr("tabindex");L&&(x=L.clone().prependTo(r),u=L.find("tr"),x=x.find("tr"));
        -c||(n.width="100%",g[0].style.width="100%");h.each(qa(a,z),function(b,c){D=la(a,b);c.style.width=a.aoColumns[D].sWidth});L&&G(function(a){a.style.width=""},x);b.bCollapse&&""!==d&&(n.height=q[0].offsetHeight+m[0].offsetHeight+"px");g=r.outerWidth();if(""===c){if(O.width="100%",w&&(r.find("tbody").height()>i.offsetHeight||"scroll"==q.css("overflow-y")))O.width=s(r.outerWidth()-f)}else""!==e?O.width=s(e):g==q.width()&&q.height()<r.height()?(O.width=s(g-f),r.outerWidth()>g-f&&(O.width=s(g))):O.width=
        -s(g);g=r.outerWidth();G(E,y);G(function(a){C.push(a.innerHTML);A.push(s(h(a).css("width")))},y);G(function(a,b){a.style.width=A[b]},v);h(y).height(0);L&&(G(E,x),G(function(a){B.push(s(h(a).css("width")))},x),G(function(a,b){a.style.width=B[b]},u),h(x).height(0));G(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+C[b]+"</div>";a.style.width=A[b]},y);L&&G(function(a,b){a.innerHTML="";a.style.width=B[b]},x);if(r.outerWidth()<g){u=i.scrollHeight>i.offsetHeight||
        -"scroll"==q.css("overflow-y")?g+f:g;if(w&&(i.scrollHeight>i.offsetHeight||"scroll"==q.css("overflow-y")))O.width=s(u-f);(""===c||""!==e)&&I(a,1,"Possible column misalignment",6)}else u="100%";n.width=s(u);j.width=s(u);L&&(a.nScrollFoot.style.width=s(u));!d&&w&&(n.height=s(t.offsetHeight+f));d&&b.bCollapse&&(n.height=s(d),b=c&&t.offsetWidth>i.offsetWidth?f:0,t.offsetHeight<i.offsetHeight&&(n.height=s(t.offsetHeight+b)));b=r.outerWidth();l[0].style.width=s(b);o.width=s(b);l=r.height()>i.clientHeight||
        -"scroll"==q.css("overflow-y");ha="padding"+(ha.bScrollbarLeft?"Left":"Right");o[ha]=l?f+"px":"0px";L&&(p[0].style.width=s(b),k[0].style.width=s(b),k[0].style[ha]=l?f+"px":"0px");q.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)i.scrollTop=0}function G(a,b,c){for(var e=0,d=0,f=b.length,g,j;d<f;){g=b[d].firstChild;for(j=c?c[d].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,e):a(g,e),e++),g=g.nextSibling,j=c?j.nextSibling:null;d++}}function Ga(a){var b=a.nTable,c=a.aoColumns,e=a.oScroll,d=e.sY,f=e.sX,
        -g=e.sXInner,j=c.length,e=Z(a,"bVisible"),i=h("th",a.nTHead),o=b.getAttribute("width"),l=b.parentNode,k=!1,n,m;(n=b.style.width)&&-1!==n.indexOf("%")&&(o=n);for(n=0;n<e.length;n++)m=c[e[n]],null!==m.sWidth&&(m.sWidth=Db(m.sWidthOrig,l),k=!0);if(!k&&!f&&!d&&j==aa(a)&&j==i.length)for(n=0;n<j;n++)c[n].sWidth=s(i.eq(n).width());else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var p=h("<tr/>").appendTo(j.find("tbody"));j.find("tfoot th, tfoot td").css("width",
        -"");i=qa(a,j.find("thead")[0]);for(n=0;n<e.length;n++)m=c[e[n]],i[n].style.width=null!==m.sWidthOrig&&""!==m.sWidthOrig?s(m.sWidthOrig):"";if(a.aoData.length)for(n=0;n<e.length;n++)k=e[n],m=c[k],h(Eb(a,k)).clone(!1).append(m.sContentPadding).appendTo(p);j.appendTo(l);f&&g?j.width(g):f?(j.css("width","auto"),j.width()<l.offsetWidth&&j.width(l.offsetWidth)):d?j.width(l.offsetWidth):o&&j.width(o);Fb(a,j[0]);if(f){for(n=g=0;n<e.length;n++)m=c[e[n]],d=h(i[n]).outerWidth(),g+=null===m.sWidthOrig?d:parseInt(m.sWidth,
        -10)+d-h(i[n]).width();j.width(s(g));b.style.width=s(g)}for(n=0;n<e.length;n++)if(m=c[e[n]],d=h(i[n]).width())m.sWidth=s(d);b.style.width=s(j.css("width"));j.remove()}o&&(b.style.width=s(o));if((o||f)&&!a._reszEvt)b=function(){h(Ea).bind("resize.DT-"+a.sInstance,ua(function(){X(a)}))},a.oBrowser.bScrollOversize?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,e,d;return function(){var b=this,g=+new Date,j=arguments;e&&g<e+c?(clearTimeout(d),d=setTimeout(function(){e=k;a.apply(b,
        -j)},c)):(e=g,a.apply(b,j))}}function Db(a,b){if(!a)return 0;var c=h("<div/>").css("width",s(a)).appendTo(b||Q.body),e=c[0].offsetWidth;c.remove();return e}function Fb(a,b){var c=a.oScroll;if(c.sX||c.sY)c=!c.sX?c.iBarWidth:0,b.style.width=s(h(b).outerWidth()-c)}function Eb(a,b){var c=Gb(a,b);if(0>c)return null;var e=a.aoData[c];return!e.nTr?h("<td/>").html(x(a,c,b,"display"))[0]:e.anCells[b]}function Gb(a,b){for(var c,e=-1,d=-1,f=0,g=a.aoData.length;f<g;f++)c=x(a,f,b,"display")+"",c=c.replace($b,""),
        -c.length>e&&(e=c.length,d=f);return d}function s(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Hb(){var a=m.__scrollbarWidth;if(a===k){var b=h("<p/>").css({position:"absolute",top:0,left:0,width:"100%",height:150,padding:0,overflow:"scroll",visibility:"hidden"}).appendTo("body"),a=b[0].offsetWidth-b[0].clientWidth;m.__scrollbarWidth=a;b.remove()}return a}function U(a){var b,c,e=[],d=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var o=[];
        -f=function(a){a.length&&!h.isArray(a[0])?o.push(a):o.push.apply(o,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<o.length;a++){i=o[a][0];f=d[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=d[g].sType||"string",o[a]._idx===k&&(o[a]._idx=h.inArray(o[a][1],d[g].asSorting)),e.push({src:i,col:g,dir:o[a][1],index:o[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return e}function lb(a){var b,c,e=[],d=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;
        -Ha(a);h=U(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,j.col);if("ssp"!=B(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)e[i[b]]=b;g===h.length?i.sort(function(a,b){var c,d,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=k[j.col],d=m[j.col],c=c<d?-1:c>d?1:0,0!==c)return"asc"===j.dir?c:-c;c=e[a];d=e[b];return c<d?-1:c>d?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,r=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=r[i.col],i=d[i.type+
        -"-"+i.dir]||d["string-"+i.dir],c=i(c,g),0!==c)return c;c=e[a];g=e[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,e=a.aoColumns,d=U(a),a=a.oLanguage.oAria,f=0,g=e.length;f<g;f++){c=e[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<d.length&&d[0].col==f?(i.setAttribute("aria-sort","asc"==d[0].dir?"ascending":"descending"),c=j[d[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",
        -b)}}function Ua(a,b,c,e){var d=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof d[0]&&(d=a.aaSorting=[d]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,D(d,"0")),-1!==c?(b=g(d[c],!0),null===b&&1===d.length&&(b=0),null===b?d.splice(c,1):(d[c][1]=f[b],d[c]._idx=b)):(d.push([b,f[0],0]),d[d.length-1]._idx=0)):d.length&&d[0][0]==b?(b=g(d[0]),d.length=1,d[0][1]=f[b],d[0]._idx=b):(d.length=0,d.push([b,f[0]]),d[0]._idx=
        -0);N(a);"function"==typeof e&&e(a)}function Oa(a,b,c,e){var d=a.aoColumns[c];Va(b,{},function(b){!1!==d.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Ua(a,c,b.shiftKey,e);"ssp"!==B(a)&&C(a,!1)},0)):Ua(a,c,b.shiftKey,e))})}function xa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,e=U(a),d=a.oFeatures,f,g;if(d.bSort&&d.bSortClasses){d=0;for(f=b.length;d<f;d++)g=b[d].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>d?d+1:3));d=0;for(f=e.length;d<f;d++)g=e[d].src,h(D(a.aoData,"anCells",
        -g)).addClass(c+(2>d?d+1:3))}a.aLastSort=e}function Ib(a,b){var c=a.aoColumns[b],e=m.ext.order[c.sSortDataType],d;e&&(d=e.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||e)f=e?d[j]:x(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ya(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),
        -search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,e){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[e])}})};w(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,e=a.aoColumns;if(a.oFeatures.bStateSave){var d=a.fnStateLoadCallback.call(a.oInstance,a);if(d&&d.time&&(b=w(a,"aoStateLoadParams","stateLoadParams",[a,d]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&d.time<+new Date-1E3*b)&&e.length===
        -d.columns.length))){a.oLoadedState=h.extend(!0,{},d);d.start!==k&&(a._iDisplayStart=d.start,a.iInitDisplayStart=d.start);d.length!==k&&(a._iDisplayLength=d.length);d.order!==k&&(a.aaSorting=[],h.each(d.order,function(b,c){a.aaSorting.push(c[0]>=e.length?[0,c[1]]:c)}));d.search!==k&&h.extend(a.oPreviousSearch,Ab(d.search));b=0;for(c=d.columns.length;b<c;b++){var f=d.columns[b];f.visible!==k&&(e[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Ab(f.search))}w(a,"aoStateLoaded","stateLoaded",
        -[a,d])}}}function za(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function I(a,b,c,e){c="DataTables warning: "+(null!==a?"table id="+a.sTableId+" - ":"")+c;e&&(c+=". For more information about this error, please see http://datatables.net/tn/"+e);if(b)Ea.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,w(a,null,"error",[a,e,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,e,c)}}function E(a,b,c,e){h.isArray(c)?
        -h.each(c,function(c,f){h.isArray(f)?E(a,b,f[0],f[1]):E(a,b,f)}):(e===k&&(e=c),b[c]!==k&&(a[e]=b[c]))}function Lb(a,b,c){var e,d;for(d in b)b.hasOwnProperty(d)&&(e=b[d],h.isPlainObject(e)?(h.isPlainObject(a[d])||(a[d]={}),h.extend(!0,a[d],e)):a[d]=c&&"data"!==d&&"aaData"!==d&&h.isArray(e)?e.slice():e);return a}function Va(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,
        -b,c,e){c&&a[b].push({fn:c,sName:e})}function w(a,b,c,e){var d=[];b&&(d=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,e)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,e),d.push(b.result));return d}function Sa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),e=a._iDisplayLength;b>=c&&(b=c-e);b-=b%e;if(-1===e||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,e=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?e[c[b]]||e._:"string"===typeof c?e[c]||e._:e._}function B(a){return a.oFeatures.bServerSide?
        -"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Wa(a,b){var c=[],c=Mb.numbers_length,e=Math.floor(c/2);b<=c?c=V(0,b):a<=e?(c=V(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-e?c=V(b-(c-2),b):(c=V(a-e+2,a+e-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Aa(b,a)},"num-fmt":function(b){return Aa(b,a,Xa)},"html-num":function(b){return Aa(b,a,Ba)},"html-num-fmt":function(b){return Aa(b,a,Ba,Xa)}},function(b,
        -c){u.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(u.type.search[b+a]=u.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,u,t,r,v,Ya={},Ob=/[\r\n]/g,Ba=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Xa=/[',$\u00a3\u20ac\u00a5%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,J=function(a){return!a||!0===a||
        -"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var e="string"===typeof a;if(J(a))return!0;b&&e&&(a=Qb(a,b));c&&e&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return J(a)?!0:!(J(a)||"string"===typeof a)?null:Za(a.replace(Ba,""),b,c)?!0:null},D=function(a,b,c){var e=[],d=0,f=a.length;
        -if(c!==k)for(;d<f;d++)a[d]&&a[d][b]&&e.push(a[d][b][c]);else for(;d<f;d++)a[d]&&e.push(a[d][b]);return e},ia=function(a,b,c,e){var d=[],f=0,g=b.length;if(e!==k)for(;f<g;f++)a[b[f]][c]&&d.push(a[b[f]][c][e]);else for(;f<g;f++)d.push(a[b[f]][c]);return d},V=function(a,b){var c=[],e;b===k?(b=0,e=a):(e=b,b=a);for(var d=b;d<e;d++)c.push(d);return c},Sb=function(a){for(var b=[],c=0,e=a.length;c<e;c++)a[c]&&b.push(a[c]);return b},Na=function(a){var b=[],c,e,d=a.length,f,g=0;e=0;a:for(;e<d;e++){c=a[e];for(f=
        -0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,T=/\(\)$/,wa=h("<div>")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(za(this[u.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),e=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===
        -k||b)&&c.draw();return e.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],e=c.oScroll;a===k||a?b.draw(!1):(""!==e.sX||""!==e.sY)&&Y(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var e=this.api(!0),a=e.rows(a),d=a.settings()[0],h=d.aoData[a[0][0]];a.remove();b&&b.call(this,d,h);(c===k||c)&&e.draw();return h};
        -this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,e,d,h){d=this.api(!0);null===b||b===k?d.search(a,c,e,h):d.column(b).search(a,c,e,h);d.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var e=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==e||"th"==e?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};
        -this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===
        -k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return za(this[u.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,e,d){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(d===k||d)&&h.columns.adjust();(e===k||e)&&h.draw();return 0};this.fnVersionCheck=u.fnVersionCheck;var b=this,c=a===k,e=this.length;c&&(a={});this.oApi=this.internal=u.internal;for(var d in m.ext.internal)d&&
        -(this[d]=Nb(d));this.each(function(){var d={},d=1<e?Lb(d,a,!0):a,g=0,j,i=this.getAttribute("id"),o=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())I(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);H(l,l,!0);H(l.column,l.column,!0);H(l,h.extend(d,q.data()));var n=m.settings,g=0;for(j=n.length;g<j;g++){var r=n[g];if(r.nTable==this||r.nTHead.parentNode==this||r.nTFoot&&r.nTFoot.parentNode==this){g=d.bRetrieve!==k?d.bRetrieve:l.bRetrieve;if(c||g)return r.oInstance;
        -if(d.bDestroy!==k?d.bDestroy:l.bDestroy){r.oInstance.fnDestroy();break}else{I(r,0,"Cannot reinitialise DataTable",3);return}}if(r.sTableId==this.id){n.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var p=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});p.nTable=this;p.oApi=b.internal;p.oInit=d;n.push(p);p.oInstance=1===b.length?b:q.dataTable();eb(d);d.oLanguage&&P(d.oLanguage);d.aLengthMenu&&!d.iDisplayLength&&(d.iDisplayLength=
        -h.isArray(d.aLengthMenu[0])?d.aLengthMenu[0][0]:d.aLengthMenu[0]);d=Lb(h.extend(!0,{},l),d);E(p.oFeatures,d,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));E(p,d,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback",
        -"renderer","searchDelay",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);E(p.oScroll,d,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);E(p.oLanguage,d,"fnInfoCallback");z(p,"aoDrawCallback",d.fnDrawCallback,"user");z(p,"aoServerParams",d.fnServerParams,"user");z(p,"aoStateSaveParams",d.fnStateSaveParams,"user");z(p,"aoStateLoadParams",
        -d.fnStateLoadParams,"user");z(p,"aoStateLoaded",d.fnStateLoaded,"user");z(p,"aoRowCallback",d.fnRowCallback,"user");z(p,"aoRowCreatedCallback",d.fnCreatedRow,"user");z(p,"aoHeaderCallback",d.fnHeaderCallback,"user");z(p,"aoFooterCallback",d.fnFooterCallback,"user");z(p,"aoInitComplete",d.fnInitComplete,"user");z(p,"aoPreDrawCallback",d.fnPreDrawCallback,"user");i=p.oClasses;d.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,d.oClasses),d.sDom===l.sDom&&"lfrtip"===l.sDom&&(p.sDom='<"H"lfr>t<"F"ip>'),p.renderer)?
        -h.isPlainObject(p.renderer)&&!p.renderer.header&&(p.renderer.header="jqueryui"):p.renderer="jqueryui":h.extend(i,m.ext.classes,d.oClasses);q.addClass(i.sTable);if(""!==p.oScroll.sX||""!==p.oScroll.sY)p.oScroll.iBarWidth=Hb();!0===p.oScroll.sX&&(p.oScroll.sX="100%");p.iInitDisplayStart===k&&(p.iInitDisplayStart=d.iDisplayStart,p._iDisplayStart=d.iDisplayStart);null!==d.iDeferLoading&&(p.bDeferLoading=!0,g=h.isArray(d.iDeferLoading),p._iRecordsDisplay=g?d.iDeferLoading[0]:d.iDeferLoading,p._iRecordsTotal=
        -g?d.iDeferLoading[1]:d.iDeferLoading);var t=p.oLanguage;h.extend(!0,t,d.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){P(a);H(l.oLanguage,a);h.extend(true,t,a);ga(p)},error:function(){ga(p)}}),o=!0);null===d.asStripeClasses&&(p.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=p.asStripeClasses,s=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return s.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),p.asDestroyStripes=g.slice());
        -n=[];g=this.getElementsByTagName("thead");0!==g.length&&(da(p.aoHeader,g[0]),n=qa(p));if(null===d.aoColumns){r=[];g=0;for(j=n.length;g<j;g++)r.push(null)}else r=d.aoColumns;g=0;for(j=r.length;g<j;g++)Fa(p,n?n[g]:null);ib(p,d.aoColumnDefs,r,function(a,b){ka(p,a,b)});if(s.length){var u=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h.each(na(p,s[0]).cells,function(a,b){var c=p.aoColumns[a];if(c.mData===a){var d=u(b,"sort")||u(b,"order"),e=u(b,"filter")||u(b,"search");if(d!==null||e!==
        -null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};ka(p,a)}}})}var v=p.oFeatures;d.bStateSave&&(v.bStateSave=!0,Kb(p,d),z(p,"aoDrawCallback",ya,"state_save"));if(d.aaSorting===k){n=p.aaSorting;g=0;for(j=n.length;g<j;g++)n[g][1]=p.aoColumns[g].asSorting[0]}xa(p);v.bSort&&z(p,"aoDrawCallback",function(){if(p.bSorted){var a=U(p),b={};h.each(a,function(a,c){b[c.src]=c.dir});w(p,null,"order",[p,a,b]);Jb(p)}});z(p,"aoDrawCallback",
        -function(){(p.bSorted||B(p)==="ssp"||v.bDeferRender)&&xa(p)},"sc");gb(p);g=q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));p.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));p.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==p.oScroll.sX||""!==p.oScroll.sY))j=h("<tfoot/>").appendTo(this);0===j.length||0===j.children().length?q.addClass(i.sNoFooter):
        -0<j.length&&(p.nTFoot=j[0],da(p.aoFooter,p.nTFoot));if(d.aaData)for(g=0;g<d.aaData.length;g++)K(p,d.aaData[g]);else(p.bDeferLoading||"dom"==B(p))&&ma(p,h(p.nTBody).children("tr"));p.aiDisplay=p.aiDisplayMaster.slice();p.bInitialised=!0;!1===o&&ga(p)}});b=null;return this};var Tb=[],y=Array.prototype,cc=function(a){var b,c,e=m.settings,d=h.map(e,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,d),-1!==b?[e[b]]:
        -null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,d);return-1!==b?e[b]:null}).toArray()};t=function(a,b){if(!(this instanceof t))return new t(a,b);var c=[],e=function(a){(a=cc(a))&&c.push.apply(c,a)};if(h.isArray(a))for(var d=0,f=a.length;d<f;d++)e(a[d]);else e(a);this.context=Na(c);b&&this.push.apply(this,b.toArray?b.toArray():b);this.selector={rows:null,cols:null,opts:null};
        -t.extend(this,this,Tb)};m.Api=t;t.prototype={any:function(){return 0!==this.flatten().length},concat:y.concat,context:[],each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(y.filter)b=y.filter.call(this,a,this);else for(var c=0,e=this.length;c<e;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new t(this.context,b)},flatten:function(){var a=[];
        -return new t(this.context,a.concat.apply(a,this.toArray()))},join:y.join,indexOf:y.indexOf||function(a,b){for(var c=b||0,e=this.length;c<e;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,e){var d=[],f,g,h,i,o,l=this.context,q,n,m=this.selector;"string"===typeof a&&(e=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var p=new t(l[g]);if("table"===b)f=c.call(p,l[g],g),f!==k&&d.push(f);else if("columns"===b||"rows"===b)f=c.call(p,l[g],this[g],g),f!==k&&d.push(f);else if("column"===b||"column-rows"===
        -b||"row"===b||"cell"===b){n=this[g];"column-rows"===b&&(q=Ca(l[g],m.opts));i=0;for(o=n.length;i<o;i++)f=n[i],f="cell"===b?c.call(p,l[g],f.row,f.column,g,i):c.call(p,l[g],f,g,i,q),f!==k&&d.push(f)}}return d.length||e?(a=new t(l,a?d.concat.apply([],d):d),b=a.selector,b.rows=m.rows,b.cols=m.cols,b.opts=m.opts,a):this},lastIndexOf:y.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(y.map)b=y.map.call(this,a,this);else for(var c=
        -0,e=this.length;c<e;c++)b.push(a.call(this,this[c],c));return new t(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:y.pop,push:y.push,reduce:y.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:y.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:y.reverse,selector:null,shift:y.shift,sort:y.sort,splice:y.splice,toArray:function(){return y.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},
        -unique:function(){return new t(this.context,Na(this))},unshift:y.unshift};t.extend=function(a,b,c){if(c.length&&b&&(b instanceof t||b.__dt_wrapper)){var e,d,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);t.extend(d,d,c.methodExt);return d}};e=0;for(d=c.length;e<d;e++)f=c[e],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,t.extend(a,b[f.name],f.propExt)}};t.register=r=function(a,b){if(h.isArray(a))for(var c=0,e=a.length;c<
        -e;c++)t.register(a[c],b);else for(var d=a.split("."),f=Tb,g,j,c=0,e=d.length;c<e;c++){g=(j=-1!==d[c].indexOf("()"))?d[c].replace("()",""):d[c];var i;a:{i=0;for(var o=f.length;i<o;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===e-1?i.val=b:f=j?i.methodExt:i.propExt}};t.registerPlural=v=function(a,b,c){t.register(a,c);t.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof t?a.length?h.isArray(a[0])?new t(a.context,
        -a[0]):a[0]:k:a})};r("tables()",function(a){var b;if(a){b=t;var c=this.context;if("number"===typeof a)a=[c[a]];else var e=h.map(c,function(a){return a.nTable}),a=h(e).filter(a).map(function(){var a=h.inArray(this,e);return c[a]}).toArray();b=new b(a)}else b=this;return b});r("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new t(b[0]):a});v("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});v("tables().body()","table().body()",
        -function(){return this.iterator("table",function(a){return a.nTBody},1)});v("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});v("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});v("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});r("draw()",function(a){return this.iterator("table",function(b){N(b,
        -!1===a)})});r("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});r("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a._iDisplayLength,e=a.fnRecordsDisplay(),d=-1===c;return{page:d?0:Math.floor(b/c),pages:d?1:Math.ceil(e/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:e}});r("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:
        -k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var e=new t(a);e.one("draw",function(){c(e.ajax.json())})}"ssp"==B(a)?N(a,b):(C(a,!0),ra(a,[],function(c){oa(a);for(var c=sa(a,c),e=0,g=c.length;e<g;e++)K(a,c[e]);N(a,b);C(a,!1)}))};r("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});r("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});r("ajax.reload()",function(a,b){return this.iterator("table",function(c){Ub(c,
        -!1===b,a)})});r("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});r("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});var $a=function(a,b,c,e,d){var f=[],g,j,i,o,l,q;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(o=b.length;i<o;i++){j=
        -b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(q=j.length;l<q;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&f.push.apply(f,g)}a=u.selector[a];if(a.length){i=0;for(o=a.length;i<o;i++)f=a[i](e,d,f)}return f},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},
        -Ca=function(a,b){var c,e,d,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;e=b.order;d=b.page;if("ssp"==B(a))return"removed"===j?[]:V(0,c.length);if("current"==d){c=a._iDisplayStart;for(e=a.fnDisplayEnd();c<e;c++)f.push(g[c])}else if("current"==e||"applied"==e)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==e||"original"==e){c=0;for(e=a.aoData.length;c<e;c++)"none"==j?f.push(c):(d=h.inArray(c,g),(-1===d&&"removed"==j||0<=d&&
        -"applied"==j)&&f.push(c))}return f};r("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var d=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!d)return[b];var j=Ca(c,d);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j,function(b){var d=c.aoData[b];return a(b,d._aData,d.nTr)?b:null});b=Sb(ia(c.aoData,j,"nTr"));return a.nodeName&&h.inArray(a,b)!==-1?[a._DT_RowIndex]:h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},
        -c,d)},1);c.selector.rows=a;c.selector.opts=b;return c});r("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});r("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ia(a.aoData,b,"_aData")},1)});v("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var e=b.aoData[c];return"search"===a?e._aFilterData:e._aSortData},1)});v("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",
        -function(b,c){ca(b,c,a)})});v("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});v("rows().remove()","row().remove()",function(){var a=this;return this.iterator("row",function(b,c,e){var d=b.aoData;d.splice(c,1);for(var f=0,g=d.length;f<g;f++)null!==d[f].nTr&&(d[f].nTr._DT_RowIndex=f);h.inArray(c,b.aiDisplay);pa(b.aiDisplayMaster,c);pa(b.aiDisplay,c);pa(a[e],c,!1);Sa(b)})});r("rows.add()",function(a){var b=this.iterator("table",function(b){var c,
        -f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(K(b,c));return h},1),c=this.rows(-1);c.pop();c.push.apply(c,b.toArray());return c});r("row()",function(a,b){return bb(this.rows(a,b))});r("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});r("row().node()",function(){var a=this.context;return a.length&&this.length?
        -a[0].aoData[this[0]].nTr||null:null});r("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:K(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;c.length&&(c=c[0].aoData[b!==k?b:a[0]],c._details&&(c._details.remove(),c._detailsShow=k,c._details=k))},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var e=c[0].aoData[a[0]];if(e._details){(e._detailsShow=b)?e._details.insertAfter(e.nTr):
        -e._details.detach();var d=c[0],f=new t(d),g=d.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){d===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(d===b)for(var c,e=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",e)}),f.on("destroy.dt.DT_details",
        -function(a,b){if(d===b)for(var c=0,e=g.length;c<e;c++)g[c]._details&&cb(f,c)}))}}};r("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)cb(this);else if(c.length&&this.length){var e=c[0],c=c[0].aoData[this[0]],d=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?d.push(a):(c=h("<tr><td/></tr>").addClass(b),
        -h("td",c).addClass(b).html(a)[0].colSpan=aa(e),d.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(d);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});r(["row().child.show()","row().child().show()"],function(){Vb(this,!0);return this});r(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});r(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});r("row().child.isShown()",function(){var a=this.context;return a.length&&
        -this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var dc=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,e,d){for(var c=[],e=0,f=d.length;e<f;e++)c.push(x(a,d[e],b));return c};r("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var d=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return $a("column",d,function(a){var b=Pb(a);if(a==="")return V(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var d=Ca(c,
        -f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,d),i[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[la(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null})}else return h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray()},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});v("columns().header()",
        -"column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});v("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});v("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});v("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});v("columns().cache()","column().cache()",
        -function(a){return this.iterator("column-rows",function(b,c,e,d,f){return ia(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});v("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,e,d){return ia(a.aoData,d,"anCells",b)},1)});v("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,e){if(a===k)return c.aoColumns[e].bVisible;var d=c.aoColumns,f=d[e],g=c.aoData,j,i,m;if(a!==k&&f.bVisible!==a){if(a){var l=
        -h.inArray(!0,D(d,"bVisible"),e+1);j=0;for(i=g.length;j<i;j++)m=g[j].nTr,d=g[j].anCells,m&&m.insertBefore(d[e],d[l]||null)}else h(D(c.aoData,"anCells",e)).detach();f.bVisible=a;ea(c,c.aoHeader);ea(c,c.aoFooter);if(b===k||b)X(c),(c.oScroll.sX||c.oScroll.sY)&&Y(c);w(c,null,"column-visibility",[c,e,a]);ya(c)}})});v("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});r("columns.adjust()",function(){return this.iterator("table",
        -function(a){X(a)},1)});r("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return la(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});r("column()",function(a,b){return bb(this.columns(a,b))});r("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=ab(c),f=b.aoData,g=Ca(b,e),i=Sb(ia(f,g,"anCells")),
        -j=h([].concat.apply([],i)),l,m=b.aoColumns.length,o,r,t,s,u,v;return $a("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){o=[];r=0;for(t=g.length;r<t;r++){l=g[r];for(s=0;s<m;s++){u={row:l,column:s};if(c){v=b.aoData[l];a(u,x(b,l,s),v.anCells?v.anCells[s]:null)&&o.push(u)}else o.push(u)}}return o}return h.isPlainObject(a)?[a]:j.filter(a).map(function(a,b){l=b.parentNode._DT_RowIndex;return{row:l,column:h.inArray(b,f[l].anCells)}}).toArray()},b,e)});var e=this.columns(b,c),d=this.rows(a,
        -c),f,g,j,i,m,l=this.iterator("table",function(a,b){f=[];g=0;for(j=d[b].length;g<j;g++){i=0;for(m=e[b].length;i<m;i++)f.push({row:d[b][g],column:e[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});v("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b].anCells)?a[c]:k},1)});r("cells().data()",function(){return this.iterator("cell",function(a,b,c){return x(a,b,c)},1)});v("cells().cache()","cell().cache()",function(a){a=
        -"search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,e){return b.aoData[c][a][e]},1)});v("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,e){return x(b,c,e,a)},1)});v("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});v("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,e){ca(b,c,a,e)})});r("cell()",
        -function(a,b,c){return bb(this.cells(a,b,c))});r("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?x(b[0],c[0].row,c[0].column):k;Ia(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});r("order()",function(a,b){var c=this.context;if(a===k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});
        -r("order.listener()",function(a,b,c){return this.iterator("table",function(e){Oa(e,a,b,c)})});r(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,e){var d=[];h.each(b[e],function(b,c){d.push([c,a])});c.aaSorting=d})});r("search()",function(a,b,c,e){var d=this.context;return a===k?0!==d.length?d[0].oPreviousSearch.sSearch:k:this.iterator("table",function(d){d.oFeatures.bFilter&&fa(d,h.extend({},d.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:
        -b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),1)})});v("columns().search()","column().search()",function(a,b,c,e){return this.iterator("column",function(d,f){var g=d.aoPreSearchCols;if(a===k)return g[f].sSearch;d.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),fa(d,d.oPreviousSearch,1))})});r("state()",function(){return this.context.length?this.context[0].oSavedState:null});r("state.clear()",function(){return this.iterator("table",
        -function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});r("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});r("state.save()",function(){return this.iterator("table",function(a){ya(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,e,d=0,f=a.length;d<f;d++)if(c=parseInt(b[d],10)||0,e=parseInt(a[d],10)||0,c!==e)return c>e;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,
        -function(a,d){var f=d.nScrollHead?h("table",d.nScrollHead)[0]:null,g=d.nScrollFoot?h("table",d.nScrollFoot)[0]:null;if(d.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){return h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable})};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=H;r("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,
        -b){r(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var e=h(this.tables().nodes());e[b].apply(e,a);return this})});r("clear()",function(){return this.iterator("table",function(a){oa(a)})});r("settings()",function(){return new t(this.context,this.context)});r("init()",function(){var a=this.context;return a.length?a[0].oInit:null});r("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});r("destroy()",
        -function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,e=b.oClasses,d=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(d),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),q;b.bDestroying=!0;w(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(Ea).unbind(".DT-"+b.sInstance);d!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&d!=j.parentNode&&(i.children("tfoot").detach(),
        -i.append(j));i.detach();k.detach();b.aaSorting=[];b.aaSortingFixed=[];xa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(e.sSortable+" "+e.sSortableAsc+" "+e.sSortableDesc+" "+e.sSortableNone);b.bJUI&&(h("th span."+e.sSortIcon+", td span."+e.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+e.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));!a&&c&&c.insertBefore(d,b.nTableReinsertBefore);f.children().detach();f.append(l);i.css("width",b.sDestroyWidth).removeClass(e.sTable);
        -(q=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%q])});c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){r(b+"s().every()",function(a){return this.iterator(b,function(e,d,f){a.call((new t(e))[b](d,f))})})});r("i18n()",function(a,b,c){var e=this.context[0],a=R(a)(e.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.7";m.settings=
        -[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",
        -sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,
        -fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,
        -fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},
        -sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,
        -sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null};W(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};W(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,
        -bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],
        -sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,
        -bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==B(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==B(this)?1*this._iRecordsDisplay:
        -this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,e=this.aiDisplay.length,d=this.oFeatures,f=d.bPaginate;return d.bServerSide?!1===f||-1===a?b+e:Math.min(b+a,this._iRecordsDisplay):!f||c>e||-1===a?e:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{}};m.ext=u={buttons:{},classes:{},errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},
        -header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(u,{afnFiltering:u.search,aTypes:u.type.detect,ofnSearch:u.type.search,oSort:u.type.order,afnSortData:u.order,aoFeatures:u.feature,oApi:u.internal,oStdClasses:u.classes,oPagination:u.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
        -sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
        -sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Da="",Da="",F=Da+"ui-state-default",ja=Da+"css_right ui-icon ui-icon-",Xb=Da+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,
        -m.ext.classes,{sPageButton:"fg-button ui-button "+F,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:F+" sorting_asc",sSortDesc:F+" sorting_desc",sSortable:F+" sorting",sSortableAsc:F+" sorting_asc_disabled",sSortableDesc:F+" sorting_desc_disabled",sSortableNone:F+" sorting_disabled",sSortJUIAsc:ja+"triangle-1-n",sSortJUIDesc:ja+"triangle-1-s",sSortJUI:ja+"carat-2-n-s",
        -sSortJUIAscAllowed:ja+"carat-1-n",sSortJUIDescAllowed:ja+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+F,sScrollFoot:"dataTables_scrollFoot "+F,sHeaderTH:F,sFooterTH:F,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},simple_numbers:function(a,b){return["previous",
        -Wa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Wa(a,b),"next","last"]},_numbers:Wa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,e,d,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i,k,l=0,m=function(b,e){var n,r,t,s,u=function(b){Ta(a,b.data.action,true)};n=0;for(r=e.length;n<r;n++){s=e[n];if(h.isArray(s)){t=h("<"+(s.DT_el||"div")+"/>").appendTo(b);m(t,s)}else{k=i="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;
        -case "first":i=j.sFirst;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "previous":i=j.sPrevious;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "next":i=j.sNext;k=s+(d<f-1?"":" "+g.sPageButtonDisabled);break;case "last":i=j.sLast;k=s+(d<f-1?"":" "+g.sPageButtonDisabled);break;default:i=s+1;k=d===s?g.sPageButtonActive:""}if(i){t=h("<a>",{"class":g.sPageButton+" "+k,"aria-controls":a.sTableId,"data-dt-idx":l,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(i).appendTo(b);
        -Va(t,{action:s},u);l++}}}},n;try{n=h(Q.activeElement).data("dt-idx")}catch(r){}m(h(b).empty(),e);n&&h(b).find("[data-dt-idx="+n+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||J(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;
        -return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return J(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return J(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ba,""):""},string:function(a){return J(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Aa=function(a,b,c,e){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),
        -e&&(a=a.replace(e,"")));return 1*a};h.extend(u.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return J(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return J(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,e){h(a.nTable).on("order.dt.DT",function(d,
        -f,g,h){if(a===f){d=c.idx;b.removeClass(c.sSortingClass+" "+e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,e){h("<div/>").addClass(e.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(e.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(d,f,g,h){if(a===f){d=c.idx;b.removeClass(e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass);
        -b.find("span."+e.sSortIcon).removeClass(e.sSortJUIAsc+" "+e.sSortJUIDesc+" "+e.sSortJUI+" "+e.sSortJUIAscAllowed+" "+e.sSortJUIDescAllowed).addClass(h[d]=="asc"?e.sSortJUIAsc:h[d]=="desc"?e.sSortJUIDesc:c.sSortingClassJUI)}})}}});m.render={number:function(a,b,c,e){return{display:function(d){if("number"!==typeof d&&"string"!==typeof d)return d;var f=0>d?"-":"",d=Math.abs(parseFloat(d)),g=parseInt(d,10),d=c?b+(d-g).toFixed(c).substring(2):"";return f+(e||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
        -a)+d}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:kb,_fnAjaxParameters:tb,_fnAjaxUpdateDraw:ub,_fnAjaxDataSrc:sa,_fnAddColumn:Fa,_fnColumnOptions:ka,_fnAdjustColumnSizing:X,_fnVisibleToColumnIndex:la,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:Z,_fnColumnTypes:Ha,_fnApplyColumnDefs:ib,_fnHungarianMap:W,_fnCamelToHungarian:H,_fnLanguageCompat:P,_fnBrowserDetect:gb,_fnAddData:K,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:
        -null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:x,_fnSetCellData:Ia,_fnSplitObjNotation:Ka,_fnGetObjectDataFn:R,_fnSetObjectDataFn:S,_fnGetDataMaster:La,_fnClearTable:oa,_fnDeleteIndex:pa,_fnInvalidate:ca,_fnGetRowElements:na,_fnCreateTr:Ja,_fnBuildHead:jb,_fnDrawHead:ea,_fnDraw:M,_fnReDraw:N,_fnAddOptionsHtml:mb,_fnDetectHeader:da,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:ob,_fnFilterComplete:fa,_fnFilterCustom:xb,_fnFilterColumn:wb,_fnFilter:vb,_fnFilterCreateSearch:Qa,
        -_fnEscapeRegex:va,_fnFilterData:yb,_fnFeatureHtmlInfo:rb,_fnUpdateInfo:Bb,_fnInfoMacros:Cb,_fnInitialise:ga,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:nb,_fnFeatureHtmlPaginate:sb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:pb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:qb,_fnScrollDraw:Y,_fnApplyToChildren:G,_fnCalculateColumnWidths:Ga,_fnThrottle:ua,_fnConvertToWidth:Db,_fnScrollingWidthAdjust:Fb,_fnGetWidestNode:Eb,_fnGetMaxLenString:Gb,_fnStringToCss:s,_fnScrollBarWidth:Hb,_fnSortFlatten:U,
        -_fnSort:lb,_fnSortAria:Jb,_fnSortListener:Ua,_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:I,_fnMap:E,_fnBindAction:Va,_fnCallbackReg:z,_fnCallbackFire:w,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:B,_fnRowAttributes:Ma,_fnCalculateEnd:function(){}});h.fn.dataTable=m;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=
        -b});return h.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],P):"object"===typeof exports?module.exports=P(require("jquery")):jQuery&&!jQuery.fn.dataTable&&P(jQuery)})(window,document);
        diff --git a/resources/assets/js/plugins/datatables/jquery.dataTables_themeroller.css b/resources/assets/js/plugins/datatables/jquery.dataTables_themeroller.css
        deleted file mode 100755
        index 1426a44a18..0000000000
        --- a/resources/assets/js/plugins/datatables/jquery.dataTables_themeroller.css
        +++ /dev/null
        @@ -1,416 +0,0 @@
        -/*
        - * Table styles
        - */
        -table.dataTable {
        -  width: 100%;
        -  margin: 0 auto;
        -  clear: both;
        -  border-collapse: separate;
        -  border-spacing: 0;
        -  /*
        -   * Header and footer styles
        -   */
        -  /*
        -   * Body styles
        -   */
        -}
        -table.dataTable thead th,
        -table.dataTable thead td,
        -table.dataTable tfoot th,
        -table.dataTable tfoot td {
        -  padding: 4px 10px;
        -}
        -table.dataTable thead th,
        -table.dataTable tfoot th {
        -  font-weight: bold;
        -}
        -table.dataTable thead th:active,
        -table.dataTable thead td:active {
        -  outline: none;
        -}
        -table.dataTable thead .sorting_asc,
        -table.dataTable thead .sorting_desc,
        -table.dataTable thead .sorting {
        -  cursor: pointer;
        -  *cursor: hand;
        -}
        -table.dataTable thead th div.DataTables_sort_wrapper {
        -  position: relative;
        -  padding-right: 10px;
        -}
        -table.dataTable thead th div.DataTables_sort_wrapper span {
        -  position: absolute;
        -  top: 50%;
        -  margin-top: -8px;
        -  right: -5px;
        -}
        -table.dataTable thead th.ui-state-default {
        -  border-right-width: 0;
        -}
        -table.dataTable thead th.ui-state-default:last-child {
        -  border-right-width: 1px;
        -}
        -table.dataTable tbody tr {
        -  background-color: #ffffff;
        -}
        -table.dataTable tbody tr.selected {
        -  background-color: #B0BED9;
        -}
        -table.dataTable tbody th,
        -table.dataTable tbody td {
        -  padding: 8px 10px;
        -}
        -table.dataTable th.center,
        -table.dataTable td.center,
        -table.dataTable td.dataTables_empty {
        -  text-align: center;
        -}
        -table.dataTable th.right,
        -table.dataTable td.right {
        -  text-align: right;
        -}
        -table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
        -  border-top: 1px solid #ddd;
        -}
        -table.dataTable.row-border tbody tr:first-child th,
        -table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
        -table.dataTable.display tbody tr:first-child td {
        -  border-top: none;
        -}
        -table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
        -  border-top: 1px solid #ddd;
        -  border-right: 1px solid #ddd;
        -}
        -table.dataTable.cell-border tbody tr th:first-child,
        -table.dataTable.cell-border tbody tr td:first-child {
        -  border-left: 1px solid #ddd;
        -}
        -table.dataTable.cell-border tbody tr:first-child th,
        -table.dataTable.cell-border tbody tr:first-child td {
        -  border-top: none;
        -}
        -table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
        -  background-color: #f9f9f9;
        -}
        -table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
        -  background-color: #abb9d3;
        -}
        -table.dataTable.hover tbody tr:hover,
        -table.dataTable.hover tbody tr.odd:hover,
        -table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
        -table.dataTable.display tbody tr.odd:hover,
        -table.dataTable.display tbody tr.even:hover {
        -  background-color: whitesmoke;
        -}
        -table.dataTable.hover tbody tr:hover.selected,
        -table.dataTable.hover tbody tr.odd:hover.selected,
        -table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
        -table.dataTable.display tbody tr.odd:hover.selected,
        -table.dataTable.display tbody tr.even:hover.selected {
        -  background-color: #a9b7d1;
        -}
        -table.dataTable.order-column tbody tr > .sorting_1,
        -table.dataTable.order-column tbody tr > .sorting_2,
        -table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
        -table.dataTable.display tbody tr > .sorting_2,
        -table.dataTable.display tbody tr > .sorting_3 {
        -  background-color: #f9f9f9;
        -}
        -table.dataTable.order-column tbody tr.selected > .sorting_1,
        -table.dataTable.order-column tbody tr.selected > .sorting_2,
        -table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
        -table.dataTable.display tbody tr.selected > .sorting_2,
        -table.dataTable.display tbody tr.selected > .sorting_3 {
        -  background-color: #acbad4;
        -}
        -table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
        -  background-color: #f1f1f1;
        -}
        -table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
        -  background-color: #f3f3f3;
        -}
        -table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
        -  background-color: whitesmoke;
        -}
        -table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
        -  background-color: #a6b3cd;
        -}
        -table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
        -  background-color: #a7b5ce;
        -}
        -table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
        -  background-color: #a9b6d0;
        -}
        -table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
        -  background-color: #f9f9f9;
        -}
        -table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
        -  background-color: #fbfbfb;
        -}
        -table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
        -  background-color: #fdfdfd;
        -}
        -table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
        -  background-color: #acbad4;
        -}
        -table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
        -  background-color: #adbbd6;
        -}
        -table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
        -  background-color: #afbdd8;
        -}
        -table.dataTable.display tbody tr:hover > .sorting_1,
        -table.dataTable.display tbody tr.odd:hover > .sorting_1,
        -table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
        -table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
        -table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
        -  background-color: #eaeaea;
        -}
        -table.dataTable.display tbody tr:hover > .sorting_2,
        -table.dataTable.display tbody tr.odd:hover > .sorting_2,
        -table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
        -table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
        -table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
        -  background-color: #ebebeb;
        -}
        -table.dataTable.display tbody tr:hover > .sorting_3,
        -table.dataTable.display tbody tr.odd:hover > .sorting_3,
        -table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
        -table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
        -table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
        -  background-color: #eeeeee;
        -}
        -table.dataTable.display tbody tr:hover.selected > .sorting_1,
        -table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
        -table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
        -table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
        -table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
        -  background-color: #a1aec7;
        -}
        -table.dataTable.display tbody tr:hover.selected > .sorting_2,
        -table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
        -table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
        -table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
        -table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
        -  background-color: #a2afc8;
        -}
        -table.dataTable.display tbody tr:hover.selected > .sorting_3,
        -table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
        -table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
        -table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
        -table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
        -  background-color: #a4b2cb;
        -}
        -table.dataTable.nowrap th, table.dataTable.nowrap td {
        -  white-space: nowrap;
        -}
        -table.dataTable.compact thead th,
        -table.dataTable.compact thead td {
        -  padding: 5px 9px;
        -}
        -table.dataTable.compact tfoot th,
        -table.dataTable.compact tfoot td {
        -  padding: 5px 9px 3px 9px;
        -}
        -table.dataTable.compact tbody th,
        -table.dataTable.compact tbody td {
        -  padding: 4px 5px;
        -}
        -table.dataTable th.dt-left,
        -table.dataTable td.dt-left {
        -  text-align: left;
        -}
        -table.dataTable th.dt-center,
        -table.dataTable td.dt-center,
        -table.dataTable td.dataTables_empty {
        -  text-align: center;
        -}
        -table.dataTable th.dt-right,
        -table.dataTable td.dt-right {
        -  text-align: right;
        -}
        -table.dataTable th.dt-justify,
        -table.dataTable td.dt-justify {
        -  text-align: justify;
        -}
        -table.dataTable th.dt-nowrap,
        -table.dataTable td.dt-nowrap {
        -  white-space: nowrap;
        -}
        -table.dataTable thead th.dt-head-left,
        -table.dataTable thead td.dt-head-left,
        -table.dataTable tfoot th.dt-head-left,
        -table.dataTable tfoot td.dt-head-left {
        -  text-align: left;
        -}
        -table.dataTable thead th.dt-head-center,
        -table.dataTable thead td.dt-head-center,
        -table.dataTable tfoot th.dt-head-center,
        -table.dataTable tfoot td.dt-head-center {
        -  text-align: center;
        -}
        -table.dataTable thead th.dt-head-right,
        -table.dataTable thead td.dt-head-right,
        -table.dataTable tfoot th.dt-head-right,
        -table.dataTable tfoot td.dt-head-right {
        -  text-align: right;
        -}
        -table.dataTable thead th.dt-head-justify,
        -table.dataTable thead td.dt-head-justify,
        -table.dataTable tfoot th.dt-head-justify,
        -table.dataTable tfoot td.dt-head-justify {
        -  text-align: justify;
        -}
        -table.dataTable thead th.dt-head-nowrap,
        -table.dataTable thead td.dt-head-nowrap,
        -table.dataTable tfoot th.dt-head-nowrap,
        -table.dataTable tfoot td.dt-head-nowrap {
        -  white-space: nowrap;
        -}
        -table.dataTable tbody th.dt-body-left,
        -table.dataTable tbody td.dt-body-left {
        -  text-align: left;
        -}
        -table.dataTable tbody th.dt-body-center,
        -table.dataTable tbody td.dt-body-center {
        -  text-align: center;
        -}
        -table.dataTable tbody th.dt-body-right,
        -table.dataTable tbody td.dt-body-right {
        -  text-align: right;
        -}
        -table.dataTable tbody th.dt-body-justify,
        -table.dataTable tbody td.dt-body-justify {
        -  text-align: justify;
        -}
        -table.dataTable tbody th.dt-body-nowrap,
        -table.dataTable tbody td.dt-body-nowrap {
        -  white-space: nowrap;
        -}
        -
        -table.dataTable,
        -table.dataTable th,
        -table.dataTable td {
        -  -webkit-box-sizing: content-box;
        -  -moz-box-sizing: content-box;
        -  box-sizing: content-box;
        -}
        -
        -/*
        - * Control feature layout
        - */
        -.dataTables_wrapper {
        -  position: relative;
        -  clear: both;
        -  *zoom: 1;
        -  zoom: 1;
        -}
        -.dataTables_wrapper .dataTables_length {
        -  float: left;
        -}
        -.dataTables_wrapper .dataTables_filter {
        -  float: right;
        -  text-align: right;
        -}
        -.dataTables_wrapper .dataTables_filter input {
        -  margin-left: 0.5em;
        -}
        -.dataTables_wrapper .dataTables_info {
        -  clear: both;
        -  float: left;
        -  padding-top: 0.55em;
        -}
        -.dataTables_wrapper .dataTables_paginate {
        -  float: right;
        -  text-align: right;
        -}
        -.dataTables_wrapper .dataTables_paginate .fg-button {
        -  box-sizing: border-box;
        -  display: inline-block;
        -  min-width: 1.5em;
        -  padding: 0.5em;
        -  margin-left: 2px;
        -  text-align: center;
        -  text-decoration: none !important;
        -  cursor: pointer;
        -  *cursor: hand;
        -  color: #333 !important;
        -  border: 1px solid transparent;
        -}
        -.dataTables_wrapper .dataTables_paginate .fg-button:active {
        -  outline: none;
        -}
        -.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
        -  border-top-left-radius: 3px;
        -  border-bottom-left-radius: 3px;
        -}
        -.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
        -  border-top-right-radius: 3px;
        -  border-bottom-right-radius: 3px;
        -}
        -.dataTables_wrapper .dataTables_processing {
        -  position: absolute;
        -  top: 50%;
        -  left: 50%;
        -  width: 100%;
        -  height: 40px;
        -  margin-left: -50%;
        -  margin-top: -25px;
        -  padding-top: 20px;
        -  text-align: center;
        -  font-size: 1.2em;
        -  background-color: white;
        -  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
        -  /* Chrome,Safari4+ */
        -  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* Chrome10+,Safari5.1+ */
        -  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* FF3.6+ */
        -  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* IE10+ */
        -  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* Opera 11.10+ */
        -  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
        -  /* W3C */
        -}
        -.dataTables_wrapper .dataTables_length,
        -.dataTables_wrapper .dataTables_filter,
        -.dataTables_wrapper .dataTables_info,
        -.dataTables_wrapper .dataTables_processing,
        -.dataTables_wrapper .dataTables_paginate {
        -  color: #333;
        -}
        -.dataTables_wrapper .dataTables_scroll {
        -  clear: both;
        -}
        -.dataTables_wrapper .dataTables_scrollBody {
        -  *margin-top: -1px;
        -  -webkit-overflow-scrolling: touch;
        -}
        -.dataTables_wrapper .ui-widget-header {
        -  font-weight: normal;
        -}
        -.dataTables_wrapper .ui-toolbar {
        -  padding: 8px;
        -}
        -.dataTables_wrapper:after {
        -  visibility: hidden;
        -  display: block;
        -  content: "";
        -  clear: both;
        -  height: 0;
        -}
        -
        -@media screen and (max-width: 767px) {
        -  .dataTables_wrapper .dataTables_length,
        -  .dataTables_wrapper .dataTables_filter,
        -  .dataTables_wrapper .dataTables_info,
        -  .dataTables_wrapper .dataTables_paginate {
        -    float: none;
        -    text-align: center;
        -  }
        -  .dataTables_wrapper .dataTables_filter,
        -  .dataTables_wrapper .dataTables_paginate {
        -    margin-top: 0.5em;
        -  }
        -}
        diff --git a/resources/assets/js/snipeit.js b/resources/assets/js/snipeit.js
        index b47e5fd0c7..2e4d525c52 100755
        --- a/resources/assets/js/snipeit.js
        +++ b/resources/assets/js/snipeit.js
        @@ -1,3 +1,4 @@
        +
         /**
          * Module containing core application logic.
          * @param  {jQuery} $        Insulated jQuery object
        @@ -5,6 +6,38 @@
          * @return {IIFE}          Immediately invoked. Returns self.
          */
         
        +var lineOptions = {
        +
        +        legend: {
        +            position: "bottom"
        +        },
        +        scales: {
        +            yAxes: [{
        +                ticks: {
        +                    fontColor: "rgba(0,0,0,0.5)",
        +                    fontStyle: "bold",
        +                    beginAtZero: true,
        +                    maxTicksLimit: 5,
        +                    padding: 20
        +                },
        +                gridLines: {
        +                    drawTicks: false,
        +                    display: false
        +                }
        +            }],
        +            xAxes: [{
        +                gridLines: {
        +                    zeroLineColor: "transparent"
        +                },
        +                ticks: {
        +                    padding: 20,
        +                    fontColor: "rgba(0,0,0,0.5)",
        +                    fontStyle: "bold"
        +                }
        +            }]
        +        }
        +
        +};
         
         var pieOptions = {
             //Boolean - Whether we should show a stroke on each segment
        @@ -35,10 +68,7 @@ var pieOptions = {
             //String - A tooltip template
             tooltipTemplate: "<%=value %> <%=label%> "
         };
        -//console.dir(pieOptions);
        -//Create pie or douhnut chart
        -// You can switch between pie and douhnut using the method below.
        -//pieChart.Doughnut(PieData, pieOptions);
        +
         //-----------------
         //- END PIE CHART -
         //-----------------
        @@ -63,7 +93,7 @@ var pieOptions = {
         
                         $('#myModalLabel').text(title);
                         $dataConfirmModal.find('.modal-body').text(message);
        -                $('#dataConfirmOK').attr('href', href);
        +                $('#deleteForm').attr('action', href);
                         $dataConfirmModal.modal({
                             show: true
                         });
        @@ -92,3 +122,64 @@ var pieOptions = {
         
         
         
        +
        +
        +$(document).ready(function () {
        +
        +    /*
        +    * Slideout help menu
        +    */
        +     $('.slideout-menu-toggle').on('click', function(event){
        +       console.log('clicked');
        +        event.preventDefault();
        +        // create menu variables
        +        var slideoutMenu = $('.slideout-menu');
        +        var slideoutMenuWidth = $('.slideout-menu').width();
        +
        +        // toggle open class
        +        slideoutMenu.toggleClass("open");
        +
        +        // slide menu
        +        if (slideoutMenu.hasClass("open")) {
        +         slideoutMenu.show();
        +            slideoutMenu.animate({
        +                right: "0px"
        +            });
        +        } else {
        +            slideoutMenu.animate({
        +                right: -slideoutMenuWidth
        +            }, "-350px");
        +         slideoutMenu.fadeOut();
        +        }
        +     });
        +
        +     /*
        +     * iCheck checkbox plugin
        +     */
        +
        +     $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({
        +         checkboxClass: 'icheckbox_minimal-blue',
        +         radioClass: 'iradio_minimal-blue'
        +     });
        +
        +
        +     /*
        +     * Select2
        +     */
        +
        +     var iOS = /iPhone|iPad|iPod/.test(navigator.userAgent)  && !window.MSStream;
        +     if(!iOS)
        +     {
        +        // Vue collision: Avoid overriding a vue select2 instance
        +        // by checking to see if the item has already been select2'd.
        +        $('select.select2:not(".select2-hidden-accessible")').each(function (i,obj) {
        +            {
        +                $(obj).select2();
        +            }
        +        });
        +     }
        +     $('.datepicker').datepicker();
        +
        +
        +
        +});
        diff --git a/resources/assets/js/snipeit_modals.js b/resources/assets/js/snipeit_modals.js
        new file mode 100644
        index 0000000000..edc53cbeb9
        --- /dev/null
        +++ b/resources/assets/js/snipeit_modals.js
        @@ -0,0 +1,127 @@
        +/* 
        + * 
        + * Snipe-IT Universal Modal support
        + * 
        + * Enables modal dialogs to create sub-resources throughout Snipe-IT
        + * 
        + */
        +
        + /* 
        + HOW TO USE
        +
        + Create a Button looking like this:
        +
        + <a href='{{ route('modal.user') }}' data-toggle="modal"  data-target="#createModal" data-dependency="user" data-select='assigned_to' class="btn btn-sm btn-default">New</a>
        +
        + If you don't have access to Blade commands (like {{ and }}, etc), you can hard-code a URL as the 'href'
        +
        + data-toggle="modal" - required for Bootstrap Modals
        + data-target="#createModal" - fixed ID for the modal, do not change
        + data-dependency="user" - which Snipe-IT model you're going to be creating.
        + data-select="assigned_to" - What is the *ID* of the select-dropdown that you're going to be adding to, if the modal-create was a 
        +                             success? Be on the lookout for duplicate ID's, it will confuse this library!
        + class="btn btn-sm btn-default" - makes it look button-ey, feel free to change :)
        + */
        +
        + $(function () {
        +  console.warn("Loading up Modal functionality.");
        +
        +  //handle modal-add-interstitial calls
        +  var model, select;
        +
        +  if($('#createModal').length == 0) {
        +    $('body').append('<div class="modal fade" id="createModal"></div><!-- /.modal -->');
        +  }
        +
        +  $('#createModal').on("show.bs.modal", function (event) {
        +      var link = $(event.relatedTarget);
        +      model = link.data("dependency");
        +      select = link.data("select");
        +      // console.warn("Uh, href is: "+link.attr('href'));
        +      // console.dir(link);
        +      $('#createModal').load(link.attr('href'),function () {
        +          //do we need to re-select2 this, after load? Probably.
        +          $('#createModal').find('select.select2').select2();                
        +      });
        +  });
        +
        +
        +  $('#createModal').on('click','#modal-save', function () {
        +    console.warn("MODAL SAVE CALLED FOR MODAL!");
        +    var data = {};
        +    console.warn("We are about to SAVE!!! for model: "+model+" and select ID: "+select);
        +    $('.modal-body input:visible').each(function (index, elem) {
        +        console.warn("["+index+"]: "+elem.id+" = "+$(elem).val());
        +        var bits = elem.id.split("-");
        +        if (bits[0] === "modal") {
        +            data[bits[1]] = $(elem).val();
        +        }
        +    });
        +    //this can probably get replaced with a normal 'serialize' instead
        +    $('.modal-body select:visible').each(function (index, elem) {
        +        var bits = elem.id.split("-");
        +        data[bits[1]] = $(elem).val();
        +    });
        +
        +    data._token = Laravel.csrfToken;
        +    console.log(data);
        +
        +    $.ajax({
        +        type: 'POST',
        +        url: "/api/v1/" + model + "s",
        +        headers: {
        +            "X-Requested-With": 'XMLHttpRequest',
        +            "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +        },
        +
        +        data: data,
        +        success: function (result) {
        +            // {"status":"error","messages":{"name":["The name field is required."]}}
        +            if(result.status == "error") {
        +                var error_message="";
        +                for(var field in result.messages) {
        +                    error_message+="Problem(s) with field '"+field+"': "+result.messages[field].join(", ");
        +                }
        +                //window.alert("Error adding "+model+": "+error_message);
        +                $('#modal_error_msg').html(error_message).show();
        +                return false;
        +            }
        +            var id = result.payload.id;
        +            var name = result.payload.name || (result.payload.first_name + " " + result.payload.last_name);
        +            if(!id || !name) {
        +                console.error("Could not find resulting name or ID from modal-create. Name: "+name+", id: "+id);
        +                return false;
        +            }
        +            $('#createModal').modal('hide');
        +            $('#createModal').html("");
        +
        +            // "select" is the original drop-down menu that someone
        +            // clicked 'add' on to add a new 'thing'
        +            // this code adds the newly created object to that select
        +            var selector = document.getElementById(select);
        +            if(!selector) {
        +                console.error("Could not find original <select> element with an id of: "+select);
        +                return false;
        +            }
        +            //console.log(document.getElementById(select));
        +            console.dir(selector);
        +            selector.options[selector.length] = new Option(name, id);
        +            selector.selectedIndex = selector.length - 1;
        +            $(selector).trigger("change");
        +            if(fetchCustomFields) {
        +                fetchCustomFields();
        +            }
        +
        +        },
        +        error: function (result) {
        +            // console.log('Error: ' + result.responseJSON.error.message );
        +            msg = result.responseJSON.messages || result.responseJSON.error;
        +            $('#modal_error_msg').html("Server Error: "+msg).show();
        +            //window.alert("Unable to add new " + model + " - error: " + msg);
        +        }
        +
        +
        +
        +    });
        +  });
        +});
        \ No newline at end of file
        diff --git a/resources/assets/js/theme.js b/resources/assets/js/theme.js
        index ef614b0abb..34c22569d0 100755
        --- a/resources/assets/js/theme.js
        +++ b/resources/assets/js/theme.js
        @@ -37,27 +37,6 @@ $(function () {
           });
         
         
        -  // skin changer
        -  $(".skins-nav .skin").click(function (e) {
        -    e.preventDefault();
        -    if ($(this).hasClass("selected")) {
        -      return;
        -    }
        -    $(".skins-nav .skin").removeClass("selected");
        -    $(this).addClass("selected");
        -    
        -    if (!$("#skin-file").length) {
        -      $("head").append('<link rel="stylesheet" type="text/css" id="skin-file" href="">');
        -    }
        -    var $skin = $("#skin-file");
        -    if ($(this).attr("data-file")) {
        -      $skin.attr("href", $(this).data("file"));
        -    } else {
        -      $skin.attr("href", "");
        -    }
        -
        -  });
        -
         
           // sidebar menu dropdown toggle
           $("#dashboard-menu .dropdown-toggle").click(function (e) {
        @@ -151,4 +130,4 @@ $(function () {
             }
         
         
        -});
        \ No newline at end of file
        +});
        diff --git a/resources/assets/js/vue.js b/resources/assets/js/vue.js
        new file mode 100644
        index 0000000000..39d2cb4ad8
        --- /dev/null
        +++ b/resources/assets/js/vue.js
        @@ -0,0 +1,38 @@
        +
        +/**
        + * First we will load all of this project's JavaScript dependencies which
        + * include Vue and Vue Resource. This gives a great starting point for
        + * building robust, powerful web applications using Vue and Laravel.
        + */
        +require('../../../node_modules/jquery-ui-bundle/jquery-ui.min.js');
        +require('./bootstrap');
        +
        +/**
        + * Next, we will create a fresh Vue application instance and attach it to
        + * the page. Then, you may begin adding components to this application
        + * or customize the JavaScript scaffolding to fit your unique needs.
        + */
        +Vue.component(
        +    'passport-clients',
        +    require('./components/passport/Clients.vue')
        +);
        +
        +Vue.component(
        +    'passport-authorized-clients',
        +    require('./components/passport/AuthorizedClients.vue')
        +);
        +
        +Vue.component(
        +    'passport-personal-access-tokens',
        +    require('./components/passport/PersonalAccessTokens.vue')
        +);
        +
        +Vue.component(
        +    'importer',
        +    require('./components/importer/importer.vue')
        +);
        +
        +// Commented out currently to avoid trying to load vue everywhere.
        +// const app = new Vue({
        +//     el: '#app'
        +// });
        diff --git a/resources/assets/less/AdminLTE.less b/resources/assets/less/AdminLTE.less
        index d0c2b34a4b..d5c277cd8b 100755
        --- a/resources/assets/less/AdminLTE.less
        +++ b/resources/assets/less/AdminLTE.less
        @@ -6,8 +6,6 @@
          *           Please visit http://opensource.org/licenses/MIT for more information
         !*/
         
        -//google fonts
        -@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);
         
         //Bootstrap Variables & Mixins
         //The core bootstrap code have not been modified. These files
        @@ -39,22 +37,21 @@
         @import "navs.less";
         @import "table.less";
         @import "labels.less";
        -@import "direct-chat.less";
        -@import "users-list.less";
         @import "modal.less";
         
         //PAGES
         //------
         @import "login_and_register.less";
        -@import "404_500_errors.less";
         
         //Plugins
         //--------
        -@import "bootstrap-social.less";
        -@import "fullcalendar.less";
        +// @import "bootstrap-social.less";
        +//@import "fullcalendar.less";
         @import "select2.less";
         
         //Miscellaneous
         //-------------
         @import "miscellaneous.less";
         @import "print.less";
        +
        +@import "skins/skin-blue.less";
        diff --git a/resources/assets/less/app.less b/resources/assets/less/app.less
        index 87ce76a2f0..78635f45f3 100644
        --- a/resources/assets/less/app.less
        +++ b/resources/assets/less/app.less
        @@ -1,2 +1,7 @@
        -@import url(https://fonts.googleapis.com/css?family=Lato);
        -$font-family-sans-serif: 'Lato', sans-serif;
        +
        +@icon-font-path: '../fonts';
        +
        +@import '../../../node_modules/bootstrap-less/bootstrap/bootstrap';
        +@import '../../../node_modules/ekko-lightbox/ekko-lightbox';
        +@import '../../../node_modules/bootstrap-colorpicker/src/less/colorpicker';
        +
        diff --git a/resources/assets/less/overrides.less b/resources/assets/less/overrides.less
        index 05dee943bf..89bc420304 100644
        --- a/resources/assets/less/overrides.less
        +++ b/resources/assets/less/overrides.less
        @@ -137,7 +137,7 @@ a.accordion-header {
                 padding-left: 15px;
           }
           .control-label.multiline {
        -      padding-top: 10;
        +      padding-top: 10px;
           }
         
         .btn-outline {
        @@ -287,3 +287,27 @@ a.logo.no-hover a:hover {
           border-right: 6px solid orange;
         }
         
        +body {
        +  font-family: -apple-system, BlinkMacSystemFont,
        +  "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell",
        +  "Fira Sans", "Droid Sans", "Helvetica Neue",
        +  sans-serif;
        +  font-size: 13px;
        +}
        +
        +.sidebar-menu {
        +  font-size: 14px;
        +  white-space: normal;
        +}
        +
        +@media print {
        +  a[href]:after {
        +    content: none;
        +  }
        +
        +  .tab-content > .tab-pane {
        +    display: block !important;
        +    opacity: 1 !important;
        +    visibility: visible !important;
        +  }
        +}
        diff --git a/resources/lang/af/admin/accessories/general.php b/resources/lang/af/admin/accessories/general.php
        new file mode 100644
        index 0000000000..22771aff0c
        --- /dev/null
        +++ b/resources/lang/af/admin/accessories/general.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +    'about_accessories_title' 			=> 'About Accessories',
        +    'about_accessories_text'  			=> 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
        +    'accessory_category' 				=> 'Accessory Category',
        +    'accessory_name'  					=> 'Accessory Name',
        +    'checkout'  							=> 'Checkout Accessory',
        +    'checkin'  							=> 'Checkin Accessory',
        +    'create'  							=> 'Create Accessory',
        +    'edit'  							=> 'Edit Accessory',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'total'  							=> 'Total',
        +    'remaining'  						=> 'Avail',
        +    'update'  							=> 'Update Accessory',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/af/admin/accessories/message.php b/resources/lang/af/admin/accessories/message.php
        new file mode 100644
        index 0000000000..92998a4e14
        --- /dev/null
        +++ b/resources/lang/af/admin/accessories/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'The accessory does not exist.',
        +    'assoc_users'	 => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'The accessory was not created, please try again.',
        +        'success' => 'The accessory was successfully created.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'The accessory was not updated, please try again',
        +        'success' => 'The accessory was updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this accessory?',
        +        'error'   => 'There was an issue deleting the accessory. Please try again.',
        +        'success' => 'The accessory was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Accessory was not checked out, please try again',
        +        'success' 		=> 'Accessory checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Accessory was not checked in, please try again',
        +        'success' 		=> 'Accessory checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/af/admin/accessories/table.php b/resources/lang/af/admin/accessories/table.php
        new file mode 100644
        index 0000000000..e02d9f22e4
        --- /dev/null
        +++ b/resources/lang/af/admin/accessories/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +	'dl_csv'      				=> 'Download CSV',
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Accessory Name',
        +
        +
        +);
        diff --git a/resources/lang/af/admin/asset_maintenances/form.php b/resources/lang/af/admin/asset_maintenances/form.php
        new file mode 100644
        index 0000000000..2aa005c45f
        --- /dev/null
        +++ b/resources/lang/af/admin/asset_maintenances/form.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +    return [
        +        'asset_maintenance_type' => 'Maintenance Type',
        +        'title'                  => 'Title',
        +        'start_date'             => 'Started',
        +        'completion_date'        => 'Completed',
        +        'cost'                   => 'Cost',
        +        'is_warranty'            => 'Warranty Improvement',
        +        'asset_maintenance_time' => 'Days',
        +        'notes'                  => 'Notes',
        +        'update'                 => 'Update',
        +        'create'                 => 'Create'
        +    ];
        diff --git a/resources/lang/af/admin/asset_maintenances/general.php b/resources/lang/af/admin/asset_maintenances/general.php
        new file mode 100644
        index 0000000000..c7ae42d41a
        --- /dev/null
        +++ b/resources/lang/af/admin/asset_maintenances/general.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +    return [
        +        'asset_maintenances' => 'Asset Maintenances',
        +        'edit'               => 'Edit Asset Maintenance',
        +        'delete'             => 'Delete Asset Maintenance',
        +        'view'               => 'View Asset Maintenance Details',
        +        'repair'             => 'Repair',
        +        'maintenance'        => 'Maintenance',
        +        'upgrade'            => 'Upgrade'
        +    ];
        diff --git a/resources/lang/af/admin/asset_maintenances/message.php b/resources/lang/af/admin/asset_maintenances/message.php
        new file mode 100644
        index 0000000000..d121115825
        --- /dev/null
        +++ b/resources/lang/af/admin/asset_maintenances/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +    return [
        +        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'delete'                       => [
        +            'confirm' => 'Are you sure you wish to delete this asset maintenance?',
        +            'error'   => 'There was an issue deleting the asset maintenance. Please try again.',
        +            'success' => 'The asset maintenance was deleted successfully.'
        +        ],
        +        'create'                       => [
        +            'error'   => 'Asset Maintenance was not created, please try again.',
        +            'success' => 'Asset Maintenance created successfully.'
        +        ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Not Completed Yet',
        +        'warranty'                     => 'Warranty',
        +        'not_warranty'                 => 'Not Warranty',
        +    ];
        \ No newline at end of file
        diff --git a/resources/lang/af/admin/asset_maintenances/table.php b/resources/lang/af/admin/asset_maintenances/table.php
        new file mode 100644
        index 0000000000..f3a6be60f9
        --- /dev/null
        +++ b/resources/lang/af/admin/asset_maintenances/table.php
        @@ -0,0 +1,8 @@
        +<?php
        +
        +    return [
        +        'title'         => 'Asset Maintenance',
        +        'asset_name'    => 'Asset Name',
        +        'is_warranty'   => 'Warranty',
        +        'dl_csv'        => 'Download CSV'
        +    ];
        diff --git a/resources/lang/af/admin/categories/general.php b/resources/lang/af/admin/categories/general.php
        new file mode 100644
        index 0000000000..16b3b79f51
        --- /dev/null
        +++ b/resources/lang/af/admin/categories/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_categories_title' 			=> 'About Categories',
        +    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'asset_categories' 					=> 'Asset Categories',
        +    'category_name'  					=> 'Category Name',
        +    'checkin_email'                     => 'Send email to user on checkin.',
        +    'clone'                             => 'Clone Category',
        +    'create'  							=> 'Create Category',
        +    'edit'                              => 'Edit Category',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
        +    'required_eula'						=> 'This user will be emailed a copy of the EULA',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'update'  							=> 'Update Category',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/af/admin/categories/message.php b/resources/lang/af/admin/categories/message.php
        new file mode 100644
        index 0000000000..48cf5478e1
        --- /dev/null
        +++ b/resources/lang/af/admin/categories/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Category does not exist.',
        +    'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
        +    'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Category was not created, please try again.',
        +        'success' => 'Category created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Category was not updated, please try again',
        +        'success' => 'Category updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this category?',
        +        'error'   => 'There was an issue deleting the category. Please try again.',
        +        'success' => 'The category was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/categories/table.php b/resources/lang/af/admin/categories/table.php
        new file mode 100644
        index 0000000000..a3ee96ae7f
        --- /dev/null
        +++ b/resources/lang/af/admin/categories/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'parent'   					=> 'Parent',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Asset Category Name',
        +
        +);
        diff --git a/resources/lang/af/admin/companies/general.php b/resources/lang/af/admin/companies/general.php
        new file mode 100644
        index 0000000000..9a47968977
        --- /dev/null
        +++ b/resources/lang/af/admin/companies/general.php
        @@ -0,0 +1,6 @@
        +<?php
        +return [
        +    'about_companies_title'            => 'About Companies',
        +    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'select_company' => 'Select Company',
        +];
        diff --git a/resources/lang/af/admin/companies/message.php b/resources/lang/af/admin/companies/message.php
        new file mode 100644
        index 0000000000..a6db573519
        --- /dev/null
        +++ b/resources/lang/af/admin/companies/message.php
        @@ -0,0 +1,18 @@
        +<?php
        +return array(
        +    'does_not_exist' => 'Company does not exist.',
        +    'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
        +    'create' => array(
        +        'error'   => 'Company was not created, please try again.',
        +        'success' => 'Company created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Company was not updated, please try again',
        +        'success' => 'Company updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm' => 'Are you sure you wish to delete this company?',
        +        'error'   => 'There was an issue deleting the company. Please try again.',
        +        'success' => 'The Company was deleted successfully.'
        +    )
        +);
        diff --git a/resources/lang/af/admin/companies/table.php b/resources/lang/af/admin/companies/table.php
        new file mode 100644
        index 0000000000..2f86126ff2
        --- /dev/null
        +++ b/resources/lang/af/admin/companies/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +return array(
        +    'companies' => 'Companies',
        +    'create'    => 'Create Company',
        +    'title'     => 'Company',
        +    'update'    => 'Update Company',
        +    'name'      => 'Company Name',
        +    'id'        => 'ID',
        +);
        diff --git a/resources/lang/af/admin/components/general.php b/resources/lang/af/admin/components/general.php
        new file mode 100644
        index 0000000000..75c9d250ab
        --- /dev/null
        +++ b/resources/lang/af/admin/components/general.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about_components_title' 			=> 'About Components',
        +    'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        +    'component_name'                  => 'Component Name',
        +    'checkin'                             => 'Checkin Component',
        +    'checkout'                             => 'Checkout Component',
        +    'cost'				=> 'Purchase Cost',
        +    'create'                             => 'Create Component',
        +    'edit'                             => 'Edit Component',
        +    'date'					=> 'Purchase Date',
        +    'order'					=> 'Order Number',
        +    'remaining' 			             => 'Remaining',
        +    'total' 			                 => 'Total',
        +    'update'                            => 'Update Component',
        +);
        diff --git a/resources/lang/af/admin/components/message.php b/resources/lang/af/admin/components/message.php
        new file mode 100644
        index 0000000000..1d13970f23
        --- /dev/null
        +++ b/resources/lang/af/admin/components/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Component does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Component was not created, please try again.',
        +        'success' => 'Component created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Component was not updated, please try again',
        +        'success' => 'Component updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this component?',
        +        'error'   => 'There was an issue deleting the component. Please try again.',
        +        'success' => 'The component was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Component was not checked out, please try again',
        +        'success' 		=> 'Component checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Component was not checked in, please try again',
        +        'success' 		=> 'Component checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/af/admin/components/table.php b/resources/lang/af/admin/components/table.php
        new file mode 100644
        index 0000000000..3d4fed6a7f
        --- /dev/null
        +++ b/resources/lang/af/admin/components/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Component Name',
        +);
        diff --git a/resources/lang/af/admin/consumables/general.php b/resources/lang/af/admin/consumables/general.php
        new file mode 100644
        index 0000000000..53a69f8c03
        --- /dev/null
        +++ b/resources/lang/af/admin/consumables/general.php
        @@ -0,0 +1,13 @@
        +<?php
        +
        +return array(
        +    'about_consumables_title' 			=> 'About Consumables',
        +    'about_consumables_text'  			=> 'Consumables are anything purchased that will be used up over time. For example, printer ink or copier paper.',
        +    'checkout'                          => 'Checkout Consumable to User',
        +    'consumable_name'                   => 'Consumable Name',
        +    'create'                            => 'Create Consumable',
        +    'item_no'                           => 'Item No.',
        +    'remaining' 			            => 'Remaining',
        +    'total' 			                => 'Total',
        +    'update'                            => 'Update Consumable',
        +);
        diff --git a/resources/lang/af/admin/consumables/message.php b/resources/lang/af/admin/consumables/message.php
        new file mode 100644
        index 0000000000..48a3cfbd9f
        --- /dev/null
        +++ b/resources/lang/af/admin/consumables/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Consumable does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Consumable was not created, please try again.',
        +        'success' => 'Consumable created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Consumable was not updated, please try again',
        +        'success' => 'Consumable updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this consumable?',
        +        'error'   => 'There was an issue deleting the consumable. Please try again.',
        +        'success' => 'The consumable was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Consumable was not checked out, please try again',
        +        'success' 		=> 'Consumable checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Consumable was not checked in, please try again',
        +        'success' 		=> 'Consumable checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/af/admin/consumables/table.php b/resources/lang/af/admin/consumables/table.php
        new file mode 100644
        index 0000000000..bb76721f17
        --- /dev/null
        +++ b/resources/lang/af/admin/consumables/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Consumable Name',
        +);
        diff --git a/resources/lang/af/admin/custom_fields/general.php b/resources/lang/af/admin/custom_fields/general.php
        new file mode 100644
        index 0000000000..f2e6df90cb
        --- /dev/null
        +++ b/resources/lang/af/admin/custom_fields/general.php
        @@ -0,0 +1,30 @@
        +<?php
        +
        +return array(
        +    'custom_fields'		        => 'Custom Fields',
        +    'field'		                => 'Field',
        +    'about_fieldsets_title'		=> 'About Fieldsets',
        +    'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        +    'custom_format'             => 'Custom format...',
        +    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        +    'encrypted'      	        => 'Encrypted',
        +    'fieldset'      	        => 'Fieldset',
        +    'qty_fields'      	      => 'Qty Fields',
        +    'fieldsets'      	        => 'Fieldsets',
        +    'fieldset_name'           => 'Fieldset Name',
        +    'field_name'              => 'Field Name',
        +    'field_values'            => 'Field Values',
        +    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_element'           => 'Form Element',
        +    'field_element_short'     => 'Element',
        +    'field_format'            => 'Format',
        +    'field_custom_format'     => 'Custom Format',
        +    'required'   		          => 'Required',
        +    'req'   		              => 'Req.',
        +    'used_by_models'   		    => 'Used By Models',
        +    'order'   		            => 'Order',
        +    'create_fieldset'         => 'New Fieldset',
        +    'create_field'            => 'New Custom Field',
        +    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +);
        diff --git a/resources/lang/af/admin/custom_fields/message.php b/resources/lang/af/admin/custom_fields/message.php
        new file mode 100644
        index 0000000000..ed66a6ba16
        --- /dev/null
        +++ b/resources/lang/af/admin/custom_fields/message.php
        @@ -0,0 +1,57 @@
        +<?php
        +
        +return array(
        +
        +    'field' => array(
        +        'invalid'   => 'That field does not exist.',
        +        'already_added'   => 'Field already added',
        +
        +        'create' => array(
        +            'error'   => 'Field was not created, please try again.',
        +            'success' => 'Field created successfully.',
        +            'assoc_success' => 'Field successfully added to fieldset.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Field was not updated, please try again',
        +            'success' => 'Field updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this field?',
        +            'error'   => 'There was an issue deleting the field. Please try again.',
        +            'success' => 'The field was deleted successfully.',
        +            'in_use'   => 'Field is still in use.',
        +        )
        +
        +    ),
        +
        +    'fieldset' => array(
        +
        +        'does_not_exist' => 'Fieldset does not exist',
        +
        +        'create' => array(
        +            'error'   => 'Fieldset was not created, please try again.',
        +            'success' => 'Fieldset created successfully.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Fieldset was not updated, please try again',
        +            'success' => 'Fieldset updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        +            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        +            'success' => 'The fieldset was deleted successfully.',
        +            'in_use'   => 'Fieldset is still in use.',
        +        )
        +
        +    ),
        +
        +
        +
        +
        +
        +
        +);
        diff --git a/resources/lang/af/admin/departments/message.php b/resources/lang/af/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/af/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/departments/table.php b/resources/lang/af/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/af/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/af/admin/depreciations/general.php b/resources/lang/af/admin/depreciations/general.php
        new file mode 100644
        index 0000000000..1fca0e2cb7
        --- /dev/null
        +++ b/resources/lang/af/admin/depreciations/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return array(
        +    'about_asset_depreciations'  			=> 'About Asset Depreciations',
        +    'about_depreciations'  					=> 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
        +    'asset_depreciations'  					=> 'Asset Depreciations',
        +    'create'  					            => 'Create Depreciation',
        +    'depreciation_name'  					=> 'Depreciation Name',
        +    'number_of_months'  					=> 'Number of Months',
        +    'update'  					            => 'Update Depreciation',
        +
        +);
        diff --git a/resources/lang/af/admin/depreciations/message.php b/resources/lang/af/admin/depreciations/message.php
        new file mode 100644
        index 0000000000..c20e52c13c
        --- /dev/null
        +++ b/resources/lang/af/admin/depreciations/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Depreciation class does not exist.',
        +    'assoc_users'	 => 'This depreciation is currently associated with one or more models and cannot be deleted. Please delete the models, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Depreciation class was not created, please try again. :(',
        +        'success' => 'Depreciation class created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Depreciation class was not updated, please try again',
        +        'success' => 'Depreciation class updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this depreciation class?',
        +        'error'   => 'There was an issue deleting the depreciation class. Please try again.',
        +        'success' => 'The depreciation class was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/depreciations/table.php b/resources/lang/af/admin/depreciations/table.php
        new file mode 100644
        index 0000000000..5ba01d132c
        --- /dev/null
        +++ b/resources/lang/af/admin/depreciations/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'id'      => 'ID',
        +    'months'   => 'Months',
        +    'term'   => 'Term',
        +    'title'      => 'Name ',
        +
        +);
        diff --git a/resources/lang/af/admin/groups/message.php b/resources/lang/af/admin/groups/message.php
        new file mode 100644
        index 0000000000..f14b6339e8
        --- /dev/null
        +++ b/resources/lang/af/admin/groups/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'group_exists'        => 'Group already exists!',
        +    'group_not_found'     => 'Group [:id] does not exist.',
        +    'group_name_required' => 'The name field is required',
        +
        +    'success' => array(
        +        'create' => 'Group was successfully created.',
        +        'update' => 'Group was successfully updated.',
        +        'delete' => 'Group was successfully deleted.',
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this group?',
        +        'create' => 'There was an issue creating the group. Please try again.',
        +        'update' => 'There was an issue updating the group. Please try again.',
        +        'delete' => 'There was an issue deleting the group. Please try again.',
        +    ),
        +
        +);
        diff --git a/resources/lang/af/admin/groups/table.php b/resources/lang/af/admin/groups/table.php
        new file mode 100644
        index 0000000000..61f060a116
        --- /dev/null
        +++ b/resources/lang/af/admin/groups/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +
        +return array(
        +
        +    'id'         => 'Id',
        +    'name'       => 'Name',
        +    'users'      => '# of Users',
        +
        +);
        diff --git a/resources/lang/af/admin/groups/titles.php b/resources/lang/af/admin/groups/titles.php
        new file mode 100644
        index 0000000000..99e8cc1f6f
        --- /dev/null
        +++ b/resources/lang/af/admin/groups/titles.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +return array(
        +    'about_groups_title'            => 'About Groups',
        +    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'group_management' 	 	=> 'Group Management',
        +    'create' 	 	 	    => 'Create New Group',
        +    'update' 	 		        => 'Edit Group',
        +    'group_name' 	 		=> 'Group Name',
        +    'group_admin' 	 		=> 'Group Admin',
        +    'allow' 	 			=> 'Allow',
        +    'deny' 	 				=> 'Deny',
        +
        +);
        diff --git a/resources/lang/af/admin/hardware/form.php b/resources/lang/af/admin/hardware/form.php
        new file mode 100644
        index 0000000000..abded281fa
        --- /dev/null
        +++ b/resources/lang/af/admin/hardware/form.php
        @@ -0,0 +1,42 @@
        +<?php
        +
        +return array(
        +	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +  'bulk_delete_help'	=> 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
        +  'bulk_delete_warn'	=> 'You are about to delete :asset_count assets.',
        +	'bulk_update'		=> 'Bulk Update Assets',
        +	'bulk_update_help'	=> 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
        +	'bulk_update_warn'	=> 'You are about to edit the properties of :asset_count assets.',
        +    'checkedout_to'		=> 'Checked Out To',
        +    'checkout_date'		=> 'Checkout Date',
        +    'checkin_date'		=> 'Checkin Date',
        +    'checkout_to'		=> 'Checkout to',
        +    'cost'				=> 'Purchase Cost',
        +    'create'			=> 'Create Asset',
        +    'date'				=> 'Purchase Date',
        +    'depreciates_on'	=> 'Depreciates On',
        +    'default_location'	=> 'Default Location',
        +    'eol_date'			=> 'EOL Date',
        +    'eol_rate'			=> 'EOL Rate',
        +    'expected_checkin'  => 'Expected Checkin Date',
        +    'expires'			=> 'Expires',
        +    'fully_depreciated'	=> 'Fully Depreciated',
        +    'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
        +    'mac_address'		=> 'MAC Address',
        +    'manufacturer'		=> 'Manufacturer',
        +    'model'				=> 'Model',
        +    'months'			=> 'months',
        +    'name'				=> 'Asset Name',
        +    'notes'				=> 'Notes',
        +    'order'				=> 'Order Number',
        +    'qr'				=> 'QR Code',
        +    'requestable'		=> 'Users may request this asset',
        +    'select_statustype'	=> 'Select Status Type',
        +    'serial'			=> 'Serial',
        +    'status'			=> 'Status',
        +    'tag'				=> 'Asset Tag',
        +    'update'			=> 'Asset Update',
        +    'warranty'			=> 'Warranty',
        +    'years'				=> 'years',
        +)
        +;
        diff --git a/resources/lang/af/admin/hardware/general.php b/resources/lang/af/admin/hardware/general.php
        new file mode 100644
        index 0000000000..1def86dc9e
        --- /dev/null
        +++ b/resources/lang/af/admin/hardware/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_assets_title'           => 'About Assets',
        +    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +	'archived'  				=> 'Archived',
        +    'asset'  					=> 'Asset',
        +    'bulk_checkout'             => 'Checkout Assets to User',
        +    'checkin'  					=> 'Checkin Asset',
        +    'checkout'  				=> 'Checkout Asset',
        +    'clone'  					=> 'Clone Asset',
        +    'deployable'  				=> 'Deployable',
        +    'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        +    'edit'  					=> 'Edit Asset',
        +	'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'model_deleted'  			=> 'This Assets model has been deleted. You must restore the model before you can restore the Asset.<br/> <a href="/hardware/models/:model_id/restore">Click here to restore the model</a>.',
        +    'requestable'               => 'Requestable',
        +    'requested'				    => 'Requested',
        +    'restore'  					=> 'Restore Asset',
        +    'pending'  					=> 'Pending',
        +    'undeployable'  			=> 'Undeployable',
        +    'view'  					=> 'View Asset',
        +);
        diff --git a/resources/lang/af/admin/hardware/message.php b/resources/lang/af/admin/hardware/message.php
        new file mode 100644
        index 0000000000..112cf77ded
        --- /dev/null
        +++ b/resources/lang/af/admin/hardware/message.php
        @@ -0,0 +1,82 @@
        +<?php
        +
        +return array(
        +
        +    'undeployable' 		=> '<strong>Warning: </strong> This asset has been marked as currently undeployable.
        +                        If this status has changed, please update the asset status.',
        +    'does_not_exist' 	=> 'Asset does not exist.',
        +    'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
        +    'assoc_users'	 	=> 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
        +
        +    'create' => array(
        +        'error'   		=> 'Asset was not created, please try again. :(',
        +        'success' 		=> 'Asset created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   			=> 'Asset was not updated, please try again',
        +        'success' 			=> 'Asset updated successfully.',
        +        'nothing_updated'	=>  'No fields were selected, so nothing was updated.',
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Asset was not restored, please try again',
        +        'success' 		=> 'Asset restored successfully.'
        +    ),
        +
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +    'import' => array(
        +        'error'                 => 'Some items did not import correctly.',
        +        'errorDetail'           => 'The following Items were not imported because of errors.',
        +        'success'               => "Your file has been imported",
        +        'file_delete_success'   => "Your file has been been successfully deleted",
        +        'file_delete_error'      => "The file was unable to be deleted",
        +    ),
        +
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this asset?',
        +        'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
        +        'success' 		=> 'The asset was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   		=> 'Asset was not checked out, please try again',
        +        'success' 		=> 'Asset checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'not_available' => 'That asset is not available for checkout!'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Asset was not checked in, please try again',
        +        'success' 		=> 'Asset checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'already_checked_in'  => 'That asset is already checked in.',
        +
        +    ),
        +
        +    'requests' => array(
        +        'error'   		=> 'Asset was not requested, please try again',
        +        'success' 		=> 'Asset requested successfully.',
        +        'canceled'      => 'Checkout request successfully canceled'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/hardware/table.php b/resources/lang/af/admin/hardware/table.php
        new file mode 100644
        index 0000000000..e8baa09d5a
        --- /dev/null
        +++ b/resources/lang/af/admin/hardware/table.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'asset_tag'   	=> 'Asset Tag',
        +    'asset_model'       => 'Model',
        +    'book_value'  	=> 'Value',
        +    'change' 		=> 'In/Out',
        +    'checkout_date' => 'Checkout Date',
        +    'checkoutto' 	=> 'Checked Out',
        +    'diff' 			=> 'Diff',
        +    'dl_csv' 		=> 'Download CSV',
        +    'eol' 			=> 'EOL',
        +    'id'      		=> 'ID',
        +    'location' 		=> 'Location',
        +    'purchase_cost'	=> 'Cost',
        +    'purchase_date'	=> 'Purchased',
        +    'serial'   		=> 'Serial',
        +    'status'   		=> 'Status',
        +    'title'      	=> 'Asset ',
        +    'image'		=> 'Device Image',
        +    'days_without_acceptance' => 'Days Without Acceptance'
        +
        +);
        diff --git a/resources/lang/af/admin/licenses/form.php b/resources/lang/af/admin/licenses/form.php
        new file mode 100644
        index 0000000000..ce29167874
        --- /dev/null
        +++ b/resources/lang/af/admin/licenses/form.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'asset'             => 'Asset',
        +    'checkin'           => 'Checkin',
        +    'create'            => 'Create License',
        +    'expiration'        => 'Expiration Date',
        +    'license_key'       => 'Product Key',
        +    'maintained'        => 'Maintained',
        +    'name'              => 'Software Name',
        +    'no_depreciation'   => 'Do Not Depreciate',
        +    'purchase_order'    => 'Purchase Order Number',
        +    'reassignable'      => 'Reassignable',
        +    'remaining_seats'   => 'Remaining Seats',
        +    'seats'             => 'Seats',
        +    'termination_date'  => 'Termination Date',
        +    'to_email'          => 'Licensed to Email',
        +    'to_name'           => 'Licensed to Name',
        +    'update'            => 'Update License',
        +    'checkout_help'     => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
        +);
        diff --git a/resources/lang/af/admin/licenses/general.php b/resources/lang/af/admin/licenses/general.php
        new file mode 100644
        index 0000000000..25a536ec56
        --- /dev/null
        +++ b/resources/lang/af/admin/licenses/general.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'checkin'  					=> 'Checkin License Seat',
        +    'checkout_history'  		=> 'Checkout History',
        +    'checkout'  				=> 'Checkout License Seat',
        +    'edit'  					=> 'Edit License',
        +    'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'clone'  					=> 'Clone License',
        +    'history_for'  				=> 'History for ',
        +    'in_out'  					=> 'In/Out',
        +    'info'  					=> 'License Info',
        +    'license_seats'  			=> 'License Seats',
        +    'seat'  					=> 'Seat',
        +    'seats'  					=> 'Seats',
        +    'software_licenses'  		=> 'Software Licenses',
        +    'user'  					=> 'User',
        +    'view'  					=> 'View License',
        +);
        diff --git a/resources/lang/af/admin/licenses/message.php b/resources/lang/af/admin/licenses/message.php
        new file mode 100644
        index 0000000000..d5dbfe77b9
        --- /dev/null
        +++ b/resources/lang/af/admin/licenses/message.php
        @@ -0,0 +1,50 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'License does not exist.',
        +    'user_does_not_exist' => 'User does not exist.',
        +    'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
        +    'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
        +    'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'License was not created, please try again.',
        +        'success' => 'License created successfully.'
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'License was not updated, please try again',
        +        'success' => 'License updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this license?',
        +        'error'   => 'There was an issue deleting the license. Please try again.',
        +        'success' => 'The license was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   => 'There was an issue checking out the license. Please try again.',
        +        'success' => 'The license was checked out successfully'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   => 'There was an issue checking in the license. Please try again.',
        +        'success' => 'The license was checked in successfully'
        +    ),
        +
        +);
        diff --git a/resources/lang/af/admin/licenses/table.php b/resources/lang/af/admin/licenses/table.php
        new file mode 100644
        index 0000000000..dfce4136cb
        --- /dev/null
        +++ b/resources/lang/af/admin/licenses/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'assigned_to'   	=> 'Assigned To',
        +    'checkout'   		=> 'In/Out',
        +    'id'      			=> 'ID',
        +    'license_email'   	=> 'License Email',
        +    'license_name'   	=> 'Licensed To',
        +    'purchase_date'   	=> 'Purchase Date',
        +    'purchased'   		=> 'Purchased',
        +    'seats'   			=> 'Seats',
        +    'hardware'   		=> 'Hardware',
        +    'serial'   			=> 'Serial',
        +    'title'      		=> 'License',
        +
        +);
        diff --git a/resources/lang/af/admin/locations/message.php b/resources/lang/af/admin/locations/message.php
        new file mode 100644
        index 0000000000..3ba1eed3b6
        --- /dev/null
        +++ b/resources/lang/af/admin/locations/message.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Location does not exist.',
        +    'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
        +    'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
        +    'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Location was not created, please try again.',
        +        'success' => 'Location created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Location was not updated, please try again',
        +        'success' => 'Location updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this location?',
        +        'error'   => 'There was an issue deleting the location. Please try again.',
        +        'success' => 'The location was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/locations/table.php b/resources/lang/af/admin/locations/table.php
        new file mode 100644
        index 0000000000..ffa69307d5
        --- /dev/null
        +++ b/resources/lang/af/admin/locations/table.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_locations_title'     => 'About Locations',
        +    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'assets_checkedout'         => 'Assets Assigned',
        +    'id'                        => 'ID',
        +    'city'                      => 'City',
        +    'state'                     => 'State',
        +    'country'                   => 'Country',
        +    'create'                    => 'Create Location',
        +    'update'                    => 'Update Location',
        +    'name'                      => 'Location Name',
        +    'address'                   => 'Address',
        +    'zip'                       => 'Postal Code',
        +    'locations'                 => 'Locations',
        +    'parent'                    => 'Parent',
        +    'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
        +    );
        diff --git a/resources/lang/af/admin/manufacturers/message.php b/resources/lang/af/admin/manufacturers/message.php
        new file mode 100644
        index 0000000000..6586d2af44
        --- /dev/null
        +++ b/resources/lang/af/admin/manufacturers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Manufacturer does not exist.',
        +    'assoc_users'	 => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Manufacturer was not created, please try again.',
        +        'success' => 'Manufacturer created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Manufacturer was not updated, please try again',
        +        'success' => 'Manufacturer updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this manufacturer?',
        +        'error'   => 'There was an issue deleting the manufacturer. Please try again.',
        +        'success' => 'The Manufacturer was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/manufacturers/table.php b/resources/lang/af/admin/manufacturers/table.php
        new file mode 100644
        index 0000000000..4e3ea9904d
        --- /dev/null
        +++ b/resources/lang/af/admin/manufacturers/table.php
        @@ -0,0 +1,16 @@
        +<?php
        +
        +return array(
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
        +    'asset_manufacturers'	=> 'Asset Manufacturers',
        +    'create'				=> 'Create Manufacturer',
        +    'id'   					=> 'ID',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
        +    'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
        +
        +);
        diff --git a/resources/lang/af/admin/models/general.php b/resources/lang/af/admin/models/general.php
        new file mode 100644
        index 0000000000..e0da09f780
        --- /dev/null
        +++ b/resources/lang/af/admin/models/general.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'about_models_title'     => 'About Asset Models',
        +    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'deleted'  					        => 'This model has been deleted. <a href="/hardware/models/:model_id/restore">Click here to restore it</a>.',
        +    'restore'                   => 'Restore Model',
        +    'requestable'               => 'Users may request this model',
        +	'show_mac_address'			      => 'Show MAC address field in assets in this model',
        +    'view_deleted'              => 'View Deleted',
        +    'view_models'               => 'View Models',
        +    'fieldset'                  => 'Fieldset',
        +    'no_custom_field'           => 'No custom fields',
        +
        +);
        diff --git a/resources/lang/af/admin/models/message.php b/resources/lang/af/admin/models/message.php
        new file mode 100644
        index 0000000000..5b1b9a1a1b
        --- /dev/null
        +++ b/resources/lang/af/admin/models/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Model does not exist.',
        +    'assoc_users'	 => 'This model is currently associated with one or more assets and cannot be deleted. Please delete the assets, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Model was not created, please try again.',
        +        'success' => 'Model created successfully.',
        +        'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Model was not updated, please try again',
        +        'success' => 'Model updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this asset model?',
        +        'error'   => 'There was an issue deleting the model. Please try again.',
        +        'success' => 'The model was deleted successfully.'
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Model was not restored, please try again',
        +        'success' 		=> 'Model restored successfully.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
        +);
        diff --git a/resources/lang/af/admin/models/table.php b/resources/lang/af/admin/models/table.php
        new file mode 100644
        index 0000000000..11a512b3d3
        --- /dev/null
        +++ b/resources/lang/af/admin/models/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'create'				=> 'Create Asset Model',
        +    'created_at' 			=> 'Created at',
        +    'eol'	 				=> 'EOL',
        +    'modelnumber'   		=> 'Model No.',
        +    'name'      			=> 'Asset Model Name',
        +    'numassets' 			=> 'Assets',
        +    'title'					=> 'Asset Models',
        +    'update'				=> 'Update Asset Model',
        +    'view'					=> 'View Asset Model',
        +    'update'				=> 'Update Asset Model',
        +    'clone'				=> 'Clone Model',
        +    'edit'				=> 'Edit Model',
        +);
        diff --git a/resources/lang/af/admin/reports/general.php b/resources/lang/af/admin/reports/general.php
        new file mode 100644
        index 0000000000..b03b97546f
        --- /dev/null
        +++ b/resources/lang/af/admin/reports/general.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'info'   => 'Select the options you want for your asset report.'
        +);
        diff --git a/resources/lang/af/admin/reports/message.php b/resources/lang/af/admin/reports/message.php
        new file mode 100644
        index 0000000000..d4c8f8198f
        --- /dev/null
        +++ b/resources/lang/af/admin/reports/message.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'error'   => 'You must select at least ONE option.'
        +);
        diff --git a/resources/lang/af/admin/settings/general.php b/resources/lang/af/admin/settings/general.php
        new file mode 100644
        index 0000000000..73fd052a58
        --- /dev/null
        +++ b/resources/lang/af/admin/settings/general.php
        @@ -0,0 +1,148 @@
        +<?php
        +
        +return array(
        +    'ad'				        => 'Active Directory',
        +    'ad_domain'				    => 'Active Directory domain',
        +    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        +    'is_ad'				        => 'This is an Active Directory server',
        +	'alert_email'				=> 'Send alerts to',
        +	'alerts_enabled'			=> 'Alerts Enabled',
        +	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        +	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
        +	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
        +	'auto_increment_prefix'		=> 'Prefix (optional)',
        +	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        +	'backups'					=> 'Backups',
        +	'barcode_settings'			=> 'Barcode Settings',
        +    'confirm_purge'			    => 'Confirm Purge',
        +    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        +	'custom_css'				=> 'Custom CSS',
        +	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
        +	'default_currency'  		=> 'Default Currency',
        +	'default_eula_text'			=> 'Default EULA',
        +  'default_language'					=> 'Default Language',
        +	'default_eula_help_text'	=> 'You can also associate custom EULAs to specific asset categories.',
        +    'display_asset_name'        => 'Display Asset Name',
        +    'display_checkout_date'     => 'Display Checkout Date',
        +    'display_eol'               => 'Display EOL in table view',
        +    'display_qr'                => 'Display Square Codes',
        +	'display_alt_barcode'		=> 'Display 1D barcode',
        +	'barcode_type'				=> '2D Barcode Type',
        +	'alt_barcode_type'			=> '1D barcode type',
        +    'eula_settings'				=> 'EULA Settings',
        +    'eula_markdown'				=> 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'general_settings'			=> 'General Settings',
        +	'generate_backup'			=> 'Generate Backup',
        +    'header_color'              => 'Header Color',
        +    'info'                      => 'These settings let you customize certain aspects of your installation.',
        +    'laravel'                   => 'Laravel Version',
        +    'ldap_enabled'              => 'LDAP enabled',
        +    'ldap_integration'          => 'LDAP Integration',
        +    'ldap_settings'             => 'LDAP Settings',
        +    'ldap_server'               => 'LDAP Server',
        +    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        +	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
        +	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
        +	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        +    'ldap_tls'                  => 'Use TLS',
        +    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        +    'ldap_uname'                => 'LDAP Bind Username',
        +    'ldap_pword'                => 'LDAP Bind Password',
        +    'ldap_basedn'               => 'Base Bind DN',
        +    'ldap_filter'               => 'LDAP Filter',
        +    'ldap_pw_sync'              => 'LDAP Password Sync',
        +    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_username_field'       => 'Username Field',
        +    'ldap_lname_field'          => 'Last Name',
        +    'ldap_fname_field'          => 'LDAP First Name',
        +    'ldap_auth_filter_query'    => 'LDAP Authentication query',
        +    'ldap_version'              => 'LDAP Version',
        +    'ldap_active_flag'          => 'LDAP Active Flag',
        +    'ldap_emp_num'              => 'LDAP Employee Number',
        +    'ldap_email'                => 'LDAP Email',
        +    'load_remote_text'          => 'Remote Scripts',
        +    'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
        +    'logo'                    	=> 'Logo',
        +    'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
        +    'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        +    'optional'					=> 'optional',
        +    'per_page'                  => 'Results Per Page',
        +    'php'                       => 'PHP Version',
        +    'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
        +    'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
        +    'qr_help'                   => 'Enable QR Codes first to set this',
        +    'qr_text'                   => 'QR Code Text',
        +    'setting'                   => 'Setting',
        +    'settings'                  => 'Settings',
        +    'site_name'                 => 'Site Name',
        +    'slack_botname'             => 'Slack Botname',
        +    'slack_channel'             => 'Slack Channel',
        +    'slack_endpoint'            => 'Slack Endpoint',
        +    'slack_integration'         => 'Slack Settings',
        +    'slack_integration_help'    => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new">create an incoming webhook</a> on your Slack account.',
        +    'snipe_version'  			=> 'Snipe-IT version',
        +    'system'                    => 'System Information',
        +    'update'                    => 'Update Settings',
        +    'value'                     => 'Value',
        +    'brand'                     => 'Branding',
        +    'about_settings_title'      => 'About Settings',
        +    'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
        +    'labels_per_page'           => 'Labels per page',
        +    'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Page margins (inches)',
        +    'purge'                    => 'Purge Deleted Records',
        +    'labels_display_bgutter'    => 'Label bottom gutter',
        +    'labels_display_sgutter'    => 'Label side gutter',
        +    'labels_fontsize'           => 'Label font size',
        +    'labels_pagewidth'          => 'Label sheet width',
        +    'labels_pageheight'         => 'Label sheet height',
        +    'label_gutters'        => 'Label spacing (inches)',
        +    'page_dimensions'        => 'Page dimensions (inches)',
        +    'label_fields'          => 'Label visible fields',
        +    'inches'        => 'inches',
        +    'width_w'        => 'w',
        +    'height_h'        => 'h',
        +    'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Two Factor Authentication',
        +    'two_factor_secret'        => 'Two-Factor Code',
        +    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        +    'two_factor_enabled_text'        => 'Enable Two Factor',
        +    'two_factor_reset'        => 'Reset Two-Factor Secret',
        +    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        +    'two_factor_reset_success'          => 'Two factor device successfully reset',
        +    'two_factor_reset_error'          => 'Two factor device reset failed',
        +    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        +    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        +    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_required'        => 'Required for all users',
        +    'two_factor_disabled'        => 'Disabled',
        +    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        +    'two_factor_config_complete'	=> 'Submit Code',
        +    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        +    'require_accept_signature'      => 'Require Signature',
        +    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'left'        => 'left',
        +    'right'        => 'right',
        +    'top'        => 'top',
        +    'bottom'        => 'bottom',
        +    'vertical'        => 'vertical',
        +    'horizontal'        => 'horizontal',
        +    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +);
        diff --git a/resources/lang/af/admin/settings/message.php b/resources/lang/af/admin/settings/message.php
        new file mode 100644
        index 0000000000..736d5c3e9e
        --- /dev/null
        +++ b/resources/lang/af/admin/settings/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +
        +    'update' => array(
        +        'error'                 => 'An error has occurred while updating. ',
        +        'success'               => 'Settings updated successfully.'
        +    ),
        +    'backup' => array(
        +        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        +        'file_deleted'          => 'The backup file was successfully deleted. ',
        +        'generated'             => 'A new backup file was successfully created.',
        +        'file_not_found'        => 'That backup file could not be found on the server.',
        +    ),
        +    'purge' => array(
        +        'error'     => 'An error has occurred while purging. ',
        +        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        +        'success'               => 'Deleted records successfully purged.'
        +    ),
        +
        +);
        diff --git a/resources/lang/af/admin/statuslabels/message.php b/resources/lang/af/admin/statuslabels/message.php
        new file mode 100644
        index 0000000000..619a5a509c
        --- /dev/null
        +++ b/resources/lang/af/admin/statuslabels/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Status Label does not exist.',
        +    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Status Label was not created, please try again.',
        +        'success' => 'Status Label created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Status Label was not updated, please try again',
        +        'success' => 'Status Label updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        +        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        +        'success' => 'The Status Label was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/statuslabels/table.php b/resources/lang/af/admin/statuslabels/table.php
        new file mode 100644
        index 0000000000..b9b5b7ec4e
        --- /dev/null
        +++ b/resources/lang/af/admin/statuslabels/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about'      	=> 'About Status Labels',
        +    'archived'      	=> 'Archived',
        +    'create'      	=> 'Create Status Label',
        +    'color'      	=> 'Chart Color',
        +    'deployable'      	=> 'Deployable',
        +    'info'      	=> 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
        +    'name'      	=> 'Status Name',
        +    'pending'      	=> 'Pending',
        +    'status_type'   => 'Status Type',
        +    'show_in_nav'   => 'Show in side nav',
        +    'title'      	=> 'Status Labels',
        +    'undeployable'  => 'Undeployable',
        +    'update'      	=> 'Update Status Label',
        +);
        diff --git a/resources/lang/af/admin/suppliers/message.php b/resources/lang/af/admin/suppliers/message.php
        new file mode 100644
        index 0000000000..df4bc41af3
        --- /dev/null
        +++ b/resources/lang/af/admin/suppliers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Supplier does not exist.',
        +    'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Supplier was not created, please try again.',
        +        'success' => 'Supplier created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Supplier was not updated, please try again',
        +        'success' => 'Supplier updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this supplier?',
        +        'error'   => 'There was an issue deleting the supplier. Please try again.',
        +        'success' => 'Supplier was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/af/admin/suppliers/table.php b/resources/lang/af/admin/suppliers/table.php
        new file mode 100644
        index 0000000000..2a7b07ca93
        --- /dev/null
        +++ b/resources/lang/af/admin/suppliers/table.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +    'about_suppliers_title' => 'About Suppliers',
        +    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'address'               => 'Supplier Address',
        +    'assets'                => 'Assets',
        +    'city'                  => 'City',
        +    'contact'               => 'Contact Name',
        +    'country'               => 'Country',
        +    'create'                => 'Create Supplier',
        +    'email'                 => 'Email',
        +    'fax'                   => 'Fax',
        +    'id'                    => 'ID',
        +    'licenses'              => 'Licenses',
        +    'name'                  => 'Supplier Name',
        +    'notes'                 => 'Notes',
        +    'phone'                 => 'Phone',
        +    'state'                 => 'State',
        +    'suppliers'             => 'Suppliers',
        +    'update'                => 'Update Supplier',
        +    'url'                   => 'URL',
        +    'view'                  => 'View Supplier',
        +    'view_assets_for'       => 'View Assets for',
        +    'zip'                   => 'Postal Code',
        +
        +);
        diff --git a/resources/lang/af/admin/users/general.php b/resources/lang/af/admin/users/general.php
        new file mode 100644
        index 0000000000..985138d065
        --- /dev/null
        +++ b/resources/lang/af/admin/users/general.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +
        +return array(
        +
        +    'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
        +    'current_assets'    => 'Assets currently checked out to this user',
        +    'clone'             => 'Clone User',
        +    'contact_user'      => 'Contact :name',
        +    'edit'              => 'Edit User',
        +    'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
        +    'last_login'        => 'Last Login',
        +    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'software_user'     => 'Software Checked out to :name',
        +    'view_user'         => 'View User :name',
        +    'usercsv'           => 'CSV file',
        +    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        +    'two_factor_enrolled' => '2FA Device Enrolled ',
        +    'two_factor_active'   => '2FA Active ',
        +    );
        diff --git a/resources/lang/af/admin/users/message.php b/resources/lang/af/admin/users/message.php
        new file mode 100644
        index 0000000000..8ee552afab
        --- /dev/null
        +++ b/resources/lang/af/admin/users/message.php
        @@ -0,0 +1,59 @@
        +<?php
        +
        +return array(
        +
        +    'accepted'                  => 'You have successfully accepted this asset.',
        +    'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
        +    'user_exists'               => 'User already exists!',
        +    'user_not_found'            => 'User [:id] does not exist.',
        +    'user_login_required'       => 'The login field is required',
        +    'user_password_required'    => 'The password is required.',
        +    'insufficient_permissions'  => 'Insufficient Permissions.',
        +    'user_deleted_warning'      => 'This user has been deleted. You will have to restore this user to edit them or assign them new assets.',
        +    'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
        +
        +
        +    'success' => array(
        +        'create'    => 'User was successfully created.',
        +        'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
        +        'delete'    => 'User was successfully deleted.',
        +        'ban'       => 'User was successfully banned.',
        +        'unban'     => 'User was successfully unbanned.',
        +        'suspend'   => 'User was successfully suspended.',
        +        'unsuspend' => 'User was successfully unsuspended.',
        +        'restored'  => 'User was successfully restored.',
        +        'import'    => 'Users imported successfully.',
        +    ),
        +
        +    'error' => array(
        +        'create' => 'There was an issue creating the user. Please try again.',
        +        'update' => 'There was an issue updating the user. Please try again.',
        +        'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
        +        'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
        +        'import'    => 'There was an issue importing users. Please try again.',
        +        'asset_already_accepted' => 'This asset has already been accepted.',
        +        'accept_or_decline' => 'You must either accept or decline this asset.',
        +        'incorrect_user_accepted' => 'The asset you have attempted to accept was not checked out to you.',
        +        'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
        +        'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +);
        diff --git a/resources/lang/af/admin/users/table.php b/resources/lang/af/admin/users/table.php
        new file mode 100644
        index 0000000000..9bbe883e19
        --- /dev/null
        +++ b/resources/lang/af/admin/users/table.php
        @@ -0,0 +1,38 @@
        +<?php
        +
        +return array(
        +    'activated'  			=> 'Active',
        +    'allow'  				=> 'Allow',
        +    'checkedout'  			=> 'Assets',
        +    'created_at' 			=> 'Created',
        +    'createuser' 			=> 'Create User',
        +    'deny'  				=> 'Deny',
        +    'email'      			=> 'Email',
        +    'employee_num'      	=> 'Employee No.',
        +    'first_name' 			=> 'First Name',
        +    'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        +    'id'         			=> 'Id',
        +    'inherit'  				=> 'Inherit',
        +    'job' 					=> 'Job Title',
        +    'last_login'  			=> 'Last Login',
        +    'last_name'  			=> 'Last Name',
        +    'location'  			=> 'Location',
        +    'lock_passwords'		=> 'Login details cannot be changed on this installation.',
        +    'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
        +    'name' 					=> 'Name',
        +    'notes'                 => 'Notes',
        +    'password_confirm' 		=> 'Confirm Password',
        +    'password' 				=> 'Password',
        +    'phone'  				=> 'Phone',
        +    'show_current'          => 'Show Current Users',
        +    'show_deleted'          => 'Show Deleted Users',
        +    'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
        +    'updateuser' 			=> 'Update User',
        +    'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
        +    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        +    'cloneuser'             => 'Clone User',
        +    'viewusers' 			=> 'View Users',
        +);
        diff --git a/resources/lang/af/auth/general.php b/resources/lang/af/auth/general.php
        new file mode 100644
        index 0000000000..bf88cba77a
        --- /dev/null
        +++ b/resources/lang/af/auth/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return [
        +    'send_password_link'	        => 'Send Password Reset Link',
        +    'email_reset_password'			=> 'Email Password Reset',
        +    'reset_password'			    => 'Reset Password',
        +    'login'                         => 'Login',
        +    'login_prompt'                  => 'Please Login',
        +    'forgot_password'               => 'I forgot my password',
        +    'remember_me'                   => 'Remember Me',
        +    ];
        +
        diff --git a/resources/lang/af/auth/message.php b/resources/lang/af/auth/message.php
        new file mode 100644
        index 0000000000..bebf9cdd48
        --- /dev/null
        +++ b/resources/lang/af/auth/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'account_already_exists' => 'An account with the this email already exists.',
        +    'account_not_found'      => 'The username or password is incorrect.',
        +    'account_not_activated'  => 'This user account is not activated.',
        +    'account_suspended'      => 'This user account is suspended.',
        +    'account_banned'         => 'This user account is banned.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
        +
        +    'signin' => array(
        +        'error'   => 'There was a problem while trying to log you in, please try again.',
        +        'success' => 'You have successfully logged in.',
        +    ),
        +
        +    'signup' => array(
        +        'error'   => 'There was a problem while trying to create your account, please try again.',
        +        'success' => 'Account sucessfully created.',
        +    ),
        +
        +        'forgot-password' => array(
        +            'error'   => 'There was a problem while trying to get a reset password code, please try again.',
        +            'success' => 'Password recovery email successfully sent.',
        +        ),
        +
        +        'forgot-password-confirm' => array(
        +            'error'   => 'There was a problem while trying to reset your password, please try again.',
        +            'success' => 'Your password has been successfully reset.',
        +        ),
        +
        +    'activate' => array(
        +        'error'   => 'There was a problem while trying to activate your account, please try again.',
        +        'success' => 'Your account has been successfully activated.',
        +    ),
        +
        +);
        diff --git a/resources/lang/af/button.php b/resources/lang/af/button.php
        new file mode 100644
        index 0000000000..6964689762
        --- /dev/null
        +++ b/resources/lang/af/button.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'actions' 	                => 'Actions',
        +    'add'    	                => 'Add New',
        +    'cancel'                    => 'Cancel',
        +    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'delete'  	                => 'Delete',
        +    'edit'    	                => 'Edit',
        +    'restore' 	                => 'Restore',
        +    'request'                   => 'Request',
        +    'submit'  	                => 'Submit',
        +    'upload'                    => 'Upload',
        +	'select_file'				=> 'Select File...',
        +);
        diff --git a/resources/lang/af/general.php b/resources/lang/af/general.php
        new file mode 100644
        index 0000000000..eb6409ddbb
        --- /dev/null
        +++ b/resources/lang/af/general.php
        @@ -0,0 +1,204 @@
        +<?php
        +
        +    return [
        +    'accessories'			=> 'Accessories',
        +    'activated'			=> 'Activated',
        +    'accessory'				=> 'Accessory',
        +    'accessory_report'			=> 'Accessory Report',
        +    'action'                => 'Action',
        +    'activity_report'		=> 'Activity Report',
        +    'address'				=> 'Address',
        +    'admin'					=> 'Admin',
        +    'add_seats'     => 'Added seats',
        +    'all_assets'			=> 'All Assets',
        +    'all'       			=> 'All',
        +    'archived'              => 'Archived',
        +    'asset_models'			=> 'Asset Models',
        +    'asset'					=> 'Asset',
        +    'asset_report'          => 'Asset Report',
        +    'asset_tag'				=> 'Asset Tag',
        +    'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
        +    'assets'				=> 'Assets',
        +    'avatar_delete'         => 'Delete Avatar',
        +    'avatar_upload'         => 'Upload Avatar',
        +    'back'      			=> 'Back',
        +    'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'cancel'  				=> 'Cancel',
        +    'categories'			=> 'Categories',
        +    'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
        +    'changeemail'  			=> 'Change Email Address',
        +    'changepassword'  		=> 'Change Password',
        +    'checkin'  				=> 'Checkin',
        +    'checkin_from'  		=> 'Checkin from',
        +    'checkout'  			=> 'Checkout',
        +    'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
        +    'companies'			=> 'Companies',
        +    'company'				=> 'Company',
        +    'component'			=> 'Component',
        +    'components'			=> 'Components',
        +	'complete'				=> 'Complete',
        +    'consumable'			=> 'Consumable',
        +    'consumables'			=> 'Consumables',
        +    'country'  				=> 'Country',
        +    'create'				=> 'Create New',
        +    'created'               => 'Item Created',
        +    'created_asset'			=> 'created asset',
        +    'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
        +    'currency'  			=> '$', // this is deprecated
        +    'current'  				=> 'Current',
        +    'custom_report'         => 'Custom Asset Report',
        +    'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
        +    'date'					=> 'Date',
        +    'debug_warning'         => 'Warning!',
        +    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'delete'  				=> 'Delete',
        +    'deleted'  				=> 'Deleted',
        +    'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
        +    'deployed'				=> 'Deployed',
        +    'depreciation_report'	=> 'Depreciation Report',
        +    'download'				=> 'Download',
        +    'depreciation'			=> 'Depreciation',
        +    'editprofile'  			=> 'Edit Your Profile',
        +    'eol'					=> 'EOL',
        +    'email_domain'			=> 'Email Domain',
        +    'email_format'			=> 'Email Format',
        +    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        +    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'first'					=> 'First',
        +    'first_name'			=> 'First Name',
        +    'first_name_format'		=> 'First Name (jane@example.com)',
        +    'file_name'				=> 'File',
        +    'file_uploads'			=> 'File Uploads',
        +    'generate'				=> 'Generate',
        +    'groups'				=> 'Groups',
        +    'gravatar_email'        => 'Gravatar Email Address',
        +    'history'  			    => 'History',
        +    'history_for'  			=> 'History for',
        +    'id'  					=> 'ID',
        +    'image_delete'         	=> 'Delete Image',
        +    'image_upload'         	=> 'Upload Image',
        +    'import'         	    => 'Import',
        +    'import-history'        => 'Import History',
        +    'asset_maintenance'        => 'Asset Maintenance',
        +    'asset_maintenance_report' => 'Asset Maintenance Report',
        +    'asset_maintenances'       => 'Asset Maintenances',
        +    'item'  				=> 'Item',
        +    'insufficient_permissions' => 'Insufficient permissions!',
        +    'language'				=> 'Language',
        +    'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
        +    'last_name'             => 'Last Name',
        +    'license'				=> 'License',
        +    'license_report'        => 'License Report',
        +    'licenses_available'	=> 'licenses available',
        +    'licenses'				=> 'Licenses',
        +    'list_all'				=> 'List All',
        +    'loading'				=> 'Loading',
        +    'lock_passwords'        => 'This field cannot be edited in this installation.',
        +    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'location'              => 'Location',
        +    'locations'				=> 'Locations',
        +    'logout'				=> 'Logout',
        +    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'manufacturer'			=> 'Manufacturer',
        +    'manufacturers'			=> 'Manufacturers',
        +    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'min_amt'				=> 'Min. QTY',
        +    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'model_no'				=> 'Model No.',
        +    'months'				=> 'months',
        +    'moreinfo'				=> 'More Info',
        +    'name'					=> 'Name',
        +    'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'new!',
        +    'no_depreciation'		=> 'No Depreciation',
        +    'no_results'			=> 'No Results.',
        +    'no'  					=> 'No',
        +    'notes'  				=> 'Notes',
        +    'order_number'          => 'Order Number',
        +    'page_menu'				=> 'Showing _MENU_ items',
        +    'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
        +    'pending'				=> 'Pending',
        +    'people'				=> 'People',
        +    'per_page'				=> 'Results Per Page',
        +    'previous'				=> 'Previous',
        +    'processing'			=> 'Processing',
        +    'profile'				=> 'Your profile',
        +    'purchase_cost'                              => 'Purchase Cost',
        +    'purchase_date'         => 'Purchase Date',
        +    'qty'		            => 'QTY',
        +    'quantity'		        => 'Quantity',
        +    'ready_to_deploy'		=> 'Ready to Deploy',
        +    'recent_activity'		=> 'Recent Activity',
        +    'remove_company'        => 'Remove Company Association',
        +    'reports'				=> 'Reports',
        +    'requested'				=> 'Requested',
        +    'request_canceled'      => 'Request Canceled',
        +    'save'  				=> 'Save',
        +    'select'				=> 'Select',
        +    'search'				=> 'Search',
        +    'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
        +    'select_depreciation'	=> 'Select a Depreciation Type',
        +    'select_location'		=> 'Select a Location',
        +    'select_manufacturer'	=> 'Select a Manufacturer',
        +    'select_model'			=> 'Select a Model',
        +    'select_supplier'		=> 'Select a Supplier',
        +    'select_user'			=> 'Select a User',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
        +    'select_statuslabel'	=> 'Select Status',
        +    'select_company'    	=> 'Select Company',
        +    'select_asset'    		=> 'Select Asset',
        +    'settings'				=> 'Settings',
        +    'sign_in'				=> 'Sign in',
        +    'signature'             => 'Signature',
        +    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'site_name'				=> 'Site Name',
        +    'state'  				=> 'State',
        +    'status_labels'			=> 'Status Labels',
        +    'status'    			=> 'Status',
        +    'supplier'              => 'Supplier',
        +    'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
        +    'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
        +    'total_assets'			=> 'total assets',
        +    'total_licenses'		=> 'total licenses',
        +    'total_accessories'		=> 'total accessories',
        +    'total_consumables'		=> 'total consumables',
        +    'type'  				=> 'Type',
        +    'undeployable'			=> 'Un-deployable',
        +    'unknown_admin'			=> 'Unknown Admin',
        +    'username_format'		=> 'Username Format',
        +    'update'                => 'Update',
        +    'uploaded'              => 'Uploaded',
        +    'user'					=> 'User',
        +    'accepted'			    => 'accepted',
        +    'declined'			    => 'declined',
        +    'unaccepted_asset_report' => 'Unaccepted Assets',
        +    'users'                 => 'Users',
        +    'viewassets'  			=> 'View Assigned Assets',
        +    'website'               => 'Website',
        +    'welcome'				=> 'Welcome, :name',
        +    'years'					=> 'years',
        +    'yes' 					=> 'Yes',
        +    'zip'  					=> 'Zip',
        +    'noimage'					=> 'No image uploaded or image not found.',
        +    'token_expired'             => 'Your form session has expired. Please try again.',
        +    ];
        diff --git a/resources/lang/af/mail.php b/resources/lang/af/mail.php
        new file mode 100644
        index 0000000000..c9a4fe182d
        --- /dev/null
        +++ b/resources/lang/af/mail.php
        @@ -0,0 +1,74 @@
        +<?php
        +
        +return array(
        +    'a_user_canceled' => 'A user has canceled an item request on the website',
        +    'a_user_requested' => 'A user has requested an item on the website',
        +    'accessory_name' => 'Accessory Name:',
        +    'additional_notes' => 'Additional Notes:',
        +    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        +    'asset' => 'Asset:',
        +    'asset_name' => 'Asset Name:',
        +    'asset_requested' => 'Asset requested',
        +    'asset_tag' => 'Asset Tag:',
        +    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        +                                    expiring in the next 60 days.',
        +    'assigned_to' => 'Assigned To',
        +    'best_regards' => 'Best regards,',
        +    'canceled' => 'Canceled:',
        +    'checkin_date' => 'Checkin Date:',
        +    'checkout_date' => 'Checkout Date:',
        +    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        +    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        +    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        +    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        +    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        +    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        +    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        +    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        +    'current_QTY' => 'Current QTY',
        +    'Days' => 'Days',
        +    'days' => 'Days',
        +    'expecting_checkin_date' => 'Expected Checkin Date:',
        +    'expires' => 'Expires',
        +    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        +    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        +    'hello' => 'Hello',
        +    'hi' => 'Hi',
        +    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'item' => 'Item:',
        +    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        +                              inventory or will soon be low.',
        +    'Item_Request_Canceled' => 'Item Request Canceled',
        +    'Item_Requested' => 'Item Requested',
        +    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        +    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        +    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'login' => 'Login:',
        +    'Low_Inventory_Report' => 'Low Inventory Report',
        +    'min_QTY' => 'Min QTY',
        +    'name' => 'Name',
        +    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        +    'password' => 'Password:',
        +    'password_reset' => 'Password Reset',
        +
        +    'read_the_terms' => 'Please read the terms of use below.',
        +    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        +                         and agree to the terms of use, and have received the asset.',
        +    'requested' => 'Requested:',
        +    'reset_link' => 'Your Password Reset Link',
        +    'reset_password' => 'Click here to reset your password:',
        +    'serial' => 'Serial:',
        +    'supplier' => 'Supplier',
        +    'tag' => 'Tag',
        +    'test_email' => 'Test Email from Snipe-IT',
        +    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        +    'the_following_item' => 'The following item has been checked in: ',
        +    'There_are' => '{1} There is|[2,Inf] There are',
        +    'to_reset' => 'To reset your :web password, complete this form:',
        +    'type' => 'Type',
        +    'user' => 'User:',
        +    'username' => 'Username:',
        +    'welcome' => 'Welcome :name',
        +    'welcome_to' => 'Welcome to :web!',
        +    'your_credentials' => 'Your Snipe-IT credentials',
        +);
        diff --git a/resources/lang/af/pagination.php b/resources/lang/af/pagination.php
        new file mode 100644
        index 0000000000..b573b51e91
        --- /dev/null
        +++ b/resources/lang/af/pagination.php
        @@ -0,0 +1,20 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Pagination Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used by the paginator library to build
        +    | the simple pagination links. You are free to change them to anything
        +    | you want to customize your views to better match your application.
        +    |
        +    */
        +
        +    'previous' => '&laquo; Previous',
        +
        +    'next'     => 'Next &raquo;',
        +
        +);
        diff --git a/resources/lang/af/passwords.php b/resources/lang/af/passwords.php
        new file mode 100644
        index 0000000000..5195a9b77c
        --- /dev/null
        +++ b/resources/lang/af/passwords.php
        @@ -0,0 +1,7 @@
        +<?php
        +
        +return [
        +    'sent'	        => 'Your password link has been sent!',
        +    'user'			=> 'That user does not exist or does not have an email address associated',
        +];
        +
        diff --git a/resources/lang/af/reminders.php b/resources/lang/af/reminders.php
        new file mode 100644
        index 0000000000..e7a476e3a2
        --- /dev/null
        +++ b/resources/lang/af/reminders.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Password Reminder Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are the default lines which match reasons
        +    | that are given by the password broker for a password update attempt
        +    | has failed, such as for an invalid token or invalid new password.
        +    |
        +    */
        +
        +    "password" => "Passwords must be six characters and match the confirmation.",
        +
        +    "user"     => "Username or email address is incorrect",
        +
        +    "token"    => "This password reset token is invalid.",
        +
        +    "sent" => "If a matching email address was found, a password reminder has been sent!",
        +
        +);
        diff --git a/resources/lang/af/table.php b/resources/lang/af/table.php
        new file mode 100644
        index 0000000000..f7a49d86c1
        --- /dev/null
        +++ b/resources/lang/af/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'actions'	 	=> 'Actions',
        +    'action' 		=> 'Action',
        +    'by'      		=> 'By',
        +    'item' 			=> 'Item',
        +
        +);
        diff --git a/resources/lang/af/validation.php b/resources/lang/af/validation.php
        new file mode 100644
        index 0000000000..02cb1fa981
        --- /dev/null
        +++ b/resources/lang/af/validation.php
        @@ -0,0 +1,136 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines contain the default error messages used by
        +    | the validator class. Some of these rules have multiple versions such
        +    | such as the size rules. Feel free to tweak each of these messages.
        +    |
        +    */
        +
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Attributes
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used to swap attribute place-holders
        +    | with something more reader friendly such as E-Mail Address instead
        +    | of "email". This simply helps us make messages a little cleaner.
        +    |
        +    */
        +
        +    'attributes' => [],
        +
        +);
        diff --git a/resources/lang/ar/admin/asset_maintenances/message.php b/resources/lang/ar/admin/asset_maintenances/message.php
        index ddd49b5cfa..af80f580c4 100644
        --- a/resources/lang/ar/admin/asset_maintenances/message.php
        +++ b/resources/lang/ar/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'لم يتم إنشاء سند صيانة الأصل، الرجاء المحاولة مرة أخرى.',
                     'success' => 'تم إنشاء سند صيانة الأصل بنجاح.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'لم يكتمل بعد',
                 'warranty'                     => 'الضمان',
                 'not_warranty'                 => 'لا يوجد ضمان',
        diff --git a/resources/lang/ar/admin/asset_maintenances/table.php b/resources/lang/ar/admin/asset_maintenances/table.php
        index 63b2b4e653..187b8106c3 100644
        --- a/resources/lang/ar/admin/asset_maintenances/table.php
        +++ b/resources/lang/ar/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'صيانة الاُصل',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'اسم الأصل',
                 'is_warranty'   => 'الضمان',
                 'dl_csv'        => 'التنزيل كملف CSV'
             ];
        diff --git a/resources/lang/ar/admin/categories/general.php b/resources/lang/ar/admin/categories/general.php
        index c765eaea2a..5f7ba21746 100644
        --- a/resources/lang/ar/admin/categories/general.php
        +++ b/resources/lang/ar/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'عن التصنيفات',
        +    'about_categories'  				=> 'التصنيفات تساعدك على ترتيب الأصول. من الأمثلة على التصنيفات &quot; مكاتب &quot;، &quot;أجهزة الكمبيوتر المحمولة &quot;، &quot;الهواتف النقالة &quot;، &quot;أجهزة لوحية &quot; وهكذا، كما يمكنك استخدام التصنيفات بأي طريقة تناسبك.',
             'asset_categories' 					=> 'التصنيفات',
             'category_name'  					=> 'اسم التصنيف',
             'checkin_email'                     => 'إرسال إشعار للمستخدم عند الإدخال.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'تعديل التصنيف',
             'eula_text'							=> 'إتفاقية الإستخدام للتصنيف',
             'eula_text_help'					=> 'يسمح لك هذا الحقل بتخصيص الاتفاقيات لأنواع معينة من الأصول. اذا كنت تمتلك اتفاقية واحدة لجميع أصولك يمكنك أن تقوم بتأشير المربع في الأسفل لاستخدام الاتفاقية الافتراضية.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'مطالبة المستخدمين بتأكيد قبولهم للأصول في هذا التصنيف.',
             'required_acceptance'				=> 'سيتم اشعار المستخدم لتأكيد قبول الأصل.',
             'required_eula'						=> 'سيتم إشعار هذا المستخدم بإتفاقية الإستخدام',
        diff --git a/resources/lang/ar/admin/companies/general.php b/resources/lang/ar/admin/companies/general.php
        index 64a6a107a6..372cc1de29 100644
        --- a/resources/lang/ar/admin/companies/general.php
        +++ b/resources/lang/ar/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'حول الشركات',
        +    'about_companies_text'                  => 'يمكن للشركات أن تستخدم كحقل معرف بسيط، أو يمكن استخدامها للحد من معاينة الأصول، والمستخدمين، وما إلى ذلك إذا تم تمكين دعم الشركة الكامل في إعدادات مدير النظام.',
             'select_company' => 'اختر الشركة',
         ];
        diff --git a/resources/lang/ar/admin/consumables/general.php b/resources/lang/ar/admin/consumables/general.php
        index 187375bfeb..5028006977 100644
        --- a/resources/lang/ar/admin/consumables/general.php
        +++ b/resources/lang/ar/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> 'حول المواد الاستهلاكية',
             'about_consumables_text'  			=> 'المواد الاستهلاكية هي الأشياء المشتراة والتي ستستخدم مع مرور الوقت. على سبيل المثال، حبر الطابعة أو ورق الناسخة.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'إخراج المواد الاستهلاكية لمستخدم',
             'consumable_name'                   => 'اسم المادة الإستهلاكية',
             'create'                            => 'إنشاء مادة إستهلاكية',
             'item_no'                           => 'رقم القطعة.',
        diff --git a/resources/lang/ar/admin/custom_fields/general.php b/resources/lang/ar/admin/custom_fields/general.php
        index 40386aca0a..6efdf43651 100644
        --- a/resources/lang/ar/admin/custom_fields/general.php
        +++ b/resources/lang/ar/admin/custom_fields/general.php
        @@ -5,17 +5,17 @@ return array(
             'field'		                => 'حقل',
             'about_fieldsets_title'		=> 'حول مجموعة الحقول',
             'about_fieldsets_text'		=> 'مجموعات-الحقول تسمح لك بإنشاء مجموعات من الحقول اللتي يمكن إعادة إستخدامها مع أنواع موديل محدد.',
        -    'custom_format'             => 'Custom format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        -    'encrypted'      	        => 'Encrypted',
        +    'custom_format'             => 'صيغة مخصصة...',
        +    'encrypt_field'      	        => 'تشفير هذا الحقل في قاعدة المعلومات',
        +    'encrypt_field_help'      => 'تحذير: تشفير الحقول يجعلها غير قابلة للبحث.',
        +    'encrypted'      	        => 'مشفّر',
             'fieldset'      	        => 'مجموعة-حقول',
             'qty_fields'      	      => 'الحقول الكمية',
             'fieldsets'      	        => 'مجموعات-الحقول',
             'fieldset_name'           => 'إسم مجموعة-الحقل',
             'field_name'              => 'إسم الحقل',
        -    'field_values'            => 'Field Values',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values'            => 'قيم الحقول',
        +    'field_values_help'       => 'إضافة خيارات للإختيار، واحدة في كل سطر. أسيتم تجاهر الاسطر الفارغة عدا السطر الأول.',
             'field_element'           => 'عنصر النموذج',
             'field_element_short'     => 'عنصر',
             'field_format'            => 'صيغة',
        @@ -23,8 +23,8 @@ return array(
             'required'   		          => 'مطلوب',
             'req'   		              => 'مطلوب',
             'used_by_models'   		    => 'مستخدم في الموديلات',
        -    'order'   		            => 'Order',
        +    'order'   		            => 'طلب',
             'create_fieldset'         => 'مجموعة-حقول جديدة',
             'create_field'            => 'حقل جديد مخصص',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'value_encrypted'      	        => 'هذا الحقل مشفر في قاعدة البيانات. يمكن قرائته من قبل مدراء الإدارات فقط',
         );
        diff --git a/resources/lang/ar/admin/custom_fields/message.php b/resources/lang/ar/admin/custom_fields/message.php
        index ef1f01a0f7..87584c723e 100644
        --- a/resources/lang/ar/admin/custom_fields/message.php
        +++ b/resources/lang/ar/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'مجموعة الحقول غير موجودة',
         
                 'create' => array(
                     'error'   => 'لم يتم إنشاء مجموعة-الحقول، الرجاء المحاولة مرة اخرى.',
        diff --git a/resources/lang/ar/admin/departments/message.php b/resources/lang/ar/admin/departments/message.php
        new file mode 100644
        index 0000000000..4d4ad8eccf
        --- /dev/null
        +++ b/resources/lang/ar/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'القسم الاداري غير موجود.',
        +    'assoc_users'	 => 'هذا القسم الإداري مرتبط حاليا مع مستخدم واحد على الأقل ولا يمكن حذفه. الرجاء تحديث تفاصيل المستخدمين حيث لا تحتوي هذا القسم وحاول مرة أخرى. ',
        +    'create' => array(
        +        'error'   => 'لم يتم إنشاء القسم الإداري، الرجاء المحاولة مرة أخرى.',
        +        'success' => 'تم انشاء القسم الاداري بنجاح.'
        +    ),
        +    'update' => array(
        +        'error'   => 'لم يتم تحديث القسم الإداري، الرجاء المحاولة مرة أخرى',
        +        'success' => 'تم تحديث القسم الاداري بنجاح.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'هل أنت متأكد من رغبتك في حذف هذا القسم؟',
        +        'error'   => 'حدثت مشكلة اثناء عملية حذف القسم الاداري. الرجاء المحاولة مرة اُخرى.',
        +        'success' => 'تم حذف القسم الاداري بنجاح.'
        +    )
        +
        +);
        diff --git a/resources/lang/ar/admin/departments/table.php b/resources/lang/ar/admin/departments/table.php
        new file mode 100644
        index 0000000000..92f7df1ea8
        --- /dev/null
        +++ b/resources/lang/ar/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'رقم التعريف',
        +    'name'                      => 'اسم القسم الإداري',
        +    'manager'                   => 'المدير',
        +    'location'                  => 'الموقع',
        +    'create'                    => 'إنشاء قسم اداري',
        +    'update'                    => 'تحديث قسم اداري',
        +    );
        diff --git a/resources/lang/ar/admin/depreciations/general.php b/resources/lang/ar/admin/depreciations/general.php
        index d078643d12..93b6b09141 100644
        --- a/resources/lang/ar/admin/depreciations/general.php
        +++ b/resources/lang/ar/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'عن استهلاك الأصول',
             'about_depreciations'  					=> 'يمكنك ضبط قيمة إستهلاك الأصول لخفض الأصول على أساس القسط الثابت للاستهلاك.',
             'asset_depreciations'  					=> 'استهلاك الأصول',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'إنشاء الاستهلاك',
             'depreciation_name'  					=> 'اسم الاستهلاك',
             'number_of_months'  					=> 'عدد الأشهر',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'تحديث الاستهلاك',
         
         );
        diff --git a/resources/lang/ar/admin/groups/titles.php b/resources/lang/ar/admin/groups/titles.php
        index 44b6068b3f..68e603b4ae 100644
        --- a/resources/lang/ar/admin/groups/titles.php
        +++ b/resources/lang/ar/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'عن المجموعات',
        +    'about_groups'                  => 'تستخدم المجموعات لتعميم أذونات المستخدم.',
             'group_management' 	 	=> 'إدارة المجموعة',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'إنشاء مجموعة جديدة',
        +    'update' 	 		        => 'تعديل المجموعة',
             'group_name' 	 		=> 'اسم المجموعة',
             'group_admin' 	 		=> 'إدارة المجموعة',
             'allow' 	 			=> 'سماح',
        diff --git a/resources/lang/ar/admin/hardware/form.php b/resources/lang/ar/admin/hardware/form.php
        index abded281fa..8032e8f1c9 100644
        --- a/resources/lang/ar/admin/hardware/form.php
        +++ b/resources/lang/ar/admin/hardware/form.php
        @@ -1,35 +1,35 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        -  'bulk_delete_help'	=> 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
        -  'bulk_delete_warn'	=> 'You are about to delete :asset_count assets.',
        -	'bulk_update'		=> 'Bulk Update Assets',
        +	'bulk_delete'		=> 'تاكيد إجراء حذف متعدد للاُصول',
        +  'bulk_delete_help'	=> 'الرجاء مراجعة الأصول المعينة للحذف بالجملة أدناه. بمجرد الحذف، يمكن استعادة هذه الأصول، لكنها لن تكون مقترنة مع أي من المستخدمين اللذين تم تعيين الاصول لهم من قبل.',
        +  'bulk_delete_warn'	=> 'أنت على وشك حذف اصول asset_count: .',
        +	'bulk_update'		=> 'تحديث الاصول بالجملة',
         	'bulk_update_help'	=> 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
         	'bulk_update_warn'	=> 'You are about to edit the properties of :asset_count assets.',
             'checkedout_to'		=> 'Checked Out To',
             'checkout_date'		=> 'Checkout Date',
             'checkin_date'		=> 'Checkin Date',
             'checkout_to'		=> 'Checkout to',
        -    'cost'				=> 'Purchase Cost',
        -    'create'			=> 'Create Asset',
        -    'date'				=> 'Purchase Date',
        -    'depreciates_on'	=> 'Depreciates On',
        +    'cost'				=> 'تكلفة الشراء',
        +    'create'			=> 'إنشاء اصل',
        +    'date'				=> 'تاريخ الشراء',
        +    'depreciates_on'	=> 'تنتهي في',
             'default_location'	=> 'Default Location',
             'eol_date'			=> 'EOL Date',
             'eol_rate'			=> 'EOL Rate',
             'expected_checkin'  => 'Expected Checkin Date',
        -    'expires'			=> 'Expires',
        +    'expires'			=> 'ينتهي',
             'fully_depreciated'	=> 'Fully Depreciated',
             'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
             'mac_address'		=> 'MAC Address',
             'manufacturer'		=> 'Manufacturer',
        -    'model'				=> 'Model',
        -    'months'			=> 'months',
        -    'name'				=> 'Asset Name',
        -    'notes'				=> 'Notes',
        -    'order'				=> 'Order Number',
        -    'qr'				=> 'QR Code',
        +    'model'				=> 'موديل',
        +    'months'			=> 'أشهر',
        +    'name'				=> 'اسم الأصل',
        +    'notes'				=> 'مُلاحظات',
        +    'order'				=> 'رقم طلب الشراء',
        +    'qr'				=> 'رمز QR',
             'requestable'		=> 'Users may request this asset',
             'select_statustype'	=> 'Select Status Type',
             'serial'			=> 'Serial',
        diff --git a/resources/lang/ar/admin/hardware/general.php b/resources/lang/ar/admin/hardware/general.php
        index f7644eb730..a20df43729 100644
        --- a/resources/lang/ar/admin/hardware/general.php
        +++ b/resources/lang/ar/admin/hardware/general.php
        @@ -1,23 +1,23 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        +    'about_assets_title'           => 'حول الأصول',
             'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        -	'archived'  				=> 'Archived',
        -    'asset'  					=> 'Asset',
        +	'archived'  				=> 'مؤرشف',
        +    'asset'  					=> 'أصل',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        -    'clone'  					=> 'Clone Asset',
        -    'deployable'  				=> 'Deployable',
        +    'checkout'  				=> 'Checkout Asset',
        +    'clone'  					=> 'استنساخ الأصل',
        +    'deployable'  				=> 'قابل للنشر',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        -    'edit'  					=> 'Edit Asset',
        +    'edit'  					=> 'تعديل الاصل',
         	'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'model_deleted'  			=> 'This Assets model has been deleted. You must restore the model before you can restore the Asset.<br/> <a href="/hardware/models/:model_id/restore">Click here to restore the model</a>.',
             'requestable'               => 'Requestable',
             'requested'				    => 'Requested',
        -    'restore'  					=> 'Restore Asset',
        -    'pending'  					=> 'Pending',
        +    'restore'  					=> 'استعادة الأصل',
        +    'pending'  					=> 'معلق',
             'undeployable'  			=> 'Undeployable',
        -    'view'  					=> 'View Asset',
        +    'view'  					=> 'مشاهدة الأصل',
         );
        diff --git a/resources/lang/ar/admin/hardware/message.php b/resources/lang/ar/admin/hardware/message.php
        index d27ca91573..cef50b45f1 100644
        --- a/resources/lang/ar/admin/hardware/message.php
        +++ b/resources/lang/ar/admin/hardware/message.php
        @@ -2,20 +2,20 @@
         
         return array(
         
        -    'undeployable' 		=> '<strong>Warning: </strong> This asset has been marked as currently undeployable.
        -                        If this status has changed, please update the asset status.',
        -    'does_not_exist' 	=> 'Asset does not exist.',
        +    'undeployable' 		=> '<strong>تحذير: </strong> هذا الأصل معلم كـ غير قابل للنشر.
        +إذا لم يتغير هذا الوضع، يرجى تحديث الحالة الأصول.',
        +    'does_not_exist' 	=> 'الأصل غير موجود.',
             'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
             'assoc_users'	 	=> 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
         
             'create' => array(
                 'error'   		=> 'Asset was not created, please try again. :(',
        -        'success' 		=> 'Asset created successfully. :)'
        +        'success' 		=> 'تم إنشاء الأصل بنجاح.'
             ),
         
             'update' => array(
                 'error'   			=> 'Asset was not updated, please try again',
        -        'success' 			=> 'Asset updated successfully.',
        +        'success' 			=> 'تم تحديث الأصل بنجاح.',
                 'nothing_updated'	=>  'No fields were selected, so nothing was updated.',
             ),
         
        @@ -24,9 +24,15 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
        -        'error'   => 'File not deleted. Please try again.',
        -        'success' => 'File successfully deleted.',
        +        'error'   => 'لم يتم حذف الملف. الرجاء المحاولة مرة اخرى.',
        +        'success' => 'تم حذف الملف بنجاح.',
             ),
         
             'upload' => array(
        @@ -48,7 +54,8 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        -        'success' 		=> 'The asset was deleted successfully.'
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
        +        'success' 		=> 'تم حذف الأصل بنجاح.'
             ),
         
             'checkout' => array(
        diff --git a/resources/lang/ar/admin/hardware/table.php b/resources/lang/ar/admin/hardware/table.php
        index e8baa09d5a..a1036c4e00 100644
        --- a/resources/lang/ar/admin/hardware/table.php
        +++ b/resources/lang/ar/admin/hardware/table.php
        @@ -2,23 +2,23 @@
         
         return array(
         
        -    'asset_tag'   	=> 'Asset Tag',
        -    'asset_model'       => 'Model',
        -    'book_value'  	=> 'Value',
        -    'change' 		=> 'In/Out',
        +    'asset_tag'   	=> 'علامة الأصل',
        +    'asset_model'       => 'موديل',
        +    'book_value'  	=> 'القيمة',
        +    'change' 		=> 'داخل\\خارج',
             'checkout_date' => 'Checkout Date',
             'checkoutto' 	=> 'Checked Out',
        -    'diff' 			=> 'Diff',
        -    'dl_csv' 		=> 'Download CSV',
        -    'eol' 			=> 'EOL',
        -    'id'      		=> 'ID',
        -    'location' 		=> 'Location',
        -    'purchase_cost'	=> 'Cost',
        -    'purchase_date'	=> 'Purchased',
        -    'serial'   		=> 'Serial',
        +    'diff' 			=> 'الفرق',
        +    'dl_csv' 		=> 'التنزيل كملف CSV',
        +    'eol' 			=> 'نهاية الحياة',
        +    'id'      		=> 'رقم التعريف',
        +    'location' 		=> 'الموقع',
        +    'purchase_cost'	=> 'التكلفة',
        +    'purchase_date'	=> 'تم الشراء',
        +    'serial'   		=> 'الرقم التسلسلي',
             'status'   		=> 'Status',
        -    'title'      	=> 'Asset ',
        -    'image'		=> 'Device Image',
        +    'title'      	=> 'أصل ',
        +    'image'		=> 'صورة الجهاز',
             'days_without_acceptance' => 'Days Without Acceptance'
         
         );
        diff --git a/resources/lang/ar/admin/licenses/form.php b/resources/lang/ar/admin/licenses/form.php
        index ce29167874..a9667f7224 100644
        --- a/resources/lang/ar/admin/licenses/form.php
        +++ b/resources/lang/ar/admin/licenses/form.php
        @@ -2,21 +2,21 @@
         
         return array(
         
        -    'asset'             => 'Asset',
        +    'asset'             => 'أصل',
             'checkin'           => 'Checkin',
        -    'create'            => 'Create License',
        -    'expiration'        => 'Expiration Date',
        -    'license_key'       => 'Product Key',
        +    'create'            => 'إنشاء رخصة',
        +    'expiration'        => 'تاريخ الانتهاء',
        +    'license_key'       => 'مفتاح المنتج',
             'maintained'        => 'Maintained',
        -    'name'              => 'Software Name',
        +    'name'              => 'إسم البرنامج',
             'no_depreciation'   => 'Do Not Depreciate',
        -    'purchase_order'    => 'Purchase Order Number',
        -    'reassignable'      => 'Reassignable',
        -    'remaining_seats'   => 'Remaining Seats',
        -    'seats'             => 'Seats',
        -    'termination_date'  => 'Termination Date',
        +    'purchase_order'    => 'رقم طلب الشراء',
        +    'reassignable'      => 'قابل لإعادة التعيين',
        +    'remaining_seats'   => 'المقاعد المتبقية',
        +    'seats'             => 'مقاعد',
        +    'termination_date'  => 'تاريخ الإلغاء',
             'to_email'          => 'Licensed to Email',
             'to_name'           => 'Licensed to Name',
        -    'update'            => 'Update License',
        +    'update'            => 'تحديث الرخصة',
             'checkout_help'     => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
         );
        diff --git a/resources/lang/ar/admin/licenses/general.php b/resources/lang/ar/admin/licenses/general.php
        index 25a536ec56..f95a35348c 100644
        --- a/resources/lang/ar/admin/licenses/general.php
        +++ b/resources/lang/ar/admin/licenses/general.php
        @@ -1,21 +1,21 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses_title'            => 'حول الرخص',
             'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
             'checkin'  					=> 'Checkin License Seat',
             'checkout_history'  		=> 'Checkout History',
             'checkout'  				=> 'Checkout License Seat',
        -    'edit'  					=> 'Edit License',
        -    'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        -    'clone'  					=> 'Clone License',
        +    'edit'  					=> 'تعديل الرخصة',
        +    'filetype_info'				=> 'انواع صيغ الملفات المسوح بها هي png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'clone'  					=> 'استنساخ الرخصة',
             'history_for'  				=> 'History for ',
        -    'in_out'  					=> 'In/Out',
        -    'info'  					=> 'License Info',
        -    'license_seats'  			=> 'License Seats',
        -    'seat'  					=> 'Seat',
        +    'in_out'  					=> 'داخل\\خارج',
        +    'info'  					=> 'معلومات الرخصة',
        +    'license_seats'  			=> 'مقاعد الرخصة',
        +    'seat'  					=> 'مقعد',
             'seats'  					=> 'Seats',
             'software_licenses'  		=> 'Software Licenses',
        -    'user'  					=> 'User',
        +    'user'  					=> 'مستخدم',
             'view'  					=> 'View License',
         );
        diff --git a/resources/lang/ar/admin/licenses/message.php b/resources/lang/ar/admin/licenses/message.php
        index d5dbfe77b9..ce206f91eb 100644
        --- a/resources/lang/ar/admin/licenses/message.php
        +++ b/resources/lang/ar/admin/licenses/message.php
        @@ -2,8 +2,8 @@
         
         return array(
         
        -    'does_not_exist' => 'License does not exist.',
        -    'user_does_not_exist' => 'User does not exist.',
        +    'does_not_exist' => 'الرخصة غير موجودة.',
        +    'user_does_not_exist' => 'المستخدم غير موجود.',
             'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
             'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
             'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
        @@ -11,17 +11,17 @@ return array(
         
             'create' => array(
                 'error'   => 'License was not created, please try again.',
        -        'success' => 'License created successfully.'
        +        'success' => 'تم إنشاء الرخصة بنجاح.'
             ),
         
             'deletefile' => array(
        -        'error'   => 'File not deleted. Please try again.',
        -        'success' => 'File successfully deleted.',
        +        'error'   => 'لم يتم حذف الملف. الرجاء المحاولة مرة اخرى.',
        +        'success' => 'تم حذف الملف بنجاح.',
             ),
         
             'upload' => array(
                 'error'   => 'File(s) not uploaded. Please try again.',
        -        'success' => 'File(s) successfully uploaded.',
        +        'success' => 'تم رفع الملف(ات) بنجاح.',
                 'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
                 'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
             ),
        @@ -32,7 +32,7 @@ return array(
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this license?',
        +        'confirm'   => 'هل أنت متأكد من رغبتك في حذف هذه الرخصة؟',
                 'error'   => 'There was an issue deleting the license. Please try again.',
                 'success' => 'The license was deleted successfully.'
             ),
        diff --git a/resources/lang/ar/admin/licenses/table.php b/resources/lang/ar/admin/licenses/table.php
        index dfce4136cb..8befbd9fdf 100644
        --- a/resources/lang/ar/admin/licenses/table.php
        +++ b/resources/lang/ar/admin/licenses/table.php
        @@ -2,16 +2,16 @@
         
         return array(
         
        -    'assigned_to'   	=> 'Assigned To',
        -    'checkout'   		=> 'In/Out',
        -    'id'      			=> 'ID',
        +    'assigned_to'   	=> 'مخصص لـ',
        +    'checkout'   		=> 'داخل\\خارج',
        +    'id'      			=> 'رقم التعريف',
             'license_email'   	=> 'License Email',
        -    'license_name'   	=> 'Licensed To',
        -    'purchase_date'   	=> 'Purchase Date',
        -    'purchased'   		=> 'Purchased',
        -    'seats'   			=> 'Seats',
        -    'hardware'   		=> 'Hardware',
        -    'serial'   			=> 'Serial',
        -    'title'      		=> 'License',
        +    'license_name'   	=> 'مرخص الى',
        +    'purchase_date'   	=> 'تاريخ الشراء',
        +    'purchased'   		=> 'تم الشراء',
        +    'seats'   			=> 'مقاعد',
        +    'hardware'   		=> 'أجهزة',
        +    'serial'   			=> 'الرقم التسلسلي',
        +    'title'      		=> 'الرخص',
         
         );
        diff --git a/resources/lang/ar/admin/locations/message.php b/resources/lang/ar/admin/locations/message.php
        index 3ba1eed3b6..b6cd91f7ba 100644
        --- a/resources/lang/ar/admin/locations/message.php
        +++ b/resources/lang/ar/admin/locations/message.php
        @@ -2,26 +2,26 @@
         
         return array(
         
        -    'does_not_exist' => 'Location does not exist.',
        +    'does_not_exist' => 'الموقع غير موجود.',
             'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
             'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
             'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
         
         
             'create' => array(
        -        'error'   => 'Location was not created, please try again.',
        -        'success' => 'Location created successfully.'
        +        'error'   => 'لم يتم إنشاء الموقع، الرجاء المحاولة مرة أخرى.',
        +        'success' => 'تم إنشاء الموقع بنجاح.'
             ),
         
             'update' => array(
        -        'error'   => 'Location was not updated, please try again',
        -        'success' => 'Location updated successfully.'
        +        'error'   => 'لم يتم تحديث الموقع، الرجاء المحاولة مرة أخرى',
        +        'success' => 'تم تحديث الموقع بنجاح.'
             ),
         
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this location?',
                 'error'   => 'There was an issue deleting the location. Please try again.',
        -        'success' => 'The location was deleted successfully.'
        +        'success' => 'تم حذف الموقع بنجاح.'
             )
         
         );
        diff --git a/resources/lang/ar/admin/locations/table.php b/resources/lang/ar/admin/locations/table.php
        index e171d4dd4e..96e4ea17aa 100644
        --- a/resources/lang/ar/admin/locations/table.php
        +++ b/resources/lang/ar/admin/locations/table.php
        @@ -1,20 +1,21 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        +    'about_locations_title'     => 'عن المواقع',
             'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        -    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        -    'assets_checkedout'         => 'Assets Assigned',
        -    'id'                        => 'ID',
        -    'city'                      => 'City',
        -    'state'                     => 'State',
        -    'country'                   => 'Country',
        -    'create'                    => 'Create Location',
        +    'assets_rtd'                => 'الأصول', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'assets_checkedout'         => 'الأصول المعينة',
        +    'id'                        => 'رقم التعريف',
        +    'city'                      => 'المدينة',
        +    'state'                     => 'الحالة',
        +    'country'                   => 'الدولة',
        +    'create'                    => 'إنشاء موقع',
             'update'                    => 'Update Location',
        -    'name'                      => 'Location Name',
        -    'address'                   => 'Address',
        -    'zip'                       => 'Postal Code',
        -    'locations'                 => 'Locations',
        +    'name'                      => 'إسم الموقع',
        +    'address'                   => 'العنوان',
        +    'zip'                       => 'الرمز البريدي',
        +    'locations'                 => 'المواقع',
             'parent'                    => 'Parent',
        -    'currency'                  => 'Location Currency',
        +    'currency'                  => 'عملة الموقع',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/ar/admin/manufacturers/table.php b/resources/lang/ar/admin/manufacturers/table.php
        index f66320fe8d..81118d2f2b 100644
        --- a/resources/lang/ar/admin/manufacturers/table.php
        +++ b/resources/lang/ar/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        -    'asset_manufacturers'	=> 'Asset Manufacturers',
        -    'create'				=> 'Create Manufacturer',
        -    'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        +    'about_manufacturers_title'    => 'حول الشركات المصنعة',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
        +    'asset_manufacturers'	=> 'مصنعين الأصول',
        +    'create'				=> 'إنشاء شركة مصنعة',
        +    'id'   					=> 'رقم التعريف',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/ar/admin/models/general.php b/resources/lang/ar/admin/models/general.php
        index e0da09f780..5e5c4b0b36 100644
        --- a/resources/lang/ar/admin/models/general.php
        +++ b/resources/lang/ar/admin/models/general.php
        @@ -1,15 +1,15 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        +    'about_models_title'     => 'حول موديلات الأصول',
             'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
             'deleted'  					        => 'This model has been deleted. <a href="/hardware/models/:model_id/restore">Click here to restore it</a>.',
        -    'restore'                   => 'Restore Model',
        +    'restore'                   => 'إستعادة الموديل',
             'requestable'               => 'Users may request this model',
         	'show_mac_address'			      => 'Show MAC address field in assets in this model',
        -    'view_deleted'              => 'View Deleted',
        -    'view_models'               => 'View Models',
        +    'view_deleted'              => 'مشاهدة محذوفة',
        +    'view_models'               => 'عرض الموديلات',
             'fieldset'                  => 'Fieldset',
        -    'no_custom_field'           => 'No custom fields',
        +    'no_custom_field'           => 'لا يوجد حقول مخصصة',
         
         );
        diff --git a/resources/lang/ar/admin/models/message.php b/resources/lang/ar/admin/models/message.php
        index fe51cb8d4c..d2dda612c3 100644
        --- a/resources/lang/ar/admin/models/message.php
        +++ b/resources/lang/ar/admin/models/message.php
        @@ -2,13 +2,13 @@
         
         return array(
         
        -    'does_not_exist' => 'Model does not exist.',
        +    'does_not_exist' => 'الموديل غير موجود.',
             'assoc_users'	 => 'This model is currently associated with one or more assets and cannot be deleted. Please delete the assets, and then try deleting again. ',
         
         
             'create' => array(
        -        'error'   => 'Model was not created, please try again.',
        -        'success' => 'Model created successfully.',
        +        'error'   => 'لم يتم إنشاء الموديل، حاول مجددا.',
        +        'success' => 'تم إنشاء الموديل بنجاح.',
                 'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
             ),
         
        @@ -25,7 +25,12 @@ return array(
         
             'restore' => array(
                 'error'   		=> 'Model was not restored, please try again',
        -        'success' 		=> 'Model restored successfully.'
        +        'success' 		=> 'تم إستعادة المودير بنجاح.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
             ),
         
         );
        diff --git a/resources/lang/ar/admin/models/table.php b/resources/lang/ar/admin/models/table.php
        index 11a512b3d3..43335534e8 100644
        --- a/resources/lang/ar/admin/models/table.php
        +++ b/resources/lang/ar/admin/models/table.php
        @@ -2,16 +2,16 @@
         
         return array(
         
        -    'create'				=> 'Create Asset Model',
        -    'created_at' 			=> 'Created at',
        -    'eol'	 				=> 'EOL',
        -    'modelnumber'   		=> 'Model No.',
        -    'name'      			=> 'Asset Model Name',
        -    'numassets' 			=> 'Assets',
        -    'title'					=> 'Asset Models',
        +    'create'				=> 'إنشاء موديل الأصل',
        +    'created_at' 			=> 'أنشئت في',
        +    'eol'	 				=> 'نهاية الحياة',
        +    'modelnumber'   		=> 'رقم الموديل',
        +    'name'      			=> 'إسم موديل الأصل',
        +    'numassets' 			=> 'الأصول',
        +    'title'					=> 'موديل الأصول',
             'update'				=> 'Update Asset Model',
             'view'					=> 'View Asset Model',
             'update'				=> 'Update Asset Model',
        -    'clone'				=> 'Clone Model',
        -    'edit'				=> 'Edit Model',
        +    'clone'				=> 'استنساخ الموديل',
        +    'edit'				=> 'تحرير الموديل',
         );
        diff --git a/resources/lang/ar/admin/reports/general.php b/resources/lang/ar/admin/reports/general.php
        index b03b97546f..362e71ac59 100644
        --- a/resources/lang/ar/admin/reports/general.php
        +++ b/resources/lang/ar/admin/reports/general.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'info'   => 'Select the options you want for your asset report.'
        +    'info'   => 'حدد الخيارات التي تريدها لتقرير الأصول الخاصة بك.'
         );
        diff --git a/resources/lang/ar/admin/reports/message.php b/resources/lang/ar/admin/reports/message.php
        index d4c8f8198f..9c1a9fc16f 100644
        --- a/resources/lang/ar/admin/reports/message.php
        +++ b/resources/lang/ar/admin/reports/message.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'error'   => 'You must select at least ONE option.'
        +    'error'   => 'يجب عليك أن تختار اختيار واحد على الأقل.'
         );
        diff --git a/resources/lang/ar/admin/settings/general.php b/resources/lang/ar/admin/settings/general.php
        index 1a6b2d4797..93f5c51258 100644
        --- a/resources/lang/ar/admin/settings/general.php
        +++ b/resources/lang/ar/admin/settings/general.php
        @@ -1,23 +1,27 @@
         <?php
         
         return array(
        -    'ad'				        => 'Active Directory',
        -    'ad_domain'				    => 'Active Directory domain',
        +    'ad'				        => 'الدليل النشط',
        +    'ad_domain'				    => 'مجال الدليل النشط',
             'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
             'is_ad'				        => 'This is an Active Directory server',
        -	'alert_email'				=> 'Send alerts to',
        -	'alerts_enabled'			=> 'Alerts Enabled',
        +	'alert_email'				=> 'إرسال تنبيهات إلى',
        +	'alerts_enabled'			=> 'التنبيهان ممكنه',
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
        -	'auto_increment_prefix'		=> 'Prefix (optional)',
        +	'auto_increment_prefix'		=> 'البادئة (اختياري)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        -	'backups'					=> 'Backups',
        +	'backups'					=> 'النسخ الإحتياطية',
         	'barcode_settings'			=> 'Barcode Settings',
             'confirm_purge'			    => 'Confirm Purge',
             'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        -	'custom_css'				=> 'Custom CSS',
        +	'custom_css'				=> 'CSS مخصص',
         	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
         	'default_currency'  		=> 'Default Currency',
         	'default_eula_text'			=> 'Default EULA',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/ar/admin/settings/message.php b/resources/lang/ar/admin/settings/message.php
        index 736d5c3e9e..af1b9fb74d 100644
        --- a/resources/lang/ar/admin/settings/message.php
        +++ b/resources/lang/ar/admin/settings/message.php
        @@ -4,8 +4,8 @@ return array(
         
         
             'update' => array(
        -        'error'                 => 'An error has occurred while updating. ',
        -        'success'               => 'Settings updated successfully.'
        +        'error'                 => 'حدث خطأ أثناء التحديث. ',
        +        'success'               => 'تم تحديث الإعدادات بنجاح.'
             ),
             'backup' => array(
                 'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        diff --git a/resources/lang/ar/admin/statuslabels/message.php b/resources/lang/ar/admin/statuslabels/message.php
        index 619a5a509c..5655de95e6 100644
        --- a/resources/lang/ar/admin/statuslabels/message.php
        +++ b/resources/lang/ar/admin/statuslabels/message.php
        @@ -2,18 +2,18 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        +    'does_not_exist' => 'حالة التصنيف غير موجود.',
             'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
         
         
             'create' => array(
                 'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'Status Label created successfully.'
        +        'success' => 'تم إنشاء تسمية الحالة بنجاح.'
             ),
         
             'update' => array(
                 'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'Status Label updated successfully.'
        +        'success' => 'تم تحديث تسمية الحالة بنجاح.'
             ),
         
             'delete' => array(
        diff --git a/resources/lang/ar/admin/statuslabels/table.php b/resources/lang/ar/admin/statuslabels/table.php
        index b9b5b7ec4e..c437004b37 100644
        --- a/resources/lang/ar/admin/statuslabels/table.php
        +++ b/resources/lang/ar/admin/statuslabels/table.php
        @@ -1,17 +1,17 @@
         <?php
         
         return array(
        -    'about'      	=> 'About Status Labels',
        -    'archived'      	=> 'Archived',
        +    'about'      	=> 'حول تسميات الحالات',
        +    'archived'      	=> 'مؤرشف',
             'create'      	=> 'Create Status Label',
             'color'      	=> 'Chart Color',
        -    'deployable'      	=> 'Deployable',
        +    'deployable'      	=> 'قابل للنشر',
             'info'      	=> 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
        -    'name'      	=> 'Status Name',
        -    'pending'      	=> 'Pending',
        -    'status_type'   => 'Status Type',
        -    'show_in_nav'   => 'Show in side nav',
        -    'title'      	=> 'Status Labels',
        -    'undeployable'  => 'Undeployable',
        +    'name'      	=> 'اسم الحالة',
        +    'pending'      	=> 'معلق',
        +    'status_type'   => 'نوع الحالة',
        +    'show_in_nav'   => 'أظهِر في الشريط الجانبي',
        +    'title'      	=> 'تسميات الحالة',
        +    'undeployable'  => 'غير قابل للنشر',
             'update'      	=> 'Update Status Label',
         );
        diff --git a/resources/lang/ar/admin/suppliers/message.php b/resources/lang/ar/admin/suppliers/message.php
        index df4bc41af3..55f53afbc2 100644
        --- a/resources/lang/ar/admin/suppliers/message.php
        +++ b/resources/lang/ar/admin/suppliers/message.php
        @@ -2,12 +2,12 @@
         
         return array(
         
        -    'does_not_exist' => 'Supplier does not exist.',
        +    'does_not_exist' => 'المورد غير مجود.',
             'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
         
             'create' => array(
        -        'error'   => 'Supplier was not created, please try again.',
        -        'success' => 'Supplier created successfully.'
        +        'error'   => 'لم يتم إنشاء المورد، الرجاء المحاولة مرة أخرى.',
        +        'success' => 'تم إنشاء المورد بنجاح.'
             ),
         
             'update' => array(
        @@ -16,9 +16,9 @@ return array(
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this supplier?',
        +        'confirm'   => 'هل أنت متأكد من رغبتك في حذف هذا المورد؟',
                 'error'   => 'There was an issue deleting the supplier. Please try again.',
        -        'success' => 'Supplier was deleted successfully.'
        +        'success' => 'تم حذف المورد بنجاح.'
             )
         
         );
        diff --git a/resources/lang/ar/admin/suppliers/table.php b/resources/lang/ar/admin/suppliers/table.php
        index 2a7b07ca93..ed2e02266b 100644
        --- a/resources/lang/ar/admin/suppliers/table.php
        +++ b/resources/lang/ar/admin/suppliers/table.php
        @@ -1,27 +1,27 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        +    'about_suppliers_title' => 'حول الموردين',
             'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        -    'address'               => 'Supplier Address',
        -    'assets'                => 'Assets',
        -    'city'                  => 'City',
        -    'contact'               => 'Contact Name',
        -    'country'               => 'Country',
        -    'create'                => 'Create Supplier',
        -    'email'                 => 'Email',
        -    'fax'                   => 'Fax',
        -    'id'                    => 'ID',
        -    'licenses'              => 'Licenses',
        -    'name'                  => 'Supplier Name',
        +    'address'               => 'عنوان المورد',
        +    'assets'                => 'الأصول',
        +    'city'                  => 'المدينة',
        +    'contact'               => 'اسم جهة الاتصال',
        +    'country'               => 'الدولة',
        +    'create'                => 'إنشاء مورد',
        +    'email'                 => 'البريد الالكتروني',
        +    'fax'                   => 'فاكس',
        +    'id'                    => 'رقم التعريف',
        +    'licenses'              => 'الرخص',
        +    'name'                  => 'إسم المورد',
             'notes'                 => 'Notes',
             'phone'                 => 'Phone',
        -    'state'                 => 'State',
        -    'suppliers'             => 'Suppliers',
        -    'update'                => 'Update Supplier',
        -    'url'                   => 'URL',
        -    'view'                  => 'View Supplier',
        -    'view_assets_for'       => 'View Assets for',
        +    'state'                 => 'الحالة',
        +    'suppliers'             => 'الموردون',
        +    'update'                => 'تحديث المورد',
        +    'url'                   => 'الرابط',
        +    'view'                  => 'مشاهدة المورد',
        +    'view_assets_for'       => 'عرض الأصول لـ',
             'zip'                   => 'Postal Code',
         
         );
        diff --git a/resources/lang/ar/admin/users/general.php b/resources/lang/ar/admin/users/general.php
        index ce9dbd2c26..ee405ce3b4 100644
        --- a/resources/lang/ar/admin/users/general.php
        +++ b/resources/lang/ar/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'الجهاز مسجل بعهدة :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'نسخ المستخدم',
             'contact_user'      => 'اتصل بـ :name',
             'edit'              => 'تعديل المستخدم',
        -    'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'filetype_info'     => 'انواع صيغ الملفات المسوح بها هي png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'الأرشيف الخاص بـ :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'آخر دخول للمستخدم',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'البرامج المسجلة لـ :name',
        diff --git a/resources/lang/ar/admin/users/message.php b/resources/lang/ar/admin/users/message.php
        index 6b27130daf..48a0e3ad18 100644
        --- a/resources/lang/ar/admin/users/message.php
        +++ b/resources/lang/ar/admin/users/message.php
        @@ -2,8 +2,9 @@
         
         return array(
         
        -    'accepted'                  => 'You have successfully accepted this asset.',
        -    'declined'                  => 'You have successfully declined this asset.',
        +    'accepted'                  => 'لقد قبلت هذا الأصل بنجاح.',
        +    'declined'                  => 'لقد رفضت هذا الأصل بنجاح.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'المستخدم موجود مسبقاً!',
             'user_not_found'            => 'المستخدم [id:] غير موجود.',
             'user_login_required'       => 'حقل "الدخول" مطلوب',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'تم إنشاء المستخدم بنجاح.',
                 'update'    => 'تم تعديل المستخدم بنجاح.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'تم حذف المستخدم بنجاح.',
                 'ban'       => 'تم حظر المستخدم بنجاح.',
                 'unban'     => 'تم إلغاء الحظر عن المستخدم بنجاح.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'حدث خطأ ما أثناء إنشاء هذا المستخدم. حاول مرة أخرى.',
                 'update' => 'حدث خطأ أثناء تحديث هذا المستخدم. حاول مرة أخرى.',
                 'delete' => 'حدث خطأ ما أثناء حذف هذا المستخدم. حاول مرة أخرى.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'حدث خطأ ما أثناء إلغاء التعليق عن المستخدم. حاول مرة أخرى.',
                 'import'    => 'حدث خطأ أثناء استيراد المستخدمين. حاول مرة أخرى.',
                 'asset_already_accepted' => 'هذا الجهاز تم قبوله مسبقاً.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/ar/admin/users/table.php b/resources/lang/ar/admin/users/table.php
        index 374f93f0d7..93fda0155a 100644
        --- a/resources/lang/ar/admin/users/table.php
        +++ b/resources/lang/ar/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'نشط',
             'allow'  				=> 'السماح',
             'checkedout'  			=> 'الأصول',
        @@ -20,16 +19,19 @@ return array(
             'location'  			=> 'الموقع',
             'lock_passwords'		=> 'لا يمكن تغيير تفاصيل الدخول بالنسبة لهذا التنصيب.',
             'manager' 				=> 'المدير',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'الاسم',
        -    'notes'                 => 'Notes',
        +    'notes'                 => 'مُلاحظات',
             'password_confirm' 		=> 'تأكيد كلمة المرور',
             'password' 				=> 'كلمة المرور',
             'phone'  				=> 'رقم الهاتف',
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'المسمى الوظيفي',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'تحديث المستخدم',
             'username' 				=> 'اسم المستخدم',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(يستخدم فقط للربط مع الـ Active Directory وليس لغرض تسجيل الدخول.)',
             'cloneuser'             => 'نسخ المستخدم',
             'viewusers' 			=> 'عرض المستخدمين',
        diff --git a/resources/lang/ar/auth/general.php b/resources/lang/ar/auth/general.php
        index bf88cba77a..60bfd53bee 100644
        --- a/resources/lang/ar/auth/general.php
        +++ b/resources/lang/ar/auth/general.php
        @@ -1,12 +1,12 @@
         <?php
         
         return [
        -    'send_password_link'	        => 'Send Password Reset Link',
        +    'send_password_link'	        => 'إرسال رسالة إعادة تعيين كلمة المرور',
             'email_reset_password'			=> 'Email Password Reset',
        -    'reset_password'			    => 'Reset Password',
        -    'login'                         => 'Login',
        -    'login_prompt'                  => 'Please Login',
        -    'forgot_password'               => 'I forgot my password',
        -    'remember_me'                   => 'Remember Me',
        +    'reset_password'			    => 'إعادة تعيين كلمة المرور',
        +    'login'                         => 'الدخول',
        +    'login_prompt'                  => 'الرجاء تسجيل الدخول',
        +    'forgot_password'               => 'نسيت كلمة المرور',
        +    'remember_me'                   => 'تذكرني',
             ];
         
        diff --git a/resources/lang/ar/auth/message.php b/resources/lang/ar/auth/message.php
        index 3aee689e54..1f06812fba 100644
        --- a/resources/lang/ar/auth/message.php
        +++ b/resources/lang/ar/auth/message.php
        @@ -2,16 +2,16 @@
         
         return array(
         
        -    'account_already_exists' => 'An account with the this email already exists.',
        -    'account_not_found'      => 'The username or password is incorrect.',
        -    'account_not_activated'  => 'This user account is not activated.',
        +    'account_already_exists' => 'حساب بهذا البريد الإلكتروني موجود مسبقا.',
        +    'account_not_found'      => 'اسم المستخدم أو كلمة المرور غير صحيحة.',
        +    'account_not_activated'  => 'لم يتم تنشيط حساب هذا المستخدم.',
             'account_suspended'      => 'This user account is suspended.',
             'account_banned'         => 'This user account is banned.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'There was a problem while trying to log you in, please try again.',
        -        'success' => 'You have successfully logged in.',
        +        'success' => 'قمت بتسجيل الدخول بنجاح.',
             ),
         
             'signup' => array(
        diff --git a/resources/lang/ar/button.php b/resources/lang/ar/button.php
        index ca612e5e93..043253a29c 100644
        --- a/resources/lang/ar/button.php
        +++ b/resources/lang/ar/button.php
        @@ -1,16 +1,15 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'الإجراءات',
        -    'add'    	                => 'Add New',
        -    'cancel'                    => 'Cancel',
        +    'add'    	                => 'إضافة جديد',
        +    'cancel'                    => 'إلغاء',
             'checkin_and_delete'  	    => 'Checkin & Delete User',
             'delete'  	                => 'حذف',
             'edit'    	                => 'تعديل',
             'restore' 	                => 'إستعادة',
        -    'request'                   => 'Request',
        +    'request'                   => 'طلب',
             'submit'  	                => 'إرسال',
        -    'upload'                    => 'Upload',
        -
        +    'upload'                    => 'رفع',
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/ar/general.php b/resources/lang/ar/general.php
        index 9d0ab15b8b..29c04945b5 100644
        --- a/resources/lang/ar/general.php
        +++ b/resources/lang/ar/general.php
        @@ -1,42 +1,49 @@
         <?php
         
             return [
        -    'accessories'			=> 'Accessories',
        -    'activated'			=> 'Activated',
        -    'accessory'				=> 'Accessory',
        -    'accessory_report'			=> 'Accessory Report',
        -    'action'                => 'Action',
        -    'activity_report'		=> 'Activity Report',
        +    'accessories'			=> 'ملحقات',
        +    'activated'			=> 'مفعل',
        +    'accessory'				=> 'ملحق',
        +    'accessory_report'			=> 'تقرير الملحقات',
        +    'action'                => 'الإجراء',
        +    'activity_report'		=> 'تقرير الأنشطة',
             'address'				=> 'العنوان',
             'admin'					=> 'الإدارة',
             'add_seats'     => 'Added seats',
             'all_assets'			=> 'كل الأصول',
             'all'       			=> 'الكل',
        -    'archived'              => 'Archived',
        +    'archived'              => 'مؤرشف',
             'asset_models'			=> 'نماذج الأصول',
             'asset'					=> 'الأصول',
             'asset_report'          => 'Asset Report',
             'asset_tag'				=> 'وسم الأصول',
             'assets_available'		=> 'الأصول المتاحة',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'الأصول',
             'avatar_delete'         => 'حذف الصورة الرمزية',
             'avatar_upload'         => 'رفع صورة رمزية',
             'back'      			=> 'الرجوع للخلف',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'إلغاء',
        -    'categories'			=> 'Categories',
        -    'category'				=> 'Category',
        +    'categories'			=> 'التصنيفات',
        +    'category'				=> 'تصنيف',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'تغيير عنوان البريد الإلكتروني',
             'changepassword'  		=> 'تغيير كلمة المرور',
             'checkin'  				=> 'تسجيل',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'ترجيع',
             'city'  				=> 'المدينة',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'الدولة',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'الأصول المضافة',
             'created_at' 			=> 'أنشئت في',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'الحالي',
             'custom_report'         => 'Custom Asset Report',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'التاريخ',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'حذف',
             'deleted'  				=> 'تم حذفها',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'مُوزعة',
             'depreciation_report'	=> 'تقرير الإستهلاك',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'الإسم الأخير',
             'license'				=> 'الرخص',
             'license_report'        => 'License Report',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'المزيد من المعلومات',
             'name'					=> 'الإسم',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'لا يوجد إستهلاك',
             'no_results'			=> 'لا يوجد نتائج.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,10 +174,13 @@
             'status'    			=> 'الحالة',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'الموردون',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'إجمالي الأصول',
             'total_licenses'		=> 'إجمالي الرخص',
        -    'total_accessories'		=> 'total accessories',
        +    'total_accessories'		=> 'مجموع الملحقات',
             'total_consumables'		=> 'total consumables',
             'type'  				=> 'Type',
             'undeployable'			=> 'غير قابلة للتوزيع',
        diff --git a/resources/lang/ar/mail.php b/resources/lang/ar/mail.php
        index c9a4fe182d..81bf87b4b2 100644
        --- a/resources/lang/ar/mail.php
        +++ b/resources/lang/ar/mail.php
        @@ -1,20 +1,20 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        +    'a_user_canceled' => 'ألغى المستخدم طلب عنصر على الموقع',
        +    'a_user_requested' => 'طلب مستخدم عنصر على الموقع',
        +    'accessory_name' => 'اسم الملحق:',
        +    'additional_notes' => 'ملاحظات إضافية:',
             'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        +    'asset' => 'أصل:',
        +    'asset_name' => 'اسم الأصل:',
             'asset_requested' => 'Asset requested',
             'asset_tag' => 'Asset Tag:',
             'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
                                             expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        +    'assigned_to' => 'مخصص لـ',
        +    'best_regards' => 'أفضل التحيات،',
        +    'canceled' => 'ملغى:',
             'checkin_date' => 'Checkin Date:',
             'checkout_date' => 'Checkout Date:',
             'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        @@ -26,10 +26,10 @@ return array(
             'Confirm_asset_delivery' => 'Confirm asset delivery.',
             'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
             'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        +    'Days' => 'أيام',
        +    'days' => 'أيام',
             'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        +    'expires' => 'ينتهي',
             'Expiring_Assets_Report' => 'Expiring Assets Report.',
             'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
             'hello' => 'Hello',
        diff --git a/resources/lang/ar/pagination.php b/resources/lang/ar/pagination.php
        index b573b51e91..ca1d84b247 100644
        --- a/resources/lang/ar/pagination.php
        +++ b/resources/lang/ar/pagination.php
        @@ -13,8 +13,8 @@ return array(
             |
             */
         
        -    'previous' => '&laquo; Previous',
        +    'previous' => ';laquo&السابق',
         
        -    'next'     => 'Next &raquo;',
        +    'next'     => 'التالي;raquo&',
         
         );
        diff --git a/resources/lang/ar/passwords.php b/resources/lang/ar/passwords.php
        index 5195a9b77c..f37bf83e40 100644
        --- a/resources/lang/ar/passwords.php
        +++ b/resources/lang/ar/passwords.php
        @@ -1,7 +1,7 @@
         <?php
         
         return [
        -    'sent'	        => 'Your password link has been sent!',
        +    'sent'	        => 'تم إرسال رابط كلمة المرور الخاصة بك!',
             'user'			=> 'That user does not exist or does not have an email address associated',
         ];
         
        diff --git a/resources/lang/ar/table.php b/resources/lang/ar/table.php
        index 1b03b8c6ac..ee7428d7c0 100644
        --- a/resources/lang/ar/table.php
        +++ b/resources/lang/ar/table.php
        @@ -3,8 +3,8 @@
         return array(
         
             'actions'	 	=> 'الإجراءات',
        -    'action' 		=> 'Action',
        -    'by'      		=> 'By',
        -    'item' 			=> 'Item',
        +    'action' 		=> 'الإجراء',
        +    'by'      		=> 'بواسطة',
        +    'item' 			=> 'عنصر',
         
         );
        diff --git a/resources/lang/ar/validation.php b/resources/lang/ar/validation.php
        index 03c7471cab..e890e5be0d 100644
        --- a/resources/lang/ar/validation.php
        +++ b/resources/lang/ar/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute يجب ان يكون مقبولا.',
        +    'active_url'           => ':attribute موقع غير صحيح.',
        +    'after'                => ':attribute يجب ان يكون تاريخ قبل :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute يجب ان يكون تاريخ قبل :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute يجب ان يكون بين :min - :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => ':attribute تاريخ غير صحيح.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/bg/admin/accessories/general.php b/resources/lang/bg/admin/accessories/general.php
        index b3d5e1d4c8..df7762fd44 100644
        --- a/resources/lang/bg/admin/accessories/general.php
        +++ b/resources/lang/bg/admin/accessories/general.php
        @@ -5,10 +5,10 @@ return array(
             'about_accessories_text'  			=> 'Аксесоарите са всички неща, които се изписват на потребителите, но нямат сериен номер (или няма нужда да бъдат конкретно проследявани). Например, това са мишки, клавиатури и др.',
             'accessory_category' 				=> 'Категория аксесоари',
             'accessory_name'  					=> 'Аксесоар',
        -    'checkout'  							=> 'Checkout Accessory',
        -    'checkin'  							=> 'Checkin Accessory',
        +    'checkout'  							=> 'Отписване на аксесоар',
        +    'checkin'  							=> 'Вписване на аксесоар',
             'create'  							=> 'Създаване на аксесоар',
        -    'edit'  							=> 'Edit Accessory',
        +    'edit'  							=> 'Редактиране на аксесоар',
             'eula_text'							=> 'EULA на категорията',
             'eula_text_help'					=> 'Това поле позволява да задавате различни EULA за всеки тип активи. Ако имате обща EULA за всички активи, можете да използвате кутийката по-долу за да използвате една обща по подразбиране.',
             'require_acceptance'				=> 'Задължаване на потребителите да потвърждават приемането на активи от тази категория.',
        diff --git a/resources/lang/bg/admin/accessories/message.php b/resources/lang/bg/admin/accessories/message.php
        index 48fd347641..bfd82117f5 100644
        --- a/resources/lang/bg/admin/accessories/message.php
        +++ b/resources/lang/bg/admin/accessories/message.php
        @@ -16,9 +16,9 @@ return array(
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this accessory?',
        -        'error'   => 'There was an issue deleting the accessory. Please try again.',
        -        'success' => 'The accessory was deleted successfully.'
        +        'confirm'   => 'Сигурни ли сте, че искате да изтриете този аксесоар?',
        +        'error'   => 'Възникна проблем при изтриването на този аксесоар. Моля опитайте отново.',
        +        'success' => 'Аксесоарът бе изтрит успешно.'
             ),
         
              'checkout' => array(
        diff --git a/resources/lang/bg/admin/asset_maintenances/message.php b/resources/lang/bg/admin/asset_maintenances/message.php
        index 830669a6fd..92327660f0 100644
        --- a/resources/lang/bg/admin/asset_maintenances/message.php
        +++ b/resources/lang/bg/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Поддръжката на актив не бе създадена. Моля опитайте отново.',
                     'success' => 'Поддръжката на актив създадена успешно.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Все още неприключила',
                 'warranty'                     => 'Гаранция',
                 'not_warranty'                 => 'Без гаранция',
        diff --git a/resources/lang/bg/admin/asset_maintenances/table.php b/resources/lang/bg/admin/asset_maintenances/table.php
        index f305b5d9c6..b1c37c3ab2 100644
        --- a/resources/lang/bg/admin/asset_maintenances/table.php
        +++ b/resources/lang/bg/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Поддръжка на активи',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Име на Актив',
                 'is_warranty'   => 'Гаранция',
                 'dl_csv'        => 'Сваляне на CSV'
             ];
        diff --git a/resources/lang/bg/admin/categories/general.php b/resources/lang/bg/admin/categories/general.php
        index e92088d99d..13a94ca210 100644
        --- a/resources/lang/bg/admin/categories/general.php
        +++ b/resources/lang/bg/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Относно категориите',
        +    'about_categories'  				=> 'Категориите помагат с организирането на вашите елементи. Някои примерни категории могат да бъдат &quot;Настолни компютри&quot;,&quot;Лаптопи&quot;,&quot;Мобилни телефони&quot;,&quot;Таблети&quot;, и т.н., но може да използвате всяка категория, имаща смисъл за организацията ви.',
             'asset_categories' 					=> 'Категории на активи',
             'category_name'  					=> 'Име на категория',
             'checkin_email'                     => 'Изпращане на email до потребителя при вписване на активи.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Редакция на категория',
             'eula_text'							=> 'Категория EULA',
             'eula_text_help'					=> 'Това поле позволява да задавате различни EULA за всеки тип активи. Ако имате обща EULA за всички активи, можете да използвате кутийката по-долу за да използвате една обща по подразбиране.',
        +    'name'                              => 'Име на категория',
             'require_acceptance'				=> 'Задължаване на потребителите да потвърждават приемането на активи от тази категория.',
             'required_acceptance'				=> 'Потребителят ще получи email с връзка за потвърждаване получаването на актива.',
             'required_eula'						=> 'Потребителят ще получи копие на EULA.',
        diff --git a/resources/lang/bg/admin/categories/message.php b/resources/lang/bg/admin/categories/message.php
        index 116e3209ab..fb6fef505b 100644
        --- a/resources/lang/bg/admin/categories/message.php
        +++ b/resources/lang/bg/admin/categories/message.php
        @@ -3,8 +3,8 @@
         return array(
         
             'does_not_exist' => 'Категорията не съществува.',
        -    'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
        -    'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
        +    'assoc_models'	 => 'Тази категория е свързана с поне един модел или не може да бъде изтрита Моля проверете за модели, които все още се препращат към тази категория и опитайте отново.',
        +    'assoc_items'	 => 'Тази категория е свързана с поне един :asset_type или не може да бъде изтрита Моля проверете за :asset_type, които все още се препращат към тази категория и опитайте отново.',
         
             'create' => array(
                 'error'   => 'Категорията не беше създадена. Моля опитайте отново.',
        diff --git a/resources/lang/bg/admin/companies/general.php b/resources/lang/bg/admin/companies/general.php
        index b249988410..040a91ea45 100644
        --- a/resources/lang/bg/admin/companies/general.php
        +++ b/resources/lang/bg/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Относно комапнии',
        +    'about_companies_text'                  => 'Компаниите могат да бъдат използвани като лесно поле за идентифициране, или за ограничаване на видимостта на активи, потребители и т.н. ако е активирана пълна поддръжка от Админ настройките.',
             'select_company' => 'Изберете компания',
         ];
        diff --git a/resources/lang/bg/admin/companies/message.php b/resources/lang/bg/admin/companies/message.php
        index 8a2471cfd0..1bdb61ed65 100644
        --- a/resources/lang/bg/admin/companies/message.php
        +++ b/resources/lang/bg/admin/companies/message.php
        @@ -1,18 +1,18 @@
         <?php
         return array(
             'does_not_exist' => 'Компанията не съществува.',
        -    'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
        +    'assoc_users'    => 'Тази компания е свързана с поне един модел или не може да бъде изтрита. Моля проверете за модели, които все още се препращат към тази компания и опитайте отново.',
             'create' => array(
        -        'error'   => 'Company was not created, please try again.',
        -        'success' => 'Company created successfully.'
        +        'error'   => 'Компанията не беше създадена, моля опитайте отново.',
        +        'success' => 'Компанията създадена успешно.'
             ),
             'update' => array(
        -        'error'   => 'Company was not updated, please try again',
        -        'success' => 'Company updated successfully.'
        +        'error'   => 'Компанията не беше обновена, моля опитайте отново.',
        +        'success' => 'Компанията обновена успешно.'
             ),
             'delete' => array(
        -        'confirm' => 'Are you sure you wish to delete this company?',
        -        'error'   => 'There was an issue deleting the company. Please try again.',
        -        'success' => 'The Company was deleted successfully.'
        +        'confirm' => 'Сигурни ли сте, че желаете да изтриете тази компания?',
        +        'error'   => 'Възникна проблем при изтриването на компанията. Моля опитайте отново.',
        +        'success' => 'Компанията бе изтрита успешно.'
             )
         );
        diff --git a/resources/lang/bg/admin/components/general.php b/resources/lang/bg/admin/components/general.php
        index 75c9d250ab..c005f87f80 100644
        --- a/resources/lang/bg/admin/components/general.php
        +++ b/resources/lang/bg/admin/components/general.php
        @@ -1,17 +1,17 @@
         <?php
         
         return array(
        -    'about_components_title' 			=> 'About Components',
        -    'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        -    'component_name'                  => 'Component Name',
        -    'checkin'                             => 'Checkin Component',
        -    'checkout'                             => 'Checkout Component',
        -    'cost'				=> 'Purchase Cost',
        -    'create'                             => 'Create Component',
        -    'edit'                             => 'Edit Component',
        -    'date'					=> 'Purchase Date',
        -    'order'					=> 'Order Number',
        -    'remaining' 			             => 'Remaining',
        -    'total' 			                 => 'Total',
        -    'update'                            => 'Update Component',
        +    'about_components_title' 			=> 'Относно компонентите',
        +    'about_components_text'  			=> 'Компонентите са елементи, които са част от актив, напр. HDD, RAM, и т.н..',
        +    'component_name'                  => 'Име на компонент',
        +    'checkin'                             => 'Вписване на компонент',
        +    'checkout'                             => 'Изписване на компонент',
        +    'cost'				=> 'Цена на закупуване',
        +    'create'                             => 'Създай компонент',
        +    'edit'                             => 'Промени компонент',
        +    'date'					=> 'Дата на закупуване',
        +    'order'					=> 'Номер на поръчка',
        +    'remaining' 			             => 'Оставащо',
        +    'total' 			                 => 'Общо',
        +    'update'                            => 'Обновяване на компонент',
         );
        diff --git a/resources/lang/bg/admin/components/message.php b/resources/lang/bg/admin/components/message.php
        index 1d13970f23..1a83a345f3 100644
        --- a/resources/lang/bg/admin/components/message.php
        +++ b/resources/lang/bg/admin/components/message.php
        @@ -2,34 +2,34 @@
         
         return array(
         
        -    'does_not_exist' => 'Component does not exist.',
        +    'does_not_exist' => 'Компонентът не съществува.',
         
             'create' => array(
        -        'error'   => 'Component was not created, please try again.',
        -        'success' => 'Component created successfully.'
        +        'error'   => 'Компонентът не беше създаден, моля опитайте отново.',
        +        'success' => 'Компонентът създаден успешно.'
             ),
         
             'update' => array(
        -        'error'   => 'Component was not updated, please try again',
        -        'success' => 'Component updated successfully.'
        +        'error'   => 'Компонентът не беше обновен, моля опитайте отново.',
        +        'success' => 'Компонентът обновен успешно.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this component?',
        -        'error'   => 'There was an issue deleting the component. Please try again.',
        -        'success' => 'The component was deleted successfully.'
        +        'confirm'   => 'Сигурни ли сте, че желаете да изтриете този компонент?',
        +        'error'   => 'Възникна проблем при изтриването на компонента. Моля опитайте отново.',
        +        'success' => 'Компонентът бе изтрит успешно.'
             ),
         
              'checkout' => array(
        -        'error'   		=> 'Component was not checked out, please try again',
        -        'success' 		=> 'Component checked out successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'error'   		=> 'Компонентът не беше отписан, моля опитайте отново.',
        +        'success' 		=> 'Компонентът отписан успешно.',
        +        'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.'
             ),
         
             'checkin' => array(
        -        'error'   		=> 'Component was not checked in, please try again',
        -        'success' 		=> 'Component checked in successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'error'   		=> 'Компонентът не беше вписан, моля опитайте отново.',
        +        'success' 		=> 'Компонентът вписан успешно.',
        +        'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.'
             )
         
         
        diff --git a/resources/lang/bg/admin/components/table.php b/resources/lang/bg/admin/components/table.php
        index 3d4fed6a7f..c2e9422e2f 100644
        --- a/resources/lang/bg/admin/components/table.php
        +++ b/resources/lang/bg/admin/components/table.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'title'      				=> 'Component Name',
        +    'title'      				=> 'Име на компонент.',
         );
        diff --git a/resources/lang/bg/admin/consumables/general.php b/resources/lang/bg/admin/consumables/general.php
        index 525d110fc6..bb42c5a3fb 100644
        --- a/resources/lang/bg/admin/consumables/general.php
        +++ b/resources/lang/bg/admin/consumables/general.php
        @@ -3,10 +3,10 @@
         return array(
             'about_consumables_title' 			=> 'Относно консумативите',
             'about_consumables_text'  			=> 'Консумативите са всички неща, купувани във времето. Например тонер за принтер или хартия.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'Отписване на консумативи към потребител',
             'consumable_name'                   => 'Консуматив',
             'create'                            => 'Създаване на консуматив',
        -    'item_no'                           => 'Item No.',
        +    'item_no'                           => '№ на артикул',
             'remaining' 			            => 'Остава',
             'total' 			                => 'Oбщо',
             'update'                            => 'Обновяване на консуматив',
        diff --git a/resources/lang/bg/admin/custom_fields/general.php b/resources/lang/bg/admin/custom_fields/general.php
        index 039027c88e..2916633760 100644
        --- a/resources/lang/bg/admin/custom_fields/general.php
        +++ b/resources/lang/bg/admin/custom_fields/general.php
        @@ -3,28 +3,28 @@
         return array(
             'custom_fields'		        => 'Потребителски полета',
             'field'		                => 'Поле',
        -    'about_fieldsets_title'		=> 'About Fieldsets',
        -    'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        -    'custom_format'             => 'Custom format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        -    'encrypted'      	        => 'Encrypted',
        +    'about_fieldsets_title'		=> 'Относно Fieldsets',
        +    'about_fieldsets_text'		=> 'Fieldsets позволяват създаването на групи от персонализирани полета, които се използват и преизползват често за специфични типове модели на активи.',
        +    'custom_format'             => 'Персонализиран формат...',
        +    'encrypt_field'      	        => 'Шифроване на стойността на това поле в базата данни',
        +    'encrypt_field_help'      => 'ВНИМАНИЕ: Шифроване на поле го прави невалидно за търсене.',
        +    'encrypted'      	        => 'Шифровано',
             'fieldset'      	        => 'Fieldset',
             'qty_fields'      	      => 'Qty Fields',
             'fieldsets'      	        => 'Fieldsets',
        -    'fieldset_name'           => 'Fieldset Name',
        -    'field_name'              => 'Field Name',
        -    'field_values'            => 'Field Values',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        -    'field_element'           => 'Form Element',
        -    'field_element_short'     => 'Element',
        -    'field_format'            => 'Format',
        -    'field_custom_format'     => 'Custom Format',
        -    'required'   		          => 'Required',
        +    'fieldset_name'           => 'Fieldset имена',
        +    'field_name'              => 'Име на поле',
        +    'field_values'            => 'Стойност на поле',
        +    'field_values_help'       => 'Добавяне на избираеми опции, по една на ред. Празни редове, различни от първия ред ще бъдат пренебрегнати.',
        +    'field_element'           => 'Елемент на формуляра',
        +    'field_element_short'     => 'Елемент',
        +    'field_format'            => 'Формат',
        +    'field_custom_format'     => 'Персонализиран формат',
        +    'required'   		          => 'Задължителен',
             'req'   		              => 'Req.',
        -    'used_by_models'   		    => 'Used By Models',
        -    'order'   		            => 'Order',
        -    'create_fieldset'         => 'New Fieldset',
        -    'create_field'            => 'New Custom Field',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'used_by_models'   		    => 'Използвани от модели ',
        +    'order'   		            => 'Ред',
        +    'create_fieldset'         => 'Нов Fieldset',
        +    'create_field'            => 'Ново персонализирано поле',
        +    'value_encrypted'      	        => 'Стойността на това поле е криптирана в базата данни. Само администратор потребители ще бъде в състояние да видят дешифрираната стойност',
         );
        diff --git a/resources/lang/bg/admin/custom_fields/message.php b/resources/lang/bg/admin/custom_fields/message.php
        index 0d34afa9e8..c14da9d161 100644
        --- a/resources/lang/bg/admin/custom_fields/message.php
        +++ b/resources/lang/bg/admin/custom_fields/message.php
        @@ -3,48 +3,48 @@
         return array(
         
             'field' => array(
        -        'invalid'   => 'That field does not exist.',
        -        'already_added'   => 'Field already added',
        +        'invalid'   => 'Това поле не съществува.',
        +        'already_added'   => 'Вече е добавено поле',
         
                 'create' => array(
        -            'error'   => 'Field was not created, please try again.',
        -            'success' => 'Field created successfully.',
        -            'assoc_success' => 'Field successfully added to fieldset.'
        +            'error'   => 'Поле не беше създадено, моля опитайте отново.',
        +            'success' => 'Поле създадено успешно.',
        +            'assoc_success' => 'Поле успешно добавено към fieldset.'
                 ),
         
                 'update' => array(
        -            'error'   => 'Field was not updated, please try again',
        -            'success' => 'Field updated successfully.'
        +            'error'   => 'Полето не беше актуализирано, моля опитайте отново',
        +            'success' => 'Поле актуализирано успешно.'
                 ),
         
                 'delete' => array(
        -            'confirm'   	=> 'Are you sure you wish to delete this field?',
        -            'error'   => 'There was an issue deleting the field. Please try again.',
        -            'success' => 'The field was deleted successfully.',
        -            'in_use'   => 'Field is still in use.',
        +            'confirm'   	=> 'Сигурни ли сте, че желаете да изтриете това поле?',
        +            'error'   => 'Възникна проблем при изтриването на това поле. Моля, опитайте отново.',
        +            'success' => 'Полето бе изтрито успешно.',
        +            'in_use'   => 'Полето все още се използва.',
                 )
         
             ),
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
        -            'error'   => 'Fieldset was not created, please try again.',
        -            'success' => 'Fieldset created successfully.'
        +            'error'   => 'Fieldset не беше създаден, моля опитайте отново.',
        +            'success' => 'Fieldset създаден успешно.'
                 ),
         
                 'update' => array(
        -            'error'   => 'Fieldset was not updated, please try again',
        -            'success' => 'Fieldset updated successfully.'
        +            'error'   => 'Fieldset не беше актуализиран, моля опитайте отново',
        +            'success' => 'Fieldset актуализиран успешно.'
                 ),
         
                 'delete' => array(
        -            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        -            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        -            'success' => 'The fieldset was deleted successfully.',
        -            'in_use'   => 'Fieldset is still in use.',
        +            'confirm'   	=> 'Сигурни ли сте, че желаете да изтриете този fieldset?',
        +            'error'   => 'Възникна проблем при изтриването на този fieldset. Моля, опитайте отново.',
        +            'success' => 'Fieldset бе изтрит успешно.',
        +            'in_use'   => 'Fieldset все още се използва.',
                 )
         
             ),
        diff --git a/resources/lang/bg/admin/departments/message.php b/resources/lang/bg/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/bg/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/bg/admin/departments/table.php b/resources/lang/bg/admin/departments/table.php
        new file mode 100644
        index 0000000000..f40782d7f4
        --- /dev/null
        +++ b/resources/lang/bg/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ИД№',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Ръководител',
        +    'location'                  => 'Местоположение',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/bg/admin/depreciations/general.php b/resources/lang/bg/admin/depreciations/general.php
        index 1a9541d064..d555b4bc47 100644
        --- a/resources/lang/bg/admin/depreciations/general.php
        +++ b/resources/lang/bg/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Относно амортизацията на активи',
             'about_depreciations'  					=> 'Тук можете да конфигурирате линейна амортизация на активи във времето.',
             'asset_depreciations'  					=> 'Амортизация на активи',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Създаване на амортизация',
             'depreciation_name'  					=> 'Амортизация',
             'number_of_months'  					=> 'Брой месеци',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Обновяване на амортизация',
         
         );
        diff --git a/resources/lang/bg/admin/groups/titles.php b/resources/lang/bg/admin/groups/titles.php
        index af8acd5406..28d541b5aa 100644
        --- a/resources/lang/bg/admin/groups/titles.php
        +++ b/resources/lang/bg/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Относно групи',
        +    'about_groups'                  => 'Групите се използват за обобщаване на потребителските разрешения',
             'group_management' 	 	=> 'Управление на групи',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Създаване на нова група',
        +    'update' 	 		        => 'Редакция на група',
             'group_name' 	 		=> 'Име на група',
             'group_admin' 	 		=> 'Администратор на група',
             'allow' 	 			=> 'Разрешаване',
        diff --git a/resources/lang/bg/admin/hardware/form.php b/resources/lang/bg/admin/hardware/form.php
        index 81e03aa2c1..a0a581d98f 100644
        --- a/resources/lang/bg/admin/hardware/form.php
        +++ b/resources/lang/bg/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Потвърдете масовото изтриване на активи',
           'bulk_delete_help'	=> 'Прегледайте активите, маркирани за масово изтриване. Веднъж изтрити, активите могат да бъдат възстановени, но те вече няма да бъдат асоциирани с потребителите, на които са изписани в момента.',
           'bulk_delete_warn'	=> 'Ще бъдат изтрити :asset_count актива.',
         	'bulk_update'		=> 'Масово обновяване на активи',
        diff --git a/resources/lang/bg/admin/hardware/general.php b/resources/lang/bg/admin/hardware/general.php
        index 92e75b7bc3..856908b22d 100644
        --- a/resources/lang/bg/admin/hardware/general.php
        +++ b/resources/lang/bg/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Относно активи',
        +    'about_assets_text'            => 'Активите са елементи, проследен от сериен номер или етикет. По-често, те са елементи с висока стойност, където идентифицирането на специфичен елемент е от значение.',
         	'archived'  				=> 'Архивиран',
             'asset'  					=> 'Актив',
        -    'bulk_checkout'             => 'Checkout Assets to User',
        +    'bulk_checkout'             => 'Отписване на активи към потребител',
             'checkin'  					=> 'Връщане на актив',
        -    'checkout'  				=> 'Изписване на актив към потребител',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Копиране на актив',
             'deployable'  				=> 'Може да бъде предоставен',
             'deleted'  					=> 'Активът беше изтрит. <a href="/hardware/:asset_id/restore">Възстановяване</a>.',
        @@ -15,7 +15,7 @@ return array(
         	'filetype_info'				=> 'Позволените типове файлове са png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, и rar.',
             'model_deleted'  			=> 'Моделът актив беше изтрит.Необходимо е да възстановите моделът, преди да възстановите актива.<br/> <a href="/hardware/models/:model_id/restore">Възстановяване на модел</a>.',
             'requestable'               => 'Може да бъде изискван',
        -    'requested'				    => 'Requested',
        +    'requested'				    => 'Изискан',
             'restore'  					=> 'Възстановяване на актив',
             'pending'  					=> 'Предстоящ',
             'undeployable'  			=> 'Не може да бъде предоставян',
        diff --git a/resources/lang/bg/admin/hardware/message.php b/resources/lang/bg/admin/hardware/message.php
        index 9338ea509e..23b7e8f8c0 100644
        --- a/resources/lang/bg/admin/hardware/message.php
        +++ b/resources/lang/bg/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> 'Активът възстановен успешно.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Файлът не беше изтрит. Моля опитайте отново.',
                 'success' => 'Файлът изтрит успешно.',
        @@ -36,17 +42,18 @@ return array(
             ),
         
             'import' => array(
        -        'error'                 => 'Some items did not import correctly.',
        -        'errorDetail'           => 'The following Items were not imported because of errors.',
        -        'success'               => "Your file has been imported",
        -        'file_delete_success'   => "Your file has been been successfully deleted",
        -        'file_delete_error'      => "The file was unable to be deleted",
        +        'error'                 => 'Някои елементи не бяха въведени правилно.',
        +        'errorDetail'           => 'Следните елементи не бяха въведени поради грешки.',
        +        'success'               => "Вашият файл беше въведен.",
        +        'file_delete_success'   => "Вашият файл беше изтрит успешно.",
        +        'file_delete_error'      => "Файлът не е в състояние да бъде изтрит",
             ),
         
         
             'delete' => array(
                 'confirm'   	=> 'Сигурни ли сте, че желаете изтриване на актива?',
                 'error'   		=> 'Проблем при изтриване на актива. Моля опитайте отново.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Активът е изтрит успешно.'
             ),
         
        @@ -54,21 +61,21 @@ return array(
                 'error'   		=> 'Активът не беше изписан. Моля опитайте отново.',
                 'success' 		=> 'Активът изписан успешно.',
                 'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.',
        -        'not_available' => 'That asset is not available for checkout!'
        +        'not_available' => 'Този актив не е наличен за отписване!'
             ),
         
             'checkin' => array(
                 'error'   		=> 'Активът не беше вписан. Моля опитайте отново.',
                 'success' 		=> 'Активът вписан успешно.',
                 'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.',
        -        'already_checked_in'  => 'That asset is already checked in.',
        +        'already_checked_in'  => 'Активът е вече вписан.',
         
             ),
         
             'requests' => array(
                 'error'   		=> 'Активът не беше изискан. Моля опитайте отново.',
                 'success' 		=> 'Активът изискан успешно.',
        -        'canceled'      => 'Checkout request successfully canceled'
        +        'canceled'      => 'Заявка за отписване отказана успешно'
             )
         
         );
        diff --git a/resources/lang/bg/admin/licenses/form.php b/resources/lang/bg/admin/licenses/form.php
        index a888a35aa2..daa5c1d599 100644
        --- a/resources/lang/bg/admin/licenses/form.php
        +++ b/resources/lang/bg/admin/licenses/form.php
        @@ -6,7 +6,7 @@ return array(
             'checkin'           => 'Вписване',
             'create'            => 'Добавяне на лиценз',
             'expiration'        => 'Срок на валидност',
        -    'license_key'       => 'Product Key',
        +    'license_key'       => 'Продуктов ключ',
             'maintained'        => 'В поддръжка',
             'name'              => 'Софтуерен продукт',
             'no_depreciation'   => 'Без амортизация',
        diff --git a/resources/lang/bg/admin/licenses/general.php b/resources/lang/bg/admin/licenses/general.php
        index 8f4ef362e0..9ad54be10a 100644
        --- a/resources/lang/bg/admin/licenses/general.php
        +++ b/resources/lang/bg/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Относно лицензи',
        +    'about_licenses'                  => 'Лицензите се използват за проследяване на софтуер.  Те имат определен брой места, които могат да бъдат отписани към лица',
             'checkin'  					=> 'Вписване на потребителски лиценз',
             'checkout_history'  		=> 'История на изписванията',
             'checkout'  				=> 'Изписване на потребителски лиценз',
        diff --git a/resources/lang/bg/admin/licenses/message.php b/resources/lang/bg/admin/licenses/message.php
        index 6eef35820b..d7929ba09a 100644
        --- a/resources/lang/bg/admin/licenses/message.php
        +++ b/resources/lang/bg/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Файлът (файловете) не е качен. Моля, опитайте отново.',
                 'success' => 'Файлът (файловете) е качен.',
                 'nofiles' => 'Не сте избрали файл за качване или файлът, който се опитвате да качите е твърде голям',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Един или повече от вашите файлове е твърде голям или е забранен тип файл. Разрешените типове файл са png, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, и lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/bg/admin/locations/table.php b/resources/lang/bg/admin/locations/table.php
        index e9ab825532..3a559fb5e3 100644
        --- a/resources/lang/bg/admin/locations/table.php
        +++ b/resources/lang/bg/admin/locations/table.php
        @@ -1,9 +1,9 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        -    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'about_locations_title'     => 'Относно местоположения',
        +    'about_locations'           => 'Местоположения се използват за проследяване на информация за местоположението  за потребители, активи и други елементи',
        +    'assets_rtd'                => 'Активи', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Изписани активи',
             'id'                        => 'ID',
             'city'                      => 'Град',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Местоположения',
             'parent'                    => 'Присъединено към',
             'currency'                  => 'Валута на местоположението',
        +    'ldap_ou'                   => 'Търсене в LDAP OU',
             );
        diff --git a/resources/lang/bg/admin/manufacturers/table.php b/resources/lang/bg/admin/manufacturers/table.php
        index 8abbacaba4..c7a478c5cb 100644
        --- a/resources/lang/bg/admin/manufacturers/table.php
        +++ b/resources/lang/bg/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Относно производителите',
        +    'about_manufacturers_text'  => 'Производителите са компаниите, които създават вашите активи. Можете да трупате важна информация на контакти за поддръжка относно тях тук, която ще бъде показана на страницата за подробности на активи.',
             'asset_manufacturers'	=> 'Производители',
             'create'				=> 'Създаване на производител',
             'id'   					=> 'ID',
        -    'name'      			=> 'Име на производител',
        +    'name'      			=> 'Име',
        +    'support_email'   		=> 'Email за поддръжка',
        +    'support_phone'   		=> 'Телефон за поддръжка',
        +    'support_url'   		=> 'URL адрес за поддръжка',
             'update'				=> 'Обновяване на производител',
        +    'url'   				=> 'URL адрес',
         
         );
        diff --git a/resources/lang/bg/admin/models/general.php b/resources/lang/bg/admin/models/general.php
        index 9b1b8ae3bd..6e414d6631 100644
        --- a/resources/lang/bg/admin/models/general.php
        +++ b/resources/lang/bg/admin/models/general.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Относно модели на актив',
        +    'about_models_text'           => 'Модели на актив са начин за групиране на идентични активи. "MBP 2013", "IPhone 6s" и др.',
             'deleted'  					        => 'Моделът беше изтрит. <a href="/hardware/models/:model_id/restore">Възстановяване</a>.',
             'restore'                   => 'Възстановяване на модел',
        -    'requestable'               => 'Users may request this model',
        +    'requestable'               => 'Потребителите могат да поискат този модел',
         	'show_mac_address'			      => 'Визуализиране на поле за MAC адрес в активите за този модел',
             'view_deleted'              => 'Преглед на изтритите',
             'view_models'               => 'Преглед на моделите',
        diff --git a/resources/lang/bg/admin/models/message.php b/resources/lang/bg/admin/models/message.php
        index 320594fe98..398bdc9f9a 100644
        --- a/resources/lang/bg/admin/models/message.php
        +++ b/resources/lang/bg/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Моделът възстановен успешно.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'Няма полета, който да са се променили, така че нищо не е осъвременено.',
        +        'success' 		=> 'Моделите са осъвременени.'
        +    ),
        +
         );
        diff --git a/resources/lang/bg/admin/settings/general.php b/resources/lang/bg/admin/settings/general.php
        index 70b20fefb9..f2c8e974b1 100644
        --- a/resources/lang/bg/admin/settings/general.php
        +++ b/resources/lang/bg/admin/settings/general.php
        @@ -1,35 +1,39 @@
         <?php
         
         return array(
        -    'ad'				        => 'Active Directory',
        -    'ad_domain'				    => 'Active Directory domain',
        -    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        -    'is_ad'				        => 'This is an Active Directory server',
        +    'ad'				        => 'Активна директория',
        +    'ad_domain'				    => 'Домейн на активна директория',
        +    'ad_domain_help'			=> 'Това е понякога еднакво с вашия email домейн, но не винаги.',
        +    'is_ad'				        => 'Това е активна директория на сървър',
         	'alert_email'				=> 'Изпращане на нотификации към',
        -	'alerts_enabled'			=> 'Alerts Enabled',
        -	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        -	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'alerts_enabled'			=> 'Включване на известията',
        +	'alert_interval'			=> 'Изтичаш праг на известия (в дни)',
        +	'alert_inv_threshold'		=> 'Праг на известия за запаси',
         	'asset_ids'					=> 'ID на активи',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Автоматично генериране на инвентарни номера на активите',
         	'auto_increment_prefix'		=> 'Префикс (незадължително)',
         	'auto_incrementing_help'    => 'Първо включете автоматично генериране на инвентарни номера, за да включите тази опция.',
         	'backups'					=> 'Архивиране',
         	'barcode_settings'			=> 'Настройки на баркод',
        -    'confirm_purge'			    => 'Confirm Purge',
        -    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        +    'confirm_purge'			    => 'Потвърдете пречистване ',
        +    'confirm_purge_help'		=> 'Въдете текста "DELETE" в клетката отдолу за да пречистите изтритите записи. Това действие не може да бъде отменено.',
         	'custom_css'				=> 'Потребителски CSS',
         	'custom_css_help'			=> 'Включете вашите CSS правила тук. Не използвайте &lt;style&gt;&lt;/style&gt; тагове.',
         	'default_currency'  		=> 'Валута по подразбиране',
         	'default_eula_text'			=> 'EULA по подразбиране',
        -  'default_language'					=> 'Default Language',
        +  'default_language'					=> 'Език по подразбиране',
         	'default_eula_help_text'	=> 'Можете да асоциирате специфична EULA към всяка избрана категория.',
             'display_asset_name'        => 'Визуализиране на актив',
             'display_checkout_date'     => 'Визуализиране на дата на изписване',
             'display_eol'               => 'Визуализиране на EOL в таблиците',
        -    'display_qr'                => 'Display Square Codes',
        -	'display_alt_barcode'		=> 'Display 1D barcode',
        -	'barcode_type'				=> '2D Barcode Type',
        -	'alt_barcode_type'			=> '1D barcode type',
        +    'display_qr'                => 'Показване на Square кодове',
        +	'display_alt_barcode'		=> 'Показване на 1D баркод',
        +	'barcode_type'				=> '2D тип на баркод',
        +	'alt_barcode_type'			=> '1D тип на баркод',
             'eula_settings'				=> 'Настройки на EULA',
             'eula_markdown'				=> 'Съдържанието на EULA може да бъде форматирано с <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
             'general_settings'			=> 'Общи настройки',
        @@ -41,18 +45,18 @@ return array(
             'ldap_integration'          => 'LDAP интеграция',
             'ldap_settings'             => 'LDAP настройки',
             'ldap_server'               => 'LDAP сървър',
        -    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        +    'ldap_server_help'          => 'Това трябва да започва с Idap:// (for unencrypted or TLS) или Idaps:// (for SSL)',
         	'ldap_server_cert'			=> 'Валидация на LDAP SSL сертификата',
         	'ldap_server_cert_ignore'	=> 'Допускане на невалиден SSL сертификат',
         	'ldap_server_cert_help'		=> 'Изберете тази опция ако използвате самоподписан SSL сертификат.',
        -    'ldap_tls'                  => 'Use TLS',
        -    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        +    'ldap_tls'                  => 'Използвайте TLS',
        +    'ldap_tls_help'             => 'Това трябва да се маркира само ако изпълнявате STARTTLS на вашия LDAP сървър. ',
             'ldap_uname'                => 'LDAP потребител за връзка',
             'ldap_pword'                => 'LDAP парола на потребител за връзка',
             'ldap_basedn'               => 'Базов DN',
             'ldap_filter'               => 'LDAP филтър',
        -    'ldap_pw_sync'              => 'LDAP Password Sync',
        -    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_pw_sync'              => 'LADP Password SYNC',
        +    'ldap_pw_sync_help'         => 'Премахнете отметката в тази клетка ако не желаете да запазите LDAP паролите синхронизирани с локални пароли. Деактивиране на това означава, че вашите потребители може да не успеят да влязат използвайки LDAP сървъри ако са недостижими по някаква причина.',
             'ldap_username_field'       => 'Поле за потребителско име',
             'ldap_lname_field'          => 'Фамилия',
             'ldap_fname_field'          => 'LDAP собствено име',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP електронна поща',
             'load_remote_text'          => 'Отдалечени скриптове',
             'load_remote_help_text'		=> 'Тази Snipe-IT инсталация може да зарежда и изпълнява външни скриптове.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Лого',
             'full_multiple_companies_support_help_text' => 'Ограничаване на потребителите (включително административните) до активите на собствената им компания.',
             'full_multiple_companies_support_text' => 'Поддръжка на множество компании',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP версия',
             'php_gd_info'               => 'Необходимо е да инсталирате php-gd, за да визуализирате QR кодове. Моля прегледайте инструкцията за инсталация.',
             'php_gd_warning'            => 'php-gd НЕ е инсталиран.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Първо включете QR кодовете, за да извършите тези настройки.',
             'qr_text'                   => 'Съдържание на QR код',
             'setting'                   => 'Настройка',
        @@ -88,46 +100,49 @@ return array(
             'brand'                     => 'Брандиране',
             'about_settings_title'      => 'Относно настройките',
             'about_settings_text'       => 'Тези настройки позволяват да конфигурирате различни аспекти на Вашата инсталация.',
        -    'labels_per_page'           => 'Labels per page',
        -    'label_dimensions'          => 'Label dimensions (inches)',
        -    'page_padding'             => 'Page margins (inches)',
        -    'purge'                    => 'Purge Deleted Records',
        -    'labels_display_bgutter'    => 'Label bottom gutter',
        -    'labels_display_sgutter'    => 'Label side gutter',
        -    'labels_fontsize'           => 'Label font size',
        -    'labels_pagewidth'          => 'Label sheet width',
        -    'labels_pageheight'         => 'Label sheet height',
        -    'label_gutters'        => 'Label spacing (inches)',
        -    'page_dimensions'        => 'Page dimensions (inches)',
        -    'label_fields'          => 'Label visible fields',
        -    'inches'        => 'inches',
        +    'labels_per_page'           => 'Етикети на страница',
        +    'label_dimensions'          => 'Измерения на етикети (инчове)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Марж на страница (инчове)',
        +    'purge'                    => 'Пречисти изтрити записи',
        +    'labels_display_bgutter'    => 'Обозначаване на долен канал',
        +    'labels_display_sgutter'    => 'Обозначаване на страничен канал',
        +    'labels_fontsize'           => 'Обозначаване на размер на шрифта',
        +    'labels_pagewidth'          => 'Обозначаване на ширина на листа',
        +    'labels_pageheight'         => 'Обозначаване на височина на листа',
        +    'label_gutters'        => 'Обозначаване на разстояние (инчове)',
        +    'page_dimensions'        => 'Размери на страницата (инчове)',
        +    'label_fields'          => 'Обозначаване на видими полета',
        +    'inches'        => 'инчове',
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        -    'left'        => 'left',
        -    'right'        => 'right',
        -    'top'        => 'top',
        -    'bottom'        => 'bottom',
        -    'vertical'        => 'vertical',
        -    'horizontal'        => 'horizontal',
        -    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Двуфакторно удостоверяване',
        +    'two_factor_secret'        => 'Двуфакторен код',
        +    'two_factor_enrollment'        => 'Двуфакторово записване',
        +    'two_factor_enabled_text'        => 'Разреши два фактор',
        +    'two_factor_reset'        => 'Нулиране на двуфакторова тайна',
        +    'two_factor_reset_help'        => 'Това ще принуди потребителя да запише своето устройство с Google Authenticator отново. Това може да бъде полезно ако записаните понастоящем устройства са изгубени или откраднати.',
        +    'two_factor_reset_success'          => 'Двуфакторово устройство нулирано успешно',
        +    'two_factor_reset_error'          => 'Нулирането на двуфакторово устройство беше неуспешно',
        +    'two_factor_enabled_warning'        => 'Разрешаване на два-фактора ако не са разрешени в момента, ще ви принуди незабавно да се удостоверите с устройство записано в Google Auth. Ще имате възможността да запишете устройството си ако нямате такова.',
        +    'two_factor_enabled_help'        => 'Това ще включи двуфакторова заверка която използва Google Authenticator.',
        +    'two_factor_optional'        => 'Селективни (Потребителите могат да включват или изключват ако им е позволено)',
        +    'two_factor_required'        => 'Задължително за всички потребители',
        +    'two_factor_disabled'        => 'Деактивирано',
        +    'two_factor_enter_code'	=> 'Въведете двуфакторен код',
        +    'two_factor_config_complete'	=> 'Подаване на код',
        +    'two_factor_enabled_edit_not_allowed' => 'Вашият администратор не разрешава да редактирате тази настройка.',
        +    'two_factor_enrollment_text'	=> "Двуфакторово удостоверяване се изисква, но вашето устройство не е било регистрирано още. Отворете Google Authenticator и сканирайте QR кода по-долу за да регистрирате вашето устройство. След като сте записани вашето устройство, въведете кода по-долу",
        +    'require_accept_signature'      => 'Изисква подпис',
        +    'require_accept_signature_help_text'      => 'Разрешаването на тази функция ще изисква от потребителите да се подпишат физически за приемане на даден актив.',
        +    'left'        => 'ляво',
        +    'right'        => 'дясно',
        +    'top'        => 'Горе',
        +    'bottom'        => 'Долу',
        +    'vertical'        => 'Вертикално',
        +    'horizontal'        => 'Хоризонтално',
        +    'zerofill_count'        => 'Дължина на етикети на актив, включително zerofill',
         );
        diff --git a/resources/lang/bg/admin/settings/message.php b/resources/lang/bg/admin/settings/message.php
        index 071c2e433d..93a58c1286 100644
        --- a/resources/lang/bg/admin/settings/message.php
        +++ b/resources/lang/bg/admin/settings/message.php
        @@ -14,9 +14,9 @@ return array(
                 'file_not_found'        => 'Архивният файл не беше открит на сървъра.',
             ),
             'purge' => array(
        -        'error'     => 'An error has occurred while purging. ',
        -        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        -        'success'               => 'Deleted records successfully purged.'
        +        'error'     => 'Възникна грешка при пречистване. ',
        +        'validation_failed'     => 'Потвърждението ви за пречистване не неправилно. Моля напишете думата "DELETE" в клетката за потвърждаване.',
        +        'success'               => 'Изтрити записи успешно премахнати.'
             ),
         
         );
        diff --git a/resources/lang/bg/admin/statuslabels/message.php b/resources/lang/bg/admin/statuslabels/message.php
        index 619a5a509c..ae34b67fe8 100644
        --- a/resources/lang/bg/admin/statuslabels/message.php
        +++ b/resources/lang/bg/admin/statuslabels/message.php
        @@ -2,24 +2,24 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        -    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +    'does_not_exist' => 'Етикет за статус не съществува.',
        +    'assoc_assets'	 => 'Този етикет за статус е свързан с най-малко един актив и не може да бъде изтрит. Моля актуализирайте вашите активи да не се прехвърлят към този статус и опитайте отново.',
         
         
             'create' => array(
        -        'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'Status Label created successfully.'
        +        'error'   => 'Етикет за статус не беше създаден, моля опитайте отново.',
        +        'success' => 'Етикет за статус създаден успешно.'
             ),
         
             'update' => array(
        -        'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'Status Label updated successfully.'
        +        'error'   => 'Етикет за статус не беше актуализиран, моля опитайте отново.',
        +        'success' => 'Етикет за статус актуализиран успешно.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        -        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        -        'success' => 'The Status Label was deleted successfully.'
        +        'confirm'   => 'Сигурни ли сте, че желаете да изтриете този етикет за статус?',
        +        'error'   => 'Имаше проблем при изтриването на етикета за статус. Моля опитайте отново.',
        +        'success' => 'Етикета за статус бе изтрит успешно.'
             )
         
         );
        diff --git a/resources/lang/bg/admin/statuslabels/table.php b/resources/lang/bg/admin/statuslabels/table.php
        index 8a50d6e414..34b2058ebf 100644
        --- a/resources/lang/bg/admin/statuslabels/table.php
        +++ b/resources/lang/bg/admin/statuslabels/table.php
        @@ -4,13 +4,13 @@ return array(
             'about'      	=> 'Относно статус етикетите',
             'archived'      	=> 'Архивирани',
             'create'      	=> 'Създаване на статус етикет',
        -    'color'      	=> 'Chart Color',
        +    'color'      	=> 'Цвят на диаграма',
             'deployable'      	=> 'Може да бъде предоставен',
             'info'      	=> 'Статусите се използват за описване на различните състояния на Вашите активи. Например, това са Предаден за ремонт, Изгубен/откраднат и др. Можете да създавате нови статуси за активите, които могат да бъдат предоставяни, очакващи набавяне и архивирани.',
             'name'      	=> 'Статус',
             'pending'      	=> 'Изчакване',
             'status_type'   => 'Тип на статуса',
        -    'show_in_nav'   => 'Show in side nav',
        +    'show_in_nav'   => 'Покажи встрани nav',
             'title'      	=> 'Заглавия на статуси',
             'undeployable'  => 'Не може да бъде предоставян',
             'update'      	=> 'Обновяване на статус',
        diff --git a/resources/lang/bg/admin/suppliers/table.php b/resources/lang/bg/admin/suppliers/table.php
        index 9d24b406f8..fe63f76380 100644
        --- a/resources/lang/bg/admin/suppliers/table.php
        +++ b/resources/lang/bg/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Относно доставчици',
        +    'about_suppliers_text'  => 'Доставчици се използват за проследяване на източника на елементи',
             'address'               => 'Адрес на доставчика',
             'assets'                => 'Активи',
             'city'                  => 'Град',
        diff --git a/resources/lang/bg/admin/users/general.php b/resources/lang/bg/admin/users/general.php
        index 7e3b5b1e33..a29d09326f 100644
        --- a/resources/lang/bg/admin/users/general.php
        +++ b/resources/lang/bg/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Активи предадени на :name',
        -    'current_assets'    => 'Assets currently checked out to this user',
        +    'bulk_update_warn'	=> 'На път сте да редактирате свойствата на :user_count потребители. Моля обърнете внимание, че не можете да променяте собствените си атрибути използвайки този формуляр и трябва да нанесете промени към собствения си потребителски профил индивидуално.',
        +    'bulk_update_help'	=> 'Този формуляр ви позволява да обновявате няколко потребителски профила едновременно. Попълнете единствено полетата, които желаете да промените. Всички празни полета няма да бъдат променени.',
        +    'current_assets'    => 'Активи, отписани към този потребител в момента',
             'clone'             => 'Копиране на потребител',
             'contact_user'      => 'Връзка :name',
             'edit'              => 'Редактиране на потребител',
             'filetype_info'     => 'Позволените типове файлове са png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, и rar.',
             'history_user'      => 'История за :name',
        +	'info'				=> 'Информация',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Последен достъп до системата',
        -    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'ldap_config_text'  => 'LDAP конфигурационните настройки могат да бъдат намерени в  Admin > Settings. Избраното (по изобр) местоположение ще бъде настроено за всички въведени потребители.',
             'software_user'     => 'Софтуерни продукти, изписани на :name',
             'view_user'         => 'Преглед на потребител :name',
             'usercsv'           => 'CSV файл',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'Текущите настройки на администратор позволяват избирателно прилагане на двуфакторова автентификация. ',
        +    'two_factor_enrolled' => '2FA устройство записано',
        +    'two_factor_active'   => '2FA Активно',
             );
        diff --git a/resources/lang/bg/admin/users/message.php b/resources/lang/bg/admin/users/message.php
        index d16680f6ee..f294894fa9 100644
        --- a/resources/lang/bg/admin/users/message.php
        +++ b/resources/lang/bg/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Активът беше приет.',
             'declined'                  => 'Активът беше отказан.',
        +    'bulk_manager_warn'	        => 'Вашите потребителски профили бяха обновени успешно, обаче вашето управителско вписване не беше запазено, защото управителят, които сте избрали бе в списъка с потребителски профили за промяна и потребителите не могат да бъдат свои управители. Моля изберете вашите потребителски профили отново, с изключение на управителя.',
             'user_exists'               => 'Потребителят вече съществува!',
             'user_not_found'            => 'Потребител [:id] не съществува.',
             'user_login_required'       => 'Полето за вход е задължително',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Потребителят е създаден.',
                 'update'    => 'Потребителят е обновен.',
        +        'update_bulk'    => 'Потребителите бяха обновени успешно!',
                 'delete'    => 'Потребителят е изтрит.',
                 'ban'       => 'Потребителят беше забранен успешно.',
                 'unban'     => 'Потребителят възстановен успешно.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Възникна проблем при създаването на този потребител. Моля, опитайте отново.',
                 'update' => 'Възникна проблем при обновяването на този потребител. Моля, опитайте отново.',
                 'delete' => 'Възникна проблем при изтриването на този потребител. Моля, опитайте отново.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Проблем при активирането на потребителя. Моля опитайте отново.',
                 'import'    => 'Проблем при зареждането на потребителите. Моля опитайте отново.',
                 'asset_already_accepted' => 'Този актив е вече приет.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Проблем при връзката с LDAP сървъра. Моля прегледайте конфигурацията на LDAP.<br/>Грешка от LDAP сървъра: ',
                 'ldap_could_not_search' => 'Проблем при търсенето в LDAP сървъра. Моля прегледайте конфигурацията на LDAP.<br/>Грешка от LDAP сървъра: ',
                 'ldap_could_not_get_entries' => 'Проблем при извличането на резултат от LDAP сървъра. Моля прегледайте конфигурацията на LDAP.<br/>Грешка от LDAP сървъра:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/bg/admin/users/table.php b/resources/lang/bg/admin/users/table.php
        index 40d783ce17..e97ac8285a 100644
        --- a/resources/lang/bg/admin/users/table.php
        +++ b/resources/lang/bg/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Активен',
             'allow'  				=> 'Разрешаване',
             'checkedout'  			=> 'Активи',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Местоположение',
             'lock_passwords'		=> 'Настройките за вход не могат да бъдат променяни в текущата инсталация.',
             'manager' 				=> 'Ръководител',
        +    'managed_locations'     => 'Управлявани места',
             'name' 					=> 'Име',
             'notes'                 => 'Бележки',
             'password_confirm' 		=> 'Потвърждение на паролата',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Преглед на текущите потребители',
             'show_deleted'          => 'Преглед на изтритите потребители',
             'title' 				=> 'Титла',
        +	'to_restore_them'		=> 'да ги възстановите.',
             'updateuser' 			=> 'Обновяване на потребител',
             'username' 				=> 'Потребителско име',
        +	'user_deleted_text' 	=> 'Потребителят бе маркиран като изтрит.',
             'username_note' 		=> '(Използва се за достъп до Active Directory, а не за вход.)',
             'cloneuser'             => 'Копиране на потребител',
             'viewusers' 			=> 'Преглед на потребителите',
        diff --git a/resources/lang/bg/auth/general.php b/resources/lang/bg/auth/general.php
        index bf88cba77a..e45b688b7a 100644
        --- a/resources/lang/bg/auth/general.php
        +++ b/resources/lang/bg/auth/general.php
        @@ -1,12 +1,12 @@
         <?php
         
         return [
        -    'send_password_link'	        => 'Send Password Reset Link',
        -    'email_reset_password'			=> 'Email Password Reset',
        -    'reset_password'			    => 'Reset Password',
        -    'login'                         => 'Login',
        -    'login_prompt'                  => 'Please Login',
        -    'forgot_password'               => 'I forgot my password',
        -    'remember_me'                   => 'Remember Me',
        +    'send_password_link'	        => 'Изпрати връзка за повторно задаване на паролата',
        +    'email_reset_password'			=> 'Имейл за нулиране на паролата',
        +    'reset_password'			    => 'Нулиране на паролата',
        +    'login'                         => 'Логин',
        +    'login_prompt'                  => 'Моля влезте в системата',
        +    'forgot_password'               => 'Забравих си паролата',
        +    'remember_me'                   => 'Запомни ме',
             ];
         
        diff --git a/resources/lang/bg/auth/message.php b/resources/lang/bg/auth/message.php
        index 3980679c9b..c30081e737 100644
        --- a/resources/lang/bg/auth/message.php
        +++ b/resources/lang/bg/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Потребителят все още не е активиран.',
             'account_suspended'      => 'Потребителят е временно спрян.',
             'account_banned'         => 'Потребителят е неактивен.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Твърде много неуспешни опити за влизане в системата. Моля опитайте отново след около :minutes минути.',
         
             'signin' => array(
                 'error'   => 'Проблем при входа в системата. Моля опитайте отново.',
        diff --git a/resources/lang/bg/button.php b/resources/lang/bg/button.php
        index 5482588be6..a31fe63f9a 100644
        --- a/resources/lang/bg/button.php
        +++ b/resources/lang/bg/button.php
        @@ -1,16 +1,15 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Действия',
             'add'    	                => 'Добави нов',
             'cancel'                    => 'Отказ',
        -    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'checkin_and_delete'  	    => 'Вписване и изтриване на потребител',
             'delete'  	                => 'Изтриване',
             'edit'    	                => 'Редакция',
             'restore' 	                => 'Възстановяване',
             'request'                   => 'Заявка',
             'submit'  	                => 'Потвърди',
             'upload'                    => 'Качване',
        -
        +	'select_file'				=> 'Изберете файл...',
         );
        diff --git a/resources/lang/bg/general.php b/resources/lang/bg/general.php
        index 978fedfe6e..1c2693d449 100644
        --- a/resources/lang/bg/general.php
        +++ b/resources/lang/bg/general.php
        @@ -18,75 +18,88 @@
             'asset_report'          => 'Справка за активите',
             'asset_tag'				=> 'Инвентарен номер',
             'assets_available'		=> 'налични активи',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Активи',
             'avatar_delete'         => 'Изтриване на аватар',
             'avatar_upload'         => 'Качване на аватар',
             'back'      			=> 'Назад',
             'bad_data'      		=> 'Няма резултати.',
        -    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Общо отписване',
             'cancel'  				=> 'Отказ',
             'categories'			=> 'Категории',
             'category'				=> 'Категория',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Промяна на email адрес',
             'changepassword'  		=> 'Смяна на паролата',
             'checkin'  				=> 'Вписване',
             'checkin_from'  		=> 'Форма за вписване',
             'checkout'  			=> 'Изписване',
             'city'  				=> 'Град',
        +	'click_here'			=> 'Натиснете тук',
             'companies'			=> 'Компании',
             'company'				=> 'Компания',
        -    'component'			=> 'Component',
        -    'components'			=> 'Components',
        +    'component'			=> 'Компонент',
        +    'components'			=> 'Компоненти',
        +	'complete'				=> 'Завърши',
             'consumable'			=> 'Консуматив',
             'consumables'			=> 'Консумативи',
             'country'  				=> 'Държава',
             'create'				=> 'Създаване на нов',
        -    'created'               => 'Item Created',
        +    'created'               => 'Създадени артикули',
             'created_asset'			=> 'създадени активи',
             'created_at' 			=> 'Създаден на',
        +    'updated_at' 			=> 'Обновено на',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Текущи',
             'custom_report'         => 'Потребителски справки за активи',
             'dashboard'				=> 'Табло',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Дата',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Предупреждение!',
        +    'debug_warning_text'         => 'Това приложение се изпълнява в режим на производство с разрешено отстраняване на грешки. Това може да изложи чувствителни данни, ако приложението ви е достъпно за външния свят. Забранете режим отстраняване на грешки чрез задаване на стойността <code>APP_DEBUF</code>  <code>.env</code> във файла <code>false</code>.',
             'delete'  				=> 'Изтриване',
             'deleted'  				=> 'Изтрито',
             'delete_seats'  		=> 'Изтрити работни места за лиценз',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Изписани',
             'depreciation_report'	=> 'Справка за амортизации',
             'download'				=> 'Изтегляне',
             'depreciation'			=> 'Амортизация',
             'editprofile'  			=> 'Редакция на профила',
             'eol'					=> 'EOL',
        -    'email_domain'			=> 'Email Domain',
        -    'email_format'			=> 'Email Format',
        -    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        -    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        -    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'email_domain'			=> 'Email домейн',
        +    'email_format'			=> 'Email формат',
        +    'email_domain_help'		=> 'Използвайте това за да генерирате email адреси при въвеждане',
        +    'filastname_format'			=> 'Инициал на името Фамилия (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'Име Фамилия (jane.smith@example.com)',
             'first'					=> 'Първа',
             'first_name'			=> 'Собствено име',
        -    'first_name_format'		=> 'First Name (jane@example.com)',
        +    'first_name_format'		=> 'Име (jane@example.com)',
             'file_name'				=> 'Файл',
             'file_uploads'			=> 'Качени файлове',
             'generate'				=> 'Генериране',
             'groups'				=> 'Групи',
             'gravatar_email'        => 'Gravatar email адрес',
        -    'history'  			    => 'History',
        +    'history'  			    => 'История',
             'history_for'  			=> 'История за',
             'id'  					=> 'ID',
             'image_delete'         	=> 'Изтриване на изображението',
             'image_upload'         	=> 'Качване на изображение',
             'import'         	    => 'Зареждане',
        -    'import-history'        => 'Import History',
        +    'import-history'        => 'История на въвеждане',
             'asset_maintenance'        => 'Поддръжка на активи',
             'asset_maintenance_report' => 'Справка за поддръжка на активи',
             'asset_maintenances'       => 'Поддръжки на активи',
             'item'  				=> 'Информация',
             'insufficient_permissions' => 'Нямате необходимите права!',
        -    'language'				=> 'Language',
        +    'language'				=> 'Език',
             'last'					=> 'Последна',
        +    'last_login'            => 'Последен достъп до системата',
             'last_name'             => 'Фамилия',
             'license'				=> 'Лиценз',
             'license_report'        => 'Справка за лицензите',
        @@ -95,27 +108,29 @@
             'list_all'				=> 'Преглед на всички',
             'loading'				=> 'Зареждане',
             'lock_passwords'        => 'Полето не може да бъде редактирано в тази конфигурация.',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'feature_disabled'      => 'Тази функция е забранена за демо инсталацията.',
             'location'              => 'Местоположение',
             'locations'				=> 'Местоположения',
             'logout'				=> 'Изход',
        -    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'lookup_by_tag'     => 'Търсене по етикет на актив',
             'manufacturer'			=> 'Производител',
             'manufacturers'			=> 'Производители',
        -    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        -    'min_amt'				=> 'Min. QTY',
        -    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'markdown'				=> 'Това поле позволява <a href="https://help.github.com/articles/github-flavored-markdown/"Github flavored markdown<a/>',
        +    'min_amt'				=> 'Минимално количество',
        +    'min_amt_help'	=> 'Минимален брой артикули, които трябва да бъдат налични за да може да се задейства известието.',
             'model_no'				=> 'Модел №.',
             'months'				=> 'месеци',
             'moreinfo'				=> 'Повече информация',
             'name'					=> 'Име',
             'next'					=> 'Следващ',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'Без амортизация',
             'no_results'			=> 'Няма резултат.',
             'no'  					=> 'Не',
             'notes'  				=> 'Бележки',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Номер на поръчка',
             'page_menu'				=> 'Показване на _MENU_ записа',
             'pagination_info'		=> 'Показване на _START_ до _END_ от _TOTAL_ елемента',
             'pending'				=> 'Изчакване',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Предишен',
             'processing'			=> 'Обработка',
             'profile'				=> 'Вашият профил',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Цена на закупуване',
        +    'purchase_date'         => 'Дата на закупуване',
             'qty'		            => 'Количество',
             'quantity'		        => 'Kоличество',
             'ready_to_deploy'		=> 'Готово за предоставяне',
        @@ -133,40 +148,44 @@
             'remove_company'        => 'Премахване на асоциация към компания',
             'reports'				=> 'Справки',
             'requested'				=> 'Изискан',
        -    'request_canceled'      => 'Request Canceled',
        +    'request_canceled'      => 'Заявка отменена',
             'save'  				=> 'Запис',
             'select'				=> 'Избор',
             'search'				=> 'Търсене',
        -    'select_category'       => 'Select a Category',
        +    'select_category'       => 'Изберете категория',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Избор на вид амортизация',
             'select_location'		=> 'Избор на местоположение',
             'select_manufacturer'	=> 'Избор на производител',
             'select_model'			=> 'Избор на модел',
             'select_supplier'		=> 'Избор на доставчик',
             'select_user'			=> 'Избор на потребител',
        -    'select_date'			=> 'Избор на дата',
        +    'select_date'			=> 'Изберете дата (ГГГГ-ММ-ДД)',
             'select_statuslabel'	=> 'Избор на статус',
             'select_company'    	=> 'Изберете компания',
        -    'select_asset'    		=> 'Select Asset',
        +    'select_asset'    		=> 'Изберете актив',
             'settings'				=> 'Настройки',
             'sign_in'				=> 'Вход',
        -    'signature'             => 'Signature',
        -    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'signature'             => 'Подпис',
        +    'some_features_disabled' => 'DEMO MODE: Някои свойства не са разрешени за тази инсталация.',
             'site_name'				=> 'Име на системата',
             'state'  				=> 'Област',
             'status_labels'			=> 'Статус етикети',
             'status'    			=> 'Статус',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Доставчик',
             'suppliers'  			=> 'Доставчици',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => 'Сигурни ли сте, че искате да изтриете',
        +    'submit'				=> 'Изпрати',
        +    'target'                => 'Цел',
        +    'time_and_date_display' => 'Показване на време и дата',
             'total_assets'			=> 'общо активи',
             'total_licenses'		=> 'общо лицензи',
        -    'total_accessories'		=> 'total accessories',
        -    'total_consumables'		=> 'total consumables',
        +    'total_accessories'		=> 'Общ брой аксесоари',
        +    'total_consumables'		=> 'Общ брой консумативи',
             'type'  				=> 'Тип',
             'undeployable'			=> 'Не може да бъде предоставян',
             'unknown_admin'			=> 'Непознат администратор',
        -    'username_format'		=> 'Username Format',
        +    'username_format'		=> 'Формат на потребителско име',
             'update'                => 'Обновяване',
             'uploaded'              => 'Качен',
             'user'					=> 'Потребител',
        @@ -181,5 +200,5 @@
             'yes' 					=> 'Да',
             'zip'  					=> 'Пощенски код',
             'noimage'					=> 'Липсва изображение или не е качено.',
        -    'token_expired'             => 'Your form session has expired. Please try again.',
        +    'token_expired'             => 'Вашата сесия за формуляр изтече. Моля опитайте отново.',
             ];
        diff --git a/resources/lang/bg/mail.php b/resources/lang/bg/mail.php
        index c9a4fe182d..a0ca40d26b 100644
        --- a/resources/lang/bg/mail.php
        +++ b/resources/lang/bg/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => 'Потребител е отменил заявка за елемент в уебсайта',
        +    'a_user_requested' => 'Потребител е направил заявка за елемент в уебсайта',
        +    'accessory_name' => 'Име на аксесоар:',
        +    'additional_notes' => 'Допълнителни бележки:',
        +    'admin_has_created' => 'Администратор е създал акаунт за вас на :web website.',
        +    'asset' => 'Актив:',
        +    'asset_name' => 'Име на актив:',
        +    'asset_requested' => 'Заявка за актив',
        +    'asset_tag' => 'Етикет на актив:',
        +    'assets_warrantee_expiring' => '{1} актив с гаранция, изтичаща през следващите 60 дни. | [2, Inf] активи с гаранции изтичащи през следващите 60 дни.',
        +    'assigned_to' => 'Възложени на',
        +    'best_regards' => 'С най-добри пожелания.',
        +    'canceled' => 'Отменено:',
        +    'checkin_date' => 'Дата на вписване:',
        +    'checkout_date' => 'Дата на отписване:',
        +    'click_to_confirm' => 'Моля кликнете на следния линк за да потвърдите вашия :web account:',
        +    'click_on_the_link_accessory' => 'Моля, кликнете върху връзката в дъното, за да потвърдите, че сте получили аксесоара.',
        +    'click_on_the_link_asset' => 'Моля, кликнете върху връзката в дъното, за да потвърдите, че сте получили актива.',
        +    'Confirm_Asset_Checkin' => 'Потвърдете вписване на актив.',
        +    'Confirm_Accessory_Checkin' => 'Потвърдете вписване на аксесоар.',
        +    'Confirm_accessory_delivery' => 'Потвърдете доставка на аксесоар.',
        +    'Confirm_asset_delivery' => 'Подвърдете доставка на актив.',
        +    'Confirm_consumable_delivery' => 'Потвърдете доставка на консуматив.',
        +    'current_QTY' => 'Текуща наличност',
        +    'Days' => 'Дни',
        +    'days' => 'Дни',
        +    'expecting_checkin_date' => 'Очаквана дата на вписване',
        +    'expires' => 'Изтича',
        +    'Expiring_Assets_Report' => 'Доклад за изтичащи активи.',
        +    'Expiring_Licenses_Report' => 'Доклад за изтичащи лицензи.',
        +    'hello' => 'Здравейте',
        +    'hi' => 'Здравейте',
        +    'i_have_read' => 'Прочетох и се съгласих с условията за ползване, и получих този артикул.',
        +    'item' => 'Артикул:',
        +    'items_below_minimum' => '{1} артикул, който е под минималния запас или скоро ще бъде в ниско количество | [2, Inf] артикули, които са под минималните запаси или скоро ще бъдат в ниско количество.',
        +    'Item_Request_Canceled' => 'Заявка за артикул отменена',
        +    'Item_Requested' => 'Артикул заявен',
        +    'licenses_expiring' => '{1} лиценза изтича в следващите 60 дни. | [2, Inf] лицензи, изтичащи в следващите 60 дни.',
        +    'link_to_update_password' => 'Моля щракенете върху следния линк за да обновите своята :web password:',
        +    'login_first_admin' => 'Влезте в своята Snipe-IT инсталация използвайки данните по-долу:',
        +    'login' => 'Вход:',
        +    'Low_Inventory_Report' => 'Доклад за нисък запас',
        +    'min_QTY' => 'Минимално количество',
        +    'name' => 'Име',
        +    'new_item_checked' => 'Нов артикул беше изписан под вашете име, детайлите са отдолу.',
        +    'password' => 'Парола:',
        +    'password_reset' => 'Нулиране на паролата',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Моля прочетете условията по-долу.',
        +    'read_the_terms_and_click' => 'Моля прочетете условията за ползване по-долу и щракнете върху връзката в дъното, за да потвърдите че сте прочели и се съгласявате с условията на употреба и сте получили актива.',
        +    'requested' => 'Изискан:',
        +    'reset_link' => 'Вашата връзка за повторно задаване на паролата',
        +    'reset_password' => 'Щракнете тук, за да нулирате паролата си:',
        +    'serial' => 'Сериен:',
        +    'supplier' => 'Доставчик',
        +    'tag' => 'Етикет',
        +    'test_email' => 'Тест Email от Snipe-IT',
        +    'test_mail_text' => 'Това е тест от Snipe-IT система за управление на активи. Ако сте получили това, email-а работи :)',
        +    'the_following_item' => 'Следният артикул беше вписан:',
        +    'There_are' => '{1} има | [2, Inf] Имат',
        +    'to_reset' => 'За да нулирате вашата :web password, попълнете този формуляр:',
        +    'type' => 'Вид',
        +    'user' => 'Потребител:',
        +    'username' => 'Потребителско име:',
        +    'welcome' => 'Добре дошли, :name',
        +    'welcome_to' => 'Добре дошли: уеб!',
        +    'your_credentials' => 'Вашите идентификационни данни за Snipe-IT',
         );
        diff --git a/resources/lang/bg/passwords.php b/resources/lang/bg/passwords.php
        index 5195a9b77c..2b006beed0 100644
        --- a/resources/lang/bg/passwords.php
        +++ b/resources/lang/bg/passwords.php
        @@ -1,7 +1,7 @@
         <?php
         
         return [
        -    'sent'	        => 'Your password link has been sent!',
        -    'user'			=> 'That user does not exist or does not have an email address associated',
        +    'sent'	        => 'Линк към вашата парола бе изпратен!',
        +    'user'			=> 'Този потребител не съществува или няма свързан email адрес',
         ];
         
        diff --git a/resources/lang/bg/validation.php b/resources/lang/bg/validation.php
        index f3550c3e34..c923d7873e 100644
        --- a/resources/lang/bg/validation.php
        +++ b/resources/lang/bg/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute трябва да бъде потвърден.",
        -    "active_url"       => ":attribute не е валиден URL адрес.",
        -    "after"            => ":attribute трябва да бъде дата след :date.",
        -    "alpha"            => ":attribute може да съдържа единствено букви.",
        -    "alpha_dash"       => ":attribute може да съдържа единствено букви, числа и тире.",
        -    "alpha_num"        => ":attribute може да съдържа единствено букви и числа.",
        -    "before"           => ":attribute трябва да бъде дата преди :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute трябва да бъде между :min и :max.",
        -        "file"    => ":attribute трябва да бъде с големина между :min и :max KB.",
        -        "string"  => ":attribute трябва да бъде с дължина между :min и :max символа.",
        -    ),
        -    "confirmed"        => ":attribute потвърждение не съвпада.",
        -    "date"             => ":attribute не е валидна дата.",
        -    "date_format"      => ":attribute не съвпада с формата :format.",
        -    "different"        => ":attribute и :other трябва да се различават.",
        -    "digits"           => ":attribute трябва да бъде с дължина :digits цифри.",
        -    "digits_between"   => ":attribute трябва да бъде с дължина между :min и :max цифри.",
        -    "email"            => ":attribute е с невалиден формат.",
        -    "exists"           => "Избраният :attribute е невалиден.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => ":attribute трябва да бъде изображение.",
        -    "in"               => "Избраният :attribute е невалиден.",
        -    "integer"          => ":attribute трябва да бъде целочислен.",
        -    "ip"               => ":attribute трябва да бъде валиден IP адрес.",
        -    "max"              => array(
        -        "numeric" => ":attribute не може да бъде по-дълъг от :max.",
        -        "file"    => ":attribute не може да бъде по-голям от :max KB.",
        -        "string"  => ":attribute не може да бъде по-дълъг от :max символа.",
        -    ),
        -    "mimes"            => ":attribute трябва да бъде файл с един от следните типове: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute трябва да бъде минимум :min.",
        -        "file"    => ":attribute трябва да бъде с големина минимум :min KB.",
        -        "string"  => ":attribute трябва да бъде минимум :min символа.",
        -    ),
        -    "not_in"           => "Избраният :attribute е невалиден.",
        -    "numeric"          => ":attribute трябва да бъде число.",
        -    "regex"            => "Форматът на :attribute е невалиден.",
        -    "required"         => "Полето :attribute е задължително.",
        -    "required_if"      => "Полето :attribute е задължително, когато :other е :value.",
        -    "required_with"    => ":attribute е задължителен, когато са избрани :values.",
        -    "required_without" => ":attribute е задължителен, когато не са избрани :values.",
        -    "same"             => ":attribute и :other трябва да съвпадат.",
        -    "size"             => array(
        -        "numeric" => ":attribute трябва да бъде с дължина :size.",
        -        "file"    => ":attribute трябва да бъде с големина :size KB.",
        -        "string"  => ":attribute трябва да бъде с дължина :size символа.",
        -    ),
        -    "unique"           => ":attribute вече е вписан.",
        -    "url"              => "Форматът на :attribute е невалиден.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute трябва да бъде потвърден.',
        +    'active_url'           => ':attribute не е валиден URL адрес.',
        +    'after'                => ':attribute трябва да бъде дата след :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute може да съдържа единствено букви.',
        +    'alpha_dash'           => ':attribute може да съдържа единствено букви, числа и тире.',
        +    'alpha_num'            => ':attribute може да съдържа единствено букви и числа.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute трябва да бъде дата преди :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute трябва да бъде между :min и :max.',
        +        'file'    => ':attribute трябва да бъде с големина между :min и :max KB.',
        +        'string'  => ':attribute трябва да бъде с дължина между :min и :max символа.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute трябва да е верен или грешен.',
        +    'confirmed'            => ':attribute потвърждение не съвпада.',
        +    'date'                 => ':attribute не е валидна дата.',
        +    'date_format'          => ':attribute не съвпада с формата :format.',
        +    'different'            => ':attribute и :other трябва да се различават.',
        +    'digits'               => ':attribute трябва да бъде с дължина :digits цифри.',
        +    'digits_between'       => ':attribute трябва да бъде с дължина между :min и :max цифри.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute е с невалиден формат.',
        +    'exists'               => 'Избраният :attribute е невалиден.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute трябва да бъде изображение.',
        +    'in'                   => 'Избраният :attribute е невалиден.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute трябва да бъде целочислен.',
        +    'ip'                   => ':attribute трябва да бъде валиден IP адрес.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute не може да бъде по-дълъг от :max.',
        +        'file'    => ':attribute не може да бъде по-голям от :max KB.',
        +        'string'  => ':attribute не може да бъде по-дълъг от :max символа.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute трябва да бъде файл с един от следните типове: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute трябва да бъде минимум :min.',
        +        'file'    => ':attribute трябва да бъде с големина минимум :min KB.',
        +        'string'  => ':attribute трябва да бъде минимум :min символа.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Избраният :attribute е невалиден.',
        +    'numeric'              => ':attribute трябва да бъде число.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Форматът на :attribute е невалиден.',
        +    'required'             => 'Полето :attribute е задължително.',
        +    'required_if'          => 'Полето :attribute е задължително, когато :other е :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute е задължителен, когато са избрани :values.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute е задължителен, когато не са избрани :values.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute и :other трябва да съвпадат.',
        +    'size'                 => [
        +        'numeric' => ':attribute трябва да бъде с дължина :size.',
        +        'file'    => ':attribute трябва да бъде с големина :size KB.',
        +        'string'  => ':attribute трябва да бъде с дължина :size символа.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute вече е вписан.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Форматът на :attribute е невалиден.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => ":attribute съдържа символи, които са забранени.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/cs/admin/asset_maintenances/message.php b/resources/lang/cs/admin/asset_maintenances/message.php
        index 5fb731a936..8582ccecbd 100644
        --- a/resources/lang/cs/admin/asset_maintenances/message.php
        +++ b/resources/lang/cs/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Údržbu zařízení se nepodařilo vytvořit, zkuste to prosím znovu.',
                     'success' => 'Údržba zařízení byla v pořádku vytvořena.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Prozatím nedokončeno',
                 'warranty'                     => 'Záruka',
                 'not_warranty'                 => 'Bez záruky',
        diff --git a/resources/lang/cs/admin/asset_maintenances/table.php b/resources/lang/cs/admin/asset_maintenances/table.php
        index 40c2bfa05b..baf0564a9d 100644
        --- a/resources/lang/cs/admin/asset_maintenances/table.php
        +++ b/resources/lang/cs/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Údržba zařízení',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Název majetku',
                 'is_warranty'   => 'Záruka',
                 'dl_csv'        => 'Stáhnout CSV'
             ];
        diff --git a/resources/lang/cs/admin/categories/general.php b/resources/lang/cs/admin/categories/general.php
        index 1441fb2d69..78b658ed12 100644
        --- a/resources/lang/cs/admin/categories/general.php
        +++ b/resources/lang/cs/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Informace o kategoriích',
        +    'about_categories'  				=> 'Kategorie usnadňují organizovat majetek. Takovou kategorii může být např. &quot;Desktopy&quot;, &quot;Notebooky&quot;, &quot;Mobilní telefony&quot;, &quot;Tablety&quot;, apod., ale můžete použít kategorie jakýmkoli způsobem.',
             'asset_categories' 					=> 'Kategorie majetku',
             'category_name'  					=> 'Jméno kategorie',
             'checkin_email'                     => 'Poslat uživateli zprávu při přejímce.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Upravit Kategorii',
             'eula_text'							=> 'EULA Kategorie',
             'eula_text_help'					=> 'Toto pole umožňuje upravit EULA pro různé druhy majetku. Pokud máte pouze jeden typ pro všechen majetek, můžete zaškrtnout položku níže pro použití jako výchozí.',
        +    'name'                              => 'Název kategorie',
             'require_acceptance'				=> 'Žádat uživatelé o potvrzení převzetí majetku v této kategorii.',
             'required_acceptance'				=> 'Uživateli bude zaslán email s odkazem pro potvrzení přijetí této položky.',
             'required_eula'						=> 'Tomuto uživateli bude zaslána kopie EUAL emailem',
        diff --git a/resources/lang/cs/admin/companies/general.php b/resources/lang/cs/admin/companies/general.php
        index 0f5fb5d48e..5504ed7187 100644
        --- a/resources/lang/cs/admin/companies/general.php
        +++ b/resources/lang/cs/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'O společnostech',
        +    'about_companies_text'                  => 'Společnosti mohou být použity jako jednoduché pole identifikátorů nebo mohou být použity k omezení viditelnosti majetku, uživatelů atd., Pokud je v nastavení administrátora povolena plná podpora společnosti.',
             'select_company' => 'Zvolte společnost',
         ];
        diff --git a/resources/lang/cs/admin/consumables/general.php b/resources/lang/cs/admin/consumables/general.php
        index 7698b78428..3fe5651768 100644
        --- a/resources/lang/cs/admin/consumables/general.php
        +++ b/resources/lang/cs/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> 'O spotřebním materiálu',
             'about_consumables_text'  			=> 'Spotřební materiál jsou takové položky, které jsou v čase spotřebovávány, jako např. toner, inkoust či papír do tiskáren.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'Výdej spotřebního materiálu uživateli',
             'consumable_name'                   => 'Název sp. materiálu',
             'create'                            => 'Vytvořit sp. materiál',
             'item_no'                           => 'Položka č.',
        diff --git a/resources/lang/cs/admin/custom_fields/general.php b/resources/lang/cs/admin/custom_fields/general.php
        index 16f4815b52..0308f5aaf1 100644
        --- a/resources/lang/cs/admin/custom_fields/general.php
        +++ b/resources/lang/cs/admin/custom_fields/general.php
        @@ -5,17 +5,17 @@ return array(
             'field'		                => 'Pole',
             'about_fieldsets_title'		=> 'O sadách polí',
             'about_fieldsets_text'		=> 'Sady polí Vám umožňují vytvořit si vlastní hodnoty, které chcete evidovat u modelů majetku.',
        -    'custom_format'             => 'Custom format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        -    'encrypted'      	        => 'Encrypted',
        +    'custom_format'             => 'Vlastní formát...',
        +    'encrypt_field'      	        => 'Zašifrovat hodnotu tohoto pole v databázi',
        +    'encrypt_field_help'      => 'UPOZORNĚNÍ: Šifrování pole je udělá nevyhledatelné.',
        +    'encrypted'      	        => 'Šifrováno',
             'fieldset'      	        => 'Sada',
             'qty_fields'      	      => 'Počet',
             'fieldsets'      	        => 'Sady',
             'fieldset_name'           => 'Název sady',
             'field_name'              => 'Název pole',
        -    'field_values'            => 'Field Values',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values'            => 'Hodnota',
        +    'field_values_help'       => 'Přidat možnosti výběru, jedna možnost na řádek. Prázdné řádky jiné než první řádek budou ignorovány.',
             'field_element'           => 'Typ pole',
             'field_element_short'     => 'Typ',
             'field_format'            => 'Formát',
        @@ -26,5 +26,5 @@ return array(
             'order'   		            => 'Pořadí',
             'create_fieldset'         => 'Nová sada',
             'create_field'            => 'Nové vlastní pole',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'value_encrypted'      	        => 'Hodnota tohoto pole je zašifrována v databázi. Pouze administrátoři budou moci zobrazit dešifrovanou hodnotu',
         );
        diff --git a/resources/lang/cs/admin/custom_fields/message.php b/resources/lang/cs/admin/custom_fields/message.php
        index 0a0600d7b7..22d2bdcaeb 100644
        --- a/resources/lang/cs/admin/custom_fields/message.php
        +++ b/resources/lang/cs/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Sadu se nám nepodařilo vytvořit, pokuste se o to znovu.',
        diff --git a/resources/lang/cs/admin/departments/message.php b/resources/lang/cs/admin/departments/message.php
        new file mode 100644
        index 0000000000..c2f1f1452f
        --- /dev/null
        +++ b/resources/lang/cs/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Oddělení neexistuje.',
        +    'assoc_users'	 => 'Toto oddělení je momentálně přiřazeno alespoň jednomu uživateli a nelze jej smazat. Aktualizujte své uživatele tak, aby již neodkázali na toto oddělení a zkuste to znovu.',
        +    'create' => array(
        +        'error'   => 'Oddělení nebylo vytvořeno, zkuste to prosím znovu.',
        +        'success' => 'Oddělení bylo úspěšně vytvořeno.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Oddělení nebylo aktualizováno, zkuste to prosím znovu',
        +        'success' => 'Oddělení se úspěšně aktualizovalo.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Opravdu chcete smazat toto oddělení?',
        +        'error'   => 'Byl problém odstranit oddělení. Prosím zkuste to znovu.',
        +        'success' => 'Oddělení bylo úspěšně smazáno.'
        +    )
        +
        +);
        diff --git a/resources/lang/cs/admin/departments/table.php b/resources/lang/cs/admin/departments/table.php
        new file mode 100644
        index 0000000000..057b2eaf5c
        --- /dev/null
        +++ b/resources/lang/cs/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Název Oddělení',
        +    'manager'                   => 'Manažer',
        +    'location'                  => 'Umístění',
        +    'create'                    => 'Vytvořit Oddělení',
        +    'update'                    => 'Aktualizovat Oddělení',
        +    );
        diff --git a/resources/lang/cs/admin/depreciations/general.php b/resources/lang/cs/admin/depreciations/general.php
        index fd4cb2988a..12ffa64ad7 100644
        --- a/resources/lang/cs/admin/depreciations/general.php
        +++ b/resources/lang/cs/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'O amortizaci majetku',
             'about_depreciations'  					=> 'Můžete nastavit amortizaci majetku pro jeho rovnoměrné odepisování.',
             'asset_depreciations'  					=> 'Amortizace majetku',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Vytvořit amortizaci',
             'depreciation_name'  					=> 'Jméno amortizace',
             'number_of_months'  					=> 'Počet měsíců',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Aktualizovat amortizaci',
         
         );
        diff --git a/resources/lang/cs/admin/groups/titles.php b/resources/lang/cs/admin/groups/titles.php
        index dbf0118656..73ff79f4f0 100644
        --- a/resources/lang/cs/admin/groups/titles.php
        +++ b/resources/lang/cs/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'O skupinách',
        +    'about_groups'                  => 'Skupiny se používají ke zobecnění uživatelských oprávnění.',
             'group_management' 	 	=> 'Správa skupin',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Vytvořit novou skupinu',
        +    'update' 	 		        => 'Upravit skupinu',
             'group_name' 	 		=> 'Název skupiny',
             'group_admin' 	 		=> 'Správce skupiny',
             'allow' 	 			=> 'Povolit',
        diff --git a/resources/lang/cs/admin/hardware/form.php b/resources/lang/cs/admin/hardware/form.php
        index f3677823ed..e1de3d474f 100644
        --- a/resources/lang/cs/admin/hardware/form.php
        +++ b/resources/lang/cs/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Potvrzení hromadného odstranění majetku',
           'bulk_delete_help'	=> 'Zkontrolujte seznam odstraňovaného majetku níže. Jakmile jej potvrdíte, nebude možné tento majetek obnovit a budou zrušeny i vazby na uživatele, kteří jej měli v držení.',
           'bulk_delete_warn'	=> 'Chystáte se odstranit :asset_count položek majetku.',
         	'bulk_update'		=> 'Hromadná aktualizace majetku',
        diff --git a/resources/lang/cs/admin/hardware/general.php b/resources/lang/cs/admin/hardware/general.php
        index fa8bee067a..37b129d873 100644
        --- a/resources/lang/cs/admin/hardware/general.php
        +++ b/resources/lang/cs/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'O majetku',
        +    'about_assets_text'            => 'Majetky jsou položky sledované sériovým číslem nebo značkou. Mají tendenci mít vyšší hodnotou, tam kde je důležitá identifikace určité položky.',
         	'archived'  				=> 'Archivováno',
             'asset'  					=> 'Majetek',
        -    'bulk_checkout'             => 'Checkout Assets to User',
        +    'bulk_checkout'             => 'Předat majetek uživateli',
             'checkin'  					=> 'Převzít majetek',
        -    'checkout'  				=> 'Předat majetek uživateli',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Klonovat majetek',
             'deployable'  				=> 'Připraveno k nasazení',
             'deleted'  					=> 'Toto zařízení bylo odstraněno. <a href="/hardware/:asset_id/restore">Klepněte zde pro jeho obnovení</a>.',
        @@ -15,7 +15,7 @@ return array(
         	'filetype_info'				=> 'Povolené soubory jsou png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, a rar.',
             'model_deleted'  			=> 'Tento model majetku byl odstraněn. Přejete-li si obnovit zařízení, <a href="/hardware/models/:model_id/restore">klepněte zde</a><br/> a obnovte nejdříve jeho model.',
             'requestable'               => 'Lze vyžádat',
        -    'requested'				    => 'Requested',
        +    'requested'				    => 'Požadováno',
             'restore'  					=> 'Obnovit zařízení',
             'pending'  					=> 'Čekající',
             'undeployable'  			=> 'Nepřiřaditelné',
        diff --git a/resources/lang/cs/admin/hardware/message.php b/resources/lang/cs/admin/hardware/message.php
        index 940c035701..d5dbe486ba 100644
        --- a/resources/lang/cs/admin/hardware/message.php
        +++ b/resources/lang/cs/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Majetek byl v pořádku obnoven.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Soubor se nesmazal, prosím zkuste to znovu.',
                 'success' => 'Soubor byl úspěšně smazán.',
        @@ -37,17 +43,18 @@ return array(
             ),
         
             'import' => array(
        -        'error'                 => 'Some items did not import correctly.',
        -        'errorDetail'           => 'The following Items were not imported because of errors.',
        -        'success'               => "Your file has been imported",
        -        'file_delete_success'   => "Your file has been been successfully deleted",
        -        'file_delete_error'      => "The file was unable to be deleted",
        +        'error'                 => 'Některé položky nebyly správně importovány.',
        +        'errorDetail'           => 'Následující položky nebyly importovány kvůli chybám.',
        +        'success'               => "Váš soubor byl importován",
        +        'file_delete_success'   => "Váš soubor byl úspěšně odstraněn",
        +        'file_delete_error'      => "Soubor nelze odstranit",
             ),
         
         
             'delete' => array(
                 'confirm'   	=> 'Opravdu si přejete tento majetek odstranit?',
                 'error'   		=> 'Nepodařilo se nám tento majetek odstranit. Zkuste to prosím znovu.',
        +        'nothing_updated'   => 'Žádný majetek nebyl vybrán, takže nic nebylo odstraněno.',
                 'success' 		=> 'Majetek byl úspěšně smazán.'
             ),
         
        @@ -55,7 +62,7 @@ return array(
                 'error'   		=> 'Majetek nebyl předán, zkuste to prosím znovu',
                 'success' 		=> 'Majetek byl v pořádku předán.',
                 'user_does_not_exist' => 'Tento uživatel je neplatný. Zkuste to prosím znovu.',
        -        'not_available' => 'That asset is not available for checkout!'
        +        'not_available' => 'Tento majetek není k dispozici pro výdej!'
             ),
         
             'checkin' => array(
        @@ -69,7 +76,7 @@ return array(
             'requests' => array(
                 'error'   		=> 'Majetek nebyl vyžádán, zkuste to prosím znovu',
                 'success' 		=> 'Vyžádání majetku proběhlo v pořádku.',
        -        'canceled'      => 'Checkout request successfully canceled'
        +        'canceled'      => 'Požadavek na výdej byl úspěšně zrušen'
             )
         
         );
        diff --git a/resources/lang/cs/admin/licenses/general.php b/resources/lang/cs/admin/licenses/general.php
        index 3f976bc983..c2b56ec195 100644
        --- a/resources/lang/cs/admin/licenses/general.php
        +++ b/resources/lang/cs/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'O licencích',
        +    'about_licenses'                  => 'Licence jsou používány ke sledování softwaru. Mají stanovený počet uživatelských licencí, které mohou být přiděleny jednotlivcům',
             'checkin'  					=> 'Převzít jednu licenci',
             'checkout_history'  		=> 'Historie',
             'checkout'  				=> 'Předat jednu licenci',
        diff --git a/resources/lang/cs/admin/licenses/message.php b/resources/lang/cs/admin/licenses/message.php
        index 6b8c10e3cf..d15f182c6f 100644
        --- a/resources/lang/cs/admin/licenses/message.php
        +++ b/resources/lang/cs/admin/licenses/message.php
        @@ -4,9 +4,9 @@ return array(
         
             'does_not_exist' => 'Licence neexistuje.',
             'user_does_not_exist' => 'Uživatel neexistuje.',
        -    'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
        -    'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
        -    'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
        +    'asset_does_not_exist' 	=> 'Majetek, který se pokoušíte spojit s touto licencí, neexistuje.',
        +    'owner_doesnt_match_asset' => 'Majetek, který se pokoušíte spojit s touto licencí, vlastní někdo jiný než osoba vybraná v rozbalovací nabídce k této licenci.',
        +    'assoc_users'	 => 'Licence je předána svému uživateli a nelze ji odstranit. Před odstraněním ji nejprve převezměte. ',
         
         
             'create' => array(
        @@ -21,29 +21,29 @@ return array(
         
             'upload' => array(
                 'error'   => 'Soubor(y) se nepodařilo nahrát. Prosím zkuste to znovu.',
        -        'success' => 'File(s) successfully uploaded.',
        -        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'success' => 'Soubor(y) byly v pořádku nahrány.',
        +        'nofiles' => 'K nahrání jste nevybrali žádný, nebo příliš velký soubor',
        +        'invalidfiles' => 'Jeden nebo více označených souborů je příliš velkých nebo nejsou podporované. Povolenými příponami jsou png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, a lic.',
             ),
         
             'update' => array(
        -        'error'   => 'License was not updated, please try again',
        -        'success' => 'License updated successfully.'
        +        'error'   => 'Licence nebyla aktualizována, zkuste to prosím znovu',
        +        'success' => 'Licence byla úspěšně aktualizována.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this license?',
        -        'error'   => 'There was an issue deleting the license. Please try again.',
        +        'confirm'   => 'Jste si jisti, že chcete odstranit tuto licenci?',
        +        'error'   => 'Vyskytl se problém při mazání licence. Zkuste to znovu prosím.',
                 'success' => 'Licence byla úspěšně smazána.'
             ),
         
             'checkout' => array(
        -        'error'   => 'There was an issue checking out the license. Please try again.',
        -        'success' => 'The license was checked out successfully'
        +        'error'   => 'Vyskytl se problém při výdeji licence. Zkuste to znovu prosím.',
        +        'success' => 'Licence byla úspěšně vydána'
             ),
         
             'checkin' => array(
        -        'error'   => 'There was an issue checking in the license. Please try again.',
        +        'error'   => 'Vyskytl se problém při ověřování licence. Zkuste to znovu prosím.',
                 'success' => 'Licence byla úspěšně zkontrolována'
             ),
         
        diff --git a/resources/lang/cs/admin/locations/message.php b/resources/lang/cs/admin/locations/message.php
        index 9f89306647..55d776091d 100644
        --- a/resources/lang/cs/admin/locations/message.php
        +++ b/resources/lang/cs/admin/locations/message.php
        @@ -3,9 +3,9 @@
         return array(
         
             'does_not_exist' => 'Místo neexistuje.',
        -    'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
        -    'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
        -    'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
        +    'assoc_users'	 => 'Toto umístění je spojeno s alespoň jedním uživatelem a nemůže být smazáno. Aktualizujte uživatele aby nenáleželi k tomuto umístění a zkuste to znovu. ',
        +    'assoc_assets'	 => 'Toto umístění je spojeno s alespoň jedním majetkem a nemůže být smazáno. Aktualizujte majetky tak aby nenáleželi k tomuto umístění a zkuste to znovu. ',
        +    'assoc_child_loc'	 => 'Toto umístění je nadřazené alespoň jednomu umístění a nelze jej smazat. Aktualizujte své umístění tak, aby na toto umístění již neodkazovalo a zkuste to znovu. ',
         
         
             'create' => array(
        diff --git a/resources/lang/cs/admin/locations/table.php b/resources/lang/cs/admin/locations/table.php
        index 7584ee6405..319e674bc0 100644
        --- a/resources/lang/cs/admin/locations/table.php
        +++ b/resources/lang/cs/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'O umístěních',
        +    'about_locations'           => 'Umístění se používá ke sledování informací o poloze uživatelů, majetku a dalších položek',
             'assets_rtd'                => 'Zařízení', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Předaných zař.',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Umístění',
             'parent'                    => 'Nadřazené',
             'currency'                  => 'Měna',
        +    'ldap_ou'                   => 'LDAP Vyhledat OU',
             );
        diff --git a/resources/lang/cs/admin/manufacturers/table.php b/resources/lang/cs/admin/manufacturers/table.php
        index eca92ef8e5..4254e895a7 100644
        --- a/resources/lang/cs/admin/manufacturers/table.php
        +++ b/resources/lang/cs/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'O výrobcích',
        +    'about_manufacturers_text'  => 'Výrobci jsou společnosti, které vytvářejí váš majetek. Zde můžete uložit důležitá kontaktní informace o podpoře, která se zobrazí na stránkách s podrobnostmi o majetku.',
             'asset_manufacturers'	=> 'Výrobci',
             'create'				=> 'Vytvořit výrobce',
             'id'   					=> 'ID',
        -    'name'      			=> 'Název Výrobce',
        +    'name'      			=> 'Název',
        +    'support_email'   		=> 'Emailová podpora',
        +    'support_phone'   		=> 'Telefonní podpora',
        +    'support_url'   		=> 'URL podpory',
             'update'				=> 'Upravit Výrobce',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/cs/admin/models/general.php b/resources/lang/cs/admin/models/general.php
        index b9adec6670..a2fee4f218 100644
        --- a/resources/lang/cs/admin/models/general.php
        +++ b/resources/lang/cs/admin/models/general.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'O modelech majetku',
        +    'about_models_text'           => 'Modely majetku jsou způsoby seskupení shodných majetků. "MBP 2013", "iPhone 6s" atd.',
             'deleted'  					        => 'Model byl vymazán. <a href="/hardware/models/:model_id/restore">Klikněte sem pro jeho obnovení</a>.',
             'restore'                   => 'Obnovení Modelu',
        -    'requestable'               => 'Users may request this model',
        +    'requestable'               => 'Uživatelé můžou požádat o tento model',
         	'show_mac_address'			      => 'Zobrazovat pole MAC adresa u zařízení tohoto druhu',
             'view_deleted'              => 'Zobrazit smazané',
             'view_models'               => 'Zobrazit Modely',
        diff --git a/resources/lang/cs/admin/models/message.php b/resources/lang/cs/admin/models/message.php
        index fe51cb8d4c..18f7443cf8 100644
        --- a/resources/lang/cs/admin/models/message.php
        +++ b/resources/lang/cs/admin/models/message.php
        @@ -2,30 +2,35 @@
         
         return array(
         
        -    'does_not_exist' => 'Model does not exist.',
        -    'assoc_users'	 => 'This model is currently associated with one or more assets and cannot be deleted. Please delete the assets, and then try deleting again. ',
        +    'does_not_exist' => 'Model neexistuje.',
        +    'assoc_users'	 => 'Tento model je spojen s alespoň jedním majetkem a nemůže být smazán. Prosím smažte tyto majetky a pak to zkuste znovu. ',
         
         
             'create' => array(
        -        'error'   => 'Model was not created, please try again.',
        -        'success' => 'Model created successfully.',
        -        'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
        +        'error'   => 'Model nebyl vytvořen, zkuste to znovu.',
        +        'success' => 'Model byl úspěšně vytvořen.',
        +        'duplicate_set' => 'Model majetku s tímto názvem, výrobcem a číslem modelu již existuje.',
             ),
         
             'update' => array(
        -        'error'   => 'Model was not updated, please try again',
        -        'success' => 'Model updated successfully.'
        +        'error'   => 'Model nebyl aktualizován, zkuste to prosím znovu',
        +        'success' => 'Model byl úspěšně aktualizován.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this asset model?',
        -        'error'   => 'There was an issue deleting the model. Please try again.',
        -        'success' => 'The model was deleted successfully.'
        +        'confirm'   => 'Opravdu si přejete tento model majetku odstranit?',
        +        'error'   => 'Vyskytl se problém se smazáním modelu. Zkuste to znovu.',
        +        'success' => 'Model byl úspěšně smazán.'
             ),
         
             'restore' => array(
        -        'error'   		=> 'Model was not restored, please try again',
        -        'success' 		=> 'Model restored successfully.'
        +        'error'   		=> 'Model nebyl obnoven, zkuste to prosím znovu',
        +        'success' 		=> 'Model byl úspěšně obnoven.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'Žádné pole nebyly změněny, takže nic nebylo aktualizováno.',
        +        'success' 		=> 'Modely byly aktualizovány.'
             ),
         
         );
        diff --git a/resources/lang/cs/admin/settings/general.php b/resources/lang/cs/admin/settings/general.php
        index 4ac3d2126e..4b58757ab5 100644
        --- a/resources/lang/cs/admin/settings/general.php
        +++ b/resources/lang/cs/admin/settings/general.php
        @@ -2,132 +2,147 @@
         
         return array(
             'ad'				        => 'Active Directory',
        -    'ad_domain'				    => 'Active Directory domain',
        -    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        -    'is_ad'				        => 'This is an Active Directory server',
        +    'ad_domain'				    => 'Doména služby Active Directory',
        +    'ad_domain_help'			=> 'Toto je někdy stejné jako vaše emailová doména, ale ne vždy.',
        +    'is_ad'				        => 'Toto je server služby Active Directory',
         	'alert_email'				=> 'Zasílat upozornění na',
         	'alerts_enabled'			=> 'Upozornění zapnutá',
         	'alert_interval'			=> 'Mez upozornění na vypršení (ve dnech)',
         	'alert_inv_threshold'		=> 'Mez upozornění skladu',
         	'asset_ids'					=> 'ID majetku',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Vygenerovat zvyšující se ID majetku',
         	'auto_increment_prefix'		=> 'Předpona (volitnelná)',
         	'auto_incrementing_help'    => 'Nastavte nejdříve automaticky se zvyšující ID majetku pro nastavení tohoto',
         	'backups'					=> 'Zálohy',
         	'barcode_settings'			=> 'Nastavení čárového kódu',
             'confirm_purge'			    => 'Potvrdit vyčištění',
        -    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        -	'custom_css'				=> 'Custom CSS',
        -	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
        -	'default_currency'  		=> 'Default Currency',
        +    'confirm_purge_help'		=> 'Do rámečku níže zadejte text "DELETE", čímž odstraníte odstraněné záznamy. Tuto akci nelze vrátit zpět.',
        +	'custom_css'				=> 'Vlastní CSS',
        +	'custom_css_help'			=> 'Zadejte libovolné vlastní CSS, které chcete použít. Nezahrnujte &lt;style&gt;&lt;/style&gt; tagy.',
        +	'default_currency'  		=> 'Výchozí měna',
         	'default_eula_text'			=> 'Výchozí EULA',
        -  'default_language'					=> 'Default Language',
        +  'default_language'					=> 'Výchozí jazyk',
         	'default_eula_help_text'	=> 'Můžete také spojit vlastní EULA se specifickými kategoriemi majetku.',
             'display_asset_name'        => 'Zobrazit název majetku',
             'display_checkout_date'     => 'Zobrazit den převzetí',
             'display_eol'               => 'Zobrazit EOL v tabulkovém zobrazení',
        -    'display_qr'                => 'Display Square Codes',
        -	'display_alt_barcode'		=> 'Display 1D barcode',
        -	'barcode_type'				=> '2D Barcode Type',
        -	'alt_barcode_type'			=> '1D barcode type',
        +    'display_qr'                => 'Zobrazit kódy',
        +	'display_alt_barcode'		=> 'Zobrazit 1D čárový kód',
        +	'barcode_type'				=> 'Typ 2D čárového kódu',
        +	'alt_barcode_type'			=> 'Typ 1D čárového kódu',
             'eula_settings'				=> 'Nastavení EULA',
             'eula_markdown'				=> 'Tato EULA umožňuje <a href="https://help.github.com/articles/github-flavored-markdown/">Github markdown</a>.',
             'general_settings'			=> 'Obecné nastavení',
        -	'generate_backup'			=> 'Generate Backup',
        +	'generate_backup'			=> 'Vytvořit zálohu',
             'header_color'              => 'Barva záhlaví',
             'info'                      => 'Tato nastavení umožňují zvolit určité prvky instalace.',
             'laravel'                   => 'Verze Laravel',
        -    'ldap_enabled'              => 'LDAP enabled',
        -    'ldap_integration'          => 'LDAP Integration',
        -    'ldap_settings'             => 'LDAP Settings',
        -    'ldap_server'               => 'LDAP Server',
        -    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        -	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
        -	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
        -	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        -    'ldap_tls'                  => 'Use TLS',
        -    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        -    'ldap_uname'                => 'LDAP Bind Username',
        -    'ldap_pword'                => 'LDAP Bind Password',
        -    'ldap_basedn'               => 'Base Bind DN',
        -    'ldap_filter'               => 'LDAP Filter',
        -    'ldap_pw_sync'              => 'LDAP Password Sync',
        -    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        -    'ldap_username_field'       => 'Username Field',
        -    'ldap_lname_field'          => 'Last Name',
        -    'ldap_fname_field'          => 'LDAP First Name',
        -    'ldap_auth_filter_query'    => 'LDAP Authentication query',
        -    'ldap_version'              => 'LDAP Version',
        +    'ldap_enabled'              => 'LDAP povoleno',
        +    'ldap_integration'          => 'LDAP integrace',
        +    'ldap_settings'             => 'Nastavení LDAP',
        +    'ldap_server'               => 'LDAP server',
        +    'ldap_server_help'          => 'Toto by mělo začít s ldap: // (pro nešifrované nebo TLS) nebo ldaps: // (pro SSL)',
        +	'ldap_server_cert'			=> 'Validace certifikátů LDAP SSL',
        +	'ldap_server_cert_ignore'	=> 'Povolit neplatný certifikát SSL',
        +	'ldap_server_cert_help'		=> 'Zaškrtněte toto políčko, pokud používáte SSL certifikát s vlastním podpisem a chcete přijmout neplatný certifikát SSL.',
        +    'ldap_tls'                  => 'Použít TLS',
        +    'ldap_tls_help'             => 'Tuto možnost byste měli zkontrolovat pouze v případě, že používáte STARTTLS na serveru LDAP. ',
        +    'ldap_uname'                => 'LDAP uživatelské jméno připojení',
        +    'ldap_pword'                => 'LDAP heslo připojení',
        +    'ldap_basedn'               => 'Základní svázání DN',
        +    'ldap_filter'               => 'LDAP filtr',
        +    'ldap_pw_sync'              => 'LDAP heslo synchronizace',
        +    'ldap_pw_sync_help'         => 'Zrušte zaškrtnutí tohoto políčka, pokud si nepřejete zachovat hesla LDAP synchronizovaná s lokálními hesly. Pokud to zakážete znamená to, že se uživatelé nemusí přihlásit, pokud je váš LDAP server z nějakého důvodu nedostupný.',
        +    'ldap_username_field'       => 'Pole uživatelského jména',
        +    'ldap_lname_field'          => 'Příjmení',
        +    'ldap_fname_field'          => 'LDAP jméno',
        +    'ldap_auth_filter_query'    => 'LDAP ověřovací dotaz',
        +    'ldap_version'              => 'Verze LDAP',
             'ldap_active_flag'          => 'LDAP Active Flag',
        -    'ldap_emp_num'              => 'LDAP Employee Number',
        -    'ldap_email'                => 'LDAP Email',
        -    'load_remote_text'          => 'Remote Scripts',
        -    'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'ldap_emp_num'              => 'LDAP číslo zaměstnance',
        +    'ldap_email'                => 'LDAP email',
        +    'load_remote_text'          => 'Vzdálené skripty',
        +    'load_remote_help_text'		=> 'Tato instalace Snipe-IT může nahrávat skripty z vnějšího světa.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
        -    'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
        -    'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        +    'full_multiple_companies_support_help_text' => 'Omezení uživatelů (včetně správců) jsou přiřazená ke společnostem s majetkem společnosti.',
        +    'full_multiple_companies_support_text' => 'Plná podpora více společností',
             'optional'					=> 'volitelný',
             'per_page'                  => 'Výsledků na stránku',
             'php'                       => 'Verze PHP',
             'php_gd_info'               => 'Je nutné nainstalovat php-gd pro zobrazení QR kódů. Více v instalační příručce.',
             'php_gd_warning'            => 'PHP pluginy pro zpracování obrazu a GD nejsou nainstalovány.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Nejprve povolte QR kódy',
             'qr_text'                   => 'Text QR kódu',
             'setting'                   => 'Nastavení',
             'settings'                  => 'Nastavení',
             'site_name'                 => 'Název stránky',
             'slack_botname'             => 'Slack Botname',
        -    'slack_channel'             => 'Slack Channel',
        -    'slack_endpoint'            => 'Slack Endpoint',
        -    'slack_integration'         => 'Slack Settings',
        -    'slack_integration_help'    => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new">create an incoming webhook</a> on your Slack account.',
        +    'slack_channel'             => 'Slack kanál',
        +    'slack_endpoint'            => 'Slack koncový bod',
        +    'slack_integration'         => 'Nastavení Slack',
        +    'slack_integration_help'    => 'Slack integrace je dobrovolná, nicméně pokud ho chcete používat jsou vyžadovány koncový bod a kanál. Chcete-li nakonfigurovat integraci Slack, nejprve <a href=":slack_link" target="_new"> ytvořte příchozí webhook</a> na vašem Slack účtu.',
             'snipe_version'  			=> 'Verze Snipe-IT',
             'system'                    => 'Systémové informace',
             'update'                    => 'Upravit nastavení',
             'value'                     => 'Hodnota',
        -    'brand'                     => 'Branding',
        -    'about_settings_title'      => 'About Settings',
        -    'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
        -    'labels_per_page'           => 'Labels per page',
        -    'label_dimensions'          => 'Label dimensions (inches)',
        -    'page_padding'             => 'Page margins (inches)',
        -    'purge'                    => 'Purge Deleted Records',
        -    'labels_display_bgutter'    => 'Label bottom gutter',
        -    'labels_display_sgutter'    => 'Label side gutter',
        -    'labels_fontsize'           => 'Label font size',
        -    'labels_pagewidth'          => 'Label sheet width',
        -    'labels_pageheight'         => 'Label sheet height',
        -    'label_gutters'        => 'Label spacing (inches)',
        -    'page_dimensions'        => 'Page dimensions (inches)',
        -    'label_fields'          => 'Label visible fields',
        -    'inches'        => 'inches',
        -    'width_w'        => 'w',
        -    'height_h'        => 'h',
        +    'brand'                     => 'Opatřit značkou',
        +    'about_settings_title'      => 'O nastavení',
        +    'about_settings_text'       => 'Tato nastavení umožňují zvolit určité prvky instalace.',
        +    'labels_per_page'           => 'Štítků na stránku',
        +    'label_dimensions'          => 'Rozměry štítku (palce)',
        +    'next_auto_tag_base'        => 'Další auto přírůstek',
        +    'page_padding'             => 'Okraje stránky (palce)',
        +    'purge'                    => 'Vyčištění odstraněných záznamů',
        +    'labels_display_bgutter'    => 'Spodní okraj štítku',
        +    'labels_display_sgutter'    => 'Boční okraj štítku',
        +    'labels_fontsize'           => 'Velikost písma štítku',
        +    'labels_pagewidth'          => 'Šířka listu štítku',
        +    'labels_pageheight'         => 'Výška listu štítku',
        +    'label_gutters'        => 'Mezery štítku (palce)',
        +    'page_dimensions'        => 'Rozměry stránky (palce)',
        +    'label_fields'          => 'Viditelná pole štítku',
        +    'inches'        => 'palce',
        +    'width_w'        => 'š',
        +    'height_h'        => 'v',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        -    'left'        => 'left',
        -    'right'        => 'right',
        -    'top'        => 'top',
        -    'bottom'        => 'bottom',
        -    'vertical'        => 'vertical',
        -    'horizontal'        => 'horizontal',
        -    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Dvoufaktorové ověření',
        +    'two_factor_secret'        => 'Dvojfaktorový kód',
        +    'two_factor_enrollment'        => 'Dvojfaktorový zápis',
        +    'two_factor_enabled_text'        => 'Povolit Dvoufaktorové ověření',
        +    'two_factor_reset'        => 'Resetovat dvou faktorové tajemství',
        +    'two_factor_reset_help'        => 'Tímto bude uživatel přinucen, aby znovu zaregistroval své zařízení pomocí aplikace Google Authenticator. To může být užitečné, pokud ztratil nebo mu bylo odcizeno jeho aktuálně zapsané zařízení. ',
        +    'two_factor_reset_success'          => 'Resetování dvoufaktorového zařízení bylo úspěšné',
        +    'two_factor_reset_error'          => 'Resetování dvoufaktorového zařízení selhalo',
        +    'two_factor_enabled_warning'        => 'Povolení dvoufaktorového zabezpečení, pokud již není v současné době povoleno vás okamžitě donutí k ověření pomocí zařízení zapsaného v Google Auth. Pokud není v současné době žádné registrován. Budete mít možnost zapsat svoje zařízení.',
        +    'two_factor_enabled_help'        => 'Toto zapne dvoufaktorovou autentizaci pomocí služby Google Authenticator.',
        +    'two_factor_optional'        => 'Selektivní (Uživatelé mohou povolit nebo zakázat, je-li povolen)',
        +    'two_factor_required'        => 'Požadováno pro všechny uživatele',
        +    'two_factor_disabled'        => 'Zakázáno',
        +    'two_factor_enter_code'	=> 'Zadejte dvoufaktorový kód',
        +    'two_factor_config_complete'	=> 'Odeslat kód',
        +    'two_factor_enabled_edit_not_allowed' => 'Váš administrátor vám nedovolil upravit toto nastavení.',
        +    'two_factor_enrollment_text'	=> "Je vyžadováno dvoufaktorové ověření, nicméně vaše zařízení ještě nebylo zaregistrováno. Otevřete aplikaci Google Authenticator a oskenujte níže uvedený QR kód pro registraci vašeho zařízení. Jakmile zaregistrujete své zařízení, zadejte níže uvedený kód",
        +    'require_accept_signature'      => 'Požadovat podpis',
        +    'require_accept_signature_help_text'      => 'Aktivace této funkce bude vyžadovat, aby se uživatelé fyzicky přihlásili k přijetí určitého materiálu.',
        +    'left'        => 'vlevo',
        +    'right'        => 'vpravo',
        +    'top'        => 'nahoře',
        +    'bottom'        => 'dole',
        +    'vertical'        => 'svislé',
        +    'horizontal'        => 'vodorovné',
        +    'zerofill_count'        => 'Délka značek majetku včetně zerofill',
         );
        diff --git a/resources/lang/cs/admin/settings/message.php b/resources/lang/cs/admin/settings/message.php
        index c2ffff155f..d550b7b973 100644
        --- a/resources/lang/cs/admin/settings/message.php
        +++ b/resources/lang/cs/admin/settings/message.php
        @@ -8,15 +8,15 @@ return array(
                 'success'               => 'Nastavení úspěšně uloženo.'
             ),
             'backup' => array(
        -        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        -        'file_deleted'          => 'The backup file was successfully deleted. ',
        -        'generated'             => 'A new backup file was successfully created.',
        -        'file_not_found'        => 'That backup file could not be found on the server.',
        +        'delete_confirm'        => 'Opravdu chcete vymazat tento záložní soubor? Tuto akci nelze vrátit zpět. ',
        +        'file_deleted'          => 'Záložní soubor byl úspěšně smazán. ',
        +        'generated'             => 'Byla úspěšně vytvořena nová záloha.',
        +        'file_not_found'        => 'Tento záložní soubor nebyl na serveru nalezen.',
             ),
             'purge' => array(
        -        'error'     => 'An error has occurred while purging. ',
        -        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        -        'success'               => 'Deleted records successfully purged.'
        +        'error'     => 'Během čištění došlo k chybě. ',
        +        'validation_failed'     => 'Vaše potvrzení o čištění je nesprávné. Zadejte prosím slovo "DELETE" do potvrzovacího rámečku.',
        +        'success'               => 'Vymazané záznamy byly úspěšně vyčištěny.'
             ),
         
         );
        diff --git a/resources/lang/cs/admin/statuslabels/message.php b/resources/lang/cs/admin/statuslabels/message.php
        index 619a5a509c..27c45bac40 100644
        --- a/resources/lang/cs/admin/statuslabels/message.php
        +++ b/resources/lang/cs/admin/statuslabels/message.php
        @@ -2,24 +2,24 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        -    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +    'does_not_exist' => 'Stavový štítek neexistuje.',
        +    'assoc_assets'	 => 'Tento stavový štítek je právě přiřazena alespoň k jednomu modelu majetku a nemůže tak být odstraněn. Odeberte jeho vazbu z patřičných modelů a akci opakujte. ',
         
         
             'create' => array(
        -        'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'Status Label created successfully.'
        +        'error'   => 'Stavový štítek nebyl vytvořen, zkuste to prosím znovu.',
        +        'success' => 'Stavový štítek byl úspěšně vytvořen.'
             ),
         
             'update' => array(
        -        'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'Status Label updated successfully.'
        +        'error'   => 'Stavový štítek nebyl aktualizován, zkuste to prosím znovu',
        +        'success' => 'Stavový štítek byl úspěšně aktualizován.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        -        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        -        'success' => 'The Status Label was deleted successfully.'
        +        'confirm'   => 'Opravdu si přejete odstranit tento stavový štítek?',
        +        'error'   => 'Vyskytl se problém při mazání datového štítku. Zkuste to znovu prosím.',
        +        'success' => 'Stavový štítek byl úspěšně smazán.'
             )
         
         );
        diff --git a/resources/lang/cs/admin/statuslabels/table.php b/resources/lang/cs/admin/statuslabels/table.php
        index 4ec43e4840..20c123f095 100644
        --- a/resources/lang/cs/admin/statuslabels/table.php
        +++ b/resources/lang/cs/admin/statuslabels/table.php
        @@ -4,13 +4,13 @@ return array(
             'about'      	=> 'O označení stavu',
             'archived'      	=> 'Archivováno',
             'create'      	=> 'Vytvořit označení stavu',
        -    'color'      	=> 'Chart Color',
        +    'color'      	=> 'Barva grafu',
             'deployable'      	=> 'Připraveno k nasazení',
             'info'      	=> 'Označení stavu se používá k popisu různých stavů majetku. Můžou být v opravě, ztracení atd. Lze vytvořit nové stavy pro další možné stavy.',
             'name'      	=> 'Název stavu',
             'pending'      	=> 'Probíhající',
             'status_type'   => 'Typ stavu',
        -    'show_in_nav'   => 'Show in side nav',
        +    'show_in_nav'   => 'Zobrazit ve vedlejším navigačním panelu',
             'title'      	=> 'Označení stavu',
             'undeployable'  => 'Nemožné připravit',
             'update'      	=> 'Upravit označení stavu',
        diff --git a/resources/lang/cs/admin/suppliers/message.php b/resources/lang/cs/admin/suppliers/message.php
        index 2d9285b717..9f7eb92b86 100644
        --- a/resources/lang/cs/admin/suppliers/message.php
        +++ b/resources/lang/cs/admin/suppliers/message.php
        @@ -3,21 +3,21 @@
         return array(
         
             'does_not_exist' => 'Dodavatel neexistuje.',
        -    'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
        +    'assoc_users'	 => 'Tento dodavatel je právě přiřazena alespoň k jednomu modelu majetku a nemůže tak být odstraněn. Odeberte jeho vazbu z patřičných modelů a akci opakujte. ',
         
             'create' => array(
        -        'error'   => 'Supplier was not created, please try again.',
        +        'error'   => 'Dodavatel nebyl vytvořen, zkuste to prosím znovu.',
                 'success' => 'Dodavatel úspěšně vytvořen.'
             ),
         
             'update' => array(
        -        'error'   => 'Supplier was not updated, please try again',
        +        'error'   => 'Dodavatel nebyl aktualizován, zkuste to prosím znovu',
                 'success' => 'Dodavatel úspěšně aktualizován.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this supplier?',
        -        'error'   => 'There was an issue deleting the supplier. Please try again.',
        +        'confirm'   => 'Opravdu si přejete odstranit tohoto dodavatele?',
        +        'error'   => 'Vyskytl se problém při mazání dodavatele. Zkuste to prosím znovu.',
                 'success' => 'Dodavatel byl úspěšně smazán.'
             )
         
        diff --git a/resources/lang/cs/admin/suppliers/table.php b/resources/lang/cs/admin/suppliers/table.php
        index 1f22417b1e..d671c33c1c 100644
        --- a/resources/lang/cs/admin/suppliers/table.php
        +++ b/resources/lang/cs/admin/suppliers/table.php
        @@ -1,10 +1,10 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'O dodavatelích',
        +    'about_suppliers_text'  => 'Dodavatelé se používají ke sledování zdroje položek',
             'address'               => 'Adresa dodavatele',
        -    'assets'                => 'Assets',
        +    'assets'                => 'Majetek',
             'city'                  => 'Město',
             'contact'               => 'Kontaktní osoba',
             'country'               => 'Země',
        @@ -18,10 +18,10 @@ return array(
             'phone'                 => 'Telefon',
             'state'                 => 'Stát',
             'suppliers'             => 'Dodavatelé',
        -    'update'                => 'Update Supplier',
        +    'update'                => 'Aktualizovat dodavatele',
             'url'                   => 'URL',
             'view'                  => 'Zobrazit dodavatele',
        -    'view_assets_for'       => 'View Assets for',
        +    'view_assets_for'       => 'Zobrazit majetky pro',
             'zip'                   => 'PSČ',
         
         );
        diff --git a/resources/lang/cs/admin/users/general.php b/resources/lang/cs/admin/users/general.php
        index 3b2a1f2279..f863940905 100644
        --- a/resources/lang/cs/admin/users/general.php
        +++ b/resources/lang/cs/admin/users/general.php
        @@ -3,19 +3,23 @@
         
         return array(
         
        -    'assets_user'       => 'Assets assigned to :name',
        -    'current_assets'    => 'Assets currently checked out to this user',
        +    'assets_user'       => 'Majetky přiřazené :name',
        +    'bulk_update_warn'	=> 'Chystáte se upravit vlastnosti :user_count uživatelů. Nezapomeňte, že pomocí tohoto formuláře nemůžete změnit vlastní atributy uživatele a musíte provádět vlastní úpravy individuálně.',
        +    'bulk_update_help'	=> 'Tento formulář umožňuje aktualizovat více uživatelů najednou. Vyplňte pouze pole, která potřebujete změnit. Všechna pole, která jsou prázdná, zůstanou nezměněny.',
        +    'current_assets'    => 'Majetky které jsou v současné době vydány uživateli',
             'clone'             => 'Duplikuj uživatele',
             'contact_user'      => 'Kontakt na :name',
             'edit'              => 'Upravit uživatele',
             'filetype_info'     => 'Povolené přílohy: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'Historie:',
        +	'info'				=> 'Informace',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Poslední přihlášení',
        -    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'ldap_config_text'  => 'Nastavení konfigurace LDAP lze nalézt v menu Správce> Nastavení. Vybrané (volitelně) místo bude nastaven pro všechny importované uživatele.',
             'software_user'     => 'Software vydaný pro :name',
             'view_user'         => 'Zobraz uživatele',
             'usercsv'           => 'CSV soubor',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'Vaše současná nastavení administrátora umožňují selektivní vynucení dvoufaktorového ověřování.  ',
        +    'two_factor_enrolled' => 'Přihlášeno zařízení 2FA ',
        +    'two_factor_active'   => '2FA aktivní ',
             );
        diff --git a/resources/lang/cs/admin/users/message.php b/resources/lang/cs/admin/users/message.php
        index f51e1d7833..5f4cc3a8be 100644
        --- a/resources/lang/cs/admin/users/message.php
        +++ b/resources/lang/cs/admin/users/message.php
        @@ -2,42 +2,46 @@
         
         return array(
         
        -    'accepted'                  => 'You have successfully accepted this asset.',
        -    'declined'                  => 'You have successfully declined this asset.',
        +    'accepted'                  => 'Úspěšně jste přijali tento majetek.',
        +    'declined'                  => 'Úspěšně jste odmítli tento majetek.',
        +    'bulk_manager_warn'	        => 'Uživatelé byli úspěšně aktualizováni, položka správce však nebyla uložena, protože správce, který jste si vybrali, byl také v seznamu uživatelů, který má být upraven, a uživatelé nemusí být jejich vlastní správce. Zvolte své uživatele znovu, kromě správce.',
             'user_exists'               => 'Uživatel již existuje!',
             'user_not_found'            => 'Uživatel [:id] neexistuje.',
        -    'user_login_required'       => 'The login field is required',
        +    'user_login_required'       => 'Přihlašovací pole je povinné',
             'user_password_required'    => 'Je vyžadováno heslo.',
             'insufficient_permissions'  => 'Nedostatečná oprávnění.',
        -    'user_deleted_warning'      => 'This user has been deleted. You will have to restore this user to edit them or assign them new assets.',
        -    'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
        +    'user_deleted_warning'      => 'Tento uživatel byl smazán. Budete muset uživatele obnovit, aby jste ho mohli upravil nebo přidělil nové majetky.',
        +    'ldap_not_configured'        => 'Integrace LDAP nebyla pro tuto instalaci nakonfigurována.',
         
         
             'success' => array(
                 'create'    => 'Uživatel byl úspěšně vytvořen.',
                 'update'    => 'Uživatel byl úspěšně aktualizován.',
        -        'delete'    => 'User was successfully deleted.',
        +        'update_bulk'    => 'Uživatelé byli úspěšně aktualizováni!',
        +        'delete'    => 'Uživatel byl úspěšně smazán.',
                 'ban'       => 'Uživatel byl úspěšně zakázán.',
                 'unban'     => 'Uživatel byl úspěšně povolen.',
        -        'suspend'   => 'User was successfully suspended.',
        -        'unsuspend' => 'User was successfully unsuspended.',
        -        'restored'  => 'User was successfully restored.',
        +        'suspend'   => 'Uživatel byl úspěšně pozastaven.',
        +        'unsuspend' => 'Uživatel byl úspěšně zrušen.',
        +        'restored'  => 'Uživatel byl úspěšně obnoven.',
                 'import'    => 'Uživatelé úspěšně naimportování.',
             ),
         
             'error' => array(
        -        'create' => 'There was an issue creating the user. Please try again.',
        -        'update' => 'There was an issue updating the user. Please try again.',
        -        'delete' => 'There was an issue deleting the user. Please try again.',
        -        'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
        -        'import'    => 'There was an issue importing users. Please try again.',
        -        'asset_already_accepted' => 'This asset has already been accepted.',
        -        'accept_or_decline' => 'You must either accept or decline this asset.',
        -        'incorrect_user_accepted' => 'The asset you have attempted to accept was not checked out to you.',
        -        'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        -        'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
        -        'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        -        'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'create' => 'Vyskytl se problém při vytvářením uživatele. Zkuste to znovu.',
        +        'update' => 'Vyskytl se problém při aktualizování uživatele. Zkuste to znovu.',
        +        'delete' => 'Vyskytl se problém při mazání uživatele. Zkuste to znovu.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
        +        'unsuspend' => 'Vyskytl se problém při rušení uživatele. Zkuste to znovu.',
        +        'import'    => 'Vyskytl se problém při importu uživatelů. Zkuste to znovu.',
        +        'asset_already_accepted' => 'Tento majetek již byl odsouhlasen.',
        +        'accept_or_decline' => 'Musíte přijmout nebo odmítnout tento majetek.',
        +        'incorrect_user_accepted' => 'Majetek, který jste se pokoušeli přijmout, nebyl vydán pro vás.',
        +        'ldap_could_not_connect' => 'Nelze se připojit k serveru LDAP. Zkontrolujte prosím konfiguraci serveru LDAP v konfiguračním souboru LDAP. <br>Chyba serveru LDAP:',
        +        'ldap_could_not_bind' => 'Nelze svázat server LDAP. Zkontrolujte prosím konfiguraci serveru LDAP v konfiguračním souboru LDAP. <br>Chyba serveru LDAP: ',
        +        'ldap_could_not_search' => 'Nelze vyhledat server LDAP. Zkontrolujte prosím konfiguraci serveru LDAP v konfiguračním souboru LDAP. <br>Chyba serveru LDAP:',
        +        'ldap_could_not_get_entries' => 'Nelze získat záznamy ze serveru LDAP. Zkontrolujte prosím konfiguraci serveru LDAP v konfiguračním souboru LDAP. <br>Chyba serveru LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        @@ -47,9 +51,9 @@ return array(
         
             'upload' => array(
                 'error'   => 'Soubor(y) se nepodařilo nahrát. Prosím zkuste to znovu.',
        -        'success' => 'File(s) successfully uploaded.',
        -        'nofiles' => 'You did not select any files for upload',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +        'success' => 'Soubor(y) byly v pořádku nahrány.',
        +        'nofiles' => 'Nevybrali jste žádné soubory pro nahrávání',
        +        'invalidfiles' => 'Jeden nebo více označených souborů je příliš velkých nebo nejsou podporované. Povolenými příponami jsou png, gif, jpg, doc, docx, pdf a txt.',
             ),
         
         );
        diff --git a/resources/lang/cs/admin/users/table.php b/resources/lang/cs/admin/users/table.php
        index 4dc391b557..f0018438ad 100644
        --- a/resources/lang/cs/admin/users/table.php
        +++ b/resources/lang/cs/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktivní',
             'allow'  				=> 'Povolit',
             'checkedout'  			=> 'Zařízení',
        @@ -11,15 +10,16 @@ return array(
             'email'      			=> 'Email',
             'employee_num'      	=> 'Osobní číslo',
             'first_name' 			=> 'Jméno',
        -    'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        +    'groupnotes'			=> 'Vyberte skupinu, kterou chcete přiřadit uživateli, nezapomeňte, že uživatel přebírá oprávnění skupiny, která je mu přiřazena.',
             'id'         			=> 'ID',
             'inherit'  				=> 'Převzít',
             'job' 					=> 'Pracovní pozice',
             'last_login'  			=> 'Poslední přihlášení',
             'last_name'  			=> 'Příjmení',
             'location'  			=> 'Umístění',
        -    'lock_passwords'		=> 'Login details cannot be changed on this installation.',
        +    'lock_passwords'		=> 'Přihlašovací údaje nelze v této instalaci měnit.',
             'manager' 				=> 'Nadřízený',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Položka',
             'notes'                 => 'Poznámky',
             'password_confirm' 		=> 'Potvrzení hesla',
        @@ -27,10 +27,12 @@ return array(
             'phone'  				=> 'Telefon',
             'show_current'          => 'Zobraz aktuální uživatele',
             'show_deleted'          => 'Zobraz smazané uživatele',
        -    'title' 				=> 'Title',
        -    'updateuser' 			=> 'Update User',
        +    'title' 				=> 'Název',
        +	'to_restore_them'		=> 'obnovit.',
        +    'updateuser' 			=> 'Aktualizace uživatele',
             'username' 				=> 'Uživatelské jméno',
        -    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        +	'user_deleted_text' 	=> 'Tento uživatel byl označen jako smazaný.',
        +    'username_note' 		=> '(Použije se pouze pro vazbu služby Active Directory, nikoliv pro přihlášení.)',
             'cloneuser'             => 'Duplikuj uživatele',
             'viewusers' 			=> 'Zobrazit uživatele',
         );
        diff --git a/resources/lang/cs/auth/general.php b/resources/lang/cs/auth/general.php
        index bf88cba77a..4a4e35304e 100644
        --- a/resources/lang/cs/auth/general.php
        +++ b/resources/lang/cs/auth/general.php
        @@ -1,12 +1,12 @@
         <?php
         
         return [
        -    'send_password_link'	        => 'Send Password Reset Link',
        -    'email_reset_password'			=> 'Email Password Reset',
        -    'reset_password'			    => 'Reset Password',
        -    'login'                         => 'Login',
        -    'login_prompt'                  => 'Please Login',
        -    'forgot_password'               => 'I forgot my password',
        -    'remember_me'                   => 'Remember Me',
        +    'send_password_link'	        => 'Poslat odkaz na obnovení hesla',
        +    'email_reset_password'			=> 'Poslat odkaz na obnovení hesla',
        +    'reset_password'			    => 'Obnovit heslo',
        +    'login'                         => 'Přihlášení',
        +    'login_prompt'                  => 'Přihlaste se prosím',
        +    'forgot_password'               => 'Zapomněl jsem heslo',
        +    'remember_me'                   => 'Pamatovat si mě',
             ];
         
        diff --git a/resources/lang/cs/auth/message.php b/resources/lang/cs/auth/message.php
        index fb08ee123d..467e1bf954 100644
        --- a/resources/lang/cs/auth/message.php
        +++ b/resources/lang/cs/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Uživatelský účet není aktivován.',
             'account_suspended'      => 'Uživatelský účet je pozastaven.',
             'account_banned'         => 'Uživatelský účet je zablokován.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Příliš mnoho neúspěšných pokusů o přihlášení. Zkuste to prosím znovu za :minutes minut.',
         
             'signin' => array(
                 'error'   => 'Vyskytl se problém při přihlášení, zkuste to znovu.',
        diff --git a/resources/lang/cs/button.php b/resources/lang/cs/button.php
        index bcb262e54e..480df75e0f 100644
        --- a/resources/lang/cs/button.php
        +++ b/resources/lang/cs/button.php
        @@ -1,16 +1,15 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Akce',
             'add'    	                => 'Přidej nový',
             'cancel'                    => 'Zrušit',
        -    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'checkin_and_delete'  	    => 'Zkontrolovat a odstranit uživatele',
             'delete'  	                => 'Smazat',
             'edit'    	                => 'Upravit',
             'restore' 	                => 'Obnovit',
             'request'                   => 'Požadavek',
             'submit'  	                => 'Odeslat',
             'upload'                    => 'Nahrát',
        -
        +	'select_file'				=> 'Vybrat soubor...',
         );
        diff --git a/resources/lang/cs/general.php b/resources/lang/cs/general.php
        index f756ba1356..b220fd1a82 100644
        --- a/resources/lang/cs/general.php
        +++ b/resources/lang/cs/general.php
        @@ -2,14 +2,14 @@
         
             return [
             'accessories'			=> 'Příslušenství',
        -    'activated'			=> 'Activated',
        +    'activated'			=> 'Aktivováno',
             'accessory'				=> 'Příslušenství',
             'accessory_report'			=> 'Zpráva o doplňcích',
             'action'                => 'Akce',
             'activity_report'		=> 'Report aktivity',
             'address'				=> 'Adresa',
             'admin'					=> 'Admin',
        -    'add_seats'     => 'Added seats',
        +    'add_seats'     => 'Přidaná licenční místa',
             'all_assets'			=> 'Všechna zařízení',
             'all'       			=> 'Vše',
             'archived'              => 'Archivováno',
        @@ -18,75 +18,88 @@
             'asset_report'          => 'Report majetku',
             'asset_tag'				=> 'Označení majetku',
             'assets_available'		=> 'dostupných zařízení',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Zařízení',
             'avatar_delete'         => 'Smazat avatara',
             'avatar_upload'         => 'Nahrát avatara',
             'back'      			=> 'Zpět',
        -    'bad_data'      		=> 'Nothing found. Maybe bad data?',
        -    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'bad_data'      		=> 'Nic nebylo nalezeno. Možná zadáváte špatná data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Hromadný výdej',
             'cancel'  				=> 'Storno',
             'categories'			=> 'Kategorie',
             'category'				=> 'Kategorie',
        +    'change' 		        => 'Příjem/Výdej',
             'changeemail'  			=> 'Změnit e-mailovou adresu',
             'changepassword'  		=> 'Změnit heslo',
             'checkin'  				=> 'Příjem',
             'checkin_from'  		=> 'Převzít od',
             'checkout'  			=> 'Výdej',
             'city'  				=> 'Město',
        +	'click_here'			=> 'Klikněte zde',
             'companies'			=> 'Firmy',
             'company'				=> 'Společnost',
        -    'component'			=> 'Component',
        -    'components'			=> 'Components',
        +    'component'			=> 'Komponent',
        +    'components'			=> 'Komponenty',
        +	'complete'				=> 'Dokončit',
             'consumable'			=> 'Spotřební materiál',
             'consumables'			=> 'Spotřební materiál',
             'country'  				=> 'Země',
             'create'				=> 'Vytvořit nové',
        -    'created'               => 'Item Created',
        +    'created'               => 'Položka vytvořena',
             'created_asset'			=> 'vytvořit majetek',
             'created_at' 			=> 'Vytvořeno',
        +    'updated_at' 			=> 'Aktualizováno',
             'currency'  			=> 'Kč', // this is deprecated
             'current'  				=> 'Aktuální',
             'custom_report'         => 'Vlastní report majetku',
             'dashboard'				=> 'Nástěnka',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Datum',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Varování!',
        +    'debug_warning_text'         => 'Tato aplikace běží ve výrobním režimu s povoleným laděním. To znamená že citlivá data mohou být přístupná vnějšímu světu. Deaktivujte režim ladění nastavením hodnoty <code>APP_DEBUG</code> v souboru <code>.env</code> na <code>false</code>.',
             'delete'  				=> 'Odstranit',
             'deleted'  				=> 'Odstraněno',
        -    'delete_seats'  		=> 'Deleted Seats',
        +    'delete_seats'  		=> 'Vymazaná licenční místa',
        +    'departments'           => 'Oddělení',
        +    'department'           => 'Oddělení',
             'deployed'				=> 'Vydané',
             'depreciation_report'	=> 'Report zastarání',
             'download'				=> 'Stáhnout',
             'depreciation'			=> 'Amortizace',
             'editprofile'  			=> 'Upravit profil',
             'eol'					=> 'Konec životnosti',
        -    'email_domain'			=> 'Email Domain',
        -    'email_format'			=> 'Email Format',
        -    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        -    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        -    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'email_domain'			=> 'Doména e-mailu',
        +    'email_format'			=> 'Formát e-mailu',
        +    'email_domain_help'		=> 'Toto je použito na generování e-mailových adres při importu',
        +    'filastname_format'			=> 'Iniciál Jména Příjmení (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'Jméno Příjmení (jane.smith@example.com)',
             'first'					=> 'První',
             'first_name'			=> 'Jméno',
        -    'first_name_format'		=> 'First Name (jane@example.com)',
        +    'first_name_format'		=> 'Jméno (jane@example.com)',
             'file_name'				=> 'Soubor',
             'file_uploads'			=> 'Nahrání souboru',
             'generate'				=> 'Vytvořit',
             'groups'				=> 'Skupiny',
             'gravatar_email'        => 'Emailová adresa Gravatar',
        -    'history'  			    => 'History',
        +    'history'  			    => 'Historie',
             'history_for'  			=> 'Historie uživatele',
             'id'  					=> 'ID',
             'image_delete'         	=> 'Smazat obrázek',
             'image_upload'         	=> 'Nahrát obrázek',
             'import'         	    => 'Import',
        -    'import-history'        => 'Import History',
        +    'import-history'        => 'Historie importu',
             'asset_maintenance'        => 'Údržba zařízení',
             'asset_maintenance_report' => 'Zpráva o údržbě zařízení',
             'asset_maintenances'       => 'Záznamy o údržbě zařízení',
             'item'  				=> 'Položka',
             'insufficient_permissions' => 'Nedostatečná oprávnění!',
        -    'language'				=> 'Language',
        +    'language'				=> 'Jazyk',
             'last'					=> 'Poslední',
        +    'last_login'            => 'Poslední přihlášení',
             'last_name'             => 'Příjmení',
             'license'				=> 'Licence',
             'license_report'        => 'Report licencí',
        @@ -94,28 +107,30 @@
             'licenses'				=> 'Licence',
             'list_all'				=> 'Vypsat vše',
             'loading'				=> 'Nahrávání',
        -    'lock_passwords'        => 'This field cannot be edited in this installation.',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'lock_passwords'        => 'Toto pole nelze v této instalaci upravovat.',
        +    'feature_disabled'      => 'Tato funkce byla deaktivována pro demo instalaci.',
             'location'              => 'Lokalita',
             'locations'				=> 'Umístění',
             'logout'				=> 'Odhlásit',
        -    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'lookup_by_tag'     => 'Vyhledávání podle značky majetku',
             'manufacturer'			=> 'Výrobce',
             'manufacturers'			=> 'Výrobci',
        -    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        -    'min_amt'				=> 'Min. QTY',
        -    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'markdown'				=> 'Toto pole umožňuje <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'min_amt'				=> 'Minimální množství',
        +    'min_amt_help'	=> 'Minimální počet položek, které by měly být k dispozici před spuštěním výstrahy.',
             'model_no'				=> 'Modelové č.',
             'months'				=> 'měsíce',
             'moreinfo'				=> 'Další informace',
             'name'					=> 'Název',
             'next'					=> 'Další',
        -    'new'					=> 'new!',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'nový!',
             'no_depreciation'		=> 'Žádná amortizace',
             'no_results'			=> 'Žádné výsledky.',
             'no'  					=> 'Ne',
             'notes'  				=> 'Poznámky',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Číslo objednávky',
             'page_menu'				=> 'Zobrazuji _MENU_ položky',
             'pagination_info'		=> 'Zobrazuji  _START_ to _END_ of _TOTAL_ položek',
             'pending'				=> 'Čeká na vyřízení',
        @@ -124,55 +139,59 @@
             'previous'				=> 'Předchozí',
             'processing'			=> 'Pracuji',
             'profile'				=> 'Váš profil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Nákupní cena',
        +    'purchase_date'         => 'Datum nákupu',
             'qty'		            => 'Množství',
        -    'quantity'		        => 'Quantity',
        +    'quantity'		        => 'Množství',
             'ready_to_deploy'		=> 'Připraveno k přidělení',
             'recent_activity'		=> 'Nedávná aktivita',
        -    'remove_company'        => 'Remove Company Association',
        +    'remove_company'        => 'Odstraňte sdružení společnosti',
             'reports'				=> 'Reporty',
             'requested'				=> 'Požadováno',
        -    'request_canceled'      => 'Request Canceled',
        +    'request_canceled'      => 'Žádost zrušena',
             'save'  				=> 'Uložit',
             'select'				=> 'Zvolit',
             'search'				=> 'Hledat',
        -    'select_category'       => 'Select a Category',
        +    'select_category'       => 'Vyberte kategorii',
        +    'select_department'       => 'Vyberte Oddělení',
             'select_depreciation'	=> 'Zvolit typ amortizace',
             'select_location'		=> 'Zvolit místo',
             'select_manufacturer'	=> 'Zvolit výrobce',
             'select_model'			=> 'Zvolit model',
             'select_supplier'		=> 'Zvolit dodavatele',
             'select_user'			=> 'Zvolit uživatele',
        -    'select_date'			=> 'Zvolit datum',
        +    'select_date'			=> 'Vyberte Datum (RRRR-MM-DD)',
             'select_statuslabel'	=> 'Vybrat stav',
        -    'select_company'    	=> 'Select Company',
        -    'select_asset'    		=> 'Select Asset',
        +    'select_company'    	=> 'Zvolte společnost',
        +    'select_asset'    		=> 'Zvolte majetek',
             'settings'				=> 'Nastavení',
             'sign_in'				=> 'Přihlásit se',
        -    'signature'             => 'Signature',
        -    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'signature'             => 'Podpis',
        +    'some_features_disabled' => 'REŽIM DEMO: Některé funkce jsou pro tuto instalaci zakázány.',
             'site_name'				=> 'Název lokality',
             'state'  				=> 'Stát',
             'status_labels'			=> 'Označení stavu',
             'status'    			=> 'Stav',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Dodavatel',
             'suppliers'  			=> 'Dodavatelé',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => 'Opravdu si přejete odstranit',
        +    'submit'				=> 'Odeslat',
        +    'target'                => 'Cíl',
        +    'time_and_date_display' => 'Zobrazení času a data',
             'total_assets'			=> 'celkem zařízení',
             'total_licenses'		=> 'celkem licencí',
        -    'total_accessories'		=> 'total accessories',
        -    'total_consumables'		=> 'total consumables',
        +    'total_accessories'		=> 'celkové příslušenství',
        +    'total_consumables'		=> 'celkový spotřební materiál',
             'type'  				=> 'Typ',
             'undeployable'			=> 'Ne-přiřaditelné',
             'unknown_admin'			=> 'Neznámy správce',
        -    'username_format'		=> 'Username Format',
        +    'username_format'		=> 'Formát uživatelského jména',
             'update'                => 'Aktualizace',
             'uploaded'              => 'Nahráno',
             'user'					=> 'Uživatel',
             'accepted'			    => 'přijato',
             'declined'			    => 'zamítnuto',
        -    'unaccepted_asset_report' => 'Unaccepted Assets',
        +    'unaccepted_asset_report' => 'Nepřijatelné majetky',
             'users'                 => 'Uživatelé',
             'viewassets'  			=> 'Zobrazit přiřazený majetek',
             'website'               => 'Webová stránka',
        @@ -181,5 +200,5 @@
             'yes' 					=> 'Ano',
             'zip'  					=> 'PSČ',
             'noimage'					=> 'Obrázek nebyl nahrán, nebo nebyl nalezen.',
        -    'token_expired'             => 'Your form session has expired. Please try again.',
        +    'token_expired'             => 'Platnost relace formuláře vypršela. Prosím zkuste to znovu.',
             ];
        diff --git a/resources/lang/cs/mail.php b/resources/lang/cs/mail.php
        index c9a4fe182d..a433706ada 100644
        --- a/resources/lang/cs/mail.php
        +++ b/resources/lang/cs/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => 'Uživatel zrušil žádost o položku na webu',
        +    'a_user_requested' => 'Uživatel požádal o položku na webu',
        +    'accessory_name' => 'Název příslušenství:',
        +    'additional_notes' => 'Další Poznámky:',
        +    'admin_has_created' => 'Administrátor pro vás vytvořil účet na stránce :web.',
        +    'asset' => 'Majetek:',
        +    'asset_name' => 'Název majetku:',
        +    'asset_requested' => 'Požadovaný majetek',
        +    'asset_tag' => 'Označení majetku:',
        +    'assets_warrantee_expiring' => '{1} majetek se zárukou, která vyprší v příštích 60 dnech.|[2,Inf] majetky se zárukami, které vyprší v příštích 60 dnech.',
        +    'assigned_to' => 'Přiděleno',
        +    'best_regards' => 'S pozdravem,',
        +    'canceled' => 'Zrušeno:',
        +    'checkin_date' => 'Datum převzetí:',
        +    'checkout_date' => 'Datum vydání:',
        +    'click_to_confirm' => 'Kliknutím na následující odkaz potvrdíte váš účet pro :web:',
        +    'click_on_the_link_accessory' => 'Kliknutím na odkaz v dolní části potvrďte, že jste obdrželi příslušné příslušenství.',
        +    'click_on_the_link_asset' => 'Kliknutím na odkaz v dolní části potvrďte, že jste obdrželi daný produkt.',
        +    'Confirm_Asset_Checkin' => 'Potvrďte převzetí majetku.',
        +    'Confirm_Accessory_Checkin' => 'Potvrďte převzetí příslušenství.',
        +    'Confirm_accessory_delivery' => 'Potvrďte dodání příslušenství.',
        +    'Confirm_asset_delivery' => 'Potvrďte dodání produktu.',
        +    'Confirm_consumable_delivery' => 'Potvrďte dodání spotřebního zboží.',
        +    'current_QTY' => 'Aktuální množství',
        +    'Days' => 'Dní',
        +    'days' => 'Dní',
        +    'expecting_checkin_date' => 'Očekávané datum převzetí:',
        +    'expires' => 'Vyprší',
        +    'Expiring_Assets_Report' => 'Hlášení o končících zárukách majetku.',
        +    'Expiring_Licenses_Report' => 'Hlášení o končící platnosti licencí.',
        +    'hello' => 'Dobrý den',
        +    'hi' => 'Ahoj',
        +    'i_have_read' => 'Přečetl/a jsem si podmínky používání, souhlasím s pravidel používání a obdržel jsem tuto položku.',
        +    'item' => 'Položka:',
        +    'items_below_minimum' => '{1} položka která je pod minimálním množstvím zásob nebo brzy bude.|[2,Inf] položky které jsou pod minimálním množstvím zásob nebo brzy budou.',
        +    'Item_Request_Canceled' => 'Požadavek na položku zrušen',
        +    'Item_Requested' => 'Požadavek na položku',
        +    'licenses_expiring' => '{1} licence končící v příštích 60 dnech.|[2,Inf] licence končící v příštích 60 dnech.',
        +    'link_to_update_password' => 'Klepnutím na následující odkaz aktualizujte své heslo pro :web:',
        +    'login_first_admin' => 'Přihlaste se k nové instalaci Snipe-IT pomocí níže uvedených pověření:',
        +    'login' => 'Uživatelské jméno:',
        +    'Low_Inventory_Report' => 'Hlášení o nízkých zásobách',
        +    'min_QTY' => 'Minimální množství',
        +    'name' => 'Položka',
        +    'new_item_checked' => 'Nová položka byla odevzdána pod vaším jménem, podrobnosti jsou uvedeny níže.',
        +    'password' => 'Heslo:',
        +    'password_reset' => 'Resetování hesla',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Prosím přečtěte si níže uvedené podmínky použití.',
        +    'read_the_terms_and_click' => 'Přečtěte si prosím níže uvedené podmínky použití a klikněte na odkaz v dolní části, abyste potvrdili, že jste si přečetli a souhlasili s podmínkami používání, a že jste obdrželi majetek.',
        +    'requested' => 'Zažádáno:',
        +    'reset_link' => 'Váš odkaz pro resetování hesla',
        +    'reset_password' => 'Pro zresetování vašeho hesla klikněte na odkaz:',
        +    'serial' => 'Sériové číslo:',
        +    'supplier' => 'Dodavatelé',
        +    'tag' => 'Značka',
        +    'test_email' => 'Testovací email od Snipe-IT',
        +    'test_mail_text' => 'Toto je test ze systému Snipe-IT Asset Management System. Pokud jste ho dostali, email funguje :)',
        +    'the_following_item' => 'Následující položka byla převzata: ',
        +    'There_are' => '{1} Tady je|[2,inf] Tady jsou',
        +    'to_reset' => 'Pro resetování vašeho hesla vyplňte tento formulář:',
        +    'type' => 'Typ',
        +    'user' => 'Uživatel:',
        +    'username' => 'Uživatelské jméno:',
        +    'welcome' => 'Vítej uživateli :name',
        +    'welcome_to' => 'Vítejte na :web!',
        +    'your_credentials' => 'Vaše pověření Snipe-IT',
         );
        diff --git a/resources/lang/cs/passwords.php b/resources/lang/cs/passwords.php
        index 5195a9b77c..886038f928 100644
        --- a/resources/lang/cs/passwords.php
        +++ b/resources/lang/cs/passwords.php
        @@ -1,7 +1,7 @@
         <?php
         
         return [
        -    'sent'	        => 'Your password link has been sent!',
        -    'user'			=> 'That user does not exist or does not have an email address associated',
        +    'sent'	        => 'Váš odkaz s heslem byl odeslán!',
        +    'user'			=> 'Tento uživatel neexistuje nebo nemá přidruženou e-mailovou adresu',
         ];
         
        diff --git a/resources/lang/cs/validation.php b/resources/lang/cs/validation.php
        index d50540c7c8..9594ffe5f3 100644
        --- a/resources/lang/cs/validation.php
        +++ b/resources/lang/cs/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "Je potřeba potvrdit :attribute.",
        -    "active_url"       => ":attribute není platnou URL.",
        -    "after"            => ":attribute nemůže být dříve než :date.",
        -    "alpha"            => ":attribute může obsahovat pouze písmena.",
        -    "alpha_dash"       => ":attribute může obsahovat pouze písmena, čísla, a pomlčky.",
        -    "alpha_num"        => ":attribute může obsahovat pouze písmena čísla.",
        -    "before"           => ":attribute nemůže být později než :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute musí být mezi :min - :max.",
        -        "file"    => ":attribute musí být mezi :min - :max kilobajtů.",
        -        "string"  => ":attribute smí obsahovat pouze :min - :max znaků.",
        -    ),
        -    "confirmed"        => "Potvrzení :attribute se neshoduje.",
        -    "date"             => ":attribute není platným datem.",
        -    "date_format"      => "Atribut  :attribute nesouhlasí s formátem :format.",
        -    "different"        => ":attribute a  :other se musí lišit.",
        -    "digits"           => ":attribute musí být :digits číslo.",
        -    "digits_between"   => ":attribute musí být mezi hodnotami :min a :max.",
        -    "email"            => "Formát :attribute je neplatný.",
        -    "exists"           => "Zvolený :attribute je neplatný.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => ":attribute musí být obrázek.",
        -    "in"               => "Zvolený :attribute je neplatný.",
        -    "integer"          => ":attribute musí být celočíselný.",
        -    "ip"               => ":attribute musí být platná IP adresa.",
        -    "max"              => array(
        -        "numeric" => ":attribute nesmí být větší než :max.",
        -        "file"    => ":attribute nesmí být větší než :max kilobajtů.",
        -        "string"  => ":attribute nesmí být větší než :max znaků.",
        -    ),
        -    "mimes"            => ":attribute musí být soubor typu: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute musí být minimálne :min.",
        -        "file"    => ":attribute musí být minimálně :min kilobajtů.",
        -        "string"  => ":attribute musí mít minimálně :min znaků.",
        -    ),
        -    "not_in"           => "Zvolený :attribute je neplatný.",
        -    "numeric"          => ":attribute musí být číslo.",
        -    "regex"            => "Formát :attribute je neplatný.",
        -    "required"         => "Pole :attribute je požadováno.",
        -    "required_if"      => "Položka :attribute je vyžadována, když :other je :value.",
        -    "required_with"    => "Hodnota :attribute je vyžadována, když je přítomno :values.",
        -    "required_without" => "Hodnota :attribute je vyžadována, když není přítomno :values.",
        -    "same"             => ":attribute a :other se musí shodovat.",
        -    "size"             => array(
        -        "numeric" => ":attribute musí být :size.",
        -        "file"    => ":attribute musí být :size kilobajtů.",
        -        "string"  => ":attribute musí mít :size znaků.",
        -    ),
        -    "unique"           => ":attribute byl již vybrán.",
        -    "url"              => "Formát :attribute je neplatný.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'Je potřeba potvrdit :attribute.',
        +    'active_url'           => ':attribute není platnou URL.',
        +    'after'                => ':attribute nemůže být dříve než :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute může obsahovat pouze písmena.',
        +    'alpha_dash'           => ':attribute může obsahovat pouze písmena, čísla, a pomlčky.',
        +    'alpha_num'            => ':attribute může obsahovat pouze písmena čísla.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute nemůže být později než :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute musí být mezi :min - :max.',
        +        'file'    => ':attribute musí být mezi :min - :max kilobajtů.',
        +        'string'  => ':attribute smí obsahovat pouze :min - :max znaků.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute musí být true nebo false.',
        +    'confirmed'            => 'Potvrzení :attribute se neshoduje.',
        +    'date'                 => ':attribute není platným datem.',
        +    'date_format'          => 'Atribut  :attribute nesouhlasí s formátem :format.',
        +    'different'            => ':attribute a  :other se musí lišit.',
        +    'digits'               => ':attribute musí být :digits číslo.',
        +    'digits_between'       => ':attribute musí být mezi hodnotami :min a :max.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Formát :attribute je neplatný.',
        +    'exists'               => 'Zvolený :attribute je neplatný.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute musí být obrázek.',
        +    'in'                   => 'Zvolený :attribute je neplatný.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute musí být celočíselný.',
        +    'ip'                   => ':attribute musí být platná IP adresa.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute nesmí být větší než :max.',
        +        'file'    => ':attribute nesmí být větší než :max kilobajtů.',
        +        'string'  => ':attribute nesmí být větší než :max znaků.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute musí být soubor typu: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute musí být minimálne :min.',
        +        'file'    => ':attribute musí být minimálně :min kilobajtů.',
        +        'string'  => ':attribute musí mít minimálně :min znaků.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Zvolený :attribute je neplatný.',
        +    'numeric'              => ':attribute musí být číslo.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Formát :attribute je neplatný.',
        +    'required'             => 'Pole :attribute je požadováno.',
        +    'required_if'          => 'Položka :attribute je vyžadována, když :other je :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Hodnota :attribute je vyžadována, když je přítomno :values.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Hodnota :attribute je vyžadována, když není přítomno :values.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute a :other se musí shodovat.',
        +    'size'                 => [
        +        'numeric' => ':attribute musí být :size.',
        +        'file'    => ':attribute musí být :size kilobajtů.',
        +        'string'  => ':attribute musí mít :size znaků.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute byl již vybrán.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Formát :attribute je neplatný.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Pole :attribute obsahuje nepovolené znaky.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/da/admin/asset_maintenances/form.php b/resources/lang/da/admin/asset_maintenances/form.php
        index 2aa005c45f..cbc11d3549 100644
        --- a/resources/lang/da/admin/asset_maintenances/form.php
        +++ b/resources/lang/da/admin/asset_maintenances/form.php
        @@ -1,14 +1,14 @@
         <?php
         
             return [
        -        'asset_maintenance_type' => 'Maintenance Type',
        -        'title'                  => 'Title',
        -        'start_date'             => 'Started',
        -        'completion_date'        => 'Completed',
        -        'cost'                   => 'Cost',
        -        'is_warranty'            => 'Warranty Improvement',
        -        'asset_maintenance_time' => 'Days',
        -        'notes'                  => 'Notes',
        -        'update'                 => 'Update',
        -        'create'                 => 'Create'
        +        'asset_maintenance_type' => 'Vedligeholdelsestype',
        +        'title'                  => 'Titel',
        +        'start_date'             => 'Start dato',
        +        'completion_date'        => 'Gennemført',
        +        'cost'                   => 'Omkostninger',
        +        'is_warranty'            => 'Garantiforbedring',
        +        'asset_maintenance_time' => 'Dage',
        +        'notes'                  => 'Noter',
        +        'update'                 => 'Opdatering',
        +        'create'                 => 'Opret'
             ];
        diff --git a/resources/lang/da/admin/asset_maintenances/general.php b/resources/lang/da/admin/asset_maintenances/general.php
        index c7ae42d41a..a6fcb8856f 100644
        --- a/resources/lang/da/admin/asset_maintenances/general.php
        +++ b/resources/lang/da/admin/asset_maintenances/general.php
        @@ -1,11 +1,11 @@
         <?php
         
             return [
        -        'asset_maintenances' => 'Asset Maintenances',
        -        'edit'               => 'Edit Asset Maintenance',
        -        'delete'             => 'Delete Asset Maintenance',
        -        'view'               => 'View Asset Maintenance Details',
        -        'repair'             => 'Repair',
        -        'maintenance'        => 'Maintenance',
        -        'upgrade'            => 'Upgrade'
        +        'asset_maintenances' => 'Aktiv vedligeholdelse',
        +        'edit'               => 'Redigere aktiv vedligeholdelse',
        +        'delete'             => 'Slette aktiv vedligeholdelse',
        +        'view'               => 'Se aktiv vedligeholdelse detaljer',
        +        'repair'             => 'Reparér',
        +        'maintenance'        => 'Vedligeholdelse',
        +        'upgrade'            => 'Opgradér'
             ];
        diff --git a/resources/lang/da/admin/asset_maintenances/message.php b/resources/lang/da/admin/asset_maintenances/message.php
        index af097d59f5..9d33c48b04 100644
        --- a/resources/lang/da/admin/asset_maintenances/message.php
        +++ b/resources/lang/da/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Aktivets vedligeholdelse blev ikke oprettet, prøv venligst igen.',
                     'success' => 'Aktivets vedligeholdelse blev oprettet med succes.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Ikke afsluttet endnu',
                 'warranty'                     => 'Garanti',
                 'not_warranty'                 => 'Ingen garanti',
        diff --git a/resources/lang/da/admin/asset_maintenances/table.php b/resources/lang/da/admin/asset_maintenances/table.php
        index f3a6be60f9..b7babc075f 100644
        --- a/resources/lang/da/admin/asset_maintenances/table.php
        +++ b/resources/lang/da/admin/asset_maintenances/table.php
        @@ -3,6 +3,6 @@
             return [
                 'title'         => 'Asset Maintenance',
                 'asset_name'    => 'Asset Name',
        -        'is_warranty'   => 'Warranty',
        -        'dl_csv'        => 'Download CSV'
        +        'is_warranty'   => 'Garanti',
        +        'dl_csv'        => 'Hent CSV'
             ];
        diff --git a/resources/lang/da/admin/categories/general.php b/resources/lang/da/admin/categories/general.php
        index 763f091c29..617f94c15f 100644
        --- a/resources/lang/da/admin/categories/general.php
        +++ b/resources/lang/da/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Rediger Kategori',
             'eula_text'							=> 'Slutbrugerlicenskategori',
             'eula_text_help'					=> 'Dette felt tillader dig at tilpasse din slutbrugerlicens til specifikke typer af aktiver. Hvis du kun har en slutbrugerlicens for alle dine aktiver, kan du afkrydse boksen nedenfor for at bruge den primære standardlicens.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Kræver brugere at bekræfte accept af aktiver i denne kategori.',
             'required_acceptance'				=> 'Denne bruger vil modtage en e-mail med et link til bekræftelse af accept af dette emne.',
             'required_eula'						=> 'Denne bruger vil blive sendt en kopi af slutbrugerlicensen',
        diff --git a/resources/lang/da/admin/companies/general.php b/resources/lang/da/admin/companies/general.php
        index 9a47968977..18caeb2ec3 100644
        --- a/resources/lang/da/admin/companies/general.php
        +++ b/resources/lang/da/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        -    'select_company' => 'Select Company',
        +    'about_companies_title'            => 'Om virksomheder',
        +    'about_companies_text'                  => 'Virksomheder kan bruges som en simpel id-felt, eller kan bruges til at begrænse synligheden af aktiver, brugere, osv. hvis fuld selskab understøttelse er aktiveret i din Admin indstillinger.',
        +    'select_company' => 'Vælg firma',
         ];
        diff --git a/resources/lang/da/admin/companies/message.php b/resources/lang/da/admin/companies/message.php
        index a6db573519..001838bb52 100644
        --- a/resources/lang/da/admin/companies/message.php
        +++ b/resources/lang/da/admin/companies/message.php
        @@ -1,18 +1,18 @@
         <?php
         return array(
        -    'does_not_exist' => 'Company does not exist.',
        -    'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
        +    'does_not_exist' => 'Virksomheden eksisterer ikke.',
        +    'assoc_users'    => 'Denne virksomhed er knyttet til mindst én model og kan ikke slettes. Opdater venligst dine modeller for at ikke længere henvise til dette selskab, og prøv igen. ',
             'create' => array(
        -        'error'   => 'Company was not created, please try again.',
        -        'success' => 'Company created successfully.'
        +        'error'   => 'Virksomheden blev ikke oprettet, prøve igen.',
        +        'success' => 'Virksomhed oprettet.'
             ),
             'update' => array(
        -        'error'   => 'Company was not updated, please try again',
        -        'success' => 'Company updated successfully.'
        +        'error'   => 'Virksomheden blev ikke opdateret, prøv igen',
        +        'success' => 'Virksomheden blev opdateret.'
             ),
             'delete' => array(
        -        'confirm' => 'Are you sure you wish to delete this company?',
        -        'error'   => 'There was an issue deleting the company. Please try again.',
        -        'success' => 'The Company was deleted successfully.'
        +        'confirm' => 'Er du sikker på du vil slette denne virksomhed?',
        +        'error'   => 'Der opstod et problem under sletning af virksomheden. Prøv igen.',
        +        'success' => 'Virksomheden blev slettet.'
             )
         );
        diff --git a/resources/lang/da/admin/companies/table.php b/resources/lang/da/admin/companies/table.php
        index 2f86126ff2..b1294dc9bd 100644
        --- a/resources/lang/da/admin/companies/table.php
        +++ b/resources/lang/da/admin/companies/table.php
        @@ -1,9 +1,9 @@
         <?php
         return array(
        -    'companies' => 'Companies',
        -    'create'    => 'Create Company',
        -    'title'     => 'Company',
        -    'update'    => 'Update Company',
        -    'name'      => 'Company Name',
        +    'companies' => 'Virksomheder',
        +    'create'    => 'Oprette virksomhed',
        +    'title'     => 'Virksomheden',
        +    'update'    => 'Opdater virksomhed',
        +    'name'      => 'Virksomhedens navn',
             'id'        => 'ID',
         );
        diff --git a/resources/lang/da/admin/custom_fields/general.php b/resources/lang/da/admin/custom_fields/general.php
        index f2e6df90cb..0bbac9403e 100644
        --- a/resources/lang/da/admin/custom_fields/general.php
        +++ b/resources/lang/da/admin/custom_fields/general.php
        @@ -1,30 +1,30 @@
         <?php
         
         return array(
        -    'custom_fields'		        => 'Custom Fields',
        -    'field'		                => 'Field',
        -    'about_fieldsets_title'		=> 'About Fieldsets',
        +    'custom_fields'		        => 'Brugerdefinerede felter',
        +    'field'		                => 'Felt',
        +    'about_fieldsets_title'		=> 'Om Feltsæt',
             'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        -    'custom_format'             => 'Custom format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        -    'encrypted'      	        => 'Encrypted',
        -    'fieldset'      	        => 'Fieldset',
        -    'qty_fields'      	      => 'Qty Fields',
        -    'fieldsets'      	        => 'Fieldsets',
        -    'fieldset_name'           => 'Fieldset Name',
        -    'field_name'              => 'Field Name',
        -    'field_values'            => 'Field Values',
        +    'custom_format'             => 'Brugerdefineret format...',
        +    'encrypt_field'      	        => 'Kryptere værdien af dette felt i databasen',
        +    'encrypt_field_help'      => 'Advarsel: Kryptere et felt gør det uransagelige.',
        +    'encrypted'      	        => 'Krypteret',
        +    'fieldset'      	        => 'Feltsæt',
        +    'qty_fields'      	      => 'Antal felter',
        +    'fieldsets'      	        => 'Feltsæt',
        +    'fieldset_name'           => 'Feltsættets navn',
        +    'field_name'              => 'Feltnavn',
        +    'field_values'            => 'Feltværdier',
             'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        -    'field_element'           => 'Form Element',
        +    'field_element'           => 'Form-elementet',
             'field_element_short'     => 'Element',
             'field_format'            => 'Format',
        -    'field_custom_format'     => 'Custom Format',
        -    'required'   		          => 'Required',
        +    'field_custom_format'     => 'Brugerdefineret Format',
        +    'required'   		          => 'Påkrævet',
             'req'   		              => 'Req.',
        -    'used_by_models'   		    => 'Used By Models',
        -    'order'   		            => 'Order',
        -    'create_fieldset'         => 'New Fieldset',
        -    'create_field'            => 'New Custom Field',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'used_by_models'   		    => 'Bruges af modeller',
        +    'order'   		            => 'Ordre',
        +    'create_fieldset'         => 'Nyt Feltsæt',
        +    'create_field'            => 'Nyt Brugerdefinerede Felt',
        +    'value_encrypted'      	        => 'Værdien af dette felt er krypteret i databasen. Kun admins vil være i stand til at se den krypteret værdi',
         );
        diff --git a/resources/lang/da/admin/custom_fields/message.php b/resources/lang/da/admin/custom_fields/message.php
        index 0d34afa9e8..9022a2b891 100644
        --- a/resources/lang/da/admin/custom_fields/message.php
        +++ b/resources/lang/da/admin/custom_fields/message.php
        @@ -3,48 +3,48 @@
         return array(
         
             'field' => array(
        -        'invalid'   => 'That field does not exist.',
        -        'already_added'   => 'Field already added',
        +        'invalid'   => 'Dette felt findes ikke.',
        +        'already_added'   => 'Feltet allerede tilføjet',
         
                 'create' => array(
        -            'error'   => 'Field was not created, please try again.',
        -            'success' => 'Field created successfully.',
        -            'assoc_success' => 'Field successfully added to fieldset.'
        +            'error'   => 'Feltet blev ikke oprettet, prøve igen.',
        +            'success' => 'Feltet oprettet.',
        +            'assoc_success' => 'Felt tilføjet til feltsættet.'
                 ),
         
                 'update' => array(
        -            'error'   => 'Field was not updated, please try again',
        -            'success' => 'Field updated successfully.'
        +            'error'   => 'Feltet blev ikke opdateret, prøv igen',
        +            'success' => 'Feltet opdateret.'
                 ),
         
                 'delete' => array(
        -            'confirm'   	=> 'Are you sure you wish to delete this field?',
        -            'error'   => 'There was an issue deleting the field. Please try again.',
        -            'success' => 'The field was deleted successfully.',
        -            'in_use'   => 'Field is still in use.',
        +            'confirm'   	=> 'Er du sikker på du ønsker at slette feltet?',
        +            'error'   => 'Der opstod et problem under sletning af feltet. Prøv venligst igen.',
        +            'success' => 'Feltet blev slettet.',
        +            'in_use'   => 'Feltet er stadig i brug.',
                 )
         
             ),
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Feltsættet findes ikke',
         
                 'create' => array(
        -            'error'   => 'Fieldset was not created, please try again.',
        -            'success' => 'Fieldset created successfully.'
        +            'error'   => 'Feltsættet blev ikke opdateret, prøv igen.',
        +            'success' => 'Feltsættet oprettet.'
                 ),
         
                 'update' => array(
        -            'error'   => 'Fieldset was not updated, please try again',
        -            'success' => 'Fieldset updated successfully.'
        +            'error'   => 'Feltsættet blev ikke opdateret, prøv igen',
        +            'success' => 'Feltsættet opdateret.'
                 ),
         
                 'delete' => array(
        -            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        -            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        -            'success' => 'The fieldset was deleted successfully.',
        -            'in_use'   => 'Fieldset is still in use.',
        +            'confirm'   	=> 'Er du sikker på du vil slette dette feltsæt?',
        +            'error'   => 'Der opstod et problem under sletning af feltsættet. Prøv venligst igen.',
        +            'success' => 'Feltsættet blev slettet.',
        +            'in_use'   => 'Feltsættet er stadig i brug.',
                 )
         
             ),
        diff --git a/resources/lang/da/admin/departments/message.php b/resources/lang/da/admin/departments/message.php
        new file mode 100644
        index 0000000000..3544802299
        --- /dev/null
        +++ b/resources/lang/da/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Afdeling findes ikke.',
        +    'assoc_users'	 => 'Denne afdeling er i øjeblikket knyttet til mindst én bruger og kan ikke slettes. Opdater venligst dine brugere for at ikke længere referere til denne afdeling, og prøv igen. ',
        +    'create' => array(
        +        'error'   => 'Afdelingen blev ikke oprettet, prøve igen.',
        +        'success' => 'Afdeling oprettet.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Afdelingen blev ikke opdateret, prøv igen',
        +        'success' => 'Afdeling opdateret.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Er du sikker på du vil slette denne afdeling?',
        +        'error'   => 'Der var et problem sletningen af afdelingen. Prøv venligst igen.',
        +        'success' => 'Afdelingen blev slettet.'
        +    )
        +
        +);
        diff --git a/resources/lang/da/admin/departments/table.php b/resources/lang/da/admin/departments/table.php
        new file mode 100644
        index 0000000000..651cbbea28
        --- /dev/null
        +++ b/resources/lang/da/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Afdelingsnavn',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Placering',
        +    'create'                    => 'Oprette afdeling',
        +    'update'                    => 'Opdater afdeling',
        +    );
        diff --git a/resources/lang/da/admin/groups/titles.php b/resources/lang/da/admin/groups/titles.php
        index 4fa8255967..549c36058a 100644
        --- a/resources/lang/da/admin/groups/titles.php
        +++ b/resources/lang/da/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Om grupper',
        +    'about_groups'                  => 'Grupper bruges til at generalisere brugertilladelser.',
             'group_management' 	 	=> 'Gruppehåndtering',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Opret Ny Gruppe',
        +    'update' 	 		        => 'Rediger Gruppe',
             'group_name' 	 		=> 'Gruppenavn',
             'group_admin' 	 		=> 'Gruppeadministrator',
             'allow' 	 			=> 'Tillad',
        diff --git a/resources/lang/da/admin/hardware/general.php b/resources/lang/da/admin/hardware/general.php
        index f7644eb730..1def86dc9e 100644
        --- a/resources/lang/da/admin/hardware/general.php
        +++ b/resources/lang/da/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clone Asset',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/da/admin/hardware/message.php b/resources/lang/da/admin/hardware/message.php
        index d27ca91573..112cf77ded 100644
        --- a/resources/lang/da/admin/hardware/message.php
        +++ b/resources/lang/da/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/da/admin/licenses/general.php b/resources/lang/da/admin/licenses/general.php
        index 25a536ec56..e411766f92 100644
        --- a/resources/lang/da/admin/licenses/general.php
        +++ b/resources/lang/da/admin/licenses/general.php
        @@ -1,21 +1,21 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses_title'            => 'Om licenser',
             'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
             'checkin'  					=> 'Checkin License Seat',
             'checkout_history'  		=> 'Checkout History',
             'checkout'  				=> 'Checkout License Seat',
        -    'edit'  					=> 'Edit License',
        +    'edit'  					=> 'Redigere licens',
             'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        -    'clone'  					=> 'Clone License',
        +    'clone'  					=> 'Klon licens',
             'history_for'  				=> 'History for ',
             'in_out'  					=> 'In/Out',
        -    'info'  					=> 'License Info',
        +    'info'  					=> 'Licens Info',
             'license_seats'  			=> 'License Seats',
             'seat'  					=> 'Seat',
             'seats'  					=> 'Seats',
        -    'software_licenses'  		=> 'Software Licenses',
        -    'user'  					=> 'User',
        -    'view'  					=> 'View License',
        +    'software_licenses'  		=> 'Softwarelicenser',
        +    'user'  					=> 'Bruger',
        +    'view'  					=> 'Se licens',
         );
        diff --git a/resources/lang/da/admin/licenses/message.php b/resources/lang/da/admin/licenses/message.php
        index d5dbfe77b9..3836976832 100644
        --- a/resources/lang/da/admin/licenses/message.php
        +++ b/resources/lang/da/admin/licenses/message.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'does_not_exist' => 'License does not exist.',
        +    'does_not_exist' => 'Licens eksistere ikke.',
             'user_does_not_exist' => 'User does not exist.',
             'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
             'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
        diff --git a/resources/lang/da/admin/licenses/table.php b/resources/lang/da/admin/licenses/table.php
        index dfce4136cb..5953f3a529 100644
        --- a/resources/lang/da/admin/licenses/table.php
        +++ b/resources/lang/da/admin/licenses/table.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'assigned_to'   	=> 'Assigned To',
        +    'assigned_to'   	=> 'Tildelt',
             'checkout'   		=> 'In/Out',
             'id'      			=> 'ID',
             'license_email'   	=> 'License Email',
        diff --git a/resources/lang/da/admin/locations/message.php b/resources/lang/da/admin/locations/message.php
        index 3ba1eed3b6..8ba017fac6 100644
        --- a/resources/lang/da/admin/locations/message.php
        +++ b/resources/lang/da/admin/locations/message.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'does_not_exist' => 'Location does not exist.',
        +    'does_not_exist' => 'Beliggenhed findes ikke.',
             'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
             'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
             'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
        diff --git a/resources/lang/da/admin/locations/table.php b/resources/lang/da/admin/locations/table.php
        index e171d4dd4e..ffa69307d5 100644
        --- a/resources/lang/da/admin/locations/table.php
        +++ b/resources/lang/da/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locations',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/da/admin/manufacturers/message.php b/resources/lang/da/admin/manufacturers/message.php
        index 6586d2af44..92b34ee7b4 100644
        --- a/resources/lang/da/admin/manufacturers/message.php
        +++ b/resources/lang/da/admin/manufacturers/message.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'does_not_exist' => 'Manufacturer does not exist.',
        +    'does_not_exist' => 'Fabrikant eksistere ikke.',
             'assoc_users'	 => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',
         
             'create' => array(
        diff --git a/resources/lang/da/admin/manufacturers/table.php b/resources/lang/da/admin/manufacturers/table.php
        index f66320fe8d..4e3ea9904d 100644
        --- a/resources/lang/da/admin/manufacturers/table.php
        +++ b/resources/lang/da/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Asset Manufacturers',
             'create'				=> 'Create Manufacturer',
             'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/da/admin/models/message.php b/resources/lang/da/admin/models/message.php
        index fe51cb8d4c..5b1b9a1a1b 100644
        --- a/resources/lang/da/admin/models/message.php
        +++ b/resources/lang/da/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/da/admin/settings/general.php b/resources/lang/da/admin/settings/general.php
        index 1a6b2d4797..73fd052a58 100644
        --- a/resources/lang/da/admin/settings/general.php
        +++ b/resources/lang/da/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/da/admin/settings/message.php b/resources/lang/da/admin/settings/message.php
        index 736d5c3e9e..2eb87b5c02 100644
        --- a/resources/lang/da/admin/settings/message.php
        +++ b/resources/lang/da/admin/settings/message.php
        @@ -4,7 +4,7 @@ return array(
         
         
             'update' => array(
        -        'error'                 => 'An error has occurred while updating. ',
        +        'error'                 => 'Der opstod en fejl under opdatering. ',
                 'success'               => 'Settings updated successfully.'
             ),
             'backup' => array(
        diff --git a/resources/lang/da/admin/suppliers/message.php b/resources/lang/da/admin/suppliers/message.php
        index df4bc41af3..6ec5bc2b97 100644
        --- a/resources/lang/da/admin/suppliers/message.php
        +++ b/resources/lang/da/admin/suppliers/message.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'does_not_exist' => 'Supplier does not exist.',
        +    'does_not_exist' => 'Leverandør findes ikke.',
             'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
         
             'create' => array(
        diff --git a/resources/lang/da/admin/users/general.php b/resources/lang/da/admin/users/general.php
        index 92ee04b491..bba08e566c 100644
        --- a/resources/lang/da/admin/users/general.php
        +++ b/resources/lang/da/admin/users/general.php
        @@ -3,19 +3,23 @@
         
         return array(
         
        -    'assets_user'       => 'Assets assigned to :name',
        +    'assets_user'       => 'Aktiver tildelt :navn',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
        -    'clone'             => 'Clone User',
        -    'contact_user'      => 'Contact :name',
        -    'edit'              => 'Edit User',
        -    'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'clone'             => 'Klon bruger',
        +    'contact_user'      => 'Kontakt :navn',
        +    'edit'              => 'Redigér bruger',
        +    'filetype_info'     => 'Tilladte filtyper er png, gif, jpg, jpeg, doc, docx, pdf, txt, zip og rar.',
             'history_user'      => 'History for :name',
        -    'last_login'        => 'Last Login',
        +	'info'				=> 'Information',
        +    'restore_user'		=> 'Klik her for at gendanne dem.',
        +    'last_login'        => 'Sidste Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        -    'view_user'         => 'View User :name',
        -    'usercsv'           => 'CSV file',
        +    'view_user'         => 'Se bruger :navn',
        +    'usercsv'           => 'CSV-fil',
             'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
             'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_active'   => '2FA aktiv ',
             );
        diff --git a/resources/lang/da/admin/users/message.php b/resources/lang/da/admin/users/message.php
        index a1a9757e86..8ee552afab 100644
        --- a/resources/lang/da/admin/users/message.php
        +++ b/resources/lang/da/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'User already exists!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'User was successfully deleted.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/da/admin/users/table.php b/resources/lang/da/admin/users/table.php
        index 8c9b40a454..6cf9afae98 100644
        --- a/resources/lang/da/admin/users/table.php
        +++ b/resources/lang/da/admin/users/table.php
        @@ -1,36 +1,38 @@
         <?php
         
         return array(
        -
        -    'activated'  			=> 'Active',
        -    'allow'  				=> 'Allow',
        -    'checkedout'  			=> 'Assets',
        -    'created_at' 			=> 'Created',
        -    'createuser' 			=> 'Create User',
        -    'deny'  				=> 'Deny',
        +    'activated'  			=> 'Aktiv',
        +    'allow'  				=> 'Tillad',
        +    'checkedout'  			=> 'Aktiver',
        +    'created_at' 			=> 'Oprettet',
        +    'createuser' 			=> 'Opret bruger',
        +    'deny'  				=> 'Afvis',
             'email'      			=> 'Email',
        -    'employee_num'      	=> 'Employee No.',
        -    'first_name' 			=> 'First Name',
        +    'employee_num'      	=> 'Medarbejder nr.',
        +    'first_name' 			=> 'Fornavn',
             'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        -    'id'         			=> 'Id',
        +    'id'         			=> 'ID',
             'inherit'  				=> 'Inherit',
        -    'job' 					=> 'Job Title',
        -    'last_login'  			=> 'Last Login',
        -    'last_name'  			=> 'Last Name',
        -    'location'  			=> 'Location',
        +    'job' 					=> 'Job Titel',
        +    'last_login'  			=> 'Sidste Login',
        +    'last_name'  			=> 'Efternavn',
        +    'location'  			=> 'Placering',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        -    'name' 					=> 'Name',
        -    'notes'                 => 'Notes',
        -    'password_confirm' 		=> 'Confirm Password',
        -    'password' 				=> 'Password',
        -    'phone'  				=> 'Phone',
        -    'show_current'          => 'Show Current Users',
        -    'show_deleted'          => 'Show Deleted Users',
        -    'title' 				=> 'Title',
        -    'updateuser' 			=> 'Update User',
        -    'username' 				=> 'Username',
        +    'managed_locations'     => 'Administrerede placeringer',
        +    'name' 					=> 'Navn',
        +    'notes'                 => 'Noter',
        +    'password_confirm' 		=> 'Bekræft adgangskode',
        +    'password' 				=> 'Adgangskode',
        +    'phone'  				=> 'Telefon',
        +    'show_current'          => 'Vis nuværende brugere',
        +    'show_deleted'          => 'Vis slettede brugere',
        +    'title' 				=> 'Titel',
        +	'to_restore_them'		=> 'to restore them.',
        +    'updateuser' 			=> 'Opdatere bruger',
        +    'username' 				=> 'Brugernavn',
        +	'user_deleted_text' 	=> 'Denne bruger er blevet markeret som slettede.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        -    'cloneuser'             => 'Clone User',
        -    'viewusers' 			=> 'View Users',
        +    'cloneuser'             => 'Klon bruger',
        +    'viewusers' 			=> 'Se brugere',
         );
        diff --git a/resources/lang/da/auth/general.php b/resources/lang/da/auth/general.php
        index bf88cba77a..87c2d9fce7 100644
        --- a/resources/lang/da/auth/general.php
        +++ b/resources/lang/da/auth/general.php
        @@ -1,12 +1,12 @@
         <?php
         
         return [
        -    'send_password_link'	        => 'Send Password Reset Link',
        -    'email_reset_password'			=> 'Email Password Reset',
        -    'reset_password'			    => 'Reset Password',
        +    'send_password_link'	        => 'Send Link til nulstilling af adgangskode',
        +    'email_reset_password'			=> 'Nulstil adgangskode',
        +    'reset_password'			    => 'Nulstil adgangskode',
             'login'                         => 'Login',
        -    'login_prompt'                  => 'Please Login',
        -    'forgot_password'               => 'I forgot my password',
        -    'remember_me'                   => 'Remember Me',
        +    'login_prompt'                  => 'Log venligst ind',
        +    'forgot_password'               => 'Jeg har glemt min adgangskode',
        +    'remember_me'                   => 'Husk mig',
             ];
         
        diff --git a/resources/lang/da/auth/message.php b/resources/lang/da/auth/message.php
        index 3b59fedf9b..f3d9ccdb47 100644
        --- a/resources/lang/da/auth/message.php
        +++ b/resources/lang/da/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Denne brugerkonto er ikke aktiveret.',
             'account_suspended'      => 'Denne brugerkonto er suspenderet.',
             'account_banned'         => 'Denne brugerkonto er blokeret.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Der opstod et problem, ved forsøg på at logge dig ind, prøv igen.',
        diff --git a/resources/lang/da/button.php b/resources/lang/da/button.php
        index 6846a66617..a3b04bc820 100644
        --- a/resources/lang/da/button.php
        +++ b/resources/lang/da/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Handlinger',
             'add'    	                => 'Tilføj Ny',
             'cancel'                    => 'Annuller',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Anmodning',
             'submit'  	                => 'Send',
             'upload'                    => 'Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/da/general.php b/resources/lang/da/general.php
        index dbaf52c362..51b22016b5 100644
        --- a/resources/lang/da/general.php
        +++ b/resources/lang/da/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Aktiv Rapport',
             'asset_tag'				=> 'Aktiv Mærkat',
             'assets_available'		=> 'aktiver tilgængelige',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Aktiver',
             'avatar_delete'         => 'Slet avatar',
             'avatar_upload'         => 'Upload Avatar',
             'back'      			=> 'Tilbage',
             'bad_data'      		=> 'Intet fundet. Måske dårlig data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Masseudtjekning',
             'cancel'  				=> 'Annuller',
             'categories'			=> 'Kategorier',
             'category'				=> 'Kategori',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Skift email adresse',
             'changepassword'  		=> 'Skift adgangskode',
             'checkin'  				=> 'Tjek Ind',
             'checkin_from'  		=> 'Tjek ind fra',
             'checkout'  			=> 'Tjek Ud',
             'city'  				=> 'By',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Selskaber',
             'company'				=> 'Selskab',
             'component'			=> 'Komponent',
             'components'			=> 'Komponenter',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Land',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'skabte aktiver',
             'created_at' 			=> 'Skabt den',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Aktuelle',
             'custom_report'         => 'Tilpasset Aktiv Rapport',
             'dashboard'				=> 'Oversigtspanel',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Dato',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Slet',
             'deleted'  				=> 'Slettet',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Implementeret',
             'depreciation_report'	=> 'Afskrivningsrapport',
             'download'				=> 'Hent',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Ingen rettigheder!',
             'language'				=> 'Sprog',
             'last'					=> 'Sidste',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Efternavn',
             'license'				=> 'Licens',
             'license_report'        => 'Licensrapport',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'Mere Info',
             'name'					=> 'Navn',
             'next'					=> 'Næste',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'ny!',
             'no_depreciation'		=> 'Ingen Afskrivning',
             'no_results'			=> 'Ingen Resultater.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Leverandører',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'totale aktiver',
             'total_licenses'		=> 'totale licenser',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/da/mail.php b/resources/lang/da/mail.php
        index c9a4fe182d..cb91d7a7e0 100644
        --- a/resources/lang/da/mail.php
        +++ b/resources/lang/da/mail.php
        @@ -54,21 +54,21 @@ return array(
             'read_the_terms' => 'Please read the terms of use below.',
             'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
                                  and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        +    'requested' => 'Anmodede om:',
             'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        +    'reset_password' => 'Klik her for at nulstille adgangskoden:',
             'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        +    'supplier' => 'Leverandør',
        +    'tag' => 'Mærkat',
        +    'test_email' => 'Test E-mail fra Snipe-IT',
        +    'test_mail_text' => 'Dette er en test fra Snipe-IT Asset Management System. Hvis du fik dette, virker mailen :)',
             'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        +    'There_are' => '{1} Der er| [2,Inf] Der er',
        +    'to_reset' => 'Nulstille din :web-adgangskode, udfylde denne formular:',
             'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'user' => 'Bruger:',
        +    'username' => 'Brugernavn:',
        +    'welcome' => 'Velkommen :navn',
        +    'welcome_to' => 'Velkommen til :web!',
        +    'your_credentials' => 'Dine Snipe-IT Legitimationsoplysninger',
         );
        diff --git a/resources/lang/da/validation.php b/resources/lang/da/validation.php
        index b8ccbe151f..f68ea67ed9 100644
        --- a/resources/lang/da/validation.php
        +++ b/resources/lang/da/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute skal være accepteret.",
        -    "active_url"       => ":attribute er ikke en gyldig URL.",
        -    "after"            => ":attribute skal være en dato efter :date.",
        -    "alpha"            => ":attribute må kun indeholde bogstaver.",
        -    "alpha_dash"       => ":attribute må kun indeholde bogstaver, tal eller bindestreger.",
        -    "alpha_num"        => ":attribute må kun indeholde bogstaver eller tal.",
        -    "before"           => ":attribute skal være en dato før :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute skal være imellem :min - :max.",
        -        "file"    => ":attribute skal være imellem :min - :max kilobytes.",
        -        "string"  => ":attribute skal være imellem :min - :max tegn.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => ":attribute er ikke en gyldig dato.",
        -    "date_format"      => ":attribute svarer ikke til formatet :format.",
        -    "different"        => ":attribute og :other skal være forskellige.",
        -    "digits"           => ":attribute skal være :digits cifre.",
        -    "digits_between"   => ":attribute skal være imellem :min og :max cifre.",
        -    "email"            => ":attribute formatet er ugylidgt.",
        -    "exists"           => "Den valgte :attribute er ugyldig.",
        -    "email_array"      => "En eller flere email-adresser er ugyldige.",
        -    "image"            => ":attribute skal være et billede.",
        -    "in"               => "Det valgte :attribute er ugyldigt.",
        -    "integer"          => ":attribute skal være et heltal.",
        -    "ip"               => ":attribute skal være en gyldig IP adresse.",
        -    "max"              => array(
        -        "numeric" => ":attribute må ikke overstige :max.",
        -        "file"    => ":attribute må ikke overstige :max. kilobytes.",
        -        "string"  => ":attribute må ikke overstige :max. tegn.",
        -    ),
        -    "mimes"            => ":attribute skal være en fil af typen: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute skal mindst være :min.",
        -        "file"    => ":attribute skal mindst være :min kilobytes.",
        -        "string"  => ":attribute skal mindst være :min tegn.",
        -    ),
        -    "not_in"           => "Den valgte :attribute er ugyldig.",
        -    "numeric"          => ":attribute skal være et tal.",
        -    "regex"            => ":attribute formatet er ugyldigt.",
        -    "required"         => ":attribute feltet er krævet.",
        -    "required_if"      => ":attribute feltet er krævet når :other er :value.",
        -    "required_with"    => ":attribute er krævet når :values forekommer.",
        -    "required_without" => ":attribute er krævet når :values ikke forekommer.",
        -    "same"             => ":attribute og :other skal være ens.",
        -    "size"             => array(
        -        "numeric" => ":attribute skal være :size.",
        -        "file"    => ":attribute skal være :size kilobytes.",
        -        "string"  => ":attribute skal være :size tegn.",
        -    ),
        -    "unique"           => ":attribute er allerede taget.",
        -    "url"              => ":attribute formatet er ugyldigt.",
        -    "statuslabel_type" => "Du skal vælge en gyldig statusmærke type",
        -    "unique_undeleted" => ":attribute skal være unik.",
        +    'accepted'             => ':attribute skal være accepteret.',
        +    'active_url'           => ':attribute er ikke en gyldig URL.',
        +    'after'                => ':attribute skal være en dato efter :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute må kun indeholde bogstaver.',
        +    'alpha_dash'           => ':attribute må kun indeholde bogstaver, tal eller bindestreger.',
        +    'alpha_num'            => ':attribute må kun indeholde bogstaver eller tal.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute skal være en dato før :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute skal være imellem :min - :max.',
        +        'file'    => ':attribute skal være imellem :min - :max kilobytes.',
        +        'string'  => ':attribute skal være imellem :min - :max tegn.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => ':attribute er ikke en gyldig dato.',
        +    'date_format'          => ':attribute svarer ikke til formatet :format.',
        +    'different'            => ':attribute og :other skal være forskellige.',
        +    'digits'               => ':attribute skal være :digits cifre.',
        +    'digits_between'       => ':attribute skal være imellem :min og :max cifre.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute formatet er ugylidgt.',
        +    'exists'               => 'Den valgte :attribute er ugyldig.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute skal være et billede.',
        +    'in'                   => 'Det valgte :attribute er ugyldigt.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute skal være et heltal.',
        +    'ip'                   => ':attribute skal være en gyldig IP adresse.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute må ikke overstige :max.',
        +        'file'    => ':attribute må ikke overstige :max. kilobytes.',
        +        'string'  => ':attribute må ikke overstige :max. tegn.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute skal være en fil af typen: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute skal mindst være :min.',
        +        'file'    => ':attribute skal mindst være :min kilobytes.',
        +        'string'  => ':attribute skal mindst være :min tegn.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Den valgte :attribute er ugyldig.',
        +    'numeric'              => ':attribute skal være et tal.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute formatet er ugyldigt.',
        +    'required'             => ':attribute feltet er krævet.',
        +    'required_if'          => ':attribute feltet er krævet når :other er :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute er krævet når :values forekommer.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute er krævet når :values ikke forekommer.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute og :other skal være ens.',
        +    'size'                 => [
        +        'numeric' => ':attribute skal være :size.',
        +        'file'    => ':attribute skal være :size kilobytes.',
        +        'string'  => ':attribute skal være :size tegn.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute er allerede taget.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute formatet er ugyldigt.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => ":attribute feltet indeholder en karakter der ikke er tilladt.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/de/admin/accessories/general.php b/resources/lang/de/admin/accessories/general.php
        index 67d9909408..645a457658 100644
        --- a/resources/lang/de/admin/accessories/general.php
        +++ b/resources/lang/de/admin/accessories/general.php
        @@ -2,7 +2,7 @@
         
         return array(
             'about_accessories_title' 			=> 'Über Zubehör',
        -    'about_accessories_text'  			=> 'Ein Zubehör ist alles was Sie an einem Benutzer ausgeben können, jedoch keine Seriennummer besitzt (oder wo es keinen Sinn macht eben diese zu verwalten). Zum Beispiel: Computer Mäuse und Tastaturen.',
        +    'about_accessories_text'  			=> 'Ein Zubehör ist alles was Sie an einen Benutzer ausgeben können, jedoch keine Seriennummer besitzt (oder es keinen Sinn macht diese zu verwalten). Zum Beispiel: Computer, Mäuse und Tastaturen.',
             'accessory_category' 				=> 'Züberhor Kategorie',
             'accessory_name'  					=> 'Zubehör Name',
             'checkout'  							=> 'Zubehör ausbuchen',
        diff --git a/resources/lang/de/admin/asset_maintenances/message.php b/resources/lang/de/admin/asset_maintenances/message.php
        index a7494b2337..3c12c35b0c 100644
        --- a/resources/lang/de/admin/asset_maintenances/message.php
        +++ b/resources/lang/de/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Wartungsvertrag wurde nicht erstellt. Bitte versuchen Sie es erneut.',
                     'success' => 'Wartungsvertrag erfolgreich erstellt.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Wartungsvertrag noch nicht komplett ausgefüllt',
                 'warranty'                     => 'Garantie',
                 'not_warranty'                 => 'keine Garantie',
        diff --git a/resources/lang/de/admin/categories/general.php b/resources/lang/de/admin/categories/general.php
        index fa4b51ae53..9eabe49e41 100644
        --- a/resources/lang/de/admin/categories/general.php
        +++ b/resources/lang/de/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Über Kategorien',
        +    'about_categories'  				=> 'Kategorien helfen Ihnen dabei, Ihre Assets zu organisieren. Beispielkategorien sind "PCs", "Laptops", "Handys", "Tablets" usw., jedoch können Sie Kategorien nutzen, wie es für Sie sinnvoll erscheint.',
             'asset_categories' 					=> 'Asset-Kategorien',
             'category_name'  					=> 'Kategoriename',
             'checkin_email'                     => 'Dem Nutzer eine E-Mail beim Anmelden zusenden.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Kategorie bearbeiten',
             'eula_text'							=> 'Kategorie EULA',
             'eula_text_help'					=> 'Dieses Feld erlaubt Ihnen die EULA Ihren Bedürfnissen nach Asset Typ anzupassen.Wenn Sie nur eine EULA für alle Assets haben, aktivieren Sie die Checkbox unterhalb um die Standard EULA zu verwenden.',
        +    'name'                              => 'Kategorie Name',
             'require_acceptance'				=> 'Benutzer müssen bei Assets in dieser Kategorie Ihre Zustimmung bestätigen.',
             'required_acceptance'				=> 'Dieser Benutzer erhält ein Email zur Bestätigung des Gegenstands.',
             'required_eula'						=> 'Dieser Benutzer erhält eine Kopie der EULA via Email',
        diff --git a/resources/lang/de/admin/companies/general.php b/resources/lang/de/admin/companies/general.php
        index a9fa5be257..1992c53ef6 100644
        --- a/resources/lang/de/admin/companies/general.php
        +++ b/resources/lang/de/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Über Firmen',
        +    'about_companies_text'                  => 'Firmen können als Bezeichnungsfeld genutzt werden oder um die Sichtbarkeit der Assets, Benutzer, etc. einzuschränken, wenn die volle Mehrmandanten-Unterstützung für Firmen in den Admin-Einstellungen aktiviert ist.',
             'select_company' => 'Firma auswählen',
         ];
        diff --git a/resources/lang/de/admin/components/general.php b/resources/lang/de/admin/components/general.php
        index 2a1d8f8980..54c64a3db2 100644
        --- a/resources/lang/de/admin/components/general.php
        +++ b/resources/lang/de/admin/components/general.php
        @@ -5,7 +5,7 @@ return array(
             'about_components_text'  			=> 'Komponenten sind Teile eines Assets, zum Beispiel eine Festplatte, Arbeitsspeicher, etc.',
             'component_name'                  => 'Komponentenname',
             'checkin'                             => 'Komponent einchecken',
        -    'checkout'                             => 'Komponent auschecken',
        +    'checkout'                             => 'Komponente herausgeben',
             'cost'				=> 'Einkaufspreis',
             'create'                             => 'Komponente erstellen',
             'edit'                             => 'Komponente bearbeiten',
        diff --git a/resources/lang/de/admin/consumables/general.php b/resources/lang/de/admin/consumables/general.php
        index 2e5fb86e5e..825e3fd436 100644
        --- a/resources/lang/de/admin/consumables/general.php
        +++ b/resources/lang/de/admin/consumables/general.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -    'about_consumables_title' 			=> 'Details Verbrauchsmaterialien',
        +    'about_consumables_title' 			=> 'Über Verbrauchsmaterialien',
             'about_consumables_text'  			=> 'Verbrauchsmaterialien sind alle Dinge, die gekauft und mit der Zeit aufgebraucht werden, wie z.B. Druckerpatronen oder Kopierpapier.',
             'checkout'                          => 'Verbrauchsmaterial an Benutzer ausgeben',
             'consumable_name'                   => 'Name des Verbrauchsmaterials',
        diff --git a/resources/lang/de/admin/custom_fields/general.php b/resources/lang/de/admin/custom_fields/general.php
        index a81fec7dfa..66378837ea 100644
        --- a/resources/lang/de/admin/custom_fields/general.php
        +++ b/resources/lang/de/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'Über Feldsätze',
             'about_fieldsets_text'		=> 'Feldsätze erlauben es Gruppen aus benutzerdefinierten Feldern zu erstellen, welche regelmäßig für spezifische Modelltypen benutzt werden.',
             'custom_format'             => 'Benutzerdefiniertes Format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Den Wert dieses Feldes in der Datenbank verschlüsseln',
             'encrypt_field_help'      => 'Warnung: Ein verschlüsseltes Feld kann nicht durchsucht werden.',
             'encrypted'      	        => 'Verschlüsselt',
             'fieldset'      	        => 'Feldsatz',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Feldsatzname',
             'field_name'              => 'Feldname',
             'field_values'            => 'Feldwerte',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Fügen Sie eine wählbare Option pro Zeile hinzu. Leere Zeilen, außer der ersten, werden ignoriert.',
             'field_element'           => 'Formularelement',
             'field_element_short'     => 'Element',
             'field_format'            => 'Format',
        diff --git a/resources/lang/de/admin/custom_fields/message.php b/resources/lang/de/admin/custom_fields/message.php
        index 6cbb8ff9bb..0762ec1d5f 100644
        --- a/resources/lang/de/admin/custom_fields/message.php
        +++ b/resources/lang/de/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Feldsatz existiert nicht',
         
                 'create' => array(
                     'error'   => 'Feldsatz wurde nicht erstellt. Bitte erneut versuchen.',
        diff --git a/resources/lang/de/admin/departments/message.php b/resources/lang/de/admin/departments/message.php
        new file mode 100644
        index 0000000000..6b1ba5ca45
        --- /dev/null
        +++ b/resources/lang/de/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Diese Abteilung existiert nicht.',
        +    'assoc_users'	 => 'Diese Abteilung ist mit mindestens einem Benutzer verknüpft und kann nicht gelöscht werden. Bitte Benutzer updaten, so dass diese Abteilung nicht mehr verknüpft ist und erneut versuchen. ',
        +    'create' => array(
        +        'error'   => 'Abteilung wurde nicht erstellt, bitte versuchen Sie es erneut.',
        +        'success' => 'Abteilung erfolgreich erstellt.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Abteilung wurde nicht verändert, bitte versuchen Sie es erneut',
        +        'success' => 'Abteilung erfolgreich aktualisiert.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Sind Sie sicher, dass Sie diese Abteilung entfernen möchten?',
        +        'error'   => 'Beim Löschen der Abteilung ist ein Fehler aufgetreten. Bitte versuchen Sie erneut.',
        +        'success' => 'Die Abteilung wurde erfolgreich gelöscht.'
        +    )
        +
        +);
        diff --git a/resources/lang/de/admin/departments/table.php b/resources/lang/de/admin/departments/table.php
        new file mode 100644
        index 0000000000..d5dad4472e
        --- /dev/null
        +++ b/resources/lang/de/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Name der Abteilung',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Standort',
        +    'create'                    => 'Abteilung erstellen',
        +    'update'                    => 'Abteilung aktualisieren',
        +    );
        diff --git a/resources/lang/de/admin/depreciations/general.php b/resources/lang/de/admin/depreciations/general.php
        index 82d0965a30..4d8271f22c 100644
        --- a/resources/lang/de/admin/depreciations/general.php
        +++ b/resources/lang/de/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Über Asset-Abschreibungen',
             'about_depreciations'  					=> 'Sie können Asset-Abschreibungen einrichten, um Assets linear abzuschreiben.',
             'asset_depreciations'  					=> 'Asset-Abschreibungen',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Abschreibung erstellen',
             'depreciation_name'  					=> 'AfA-Name',
             'number_of_months'  					=> 'Anzahl der Monate',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Abschreibung aktualisieren',
         
         );
        diff --git a/resources/lang/de/admin/groups/titles.php b/resources/lang/de/admin/groups/titles.php
        index 4827ffb2a8..4096c22323 100644
        --- a/resources/lang/de/admin/groups/titles.php
        +++ b/resources/lang/de/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Gruppen',
        +    'about_groups'                  => 'Gruppen werden verwendet, um die Benutzerberechtigungen zu verallgemeinern.',
             'group_management' 	 	=> 'Gruppenverwaltung',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Neue Gruppe erstellen',
        +    'update' 	 		        => 'Gruppe bearbeiten',
             'group_name' 	 		=> 'Gruppenname',
             'group_admin' 	 		=> 'Gruppenadministrator',
             'allow' 	 			=> 'Zulassen',
        diff --git a/resources/lang/de/admin/hardware/form.php b/resources/lang/de/admin/hardware/form.php
        index 23783971b2..e2e8e98386 100644
        --- a/resources/lang/de/admin/hardware/form.php
        +++ b/resources/lang/de/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Massenlöschung von Assets bestätigen',
           'bulk_delete_help'	=> 'Überprüfen Sie die nachfolgenden Assets für die Massenlöschung. Sobald diese gelöscht sind, können diese zwar wiederhergestellt werden, sind aber dem aktuellen Nutzer nicht mehr zugeordnet.',
           'bulk_delete_warn'	=> 'Sie sind im Begriff :asset_count Assets zu löschen.',
         	'bulk_update'		=> 'Massenaktualisierung von Assets',
        diff --git a/resources/lang/de/admin/hardware/general.php b/resources/lang/de/admin/hardware/general.php
        index 08febf9f4b..b6d9ed0309 100644
        --- a/resources/lang/de/admin/hardware/general.php
        +++ b/resources/lang/de/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Über Assets',
        +    'about_assets_text'            => 'Assets sind Gegenstände die durch eine Seriennummer oder Bezeichnung identifiziert werden. Meistens sind diese von höherem Wert, wobei es Sinn macht diese spezifisch zu kennzeichnen.',
         	'archived'  				=> 'Archiviert',
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Assets an Benutzer herausgeben',
             'checkin'  					=> 'Asset zurücknehmen',
        -    'checkout'  				=> 'Asset an Benutzer herausgeben',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Asset duplizieren',
             'deployable'  				=> 'Einsetzbar',
             'deleted'  					=> 'Dieses Asset wurde gelöscht. <a href="/hardware/:asset_id/restore">Zur Wiederherstellung hier klicken</a>.',
        diff --git a/resources/lang/de/admin/hardware/message.php b/resources/lang/de/admin/hardware/message.php
        index cf9c068eaa..4c350adeda 100644
        --- a/resources/lang/de/admin/hardware/message.php
        +++ b/resources/lang/de/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset erfolgreich wiederhergestellt.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Datei wurde nicht gelöscht. Bitte noch einmal Probieren.',
                 'success' => 'Datei erfolgreich gelöscht.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Sind Sie sicher, dass Sie dieses Asset entfernen möchten?',
                 'error'   		=> 'Beim Entfernen dieses Assets ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',
        +        'nothing_updated'   => 'Es wurden keine Assets ausgewählt, somit wurde auch nichts gelöscht.',
                 'success' 		=> 'Dieses Asset wurde erfolgreich entfernt.'
             ),
         
        diff --git a/resources/lang/de/admin/licenses/general.php b/resources/lang/de/admin/licenses/general.php
        index 90ea5ef52e..fa97cdcd41 100644
        --- a/resources/lang/de/admin/licenses/general.php
        +++ b/resources/lang/de/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Lizenzen',
        +    'about_licenses'                  => 'Lizenzen werden verwendet, um Software zu verfolgen.  Sie haben eine bestimmte Anzahl von Plätzen, die an Einzelpersonen ausgegeben werden können',
             'checkin'  					=> 'Lizenzaktivierung zurücknehmen',
             'checkout_history'  		=> 'Zuweisungsverlauf',
             'checkout'  				=> 'Lizenzaktivierung herausgeben',
        diff --git a/resources/lang/de/admin/licenses/message.php b/resources/lang/de/admin/licenses/message.php
        index 3796fabf22..aeda3e32cc 100644
        --- a/resources/lang/de/admin/licenses/message.php
        +++ b/resources/lang/de/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Datei(en) wurden nicht hochgeladen. Bitte versuchen Sie es noch einmal.',
                 'success' => 'Datei(en) erfolgreich hochgeladen.',
                 'nofiles' => 'Es wurde keine Datei für den Upload ausgewählt, oder die Datei ist zu groß',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Eine oder mehrere Ihrer Dateien sind zu groß oder ist ein Dateityp, der nicht zulässig ist. Erlaubte Dateitypen sind png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml und lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/de/admin/locations/message.php b/resources/lang/de/admin/locations/message.php
        index 1b507fabb9..dc09e1e641 100644
        --- a/resources/lang/de/admin/locations/message.php
        +++ b/resources/lang/de/admin/locations/message.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'does_not_exist' => 'Standort nicht verfügbar.',
        +    'does_not_exist' => 'Der Standort ist nicht vorhanden.',
             'assoc_users'	 => 'Dieser Standort ist mit mindestens einem Benutzer verknüpft und kann nicht gelöscht werden. Bitte Benutzer updaten, so dass dieser Standort nicht mehr verknüpft ist und erneut versuchen. ',
             'assoc_assets'	 => 'Dieser Ort ist mit mindestens einem Asset verknüpft und kann nicht gelöscht werden. Bitte Asset updaten, so dass dieser Standort nicht mehr verknüpft ist und erneut versuchen. ',
             'assoc_child_loc'	 => 'Dieser Ort ist mit mindestens einem anderen Ort übergeordnet und kann nicht gelöscht werden. Bitte Orte aktualisieren, so dass dieser Standort nicht mehr verknüpft ist und erneut versuchen. ',
        diff --git a/resources/lang/de/admin/locations/table.php b/resources/lang/de/admin/locations/table.php
        index b95a3304d2..bd7b7df6c5 100644
        --- a/resources/lang/de/admin/locations/table.php
        +++ b/resources/lang/de/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'Über Standorte',
        +    'about_locations'           => 'Standorte werden verwendet, um Standortinformationen für Benutzer, Assets und andere Elemente zu verfolgen',
             'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Zugewiesene Assets',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Standorte',
             'parent'                    => 'Hauptkategorie',
             'currency'                  => 'Landeswährung',
        +    'ldap_ou'                   => 'LDAP OU Suche',
             );
        diff --git a/resources/lang/de/admin/manufacturers/table.php b/resources/lang/de/admin/manufacturers/table.php
        index ce262025ce..88f26adcc9 100644
        --- a/resources/lang/de/admin/manufacturers/table.php
        +++ b/resources/lang/de/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Hersteller',
        +    'about_manufacturers_text'  => 'Hersteller sind Firmen, die ihre Assets herstellen. Hier können Sie wichtige Supportkontakte eintragen, welche in den Assetdetails angezeigt werden.',
             'asset_manufacturers'	=> 'Asset Hersteller',
             'create'				=> 'Hersteller anlegen',
             'id'   					=> 'ID',
        -    'name'      			=> 'Herstellername',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support per E-Mail',
        +    'support_phone'   		=> 'Support Telefon',
        +    'support_url'   		=> 'Support-URL',
             'update'				=> 'Hersteller aktualisieren',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/de/admin/models/general.php b/resources/lang/de/admin/models/general.php
        index 29f9a6dca8..93759982d8 100644
        --- a/resources/lang/de/admin/models/general.php
        +++ b/resources/lang/de/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Asset-Modelle',
        +    'about_models_text'           => 'Asset-Modelle sind eine Möglichkeit, identische Assets zu gruppieren. "MBP 2013", "IPhone 6 s" usw.',
             'deleted'  					        => 'Dieses Modell wurde gelöscht.<a href="/hardware/models/:model_id/restore">klicken Sie hier um es Wiederzuherstellen</a>.',
             'restore'                   => 'Modell wiederherstellen',
             'requestable'               => 'Benutzer können dieses Modell anfordern',
        diff --git a/resources/lang/de/admin/models/message.php b/resources/lang/de/admin/models/message.php
        index 81fd6f766d..2cca000349 100644
        --- a/resources/lang/de/admin/models/message.php
        +++ b/resources/lang/de/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Das Modell wurde erfolgreich Wiederhergestellt.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'Es wurden keine Felder ausgewählt, somit wurde auch nichts aktualisiert.',
        +        'success' 		=> 'Modelle aktualisiert.'
        +    ),
        +
         );
        diff --git a/resources/lang/de/admin/settings/general.php b/resources/lang/de/admin/settings/general.php
        index 881d1379ba..4cf6644299 100644
        --- a/resources/lang/de/admin/settings/general.php
        +++ b/resources/lang/de/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Ablauf Alarmschwelle (in Tagen)',
         	'alert_inv_threshold'		=> 'Inventar Alarmschwelle',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Erzeugen von fortlaufenden Asset IDs',
         	'auto_increment_prefix'		=> 'Präfix (optional)',
         	'auto_incrementing_help'    => 'Aktiviere zuerst fortlaufende Asset IDs um dies zu setzen',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP E-Mail',
             'load_remote_text'          => 'Remote Skripte',
             'load_remote_help_text'		=> 'Diese Installation von Snipe-IT kann Skripte von außerhalb laden.',
        +    'login_note'                => 'Anmeldenotiz',
        +    'login_note_help'           => 'Fügen Sie optional ein paar Sätze zu Ihrem Anmeldebildschirm hinzu, beispielsweise um Personen zu helfen, welche ein verlorenes oder gestohlenes Gerät gefunden haben. Dieses Feld akzeptiert <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Beschränkung von Benutzern (inklusive Administratoren) die einer Firma zugewiesen sind zu den Assets der Firma.',
             'full_multiple_companies_support_text' => 'Volle Mehrmandanten-Unterstützung für Firmen',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'Um QR-Codes anzeigen zu können muss php-gd installiert sein, siehe Installationshinweise.',
             'php_gd_warning'            => 'PHP Image Processing and GD Plugin ist NICHT installiert.',
        +    'pwd_secure_complexity'     => 'Passwortkomplexität',
        +    'pwd_secure_complexity_help' => 'Wählen Sie aus, welche Komplexitätsregeln Sie für Passwörter erzwingen möchten.',
        +    'pwd_secure_min'            => 'Minimale Passwortlänge',
        +    'pwd_secure_min_help'       => 'Minimal zulässiger Wert ist 5',
        +    'pwd_secure_uncommon'       => 'Gebräuchliche Passwörter verhindern',
        +    'pwd_secure_uncommon_help'  => 'Verhindert die Verwendung der 10.000 häufigsten Passwörter aus im Internet geleakten Quellen.',
             'qr_help'                   => 'Schalte zuerst QR Codes an um dies zu setzen',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Einstellung',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Mit diesen Einstellungen können Sie verschiedene Aspekte Ihrer Installation anpassen.',
             'labels_per_page'           => 'Etiketten pro Seite',
             'label_dimensions'          => 'Etikettengröße (Zoll)',
        +    'next_auto_tag_base'        => 'Nächster Auto-Inkrement',
             'page_padding'             => 'Seiten Ränder (Zoll)',
             'purge'                    => 'Gelöschte Einträge bereinigen',
             'labels_display_bgutter'    => 'Ettiketten Spaltenzwischenraum unterhalb',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'b',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Maximale Höhe der Miniaturansicht',
        +    'thumbnail_max_h_help'   => 'Maximale Höhe für Miniaturansichten in der Listenansicht in Pixel. Min. 25, Max. 500.',
             'two_factor'        => 'Zwei-Faktor-Authentifizierung',
             'two_factor_secret'        => 'Zwei-Faktor Code',
             'two_factor_enrollment'        => 'Zwei-Faktor Registrierung',
        @@ -114,15 +129,15 @@ return array(
             'two_factor_reset_error'          => 'Zwei-Faktor-Gerät zurücksetzen fehlgeschlagen',
             'two_factor_enabled_warning'        => 'Die Aktivierung der Zwei-Faktor-Authentifizierung bewirkt, dass Sie sich sofort mit einem bei der Google Authenticator App registrierten Gerät authentifizieren müssen. Sie haben die Möglichkeit ihr Gerät hinzuzufügen falls derzeit keines registriert ist.',
             'two_factor_enabled_help'        => 'Aktiviert die Zwei-Faktor-Authentifizierung mit der Google Authenticator App.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_optional'        => 'Auswählbar (Benutzer können aktivieren oder deaktivieren, wenn erlaubt)',
             'two_factor_required'        => 'Für alle Benutzer erforderlich',
             'two_factor_disabled'        => 'Deaktiviert',
             'two_factor_enter_code'	=> 'Zwei-Faktor Code eingeben',
             'two_factor_config_complete'	=> 'Code absenden',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enabled_edit_not_allowed' => 'Der Administrator erlaubt nicht, diese Einstellung zu ändern.',
             'two_factor_enrollment_text'	=> "Zwei-Faktor-Authentifizierung ist erforderlich, Ihr Gerät wurde jedoch noch nicht hinzugefügt. Öffnen Sie die Google Authenticator App und scannen Sie den QR-Code unterhalb um Ihr Gerät hinzuzufügen. Geben Sie anschließend den Code ein",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'require_accept_signature'      => 'Signatur erforderlich',
        +    'require_accept_signature_help_text'      => 'Wenn aktiviert, wird eine physische Unterschrift durch den Benutzer notwendig, der das Asset erhält.',
             'left'        => 'links',
             'right'        => 'rechts',
             'top'        => 'Oben',
        diff --git a/resources/lang/de/admin/suppliers/table.php b/resources/lang/de/admin/suppliers/table.php
        index 5943c1d326..fb275f9d90 100644
        --- a/resources/lang/de/admin/suppliers/table.php
        +++ b/resources/lang/de/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Lieferanten',
        +    'about_suppliers_text'  => 'Lieferanten werden verwendet, um die Herkunft der Artikel verfolgen',
             'address'               => 'Lieferantenadressen',
             'assets'                => 'Assets',
             'city'                  => 'Stadt',
        diff --git a/resources/lang/de/admin/users/general.php b/resources/lang/de/admin/users/general.php
        index 61b1325988..150420d691 100644
        --- a/resources/lang/de/admin/users/general.php
        +++ b/resources/lang/de/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Assets zugewiesen an :name',
        +    'bulk_update_warn'	=> 'Sie sind dabei, die Eigenschaften von :user_count Benutzern zu bearbeiten. Bitte beachten Sie, dass Sie Ihre eigenen Benutzerattribute nicht über dieses Formular ändern können. Sie müssen Ihren eigenen Benutzer einzeln bearbeiten.',
        +    'bulk_update_help'	=> 'Hier können mehrere Benutzer gleichzeitig bearbeitet werden. Nur Felder ausfüllen, welche geändert werden sollen. Leere Felder werden nicht geändert.',
             'current_assets'    => 'Asset wurde an nachfolgenden Benutzer ausgegeben',
             'clone'             => 'Benutzer kopieren',
             'contact_user'      => 'Kontakt :name',
             'edit'              => 'Benutzer bearbeiten',
             'filetype_info'     => 'Erlaubte Dateitypen sind png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, und rar.',
             'history_user'      => 'Historie von :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Letzte Anmeldung',
             'ldap_config_text'  => 'Die LDAP Konfigurations Einstellungen finden Sie hier Admin -> Einstellungen. Der (optional) wählbare Standort wird für alle importierten Benutzer gesetzt.',
             'software_user'     => 'Software herausgegeben an :name',
             'view_user'         => 'Benutze :name ansehen',
             'usercsv'           => 'CSV Datei',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'Ihre aktuellen Administrator-Einstellungen erlauben die selektive Durchführung der zwei-Faktor-Authentifizierung.  ',
        +    'two_factor_enrolled' => '2FA Gerät eingeschrieben ',
        +    'two_factor_active'   => '2FA aktiv ',
             );
        diff --git a/resources/lang/de/admin/users/message.php b/resources/lang/de/admin/users/message.php
        index ec169f27aa..4b3fee8eb7 100644
        --- a/resources/lang/de/admin/users/message.php
        +++ b/resources/lang/de/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Sie haben diesen Gegenstand erfolgreich angenommen.',
             'declined'                  => 'Sie haben diesen Gegenstand abgelehnt.',
        +    'bulk_manager_warn'	        => 'Benutzer erfolgreich geändert. Vorgesetzter sollte auch bearbeitet werden und konnte nicht angepasst werden, weil er sich nicht selbst als Vorgesetzter eingetragen haben kann. Bitte Benutzer ohne den Vorgesetzten nochmal bearbeiten.',
             'user_exists'               => 'Benutzer existiert bereits!',
             'user_not_found'            => 'Benutzer [:id] existiert nicht.',
             'user_login_required'       => 'Das Loginfeld ist erforderlich',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Benutzer wurde erfolgreich erstellt.',
                 'update'    => 'Benutzer wurde erfolgreich bearbeitet.',
        +        'update_bulk'    => 'Benutzer erfolgreich geändert!',
                 'delete'    => 'Benutzer wurde erfolgreich gelöscht.',
                 'ban'       => 'Benutzer wurde erfolgreich ausgeschlossen.',
                 'unban'     => 'Benutzer wurde erfolgreich wieder eingeschlossen.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Beim Erstellen des Benutzers ist ein Fehler aufgetreten. Bitte probieren Sie es noch einmal.',
                 'update' => 'Beim Aktualisieren des Benutzers ist ein Fehler aufgetreten. Bitte probieren Sie es noch einmal.',
                 'delete' => 'Beim Entfernen des Benutzers ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',
        +        'delete_has_assets' => 'Der Benutzer konnte nicht gelöscht werden, da ihm Gegenstände zugeordnet sind.',
                 'unsuspend' => 'Es gab ein Problem beim reaktivieren des Benutzers. Bitte versuche es erneut.',
                 'import'    => 'Es gab ein Problem beim importieren der Benutzer. Bitte noch einmal versuchen.',
                 'asset_already_accepted' => 'Dieses Asset wurde bereits akzeptiert.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Konnte keine Verbindung zum LDAP Server herstellen. Bitte LDAP Einstellungen in der LDAP Konfigurationsdatei prüfen. <br>Fehler vom LDAP Server: ',
                 'ldap_could_not_search' => 'Konnte LDAP Server nicht suchen. Bitte LDAP Einstellungen in der LDAP Konfigurationsdatei prüfen. <br>Fehler vom LDAP Server:',
                 'ldap_could_not_get_entries' => 'Konnte keine Einträge vom LDAP Server abrufen. Bitte LDAP Einstellungen in der LDAP Konfigurationsdatei prüfen. <br>Fehler vom LDAP Server:',
        +        'password_ldap' => 'Das Passwort für diesen Account wird vom LDAP/Active Directory verwaltet. Bitte kontaktieren Sie Ihre IT-Abteilung, um Ihr Passwort zu ändern. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/de/admin/users/table.php b/resources/lang/de/admin/users/table.php
        index 2d76c6f817..92d1c1d167 100644
        --- a/resources/lang/de/admin/users/table.php
        +++ b/resources/lang/de/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Active',
             'allow'  				=> 'Erlauben',
             'checkedout'  			=> 'Assets',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Ort',
             'lock_passwords'		=> 'Die Login-Daten können auf dieser Installation nicht geändert werden.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Verwaltete Standorte',
             'name' 					=> 'Name',
             'notes'                 => 'Notizen',
             'password_confirm' 		=> 'Kennwort bestätigen',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Zeige aktuelle Benutzer',
             'show_deleted'          => 'Zeige gelöschte Benutzer',
             'title' 				=> 'Titel',
        +	'to_restore_them'		=> 'zum Wiederherstellen.',
             'updateuser' 			=> 'Benutzer aktualisieren',
             'username' 				=> 'Benutzernamen',
        +	'user_deleted_text' 	=> 'Dieser Benutzer wurde als gelöscht markiert.',
             'username_note' 		=> '(Dies wird für den Bind an das Active Directory benutzt, nicht für die Anmeldung.)',
             'cloneuser'             => 'Benutzer kopieren',
             'viewusers' 			=> 'Benutzer anzeigen',
        diff --git a/resources/lang/de/auth/message.php b/resources/lang/de/auth/message.php
        index 4fd5975908..29beedd11c 100644
        --- a/resources/lang/de/auth/message.php
        +++ b/resources/lang/de/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Das Benutzerkonto ist nicht aktiviert.',
             'account_suspended'      => 'Dieses Benutzerkonto ist gesperrt.',
             'account_banned'         => 'Dieses Benutzerkonto wurde ausgeschlossen.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Zu viele fehlgeschlagene Loginversuche. Bitte versuchen Sie es in :minutes Minute(n) noch einmal.',
         
             'signin' => array(
                 'error'   => 'Bei der Anmeldung ist ein Problem aufgetreten, bitte versuchen Sie es erneut.',
        diff --git a/resources/lang/de/button.php b/resources/lang/de/button.php
        index 98a50b10b9..d8cab53ae3 100644
        --- a/resources/lang/de/button.php
        +++ b/resources/lang/de/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Aktionen',
             'add'    	                => 'Hinzufügen',
             'cancel'                    => 'Abbrechen',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Anfragen',
             'submit'  	                => 'Abschicken',
             'upload'                    => 'Hochladen',
        -
        +	'select_file'				=> 'Datei auswählen...',
         );
        diff --git a/resources/lang/de/general.php b/resources/lang/de/general.php
        index b1fad1321c..c8ba8e677f 100644
        --- a/resources/lang/de/general.php
        +++ b/resources/lang/de/general.php
        @@ -18,42 +18,54 @@
             'asset_report'          => 'Asset Bericht',
             'asset_tag'				=> 'Asset Tag',
             'assets_available'		=> 'verfügbare Assets',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Assets',
             'avatar_delete'         => 'Avatar löschen',
             'avatar_upload'         => 'Avatar hochladen',
             'back'      			=> 'Zurück',
             'bad_data'      		=> 'Nichts gefunden. Vielleicht defekte Daten?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Massen-Checkout',
             'cancel'  				=> 'Abbrechen',
             'categories'			=> 'Kategorien',
             'category'				=> 'Kategorie',
        +    'change' 		        => 'Eingang/Ausgang',
             'changeemail'  			=> 'E-Mail Adresse ändern',
             'changepassword'  		=> 'Passwort ändern',
             'checkin'  				=> 'Checkin Asset',
             'checkin_from'  		=> 'Einchecken von',
             'checkout'  			=> 'Checkout Asset to User',
             'city'  				=> 'Stadt',
        +	'click_here'			=> 'Hier klicken',
             'companies'			=> 'Firmen',
             'company'				=> 'Firma',
             'component'			=> 'Komponente',
             'components'			=> 'Komponenten',
        +	'complete'				=> 'Vollständig',
             'consumable'			=> 'Verbrauchsmaterial',
             'consumables'			=> 'Verbrauchsmaterialien',
             'country'  				=> 'Land',
        -    'create'				=> 'Create Location',
        +    'create'				=> 'Hinzufügen',
             'created'               => 'Eintrag erstellt',
             'created_asset'			=> 'Asset angelegt',
             'created_at' 			=> 'Erstellt am',
        +    'updated_at' 			=> 'Aktualisiert am',
             'currency'  			=> '€', // this is deprecated
             'current'  				=> 'Aktuell',
             'custom_report'         => 'Spezieller Asset Report',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Purchase Date',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Warnung!',
        +    'debug_warning_text'         => 'Diese Anwendung läuft im Produktionsmodus mit debugging aktiviert. Dies kann sensible Daten verfügbar machen, wenn Ihre Anwendung öffentlich zugänglich ist. Deaktivieren Sie den Debug-Modus, indem Sie den <code>APP_DEBUG</code>-Wert in der <code>.env</code> Datei auf <code>false</code> setzen.',
             'delete'  				=> 'Löschen',
             'deleted'  				=> 'Gelöscht',
             'delete_seats'  		=> 'Gelöschte Lizenzen',
        +    'departments'           => 'Abteilungen',
        +    'department'           => 'Abteilung',
             'deployed'				=> 'Herausgegeben',
             'depreciation_report'	=> 'Abschreibunsgreport',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Unzureichende Berechtigungen!',
             'language'				=> 'Sprache',
             'last'					=> 'Letztes',
        +    'last_login'            => 'Letzte Anmeldung',
             'last_name'             => 'Familienname',
             'license'				=> 'Lizenz',
             'license_report'        => 'Lizenz Report',
        @@ -110,22 +123,24 @@
             'moreinfo'				=> 'Mehr Informationen',
             'name'					=> 'Location Name',
             'next'					=> 'Nächstes',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'Neu!',
             'no_depreciation'		=> 'Do Not Depreciate',
             'no_results'			=> 'Keine Treffer.',
             'no'  					=> 'Nein',
             'notes'  				=> 'Notizen',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Bestellnummer',
             'page_menu'				=> 'zeige _MENU_ Einträge',
             'pagination_info'		=> 'Zeige _START_ bis _END_ von _TOTAL_ Einträgen',
        -    'pending'				=> 'Pending Asset',
        +    'pending'				=> 'Ausstehendes Asset',
             'people'				=> 'Personen',
             'per_page'				=> 'Ergebnisse pro Seite',
             'previous'				=> 'Vorherige',
             'processing'			=> 'In Arbeit',
             'profile'				=> 'Ihr Profil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Einkaufspreis',
        +    'purchase_date'         => 'Kaufdatum',
             'qty'		            => 'St',
             'quantity'		        => 'Anzahl',
             'ready_to_deploy'		=> 'Fertig zum herausgeben',
        @@ -138,27 +153,31 @@
             'select'				=> 'auswählen',
             'search'				=> 'Suche',
             'select_category'       => 'Kategorie auswählen',
        +    'select_department'       => 'Abteilung auswählen',
             'select_depreciation'	=> 'Wähle einen Abschreibungstyp',
             'select_location'		=> 'Wählen Sie einen Standort',
             'select_manufacturer'	=> 'Wählen Sie einen Hersteller',
             'select_model'			=> 'Wählen Sie ein Model',
             'select_supplier'		=> 'wählen Sie einen Lieferant',
             'select_user'			=> 'wähle einen Benutzer',
        -    'select_date'			=> 'Datum auswählen',
        +    'select_date'			=> 'Wählen Sie ein Datum (JJJJ-MM-DD)',
             'select_statuslabel'	=> 'Status auswählen',
             'select_company'    	=> 'Firma auswählen',
             'select_asset'    		=> 'Asset auswählen',
             'settings'				=> 'Einstellungen',
             'sign_in'				=> 'Einloggen',
        -    'signature'             => 'Signature',
        +    'signature'             => 'Signatur',
             'some_features_disabled' => 'Einige Funktionen sind für den DEMO-Modus deaktiviert.',
             'site_name'				=> 'Seitenname',
        -    'state'  				=> 'Zustand',
        +    'state'  				=> 'Bundesland',
             'status_labels'			=> 'Statusbezeichnungen',
             'status'    			=> 'Status',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Lieferant',
             'suppliers'  			=> 'Lieferanten',
        +    'sure_to_delete'    => 'Sind Sie sich sicher, dass Sie löschen möchten?',
             'submit'				=> 'Abschicken',
        +    'target'                => 'Ziel',
        +    'time_and_date_display' => 'Zeit und Datum',
             'total_assets'			=> 'Gesamte Assets',
             'total_licenses'		=> 'Lizenzen insgesamt',
             'total_accessories'		=> 'gesamtes Zubehör',
        diff --git a/resources/lang/de/validation.php b/resources/lang/de/validation.php
        index 807d80b648..6f0822db3b 100644
        --- a/resources/lang/de/validation.php
        +++ b/resources/lang/de/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute muss akzeptiert werden.",
        -    "active_url"       => ":attribute ist keine gültige URL.",
        -    "after"            => ":attribute muss ein Datum nach dem :date sein.",
        -    "alpha"            => ":attribute darf nur aus Buchstaben bestehen.",
        -    "alpha_dash"       => ":attribute darf nur aus Buchstaben, Zahlen und Gedankenstrichen bestehen.",
        -    "alpha_num"        => ":attribute darf nur aus Buchstaben und Zahlen bestehen.",
        -    "before"           => ":attribute muss ein Datum vor dem :date sein.",
        -    "between"          => array(
        -        "numeric" => ":attribute muss zwischen :min und :max liegen.",
        -        "file"    => ":attribute darf nur zwischen :min und :max kilobytes groß sein.",
        -        "string"  => ":attribute muss mindestens :min und maximal :max Zeichen enthalten.",
        -    ),
        -    "confirmed"        => ":attribute Bestätigung stimmt nicht überein.",
        -    "date"             => ":attribute ist kein gültiges Datum.",
        -    "date_format"      => ":attribute passt nicht zur :format Formatierung.",
        -    "different"        => ":attribute und :other müssen sich unterscheiden.",
        -    "digits"           => ":attribute muss :digits Stellen haben.",
        -    "digits_between"   => ":attribute soll mindestens :min und darf maximal :max Stellen haben.",
        -    "email"            => "Das Format von :attribute ist ungültig.",
        -    "exists"           => "Das ausgewählte :attribute ist ungültig.",
        -    "email_array"      => "Eine oder mehrere Email Adressen sind ungültig.",
        -    "image"            => ":attribute muss ein Bild sein.",
        -    "in"               => "Auswahl :attribute ist ungültig.",
        -    "integer"          => ":attribute muss eine ganze Zahl sein.",
        -    "ip"               => ":attribute muss eine gültige IP Adresse sein.",
        -    "max"              => array(
        -        "numeric" => ":attribute darf nicht größer als :max sein.",
        -        "file"    => ":attribute darf nicht größer als :max Kilobyte sein.",
        -        "string"  => ":attribute darf nicht mehr als :max Zeichen sein.",
        -    ),
        -    "mimes"            => ":attribute muss eine Datei des Typs :values sein.",
        -    "min"              => array(
        -        "numeric" => ":attribute muss kleiner als :min sein.",
        -        "file"    => ":attribute muss mindestens :min Kilobyte groß sein.",
        -        "string"  => ":attribute benötigt mindestens :min Zeichen.",
        -    ),
        -    "not_in"           => "Auswahl :attribute ist ungültig.",
        -    "numeric"          => ":attribute muss eine Zahl sein.",
        -    "regex"            => ":attribute Format ungültig.",
        -    "required"         => ":attribute Feld muss ausgefüllt sein.",
        -    "required_if"      => ":attribute wird benötigt wenn :other :value entspricht.",
        -    "required_with"    => ":attribute wird benötigt wenn :value ausgewählt ist.",
        -    "required_without" => ":attribute wird benötigt wenn :value nicht ausgewählt ist.",
        -    "same"             => ":attribute und :other müssen übereinstimmen.",
        -    "size"             => array(
        -        "numeric" => ":attribute muss :size groß sein.",
        -        "file"    => ":attribute muss :size Kilobyte groß sein.",
        -        "string"  => ":attribute muss :size Zeichen haben.",
        -    ),
        -    "unique"           => ":attribute schon benutzt.",
        -    "url"              => ":attribute Format ist ungültig.",
        -    "statuslabel_type" => "Gültigen Status Beschriftungstyp auswählen!",
        -    "unique_undeleted" => ":attribute muss eindeutig sein.",
        +    'accepted'             => ':attribute muss akzeptiert werden.',
        +    'active_url'           => ':attribute ist keine gültige URL.',
        +    'after'                => ':attribute muss ein Datum nach dem :date sein.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute darf nur aus Buchstaben bestehen.',
        +    'alpha_dash'           => ':attribute darf nur aus Buchstaben, Zahlen und Gedankenstrichen bestehen.',
        +    'alpha_num'            => ':attribute darf nur aus Buchstaben und Zahlen bestehen.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute muss ein Datum vor dem :date sein.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute muss zwischen :min und :max liegen.',
        +        'file'    => ':attribute darf nur zwischen :min und :max kilobytes groß sein.',
        +        'string'  => ':attribute muss mindestens :min und maximal :max Zeichen enthalten.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute muss wahr oder falsch sein.',
        +    'confirmed'            => ':attribute Bestätigung stimmt nicht überein.',
        +    'date'                 => ':attribute ist kein gültiges Datum.',
        +    'date_format'          => ':attribute passt nicht zur :format Formatierung.',
        +    'different'            => ':attribute und :other müssen sich unterscheiden.',
        +    'digits'               => ':attribute muss :digits Stellen haben.',
        +    'digits_between'       => ':attribute soll mindestens :min und darf maximal :max Stellen haben.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Das Format von :attribute ist ungültig.',
        +    'exists'               => 'Das ausgewählte :attribute ist ungültig.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute muss ein Bild sein.',
        +    'in'                   => 'Auswahl :attribute ist ungültig.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute muss eine ganze Zahl sein.',
        +    'ip'                   => ':attribute muss eine gültige IP Adresse sein.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute darf nicht größer als :max sein.',
        +        'file'    => ':attribute darf nicht größer als :max Kilobyte sein.',
        +        'string'  => ':attribute darf nicht mehr als :max Zeichen sein.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute muss eine Datei des Typs :values sein.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute muss kleiner als :min sein.',
        +        'file'    => ':attribute muss mindestens :min Kilobyte groß sein.',
        +        'string'  => ':attribute benötigt mindestens :min Zeichen.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Auswahl :attribute ist ungültig.',
        +    'numeric'              => ':attribute muss eine Zahl sein.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute Format ungültig.',
        +    'required'             => ':attribute Feld muss ausgefüllt sein.',
        +    'required_if'          => ':attribute wird benötigt wenn :other :value entspricht.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute wird benötigt wenn :value ausgewählt ist.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute wird benötigt wenn :value nicht ausgewählt ist.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute und :other müssen übereinstimmen.',
        +    'size'                 => [
        +        'numeric' => ':attribute muss :size groß sein.',
        +        'file'    => ':attribute muss :size Kilobyte groß sein.',
        +        'string'  => ':attribute muss :size Zeichen haben.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute schon benutzt.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute Format ist ungültig.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Das :attribute Feld enthält ein nicht erlaubtes Zeichen.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/el/admin/accessories/general.php b/resources/lang/el/admin/accessories/general.php
        index 3addf31b6c..73c22f879c 100644
        --- a/resources/lang/el/admin/accessories/general.php
        +++ b/resources/lang/el/admin/accessories/general.php
        @@ -1,22 +1,22 @@
         <?php
         
         return array(
        -    'about_accessories_title' 			=> 'About Accessories',
        +    'about_accessories_title' 			=> 'Σχετικά με τα αξεσουάρ',
             'about_accessories_text'  			=> 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
        -    'accessory_category' 				=> 'Accessory Category',
        -    'accessory_name'  					=> 'Accessory Name',
        -    'checkout'  							=> 'Checkout Accessory',
        +    'accessory_category' 				=> 'Κατηγορία αξεσουάρ',
        +    'accessory_name'  					=> 'Όνομα ανταλλακτικού',
        +    'checkout'  							=> 'Checkout αξεσουάρ',
             'checkin'  							=> 'Checkin Accessory',
        -    'create'  							=> 'Create Accessory',
        -    'edit'  							=> 'Edit Accessory',
        -    'eula_text'							=> 'Category EULA',
        -    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        -    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        -    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'create'  							=> 'Το πεδίο ενημερώθηκε επιτυχώς',
        +    'edit'  							=> 'Επεξεργασία αξεσουάρ',
        +    'eula_text'							=> 'Κατηγορία EULA',
        +    'eula_text_help'					=> 'Αυτό το πεδίο σάς επιτρέπει να προσαρμόσετε τα EULAs για συγκεκριμένους τύπους των περιουσιακών στοιχείων. Εάν έχετε μόνο μία EULA για το σύνολο των περιουσιακών σας στοιχείων, μπορείτε να ελέγξετε το πλαίσιο παρακάτω, για να χρησιμοποιήσετε τον προεπιλεγμένο πρωτεύοντος.',
        +    'require_acceptance'				=> 'Απαιτείται από τους χρήστες να επιβεβαιώσουν την αποδοχή των περιουσιακών στοιχείων σε αυτή την κατηγορία.',
        +    'no_default_eula'					=> 'Δεν βρέθηκαν προεπιλεγμένα πρωτεύοντος EULA. Προσθέστε ένα στις ρυθμίσεις.',
             'total'  							=> 'Σύνολο',
        -    'remaining'  						=> 'Avail',
        -    'update'  							=> 'Update Accessory',
        -    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        -    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +    'remaining'  						=> 'Όφελος',
        +    'update'  							=> 'Ενημέρωση αξεσουάρ',
        +    'use_default_eula'					=> 'Χρησιμοποιήστε την προεπιλεγμένη <a href="#" data-toggle="modal" data-target="#eulaModal">primary EULA</a>.',
        +    'use_default_eula_disabled'			=> '<del>Χρησιμοποιήστε την κύρια προεπιλεγμένη EULA instead.</del> καμία κύρια προεπιλεγμένη άδεια χρήσης τελικού χρήστη δεν έχει οριστεί. Παρακαλείσθε να προσθέσετε μία στις ρυθμίσεις.',
         
         );
        diff --git a/resources/lang/el/admin/accessories/message.php b/resources/lang/el/admin/accessories/message.php
        index e38dee745a..04b059f48f 100644
        --- a/resources/lang/el/admin/accessories/message.php
        +++ b/resources/lang/el/admin/accessories/message.php
        @@ -6,31 +6,31 @@ return array(
             'assoc_users'	 => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
         
             'create' => array(
        -        'error'   => 'The accessory was not created, please try again.',
        -        'success' => 'The accessory was successfully created.'
        +        'error'   => 'Το εξάρτημα δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά.',
        +        'success' => 'Το εξάρτημα δημιουργήθηκε με επιτυχία.'
             ),
         
             'update' => array(
        -        'error'   => 'The accessory was not updated, please try again',
        -        'success' => 'The accessory was updated successfully.'
        +        'error'   => 'Το εξάρτημα δεν ενημερώθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' => 'Το εξάρτημα ενημερώθηκε με επιτυχία.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this accessory?',
        -        'error'   => 'There was an issue deleting the accessory. Please try again.',
        -        'success' => 'The accessory was deleted successfully.'
        +        'confirm'   => 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το εξάρτημα;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας το αξεσουάρ. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Το εξάρτημα διαγράφηκε με επιτυχία.'
             ),
         
              'checkout' => array(
                 'error'   		=> 'Accessory was not checked out, please try again',
                 'success' 		=> 'Accessory checked out successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'user_does_not_exist' => 'Αυτός ο χρήστης δεν είναι έγκυρος. Παρακαλώ δοκιμάστε ξανά.'
             ),
         
             'checkin' => array(
                 'error'   		=> 'Accessory was not checked in, please try again',
                 'success' 		=> 'Accessory checked in successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'user_does_not_exist' => 'Αυτός ο χρήστης δεν είναι έγκυρος. Παρακαλώ δοκιμάστε ξανά.'
             )
         
         
        diff --git a/resources/lang/el/admin/accessories/table.php b/resources/lang/el/admin/accessories/table.php
        index e02d9f22e4..75595b87ff 100644
        --- a/resources/lang/el/admin/accessories/table.php
        +++ b/resources/lang/el/admin/accessories/table.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -	'dl_csv'      				=> 'Download CSV',
        +	'dl_csv'      				=> 'Κατεβάστε το CSV',
         	'eula_text'      			=> 'EULA',
             'id'      					=> 'ID',
        -    'require_acceptance'      	=> 'Acceptance',
        -    'title'      				=> 'Accessory Name',
        +    'require_acceptance'      	=> 'Αποδοχή',
        +    'title'      				=> 'Όνομα ανταλλακτικού',
         
         
         );
        diff --git a/resources/lang/el/admin/asset_maintenances/form.php b/resources/lang/el/admin/asset_maintenances/form.php
        index 2aa005c45f..c26efc1ddd 100644
        --- a/resources/lang/el/admin/asset_maintenances/form.php
        +++ b/resources/lang/el/admin/asset_maintenances/form.php
        @@ -1,14 +1,14 @@
         <?php
         
             return [
        -        'asset_maintenance_type' => 'Maintenance Type',
        -        'title'                  => 'Title',
        -        'start_date'             => 'Started',
        -        'completion_date'        => 'Completed',
        -        'cost'                   => 'Cost',
        -        'is_warranty'            => 'Warranty Improvement',
        -        'asset_maintenance_time' => 'Days',
        -        'notes'                  => 'Notes',
        -        'update'                 => 'Update',
        -        'create'                 => 'Create'
        +        'asset_maintenance_type' => 'Τύπος Συντήρησης',
        +        'title'                  => 'Τίτλος',
        +        'start_date'             => 'Εκτελεσμένες',
        +        'completion_date'        => 'Ολοκληρώθηκε',
        +        'cost'                   => 'Κόστος',
        +        'is_warranty'            => 'Βελτίωση της εγγύησης',
        +        'asset_maintenance_time' => 'Ημέρες',
        +        'notes'                  => 'Σημειώσεις',
        +        'update'                 => 'Ενημέρωση',
        +        'create'                 => 'Δημιουργία'
             ];
        diff --git a/resources/lang/el/admin/asset_maintenances/general.php b/resources/lang/el/admin/asset_maintenances/general.php
        index c7ae42d41a..29364f12b4 100644
        --- a/resources/lang/el/admin/asset_maintenances/general.php
        +++ b/resources/lang/el/admin/asset_maintenances/general.php
        @@ -1,11 +1,11 @@
         <?php
         
             return [
        -        'asset_maintenances' => 'Asset Maintenances',
        -        'edit'               => 'Edit Asset Maintenance',
        -        'delete'             => 'Delete Asset Maintenance',
        -        'view'               => 'View Asset Maintenance Details',
        -        'repair'             => 'Repair',
        -        'maintenance'        => 'Maintenance',
        -        'upgrade'            => 'Upgrade'
        +        'asset_maintenances' => 'Συντήρηση Παγίου',
        +        'edit'               => 'Επεξεργασία συντήρησης του περιουσιακού στοιχείου',
        +        'delete'             => 'Διαγραφή συντήρησης παγίου',
        +        'view'               => 'Λεπτομερής προβολή συντήρησης παγίων',
        +        'repair'             => 'Επισκευή',
        +        'maintenance'        => 'Συντήρηση',
        +        'upgrade'            => 'Αναβάθμιση'
             ];
        diff --git a/resources/lang/el/admin/asset_maintenances/message.php b/resources/lang/el/admin/asset_maintenances/message.php
        index ca4256efbe..ad4af89a6a 100644
        --- a/resources/lang/el/admin/asset_maintenances/message.php
        +++ b/resources/lang/el/admin/asset_maintenances/message.php
        @@ -1,17 +1,21 @@
         <?php
         
             return [
        -        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'not_found'                    => 'Συντήρησης του περιουσιακού στοιχείου που ψάχνετε δεν βρέθηκε!',
                 'delete'                       => [
        -            'confirm' => 'Are you sure you wish to delete this asset maintenance?',
        -            'error'   => 'There was an issue deleting the asset maintenance. Please try again.',
        -            'success' => 'The asset maintenance was deleted successfully.'
        +            'confirm' => 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη συντήρηση παγίου;',
        +            'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας την συντήρηση παγίου. Παρακαλώ δοκιμάστε ξανά.',
        +            'success' => 'Η συντήρηση παγίου διαγράφηκε με επιτυχία.'
                 ],
                 'create'                       => [
        -            'error'   => 'Asset Maintenance was not created, please try again.',
        -            'success' => 'Asset Maintenance created successfully.'
        +            'error'   => 'Η συντήρηση του παγίου δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά.',
        +            'success' => 'Επιτυχής δημιουργία συντήρησης παγίου.'
                 ],
        -        'asset_maintenance_incomplete' => 'Not Completed Yet',
        -        'warranty'                     => 'Warranty',
        -        'not_warranty'                 => 'Not Warranty',
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Δεν ολοκληρώθηκε ακόμη',
        +        'warranty'                     => 'Εγγύηση',
        +        'not_warranty'                 => 'Δεν υπάρχει εγγύηση',
             ];
        \ No newline at end of file
        diff --git a/resources/lang/el/admin/asset_maintenances/table.php b/resources/lang/el/admin/asset_maintenances/table.php
        index f3a6be60f9..f61b201893 100644
        --- a/resources/lang/el/admin/asset_maintenances/table.php
        +++ b/resources/lang/el/admin/asset_maintenances/table.php
        @@ -1,8 +1,8 @@
         <?php
         
             return [
        -        'title'         => 'Asset Maintenance',
        -        'asset_name'    => 'Asset Name',
        -        'is_warranty'   => 'Warranty',
        -        'dl_csv'        => 'Download CSV'
        +        'title'         => 'Συντήρηση Παγίου',
        +        'asset_name'    => 'Όνομα του περιουσιακού στοιχείου',
        +        'is_warranty'   => 'Εγγύηση',
        +        'dl_csv'        => 'Κατεβάστε το CSV'
             ];
        diff --git a/resources/lang/el/admin/categories/general.php b/resources/lang/el/admin/categories/general.php
        index 2a00f82a67..a7819516b2 100644
        --- a/resources/lang/el/admin/categories/general.php
        +++ b/resources/lang/el/admin/categories/general.php
        @@ -1,22 +1,23 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        +    'about_categories_title' 			=> 'Σχετικά με τις κατηγορίες',
             'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        -    'asset_categories' 					=> 'Asset Categories',
        -    'category_name'  					=> 'Category Name',
        +    'asset_categories' 					=> 'Κατηγορίες στοιχείων παγίων',
        +    'category_name'  					=> 'Όνομα κατηγορίας',
             'checkin_email'                     => 'Send email to user on checkin.',
        -    'clone'                             => 'Clone Category',
        -    'create'  							=> 'Create Category',
        -    'edit'                              => 'Edit Category',
        +    'clone'                             => 'Αντιγραφή Κατηγορίας',
        +    'create'  							=> 'Δημιουργία Κατηγορίας',
        +    'edit'                              => 'Επεξεργασία Κατηγορίας',
             'eula_text'							=> 'Category EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        -    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'name'                              => 'Όνομα κατηγορίας',
        +    'require_acceptance'				=> 'Απαιτείται από τους χρήστες να επιβεβαιώσουν την αποδοχή των παγίων στοιχείων σε αυτή την κατηγορία.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
             'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        -    'update'  							=> 'Update Category',
        -    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'update'  							=> 'Ενημέρωση Κατηγορίας',
        +    'use_default_eula'					=> 'Χρησιμοποιήστε την προεπιλεγμένη <a href="#" data-toggle="modal" data-target="#eulaModal">primary EULA</a>.',
             'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
         
         );
        diff --git a/resources/lang/el/admin/categories/message.php b/resources/lang/el/admin/categories/message.php
        index 48cf5478e1..cb78c8ce7b 100644
        --- a/resources/lang/el/admin/categories/message.php
        +++ b/resources/lang/el/admin/categories/message.php
        @@ -2,24 +2,24 @@
         
         return array(
         
        -    'does_not_exist' => 'Category does not exist.',
        +    'does_not_exist' => 'Κατηγορία δεν υπάρχει.',
             'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
             'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
         
             'create' => array(
        -        'error'   => 'Category was not created, please try again.',
        -        'success' => 'Category created successfully.'
        +        'error'   => 'Η κατηγορία δεν δημιουργήθηκε, παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Η κατηγορία δημιουργήθηκε με επιτυχία.'
             ),
         
             'update' => array(
        -        'error'   => 'Category was not updated, please try again',
        -        'success' => 'Category updated successfully.'
        +        'error'   => 'Η κατηγορία δεν ενημερώθηκε, παρακαλώ δοκιμάστε ξανά',
        +        'success' => 'Η κατηγορία ενημερώθηκε με επιτυχία.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this category?',
        -        'error'   => 'There was an issue deleting the category. Please try again.',
        -        'success' => 'The category was deleted successfully.'
        +        'confirm'   => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την κατηγορία;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας αυτή την κατηγορία. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Η κατηγορία διαγράφηκε με επιτυχία.'
             )
         
         );
        diff --git a/resources/lang/el/admin/categories/table.php b/resources/lang/el/admin/categories/table.php
        index a3ee96ae7f..4fd0d2d2f8 100644
        --- a/resources/lang/el/admin/categories/table.php
        +++ b/resources/lang/el/admin/categories/table.php
        @@ -3,8 +3,8 @@
         return array(
         	'eula_text'      			=> 'EULA',
             'id'      					=> 'ID',
        -    'parent'   					=> 'Parent',
        -    'require_acceptance'      	=> 'Acceptance',
        -    'title'      				=> 'Asset Category Name',
        +    'parent'   					=> 'Γονικός',
        +    'require_acceptance'      	=> 'Αποδοχή',
        +    'title'      				=> 'Ονομασία Κατηγορίας Παγίων',
         
         );
        diff --git a/resources/lang/el/admin/companies/general.php b/resources/lang/el/admin/companies/general.php
        index 9a47968977..9bf6ee1cf8 100644
        --- a/resources/lang/el/admin/companies/general.php
        +++ b/resources/lang/el/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        +    'about_companies_title'            => 'Σχετικά με τις εταιρείες',
             'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        -    'select_company' => 'Select Company',
        +    'select_company' => 'Επιλογή εταιρείας',
         ];
        diff --git a/resources/lang/el/admin/companies/message.php b/resources/lang/el/admin/companies/message.php
        index a6db573519..11784b74a9 100644
        --- a/resources/lang/el/admin/companies/message.php
        +++ b/resources/lang/el/admin/companies/message.php
        @@ -1,18 +1,18 @@
         <?php
         return array(
        -    'does_not_exist' => 'Company does not exist.',
        +    'does_not_exist' => 'Αυτή η εταιρεία δεν υπάρχει.',
             'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
             'create' => array(
        -        'error'   => 'Company was not created, please try again.',
        -        'success' => 'Company created successfully.'
        +        'error'   => 'Η εταιρεία δεν δημιουργήθηκε, παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Η εταιρεία δημιουργήθηκε με επιτυχία.'
             ),
             'update' => array(
                 'error'   => 'Company was not updated, please try again',
                 'success' => 'Company updated successfully.'
             ),
             'delete' => array(
        -        'confirm' => 'Are you sure you wish to delete this company?',
        -        'error'   => 'There was an issue deleting the company. Please try again.',
        -        'success' => 'The Company was deleted successfully.'
        +        'confirm' => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εταιρεία;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας την εταιρεία. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Η εταιρεία έχει διαγραφεί με επιτυχία.'
             )
         );
        diff --git a/resources/lang/el/admin/companies/table.php b/resources/lang/el/admin/companies/table.php
        index 2f86126ff2..96a21de680 100644
        --- a/resources/lang/el/admin/companies/table.php
        +++ b/resources/lang/el/admin/companies/table.php
        @@ -1,9 +1,9 @@
         <?php
         return array(
        -    'companies' => 'Companies',
        -    'create'    => 'Create Company',
        -    'title'     => 'Company',
        -    'update'    => 'Update Company',
        -    'name'      => 'Company Name',
        +    'companies' => 'Εταιρείες',
        +    'create'    => 'Δημιουργία Εταιρείας',
        +    'title'     => 'Εταιρεία',
        +    'update'    => 'Αναβάθμιση Εταιρείας',
        +    'name'      => 'Επωνυμία εταιρείας',
             'id'        => 'ID',
         );
        diff --git a/resources/lang/el/admin/components/general.php b/resources/lang/el/admin/components/general.php
        index 75c9d250ab..0f4eb7074d 100644
        --- a/resources/lang/el/admin/components/general.php
        +++ b/resources/lang/el/admin/components/general.php
        @@ -1,17 +1,17 @@
         <?php
         
         return array(
        -    'about_components_title' 			=> 'About Components',
        +    'about_components_title' 			=> 'Σχετικά με τα στοιχεία',
             'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        -    'component_name'                  => 'Component Name',
        +    'component_name'                  => 'Όνομα στοιχείου',
             'checkin'                             => 'Checkin Component',
             'checkout'                             => 'Checkout Component',
        -    'cost'				=> 'Purchase Cost',
        -    'create'                             => 'Create Component',
        -    'edit'                             => 'Edit Component',
        -    'date'					=> 'Purchase Date',
        -    'order'					=> 'Order Number',
        -    'remaining' 			             => 'Remaining',
        -    'total' 			                 => 'Total',
        -    'update'                            => 'Update Component',
        +    'cost'				=> 'Κόστος αγοράς',
        +    'create'                             => 'Δημιουργία στοιχείου',
        +    'edit'                             => 'Επεξεργασία εξαρτήματος',
        +    'date'					=> 'Ημερομηνία αγοράς',
        +    'order'					=> 'Αριθμός παραγγελίας',
        +    'remaining' 			             => 'Απομένουν',
        +    'total' 			                 => 'Σύνολο',
        +    'update'                            => 'Αναβάθμιση εξαρτήματος',
         );
        diff --git a/resources/lang/el/admin/components/message.php b/resources/lang/el/admin/components/message.php
        index 1d13970f23..8073678dab 100644
        --- a/resources/lang/el/admin/components/message.php
        +++ b/resources/lang/el/admin/components/message.php
        @@ -2,28 +2,28 @@
         
         return array(
         
        -    'does_not_exist' => 'Component does not exist.',
        +    'does_not_exist' => 'Το στοιχείο δεν υπάρχει.',
         
             'create' => array(
                 'error'   => 'Component was not created, please try again.',
        -        'success' => 'Component created successfully.'
        +        'success' => 'Το στοιχείο ενημερώθηκε με επιτυχία.'
             ),
         
             'update' => array(
        -        'error'   => 'Component was not updated, please try again',
        -        'success' => 'Component updated successfully.'
        +        'error'   => 'Το στοιχείο δεν ενημερώθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' => 'Το στοιχείο ενημερώθηκε με επιτυχία.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this component?',
        +        'confirm'   => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το εξάρτημα;',
                 'error'   => 'There was an issue deleting the component. Please try again.',
        -        'success' => 'The component was deleted successfully.'
        +        'success' => 'Το εξάρτημα έχει διαγραφεί με επιτυχία.'
             ),
         
              'checkout' => array(
                 'error'   		=> 'Component was not checked out, please try again',
                 'success' 		=> 'Component checked out successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'user_does_not_exist' => 'Αυτός ο χρήστης δεν είναι έγκυρος. Παρακαλώ δοκιμάστε ξανά.'
             ),
         
             'checkin' => array(
        diff --git a/resources/lang/el/admin/components/table.php b/resources/lang/el/admin/components/table.php
        index 3d4fed6a7f..b52fa562b0 100644
        --- a/resources/lang/el/admin/components/table.php
        +++ b/resources/lang/el/admin/components/table.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'title'      				=> 'Component Name',
        +    'title'      				=> 'Όνομα στοιχείου',
         );
        diff --git a/resources/lang/el/admin/consumables/general.php b/resources/lang/el/admin/consumables/general.php
        index 53a69f8c03..a18e8f3aee 100644
        --- a/resources/lang/el/admin/consumables/general.php
        +++ b/resources/lang/el/admin/consumables/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_consumables_title' 			=> 'About Consumables',
        +    'about_consumables_title' 			=> 'Σχετικά με τα αναλώσιμα',
             'about_consumables_text'  			=> 'Consumables are anything purchased that will be used up over time. For example, printer ink or copier paper.',
             'checkout'                          => 'Checkout Consumable to User',
        -    'consumable_name'                   => 'Consumable Name',
        -    'create'                            => 'Create Consumable',
        -    'item_no'                           => 'Item No.',
        -    'remaining' 			            => 'Remaining',
        -    'total' 			                => 'Total',
        +    'consumable_name'                   => 'Όνομα αναλώσιμου',
        +    'create'                            => 'Δημιουργία αναλώσιμου',
        +    'item_no'                           => 'Αριθμός Αντικειμένου.',
        +    'remaining' 			            => 'Απομένουν',
        +    'total' 			                => 'Σύνολο',
             'update'                            => 'Update Consumable',
         );
        diff --git a/resources/lang/el/admin/consumables/message.php b/resources/lang/el/admin/consumables/message.php
        index 48a3cfbd9f..3d5d44d97e 100644
        --- a/resources/lang/el/admin/consumables/message.php
        +++ b/resources/lang/el/admin/consumables/message.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'does_not_exist' => 'Consumable does not exist.',
        +    'does_not_exist' => 'Το αναλώσιμο δεν υπάρχει.',
         
             'create' => array(
                 'error'   => 'Consumable was not created, please try again.',
        @@ -11,19 +11,19 @@ return array(
         
             'update' => array(
                 'error'   => 'Consumable was not updated, please try again',
        -        'success' => 'Consumable updated successfully.'
        +        'success' => 'Το αναλώσιμο ενημερώθηκε με επιτυχία.'
             ),
         
             'delete' => array(
                 'confirm'   => 'Are you sure you wish to delete this consumable?',
                 'error'   => 'There was an issue deleting the consumable. Please try again.',
        -        'success' => 'The consumable was deleted successfully.'
        +        'success' => 'Το αναλώσιμο έχει διαγραφεί με επιτυχία.'
             ),
         
              'checkout' => array(
                 'error'   		=> 'Consumable was not checked out, please try again',
                 'success' 		=> 'Consumable checked out successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'user_does_not_exist' => 'Αυτός ο χρήστης δεν είναι έγκυρος. Παρακαλώ δοκιμάστε ξανά.'
             ),
         
             'checkin' => array(
        diff --git a/resources/lang/el/admin/consumables/table.php b/resources/lang/el/admin/consumables/table.php
        index bb76721f17..e77fca2774 100644
        --- a/resources/lang/el/admin/consumables/table.php
        +++ b/resources/lang/el/admin/consumables/table.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'title'      				=> 'Consumable Name',
        +    'title'      				=> 'Όνομα αναλώσιμου',
         );
        diff --git a/resources/lang/el/admin/custom_fields/general.php b/resources/lang/el/admin/custom_fields/general.php
        index f2e6df90cb..dee53ec8ae 100644
        --- a/resources/lang/el/admin/custom_fields/general.php
        +++ b/resources/lang/el/admin/custom_fields/general.php
        @@ -1,30 +1,30 @@
         <?php
         
         return array(
        -    'custom_fields'		        => 'Custom Fields',
        -    'field'		                => 'Field',
        -    'about_fieldsets_title'		=> 'About Fieldsets',
        +    'custom_fields'		        => 'Προσαρμοσμένα πεδία',
        +    'field'		                => 'Πεδίο',
        +    'about_fieldsets_title'		=> 'Σχετικά με τα σύνολα πεδίων',
             'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        -    'custom_format'             => 'Custom format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        -    'encrypted'      	        => 'Encrypted',
        -    'fieldset'      	        => 'Fieldset',
        -    'qty_fields'      	      => 'Qty Fields',
        -    'fieldsets'      	        => 'Fieldsets',
        -    'fieldset_name'           => 'Fieldset Name',
        -    'field_name'              => 'Field Name',
        +    'custom_format'             => 'Προσαρμοσμένη μορφή...',
        +    'encrypt_field'      	        => 'Κρυπτογράφηση της αξίας του πεδίου στη βάση δεδομένων',
        +    'encrypt_field_help'      => 'Προειδοποίηση: H κρυπτογράφηση ενός πεδίου την καθιστά ανεξερεύνητη.',
        +    'encrypted'      	        => 'Κρυπτογραφημένο',
        +    'fieldset'      	        => 'Σύνολο πεδίων',
        +    'qty_fields'      	      => 'Πεδία Ποσ',
        +    'fieldsets'      	        => 'Σύνολο πεδίων',
        +    'fieldset_name'           => 'Ονομασία Συνόλου Πεδίων',
        +    'field_name'              => 'Όνομα πεδίου',
             'field_values'            => 'Field Values',
             'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        -    'field_element'           => 'Form Element',
        -    'field_element_short'     => 'Element',
        -    'field_format'            => 'Format',
        -    'field_custom_format'     => 'Custom Format',
        -    'required'   		          => 'Required',
        +    'field_element'           => 'Φόρμα στοιχείων',
        +    'field_element_short'     => 'Στοιχείο',
        +    'field_format'            => 'Τύπος',
        +    'field_custom_format'     => 'Προσαρμοσμένος τύπος',
        +    'required'   		          => 'Απαιτείται',
             'req'   		              => 'Req.',
        -    'used_by_models'   		    => 'Used By Models',
        -    'order'   		            => 'Order',
        -    'create_fieldset'         => 'New Fieldset',
        +    'used_by_models'   		    => 'Χρησιμοποιήθηκε από τα μοντέλα',
        +    'order'   		            => 'Σειρά',
        +    'create_fieldset'         => 'Νέο σύνολο πεδίων',
             'create_field'            => 'New Custom Field',
             'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
         );
        diff --git a/resources/lang/el/admin/custom_fields/message.php b/resources/lang/el/admin/custom_fields/message.php
        index 0d34afa9e8..7fdd74f306 100644
        --- a/resources/lang/el/admin/custom_fields/message.php
        +++ b/resources/lang/el/admin/custom_fields/message.php
        @@ -3,48 +3,48 @@
         return array(
         
             'field' => array(
        -        'invalid'   => 'That field does not exist.',
        -        'already_added'   => 'Field already added',
        +        'invalid'   => 'Αυτό το πεδίο δεν υπάρχει.',
        +        'already_added'   => 'Το πεδίο έχει ήδη προσθέσει',
         
                 'create' => array(
        -            'error'   => 'Field was not created, please try again.',
        -            'success' => 'Field created successfully.',
        +            'error'   => 'Το πεδία δεν δημιουργήθηκαν, παρακαλώ προσπαθήστε ξανά.',
        +            'success' => 'Το πεδίο δημιουργήθηκε με επιτυχία.',
                     'assoc_success' => 'Field successfully added to fieldset.'
                 ),
         
                 'update' => array(
                     'error'   => 'Field was not updated, please try again',
        -            'success' => 'Field updated successfully.'
        +            'success' => 'Το πεδίο ενημερώθηκε επιτυχώς.'
                 ),
         
                 'delete' => array(
        -            'confirm'   	=> 'Are you sure you wish to delete this field?',
        +            'confirm'   	=> 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το πεδίο;',
                     'error'   => 'There was an issue deleting the field. Please try again.',
                     'success' => 'The field was deleted successfully.',
        -            'in_use'   => 'Field is still in use.',
        +            'in_use'   => 'Το πεδίο παραμένει σε χρήση.',
                 )
         
             ),
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        -            'success' => 'Fieldset created successfully.'
        +            'success' => 'Το σύνολο των πεδίων δημιουργήθηκε με επιτυχία.'
                 ),
         
                 'update' => array(
                     'error'   => 'Fieldset was not updated, please try again',
        -            'success' => 'Fieldset updated successfully.'
        +            'success' => 'Το σύνολο των πεδίων ενημερώθηκε με επιτυχία.'
                 ),
         
                 'delete' => array(
        -            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        +            'confirm'   	=> 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το σύνολο πεδίων;',
                     'error'   => 'There was an issue deleting the fieldset. Please try again.',
                     'success' => 'The fieldset was deleted successfully.',
        -            'in_use'   => 'Fieldset is still in use.',
        +            'in_use'   => 'Το σύνολο των πεδίων παραμένουν σε χρήση.',
                 )
         
             ),
        diff --git a/resources/lang/el/admin/departments/message.php b/resources/lang/el/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/el/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/el/admin/departments/table.php b/resources/lang/el/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/el/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/el/admin/depreciations/general.php b/resources/lang/el/admin/depreciations/general.php
        index 1fca0e2cb7..34b9b6fe8f 100644
        --- a/resources/lang/el/admin/depreciations/general.php
        +++ b/resources/lang/el/admin/depreciations/general.php
        @@ -1,12 +1,12 @@
         <?php
         
         return array(
        -    'about_asset_depreciations'  			=> 'About Asset Depreciations',
        -    'about_depreciations'  					=> 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
        +    'about_asset_depreciations'  			=> 'Για αποσβέσεις παγίου',
        +    'about_depreciations'  					=> 'Μπορείτε να ορίσετε αποσβέσεις του περιουσιακού στοιχείου προκειμένου να γίνει απόσβεση περιουσιακών στοιχείων βάσει σταθερής απόσβεσης.',
             'asset_depreciations'  					=> 'Asset Depreciations',
        -    'create'  					            => 'Create Depreciation',
        -    'depreciation_name'  					=> 'Depreciation Name',
        -    'number_of_months'  					=> 'Number of Months',
        -    'update'  					            => 'Update Depreciation',
        +    'create'  					            => 'Δημιουργία αποσβέσεων',
        +    'depreciation_name'  					=> 'Όνομα απόσβεσης',
        +    'number_of_months'  					=> 'Αριθμός των μηνών',
        +    'update'  					            => 'Ενημέρωση αποσβέσεων',
         
         );
        diff --git a/resources/lang/el/admin/depreciations/message.php b/resources/lang/el/admin/depreciations/message.php
        index c20e52c13c..c9ad6308f0 100644
        --- a/resources/lang/el/admin/depreciations/message.php
        +++ b/resources/lang/el/admin/depreciations/message.php
        @@ -2,8 +2,8 @@
         
         return array(
         
        -    'does_not_exist' => 'Depreciation class does not exist.',
        -    'assoc_users'	 => 'This depreciation is currently associated with one or more models and cannot be deleted. Please delete the models, and then try deleting again. ',
        +    'does_not_exist' => 'Αποσβέσεις κλάση δεν υπάρχει.',
        +    'assoc_users'	 => 'Αυτή η απόσβεση είναι επί του παρόντος σχετίζεται με ένα ή περισσότερα μοντέλα και δεν μπορεί να διαγραφεί. Παρακαλώ διαγράψτε τα μοντέλα, και, στη συνέχεια, προσπαθήστε να διαγράψετε ξανά. ',
         
         
             'create' => array(
        @@ -17,9 +17,9 @@ return array(
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this depreciation class?',
        -        'error'   => 'There was an issue deleting the depreciation class. Please try again.',
        -        'success' => 'The depreciation class was deleted successfully.'
        +        'confirm'   => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την κατηγορία απόσβεσης;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας την τάξη αποσβέσεων. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Η τάξη αποσβέσεων διαγράφηκε με επιτυχία.'
             )
         
         );
        diff --git a/resources/lang/el/admin/depreciations/table.php b/resources/lang/el/admin/depreciations/table.php
        index 5ba01d132c..680359f80d 100644
        --- a/resources/lang/el/admin/depreciations/table.php
        +++ b/resources/lang/el/admin/depreciations/table.php
        @@ -3,8 +3,8 @@
         return array(
         
             'id'      => 'ID',
        -    'months'   => 'Months',
        -    'term'   => 'Term',
        -    'title'      => 'Name ',
        +    'months'   => 'Μήνες',
        +    'term'   => 'Όρος',
        +    'title'      => 'Όνομα ',
         
         );
        diff --git a/resources/lang/el/admin/groups/message.php b/resources/lang/el/admin/groups/message.php
        index f14b6339e8..0baa3f3e0a 100644
        --- a/resources/lang/el/admin/groups/message.php
        +++ b/resources/lang/el/admin/groups/message.php
        @@ -2,21 +2,21 @@
         
         return array(
         
        -    'group_exists'        => 'Group already exists!',
        -    'group_not_found'     => 'Group [:id] does not exist.',
        -    'group_name_required' => 'The name field is required',
        +    'group_exists'        => 'Η ομάδα υπάρχει ήδη!',
        +    'group_not_found'     => 'Ομάδα [: Αναγνωριστικό] δεν υπάρχει.',
        +    'group_name_required' => 'Το όνομα του πεδίου είναι απαραίτητο',
         
             'success' => array(
        -        'create' => 'Group was successfully created.',
        -        'update' => 'Group was successfully updated.',
        -        'delete' => 'Group was successfully deleted.',
        +        'create' => 'Η ομάδα δημιουργήθηκε με επιτυχία.',
        +        'update' => 'Ομάδα ενημερώθηκε με επιτυχία.',
        +        'delete' => 'Η ομάδα διαγράφηκε επιτυχώς.',
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this group?',
        -        'create' => 'There was an issue creating the group. Please try again.',
        -        'update' => 'There was an issue updating the group. Please try again.',
        -        'delete' => 'There was an issue deleting the group. Please try again.',
        +        'confirm'   => 'Είστε σίγουροι ότι επιθυμείτε την διαγραφή της ομάδας;',
        +        'create' => 'Υπήρξε ένα ζήτημα διαγράφοντας την ομάδα. Παρακαλώ δοκιμάστε ξανά.',
        +        'update' => 'Υπήρξε ένα ζήτημα ενημερώνοντας την ομάδα. Παρακαλώ δοκιμάστε ξανά.',
        +        'delete' => 'Υπήρξε ένα ζήτημα διαγράφοντας την ομάδα. Παρακαλώ δοκιμάστε ξανά.',
             ),
         
         );
        diff --git a/resources/lang/el/admin/groups/table.php b/resources/lang/el/admin/groups/table.php
        index 61f060a116..dda91c4d14 100644
        --- a/resources/lang/el/admin/groups/table.php
        +++ b/resources/lang/el/admin/groups/table.php
        @@ -3,7 +3,7 @@
         return array(
         
             'id'         => 'Id',
        -    'name'       => 'Name',
        -    'users'      => '# of Users',
        +    'name'       => 'Όνομα',
        +    'users'      => '# των χρηστών',
         
         );
        diff --git a/resources/lang/el/admin/groups/titles.php b/resources/lang/el/admin/groups/titles.php
        index 99e8cc1f6f..557d7ffa85 100644
        --- a/resources/lang/el/admin/groups/titles.php
        +++ b/resources/lang/el/admin/groups/titles.php
        @@ -1,14 +1,14 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        -    'group_management' 	 	=> 'Group Management',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        -    'group_name' 	 		=> 'Group Name',
        -    'group_admin' 	 		=> 'Group Admin',
        -    'allow' 	 			=> 'Allow',
        -    'deny' 	 				=> 'Deny',
        +    'about_groups_title'            => 'Σχετικά με τις ομάδες',
        +    'about_groups'                  => 'Οι ομάδες χρησιμοποιούνται για να γενικεύσουν τα δικαιώματα του χρήστη.',
        +    'group_management' 	 	=> 'Διαχείριση ομάδων',
        +    'create' 	 	 	    => 'Δημιουργία Νέας Ομάδας',
        +    'update' 	 		        => 'Επεξεργασία Ομάδας',
        +    'group_name' 	 		=> 'Όνομα ομάδας',
        +    'group_admin' 	 		=> 'Διαχειριστής ομάδας',
        +    'allow' 	 			=> 'Να επιτραπεί',
        +    'deny' 	 				=> 'Άρνηση',
         
         );
        diff --git a/resources/lang/el/admin/hardware/form.php b/resources/lang/el/admin/hardware/form.php
        index abded281fa..c87bad2347 100644
        --- a/resources/lang/el/admin/hardware/form.php
        +++ b/resources/lang/el/admin/hardware/form.php
        @@ -1,42 +1,42 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        -  'bulk_delete_help'	=> 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
        -  'bulk_delete_warn'	=> 'You are about to delete :asset_count assets.',
        -	'bulk_update'		=> 'Bulk Update Assets',
        -	'bulk_update_help'	=> 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
        -	'bulk_update_warn'	=> 'You are about to edit the properties of :asset_count assets.',
        -    'checkedout_to'		=> 'Checked Out To',
        -    'checkout_date'		=> 'Checkout Date',
        -    'checkin_date'		=> 'Checkin Date',
        -    'checkout_to'		=> 'Checkout to',
        -    'cost'				=> 'Purchase Cost',
        -    'create'			=> 'Create Asset',
        -    'date'				=> 'Purchase Date',
        -    'depreciates_on'	=> 'Depreciates On',
        -    'default_location'	=> 'Default Location',
        -    'eol_date'			=> 'EOL Date',
        -    'eol_rate'			=> 'EOL Rate',
        -    'expected_checkin'  => 'Expected Checkin Date',
        -    'expires'			=> 'Expires',
        -    'fully_depreciated'	=> 'Fully Depreciated',
        -    'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
        -    'mac_address'		=> 'MAC Address',
        -    'manufacturer'		=> 'Manufacturer',
        -    'model'				=> 'Model',
        -    'months'			=> 'months',
        -    'name'				=> 'Asset Name',
        -    'notes'				=> 'Notes',
        -    'order'				=> 'Order Number',
        -    'qr'				=> 'QR Code',
        -    'requestable'		=> 'Users may request this asset',
        -    'select_statustype'	=> 'Select Status Type',
        -    'serial'			=> 'Serial',
        -    'status'			=> 'Status',
        -    'tag'				=> 'Asset Tag',
        -    'update'			=> 'Asset Update',
        -    'warranty'			=> 'Warranty',
        -    'years'				=> 'years',
        +	'bulk_delete'		=> 'Επιβεβαιώστε μαζική διαγραφή περιουσιακών στοιχείων',
        +  'bulk_delete_help'	=> 'Εξετάστε τα περιουσιακά στοιχεία για μαζική διαγραφή παρακάτω. Μόλις διαγραφεί, αυτά τα περιουσιακά στοιχεία μπορούν να αποκατασταθούν, αλλά αυτά δεν θα είναι πλέον συσχετιζόμενα με οποιοσδήποτε χρήστη που τους έχει ανατεθεί.',
        +  'bulk_delete_warn'	=> 'Πρόκειται να διαγράψετε: asset_count περιουσιακών στοιχείων.',
        +	'bulk_update'		=> 'Μαζική ενημέρωση παγίων',
        +	'bulk_update_help'	=> 'Αυτή η φόρμα επιτρέπει την ενημέρωση πολλαπλών παγίων ταυτόχρονα. Μόνο συμπληρώστε τα πεδία που θέλετε να αλλάξετε. Οποιαδήποτε πεδίο αριστερά μείνει κενό θα παραμείνει ως αμετάβλητο. ',
        +	'bulk_update_warn'	=> 'Είστε έτοιμοι να επεξεργαστείτε τις ιδιότητες του: asset_count περιουσιακών στοιχείων.',
        +    'checkedout_to'		=> 'Ανάθεση σε',
        +    'checkout_date'		=> 'Ημερομηνία αποχώρησης',
        +    'checkin_date'		=> 'Ημερομηνία άφιξης',
        +    'checkout_to'		=> 'Ημερομηνία αποχώρησης σε',
        +    'cost'				=> 'Κόστος αγοράς',
        +    'create'			=> 'Δημιουργία παγίου',
        +    'date'				=> 'Ημερομηνία αγοράς',
        +    'depreciates_on'	=> 'Αποσβέσεις σε',
        +    'default_location'	=> 'Προεπιλεγμένη τοποθεσία',
        +    'eol_date'			=> 'EOL ημερομηνία',
        +    'eol_rate'			=> 'EOL δείκτης',
        +    'expected_checkin'  => 'Αναμενώμενη ημέρα άφιξης',
        +    'expires'			=> 'Λήξη',
        +    'fully_depreciated'	=> 'Έχει πλήρως αποσβεστεί',
        +    'help_checkout'		=> 'Αν θέλετε να εκχωρήσετε αυτό το πάγιο αμέσως, επιλέξτε «Έτοιμοι να αναπτύξετε» από την παρακάτω λίστα. ',
        +    'mac_address'		=> 'Διεύθυνση MAC',
        +    'manufacturer'		=> 'Κατασκευαστής',
        +    'model'				=> 'Μοντέλο',
        +    'months'			=> 'μήνες',
        +    'name'				=> 'Ονομασία του παγίου',
        +    'notes'				=> 'Σημειώσεις',
        +    'order'				=> 'Αριθμός παραγγελίας',
        +    'qr'				=> 'Κωδικός QR',
        +    'requestable'		=> 'Οι χρήστες μπορούν να αιτηθούν το πάγιο',
        +    'select_statustype'	=> 'Επιλέξτε Τύπο Κατάστασης',
        +    'serial'			=> 'Σειριακός',
        +    'status'			=> 'Κατάσταση',
        +    'tag'				=> 'Ετικέτα πόρων',
        +    'update'			=> 'Ενημέρωση παγίου',
        +    'warranty'			=> 'Εγγύηση',
        +    'years'				=> 'έτη',
         )
         ;
        diff --git a/resources/lang/el/admin/hardware/general.php b/resources/lang/el/admin/hardware/general.php
        index f7644eb730..9e0e761939 100644
        --- a/resources/lang/el/admin/hardware/general.php
        +++ b/resources/lang/el/admin/hardware/general.php
        @@ -1,23 +1,23 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        +    'about_assets_title'           => 'Σχετικά με τα πάγια',
             'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        -	'archived'  				=> 'Archived',
        -    'asset'  					=> 'Asset',
        -    'bulk_checkout'             => 'Checkout Assets to User',
        +	'archived'  				=> 'Αρχειοθετημένα',
        +    'asset'  					=> 'Πάγιο',
        +    'bulk_checkout'             => 'Checkout παγίων σε χρήστη',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        -    'clone'  					=> 'Clone Asset',
        -    'deployable'  				=> 'Deployable',
        +    'checkout'  				=> 'Checkout Asset',
        +    'clone'  					=> 'Κλώνος χρήστη',
        +    'deployable'  				=> 'Προς ανάπτυξη',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        -    'edit'  					=> 'Edit Asset',
        +    'edit'  					=> 'Επεξεργασία παγίων',
         	'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'model_deleted'  			=> 'This Assets model has been deleted. You must restore the model before you can restore the Asset.<br/> <a href="/hardware/models/:model_id/restore">Click here to restore the model</a>.',
             'requestable'               => 'Requestable',
        -    'requested'				    => 'Requested',
        -    'restore'  					=> 'Restore Asset',
        -    'pending'  					=> 'Pending',
        +    'requested'				    => 'Ζητήθηκαν',
        +    'restore'  					=> 'Επαναφορά παγίου',
        +    'pending'  					=> 'Εκκρεμεί',
             'undeployable'  			=> 'Undeployable',
        -    'view'  					=> 'View Asset',
        +    'view'  					=> 'Προβολή παγίου',
         );
        diff --git a/resources/lang/el/admin/hardware/message.php b/resources/lang/el/admin/hardware/message.php
        index d27ca91573..68a8d71330 100644
        --- a/resources/lang/el/admin/hardware/message.php
        +++ b/resources/lang/el/admin/hardware/message.php
        @@ -2,37 +2,43 @@
         
         return array(
         
        -    'undeployable' 		=> '<strong>Warning: </strong> This asset has been marked as currently undeployable.
        -                        If this status has changed, please update the asset status.',
        -    'does_not_exist' 	=> 'Asset does not exist.',
        +    'undeployable' 		=> '<strong>Warning: </strong> Το περιουσιακό αυτό στοιχείο έχει επισημανθεί ως επί του παρόντος undeployable.
        +                        Εάν αυτή η κατάσταση έχει αλλάξει, παρακαλούμε να ενημερώσετε την κατάσταση των περιουσιακών στοιχείων.',
        +    'does_not_exist' 	=> 'To πάγιο δεν υπάρχει.',
             'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
             'assoc_users'	 	=> 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
         
             'create' => array(
        -        'error'   		=> 'Asset was not created, please try again. :(',
        -        'success' 		=> 'Asset created successfully. :)'
        +        'error'   		=> 'Το περιουσιακού στοιχείο δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά. :(',
        +        'success' 		=> 'Το πάγιο δημιουργήθηκε επιτυχώς'
             ),
         
             'update' => array(
        -        'error'   			=> 'Asset was not updated, please try again',
        -        'success' 			=> 'Asset updated successfully.',
        +        'error'   			=> 'Το πάγιο δεν ενημερώθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' 			=> 'Τα περιουσιακά στοιχεία ενημερώθηκαν επιτυχώς.',
                 'nothing_updated'	=>  'No fields were selected, so nothing was updated.',
             ),
         
             'restore' => array(
                 'error'   		=> 'Asset was not restored, please try again',
        -        'success' 		=> 'Asset restored successfully.'
        +        'success' 		=> 'Τα πάγια επαναφέρθηκαν επιτυχώς.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
        -        'error'   => 'File not deleted. Please try again.',
        -        'success' => 'File successfully deleted.',
        +        'error'   => 'Το αρχείο δεν έχει διαγραφεί. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Το αρχείο διαγράφηκε με επιτυχία.',
             ),
         
             'upload' => array(
        -        'error'   => 'File(s) not uploaded. Please try again.',
        -        'success' => 'File(s) successfully uploaded.',
        -        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'error'   => 'Τα αρχεία δεν μεταφορτώθηκαν. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Τα αρχεία ενημερώθηκαν με επιτυχία.',
        +        'nofiles' => 'Δεν έχετε επιλέξει οποιαδήποτε αρχείο για μεταφόρτωση ή το αρχείο που προσπαθείτε να φορτώσετε είναι πάρα πολύ μεγάλο',
                 'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
             ),
         
        @@ -46,29 +52,30 @@ return array(
         
         
             'delete' => array(
        -        'confirm'   	=> 'Are you sure you wish to delete this asset?',
        +        'confirm'   	=> 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το πάγιο;',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        -        'success' 		=> 'The asset was deleted successfully.'
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
        +        'success' 		=> 'Το πάγιο διαγράφηκε με επιτυχία.'
             ),
         
             'checkout' => array(
                 'error'   		=> 'Asset was not checked out, please try again',
                 'success' 		=> 'Asset checked out successfully.',
                 'user_does_not_exist' => 'That user is invalid. Please try again.',
        -        'not_available' => 'That asset is not available for checkout!'
        +        'not_available' => 'Αυτό το πάγιο δεν είναι διαθέσιμο για την ολοκλήρωση της παραγγελίας!'
             ),
         
             'checkin' => array(
                 'error'   		=> 'Asset was not checked in, please try again',
                 'success' 		=> 'Asset checked in successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'user_does_not_exist' => 'Αυτός ο χρήστης δεν υπάρχει. Παρακαλώ δοκιμάστε ξανά.',
                 'already_checked_in'  => 'That asset is already checked in.',
         
             ),
         
             'requests' => array(
                 'error'   		=> 'Asset was not requested, please try again',
        -        'success' 		=> 'Asset requested successfully.',
        +        'success' 		=> 'Τα πάγια ενημερώθηκαν επιτυχώς.',
                 'canceled'      => 'Checkout request successfully canceled'
             )
         
        diff --git a/resources/lang/el/admin/hardware/table.php b/resources/lang/el/admin/hardware/table.php
        index e8baa09d5a..d58f0131fa 100644
        --- a/resources/lang/el/admin/hardware/table.php
        +++ b/resources/lang/el/admin/hardware/table.php
        @@ -2,23 +2,23 @@
         
         return array(
         
        -    'asset_tag'   	=> 'Asset Tag',
        -    'asset_model'       => 'Model',
        -    'book_value'  	=> 'Value',
        -    'change' 		=> 'In/Out',
        -    'checkout_date' => 'Checkout Date',
        +    'asset_tag'   	=> 'Ετικέτα πόρων',
        +    'asset_model'       => 'Μοντέλο',
        +    'book_value'  	=> 'Τιμή',
        +    'change' 		=> 'Εισερχόμενα/Εξερχόμενα',
        +    'checkout_date' => 'Ημερομηνία αποχώρησης',
             'checkoutto' 	=> 'Checked Out',
             'diff' 			=> 'Diff',
        -    'dl_csv' 		=> 'Download CSV',
        +    'dl_csv' 		=> 'Κατεβάστε το CSV',
             'eol' 			=> 'EOL',
             'id'      		=> 'ID',
        -    'location' 		=> 'Location',
        -    'purchase_cost'	=> 'Cost',
        -    'purchase_date'	=> 'Purchased',
        -    'serial'   		=> 'Serial',
        -    'status'   		=> 'Status',
        -    'title'      	=> 'Asset ',
        -    'image'		=> 'Device Image',
        -    'days_without_acceptance' => 'Days Without Acceptance'
        +    'location' 		=> 'Τοποθεσία',
        +    'purchase_cost'	=> 'Κόστος',
        +    'purchase_date'	=> 'Αγοράστηκε',
        +    'serial'   		=> 'Σειριακός',
        +    'status'   		=> 'Κατάσταση',
        +    'title'      	=> 'Πάγιο ',
        +    'image'		=> 'Φωτογραφία συσκευής',
        +    'days_without_acceptance' => 'Ημέρες χωρίς αποδοχή'
         
         );
        diff --git a/resources/lang/el/admin/licenses/form.php b/resources/lang/el/admin/licenses/form.php
        index ce29167874..682965f2fa 100644
        --- a/resources/lang/el/admin/licenses/form.php
        +++ b/resources/lang/el/admin/licenses/form.php
        @@ -2,21 +2,21 @@
         
         return array(
         
        -    'asset'             => 'Asset',
        -    'checkin'           => 'Checkin',
        -    'create'            => 'Create License',
        -    'expiration'        => 'Expiration Date',
        -    'license_key'       => 'Product Key',
        -    'maintained'        => 'Maintained',
        -    'name'              => 'Software Name',
        +    'asset'             => 'Πάγιο',
        +    'checkin'           => 'Μεταβίβαση ελέγχου',
        +    'create'            => 'Ενημέρωση άδειας',
        +    'expiration'        => 'Ημερομηνία Λήξης',
        +    'license_key'       => 'Κλειδί προϊόντος',
        +    'maintained'        => 'Συντηρείται',
        +    'name'              => 'Όνομα προγράμματος',
             'no_depreciation'   => 'Do Not Depreciate',
             'purchase_order'    => 'Purchase Order Number',
             'reassignable'      => 'Reassignable',
             'remaining_seats'   => 'Remaining Seats',
             'seats'             => 'Seats',
        -    'termination_date'  => 'Termination Date',
        +    'termination_date'  => 'Ημερομηνία λήξης',
             'to_email'          => 'Licensed to Email',
             'to_name'           => 'Licensed to Name',
        -    'update'            => 'Update License',
        +    'update'            => 'Ενημέρωση άδειας',
             'checkout_help'     => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
         );
        diff --git a/resources/lang/el/admin/licenses/general.php b/resources/lang/el/admin/licenses/general.php
        index 25a536ec56..b414150b93 100644
        --- a/resources/lang/el/admin/licenses/general.php
        +++ b/resources/lang/el/admin/licenses/general.php
        @@ -1,21 +1,21 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses_title'            => 'Σχετικά με τις άδειες',
             'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
             'checkin'  					=> 'Checkin License Seat',
        -    'checkout_history'  		=> 'Checkout History',
        +    'checkout_history'  		=> 'Ιστορικό παραγγελίας',
             'checkout'  				=> 'Checkout License Seat',
        -    'edit'  					=> 'Edit License',
        +    'edit'  					=> 'Επεξεργασία άδειας',
             'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        -    'clone'  					=> 'Clone License',
        -    'history_for'  				=> 'History for ',
        -    'in_out'  					=> 'In/Out',
        -    'info'  					=> 'License Info',
        +    'clone'  					=> 'Κλόνος άδειας',
        +    'history_for'  				=> 'Ιστορικό για ',
        +    'in_out'  					=> 'Εισερχόμενα/Εξερχόμενα',
        +    'info'  					=> 'Πληροφορίες άδειας',
             'license_seats'  			=> 'License Seats',
             'seat'  					=> 'Seat',
             'seats'  					=> 'Seats',
        -    'software_licenses'  		=> 'Software Licenses',
        -    'user'  					=> 'User',
        -    'view'  					=> 'View License',
        +    'software_licenses'  		=> 'Άδειες λογισμικού',
        +    'user'  					=> 'Χρήστης',
        +    'view'  					=> 'Προβολή άδειας',
         );
        diff --git a/resources/lang/el/admin/licenses/message.php b/resources/lang/el/admin/licenses/message.php
        index d5dbfe77b9..d20ee6180d 100644
        --- a/resources/lang/el/admin/licenses/message.php
        +++ b/resources/lang/el/admin/licenses/message.php
        @@ -2,39 +2,39 @@
         
         return array(
         
        -    'does_not_exist' => 'License does not exist.',
        -    'user_does_not_exist' => 'User does not exist.',
        -    'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
        +    'does_not_exist' => 'Δεν υπάρχει άδεια χρήσης.',
        +    'user_does_not_exist' => 'Ο χρήστης δεν υπάρχει.',
        +    'asset_does_not_exist' 	=> 'Το πάγιο που προσπαθείτε να συσχετίσετε με αυτήν την άδεια δεν υπάρχει.',
             'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
             'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
         
         
             'create' => array(
        -        'error'   => 'License was not created, please try again.',
        -        'success' => 'License created successfully.'
        +        'error'   => 'Η άδεια δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά.',
        +        'success' => 'Η άδεια δημιουργήθηκε με επιτυχία.'
             ),
         
             'deletefile' => array(
        -        'error'   => 'File not deleted. Please try again.',
        -        'success' => 'File successfully deleted.',
        +        'error'   => 'Ο φάκελος έχει διαγραφεί. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Το αρχείο διαγράφηκε με επιτυχία.',
             ),
         
             'upload' => array(
        -        'error'   => 'File(s) not uploaded. Please try again.',
        -        'success' => 'File(s) successfully uploaded.',
        +        'error'   => 'Τα αρχεία δεν μεταφορτώθηκαν. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Τα αρχεία ενημερώθηκαν με επιτυχία.',
                 'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
                 'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
             ),
         
             'update' => array(
        -        'error'   => 'License was not updated, please try again',
        -        'success' => 'License updated successfully.'
        +        'error'   => 'Η άδεια δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' => 'Η άδεια ενημερώθηκε με επιτυχία.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this license?',
        -        'error'   => 'There was an issue deleting the license. Please try again.',
        -        'success' => 'The license was deleted successfully.'
        +        'confirm'   => 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την άδεια;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας την άδεια. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Η άδεια διαγράφηκε επιτυχώς.'
             ),
         
             'checkout' => array(
        diff --git a/resources/lang/el/admin/licenses/table.php b/resources/lang/el/admin/licenses/table.php
        index dfce4136cb..aa9873c92e 100644
        --- a/resources/lang/el/admin/licenses/table.php
        +++ b/resources/lang/el/admin/licenses/table.php
        @@ -2,16 +2,16 @@
         
         return array(
         
        -    'assigned_to'   	=> 'Assigned To',
        +    'assigned_to'   	=> 'Ανατέθηκε στον',
             'checkout'   		=> 'In/Out',
             'id'      			=> 'ID',
        -    'license_email'   	=> 'License Email',
        -    'license_name'   	=> 'Licensed To',
        -    'purchase_date'   	=> 'Purchase Date',
        -    'purchased'   		=> 'Purchased',
        -    'seats'   			=> 'Seats',
        +    'license_email'   	=> 'Άδεια χρήσης ηλεκτρονικού ταχυδρομείου',
        +    'license_name'   	=> 'Την άδεια να',
        +    'purchase_date'   	=> 'Ημερομηνία αγοράς',
        +    'purchased'   		=> 'Αγοράστηκε',
        +    'seats'   			=> 'Θέσεις',
             'hardware'   		=> 'Hardware',
        -    'serial'   			=> 'Serial',
        -    'title'      		=> 'License',
        +    'serial'   			=> 'Σειριακός',
        +    'title'      		=> 'Άδεια Χρήσεως',
         
         );
        diff --git a/resources/lang/el/admin/locations/message.php b/resources/lang/el/admin/locations/message.php
        index 3ba1eed3b6..77e1863f1c 100644
        --- a/resources/lang/el/admin/locations/message.php
        +++ b/resources/lang/el/admin/locations/message.php
        @@ -2,26 +2,26 @@
         
         return array(
         
        -    'does_not_exist' => 'Location does not exist.',
        -    'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
        +    'does_not_exist' => 'Η τοποθεσία δεν υπάρχει.',
        +    'assoc_users'	 => 'Αυτή η θέση είναι επί του παρόντος σχετίζεται με τουλάχιστον ένα χρήστη και δεν μπορεί να διαγραφεί. Παρακαλούμε να ενημερώσετε τους χρήστες σας να μην αναφέρονται σε αυτήν τη θέση και δοκιμάστε ξανά. ',
             'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
             'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
         
         
             'create' => array(
        -        'error'   => 'Location was not created, please try again.',
        -        'success' => 'Location created successfully.'
        +        'error'   => 'Η τοποθεσία δεν έχει δημιουργηθεί, δοκιμάστε ξανά.',
        +        'success' => 'Η τοποθεσία δημιουργήθηκε με επιτυχία.'
             ),
         
             'update' => array(
        -        'error'   => 'Location was not updated, please try again',
        -        'success' => 'Location updated successfully.'
        +        'error'   => 'Η τοποθεσία δεν έχει δημιουργηθεί, δοκιμάστε ξανά',
        +        'success' => 'Η τοποθεσία αναβαθμίστηκε επιτυχώς.'
             ),
         
             'delete' => array(
        -        'confirm'   	=> 'Are you sure you wish to delete this location?',
        +        'confirm'   	=> 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την τοποθεσία;',
                 'error'   => 'There was an issue deleting the location. Please try again.',
        -        'success' => 'The location was deleted successfully.'
        +        'success' => 'Η τοποθεσία διαγράφηκε με επιτυχία.'
             )
         
         );
        diff --git a/resources/lang/el/admin/locations/table.php b/resources/lang/el/admin/locations/table.php
        index e171d4dd4e..46776cc66f 100644
        --- a/resources/lang/el/admin/locations/table.php
        +++ b/resources/lang/el/admin/locations/table.php
        @@ -1,20 +1,21 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        +    'about_locations_title'     => 'Σχετικά με τις τοποθεσίες',
             'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        -    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'assets_rtd'                => 'Πάγια', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Assets Assigned',
             'id'                        => 'ID',
        -    'city'                      => 'City',
        -    'state'                     => 'State',
        -    'country'                   => 'Country',
        -    'create'                    => 'Create Location',
        -    'update'                    => 'Update Location',
        -    'name'                      => 'Location Name',
        -    'address'                   => 'Address',
        -    'zip'                       => 'Postal Code',
        -    'locations'                 => 'Locations',
        +    'city'                      => 'Πόλη',
        +    'state'                     => 'Κατάσταση',
        +    'country'                   => 'Χώρα',
        +    'create'                    => 'Δημιουργία τοποθεσίας',
        +    'update'                    => 'Ανανέωση τοποθεσίας',
        +    'name'                      => 'Όνομα τοποθεσίας',
        +    'address'                   => 'Διεύθυνση',
        +    'zip'                       => 'Ταχυδρομικός Κώδικας',
        +    'locations'                 => 'Τοποθεσίες',
             'parent'                    => 'Parent',
        -    'currency'                  => 'Location Currency',
        +    'currency'                  => 'Τοπικό νόμισμα',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/el/admin/manufacturers/message.php b/resources/lang/el/admin/manufacturers/message.php
        index 6586d2af44..16c4891167 100644
        --- a/resources/lang/el/admin/manufacturers/message.php
        +++ b/resources/lang/el/admin/manufacturers/message.php
        @@ -2,22 +2,22 @@
         
         return array(
         
        -    'does_not_exist' => 'Manufacturer does not exist.',
        -    'assoc_users'	 => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',
        +    'does_not_exist' => 'Κατασκευαστής δεν υπάρχει.',
        +    'assoc_users'	 => 'Αυτό κατασκευαστής σχετίζεται με τουλάχιστον ένα μοντέλο και δεν μπορεί να διαγραφεί. Παρακαλούμε να ενημερώσετε τα μοντέλα σας προκειμένου να μην αναφέρονται σε αυτόν τον κατασκευαστή και δοκιμάστε ξανά. ',
         
             'create' => array(
                 'error'   => 'Manufacturer was not created, please try again.',
        -        'success' => 'Manufacturer created successfully.'
        +        'success' => 'Ο κατασκευαστής δημιουργήθηκε με επιτυχία.'
             ),
         
             'update' => array(
        -        'error'   => 'Manufacturer was not updated, please try again',
        -        'success' => 'Manufacturer updated successfully.'
        +        'error'   => 'Ο κατασκευαστής δεν ενημερώθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' => 'Ο κατασκευαστής ενημερώθηκε με επιτυχία.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this manufacturer?',
        -        'error'   => 'There was an issue deleting the manufacturer. Please try again.',
        +        'confirm'   => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον κατασκευαστή;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας τον κατασκευαστή. Παρακαλώ δοκιμάστε ξανά.',
                 'success' => 'The Manufacturer was deleted successfully.'
             )
         
        diff --git a/resources/lang/el/admin/manufacturers/table.php b/resources/lang/el/admin/manufacturers/table.php
        index f66320fe8d..f0ea69039b 100644
        --- a/resources/lang/el/admin/manufacturers/table.php
        +++ b/resources/lang/el/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Σχετικά με τους κατασκευαστές',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Asset Manufacturers',
        -    'create'				=> 'Create Manufacturer',
        +    'create'				=> 'Δημιουργήστε Κατασκευαστή',
             'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        -    'update'				=> 'Update Manufacturer',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
        +    'update'				=> 'Ενημέρωση Κατασκευαστή',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/el/admin/models/general.php b/resources/lang/el/admin/models/general.php
        index e0da09f780..2b8f7b922c 100644
        --- a/resources/lang/el/admin/models/general.php
        +++ b/resources/lang/el/admin/models/general.php
        @@ -1,15 +1,15 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        +    'about_models_title'     => 'Σχετικά με τους τύπους παγίων',
             'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
             'deleted'  					        => 'This model has been deleted. <a href="/hardware/models/:model_id/restore">Click here to restore it</a>.',
        -    'restore'                   => 'Restore Model',
        -    'requestable'               => 'Users may request this model',
        -	'show_mac_address'			      => 'Show MAC address field in assets in this model',
        -    'view_deleted'              => 'View Deleted',
        -    'view_models'               => 'View Models',
        -    'fieldset'                  => 'Fieldset',
        -    'no_custom_field'           => 'No custom fields',
        +    'restore'                   => 'Επαναφορά μοντέλου',
        +    'requestable'               => 'Οι χρήστες μπορούν να αιτηθούν το μοντέλο',
        +	'show_mac_address'			      => 'Εμφάνιση MAC διευθύνσεων πεδίου σε περιουσιακά στοιχεία σε αυτό το μοντέλο',
        +    'view_deleted'              => 'Εμφάνιση διεγραμμένων',
        +    'view_models'               => 'Προβολή μοντέλων',
        +    'fieldset'                  => 'Σύνολο πεδίων',
        +    'no_custom_field'           => 'Δεν υπάρχουν προσαρμοσμένα πεδία',
         
         );
        diff --git a/resources/lang/el/admin/models/message.php b/resources/lang/el/admin/models/message.php
        index fe51cb8d4c..64a5cef1ff 100644
        --- a/resources/lang/el/admin/models/message.php
        +++ b/resources/lang/el/admin/models/message.php
        @@ -2,30 +2,35 @@
         
         return array(
         
        -    'does_not_exist' => 'Model does not exist.',
        +    'does_not_exist' => 'Το μοντέλο δεν υπάρχει.',
             'assoc_users'	 => 'This model is currently associated with one or more assets and cannot be deleted. Please delete the assets, and then try deleting again. ',
         
         
             'create' => array(
        -        'error'   => 'Model was not created, please try again.',
        -        'success' => 'Model created successfully.',
        +        'error'   => 'Το μοντέλο δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά.',
        +        'success' => 'Το μοντέλο δημιουργήθηκε με επιτυχία.',
                 'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
             ),
         
             'update' => array(
        -        'error'   => 'Model was not updated, please try again',
        -        'success' => 'Model updated successfully.'
        +        'error'   => 'Μοντέλο δεν ενημερώθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' => 'Το μοντέλο ενημερώθηκε επιτυχώς.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this asset model?',
        -        'error'   => 'There was an issue deleting the model. Please try again.',
        +        'confirm'   => 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το περιουσιακό μοντέλο;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας αυτό το μοντέλο. Παρακαλώ δοκιμάστε ξανά.',
                 'success' => 'The model was deleted successfully.'
             ),
         
             'restore' => array(
        -        'error'   		=> 'Model was not restored, please try again',
        -        'success' 		=> 'Model restored successfully.'
        +        'error'   		=> 'Το μοντέλο δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' 		=> 'Το μοντέλο επαναφέρθηκε με επιτυχία.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
             ),
         
         );
        diff --git a/resources/lang/el/admin/models/table.php b/resources/lang/el/admin/models/table.php
        index 11a512b3d3..529085546a 100644
        --- a/resources/lang/el/admin/models/table.php
        +++ b/resources/lang/el/admin/models/table.php
        @@ -2,16 +2,16 @@
         
         return array(
         
        -    'create'				=> 'Create Asset Model',
        -    'created_at' 			=> 'Created at',
        +    'create'				=> 'Δημιουργία περιουσιακού στοιχείου μοντέλου',
        +    'created_at' 			=> 'Δημιουργήθηκε στις',
             'eol'	 				=> 'EOL',
        -    'modelnumber'   		=> 'Model No.',
        -    'name'      			=> 'Asset Model Name',
        -    'numassets' 			=> 'Assets',
        -    'title'					=> 'Asset Models',
        -    'update'				=> 'Update Asset Model',
        -    'view'					=> 'View Asset Model',
        -    'update'				=> 'Update Asset Model',
        -    'clone'				=> 'Clone Model',
        -    'edit'				=> 'Edit Model',
        +    'modelnumber'   		=> 'Αριθμός Μοντέλου.',
        +    'name'      			=> 'Όνομα μοντέλου παγίου',
        +    'numassets' 			=> 'Πάγια',
        +    'title'					=> 'Μοντέλα Παγίων',
        +    'update'				=> 'Ενημέρωση παγίου μοντέλου',
        +    'view'					=> 'Προβολή μοντέλου περιουσιακού στοιχείου',
        +    'update'				=> 'Ενημέρωση παγίου μοντέλου',
        +    'clone'				=> 'Κλώνος μοντέλο',
        +    'edit'				=> 'Επεξεργασία μοντέλου',
         );
        diff --git a/resources/lang/el/admin/reports/general.php b/resources/lang/el/admin/reports/general.php
        index b03b97546f..ebba66f457 100644
        --- a/resources/lang/el/admin/reports/general.php
        +++ b/resources/lang/el/admin/reports/general.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'info'   => 'Select the options you want for your asset report.'
        +    'info'   => 'Επιλέξτε τις επιλογές που θέλετε για την αναφορά των παγίων σας.'
         );
        diff --git a/resources/lang/el/admin/reports/message.php b/resources/lang/el/admin/reports/message.php
        index d4c8f8198f..8113d019e5 100644
        --- a/resources/lang/el/admin/reports/message.php
        +++ b/resources/lang/el/admin/reports/message.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'error'   => 'You must select at least ONE option.'
        +    'error'   => 'Πρέπει να επιλέξετε τουλάχιστον μία επιλογή.'
         );
        diff --git a/resources/lang/el/admin/settings/general.php b/resources/lang/el/admin/settings/general.php
        index 1a6b2d4797..d2a10c72ce 100644
        --- a/resources/lang/el/admin/settings/general.php
        +++ b/resources/lang/el/admin/settings/general.php
        @@ -1,30 +1,34 @@
         <?php
         
         return array(
        -    'ad'				        => 'Active Directory',
        -    'ad_domain'				    => 'Active Directory domain',
        +    'ad'				        => 'Υπηρεσία καταλόγου Active Directory',
        +    'ad_domain'				    => 'Τομέα Active Directory',
             'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        -    'is_ad'				        => 'This is an Active Directory server',
        +    'is_ad'				        => 'Αυτός είναι ένας διακομιστής υπηρεσίας καταλόγου Active Directory',
         	'alert_email'				=> 'Send alerts to',
        -	'alerts_enabled'			=> 'Alerts Enabled',
        +	'alerts_enabled'			=> 'Ειδοποιήσεις ενεργοποιημένες',
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        -	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'alert_inv_threshold'		=> 'Ειδοποιήση ορίου αποθήκης',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
        -	'auto_increment_prefix'		=> 'Prefix (optional)',
        +	'auto_increment_prefix'		=> 'Πρόθεμα (μη υποχρεωτικό)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        -	'backups'					=> 'Backups',
        +	'backups'					=> 'Αντίγραφα Ασφαλείας',
         	'barcode_settings'			=> 'Barcode Settings',
        -    'confirm_purge'			    => 'Confirm Purge',
        -    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        -	'custom_css'				=> 'Custom CSS',
        +    'confirm_purge'			    => 'Επιβεβαίωση καθαρισμού',
        +    'confirm_purge_help'		=> 'Εισάγετε το κείμενο «Διαγραφή» στο πλαίσιο παρακάτω για να καθαρίσει τις διαγραμμένες εγγραφές σας. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
        +	'custom_css'				=> 'Προσαρμοσμένο CSS',
         	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
         	'default_currency'  		=> 'Default Currency',
         	'default_eula_text'			=> 'Default EULA',
        -  'default_language'					=> 'Default Language',
        +  'default_language'					=> 'Προκαθορισμένη γλώσσα',
         	'default_eula_help_text'	=> 'You can also associate custom EULAs to specific asset categories.',
        -    'display_asset_name'        => 'Display Asset Name',
        -    'display_checkout_date'     => 'Display Checkout Date',
        +    'display_asset_name'        => 'Εμφάνιση ονόματος παγίου',
        +    'display_checkout_date'     => 'Εμφάνιση ημερομηνίας αποχώρησης',
             'display_eol'               => 'Display EOL in table view',
             'display_qr'                => 'Display Square Codes',
         	'display_alt_barcode'		=> 'Display 1D barcode',
        @@ -32,12 +36,12 @@ return array(
         	'alt_barcode_type'			=> '1D barcode type',
             'eula_settings'				=> 'EULA Settings',
             'eula_markdown'				=> 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        -    'general_settings'			=> 'General Settings',
        -	'generate_backup'			=> 'Generate Backup',
        -    'header_color'              => 'Header Color',
        +    'general_settings'			=> 'Γενικές ρυθμίσεις',
        +	'generate_backup'			=> 'Δημιουργία Αντίγραφου Ασφαλείας',
        +    'header_color'              => 'Χρώμα επικεφαλίδας',
             'info'                      => 'These settings let you customize certain aspects of your installation.',
        -    'laravel'                   => 'Laravel Version',
        -    'ldap_enabled'              => 'LDAP enabled',
        +    'laravel'                   => 'Έκδοση οδηγού',
        +    'ldap_enabled'              => 'Ενεργό LDAP',
             'ldap_integration'          => 'LDAP Integration',
             'ldap_settings'             => 'LDAP Settings',
             'ldap_server'               => 'LDAP Server',
        @@ -45,24 +49,26 @@ return array(
         	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
         	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
         	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        -    'ldap_tls'                  => 'Use TLS',
        +    'ldap_tls'                  => 'Χρήση TLS',
             'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
             'ldap_uname'                => 'LDAP Bind Username',
             'ldap_pword'                => 'LDAP Bind Password',
             'ldap_basedn'               => 'Base Bind DN',
        -    'ldap_filter'               => 'LDAP Filter',
        -    'ldap_pw_sync'              => 'LDAP Password Sync',
        +    'ldap_filter'               => 'LDAP Φίλτρο',
        +    'ldap_pw_sync'              => 'LDAP συγχρονισμός κωδικού πρόσβασης',
             'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
             'ldap_username_field'       => 'Username Field',
        -    'ldap_lname_field'          => 'Last Name',
        +    'ldap_lname_field'          => 'Επίθετο',
             'ldap_fname_field'          => 'LDAP First Name',
             'ldap_auth_filter_query'    => 'LDAP Authentication query',
        -    'ldap_version'              => 'LDAP Version',
        +    'ldap_version'              => 'Έκδοση LDAP',
             'ldap_active_flag'          => 'LDAP Active Flag',
             'ldap_emp_num'              => 'LDAP Employee Number',
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,26 +77,33 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
        -    'setting'                   => 'Setting',
        -    'settings'                  => 'Settings',
        -    'site_name'                 => 'Site Name',
        +    'setting'                   => 'Ρύθμιση',
        +    'settings'                  => 'Ρυθμίσεις',
        +    'site_name'                 => 'Όνομα ιστότοπου',
             'slack_botname'             => 'Slack Botname',
             'slack_channel'             => 'Slack Channel',
             'slack_endpoint'            => 'Slack Endpoint',
             'slack_integration'         => 'Slack Settings',
             'slack_integration_help'    => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new">create an incoming webhook</a> on your Slack account.',
        -    'snipe_version'  			=> 'Snipe-IT version',
        -    'system'                    => 'System Information',
        -    'update'                    => 'Update Settings',
        -    'value'                     => 'Value',
        -    'brand'                     => 'Branding',
        +    'snipe_version'  			=> 'Snipe-It έκδοση',
        +    'system'                    => 'Πληροφορίες συστήματος',
        +    'update'                    => 'Ενημέρωση ρυθμίσεων',
        +    'value'                     => 'Τιμή',
        +    'brand'                     => 'Μάρκα',
             'about_settings_title'      => 'About Settings',
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        -    'page_padding'             => 'Page margins (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Περιθώρια σελίδας (ίντσες)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
             'labels_display_sgutter'    => 'Label side gutter',
        @@ -100,14 +113,16 @@ return array(
             'label_gutters'        => 'Label spacing (inches)',
             'page_dimensions'        => 'Page dimensions (inches)',
             'label_fields'          => 'Label visible fields',
        -    'inches'        => 'inches',
        +    'inches'        => 'ίντσες',
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Έλεγχος ταυτότητας δύο παραγόντων',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        +    'two_factor_enabled_text'        => 'Ενεργοποίηση ελέγχου ταυτότητας δύο παραγόντων',
             'two_factor_reset'        => 'Reset Two-Factor Secret',
             'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
             'two_factor_reset_success'          => 'Two factor device successfully reset',
        @@ -115,19 +130,19 @@ return array(
             'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
             'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
             'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        +    'two_factor_required'        => 'Απαιτείται για όλους τούς χρήστες',
        +    'two_factor_disabled'        => 'Έχει απενεργοποιηθεί',
             'two_factor_enter_code'	=> 'Enter Two-Factor Code',
             'two_factor_config_complete'	=> 'Submit Code',
             'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
             'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        +    'require_accept_signature'      => 'Απαιτείται υπογραφή',
             'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        -    'left'        => 'left',
        -    'right'        => 'right',
        -    'top'        => 'top',
        -    'bottom'        => 'bottom',
        -    'vertical'        => 'vertical',
        -    'horizontal'        => 'horizontal',
        +    'left'        => 'αριστερά',
        +    'right'        => 'δεξιά',
        +    'top'        => 'κορυφή',
        +    'bottom'        => 'κάτω μέρος',
        +    'vertical'        => 'κάθετα',
        +    'horizontal'        => 'οριζόντιος',
             'zerofill_count'        => 'Length of asset tags, including zerofill',
         );
        diff --git a/resources/lang/el/admin/settings/message.php b/resources/lang/el/admin/settings/message.php
        index 736d5c3e9e..f242cc34e4 100644
        --- a/resources/lang/el/admin/settings/message.php
        +++ b/resources/lang/el/admin/settings/message.php
        @@ -4,18 +4,18 @@ return array(
         
         
             'update' => array(
        -        'error'                 => 'An error has occurred while updating. ',
        -        'success'               => 'Settings updated successfully.'
        +        'error'                 => 'Παρουσιάστηκε ένα σφάλμα κατά την ενημέρωση. ',
        +        'success'               => 'Οι ρυθμίσεις αναβαθμίστηκαν επιτυχώς.'
             ),
             'backup' => array(
        -        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        -        'file_deleted'          => 'The backup file was successfully deleted. ',
        +        'delete_confirm'        => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το αρχείο αντιγράφων ασφαλείας; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. ',
        +        'file_deleted'          => 'Το αντίγραφο ασφαλείας διαγράφηκε επιτυχώς. ',
                 'generated'             => 'A new backup file was successfully created.',
                 'file_not_found'        => 'That backup file could not be found on the server.',
             ),
             'purge' => array(
        -        'error'     => 'An error has occurred while purging. ',
        -        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        +        'error'     => 'Παρουσιάστηκε ένα σφάλμα κατά την εκκαθάριση. ',
        +        'validation_failed'     => 'Η επιβεβαίωση καθαρισμού είναι εσφαλμένη. Παρακαλούμε πληκτρολογήστε τη λέξη «Διαγραφή» στο πλαίσιο επιβεβαίωσης.',
                 'success'               => 'Deleted records successfully purged.'
             ),
         
        diff --git a/resources/lang/el/admin/statuslabels/message.php b/resources/lang/el/admin/statuslabels/message.php
        index 619a5a509c..bde2cc10d3 100644
        --- a/resources/lang/el/admin/statuslabels/message.php
        +++ b/resources/lang/el/admin/statuslabels/message.php
        @@ -2,23 +2,23 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        +    'does_not_exist' => 'Η ετικέτα κατάστασης δεν υπάρχει.',
             'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
         
         
             'create' => array(
                 'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'Status Label created successfully.'
        +        'success' => 'Η ετικέτα κατάστασης δημιουργήθηκε με επιτυχία.'
             ),
         
             'update' => array(
        -        'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'Status Label updated successfully.'
        +        'error'   => 'Η Ετικέτα κατάστασης δεν ενημερώθηκε, παρακαλώ προσπαθήστε ξανά',
        +        'success' => 'Η ετικέτα κατάστασης ενημερώθηκε με επιτυχία.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        -        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        +        'confirm'   => 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την ετικέτα κατάστασης;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας την ετικέτα κατάστασης. Παρακαλώ δοκιμάστε ξανά.',
                 'success' => 'The Status Label was deleted successfully.'
             )
         
        diff --git a/resources/lang/el/admin/statuslabels/table.php b/resources/lang/el/admin/statuslabels/table.php
        index b9b5b7ec4e..9be157c192 100644
        --- a/resources/lang/el/admin/statuslabels/table.php
        +++ b/resources/lang/el/admin/statuslabels/table.php
        @@ -1,17 +1,17 @@
         <?php
         
         return array(
        -    'about'      	=> 'About Status Labels',
        -    'archived'      	=> 'Archived',
        -    'create'      	=> 'Create Status Label',
        -    'color'      	=> 'Chart Color',
        -    'deployable'      	=> 'Deployable',
        +    'about'      	=> 'Σχετικά με το καθεστώς ετικετών',
        +    'archived'      	=> 'Αρχειοθετημένα',
        +    'create'      	=> 'Δημιουργία ετικέτας κατάστασης',
        +    'color'      	=> 'Χρώμα Γραφήματος',
        +    'deployable'      	=> 'Προς ανάπτυξη',
             'info'      	=> 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
        -    'name'      	=> 'Status Name',
        -    'pending'      	=> 'Pending',
        -    'status_type'   => 'Status Type',
        +    'name'      	=> 'Όνομα κατάστασης',
        +    'pending'      	=> 'Εκκρεμεί',
        +    'status_type'   => 'Τύπος κατάστασης',
             'show_in_nav'   => 'Show in side nav',
        -    'title'      	=> 'Status Labels',
        +    'title'      	=> 'Ετικέτα Κατάστασης',
             'undeployable'  => 'Undeployable',
        -    'update'      	=> 'Update Status Label',
        +    'update'      	=> 'Ενημέρωση κατάστασης ετικέτα',
         );
        diff --git a/resources/lang/el/admin/suppliers/message.php b/resources/lang/el/admin/suppliers/message.php
        index df4bc41af3..ba47b4a4c0 100644
        --- a/resources/lang/el/admin/suppliers/message.php
        +++ b/resources/lang/el/admin/suppliers/message.php
        @@ -2,23 +2,23 @@
         
         return array(
         
        -    'does_not_exist' => 'Supplier does not exist.',
        -    'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
        +    'does_not_exist' => 'Προμηθευτής δεν υπάρχει.',
        +    'assoc_users'	 => 'Αυτός ο προμηθευτ σχετίζεται με τουλάχιστον ένα χρήστη και δεν μπορεί να διαγραφεί. Παρακαλούμε να ενημερώσετε τους χρήστες σας να μην αναφέρονται σε αυτήν τη θέση και δοκιμάστε ξανά. ',
         
             'create' => array(
                 'error'   => 'Supplier was not created, please try again.',
        -        'success' => 'Supplier created successfully.'
        +        'success' => 'Ο προμηθευτής δημιουργήθηκε επιτυχώς.'
             ),
         
             'update' => array(
        -        'error'   => 'Supplier was not updated, please try again',
        -        'success' => 'Supplier updated successfully.'
        +        'error'   => 'Ο προμηθευτής δεν επικαιροποιήθηκε, παρακαλώ δοκιμάστε ξανά',
        +        'success' => 'Οι προμηθευτές ανανεώθηκαν επιτυχώς.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this supplier?',
        -        'error'   => 'There was an issue deleting the supplier. Please try again.',
        -        'success' => 'Supplier was deleted successfully.'
        +        'confirm'   => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό τον προμηθευτή;',
        +        'error'   => 'Υπήρξε ένα ζήτημα διαγράφοντας τον προμηθευτή. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Ο προμηθευτής διαγράφηκε επιτυχώς.'
             )
         
         );
        diff --git a/resources/lang/el/admin/suppliers/table.php b/resources/lang/el/admin/suppliers/table.php
        index 2a7b07ca93..93c29ebf89 100644
        --- a/resources/lang/el/admin/suppliers/table.php
        +++ b/resources/lang/el/admin/suppliers/table.php
        @@ -1,27 +1,27 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        +    'about_suppliers_title' => 'Σχετικά με τους προμηθευτές',
             'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        -    'address'               => 'Supplier Address',
        -    'assets'                => 'Assets',
        -    'city'                  => 'City',
        -    'contact'               => 'Contact Name',
        -    'country'               => 'Country',
        -    'create'                => 'Create Supplier',
        -    'email'                 => 'Email',
        -    'fax'                   => 'Fax',
        +    'address'               => 'Διεύθυνση προμηθευτή',
        +    'assets'                => 'Πάγια',
        +    'city'                  => 'Πόλη',
        +    'contact'               => 'Όνομα Επαφής',
        +    'country'               => 'Χώρα',
        +    'create'                => 'Δημιουργία Προμηθευτή',
        +    'email'                 => 'Ηλεκτρονικό ταχυδρομείο',
        +    'fax'                   => 'Φαξ',
             'id'                    => 'ID',
        -    'licenses'              => 'Licenses',
        -    'name'                  => 'Supplier Name',
        -    'notes'                 => 'Notes',
        -    'phone'                 => 'Phone',
        -    'state'                 => 'State',
        -    'suppliers'             => 'Suppliers',
        -    'update'                => 'Update Supplier',
        -    'url'                   => 'URL',
        +    'licenses'              => 'Άδειες',
        +    'name'                  => 'Όνομα προμηθευτή',
        +    'notes'                 => 'Σημειώσεις',
        +    'phone'                 => 'Τηλέφωνο',
        +    'state'                 => 'Κατάσταση',
        +    'suppliers'             => 'Προμηθευτές',
        +    'update'                => 'Ενημέρωση προμηθευτή',
        +    'url'                   => 'Διεύθυνση URL',
             'view'                  => 'View Supplier',
        -    'view_assets_for'       => 'View Assets for',
        -    'zip'                   => 'Postal Code',
        +    'view_assets_for'       => 'Προβολή παγίων για',
        +    'zip'                   => 'Ταχυδρομικός Κώδικας',
         
         );
        diff --git a/resources/lang/el/admin/users/general.php b/resources/lang/el/admin/users/general.php
        index 92ee04b491..fe8211afba 100644
        --- a/resources/lang/el/admin/users/general.php
        +++ b/resources/lang/el/admin/users/general.php
        @@ -3,18 +3,22 @@
         
         return array(
         
        -    'assets_user'       => 'Assets assigned to :name',
        +    'assets_user'       => 'Περιουσιακά στοιχεία που έχει αντιστοιχιστεί σε: όνομα',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
        -    'clone'             => 'Clone User',
        -    'contact_user'      => 'Contact :name',
        -    'edit'              => 'Edit User',
        +    'clone'             => 'Κλώνος χρήστη',
        +    'contact_user'      => 'Επικοινωνία :Όνομα',
        +    'edit'              => 'Επεξεργασία χρήστη',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        -    'history_user'      => 'History for :name',
        -    'last_login'        => 'Last Login',
        +    'history_user'      => 'Ιστορικό: όνομα',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
        +    'last_login'        => 'Τελευταία σύνδεση',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        -    'view_user'         => 'View User :name',
        -    'usercsv'           => 'CSV file',
        +    'view_user'         => 'Προβολή χρήστη :ονόματος',
        +    'usercsv'           => 'CSV αρχείο',
             'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
             'two_factor_enrolled' => '2FA Device Enrolled ',
             'two_factor_active'   => '2FA Active ',
        diff --git a/resources/lang/el/admin/users/message.php b/resources/lang/el/admin/users/message.php
        index a1a9757e86..022ab3956b 100644
        --- a/resources/lang/el/admin/users/message.php
        +++ b/resources/lang/el/admin/users/message.php
        @@ -2,26 +2,28 @@
         
         return array(
         
        -    'accepted'                  => 'You have successfully accepted this asset.',
        +    'accepted'                  => 'Έχετε αποδεχθεί με επιτυχία αυτό το πάγιο.',
             'declined'                  => 'You have successfully declined this asset.',
        -    'user_exists'               => 'User already exists!',
        -    'user_not_found'            => 'User [:id] does not exist.',
        -    'user_login_required'       => 'The login field is required',
        -    'user_password_required'    => 'The password is required.',
        -    'insufficient_permissions'  => 'Insufficient Permissions.',
        -    'user_deleted_warning'      => 'This user has been deleted. You will have to restore this user to edit them or assign them new assets.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
        +    'user_exists'               => 'Ο χρήστης υπάρχει ήδη!',
        +    'user_not_found'            => 'Ο χρήστης [:id] δεν υπάρχει.',
        +    'user_login_required'       => 'Το πεδίο εισόδου είναι υποχρεωτικό',
        +    'user_password_required'    => 'Ο κωδικός είναι απαραίτητος.',
        +    'insufficient_permissions'  => 'Δεν έχετε επαρκή δικαιώματα.',
        +    'user_deleted_warning'      => 'Αυτός ο χρήστης έχει διαγραφεί. Θα πρέπει να επαναφέρετε αυτό το χρήστη για να τον επεξεργαστείτε ή να του εκχωρήσετε νέα πάγια.',
             'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
         
         
             'success' => array(
        -        'create'    => 'User was successfully created.',
        -        'update'    => 'User was successfully updated.',
        -        'delete'    => 'User was successfully deleted.',
        -        'ban'       => 'User was successfully banned.',
        -        'unban'     => 'User was successfully unbanned.',
        +        'create'    => 'Ο χρήστης δημιουργήθηκε με επιτυχία.',
        +        'update'    => 'Ο χρήστης ενημερώθηκε με επιτυχία.',
        +        'update_bulk'    => 'Users were successfully updated!',
        +        'delete'    => 'Ο χρήστης διαφράφηκε με επιτυχία.',
        +        'ban'       => 'Ο χρήστης έχει αποκλειστεί επιτυχώς.',
        +        'unban'     => 'Ο Χρήστης επαναφέρθηκε με επιτυχία.',
                 'suspend'   => 'User was successfully suspended.',
                 'unsuspend' => 'User was successfully unsuspended.',
        -        'restored'  => 'User was successfully restored.',
        +        'restored'  => 'Ο Χρήστης επαναφέρθηκε με επιτυχία.',
                 'import'    => 'Users imported successfully.',
             ),
         
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,17 +41,18 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        -        'error'   => 'File not deleted. Please try again.',
        -        'success' => 'File successfully deleted.',
        +        'error'   => 'Το αρχείο δεν έχει διαγραφεί. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Το αρχείο διαγράφηκε με επιτυχία.',
             ),
         
             'upload' => array(
        -        'error'   => 'File(s) not uploaded. Please try again.',
        -        'success' => 'File(s) successfully uploaded.',
        -        'nofiles' => 'You did not select any files for upload',
        +        'error'   => 'Τα αρχεία δεν μεταφορτώθηκαν. Παρακαλώ δοκιμάστε ξανά.',
        +        'success' => 'Τα αρχεία ενημερώθηκαν με επιτυχία.',
        +        'nofiles' => 'Δεν έχετε επιλέξει κανένα αρχείο για ενημέρωση',
                 'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
             ),
         
        diff --git a/resources/lang/el/admin/users/table.php b/resources/lang/el/admin/users/table.php
        index 8c9b40a454..3e6b7c79c6 100644
        --- a/resources/lang/el/admin/users/table.php
        +++ b/resources/lang/el/admin/users/table.php
        @@ -1,36 +1,38 @@
         <?php
         
         return array(
        -
        -    'activated'  			=> 'Active',
        -    'allow'  				=> 'Allow',
        -    'checkedout'  			=> 'Assets',
        -    'created_at' 			=> 'Created',
        -    'createuser' 			=> 'Create User',
        -    'deny'  				=> 'Deny',
        -    'email'      			=> 'Email',
        -    'employee_num'      	=> 'Employee No.',
        -    'first_name' 			=> 'First Name',
        -    'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        +    'activated'  			=> 'Ενεργό',
        +    'allow'  				=> 'Να επιτραπεί',
        +    'checkedout'  			=> 'Πάγια',
        +    'created_at' 			=> 'Δημιουργήθηκε',
        +    'createuser' 			=> 'Δημιουργία χρήστη',
        +    'deny'  				=> 'Απόρριψη',
        +    'email'      			=> 'Ηλεκτρονικό ταχυδρομείο',
        +    'employee_num'      	=> 'Αριθμός Υπαλλήλου.',
        +    'first_name' 			=> 'Όνομα',
        +    'groupnotes'			=> 'Επιλέξτε μια ομάδα για να εκχωρήσετε στο χρήστη, να θυμάστε ότι ο χρήστης παίρνει τα δικαιώματα της ομάδας που του έχουν ανατεθεί.',
             'id'         			=> 'Id',
             'inherit'  				=> 'Inherit',
        -    'job' 					=> 'Job Title',
        -    'last_login'  			=> 'Last Login',
        -    'last_name'  			=> 'Last Name',
        -    'location'  			=> 'Location',
        -    'lock_passwords'		=> 'Login details cannot be changed on this installation.',
        -    'manager' 				=> 'Manager',
        -    'name' 					=> 'Name',
        -    'notes'                 => 'Notes',
        -    'password_confirm' 		=> 'Confirm Password',
        -    'password' 				=> 'Password',
        -    'phone'  				=> 'Phone',
        -    'show_current'          => 'Show Current Users',
        -    'show_deleted'          => 'Show Deleted Users',
        -    'title' 				=> 'Title',
        -    'updateuser' 			=> 'Update User',
        -    'username' 				=> 'Username',
        -    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        -    'cloneuser'             => 'Clone User',
        -    'viewusers' 			=> 'View Users',
        +    'job' 					=> 'Τίτλος εργασίας',
        +    'last_login'  			=> 'Τελευταία σύνδεση',
        +    'last_name'  			=> 'Επίθετο',
        +    'location'  			=> 'Τοποθεσία',
        +    'lock_passwords'		=> 'Οι λεπτομέρειες σύνδεσης δεν μπορούν να αλλάξουν σε αυτήν την εγκατάσταση.',
        +    'manager' 				=> 'Διευθυντής',
        +    'managed_locations'     => 'Managed Locations',
        +    'name' 					=> 'Όνομα',
        +    'notes'                 => 'Σημειώσεις',
        +    'password_confirm' 		=> 'Επιβεβαίωση Κωδικού Πρόσβασης',
        +    'password' 				=> 'Κωδικός Πρόσβασης',
        +    'phone'  				=> 'Τηλέφωνο',
        +    'show_current'          => 'Προβολή τρέχωντων χρηστών',
        +    'show_deleted'          => 'Εμφάνιση διαγραμμένων χρηστών',
        +    'title' 				=> 'Τίτλος',
        +	'to_restore_them'		=> 'to restore them.',
        +    'updateuser' 			=> 'Ενημέρωση χρήστη',
        +    'username' 				=> 'Όνομα χρήστη',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
        +    'username_note' 		=> '(Αυτό χρησιμοποιείται για τη σύνδεση της υπηρεσίας καταλόγου Active Directory μόνο, όχι για σύνδεση.)',
        +    'cloneuser'             => 'Κλώνος χρήστη',
        +    'viewusers' 			=> 'Εμφάνιση χρηστών',
         );
        diff --git a/resources/lang/el/auth/general.php b/resources/lang/el/auth/general.php
        index bf88cba77a..31079a815f 100644
        --- a/resources/lang/el/auth/general.php
        +++ b/resources/lang/el/auth/general.php
        @@ -1,12 +1,12 @@
         <?php
         
         return [
        -    'send_password_link'	        => 'Send Password Reset Link',
        -    'email_reset_password'			=> 'Email Password Reset',
        -    'reset_password'			    => 'Reset Password',
        -    'login'                         => 'Login',
        -    'login_prompt'                  => 'Please Login',
        -    'forgot_password'               => 'I forgot my password',
        -    'remember_me'                   => 'Remember Me',
        +    'send_password_link'	        => 'Αποστολή συνδέσμου ακύρωσης κωδικού',
        +    'email_reset_password'			=> 'Επαναφορά του κωδικού πρόσβασης ηλεκτρονικού ταχυδρομείου',
        +    'reset_password'			    => 'Επαναφορά κωδικού πρόσβασης',
        +    'login'                         => 'Είσοδος',
        +    'login_prompt'                  => 'Παρακαλούμε συνδεθείτε',
        +    'forgot_password'               => 'Ξέχασα τον κωδικό μου',
        +    'remember_me'                   => 'Να με θυμάσαι',
             ];
         
        diff --git a/resources/lang/el/auth/message.php b/resources/lang/el/auth/message.php
        index 3aee689e54..ff6ad1c998 100644
        --- a/resources/lang/el/auth/message.php
        +++ b/resources/lang/el/auth/message.php
        @@ -2,36 +2,36 @@
         
         return array(
         
        -    'account_already_exists' => 'An account with the this email already exists.',
        -    'account_not_found'      => 'The username or password is incorrect.',
        +    'account_already_exists' => 'Υπάρχει ήδη λογαριασμός με το ίδιο email.',
        +    'account_not_found'      => 'Το όνομα χρήστη ή ο κωδικός πρόσβασης είναι εσφαλμένα.',
             'account_not_activated'  => 'This user account is not activated.',
        -    'account_suspended'      => 'This user account is suspended.',
        +    'account_suspended'      => 'Αυτός ο λογαριασμός χρήστη έχει ανασταλεί.',
             'account_banned'         => 'This user account is banned.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
        -        'error'   => 'There was a problem while trying to log you in, please try again.',
        -        'success' => 'You have successfully logged in.',
        +        'error'   => 'Υπήρχε ένα πρόβλημα ενώ προσπαθείτε να συνδεθείτε, παρακαλώ προσπαθήστε ξανά.',
        +        'success' => 'Έχετε συνδεθεί επιτυχώς.',
             ),
         
             'signup' => array(
                 'error'   => 'There was a problem while trying to create your account, please try again.',
        -        'success' => 'Account sucessfully created.',
        +        'success' => 'Ο λογαριασμός δημιουργήθηκε επιτυχώς.',
             ),
         
                 'forgot-password' => array(
                     'error'   => 'There was a problem while trying to get a reset password code, please try again.',
        -            'success' => 'Password recovery email successfully sent.',
        +            'success' => 'Το email ανάκτησης κωδικού πρόσβασης αποστάλθηκε με επιτυχία.',
                 ),
         
                 'forgot-password-confirm' => array(
        -            'error'   => 'There was a problem while trying to reset your password, please try again.',
        -            'success' => 'Your password has been successfully reset.',
        +            'error'   => 'Υπήρχε ένα πρόβλημα ενώ προσπαθούσατε να επαναγέρετε τον κωδικό σας, παρακαλώ προσπαθήστε ξανά.',
        +            'success' => 'Έχει γίνει επαναφορά του κωδικού πρόσβασής σας με επιτυχία.',
                 ),
         
             'activate' => array(
                 'error'   => 'There was a problem while trying to activate your account, please try again.',
        -        'success' => 'Your account has been successfully activated.',
        +        'success' => 'Ο λογαριασμός έχει με επιτυχία ενεργοποιηθεί.',
             ),
         
         );
        diff --git a/resources/lang/el/button.php b/resources/lang/el/button.php
        index 14aedbf0fe..5543353f78 100644
        --- a/resources/lang/el/button.php
        +++ b/resources/lang/el/button.php
        @@ -1,16 +1,15 @@
         <?php
         
         return array(
        -
        -    'actions' 	                => 'Actions',
        -    'add'    	                => 'Add New',
        -    'cancel'                    => 'Cancel',
        -    'checkin_and_delete'  	    => 'Checkin & Delete User',
        -    'delete'  	                => 'Delete',
        -    'edit'    	                => 'Edit',
        -    'restore' 	                => 'Restore',
        -    'request'                   => 'Request',
        -    'submit'  	                => 'Submit',
        -    'upload'                    => 'Upload',
        -
        +    'actions' 	                => 'Ενέργειες',
        +    'add'    	                => 'Προσθήκη Νέου',
        +    'cancel'                    => 'Ακύρωση',
        +    'checkin_and_delete'  	    => 'Checkin & Διαγραφή χρήστη',
        +    'delete'  	                => 'Διαγραφή',
        +    'edit'    	                => 'Επεξεργασία',
        +    'restore' 	                => 'Επαναφορά',
        +    'request'                   => 'Αίτημα',
        +    'submit'  	                => 'Υποβολή',
        +    'upload'                    => 'Μεταφόρτωση',
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/el/general.php b/resources/lang/el/general.php
        index 16c38b1721..3b7701a431 100644
        --- a/resources/lang/el/general.php
        +++ b/resources/lang/el/general.php
        @@ -1,185 +1,204 @@
         <?php
         
             return [
        -    'accessories'			=> 'Accessories',
        -    'activated'			=> 'Activated',
        -    'accessory'				=> 'Accessory',
        -    'accessory_report'			=> 'Accessory Report',
        -    'action'                => 'Action',
        -    'activity_report'		=> 'Activity Report',
        -    'address'				=> 'Address',
        -    'admin'					=> 'Admin',
        +    'accessories'			=> 'Αξεσουάρ',
        +    'activated'			=> 'Ενεργοποιήθηκε',
        +    'accessory'				=> 'Αξεσουάρ',
        +    'accessory_report'			=> 'Αναφορά αξεσουάρ',
        +    'action'                => 'Ενέργεια',
        +    'activity_report'		=> 'Έκθεση Δραστηριότητας',
        +    'address'				=> 'Διεύθυνση',
        +    'admin'					=> 'Διαχειριστής',
             'add_seats'     => 'Added seats',
        -    'all_assets'			=> 'All Assets',
        -    'all'       			=> 'All',
        -    'archived'              => 'Archived',
        -    'asset_models'			=> 'Asset Models',
        -    'asset'					=> 'Asset',
        -    'asset_report'          => 'Asset Report',
        -    'asset_tag'				=> 'Asset Tag',
        -    'assets_available'		=> 'assets available',
        -    'assets'				=> 'Assets',
        -    'avatar_delete'         => 'Delete Avatar',
        -    'avatar_upload'         => 'Upload Avatar',
        -    'back'      			=> 'Back',
        +    'all_assets'			=> 'Όλα τα περουσιακά στοιχεία',
        +    'all'       			=> 'Ολα',
        +    'archived'              => 'Αρχειοθετημένα',
        +    'asset_models'			=> 'Μοντέλα Παγίων',
        +    'asset'					=> 'Πάγιο',
        +    'asset_report'          => 'Αναφορά παγίων',
        +    'asset_tag'				=> 'Ετικέτα παγίων',
        +    'assets_available'		=> 'διαθέσιμα πάγια',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
        +    'assets'				=> 'Πάγια',
        +    'avatar_delete'         => 'Διαγραφή Avatar',
        +    'avatar_upload'         => 'Ανεβάστε την εικόνα προφίλ σας',
        +    'back'      			=> 'Προηγούμενο',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
        -    'cancel'  				=> 'Cancel',
        -    'categories'			=> 'Categories',
        -    'category'				=> 'Category',
        +    'cancel'  				=> 'Ακύρωση',
        +    'categories'			=> 'Kατηγορίες',
        +    'category'				=> 'Κατηγορία',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Change Email Address',
        -    'changepassword'  		=> 'Change Password',
        -    'checkin'  				=> 'Checkin',
        -    'checkin_from'  		=> 'Checkin from',
        +    'changepassword'  		=> 'Αλλαγή κωδικού',
        +    'checkin'  				=> 'Μεταβίβαση ελέγχου',
        +    'checkin_from'  		=> 'Μεταβίβαση ελέγχου από',
             'checkout'  			=> 'Checkout',
        -    'city'  				=> 'City',
        -    'companies'			=> 'Companies',
        -    'company'				=> 'Company',
        +    'city'  				=> 'Πόλη',
        +	'click_here'			=> 'Click here',
        +    'companies'			=> 'Εταιρείες',
        +    'company'				=> 'Εταιρεία',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
        -    'country'  				=> 'Country',
        +    'country'  				=> 'Χώρα',
             'create'				=> 'Create New',
        -    'created'               => 'Item Created',
        -    'created_asset'			=> 'created asset',
        -    'created_at' 			=> 'Created at',
        +    'created'               => 'Το αντικείμενο δημιουργήθηκε',
        +    'created_asset'			=> 'δημιουργία παγίου',
        +    'created_at' 			=> 'Δημιουργήθηκε στις',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
        -    'current'  				=> 'Current',
        +    'current'  				=> 'Τρέχουσα',
             'custom_report'         => 'Custom Asset Report',
        -    'dashboard'				=> 'Dashboard',
        -    'date'					=> 'Date',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        -    'delete'  				=> 'Delete',
        -    'deleted'  				=> 'Deleted',
        +    'dashboard'				=> 'Πίνακας ελέγχου',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
        +    'date'					=> 'Ημερομηνία',
        +    'debug_warning'         => 'Προσοχή!',
        +    'debug_warning_text'         => 'Αυτή η εφαρμογή εκτελείται σε λειτουργία παραγωγής με ενεργοποιημένο τον εντοπισμό σφαλμάτων. Αυτό μπορεί να εκθέσει τα ευαίσθητα δεδομένα, εάν η εφαρμογή σας είναι προσβάσιμη στον έξω κόσμο. Απενεργοποιήσετε την κατάσταση λειτουργίας εντοπισμού σφαλμάτων, ορίζοντας την τιμή <code>APP_DEBUG</code> στο αρχείο <code>.env</code> για να <code>false</code>.',
        +    'delete'  				=> 'Διαγραφή',
        +    'deleted'  				=> 'Διαγράφηκε',
             'delete_seats'  		=> 'Deleted Seats',
        -    'deployed'				=> 'Deployed',
        -    'depreciation_report'	=> 'Depreciation Report',
        -    'download'				=> 'Download',
        -    'depreciation'			=> 'Depreciation',
        -    'editprofile'  			=> 'Edit Your Profile',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
        +    'deployed'				=> 'Έχουν αναπτυχθεί',
        +    'depreciation_report'	=> 'Αναφορά απόσβεσης',
        +    'download'				=> 'Λήψη',
        +    'depreciation'			=> 'Αποσβέσεις',
        +    'editprofile'  			=> 'Επεξεργασία Προφίλ',
             'eol'					=> 'EOL',
             'email_domain'			=> 'Email Domain',
             'email_format'			=> 'Email Format',
             'email_domain_help'		=> 'This is used to generate email addresses when importing',
             'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
             'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        -    'first'					=> 'First',
        -    'first_name'			=> 'First Name',
        +    'first'					=> 'Πρώτο',
        +    'first_name'			=> 'Όνομα',
             'first_name_format'		=> 'First Name (jane@example.com)',
             'file_name'				=> 'File',
        -    'file_uploads'			=> 'File Uploads',
        -    'generate'				=> 'Generate',
        -    'groups'				=> 'Groups',
        +    'file_uploads'			=> 'Ανέβασμα αρχείου',
        +    'generate'				=> 'Δημιουργία',
        +    'groups'				=> 'Ομάδες',
             'gravatar_email'        => 'Gravatar Email Address',
        -    'history'  			    => 'History',
        -    'history_for'  			=> 'History for',
        +    'history'  			    => 'Ιστορία',
        +    'history_for'  			=> 'Ιστορικό για',
             'id'  					=> 'ID',
        -    'image_delete'         	=> 'Delete Image',
        -    'image_upload'         	=> 'Upload Image',
        -    'import'         	    => 'Import',
        -    'import-history'        => 'Import History',
        -    'asset_maintenance'        => 'Asset Maintenance',
        -    'asset_maintenance_report' => 'Asset Maintenance Report',
        -    'asset_maintenances'       => 'Asset Maintenances',
        -    'item'  				=> 'Item',
        -    'insufficient_permissions' => 'Insufficient permissions!',
        -    'language'				=> 'Language',
        -    'last'					=> 'Last',
        -    'last_name'             => 'Last Name',
        -    'license'				=> 'License',
        -    'license_report'        => 'License Report',
        -    'licenses_available'	=> 'licenses available',
        -    'licenses'				=> 'Licenses',
        -    'list_all'				=> 'List All',
        -    'loading'				=> 'Loading',
        +    'image_delete'         	=> 'Διαγραφή εικόνας',
        +    'image_upload'         	=> 'Μεταφόρτωση εικόνας',
        +    'import'         	    => 'Εισαγωγή',
        +    'import-history'        => 'Ιστορικό Εισαγωγών',
        +    'asset_maintenance'        => 'Συντήρηση Παγίου',
        +    'asset_maintenance_report' => 'Αναφορά Συντήρησης Παγίου',
        +    'asset_maintenances'       => 'Συντήρηση Παγίου',
        +    'item'  				=> 'Αντικείμενο',
        +    'insufficient_permissions' => 'Μη επαρκή δικαιώματα!',
        +    'language'				=> 'Γλώσσα',
        +    'last'					=> 'Τελευταίο',
        +    'last_login'            => 'Last Login',
        +    'last_name'             => 'Επίθετο',
        +    'license'				=> 'Άδεια Χρήσεως',
        +    'license_report'        => 'Αναφορά άδειας',
        +    'licenses_available'	=> 'διαθέσιμες άδειες',
        +    'licenses'				=> 'Άδειες',
        +    'list_all'				=> 'Λίστα όλων',
        +    'loading'				=> 'Φόρτωση',
             'lock_passwords'        => 'This field cannot be edited in this installation.',
             'feature_disabled'      => 'This feature has been disabled for the demo installation.',
             'location'              => 'Location',
        -    'locations'				=> 'Locations',
        -    'logout'				=> 'Logout',
        +    'locations'				=> 'Τοποθεσίες',
        +    'logout'				=> 'Αποσύνδεση',
             'lookup_by_tag'     => 'Lookup by Asset Tag',
        -    'manufacturer'			=> 'Manufacturer',
        -    'manufacturers'			=> 'Manufacturers',
        +    'manufacturer'			=> 'Κατασκευαστής',
        +    'manufacturers'			=> 'Κατασκευαστές',
             'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        -    'min_amt'				=> 'Min. QTY',
        +    'min_amt'				=> 'Ελάχιστη ποσότητα',
             'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        -    'model_no'				=> 'Model No.',
        -    'months'				=> 'months',
        -    'moreinfo'				=> 'More Info',
        -    'name'					=> 'Name',
        -    'next'					=> 'Next',
        -    'new'					=> 'new!',
        +    'model_no'				=> 'Αριθμός Μοντέλου.',
        +    'months'				=> 'μήνες',
        +    'moreinfo'				=> 'Περισσότερες Πληροφορίες',
        +    'name'					=> 'Όνομα',
        +    'next'					=> 'Επόμενο',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'νεό!',
             'no_depreciation'		=> 'No Depreciation',
        -    'no_results'			=> 'No Results.',
        -    'no'  					=> 'No',
        -    'notes'  				=> 'Notes',
        -    'order_number'          => 'Order Number',
        +    'no_results'			=> 'Δεν βρέθηκαν αποτελέσματα.',
        +    'no'  					=> '\'Οχι',
        +    'notes'  				=> 'Σημειώσεις',
        +    'order_number'          => 'Αριθμός παραγγελίας',
             'page_menu'				=> 'Showing _MENU_ items',
             'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
        -    'pending'				=> 'Pending',
        -    'people'				=> 'People',
        -    'per_page'				=> 'Results Per Page',
        -    'previous'				=> 'Previous',
        -    'processing'			=> 'Processing',
        -    'profile'				=> 'Your profile',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        -    'qty'		            => 'QTY',
        -    'quantity'		        => 'Quantity',
        +    'pending'				=> 'Εκκρεμεί',
        +    'people'				=> 'Άτομα',
        +    'per_page'				=> 'Αποτελέσματα ανά σελίδα',
        +    'previous'				=> 'Προηγούμενο',
        +    'processing'			=> 'Επεξεργάζεται',
        +    'profile'				=> 'Το προφίλ σας',
        +    'purchase_cost'                              => 'Κόστος αγοράς',
        +    'purchase_date'         => 'Ημερομηνία αγοράς',
        +    'qty'		            => 'Τεμάχια',
        +    'quantity'		        => 'Ποσότητα',
             'ready_to_deploy'		=> 'Ready to Deploy',
             'recent_activity'		=> 'Recent Activity',
             'remove_company'        => 'Remove Company Association',
        -    'reports'				=> 'Reports',
        -    'requested'				=> 'Requested',
        -    'request_canceled'      => 'Request Canceled',
        -    'save'  				=> 'Save',
        -    'select'				=> 'Select',
        -    'search'				=> 'Search',
        -    'select_category'       => 'Select a Category',
        -    'select_depreciation'	=> 'Select a Depreciation Type',
        -    'select_location'		=> 'Select a Location',
        -    'select_manufacturer'	=> 'Select a Manufacturer',
        -    'select_model'			=> 'Select a Model',
        -    'select_supplier'		=> 'Select a Supplier',
        -    'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        -    'select_statuslabel'	=> 'Select Status',
        -    'select_company'    	=> 'Select Company',
        -    'select_asset'    		=> 'Select Asset',
        -    'settings'				=> 'Settings',
        -    'sign_in'				=> 'Sign in',
        -    'signature'             => 'Signature',
        +    'reports'				=> 'Αναφορές',
        +    'requested'				=> 'Ζητήθηκαν',
        +    'request_canceled'      => 'Το αίτημα ακυρώθηκε',
        +    'save'  				=> 'Αποθήκευση',
        +    'select'				=> 'Επιλογή',
        +    'search'				=> 'Αναζήτηση',
        +    'select_category'       => 'Επιλέξτε μια κατηγορία',
        +    'select_department'       => 'Select a Department',
        +    'select_depreciation'	=> 'Επιλέξτε τύπο απόσβεσης',
        +    'select_location'		=> 'Επιλέξτε τοποθεσία',
        +    'select_manufacturer'	=> 'Επιλέξτε έναν κατασκευαστή',
        +    'select_model'			=> 'Επιλέξτε ένα μοντέλο',
        +    'select_supplier'		=> 'Επιλέξτε έναν προμηθευτή',
        +    'select_user'			=> 'Επιλέξτε χρήστη',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
        +    'select_statuslabel'	=> 'Επιλέξτε τύπο',
        +    'select_company'    	=> 'Επιλογή εταιρείας',
        +    'select_asset'    		=> 'Επιλογή παγίου',
        +    'settings'				=> 'Ρυθμίσεις',
        +    'sign_in'				=> 'Είσοδος',
        +    'signature'             => 'Υπογραφή',
             'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        -    'site_name'				=> 'Site Name',
        -    'state'  				=> 'State',
        -    'status_labels'			=> 'Status Labels',
        -    'status'    			=> 'Status',
        -    'supplier'              => 'Supplier',
        -    'suppliers'  			=> 'Suppliers',
        -    'submit'				=> 'Submit',
        -    'total_assets'			=> 'total assets',
        -    'total_licenses'		=> 'total licenses',
        -    'total_accessories'		=> 'total accessories',
        +    'site_name'				=> 'Όνομα ιστότοπου',
        +    'state'  				=> 'Κατάσταση',
        +    'status_labels'			=> 'Ετικέτα Κατάστασης',
        +    'status'    			=> 'Κατάσταση',
        +    'supplier'              => 'Προμηθευτής',
        +    'suppliers'  			=> 'Προμηθευτές',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
        +    'submit'				=> 'Υποβολή',
        +    'target'                => 'Στόχος',
        +    'time_and_date_display' => 'Time and Date Display',
        +    'total_assets'			=> 'σύνολο Παγίων',
        +    'total_licenses'		=> 'σύνολο αδειών',
        +    'total_accessories'		=> 'σύνολο εξαρτημάτων',
             'total_consumables'		=> 'total consumables',
        -    'type'  				=> 'Type',
        +    'type'  				=> 'Είδος',
             'undeployable'			=> 'Un-deployable',
        -    'unknown_admin'			=> 'Unknown Admin',
        -    'username_format'		=> 'Username Format',
        -    'update'                => 'Update',
        -    'uploaded'              => 'Uploaded',
        -    'user'					=> 'User',
        -    'accepted'			    => 'accepted',
        -    'declined'			    => 'declined',
        -    'unaccepted_asset_report' => 'Unaccepted Assets',
        -    'users'                 => 'Users',
        +    'unknown_admin'			=> 'Άγνωστο Admin',
        +    'username_format'		=> 'Τύπος ονόματος',
        +    'update'                => 'Ενημέρωση',
        +    'uploaded'              => 'Ανέβηκε',
        +    'user'					=> 'Χρήστης',
        +    'accepted'			    => 'αποδεκτή',
        +    'declined'			    => 'απορρίφθηκε',
        +    'unaccepted_asset_report' => 'Μη αποδεκτά πάγια',
        +    'users'                 => 'Χρήστες',
             'viewassets'  			=> 'View Assigned Assets',
        -    'website'               => 'Website',
        -    'welcome'				=> 'Welcome, :name',
        -    'years'					=> 'years',
        -    'yes' 					=> 'Yes',
        -    'zip'  					=> 'Zip',
        -    'noimage'					=> 'No image uploaded or image not found.',
        -    'token_expired'             => 'Your form session has expired. Please try again.',
        +    'website'               => 'Τοποθεσία web',
        +    'welcome'				=> 'Καλώς ήρθατε, %name',
        +    'years'					=> 'έτη',
        +    'yes' 					=> 'Ναι',
        +    'zip'  					=> 'Ταχυδρομικός κώδικας',
        +    'noimage'					=> 'Δεν έχει μεταφορτωθεί εικόνα ή η εικόνα δεν βρέθηκε.',
        +    'token_expired'             => 'Έχει λήξει η συνεδρία σας. Παρακαλώ συνδεθείτε ξανά.',
             ];
        diff --git a/resources/lang/el/mail.php b/resources/lang/el/mail.php
        index c9a4fe182d..6e54531c3c 100644
        --- a/resources/lang/el/mail.php
        +++ b/resources/lang/el/mail.php
        @@ -1,41 +1,41 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        +    'a_user_canceled' => 'Ένας χρήστης έχει ακυρώσει μια αίτηση στοιχείο στην ιστοσελίδα',
        +    'a_user_requested' => 'Ο χρήστης έχει ζητήσει ένα στοιχείο στην ιστοσελίδα',
        +    'accessory_name' => 'Όνομα ανταλλακτικού:',
        +    'additional_notes' => 'Πρόσθετες σημειώσεις:',
        +    'admin_has_created' => 'Ένας διαχειριστής έχει δημιουργήσει ένα λογαριασμό για εσάς στην: web ιστοσελίδα.',
        +    'asset' => 'Πάγιο:',
        +    'asset_name' => 'Όνομα του περιουσιακού στοιχείου:',
        +    'asset_requested' => 'Πάγιο αίτήθηκε',
        +    'asset_tag' => 'Ετικέτα παγίων:',
             'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
                                             expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        +    'assigned_to' => 'Ανατέθηκε στον',
        +    'best_regards' => 'Τις καλύτερες ευχές,',
        +    'canceled' => 'Ακυρωμένο:',
        +    'checkin_date' => 'Ημερομηνία άφιξης:',
        +    'checkout_date' => 'Ημερομηνία αποχώρησης:',
             'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
             'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
             'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        +    'Confirm_Asset_Checkin' => 'Επιβεβαιώσετε τη μεταβίβαση παγίου.',
             'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
             'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
             'Confirm_asset_delivery' => 'Confirm asset delivery.',
             'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        +    'current_QTY' => 'Τρέχουσα ποσότητα',
        +    'Days' => 'Ημέρες',
             'days' => 'Days',
             'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        +    'expires' => 'Λήξη',
        +    'Expiring_Assets_Report' => 'Αναφορά λήξης παγίων.',
        +    'Expiring_Licenses_Report' => 'Αναφορά λήξης αδειών.',
        +    'hello' => 'Γεια',
        +    'hi' => 'Γεια σας',
        +    'i_have_read' => 'Έχω διαβάσει και συμφωνώ με τους όρους χρήσης, και έχω λάβει αυτό το στοιχείο.',
        +    'item' => 'Αντικείμενο:',
             'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
                                       inventory or will soon be low.',
             'Item_Request_Canceled' => 'Item Request Canceled',
        @@ -45,22 +45,22 @@ return array(
             'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
             'login' => 'Login:',
             'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        +    'min_QTY' => 'Ελάχιστη ποσότητα',
        +    'name' => 'Όνομα',
             'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'password' => 'Κωδικός:',
        +    'password_reset' => 'Επαναφορά κωδικού πρόσβασης',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        +    'read_the_terms' => 'Παρακαλώ διαβάστε του παρακάτω όρους.',
             'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
                                  and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        +    'requested' => 'Ζητήθηκαν:',
        +    'reset_link' => 'Αποστολή συνδέσμου ακύρωσης κωδικού',
        +    'reset_password' => 'Κάντε κλικ εδώ για να επαναφέρετε τον κωδικό πρόσβασής σας:',
        +    'serial' => 'Σειριακός:',
        +    'supplier' => 'Προμηθευτές',
        +    'tag' => 'Ετικέτα',
        +    'test_email' => 'Έλεγχος email για Snipe-IT',
             'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
             'the_following_item' => 'The following item has been checked in: ',
             'There_are' => '{1} There is|[2,Inf] There are',
        @@ -68,7 +68,7 @@ return array(
             'type' => 'Type',
             'user' => 'User:',
             'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        +    'welcome' => 'Καλώς ήρθατε, %name',
        +    'welcome_to' => 'Καλώς ήλθατε στο!',
             'your_credentials' => 'Your Snipe-IT credentials',
         );
        diff --git a/resources/lang/el/pagination.php b/resources/lang/el/pagination.php
        index b573b51e91..a4fea4c5b5 100644
        --- a/resources/lang/el/pagination.php
        +++ b/resources/lang/el/pagination.php
        @@ -13,8 +13,8 @@ return array(
             |
             */
         
        -    'previous' => '&laquo; Previous',
        +    'previous' => '&laquo; προηγούμενο',
         
        -    'next'     => 'Next &raquo;',
        +    'next'     => 'Επόμενο &raquo?',
         
         );
        diff --git a/resources/lang/el/passwords.php b/resources/lang/el/passwords.php
        index 5195a9b77c..33e211c7b8 100644
        --- a/resources/lang/el/passwords.php
        +++ b/resources/lang/el/passwords.php
        @@ -1,7 +1,7 @@
         <?php
         
         return [
        -    'sent'	        => 'Your password link has been sent!',
        +    'sent'	        => 'Ο σύνδεσμος κωδικού πρόσβασης σας έχει σταλεί!',
             'user'			=> 'That user does not exist or does not have an email address associated',
         ];
         
        diff --git a/resources/lang/el/reminders.php b/resources/lang/el/reminders.php
        index e7a476e3a2..5d8811ffda 100644
        --- a/resources/lang/el/reminders.php
        +++ b/resources/lang/el/reminders.php
        @@ -13,12 +13,12 @@ return array(
             |
             */
         
        -    "password" => "Passwords must be six characters and match the confirmation.",
        +    "password" => "Οι κωδικοί πρόσβασης πρέπει να είναι έξι χαρακτήρες και να ταιριάζουν με την επιβεβαίωση.",
         
        -    "user"     => "Username or email address is incorrect",
        +    "user"     => "Το όνομα χρήστη ή η διεύθυνση ηλεκτρονικού ταχυδρομείου είναι εσφαλμένη",
         
        -    "token"    => "This password reset token is invalid.",
        +    "token"    => "Αυτό το διακριτικό επαναφοράς κωδικού πρόσβασης δεν είναι έγκυρο.",
         
        -    "sent" => "If a matching email address was found, a password reminder has been sent!",
        +    "sent" => "Εάν βρεθεί μια αντίστοιχη διεύθυνση ηλεκτρονικού ταχυδρομείου, μια υπενθύμιση κωδικού πρόσβασης έχει σταλεί!",
         
         );
        diff --git a/resources/lang/el/table.php b/resources/lang/el/table.php
        index f7a49d86c1..717fdcf1bb 100644
        --- a/resources/lang/el/table.php
        +++ b/resources/lang/el/table.php
        @@ -2,9 +2,9 @@
         
         return array(
         
        -    'actions'	 	=> 'Actions',
        -    'action' 		=> 'Action',
        -    'by'      		=> 'By',
        -    'item' 			=> 'Item',
        +    'actions'	 	=> 'Ενέργειες',
        +    'action' 		=> 'Ενέργεια',
        +    'by'      		=> 'Από',
        +    'item' 			=> 'Αντικείμενο',
         
         );
        diff --git a/resources/lang/el/validation.php b/resources/lang/el/validation.php
        index 03c7471cab..43de91f701 100644
        --- a/resources/lang/el/validation.php
        +++ b/resources/lang/el/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'Το: χαρακτηριστικό πρέπει να γίνει δεκτό.',
        +    'active_url'           => 'Η: το χαρακτηριστικό δεν έχει έγκυρη διεύθυνση URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'Η: το χαρακτηριστικό μπορεί να περιέχει μόνο γράμματα.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'Το χαρακτηριστικό πρέπει να είναι μεταξύ: min - :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'Το επιλεγμένο: χαρακτηριστικό δεν είναι έγκυρο.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'Το: χαρακτηριστικό πρέπει να είναι μια εικόνα.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Το επιλεγμένο: χαρακτηριστικό δεν είναι έγκυρο.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/en-GB/admin/asset_maintenances/message.php b/resources/lang/en-GB/admin/asset_maintenances/message.php
        index ca4256efbe..d121115825 100644
        --- a/resources/lang/en-GB/admin/asset_maintenances/message.php
        +++ b/resources/lang/en-GB/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Asset Maintenance was not created, please try again.',
                     'success' => 'Asset Maintenance created successfully.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Not Completed Yet',
                 'warranty'                     => 'Warranty',
                 'not_warranty'                 => 'Not Warranty',
        diff --git a/resources/lang/en-GB/admin/categories/general.php b/resources/lang/en-GB/admin/categories/general.php
        index 2a00f82a67..16b3b79f51 100644
        --- a/resources/lang/en-GB/admin/categories/general.php
        +++ b/resources/lang/en-GB/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Edit Category',
             'eula_text'							=> 'Category EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
        diff --git a/resources/lang/en-GB/admin/custom_fields/message.php b/resources/lang/en-GB/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/en-GB/admin/custom_fields/message.php
        +++ b/resources/lang/en-GB/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/en-GB/admin/departments/message.php b/resources/lang/en-GB/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/en-GB/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/en-GB/admin/departments/table.php b/resources/lang/en-GB/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/en-GB/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/en-GB/admin/hardware/general.php b/resources/lang/en-GB/admin/hardware/general.php
        index f7644eb730..1def86dc9e 100644
        --- a/resources/lang/en-GB/admin/hardware/general.php
        +++ b/resources/lang/en-GB/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clone Asset',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/en-GB/admin/hardware/message.php b/resources/lang/en-GB/admin/hardware/message.php
        index d27ca91573..112cf77ded 100644
        --- a/resources/lang/en-GB/admin/hardware/message.php
        +++ b/resources/lang/en-GB/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/en-GB/admin/locations/table.php b/resources/lang/en-GB/admin/locations/table.php
        index e171d4dd4e..ffa69307d5 100644
        --- a/resources/lang/en-GB/admin/locations/table.php
        +++ b/resources/lang/en-GB/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locations',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/en-GB/admin/manufacturers/table.php b/resources/lang/en-GB/admin/manufacturers/table.php
        index f66320fe8d..4e3ea9904d 100644
        --- a/resources/lang/en-GB/admin/manufacturers/table.php
        +++ b/resources/lang/en-GB/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Asset Manufacturers',
             'create'				=> 'Create Manufacturer',
             'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/en-GB/admin/models/message.php b/resources/lang/en-GB/admin/models/message.php
        index fe51cb8d4c..5b1b9a1a1b 100644
        --- a/resources/lang/en-GB/admin/models/message.php
        +++ b/resources/lang/en-GB/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/en-GB/admin/settings/general.php b/resources/lang/en-GB/admin/settings/general.php
        index 893661789f..bb12b53538 100644
        --- a/resources/lang/en-GB/admin/settings/general.php
        +++ b/resources/lang/en-GB/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/en-GB/admin/users/general.php b/resources/lang/en-GB/admin/users/general.php
        index 92ee04b491..985138d065 100644
        --- a/resources/lang/en-GB/admin/users/general.php
        +++ b/resources/lang/en-GB/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Clone User',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Edit User',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Last Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        diff --git a/resources/lang/en-GB/admin/users/message.php b/resources/lang/en-GB/admin/users/message.php
        index a1a9757e86..8ee552afab 100644
        --- a/resources/lang/en-GB/admin/users/message.php
        +++ b/resources/lang/en-GB/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'User already exists!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'User was successfully deleted.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/en-GB/admin/users/table.php b/resources/lang/en-GB/admin/users/table.php
        index 8c9b40a454..9bbe883e19 100644
        --- a/resources/lang/en-GB/admin/users/table.php
        +++ b/resources/lang/en-GB/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Active',
             'allow'  				=> 'Allow',
             'checkedout'  			=> 'Assets',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Location',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Name',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirm Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Update User',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Clone User',
             'viewusers' 			=> 'View Users',
        diff --git a/resources/lang/en-GB/button.php b/resources/lang/en-GB/button.php
        index 14aedbf0fe..6964689762 100644
        --- a/resources/lang/en-GB/button.php
        +++ b/resources/lang/en-GB/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Actions',
             'add'    	                => 'Add New',
             'cancel'                    => 'Cancel',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Submit',
             'upload'                    => 'Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/en-GB/general.php b/resources/lang/en-GB/general.php
        index f400b09427..78bbbd6881 100644
        --- a/resources/lang/en-GB/general.php
        +++ b/resources/lang/en-GB/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Asset Report',
             'asset_tag'				=> 'Asset Tag',
             'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Assets',
             'avatar_delete'         => 'Delete Avatar',
             'avatar_upload'         => 'Upload Avatar',
             'back'      			=> 'Back',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Cancel',
             'categories'			=> 'Categories',
             'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Change Email Address',
             'changepassword'  		=> 'Change Password',
             'checkin'  				=> 'Checkin',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Checkout',
             'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Country',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'created asset',
             'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '£', // this is deprecated
             'current'  				=> 'Current',
             'custom_report'         => 'Custom Asset Report',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Date',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Delete',
             'deleted'  				=> 'Deleted',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Deployed',
             'depreciation_report'	=> 'Depreciation Report',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Last Name',
             'license'				=> 'License',
             'license_report'        => 'License Report',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'More Info',
             'name'					=> 'Name',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'No Depreciation',
             'no_results'			=> 'No Results.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'total assets',
             'total_licenses'		=> 'total licenses',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/en-GB/validation.php b/resources/lang/en-GB/validation.php
        index 03c7471cab..1e902ebbbd 100644
        --- a/resources/lang/en-GB/validation.php
        +++ b/resources/lang/en-GB/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min - :max.',
        +        'file'    => 'The :attribute must be between :min - :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min - :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute format is invalid.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/en-ID/admin/asset_maintenances/form.php b/resources/lang/en-ID/admin/asset_maintenances/form.php
        index e10573e77f..095d05bd6e 100644
        --- a/resources/lang/en-ID/admin/asset_maintenances/form.php
        +++ b/resources/lang/en-ID/admin/asset_maintenances/form.php
        @@ -10,5 +10,5 @@
                 'asset_maintenance_time' => 'Waktu Maintenance aset (dalam hari)',
                 'notes'                  => 'Catatan',
                 'update'                 => 'Update Maintenance Aset',
        -        'create'                 => 'Buat Maintenance Aset'
        +        'create'                 => 'Erstellen'
             ];
        diff --git a/resources/lang/en-ID/admin/asset_maintenances/message.php b/resources/lang/en-ID/admin/asset_maintenances/message.php
        index f390be79a5..8fe4ac8486 100644
        --- a/resources/lang/en-ID/admin/asset_maintenances/message.php
        +++ b/resources/lang/en-ID/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Pemeliharaan Aset gagal dibuat, silakan coba lagi.',
                     'success' => 'Pemeliharaan Aset berhasil dibuat.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Belum selesai',
                 'warranty'                     => 'Jaminan',
                 'not_warranty'                 => 'Tidak ada Jaminan',
        diff --git a/resources/lang/en-ID/admin/asset_maintenances/table.php b/resources/lang/en-ID/admin/asset_maintenances/table.php
        index 9acd9ca19e..600429b236 100644
        --- a/resources/lang/en-ID/admin/asset_maintenances/table.php
        +++ b/resources/lang/en-ID/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Pemeliharaan Aset',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nama Aset',
                 'is_warranty'   => 'Jaminan',
                 'dl_csv'        => 'Unduh CSV'
             ];
        diff --git a/resources/lang/en-ID/admin/categories/general.php b/resources/lang/en-ID/admin/categories/general.php
        index 7e17f5bb3d..1a4c60f841 100644
        --- a/resources/lang/en-ID/admin/categories/general.php
        +++ b/resources/lang/en-ID/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Tentang Kategori',
        +    'about_categories'  				=> 'Kategori membantu mengatur barang-barang anda. Beberapa contoh kategori seperti &quot;Desktop&quot;, &quot;Laptop&quot;, &quot;Mobile Phones&quot;, &quot;Tablet&quot;, dan sebagainya, namun Anda tetap dapat menggunakan kategori dengan cara apapun yang masuk akal bagi Anda.',
             'asset_categories' 					=> 'Kategori Aset',
             'category_name'  					=> 'Nama Kategori',
             'checkin_email'                     => 'Kirim email ke pengguna saat pengecekan.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Edit Kategori',
             'eula_text'							=> 'Kategori EULA',
             'eula_text_help'					=> 'Bidang ini memungkinkan Anda untuk menyesuaikan EULA Anda untuk jenis tertentu dari aset. Jika Anda hanya memiliki satu EULA untuk semua aset Anda, Anda dapat memeriksa kotak di bawah untuk menggunakan default primer.',
        +    'name'                              => 'Nama Kategori',
             'require_acceptance'				=> 'Mengharuskan pengguna untuk mengkonfirmasi penerimaan aset dalam kategori ini.',
             'required_acceptance'				=> 'Pengguna ini akan dikirimkan melalui email dengan link untuk mengkonfirmasi penerimaan item ini.',
             'required_eula'						=> 'Pengguna ini akan dikirimkan melalui email salinan EULA',
        diff --git a/resources/lang/en-ID/admin/companies/general.php b/resources/lang/en-ID/admin/companies/general.php
        index 9faf0b53ac..a0e42c1e7f 100644
        --- a/resources/lang/en-ID/admin/companies/general.php
        +++ b/resources/lang/en-ID/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Tentang Perusahaan',
        +    'about_companies_text'                  => 'Cabang dapat digunakan untuk identitas atau untuk mengatur akses terhadap aset, user, dll.',
             'select_company' => 'Pilih Perusahaan',
         ];
        diff --git a/resources/lang/en-ID/admin/custom_fields/message.php b/resources/lang/en-ID/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/en-ID/admin/custom_fields/message.php
        +++ b/resources/lang/en-ID/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/en-ID/admin/departments/message.php b/resources/lang/en-ID/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/en-ID/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/en-ID/admin/departments/table.php b/resources/lang/en-ID/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/en-ID/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/en-ID/admin/hardware/general.php b/resources/lang/en-ID/admin/hardware/general.php
        index f7644eb730..1def86dc9e 100644
        --- a/resources/lang/en-ID/admin/hardware/general.php
        +++ b/resources/lang/en-ID/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clone Asset',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/en-ID/admin/hardware/message.php b/resources/lang/en-ID/admin/hardware/message.php
        index d27ca91573..112cf77ded 100644
        --- a/resources/lang/en-ID/admin/hardware/message.php
        +++ b/resources/lang/en-ID/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/en-ID/admin/locations/table.php b/resources/lang/en-ID/admin/locations/table.php
        index e171d4dd4e..ffa69307d5 100644
        --- a/resources/lang/en-ID/admin/locations/table.php
        +++ b/resources/lang/en-ID/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locations',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/en-ID/admin/manufacturers/table.php b/resources/lang/en-ID/admin/manufacturers/table.php
        index f66320fe8d..4e3ea9904d 100644
        --- a/resources/lang/en-ID/admin/manufacturers/table.php
        +++ b/resources/lang/en-ID/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Asset Manufacturers',
             'create'				=> 'Create Manufacturer',
             'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/en-ID/admin/models/message.php b/resources/lang/en-ID/admin/models/message.php
        index fe51cb8d4c..5b1b9a1a1b 100644
        --- a/resources/lang/en-ID/admin/models/message.php
        +++ b/resources/lang/en-ID/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/en-ID/admin/settings/general.php b/resources/lang/en-ID/admin/settings/general.php
        index 1a6b2d4797..73fd052a58 100644
        --- a/resources/lang/en-ID/admin/settings/general.php
        +++ b/resources/lang/en-ID/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/en-ID/admin/users/general.php b/resources/lang/en-ID/admin/users/general.php
        index 92ee04b491..985138d065 100644
        --- a/resources/lang/en-ID/admin/users/general.php
        +++ b/resources/lang/en-ID/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Clone User',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Edit User',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Last Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        diff --git a/resources/lang/en-ID/admin/users/message.php b/resources/lang/en-ID/admin/users/message.php
        index a1a9757e86..8ee552afab 100644
        --- a/resources/lang/en-ID/admin/users/message.php
        +++ b/resources/lang/en-ID/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'User already exists!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'User was successfully deleted.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/en-ID/admin/users/table.php b/resources/lang/en-ID/admin/users/table.php
        index 8c9b40a454..9bbe883e19 100644
        --- a/resources/lang/en-ID/admin/users/table.php
        +++ b/resources/lang/en-ID/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Active',
             'allow'  				=> 'Allow',
             'checkedout'  			=> 'Assets',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Location',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Name',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirm Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Update User',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Clone User',
             'viewusers' 			=> 'View Users',
        diff --git a/resources/lang/en-ID/button.php b/resources/lang/en-ID/button.php
        index 14aedbf0fe..6964689762 100644
        --- a/resources/lang/en-ID/button.php
        +++ b/resources/lang/en-ID/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Actions',
             'add'    	                => 'Add New',
             'cancel'                    => 'Cancel',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Submit',
             'upload'                    => 'Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/en-ID/general.php b/resources/lang/en-ID/general.php
        index a6b8407cf3..3c688aada1 100644
        --- a/resources/lang/en-ID/general.php
        +++ b/resources/lang/en-ID/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Asset Report',
             'asset_tag'				=> 'Asset Tag',
             'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Assets',
             'avatar_delete'         => 'Delete Avatar',
             'avatar_upload'         => 'Upload Avatar',
             'back'      			=> 'Back',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Cancel',
             'categories'			=> 'Categories',
             'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Change Email Address',
             'changepassword'  		=> 'Change Password',
             'checkin'  				=> 'Checkin',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Checkout',
             'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Country',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'created asset',
             'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> 'IDR', // this is deprecated
             'current'  				=> 'Current',
             'custom_report'         => 'Custom Asset Report',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Date',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Delete',
             'deleted'  				=> 'Deleted',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Deployed',
             'depreciation_report'	=> 'Depreciation Report',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Last Name',
             'license'				=> 'License',
             'license_report'        => 'License Report',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'More Info',
             'name'					=> 'Name',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'No Depreciation',
             'no_results'			=> 'No Results.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'total assets',
             'total_licenses'		=> 'total licenses',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/en-ID/validation.php b/resources/lang/en-ID/validation.php
        index 03c7471cab..1e902ebbbd 100644
        --- a/resources/lang/en-ID/validation.php
        +++ b/resources/lang/en-ID/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min - :max.',
        +        'file'    => 'The :attribute must be between :min - :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min - :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute format is invalid.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/en/admin/asset_maintenances/message.php b/resources/lang/en/admin/asset_maintenances/message.php
        index ca4256efbe..d121115825 100644
        --- a/resources/lang/en/admin/asset_maintenances/message.php
        +++ b/resources/lang/en/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Asset Maintenance was not created, please try again.',
                     'success' => 'Asset Maintenance created successfully.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Not Completed Yet',
                 'warranty'                     => 'Warranty',
                 'not_warranty'                 => 'Not Warranty',
        diff --git a/resources/lang/en/admin/categories/general.php b/resources/lang/en/admin/categories/general.php
        index 2a00f82a67..16b3b79f51 100644
        --- a/resources/lang/en/admin/categories/general.php
        +++ b/resources/lang/en/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Edit Category',
             'eula_text'							=> 'Category EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
        diff --git a/resources/lang/en/admin/custom_fields/message.php b/resources/lang/en/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/en/admin/custom_fields/message.php
        +++ b/resources/lang/en/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/en/admin/departments/message.php b/resources/lang/en/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/en/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/en/admin/departments/table.php b/resources/lang/en/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/en/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/en/admin/hardware/general.php b/resources/lang/en/admin/hardware/general.php
        index f7644eb730..1def86dc9e 100644
        --- a/resources/lang/en/admin/hardware/general.php
        +++ b/resources/lang/en/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clone Asset',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/en/admin/hardware/message.php b/resources/lang/en/admin/hardware/message.php
        index d27ca91573..112cf77ded 100644
        --- a/resources/lang/en/admin/hardware/message.php
        +++ b/resources/lang/en/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/en/admin/locations/table.php b/resources/lang/en/admin/locations/table.php
        index e171d4dd4e..ffa69307d5 100644
        --- a/resources/lang/en/admin/locations/table.php
        +++ b/resources/lang/en/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locations',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/en/admin/manufacturers/table.php b/resources/lang/en/admin/manufacturers/table.php
        index f66320fe8d..4e3ea9904d 100644
        --- a/resources/lang/en/admin/manufacturers/table.php
        +++ b/resources/lang/en/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Asset Manufacturers',
             'create'				=> 'Create Manufacturer',
             'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/en/admin/models/message.php b/resources/lang/en/admin/models/message.php
        index fe51cb8d4c..5b1b9a1a1b 100644
        --- a/resources/lang/en/admin/models/message.php
        +++ b/resources/lang/en/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/en/admin/settings/general.php b/resources/lang/en/admin/settings/general.php
        index 1a6b2d4797..73fd052a58 100644
        --- a/resources/lang/en/admin/settings/general.php
        +++ b/resources/lang/en/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/en/admin/users/general.php b/resources/lang/en/admin/users/general.php
        index 92ee04b491..985138d065 100644
        --- a/resources/lang/en/admin/users/general.php
        +++ b/resources/lang/en/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Clone User',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Edit User',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Last Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        diff --git a/resources/lang/en/admin/users/message.php b/resources/lang/en/admin/users/message.php
        index a1a9757e86..8ee552afab 100644
        --- a/resources/lang/en/admin/users/message.php
        +++ b/resources/lang/en/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'User already exists!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'User was successfully deleted.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/en/admin/users/table.php b/resources/lang/en/admin/users/table.php
        index 8c9b40a454..9bbe883e19 100644
        --- a/resources/lang/en/admin/users/table.php
        +++ b/resources/lang/en/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Active',
             'allow'  				=> 'Allow',
             'checkedout'  			=> 'Assets',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Location',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Name',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirm Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Update User',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Clone User',
             'viewusers' 			=> 'View Users',
        diff --git a/resources/lang/en/button.php b/resources/lang/en/button.php
        index 14aedbf0fe..6964689762 100644
        --- a/resources/lang/en/button.php
        +++ b/resources/lang/en/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Actions',
             'add'    	                => 'Add New',
             'cancel'                    => 'Cancel',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Submit',
             'upload'                    => 'Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/en/general.php b/resources/lang/en/general.php
        index 16c38b1721..eb6409ddbb 100644
        --- a/resources/lang/en/general.php
        +++ b/resources/lang/en/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Asset Report',
             'asset_tag'				=> 'Asset Tag',
             'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Assets',
             'avatar_delete'         => 'Delete Avatar',
             'avatar_upload'         => 'Upload Avatar',
             'back'      			=> 'Back',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Cancel',
             'categories'			=> 'Categories',
             'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Change Email Address',
             'changepassword'  		=> 'Change Password',
             'checkin'  				=> 'Checkin',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Checkout',
             'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Country',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'created asset',
             'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Current',
             'custom_report'         => 'Custom Asset Report',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Date',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Delete',
             'deleted'  				=> 'Deleted',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Deployed',
             'depreciation_report'	=> 'Depreciation Report',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Last Name',
             'license'				=> 'License',
             'license_report'        => 'License Report',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'More Info',
             'name'					=> 'Name',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'No Depreciation',
             'no_results'			=> 'No Results.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'total assets',
             'total_licenses'		=> 'total licenses',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php
        index 03c7471cab..1e902ebbbd 100644
        --- a/resources/lang/en/validation.php
        +++ b/resources/lang/en/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min - :max.',
        +        'file'    => 'The :attribute must be between :min - :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min - :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute format is invalid.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/es-CO/admin/asset_maintenances/message.php b/resources/lang/es-CO/admin/asset_maintenances/message.php
        index daace80c32..e1ef11e4e8 100644
        --- a/resources/lang/es-CO/admin/asset_maintenances/message.php
        +++ b/resources/lang/es-CO/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Mantenimiento de Activos no fue creado, por favor intentelo de nuevo.',
                     'success' => 'Mantenimiento de Activo creado correctamente.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Sin Completar',
                 'warranty'                     => 'Garantía',
                 'not_warranty'                 => 'Sin Garantía',
        diff --git a/resources/lang/es-CO/admin/asset_maintenances/table.php b/resources/lang/es-CO/admin/asset_maintenances/table.php
        index 75b3840bd2..f63124dd19 100644
        --- a/resources/lang/es-CO/admin/asset_maintenances/table.php
        +++ b/resources/lang/es-CO/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Mantenimiento de Equipo',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nombre del Equipo',
                 'is_warranty'   => 'Garantía',
                 'dl_csv'        => 'Descargar CSV'
             ];
        diff --git a/resources/lang/es-CO/admin/categories/general.php b/resources/lang/es-CO/admin/categories/general.php
        index 15c5129871..7217a16a90 100644
        --- a/resources/lang/es-CO/admin/categories/general.php
        +++ b/resources/lang/es-CO/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Sobre categorias',
        +    'about_categories'  				=> 'Las categorías te ayudan a organizar los equipos. Ejemplos de categorías: &quot;PCs&quot;, &quot;Portátiles&quot;, &quot;Móviles&quot;, &quot;Tabletas&quot;, etc.',
             'asset_categories' 					=> 'Categorias',
             'category_name'  					=> 'Categoría',
             'checkin_email'                     => 'Enviar un correo al usuario al efectuar la devolución.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Editar Categoría',
             'eula_text'							=> 'Categoría EULA',
             'eula_text_help'					=> 'Este campo permite personalizar sus EULAs para tipos específicos de equipos. Si solo tiene un EULA para todos sus equipos, puede seleccionar la siguiente opción para usar el valor por defecto.',
        +    'name'                              => 'Nombre de la categoría',
             'require_acceptance'				=> 'Requerir confirmación de usuarios para la aceptación de equipos en esta categoría.',
             'required_acceptance'				=> 'Se enviará  un email a este usuario con un link para confirmar la aceptación de este item.',
             'required_eula'						=> 'Se enviará  un email a este usuario con una copia del EULA',
        diff --git a/resources/lang/es-CO/admin/companies/general.php b/resources/lang/es-CO/admin/companies/general.php
        index d0633472c4..5a0aee84b2 100644
        --- a/resources/lang/es-CO/admin/companies/general.php
        +++ b/resources/lang/es-CO/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Sobre las empresas',
        +    'about_companies_text'                  => 'Empresas pueden ser utilizadas como un campo de identificador simple, o pueden utilizarse para limitar la visibilidad de los activos, usuarios, etc, si el soporte completo a la empresa está habilitado en la configuración del Admin.',
             'select_company' => 'Seleccionar compañía',
         ];
        diff --git a/resources/lang/es-CO/admin/consumables/general.php b/resources/lang/es-CO/admin/consumables/general.php
        index 94d476ca29..ec6dba48d6 100644
        --- a/resources/lang/es-CO/admin/consumables/general.php
        +++ b/resources/lang/es-CO/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> 'Acerca de los consumibles',
             'about_consumables_text'  			=> 'Consumibles son cualquier cosa comprada que puede ser usada a lo largo del tiempo. Por ejemplo, tinta para impresora o papel para copiadora.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'Checkout de consumible a usuario',
             'consumable_name'                   => 'Nombre del Consumible',
             'create'                            => 'Crear Consumible',
             'item_no'                           => 'Artículo núm.',
        diff --git a/resources/lang/es-CO/admin/custom_fields/general.php b/resources/lang/es-CO/admin/custom_fields/general.php
        index 37fceaf6bf..79cec15185 100644
        --- a/resources/lang/es-CO/admin/custom_fields/general.php
        +++ b/resources/lang/es-CO/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'Acerca de los campos personalizados',
             'about_fieldsets_text'		=> 'Los grupos de campos personalizados te permiten agrupar campos que se usan frecuentemente para determinados modelos de equipos.',
             'custom_format'             => 'Formato a medida...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Encriptar el valor de este campo en la base de datos',
             'encrypt_field_help'      => 'CUIDADO: Encriptar un campo hace que no se pueda buscar por él.',
             'encrypted'      	        => 'Encriptado',
             'fieldset'      	        => 'Grupo de campos personalizados',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Nombre del grupo',
             'field_name'              => 'Nombre del campo',
             'field_values'            => 'Valores de los Campos',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Agregar opciones seleccionables, una por linea. Lineas en blanco ademas de la primera, serán ignoradas.',
             'field_element'           => 'Elemento de formulario',
             'field_element_short'     => 'Elemento',
             'field_format'            => 'Formato',
        diff --git a/resources/lang/es-CO/admin/custom_fields/message.php b/resources/lang/es-CO/admin/custom_fields/message.php
        index 3ee148ead0..d7dc22dc30 100644
        --- a/resources/lang/es-CO/admin/custom_fields/message.php
        +++ b/resources/lang/es-CO/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'El grupo de campos no ha sido creado, por favor inténtelo de nuevo.',
        diff --git a/resources/lang/es-CO/admin/departments/message.php b/resources/lang/es-CO/admin/departments/message.php
        new file mode 100644
        index 0000000000..740b38b39d
        --- /dev/null
        +++ b/resources/lang/es-CO/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'El departamento no existe.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'El departamento ha sido borrado exitosamente'
        +    )
        +
        +);
        diff --git a/resources/lang/es-CO/admin/departments/table.php b/resources/lang/es-CO/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/es-CO/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/es-CO/admin/depreciations/general.php b/resources/lang/es-CO/admin/depreciations/general.php
        index 9743de920a..f5c6d6e9fd 100644
        --- a/resources/lang/es-CO/admin/depreciations/general.php
        +++ b/resources/lang/es-CO/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Info Amortización Equipos',
             'about_depreciations'  					=> 'Puedes configurar clases de amortización para amortizar equipos de forma lineal.',
             'asset_depreciations'  					=> 'Amortizaciones',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Crear Amortización',
             'depreciation_name'  					=> 'Nombre Amortización',
             'number_of_months'  					=> 'Meses',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Actualizar Amortización',
         
         );
        diff --git a/resources/lang/es-CO/admin/groups/titles.php b/resources/lang/es-CO/admin/groups/titles.php
        index ba098eb80b..c9d6ca4a6d 100644
        --- a/resources/lang/es-CO/admin/groups/titles.php
        +++ b/resources/lang/es-CO/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Acerca de los grupos',
        +    'about_groups'                  => 'Los Grupos son usados para generar permisos de usuarios.',
             'group_management' 	 	=> 'Gestión de Grupos',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Crear un grupo nuevo',
        +    'update' 	 		        => 'Editar Grupo',
             'group_name' 	 		=> 'Nombre de Grupo',
             'group_admin' 	 		=> 'Admin Grupo',
             'allow' 	 			=> 'Permitir',
        diff --git a/resources/lang/es-CO/admin/hardware/form.php b/resources/lang/es-CO/admin/hardware/form.php
        index 9467058657..f150da59a5 100644
        --- a/resources/lang/es-CO/admin/hardware/form.php
        +++ b/resources/lang/es-CO/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Confirmar eliminación masiva de bienes',
           'bulk_delete_help'	=> 'Revisar los bienes para eliminación masiva. Una vez eliminados, esos bienes pueden ser restaurados, pero no volverán a estar asociados con ningún usuario a los que esté asignado.',
           'bulk_delete_warn'	=> 'Está a punto de borrar :asset_count.',
         	'bulk_update'		=> 'Actualización masiva de Equipos',
        diff --git a/resources/lang/es-CO/admin/hardware/general.php b/resources/lang/es-CO/admin/hardware/general.php
        index 0ff9c61acf..16d2083afc 100644
        --- a/resources/lang/es-CO/admin/hardware/general.php
        +++ b/resources/lang/es-CO/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Acerca de Activos',
        +    'about_assets_text'            => 'Los activos son elementos con número de serie o etiqueta de activos.  Tienden a ser artículos de alto valor donde es importante identificar un elemento específico.',
         	'archived'  				=> 'Archivado',
             'asset'  					=> 'Equipo',
             'bulk_checkout'             => 'Asignar activos a un usuario',
             'checkin'  					=> 'Quitar Equipo',
        -    'checkout'  				=> 'Asignar a un usuario',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clonar Equipo',
             'deployable'  				=> 'Desplegable',
             'deleted'  					=> 'Este equipo ha sido eliminado. <a href="/hardware/:asset_id/restore">Click aqui para restaurarlot</a>.',
        diff --git a/resources/lang/es-CO/admin/hardware/message.php b/resources/lang/es-CO/admin/hardware/message.php
        index 5d0504abf6..96c3b9a6dd 100644
        --- a/resources/lang/es-CO/admin/hardware/message.php
        +++ b/resources/lang/es-CO/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Equipo restaurado correctamente.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Archivo no eliminado. Por favor, vuelva a intentarlo.',
                 'success' => 'Archivo eliminado correctamente.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Estás seguro que quieres eliminar el equipo?',
                 'error'   		=> 'Equipo no eliminado, intentalo de nuevo.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Equipo eliminado.'
             ),
         
        diff --git a/resources/lang/es-CO/admin/licenses/general.php b/resources/lang/es-CO/admin/licenses/general.php
        index 6af5be7810..8a5d6db90e 100644
        --- a/resources/lang/es-CO/admin/licenses/general.php
        +++ b/resources/lang/es-CO/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Acerca de licencias',
        +    'about_licenses'                  => 'Las licencias son para identificar software. Tienen un número específico de asientos que pueden ser asignados a individuos',
             'checkin'  					=> 'Quitar Instalación',
             'checkout_history'  		=> 'Historial Asignaciones',
             'checkout'  				=> 'Asignar Instalación',
        diff --git a/resources/lang/es-CO/admin/licenses/message.php b/resources/lang/es-CO/admin/licenses/message.php
        index 70e73d630b..cff98ee8dd 100644
        --- a/resources/lang/es-CO/admin/licenses/message.php
        +++ b/resources/lang/es-CO/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Archivo(s) no cargado. Por favor, vuelva a intentarlo.',
                 'success' => 'Archivo(s) cargado correctamente.',
                 'nofiles' => 'No ha seleccionado ningun archivo para ser cargado, o el archivo que seleccionó es demasiado grande',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Uno o más de tus ficheros son demasiado grandes o de un tipo no permitido. Los tipos permitidos son png, gif, jpg, doc, docx, pdf, txt, zip, rar, rtf, xml y lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/es-CO/admin/locations/table.php b/resources/lang/es-CO/admin/locations/table.php
        index ed9657f5c7..46efe23134 100644
        --- a/resources/lang/es-CO/admin/locations/table.php
        +++ b/resources/lang/es-CO/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'Acerca de ubicaciones',
        +    'about_locations'           => 'Las Ubicaciones son utilizadas para hacer seguimiento de la información sobre ubicación de usuarios, bienes, y otros items',
             'assets_rtd'                => 'Equipos', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Equipo asignado',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Localizaciones',
             'parent'                    => 'Padre',
             'currency'                  => 'Divisa de la Localización',
        +    'ldap_ou'                   => 'Búsqueda LDAP OU',
             );
        diff --git a/resources/lang/es-CO/admin/manufacturers/table.php b/resources/lang/es-CO/admin/manufacturers/table.php
        index 53fc87cf42..972d33b71b 100644
        --- a/resources/lang/es-CO/admin/manufacturers/table.php
        +++ b/resources/lang/es-CO/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Sobre fabricantes',
        +    'about_manufacturers_text'  => 'Los fabricantes son las empresas que crean sus activos. Aquí puede almacenar importante información de contacto sobre ellos, que se mostrará en sus páginas de detalle de activos.',
             'asset_manufacturers'	=> 'Fabricantes',
             'create'				=> 'Crear Fabricante',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nombre Fabricante',
        +    'name'      			=> 'Nombre',
        +    'support_email'   		=> 'Email de soporte',
        +    'support_phone'   		=> 'Teléfono de soporte',
        +    'support_url'   		=> 'URL de soporte',
             'update'				=> 'Actualizar Fabricante',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/es-CO/admin/models/general.php b/resources/lang/es-CO/admin/models/general.php
        index 7b4b839f44..1463b21cef 100644
        --- a/resources/lang/es-CO/admin/models/general.php
        +++ b/resources/lang/es-CO/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Acerca de modelos de activos',
        +    'about_models_text'           => 'Los Modelos de activos son una forma de agrupar activos idénticos. "MBP 2013", "IPhone 6s", etc.',
             'deleted'  					        => 'Este modelo ha sido borrado.<a href="/hardware/models/:model_id/restore">Click aquí para restaurarlo</a>.',
             'restore'                   => 'Restaurar Modelo',
             'requestable'               => 'Los usuarios pueden solicitar este modelo',
        diff --git a/resources/lang/es-CO/admin/models/message.php b/resources/lang/es-CO/admin/models/message.php
        index c732676053..d0cac6fbc5 100644
        --- a/resources/lang/es-CO/admin/models/message.php
        +++ b/resources/lang/es-CO/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modelo restaurado exitosamente.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/es-CO/admin/settings/general.php b/resources/lang/es-CO/admin/settings/general.php
        index ab9e2166af..d6dbb8a90c 100644
        --- a/resources/lang/es-CO/admin/settings/general.php
        +++ b/resources/lang/es-CO/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Limite de alertas de expiración (en días)',
         	'alert_inv_threshold'		=> 'Umbral de alerta del inventario',
         	'asset_ids'					=> 'IDs de Recurso',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generar IDs de equipo autoincrementales',
         	'auto_increment_prefix'		=> 'Prefijo (opcional)',
         	'auto_incrementing_help'    => 'Activa la generación automática de IDs de equipo antes de configurar esto',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'Email LDAP',
             'load_remote_text'          => 'Scripts remotos',
             'load_remote_help_text'		=> 'Esta instalación de Snipe-IT puede cargar scripts desde fuera.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Usuarios restringidos (incluidos administradores) asignados a compañías de sus bienes de compañía.',
             'full_multiple_companies_support_text' => 'Soporte completo múltiple de compañías',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versión de PHP',
             'php_gd_info'               => 'Debes instalar php-gd para mostrar Códigos QR, ver instrucciones de instalación en <a href="http://www.php.net/manual/en/image.installation.php"></a>.',
             'php_gd_warning'            => 'PHP Image Processing y GD plugin NO instalados.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Activa Códigos QR antes para poder ver esto',
             'qr_text'                   => 'Texto Código QR',
             'setting'                   => 'Parámetro',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Estos ajustes te permiten personalizar ciertos aspectos de tu instalación.',
             'labels_per_page'           => 'Etiquetas por pàgina',
             'label_dimensions'          => 'Dimensiones de las etiquetas (pulgadas)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Margenès de pàgina (pulgadas)',
             'purge'                    => 'Purgar registros eliminados',
             'labels_display_bgutter'    => 'Borde inferior de la Etiqueta',
        @@ -104,25 +117,27 @@ return array(
             'width_w'        => 'an',
             'height_h'        => 'al',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Autenticación en dos pasos',
        +    'two_factor_secret'        => 'Código de verificación en dos pasos',
        +    'two_factor_enrollment'        => 'Enrolamiento en verificación en dos pasos',
        +    'two_factor_enabled_text'        => 'Activar la verificación en dos pasos',
        +    'two_factor_reset'        => 'Reiniciar Secreto de verificación en dos pasos',
        +    'two_factor_reset_help'        => 'Esto forzará al usuario a inscribirse otra vez su dispositivo con Google Authenticator. Esto puede ser útil si la pérdida o robo de su dispositivo actualmente inscrito. ',
        +    'two_factor_reset_success'          => 'Verificación en dos pasos de dispositivo reiniciado exitosamente',
        +    'two_factor_reset_error'          => 'Falló la Verificación en dos pasos del dispositivo',
        +    'two_factor_enabled_warning'        => 'Permitiendo dos factores si no está activado inmediatamente obliga a autenticar con un dispositivo de autenticación de Google inscritos. Usted tendrá la posibilidad de inscribirse el dispositivo si uno no está inscrito actualmente.',
        +    'two_factor_enabled_help'        => 'Esto encenderá la autenticación de dos factores usando Google Authenticator.',
        +    'two_factor_optional'        => 'Selectiva (los usuarios pueden activar o desactivar si está permitido)',
        +    'two_factor_required'        => 'Requerido para todos los usuarios',
        +    'two_factor_disabled'        => 'Desactivado',
        +    'two_factor_enter_code'	=> 'Ingrese código de verificación en dos pasos',
        +    'two_factor_config_complete'	=> 'Enviar código',
        +    'two_factor_enabled_edit_not_allowed' => 'El administrador no permite modificar esta configuración.',
        +    'two_factor_enrollment_text'	=> "Autenticación de doble factor se requiere, sin embargo el dispositivo no ha inscrito todavía. Abra la aplicación Google Authenticator y escanear el código QR a continuación para inscribir a su dispositivo. Una vez que haya inscrito su dispositivo, introduzca el código de abajo",
        +    'require_accept_signature'      => 'Requerir Firma',
        +    'require_accept_signature_help_text'      => 'Para activar esta función se requiere que los usuarios firmen fisicamente aceptando el activo.',
             'left'        => 'izquierda',
             'right'        => 'derecha',
             'top'        => 'arriba',
        diff --git a/resources/lang/es-CO/admin/suppliers/table.php b/resources/lang/es-CO/admin/suppliers/table.php
        index b1354e76a1..f576b2d372 100644
        --- a/resources/lang/es-CO/admin/suppliers/table.php
        +++ b/resources/lang/es-CO/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Acerca de Proveedores',
        +    'about_suppliers_text'  => 'Los Proveedores son utilizados para hacer seguimiento de la fuente de los items',
             'address'               => 'Dirección del Proveedor',
             'assets'                => 'Equipos',
             'city'                  => 'Ciudad',
        diff --git a/resources/lang/es-CO/admin/users/general.php b/resources/lang/es-CO/admin/users/general.php
        index bccf491cd1..ea715cd169 100644
        --- a/resources/lang/es-CO/admin/users/general.php
        +++ b/resources/lang/es-CO/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Equipos asignados a :name',
        +    'bulk_update_warn'	=> 'Estás a punto de modificar las propiedades de :user_count usuarios. Por favor, ten en cuenta que no puedes modificar las propiedades de tu propio usuario con este formulario, y debes realizar las modificaciones a tu propio usuario de forma individual.',
        +    'bulk_update_help'	=> 'Este formulario permite actualizar múltiples usuarios simultáneamente. Rellena únicamente los campos que necesites cambiar. Cualquier campo que quede en blanco no se actualizará.',
             'current_assets'    => 'Equipos checked out a este usuario',
             'clone'             => 'Clonar Usuario',
             'contact_user'      => 'Contacta con :name',
             'edit'              => 'Editar Usuario',
             'filetype_info'     => 'Tipos de archivos permitidos son png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, y rar.',
             'history_user'      => 'Historial de :name',
        +	'info'				=> 'Información',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Último acceso',
             'ldap_config_text'  => 'Las configuraciones de LDAP estàn en: Admin -> Settings. La ubicaciòn seleccionadada sera asignada a todos los usuarios importados.',
             'software_user'     => 'Software asignado a :name',
             'view_user'         => 'Ver Usuario :name',
             'usercsv'           => 'Archivo CSV',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'La actual configuración de administración permite cumplimiento selectivo de autenticación de dos factores.  ',
        +    'two_factor_enrolled' => 'Dispositivo con 2FA inscrito ',
        +    'two_factor_active'   => '2FA Activo ',
             );
        diff --git a/resources/lang/es-CO/admin/users/message.php b/resources/lang/es-CO/admin/users/message.php
        index c7ee709442..e6f7419254 100644
        --- a/resources/lang/es-CO/admin/users/message.php
        +++ b/resources/lang/es-CO/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Ha aceptado con éxito este equipo.',
             'declined'                  => 'Ha declinado con éxito este equipo.',
        +    'bulk_manager_warn'	        => 'Sus usuarios han sido correctamente actualizados, de todos modos la entrada de administrador no fue guardada porque el administrador seleccionado también estaba en la lista de usuarios a ser editada, y los usuarios no pueden ser sus propior administradores. Vuelva a seleccionar los usuarios, excluyendo al administrador.',
             'user_exists'               => 'El Usuario ya existe!',
             'user_not_found'            => 'Usuario [:id] no existe.',
             'user_login_required'       => 'El campo Usuario es obligatorio',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Usuario correctamente creado.',
                 'update'    => 'Usuario correctamente actualizado.',
        +        'update_bulk'    => 'Usuarios correctamente actualizados!',
                 'delete'    => 'Usuario correctamente eliminado.',
                 'ban'       => 'Usuario correctamente bloqueado.',
                 'unban'     => 'Usuario correctamente desbloqueado.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Ha habido un problema creando el Usuario. Intentalo de nuevo.',
                 'update' => 'Ha habido un problema actualizando el Usuario. Intentalo de nuevo.',
                 'delete' => 'Ha habido un problema eliminando el  Usuario. Intentalo de nuevo.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Ha habido un problema marcando como no suspendido el Usuario. Intentalo de nuevo.',
                 'import'    => 'Ha habido un problema importando los usuarios. Por favor intente nuevamente.',
                 'asset_already_accepted' => 'Este equipo ya ha sido aceptado.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'No se ha podido vincular con el servidor LDAP. Por favor verifique la configuración de su servidor LDAP en su archivo de configuración.<br> Error del servidor LDAP: ',
                 'ldap_could_not_search' => 'No se ha podido buscar en el servidor LDAP. Por favor verifique la configuración de su servidor LDAP en su archivo de configuración.<br> Error del servidor LDAP:',
                 'ldap_could_not_get_entries' => 'No se han podido obtener entradas del servidor LDAP. Por favor verifique la configuración de su servidor LDAP en su archivo de configuración.<br> Error del servidor LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/es-CO/admin/users/table.php b/resources/lang/es-CO/admin/users/table.php
        index 80748286cd..8405299da4 100644
        --- a/resources/lang/es-CO/admin/users/table.php
        +++ b/resources/lang/es-CO/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Activo',
             'allow'  				=> 'Permitir',
             'checkedout'  			=> 'Equipos',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Localización',
             'lock_passwords'		=> 'Los detalles de acceso no pueden ser cambiados en esta instalación.',
             'manager' 				=> 'Responsable',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Usuario',
             'notes'                 => 'Notas',
             'password_confirm' 		=> 'Confirmar Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Mostrar usuarios actuales',
             'show_deleted'          => 'Mostrar usuarios eliminados',
             'title' 				=> 'Puesto',
        +	'to_restore_them'		=> 'para restaurarlos.',
             'updateuser' 			=> 'Actualizar Usuario',
             'username' 				=> 'UsuarioUsuario',
        +	'user_deleted_text' 	=> 'Este usuario ha sido marcado como eliminado.',
             'username_note' 		=> '(Esto se usa solo para la conexión con Active Directory, no para el inicio de sesión.)',
             'cloneuser'             => 'Clonar Usuario',
             'viewusers' 			=> 'Ver Usuarios',
        diff --git a/resources/lang/es-CO/auth/message.php b/resources/lang/es-CO/auth/message.php
        index 2c8bfd73cb..6861d02c75 100644
        --- a/resources/lang/es-CO/auth/message.php
        +++ b/resources/lang/es-CO/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Este usuario no está activado.',
             'account_suspended'      => 'Este usuario está desactivado.',
             'account_banned'         => 'Este usuario ha sido expulsado.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Demasiados intentos de inicio de sesión fallidos. Por favor, intente otra vez en alrededor de :minutes minuto(s).',
         
             'signin' => array(
                 'error'   => 'Ha habido un problema al iniciar sesión. Por favor, vuelve a intentarlo.',
        diff --git a/resources/lang/es-CO/button.php b/resources/lang/es-CO/button.php
        index 5f2ac96abb..90017cd29b 100644
        --- a/resources/lang/es-CO/button.php
        +++ b/resources/lang/es-CO/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Acciones',
             'add'    	                => 'Agregar nuevo',
             'cancel'                    => 'Cancelar',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Solicitud',
             'submit'  	                => 'Enviar',
             'upload'                    => 'Subir',
        -
        +	'select_file'				=> 'Seleccionar Archivo...',
         );
        diff --git a/resources/lang/es-CO/general.php b/resources/lang/es-CO/general.php
        index 9c9c0d7c20..25857fc6d0 100644
        --- a/resources/lang/es-CO/general.php
        +++ b/resources/lang/es-CO/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Reporte de Equipos',
             'asset_tag'				=> 'Etiqueta',
             'assets_available'		=> 'equipos disponibles',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Equipos',
             'avatar_delete'         => 'Eliminar Avatar',
             'avatar_upload'         => 'Subir Avatar',
             'back'      			=> 'Atras',
             'bad_data'      		=> 'Ningún resultado. ¿Quizá un dato incorrecto?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Procesar en Lote',
             'cancel'  				=> 'Cancelar',
             'categories'			=> 'Categorías',
             'category'				=> 'Categoría',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Cambiar Email',
             'changepassword'  		=> 'Cambiar Password',
             'checkin'  				=> 'Quitar Equipo',
             'checkin_from'  		=> 'Devolución de',
             'checkout'  			=> 'Asignar a un usuario',
             'city'  				=> 'Ciudad',
        +	'click_here'			=> 'Pulsa aquí',
             'companies'			=> 'Empresas',
             'company'				=> 'Empresa',
             'component'			=> 'Componente',
             'components'			=> 'Componentes',
        +	'complete'				=> 'Completo',
             'consumable'			=> 'Consumible',
             'consumables'			=> 'Consumibles',
             'country'  				=> 'Pais',
        @@ -44,16 +51,21 @@
             'created'               => 'Artículo creado',
             'created_asset'			=> 'equipo creado',
             'created_at' 			=> 'Creado el',
        +    'updated_at' 			=> 'Actualizado en',
             'currency'  			=> '€', // this is deprecated
             'current'  				=> 'Actual',
             'custom_report'         => 'Reporte de Equipos Personalizado',
             'dashboard'				=> 'Tablero',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Fecha Compra',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => '¡Advertencia!',
        +    'debug_warning_text'         => 'Esta aplicación esta corriendo en modo producción con debugging activado. Esto puede exponer datos sensibles si su aplicación es accesible desde el exterior. Desactive el modo debug cambiando el valor <code>APP_DEBUG</code> en su archivo <code>.env</code> a <code>false</code>.',
             'delete'  				=> 'Borrar',
             'deleted'  				=> 'Borrado',
             'delete_seats'  		=> 'Asientos eliminados',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Instalados - ',
             'depreciation_report'	=> 'Informe de amortización',
             'download'				=> 'Descargar',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => '¡Permisos insuficientes!',
             'language'				=> 'Lenguaje',
             'last'					=> 'Último',
        +    'last_login'            => 'Último acceso',
             'last_name'             => 'Apellidos',
             'license'				=> 'Licencia',
             'license_report'        => 'Reporte de Licencias',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Más Info',
             'name'					=> 'Nombre Localización',
             'next'					=> 'Siguiente',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'nuevo!',
             'no_depreciation'		=> 'No Amortizar',
             'no_results'			=> 'Sin Resultados.',
             'no'  					=> 'No',
             'notes'  				=> 'Notas',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Nùmero de orden',
             'page_menu'				=> 'Mostrando elementos de _MENU_',
             'pagination_info'		=> 'Mostrando _START_ de _END_ de elementos _TOTAL_',
             'pending'				=> 'Equipo Pendiente',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Previo',
             'processing'			=> 'Procesando',
             'profile'				=> 'Perfil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Precio Compra',
        +    'purchase_date'         => 'Fecha de compra',
             'qty'		            => 'Cant',
             'quantity'		        => 'Cantidad',
             'ready_to_deploy'		=> 'Disponibles',
        @@ -138,27 +153,31 @@
             'select'				=> 'Seleccionar',
             'search'				=> 'Buscar',
             'select_category'       => 'Seleccione una categoría',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Seleccionar un tipo de Amortización',
             'select_location'		=> 'Seleccionar una Ubicación',
             'select_manufacturer'	=> 'Seleccionar un Fabricante',
             'select_model'			=> 'Seleccionar un Modelo',
             'select_supplier'		=> 'Seleccionar un Proveedor',
             'select_user'			=> 'Seleccionar un usuario',
        -    'select_date'			=> 'Seleccionar fecha',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Seleccionar Estado',
             'select_company'    	=> 'Seleccionar empresa',
             'select_asset'    		=> 'Seleccionar activos',
             'settings'				=> 'Opciones',
             'sign_in'				=> 'Entrar',
        -    'signature'             => 'Signature',
        +    'signature'             => 'Firma',
             'some_features_disabled' => 'MODO DE DEMOSTRACIÓN: Algunas funciones estan desactivadas para esta instalación.',
             'site_name'				=> 'Sitio',
             'state'  				=> 'Provincia',
             'status_labels'			=> 'Etiquetas Estados',
             'status'    			=> 'Estados',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Proveedor',
             'suppliers'  			=> 'Proveedores',
        +    'sure_to_delete'    => '¿Está seguro que desea eliminar',
             'submit'				=> 'Enviar',
        +    'target'                => 'Objetivo',
        +    'time_and_date_display' => 'Hora y fecha',
             'total_assets'			=> 'Equipos',
             'total_licenses'		=> 'licencias totales',
             'total_accessories'		=> 'total de accesorios',
        diff --git a/resources/lang/es-CO/mail.php b/resources/lang/es-CO/mail.php
        index c9a4fe182d..33a8ffe8bf 100644
        --- a/resources/lang/es-CO/mail.php
        +++ b/resources/lang/es-CO/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => 'El usuario ha cancelado el item solicitado en la pagina Web',
        +    'a_user_requested' => 'Un usuario a solicitado un item en la pagina Web',
        +    'accessory_name' => 'Nombre de accesorio:',
        +    'additional_notes' => 'Notas adicionales:',
        +    'admin_has_created' => 'Un administrador ha creado una cuenta para ti en la web :web.',
        +    'asset' => 'Activo:',
        +    'asset_name' => 'Nombre del activo:',
        +    'asset_requested' => 'Activo solicitado',
        +    'asset_tag' => 'Etiqueta de activo:',
        +    'assets_warrantee_expiring' => '{1} Activo con garantia expirando en los próximos 60 días.|[2,Inf] Activos con garantías                                      expirando en los próximos 60 días.',
        +    'assigned_to' => 'Asignado a',
        +    'best_regards' => 'Cordialmente,',
        +    'canceled' => 'Cancelado:',
        +    'checkin_date' => 'Fecha de entrada:',
        +    'checkout_date' => 'Fecha de salida:',
        +    'click_to_confirm' => 'Por favor, pulsa en el siguiente enlace para verificar tu cuenta de :web:',
        +    'click_on_the_link_accessory' => 'Haga clic en el enlace en la parte inferior para confirmar que ha recibido el accesorio.',
        +    'click_on_the_link_asset' => 'Haga clic en el enlace en la parte inferior para confirmar que ha recibido el activo.',
        +    'Confirm_Asset_Checkin' => 'Confirmación de retorno de activo.',
        +    'Confirm_Accessory_Checkin' => 'Confirmar devolución del accesorio.',
        +    'Confirm_accessory_delivery' => 'Confirman entrega de accesorio.',
        +    'Confirm_asset_delivery' => 'Confirman entrega de activos.',
        +    'Confirm_consumable_delivery' => 'Confirmar entrega consumible.',
        +    'current_QTY' => 'Cantidad actual',
        +    'Days' => 'Días',
        +    'days' => 'Días',
        +    'expecting_checkin_date' => 'Fecha de devolución prevista:',
        +    'expires' => 'Expira',
        +    'Expiring_Assets_Report' => 'Informe de activos que expiran.',
        +    'Expiring_Licenses_Report' => 'Informe de licencias que expiran.',
        +    'hello' => 'Hola',
        +    'hi' => 'Hola',
        +    'i_have_read' => 'Ha leído y aceptado los términos de uso y he recibido este artículo.',
        +    'item' => 'Articulo:',
        +    'items_below_minimum' => 'artículo {1} está por debajo del mínimo inventario o que pronto estará bajo. | [2, Inf] elementos que están por debajo de mínimo inventario o pronto estarán bajos.',
        +    'Item_Request_Canceled' => 'Solicitud de cancelación de requerimiento',
        +    'Item_Requested' => 'Artículo solicitado',
        +    'licenses_expiring' => '{1} licencia por expirar en los próximos 60 días. | [2, Inf] licencias caducan en los próximos 60 días.',
        +    'link_to_update_password' => 'Haga clic en el siguiente enlace para actualizar su: contraseña de la web:',
        +    'login_first_admin' => 'Inicie sesión en su nueva instalación de Snipe-IT con las credenciales siguientes:',
        +    'login' => 'Entrar:',
        +    'Low_Inventory_Report' => 'Reporte de inventario bajo',
        +    'min_QTY' => 'Cantidad mínima',
        +    'name' => 'Nombre',
        +    'new_item_checked' => 'Un nuevo artículo se ha extraído bajo su nombre, los detalles están a continuación.',
        +    'password' => 'Contraseña:',
        +    'password_reset' => 'Reiniciar la contraseña',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Por favor lea las condiciones de uso a continuación.',
        +    'read_the_terms_and_click' => 'Por favor lea los términos de uso abajo y haga clic en el enlace en la parte inferior para confirmar que leído y acepta los términos de uso y han recibido el activo.',
        +    'requested' => 'Solicitado:',
        +    'reset_link' => 'Tu enlace de restablecimiento de contraseña',
        +    'reset_password' => 'Haga Clic aquí para restablecer su contraseña:',
        +    'serial' => 'Número de serie:',
        +    'supplier' => 'Proveedor',
        +    'tag' => 'Etiqueta',
        +    'test_email' => 'Email de prueba de Snipe-IT',
        +    'test_mail_text' => 'Esto es una prueba desde el sistema de gestión de activos de Snipe-IT. Si tienes esto, correo está funcionando :)',
        +    'the_following_item' => 'El siguiente artículo ha sido devuelto: ',
        +    'There_are' => 'Hay',
        +    'to_reset' => 'Para restaurar tu contraseña de :web, rellena este formulario:',
        +    'type' => 'Tipo',
        +    'user' => 'Usuario:',
        +    'username' => 'Nombre de usuario:',
        +    'welcome' => 'Bienvenido, :name',
        +    'welcome_to' => '¡Bienvenido a: web!',
        +    'your_credentials' => 'Tus credenciales de Snipe-IT',
         );
        diff --git a/resources/lang/es-CO/validation.php b/resources/lang/es-CO/validation.php
        index 899ee1769e..5c3a3cb37e 100644
        --- a/resources/lang/es-CO/validation.php
        +++ b/resources/lang/es-CO/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute debe ser aceptado.",
        -    "active_url"       => ":attribute no es una URL correcta.",
        -    "after"            => ":attribute debe ser posterior a :date.",
        -    "alpha"            => ":attribute solo acepta letras.",
        -    "alpha_dash"       => ":attribute solo acepta letras, números y guiones.",
        -    "alpha_num"        => ":attribute solo acepta letras y números.",
        -    "before"           => ":attribute debe ser anterior a :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute debe estar entre :min - :max.",
        -        "file"    => ":attribute debe estar entre :min - :max kilobytes.",
        -        "string"  => ":attribute debe estar entre :min - :max caracteres.",
        -    ),
        -    "confirmed"        => ":attribute la confirmación no coincide.",
        -    "date"             => ":attribute no es una fecha correcta.",
        -    "date_format"      => ":attribute no cumple el formato :format.",
        -    "different"        => ":attribute y :other deben ser diferentes.",
        -    "digits"           => ":attribute debe tener :digits dígitos.",
        -    "digits_between"   => ":attribute debe tener entre :min y :max dígitos.",
        -    "email"            => ":attribute formato incorrecto.",
        -    "exists"           => "El :attribute seleccionado no es correcto.",
        -    "email_array"      => "Una o más direcciones de correo electrónico no es válido.",
        -    "image"            => ":attribute debe ser una imagen.",
        -    "in"               => "El :attribute seleccionado no es correcto.",
        -    "integer"          => ":attribute debe ser un número entero.",
        -    "ip"               => ":attribute debe ser una dirección IP correcta.",
        -    "max"              => array(
        -        "numeric" => ":attribute no debe ser mayor que :max.",
        -        "file"    => ":attribute no debe ser mayor que :max kilobytes.",
        -        "string"  => ":attribute no debe tener como máximo :max caracteres.",
        -    ),
        -    "mimes"            => ":attribute debe ser un archivo del tipo: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute debe ser como mínimo :min.",
        -        "file"    => ":attribute debe ser como mínimo de :min kilobytes.",
        -        "string"  => ":attribute debe contener como mínimo :min caracteres.",
        -    ),
        -    "not_in"           => "El :attribute seleccionado no es correcto.",
        -    "numeric"          => ":attribute debe ser un número.",
        -    "regex"            => ":attribute formato incorrecto.",
        -    "required"         => ":attribute es obligatorio.",
        -    "required_if"      => ":attribute es obligatrio cuando :other es :value.",
        -    "required_with"    => ":attribute es obligatrio cuando :values es present.",
        -    "required_without" => ":attribute es obligatrio cuando :values es not present.",
        -    "same"             => ":attribute y :other deben coincidir.",
        -    "size"             => array(
        -        "numeric" => ":attribute debe tener :size.",
        -        "file"    => ":attribute debe tener :size kilobytes.",
        -        "string"  => ":attribute debe tener :size caracteres.",
        -    ),
        -    "unique"           => ":attribute ya ha sido introducido.",
        -    "url"              => ":attribute formato incorrecto.",
        -    "statuslabel_type" => "Debe seleccionar un tipo de etiqueta de estado válido",
        -    "unique_undeleted" => ":attribute debe ser único.",
        +    'accepted'             => ':attribute debe ser aceptado.',
        +    'active_url'           => ':attribute no es una URL correcta.',
        +    'after'                => ':attribute debe ser posterior a :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute solo acepta letras.',
        +    'alpha_dash'           => ':attribute solo acepta letras, números y guiones.',
        +    'alpha_num'            => ':attribute solo acepta letras y números.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute debe ser anterior a :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute debe estar entre :min - :max.',
        +        'file'    => ':attribute debe estar entre :min - :max kilobytes.',
        +        'string'  => ':attribute debe estar entre :min - :max caracteres.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute debe ser verdadero o falso.',
        +    'confirmed'            => ':attribute la confirmación no coincide.',
        +    'date'                 => ':attribute no es una fecha correcta.',
        +    'date_format'          => ':attribute no cumple el formato :format.',
        +    'different'            => ':attribute y :other deben ser diferentes.',
        +    'digits'               => ':attribute debe tener :digits dígitos.',
        +    'digits_between'       => ':attribute debe tener entre :min y :max dígitos.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute formato incorrecto.',
        +    'exists'               => 'El :attribute seleccionado no es correcto.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute debe ser una imagen.',
        +    'in'                   => 'El :attribute seleccionado no es correcto.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute debe ser un número entero.',
        +    'ip'                   => ':attribute debe ser una dirección IP correcta.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute no debe ser mayor que :max.',
        +        'file'    => ':attribute no debe ser mayor que :max kilobytes.',
        +        'string'  => ':attribute no debe tener como máximo :max caracteres.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute debe ser un archivo del tipo: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute debe ser como mínimo :min.',
        +        'file'    => ':attribute debe ser como mínimo de :min kilobytes.',
        +        'string'  => ':attribute debe contener como mínimo :min caracteres.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'El :attribute seleccionado no es correcto.',
        +    'numeric'              => ':attribute debe ser un número.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute formato incorrecto.',
        +    'required'             => ':attribute es obligatorio.',
        +    'required_if'          => ':attribute es obligatrio cuando :other es :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute es obligatrio cuando :values es present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute es obligatrio cuando :values es not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute y :other deben coincidir.',
        +    'size'                 => [
        +        'numeric' => ':attribute debe tener :size.',
        +        'file'    => ':attribute debe tener :size kilobytes.',
        +        'string'  => ':attribute debe tener :size caracteres.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute ya ha sido introducido.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute formato incorrecto.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "El campo :attribute contiene un caracter que no está permitido.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/es-ES/admin/asset_maintenances/message.php b/resources/lang/es-ES/admin/asset_maintenances/message.php
        index 72b091ecd7..48953f8be7 100644
        --- a/resources/lang/es-ES/admin/asset_maintenances/message.php
        +++ b/resources/lang/es-ES/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'El Mantenimiento de Equipo no fue creado, por favor intente nuevamente.',
                     'success' => 'El Mantenimiento de Equipo fue creado de manera exitosa.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Sin Completar',
                 'warranty'                     => 'Garantía',
                 'not_warranty'                 => 'Sin Garantía',
        diff --git a/resources/lang/es-ES/admin/asset_maintenances/table.php b/resources/lang/es-ES/admin/asset_maintenances/table.php
        index 75b3840bd2..f63124dd19 100644
        --- a/resources/lang/es-ES/admin/asset_maintenances/table.php
        +++ b/resources/lang/es-ES/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Mantenimiento de Equipo',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nombre del Equipo',
                 'is_warranty'   => 'Garantía',
                 'dl_csv'        => 'Descargar CSV'
             ];
        diff --git a/resources/lang/es-ES/admin/categories/general.php b/resources/lang/es-ES/admin/categories/general.php
        index 15c5129871..7217a16a90 100644
        --- a/resources/lang/es-ES/admin/categories/general.php
        +++ b/resources/lang/es-ES/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Sobre categorias',
        +    'about_categories'  				=> 'Las categorías te ayudan a organizar los equipos. Ejemplos de categorías: &quot;PCs&quot;, &quot;Portátiles&quot;, &quot;Móviles&quot;, &quot;Tabletas&quot;, etc.',
             'asset_categories' 					=> 'Categorias',
             'category_name'  					=> 'Categoría',
             'checkin_email'                     => 'Enviar un correo al usuario al efectuar la devolución.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Editar Categoría',
             'eula_text'							=> 'Categoría EULA',
             'eula_text_help'					=> 'Este campo permite personalizar sus EULAs para tipos específicos de equipos. Si solo tiene un EULA para todos sus equipos, puede seleccionar la siguiente opción para usar el valor por defecto.',
        +    'name'                              => 'Nombre de la categoría',
             'require_acceptance'				=> 'Requerir confirmación de usuarios para la aceptación de equipos en esta categoría.',
             'required_acceptance'				=> 'Se enviará  un email a este usuario con un link para confirmar la aceptación de este item.',
             'required_eula'						=> 'Se enviará  un email a este usuario con una copia del EULA',
        diff --git a/resources/lang/es-ES/admin/companies/general.php b/resources/lang/es-ES/admin/companies/general.php
        index d0633472c4..5a0aee84b2 100644
        --- a/resources/lang/es-ES/admin/companies/general.php
        +++ b/resources/lang/es-ES/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Sobre las empresas',
        +    'about_companies_text'                  => 'Empresas pueden ser utilizadas como un campo de identificador simple, o pueden utilizarse para limitar la visibilidad de los activos, usuarios, etc, si el soporte completo a la empresa está habilitado en la configuración del Admin.',
             'select_company' => 'Seleccionar compañía',
         ];
        diff --git a/resources/lang/es-ES/admin/consumables/general.php b/resources/lang/es-ES/admin/consumables/general.php
        index 94d476ca29..ec6dba48d6 100644
        --- a/resources/lang/es-ES/admin/consumables/general.php
        +++ b/resources/lang/es-ES/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> 'Acerca de los consumibles',
             'about_consumables_text'  			=> 'Consumibles son cualquier cosa comprada que puede ser usada a lo largo del tiempo. Por ejemplo, tinta para impresora o papel para copiadora.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'Checkout de consumible a usuario',
             'consumable_name'                   => 'Nombre del Consumible',
             'create'                            => 'Crear Consumible',
             'item_no'                           => 'Artículo núm.',
        diff --git a/resources/lang/es-ES/admin/custom_fields/general.php b/resources/lang/es-ES/admin/custom_fields/general.php
        index 37fceaf6bf..79cec15185 100644
        --- a/resources/lang/es-ES/admin/custom_fields/general.php
        +++ b/resources/lang/es-ES/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'Acerca de los campos personalizados',
             'about_fieldsets_text'		=> 'Los grupos de campos personalizados te permiten agrupar campos que se usan frecuentemente para determinados modelos de equipos.',
             'custom_format'             => 'Formato a medida...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Encriptar el valor de este campo en la base de datos',
             'encrypt_field_help'      => 'CUIDADO: Encriptar un campo hace que no se pueda buscar por él.',
             'encrypted'      	        => 'Encriptado',
             'fieldset'      	        => 'Grupo de campos personalizados',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Nombre del grupo',
             'field_name'              => 'Nombre del campo',
             'field_values'            => 'Valores de los Campos',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Agregar opciones seleccionables, una por linea. Lineas en blanco ademas de la primera, serán ignoradas.',
             'field_element'           => 'Elemento de formulario',
             'field_element_short'     => 'Elemento',
             'field_format'            => 'Formato',
        diff --git a/resources/lang/es-ES/admin/custom_fields/message.php b/resources/lang/es-ES/admin/custom_fields/message.php
        index 3ee148ead0..d7dc22dc30 100644
        --- a/resources/lang/es-ES/admin/custom_fields/message.php
        +++ b/resources/lang/es-ES/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'El grupo de campos no ha sido creado, por favor inténtelo de nuevo.',
        diff --git a/resources/lang/es-ES/admin/departments/message.php b/resources/lang/es-ES/admin/departments/message.php
        new file mode 100644
        index 0000000000..740b38b39d
        --- /dev/null
        +++ b/resources/lang/es-ES/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'El departamento no existe.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'El departamento ha sido borrado exitosamente'
        +    )
        +
        +);
        diff --git a/resources/lang/es-ES/admin/departments/table.php b/resources/lang/es-ES/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/es-ES/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/es-ES/admin/depreciations/general.php b/resources/lang/es-ES/admin/depreciations/general.php
        index 9743de920a..f5c6d6e9fd 100644
        --- a/resources/lang/es-ES/admin/depreciations/general.php
        +++ b/resources/lang/es-ES/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Info Amortización Equipos',
             'about_depreciations'  					=> 'Puedes configurar clases de amortización para amortizar equipos de forma lineal.',
             'asset_depreciations'  					=> 'Amortizaciones',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Crear Amortización',
             'depreciation_name'  					=> 'Nombre Amortización',
             'number_of_months'  					=> 'Meses',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Actualizar Amortización',
         
         );
        diff --git a/resources/lang/es-ES/admin/groups/titles.php b/resources/lang/es-ES/admin/groups/titles.php
        index ba098eb80b..c9d6ca4a6d 100644
        --- a/resources/lang/es-ES/admin/groups/titles.php
        +++ b/resources/lang/es-ES/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Acerca de los grupos',
        +    'about_groups'                  => 'Los Grupos son usados para generar permisos de usuarios.',
             'group_management' 	 	=> 'Gestión de Grupos',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Crear un grupo nuevo',
        +    'update' 	 		        => 'Editar Grupo',
             'group_name' 	 		=> 'Nombre de Grupo',
             'group_admin' 	 		=> 'Admin Grupo',
             'allow' 	 			=> 'Permitir',
        diff --git a/resources/lang/es-ES/admin/hardware/form.php b/resources/lang/es-ES/admin/hardware/form.php
        index 9467058657..f150da59a5 100644
        --- a/resources/lang/es-ES/admin/hardware/form.php
        +++ b/resources/lang/es-ES/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Confirmar eliminación masiva de bienes',
           'bulk_delete_help'	=> 'Revisar los bienes para eliminación masiva. Una vez eliminados, esos bienes pueden ser restaurados, pero no volverán a estar asociados con ningún usuario a los que esté asignado.',
           'bulk_delete_warn'	=> 'Está a punto de borrar :asset_count.',
         	'bulk_update'		=> 'Actualización masiva de Equipos',
        diff --git a/resources/lang/es-ES/admin/hardware/general.php b/resources/lang/es-ES/admin/hardware/general.php
        index 0ff9c61acf..16d2083afc 100644
        --- a/resources/lang/es-ES/admin/hardware/general.php
        +++ b/resources/lang/es-ES/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Acerca de Activos',
        +    'about_assets_text'            => 'Los activos son elementos con número de serie o etiqueta de activos.  Tienden a ser artículos de alto valor donde es importante identificar un elemento específico.',
         	'archived'  				=> 'Archivado',
             'asset'  					=> 'Equipo',
             'bulk_checkout'             => 'Asignar activos a un usuario',
             'checkin'  					=> 'Quitar Equipo',
        -    'checkout'  				=> 'Asignar a un usuario',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clonar Equipo',
             'deployable'  				=> 'Desplegable',
             'deleted'  					=> 'Este equipo ha sido eliminado. <a href="/hardware/:asset_id/restore">Click aqui para restaurarlot</a>.',
        diff --git a/resources/lang/es-ES/admin/hardware/message.php b/resources/lang/es-ES/admin/hardware/message.php
        index 5d0504abf6..96c3b9a6dd 100644
        --- a/resources/lang/es-ES/admin/hardware/message.php
        +++ b/resources/lang/es-ES/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Equipo restaurado correctamente.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Archivo no eliminado. Por favor, vuelva a intentarlo.',
                 'success' => 'Archivo eliminado correctamente.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Estás seguro que quieres eliminar el equipo?',
                 'error'   		=> 'Equipo no eliminado, intentalo de nuevo.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Equipo eliminado.'
             ),
         
        diff --git a/resources/lang/es-ES/admin/licenses/general.php b/resources/lang/es-ES/admin/licenses/general.php
        index 6af5be7810..8a5d6db90e 100644
        --- a/resources/lang/es-ES/admin/licenses/general.php
        +++ b/resources/lang/es-ES/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Acerca de licencias',
        +    'about_licenses'                  => 'Las licencias son para identificar software. Tienen un número específico de asientos que pueden ser asignados a individuos',
             'checkin'  					=> 'Quitar Instalación',
             'checkout_history'  		=> 'Historial Asignaciones',
             'checkout'  				=> 'Asignar Instalación',
        diff --git a/resources/lang/es-ES/admin/licenses/message.php b/resources/lang/es-ES/admin/licenses/message.php
        index 70e73d630b..cff98ee8dd 100644
        --- a/resources/lang/es-ES/admin/licenses/message.php
        +++ b/resources/lang/es-ES/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Archivo(s) no cargado. Por favor, vuelva a intentarlo.',
                 'success' => 'Archivo(s) cargado correctamente.',
                 'nofiles' => 'No ha seleccionado ningun archivo para ser cargado, o el archivo que seleccionó es demasiado grande',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Uno o más de tus ficheros son demasiado grandes o de un tipo no permitido. Los tipos permitidos son png, gif, jpg, doc, docx, pdf, txt, zip, rar, rtf, xml y lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/es-ES/admin/locations/table.php b/resources/lang/es-ES/admin/locations/table.php
        index ed9657f5c7..46efe23134 100644
        --- a/resources/lang/es-ES/admin/locations/table.php
        +++ b/resources/lang/es-ES/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'Acerca de ubicaciones',
        +    'about_locations'           => 'Las Ubicaciones son utilizadas para hacer seguimiento de la información sobre ubicación de usuarios, bienes, y otros items',
             'assets_rtd'                => 'Equipos', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Equipo asignado',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Localizaciones',
             'parent'                    => 'Padre',
             'currency'                  => 'Divisa de la Localización',
        +    'ldap_ou'                   => 'Búsqueda LDAP OU',
             );
        diff --git a/resources/lang/es-ES/admin/manufacturers/table.php b/resources/lang/es-ES/admin/manufacturers/table.php
        index 53fc87cf42..972d33b71b 100644
        --- a/resources/lang/es-ES/admin/manufacturers/table.php
        +++ b/resources/lang/es-ES/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Sobre fabricantes',
        +    'about_manufacturers_text'  => 'Los fabricantes son las empresas que crean sus activos. Aquí puede almacenar importante información de contacto sobre ellos, que se mostrará en sus páginas de detalle de activos.',
             'asset_manufacturers'	=> 'Fabricantes',
             'create'				=> 'Crear Fabricante',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nombre Fabricante',
        +    'name'      			=> 'Nombre',
        +    'support_email'   		=> 'Email de soporte',
        +    'support_phone'   		=> 'Teléfono de soporte',
        +    'support_url'   		=> 'URL de soporte',
             'update'				=> 'Actualizar Fabricante',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/es-ES/admin/models/general.php b/resources/lang/es-ES/admin/models/general.php
        index 7b4b839f44..1463b21cef 100644
        --- a/resources/lang/es-ES/admin/models/general.php
        +++ b/resources/lang/es-ES/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Acerca de modelos de activos',
        +    'about_models_text'           => 'Los Modelos de activos son una forma de agrupar activos idénticos. "MBP 2013", "IPhone 6s", etc.',
             'deleted'  					        => 'Este modelo ha sido borrado.<a href="/hardware/models/:model_id/restore">Click aquí para restaurarlo</a>.',
             'restore'                   => 'Restaurar Modelo',
             'requestable'               => 'Los usuarios pueden solicitar este modelo',
        diff --git a/resources/lang/es-ES/admin/models/message.php b/resources/lang/es-ES/admin/models/message.php
        index c732676053..d0cac6fbc5 100644
        --- a/resources/lang/es-ES/admin/models/message.php
        +++ b/resources/lang/es-ES/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modelo restaurado exitosamente.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/es-ES/admin/settings/general.php b/resources/lang/es-ES/admin/settings/general.php
        index ab9e2166af..d6dbb8a90c 100644
        --- a/resources/lang/es-ES/admin/settings/general.php
        +++ b/resources/lang/es-ES/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Limite de alertas de expiración (en días)',
         	'alert_inv_threshold'		=> 'Umbral de alerta del inventario',
         	'asset_ids'					=> 'IDs de Recurso',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generar IDs de equipo autoincrementales',
         	'auto_increment_prefix'		=> 'Prefijo (opcional)',
         	'auto_incrementing_help'    => 'Activa la generación automática de IDs de equipo antes de configurar esto',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'Email LDAP',
             'load_remote_text'          => 'Scripts remotos',
             'load_remote_help_text'		=> 'Esta instalación de Snipe-IT puede cargar scripts desde fuera.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Usuarios restringidos (incluidos administradores) asignados a compañías de sus bienes de compañía.',
             'full_multiple_companies_support_text' => 'Soporte completo múltiple de compañías',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versión de PHP',
             'php_gd_info'               => 'Debes instalar php-gd para mostrar Códigos QR, ver instrucciones de instalación en <a href="http://www.php.net/manual/en/image.installation.php"></a>.',
             'php_gd_warning'            => 'PHP Image Processing y GD plugin NO instalados.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Activa Códigos QR antes para poder ver esto',
             'qr_text'                   => 'Texto Código QR',
             'setting'                   => 'Parámetro',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Estos ajustes te permiten personalizar ciertos aspectos de tu instalación.',
             'labels_per_page'           => 'Etiquetas por pàgina',
             'label_dimensions'          => 'Dimensiones de las etiquetas (pulgadas)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Margenès de pàgina (pulgadas)',
             'purge'                    => 'Purgar registros eliminados',
             'labels_display_bgutter'    => 'Borde inferior de la Etiqueta',
        @@ -104,25 +117,27 @@ return array(
             'width_w'        => 'an',
             'height_h'        => 'al',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Autenticación en dos pasos',
        +    'two_factor_secret'        => 'Código de verificación en dos pasos',
        +    'two_factor_enrollment'        => 'Enrolamiento en verificación en dos pasos',
        +    'two_factor_enabled_text'        => 'Activar la verificación en dos pasos',
        +    'two_factor_reset'        => 'Reiniciar Secreto de verificación en dos pasos',
        +    'two_factor_reset_help'        => 'Esto forzará al usuario a inscribirse otra vez su dispositivo con Google Authenticator. Esto puede ser útil si la pérdida o robo de su dispositivo actualmente inscrito. ',
        +    'two_factor_reset_success'          => 'Verificación en dos pasos de dispositivo reiniciado exitosamente',
        +    'two_factor_reset_error'          => 'Falló la Verificación en dos pasos del dispositivo',
        +    'two_factor_enabled_warning'        => 'Permitiendo dos factores si no está activado inmediatamente obliga a autenticar con un dispositivo de autenticación de Google inscritos. Usted tendrá la posibilidad de inscribirse el dispositivo si uno no está inscrito actualmente.',
        +    'two_factor_enabled_help'        => 'Esto encenderá la autenticación de dos factores usando Google Authenticator.',
        +    'two_factor_optional'        => 'Selectiva (los usuarios pueden activar o desactivar si está permitido)',
        +    'two_factor_required'        => 'Requerido para todos los usuarios',
        +    'two_factor_disabled'        => 'Desactivado',
        +    'two_factor_enter_code'	=> 'Ingrese código de verificación en dos pasos',
        +    'two_factor_config_complete'	=> 'Enviar código',
        +    'two_factor_enabled_edit_not_allowed' => 'El administrador no permite modificar esta configuración.',
        +    'two_factor_enrollment_text'	=> "Autenticación de doble factor se requiere, sin embargo el dispositivo no ha inscrito todavía. Abra la aplicación Google Authenticator y escanear el código QR a continuación para inscribir a su dispositivo. Una vez que haya inscrito su dispositivo, introduzca el código de abajo",
        +    'require_accept_signature'      => 'Requerir Firma',
        +    'require_accept_signature_help_text'      => 'Para activar esta función se requiere que los usuarios firmen fisicamente aceptando el activo.',
             'left'        => 'izquierda',
             'right'        => 'derecha',
             'top'        => 'arriba',
        diff --git a/resources/lang/es-ES/admin/suppliers/table.php b/resources/lang/es-ES/admin/suppliers/table.php
        index b1354e76a1..f576b2d372 100644
        --- a/resources/lang/es-ES/admin/suppliers/table.php
        +++ b/resources/lang/es-ES/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Acerca de Proveedores',
        +    'about_suppliers_text'  => 'Los Proveedores son utilizados para hacer seguimiento de la fuente de los items',
             'address'               => 'Dirección del Proveedor',
             'assets'                => 'Equipos',
             'city'                  => 'Ciudad',
        diff --git a/resources/lang/es-ES/admin/users/general.php b/resources/lang/es-ES/admin/users/general.php
        index bccf491cd1..ea715cd169 100644
        --- a/resources/lang/es-ES/admin/users/general.php
        +++ b/resources/lang/es-ES/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Equipos asignados a :name',
        +    'bulk_update_warn'	=> 'Estás a punto de modificar las propiedades de :user_count usuarios. Por favor, ten en cuenta que no puedes modificar las propiedades de tu propio usuario con este formulario, y debes realizar las modificaciones a tu propio usuario de forma individual.',
        +    'bulk_update_help'	=> 'Este formulario permite actualizar múltiples usuarios simultáneamente. Rellena únicamente los campos que necesites cambiar. Cualquier campo que quede en blanco no se actualizará.',
             'current_assets'    => 'Equipos checked out a este usuario',
             'clone'             => 'Clonar Usuario',
             'contact_user'      => 'Contacta con :name',
             'edit'              => 'Editar Usuario',
             'filetype_info'     => 'Tipos de archivos permitidos son png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, y rar.',
             'history_user'      => 'Historial de :name',
        +	'info'				=> 'Información',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Último acceso',
             'ldap_config_text'  => 'Las configuraciones de LDAP estàn en: Admin -> Settings. La ubicaciòn seleccionadada sera asignada a todos los usuarios importados.',
             'software_user'     => 'Software asignado a :name',
             'view_user'         => 'Ver Usuario :name',
             'usercsv'           => 'Archivo CSV',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'La actual configuración de administración permite cumplimiento selectivo de autenticación de dos factores.  ',
        +    'two_factor_enrolled' => 'Dispositivo con 2FA inscrito ',
        +    'two_factor_active'   => '2FA Activo ',
             );
        diff --git a/resources/lang/es-ES/admin/users/message.php b/resources/lang/es-ES/admin/users/message.php
        index c7ee709442..e6f7419254 100644
        --- a/resources/lang/es-ES/admin/users/message.php
        +++ b/resources/lang/es-ES/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Ha aceptado con éxito este equipo.',
             'declined'                  => 'Ha declinado con éxito este equipo.',
        +    'bulk_manager_warn'	        => 'Sus usuarios han sido correctamente actualizados, de todos modos la entrada de administrador no fue guardada porque el administrador seleccionado también estaba en la lista de usuarios a ser editada, y los usuarios no pueden ser sus propior administradores. Vuelva a seleccionar los usuarios, excluyendo al administrador.',
             'user_exists'               => 'El Usuario ya existe!',
             'user_not_found'            => 'Usuario [:id] no existe.',
             'user_login_required'       => 'El campo Usuario es obligatorio',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Usuario correctamente creado.',
                 'update'    => 'Usuario correctamente actualizado.',
        +        'update_bulk'    => 'Usuarios correctamente actualizados!',
                 'delete'    => 'Usuario correctamente eliminado.',
                 'ban'       => 'Usuario correctamente bloqueado.',
                 'unban'     => 'Usuario correctamente desbloqueado.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Ha habido un problema creando el Usuario. Intentalo de nuevo.',
                 'update' => 'Ha habido un problema actualizando el Usuario. Intentalo de nuevo.',
                 'delete' => 'Ha habido un problema eliminando el  Usuario. Intentalo de nuevo.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Ha habido un problema marcando como no suspendido el Usuario. Intentalo de nuevo.',
                 'import'    => 'Ha habido un problema importando los usuarios. Por favor intente nuevamente.',
                 'asset_already_accepted' => 'Este equipo ya ha sido aceptado.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'No se ha podido vincular con el servidor LDAP. Por favor verifique la configuración de su servidor LDAP en su archivo de configuración.<br> Error del servidor LDAP: ',
                 'ldap_could_not_search' => 'No se ha podido buscar en el servidor LDAP. Por favor verifique la configuración de su servidor LDAP en su archivo de configuración.<br> Error del servidor LDAP:',
                 'ldap_could_not_get_entries' => 'No se han podido obtener entradas del servidor LDAP. Por favor verifique la configuración de su servidor LDAP en su archivo de configuración.<br> Error del servidor LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/es-ES/admin/users/table.php b/resources/lang/es-ES/admin/users/table.php
        index 80748286cd..8405299da4 100644
        --- a/resources/lang/es-ES/admin/users/table.php
        +++ b/resources/lang/es-ES/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Activo',
             'allow'  				=> 'Permitir',
             'checkedout'  			=> 'Equipos',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Localización',
             'lock_passwords'		=> 'Los detalles de acceso no pueden ser cambiados en esta instalación.',
             'manager' 				=> 'Responsable',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Usuario',
             'notes'                 => 'Notas',
             'password_confirm' 		=> 'Confirmar Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Mostrar usuarios actuales',
             'show_deleted'          => 'Mostrar usuarios eliminados',
             'title' 				=> 'Puesto',
        +	'to_restore_them'		=> 'para restaurarlos.',
             'updateuser' 			=> 'Actualizar Usuario',
             'username' 				=> 'UsuarioUsuario',
        +	'user_deleted_text' 	=> 'Este usuario ha sido marcado como eliminado.',
             'username_note' 		=> '(Esto se usa solo para la conexión con Active Directory, no para el inicio de sesión.)',
             'cloneuser'             => 'Clonar Usuario',
             'viewusers' 			=> 'Ver Usuarios',
        diff --git a/resources/lang/es-ES/auth/message.php b/resources/lang/es-ES/auth/message.php
        index 2c8bfd73cb..6861d02c75 100644
        --- a/resources/lang/es-ES/auth/message.php
        +++ b/resources/lang/es-ES/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Este usuario no está activado.',
             'account_suspended'      => 'Este usuario está desactivado.',
             'account_banned'         => 'Este usuario ha sido expulsado.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Demasiados intentos de inicio de sesión fallidos. Por favor, intente otra vez en alrededor de :minutes minuto(s).',
         
             'signin' => array(
                 'error'   => 'Ha habido un problema al iniciar sesión. Por favor, vuelve a intentarlo.',
        diff --git a/resources/lang/es-ES/button.php b/resources/lang/es-ES/button.php
        index 5f2ac96abb..90017cd29b 100644
        --- a/resources/lang/es-ES/button.php
        +++ b/resources/lang/es-ES/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Acciones',
             'add'    	                => 'Agregar nuevo',
             'cancel'                    => 'Cancelar',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Solicitud',
             'submit'  	                => 'Enviar',
             'upload'                    => 'Subir',
        -
        +	'select_file'				=> 'Seleccionar Archivo...',
         );
        diff --git a/resources/lang/es-ES/general.php b/resources/lang/es-ES/general.php
        index 9c9c0d7c20..25857fc6d0 100644
        --- a/resources/lang/es-ES/general.php
        +++ b/resources/lang/es-ES/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Reporte de Equipos',
             'asset_tag'				=> 'Etiqueta',
             'assets_available'		=> 'equipos disponibles',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Equipos',
             'avatar_delete'         => 'Eliminar Avatar',
             'avatar_upload'         => 'Subir Avatar',
             'back'      			=> 'Atras',
             'bad_data'      		=> 'Ningún resultado. ¿Quizá un dato incorrecto?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Procesar en Lote',
             'cancel'  				=> 'Cancelar',
             'categories'			=> 'Categorías',
             'category'				=> 'Categoría',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Cambiar Email',
             'changepassword'  		=> 'Cambiar Password',
             'checkin'  				=> 'Quitar Equipo',
             'checkin_from'  		=> 'Devolución de',
             'checkout'  			=> 'Asignar a un usuario',
             'city'  				=> 'Ciudad',
        +	'click_here'			=> 'Pulsa aquí',
             'companies'			=> 'Empresas',
             'company'				=> 'Empresa',
             'component'			=> 'Componente',
             'components'			=> 'Componentes',
        +	'complete'				=> 'Completo',
             'consumable'			=> 'Consumible',
             'consumables'			=> 'Consumibles',
             'country'  				=> 'Pais',
        @@ -44,16 +51,21 @@
             'created'               => 'Artículo creado',
             'created_asset'			=> 'equipo creado',
             'created_at' 			=> 'Creado el',
        +    'updated_at' 			=> 'Actualizado en',
             'currency'  			=> '€', // this is deprecated
             'current'  				=> 'Actual',
             'custom_report'         => 'Reporte de Equipos Personalizado',
             'dashboard'				=> 'Tablero',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Fecha Compra',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => '¡Advertencia!',
        +    'debug_warning_text'         => 'Esta aplicación esta corriendo en modo producción con debugging activado. Esto puede exponer datos sensibles si su aplicación es accesible desde el exterior. Desactive el modo debug cambiando el valor <code>APP_DEBUG</code> en su archivo <code>.env</code> a <code>false</code>.',
             'delete'  				=> 'Borrar',
             'deleted'  				=> 'Borrado',
             'delete_seats'  		=> 'Asientos eliminados',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Instalados - ',
             'depreciation_report'	=> 'Informe de amortización',
             'download'				=> 'Descargar',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => '¡Permisos insuficientes!',
             'language'				=> 'Lenguaje',
             'last'					=> 'Último',
        +    'last_login'            => 'Último acceso',
             'last_name'             => 'Apellidos',
             'license'				=> 'Licencia',
             'license_report'        => 'Reporte de Licencias',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Más Info',
             'name'					=> 'Nombre Localización',
             'next'					=> 'Siguiente',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'nuevo!',
             'no_depreciation'		=> 'No Amortizar',
             'no_results'			=> 'Sin Resultados.',
             'no'  					=> 'No',
             'notes'  				=> 'Notas',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Nùmero de orden',
             'page_menu'				=> 'Mostrando elementos de _MENU_',
             'pagination_info'		=> 'Mostrando _START_ de _END_ de elementos _TOTAL_',
             'pending'				=> 'Equipo Pendiente',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Previo',
             'processing'			=> 'Procesando',
             'profile'				=> 'Perfil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Precio Compra',
        +    'purchase_date'         => 'Fecha de compra',
             'qty'		            => 'Cant',
             'quantity'		        => 'Cantidad',
             'ready_to_deploy'		=> 'Disponibles',
        @@ -138,27 +153,31 @@
             'select'				=> 'Seleccionar',
             'search'				=> 'Buscar',
             'select_category'       => 'Seleccione una categoría',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Seleccionar un tipo de Amortización',
             'select_location'		=> 'Seleccionar una Ubicación',
             'select_manufacturer'	=> 'Seleccionar un Fabricante',
             'select_model'			=> 'Seleccionar un Modelo',
             'select_supplier'		=> 'Seleccionar un Proveedor',
             'select_user'			=> 'Seleccionar un usuario',
        -    'select_date'			=> 'Seleccionar fecha',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Seleccionar Estado',
             'select_company'    	=> 'Seleccionar empresa',
             'select_asset'    		=> 'Seleccionar activos',
             'settings'				=> 'Opciones',
             'sign_in'				=> 'Entrar',
        -    'signature'             => 'Signature',
        +    'signature'             => 'Firma',
             'some_features_disabled' => 'MODO DE DEMOSTRACIÓN: Algunas funciones estan desactivadas para esta instalación.',
             'site_name'				=> 'Sitio',
             'state'  				=> 'Provincia',
             'status_labels'			=> 'Etiquetas Estados',
             'status'    			=> 'Estados',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Proveedor',
             'suppliers'  			=> 'Proveedores',
        +    'sure_to_delete'    => '¿Está seguro que desea eliminar',
             'submit'				=> 'Enviar',
        +    'target'                => 'Objetivo',
        +    'time_and_date_display' => 'Hora y fecha',
             'total_assets'			=> 'Equipos',
             'total_licenses'		=> 'licencias totales',
             'total_accessories'		=> 'total de accesorios',
        diff --git a/resources/lang/es-ES/mail.php b/resources/lang/es-ES/mail.php
        index c9a4fe182d..33a8ffe8bf 100644
        --- a/resources/lang/es-ES/mail.php
        +++ b/resources/lang/es-ES/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => 'El usuario ha cancelado el item solicitado en la pagina Web',
        +    'a_user_requested' => 'Un usuario a solicitado un item en la pagina Web',
        +    'accessory_name' => 'Nombre de accesorio:',
        +    'additional_notes' => 'Notas adicionales:',
        +    'admin_has_created' => 'Un administrador ha creado una cuenta para ti en la web :web.',
        +    'asset' => 'Activo:',
        +    'asset_name' => 'Nombre del activo:',
        +    'asset_requested' => 'Activo solicitado',
        +    'asset_tag' => 'Etiqueta de activo:',
        +    'assets_warrantee_expiring' => '{1} Activo con garantia expirando en los próximos 60 días.|[2,Inf] Activos con garantías                                      expirando en los próximos 60 días.',
        +    'assigned_to' => 'Asignado a',
        +    'best_regards' => 'Cordialmente,',
        +    'canceled' => 'Cancelado:',
        +    'checkin_date' => 'Fecha de entrada:',
        +    'checkout_date' => 'Fecha de salida:',
        +    'click_to_confirm' => 'Por favor, pulsa en el siguiente enlace para verificar tu cuenta de :web:',
        +    'click_on_the_link_accessory' => 'Haga clic en el enlace en la parte inferior para confirmar que ha recibido el accesorio.',
        +    'click_on_the_link_asset' => 'Haga clic en el enlace en la parte inferior para confirmar que ha recibido el activo.',
        +    'Confirm_Asset_Checkin' => 'Confirmación de retorno de activo.',
        +    'Confirm_Accessory_Checkin' => 'Confirmar devolución del accesorio.',
        +    'Confirm_accessory_delivery' => 'Confirman entrega de accesorio.',
        +    'Confirm_asset_delivery' => 'Confirman entrega de activos.',
        +    'Confirm_consumable_delivery' => 'Confirmar entrega consumible.',
        +    'current_QTY' => 'Cantidad actual',
        +    'Days' => 'Días',
        +    'days' => 'Días',
        +    'expecting_checkin_date' => 'Fecha de devolución prevista:',
        +    'expires' => 'Expira',
        +    'Expiring_Assets_Report' => 'Informe de activos que expiran.',
        +    'Expiring_Licenses_Report' => 'Informe de licencias que expiran.',
        +    'hello' => 'Hola',
        +    'hi' => 'Hola',
        +    'i_have_read' => 'Ha leído y aceptado los términos de uso y he recibido este artículo.',
        +    'item' => 'Articulo:',
        +    'items_below_minimum' => 'artículo {1} está por debajo del mínimo inventario o que pronto estará bajo. | [2, Inf] elementos que están por debajo de mínimo inventario o pronto estarán bajos.',
        +    'Item_Request_Canceled' => 'Solicitud de cancelación de requerimiento',
        +    'Item_Requested' => 'Artículo solicitado',
        +    'licenses_expiring' => '{1} licencia por expirar en los próximos 60 días. | [2, Inf] licencias caducan en los próximos 60 días.',
        +    'link_to_update_password' => 'Haga clic en el siguiente enlace para actualizar su: contraseña de la web:',
        +    'login_first_admin' => 'Inicie sesión en su nueva instalación de Snipe-IT con las credenciales siguientes:',
        +    'login' => 'Entrar:',
        +    'Low_Inventory_Report' => 'Reporte de inventario bajo',
        +    'min_QTY' => 'Cantidad mínima',
        +    'name' => 'Nombre',
        +    'new_item_checked' => 'Un nuevo artículo se ha extraído bajo su nombre, los detalles están a continuación.',
        +    'password' => 'Contraseña:',
        +    'password_reset' => 'Reiniciar la contraseña',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Por favor lea las condiciones de uso a continuación.',
        +    'read_the_terms_and_click' => 'Por favor lea los términos de uso abajo y haga clic en el enlace en la parte inferior para confirmar que leído y acepta los términos de uso y han recibido el activo.',
        +    'requested' => 'Solicitado:',
        +    'reset_link' => 'Tu enlace de restablecimiento de contraseña',
        +    'reset_password' => 'Haga Clic aquí para restablecer su contraseña:',
        +    'serial' => 'Número de serie:',
        +    'supplier' => 'Proveedor',
        +    'tag' => 'Etiqueta',
        +    'test_email' => 'Email de prueba de Snipe-IT',
        +    'test_mail_text' => 'Esto es una prueba desde el sistema de gestión de activos de Snipe-IT. Si tienes esto, correo está funcionando :)',
        +    'the_following_item' => 'El siguiente artículo ha sido devuelto: ',
        +    'There_are' => 'Hay',
        +    'to_reset' => 'Para restaurar tu contraseña de :web, rellena este formulario:',
        +    'type' => 'Tipo',
        +    'user' => 'Usuario:',
        +    'username' => 'Nombre de usuario:',
        +    'welcome' => 'Bienvenido, :name',
        +    'welcome_to' => '¡Bienvenido a: web!',
        +    'your_credentials' => 'Tus credenciales de Snipe-IT',
         );
        diff --git a/resources/lang/es-ES/validation.php b/resources/lang/es-ES/validation.php
        index 899ee1769e..5c3a3cb37e 100644
        --- a/resources/lang/es-ES/validation.php
        +++ b/resources/lang/es-ES/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute debe ser aceptado.",
        -    "active_url"       => ":attribute no es una URL correcta.",
        -    "after"            => ":attribute debe ser posterior a :date.",
        -    "alpha"            => ":attribute solo acepta letras.",
        -    "alpha_dash"       => ":attribute solo acepta letras, números y guiones.",
        -    "alpha_num"        => ":attribute solo acepta letras y números.",
        -    "before"           => ":attribute debe ser anterior a :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute debe estar entre :min - :max.",
        -        "file"    => ":attribute debe estar entre :min - :max kilobytes.",
        -        "string"  => ":attribute debe estar entre :min - :max caracteres.",
        -    ),
        -    "confirmed"        => ":attribute la confirmación no coincide.",
        -    "date"             => ":attribute no es una fecha correcta.",
        -    "date_format"      => ":attribute no cumple el formato :format.",
        -    "different"        => ":attribute y :other deben ser diferentes.",
        -    "digits"           => ":attribute debe tener :digits dígitos.",
        -    "digits_between"   => ":attribute debe tener entre :min y :max dígitos.",
        -    "email"            => ":attribute formato incorrecto.",
        -    "exists"           => "El :attribute seleccionado no es correcto.",
        -    "email_array"      => "Una o más direcciones de correo electrónico no es válido.",
        -    "image"            => ":attribute debe ser una imagen.",
        -    "in"               => "El :attribute seleccionado no es correcto.",
        -    "integer"          => ":attribute debe ser un número entero.",
        -    "ip"               => ":attribute debe ser una dirección IP correcta.",
        -    "max"              => array(
        -        "numeric" => ":attribute no debe ser mayor que :max.",
        -        "file"    => ":attribute no debe ser mayor que :max kilobytes.",
        -        "string"  => ":attribute no debe tener como máximo :max caracteres.",
        -    ),
        -    "mimes"            => ":attribute debe ser un archivo del tipo: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute debe ser como mínimo :min.",
        -        "file"    => ":attribute debe ser como mínimo de :min kilobytes.",
        -        "string"  => ":attribute debe contener como mínimo :min caracteres.",
        -    ),
        -    "not_in"           => "El :attribute seleccionado no es correcto.",
        -    "numeric"          => ":attribute debe ser un número.",
        -    "regex"            => ":attribute formato incorrecto.",
        -    "required"         => ":attribute es obligatorio.",
        -    "required_if"      => ":attribute es obligatrio cuando :other es :value.",
        -    "required_with"    => ":attribute es obligatrio cuando :values es present.",
        -    "required_without" => ":attribute es obligatrio cuando :values es not present.",
        -    "same"             => ":attribute y :other deben coincidir.",
        -    "size"             => array(
        -        "numeric" => ":attribute debe tener :size.",
        -        "file"    => ":attribute debe tener :size kilobytes.",
        -        "string"  => ":attribute debe tener :size caracteres.",
        -    ),
        -    "unique"           => ":attribute ya ha sido introducido.",
        -    "url"              => ":attribute formato incorrecto.",
        -    "statuslabel_type" => "Debe seleccionar un tipo de etiqueta de estado válido",
        -    "unique_undeleted" => ":attribute debe ser único.",
        +    'accepted'             => ':attribute debe ser aceptado.',
        +    'active_url'           => ':attribute no es una URL correcta.',
        +    'after'                => ':attribute debe ser posterior a :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute solo acepta letras.',
        +    'alpha_dash'           => ':attribute solo acepta letras, números y guiones.',
        +    'alpha_num'            => ':attribute solo acepta letras y números.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute debe ser anterior a :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute debe estar entre :min - :max.',
        +        'file'    => ':attribute debe estar entre :min - :max kilobytes.',
        +        'string'  => ':attribute debe estar entre :min - :max caracteres.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute debe ser verdadero o falso.',
        +    'confirmed'            => ':attribute la confirmación no coincide.',
        +    'date'                 => ':attribute no es una fecha correcta.',
        +    'date_format'          => ':attribute no cumple el formato :format.',
        +    'different'            => ':attribute y :other deben ser diferentes.',
        +    'digits'               => ':attribute debe tener :digits dígitos.',
        +    'digits_between'       => ':attribute debe tener entre :min y :max dígitos.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute formato incorrecto.',
        +    'exists'               => 'El :attribute seleccionado no es correcto.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute debe ser una imagen.',
        +    'in'                   => 'El :attribute seleccionado no es correcto.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute debe ser un número entero.',
        +    'ip'                   => ':attribute debe ser una dirección IP correcta.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute no debe ser mayor que :max.',
        +        'file'    => ':attribute no debe ser mayor que :max kilobytes.',
        +        'string'  => ':attribute no debe tener como máximo :max caracteres.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute debe ser un archivo del tipo: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute debe ser como mínimo :min.',
        +        'file'    => ':attribute debe ser como mínimo de :min kilobytes.',
        +        'string'  => ':attribute debe contener como mínimo :min caracteres.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'El :attribute seleccionado no es correcto.',
        +    'numeric'              => ':attribute debe ser un número.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute formato incorrecto.',
        +    'required'             => ':attribute es obligatorio.',
        +    'required_if'          => ':attribute es obligatrio cuando :other es :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute es obligatrio cuando :values es present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute es obligatrio cuando :values es not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute y :other deben coincidir.',
        +    'size'                 => [
        +        'numeric' => ':attribute debe tener :size.',
        +        'file'    => ':attribute debe tener :size kilobytes.',
        +        'string'  => ':attribute debe tener :size caracteres.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute ya ha sido introducido.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute formato incorrecto.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "El campo :attribute contiene un caracter que no está permitido.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/et/admin/accessories/general.php b/resources/lang/et/admin/accessories/general.php
        new file mode 100644
        index 0000000000..22771aff0c
        --- /dev/null
        +++ b/resources/lang/et/admin/accessories/general.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +    'about_accessories_title' 			=> 'About Accessories',
        +    'about_accessories_text'  			=> 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
        +    'accessory_category' 				=> 'Accessory Category',
        +    'accessory_name'  					=> 'Accessory Name',
        +    'checkout'  							=> 'Checkout Accessory',
        +    'checkin'  							=> 'Checkin Accessory',
        +    'create'  							=> 'Create Accessory',
        +    'edit'  							=> 'Edit Accessory',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'total'  							=> 'Total',
        +    'remaining'  						=> 'Avail',
        +    'update'  							=> 'Update Accessory',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/et/admin/accessories/message.php b/resources/lang/et/admin/accessories/message.php
        new file mode 100644
        index 0000000000..92998a4e14
        --- /dev/null
        +++ b/resources/lang/et/admin/accessories/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'The accessory does not exist.',
        +    'assoc_users'	 => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'The accessory was not created, please try again.',
        +        'success' => 'The accessory was successfully created.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'The accessory was not updated, please try again',
        +        'success' => 'The accessory was updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this accessory?',
        +        'error'   => 'There was an issue deleting the accessory. Please try again.',
        +        'success' => 'The accessory was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Accessory was not checked out, please try again',
        +        'success' 		=> 'Accessory checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Accessory was not checked in, please try again',
        +        'success' 		=> 'Accessory checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/et/admin/accessories/table.php b/resources/lang/et/admin/accessories/table.php
        new file mode 100644
        index 0000000000..e02d9f22e4
        --- /dev/null
        +++ b/resources/lang/et/admin/accessories/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +	'dl_csv'      				=> 'Download CSV',
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Accessory Name',
        +
        +
        +);
        diff --git a/resources/lang/et/admin/asset_maintenances/form.php b/resources/lang/et/admin/asset_maintenances/form.php
        new file mode 100644
        index 0000000000..2aa005c45f
        --- /dev/null
        +++ b/resources/lang/et/admin/asset_maintenances/form.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +    return [
        +        'asset_maintenance_type' => 'Maintenance Type',
        +        'title'                  => 'Title',
        +        'start_date'             => 'Started',
        +        'completion_date'        => 'Completed',
        +        'cost'                   => 'Cost',
        +        'is_warranty'            => 'Warranty Improvement',
        +        'asset_maintenance_time' => 'Days',
        +        'notes'                  => 'Notes',
        +        'update'                 => 'Update',
        +        'create'                 => 'Create'
        +    ];
        diff --git a/resources/lang/et/admin/asset_maintenances/general.php b/resources/lang/et/admin/asset_maintenances/general.php
        new file mode 100644
        index 0000000000..c7ae42d41a
        --- /dev/null
        +++ b/resources/lang/et/admin/asset_maintenances/general.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +    return [
        +        'asset_maintenances' => 'Asset Maintenances',
        +        'edit'               => 'Edit Asset Maintenance',
        +        'delete'             => 'Delete Asset Maintenance',
        +        'view'               => 'View Asset Maintenance Details',
        +        'repair'             => 'Repair',
        +        'maintenance'        => 'Maintenance',
        +        'upgrade'            => 'Upgrade'
        +    ];
        diff --git a/resources/lang/et/admin/asset_maintenances/message.php b/resources/lang/et/admin/asset_maintenances/message.php
        new file mode 100644
        index 0000000000..d121115825
        --- /dev/null
        +++ b/resources/lang/et/admin/asset_maintenances/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +    return [
        +        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'delete'                       => [
        +            'confirm' => 'Are you sure you wish to delete this asset maintenance?',
        +            'error'   => 'There was an issue deleting the asset maintenance. Please try again.',
        +            'success' => 'The asset maintenance was deleted successfully.'
        +        ],
        +        'create'                       => [
        +            'error'   => 'Asset Maintenance was not created, please try again.',
        +            'success' => 'Asset Maintenance created successfully.'
        +        ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Not Completed Yet',
        +        'warranty'                     => 'Warranty',
        +        'not_warranty'                 => 'Not Warranty',
        +    ];
        \ No newline at end of file
        diff --git a/resources/lang/et/admin/asset_maintenances/table.php b/resources/lang/et/admin/asset_maintenances/table.php
        new file mode 100644
        index 0000000000..f3a6be60f9
        --- /dev/null
        +++ b/resources/lang/et/admin/asset_maintenances/table.php
        @@ -0,0 +1,8 @@
        +<?php
        +
        +    return [
        +        'title'         => 'Asset Maintenance',
        +        'asset_name'    => 'Asset Name',
        +        'is_warranty'   => 'Warranty',
        +        'dl_csv'        => 'Download CSV'
        +    ];
        diff --git a/resources/lang/et/admin/categories/general.php b/resources/lang/et/admin/categories/general.php
        new file mode 100644
        index 0000000000..1c8a2c6d2c
        --- /dev/null
        +++ b/resources/lang/et/admin/categories/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_categories_title' 			=> 'Kategooriatest',
        +    'about_categories'  				=> 'Kategooriad aitavad sul asju organiseerida. Kategooriad võivad olla näitelks &quot;Lauaarvutid&quot;,&quot;Sülearvutid&quot;,&quot;Mobiiltelefonid&quot;,&quot;Tahvelarvutid&quot; ja nõnda edasi, kuid võid kasutada kategooriaid igal kombel, mis tundub sulle endale mõistlik.',
        +    'asset_categories' 					=> 'Vahendite kategooriad',
        +    'category_name'  					=> 'Kategooria nimi',
        +    'checkin_email'                     => 'Send email to user on checkin.',
        +    'clone'                             => 'Klooni kategooria',
        +    'create'  							=> 'Uus kategooria',
        +    'edit'                              => 'Muuda kategooriat',
        +    'eula_text'							=> 'Kategooria EULA',
        +    'eula_text_help'					=> 'Selle välja abil saad oma EULA-t kohendada konkreetsele vahendi tüübile sobivaks. Kui sul on ainult üks EULA kõigile vahenditele, võid märkida valiku siin all, et kasutada peamist vaikimisi versiooni.',
        +    'name'                              => 'Kategooria nimi',
        +    'require_acceptance'				=> 'Nõua kasutajatelt selle kategooria puhul vahendi vastuvõtmiseks kinnitust.',
        +    'required_acceptance'				=> 'Kasutajale saadetakse e-mailiga link, et selle vaendi vastuvõtmine kinnitada.',
        +    'required_eula'						=> 'Kasutajale saadetakse EULA koopia',
        +    'no_default_eula'					=> 'Peamine vaikumisi EULA puudub. Lisa see seadete alt.',
        +    'update'  							=> 'Uuenda kategooriat',
        +    'use_default_eula'					=> 'Kasuta hoopis <a href="#" data-toggle="modal" data-target="#eulaModal">peamist vaikimisi EULA-t</a>.',
        +    'use_default_eula_disabled'			=> '<del>Kasuta hoopis peamist vaikimisi EULAt.</del> Peamine vaikumisi EULA puudub. Lisa see seadete alt.',
        +
        +);
        diff --git a/resources/lang/et/admin/categories/message.php b/resources/lang/et/admin/categories/message.php
        new file mode 100644
        index 0000000000..b4c15d7cfb
        --- /dev/null
        +++ b/resources/lang/et/admin/categories/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Kategooria puudub.',
        +    'assoc_models'	 => 'Selle kategooriaga on seotud vähemalt üks mudel ja seda ei saa kustutada. Palun uuendage oma mudeleid, et need ei kasutaks seda kategooriat ning seejärel proovige uuesti. ',
        +    'assoc_items'	 => 'Selle kategooriaga on seotud vähemalt üks :asset_type ja seda ei saa kustutada. Palun uuendage oma :asset_typr, et too ei kasutaks seda kategooriat ning seejärel proovige uuesti. ',
        +
        +    'create' => array(
        +        'error'   => 'Kategooriat ei loodud, proovi uuesti.',
        +        'success' => 'Kategooria loomine õnnestus.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Kategooriat ei uuendatud, proovige uuesti',
        +        'success' => 'Kategooria uuendamine õnnestus.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Kas oled kindel, et soovid selle kategooria kustutada?',
        +        'error'   => 'Kategooria kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Kategooria kustutamine õnnestus.'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/categories/table.php b/resources/lang/et/admin/categories/table.php
        new file mode 100644
        index 0000000000..8221c43810
        --- /dev/null
        +++ b/resources/lang/et/admin/categories/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'parent'   					=> 'Parent',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Vahendi kategooria nimi',
        +
        +);
        diff --git a/resources/lang/et/admin/companies/general.php b/resources/lang/et/admin/companies/general.php
        new file mode 100644
        index 0000000000..6976980d70
        --- /dev/null
        +++ b/resources/lang/et/admin/companies/general.php
        @@ -0,0 +1,6 @@
        +<?php
        +return [
        +    'about_companies_title'            => 'Ettevõtetest',
        +    'about_companies_text'                  => 'Ettevõtteid saab kasutada kui lihtsa identifikaatorina või kui vahendite, kasutajate jms nähtavuse piiramiseks kui täielik ettevõtete tugi on seadetes peale keeratud.',
        +    'select_company' => 'Vali ettevõte',
        +];
        diff --git a/resources/lang/et/admin/companies/message.php b/resources/lang/et/admin/companies/message.php
        new file mode 100644
        index 0000000000..c2132d1614
        --- /dev/null
        +++ b/resources/lang/et/admin/companies/message.php
        @@ -0,0 +1,18 @@
        +<?php
        +return array(
        +    'does_not_exist' => 'Ettevõtet pole olemas.',
        +    'assoc_users'    => 'Selle ettevõttega on seotud vähemalt üks mudel ja seda ei saa kustutada. Palun uuenda oma mudeleid, et need ei kasutaks seda ettevõtet ning seejärel proovi uuesti. ',
        +    'create' => array(
        +        'error'   => 'Ettevõtet ei loodud, proovi uuesti.',
        +        'success' => 'Ettevõtte loomine õnnestus.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Ettevõtet ei uuendatud, proovige uuesti',
        +        'success' => 'Ettevõtte uuendamine õnnestus.'
        +    ),
        +    'delete' => array(
        +        'confirm' => 'Kas oled kindel, et soovid selle ettevõtte kustutada?',
        +        'error'   => 'Ettevõtte kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Ettevõtte kustutamine õnnestus.'
        +    )
        +);
        diff --git a/resources/lang/et/admin/companies/table.php b/resources/lang/et/admin/companies/table.php
        new file mode 100644
        index 0000000000..26e92078ff
        --- /dev/null
        +++ b/resources/lang/et/admin/companies/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +return array(
        +    'companies' => 'Ettevõtted',
        +    'create'    => 'Uus ettevõte',
        +    'title'     => 'Ettevõte',
        +    'update'    => 'Muuda ettevõtet',
        +    'name'      => 'Ettevõtte nimi',
        +    'id'        => 'ID',
        +);
        diff --git a/resources/lang/et/admin/components/general.php b/resources/lang/et/admin/components/general.php
        new file mode 100644
        index 0000000000..d01557dec2
        --- /dev/null
        +++ b/resources/lang/et/admin/components/general.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about_components_title' 			=> 'Komponentidest',
        +    'about_components_text'  			=> 'Komponendid on asjad, mis on vahendite osadeks. Näiteks HDD, RAM jne.',
        +    'component_name'                  => 'Komponendi nimi',
        +    'checkin'                             => 'Checkin Component',
        +    'checkout'                             => 'Checkout Component',
        +    'cost'				=> 'Ostuhind',
        +    'create'                             => 'Uus komponent',
        +    'edit'                             => 'Muuda komponenti',
        +    'date'					=> 'Ostu kuupäev',
        +    'order'					=> 'Tellimuse number',
        +    'remaining' 			             => 'Alles',
        +    'total' 			                 => 'Kokku',
        +    'update'                            => 'Muuda komponenti',
        +);
        diff --git a/resources/lang/et/admin/components/message.php b/resources/lang/et/admin/components/message.php
        new file mode 100644
        index 0000000000..8a5a4ad768
        --- /dev/null
        +++ b/resources/lang/et/admin/components/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Komponenti pole olemas.',
        +
        +    'create' => array(
        +        'error'   => 'Komponenti ei loodud, proovi uuesti.',
        +        'success' => 'Komponendi loomine õnnestus.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Component was not updated, please try again',
        +        'success' => 'Komponendi muutmine õnnestus.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Kas oled kindel, et soovid selle komponendi kustutada?',
        +        'error'   => 'Komponendi kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Komponendi kustutamine õnnestus.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Component was not checked out, please try again',
        +        'success' 		=> 'Component checked out successfully.',
        +        'user_does_not_exist' => 'Vale kasutaja. Palun proovi uuesti.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Component was not checked in, please try again',
        +        'success' 		=> 'Component checked in successfully.',
        +        'user_does_not_exist' => 'Vale kasutaja. Palun proovi uuesti.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/et/admin/components/table.php b/resources/lang/et/admin/components/table.php
        new file mode 100644
        index 0000000000..36944b8c1c
        --- /dev/null
        +++ b/resources/lang/et/admin/components/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Komponendi nimi',
        +);
        diff --git a/resources/lang/et/admin/consumables/general.php b/resources/lang/et/admin/consumables/general.php
        new file mode 100644
        index 0000000000..b7fe9b51f1
        --- /dev/null
        +++ b/resources/lang/et/admin/consumables/general.php
        @@ -0,0 +1,13 @@
        +<?php
        +
        +return array(
        +    'about_consumables_title' 			=> 'Kuluvahenditest',
        +    'about_consumables_text'  			=> 'Kuluvahendid on kõik asjad, mis peale ostmist kasutatakse lõplikult ära. Näiteks printeritint või koopiapaber.',
        +    'checkout'                          => 'Checkout Consumable to User',
        +    'consumable_name'                   => 'Kuluvahendi nimi',
        +    'create'                            => 'Create Consumable',
        +    'item_no'                           => 'Item No.',
        +    'remaining' 			            => 'Alles',
        +    'total' 			                => 'Kokku',
        +    'update'                            => 'Muuda kuluvahendit',
        +);
        diff --git a/resources/lang/et/admin/consumables/message.php b/resources/lang/et/admin/consumables/message.php
        new file mode 100644
        index 0000000000..c959298fe1
        --- /dev/null
        +++ b/resources/lang/et/admin/consumables/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Kuluvahendit pole olemas.',
        +
        +    'create' => array(
        +        'error'   => 'Kuluvahendit ei loodud, proovi uuesti.',
        +        'success' => 'Kuluvahendi loomine õnnestus.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Kuluvahendit ei muudetud, proovi uuesti',
        +        'success' => 'Kuluvahendi muutmine õnnestus.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Kas oled kindel, et soovid selle kuluvahendi kustutada?',
        +        'error'   => 'Kuluvahendi kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Kuluvahendi kustutamine õnnestus.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Consumable was not checked out, please try again',
        +        'success' 		=> 'Consumable checked out successfully.',
        +        'user_does_not_exist' => 'See kasutaja ei sobi. Palun proovi uuesti.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Consumable was not checked in, please try again',
        +        'success' 		=> 'Consumable checked in successfully.',
        +        'user_does_not_exist' => 'See kasutaja ei sobi. Palun proovi uuesti.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/et/admin/consumables/table.php b/resources/lang/et/admin/consumables/table.php
        new file mode 100644
        index 0000000000..bb76721f17
        --- /dev/null
        +++ b/resources/lang/et/admin/consumables/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Consumable Name',
        +);
        diff --git a/resources/lang/et/admin/custom_fields/general.php b/resources/lang/et/admin/custom_fields/general.php
        new file mode 100644
        index 0000000000..f2e6df90cb
        --- /dev/null
        +++ b/resources/lang/et/admin/custom_fields/general.php
        @@ -0,0 +1,30 @@
        +<?php
        +
        +return array(
        +    'custom_fields'		        => 'Custom Fields',
        +    'field'		                => 'Field',
        +    'about_fieldsets_title'		=> 'About Fieldsets',
        +    'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        +    'custom_format'             => 'Custom format...',
        +    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        +    'encrypted'      	        => 'Encrypted',
        +    'fieldset'      	        => 'Fieldset',
        +    'qty_fields'      	      => 'Qty Fields',
        +    'fieldsets'      	        => 'Fieldsets',
        +    'fieldset_name'           => 'Fieldset Name',
        +    'field_name'              => 'Field Name',
        +    'field_values'            => 'Field Values',
        +    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_element'           => 'Form Element',
        +    'field_element_short'     => 'Element',
        +    'field_format'            => 'Format',
        +    'field_custom_format'     => 'Custom Format',
        +    'required'   		          => 'Required',
        +    'req'   		              => 'Req.',
        +    'used_by_models'   		    => 'Used By Models',
        +    'order'   		            => 'Order',
        +    'create_fieldset'         => 'New Fieldset',
        +    'create_field'            => 'New Custom Field',
        +    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +);
        diff --git a/resources/lang/et/admin/custom_fields/message.php b/resources/lang/et/admin/custom_fields/message.php
        new file mode 100644
        index 0000000000..ed66a6ba16
        --- /dev/null
        +++ b/resources/lang/et/admin/custom_fields/message.php
        @@ -0,0 +1,57 @@
        +<?php
        +
        +return array(
        +
        +    'field' => array(
        +        'invalid'   => 'That field does not exist.',
        +        'already_added'   => 'Field already added',
        +
        +        'create' => array(
        +            'error'   => 'Field was not created, please try again.',
        +            'success' => 'Field created successfully.',
        +            'assoc_success' => 'Field successfully added to fieldset.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Field was not updated, please try again',
        +            'success' => 'Field updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this field?',
        +            'error'   => 'There was an issue deleting the field. Please try again.',
        +            'success' => 'The field was deleted successfully.',
        +            'in_use'   => 'Field is still in use.',
        +        )
        +
        +    ),
        +
        +    'fieldset' => array(
        +
        +        'does_not_exist' => 'Fieldset does not exist',
        +
        +        'create' => array(
        +            'error'   => 'Fieldset was not created, please try again.',
        +            'success' => 'Fieldset created successfully.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Fieldset was not updated, please try again',
        +            'success' => 'Fieldset updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        +            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        +            'success' => 'The fieldset was deleted successfully.',
        +            'in_use'   => 'Fieldset is still in use.',
        +        )
        +
        +    ),
        +
        +
        +
        +
        +
        +
        +);
        diff --git a/resources/lang/et/admin/departments/message.php b/resources/lang/et/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/et/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/departments/table.php b/resources/lang/et/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/et/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/et/admin/depreciations/general.php b/resources/lang/et/admin/depreciations/general.php
        new file mode 100644
        index 0000000000..1fca0e2cb7
        --- /dev/null
        +++ b/resources/lang/et/admin/depreciations/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return array(
        +    'about_asset_depreciations'  			=> 'About Asset Depreciations',
        +    'about_depreciations'  					=> 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
        +    'asset_depreciations'  					=> 'Asset Depreciations',
        +    'create'  					            => 'Create Depreciation',
        +    'depreciation_name'  					=> 'Depreciation Name',
        +    'number_of_months'  					=> 'Number of Months',
        +    'update'  					            => 'Update Depreciation',
        +
        +);
        diff --git a/resources/lang/et/admin/depreciations/message.php b/resources/lang/et/admin/depreciations/message.php
        new file mode 100644
        index 0000000000..c20e52c13c
        --- /dev/null
        +++ b/resources/lang/et/admin/depreciations/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Depreciation class does not exist.',
        +    'assoc_users'	 => 'This depreciation is currently associated with one or more models and cannot be deleted. Please delete the models, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Depreciation class was not created, please try again. :(',
        +        'success' => 'Depreciation class created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Depreciation class was not updated, please try again',
        +        'success' => 'Depreciation class updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this depreciation class?',
        +        'error'   => 'There was an issue deleting the depreciation class. Please try again.',
        +        'success' => 'The depreciation class was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/depreciations/table.php b/resources/lang/et/admin/depreciations/table.php
        new file mode 100644
        index 0000000000..5ba01d132c
        --- /dev/null
        +++ b/resources/lang/et/admin/depreciations/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'id'      => 'ID',
        +    'months'   => 'Months',
        +    'term'   => 'Term',
        +    'title'      => 'Name ',
        +
        +);
        diff --git a/resources/lang/et/admin/groups/message.php b/resources/lang/et/admin/groups/message.php
        new file mode 100644
        index 0000000000..8336fed222
        --- /dev/null
        +++ b/resources/lang/et/admin/groups/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'group_exists'        => 'Grupp on juba olemas!',
        +    'group_not_found'     => 'Rühma [: id] ei ole olemas.',
        +    'group_name_required' => 'Nimi on kohustuslik',
        +
        +    'success' => array(
        +        'create' => 'Grupi loomine õnnestus.',
        +        'update' => 'Grupi uuendamine õnnestus.',
        +        'delete' => 'Grupi kustutamine õnnestus.',
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Oled sa kindel, et soovid selle grupi kustutada?',
        +        'create' => 'Grupi loomisel tekkis probleem. Palun proovi uuesti.',
        +        'update' => 'Grupi uuendamisel tekkis probleem. Palun proovi uuesti.',
        +        'delete' => 'Grupi kustutamisel tekkis probleem. Palun proovi uuesti.',
        +    ),
        +
        +);
        diff --git a/resources/lang/et/admin/groups/table.php b/resources/lang/et/admin/groups/table.php
        new file mode 100644
        index 0000000000..05154b76c6
        --- /dev/null
        +++ b/resources/lang/et/admin/groups/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +
        +return array(
        +
        +    'id'         => 'Id',
        +    'name'       => 'Nimi',
        +    'users'      => 'Kasutajate hulk',
        +
        +);
        diff --git a/resources/lang/et/admin/groups/titles.php b/resources/lang/et/admin/groups/titles.php
        new file mode 100644
        index 0000000000..3b8ccaa798
        --- /dev/null
        +++ b/resources/lang/et/admin/groups/titles.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +return array(
        +    'about_groups_title'            => 'Gruppidest',
        +    'about_groups'                  => 'Gruppe kastatakse kasutajaõiguste koondamiseks.',
        +    'group_management' 	 	=> 'Gruppide haldus',
        +    'create' 	 	 	    => 'Uus grupp',
        +    'update' 	 		        => 'Muuda gruppi',
        +    'group_name' 	 		=> 'Grupi nimi',
        +    'group_admin' 	 		=> 'Grupi admin',
        +    'allow' 	 			=> 'Luba',
        +    'deny' 	 				=> 'Keela',
        +
        +);
        diff --git a/resources/lang/et/admin/hardware/form.php b/resources/lang/et/admin/hardware/form.php
        new file mode 100644
        index 0000000000..ea6736bbf6
        --- /dev/null
        +++ b/resources/lang/et/admin/hardware/form.php
        @@ -0,0 +1,42 @@
        +<?php
        +
        +return array(
        +	'bulk_delete'		=> 'Kinnita kahendite hulgi kustutamine',
        +  'bulk_delete_help'	=> 'Kontrolli alltoodud vahendid hulgi kustutamiseks. Kui oled need kustutanud, võib neid veel taastada, kuid neid ei saa enam seostada kasutajatega, kellega nad hetkel seotud on.',
        +  'bulk_delete_warn'	=> 'Sa hakkad kustsutama :asset_count vahendit.',
        +	'bulk_update'		=> 'Bulk Update Assets',
        +	'bulk_update_help'	=> 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
        +	'bulk_update_warn'	=> 'You are about to edit the properties of :asset_count assets.',
        +    'checkedout_to'		=> 'Checked Out To',
        +    'checkout_date'		=> 'Checkout Date',
        +    'checkin_date'		=> 'Checkin Date',
        +    'checkout_to'		=> 'Checkout to',
        +    'cost'				=> 'Ostuhind',
        +    'create'			=> 'Loo vahend',
        +    'date'				=> 'Ostu kuupäev',
        +    'depreciates_on'	=> 'Depreciates On',
        +    'default_location'	=> 'Vaikimisi asukoht',
        +    'eol_date'			=> 'EOL Date',
        +    'eol_rate'			=> 'EOL Rate',
        +    'expected_checkin'  => 'Expected Checkin Date',
        +    'expires'			=> 'Aegub',
        +    'fully_depreciated'	=> 'Fully Depreciated',
        +    'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
        +    'mac_address'		=> 'MAC aadress',
        +    'manufacturer'		=> 'Tootja',
        +    'model'				=> 'Mudel',
        +    'months'			=> 'kuud',
        +    'name'				=> 'Ressursi nimi',
        +    'notes'				=> 'Märkmed',
        +    'order'				=> 'Tellimuse number',
        +    'qr'				=> 'QR kood',
        +    'requestable'		=> 'Users may request this asset',
        +    'select_statustype'	=> 'Select Status Type',
        +    'serial'			=> 'Seerianumber',
        +    'status'			=> 'Staatus',
        +    'tag'				=> 'Asset Tag',
        +    'update'			=> 'Asset Update',
        +    'warranty'			=> 'Garantii',
        +    'years'				=> 'aastat',
        +)
        +;
        diff --git a/resources/lang/et/admin/hardware/general.php b/resources/lang/et/admin/hardware/general.php
        new file mode 100644
        index 0000000000..51fdd99ff5
        --- /dev/null
        +++ b/resources/lang/et/admin/hardware/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_assets_title'           => 'Vahenditest',
        +    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +	'archived'  				=> 'Arhiveeritud',
        +    'asset'  					=> 'Vahend',
        +    'bulk_checkout'             => 'Checkout Assets to User',
        +    'checkin'  					=> 'Checkin Asset',
        +    'checkout'  				=> 'Checkout Asset',
        +    'clone'  					=> 'Klooni vahend',
        +    'deployable'  				=> 'Deployable',
        +    'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        +    'edit'  					=> 'Muuda vahendit',
        +	'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'model_deleted'  			=> 'This Assets model has been deleted. You must restore the model before you can restore the Asset.<br/> <a href="/hardware/models/:model_id/restore">Click here to restore the model</a>.',
        +    'requestable'               => 'Taodeldav',
        +    'requested'				    => 'Taotletud',
        +    'restore'  					=> 'Taasta vara',
        +    'pending'  					=> 'Ootel',
        +    'undeployable'  			=> 'Undeployable',
        +    'view'  					=> 'Vaata vahendit',
        +);
        diff --git a/resources/lang/et/admin/hardware/message.php b/resources/lang/et/admin/hardware/message.php
        new file mode 100644
        index 0000000000..3f4d46aea1
        --- /dev/null
        +++ b/resources/lang/et/admin/hardware/message.php
        @@ -0,0 +1,82 @@
        +<?php
        +
        +return array(
        +
        +    'undeployable' 		=> '<strong>Warning: </strong> This asset has been marked as currently undeployable.
        +                        If this status has changed, please update the asset status.',
        +    'does_not_exist' 	=> 'Vahend puudub.',
        +    'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
        +    'assoc_users'	 	=> 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
        +
        +    'create' => array(
        +        'error'   		=> 'Vahendit ei loodud, palun proovi uuesti. :(',
        +        'success' 		=> 'Vahendi loomine õnnestus. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   			=> 'Asset was not updated, please try again',
        +        'success' 			=> 'Asset updated successfully.',
        +        'nothing_updated'	=>  'No fields were selected, so nothing was updated.',
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Asset was not restored, please try again',
        +        'success' 		=> 'Asset restored successfully.'
        +    ),
        +
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +    'import' => array(
        +        'error'                 => 'Some items did not import correctly.',
        +        'errorDetail'           => 'The following Items were not imported because of errors.',
        +        'success'               => "Your file has been imported",
        +        'file_delete_success'   => "Your file has been been successfully deleted",
        +        'file_delete_error'      => "The file was unable to be deleted",
        +    ),
        +
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this asset?',
        +        'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
        +        'success' 		=> 'The asset was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   		=> 'Asset was not checked out, please try again',
        +        'success' 		=> 'Asset checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'not_available' => 'That asset is not available for checkout!'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Asset was not checked in, please try again',
        +        'success' 		=> 'Asset checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'already_checked_in'  => 'That asset is already checked in.',
        +
        +    ),
        +
        +    'requests' => array(
        +        'error'   		=> 'Asset was not requested, please try again',
        +        'success' 		=> 'Asset requested successfully.',
        +        'canceled'      => 'Checkout request successfully canceled'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/hardware/table.php b/resources/lang/et/admin/hardware/table.php
        new file mode 100644
        index 0000000000..e8baa09d5a
        --- /dev/null
        +++ b/resources/lang/et/admin/hardware/table.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'asset_tag'   	=> 'Asset Tag',
        +    'asset_model'       => 'Model',
        +    'book_value'  	=> 'Value',
        +    'change' 		=> 'In/Out',
        +    'checkout_date' => 'Checkout Date',
        +    'checkoutto' 	=> 'Checked Out',
        +    'diff' 			=> 'Diff',
        +    'dl_csv' 		=> 'Download CSV',
        +    'eol' 			=> 'EOL',
        +    'id'      		=> 'ID',
        +    'location' 		=> 'Location',
        +    'purchase_cost'	=> 'Cost',
        +    'purchase_date'	=> 'Purchased',
        +    'serial'   		=> 'Serial',
        +    'status'   		=> 'Status',
        +    'title'      	=> 'Asset ',
        +    'image'		=> 'Device Image',
        +    'days_without_acceptance' => 'Days Without Acceptance'
        +
        +);
        diff --git a/resources/lang/et/admin/licenses/form.php b/resources/lang/et/admin/licenses/form.php
        new file mode 100644
        index 0000000000..f3b854d12c
        --- /dev/null
        +++ b/resources/lang/et/admin/licenses/form.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'asset'             => 'Vahend',
        +    'checkin'           => 'Checkin',
        +    'create'            => 'Uus litsents',
        +    'expiration'        => 'Aegumiskuupäev',
        +    'license_key'       => 'Tootevõti',
        +    'maintained'        => 'Kasutajatoega',
        +    'name'              => 'Tarkvara nimi',
        +    'no_depreciation'   => 'Do Not Depreciate',
        +    'purchase_order'    => 'Tellimuse number',
        +    'reassignable'      => 'Taas-kasutatav',
        +    'remaining_seats'   => 'Kasutamata tööjaamu',
        +    'seats'             => 'Tööjaamu',
        +    'termination_date'  => 'Lõpetamise kuupäev',
        +    'to_email'          => 'Litsenseeritud e-mailile',
        +    'to_name'           => 'Litsenseeritud nimele',
        +    'update'            => 'Muuda litsentsi',
        +    'checkout_help'     => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
        +);
        diff --git a/resources/lang/et/admin/licenses/general.php b/resources/lang/et/admin/licenses/general.php
        new file mode 100644
        index 0000000000..25a536ec56
        --- /dev/null
        +++ b/resources/lang/et/admin/licenses/general.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'checkin'  					=> 'Checkin License Seat',
        +    'checkout_history'  		=> 'Checkout History',
        +    'checkout'  				=> 'Checkout License Seat',
        +    'edit'  					=> 'Edit License',
        +    'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'clone'  					=> 'Clone License',
        +    'history_for'  				=> 'History for ',
        +    'in_out'  					=> 'In/Out',
        +    'info'  					=> 'License Info',
        +    'license_seats'  			=> 'License Seats',
        +    'seat'  					=> 'Seat',
        +    'seats'  					=> 'Seats',
        +    'software_licenses'  		=> 'Software Licenses',
        +    'user'  					=> 'User',
        +    'view'  					=> 'View License',
        +);
        diff --git a/resources/lang/et/admin/licenses/message.php b/resources/lang/et/admin/licenses/message.php
        new file mode 100644
        index 0000000000..d5dbfe77b9
        --- /dev/null
        +++ b/resources/lang/et/admin/licenses/message.php
        @@ -0,0 +1,50 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'License does not exist.',
        +    'user_does_not_exist' => 'User does not exist.',
        +    'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
        +    'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
        +    'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'License was not created, please try again.',
        +        'success' => 'License created successfully.'
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'License was not updated, please try again',
        +        'success' => 'License updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this license?',
        +        'error'   => 'There was an issue deleting the license. Please try again.',
        +        'success' => 'The license was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   => 'There was an issue checking out the license. Please try again.',
        +        'success' => 'The license was checked out successfully'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   => 'There was an issue checking in the license. Please try again.',
        +        'success' => 'The license was checked in successfully'
        +    ),
        +
        +);
        diff --git a/resources/lang/et/admin/licenses/table.php b/resources/lang/et/admin/licenses/table.php
        new file mode 100644
        index 0000000000..dfce4136cb
        --- /dev/null
        +++ b/resources/lang/et/admin/licenses/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'assigned_to'   	=> 'Assigned To',
        +    'checkout'   		=> 'In/Out',
        +    'id'      			=> 'ID',
        +    'license_email'   	=> 'License Email',
        +    'license_name'   	=> 'Licensed To',
        +    'purchase_date'   	=> 'Purchase Date',
        +    'purchased'   		=> 'Purchased',
        +    'seats'   			=> 'Seats',
        +    'hardware'   		=> 'Hardware',
        +    'serial'   			=> 'Serial',
        +    'title'      		=> 'License',
        +
        +);
        diff --git a/resources/lang/et/admin/locations/message.php b/resources/lang/et/admin/locations/message.php
        new file mode 100644
        index 0000000000..3a6605c540
        --- /dev/null
        +++ b/resources/lang/et/admin/locations/message.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Asukohta ei eksisteeri.',
        +    'assoc_users'	 => 'Selle asukohaga on seotud vähemalt üks kasutaja ja seda ei saa kustutada. Palun uuenda oma kasutajaid nii, et need ei kasutaks seda asukohta ning seejärel proovi uuesti. ',
        +    'assoc_assets'	 => 'Selle asukohaga on seotud vähemalt üks vahend ja seda ei saa kustutada. Palun uuenda oma vahendeid, et need ei kasutaks seda asukohta ning seejärel proovi uuesti. ',
        +    'assoc_child_loc'	 => 'Sel asukohal on hetkel all-asukohti ja seda ei saa kustutada. Palun uuenda oma asukohti nii, et need ei kasutaks seda asukohta ning seejärel proovi uuesti. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Asukohta ei loodud, palun proovi uuesti.',
        +        'success' => 'Asukoha loomine õnnestus.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Asukohta ei uuendatud, palun proovi uuesti',
        +        'success' => 'Asukoha uuendamine õnnestus.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Oled sa kindel, et soovid selle asukoha kustutada?',
        +        'error'   => 'Asukoha kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Asukoha kustutamine õnnestus.'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/locations/table.php b/resources/lang/et/admin/locations/table.php
        new file mode 100644
        index 0000000000..6384b37268
        --- /dev/null
        +++ b/resources/lang/et/admin/locations/table.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_locations_title'     => 'Asukohtadest',
        +    'about_locations'           => 'Asukohti kasutatakse selleks, et jälgida kasutajate, vahendite ja muude asjade liikumist',
        +    'assets_rtd'                => 'Vahendid', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'assets_checkedout'         => 'Assets Assigned',
        +    'id'                        => 'ID',
        +    'city'                      => 'Linn',
        +    'state'                     => 'Maakond',
        +    'country'                   => 'Riik',
        +    'create'                    => 'Uus asukoht',
        +    'update'                    => 'Uuenda asukohta',
        +    'name'                      => 'Asukoha nimi',
        +    'address'                   => 'Aadress',
        +    'zip'                       => 'Postiindeks',
        +    'locations'                 => 'Asukohad',
        +    'parent'                    => 'Vanem',
        +    'currency'                  => 'Asukoha valuuta',
        +    'ldap_ou'                   => 'LDAP Search OU',
        +    );
        diff --git a/resources/lang/et/admin/manufacturers/message.php b/resources/lang/et/admin/manufacturers/message.php
        new file mode 100644
        index 0000000000..864fc30f47
        --- /dev/null
        +++ b/resources/lang/et/admin/manufacturers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Tootjat ei eksisteeri.',
        +    'assoc_users'	 => 'Selle tootjaga on seotud vähemalt üks mudel ja seda ei saa kustutada. Palun uuenda oma mudeleid, et need ei kasutaks seda tootjat ning seejärel proovi uuesti. ',
        +
        +    'create' => array(
        +        'error'   => 'Tootjat ei loodud, proovi uuesti.',
        +        'success' => 'Tootja loomine õnnestus.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Tootjat ei uuendatud, palun proovi uuesti',
        +        'success' => 'Tootja uuendamine õnnestus.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Kas oled kindel, et soovid selle tootja kustutada?',
        +        'error'   => 'Tootja kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Tootja kustutamine õnnestus.'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/manufacturers/table.php b/resources/lang/et/admin/manufacturers/table.php
        new file mode 100644
        index 0000000000..6205b8cfd4
        --- /dev/null
        +++ b/resources/lang/et/admin/manufacturers/table.php
        @@ -0,0 +1,16 @@
        +<?php
        +
        +return array(
        +    'about_manufacturers_title'    => 'Tootjatest',
        +    'about_manufacturers_text'  => 'Tootjad on need ettevõtted, kes sinu vahendid on tootnud. Sa võid siin hoida enda jaoks olulisi tootja kasutajatoe kontakte, mida kuvatakse vahendite detailide juures.',
        +    'asset_manufacturers'	=> 'Vahendite tootjad',
        +    'create'				=> 'Uus tootja',
        +    'id'   					=> 'ID',
        +    'name'      			=> 'Nimi',
        +    'support_email'   		=> 'Kasutajatoe E-mail',
        +    'support_phone'   		=> 'Kasutajatoe telefon',
        +    'support_url'   		=> 'Kasutajatoe URL',
        +    'update'				=> 'Uuenda tootjat',
        +    'url'   				=> 'URL',
        +
        +);
        diff --git a/resources/lang/et/admin/models/general.php b/resources/lang/et/admin/models/general.php
        new file mode 100644
        index 0000000000..ffc8203081
        --- /dev/null
        +++ b/resources/lang/et/admin/models/general.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'about_models_title'     => 'Mudelitest',
        +    'about_models_text'           => 'Mudelid on selleks, et vahendeid grupeerida. "MBP 2013", "IPhone 6d", jne.',
        +    'deleted'  					        => 'See mudel on kustutatud. <a href="/hardware/models/:model_id/restore">Kliki siin selle taastamiseks</a>.',
        +    'restore'                   => 'Taasta mudel',
        +    'requestable'               => 'Kasutajad võivad seda mudelit tellida',
        +	'show_mac_address'			      => 'Näita sellel mudelil MAC aadressi välja',
        +    'view_deleted'              => 'Näita kustutatud',
        +    'view_models'               => 'Vaata mudeleid',
        +    'fieldset'                  => 'Fieldset',
        +    'no_custom_field'           => 'Ei ole lisavälju',
        +
        +);
        diff --git a/resources/lang/et/admin/models/message.php b/resources/lang/et/admin/models/message.php
        new file mode 100644
        index 0000000000..8353b67097
        --- /dev/null
        +++ b/resources/lang/et/admin/models/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Mudelit pole olemas.',
        +    'assoc_users'	 => 'See mudel on seostus ühe või mitme vahendiga ja seda ei saa kustutada. Palun kustuta vahendid ja seejärel proovi uuesti kustutada. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Mudelit ei loodud, proovi uuesti.',
        +        'success' => 'Mudeli loomine õnnestus.',
        +        'duplicate_set' => 'Sellise nime, tootja ja mudeli numbriga mudel on juba olemas.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Mudelit ei uuendatud, proovige uuesti',
        +        'success' => 'Mudeli uuendamine õnnestus.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Kas oled kindel, et soovid selle mudeli kustutada?',
        +        'error'   => 'Mudeli kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Mudeli kustutamine õnnestus.'
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Mudeli taastamine ei õnnestunud, proovi uuesti',
        +        'success' 		=> 'Mudeli taastamine õnnestus.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
        +);
        diff --git a/resources/lang/et/admin/models/table.php b/resources/lang/et/admin/models/table.php
        new file mode 100644
        index 0000000000..949b9d2f14
        --- /dev/null
        +++ b/resources/lang/et/admin/models/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'create'				=> 'Uus mudel',
        +    'created_at' 			=> 'Loodud',
        +    'eol'	 				=> 'EOL',
        +    'modelnumber'   		=> 'Mudeli nr.',
        +    'name'      			=> 'Mudeli nimi',
        +    'numassets' 			=> 'Vahendid',
        +    'title'					=> 'Mudelid',
        +    'update'				=> 'Uuenda mudelit',
        +    'view'					=> 'Vaata mudelit',
        +    'update'				=> 'Uuenda mudelit',
        +    'clone'				=> 'Klooni mudel',
        +    'edit'				=> 'Muuda mudelit',
        +);
        diff --git a/resources/lang/et/admin/reports/general.php b/resources/lang/et/admin/reports/general.php
        new file mode 100644
        index 0000000000..b03b97546f
        --- /dev/null
        +++ b/resources/lang/et/admin/reports/general.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'info'   => 'Select the options you want for your asset report.'
        +);
        diff --git a/resources/lang/et/admin/reports/message.php b/resources/lang/et/admin/reports/message.php
        new file mode 100644
        index 0000000000..d4c8f8198f
        --- /dev/null
        +++ b/resources/lang/et/admin/reports/message.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'error'   => 'You must select at least ONE option.'
        +);
        diff --git a/resources/lang/et/admin/settings/general.php b/resources/lang/et/admin/settings/general.php
        new file mode 100644
        index 0000000000..73fd052a58
        --- /dev/null
        +++ b/resources/lang/et/admin/settings/general.php
        @@ -0,0 +1,148 @@
        +<?php
        +
        +return array(
        +    'ad'				        => 'Active Directory',
        +    'ad_domain'				    => 'Active Directory domain',
        +    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        +    'is_ad'				        => 'This is an Active Directory server',
        +	'alert_email'				=> 'Send alerts to',
        +	'alerts_enabled'			=> 'Alerts Enabled',
        +	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        +	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
        +	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
        +	'auto_increment_prefix'		=> 'Prefix (optional)',
        +	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        +	'backups'					=> 'Backups',
        +	'barcode_settings'			=> 'Barcode Settings',
        +    'confirm_purge'			    => 'Confirm Purge',
        +    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        +	'custom_css'				=> 'Custom CSS',
        +	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
        +	'default_currency'  		=> 'Default Currency',
        +	'default_eula_text'			=> 'Default EULA',
        +  'default_language'					=> 'Default Language',
        +	'default_eula_help_text'	=> 'You can also associate custom EULAs to specific asset categories.',
        +    'display_asset_name'        => 'Display Asset Name',
        +    'display_checkout_date'     => 'Display Checkout Date',
        +    'display_eol'               => 'Display EOL in table view',
        +    'display_qr'                => 'Display Square Codes',
        +	'display_alt_barcode'		=> 'Display 1D barcode',
        +	'barcode_type'				=> '2D Barcode Type',
        +	'alt_barcode_type'			=> '1D barcode type',
        +    'eula_settings'				=> 'EULA Settings',
        +    'eula_markdown'				=> 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'general_settings'			=> 'General Settings',
        +	'generate_backup'			=> 'Generate Backup',
        +    'header_color'              => 'Header Color',
        +    'info'                      => 'These settings let you customize certain aspects of your installation.',
        +    'laravel'                   => 'Laravel Version',
        +    'ldap_enabled'              => 'LDAP enabled',
        +    'ldap_integration'          => 'LDAP Integration',
        +    'ldap_settings'             => 'LDAP Settings',
        +    'ldap_server'               => 'LDAP Server',
        +    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        +	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
        +	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
        +	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        +    'ldap_tls'                  => 'Use TLS',
        +    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        +    'ldap_uname'                => 'LDAP Bind Username',
        +    'ldap_pword'                => 'LDAP Bind Password',
        +    'ldap_basedn'               => 'Base Bind DN',
        +    'ldap_filter'               => 'LDAP Filter',
        +    'ldap_pw_sync'              => 'LDAP Password Sync',
        +    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_username_field'       => 'Username Field',
        +    'ldap_lname_field'          => 'Last Name',
        +    'ldap_fname_field'          => 'LDAP First Name',
        +    'ldap_auth_filter_query'    => 'LDAP Authentication query',
        +    'ldap_version'              => 'LDAP Version',
        +    'ldap_active_flag'          => 'LDAP Active Flag',
        +    'ldap_emp_num'              => 'LDAP Employee Number',
        +    'ldap_email'                => 'LDAP Email',
        +    'load_remote_text'          => 'Remote Scripts',
        +    'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
        +    'logo'                    	=> 'Logo',
        +    'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
        +    'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        +    'optional'					=> 'optional',
        +    'per_page'                  => 'Results Per Page',
        +    'php'                       => 'PHP Version',
        +    'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
        +    'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
        +    'qr_help'                   => 'Enable QR Codes first to set this',
        +    'qr_text'                   => 'QR Code Text',
        +    'setting'                   => 'Setting',
        +    'settings'                  => 'Settings',
        +    'site_name'                 => 'Site Name',
        +    'slack_botname'             => 'Slack Botname',
        +    'slack_channel'             => 'Slack Channel',
        +    'slack_endpoint'            => 'Slack Endpoint',
        +    'slack_integration'         => 'Slack Settings',
        +    'slack_integration_help'    => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new">create an incoming webhook</a> on your Slack account.',
        +    'snipe_version'  			=> 'Snipe-IT version',
        +    'system'                    => 'System Information',
        +    'update'                    => 'Update Settings',
        +    'value'                     => 'Value',
        +    'brand'                     => 'Branding',
        +    'about_settings_title'      => 'About Settings',
        +    'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
        +    'labels_per_page'           => 'Labels per page',
        +    'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Page margins (inches)',
        +    'purge'                    => 'Purge Deleted Records',
        +    'labels_display_bgutter'    => 'Label bottom gutter',
        +    'labels_display_sgutter'    => 'Label side gutter',
        +    'labels_fontsize'           => 'Label font size',
        +    'labels_pagewidth'          => 'Label sheet width',
        +    'labels_pageheight'         => 'Label sheet height',
        +    'label_gutters'        => 'Label spacing (inches)',
        +    'page_dimensions'        => 'Page dimensions (inches)',
        +    'label_fields'          => 'Label visible fields',
        +    'inches'        => 'inches',
        +    'width_w'        => 'w',
        +    'height_h'        => 'h',
        +    'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Two Factor Authentication',
        +    'two_factor_secret'        => 'Two-Factor Code',
        +    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        +    'two_factor_enabled_text'        => 'Enable Two Factor',
        +    'two_factor_reset'        => 'Reset Two-Factor Secret',
        +    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        +    'two_factor_reset_success'          => 'Two factor device successfully reset',
        +    'two_factor_reset_error'          => 'Two factor device reset failed',
        +    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        +    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        +    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_required'        => 'Required for all users',
        +    'two_factor_disabled'        => 'Disabled',
        +    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        +    'two_factor_config_complete'	=> 'Submit Code',
        +    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        +    'require_accept_signature'      => 'Require Signature',
        +    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'left'        => 'left',
        +    'right'        => 'right',
        +    'top'        => 'top',
        +    'bottom'        => 'bottom',
        +    'vertical'        => 'vertical',
        +    'horizontal'        => 'horizontal',
        +    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +);
        diff --git a/resources/lang/et/admin/settings/message.php b/resources/lang/et/admin/settings/message.php
        new file mode 100644
        index 0000000000..736d5c3e9e
        --- /dev/null
        +++ b/resources/lang/et/admin/settings/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +
        +    'update' => array(
        +        'error'                 => 'An error has occurred while updating. ',
        +        'success'               => 'Settings updated successfully.'
        +    ),
        +    'backup' => array(
        +        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        +        'file_deleted'          => 'The backup file was successfully deleted. ',
        +        'generated'             => 'A new backup file was successfully created.',
        +        'file_not_found'        => 'That backup file could not be found on the server.',
        +    ),
        +    'purge' => array(
        +        'error'     => 'An error has occurred while purging. ',
        +        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        +        'success'               => 'Deleted records successfully purged.'
        +    ),
        +
        +);
        diff --git a/resources/lang/et/admin/statuslabels/message.php b/resources/lang/et/admin/statuslabels/message.php
        new file mode 100644
        index 0000000000..619a5a509c
        --- /dev/null
        +++ b/resources/lang/et/admin/statuslabels/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Status Label does not exist.',
        +    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Status Label was not created, please try again.',
        +        'success' => 'Status Label created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Status Label was not updated, please try again',
        +        'success' => 'Status Label updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        +        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        +        'success' => 'The Status Label was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/statuslabels/table.php b/resources/lang/et/admin/statuslabels/table.php
        new file mode 100644
        index 0000000000..4e7723c744
        --- /dev/null
        +++ b/resources/lang/et/admin/statuslabels/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about'      	=> 'Staatuse siltidest',
        +    'archived'      	=> 'Arhiveeritud',
        +    'create'      	=> 'Uus staatuse silt',
        +    'color'      	=> 'Joonise värv',
        +    'deployable'      	=> 'Deployable',
        +    'info'      	=> 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
        +    'name'      	=> 'Saatuse nimi',
        +    'pending'      	=> 'Ootel',
        +    'status_type'   => 'Saatuse tüüp',
        +    'show_in_nav'   => 'Näita külgmenüüs',
        +    'title'      	=> 'Staatuse sildid',
        +    'undeployable'  => 'Undeployable',
        +    'update'      	=> 'Uuenda staatuse silti',
        +);
        diff --git a/resources/lang/et/admin/suppliers/message.php b/resources/lang/et/admin/suppliers/message.php
        new file mode 100644
        index 0000000000..ed27e6538f
        --- /dev/null
        +++ b/resources/lang/et/admin/suppliers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Tarnijat ei eksisteeri.',
        +    'assoc_users'	 => 'Selle tarnijaga on seotud vähemalt üks mudel ja seda ei saa kustutada. Palun uuenda oma mudeleid, et need ei kasutaks seda tarnijat ning seejärel proovi uuesti. ',
        +
        +    'create' => array(
        +        'error'   => 'Tarnijat ei loodud, palun proovi uuesti.',
        +        'success' => 'Tarnija loomine õnnestus.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Tarnijat ei uuendatud, palun proovi uuesti',
        +        'success' => 'Tarnija uuendamine õnnestus.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Kas oled kindel, et soovid selle tarnija kustutada?',
        +        'error'   => 'Tarnija kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'success' => 'Tarnija kustutamine õnnestus.'
        +    )
        +
        +);
        diff --git a/resources/lang/et/admin/suppliers/table.php b/resources/lang/et/admin/suppliers/table.php
        new file mode 100644
        index 0000000000..4e517b55ee
        --- /dev/null
        +++ b/resources/lang/et/admin/suppliers/table.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +    'about_suppliers_title' => 'Tarnijatest',
        +    'about_suppliers_text'  => 'Tarnijaid kasutatakse selleks, et jälgida asjade hankimise allikaid',
        +    'address'               => 'Tarnija aadress',
        +    'assets'                => 'Vahendid',
        +    'city'                  => 'Linn',
        +    'contact'               => 'Kontaktisiku nimi',
        +    'country'               => 'Riik',
        +    'create'                => 'Uus tarnija',
        +    'email'                 => 'E-mail',
        +    'fax'                   => 'Faks',
        +    'id'                    => 'ID',
        +    'licenses'              => 'Litsentsid',
        +    'name'                  => 'Tarnija nimi',
        +    'notes'                 => 'Märkmed',
        +    'phone'                 => 'Telefon',
        +    'state'                 => 'Maakond',
        +    'suppliers'             => 'Tarnijad',
        +    'update'                => 'Uuenda tarnijat',
        +    'url'                   => 'URL',
        +    'view'                  => 'Vaata tarnijat',
        +    'view_assets_for'       => 'Vaata vahendeid',
        +    'zip'                   => 'Postiindeks',
        +
        +);
        diff --git a/resources/lang/et/admin/users/general.php b/resources/lang/et/admin/users/general.php
        new file mode 100644
        index 0000000000..934b27e422
        --- /dev/null
        +++ b/resources/lang/et/admin/users/general.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +
        +return array(
        +
        +    'assets_user'       => 'Kasutajaga :nimi seotud vahendid',
        +    'bulk_update_warn'	=> 'Sa oled muutmas :user_count kasutaja andmeid. Palun pane tähele, et saa ei saa selle vormi kaudu muuta enda kasutaja andmeid, neid pead muutma eraldi.',
        +    'bulk_update_help'	=> 'Selle vormiga saad muuta mitmeid kasutajaid korraga. Täida ainult need väljad, mida on vaja muuta. Tühjaks jäetud väljasid ei muudeta.',
        +    'current_assets'    => 'Selle kasutaja valduses olevad vahendid',
        +    'clone'             => 'Klooni kasutaja',
        +    'contact_user'      => 'Võta ühendust :name-ga',
        +    'edit'              => 'Muuda kasutajat',
        +    'filetype_info'     => 'Lubatud failitüübid on png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, ja rar.',
        +    'history_user'      => 'Kasutaja :name ajalugu',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
        +    'last_login'        => 'Viimane sisselogimine',
        +    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'software_user'     => 'Kasutaja :name valdusesse antud tarkvara',
        +    'view_user'         => 'Vaata kasutajat :name',
        +    'usercsv'           => 'CSV fail',
        +    'two_factor_admin_optin_help' => 'Sinu praegused admin seaded lubavad kahe-astmelist autantimis jõustada valikulselt. ',
        +    'two_factor_enrolled' => '2FA Device Enrolled ',
        +    'two_factor_active'   => '2FA aktiivne ',
        +    );
        diff --git a/resources/lang/et/admin/users/message.php b/resources/lang/et/admin/users/message.php
        new file mode 100644
        index 0000000000..b48a8fb6c7
        --- /dev/null
        +++ b/resources/lang/et/admin/users/message.php
        @@ -0,0 +1,59 @@
        +<?php
        +
        +return array(
        +
        +    'accepted'                  => 'Oled selle vahendi edukalt vastu võtnud.',
        +    'declined'                  => 'Oled selle vahendi tagasi lükanud.',
        +    'bulk_manager_warn'	        => 'Sinu kasutajad on edukalt muudetud, kuid sinu juhi-kirjet ei salvestatud sest juht, kelle valisid oli ka muudatavate kasutajate hulgas ning kasutaja ei või olla ise-enda juht. Palun vali oma kasutajad uuesti, jättes juhi kõrvale.',
        +    'user_exists'               => 'Kasutaja on juba olemas!',
        +    'user_not_found'            => 'Kasutajat [:id] ei ole olemas.',
        +    'user_login_required'       => 'Login väli on kohustuslik',
        +    'user_password_required'    => 'Parooli väli on kohustuslik.',
        +    'insufficient_permissions'  => 'Ebapiisavad õigused.',
        +    'user_deleted_warning'      => 'See kasutaja on kustutatud. Et kasutajat muuta või talle uusi vahendeid anda, pead ta esmalt taastama.',
        +    'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
        +
        +
        +    'success' => array(
        +        'create'    => 'Kasutaja loomine õnnestus.',
        +        'update'    => 'Kasutaja uuendamine õnnestus.',
        +        'update_bulk'    => 'Kasutajate uuendamine õnnestus!',
        +        'delete'    => 'Kasutaja kustutamine õnnestus.',
        +        'ban'       => 'Kasutaja bännimine õnnestus.',
        +        'unban'     => 'Kasutaja de-bännimine õnnestus.',
        +        'suspend'   => 'Kasutaja ajutine peatamine õnnestus.',
        +        'unsuspend' => 'User was successfully unsuspended.',
        +        'restored'  => 'Kasutaja taastamine õnnestus.',
        +        'import'    => 'Kasutajate importimine õnnestus.',
        +    ),
        +
        +    'error' => array(
        +        'create' => 'Kasutaja loomisel tekkis probleem. Palun proovi uuesti.',
        +        'update' => 'Kasutaja uuendamisel tekkis probleem. Palun proovi uuesti.',
        +        'delete' => 'Kasutaja kustutamisel tekkis probleem. Palun proovi uuesti.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
        +        'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
        +        'import'    => 'Kasutajate importimisel tekkis probleem. Palun proovi uuesti.',
        +        'asset_already_accepted' => 'See vahend on juba vastu võetud.',
        +        'accept_or_decline' => 'You must either accept or decline this asset.',
        +        'incorrect_user_accepted' => 'The asset you have attempted to accept was not checked out to you.',
        +        'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
        +        'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'Faili ei kustustatud. Palun proovi uuesti.',
        +        'success' => 'Fail kustutati.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'Fail(e) ei laetud üles. Palun proovi uuesti.',
        +        'success' => 'Fail(id) laeti edukalt üles.',
        +        'nofiles' => 'Sa ei valinud üles laadimiseks ühtegi faili',
        +        'invalidfiles' => 'Üks või mitu sibu failidest on kas liigas uured või ei ole lubatud tüüpi. Lobatud tüübid on png, gif, jpg, doc, docx, pdf, ja txt.',
        +    ),
        +
        +);
        diff --git a/resources/lang/et/admin/users/table.php b/resources/lang/et/admin/users/table.php
        new file mode 100644
        index 0000000000..0b283bc7d8
        --- /dev/null
        +++ b/resources/lang/et/admin/users/table.php
        @@ -0,0 +1,38 @@
        +<?php
        +
        +return array(
        +    'activated'  			=> 'Aktiivne',
        +    'allow'  				=> 'Luba',
        +    'checkedout'  			=> 'Vahendid',
        +    'created_at' 			=> 'Loodud',
        +    'createuser' 			=> 'Uus kasutaja',
        +    'deny'  				=> 'Keela',
        +    'email'      			=> 'E-mail',
        +    'employee_num'      	=> 'Töötaja Nr.',
        +    'first_name' 			=> 'Eesnimi',
        +    'groupnotes'			=> 'Vali kasutajale grupp. Pea meeles, et kasutajale laienevad kõik grupile omistatud õigused.',
        +    'id'         			=> 'Id',
        +    'inherit'  				=> 'Päri',
        +    'job' 					=> 'Ametikoht',
        +    'last_login'  			=> 'Viimane sisselogimine',
        +    'last_name'  			=> 'Perekonnanimi',
        +    'location'  			=> 'Asukoht',
        +    'lock_passwords'		=> 'Selles installatsioonis ei sa sisselogimise infot muuta.',
        +    'manager' 				=> 'Juht',
        +    'managed_locations'     => 'Managed Locations',
        +    'name' 					=> 'Nimi',
        +    'notes'                 => 'Märkmed',
        +    'password_confirm' 		=> 'Kinnita parool',
        +    'password' 				=> 'Parool',
        +    'phone'  				=> 'Telefon',
        +    'show_current'          => 'Näita praegusi kasutajaid',
        +    'show_deleted'          => 'Näita kustutatud kasutajaid',
        +    'title' 				=> 'Pealkiri',
        +	'to_restore_them'		=> 'to restore them.',
        +    'updateuser' 			=> 'Uuenda kasutajat',
        +    'username' 				=> 'Kasutajanimi',
        +	'user_deleted_text' 	=> 'See kasutaja on märgitud kustutatuks.',
        +    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        +    'cloneuser'             => 'Klooni kasutaja',
        +    'viewusers' 			=> 'Vaata kasutajaid',
        +);
        diff --git a/resources/lang/et/auth/general.php b/resources/lang/et/auth/general.php
        new file mode 100644
        index 0000000000..df86433daa
        --- /dev/null
        +++ b/resources/lang/et/auth/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return [
        +    'send_password_link'	        => 'Saada parooli taastamise link',
        +    'email_reset_password'			=> 'Email Password Reset',
        +    'reset_password'			    => 'Taasta parool',
        +    'login'                         => 'Logi sisse',
        +    'login_prompt'                  => 'Palun logi sisse',
        +    'forgot_password'               => 'Ma unustasin oma parooli',
        +    'remember_me'                   => 'Jäta mind meelde',
        +    ];
        +
        diff --git a/resources/lang/et/auth/message.php b/resources/lang/et/auth/message.php
        new file mode 100644
        index 0000000000..bebf9cdd48
        --- /dev/null
        +++ b/resources/lang/et/auth/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'account_already_exists' => 'An account with the this email already exists.',
        +    'account_not_found'      => 'The username or password is incorrect.',
        +    'account_not_activated'  => 'This user account is not activated.',
        +    'account_suspended'      => 'This user account is suspended.',
        +    'account_banned'         => 'This user account is banned.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
        +
        +    'signin' => array(
        +        'error'   => 'There was a problem while trying to log you in, please try again.',
        +        'success' => 'You have successfully logged in.',
        +    ),
        +
        +    'signup' => array(
        +        'error'   => 'There was a problem while trying to create your account, please try again.',
        +        'success' => 'Account sucessfully created.',
        +    ),
        +
        +        'forgot-password' => array(
        +            'error'   => 'There was a problem while trying to get a reset password code, please try again.',
        +            'success' => 'Password recovery email successfully sent.',
        +        ),
        +
        +        'forgot-password-confirm' => array(
        +            'error'   => 'There was a problem while trying to reset your password, please try again.',
        +            'success' => 'Your password has been successfully reset.',
        +        ),
        +
        +    'activate' => array(
        +        'error'   => 'There was a problem while trying to activate your account, please try again.',
        +        'success' => 'Your account has been successfully activated.',
        +    ),
        +
        +);
        diff --git a/resources/lang/et/button.php b/resources/lang/et/button.php
        new file mode 100644
        index 0000000000..eb2ee9d621
        --- /dev/null
        +++ b/resources/lang/et/button.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'actions' 	                => 'Tegevused',
        +    'add'    	                => 'Lisa uus',
        +    'cancel'                    => 'Loobu',
        +    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'delete'  	                => 'Kustuta',
        +    'edit'    	                => 'Muuda',
        +    'restore' 	                => 'Taasta',
        +    'request'                   => 'Päring',
        +    'submit'  	                => 'Kinnita',
        +    'upload'                    => 'Lae üles',
        +	'select_file'				=> 'Vali fail...',
        +);
        diff --git a/resources/lang/et/general.php b/resources/lang/et/general.php
        new file mode 100644
        index 0000000000..ab683f3259
        --- /dev/null
        +++ b/resources/lang/et/general.php
        @@ -0,0 +1,204 @@
        +<?php
        +
        +    return [
        +    'accessories'			=> 'Tarvikud',
        +    'activated'			=> 'Aktiveeritud',
        +    'accessory'				=> 'Tarvik',
        +    'accessory_report'			=> 'Tarvikute aruanne',
        +    'action'                => 'Tegevus',
        +    'activity_report'		=> 'Tegevuste aruanne',
        +    'address'				=> 'Aadress',
        +    'admin'					=> 'Admin',
        +    'add_seats'     => 'Added seats',
        +    'all_assets'			=> 'Kõik vahendid',
        +    'all'       			=> 'Kõik',
        +    'archived'              => 'Arhiveeritud',
        +    'asset_models'			=> 'Mudelid',
        +    'asset'					=> 'Vahend',
        +    'asset_report'          => 'Vahendite aruanne',
        +    'asset_tag'				=> 'Asset Tag',
        +    'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
        +    'assets'				=> 'Vahendid',
        +    'avatar_delete'         => 'Kustuta profiilipilt',
        +    'avatar_upload'         => 'Lae profiilipilt',
        +    'back'      			=> 'Tagasi',
        +    'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'cancel'  				=> 'Loobu',
        +    'categories'			=> 'Kategooriad',
        +    'category'				=> 'Kategooria',
        +    'change' 		        => 'In/Out',
        +    'changeemail'  			=> 'Muuda oma emaili aadress',
        +    'changepassword'  		=> 'Muuda parool',
        +    'checkin'  				=> 'Checkin',
        +    'checkin_from'  		=> 'Checkin from',
        +    'checkout'  			=> 'Checkout',
        +    'city'  				=> 'Linn',
        +	'click_here'			=> 'Kliki siia',
        +    'companies'			=> 'Ettevõtted',
        +    'company'				=> 'Ettevõte',
        +    'component'			=> 'Komponent',
        +    'components'			=> 'Komponendid',
        +	'complete'				=> 'Tehtud',
        +    'consumable'			=> 'Consumable',
        +    'consumables'			=> 'Consumables',
        +    'country'  				=> 'Riik',
        +    'create'				=> 'Loo uus',
        +    'created'               => 'Item Created',
        +    'created_asset'			=> 'created asset',
        +    'created_at' 			=> 'Loodud',
        +    'updated_at' 			=> 'Viimati muudetud',
        +    'currency'  			=> '$', // this is deprecated
        +    'current'  				=> 'Praegune',
        +    'custom_report'         => 'Custom Asset Report',
        +    'dashboard'				=> 'Töölaud',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
        +    'date'					=> 'Kuupäev',
        +    'debug_warning'         => 'Hoiatus!',
        +    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'delete'  				=> 'Kustuta',
        +    'deleted'  				=> 'Kustutatud',
        +    'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
        +    'deployed'				=> 'Deployed',
        +    'depreciation_report'	=> 'Depreciation Report',
        +    'download'				=> 'Lae alla',
        +    'depreciation'			=> 'Depreciation',
        +    'editprofile'  			=> 'Edit Your Profile',
        +    'eol'					=> 'EOL',
        +    'email_domain'			=> 'Email Domain',
        +    'email_format'			=> 'E-maili formaat',
        +    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        +    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'first'					=> 'Esimene',
        +    'first_name'			=> 'Eesnimi',
        +    'first_name_format'		=> 'Eesnimi (jane@example.com)',
        +    'file_name'				=> 'Fail',
        +    'file_uploads'			=> 'File Uploads',
        +    'generate'				=> 'Genereeri',
        +    'groups'				=> 'Grupid',
        +    'gravatar_email'        => 'Gravatari e-maili aadress',
        +    'history'  			    => 'Ajalugu',
        +    'history_for'  			=> 'History for',
        +    'id'  					=> 'ID',
        +    'image_delete'         	=> 'Kustuta pilt',
        +    'image_upload'         	=> 'Laadi pilt üles',
        +    'import'         	    => 'Impordi',
        +    'import-history'        => 'Impordi ajalugu',
        +    'asset_maintenance'        => 'Asset Maintenance',
        +    'asset_maintenance_report' => 'Asset Maintenance Report',
        +    'asset_maintenances'       => 'Asset Maintenances',
        +    'item'  				=> 'Kirje',
        +    'insufficient_permissions' => 'Ei ole piisavalt õigusi!',
        +    'language'				=> 'Keel',
        +    'last'					=> 'Viimane',
        +    'last_login'            => 'Viimane sisselogimine',
        +    'last_name'             => 'Perekonnanimi',
        +    'license'				=> 'Litsents',
        +    'license_report'        => 'Litsentside aruanne',
        +    'licenses_available'	=> 'saadaolevad litsentsid',
        +    'licenses'				=> 'Litsentsid',
        +    'list_all'				=> 'Kuva kõik',
        +    'loading'				=> 'Laadin',
        +    'lock_passwords'        => 'This field cannot be edited in this installation.',
        +    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'location'              => 'Asukoht',
        +    'locations'				=> 'Asukohad',
        +    'logout'				=> 'Logi välja',
        +    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'manufacturer'			=> 'Tootja',
        +    'manufacturers'			=> 'Tootjad',
        +    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'min_amt'				=> 'Min. kogus',
        +    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'model_no'				=> 'Mudeli nr.',
        +    'months'				=> 'kuud',
        +    'moreinfo'				=> 'Lisainfo',
        +    'name'					=> 'Nimi',
        +    'next'					=> 'Järgmine',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'uus!',
        +    'no_depreciation'		=> 'No Depreciation',
        +    'no_results'			=> 'No Results.',
        +    'no'  					=> 'Ei',
        +    'notes'  				=> 'Märkmed',
        +    'order_number'          => 'Tellimuse number',
        +    'page_menu'				=> 'Showing _MENU_ items',
        +    'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
        +    'pending'				=> 'Pending',
        +    'people'				=> 'Inimesed',
        +    'per_page'				=> 'Tulemusi lehe kohta',
        +    'previous'				=> 'Eelmine',
        +    'processing'			=> 'Töötlemises',
        +    'profile'				=> 'Sinu profiil',
        +    'purchase_cost'                              => 'Ostuhind',
        +    'purchase_date'         => 'Ostu kuupäev',
        +    'qty'		            => 'Hulk',
        +    'quantity'		        => 'Hulk',
        +    'ready_to_deploy'		=> 'Ready to Deploy',
        +    'recent_activity'		=> 'Recent Activity',
        +    'remove_company'        => 'Remove Company Association',
        +    'reports'				=> 'Aruanded',
        +    'requested'				=> 'Requested',
        +    'request_canceled'      => 'Request Canceled',
        +    'save'  				=> 'Salvesta',
        +    'select'				=> 'Vali',
        +    'search'				=> 'Otsi',
        +    'select_category'       => 'Vali kategooria',
        +    'select_department'       => 'Select a Department',
        +    'select_depreciation'	=> 'Select a Depreciation Type',
        +    'select_location'		=> 'Vali asukoht',
        +    'select_manufacturer'	=> 'Vali tootja',
        +    'select_model'			=> 'Vali mudel',
        +    'select_supplier'		=> 'Select a Supplier',
        +    'select_user'			=> 'Vali kasutaja',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
        +    'select_statuslabel'	=> 'Vali staatus',
        +    'select_company'    	=> 'Vali ettevõte',
        +    'select_asset'    		=> 'Vali vahend',
        +    'settings'				=> 'Seaded',
        +    'sign_in'				=> 'Logi sisse',
        +    'signature'             => 'Allkiri',
        +    'some_features_disabled' => 'DEMOVERSIOON: Selles installatsioonis mõned funktsioonid ei tööta.',
        +    'site_name'				=> 'Saidi nimi',
        +    'state'  				=> 'Maakond',
        +    'status_labels'			=> 'Status Labels',
        +    'status'    			=> 'Staatus',
        +    'supplier'              => 'Supplier',
        +    'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
        +    'submit'				=> 'Kinnita',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
        +    'total_assets'			=> 'vahendeid kokku',
        +    'total_licenses'		=> 'litsentse kokku',
        +    'total_accessories'		=> 'total accessories',
        +    'total_consumables'		=> 'total consumables',
        +    'type'  				=> 'Tüüp',
        +    'undeployable'			=> 'Un-deployable',
        +    'unknown_admin'			=> 'Tundmatu Admin',
        +    'username_format'		=> 'Kasutajanime formaat',
        +    'update'                => 'Uuenda',
        +    'uploaded'              => 'Üles laetud',
        +    'user'					=> 'Kasutaja',
        +    'accepted'			    => 'accepted',
        +    'declined'			    => 'tagasi lükatud',
        +    'unaccepted_asset_report' => 'Unaccepted Assets',
        +    'users'                 => 'Kasutajad',
        +    'viewassets'  			=> 'View Assigned Assets',
        +    'website'               => 'Koduleht',
        +    'welcome'				=> 'Tere tulemast, :name',
        +    'years'					=> 'aastat',
        +    'yes' 					=> 'Jah',
        +    'zip'  					=> 'Postiindeks',
        +    'noimage'					=> 'No image uploaded or image not found.',
        +    'token_expired'             => 'Your form session has expired. Please try again.',
        +    ];
        diff --git a/resources/lang/et/mail.php b/resources/lang/et/mail.php
        new file mode 100644
        index 0000000000..d721aa8108
        --- /dev/null
        +++ b/resources/lang/et/mail.php
        @@ -0,0 +1,74 @@
        +<?php
        +
        +return array(
        +    'a_user_canceled' => 'A user has canceled an item request on the website',
        +    'a_user_requested' => 'A user has requested an item on the website',
        +    'accessory_name' => 'Accessory Name:',
        +    'additional_notes' => 'Additional Notes:',
        +    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        +    'asset' => 'Vahend:',
        +    'asset_name' => 'Vahendi nimi:',
        +    'asset_requested' => 'Asset requested',
        +    'asset_tag' => 'Asset Tag:',
        +    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        +                                    expiring in the next 60 days.',
        +    'assigned_to' => 'Assigned To',
        +    'best_regards' => 'Best regards,',
        +    'canceled' => 'Tühistatud:',
        +    'checkin_date' => 'Checkin Date:',
        +    'checkout_date' => 'Checkout Date:',
        +    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        +    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        +    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        +    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        +    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        +    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        +    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        +    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        +    'current_QTY' => 'Current QTY',
        +    'Days' => 'Päeva',
        +    'days' => 'Päeva',
        +    'expecting_checkin_date' => 'Expected Checkin Date:',
        +    'expires' => 'Aegub',
        +    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        +    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        +    'hello' => 'Tere',
        +    'hi' => 'Tere',
        +    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'item' => 'Kirje:',
        +    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        +                              inventory or will soon be low.',
        +    'Item_Request_Canceled' => 'Item Request Canceled',
        +    'Item_Requested' => 'Item Requested',
        +    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        +    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        +    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'login' => 'Logi sisse:',
        +    'Low_Inventory_Report' => 'Low Inventory Report',
        +    'min_QTY' => 'Min QTY',
        +    'name' => 'Nimi',
        +    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        +    'password' => 'Parool:',
        +    'password_reset' => 'Parooli taastamine',
        +
        +    'read_the_terms' => 'Please read the terms of use below.',
        +    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        +                         and agree to the terms of use, and have received the asset.',
        +    'requested' => 'Requested:',
        +    'reset_link' => 'Your Password Reset Link',
        +    'reset_password' => 'Click here to reset your password:',
        +    'serial' => 'Serial:',
        +    'supplier' => 'Supplier',
        +    'tag' => 'Tag',
        +    'test_email' => 'Test Email from Snipe-IT',
        +    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        +    'the_following_item' => 'The following item has been checked in: ',
        +    'There_are' => '{1} There is|[2,Inf] There are',
        +    'to_reset' => 'To reset your :web password, complete this form:',
        +    'type' => 'Tüüp',
        +    'user' => 'Kasutaja:',
        +    'username' => 'Kasutajanimi:',
        +    'welcome' => 'Tere tulemast, :name',
        +    'welcome_to' => 'Teretulemast lehele :web!',
        +    'your_credentials' => 'Sinu Snipe-IT rekvisiidid',
        +);
        diff --git a/resources/lang/et/pagination.php b/resources/lang/et/pagination.php
        new file mode 100644
        index 0000000000..b650121e07
        --- /dev/null
        +++ b/resources/lang/et/pagination.php
        @@ -0,0 +1,20 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Pagination Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used by the paginator library to build
        +    | the simple pagination links. You are free to change them to anything
        +    | you want to customize your views to better match your application.
        +    |
        +    */
        +
        +    'previous' => '&laquo; Eelmine',
        +
        +    'next'     => 'Järgmine &raquo;',
        +
        +);
        diff --git a/resources/lang/et/passwords.php b/resources/lang/et/passwords.php
        new file mode 100644
        index 0000000000..cd53b04913
        --- /dev/null
        +++ b/resources/lang/et/passwords.php
        @@ -0,0 +1,7 @@
        +<?php
        +
        +return [
        +    'sent'	        => 'Sinu paroolilink on saadetud!',
        +    'user'			=> 'Sellist kasutajat ei ole või ei ole tal seotud e-maili aadressi',
        +];
        +
        diff --git a/resources/lang/et/reminders.php b/resources/lang/et/reminders.php
        new file mode 100644
        index 0000000000..0b5a4802c4
        --- /dev/null
        +++ b/resources/lang/et/reminders.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Password Reminder Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are the default lines which match reasons
        +    | that are given by the password broker for a password update attempt
        +    | has failed, such as for an invalid token or invalid new password.
        +    |
        +    */
        +
        +    "password" => "Parool peab olema kuus tähemärki ja peab klappima kinnitusega.",
        +
        +    "user"     => "Kasutajanimi või parool on vale",
        +
        +    "token"    => "See parooli taastamise kood on vale.",
        +
        +    "sent" => "Kui me leidsime klappiva e-maili aadressi, siis saatsime sellele parooli meeldetuletuse!",
        +
        +);
        diff --git a/resources/lang/et/table.php b/resources/lang/et/table.php
        new file mode 100644
        index 0000000000..8618018389
        --- /dev/null
        +++ b/resources/lang/et/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'actions'	 	=> 'Tegevused',
        +    'action' 		=> 'Tegevus',
        +    'by'      		=> 'Kes',
        +    'item' 			=> 'Kirje',
        +
        +);
        diff --git a/resources/lang/et/validation.php b/resources/lang/et/validation.php
        new file mode 100644
        index 0000000000..02cb1fa981
        --- /dev/null
        +++ b/resources/lang/et/validation.php
        @@ -0,0 +1,136 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines contain the default error messages used by
        +    | the validator class. Some of these rules have multiple versions such
        +    | such as the size rules. Feel free to tweak each of these messages.
        +    |
        +    */
        +
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Attributes
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used to swap attribute place-holders
        +    | with something more reader friendly such as E-Mail Address instead
        +    | of "email". This simply helps us make messages a little cleaner.
        +    |
        +    */
        +
        +    'attributes' => [],
        +
        +);
        diff --git a/resources/lang/fa/admin/asset_maintenances/message.php b/resources/lang/fa/admin/asset_maintenances/message.php
        index 25492f7327..fd5863fd01 100644
        --- a/resources/lang/fa/admin/asset_maintenances/message.php
        +++ b/resources/lang/fa/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'نگهداشت دارایی ایجاد نشد.لطفا دوباره امتحان کنید',
                     'success' => 'نگهدارنده دارایی با موفقیت ایجاد شد.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'هنوز تکمیل نشده',
                 'warranty'                     => 'ضمانت',
                 'not_warranty'                 => 'بدون ضمانت',
        diff --git a/resources/lang/fa/admin/categories/general.php b/resources/lang/fa/admin/categories/general.php
        index 9ea276d2bb..6285478068 100644
        --- a/resources/lang/fa/admin/categories/general.php
        +++ b/resources/lang/fa/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'ویرایش دسته‌ بندی',
             'eula_text'							=> 'دسته بندی EULA',
             'eula_text_help'					=> 'این فید به امکان این را میدهد که EULA های خود را با توجه به دارایی سفارشی سازی کنید. اگر شما فقط یک EULA برای تمام دارایی خود دارید،میتوانید گزینه زیر را فعال کنید تا از پیشفرض اولیه استفاده کنید.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'نیاز به کاربرانی جهت تایید پذیرش دارایی ها در این دسته بندی.',
             'required_acceptance'				=> 'این کاربر با یک لینک به پذیرش این مورد تایید فرستاده می شود.',
             'required_eula'						=> 'به این کاربر کپی EULA فرستاده می شود',
        diff --git a/resources/lang/fa/admin/custom_fields/message.php b/resources/lang/fa/admin/custom_fields/message.php
        index 68e7920916..64873d5766 100644
        --- a/resources/lang/fa/admin/custom_fields/message.php
        +++ b/resources/lang/fa/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'تنظیمات فیلد ایجاد نشده است، لطفا دوباره تلاش کنید.',
        diff --git a/resources/lang/fa/admin/departments/message.php b/resources/lang/fa/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/fa/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/fa/admin/departments/table.php b/resources/lang/fa/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/fa/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/fa/admin/hardware/general.php b/resources/lang/fa/admin/hardware/general.php
        index 82362a5c92..bd262581bd 100644
        --- a/resources/lang/fa/admin/hardware/general.php
        +++ b/resources/lang/fa/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'دارایی',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'دارایی checkin',
        -    'checkout'  				=> 'پرداخت سرمایه به کاربر',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'دارایی شگرف',
             'deployable'  				=> 'گسترش',
             'deleted'  					=> 'این دارایی حذف شده است. <a href="/hardware/:asset_id/restore"> اینجا به بازگرداندن آن کلیک کنید </a>.',
        diff --git a/resources/lang/fa/admin/hardware/message.php b/resources/lang/fa/admin/hardware/message.php
        index 33be7f4573..716d1ad124 100644
        --- a/resources/lang/fa/admin/hardware/message.php
        +++ b/resources/lang/fa/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> 'دارایی با موفقیت بازیابی شد.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'فایل حذف نمی شود. لطفا دوباره تلاش کنید.',
                 'success' => 'فایل با موفقیت حذف شده است.',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'آیا شما مطمئن هستید که می خواهید این تنظیمات دارایی را حذف کنید؟',
                 'error'   		=> 'اشکال در حذف دارایی.لطفا دوباره تلاش کنید.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'دارایی با موفقیت حذف شد.'
             ),
         
        diff --git a/resources/lang/fa/admin/locations/table.php b/resources/lang/fa/admin/locations/table.php
        index 8eef15a7b3..bacd139025 100644
        --- a/resources/lang/fa/admin/locations/table.php
        +++ b/resources/lang/fa/admin/locations/table.php
        @@ -18,4 +18,5 @@ return array(
             'locations'                 => 'مکانها',
             'parent'                    => 'مجموعه پدر',
             'currency'                  => 'مکان ارز',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/fa/admin/manufacturers/table.php b/resources/lang/fa/admin/manufacturers/table.php
        index b473347e15..49f6005f0e 100644
        --- a/resources/lang/fa/admin/manufacturers/table.php
        +++ b/resources/lang/fa/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'تولید کنندگان دارایی',
             'create'				=> 'ایجاد سازنده',
             'id'   					=> 'شناسه',
        -    'name'      			=> 'نام تولیدکننده',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'به روز رسانی تولیدکننده',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/fa/admin/models/message.php b/resources/lang/fa/admin/models/message.php
        index b5f56550b5..0fb426c6d8 100644
        --- a/resources/lang/fa/admin/models/message.php
        +++ b/resources/lang/fa/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'مدل با موفقیت بازیابی شد.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/fa/admin/settings/general.php b/resources/lang/fa/admin/settings/general.php
        index 39dd0c96f9..c6b7057b74 100644
        --- a/resources/lang/fa/admin/settings/general.php
        +++ b/resources/lang/fa/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'آستانه ی انقضای هشدارها( به روز)',
         	'alert_inv_threshold'		=> 'فهرست آستانه ی هشدار',
         	'asset_ids'					=> 'ID حساب',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'تولید شناسه دارایی (افزایش خودکار)',
         	'auto_increment_prefix'		=> 'پیشوند (اختیاری)',
         	'auto_incrementing_help'    => 'فعال کردن شناسه دارایی (افزایش خودکار) اول به این مجموعه',
        @@ -64,6 +68,8 @@ return array(
             'load_remote_text'          => 'اسکریپت از راه دور',
             'load_remote_help_text'		=> 'این برنامه نصب می تواند اسکریپت ها را از دنیای خارج بارگذاری کند.
         ',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'لوگو',
             'full_multiple_companies_support_help_text' => 'محدود کردن کاربران (از جمله مدیران) اختصاص داده شده به شرکت ها برای دارایی های شرکت خود را.',
             'full_multiple_companies_support_text' => 'شرکت های متعدد پشتیبانی کامل',
        @@ -72,6 +78,12 @@ return array(
             'php'                       => 'نسخه php',
             'php_gd_info'               => 'شما باید  php-gd را نصب کنید تا QR کد ها را ببنید، به دستورالعمل های نصب نگاه کنید.',
             'php_gd_warning'            => 'php پردازش تصویر و تفاضل پلاگین نصب نشده است.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'کدهای QR اول به این مجموعه را فعال کنید',
             'qr_text'                   => 'متن QR کد',
             'setting'                   => 'تنظیمات',
        @@ -91,6 +103,7 @@ return array(
             'about_settings_text'       => 'این تنظیمات به شما اجازه سفارشی کردن جنبه های خاصی از نصب و راه اندازی خود را می دهد.',
             'labels_per_page'           => 'برچسب ها در صفحه',
             'label_dimensions'          => 'ابعاد برچسب (اینچ)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'صفحه حاشیه (اینچ)',
             'purge'                    => 'پاکسازی حذف رکوردها',
             'labels_display_bgutter'    => 'برچسب قطره قطره پایین',
        @@ -105,6 +118,8 @@ return array(
             'width_w'        => 'عرض',
             'height_h'        => 'ارتفاع',
             'text_pt'        => 'بالای صفحه',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/fa/admin/users/general.php b/resources/lang/fa/admin/users/general.php
        index 791679eb2b..65653ac52c 100644
        --- a/resources/lang/fa/admin/users/general.php
        +++ b/resources/lang/fa/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'دارایی ها محول شده به :',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'دارایی های اکنون  برای این کاربر بیرون کشیده شد',
             'clone'             => 'کلون کاربر',
             'contact_user'      => 'تماس با:',
             'edit'              => 'ویرایش کاربر',
             'filetype_info'     => 'پسوند های مجاز:png, gif, jpg, jpeg, doc, docx, pdf, txt, zip,Rar',
             'history_user'      => 'تاریخچه برای:',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'آخرین ورود',
             'ldap_config_text'  => 'تنظشیمات تاییدیه LDPA در فولدر app/config در فایلی به نام idap.php وجود دارد.مکان مشخص شده برای تمامی کاربران وارد شده تنظیم میشود.شما نیاز دارید که حداقل یه مکان را اضافه کرده باشید تا بتوانید از این ویژگی استفاده کنید.',
             'software_user'     => 'برنامه چک شد برای:',
        diff --git a/resources/lang/fa/admin/users/message.php b/resources/lang/fa/admin/users/message.php
        index 1a36cf7326..eee0bcdf83 100644
        --- a/resources/lang/fa/admin/users/message.php
        +++ b/resources/lang/fa/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'دارایی با موفقیت پذیرفته شد.',
             'declined'                  => 'شما با موفقیت این دارایی را به کاهش دادید.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'کاربر "{0}" در حال حاضر وجود دارد.',
             'user_not_found'            => 'کاربر [:id] موجود نیست.',
             'user_login_required'       => 'فیلد ورود الزامی است.',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'کاربر با موفقیت ایجاد شد.',
                 'update'    => 'کاربر با موفقیت به روز شد.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'کاربر با موفقیت حذف شد.',
                 'ban'       => 'کاربر با موفقیت متوقف شد.',
                 'unban'     => 'محرومیت کاربر با موفقیت متوقف شد.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'اشکال در ایجاد کاربر.لطفا دوباره تلاش کنید.',
                 'update' => 'اشکال در به روزرسانی کاربر.لطفا دوباره تلاش کنید.',
                 'delete' => 'اشکال در حذف کاربر.لطفا دوباره تلاش کنید.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'اشکال در به رفع تعلیق کاربر.لطفا دوباره تلاش کنید.',
                 'import'    => 'اشکال در به وارد کردن کاربران.لطفا دوباره تلاش کنید.',
                 'asset_already_accepted' => 'دارایی پذیرفته شده است.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'ارتباط با سرور LDAP برقرار نشد.لطفا پیکربندی LDPA سرور را در فایل LDPA config بررسی کنید.<br>اشکال از سرور LDPA:',
                 'ldap_could_not_search' => 'جستجو در سرور LDPA انجام نشد.لطفا پیکربندی LDPA سرور را در فایل LDPA config بررسی کنید.<br>اشکال از سرور LDPA:',
                 'ldap_could_not_get_entries' => 'مجوز از سرور LDPA گرفته نشد.لطفا پیکربندی LDPA سرور را در فایل LDPA config بررسی کنید.<br>اشکال از سرور LDPA:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/fa/admin/users/table.php b/resources/lang/fa/admin/users/table.php
        index e432347c47..2c15d30aed 100644
        --- a/resources/lang/fa/admin/users/table.php
        +++ b/resources/lang/fa/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'فعال کردن',
             'allow'  				=> 'مجاز کردن',
             'checkedout'  			=> 'دارایی ها',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'مکان',
             'lock_passwords'		=> 'جزییات وارد شدن نمیتواند در این نصب تغییر کند.',
             'manager' 				=> 'مدیر',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'نام',
             'notes'                 => 'یادداشت ها',
             'password_confirm' 		=> 'تایید رمز عبور',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'نمایش کابران کنونی',
             'show_deleted'          => 'نمایش کاربران حذف شده',
             'title' 				=> 'عنوان',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'به روز رسانی کاربر',
             'username' 				=> 'نام کاربری',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(این فقط برای فعال سازی راهنمای اتصال است ،نه برای وارد شدن)',
             'cloneuser'             => ' کاربر کلون',
             'viewusers' 			=> 'مشاهده کاربران',
        diff --git a/resources/lang/fa/auth/message.php b/resources/lang/fa/auth/message.php
        index 4e8ddaf67c..23139e5cc0 100644
        --- a/resources/lang/fa/auth/message.php
        +++ b/resources/lang/fa/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'این حساب کاربری فعال نشده است.',
             'account_suspended'      => 'این حساب کاربری بسته است.',
             'account_banned'         => 'این حساب کاربری ممنوع است.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'مشکلی در حین تلاش به شما در ورود به سیستم وجود دارد، لطفا دوباره امتحان کنید.',
        diff --git a/resources/lang/fa/button.php b/resources/lang/fa/button.php
        index 68a666e9a5..f65b53c980 100644
        --- a/resources/lang/fa/button.php
        +++ b/resources/lang/fa/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'اقدامات',
             'add'    	                => 'افزودن جدید',
             'cancel'                    => 'انصراف',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'درخواست',
             'submit'  	                => 'ثبت کردن',
             'upload'                    => 'بارگزاری',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/fa/general.php b/resources/lang/fa/general.php
        index 20c54670d1..757d6e56ac 100644
        --- a/resources/lang/fa/general.php
        +++ b/resources/lang/fa/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'گزارش دارایی',
             'asset_tag'				=> 'برچسب دارایی',
             'assets_available'		=> 'دارایی های موجود',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'دارایی ها',
             'avatar_delete'         => 'حذف آواتار',
             'avatar_upload'         => 'بارگذاری آواتار',
             'back'      			=> 'بازگشت',
             'bad_data'      		=> 'چیزی پیدا نشد. شاید داده بد است؟',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'انصراف',
             'categories'			=> 'دسته‌بندی‌ها',
             'category'				=> 'دسته بندی',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'تغییر آدرس ایمیل',
             'changepassword'  		=> 'تغییر کلمه عبور',
             'checkin'  				=> 'بررسی',
             'checkin_from'  		=> 'فرم بررسی',
             'checkout'  			=> 'پرداخت',
             'city'  				=> 'شهر',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'شرکت ها',
             'company'				=> 'شرکت',
             'component'			=> 'کامپوننت',
             'components'			=> 'کامپوننت ها',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'قابل مصرف',
             'consumables'			=> 'اقلام قابل مصرف',
             'country'  				=> 'كشور',
        @@ -44,11 +51,14 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'دارایی ایجاد شده',
             'created_at' 			=> 'ایجاد شده در',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'کنونی',
             'custom_report'         => 'گزارش های سفارشی دارایی
         ',
             'dashboard'				=> 'میز کار',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'تاریخ',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        @@ -56,6 +66,8 @@
             'deleted'  				=> 'حذف شد',
             'delete_seats'  		=> 'صندلی ها حذف شده
         ',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'مستقر',
             'depreciation_report'	=> 'استهلاک گزارش',
             'download'				=> 'دانلود',
        @@ -89,6 +101,7 @@
             'insufficient_permissions' => 'دسترسی محدود!',
             'language'				=> 'زبان',
             'last'					=> 'آخرين',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'نام خانوادگی',
             'license'				=> 'توافق‌نامه',
             'license_report'        => 'مجوز گزارش',
        @@ -114,6 +127,8 @@
             'moreinfo'				=> 'اطلاعات بیشتر',
             'name'					=> 'نام',
             'next'					=> 'بعدی',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'بدون استهلاک',
             'no_results'			=> 'بدون نتیجه.',
        @@ -142,13 +157,14 @@
             'select'				=> 'انتخاب',
             'search'				=> 'جستوجو',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'انتخاب یک نوع استهلاک',
             'select_location'		=> 'انتخاب یک مکان',
             'select_manufacturer'	=> 'انتخاب یک تولید کننده',
             'select_model'			=> 'انتخاب یک مدل',
             'select_supplier'		=> 'انتخاب عرضه',
             'select_user'			=> 'انتخاب یک کاربر',
        -    'select_date'			=> 'انتخاب تاریخ',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'انتخاب وضعیت',
             'select_company'    	=> 'انتخاب شرکت',
             'select_asset'    		=> 'انتخاب دارایی',
        @@ -162,7 +178,10 @@
             'status'    			=> 'وضعیت',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'تامین کننده',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'کل دارایی',
             'total_licenses'		=> 'کل مجوزهای',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/fa/validation.php b/resources/lang/fa/validation.php
        index 84394f0c0e..eec84db638 100644
        --- a/resources/lang/fa/validation.php
        +++ b/resources/lang/fa/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "ویژگی باید تایید شود.",
        -    "active_url"       => "ویژگی یک URL معتبر نیست.",
        -    "after"            => "ویژگی باید در تاریخی بعد از تاریخ باشد.",
        -    "alpha"            => "ویژگی ممکن است فقط شامل حروف باشد.",
        -    "alpha_dash"       => "ویژگی ممکن است فقط شامل حروف، اعداد و خط های فاصله باشد.",
        -    "alpha_num"        => "ویژگی ممکن است فقط شامل حروف و اعداد باشد.",
        -    "before"           => "ویژگی باید در تاریخی قبل از تاریخ باشد.",
        -    "between"          => array(
        -        "numeric" => "ویژگی باید بین حداقل حداکثر باشد.",
        -        "file"    => "ویژگی باید بین حداقل حداکثر کیلوبایت باشد.",
        -        "string"  => "ویژگی باید بین حداقل حداکثر کاراکتر باشد.",
        -    ),
        -    "confirmed"        => "تایید ویژگی منطبق نیست.",
        -    "date"             => "تاریخ ویژگی معتبر نیست.",
        -    "date_format"      => "ویژگی منطبق بر شکل شکل نیست.",
        -    "different"        => "ویژگی و دیگر باید متفاوت باشد.",
        -    "digits"           => "ویژگی باید رقم رقم باشد.",
        -    "digits_between"   => "ویژگی باید بین حداقل و حداکثر رقم باشد.",
        -    "email"            => "شکل ویژگی نامعتبر است.",
        -    "exists"           => "ویژگی انتخاب شده نامعتبر است.",
        -    "email_array"      => "یک یا بیش از یک آدرس ایمیل نامعتبر است.",
        -    "image"            => "ویژگی باید یک عکس باشد.",
        -    "in"               => "ویژگی انتخاب شده نامعتبر است.",
        -    "integer"          => "ویژگی باید یک عدد باشد.",
        -    "ip"               => "ویژگی باید یک آدرس IP معتبر باشد.",
        -    "max"              => array(
        -        "numeric" => "ویژگی نباید بزرگتر از حداکثر باشد.",
        -        "file"    => "ویژگی نباید بزرگتر از حداکثر کیلوبایت باشد.",
        -        "string"  => "ویژگی نباید بزرگتر از حداکثر کاراکتر باشد.",
        -    ),
        -    "mimes"            => "ویژگی باید فایلی از نوع ارزش ها باشد.",
        -    "min"              => array(
        -        "numeric" => "ویژگی باید حداقل: حداقل باشد.",
        -        "file"    => "ویژگی باید حداقل: حداقل کیلوبایت باشد.",
        -        "string"  => "ویژگی باید حداقل: حداقل کاراکتر باشد.",
        -    ),
        -    "not_in"           => "ویژگی انتخاب شده نامعتبر است.",
        -    "numeric"          => "ویژگی باید عدد باشد.",
        -    "regex"            => "شکل ویژگی نامعتبر است.",
        -    "required"         => "فیلد ویژگی ضروری است.",
        -    "required_if"      => "فیلد ویژگی ضروری است، وقتی که دیگری ارزش است.",
        -    "required_with"    => "فیلد ویژگی ضروری است، وقتی که ارزش موجود باشد.",
        -    "required_without" => "فیلد ویژگی ضروری است، وقتی که ارزش ها حاضر نباشند.",
        -    "same"             => "ویژگی و دیگری باید بر هم منطبق باشند.",
        -    "size"             => array(
        -        "numeric" => "ویژگی باید به اندازه ی : سایز باشد.",
        -        "file"    => "ویژگی باید به اندازه ی: سایز کیلوبایت باشد.",
        -        "string"  => "ویژگی باید به اندازه ی : سایز کاراکتر باشد.",
        -    ),
        -    "unique"           => "ویژگی در حال حاضر گرفته شده است.",
        -    "url"              => "شکل ویژگی نامعتبر است.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'ویژگی باید تایید شود.',
        +    'active_url'           => 'ویژگی یک URL معتبر نیست.',
        +    'after'                => 'ویژگی باید در تاریخی بعد از تاریخ باشد.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'ویژگی ممکن است فقط شامل حروف باشد.',
        +    'alpha_dash'           => 'ویژگی ممکن است فقط شامل حروف، اعداد و خط های فاصله باشد.',
        +    'alpha_num'            => 'ویژگی ممکن است فقط شامل حروف و اعداد باشد.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'ویژگی باید در تاریخی قبل از تاریخ باشد.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'ویژگی باید بین حداقل حداکثر باشد.',
        +        'file'    => 'ویژگی باید بین حداقل حداکثر کیلوبایت باشد.',
        +        'string'  => 'ویژگی باید بین حداقل حداکثر کاراکتر باشد.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'تایید ویژگی منطبق نیست.',
        +    'date'                 => 'تاریخ ویژگی معتبر نیست.',
        +    'date_format'          => 'ویژگی منطبق بر شکل شکل نیست.',
        +    'different'            => 'ویژگی و دیگر باید متفاوت باشد.',
        +    'digits'               => 'ویژگی باید رقم رقم باشد.',
        +    'digits_between'       => 'ویژگی باید بین حداقل و حداکثر رقم باشد.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'شکل ویژگی نامعتبر است.',
        +    'exists'               => 'ویژگی انتخاب شده نامعتبر است.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'ویژگی باید یک عکس باشد.',
        +    'in'                   => 'ویژگی انتخاب شده نامعتبر است.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'ویژگی باید یک عدد باشد.',
        +    'ip'                   => 'ویژگی باید یک آدرس IP معتبر باشد.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'ویژگی نباید بزرگتر از حداکثر باشد.',
        +        'file'    => 'ویژگی نباید بزرگتر از حداکثر کیلوبایت باشد.',
        +        'string'  => 'ویژگی نباید بزرگتر از حداکثر کاراکتر باشد.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'ویژگی باید فایلی از نوع ارزش ها باشد.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'ویژگی باید حداقل: حداقل باشد.',
        +        'file'    => 'ویژگی باید حداقل: حداقل کیلوبایت باشد.',
        +        'string'  => 'ویژگی باید حداقل: حداقل کاراکتر باشد.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'ویژگی انتخاب شده نامعتبر است.',
        +    'numeric'              => 'ویژگی باید عدد باشد.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'شکل ویژگی نامعتبر است.',
        +    'required'             => 'فیلد ویژگی ضروری است.',
        +    'required_if'          => 'فیلد ویژگی ضروری است، وقتی که دیگری ارزش است.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'فیلد ویژگی ضروری است، وقتی که ارزش موجود باشد.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'فیلد ویژگی ضروری است، وقتی که ارزش ها حاضر نباشند.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'ویژگی و دیگری باید بر هم منطبق باشند.',
        +    'size'                 => [
        +        'numeric' => 'ویژگی باید به اندازه ی : سایز باشد.',
        +        'file'    => 'ویژگی باید به اندازه ی: سایز کیلوبایت باشد.',
        +        'string'  => 'ویژگی باید به اندازه ی : سایز کاراکتر باشد.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'ویژگی در حال حاضر گرفته شده است.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'شکل ویژگی نامعتبر است.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "فیلد ویژگی شامل یک کاراکتر غیرمجاز است.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/fi/admin/asset_maintenances/general.php b/resources/lang/fi/admin/asset_maintenances/general.php
        index 834ad83d4f..44fee81fb9 100644
        --- a/resources/lang/fi/admin/asset_maintenances/general.php
        +++ b/resources/lang/fi/admin/asset_maintenances/general.php
        @@ -2,9 +2,9 @@
         
             return [
                 'asset_maintenances' => 'Laitteen huolto',
        -        'edit'               => 'Edit Asset Maintenance',
        -        'delete'             => 'Delete Asset Maintenance',
        -        'view'               => 'View Asset Maintenance Details',
        +        'edit'               => 'Muokkaa laitteen huoltoa',
        +        'delete'             => 'Poista laitteen huolto',
        +        'view'               => 'Näytä laitteen huoltotiedot',
                 'repair'             => 'Korjaus',
                 'maintenance'        => 'Huoltotila',
                 'upgrade'            => 'Päivitä'
        diff --git a/resources/lang/fi/admin/asset_maintenances/message.php b/resources/lang/fi/admin/asset_maintenances/message.php
        index 9d328d6133..beebe4bfba 100644
        --- a/resources/lang/fi/admin/asset_maintenances/message.php
        +++ b/resources/lang/fi/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Asset Maintenance was not created, please try again.',
                     'success' => 'Asset Maintenance created successfully.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Not Completed Yet',
                 'warranty'                     => 'Takuu',
                 'not_warranty'                 => 'Takuu päättynyt',
        diff --git a/resources/lang/fi/admin/asset_maintenances/table.php b/resources/lang/fi/admin/asset_maintenances/table.php
        index 4384a20d44..18e4870be3 100644
        --- a/resources/lang/fi/admin/asset_maintenances/table.php
        +++ b/resources/lang/fi/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Laitteen ylläpito',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Laitteen Nimi',
                 'is_warranty'   => 'Takuu',
                 'dl_csv'        => 'Lataa CSV'
             ];
        diff --git a/resources/lang/fi/admin/categories/general.php b/resources/lang/fi/admin/categories/general.php
        index 79d041ee23..9bce9339be 100644
        --- a/resources/lang/fi/admin/categories/general.php
        +++ b/resources/lang/fi/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Edit Category',
             'eula_text'							=> 'Category EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
        diff --git a/resources/lang/fi/admin/custom_fields/message.php b/resources/lang/fi/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/fi/admin/custom_fields/message.php
        +++ b/resources/lang/fi/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/fi/admin/departments/message.php b/resources/lang/fi/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/fi/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/fi/admin/departments/table.php b/resources/lang/fi/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/fi/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/fi/admin/hardware/general.php b/resources/lang/fi/admin/hardware/general.php
        index 65fe065c91..13fb78f618 100644
        --- a/resources/lang/fi/admin/hardware/general.php
        +++ b/resources/lang/fi/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Laite',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Palauta Laite',
        -    'checkout'  				=> 'Luovuta Laite Käyttäjälle',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Monista Laite',
             'deployable'  				=> 'Käyttööotettavissa',
             'deleted'  					=> 'Tämä laite on poistettu. <a href="/hardware/:asset_id/restore">Klikkaa tästä palauttaaksesi sen</a>.',
        diff --git a/resources/lang/fi/admin/hardware/message.php b/resources/lang/fi/admin/hardware/message.php
        index 0a54d5ee05..bddd1ff472 100644
        --- a/resources/lang/fi/admin/hardware/message.php
        +++ b/resources/lang/fi/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Laite palautettiin onnistuneesti.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Tiedostoa ei poistettu. Ole hyvä ja yritä uudelleen.',
                 'success' => 'Tiedosto poistettiin onnistuneesti.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Oletko varma että haluat poistaa tämän laitteen?',
                 'error'   		=> 'Laitteen poistamisessa tapahtui virhe. Yritä uudelleen.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Laite poistettu onnistuneesti.'
             ),
         
        diff --git a/resources/lang/fi/admin/locations/table.php b/resources/lang/fi/admin/locations/table.php
        index 0703a60c16..1523a92249 100644
        --- a/resources/lang/fi/admin/locations/table.php
        +++ b/resources/lang/fi/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Sijainnit',
             'parent'                    => 'Ylempi kategoria',
             'currency'                  => 'Valuutta',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/fi/admin/manufacturers/table.php b/resources/lang/fi/admin/manufacturers/table.php
        index 471fac6397..c00bfe0c75 100644
        --- a/resources/lang/fi/admin/manufacturers/table.php
        +++ b/resources/lang/fi/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Laitevalmistajat',
             'create'				=> 'Uusi Valmistaja',
             'id'   					=> 'Tunnus',
        -    'name'      			=> 'Valmistajan Nimi',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Päivitä Valmistaja',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/fi/admin/models/message.php b/resources/lang/fi/admin/models/message.php
        index 8275fb663b..e51bdceb4f 100644
        --- a/resources/lang/fi/admin/models/message.php
        +++ b/resources/lang/fi/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/fi/admin/settings/general.php b/resources/lang/fi/admin/settings/general.php
        index 11f40b33e6..c8bcc102e2 100644
        --- a/resources/lang/fi/admin/settings/general.php
        +++ b/resources/lang/fi/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Luo automaattisesti kasvavat laite-ID:t',
         	'auto_increment_prefix'		=> 'Etuliite (valinnainen)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Sähköposti',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versio PHP',
             'php_gd_info'               => 'Sinun tulee asentaa php-gd paketti näyttääksesi QR-koodit, katso lisätietoja asennusohjeista.',
             'php_gd_warning'            => 'PHP Image Prosessing ja GD-lisäosia EI ole asennettuna.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Ota QR-koodit käyttöön valitaksesi tämän',
             'qr_text'                   => 'QR-koodin Teksti',
             'setting'                   => 'Asetus',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Näiden asetusten avulla voit mukauttaa tiettyjä toimintoja.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/fi/admin/statuslabels/message.php b/resources/lang/fi/admin/statuslabels/message.php
        index 619a5a509c..d7e2391104 100644
        --- a/resources/lang/fi/admin/statuslabels/message.php
        +++ b/resources/lang/fi/admin/statuslabels/message.php
        @@ -2,24 +2,24 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        -    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +    'does_not_exist' => 'Tilamerkintää ei löydy.',
        +    'assoc_assets'	 => 'Tilamerkintä on määritetty käyttöön yhdelle tai useammalle laitteelle joten sitä ei voida poistaa. Poista tilamerkintä käytöstä kaikilta laitteilta ja yritä uudelleen. ',
         
         
             'create' => array(
        -        'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'Status Label created successfully.'
        +        'error'   => 'Tilamerkintää ei luotu, yritä uudelleen.',
        +        'success' => 'Tilamerkintä luotiin onnistuneesti.'
             ),
         
             'update' => array(
        -        'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'Status Label updated successfully.'
        +        'error'   => 'Tilamerkintää ei päivitetty, yritä uudelleen',
        +        'success' => 'Tilamerkintä päivitettiin onnistuneesti.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        -        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        -        'success' => 'The Status Label was deleted successfully.'
        +        'confirm'   => 'Oletko varma että haluat poistaa tämän tilamerkinnän?',
        +        'error'   => 'Tilamerkinnän poistamisessa tapahtui virhe. Yritä uudelleen.',
        +        'success' => 'Tilamerkintä poistettiin onnistuneesti.'
             )
         
         );
        diff --git a/resources/lang/fi/admin/users/general.php b/resources/lang/fi/admin/users/general.php
        index daeb5c919a..0fa470b46e 100644
        --- a/resources/lang/fi/admin/users/general.php
        +++ b/resources/lang/fi/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Käyttäjälle :name luovutetut laitteet',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Monista Käyttäjä',
             'contact_user'      => 'Ota yhteyttä käyttäjään :name',
             'edit'              => 'Muokkaa käyttäjää',
             'filetype_info'     => 'Sallitut tiedostotyypit ovat png, gif, jpg, jpeg, doc, docx, pdf, txt, zip ja rar.',
             'history_user'      => 'Historia käyttäjälle :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Viimeisin kirjautuminen',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Käyttäjälle :name luovutetut ohjelmistot',
        diff --git a/resources/lang/fi/admin/users/message.php b/resources/lang/fi/admin/users/message.php
        index ec36452015..d83020ab4f 100644
        --- a/resources/lang/fi/admin/users/message.php
        +++ b/resources/lang/fi/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Käyttäjää on jo luotu!',
             'user_not_found'            => 'Käyttäjää [:id] ei löydy.',
             'user_login_required'       => 'Käyttäjätunnus vaaditaan',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Käyttäjä luotiin onnistuneesti.',
                 'update'    => 'Käyttäjä päivitettiin onnistuneesti.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Käyttäjä poistettiin onnistuneesti.',
                 'ban'       => 'Käyttäjä estettiin onnistuneesti.',
                 'unban'     => 'Käyttäjän esto poistettiin onnistuneesti.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Käyttäjä luonnissa tapahtui virhe. Yritä uudelleen.',
                 'update' => 'Käyttäjän päivityksessä tapahtui virhe. Yritä uudelleen.',
                 'delete' => 'Käyttäjän poistamisessa tapahtui virhe. Yritä uudelleen.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Käyttäjän jäädytyksen poistossa tapahtui virhe. Yritä uudelleen.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/fi/admin/users/table.php b/resources/lang/fi/admin/users/table.php
        index ecf10c112d..278a90f7a6 100644
        --- a/resources/lang/fi/admin/users/table.php
        +++ b/resources/lang/fi/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktiivinen',
             'allow'  				=> 'Salli',
             'checkedout'  			=> 'Laitteet',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Sijainti',
             'lock_passwords'		=> 'Kirjautumistietoja ei voida muokata tässä asennuksessa.',
             'manager' 				=> 'Esimies',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nimi',
             'notes'                 => 'Muistiinpanot',
             'password_confirm' 		=> 'Vahvista Salasana',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Näytä nykyiset käyttäjät',
             'show_deleted'          => 'Näytä poistetut käyttäjät',
             'title' 				=> 'Titteli',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Päivitä Käyttäjä',
             'username' 				=> 'Käyttäjätunnus',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Tätä käytetään vain Active Directory synkronointiin, ei kirjautumista varten.)',
             'cloneuser'             => 'Monista Käyttäjä',
             'viewusers' 			=> 'Näytä Käyttäjät',
        diff --git a/resources/lang/fi/auth/message.php b/resources/lang/fi/auth/message.php
        index 4ce4f02e1f..36da70f206 100644
        --- a/resources/lang/fi/auth/message.php
        +++ b/resources/lang/fi/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Käyttäjätiliä ei ole aktivoitu.',
             'account_suspended'      => 'Käyttäjätili on jäädytetty.',
             'account_banned'         => 'Käyttäjätili on estetty.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Sisäänkirjautumisessa tapahtui virhe, yritä uudelleen.',
        diff --git a/resources/lang/fi/button.php b/resources/lang/fi/button.php
        index e1723007d7..67c3a325a4 100644
        --- a/resources/lang/fi/button.php
        +++ b/resources/lang/fi/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Toiminnot',
             'add'    	                => 'Lisää uusi',
             'cancel'                    => 'Peruuta',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Lähetä',
             'upload'                    => 'Lähetä',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/fi/general.php b/resources/lang/fi/general.php
        index 1ccbf77a13..5ce2d5bba2 100644
        --- a/resources/lang/fi/general.php
        +++ b/resources/lang/fi/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Laiteraportti',
             'asset_tag'				=> 'Laitetunnus',
             'assets_available'		=> 'laitetta vapaana',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Laitteet',
             'avatar_delete'         => 'Poista käyttäjäkuva',
             'avatar_upload'         => 'Lähetä Käyttäjäkuva',
             'back'      			=> 'Edellinen',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Peruuta',
             'categories'			=> 'Kategoriat',
             'category'				=> 'Kategoria',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Muuta Email-osoite',
             'changepassword'  		=> 'Muuta Salasana',
             'checkin'  				=> 'Palauta',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Luovuta',
             'city'  				=> 'Kaupunki',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Yritykset',
             'company'				=> 'Yritys',
             'component'			=> 'Komponentti',
             'components'			=> 'Komponentit',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Maa',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'laite luotu',
             'created_at' 			=> 'Luontiaika',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '€', // this is deprecated
             'current'  				=> 'Käytössä Olevat',
             'custom_report'         => 'Muokattu Laiteraportti',
             'dashboard'				=> 'Hallintasivu',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Päivä',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Poista',
             'deleted'  				=> 'Poistettu',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Käyttöönotettu',
             'depreciation_report'	=> 'Poistoraportti',
             'download'				=> 'Lataa',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Kieli',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Sukunimi',
             'license'				=> 'Lisenssi',
             'license_report'        => 'Lisenssiraportti',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'Lisätiedot',
             'name'					=> 'Nimi',
             'next'					=> 'Seuraava',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'Ei poistoluokkaa',
             'no_results'			=> 'Ei tuloksia.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Valitse',
             'search'				=> 'Etsi',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Valitse sijainti',
             'select_manufacturer'	=> 'Valitse valmistaja',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Valitse toimittaja',
             'select_user'			=> 'Valitse käyttäjä',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Tila',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Toimittajat',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'laitteita yhteensä',
             'total_licenses'		=> 'lisenssejä yhteensä',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/fi/validation.php b/resources/lang/fi/validation.php
        index 692eddd6ed..bcada1d4cc 100644
        --- a/resources/lang/fi/validation.php
        +++ b/resources/lang/fi/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute tulee hyväksyä.",
        -    "active_url"       => ":attribute ei ole oikea URL-osoite.",
        -    "after"            => ":attribute tulee olla päivämäärä päivän :date jälkeen.",
        -    "alpha"            => ":attribute saa sisältää ainoastaan kirjaimia.",
        -    "alpha_dash"       => ":attribute voi sisältää vain kirjaimia, numeroita ja viivoja.",
        -    "alpha_num"        => ":attribute voi sisältää ainoastaan kirjaimia ja numeroita.",
        -    "before"           => ":attribute tulee olla päivämäärä ennen päivää :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute tulee olla välillä :min - :max.",
        -        "file"    => ":attribute tulee olla välillä :min - :max kilotavua.",
        -        "string"  => ":attribute tulee olla :min - :max merkkiä.",
        -    ),
        -    "confirmed"        => ":attribute vahvistus ei täsmää.",
        -    "date"             => ":attribute ei ole oikea päivämäärä.",
        -    "date_format"      => ":attribute ei täsmää muotoiluun :format.",
        -    "different"        => ":attribute ja :other tulee olla erilaisia.",
        -    "digits"           => ":attribute tulee olla :digits numeroa pitkä.",
        -    "digits_between"   => ":attribute tulee olla numero väliltä :min ja :max.",
        -    "email"            => ":attribute muotoilu on virheellinen.",
        -    "exists"           => "Valittu :attribute on virheellinen.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => ":attribute tulee olla kuva.",
        -    "in"               => "Valittu :attribute on virheellinen.",
        -    "integer"          => ":attribute tulee olla kokonaisluku.",
        -    "ip"               => ":attribute tulee olla oikea IP-osoite.",
        -    "max"              => array(
        -        "numeric" => ":attribute ei saa olla suurempi kuin :max.",
        -        "file"    => ":attribute ei saa olla suurempi kuin :max kilotavua.",
        -        "string"  => ":attribute ei saa olla suurempi kuin :max merkkiä.",
        -    ),
        -    "mimes"            => ":attribute tulee olla tiedosto jonka tyyppi on: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute tulee olla vähintään :min.",
        -        "file"    => ":attribute tulee olla vähintään :min kilotavua.",
        -        "string"  => ":attribute tulee olla vähintään :min merkkiä.",
        -    ),
        -    "not_in"           => "Valittu :attribute on virheellinen.",
        -    "numeric"          => ":attribute tulee olla numero.",
        -    "regex"            => ":attribute muotoilu on virheellinen.",
        -    "required"         => ":attribute on vaadittu.",
        -    "required_if"      => ":attribute on vaadittu kun :other on :value.",
        -    "required_with"    => ":attribute on vaadittu kun :values on määritettynä.",
        -    "required_without" => ":attribute on vaadittu kun :values ei ole määritettynä.",
        -    "same"             => ":attribute ja :other tulee olla samat.",
        -    "size"             => array(
        -        "numeric" => ":attributetulee olla :size.",
        -        "file"    => ":attribute tulee olla :size kilotavua.",
        -        "string"  => ":attribute tulee olla :size merkkiä.",
        -    ),
        -    "unique"           => ":attribute on jo käytössä.",
        -    "url"              => ":attribute muotoilu on virheellinen.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute tulee hyväksyä.',
        +    'active_url'           => ':attribute ei ole oikea URL-osoite.',
        +    'after'                => ':attribute tulee olla päivämäärä päivän :date jälkeen.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute saa sisältää ainoastaan kirjaimia.',
        +    'alpha_dash'           => ':attribute voi sisältää vain kirjaimia, numeroita ja viivoja.',
        +    'alpha_num'            => ':attribute voi sisältää ainoastaan kirjaimia ja numeroita.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute tulee olla päivämäärä ennen päivää :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute tulee olla välillä :min - :max.',
        +        'file'    => ':attribute tulee olla välillä :min - :max kilotavua.',
        +        'string'  => ':attribute tulee olla :min - :max merkkiä.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => ':attribute vahvistus ei täsmää.',
        +    'date'                 => ':attribute ei ole oikea päivämäärä.',
        +    'date_format'          => ':attribute ei täsmää muotoiluun :format.',
        +    'different'            => ':attribute ja :other tulee olla erilaisia.',
        +    'digits'               => ':attribute tulee olla :digits numeroa pitkä.',
        +    'digits_between'       => ':attribute tulee olla numero väliltä :min ja :max.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute muotoilu on virheellinen.',
        +    'exists'               => 'Valittu :attribute on virheellinen.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute tulee olla kuva.',
        +    'in'                   => 'Valittu :attribute on virheellinen.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute tulee olla kokonaisluku.',
        +    'ip'                   => ':attribute tulee olla oikea IP-osoite.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute ei saa olla suurempi kuin :max.',
        +        'file'    => ':attribute ei saa olla suurempi kuin :max kilotavua.',
        +        'string'  => ':attribute ei saa olla suurempi kuin :max merkkiä.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute tulee olla tiedosto jonka tyyppi on: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute tulee olla vähintään :min.',
        +        'file'    => ':attribute tulee olla vähintään :min kilotavua.',
        +        'string'  => ':attribute tulee olla vähintään :min merkkiä.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Valittu :attribute on virheellinen.',
        +    'numeric'              => ':attribute tulee olla numero.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute muotoilu on virheellinen.',
        +    'required'             => ':attribute on vaadittu.',
        +    'required_if'          => ':attribute on vaadittu kun :other on :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute on vaadittu kun :values on määritettynä.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute on vaadittu kun :values ei ole määritettynä.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute ja :other tulee olla samat.',
        +    'size'                 => [
        +        'numeric' => ':attributetulee olla :size.',
        +        'file'    => ':attribute tulee olla :size kilotavua.',
        +        'string'  => ':attribute tulee olla :size merkkiä.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute on jo käytössä.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute muotoilu on virheellinen.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/fr/admin/asset_maintenances/message.php b/resources/lang/fr/admin/asset_maintenances/message.php
        index 4f64cd6971..a238ef77ee 100644
        --- a/resources/lang/fr/admin/asset_maintenances/message.php
        +++ b/resources/lang/fr/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Le type d\'entretien d\'actif n\'a pas été créé, veuillez réessayer.',
                     'success' => 'Le type d\'entretien d\'actif a été créé correctement.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Pas encore complété',
                 'warranty'                     => 'Garantie',
                 'not_warranty'                 => 'Non garantie',
        diff --git a/resources/lang/fr/admin/asset_maintenances/table.php b/resources/lang/fr/admin/asset_maintenances/table.php
        index 7cbc292255..449cb9a430 100644
        --- a/resources/lang/fr/admin/asset_maintenances/table.php
        +++ b/resources/lang/fr/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Entretien d\'actifs',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Désignation de l\'item',
                 'is_warranty'   => 'Garantie',
                 'dl_csv'        => 'Télécharger en CSV'
             ];
        diff --git a/resources/lang/fr/admin/categories/general.php b/resources/lang/fr/admin/categories/general.php
        index 0bb0a7515c..2c53813b7a 100644
        --- a/resources/lang/fr/admin/categories/general.php
        +++ b/resources/lang/fr/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'A propos des catégories',
        +    'about_categories'  				=> 'Les catégories vous aident à organiser vos items. Des exemples de catégories peuvent être "Ordinateurs de bureau", "Ordinateurs portables", "Téléphones portables", "Tablettes", etc..., mais vous pouvez utiliser les catégories comme cela vous convient.',
             'asset_categories' 					=> 'Catégories',
             'category_name'  					=> 'Catégorie',
             'checkin_email'                     => 'Envoyer un courriel à l\'utilisateur lors de l\'attribution.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Modifier la catégorie',
             'eula_text'							=> 'Catégorie de licence d\'utilisation',
             'eula_text_help'					=> 'Ce champ vous permet de configurer vos licences d\'utilisation pour chaque type d\'items. Si vous avez seulement une licence pour tout vos items, vous pouvez cochez la case ci-dessous pour utiliser celle par défaut.',
        +    'name'                              => 'Nom de la catégorie',
             'require_acceptance'				=> 'L\'utilisateur doit confirmer qu\'il accepte les actifs de cette catégorie.',
             'required_acceptance'				=> 'L\'utilisateur recevra un courriel avec un lien de confirmation pour accepter ce produit.',
             'required_eula'						=> 'Cet utilisateur recevra par courriel une copie de la licence d\'utilisation',
        diff --git a/resources/lang/fr/admin/companies/general.php b/resources/lang/fr/admin/companies/general.php
        index f78ca10e77..dc3694e5a4 100644
        --- a/resources/lang/fr/admin/companies/general.php
        +++ b/resources/lang/fr/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'A propos des entreprises',
        +    'about_companies_text'                  => 'Les entreprises peuvent être utilisées comme simple champ d\'identification, ou bien afin de limité la visibilité des items, utilisateurs etc... Si le support complet de l\'entreprise est activé dans les paramètres d\'administration.',
             'select_company' => 'Sélectionnez une compagnie',
         ];
        diff --git a/resources/lang/fr/admin/custom_fields/general.php b/resources/lang/fr/admin/custom_fields/general.php
        index 69a7b92a40..ae52be1356 100644
        --- a/resources/lang/fr/admin/custom_fields/general.php
        +++ b/resources/lang/fr/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'A propos des fieldsets',
             'about_fieldsets_text'		=> 'Les fieldsets permettent de créer des groupes de champs personnalisés que vous utilisez fréquemment pour des types de modèles spécifiques.',
             'custom_format'             => 'Format personnalisé...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Chiffrer la valeur de ce champ dans la base de données',
             'encrypt_field_help'      => 'AVERTISSEMENT: Chiffrer un champ en rend la recherche sur le contenu impossible.',
             'encrypted'      	        => 'Chiffré',
             'fieldset'      	        => 'Fieldset',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Nom du fieldset',
             'field_name'              => 'Nom du champ',
             'field_values'            => 'Valeurs de champ',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Ajouter des options sélectionnables, une par ligne. Les lignes vides autres que la première ligne seront ignorées.',
             'field_element'           => 'Élément de formulaire',
             'field_element_short'     => 'Elément',
             'field_format'            => 'Format',
        diff --git a/resources/lang/fr/admin/custom_fields/message.php b/resources/lang/fr/admin/custom_fields/message.php
        index f2846e6c4e..548b61a379 100644
        --- a/resources/lang/fr/admin/custom_fields/message.php
        +++ b/resources/lang/fr/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Le fieldset n\'a pas pur être créé, veuillez réessayer.',
        diff --git a/resources/lang/fr/admin/departments/message.php b/resources/lang/fr/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/fr/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/fr/admin/departments/table.php b/resources/lang/fr/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/fr/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/fr/admin/depreciations/general.php b/resources/lang/fr/admin/depreciations/general.php
        index f850d6b383..1ca3e3a8ba 100644
        --- a/resources/lang/fr/admin/depreciations/general.php
        +++ b/resources/lang/fr/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'A propos des Amortissements',
             'about_depreciations'  					=> 'Vous pouvez configurer les amortissements de vos biens basés sur l\'amortissement linéaire.',
             'asset_depreciations'  					=> 'Amortissements',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Créer un amortissement',
             'depreciation_name'  					=> 'Nom d\'Amortissement',
             'number_of_months'  					=> 'Mois',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Actualiser l\'amortissement',
         
         );
        diff --git a/resources/lang/fr/admin/groups/titles.php b/resources/lang/fr/admin/groups/titles.php
        index f749298399..d58de14fde 100644
        --- a/resources/lang/fr/admin/groups/titles.php
        +++ b/resources/lang/fr/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'A propos des groupes',
        +    'about_groups'                  => 'Les groupes sont utilisés pour mettre en commun les permissions des utilisateurs.',
             'group_management' 	 	=> 'Gestion des Groupes',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Créer un nouveau groupe',
        +    'update' 	 		        => 'Éditer le groupe',
             'group_name' 	 		=> 'Nom du Groupe',
             'group_admin' 	 		=> 'Admin Groupe',
             'allow' 	 			=> 'Autoriser',
        diff --git a/resources/lang/fr/admin/hardware/form.php b/resources/lang/fr/admin/hardware/form.php
        index 8c931a6e02..a521fd687a 100644
        --- a/resources/lang/fr/admin/hardware/form.php
        +++ b/resources/lang/fr/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Confirmez la suppression du lot d\'objets',
           'bulk_delete_help'	=> 'Vérifiez les objets ci-dessous pour la suppression du lot. Une fois supprimés, ces objets peuvent être restaurés, mais ils ne seront plus associés avec les utilisateurs auxquels ils sont actuellement assignés.',
           'bulk_delete_warn'	=> 'Vous allez supprimer :asset_count objets.',
         	'bulk_update'		=> 'Mise à jour en bloc d\'actifs',
        diff --git a/resources/lang/fr/admin/hardware/general.php b/resources/lang/fr/admin/hardware/general.php
        index 8ae65fe1e1..0bd475e10b 100644
        --- a/resources/lang/fr/admin/hardware/general.php
        +++ b/resources/lang/fr/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'A propos des actifs',
        +    'about_assets_text'            => 'Les actifs sont des éléments suivis par le numéro de série ou l\'étiquette de l\'actif. Ils ont tendance à être des éléments de valeur supérieure où l\'identification d\'un élément spécifique importe.',
         	'archived'  				=> 'Retiré',
             'asset'  					=> 'Biens',
             'bulk_checkout'             => 'Attribuer les objets à l\'utilisateur',
             'checkin'  					=> 'Retour des Biens',
        -    'checkout'  				=> 'Sortie des Biens',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Cloner le Bien',
             'deployable'  				=> 'Déployable',
             'deleted'  					=> 'Cet actif a été détruit. <a href="/hardware/:asset_id/restore">Cliquez ici pour le restaurer</a>.',
        diff --git a/resources/lang/fr/admin/hardware/message.php b/resources/lang/fr/admin/hardware/message.php
        index f6edb3e946..a63c9174d5 100644
        --- a/resources/lang/fr/admin/hardware/message.php
        +++ b/resources/lang/fr/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Actif restauré correctement.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Le fichier n\'a pas été détruit. Veuillez réessayer.',
                 'success' => 'Fichier détruit correctement.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Etes-vous sûr de vouloir supprimer ce bien?',
                 'error'   		=> 'Il y a eu un problème en supprimant ce bien. Veuillez réessayer.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Ce bien a été supprimé correctement.'
             ),
         
        diff --git a/resources/lang/fr/admin/licenses/general.php b/resources/lang/fr/admin/licenses/general.php
        index 108cc2b649..ed20681369 100644
        --- a/resources/lang/fr/admin/licenses/general.php
        +++ b/resources/lang/fr/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'A propos des licences',
        +    'about_licenses'                  => 'Les licences sont utilisées pour suivre les logiciels. Ils ont un certain nombre d\'attribution pouvant être associés individuellement',
             'checkin'  					=> 'Libérer la licence multiposte',
             'checkout_history'  		=> 'Historique des associations',
             'checkout'  				=> 'Associer la licence multiposte',
        diff --git a/resources/lang/fr/admin/licenses/message.php b/resources/lang/fr/admin/licenses/message.php
        index da6b3c25fc..dd35e0d8e7 100644
        --- a/resources/lang/fr/admin/licenses/message.php
        +++ b/resources/lang/fr/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Le(s) fichier(s) n\'a pas pu être uploadé. Merci de réessayer.',
                 'success' => 'Le(s) fichier(s) a bien été uploadé.',
                 'nofiles' => 'Vous n\'avez pas sélectionné de fichier pour le téléchargement ou le fichier que vous essayez de télécharger est trop gros',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Un ou plusieurs de vos fichiers est trop grand ou le type de fichier n\'est pas autorisé. Les différents types de fichiers autorisés sont png, gif, jpg, doc, docx, pdf, txt, zip, rar et rtf.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/fr/admin/locations/table.php b/resources/lang/fr/admin/locations/table.php
        index b2d2be1917..b7da9d3df1 100644
        --- a/resources/lang/fr/admin/locations/table.php
        +++ b/resources/lang/fr/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'A propos des emplacements',
        +    'about_locations'           => 'Les lieux sont utilisés pour suivre les informations de localisation des utilisateurs, des actifs et d\'autres éléments',
             'assets_rtd'                => 'Biens', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Biens assignés',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Lieux',
             'parent'                    => 'Parent',
             'currency'                  => 'Devise de l\'emplacement',
        +    'ldap_ou'                   => 'Recherche LDAP',
             );
        diff --git a/resources/lang/fr/admin/manufacturers/table.php b/resources/lang/fr/admin/manufacturers/table.php
        index d18bd8e6df..64cc317101 100644
        --- a/resources/lang/fr/admin/manufacturers/table.php
        +++ b/resources/lang/fr/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'A propos des fabricants',
        +    'about_manufacturers_text'  => 'Les fabricants sont les entreprises qui créent vos actifs. Vous pouvez stocker ici des informations importantes sur les contacts de support, qui seront affichées sur les pages de détails de votre actif.',
             'asset_manufacturers'	=> 'Fabricants d\'actif',
             'create'				=> 'Créer un fabricant',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nom du fabricant',
        +    'name'      			=> 'Nom',
        +    'support_email'   		=> 'Email du support',
        +    'support_phone'   		=> 'Téléphone du support',
        +    'support_url'   		=> 'URL du support',
             'update'				=> 'Mettre à jour le fabricant',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/fr/admin/models/general.php b/resources/lang/fr/admin/models/general.php
        index 1e3b0e9734..28d80138c4 100644
        --- a/resources/lang/fr/admin/models/general.php
        +++ b/resources/lang/fr/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'A propos des modèles actifs',
        +    'about_models_text'           => 'Les modèles actifs sont une façon de regrouper les actifs identiques. « MBP 2013", « IPhone 6 s », etc.',
             'deleted'  					        => 'Ce modèle a été détruit. <a href="/hardware/models/:model_id/restore">Cliquez ici pour le restaurer</a>.',
             'restore'                   => 'Restaurer le modèle',
             'requestable'               => 'Les utilisateurs peuvent demander ce modèle',
        diff --git a/resources/lang/fr/admin/models/message.php b/resources/lang/fr/admin/models/message.php
        index d928a1ffcd..159cd6734c 100644
        --- a/resources/lang/fr/admin/models/message.php
        +++ b/resources/lang/fr/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modèle d\'actif restauré correctement.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/fr/admin/settings/general.php b/resources/lang/fr/admin/settings/general.php
        index 0523340d08..c6e2f32c50 100644
        --- a/resources/lang/fr/admin/settings/general.php
        +++ b/resources/lang/fr/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Seuil d\'expiration des alertes (en jours)',
         	'alert_inv_threshold'		=> 'Seuil d\'alerte d\'inventaire',
         	'asset_ids'					=> 'ID de l\'actif',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Générer des identifiants d\'actifs auto-incrémentés',
         	'auto_increment_prefix'		=> 'Préfixe (optionnel)',
         	'auto_incrementing_help'    => 'Activer l\'auto-incrémentation des ID d\'actif avant de sélectionner cette option',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'E-mail LDAP',
             'load_remote_text'          => 'Scripts distants',
             'load_remote_help_text'		=> 'Cette installation Snipe-IT peut charger des scripts depuis le monde extérieur.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restreindre les utilisateurs (admins compris) assignés à des organisations aux biens de leur propre organisation.',
             'full_multiple_companies_support_text' => 'Support complet des organisations multiples',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Version de PHP',
             'php_gd_info'               => 'Vous devez installer php-gd afin d\'afficher les QR codes (voir les instructions d\'installation).',
             'php_gd_warning'            => 'Le PHP Image Processing et GD plugin n\'est PAS installé.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Activer les QR Codes avant de définir ceci',
             'qr_text'                   => 'Texte du QR Code',
             'setting'                   => 'Paramètre',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Ces réglages vous permettent de personnaliser certains aspects de votre installation.',
             'labels_per_page'           => 'Etiquettes par page',
             'label_dimensions'          => 'Dimensions de l\'étiquette (en pouces)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Marges de la page (en pouces)',
             'purge'                    => 'Purger les enregistrements supprimés',
             'labels_display_bgutter'    => 'Etiquette de la gouttière du bas',
        @@ -104,25 +117,27 @@ return array(
             'width_w'        => 'l',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Authentification en deux étapes',
        +    'two_factor_secret'        => 'Code à deux facteurs',
        +    'two_factor_enrollment'        => 'Inscription à deux facteurs',
        +    'two_factor_enabled_text'        => 'Activer l\'authentification à deux facteurs',
        +    'two_factor_reset'        => 'Réinitialiser le Secret à deux facteurs',
        +    'two_factor_reset_help'        => 'Ceci forcera l’utilisateur à inscrire de nouveau leur appareil avec Google Authenticator. Cela peut être utile si leur appareil actuellement inscrit est perdue ou volée. ',
        +    'two_factor_reset_success'          => 'Dispositif à deux facteurs réinitialisées avec succès',
        +    'two_factor_reset_error'          => 'Échec de réinitialisation du dispositif à deux facteurs',
        +    'two_factor_enabled_warning'        => 'L\'activation à deux facteurs si elle n\'est pas actuellement activée vous obligera immédiatement à vous authentifier avec un appareil inscrit Google Auth. Vous aurez la possibilité d\'inscrire votre appareil si aucun n\'est inscrit actuellement.',
        +    'two_factor_enabled_help'        => 'Cela activera l\'authentification à deux facteurs en utilisant Google Authenticator.',
        +    'two_factor_optional'        => 'Sélectif (les utilisateurs peuvent activer ou désactiver si permis)',
        +    'two_factor_required'        => 'Requis pour tous les utilisateurs',
        +    'two_factor_disabled'        => 'Désactivé',
        +    'two_factor_enter_code'	=> 'Entre le code à deux facteurs',
        +    'two_factor_config_complete'	=> 'Soumettre le code',
        +    'two_factor_enabled_edit_not_allowed' => 'Votre administrateur ne vous permet pas de modifier ce paramètre.',
        +    'two_factor_enrollment_text'	=> "L’authentification à deux facteurs est nécessaire, mais votre appareil n’a pas encore été inscrit. Ouvrez votre application Google Authenticator et scanner le code QR ci-dessous pour inscrire votre appareil. Une fois que vous avez inscrit votre appareil, saisissez le code ci-dessous",
        +    'require_accept_signature'      => 'Exiger la signature',
        +    'require_accept_signature_help_text'      => 'L\'activation de cette fonctionnalité nécessite que les utilisateurs signent physiquement l\'acceptation de cet actif.',
             'left'        => 'gauche',
             'right'        => 'droite',
             'top'        => 'haut',
        diff --git a/resources/lang/fr/admin/suppliers/table.php b/resources/lang/fr/admin/suppliers/table.php
        index 3a59c9cae7..b7bbded713 100644
        --- a/resources/lang/fr/admin/suppliers/table.php
        +++ b/resources/lang/fr/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'A propos des fournisseurs',
        +    'about_suppliers_text'  => 'Les fournisseurs sont utilisés pour suivre la source des articles',
             'address'               => 'Adresse du fournisseur',
             'assets'                => 'Actifs',
             'city'                  => 'Ville',
        diff --git a/resources/lang/fr/admin/users/general.php b/resources/lang/fr/admin/users/general.php
        index 136ad939a5..656e97938c 100644
        --- a/resources/lang/fr/admin/users/general.php
        +++ b/resources/lang/fr/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Actifs associés avec :name',
        +    'bulk_update_warn'	=> 'Vous êtes sur le point de modifier les propriétés de: user_count users. Veuillez noter que vous ne pouvez pas modifier vos propres attributs d\'utilisateur en utilisant ce formulaire et devez effectuer des modifications à votre propre utilisateur individuellement.',
        +    'bulk_update_help'	=> 'Ce formulaire vous permet de mettre à jour plusieurs utilisateurs à la fois. Remplissez uniquement les champs que vous devez modifier. Tous les champs laissés vides resteront inchangés.',
             'current_assets'    => 'Biens actuellement attribués à cet utilisateur',
             'clone'             => 'Cloner l\'utilisateur',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Modifier l\'utilisateur',
             'filetype_info'     => 'Types de fichier autorisés: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'Historique pour :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Dernière connexion',
             'ldap_config_text'  => 'Les paramètres de configuration LDAP se trouvent sous Admin > Réglages. La localisation sélectionnée (optionnelle) sera définie pour tous les utilisateurs importés.',
             'software_user'     => 'Logiciels associés avec :name',
             'view_user'         => 'Voir l\'utilisateur :name',
             'usercsv'           => 'Fichier CSV',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'Vos paramètres administratifs actuels permettent une application sélective de l\'authentification à deux facteurs.  ',
        +    'two_factor_enrolled' => 'Dispositif à deux facteurs inscrit ',
        +    'two_factor_active'   => 'Activation des deux facteurs ',
             );
        diff --git a/resources/lang/fr/admin/users/message.php b/resources/lang/fr/admin/users/message.php
        index 45448b57a0..bcb4fe7be5 100644
        --- a/resources/lang/fr/admin/users/message.php
        +++ b/resources/lang/fr/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Vous avez accepté cet actif.',
             'declined'                  => 'Vous avez refusé cet actif.',
        +    'bulk_manager_warn'	        => 'Vos utilisateurs ont été mis à jour avec succès, mais votre entrée de gestionnaire n\'a pas été enregistrée, car le gestionnaire que vous avez sélectionné était également dans la liste d\'utilisateurs à éditer, et les utilisateurs peuvent ne pas être leur propre gestionnaire. Sélectionnez à nouveau vos utilisateurs, à l\'exclusion du gestionnaire.',
             'user_exists'               => 'L\'utilisateur existe déjà !',
             'user_not_found'            => 'L\'utilisateur [:id] n\'existe pas.',
             'user_login_required'       => 'Le champ identifiant est obligatoire',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'L’utilisateur a été créé avec succès.',
                 'update'    => 'L’utilisateur a été mis à jour avec succès.',
        +        'update_bulk'    => 'Utilisateurs mis à jour avec succès !',
                 'delete'    => 'L’utilisateur a été supprimé avec succès.',
                 'ban'       => 'L’utilisateur a été banni avec succès.',
                 'unban'     => 'L’utilisateur a été réhabilité avec succès.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Un problème a eu lieu pendant la création de l\'utilisateur. Veuillez essayer à nouveau.',
                 'update' => 'Un problème a eu lieu pendant la mise à jour de l\'utilisateur. Veuillez essayer à nouveau.',
                 'delete' => 'Un problème a eu lieu pendant la suppression de l\'utilisateur. Veuillez essayer à nouveau.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Un problème a eu lieu pendant la réhabilitation de l\'utilisateur. Veuillez essayer à nouveau.',
                 'import'    => 'Il y a eu un problème lors de l\'importation des utilisateurs. Veuillez réessayer.',
                 'asset_already_accepted' => 'Cet actif a déjà été accepté.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Impossible de se connecter au serveur LDAP . S\'il vous plaît vérifier la configuration de votre serveur LDAP dans le fichier de configuration LDAP . <br> Erreur de serveur LDAP : ',
                 'ldap_could_not_search' => 'Impossible de rechercher le serveur LDAP . S\'il vous plaît vérifier la configuration de votre serveur LDAP dans le fichier de configuration LDAP . <br> Erreur de serveur LDAP :',
                 'ldap_could_not_get_entries' => 'Impossible d\'obtenir les entrées du serveur LDAP . S\'il vous plaît vérifier la configuration de votre serveur LDAP dans le fichier de configuration LDAP . <br> Erreur de serveur LDAP :',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/fr/admin/users/table.php b/resources/lang/fr/admin/users/table.php
        index 3e4d431351..1e11eef872 100644
        --- a/resources/lang/fr/admin/users/table.php
        +++ b/resources/lang/fr/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Actif',
             'allow'  				=> 'Autoriser',
             'checkedout'  			=> 'Actifs',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Lieu',
             'lock_passwords'		=> 'Les informations de connexion ne peuvent pas être modifiés sur cette installation .',
             'manager' 				=> 'Responsable',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nom',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirmer le mot de passe',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Afficher les utilisateurs actifs',
             'show_deleted'          => 'Afficher les utilisateurs supprimés',
             'title' 				=> 'Titre',
        +	'to_restore_them'		=> 'pour les restaurer.',
             'updateuser' 			=> 'Mettre à jour l\'utilisateur',
             'username' 				=> 'Nom d\'utilisateur',
        +	'user_deleted_text' 	=> 'Cet utilisateur a été marqué comme supprimé.',
             'username_note' 		=> '( Ceci est utilisé pour la liaison ne Active Directory , pas pour la connexion. )',
             'cloneuser'             => 'Cloner l\'utilisateur',
             'viewusers' 			=> 'Voir les utilisateurs',
        diff --git a/resources/lang/fr/auth/message.php b/resources/lang/fr/auth/message.php
        index 137fe6053e..7cd81af56b 100644
        --- a/resources/lang/fr/auth/message.php
        +++ b/resources/lang/fr/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Ce compte n\'est pas activé.',
             'account_suspended'      => 'Ce compte est suspendu.',
             'account_banned'         => 'Ce compte est banni.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Trop de tentatives de connexion échouées. S\'il vous plait réessayez à nouveau dans quelques minutes.',
         
             'signin' => array(
                 'error'   => 'Un problème a eu lieu pendant votre connexion, veuillez essayer à nouveau.',
        diff --git a/resources/lang/fr/button.php b/resources/lang/fr/button.php
        index 1edcde1546..7a7c843fb8 100644
        --- a/resources/lang/fr/button.php
        +++ b/resources/lang/fr/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Actions',
             'add'    	                => 'Ajouter',
             'cancel'                    => 'Annuler',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Requête ',
             'submit'  	                => 'Soumettre',
             'upload'                    => 'Uploader',
        -
        +	'select_file'				=> 'Sélectionner un fichier...',
         );
        diff --git a/resources/lang/fr/general.php b/resources/lang/fr/general.php
        index 20d5f349e5..694237fc34 100644
        --- a/resources/lang/fr/general.php
        +++ b/resources/lang/fr/general.php
        @@ -18,42 +18,54 @@
             'asset_report'          => 'Rapport d\'actif',
             'asset_tag'				=> 'Étiquette de l\'actif',
             'assets_available'		=> 'Actifs disponibles',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Actifs',
             'avatar_delete'         => 'Supprimer l\'Avatar',
             'avatar_upload'         => 'Charger un Avatar',
             'back'      			=> 'Retour',
             'bad_data'      		=> 'Aucun résultat, les données sont peut-être erronées?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Attribution par lot',
             'cancel'  				=> 'Annuler',
             'categories'			=> 'Catégories',
             'category'				=> 'Сatégorie',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Changer l\'adresse e-mail',
             'changepassword'  		=> 'Changer le mot de passe',
             'checkin'  				=> 'Dissocier',
             'checkin_from'  		=> 'Dissocier de',
             'checkout'  			=> 'Associer',
             'city'  				=> 'Ville',
        +	'click_here'			=> 'Cliquez ici',
             'companies'			=> 'Compagnies',
             'company'				=> 'Compagnie',
             'component'			=> 'Composant',
             'components'			=> 'Composants',
        +	'complete'				=> 'Terminé',
             'consumable'			=> 'Fourniture',
             'consumables'			=> 'Fournitures',
             'country'  				=> 'Pays',
             'create'				=> 'Créer',
        -    'created'               => 'Item Created',
        +    'created'               => 'Élément créé',
             'created_asset'			=> 'Actif créé',
             'created_at' 			=> 'Créé le',
        +    'updated_at' 			=> 'Mise à jour à',
             'currency'  			=> '€', // this is deprecated
             'current'  				=> 'Actuels',
             'custom_report'         => 'Rapport d\'actif personnalisé',
             'dashboard'				=> 'Tableau de bord',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Date',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Attention !',
        +    'debug_warning_text'         => 'Cette application fonctionne en mode de production avec le débogage activé. Cela peut exposer des données sensibles si votre application est accessible au monde extérieur. Désactivez le mode de débogage en définissant la valeur <code> APP_DEBUG </ code> dans votre fichier <code> .env </ code> sur <code> false </ code>.',
             'delete'  				=> 'Supprimer',
             'deleted'  				=> 'Supprimé',
             'delete_seats'  		=> 'Places supprimées',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Déployé',
             'depreciation_report'	=> 'Rapport d’amortissement',
             'download'				=> 'Télécharger',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Autorisations insuffisantes !',
             'language'				=> 'Langue',
             'last'					=> 'Dernier',
        +    'last_login'            => 'Dernière connexion',
             'last_name'             => 'Nom',
             'license'				=> 'Licence',
             'license_report'        => 'Rapport de licence',
        @@ -95,7 +108,7 @@
             'list_all'				=> 'Lister tout',
             'loading'				=> 'Chargement',
             'lock_passwords'        => 'Ce champ ne peut pas être modifié dans cette installation.',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'feature_disabled'      => 'Cette fonctionnalité a été désactivée pour l\'installation de démonstration.',
             'location'              => 'Lieu',
             'locations'				=> 'Lieux',
             'logout'				=> 'Se déconnecter',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Plus d\'info',
             'name'					=> 'Nom',
             'next'					=> 'Prochain',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'nouveau!',
             'no_depreciation'		=> 'Pas d\'amortissement',
             'no_results'			=> 'Pas de résultat.',
             'no'  					=> 'Non',
             'notes'  				=> 'Notes',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Numéro de commande',
             'page_menu'				=> 'Afficher_MENU_items',
             'pagination_info'		=> 'Afficher_DEBUT_à_FIN_de_TOUS_items',
             'pending'				=> 'En Attente',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Précédent',
             'processing'			=> 'En cours de traitement',
             'profile'				=> 'Votre profil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Prix d\'achat',
        +    'purchase_date'         => 'Date d\'achat',
             'qty'		            => 'QTÉ',
             'quantity'		        => 'Quantité',
             'ready_to_deploy'		=> 'Prêt à être déployé',
        @@ -138,13 +153,14 @@
             'select'				=> 'Sélectionner',
             'search'				=> 'Rechercher',
             'select_category'       => 'Choisir une catégorie',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Choisissez un type d\'amortissement',
             'select_location'		=> 'Choisissez un emplacement',
             'select_manufacturer'	=> 'Choisissez un fabricant',
             'select_model'			=> 'Choisissez un modèle',
             'select_supplier'		=> 'Choisissez un fournisseur',
             'select_user'			=> 'Choisissez un utilisateur',
        -    'select_date'			=> 'Choisissez une date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Choisissez un état',
             'select_company'    	=> 'Sélectionnez une compagnie',
             'select_asset'    		=> 'Choisir un bien',
        @@ -156,9 +172,12 @@
             'state'  				=> 'État',
             'status_labels'			=> 'Étiquette de statut',
             'status'    			=> 'Statut',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Fournisseur',
             'suppliers'  			=> 'Fournisseurs',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => 'Êtes-vous sûr de vouloir supprimer ?',
        +    'submit'				=> 'Soumettre',
        +    'target'                => 'Cible',
        +    'time_and_date_display' => 'Affichage de l\'heure et de la date',
             'total_assets'			=> 'actifs au total',
             'total_licenses'		=> 'licences au total',
             'total_accessories'		=> 'accessoires au total',
        diff --git a/resources/lang/fr/mail.php b/resources/lang/fr/mail.php
        index f00e4cbeba..b2700ef095 100644
        --- a/resources/lang/fr/mail.php
        +++ b/resources/lang/fr/mail.php
        @@ -10,44 +10,42 @@ return array(
             'asset_name' => 'Nom du produit:',
             'asset_requested' => 'Produit demandé',
             'asset_tag' => 'Code produit:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        +    'assets_warrantee_expiring' => '{1} actif avec une garantie expirant dans les 60 prochains jours. |[2,Inf] actifs avec des garanties expirant dans les 60 prochains jours.',
             'assigned_to' => 'Affecté à',
             'best_regards' => 'Cordialement,',
             'canceled' => 'Annulé:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        +    'checkin_date' => 'Date d\'association :',
        +    'checkout_date' => 'Date de dissociation :',
             'click_to_confirm' => 'Veuillez cliquer sur le lien suivant pour confirmer votre :web account:',
             'click_on_the_link_accessory' => 'Merci de cliquer sur le lien ci-dessous pour confirmer la bonne réception de l\'accessoire.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        +    'click_on_the_link_asset' => 'Cliquez sur le lien ci-dessous pour confirmer que vous avez reçu l\'actif.',
        +    'Confirm_Asset_Checkin' => 'Confirmer l\'association de l\'actif.',
        +    'Confirm_Accessory_Checkin' => 'Confirmer l\'association de l\'accessoire.',
             'Confirm_accessory_delivery' => 'Confirmer la livraison de l\'accessoire.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        +    'Confirm_asset_delivery' => 'Confirmer la livraison de l\'actif.',
             'Confirm_consumable_delivery' => 'Confirmer la livraison du consommable.',
             'current_QTY' => 'Quantité actuelle',
             'Days' => 'Jours',
             'days' => 'jours',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        +    'expecting_checkin_date' => 'Date d\'association prévue :',
             'expires' => 'Expire le',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        +    'Expiring_Assets_Report' => 'Rapport d\'expiration des actifs.',
        +    'Expiring_Licenses_Report' => 'Rapport d\'expiration des licences.',
             'hello' => 'Bonjour',
             'hi' => 'Salut',
             'i_have_read' => 'J\'ai bien lu et approuvé les conditions d\'utilisation, et reçu cet objet.',
             'item' => 'Article :',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        +    'items_below_minimum' => '{1} élément qui est inférieur à l\'inventaire minimum ou sera bientôt bas. |[2, Inf] éléments inférieurs à l\'inventaire minimum ou seront bientôt bas.',
        +    'Item_Request_Canceled' => 'Demande d\'article annulée',
        +    'Item_Requested' => 'Demande d\'article',
        +    'licenses_expiring' => '{1} licence expirant dans les 60 prochaines jours. |[2,Inf] licences expirant dans les 60 prochains jours.',
             'link_to_update_password' => 'Veuillez cliquer sur le lien suivant pour confirmer votre :web account:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'login_first_admin' => 'Connectez-vous à votre nouvelle installation Snipe-IT en utilisant les informations d\'identification ci-dessous :',
             'login' => 'Nom d\'utilisateur:',
             'Low_Inventory_Report' => 'Rapport d’inventaire bas',
             'min_QTY' => 'Quantité minimum',
             'name' => 'Nom',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        +    'new_item_checked' => 'Un nouvel élément a été vérifié sous votre nom, les détails sont ci-dessous.',
             'password' => 'Mot de passe:',
             'password_reset' => 'Réinitialisation du mot de passe',
         
        @@ -58,11 +56,11 @@ return array(
             'reset_password' => 'Cliquez ici pour réinitialiser votre mot de passe:',
             'serial' => 'N° de série :',
             'supplier' => 'Fournisseur',
        -    'tag' => 'Tag',
        +    'tag' => 'Étiquette',
             'test_email' => 'Email test de Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        +    'test_mail_text' => 'Il s\'agit d\'un test du système de gestion d\'actifs Snipe-IT. Si vous avez obtenu cela, le courrier fonctionne :)',
        +    'the_following_item' => 'L\'élément suivant a été enregistré : ',
        +    'There_are' => '{1} Il y a |[2,Inf] Il y a',
             'to_reset' => 'Pour réinitialiser votre mot de passe :web, complétez ce formulaire:',
             'type' => 'Type ',
             'user' => 'Utilisateur :',
        diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php
        index f01a11b478..7b1993377e 100644
        --- a/resources/lang/fr/validation.php
        +++ b/resources/lang/fr/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "L'attribut \":attribute\" doit être accepté.",
        -    "active_url"       => "L'attribut \":attribute\" n'est pas une URL valide.",
        -    "after"            => "L'attribut \":attribute\" doit être une date après :date.",
        -    "alpha"            => "L'attribut \":attribute\" ne peut contenir que des lettres.",
        -    "alpha_dash"       => "L'attribut \":attribute\" ne peut contenir que des lettres, des nombres, et des tirets.",
        -    "alpha_num"        => "L'attribut \":attribute\" ne peut contenir que des caractères alphanumériques.",
        -    "before"           => "L'attribut \":attribute\" doit être une date avant :date.",
        -    "between"          => array(
        -        "numeric" => "L'attribut \":attribute\" doit être entre :min et :max.",
        -        "file"    => "L'attribut \":attribute\" doit être entre :min et :max kilo-octets.",
        -        "string"  => "L'attribut \":attribute\" doit contenir entre :min et :max caractères.",
        -    ),
        -    "confirmed"        => "La confirmation et l'attribut \":attribute\" ne concordent pas.",
        -    "date"             => "L'attribut \":attribute\" n'est pas une date valide.",
        -    "date_format"      => "L'attribut \":attribute\" ne respecte pas le format \":format\".",
        -    "different"        => "L'attribut \":attribute\" et l'attribut \":other\" doivent être différents.",
        -    "digits"           => "L'attribut \":attribute\" doit contenir :digits chiffres.",
        -    "digits_between"   => "L'attribut \":attribute\" doit contenir entre :min et :max chiffres.",
        -    "email"            => "Le format de l'attribut \":attribute\" est invalide.",
        -    "exists"           => "L'attribut \":attribute\" est invalide.",
        -    "email_array"      => "Une ou plusieurs adresses e-mail sont invalides.",
        -    "image"            => "L'attribut \":attribute\" doit être une image.",
        -    "in"               => "Le :attribute selectionné est invalide.",
        -    "integer"          => "L'attribut \":attribute\" doit être un nombre entier.",
        -    "ip"               => "L'attribut \":attribute\" doit être une adresse IP valide.",
        -    "max"              => array(
        -        "numeric" => "L'attribut \":attribute\" ne peut pas être plus grand que :max.",
        -        "file"    => "L'attribut \":attribute\" ne doit pas dépasser :max kilo-octets.",
        -        "string"  => "L'attribut \":attribute\" ne doit pas faire plus de :max caractères.",
        -    ),
        -    "mimes"            => "Le fichier :attribute doit être de type :values.",
        -    "min"              => array(
        -        "numeric" => "L'attribut \":attribute\" doit être au moins :min.",
        -        "file"    => "L'attribut \":attribute\" doit faire au moins :min kilo-octets.",
        -        "string"  => "L'attribut \":attribute\" doit faire au moins :min caractères.",
        -    ),
        -    "not_in"           => "L'attribut \":attribute\" est invalide.",
        -    "numeric"          => "L'attribut \":attribute\" doit être un nombre.",
        -    "regex"            => "Le format de l'attribut \":attribute\" est invalide.",
        -    "required"         => "Le champs :attribute est nécessaire.",
        -    "required_if"      => "Le champ :attribute est nécessaire quand :other vaut :value.",
        -    "required_with"    => "Le champ :attribute est nécessaire quand :values est présent.",
        -    "required_without" => "Le champ :attribute est nécessaire quand :values n'est pas présent.",
        -    "same"             => "L'attribut \":attribute\" et :other doivent correspondre.",
        -    "size"             => array(
        -        "numeric" => "L'attribut \":attribute\" doit faire :size.",
        -        "file"    => "L'attribut \":attribute\" doit faire :size kilo-octets.",
        -        "string"  => "L'attribut \":attribute\" doit faire :size caractères.",
        -    ),
        -    "unique"           => "Cet-te :attribute a déjà été pris-e.",
        -    "url"              => "Le format de cet-te :attribute est invalide.",
        -    "statuslabel_type" => "Vous devez sélectionner un type d'étiquette de statut valide",
        -    "unique_undeleted" => "L'attribut :attribute doit être unique.",
        +    'accepted'             => 'L\'attribut ":attribute" doit être accepté.',
        +    'active_url'           => 'L\'attribut ":attribute" n\'est pas une URL valide.',
        +    'after'                => 'L\'attribut ":attribute" doit être une date après :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'L\'attribut ":attribute" ne peut contenir que des lettres.',
        +    'alpha_dash'           => 'L\'attribut ":attribute" ne peut contenir que des lettres, des nombres, et des tirets.',
        +    'alpha_num'            => 'L\'attribut ":attribute" ne peut contenir que des caractères alphanumériques.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'L\'attribut ":attribute" doit être une date avant :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'L\'attribut ":attribute" doit être entre :min et :max.',
        +        'file'    => 'L\'attribut ":attribute" doit être entre :min et :max kilo-octets.',
        +        'string'  => 'L\'attribut ":attribute" doit contenir entre :min et :max caractères.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'L\'attribut : doit être vrai ou faux.',
        +    'confirmed'            => 'La confirmation et l\'attribut ":attribute" ne concordent pas.',
        +    'date'                 => 'L\'attribut ":attribute" n\'est pas une date valide.',
        +    'date_format'          => 'L\'attribut ":attribute" ne respecte pas le format ":format".',
        +    'different'            => 'L\'attribut ":attribute" et l\'attribut ":other" doivent être différents.',
        +    'digits'               => 'L\'attribut ":attribute" doit contenir :digits chiffres.',
        +    'digits_between'       => 'L\'attribut ":attribute" doit contenir entre :min et :max chiffres.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Le format de l\'attribut ":attribute" est invalide.',
        +    'exists'               => 'L\'attribut ":attribute" est invalide.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'L\'attribut ":attribute" doit être une image.',
        +    'in'                   => 'Le :attribute selectionné est invalide.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'L\'attribut ":attribute" doit être un nombre entier.',
        +    'ip'                   => 'L\'attribut ":attribute" doit être une adresse IP valide.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'L\'attribut ":attribute" ne peut pas être plus grand que :max.',
        +        'file'    => 'L\'attribut ":attribute" ne doit pas dépasser :max kilo-octets.',
        +        'string'  => 'L\'attribut ":attribute" ne doit pas faire plus de :max caractères.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'Le fichier :attribute doit être de type :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'L\'attribut ":attribute" doit être au moins :min.',
        +        'file'    => 'L\'attribut ":attribute" doit faire au moins :min kilo-octets.',
        +        'string'  => 'L\'attribut ":attribute" doit faire au moins :min caractères.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'L\'attribut ":attribute" est invalide.',
        +    'numeric'              => 'L\'attribut ":attribute" doit être un nombre.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Le format de l\'attribut ":attribute" est invalide.',
        +    'required'             => 'Le champs :attribute est nécessaire.',
        +    'required_if'          => 'Le champ :attribute est nécessaire quand :other vaut :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Le champ :attribute est nécessaire quand :values est présent.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Le champ :attribute est nécessaire quand :values n\'est pas présent.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'L\'attribut ":attribute" et :other doivent correspondre.',
        +    'size'                 => [
        +        'numeric' => 'L\'attribut ":attribute" doit faire :size.',
        +        'file'    => 'L\'attribut ":attribute" doit faire :size kilo-octets.',
        +        'string'  => 'L\'attribut ":attribute" doit faire :size caractères.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'Cet-te :attribute a déjà été pris-e.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Le format de cet-te :attribute est invalide.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "L'attribut \":attribute\" contient un caractère invalide.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/he/admin/asset_maintenances/message.php b/resources/lang/he/admin/asset_maintenances/message.php
        index 3533866621..5329e65b0e 100644
        --- a/resources/lang/he/admin/asset_maintenances/message.php
        +++ b/resources/lang/he/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Asset Maintenance was not created, please try again.',
                     'success' => 'Asset Maintenance created successfully.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Not Completed Yet',
                 'warranty'                     => 'אחריות',
                 'not_warranty'                 => 'ללא אחריות',
        diff --git a/resources/lang/he/admin/categories/general.php b/resources/lang/he/admin/categories/general.php
        index 380cd50be4..8e5683d0b4 100644
        --- a/resources/lang/he/admin/categories/general.php
        +++ b/resources/lang/he/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Edit Category',
             'eula_text'							=> 'Category EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
        diff --git a/resources/lang/he/admin/custom_fields/message.php b/resources/lang/he/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/he/admin/custom_fields/message.php
        +++ b/resources/lang/he/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/he/admin/departments/message.php b/resources/lang/he/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/he/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/he/admin/departments/table.php b/resources/lang/he/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/he/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/he/admin/hardware/general.php b/resources/lang/he/admin/hardware/general.php
        index f7644eb730..1def86dc9e 100644
        --- a/resources/lang/he/admin/hardware/general.php
        +++ b/resources/lang/he/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clone Asset',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/he/admin/hardware/message.php b/resources/lang/he/admin/hardware/message.php
        index d27ca91573..112cf77ded 100644
        --- a/resources/lang/he/admin/hardware/message.php
        +++ b/resources/lang/he/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/he/admin/locations/table.php b/resources/lang/he/admin/locations/table.php
        index e171d4dd4e..ffa69307d5 100644
        --- a/resources/lang/he/admin/locations/table.php
        +++ b/resources/lang/he/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locations',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/he/admin/manufacturers/table.php b/resources/lang/he/admin/manufacturers/table.php
        index f66320fe8d..4e3ea9904d 100644
        --- a/resources/lang/he/admin/manufacturers/table.php
        +++ b/resources/lang/he/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Asset Manufacturers',
             'create'				=> 'Create Manufacturer',
             'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/he/admin/models/message.php b/resources/lang/he/admin/models/message.php
        index fe51cb8d4c..5b1b9a1a1b 100644
        --- a/resources/lang/he/admin/models/message.php
        +++ b/resources/lang/he/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/he/admin/settings/general.php b/resources/lang/he/admin/settings/general.php
        index 1a6b2d4797..73fd052a58 100644
        --- a/resources/lang/he/admin/settings/general.php
        +++ b/resources/lang/he/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/he/admin/users/general.php b/resources/lang/he/admin/users/general.php
        index 92ee04b491..985138d065 100644
        --- a/resources/lang/he/admin/users/general.php
        +++ b/resources/lang/he/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Clone User',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Edit User',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Last Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        diff --git a/resources/lang/he/admin/users/message.php b/resources/lang/he/admin/users/message.php
        index a1a9757e86..8ee552afab 100644
        --- a/resources/lang/he/admin/users/message.php
        +++ b/resources/lang/he/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'User already exists!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'User was successfully deleted.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/he/admin/users/table.php b/resources/lang/he/admin/users/table.php
        index 8c9b40a454..9bbe883e19 100644
        --- a/resources/lang/he/admin/users/table.php
        +++ b/resources/lang/he/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Active',
             'allow'  				=> 'Allow',
             'checkedout'  			=> 'Assets',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Location',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Name',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirm Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Update User',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Clone User',
             'viewusers' 			=> 'View Users',
        diff --git a/resources/lang/he/auth/message.php b/resources/lang/he/auth/message.php
        index 3aee689e54..bebf9cdd48 100644
        --- a/resources/lang/he/auth/message.php
        +++ b/resources/lang/he/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'This user account is not activated.',
             'account_suspended'      => 'This user account is suspended.',
             'account_banned'         => 'This user account is banned.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'There was a problem while trying to log you in, please try again.',
        diff --git a/resources/lang/he/button.php b/resources/lang/he/button.php
        index 14aedbf0fe..6964689762 100644
        --- a/resources/lang/he/button.php
        +++ b/resources/lang/he/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Actions',
             'add'    	                => 'Add New',
             'cancel'                    => 'Cancel',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Submit',
             'upload'                    => 'Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/he/general.php b/resources/lang/he/general.php
        index 16c38b1721..eb6409ddbb 100644
        --- a/resources/lang/he/general.php
        +++ b/resources/lang/he/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Asset Report',
             'asset_tag'				=> 'Asset Tag',
             'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Assets',
             'avatar_delete'         => 'Delete Avatar',
             'avatar_upload'         => 'Upload Avatar',
             'back'      			=> 'Back',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Cancel',
             'categories'			=> 'Categories',
             'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Change Email Address',
             'changepassword'  		=> 'Change Password',
             'checkin'  				=> 'Checkin',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Checkout',
             'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Country',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'created asset',
             'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Current',
             'custom_report'         => 'Custom Asset Report',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Date',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Delete',
             'deleted'  				=> 'Deleted',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Deployed',
             'depreciation_report'	=> 'Depreciation Report',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Last Name',
             'license'				=> 'License',
             'license_report'        => 'License Report',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'More Info',
             'name'					=> 'Name',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'No Depreciation',
             'no_results'			=> 'No Results.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'total assets',
             'total_licenses'		=> 'total licenses',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/he/validation.php b/resources/lang/he/validation.php
        index 03c7471cab..02cb1fa981 100644
        --- a/resources/lang/he/validation.php
        +++ b/resources/lang/he/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/hr/admin/asset_maintenances/message.php b/resources/lang/hr/admin/asset_maintenances/message.php
        index ca4256efbe..d121115825 100644
        --- a/resources/lang/hr/admin/asset_maintenances/message.php
        +++ b/resources/lang/hr/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Asset Maintenance was not created, please try again.',
                     'success' => 'Asset Maintenance created successfully.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Not Completed Yet',
                 'warranty'                     => 'Warranty',
                 'not_warranty'                 => 'Not Warranty',
        diff --git a/resources/lang/hr/admin/categories/general.php b/resources/lang/hr/admin/categories/general.php
        index 2a00f82a67..16b3b79f51 100644
        --- a/resources/lang/hr/admin/categories/general.php
        +++ b/resources/lang/hr/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Edit Category',
             'eula_text'							=> 'Category EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
        diff --git a/resources/lang/hr/admin/custom_fields/message.php b/resources/lang/hr/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/hr/admin/custom_fields/message.php
        +++ b/resources/lang/hr/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/hr/admin/departments/message.php b/resources/lang/hr/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/hr/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/hr/admin/departments/table.php b/resources/lang/hr/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/hr/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/hr/admin/hardware/general.php b/resources/lang/hr/admin/hardware/general.php
        index f7644eb730..1def86dc9e 100644
        --- a/resources/lang/hr/admin/hardware/general.php
        +++ b/resources/lang/hr/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clone Asset',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/hr/admin/hardware/message.php b/resources/lang/hr/admin/hardware/message.php
        index d27ca91573..112cf77ded 100644
        --- a/resources/lang/hr/admin/hardware/message.php
        +++ b/resources/lang/hr/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/hr/admin/locations/table.php b/resources/lang/hr/admin/locations/table.php
        index e171d4dd4e..ffa69307d5 100644
        --- a/resources/lang/hr/admin/locations/table.php
        +++ b/resources/lang/hr/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locations',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/hr/admin/manufacturers/table.php b/resources/lang/hr/admin/manufacturers/table.php
        index f66320fe8d..4e3ea9904d 100644
        --- a/resources/lang/hr/admin/manufacturers/table.php
        +++ b/resources/lang/hr/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Asset Manufacturers',
             'create'				=> 'Create Manufacturer',
             'id'   					=> 'ID',
        -    'name'      			=> 'Manufacturer Name',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/hr/admin/models/message.php b/resources/lang/hr/admin/models/message.php
        index fe51cb8d4c..5b1b9a1a1b 100644
        --- a/resources/lang/hr/admin/models/message.php
        +++ b/resources/lang/hr/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/hr/admin/settings/general.php b/resources/lang/hr/admin/settings/general.php
        index 1a6b2d4797..73fd052a58 100644
        --- a/resources/lang/hr/admin/settings/general.php
        +++ b/resources/lang/hr/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/hr/admin/users/general.php b/resources/lang/hr/admin/users/general.php
        index 92ee04b491..985138d065 100644
        --- a/resources/lang/hr/admin/users/general.php
        +++ b/resources/lang/hr/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Clone User',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Edit User',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Last Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        diff --git a/resources/lang/hr/admin/users/message.php b/resources/lang/hr/admin/users/message.php
        index a1a9757e86..8ee552afab 100644
        --- a/resources/lang/hr/admin/users/message.php
        +++ b/resources/lang/hr/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'User already exists!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'User was successfully deleted.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/hr/admin/users/table.php b/resources/lang/hr/admin/users/table.php
        index 8c9b40a454..9bbe883e19 100644
        --- a/resources/lang/hr/admin/users/table.php
        +++ b/resources/lang/hr/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Active',
             'allow'  				=> 'Allow',
             'checkedout'  			=> 'Assets',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Location',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Name',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirm Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Update User',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Clone User',
             'viewusers' 			=> 'View Users',
        diff --git a/resources/lang/hr/auth/message.php b/resources/lang/hr/auth/message.php
        index 3aee689e54..bebf9cdd48 100644
        --- a/resources/lang/hr/auth/message.php
        +++ b/resources/lang/hr/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'This user account is not activated.',
             'account_suspended'      => 'This user account is suspended.',
             'account_banned'         => 'This user account is banned.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'There was a problem while trying to log you in, please try again.',
        diff --git a/resources/lang/hr/button.php b/resources/lang/hr/button.php
        index 14aedbf0fe..6964689762 100644
        --- a/resources/lang/hr/button.php
        +++ b/resources/lang/hr/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Actions',
             'add'    	                => 'Add New',
             'cancel'                    => 'Cancel',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Submit',
             'upload'                    => 'Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/hr/general.php b/resources/lang/hr/general.php
        index 16c38b1721..eb6409ddbb 100644
        --- a/resources/lang/hr/general.php
        +++ b/resources/lang/hr/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Asset Report',
             'asset_tag'				=> 'Asset Tag',
             'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Assets',
             'avatar_delete'         => 'Delete Avatar',
             'avatar_upload'         => 'Upload Avatar',
             'back'      			=> 'Back',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Cancel',
             'categories'			=> 'Categories',
             'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Change Email Address',
             'changepassword'  		=> 'Change Password',
             'checkin'  				=> 'Checkin',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Checkout',
             'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Country',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'created asset',
             'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Current',
             'custom_report'         => 'Custom Asset Report',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Date',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Delete',
             'deleted'  				=> 'Deleted',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Deployed',
             'depreciation_report'	=> 'Depreciation Report',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Last Name',
             'license'				=> 'License',
             'license_report'        => 'License Report',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'More Info',
             'name'					=> 'Name',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'No Depreciation',
             'no_results'			=> 'No Results.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'total assets',
             'total_licenses'		=> 'total licenses',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/hr/validation.php b/resources/lang/hr/validation.php
        index 30119f4c3f..770909373e 100644
        --- a/resources/lang/hr/validation.php
        +++ b/resources/lang/hr/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute mora biti prihvaćen.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute mora biti prihvaćen.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/hu/admin/asset_maintenances/message.php b/resources/lang/hu/admin/asset_maintenances/message.php
        index def5d5bb21..a98111cb2d 100644
        --- a/resources/lang/hu/admin/asset_maintenances/message.php
        +++ b/resources/lang/hu/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Eszköz karbantartás nem jött létre, próbálja meg újra.',
                     'success' => 'Eszköz karbantartás sikeresen létrejött.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Nincs kitöltve teljesen',
                 'warranty'                     => 'Garancia',
                 'not_warranty'                 => 'Nem garancia',
        diff --git a/resources/lang/hu/admin/asset_maintenances/table.php b/resources/lang/hu/admin/asset_maintenances/table.php
        index cbdfb14ba5..304d2d9b9c 100644
        --- a/resources/lang/hu/admin/asset_maintenances/table.php
        +++ b/resources/lang/hu/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Eszköz karbantartások',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Eszköz neve',
                 'is_warranty'   => 'Garancia',
                 'dl_csv'        => 'CSV letöltése'
             ];
        diff --git a/resources/lang/hu/admin/categories/general.php b/resources/lang/hu/admin/categories/general.php
        index 1e0ed689ca..0eccafc90a 100644
        --- a/resources/lang/hu/admin/categories/general.php
        +++ b/resources/lang/hu/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'A kategóriákról',
        +    'about_categories'  				=> 'A kategóriák segítenek rendezni a dolgait. Néhány példa kategória lehet "Desktop-ok", "Laptopok", "Mobiltelefonok", "Tabletek", és így tovább, de bármilyen más kategóriát használhat, ami releváns önnek.',
             'asset_categories' 					=> 'Eszköz kategóriák',
             'category_name'  					=> 'Kategória név',
             'checkin_email'                     => 'Küldj a felhasználónak e-mailt, leadáskor.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Kategória szerkesztése',
             'eula_text'							=> 'Felhasználói engedély Kategória',
             'eula_text_help'					=> 'Ezzel a mezővel testre szabhatja a különböző eszközök EULA-ját. Ha csak egy EULA van az összes eszközhöz, akkor jelölje be a négyzetet lent, hogy az alapértelmezettet használja.',
        +    'name'                              => 'Kategória neve',
             'require_acceptance'				=> 'A felhasználónak kötelező elfogadnia az eszköz(ök) átvételét ebben a kategóriában.',
             'required_acceptance'				=> 'Ennek a felhasználónak küldünk egy elfogadó linket e-mailben.',
             'required_eula'						=> 'Ennek a felhasználónak küldünk egy elfogadó linket e-mailben.',
        diff --git a/resources/lang/hu/admin/companies/general.php b/resources/lang/hu/admin/companies/general.php
        index 23e08c2673..f8536f43da 100644
        --- a/resources/lang/hu/admin/companies/general.php
        +++ b/resources/lang/hu/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'A vállalatokról',
        +    'about_companies_text'                  => 'A vállalatok használhatóak egyszerű azonosító mezőként, vagy az eszközök, felhasználók, stb. láthatóságának korlátozására, ha a teljes vállalati támogatás engedélyezve van az Admin beállításokban.',
             'select_company' => 'Vállalat kiválasztása',
         ];
        diff --git a/resources/lang/hu/admin/custom_fields/general.php b/resources/lang/hu/admin/custom_fields/general.php
        index d28ffda739..e536bf4b24 100644
        --- a/resources/lang/hu/admin/custom_fields/general.php
        +++ b/resources/lang/hu/admin/custom_fields/general.php
        @@ -6,8 +6,8 @@ return array(
             'about_fieldsets_title'		=> 'A mezőcsoportokról',
             'about_fieldsets_text'		=> 'A mezőcsoportokkal tudsz létrehozni olyan gyakran használt egyedi mezőket csoportosító speciális eszköz modell típusokat.',
             'custom_format'             => 'Egyéni formátum...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        +    'encrypt_field'      	        => 'A mező értékének titkosítása az adatbázisban',
        +    'encrypt_field_help'      => 'Figyelmeztetés: egy mező titkosítása kereshetetlenné teszi azt.',
             'encrypted'      	        => 'Titkosított',
             'fieldset'      	        => 'Mezőcsoportok',
             'qty_fields'      	      => 'Mennyiségi mezők',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Mezőcsoport neve',
             'field_name'              => 'Mező neve',
             'field_values'            => 'Mező értékei',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Adjon hozzá választási lehetőségeket, soronként egyet. Az első soron kívüli üres sorokat figyelmen kívül hagyjuk.',
             'field_element'           => 'Ürlap elem',
             'field_element_short'     => 'Elem',
             'field_format'            => 'Formátum',
        @@ -26,5 +26,5 @@ return array(
             'order'   		            => 'Rendelés',
             'create_fieldset'         => 'Új mezőcsoportok',
             'create_field'            => 'Új egyéni mező',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'value_encrypted'      	        => 'A mező értéke titkosítva van az adatbázisban. Csak az adminisztrátor felhasználók láthatják a dekódolt értéket',
         );
        diff --git a/resources/lang/hu/admin/custom_fields/message.php b/resources/lang/hu/admin/custom_fields/message.php
        index 70b5ad86d6..be6b4ee067 100644
        --- a/resources/lang/hu/admin/custom_fields/message.php
        +++ b/resources/lang/hu/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'A mezőcsoport nem lett létrehozva, próbálkozz újra.',
        diff --git a/resources/lang/hu/admin/departments/message.php b/resources/lang/hu/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/hu/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/hu/admin/departments/table.php b/resources/lang/hu/admin/departments/table.php
        new file mode 100644
        index 0000000000..ca55ecba07
        --- /dev/null
        +++ b/resources/lang/hu/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Osztály neve',
        +    'manager'                   => 'Vezető',
        +    'location'                  => 'Helyszín',
        +    'create'                    => 'Osztály létrehozása',
        +    'update'                    => 'Osztály frissítése',
        +    );
        diff --git a/resources/lang/hu/admin/depreciations/general.php b/resources/lang/hu/admin/depreciations/general.php
        index 97ac18af6c..911792cb38 100644
        --- a/resources/lang/hu/admin/depreciations/general.php
        +++ b/resources/lang/hu/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Eszköz értékcsökkentésekről',
             'about_depreciations'  					=> 'Beállíthat az eszközökhöz, eszköz alapú lineáris értékcsökkentést.',
             'asset_depreciations'  					=> 'Eszköz értékcsökkenések',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Értékcsökkenés létrehozása',
             'depreciation_name'  					=> 'Értékcsökkenés neve',
             'number_of_months'  					=> 'Hónapok száma',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Értékcsökkenés frissítése',
         
         );
        diff --git a/resources/lang/hu/admin/hardware/general.php b/resources/lang/hu/admin/hardware/general.php
        index 36129e3cfd..c77f2829cd 100644
        --- a/resources/lang/hu/admin/hardware/general.php
        +++ b/resources/lang/hu/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Eszköz',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Eszköz visszavétele',
        -    'checkout'  				=> 'Eszköz kiadása felhasználónak',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Eszköz klónozása',
             'deployable'  				=> 'Kiadható',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/hu/admin/hardware/message.php b/resources/lang/hu/admin/hardware/message.php
        index 78134779a3..fa77fc6d06 100644
        --- a/resources/lang/hu/admin/hardware/message.php
        +++ b/resources/lang/hu/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/hu/admin/locations/table.php b/resources/lang/hu/admin/locations/table.php
        index 90e007f292..bdc6f9972d 100644
        --- a/resources/lang/hu/admin/locations/table.php
        +++ b/resources/lang/hu/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Helyek',
             'parent'                    => 'Szülő',
             'currency'                  => 'Helyi valuta',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/hu/admin/manufacturers/table.php b/resources/lang/hu/admin/manufacturers/table.php
        index 5a10eb405e..89afe164b8 100644
        --- a/resources/lang/hu/admin/manufacturers/table.php
        +++ b/resources/lang/hu/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Eszköz gyártoi',
             'create'				=> 'Gyártó lértehozása',
             'id'   					=> 'ID',
        -    'name'      			=> 'Gyártó neve',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Gyártó frissítése',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/hu/admin/models/message.php b/resources/lang/hu/admin/models/message.php
        index 0485777855..24377fc85e 100644
        --- a/resources/lang/hu/admin/models/message.php
        +++ b/resources/lang/hu/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/hu/admin/settings/general.php b/resources/lang/hu/admin/settings/general.php
        index d6764ffcb5..28bcb56ed3 100644
        --- a/resources/lang/hu/admin/settings/general.php
        +++ b/resources/lang/hu/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Eszköz ID',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/hu/admin/users/general.php b/resources/lang/hu/admin/users/general.php
        index 20a11fab6b..b090b55499 100644
        --- a/resources/lang/hu/admin/users/general.php
        +++ b/resources/lang/hu/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Eszköz(ök) hozzárendelve: :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Az eszköz jelenleg ki van adva ennek a felhasználónak',
             'clone'             => 'Felhasználó másolása',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Felhasználó szerkesztése',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Last Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        diff --git a/resources/lang/hu/admin/users/message.php b/resources/lang/hu/admin/users/message.php
        index 770c7e2f24..7a5b0fb784 100644
        --- a/resources/lang/hu/admin/users/message.php
        +++ b/resources/lang/hu/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Ön sikeresen elfogadta ezt az eszközt.',
             'declined'                  => 'Az eszközt sikeresen csökkentetted.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Felhasználó már létezik!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'A felhasználó módosítása sikeresen megtörtént.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'A felhasználó törlése sikeresen megtörtént.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/hu/admin/users/table.php b/resources/lang/hu/admin/users/table.php
        index cab22e41fd..e45e3c55cd 100644
        --- a/resources/lang/hu/admin/users/table.php
        +++ b/resources/lang/hu/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktív',
             'allow'  				=> 'Engedélyezés',
             'checkedout'  			=> 'Eszközök',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Helyszín',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Felettes',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Név',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Jelszó megerősítése',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Update User',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Clone User',
             'viewusers' 			=> 'View Users',
        diff --git a/resources/lang/hu/auth/message.php b/resources/lang/hu/auth/message.php
        index 48d49452d4..d52eb51d53 100644
        --- a/resources/lang/hu/auth/message.php
        +++ b/resources/lang/hu/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Ez a felhasználó nincs aktiválva.',
             'account_suspended'      => 'Ez a felhasználói fiók fel van függesztve.',
             'account_banned'         => 'Ez a felhasználó ki van tiltva.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Bejelentkezés közben probléma lépett fel, kérjük próbálja újra.',
        diff --git a/resources/lang/hu/button.php b/resources/lang/hu/button.php
        index 3ce0bda3ef..fa11081821 100644
        --- a/resources/lang/hu/button.php
        +++ b/resources/lang/hu/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Műveletek',
             'add'    	                => 'Új hozzáadása',
             'cancel'                    => 'Vissza',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Kérelem',
             'submit'  	                => 'Küldés',
             'upload'                    => 'Feltöltés',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/hu/general.php b/resources/lang/hu/general.php
        index 72aa178752..e9339c4e1b 100644
        --- a/resources/lang/hu/general.php
        +++ b/resources/lang/hu/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Eszköz riport',
             'asset_tag'				=> 'Eszköz azonosító',
             'assets_available'		=> 'elérhető eszközök',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Eszközök',
             'avatar_delete'         => 'Avatar törlése',
             'avatar_upload'         => 'Avatar frissítése',
             'back'      			=> 'Vissza',
             'bad_data'      		=> 'Nincs találat. Talán rossz adat?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Mégse',
             'categories'			=> 'Kategóriák',
             'category'				=> 'Kategória',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'E-mail cím módosítása',
             'changepassword'  		=> 'Jelszó módosítása',
             'checkin'  				=> 'Kiadás',
             'checkin_from'  		=> 'Kiadás innen',
             'checkout'  			=> 'Kiadás',
             'city'  				=> 'Város',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Cégek',
             'company'				=> 'Cég',
             'component'			=> 'Alkatrész',
             'components'			=> 'Alkatrészek',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Fogyóeszköz',
             'consumables'			=> 'Fogyóeszközök',
             'country'  				=> 'Ország',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'létrehozott eszköz',
             'created_at' 			=> 'Létrehozva',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> 'HUF', // this is deprecated
             'current'  				=> 'Aktuális',
             'custom_report'         => 'Egyedi eszköz riport',
             'dashboard'				=> 'Irányítópult',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Dátum',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Törlés',
             'deleted'  				=> 'Törölve',
             'delete_seats'  		=> 'Törölt elemek',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Telepített',
             'depreciation_report'	=> 'Értékcsökkenés riport',
             'download'				=> 'Letöltés',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Elégtelen engedély!',
             'language'				=> 'Nyelv',
             'last'					=> 'Legutóbbi',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Vezetéknév',
             'license'				=> 'Licensz',
             'license_report'        => 'Licensz riport',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'További információ',
             'name'					=> 'Név',
             'next'					=> 'Tovább',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'Nincs értékcsökkentés',
             'no_results'			=> 'Nincs találat.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Választ',
             'search'				=> 'Keresés',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Válasszon ki egy értékcsökkenési típust',
             'select_location'		=> 'Válasszon egy helyet',
             'select_manufacturer'	=> 'Válassza ki a gyártót',
             'select_model'			=> 'Válasszon ki egy modellt',
             'select_supplier'		=> 'Válassza ki a szállítót',
             'select_user'			=> 'Válasszon felhasználót',
        -    'select_date'			=> 'Dátum kiválasztása',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Státusz kiválasztása',
             'select_company'    	=> 'Vállalat kiválasztása',
             'select_asset'    		=> 'Válassza ki az eszköz',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Állapot',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Beszállítók',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'eszköz összesen',
             'total_licenses'		=> 'licensz összesen',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/hu/passwords.php b/resources/lang/hu/passwords.php
        index 5195a9b77c..028619a02c 100644
        --- a/resources/lang/hu/passwords.php
        +++ b/resources/lang/hu/passwords.php
        @@ -1,7 +1,7 @@
         <?php
         
         return [
        -    'sent'	        => 'Your password link has been sent!',
        -    'user'			=> 'That user does not exist or does not have an email address associated',
        +    'sent'	        => 'A jelszó linket elküldtük!',
        +    'user'			=> 'A felhasználó nem létezik, vagy nincs hozzárendelt e-mail cím',
         ];
         
        diff --git a/resources/lang/hu/validation.php b/resources/lang/hu/validation.php
        index 6a0ea1645b..22ff6358f7 100644
        --- a/resources/lang/hu/validation.php
        +++ b/resources/lang/hu/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "A :attribute el kell fogadni.",
        -    "active_url"       => "A :attribute nem valós URL.",
        -    "after"            => "Az :attribute ezután a dátum után kell, hogy legyen :date.",
        -    "alpha"            => "A :attribute csak betűket tartalmazhat.",
        -    "alpha_dash"       => "A :attribute csak betűket, számokat és perjelet tartalmazhat.",
        -    "alpha_num"        => "A :attribute csak betűket, számokat tartalmazhat.",
        -    "before"           => "A :attribute csak :date elötti dátum lehet.",
        -    "between"          => array(
        -        "numeric" => "A :attribute az érték között kell lennie :min -:max.",
        -        "file"    => "A :attribute :min - :max kilobájt között kell lenni.",
        -        "string"  => "A :attribute :min - :max karakter között kell lenni.",
        -    ),
        -    "confirmed"        => "A :attribute ellenörzés nem egyezik.",
        -    "date"             => "A :attribute nem egy valós dátum.",
        -    "date_format"      => "A :attribute nem egyezik a formátummal :format.",
        -    "different"        => "A :attribute és :other különböznie kell.",
        -    "digits"           => "A :attribute :digits számjegynek kell lenni.",
        -    "digits_between"   => "A :attribute :min - :max számjegy között kell lenni.",
        -    "email"            => "Az :attribute formátuma érvénytelen.",
        -    "exists"           => "A kiválasztott :attribute étvénytelen.",
        -    "email_array"      => "Egy vagy több email cím érvénytelen.",
        -    "image"            => "A :attribute képnek kell lenni.",
        -    "in"               => "A kiválasztott :attribute étvénytelen.",
        -    "integer"          => "A :attribute számnak kell lennie.",
        -    "ip"               => "A :attribute érvényes IP címnek kell lenni.",
        -    "max"              => array(
        -        "numeric" => "A :attribute nem lehet nagyobb, mint :max.",
        -        "file"    => "A :attribute nem lehet nagyobb, mint :max kilobájt.",
        -        "string"  => "A :attribute nem lehet nagyobb, mint :max karakter.",
        -    ),
        -    "mimes"            => "A :attribute ilyen fájl típusnak kell lennie: :values.",
        -    "min"              => array(
        -        "numeric" => "A :attribute legalább :min kell lenni.",
        -        "file"    => "A :attribute legalább :min kilobájt kell lenni.",
        -        "string"  => "A :attribute legalább :min karakter kell lenni.",
        -    ),
        -    "not_in"           => "A kiválasztott :attribute étvénytelen.",
        -    "numeric"          => "A :attribute csak szám lehet.",
        -    "regex"            => "Az :attribute formátuma érvénytelen.",
        -    "required"         => "A :attribute mező kötelező.",
        -    "required_if"      => "A :attribute mező kötelező ha :other egy :value.",
        -    "required_with"    => "A :attribute mező kötelező ha :value jelen van.",
        -    "required_without" => "A :attribute mező kötelező ha :value nincs jelen.",
        -    "same"             => "A :attribute és :other egyeznie kell.",
        -    "size"             => array(
        -        "numeric" => "A :attribute kötelező mérete :size.",
        -        "file"    => "A :attribute kötelező mérete :size kilobájt.",
        -        "string"  => "A :attribute kötelező mérete :size karakter.",
        -    ),
        -    "unique"           => "A :attribute már foglalt.",
        -    "url"              => "Az :attribute formátuma érvénytelen.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'A :attribute el kell fogadni.',
        +    'active_url'           => 'A :attribute nem valós URL.',
        +    'after'                => 'Az :attribute ezután a dátum után kell, hogy legyen :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'A :attribute csak betűket tartalmazhat.',
        +    'alpha_dash'           => 'A :attribute csak betűket, számokat és perjelet tartalmazhat.',
        +    'alpha_num'            => 'A :attribute csak betűket, számokat tartalmazhat.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'A :attribute csak :date elötti dátum lehet.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'A :attribute az érték között kell lennie :min -:max.',
        +        'file'    => 'A :attribute :min - :max kilobájt között kell lenni.',
        +        'string'  => 'A :attribute :min - :max karakter között kell lenni.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'Az attribútumnak igaznak, vagy hamisnak kell lennie (true/false).',
        +    'confirmed'            => 'A :attribute ellenörzés nem egyezik.',
        +    'date'                 => 'A :attribute nem egy valós dátum.',
        +    'date_format'          => 'A :attribute nem egyezik a formátummal :format.',
        +    'different'            => 'A :attribute és :other különböznie kell.',
        +    'digits'               => 'A :attribute :digits számjegynek kell lenni.',
        +    'digits_between'       => 'A :attribute :min - :max számjegy között kell lenni.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Az :attribute formátuma érvénytelen.',
        +    'exists'               => 'A kiválasztott :attribute étvénytelen.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'A :attribute képnek kell lenni.',
        +    'in'                   => 'A kiválasztott :attribute étvénytelen.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'A :attribute számnak kell lennie.',
        +    'ip'                   => 'A :attribute érvényes IP címnek kell lenni.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'A :attribute nem lehet nagyobb, mint :max.',
        +        'file'    => 'A :attribute nem lehet nagyobb, mint :max kilobájt.',
        +        'string'  => 'A :attribute nem lehet nagyobb, mint :max karakter.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'A :attribute ilyen fájl típusnak kell lennie: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'A :attribute legalább :min kell lenni.',
        +        'file'    => 'A :attribute legalább :min kilobájt kell lenni.',
        +        'string'  => 'A :attribute legalább :min karakter kell lenni.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'A kiválasztott :attribute étvénytelen.',
        +    'numeric'              => 'A :attribute csak szám lehet.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Az :attribute formátuma érvénytelen.',
        +    'required'             => 'A :attribute mező kötelező.',
        +    'required_if'          => 'A :attribute mező kötelező ha :other egy :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'A :attribute mező kötelező ha :value jelen van.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'A :attribute mező kötelező ha :value nincs jelen.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'A :attribute és :other egyeznie kell.',
        +    'size'                 => [
        +        'numeric' => 'A :attribute kötelező mérete :size.',
        +        'file'    => 'A :attribute kötelező mérete :size kilobájt.',
        +        'string'  => 'A :attribute kötelező mérete :size karakter.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'A :attribute már foglalt.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Az :attribute formátuma érvénytelen.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "A :attribute mező tartalmaz egy érvénytelen karaktert.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/id/admin/asset_maintenances/message.php b/resources/lang/id/admin/asset_maintenances/message.php
        index 1c3967397b..be87396015 100644
        --- a/resources/lang/id/admin/asset_maintenances/message.php
        +++ b/resources/lang/id/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Perawatan aset gagal di buat, mohon ulangi kembali.',
                     'success' => 'Perawatan aset telah sukses di buat.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Belum selesai',
                 'warranty'                     => 'Garansi',
                 'not_warranty'                 => 'Tidak bergaransi',
        diff --git a/resources/lang/id/admin/asset_maintenances/table.php b/resources/lang/id/admin/asset_maintenances/table.php
        index b0c1e3ba8a..7104228a8d 100644
        --- a/resources/lang/id/admin/asset_maintenances/table.php
        +++ b/resources/lang/id/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Pemeliharaan Aset',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nama Aset',
                 'is_warranty'   => 'Garansi',
                 'dl_csv'        => 'Unduh CSV'
             ];
        diff --git a/resources/lang/id/admin/categories/general.php b/resources/lang/id/admin/categories/general.php
        index c25e159672..deb04849ce 100644
        --- a/resources/lang/id/admin/categories/general.php
        +++ b/resources/lang/id/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Tentang Kategori',
        +    'about_categories'  				=> 'Kategori membantu meng-organisir aset anda. Beberapa contoh kategori mungkin seperti &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, dan seterusnya, tapi anda bisa menggunakan kategori sesuai kebutuhan anda.',
             'asset_categories' 					=> 'Kategori Aset',
             'category_name'  					=> 'Nama Kategori',
             'checkin_email'                     => 'Kirim surel ke pengguna ketika barang di berikan kepadanya.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Ubah Kategori',
             'eula_text'							=> 'Kategori EULA',
             'eula_text_help'					=> 'Kolom ini memperbolehkan Anda untuk menyesuaikan EULA Anda untuk jenis dari aset. Jika Anda hanya memiliki satu EULA untuk semua aset Anda, Anda dapat memeriksa kotak di bawah untuk menggunakan pilihan utama.',
        +    'name'                              => 'Nama Kategori',
             'require_acceptance'				=> 'Mengharuskan pengguna untuk mengkonfirmasi penerimaan aset dalam kategori ini.',
             'required_acceptance'				=> 'Pengguna akan dikirimkan surel konfirmasi untuk menerima barang tersebut.',
             'required_eula'						=> 'Pengguna akan di kirimkan surel atas EULA',
        diff --git a/resources/lang/id/admin/companies/general.php b/resources/lang/id/admin/companies/general.php
        index 9faf0b53ac..0a3b533a7b 100644
        --- a/resources/lang/id/admin/companies/general.php
        +++ b/resources/lang/id/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Tentang Perusahaan',
        +    'about_companies_text'                  => 'Perusahaan dapat digunakan sebagai kolom pengenal, atau dapat digunakan untuk membatasi visibilitas aset, pengguna, dll jika dukungan penuh perusahaan diaktifkan pada pengaturan Admin anda.',
             'select_company' => 'Pilih Perusahaan',
         ];
        diff --git a/resources/lang/id/admin/consumables/general.php b/resources/lang/id/admin/consumables/general.php
        index 1d9027b46f..df0b717fa4 100644
        --- a/resources/lang/id/admin/consumables/general.php
        +++ b/resources/lang/id/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> 'Tentang Barang Habis Pakai',
             'about_consumables_text'  			=> 'Barang Habis Pakai adalah segala sesuatu yang dibeli dan nantinya akan habis terpakai. Sebagai contoh, tinta printer atau kertas untuk mesin fotokopi.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'Periksa barang habis pakai ke Pengguna',
             'consumable_name'                   => 'Nama Barang Habis Pakai',
             'create'                            => 'Membuat Barang Habis Pakai',
             'item_no'                           => 'Nomor Barang',
        diff --git a/resources/lang/id/admin/custom_fields/general.php b/resources/lang/id/admin/custom_fields/general.php
        index 79bcd9583e..b66104587d 100644
        --- a/resources/lang/id/admin/custom_fields/general.php
        +++ b/resources/lang/id/admin/custom_fields/general.php
        @@ -6,16 +6,16 @@ return array(
             'about_fieldsets_title'		=> 'Tentang Set Kolom',
             'about_fieldsets_text'		=> 'Fieldsets memungkinkan Anda untuk membuat kolom tambahan yang seringkali dipakai untuk dapat digunakan pada model aset tertentu.',
             'custom_format'             => 'Format Tambahan...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Enkripsi nilai kolom ini di database',
             'encrypt_field_help'      => 'PERINGATAN: Mengenkripsi kolom menjadikan tidak bisa ditemukan.',
        -    'encrypted'      	        => 'Encrypted',
        +    'encrypted'      	        => 'Dienkripsi',
             'fieldset'      	        => 'Set Kolom',
             'qty_fields'      	      => 'Kolom Jumlah',
             'fieldsets'      	        => 'Kumpulan Set Kolom',
             'fieldset_name'           => 'Nama Kumpulan Set Kolom',
             'field_name'              => 'Nama Set Kolom',
             'field_values'            => 'Nilai Kolom',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Tambahkan opsi pilihan, satu opsi per baris. Baris kosong selain baris pertama akan diabaikan.',
             'field_element'           => 'Elemen Form',
             'field_element_short'     => 'Elemen',
             'field_format'            => 'Format',
        @@ -26,5 +26,5 @@ return array(
             'order'   		            => 'Urutan',
             'create_fieldset'         => 'Set Kolom Baru',
             'create_field'            => 'Tambah Kolom Ubahan',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'value_encrypted'      	        => 'Nilai dari kolom ini di database dienkripsi. hanya pengguna admin yang bisa melihat nilai deskripsinya',
         );
        diff --git a/resources/lang/id/admin/custom_fields/message.php b/resources/lang/id/admin/custom_fields/message.php
        index b407bbeff8..27f7bdd3b7 100644
        --- a/resources/lang/id/admin/custom_fields/message.php
        +++ b/resources/lang/id/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset gagal di buat, silahkan coba kembali.',
        diff --git a/resources/lang/id/admin/departments/message.php b/resources/lang/id/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/id/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/id/admin/departments/table.php b/resources/lang/id/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/id/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/id/admin/depreciations/general.php b/resources/lang/id/admin/depreciations/general.php
        index 9e28e04052..bc5b0cb507 100644
        --- a/resources/lang/id/admin/depreciations/general.php
        +++ b/resources/lang/id/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Tentang Penyusutan Aset',
             'about_depreciations'  					=> 'Anda dapat mengatur penyusutan aset dengan perhitungan penyusutan garis lurus.',
             'asset_depreciations'  					=> 'Depresiasi Aset',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Buat Penyusutan',
             'depreciation_name'  					=> 'Nama Penyusutan',
             'number_of_months'  					=> 'Jumlah bulan',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Perbaharui Penyusutan',
         
         );
        diff --git a/resources/lang/id/admin/groups/titles.php b/resources/lang/id/admin/groups/titles.php
        index eb960fced7..94b25866ee 100644
        --- a/resources/lang/id/admin/groups/titles.php
        +++ b/resources/lang/id/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Tentang Grup',
        +    'about_groups'                  => 'Grup digunakan untuk menyamaratakan perizinan pengguna.',
             'group_management' 	 	=> 'Manajemen Kelompok',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Buat Grup Baru',
        +    'update' 	 		        => 'Sunting Grup',
             'group_name' 	 		=> 'Nama Kelompok',
             'group_admin' 	 		=> 'Admin Kelompok',
             'allow' 	 			=> 'Izin',
        diff --git a/resources/lang/id/admin/hardware/form.php b/resources/lang/id/admin/hardware/form.php
        index 274e5c4a87..5275a62040 100644
        --- a/resources/lang/id/admin/hardware/form.php
        +++ b/resources/lang/id/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Konfirmasi Penghapusan Aset dalam Jumlah Besar',
           'bulk_delete_help'	=> 'Meninjau aset untuk penghapusan massal di bawah ini. Setelah dihapus, aset-aset ini dapat dipulihkan, tetapi mereka tidak lagi akan dikaitkan dengan setiap pengguna yang mereka saat ini digunakan.',
           'bulk_delete_warn'	=> 'Anda akan menghapus :asset_count aset.',
         	'bulk_update'		=> 'Perbarui aset jumlah besar',
        diff --git a/resources/lang/id/admin/hardware/general.php b/resources/lang/id/admin/hardware/general.php
        index 4c9a29ba1d..a4095cf936 100644
        --- a/resources/lang/id/admin/hardware/general.php
        +++ b/resources/lang/id/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Tentang Aset',
        +    'about_assets_text'            => 'Aset adalah barang yang dilacak dengan nomor seri atau tanda aset. Cenderung menjadi barang dengan nilai lebih tinggi dimana identifikasi barang secara spesifik berpengaruh.',
         	'archived'  				=> 'Diarsipkan',
             'asset'  					=> 'Aset',
             'bulk_checkout'             => 'Pemberian aset kepada pengguna',
             'checkin'  					=> 'Pengembalian aset',
        -    'checkout'  				=> 'Pemberian aset kepada pengguna',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Klon Aset',
             'deployable'  				=> 'Dapat digunakan',
             'deleted'  					=> 'Aset ini telah di hapus. <a href="/hardware/:asset_id/restore">Klik disini untuk memulihkan</a>.',
        @@ -15,7 +15,7 @@ return array(
         	'filetype_info'				=> 'Jenis berkas diizinkan adalah png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, dan rar.',
             'model_deleted'  			=> 'Model aset telah di hapus. Anda harus memulihkan model dahulu sebelum memulihkan aset.<br/> <a href="/hardware/models/:model_id/restore">Klik disini untuk memulihkan model</a>.',
             'requestable'               => 'Dapat diminta',
        -    'requested'				    => 'Requested',
        +    'requested'				    => 'Telah diminta',
             'restore'  					=> 'Mengembalikan aset',
             'pending'  					=> 'Tunda',
             'undeployable'  			=> 'Tidak dapat digunakan',
        diff --git a/resources/lang/id/admin/hardware/message.php b/resources/lang/id/admin/hardware/message.php
        index 1982e6edda..9cef28417c 100644
        --- a/resources/lang/id/admin/hardware/message.php
        +++ b/resources/lang/id/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Aset berhasil dikembalikan.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Berkas tidak terhapus. Silahkan coba kembali.',
                 'success' => 'Berkas berhasil dihapus.',
        @@ -40,14 +46,15 @@ return array(
                 'error'                 => 'Beberapa item tidak terimpor dengan benar.',
                 'errorDetail'           => 'Item berikut tidak terimpor karena ada kesalahan.',
                 'success'               => "Berkas Anda berhasil terimpor",
        -        'file_delete_success'   => "Your file has been been successfully deleted",
        -        'file_delete_error'      => "The file was unable to be deleted",
        +        'file_delete_success'   => "File anda telah berhasil dihapus",
        +        'file_delete_error'      => "File tidak bisa dihapus",
             ),
         
         
             'delete' => array(
                 'confirm'   	=> 'Apakah Anda yakin untuk menghapus aset ini?',
                 'error'   		=> 'Terdapat kesalahan pada saat penghapusan aset. Silahkan coba kembali.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Aset sukses terhapus.'
             ),
         
        @@ -69,7 +76,7 @@ return array(
             'requests' => array(
                 'error'   		=> 'Aset gagal di minta, silahkan coba kembali',
                 'success' 		=> 'Sukses meminta aset.',
        -        'canceled'      => 'Checkout request successfully canceled'
        +        'canceled'      => 'Permintaan pemeriksaan berhasil dibatalkan'
             )
         
         );
        diff --git a/resources/lang/id/admin/licenses/general.php b/resources/lang/id/admin/licenses/general.php
        index 734104cf45..f3e5fbeee8 100644
        --- a/resources/lang/id/admin/licenses/general.php
        +++ b/resources/lang/id/admin/licenses/general.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses_title'            => 'Tentang Lisensi',
             'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
             'checkin'  					=> 'Pemberian kapasitas lisensi',
             'checkout_history'  		=> 'Riwayat Pemberian',
        diff --git a/resources/lang/id/admin/locations/table.php b/resources/lang/id/admin/locations/table.php
        index fb6acad592..199e62d7da 100644
        --- a/resources/lang/id/admin/locations/table.php
        +++ b/resources/lang/id/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Lokasi',
             'parent'                    => 'Induk',
             'currency'                  => 'Lokasi Mata Uang',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/id/admin/manufacturers/table.php b/resources/lang/id/admin/manufacturers/table.php
        index 2a70569620..7d79e858c1 100644
        --- a/resources/lang/id/admin/manufacturers/table.php
        +++ b/resources/lang/id/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Tentang Manufaktur',
        +    'about_manufacturers_text'  => 'Pabrikan adalah perusahaan yang menciptakan aset Anda. Anda dapat menyimpan informasi kontak pendukung penting tentang mereka di sini, yang akan ditampilkan di halaman detail aset Anda.',
             'asset_manufacturers'	=> 'Merek Aset',
             'create'				=> 'Masukan Merek',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nama Merek',
        +    'name'      			=> 'Nama',
        +    'support_email'   		=> 'Dukungan Email',
        +    'support_phone'   		=> 'Dukungan Telp',
        +    'support_url'   		=> 'URL Dukungan',
             'update'				=> 'Perbarui Merek',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/id/admin/models/message.php b/resources/lang/id/admin/models/message.php
        index bced6b6571..d35a755a99 100644
        --- a/resources/lang/id/admin/models/message.php
        +++ b/resources/lang/id/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Sukses memulihkan model.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/id/admin/settings/general.php b/resources/lang/id/admin/settings/general.php
        index 5d8a5aa0a2..714aefba5e 100644
        --- a/resources/lang/id/admin/settings/general.php
        +++ b/resources/lang/id/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Ambang batas pemberitahuan kadaluarsa (dalam hari)',
         	'alert_inv_threshold'		=> 'Ambang pemberitahuan persediaan',
         	'asset_ids'					=> 'Aset id',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Membuat otomatis pembahan nomor ID aset',
         	'auto_increment_prefix'		=> 'Awalan (pilihan)',
         	'auto_incrementing_help'    => 'Hidupkan penambahan otomatis terlebih dahulu sebelumnya',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Kode jarak jauh',
             'load_remote_help_text'		=> 'Snipe-IT dapat menggunakan kode program dari luar.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Membatasi pengguna (termasuk admin) diberikan kepada perusahaan untuk aset perusahaan mereka.',
             'full_multiple_companies_support_text' => 'Dukungan penuh beberapa perusahaan',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versi PHP',
             'php_gd_info'               => 'Anda harus memasang php-gd untuk menampilkan kode QR, baca petunjuk pemasangan.',
             'php_gd_warning'            => 'Plugin PHP pengolahan citra dan GD tidak diinstal.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Hidupkan kode QR sebelumnya',
             'qr_text'                   => 'Teks kode QR',
             'setting'                   => 'Pengaturan',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Dengan pengaturan ini anda dapat merubah aspek tertentu pada instalasi.',
             'labels_per_page'           => 'Label per halaman',
             'label_dimensions'          => 'Dimensi label (inch)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Marjin halaman (inch)',
             'purge'                    => 'Pembersihan catatan yang telah terhapus',
             'labels_display_bgutter'    => 'Ukuran bawah label',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'l',
             'height_h'        => 't',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/id/admin/users/general.php b/resources/lang/id/admin/users/general.php
        index de5262f1d3..eef4f4ea13 100644
        --- a/resources/lang/id/admin/users/general.php
        +++ b/resources/lang/id/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Aset pada :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Aset ini untuk pengguna ini',
             'clone'             => 'Klon pengguna',
             'contact_user'      => 'Kontak :name',
             'edit'              => 'Sunting Pengguna',
             'filetype_info'     => 'Jenis berkas diizinkan adalah png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, dan rar.',
             'history_user'      => 'Riwayat untuk :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Terakhir masuk',
             'ldap_config_text'  => 'Konfigurasi LDAP terdapat di Admin > Pengaturan. Jika lokasi di pilih, maka akan di impor untuk semua pengguna.',
             'software_user'     => 'Perangkat lunak pada :name',
        diff --git a/resources/lang/id/admin/users/message.php b/resources/lang/id/admin/users/message.php
        index 3ce230144a..26f22ee9e7 100644
        --- a/resources/lang/id/admin/users/message.php
        +++ b/resources/lang/id/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Anda sukses menerima aset ini.',
             'declined'                  => 'Anda sukses menolak aset ini.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Pengguna sudah ada!',
             'user_not_found'            => 'Pengguna [:id] tidak terdaftar.',
             'user_login_required'       => 'Kolom login wajib di-isi',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Pengguna sukses di buat.',
                 'update'    => 'Pengguna sukses di perbarui.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Pengguna sukses di hapus.',
                 'ban'       => 'Pengguna sukses di blokir.',
                 'unban'     => 'Pengguna sukses tidak di blokir.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Terdapat kesalahan ketika membuat pengguna. Silahkan coba kembali.',
                 'update' => 'Terdapat masalah ketika memperbarui pengguna. Silahkan coba kembali.',
                 'delete' => 'Terdapat masalah ketika menghapus pengguna. Silahkan coba kembali.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Terdapat masalah ketika menangguhkan pengguna. Silahkan coba kembali.',
                 'import'    => 'Terdapat masalah ketika mengimpor pengguna. Silahkan coba kembali.',
                 'asset_already_accepted' => 'Aset ini telah di terima.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Server LDAP gagal mengikat. Silahkan cek kembali konfigurasi server LDAP di berkas config. <br>Eror dari server LDAP: ',
                 'ldap_could_not_search' => 'Gagal mencari server LDAP. Silahkan cek konfigurasi server LDAP di berkas config LDAP. <br>Eror dari server LDAP:',
                 'ldap_could_not_get_entries' => 'Gagal menerima catatan dari server LDAP. Silahkan cek konfigurasi server LDAP di berkas config LDAP. <br>Eror dari server LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/id/admin/users/table.php b/resources/lang/id/admin/users/table.php
        index 37157fb197..8306ca818d 100644
        --- a/resources/lang/id/admin/users/table.php
        +++ b/resources/lang/id/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktif',
             'allow'  				=> 'Izinkan',
             'checkedout'  			=> 'Aset',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Lokasi',
             'lock_passwords'		=> 'Detail masuk tidak dapat di ubah ketika instalasi.',
             'manager' 				=> 'Manajer',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nama',
             'notes'                 => 'Catatan',
             'password_confirm' 		=> 'Konfirmasikan Kata Sandi',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Tampilkan pengguna saat ini',
             'show_deleted'          => 'Tampilkan pengguna yang di hapus',
             'title' 				=> 'Judul',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Perbarui Pengguna',
             'username' 				=> 'Nama Pengguna',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Ini digunakan untuk mengikat Active Directory saja, bukan untuk login.)',
             'cloneuser'             => 'Klon pengguna',
             'viewusers' 			=> 'Tampilkan Pengguna',
        diff --git a/resources/lang/id/auth/message.php b/resources/lang/id/auth/message.php
        index af5a50c22a..47981f328c 100644
        --- a/resources/lang/id/auth/message.php
        +++ b/resources/lang/id/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Akun pengguna ini belum ter-aktivasi.',
             'account_suspended'      => 'Akun pengguna ini di tangguhkan.',
             'account_banned'         => 'Akun pengguna ini dilarang.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Terdapat kesalahan ketika anda mencoba masuk, silahkan coba kembali.',
        diff --git a/resources/lang/id/button.php b/resources/lang/id/button.php
        index 4896689f0d..c61f005cca 100644
        --- a/resources/lang/id/button.php
        +++ b/resources/lang/id/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Tindakan',
             'add'    	                => 'Tambah Baru',
             'cancel'                    => 'Batalkan',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Permintaan',
             'submit'  	                => 'Kirim',
             'upload'                    => 'Unggah',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/id/general.php b/resources/lang/id/general.php
        index 32961cfde6..77bc100792 100644
        --- a/resources/lang/id/general.php
        +++ b/resources/lang/id/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Laporan aset',
             'asset_tag'				=> 'Tag Aset',
             'assets_available'		=> 'Aset yang tersedia',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Aset',
             'avatar_delete'         => 'Hapus avatar',
             'avatar_upload'         => 'Unggah avatar',
             'back'      			=> 'Kembali',
             'bad_data'      		=> 'Tidak di temukan. Kemungkinan data rusak?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'check-out masal',
             'cancel'  				=> 'Batalkan',
             'categories'			=> 'Kategori',
             'category'				=> 'Kategori',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Rubah alamat email',
             'changepassword'  		=> 'Rubah Kata sandi',
             'checkin'  				=> 'Check-in',
             'checkin_from'  		=> 'Check-in dari',
             'checkout'  			=> 'Check-out',
             'city'  				=> 'Kota',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Perusahaan',
             'company'				=> 'Perusahaan',
             'component'			=> 'Komponen',
             'components'			=> 'Komponen',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Barang Habis Pakai',
             'consumables'			=> 'Barang Habis Pakai',
             'country'  				=> 'Negara',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'Buat aset',
             'created_at' 			=> 'Dibuat di',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Saat ini',
             'custom_report'         => 'Laporan kustom aset',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Tanggal',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Hapus',
             'deleted'  				=> 'Dihapus',
             'delete_seats'  		=> 'Lisensi di hapus',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Dijalankan',
             'depreciation_report'	=> 'Laporan penyusutan',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Tidak ada hak akses!',
             'language'				=> 'Bahasa',
             'last'					=> 'Terakhir',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Nama Belakang',
             'license'				=> 'Lisensi',
             'license_report'        => 'Laporan Lisensi',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'Lebih Lanjut',
             'name'					=> 'Nama',
             'next'					=> 'Berikutnya',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'baru!',
             'no_depreciation'		=> 'Tidak ada penyusutan',
             'no_results'			=> 'Tidak ada hasil.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Pilih',
             'search'				=> 'Cari',
             'select_category'       => 'Memilih Kategori',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Memilih tipe penyusutan',
             'select_location'		=> 'Memilih lokasi',
             'select_manufacturer'	=> 'Memilih pabrikan',
             'select_model'			=> 'Memilih model',
             'select_supplier'		=> 'Memilih pemasok',
             'select_user'			=> 'Memilih pengguna',
        -    'select_date'			=> 'Memilih Tanggal',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Memilih Status',
             'select_company'    	=> 'Memilih Perusahaan',
             'select_asset'    		=> 'Memilih Aset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Pemasok',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'total aset',
             'total_licenses'		=> 'total lisensi',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/id/mail.php b/resources/lang/id/mail.php
        index c9a4fe182d..3176f9a2f5 100644
        --- a/resources/lang/id/mail.php
        +++ b/resources/lang/id/mail.php
        @@ -3,10 +3,10 @@
         return array(
             'a_user_canceled' => 'A user has canceled an item request on the website',
             'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        +    'accessory_name' => 'Nama Aksesori:',
        +    'additional_notes' => 'Catatan Tambahan:',
             'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        +    'asset' => 'Aset:',
             'asset_name' => 'Asset Name:',
             'asset_requested' => 'Asset requested',
             'asset_tag' => 'Asset Tag:',
        @@ -33,8 +33,8 @@ return array(
             'Expiring_Assets_Report' => 'Expiring Assets Report.',
             'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
             'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'hi' => 'Hai',
        +    'i_have_read' => 'Saya telah membaca dan menyetujui persyaratan penggunaan, dan telah menerima barang ini.',
             'item' => 'Item:',
             'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
                                       inventory or will soon be low.',
        @@ -49,12 +49,12 @@ return array(
             'name' => 'Name',
             'new_item_checked' => 'A new item has been checked out under your name, details are below.',
             'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'password_reset' => 'Reset Password',
         
             'read_the_terms' => 'Please read the terms of use below.',
             'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
                                  and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        +    'requested' => 'Diminta:',
             'reset_link' => 'Your Password Reset Link',
             'reset_password' => 'Click here to reset your password:',
             'serial' => 'Serial:',
        diff --git a/resources/lang/id/validation.php b/resources/lang/id/validation.php
        index 95bf1c3c65..295db5131f 100644
        --- a/resources/lang/id/validation.php
        +++ b/resources/lang/id/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ": Atribut harus diterima.",
        -    "active_url"       => ": Atribut ini URL-nya tidak valid.",
        -    "after"            => ": Atribut harus tanggal setelah: tanggal.",
        -    "alpha"            => ": Atribut hanya boleh berisi huruf.",
        -    "alpha_dash"       => ": Atribut hanya boleh berisi angka, huruf dan garis.",
        -    "alpha_num"        => ": Atribut hanya boleh berisi huruf dan angka.",
        -    "before"           => ": Atribut harus tanggal sebelum: tanggal.",
        -    "between"          => array(
        -        "numeric" => ": Atribut harus di antara: min -: maks.",
        -        "file"    => ": Atribut harus di antara: min -: maks kilobytes.",
        -        "string"  => ": Atribut harus di antara: min -: maks jumlah karakter.",
        -    ),
        -    "confirmed"        => "Konfirmasi :attribute tidak cocok.",
        -    "date"             => "Tanggal :attribute tidak valid.",
        -    "date_format"      => ":attribute tidak cocok dengan format :format.",
        -    "different"        => ":attribute dan :other harus berbeda.",
        -    "digits"           => ":attribute harus dengan :digits digit.",
        -    "digits_between"   => "Digit :attribute harus di antara :min dan :max.",
        -    "email"            => "Format :attribute tidak benar.",
        -    "exists"           => ":attribute yang di pilih tidak benar.",
        -    "email_array"      => "Satu atau lebih alamat email tidak benar.",
        -    "image"            => ":attribute harus dalam bentuk gambar.",
        -    "in"               => ":attribute yang di pilih tidak benar.",
        -    "integer"          => ":attribute harus dalam bentuk integer.",
        -    "ip"               => ":attribute harus memilik alamat IP yang benar.",
        -    "max"              => array(
        -        "numeric" => ":attribute tidak boleh lebih dari :max.",
        -        "file"    => ":attribute tidak boleh lebih dari :max kilobyte.",
        -        "string"  => ":attribute tidak boleh lebih dari :max karakter.",
        -    ),
        -    "mimes"            => ":attribute harus memiliki tipe data :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute seharusnya :min.",
        -        "file"    => ":attribute harus memiliki :min kilobyte.",
        -        "string"  => ":attribute harus memiliki :min jumlah karakter.",
        -    ),
        -    "not_in"           => ":attribute yang di pilih tidak benar.",
        -    "numeric"          => ":attribute harus dalam angka.",
        -    "regex"            => "Format :attribute tidak benar.",
        -    "required"         => "Kolom :attribute wajib di-isi.",
        -    "required_if"      => "Kolom :attribute wajib di-isi ketika :other nya :value.",
        -    "required_with"    => "Kolom :attribute wajib di-isi ketika terdapat :values.",
        -    "required_without" => "Kolom :attribute wajib di-isi ketika :values tidak ada.",
        -    "same"             => ":attribute dan :other harus cocok.",
        -    "size"             => array(
        -        "numeric" => "Ukuran :attribute harus :size.",
        -        "file"    => ":attribute harus memiliki :size kilobyte.",
        -        "string"  => ":attribute harus memiliki :size karakter.",
        -    ),
        -    "unique"           => ":attribute sudah digunakan.",
        -    "url"              => "Format :attribute tidak benar.",
        -    "statuslabel_type" => "Anda harus memilih tipe status label yang benar",
        -    "unique_undeleted" => ":attribute harus unik.",
        +    'accepted'             => ': Atribut harus diterima.',
        +    'active_url'           => ': Atribut ini URL-nya tidak valid.',
        +    'after'                => ': Atribut harus tanggal setelah: tanggal.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ': Atribut hanya boleh berisi huruf.',
        +    'alpha_dash'           => ': Atribut hanya boleh berisi angka, huruf dan garis.',
        +    'alpha_num'            => ': Atribut hanya boleh berisi huruf dan angka.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ': Atribut harus tanggal sebelum: tanggal.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ': Atribut harus di antara: min -: maks.',
        +        'file'    => ': Atribut harus di antara: min -: maks kilobytes.',
        +        'string'  => ': Atribut harus di antara: min -: maks jumlah karakter.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'Konfirmasi :attribute tidak cocok.',
        +    'date'                 => 'Tanggal :attribute tidak valid.',
        +    'date_format'          => ':attribute tidak cocok dengan format :format.',
        +    'different'            => ':attribute dan :other harus berbeda.',
        +    'digits'               => ':attribute harus dengan :digits digit.',
        +    'digits_between'       => 'Digit :attribute harus di antara :min dan :max.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Format :attribute tidak benar.',
        +    'exists'               => ':attribute yang di pilih tidak benar.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute harus dalam bentuk gambar.',
        +    'in'                   => ':attribute yang di pilih tidak benar.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute harus dalam bentuk integer.',
        +    'ip'                   => ':attribute harus memilik alamat IP yang benar.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute tidak boleh lebih dari :max.',
        +        'file'    => ':attribute tidak boleh lebih dari :max kilobyte.',
        +        'string'  => ':attribute tidak boleh lebih dari :max karakter.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute harus memiliki tipe data :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute seharusnya :min.',
        +        'file'    => ':attribute harus memiliki :min kilobyte.',
        +        'string'  => ':attribute harus memiliki :min jumlah karakter.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => ':attribute yang di pilih tidak benar.',
        +    'numeric'              => ':attribute harus dalam angka.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Format :attribute tidak benar.',
        +    'required'             => 'Kolom :attribute wajib di-isi.',
        +    'required_if'          => 'Kolom :attribute wajib di-isi ketika :other nya :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Kolom :attribute wajib di-isi ketika terdapat :values.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Kolom :attribute wajib di-isi ketika :values tidak ada.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute dan :other harus cocok.',
        +    'size'                 => [
        +        'numeric' => 'Ukuran :attribute harus :size.',
        +        'file'    => ':attribute harus memiliki :size kilobyte.',
        +        'string'  => ':attribute harus memiliki :size karakter.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute sudah digunakan.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Format :attribute tidak benar.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Kolom :attribute tidak boleh di isi karakter yang tidak di perbolehkan.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/it/admin/asset_maintenances/message.php b/resources/lang/it/admin/asset_maintenances/message.php
        index 999ef6aacc..2cc9762f63 100644
        --- a/resources/lang/it/admin/asset_maintenances/message.php
        +++ b/resources/lang/it/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Manutenzione prodotto non creata, riprova.',
                     'success' => 'Manutenzione prodotto creata con successo.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Non ancora completato',
                 'warranty'                     => 'Garanzia',
                 'not_warranty'                 => 'Senza garanzia',
        diff --git a/resources/lang/it/admin/asset_maintenances/table.php b/resources/lang/it/admin/asset_maintenances/table.php
        index 77bf5bcff4..f07221bfd4 100644
        --- a/resources/lang/it/admin/asset_maintenances/table.php
        +++ b/resources/lang/it/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Manutenzione Prodotto',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nome prodotto',
                 'is_warranty'   => 'Garanzia',
                 'dl_csv'        => 'Scarica CSV'
             ];
        diff --git a/resources/lang/it/admin/categories/general.php b/resources/lang/it/admin/categories/general.php
        index e7c93cb746..b8568c651f 100644
        --- a/resources/lang/it/admin/categories/general.php
        +++ b/resources/lang/it/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Modifica Categoria',
             'eula_text'							=> 'Categoria EULA',
             'eula_text_help'					=> 'Questo campo consente di personalizzare le EULA per specifici tipi di attività. Se avete solo un EULA per tutti i vostri beni, è possibile controllare la casella di seguito per utilizzare il valore predefinito.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Richiedere agli utenti di confermare l\'accettazione di attività in questa categoria.',
             'required_acceptance'				=> 'Verrà inviata un email  all\'utente con un link per confermare l\'accettazione di questo oggetto.',
             'required_eula'						=> 'Verrà inviato all\'utente via email copia di questa EULA',
        diff --git a/resources/lang/it/admin/custom_fields/message.php b/resources/lang/it/admin/custom_fields/message.php
        index 38849e263e..0f6b6ff268 100644
        --- a/resources/lang/it/admin/custom_fields/message.php
        +++ b/resources/lang/it/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Il Fieldset non è stato creato, riprova.',
        diff --git a/resources/lang/it/admin/departments/message.php b/resources/lang/it/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/it/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/it/admin/departments/table.php b/resources/lang/it/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/it/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/it/admin/groups/titles.php b/resources/lang/it/admin/groups/titles.php
        index 1c47388460..7ac8f60aa5 100644
        --- a/resources/lang/it/admin/groups/titles.php
        +++ b/resources/lang/it/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Informazioni sui gruppi',
        +    'about_groups'                  => 'I gruppi sono usati per generalizzare i permessi degli utenti.',
             'group_management' 	 	=> 'Gestione Gruppo',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Crea nuovo gruppo',
        +    'update' 	 		        => 'Modifica gruppo',
             'group_name' 	 		=> 'Nome del gruppo',
             'group_admin' 	 		=> 'Amministratore del Gruppo',
             'allow' 	 			=> 'Permetti',
        diff --git a/resources/lang/it/admin/hardware/general.php b/resources/lang/it/admin/hardware/general.php
        index 6b62e68b53..daf99ae1d5 100644
        --- a/resources/lang/it/admin/hardware/general.php
        +++ b/resources/lang/it/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Ingresso Asset',
        -    'checkout'  				=> 'Uscita Asset',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Copia Asset',
             'deployable'  				=> 'Distribuibile',
             'deleted'  					=> 'Questo asset è stato cancellato. <a href="/hardware/:asset_id/restore">Clicca qui per ripristinarlo</a>.',
        diff --git a/resources/lang/it/admin/hardware/message.php b/resources/lang/it/admin/hardware/message.php
        index 123ab0c571..ba75882462 100644
        --- a/resources/lang/it/admin/hardware/message.php
        +++ b/resources/lang/it/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Bene ripristinato con successo.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File non cancellato. Riprova.',
                 'success' => 'File cancellato con successo.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Sei sicuro di voler eliminare questo bene?',
                 'error'   		=> 'C\'è stato un problema durante la cancellazione del bene. Riprova per favore.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Il bene è stato eliminato con successo.'
             ),
         
        diff --git a/resources/lang/it/admin/licenses/form.php b/resources/lang/it/admin/licenses/form.php
        index 01fdba936a..c25c85f6e4 100644
        --- a/resources/lang/it/admin/licenses/form.php
        +++ b/resources/lang/it/admin/licenses/form.php
        @@ -6,7 +6,7 @@ return array(
             'checkin'           => 'Carica',
             'create'            => 'Crea Licenza',
             'expiration'        => 'Data di scadenza',
        -    'license_key'       => 'Product Key',
        +    'license_key'       => 'Chiave licenza',
             'maintained'        => 'Mantenuto',
             'name'              => 'Nome Software',
             'no_depreciation'   => 'Non svaluta',
        diff --git a/resources/lang/it/admin/licenses/general.php b/resources/lang/it/admin/licenses/general.php
        index d9b74d4065..a0c86c5fb5 100644
        --- a/resources/lang/it/admin/licenses/general.php
        +++ b/resources/lang/it/admin/licenses/general.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses_title'            => 'Informazioni sulle licenze',
             'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
             'checkin'  					=> 'Registrare Licenza Sede',
             'checkout_history'  		=> 'Storico Estrazioni',
        diff --git a/resources/lang/it/admin/licenses/message.php b/resources/lang/it/admin/licenses/message.php
        index 38d893d907..bcf996c4eb 100644
        --- a/resources/lang/it/admin/licenses/message.php
        +++ b/resources/lang/it/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'File non caricato/i. Riprova.',
                 'success' => 'File caricato/i con successo.',
                 'nofiles' => 'Non hai selezionato nessun file per il caricamento, oppure il file selezionato è troppo grande',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Uno o più file sono troppo grandi o il formato del file non è consentito. I tipi di file consentiti sono png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, e lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/it/admin/locations/table.php b/resources/lang/it/admin/locations/table.php
        index 43ba1425b6..2760de39f5 100644
        --- a/resources/lang/it/admin/locations/table.php
        +++ b/resources/lang/it/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'Informazioni sulle posizioni',
        +    'about_locations'           => 'Le posizioni sono usate per tracciare la poszione degli utenti, degli asset, e di altri oggetti',
             'assets_rtd'                => 'Asset', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Asset Assegnato',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Posizioni',
             'parent'                    => 'Genitore',
             'currency'                  => 'Valuta della Posizione',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/it/admin/manufacturers/table.php b/resources/lang/it/admin/manufacturers/table.php
        index e017fb94df..c0e2d77293 100644
        --- a/resources/lang/it/admin/manufacturers/table.php
        +++ b/resources/lang/it/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Informazioni sui produttori',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Produttori Bene',
             'create'				=> 'Crea Produttore',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nome del produttore',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Aggiorna Produttore',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/it/admin/models/general.php b/resources/lang/it/admin/models/general.php
        index 82b670944f..c91c2dffa6 100644
        --- a/resources/lang/it/admin/models/general.php
        +++ b/resources/lang/it/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Informazioni sui modelli di Asset',
        +    'about_models_text'           => 'I modelli sono un modo per raggruppare Asset identici. "MBP 2016", "IPhone 6s", etc.',
             'deleted'  					        => 'Questo modello è stato eliminato.<a href="/hardware/models/:model_id/restore">Clicca qui per ripristinarlo</a>.',
             'restore'                   => 'Ripristinare il modello',
             'requestable'               => 'Gli utenti possono richiedere questo modello',
        diff --git a/resources/lang/it/admin/models/message.php b/resources/lang/it/admin/models/message.php
        index 1f510d51d0..ed799d6f7d 100644
        --- a/resources/lang/it/admin/models/message.php
        +++ b/resources/lang/it/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modello ripristinato con successo.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/it/admin/settings/general.php b/resources/lang/it/admin/settings/general.php
        index 345a2dabc1..ba687a65ec 100644
        --- a/resources/lang/it/admin/settings/general.php
        +++ b/resources/lang/it/admin/settings/general.php
        @@ -10,13 +10,17 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'ID modello',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Genera auto-incremento ID beni',
         	'auto_increment_prefix'		=> 'Prefisso (Opzionale)',
         	'auto_incrementing_help'    => 'Abilita auto-incremento ID beni prima di impostare questa',
         	'backups'					=> 'Backups',
         	'barcode_settings'			=> 'Impostazioni codice a barre',
             'confirm_purge'			    => 'Conferma Cancellazione',
        -    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        +    'confirm_purge_help'		=> 'Inserire il testo "DELETE" nel campo di seguito per eliminare i tuoi record cancellati. Quest\'operazione non può essere annullata.',
         	'custom_css'				=> 'CSS Personalizzato',
         	'custom_css_help'			=> 'Inserisci qualsiasi CSS personalizzato che vuoi utilizzare. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
         	'default_currency'  		=> 'Valuta predefinita',
        @@ -26,10 +30,10 @@ return array(
             'display_asset_name'        => 'Mostra Nome Bene',
             'display_checkout_date'     => 'Mostra Data Estrazione',
             'display_eol'               => 'Visualizzare EOL in vista tabella',
        -    'display_qr'                => 'Display Square Codes',
        -	'display_alt_barcode'		=> 'Display 1D barcode',
        -	'barcode_type'				=> '2D Barcode Type',
        -	'alt_barcode_type'			=> '1D barcode type',
        +    'display_qr'                => 'Visualizza codici quadrati',
        +	'display_alt_barcode'		=> 'Visualizza codici a barre',
        +	'barcode_type'				=> 'Tipo di codice a barre 2D',
        +	'alt_barcode_type'			=> 'Tipo di codice a barre 1D',
             'eula_settings'				=> 'Impostazioni EULA',
             'eula_markdown'				=> 'Questa EULA consente <a href="https://help.github.com/articles/github aromatizzato-markdown/">Github flavored markdown</a>.',
             'general_settings'			=> 'Impostazioni Generali',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'Email LDAP',
             'load_remote_text'          => 'Script remoti',
             'load_remote_help_text'		=> 'Questa installazione di Snipe-IT può caricare script dal mondo esterno.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restringere gli utenti (amministratori inclusi) assegnati ad una azienda agli asset della propria azienda.',
             'full_multiple_companies_support_text' => 'Supporto completo ad aziende multiple',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'È necessario installare php-gd per visualizzare i codici QR, consultare le istruzioni di installazione.',
             'php_gd_warning'            => 'Il plugin PHP Image Processing and GD non è installato.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Abilita codici QR primo di impostare questo',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Impostazioni',
        @@ -89,21 +101,24 @@ return array(
             'about_settings_title'      => 'Impostazioni',
             'about_settings_text'       => 'Queste impostazioni ti permettono di personalizzare alcuni aspetti della tua installazione.',
             'labels_per_page'           => 'Etichetta per pagina',
        -    'label_dimensions'          => 'Label dimensions (inches)',
        -    'page_padding'             => 'Page margins (inches)',
        -    'purge'                    => 'Purge Deleted Records',
        +    'label_dimensions'          => 'Dimensioni dell\'etichetta (pollici)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Margini della pagina (pollici)',
        +    'purge'                    => 'Eliminare i record cancellati',
             'labels_display_bgutter'    => 'Label bottom gutter',
             'labels_display_sgutter'    => 'Label side gutter',
             'labels_fontsize'           => 'Label font size',
             'labels_pagewidth'          => 'Label sheet width',
             'labels_pageheight'         => 'Label sheet height',
             'label_gutters'        => 'Label spacing (inches)',
        -    'page_dimensions'        => 'Page dimensions (inches)',
        +    'page_dimensions'        => 'Dimensioni della pagina (pollici)',
             'label_fields'          => 'Label visible fields',
        -    'inches'        => 'inches',
        -    'width_w'        => 'w',
        +    'inches'        => 'pollici',
        +    'width_w'        => 'l',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        @@ -123,11 +138,11 @@ return array(
             'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
             'require_accept_signature'      => 'Require Signature',
             'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        -    'left'        => 'left',
        -    'right'        => 'right',
        +    'left'        => 'sinistra',
        +    'right'        => 'destra',
             'top'        => 'top',
             'bottom'        => 'bottom',
        -    'vertical'        => 'vertical',
        -    'horizontal'        => 'horizontal',
        +    'vertical'        => 'verticale',
        +    'horizontal'        => 'orizzontale',
             'zerofill_count'        => 'Length of asset tags, including zerofill',
         );
        diff --git a/resources/lang/it/admin/settings/message.php b/resources/lang/it/admin/settings/message.php
        index 4e4ab5080a..484b9bbafe 100644
        --- a/resources/lang/it/admin/settings/message.php
        +++ b/resources/lang/it/admin/settings/message.php
        @@ -16,7 +16,7 @@ return array(
             'purge' => array(
                 'error'     => 'Si è verificato un errore durante la pulizia. ',
                 'validation_failed'     => 'La conferma dell\'eliminazione non è corretta. Digita "DELETE" nel box di conferma.',
        -        'success'               => 'Deleted records successfully purged.'
        +        'success'               => 'I record cancellati sono stati correttamente eliminati.'
             ),
         
         );
        diff --git a/resources/lang/it/admin/statuslabels/message.php b/resources/lang/it/admin/statuslabels/message.php
        index 59c51734e2..cd9d0ad0eb 100644
        --- a/resources/lang/it/admin/statuslabels/message.php
        +++ b/resources/lang/it/admin/statuslabels/message.php
        @@ -2,23 +2,24 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        -    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +    'does_not_exist' => 'L\'etichetta di stato non esiste.',
        +    'assoc_assets'	 => 'Questa etichetta di stato è attualmente associata ad almeno un Asset e non può essere cancellata.
        +Per favore aggiorna i tuoi Asset per togliere i riferimenti a questo stato e riprova. ',
         
         
             'create' => array(
        -        'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'La etichetta di stato è creato correttamente.'
        +        'error'   => 'Lo stato non è stato creato, per favore riprova.',
        +        'success' => 'Etichetta di stato creata correttamente.'
             ),
         
             'update' => array(
        -        'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'La etichetta di stato è stato aggiornato correttamente.'
        +        'error'   => 'Lo stato non è stato aggiornato, per favore riprova',
        +        'success' => 'Etichetta di stato aggiornata correttamente.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        -        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        +        'confirm'   => 'Sei sicuro di voler cancellare questo stato?',
        +        'error'   => 'C\'è stato un problema cancellando lo stato. Per favore riprova.',
                 'success' => 'L\'etichetta di stato è stata cancellata correttamente.'
             )
         
        diff --git a/resources/lang/it/admin/users/general.php b/resources/lang/it/admin/users/general.php
        index 67e1e06c19..d539b5eda4 100644
        --- a/resources/lang/it/admin/users/general.php
        +++ b/resources/lang/it/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Bene assegnato a :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Asset assegnato a questo utente',
             'clone'             => 'Clona Utente',
             'contact_user'      => 'Contatta :name',
             'edit'              => 'Modifica Utente',
             'filetype_info'     => 'I formati di file permessi sono png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, e rar.',
             'history_user'      => 'Storico di :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Ultimo accesso',
             'ldap_config_text'  => 'Le impostazioni di configurazione di LDAP possono essere trovate su Admin > Impostazioni. La posizione selezionata (facoltativa) verrà impostata per tutti gli utenti importati.',
             'software_user'     => 'Software estratto a :name',
        diff --git a/resources/lang/it/admin/users/message.php b/resources/lang/it/admin/users/message.php
        index c69532ccf8..d3cbbc1a27 100644
        --- a/resources/lang/it/admin/users/message.php
        +++ b/resources/lang/it/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Hai accettato con successo questo prodotto.',
             'declined'                  => 'Hai rifiutato con successo questo prodotto.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Utente già esistente!',
             'user_not_found'            => 'L\'utente [:id] non esite.',
             'user_login_required'       => 'È necessario il campo login',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Utente creato con successo.',
                 'update'    => 'Utente aggiornato con successo.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Utente eliminato con successo.',
                 'ban'       => 'Utente bloccato con successo.',
                 'unban'     => 'Utente sbloccato con successo.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'C\'è stato un problema durante la creazione dell\'utente. Per favore riprova.',
                 'update' => 'C\'è stato un problema durante l\'aggiornamento dell\'utente. Per favore riprova.',
                 'delete' => 'C\'è stato un problema durante la cancellazione dell\'utente. Riprova per favore.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'C\'è stato un problema durante la riabilitazione dell\'utente. Riprova per favore.',
                 'import'    => 'C\'è stato un problema durante l\'importazione degli utenti. Riprova per favore.',
                 'asset_already_accepted' => 'Questo bene è già stato accettato.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Impossibile unirsi al server LDAP. Controlla la configurazione del tuo server LDAP nel file di configurazione LDAP.<br>Errori dal server LDAP: ',
                 'ldap_could_not_search' => 'Impossibile trovare il server LDAP. Controlla la configurazione del tuo server LDAP nel file di configurazione LDAP.<br>Errori dal server LDAP:',
                 'ldap_could_not_get_entries' => 'Impossibile ottenere voci dal server LDAP. Controlla la configurazione del tuo server LDAP nel file di configurazione LDAP.<br>Errori dal server LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/it/admin/users/table.php b/resources/lang/it/admin/users/table.php
        index 700ca64e66..5035d26924 100644
        --- a/resources/lang/it/admin/users/table.php
        +++ b/resources/lang/it/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Attivo',
             'allow'  				=> 'Consenti',
             'checkedout'  			=> 'Beni',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Posizione',
             'lock_passwords'		=> 'Dettagli di login non possono essere cambiati in questa installazione.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nome',
             'notes'                 => 'Note',
             'password_confirm' 		=> 'Conferma password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Visualizza utenti attuali',
             'show_deleted'          => 'Visualizza utenti eliminati',
             'title' 				=> 'Titolo',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Aggiornamento utente',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Questo è usato solo per Active Directory vincolante, non per il login.)',
             'cloneuser'             => 'Clona Utente',
             'viewusers' 			=> 'Visualizza utenti',
        diff --git a/resources/lang/it/auth/general.php b/resources/lang/it/auth/general.php
        index bf88cba77a..72bf3099c1 100644
        --- a/resources/lang/it/auth/general.php
        +++ b/resources/lang/it/auth/general.php
        @@ -1,12 +1,12 @@
         <?php
         
         return [
        -    'send_password_link'	        => 'Send Password Reset Link',
        -    'email_reset_password'			=> 'Email Password Reset',
        -    'reset_password'			    => 'Reset Password',
        -    'login'                         => 'Login',
        -    'login_prompt'                  => 'Please Login',
        -    'forgot_password'               => 'I forgot my password',
        -    'remember_me'                   => 'Remember Me',
        +    'send_password_link'	        => 'Invia il link per reimpostare la password',
        +    'email_reset_password'			=> 'Reimposta email password',
        +    'reset_password'			    => 'Reimposta Password',
        +    'login'                         => 'Accedi',
        +    'login_prompt'                  => 'Per favore accedi',
        +    'forgot_password'               => 'Password dimenticata',
        +    'remember_me'                   => 'Ricordami',
             ];
         
        diff --git a/resources/lang/it/auth/message.php b/resources/lang/it/auth/message.php
        index f52d4fd69f..5909813358 100644
        --- a/resources/lang/it/auth/message.php
        +++ b/resources/lang/it/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Questo account non è attivo.',
             'account_suspended'      => 'Questo account è sospeso.',
             'account_banned'         => 'Questo account è bannato.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'C\'è stato un problema durante il tentativo di accesso, riprova.',
        diff --git a/resources/lang/it/button.php b/resources/lang/it/button.php
        index 23611b941a..3c8b6c1f66 100644
        --- a/resources/lang/it/button.php
        +++ b/resources/lang/it/button.php
        @@ -1,16 +1,15 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Azioni',
             'add'    	                => 'Aggiungi Nuovo',
             'cancel'                    => 'Annulla',
        -    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'checkin_and_delete'  	    => 'Seleziona e cancella utente',
             'delete'  	                => 'Cancella',
             'edit'    	                => 'Modifica',
             'restore' 	                => 'Ripristina',
             'request'                   => 'Richiesta',
             'submit'  	                => 'Invia',
             'upload'                    => 'Carica / Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/it/general.php b/resources/lang/it/general.php
        index 0ff169ad20..186cbb7def 100644
        --- a/resources/lang/it/general.php
        +++ b/resources/lang/it/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Report degli Asset',
             'asset_tag'				=> 'Tag Asset',
             'assets_available'		=> 'Asset Disponibili',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Asset',
             'avatar_delete'         => 'Cancella Avatar',
             'avatar_upload'         => 'Carica Avatar',
             'back'      			=> 'Indietro',
             'bad_data'      		=> 'Non è stato trovato nulla. Forse informazioni errate?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'annulla',
             'categories'			=> 'Categorie',
             'category'				=> 'Categoria',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Modifica indirizzo email',
             'changepassword'  		=> 'Modifica password',
             'checkin'  				=> 'Carica',
             'checkin_from'  		=> 'Carica da',
             'checkout'  			=> 'Scarica',
             'city'  				=> 'Città',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Aziende',
             'company'				=> 'Azienda',
        -    'component'			=> 'Component',
        -    'components'			=> 'Components',
        +    'component'			=> 'Componente',
        +    'components'			=> 'Componenti',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumabile',
             'consumables'			=> 'Consumabili',
             'country'  				=> 'Paese',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'Asset creato',
             'created_at' 			=> 'Creato il',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Attuale',
             'custom_report'         => 'Report assets personalizzato',
             'dashboard'				=> 'Pannello amministrativo',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Data',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'elimina',
             'deleted'  				=> 'Eliminata',
             'delete_seats'  		=> 'Posti Cancellati',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Distribuita',
             'depreciation_report'	=> 'Report degli Obsoleti',
             'download'				=> 'Scarica',
        @@ -85,8 +97,9 @@
             'asset_maintenances'       => 'Manutenzione Prodotto',
             'item'  				=> 'Articolo',
             'insufficient_permissions' => 'Permessi Insufficienti!',
        -    'language'				=> 'Language',
        +    'language'				=> 'Lingua',
             'last'					=> 'Ultimo',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Cognome',
             'license'				=> 'Licenza',
             'license_report'        => 'Report Licenze',
        @@ -110,7 +123,9 @@
             'moreinfo'				=> 'Altre informazioni',
             'name'					=> 'Nome',
             'next'					=> 'Successivo',
        -    'new'					=> 'new!',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'nuovo!',
             'no_depreciation'		=> 'Non Obsololeto',
             'no_results'			=> 'Nessun risultato.',
             'no'  					=> 'No',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Precedente',
             'processing'			=> 'In elaborazione',
             'profile'				=> 'Il tuo profilo',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Prezzo d\'acquisto',
        +    'purchase_date'         => 'Data di acquisto',
             'qty'		            => 'Quantità',
             'quantity'		        => 'Quantità',
             'ready_to_deploy'		=> 'Pronto per il rilascio',
        @@ -137,28 +152,32 @@
             'save'  				=> 'Salva',
             'select'				=> 'Seleziona',
             'search'				=> 'Cerca',
        -    'select_category'       => 'Select a Category',
        +    'select_category'       => 'Seleziona una categoria',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Selezionare un tipo di ammortamento',
             'select_location'		=> 'Seleziona una posizione',
             'select_manufacturer'	=> 'Selezionare un produttore',
             'select_model'			=> 'Selezionare un modello',
             'select_supplier'		=> 'Selezionare un fornitore',
             'select_user'			=> 'Selezionare un utente',
        -    'select_date'			=> 'Seleziona la data',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Seleziona stato',
             'select_company'    	=> 'Seleziona Azienda',
             'select_asset'    		=> 'Select Asset',
             'settings'				=> 'Impostazioni',
             'sign_in'				=> 'Accedi',
             'signature'             => 'Signature',
        -    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'some_features_disabled' => 'DEMO: Alcune caratteristiche sono disabilitate in questa modalità.',
             'site_name'				=> 'Nome sito',
             'state'  				=> 'Stato',
             'status_labels'			=> 'Etichetta di Stato',
             'status'    			=> 'Stato',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Fornitore',
             'suppliers'  			=> 'Fornitori',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
        +    'submit'				=> 'Invia',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'Assets totali',
             'total_licenses'		=> 'Totale licenze',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/it/validation.php b/resources/lang/it/validation.php
        index ab4124a6df..b1a7504abc 100644
        --- a/resources/lang/it/validation.php
        +++ b/resources/lang/it/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "il  :attribute è stato accettato.",
        -    "active_url"       => ":attribute non è un URL valido.",
        -    "after"            => ":attribute deve essere una data oltre il  :date.",
        -    "alpha"            => ":attribute può contenere solo lettere.",
        -    "alpha_dash"       => ":attribute può contenere solo lettere numeri e trattini.",
        -    "alpha_num"        => ":attribute può contenere solo lettere e numeri.",
        -    "before"           => ":attribute deve essere una data dopo :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute deve essere tra  :min - :max.",
        -        "file"    => "il :attribute deve essere tra  :min - :max kilobytes.",
        -        "string"  => "il :attribute deve essere tra :min - :max caratteri.",
        -    ),
        -    "confirmed"        => "il :attribute non corrisponde.",
        -    "date"             => "la :attribute non è valida.",
        -    "date_format"      => "il :attribute non corrisponde al :format.",
        -    "different"        => "il :attribute e :other devono essere differenti.",
        -    "digits"           => "il :attribute deve essere :digits digits.",
        -    "digits_between"   => "il  :attribute deve essere tra :min e :max digits.",
        -    "email"            => "il formato del :attribute è invalido.",
        -    "exists"           => ":attribute selezzionato è invalido.",
        -    "email_array"      => "Una o più email sono invalidi.",
        -    "image"            => "il :attribute deve essere un immagine.",
        -    "in"               => "Il selezionato :attribute è invalido.",
        -    "integer"          => "L' :attribute deve essere un numero intero.",
        -    "ip"               => "L' :attribute deve essere un indirizzo IP valido.",
        -    "max"              => array(
        -        "numeric" => "L' :attribute non può essere superiore di :max.",
        -        "file"    => "L' :attribute non può essere maggiore di :max kilobytes.",
        -        "string"  => "L' :attribute non può essere maggiore di :max caratteri.",
        -    ),
        -    "mimes"            => "L' :attribute deve essere un file di type: :values.",
        -    "min"              => array(
        -        "numeric" => "L' :attribute deve essere almeno :min.",
        -        "file"    => "L' :attribute deve essere almeno :min kilobytes.",
        -        "string"  => "L' :attribute deve essere almeno :min caratteri.",
        -    ),
        -    "not_in"           => "L' :attribute selezionato è invalido.",
        -    "numeric"          => "L' :attribute deve essere un numero.",
        -    "regex"            => "Il formato dell' :attribute è invalido.",
        -    "required"         => "Il campo :attribute è obblogatorio.",
        -    "required_if"      => "L' :attribute è richiesto quando :other è :value.",
        -    "required_with"    => "Il campo :attribute è richiesto quando :values è presente.",
        -    "required_without" => "Il campo :attribute è richiesto quando :values non è presente.",
        -    "same"             => "L' :attribute e :other devono corrispondere.",
        -    "size"             => array(
        -        "numeric" => "L' :attribute deve essere :size.",
        -        "file"    => "L' :attribute deve essere :size kilobytes.",
        -        "string"  => "L' :attribute deve essere :size characters.",
        -    ),
        -    "unique"           => "L' :attribute è già stato preso.",
        -    "url"              => "Il formato dell' :attribute è invalido.",
        -    "statuslabel_type" => "Devi selezionare un tipo di stato valido",
        -    "unique_undeleted" => "L'attributo deve essere univoco.",
        +    'accepted'             => 'il  :attribute è stato accettato.',
        +    'active_url'           => ':attribute non è un URL valido.',
        +    'after'                => ':attribute deve essere una data oltre il  :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute può contenere solo lettere.',
        +    'alpha_dash'           => ':attribute può contenere solo lettere numeri e trattini.',
        +    'alpha_num'            => ':attribute può contenere solo lettere e numeri.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute deve essere una data dopo :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute deve essere tra  :min - :max.',
        +        'file'    => 'il :attribute deve essere tra  :min - :max kilobytes.',
        +        'string'  => 'il :attribute deve essere tra :min - :max caratteri.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'il :attribute non corrisponde.',
        +    'date'                 => 'la :attribute non è valida.',
        +    'date_format'          => 'il :attribute non corrisponde al :format.',
        +    'different'            => 'il :attribute e :other devono essere differenti.',
        +    'digits'               => 'il :attribute deve essere :digits digits.',
        +    'digits_between'       => 'il  :attribute deve essere tra :min e :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'il formato del :attribute è invalido.',
        +    'exists'               => ':attribute selezzionato è invalido.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'il :attribute deve essere un immagine.',
        +    'in'                   => 'Il selezionato :attribute è invalido.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'L\' :attribute deve essere un numero intero.',
        +    'ip'                   => 'L\' :attribute deve essere un indirizzo IP valido.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'L\' :attribute non può essere superiore di :max.',
        +        'file'    => 'L\' :attribute non può essere maggiore di :max kilobytes.',
        +        'string'  => 'L\' :attribute non può essere maggiore di :max caratteri.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'L\' :attribute deve essere un file di type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'L\' :attribute deve essere almeno :min.',
        +        'file'    => 'L\' :attribute deve essere almeno :min kilobytes.',
        +        'string'  => 'L\' :attribute deve essere almeno :min caratteri.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'L\' :attribute selezionato è invalido.',
        +    'numeric'              => 'L\' :attribute deve essere un numero.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Il formato dell\' :attribute è invalido.',
        +    'required'             => 'Il campo :attribute è obblogatorio.',
        +    'required_if'          => 'L\' :attribute è richiesto quando :other è :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Il campo :attribute è richiesto quando :values è presente.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Il campo :attribute è richiesto quando :values non è presente.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'L\' :attribute e :other devono corrispondere.',
        +    'size'                 => [
        +        'numeric' => 'L\' :attribute deve essere :size.',
        +        'file'    => 'L\' :attribute deve essere :size kilobytes.',
        +        'string'  => 'L\' :attribute deve essere :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'L\' :attribute è già stato preso.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Il formato dell\' :attribute è invalido.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Il campo :attribute contiene un carattere che non è permesso.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/ja/admin/asset_maintenances/message.php b/resources/lang/ja/admin/asset_maintenances/message.php
        index f12895af69..5c304861eb 100644
        --- a/resources/lang/ja/admin/asset_maintenances/message.php
        +++ b/resources/lang/ja/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => '資産管理を作成できませんでした。もう一度試して下さい。',
                     'success' => '資産管理の作成に成功しました。'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => '不完全です。',
                 'warranty'                     => '保証',
                 'not_warranty'                 => '無保証',
        diff --git a/resources/lang/ja/admin/asset_maintenances/table.php b/resources/lang/ja/admin/asset_maintenances/table.php
        index 78a2d50e9a..5dd208f79f 100644
        --- a/resources/lang/ja/admin/asset_maintenances/table.php
        +++ b/resources/lang/ja/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => '資産管理',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => '資産名',
                 'is_warranty'   => '保証書',
                 'dl_csv'        => 'CSVダウンロード'
             ];
        diff --git a/resources/lang/ja/admin/categories/general.php b/resources/lang/ja/admin/categories/general.php
        index 6796d8e4b6..69b185d01e 100644
        --- a/resources/lang/ja/admin/categories/general.php
        +++ b/resources/lang/ja/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'カテゴリについて',
        +    'about_categories'  				=> 'カテゴリーはアイテムを整理するのに役立ちます。カテゴリーの例としては &quot;デスクトップ&quot;、&quot; ラップトップ&quot;、&quot; 携帯電話 &quot;、&quot; タブレット&quot; などがあります。資産カテゴリは任意に設定することができます。',
             'asset_categories' 					=> '資産カテゴリー',
             'category_name'  					=> 'カテゴリー名',
             'checkin_email'                     => 'チェックインの時に利用者へメールを送信',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'カテゴリを編集',
             'eula_text'							=> 'EULAカテゴリー',
             'eula_text_help'					=> 'このフィールドは特殊なタイプの資産のためにEULAをカスタマイズすることが許可されています。全ての資産に一つだけEULAを適用する場合、以下の初期値を利用するにチェックすることも可能です。',
        +    'name'                              => 'カテゴリー名',
             'require_acceptance'				=> 'このカテゴリの資産を承認するための利用者が必要です。',
             'required_acceptance'				=> 'このアイテムを承認すると、この利用者にメールが送信されます。',
             'required_eula'						=> 'この利用者はEULAのコピーをメールで受信します。',
        diff --git a/resources/lang/ja/admin/categories/message.php b/resources/lang/ja/admin/categories/message.php
        index ee53030cf9..758e9afb36 100644
        --- a/resources/lang/ja/admin/categories/message.php
        +++ b/resources/lang/ja/admin/categories/message.php
        @@ -4,7 +4,7 @@ return array(
         
             'does_not_exist' => 'カテゴリーが存在しません。',
             'assoc_models'	 => 'このカテゴリーは1つ以上の型番に関連付けられているため削除できません。このカテゴリーを参照しないようにモ型番を更新して再度実行してください。 ',
        -    'assoc_items'	 => 'このカテゴリーは1つ以上の資産に関連付けられているため削除できません。このカテゴリーを参照しないようにモ資産を更新して再度実行してください。 ',
        +    'assoc_items'	 => 'このカテゴリーは1つ以上の資産に関連付けられているため削除できません。このカテゴリーを参照しないように資産を更新して、再度実行してください。 ',
         
             'create' => array(
                 'error'   => 'カテゴリーが作成されていません。再度実行してください。',
        diff --git a/resources/lang/ja/admin/companies/general.php b/resources/lang/ja/admin/companies/general.php
        index beca43545d..6ae4173953 100644
        --- a/resources/lang/ja/admin/companies/general.php
        +++ b/resources/lang/ja/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => '企業について',
        +    'about_companies_text'                  => '会社フィールドは単純な識別子フィールドとして使用することができます。また、資産、ユーザーなどの権限を制限する設定も管理者が設定できます。',
             'select_company' => '所属を選択',
         ];
        diff --git a/resources/lang/ja/admin/consumables/general.php b/resources/lang/ja/admin/consumables/general.php
        index ca33f24ea3..89c2a122a7 100644
        --- a/resources/lang/ja/admin/consumables/general.php
        +++ b/resources/lang/ja/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> '消耗品について',
             'about_consumables_text'  			=> '消耗品は購入時から使い切るまで存在します。例えば、プリンターのインクやコピー用紙など',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'ユーザーにチェックアウト',
             'consumable_name'                   => '消耗品名',
             'create'                            => '消耗品を作成',
             'item_no'                           => 'Item No.',
        diff --git a/resources/lang/ja/admin/custom_fields/general.php b/resources/lang/ja/admin/custom_fields/general.php
        index 152191be43..7e01138f49 100644
        --- a/resources/lang/ja/admin/custom_fields/general.php
        +++ b/resources/lang/ja/admin/custom_fields/general.php
        @@ -6,17 +6,17 @@ return array(
             'about_fieldsets_title'		=> 'フィールドセットについて',
             'about_fieldsets_text'		=> 'フィールドセットでは、頻繁に利用されるカスタム フィールドのグループを作成することができます。
         よく',
        -    'custom_format'             => 'Custom format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        -    'encrypted'      	        => 'Encrypted',
        +    'custom_format'             => 'カスタムフォーマット',
        +    'encrypt_field'      	        => 'このフィールドの値をデータベースにて暗号化する',
        +    'encrypt_field_help'      => '警告: 暗号化フィールドは検索することができなくなります。',
        +    'encrypted'      	        => '暗号化',
             'fieldset'      	        => 'フィールドセット',
             'qty_fields'      	      => '数量フィールド',
             'fieldsets'      	        => 'フィールドセット',
             'fieldset_name'           => 'フィールドセット名',
             'field_name'              => 'フィールド名',
        -    'field_values'            => 'Field Values',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values'            => 'フィールド値',
        +    'field_values_help'       => '選択可能なオプションを1行に1つ追加します。最初の行以外の空白行は無視されます。',
             'field_element'           => 'フォームエレメント',
             'field_element_short'     => 'エレメント',
             'field_format'            => 'フォーマット',
        @@ -27,5 +27,5 @@ return array(
             'order'   		            => '順番',
             'create_fieldset'         => '新しいフィールドセット',
             'create_field'            => '新しいユーザー設定フィールド',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'value_encrypted'      	        => 'このフィールドの値は、データベースで暗号化されます。管理者ユーザーのみが復号化された値を表示することができます。',
         );
        diff --git a/resources/lang/ja/admin/custom_fields/message.php b/resources/lang/ja/admin/custom_fields/message.php
        index 5fd1a66f1a..3ab0c4f669 100644
        --- a/resources/lang/ja/admin/custom_fields/message.php
        +++ b/resources/lang/ja/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'フィールドセットは作成されませんでした。もう一度やり直してください。',
        diff --git a/resources/lang/ja/admin/departments/message.php b/resources/lang/ja/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/ja/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ja/admin/departments/table.php b/resources/lang/ja/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/ja/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/ja/admin/depreciations/general.php b/resources/lang/ja/admin/depreciations/general.php
        index 7869acf5b1..a0395ecf29 100644
        --- a/resources/lang/ja/admin/depreciations/general.php
        +++ b/resources/lang/ja/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> '資産の減価償却について',
             'about_depreciations'  					=> '定額法に基づいて資産の減価償却を設定することができます。',
             'asset_depreciations'  					=> '償却資産',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => '減価償却の作成',
             'depreciation_name'  					=> '減価償却名',
             'number_of_months'  					=> '月数',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => '減価償却の更新',
         
         );
        diff --git a/resources/lang/ja/admin/groups/titles.php b/resources/lang/ja/admin/groups/titles.php
        index b57dc6d274..4873dcf3b0 100644
        --- a/resources/lang/ja/admin/groups/titles.php
        +++ b/resources/lang/ja/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'グループについて',
        +    'about_groups'                  => 'グループを使用して、ユーザーへのアクセス許可を管理します。',
             'group_management' 	 	=> 'グループ管理',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => '新規グループ作成',
        +    'update' 	 		        => 'グループを編集',
             'group_name' 	 		=> 'グループ名',
             'group_admin' 	 		=> 'グループ管理',
             'allow' 	 			=> '許可',
        diff --git a/resources/lang/ja/admin/hardware/form.php b/resources/lang/ja/admin/hardware/form.php
        index 7ba10d5826..e528b3713e 100644
        --- a/resources/lang/ja/admin/hardware/form.php
        +++ b/resources/lang/ja/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> '資産の一括削除',
           'bulk_delete_help'	=> '以下の資産が一括削除されます。削除後のデータは戻すことができませ',
           'bulk_delete_warn'	=> ':asset_cont 件の資産を削除しました',
         	'bulk_update'		=> '資産を一括更新',
        diff --git a/resources/lang/ja/admin/hardware/general.php b/resources/lang/ja/admin/hardware/general.php
        index c66db46886..a7d33fd7c1 100644
        --- a/resources/lang/ja/admin/hardware/general.php
        +++ b/resources/lang/ja/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => '資産について',
        +    'about_assets_text'            => '資産はシリアル番号や資産タグで追跡します。資産は特定することが重要な、高価な物であることが多いです。',
         	'archived'  				=> 'アーカイブ',
             'asset'  					=> '資産',
             'bulk_checkout'             => '利用者に資産をチェックアウトする',
             'checkin'  					=> '資産をチェックイン',
        -    'checkout'  				=> '利用者に資産をチェックアウト',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> '資産を複製',
             'deployable'  				=> '配備可能',
             'deleted'  					=> 'この資産は削除されました。<a href="/hardware/:asset_id/restore">復元するにはココをクリックして下さい。</a>',
        @@ -15,7 +15,7 @@ return array(
         	'filetype_info'				=> '許可するファイルタイプ(png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar)',
             'model_deleted'  			=> 'この資産型番は削除されました。資産を戻すためには型番を復元する必要があります。<br/> <a href="/hardware/models/:model_id/restore">型番を復元するにはココをクリックして下さい。</a>',
             'requestable'               => '要求可能',
        -    'requested'				    => 'Requested',
        +    'requested'				    => '要求済',
             'restore'  					=> '資産を復元',
             'pending'  					=> 'ペンディング',
             'undeployable'  			=> '配備不可',
        diff --git a/resources/lang/ja/admin/hardware/message.php b/resources/lang/ja/admin/hardware/message.php
        index e97722de9c..0e55642a15 100644
        --- a/resources/lang/ja/admin/hardware/message.php
        +++ b/resources/lang/ja/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> '資産は正常に復元されました。'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'ファイルが削除できませんでした。もう一度、やり直して下さい。',
                 'success' => 'ファイルは正常に削除されました。',
        @@ -37,17 +43,18 @@ return array(
             ),
         
             'import' => array(
        -        'error'                 => 'Some items did not import correctly.',
        -        'errorDetail'           => 'The following Items were not imported because of errors.',
        -        'success'               => "Your file has been imported",
        -        'file_delete_success'   => "Your file has been been successfully deleted",
        -        'file_delete_error'      => "The file was unable to be deleted",
        +        'error'                 => 'いくつかの項目は正しくインポートされませんでした。',
        +        'errorDetail'           => '以下のアイテムはエラーのためインポートできませんでした',
        +        'success'               => "ファイルはインポートされました。",
        +        'file_delete_success'   => "ファイルを削除しました。",
        +        'file_delete_error'      => "ファイルが削除出来ませんでした。",
             ),
         
         
             'delete' => array(
                 'confirm'   	=> 'この資産を削除してもよろしいですか?',
                 'error'   		=> '資産を削除する際に問題が発生しました。もう一度やり直して下さい。',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> '資産は正常に削除されました。'
             ),
         
        @@ -55,7 +62,7 @@ return array(
                 'error'   		=> '資産はチェックアウトされませんでした。もう一度、やり直して下さい。',
                 'success' 		=> '資産は正常にチェックアウトされました。',
                 'user_does_not_exist' => 'その利用者は不正です。もう一度、やり直して下さい。',
        -        'not_available' => 'That asset is not available for checkout!'
        +        'not_available' => 'この資産はチェックアウトできません!'
             ),
         
             'checkin' => array(
        @@ -69,7 +76,7 @@ return array(
             'requests' => array(
                 'error'   		=> '資産は要求されませんでした。もう一度、やり直して下さい。',
                 'success' 		=> '資産の要求処理が成功しました。',
        -        'canceled'      => 'Checkout request successfully canceled'
        +        'canceled'      => 'チェックアウトリクエストが正常にキャンセルされました。'
             )
         
         );
        diff --git a/resources/lang/ja/admin/licenses/general.php b/resources/lang/ja/admin/licenses/general.php
        index e909443727..bfe6aa199f 100644
        --- a/resources/lang/ja/admin/licenses/general.php
        +++ b/resources/lang/ja/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'ライセンスについて',
        +    'about_licenses'                  => 'ライセンスはソフトウェアの追跡に使用されます。指定した数を個人にチェックアウトすることができます。',
             'checkin'  					=> 'ライセンスシートをチェックイン',
             'checkout_history'  		=> '履歴をチェックアウト',
             'checkout'  				=> 'ライセンスシートをチェックアウト',
        diff --git a/resources/lang/ja/admin/licenses/message.php b/resources/lang/ja/admin/licenses/message.php
        index 37bd4859a1..8181883e00 100644
        --- a/resources/lang/ja/admin/licenses/message.php
        +++ b/resources/lang/ja/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'ファイルがアップロードできませんでした。もう一度、やり直して下さい。',
                 'success' => 'ファイルがアップロードされました。',
                 'nofiles' => 'アップロードするファイルが選択されていないか、アップロードしようとしているファイルが大き過ぎます。',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'ファイルサイズが大きすぎるか、許可されていない形式です。(png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, lic)',
             ),
         
             'update' => array(
        diff --git a/resources/lang/ja/admin/locations/table.php b/resources/lang/ja/admin/locations/table.php
        index 5be9b6c78b..00da178160 100644
        --- a/resources/lang/ja/admin/locations/table.php
        +++ b/resources/lang/ja/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => '設置場所について',
        +    'about_locations'           => '設置場所はユーザー、資産、およびその他のアイテムの情報追跡に使用されます。',
             'assets_rtd'                => '資産', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => '資産割当先',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'ロケーション',
             'parent'                    => '上位',
             'currency'                  => '現地通貨',
        +    'ldap_ou'                   => 'LDAP OU を検索',
             );
        diff --git a/resources/lang/ja/admin/manufacturers/table.php b/resources/lang/ja/admin/manufacturers/table.php
        index 65274a9fc7..d2fdf133c7 100644
        --- a/resources/lang/ja/admin/manufacturers/table.php
        +++ b/resources/lang/ja/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'メーカーについて',
        +    'about_manufacturers_text'  => 'メーカーは、あなたの資産を製造する会社です。重要なサポート連絡先は、資産の詳細ページに表示されます。',
             'asset_manufacturers'	=> '資産製造業者',
             'create'				=> '製造業者を作成',
             'id'   					=> 'ID',
        -    'name'      			=> '製造業者名',
        +    'name'      			=> '名前',
        +    'support_email'   		=> 'サポート Eメール',
        +    'support_phone'   		=> 'サポート 電話番号',
        +    'support_url'   		=> 'サポート URL',
             'update'				=> '製造業者を更新',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/ja/admin/models/general.php b/resources/lang/ja/admin/models/general.php
        index 7b8b1b40c5..9d5b48e9d5 100644
        --- a/resources/lang/ja/admin/models/general.php
        +++ b/resources/lang/ja/admin/models/general.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => '資産モデルについて',
        +    'about_models_text'           => '資産モデルは、同一資産をグループ化する方法です。(例:「MBP 2013」、「IPhone 6」など)',
             'deleted'  					        => 'この型番は削除されました。<a href="/hardware/models/:model_id/restore">元に戻すにはココをクリックして下さい。</a>.',
             'restore'                   => '型番を復元',
        -    'requestable'               => 'Users may request this model',
        +    'requestable'               => 'ユーザーはこのモデルをリクエスト出来ます',
         	'show_mac_address'			      => 'この型番の資産にMACアドレスフィールドを表示',
             'view_deleted'              => '削除したものを表示',
             'view_models'               => '型番を表示',
        diff --git a/resources/lang/ja/admin/models/message.php b/resources/lang/ja/admin/models/message.php
        index 3f33af1999..cbb9fbe7ab 100644
        --- a/resources/lang/ja/admin/models/message.php
        +++ b/resources/lang/ja/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> '型番は復元されました。'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/ja/admin/settings/general.php b/resources/lang/ja/admin/settings/general.php
        index 7b0111384e..c6f89317f0 100644
        --- a/resources/lang/ja/admin/settings/general.php
        +++ b/resources/lang/ja/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'アラートを無視する期間',
         	'alert_inv_threshold'		=> 'インベントリのアラート間隔',
         	'asset_ids'					=> '資産ID',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> '資産IDを自動採番で生成',
         	'auto_increment_prefix'		=> 'プレフィクス (オプション)',
         	'auto_incrementing_help'    => 'この初期値を使って資産IDの自動採番を有効化',
        @@ -51,8 +55,8 @@ return array(
             'ldap_pword'                => 'LDAP バインド パスワード',
             'ldap_basedn'               => 'LDAP 検索ベース DN',
             'ldap_filter'               => 'LDAP フィルター',
        -    'ldap_pw_sync'              => 'LDAP Password Sync',
        -    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_pw_sync'              => 'LDAP パスワード同期',
        +    'ldap_pw_sync_help'         => 'LDAPパスワードをローカルパスワードと同期させない場合は、このチェックボックスをオフにします。これをオフにすると、何らかの理由でLDAPサーバーにアクセスできない場合、ユーザーがログインできなくなる可能性があります。',
             'ldap_username_field'       => 'ユーザー名フィールド',
             'ldap_lname_field'          => '姓',
             'ldap_fname_field'          => 'LDAP 名',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP メール',
             'load_remote_text'          => 'リモートスクリプト',
             'load_remote_help_text'		=> 'Snipe-ITのインストールは、外部からスクリプトを読み込むことが可能です。',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'ロゴ',
             'full_multiple_companies_support_help_text' => 'ユーザー (管理者を含む) に 資産の割り当て を制限します。',
             'full_multiple_companies_support_text' => '複数企業をサポートします。',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHPバージョン',
             'php_gd_info'               => 'QRコードを表示するためにphp-gdをインストールする必要があります。インストールインストラクションを参照して下さい。',
             'php_gd_warning'            => 'PHP Image Processing および GD plugin が、インストールされていません。',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'QRコードを有効化',
             'qr_text'                   => 'QRコードテキスト',
             'setting'                   => '設定',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'これらの設定は、あなたのインストレーションの特性に合わせてカスタマイズできます。',
             'labels_per_page'           => 'ページあたりのラベル数',
             'label_dimensions'          => 'ラベルの大きさ (インチ)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'ページ マージン',
             'purge'                    => 'データレコードを消去',
             'labels_display_bgutter'    => 'ラベル 下余白',
        @@ -104,25 +117,27 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => '2段階認証',
        +    'two_factor_secret'        => '二段階認証コード',
        +    'two_factor_enrollment'        => '二段階認証登録',
        +    'two_factor_enabled_text'        => '二段階認証を有効',
        +    'two_factor_reset'        => '二段階認証をリセット',
        +    'two_factor_reset_help'        => 'ユーザーはGoogle Authenticatorでデバイスを再度登録する必要があります。これは、現在登録されているデバイスを紛失または盗難した場合に便利です。 ',
        +    'two_factor_reset_success'          => '二段階認証は正常にリセットされました。',
        +    'two_factor_reset_error'          => '二段階認証のデバイスリセットに失敗しました。',
        +    'two_factor_enabled_warning'        => '二段階認証を有効にすると、Google Authenticatorでの認証が強制されます。あなたがお持ちのデバイスを登録することができます。',
        +    'two_factor_enabled_help'        => 'これにより、Google Authenticatorを使用した2要素認証が有効になります。',
        +    'two_factor_optional'        => '選択可能(ユーザーは自由に有効・無効にできます)',
        +    'two_factor_required'        => '全てのユーザーに必須',
        +    'two_factor_disabled'        => '無効',
        +    'two_factor_enter_code'	=> '二段階認証コードを入力',
        +    'two_factor_config_complete'	=> '送信',
        +    'two_factor_enabled_edit_not_allowed' => '管理者はこの設定を編集することを許可していません。',
        +    'two_factor_enrollment_text'	=> "二段階認証の登録が必要ですが、あなたのデバイスはまだ登録されていません。Google Authenticatorアプリを開き、下のQRコードをスキャンして端末を登録してください。端末を登録したら以下のコードを入力してください。",
        +    'require_accept_signature'      => 'シグネチャリクエスト',
        +    'require_accept_signature_help_text'      => 'この機能を有効にするには、ユーザーが資産を受け入れる際に物理的にサインオフする必要があります。',
             'left'        => '左',
             'right'        => '右',
             'top'        => '上',
        diff --git a/resources/lang/ja/admin/statuslabels/table.php b/resources/lang/ja/admin/statuslabels/table.php
        index 2c0291fcc8..4da97c2a40 100644
        --- a/resources/lang/ja/admin/statuslabels/table.php
        +++ b/resources/lang/ja/admin/statuslabels/table.php
        @@ -4,13 +4,13 @@ return array(
             'about'      	=> 'ステータスラベルについて',
             'archived'      	=> 'アーカイブ',
             'create'      	=> 'ステータスラベルを作成',
        -    'color'      	=> 'Chart Color',
        +    'color'      	=> 'グラフの色',
             'deployable'      	=> '配備可能',
             'info'      	=> 'ステータスラベルは資産の様々な状態の説明に利用されます。修理中であったり、紛失/盗難かもしれません。資産を配備可能、ペンディング、保管といった新しいステータスラベルを作成できます。',
             'name'      	=> 'ステータス名',
             'pending'      	=> '保留中',
             'status_type'   => 'ステータスタイプ',
        -    'show_in_nav'   => 'Show in side nav',
        +    'show_in_nav'   => 'サイドバーの表示',
             'title'      	=> 'ステータスラベル',
             'undeployable'  => '配備不可',
             'update'      	=> 'ステータスラベルを更新',
        diff --git a/resources/lang/ja/admin/suppliers/table.php b/resources/lang/ja/admin/suppliers/table.php
        index 5d89c983bb..cd6de4f9d5 100644
        --- a/resources/lang/ja/admin/suppliers/table.php
        +++ b/resources/lang/ja/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => '仕入先について',
        +    'about_suppliers_text'  => '仕入先は、アイテムの追跡に使用されます。',
             'address'               => '仕入先住所',
             'assets'                => '資産',
             'city'                  => '市区町村',
        diff --git a/resources/lang/ja/admin/users/general.php b/resources/lang/ja/admin/users/general.php
        index 416cf1b14c..87c4bd03dc 100644
        --- a/resources/lang/ja/admin/users/general.php
        +++ b/resources/lang/ja/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => ':name に資産を割り当てる',
        +    'bulk_update_warn'	=> ': user_count 人のプロパティを編集しようとしています。このフォームを使用してユーザー属性を変更することはできません。ユーザー個別に編集をする必要があります。',
        +    'bulk_update_help'	=> 'このフォームは一度に複数利用者を更新することが可能です。変更が必要なフィールドにのみ入力をして下さい。空白のフィールドは変更されません。',
             'current_assets'    => '資産をこのユーザーにチェック アウト',
             'clone'             => '利用者を複製',
             'contact_user'      => ':name にコンタクト',
             'edit'              => '利用者を編集',
             'filetype_info'     => '許可するファイルタイプ(png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar)',
             'history_user'      => ':nameの履歴',
        +	'info'				=> '情報',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => '最終ログイン',
             'ldap_config_text'  => 'LDAP 構成設定 管理者 > 設定。 選択した場所は、インポートされたすべてのユーザーに対して設定されます。',
             'software_user'     => 'ソフトウェアは :name にチェックアウトしました。',
             'view_user'         => '利用者 :name を表示',
             'usercsv'           => 'CSVファイル',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => '現在の管理者設定では、2段階認証は任意です。  ',
        +    'two_factor_enrolled' => '二段階認証デバイスの登録 ',
        +    'two_factor_active'   => '二段階認証有効 ',
             );
        diff --git a/resources/lang/ja/admin/users/message.php b/resources/lang/ja/admin/users/message.php
        index 6048e70a56..15aeeb7601 100644
        --- a/resources/lang/ja/admin/users/message.php
        +++ b/resources/lang/ja/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'この資産を承認しました。',
             'declined'                  => 'この資産を却下しました。',
        +    'bulk_manager_warn'	        => 'あなたの利用者は正常に更新されました。しかしながら、あなたの管理者エントリーは保存されませんでした。あなたが選択した管理者が、編集対象の利用者一覧に選択されていたため更新されませんでした。および利用者は彼ら自身の管理者でない場合があります。再度、管理者を除いた上で、あなたの利用者を選択してください。',
             'user_exists'               => '利用者が既に存在しています!',
             'user_not_found'            => '利用者 [:id] は、存在していません。',
             'user_login_required'       => 'ログインフィールドが必要です。',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => '利用者が正常に作成されました。',
                 'update'    => '利用者が正常に更新されました。',
        +        'update_bulk'    => '利用者が正常に更新されました!',
                 'delete'    => '利用者が正常に削除されました。',
                 'ban'       => '利用者が正常に禁止されました。',
                 'unban'     => '利用者が正常に解禁されました。',
        @@ -29,6 +31,7 @@ return array(
                 'create' => '利用者を作成する際に問題が発生しました。もう一度、やり直して下さい。',
                 'update' => '利用者を更新する際に問題が発生しました。もう一度、やり直して下さい。',
                 'delete' => '利用者を削除する際に問題が発生しました。もう一度、やり直して下さい。',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => '利用者を再開する際に問題が発生しました。もう一度、やり直して下さい。',
                 'import'    => '利用者をインポートする際に問題が発生しました。もう一度、やり直して下さい。',
                 'asset_already_accepted' => 'この資産は既に承認されています。',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'LDAPサーバーにバインドできません。LDAP設定ファイル内のサーバー設定を確認して下さい。<br> LDAPサーバーからのエラー: ',
                 'ldap_could_not_search' => 'LDAPサーバーを検索できません。LDAP設定ファイル内のサーバー設定を確認して下さい。<br> LDAPサーバーからのエラー:',
                 'ldap_could_not_get_entries' => 'LDAPサーバーからエンティティを取得できません。LDAP設定ファイル内のサーバー設定を確認して下さい。<br> LDAPサーバーからのエラー:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/ja/admin/users/table.php b/resources/lang/ja/admin/users/table.php
        index 6080019692..cc97c568a0 100644
        --- a/resources/lang/ja/admin/users/table.php
        +++ b/resources/lang/ja/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> '有効',
             'allow'  				=> '許可',
             'checkedout'  			=> '資産',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'ロケーション:',
             'lock_passwords'		=> 'ログイン時の詳細設定はインストール時に変更することは出来ません。',
             'manager' 				=> 'マネージャー',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> '名前',
             'notes'                 => '備考',
             'password_confirm' 		=> 'パスワードを確認',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => '現在のユーザーを表示',
             'show_deleted'          => '削除されたユーザーを表示',
             'title' 				=> '役職',
        +	'to_restore_them'		=> 'それらを復元します。',
             'updateuser' 			=> '利用者を更新',
             'username' 				=> 'ユーザ名',
        +	'user_deleted_text' 	=> 'この利用者は、削除済みとしてマークされています。',
             'username_note' 		=> '(Windows統合認証のみを利用する。)',
             'cloneuser'             => '利用者を複製',
             'viewusers' 			=> '利用者を表示',
        diff --git a/resources/lang/ja/auth/message.php b/resources/lang/ja/auth/message.php
        index e6cd7bddc4..a55b98e865 100644
        --- a/resources/lang/ja/auth/message.php
        +++ b/resources/lang/ja/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'このユーザーアカウントは有効化されていません。',
             'account_suspended'      => 'このユーザーアカウントは停止中です。',
             'account_banned'         => 'このユーザーアカウントは禁止されています。',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => '複数回ログインに失敗しました。 :minutes 分後に再試行してください。',
         
             'signin' => array(
                 'error'   => 'ログインする際に問題が発生しました。もう一度やり直して下さい。',
        diff --git a/resources/lang/ja/button.php b/resources/lang/ja/button.php
        index 03e5cd11e9..30761ed5fd 100644
        --- a/resources/lang/ja/button.php
        +++ b/resources/lang/ja/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'アクション',
             'add'    	                => '新規追加',
             'cancel'                    => 'キャンセル',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'リクエスト',
             'submit'  	                => '送信',
             'upload'                    => 'アップロード',
        -
        +	'select_file'				=> 'ファイルを選択...',
         );
        diff --git a/resources/lang/ja/general.php b/resources/lang/ja/general.php
        index 889b8ddb89..01ec5ba7a1 100644
        --- a/resources/lang/ja/general.php
        +++ b/resources/lang/ja/general.php
        @@ -1,7 +1,7 @@
         <?php
         
             return [
        -    'accessories'			=> '付属品群',
        +    'accessories'			=> '付属品',
             'activated'			=> 'アクティベート',
             'accessory'				=> '付属品',
             'accessory_report'			=> '付属品レポート',
        @@ -18,42 +18,54 @@
             'asset_report'          => '資産レポート',
             'asset_tag'				=> '資産タグ',
             'assets_available'		=> '利用可能な資産',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> '資産数',
             'avatar_delete'         => 'アバターを削除',
             'avatar_upload'         => 'アバターをアップロード',
             'back'      			=> '戻る',
             'bad_data'      		=> '存在しませんでした。データに誤りがあるかもしれません。',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> '一括チェックアウト',
             'cancel'  				=> 'キャンセル',
             'categories'			=> 'カテゴリー',
             'category'				=> 'カテゴリー',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'メールアドレスを変更',
             'changepassword'  		=> 'パスワードを変更',
             'checkin'  				=> 'チェックイン',
             'checkin_from'  		=> 'チェックイン元',
             'checkout'  			=> 'チェックアウト',
             'city'  				=> '市区町村',
        +	'click_here'			=> 'ここをクリック',
             'companies'			=> '所属',
             'company'				=> '所属',
             'component'			=> '構成部品',
             'components'			=> '構成部品',
        +	'complete'				=> '成功',
             'consumable'			=> '消耗品',
             'consumables'			=> '消耗品数',
             'country'  				=> '国',
             'create'				=> '新規作成',
        -    'created'               => 'Item Created',
        +    'created'               => 'アイテムを作成しました',
             'created_asset'			=> '資産を作成',
             'created_at' 			=> '作成者',
        +    'updated_at' 			=> '更新日',
             'currency'  			=> '¥', // this is deprecated
             'current'  				=> '現在の状況',
             'custom_report'         => '資産レポートをカスタム',
             'dashboard'				=> 'ダッシュボード',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> '日付',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => '警告!',
        +    'debug_warning_text'         => 'このアプリケーションはデバッグモードがONのままプロダクションモードで実行されています。もしアプリケーションが外部からアクセス可能な場合、機密データが抜き取られる可能性があります。<code>.env</code>の<code>APP_DEBUG</code>を<code>false</code>にしてください。',
             'delete'  				=> '削除',
             'deleted'  				=> '削除しました。',
             'delete_seats'  		=> 'ライセンスを削除',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> '配備済',
             'depreciation_report'	=> '減価償却レポート',
             'download'				=> 'ダウンロード',
        @@ -79,7 +91,7 @@
             'image_delete'         	=> '画像を削除',
             'image_upload'         	=> '画像をアップロード',
             'import'         	    => 'インポート',
        -    'import-history'        => 'Import History',
        +    'import-history'        => 'インポート履歴',
             'asset_maintenance'        => '資産管理',
             'asset_maintenance_report' => '資産管理レポート',
             'asset_maintenances'       => '資産管理',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => '権限が不足しています。',
             'language'				=> '言語',
             'last'					=> '最後',
        +    'last_login'            => '最終ログイン',
             'last_name'             => '姓',
             'license'				=> 'ライセンス',
             'license_report'        => 'ライセンスレポート',
        @@ -95,7 +108,7 @@
             'list_all'				=> '全ての一覧',
             'loading'				=> '読み込み中…',
             'lock_passwords'        => 'このフィールドは、インストール中に編集できません。',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'feature_disabled'      => 'この機能は、デモインストールでは無効化されています。',
             'location'              => '設置場所',
             'locations'				=> '設置場所の数',
             'logout'				=> 'ログアウト',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> '詳細',
             'name'					=> '名前',
             'next'					=> '次へ',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> '新規',
             'no_depreciation'		=> '非減価償却資産',
             'no_results'			=> '結果はありません。',
             'no'  					=> 'いいえ',
             'notes'  				=> '備考',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => '注文番号',
             'page_menu'				=> 'メニューアイテムを表示',
             'pagination_info'		=> '開始から終了までのアイテム合計を表示',
             'pending'				=> 'ペンディング',
        @@ -124,8 +139,8 @@
             'previous'				=> '前へ',
             'processing'			=> '処理中',
             'profile'				=> 'あなたのプロファイル',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => '購入費用',
        +    'purchase_date'         => '購入日',
             'qty'		            => '数量',
             'quantity'		        => '数量',
             'ready_to_deploy'		=> '配備完了',
        @@ -133,38 +148,42 @@
             'remove_company'        => '会社の団体を取り除く',
             'reports'				=> 'レポート',
             'requested'				=> '要求済',
        -    'request_canceled'      => 'Request Canceled',
        +    'request_canceled'      => 'リクエストキャンセル',
             'save'  				=> '保存',
             'select'				=> '選択',
             'search'				=> '検索',
             'select_category'       => 'カテゴリを選択',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> '減価償却タイプを選択',
             'select_location'		=> '設置場所を選択',
             'select_manufacturer'	=> '製造元を選択',
             'select_model'			=> 'モデルを選択',
             'select_supplier'		=> '仕入先を選択',
             'select_user'			=> '利用者を選択',
        -    'select_date'			=> '日付を選択',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'ステータスを選択',
             'select_company'    	=> '所属を選択',
             'select_asset'    		=> '資産を選択します。',
             'settings'				=> '設定',
             'sign_in'				=> 'サインイン',
        -    'signature'             => 'Signature',
        +    'signature'             => '署名',
             'some_features_disabled' => 'デモモード : いくつかの機能はこのインストールでは無効化されます',
             'site_name'				=> 'サイト名',
             'state'  				=> '都道府県',
             'status_labels'			=> 'ステータスラベル',
             'status'    			=> 'ステータス',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => '仕入先',
             'suppliers'  			=> '仕入先',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => '削除してもよろしいですか?',
        +    'submit'				=> '送信',
        +    'target'                => '対象',
        +    'time_and_date_display' => '時間と日付を表示',
             'total_assets'			=> '資産の合計',
             'total_licenses'		=> 'ライセンスの合計',
        -    'total_accessories'		=> 'total accessories',
        -    'total_consumables'		=> 'total consumables',
        +    'total_accessories'		=> '合計付属品数',
        +    'total_consumables'		=> '合計消耗品数',
             'type'  				=> 'タイプ',
        -    'undeployable'			=> '未配備',
        +    'undeployable'			=> '配備不可',
             'unknown_admin'			=> '不明な管理者',
             'username_format'		=> 'ユーザー名の書式',
             'update'                => '更新',
        diff --git a/resources/lang/ja/mail.php b/resources/lang/ja/mail.php
        index c9a4fe182d..2f52ddc4e4 100644
        --- a/resources/lang/ja/mail.php
        +++ b/resources/lang/ja/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => 'ユーザーがアイテムリクエストをキャンセルしました。',
        +    'a_user_requested' => 'ユーザーがアイテムをリクエストしています',
        +    'accessory_name' => '付属品名:',
        +    'additional_notes' => '追記:',
        +    'admin_has_created' => '管理者が:web でアカウントを作成しました。',
        +    'asset' => '資産:',
        +    'asset_name' => '資産名:',
        +    'asset_requested' => '資産リクエスト',
        +    'asset_tag' => '資産タグ:',
        +    'assets_warrantee_expiring' => '{1} 資産は60日以内に保証が切れます。|[2,Inf] 資産は60日以内に保証が切れます。',
        +    'assigned_to' => '割り当て先',
        +    'best_regards' => '敬具',
        +    'canceled' => 'キャンセル済:',
        +    'checkin_date' => 'チェックイン日:',
        +    'checkout_date' => 'チェックアウト日:',
        +    'click_to_confirm' => ':web account: を有効にする為に、次のリンクをクリックしてください。',
        +    'click_on_the_link_accessory' => '次のリンクをクリックして、アクセサリーを受け取ったことを確認してください。',
        +    'click_on_the_link_asset' => '次のリンクをクリックして、資産を受け取ったことを確認してください。',
        +    'Confirm_Asset_Checkin' => '資産チェックインを確認します。',
        +    'Confirm_Accessory_Checkin' => 'アクセサリーのチェックインを承認してください。',
        +    'Confirm_accessory_delivery' => 'アクセサリーの受取りを承認してください。',
        +    'Confirm_asset_delivery' => '資産の受取を承認してください。',
        +    'Confirm_consumable_delivery' => '消耗品の受取を承認してください。',
        +    'current_QTY' => '現在の数量',
        +    'Days' => '日数',
        +    'days' => '日数',
        +    'expecting_checkin_date' => 'チェックイン予定日:',
        +    'expires' => '保証失効日',
        +    'Expiring_Assets_Report' => '保証切れ資産レポート',
        +    'Expiring_Licenses_Report' => '有効期限切れのライセンスレポート',
        +    'hello' => 'こんにちは。',
        +    'hi' => 'こんにちは',
        +    'i_have_read' => '私は使用条件を読み、同意し、このアイテムを受け取りました。',
        +    'item' => 'アイテム:',
        +    'items_below_minimum' => '{1}アイテムは最低在庫より少ないか、すぐ最低在庫になります。|[2,Inf] アイテムは最低在庫より少ないか、すぐ最低在庫になります。',
        +    'Item_Request_Canceled' => 'アイテムリクエストがキャンセルされました。',
        +    'Item_Requested' => 'アイテムをリクエストしました',
        +    'licenses_expiring' => '{1} ライセンスは60日後に期限切れとなります。|[2,Inf] ライセンスは60日後に期限切れとなります。',
        +    'link_to_update_password' => '次のリンクをクリックして、パスワードを更新してください。 :web password:',
        +    'login_first_admin' => '以下の新しいログイン情報を使用して、Snipe-ITにログインします。',
        +    'login' => 'ログイン:',
        +    'Low_Inventory_Report' => '在庫減レポート',
        +    'min_QTY' => '分数',
        +    'name' => '名前',
        +    'new_item_checked' => 'あなたの名前で新しいアイテムがチェックアウトされました。詳細は以下の通りです。',
        +    'password' => 'パスワード:',
        +    'password_reset' => 'パスワードリセット',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => '下記の利用規約をお読みください。',
        +    'read_the_terms_and_click' => '下部のリンクをクリックして、利用規約に同意して資産を受け取ったことを承認してください。',
        +    'requested' => '要求済:',
        +    'reset_link' => 'パスワードリセットのリンク',
        +    'reset_password' => 'パスワードをリセットするにはここをクリック:',
        +    'serial' => 'シリアル:',
        +    'supplier' => '仕入先',
        +    'tag' => 'タグ',
        +    'test_email' => 'Snipe-ITからのテストメール',
        +    'test_mail_text' => 'これはSnipe-IT資産管理システムのテストです。あなたがこれを読めているなら、メール機能は動作しています:)',
        +    'the_following_item' => '次の項目がチェックインされています: ',
        +    'There_are' => 'これ {1} |[2、Inf]これら',
        +    'to_reset' => 'パスワードをリセットするには、: web のフォームを完了します:',
        +    'type' => 'タイプ',
        +    'user' => 'ユーザー:',
        +    'username' => 'ユーザー名:',
        +    'welcome' => 'ようこそ、 :name さん',
        +    'welcome_to' => ':web にようこそ!',
        +    'your_credentials' => 'Snipe-IT クレデンシャル',
         );
        diff --git a/resources/lang/ja/validation.php b/resources/lang/ja/validation.php
        index 2e573d1d70..36d936988d 100644
        --- a/resources/lang/ja/validation.php
        +++ b/resources/lang/ja/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute は、承認される必要があります。",
        -    "active_url"       => ":attribute は、有効なURLではありません。",
        -    "after"            => ":attribute は :date よりも後の日付にして下さい。",
        -    "alpha"            => ":attribute は、文字が含まれている必要があります。",
        -    "alpha_dash"       => ":attribute は、文字列、数字、ダッシュ(−)のみ含めることが出来ます。",
        -    "alpha_num"        => ":attribute は、文字列と数字のみ含めることが出来ます。",
        -    "before"           => ":attribute は :date よりも前の日付にして下さい。",
        -    "between"          => array(
        -        "numeric" => ":attribute は :min - :max の範囲内にして下さい。",
        -        "file"    => ":attribute は :min - :max キロバイトの範囲内にして下さい。",
        -        "string"  => ":attribute は :min - :max 文字の範囲内にして下さい。",
        -    ),
        -    "confirmed"        => ":attribute が、一致しませんでした。",
        -    "date"             => ":attribute は、無効な日付です。",
        -    "date_format"      => ":attribute フォーマット :format に一致しません。",
        -    "different"        => ":attribute と :other は、異なっている必要があります。",
        -    "digits"           => ":attribute は :digits 数値にして下さい。",
        -    "digits_between"   => ":attribute は :min - :max 内の数値にして下さい。",
        -    "email"            => ":attribute フォーマットが不正です。",
        -    "exists"           => "選択された :attribute は不正です。",
        -    "email_array"      => "指定の電子メールアドレスは無効です。",
        -    "image"            => ":attribute は画像にして下さい。",
        -    "in"               => "選択された :attribute は不正です。",
        -    "integer"          => ":attribute は整数にして下さい。",
        -    "ip"               => ":attribute は有効なIPアドレスにして下さい。",
        -    "max"              => array(
        -        "numeric" => ":attribute は :max 以上にして下さい。",
        -        "file"    => ":attribute は :max キロバイト以上にして下さい。",
        -        "string"  => ":attribute は :max 文字以上にして下さい。",
        -    ),
        -    "mimes"            => ":attribute は ファイルタイプ :values にして下さい。",
        -    "min"              => array(
        -        "numeric" => ":attribute は、少なくとも :min 以上にして下さい。",
        -        "file"    => ":attribute は、少なくとも :min キロバイト以上にして下さい。",
        -        "string"  => ":attribute は、少なくとも :min 文字以上にして下さい。",
        -    ),
        -    "not_in"           => "選択された :attribute は不正です。",
        -    "numeric"          => ":attribute は数字にして下さい。",
        -    "regex"            => ":attribute フォーマットが不正です。",
        -    "required"         => ":attribute フィールドは、必須です。",
        -    "required_if"      => ":other が :value の時、:attribute フィールドは必須です。",
        -    "required_with"    => ":value が存在する場合、:attribute フィールドは必須です。",
        -    "required_without" => ":value が存在しな場合、:attribute フィールドは必須です。",
        -    "same"             => ":attribute と :other は、一致しなければなりません。",
        -    "size"             => array(
        -        "numeric" => ":attribute は :size にして下さい。",
        -        "file"    => ":attribute は :size キロバイトにして下さい。",
        -        "string"  => ":attribute は :size 文字にして下さい。",
        -    ),
        -    "unique"           => ":attribute は、取得済みです。",
        -    "url"              => ":attribute フォーマットが不正です。",
        -    "statuslabel_type" => "有効なステータス ラベルの種類を選択する必要があります。",
        -    "unique_undeleted" => ":attribute は 一意の値である必要があります。",
        +    'accepted'             => ':attribute は、承認される必要があります。',
        +    'active_url'           => ':attribute は、有効なURLではありません。',
        +    'after'                => ':attribute は :date よりも後の日付にして下さい。',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute は、文字が含まれている必要があります。',
        +    'alpha_dash'           => ':attribute は、文字列、数字、ダッシュ(−)のみ含めることが出来ます。',
        +    'alpha_num'            => ':attribute は、文字列と数字のみ含めることが出来ます。',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute は :date よりも前の日付にして下さい。',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute は :min - :max の範囲内にして下さい。',
        +        'file'    => ':attribute は :min - :max キロバイトの範囲内にして下さい。',
        +        'string'  => ':attribute は :min - :max 文字の範囲内にして下さい。',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute は、 true もしくは false にしてください。',
        +    'confirmed'            => ':attribute が、一致しませんでした。',
        +    'date'                 => ':attribute は、無効な日付です。',
        +    'date_format'          => ':attribute フォーマット :format に一致しません。',
        +    'different'            => ':attribute と :other は、異なっている必要があります。',
        +    'digits'               => ':attribute は :digits 数値にして下さい。',
        +    'digits_between'       => ':attribute は :min - :max 内の数値にして下さい。',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute フォーマットが不正です。',
        +    'exists'               => '選択された :attribute は不正です。',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute は画像にして下さい。',
        +    'in'                   => '選択された :attribute は不正です。',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute は整数にして下さい。',
        +    'ip'                   => ':attribute は有効なIPアドレスにして下さい。',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute は :max 以上にして下さい。',
        +        'file'    => ':attribute は :max キロバイト以上にして下さい。',
        +        'string'  => ':attribute は :max 文字以上にして下さい。',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute は ファイルタイプ :values にして下さい。',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute は、少なくとも :min 以上にして下さい。',
        +        'file'    => ':attribute は、少なくとも :min キロバイト以上にして下さい。',
        +        'string'  => ':attribute は、少なくとも :min 文字以上にして下さい。',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => '選択された :attribute は不正です。',
        +    'numeric'              => ':attribute は数字にして下さい。',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute フォーマットが不正です。',
        +    'required'             => ':attribute フィールドは、必須です。',
        +    'required_if'          => ':other が :value の時、:attribute フィールドは必須です。',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':value が存在する場合、:attribute フィールドは必須です。',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':value が存在しな場合、:attribute フィールドは必須です。',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute と :other は、一致しなければなりません。',
        +    'size'                 => [
        +        'numeric' => ':attribute は :size にして下さい。',
        +        'file'    => ':attribute は :size キロバイトにして下さい。',
        +        'string'  => ':attribute は :size 文字にして下さい。',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute は、取得済みです。',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute フォーマットが不正です。',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => ":attribute フィールドに、禁止文字列が含まれています。",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/ko/admin/asset_maintenances/message.php b/resources/lang/ko/admin/asset_maintenances/message.php
        index 5cdad72d33..229e6e699a 100644
        --- a/resources/lang/ko/admin/asset_maintenances/message.php
        +++ b/resources/lang/ko/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => '자산 관리가 생성되지 않았습니다. 다시 시도해 주세요.',
                     'success' => '자산 관리가 생성되었습니다.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => '아직 완료되지 않았습니다.',
                 'warranty'                     => '보증',
                 'not_warranty'                 => '보증 안됨',
        diff --git a/resources/lang/ko/admin/asset_maintenances/table.php b/resources/lang/ko/admin/asset_maintenances/table.php
        index 0d93ef2004..a50f0981ec 100644
        --- a/resources/lang/ko/admin/asset_maintenances/table.php
        +++ b/resources/lang/ko/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => '자산 관리',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => '자산명',
                 'is_warranty'   => '보증',
                 'dl_csv'        => 'CSV로 내려받기'
             ];
        diff --git a/resources/lang/ko/admin/categories/general.php b/resources/lang/ko/admin/categories/general.php
        index 4e614a04ed..a199e162e5 100644
        --- a/resources/lang/ko/admin/categories/general.php
        +++ b/resources/lang/ko/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> '분류란',
        +    'about_categories'  				=> '분류는 품목들을 구성할 떄 유용합니다. 몇가지 예시 분류들로는 &quot;데스크탑&quot;,&quot;랩탑&quot;,&quot;휴대폰&quot;,&quot;타블렛&quot; 등이 있지만, 당신이 원하는 대로 분류들을 사용 할 수 있습니다.',
             'asset_categories' 					=> '자산 분류',
             'category_name'  					=> '분류 명',
             'checkin_email'                     => '입고시에 사용자에게 전자우편 보내기.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => '분류 수정',
             'eula_text'							=> '분류 사용권 계약서',
             'eula_text_help'					=> '이 필드는 특정 유형의 자산들에 대한 사용권 계약서들을 지정할 수 있게 해 줍니다. 당신의 모든 자산들에게 단 하나의 사용권 계약서만 가지고 있다면, 첫번째를 기본으로 사용하도록 아래의 상자에 체크할 수 있습니다.',
        +    'name'                              => '분류 명',
             'require_acceptance'				=> '이 분류의 자산 승인을 확인하는 사용자가 필요합니다.',
             'required_acceptance'				=> '이 사용자에게 이 항목의 승인을 확인하는 링크가 이메일로 전송됩니다.',
             'required_eula'						=> '이 사용자에게 사용권 계약서의 사본을 이메일로 전송합니다.',
        diff --git a/resources/lang/ko/admin/companies/general.php b/resources/lang/ko/admin/companies/general.php
        index 411cea9834..546f8b262f 100644
        --- a/resources/lang/ko/admin/companies/general.php
        +++ b/resources/lang/ko/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => '회사 란',
        +    'about_companies_text'                  => '회사들은 단순한 식별 항목으로 사용될 수 있고, 전사 지원이 관리 설정에서 활성화 된다면 자산, 사용자, 기타 등의 표시 제한에 사용 될 수 있습니다.',
             'select_company' => '회사 선택',
         ];
        diff --git a/resources/lang/ko/admin/consumables/general.php b/resources/lang/ko/admin/consumables/general.php
        index e1f483f8b4..b123fcc888 100644
        --- a/resources/lang/ko/admin/consumables/general.php
        +++ b/resources/lang/ko/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> '소모품이란',
             'about_consumables_text'  			=> '소모품은 시간이 지남에 따라 소진되어 구매해야 하는 것들 입니다. 예로, 프린터 잉크나 복사 용지가 있습니다.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => '사용자에게 소모품 반출',
             'consumable_name'                   => '소모품 명',
             'create'                            => '소모품 생성',
             'item_no'                           => '항목 번호',
        diff --git a/resources/lang/ko/admin/custom_fields/general.php b/resources/lang/ko/admin/custom_fields/general.php
        index 106ba9a56c..a0730c372b 100644
        --- a/resources/lang/ko/admin/custom_fields/general.php
        +++ b/resources/lang/ko/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> '항목세트란',
             'about_fieldsets_text'		=> '항목세트는 특정 자산 모델에 사용하기 위해 빈번하게 재사용되는 사용자 정의 항목의 그룹을 생성하는 것을 허용합니다.',
             'custom_format'             => '사용자 지정 형식...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => '필드 암호화',
             'encrypt_field_help'      => '경고: 항목을 암호화 하면 검색을 할 수 없습니다.',
             'encrypted'      	        => '암호화',
             'fieldset'      	        => '항목세트',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => '항목세트명',
             'field_name'              => '항목명',
             'field_values'            => '항목 값',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => '줄 당 한 개의 옵션을 선택하세요. 첫번째 줄 이후의 빈 줄은 무시됩니다.',
             'field_element'           => '양식 성분',
             'field_element_short'     => '성분',
             'field_format'            => '형식',
        diff --git a/resources/lang/ko/admin/custom_fields/message.php b/resources/lang/ko/admin/custom_fields/message.php
        index 0018735f53..dae2aea455 100644
        --- a/resources/lang/ko/admin/custom_fields/message.php
        +++ b/resources/lang/ko/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => '항목세트를 만들지 못했습니다. 재시도해 주십시오.',
        diff --git a/resources/lang/ko/admin/departments/message.php b/resources/lang/ko/admin/departments/message.php
        new file mode 100644
        index 0000000000..61b41e7956
        --- /dev/null
        +++ b/resources/lang/ko/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => '부서가 존재하지 않습니다.',
        +    'assoc_users'	 => '이 부서는 현재 적어도 한명의 사용자와 연결되어 있어서 삭제할 수 없습니다. 사용자가 더 이상 이 부서를 참조하지 않게 갱신하고 다시 시도해주세요. ',
        +    'create' => array(
        +        'error'   => '부서가 생성되지 않았습니다. 다시 시도해 주세요.',
        +        'success' => '부서가 생성되었습니다.'
        +    ),
        +    'update' => array(
        +        'error'   => '부서가 갱신되지 않았습니다. 다시 시도해 주세요.',
        +        'success' => '부서가 갱신되었습니다.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> '이 부서를 삭제하시겠습니까?',
        +        'error'   => '부서를 삭제하는 중 문제가 발생했습니다. 다시 시도해 주세요.',
        +        'success' => '부서가 삭제되었습니다.'
        +    )
        +
        +);
        diff --git a/resources/lang/ko/admin/departments/table.php b/resources/lang/ko/admin/departments/table.php
        new file mode 100644
        index 0000000000..824cb5f926
        --- /dev/null
        +++ b/resources/lang/ko/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => '부서 명',
        +    'manager'                   => '관리자',
        +    'location'                  => '위치',
        +    'create'                    => '부서 생성',
        +    'update'                    => '부서 갱신',
        +    );
        diff --git a/resources/lang/ko/admin/depreciations/general.php b/resources/lang/ko/admin/depreciations/general.php
        index 711c1e956f..64f019aeab 100644
        --- a/resources/lang/ko/admin/depreciations/general.php
        +++ b/resources/lang/ko/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> '자산 감가 상각이란',
             'about_depreciations'  					=> '가치가 하락하는 자산들을 직선법에 의한 감가상각 설정을 할 수 있습니다.',
             'asset_depreciations'  					=> '자산 감가 상각',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => '감가 상각 생성',
             'depreciation_name'  					=> '감가 상각 명',
             'number_of_months'  					=> '개월 수',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => '감가 상각 갱신',
         
         );
        diff --git a/resources/lang/ko/admin/groups/titles.php b/resources/lang/ko/admin/groups/titles.php
        index 998af78236..9c29a555f7 100644
        --- a/resources/lang/ko/admin/groups/titles.php
        +++ b/resources/lang/ko/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => '그룹이란',
        +    'about_groups'                  => '그룹은 일반적인 당신의 권한에 사용된다.',
             'group_management' 	 	=> '그룹 관리',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => '새 그룹 생성',
        +    'update' 	 		        => '그룹 수정',
             'group_name' 	 		=> '그룹 명',
             'group_admin' 	 		=> '그룹 관리자',
             'allow' 	 			=> '허용',
        diff --git a/resources/lang/ko/admin/hardware/form.php b/resources/lang/ko/admin/hardware/form.php
        index 866483bc10..674852d416 100644
        --- a/resources/lang/ko/admin/hardware/form.php
        +++ b/resources/lang/ko/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> '대량 자산 삭제 승인',
           'bulk_delete_help'	=> '아래의 대량 자산 삭제 내용을 검토하십시오. 삭제하시면 복구할 수 없고, 현재 할당되어 있는 사용자와의 연결이 끊어집니다.',
           'bulk_delete_warn'	=> '삭제 대상: asset_count 개',
         	'bulk_update'		=> '대량 자산 갱신',
        diff --git a/resources/lang/ko/admin/hardware/general.php b/resources/lang/ko/admin/hardware/general.php
        index a1cb26f2a0..cee997a06b 100644
        --- a/resources/lang/ko/admin/hardware/general.php
        +++ b/resources/lang/ko/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => '자산이란',
        +    'about_assets_text'            => '자산은 일련 번호나 자산 꼬리표로 추적되는 품목들입니다. 특정 품목의 상황을 파악하는 것이 더 높은 가치를 갖는 추세입니다.',
         	'archived'  				=> '보관됨',
             'asset'  					=> '자산',
             'bulk_checkout'             => '사용자에게 반출할 자산',
             'checkin'  					=> '반입 자산',
        -    'checkout'  				=> '사용자에게 반출된 자산',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> '자산 복제',
             'deployable'  				=> '사용가능',
             'deleted'  					=> '이 자산은 삭제되었습니다. <a href="/hardware/:asset_id/restore">복원하려면 여기를 클릭하세요</a>.',
        diff --git a/resources/lang/ko/admin/hardware/message.php b/resources/lang/ko/admin/hardware/message.php
        index 56f9bcac1b..53f107bf23 100644
        --- a/resources/lang/ko/admin/hardware/message.php
        +++ b/resources/lang/ko/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> '자산이 복원되었습니다.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => '파일이 삭제되지 않았습니다. 다시 시도해 주세요.',
                 'success' => '파일이 삭제되었습니다.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> '이 자산을 삭제하시겠습니까?',
                 'error'   		=> '그룹을 삭제하는 중 문제가 발생했습니다. 다시 시도해 주세요.',
        +        'nothing_updated'   => '선택된 자산이 없기에, 삭제되지 않습니다.',
                 'success' 		=> '자산이 삭제되었습니다.'
             ),
         
        diff --git a/resources/lang/ko/admin/licenses/general.php b/resources/lang/ko/admin/licenses/general.php
        index 8885f78b84..b1b7f34cce 100644
        --- a/resources/lang/ko/admin/licenses/general.php
        +++ b/resources/lang/ko/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => '라이선스 란',
        +    'about_licenses'                  => '라이선스는 소프트웨어를 추적하는데 사용됩니다. 개인에게 반출 할 수 있는 수량이 정의되어 있습니다',
             'checkin'  					=> '라이선스 Seat 확인',
             'checkout_history'  		=> '반출 이력',
             'checkout'  				=> '반출 라이선스 Seat',
        diff --git a/resources/lang/ko/admin/licenses/message.php b/resources/lang/ko/admin/licenses/message.php
        index 83e7430b7c..2c4ef63151 100644
        --- a/resources/lang/ko/admin/licenses/message.php
        +++ b/resources/lang/ko/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => '파일(들)이 업로드 되지 않았습니다. 다시 시도해 주세요.',
                 'success' => '파일(들)이 업로드 되었습니다.',
                 'nofiles' => '업로드 하기 위한 파일이 선택되지 않았거나, 업로드 할 파일이 너무 큽니다.',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => '하나 이상의 파일이 너무 크거나 허용되지 않는 형식입니다. 허용되는 형식은 png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, lic 입니다.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/ko/admin/locations/table.php b/resources/lang/ko/admin/locations/table.php
        index d3d1b072fb..be8af451ae 100644
        --- a/resources/lang/ko/admin/locations/table.php
        +++ b/resources/lang/ko/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => '장소 란',
        +    'about_locations'           => '장소는 사용자, 자산, 그리고 그외의 품목들에 대한 위치 정보 추적에 사용된다',
             'assets_rtd'                => '자산', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => '할당된 자산',
             'id'                        => '아이디',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => '위치',
             'parent'                    => '상위',
             'currency'                  => '현지 통화',
        +    'ldap_ou'                   => 'LDAP 검색 OU',
             );
        diff --git a/resources/lang/ko/admin/manufacturers/table.php b/resources/lang/ko/admin/manufacturers/table.php
        index edc0c50365..84e08c54e2 100644
        --- a/resources/lang/ko/admin/manufacturers/table.php
        +++ b/resources/lang/ko/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => '제조업체 란',
        +    'about_manufacturers_text'  => '생산자는 당신의 자산들을 생산한 회사들입니다. 여기에 자산 상세 페이지에 나타날, 그들에 대한 중요한 지원 연락처 정보를 저장 할 수 있습니다.',
             'asset_manufacturers'	=> '자산 제조업체',
             'create'				=> '제조업체 생성',
             'id'   					=> '아이디',
        -    'name'      			=> '제조업체 명',
        +    'name'      			=> '이름',
        +    'support_email'   		=> '지원 이메일',
        +    'support_phone'   		=> '지원 전화',
        +    'support_url'   		=> '지원 URL',
             'update'				=> '제조업체 갱신',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/ko/admin/models/general.php b/resources/lang/ko/admin/models/general.php
        index 578f60c574..75c4013816 100644
        --- a/resources/lang/ko/admin/models/general.php
        +++ b/resources/lang/ko/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => '자산 모델이란',
        +    'about_models_text'           => '자산 모델은 동일한 자산들을 그룹화 하는 방법입니다. "MBP 2013", "IPhone 6들", 등등.',
             'deleted'  					        => '이 모델은 삭제되었습니다. <a href="/hardware/models/:model_id/restore">복원 하려면 여기를 클릭하세요</a>.',
             'restore'                   => '모델 복원',
             'requestable'               => '사용자가 이 모델을 요청하실 수 있습니다',
        diff --git a/resources/lang/ko/admin/models/message.php b/resources/lang/ko/admin/models/message.php
        index 87ee59f7be..f5177510b3 100644
        --- a/resources/lang/ko/admin/models/message.php
        +++ b/resources/lang/ko/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> '모델이 복원되었습니다.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> '변경된 항목이 없어서, 갱신되지 않습니다.',
        +        'success' 		=> '모델 갱신됨.'
        +    ),
        +
         );
        diff --git a/resources/lang/ko/admin/settings/general.php b/resources/lang/ko/admin/settings/general.php
        index 927a323bdb..b8833574ac 100644
        --- a/resources/lang/ko/admin/settings/general.php
        +++ b/resources/lang/ko/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> '(일자) 최대값 만료 알림',
         	'alert_inv_threshold'		=> '재고 알림 최대값',
         	'asset_ids'					=> '자산 ID',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> '자동-증가 자산 ID 생성',
         	'auto_increment_prefix'		=> '접두사 (부가적)',
         	'auto_incrementing_help'    => '이 것을 설정하려면 자동-증가 자산 ID 사용을 하세요.',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP 이메일',
             'load_remote_text'          => '원격 스크립트',
             'load_remote_help_text'		=> '이 Snipe-IT 설치는 인터넷에서 스크립트들을 읽어 올 수 있습니다.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> '로고',
             'full_multiple_companies_support_help_text' => '자신이 속한 공급자 자산에 공급자를 할당하는 것을 제한하는 사용자들 (관리자 포함)',
             'full_multiple_companies_support_text' => '전체 다중 공급자들 지원',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP 버전',
             'php_gd_info'               => 'QR 코드를 보려면 php-gd를 설치하셔야 합니다. 설치 설명서를 참고하세요.',
             'php_gd_warning'            => 'PHP 이미지 처리 및 GD 플러그인이 설치되어 있지 않습니다.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => '이 것을 설정하려면 먼저 QR 코드 사용하기를 하세요',
             'qr_text'                   => 'QR 코드 문구',
             'setting'                   => '설정',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => '이 설정들은 설치본의 특정 분야를 설정하는 것입니다.',
             'labels_per_page'           => '페이지 당 꼬리표',
             'label_dimensions'          => '꼬리표 크기(인치)',
        +    'next_auto_tag_base'        => '다음 자동 증가',
             'page_padding'             => '페이지 여백 (인치)',
             'purge'                    => '삭제된 기록들 지우기',
             'labels_display_bgutter'    => '꼬리표 아래쪽 가운데 여백',
        @@ -104,25 +117,27 @@ return array(
             'width_w'        => '넓이',
             'height_h'        => '높이',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => '2단계 인증',
        +    'two_factor_secret'        => '2단계 코드',
        +    'two_factor_enrollment'        => '2단계 등록',
        +    'two_factor_enabled_text'        => '2중 활성화',
        +    'two_factor_reset'        => '2중 보안 재설정',
        +    'two_factor_reset_help'        => '이 기능은 강제로 사용자들을 구글 인증을 사용하여 각각의 장치에 다시 등록하게 합니다. 이 기능은 현재 등록한 장치들이 분실이나 도난 당했다면 유용할 것입니다. ',
        +    'two_factor_reset_success'          => '2중 장치 재설정이 되었습니다',
        +    'two_factor_reset_error'          => '2중 장치 재설정이 실패했습니다',
        +    'two_factor_enabled_warning'        => '2중 활성화가 현재 활성화되지 않다면 구글 인증으로 등록된 장치를 즉시 강제로 인증하게 할 것입니다. 당신은 하나가 현재 등록되지 않았다면 당신의 장치를 등록할 수 있어야 합니다.',
        +    'two_factor_enabled_help'        => '이 것은 구글 인증을 사용하는 2중 인증 기능을 동작시킵니다.',
        +    'two_factor_optional'        => '선택적 (허용 하는 경우 사용자가 활성화 하거나 비활성화할 수 있습니다)',
        +    'two_factor_required'        => '모든 사용자에게 필수',
        +    'two_factor_disabled'        => '비활성화',
        +    'two_factor_enter_code'	=> '2중 코드 입력',
        +    'two_factor_config_complete'	=> '코드 제출',
        +    'two_factor_enabled_edit_not_allowed' => '관리자가 이 설정의 수정을 허용하지 않았습니다.',
        +    'two_factor_enrollment_text'	=> "2중 인증은 필수입니다만, 당신의 장치는 아직 등록되지 않았습니다. 구글 인증 앱을 실행하고 등록할 장치 아래의 QR 코드를 스캔하세요. 당신의 장치가 등록됐다면, 아래 코드를 입력하세요",
        +    'require_accept_signature'      => '서명 필수',
        +    'require_accept_signature_help_text'      => '이 기능을 활성화하면 자산 수락시에 물리적 서명을 필수로 하게 됩니다.',
             'left'        => '왼쪽',
             'right'        => '오른쪽',
             'top'        => '위',
        diff --git a/resources/lang/ko/admin/suppliers/table.php b/resources/lang/ko/admin/suppliers/table.php
        index 6946049fe1..2459a51748 100644
        --- a/resources/lang/ko/admin/suppliers/table.php
        +++ b/resources/lang/ko/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => '공급자란',
        +    'about_suppliers_text'  => '공급자는 품목의 원천을 추적할 때 사용된다',
             'address'               => '공급자 주소',
             'assets'                => '자산',
             'city'                  => '시',
        diff --git a/resources/lang/ko/admin/users/general.php b/resources/lang/ko/admin/users/general.php
        index 334994539b..a42cf355e0 100644
        --- a/resources/lang/ko/admin/users/general.php
        +++ b/resources/lang/ko/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => '자산 보유자 :name',
        +    'bulk_update_warn'	=> '당신은 :user_count 사용자의 속성을 수정하려고 합니다. 이 양식을 사용하여 자신의 사용자 속성을 변경할 수 없으며 ,사용자 자신의 개인 정보를 개별적으로 수정해야합니다.',
        +    'bulk_update_help'	=> '이 양식을 사용하면 한 번에 여러 사용자를 갱신할 수 있습니다. 변경할 필요가 있는 항목만 채우세요. 아무 것도 입력하지 않으면 변경되지 않습니다.',
             'current_assets'    => '현재 이 사용자에게 반출 된 자산',
             'clone'             => '사용자 복제',
             'contact_user'      => '연락처 :name',
             'edit'              => '사용자 편집',
             'filetype_info'     => '허용되는 형식들은 png, gif, jpeg, doc, docx, pdf, txt, zip, rar 입니다.',
             'history_user'      => '이력 :name',
        +	'info'				=> '정보',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => '마지막 로그인',
             'ldap_config_text'  => 'LDAP 구성 설정들은 Admin > Settings 에서 찾을 수 있습니다. (부가적으로) 선택된 장소는 불러온 모든 사용자들에게 설정됩니다.',
             'software_user'     => '소프트웨어 반출 목록 :name',
             'view_user'         => '사용자 보기 :name',
             'usercsv'           => 'CSV 파일',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => '현재 관리 설정이 두가지 인증방법을 선택적으로 실행하게 되어 있습니다.  ',
        +    'two_factor_enrolled' => '2FA 장치 등록 ',
        +    'two_factor_active'   => '2FA 활성화 ',
             );
        diff --git a/resources/lang/ko/admin/users/message.php b/resources/lang/ko/admin/users/message.php
        index 215f869457..d96312c504 100644
        --- a/resources/lang/ko/admin/users/message.php
        +++ b/resources/lang/ko/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => '이 자산이 승인되었습니다.',
             'declined'                  => '이 자산이 거부되었습니다.',
        +    'bulk_manager_warn'	        => '사용자가 성공적으로 갱신되었지만, 선택한 관리자가 편집할 사용자 목록에도 있었고, 사용자가 자신의 관리자가 아니 어서 관리자 항목이 저장되지 않았습니다. 관리자를 제외한 사용자를 다시 선택하십시오.',
             'user_exists'               => '사용자가 이미 존재합니다!',
             'user_not_found'            => '사용자 [:id]는 존재하지 않습니다.',
             'user_login_required'       => '로그인 항목을 입력해 주세요.',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => '사용자가 생성되었습니다.',
                 'update'    => '사용자가 갱신 되었습니다.',
        +        'update_bulk'    => '사용자가 갱신 되었습니다.',
                 'delete'    => '사용자가 삭제 되었습니다.',
                 'ban'       => '사용자가 금지 처리 되었습니다.',
                 'unban'     => '사용자의 금지 처리가 해제 되었습니다.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => '사용자를 생성하는 중 문제가 발생했습니다. 다시 시도해 주세요.',
                 'update' => '사용자를 갱신하는 중 오류가 발생했습니다. 다시 시도해 주세요.',
                 'delete' => '사용자를 삭제하는 중 문제가 발생했습니다. 다시 시도해 주세요.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => '사용자의 대기 해제 중 문제가 발생했습니다. 다시 시도하세요.',
                 'import'    => '사용자를 내보내기 할 때 문제가 발생했습니다. 다시 시도하세요.',
                 'asset_already_accepted' => '이 자산은 이미 수락되었습니다.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'LDAP 서버와 동기화 할 수 없습니다. LDAP 설정 파일의 LDAP 서버 구성을 확인해 보세요.<br>LDAP 서버 오류: ',
                 'ldap_could_not_search' => 'LDAP 서버를 찾을 수 없습니다. LDAP 설정 파일의 LDAP 서버 구성을 확인해 보세요.<br>LDAP 서버 오류:',
                 'ldap_could_not_get_entries' => 'LDAP 서버 목록을 가져올 수 없습니다. LDAP 설정 파일의 LDAP 서버 구성을 확인해 보세요.<br>LDAP 서버 오류:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/ko/admin/users/table.php b/resources/lang/ko/admin/users/table.php
        index cb0bfb4511..3352e5b3b0 100644
        --- a/resources/lang/ko/admin/users/table.php
        +++ b/resources/lang/ko/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> '활성',
             'allow'  				=> '허용',
             'checkedout'  			=> '자산',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> '장소',
             'lock_passwords'		=> '이 설치본에서는 로그인 상세를 변경 할 수 없습니다.',
             'manager' 				=> '상사',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> '이름',
             'notes'                 => '비고',
             'password_confirm' 		=> '비밀번호 확인',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => '현재 사용자들 보기',
             'show_deleted'          => '삭제된 사용자들 보기',
             'title' 				=> '직함',
        +	'to_restore_them'		=> '그것들을 복구하기.',
             'updateuser' 			=> '사용자 갱신',
             'username' 				=> '사용자명',
        +	'user_deleted_text' 	=> '이 사용자는 삭제 된 것으로 표시되어 있습니다.',
             'username_note' 		=> '(이 것은 로그인이 아닌, 액티브 디렉토리에 연결할 때 사용됩니다.)',
             'cloneuser'             => '사용자 복제',
             'viewusers' 			=> '사용자 보기',
        diff --git a/resources/lang/ko/auth/message.php b/resources/lang/ko/auth/message.php
        index 6ab2d221c8..30c5463d3d 100644
        --- a/resources/lang/ko/auth/message.php
        +++ b/resources/lang/ko/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => '이 사용자는 비활성 계정입니다.',
             'account_suspended'      => '이 사용자는 보류 계정입니다.',
             'account_banned'         => '이 사용자는 금지 계정입니다.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => '로그인 시도 횟수를 초과했습니다. :minutes 분 뒤에 다시 시도하세요.',
         
             'signin' => array(
                 'error'   => '로그인 시에 문제가 발생했습니다. 다시 시도해 주세요.',
        diff --git a/resources/lang/ko/button.php b/resources/lang/ko/button.php
        index 43b0936e4d..ef23f48ce3 100644
        --- a/resources/lang/ko/button.php
        +++ b/resources/lang/ko/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => '기능',
             'add'    	                => '추가',
             'cancel'                    => '취소',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => '요청',
             'submit'  	                => '제출',
             'upload'                    => '올리기',
        -
        +	'select_file'				=> '파일 선택...',
         );
        diff --git a/resources/lang/ko/general.php b/resources/lang/ko/general.php
        index 6978bd9fed..4d8d670398 100644
        --- a/resources/lang/ko/general.php
        +++ b/resources/lang/ko/general.php
        @@ -18,42 +18,54 @@
             'asset_report'          => '자산 보고서',
             'asset_tag'				=> '자산 태그',
             'assets_available'		=> '사용가능 자산',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> '자산',
             'avatar_delete'         => '아바타 삭제',
             'avatar_upload'         => '아바타 올리기',
             'back'      			=> '이전',
             'bad_data'      		=> '찾을 수 없습니다. 잘못된 데이터 인가요?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> '대량 반출',
             'cancel'  				=> '취소',
             'categories'			=> '분류',
             'category'				=> '분류',
        +    'change' 		        => '입/출',
             'changeemail'  			=> '이메일 주소 변경',
             'changepassword'  		=> '비밀번호 변경',
             'checkin'  				=> '반입',
             'checkin_from'  		=> '반입처',
             'checkout'  			=> '반출',
             'city'  				=> '시',
        +	'click_here'			=> '여기를 클릭',
             'companies'			=> '회사들',
             'company'				=> '회사',
             'component'			=> '구성 요소',
             'components'			=> '구성 요소',
        +	'complete'				=> '완료',
             'consumable'			=> '소모품',
             'consumables'			=> '소모품',
             'country'  				=> '국가명',
             'create'				=> '새로 생성',
        -    'created'               => 'Item Created',
        +    'created'               => '품목 생성됨',
             'created_asset'			=> '생성된 자산',
             'created_at' 			=> '생성 위치',
        +    'updated_at' 			=> '업데이트',
             'currency'  			=> '원', // this is deprecated
             'current'  				=> '현재',
             'custom_report'         => '맞춤형 자산 보고서',
             'dashboard'				=> '대시보드',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> '날짜',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => '경고!',
        +    'debug_warning_text'         => '이 프로그램은 디버깅이 가능한 제품 모드에서 구동중입니다. 당신의 프로그램이 외부 환경과 접속이 가능하다면 중요한 자료가 유출될 수 있습니다. <code>.env</code> 파일의 <code>APP_DEBUG</code> 값을 <code>false</code> 로 설정하여 디버깅을 비활성화 하세요.',
             'delete'  				=> '삭제',
             'deleted'  				=> '삭제됨',
             'delete_seats'  		=> '삭제한 Seat',
        +    'departments'           => '부서',
        +    'department'           => '부서',
             'deployed'				=> '사용중',
             'depreciation_report'	=> '감가상각 보고서',
             'download'				=> '내려받기',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => '권한 없음',
             'language'				=> '언어',
             'last'					=> '마지막',
        +    'last_login'            => '마지막 로그인',
             'last_name'             => '성',
             'license'				=> '라이선스',
             'license_report'        => '라이선스 보고서',
        @@ -95,7 +108,7 @@
             'list_all'				=> '전체 목록보기',
             'loading'				=> '불러오는 중',
             'lock_passwords'        => '이 설치에서는 이 항목을 수정할 수 없습니다.',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'feature_disabled'      => '데모 설치본에서는 이 기능을 사용할 수 없습니다.',
             'location'              => '장소',
             'locations'				=> '위치',
             'logout'				=> '로그아웃',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> '추가 정보',
             'name'					=> '이름',
             'next'					=> '다음',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> '신규!',
             'no_depreciation'		=> '감가 상각 없음',
             'no_results'			=> '결과 없음.',
             'no'  					=> '아니오',
             'notes'  				=> '비고',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => '주문 번호',
             'page_menu'				=> 'Showing _MENU_ items',
             'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
             'pending'				=> '대기중',
        @@ -124,8 +139,8 @@
             'previous'				=> '이전',
             'processing'			=> '처리중',
             'profile'				=> '프로필',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => '구매 원가',
        +    'purchase_date'         => '구매 일자',
             'qty'		            => '수량',
             'quantity'		        => '수량',
             'ready_to_deploy'		=> '사용 준비',
        @@ -138,31 +153,35 @@
             'select'				=> '선택',
             'search'				=> '찾기',
             'select_category'       => '분류 선택',
        +    'select_department'       => '부서 선택',
             'select_depreciation'	=> '감가 상각 유형 선택',
             'select_location'		=> '장소 선택',
             'select_manufacturer'	=> '제조업체 선택',
             'select_model'			=> '모델 선택',
             'select_supplier'		=> '공급자 선택',
             'select_user'			=> '사용자 선택',
        -    'select_date'			=> '날짜 선택',
        +    'select_date'			=> '날짜 (YYYY-MM-DD) 선택',
             'select_statuslabel'	=> '상태 선택',
             'select_company'    	=> '회사 선택',
             'select_asset'    		=> '자산 선택',
             'settings'				=> '설정',
             'sign_in'				=> '로그인',
        -    'signature'             => 'Signature',
        +    'signature'             => '서명',
             'some_features_disabled' => '데모 모드: 설치 시 일부 기능은 사용할 수 없습니다.',
             'site_name'				=> '사이트 명',
             'state'  				=> '주',
             'status_labels'			=> '상태 딱지',
             'status'    			=> '상태',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => '공급자',
             'suppliers'  			=> '공급자',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => '정말로 삭제 하시겠습니까',
        +    'submit'				=> '제출',
        +    'target'                => '대상',
        +    'time_and_date_display' => '시간과 날짜 표시',
             'total_assets'			=> '총 자산',
             'total_licenses'		=> '총 라이선스',
        -    'total_accessories'		=> 'total accessories',
        -    'total_consumables'		=> 'total consumables',
        +    'total_accessories'		=> '부속품들 합계',
        +    'total_consumables'		=> '소모품들 합계',
             'type'  				=> '유형',
             'undeployable'			=> '사용불가',
             'unknown_admin'			=> '알수없는 관리자',
        diff --git a/resources/lang/ko/mail.php b/resources/lang/ko/mail.php
        index c9a4fe182d..0446d5babe 100644
        --- a/resources/lang/ko/mail.php
        +++ b/resources/lang/ko/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => '사용자가 웹사이트에서 품목 요청을 취소했습니다',
        +    'a_user_requested' => '사용자가 웹사이트에서 품목을 요청했습니다',
        +    'accessory_name' => '액세서리 이름',
        +    'additional_notes' => '추가 참고 사항:',
        +    'admin_has_created' => ':web 웹사이트에서 관리자가 당신에게 계정을 생성했습니다.',
        +    'asset' => '자산:',
        +    'asset_name' => '자산명:',
        +    'asset_requested' => '자산 요청',
        +    'asset_tag' => '자산 태그:',
        +    'assets_warrantee_expiring' => '{1} 자산이 60일 이내에 보증이 만료됩니다. |[2,Inf] 자산이 60일 이내에 보증 만료됩니다.',
        +    'assigned_to' => '할당',
        +    'best_regards' => '감사합니다,',
        +    'canceled' => '취소됨',
        +    'checkin_date' => '반입 날짜',
        +    'checkout_date' => '반출 날짜',
        +    'click_to_confirm' => ':web 계정을 확인하려면 다음 링크를 클릭하세요:',
        +    'click_on_the_link_accessory' => '부속품을 받았다면 아래 링크를 클릭하세요.',
        +    'click_on_the_link_asset' => '자산을 받았다면 아래 링크를 클릭하세요.',
        +    'Confirm_Asset_Checkin' => '자산 반입 확인.',
        +    'Confirm_Accessory_Checkin' => '부속품 반입 확인.',
        +    'Confirm_accessory_delivery' => '부속품 전달 확인.',
        +    'Confirm_asset_delivery' => '자산 전달 확인.',
        +    'Confirm_consumable_delivery' => '소모품 전달 확인.',
        +    'current_QTY' => '현재 수량',
        +    'Days' => '일',
        +    'days' => '일',
        +    'expecting_checkin_date' => '반입 예상 일:',
        +    'expires' => '만료',
        +    'Expiring_Assets_Report' => '만료 자산 보고서.',
        +    'Expiring_Licenses_Report' => '만료 라이선스 보고서.',
        +    'hello' => '안녕하세요',
        +    'hi' => '안녕하세요',
        +    'i_have_read' => '사용 조약을 읽고 동의 하며, 이 품목을 수령했습니다.',
        +    'item' => '품목:',
        +    'items_below_minimum' => '{1} 품목이 최소 재고 이하이거나 이하가 될 것입니다. |[2,Inf] 품목이 최소 재고 이하이거나 이하가 될 것입니다.',
        +    'Item_Request_Canceled' => '품목 요청 취소됨',
        +    'Item_Requested' => '품목 요청',
        +    'licenses_expiring' => '{1} 라이선스가 60일 이내 만료됩니다. |[2,Inf] 라이선스가 60일 이내 만료됩니다.',
        +    'link_to_update_password' => ':web 비밀번호를 수정하려면 다음 링크를 클릭하세요:',
        +    'login_first_admin' => '아래의 자격 증명을 사용하여 새 Snipe-IT 설치본에 로그인 하세요:',
        +    'login' => '로그인:',
        +    'Low_Inventory_Report' => '재고 부족 보고서',
        +    'min_QTY' => '최소 수량',
        +    'name' => '이름',
        +    'new_item_checked' => '당신의 이름으로 새 품목이 반출 되었습니다, 이하는 상세입니다.',
        +    'password' => '비밀번호:',
        +    'password_reset' => '비밀번호 재설정',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => '아래의 이용 약관을 읽어 보시기 바랍니다.',
        +    'read_the_terms_and_click' => '아래의 이용약관을 읽어보시고, 약관에 동의하시고, 자산을 받았다면, 아래의 링크를 클릭하여 확인해 주세요.',
        +    'requested' => '요청됨:',
        +    'reset_link' => '비밀번호 재설정 링크',
        +    'reset_password' => '이곳을 눌러 비밀번호를 재설정:',
        +    'serial' => '일련번호:',
        +    'supplier' => '공급자',
        +    'tag' => '태그',
        +    'test_email' => 'Snipe-IT에서 테스트 이메일',
        +    'test_mail_text' => '이것은 Snipe-IT 자산 관리 시스템에서 온 테스트 입니다. 이 것을 받았다면, 메일은 동작중입니다 :)',
        +    'the_following_item' => '다음의 품목들이 반입되었습니다: ',
        +    'There_are' => '{1}은 여기 |[2,Inf] 저기에 있음',
        +    'to_reset' => ':web 비밀번호를 재설정 하려면, 이 양식을 작성하세요:',
        +    'type' => '유형',
        +    'user' => '사용자:',
        +    'username' => '사용자이름:',
        +    'welcome' => '환영합니다 :name',
        +    'welcome_to' => '환영합니다 :web!',
        +    'your_credentials' => '당신의 Snipe-IT 인증들',
         );
        diff --git a/resources/lang/ko/validation.php b/resources/lang/ko/validation.php
        index e8fda37fcd..3f6cae0f39 100644
        --- a/resources/lang/ko/validation.php
        +++ b/resources/lang/ko/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute 가 수락되었습니다.",
        -    "active_url"       => ":attribute 는 잘못된 URL 입니다.",
        -    "after"            => ":attribute 는 :date 뒤에 오는 날짜 형식이어야 합니다.",
        -    "alpha"            => ":attribute 는 문자만 포함해야 합니다.",
        -    "alpha_dash"       => ":attribute는 문자, 숫자, 대쉬기호만 포함 할 수 있습니다.",
        -    "alpha_num"        => ":attribute 는 문자와 숫자만 포함할 수 있습니다.",
        -    "before"           => ":attribute 는 :date 앞의 날짜 형식이 되야 합니다.",
        -    "between"          => array(
        -        "numeric" => ":attribute 는 :min - :max 사이의 값입니다.",
        -        "file"    => ":attribute 는 :min - :max Kbyte 사이의 값입니다.",
        -        "string"  => ":attribute 는 :min - :max 자 사이의 문자입니다.",
        -    ),
        -    "confirmed"        => ":attribute 확인이 일치 하지 않습니다.",
        -    "date"             => ":attribute 는 잘못된 날짜 입니다.",
        -    "date_format"      => ":attribute 는 :format 형식과 일치하지 않습니다.",
        -    "different"        => ":attribute 와 :other 는 서로 달라야 합니다.",
        -    "digits"           => ":attribute 는 :digits 자리수여야 합니다.",
        -    "digits_between"   => ":attribute 는 :min - :max 자릿수 사이여야 합니다.",
        -    "email"            => ":attribute 형식이 부정확 합니다.",
        -    "exists"           => "선택한 :attribute 가 부정확 합니다.",
        -    "email_array"      => "하나 이상의 주소가 유효하지 않습니다.",
        -    "image"            => ":attribute 는 이미지 형식만 가능합니다.",
        -    "in"               => "선택한 :attribute 가 부정확 합니다.",
        -    "integer"          => ":attribute 는 정수이어야 합니다.",
        -    "ip"               => ":attribute 는 유효한 IP 주소이어야 합니다.",
        -    "max"              => array(
        -        "numeric" => ":attribute 는 :max 보다 작아야 합니다.",
        -        "file"    => ":attribute 는 :max Kbyte보다 작아야 합니다.",
        -        "string"  => ":attribute 는 :max 자보다 작아야 합니다.",
        -    ),
        -    "mimes"            => ":attribute 는 :values 형식의 파일만 가능합니다.",
        -    "min"              => array(
        -        "numeric" => ":attribute 는 최소 :min 이어야 합니다.",
        -        "file"    => ":attribute 는 최소 :min Kbyte 이어야 합니다.",
        -        "string"  => ":attribute 는 최소 :min 자 이어야 합니다.",
        -    ),
        -    "not_in"           => "선택한 :attribute 가 부정확 합니다.",
        -    "numeric"          => ":attribute 는 숫자만 가능합니다.",
        -    "regex"            => ":attribute 형식이 부정확 합니다.",
        -    "required"         => ":attribute 항목을 입력해 주세요.",
        -    "required_if"      => ":attribute 항목은 :other가 :value 일때 필요합니다.",
        -    "required_with"    => ":attribute 항목은 :values 가 존재할 때 필요합니다.",
        -    "required_without" => ":attribute 항목은 :values 가 존재하지 않을 때 필요합니다.",
        -    "same"             => ":attribute 와 :other 는 일치해야 합니다.",
        -    "size"             => array(
        -        "numeric" => ":attribute 는 :size 가 되야 합니다.",
        -        "file"    => ":attribute 는 :size Kbyte 가 되야 합니다.",
        -        "string"  => ":attribute 는 :size 자가 되야 합니다.",
        -    ),
        -    "unique"           => ":attribute 는 이미 획득하였습니다.",
        -    "url"              => ":attribute 형식이 부정확 합니다.",
        -    "statuslabel_type" => "올바른 상태 꼬리표 형식을 선택해 주셔야 합니다",
        -    "unique_undeleted" => ":attribute 는 고유의 값만 가져야 합니다.",
        +    'accepted'             => ':attribute 가 수락되었습니다.',
        +    'active_url'           => ':attribute 는 잘못된 URL 입니다.',
        +    'after'                => ':attribute 는 :date 뒤에 오는 날짜 형식이어야 합니다.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute 는 문자만 포함해야 합니다.',
        +    'alpha_dash'           => ':attribute는 문자, 숫자, 대쉬기호만 포함 할 수 있습니다.',
        +    'alpha_num'            => ':attribute 는 문자와 숫자만 포함할 수 있습니다.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute 는 :date 앞의 날짜 형식이 되야 합니다.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute 는 :min - :max 사이의 값입니다.',
        +        'file'    => ':attribute 는 :min - :max Kbyte 사이의 값입니다.',
        +        'string'  => ':attribute 는 :min - :max 자 사이의 문자입니다.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute 는 참 또는 거짓의 속성만 지정 가능합니다.',
        +    'confirmed'            => ':attribute 확인이 일치 하지 않습니다.',
        +    'date'                 => ':attribute 는 잘못된 날짜 입니다.',
        +    'date_format'          => ':attribute 는 :format 형식과 일치하지 않습니다.',
        +    'different'            => ':attribute 와 :other 는 서로 달라야 합니다.',
        +    'digits'               => ':attribute 는 :digits 자리수여야 합니다.',
        +    'digits_between'       => ':attribute 는 :min - :max 자릿수 사이여야 합니다.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute 형식이 부정확 합니다.',
        +    'exists'               => '선택한 :attribute 가 부정확 합니다.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute 는 이미지 형식만 가능합니다.',
        +    'in'                   => '선택한 :attribute 가 부정확 합니다.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute 는 정수이어야 합니다.',
        +    'ip'                   => ':attribute 는 유효한 IP 주소이어야 합니다.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute 는 :max 보다 작아야 합니다.',
        +        'file'    => ':attribute 는 :max Kbyte보다 작아야 합니다.',
        +        'string'  => ':attribute 는 :max 자보다 작아야 합니다.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute 는 :values 형식의 파일만 가능합니다.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute 는 최소 :min 이어야 합니다.',
        +        'file'    => ':attribute 는 최소 :min Kbyte 이어야 합니다.',
        +        'string'  => ':attribute 는 최소 :min 자 이어야 합니다.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => '선택한 :attribute 가 부정확 합니다.',
        +    'numeric'              => ':attribute 는 숫자만 가능합니다.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute 형식이 부정확 합니다.',
        +    'required'             => ':attribute 항목을 입력해 주세요.',
        +    'required_if'          => ':attribute 항목은 :other가 :value 일때 필요합니다.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute 항목은 :values 가 존재할 때 필요합니다.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute 항목은 :values 가 존재하지 않을 때 필요합니다.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute 와 :other 는 일치해야 합니다.',
        +    'size'                 => [
        +        'numeric' => ':attribute 는 :size 가 되야 합니다.',
        +        'file'    => ':attribute 는 :size Kbyte 가 되야 합니다.',
        +        'string'  => ':attribute 는 :size 자가 되야 합니다.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute 는 이미 획득하였습니다.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute 형식이 부정확 합니다.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => ":attribute 항목에는 문자를 입력할 수 없습니다.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/lt/admin/asset_maintenances/message.php b/resources/lang/lt/admin/asset_maintenances/message.php
        index 4faf861823..bfe3632c9b 100644
        --- a/resources/lang/lt/admin/asset_maintenances/message.php
        +++ b/resources/lang/lt/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Įrangos priežiūra nebuvo sukurta, prašome bandykite dar kartą.',
                     'success' => 'Įrangos priežiūra sukurta sėkmingai.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Nebaigta',
                 'warranty'                     => 'Garantija',
                 'not_warranty'                 => 'Nėra garantijos',
        diff --git a/resources/lang/lt/admin/categories/general.php b/resources/lang/lt/admin/categories/general.php
        index 429d22c3a3..8af900bdaf 100644
        --- a/resources/lang/lt/admin/categories/general.php
        +++ b/resources/lang/lt/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Keisti kategoriją',
             'eula_text'							=> 'Kategorijos EULA',
             'eula_text_help'					=> 'Šis laukelis leidžia jums keisti EULA atskiroms įrangos grupėms. Jei jūs naudotjate vieną EULA visoms įrangų grupėms, tuomet pažymėkite žemiau esantį laukelį, kad būtų naudojama pirminė numatytoji EULA.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Reikalauja naudotojus patvirtinti šios kategorijos įrangos priėmimą.',
             'required_acceptance'				=> 'Šiam naudotojui bus išsiųstas el. laiškas su nuoroda patvritinanti šios įrangos priėmimą.',
             'required_eula'						=> 'Šiam naudotojui bus išsiųsta EULA kopija',
        diff --git a/resources/lang/lt/admin/custom_fields/message.php b/resources/lang/lt/admin/custom_fields/message.php
        index c6c602a440..0edc2b66a2 100644
        --- a/resources/lang/lt/admin/custom_fields/message.php
        +++ b/resources/lang/lt/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Laukelis nebuvo sukurtas. Prašome bandyti dar kartą.',
        diff --git a/resources/lang/lt/admin/departments/message.php b/resources/lang/lt/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/lt/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lt/admin/departments/table.php b/resources/lang/lt/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/lt/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/lt/admin/hardware/general.php b/resources/lang/lt/admin/hardware/general.php
        index 5d385175e2..f3f8fd1a24 100644
        --- a/resources/lang/lt/admin/hardware/general.php
        +++ b/resources/lang/lt/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Įranga',
             'bulk_checkout'             => 'Išduoti įrangą naudotojui',
             'checkin'  					=> 'Išduota įranga',
        -    'checkout'  				=> 'Įranga išduota naudotojui',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Kopijuoti įrangą',
             'deployable'  				=> 'Naudojamas',
             'deleted'  					=> 'Ši įranga buvo ištrinta. <a href="/hardware/:asset_id/restore">Paspauskit čia ją atkurti</a>.',
        diff --git a/resources/lang/lt/admin/hardware/message.php b/resources/lang/lt/admin/hardware/message.php
        index 029e80e6a9..e7e3a42064 100644
        --- a/resources/lang/lt/admin/hardware/message.php
        +++ b/resources/lang/lt/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> 'Įranga atkurta sėkmingai.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Failas neištrintas. Prašome bandykite dar kartą.',
                 'success' => 'Failas sėkmingai ištrintas.',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Ar jūs tikrai norite ištrinti šią įrangą?',
                 'error'   		=> 'Nepavyko ištrinti įrangos. Prašome bandykite dar kartą.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Įranga sėkmingai ištrinta.'
             ),
         
        diff --git a/resources/lang/lt/admin/locations/table.php b/resources/lang/lt/admin/locations/table.php
        index bc54740f67..8010ac21da 100644
        --- a/resources/lang/lt/admin/locations/table.php
        +++ b/resources/lang/lt/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Vietovės',
             'parent'                    => 'Pagrindinė',
             'currency'                  => 'Vietos valiuta',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/lt/admin/manufacturers/table.php b/resources/lang/lt/admin/manufacturers/table.php
        index 048349b891..cc61445841 100644
        --- a/resources/lang/lt/admin/manufacturers/table.php
        +++ b/resources/lang/lt/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Įrangos gamintojai',
             'create'				=> 'Sukurti gamintoją',
             'id'   					=> 'ID',
        -    'name'      			=> 'Gamintojo pavadinimas',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Atnaujinti gamintoją',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/lt/admin/models/message.php b/resources/lang/lt/admin/models/message.php
        index ae3446d34f..3cd8f2aed7 100644
        --- a/resources/lang/lt/admin/models/message.php
        +++ b/resources/lang/lt/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modelis sėkmingai atkurtas.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/lt/admin/settings/general.php b/resources/lang/lt/admin/settings/general.php
        index bc83c7d885..0554016bba 100644
        --- a/resources/lang/lt/admin/settings/general.php
        +++ b/resources/lang/lt/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Įrangos ID',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Sukurti automatiškai didėjantį įragos ID nr.',
         	'auto_increment_prefix'		=> 'Papilomas priedėlis (pasirinktinai)',
         	'auto_incrementing_help'    => 'Įjungti automatiškai didėjantį įrangos ID pirmajam suteikiant šį nr.',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP el.paštas',
             'load_remote_text'          => 'Nuotoliniai skriptai',
             'load_remote_help_text'		=> 'Šis Snipe-IT įdiegimas gali įtraukti programinius kodus iš interneto.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logotipas',
             'full_multiple_companies_support_help_text' => 'Apriboti vartotojai (įskaitant administratorius) priskirtus kompanijoms.',
             'full_multiple_companies_support_text' => 'Pilnas kelių kompanijų palaikymas',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP versija',
             'php_gd_info'               => 'Jūs turite įdiegti PHP-GD, kad rodytų QR kodus, tam peržiūrėkite diegimo instrukcijas.',
             'php_gd_warning'            => 'PHP vaizdo apdorojimas ir GD papildinys neįdiegtas.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Įjungti QR kodus prieš nustatant tai',
             'qr_text'                   => 'QR kodo tekstas',
             'setting'                   => 'Nustatymai',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Šie nustatymai leidžia jums pasirinkti savus diegimo nustatymus.',
             'labels_per_page'           => 'Etikečių puslapyje',
             'label_dimensions'          => 'Etiketės išmatavimai (coliais)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/lt/admin/users/general.php b/resources/lang/lt/admin/users/general.php
        index 5eb61cf47e..add252e077 100644
        --- a/resources/lang/lt/admin/users/general.php
        +++ b/resources/lang/lt/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Priskirta įranga :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Šiam vartotojui priskirta įranga',
             'clone'             => 'Kopijuoti naudotoją',
             'contact_user'      => 'Susisiekti su :name',
             'edit'              => 'Redaguoti naudotoją',
             'filetype_info'     => 'Leidžiami dokumentų formatai png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar.',
             'history_user'      => ':name naudotojo istorija',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Paskutinis prisijungimas',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => ':name išduota įranga',
        diff --git a/resources/lang/lt/admin/users/message.php b/resources/lang/lt/admin/users/message.php
        index ac7ae7a270..ebb46d7760 100644
        --- a/resources/lang/lt/admin/users/message.php
        +++ b/resources/lang/lt/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Jūs sėkmingai priėmėte šią įrangą.',
             'declined'                  => 'Jūs sėkmingai atšaukėte šią įrangą.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Naudotojas jau yra!',
             'user_not_found'            => 'Naudotojas [:id] neegzistuoja.',
             'user_login_required'       => 'Prisijungimo laukelis privalomas',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Naudotojas sėkmingai sukurtas.',
                 'update'    => 'Naudotojas sėkmingai atnaujintas.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Naudotojas sėkmingai ištrintas.',
                 'ban'       => 'Naudotojas sėkmingai užblokuotas.',
                 'unban'     => 'Naudotojas sėkmingai atblokuotas.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Nepavyko sukurti naudotojo. Prašome bandykite dar kartą.',
                 'update' => 'Nepavyko atnaujinti naudotojo. Prašome bandykite dar kartą.',
                 'delete' => 'Nepavyko ištrinti naudotojo. Prašome bandykite dar kartą.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Nepavyko atšaldyti naudotojo. Prašome bandykite dar kartą.',
                 'import'    => 'Nepavyko įkelti naudotojų. Prašome bandykite dar kartą.',
                 'asset_already_accepted' => 'ši įranga jau buvo priimta.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Negali nustatyti vartotojo prisijungiant prie LDAP serverio. Prašome patikrinkite savo LDAP serverio konfigūraciją LDAP konfigūracijos faile. <br>Klaida iš LDAP Serverio: ',
                 'ldap_could_not_search' => 'Negali rasti LDAP serverio. Prašome patikrinkite savo LDAP serverio konfigūraciją LDAP konfigūracijos faile. <br>Klaida iš LDAP Serverio:',
                 'ldap_could_not_get_entries' => 'Negali gauti prieigos prie LDAP serverio. Prašome patikrinkite savo LDAP serverio konfigūraciją LDAP konfigūracijos faile. <br>Klaida iš LDAP Serverio:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/lt/admin/users/table.php b/resources/lang/lt/admin/users/table.php
        index 57370719a1..1bda3c9fb2 100644
        --- a/resources/lang/lt/admin/users/table.php
        +++ b/resources/lang/lt/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktyvus',
             'allow'  				=> 'Leisti',
             'checkedout'  			=> 'Įranga',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Vieta',
             'lock_passwords'		=> 'Prisijungimo duomenys negali būti keičiami šio diegimo metu.',
             'manager' 				=> 'Tiesioginis vadovas',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Pavadinimas',
             'notes'                 => 'Pastabos',
             'password_confirm' 		=> 'Patvirtinti slaptažodį',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Rodyti esamus naudotojus',
             'show_deleted'          => 'Rodyti ištrintus naudotojus',
             'title' 				=> 'Antraštė',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Atnaujinti naudotoją',
             'username' 				=> 'Vartotojo vardas',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Tai naudojamą tik aktyviam direktorijos binding ne prisijungimui.)',
             'cloneuser'             => 'Kopijuoti naudotoją',
             'viewusers' 			=> 'Peržiūrėti naudotojus',
        diff --git a/resources/lang/lt/auth/message.php b/resources/lang/lt/auth/message.php
        index 57ed42901c..a6d8c3327e 100644
        --- a/resources/lang/lt/auth/message.php
        +++ b/resources/lang/lt/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Šio naudotojo paskyra nėra aktyvuota.',
             'account_suspended'      => 'Šio naudotojo paskyra užšaldyta.',
             'account_banned'         => 'Šio vartojo paskyra užblokuota.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Iškilo problema bandant prisijungti, prašome bandykite dar kartą.',
        diff --git a/resources/lang/lt/button.php b/resources/lang/lt/button.php
        index 6f1cfb9dde..77605b9906 100644
        --- a/resources/lang/lt/button.php
        +++ b/resources/lang/lt/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Veiksmai',
             'add'    	                => 'Pridėti naują',
             'cancel'                    => 'Atšaukti',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Užklausti',
             'submit'  	                => 'Išsaugoti',
             'upload'                    => 'Įkelti',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/lt/general.php b/resources/lang/lt/general.php
        index 3fbb9767cf..c20402b3ba 100644
        --- a/resources/lang/lt/general.php
        +++ b/resources/lang/lt/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Įrangos ataskaitos',
             'asset_tag'				=> 'Įrangos nr.',
             'assets_available'		=> 'laisva įranga',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Įranga',
             'avatar_delete'         => 'Ištrinti ikoną',
             'avatar_upload'         => 'Įkelti ikoną',
             'back'      			=> 'Grįžti',
             'bad_data'      		=> 'Nieko nerasta. Galbūt blogi duomenys?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Atšaukti',
             'categories'			=> 'Kategorijos',
             'category'				=> 'Kategorija',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Pakeisti el. pašto adresą',
             'changepassword'  		=> 'Pakeisti slaptažodį',
             'checkin'  				=> 'Pridėti',
             'checkin_from'  		=> 'Pridėti iš',
             'checkout'  			=> 'Išimti',
             'city'  				=> 'Miestas',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Kompanijos',
             'company'				=> 'Kompanija',
             'component'			=> 'Komponentas',
             'components'			=> 'Komponentai',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Suvartojama įranga',
             'consumables'			=> 'Suvartojama įranga',
             'country'  				=> 'Šalis',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'sukurta įranga',
             'created_at' 			=> 'Sukurta',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '€', // this is deprecated
             'current'  				=> 'Dabartinis',
             'custom_report'         => 'Pasirenkama įrangos ataskaita',
             'dashboard'				=> 'Valdymo skydelis',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Data',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Ištrinti',
             'deleted'  				=> 'Ištrinta',
             'delete_seats'  		=> 'Ištrintos licenzijos',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Naudojama',
             'depreciation_report'	=> 'Nusidėvėjimo ataskaita',
             'download'				=> 'Atsisiųsti',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Nepakankamos teisės!',
             'language'				=> 'Kalba',
             'last'					=> 'Paskutinis',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Pavardė',
             'license'				=> 'Licenzija',
             'license_report'        => 'Licenzijų ataskaitą',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'Daugiau informacijos',
             'name'					=> 'Vardas',
             'next'					=> 'Kitas',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'Nėra nusidėvėjimo',
             'no_results'			=> 'Rezultatų nerasta.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Pasirinkite',
             'search'				=> 'Ieškoti',
             'select_category'       => 'Pasirinkite kategoriją',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Pasirinkti nusidėvėjimo metodą',
             'select_location'		=> 'Pasirinkti vietovę',
             'select_manufacturer'	=> 'Pasirinkti gamintoją',
             'select_model'			=> 'Pasirinkti modelį',
             'select_supplier'		=> 'Pasirinkti tiekėją',
             'select_user'			=> 'Pasirinkti vartotoją',
        -    'select_date'			=> 'Pasirinkti datą',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Pasirinkti būseną',
             'select_company'    	=> 'Pasirinkite kompaniją',
             'select_asset'    		=> 'Pasirinkite įrangą',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Būklė',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Tiekėjai',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'įrangos iš viso',
             'total_licenses'		=> 'iš viso licenzijų',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/lt/validation.php b/resources/lang/lt/validation.php
        index baa53dd14f..f52071e56a 100644
        --- a/resources/lang/lt/validation.php
        +++ b/resources/lang/lt/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute turi būti patvirtintas.",
        -    "active_url"       => ":attribute nėra tinkamas interentinis puslapis.",
        -    "after"            => ":attribute privalo būti data po :date.",
        -    "alpha"            => ":attribute gali būti tik raidės.",
        -    "alpha_dash"       => ":attribute gali būti tik raidės, skaičiai ir brūkšneliai.",
        -    "alpha_num"        => ":attribute gali būti tik raidės ir skaičiai.",
        -    "before"           => ":attribute turi būti data prieš :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute privalo būti tarp :min - :max.",
        -        "file"    => ":attribute privalo būti tarp :min - :max kilobaitų.",
        -        "string"  => ":attribute privalo būti tarp :min - :max ženklų.",
        -    ),
        -    "confirmed"        => ":attribute patvirtinimas nesutampa.",
        -    "date"             => ":attribute nėra galiojanti data.",
        -    "date_format"      => ":attribute nesutampa su formatu :format.",
        -    "different"        => ":attribute ir :other turi būti skirtingi.",
        -    "digits"           => ":attribute privalo būti :digits skaičiai.",
        -    "digits_between"   => ":attribute privalo būti tarp :min ir:max skaičių.",
        -    "email"            => ":attribute formatas neteisingas.",
        -    "exists"           => "Pasirinktas :attribute neteisingas.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => ":attribute privalo būti paveikslėlis.",
        -    "in"               => "Pasirinktas :attribute neteisingas.",
        -    "integer"          => ":attribute turi būti sveikas skaičius.",
        -    "ip"               => ":attribute privalo būti tinkamas IP adresas.",
        -    "max"              => array(
        -        "numeric" => ":attribute negali būti didesnis nei :max.",
        -        "file"    => ":attribute negali būti didesnis nei :max kilobaitų.",
        -        "string"  => ":attribute negali būti didesnis nei :max ženklai.",
        -    ),
        -    "mimes"            => ":attribute privalo būti failas, kurio formatas :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute privalo būti ne mažesnis nei :min.",
        -        "file"    => ":attribute turi būti bent :min kilobaitų.",
        -        "string"  => ":attribute privalo būti bent :min ženklai.",
        -    ),
        -    "not_in"           => "Pasirinktas :attribute neteisingas.",
        -    "numeric"          => ":attribute privalo būti skaičius.",
        -    "regex"            => ":attribute formatas neteisingas.",
        -    "required"         => ":attribute laukelis privalomas.",
        -    "required_if"      => ":attribute laukelis yra privalomas kai :other yra :value.",
        -    "required_with"    => ":attribute laukelis privalomas kai :values yra nurodytas.",
        -    "required_without" => ":attribute laukelis privalomas kai :values yra nenurodytas.",
        -    "same"             => ":attribute ir :other privalo sutapti.",
        -    "size"             => array(
        -        "numeric" => ":attribute privalo būti :size.",
        -        "file"    => ":attribute privalo būti :size kilobaitų.",
        -        "string"  => ":attribute privalo būti :size ženklų.",
        -    ),
        -    "unique"           => ":attribute jau užimtas.",
        -    "url"              => ":attribute formatas neteisingas.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute turi būti patvirtintas.',
        +    'active_url'           => ':attribute nėra tinkamas interentinis puslapis.',
        +    'after'                => ':attribute privalo būti data po :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute gali būti tik raidės.',
        +    'alpha_dash'           => ':attribute gali būti tik raidės, skaičiai ir brūkšneliai.',
        +    'alpha_num'            => ':attribute gali būti tik raidės ir skaičiai.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute turi būti data prieš :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute privalo būti tarp :min - :max.',
        +        'file'    => ':attribute privalo būti tarp :min - :max kilobaitų.',
        +        'string'  => ':attribute privalo būti tarp :min - :max ženklų.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => ':attribute patvirtinimas nesutampa.',
        +    'date'                 => ':attribute nėra galiojanti data.',
        +    'date_format'          => ':attribute nesutampa su formatu :format.',
        +    'different'            => ':attribute ir :other turi būti skirtingi.',
        +    'digits'               => ':attribute privalo būti :digits skaičiai.',
        +    'digits_between'       => ':attribute privalo būti tarp :min ir:max skaičių.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute formatas neteisingas.',
        +    'exists'               => 'Pasirinktas :attribute neteisingas.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute privalo būti paveikslėlis.',
        +    'in'                   => 'Pasirinktas :attribute neteisingas.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute turi būti sveikas skaičius.',
        +    'ip'                   => ':attribute privalo būti tinkamas IP adresas.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute negali būti didesnis nei :max.',
        +        'file'    => ':attribute negali būti didesnis nei :max kilobaitų.',
        +        'string'  => ':attribute negali būti didesnis nei :max ženklai.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute privalo būti failas, kurio formatas :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute privalo būti ne mažesnis nei :min.',
        +        'file'    => ':attribute turi būti bent :min kilobaitų.',
        +        'string'  => ':attribute privalo būti bent :min ženklai.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Pasirinktas :attribute neteisingas.',
        +    'numeric'              => ':attribute privalo būti skaičius.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute formatas neteisingas.',
        +    'required'             => ':attribute laukelis privalomas.',
        +    'required_if'          => ':attribute laukelis yra privalomas kai :other yra :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute laukelis privalomas kai :values yra nurodytas.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute laukelis privalomas kai :values yra nenurodytas.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute ir :other privalo sutapti.',
        +    'size'                 => [
        +        'numeric' => ':attribute privalo būti :size.',
        +        'file'    => ':attribute privalo būti :size kilobaitų.',
        +        'string'  => ':attribute privalo būti :size ženklų.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute jau užimtas.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute formatas neteisingas.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => ":attribute laukelis turi ženklų, kurie neleidžiami.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/lv/admin/accessories/general.php b/resources/lang/lv/admin/accessories/general.php
        new file mode 100644
        index 0000000000..22771aff0c
        --- /dev/null
        +++ b/resources/lang/lv/admin/accessories/general.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +    'about_accessories_title' 			=> 'About Accessories',
        +    'about_accessories_text'  			=> 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
        +    'accessory_category' 				=> 'Accessory Category',
        +    'accessory_name'  					=> 'Accessory Name',
        +    'checkout'  							=> 'Checkout Accessory',
        +    'checkin'  							=> 'Checkin Accessory',
        +    'create'  							=> 'Create Accessory',
        +    'edit'  							=> 'Edit Accessory',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'total'  							=> 'Total',
        +    'remaining'  						=> 'Avail',
        +    'update'  							=> 'Update Accessory',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/lv/admin/accessories/message.php b/resources/lang/lv/admin/accessories/message.php
        new file mode 100644
        index 0000000000..92998a4e14
        --- /dev/null
        +++ b/resources/lang/lv/admin/accessories/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'The accessory does not exist.',
        +    'assoc_users'	 => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'The accessory was not created, please try again.',
        +        'success' => 'The accessory was successfully created.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'The accessory was not updated, please try again',
        +        'success' => 'The accessory was updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this accessory?',
        +        'error'   => 'There was an issue deleting the accessory. Please try again.',
        +        'success' => 'The accessory was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Accessory was not checked out, please try again',
        +        'success' 		=> 'Accessory checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Accessory was not checked in, please try again',
        +        'success' 		=> 'Accessory checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/lv/admin/accessories/table.php b/resources/lang/lv/admin/accessories/table.php
        new file mode 100644
        index 0000000000..e02d9f22e4
        --- /dev/null
        +++ b/resources/lang/lv/admin/accessories/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +	'dl_csv'      				=> 'Download CSV',
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Accessory Name',
        +
        +
        +);
        diff --git a/resources/lang/lv/admin/asset_maintenances/form.php b/resources/lang/lv/admin/asset_maintenances/form.php
        new file mode 100644
        index 0000000000..2aa005c45f
        --- /dev/null
        +++ b/resources/lang/lv/admin/asset_maintenances/form.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +    return [
        +        'asset_maintenance_type' => 'Maintenance Type',
        +        'title'                  => 'Title',
        +        'start_date'             => 'Started',
        +        'completion_date'        => 'Completed',
        +        'cost'                   => 'Cost',
        +        'is_warranty'            => 'Warranty Improvement',
        +        'asset_maintenance_time' => 'Days',
        +        'notes'                  => 'Notes',
        +        'update'                 => 'Update',
        +        'create'                 => 'Create'
        +    ];
        diff --git a/resources/lang/lv/admin/asset_maintenances/general.php b/resources/lang/lv/admin/asset_maintenances/general.php
        new file mode 100644
        index 0000000000..c7ae42d41a
        --- /dev/null
        +++ b/resources/lang/lv/admin/asset_maintenances/general.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +    return [
        +        'asset_maintenances' => 'Asset Maintenances',
        +        'edit'               => 'Edit Asset Maintenance',
        +        'delete'             => 'Delete Asset Maintenance',
        +        'view'               => 'View Asset Maintenance Details',
        +        'repair'             => 'Repair',
        +        'maintenance'        => 'Maintenance',
        +        'upgrade'            => 'Upgrade'
        +    ];
        diff --git a/resources/lang/lv/admin/asset_maintenances/message.php b/resources/lang/lv/admin/asset_maintenances/message.php
        new file mode 100644
        index 0000000000..d121115825
        --- /dev/null
        +++ b/resources/lang/lv/admin/asset_maintenances/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +    return [
        +        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'delete'                       => [
        +            'confirm' => 'Are you sure you wish to delete this asset maintenance?',
        +            'error'   => 'There was an issue deleting the asset maintenance. Please try again.',
        +            'success' => 'The asset maintenance was deleted successfully.'
        +        ],
        +        'create'                       => [
        +            'error'   => 'Asset Maintenance was not created, please try again.',
        +            'success' => 'Asset Maintenance created successfully.'
        +        ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Not Completed Yet',
        +        'warranty'                     => 'Warranty',
        +        'not_warranty'                 => 'Not Warranty',
        +    ];
        \ No newline at end of file
        diff --git a/resources/lang/lv/admin/asset_maintenances/table.php b/resources/lang/lv/admin/asset_maintenances/table.php
        new file mode 100644
        index 0000000000..f3a6be60f9
        --- /dev/null
        +++ b/resources/lang/lv/admin/asset_maintenances/table.php
        @@ -0,0 +1,8 @@
        +<?php
        +
        +    return [
        +        'title'         => 'Asset Maintenance',
        +        'asset_name'    => 'Asset Name',
        +        'is_warranty'   => 'Warranty',
        +        'dl_csv'        => 'Download CSV'
        +    ];
        diff --git a/resources/lang/lv/admin/categories/general.php b/resources/lang/lv/admin/categories/general.php
        new file mode 100644
        index 0000000000..16b3b79f51
        --- /dev/null
        +++ b/resources/lang/lv/admin/categories/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_categories_title' 			=> 'About Categories',
        +    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'asset_categories' 					=> 'Asset Categories',
        +    'category_name'  					=> 'Category Name',
        +    'checkin_email'                     => 'Send email to user on checkin.',
        +    'clone'                             => 'Clone Category',
        +    'create'  							=> 'Create Category',
        +    'edit'                              => 'Edit Category',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
        +    'required_eula'						=> 'This user will be emailed a copy of the EULA',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'update'  							=> 'Update Category',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/lv/admin/categories/message.php b/resources/lang/lv/admin/categories/message.php
        new file mode 100644
        index 0000000000..48cf5478e1
        --- /dev/null
        +++ b/resources/lang/lv/admin/categories/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Category does not exist.',
        +    'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
        +    'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Category was not created, please try again.',
        +        'success' => 'Category created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Category was not updated, please try again',
        +        'success' => 'Category updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this category?',
        +        'error'   => 'There was an issue deleting the category. Please try again.',
        +        'success' => 'The category was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/categories/table.php b/resources/lang/lv/admin/categories/table.php
        new file mode 100644
        index 0000000000..a3ee96ae7f
        --- /dev/null
        +++ b/resources/lang/lv/admin/categories/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'parent'   					=> 'Parent',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Asset Category Name',
        +
        +);
        diff --git a/resources/lang/lv/admin/companies/general.php b/resources/lang/lv/admin/companies/general.php
        new file mode 100644
        index 0000000000..9a47968977
        --- /dev/null
        +++ b/resources/lang/lv/admin/companies/general.php
        @@ -0,0 +1,6 @@
        +<?php
        +return [
        +    'about_companies_title'            => 'About Companies',
        +    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'select_company' => 'Select Company',
        +];
        diff --git a/resources/lang/lv/admin/companies/message.php b/resources/lang/lv/admin/companies/message.php
        new file mode 100644
        index 0000000000..a6db573519
        --- /dev/null
        +++ b/resources/lang/lv/admin/companies/message.php
        @@ -0,0 +1,18 @@
        +<?php
        +return array(
        +    'does_not_exist' => 'Company does not exist.',
        +    'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
        +    'create' => array(
        +        'error'   => 'Company was not created, please try again.',
        +        'success' => 'Company created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Company was not updated, please try again',
        +        'success' => 'Company updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm' => 'Are you sure you wish to delete this company?',
        +        'error'   => 'There was an issue deleting the company. Please try again.',
        +        'success' => 'The Company was deleted successfully.'
        +    )
        +);
        diff --git a/resources/lang/lv/admin/companies/table.php b/resources/lang/lv/admin/companies/table.php
        new file mode 100644
        index 0000000000..2f86126ff2
        --- /dev/null
        +++ b/resources/lang/lv/admin/companies/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +return array(
        +    'companies' => 'Companies',
        +    'create'    => 'Create Company',
        +    'title'     => 'Company',
        +    'update'    => 'Update Company',
        +    'name'      => 'Company Name',
        +    'id'        => 'ID',
        +);
        diff --git a/resources/lang/lv/admin/components/general.php b/resources/lang/lv/admin/components/general.php
        new file mode 100644
        index 0000000000..75c9d250ab
        --- /dev/null
        +++ b/resources/lang/lv/admin/components/general.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about_components_title' 			=> 'About Components',
        +    'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        +    'component_name'                  => 'Component Name',
        +    'checkin'                             => 'Checkin Component',
        +    'checkout'                             => 'Checkout Component',
        +    'cost'				=> 'Purchase Cost',
        +    'create'                             => 'Create Component',
        +    'edit'                             => 'Edit Component',
        +    'date'					=> 'Purchase Date',
        +    'order'					=> 'Order Number',
        +    'remaining' 			             => 'Remaining',
        +    'total' 			                 => 'Total',
        +    'update'                            => 'Update Component',
        +);
        diff --git a/resources/lang/lv/admin/components/message.php b/resources/lang/lv/admin/components/message.php
        new file mode 100644
        index 0000000000..1d13970f23
        --- /dev/null
        +++ b/resources/lang/lv/admin/components/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Component does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Component was not created, please try again.',
        +        'success' => 'Component created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Component was not updated, please try again',
        +        'success' => 'Component updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this component?',
        +        'error'   => 'There was an issue deleting the component. Please try again.',
        +        'success' => 'The component was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Component was not checked out, please try again',
        +        'success' 		=> 'Component checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Component was not checked in, please try again',
        +        'success' 		=> 'Component checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/lv/admin/components/table.php b/resources/lang/lv/admin/components/table.php
        new file mode 100644
        index 0000000000..3d4fed6a7f
        --- /dev/null
        +++ b/resources/lang/lv/admin/components/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Component Name',
        +);
        diff --git a/resources/lang/lv/admin/consumables/general.php b/resources/lang/lv/admin/consumables/general.php
        new file mode 100644
        index 0000000000..53a69f8c03
        --- /dev/null
        +++ b/resources/lang/lv/admin/consumables/general.php
        @@ -0,0 +1,13 @@
        +<?php
        +
        +return array(
        +    'about_consumables_title' 			=> 'About Consumables',
        +    'about_consumables_text'  			=> 'Consumables are anything purchased that will be used up over time. For example, printer ink or copier paper.',
        +    'checkout'                          => 'Checkout Consumable to User',
        +    'consumable_name'                   => 'Consumable Name',
        +    'create'                            => 'Create Consumable',
        +    'item_no'                           => 'Item No.',
        +    'remaining' 			            => 'Remaining',
        +    'total' 			                => 'Total',
        +    'update'                            => 'Update Consumable',
        +);
        diff --git a/resources/lang/lv/admin/consumables/message.php b/resources/lang/lv/admin/consumables/message.php
        new file mode 100644
        index 0000000000..48a3cfbd9f
        --- /dev/null
        +++ b/resources/lang/lv/admin/consumables/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Consumable does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Consumable was not created, please try again.',
        +        'success' => 'Consumable created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Consumable was not updated, please try again',
        +        'success' => 'Consumable updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this consumable?',
        +        'error'   => 'There was an issue deleting the consumable. Please try again.',
        +        'success' => 'The consumable was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Consumable was not checked out, please try again',
        +        'success' 		=> 'Consumable checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Consumable was not checked in, please try again',
        +        'success' 		=> 'Consumable checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/lv/admin/consumables/table.php b/resources/lang/lv/admin/consumables/table.php
        new file mode 100644
        index 0000000000..bb76721f17
        --- /dev/null
        +++ b/resources/lang/lv/admin/consumables/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Consumable Name',
        +);
        diff --git a/resources/lang/lv/admin/custom_fields/general.php b/resources/lang/lv/admin/custom_fields/general.php
        new file mode 100644
        index 0000000000..f2e6df90cb
        --- /dev/null
        +++ b/resources/lang/lv/admin/custom_fields/general.php
        @@ -0,0 +1,30 @@
        +<?php
        +
        +return array(
        +    'custom_fields'		        => 'Custom Fields',
        +    'field'		                => 'Field',
        +    'about_fieldsets_title'		=> 'About Fieldsets',
        +    'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        +    'custom_format'             => 'Custom format...',
        +    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        +    'encrypted'      	        => 'Encrypted',
        +    'fieldset'      	        => 'Fieldset',
        +    'qty_fields'      	      => 'Qty Fields',
        +    'fieldsets'      	        => 'Fieldsets',
        +    'fieldset_name'           => 'Fieldset Name',
        +    'field_name'              => 'Field Name',
        +    'field_values'            => 'Field Values',
        +    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_element'           => 'Form Element',
        +    'field_element_short'     => 'Element',
        +    'field_format'            => 'Format',
        +    'field_custom_format'     => 'Custom Format',
        +    'required'   		          => 'Required',
        +    'req'   		              => 'Req.',
        +    'used_by_models'   		    => 'Used By Models',
        +    'order'   		            => 'Order',
        +    'create_fieldset'         => 'New Fieldset',
        +    'create_field'            => 'New Custom Field',
        +    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +);
        diff --git a/resources/lang/lv/admin/custom_fields/message.php b/resources/lang/lv/admin/custom_fields/message.php
        new file mode 100644
        index 0000000000..ed66a6ba16
        --- /dev/null
        +++ b/resources/lang/lv/admin/custom_fields/message.php
        @@ -0,0 +1,57 @@
        +<?php
        +
        +return array(
        +
        +    'field' => array(
        +        'invalid'   => 'That field does not exist.',
        +        'already_added'   => 'Field already added',
        +
        +        'create' => array(
        +            'error'   => 'Field was not created, please try again.',
        +            'success' => 'Field created successfully.',
        +            'assoc_success' => 'Field successfully added to fieldset.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Field was not updated, please try again',
        +            'success' => 'Field updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this field?',
        +            'error'   => 'There was an issue deleting the field. Please try again.',
        +            'success' => 'The field was deleted successfully.',
        +            'in_use'   => 'Field is still in use.',
        +        )
        +
        +    ),
        +
        +    'fieldset' => array(
        +
        +        'does_not_exist' => 'Fieldset does not exist',
        +
        +        'create' => array(
        +            'error'   => 'Fieldset was not created, please try again.',
        +            'success' => 'Fieldset created successfully.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Fieldset was not updated, please try again',
        +            'success' => 'Fieldset updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        +            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        +            'success' => 'The fieldset was deleted successfully.',
        +            'in_use'   => 'Fieldset is still in use.',
        +        )
        +
        +    ),
        +
        +
        +
        +
        +
        +
        +);
        diff --git a/resources/lang/lv/admin/departments/message.php b/resources/lang/lv/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/lv/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/departments/table.php b/resources/lang/lv/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/lv/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/lv/admin/depreciations/general.php b/resources/lang/lv/admin/depreciations/general.php
        new file mode 100644
        index 0000000000..1fca0e2cb7
        --- /dev/null
        +++ b/resources/lang/lv/admin/depreciations/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return array(
        +    'about_asset_depreciations'  			=> 'About Asset Depreciations',
        +    'about_depreciations'  					=> 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
        +    'asset_depreciations'  					=> 'Asset Depreciations',
        +    'create'  					            => 'Create Depreciation',
        +    'depreciation_name'  					=> 'Depreciation Name',
        +    'number_of_months'  					=> 'Number of Months',
        +    'update'  					            => 'Update Depreciation',
        +
        +);
        diff --git a/resources/lang/lv/admin/depreciations/message.php b/resources/lang/lv/admin/depreciations/message.php
        new file mode 100644
        index 0000000000..c20e52c13c
        --- /dev/null
        +++ b/resources/lang/lv/admin/depreciations/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Depreciation class does not exist.',
        +    'assoc_users'	 => 'This depreciation is currently associated with one or more models and cannot be deleted. Please delete the models, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Depreciation class was not created, please try again. :(',
        +        'success' => 'Depreciation class created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Depreciation class was not updated, please try again',
        +        'success' => 'Depreciation class updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this depreciation class?',
        +        'error'   => 'There was an issue deleting the depreciation class. Please try again.',
        +        'success' => 'The depreciation class was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/depreciations/table.php b/resources/lang/lv/admin/depreciations/table.php
        new file mode 100644
        index 0000000000..5ba01d132c
        --- /dev/null
        +++ b/resources/lang/lv/admin/depreciations/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'id'      => 'ID',
        +    'months'   => 'Months',
        +    'term'   => 'Term',
        +    'title'      => 'Name ',
        +
        +);
        diff --git a/resources/lang/lv/admin/groups/message.php b/resources/lang/lv/admin/groups/message.php
        new file mode 100644
        index 0000000000..f14b6339e8
        --- /dev/null
        +++ b/resources/lang/lv/admin/groups/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'group_exists'        => 'Group already exists!',
        +    'group_not_found'     => 'Group [:id] does not exist.',
        +    'group_name_required' => 'The name field is required',
        +
        +    'success' => array(
        +        'create' => 'Group was successfully created.',
        +        'update' => 'Group was successfully updated.',
        +        'delete' => 'Group was successfully deleted.',
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this group?',
        +        'create' => 'There was an issue creating the group. Please try again.',
        +        'update' => 'There was an issue updating the group. Please try again.',
        +        'delete' => 'There was an issue deleting the group. Please try again.',
        +    ),
        +
        +);
        diff --git a/resources/lang/lv/admin/groups/table.php b/resources/lang/lv/admin/groups/table.php
        new file mode 100644
        index 0000000000..61f060a116
        --- /dev/null
        +++ b/resources/lang/lv/admin/groups/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +
        +return array(
        +
        +    'id'         => 'Id',
        +    'name'       => 'Name',
        +    'users'      => '# of Users',
        +
        +);
        diff --git a/resources/lang/lv/admin/groups/titles.php b/resources/lang/lv/admin/groups/titles.php
        new file mode 100644
        index 0000000000..99e8cc1f6f
        --- /dev/null
        +++ b/resources/lang/lv/admin/groups/titles.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +return array(
        +    'about_groups_title'            => 'About Groups',
        +    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'group_management' 	 	=> 'Group Management',
        +    'create' 	 	 	    => 'Create New Group',
        +    'update' 	 		        => 'Edit Group',
        +    'group_name' 	 		=> 'Group Name',
        +    'group_admin' 	 		=> 'Group Admin',
        +    'allow' 	 			=> 'Allow',
        +    'deny' 	 				=> 'Deny',
        +
        +);
        diff --git a/resources/lang/lv/admin/hardware/form.php b/resources/lang/lv/admin/hardware/form.php
        new file mode 100644
        index 0000000000..abded281fa
        --- /dev/null
        +++ b/resources/lang/lv/admin/hardware/form.php
        @@ -0,0 +1,42 @@
        +<?php
        +
        +return array(
        +	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +  'bulk_delete_help'	=> 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
        +  'bulk_delete_warn'	=> 'You are about to delete :asset_count assets.',
        +	'bulk_update'		=> 'Bulk Update Assets',
        +	'bulk_update_help'	=> 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
        +	'bulk_update_warn'	=> 'You are about to edit the properties of :asset_count assets.',
        +    'checkedout_to'		=> 'Checked Out To',
        +    'checkout_date'		=> 'Checkout Date',
        +    'checkin_date'		=> 'Checkin Date',
        +    'checkout_to'		=> 'Checkout to',
        +    'cost'				=> 'Purchase Cost',
        +    'create'			=> 'Create Asset',
        +    'date'				=> 'Purchase Date',
        +    'depreciates_on'	=> 'Depreciates On',
        +    'default_location'	=> 'Default Location',
        +    'eol_date'			=> 'EOL Date',
        +    'eol_rate'			=> 'EOL Rate',
        +    'expected_checkin'  => 'Expected Checkin Date',
        +    'expires'			=> 'Expires',
        +    'fully_depreciated'	=> 'Fully Depreciated',
        +    'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
        +    'mac_address'		=> 'MAC Address',
        +    'manufacturer'		=> 'Manufacturer',
        +    'model'				=> 'Model',
        +    'months'			=> 'months',
        +    'name'				=> 'Asset Name',
        +    'notes'				=> 'Notes',
        +    'order'				=> 'Order Number',
        +    'qr'				=> 'QR Code',
        +    'requestable'		=> 'Users may request this asset',
        +    'select_statustype'	=> 'Select Status Type',
        +    'serial'			=> 'Serial',
        +    'status'			=> 'Status',
        +    'tag'				=> 'Asset Tag',
        +    'update'			=> 'Asset Update',
        +    'warranty'			=> 'Warranty',
        +    'years'				=> 'years',
        +)
        +;
        diff --git a/resources/lang/lv/admin/hardware/general.php b/resources/lang/lv/admin/hardware/general.php
        new file mode 100644
        index 0000000000..1def86dc9e
        --- /dev/null
        +++ b/resources/lang/lv/admin/hardware/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_assets_title'           => 'About Assets',
        +    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +	'archived'  				=> 'Archived',
        +    'asset'  					=> 'Asset',
        +    'bulk_checkout'             => 'Checkout Assets to User',
        +    'checkin'  					=> 'Checkin Asset',
        +    'checkout'  				=> 'Checkout Asset',
        +    'clone'  					=> 'Clone Asset',
        +    'deployable'  				=> 'Deployable',
        +    'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        +    'edit'  					=> 'Edit Asset',
        +	'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'model_deleted'  			=> 'This Assets model has been deleted. You must restore the model before you can restore the Asset.<br/> <a href="/hardware/models/:model_id/restore">Click here to restore the model</a>.',
        +    'requestable'               => 'Requestable',
        +    'requested'				    => 'Requested',
        +    'restore'  					=> 'Restore Asset',
        +    'pending'  					=> 'Pending',
        +    'undeployable'  			=> 'Undeployable',
        +    'view'  					=> 'View Asset',
        +);
        diff --git a/resources/lang/lv/admin/hardware/message.php b/resources/lang/lv/admin/hardware/message.php
        new file mode 100644
        index 0000000000..112cf77ded
        --- /dev/null
        +++ b/resources/lang/lv/admin/hardware/message.php
        @@ -0,0 +1,82 @@
        +<?php
        +
        +return array(
        +
        +    'undeployable' 		=> '<strong>Warning: </strong> This asset has been marked as currently undeployable.
        +                        If this status has changed, please update the asset status.',
        +    'does_not_exist' 	=> 'Asset does not exist.',
        +    'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
        +    'assoc_users'	 	=> 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
        +
        +    'create' => array(
        +        'error'   		=> 'Asset was not created, please try again. :(',
        +        'success' 		=> 'Asset created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   			=> 'Asset was not updated, please try again',
        +        'success' 			=> 'Asset updated successfully.',
        +        'nothing_updated'	=>  'No fields were selected, so nothing was updated.',
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Asset was not restored, please try again',
        +        'success' 		=> 'Asset restored successfully.'
        +    ),
        +
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +    'import' => array(
        +        'error'                 => 'Some items did not import correctly.',
        +        'errorDetail'           => 'The following Items were not imported because of errors.',
        +        'success'               => "Your file has been imported",
        +        'file_delete_success'   => "Your file has been been successfully deleted",
        +        'file_delete_error'      => "The file was unable to be deleted",
        +    ),
        +
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this asset?',
        +        'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
        +        'success' 		=> 'The asset was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   		=> 'Asset was not checked out, please try again',
        +        'success' 		=> 'Asset checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'not_available' => 'That asset is not available for checkout!'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Asset was not checked in, please try again',
        +        'success' 		=> 'Asset checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'already_checked_in'  => 'That asset is already checked in.',
        +
        +    ),
        +
        +    'requests' => array(
        +        'error'   		=> 'Asset was not requested, please try again',
        +        'success' 		=> 'Asset requested successfully.',
        +        'canceled'      => 'Checkout request successfully canceled'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/hardware/table.php b/resources/lang/lv/admin/hardware/table.php
        new file mode 100644
        index 0000000000..e8baa09d5a
        --- /dev/null
        +++ b/resources/lang/lv/admin/hardware/table.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'asset_tag'   	=> 'Asset Tag',
        +    'asset_model'       => 'Model',
        +    'book_value'  	=> 'Value',
        +    'change' 		=> 'In/Out',
        +    'checkout_date' => 'Checkout Date',
        +    'checkoutto' 	=> 'Checked Out',
        +    'diff' 			=> 'Diff',
        +    'dl_csv' 		=> 'Download CSV',
        +    'eol' 			=> 'EOL',
        +    'id'      		=> 'ID',
        +    'location' 		=> 'Location',
        +    'purchase_cost'	=> 'Cost',
        +    'purchase_date'	=> 'Purchased',
        +    'serial'   		=> 'Serial',
        +    'status'   		=> 'Status',
        +    'title'      	=> 'Asset ',
        +    'image'		=> 'Device Image',
        +    'days_without_acceptance' => 'Days Without Acceptance'
        +
        +);
        diff --git a/resources/lang/lv/admin/licenses/form.php b/resources/lang/lv/admin/licenses/form.php
        new file mode 100644
        index 0000000000..ce29167874
        --- /dev/null
        +++ b/resources/lang/lv/admin/licenses/form.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'asset'             => 'Asset',
        +    'checkin'           => 'Checkin',
        +    'create'            => 'Create License',
        +    'expiration'        => 'Expiration Date',
        +    'license_key'       => 'Product Key',
        +    'maintained'        => 'Maintained',
        +    'name'              => 'Software Name',
        +    'no_depreciation'   => 'Do Not Depreciate',
        +    'purchase_order'    => 'Purchase Order Number',
        +    'reassignable'      => 'Reassignable',
        +    'remaining_seats'   => 'Remaining Seats',
        +    'seats'             => 'Seats',
        +    'termination_date'  => 'Termination Date',
        +    'to_email'          => 'Licensed to Email',
        +    'to_name'           => 'Licensed to Name',
        +    'update'            => 'Update License',
        +    'checkout_help'     => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
        +);
        diff --git a/resources/lang/lv/admin/licenses/general.php b/resources/lang/lv/admin/licenses/general.php
        new file mode 100644
        index 0000000000..25a536ec56
        --- /dev/null
        +++ b/resources/lang/lv/admin/licenses/general.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'checkin'  					=> 'Checkin License Seat',
        +    'checkout_history'  		=> 'Checkout History',
        +    'checkout'  				=> 'Checkout License Seat',
        +    'edit'  					=> 'Edit License',
        +    'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'clone'  					=> 'Clone License',
        +    'history_for'  				=> 'History for ',
        +    'in_out'  					=> 'In/Out',
        +    'info'  					=> 'License Info',
        +    'license_seats'  			=> 'License Seats',
        +    'seat'  					=> 'Seat',
        +    'seats'  					=> 'Seats',
        +    'software_licenses'  		=> 'Software Licenses',
        +    'user'  					=> 'User',
        +    'view'  					=> 'View License',
        +);
        diff --git a/resources/lang/lv/admin/licenses/message.php b/resources/lang/lv/admin/licenses/message.php
        new file mode 100644
        index 0000000000..d5dbfe77b9
        --- /dev/null
        +++ b/resources/lang/lv/admin/licenses/message.php
        @@ -0,0 +1,50 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'License does not exist.',
        +    'user_does_not_exist' => 'User does not exist.',
        +    'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
        +    'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
        +    'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'License was not created, please try again.',
        +        'success' => 'License created successfully.'
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'License was not updated, please try again',
        +        'success' => 'License updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this license?',
        +        'error'   => 'There was an issue deleting the license. Please try again.',
        +        'success' => 'The license was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   => 'There was an issue checking out the license. Please try again.',
        +        'success' => 'The license was checked out successfully'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   => 'There was an issue checking in the license. Please try again.',
        +        'success' => 'The license was checked in successfully'
        +    ),
        +
        +);
        diff --git a/resources/lang/lv/admin/licenses/table.php b/resources/lang/lv/admin/licenses/table.php
        new file mode 100644
        index 0000000000..dfce4136cb
        --- /dev/null
        +++ b/resources/lang/lv/admin/licenses/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'assigned_to'   	=> 'Assigned To',
        +    'checkout'   		=> 'In/Out',
        +    'id'      			=> 'ID',
        +    'license_email'   	=> 'License Email',
        +    'license_name'   	=> 'Licensed To',
        +    'purchase_date'   	=> 'Purchase Date',
        +    'purchased'   		=> 'Purchased',
        +    'seats'   			=> 'Seats',
        +    'hardware'   		=> 'Hardware',
        +    'serial'   			=> 'Serial',
        +    'title'      		=> 'License',
        +
        +);
        diff --git a/resources/lang/lv/admin/locations/message.php b/resources/lang/lv/admin/locations/message.php
        new file mode 100644
        index 0000000000..3ba1eed3b6
        --- /dev/null
        +++ b/resources/lang/lv/admin/locations/message.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Location does not exist.',
        +    'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
        +    'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
        +    'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Location was not created, please try again.',
        +        'success' => 'Location created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Location was not updated, please try again',
        +        'success' => 'Location updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this location?',
        +        'error'   => 'There was an issue deleting the location. Please try again.',
        +        'success' => 'The location was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/locations/table.php b/resources/lang/lv/admin/locations/table.php
        new file mode 100644
        index 0000000000..ffa69307d5
        --- /dev/null
        +++ b/resources/lang/lv/admin/locations/table.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_locations_title'     => 'About Locations',
        +    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'assets_checkedout'         => 'Assets Assigned',
        +    'id'                        => 'ID',
        +    'city'                      => 'City',
        +    'state'                     => 'State',
        +    'country'                   => 'Country',
        +    'create'                    => 'Create Location',
        +    'update'                    => 'Update Location',
        +    'name'                      => 'Location Name',
        +    'address'                   => 'Address',
        +    'zip'                       => 'Postal Code',
        +    'locations'                 => 'Locations',
        +    'parent'                    => 'Parent',
        +    'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
        +    );
        diff --git a/resources/lang/lv/admin/manufacturers/message.php b/resources/lang/lv/admin/manufacturers/message.php
        new file mode 100644
        index 0000000000..6586d2af44
        --- /dev/null
        +++ b/resources/lang/lv/admin/manufacturers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Manufacturer does not exist.',
        +    'assoc_users'	 => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Manufacturer was not created, please try again.',
        +        'success' => 'Manufacturer created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Manufacturer was not updated, please try again',
        +        'success' => 'Manufacturer updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this manufacturer?',
        +        'error'   => 'There was an issue deleting the manufacturer. Please try again.',
        +        'success' => 'The Manufacturer was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/manufacturers/table.php b/resources/lang/lv/admin/manufacturers/table.php
        new file mode 100644
        index 0000000000..4e3ea9904d
        --- /dev/null
        +++ b/resources/lang/lv/admin/manufacturers/table.php
        @@ -0,0 +1,16 @@
        +<?php
        +
        +return array(
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
        +    'asset_manufacturers'	=> 'Asset Manufacturers',
        +    'create'				=> 'Create Manufacturer',
        +    'id'   					=> 'ID',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
        +    'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
        +
        +);
        diff --git a/resources/lang/lv/admin/models/general.php b/resources/lang/lv/admin/models/general.php
        new file mode 100644
        index 0000000000..e0da09f780
        --- /dev/null
        +++ b/resources/lang/lv/admin/models/general.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'about_models_title'     => 'About Asset Models',
        +    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'deleted'  					        => 'This model has been deleted. <a href="/hardware/models/:model_id/restore">Click here to restore it</a>.',
        +    'restore'                   => 'Restore Model',
        +    'requestable'               => 'Users may request this model',
        +	'show_mac_address'			      => 'Show MAC address field in assets in this model',
        +    'view_deleted'              => 'View Deleted',
        +    'view_models'               => 'View Models',
        +    'fieldset'                  => 'Fieldset',
        +    'no_custom_field'           => 'No custom fields',
        +
        +);
        diff --git a/resources/lang/lv/admin/models/message.php b/resources/lang/lv/admin/models/message.php
        new file mode 100644
        index 0000000000..5b1b9a1a1b
        --- /dev/null
        +++ b/resources/lang/lv/admin/models/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Model does not exist.',
        +    'assoc_users'	 => 'This model is currently associated with one or more assets and cannot be deleted. Please delete the assets, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Model was not created, please try again.',
        +        'success' => 'Model created successfully.',
        +        'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Model was not updated, please try again',
        +        'success' => 'Model updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this asset model?',
        +        'error'   => 'There was an issue deleting the model. Please try again.',
        +        'success' => 'The model was deleted successfully.'
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Model was not restored, please try again',
        +        'success' 		=> 'Model restored successfully.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
        +);
        diff --git a/resources/lang/lv/admin/models/table.php b/resources/lang/lv/admin/models/table.php
        new file mode 100644
        index 0000000000..11a512b3d3
        --- /dev/null
        +++ b/resources/lang/lv/admin/models/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'create'				=> 'Create Asset Model',
        +    'created_at' 			=> 'Created at',
        +    'eol'	 				=> 'EOL',
        +    'modelnumber'   		=> 'Model No.',
        +    'name'      			=> 'Asset Model Name',
        +    'numassets' 			=> 'Assets',
        +    'title'					=> 'Asset Models',
        +    'update'				=> 'Update Asset Model',
        +    'view'					=> 'View Asset Model',
        +    'update'				=> 'Update Asset Model',
        +    'clone'				=> 'Clone Model',
        +    'edit'				=> 'Edit Model',
        +);
        diff --git a/resources/lang/lv/admin/reports/general.php b/resources/lang/lv/admin/reports/general.php
        new file mode 100644
        index 0000000000..b03b97546f
        --- /dev/null
        +++ b/resources/lang/lv/admin/reports/general.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'info'   => 'Select the options you want for your asset report.'
        +);
        diff --git a/resources/lang/lv/admin/reports/message.php b/resources/lang/lv/admin/reports/message.php
        new file mode 100644
        index 0000000000..d4c8f8198f
        --- /dev/null
        +++ b/resources/lang/lv/admin/reports/message.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'error'   => 'You must select at least ONE option.'
        +);
        diff --git a/resources/lang/lv/admin/settings/general.php b/resources/lang/lv/admin/settings/general.php
        new file mode 100644
        index 0000000000..73fd052a58
        --- /dev/null
        +++ b/resources/lang/lv/admin/settings/general.php
        @@ -0,0 +1,148 @@
        +<?php
        +
        +return array(
        +    'ad'				        => 'Active Directory',
        +    'ad_domain'				    => 'Active Directory domain',
        +    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        +    'is_ad'				        => 'This is an Active Directory server',
        +	'alert_email'				=> 'Send alerts to',
        +	'alerts_enabled'			=> 'Alerts Enabled',
        +	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        +	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
        +	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
        +	'auto_increment_prefix'		=> 'Prefix (optional)',
        +	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        +	'backups'					=> 'Backups',
        +	'barcode_settings'			=> 'Barcode Settings',
        +    'confirm_purge'			    => 'Confirm Purge',
        +    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        +	'custom_css'				=> 'Custom CSS',
        +	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
        +	'default_currency'  		=> 'Default Currency',
        +	'default_eula_text'			=> 'Default EULA',
        +  'default_language'					=> 'Default Language',
        +	'default_eula_help_text'	=> 'You can also associate custom EULAs to specific asset categories.',
        +    'display_asset_name'        => 'Display Asset Name',
        +    'display_checkout_date'     => 'Display Checkout Date',
        +    'display_eol'               => 'Display EOL in table view',
        +    'display_qr'                => 'Display Square Codes',
        +	'display_alt_barcode'		=> 'Display 1D barcode',
        +	'barcode_type'				=> '2D Barcode Type',
        +	'alt_barcode_type'			=> '1D barcode type',
        +    'eula_settings'				=> 'EULA Settings',
        +    'eula_markdown'				=> 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'general_settings'			=> 'General Settings',
        +	'generate_backup'			=> 'Generate Backup',
        +    'header_color'              => 'Header Color',
        +    'info'                      => 'These settings let you customize certain aspects of your installation.',
        +    'laravel'                   => 'Laravel Version',
        +    'ldap_enabled'              => 'LDAP enabled',
        +    'ldap_integration'          => 'LDAP Integration',
        +    'ldap_settings'             => 'LDAP Settings',
        +    'ldap_server'               => 'LDAP Server',
        +    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        +	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
        +	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
        +	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        +    'ldap_tls'                  => 'Use TLS',
        +    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        +    'ldap_uname'                => 'LDAP Bind Username',
        +    'ldap_pword'                => 'LDAP Bind Password',
        +    'ldap_basedn'               => 'Base Bind DN',
        +    'ldap_filter'               => 'LDAP Filter',
        +    'ldap_pw_sync'              => 'LDAP Password Sync',
        +    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_username_field'       => 'Username Field',
        +    'ldap_lname_field'          => 'Last Name',
        +    'ldap_fname_field'          => 'LDAP First Name',
        +    'ldap_auth_filter_query'    => 'LDAP Authentication query',
        +    'ldap_version'              => 'LDAP Version',
        +    'ldap_active_flag'          => 'LDAP Active Flag',
        +    'ldap_emp_num'              => 'LDAP Employee Number',
        +    'ldap_email'                => 'LDAP Email',
        +    'load_remote_text'          => 'Remote Scripts',
        +    'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
        +    'logo'                    	=> 'Logo',
        +    'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
        +    'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        +    'optional'					=> 'optional',
        +    'per_page'                  => 'Results Per Page',
        +    'php'                       => 'PHP Version',
        +    'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
        +    'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
        +    'qr_help'                   => 'Enable QR Codes first to set this',
        +    'qr_text'                   => 'QR Code Text',
        +    'setting'                   => 'Setting',
        +    'settings'                  => 'Settings',
        +    'site_name'                 => 'Site Name',
        +    'slack_botname'             => 'Slack Botname',
        +    'slack_channel'             => 'Slack Channel',
        +    'slack_endpoint'            => 'Slack Endpoint',
        +    'slack_integration'         => 'Slack Settings',
        +    'slack_integration_help'    => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new">create an incoming webhook</a> on your Slack account.',
        +    'snipe_version'  			=> 'Snipe-IT version',
        +    'system'                    => 'System Information',
        +    'update'                    => 'Update Settings',
        +    'value'                     => 'Value',
        +    'brand'                     => 'Branding',
        +    'about_settings_title'      => 'About Settings',
        +    'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
        +    'labels_per_page'           => 'Labels per page',
        +    'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Page margins (inches)',
        +    'purge'                    => 'Purge Deleted Records',
        +    'labels_display_bgutter'    => 'Label bottom gutter',
        +    'labels_display_sgutter'    => 'Label side gutter',
        +    'labels_fontsize'           => 'Label font size',
        +    'labels_pagewidth'          => 'Label sheet width',
        +    'labels_pageheight'         => 'Label sheet height',
        +    'label_gutters'        => 'Label spacing (inches)',
        +    'page_dimensions'        => 'Page dimensions (inches)',
        +    'label_fields'          => 'Label visible fields',
        +    'inches'        => 'inches',
        +    'width_w'        => 'w',
        +    'height_h'        => 'h',
        +    'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Two Factor Authentication',
        +    'two_factor_secret'        => 'Two-Factor Code',
        +    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        +    'two_factor_enabled_text'        => 'Enable Two Factor',
        +    'two_factor_reset'        => 'Reset Two-Factor Secret',
        +    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        +    'two_factor_reset_success'          => 'Two factor device successfully reset',
        +    'two_factor_reset_error'          => 'Two factor device reset failed',
        +    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        +    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        +    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_required'        => 'Required for all users',
        +    'two_factor_disabled'        => 'Disabled',
        +    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        +    'two_factor_config_complete'	=> 'Submit Code',
        +    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        +    'require_accept_signature'      => 'Require Signature',
        +    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'left'        => 'left',
        +    'right'        => 'right',
        +    'top'        => 'top',
        +    'bottom'        => 'bottom',
        +    'vertical'        => 'vertical',
        +    'horizontal'        => 'horizontal',
        +    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +);
        diff --git a/resources/lang/lv/admin/settings/message.php b/resources/lang/lv/admin/settings/message.php
        new file mode 100644
        index 0000000000..736d5c3e9e
        --- /dev/null
        +++ b/resources/lang/lv/admin/settings/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +
        +    'update' => array(
        +        'error'                 => 'An error has occurred while updating. ',
        +        'success'               => 'Settings updated successfully.'
        +    ),
        +    'backup' => array(
        +        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        +        'file_deleted'          => 'The backup file was successfully deleted. ',
        +        'generated'             => 'A new backup file was successfully created.',
        +        'file_not_found'        => 'That backup file could not be found on the server.',
        +    ),
        +    'purge' => array(
        +        'error'     => 'An error has occurred while purging. ',
        +        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        +        'success'               => 'Deleted records successfully purged.'
        +    ),
        +
        +);
        diff --git a/resources/lang/lv/admin/statuslabels/message.php b/resources/lang/lv/admin/statuslabels/message.php
        new file mode 100644
        index 0000000000..619a5a509c
        --- /dev/null
        +++ b/resources/lang/lv/admin/statuslabels/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Status Label does not exist.',
        +    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Status Label was not created, please try again.',
        +        'success' => 'Status Label created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Status Label was not updated, please try again',
        +        'success' => 'Status Label updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        +        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        +        'success' => 'The Status Label was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/statuslabels/table.php b/resources/lang/lv/admin/statuslabels/table.php
        new file mode 100644
        index 0000000000..b9b5b7ec4e
        --- /dev/null
        +++ b/resources/lang/lv/admin/statuslabels/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about'      	=> 'About Status Labels',
        +    'archived'      	=> 'Archived',
        +    'create'      	=> 'Create Status Label',
        +    'color'      	=> 'Chart Color',
        +    'deployable'      	=> 'Deployable',
        +    'info'      	=> 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
        +    'name'      	=> 'Status Name',
        +    'pending'      	=> 'Pending',
        +    'status_type'   => 'Status Type',
        +    'show_in_nav'   => 'Show in side nav',
        +    'title'      	=> 'Status Labels',
        +    'undeployable'  => 'Undeployable',
        +    'update'      	=> 'Update Status Label',
        +);
        diff --git a/resources/lang/lv/admin/suppliers/message.php b/resources/lang/lv/admin/suppliers/message.php
        new file mode 100644
        index 0000000000..df4bc41af3
        --- /dev/null
        +++ b/resources/lang/lv/admin/suppliers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Supplier does not exist.',
        +    'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Supplier was not created, please try again.',
        +        'success' => 'Supplier created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Supplier was not updated, please try again',
        +        'success' => 'Supplier updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this supplier?',
        +        'error'   => 'There was an issue deleting the supplier. Please try again.',
        +        'success' => 'Supplier was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/lv/admin/suppliers/table.php b/resources/lang/lv/admin/suppliers/table.php
        new file mode 100644
        index 0000000000..2a7b07ca93
        --- /dev/null
        +++ b/resources/lang/lv/admin/suppliers/table.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +    'about_suppliers_title' => 'About Suppliers',
        +    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'address'               => 'Supplier Address',
        +    'assets'                => 'Assets',
        +    'city'                  => 'City',
        +    'contact'               => 'Contact Name',
        +    'country'               => 'Country',
        +    'create'                => 'Create Supplier',
        +    'email'                 => 'Email',
        +    'fax'                   => 'Fax',
        +    'id'                    => 'ID',
        +    'licenses'              => 'Licenses',
        +    'name'                  => 'Supplier Name',
        +    'notes'                 => 'Notes',
        +    'phone'                 => 'Phone',
        +    'state'                 => 'State',
        +    'suppliers'             => 'Suppliers',
        +    'update'                => 'Update Supplier',
        +    'url'                   => 'URL',
        +    'view'                  => 'View Supplier',
        +    'view_assets_for'       => 'View Assets for',
        +    'zip'                   => 'Postal Code',
        +
        +);
        diff --git a/resources/lang/lv/admin/users/general.php b/resources/lang/lv/admin/users/general.php
        new file mode 100644
        index 0000000000..985138d065
        --- /dev/null
        +++ b/resources/lang/lv/admin/users/general.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +
        +return array(
        +
        +    'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
        +    'current_assets'    => 'Assets currently checked out to this user',
        +    'clone'             => 'Clone User',
        +    'contact_user'      => 'Contact :name',
        +    'edit'              => 'Edit User',
        +    'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
        +    'last_login'        => 'Last Login',
        +    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'software_user'     => 'Software Checked out to :name',
        +    'view_user'         => 'View User :name',
        +    'usercsv'           => 'CSV file',
        +    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        +    'two_factor_enrolled' => '2FA Device Enrolled ',
        +    'two_factor_active'   => '2FA Active ',
        +    );
        diff --git a/resources/lang/lv/admin/users/message.php b/resources/lang/lv/admin/users/message.php
        new file mode 100644
        index 0000000000..8ee552afab
        --- /dev/null
        +++ b/resources/lang/lv/admin/users/message.php
        @@ -0,0 +1,59 @@
        +<?php
        +
        +return array(
        +
        +    'accepted'                  => 'You have successfully accepted this asset.',
        +    'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
        +    'user_exists'               => 'User already exists!',
        +    'user_not_found'            => 'User [:id] does not exist.',
        +    'user_login_required'       => 'The login field is required',
        +    'user_password_required'    => 'The password is required.',
        +    'insufficient_permissions'  => 'Insufficient Permissions.',
        +    'user_deleted_warning'      => 'This user has been deleted. You will have to restore this user to edit them or assign them new assets.',
        +    'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
        +
        +
        +    'success' => array(
        +        'create'    => 'User was successfully created.',
        +        'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
        +        'delete'    => 'User was successfully deleted.',
        +        'ban'       => 'User was successfully banned.',
        +        'unban'     => 'User was successfully unbanned.',
        +        'suspend'   => 'User was successfully suspended.',
        +        'unsuspend' => 'User was successfully unsuspended.',
        +        'restored'  => 'User was successfully restored.',
        +        'import'    => 'Users imported successfully.',
        +    ),
        +
        +    'error' => array(
        +        'create' => 'There was an issue creating the user. Please try again.',
        +        'update' => 'There was an issue updating the user. Please try again.',
        +        'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
        +        'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
        +        'import'    => 'There was an issue importing users. Please try again.',
        +        'asset_already_accepted' => 'This asset has already been accepted.',
        +        'accept_or_decline' => 'You must either accept or decline this asset.',
        +        'incorrect_user_accepted' => 'The asset you have attempted to accept was not checked out to you.',
        +        'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
        +        'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +);
        diff --git a/resources/lang/lv/admin/users/table.php b/resources/lang/lv/admin/users/table.php
        new file mode 100644
        index 0000000000..9bbe883e19
        --- /dev/null
        +++ b/resources/lang/lv/admin/users/table.php
        @@ -0,0 +1,38 @@
        +<?php
        +
        +return array(
        +    'activated'  			=> 'Active',
        +    'allow'  				=> 'Allow',
        +    'checkedout'  			=> 'Assets',
        +    'created_at' 			=> 'Created',
        +    'createuser' 			=> 'Create User',
        +    'deny'  				=> 'Deny',
        +    'email'      			=> 'Email',
        +    'employee_num'      	=> 'Employee No.',
        +    'first_name' 			=> 'First Name',
        +    'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        +    'id'         			=> 'Id',
        +    'inherit'  				=> 'Inherit',
        +    'job' 					=> 'Job Title',
        +    'last_login'  			=> 'Last Login',
        +    'last_name'  			=> 'Last Name',
        +    'location'  			=> 'Location',
        +    'lock_passwords'		=> 'Login details cannot be changed on this installation.',
        +    'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
        +    'name' 					=> 'Name',
        +    'notes'                 => 'Notes',
        +    'password_confirm' 		=> 'Confirm Password',
        +    'password' 				=> 'Password',
        +    'phone'  				=> 'Phone',
        +    'show_current'          => 'Show Current Users',
        +    'show_deleted'          => 'Show Deleted Users',
        +    'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
        +    'updateuser' 			=> 'Update User',
        +    'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
        +    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        +    'cloneuser'             => 'Clone User',
        +    'viewusers' 			=> 'View Users',
        +);
        diff --git a/resources/lang/lv/auth/general.php b/resources/lang/lv/auth/general.php
        new file mode 100644
        index 0000000000..bf88cba77a
        --- /dev/null
        +++ b/resources/lang/lv/auth/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return [
        +    'send_password_link'	        => 'Send Password Reset Link',
        +    'email_reset_password'			=> 'Email Password Reset',
        +    'reset_password'			    => 'Reset Password',
        +    'login'                         => 'Login',
        +    'login_prompt'                  => 'Please Login',
        +    'forgot_password'               => 'I forgot my password',
        +    'remember_me'                   => 'Remember Me',
        +    ];
        +
        diff --git a/resources/lang/lv/auth/message.php b/resources/lang/lv/auth/message.php
        new file mode 100644
        index 0000000000..bebf9cdd48
        --- /dev/null
        +++ b/resources/lang/lv/auth/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'account_already_exists' => 'An account with the this email already exists.',
        +    'account_not_found'      => 'The username or password is incorrect.',
        +    'account_not_activated'  => 'This user account is not activated.',
        +    'account_suspended'      => 'This user account is suspended.',
        +    'account_banned'         => 'This user account is banned.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
        +
        +    'signin' => array(
        +        'error'   => 'There was a problem while trying to log you in, please try again.',
        +        'success' => 'You have successfully logged in.',
        +    ),
        +
        +    'signup' => array(
        +        'error'   => 'There was a problem while trying to create your account, please try again.',
        +        'success' => 'Account sucessfully created.',
        +    ),
        +
        +        'forgot-password' => array(
        +            'error'   => 'There was a problem while trying to get a reset password code, please try again.',
        +            'success' => 'Password recovery email successfully sent.',
        +        ),
        +
        +        'forgot-password-confirm' => array(
        +            'error'   => 'There was a problem while trying to reset your password, please try again.',
        +            'success' => 'Your password has been successfully reset.',
        +        ),
        +
        +    'activate' => array(
        +        'error'   => 'There was a problem while trying to activate your account, please try again.',
        +        'success' => 'Your account has been successfully activated.',
        +    ),
        +
        +);
        diff --git a/resources/lang/lv/button.php b/resources/lang/lv/button.php
        new file mode 100644
        index 0000000000..6964689762
        --- /dev/null
        +++ b/resources/lang/lv/button.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'actions' 	                => 'Actions',
        +    'add'    	                => 'Add New',
        +    'cancel'                    => 'Cancel',
        +    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'delete'  	                => 'Delete',
        +    'edit'    	                => 'Edit',
        +    'restore' 	                => 'Restore',
        +    'request'                   => 'Request',
        +    'submit'  	                => 'Submit',
        +    'upload'                    => 'Upload',
        +	'select_file'				=> 'Select File...',
        +);
        diff --git a/resources/lang/lv/general.php b/resources/lang/lv/general.php
        new file mode 100644
        index 0000000000..eb6409ddbb
        --- /dev/null
        +++ b/resources/lang/lv/general.php
        @@ -0,0 +1,204 @@
        +<?php
        +
        +    return [
        +    'accessories'			=> 'Accessories',
        +    'activated'			=> 'Activated',
        +    'accessory'				=> 'Accessory',
        +    'accessory_report'			=> 'Accessory Report',
        +    'action'                => 'Action',
        +    'activity_report'		=> 'Activity Report',
        +    'address'				=> 'Address',
        +    'admin'					=> 'Admin',
        +    'add_seats'     => 'Added seats',
        +    'all_assets'			=> 'All Assets',
        +    'all'       			=> 'All',
        +    'archived'              => 'Archived',
        +    'asset_models'			=> 'Asset Models',
        +    'asset'					=> 'Asset',
        +    'asset_report'          => 'Asset Report',
        +    'asset_tag'				=> 'Asset Tag',
        +    'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
        +    'assets'				=> 'Assets',
        +    'avatar_delete'         => 'Delete Avatar',
        +    'avatar_upload'         => 'Upload Avatar',
        +    'back'      			=> 'Back',
        +    'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'cancel'  				=> 'Cancel',
        +    'categories'			=> 'Categories',
        +    'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
        +    'changeemail'  			=> 'Change Email Address',
        +    'changepassword'  		=> 'Change Password',
        +    'checkin'  				=> 'Checkin',
        +    'checkin_from'  		=> 'Checkin from',
        +    'checkout'  			=> 'Checkout',
        +    'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
        +    'companies'			=> 'Companies',
        +    'company'				=> 'Company',
        +    'component'			=> 'Component',
        +    'components'			=> 'Components',
        +	'complete'				=> 'Complete',
        +    'consumable'			=> 'Consumable',
        +    'consumables'			=> 'Consumables',
        +    'country'  				=> 'Country',
        +    'create'				=> 'Create New',
        +    'created'               => 'Item Created',
        +    'created_asset'			=> 'created asset',
        +    'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
        +    'currency'  			=> '$', // this is deprecated
        +    'current'  				=> 'Current',
        +    'custom_report'         => 'Custom Asset Report',
        +    'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
        +    'date'					=> 'Date',
        +    'debug_warning'         => 'Warning!',
        +    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'delete'  				=> 'Delete',
        +    'deleted'  				=> 'Deleted',
        +    'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
        +    'deployed'				=> 'Deployed',
        +    'depreciation_report'	=> 'Depreciation Report',
        +    'download'				=> 'Download',
        +    'depreciation'			=> 'Depreciation',
        +    'editprofile'  			=> 'Edit Your Profile',
        +    'eol'					=> 'EOL',
        +    'email_domain'			=> 'Email Domain',
        +    'email_format'			=> 'Email Format',
        +    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        +    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'first'					=> 'First',
        +    'first_name'			=> 'First Name',
        +    'first_name_format'		=> 'First Name (jane@example.com)',
        +    'file_name'				=> 'File',
        +    'file_uploads'			=> 'File Uploads',
        +    'generate'				=> 'Generate',
        +    'groups'				=> 'Groups',
        +    'gravatar_email'        => 'Gravatar Email Address',
        +    'history'  			    => 'History',
        +    'history_for'  			=> 'History for',
        +    'id'  					=> 'ID',
        +    'image_delete'         	=> 'Delete Image',
        +    'image_upload'         	=> 'Upload Image',
        +    'import'         	    => 'Import',
        +    'import-history'        => 'Import History',
        +    'asset_maintenance'        => 'Asset Maintenance',
        +    'asset_maintenance_report' => 'Asset Maintenance Report',
        +    'asset_maintenances'       => 'Asset Maintenances',
        +    'item'  				=> 'Item',
        +    'insufficient_permissions' => 'Insufficient permissions!',
        +    'language'				=> 'Language',
        +    'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
        +    'last_name'             => 'Last Name',
        +    'license'				=> 'License',
        +    'license_report'        => 'License Report',
        +    'licenses_available'	=> 'licenses available',
        +    'licenses'				=> 'Licenses',
        +    'list_all'				=> 'List All',
        +    'loading'				=> 'Loading',
        +    'lock_passwords'        => 'This field cannot be edited in this installation.',
        +    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'location'              => 'Location',
        +    'locations'				=> 'Locations',
        +    'logout'				=> 'Logout',
        +    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'manufacturer'			=> 'Manufacturer',
        +    'manufacturers'			=> 'Manufacturers',
        +    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'min_amt'				=> 'Min. QTY',
        +    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'model_no'				=> 'Model No.',
        +    'months'				=> 'months',
        +    'moreinfo'				=> 'More Info',
        +    'name'					=> 'Name',
        +    'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'new!',
        +    'no_depreciation'		=> 'No Depreciation',
        +    'no_results'			=> 'No Results.',
        +    'no'  					=> 'No',
        +    'notes'  				=> 'Notes',
        +    'order_number'          => 'Order Number',
        +    'page_menu'				=> 'Showing _MENU_ items',
        +    'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
        +    'pending'				=> 'Pending',
        +    'people'				=> 'People',
        +    'per_page'				=> 'Results Per Page',
        +    'previous'				=> 'Previous',
        +    'processing'			=> 'Processing',
        +    'profile'				=> 'Your profile',
        +    'purchase_cost'                              => 'Purchase Cost',
        +    'purchase_date'         => 'Purchase Date',
        +    'qty'		            => 'QTY',
        +    'quantity'		        => 'Quantity',
        +    'ready_to_deploy'		=> 'Ready to Deploy',
        +    'recent_activity'		=> 'Recent Activity',
        +    'remove_company'        => 'Remove Company Association',
        +    'reports'				=> 'Reports',
        +    'requested'				=> 'Requested',
        +    'request_canceled'      => 'Request Canceled',
        +    'save'  				=> 'Save',
        +    'select'				=> 'Select',
        +    'search'				=> 'Search',
        +    'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
        +    'select_depreciation'	=> 'Select a Depreciation Type',
        +    'select_location'		=> 'Select a Location',
        +    'select_manufacturer'	=> 'Select a Manufacturer',
        +    'select_model'			=> 'Select a Model',
        +    'select_supplier'		=> 'Select a Supplier',
        +    'select_user'			=> 'Select a User',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
        +    'select_statuslabel'	=> 'Select Status',
        +    'select_company'    	=> 'Select Company',
        +    'select_asset'    		=> 'Select Asset',
        +    'settings'				=> 'Settings',
        +    'sign_in'				=> 'Sign in',
        +    'signature'             => 'Signature',
        +    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'site_name'				=> 'Site Name',
        +    'state'  				=> 'State',
        +    'status_labels'			=> 'Status Labels',
        +    'status'    			=> 'Status',
        +    'supplier'              => 'Supplier',
        +    'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
        +    'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
        +    'total_assets'			=> 'total assets',
        +    'total_licenses'		=> 'total licenses',
        +    'total_accessories'		=> 'total accessories',
        +    'total_consumables'		=> 'total consumables',
        +    'type'  				=> 'Type',
        +    'undeployable'			=> 'Un-deployable',
        +    'unknown_admin'			=> 'Unknown Admin',
        +    'username_format'		=> 'Username Format',
        +    'update'                => 'Update',
        +    'uploaded'              => 'Uploaded',
        +    'user'					=> 'User',
        +    'accepted'			    => 'accepted',
        +    'declined'			    => 'declined',
        +    'unaccepted_asset_report' => 'Unaccepted Assets',
        +    'users'                 => 'Users',
        +    'viewassets'  			=> 'View Assigned Assets',
        +    'website'               => 'Website',
        +    'welcome'				=> 'Welcome, :name',
        +    'years'					=> 'years',
        +    'yes' 					=> 'Yes',
        +    'zip'  					=> 'Zip',
        +    'noimage'					=> 'No image uploaded or image not found.',
        +    'token_expired'             => 'Your form session has expired. Please try again.',
        +    ];
        diff --git a/resources/lang/lv/mail.php b/resources/lang/lv/mail.php
        new file mode 100644
        index 0000000000..c9a4fe182d
        --- /dev/null
        +++ b/resources/lang/lv/mail.php
        @@ -0,0 +1,74 @@
        +<?php
        +
        +return array(
        +    'a_user_canceled' => 'A user has canceled an item request on the website',
        +    'a_user_requested' => 'A user has requested an item on the website',
        +    'accessory_name' => 'Accessory Name:',
        +    'additional_notes' => 'Additional Notes:',
        +    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        +    'asset' => 'Asset:',
        +    'asset_name' => 'Asset Name:',
        +    'asset_requested' => 'Asset requested',
        +    'asset_tag' => 'Asset Tag:',
        +    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        +                                    expiring in the next 60 days.',
        +    'assigned_to' => 'Assigned To',
        +    'best_regards' => 'Best regards,',
        +    'canceled' => 'Canceled:',
        +    'checkin_date' => 'Checkin Date:',
        +    'checkout_date' => 'Checkout Date:',
        +    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        +    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        +    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        +    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        +    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        +    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        +    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        +    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        +    'current_QTY' => 'Current QTY',
        +    'Days' => 'Days',
        +    'days' => 'Days',
        +    'expecting_checkin_date' => 'Expected Checkin Date:',
        +    'expires' => 'Expires',
        +    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        +    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        +    'hello' => 'Hello',
        +    'hi' => 'Hi',
        +    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'item' => 'Item:',
        +    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        +                              inventory or will soon be low.',
        +    'Item_Request_Canceled' => 'Item Request Canceled',
        +    'Item_Requested' => 'Item Requested',
        +    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        +    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        +    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'login' => 'Login:',
        +    'Low_Inventory_Report' => 'Low Inventory Report',
        +    'min_QTY' => 'Min QTY',
        +    'name' => 'Name',
        +    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        +    'password' => 'Password:',
        +    'password_reset' => 'Password Reset',
        +
        +    'read_the_terms' => 'Please read the terms of use below.',
        +    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        +                         and agree to the terms of use, and have received the asset.',
        +    'requested' => 'Requested:',
        +    'reset_link' => 'Your Password Reset Link',
        +    'reset_password' => 'Click here to reset your password:',
        +    'serial' => 'Serial:',
        +    'supplier' => 'Supplier',
        +    'tag' => 'Tag',
        +    'test_email' => 'Test Email from Snipe-IT',
        +    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        +    'the_following_item' => 'The following item has been checked in: ',
        +    'There_are' => '{1} There is|[2,Inf] There are',
        +    'to_reset' => 'To reset your :web password, complete this form:',
        +    'type' => 'Type',
        +    'user' => 'User:',
        +    'username' => 'Username:',
        +    'welcome' => 'Welcome :name',
        +    'welcome_to' => 'Welcome to :web!',
        +    'your_credentials' => 'Your Snipe-IT credentials',
        +);
        diff --git a/resources/lang/lv/pagination.php b/resources/lang/lv/pagination.php
        new file mode 100644
        index 0000000000..b573b51e91
        --- /dev/null
        +++ b/resources/lang/lv/pagination.php
        @@ -0,0 +1,20 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Pagination Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used by the paginator library to build
        +    | the simple pagination links. You are free to change them to anything
        +    | you want to customize your views to better match your application.
        +    |
        +    */
        +
        +    'previous' => '&laquo; Previous',
        +
        +    'next'     => 'Next &raquo;',
        +
        +);
        diff --git a/resources/lang/lv/passwords.php b/resources/lang/lv/passwords.php
        new file mode 100644
        index 0000000000..5195a9b77c
        --- /dev/null
        +++ b/resources/lang/lv/passwords.php
        @@ -0,0 +1,7 @@
        +<?php
        +
        +return [
        +    'sent'	        => 'Your password link has been sent!',
        +    'user'			=> 'That user does not exist or does not have an email address associated',
        +];
        +
        diff --git a/resources/lang/lv/reminders.php b/resources/lang/lv/reminders.php
        new file mode 100644
        index 0000000000..e7a476e3a2
        --- /dev/null
        +++ b/resources/lang/lv/reminders.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Password Reminder Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are the default lines which match reasons
        +    | that are given by the password broker for a password update attempt
        +    | has failed, such as for an invalid token or invalid new password.
        +    |
        +    */
        +
        +    "password" => "Passwords must be six characters and match the confirmation.",
        +
        +    "user"     => "Username or email address is incorrect",
        +
        +    "token"    => "This password reset token is invalid.",
        +
        +    "sent" => "If a matching email address was found, a password reminder has been sent!",
        +
        +);
        diff --git a/resources/lang/lv/table.php b/resources/lang/lv/table.php
        new file mode 100644
        index 0000000000..f7a49d86c1
        --- /dev/null
        +++ b/resources/lang/lv/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'actions'	 	=> 'Actions',
        +    'action' 		=> 'Action',
        +    'by'      		=> 'By',
        +    'item' 			=> 'Item',
        +
        +);
        diff --git a/resources/lang/lv/validation.php b/resources/lang/lv/validation.php
        new file mode 100644
        index 0000000000..02cb1fa981
        --- /dev/null
        +++ b/resources/lang/lv/validation.php
        @@ -0,0 +1,136 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines contain the default error messages used by
        +    | the validator class. Some of these rules have multiple versions such
        +    | such as the size rules. Feel free to tweak each of these messages.
        +    |
        +    */
        +
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Attributes
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used to swap attribute place-holders
        +    | with something more reader friendly such as E-Mail Address instead
        +    | of "email". This simply helps us make messages a little cleaner.
        +    |
        +    */
        +
        +    'attributes' => [],
        +
        +);
        diff --git a/resources/lang/mn/admin/accessories/general.php b/resources/lang/mn/admin/accessories/general.php
        new file mode 100644
        index 0000000000..22771aff0c
        --- /dev/null
        +++ b/resources/lang/mn/admin/accessories/general.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +    'about_accessories_title' 			=> 'About Accessories',
        +    'about_accessories_text'  			=> 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
        +    'accessory_category' 				=> 'Accessory Category',
        +    'accessory_name'  					=> 'Accessory Name',
        +    'checkout'  							=> 'Checkout Accessory',
        +    'checkin'  							=> 'Checkin Accessory',
        +    'create'  							=> 'Create Accessory',
        +    'edit'  							=> 'Edit Accessory',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'total'  							=> 'Total',
        +    'remaining'  						=> 'Avail',
        +    'update'  							=> 'Update Accessory',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/mn/admin/accessories/message.php b/resources/lang/mn/admin/accessories/message.php
        new file mode 100644
        index 0000000000..92998a4e14
        --- /dev/null
        +++ b/resources/lang/mn/admin/accessories/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'The accessory does not exist.',
        +    'assoc_users'	 => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'The accessory was not created, please try again.',
        +        'success' => 'The accessory was successfully created.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'The accessory was not updated, please try again',
        +        'success' => 'The accessory was updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this accessory?',
        +        'error'   => 'There was an issue deleting the accessory. Please try again.',
        +        'success' => 'The accessory was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Accessory was not checked out, please try again',
        +        'success' 		=> 'Accessory checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Accessory was not checked in, please try again',
        +        'success' 		=> 'Accessory checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/mn/admin/accessories/table.php b/resources/lang/mn/admin/accessories/table.php
        new file mode 100644
        index 0000000000..9e7c62f2c7
        --- /dev/null
        +++ b/resources/lang/mn/admin/accessories/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +	'dl_csv'      				=> 'CSV файл татах',
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'require_acceptance'      	=> 'Зөвшөөрөл',
        +    'title'      				=> 'Аксессуарын нэр',
        +
        +
        +);
        diff --git a/resources/lang/mn/admin/asset_maintenances/form.php b/resources/lang/mn/admin/asset_maintenances/form.php
        new file mode 100644
        index 0000000000..749714cde3
        --- /dev/null
        +++ b/resources/lang/mn/admin/asset_maintenances/form.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +    return [
        +        'asset_maintenance_type' => 'Засвар үйлчилгээний төрөл',
        +        'title'                  => 'Гарчиг',
        +        'start_date'             => 'Эхэлсэн',
        +        'completion_date'        => 'Дууссан',
        +        'cost'                   => 'Өртөг',
        +        'is_warranty'            => 'Нэмэлт баталгаа',
        +        'asset_maintenance_time' => 'Хоног',
        +        'notes'                  => 'Тэмдэглэл',
        +        'update'                 => 'Шинэчлэх',
        +        'create'                 => 'Үүсгэх'
        +    ];
        diff --git a/resources/lang/mn/admin/asset_maintenances/general.php b/resources/lang/mn/admin/asset_maintenances/general.php
        new file mode 100644
        index 0000000000..389a7c1ed1
        --- /dev/null
        +++ b/resources/lang/mn/admin/asset_maintenances/general.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +    return [
        +        'asset_maintenances' => 'Хөрөнгийн засвар үйлчилгээ',
        +        'edit'               => 'Засвар үйлчилгээний мэдээлэл засах',
        +        'delete'             => 'Засвар үйлчилгээний мэдээлэл устгах',
        +        'view'               => 'Засвар үйлчилгээний дэлгэрэнгүй',
        +        'repair'             => 'Засварлах',
        +        'maintenance'        => 'Засвар үйлчилгээ',
        +        'upgrade'            => 'Шинэчлэх'
        +    ];
        diff --git a/resources/lang/mn/admin/asset_maintenances/message.php b/resources/lang/mn/admin/asset_maintenances/message.php
        new file mode 100644
        index 0000000000..27a4c56818
        --- /dev/null
        +++ b/resources/lang/mn/admin/asset_maintenances/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +    return [
        +        'not_found'                    => 'Таны хайсан засвар үйлчилгээ олдсонгүй!',
        +        'delete'                       => [
        +            'confirm' => 'Та устгахдаа итгэлтэй байна уу?',
        +            'error'   => 'Устгахад асуудал гарлаа. Дахин оролдоно уу.',
        +            'success' => 'Амжилттай устгалаа.'
        +        ],
        +        'create'                       => [
        +            'error'   => 'Үүсгэж чадсангүй, дахин оролдоно уу.',
        +            'success' => 'Амжилттай үүсгэлээ.'
        +        ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Дуусаагүй',
        +        'warranty'                     => 'Баталгаа',
        +        'not_warranty'                 => 'Баталгаагүй',
        +    ];
        \ No newline at end of file
        diff --git a/resources/lang/mn/admin/asset_maintenances/table.php b/resources/lang/mn/admin/asset_maintenances/table.php
        new file mode 100644
        index 0000000000..70e892afd4
        --- /dev/null
        +++ b/resources/lang/mn/admin/asset_maintenances/table.php
        @@ -0,0 +1,8 @@
        +<?php
        +
        +    return [
        +        'title'         => 'Засвар үйлчилгээ',
        +        'asset_name'    => 'Хөрөнгийн нэр',
        +        'is_warranty'   => 'Баталгаа',
        +        'dl_csv'        => 'CSV файл татах'
        +    ];
        diff --git a/resources/lang/mn/admin/categories/general.php b/resources/lang/mn/admin/categories/general.php
        new file mode 100644
        index 0000000000..191eaa7480
        --- /dev/null
        +++ b/resources/lang/mn/admin/categories/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_categories_title' 			=> 'Ангиллын тухай',
        +    'about_categories'  				=> 'Хөрөнгийн бүтэц зохион байгуулалтыг оновчтой болгоход Ангилал тус болно. Жишээлбэл &quot;Ширээний компьютьер&quot;, &quot;Ноутбүүк&quot;,&quot;Гар утас&quot;,&quot;Таблет&quot; гэх мэт. Та өөрийн хүссэнээрээ ангиллаа зохиож болно.',
        +    'asset_categories' 					=> 'Хөрөнгийн ангиллууд',
        +    'category_name'  					=> 'Ангиллын нэр',
        +    'checkin_email'                     => 'Олгох үед хэрэглэгч уруу имэйл илгээх.',
        +    'clone'                             => 'Ангиллыг хуулж үүсгэх',
        +    'create'  							=> 'Ангилал үүсгэх',
        +    'edit'                              => 'Ангилал засах',
        +    'eula_text'							=> 'Ангиллын EULA',
        +    'eula_text_help'					=> 'Тодорхой нэг ангиллын хөрөнгийн хувьд EULA-г өөрчлөх боломж олгоно. Бүх хөрөнгийн хувьд EULA нь ижилхэн бол та доорхыг чагталж стандарт EULA-г ашиглаж болно.',
        +    'name'                              => 'Ангиллын нэр',
        +    'require_acceptance'				=> 'Энэ ангиллын хөрөнгийг хүлээж авахдаа хэрэглэгчээс баталгаажуулалт заавал шаардах.',
        +    'required_acceptance'				=> 'Тухайн хөрөнгийг хүлээж авсныг баталгаажуулах холбоосыг хэрэглэгч уруу имэйлээр илгээнэ.',
        +    'required_eula'						=> 'Хэрэглэгч уруу EULA-г имэйлээр явуулна',
        +    'no_default_eula'					=> 'Стандарт EULA тодорхойлж өгөөгүй байна. Тохиргоо хэсэгт нэмж оруулна уу.',
        +    'update'  							=> 'Ангилал шинэчлэх',
        +    'use_default_eula'					=> 'Үүний оронд <a href="#" data-toggle="modal" data-target="#eulaModal">үндсэн стандарт EULA</a> -г ашиглана уу.',
        +    'use_default_eula_disabled'			=> '<del>Үүний оронд үндсэн хэрэглэгчийн гэрээг ашиглана уу.</del> Үндсэн хэрэглэгчийн гэрээг зааж өгөөгүй байна. Тохируулга хэсэгт нэмж оруулна уу.',
        +
        +);
        diff --git a/resources/lang/mn/admin/categories/message.php b/resources/lang/mn/admin/categories/message.php
        new file mode 100644
        index 0000000000..48cf5478e1
        --- /dev/null
        +++ b/resources/lang/mn/admin/categories/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Category does not exist.',
        +    'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
        +    'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Category was not created, please try again.',
        +        'success' => 'Category created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Category was not updated, please try again',
        +        'success' => 'Category updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this category?',
        +        'error'   => 'There was an issue deleting the category. Please try again.',
        +        'success' => 'The category was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/categories/table.php b/resources/lang/mn/admin/categories/table.php
        new file mode 100644
        index 0000000000..a3ee96ae7f
        --- /dev/null
        +++ b/resources/lang/mn/admin/categories/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'parent'   					=> 'Parent',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Asset Category Name',
        +
        +);
        diff --git a/resources/lang/mn/admin/companies/general.php b/resources/lang/mn/admin/companies/general.php
        new file mode 100644
        index 0000000000..9a47968977
        --- /dev/null
        +++ b/resources/lang/mn/admin/companies/general.php
        @@ -0,0 +1,6 @@
        +<?php
        +return [
        +    'about_companies_title'            => 'About Companies',
        +    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'select_company' => 'Select Company',
        +];
        diff --git a/resources/lang/mn/admin/companies/message.php b/resources/lang/mn/admin/companies/message.php
        new file mode 100644
        index 0000000000..a6db573519
        --- /dev/null
        +++ b/resources/lang/mn/admin/companies/message.php
        @@ -0,0 +1,18 @@
        +<?php
        +return array(
        +    'does_not_exist' => 'Company does not exist.',
        +    'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
        +    'create' => array(
        +        'error'   => 'Company was not created, please try again.',
        +        'success' => 'Company created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Company was not updated, please try again',
        +        'success' => 'Company updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm' => 'Are you sure you wish to delete this company?',
        +        'error'   => 'There was an issue deleting the company. Please try again.',
        +        'success' => 'The Company was deleted successfully.'
        +    )
        +);
        diff --git a/resources/lang/mn/admin/companies/table.php b/resources/lang/mn/admin/companies/table.php
        new file mode 100644
        index 0000000000..2f86126ff2
        --- /dev/null
        +++ b/resources/lang/mn/admin/companies/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +return array(
        +    'companies' => 'Companies',
        +    'create'    => 'Create Company',
        +    'title'     => 'Company',
        +    'update'    => 'Update Company',
        +    'name'      => 'Company Name',
        +    'id'        => 'ID',
        +);
        diff --git a/resources/lang/mn/admin/components/general.php b/resources/lang/mn/admin/components/general.php
        new file mode 100644
        index 0000000000..75c9d250ab
        --- /dev/null
        +++ b/resources/lang/mn/admin/components/general.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about_components_title' 			=> 'About Components',
        +    'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        +    'component_name'                  => 'Component Name',
        +    'checkin'                             => 'Checkin Component',
        +    'checkout'                             => 'Checkout Component',
        +    'cost'				=> 'Purchase Cost',
        +    'create'                             => 'Create Component',
        +    'edit'                             => 'Edit Component',
        +    'date'					=> 'Purchase Date',
        +    'order'					=> 'Order Number',
        +    'remaining' 			             => 'Remaining',
        +    'total' 			                 => 'Total',
        +    'update'                            => 'Update Component',
        +);
        diff --git a/resources/lang/mn/admin/components/message.php b/resources/lang/mn/admin/components/message.php
        new file mode 100644
        index 0000000000..1d13970f23
        --- /dev/null
        +++ b/resources/lang/mn/admin/components/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Component does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Component was not created, please try again.',
        +        'success' => 'Component created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Component was not updated, please try again',
        +        'success' => 'Component updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this component?',
        +        'error'   => 'There was an issue deleting the component. Please try again.',
        +        'success' => 'The component was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Component was not checked out, please try again',
        +        'success' 		=> 'Component checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Component was not checked in, please try again',
        +        'success' 		=> 'Component checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/mn/admin/components/table.php b/resources/lang/mn/admin/components/table.php
        new file mode 100644
        index 0000000000..3d4fed6a7f
        --- /dev/null
        +++ b/resources/lang/mn/admin/components/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Component Name',
        +);
        diff --git a/resources/lang/mn/admin/consumables/general.php b/resources/lang/mn/admin/consumables/general.php
        new file mode 100644
        index 0000000000..53a69f8c03
        --- /dev/null
        +++ b/resources/lang/mn/admin/consumables/general.php
        @@ -0,0 +1,13 @@
        +<?php
        +
        +return array(
        +    'about_consumables_title' 			=> 'About Consumables',
        +    'about_consumables_text'  			=> 'Consumables are anything purchased that will be used up over time. For example, printer ink or copier paper.',
        +    'checkout'                          => 'Checkout Consumable to User',
        +    'consumable_name'                   => 'Consumable Name',
        +    'create'                            => 'Create Consumable',
        +    'item_no'                           => 'Item No.',
        +    'remaining' 			            => 'Remaining',
        +    'total' 			                => 'Total',
        +    'update'                            => 'Update Consumable',
        +);
        diff --git a/resources/lang/mn/admin/consumables/message.php b/resources/lang/mn/admin/consumables/message.php
        new file mode 100644
        index 0000000000..48a3cfbd9f
        --- /dev/null
        +++ b/resources/lang/mn/admin/consumables/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Consumable does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Consumable was not created, please try again.',
        +        'success' => 'Consumable created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Consumable was not updated, please try again',
        +        'success' => 'Consumable updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this consumable?',
        +        'error'   => 'There was an issue deleting the consumable. Please try again.',
        +        'success' => 'The consumable was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Consumable was not checked out, please try again',
        +        'success' 		=> 'Consumable checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Consumable was not checked in, please try again',
        +        'success' 		=> 'Consumable checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/mn/admin/consumables/table.php b/resources/lang/mn/admin/consumables/table.php
        new file mode 100644
        index 0000000000..bb76721f17
        --- /dev/null
        +++ b/resources/lang/mn/admin/consumables/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Consumable Name',
        +);
        diff --git a/resources/lang/mn/admin/custom_fields/general.php b/resources/lang/mn/admin/custom_fields/general.php
        new file mode 100644
        index 0000000000..f2e6df90cb
        --- /dev/null
        +++ b/resources/lang/mn/admin/custom_fields/general.php
        @@ -0,0 +1,30 @@
        +<?php
        +
        +return array(
        +    'custom_fields'		        => 'Custom Fields',
        +    'field'		                => 'Field',
        +    'about_fieldsets_title'		=> 'About Fieldsets',
        +    'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        +    'custom_format'             => 'Custom format...',
        +    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        +    'encrypted'      	        => 'Encrypted',
        +    'fieldset'      	        => 'Fieldset',
        +    'qty_fields'      	      => 'Qty Fields',
        +    'fieldsets'      	        => 'Fieldsets',
        +    'fieldset_name'           => 'Fieldset Name',
        +    'field_name'              => 'Field Name',
        +    'field_values'            => 'Field Values',
        +    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_element'           => 'Form Element',
        +    'field_element_short'     => 'Element',
        +    'field_format'            => 'Format',
        +    'field_custom_format'     => 'Custom Format',
        +    'required'   		          => 'Required',
        +    'req'   		              => 'Req.',
        +    'used_by_models'   		    => 'Used By Models',
        +    'order'   		            => 'Order',
        +    'create_fieldset'         => 'New Fieldset',
        +    'create_field'            => 'New Custom Field',
        +    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +);
        diff --git a/resources/lang/mn/admin/custom_fields/message.php b/resources/lang/mn/admin/custom_fields/message.php
        new file mode 100644
        index 0000000000..ed66a6ba16
        --- /dev/null
        +++ b/resources/lang/mn/admin/custom_fields/message.php
        @@ -0,0 +1,57 @@
        +<?php
        +
        +return array(
        +
        +    'field' => array(
        +        'invalid'   => 'That field does not exist.',
        +        'already_added'   => 'Field already added',
        +
        +        'create' => array(
        +            'error'   => 'Field was not created, please try again.',
        +            'success' => 'Field created successfully.',
        +            'assoc_success' => 'Field successfully added to fieldset.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Field was not updated, please try again',
        +            'success' => 'Field updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this field?',
        +            'error'   => 'There was an issue deleting the field. Please try again.',
        +            'success' => 'The field was deleted successfully.',
        +            'in_use'   => 'Field is still in use.',
        +        )
        +
        +    ),
        +
        +    'fieldset' => array(
        +
        +        'does_not_exist' => 'Fieldset does not exist',
        +
        +        'create' => array(
        +            'error'   => 'Fieldset was not created, please try again.',
        +            'success' => 'Fieldset created successfully.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Fieldset was not updated, please try again',
        +            'success' => 'Fieldset updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        +            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        +            'success' => 'The fieldset was deleted successfully.',
        +            'in_use'   => 'Fieldset is still in use.',
        +        )
        +
        +    ),
        +
        +
        +
        +
        +
        +
        +);
        diff --git a/resources/lang/mn/admin/departments/message.php b/resources/lang/mn/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/mn/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/departments/table.php b/resources/lang/mn/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/mn/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/mn/admin/depreciations/general.php b/resources/lang/mn/admin/depreciations/general.php
        new file mode 100644
        index 0000000000..1fca0e2cb7
        --- /dev/null
        +++ b/resources/lang/mn/admin/depreciations/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return array(
        +    'about_asset_depreciations'  			=> 'About Asset Depreciations',
        +    'about_depreciations'  					=> 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
        +    'asset_depreciations'  					=> 'Asset Depreciations',
        +    'create'  					            => 'Create Depreciation',
        +    'depreciation_name'  					=> 'Depreciation Name',
        +    'number_of_months'  					=> 'Number of Months',
        +    'update'  					            => 'Update Depreciation',
        +
        +);
        diff --git a/resources/lang/mn/admin/depreciations/message.php b/resources/lang/mn/admin/depreciations/message.php
        new file mode 100644
        index 0000000000..c20e52c13c
        --- /dev/null
        +++ b/resources/lang/mn/admin/depreciations/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Depreciation class does not exist.',
        +    'assoc_users'	 => 'This depreciation is currently associated with one or more models and cannot be deleted. Please delete the models, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Depreciation class was not created, please try again. :(',
        +        'success' => 'Depreciation class created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Depreciation class was not updated, please try again',
        +        'success' => 'Depreciation class updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this depreciation class?',
        +        'error'   => 'There was an issue deleting the depreciation class. Please try again.',
        +        'success' => 'The depreciation class was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/depreciations/table.php b/resources/lang/mn/admin/depreciations/table.php
        new file mode 100644
        index 0000000000..5ba01d132c
        --- /dev/null
        +++ b/resources/lang/mn/admin/depreciations/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'id'      => 'ID',
        +    'months'   => 'Months',
        +    'term'   => 'Term',
        +    'title'      => 'Name ',
        +
        +);
        diff --git a/resources/lang/mn/admin/groups/message.php b/resources/lang/mn/admin/groups/message.php
        new file mode 100644
        index 0000000000..f14b6339e8
        --- /dev/null
        +++ b/resources/lang/mn/admin/groups/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'group_exists'        => 'Group already exists!',
        +    'group_not_found'     => 'Group [:id] does not exist.',
        +    'group_name_required' => 'The name field is required',
        +
        +    'success' => array(
        +        'create' => 'Group was successfully created.',
        +        'update' => 'Group was successfully updated.',
        +        'delete' => 'Group was successfully deleted.',
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this group?',
        +        'create' => 'There was an issue creating the group. Please try again.',
        +        'update' => 'There was an issue updating the group. Please try again.',
        +        'delete' => 'There was an issue deleting the group. Please try again.',
        +    ),
        +
        +);
        diff --git a/resources/lang/mn/admin/groups/table.php b/resources/lang/mn/admin/groups/table.php
        new file mode 100644
        index 0000000000..61f060a116
        --- /dev/null
        +++ b/resources/lang/mn/admin/groups/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +
        +return array(
        +
        +    'id'         => 'Id',
        +    'name'       => 'Name',
        +    'users'      => '# of Users',
        +
        +);
        diff --git a/resources/lang/mn/admin/groups/titles.php b/resources/lang/mn/admin/groups/titles.php
        new file mode 100644
        index 0000000000..99e8cc1f6f
        --- /dev/null
        +++ b/resources/lang/mn/admin/groups/titles.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +return array(
        +    'about_groups_title'            => 'About Groups',
        +    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'group_management' 	 	=> 'Group Management',
        +    'create' 	 	 	    => 'Create New Group',
        +    'update' 	 		        => 'Edit Group',
        +    'group_name' 	 		=> 'Group Name',
        +    'group_admin' 	 		=> 'Group Admin',
        +    'allow' 	 			=> 'Allow',
        +    'deny' 	 				=> 'Deny',
        +
        +);
        diff --git a/resources/lang/mn/admin/hardware/form.php b/resources/lang/mn/admin/hardware/form.php
        new file mode 100644
        index 0000000000..abded281fa
        --- /dev/null
        +++ b/resources/lang/mn/admin/hardware/form.php
        @@ -0,0 +1,42 @@
        +<?php
        +
        +return array(
        +	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +  'bulk_delete_help'	=> 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
        +  'bulk_delete_warn'	=> 'You are about to delete :asset_count assets.',
        +	'bulk_update'		=> 'Bulk Update Assets',
        +	'bulk_update_help'	=> 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
        +	'bulk_update_warn'	=> 'You are about to edit the properties of :asset_count assets.',
        +    'checkedout_to'		=> 'Checked Out To',
        +    'checkout_date'		=> 'Checkout Date',
        +    'checkin_date'		=> 'Checkin Date',
        +    'checkout_to'		=> 'Checkout to',
        +    'cost'				=> 'Purchase Cost',
        +    'create'			=> 'Create Asset',
        +    'date'				=> 'Purchase Date',
        +    'depreciates_on'	=> 'Depreciates On',
        +    'default_location'	=> 'Default Location',
        +    'eol_date'			=> 'EOL Date',
        +    'eol_rate'			=> 'EOL Rate',
        +    'expected_checkin'  => 'Expected Checkin Date',
        +    'expires'			=> 'Expires',
        +    'fully_depreciated'	=> 'Fully Depreciated',
        +    'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
        +    'mac_address'		=> 'MAC Address',
        +    'manufacturer'		=> 'Manufacturer',
        +    'model'				=> 'Model',
        +    'months'			=> 'months',
        +    'name'				=> 'Asset Name',
        +    'notes'				=> 'Notes',
        +    'order'				=> 'Order Number',
        +    'qr'				=> 'QR Code',
        +    'requestable'		=> 'Users may request this asset',
        +    'select_statustype'	=> 'Select Status Type',
        +    'serial'			=> 'Serial',
        +    'status'			=> 'Status',
        +    'tag'				=> 'Asset Tag',
        +    'update'			=> 'Asset Update',
        +    'warranty'			=> 'Warranty',
        +    'years'				=> 'years',
        +)
        +;
        diff --git a/resources/lang/mn/admin/hardware/general.php b/resources/lang/mn/admin/hardware/general.php
        new file mode 100644
        index 0000000000..1def86dc9e
        --- /dev/null
        +++ b/resources/lang/mn/admin/hardware/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_assets_title'           => 'About Assets',
        +    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +	'archived'  				=> 'Archived',
        +    'asset'  					=> 'Asset',
        +    'bulk_checkout'             => 'Checkout Assets to User',
        +    'checkin'  					=> 'Checkin Asset',
        +    'checkout'  				=> 'Checkout Asset',
        +    'clone'  					=> 'Clone Asset',
        +    'deployable'  				=> 'Deployable',
        +    'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        +    'edit'  					=> 'Edit Asset',
        +	'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'model_deleted'  			=> 'This Assets model has been deleted. You must restore the model before you can restore the Asset.<br/> <a href="/hardware/models/:model_id/restore">Click here to restore the model</a>.',
        +    'requestable'               => 'Requestable',
        +    'requested'				    => 'Requested',
        +    'restore'  					=> 'Restore Asset',
        +    'pending'  					=> 'Pending',
        +    'undeployable'  			=> 'Undeployable',
        +    'view'  					=> 'View Asset',
        +);
        diff --git a/resources/lang/mn/admin/hardware/message.php b/resources/lang/mn/admin/hardware/message.php
        new file mode 100644
        index 0000000000..112cf77ded
        --- /dev/null
        +++ b/resources/lang/mn/admin/hardware/message.php
        @@ -0,0 +1,82 @@
        +<?php
        +
        +return array(
        +
        +    'undeployable' 		=> '<strong>Warning: </strong> This asset has been marked as currently undeployable.
        +                        If this status has changed, please update the asset status.',
        +    'does_not_exist' 	=> 'Asset does not exist.',
        +    'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
        +    'assoc_users'	 	=> 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
        +
        +    'create' => array(
        +        'error'   		=> 'Asset was not created, please try again. :(',
        +        'success' 		=> 'Asset created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   			=> 'Asset was not updated, please try again',
        +        'success' 			=> 'Asset updated successfully.',
        +        'nothing_updated'	=>  'No fields were selected, so nothing was updated.',
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Asset was not restored, please try again',
        +        'success' 		=> 'Asset restored successfully.'
        +    ),
        +
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +    'import' => array(
        +        'error'                 => 'Some items did not import correctly.',
        +        'errorDetail'           => 'The following Items were not imported because of errors.',
        +        'success'               => "Your file has been imported",
        +        'file_delete_success'   => "Your file has been been successfully deleted",
        +        'file_delete_error'      => "The file was unable to be deleted",
        +    ),
        +
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this asset?',
        +        'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
        +        'success' 		=> 'The asset was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   		=> 'Asset was not checked out, please try again',
        +        'success' 		=> 'Asset checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'not_available' => 'That asset is not available for checkout!'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Asset was not checked in, please try again',
        +        'success' 		=> 'Asset checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'already_checked_in'  => 'That asset is already checked in.',
        +
        +    ),
        +
        +    'requests' => array(
        +        'error'   		=> 'Asset was not requested, please try again',
        +        'success' 		=> 'Asset requested successfully.',
        +        'canceled'      => 'Checkout request successfully canceled'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/hardware/table.php b/resources/lang/mn/admin/hardware/table.php
        new file mode 100644
        index 0000000000..e8baa09d5a
        --- /dev/null
        +++ b/resources/lang/mn/admin/hardware/table.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'asset_tag'   	=> 'Asset Tag',
        +    'asset_model'       => 'Model',
        +    'book_value'  	=> 'Value',
        +    'change' 		=> 'In/Out',
        +    'checkout_date' => 'Checkout Date',
        +    'checkoutto' 	=> 'Checked Out',
        +    'diff' 			=> 'Diff',
        +    'dl_csv' 		=> 'Download CSV',
        +    'eol' 			=> 'EOL',
        +    'id'      		=> 'ID',
        +    'location' 		=> 'Location',
        +    'purchase_cost'	=> 'Cost',
        +    'purchase_date'	=> 'Purchased',
        +    'serial'   		=> 'Serial',
        +    'status'   		=> 'Status',
        +    'title'      	=> 'Asset ',
        +    'image'		=> 'Device Image',
        +    'days_without_acceptance' => 'Days Without Acceptance'
        +
        +);
        diff --git a/resources/lang/mn/admin/licenses/form.php b/resources/lang/mn/admin/licenses/form.php
        new file mode 100644
        index 0000000000..ce29167874
        --- /dev/null
        +++ b/resources/lang/mn/admin/licenses/form.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'asset'             => 'Asset',
        +    'checkin'           => 'Checkin',
        +    'create'            => 'Create License',
        +    'expiration'        => 'Expiration Date',
        +    'license_key'       => 'Product Key',
        +    'maintained'        => 'Maintained',
        +    'name'              => 'Software Name',
        +    'no_depreciation'   => 'Do Not Depreciate',
        +    'purchase_order'    => 'Purchase Order Number',
        +    'reassignable'      => 'Reassignable',
        +    'remaining_seats'   => 'Remaining Seats',
        +    'seats'             => 'Seats',
        +    'termination_date'  => 'Termination Date',
        +    'to_email'          => 'Licensed to Email',
        +    'to_name'           => 'Licensed to Name',
        +    'update'            => 'Update License',
        +    'checkout_help'     => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
        +);
        diff --git a/resources/lang/mn/admin/licenses/general.php b/resources/lang/mn/admin/licenses/general.php
        new file mode 100644
        index 0000000000..25a536ec56
        --- /dev/null
        +++ b/resources/lang/mn/admin/licenses/general.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'checkin'  					=> 'Checkin License Seat',
        +    'checkout_history'  		=> 'Checkout History',
        +    'checkout'  				=> 'Checkout License Seat',
        +    'edit'  					=> 'Edit License',
        +    'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'clone'  					=> 'Clone License',
        +    'history_for'  				=> 'History for ',
        +    'in_out'  					=> 'In/Out',
        +    'info'  					=> 'License Info',
        +    'license_seats'  			=> 'License Seats',
        +    'seat'  					=> 'Seat',
        +    'seats'  					=> 'Seats',
        +    'software_licenses'  		=> 'Software Licenses',
        +    'user'  					=> 'User',
        +    'view'  					=> 'View License',
        +);
        diff --git a/resources/lang/mn/admin/licenses/message.php b/resources/lang/mn/admin/licenses/message.php
        new file mode 100644
        index 0000000000..d5dbfe77b9
        --- /dev/null
        +++ b/resources/lang/mn/admin/licenses/message.php
        @@ -0,0 +1,50 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'License does not exist.',
        +    'user_does_not_exist' => 'User does not exist.',
        +    'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
        +    'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
        +    'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'License was not created, please try again.',
        +        'success' => 'License created successfully.'
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'License was not updated, please try again',
        +        'success' => 'License updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this license?',
        +        'error'   => 'There was an issue deleting the license. Please try again.',
        +        'success' => 'The license was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   => 'There was an issue checking out the license. Please try again.',
        +        'success' => 'The license was checked out successfully'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   => 'There was an issue checking in the license. Please try again.',
        +        'success' => 'The license was checked in successfully'
        +    ),
        +
        +);
        diff --git a/resources/lang/mn/admin/licenses/table.php b/resources/lang/mn/admin/licenses/table.php
        new file mode 100644
        index 0000000000..dfce4136cb
        --- /dev/null
        +++ b/resources/lang/mn/admin/licenses/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'assigned_to'   	=> 'Assigned To',
        +    'checkout'   		=> 'In/Out',
        +    'id'      			=> 'ID',
        +    'license_email'   	=> 'License Email',
        +    'license_name'   	=> 'Licensed To',
        +    'purchase_date'   	=> 'Purchase Date',
        +    'purchased'   		=> 'Purchased',
        +    'seats'   			=> 'Seats',
        +    'hardware'   		=> 'Hardware',
        +    'serial'   			=> 'Serial',
        +    'title'      		=> 'License',
        +
        +);
        diff --git a/resources/lang/mn/admin/locations/message.php b/resources/lang/mn/admin/locations/message.php
        new file mode 100644
        index 0000000000..3ba1eed3b6
        --- /dev/null
        +++ b/resources/lang/mn/admin/locations/message.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Location does not exist.',
        +    'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
        +    'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
        +    'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Location was not created, please try again.',
        +        'success' => 'Location created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Location was not updated, please try again',
        +        'success' => 'Location updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this location?',
        +        'error'   => 'There was an issue deleting the location. Please try again.',
        +        'success' => 'The location was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/locations/table.php b/resources/lang/mn/admin/locations/table.php
        new file mode 100644
        index 0000000000..ffa69307d5
        --- /dev/null
        +++ b/resources/lang/mn/admin/locations/table.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_locations_title'     => 'About Locations',
        +    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'assets_checkedout'         => 'Assets Assigned',
        +    'id'                        => 'ID',
        +    'city'                      => 'City',
        +    'state'                     => 'State',
        +    'country'                   => 'Country',
        +    'create'                    => 'Create Location',
        +    'update'                    => 'Update Location',
        +    'name'                      => 'Location Name',
        +    'address'                   => 'Address',
        +    'zip'                       => 'Postal Code',
        +    'locations'                 => 'Locations',
        +    'parent'                    => 'Parent',
        +    'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
        +    );
        diff --git a/resources/lang/mn/admin/manufacturers/message.php b/resources/lang/mn/admin/manufacturers/message.php
        new file mode 100644
        index 0000000000..6586d2af44
        --- /dev/null
        +++ b/resources/lang/mn/admin/manufacturers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Manufacturer does not exist.',
        +    'assoc_users'	 => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Manufacturer was not created, please try again.',
        +        'success' => 'Manufacturer created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Manufacturer was not updated, please try again',
        +        'success' => 'Manufacturer updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this manufacturer?',
        +        'error'   => 'There was an issue deleting the manufacturer. Please try again.',
        +        'success' => 'The Manufacturer was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/manufacturers/table.php b/resources/lang/mn/admin/manufacturers/table.php
        new file mode 100644
        index 0000000000..4e3ea9904d
        --- /dev/null
        +++ b/resources/lang/mn/admin/manufacturers/table.php
        @@ -0,0 +1,16 @@
        +<?php
        +
        +return array(
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
        +    'asset_manufacturers'	=> 'Asset Manufacturers',
        +    'create'				=> 'Create Manufacturer',
        +    'id'   					=> 'ID',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
        +    'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
        +
        +);
        diff --git a/resources/lang/mn/admin/models/general.php b/resources/lang/mn/admin/models/general.php
        new file mode 100644
        index 0000000000..e0da09f780
        --- /dev/null
        +++ b/resources/lang/mn/admin/models/general.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'about_models_title'     => 'About Asset Models',
        +    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'deleted'  					        => 'This model has been deleted. <a href="/hardware/models/:model_id/restore">Click here to restore it</a>.',
        +    'restore'                   => 'Restore Model',
        +    'requestable'               => 'Users may request this model',
        +	'show_mac_address'			      => 'Show MAC address field in assets in this model',
        +    'view_deleted'              => 'View Deleted',
        +    'view_models'               => 'View Models',
        +    'fieldset'                  => 'Fieldset',
        +    'no_custom_field'           => 'No custom fields',
        +
        +);
        diff --git a/resources/lang/mn/admin/models/message.php b/resources/lang/mn/admin/models/message.php
        new file mode 100644
        index 0000000000..5b1b9a1a1b
        --- /dev/null
        +++ b/resources/lang/mn/admin/models/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Model does not exist.',
        +    'assoc_users'	 => 'This model is currently associated with one or more assets and cannot be deleted. Please delete the assets, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Model was not created, please try again.',
        +        'success' => 'Model created successfully.',
        +        'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Model was not updated, please try again',
        +        'success' => 'Model updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this asset model?',
        +        'error'   => 'There was an issue deleting the model. Please try again.',
        +        'success' => 'The model was deleted successfully.'
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Model was not restored, please try again',
        +        'success' 		=> 'Model restored successfully.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
        +);
        diff --git a/resources/lang/mn/admin/models/table.php b/resources/lang/mn/admin/models/table.php
        new file mode 100644
        index 0000000000..11a512b3d3
        --- /dev/null
        +++ b/resources/lang/mn/admin/models/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'create'				=> 'Create Asset Model',
        +    'created_at' 			=> 'Created at',
        +    'eol'	 				=> 'EOL',
        +    'modelnumber'   		=> 'Model No.',
        +    'name'      			=> 'Asset Model Name',
        +    'numassets' 			=> 'Assets',
        +    'title'					=> 'Asset Models',
        +    'update'				=> 'Update Asset Model',
        +    'view'					=> 'View Asset Model',
        +    'update'				=> 'Update Asset Model',
        +    'clone'				=> 'Clone Model',
        +    'edit'				=> 'Edit Model',
        +);
        diff --git a/resources/lang/mn/admin/reports/general.php b/resources/lang/mn/admin/reports/general.php
        new file mode 100644
        index 0000000000..b03b97546f
        --- /dev/null
        +++ b/resources/lang/mn/admin/reports/general.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'info'   => 'Select the options you want for your asset report.'
        +);
        diff --git a/resources/lang/mn/admin/reports/message.php b/resources/lang/mn/admin/reports/message.php
        new file mode 100644
        index 0000000000..d4c8f8198f
        --- /dev/null
        +++ b/resources/lang/mn/admin/reports/message.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'error'   => 'You must select at least ONE option.'
        +);
        diff --git a/resources/lang/mn/admin/settings/general.php b/resources/lang/mn/admin/settings/general.php
        new file mode 100644
        index 0000000000..73fd052a58
        --- /dev/null
        +++ b/resources/lang/mn/admin/settings/general.php
        @@ -0,0 +1,148 @@
        +<?php
        +
        +return array(
        +    'ad'				        => 'Active Directory',
        +    'ad_domain'				    => 'Active Directory domain',
        +    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        +    'is_ad'				        => 'This is an Active Directory server',
        +	'alert_email'				=> 'Send alerts to',
        +	'alerts_enabled'			=> 'Alerts Enabled',
        +	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        +	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
        +	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
        +	'auto_increment_prefix'		=> 'Prefix (optional)',
        +	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        +	'backups'					=> 'Backups',
        +	'barcode_settings'			=> 'Barcode Settings',
        +    'confirm_purge'			    => 'Confirm Purge',
        +    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        +	'custom_css'				=> 'Custom CSS',
        +	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
        +	'default_currency'  		=> 'Default Currency',
        +	'default_eula_text'			=> 'Default EULA',
        +  'default_language'					=> 'Default Language',
        +	'default_eula_help_text'	=> 'You can also associate custom EULAs to specific asset categories.',
        +    'display_asset_name'        => 'Display Asset Name',
        +    'display_checkout_date'     => 'Display Checkout Date',
        +    'display_eol'               => 'Display EOL in table view',
        +    'display_qr'                => 'Display Square Codes',
        +	'display_alt_barcode'		=> 'Display 1D barcode',
        +	'barcode_type'				=> '2D Barcode Type',
        +	'alt_barcode_type'			=> '1D barcode type',
        +    'eula_settings'				=> 'EULA Settings',
        +    'eula_markdown'				=> 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'general_settings'			=> 'General Settings',
        +	'generate_backup'			=> 'Generate Backup',
        +    'header_color'              => 'Header Color',
        +    'info'                      => 'These settings let you customize certain aspects of your installation.',
        +    'laravel'                   => 'Laravel Version',
        +    'ldap_enabled'              => 'LDAP enabled',
        +    'ldap_integration'          => 'LDAP Integration',
        +    'ldap_settings'             => 'LDAP Settings',
        +    'ldap_server'               => 'LDAP Server',
        +    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        +	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
        +	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
        +	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        +    'ldap_tls'                  => 'Use TLS',
        +    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        +    'ldap_uname'                => 'LDAP Bind Username',
        +    'ldap_pword'                => 'LDAP Bind Password',
        +    'ldap_basedn'               => 'Base Bind DN',
        +    'ldap_filter'               => 'LDAP Filter',
        +    'ldap_pw_sync'              => 'LDAP Password Sync',
        +    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_username_field'       => 'Username Field',
        +    'ldap_lname_field'          => 'Last Name',
        +    'ldap_fname_field'          => 'LDAP First Name',
        +    'ldap_auth_filter_query'    => 'LDAP Authentication query',
        +    'ldap_version'              => 'LDAP Version',
        +    'ldap_active_flag'          => 'LDAP Active Flag',
        +    'ldap_emp_num'              => 'LDAP Employee Number',
        +    'ldap_email'                => 'LDAP Email',
        +    'load_remote_text'          => 'Remote Scripts',
        +    'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
        +    'logo'                    	=> 'Logo',
        +    'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
        +    'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        +    'optional'					=> 'optional',
        +    'per_page'                  => 'Results Per Page',
        +    'php'                       => 'PHP Version',
        +    'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
        +    'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
        +    'qr_help'                   => 'Enable QR Codes first to set this',
        +    'qr_text'                   => 'QR Code Text',
        +    'setting'                   => 'Setting',
        +    'settings'                  => 'Settings',
        +    'site_name'                 => 'Site Name',
        +    'slack_botname'             => 'Slack Botname',
        +    'slack_channel'             => 'Slack Channel',
        +    'slack_endpoint'            => 'Slack Endpoint',
        +    'slack_integration'         => 'Slack Settings',
        +    'slack_integration_help'    => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new">create an incoming webhook</a> on your Slack account.',
        +    'snipe_version'  			=> 'Snipe-IT version',
        +    'system'                    => 'System Information',
        +    'update'                    => 'Update Settings',
        +    'value'                     => 'Value',
        +    'brand'                     => 'Branding',
        +    'about_settings_title'      => 'About Settings',
        +    'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
        +    'labels_per_page'           => 'Labels per page',
        +    'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Page margins (inches)',
        +    'purge'                    => 'Purge Deleted Records',
        +    'labels_display_bgutter'    => 'Label bottom gutter',
        +    'labels_display_sgutter'    => 'Label side gutter',
        +    'labels_fontsize'           => 'Label font size',
        +    'labels_pagewidth'          => 'Label sheet width',
        +    'labels_pageheight'         => 'Label sheet height',
        +    'label_gutters'        => 'Label spacing (inches)',
        +    'page_dimensions'        => 'Page dimensions (inches)',
        +    'label_fields'          => 'Label visible fields',
        +    'inches'        => 'inches',
        +    'width_w'        => 'w',
        +    'height_h'        => 'h',
        +    'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Two Factor Authentication',
        +    'two_factor_secret'        => 'Two-Factor Code',
        +    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        +    'two_factor_enabled_text'        => 'Enable Two Factor',
        +    'two_factor_reset'        => 'Reset Two-Factor Secret',
        +    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        +    'two_factor_reset_success'          => 'Two factor device successfully reset',
        +    'two_factor_reset_error'          => 'Two factor device reset failed',
        +    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        +    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        +    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_required'        => 'Required for all users',
        +    'two_factor_disabled'        => 'Disabled',
        +    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        +    'two_factor_config_complete'	=> 'Submit Code',
        +    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        +    'require_accept_signature'      => 'Require Signature',
        +    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'left'        => 'left',
        +    'right'        => 'right',
        +    'top'        => 'top',
        +    'bottom'        => 'bottom',
        +    'vertical'        => 'vertical',
        +    'horizontal'        => 'horizontal',
        +    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +);
        diff --git a/resources/lang/mn/admin/settings/message.php b/resources/lang/mn/admin/settings/message.php
        new file mode 100644
        index 0000000000..736d5c3e9e
        --- /dev/null
        +++ b/resources/lang/mn/admin/settings/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +
        +    'update' => array(
        +        'error'                 => 'An error has occurred while updating. ',
        +        'success'               => 'Settings updated successfully.'
        +    ),
        +    'backup' => array(
        +        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        +        'file_deleted'          => 'The backup file was successfully deleted. ',
        +        'generated'             => 'A new backup file was successfully created.',
        +        'file_not_found'        => 'That backup file could not be found on the server.',
        +    ),
        +    'purge' => array(
        +        'error'     => 'An error has occurred while purging. ',
        +        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        +        'success'               => 'Deleted records successfully purged.'
        +    ),
        +
        +);
        diff --git a/resources/lang/mn/admin/statuslabels/message.php b/resources/lang/mn/admin/statuslabels/message.php
        new file mode 100644
        index 0000000000..619a5a509c
        --- /dev/null
        +++ b/resources/lang/mn/admin/statuslabels/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Status Label does not exist.',
        +    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Status Label was not created, please try again.',
        +        'success' => 'Status Label created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Status Label was not updated, please try again',
        +        'success' => 'Status Label updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        +        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        +        'success' => 'The Status Label was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/statuslabels/table.php b/resources/lang/mn/admin/statuslabels/table.php
        new file mode 100644
        index 0000000000..b9b5b7ec4e
        --- /dev/null
        +++ b/resources/lang/mn/admin/statuslabels/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about'      	=> 'About Status Labels',
        +    'archived'      	=> 'Archived',
        +    'create'      	=> 'Create Status Label',
        +    'color'      	=> 'Chart Color',
        +    'deployable'      	=> 'Deployable',
        +    'info'      	=> 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
        +    'name'      	=> 'Status Name',
        +    'pending'      	=> 'Pending',
        +    'status_type'   => 'Status Type',
        +    'show_in_nav'   => 'Show in side nav',
        +    'title'      	=> 'Status Labels',
        +    'undeployable'  => 'Undeployable',
        +    'update'      	=> 'Update Status Label',
        +);
        diff --git a/resources/lang/mn/admin/suppliers/message.php b/resources/lang/mn/admin/suppliers/message.php
        new file mode 100644
        index 0000000000..df4bc41af3
        --- /dev/null
        +++ b/resources/lang/mn/admin/suppliers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Supplier does not exist.',
        +    'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Supplier was not created, please try again.',
        +        'success' => 'Supplier created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Supplier was not updated, please try again',
        +        'success' => 'Supplier updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this supplier?',
        +        'error'   => 'There was an issue deleting the supplier. Please try again.',
        +        'success' => 'Supplier was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/mn/admin/suppliers/table.php b/resources/lang/mn/admin/suppliers/table.php
        new file mode 100644
        index 0000000000..2a7b07ca93
        --- /dev/null
        +++ b/resources/lang/mn/admin/suppliers/table.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +    'about_suppliers_title' => 'About Suppliers',
        +    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'address'               => 'Supplier Address',
        +    'assets'                => 'Assets',
        +    'city'                  => 'City',
        +    'contact'               => 'Contact Name',
        +    'country'               => 'Country',
        +    'create'                => 'Create Supplier',
        +    'email'                 => 'Email',
        +    'fax'                   => 'Fax',
        +    'id'                    => 'ID',
        +    'licenses'              => 'Licenses',
        +    'name'                  => 'Supplier Name',
        +    'notes'                 => 'Notes',
        +    'phone'                 => 'Phone',
        +    'state'                 => 'State',
        +    'suppliers'             => 'Suppliers',
        +    'update'                => 'Update Supplier',
        +    'url'                   => 'URL',
        +    'view'                  => 'View Supplier',
        +    'view_assets_for'       => 'View Assets for',
        +    'zip'                   => 'Postal Code',
        +
        +);
        diff --git a/resources/lang/mn/admin/users/general.php b/resources/lang/mn/admin/users/general.php
        new file mode 100644
        index 0000000000..985138d065
        --- /dev/null
        +++ b/resources/lang/mn/admin/users/general.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +
        +return array(
        +
        +    'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
        +    'current_assets'    => 'Assets currently checked out to this user',
        +    'clone'             => 'Clone User',
        +    'contact_user'      => 'Contact :name',
        +    'edit'              => 'Edit User',
        +    'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
        +    'last_login'        => 'Last Login',
        +    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'software_user'     => 'Software Checked out to :name',
        +    'view_user'         => 'View User :name',
        +    'usercsv'           => 'CSV file',
        +    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        +    'two_factor_enrolled' => '2FA Device Enrolled ',
        +    'two_factor_active'   => '2FA Active ',
        +    );
        diff --git a/resources/lang/mn/admin/users/message.php b/resources/lang/mn/admin/users/message.php
        new file mode 100644
        index 0000000000..8ee552afab
        --- /dev/null
        +++ b/resources/lang/mn/admin/users/message.php
        @@ -0,0 +1,59 @@
        +<?php
        +
        +return array(
        +
        +    'accepted'                  => 'You have successfully accepted this asset.',
        +    'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
        +    'user_exists'               => 'User already exists!',
        +    'user_not_found'            => 'User [:id] does not exist.',
        +    'user_login_required'       => 'The login field is required',
        +    'user_password_required'    => 'The password is required.',
        +    'insufficient_permissions'  => 'Insufficient Permissions.',
        +    'user_deleted_warning'      => 'This user has been deleted. You will have to restore this user to edit them or assign them new assets.',
        +    'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
        +
        +
        +    'success' => array(
        +        'create'    => 'User was successfully created.',
        +        'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
        +        'delete'    => 'User was successfully deleted.',
        +        'ban'       => 'User was successfully banned.',
        +        'unban'     => 'User was successfully unbanned.',
        +        'suspend'   => 'User was successfully suspended.',
        +        'unsuspend' => 'User was successfully unsuspended.',
        +        'restored'  => 'User was successfully restored.',
        +        'import'    => 'Users imported successfully.',
        +    ),
        +
        +    'error' => array(
        +        'create' => 'There was an issue creating the user. Please try again.',
        +        'update' => 'There was an issue updating the user. Please try again.',
        +        'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
        +        'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
        +        'import'    => 'There was an issue importing users. Please try again.',
        +        'asset_already_accepted' => 'This asset has already been accepted.',
        +        'accept_or_decline' => 'You must either accept or decline this asset.',
        +        'incorrect_user_accepted' => 'The asset you have attempted to accept was not checked out to you.',
        +        'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
        +        'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +);
        diff --git a/resources/lang/mn/admin/users/table.php b/resources/lang/mn/admin/users/table.php
        new file mode 100644
        index 0000000000..9bbe883e19
        --- /dev/null
        +++ b/resources/lang/mn/admin/users/table.php
        @@ -0,0 +1,38 @@
        +<?php
        +
        +return array(
        +    'activated'  			=> 'Active',
        +    'allow'  				=> 'Allow',
        +    'checkedout'  			=> 'Assets',
        +    'created_at' 			=> 'Created',
        +    'createuser' 			=> 'Create User',
        +    'deny'  				=> 'Deny',
        +    'email'      			=> 'Email',
        +    'employee_num'      	=> 'Employee No.',
        +    'first_name' 			=> 'First Name',
        +    'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        +    'id'         			=> 'Id',
        +    'inherit'  				=> 'Inherit',
        +    'job' 					=> 'Job Title',
        +    'last_login'  			=> 'Last Login',
        +    'last_name'  			=> 'Last Name',
        +    'location'  			=> 'Location',
        +    'lock_passwords'		=> 'Login details cannot be changed on this installation.',
        +    'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
        +    'name' 					=> 'Name',
        +    'notes'                 => 'Notes',
        +    'password_confirm' 		=> 'Confirm Password',
        +    'password' 				=> 'Password',
        +    'phone'  				=> 'Phone',
        +    'show_current'          => 'Show Current Users',
        +    'show_deleted'          => 'Show Deleted Users',
        +    'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
        +    'updateuser' 			=> 'Update User',
        +    'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
        +    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        +    'cloneuser'             => 'Clone User',
        +    'viewusers' 			=> 'View Users',
        +);
        diff --git a/resources/lang/mn/auth/general.php b/resources/lang/mn/auth/general.php
        new file mode 100644
        index 0000000000..909c006252
        --- /dev/null
        +++ b/resources/lang/mn/auth/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return [
        +    'send_password_link'	        => 'Нууц уг шинэчлэх имэйл илгээх',
        +    'email_reset_password'			=> 'Нууц үг шинэчлэх имэйл',
        +    'reset_password'			    => 'Нууц үг шинэчлэх',
        +    'login'                         => 'Нэвтрэх',
        +    'login_prompt'                  => 'Нэвтэрнэ үү',
        +    'forgot_password'               => 'Нууц үгээ мартсан',
        +    'remember_me'                   => 'Намайг сана',
        +    ];
        +
        diff --git a/resources/lang/mn/auth/message.php b/resources/lang/mn/auth/message.php
        new file mode 100644
        index 0000000000..bebf9cdd48
        --- /dev/null
        +++ b/resources/lang/mn/auth/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'account_already_exists' => 'An account with the this email already exists.',
        +    'account_not_found'      => 'The username or password is incorrect.',
        +    'account_not_activated'  => 'This user account is not activated.',
        +    'account_suspended'      => 'This user account is suspended.',
        +    'account_banned'         => 'This user account is banned.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
        +
        +    'signin' => array(
        +        'error'   => 'There was a problem while trying to log you in, please try again.',
        +        'success' => 'You have successfully logged in.',
        +    ),
        +
        +    'signup' => array(
        +        'error'   => 'There was a problem while trying to create your account, please try again.',
        +        'success' => 'Account sucessfully created.',
        +    ),
        +
        +        'forgot-password' => array(
        +            'error'   => 'There was a problem while trying to get a reset password code, please try again.',
        +            'success' => 'Password recovery email successfully sent.',
        +        ),
        +
        +        'forgot-password-confirm' => array(
        +            'error'   => 'There was a problem while trying to reset your password, please try again.',
        +            'success' => 'Your password has been successfully reset.',
        +        ),
        +
        +    'activate' => array(
        +        'error'   => 'There was a problem while trying to activate your account, please try again.',
        +        'success' => 'Your account has been successfully activated.',
        +    ),
        +
        +);
        diff --git a/resources/lang/mn/button.php b/resources/lang/mn/button.php
        new file mode 100644
        index 0000000000..9a533124d5
        --- /dev/null
        +++ b/resources/lang/mn/button.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'actions' 	                => 'Үйлдлүүд',
        +    'add'    	                => 'Шинийг нэмэх',
        +    'cancel'                    => 'Болих',
        +    'checkin_and_delete'  	    => 'Нэвтрэх ба хэрэглэгч устгах',
        +    'delete'  	                => 'Устгах',
        +    'edit'    	                => 'Засах',
        +    'restore' 	                => 'Сэргээх',
        +    'request'                   => 'Хүсэлт',
        +    'submit'  	                => 'Оруулах',
        +    'upload'                    => 'Оруулах',
        +	'select_file'				=> 'Файл сонгох...',
        +);
        diff --git a/resources/lang/mn/general.php b/resources/lang/mn/general.php
        new file mode 100644
        index 0000000000..bdde4d2cdb
        --- /dev/null
        +++ b/resources/lang/mn/general.php
        @@ -0,0 +1,204 @@
        +<?php
        +
        +    return [
        +    'accessories'			=> 'Accessories',
        +    'activated'			=> 'Activated',
        +    'accessory'				=> 'Accessory',
        +    'accessory_report'			=> 'Accessory Report',
        +    'action'                => 'Action',
        +    'activity_report'		=> 'Activity Report',
        +    'address'				=> 'Address',
        +    'admin'					=> 'Admin',
        +    'add_seats'     => 'Added seats',
        +    'all_assets'			=> 'All Assets',
        +    'all'       			=> 'Бүгд',
        +    'archived'              => 'Архивлагдсан',
        +    'asset_models'			=> 'Asset Models',
        +    'asset'					=> 'Asset',
        +    'asset_report'          => 'Asset Report',
        +    'asset_tag'				=> 'Asset Tag',
        +    'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
        +    'assets'				=> 'Assets',
        +    'avatar_delete'         => 'Delete Avatar',
        +    'avatar_upload'         => 'Upload Avatar',
        +    'back'      			=> 'Буцах',
        +    'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'cancel'  				=> 'Болих',
        +    'categories'			=> 'Категориуд',
        +    'category'				=> 'Бүлэг',
        +    'change' 		        => 'In/Out',
        +    'changeemail'  			=> 'Change Email Address',
        +    'changepassword'  		=> 'Change Password',
        +    'checkin'  				=> 'Checkin',
        +    'checkin_from'  		=> 'Checkin from',
        +    'checkout'  			=> 'Checkout',
        +    'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
        +    'companies'			=> 'Companies',
        +    'company'				=> 'Company',
        +    'component'			=> 'Component',
        +    'components'			=> 'Components',
        +	'complete'				=> 'Complete',
        +    'consumable'			=> 'Consumable',
        +    'consumables'			=> 'Consumables',
        +    'country'  				=> 'Country',
        +    'create'				=> 'Create New',
        +    'created'               => 'Item Created',
        +    'created_asset'			=> 'created asset',
        +    'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
        +    'currency'  			=> '$', // this is deprecated
        +    'current'  				=> 'Current',
        +    'custom_report'         => 'Custom Asset Report',
        +    'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
        +    'date'					=> 'Date',
        +    'debug_warning'         => 'Warning!',
        +    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'delete'  				=> 'Delete',
        +    'deleted'  				=> 'Deleted',
        +    'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
        +    'deployed'				=> 'Deployed',
        +    'depreciation_report'	=> 'Depreciation Report',
        +    'download'				=> 'Download',
        +    'depreciation'			=> 'Depreciation',
        +    'editprofile'  			=> 'Edit Your Profile',
        +    'eol'					=> 'EOL',
        +    'email_domain'			=> 'Email Domain',
        +    'email_format'			=> 'Email Format',
        +    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        +    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'first'					=> 'First',
        +    'first_name'			=> 'First Name',
        +    'first_name_format'		=> 'First Name (jane@example.com)',
        +    'file_name'				=> 'File',
        +    'file_uploads'			=> 'File Uploads',
        +    'generate'				=> 'Generate',
        +    'groups'				=> 'Groups',
        +    'gravatar_email'        => 'Gravatar Email Address',
        +    'history'  			    => 'History',
        +    'history_for'  			=> 'History for',
        +    'id'  					=> 'ID',
        +    'image_delete'         	=> 'Delete Image',
        +    'image_upload'         	=> 'Upload Image',
        +    'import'         	    => 'Import',
        +    'import-history'        => 'Import History',
        +    'asset_maintenance'        => 'Asset Maintenance',
        +    'asset_maintenance_report' => 'Asset Maintenance Report',
        +    'asset_maintenances'       => 'Asset Maintenances',
        +    'item'  				=> 'Item',
        +    'insufficient_permissions' => 'Insufficient permissions!',
        +    'language'				=> 'Language',
        +    'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
        +    'last_name'             => 'Last Name',
        +    'license'				=> 'License',
        +    'license_report'        => 'License Report',
        +    'licenses_available'	=> 'licenses available',
        +    'licenses'				=> 'Licenses',
        +    'list_all'				=> 'List All',
        +    'loading'				=> 'Loading',
        +    'lock_passwords'        => 'This field cannot be edited in this installation.',
        +    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'location'              => 'Location',
        +    'locations'				=> 'Locations',
        +    'logout'				=> 'Logout',
        +    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'manufacturer'			=> 'Manufacturer',
        +    'manufacturers'			=> 'Manufacturers',
        +    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'min_amt'				=> 'Min. QTY',
        +    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'model_no'				=> 'Model No.',
        +    'months'				=> 'months',
        +    'moreinfo'				=> 'More Info',
        +    'name'					=> 'Name',
        +    'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'new!',
        +    'no_depreciation'		=> 'No Depreciation',
        +    'no_results'			=> 'No Results.',
        +    'no'  					=> 'No',
        +    'notes'  				=> 'Notes',
        +    'order_number'          => 'Order Number',
        +    'page_menu'				=> 'Showing _MENU_ items',
        +    'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
        +    'pending'				=> 'Pending',
        +    'people'				=> 'People',
        +    'per_page'				=> 'Results Per Page',
        +    'previous'				=> 'Previous',
        +    'processing'			=> 'Processing',
        +    'profile'				=> 'Your profile',
        +    'purchase_cost'                              => 'Purchase Cost',
        +    'purchase_date'         => 'Purchase Date',
        +    'qty'		            => 'QTY',
        +    'quantity'		        => 'Quantity',
        +    'ready_to_deploy'		=> 'Ready to Deploy',
        +    'recent_activity'		=> 'Recent Activity',
        +    'remove_company'        => 'Remove Company Association',
        +    'reports'				=> 'Reports',
        +    'requested'				=> 'Requested',
        +    'request_canceled'      => 'Request Canceled',
        +    'save'  				=> 'Save',
        +    'select'				=> 'Select',
        +    'search'				=> 'Search',
        +    'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
        +    'select_depreciation'	=> 'Select a Depreciation Type',
        +    'select_location'		=> 'Select a Location',
        +    'select_manufacturer'	=> 'Select a Manufacturer',
        +    'select_model'			=> 'Select a Model',
        +    'select_supplier'		=> 'Select a Supplier',
        +    'select_user'			=> 'Select a User',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
        +    'select_statuslabel'	=> 'Select Status',
        +    'select_company'    	=> 'Select Company',
        +    'select_asset'    		=> 'Select Asset',
        +    'settings'				=> 'Settings',
        +    'sign_in'				=> 'Sign in',
        +    'signature'             => 'Signature',
        +    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'site_name'				=> 'Site Name',
        +    'state'  				=> 'State',
        +    'status_labels'			=> 'Status Labels',
        +    'status'    			=> 'Status',
        +    'supplier'              => 'Supplier',
        +    'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
        +    'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
        +    'total_assets'			=> 'total assets',
        +    'total_licenses'		=> 'total licenses',
        +    'total_accessories'		=> 'total accessories',
        +    'total_consumables'		=> 'total consumables',
        +    'type'  				=> 'Type',
        +    'undeployable'			=> 'Un-deployable',
        +    'unknown_admin'			=> 'Unknown Admin',
        +    'username_format'		=> 'Username Format',
        +    'update'                => 'Update',
        +    'uploaded'              => 'Uploaded',
        +    'user'					=> 'User',
        +    'accepted'			    => 'accepted',
        +    'declined'			    => 'declined',
        +    'unaccepted_asset_report' => 'Unaccepted Assets',
        +    'users'                 => 'Users',
        +    'viewassets'  			=> 'View Assigned Assets',
        +    'website'               => 'Website',
        +    'welcome'				=> 'Welcome, :name',
        +    'years'					=> 'years',
        +    'yes' 					=> 'Yes',
        +    'zip'  					=> 'Zip',
        +    'noimage'					=> 'No image uploaded or image not found.',
        +    'token_expired'             => 'Your form session has expired. Please try again.',
        +    ];
        diff --git a/resources/lang/mn/mail.php b/resources/lang/mn/mail.php
        new file mode 100644
        index 0000000000..c9a4fe182d
        --- /dev/null
        +++ b/resources/lang/mn/mail.php
        @@ -0,0 +1,74 @@
        +<?php
        +
        +return array(
        +    'a_user_canceled' => 'A user has canceled an item request on the website',
        +    'a_user_requested' => 'A user has requested an item on the website',
        +    'accessory_name' => 'Accessory Name:',
        +    'additional_notes' => 'Additional Notes:',
        +    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        +    'asset' => 'Asset:',
        +    'asset_name' => 'Asset Name:',
        +    'asset_requested' => 'Asset requested',
        +    'asset_tag' => 'Asset Tag:',
        +    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        +                                    expiring in the next 60 days.',
        +    'assigned_to' => 'Assigned To',
        +    'best_regards' => 'Best regards,',
        +    'canceled' => 'Canceled:',
        +    'checkin_date' => 'Checkin Date:',
        +    'checkout_date' => 'Checkout Date:',
        +    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        +    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        +    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        +    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        +    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        +    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        +    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        +    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        +    'current_QTY' => 'Current QTY',
        +    'Days' => 'Days',
        +    'days' => 'Days',
        +    'expecting_checkin_date' => 'Expected Checkin Date:',
        +    'expires' => 'Expires',
        +    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        +    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        +    'hello' => 'Hello',
        +    'hi' => 'Hi',
        +    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'item' => 'Item:',
        +    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        +                              inventory or will soon be low.',
        +    'Item_Request_Canceled' => 'Item Request Canceled',
        +    'Item_Requested' => 'Item Requested',
        +    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        +    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        +    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'login' => 'Login:',
        +    'Low_Inventory_Report' => 'Low Inventory Report',
        +    'min_QTY' => 'Min QTY',
        +    'name' => 'Name',
        +    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        +    'password' => 'Password:',
        +    'password_reset' => 'Password Reset',
        +
        +    'read_the_terms' => 'Please read the terms of use below.',
        +    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        +                         and agree to the terms of use, and have received the asset.',
        +    'requested' => 'Requested:',
        +    'reset_link' => 'Your Password Reset Link',
        +    'reset_password' => 'Click here to reset your password:',
        +    'serial' => 'Serial:',
        +    'supplier' => 'Supplier',
        +    'tag' => 'Tag',
        +    'test_email' => 'Test Email from Snipe-IT',
        +    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        +    'the_following_item' => 'The following item has been checked in: ',
        +    'There_are' => '{1} There is|[2,Inf] There are',
        +    'to_reset' => 'To reset your :web password, complete this form:',
        +    'type' => 'Type',
        +    'user' => 'User:',
        +    'username' => 'Username:',
        +    'welcome' => 'Welcome :name',
        +    'welcome_to' => 'Welcome to :web!',
        +    'your_credentials' => 'Your Snipe-IT credentials',
        +);
        diff --git a/resources/lang/mn/pagination.php b/resources/lang/mn/pagination.php
        new file mode 100644
        index 0000000000..247a7fa84a
        --- /dev/null
        +++ b/resources/lang/mn/pagination.php
        @@ -0,0 +1,20 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Pagination Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used by the paginator library to build
        +    | the simple pagination links. You are free to change them to anything
        +    | you want to customize your views to better match your application.
        +    |
        +    */
        +
        +    'previous' => '&laquo; Өмнөх',
        +
        +    'next'     => 'Дараах &raquo;',
        +
        +);
        diff --git a/resources/lang/mn/passwords.php b/resources/lang/mn/passwords.php
        new file mode 100644
        index 0000000000..3f8045c492
        --- /dev/null
        +++ b/resources/lang/mn/passwords.php
        @@ -0,0 +1,7 @@
        +<?php
        +
        +return [
        +    'sent'	        => 'Тан уруу нууц үгийн холбоосыг явууллаа!',
        +    'user'			=> 'Ийм нэртэй эсвэл имэйлтэй хэрэглэгч алга',
        +];
        +
        diff --git a/resources/lang/mn/reminders.php b/resources/lang/mn/reminders.php
        new file mode 100644
        index 0000000000..a389afe393
        --- /dev/null
        +++ b/resources/lang/mn/reminders.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Password Reminder Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are the default lines which match reasons
        +    | that are given by the password broker for a password update attempt
        +    | has failed, such as for an invalid token or invalid new password.
        +    |
        +    */
        +
        +    "password" => "Нууц үг дор хаяж 6 тэмдэгт урттай бөгөөд давхар баталгаажуулж оруулсантайгаа таарч байх ёстой.",
        +
        +    "user"     => "Хэрэглэгчийн нэр эсвэл имэйл хаяг буруу байна",
        +
        +    "token"    => "Нууц үг сэргээх токен буруу байна.",
        +
        +    "sent" => "Хэрэв имэйл хаяг бүртгэгдсэн байвал нууц үг сануулах имэйлийг илгээх болно!",
        +
        +);
        diff --git a/resources/lang/mn/table.php b/resources/lang/mn/table.php
        new file mode 100644
        index 0000000000..2582fbd470
        --- /dev/null
        +++ b/resources/lang/mn/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'actions'	 	=> 'Үйлдлүүд',
        +    'action' 		=> 'Үйлдэл',
        +    'by'      		=> 'Хэрэглэгч',
        +    'item' 			=> 'Зүйл',
        +
        +);
        diff --git a/resources/lang/mn/validation.php b/resources/lang/mn/validation.php
        new file mode 100644
        index 0000000000..02cb1fa981
        --- /dev/null
        +++ b/resources/lang/mn/validation.php
        @@ -0,0 +1,136 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines contain the default error messages used by
        +    | the validator class. Some of these rules have multiple versions such
        +    | such as the size rules. Feel free to tweak each of these messages.
        +    |
        +    */
        +
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Attributes
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used to swap attribute place-holders
        +    | with something more reader friendly such as E-Mail Address instead
        +    | of "email". This simply helps us make messages a little cleaner.
        +    |
        +    */
        +
        +    'attributes' => [],
        +
        +);
        diff --git a/resources/lang/ms/admin/accessories/general.php b/resources/lang/ms/admin/accessories/general.php
        index e69c1b534b..b33639f3ce 100644
        --- a/resources/lang/ms/admin/accessories/general.php
        +++ b/resources/lang/ms/admin/accessories/general.php
        @@ -2,11 +2,11 @@
         
         return array(
             'about_accessories_title' 			=> 'Tentang Aksesori',
        -    'about_accessories_text'  			=> 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
        +    'about_accessories_text'  			=> 'Aksesori adalah apa-apa yang kamu menetapkan untuk pengguna tetapi ia tidak mempunyai nombor siri (atau anda tidak peduli untuk trek ia dengan uniknya). Sebagai contoh, komputer tetikus atau papan kekunci.',
             'accessory_category' 				=> 'Kategori Aksesori',
             'accessory_name'  					=> 'Nama Aksesori',
        -    'checkout'  							=> 'Checkout Accessory',
        -    'checkin'  							=> 'Checkin Accessory',
        +    'checkout'  							=> 'Semak keluar aksesori',
        +    'checkin'  							=> 'Semak masuk aksesori',
             'create'  							=> 'Cipta Aksesori',
             'edit'  							=> 'Pinda Aksesori',
             'eula_text'							=> 'Kategori EULA',
        @@ -14,7 +14,7 @@ return array(
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
             'total'  							=> 'Jumlah',
        -    'remaining'  						=> 'Avail',
        +    'remaining'  						=> 'Masih ada',
             'update'  							=> 'Kemaskini Aksesori',
             'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
             'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        diff --git a/resources/lang/ms/admin/asset_maintenances/message.php b/resources/lang/ms/admin/asset_maintenances/message.php
        index 8fb379b035..5b57c72e42 100644
        --- a/resources/lang/ms/admin/asset_maintenances/message.php
        +++ b/resources/lang/ms/admin/asset_maintenances/message.php
        @@ -1,17 +1,21 @@
         <?php
         
             return [
        -        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'not_found'                    => 'Penyelenggaraan aset yang anda cari tidak ditemui!',
                 'delete'                       => [
        -            'confirm' => 'Are you sure you wish to delete this asset maintenance?',
        -            'error'   => 'There was an issue deleting the asset maintenance. Please try again.',
        -            'success' => 'The asset maintenance was deleted successfully.'
        +            'confirm' => 'Adakah anda pasti untuk menghapuskan penyelenggaraan aset ini?',
        +            'error'   => 'Tidak dapat menghapuskan penyelenggaraan aset. Sila cuba lagi.',
        +            'success' => 'Penyelenggaraan aset telah berjaya dihapuskan.'
                 ],
                 'create'                       => [
        -            'error'   => 'Asset Maintenance was not created, please try again.',
        -            'success' => 'Asset Maintenance created successfully.'
        +            'error'   => 'Penyelenggaraan aset belum dicipta, sila cuba lagi.',
        +            'success' => 'Penyelenggaraan aset berjaya dicipta.'
                 ],
        -        'asset_maintenance_incomplete' => 'Not Completed Yet',
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Tidak dilengkapkan lagi',
                 'warranty'                     => 'Waranti',
        -        'not_warranty'                 => 'Not Warranty',
        +        'not_warranty'                 => 'Bukan Jaminan',
             ];
        \ No newline at end of file
        diff --git a/resources/lang/ms/admin/categories/general.php b/resources/lang/ms/admin/categories/general.php
        index 5d7b26c435..28b182da50 100644
        --- a/resources/lang/ms/admin/categories/general.php
        +++ b/resources/lang/ms/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Kemaskini Kategori',
             'eula_text'							=> 'Kategori EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
        diff --git a/resources/lang/ms/admin/custom_fields/message.php b/resources/lang/ms/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/ms/admin/custom_fields/message.php
        +++ b/resources/lang/ms/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/ms/admin/departments/message.php b/resources/lang/ms/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/ms/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ms/admin/departments/table.php b/resources/lang/ms/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/ms/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/ms/admin/hardware/general.php b/resources/lang/ms/admin/hardware/general.php
        index fd7320aa2e..fc095844bb 100644
        --- a/resources/lang/ms/admin/hardware/general.php
        +++ b/resources/lang/ms/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Harta',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Terima Harta',
        -    'checkout'  				=> 'Agih Harta Kepada Pengguna',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Pendua Harta',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/ms/admin/hardware/message.php b/resources/lang/ms/admin/hardware/message.php
        index bfda7fd7ff..05e84aa2c2 100644
        --- a/resources/lang/ms/admin/hardware/message.php
        +++ b/resources/lang/ms/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Anda pasti anda ingin hapuskan harta ini?',
                 'error'   		=> 'Ada isu semasa menghapuskan harta. Sila cuba lagi.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Harta berjaya dihapuskan.'
             ),
         
        diff --git a/resources/lang/ms/admin/locations/table.php b/resources/lang/ms/admin/locations/table.php
        index c5ea19330d..c7e91f1f12 100644
        --- a/resources/lang/ms/admin/locations/table.php
        +++ b/resources/lang/ms/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Lokasi',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/ms/admin/manufacturers/table.php b/resources/lang/ms/admin/manufacturers/table.php
        index 0c756e18cc..6ee9ea5782 100644
        --- a/resources/lang/ms/admin/manufacturers/table.php
        +++ b/resources/lang/ms/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Pengeluar Harta',
             'create'				=> 'Cipta Pengeluar',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nama Penegeluar',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Kemaskini Pengeluar',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/ms/admin/models/message.php b/resources/lang/ms/admin/models/message.php
        index 6945041cb4..9ff9bbc36f 100644
        --- a/resources/lang/ms/admin/models/message.php
        +++ b/resources/lang/ms/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/ms/admin/settings/general.php b/resources/lang/ms/admin/settings/general.php
        index 3b56325a39..2ff4ba3302 100644
        --- a/resources/lang/ms/admin/settings/general.php
        +++ b/resources/lang/ms/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versi PHP',
             'php_gd_info'               => 'Anda mesti pasangkan php-gd untuk paparkan kod QR, lihat arahan pemasangan.',
             'php_gd_warning'            => 'Pemproses imej PHP dan \'plugin\' GD TIDAK dipasang.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Bolehkan Kod QR dahulu untuk pasang ini',
             'qr_text'                   => 'Teks Kod QR',
             'setting'                   => 'Tetapan',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/ms/admin/users/general.php b/resources/lang/ms/admin/users/general.php
        index 41f02cdf2e..68150fec8d 100644
        --- a/resources/lang/ms/admin/users/general.php
        +++ b/resources/lang/ms/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Serahkan harta kepada :nama',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Pendua Nama',
             'contact_user'      => 'Hunungi :nama',
             'edit'              => 'Kemaskini Pengguna',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'Sejarah untuk :nama',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Log masuk terakhir',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Perisian diagihkan kepada :nama',
        diff --git a/resources/lang/ms/admin/users/message.php b/resources/lang/ms/admin/users/message.php
        index d0f411cb3d..77fa40aa8c 100644
        --- a/resources/lang/ms/admin/users/message.php
        +++ b/resources/lang/ms/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Pengguna telah wujud!',
             'user_not_found'            => 'Pengguna [:id] tidak wujud.',
             'user_login_required'       => 'Ruangan log masuk diperlukan',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Pengguna berjaya dicipta.',
                 'update'    => 'Pengguna berjaya dikemaskini.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Pnegguna berjaya dihapuskan.',
                 'ban'       => 'Pengguna berjaya disekat.',
                 'unban'     => 'Pengguna berjaya dibernarkan.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Ada isu semasa mencipta pengguna. Sila cuba lagi.',
                 'update' => 'Ada isu semasa mencipta pengguna. Sila cuba lagi.',
                 'delete' => 'Ada isu semasa menghapuskan pengguna. Sila cuba lagi.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Ada isu semasa melepakan pengguna. Sila cuba lagi. ',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/ms/admin/users/table.php b/resources/lang/ms/admin/users/table.php
        index 681a244b79..7ab2ca7208 100644
        --- a/resources/lang/ms/admin/users/table.php
        +++ b/resources/lang/ms/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktif',
             'allow'  				=> 'Benarkan',
             'checkedout'  			=> 'Harta',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Lokasi',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Pengurus',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nama',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Sahkan kata laluan',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Tajuk',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Kemaskini Pengguna',
             'username' 				=> 'Nama pengguna',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Ini digunakan untuk \'Active Directory\' sahaja, bukan untuk log masuk.)',
             'cloneuser'             => 'Pendua Pengguna',
             'viewusers' 			=> 'Papar Pengguna',
        diff --git a/resources/lang/ms/auth/message.php b/resources/lang/ms/auth/message.php
        index 44f1d2fd92..6c5532db78 100644
        --- a/resources/lang/ms/auth/message.php
        +++ b/resources/lang/ms/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Akaun pengguna ini tidak aktif. ',
             'account_suspended'      => 'Akaun pengguna ini digantung.',
             'account_banned'         => 'Akaun pengguna ini di sekat.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Ada masalah semasa log masuk, sila cuba lagi.',
        diff --git a/resources/lang/ms/button.php b/resources/lang/ms/button.php
        index d0f003b86a..66466743df 100644
        --- a/resources/lang/ms/button.php
        +++ b/resources/lang/ms/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Tindakan',
             'add'    	                => 'Add New',
             'cancel'                    => 'Cancel',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Hantar',
             'upload'                    => 'Upload',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/ms/general.php b/resources/lang/ms/general.php
        index c1e6f30dca..57f32f4392 100644
        --- a/resources/lang/ms/general.php
        +++ b/resources/lang/ms/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Laporan Harta',
             'asset_tag'				=> 'Tag Harta',
             'assets_available'		=> 'Harta yang ada',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Harta',
             'avatar_delete'         => 'Hapuskan Avatar',
             'avatar_upload'         => 'Muat naik Avatar',
             'back'      			=> 'Belakang',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Batalkan',
             'categories'			=> 'Categories',
             'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Ubah Alamat E-mail',
             'changepassword'  		=> 'Tukar kata laluan',
             'checkin'  				=> 'Terima',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Agihkan',
             'city'  				=> 'Bandar',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Negara',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'cipta harta',
             'created_at' 			=> 'Cipta Pada',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> 'RM', // this is deprecated
             'current'  				=> 'Semasa',
             'custom_report'         => 'Laporan Harta Pilihan',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Tarikh',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Hapuskan',
             'deleted'  				=> 'Dihapuskan',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Telah Diagihkan',
             'depreciation_report'	=> 'Laporan Susut nilai',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Nama Keluarga',
             'license'				=> 'Lesen',
             'license_report'        => 'Laporan Lesen',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'Maklumat tambahan',
             'name'					=> 'Nama',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'Tiada Susut Nilai',
             'no_results'			=> 'Tiada kepututsan.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Select',
             'search'				=> 'Search',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Select a User',
        -    'select_date'			=> 'Select Date',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Pembekal',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'jumlah harta',
             'total_licenses'		=> 'jumlah lesen',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/ms/validation.php b/resources/lang/ms/validation.php
        index cd5694ebc4..5057df387e 100644
        --- a/resources/lang/ms/validation.php
        +++ b/resources/lang/ms/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute mesti diterima.",
        -    "active_url"       => ":attribute URL yang tidak sah.",
        -    "after"            => ":attribute mesti tarik selepas must :date.",
        -    "alpha"            => ":attribute hanya boleh mengandungi huruf.",
        -    "alpha_dash"       => ":attribute hanya boleh mengandungi huruf, nombor dan tanda tolak.",
        -    "alpha_num"        => ":attribute hanya boleh mengadungi huruf dan nombor.",
        -    "before"           => ":attribute mestilah tarikh sebelum :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute mesti berada diantara :min - :max.",
        -        "file"    => ":attribute mesti diantara :min - :max kilobytes.",
        -        "string"  => ":attribute mesti diantara :min - :max characters.",
        -    ),
        -    "confirmed"        => ":attribute pengesahan tidak sama.",
        -    "date"             => ":attribute  tarikh yang tidak sah.",
        -    "date_format"      => ":attribute tidak mengikut format :format.",
        -    "different"        => ":attribute dan :other mesti berbeza.",
        -    "digits"           => ":attribute mesti :digits digit.",
        -    "digits_between"   => ":attribute mesti diantara :min and :max digit.",
        -    "email"            => ":attribute format tidak sah.",
        -    "exists"           => "Piliah :attribute tidak sah.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => ":attribute mesti imej.",
        -    "in"               => "Piliah :attribute tidak sah.",
        -    "integer"          => ":attribute mesti integer.",
        -    "ip"               => ":attribute mesti alamat IP yang sah.",
        -    "max"              => array(
        -        "numeric" => ":attribute tidak boleh lebih besar dari :max.",
        -        "file"    => ":attribute tidak boleh lebih besar dari :max kilobytes.",
        -        "string"  => ":attribute tidak boleh lebih besar dari :max characters.",
        -    ),
        -    "mimes"            => ":attribute mesti fail jenis: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute mesti sekurang2nya :min.",
        -        "file"    => ":attribute mesti sekurang2nya :min kilobytes.",
        -        "string"  => ":attribute mesti sekurang2nya :min characters.",
        -    ),
        -    "not_in"           => "Piliah :attribute tidak sah.",
        -    "numeric"          => ":attribute mesti nombor.",
        -    "regex"            => ":attribute format tidak sah.",
        -    "required"         => ":attribute ruangan diperlukan.",
        -    "required_if"      => ":attribute rungan diperlukan bila :other adalah :value.",
        -    "required_with"    => ":attribute ruangan diperlukan bila :values wujud.",
        -    "required_without" => ":attribute ruangan diperlukan bila :values tidak wujud.",
        -    "same"             => ":attribute dan :other mesti sama.",
        -    "size"             => array(
        -        "numeric" => ":attribute mesti :size.",
        -        "file"    => ":attribute mesti :size kilobytes.",
        -        "string"  => ":attribute mesti :size aksara.",
        -    ),
        -    "unique"           => ":attribute telah diambil.",
        -    "url"              => ":attribute format tidak sah.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute mesti diterima.',
        +    'active_url'           => ':attribute URL yang tidak sah.',
        +    'after'                => ':attribute mesti tarik selepas must :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute hanya boleh mengandungi huruf.',
        +    'alpha_dash'           => ':attribute hanya boleh mengandungi huruf, nombor dan tanda tolak.',
        +    'alpha_num'            => ':attribute hanya boleh mengadungi huruf dan nombor.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute mestilah tarikh sebelum :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute mesti berada diantara :min - :max.',
        +        'file'    => ':attribute mesti diantara :min - :max kilobytes.',
        +        'string'  => ':attribute mesti diantara :min - :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => ':attribute pengesahan tidak sama.',
        +    'date'                 => ':attribute  tarikh yang tidak sah.',
        +    'date_format'          => ':attribute tidak mengikut format :format.',
        +    'different'            => ':attribute dan :other mesti berbeza.',
        +    'digits'               => ':attribute mesti :digits digit.',
        +    'digits_between'       => ':attribute mesti diantara :min and :max digit.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute format tidak sah.',
        +    'exists'               => 'Piliah :attribute tidak sah.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute mesti imej.',
        +    'in'                   => 'Piliah :attribute tidak sah.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute mesti integer.',
        +    'ip'                   => ':attribute mesti alamat IP yang sah.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute tidak boleh lebih besar dari :max.',
        +        'file'    => ':attribute tidak boleh lebih besar dari :max kilobytes.',
        +        'string'  => ':attribute tidak boleh lebih besar dari :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute mesti fail jenis: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute mesti sekurang2nya :min.',
        +        'file'    => ':attribute mesti sekurang2nya :min kilobytes.',
        +        'string'  => ':attribute mesti sekurang2nya :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Piliah :attribute tidak sah.',
        +    'numeric'              => ':attribute mesti nombor.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute format tidak sah.',
        +    'required'             => ':attribute ruangan diperlukan.',
        +    'required_if'          => ':attribute rungan diperlukan bila :other adalah :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute ruangan diperlukan bila :values wujud.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute ruangan diperlukan bila :values tidak wujud.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute dan :other mesti sama.',
        +    'size'                 => [
        +        'numeric' => ':attribute mesti :size.',
        +        'file'    => ':attribute mesti :size kilobytes.',
        +        'string'  => ':attribute mesti :size aksara.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute telah diambil.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute format tidak sah.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/nl/admin/asset_maintenances/message.php b/resources/lang/nl/admin/asset_maintenances/message.php
        index e3f26d79cc..caf55eeccd 100644
        --- a/resources/lang/nl/admin/asset_maintenances/message.php
        +++ b/resources/lang/nl/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Materiaal onderhoud is niet aangemaakt, probeer het opnieuw.',
                     'success' => 'Materiaal onderhoud is met succes aangemaakt.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Nog niet voltooid',
                 'warranty'                     => 'Garantie',
                 'not_warranty'                 => 'Geen garantie',
        diff --git a/resources/lang/nl/admin/asset_maintenances/table.php b/resources/lang/nl/admin/asset_maintenances/table.php
        index 5b360f74a1..e5b5e934e7 100644
        --- a/resources/lang/nl/admin/asset_maintenances/table.php
        +++ b/resources/lang/nl/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Materiaal onderhoud',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Objectnaam',
                 'is_warranty'   => 'Garantie',
                 'dl_csv'        => 'CSV downloaden'
             ];
        diff --git a/resources/lang/nl/admin/categories/general.php b/resources/lang/nl/admin/categories/general.php
        index 021dfd4dc9..87833cef02 100644
        --- a/resources/lang/nl/admin/categories/general.php
        +++ b/resources/lang/nl/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Over categorieën',
        +    'about_categories'  				=> 'Met categorieën kunt u uw items ordenen. Sommige categorieën kunnen bijvoorbeeld zijn: "Desktops", "Laptops", "Mobiele telefoons", en zo verder, maar je kan categorieën gebruiken op de manier die voor jou zinvol zijn.',
             'asset_categories' 					=> 'Bezit Categorieën',
             'category_name'  					=> 'Categorie Naam',
             'checkin_email'                     => 'Stuur een E-mail naar de gebruik bij een checkin.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Categorie bewerken',
             'eula_text'							=> 'Categorie Gebruikersovereenkomst',
             'eula_text_help'					=> 'Dit veld staat aanpassingen toe voor de gebruikersovereenkomsten van verschillende goederen. Heeft u één overeenkomst voor alle goederen, vink dan het vakje hieronder aan om de standaard gebruikersovereenkomst te gebruiken.',
        +    'name'                              => 'Categorie Naam',
             'require_acceptance'				=> 'Verplicht de gebruikers de overeenkomst te accepteren voor de goederen in deze catagorie.',
             'required_acceptance'				=> 'Deze gebruiker wordt gemaild met een link om de acceptatie van het artikel te verifiëren.',
             'required_eula'						=> 'De gebruiker krijgt een kopie van de gebruikersovereenkomst gemaild',
        diff --git a/resources/lang/nl/admin/companies/general.php b/resources/lang/nl/admin/companies/general.php
        index a9aded61b7..a24b6801f1 100644
        --- a/resources/lang/nl/admin/companies/general.php
        +++ b/resources/lang/nl/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Over bedrijven',
        +    'about_companies_text'                  => 'Bedrijven kunnen gebruikt worden als een simpel identificatie veld, daarnaast kunnen bedrijven ook gebruikt worden om de zichtbaarheid van objecten, gebruikers, etc. te limiteren wanneer dit is ingeschakeld in de beheer instellingen.',
             'select_company' => 'Selecteer een bedrijf',
         ];
        diff --git a/resources/lang/nl/admin/custom_fields/general.php b/resources/lang/nl/admin/custom_fields/general.php
        index 1b3f02b64b..5a78c78cc3 100644
        --- a/resources/lang/nl/admin/custom_fields/general.php
        +++ b/resources/lang/nl/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'Over veldverzamelingen',
             'about_fieldsets_text'		=> 'Veldverzamelingen laat jou groepen van aangepaste velden maken die vaak worden hergebruikt voor specifieke soorten eigendoms modellen.',
             'custom_format'             => 'Aangepaste indeling...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Encrypt de waarde van dit veld in de database',
             'encrypt_field_help'      => 'Waarschuwing: Versleutelen van dit veld maakt het onmogelijk om hierop te zoeken.',
             'encrypted'      	        => 'Versleuteld',
             'fieldset'      	        => 'Veldverzameling',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Veldverzamelin naam',
             'field_name'              => 'Veldnaam',
             'field_values'            => 'Veldwaarden',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Voeg selecteerbare optie toe, één per regel. Alle blanco regels behalve de eerste regel zullen worden genegeerd.',
             'field_element'           => 'Formulier element',
             'field_element_short'     => 'Element',
             'field_format'            => 'Stijl',
        diff --git a/resources/lang/nl/admin/custom_fields/message.php b/resources/lang/nl/admin/custom_fields/message.php
        index f792fa8133..ee71f94c98 100644
        --- a/resources/lang/nl/admin/custom_fields/message.php
        +++ b/resources/lang/nl/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Veldverzameling is niet aangemaakt, probeer het opnieuw.',
        diff --git a/resources/lang/nl/admin/departments/message.php b/resources/lang/nl/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/nl/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/nl/admin/departments/table.php b/resources/lang/nl/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/nl/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/nl/admin/depreciations/general.php b/resources/lang/nl/admin/depreciations/general.php
        index 1b9c5b806d..7785b695b6 100644
        --- a/resources/lang/nl/admin/depreciations/general.php
        +++ b/resources/lang/nl/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Over afschrijving van materiaal',
             'about_depreciations'  					=> 'U kan de materiaalafschrijving instellen om materiaal af te schrijven op basis van lineaire afschrijving.',
             'asset_depreciations'  					=> 'Materiaalafschrijvingen',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Afschrijving aanmaken',
             'depreciation_name'  					=> 'Afschrijvingsnaam',
             'number_of_months'  					=> 'Aantal maanden',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Afschrijving bijwerken',
         
         );
        diff --git a/resources/lang/nl/admin/groups/titles.php b/resources/lang/nl/admin/groups/titles.php
        index 9e0ffa782a..37e5ea03e4 100644
        --- a/resources/lang/nl/admin/groups/titles.php
        +++ b/resources/lang/nl/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Over groepen',
        +    'about_groups'                  => 'Groepen die gebruikt worden om gebruikerspermissies te generaliseren.',
             'group_management' 	 	=> 'Groepsmanagement',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Nieuwe groep aanmaken',
        +    'update' 	 		        => 'Groep bewerken',
             'group_name' 	 		=> 'Groepsnaam',
             'group_admin' 	 		=> 'Groepsbeheerder',
             'allow' 	 			=> 'Toestaan',
        diff --git a/resources/lang/nl/admin/hardware/form.php b/resources/lang/nl/admin/hardware/form.php
        index edc7e28110..6451e73134 100644
        --- a/resources/lang/nl/admin/hardware/form.php
        +++ b/resources/lang/nl/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Bevestig bulk verwijdering van materiaal',
           'bulk_delete_help'	=> 'Herzie de goederen voor de bulk verwijdering hier onder. Eens verwijderd, dan kan het hersteld worden, maar dan zijn ze niet meer geassocieerd met een gebruiker waar ze aan gekoppeld waren.',
           'bulk_delete_warn'	=> 'Je staat op het punt om :asset_count assets te verwijderen.',
         	'bulk_update'		=> 'Wijzig goederen in bulk',
        diff --git a/resources/lang/nl/admin/hardware/general.php b/resources/lang/nl/admin/hardware/general.php
        index 341bc28b49..15f667adbf 100644
        --- a/resources/lang/nl/admin/hardware/general.php
        +++ b/resources/lang/nl/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Over materiaal',
        +    'about_assets_text'            => 'Materiaal bestaat uit items die met een serienummer of identificatiesticker geregistreerd zijn. Dit zijn over het algemeen de objecten met een hogere waarde waarbij identificatie belangrijk is.',
         	'archived'  				=> 'Gearchiveerd',
             'asset'  					=> 'Materiaal',
             'bulk_checkout'             => 'Materiaal aan gebruiker uitleveren',
             'checkin'  					=> 'Materiaal uitlenen',
        -    'checkout'  				=> 'Leen materiaal uit aan deze gebruiker',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Kloon Materiaal',
             'deployable'  				=> 'Uitrolbaar',
             'deleted'  					=> 'Dit materiaal is verwijderd. <a href="/hardware/:asset_id/restore">Klik hier om te herstellen</a>.',
        diff --git a/resources/lang/nl/admin/hardware/message.php b/resources/lang/nl/admin/hardware/message.php
        index 5cbc89bdcd..8e283f0db8 100644
        --- a/resources/lang/nl/admin/hardware/message.php
        +++ b/resources/lang/nl/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> 'Gereedschap is succesvol hersteld.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Bestand is niet verwijderd. Probeer het opnieuw.',
                 'success' => 'Bestand is met succes verwijderd.',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Weet je zeker dat je dit product wilt verwijderen?',
                 'error'   		=> 'Er was een probleem tijdens het verwijderen van het product. Probeer opnieuw.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Het product is met succes verwijderd.'
             ),
         
        diff --git a/resources/lang/nl/admin/licenses/general.php b/resources/lang/nl/admin/licenses/general.php
        index 9e17c32167..64c5ea49a5 100644
        --- a/resources/lang/nl/admin/licenses/general.php
        +++ b/resources/lang/nl/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Over licenties',
        +    'about_licenses'                  => 'Licenties worden gebruikt om software te beheren. Deze hebben een maximum aantal wat aan gebruikers uitgeleverd kan worden',
             'checkin'  					=> 'Check werkplek licentie in',
             'checkout_history'  		=> 'Checkout historie',
             'checkout'  				=> 'Check werkplek licentie uit',
        diff --git a/resources/lang/nl/admin/licenses/message.php b/resources/lang/nl/admin/licenses/message.php
        index 3e87fcc159..8ddd82af5c 100644
        --- a/resources/lang/nl/admin/licenses/message.php
        +++ b/resources/lang/nl/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Bestand(en) zijn niet geüpload. Probeer het opnieuw.',
                 'success' => 'Bestand(en) zijn met succes geüpload.',
                 'nofiles' => 'Je hebt geen bestanden geselecteerd om te uploaden, of het bestand wat je probeert te uploaden is te groot',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Een of meer van de bestanden is te groot of het bestandstype is niet toegestaan. Toegestane bestandstypes zijn png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml en lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/nl/admin/locations/table.php b/resources/lang/nl/admin/locations/table.php
        index c31073c088..fc4ddde040 100644
        --- a/resources/lang/nl/admin/locations/table.php
        +++ b/resources/lang/nl/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'Over locaties',
        +    'about_locations'           => 'Locaties worden gebruikt om de locatie van gebruikers, materiaal en overige items bij te houden',
             'assets_rtd'                => 'Producten', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Toegewezen producten',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locaties',
             'parent'                    => 'Bovenliggend',
             'currency'                  => 'Locatie valuta',
        +    'ldap_ou'                   => 'LDAP zoek OU',
             );
        diff --git a/resources/lang/nl/admin/manufacturers/table.php b/resources/lang/nl/admin/manufacturers/table.php
        index 67c1650d60..eb9efaf9c7 100644
        --- a/resources/lang/nl/admin/manufacturers/table.php
        +++ b/resources/lang/nl/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Over fabrikanten',
        +    'about_manufacturers_text'  => 'Fabrikanten zijn bedrijven die uw objecten maken. U kunt hier belangrijke ondersteuningsinformatie over deze bedrijven opslaan die zal worden weergegeven op de detail pagina van uw objecten.',
             'asset_manufacturers'	=> 'Product fabrikanten',
             'create'				=> 'Maak fabrikant aan',
             'id'   					=> 'ID',
        -    'name'      			=> 'Naam Fabrikant',
        +    'name'      			=> 'Naam',
        +    'support_email'   		=> 'Ondersteuning E-mail',
        +    'support_phone'   		=> 'Ondersteuning telefoonnummer',
        +    'support_url'   		=> 'Ondersteuning URL',
             'update'				=> 'Wijzig Fabrikant',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/nl/admin/models/general.php b/resources/lang/nl/admin/models/general.php
        index 74836b7b61..28df552842 100644
        --- a/resources/lang/nl/admin/models/general.php
        +++ b/resources/lang/nl/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Over modellen',
        +    'about_models_text'           => 'Modellen geven de mogelijkheid om identieke objecten te groeperen.',
             'deleted'  					        => 'Dit model is verwijderd. <a href="/hardware/models/:model_id/restore">Klik hier om het te herstellen</a>.',
             'restore'                   => 'Herstel model',
             'requestable'               => 'Gebruikers mogen dit model aanvragen',
        diff --git a/resources/lang/nl/admin/models/message.php b/resources/lang/nl/admin/models/message.php
        index 4e0becc744..8c94c82500 100644
        --- a/resources/lang/nl/admin/models/message.php
        +++ b/resources/lang/nl/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model is met succes hersteld.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/nl/admin/settings/general.php b/resources/lang/nl/admin/settings/general.php
        index 8ba9bd7c22..9f488026c0 100644
        --- a/resources/lang/nl/admin/settings/general.php
        +++ b/resources/lang/nl/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Drempel verlopende meldingen (in dagen)',
         	'alert_inv_threshold'		=> 'Inventaris melding drempel',
         	'asset_ids'					=> 'Product ID\'s',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Genereer een auto-verhoging product ID\'s',
         	'auto_increment_prefix'		=> 'Voorvoegsel (niet verplicht)',
         	'auto_incrementing_help'    => 'Schakel eerst auto-verhoging voor product ID\'s in',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP E-mail',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'Deze Snipe-IT installatie kan scripts van de buitenwereld laden.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Beperk gebruikers (ook admins) die gekoppeld zijn aan hun bedrijf tot hun bedrijfsproducten.',
             'full_multiple_companies_support_text' => 'Volledige meerdere bedrijven ondersteuning',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP versie',
             'php_gd_info'               => 'Je moet php-gd installeren om QR codes te laten zien, zie installatie instructies.',
             'php_gd_warning'            => 'PHP Image Processing en GD plugin zijn NIET geïnstalleerd.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Schakel QR codes eerst in om dit in te kunnen stellen',
             'qr_text'                   => 'QR Code tekst',
             'setting'                   => 'Instelling',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Deze instellingen laten jou specifieke aspecten aanpassen van jou installatie.',
             'labels_per_page'           => 'Labels per pagina',
             'label_dimensions'          => 'Label afmetingen (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Pagina marges (inches)',
             'purge'                    => 'Verwijderde items opschonen',
             'labels_display_bgutter'    => 'Label ondermarge',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'b',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Twee factor authenticatie',
             'two_factor_secret'        => 'Twee factor code',
             'two_factor_enrollment'        => 'Twee factor uitrol',
        @@ -114,15 +129,15 @@ return array(
             'two_factor_reset_error'          => 'Twee factor apparaat opnieuw instellen mislukt',
             'two_factor_enabled_warning'        => 'Het inschakelen van twee factor authenticatie zal direct vereisen dat je authenticeert met een Google Auth geactiveerd apparaat. Je krijgt de mogelijkheid om een apparaat te activeren als dat nog niet het geval is.',
             'two_factor_enabled_help'        => 'Dit zal twee factor authenticatie via Google Authenticator inschakelen.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_optional'        => 'Selectief (Gebruikers kunnen in- of uitschakelen wanneer toegestaan)',
             'two_factor_required'        => 'Vereist voor alle gebruikers',
             'two_factor_disabled'        => 'Uitgeschakeld',
             'two_factor_enter_code'	=> 'Voer twee factor code in',
             'two_factor_config_complete'	=> 'Code verzenden',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enabled_edit_not_allowed' => 'De beheerder staat niet toe dat deze instelling aangepast wordt.',
             'two_factor_enrollment_text'	=> "Twee factor authenticatie is vereist, echter is je apparaat nog niet geactiveerd. Open je Google Authenticator app en scan de onderstaande QR code om je apparaat te activeren. Vul wanneer je het apparaat succesvol hebt geactiveerd hieronder de code in",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'require_accept_signature'      => 'Handtekening vereisen',
        +    'require_accept_signature_help_text'      => 'Wanneer deze optie ingeschakeld wordt zal het fysiek accepteren van materiaal vereist worden.',
             'left'        => 'links',
             'right'        => 'rechts',
             'top'        => 'bovenkant',
        diff --git a/resources/lang/nl/admin/suppliers/table.php b/resources/lang/nl/admin/suppliers/table.php
        index b6cb9e7c00..d250b7618d 100644
        --- a/resources/lang/nl/admin/suppliers/table.php
        +++ b/resources/lang/nl/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Over leveranciers',
        +    'about_suppliers_text'  => 'Leveranciers worden gebruikt om de afkomst van objecten bij te houden',
             'address'               => 'Leverancier adres',
             'assets'                => 'Producten',
             'city'                  => 'Stad',
        diff --git a/resources/lang/nl/admin/users/general.php b/resources/lang/nl/admin/users/general.php
        index 24f5ddfa30..ba3dc82f04 100644
        --- a/resources/lang/nl/admin/users/general.php
        +++ b/resources/lang/nl/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Materiaal toegewezen aan :name',
        +    'bulk_update_warn'	=> 'U staat op het punt om een aanpassing te maken aan de eigenschappen van :user_count gebruikers. Houd er rekening mee dat u niet uw eigen gebruikers eigenschappen kan aanpassen via dit formulier, u zal dit in uw eigen instellingen moeten doen.',
        +    'bulk_update_help'	=> 'Dit formulier maakt het mogelijk om meerdere gebruikers tegelijkertijd te bewerken, vul alleen de velden in die veranderd moeten worden. Blanco velden zullen ongewijzigd blijven.',
             'current_assets'    => 'Op dit moment aan deze gebruiker uitgeleverde producten',
             'clone'             => 'Gebruiker klonen',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Gebruiker aanpassen',
             'filetype_info'     => 'Toegestane bestandstypes zijn png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'Geschiedenis voor :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Laatst aangemeld',
             'ldap_config_text'  => 'LDAP configuratie kan worden gevonden in Admin > Instellingen. De (optioneel) geselecteerde locatie zal voor alle geimporteerde gebruikers ingesteld worden.',
             'software_user'     => 'Software toegekend aan :name',
             'view_user'         => 'Bekijk gebruiker :name',
             'usercsv'           => 'CSV bestand',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'De huidige beheer instellingen staan selectief gebruik van twee factor authenticatie toe.  ',
        +    'two_factor_enrolled' => 'Twee factor authenticatie apparaat ingesteld ',
        +    'two_factor_active'   => 'Twee factor authenticatie actief ',
             );
        diff --git a/resources/lang/nl/admin/users/message.php b/resources/lang/nl/admin/users/message.php
        index b2e5dce2fa..afc7780fd0 100644
        --- a/resources/lang/nl/admin/users/message.php
        +++ b/resources/lang/nl/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Je hebt met succes dit product geaccepteerd.',
             'declined'                  => 'Je hebt met succes dit product geweigerd.',
        +    'bulk_manager_warn'	        => 'Uw gebruikers zijn succesvol bijgewerkt, de gekozen manager kon echter niet toegepast worden omdat deze persoon ook in de lijst staat, gebruikers mogen niet hun eigen manager zijn. Probeer het nogmaals en selecteer de gebruikers zonder de manager.',
             'user_exists'               => 'Gebruiker bestaat reeds!',
             'user_not_found'            => 'Gebruiker [:id] bestaat niet.',
             'user_login_required'       => 'Het veld gebruikersnaam is verplicht.',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Gebruiker succesvol aangemaakt.',
                 'update'    => 'Gebruiker succesvol bijgewerkt.',
        +        'update_bulk'    => 'Gebruikers zijn succesvol bijgewerkt!',
                 'delete'    => 'Gebruiker succesvol verwijderd.',
                 'ban'       => 'Gebruiker succesvol verbannen.',
                 'unban'     => 'Gebruiker succesvol opnieuw toegang verleend.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Er was een probleem tijdens het aanmaken van de gebruiker. Probeer opnieuw, aub.',
                 'update' => 'Er was een probleem tijdens het bijwerken van de gebruiker. Probeer opnieuw, aub.',
                 'delete' => 'Er was een probleem tijdens het verwijderen van de gebruiker. Probeer opnieuw, aub.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Er was een probleem tijdens het opnieuw inschakelen van de gebruiker. Probeer opnieuw, aub.',
                 'import'    => 'Er was een probleem met het importeren van de gebruikers. Probeer het opnieuw.',
                 'asset_already_accepted' => 'Dit product is al geaccepteerd.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Kan niet verbinden met de LDAP server. Controleer je LDAP server configuratie in de LDAP configuratie bestand. <br>Fout van LDAP server: ',
                 'ldap_could_not_search' => 'Kan niet zoeken in de LDAP server. Controleer je LDAP server configuratie in de LDAP configuratie bestand. <br>Fout van LDAP server:',
                 'ldap_could_not_get_entries' => 'Kan geen gegeven van de LDAP server krijgen. Controleer je LDAP server configuratie in de LDAP configuratie bestand. <br>Fout van LDAP server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/nl/admin/users/table.php b/resources/lang/nl/admin/users/table.php
        index 4792faffaa..f698b53bde 100644
        --- a/resources/lang/nl/admin/users/table.php
        +++ b/resources/lang/nl/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Actief',
             'allow'  				=> 'Toestaan',
             'checkedout'  			=> 'Materialen',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Locatie',
             'lock_passwords'		=> 'Login gegevens kunnen niet worden gewijzigd in deze installatie.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Naam',
             'notes'                 => 'Notities',
             'password_confirm' 		=> 'Bevestig uw wachtwoord',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Toon de huidige gebruikers',
             'show_deleted'          => 'Toon de verwijderde gebruikers',
             'title' 				=> 'Titel',
        +	'to_restore_them'		=> 'om ze te herstellen.',
             'updateuser' 			=> 'Gebruiker bijwerken',
             'username' 				=> 'Gebruikersnaam',
        +	'user_deleted_text' 	=> 'Deze gebruiker is gemarkeerd als verwijderd.',
             'username_note' 		=> '(Dit wordt enkel gebruikt om te koppelen met de Active Directory, niet om aan te melden.)',
             'cloneuser'             => 'Gebruiker klonen',
             'viewusers' 			=> 'Bekijk gebruikers',
        diff --git a/resources/lang/nl/auth/message.php b/resources/lang/nl/auth/message.php
        index 0fadaaa475..9a014037a8 100644
        --- a/resources/lang/nl/auth/message.php
        +++ b/resources/lang/nl/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Deze gebruikersaccount is niet actief.',
             'account_suspended'      => 'Deze gebruikersaccount is vergrendeld.',
             'account_banned'         => 'Deze gebruikersaccount is geband.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Te veel mislukte inlog pogingen. Probeer het nogmaals over :minutes minuten.',
         
             'signin' => array(
                 'error'   => 'Er was een probleem bij inloggen, probeer opnieuw aub.',
        diff --git a/resources/lang/nl/button.php b/resources/lang/nl/button.php
        index f33c8e5f16..396baa0a1b 100644
        --- a/resources/lang/nl/button.php
        +++ b/resources/lang/nl/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Acties',
             'add'    	                => 'Toevoegen',
             'cancel'                    => 'Annuleren',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Aanvraag',
             'submit'  	                => 'Verzenden',
             'upload'                    => 'Verstuur',
        -
        +	'select_file'				=> 'Bestand selecteren...',
         );
        diff --git a/resources/lang/nl/general.php b/resources/lang/nl/general.php
        index 97928726e0..7789977e9f 100644
        --- a/resources/lang/nl/general.php
        +++ b/resources/lang/nl/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Materiaalrapport',
             'asset_tag'				=> 'Materiaaltag',
             'assets_available'		=> 'beschikbare materialen',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Materialen',
             'avatar_delete'         => 'Verwijder profielafbeelding',
             'avatar_upload'         => 'Upload profielafbeelding',
             'back'      			=> 'Terug',
             'bad_data'      		=> 'Niks gevonden. Misschien verkeerde data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk uitlevering',
             'cancel'  				=> 'Annuleren',
             'categories'			=> 'Categorieën',
             'category'				=> 'Categorie',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'E-mailadres wijzigen',
             'changepassword'  		=> 'Wachtwoord wijzigen',
             'checkin'  				=> 'Check-in',
             'checkin_from'  		=> 'Incheck formulier',
             'checkout'  			=> 'Afrekenen',
             'city'  				=> 'Plaats',
        +	'click_here'			=> 'Klik hier',
             'companies'			=> 'Bedrijven',
             'company'				=> 'Bedrijf',
             'component'			=> 'Component',
             'components'			=> 'Componenten',
        +	'complete'				=> 'Voltooid',
             'consumable'			=> 'Verbruiksartikelen',
             'consumables'			=> 'Verbruiksartikelen',
             'country'  				=> 'Land',
        @@ -44,16 +51,21 @@
             'created'               => 'Item aangemaakt',
             'created_asset'			=> 'aangemaakt materiaal',
             'created_at' 			=> 'Aangemaakt op',
        +    'updated_at' 			=> 'Bijgewerkt op',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Huidige',
             'custom_report'         => 'Handmatig Materiaal Rapport',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Datum',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Waarschuwing!',
        +    'debug_warning_text'         => 'Deze applicatie draait in productie modus met foutopsporing ingeschakeld. Dit kan betekenen dat mogelijk gevoelige gegevens zichtbaar zijn voor de buitenwereld. Schakel foutopsporing uit door de <code>APP_DEBUG</code> variabele in je <code>.env</code> bestand op <code>false</code> te zetten.',
             'delete'  				=> 'Verwijder',
             'deleted'  				=> 'Verwijderd',
             'delete_seats'  		=> 'Verwijderde plekken',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Ingezet',
             'depreciation_report'	=> 'Afschrijvingsrapport',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Onvoldoende rechten!',
             'language'				=> 'Taal',
             'last'					=> 'Laatste',
        +    'last_login'            => 'Laatst ingelogd',
             'last_name'             => 'Achternaam',
             'license'				=> 'Licentie',
             'license_report'        => 'Licentierapport',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Meer Info',
             'name'					=> 'Naam',
             'next'					=> 'Volgende',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'nieuw!',
             'no_depreciation'		=> 'Geen afschrijving',
             'no_results'			=> 'Geen resultaten.',
             'no'  					=> 'Neen',
             'notes'  				=> 'Notities',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Ordernummer',
             'page_menu'				=> 'Toon_MENU_artikelen',
             'pagination_info'		=> 'Toon_START_naar_END_van_TOTAL_artikelen',
             'pending'				=> 'In afwachting',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Vorige',
             'processing'			=> 'Bezig met verwerken',
             'profile'				=> 'Uw profiel',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Aankoop prijs',
        +    'purchase_date'         => 'Aankoopdatum',
             'qty'		            => 'Stks',
             'quantity'		        => 'Aantal',
             'ready_to_deploy'		=> 'Klaar om ingezet te worden',
        @@ -138,27 +153,31 @@
             'select'				=> 'Selecteer',
             'search'				=> 'Zoeken',
             'select_category'       => 'Selecteer een categorie',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Selecteer een afschrijvingstype',
             'select_location'		=> 'Selecteer een locatie',
             'select_manufacturer'	=> 'Selecteer een fabrikant',
             'select_model'			=> 'Selecteer een model',
             'select_supplier'		=> 'Selecteer een leverancier',
             'select_user'			=> 'Selecteer een gebruiker',
        -    'select_date'			=> 'Selecteer een datum',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Selecteer de status',
             'select_company'    	=> 'Selecteer een bedrijf',
             'select_asset'    		=> 'Selecteer product',
             'settings'				=> 'Instellingen',
             'sign_in'				=> 'Aanmelden',
        -    'signature'             => 'Signature',
        +    'signature'             => 'Handtekening',
             'some_features_disabled' => 'DEMO MODUS: Sommige functies zijn uitgeschakeld voor deze installatie.',
             'site_name'				=> 'Sitenaam',
             'state'  				=> 'Status',
             'status_labels'			=> 'Statuslabels',
             'status'    			=> 'Status',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Leverancier',
             'suppliers'  			=> 'Leveranciers',
        +    'sure_to_delete'    => 'Weet u zeker dat u wilt verwijderen',
             'submit'				=> 'Verzenden',
        +    'target'                => 'Doel',
        +    'time_and_date_display' => 'Tijd en Datum Weergave',
             'total_assets'			=> 'totaal aantal materialen',
             'total_licenses'		=> 'Totale licenties',
             'total_accessories'		=> 'totaal aantal accessoires',
        diff --git a/resources/lang/nl/validation.php b/resources/lang/nl/validation.php
        index b7d631fa3c..5b1c38359f 100644
        --- a/resources/lang/nl/validation.php
        +++ b/resources/lang/nl/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute moet geaccepteerd worden.",
        -    "active_url"       => ":attribute is geen geldige URL.",
        -    "after"            => ":attribute moet een datum zijn later dan :date.",
        -    "alpha"            => ":attribute mag enkel letters bevatten.",
        -    "alpha_dash"       => ":attribute mag enkel letters, cijfers of koppeltekens bevatten.",
        -    "alpha_num"        => ":attribute mag enkel letters en cijfers bevatten.",
        -    "before"           => ":attribute moet een datum zijn voor :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute moet een waarde hebben tussen :min en :max.",
        -        "file"    => ":attribute moet een waarde hebben tussen :min en :max kilobytes.",
        -        "string"  => ":attribute moet tussen de :min en :max aantal karakters lang zijn.",
        -    ),
        -    "confirmed"        => ":attribute bevestiging komt niet overeen.",
        -    "date"             => ":attribute is geen geldige datum.",
        -    "date_format"      => ":attribute komt niet overeen met het volgende formaat :format.",
        -    "different"        => ":attribute en :other moeten verschillend zijn.",
        -    "digits"           => ":attribute moet :digits cijfers lang zijn.",
        -    "digits_between"   => ":attribute moet tussen de :min en :max cijfers bevatten.",
        -    "email"            => "Het formaat van :attribute is ongeldig.",
        -    "exists"           => "Het geselecteerde kenmerk :attribute is ongeldig.",
        -    "email_array"      => "Een of meerdere e-mail adressen kloppen niet.",
        -    "image"            => ":attribute moet een afbeelding zijn.",
        -    "in"               => "Het geselecteerde kenmerk :attribute is ongeldig.",
        -    "integer"          => ":attribute moet van het type integer zijn.",
        -    "ip"               => ":attribute moet een geldig IP-adres zijn.",
        -    "max"              => array(
        -        "numeric" => ":attribute moet groter zijn dan :max.",
        -        "file"    => ":attribute mag niet groter zijn dan :max kilobytes.",
        -        "string"  => ":attribute mag niet langer zijn dan :max karakters.",
        -    ),
        -    "mimes"            => ":attribute moet een bestand zijn van het type: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute moet minimum :min zijn.",
        -        "file"    => ":attribute moet minstens :min kilobytes groot zijn.",
        -        "string"  => ":attribute moet tenminste :min karakters bevatten.",
        -    ),
        -    "not_in"           => "Het geselecteerde kenmerk :attribute is ongeldig.",
        -    "numeric"          => ":attribute moet een getal zijn.",
        -    "regex"            => "Het formaat van :attribute is ongeldig.",
        -    "required"         => "Het veld :attribute is verplicht.",
        -    "required_if"      => "het veld :attribute is verplicht als :other gelijk is aan :value.",
        -    "required_with"    => "Het veld :attribute is verplicht als :values ingesteld staan.",
        -    "required_without" => "Het veld :attribute is verplicht als :values niet ingesteld staan.",
        -    "same"             => ":attribute en :other moeten gelijk zijn.",
        -    "size"             => array(
        -        "numeric" => ":attribute moet :size zijn.",
        -        "file"    => ":attribute moet :size kilobytes groot zijn.",
        -        "string"  => ":attribute moet :size karakters zijn.",
        -    ),
        -    "unique"           => "Het veld :attribute is reeds in gebruik.",
        -    "url"              => "Het formaat van :attribute is ongeldig.",
        -    "statuslabel_type" => "Je moet een geldig status label type selecteren",
        -    "unique_undeleted" => "Het :attribute moet uniek zijn.",
        +    'accepted'             => ':attribute moet geaccepteerd worden.',
        +    'active_url'           => ':attribute is geen geldige URL.',
        +    'after'                => ':attribute moet een datum zijn later dan :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute mag enkel letters bevatten.',
        +    'alpha_dash'           => ':attribute mag enkel letters, cijfers of koppeltekens bevatten.',
        +    'alpha_num'            => ':attribute mag enkel letters en cijfers bevatten.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute moet een datum zijn voor :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute moet een waarde hebben tussen :min en :max.',
        +        'file'    => ':attribute moet een waarde hebben tussen :min en :max kilobytes.',
        +        'string'  => ':attribute moet tussen de :min en :max aantal karakters lang zijn.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute moet waar of onwaar zijn.',
        +    'confirmed'            => ':attribute bevestiging komt niet overeen.',
        +    'date'                 => ':attribute is geen geldige datum.',
        +    'date_format'          => ':attribute komt niet overeen met het volgende formaat :format.',
        +    'different'            => ':attribute en :other moeten verschillend zijn.',
        +    'digits'               => ':attribute moet :digits cijfers lang zijn.',
        +    'digits_between'       => ':attribute moet tussen de :min en :max cijfers bevatten.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Het formaat van :attribute is ongeldig.',
        +    'exists'               => 'Het geselecteerde kenmerk :attribute is ongeldig.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute moet een afbeelding zijn.',
        +    'in'                   => 'Het geselecteerde kenmerk :attribute is ongeldig.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute moet van het type integer zijn.',
        +    'ip'                   => ':attribute moet een geldig IP-adres zijn.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute moet groter zijn dan :max.',
        +        'file'    => ':attribute mag niet groter zijn dan :max kilobytes.',
        +        'string'  => ':attribute mag niet langer zijn dan :max karakters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute moet een bestand zijn van het type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute moet minimum :min zijn.',
        +        'file'    => ':attribute moet minstens :min kilobytes groot zijn.',
        +        'string'  => ':attribute moet tenminste :min karakters bevatten.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Het geselecteerde kenmerk :attribute is ongeldig.',
        +    'numeric'              => ':attribute moet een getal zijn.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Het formaat van :attribute is ongeldig.',
        +    'required'             => 'Het veld :attribute is verplicht.',
        +    'required_if'          => 'het veld :attribute is verplicht als :other gelijk is aan :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Het veld :attribute is verplicht als :values ingesteld staan.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Het veld :attribute is verplicht als :values niet ingesteld staan.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute en :other moeten gelijk zijn.',
        +    'size'                 => [
        +        'numeric' => ':attribute moet :size zijn.',
        +        'file'    => ':attribute moet :size kilobytes groot zijn.',
        +        'string'  => ':attribute moet :size karakters zijn.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'Het veld :attribute is reeds in gebruik.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Het formaat van :attribute is ongeldig.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Het :attribuut veld bevat een karakter dat is niet toegestaan.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/no/admin/asset_maintenances/message.php b/resources/lang/no/admin/asset_maintenances/message.php
        index b992ebeb04..5bae887af6 100644
        --- a/resources/lang/no/admin/asset_maintenances/message.php
        +++ b/resources/lang/no/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Vedlikeholdet ble ikke opprettet, prøv igjen.',
                     'success' => 'Vedlikeholdet ble opprettet.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Enda Ikke fullført',
                 'warranty'                     => 'Garanti',
                 'not_warranty'                 => 'Ikke garanti',
        diff --git a/resources/lang/no/admin/asset_maintenances/table.php b/resources/lang/no/admin/asset_maintenances/table.php
        index de6e3b1876..cc6092f45d 100644
        --- a/resources/lang/no/admin/asset_maintenances/table.php
        +++ b/resources/lang/no/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Vedlikehold av eiendel',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Navn',
                 'is_warranty'   => 'Garanti',
                 'dl_csv'        => 'Last ned CSV'
             ];
        diff --git a/resources/lang/no/admin/categories/general.php b/resources/lang/no/admin/categories/general.php
        index 12c0706dc7..ff2d394b93 100644
        --- a/resources/lang/no/admin/categories/general.php
        +++ b/resources/lang/no/admin/categories/general.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        +    'about_categories_title' 			=> 'Om kategorier',
             'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
             'asset_categories' 					=> 'Kategorier',
             'category_name'  					=> 'Navn',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Rediger kategori',
             'eula_text'							=> 'EULA-kategori',
             'eula_text_help'					=> 'Dette feltet lar deg tilpasse dine EULA for spesifikke typer eiendeler. Hvis du kun har en EULA for alle eiendeler kan du krysse av nedenfor for å bruke standard.',
        +    'name'                              => 'Kategorinavn',
             'require_acceptance'				=> 'Krev at brukere bekrefter aksept av eiendeler i denne kategorien.',
             'required_acceptance'				=> 'Denne brukeren vil få e-post med en lenke for å bekrefte aksept av enheten.',
             'required_eula'						=> 'Denne brukeren vil få en kopi av EULA på e-post',
        diff --git a/resources/lang/no/admin/companies/general.php b/resources/lang/no/admin/companies/general.php
        index 48ea9565aa..cd931d38dd 100644
        --- a/resources/lang/no/admin/companies/general.php
        +++ b/resources/lang/no/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        +    'about_companies_title'            => 'Om selskaper',
             'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
             'select_company' => 'Velg bedrift',
         ];
        diff --git a/resources/lang/no/admin/custom_fields/message.php b/resources/lang/no/admin/custom_fields/message.php
        index ae939613a3..c65bc1cb3d 100644
        --- a/resources/lang/no/admin/custom_fields/message.php
        +++ b/resources/lang/no/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Feltsettet ble ikke opprettet, vennligst prøv igjen.',
        diff --git a/resources/lang/no/admin/departments/message.php b/resources/lang/no/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/no/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/no/admin/departments/table.php b/resources/lang/no/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/no/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/no/admin/depreciations/general.php b/resources/lang/no/admin/depreciations/general.php
        index ed349b95fb..1c61d7f090 100644
        --- a/resources/lang/no/admin/depreciations/general.php
        +++ b/resources/lang/no/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Om avskrivninger',
             'about_depreciations'  					=> 'Du kan sette opp avskrivninger for å kostnadsføre eiendeler basert på en lineær avskrivning i perioden.',
             'asset_depreciations'  					=> 'Avskrivninger',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Opprett avskrivning',
             'depreciation_name'  					=> 'Avskrivningsnavn',
             'number_of_months'  					=> 'Antall måneder',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Oppdater avskrivninger',
         
         );
        diff --git a/resources/lang/no/admin/groups/titles.php b/resources/lang/no/admin/groups/titles.php
        index 71e7a48850..f4da5c1aad 100644
        --- a/resources/lang/no/admin/groups/titles.php
        +++ b/resources/lang/no/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        +    'about_groups_title'            => 'Om grupper',
             'about_groups'                  => 'Groups are used to generalize user permissions.',
             'group_management' 	 	=> 'Gruppeadministrasjon',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Opprett ny gruppe',
        +    'update' 	 		        => 'Rediger gruppe',
             'group_name' 	 		=> 'Gruppenavn',
             'group_admin' 	 		=> 'Gruppeadministrator',
             'allow' 	 			=> 'Tillat',
        diff --git a/resources/lang/no/admin/hardware/form.php b/resources/lang/no/admin/hardware/form.php
        index 114bd03961..04f47bb2d4 100644
        --- a/resources/lang/no/admin/hardware/form.php
        +++ b/resources/lang/no/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Bekreft sletting av flere enheter',
           'bulk_delete_help'	=> 'Se gjennom listen over enheter som er valgt for sletting. Etter sletting er det mulig å gjenopprette enheter, men nåværende koblinger til brukere vil ikke lenger finnes.',
           'bulk_delete_warn'	=> 'Du er i ferd med å slette :asset_count enheter.',
         	'bulk_update'		=> 'Masseoppdater eiendeler',
        diff --git a/resources/lang/no/admin/hardware/general.php b/resources/lang/no/admin/hardware/general.php
        index dd340133e9..9b0af49612 100644
        --- a/resources/lang/no/admin/hardware/general.php
        +++ b/resources/lang/no/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Eiendel',
             'bulk_checkout'             => 'Sjekk ut Eiendel til Bruker',
             'checkin'  					=> 'Sjekk inn eiendel',
        -    'checkout'  				=> 'Sjekk ut eiendel til bruker',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Klon eiendel',
             'deployable'  				=> 'Utleverbar',
             'deleted'  					=> 'Denne eiendelen har blitt slettet. <a href="/hardware/:asset_id/restore">Klikk for å gjenopprette den</a>.',
        diff --git a/resources/lang/no/admin/hardware/message.php b/resources/lang/no/admin/hardware/message.php
        index c689875d7a..2ed1f8bbed 100644
        --- a/resources/lang/no/admin/hardware/message.php
        +++ b/resources/lang/no/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Vellykket gjenoppretting av eiendel.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Fil ble ikke slettet. Prøv igjen.',
                 'success' => 'Vellykket sletting av fil.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Er du sikker på at du vil slette eiendelen?',
                 'error'   		=> 'Det oppstod et problem under sletting av eiendel. Vennligst prøv igjen.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Vellykket sletting av eiendel.'
             ),
         
        diff --git a/resources/lang/no/admin/licenses/general.php b/resources/lang/no/admin/licenses/general.php
        index b25000d327..9fdafac372 100644
        --- a/resources/lang/no/admin/licenses/general.php
        +++ b/resources/lang/no/admin/licenses/general.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses_title'            => 'Om lisenser',
             'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
             'checkin'  					=> 'Sjekk inn setelisens',
             'checkout_history'  		=> 'Utsjekkhistorikk',
        diff --git a/resources/lang/no/admin/locations/table.php b/resources/lang/no/admin/locations/table.php
        index 8e8bba249c..a41a5f5f1e 100644
        --- a/resources/lang/no/admin/locations/table.php
        +++ b/resources/lang/no/admin/locations/table.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        +    'about_locations_title'     => 'Om Lokasjoner',
             'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
             'assets_rtd'                => 'Eiendeler', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Eiendeler tildelt',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Plasseringer',
             'parent'                    => 'Overordnet',
             'currency'                  => 'Valuta i lokasjon',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/no/admin/manufacturers/table.php b/resources/lang/no/admin/manufacturers/table.php
        index 5525c783cd..368b6889ee 100644
        --- a/resources/lang/no/admin/manufacturers/table.php
        +++ b/resources/lang/no/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Om produsenter',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Eiendelsprodusenter',
             'create'				=> 'Opprett produsent',
             'id'   					=> 'ID',
        -    'name'      			=> 'Produsentnavn',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Endre produsent',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/no/admin/models/message.php b/resources/lang/no/admin/models/message.php
        index 7440c1f538..fa33ce029b 100644
        --- a/resources/lang/no/admin/models/message.php
        +++ b/resources/lang/no/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Vellykket gjenoppretting av modell.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/no/admin/settings/general.php b/resources/lang/no/admin/settings/general.php
        index f2e03b0a96..9905779c9b 100644
        --- a/resources/lang/no/admin/settings/general.php
        +++ b/resources/lang/no/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Terskel for utløpende varslinger (dager)',
         	'alert_inv_threshold'		=> 'Terskel for eiendelsvarslinger',
         	'asset_ids'					=> 'Eiendels-IDer',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generer automatisk økende eiendels-IDer',
         	'auto_increment_prefix'		=> 'Prefiks (valgfritt)',
         	'auto_incrementing_help'    => 'Aktiver først automatisk øking av eiendels-IDer for å velge dette alternativet',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP E-post',
             'load_remote_text'          => 'Eksterne Skript',
             'load_remote_help_text'		=> 'Denne Snipe-IT-installasjonen kan laste skript fra Internett.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Vis kun eiendeler til bedriften brukere (inkl administratorer) er knyttet til.',
             'full_multiple_companies_support_text' => 'Full støtte for flere bedrifter',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP-versjon',
             'php_gd_info'               => 'Du må installere php-gd for å vise QR-koder. Se installasjonsinstruksjoner.',
             'php_gd_warning'            => 'PHP bildebehandling og GD-plugin er IKKE installert.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Aktiver QR-koder først for å velge denne',
             'qr_text'                   => 'Tekst QR-kode',
             'setting'                   => 'Innstilling',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Disse innstillingene lar deg tilpasse enkelte aspekter av installasjonen din.',
             'labels_per_page'           => 'Etiketter per side',
             'label_dimensions'          => 'Etikettstørrelsen (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Side marger (inches)',
             'purge'                    => 'Tømme slettede poster',
             'labels_display_bgutter'    => 'Etikett bunnmarg',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'b',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'To-faktor autentisering',
             'two_factor_secret'        => 'To-faktor kode',
             'two_factor_enrollment'        => 'To-faktor registrering',
        diff --git a/resources/lang/no/admin/users/general.php b/resources/lang/no/admin/users/general.php
        index 28f6177482..7f939e5253 100644
        --- a/resources/lang/no/admin/users/general.php
        +++ b/resources/lang/no/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Eiendeler tildelt :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Eiendeler som er sjekket ut til denne brukeren',
             'clone'             => 'Klon bruker',
             'contact_user'      => 'Kontakt :navn',
             'edit'              => 'Rediger bruker',
             'filetype_info'     => 'Gyldige filtyper er png, gif, jpg, jpeg, doc docx, pdf, txt, zip og rar.',
             'history_user'      => 'Historikk for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Siste innlogging',
             'ldap_config_text'  => 'LDAP-konfigurasjonsinnstillingene kan finnes på Admin > innstillinger. Den (Valgfrie) valgte plasseringen angis for alle importerte brukere.',
             'software_user'     => 'Programvare utsjekket til :name',
        @@ -17,5 +21,5 @@ return array(
             'usercsv'           => 'CSV-fil',
             'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
             'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_active'   => '2FA Aktiv ',
             );
        diff --git a/resources/lang/no/admin/users/message.php b/resources/lang/no/admin/users/message.php
        index 2ee69a0891..358e4f982d 100644
        --- a/resources/lang/no/admin/users/message.php
        +++ b/resources/lang/no/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Du har akseptert eiendelen.',
             'declined'                  => 'Du har avvist eiendelen.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Bruker finnes allerede!',
             'user_not_found'            => 'Bruker [:id] finnes ikke.',
             'user_login_required'       => 'Login-feltet er påkrevd',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Opprettelse av bruker vellykket.',
                 'update'    => 'Oppdatering av bruker vellykket.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Sletting av bruker vellykket.',
                 'ban'       => 'Vellykket forbud av bruker.',
                 'unban'     => 'Forbud av bruker ble opphevet.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Det oppstod et problem under opprettelse av bruker. Prøv igjen.',
                 'update' => 'Det oppstod et problem under oppdatering av bruker. Prøv igjen.',
                 'delete' => 'Det oppstod et problem under sletting av bruker. Prøv igjen.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Det oppstod et problem under aktivering av bruker. Prøv igjen.',
                 'import'    => 'Det oppstod et problem under import av brukere. Prøv igjen.',
                 'asset_already_accepted' => 'Denne eiendelen er allerede akseptert.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Kunne ikke opprette tilkopling til LDAP-server. Sjekk LDAP-innstillingene i konfigurasjonsfilen. <br>Feil fra LDAP-server: ',
                 'ldap_could_not_search' => 'Kunne ikke utføre søk på LDAP-serveren. Sjekk LDAP-innstillingene i konfigurasjonsfilen. <br>Feil fra LDAP-server:',
                 'ldap_could_not_get_entries' => 'Fikk ingen oppføringer fra LDAP-serveren. Sjekk LDAP-innstillingene i konfigurasjonsfilen. <br>Feil fra LDAP-server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/no/admin/users/table.php b/resources/lang/no/admin/users/table.php
        index 66cacd0f41..3653bf7819 100644
        --- a/resources/lang/no/admin/users/table.php
        +++ b/resources/lang/no/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktiv',
             'allow'  				=> 'Tillatt',
             'checkedout'  			=> 'Eiendeler',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Lokasjon',
             'lock_passwords'		=> 'Innloggingsdetaljer kan ikke endres i denne installasjonen.',
             'manager' 				=> 'Overordnet',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Navn',
             'notes'                 => 'Notater',
             'password_confirm' 		=> 'Bekreft passord',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Vis nåværende brukere',
             'show_deleted'          => 'Vis slettede brukere',
             'title' 				=> 'Tittel',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Oppdater bruker',
             'username' 				=> 'Brukernavn',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Dette brukes til binding i Active Directory, ikke for innlogging)',
             'cloneuser'             => 'Klon bruker',
             'viewusers' 			=> 'Vis brukere',
        diff --git a/resources/lang/no/auth/message.php b/resources/lang/no/auth/message.php
        index 271c02cbd2..600660a1f7 100644
        --- a/resources/lang/no/auth/message.php
        +++ b/resources/lang/no/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Denne brukerkontoen er ikke aktiv.',
             'account_suspended'      => 'Denne brukerkontoen er deaktivert.',
             'account_banned'         => 'Denne brukerkontoen er forbudt.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'For mange mislykkede påloggingsforsøk. Prøv igjen om :minutes minutt(er).',
         
             'signin' => array(
                 'error'   => 'Det oppstod et problem under innlogging. Prøv igjen.',
        diff --git a/resources/lang/no/button.php b/resources/lang/no/button.php
        index 1ec7afa7bc..4023f7ff2a 100644
        --- a/resources/lang/no/button.php
        +++ b/resources/lang/no/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Handlinger',
             'add'    	                => 'Opprett ny',
             'cancel'                    => 'Avbryt',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Forespørsel',
             'submit'  	                => 'Send',
             'upload'                    => 'Last opp',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/no/general.php b/resources/lang/no/general.php
        index 2b92166b0e..51cd59f43a 100644
        --- a/resources/lang/no/general.php
        +++ b/resources/lang/no/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Eiendelsrapport',
             'asset_tag'				=> 'Eiendelsmerke',
             'assets_available'		=> 'Tilgjengelige eiendeler',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Eiendeler',
             'avatar_delete'         => 'Slett Avatar',
             'avatar_upload'         => 'Last opp Avatar',
             'back'      			=> 'Tilbake',
             'bad_data'      		=> 'Fant ingenting. Kanskje feil i data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Masseutsjekk',
             'cancel'  				=> 'Avbryt',
             'categories'			=> 'Kategorier',
             'category'				=> 'Kategori',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Endre e-postadresse',
             'changepassword'  		=> 'Endre passord',
             'checkin'  				=> 'Sjekk inn',
             'checkin_from'  		=> 'Innsjekk fra',
             'checkout'  			=> 'Sjekk ut',
             'city'  				=> 'By',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Selskaper',
             'company'				=> 'Firmanavn',
             'component'			=> 'Komponent',
             'components'			=> 'Komponenter',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Forbruksvare',
             'consumables'			=> 'Forbruksvarer',
             'country'  				=> 'Land',
        @@ -44,16 +51,21 @@
             'created'               => 'Enhet opprettet',
             'created_asset'			=> 'eiendel opprettet',
             'created_at' 			=> 'Opprettet i',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Nåværende',
             'custom_report'         => 'Tilpasset eiendelsrapport',
             'dashboard'				=> 'Kontrollpanel',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Dato',
        -    'debug_warning'         => 'Warning!',
        +    'debug_warning'         => 'Advarsel!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Slett',
             'deleted'  				=> 'Slettet',
             'delete_seats'  		=> 'Slettede setelisenser',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Utlevert',
             'depreciation_report'	=> 'Avskrivningsrapport',
             'download'				=> 'Last ned',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Utilstrekkelige rettigheter!',
             'language'				=> 'Språk',
             'last'					=> 'Siste',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Etternavn',
             'license'				=> 'Lisens',
             'license_report'        => 'Lisensrapport',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Mer info',
             'name'					=> 'Navn',
             'next'					=> 'Neste',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'ny!',
             'no_depreciation'		=> 'Ingen avskrivning',
             'no_results'			=> 'Ingen treff.',
             'no'  					=> 'Nei',
             'notes'  				=> 'Notater',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Ordreummer',
             'page_menu'				=> 'Viser _MENU_ enheter',
             'pagination_info'		=> 'Viser _START_ til _END_ av _TOTAL_ enheter',
             'pending'				=> 'Under arbeid',
        @@ -138,13 +153,14 @@
             'select'				=> 'Velg',
             'search'				=> 'Søk',
             'select_category'       => 'Velg en kategori',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Velg en avskrivningstype',
             'select_location'		=> 'Velg en lokasjon',
             'select_manufacturer'	=> 'Velg en produsent',
             'select_model'			=> 'Velg en modell',
             'select_supplier'		=> 'Velg en leverandør',
             'select_user'			=> 'Velg en bruker',
        -    'select_date'			=> 'Velg en dato',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Velg status',
             'select_company'    	=> 'Velg bedrift',
             'select_asset'    		=> 'Velg eiendel',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Leverandører',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Send',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'eiendeler totalt',
             'total_licenses'		=> 'lisener totalt',
             'total_accessories'		=> 'antall tilbehør',
        diff --git a/resources/lang/no/validation.php b/resources/lang/no/validation.php
        index 8cab930863..241bf70653 100644
        --- a/resources/lang/no/validation.php
        +++ b/resources/lang/no/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "Attributtet :attribute må velges.",
        -    "active_url"       => "Attributtet :attribute er ikke en gyldig URL.",
        -    "after"            => "Attributtet :attribute må være en dato etter :date.",
        -    "alpha"            => "Attributtet :attribute kan kun inneholde bokstaver.",
        -    "alpha_dash"       => "Attributtet :attribute kan kun inneholde bokstaver, nummer eller bindestrek.",
        -    "alpha_num"        => "Attributtet :attribute kan kun inneholde bokstaver og numre.",
        -    "before"           => "Attributtet :attribute må være en dato før :date.",
        -    "between"          => array(
        -        "numeric" => "Attributtet :attribute må være mellom :min og :max.",
        -        "file"    => "Attributtet :attribute må være mellom :min og :max kilobytes.",
        -        "string"  => "Attributtet :attribute må være mellom :min og :max tegn.",
        -    ),
        -    "confirmed"        => "Bekreftelse på attributtet :attribute stemmer ikke.",
        -    "date"             => "Attributtet :attribute er ikke en gyldig dato.",
        -    "date_format"      => "Attributtet :attribute passer ikke formatet :format.",
        -    "different"        => "Attributtet :attribute og :other er forskjellige.",
        -    "digits"           => "Attributtet :attribute må være :digits sifre.",
        -    "digits_between"   => "Attributtet :attribute må være mellom :min og :max sifre.",
        -    "email"            => "Attributtet :attribute er ugyldig.",
        -    "exists"           => "Valgt attributt :attribute er ugyldig.",
        -    "email_array"      => "En eller flere e-postadresser er ugyldig.",
        -    "image"            => "Attributtet :attribute må være et bilde.",
        -    "in"               => "Det valgte attributtet :attribute er ugyldig.",
        -    "integer"          => "Attributtet :attribute må være et heltall.",
        -    "ip"               => "Attributtet :attribute må være en gyldig IP-adresse.",
        -    "max"              => array(
        -        "numeric" => "Attributtet :attribute må ikke være større enn :max.",
        -        "file"    => "Attributtet :attribute kan ikke være større enn :max kilobytes.",
        -        "string"  => "Attributtet :attribute kan ikke være større enn :max tegn.",
        -    ),
        -    "mimes"            => "Attributtet :attribute må være en fil av typen: :values.",
        -    "min"              => array(
        -        "numeric" => "Attributtet :attribute må være minst :min.",
        -        "file"    => "Attributtet :attribute må være minst :min kilobytes.",
        -        "string"  => "Attributtet :attribute må være minst :min tegn.",
        -    ),
        -    "not_in"           => "Attributtet :attribute er ugyldig.",
        -    "numeric"          => "Attributtet :attribute må være et nummer.",
        -    "regex"            => "Attributt-formatet til :attribute er ugyldig.",
        -    "required"         => "Attributt-feltet :attribute er påkrevd.",
        -    "required_if"      => "Attributt-feltet :attribute er påkrevd når :oher er :value.",
        -    "required_with"    => "Attributt-feltet :attribute er påkrevd når :values er tilstede.",
        -    "required_without" => "Attributt-feltet :attribute er påkrevd når :values ikke er tilstede.",
        -    "same"             => "Attributtet :attribute og :other må være like.",
        -    "size"             => array(
        -        "numeric" => "Attributtet :attribute må være :size.",
        -        "file"    => "Attributtet :attribute må være :size kilobytes.",
        -        "string"  => "Attributtet :attribute må være :size tegn.",
        -    ),
        -    "unique"           => "Attributtet :attribute er allerede tatt.",
        -    "url"              => "Attributt-formatet :attribute er ugyldig.",
        -    "statuslabel_type" => "Du må velge en gyldig statusetikett-type",
        -    "unique_undeleted" => ":attribute må være unik.",
        +    'accepted'             => 'Attributtet :attribute må velges.',
        +    'active_url'           => 'Attributtet :attribute er ikke en gyldig URL.',
        +    'after'                => 'Attributtet :attribute må være en dato etter :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'Attributtet :attribute kan kun inneholde bokstaver.',
        +    'alpha_dash'           => 'Attributtet :attribute kan kun inneholde bokstaver, nummer eller bindestrek.',
        +    'alpha_num'            => 'Attributtet :attribute kan kun inneholde bokstaver og numre.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'Attributtet :attribute må være en dato før :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'Attributtet :attribute må være mellom :min og :max.',
        +        'file'    => 'Attributtet :attribute må være mellom :min og :max kilobytes.',
        +        'string'  => 'Attributtet :attribute må være mellom :min og :max tegn.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'Bekreftelse på attributtet :attribute stemmer ikke.',
        +    'date'                 => 'Attributtet :attribute er ikke en gyldig dato.',
        +    'date_format'          => 'Attributtet :attribute passer ikke formatet :format.',
        +    'different'            => 'Attributtet :attribute og :other er forskjellige.',
        +    'digits'               => 'Attributtet :attribute må være :digits sifre.',
        +    'digits_between'       => 'Attributtet :attribute må være mellom :min og :max sifre.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Attributtet :attribute er ugyldig.',
        +    'exists'               => 'Valgt attributt :attribute er ugyldig.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'Attributtet :attribute må være et bilde.',
        +    'in'                   => 'Det valgte attributtet :attribute er ugyldig.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'Attributtet :attribute må være et heltall.',
        +    'ip'                   => 'Attributtet :attribute må være en gyldig IP-adresse.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'Attributtet :attribute må ikke være større enn :max.',
        +        'file'    => 'Attributtet :attribute kan ikke være større enn :max kilobytes.',
        +        'string'  => 'Attributtet :attribute kan ikke være større enn :max tegn.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'Attributtet :attribute må være en fil av typen: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'Attributtet :attribute må være minst :min.',
        +        'file'    => 'Attributtet :attribute må være minst :min kilobytes.',
        +        'string'  => 'Attributtet :attribute må være minst :min tegn.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Attributtet :attribute er ugyldig.',
        +    'numeric'              => 'Attributtet :attribute må være et nummer.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Attributt-formatet til :attribute er ugyldig.',
        +    'required'             => 'Attributt-feltet :attribute er påkrevd.',
        +    'required_if'          => 'Attributt-feltet :attribute er påkrevd når :oher er :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Attributt-feltet :attribute er påkrevd når :values er tilstede.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Attributt-feltet :attribute er påkrevd når :values ikke er tilstede.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'Attributtet :attribute og :other må være like.',
        +    'size'                 => [
        +        'numeric' => 'Attributtet :attribute må være :size.',
        +        'file'    => 'Attributtet :attribute må være :size kilobytes.',
        +        'string'  => 'Attributtet :attribute må være :size tegn.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'Attributtet :attribute er allerede tatt.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Attributt-formatet :attribute er ugyldig.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Feltet :attribute innholder ugyldige tegn.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/pl/admin/asset_maintenances/message.php b/resources/lang/pl/admin/asset_maintenances/message.php
        index eb9a4c9dc9..fc34f9b587 100644
        --- a/resources/lang/pl/admin/asset_maintenances/message.php
        +++ b/resources/lang/pl/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Konserwacja aktywa nie została utworzona, spróbuj ponownie.',
                     'success' => 'Konserwacja aktywa utworzona pomyślnie.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Konserwacja aktywa nie została edytowana, spróbuj ponownie.',
        +            'success' => 'Edycja konserwacji aktywa zakończona pomyślnie.'
        +        ],
                 'asset_maintenance_incomplete' => 'Nieukończone',
                 'warranty'                     => 'Gwarancja',
                 'not_warranty'                 => 'Brak Gwarancji',
        diff --git a/resources/lang/pl/admin/asset_maintenances/table.php b/resources/lang/pl/admin/asset_maintenances/table.php
        index 6e488e0e37..b4d524fab4 100644
        --- a/resources/lang/pl/admin/asset_maintenances/table.php
        +++ b/resources/lang/pl/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Utrzymywanie aktywów',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nazwa Aktywu',
                 'is_warranty'   => 'Gwarancja',
                 'dl_csv'        => 'Pobierz CSV'
             ];
        diff --git a/resources/lang/pl/admin/categories/general.php b/resources/lang/pl/admin/categories/general.php
        index 0a62c264e4..51dc51d84c 100644
        --- a/resources/lang/pl/admin/categories/general.php
        +++ b/resources/lang/pl/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'O Kategoriach',
        +    'about_categories'  				=> 'Kategorie pozwolą lepiej zorganizować twoje aktywa. Przykłady kategorii to np. &quot; Stacje robocze&quot;, &quot;Laptopy&quot;, &quot;Telefony&quot;, &quot;Tablety&quot;, i inne dowolnie przez Ciebie wymyślone.',
             'asset_categories' 					=> 'Kategorie aktywów',
             'category_name'  					=> 'Nazwa kategorii',
             'checkin_email'                     => 'Wyślij email przy przypisywaniu do użytkownika.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Edytuj Kategorię',
             'eula_text'							=> 'EULA Kategorii',
             'eula_text_help'					=> 'To pole pozwala dostosować EULA dla określonych rodzajów aktywów. Jeśli masz tylko jedno EULA dla wszystkich aktywów, można zaznaczyć poniższe pole, aby korzystać z domyślnej.',
        +    'name'                              => 'Nazwa Kategorii',
             'require_acceptance'				=> 'Wymaga od użytkowników, aby potwierdzić akceptację aktywów w tej kategorii.',
             'required_acceptance'				=> 'Do użytkownika zostanie wysłana wiadomość email z linkiem potwierdzającym akceptację przedmiotu.',
             'required_eula'						=> 'Do użytkownika zostanie wysłana wiadomość email z kopiąEULA',
        diff --git a/resources/lang/pl/admin/companies/general.php b/resources/lang/pl/admin/companies/general.php
        index 3ebf6acc7f..94dea7bfec 100644
        --- a/resources/lang/pl/admin/companies/general.php
        +++ b/resources/lang/pl/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'O Firmach',
        +    'about_companies_text'                  => 'Firmy mogą być używane jako proste pole identyfikacyjne, lub może posłużyć do ograniczenia widoczności aktywów dla użytkowników, itp, jeśli pełna obsługa firm jest włączona w ustawieniach administracyjnych.',
             'select_company' => 'Wybierz firmę',
         ];
        diff --git a/resources/lang/pl/admin/custom_fields/general.php b/resources/lang/pl/admin/custom_fields/general.php
        index d67135df17..45eee63646 100644
        --- a/resources/lang/pl/admin/custom_fields/general.php
        +++ b/resources/lang/pl/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'O zestawie pól',
             'about_fieldsets_text'		=> 'Zestawy pól pozwalają tworzyć grupy pól niestandardowych, które często są używane dla specyficznych typów modeli.',
             'custom_format'             => 'Własny format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Szyfruje wartość tego pola w bazie danych',
             'encrypt_field_help'      => 'UWAGA: Szyfrowanie pola spowoduje brak możliwości wyszukiwania go.',
             'encrypted'      	        => 'Zaszyfrowane',
             'fieldset'      	        => 'Zestaw pól',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Nazwa zestawu pól',
             'field_name'              => 'Nazwa Pola',
             'field_values'            => 'Wartości pól',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Dodaj opcje zaznaczania, jeden na wiersz. Puste wiersze poza pierwszym wierszem będą ignorowane.',
             'field_element'           => 'Element formularza',
             'field_element_short'     => 'Element',
             'field_format'            => 'Format',
        diff --git a/resources/lang/pl/admin/custom_fields/message.php b/resources/lang/pl/admin/custom_fields/message.php
        index 2b25c61117..9fc2f5b0b4 100644
        --- a/resources/lang/pl/admin/custom_fields/message.php
        +++ b/resources/lang/pl/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Zestaw pól nie istnieje',
         
                 'create' => array(
                     'error'   => 'Zestaw pól nie został utworzony, spróbuj ponownie.',
        diff --git a/resources/lang/pl/admin/departments/message.php b/resources/lang/pl/admin/departments/message.php
        new file mode 100644
        index 0000000000..5bdef97b99
        --- /dev/null
        +++ b/resources/lang/pl/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Wydział nie istnieje.',
        +    'assoc_users'	 => 'Ten wydział obecnie jest skojarzony z co najmniej jednym użytkownikiem i nie może zostać usunięty. Uaktualnij użytkowników tak, aby nie było relacji z tym wydziałem i spróbuj ponownie. ',
        +    'create' => array(
        +        'error'   => 'Wydział nie został utworzony. Spróbuj ponownie.',
        +        'success' => 'Wydział utworzony pomyślnie.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Wydział nie został utworzony. Spróbuj ponownie',
        +        'success' => 'Wydział utworzony pomyślnie.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Czy na pewno usunąć wybrany wydział?',
        +        'error'   => 'Podczas usuwania wydziału napotkano problem. Spróbuj ponownie.',
        +        'success' => 'Wydział usunięty pomyślnie.'
        +    )
        +
        +);
        diff --git a/resources/lang/pl/admin/departments/table.php b/resources/lang/pl/admin/departments/table.php
        new file mode 100644
        index 0000000000..c2147248d7
        --- /dev/null
        +++ b/resources/lang/pl/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Nazwa wydziału',
        +    'manager'                   => 'Menedżer',
        +    'location'                  => 'Lokalizacja',
        +    'create'                    => 'Utwórz wydział',
        +    'update'                    => 'Aktualizuj wydział',
        +    );
        diff --git a/resources/lang/pl/admin/depreciations/general.php b/resources/lang/pl/admin/depreciations/general.php
        index 3cf9af4f5e..8fd2e4bffd 100644
        --- a/resources/lang/pl/admin/depreciations/general.php
        +++ b/resources/lang/pl/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Informacja na temat amortyzacji nabytku',
             'about_depreciations'  					=> 'Możesz ustawić amortyzację środków trwałych na podstawie amortyzacji aktywów w oparciu o metodę liniową.',
             'asset_depreciations'  					=> 'Amortyzacja nabytków',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Nowa amortyzacja',
             'depreciation_name'  					=> 'Nazwa amortyzacji',
             'number_of_months'  					=> 'Numer miesiąca',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Aktualizuj amortyzację',
         
         );
        diff --git a/resources/lang/pl/admin/groups/titles.php b/resources/lang/pl/admin/groups/titles.php
        index e7eef108fa..f853d9241c 100644
        --- a/resources/lang/pl/admin/groups/titles.php
        +++ b/resources/lang/pl/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'O Grupach użytkowników',
        +    'about_groups'                  => 'Grupy są używane do generalizowania uprawnień użytkowników.',
             'group_management' 	 	=> 'Zarządzanie grupą',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Utwórz nową grupę',
        +    'update' 	 		        => 'Edytuj grupę',
             'group_name' 	 		=> 'Nazwa grupy',
             'group_admin' 	 		=> 'Admin grupy',
             'allow' 	 			=> 'Zezwól',
        diff --git a/resources/lang/pl/admin/hardware/form.php b/resources/lang/pl/admin/hardware/form.php
        index b57093ebfe..468d369d60 100644
        --- a/resources/lang/pl/admin/hardware/form.php
        +++ b/resources/lang/pl/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Potwierdź zbiorcze usuwanie aktywów',
           'bulk_delete_help'	=> 'Przejrzyj usuwanie zbiorcze aktywów poniżej. Po usunięciu tych aktywów będą one mogły zostać przywrócone, ale nie będą one skojarzone z żadnym z użytkowników, do których są aktualnie przypisane.',
           'bulk_delete_warn'	=> 'Zamierzasz usunąć :asset_count aktywów.',
         	'bulk_update'		=> 'Zbiorcza aktualizacja aktywów',
        diff --git a/resources/lang/pl/admin/hardware/general.php b/resources/lang/pl/admin/hardware/general.php
        index 214599af16..f367ce460f 100644
        --- a/resources/lang/pl/admin/hardware/general.php
        +++ b/resources/lang/pl/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'O Aktywach',
        +    'about_assets_text'            => 'Aktywa są to elementy identyfikowane przez numer seryjny lub etykietę.  Są to przedmioty o większej wartości, gdzie liczy się identyfikacji określonego elementu.',
         	'archived'  				=> 'Zarchiwizowane',
             'asset'  					=> 'Nabytek',
             'bulk_checkout'             => 'Przypisane aktywa do użytkownika',
             'checkin'  					=> 'Potwierdzanie zasobu/aktywa',
        -    'checkout'  				=> 'Przypisanie aktywa do Użytkownika',
        +    'checkout'  				=> 'Przypisz zasób',
             'clone'  					=> 'Klonuj zasób',
             'deployable'  				=> 'Gotowe do wdrożenia',
             'deleted'  					=> 'To aktywo zostało usunięte. <a href="/hardware/:asset_id/restore">Kliknij tutaj, aby je przywrócić</a>.',
        diff --git a/resources/lang/pl/admin/hardware/message.php b/resources/lang/pl/admin/hardware/message.php
        index 19beae83cd..2d257004a6 100644
        --- a/resources/lang/pl/admin/hardware/message.php
        +++ b/resources/lang/pl/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Aktywo zostało przywrócone.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Audyt aktywów nie powiódł się. Proszę spróbować ponownie.',
        +        'success' 		=> 'Audyt aktywów pomyślnie zarejestrowany.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Plik nie zostały usunięte. Spróbuj ponownie.',
                 'success' => 'Plik zostały usunięty.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Czy na pewno chcesz usunąć?',
                 'error'   		=> 'Nie można usunąć. Proszę spróbować ponownie.',
        +        'nothing_updated'   => 'Aktywa nie zostały wybrane, więc nic nie zostało usunięte.',
                 'success' 		=> 'Nabytek został usunięty.'
             ),
         
        diff --git a/resources/lang/pl/admin/licenses/general.php b/resources/lang/pl/admin/licenses/general.php
        index 0270d30ab5..9f408adb32 100644
        --- a/resources/lang/pl/admin/licenses/general.php
        +++ b/resources/lang/pl/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'O Licencjach',
        +    'about_licenses'                  => 'Licencje są używane do śledzenia oprogramowania.  Posiadają określoną liczbę stanowisk, które mogą być przypisane do osób fizycznych.',
             'checkin'  					=> 'Sprawdź płatność',
             'checkout_history'  		=> 'Historia płatności',
             'checkout'  				=> 'Sprawdź płatność',
        diff --git a/resources/lang/pl/admin/licenses/message.php b/resources/lang/pl/admin/licenses/message.php
        index 0e790fc284..a3dce9e7c7 100644
        --- a/resources/lang/pl/admin/licenses/message.php
        +++ b/resources/lang/pl/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Plik(i) nie zostały wysłane. Spróbuj ponownie.',
                 'success' => 'Plik(i) zostały wysłane poprawnie.',
                 'nofiles' => 'Nie wybrałeś żadnych plików do przesłania, albo plik, który próbujesz przekazać jest zbyt duży',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Jeden lub więcej z wybranych przez ciebie plików jest za duży lub jego typ nie jest dopuszczony. Dopuszczalne typy plików: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/pl/admin/locations/table.php b/resources/lang/pl/admin/locations/table.php
        index 4bf85c6acd..c90c2d3e3c 100644
        --- a/resources/lang/pl/admin/locations/table.php
        +++ b/resources/lang/pl/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'O Lokalizacjach',
        +    'about_locations'           => 'Lokalizacje są używane do śledzenia informacji o lokalizacji użytkowników, aktywów i innych elementów',
             'assets_rtd'                => 'Aktywa', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Aktywa przypisane',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Lokalizacje',
             'parent'                    => 'Rodzic',
             'currency'                  => 'Waluta lokalna',
        +    'ldap_ou'                   => 'OU wyszukiwania LDAP',
             );
        diff --git a/resources/lang/pl/admin/manufacturers/table.php b/resources/lang/pl/admin/manufacturers/table.php
        index c413d1f24d..103add8620 100644
        --- a/resources/lang/pl/admin/manufacturers/table.php
        +++ b/resources/lang/pl/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'O Producentach',
        +    'about_manufacturers_text'  => 'Producentami są firmy, które wytwarzają Twoje aktywa. Możesz przechowywać informacje o tych firmach, które będą wyświetlane na stronach szczegółów aktywów.',
             'asset_manufacturers'	=> 'Producenci aktywów',
             'create'				=> 'Stwórz Producenta',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nazwa Producenta',
        +    'name'      			=> 'Nazwa',
        +    'support_email'   		=> 'Email wsparcia technicznego',
        +    'support_phone'   		=> 'Telefon wsparcia technicznego',
        +    'support_url'   		=> 'Adres WWW wsparcia technicznego',
             'update'				=> 'Zaktualizuj Producenta',
        +    'url'   				=> 'Adres WWW',
         
         );
        diff --git a/resources/lang/pl/admin/models/general.php b/resources/lang/pl/admin/models/general.php
        index f0d7f4e07b..fc8d85b0e1 100644
        --- a/resources/lang/pl/admin/models/general.php
        +++ b/resources/lang/pl/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'O Modelach aktywów',
        +    'about_models_text'           => 'Modele aktywów są sposobem grupowania identycznych aktywów. "MBP 2013", "IPhone 6s", itp.',
             'deleted'  					        => 'Model został usunięty. <a href="/hardware/models/:model_id/restore">Kliknij aby przywrócić</a>.',
             'restore'                   => 'Przywróć Model',
             'requestable'               => 'Użytkownicy mogą zażądać tego modelu',
        diff --git a/resources/lang/pl/admin/models/message.php b/resources/lang/pl/admin/models/message.php
        index 9b09c16fff..032123e464 100644
        --- a/resources/lang/pl/admin/models/message.php
        +++ b/resources/lang/pl/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model został przywrócony pomyślnie.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/pl/admin/settings/general.php b/resources/lang/pl/admin/settings/general.php
        index f03fc01d6c..1708bed01d 100644
        --- a/resources/lang/pl/admin/settings/general.php
        +++ b/resources/lang/pl/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Próg wygasających alarmów (w dniach)',
         	'alert_inv_threshold'		=> 'Inwentarz progu alarmów',
         	'asset_ids'					=> 'ID Aktywa',
        +	'audit_interval'            => 'Interwał audytu',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generuj automatycznie zwiększane ID aktywa',
         	'auto_increment_prefix'		=> 'Prefix (opcjonalnie)',
         	'auto_incrementing_help'    => 'Najpierw aktywuj automatycznie zwiększane ID Aktywa, by móc ustawić te opcje.',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'E-mail pracownika LDAP',
             'load_remote_text'          => 'Skrypty zdalne',
             'load_remote_help_text'		=> 'Ta instalacja Snipe-IT może załadować skrypty z zewnętrznego świata.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Ograniczenie do użytkowników',
             'full_multiple_companies_support_text' => 'Wsparcie dla wielu firm',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Wersja PHP',
             'php_gd_info'               => 'Aby wyświetlić kody QR wymagana jest instalacja php-gd, sprawdź instrukcję.',
             'php_gd_warning'            => 'PHP Image Processing i GD plugin nie są zainstalowane.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Aby użyć tej opcji odblokuj Kody QR',
             'qr_text'                   => 'Tekst kodu QR',
             'setting'                   => 'Ustawienie',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Te ustawienia pozwalają ci zmodyfikować najważniejsze szczegóły twojej instalacji.',
             'labels_per_page'           => 'Etykieta per strona',
             'label_dimensions'          => 'rozmiar etykiety',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Margines strony (cale)',
             'purge'                    => 'Wyczyść usunięte rekordy',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,30 +117,32 @@ return array(
             'width_w'        => 'szerokość',
             'height_h'        => 'wysokość',
             'text_pt'        => 'piksel',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Autoryzacja dwuskładnikowa',
        +    'two_factor_secret'        => 'Kod jednorazowy',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        +    'two_factor_enabled_text'        => 'Włącz uwieżytelnianie dwuskładnikowe',
             'two_factor_reset'        => 'Reset Two-Factor Secret',
             'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
             'two_factor_reset_success'          => 'Two factor device successfully reset',
             'two_factor_reset_error'          => 'Two factor device reset failed',
             'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
             'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        +    'two_factor_optional'        => 'Wybiórczo (Użytkownicy mogą włączyć lub wyłączyć jeśli posiadają uprawnienie)',
        +    'two_factor_required'        => 'Wymagane dla wszystkich użytkowników',
        +    'two_factor_disabled'        => 'Wyłączony',
        +    'two_factor_enter_code'	=> 'Wprowadź kod jednorazowy',
        +    'two_factor_config_complete'	=> 'Zatwierdź kod',
             'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
             'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'require_accept_signature'      => 'Wymagany podpis',
        +    'require_accept_signature_help_text'      => 'Włączając tę funkcjonalność wymusza się na użytkownikach fizycznego podpisania przyjęcia aktywa.',
             'left'        => 'lewo',
             'right'        => 'prawo',
             'top'        => 'góra',
             'bottom'        => 'dół',
             'vertical'        => 'pionowy',
        -    'horizontal'        => 'horizontal',
        +    'horizontal'        => 'poziomy',
             'zerofill_count'        => 'Length of asset tags, including zerofill',
         );
        diff --git a/resources/lang/pl/admin/suppliers/table.php b/resources/lang/pl/admin/suppliers/table.php
        index fbb1816fcd..696d704e2c 100644
        --- a/resources/lang/pl/admin/suppliers/table.php
        +++ b/resources/lang/pl/admin/suppliers/table.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        +    'about_suppliers_title' => 'O Dostawcach',
             'about_suppliers_text'  => 'Suppliers are used to track the source of items',
             'address'               => 'Adres Dostawcy',
             'assets'                => 'Aktywa',
        diff --git a/resources/lang/pl/admin/users/general.php b/resources/lang/pl/admin/users/general.php
        index 08fefa7846..5cce99cdff 100644
        --- a/resources/lang/pl/admin/users/general.php
        +++ b/resources/lang/pl/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Aktwo przypisane do :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Aktywo obecnie jest przypisane do tego użytkownika',
             'clone'             => 'Kopiuj Użytkownika',
             'contact_user'      => 'Kontakt :name',
             'edit'              => 'Edycja Użytkownika',
             'filetype_info'     => 'Dozwolone typy plików: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar.',
             'history_user'      => 'Historia',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Ostatnie logowanie',
             'ldap_config_text'  => 'Ustawienia konfiguracji LDAP mogą być znalezione w Administracja -> Ustawienia. Opcjonalnie wybierz lokalizacje, która będzie ustawiona dla zaimportowanych użytkowników.',
             'software_user'     => 'Oprogramowanie przypisane do :name',
             'view_user'         => 'Zobacz Użytkownika :name',
             'usercsv'           => 'plik CSV',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'Bieżące ustawienia administracyjne pozwalają na wybiórcze rejestrowanie uwierzytelniania dwuskładnikowego.  ',
        +    'two_factor_enrolled' => 'Zarejestrowane urządzenie 2FA ',
        +    'two_factor_active'   => 'Aktywuj 2FA ',
             );
        diff --git a/resources/lang/pl/admin/users/message.php b/resources/lang/pl/admin/users/message.php
        index 7d2defc616..3ca4a368d9 100644
        --- a/resources/lang/pl/admin/users/message.php
        +++ b/resources/lang/pl/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Pomyślnie zaakceptowałeś ten składnik aktywów.',
             'declined'                  => 'Pomyślnie odrzuciłeś ten składnik aktywów.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Użytkownik już istnieje!',
             'user_not_found'            => 'User [:id] nie istnieje.',
             'user_login_required'       => 'Pole login jest wymagane',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Użytkownik utworzony pomyślnie.',
                 'update'    => 'Użytkownik zaktualizowany pomyślnie.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Użytkownik został usunięty pomyślnie.',
                 'ban'       => 'Użytkownik został zablokowany.',
                 'unban'     => 'Użytkownik został odblokowany.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Podczas tworzenia użytkownika wystąpił problem. Spróbuj ponownie.',
                 'update' => 'Podczas aktualizacji użytkownika wystąpił problem. Spróbuj ponownie.',
                 'delete' => 'Wystąpił błąd podczas usuwania użytkownika. Spróbuj ponownie.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Wystąpił problem podczas odblokowania użytkownika. Spróbuj ponownie.',
                 'import'    => 'Podczas importowania użytkowników wystąpił błąd. Spróbuj ponownie.',
                 'asset_already_accepted' => 'Aktywo zostało już zaakceptowane.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Nie udało się połączyć z serwerem LDAP. Sprawdź proszę konfigurację serwera LDAP w pliku konfiguracji. <br>Błąd z serwera LDAP: ',
                 'ldap_could_not_search' => 'Nie udało się przeszukać serwera LDAP. Sprawdź proszę konfigurację serwera LDAP w pliku konfiguracji. <br>Błąd z serwera LDAP:',
                 'ldap_could_not_get_entries' => 'Nie udało się pobrać pozycji z serwera LDAP. Sprawdź proszę konfigurację serwera LDAP w pliku konfiguracji. <br>Błąd z serwera LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/pl/admin/users/table.php b/resources/lang/pl/admin/users/table.php
        index 88101cb02a..1cdc62d840 100644
        --- a/resources/lang/pl/admin/users/table.php
        +++ b/resources/lang/pl/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktywny',
             'allow'  				=> 'Pozwól',
             'checkedout'  			=> 'Aktywa',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Lokalizacja',
             'lock_passwords'		=> 'Szczegóły loginu nie mogą zostać zmienione dla tej instalacji.',
             'manager' 				=> 'Kierownik',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nazwa',
             'notes'                 => 'Uwagi',
             'password_confirm' 		=> 'Potwierdź hasło',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Pokaż bieżących użytkowników',
             'show_deleted'          => 'Pokaż usuniętych użytkowników',
             'title' 				=> 'Tytuł',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Zaktualizuj użytkownika',
             'username' 				=> 'Nazwa użytkownika',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(to jest używane do połączenia do Active Directory, nie do logowania)',
             'cloneuser'             => 'Kopiuj Użytkownika',
             'viewusers' 			=> 'Przeglądaj użytkowników',
        diff --git a/resources/lang/pl/auth/message.php b/resources/lang/pl/auth/message.php
        index 056e02c347..178e37a8f4 100644
        --- a/resources/lang/pl/auth/message.php
        +++ b/resources/lang/pl/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Użytkownik jest nieaktywowany.',
             'account_suspended'      => 'Twoje konto zostało zawieszone.',
             'account_banned'         => 'Twoje konto zostało zablokowane.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Zbyt wiele nieudanych prób logowania. Spróbuj ponownie za :minutes minut(y).',
         
             'signin' => array(
                 'error'   => 'Wystąpił problem z logowanie, proszę spróbować ponownie.',
        diff --git a/resources/lang/pl/button.php b/resources/lang/pl/button.php
        index b3a544c9cd..6bb7ce5739 100644
        --- a/resources/lang/pl/button.php
        +++ b/resources/lang/pl/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Akcje',
             'add'    	                => 'Dodaj nowy',
             'cancel'                    => 'Anuluj',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Zamówienie',
             'submit'  	                => 'Zatwierdź',
             'upload'                    => 'Wgraj',
        -
        +	'select_file'				=> 'Wybierz plik...',
         );
        diff --git a/resources/lang/pl/general.php b/resources/lang/pl/general.php
        index 3a76903726..ed32656f9c 100644
        --- a/resources/lang/pl/general.php
        +++ b/resources/lang/pl/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Raporty Aktywów',
             'asset_tag'				=> 'Krótka nazwa',
             'assets_available'		=> 'Aktywa dostępne',
        +    'audit'				    => 'Audyt',
        +    'audit_report'			=> 'Dziennik zdarzeń',
             'assets'				=> 'Aktywa',
             'avatar_delete'         => 'Skasuj Avatara',
             'avatar_upload'         => 'Wgraj Avatara',
             'back'      			=> 'Powrót',
             'bad_data'      		=> 'Nie znaleziono niczego. Może coś jest nie tak z twoim zapytaniem?',
        -    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Zbiorcze Przypisanie',
             'cancel'  				=> 'Anuluj',
             'categories'			=> 'Kategorie',
             'category'				=> 'Kategoria',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Zmiana adresu email',
             'changepassword'  		=> 'Zmień Hasło',
             'checkin'  				=> 'Odepnij',
             'checkin_from'  		=> 'Formularz odebrania',
             'checkout'  			=> 'Przypisz',
             'city'  				=> 'Miasto',
        +	'click_here'			=> 'Kliknij tutaj',
             'companies'			=> 'Firmy',
             'company'				=> 'Firma',
             'component'			=> 'Składnik',
             'components'			=> 'Składniki',
        +	'complete'				=> 'Ukończone',
             'consumable'			=> 'Materiał eksploatacyjny',
             'consumables'			=> 'Materiały eksploatacyjne',
             'country'  				=> 'Kraj',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'Utworzone aktywa',
             'created_at' 			=> 'Utworzone',
        +    'updated_at' 			=> 'Zaktualizowano',
             'currency'  			=> 'PLN', // this is deprecated
             'current'  				=> 'Lista urzytkowników',
             'custom_report'         => 'Raport niestandardowy składnik aktywów',
             'dashboard'				=> 'Panel główny',
        +    'days'      			=> 'dni',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Data',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Ostrzeżenie!',
        +    'debug_warning_text'         => 'Ta aplikacja jest uruchomiona w trybie produkcyjnym z włączonym debugowaniem. Jeśli aplikacja jest dostępna na zewnątrz, może to zagrażać ujawnieniem wrażliwych danych. Wyłącz tryb debugowania przez ustawienie wartości <code>APP_DEBUG</code> w pliku <code>.env</code> na <code>false</code>.',
             'delete'  				=> 'Kasuj',
             'deleted'  				=> 'Usunięte',
             'delete_seats'  		=> 'Usunięte miejsca',
        +    'departments'           => 'Lokalizacje',
        +    'department'           => 'Lokalizacja',
             'deployed'				=> 'Rozmieszczone',
             'depreciation_report'	=> 'Raport Amortyzacji',
             'download'				=> 'Pobieranie',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Brak uprawnień!',
             'language'				=> 'Język',
             'last'					=> 'Ostatni',
        +    'last_login'            => 'Ostatnie logowanie',
             'last_name'             => 'Nazwisko',
             'license'				=> 'Licencja',
             'license_report'        => 'Raport Licencji',
        @@ -95,7 +108,7 @@
             'list_all'				=> 'Pokaż Wszystkie',
             'loading'				=> 'Wczytywanie',
             'lock_passwords'        => 'Tego pola nie można edytować dla tej instalacji.',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'feature_disabled'      => 'Ta funkcja została wyłączona dla instalacji demo.',
             'location'              => 'Lokalizacja',
             'locations'				=> 'Lokalizacje',
             'logout'				=> 'Wyloguj się',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Więcej informacji',
             'name'					=> 'Nazwa',
             'next'					=> 'Następny',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'nowy!',
             'no_depreciation'		=> 'Nie Amortyzowany',
             'no_results'			=> 'Brak wyników.',
             'no'  					=> 'Nie',
             'notes'  				=> 'Notatki',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Numer zamówienia',
             'page_menu'				=> 'Wyświetla pozycje _MENU_',
             'pagination_info'		=> 'Wyświetla _START_ do _END_ z _TOTAL_ pozycji',
             'pending'				=> 'Oczekujący',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Poprzedni',
             'processing'			=> 'Przetwarzanie',
             'profile'				=> 'Twój profil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Koszt zakupu',
        +    'purchase_date'         => 'Data zakupu',
             'qty'		            => 'Ilość',
             'quantity'		        => 'Ilość',
             'ready_to_deploy'		=> 'Gotowe do wdrożenia',
        @@ -138,31 +153,35 @@
             'select'				=> 'Wybierz',
             'search'				=> 'Wyszukaj',
             'select_category'       => 'Wybierz kategorię',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Wybierz rodzaj amortyzacji',
             'select_location'		=> 'Wybierz lokację',
             'select_manufacturer'	=> 'Wybierz producenta',
             'select_model'			=> 'Wybierz Model',
             'select_supplier'		=> 'Wybierz dostawcę',
             'select_user'			=> 'Wybierz użytkownika',
        -    'select_date'			=> 'Wybierz datę',
        +    'select_date'			=> 'Wybierz Datę (RRRR MM-DD)',
             'select_statuslabel'	=> 'Wybierz status',
             'select_company'    	=> 'Wybierz firmę',
             'select_asset'    		=> 'Wybierz aktywa',
             'settings'				=> 'Ustawienia',
             'sign_in'				=> 'Zaloguj się',
        -    'signature'             => 'Signature',
        +    'signature'             => 'Podpis',
             'some_features_disabled' => 'Wersja demonstracyjna: Pewne funkcje zostały wyłączone w tej instalacji.',
             'site_name'				=> 'Nazwa Witryny',
             'state'  				=> 'Województwo',
             'status_labels'			=> 'Etykiety Statusu',
             'status'    			=> 'Status',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Dostawca',
             'suppliers'  			=> 'Dostawcy',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => 'Czy na pewno chcesz usunąć',
        +    'submit'				=> 'Zatwierdź',
        +    'target'                => 'Cel',
        +    'time_and_date_display' => 'Wyświetlanie daty i czasu',
             'total_assets'			=> 'Ogółem aktywów',
             'total_licenses'		=> 'Ogółem licencji',
        -    'total_accessories'		=> 'total accessories',
        -    'total_consumables'		=> 'total consumables',
        +    'total_accessories'		=> 'Ogółem akcesorii',
        +    'total_consumables'		=> 'Ogółem materiałów eksploatacyjnych',
             'type'  				=> 'Rodzaj',
             'undeployable'			=> 'Nie przypisane',
             'unknown_admin'			=> 'Nieznany Administrator',
        diff --git a/resources/lang/pl/mail.php b/resources/lang/pl/mail.php
        index c9a4fe182d..a15d5186dc 100644
        --- a/resources/lang/pl/mail.php
        +++ b/resources/lang/pl/mail.php
        @@ -1,74 +1,72 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'a_user_canceled' => 'Użytkownik anulował zapotrzebowanie na sprzęt na stronie www',
        +    'a_user_requested' => 'Użytkownik zamówił pozycję na stronie internetowej',
        +    'accessory_name' => 'Nazwa sprzętu:',
        +    'additional_notes' => 'Dodatkowe notatki:',
        +    'admin_has_created' => 'Administrator utworzył dla Ciebie konto na stronie :web.',
        +    'asset' => 'Sprzęt:',
        +    'asset_name' => 'Nazwa sprzętu:',
        +    'asset_requested' => 'Wystosowane zapotrzebowanie na sprzęt',
        +    'asset_tag' => 'Numer sprzętu:',
        +    'assets_warrantee_expiring' => '{1} sprzęt z gwarancją wygasającą w ciągu najbliższych 60 dni. | [2, Inf] sprzętów z gwarancją wygasającą w ciągu najbliższych 60 dni.',
        +    'assigned_to' => 'Przypisane do',
        +    'best_regards' => 'Pozdrawiam',
        +    'canceled' => 'Anulowane:',
        +    'checkin_date' => 'Data otrzymania:',
        +    'checkout_date' => 'Data przypisania:',
        +    'click_to_confirm' => 'Proszę kliknąć na ten link aby potwierdzić swoje konto na :web:',
        +    'click_on_the_link_accessory' => 'Proszę kliknąć link poniżej aby potwierdzić otrzymanie sprzętu.',
        +    'click_on_the_link_asset' => 'Proszę kliknąć link poniżej aby potwierdzić otrzymanie sprzętu.',
        +    'Confirm_Asset_Checkin' => 'Potwierdź otrzymanie sprzętu.',
        +    'Confirm_Accessory_Checkin' => 'Potwierdź przyjęcie Akcesorium.',
        +    'Confirm_accessory_delivery' => 'Potwierdź dostarczenie akcesorium.',
        +    'Confirm_asset_delivery' => 'Potwierdź dostarczenie sprzętu.',
        +    'Confirm_consumable_delivery' => 'Potwierdź dostarczenie materiałów eksploatacyjnych.',
        +    'current_QTY' => 'Bieżąca ilość',
        +    'Days' => 'Dni',
        +    'days' => 'Dni',
        +    'expecting_checkin_date' => 'Spodziewana data przyjęcia:',
        +    'expires' => 'Wygasa',
        +    'Expiring_Assets_Report' => 'Raport wygasających sprzętów.',
        +    'Expiring_Licenses_Report' => 'Raport Wygasających Licencji.',
        +    'hello' => 'Cześć',
        +    'hi' => 'Cześć',
        +    'i_have_read' => 'Przeczytałem i zgadzam się z warunkami użytkowania oraz potwierdzam otrzymanie niniejszej pozycji.',
        +    'item' => 'Pozycja:',
        +    'items_below_minimum' => '{1} pozycja jest poniżej minimum inwentaryzacji lub niedługo będzie niska.|[2,Inf] pozycje są poniżej minimum
        +                              inwentaryzacji lub niedługo będą niskie.',
        +    'Item_Request_Canceled' => 'Anulowano zamówioną pozycję',
        +    'Item_Requested' => 'Pozycja Zamówiona',
        +    'licenses_expiring' => '{1} licencje wygasające w ciągu kolejnych 60 dniach. | [2, Inf] licencji wygasających w ciągu kolejnych 60 dni.',
        +    'link_to_update_password' => 'Proszę kliknąć na poniższy link, aby zaktualizować swoje hasło na :web:',
        +    'login_first_admin' => 'Zaloguj się do aplikacji Snipe-IT przy użyciu poniższych poświadczeń:',
             'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'Low_Inventory_Report' => 'Raport niskiego stanu zasobów',
        +    'min_QTY' => 'Min. ilość',
        +    'name' => 'Nazwa',
        +    'new_item_checked' => 'Nowy przedmiot przypisany do Ciebie został zwrócony, szczegóły poniżej.',
        +    'password' => 'Hasło:',
        +    'password_reset' => 'Resetowanie hasła',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        +    'read_the_terms' => 'Proszę przeczytać warunki użytkowania przedstawione poniżej.',
        +    'read_the_terms_and_click' => 'Proszę przeczytać warunki użytkowania przedstawione poniżej i kliknąć na link poniżej aby potwierdzić zapoznanie się z warunkami  użytkowania i otrzymania sprzętu.',
        +    'requested' => 'Zamówione:',
        +    'reset_link' => 'Link resetujący Twoje hasło',
        +    'reset_password' => 'Kliknij tutaj aby zresetować swoje hasło:',
        +    'serial' => 'Nr seryjny:',
        +    'supplier' => 'Dostawca',
             'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'test_email' => 'Testowy email z :web',
        +    'test_mail_text' => 'To jest wiadomość testowa z aplikacji Snipe-IT Asset Management System. Jeśli otrzymałeś ją - poczta działa :)',
        +    'the_following_item' => 'Następujący sprzęt został otrzymany: ',
        +    'There_are' => '{1} jest | [2, Inf] są',
        +    'to_reset' => 'Aby zresetować hasło na :web, wypełnij ten formularz:',
        +    'type' => 'Typ',
        +    'user' => 'Użytkownik:',
        +    'username' => 'Nazwa użytkownika:',
        +    'welcome' => 'Witaj :name',
        +    'welcome_to' => 'Witamy na :web!',
        +    'your_credentials' => 'Twoje poświadczenia :web',
         );
        diff --git a/resources/lang/pl/validation.php b/resources/lang/pl/validation.php
        index f071831602..52cb372de1 100644
        --- a/resources/lang/pl/validation.php
        +++ b/resources/lang/pl/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute musi zostać zaakceptowany.",
        -    "active_url"       => ":attribute nie jest poprawnym adresem URL.",
        -    "after"            => ":attribute musi być późniejszą datą w stosunku do :date.",
        -    "alpha"            => ":attribute może zawierać tylko litery.",
        -    "alpha_dash"       => ":attribute może zawierać tylko litery, cyfry i myślniki.",
        -    "alpha_num"        => ":attribute może zawierać tylko litery i cyfry.",
        -    "before"           => ":attribute musi być późniejszą datą w stosunku do :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute musi być pomiędzy :min - :max.",
        -        "file"    => ":attribute musi być pomiędzy :min - :max kilobajtów.",
        -        "string"  => ":attribute musi być pomiędzy :min - :max znaków.",
        -    ),
        -    "confirmed"        => "Potwierdzenie :attribute nie pasuje.",
        -    "date"             => ":attribute nie jest prawidłową datą.",
        -    "date_format"      => "Format :attribute nie pasuje do :format.",
        -    "different"        => ":attribute musi różnić się od :other.",
        -    "digits"           => ":attribute musi posiadać cyfry :digits.",
        -    "digits_between"   => ":attribute musi być pomiędzy cyframi :min i :max.",
        -    "email"            => "Format pola :attribute jest niewłaściwy.",
        -    "exists"           => "Wybrane :attribute jest niewłaściwe.",
        -    "email_array"      => "Jeden lub więcej wprowadzonych adresów jest nieprawidłowy.",
        -    "image"            => ":attribute musi być obrazkiem.",
        -    "in"               => "Wybrane :attribute jest niewłaściwe.",
        -    "integer"          => ":attribute must musi być liczbą całkowitą.",
        -    "ip"               => ":attribute musi być poprawnym adresem IP.",
        -    "max"              => array(
        -        "numeric" => ":attribute nie może być większy niż :max.",
        -        "file"    => ":attribute nie może być więszky niż :max kilobajtów.",
        -        "string"  => ":attribute nie może posiadać więcej znaków niż :max.",
        -    ),
        -    "mimes"            => ":attribute musi być plikiem z rozszerzeniami :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute musi być przynajmniej :min.",
        -        "file"    => ":attribute musi być przynajmniej wielkości :min kilobajtów.",
        -        "string"  => ":attribute musi być posiadać minimum :min znaki.",
        -    ),
        -    "not_in"           => "Wybrany :attribute jest nieprawidłowy.",
        -    "numeric"          => ":attribute musi być liczbą.",
        -    "regex"            => "Format :attribute jest niewłaściwy.",
        -    "required"         => ":attribute nie może być puste.",
        -    "required_if"      => "Pole :attribute jest wymagane gdy :other jest :value.",
        -    "required_with"    => "Pole :attribute jest wymagane gdy :values jest podana.",
        -    "required_without" => "Pole :attribute jest wymagane gdy :values nie jest podana.",
        -    "same"             => ":attribute i :other muszą pasować.",
        -    "size"             => array(
        -        "numeric" => ":attribute musi być wielkości :size.",
        -        "file"    => ":attribute musi być :size kilobajtów.",
        -        "string"  => ":attribute musi być :size znakowy.",
        -    ),
        -    "unique"           => ":attribute został już wzięty.",
        -    "url"              => "Format pola :attribute jest niewłaściwy.",
        -    "statuslabel_type" => "Musisz wybrać poprawny status typu etykiety",
        -    "unique_undeleted" => ":attribute musi być unikalny.",
        +    'accepted'             => ':attribute musi zostać zaakceptowany.',
        +    'active_url'           => ':attribute nie jest poprawnym adresem URL.',
        +    'after'                => ':attribute musi być późniejszą datą w stosunku do :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute może zawierać tylko litery.',
        +    'alpha_dash'           => ':attribute może zawierać tylko litery, cyfry i myślniki.',
        +    'alpha_num'            => ':attribute może zawierać tylko litery i cyfry.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute musi być późniejszą datą w stosunku do :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute musi być pomiędzy :min - :max.',
        +        'file'    => ':attribute musi być pomiędzy :min - :max kilobajtów.',
        +        'string'  => ':attribute musi być pomiędzy :min - :max znaków.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'Potwierdzenie :attribute nie pasuje.',
        +    'date'                 => ':attribute nie jest prawidłową datą.',
        +    'date_format'          => 'Format :attribute nie pasuje do :format.',
        +    'different'            => ':attribute musi różnić się od :other.',
        +    'digits'               => ':attribute musi posiadać cyfry :digits.',
        +    'digits_between'       => ':attribute musi być pomiędzy cyframi :min i :max.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Format pola :attribute jest niewłaściwy.',
        +    'exists'               => 'Wybrane :attribute jest niewłaściwe.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute musi być obrazkiem.',
        +    'in'                   => 'Wybrane :attribute jest niewłaściwe.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute must musi być liczbą całkowitą.',
        +    'ip'                   => ':attribute musi być poprawnym adresem IP.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute nie może być większy niż :max.',
        +        'file'    => ':attribute nie może być więszky niż :max kilobajtów.',
        +        'string'  => ':attribute nie może posiadać więcej znaków niż :max.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute musi być plikiem z rozszerzeniami :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute musi być przynajmniej :min.',
        +        'file'    => ':attribute musi być przynajmniej wielkości :min kilobajtów.',
        +        'string'  => ':attribute musi być posiadać minimum :min znaki.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Wybrany :attribute jest nieprawidłowy.',
        +    'numeric'              => ':attribute musi być liczbą.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Format :attribute jest niewłaściwy.',
        +    'required'             => ':attribute nie może być puste.',
        +    'required_if'          => 'Pole :attribute jest wymagane gdy :other jest :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Pole :attribute jest wymagane gdy :values jest podana.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Pole :attribute jest wymagane gdy :values nie jest podana.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute i :other muszą pasować.',
        +    'size'                 => [
        +        'numeric' => ':attribute musi być wielkości :size.',
        +        'file'    => ':attribute musi być :size kilobajtów.',
        +        'string'  => ':attribute musi być :size znakowy.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute został już wzięty.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Format pola :attribute jest niewłaściwy.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Pole :attribute posiada znak, który jest niedozwolony.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/pt-BR/admin/asset_maintenances/message.php b/resources/lang/pt-BR/admin/asset_maintenances/message.php
        index 691f777d19..a1814b008e 100644
        --- a/resources/lang/pt-BR/admin/asset_maintenances/message.php
        +++ b/resources/lang/pt-BR/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Não foi criada a Manutenção do Ativo, por favor tente novamente.',
                     'success' => 'Manutenção do ativo criada com sucesso.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Não foi Completada Ainda',
                 'warranty'                     => 'Garantia',
                 'not_warranty'                 => 'Sem Garantia',
        diff --git a/resources/lang/pt-BR/admin/asset_maintenances/table.php b/resources/lang/pt-BR/admin/asset_maintenances/table.php
        index f20a907313..f1d55f3e81 100644
        --- a/resources/lang/pt-BR/admin/asset_maintenances/table.php
        +++ b/resources/lang/pt-BR/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Manutenção de Ativo',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nome do Ativo',
                 'is_warranty'   => 'Garantia',
                 'dl_csv'        => 'Baixar CSV'
             ];
        diff --git a/resources/lang/pt-BR/admin/categories/general.php b/resources/lang/pt-BR/admin/categories/general.php
        index 5b5a81f301..d24b782457 100644
        --- a/resources/lang/pt-BR/admin/categories/general.php
        +++ b/resources/lang/pt-BR/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Sobre as Categorias',
        +    'about_categories'  				=> 'Categorias auxiliam na organização dos seus itens. Alguns exemplos de categorias podem ser: Desktops, Notebooks, Celulares, Tablets, e assim por diante, mas você pode usar as Categorias de melhor forma que você identificar.',
             'asset_categories' 					=> 'Categorias de Ativos',
             'category_name'  					=> 'Nome da Categoria',
             'checkin_email'                     => 'Enviar e-mail para o usuário na entrega.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Editar Categoria',
             'eula_text'							=> 'EULA da Categoria',
             'eula_text_help'					=> 'Este campo lhe permite personalizar seus EULAs para tipos específicos de bens. Se você apenas tem um EULA para todos os seus bens, você pode selecionar a caixa abaixo para usar o padrão primário.',
        +    'name'                              => 'Nome da Categoria',
             'require_acceptance'				=> 'Requer que usuários confirmem a aceitação de ativos nesta categoria.',
             'required_acceptance'				=> 'Este usuário receberá um e-mail com um link para confirmar a aceitação deste item.',
             'required_eula'						=> 'Este usuário receberá um e-mail com uma cópia do EULA',
        diff --git a/resources/lang/pt-BR/admin/companies/general.php b/resources/lang/pt-BR/admin/companies/general.php
        index 4c23cc3491..178072037e 100644
        --- a/resources/lang/pt-BR/admin/companies/general.php
        +++ b/resources/lang/pt-BR/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Sobre Empresas',
        +    'about_companies_text'                  => 'Empresas podem ser utilizadas como um campo para simples identificação, ou pode ser utilizada para limitar a visualização dos ativos, usuários, etc. Elas ficam disponíveis para uso, se estiver configurado nas opções de Administração.',
             'select_company' => 'Selecione a empresa',
         ];
        diff --git a/resources/lang/pt-BR/admin/custom_fields/general.php b/resources/lang/pt-BR/admin/custom_fields/general.php
        index 1ba4149f12..9e6d158c99 100644
        --- a/resources/lang/pt-BR/admin/custom_fields/general.php
        +++ b/resources/lang/pt-BR/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'Sobre conjuntos de campos',
             'about_fieldsets_text'		=> 'Conjuntos de campos permitem criar grupos de campos personalizados que são frequentemente reutilizados para modelos de ativos específicos.',
             'custom_format'             => 'Formato personalizado...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Criptografar o valor deste campo na base de dados',
             'encrypt_field_help'      => 'AVISO: Criptografar um campo torna-o não pesquisável.',
             'encrypted'      	        => 'Criptografado',
             'fieldset'      	        => 'Conjunto de campos',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Nome do conjunto de campos',
             'field_name'              => 'Nome do campo',
             'field_values'            => 'Valores do campo',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Adicione opções selecionáveis, uma por linha. Linhas em branco que não sejam a primeira linha, serão ignoradas.',
             'field_element'           => 'Elemento do formulario',
             'field_element_short'     => 'Elemento',
             'field_format'            => 'Formato',
        diff --git a/resources/lang/pt-BR/admin/custom_fields/message.php b/resources/lang/pt-BR/admin/custom_fields/message.php
        index f6e4910651..fac6a6adff 100644
        --- a/resources/lang/pt-BR/admin/custom_fields/message.php
        +++ b/resources/lang/pt-BR/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'O Conjunto de campos não foi criado, por favor tente novamente.',
        diff --git a/resources/lang/pt-BR/admin/departments/message.php b/resources/lang/pt-BR/admin/departments/message.php
        new file mode 100644
        index 0000000000..d2de2830b0
        --- /dev/null
        +++ b/resources/lang/pt-BR/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Departamento não existe.',
        +    'assoc_users'	 => 'Este departamento esta atualmente associado a pelo menos um usuário e não pode ser deletado. Por favor atualize seus usuários para não fazer mais referência a este departamento e tente novamente. ',
        +    'create' => array(
        +        'error'   => 'O departamento não foi criado, por favor tente novamente.',
        +        'success' => 'Departamento criado com sucesso.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Departamento não foi atualizado, por favor, tente novamente',
        +        'success' => 'Departamento atualizado com sucesso.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Tem certeza que deseja excluir este departamento?',
        +        'error'   => 'Houve um problema de exclusão no departamento. Por favor, tente novamente.',
        +        'success' => 'O departamento foi excluído com sucesso.'
        +    )
        +
        +);
        diff --git a/resources/lang/pt-BR/admin/departments/table.php b/resources/lang/pt-BR/admin/departments/table.php
        new file mode 100644
        index 0000000000..7343657993
        --- /dev/null
        +++ b/resources/lang/pt-BR/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Nome do departamento',
        +    'manager'                   => 'Gerente',
        +    'location'                  => 'Localização',
        +    'create'                    => 'Criar departamento',
        +    'update'                    => 'Atualizar Departamento',
        +    );
        diff --git a/resources/lang/pt-BR/admin/depreciations/general.php b/resources/lang/pt-BR/admin/depreciations/general.php
        index 39cb5a2de1..13a7dfe8be 100644
        --- a/resources/lang/pt-BR/admin/depreciations/general.php
        +++ b/resources/lang/pt-BR/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Sobre as Depreciações de Ativos',
             'about_depreciations'  					=> 'Você pode configurar depreciações para depreciar ativos baseados na depreciação linear.',
             'asset_depreciations'  					=> 'Depreciações de Ativos',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Criar Depreciação',
             'depreciation_name'  					=> 'Nome da Depreciação',
             'number_of_months'  					=> 'Número de Meses',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Atualizar Depreciação',
         
         );
        diff --git a/resources/lang/pt-BR/admin/groups/titles.php b/resources/lang/pt-BR/admin/groups/titles.php
        index 36c817aa7a..704fbb1449 100644
        --- a/resources/lang/pt-BR/admin/groups/titles.php
        +++ b/resources/lang/pt-BR/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Sobre Grupos',
        +    'about_groups'                  => 'Os Grupos são utilizados para generalizar as permissões do usuário.',
             'group_management' 	 	=> 'Gerenciamento do Grupo',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Criar Novo Grupo',
        +    'update' 	 		        => 'Editar Grupo',
             'group_name' 	 		=> 'Nome do Grupo',
             'group_admin' 	 		=> 'Administrador do Grupo',
             'allow' 	 			=> 'Permitir',
        diff --git a/resources/lang/pt-BR/admin/hardware/form.php b/resources/lang/pt-BR/admin/hardware/form.php
        index 715c2cb541..06678086c4 100644
        --- a/resources/lang/pt-BR/admin/hardware/form.php
        +++ b/resources/lang/pt-BR/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Confirma a exclusão de Ativos em Massa',
           'bulk_delete_help'	=> 'Reveja os ativos selecionados para deletar. Depois de deletados, estes ativos podem ser restaurados, mas não estarão associados aos usuários.',
           'bulk_delete_warn'	=> 'Você está prestes a excluir.',
         	'bulk_update'		=> 'Ativos da Atualização em Massa',
        diff --git a/resources/lang/pt-BR/admin/hardware/general.php b/resources/lang/pt-BR/admin/hardware/general.php
        index b21c8e5802..4e0b41797b 100644
        --- a/resources/lang/pt-BR/admin/hardware/general.php
        +++ b/resources/lang/pt-BR/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Sobre os Ativos',
        +    'about_assets_text'            => 'Ativos são itens que são controlados e rastreáveis pelo número de série ou por uma etiqueta de ativo (patrimônio). Eles tendem a ser de valor elevado onde a identificação de itens específicos é relevante.',
         	'archived'  				=> 'Arquivado',
             'asset'  					=> 'Ativo',
             'bulk_checkout'             => 'Atribuir ativo a utilizador',
             'checkin'  					=> 'Retornar Ativo',
        -    'checkout'  				=> 'Registrar Ativo ao Usuário',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clonar Ativo',
             'deployable'  				=> 'Implementável',
             'deleted'  					=> 'Este ativo foi excluído. <a href="/hardware/:asset_id/restore">Clique aqui para restaurá-lo</a>.',
        diff --git a/resources/lang/pt-BR/admin/hardware/message.php b/resources/lang/pt-BR/admin/hardware/message.php
        index 59d0e24399..fcb39a7efe 100644
        --- a/resources/lang/pt-BR/admin/hardware/message.php
        +++ b/resources/lang/pt-BR/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> 'Ativo restaurado com sucesso.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'O arquivo não foi excluído. Tente novamente.',
                 'success' => 'Arquivo excluído com sucesso.',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Tem certeza de que deseja excluir este ativo?',
                 'error'   		=> 'Houve um problema ao excluir o ativo. Tente novamente.',
        +        'nothing_updated'   => 'Nenhum ativo foi selecionado, então nada foi deletado.',
                 'success' 		=> 'O ativo foi excluído com sucesso.'
             ),
         
        @@ -68,7 +75,7 @@ return array(
             'requests' => array(
                 'error'   		=> 'Ativo não foi solicitado, por favor tente novamente',
                 'success' 		=> 'Ativo solicitado com sucesso.',
        -        'canceled'      => 'Requisição cancelado com sucesso'
        +        'canceled'      => 'Requisição cancelada com sucesso'
             )
         
         );
        diff --git a/resources/lang/pt-BR/admin/licenses/general.php b/resources/lang/pt-BR/admin/licenses/general.php
        index a1c3ce351d..7487526930 100644
        --- a/resources/lang/pt-BR/admin/licenses/general.php
        +++ b/resources/lang/pt-BR/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Sobre Licenças',
        +    'about_licenses'                  => 'Licenças são utilizadas para controlar o uso dos softwares. Ela possuem uma quantidade específica que podem ser alocadas para os usuários',
             'checkin'  					=> 'Retorna Licença Compartilhada',
             'checkout_history'  		=> 'Histórico de Registros',
             'checkout'  				=> 'Registra Licença Compartilhada',
        diff --git a/resources/lang/pt-BR/admin/licenses/message.php b/resources/lang/pt-BR/admin/licenses/message.php
        index bbb4e3d14c..1d93ab2100 100644
        --- a/resources/lang/pt-BR/admin/licenses/message.php
        +++ b/resources/lang/pt-BR/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'O(s) arquivo(s) não foi/foram carregado(s). Tente novamente.',
                 'success' => 'Arquivo(s) carregado(s) com sucesso.',
                 'nofiles' => 'Você não selecionou arquivos para carregar, ou o arquivo que você esta tentando carregar é muito grande',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Um ou mais arquivos excedem o tamanho ou são do tipo de arquivo não permitido. Os tipos permitidos são png, gif, jpg, doc, docx, pdf, txt, zip, rar, and rtf.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/pt-BR/admin/locations/table.php b/resources/lang/pt-BR/admin/locations/table.php
        index fcd1932e89..97ce4e1bfe 100644
        --- a/resources/lang/pt-BR/admin/locations/table.php
        +++ b/resources/lang/pt-BR/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'Sobre as Localizações',
        +    'about_locations'           => 'As localizações são usadas para seguir informações de utilizadores, assets, e outros itens',
             'assets_rtd'                => 'Ativos', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Ativos Atribuídos',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locais',
             'parent'                    => 'Principal',
             'currency'                  => 'Moeda local',
        +    'ldap_ou'                   => 'Pesquisa LDAP UO',
             );
        diff --git a/resources/lang/pt-BR/admin/manufacturers/table.php b/resources/lang/pt-BR/admin/manufacturers/table.php
        index 496aad8626..6e357a5719 100644
        --- a/resources/lang/pt-BR/admin/manufacturers/table.php
        +++ b/resources/lang/pt-BR/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Sobre os fabricantes',
        +    'about_manufacturers_text'  => 'Fabricantes são as empresas que criam seus ativos. Você pode armazenar informação de contato de suporte sobre eles aqui, que será exibida em suas páginas de detalhe de ativos.',
             'asset_manufacturers'	=> 'Fabricantes de Ativos',
             'create'				=> 'Criar Fabricante',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nome do Fabricante',
        +    'name'      			=> 'Nome',
        +    'support_email'   		=> 'E-mail de suporte',
        +    'support_phone'   		=> 'Telefone de suporte',
        +    'support_url'   		=> 'Url de suporte',
             'update'				=> 'Atualizar Fabricante',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/pt-BR/admin/models/general.php b/resources/lang/pt-BR/admin/models/general.php
        index fb392e4a6f..47728c5fcb 100644
        --- a/resources/lang/pt-BR/admin/models/general.php
        +++ b/resources/lang/pt-BR/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Sobre os Modelos de Ativos',
        +    'about_models_text'           => 'Os Modelos dos ativos são uma maneira para agrupar ativos idênticos. "MBP 2013", "iPhone 6s", etc.',
             'deleted'  					        => 'Este modelo foi excluído. <a href="/hardware/models/:model_id/restore">Clique aqui para o restaurar</a>.',
             'restore'                   => 'Restaurar Modelo',
             'requestable'               => 'Usuários podem solicitar este modelo',
        diff --git a/resources/lang/pt-BR/admin/models/message.php b/resources/lang/pt-BR/admin/models/message.php
        index 0712a13d0b..37ab5b1902 100644
        --- a/resources/lang/pt-BR/admin/models/message.php
        +++ b/resources/lang/pt-BR/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modelo restaurado com sucesso.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'Nenhum campo foi alterado, então nada foi atualizado.',
        +        'success' 		=> 'Modelos atualizados.'
        +    ),
        +
         );
        diff --git a/resources/lang/pt-BR/admin/settings/general.php b/resources/lang/pt-BR/admin/settings/general.php
        index d366399a2e..579a284aec 100644
        --- a/resources/lang/pt-BR/admin/settings/general.php
        +++ b/resources/lang/pt-BR/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Limite de Expiração dos Alertas (em dias)',
         	'alert_inv_threshold'		=> 'Limite de Alerta de Inventário',
         	'asset_ids'					=> 'ID do ativo',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'Se você precisa verificar fisicamente seus ativos com frequência, insira um intervalo em meses.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'Com quantos dias de antecedência deseja ser avisado sobre a verificação de seus ativos?',
         	'auto_increment_assets'		=> 'Gerar ID de ativo crescente',
         	'auto_increment_prefix'		=> 'Prefixo (opcional)',
         	'auto_incrementing_help'    => 'Permitir auto insercao dessa ID de ativo antes de configurar isso',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'Email',
             'load_remote_text'          => 'Scripts Remotos',
             'load_remote_help_text'		=> 'Esta instalação do Snipe-IT pode carregar qualquer scripts do mundo.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restringir utilizadores (incluindo admins) associados a empresas ao ativos da empresa.',
             'full_multiple_companies_support_text' => 'Suporte multi-empresa completo',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versão do PHP',
             'php_gd_info'               => 'Você deve instalar o php-gd para exibir códigos QR, veja as <a href="http://www.php.net/manual/en/image.installation.php">instruções de instalação</a>.',
             'php_gd_warning'            => 'O plugin PHP Image Processing and GD NÃO está instalado.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Valor mínimo permitido é 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Habilite os Códigos QR primeiro para definir isto',
             'qr_text'                   => 'Texto do Código QR',
             'setting'                   => 'Configuração',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Estas configurações permitem personalizar alguns aspectos da instalação.',
             'labels_per_page'           => 'Etiquetas por página',
             'label_dimensions'          => 'Dimensões das etiquetas (polegadas)',
        +    'next_auto_tag_base'        => 'Próximo auto incremento',
             'page_padding'             => 'Margens da página (polegadas)',
             'purge'                    => 'Limpar Registros Excluídos',
             'labels_display_bgutter'    => 'Margem inferior da etiqueta',
        @@ -104,25 +117,27 @@ return array(
             'width_w'        => 'largura',
             'height_h'        => 'altura',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Autenticação em dois passos',
             'two_factor_secret'        => 'Código de autenticação em dois passos',
             'two_factor_enrollment'        => 'Ativação de autenticação em dois passos',
             'two_factor_enabled_text'        => 'Ativar autenticação em dois passos',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'two_factor_reset'        => 'Redefinir senha autenticação de pois passos',
        +    'two_factor_reset_help'        => 'Isto irá forçar o usuário a registar o seu dispositivo com Google Authenticator novamente. Isso pode ser útil se seu dispositivo registrado for perdido ou roubado. ',
        +    'two_factor_reset_success'          => 'Dispositivo de autenticação de dois passos foi redefinido com sucesso',
        +    'two_factor_reset_error'          => 'Reset do dispositivo de autenticação de dois passos falhou',
        +    'two_factor_enabled_warning'        => 'Ao ativar a autenticação de dois passos se não estiver já ativado, você será forçado a autenticar com o Google Auth com um dispositivo registrado.',
        +    'two_factor_enabled_help'        => 'Isso irá ativar a autenticação de dois passos usando Google Authenticator.',
        +    'two_factor_optional'        => 'Seletivo (os usuários podem ativar ou desativar se permitido)',
        +    'two_factor_required'        => 'Obrigatório para todos os usuários',
        +    'two_factor_disabled'        => 'Desativado',
        +    'two_factor_enter_code'	=> 'Digite o código de autenticação de pois passos',
        +    'two_factor_config_complete'	=> 'Enviar código',
        +    'two_factor_enabled_edit_not_allowed' => 'O Administrador não permite editar esta opção.',
        +    'two_factor_enrollment_text'	=> "A autenticação de dois passos é obrigatória, mas se o teu dispositivo ainda não foi registrado, abra o Google Authenticator e escaneie o QR Code para registrar o teu dispositivo. Uma vez registrado, digite o código abaixo",
        +    'require_accept_signature'      => 'Requer assinatura',
        +    'require_accept_signature_help_text'      => 'Habilitar este recurso vai exigir que os usuários assinem pessoalmente o aceite do ativo.',
             'left'        => 'esquerda',
             'right'        => 'direita',
             'top'        => 'topo',
        diff --git a/resources/lang/pt-BR/admin/suppliers/table.php b/resources/lang/pt-BR/admin/suppliers/table.php
        index 11c91cc123..91c013e8bb 100644
        --- a/resources/lang/pt-BR/admin/suppliers/table.php
        +++ b/resources/lang/pt-BR/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Sobre os fornecedores',
        +    'about_suppliers_text'  => 'Fornecedores são usados para seguir a origem de itens',
             'address'               => 'Endereço do Fornecedor',
             'assets'                => 'Bens',
             'city'                  => 'Cidade',
        diff --git a/resources/lang/pt-BR/admin/users/general.php b/resources/lang/pt-BR/admin/users/general.php
        index 802c08e74e..40cc104ce1 100644
        --- a/resources/lang/pt-BR/admin/users/general.php
        +++ b/resources/lang/pt-BR/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Bens atribuidos a :name',
        +    'bulk_update_warn'	=> 'Você está prestes a editar as propriedades de: user_count users. Por favor, note que você não pode alterar seus próprios atributos de usuário usando este formulário e deve fazer edições de seu próprio usuário individualmente.',
        +    'bulk_update_help'	=> 'Este formulário lhe permite atualizar múltiplos ativos de uma vez. Apenas preencha os campos que você precisa alterar. Qualquer campo deixado em branco permanecerá inalterado.',
             'current_assets'    => 'Artivos atribuídos atualmente a este usuário',
             'clone'             => 'Clonar Usuário',
             'contact_user'      => 'Contato :name',
             'edit'              => 'Editar Usuário',
             'filetype_info'     => 'Tipo de arquivos permitidos são png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, e rar.',
             'history_user'      => 'Histórico para :name',
        +	'info'				=> 'Informações',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Último Login',
             'ldap_config_text'  => 'As configurações do LDAP podem ser encontradas em \'Administrador > Definições\'. A localização (opcional) selecionada será definida para todos os usuários importados.',
             'software_user'     => 'Check-out de software para :name',
             'view_user'         => 'Ver Usuário :name',
             'usercsv'           => 'Arquivo CSV',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'As configurações de admin atuais permitem a aplicação seletiva de autenticação de dois passos.  ',
        +    'two_factor_enrolled' => 'Dispositivo 2FA Registrado ',
        +    'two_factor_active'   => 'A2P Ativo ',
             );
        diff --git a/resources/lang/pt-BR/admin/users/message.php b/resources/lang/pt-BR/admin/users/message.php
        index 179817c967..a8b135771e 100644
        --- a/resources/lang/pt-BR/admin/users/message.php
        +++ b/resources/lang/pt-BR/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Este aceitou este ativo com sucesso.',
             'declined'                  => 'Você recusou com sucesso esse ativo.',
        +    'bulk_manager_warn'	        => 'Os usuários foram atualizados com êxito, no entanto seu Gerenciador de entrada não foi salvo porque o gerente selecionado estava também na lista de usuários a ser editado e usuários podem não ser seu próprio gerente. Por favor, selecione os usuários novamente, excluindo o gerente.',
             'user_exists'               => 'O usuário já existe!',
             'user_not_found'            => 'O usuário [:id] não existe.',
             'user_login_required'       => 'O campo de login é requerido',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'O usuário foi criado com sucesso.',
                 'update'    => 'O usuário foi atualizado com sucesso.',
        +        'update_bulk'    => 'Usuários atualizados com sucesso!',
                 'delete'    => 'O usuário foi excluído com sucesso.',
                 'ban'       => 'O usuário foi banido com sucesso.',
                 'unban'     => 'O usuário foi desbanido com sucesso.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Houve um problema ao criar o usuário. Tente novamente.',
                 'update' => 'Houve um problema ao atualizar o usuário. Tente novamente.',
                 'delete' => 'Houve um problema ao excluir o usuário. Tente novamente.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Houve um problema ao remover a suspensão do usuário. Tente novamente.',
                 'import'    => 'Houve um problema ao importar usuários. Tente novamente.',
                 'asset_already_accepted' => 'Este ativo já foi aceito.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Não foi possível se ligar ao servidor LDAP. Por favor verifique as configurações do servidor LDAP no arquivo de configurações.<br>Erro do Servidor LDAP: ',
                 'ldap_could_not_search' => 'Não foi possível procurar o servidor LDAP. Por favor verifique as configurações do servidor LDAP no arquivo de configurações.<br>Erro do Servidor LDAP:',
                 'ldap_could_not_get_entries' => 'Não foi possível obter informações do servidor LDAP. Por favor verifique as configurações do servidor LDAP no arquivo de configurações.<br>Erro do Servidor LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/pt-BR/admin/users/table.php b/resources/lang/pt-BR/admin/users/table.php
        index d7585d199e..528d268df9 100644
        --- a/resources/lang/pt-BR/admin/users/table.php
        +++ b/resources/lang/pt-BR/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Ativo',
             'allow'  				=> 'Permitir',
             'checkedout'  			=> 'Ativos',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Local',
             'lock_passwords'		=> 'Detalhes de login não podem ser alterados nesta instalação.',
             'manager' 				=> 'Gerenciador',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nome',
             'notes'                 => 'Notas',
             'password_confirm' 		=> 'Confirmar Senha',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Mostrar Usuários Atuais',
             'show_deleted'          => 'Mostrar Usuários Excluídos',
             'title' 				=> 'Título',
        +	'to_restore_them'		=> 'para restaurar ele(a).',
             'updateuser' 			=> 'Atualizar Usuário',
             'username' 				=> 'Usuário',
        +	'user_deleted_text' 	=> 'Este usuário foi marcado como deletado.',
             'username_note' 		=> '(Istó é usado somente para conexão do Active Directory, não para login.)',
             'cloneuser'             => 'Clonar Usuário',
             'viewusers' 			=> 'Ver Usuários',
        diff --git a/resources/lang/pt-BR/auth/message.php b/resources/lang/pt-BR/auth/message.php
        index 3094cb6600..ff3f7d2d49 100644
        --- a/resources/lang/pt-BR/auth/message.php
        +++ b/resources/lang/pt-BR/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Esta conta de usuário não está ativada.',
             'account_suspended'      => 'Esta conta de usuário está suspensa.',
             'account_banned'         => 'Esta conta de usuário está banida.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Muitas tentativas com falha de login. Por favor, tente novamente no próximo(s) :minutes minuto(s).',
         
             'signin' => array(
                 'error'   => 'Houve um problema ao tentar-lhe entrar, tente novamente.',
        diff --git a/resources/lang/pt-BR/button.php b/resources/lang/pt-BR/button.php
        index 48aa5e125c..75f65a13fc 100644
        --- a/resources/lang/pt-BR/button.php
        +++ b/resources/lang/pt-BR/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Ações',
             'add'    	                => 'Adicionar Novo',
             'cancel'                    => 'Cancelar',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Solicitação',
             'submit'  	                => 'Enviar',
             'upload'                    => 'Carregar',
        -
        +	'select_file'				=> 'Selecionar arquivo...',
         );
        diff --git a/resources/lang/pt-BR/general.php b/resources/lang/pt-BR/general.php
        index dae08fa0ed..fa5242a6a7 100644
        --- a/resources/lang/pt-BR/general.php
        +++ b/resources/lang/pt-BR/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Relatório de Ativos',
             'asset_tag'				=> 'Marcação do Ativo',
             'assets_available'		=> 'ativos disponíveis',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Ativos',
             'avatar_delete'         => 'Excluir Avatar',
             'avatar_upload'         => 'Carregar Avatar',
             'back'      			=> 'Voltar',
             'bad_data'      		=> 'Nada encontrado. Informações correta?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Check-out em massa',
             'cancel'  				=> 'Cancelar',
             'categories'			=> 'Categorias',
             'category'				=> 'Categoria',
        +    'change' 		        => 'Entrada/Saída',
             'changeemail'  			=> 'Alterar Endereço de E-mail',
             'changepassword'  		=> 'Alterar Senha',
             'checkin'  				=> 'Check-in',
             'checkin_from'  		=> 'Verificando',
             'checkout'  			=> 'Check-out',
             'city'  				=> 'Cidade',
        +	'click_here'			=> 'Clique aqui',
             'companies'			=> 'Empresas',
             'company'				=> 'Empresas',
             'component'			=> 'Componente',
             'components'			=> 'Componentes',
        +	'complete'				=> 'Completo',
             'consumable'			=> 'Consumíveis',
             'consumables'			=> 'Consumíveis',
             'country'  				=> 'País',
        @@ -44,16 +51,21 @@
             'created'               => 'Item criado',
             'created_asset'			=> 'Ativo criado',
             'created_at' 			=> 'Criado em',
        +    'updated_at' 			=> 'Atualizado por',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Atuais',
             'custom_report'         => 'Relatório de Ativos Personalizado',
             'dashboard'				=> 'Painel de Controle',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Data',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Atenção!',
        +    'debug_warning_text'         => 'Esta aplicação está em execução no modo de produção com a depuração ativada. Isso pode expor dados sensíveis se seu aplicativo é acessível para o mundo exterior. Desative o modo de depuração mudando o valor de <code>APP_DEBUG</code> no seu arquivo<code>.env</code> para <code>false</code>.',
             'delete'  				=> 'Deletar',
             'deleted'  				=> 'Excluído',
             'delete_seats'  		=> 'Utilizadores apagados',
        +    'departments'           => 'Departamentos',
        +    'department'           => 'Departamento',
             'deployed'				=> 'Implantado',
             'depreciation_report'	=> 'Relatório de Depreciações',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Você não tem permissão!',
             'language'				=> 'Idioma',
             'last'					=> 'Última',
        +    'last_login'            => 'Último Login',
             'last_name'             => 'Último Nome',
             'license'				=> 'Licença',
             'license_report'        => 'Relatório da Licença',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Mais Informações',
             'name'					=> 'Nome',
             'next'					=> 'Próxima',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'novo!',
             'no_depreciation'		=> 'Sem Depreciação',
             'no_results'			=> 'Sem Resultados.',
             'no'  					=> 'Não',
             'notes'  				=> 'Notas',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Número do Pedido',
             'page_menu'				=> 'Mostrando _MENU_ itens',
             'pagination_info'		=> 'Mostrando _START_ a _END_ de _TOTAL_ itens',
             'pending'				=> 'Pendente',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Anterior',
             'processing'			=> 'Processando',
             'profile'				=> 'Seu perfil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Custo de Aquisição',
        +    'purchase_date'         => 'Data da compra',
             'qty'		            => 'QTD',
             'quantity'		        => 'Quantidade',
             'ready_to_deploy'		=> 'Pronto para Implantar',
        @@ -138,31 +153,35 @@
             'select'				=> 'Selecionar',
             'search'				=> 'Buscar',
             'select_category'       => 'Selecione uma categoria',
        +    'select_department'       => 'Selecione um Departamento',
             'select_depreciation'	=> 'Selecionar um Tipo de Depreciação',
             'select_location'		=> 'Selecionar um Local',
             'select_manufacturer'	=> 'Selecionar um Fabricante',
             'select_model'			=> 'Selecionar um Modelo',
             'select_supplier'		=> 'Selecionar um Fornecedor',
             'select_user'			=> 'Selecionar um Usuário',
        -    'select_date'			=> 'Selecionar Data',
        +    'select_date'			=> 'Selecione data (AAAA-MM-DD)',
             'select_statuslabel'	=> 'Selecionar Estado',
             'select_company'    	=> 'Selecione a empresa',
             'select_asset'    		=> 'Selecionar Ativo',
             'settings'				=> 'Configurações',
             'sign_in'				=> 'Entrar',
        -    'signature'             => 'Signature',
        +    'signature'             => 'Assinatura',
             'some_features_disabled' => 'MODO DE DEMONSTRAÇÃO: Algumas funcionalidades estão desativadas nesta instalação.',
             'site_name'				=> 'Nome do Site',
             'state'  				=> 'Estado',
             'status_labels'			=> 'Rótulos de Status',
             'status'    			=> 'Status',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Fornecedor',
             'suppliers'  			=> 'Fornecedores',
        -    'submit'				=> 'Submeter',
        +    'sure_to_delete'    => 'Você tem certeza que deseja apagar',
        +    'submit'				=> 'Confirmar',
        +    'target'                => 'Meta',
        +    'time_and_date_display' => 'Exibição de Hora e Data',
             'total_assets'			=> 'ativos no total',
             'total_licenses'		=> 'licenças no total',
        -    'total_accessories'		=> 'acessórios totais',
        -    'total_consumables'		=> 'consumíveis totais',
        +    'total_accessories'		=> 'total de acessórios',
        +    'total_consumables'		=> 'total de consumíveis',
             'type'  				=> 'Tipo',
             'undeployable'			=> 'Não implantável',
             'unknown_admin'			=> 'Administrador Desconhecido',
        diff --git a/resources/lang/pt-BR/mail.php b/resources/lang/pt-BR/mail.php
        index 0846246f78..7450f860b8 100644
        --- a/resources/lang/pt-BR/mail.php
        +++ b/resources/lang/pt-BR/mail.php
        @@ -9,66 +9,63 @@ return array(
             'asset' => 'Ativo:',
             'asset_name' => 'Nome do Ativo:',
             'asset_requested' => 'Requisição de Ativo',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'asset_tag' => 'Etiqueta de Ativo:',
        +    'assets_warrantee_expiring' => '{1} ativo com garantia que expira nos próximos 60 dias. |[2,inf] ativos com garantia que expiram nos próximos 60 dias.',
        +    'assigned_to' => 'Atribuído a',
        +    'best_regards' => 'Atenciosamente,',
        +    'canceled' => 'Cancelado:',
        +    'checkin_date' => 'Data de devolução:',
        +    'checkout_date' => 'Data de atribuição:',
        +    'click_to_confirm' => 'Por favor clique no link a seguir para confirmar sua conta :web:',
        +    'click_on_the_link_accessory' => 'Por favor clique no link na parte inferior para confirmar que recebeu o acessório.',
        +    'click_on_the_link_asset' => 'Por favor clique no link na parte inferior para confirmar que recebeu o ativo.',
        +    'Confirm_Asset_Checkin' => 'Confirme a devolução do ativo.',
        +    'Confirm_Accessory_Checkin' => 'Confirme a devolução do acessório.',
        +    'Confirm_accessory_delivery' => 'Confirme a entrega do acessório.',
        +    'Confirm_asset_delivery' => 'Confirme a entrega do ativo.',
        +    'Confirm_consumable_delivery' => 'Confirme a entrega de consumíveis.',
        +    'current_QTY' => 'Qtde. atual',
        +    'Days' => 'Dias',
        +    'days' => 'Dias',
        +    'expecting_checkin_date' => 'Data prevista de devolução:',
        +    'expires' => 'Expira',
        +    'Expiring_Assets_Report' => 'Relatório de ativos expirando.',
        +    'Expiring_Licenses_Report' => 'Relatório de Licenças a expirar.',
        +    'hello' => 'Olá',
        +    'hi' => 'Oi',
        +    'i_have_read' => 'Li e concordo com os termos de uso e recebi este item.',
             'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'items_below_minimum' => '{1} item está abaixo do estoque mínimo ou irá em breve estar baixo. | [2, Inf] itens que estão abaixo do estoque mínimo ou estarão em breve.',
        +    'Item_Request_Canceled' => 'Requisição de item cancelado',
        +    'Item_Requested' => 'Item requisitado',
        +    'licenses_expiring' => '{1] Licença expira nos próximos 60 dias. | [2, Inf] licenças expiram nos próximos 60 dias.',
        +    'link_to_update_password' => 'Por favor clique no link abaixo para atualizar a sua senha do :web:',
        +    'login_first_admin' => 'Faça login na sua instalação do Snipe-IT usando os dados abaixo:',
             'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'Low_Inventory_Report' => 'Relatório de baixas de inventario',
        +    'min_QTY' => 'Qtde. Min',
        +    'name' => 'Nome',
        +    'new_item_checked' => 'Um novo item foi feito Check-out em seu nome, detalhes abaixo.',
        +    'password' => 'Senha:',
        +    'password_reset' => 'Redefinir Senha',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Por favor, leia os termos de uso abaixo.',
        +    'read_the_terms_and_click' => 'Por favor, leia os termos de uso abaixo e clique no link na parte inferior para confirmar que leu e que concorda com os termos de uso e ter recebido o ativo.',
        +    'requested' => 'Solicitado:',
        +    'reset_link' => 'Seu Link de redefinição da senha',
        +    'reset_password' => 'Clique aqui para redefinir sua senha:',
        +    'serial' => 'Número de série:',
        +    'supplier' => 'Fornecedor',
        +    'tag' => 'Etiqueta',
        +    'test_email' => 'Email de teste do Snipe-IT',
        +    'test_mail_text' => 'Isto é um e-mail de teste do Snipe-IT Asset Management System. Se você recebeu essa mensagem, quer dizer que o e-mail está funcionando :)',
        +    'the_following_item' => 'O Item a seguir foi devolvido: ',
        +    'There_are' => 'Há {1} | [2,inf] Existem',
        +    'to_reset' => 'Para fazer reset da senha do :web, preencha este formulário:',
        +    'type' => 'Tipo',
        +    'user' => 'Usuário:',
        +    'username' => 'Usuário:',
        +    'welcome' => 'Bem-vindo(a), :name',
        +    'welcome_to' => 'Bem-vindo ao :web!',
        +    'your_credentials' => 'Suas credenciais do Snipe-IT',
         );
        diff --git a/resources/lang/pt-BR/validation.php b/resources/lang/pt-BR/validation.php
        index f16ae79459..ab8755865e 100644
        --- a/resources/lang/pt-BR/validation.php
        +++ b/resources/lang/pt-BR/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "O :attribute dever ser aceito.",
        -    "active_url"       => "O :attribute não é uma URL válida.",
        -    "after"            => "O :attribute deve ser uma data após :date.",
        -    "alpha"            => "O :attribute pode apenas conter letras.",
        -    "alpha_dash"       => "O :attribute pode apenas conter letras, números, e traços.",
        -    "alpha_num"        => "O :attribute pode apenas conter letras e números.",
        -    "before"           => "O :attribute deve ser uma data antes de :date.",
        -    "between"          => array(
        -        "numeric" => "O :attribute deve estar entre :min - :max.",
        -        "file"    => "O :attribute deve estar entre :min - :max kilobytes.",
        -        "string"  => "O :attribute deve estar entre :min - :max caracteres.",
        -    ),
        -    "confirmed"        => "A confirmação do :attribute não corresponde.",
        -    "date"             => "O :attribute não é uma data válida.",
        -    "date_format"      => "O :attribute não corresponde ao formato :format.",
        -    "different"        => "O :attribute e :other devem ser diferentes.",
        -    "digits"           => "O :attribute deve ter :digits dígitos.",
        -    "digits_between"   => "O :attribute deve ter entre :min e :max dígitos.",
        -    "email"            => "O formato de :attribute é inválido.",
        -    "exists"           => "O :attribute selecionado é inválido.",
        -    "email_array"      => "Um ou mais endereços de email são invalidos.",
        -    "image"            => "O :attribute deve ser uma imagem.",
        -    "in"               => "O :attribute selecionado é inválido.",
        -    "integer"          => "O :attribute deve ser um número inteiro.",
        -    "ip"               => "O :attribute deve ser um endereço de IP válido.",
        -    "max"              => array(
        -        "numeric" => "O :attribute não pode ser maior do que :max.",
        -        "file"    => "O :attribute não pode ser maior do que :max kilobytes.",
        -        "string"  => "O :attribute não pode ser maior do que :max caracteres.",
        -    ),
        -    "mimes"            => "O :attribute deve ser um arquivo do tipo: :values.",
        -    "min"              => array(
        -        "numeric" => "O :attribute deve ter pelo menos :min.",
        -        "file"    => "O :attribute deve ter pelo menos :min kilobytes.",
        -        "string"  => "O :attribute deve ter pelo menos :min caracteres.",
        -    ),
        -    "not_in"           => "O :attribute selecionado é inválido.",
        -    "numeric"          => "O :attribute deve ser um número.",
        -    "regex"            => "O formato de :attribute é inválido.",
        -    "required"         => "O campo de :attribute é requerido.",
        -    "required_if"      => "O campo de :attribute é requerido quando :other é :value.",
        -    "required_with"    => "O campo de :attribute é requerido quando :values está presente.",
        -    "required_without" => "O campo de :attribute é requerido quando :values não está presente.",
        -    "same"             => "O :attribute e :other devem corresponderem.",
        -    "size"             => array(
        -        "numeric" => "O :attribute deve ser :size.",
        -        "file"    => "O :attribute deve ter :size kilobytes.",
        -        "string"  => "O :attribute deve ter :size caracteres.",
        -    ),
        -    "unique"           => "O :attribute já foi tomado.",
        -    "url"              => "O formato de :attribute é inválido.",
        -    "statuslabel_type" => "Você deve selecionar um tipo de rótulo de status válido",
        -    "unique_undeleted" => "O :attribute deve ser exclusivo.",
        +    'accepted'             => 'O :attribute dever ser aceito.',
        +    'active_url'           => 'O :attribute não é uma URL válida.',
        +    'after'                => 'O :attribute deve ser uma data após :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'O :attribute pode apenas conter letras.',
        +    'alpha_dash'           => 'O :attribute pode apenas conter letras, números, e traços.',
        +    'alpha_num'            => 'O :attribute pode apenas conter letras e números.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'O :attribute deve ser uma data antes de :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'O :attribute deve estar entre :min - :max.',
        +        'file'    => 'O :attribute deve estar entre :min - :max kilobytes.',
        +        'string'  => 'O :attribute deve estar entre :min - :max caracteres.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'O :atributo têm que ser verdadeiro ou falso.',
        +    'confirmed'            => 'A confirmação do :attribute não corresponde.',
        +    'date'                 => 'O :attribute não é uma data válida.',
        +    'date_format'          => 'O :attribute não corresponde ao formato :format.',
        +    'different'            => 'O :attribute e :other devem ser diferentes.',
        +    'digits'               => 'O :attribute deve ter :digits dígitos.',
        +    'digits_between'       => 'O :attribute deve ter entre :min e :max dígitos.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'O formato de :attribute é inválido.',
        +    'exists'               => 'O :attribute selecionado é inválido.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'O :attribute deve ser uma imagem.',
        +    'in'                   => 'O :attribute selecionado é inválido.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'O :attribute deve ser um número inteiro.',
        +    'ip'                   => 'O :attribute deve ser um endereço de IP válido.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'O :attribute não pode ser maior do que :max.',
        +        'file'    => 'O :attribute não pode ser maior do que :max kilobytes.',
        +        'string'  => 'O :attribute não pode ser maior do que :max caracteres.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'O :attribute deve ser um arquivo do tipo: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'O :attribute deve ter pelo menos :min.',
        +        'file'    => 'O :attribute deve ter pelo menos :min kilobytes.',
        +        'string'  => 'O :attribute deve ter pelo menos :min caracteres.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'O :attribute selecionado é inválido.',
        +    'numeric'              => 'O :attribute deve ser um número.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'O formato de :attribute é inválido.',
        +    'required'             => 'O campo de :attribute é requerido.',
        +    'required_if'          => 'O campo de :attribute é requerido quando :other é :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'O campo de :attribute é requerido quando :values está presente.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'O campo de :attribute é requerido quando :values não está presente.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'O :attribute e :other devem corresponderem.',
        +    'size'                 => [
        +        'numeric' => 'O :attribute deve ser :size.',
        +        'file'    => 'O :attribute deve ter :size kilobytes.',
        +        'string'  => 'O :attribute deve ter :size caracteres.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'O :attribute já foi tomado.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'O formato de :attribute é inválido.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "O campo :attribute contém um caractere que não é permitido.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/pt-PT/admin/asset_maintenances/message.php b/resources/lang/pt-PT/admin/asset_maintenances/message.php
        index ce63d31a06..46a918c552 100644
        --- a/resources/lang/pt-PT/admin/asset_maintenances/message.php
        +++ b/resources/lang/pt-PT/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Não foi possível criar a manutenção do artigo. Por favor, tente novamente.',
                     'success' => 'Manutenção do artigo criada com sucesso.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Incompleto',
                 'warranty'                     => 'Garantia',
                 'not_warranty'                 => 'Sem Garantia',
        diff --git a/resources/lang/pt-PT/admin/asset_maintenances/table.php b/resources/lang/pt-PT/admin/asset_maintenances/table.php
        index df71890b56..2bae10b5a2 100644
        --- a/resources/lang/pt-PT/admin/asset_maintenances/table.php
        +++ b/resources/lang/pt-PT/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Manutenção de Artigo',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Nome do Artigo',
                 'is_warranty'   => 'Garantia',
                 'dl_csv'        => 'Descarregar CSV'
             ];
        diff --git a/resources/lang/pt-PT/admin/categories/general.php b/resources/lang/pt-PT/admin/categories/general.php
        index 7590d57ac3..789b9d7a14 100644
        --- a/resources/lang/pt-PT/admin/categories/general.php
        +++ b/resources/lang/pt-PT/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Sobre as Categorias',
        +    'about_categories'  				=> 'As categorias ajudam na organização dos itens. Alguns exemplos de categorias podem ser &quot;Computadores&quot;, &quot;Portáteis&quot;, &quot;Telemóveis&quot;, &quot;Tablets&quot;, e semelhantes. De qualquer maneira podes usar as categorias da forma que faça mais sentido para ti.',
             'asset_categories' 					=> 'Categorias de Equipamentos',
             'category_name'  					=> 'Nome da Categoria',
             'checkin_email'                     => 'Na devolução, enviar email ao utilizador.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Editar Categoria',
             'eula_text'							=> 'EULA da Categoria',
             'eula_text_help'					=> 'Este atributo permite-lhe personalizar os seus EULAs para tipos específicos de artigos. Se apenas tem um para todos os seus artigos, pode selecionar a caixa abaixo, para usar o EULA padrão.',
        +    'name'                              => 'Nome da Categoria',
             'require_acceptance'				=> 'Solicitar aos utilizadores que confirmem a aceitação de artigos nesta categoria.',
             'required_acceptance'				=> 'Será enviado um email ao utilizador com um link para confirmar a aceitação deste item.',
             'required_eula'						=> 'Será enviada uma cópia dos EULA a este utilizador',
        diff --git a/resources/lang/pt-PT/admin/companies/general.php b/resources/lang/pt-PT/admin/companies/general.php
        index 4c23cc3491..a653b7def6 100644
        --- a/resources/lang/pt-PT/admin/companies/general.php
        +++ b/resources/lang/pt-PT/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Sobre as empresas',
        +    'about_companies_text'                  => 'Empresas podem ser usadas como um simples identificador, ou podem ser usadas para limitar a visibilidade dos artigos, usuários, etc se o suporte multi-empresa completo é activado nas configurações do Admin.',
             'select_company' => 'Selecione a empresa',
         ];
        diff --git a/resources/lang/pt-PT/admin/custom_fields/general.php b/resources/lang/pt-PT/admin/custom_fields/general.php
        index d7f7b631f7..2347259370 100644
        --- a/resources/lang/pt-PT/admin/custom_fields/general.php
        +++ b/resources/lang/pt-PT/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'Sobre conjuntos de campos',
             'about_fieldsets_text'		=> 'Conjuntos de campos permitem criar grupos de campos personalizados que são frequentemente reutilizados para modelos de artigos especificos.',
             'custom_format'             => 'Formato personalizado...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Encriptar valor deste campo na base de dados',
             'encrypt_field_help'      => 'AVISO: Criptografar um campo torna-o não pesquisável.',
             'encrypted'      	        => 'Encriptado',
             'fieldset'      	        => 'Conjunto de campos',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Nome do conjunto de campos',
             'field_name'              => 'Nome do campo',
             'field_values'            => 'Valores do campo',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Adicione opções seleccionáveis, uma por linha. Linhas vazias que não a primeira serão ignoradas.',
             'field_element'           => 'Elemento do formulario',
             'field_element_short'     => 'Elemento',
             'field_format'            => 'Formato',
        diff --git a/resources/lang/pt-PT/admin/custom_fields/message.php b/resources/lang/pt-PT/admin/custom_fields/message.php
        index b5ab5102bf..92bc0cd5d3 100644
        --- a/resources/lang/pt-PT/admin/custom_fields/message.php
        +++ b/resources/lang/pt-PT/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'O Conjunto de campos não foi criado, por favor tente novamente.',
        diff --git a/resources/lang/pt-PT/admin/departments/message.php b/resources/lang/pt-PT/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/pt-PT/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/pt-PT/admin/departments/table.php b/resources/lang/pt-PT/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/pt-PT/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/pt-PT/admin/depreciations/general.php b/resources/lang/pt-PT/admin/depreciations/general.php
        index 4da53dee68..183c81c492 100644
        --- a/resources/lang/pt-PT/admin/depreciations/general.php
        +++ b/resources/lang/pt-PT/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Acerca de Depreciações de Equipamentos',
             'about_depreciations'  					=> 'Podes configurar as depreciações dos equipamentos baseadas numa depreciação constante ao longo do tempo.',
             'asset_depreciations'  					=> 'Depreciações dos Equipamentos',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Criar Depreciação',
             'depreciation_name'  					=> 'Nome da depreciação',
             'number_of_months'  					=> 'Número de mêses',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Actualizar depreciação',
         
         );
        diff --git a/resources/lang/pt-PT/admin/groups/titles.php b/resources/lang/pt-PT/admin/groups/titles.php
        index 257358bb66..fba08e7e33 100644
        --- a/resources/lang/pt-PT/admin/groups/titles.php
        +++ b/resources/lang/pt-PT/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Sobre Grupos',
        +    'about_groups'                  => 'Os grupos são usados para generalizar as permissões do utilizador.',
             'group_management' 	 	=> 'Gestão de Grupos',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Criar novo Grupo',
        +    'update' 	 		        => 'Editar Grupo',
             'group_name' 	 		=> 'Nome do Grupo',
             'group_admin' 	 		=> 'Administrador do Grupo',
             'allow' 	 			=> 'Permitir',
        diff --git a/resources/lang/pt-PT/admin/hardware/form.php b/resources/lang/pt-PT/admin/hardware/form.php
        index 50c4a02386..2be43c677d 100644
        --- a/resources/lang/pt-PT/admin/hardware/form.php
        +++ b/resources/lang/pt-PT/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Confirmar Apagar artigos seleccionados',
           'bulk_delete_help'	=> 'Reveja os ativos para apagar abaixo. Depois de apagados, estes ativos podem ser restaurados, mas não estarão associados aos utilizadores.',
           'bulk_delete_warn'	=> 'Vai apagar :asset_count ativos.',
         	'bulk_update'		=> 'Atualização de ativos em massa',
        diff --git a/resources/lang/pt-PT/admin/hardware/general.php b/resources/lang/pt-PT/admin/hardware/general.php
        index 921aebcbc5..0c86a54d42 100644
        --- a/resources/lang/pt-PT/admin/hardware/general.php
        +++ b/resources/lang/pt-PT/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Sobre os artigos',
        +    'about_assets_text'            => 'Artigos são itens seguidos por números de serie ou "asset tags". Eles tendem a ser itens de maior valor, onde a identificação de um item específico importa.',
         	'archived'  				=> 'Arquivado',
             'asset'  					=> 'Ativo',
             'bulk_checkout'             => 'Atribuir artigo a utilizador',
             'checkin'  					=> 'Devolver Ativo',
        -    'checkout'  				=> 'Alocar ativo ao utilizador',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clonar Ativo',
             'deployable'  				=> 'Implementável',
             'deleted'  					=> 'Este ativo foi removido. <a href="/hardware/:asset_id/restore">Clique aqui para restaurar</a>.',
        diff --git a/resources/lang/pt-PT/admin/hardware/message.php b/resources/lang/pt-PT/admin/hardware/message.php
        index 66bb2910ec..621123dcdb 100644
        --- a/resources/lang/pt-PT/admin/hardware/message.php
        +++ b/resources/lang/pt-PT/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Artigo restaurado com sucesso.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Ficheiro não removido. Por favor, tente novamente.',
                 'success' => 'Ficheiro removido com sucesso.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Tem a certeza de que pretende eliminar este artigo?',
                 'error'   		=> 'Ocorreu um problema ao remover o artigo. Por favor, tente novamente.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'O artigo foi removido com sucesso.'
             ),
         
        diff --git a/resources/lang/pt-PT/admin/licenses/general.php b/resources/lang/pt-PT/admin/licenses/general.php
        index 513fbb1e4d..b4b78a9324 100644
        --- a/resources/lang/pt-PT/admin/licenses/general.php
        +++ b/resources/lang/pt-PT/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Sobre as Licenças',
        +    'about_licenses'                  => 'As licenças são usadas para controlar o software.  Eles têm um número especificado de lugares disponíveis para atribuir',
             'checkin'  					=> 'Devolver instalação da Licença',
             'checkout_history'  		=> 'Alocar histórico',
             'checkout'  				=> 'Alocar instalação da Licença',
        diff --git a/resources/lang/pt-PT/admin/licenses/message.php b/resources/lang/pt-PT/admin/licenses/message.php
        index 8125125d5f..8949da2043 100644
        --- a/resources/lang/pt-PT/admin/licenses/message.php
        +++ b/resources/lang/pt-PT/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Ficheiro(s) não submetidos. Por favor, tente novamente.',
                 'success' => 'Ficheiro(s) submetidos com sucesso.',
                 'nofiles' => 'Não selecionou nenhum ficheiro para submissão, ou o ficheiro que pretende submeter é demasiado grande',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Um ou mais ficheiros excedem o tamanho ou são do tipo de ficheiro não é permitido. Os tipos permitidos são png, gif, jpg, doc, docx, pdf, txt, zip, rar, and rtf.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/pt-PT/admin/locations/table.php b/resources/lang/pt-PT/admin/locations/table.php
        index e57bd633b3..94f60b9230 100644
        --- a/resources/lang/pt-PT/admin/locations/table.php
        +++ b/resources/lang/pt-PT/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'Sobre as Localizações',
        +    'about_locations'           => 'As localizações são usadas para seguir informações de utilizadores, assets, e outros itens',
             'assets_rtd'                => 'Artigos', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Ativos Atribuídos',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Localizações',
             'parent'                    => 'Pertence a',
             'currency'                  => 'Moeda',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/pt-PT/admin/manufacturers/table.php b/resources/lang/pt-PT/admin/manufacturers/table.php
        index 43cc22a65f..5f576356be 100644
        --- a/resources/lang/pt-PT/admin/manufacturers/table.php
        +++ b/resources/lang/pt-PT/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Sobre os fabricantes',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Fabricantes de Artigos',
             'create'				=> 'Criar Fabricante',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nome do Fabricante',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Atualizar Fabricante',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/pt-PT/admin/models/general.php b/resources/lang/pt-PT/admin/models/general.php
        index fb82c86a30..0b0f926248 100644
        --- a/resources/lang/pt-PT/admin/models/general.php
        +++ b/resources/lang/pt-PT/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Sobre os modelos dos artigos',
        +    'about_models_text'           => 'Os Modelos dos artigos são uma maneira para agrupar artigos idênticos. "MBP 2013", "IPhone 6s", etc.',
             'deleted'  					        => 'O modelo foi removido. <a href="/hardware/models/:model_id/restore">Clique aqui para o restaurar</a>.',
             'restore'                   => 'Restaurar Modelo',
             'requestable'               => 'Este modelo pode ser requisitado pelos utilizadores',
        diff --git a/resources/lang/pt-PT/admin/models/message.php b/resources/lang/pt-PT/admin/models/message.php
        index 4f654df2ac..02a8361bf2 100644
        --- a/resources/lang/pt-PT/admin/models/message.php
        +++ b/resources/lang/pt-PT/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modelo restaurado com sucesso.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/pt-PT/admin/settings/general.php b/resources/lang/pt-PT/admin/settings/general.php
        index 9d25eb114a..6fbb2c8a7a 100644
        --- a/resources/lang/pt-PT/admin/settings/general.php
        +++ b/resources/lang/pt-PT/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Alertas expiram (em dias)',
         	'alert_inv_threshold'		=> 'Alerta limite do inventário',
         	'asset_ids'					=> 'IDs dos Artigos',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Gerar IDs de artigos auto-incrementais',
         	'auto_increment_prefix'		=> 'Prefixo (opcional)',
         	'auto_incrementing_help'    => 'Ative IDs auto-incrementais antes da configuração',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'Email LDAP',
             'load_remote_text'          => 'Scripts Remotos',
             'load_remote_help_text'		=> 'Esta instalação do Snipe-IT pode carregar scripts do mundo exterior.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restringir utilizadores (incluindo admins) associados a empresas ao ativos da empresa.',
             'full_multiple_companies_support_text' => 'Suporte multi-empresa completo',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versão do PHP',
             'php_gd_info'               => 'Deve instalar a extensão php-gd para mostrar códigos QR, veja as instruções de instalação.',
             'php_gd_warning'            => 'O Processamento de Imagem PHP e o plugin GD não estão instalados.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Ative os códigos QR antes da configuração',
             'qr_text'                   => 'Texto do Código QR',
             'setting'                   => 'Configuração',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'Estas configurações permitem-lhe customizar determinados aspetos da sua instalação.',
             'labels_per_page'           => 'Etiquetas por página',
             'label_dimensions'          => 'Dimensões das etiquetas (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Margens da pagina (inches)',
             'purge'                    => 'Remover registos apagados',
             'labels_display_bgutter'    => 'Margem inferior da etiqueta',
        @@ -104,25 +117,27 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Autenticação em dois passos',
             'two_factor_secret'        => 'Código de autenticação em dois passos',
             'two_factor_enrollment'        => 'Ativação de autenticação em dois passos',
             'two_factor_enabled_text'        => 'Ativar autenticação em dois passos',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'two_factor_reset'        => 'Redefinir password autenticação de pois passos',
        +    'two_factor_reset_help'        => 'Isto irá forçar o usuário a registar o seu dispositivo com Google Authenticator novamente. Isso pode ser útil se seu dispositivo actualmente registado for perdido ou roubado. ',
        +    'two_factor_reset_success'          => 'Dispositivo de autenticação de dois passos foi redefinido com sucesso',
        +    'two_factor_reset_error'          => 'Reset do dispositivo de autenticação de dois passos falhou',
        +    'two_factor_enabled_warning'        => 'Ao activar a autenticação de dois passos se não estiver já ativado, irá forçar-te a autenticar com o Google Auth com um dispositivo registado.',
        +    'two_factor_enabled_help'        => 'Isso irá activar a autenticação de dois passos usando Google Authenticator.',
        +    'two_factor_optional'        => 'Selectivo (os usuários podem activar ou desactivar se permitido)',
        +    'two_factor_required'        => 'Obrigatório para todos os utilizadores',
        +    'two_factor_disabled'        => 'Desactivado',
        +    'two_factor_enter_code'	=> 'Digite o código de autenticação de pois passos',
        +    'two_factor_config_complete'	=> 'Enviar codigo',
        +    'two_factor_enabled_edit_not_allowed' => 'O teu administrador não permite editar esta opção.',
        +    'two_factor_enrollment_text'	=> "A autenticação de dois passos é obrigatória, mas se o teu dispositivo ainda não foi registado, abre o Google Authenticator e lê o QR Code para registar o teu dispositivo. Uma vez registado, introduz o código abaixo",
        +    'require_accept_signature'      => 'Requer assinatura',
        +    'require_accept_signature_help_text'      => 'Habilitar este recurso vai exigir que os utilizadores assinar fisicamente aceitando o artigo.',
             'left'        => 'esquerda',
             'right'        => 'direita',
             'top'        => 'topo',
        diff --git a/resources/lang/pt-PT/admin/suppliers/table.php b/resources/lang/pt-PT/admin/suppliers/table.php
        index 61ec21faea..aa774562ef 100644
        --- a/resources/lang/pt-PT/admin/suppliers/table.php
        +++ b/resources/lang/pt-PT/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Sobre os fornecedores',
        +    'about_suppliers_text'  => 'Fornecedores são usados para seguir a origem de itens',
             'address'               => 'Morada do Fornecedor',
             'assets'                => 'Artigos',
             'city'                  => 'Cidade',
        diff --git a/resources/lang/pt-PT/admin/users/general.php b/resources/lang/pt-PT/admin/users/general.php
        index fe4ccef25f..fba06cd5cf 100644
        --- a/resources/lang/pt-PT/admin/users/general.php
        +++ b/resources/lang/pt-PT/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Artigos alocados a :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Artigos atribuidos atualmente a este utilizador',
             'clone'             => 'Clonar Utilizador',
             'contact_user'      => 'Contacto :name',
             'edit'              => 'Editar Utilizador',
             'filetype_info'     => 'Os tipos de ficheiro permitidos são png, gif, jpg, jpeg, doc, docx, pdf, txt, zip e rar.',
             'history_user'      => 'Histórico para :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Último início de sessão',
             'ldap_config_text'  => 'As definições de configuração do LDAP podem ser encontradas em Administrador > Definições. A localização (opcional) selecionada vai ser defenida para todos os utilizadores importados.',
             'software_user'     => 'Software alocado a :name',
             'view_user'         => 'Ver Utilizador :name',
             'usercsv'           => 'Ficheiro CSV',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'As configurações de admin actuais permitem a aplicação selectiva de autenticação de dois passos.  ',
        +    'two_factor_enrolled' => 'Dispositivo A2P Registado ',
        +    'two_factor_active'   => 'A2P Activa ',
             );
        diff --git a/resources/lang/pt-PT/admin/users/message.php b/resources/lang/pt-PT/admin/users/message.php
        index 624894bf89..5ca7847827 100644
        --- a/resources/lang/pt-PT/admin/users/message.php
        +++ b/resources/lang/pt-PT/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Aceitou este artigo com sucesso.',
             'declined'                  => 'Recusou este artigo com sucesso.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Utilizador já existe!',
             'user_not_found'            => 'Utilizador [:id] não existe.',
             'user_login_required'       => 'O atributo login é obrigatório',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Utilizador criado com sucesso.',
                 'update'    => 'Utilizador atualizado com sucesso.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Utilizador removido com sucesso.',
                 'ban'       => 'Utilizador desabilitado com sucesso.',
                 'unban'     => 'Utilizador reabilitado com sucesso.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Ocorreu um problema ao criar o utilizador. Por favor, tente novamente.',
                 'update' => 'Ocorreu um problema ao atualizar o utilizador. Por favor, tente novamente.',
                 'delete' => 'Ocorreu um problema ao remover o utilizador. Por favor, tente novamente.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Ocorreu um problema ao retirar a suspensão ao utilizador. Por favor, tente novamente.',
                 'import'    => 'Ocorreu um problema ao importar os utilizadores. Por favor, tente novamente.',
                 'asset_already_accepted' => 'Este artigo já foi aceite.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Não foi possível estabelecer uma vinculação com o servidor LDAP. Por favor, verifique a configuração de servidor no ficheiro de configuração. <br>Error do Servidor LDAP: ',
                 'ldap_could_not_search' => 'Não foi possível pesquisar no servidor LDAP. Por favor, verifique a configuração de servidor no ficheiro de configuração. <br>Error do Servidor LDAP:',
                 'ldap_could_not_get_entries' => 'Não foi possível obter registos do servidor LDAP. Por favor, verifique a configuração de servidor no ficheiro de configuração. <br>Error do Servidor LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/pt-PT/admin/users/table.php b/resources/lang/pt-PT/admin/users/table.php
        index 03fdc3aad7..7eba8add87 100644
        --- a/resources/lang/pt-PT/admin/users/table.php
        +++ b/resources/lang/pt-PT/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Ativo',
             'allow'  				=> 'Permitir',
             'checkedout'  			=> 'Artigos',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Localização',
             'lock_passwords'		=> 'Detalhes de autenticação não podem ser alterados nesta instalação.',
             'manager' 				=> 'Responsável',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nome',
             'notes'                 => 'Notas',
             'password_confirm' 		=> 'Confirmar palavra-passe',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Mostrar Utilizadores Ativos',
             'show_deleted'          => 'Mostrar Utilizadores Removidos',
             'title' 				=> 'Título',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Atualizar utilizador',
             'username' 				=> 'Nome de utilizador',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Isto é usado apenas para vinculação com a Active Directory, para para login)',
             'cloneuser'             => 'Clonar Utilizador',
             'viewusers' 			=> 'Ver Utilizadores',
        diff --git a/resources/lang/pt-PT/auth/message.php b/resources/lang/pt-PT/auth/message.php
        index 99dbae9be3..a4d5d300ca 100644
        --- a/resources/lang/pt-PT/auth/message.php
        +++ b/resources/lang/pt-PT/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Esta conta de utilizador não está ativa.',
             'account_suspended'      => 'Está conta de utilizador encontra-se suspensa.',
             'account_banned'         => 'Este utilizador foi desabilitado.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Muitas tentativas falhadas de login. Por favor, tente novamente no próximo(s) :minutes minuto(s).',
         
             'signin' => array(
                 'error'   => 'Ocorreu um problema com o inicio de sessão. Por favor, tente novamente.',
        diff --git a/resources/lang/pt-PT/button.php b/resources/lang/pt-PT/button.php
        index d0bfba525e..f9c5fb7f80 100644
        --- a/resources/lang/pt-PT/button.php
        +++ b/resources/lang/pt-PT/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Ações',
             'add'    	                => 'Adicionar Novo',
             'cancel'                    => 'Cancelar',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Solicitar',
             'submit'  	                => 'Submeter',
             'upload'                    => 'Carregar',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/pt-PT/general.php b/resources/lang/pt-PT/general.php
        index 8d4dcd34ad..fc7a1c78c2 100644
        --- a/resources/lang/pt-PT/general.php
        +++ b/resources/lang/pt-PT/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Relatório de Artigo',
             'asset_tag'				=> 'Etiqueta de Artigo',
             'assets_available'		=> 'artigos disponíveis',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Artigos',
             'avatar_delete'         => 'Remover Avatar',
             'avatar_upload'         => 'Carregar Avatar',
             'back'      			=> 'Voltar',
             'bad_data'      		=> 'Nada foi encontrado. Talvez dados errados?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Saída em massa',
             'cancel'  				=> 'Cancelar',
             'categories'			=> 'Categorias',
             'category'				=> 'Categoria',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Alterar endereço de email',
             'changepassword'  		=> 'Alterar Palavra-passe',
             'checkin'  				=> 'Devolver',
             'checkin_from'  		=> 'Devolver de',
             'checkout'  			=> 'Alocar',
             'city'  				=> 'Cidade',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Empresas',
             'company'				=> 'Empresa',
             'component'			=> 'Componente',
             'components'			=> 'Componentes',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumível',
             'consumables'			=> 'Consumíveis',
             'country'  				=> 'País',
        @@ -44,16 +51,21 @@
             'created'               => 'Item criado',
             'created_asset'			=> 'artigo criado',
             'created_at' 			=> 'Criado em',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '€', // this is deprecated
             'current'  				=> 'Atuais',
             'custom_report'         => 'Relatório de Artigo personalizado',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Data',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Atenção!',
        +    'debug_warning_text'         => 'Esta aplicação está em execução no modo de produção com a depuração activada. Isso pode expor dados sensíveis se seu aplicativo é acessível para o mundo exterior. Desactive o modo de depuração mudando o valor de <code>APP_DEBUG</code> no teu ficheiro <code>.env</code> para <code>false</code>.',
             'delete'  				=> 'Remover',
             'deleted'  				=> 'Removidos',
             'delete_seats'  		=> 'Utilizadores apagados',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Implementado',
             'depreciation_report'	=> 'Relatório de Depreciação',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Permissões insuficientes!',
             'language'				=> 'Idioma',
             'last'					=> 'Última',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Apelido',
             'license'				=> 'Licença',
             'license_report'        => 'Relatório de Licenças',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Mais informação',
             'name'					=> 'Nome',
             'next'					=> 'Próximo',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'novo!',
             'no_depreciation'		=> 'Sem Depreciação',
             'no_results'			=> 'Sem Resultados.',
             'no'  					=> 'Não',
             'notes'  				=> 'Notas',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Número de encomenda',
             'page_menu'				=> 'Apresentando_MENU_items',
             'pagination_info'		=> 'Apresentando_START_até_END_de_TOTAL_items',
             'pending'				=> 'Pendente',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Anterior',
             'processing'			=> 'A processar',
             'profile'				=> 'Perfil',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Preço de compra',
        +    'purchase_date'         => 'Data de compra',
             'qty'		            => 'QTD',
             'quantity'		        => 'Quantidade',
             'ready_to_deploy'		=> 'Pronto para implementar',
        @@ -138,27 +153,31 @@
             'select'				=> 'Selecione',
             'search'				=> 'Pesquisar',
             'select_category'       => 'Selecionar Categoria',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Selecione um Tipo de Depreciação',
             'select_location'		=> 'Selecione uma localização',
             'select_manufacturer'	=> 'Selecione um Fabricante',
             'select_model'			=> 'Selecione um Modelo',
             'select_supplier'		=> 'Selecione um Fornecedor',
             'select_user'			=> 'Selecione um Utilizador',
        -    'select_date'			=> 'Selecionar data',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Selecionar Estado',
             'select_company'    	=> 'Selecione a empresa',
             'select_asset'    		=> 'Selecionar artigo',
             'settings'				=> 'Configurações',
             'sign_in'				=> 'Iniciar sessão',
        -    'signature'             => 'Signature',
        +    'signature'             => 'Assinatura',
             'some_features_disabled' => 'MODO DE DEMONSTRAÇÃO: Algumas funcionalidades estão desativadas para esta instalação.',
             'site_name'				=> 'Nome do site',
             'state'  				=> 'Distrito',
             'status_labels'			=> 'Estados',
             'status'    			=> 'Estado',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Fornecedor',
             'suppliers'  			=> 'Fornecedores',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submeter',
        +    'target'                => 'Destino',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'artigos',
             'total_licenses'		=> 'licenças',
             'total_accessories'		=> 'acessórios totais',
        diff --git a/resources/lang/pt-PT/mail.php b/resources/lang/pt-PT/mail.php
        index c9a4fe182d..2f1cb9253e 100644
        --- a/resources/lang/pt-PT/mail.php
        +++ b/resources/lang/pt-PT/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'a_user_canceled' => 'Um utilizador cancelou um pedido de artigo no site',
        +    'a_user_requested' => 'Um utilizador solicitou um artigo no site',
        +    'accessory_name' => 'Nome do acessório:',
        +    'additional_notes' => 'Notas adicionais:',
        +    'admin_has_created' => 'Um administrador criou uma conta para ti no :web site.',
        +    'asset' => 'Artigo:',
        +    'asset_name' => 'Nome do Artigo:',
        +    'asset_requested' => 'Artigo requesitado',
        +    'asset_tag' => 'Etiqueta de Artigo:',
        +    'assets_warrantee_expiring' => '{1} artigo com garantia que expira nos próximos 60 dias. |[2,inf] artigos com garantia que expira nos próximos 60 dias.',
        +    'assigned_to' => 'Atribuído a',
        +    'best_regards' => 'Atenciosamente',
        +    'canceled' => 'Cancelado:',
        +    'checkin_date' => 'Data de devolução:',
        +    'checkout_date' => 'Data de atribuição:',
        +    'click_to_confirm' => 'Por favor clique no link a seguir para confirmar sua conta :web:',
        +    'click_on_the_link_accessory' => 'Por favor clique no link na parte inferior para confirmar que recebeu o acessório.',
        +    'click_on_the_link_asset' => 'Por favor clique no link na parte inferior para confirmar que recebeu o artigo.',
        +    'Confirm_Asset_Checkin' => 'Confirme a devolução do artigo.',
        +    'Confirm_Accessory_Checkin' => 'Confirme a devolução do acessório.',
        +    'Confirm_accessory_delivery' => 'Confirme a atribuição do acessório.',
        +    'Confirm_asset_delivery' => 'Confirme a atribuição do artigo.',
        +    'Confirm_consumable_delivery' => 'Confirme a atribuição de consumíveis.',
        +    'current_QTY' => 'qtde. actual',
        +    'Days' => 'Dias',
        +    'days' => 'Dias',
        +    'expecting_checkin_date' => 'Data prevista de devolução:',
        +    'expires' => 'Expira a',
        +    'Expiring_Assets_Report' => 'Relatório de artigos a expirar.',
        +    'Expiring_Licenses_Report' => 'Relatório de Licenças a expirar.',
        +    'hello' => 'Olá',
        +    'hi' => 'Oi',
        +    'i_have_read' => 'Li e concordo com os termos de uso e recebi este item.',
             'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'items_below_minimum' => '{1} item está abaixo do stock mínimo ou irá em breve estará baixo. | [2, Inf] itens que estão abaixo do stock mínimo ou estarão em breve.',
        +    'Item_Request_Canceled' => 'Requisição de item cancelado',
        +    'Item_Requested' => 'Item requisitado',
        +    'licenses_expiring' => '{1] Licença expira nos próximos 60 dias. | [2, Inf] licenças expiram nos próximos 60 dias.',
        +    'link_to_update_password' => 'Por favor clique no link abaixo para actualizar a sua senha do :web:',
        +    'login_first_admin' => 'Faça login na sua instalação do Snipe-IT usando os dados abaixo:',
             'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'Low_Inventory_Report' => 'Relatório de baixas de inventario',
        +    'min_QTY' => 'Qt. Min.',
        +    'name' => 'Nome',
        +    'new_item_checked' => 'Um novo item foi atribuído a ti, os detalhes estão abaixo.',
        +    'password' => 'Senha:',
        +    'password_reset' => 'Repor senha',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Por favor, leia os termos de uso abaixo.',
        +    'read_the_terms_and_click' => 'Por favor, leia os termos de uso abaixo e clique no link na parte inferior para confirmar que leu e que concorda com os termos de uso e ter recebido o artigo.',
        +    'requested' => 'Requisitado:',
        +    'reset_link' => 'Seu Link de redefinição da senha',
        +    'reset_password' => 'Clique aqui para redefinir a sua password:',
        +    'serial' => 'Número de Série:',
        +    'supplier' => 'Fornecedor',
        +    'tag' => 'Etiqueta',
        +    'test_email' => 'Email de teste do Snipe-IT',
        +    'test_mail_text' => 'Isto é um email de teste do Snipe-IT Asset Management System. Se recebeste o recebeste, quer dizer que o email está a funcionar :)',
        +    'the_following_item' => 'O Item a seguir foi devolvido: ',
        +    'There_are' => 'Há {1} | [2,inf] Existem',
        +    'to_reset' => 'Para fazer reset a senha do :web, preencha este formulário:',
        +    'type' => 'Tipo',
        +    'user' => 'Utilizador:',
        +    'username' => 'Nome do Utilizador:',
        +    'welcome' => 'Bem vindo, :name',
        +    'welcome_to' => 'Bem-vindo ao :web!',
        +    'your_credentials' => 'Suas credenciais do Snipe-IT',
         );
        diff --git a/resources/lang/pt-PT/validation.php b/resources/lang/pt-PT/validation.php
        index 8f9db3113b..1ebfc3f225 100644
        --- a/resources/lang/pt-PT/validation.php
        +++ b/resources/lang/pt-PT/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "O :attribute tem que ser aceite.",
        -    "active_url"       => "O :attribute não é um URL válido.",
        -    "after"            => "A :attribute tem que ser superior a :date.",
        -    "alpha"            => "O :attribute só pode conter letras.",
        -    "alpha_dash"       => "O :attribute só pode conter letras, números e traços.",
        -    "alpha_num"        => "O :attribute só pode conter letras e números.",
        -    "before"           => "A :attribute tem que ser anterior a :date.",
        -    "between"          => array(
        -        "numeric" => "O :attribute deve estar entre :min e :max.",
        -        "file"    => "O :attribute deve estar entre :min e :max kilobytes.",
        -        "string"  => "O :attribute deve estar entre :min e :max caracteres.",
        -    ),
        -    "confirmed"        => "A confirmação da :attribute não coincide.",
        -    "date"             => "A :attribute não é uma data válida.",
        -    "date_format"      => ":attribute não corresponde ao formato :format.",
        -    "different"        => ":attribute e :other têm que ser diferentes.",
        -    "digits"           => ":attribute de contem :digits dígitos.",
        -    "digits_between"   => "O :attribute deve estar entre :min e :max dígitos.",
        -    "email"            => "O formato do :attribute é inválido.",
        -    "exists"           => "O :attribute é inválido.",
        -    "email_array"      => "Um ou mais endereços de email são invalidos.",
        -    "image"            => "O :attribute tem que ser uma imagem.",
        -    "in"               => "O :attribute selecionado é inválido.",
        -    "integer"          => "O :attribute tem que ser um inteiro.",
        -    "ip"               => "O :attribute tem que ser um IP válido.",
        -    "max"              => array(
        -        "numeric" => "O :attribute não pode ser maior do que :max.",
        -        "file"    => "O :attribute não pode ter mais do que :max kilobytes.",
        -        "string"  => "O :attribute não pode tem mais do que :max caracteres.",
        -    ),
        -    "mimes"            => "O :attribute só pode contem os seguintes formatos: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute deve ter pelos menos :min.",
        -        "file"    => ":attribute deve ter pelos menos :min kilobytes.",
        -        "string"  => "O :attribute deve conter pelos menos :min caracteres.",
        -    ),
        -    "not_in"           => "O :attribute selecionado é inválido.",
        -    "numeric"          => ":attribute tem que ser um número.",
        -    "regex"            => "O formato do :attribute é inválido.",
        -    "required"         => ":attribute é obrigatório.",
        -    "required_if"      => "O :attribute é obrigatório quando :other é :value.",
        -    "required_with"    => "O :attribute é obrigatório quando :values existem.",
        -    "required_without" => "O :attribute é obrigatório quando :values não existem.",
        -    "same"             => ":attribute e :other devem coincidir.",
        -    "size"             => array(
        -        "numeric" => "O :attribute deve ser maior que :size.",
        -        "file"    => "O :attribute deve ter :size kilobytes.",
        -        "string"  => "O :attribute deve conter :size caracteres.",
        -    ),
        -    "unique"           => "Este :attribute já existe.",
        -    "url"              => "O formato do :attribute é inválido.",
        -    "statuslabel_type" => "Deve selecionar um tipo de rótulo de estado valido",
        -    "unique_undeleted" => "O :atribute deve ser único.",
        +    'accepted'             => 'O :attribute tem que ser aceite.',
        +    'active_url'           => 'O :attribute não é um URL válido.',
        +    'after'                => 'A :attribute tem que ser superior a :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'O :attribute só pode conter letras.',
        +    'alpha_dash'           => 'O :attribute só pode conter letras, números e traços.',
        +    'alpha_num'            => 'O :attribute só pode conter letras e números.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'A :attribute tem que ser anterior a :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'O :attribute deve estar entre :min e :max.',
        +        'file'    => 'O :attribute deve estar entre :min e :max kilobytes.',
        +        'string'  => 'O :attribute deve estar entre :min e :max caracteres.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'A confirmação da :attribute não coincide.',
        +    'date'                 => 'A :attribute não é uma data válida.',
        +    'date_format'          => ':attribute não corresponde ao formato :format.',
        +    'different'            => ':attribute e :other têm que ser diferentes.',
        +    'digits'               => ':attribute de contem :digits dígitos.',
        +    'digits_between'       => 'O :attribute deve estar entre :min e :max dígitos.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'O formato do :attribute é inválido.',
        +    'exists'               => 'O :attribute é inválido.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'O :attribute tem que ser uma imagem.',
        +    'in'                   => 'O :attribute selecionado é inválido.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'O :attribute tem que ser um inteiro.',
        +    'ip'                   => 'O :attribute tem que ser um IP válido.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'O :attribute não pode ser maior do que :max.',
        +        'file'    => 'O :attribute não pode ter mais do que :max kilobytes.',
        +        'string'  => 'O :attribute não pode tem mais do que :max caracteres.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'O :attribute só pode contem os seguintes formatos: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute deve ter pelos menos :min.',
        +        'file'    => ':attribute deve ter pelos menos :min kilobytes.',
        +        'string'  => 'O :attribute deve conter pelos menos :min caracteres.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'O :attribute selecionado é inválido.',
        +    'numeric'              => ':attribute tem que ser um número.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'O formato do :attribute é inválido.',
        +    'required'             => ':attribute é obrigatório.',
        +    'required_if'          => 'O :attribute é obrigatório quando :other é :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'O :attribute é obrigatório quando :values existem.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'O :attribute é obrigatório quando :values não existem.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute e :other devem coincidir.',
        +    'size'                 => [
        +        'numeric' => 'O :attribute deve ser maior que :size.',
        +        'file'    => 'O :attribute deve ter :size kilobytes.',
        +        'string'  => 'O :attribute deve conter :size caracteres.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'Este :attribute já existe.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'O formato do :attribute é inválido.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "O :attribute contem um caracter que não é permitido.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/ro/admin/asset_maintenances/message.php b/resources/lang/ro/admin/asset_maintenances/message.php
        index ca4256efbe..d121115825 100644
        --- a/resources/lang/ro/admin/asset_maintenances/message.php
        +++ b/resources/lang/ro/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Asset Maintenance was not created, please try again.',
                     'success' => 'Asset Maintenance created successfully.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Not Completed Yet',
                 'warranty'                     => 'Warranty',
                 'not_warranty'                 => 'Not Warranty',
        diff --git a/resources/lang/ro/admin/categories/general.php b/resources/lang/ro/admin/categories/general.php
        index cbbffaf092..779e73e055 100644
        --- a/resources/lang/ro/admin/categories/general.php
        +++ b/resources/lang/ro/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Editare categorie',
             'eula_text'							=> 'Category EULA',
             'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
             'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
             'required_eula'						=> 'This user will be emailed a copy of the EULA',
        diff --git a/resources/lang/ro/admin/custom_fields/message.php b/resources/lang/ro/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/ro/admin/custom_fields/message.php
        +++ b/resources/lang/ro/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/ro/admin/departments/message.php b/resources/lang/ro/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/ro/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ro/admin/departments/table.php b/resources/lang/ro/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/ro/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/ro/admin/hardware/general.php b/resources/lang/ro/admin/hardware/general.php
        index 77092c0014..e745b93c0a 100644
        --- a/resources/lang/ro/admin/hardware/general.php
        +++ b/resources/lang/ro/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Activ',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Verifica activ',
        -    'checkout'  				=> 'Checkout activ catre utilizator',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Cloneaza activ',
             'deployable'  				=> 'Lansabil',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/ro/admin/hardware/message.php b/resources/lang/ro/admin/hardware/message.php
        index a7b19d5343..0b77c216e2 100644
        --- a/resources/lang/ro/admin/hardware/message.php
        +++ b/resources/lang/ro/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Sunteti sigur ca vreti sa stergeti acest activ?',
                 'error'   		=> 'S-a intampinat o problema la stergerea activului. Va rugam incercati iar.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Activul a fost sters.'
             ),
         
        diff --git a/resources/lang/ro/admin/locations/table.php b/resources/lang/ro/admin/locations/table.php
        index 5fcda86d26..444ff238e7 100644
        --- a/resources/lang/ro/admin/locations/table.php
        +++ b/resources/lang/ro/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locatii',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/ro/admin/manufacturers/table.php b/resources/lang/ro/admin/manufacturers/table.php
        index 04c78c553d..26f56df7ff 100644
        --- a/resources/lang/ro/admin/manufacturers/table.php
        +++ b/resources/lang/ro/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Producatori de active',
             'create'				=> 'Creeaza producator',
             'id'   					=> 'ID',
        -    'name'      			=> 'Nume producator',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Actualizeaza producator',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/ro/admin/models/message.php b/resources/lang/ro/admin/models/message.php
        index 09c19ba106..94249c3613 100644
        --- a/resources/lang/ro/admin/models/message.php
        +++ b/resources/lang/ro/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model restored successfully.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/ro/admin/settings/general.php b/resources/lang/ro/admin/settings/general.php
        index e0a08ea782..6141a11265 100644
        --- a/resources/lang/ro/admin/settings/general.php
        +++ b/resources/lang/ro/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Genereaza ID-uri crescatoare de active',
         	'auto_increment_prefix'		=> 'Prefix (optional)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Versiune PHP',
             'php_gd_info'               => 'Trebuie sa instalati php-gd ca sa afisati coduri QR, verificati instructiunile de instalare.',
             'php_gd_warning'            => 'PHP Image Processing si GD plugin NU sunt instalate.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Activeaza codurile QR inainte sa setati asta',
             'qr_text'                   => 'Text cod QR',
             'setting'                   => 'Setare',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/ro/admin/users/general.php b/resources/lang/ro/admin/users/general.php
        index b0f85cb82b..ba41510dcf 100644
        --- a/resources/lang/ro/admin/users/general.php
        +++ b/resources/lang/ro/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Activul desemnat catre :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Cloneaza utilizator',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Editeaza utilizator',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'Istoric pentru :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Ultima logare',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software predat catre :name',
        diff --git a/resources/lang/ro/admin/users/message.php b/resources/lang/ro/admin/users/message.php
        index bb8167d2c0..ba6dba3025 100644
        --- a/resources/lang/ro/admin/users/message.php
        +++ b/resources/lang/ro/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Utilizatorul exista deja!',
             'user_not_found'            => 'Utilizatorul [:id] nu exista.',
             'user_login_required'       => 'Campul de login este necesar',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Utilizatorul a fost creat.',
                 'update'    => 'Utilizatorul a fost actualizat.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Utilizatorul a fost sters.',
                 'ban'       => 'Utilizatorul a fost banat.',
                 'unban'     => 'Utilizatorul a fost debanat.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'A aparut o problema la crearea utilizatorului. Incercati iar.',
                 'update' => 'A aparut o problema la actualizarea utilizatorului. Incercati iar.',
                 'delete' => 'A aparut o problema la stergerea utilizatorului. Incercati iar.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'A aparut o problema la reactivarea utilizatorului. Incercati iar.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/ro/admin/users/table.php b/resources/lang/ro/admin/users/table.php
        index 786e46a3e5..4c5bc6d917 100644
        --- a/resources/lang/ro/admin/users/table.php
        +++ b/resources/lang/ro/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Activ',
             'allow'  				=> 'Permite',
             'checkedout'  			=> 'Active',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Locatie',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Nume',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirma parola',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Titlu',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Actualizeaza utilizator',
             'username' 				=> 'Utilizator',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(Folosit numai pentru legatura cu Active Directory, nu pentru logare.)',
             'cloneuser'             => 'Cloneaza utilizator',
             'viewusers' 			=> 'Vezi utilizatori',
        diff --git a/resources/lang/ro/auth/message.php b/resources/lang/ro/auth/message.php
        index 3255ef6934..6823bdef7b 100644
        --- a/resources/lang/ro/auth/message.php
        +++ b/resources/lang/ro/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Acest utilizator nu a fost activat.',
             'account_suspended'      => 'Acest utilizator este suspendat.',
             'account_banned'         => 'Acest utilizator este banat.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'A aparut o problema la logare, va rugam incercati iar.',
        diff --git a/resources/lang/ro/button.php b/resources/lang/ro/button.php
        index 7c4d1967ec..f72358f087 100644
        --- a/resources/lang/ro/button.php
        +++ b/resources/lang/ro/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Actiuni',
             'add'    	                => 'Adauga',
             'cancel'                    => 'Anuleaza',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Request',
             'submit'  	                => 'Trimiteti',
             'upload'                    => 'Incarca',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/ro/general.php b/resources/lang/ro/general.php
        index 734583f399..d275c2d808 100644
        --- a/resources/lang/ro/general.php
        +++ b/resources/lang/ro/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Raport de active',
             'asset_tag'				=> 'Eticheta activ',
             'assets_available'		=> 'Active disponibile',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Active',
             'avatar_delete'         => 'Sterge avatar',
             'avatar_upload'         => 'Upload Avatar',
             'back'      			=> 'Inapoi',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Anuleaza',
             'categories'			=> 'Categorii',
             'category'				=> 'Categoria',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Schimba adresa de E-mail',
             'changepassword'  		=> 'Schimba parola',
             'checkin'  				=> 'Primeste',
             'checkin_from'  		=> 'Checkin from',
             'checkout'  			=> 'Preda',
             'city'  				=> 'Oras',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Consumable',
             'consumables'			=> 'Consumables',
             'country'  				=> 'Tara',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'Activ creat',
             'created_at' 			=> 'Creat la',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> 'LEI', // this is deprecated
             'current'  				=> 'Curent',
             'custom_report'         => 'Raport active custom',
             'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Data',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Sterge',
             'deleted'  				=> 'Sters',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Pus in folosinta',
             'depreciation_report'	=> 'Raport depreciere',
             'download'				=> 'Download',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Nu aveti permisiuni suficiente!',
             'language'				=> 'Language',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Nume',
             'license'				=> 'Licenta',
             'license_report'        => 'Raport licente',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'Mai multe',
             'name'					=> 'Nume',
             'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'Fara depreciere',
             'no_results'			=> 'Nici un rezultat.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Selectați',
             'search'				=> 'Căutare',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Select a Manufacturer',
             'select_model'			=> 'Select a Model',
             'select_supplier'		=> 'Select a Supplier',
             'select_user'			=> 'Selectati un utilizatori',
        -    'select_date'			=> 'Selectaţi data',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Selecteaza Starea',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Stare',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Furnizori',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'Total active',
             'total_licenses'		=> 'Total licente',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/ro/validation.php b/resources/lang/ro/validation.php
        index 64a5856f4b..222e50c955 100644
        --- a/resources/lang/ro/validation.php
        +++ b/resources/lang/ro/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute a fost acceptat.",
        -    "active_url"       => ":attribute nu este un URL valid.",
        -    "after"            => ":attribute trebuie sa fie o data dupa :date.",
        -    "alpha"            => ":attribute trebuie sa contina numai litere.",
        -    "alpha_dash"       => ":attribute poate sa contina numai litere, cifre si linia de punctuatie.",
        -    "alpha_num"        => ":attribute poate sa contina numai litere si cifre.",
        -    "before"           => ":attribute trebuie sa contina o data inainte de :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute trebuie sa fie intre :min - :max.",
        -        "file"    => ":attribute trebuie sa fie intre  :min - :max kilobytes.",
        -        "string"  => ":attribute trebuie sa aiba intre :min - :max caractere.",
        -    ),
        -    "confirmed"        => "Confirmarea la :attribute nu este asemanatoare.",
        -    "date"             => ":attribute nu este o data.",
        -    "date_format"      => ":attribute nu se leaga cu formatul :format.",
        -    "different"        => ":attribute si :other trebuie sa fie diferite.",
        -    "digits"           => ":attribute trebuie sa fie de :digits cifre.",
        -    "digits_between"   => ":attribute trebuie sa fie intre :min si :max cifre.",
        -    "email"            => "Formatul :attribute nu este valid.",
        -    "exists"           => ":attribute selectat nu e valid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => ":attribute trebuie sa fie o imagine.",
        -    "in"               => ":attribute selectat nu este valid.",
        -    "integer"          => ":attribute trebuie sa fie numar intreg.",
        -    "ip"               => ":attribute trebuie sa fie o adresa IP valida.",
        -    "max"              => array(
        -        "numeric" => ":attribute nu poate sa fie mai mare de :max.",
        -        "file"    => ":attribute nu poate sa fie mai mare de :max kilobytes.",
        -        "string"  => ":attribute nu trebuie sa fie mai mare de :max caractere.",
        -    ),
        -    "mimes"            => ":attribute trebuie sa fie un fisier de tipul :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute trebuie sa aiba cel putin :min.",
        -        "file"    => ":attribute trebuie sa aiba minim :min kilobytes.",
        -        "string"  => ":attribute trebuie sa aiba cel putin :min caractere.",
        -    ),
        -    "not_in"           => ":attribute selectat nu e valid.",
        -    "numeric"          => ":attribute trebuie sa fie un numar.",
        -    "regex"            => "Formatul :attribute nu este valid.",
        -    "required"         => "Campul :attribute este obligatoriu.",
        -    "required_if"      => ":attribute este obligatoriu atunci cand :other este :value.",
        -    "required_with"    => ":attribute este obligatoriu atunci cand :values este prezent.",
        -    "required_without" => ":attribute este obligatoriu atunci cand :values nu este prezent.",
        -    "same"             => ":attribute si :other trebuie sa fie la fel.",
        -    "size"             => array(
        -        "numeric" => ":attribute trebuie sa aiba :size.",
        -        "file"    => ":attribute trebuie sa aiba :size kilobytes.",
        -        "string"  => ":attribute trebuie sa aiba :size caractere.",
        -    ),
        -    "unique"           => ":attribute este deja folosit.",
        -    "url"              => "Formatul :attribute nu este valid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute a fost acceptat.',
        +    'active_url'           => ':attribute nu este un URL valid.',
        +    'after'                => ':attribute trebuie sa fie o data dupa :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute trebuie sa contina numai litere.',
        +    'alpha_dash'           => ':attribute poate sa contina numai litere, cifre si linia de punctuatie.',
        +    'alpha_num'            => ':attribute poate sa contina numai litere si cifre.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute trebuie sa contina o data inainte de :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute trebuie sa fie intre :min - :max.',
        +        'file'    => ':attribute trebuie sa fie intre  :min - :max kilobytes.',
        +        'string'  => ':attribute trebuie sa aiba intre :min - :max caractere.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'Confirmarea la :attribute nu este asemanatoare.',
        +    'date'                 => ':attribute nu este o data.',
        +    'date_format'          => ':attribute nu se leaga cu formatul :format.',
        +    'different'            => ':attribute si :other trebuie sa fie diferite.',
        +    'digits'               => ':attribute trebuie sa fie de :digits cifre.',
        +    'digits_between'       => ':attribute trebuie sa fie intre :min si :max cifre.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Formatul :attribute nu este valid.',
        +    'exists'               => ':attribute selectat nu e valid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute trebuie sa fie o imagine.',
        +    'in'                   => ':attribute selectat nu este valid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute trebuie sa fie numar intreg.',
        +    'ip'                   => ':attribute trebuie sa fie o adresa IP valida.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute nu poate sa fie mai mare de :max.',
        +        'file'    => ':attribute nu poate sa fie mai mare de :max kilobytes.',
        +        'string'  => ':attribute nu trebuie sa fie mai mare de :max caractere.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute trebuie sa fie un fisier de tipul :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute trebuie sa aiba cel putin :min.',
        +        'file'    => ':attribute trebuie sa aiba minim :min kilobytes.',
        +        'string'  => ':attribute trebuie sa aiba cel putin :min caractere.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => ':attribute selectat nu e valid.',
        +    'numeric'              => ':attribute trebuie sa fie un numar.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Formatul :attribute nu este valid.',
        +    'required'             => 'Campul :attribute este obligatoriu.',
        +    'required_if'          => ':attribute este obligatoriu atunci cand :other este :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute este obligatoriu atunci cand :values este prezent.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute este obligatoriu atunci cand :values nu este prezent.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute si :other trebuie sa fie la fel.',
        +    'size'                 => [
        +        'numeric' => ':attribute trebuie sa aiba :size.',
        +        'file'    => ':attribute trebuie sa aiba :size kilobytes.',
        +        'string'  => ':attribute trebuie sa aiba :size caractere.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute este deja folosit.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Formatul :attribute nu este valid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/ru/admin/accessories/general.php b/resources/lang/ru/admin/accessories/general.php
        index fb6001b865..1467c44fc4 100644
        --- a/resources/lang/ru/admin/accessories/general.php
        +++ b/resources/lang/ru/admin/accessories/general.php
        @@ -15,7 +15,7 @@ return array(
             'no_default_eula'					=> 'Не найдено пользовательского соглашения по умолчанию. Добавьте его в Настройках.',
             'total'  							=> 'Всего',
             'remaining'  						=> 'Наличие',
        -    'update'  							=> 'Обновить аксесуар',
        +    'update'  							=> 'Обновить аксессуар',
             'use_default_eula'					=> 'Использовать <a href="#" data-toggle="modal" data-target="#eulaModal">главное пользовательское соглашение по умолчанию</a>.',
             'use_default_eula_disabled'			=> '<del>Использовать основное пользовательское соглашение.</del> Не задано основное пользовательское соглашение. Добавьте его в Настройках.',
         
        diff --git a/resources/lang/ru/admin/accessories/table.php b/resources/lang/ru/admin/accessories/table.php
        index 462df93d03..f452ee49da 100644
        --- a/resources/lang/ru/admin/accessories/table.php
        +++ b/resources/lang/ru/admin/accessories/table.php
        @@ -5,7 +5,7 @@ return array(
         	'eula_text'      			=> 'EULA',
             'id'      					=> 'ID',
             'require_acceptance'      	=> 'Принятие',
        -    'title'      				=> 'Имя аксессуара',
        +    'title'      				=> 'Название аксессуара',
         
         
         );
        diff --git a/resources/lang/ru/admin/asset_maintenances/message.php b/resources/lang/ru/admin/asset_maintenances/message.php
        index bca41da019..d6c3ee9148 100644
        --- a/resources/lang/ru/admin/asset_maintenances/message.php
        +++ b/resources/lang/ru/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Не выполнено, попробуйте еще раз.',
                     'success' => 'Выполнено.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Ещё не готово',
                 'warranty'                     => 'Гарантия',
                 'not_warranty'                 => 'Гарантии нет/истекла',
        diff --git a/resources/lang/ru/admin/asset_maintenances/table.php b/resources/lang/ru/admin/asset_maintenances/table.php
        index 1bd13d3287..ca92426162 100644
        --- a/resources/lang/ru/admin/asset_maintenances/table.php
        +++ b/resources/lang/ru/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Заголовок',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Имя ресурса',
                 'is_warranty'   => 'Гарантия',
                 'dl_csv'        => 'Загрузить CSV'
             ];
        diff --git a/resources/lang/ru/admin/categories/general.php b/resources/lang/ru/admin/categories/general.php
        index 081281c5a8..8fb8d337e9 100644
        --- a/resources/lang/ru/admin/categories/general.php
        +++ b/resources/lang/ru/admin/categories/general.php
        @@ -1,16 +1,17 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'О категориях',
        +    'about_categories'  				=> 'Категории помогут вам организовать ваше оборудование. Например, категориями могут быть: &quot;Ноутбуки&quot;, &quot;Мобильные телефоны&quot;, &quot;Планшеты&quot; и так далее, однако вы можете использовать их так, как сочтете правильным.',
             'asset_categories' 					=> 'Категории активов',
             'category_name'  					=> 'Имя категории',
        -    'checkin_email'                     => 'Отправить email пользователю при возврате.',
        +    'checkin_email'                     => 'Отправить email пользователю при выдаче.',
             'clone'                             => 'Копировать категорию',
             'create'  							=> 'Создать категорию',
             'edit'                              => 'Редактировать категорию',
             'eula_text'							=> 'Категория EULA',
             'eula_text_help'					=> 'Это поле позволяет персонализировать пользовательские соглашения для определенных типов активов. Если у вас только одно пользовательское соглашение для всех активов, вы можете отметить чекбокс внизу, чтобы использовать основное соглашение по умолчанию.',
        +    'name'                              => 'Название категории',
             'require_acceptance'				=> 'Требовать обязательного подтверждения пользователем прием активов в этой категории.',
             'required_acceptance'				=> 'Этому пользователю будет выслано электронное письмо со ссылкой для подтверждения получения этого предмета.',
             'required_eula'						=> 'Пользователю будет отправлена копия EULA',
        diff --git a/resources/lang/ru/admin/companies/general.php b/resources/lang/ru/admin/companies/general.php
        index a6eee8dcc9..5d3695d3bf 100644
        --- a/resources/lang/ru/admin/companies/general.php
        +++ b/resources/lang/ru/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'О компаниях',
        +    'about_companies_text'                  => 'Компании могут использоваться как обычные индентификаторы, или, например, для ограничения видимости ресурсов, пользователей, и т. д., при условии, что данная функция включена в настройках.',
             'select_company' => 'Выберите компанию',
         ];
        diff --git a/resources/lang/ru/admin/consumables/general.php b/resources/lang/ru/admin/consumables/general.php
        index 554dba090b..a745cc33a4 100644
        --- a/resources/lang/ru/admin/consumables/general.php
        +++ b/resources/lang/ru/admin/consumables/general.php
        @@ -2,11 +2,11 @@
         
         return array(
             'about_consumables_title' 			=> 'Про расходные материалы',
        -    'about_consumables_text'  			=> 'Расходные материалы это все приобретённые товары, которые израсходуются в процессе использования. Например, чернило для принтера или копировальная бумага.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'about_consumables_text'  			=> 'Расходные материалы это все приобретённые товары, которые израсходуются в процессе использования. Например, чернила для принтера или копировальная бумага.',
        +    'checkout'                          => 'Выдать расходники пользователю',
             'consumable_name'                   => 'Название расходного материала',
             'create'                            => 'Создать расходный материал',
        -    'item_no'                           => 'Item No.',
        +    'item_no'                           => 'Пункт №.',
             'remaining' 			            => 'Осталось',
             'total' 			                => 'Всего',
             'update'                            => 'Обновить расходный материал',
        diff --git a/resources/lang/ru/admin/custom_fields/general.php b/resources/lang/ru/admin/custom_fields/general.php
        index 5450b55d2c..737ceec71b 100644
        --- a/resources/lang/ru/admin/custom_fields/general.php
        +++ b/resources/lang/ru/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> 'О наборах полей',
             'about_fieldsets_text'		=> 'Наборы полей позволяют вам создать группы пользовательских полей, которые часто используются для конкретных моделей автивов.',
             'custom_format'             => 'Пользовательский формат...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => 'Зашифровать значение этого поля в базе данных',
             'encrypt_field_help'      => 'ПРЕДУПРЕЖДЕНИЕ: Шифрование поля исключит возможность его поиска.',
             'encrypted'      	        => 'Зашифровано',
             'fieldset'      	        => 'Набор полей',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => 'Имя набора',
             'field_name'              => 'Имя поля',
             'field_values'            => 'Значения полей',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => 'Добавьте выбранные значения по одной в строку. Пустые строки, кроме первой, будут проигнорованы.',
             'field_element'           => 'Элемент формы',
             'field_element_short'     => 'Элемент',
             'field_format'            => 'Формат',
        diff --git a/resources/lang/ru/admin/custom_fields/message.php b/resources/lang/ru/admin/custom_fields/message.php
        index d09f7e3a50..0d074fc69c 100644
        --- a/resources/lang/ru/admin/custom_fields/message.php
        +++ b/resources/lang/ru/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Набор полей не существует',
         
                 'create' => array(
                     'error'   => 'Набор полей не был создан, попробуйте ещё раз.',
        diff --git a/resources/lang/ru/admin/departments/message.php b/resources/lang/ru/admin/departments/message.php
        new file mode 100644
        index 0000000000..a81a1f977c
        --- /dev/null
        +++ b/resources/lang/ru/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Департамент не существует.',
        +    'assoc_users'	 => 'Департамент в данный момент связан с одним или несколькими пользователями и не может быть удалён. Удалите или измените связи в пользователях и попробуйте ещё раз. ',
        +    'create' => array(
        +        'error'   => 'Департамент не был создан, попробуйте ещё раз.',
        +        'success' => 'Департамент успешно создан.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Департамент не был изменён, попробуйте ещё раз',
        +        'success' => 'Департамент успешно изменён.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Вы уверены, что хотите удалить этот департамент?',
        +        'error'   => 'При удалении департамента возникла проблема. Пожалуйста, попробуйте ещё раз.',
        +        'success' => 'Департамент был успешно удалён.'
        +    )
        +
        +);
        diff --git a/resources/lang/ru/admin/departments/table.php b/resources/lang/ru/admin/departments/table.php
        new file mode 100644
        index 0000000000..3c88e259b3
        --- /dev/null
        +++ b/resources/lang/ru/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Название департамента',
        +    'manager'                   => 'Руководитель',
        +    'location'                  => 'Расположение',
        +    'create'                    => 'Создать департамент',
        +    'update'                    => 'Изменить департамент',
        +    );
        diff --git a/resources/lang/ru/admin/depreciations/general.php b/resources/lang/ru/admin/depreciations/general.php
        index de74ea00d2..8043ef5dd9 100644
        --- a/resources/lang/ru/admin/depreciations/general.php
        +++ b/resources/lang/ru/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'О износе активов',
             'about_depreciations'  					=> 'Этот раздел служит для настройки расчета вычисления степени износа активов.',
             'asset_depreciations'  					=> 'Износ активов',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Создать амортизацию',
             'depreciation_name'  					=> 'Название амортизации',
             'number_of_months'  					=> 'Количество месяцев',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Обновить амортизацию',
         
         );
        diff --git a/resources/lang/ru/admin/groups/titles.php b/resources/lang/ru/admin/groups/titles.php
        index 2a1a0ec168..c20033be18 100644
        --- a/resources/lang/ru/admin/groups/titles.php
        +++ b/resources/lang/ru/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'О группах',
        +    'about_groups'                  => 'Группы используются для обобщения разрешений пользователей.',
             'group_management' 	 	=> 'Управление группой',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Создать новую группу',
        +    'update' 	 		        => 'Редактировать группу',
             'group_name' 	 		=> 'Название группы',
             'group_admin' 	 		=> 'Администратор группы',
             'allow' 	 			=> 'Разрешить',
        diff --git a/resources/lang/ru/admin/hardware/form.php b/resources/lang/ru/admin/hardware/form.php
        index b958d7882f..9642bfa271 100644
        --- a/resources/lang/ru/admin/hardware/form.php
        +++ b/resources/lang/ru/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> 'Подвердите массовое удаление активов',
           'bulk_delete_help'	=> 'Просмотрите активны, выбранные для удаления. После удаления активы могут быть восстановлены, но уже не будет привязаны к пользователям, к которым они привязаны сейчас.',
           'bulk_delete_warn'	=> 'Вы собираетесь удалить :asset_count активов.',
         	'bulk_update'		=> 'Редактировать выбранное',
        diff --git a/resources/lang/ru/admin/hardware/general.php b/resources/lang/ru/admin/hardware/general.php
        index 8c311e0f3f..8948efd118 100644
        --- a/resources/lang/ru/admin/hardware/general.php
        +++ b/resources/lang/ru/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Об активах',
        +    'about_assets_text'            => 'Активы - вещи, которые отслеживаются по серийному номеру или инвентарному номеру. Они, как правило, являются ценными.',
         	'archived'  				=> 'Архивированные',
             'asset'  					=> 'Актив',
        -    'bulk_checkout'             => 'Checkout Assets to User',
        +    'bulk_checkout'             => 'Выдать активы пользователю',
             'checkin'  					=> 'Вернуть актив на склад',
        -    'checkout'  				=> 'Выдать актив пользователю',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Клонировать актив',
             'deployable'  				=> 'Доступные',
             'deleted'  					=> 'Этот актив был удален. <a href="/hardware/:asset_id/restore">Нажмите, чтобы восстановить</a>.',
        @@ -15,7 +15,7 @@ return array(
         	'filetype_info'				=> 'Разрешенные типы файлов: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, и rar.',
             'model_deleted'  			=> 'Эта модель актива была удалена. Необходимо сначала восстановить модель актива прежде чем восстанавливать сам актив.<br/> <a href="/hardware/models/:model_id/restore">Нажмите здесь, чтобы восстановить модель</a>.',
             'requestable'               => 'Готов к выдаче',
        -    'requested'				    => 'Requested',
        +    'requested'				    => 'Запрошенное',
             'restore'  					=> 'Восстановить актив',
             'pending'  					=> 'Ожидание',
             'undeployable'  			=> 'Выданные',
        diff --git a/resources/lang/ru/admin/hardware/message.php b/resources/lang/ru/admin/hardware/message.php
        index 78ddfd59a9..32f362e593 100644
        --- a/resources/lang/ru/admin/hardware/message.php
        +++ b/resources/lang/ru/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Актив успешно восстановлен.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Не удалось удалить файл. Повторите попытку.',
                 'success' => 'Файл успешно удален.',
        @@ -37,17 +43,18 @@ return array(
             ),
         
             'import' => array(
        -        'error'                 => 'Some items did not import correctly.',
        -        'errorDetail'           => 'The following Items were not imported because of errors.',
        -        'success'               => "Your file has been imported",
        -        'file_delete_success'   => "Your file has been been successfully deleted",
        -        'file_delete_error'      => "The file was unable to be deleted",
        +        'error'                 => 'Некоторые элементы не были импортированы корректно.',
        +        'errorDetail'           => 'Следующие элементы не были импортированы из за ошибок.',
        +        'success'               => "Ваш файл был импортирован",
        +        'file_delete_success'   => "Ваш файл был успешно удален",
        +        'file_delete_error'      => "Невозможно удалить файл",
             ),
         
         
             'delete' => array(
                 'confirm'   	=> 'Вы уверены что хотите удалить этот актив?',
                 'error'   		=> 'При удалении актива возникла проблема. Пожалуйста попробуйте снова.',
        +        'nothing_updated'   => 'Ни один из активов не выбран, поэтому ничего не удалено.',
                 'success' 		=> 'Актив был успешно удален.'
             ),
         
        @@ -55,7 +62,7 @@ return array(
                 'error'   		=> 'Актив не был привязан, пожалуйста попробуйте снова',
                 'success' 		=> 'Актив успешно привязан.',
                 'user_does_not_exist' => 'Этот пользователь является недопустимым. Пожалуйста, попробуйте еще раз.',
        -        'not_available' => 'That asset is not available for checkout!'
        +        'not_available' => 'Данный актив недоступен к выдаче!'
             ),
         
             'checkin' => array(
        @@ -69,7 +76,7 @@ return array(
             'requests' => array(
                 'error'   		=> 'Актив не был запрошен, попробуйте ещё раз',
                 'success' 		=> 'Актив запрошен успешно.',
        -        'canceled'      => 'Checkout request successfully canceled'
        +        'canceled'      => 'Запрос актива успешно отменен'
             )
         
         );
        diff --git a/resources/lang/ru/admin/licenses/general.php b/resources/lang/ru/admin/licenses/general.php
        index 9fca547080..7b5f736bcc 100644
        --- a/resources/lang/ru/admin/licenses/general.php
        +++ b/resources/lang/ru/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'О лицензиях',
        +    'about_licenses'                  => 'Лицензии используются для отслеживания программного обеспечения.  Как правило, количество пользователей, которые могут их использовать - ограничено',
             'checkin'  					=> 'Отвязать лицензию',
             'checkout_history'  		=> 'История привязок',
             'checkout'  				=> 'Привязать лицензию',
        diff --git a/resources/lang/ru/admin/licenses/message.php b/resources/lang/ru/admin/licenses/message.php
        index 216cf28f6a..83447de677 100644
        --- a/resources/lang/ru/admin/licenses/message.php
        +++ b/resources/lang/ru/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => 'Не удалось загрузить файл(ы). Повторите попытку.',
                 'success' => 'Файл(ы) успешно загружены.',
                 'nofiles' => 'Не выбрано ни одного файла для загрузки или файл, который вы пытаетесь загрузить, слишком большой',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => 'Один из ваших файлов слишком большой или имеет запрещенный тип файла. Резрешенные типы файлов: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, и lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/ru/admin/locations/table.php b/resources/lang/ru/admin/locations/table.php
        index 7e6b6d7203..e8d0e53cf7 100644
        --- a/resources/lang/ru/admin/locations/table.php
        +++ b/resources/lang/ru/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => 'О местонахождениях',
        +    'about_locations'           => 'Местонахождения используются для отслеживания информации о месте находжения активов, и прочих элементов',
             'assets_rtd'                => 'Активы', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Присвоенные активы',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Размещения',
             'parent'                    => 'Родитель',
             'currency'                  => 'Валюта местонахождения',
        +    'ldap_ou'                   => 'Поиск в LDAP OU',
             );
        diff --git a/resources/lang/ru/admin/manufacturers/table.php b/resources/lang/ru/admin/manufacturers/table.php
        index d27619c14e..c878296418 100644
        --- a/resources/lang/ru/admin/manufacturers/table.php
        +++ b/resources/lang/ru/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'О производителях',
        +    'about_manufacturers_text'  => 'Производители - компании, создающие ваши активы. Вы можете хранить здесь важные контактные данные, которые будут отображаться вместе с подробностями о ваших активах.',
             'asset_manufacturers'	=> 'Производители оборудования',
             'create'				=> 'Создать производителя',
             'id'   					=> 'ID',
        -    'name'      			=> 'Название производителя',
        +    'name'      			=> 'Название',
        +    'support_email'   		=> 'Электронная почта поддержки',
        +    'support_phone'   		=> 'Телефон поддержки',
        +    'support_url'   		=> 'Страница поддержки',
             'update'				=> 'Обновить производителя',
        +    'url'   				=> 'Адрес',
         
         );
        diff --git a/resources/lang/ru/admin/models/general.php b/resources/lang/ru/admin/models/general.php
        index 36a6b45266..42e6355956 100644
        --- a/resources/lang/ru/admin/models/general.php
        +++ b/resources/lang/ru/admin/models/general.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'О моделях активов',
        +    'about_models_text'           => 'Модели активов это способ группировки идентичных активов. Например, "MacBookPro 2013, iPhone 6s", и т. д.',
             'deleted'  					        => 'Эта модель была удалена. <a href="/hardware/models/:model_id/restore">Нажмите здесь, чтобы восстановить</a>.',
             'restore'                   => 'Восстановить модель',
        -    'requestable'               => 'Users may request this model',
        +    'requestable'               => 'Данная модель может быть запрошена пользователем',
         	'show_mac_address'			      => 'Отображать поле MAC адрес для данной модели',
             'view_deleted'              => 'Просмотр удаленных',
             'view_models'               => 'Просмотр моделей',
        diff --git a/resources/lang/ru/admin/models/message.php b/resources/lang/ru/admin/models/message.php
        index 22eada7a6d..1c9687421b 100644
        --- a/resources/lang/ru/admin/models/message.php
        +++ b/resources/lang/ru/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Модель успешно восстановлена.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'Никаких изменений нет, поэтому ничего не обновлено.',
        +        'success' 		=> 'Модели обновлены.'
        +    ),
        +
         );
        diff --git a/resources/lang/ru/admin/settings/general.php b/resources/lang/ru/admin/settings/general.php
        index 99cb6d9199..bab6914b24 100644
        --- a/resources/lang/ru/admin/settings/general.php
        +++ b/resources/lang/ru/admin/settings/general.php
        @@ -2,14 +2,18 @@
         
         return array(
             'ad'				        => 'Active Directory',
        -    'ad_domain'				    => 'Active Directory domain',
        -    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        -    'is_ad'				        => 'This is an Active Directory server',
        +    'ad_domain'				    => 'Домен Active Directory',
        +    'ad_domain_help'			=> 'Обычно, то же, что и ваш домен, но не всегда.',
        +    'is_ad'				        => 'У вас сервер Active Directory',
         	'alert_email'				=> 'Посылать уведомления на',
         	'alerts_enabled'			=> 'Уведомления включены',
        -	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        -	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'alert_interval'			=> 'Предупреждение об истечении срока (в днях)',
        +	'alert_inv_threshold'		=> 'Порог оповещения о запасах',
         	'asset_ids'					=> 'ID актива',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Генерировать автоматическое возрастание идентификационных номеров активов',
         	'auto_increment_prefix'		=> 'Префикс ( не обязательно )',
         	'auto_incrementing_help'    => 'Включить автоматические возрастание ID активов начиная с',
        @@ -26,10 +30,10 @@ return array(
             'display_asset_name'        => 'Отображаемое имя актива',
             'display_checkout_date'     => 'Отображать дату выдачи',
             'display_eol'               => 'Отображать дату истечения срока гарантии в таблице',
        -    'display_qr'                => 'Display Square Codes',
        -	'display_alt_barcode'		=> 'Display 1D barcode',
        -	'barcode_type'				=> '2D Barcode Type',
        -	'alt_barcode_type'			=> '1D barcode type',
        +    'display_qr'                => 'Отображать QR коды',
        +	'display_alt_barcode'		=> 'Показывать штрих-коды',
        +	'barcode_type'				=> 'Тип 2D штрихкода',
        +	'alt_barcode_type'			=> 'Тип линейного штрихкода',
             'eula_settings'				=> 'Настройки лицензионного соглашения',
             'eula_markdown'				=> 'Это EULA поддерживает <a href="https://help.github.com/articles/github-flavored-markdown/">форматирование Github flavored markdown</a>.',
             'general_settings'			=> 'Общие настройки',
        @@ -41,18 +45,18 @@ return array(
             'ldap_integration'          => 'Интеграция LDAP',
             'ldap_settings'             => 'Настройка LDAP',
             'ldap_server'               => 'Сервер LDAP',
        -    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        +    'ldap_server_help'          => 'Должен начинаться с ldap:// (для незашифрованных или TLS соединений) или ldaps:// (SSL)',
         	'ldap_server_cert'			=> 'Подтверждение SSL сертификата LDAP',
         	'ldap_server_cert_ignore'	=> 'Разрешить невалидный SSL сертификат',
         	'ldap_server_cert_help'		=> 'Выберите галочку если вы используете самоподписанный SSL сертификат и хотите принять невалидный SSL сертификат.',
        -    'ldap_tls'                  => 'Use TLS',
        -    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        +    'ldap_tls'                  => 'Использовать TLS',
        +    'ldap_tls_help'             => 'Отметьте, только если у вас запущен STARTTLS на вашем LDAP сервере. ',
             'ldap_uname'                => 'Имя пользователя LDAP Bind',
             'ldap_pword'                => 'Пароль LDAP Bind',
             'ldap_basedn'               => 'Основной Bind DN',
             'ldap_filter'               => 'Фильтр LDAP',
        -    'ldap_pw_sync'              => 'LDAP Password Sync',
        -    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_pw_sync'              => 'LDAP синхронизация паролей',
        +    'ldap_pw_sync_help'         => 'Снимите галку, если вы не хотите синхронизировать LDAP пароли с локальными. Отключение этого означает, что ваши пользователи не смогут зайти в систему, если ваш LDAP сервер станет недоступным.',
             'ldap_username_field'       => 'Поле имени пользователя',
             'ldap_lname_field'          => 'Фамилия',
             'ldap_fname_field'          => 'LDAP Имя',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'Email LDAP',
             'load_remote_text'          => 'Внешние скрипты',
             'load_remote_help_text'		=> 'Данная установка Snipe-IT может загружать внешние скрипты.',
        +    'login_note'                => 'Комментарий для экрана логина',
        +    'login_note_help'           => 'Опционально выводит несколько предложений на экране логина. Например, чтобы помочь людям, которые нашли потерянное или украденное устройство. Здесь можно использовать <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Логотип',
             'full_multiple_companies_support_help_text' => 'Ограничить доступ пользователям (включая админов) только активами их компаний.',
             'full_multiple_companies_support_text' => 'Полная поддержка нескольких компаний',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Версия PHP',
             'php_gd_info'               => 'Для отображения QR кодов необходимо установить модуль php-gd.',
             'php_gd_warning'            => 'Библиотеки PHP Image Processing и GD plugin не установлены.',
        +    'pwd_secure_complexity'     => 'Сложность пароля',
        +    'pwd_secure_complexity_help' => 'Выберете необходимые вам правила сложности паролей.',
        +    'pwd_secure_min'            => 'Минимальное количество символов',
        +    'pwd_secure_min_help'       => 'Минимальное значение — 5',
        +    'pwd_secure_uncommon'       => 'Запретить простые пароли',
        +    'pwd_secure_uncommon_help'  => 'Запретит пользователям использовать пароли входящие в 10 000 самых популярных.',
             'qr_help'                   => 'Включить QR коды',
             'qr_text'                   => 'Текст QR кода',
             'setting'                   => 'Настройка',
        @@ -90,44 +102,47 @@ return array(
             'about_settings_text'       => 'Эти настройки позволяют персонализировать некоторые аспекты вашей установки.',
             'labels_per_page'           => 'Этикеток на странице',
             'label_dimensions'          => 'Размеры наклеек (в дюймах)',
        +    'next_auto_tag_base'        => 'Следующий автоинкремент',
             'page_padding'             => 'Поля страницы (в дюймах)',
             'purge'                    => 'Очистка удалённых записей',
        -    'labels_display_bgutter'    => 'Label bottom gutter',
        -    'labels_display_sgutter'    => 'Label side gutter',
        -    'labels_fontsize'           => 'Label font size',
        -    'labels_pagewidth'          => 'Label sheet width',
        -    'labels_pageheight'         => 'Label sheet height',
        -    'label_gutters'        => 'Label spacing (inches)',
        -    'page_dimensions'        => 'Page dimensions (inches)',
        -    'label_fields'          => 'Label visible fields',
        -    'inches'        => 'inches',
        -    'width_w'        => 'w',
        -    'height_h'        => 'h',
        +    'labels_display_bgutter'    => 'Метка внизу страницы',
        +    'labels_display_sgutter'    => 'Метка сбоку страницы',
        +    'labels_fontsize'           => 'Размер шрифта метки',
        +    'labels_pagewidth'          => 'Ширина ярлыка',
        +    'labels_pageheight'         => 'Высота ярлыка',
        +    'label_gutters'        => 'Интервал ярлыков (дюймы)',
        +    'page_dimensions'        => 'Размер страницы (дюймы)',
        +    'label_fields'          => 'Видимые поля ярлыков',
        +    'inches'        => 'дюймы',
        +    'width_w'        => 'ширина',
        +    'height_h'        => 'высота',
             'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'thumbnail_max_h'   => 'Максимальная высота иконки',
        +    'thumbnail_max_h_help'   => 'Максимальная высота в пикселях для отображения в списке. Минимум 25, максимум 500.',
        +    'two_factor'        => 'Двухфакторная аутентификация',
        +    'two_factor_secret'        => 'Двухфакторный код',
        +    'two_factor_enrollment'        => 'Двухфакторная регистрация',
        +    'two_factor_enabled_text'        => 'Включить двухфакторную аутентификацию',
        +    'two_factor_reset'        => 'Сбросить двухфакторный секрет',
        +    'two_factor_reset_help'        => 'Это заставит пользователя снова регистрировать свое устройство с помощью Google Authenticator. Это может быть полезно, если их зарегистрированное устройство потеряно или украдено. ',
        +    'two_factor_reset_success'          => 'Двухфакторное устройство успешно сброшено',
        +    'two_factor_reset_error'          => 'Ошибка сброса двухфакторного устройства',
        +    'two_factor_enabled_warning'        => 'Если включить двухфакторный режим (если он в данный момент не включен) вы сразу же будете вынуждены проходить аутентификацию на устройстве, зарегистрированном в Google Auth. У вас будет возможность зарегистрировать свое устройство, если оно не зарегистрировано.',
        +    'two_factor_enabled_help'        => 'Это включит двухфакторную проверку подлинности с помощью Google Authenticator.',
        +    'two_factor_optional'        => 'Выборочно (пользователи могут включить или отключить если разрешено)',
        +    'two_factor_required'        => 'Требуется для всех пользователей',
        +    'two_factor_disabled'        => 'Выключен',
        +    'two_factor_enter_code'	=> 'Введите Двухфакторный код',
        +    'two_factor_config_complete'	=> 'Подтвердить код',
        +    'two_factor_enabled_edit_not_allowed' => 'Ваш администратор не позволяет изменять этот параметр.',
        +    'two_factor_enrollment_text'	=> "Требуется двухфакторная аутентификация, однако ваше устройство еще не зарегистрировано. Откройте приложение Google Authenticator и отсканируйте QR-код ниже, чтобы зарегистрировать свое устройство. После того, как вы зарегистрируете свое устройство, введите приведенный ниже код",
        +    'require_accept_signature'      => 'Требуется подпись',
        +    'require_accept_signature_help_text'      => 'Включение этой функции потребует от пользователей физического выхода из системы при принятии актива.',
             'left'        => 'слева',
             'right'        => 'справа',
             'top'        => 'сверху',
             'bottom'        => 'снизу',
             'vertical'        => 'вертикально',
             'horizontal'        => 'горизонтально',
        -    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +    'zerofill_count'        => 'Длина инвентарного номера, включая заполнение нулями',
         );
        diff --git a/resources/lang/ru/admin/settings/message.php b/resources/lang/ru/admin/settings/message.php
        index d441532e4e..dcf4d4bb8c 100644
        --- a/resources/lang/ru/admin/settings/message.php
        +++ b/resources/lang/ru/admin/settings/message.php
        @@ -14,9 +14,9 @@ return array(
                 'file_not_found'        => 'Эта резервная копия не найдена на сервере.',
             ),
             'purge' => array(
        -        'error'     => 'An error has occurred while purging. ',
        -        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        -        'success'               => 'Deleted records successfully purged.'
        +        'error'     => 'Возникла ошибка при попытке очистки. ',
        +        'validation_failed'     => 'Ваш текст подтверждения очистки неверен. Пожалуйста, наберите слово "DELETE" в поле подтверждения.',
        +        'success'               => 'Удаленные записи успешно очищены.'
             ),
         
         );
        diff --git a/resources/lang/ru/admin/statuslabels/message.php b/resources/lang/ru/admin/statuslabels/message.php
        index 619a5a509c..eae24e17b0 100644
        --- a/resources/lang/ru/admin/statuslabels/message.php
        +++ b/resources/lang/ru/admin/statuslabels/message.php
        @@ -2,24 +2,24 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        -    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +    'does_not_exist' => 'Ярлык состояния не существует.',
        +    'assoc_assets'	 => 'Этот ярлык состояния связан как минимум с одним активом и не может быть удален. Измените состояние ваших активов и попробуйте ещё раз. ',
         
         
             'create' => array(
        -        'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'Status Label created successfully.'
        +        'error'   => 'Ярлык состояния не создан, попробуйте еще раз.',
        +        'success' => 'Ярлык состояния успешно создан.'
             ),
         
             'update' => array(
        -        'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'Status Label updated successfully.'
        +        'error'   => 'Ярлык состояния не обновлен, попробуйте еще раз',
        +        'success' => 'Ярлык состояния успешно обновлен.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        -        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        -        'success' => 'The Status Label was deleted successfully.'
        +        'confirm'   => 'Вы уверены что хотите удалить это состояние?',
        +        'error'   => 'При удалении состояния возникла проблема. Пожалуйста попробуйте снова.',
        +        'success' => 'Ярлык состояние был успешно удален.'
             )
         
         );
        diff --git a/resources/lang/ru/admin/statuslabels/table.php b/resources/lang/ru/admin/statuslabels/table.php
        index 99496d6907..5f6135dcbd 100644
        --- a/resources/lang/ru/admin/statuslabels/table.php
        +++ b/resources/lang/ru/admin/statuslabels/table.php
        @@ -4,13 +4,13 @@ return array(
             'about'      	=> 'Справка по статусам активов',
             'archived'      	=> 'Архивные',
             'create'      	=> 'Создать статус актива',
        -    'color'      	=> 'Chart Color',
        +    'color'      	=> 'Цвет диаграммы',
             'deployable'      	=> 'Доступные',
             'info'      	=> 'Статус активов необходим для отслеживания состояния активов. Активы могут быть утеряны, находится в сервисных центрах, в архиве либо быть готовыми к использованию.',
             'name'      	=> 'Название статуса',
             'pending'      	=> 'Ожидающие',
             'status_type'   => 'Тип статуса',
        -    'show_in_nav'   => 'Show in side nav',
        +    'show_in_nav'   => 'Показать в боковой панели',
             'title'      	=> 'Статус активов',
             'undeployable'  => 'Недоступные',
             'update'      	=> 'Изменить статус актива',
        diff --git a/resources/lang/ru/admin/suppliers/table.php b/resources/lang/ru/admin/suppliers/table.php
        index 9de883dcbb..595bafe581 100644
        --- a/resources/lang/ru/admin/suppliers/table.php
        +++ b/resources/lang/ru/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'О поставщиках',
        +    'about_suppliers_text'  => 'Поставщики используются для отслеживания источника поставок',
             'address'               => 'Адрес поставщика',
             'assets'                => 'Активы',
             'city'                  => 'Город',
        diff --git a/resources/lang/ru/admin/users/general.php b/resources/lang/ru/admin/users/general.php
        index 135f5dc5a7..208dfe78df 100644
        --- a/resources/lang/ru/admin/users/general.php
        +++ b/resources/lang/ru/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Актив привязан к :name',
        -    'current_assets'    => 'Assets currently checked out to this user',
        +    'bulk_update_warn'	=> 'Вы собираетесь изменить свойства :user_count пользователей. Пожалуйста, обратите внимание, что вы не сможете изменить ваши собственные атрибуты используя эту форму. Если вам нужно изменить атрибуты своего профиля, то внесите изменения отдельно.',
        +    'bulk_update_help'	=> 'Эта форма позволяет Вам обновить несколько пользователей за раз. Заполняйте только те поля, которые нужно изменить. Пустые поля останутся без изменений.',
        +    'current_assets'    => 'Активы, выданные данному пользователю',
             'clone'             => 'Клонировать пользователя',
             'contact_user'      => 'Связаться с :name',
             'edit'              => 'Редактировать пользователя',
             'filetype_info'     => 'Разрешенные типы файлов: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, и rar.',
             'history_user'      => 'История для :name',
        +	'info'				=> 'Информация',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Последний вход',
        -    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'ldap_config_text'  => 'Параметры конфигурации LDAP можно найти Администратор > Параметры. Выбранное местоположение будет установлено для всех импортируемых пользователей. (Необязательно).',
             'software_user'     => 'Программное обеспечение привязано к :name',
             'view_user'         => 'Показать пользователя :name',
             'usercsv'           => 'CSV файл',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'Ваши текущие параметры администрирования разрешают избирательное применение двухфакторной аутентификации.  ',
        +    'two_factor_enrolled' => 'Устройства для 2-ух факторной аутентификации настроены ',
        +    'two_factor_active'   => 'Устройства для 2-ух факторной аутентификации активны ',
             );
        diff --git a/resources/lang/ru/admin/users/message.php b/resources/lang/ru/admin/users/message.php
        index 2d8142c1d4..6c717a6ee4 100644
        --- a/resources/lang/ru/admin/users/message.php
        +++ b/resources/lang/ru/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Вы успешно приняли актив.',
             'declined'                  => 'Вы успешно отклонили актив.',
        +    'bulk_manager_warn'	        => 'Ваши пользователи были успешно обновлены, однако запись менеджера не была сохранена, потому что выбранный менеджер также присутствовал в редактируемом списке пользователей, и пользователи не могут быть менеджерами самим себе. Пожалуйста выберите ваших пользователей снова, за исключением их менеджера.',
             'user_exists'               => 'Пользователь уже существует!',
             'user_not_found'            => 'Пользователь [:id] не существует.',
             'user_login_required'       => 'Поле "Логин" является обязательным',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Пользователь успешно создан.',
                 'update'    => 'Пользователь успешно изменен.',
        +        'update_bulk'    => 'Пользователи успешно изменены!',
                 'delete'    => 'Пользователь успешно удален.',
                 'ban'       => 'Пользователь успешно заблокирован.',
                 'unban'     => 'Пользователь успешно разблокирован.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'При создании пользователя возникла проблема. Пожалуйста попробуйте снова.',
                 'update' => 'При изменении пользователя возникла проблема. Пожалуйста попробуйте снова.',
                 'delete' => 'При удалении пользователя возникла проблема. Пожалуйста попробуйте снова.',
        +        'delete_has_assets' => 'У пользователя есть назначенные ему активы и не может быть удалён.',
                 'unsuspend' => 'При разморозке пользователя возникла проблема. Пожалуйста попробуйте снова.',
                 'import'    => 'При импорте пользователей произошла ошибка. Попробуйте еще раз.',
                 'asset_already_accepted' => 'Этот актив уже был принят.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Не могу связаться (bind) с сервером LDAP. Проверьте настройки LDAP сервера в файле конфигурации LDAP.<br>Ошибка от LDAP сервера: ',
                 'ldap_could_not_search' => 'Не могу найти сервер LDAP. Проверьте настройки LDAP сервера в файле конфигурации LDAP.<br>Ошибка от LDAP сервера:',
                 'ldap_could_not_get_entries' => 'Не могу загрузить записи с сервера LDAP. Проверьте настройки LDAP сервера в файле конфигурации LDAP.<br>Ошибка от LDAP сервера:',
        +        'password_ldap' => 'Пароль для этой учетной записи управляется LDAP/Active Directory. Пожалуйста, свяжитесь с департаментом ИТ, чтобы изменить свой пароль. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/ru/admin/users/table.php b/resources/lang/ru/admin/users/table.php
        index fdf95717f8..128ed8a3cb 100644
        --- a/resources/lang/ru/admin/users/table.php
        +++ b/resources/lang/ru/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Активен',
             'allow'  				=> 'Разрешить',
             'checkedout'  			=> 'Активы',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Расположение',
             'lock_passwords'		=> 'Подробности логина не могут быть изменены на этой конфигурации.',
             'manager' 				=> 'Руководитель',
        +    'managed_locations'     => 'Управляемые расположения',
             'name' 					=> 'Имя',
             'notes'                 => 'Заметки',
             'password_confirm' 		=> 'Подтверждение пароля',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Показать текущих пользователей',
             'show_deleted'          => 'Показать удаленных пользователей',
             'title' 				=> 'Название',
        +	'to_restore_them'		=> 'чтобы восстановить их.',
             'updateuser' 			=> 'Обновить пользователя',
             'username' 				=> 'Имя Пользователя',
        +	'user_deleted_text' 	=> 'Этот пользователь был помечен как удаленный.',
             'username_note' 		=> '(Это используется для связи с Active Directory, а не для входа.)',
             'cloneuser'             => 'Дублировать пользователя',
             'viewusers' 			=> 'Просмотр пользователей',
        diff --git a/resources/lang/ru/auth/message.php b/resources/lang/ru/auth/message.php
        index ac6ba19014..9791302fa2 100644
        --- a/resources/lang/ru/auth/message.php
        +++ b/resources/lang/ru/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Эта учетная запись не активирована.',
             'account_suspended'      => 'Эта учетная запись приостановлена.',
             'account_banned'         => 'Эта учетная запись заблокирована.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Слишком много неудачных попыток входа. Пожалуйста, попробуйте через :minutes минут.',
         
             'signin' => array(
                 'error'   => 'При попытке входа возникла проблема, пожалуйста попробуйте позже.',
        diff --git a/resources/lang/ru/button.php b/resources/lang/ru/button.php
        index 2d82ad5680..def0163e07 100644
        --- a/resources/lang/ru/button.php
        +++ b/resources/lang/ru/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Действия',
             'add'    	                => 'Добавить',
             'cancel'                    => 'Отмена',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Требовать',
             'submit'  	                => 'Принять',
             'upload'                    => 'Загрузка',
        -
        +	'select_file'				=> 'Выберите файл...',
         );
        diff --git a/resources/lang/ru/general.php b/resources/lang/ru/general.php
        index 0bb0fbf1c7..45b24f8b5e 100644
        --- a/resources/lang/ru/general.php
        +++ b/resources/lang/ru/general.php
        @@ -18,42 +18,54 @@
             'asset_report'          => 'Отчет по активам',
             'asset_tag'				=> 'Тег актива',
             'assets_available'		=> 'Доступные активы',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Активы',
             'avatar_delete'         => 'Удалить аватар',
             'avatar_upload'         => 'Загрузить аватар',
             'back'      			=> 'Назад',
             'bad_data'      		=> 'Ничего не найдено. Что-то неправильно ввели?',
        -    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Массовая выдача',
             'cancel'  				=> 'Отмена',
             'categories'			=> 'Категории',
             'category'				=> 'Категория',
        +    'change' 		        => 'В/Из',
             'changeemail'  			=> 'Изменить адрес почты',
             'changepassword'  		=> 'Изменить пароль',
             'checkin'  				=> 'Привязать',
             'checkin_from'  		=> 'Возврат из',
             'checkout'  			=> 'Отвязать',
             'city'  				=> 'Город',
        +	'click_here'			=> 'Нажмите здесь',
             'companies'			=> 'Компании',
             'company'				=> 'Компания',
             'component'			=> 'Компонент',
             'components'			=> 'Компоненты',
        +	'complete'				=> 'Завершен',
             'consumable'			=> 'Расходный материал',
             'consumables'			=> 'Расходные материалы',
             'country'  				=> 'Страна',
             'create'				=> 'Создать нового',
        -    'created'               => 'Item Created',
        +    'created'               => 'Элемент создан',
             'created_asset'			=> 'Создать актив',
             'created_at' 			=> 'Создано',
        +    'updated_at' 			=> 'Обновлено',
             'currency'  			=> 'Руб.', // this is deprecated
             'current'  				=> 'Текущий',
             'custom_report'         => 'Пользовательский отчет по активам',
             'dashboard'				=> 'Панель мониторинга',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Дата',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Предупреждение!',
        +    'debug_warning_text'         => 'Это приложение выполняется в режиме с включенной отладкой. Это может нарушить конфиденциальность данных, если приложение доступно для внешнего мира. Отключите режим отладки, поменяв значение <code>APP_DEBUG</code> в файле <code>.env</code> на <code>false</code>.',
             'delete'  				=> 'Удалить',
             'deleted'  				=> 'Удалено',
             'delete_seats'  		=> 'Удаленные лицензии',
        +    'departments'           => 'Департаменты',
        +    'department'           => 'Департамент',
             'deployed'				=> 'Развернут',
             'depreciation_report'	=> 'Отчет по амортизации',
             'download'				=> 'Загрузка',
        @@ -79,7 +91,7 @@
             'image_delete'         	=> 'Удалить изображение',
             'image_upload'         	=> 'Загрузить изображение',
             'import'         	    => 'Импорт',
        -    'import-history'        => 'Import History',
        +    'import-history'        => 'История импорта',
             'asset_maintenance'        => 'Обслуживание',
             'asset_maintenance_report' => 'Отчет по обслуживанию',
             'asset_maintenances'       => 'Активы на обслуживании',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Недостаточно прав!',
             'language'				=> 'Язык',
             'last'					=> 'В конец',
        +    'last_login'            => 'Последний вход',
             'last_name'             => 'Фамилия',
             'license'				=> 'Лицензия',
             'license_report'        => 'Отчет по лицензиям',
        @@ -95,27 +108,29 @@
             'list_all'				=> 'Весь список',
             'loading'				=> 'Загрузка',
             'lock_passwords'        => 'Поле не может быть изменено в этой версии.',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'feature_disabled'      => 'Функция отключена в этой версии.',
             'location'              => 'Расположение',
             'locations'				=> 'Места',
             'logout'				=> 'Выйти',
        -    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'lookup_by_tag'     => 'Поиск по тегу актива',
             'manufacturer'			=> 'Производитель',
             'manufacturers'			=> 'Производители',
             'markdown'				=> 'облегченный язык разметки.',
        -    'min_amt'				=> 'мин. количество',
        +    'min_amt'				=> 'Мин Кол-во',
             'min_amt_help'	=> 'Минимальное количество доступных элементов, прежде чем сработает предупреждение.',
             'model_no'				=> 'Модель',
             'months'				=> 'Месяцев',
             'moreinfo'				=> 'Подробнее',
             'name'					=> 'Имя',
             'next'					=> 'Далее',
        -    'new'					=> 'new!',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'новое!',
             'no_depreciation'		=> 'Нет аммортизации',
             'no_results'			=> 'Нет результатов.',
             'no'  					=> 'Нет',
             'notes'  				=> 'Примечания',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Номер заказа',
             'page_menu'				=> 'Показаны элементы _MENU_',
             'pagination_info'		=> 'Показаны _START_ для _END_ _TOTAL_ элементы',
             'pending'				=> 'Ожидание',
        @@ -124,8 +139,8 @@
             'previous'				=> 'Пред',
             'processing'			=> 'Обработка',
             'profile'				=> 'Ваш профиль',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => 'Закупочная цена',
        +    'purchase_date'         => 'Дата закупки',
             'qty'		            => 'Кол-во',
             'quantity'		        => 'Количество',
             'ready_to_deploy'		=> 'Готов к установке',
        @@ -133,36 +148,40 @@
             'remove_company'        => 'Удалить привязку компании',
             'reports'				=> 'Отчеты',
             'requested'				=> 'Запрошено',
        -    'request_canceled'      => 'Request Canceled',
        +    'request_canceled'      => 'Запрос отменен',
             'save'  				=> 'Сохранить',
             'select'				=> 'Выбор',
             'search'				=> 'Поиск',
             'select_category'       => 'Выберите категорию',
        +    'select_department'       => 'Выбрать департамент',
             'select_depreciation'	=> 'Выберите тип амортизации',
             'select_location'		=> 'Выберите местоположение',
             'select_manufacturer'	=> 'Выберите производителя',
             'select_model'			=> 'Выберите модель',
             'select_supplier'		=> 'Выберите поставщика',
             'select_user'			=> 'Выберите пользователя',
        -    'select_date'			=> 'Выберите дату',
        +    'select_date'			=> 'Выберите дату (ГГГГ-ММ-ДД)',
             'select_statuslabel'	=> 'Выбрать статус',
             'select_company'    	=> 'Выберите компанию',
             'select_asset'    		=> 'Выбрать актив',
             'settings'				=> 'Настройки',
             'sign_in'				=> 'Вход',
        -    'signature'             => 'Signature',
        -    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'signature'             => 'Подпись',
        +    'some_features_disabled' => 'ДЕМО РЕЖИМ: Некоторые функции отключены.',
             'site_name'				=> 'Название сайта',
             'state'  				=> 'Область/Регион',
             'status_labels'			=> 'Этикетки',
             'status'    			=> 'Статус',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Поставщик',
             'suppliers'  			=> 'Поставщики',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => 'Вы действительно хотите удалить',
        +    'submit'				=> 'Принять',
        +    'target'                => 'Цель',
        +    'time_and_date_display' => 'Время и дата',
             'total_assets'			=> 'Всего активов',
             'total_licenses'		=> 'Всего лицензий',
        -    'total_accessories'		=> 'total accessories',
        -    'total_consumables'		=> 'total consumables',
        +    'total_accessories'		=> 'всего аксессуаров',
        +    'total_consumables'		=> 'всего расходников',
             'type'  				=> 'Тип',
             'undeployable'			=> 'Не развертываемый',
             'unknown_admin'			=> 'Неизвестный администратор',
        diff --git a/resources/lang/ru/mail.php b/resources/lang/ru/mail.php
        index c9a4fe182d..51b08a3aed 100644
        --- a/resources/lang/ru/mail.php
        +++ b/resources/lang/ru/mail.php
        @@ -1,74 +1,71 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => 'Пользователь отменил запрос элемента на веб-сайте',
        +    'a_user_requested' => 'Пользователь запросил элемент на веб-сайте',
        +    'accessory_name' => 'Аксессуар:',
        +    'additional_notes' => 'Дополнительные Примечания:',
        +    'admin_has_created' => 'Администратор создал аккаунт для вас на :web.',
        +    'asset' => 'Актив:',
        +    'asset_name' => 'Имя актива:',
        +    'asset_requested' => 'Актив запрошен',
        +    'asset_tag' => 'Инвентарный номер актива:',
        +    'assets_warrantee_expiring' => '{1} гарантия на активы истечет в течении 60 дней.|[2,Inf] гарантия на активы                                     истечет в течении 60 дней.',
        +    'assigned_to' => 'Выдано',
        +    'best_regards' => 'С наилучшими пожеланиями,',
        +    'canceled' => 'Отменен:',
        +    'checkin_date' => 'Дата возврата:',
        +    'checkout_date' => 'Дата выдачи:',
        +    'click_to_confirm' => 'Пожалуйста, перейдите по ссылке, чтобы подтвердить ваш :web аккаунт:',
        +    'click_on_the_link_accessory' => 'Пожалуйста, перейдите по ссылке внизу, чтобы подтвердить получение аксессуара.',
        +    'click_on_the_link_asset' => 'Пожалуйста, перейдите по ссылке внизу, чтобы подтвердить получение актива.',
        +    'Confirm_Asset_Checkin' => 'Подтверждение возврата активов.',
        +    'Confirm_Accessory_Checkin' => 'Подтвердить возврат аксессуара.',
        +    'Confirm_accessory_delivery' => 'Подтвердить доставку аксессуара.',
        +    'Confirm_asset_delivery' => 'Подтвердить доставку актива.',
        +    'Confirm_consumable_delivery' => 'Подтвердить доставку расходников.',
        +    'current_QTY' => 'Текущее количество',
        +    'Days' => 'Дни',
        +    'days' => 'Дни',
        +    'expecting_checkin_date' => 'Ожидаемая дата возврата:',
        +    'expires' => 'Истекает',
        +    'Expiring_Assets_Report' => 'Отчет об истечении активов.',
        +    'Expiring_Licenses_Report' => 'Отчет об истечении лицензий.',
        +    'hello' => 'Привет',
        +    'hi' => 'Привет',
        +    'i_have_read' => 'Я прочитал и согласен с условиями использования, и получил этот предмет.',
        +    'item' => 'Предмет:',
        +    'items_below_minimum' => 'Количество {1} ниже минимального порога или скоро закончится. | Количество [2,Inf] ниже минимального порога или скоро закончится.',
        +    'Item_Request_Canceled' => 'Запрос предмета отменен',
        +    'Item_Requested' => 'Предмет запрошен',
        +    'licenses_expiring' => 'Лицензия {1} истекает через 60 дней. | Лицензии [2,Inf] истекают через 60 дней.',
        +    'link_to_update_password' => 'Пожалуйста, перейдите по ссылке, чтобы обновить ваш :web пароль:',
        +    'login_first_admin' => 'Чтобы войти в Snipe-It используйте следующие логин и пароль:',
        +    'login' => 'Логин:',
        +    'Low_Inventory_Report' => 'Отчет о заканчивающихся предметах',
        +    'min_QTY' => 'Мин Кол-во',
        +    'name' => 'Название',
        +    'new_item_checked' => 'Новый предмет был выдан под вашем именем, подробности ниже.',
        +    'password' => 'Пароль:',
        +    'password_reset' => 'Сброс пароля',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Пожалуйста, прочитайте условия использования ниже.',
        +    'read_the_terms_and_click' => 'Пожалуйста, прочитайте условия использования ниже и нажмите на ссылку внизу, чтобы подтвердить, что вы ознакомились и соглашаетесь с условиями использования и получили актив.',
        +    'requested' => 'Запрошено:',
        +    'reset_link' => 'Ваша ссылка на сброс пароля',
        +    'reset_password' => 'Нажмите здесь, чтобы сбросить свой пароль:',
        +    'serial' => 'Серийный номер:',
        +    'supplier' => 'Поставщик',
        +    'tag' => 'Метка',
        +    'test_email' => 'Тестовое сообщение от Snipe-IT',
        +    'test_mail_text' => 'Это тестовое сообщение от Snipe-IT. Если вы его получили, значит почта работает :)',
        +    'the_following_item' => 'Данный предмет был возвращен: ',
        +    'There_are' => '{1}Есть|[2,Inf] Есть',
        +    'to_reset' => 'Чтобы сбросить ваш :web пароль, заполните форму:',
        +    'type' => 'Тип',
        +    'user' => 'Пользователь:',
        +    'username' => 'Логин:',
        +    'welcome' => 'Добро пожаловать, :name',
        +    'welcome_to' => 'Добро пожаловать на :web!',
        +    'your_credentials' => 'Ваш логин и пароль от Snipe-IT',
         );
        diff --git a/resources/lang/ru/passwords.php b/resources/lang/ru/passwords.php
        index 5195a9b77c..7d901369ee 100644
        --- a/resources/lang/ru/passwords.php
        +++ b/resources/lang/ru/passwords.php
        @@ -1,7 +1,7 @@
         <?php
         
         return [
        -    'sent'	        => 'Your password link has been sent!',
        -    'user'			=> 'That user does not exist or does not have an email address associated',
        +    'sent'	        => 'Ваша ссылка с паролем отправлена!',
        +    'user'			=> 'Этот пользователь не существует или адрес его электронной почты не указан',
         ];
         
        diff --git a/resources/lang/ru/validation.php b/resources/lang/ru/validation.php
        index 4096c843f7..f041674754 100644
        --- a/resources/lang/ru/validation.php
        +++ b/resources/lang/ru/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute должен быть принят.",
        -    "active_url"       => ":attribute некорректный URL.",
        -    "after"            => "The :attribute должен быть после :date.",
        -    "alpha"            => ":attribute может содержать только символы.",
        -    "alpha_dash"       => ":attribute может содержать только буквы, цифры и тире.",
        -    "alpha_num"        => ":attribute может содержать только буквы и цифры.",
        -    "before"           => ":attribute должен быть датой до :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute должен быть между :min - :max.",
        -        "file"    => ":attribute должен быть между :min - :max килобайт.",
        -        "string"  => ":attribute должен быть между :min - :max символов.",
        -    ),
        -    "confirmed"        => "Подтверждение :attribute не совпадает.",
        -    "date"             => ":attribute неправильная дата.",
        -    "date_format"      => ":attribute не совпадает с форматом :format.",
        -    "different"        => ":attribute и :other должны быть разными.",
        -    "digits"           => ":attribute должен содержать :digits цифр.",
        -    "digits_between"   => ":attribute должно быть между :min и :max цифр.",
        -    "email"            => "Неправильный формат :attribute.",
        -    "exists"           => "Выбранный :attribute неправильный.",
        -    "email_array"      => "Один или несколько адресов эл. почты являются недействительным.",
        -    "image"            => ":attribute должен быть изображением.",
        -    "in"               => "Выбранный :attribute неправильный.",
        -    "integer"          => ":attribute должно быть числом.",
        -    "ip"               => ":attribute должно быть IP адресом.",
        -    "max"              => array(
        -        "numeric" => ":attribute не должно быть больше :max.",
        -        "file"    => ":attribute не должен превышать :max килобайт.",
        -        "string"  => ":attribute не должно превышать :max символов.",
        -    ),
        -    "mimes"            => ":attribute тип файла должен быть: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute должно быть не менее :min.",
        -        "file"    => ":attribute должно быть не менее :min килобайт.",
        -        "string"  => ":attribute должно быть не менее :min символов.",
        -    ),
        -    "not_in"           => "Выбранный :attribute неправильный.",
        -    "numeric"          => ":attribute должно быть числом.",
        -    "regex"            => "Неправильный формат :attribute.",
        -    "required"         => ":attribute обязательное поле.",
        -    "required_if"      => ":attribute обязательное поле, когда :other :value.",
        -    "required_with"    => ":attribute обязательное поле, когда присутствует :values.",
        -    "required_without" => ":attribute обязательное поле, когда отсутствует :values.",
        -    "same"             => ":attribute и :other должны совпадать.",
        -    "size"             => array(
        -        "numeric" => ":attribute должен быть :size.",
        -        "file"    => ":attribute должен быть :size килобайт.",
        -        "string"  => ":attribute должен быть :size символов.",
        -    ),
        -    "unique"           => ":attribute уже занят.",
        -    "url"              => "Неправильный формат :attribute.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute должен быть принят.',
        +    'active_url'           => ':attribute некорректный URL.',
        +    'after'                => 'The :attribute должен быть после :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute может содержать только символы.',
        +    'alpha_dash'           => ':attribute может содержать только буквы, цифры и тире.',
        +    'alpha_num'            => ':attribute может содержать только буквы и цифры.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute должен быть датой до :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute должен быть между :min - :max.',
        +        'file'    => ':attribute должен быть между :min - :max килобайт.',
        +        'string'  => ':attribute должен быть между :min - :max символов.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute должен быть true или false.',
        +    'confirmed'            => 'Подтверждение :attribute не совпадает.',
        +    'date'                 => ':attribute неправильная дата.',
        +    'date_format'          => ':attribute не совпадает с форматом :format.',
        +    'different'            => ':attribute и :other должны быть разными.',
        +    'digits'               => ':attribute должен содержать :digits цифр.',
        +    'digits_between'       => ':attribute должно быть между :min и :max цифр.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Неправильный формат :attribute.',
        +    'exists'               => 'Выбранный :attribute неправильный.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute должен быть изображением.',
        +    'in'                   => 'Выбранный :attribute неправильный.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute должно быть числом.',
        +    'ip'                   => ':attribute должно быть IP адресом.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute не должно быть больше :max.',
        +        'file'    => ':attribute не должен превышать :max килобайт.',
        +        'string'  => ':attribute не должно превышать :max символов.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute тип файла должен быть: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute должно быть не менее :min.',
        +        'file'    => ':attribute должно быть не менее :min килобайт.',
        +        'string'  => ':attribute должно быть не менее :min символов.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'Выбранный :attribute неправильный.',
        +    'numeric'              => ':attribute должно быть числом.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Неправильный формат :attribute.',
        +    'required'             => ':attribute обязательное поле.',
        +    'required_if'          => ':attribute обязательное поле, когда :other :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute обязательное поле, когда присутствует :values.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute обязательное поле, когда отсутствует :values.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute и :other должны совпадать.',
        +    'size'                 => [
        +        'numeric' => ':attribute должен быть :size.',
        +        'file'    => ':attribute должен быть :size килобайт.',
        +        'string'  => ':attribute должен быть :size символов.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute уже занят.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Неправильный формат :attribute.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Поле :attribute содержит запрещенные символы.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/sv-SE/admin/accessories/table.php b/resources/lang/sv-SE/admin/accessories/table.php
        index e02d9f22e4..e72c3481ab 100644
        --- a/resources/lang/sv-SE/admin/accessories/table.php
        +++ b/resources/lang/sv-SE/admin/accessories/table.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -	'dl_csv'      				=> 'Download CSV',
        +	'dl_csv'      				=> 'Ladda ner CSV',
         	'eula_text'      			=> 'EULA',
             'id'      					=> 'ID',
        -    'require_acceptance'      	=> 'Acceptance',
        -    'title'      				=> 'Accessory Name',
        +    'require_acceptance'      	=> 'Godkännande',
        +    'title'      				=> 'Tillbehörsnamn',
         
         
         );
        diff --git a/resources/lang/sv-SE/admin/asset_maintenances/general.php b/resources/lang/sv-SE/admin/asset_maintenances/general.php
        index 807d776c50..09fa831cb0 100644
        --- a/resources/lang/sv-SE/admin/asset_maintenances/general.php
        +++ b/resources/lang/sv-SE/admin/asset_maintenances/general.php
        @@ -2,9 +2,9 @@
         
             return [
                 'asset_maintenances' => 'Asset Maintenances',
        -        'edit'               => 'Edit Asset Maintenance',
        -        'delete'             => 'Delete Asset Maintenance',
        -        'view'               => 'View Asset Maintenance Details',
        +        'edit'               => 'Redigera inventarieunderhåll',
        +        'delete'             => 'Radera inventarieunderhåll',
        +        'view'               => 'Visa detaljer ang. inventarieunderhåll',
                 'repair'             => 'Reparera',
                 'maintenance'        => 'Underhåll',
                 'upgrade'            => 'Uppgradera'
        diff --git a/resources/lang/sv-SE/admin/asset_maintenances/message.php b/resources/lang/sv-SE/admin/asset_maintenances/message.php
        index ca4256efbe..edf79cf84f 100644
        --- a/resources/lang/sv-SE/admin/asset_maintenances/message.php
        +++ b/resources/lang/sv-SE/admin/asset_maintenances/message.php
        @@ -1,17 +1,21 @@
         <?php
         
             return [
        -        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'not_found'                    => 'Inventarieunderhållet du letade efter kunde inte hittas!',
                 'delete'                       => [
        -            'confirm' => 'Are you sure you wish to delete this asset maintenance?',
        -            'error'   => 'There was an issue deleting the asset maintenance. Please try again.',
        -            'success' => 'The asset maintenance was deleted successfully.'
        +            'confirm' => 'År du säker på att du vill radera inventarieunderhållet?',
        +            'error'   => 'Ett fel uppstod vid radering av inventarieunderhållet. Var god försök igen.',
        +            'success' => 'Inventarieunderhållet raderades.'
                 ],
                 'create'                       => [
        -            'error'   => 'Asset Maintenance was not created, please try again.',
        -            'success' => 'Asset Maintenance created successfully.'
        +            'error'   => 'Inventarieunderhållet skapades inte. Var god försök igen.',
        +            'success' => 'Inventarieunderhållet skapades.'
                 ],
        -        'asset_maintenance_incomplete' => 'Not Completed Yet',
        -        'warranty'                     => 'Warranty',
        -        'not_warranty'                 => 'Not Warranty',
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Inte klar ännu',
        +        'warranty'                     => 'Garanti',
        +        'not_warranty'                 => 'Inte garanti',
             ];
        \ No newline at end of file
        diff --git a/resources/lang/sv-SE/admin/asset_maintenances/table.php b/resources/lang/sv-SE/admin/asset_maintenances/table.php
        index 1a840c9941..edb87b778d 100644
        --- a/resources/lang/sv-SE/admin/asset_maintenances/table.php
        +++ b/resources/lang/sv-SE/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Inventarieunderhåll',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Inventarienamn',
                 'is_warranty'   => 'Garanti',
                 'dl_csv'        => 'Ladda ner CSV'
             ];
        diff --git a/resources/lang/sv-SE/admin/categories/general.php b/resources/lang/sv-SE/admin/categories/general.php
        index 30b6e22186..80e35b78f3 100644
        --- a/resources/lang/sv-SE/admin/categories/general.php
        +++ b/resources/lang/sv-SE/admin/categories/general.php
        @@ -1,22 +1,23 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Om kategorier',
        +    'about_categories'  				=> 'Kategorier hjälper till att organisera objekt. Exempel på kategorier kan vara &quot;Stationära datorer&quot;, &quot;Bärbara datorer&quot;, &quot;Mobiltelefoner&quot;, &quot;surfplattor&quot; och så vidare, men du kan använda kategorier på valfritt sätt som är meningsfullt för dig.',
             'asset_categories' 					=> 'Tillgångskategorier',
             'category_name'  					=> 'Kategorinamn',
        -    'checkin_email'                     => 'Send email to user on checkin.',
        -    'clone'                             => 'Clone Category',
        +    'checkin_email'                     => 'Skicka email till användare vid incheckning.',
        +    'clone'                             => 'Klona kategori',
             'create'  							=> 'Skapa kategori',
        -    'edit'                              => 'Edit Category',
        -    'eula_text'							=> 'Category EULA',
        -    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        -    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        -    'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
        -    'required_eula'						=> 'This user will be emailed a copy of the EULA',
        -    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'edit'                              => 'Redigera kategori',
        +    'eula_text'							=> 'Kategori EULA',
        +    'eula_text_help'					=> 'I detta fält kan du anpassa dina licensavtal för slutanvändare, EULA, för vissa typer av tillgångar. Om du bara har ett licensavtal för alla dina inventarier, kan du markera rutan nedan för att använda standardlicensavtalet.',
        +    'name'                              => 'Kategorinamn',
        +    'require_acceptance'				=> 'Kräv att användare bekräftar mottagande av inventarier i den här kategorin.',
        +    'required_acceptance'				=> 'Användaren kommer att få e-post med en länk för att bekräfta mottagande av detta objekt.',
        +    'required_eula'						=> 'Användaren kommer att få e-post med en kopia av licensavtalet, EULA',
        +    'no_default_eula'					=> 'Ingen standard-licensavtal, EULA, hittades. Lägg till en under Inställningar.',
             'update'  							=> 'Uppdatera kategori',
        -    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        -    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +    'use_default_eula'					=> 'Använd <a href="#" data-toggle="modal" data-target="#eulaModal">standard-licensavtal, EULA</a> istället.',
        +    'use_default_eula_disabled'			=> '<del>Använd den primära licensavtalet, EULA:n, istället.</del> Inget primärt licensavtal, EULA, är satt. Vänligen lägg till en under Inställningar.',
         
         );
        diff --git a/resources/lang/sv-SE/admin/categories/message.php b/resources/lang/sv-SE/admin/categories/message.php
        index 199932d5b0..17421aaa2f 100644
        --- a/resources/lang/sv-SE/admin/categories/message.php
        +++ b/resources/lang/sv-SE/admin/categories/message.php
        @@ -3,8 +3,8 @@
         return array(
         
             'does_not_exist' => 'Kategorin existerar inte. ',
        -    'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
        -    'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
        +    'assoc_models'	 => 'Denna kategori är för närvarande associerad med åtminstone en modell och kan inte raderas. Uppdatera dina modeller så att inga associationer finns till denna kategori och försök igen. ',
        +    'assoc_items'	 => 'Denna kategori är för närvarande associerad med åtminstone en :asset_type och kan inte raderas. Uppdatera din :asset_type så att inga associationer finns till denna kategori och försök igen. ',
         
             'create' => array(
                 'error'   => 'Kategorin blev inte skapad, försök igen.',
        diff --git a/resources/lang/sv-SE/admin/companies/general.php b/resources/lang/sv-SE/admin/companies/general.php
        index f9d34a4a04..548c6e1ff4 100644
        --- a/resources/lang/sv-SE/admin/companies/general.php
        +++ b/resources/lang/sv-SE/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        +    'about_companies_title'            => 'Om företag',
             'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
             'select_company' => 'Välj företag',
         ];
        diff --git a/resources/lang/sv-SE/admin/companies/table.php b/resources/lang/sv-SE/admin/companies/table.php
        index 2f86126ff2..40d1bbb110 100644
        --- a/resources/lang/sv-SE/admin/companies/table.php
        +++ b/resources/lang/sv-SE/admin/companies/table.php
        @@ -1,9 +1,9 @@
         <?php
         return array(
        -    'companies' => 'Companies',
        -    'create'    => 'Create Company',
        -    'title'     => 'Company',
        -    'update'    => 'Update Company',
        -    'name'      => 'Company Name',
        +    'companies' => 'Företag',
        +    'create'    => 'Skapa företag',
        +    'title'     => 'Företag',
        +    'update'    => 'Uppdatera företag',
        +    'name'      => 'Företagsnamn',
             'id'        => 'ID',
         );
        diff --git a/resources/lang/sv-SE/admin/components/general.php b/resources/lang/sv-SE/admin/components/general.php
        index 75c9d250ab..d031a3fa57 100644
        --- a/resources/lang/sv-SE/admin/components/general.php
        +++ b/resources/lang/sv-SE/admin/components/general.php
        @@ -1,17 +1,17 @@
         <?php
         
         return array(
        -    'about_components_title' 			=> 'About Components',
        -    'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        -    'component_name'                  => 'Component Name',
        -    'checkin'                             => 'Checkin Component',
        -    'checkout'                             => 'Checkout Component',
        -    'cost'				=> 'Purchase Cost',
        -    'create'                             => 'Create Component',
        -    'edit'                             => 'Edit Component',
        -    'date'					=> 'Purchase Date',
        -    'order'					=> 'Order Number',
        -    'remaining' 			             => 'Remaining',
        -    'total' 			                 => 'Total',
        -    'update'                            => 'Update Component',
        +    'about_components_title' 			=> 'Om komponenter',
        +    'about_components_text'  			=> 'Komponenter är objekt som ingår i en tillgång, till exempel HDD, RAM, etc.',
        +    'component_name'                  => 'Komponentnamn',
        +    'checkin'                             => 'Checka in komponent',
        +    'checkout'                             => 'Checka ut komponent',
        +    'cost'				=> 'Inköpskostnad',
        +    'create'                             => 'Skapa komponent',
        +    'edit'                             => 'Redigera komponent',
        +    'date'					=> 'Inköpsdatum',
        +    'order'					=> 'Beställningsnummer',
        +    'remaining' 			             => 'Återstående',
        +    'total' 			                 => 'Totalt',
        +    'update'                            => 'Uppdatera komponent',
         );
        diff --git a/resources/lang/sv-SE/admin/consumables/general.php b/resources/lang/sv-SE/admin/consumables/general.php
        index cbacdeef39..aae4fa12f9 100644
        --- a/resources/lang/sv-SE/admin/consumables/general.php
        +++ b/resources/lang/sv-SE/admin/consumables/general.php
        @@ -3,7 +3,7 @@
         return array(
             'about_consumables_title' 			=> 'Om förbrukningsvaror',
             'about_consumables_text'  			=> 'Förbrukningsvaror är sådant som är inköpt och kommer förbrukas över tiden. T.ex. skrivartoner eller kopieringspapper.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'Förbrukningsvaror',
             'consumable_name'                   => 'Namn på förbrukningsvara',
             'create'                            => 'Skapa förbrukningvara',
             'item_no'                           => 'Artikelnummer',
        diff --git a/resources/lang/sv-SE/admin/custom_fields/message.php b/resources/lang/sv-SE/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/sv-SE/admin/custom_fields/message.php
        +++ b/resources/lang/sv-SE/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/sv-SE/admin/departments/message.php b/resources/lang/sv-SE/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/sv-SE/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/sv-SE/admin/departments/table.php b/resources/lang/sv-SE/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/sv-SE/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/sv-SE/admin/hardware/general.php b/resources/lang/sv-SE/admin/hardware/general.php
        index f7644eb730..1def86dc9e 100644
        --- a/resources/lang/sv-SE/admin/hardware/general.php
        +++ b/resources/lang/sv-SE/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Asset',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin Asset',
        -    'checkout'  				=> 'Checkout Asset to User',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Clone Asset',
             'deployable'  				=> 'Deployable',
             'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        diff --git a/resources/lang/sv-SE/admin/hardware/message.php b/resources/lang/sv-SE/admin/hardware/message.php
        index d27ca91573..112cf77ded 100644
        --- a/resources/lang/sv-SE/admin/hardware/message.php
        +++ b/resources/lang/sv-SE/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/sv-SE/admin/locations/table.php b/resources/lang/sv-SE/admin/locations/table.php
        index e171d4dd4e..ffa69307d5 100644
        --- a/resources/lang/sv-SE/admin/locations/table.php
        +++ b/resources/lang/sv-SE/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Locations',
             'parent'                    => 'Parent',
             'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/sv-SE/admin/manufacturers/table.php b/resources/lang/sv-SE/admin/manufacturers/table.php
        index 23fe75860d..845e59a37d 100644
        --- a/resources/lang/sv-SE/admin/manufacturers/table.php
        +++ b/resources/lang/sv-SE/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Tillverkare',
             'create'				=> 'Skapa Tillverkare',
             'id'   					=> 'ID',
        -    'name'      			=> 'Tillverkarens namn',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Uppdatera Tillverkare',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/sv-SE/admin/models/message.php b/resources/lang/sv-SE/admin/models/message.php
        index 2b0de4dfaf..8cf146deef 100644
        --- a/resources/lang/sv-SE/admin/models/message.php
        +++ b/resources/lang/sv-SE/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Modellen återskapades.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/sv-SE/admin/settings/general.php b/resources/lang/sv-SE/admin/settings/general.php
        index 2126ec5cd5..35f87c7a84 100644
        --- a/resources/lang/sv-SE/admin/settings/general.php
        +++ b/resources/lang/sv-SE/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'Inventarienummer',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Generera automatiskt stigande inventarienummer',
         	'auto_increment_prefix'		=> 'Prefix (frivilligt)',
         	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP Version',
             'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
             'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Enable QR Codes first to set this',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'Setting',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/sv-SE/admin/suppliers/message.php b/resources/lang/sv-SE/admin/suppliers/message.php
        index df4bc41af3..f2753d122a 100644
        --- a/resources/lang/sv-SE/admin/suppliers/message.php
        +++ b/resources/lang/sv-SE/admin/suppliers/message.php
        @@ -2,7 +2,7 @@
         
         return array(
         
        -    'does_not_exist' => 'Supplier does not exist.',
        +    'does_not_exist' => 'Leverantören finns inte.',
             'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
         
             'create' => array(
        diff --git a/resources/lang/sv-SE/admin/users/general.php b/resources/lang/sv-SE/admin/users/general.php
        index 92ee04b491..985138d065 100644
        --- a/resources/lang/sv-SE/admin/users/general.php
        +++ b/resources/lang/sv-SE/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Clone User',
             'contact_user'      => 'Contact :name',
             'edit'              => 'Edit User',
             'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Last Login',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Software Checked out to :name',
        diff --git a/resources/lang/sv-SE/admin/users/message.php b/resources/lang/sv-SE/admin/users/message.php
        index a1a9757e86..8ee552afab 100644
        --- a/resources/lang/sv-SE/admin/users/message.php
        +++ b/resources/lang/sv-SE/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'You have successfully accepted this asset.',
             'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'User already exists!',
             'user_not_found'            => 'User [:id] does not exist.',
             'user_login_required'       => 'The login field is required',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'User was successfully created.',
                 'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'User was successfully deleted.',
                 'ban'       => 'User was successfully banned.',
                 'unban'     => 'User was successfully unbanned.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'There was an issue creating the user. Please try again.',
                 'update' => 'There was an issue updating the user. Please try again.',
                 'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
                 'import'    => 'There was an issue importing users. Please try again.',
                 'asset_already_accepted' => 'This asset has already been accepted.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
                 'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
                 'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/sv-SE/admin/users/table.php b/resources/lang/sv-SE/admin/users/table.php
        index 8c9b40a454..9bbe883e19 100644
        --- a/resources/lang/sv-SE/admin/users/table.php
        +++ b/resources/lang/sv-SE/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Active',
             'allow'  				=> 'Allow',
             'checkedout'  			=> 'Assets',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Location',
             'lock_passwords'		=> 'Login details cannot be changed on this installation.',
             'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Name',
             'notes'                 => 'Notes',
             'password_confirm' 		=> 'Confirm Password',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Show Current Users',
             'show_deleted'          => 'Show Deleted Users',
             'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Update User',
             'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Clone User',
             'viewusers' 			=> 'View Users',
        diff --git a/resources/lang/sv-SE/auth/message.php b/resources/lang/sv-SE/auth/message.php
        index 8f5d391148..192129afc3 100644
        --- a/resources/lang/sv-SE/auth/message.php
        +++ b/resources/lang/sv-SE/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Detta användarkonto är inte aktiverat.',
             'account_suspended'      => 'Detta användarkontot har blivit suspenderat.',
             'account_banned'         => 'Detta användarkontot har blivit avstängt.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Det uppstod ett problem när du försökte logga in, försök igen.',
        diff --git a/resources/lang/sv-SE/button.php b/resources/lang/sv-SE/button.php
        index 276678c1e8..a32c69f8dd 100644
        --- a/resources/lang/sv-SE/button.php
        +++ b/resources/lang/sv-SE/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Åtgärder',
             'add'    	                => 'Lägg till ny',
             'cancel'                    => 'Avbryt',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Begäran',
             'submit'  	                => 'Skicka',
             'upload'                    => 'Ladda upp',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/sv-SE/general.php b/resources/lang/sv-SE/general.php
        index 7fd89c39c0..eb1991941d 100644
        --- a/resources/lang/sv-SE/general.php
        +++ b/resources/lang/sv-SE/general.php
        @@ -2,7 +2,7 @@
         
             return [
             'accessories'			=> 'Tillbehör',
        -    'activated'			=> 'Activated',
        +    'activated'			=> 'Aktiverad',
             'accessory'				=> 'Tillbehör',
             'accessory_report'			=> 'Accessory Report',
             'action'                => 'Åtgärd',
        @@ -18,43 +18,55 @@
             'asset_report'          => 'Inventarie Rapport',
             'asset_tag'				=> 'Inventarie Etikett',
             'assets_available'		=> 'tillgängliga inventarier',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Inventarier',
             'avatar_delete'         => 'Ta bort Avatar',
             'avatar_upload'         => 'Ladda upp Avatar',
             'back'      			=> 'Bakåt',
             'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Avbryt',
             'categories'			=> 'Kategorier',
             'category'				=> 'Kategori',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Ändra E-postadress',
             'changepassword'  		=> 'Ändra Lösenord',
             'checkin'  				=> 'Checka in',
             'checkin_from'  		=> 'Checka in från',
             'checkout'  			=> 'Checka ut',
             'city'  				=> 'Ort',
        -    'companies'			=> 'Companies',
        -    'company'				=> 'Company',
        -    'component'			=> 'Component',
        -    'components'			=> 'Components',
        -    'consumable'			=> 'Consumable',
        -    'consumables'			=> 'Consumables',
        +	'click_here'			=> 'Click here',
        +    'companies'			=> 'Företag',
        +    'company'				=> 'Företag',
        +    'component'			=> 'Komponent',
        +    'components'			=> 'Komponenter',
        +	'complete'				=> 'Complete',
        +    'consumable'			=> 'Förbrukningsmaterial',
        +    'consumables'			=> 'Förbrukningsmaterial',
             'country'  				=> 'Land',
             'create'				=> 'Skapa Ny',
             'created'               => 'Item Created',
             'created_asset'			=> 'skapa tillgång',
             'created_at' 			=> 'Skapad',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> 'SEK', // this is deprecated
             'current'  				=> 'Nuvarande',
             'custom_report'         => 'Custom Asset Report',
             'dashboard'				=> 'Översikt',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Datum',
        -    'debug_warning'         => 'Warning!',
        +    'debug_warning'         => 'Varning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Ta bort',
             'deleted'  				=> 'Raderad',
             'delete_seats'  		=> 'Deleted Seats',
        -    'deployed'				=> 'Deployed',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
        +    'deployed'				=> 'Används',
             'depreciation_report'	=> 'Depreciation Report',
             'download'				=> 'Ladda ner',
             'depreciation'			=> 'Depreciation',
        @@ -73,20 +85,21 @@
             'generate'				=> 'Generate',
             'groups'				=> 'Grupper',
             'gravatar_email'        => 'Gravatar Email Address',
        -    'history'  			    => 'History',
        +    'history'  			    => 'Historik',
             'history_for'  			=> 'Historik för',
             'id'  					=> 'ID',
             'image_delete'         	=> 'Ta bort Bild',
             'image_upload'         	=> 'Ladda upp Bild',
        -    'import'         	    => 'Import',
        +    'import'         	    => 'Importera',
             'import-history'        => 'Import History',
        -    'asset_maintenance'        => 'Asset Maintenance',
        +    'asset_maintenance'        => 'Inventarieunderhåll',
             'asset_maintenance_report' => 'Asset Maintenance Report',
             'asset_maintenances'       => 'Asset Maintenances',
             'item'  				=> 'Item',
             'insufficient_permissions' => 'Insufficient permissions!',
        -    'language'				=> 'Language',
        +    'language'				=> 'Språk',
             'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Efternamn',
             'license'				=> 'Licens',
             'license_report'        => 'License Report',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> 'Mer information',
             'name'					=> 'Namn',
             'next'					=> 'Nästa',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
        -    'no_depreciation'		=> 'No Depreciation',
        +    'no_depreciation'		=> 'Ingen avskrivning',
             'no_results'			=> 'Inga resultat.',
             'no'  					=> 'Nej',
             'notes'  				=> 'Anteckningar',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => 'Order Nummer',
             'page_menu'				=> 'Showing _MENU_ items',
             'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
             'pending'				=> 'Pending',
        @@ -125,9 +140,9 @@
             'processing'			=> 'Bearbetar',
             'profile'				=> 'Din profil',
             'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_date'         => 'Inköpsdatum',
             'qty'		            => 'Antal',
        -    'quantity'		        => 'Quantity',
        +    'quantity'		        => 'Antal',
             'ready_to_deploy'		=> 'Ready to Deploy',
             'recent_activity'		=> 'Senaste aktivitet',
             'remove_company'        => 'Remove Company Association',
        @@ -137,14 +152,15 @@
             'save'  				=> 'Spara',
             'select'				=> 'Välj',
             'search'				=> 'Sök',
        -    'select_category'       => 'Select a Category',
        +    'select_category'       => 'Välj en kategori',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Select a Depreciation Type',
             'select_location'		=> 'Select a Location',
             'select_manufacturer'	=> 'Välj Tillverkare',
             'select_model'			=> 'Välj Modell',
             'select_supplier'		=> 'Välj Leverantör',
             'select_user'			=> 'Välj Användare',
        -    'select_date'			=> 'Välj datum',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Select Status',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Status',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'total assets',
             'total_licenses'		=> 'total licenses',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/sv-SE/validation.php b/resources/lang/sv-SE/validation.php
        index 03c7471cab..02cb1fa981 100644
        --- a/resources/lang/sv-SE/validation.php
        +++ b/resources/lang/sv-SE/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/ta/admin/accessories/general.php b/resources/lang/ta/admin/accessories/general.php
        new file mode 100644
        index 0000000000..22771aff0c
        --- /dev/null
        +++ b/resources/lang/ta/admin/accessories/general.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +    'about_accessories_title' 			=> 'About Accessories',
        +    'about_accessories_text'  			=> 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
        +    'accessory_category' 				=> 'Accessory Category',
        +    'accessory_name'  					=> 'Accessory Name',
        +    'checkout'  							=> 'Checkout Accessory',
        +    'checkin'  							=> 'Checkin Accessory',
        +    'create'  							=> 'Create Accessory',
        +    'edit'  							=> 'Edit Accessory',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'total'  							=> 'Total',
        +    'remaining'  						=> 'Avail',
        +    'update'  							=> 'Update Accessory',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/ta/admin/accessories/message.php b/resources/lang/ta/admin/accessories/message.php
        new file mode 100644
        index 0000000000..92998a4e14
        --- /dev/null
        +++ b/resources/lang/ta/admin/accessories/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'The accessory does not exist.',
        +    'assoc_users'	 => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'The accessory was not created, please try again.',
        +        'success' => 'The accessory was successfully created.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'The accessory was not updated, please try again',
        +        'success' => 'The accessory was updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this accessory?',
        +        'error'   => 'There was an issue deleting the accessory. Please try again.',
        +        'success' => 'The accessory was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Accessory was not checked out, please try again',
        +        'success' 		=> 'Accessory checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Accessory was not checked in, please try again',
        +        'success' 		=> 'Accessory checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/ta/admin/accessories/table.php b/resources/lang/ta/admin/accessories/table.php
        new file mode 100644
        index 0000000000..e02d9f22e4
        --- /dev/null
        +++ b/resources/lang/ta/admin/accessories/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +	'dl_csv'      				=> 'Download CSV',
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Accessory Name',
        +
        +
        +);
        diff --git a/resources/lang/ta/admin/asset_maintenances/form.php b/resources/lang/ta/admin/asset_maintenances/form.php
        new file mode 100644
        index 0000000000..2aa005c45f
        --- /dev/null
        +++ b/resources/lang/ta/admin/asset_maintenances/form.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +    return [
        +        'asset_maintenance_type' => 'Maintenance Type',
        +        'title'                  => 'Title',
        +        'start_date'             => 'Started',
        +        'completion_date'        => 'Completed',
        +        'cost'                   => 'Cost',
        +        'is_warranty'            => 'Warranty Improvement',
        +        'asset_maintenance_time' => 'Days',
        +        'notes'                  => 'Notes',
        +        'update'                 => 'Update',
        +        'create'                 => 'Create'
        +    ];
        diff --git a/resources/lang/ta/admin/asset_maintenances/general.php b/resources/lang/ta/admin/asset_maintenances/general.php
        new file mode 100644
        index 0000000000..c7ae42d41a
        --- /dev/null
        +++ b/resources/lang/ta/admin/asset_maintenances/general.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +    return [
        +        'asset_maintenances' => 'Asset Maintenances',
        +        'edit'               => 'Edit Asset Maintenance',
        +        'delete'             => 'Delete Asset Maintenance',
        +        'view'               => 'View Asset Maintenance Details',
        +        'repair'             => 'Repair',
        +        'maintenance'        => 'Maintenance',
        +        'upgrade'            => 'Upgrade'
        +    ];
        diff --git a/resources/lang/ta/admin/asset_maintenances/message.php b/resources/lang/ta/admin/asset_maintenances/message.php
        new file mode 100644
        index 0000000000..d121115825
        --- /dev/null
        +++ b/resources/lang/ta/admin/asset_maintenances/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +    return [
        +        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'delete'                       => [
        +            'confirm' => 'Are you sure you wish to delete this asset maintenance?',
        +            'error'   => 'There was an issue deleting the asset maintenance. Please try again.',
        +            'success' => 'The asset maintenance was deleted successfully.'
        +        ],
        +        'create'                       => [
        +            'error'   => 'Asset Maintenance was not created, please try again.',
        +            'success' => 'Asset Maintenance created successfully.'
        +        ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
        +        'asset_maintenance_incomplete' => 'Not Completed Yet',
        +        'warranty'                     => 'Warranty',
        +        'not_warranty'                 => 'Not Warranty',
        +    ];
        \ No newline at end of file
        diff --git a/resources/lang/ta/admin/asset_maintenances/table.php b/resources/lang/ta/admin/asset_maintenances/table.php
        new file mode 100644
        index 0000000000..f3a6be60f9
        --- /dev/null
        +++ b/resources/lang/ta/admin/asset_maintenances/table.php
        @@ -0,0 +1,8 @@
        +<?php
        +
        +    return [
        +        'title'         => 'Asset Maintenance',
        +        'asset_name'    => 'Asset Name',
        +        'is_warranty'   => 'Warranty',
        +        'dl_csv'        => 'Download CSV'
        +    ];
        diff --git a/resources/lang/ta/admin/categories/general.php b/resources/lang/ta/admin/categories/general.php
        new file mode 100644
        index 0000000000..16b3b79f51
        --- /dev/null
        +++ b/resources/lang/ta/admin/categories/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_categories_title' 			=> 'About Categories',
        +    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'asset_categories' 					=> 'Asset Categories',
        +    'category_name'  					=> 'Category Name',
        +    'checkin_email'                     => 'Send email to user on checkin.',
        +    'clone'                             => 'Clone Category',
        +    'create'  							=> 'Create Category',
        +    'edit'                              => 'Edit Category',
        +    'eula_text'							=> 'Category EULA',
        +    'eula_text_help'					=> 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
        +    'name'                              => 'Category Name',
        +    'require_acceptance'				=> 'Require users to confirm acceptance of assets in this category.',
        +    'required_acceptance'				=> 'This user will be emailed with a link to confirm acceptance of this item.',
        +    'required_eula'						=> 'This user will be emailed a copy of the EULA',
        +    'no_default_eula'					=> 'No primary default EULA found. Add one in Settings.',
        +    'update'  							=> 'Update Category',
        +    'use_default_eula'					=> 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
        +    'use_default_eula_disabled'			=> '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
        +
        +);
        diff --git a/resources/lang/ta/admin/categories/message.php b/resources/lang/ta/admin/categories/message.php
        new file mode 100644
        index 0000000000..48cf5478e1
        --- /dev/null
        +++ b/resources/lang/ta/admin/categories/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Category does not exist.',
        +    'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
        +    'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Category was not created, please try again.',
        +        'success' => 'Category created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Category was not updated, please try again',
        +        'success' => 'Category updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this category?',
        +        'error'   => 'There was an issue deleting the category. Please try again.',
        +        'success' => 'The category was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/categories/table.php b/resources/lang/ta/admin/categories/table.php
        new file mode 100644
        index 0000000000..a3ee96ae7f
        --- /dev/null
        +++ b/resources/lang/ta/admin/categories/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +	'eula_text'      			=> 'EULA',
        +    'id'      					=> 'ID',
        +    'parent'   					=> 'Parent',
        +    'require_acceptance'      	=> 'Acceptance',
        +    'title'      				=> 'Asset Category Name',
        +
        +);
        diff --git a/resources/lang/ta/admin/companies/general.php b/resources/lang/ta/admin/companies/general.php
        new file mode 100644
        index 0000000000..9a47968977
        --- /dev/null
        +++ b/resources/lang/ta/admin/companies/general.php
        @@ -0,0 +1,6 @@
        +<?php
        +return [
        +    'about_companies_title'            => 'About Companies',
        +    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'select_company' => 'Select Company',
        +];
        diff --git a/resources/lang/ta/admin/companies/message.php b/resources/lang/ta/admin/companies/message.php
        new file mode 100644
        index 0000000000..a6db573519
        --- /dev/null
        +++ b/resources/lang/ta/admin/companies/message.php
        @@ -0,0 +1,18 @@
        +<?php
        +return array(
        +    'does_not_exist' => 'Company does not exist.',
        +    'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
        +    'create' => array(
        +        'error'   => 'Company was not created, please try again.',
        +        'success' => 'Company created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Company was not updated, please try again',
        +        'success' => 'Company updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm' => 'Are you sure you wish to delete this company?',
        +        'error'   => 'There was an issue deleting the company. Please try again.',
        +        'success' => 'The Company was deleted successfully.'
        +    )
        +);
        diff --git a/resources/lang/ta/admin/companies/table.php b/resources/lang/ta/admin/companies/table.php
        new file mode 100644
        index 0000000000..2f86126ff2
        --- /dev/null
        +++ b/resources/lang/ta/admin/companies/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +return array(
        +    'companies' => 'Companies',
        +    'create'    => 'Create Company',
        +    'title'     => 'Company',
        +    'update'    => 'Update Company',
        +    'name'      => 'Company Name',
        +    'id'        => 'ID',
        +);
        diff --git a/resources/lang/ta/admin/components/general.php b/resources/lang/ta/admin/components/general.php
        new file mode 100644
        index 0000000000..75c9d250ab
        --- /dev/null
        +++ b/resources/lang/ta/admin/components/general.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about_components_title' 			=> 'About Components',
        +    'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        +    'component_name'                  => 'Component Name',
        +    'checkin'                             => 'Checkin Component',
        +    'checkout'                             => 'Checkout Component',
        +    'cost'				=> 'Purchase Cost',
        +    'create'                             => 'Create Component',
        +    'edit'                             => 'Edit Component',
        +    'date'					=> 'Purchase Date',
        +    'order'					=> 'Order Number',
        +    'remaining' 			             => 'Remaining',
        +    'total' 			                 => 'Total',
        +    'update'                            => 'Update Component',
        +);
        diff --git a/resources/lang/ta/admin/components/message.php b/resources/lang/ta/admin/components/message.php
        new file mode 100644
        index 0000000000..1d13970f23
        --- /dev/null
        +++ b/resources/lang/ta/admin/components/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Component does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Component was not created, please try again.',
        +        'success' => 'Component created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Component was not updated, please try again',
        +        'success' => 'Component updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this component?',
        +        'error'   => 'There was an issue deleting the component. Please try again.',
        +        'success' => 'The component was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Component was not checked out, please try again',
        +        'success' 		=> 'Component checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Component was not checked in, please try again',
        +        'success' 		=> 'Component checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/ta/admin/components/table.php b/resources/lang/ta/admin/components/table.php
        new file mode 100644
        index 0000000000..3d4fed6a7f
        --- /dev/null
        +++ b/resources/lang/ta/admin/components/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Component Name',
        +);
        diff --git a/resources/lang/ta/admin/consumables/general.php b/resources/lang/ta/admin/consumables/general.php
        new file mode 100644
        index 0000000000..53a69f8c03
        --- /dev/null
        +++ b/resources/lang/ta/admin/consumables/general.php
        @@ -0,0 +1,13 @@
        +<?php
        +
        +return array(
        +    'about_consumables_title' 			=> 'About Consumables',
        +    'about_consumables_text'  			=> 'Consumables are anything purchased that will be used up over time. For example, printer ink or copier paper.',
        +    'checkout'                          => 'Checkout Consumable to User',
        +    'consumable_name'                   => 'Consumable Name',
        +    'create'                            => 'Create Consumable',
        +    'item_no'                           => 'Item No.',
        +    'remaining' 			            => 'Remaining',
        +    'total' 			                => 'Total',
        +    'update'                            => 'Update Consumable',
        +);
        diff --git a/resources/lang/ta/admin/consumables/message.php b/resources/lang/ta/admin/consumables/message.php
        new file mode 100644
        index 0000000000..48a3cfbd9f
        --- /dev/null
        +++ b/resources/lang/ta/admin/consumables/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Consumable does not exist.',
        +
        +    'create' => array(
        +        'error'   => 'Consumable was not created, please try again.',
        +        'success' => 'Consumable created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Consumable was not updated, please try again',
        +        'success' => 'Consumable updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this consumable?',
        +        'error'   => 'There was an issue deleting the consumable. Please try again.',
        +        'success' => 'The consumable was deleted successfully.'
        +    ),
        +
        +     'checkout' => array(
        +        'error'   		=> 'Consumable was not checked out, please try again',
        +        'success' 		=> 'Consumable checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Consumable was not checked in, please try again',
        +        'success' 		=> 'Consumable checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +    )
        +
        +
        +);
        diff --git a/resources/lang/ta/admin/consumables/table.php b/resources/lang/ta/admin/consumables/table.php
        new file mode 100644
        index 0000000000..bb76721f17
        --- /dev/null
        +++ b/resources/lang/ta/admin/consumables/table.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'title'      				=> 'Consumable Name',
        +);
        diff --git a/resources/lang/ta/admin/custom_fields/general.php b/resources/lang/ta/admin/custom_fields/general.php
        new file mode 100644
        index 0000000000..f2e6df90cb
        --- /dev/null
        +++ b/resources/lang/ta/admin/custom_fields/general.php
        @@ -0,0 +1,30 @@
        +<?php
        +
        +return array(
        +    'custom_fields'		        => 'Custom Fields',
        +    'field'		                => 'Field',
        +    'about_fieldsets_title'		=> 'About Fieldsets',
        +    'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        +    'custom_format'             => 'Custom format...',
        +    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        +    'encrypted'      	        => 'Encrypted',
        +    'fieldset'      	        => 'Fieldset',
        +    'qty_fields'      	      => 'Qty Fields',
        +    'fieldsets'      	        => 'Fieldsets',
        +    'fieldset_name'           => 'Fieldset Name',
        +    'field_name'              => 'Field Name',
        +    'field_values'            => 'Field Values',
        +    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_element'           => 'Form Element',
        +    'field_element_short'     => 'Element',
        +    'field_format'            => 'Format',
        +    'field_custom_format'     => 'Custom Format',
        +    'required'   		          => 'Required',
        +    'req'   		              => 'Req.',
        +    'used_by_models'   		    => 'Used By Models',
        +    'order'   		            => 'Order',
        +    'create_fieldset'         => 'New Fieldset',
        +    'create_field'            => 'New Custom Field',
        +    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +);
        diff --git a/resources/lang/ta/admin/custom_fields/message.php b/resources/lang/ta/admin/custom_fields/message.php
        new file mode 100644
        index 0000000000..ed66a6ba16
        --- /dev/null
        +++ b/resources/lang/ta/admin/custom_fields/message.php
        @@ -0,0 +1,57 @@
        +<?php
        +
        +return array(
        +
        +    'field' => array(
        +        'invalid'   => 'That field does not exist.',
        +        'already_added'   => 'Field already added',
        +
        +        'create' => array(
        +            'error'   => 'Field was not created, please try again.',
        +            'success' => 'Field created successfully.',
        +            'assoc_success' => 'Field successfully added to fieldset.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Field was not updated, please try again',
        +            'success' => 'Field updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this field?',
        +            'error'   => 'There was an issue deleting the field. Please try again.',
        +            'success' => 'The field was deleted successfully.',
        +            'in_use'   => 'Field is still in use.',
        +        )
        +
        +    ),
        +
        +    'fieldset' => array(
        +
        +        'does_not_exist' => 'Fieldset does not exist',
        +
        +        'create' => array(
        +            'error'   => 'Fieldset was not created, please try again.',
        +            'success' => 'Fieldset created successfully.'
        +        ),
        +
        +        'update' => array(
        +            'error'   => 'Fieldset was not updated, please try again',
        +            'success' => 'Fieldset updated successfully.'
        +        ),
        +
        +        'delete' => array(
        +            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        +            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        +            'success' => 'The fieldset was deleted successfully.',
        +            'in_use'   => 'Fieldset is still in use.',
        +        )
        +
        +    ),
        +
        +
        +
        +
        +
        +
        +);
        diff --git a/resources/lang/ta/admin/departments/message.php b/resources/lang/ta/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/ta/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/departments/table.php b/resources/lang/ta/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/ta/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/ta/admin/depreciations/general.php b/resources/lang/ta/admin/depreciations/general.php
        new file mode 100644
        index 0000000000..1fca0e2cb7
        --- /dev/null
        +++ b/resources/lang/ta/admin/depreciations/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return array(
        +    'about_asset_depreciations'  			=> 'About Asset Depreciations',
        +    'about_depreciations'  					=> 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
        +    'asset_depreciations'  					=> 'Asset Depreciations',
        +    'create'  					            => 'Create Depreciation',
        +    'depreciation_name'  					=> 'Depreciation Name',
        +    'number_of_months'  					=> 'Number of Months',
        +    'update'  					            => 'Update Depreciation',
        +
        +);
        diff --git a/resources/lang/ta/admin/depreciations/message.php b/resources/lang/ta/admin/depreciations/message.php
        new file mode 100644
        index 0000000000..c20e52c13c
        --- /dev/null
        +++ b/resources/lang/ta/admin/depreciations/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Depreciation class does not exist.',
        +    'assoc_users'	 => 'This depreciation is currently associated with one or more models and cannot be deleted. Please delete the models, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Depreciation class was not created, please try again. :(',
        +        'success' => 'Depreciation class created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Depreciation class was not updated, please try again',
        +        'success' => 'Depreciation class updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this depreciation class?',
        +        'error'   => 'There was an issue deleting the depreciation class. Please try again.',
        +        'success' => 'The depreciation class was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/depreciations/table.php b/resources/lang/ta/admin/depreciations/table.php
        new file mode 100644
        index 0000000000..5ba01d132c
        --- /dev/null
        +++ b/resources/lang/ta/admin/depreciations/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'id'      => 'ID',
        +    'months'   => 'Months',
        +    'term'   => 'Term',
        +    'title'      => 'Name ',
        +
        +);
        diff --git a/resources/lang/ta/admin/groups/message.php b/resources/lang/ta/admin/groups/message.php
        new file mode 100644
        index 0000000000..f14b6339e8
        --- /dev/null
        +++ b/resources/lang/ta/admin/groups/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'group_exists'        => 'Group already exists!',
        +    'group_not_found'     => 'Group [:id] does not exist.',
        +    'group_name_required' => 'The name field is required',
        +
        +    'success' => array(
        +        'create' => 'Group was successfully created.',
        +        'update' => 'Group was successfully updated.',
        +        'delete' => 'Group was successfully deleted.',
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this group?',
        +        'create' => 'There was an issue creating the group. Please try again.',
        +        'update' => 'There was an issue updating the group. Please try again.',
        +        'delete' => 'There was an issue deleting the group. Please try again.',
        +    ),
        +
        +);
        diff --git a/resources/lang/ta/admin/groups/table.php b/resources/lang/ta/admin/groups/table.php
        new file mode 100644
        index 0000000000..61f060a116
        --- /dev/null
        +++ b/resources/lang/ta/admin/groups/table.php
        @@ -0,0 +1,9 @@
        +<?php
        +
        +return array(
        +
        +    'id'         => 'Id',
        +    'name'       => 'Name',
        +    'users'      => '# of Users',
        +
        +);
        diff --git a/resources/lang/ta/admin/groups/titles.php b/resources/lang/ta/admin/groups/titles.php
        new file mode 100644
        index 0000000000..99e8cc1f6f
        --- /dev/null
        +++ b/resources/lang/ta/admin/groups/titles.php
        @@ -0,0 +1,14 @@
        +<?php
        +
        +return array(
        +    'about_groups_title'            => 'About Groups',
        +    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'group_management' 	 	=> 'Group Management',
        +    'create' 	 	 	    => 'Create New Group',
        +    'update' 	 		        => 'Edit Group',
        +    'group_name' 	 		=> 'Group Name',
        +    'group_admin' 	 		=> 'Group Admin',
        +    'allow' 	 			=> 'Allow',
        +    'deny' 	 				=> 'Deny',
        +
        +);
        diff --git a/resources/lang/ta/admin/hardware/form.php b/resources/lang/ta/admin/hardware/form.php
        new file mode 100644
        index 0000000000..abded281fa
        --- /dev/null
        +++ b/resources/lang/ta/admin/hardware/form.php
        @@ -0,0 +1,42 @@
        +<?php
        +
        +return array(
        +	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +  'bulk_delete_help'	=> 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
        +  'bulk_delete_warn'	=> 'You are about to delete :asset_count assets.',
        +	'bulk_update'		=> 'Bulk Update Assets',
        +	'bulk_update_help'	=> 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
        +	'bulk_update_warn'	=> 'You are about to edit the properties of :asset_count assets.',
        +    'checkedout_to'		=> 'Checked Out To',
        +    'checkout_date'		=> 'Checkout Date',
        +    'checkin_date'		=> 'Checkin Date',
        +    'checkout_to'		=> 'Checkout to',
        +    'cost'				=> 'Purchase Cost',
        +    'create'			=> 'Create Asset',
        +    'date'				=> 'Purchase Date',
        +    'depreciates_on'	=> 'Depreciates On',
        +    'default_location'	=> 'Default Location',
        +    'eol_date'			=> 'EOL Date',
        +    'eol_rate'			=> 'EOL Rate',
        +    'expected_checkin'  => 'Expected Checkin Date',
        +    'expires'			=> 'Expires',
        +    'fully_depreciated'	=> 'Fully Depreciated',
        +    'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
        +    'mac_address'		=> 'MAC Address',
        +    'manufacturer'		=> 'Manufacturer',
        +    'model'				=> 'Model',
        +    'months'			=> 'months',
        +    'name'				=> 'Asset Name',
        +    'notes'				=> 'Notes',
        +    'order'				=> 'Order Number',
        +    'qr'				=> 'QR Code',
        +    'requestable'		=> 'Users may request this asset',
        +    'select_statustype'	=> 'Select Status Type',
        +    'serial'			=> 'Serial',
        +    'status'			=> 'Status',
        +    'tag'				=> 'Asset Tag',
        +    'update'			=> 'Asset Update',
        +    'warranty'			=> 'Warranty',
        +    'years'				=> 'years',
        +)
        +;
        diff --git a/resources/lang/ta/admin/hardware/general.php b/resources/lang/ta/admin/hardware/general.php
        new file mode 100644
        index 0000000000..1def86dc9e
        --- /dev/null
        +++ b/resources/lang/ta/admin/hardware/general.php
        @@ -0,0 +1,23 @@
        +<?php
        +
        +return array(
        +    'about_assets_title'           => 'About Assets',
        +    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +	'archived'  				=> 'Archived',
        +    'asset'  					=> 'Asset',
        +    'bulk_checkout'             => 'Checkout Assets to User',
        +    'checkin'  					=> 'Checkin Asset',
        +    'checkout'  				=> 'Checkout Asset',
        +    'clone'  					=> 'Clone Asset',
        +    'deployable'  				=> 'Deployable',
        +    'deleted'  					=> 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',
        +    'edit'  					=> 'Edit Asset',
        +	'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'model_deleted'  			=> 'This Assets model has been deleted. You must restore the model before you can restore the Asset.<br/> <a href="/hardware/models/:model_id/restore">Click here to restore the model</a>.',
        +    'requestable'               => 'Requestable',
        +    'requested'				    => 'Requested',
        +    'restore'  					=> 'Restore Asset',
        +    'pending'  					=> 'Pending',
        +    'undeployable'  			=> 'Undeployable',
        +    'view'  					=> 'View Asset',
        +);
        diff --git a/resources/lang/ta/admin/hardware/message.php b/resources/lang/ta/admin/hardware/message.php
        new file mode 100644
        index 0000000000..112cf77ded
        --- /dev/null
        +++ b/resources/lang/ta/admin/hardware/message.php
        @@ -0,0 +1,82 @@
        +<?php
        +
        +return array(
        +
        +    'undeployable' 		=> '<strong>Warning: </strong> This asset has been marked as currently undeployable.
        +                        If this status has changed, please update the asset status.',
        +    'does_not_exist' 	=> 'Asset does not exist.',
        +    'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
        +    'assoc_users'	 	=> 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
        +
        +    'create' => array(
        +        'error'   		=> 'Asset was not created, please try again. :(',
        +        'success' 		=> 'Asset created successfully. :)'
        +    ),
        +
        +    'update' => array(
        +        'error'   			=> 'Asset was not updated, please try again',
        +        'success' 			=> 'Asset updated successfully.',
        +        'nothing_updated'	=>  'No fields were selected, so nothing was updated.',
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Asset was not restored, please try again',
        +        'success' 		=> 'Asset restored successfully.'
        +    ),
        +
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +    'import' => array(
        +        'error'                 => 'Some items did not import correctly.',
        +        'errorDetail'           => 'The following Items were not imported because of errors.',
        +        'success'               => "Your file has been imported",
        +        'file_delete_success'   => "Your file has been been successfully deleted",
        +        'file_delete_error'      => "The file was unable to be deleted",
        +    ),
        +
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this asset?',
        +        'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
        +        'success' 		=> 'The asset was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   		=> 'Asset was not checked out, please try again',
        +        'success' 		=> 'Asset checked out successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'not_available' => 'That asset is not available for checkout!'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   		=> 'Asset was not checked in, please try again',
        +        'success' 		=> 'Asset checked in successfully.',
        +        'user_does_not_exist' => 'That user is invalid. Please try again.',
        +        'already_checked_in'  => 'That asset is already checked in.',
        +
        +    ),
        +
        +    'requests' => array(
        +        'error'   		=> 'Asset was not requested, please try again',
        +        'success' 		=> 'Asset requested successfully.',
        +        'canceled'      => 'Checkout request successfully canceled'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/hardware/table.php b/resources/lang/ta/admin/hardware/table.php
        new file mode 100644
        index 0000000000..e8baa09d5a
        --- /dev/null
        +++ b/resources/lang/ta/admin/hardware/table.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'asset_tag'   	=> 'Asset Tag',
        +    'asset_model'       => 'Model',
        +    'book_value'  	=> 'Value',
        +    'change' 		=> 'In/Out',
        +    'checkout_date' => 'Checkout Date',
        +    'checkoutto' 	=> 'Checked Out',
        +    'diff' 			=> 'Diff',
        +    'dl_csv' 		=> 'Download CSV',
        +    'eol' 			=> 'EOL',
        +    'id'      		=> 'ID',
        +    'location' 		=> 'Location',
        +    'purchase_cost'	=> 'Cost',
        +    'purchase_date'	=> 'Purchased',
        +    'serial'   		=> 'Serial',
        +    'status'   		=> 'Status',
        +    'title'      	=> 'Asset ',
        +    'image'		=> 'Device Image',
        +    'days_without_acceptance' => 'Days Without Acceptance'
        +
        +);
        diff --git a/resources/lang/ta/admin/licenses/form.php b/resources/lang/ta/admin/licenses/form.php
        new file mode 100644
        index 0000000000..ce29167874
        --- /dev/null
        +++ b/resources/lang/ta/admin/licenses/form.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +    'asset'             => 'Asset',
        +    'checkin'           => 'Checkin',
        +    'create'            => 'Create License',
        +    'expiration'        => 'Expiration Date',
        +    'license_key'       => 'Product Key',
        +    'maintained'        => 'Maintained',
        +    'name'              => 'Software Name',
        +    'no_depreciation'   => 'Do Not Depreciate',
        +    'purchase_order'    => 'Purchase Order Number',
        +    'reassignable'      => 'Reassignable',
        +    'remaining_seats'   => 'Remaining Seats',
        +    'seats'             => 'Seats',
        +    'termination_date'  => 'Termination Date',
        +    'to_email'          => 'Licensed to Email',
        +    'to_name'           => 'Licensed to Name',
        +    'update'            => 'Update License',
        +    'checkout_help'     => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
        +);
        diff --git a/resources/lang/ta/admin/licenses/general.php b/resources/lang/ta/admin/licenses/general.php
        new file mode 100644
        index 0000000000..25a536ec56
        --- /dev/null
        +++ b/resources/lang/ta/admin/licenses/general.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_licenses_title'            => 'About Licenses',
        +    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'checkin'  					=> 'Checkin License Seat',
        +    'checkout_history'  		=> 'Checkout History',
        +    'checkout'  				=> 'Checkout License Seat',
        +    'edit'  					=> 'Edit License',
        +    'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'clone'  					=> 'Clone License',
        +    'history_for'  				=> 'History for ',
        +    'in_out'  					=> 'In/Out',
        +    'info'  					=> 'License Info',
        +    'license_seats'  			=> 'License Seats',
        +    'seat'  					=> 'Seat',
        +    'seats'  					=> 'Seats',
        +    'software_licenses'  		=> 'Software Licenses',
        +    'user'  					=> 'User',
        +    'view'  					=> 'View License',
        +);
        diff --git a/resources/lang/ta/admin/licenses/message.php b/resources/lang/ta/admin/licenses/message.php
        new file mode 100644
        index 0000000000..d5dbfe77b9
        --- /dev/null
        +++ b/resources/lang/ta/admin/licenses/message.php
        @@ -0,0 +1,50 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'License does not exist.',
        +    'user_does_not_exist' => 'User does not exist.',
        +    'asset_does_not_exist' 	=> 'The asset you are trying to associate with this license does not exist.',
        +    'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
        +    'assoc_users'	 => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'License was not created, please try again.',
        +        'success' => 'License created successfully.'
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'License was not updated, please try again',
        +        'success' => 'License updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this license?',
        +        'error'   => 'There was an issue deleting the license. Please try again.',
        +        'success' => 'The license was deleted successfully.'
        +    ),
        +
        +    'checkout' => array(
        +        'error'   => 'There was an issue checking out the license. Please try again.',
        +        'success' => 'The license was checked out successfully'
        +    ),
        +
        +    'checkin' => array(
        +        'error'   => 'There was an issue checking in the license. Please try again.',
        +        'success' => 'The license was checked in successfully'
        +    ),
        +
        +);
        diff --git a/resources/lang/ta/admin/licenses/table.php b/resources/lang/ta/admin/licenses/table.php
        new file mode 100644
        index 0000000000..dfce4136cb
        --- /dev/null
        +++ b/resources/lang/ta/admin/licenses/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'assigned_to'   	=> 'Assigned To',
        +    'checkout'   		=> 'In/Out',
        +    'id'      			=> 'ID',
        +    'license_email'   	=> 'License Email',
        +    'license_name'   	=> 'Licensed To',
        +    'purchase_date'   	=> 'Purchase Date',
        +    'purchased'   		=> 'Purchased',
        +    'seats'   			=> 'Seats',
        +    'hardware'   		=> 'Hardware',
        +    'serial'   			=> 'Serial',
        +    'title'      		=> 'License',
        +
        +);
        diff --git a/resources/lang/ta/admin/locations/message.php b/resources/lang/ta/admin/locations/message.php
        new file mode 100644
        index 0000000000..3ba1eed3b6
        --- /dev/null
        +++ b/resources/lang/ta/admin/locations/message.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Location does not exist.',
        +    'assoc_users'	 => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
        +    'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
        +    'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Location was not created, please try again.',
        +        'success' => 'Location created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Location was not updated, please try again',
        +        'success' => 'Location updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this location?',
        +        'error'   => 'There was an issue deleting the location. Please try again.',
        +        'success' => 'The location was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/locations/table.php b/resources/lang/ta/admin/locations/table.php
        new file mode 100644
        index 0000000000..ffa69307d5
        --- /dev/null
        +++ b/resources/lang/ta/admin/locations/table.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +    'about_locations_title'     => 'About Locations',
        +    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'assets_checkedout'         => 'Assets Assigned',
        +    'id'                        => 'ID',
        +    'city'                      => 'City',
        +    'state'                     => 'State',
        +    'country'                   => 'Country',
        +    'create'                    => 'Create Location',
        +    'update'                    => 'Update Location',
        +    'name'                      => 'Location Name',
        +    'address'                   => 'Address',
        +    'zip'                       => 'Postal Code',
        +    'locations'                 => 'Locations',
        +    'parent'                    => 'Parent',
        +    'currency'                  => 'Location Currency',
        +    'ldap_ou'                   => 'LDAP Search OU',
        +    );
        diff --git a/resources/lang/ta/admin/manufacturers/message.php b/resources/lang/ta/admin/manufacturers/message.php
        new file mode 100644
        index 0000000000..6586d2af44
        --- /dev/null
        +++ b/resources/lang/ta/admin/manufacturers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Manufacturer does not exist.',
        +    'assoc_users'	 => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Manufacturer was not created, please try again.',
        +        'success' => 'Manufacturer created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Manufacturer was not updated, please try again',
        +        'success' => 'Manufacturer updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this manufacturer?',
        +        'error'   => 'There was an issue deleting the manufacturer. Please try again.',
        +        'success' => 'The Manufacturer was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/manufacturers/table.php b/resources/lang/ta/admin/manufacturers/table.php
        new file mode 100644
        index 0000000000..4e3ea9904d
        --- /dev/null
        +++ b/resources/lang/ta/admin/manufacturers/table.php
        @@ -0,0 +1,16 @@
        +<?php
        +
        +return array(
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
        +    'asset_manufacturers'	=> 'Asset Manufacturers',
        +    'create'				=> 'Create Manufacturer',
        +    'id'   					=> 'ID',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
        +    'update'				=> 'Update Manufacturer',
        +    'url'   				=> 'URL',
        +
        +);
        diff --git a/resources/lang/ta/admin/models/general.php b/resources/lang/ta/admin/models/general.php
        new file mode 100644
        index 0000000000..e0da09f780
        --- /dev/null
        +++ b/resources/lang/ta/admin/models/general.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'about_models_title'     => 'About Asset Models',
        +    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'deleted'  					        => 'This model has been deleted. <a href="/hardware/models/:model_id/restore">Click here to restore it</a>.',
        +    'restore'                   => 'Restore Model',
        +    'requestable'               => 'Users may request this model',
        +	'show_mac_address'			      => 'Show MAC address field in assets in this model',
        +    'view_deleted'              => 'View Deleted',
        +    'view_models'               => 'View Models',
        +    'fieldset'                  => 'Fieldset',
        +    'no_custom_field'           => 'No custom fields',
        +
        +);
        diff --git a/resources/lang/ta/admin/models/message.php b/resources/lang/ta/admin/models/message.php
        new file mode 100644
        index 0000000000..5b1b9a1a1b
        --- /dev/null
        +++ b/resources/lang/ta/admin/models/message.php
        @@ -0,0 +1,36 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Model does not exist.',
        +    'assoc_users'	 => 'This model is currently associated with one or more assets and cannot be deleted. Please delete the assets, and then try deleting again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Model was not created, please try again.',
        +        'success' => 'Model created successfully.',
        +        'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Model was not updated, please try again',
        +        'success' => 'Model updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this asset model?',
        +        'error'   => 'There was an issue deleting the model. Please try again.',
        +        'success' => 'The model was deleted successfully.'
        +    ),
        +
        +    'restore' => array(
        +        'error'   		=> 'Model was not restored, please try again',
        +        'success' 		=> 'Model restored successfully.'
        +    ),
        +
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
        +);
        diff --git a/resources/lang/ta/admin/models/table.php b/resources/lang/ta/admin/models/table.php
        new file mode 100644
        index 0000000000..11a512b3d3
        --- /dev/null
        +++ b/resources/lang/ta/admin/models/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +
        +    'create'				=> 'Create Asset Model',
        +    'created_at' 			=> 'Created at',
        +    'eol'	 				=> 'EOL',
        +    'modelnumber'   		=> 'Model No.',
        +    'name'      			=> 'Asset Model Name',
        +    'numassets' 			=> 'Assets',
        +    'title'					=> 'Asset Models',
        +    'update'				=> 'Update Asset Model',
        +    'view'					=> 'View Asset Model',
        +    'update'				=> 'Update Asset Model',
        +    'clone'				=> 'Clone Model',
        +    'edit'				=> 'Edit Model',
        +);
        diff --git a/resources/lang/ta/admin/reports/general.php b/resources/lang/ta/admin/reports/general.php
        new file mode 100644
        index 0000000000..b03b97546f
        --- /dev/null
        +++ b/resources/lang/ta/admin/reports/general.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'info'   => 'Select the options you want for your asset report.'
        +);
        diff --git a/resources/lang/ta/admin/reports/message.php b/resources/lang/ta/admin/reports/message.php
        new file mode 100644
        index 0000000000..d4c8f8198f
        --- /dev/null
        +++ b/resources/lang/ta/admin/reports/message.php
        @@ -0,0 +1,5 @@
        +<?php
        +
        +return array(
        +    'error'   => 'You must select at least ONE option.'
        +);
        diff --git a/resources/lang/ta/admin/settings/general.php b/resources/lang/ta/admin/settings/general.php
        new file mode 100644
        index 0000000000..73fd052a58
        --- /dev/null
        +++ b/resources/lang/ta/admin/settings/general.php
        @@ -0,0 +1,148 @@
        +<?php
        +
        +return array(
        +    'ad'				        => 'Active Directory',
        +    'ad_domain'				    => 'Active Directory domain',
        +    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        +    'is_ad'				        => 'This is an Active Directory server',
        +	'alert_email'				=> 'Send alerts to',
        +	'alerts_enabled'			=> 'Alerts Enabled',
        +	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        +	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'asset_ids'					=> 'Asset IDs',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
        +	'auto_increment_assets'		=> 'Generate auto-incrementing asset IDs',
        +	'auto_increment_prefix'		=> 'Prefix (optional)',
        +	'auto_incrementing_help'    => 'Enable auto-incrementing asset IDs first to set this',
        +	'backups'					=> 'Backups',
        +	'barcode_settings'			=> 'Barcode Settings',
        +    'confirm_purge'			    => 'Confirm Purge',
        +    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        +	'custom_css'				=> 'Custom CSS',
        +	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
        +	'default_currency'  		=> 'Default Currency',
        +	'default_eula_text'			=> 'Default EULA',
        +  'default_language'					=> 'Default Language',
        +	'default_eula_help_text'	=> 'You can also associate custom EULAs to specific asset categories.',
        +    'display_asset_name'        => 'Display Asset Name',
        +    'display_checkout_date'     => 'Display Checkout Date',
        +    'display_eol'               => 'Display EOL in table view',
        +    'display_qr'                => 'Display Square Codes',
        +	'display_alt_barcode'		=> 'Display 1D barcode',
        +	'barcode_type'				=> '2D Barcode Type',
        +	'alt_barcode_type'			=> '1D barcode type',
        +    'eula_settings'				=> 'EULA Settings',
        +    'eula_markdown'				=> 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'general_settings'			=> 'General Settings',
        +	'generate_backup'			=> 'Generate Backup',
        +    'header_color'              => 'Header Color',
        +    'info'                      => 'These settings let you customize certain aspects of your installation.',
        +    'laravel'                   => 'Laravel Version',
        +    'ldap_enabled'              => 'LDAP enabled',
        +    'ldap_integration'          => 'LDAP Integration',
        +    'ldap_settings'             => 'LDAP Settings',
        +    'ldap_server'               => 'LDAP Server',
        +    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        +	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
        +	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
        +	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        +    'ldap_tls'                  => 'Use TLS',
        +    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        +    'ldap_uname'                => 'LDAP Bind Username',
        +    'ldap_pword'                => 'LDAP Bind Password',
        +    'ldap_basedn'               => 'Base Bind DN',
        +    'ldap_filter'               => 'LDAP Filter',
        +    'ldap_pw_sync'              => 'LDAP Password Sync',
        +    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        +    'ldap_username_field'       => 'Username Field',
        +    'ldap_lname_field'          => 'Last Name',
        +    'ldap_fname_field'          => 'LDAP First Name',
        +    'ldap_auth_filter_query'    => 'LDAP Authentication query',
        +    'ldap_version'              => 'LDAP Version',
        +    'ldap_active_flag'          => 'LDAP Active Flag',
        +    'ldap_emp_num'              => 'LDAP Employee Number',
        +    'ldap_email'                => 'LDAP Email',
        +    'load_remote_text'          => 'Remote Scripts',
        +    'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
        +    'logo'                    	=> 'Logo',
        +    'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
        +    'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        +    'optional'					=> 'optional',
        +    'per_page'                  => 'Results Per Page',
        +    'php'                       => 'PHP Version',
        +    'php_gd_info'               => 'You must install php-gd to display QR codes, see install instructions.',
        +    'php_gd_warning'            => 'PHP Image Processing and GD plugin is NOT installed.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
        +    'qr_help'                   => 'Enable QR Codes first to set this',
        +    'qr_text'                   => 'QR Code Text',
        +    'setting'                   => 'Setting',
        +    'settings'                  => 'Settings',
        +    'site_name'                 => 'Site Name',
        +    'slack_botname'             => 'Slack Botname',
        +    'slack_channel'             => 'Slack Channel',
        +    'slack_endpoint'            => 'Slack Endpoint',
        +    'slack_integration'         => 'Slack Settings',
        +    'slack_integration_help'    => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new">create an incoming webhook</a> on your Slack account.',
        +    'snipe_version'  			=> 'Snipe-IT version',
        +    'system'                    => 'System Information',
        +    'update'                    => 'Update Settings',
        +    'value'                     => 'Value',
        +    'brand'                     => 'Branding',
        +    'about_settings_title'      => 'About Settings',
        +    'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
        +    'labels_per_page'           => 'Labels per page',
        +    'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
        +    'page_padding'             => 'Page margins (inches)',
        +    'purge'                    => 'Purge Deleted Records',
        +    'labels_display_bgutter'    => 'Label bottom gutter',
        +    'labels_display_sgutter'    => 'Label side gutter',
        +    'labels_fontsize'           => 'Label font size',
        +    'labels_pagewidth'          => 'Label sheet width',
        +    'labels_pageheight'         => 'Label sheet height',
        +    'label_gutters'        => 'Label spacing (inches)',
        +    'page_dimensions'        => 'Page dimensions (inches)',
        +    'label_fields'          => 'Label visible fields',
        +    'inches'        => 'inches',
        +    'width_w'        => 'w',
        +    'height_h'        => 'h',
        +    'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'Two Factor Authentication',
        +    'two_factor_secret'        => 'Two-Factor Code',
        +    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        +    'two_factor_enabled_text'        => 'Enable Two Factor',
        +    'two_factor_reset'        => 'Reset Two-Factor Secret',
        +    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        +    'two_factor_reset_success'          => 'Two factor device successfully reset',
        +    'two_factor_reset_error'          => 'Two factor device reset failed',
        +    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        +    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        +    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_required'        => 'Required for all users',
        +    'two_factor_disabled'        => 'Disabled',
        +    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        +    'two_factor_config_complete'	=> 'Submit Code',
        +    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        +    'require_accept_signature'      => 'Require Signature',
        +    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'left'        => 'left',
        +    'right'        => 'right',
        +    'top'        => 'top',
        +    'bottom'        => 'bottom',
        +    'vertical'        => 'vertical',
        +    'horizontal'        => 'horizontal',
        +    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +);
        diff --git a/resources/lang/ta/admin/settings/message.php b/resources/lang/ta/admin/settings/message.php
        new file mode 100644
        index 0000000000..736d5c3e9e
        --- /dev/null
        +++ b/resources/lang/ta/admin/settings/message.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +return array(
        +
        +
        +    'update' => array(
        +        'error'                 => 'An error has occurred while updating. ',
        +        'success'               => 'Settings updated successfully.'
        +    ),
        +    'backup' => array(
        +        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        +        'file_deleted'          => 'The backup file was successfully deleted. ',
        +        'generated'             => 'A new backup file was successfully created.',
        +        'file_not_found'        => 'That backup file could not be found on the server.',
        +    ),
        +    'purge' => array(
        +        'error'     => 'An error has occurred while purging. ',
        +        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        +        'success'               => 'Deleted records successfully purged.'
        +    ),
        +
        +);
        diff --git a/resources/lang/ta/admin/statuslabels/message.php b/resources/lang/ta/admin/statuslabels/message.php
        new file mode 100644
        index 0000000000..619a5a509c
        --- /dev/null
        +++ b/resources/lang/ta/admin/statuslabels/message.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Status Label does not exist.',
        +    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +
        +
        +    'create' => array(
        +        'error'   => 'Status Label was not created, please try again.',
        +        'success' => 'Status Label created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Status Label was not updated, please try again',
        +        'success' => 'Status Label updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        +        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        +        'success' => 'The Status Label was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/statuslabels/table.php b/resources/lang/ta/admin/statuslabels/table.php
        new file mode 100644
        index 0000000000..b9b5b7ec4e
        --- /dev/null
        +++ b/resources/lang/ta/admin/statuslabels/table.php
        @@ -0,0 +1,17 @@
        +<?php
        +
        +return array(
        +    'about'      	=> 'About Status Labels',
        +    'archived'      	=> 'Archived',
        +    'create'      	=> 'Create Status Label',
        +    'color'      	=> 'Chart Color',
        +    'deployable'      	=> 'Deployable',
        +    'info'      	=> 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
        +    'name'      	=> 'Status Name',
        +    'pending'      	=> 'Pending',
        +    'status_type'   => 'Status Type',
        +    'show_in_nav'   => 'Show in side nav',
        +    'title'      	=> 'Status Labels',
        +    'undeployable'  => 'Undeployable',
        +    'update'      	=> 'Update Status Label',
        +);
        diff --git a/resources/lang/ta/admin/suppliers/message.php b/resources/lang/ta/admin/suppliers/message.php
        new file mode 100644
        index 0000000000..df4bc41af3
        --- /dev/null
        +++ b/resources/lang/ta/admin/suppliers/message.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Supplier does not exist.',
        +    'assoc_users'	 => 'This supplier is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this supplier and try again. ',
        +
        +    'create' => array(
        +        'error'   => 'Supplier was not created, please try again.',
        +        'success' => 'Supplier created successfully.'
        +    ),
        +
        +    'update' => array(
        +        'error'   => 'Supplier was not updated, please try again',
        +        'success' => 'Supplier updated successfully.'
        +    ),
        +
        +    'delete' => array(
        +        'confirm'   => 'Are you sure you wish to delete this supplier?',
        +        'error'   => 'There was an issue deleting the supplier. Please try again.',
        +        'success' => 'Supplier was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/ta/admin/suppliers/table.php b/resources/lang/ta/admin/suppliers/table.php
        new file mode 100644
        index 0000000000..2a7b07ca93
        --- /dev/null
        +++ b/resources/lang/ta/admin/suppliers/table.php
        @@ -0,0 +1,27 @@
        +<?php
        +
        +return array(
        +    'about_suppliers_title' => 'About Suppliers',
        +    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'address'               => 'Supplier Address',
        +    'assets'                => 'Assets',
        +    'city'                  => 'City',
        +    'contact'               => 'Contact Name',
        +    'country'               => 'Country',
        +    'create'                => 'Create Supplier',
        +    'email'                 => 'Email',
        +    'fax'                   => 'Fax',
        +    'id'                    => 'ID',
        +    'licenses'              => 'Licenses',
        +    'name'                  => 'Supplier Name',
        +    'notes'                 => 'Notes',
        +    'phone'                 => 'Phone',
        +    'state'                 => 'State',
        +    'suppliers'             => 'Suppliers',
        +    'update'                => 'Update Supplier',
        +    'url'                   => 'URL',
        +    'view'                  => 'View Supplier',
        +    'view_assets_for'       => 'View Assets for',
        +    'zip'                   => 'Postal Code',
        +
        +);
        diff --git a/resources/lang/ta/admin/users/general.php b/resources/lang/ta/admin/users/general.php
        new file mode 100644
        index 0000000000..985138d065
        --- /dev/null
        +++ b/resources/lang/ta/admin/users/general.php
        @@ -0,0 +1,25 @@
        +<?php
        +
        +
        +return array(
        +
        +    'assets_user'       => 'Assets assigned to :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
        +    'current_assets'    => 'Assets currently checked out to this user',
        +    'clone'             => 'Clone User',
        +    'contact_user'      => 'Contact :name',
        +    'edit'              => 'Edit User',
        +    'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'history_user'      => 'History for :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
        +    'last_login'        => 'Last Login',
        +    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'software_user'     => 'Software Checked out to :name',
        +    'view_user'         => 'View User :name',
        +    'usercsv'           => 'CSV file',
        +    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        +    'two_factor_enrolled' => '2FA Device Enrolled ',
        +    'two_factor_active'   => '2FA Active ',
        +    );
        diff --git a/resources/lang/ta/admin/users/message.php b/resources/lang/ta/admin/users/message.php
        new file mode 100644
        index 0000000000..8ee552afab
        --- /dev/null
        +++ b/resources/lang/ta/admin/users/message.php
        @@ -0,0 +1,59 @@
        +<?php
        +
        +return array(
        +
        +    'accepted'                  => 'You have successfully accepted this asset.',
        +    'declined'                  => 'You have successfully declined this asset.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
        +    'user_exists'               => 'User already exists!',
        +    'user_not_found'            => 'User [:id] does not exist.',
        +    'user_login_required'       => 'The login field is required',
        +    'user_password_required'    => 'The password is required.',
        +    'insufficient_permissions'  => 'Insufficient Permissions.',
        +    'user_deleted_warning'      => 'This user has been deleted. You will have to restore this user to edit them or assign them new assets.',
        +    'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
        +
        +
        +    'success' => array(
        +        'create'    => 'User was successfully created.',
        +        'update'    => 'User was successfully updated.',
        +        'update_bulk'    => 'Users were successfully updated!',
        +        'delete'    => 'User was successfully deleted.',
        +        'ban'       => 'User was successfully banned.',
        +        'unban'     => 'User was successfully unbanned.',
        +        'suspend'   => 'User was successfully suspended.',
        +        'unsuspend' => 'User was successfully unsuspended.',
        +        'restored'  => 'User was successfully restored.',
        +        'import'    => 'Users imported successfully.',
        +    ),
        +
        +    'error' => array(
        +        'create' => 'There was an issue creating the user. Please try again.',
        +        'update' => 'There was an issue updating the user. Please try again.',
        +        'delete' => 'There was an issue deleting the user. Please try again.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
        +        'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
        +        'import'    => 'There was an issue importing users. Please try again.',
        +        'asset_already_accepted' => 'This asset has already been accepted.',
        +        'accept_or_decline' => 'You must either accept or decline this asset.',
        +        'incorrect_user_accepted' => 'The asset you have attempted to accept was not checked out to you.',
        +        'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
        +        'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
        +    ),
        +
        +    'deletefile' => array(
        +        'error'   => 'File not deleted. Please try again.',
        +        'success' => 'File successfully deleted.',
        +    ),
        +
        +    'upload' => array(
        +        'error'   => 'File(s) not uploaded. Please try again.',
        +        'success' => 'File(s) successfully uploaded.',
        +        'nofiles' => 'You did not select any files for upload',
        +        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +    ),
        +
        +);
        diff --git a/resources/lang/ta/admin/users/table.php b/resources/lang/ta/admin/users/table.php
        new file mode 100644
        index 0000000000..9bbe883e19
        --- /dev/null
        +++ b/resources/lang/ta/admin/users/table.php
        @@ -0,0 +1,38 @@
        +<?php
        +
        +return array(
        +    'activated'  			=> 'Active',
        +    'allow'  				=> 'Allow',
        +    'checkedout'  			=> 'Assets',
        +    'created_at' 			=> 'Created',
        +    'createuser' 			=> 'Create User',
        +    'deny'  				=> 'Deny',
        +    'email'      			=> 'Email',
        +    'employee_num'      	=> 'Employee No.',
        +    'first_name' 			=> 'First Name',
        +    'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        +    'id'         			=> 'Id',
        +    'inherit'  				=> 'Inherit',
        +    'job' 					=> 'Job Title',
        +    'last_login'  			=> 'Last Login',
        +    'last_name'  			=> 'Last Name',
        +    'location'  			=> 'Location',
        +    'lock_passwords'		=> 'Login details cannot be changed on this installation.',
        +    'manager' 				=> 'Manager',
        +    'managed_locations'     => 'Managed Locations',
        +    'name' 					=> 'Name',
        +    'notes'                 => 'Notes',
        +    'password_confirm' 		=> 'Confirm Password',
        +    'password' 				=> 'Password',
        +    'phone'  				=> 'Phone',
        +    'show_current'          => 'Show Current Users',
        +    'show_deleted'          => 'Show Deleted Users',
        +    'title' 				=> 'Title',
        +	'to_restore_them'		=> 'to restore them.',
        +    'updateuser' 			=> 'Update User',
        +    'username' 				=> 'Username',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
        +    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        +    'cloneuser'             => 'Clone User',
        +    'viewusers' 			=> 'View Users',
        +);
        diff --git a/resources/lang/ta/auth/general.php b/resources/lang/ta/auth/general.php
        new file mode 100644
        index 0000000000..bf88cba77a
        --- /dev/null
        +++ b/resources/lang/ta/auth/general.php
        @@ -0,0 +1,12 @@
        +<?php
        +
        +return [
        +    'send_password_link'	        => 'Send Password Reset Link',
        +    'email_reset_password'			=> 'Email Password Reset',
        +    'reset_password'			    => 'Reset Password',
        +    'login'                         => 'Login',
        +    'login_prompt'                  => 'Please Login',
        +    'forgot_password'               => 'I forgot my password',
        +    'remember_me'                   => 'Remember Me',
        +    ];
        +
        diff --git a/resources/lang/ta/auth/message.php b/resources/lang/ta/auth/message.php
        new file mode 100644
        index 0000000000..bebf9cdd48
        --- /dev/null
        +++ b/resources/lang/ta/auth/message.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +return array(
        +
        +    'account_already_exists' => 'An account with the this email already exists.',
        +    'account_not_found'      => 'The username or password is incorrect.',
        +    'account_not_activated'  => 'This user account is not activated.',
        +    'account_suspended'      => 'This user account is suspended.',
        +    'account_banned'         => 'This user account is banned.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
        +
        +    'signin' => array(
        +        'error'   => 'There was a problem while trying to log you in, please try again.',
        +        'success' => 'You have successfully logged in.',
        +    ),
        +
        +    'signup' => array(
        +        'error'   => 'There was a problem while trying to create your account, please try again.',
        +        'success' => 'Account sucessfully created.',
        +    ),
        +
        +        'forgot-password' => array(
        +            'error'   => 'There was a problem while trying to get a reset password code, please try again.',
        +            'success' => 'Password recovery email successfully sent.',
        +        ),
        +
        +        'forgot-password-confirm' => array(
        +            'error'   => 'There was a problem while trying to reset your password, please try again.',
        +            'success' => 'Your password has been successfully reset.',
        +        ),
        +
        +    'activate' => array(
        +        'error'   => 'There was a problem while trying to activate your account, please try again.',
        +        'success' => 'Your account has been successfully activated.',
        +    ),
        +
        +);
        diff --git a/resources/lang/ta/button.php b/resources/lang/ta/button.php
        new file mode 100644
        index 0000000000..6964689762
        --- /dev/null
        +++ b/resources/lang/ta/button.php
        @@ -0,0 +1,15 @@
        +<?php
        +
        +return array(
        +    'actions' 	                => 'Actions',
        +    'add'    	                => 'Add New',
        +    'cancel'                    => 'Cancel',
        +    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'delete'  	                => 'Delete',
        +    'edit'    	                => 'Edit',
        +    'restore' 	                => 'Restore',
        +    'request'                   => 'Request',
        +    'submit'  	                => 'Submit',
        +    'upload'                    => 'Upload',
        +	'select_file'				=> 'Select File...',
        +);
        diff --git a/resources/lang/ta/general.php b/resources/lang/ta/general.php
        new file mode 100644
        index 0000000000..eb6409ddbb
        --- /dev/null
        +++ b/resources/lang/ta/general.php
        @@ -0,0 +1,204 @@
        +<?php
        +
        +    return [
        +    'accessories'			=> 'Accessories',
        +    'activated'			=> 'Activated',
        +    'accessory'				=> 'Accessory',
        +    'accessory_report'			=> 'Accessory Report',
        +    'action'                => 'Action',
        +    'activity_report'		=> 'Activity Report',
        +    'address'				=> 'Address',
        +    'admin'					=> 'Admin',
        +    'add_seats'     => 'Added seats',
        +    'all_assets'			=> 'All Assets',
        +    'all'       			=> 'All',
        +    'archived'              => 'Archived',
        +    'asset_models'			=> 'Asset Models',
        +    'asset'					=> 'Asset',
        +    'asset_report'          => 'Asset Report',
        +    'asset_tag'				=> 'Asset Tag',
        +    'assets_available'		=> 'assets available',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
        +    'assets'				=> 'Assets',
        +    'avatar_delete'         => 'Delete Avatar',
        +    'avatar_upload'         => 'Upload Avatar',
        +    'back'      			=> 'Back',
        +    'bad_data'      		=> 'Nothing found. Maybe bad data?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'cancel'  				=> 'Cancel',
        +    'categories'			=> 'Categories',
        +    'category'				=> 'Category',
        +    'change' 		        => 'In/Out',
        +    'changeemail'  			=> 'Change Email Address',
        +    'changepassword'  		=> 'Change Password',
        +    'checkin'  				=> 'Checkin',
        +    'checkin_from'  		=> 'Checkin from',
        +    'checkout'  			=> 'Checkout',
        +    'city'  				=> 'City',
        +	'click_here'			=> 'Click here',
        +    'companies'			=> 'Companies',
        +    'company'				=> 'Company',
        +    'component'			=> 'Component',
        +    'components'			=> 'Components',
        +	'complete'				=> 'Complete',
        +    'consumable'			=> 'Consumable',
        +    'consumables'			=> 'Consumables',
        +    'country'  				=> 'Country',
        +    'create'				=> 'Create New',
        +    'created'               => 'Item Created',
        +    'created_asset'			=> 'created asset',
        +    'created_at' 			=> 'Created at',
        +    'updated_at' 			=> 'Updated at',
        +    'currency'  			=> '$', // this is deprecated
        +    'current'  				=> 'Current',
        +    'custom_report'         => 'Custom Asset Report',
        +    'dashboard'				=> 'Dashboard',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
        +    'date'					=> 'Date',
        +    'debug_warning'         => 'Warning!',
        +    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'delete'  				=> 'Delete',
        +    'deleted'  				=> 'Deleted',
        +    'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
        +    'deployed'				=> 'Deployed',
        +    'depreciation_report'	=> 'Depreciation Report',
        +    'download'				=> 'Download',
        +    'depreciation'			=> 'Depreciation',
        +    'editprofile'  			=> 'Edit Your Profile',
        +    'eol'					=> 'EOL',
        +    'email_domain'			=> 'Email Domain',
        +    'email_format'			=> 'Email Format',
        +    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        +    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'first'					=> 'First',
        +    'first_name'			=> 'First Name',
        +    'first_name_format'		=> 'First Name (jane@example.com)',
        +    'file_name'				=> 'File',
        +    'file_uploads'			=> 'File Uploads',
        +    'generate'				=> 'Generate',
        +    'groups'				=> 'Groups',
        +    'gravatar_email'        => 'Gravatar Email Address',
        +    'history'  			    => 'History',
        +    'history_for'  			=> 'History for',
        +    'id'  					=> 'ID',
        +    'image_delete'         	=> 'Delete Image',
        +    'image_upload'         	=> 'Upload Image',
        +    'import'         	    => 'Import',
        +    'import-history'        => 'Import History',
        +    'asset_maintenance'        => 'Asset Maintenance',
        +    'asset_maintenance_report' => 'Asset Maintenance Report',
        +    'asset_maintenances'       => 'Asset Maintenances',
        +    'item'  				=> 'Item',
        +    'insufficient_permissions' => 'Insufficient permissions!',
        +    'language'				=> 'Language',
        +    'last'					=> 'Last',
        +    'last_login'            => 'Last Login',
        +    'last_name'             => 'Last Name',
        +    'license'				=> 'License',
        +    'license_report'        => 'License Report',
        +    'licenses_available'	=> 'licenses available',
        +    'licenses'				=> 'Licenses',
        +    'list_all'				=> 'List All',
        +    'loading'				=> 'Loading',
        +    'lock_passwords'        => 'This field cannot be edited in this installation.',
        +    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        +    'location'              => 'Location',
        +    'locations'				=> 'Locations',
        +    'logout'				=> 'Logout',
        +    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'manufacturer'			=> 'Manufacturer',
        +    'manufacturers'			=> 'Manufacturers',
        +    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        +    'min_amt'				=> 'Min. QTY',
        +    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'model_no'				=> 'Model No.',
        +    'months'				=> 'months',
        +    'moreinfo'				=> 'More Info',
        +    'name'					=> 'Name',
        +    'next'					=> 'Next',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'new!',
        +    'no_depreciation'		=> 'No Depreciation',
        +    'no_results'			=> 'No Results.',
        +    'no'  					=> 'No',
        +    'notes'  				=> 'Notes',
        +    'order_number'          => 'Order Number',
        +    'page_menu'				=> 'Showing _MENU_ items',
        +    'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
        +    'pending'				=> 'Pending',
        +    'people'				=> 'People',
        +    'per_page'				=> 'Results Per Page',
        +    'previous'				=> 'Previous',
        +    'processing'			=> 'Processing',
        +    'profile'				=> 'Your profile',
        +    'purchase_cost'                              => 'Purchase Cost',
        +    'purchase_date'         => 'Purchase Date',
        +    'qty'		            => 'QTY',
        +    'quantity'		        => 'Quantity',
        +    'ready_to_deploy'		=> 'Ready to Deploy',
        +    'recent_activity'		=> 'Recent Activity',
        +    'remove_company'        => 'Remove Company Association',
        +    'reports'				=> 'Reports',
        +    'requested'				=> 'Requested',
        +    'request_canceled'      => 'Request Canceled',
        +    'save'  				=> 'Save',
        +    'select'				=> 'Select',
        +    'search'				=> 'Search',
        +    'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
        +    'select_depreciation'	=> 'Select a Depreciation Type',
        +    'select_location'		=> 'Select a Location',
        +    'select_manufacturer'	=> 'Select a Manufacturer',
        +    'select_model'			=> 'Select a Model',
        +    'select_supplier'		=> 'Select a Supplier',
        +    'select_user'			=> 'Select a User',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
        +    'select_statuslabel'	=> 'Select Status',
        +    'select_company'    	=> 'Select Company',
        +    'select_asset'    		=> 'Select Asset',
        +    'settings'				=> 'Settings',
        +    'sign_in'				=> 'Sign in',
        +    'signature'             => 'Signature',
        +    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'site_name'				=> 'Site Name',
        +    'state'  				=> 'State',
        +    'status_labels'			=> 'Status Labels',
        +    'status'    			=> 'Status',
        +    'supplier'              => 'Supplier',
        +    'suppliers'  			=> 'Suppliers',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
        +    'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
        +    'total_assets'			=> 'total assets',
        +    'total_licenses'		=> 'total licenses',
        +    'total_accessories'		=> 'total accessories',
        +    'total_consumables'		=> 'total consumables',
        +    'type'  				=> 'Type',
        +    'undeployable'			=> 'Un-deployable',
        +    'unknown_admin'			=> 'Unknown Admin',
        +    'username_format'		=> 'Username Format',
        +    'update'                => 'Update',
        +    'uploaded'              => 'Uploaded',
        +    'user'					=> 'User',
        +    'accepted'			    => 'accepted',
        +    'declined'			    => 'declined',
        +    'unaccepted_asset_report' => 'Unaccepted Assets',
        +    'users'                 => 'Users',
        +    'viewassets'  			=> 'View Assigned Assets',
        +    'website'               => 'Website',
        +    'welcome'				=> 'Welcome, :name',
        +    'years'					=> 'years',
        +    'yes' 					=> 'Yes',
        +    'zip'  					=> 'Zip',
        +    'noimage'					=> 'No image uploaded or image not found.',
        +    'token_expired'             => 'Your form session has expired. Please try again.',
        +    ];
        diff --git a/resources/lang/ta/mail.php b/resources/lang/ta/mail.php
        new file mode 100644
        index 0000000000..c9a4fe182d
        --- /dev/null
        +++ b/resources/lang/ta/mail.php
        @@ -0,0 +1,74 @@
        +<?php
        +
        +return array(
        +    'a_user_canceled' => 'A user has canceled an item request on the website',
        +    'a_user_requested' => 'A user has requested an item on the website',
        +    'accessory_name' => 'Accessory Name:',
        +    'additional_notes' => 'Additional Notes:',
        +    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        +    'asset' => 'Asset:',
        +    'asset_name' => 'Asset Name:',
        +    'asset_requested' => 'Asset requested',
        +    'asset_tag' => 'Asset Tag:',
        +    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        +                                    expiring in the next 60 days.',
        +    'assigned_to' => 'Assigned To',
        +    'best_regards' => 'Best regards,',
        +    'canceled' => 'Canceled:',
        +    'checkin_date' => 'Checkin Date:',
        +    'checkout_date' => 'Checkout Date:',
        +    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        +    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        +    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        +    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        +    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        +    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        +    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        +    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        +    'current_QTY' => 'Current QTY',
        +    'Days' => 'Days',
        +    'days' => 'Days',
        +    'expecting_checkin_date' => 'Expected Checkin Date:',
        +    'expires' => 'Expires',
        +    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        +    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        +    'hello' => 'Hello',
        +    'hi' => 'Hi',
        +    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        +    'item' => 'Item:',
        +    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        +                              inventory or will soon be low.',
        +    'Item_Request_Canceled' => 'Item Request Canceled',
        +    'Item_Requested' => 'Item Requested',
        +    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        +    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        +    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        +    'login' => 'Login:',
        +    'Low_Inventory_Report' => 'Low Inventory Report',
        +    'min_QTY' => 'Min QTY',
        +    'name' => 'Name',
        +    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        +    'password' => 'Password:',
        +    'password_reset' => 'Password Reset',
        +
        +    'read_the_terms' => 'Please read the terms of use below.',
        +    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        +                         and agree to the terms of use, and have received the asset.',
        +    'requested' => 'Requested:',
        +    'reset_link' => 'Your Password Reset Link',
        +    'reset_password' => 'Click here to reset your password:',
        +    'serial' => 'Serial:',
        +    'supplier' => 'Supplier',
        +    'tag' => 'Tag',
        +    'test_email' => 'Test Email from Snipe-IT',
        +    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        +    'the_following_item' => 'The following item has been checked in: ',
        +    'There_are' => '{1} There is|[2,Inf] There are',
        +    'to_reset' => 'To reset your :web password, complete this form:',
        +    'type' => 'Type',
        +    'user' => 'User:',
        +    'username' => 'Username:',
        +    'welcome' => 'Welcome :name',
        +    'welcome_to' => 'Welcome to :web!',
        +    'your_credentials' => 'Your Snipe-IT credentials',
        +);
        diff --git a/resources/lang/ta/pagination.php b/resources/lang/ta/pagination.php
        new file mode 100644
        index 0000000000..b573b51e91
        --- /dev/null
        +++ b/resources/lang/ta/pagination.php
        @@ -0,0 +1,20 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Pagination Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used by the paginator library to build
        +    | the simple pagination links. You are free to change them to anything
        +    | you want to customize your views to better match your application.
        +    |
        +    */
        +
        +    'previous' => '&laquo; Previous',
        +
        +    'next'     => 'Next &raquo;',
        +
        +);
        diff --git a/resources/lang/ta/passwords.php b/resources/lang/ta/passwords.php
        new file mode 100644
        index 0000000000..5195a9b77c
        --- /dev/null
        +++ b/resources/lang/ta/passwords.php
        @@ -0,0 +1,7 @@
        +<?php
        +
        +return [
        +    'sent'	        => 'Your password link has been sent!',
        +    'user'			=> 'That user does not exist or does not have an email address associated',
        +];
        +
        diff --git a/resources/lang/ta/reminders.php b/resources/lang/ta/reminders.php
        new file mode 100644
        index 0000000000..e7a476e3a2
        --- /dev/null
        +++ b/resources/lang/ta/reminders.php
        @@ -0,0 +1,24 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Password Reminder Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are the default lines which match reasons
        +    | that are given by the password broker for a password update attempt
        +    | has failed, such as for an invalid token or invalid new password.
        +    |
        +    */
        +
        +    "password" => "Passwords must be six characters and match the confirmation.",
        +
        +    "user"     => "Username or email address is incorrect",
        +
        +    "token"    => "This password reset token is invalid.",
        +
        +    "sent" => "If a matching email address was found, a password reminder has been sent!",
        +
        +);
        diff --git a/resources/lang/ta/table.php b/resources/lang/ta/table.php
        new file mode 100644
        index 0000000000..f7a49d86c1
        --- /dev/null
        +++ b/resources/lang/ta/table.php
        @@ -0,0 +1,10 @@
        +<?php
        +
        +return array(
        +
        +    'actions'	 	=> 'Actions',
        +    'action' 		=> 'Action',
        +    'by'      		=> 'By',
        +    'item' 			=> 'Item',
        +
        +);
        diff --git a/resources/lang/ta/validation.php b/resources/lang/ta/validation.php
        new file mode 100644
        index 0000000000..02cb1fa981
        --- /dev/null
        +++ b/resources/lang/ta/validation.php
        @@ -0,0 +1,136 @@
        +<?php
        +
        +return array(
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines contain the default error messages used by
        +    | the validator class. Some of these rules have multiple versions such
        +    | such as the size rules. Feel free to tweak each of these messages.
        +    |
        +    */
        +
        +    'accepted'             => 'The :attribute must be accepted.',
        +    'active_url'           => 'The :attribute is not a valid URL.',
        +    'after'                => 'The :attribute must be a date after :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => 'The :attribute may only contain letters.',
        +    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
        +    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => 'The :attribute must be a date before :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => 'The :attribute must be between :min and :max.',
        +        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        +        'string'  => 'The :attribute must be between :min and :max characters.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => 'The :attribute confirmation does not match.',
        +    'date'                 => 'The :attribute is not a valid date.',
        +    'date_format'          => 'The :attribute does not match the format :format.',
        +    'different'            => 'The :attribute and :other must be different.',
        +    'digits'               => 'The :attribute must be :digits digits.',
        +    'digits_between'       => 'The :attribute must be between :min and :max digits.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'The :attribute must be a valid email address.',
        +    'exists'               => 'The selected :attribute is invalid.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => 'The :attribute must be an image.',
        +    'in'                   => 'The selected :attribute is invalid.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => 'The :attribute must be an integer.',
        +    'ip'                   => 'The :attribute must be a valid IP address.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => 'The :attribute may not be greater than :max.',
        +        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        +        'string'  => 'The :attribute may not be greater than :max characters.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => 'The :attribute must be a file of type: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => 'The :attribute must be at least :min.',
        +        'file'    => 'The :attribute must be at least :min kilobytes.',
        +        'string'  => 'The :attribute must be at least :min characters.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => 'The selected :attribute is invalid.',
        +    'numeric'              => 'The :attribute must be a number.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'The :attribute format is invalid.',
        +    'required'             => 'The :attribute field is required.',
        +    'required_if'          => 'The :attribute field is required when :other is :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'The :attribute field is required when :values is present.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'The :attribute field is required when :values is not present.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => 'The :attribute and :other must match.',
        +    'size'                 => [
        +        'numeric' => 'The :attribute must be :size.',
        +        'file'    => 'The :attribute must be :size kilobytes.',
        +        'string'  => 'The :attribute must be :size characters.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => 'The :attribute has already been taken.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'The :attribute format is invalid.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
        +
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Attributes
        +    |--------------------------------------------------------------------------
        +    |
        +    | The following language lines are used to swap attribute place-holders
        +    | with something more reader friendly such as E-Mail Address instead
        +    | of "email". This simply helps us make messages a little cleaner.
        +    |
        +    */
        +
        +    'attributes' => [],
        +
        +);
        diff --git a/resources/lang/th/admin/accessories/general.php b/resources/lang/th/admin/accessories/general.php
        index 0db01a600c..c984e0791d 100644
        --- a/resources/lang/th/admin/accessories/general.php
        +++ b/resources/lang/th/admin/accessories/general.php
        @@ -5,10 +5,10 @@ return array(
             'about_accessories_text'  			=> 'อุปกรณ์เสริมใดๆ ที่มอบให้กับผู้ใช้แต่ไม่มีหมายเลขเครื่อง (หรือไม่จำเป็นสำหรับการค้นหาข้อมูลย้อนหลัง) ยกตัวอย่าง เช่น คอมพิวเตอร์ ไมค์ หรือแป้นพิมพ์ เป็นต้น',
             'accessory_category' 				=> 'หมวดหมู่อุปกรณ์เสริม',
             'accessory_name'  					=> 'ชื่ออุปกรณ์เสริม',
        -    'checkout'  							=> 'Checkout Accessory',
        -    'checkin'  							=> 'Checkin Accessory',
        +    'checkout'  							=> 'เชคเอาท์อุปกรณ์เสริม',
        +    'checkin'  							=> 'เช็คอินอุปกรณ์เสริม',
             'create'  							=> 'สร้างอุปกรณ์เสริม',
        -    'edit'  							=> 'Edit Accessory',
        +    'edit'  							=> 'แก้ไขอุปกรณ์เสริม',
             'eula_text'							=> 'หมวดหมู่ข้อกำหนดการใช้งาน',
             'eula_text_help'					=> 'ส่วนนี้อนุญาตให้คุณสามารถทำการปรับแต่งข้อตกลงการใช้งานสำหรับกำหนดชนิดของทรัพย์สินได้ หากคุณมีข้อตกลงการใช้งานเพียงหนึ่ง หรือเรื่องเดียวที่ใช้ครอบคลุมทรัพย์สินของคุณทั้งหมด คุณสามารถตั้งค่าให้เป็นการใช้งานหลัก โดยการทำเครื่องหมายในช่องด้านล่างนี้.',
             'require_acceptance'				=> 'กำหนดให้ผู้ใช้ยืนยันยอมรับสินทรัพย์ในหมวดหมู่นี้',
        diff --git a/resources/lang/th/admin/accessories/message.php b/resources/lang/th/admin/accessories/message.php
        index cb2fc09003..308cb9687a 100644
        --- a/resources/lang/th/admin/accessories/message.php
        +++ b/resources/lang/th/admin/accessories/message.php
        @@ -16,9 +16,9 @@ return array(
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this accessory?',
        -        'error'   => 'There was an issue deleting the accessory. Please try again.',
        -        'success' => 'The accessory was deleted successfully.'
        +        'confirm'   => 'คุณแน่ใจที่จะลบอุปกรณ์เสริมนี้?',
        +        'error'   => 'มีปัญหาขณะลบอุปกรณ์เสริมนี้ กรุณาลองอีกครั้ง.',
        +        'success' => 'ลบอุปกรณ์เสริมเรียบร้อยแล้ว'
             ),
         
              'checkout' => array(
        diff --git a/resources/lang/th/admin/asset_maintenances/message.php b/resources/lang/th/admin/asset_maintenances/message.php
        index f4d9c9c29d..fc96db07ca 100644
        --- a/resources/lang/th/admin/asset_maintenances/message.php
        +++ b/resources/lang/th/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'การซ่อมบำรุงสินทรัพย์ยังไม่ถูกสร้าง กรุณาลองอีกครั้ง',
                     'success' => 'สร้างการซ่อมบำรุงสินทรัพย์เรียบร้อยแล้ว'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'ยังไม่แล้วเสร็จ',
                 'warranty'                     => 'การรับประกัน',
                 'not_warranty'                 => 'ไม่มีการรับประกัน',
        diff --git a/resources/lang/th/admin/categories/general.php b/resources/lang/th/admin/categories/general.php
        index 58ac58da45..6aeac4f50a 100644
        --- a/resources/lang/th/admin/categories/general.php
        +++ b/resources/lang/th/admin/categories/general.php
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'แก้ไขหมวดหมู่',
             'eula_text'							=> 'หมวดหมู่ข้อกำหนดการใช้งาน',
             'eula_text_help'					=> 'ส่วนนี้อนุญาตให้คุณสามารถทำการปรับแต่งข้อตกลงการใช้งานสำหรับกำหนดชนิดของทรัพย์สินได้ หากคุณมีข้อตกลงการใช้งานเพียงหนึ่ง หรือเรื่องเดียวที่ใช้ครอบคลุมทรัพย์สินของคุณทั้งหมด คุณสามารถตั้งค่าให้เป็นการใช้งานหลัก โดยการทำเครื่องหมายในช่องด้านล่างนี้',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'กำหนดให้ผู้ใช้ยืนยันยอมรับสินทรัพย์ในหมวดหมู่นี้',
             'required_acceptance'				=> 'ผู้ใช้นี้จะสามารถส่งอีเมล ด้วยลิงค์เพื่อการยืนยันยอมรับรายการนี้',
             'required_eula'						=> 'ผู้ใช้นี้จะส่งอีเมลสำเนาของ EULA',
        diff --git a/resources/lang/th/admin/custom_fields/message.php b/resources/lang/th/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/th/admin/custom_fields/message.php
        +++ b/resources/lang/th/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/th/admin/departments/message.php b/resources/lang/th/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/th/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/th/admin/departments/table.php b/resources/lang/th/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/th/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/th/admin/hardware/general.php b/resources/lang/th/admin/hardware/general.php
        index fc81a06637..6475b1c8d5 100644
        --- a/resources/lang/th/admin/hardware/general.php
        +++ b/resources/lang/th/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'สินทรัพย์',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'เช็คอินสินทรัพย์',
        -    'checkout'  				=> 'เช็คเอ้าท์สินทรัพย์ให้ผู้ใช้งาน',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'คัดลอกแบบสินทรัพย์',
             'deployable'  				=> 'สามารถใช้งานได้',
             'deleted'  					=> 'สินทรัพย์นี้ถูกลบแล้ว <a href="/hardware/:asset_id/restore">คลิกที่นี่เพื่อกู้คืน</a>.',
        diff --git a/resources/lang/th/admin/hardware/message.php b/resources/lang/th/admin/hardware/message.php
        index e339bcd6e1..114d295111 100644
        --- a/resources/lang/th/admin/hardware/message.php
        +++ b/resources/lang/th/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> 'Asset restored successfully.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'File not deleted. Please try again.',
                 'success' => 'File successfully deleted.',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Are you sure you wish to delete this asset?',
                 'error'   		=> 'There was an issue deleting the asset. Please try again.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'The asset was deleted successfully.'
             ),
         
        diff --git a/resources/lang/th/admin/locations/table.php b/resources/lang/th/admin/locations/table.php
        index 8c8c1f4c6b..479b465032 100644
        --- a/resources/lang/th/admin/locations/table.php
        +++ b/resources/lang/th/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'สถานที่',
             'parent'                    => 'หมวดแม่',
             'currency'                  => 'สกุลเงินตามสถานที่',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/th/admin/manufacturers/table.php b/resources/lang/th/admin/manufacturers/table.php
        index c80b493ad6..8516884b44 100644
        --- a/resources/lang/th/admin/manufacturers/table.php
        +++ b/resources/lang/th/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'ผู้ผลิตสินทรัพย์',
             'create'				=> 'สร้างผู้ผลิต',
             'id'   					=> 'ID',
        -    'name'      			=> 'ชื่อผู้ผลิต',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'ปรับปรุงผู้ผลิต',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/th/admin/models/message.php b/resources/lang/th/admin/models/message.php
        index ced79f89b6..efb20c7352 100644
        --- a/resources/lang/th/admin/models/message.php
        +++ b/resources/lang/th/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'กู้คืนโมเดลเรียบร้อยแล้ว'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/th/admin/settings/general.php b/resources/lang/th/admin/settings/general.php
        index a35186c9c6..3ab27f1e9a 100644
        --- a/resources/lang/th/admin/settings/general.php
        +++ b/resources/lang/th/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'รหัสทรัพย์สิน',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'สร้างการเพิ่มรหัสทรัพย์สินอัตโนมัติ',
         	'auto_increment_prefix'		=> 'Prefix (ส่วนเสริม)',
         	'auto_incrementing_help'    => 'เปิดใช้งานการเพิ่มรหัสสินทรัพย์อัตโนมัติก่อนตั้งค่าส่วนนี้',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'โลโก้',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'เวอร์ชัน PHP',
             'php_gd_info'               => 'คุณต้องติดตั้ง php-gd เพื่อแสดง QR codes, ดูในคู่มือการติดตั้ง',
             'php_gd_warning'            => 'ยังไม่ได้ติดตั้ง PHP imgae processing และ GD plugin',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'เปิดใช้งาน QR Codes ก่อนการตั้งค่านี้',
             'qr_text'                   => 'QR Code Text',
             'setting'                   => 'การตั้งค่า',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/th/admin/users/general.php b/resources/lang/th/admin/users/general.php
        index 924f6238e8..f1b89aaa65 100644
        --- a/resources/lang/th/admin/users/general.php
        +++ b/resources/lang/th/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'ทรัพย์สินที่กำหนดให้ :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'โคลนผู้ใช้',
             'contact_user'      => 'ติดต่อ :name',
             'edit'              => 'แก้ไขผู้ใช้',
             'filetype_info'     => 'ประเภทของไฟล์ที่อนุญาตแล้ว มีดังนี้ png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar',
             'history_user'      => 'ประวัติของ :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'เข้าสู่ระบบล่าสุด',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'ซอฟต์แวร์ที่กำหนดให้ :name',
        diff --git a/resources/lang/th/admin/users/message.php b/resources/lang/th/admin/users/message.php
        index cdf56c14e3..0e1275134f 100644
        --- a/resources/lang/th/admin/users/message.php
        +++ b/resources/lang/th/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'คุณยอมรับสินทรัพย์นี้เรียบร้อยแล้ว',
             'declined'                  => 'คุณปฏิเสธสินทรัพย์นี้เรียบร้อยแล้ว',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'มีผู้ใช้งานนี้แล้ว',
             'user_not_found'            => 'ไม่มีชื่อผู้ใช้งานนี้',
             'user_login_required'       => 'ต้องการชื่อผู้ใช้งาน',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'สร้างผู้ใช้งานเสร็จสมบูรณ์แล้ว',
                 'update'    => 'แก้ไขผู้ใช้งานเสร็จสมบูรณ์แล้ว',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'ลบผู้ใช้งานเสร็จสมบูรณ์แล้ว',
                 'ban'       => 'แบนผู้ใช้งานเสร็จสมบูรณ์แล้ว',
                 'unban'     => 'ยกเลิกการแบนผู้ใช้งานเสร็จสมบูรณ์แล้ว',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'มีปัญหาระหว่างการสร้างผู้ใช้งาน กรุณาลองใหม่อีกครั้ง',
                 'update' => 'มีปัญหาระหว่างปรับปรุงข้อมูลผู้ใช้ กรุณาลองใหม่อีกครั้ง',
                 'delete' => 'มีปัญหาระหว่างลบผู้ใช้งาน กรุณาลองใหม่อีกครั้ง',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'มีปัญหาระหว่างการยกเลิกการระงับผู้ใช้งาน กรุณาลองใหม่อีกครั้ง',
                 'import'    => 'มีปัญหาระหว่างการนำเข้าผู้ใช้งาน กรุณาลองใหม่อีกครั้ง',
                 'asset_already_accepted' => 'ทรัพย์สินนี้ได้รับการยอมรับแล้ว',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'ไม่สามารถผูกกับ LDAP Server ได้ กรุณาตรวจสอบการตั้งค่า LDAP Server ของคุณในไฟล์ตั้งค่า LDAP <br>ผิดพลาดจาก LDAP Server: ',
                 'ldap_could_not_search' => 'ไม่สามารถค้นหา LDAP Server ได้ กรุณาตรวจสอบการตั้งค่า LDAP Server ของคุณในไฟล์ตั้งค่า LDAP <br>ผิดพลาดจาก LDAP Server:',
                 'ldap_could_not_get_entries' => 'ไม่สามารถดึงข้อมูลจาก LDAP Server ได้ กรุณาตรวจสอบการตั้งค่า LDAP Server ของคุณในไฟล์ตั้งค่า LDAP <br>ผิดพลาดจาก LDAP Server:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/th/admin/users/table.php b/resources/lang/th/admin/users/table.php
        index b60cf30e5c..38c8030e6b 100644
        --- a/resources/lang/th/admin/users/table.php
        +++ b/resources/lang/th/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'ใช้งาน',
             'allow'  				=> 'อนุญาต',
             'checkedout'  			=> 'ทรัพย์สิน',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'สถานที่',
             'lock_passwords'		=> 'รายละเอียดการเข้าสู่ระบบไม่สามารถแก้ไขเปลี่ยนแปลงบนการติดตั้งนี้',
             'manager' 				=> 'ผู้จัดการ',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'ชื่อ',
             'notes'                 => 'หมายเหตุ',
             'password_confirm' 		=> 'ยืนยันรหัสผ่าน',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'แสดงผู้ใช้งานปัจจุบัน',
             'show_deleted'          => 'แสดงผู้ใช้งานที่ถูกลบแล้ว',
             'title' 				=> 'ชื่อเรื่อง',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'แก้ไขผู้ใช้งาน',
             'username' 				=> 'ชื่อผู้ใช้',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(ส่วนนี้มีผลเฉพาะกับ Active Directory เท่านั้น ไม่ใช่สำหรับการเข้าสู่ระบบ)',
             'cloneuser'             => 'คัดลอกผู้ใช้งาน',
             'viewusers' 			=> 'ดูผู้ใช้งาน',
        diff --git a/resources/lang/th/auth/message.php b/resources/lang/th/auth/message.php
        index 6f3448eee5..a0b32d9f39 100644
        --- a/resources/lang/th/auth/message.php
        +++ b/resources/lang/th/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'ชื่อผู้ใช้นี้ยังไม่ได้ทำการเปิดใช้งาน',
             'account_suspended'      => 'บัญชีผู้ใช้นี้ถูกระงับการใช้งาน',
             'account_banned'         => 'บัญชีผู้ใช้นี้ถูกห้ามใช้งาน',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'มีปัญหาขณะกำลังเข้าสู่ระบบ กรุณาลองอีกครั้ง',
        diff --git a/resources/lang/th/button.php b/resources/lang/th/button.php
        index e7e06d1657..d2ffb67418 100644
        --- a/resources/lang/th/button.php
        +++ b/resources/lang/th/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'การกระทำ',
             'add'    	                => 'เพิ่มใหม่',
             'cancel'                    => 'ยกเลิก',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'ร้องขอ',
             'submit'  	                => 'ตกลง',
             'upload'                    => 'อัพโหลด',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/th/general.php b/resources/lang/th/general.php
        index cbce20c1aa..f5a5789584 100644
        --- a/resources/lang/th/general.php
        +++ b/resources/lang/th/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'รายงานทรัพย์สิน',
             'asset_tag'				=> 'รหัสทรัพย์สิน',
             'assets_available'		=> 'ทรัพย์สินพร้อมใช้งาน',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'ทรัพย์สิน',
             'avatar_delete'         => 'ลบรูปภาพประจำตัว',
             'avatar_upload'         => 'อัพโหลดภาพประจำตัว',
             'back'      			=> 'ย้อนกลับ',
             'bad_data'      		=> 'ไม่พบข้อมูลใดๆ หรือข้อมูลอาจไม่ถูกต้อง?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'ยกเลิก',
             'categories'			=> 'ประเภท',
             'category'				=> 'หมวดหมู่',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'เปลี่ยนอีเมลแอดเดรส',
             'changepassword'  		=> 'เปลี่ยนรหัสผ่าน',
             'checkin'  				=> 'เช็คอิน',
             'checkin_from'  		=> 'เช็คอินจาก',
             'checkout'  			=> 'เช็คเอาท์',
             'city'  				=> 'เมือง',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'การใช้งาน',
             'consumables'			=> 'การใช้งาน',
             'country'  				=> 'ประเทศ',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'ทรัพย์สินที่ถูกสร้าง',
             'created_at' 			=> 'สร้างที่',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '฿', // this is deprecated
             'current'  				=> 'ปัจจุบัน',
             'custom_report'         => 'รายงานทรัพย์สินแบบกำหนดเอง',
             'dashboard'				=> 'หน้าหลัก',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'วันเดือนปี',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'ลบ',
             'deleted'  				=> 'ลบแล้ว',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'กำลังใช้งาน',
             'depreciation_report'	=> 'รายงานการเสื่อมราคา',
             'download'				=> 'ดาวน์โหลด',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'สุดท้าย',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'นามสกุล',
             'license'				=> 'ลิขสิทธิ์',
             'license_report'        => 'รายงานลิขสิทธิ์',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'ข้อมูลเพิ่มเติม',
             'name'					=> 'ชื่อ',
             'next'					=> 'ถัด​ไป',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'ไม่มีค่าเสื่อมราคา',
             'no_results'			=> 'ไม่มีผลการค้นหา',
        @@ -138,13 +153,14 @@
             'select'				=> 'เลือก',
             'search'				=> 'ค้นหา',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'เลือกประเภทค่าเสื่อมราคา',
             'select_location'		=> 'เลือกที่ตั้ง',
             'select_manufacturer'	=> 'เลือกผู้ผลิต',
             'select_model'			=> 'เลือกรุ่น',
             'select_supplier'		=> 'เลือกผู้จัดจำหน่าย',
             'select_user'			=> 'เลือกผู้ใช้',
        -    'select_date'			=> 'เลือกวันที่',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'เลือกสถานะ',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'สถานะ',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'ตัวแทนจำหน่าย',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'ทรัพย์สินทั้งหมด',
             'total_licenses'		=> 'ลิขสิทธิ์ทั้งหมด',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/th/validation.php b/resources/lang/th/validation.php
        index f264a5d679..a461876d3b 100644
        --- a/resources/lang/th/validation.php
        +++ b/resources/lang/th/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute ต้องได้รับการยอมรับ",
        -    "active_url"       => ":attribute ไม่ใช่ URL ที่ถูกต้อง",
        -    "after"            => ":attribute ต้องเป็นวันที่หลังจาก :date",
        -    "alpha"            => ":attribute ต้องมีเฉพาะตัวอักษรเท่านั้น",
        -    "alpha_dash"       => ":attribute ต้องมีเฉพาะตัวอักษร ตัวเลข หรือเครื่องหมายลบเท่านั้น",
        -    "alpha_num"        => ":attribute ต้องมีเฉพาะตัวอักษรและตัวเลขเท่านั้น",
        -    "before"           => ":attribute ต้องเป็นวันที่ก่อน :date",
        -    "between"          => array(
        -        "numeric" => ":attribute ต้องอยู่ระหว่าง :min - :max",
        -        "file"    => ":attribute ต้องมีขนาดระหว่าง :min - :max กิโลไบต์",
        -        "string"  => ":attribute ต้องมีจำนวนระหว่าง :min - :max ตัวอักษร",
        -    ),
        -    "confirmed"        => ":attribute ไม่ตรงกัน",
        -    "date"             => ":attribute เป็นรูปแบบวันที่ที่ไม่ถูกต้อง",
        -    "date_format"      => ":attribute ไม่ตรงตามรูปแบบ :format",
        -    "different"        => ":attribute และ :other ต้องไม่เหมือนกัน",
        -    "digits"           => ":attribute ต้องเป็น :digits ตัวเลข",
        -    "digits_between"   => ":attribute ต้องเป็นตัวเลขระหว่าง :min และ :max",
        -    "email"            => "รูปแบบของ :attribute ไม่ถูกต้อง",
        -    "exists"           => ":attribute ที่เลือกไม่ถูกต้อง",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => ":attribute ต้องเป็นรูปภาพเท่านั้น",
        -    "in"               => ":attribute ที่เลือกไม่ถูกต้อง",
        -    "integer"          => ":attribute ต้องเป็นจำนวนเต็มเท่านั้น",
        -    "ip"               => ":attribute ต้องเป็นรูปแบบไอพีแอดเดรสเท่านั้น",
        -    "max"              => array(
        -        "numeric" => ":attribute ต้องไม่มากกว่า :max",
        -        "file"    => ":attribute ต้องไม่มีขนาดมากกว่า :max กิโลไบต์",
        -        "string"  => ":attribute ต้องไม่มีจำนวนตัวอักษรมากกว่า :max ตัวอักษร",
        -    ),
        -    "mimes"            => ":attribute ต้องเป็นรูปแบบไฟล์ดังนี้: :values",
        -    "min"              => array(
        -        "numeric" => ":attribute ต้องมีอย่างน้อย :min",
        -        "file"    => ":attribute ต้องมีขนาดอย่างน้อย :min กิโลไบต์",
        -        "string"  => ":attribute ต้องมีจำนวนอย่างน้อย :min ตัวอักษร",
        -    ),
        -    "not_in"           => ":attribute ที่เลือกไม่ถูกต้อง",
        -    "numeric"          => ":attribute ต้องเป็นตัวเลขเท่านั้น",
        -    "regex"            => "รูปแบบของ :attribute ไม่ถูกต้อง",
        -    "required"         => "กรุณากรอกข้อมูลในฟิลด์ :attribute",
        -    "required_if"      => "ฟิลด์ :attribute จำเป็นต้องมีข้อมูล เมื่อ :other เป็น :value",
        -    "required_with"    => "ฟิลด์ :attribute จำเป็นต้องมีข้อมูล เมื่อ :value มีข้อมูลอยู่ด้วย",
        -    "required_without" => "ฟิลด์ :attribute จำเป็นต้องมีข้อมูล เมื่อ :value ไม่มีข้อมูล",
        -    "same"             => ":attribute และ :other ต้องตรงกัน",
        -    "size"             => array(
        -        "numeric" => ":attribute ต้องมีขนาด :size",
        -        "file"    => ":attribute ต้องมีขนาด :size กิโลไบต์",
        -        "string"  => ":attribute ต้องมีจำนวน :size ตัวอักษร",
        -    ),
        -    "unique"           => ":attribute กำลังใช้งานอยู่",
        -    "url"              => "รูปแบบของ :attribute ไม่ถูกต้อง",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ':attribute ต้องได้รับการยอมรับ',
        +    'active_url'           => ':attribute ไม่ใช่ URL ที่ถูกต้อง',
        +    'after'                => ':attribute ต้องเป็นวันที่หลังจาก :date',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute ต้องมีเฉพาะตัวอักษรเท่านั้น',
        +    'alpha_dash'           => ':attribute ต้องมีเฉพาะตัวอักษร ตัวเลข หรือเครื่องหมายลบเท่านั้น',
        +    'alpha_num'            => ':attribute ต้องมีเฉพาะตัวอักษรและตัวเลขเท่านั้น',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute ต้องเป็นวันที่ก่อน :date',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute ต้องอยู่ระหว่าง :min - :max',
        +        'file'    => ':attribute ต้องมีขนาดระหว่าง :min - :max กิโลไบต์',
        +        'string'  => ':attribute ต้องมีจำนวนระหว่าง :min - :max ตัวอักษร',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => ':attribute ไม่ตรงกัน',
        +    'date'                 => ':attribute เป็นรูปแบบวันที่ที่ไม่ถูกต้อง',
        +    'date_format'          => ':attribute ไม่ตรงตามรูปแบบ :format',
        +    'different'            => ':attribute และ :other ต้องไม่เหมือนกัน',
        +    'digits'               => ':attribute ต้องเป็น :digits ตัวเลข',
        +    'digits_between'       => ':attribute ต้องเป็นตัวเลขระหว่าง :min และ :max',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'รูปแบบของ :attribute ไม่ถูกต้อง',
        +    'exists'               => ':attribute ที่เลือกไม่ถูกต้อง',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute ต้องเป็นรูปภาพเท่านั้น',
        +    'in'                   => ':attribute ที่เลือกไม่ถูกต้อง',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute ต้องเป็นจำนวนเต็มเท่านั้น',
        +    'ip'                   => ':attribute ต้องเป็นรูปแบบไอพีแอดเดรสเท่านั้น',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute ต้องไม่มากกว่า :max',
        +        'file'    => ':attribute ต้องไม่มีขนาดมากกว่า :max กิโลไบต์',
        +        'string'  => ':attribute ต้องไม่มีจำนวนตัวอักษรมากกว่า :max ตัวอักษร',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute ต้องเป็นรูปแบบไฟล์ดังนี้: :values',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute ต้องมีอย่างน้อย :min',
        +        'file'    => ':attribute ต้องมีขนาดอย่างน้อย :min กิโลไบต์',
        +        'string'  => ':attribute ต้องมีจำนวนอย่างน้อย :min ตัวอักษร',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => ':attribute ที่เลือกไม่ถูกต้อง',
        +    'numeric'              => ':attribute ต้องเป็นตัวเลขเท่านั้น',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'รูปแบบของ :attribute ไม่ถูกต้อง',
        +    'required'             => 'กรุณากรอกข้อมูลในฟิลด์ :attribute',
        +    'required_if'          => 'ฟิลด์ :attribute จำเป็นต้องมีข้อมูล เมื่อ :other เป็น :value',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'ฟิลด์ :attribute จำเป็นต้องมีข้อมูล เมื่อ :value มีข้อมูลอยู่ด้วย',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'ฟิลด์ :attribute จำเป็นต้องมีข้อมูล เมื่อ :value ไม่มีข้อมูล',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute และ :other ต้องตรงกัน',
        +    'size'                 => [
        +        'numeric' => ':attribute ต้องมีขนาด :size',
        +        'file'    => ':attribute ต้องมีขนาด :size กิโลไบต์',
        +        'string'  => ':attribute ต้องมีจำนวน :size ตัวอักษร',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute กำลังใช้งานอยู่',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'รูปแบบของ :attribute ไม่ถูกต้อง',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "ฟิลด์ :attribute ประกอบไปด้วยอักขระที่ไม่อนุญาต",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/tr/admin/asset_maintenances/message.php b/resources/lang/tr/admin/asset_maintenances/message.php
        index e613822ee1..ef95845414 100644
        --- a/resources/lang/tr/admin/asset_maintenances/message.php
        +++ b/resources/lang/tr/admin/asset_maintenances/message.php
        @@ -1,7 +1,7 @@
         <?php
         
             return [
        -        'not_found'                    => 'Asset Maintenance you were looking for was not found!',
        +        'not_found'                    => 'Kıymet bakım Aradığınız bulunamadı!',
                 'delete'                       => [
                     'confirm' => 'Varlık bakımını silmek istediğinizden emin misiniz?',
                     'error'   => 'Varlık bakımını silerken bir hata oluştu. Lütfen tekrar deneyiniz.',
        @@ -11,6 +11,10 @@
                     'error'   => 'Varlık bakımı oluşturulumadı, lütfen tekrar deneyin.',
                     'success' => 'Varlık Bakımı başarıyla oluşturuldu.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Henüz Tamamlanmadı',
                 'warranty'                     => 'Garanti',
                 'not_warranty'                 => 'Garanti Yok',
        diff --git a/resources/lang/tr/admin/asset_maintenances/table.php b/resources/lang/tr/admin/asset_maintenances/table.php
        index 1f13186b37..dcdc72955d 100644
        --- a/resources/lang/tr/admin/asset_maintenances/table.php
        +++ b/resources/lang/tr/admin/asset_maintenances/table.php
        @@ -1,8 +1,8 @@
         <?php
         
             return [
        -        'title'         => 'Varlık Bakımı',
        -        'asset_name'    => 'Asset Name',
        +        'title'         => 'Demirbaş bakımı',
        +        'asset_name'    => 'Demirbaş adı',
                 'is_warranty'   => 'Garanti',
                 'dl_csv'        => 'CSV olarak indir'
             ];
        diff --git a/resources/lang/tr/admin/categories/general.php b/resources/lang/tr/admin/categories/general.php
        index b5e4849386..3a8864ac7a 100644
        --- a/resources/lang/tr/admin/categories/general.php
        +++ b/resources/lang/tr/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Kategoriler hakkında',
        +    'about_categories'  				=> 'Demirbaş kategorileri size kategorileri organize etme konusunda yardımcı olur. &quot;Masaüstü&quot;, &quot;Laptop&quot;, &quot;Cep telefonu&quot;, gibi olabilir. Kategorilere size anlamı gelebilecek herhangi bir isim verebilirsiniz.',
             'asset_categories' 					=> 'Demirbaş Kategorileri',
             'category_name'  					=> 'Kategori Adı',
             'checkin_email'                     => 'Kullanıcıya mail gönder.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Kategoriyi Düzenle',
             'eula_text'							=> 'Kategori Sözleşmeleri',
             'eula_text_help'					=> 'Bu alan özel tipteki demirbaşlarınız için Sözleşmesi\'ni özelleştirmeniz içindir. Eğer tüm demirbaşlarınız için sadece tek sözleşmeniz var ise yukarıdaki kutucuğu işaretlereyerek varsayılan yapabilirsiniz.',
        +    'name'                              => 'Kategori Adı',
             'require_acceptance'				=> 'Bu kategoride kullanıcının kabul onayı gerekmektedir.',
             'required_acceptance'				=> 'Kullanıcıya bü ürün ile ilgili kabul bağlantısı içeren bir e-posta gönderilmiştir.',
             'required_eula'						=> 'Kullanıcıya Son Kullanıcı Lisans Sözleşmesi\'nin bir kopyası e-posta ile gönderilmiştir',
        diff --git a/resources/lang/tr/admin/categories/message.php b/resources/lang/tr/admin/categories/message.php
        index 301ee429ec..3833ba7fd1 100644
        --- a/resources/lang/tr/admin/categories/message.php
        +++ b/resources/lang/tr/admin/categories/message.php
        @@ -3,8 +3,8 @@
         return array(
         
             'does_not_exist' => 'Kategori mevcut değil.',
        -    'assoc_models'	 => 'This category is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this category and try again. ',
        -    'assoc_items'	 => 'This category is currently associated with at least one :asset_type and cannot be deleted. Please update your :asset_type  to no longer reference this category and try again. ',
        +    'assoc_models'	 => 'Bu kategori en az 1 adet model ile ilişkili ve silinemez. Lütfen Modelleri güncelleyerek bu kategori ile bağını kesin ve tekrar deneyin. ',
        +    'assoc_items'	 => 'Bu kategori en az 1 adet model ile ilişkili ve silinemez. Lütfen Modelleri güncelleyerek bu kategori ile bağını kesin ve tekrar deneyin. ',
         
             'create' => array(
                 'error'   => 'Kategori oluşturulamadı. Lütfen tekrar deneyin.',
        diff --git a/resources/lang/tr/admin/companies/general.php b/resources/lang/tr/admin/companies/general.php
        index b157009aa6..d7c384e6fe 100644
        --- a/resources/lang/tr/admin/companies/general.php
        +++ b/resources/lang/tr/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Firmalar Hakkında',
        +    'about_companies_text'                  => 'Şirketler basit bir tanımlayıcı alanı olarak kullanılabilir veya Yönetici ayarlarınızda tam şirket desteğinin etkinleştirilmesi durumunda varlıkların, kullanıcıların vb. Görünürlüklerini sınırlamak için kullanılabilir.',
             'select_company' => 'Firma Seç',
         ];
        diff --git a/resources/lang/tr/admin/companies/message.php b/resources/lang/tr/admin/companies/message.php
        index 9c3dabcc76..b6f12ae188 100644
        --- a/resources/lang/tr/admin/companies/message.php
        +++ b/resources/lang/tr/admin/companies/message.php
        @@ -1,18 +1,18 @@
         <?php
         return array(
             'does_not_exist' => 'Firma yok.',
        -    'assoc_users'    => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
        +    'assoc_users'    => 'Bu firma şu anda en az bir model ile ilişkili ve silinemez. Lütfen ilişkili modelden bu firmayı kaldırarak tekrar deneyin. ',
             'create' => array(
                 'error'   => 'Firma oluşturulamadı, lütfen tekrar deneyin.',
                 'success' => 'Firma başarıyla oluşturuldu.'
             ),
             'update' => array(
        -        'error'   => 'Company was not updated, please try again',
        +        'error'   => 'Firma güncelleştirilmedi, lütfen tekrar deneyin',
                 'success' => 'Firma Başarıyla Güncellendi.'
             ),
             'delete' => array(
                 'confirm' => 'Bu firmayı silmek istediğinize emin misiniz?',
        -        'error'   => 'There was an issue deleting the company. Please try again.',
        -        'success' => 'The Company was deleted successfully.'
        +        'error'   => 'Firmayı silerken bir sorun oluştu. Lütfen yeniden deneyin.',
        +        'success' => 'Firma başarıyla silindi.'
             )
         );
        diff --git a/resources/lang/tr/admin/components/general.php b/resources/lang/tr/admin/components/general.php
        index 75c9d250ab..c18d33aeb2 100644
        --- a/resources/lang/tr/admin/components/general.php
        +++ b/resources/lang/tr/admin/components/general.php
        @@ -1,17 +1,17 @@
         <?php
         
         return array(
        -    'about_components_title' 			=> 'About Components',
        -    'about_components_text'  			=> 'Components are items that are part of an asset, for example HDD, RAM, etc.',
        -    'component_name'                  => 'Component Name',
        -    'checkin'                             => 'Checkin Component',
        -    'checkout'                             => 'Checkout Component',
        -    'cost'				=> 'Purchase Cost',
        -    'create'                             => 'Create Component',
        -    'edit'                             => 'Edit Component',
        -    'date'					=> 'Purchase Date',
        -    'order'					=> 'Order Number',
        -    'remaining' 			             => 'Remaining',
        -    'total' 			                 => 'Total',
        -    'update'                            => 'Update Component',
        +    'about_components_title' 			=> 'Şirket hakkında',
        +    'about_components_text'  			=> 'Bileşenler, bir demirbaşın parçası olan öğelerdir, örneğin HDD, RAM vb.',
        +    'component_name'                  => 'Bileşen adı',
        +    'checkin'                             => 'Bileşeni Kabul Et',
        +    'checkout'                             => 'Bileşeni teslim et',
        +    'cost'				=> 'Satın alma maliyeti',
        +    'create'                             => 'Bileşen oluştur',
        +    'edit'                             => 'Bileşeni düzenle',
        +    'date'					=> 'Satın Alma Tarihi',
        +    'order'					=> 'Sipariş Numarası',
        +    'remaining' 			             => 'Kalan',
        +    'total' 			                 => 'Toplam',
        +    'update'                            => 'Bileşeni düzenle',
         );
        diff --git a/resources/lang/tr/admin/components/message.php b/resources/lang/tr/admin/components/message.php
        index 1d13970f23..3b46880f7d 100644
        --- a/resources/lang/tr/admin/components/message.php
        +++ b/resources/lang/tr/admin/components/message.php
        @@ -2,34 +2,34 @@
         
         return array(
         
        -    'does_not_exist' => 'Component does not exist.',
        +    'does_not_exist' => 'Bileşen mevcut değil.',
         
             'create' => array(
        -        'error'   => 'Component was not created, please try again.',
        -        'success' => 'Component created successfully.'
        +        'error'   => 'Bileşen oluşturulmadı, lütfen yeniden deneyin.',
        +        'success' => 'Bileşeni başarıyla oluşturuldu.'
             ),
         
             'update' => array(
        -        'error'   => 'Component was not updated, please try again',
        -        'success' => 'Component updated successfully.'
        +        'error'   => 'Bileşen güncellenemedi, lütfen tekrar deneyin',
        +        'success' => 'Bileşen başarıyla güncelleştirildi.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this component?',
        -        'error'   => 'There was an issue deleting the component. Please try again.',
        -        'success' => 'The component was deleted successfully.'
        +        'confirm'   => 'Bu bileşeni silmek istediğinizden emin misiniz?',
        +        'error'   => 'Bileşen silinirken sorun oluştu. Lütfen yeniden deneyin.',
        +        'success' => 'Bileşen başarıyla silindi.'
             ),
         
              'checkout' => array(
        -        'error'   		=> 'Component was not checked out, please try again',
        -        'success' 		=> 'Component checked out successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'error'   		=> 'Bileşeni çıkışı yapılamadı, lütfen tekrar deneyin',
        +        'success' 		=> 'Bileşen çıkışı başarıyla yapıldı.',
        +        'user_does_not_exist' => 'Bu kullanıcı geçersiz. Lütfen tekrar deneyin.'
             ),
         
             'checkin' => array(
        -        'error'   		=> 'Component was not checked in, please try again',
        -        'success' 		=> 'Component checked in successfully.',
        -        'user_does_not_exist' => 'That user is invalid. Please try again.'
        +        'error'   		=> 'Bileşen girişi yapılamadı, lütfen tekrar deneyin',
        +        'success' 		=> 'Bileşen girişi başarıyla yapıldı.',
        +        'user_does_not_exist' => 'Bu kullanıcı geçersiz. Lütfen tekrar deneyin.'
             )
         
         
        diff --git a/resources/lang/tr/admin/components/table.php b/resources/lang/tr/admin/components/table.php
        index 3d4fed6a7f..d751492131 100644
        --- a/resources/lang/tr/admin/components/table.php
        +++ b/resources/lang/tr/admin/components/table.php
        @@ -1,5 +1,5 @@
         <?php
         
         return array(
        -    'title'      				=> 'Component Name',
        +    'title'      				=> 'Bileşen adı',
         );
        diff --git a/resources/lang/tr/admin/consumables/general.php b/resources/lang/tr/admin/consumables/general.php
        index db4692abc6..e4f34a13b5 100644
        --- a/resources/lang/tr/admin/consumables/general.php
        +++ b/resources/lang/tr/admin/consumables/general.php
        @@ -3,11 +3,11 @@
         return array(
             'about_consumables_title' 			=> 'Sarf Malzemeleri Hakkında',
             'about_consumables_text'  			=> 'Sarf malzemeleri satın alınan ve zamanla tüketilen ürünlerdir. Örneğin yazıcı kartuşu, fotokopi kağıdı vs.',
        -    'checkout'                          => 'Checkout Consumable to User',
        +    'checkout'                          => 'Kullanıcıya Sarf malzemesi Satın Alma',
             'consumable_name'                   => 'Sarf Malzemesi Adı',
        -    'create'                            => 'Create Consumable',
        -    'item_no'                           => 'Item No.',
        +    'create'                            => 'Sarf Malzemesi Oluştur',
        +    'item_no'                           => 'Nesne numarası.',
             'remaining' 			            => 'Kalan',
             'total' 			                => 'Toplam',
        -    'update'                            => 'Update Consumable',
        +    'update'                            => 'Sarf malzemesini Güncelle',
         );
        diff --git a/resources/lang/tr/admin/consumables/message.php b/resources/lang/tr/admin/consumables/message.php
        index f01f50ca4e..13a2d0016f 100644
        --- a/resources/lang/tr/admin/consumables/message.php
        +++ b/resources/lang/tr/admin/consumables/message.php
        @@ -15,9 +15,9 @@ return array(
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this consumable?',
        +        'confirm'   => 'Bu sarf malzemesini silmek istediğinizden emin misiniz?',
                 'error'   => 'Sarf malzemesi\'ni silerken hata oluştu. Lütfen tekrar deneyin.',
        -        'success' => 'The consumable was deleted successfully.'
        +        'success' => 'Sarf malzemesi başarıyla silindi.'
             ),
         
              'checkout' => array(
        diff --git a/resources/lang/tr/admin/custom_fields/general.php b/resources/lang/tr/admin/custom_fields/general.php
        index 0fe01b1514..cf1e0bd720 100644
        --- a/resources/lang/tr/admin/custom_fields/general.php
        +++ b/resources/lang/tr/admin/custom_fields/general.php
        @@ -3,28 +3,28 @@
         return array(
             'custom_fields'		        => 'Özel alanlar',
             'field'		                => 'Alan',
        -    'about_fieldsets_title'		=> 'About Fieldsets',
        -    'about_fieldsets_text'		=> 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
        -    'custom_format'             => 'Custom format...',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        -    'encrypt_field_help'      => 'WARNING: Encrypting a field makes it unsearchable.',
        -    'encrypted'      	        => 'Encrypted',
        -    'fieldset'      	        => 'Fieldset',
        +    'about_fieldsets_title'		=> 'Alan kümeleri hakkında',
        +    'about_fieldsets_text'		=> 'Alan kümeleri, belirli varlık model türleri için sıklıkla yeniden kullanılan özel alan grupları oluşturmanızı sağlar.',
        +    'custom_format'             => 'Özel biçim...',
        +    'encrypt_field'      	        => 'Veritabanındaki bu alanın değerini şifreleme',
        +    'encrypt_field_help'      => 'UYARI: Bir alanı şifrelemek, onu aranamaz hale getirir.',
        +    'encrypted'      	        => 'Şifreli',
        +    'fieldset'      	        => 'Alan kümesi',
             'qty_fields'      	      => 'Miktar alanları',
        -    'fieldsets'      	        => 'Fieldsets',
        -    'fieldset_name'           => 'Fieldset Name',
        +    'fieldsets'      	        => 'Alan kümeleri',
        +    'fieldset_name'           => 'Alan kümesi adı',
             'field_name'              => 'Alan Adı',
        -    'field_values'            => 'Field Values',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        -    'field_element'           => 'Form Element',
        -    'field_element_short'     => 'Element',
        +    'field_values'            => 'Alan değerleri',
        +    'field_values_help'       => 'Seçilebilir seçenekler, her satıra bir tane ekleyin. İlk satır dışındaki boş satırlar yoksayılacaktır.',
        +    'field_element'           => 'Form öğesi',
        +    'field_element_short'     => 'Öğe',
             'field_format'            => 'Düzen',
        -    'field_custom_format'     => 'Custom Format',
        +    'field_custom_format'     => 'Özel biçim',
             'required'   		          => 'Gerekli',
        -    'req'   		              => 'Req.',
        -    'used_by_models'   		    => 'Used By Models',
        -    'order'   		            => 'Order',
        -    'create_fieldset'         => 'New Fieldset',
        -    'create_field'            => 'New Custom Field',
        -    'value_encrypted'      	        => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
        +    'req'   		              => 'Talep.',
        +    'used_by_models'   		    => 'Modellerle Kullanılmıştır',
        +    'order'   		            => 'Sipariş',
        +    'create_fieldset'         => 'Yeni alan kümesi',
        +    'create_field'            => 'Yeni özel alan',
        +    'value_encrypted'      	        => 'Bu alanın değeri veritabanında şifrelidir. Yalnızca yönetici kullanıcıları şifresi çözülen değeri görüntüleyebilir',
         );
        diff --git a/resources/lang/tr/admin/custom_fields/message.php b/resources/lang/tr/admin/custom_fields/message.php
        index 2997e0b5cc..07e1ef8dc2 100644
        --- a/resources/lang/tr/admin/custom_fields/message.php
        +++ b/resources/lang/tr/admin/custom_fields/message.php
        @@ -9,7 +9,7 @@ return array(
                 'create' => array(
                     'error'   => 'Alan oluşturulamadı. Lütfen tekrar deneyin.',
                     'success' => 'Alan başarıyla oluşturuldu.',
        -            'assoc_success' => 'Field successfully added to fieldset.'
        +            'assoc_success' => 'Alan, alan kümesine başarıyla eklendi.'
                 ),
         
                 'update' => array(
        @@ -20,31 +20,31 @@ return array(
                 'delete' => array(
                     'confirm'   	=> 'Bu alanı silmek istediğinizden emin misiniz?',
                     'error'   => 'Silme işleminde başarısız. Lütfen tekrar deneyiniz.',
        -            'success' => 'The field was deleted successfully.',
        -            'in_use'   => 'Field is still in use.',
        +            'success' => 'Alan başarıyla silindi.',
        +            'in_use'   => 'Alan hala kullanımda.',
                 )
         
             ),
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
        -            'error'   => 'Fieldset was not created, please try again.',
        -            'success' => 'Fieldset created successfully.'
        +            'error'   => 'Alan kümesi olşturulamadı, lütfen yeniden deneyin.',
        +            'success' => 'Alan kümesi başarıyla oluşturuldu.'
                 ),
         
                 'update' => array(
        -            'error'   => 'Fieldset was not updated, please try again',
        -            'success' => 'Fieldset updated successfully.'
        +            'error'   => 'Alan güncelleştirilmedi, lütfen tekrar deneyin',
        +            'success' => 'Alan başarıyla güncelleştirildi.'
                 ),
         
                 'delete' => array(
        -            'confirm'   	=> 'Are you sure you wish to delete this fieldset?',
        -            'error'   => 'There was an issue deleting the fieldset. Please try again.',
        -            'success' => 'The fieldset was deleted successfully.',
        -            'in_use'   => 'Fieldset is still in use.',
        +            'confirm'   	=> 'Bu alanı silmek istediğinizden emin misiniz?',
        +            'error'   => 'Alanı silinirken bir sorun oluştu. Lütfen yeniden deneyin.',
        +            'success' => 'Alan başarıyla silindi.',
        +            'in_use'   => 'Alan hala kullanılıyor.',
                 )
         
             ),
        diff --git a/resources/lang/tr/admin/departments/message.php b/resources/lang/tr/admin/departments/message.php
        new file mode 100644
        index 0000000000..26aa99155e
        --- /dev/null
        +++ b/resources/lang/tr/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Bölüm mevcut değil.',
        +    'assoc_users'	 => 'Bu bölüm şu anda en az bir kullanıcı ile ilişkili ve silinemez. Bölümü silebilmek için ilişkili kullanıcıları güncelleyin. ',
        +    'create' => array(
        +        'error'   => 'Bölüm oluşturulmadı, lütfen yeniden deneyin.',
        +        'success' => 'Bölüm başarıyla oluşturuldu.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Bölüm güncelleştirilmedi, lütfen tekrar deneyin',
        +        'success' => 'Bölüm başarıyla güncelleştirildi.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Bu bölümü silmek istediğinizden emin misiniz?',
        +        'error'   => 'Bölüm silinirken bir sorun oluştu. Lütfen yeniden deneyin.',
        +        'success' => 'Bölüm başarıyla silindi.'
        +    )
        +
        +);
        diff --git a/resources/lang/tr/admin/departments/table.php b/resources/lang/tr/admin/departments/table.php
        new file mode 100644
        index 0000000000..d277a03288
        --- /dev/null
        +++ b/resources/lang/tr/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Bölüm Adı',
        +    'manager'                   => 'Yönetici',
        +    'location'                  => 'Konum',
        +    'create'                    => 'Bölüm Oluştur',
        +    'update'                    => 'Bölümü Güncelle',
        +    );
        diff --git a/resources/lang/tr/admin/depreciations/general.php b/resources/lang/tr/admin/depreciations/general.php
        index a50cc55fb4..b748ddaa7c 100644
        --- a/resources/lang/tr/admin/depreciations/general.php
        +++ b/resources/lang/tr/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> 'Demirbaş Amortismanları Hakkında',
             'about_depreciations'  					=> 'Demirbaş amortismanını sabit bir oran ile düşecek şekilde ayarlayabilirsiniz.',
             'asset_depreciations'  					=> 'Demirbaş Amortismanları',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => 'Değer Kaybı Oluştur',
             'depreciation_name'  					=> 'Amortisman Adı',
             'number_of_months'  					=> 'Ay Sayısı',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => 'Değer Kaybını Güncelle',
         
         );
        diff --git a/resources/lang/tr/admin/groups/titles.php b/resources/lang/tr/admin/groups/titles.php
        index 4f8d0029f6..95e535e291 100644
        --- a/resources/lang/tr/admin/groups/titles.php
        +++ b/resources/lang/tr/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => 'Gruplar hakkında',
        +    'about_groups'                  => 'Gruplar, kullanıcı izinlerini genellemek için kullanılır.',
             'group_management' 	 	=> 'Grup Yönetimi',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => 'Yeni Grup Oluştur',
        +    'update' 	 		        => 'Grubu Düzenle',
             'group_name' 	 		=> 'Grup Adı',
             'group_admin' 	 		=> 'Grup Yöneticisi',
             'allow' 	 			=> 'Kabul Et',
        diff --git a/resources/lang/tr/admin/hardware/form.php b/resources/lang/tr/admin/hardware/form.php
        index 0536d3647f..04cb23b0aa 100644
        --- a/resources/lang/tr/admin/hardware/form.php
        +++ b/resources/lang/tr/admin/hardware/form.php
        @@ -1,9 +1,9 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        -  'bulk_delete_help'	=> 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
        -  'bulk_delete_warn'	=> 'You are about to delete :asset_count assets.',
        +	'bulk_delete'		=> 'Toplu varlık silmeyi onaylıyor musunuz?',
        +  'bulk_delete_help'	=> 'Toplu silme için aşağıdaki Varlıkları gözden geçirin. Silindikten sonra bu varlıkların geri yüklenebilir fakat atanmış olan herhangi bir kullanıcı ile ilişkili olmayacaktır.',
        +  'bulk_delete_warn'	=> ':asset_count adet varlığı düzenlemek üzeresiniz.',
         	'bulk_update'		=> 'Demirbaşları Toplu Güncelle',
         	'bulk_update_help'	=> 'Bu form birden çok demirbaşı tek seferde güncellemenizi sağlar. Lütfen sadece değiştirmek istediğiniz alanları doldurunuz. Değiştirilmesini istemediğiniz alanları boş bırakınız. ',
         	'bulk_update_warn'	=> ':asset_count adet demirbaşı düzenlemek üzeresiniz.',
        @@ -18,10 +18,10 @@ return array(
             'default_location'	=> 'Varsayılan Konum',
             'eol_date'			=> 'Ömür',
             'eol_rate'			=> 'Ömür Başarısı',
        -    'expected_checkin'  => 'Expected Checkin Date',
        +    'expected_checkin'  => 'Beklenen geri alma tarihi',
             'expires'			=> 'Son kullanma tarihi',
             'fully_depreciated'	=> 'Değeri tamamen düştü',
        -    'help_checkout'		=> 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
        +    'help_checkout'		=> 'Bu varlığı hemen atamak istiyorsanız Durum listesinden "Atanabilir" durumunu seçin. ',
             'mac_address'		=> 'MAC Adresi',
             'manufacturer'		=> 'Üretici',
             'model'				=> 'Model',
        diff --git a/resources/lang/tr/admin/hardware/general.php b/resources/lang/tr/admin/hardware/general.php
        index 553c937574..ee3559cade 100644
        --- a/resources/lang/tr/admin/hardware/general.php
        +++ b/resources/lang/tr/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => 'Varlıklar hakkında',
        +    'about_assets_text'            => 'Varlıklar Demirbaştır seri numarası veya varlık etiketi ile takibi yapılır. Bu nedenle değerli varlıklar benzersiz varlık kimliği ile ilişkilendirilirler.',
         	'archived'  				=> 'Arşivlenmiş',
             'asset'  					=> 'Demirbaş',
        -    'bulk_checkout'             => 'Checkout Assets to User',
        +    'bulk_checkout'             => 'Varlıkları kullanıcıya ata',
             'checkin'  					=> 'Demirbaş Girişi Yap',
        -    'checkout'  				=> 'Demirbaşı bu kullanıcıya çıkış yap',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Demirbaşı Kopyala',
             'deployable'  				=> 'Dağıtılabilir',
             'deleted'  					=> 'Bu demirbaş silindi. <a href="/hardware/:asset_id/restore">Geri getirmek için tıklayınız</a>.',
        @@ -15,7 +15,7 @@ return array(
         	'filetype_info'				=> 'Kabul edilen dosya türleri : png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, ve rar.',
             'model_deleted'  			=> 'Bu demirbaş modeli silindi. Bu demirbaşı geri getirmek için önce modeli geri getiriniz. <br/><a href="/hardware/models/:model_id/restore">Modeli geri getirmek için tıklayınız</a>.',
             'requestable'               => 'Talep edilebilir',
        -    'requested'				    => 'Requested',
        +    'requested'				    => 'Talep edildi',
             'restore'  					=> 'Demirbaşı Geri Getir',
             'pending'  					=> 'Bekliyor',
             'undeployable'  			=> 'Dağtılamaz',
        diff --git a/resources/lang/tr/admin/hardware/message.php b/resources/lang/tr/admin/hardware/message.php
        index f9b856778c..45d2a75f01 100644
        --- a/resources/lang/tr/admin/hardware/message.php
        +++ b/resources/lang/tr/admin/hardware/message.php
        @@ -5,7 +5,7 @@ return array(
             'undeployable' 		=> '<strong>Uyarı:</strong> Bu demirbaş dağıtılamaz olarak işlaretlenmiş.
                                 Eğer durumu değişti ise, lütfen Demirbaş Durumu\'nu güncelleyiniz.',
             'does_not_exist' 	=> 'Demirbaş mevcut değil.',
        -    'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
        +    'does_not_exist_or_not_requestable' => 'İyi denemeydi. Bu varlık mevcut değil veya talep edilebilir değil.',
             'assoc_users'	 	=> 'Bu demirbaş kullanıcıya çıkış yapılmış olaran görülüyor ve silinemez. Lütfen önce demirbaş girişi yapınız, ardından tekrar siliniz. ',
         
             'create' => array(
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Demirbaş geri getirildi.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Dosya silinemedi. Lütfen tekrar deneyin.',
                 'success' => 'Dosya silindi.',
        @@ -32,22 +38,23 @@ return array(
             'upload' => array(
                 'error'   => 'Dosya(lar) yüklenemedi. Lütfen tekrar deneyin.',
                 'success' => 'Dosya(lar) yüklendi.',
        -        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        +        'nofiles' => 'Yükleme için herhangi bir dosya seçmediniz veya karşıya yüklemeye çalıştığınız dosya çok büyük',
                 'invalidfiles' => 'Bir ya da daha fazla dosya izin verilen boyuttan daha büyük ya da izin verilmeyen bir dosya tipi seçtiniz. Lütfen dosya boyutu ve tipini kontrol ediniz.',
             ),
         
             'import' => array(
        -        'error'                 => 'Some items did not import correctly.',
        -        'errorDetail'           => 'The following Items were not imported because of errors.',
        -        'success'               => "Your file has been imported",
        -        'file_delete_success'   => "Your file has been been successfully deleted",
        -        'file_delete_error'      => "The file was unable to be deleted",
        +        'error'                 => 'Bazı öğeler doğru şekilde içe aktarılamadı.',
        +        'errorDetail'           => 'Aşağıdaki öğeler hatalar nedeniyle alınamadı.',
        +        'success'               => "Dosyanızı içe aktarıldı",
        +        'file_delete_success'   => "Dosyanız başarıyla silindi",
        +        'file_delete_error'      => "Dosya silenemedi",
             ),
         
         
             'delete' => array(
                 'confirm'   	=> 'Demirbaşı silmek istediğinize emin misiniz?',
                 'error'   		=> 'Demirbaş silinirken bir problem oluştu. Lütfen tekrar deneyin.',
        +        'nothing_updated'   => 'Herhangi bir varlık seçilmediği için silinemedi.',
                 'success' 		=> 'Demirbaş silindi.'
             ),
         
        @@ -55,21 +62,21 @@ return array(
                 'error'   		=> 'Demirbaş çıkışı yapılamadı. Lütfen tekrar deneyin',
                 'success' 		=> 'Demirbaş çıkışı yapıldı.',
                 'user_does_not_exist' => 'Bu kullanıcı geçersiz. Lütfen tekrar deneyin.',
        -        'not_available' => 'That asset is not available for checkout!'
        +        'not_available' => 'Bu varlık için atama yapılamaz!'
             ),
         
             'checkin' => array(
                 'error'   		=> 'Demirbaş girişi yapılamadı. Lütfen tekrar deneyin',
                 'success' 		=> 'Demirbaş girişi yapıldı.',
                 'user_does_not_exist' => 'Bu kullanıcı geçersiz. Lütfen tekrar deneyin.',
        -        'already_checked_in'  => 'That asset is already checked in.',
        +        'already_checked_in'  => 'Bu varlık zaten atanmış.',
         
             ),
         
             'requests' => array(
        -        'error'   		=> 'Asset was not requested, please try again',
        -        'success' 		=> 'Asset requested successfully.',
        -        'canceled'      => 'Checkout request successfully canceled'
        +        'error'   		=> 'Varlık talep edilmemiş, lütfen tekrar deneyin',
        +        'success' 		=> 'Varlık talep edildi.',
        +        'canceled'      => 'Varlık talebi reddedildi'
             )
         
         );
        diff --git a/resources/lang/tr/admin/hardware/table.php b/resources/lang/tr/admin/hardware/table.php
        index 67b728a129..2ed5b94167 100644
        --- a/resources/lang/tr/admin/hardware/table.php
        +++ b/resources/lang/tr/admin/hardware/table.php
        @@ -18,7 +18,7 @@ return array(
             'serial'   		=> 'Seri No',
             'status'   		=> 'Durum',
             'title'      	=> 'Demirbaş ',
        -    'image'		=> 'Device Image',
        -    'days_without_acceptance' => 'Days Without Acceptance'
        +    'image'		=> 'Cihaz resmi',
        +    'days_without_acceptance' => 'Kabul edilmeden geçen gün'
         
         );
        diff --git a/resources/lang/tr/admin/licenses/form.php b/resources/lang/tr/admin/licenses/form.php
        index eb493d76c8..58f7450e2d 100644
        --- a/resources/lang/tr/admin/licenses/form.php
        +++ b/resources/lang/tr/admin/licenses/form.php
        @@ -6,7 +6,7 @@ return array(
             'checkin'           => 'Giriş',
             'create'            => 'Lisans Oluştur',
             'expiration'        => 'Son Geçerlilik Tarihi',
        -    'license_key'       => 'Product Key',
        +    'license_key'       => 'Ürün anahtarı',
             'maintained'        => 'Korumalı',
             'name'              => 'Yazılım Adı',
             'no_depreciation'   => 'Mortisman Yok',
        diff --git a/resources/lang/tr/admin/licenses/general.php b/resources/lang/tr/admin/licenses/general.php
        index e0ec0bf76e..2b64606501 100644
        --- a/resources/lang/tr/admin/licenses/general.php
        +++ b/resources/lang/tr/admin/licenses/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => 'Lisanslar Hakkında',
        +    'about_licenses'                  => 'Lisanslar yazılım takibi için kullanılır.  Kullanıcı sayısı kadar kişide kullanılabilir',
             'checkin'  					=> 'Lisans Kullanıcısı Girişi',
             'checkout_history'  		=> 'Çıkış Geçmişi',
             'checkout'  				=> 'Lisans Kullanıcı Çıkışı',
             'edit'  					=> 'Lisansı Düzenle',
        -    'filetype_info'				=> 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'filetype_info'				=> 'İzin verilen dosya türleri; png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar.',
             'clone'  					=> 'Lisansı Kopyala',
             'history_for'  				=> 'Geçmiş ',
             'in_out'  					=> 'Giriş/Çıkış',
        diff --git a/resources/lang/tr/admin/licenses/message.php b/resources/lang/tr/admin/licenses/message.php
        index 7fe178d787..336f7a54f3 100644
        --- a/resources/lang/tr/admin/licenses/message.php
        +++ b/resources/lang/tr/admin/licenses/message.php
        @@ -22,8 +22,8 @@ return array(
             'upload' => array(
                 'error'   => 'Dosya(lar) yüklenemedi. Lütfen tekrar deneyin.',
                 'success' => 'Dosya(lar) yüklendi.',
        -        'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'nofiles' => 'Yükleme için herhangi bir dosya seçmediniz veya karşıya yüklemeye çalıştığınız dosya çok büyük',
        +        'invalidfiles' => 'Bir veya daha fazla dosya çok büyük veya izin verilmeyen bir dosya türü. İzin verilen dosya türleri; png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
             ),
         
             'update' => array(
        diff --git a/resources/lang/tr/admin/locations/message.php b/resources/lang/tr/admin/locations/message.php
        index 5e0531f4e0..68de5114fb 100644
        --- a/resources/lang/tr/admin/locations/message.php
        +++ b/resources/lang/tr/admin/locations/message.php
        @@ -4,8 +4,8 @@ return array(
         
             'does_not_exist' => 'Konum mevcut değil.',
             'assoc_users'	 => 'Konum en az 1 kullanıcı ile ilişkili durumda ve silinemez. Lütfen önce kullanıcıları güncelleyerek konumu boşaltın ve tekrar deneyin. ',
        -    'assoc_assets'	 => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
        -    'assoc_child_loc'	 => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
        +    'assoc_assets'	 => 'Bu konum şu anda en az bir varlık ile ilişkili ve silinemez. Lütfen artık bu konumu kullanabilmek için varlık konumlarını güncelleştirin.',
        +    'assoc_child_loc'	 => 'Bu konum şu anda en az bir alt konum üstüdür ve silinemez. Lütfen artık bu konuma ait alt konumları güncelleyin. ',
         
         
             'create' => array(
        diff --git a/resources/lang/tr/admin/locations/table.php b/resources/lang/tr/admin/locations/table.php
        index 8fdbe0841e..d59d0a7d4d 100644
        --- a/resources/lang/tr/admin/locations/table.php
        +++ b/resources/lang/tr/admin/locations/table.php
        @@ -1,9 +1,9 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        -    'assets_rtd'                => 'Assets', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
        +    'about_locations_title'     => 'Lokasyonlar hakkında',
        +    'about_locations'           => 'Konum bilgileri kullanıcılar, varlıklar ve diğer nesneleri izlemek için kullanılır',
        +    'assets_rtd'                => 'Varlıklar', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => 'Varlık Atandı',
             'id'                        => 'ID',
             'city'                      => 'Şehir',
        @@ -15,6 +15,7 @@ return array(
             'address'                   => 'Adres',
             'zip'                       => 'Posta kodu',
             'locations'                 => 'Konumlar',
        -    'parent'                    => 'Parent',
        -    'currency'                  => 'Location Currency',
        +    'parent'                    => 'Üst',
        +    'currency'                  => 'Lokasyon Para Birimi',
        +    'ldap_ou'                   => 'LDAP arama OU',
             );
        diff --git a/resources/lang/tr/admin/manufacturers/table.php b/resources/lang/tr/admin/manufacturers/table.php
        index 9204f89271..8140ec5f2f 100644
        --- a/resources/lang/tr/admin/manufacturers/table.php
        +++ b/resources/lang/tr/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'Üreticiler hakkında',
        +    'about_manufacturers_text'  => 'Üreticiler varlıkları oluşturan şirketledir. Önemli servis sağlayıcı bilgilerinizi burada saklayabilirsiniz. Varlıkların detay kısmında bu bilgilere ulaşabilirsiniz.',
             'asset_manufacturers'	=> 'Demirbaş Üreticileri',
             'create'				=> 'Üretici Oluştur',
             'id'   					=> 'ID',
        -    'name'      			=> 'Üretici Adı',
        +    'name'      			=> 'Ad',
        +    'support_email'   		=> 'Destek Maili',
        +    'support_phone'   		=> 'Destek telefonu',
        +    'support_url'   		=> 'Destek URL\'si',
             'update'				=> 'Üretici Güncelle',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/tr/admin/models/general.php b/resources/lang/tr/admin/models/general.php
        index b21d15de9c..4bf7fe094b 100644
        --- a/resources/lang/tr/admin/models/general.php
        +++ b/resources/lang/tr/admin/models/general.php
        @@ -1,15 +1,15 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => 'Varlık Modelleri Hakkında',
        +    'about_models_text'           => 'Varlık Modelleri, özdeş varlıkları gruplamanın bir yoludur. Örn: "Tiny M73", "Samsung A7", vb.',
             'deleted'  					        => 'Model silindi. <a href="/hardware/models/:model_id/restore">Geri getirmek için buraya tıklayınız</a>.',
             'restore'                   => 'Modeli geri getir',
        -    'requestable'               => 'Users may request this model',
        +    'requestable'               => 'Kullanıcılar bu modeli talep edebilir',
         	'show_mac_address'			      => 'Bu model demirbaşta MAC adresi göster',
             'view_deleted'              => 'Silinenleri görüntüle',
             'view_models'               => 'Modelleri görüntüle',
        -    'fieldset'                  => 'Fieldset',
        -    'no_custom_field'           => 'No custom fields',
        +    'fieldset'                  => 'Alan',
        +    'no_custom_field'           => 'Özel alan yok',
         
         );
        diff --git a/resources/lang/tr/admin/models/message.php b/resources/lang/tr/admin/models/message.php
        index 0c8ad7e138..3f0f67f2b5 100644
        --- a/resources/lang/tr/admin/models/message.php
        +++ b/resources/lang/tr/admin/models/message.php
        @@ -9,7 +9,7 @@ return array(
             'create' => array(
                 'error'   => 'Klasör oluşturulmadı, lütfen tekrar deneyin.',
                 'success' => 'Model oluşturuldu.',
        -        'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
        +        'duplicate_set' => 'Bu üretici ve model numarası ile bir varlık ve model zaten var.',
             ),
         
             'update' => array(
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Model geri getirildi.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'Hiçbir alan değiştirilmedi, dolayısıyla hiç bir alan güncellenmedi.',
        +        'success' 		=> 'Model güncellendi.'
        +    ),
        +
         );
        diff --git a/resources/lang/tr/admin/settings/general.php b/resources/lang/tr/admin/settings/general.php
        index 9458f98237..f000c8b014 100644
        --- a/resources/lang/tr/admin/settings/general.php
        +++ b/resources/lang/tr/admin/settings/general.php
        @@ -2,75 +2,87 @@
         
         return array(
             'ad'				        => 'Active Directory',
        -    'ad_domain'				    => 'Active Directory domain',
        -    'ad_domain_help'			=> 'This is sometimes the same as your email domain, but not always.',
        -    'is_ad'				        => 'This is an Active Directory server',
        +    'ad_domain'				    => 'Active Directory etki alanı',
        +    'ad_domain_help'			=> 'Mail etki alanı gibidir fakat her zaman aynı olmayabilir.',
        +    'is_ad'				        => 'Active Directory sunucusudur',
         	'alert_email'				=> 'Uyarıları gönder',
        -	'alerts_enabled'			=> 'Alerts Enabled',
        -	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
        -	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
        +	'alerts_enabled'			=> 'Uyarılar etkinleştirildi',
        +	'alert_interval'			=> 'Uyarı bitiş zamanı (gün içinde)',
        +	'alert_inv_threshold'		=> 'Son uyarı zamanı',
         	'asset_ids'					=> 'Demirbaş No',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Otomatik artan Demirbaş No üret',
         	'auto_increment_prefix'		=> 'Ünvan (opsiyonel)',
         	'auto_incrementing_help'    => 'Otomatik artan demirbaş No ilk buradan başlasın',
         	'backups'					=> 'Yedekler',
         	'barcode_settings'			=> 'Barkod Ayarları',
        -    'confirm_purge'			    => 'Confirm Purge',
        -    'confirm_purge_help'		=> 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone.',
        -	'custom_css'				=> 'Custom CSS',
        -	'custom_css_help'			=> 'Enter any custom CSS overrides you would like to use. Do not include the &lt;style&gt;&lt;/style&gt; tags.',
        -	'default_currency'  		=> 'Default Currency',
        +    'confirm_purge'			    => 'Temizleme Onayı',
        +    'confirm_purge_help'		=> 'Silinmiş kayıtları temizlemek için kutuya "DELETE" yazın. Bu işlem alınamaz. SON KARARIN MI ???',
        +	'custom_css'				=> 'Özel CSS',
        +	'custom_css_help'			=> 'Kullanmak istediğiniz özel CSS geçersiz. &lt;style&gt;&lt;/style&gt; etiketlerini kullanmayın.',
        +	'default_currency'  		=> 'Varsayılan Para Birimi',
         	'default_eula_text'			=> 'Varsayılan Sözleşme',
        -  'default_language'					=> 'Default Language',
        +  'default_language'					=> 'Varsayılan Dil',
         	'default_eula_help_text'	=> 'Özel Demirbaş Kategorileri için özel Son Kullanıcı Lisans Sözleşmesi ilişkilendirebilirsiniz.',
             'display_asset_name'        => 'Demirbaş Adı Göster',
             'display_checkout_date'     => 'Çıkış Tarihi Göster',
             'display_eol'               => 'Tablo görüntüsünde Sözleşmeyi görüntüle',
        -    'display_qr'                => 'Display Square Codes',
        -	'display_alt_barcode'		=> 'Display 1D barcode',
        -	'barcode_type'				=> '2D Barcode Type',
        -	'alt_barcode_type'			=> '1D barcode type',
        +    'display_qr'                => 'QR Kodu Göster',
        +	'display_alt_barcode'		=> '1D Barkodu Göster',
        +	'barcode_type'				=> '2D Barkod Türü',
        +	'alt_barcode_type'			=> '1D Barkod Türü',
             'eula_settings'				=> 'Son Kullanıcı Lisans Sözleşmesi Ayarları',
             'eula_markdown'				=> 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
             'general_settings'			=> 'Genel Ayarlar',
        -	'generate_backup'			=> 'Generate Backup',
        +	'generate_backup'			=> 'Yedek Oluştur',
             'header_color'              => 'Başlık rengi',
             'info'                      => 'Bu ayarlardan kurulum görünüşünüzü kişiselleştirebilirsiniz.',
             'laravel'                   => 'Laravel Version',
        -    'ldap_enabled'              => 'LDAP enabled',
        -    'ldap_integration'          => 'LDAP Integration',
        -    'ldap_settings'             => 'LDAP Settings',
        -    'ldap_server'               => 'LDAP Server',
        -    'ldap_server_help'          => 'This should start with ldap:// (for unencrypted or TLS) or ldaps:// (for SSL)',
        -	'ldap_server_cert'			=> 'LDAP SSL certificate validation',
        -	'ldap_server_cert_ignore'	=> 'Allow invalid SSL Certificate',
        -	'ldap_server_cert_help'		=> 'Select this checkbox if you are using a self signed SSL cert and would like to accept an invalid SSL certificate.',
        -    'ldap_tls'                  => 'Use TLS',
        -    'ldap_tls_help'             => 'This should be checked only if you are running STARTTLS on your LDAP server. ',
        -    'ldap_uname'                => 'LDAP Bind Username',
        -    'ldap_pword'                => 'LDAP Bind Password',
        +    'ldap_enabled'              => 'LDAP etkin',
        +    'ldap_integration'          => 'LDAP Entegrasyonu',
        +    'ldap_settings'             => 'LDAP Ayarları',
        +    'ldap_server'               => 'LDAP Sunucu',
        +    'ldap_server_help'          => 'ldap:// (şifrelenmemiş veya TLS) veya ldaps:// (SSL için) ile başlamalıdır',
        +	'ldap_server_cert'			=> 'LDAP SSL sertifikası doğrulama',
        +	'ldap_server_cert_ignore'	=> 'Geçersiz SSL sertifikası kabul et',
        +	'ldap_server_cert_help'		=> 'Kendinden imzalı bir SSL sertifikası kullanıyorsanız ve geçersiz bir SSL sertifikası kabul etmek istiyorsanız bu onay kutusunu seçin.',
        +    'ldap_tls'                  => 'TLS Kullan',
        +    'ldap_tls_help'             => 'Yalnızca LDAP sunucunuzda STARTTLS çalıştırıyorsanız bu kutuyu işaretleyin. ',
        +    'ldap_uname'                => 'LDAP Bind Kullanıcı Adı',
        +    'ldap_pword'                => 'LDAP Bind Parola',
             'ldap_basedn'               => 'Base Bind DN',
        -    'ldap_filter'               => 'LDAP Filter',
        -    'ldap_pw_sync'              => 'LDAP Password Sync',
        -    'ldap_pw_sync_help'         => 'Uncheck this box if you do not wish to keep LDAP passwords synced with local passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
        -    'ldap_username_field'       => 'Username Field',
        -    'ldap_lname_field'          => 'Last Name',
        -    'ldap_fname_field'          => 'LDAP First Name',
        -    'ldap_auth_filter_query'    => 'LDAP Authentication query',
        -    'ldap_version'              => 'LDAP Version',
        -    'ldap_active_flag'          => 'LDAP Active Flag',
        -    'ldap_emp_num'              => 'LDAP Employee Number',
        -    'ldap_email'                => 'LDAP Email',
        -    'load_remote_text'          => 'Remote Scripts',
        -    'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'ldap_filter'               => 'LDAP filtre',
        +    'ldap_pw_sync'              => 'LDAP Parola Senkronu',
        +    'ldap_pw_sync_help'         => 'LDAP şifrelerinin yerel parolalarla senkronize edilmesini istemiyorsanız, bu onay kutusunun işaretini kaldırın. Bu durumun devre dışı bırakılması, LDAP sunucunuza herhangi bir nedenle ulaşılamazsa, kullanıcılarınızın oturum açamayabileceği anlamına gelir.',
        +    'ldap_username_field'       => 'Kullanıcı Adı Alanı',
        +    'ldap_lname_field'          => 'Soyadı',
        +    'ldap_fname_field'          => 'LDAP adı',
        +    'ldap_auth_filter_query'    => 'LDAP kimlik doğrulama sorgu',
        +    'ldap_version'              => 'LDAP versiyon',
        +    'ldap_active_flag'          => 'LDAP etkin bayrak',
        +    'ldap_emp_num'              => 'LDAP Çalışan Numarası',
        +    'ldap_email'                => 'LDAP Mail',
        +    'load_remote_text'          => 'Uzak Komut dosyaları',
        +    'load_remote_help_text'		=> 'Bu Snipe-IT kurulumu dış ortamdan scriptler yükleyebilir.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
        -    'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
        -    'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        +    'full_multiple_companies_support_help_text' => 'Kısıtlı kullanıcılar Firmaların varlıkları için firmalara atanmıştır.',
        +    'full_multiple_companies_support_text' => 'Birden Fazla Şirket Desteği',
             'optional'					=> 'İsteğe bağlı',
             'per_page'                  => 'Sayfa başına sonuç sayısı',
             'php'                       => 'PHP Versiyonu',
             'php_gd_info'               => 'QR Kodlarını görüntülemek için php-gd yüklemelisiniz, kurulum talimatlarına bakınız.',
             'php_gd_warning'            => 'PHP Image Processing ve GD eklentileri yüklü değil.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Bu işlemi gerçekleştirmek için önce QR Kodlarını etkinleştirin',
             'qr_text'                   => 'QR Kodu Yazısı',
             'setting'                   => 'Ayar',
        @@ -85,49 +97,52 @@ return array(
             'system'                    => 'Sistem Bilgisi',
             'update'                    => 'Ayarları Güncelle',
             'value'                     => 'Değer',
        -    'brand'                     => 'Branding',
        -    'about_settings_title'      => 'About Settings',
        -    'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
        -    'labels_per_page'           => 'Labels per page',
        -    'label_dimensions'          => 'Label dimensions (inches)',
        -    'page_padding'             => 'Page margins (inches)',
        -    'purge'                    => 'Purge Deleted Records',
        -    'labels_display_bgutter'    => 'Label bottom gutter',
        -    'labels_display_sgutter'    => 'Label side gutter',
        -    'labels_fontsize'           => 'Label font size',
        -    'labels_pagewidth'          => 'Label sheet width',
        -    'labels_pageheight'         => 'Label sheet height',
        -    'label_gutters'        => 'Label spacing (inches)',
        -    'page_dimensions'        => 'Page dimensions (inches)',
        -    'label_fields'          => 'Label visible fields',
        -    'inches'        => 'inches',
        -    'width_w'        => 'w',
        -    'height_h'        => 'h',
        -    'text_pt'        => 'pt',
        -    'two_factor'        => 'Two Factor Authentication',
        -    'two_factor_secret'        => 'Two-Factor Code',
        -    'two_factor_enrollment'        => 'Two-Factor Enrollment',
        -    'two_factor_enabled_text'        => 'Enable Two Factor',
        -    'two_factor_reset'        => 'Reset Two-Factor Secret',
        -    'two_factor_reset_help'        => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ',
        -    'two_factor_reset_success'          => 'Two factor device successfully reset',
        -    'two_factor_reset_error'          => 'Two factor device reset failed',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        -    'two_factor_enabled_help'        => 'This will turn on two-factor authentication using Google Authenticator.',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        -    'two_factor_required'        => 'Required for all users',
        -    'two_factor_disabled'        => 'Disabled',
        -    'two_factor_enter_code'	=> 'Enter Two-Factor Code',
        -    'two_factor_config_complete'	=> 'Submit Code',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        -    'two_factor_enrollment_text'	=> "Two factor authentication is required, however your device has not been enrolled yet. Open your Google Authenticator app and scan the QR code below to enroll your device. Once you've enrolled your device, enter the code below",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        -    'left'        => 'left',
        -    'right'        => 'right',
        -    'top'        => 'top',
        -    'bottom'        => 'bottom',
        -    'vertical'        => 'vertical',
        -    'horizontal'        => 'horizontal',
        -    'zerofill_count'        => 'Length of asset tags, including zerofill',
        +    'brand'                     => 'Marka',
        +    'about_settings_title'      => 'Ayarlar Hakkında',
        +    'about_settings_text'       => 'Bu ayarlar, yüklemenizin belirli yönlerini özelleştirmenizi sağlar.',
        +    'labels_per_page'           => 'Sayfa Başına Etiketler',
        +    'label_dimensions'          => 'Etiket boyutları (inç)',
        +    'next_auto_tag_base'        => 'Sonraki otomatik artış',
        +    'page_padding'             => 'Sayfa kenar boşlukları (inç)',
        +    'purge'                    => 'Silinmiş Kayıtları Temizle',
        +    'labels_display_bgutter'    => 'Etiket alt cilt payı',
        +    'labels_display_sgutter'    => 'Etiket tarafı oluk',
        +    'labels_fontsize'           => 'Etiket yazı tipi boyutu',
        +    'labels_pagewidth'          => 'Etiket sayfası genişliği',
        +    'labels_pageheight'         => 'Etiket sayfası yüksekliği',
        +    'label_gutters'        => 'Etiket aralığı (inç)',
        +    'page_dimensions'        => 'Sayfa boyutu (inç)',
        +    'label_fields'          => 'Etiket görünür alanları',
        +    'inches'        => 'inç',
        +    'width_w'        => 'g',
        +    'height_h'        => 'y',
        +    'text_pt'        => 'dpi',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
        +    'two_factor'        => 'İki Aşamalı Doğrulama',
        +    'two_factor_secret'        => 'İki Aşamalı Kod',
        +    'two_factor_enrollment'        => 'İki Aşamalı Kayıt',
        +    'two_factor_enabled_text'        => 'İki Aşamalı Şifrelemeyi Etkinleştir',
        +    'two_factor_reset'        => 'Gizli İki Aşamalı Şifrelemeyi Sıfırla',
        +    'two_factor_reset_help'        => 'Bu işlem, kullanıcıyı cihazlarını Google Authenticator ile tekrar kayıt etmeye zorlar. Bu, kayıtlı cihazlarının kaybolması veya çalınması durumunda yararlı olabilir. ',
        +    'two_factor_reset_success'          => 'İki aşamalı aygıt başarıyla sıfırlandı',
        +    'two_factor_reset_error'          => 'İki aşamalı aygıt sıfırlanamadı',
        +    'two_factor_enabled_warning'        => 'Halihazırda etkinleştirilmemişse iki aşamalı şifreleme etkinleştirilmesi sizi bir Google Auth kayıtlı cihazla yetkilendirmenizi zorlar. Şu an kayıtlı değilseniz, cihazınızı kaydetme olanağına sahip olacaksınız.',
        +    'two_factor_enabled_help'        => 'Bu Google kimlik doğrulayıcısı kullanma iki aşamalı kimlik doğrulamasına dönecek.',
        +    'two_factor_optional'        => 'Seçici (Kullanıcılar izin verilirse etkinleştirebilir veya devre dışı bırakabilir)',
        +    'two_factor_required'        => 'Tüm kullanıcılar için gerekli',
        +    'two_factor_disabled'        => 'Devredışı',
        +    'two_factor_enter_code'	=> 'İki Aşamalı Kod Girin',
        +    'two_factor_config_complete'	=> 'Kodu Gönder',
        +    'two_factor_enabled_edit_not_allowed' => 'Yöneticiniz bu ayarı düzenlemeniz için izin vermiyor.',
        +    'two_factor_enrollment_text'	=> "Cihazınız henüz kayıtlı değil ancak iki aşamalı kimlik doğrulama gereklidir. Google kimlik doğrulayıcısı app açmak ve tarama QR kodu cihazınızı kayıt için aşağıdaki. Aygıtınız kayıtlı sonra aşağıdaki kodu girin",
        +    'require_accept_signature'      => 'İmza Gerekli',
        +    'require_accept_signature_help_text'      => 'Bu özelliği etkinleştirmek kullanıcıların fiziksel olarak bir varlık kabul evrağı imzalaması gerekir.',
        +    'left'        => 'sol',
        +    'right'        => 'sağ',
        +    'top'        => 'üst',
        +    'bottom'        => 'alt',
        +    'vertical'        => 'dikey',
        +    'horizontal'        => 'yatay',
        +    'zerofill_count'        => 'Varlık etiketlerinin uzunluğu, boşluksuz olmak üzere',
         );
        diff --git a/resources/lang/tr/admin/settings/message.php b/resources/lang/tr/admin/settings/message.php
        index 008ce9b715..322285daa6 100644
        --- a/resources/lang/tr/admin/settings/message.php
        +++ b/resources/lang/tr/admin/settings/message.php
        @@ -8,15 +8,15 @@ return array(
                 'success'               => 'Ayarlar güncellendi.'
             ),
             'backup' => array(
        -        'delete_confirm'        => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
        +        'delete_confirm'        => 'Bu yedek dosyayı silmek istediğinizden emin misiniz? Bu eylem geri alınamaz. ',
                 'file_deleted'          => 'Yedek dosyası başarıyla silindi.',
        -        'generated'             => 'A new backup file was successfully created.',
        -        'file_not_found'        => 'That backup file could not be found on the server.',
        +        'generated'             => 'Yeni bir yedekleme dosyası başarıyla oluşturuldu.',
        +        'file_not_found'        => 'Bu yedek dosyası sunucuda bulunamadı.',
             ),
             'purge' => array(
        -        'error'     => 'An error has occurred while purging. ',
        -        'validation_failed'     => 'Your purge confirmation is incorrect. Please type the word "DELETE" in the confirmation box.',
        -        'success'               => 'Deleted records successfully purged.'
        +        'error'     => 'Temizleme sırasında bir hata oluştu. ',
        +        'validation_failed'     => 'Temizle onay kodu yanlıştır. Lütfen onay kutusuna "DELETE" yazın.',
        +        'success'               => 'Silinen kayıtları başarıyla temizlendi.'
             ),
         
         );
        diff --git a/resources/lang/tr/admin/statuslabels/message.php b/resources/lang/tr/admin/statuslabels/message.php
        index 619a5a509c..805514c5be 100644
        --- a/resources/lang/tr/admin/statuslabels/message.php
        +++ b/resources/lang/tr/admin/statuslabels/message.php
        @@ -2,24 +2,24 @@
         
         return array(
         
        -    'does_not_exist' => 'Status Label does not exist.',
        -    'assoc_assets'	 => 'This Status Label is currently associated with at least one Asset and cannot be deleted. Please update your assets to no longer reference this status and try again. ',
        +    'does_not_exist' => 'Durum etiket yok.',
        +    'assoc_assets'	 => 'Bu durum etiketi şu anda en az bir varlık ile ilişkili ve silinemez. Lütfen artık bu durum başvuru ve yeniden denemek için sabit kıymetleri güncelleştirin. ',
         
         
             'create' => array(
        -        'error'   => 'Status Label was not created, please try again.',
        -        'success' => 'Status Label created successfully.'
        +        'error'   => 'Durum etiketi oluşturulamadı, lütfen yeniden deneyin.',
        +        'success' => 'Durum etiketi başarıyla oluşturuldu.'
             ),
         
             'update' => array(
        -        'error'   => 'Status Label was not updated, please try again',
        -        'success' => 'Status Label updated successfully.'
        +        'error'   => 'Durum etiket güncelleştirilmedi, lütfen tekrar deneyin',
        +        'success' => 'Durum etiketi başarıyla güncelleştirildi.'
             ),
         
             'delete' => array(
        -        'confirm'   => 'Are you sure you wish to delete this Status Label?',
        -        'error'   => 'There was an issue deleting the Status Label. Please try again.',
        -        'success' => 'The Status Label was deleted successfully.'
        +        'confirm'   => 'Bu durum etiketi silmek istediğinizden emin misiniz?',
        +        'error'   => 'Durum etiketi silerken bir sorun oluştu. Lütfen yeniden deneyin.',
        +        'success' => 'Durum etiketi başarıyla silindi.'
             )
         
         );
        diff --git a/resources/lang/tr/admin/statuslabels/table.php b/resources/lang/tr/admin/statuslabels/table.php
        index 215479bbb0..f51c790c72 100644
        --- a/resources/lang/tr/admin/statuslabels/table.php
        +++ b/resources/lang/tr/admin/statuslabels/table.php
        @@ -4,13 +4,13 @@ return array(
             'about'      	=> 'Durum Etiketi Hakkında',
             'archived'      	=> 'Arşivlenmiş',
             'create'      	=> 'Durum Etiketi Oluştur',
        -    'color'      	=> 'Chart Color',
        +    'color'      	=> 'Grafik rengi',
             'deployable'      	=> 'Dağıtılabilir',
             'info'      	=> 'Durum Etiketleri demirbaşınızın o anki durumunu tanımlamada kullanılır. Demirbaşınız o an onarımda ya da kayıp/çalınmış olabilir. Dağıtılabilir, Beklemede ve Arşivlenmiş demirbaşlarınız için yeni durum etiketleri oluşturabilirsiniz.',
             'name'      	=> 'Durum Adı',
             'pending'      	=> 'Beklemede',
             'status_type'   => 'Durum Türü',
        -    'show_in_nav'   => 'Show in side nav',
        +    'show_in_nav'   => 'Kenar çubuğunda göster',
             'title'      	=> 'Durum Etiketleri',
             'undeployable'  => 'Dağtılamaz',
             'update'      	=> 'Durum Etiketi Güncelle',
        diff --git a/resources/lang/tr/admin/suppliers/table.php b/resources/lang/tr/admin/suppliers/table.php
        index d1e5172d78..24bf5be22a 100644
        --- a/resources/lang/tr/admin/suppliers/table.php
        +++ b/resources/lang/tr/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => 'Tedarikçiler Hakkında',
        +    'about_suppliers_text'  => 'Tedarikçiler, varlıkların kaynağını izlemek için kullanılır',
             'address'               => 'Tedarikçi Adresi',
             'assets'                => 'Demirbaşlar',
             'city'                  => 'Şehir',
        diff --git a/resources/lang/tr/admin/users/general.php b/resources/lang/tr/admin/users/general.php
        index aa7100331a..86a3edc3ac 100644
        --- a/resources/lang/tr/admin/users/general.php
        +++ b/resources/lang/tr/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => 'Demirbaşlar şu kişiye atandı :name',
        -    'current_assets'    => 'Assets currently checked out to this user',
        +    'bulk_update_warn'	=> ': user_count Kullanıcının özelliklerini düzenlemek üzeresiniz. Lütfen, bu formu kullanarak kendi kullanıcı özniteliklerini değiştiremeyeceğinizi ve kendi kullanıcılarınız için ayrı ayrı düzenlemeler yapmanız gerektiğini unutmayın.',
        +    'bulk_update_help'	=> 'Bu form, birden fazla kullanıcıyı bir kerede güncellemenize olanak tanır. Sadece değiştirmek istediğiniz alanları doldurun. Boş bırakılan alanlar değişmeden kalır.',
        +    'current_assets'    => 'Şu anda bu kullanıcıya atanmış varlıklar',
             'clone'             => 'Kullanıcıyı Kopyala',
             'contact_user'      => 'İlgili Kişi :name',
             'edit'              => 'Kullanıcıyı Düzenle',
        -    'filetype_info'     => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
        +    'filetype_info'     => 'İzin verilen dosya türleri; png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar.',
             'history_user'      => ':name Kişisi ile iligli geçmiş',
        +	'info'				=> 'Bilgi',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Son oturum açma tarihi',
        -    'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
        +    'ldap_config_text'  => 'LDAP yapılandırma ayarları Yönetici> Ayarlar\'da bulunabilir. Seçilen yer (isteğe bağlı), tüm içe aktarılan kullanıcılar için ayarlanır.',
             'software_user'     => 'Yazılıma :name için çıkış yapılmış',
             'view_user'         => 'Kullanıcıyı Görüntüle :name',
             'usercsv'           => 'CSV Dosyası',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => 'Mevcut yönetici ayarlarınız, iki aşamalı kimlik doğrulamasının seçici olarak uygulanmasına izin verir.  ',
        +    'two_factor_enrolled' => 'Kayıtlı 2FA Cihazı ',
        +    'two_factor_active'   => '2FA Etkin ',
             );
        diff --git a/resources/lang/tr/admin/users/message.php b/resources/lang/tr/admin/users/message.php
        index fb94b7021c..af51befa86 100644
        --- a/resources/lang/tr/admin/users/message.php
        +++ b/resources/lang/tr/admin/users/message.php
        @@ -3,53 +3,57 @@
         return array(
         
             'accepted'                  => 'Bu aksesuarı başarıyla kabul ettiniz.',
        -    'declined'                  => 'You have successfully declined this asset.',
        +    'declined'                  => 'Bu varlığı başarıyla reddettiniz.',
        +    'bulk_manager_warn'	        => 'Kullanıcılarınızın başarıyla güncelleştirildi, ancak kaydedilmedi Yöneticisi giriş Yöneticisi\'ni seçtiğiniz çünkü aynı zamanda düzenlenecek kullanıcı listesinde oldu ve kullanıcıların kendi yöneticisi olmayabilir. Yine, yönetici hariç olmak üzere, kullanıcılarınızı seçiniz.',
             'user_exists'               => 'Kullanıcı zaten var!',
             'user_not_found'            => 'Kullanıcı [:id] yok.',
        -    'user_login_required'       => 'The login field is required',
        +    'user_login_required'       => 'Oturum açma alanı gerekli',
             'user_password_required'    => 'Şifre Gerekli.',
             'insufficient_permissions'  => 'Yetersiz izinler.',
        -    'user_deleted_warning'      => 'This user has been deleted. You will have to restore this user to edit them or assign them new assets.',
        -    'ldap_not_configured'        => 'LDAP integration has not been configured for this installation.',
        +    'user_deleted_warning'      => 'Bu kullanıcı silindi. Bunları düzenlemek veya onları yeni varlıklar atamak için bu kullanıcı geri yüklemek gerekir.',
        +    'ldap_not_configured'        => 'LDAP entegrasyonu bu yükleme için yapılandırılmamış.',
         
         
             'success' => array(
        -        'create'    => 'User was successfully created.',
        -        'update'    => 'User was successfully updated.',
        -        'delete'    => 'User was successfully deleted.',
        -        'ban'       => 'User was successfully banned.',
        -        'unban'     => 'User was successfully unbanned.',
        -        'suspend'   => 'User was successfully suspended.',
        -        'unsuspend' => 'User was successfully unsuspended.',
        -        'restored'  => 'User was successfully restored.',
        -        'import'    => 'Users imported successfully.',
        +        'create'    => 'Kullanıcı başarıyla oluşturuldu.',
        +        'update'    => 'Kullanıcı başarıyla güncelleştirildi.',
        +        'update_bulk'    => 'Kullanıcılar başarıyla güncelleştirildi!',
        +        'delete'    => 'Kullanıcı başarıyla silindi.',
        +        'ban'       => 'Kullanıcı başarıyla yasaklandı.',
        +        'unban'     => 'Kullanıcı yasağı kaldırıldı.',
        +        'suspend'   => 'Kullanıcı askıya alındı.',
        +        'unsuspend' => 'Kullanıcı erişimi açıldı.',
        +        'restored'  => 'Kullanıcı başarıyla geri yüklendi.',
        +        'import'    => 'Kullanıcılar başarıyla içe aktarıldı.',
             ),
         
             'error' => array(
        -        'create' => 'There was an issue creating the user. Please try again.',
        -        'update' => 'There was an issue updating the user. Please try again.',
        -        'delete' => 'There was an issue deleting the user. Please try again.',
        -        'unsuspend' => 'There was an issue unsuspending the user. Please try again.',
        -        'import'    => 'There was an issue importing users. Please try again.',
        -        'asset_already_accepted' => 'This asset has already been accepted.',
        -        'accept_or_decline' => 'You must either accept or decline this asset.',
        -        'incorrect_user_accepted' => 'The asset you have attempted to accept was not checked out to you.',
        -        'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        -        'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
        -        'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        -        'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
        +        'create' => 'Kullanıcı oluştururken bir sorun oluştu. Lütfen yeniden deneyin.',
        +        'update' => 'Kullanıcı oluştururken bir sorun oluştu. Lütfen yeniden deneyin.',
        +        'delete' => 'Kullanıcı silinirken bir problem oluştu. Lütfen tekrar deneyin.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
        +        'unsuspend' => 'Kullanıcı erişimi açılırken bir sorun oluştu. Lütfen yeniden deneyin.',
        +        'import'    => 'Kullanıcılar içe aktarılırken bir sorun oluştu. Lütfen yeniden deneyin.',
        +        'asset_already_accepted' => 'Bu varlık zaten kabul etti.',
        +        'accept_or_decline' => 'Kullanıcı varlığı kabul veya red etmeli.',
        +        'incorrect_user_accepted' => 'Atamaya çalıştığınız varlık atanamadı.',
        +        'ldap_could_not_connect' => 'LDAP sunucusuna bağlanamadı. LDAP yapılandırma dosyası LDAP sunucusu yapılandırmanızda gözden geçirin. <br> LDAP sunucusundan Hata:',
        +        'ldap_could_not_bind' => 'LDAP sunucusuna bağlanamadı. LDAP yapılandırma dosyası LDAP sunucusu yapılandırmanızda gözden geçirin. <br> LDAP sunucusundan Hata: ',
        +        'ldap_could_not_search' => 'LDAP sunucusuna bağlanamadı. LDAP yapılandırma dosyası LDAP sunucusu yapılandırmanızda gözden geçirin. <br> LDAP sunucusundan Hata:',
        +        'ldap_could_not_get_entries' => 'LDAP sunucusuna bağlanamadı. LDAP yapılandırma dosyası LDAP sunucusu yapılandırmanızda gözden geçirin. <br> LDAP sunucusundan Hata:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        -        'error'   => 'File not deleted. Please try again.',
        -        'success' => 'File successfully deleted.',
        +        'error'   => 'Dosya silinemedi. Lütfen tekrar deneyin.',
        +        'success' => 'Dosya silindi.',
             ),
         
             'upload' => array(
        -        'error'   => 'File(s) not uploaded. Please try again.',
        -        'success' => 'File(s) successfully uploaded.',
        -        'nofiles' => 'You did not select any files for upload',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
        +        'error'   => 'Dosya(lar) yüklenemedi. Lütfen tekrar deneyin.',
        +        'success' => 'Dosya(lar) yüklendi.',
        +        'nofiles' => 'Yükleme için hiç bir dosya seçmediniz',
        +        'invalidfiles' => 'Bir veya daha fazla dosya çok büyük veya izin verilmeyen bir dosya türü. İzin verilen dosya türleri png, Gif, jpg, doc, docx, pdf, txt.',
             ),
         
         );
        diff --git a/resources/lang/tr/admin/users/table.php b/resources/lang/tr/admin/users/table.php
        index d70375df90..c107574bd7 100644
        --- a/resources/lang/tr/admin/users/table.php
        +++ b/resources/lang/tr/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Aktif',
             'allow'  				=> 'Kabul Et',
             'checkedout'  			=> 'Demirbaşlar',
        @@ -9,28 +8,31 @@ return array(
             'createuser' 			=> 'Kullanıcı Oluştur',
             'deny'  				=> 'Reddet',
             'email'      			=> 'E-Posta',
        -    'employee_num'      	=> 'Employee No.',
        +    'employee_num'      	=> 'Çalışan No.',
             'first_name' 			=> 'Ad',
        -    'groupnotes'			=> 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
        -    'id'         			=> 'Id',
        -    'inherit'  				=> 'Inherit',
        -    'job' 					=> 'Job Title',
        +    'groupnotes'			=> 'Kullanıcıya atamak için bir grup seçin, Kullanıcı yetkilerini atandığı gruptan alacaktır.',
        +    'id'         			=> 'ID',
        +    'inherit'  				=> 'Devral',
        +    'job' 					=> 'İş Ünvanı',
             'last_login'  			=> 'Son oturum açma',
             'last_name'  			=> 'Soyad',
        -    'location'  			=> 'Location',
        -    'lock_passwords'		=> 'Login details cannot be changed on this installation.',
        -    'manager' 				=> 'Manager',
        +    'location'  			=> 'Konum',
        +    'lock_passwords'		=> 'Bu kurulumda giriş bilgileri değiştirilemez.',
        +    'manager' 				=> 'Yönetici',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Adı',
             'notes'                 => 'Notlar',
             'password_confirm' 		=> 'Şifreyi Doğrula',
             'password' 				=> 'Şifre',
             'phone'  				=> 'Telefon',
        -    'show_current'          => 'Show Current Users',
        -    'show_deleted'          => 'Show Deleted Users',
        +    'show_current'          => 'Geçerli Kullanıcıları Göster',
        +    'show_deleted'          => 'Silinen Kullanıcıları Göster',
             'title' 				=> 'Başlık',
        -    'updateuser' 			=> 'Update User',
        +	'to_restore_them'		=> 'geri yüklemek için.',
        +    'updateuser' 			=> 'Kullanıcıyı Güncelle',
             'username' 				=> 'Kullanıcı Adı',
        -    'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
        +	'user_deleted_text' 	=> 'Bu kullanıcı silindi olarak işaretlenmiş.',
        +    'username_note' 		=> '(Bu yalnızca Active Directory bağlama için kullanılır, giriş için değildir.)',
             'cloneuser'             => 'Kullanıcıyı Kopyala',
             'viewusers' 			=> 'Kullanıcıları Görüntüle',
         );
        diff --git a/resources/lang/tr/auth/general.php b/resources/lang/tr/auth/general.php
        index dcb192b3ca..a3d27078c9 100644
        --- a/resources/lang/tr/auth/general.php
        +++ b/resources/lang/tr/auth/general.php
        @@ -2,11 +2,11 @@
         
         return [
             'send_password_link'	        => 'Parola sıfırlama bağlantısını gönder',
        -    'email_reset_password'			=> 'Email Password Reset',
        -    'reset_password'			    => 'Reset Password',
        -    'login'                         => 'Login',
        -    'login_prompt'                  => 'Please Login',
        -    'forgot_password'               => 'I forgot my password',
        -    'remember_me'                   => 'Remember Me',
        +    'email_reset_password'			=> 'Email şifre sıfırlama',
        +    'reset_password'			    => 'Şifre sıfırla',
        +    'login'                         => 'Giriş',
        +    'login_prompt'                  => 'Lütfen giriş yapın',
        +    'forgot_password'               => 'Şifremi unuttum',
        +    'remember_me'                   => 'Beni hatırla',
             ];
         
        diff --git a/resources/lang/tr/auth/message.php b/resources/lang/tr/auth/message.php
        index 21762d0ead..828b4473a7 100644
        --- a/resources/lang/tr/auth/message.php
        +++ b/resources/lang/tr/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Hesabınız aktif edilmemiş.',
             'account_suspended'      => 'Hesabınız durdurulmuş.',
             'account_banned'         => 'Hesabınız engellenmiş.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Çok fazla başarısız giriş denemesi. Lütfen :minutes dakika içinde tekrar deneyin.',
         
             'signin' => array(
                 'error'   => 'Bir problem ile karşılaştık, lütfen tekrar deneyin.',
        @@ -15,23 +15,23 @@ return array(
             ),
         
             'signup' => array(
        -        'error'   => 'There was a problem while trying to create your account, please try again.',
        +        'error'   => 'Hesabınızı oluştururken bir hata oluştu, lütfen tekrar deneyiniz.',
                 'success' => 'Hesap başarılı bir şekilde oluşturuldu.',
             ),
         
                 'forgot-password' => array(
        -            'error'   => 'There was a problem while trying to get a reset password code, please try again.',
        -            'success' => 'Password recovery email successfully sent.',
        +            'error'   => 'Şifre resetleme kodu oluştururken bir hata oluştu, lütfen tekrar deneyiniz.',
        +            'success' => 'Şifre kurtarma emaili başarı ile gönderildi.',
                 ),
         
                 'forgot-password-confirm' => array(
        -            'error'   => 'There was a problem while trying to reset your password, please try again.',
        -            'success' => 'Your password has been successfully reset.',
        +            'error'   => 'Şifrenizi sıfırlarken bir hata oluştu, lütfen tekrar deneyiniz.',
        +            'success' => 'Şifreniz başarı ile sıfırlandı.',
                 ),
         
             'activate' => array(
        -        'error'   => 'There was a problem while trying to activate your account, please try again.',
        -        'success' => 'Your account has been successfully activated.',
        +        'error'   => 'Hesabınızı aktif ederken bir hata oluştu, lütfen tekrar deneyiniz.',
        +        'success' => 'Hesabınız başarı ile aktif edilmiştir.',
             ),
         
         );
        diff --git a/resources/lang/tr/button.php b/resources/lang/tr/button.php
        index 9ae14231ce..be3daa3ce0 100644
        --- a/resources/lang/tr/button.php
        +++ b/resources/lang/tr/button.php
        @@ -1,16 +1,15 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Hareketler',
             'add'    	                => 'Yeni ekle',
             'cancel'                    => 'İptal',
        -    'checkin_and_delete'  	    => 'Checkin & Delete User',
        +    'checkin_and_delete'  	    => 'İade et ve Kullanıcıyı sil',
             'delete'  	                => 'Sil',
             'edit'    	                => 'Düzenle',
             'restore' 	                => 'Geri yükle',
             'request'                   => 'İstek',
             'submit'  	                => 'Gönder',
             'upload'                    => 'Yükle',
        -
        +	'select_file'				=> 'Dosya Seç...',
         );
        diff --git a/resources/lang/tr/general.php b/resources/lang/tr/general.php
        index 5393258259..aaec83567f 100644
        --- a/resources/lang/tr/general.php
        +++ b/resources/lang/tr/general.php
        @@ -9,7 +9,7 @@
             'activity_report'		=> 'Aktivite Raporu',
             'address'				=> 'Adres',
             'admin'					=> 'Yönetici',
        -    'add_seats'     => 'Added seats',
        +    'add_seats'     => 'Eklenen kişi sayısı',
             'all_assets'			=> 'Tüm Demirbaşlar',
             'all'       			=> 'Tümü',
             'archived'              => 'Arşivlenmiş',
        @@ -18,168 +18,190 @@
             'asset_report'          => 'Demirbaş Raporu',
             'asset_tag'				=> 'Demirbaş Etiketi',
             'assets_available'		=> 'Kullanılabilir Demirbaşlar',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Demirbaşlar',
             'avatar_delete'         => 'Profil Resmini Sil',
             'avatar_upload'         => 'Profil Resmi Yükle',
             'back'      			=> 'Geri',
             'bad_data'      		=> 'Hiçbir veri bulunamadı. Bozuk veri olabilir.',
        -    'bulk_checkout'  		=> 'Bulk Checkout',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
        +    'bulk_checkout'  		=> 'Toplu Atama',
             'cancel'  				=> 'İptal',
             'categories'			=> 'Kategoriler',
             'category'				=> 'Kategori',
        +    'change' 		        => 'Giriş/Çıkış',
             'changeemail'  			=> 'E-posta Adresini Değiştir',
             'changepassword'  		=> 'Şifreyi Değiştir',
             'checkin'  				=> 'Giriş',
        -    'checkin_from'  		=> 'Checkin from',
        -    'checkout'  			=> 'Checkout',
        +    'checkin_from'  		=> 'Geri al',
        +    'checkout'  			=> 'Atama',
             'city'  				=> 'Şehir',
        +	'click_here'			=> 'Buraya Tıklayın',
             'companies'			=> 'Şirketler',
             'company'				=> 'Şirket',
        -    'component'			=> 'Component',
        -    'components'			=> 'Components',
        +    'component'			=> 'Bileşen',
        +    'components'			=> 'Bileşenler',
        +	'complete'				=> 'Tamamla',
             'consumable'			=> 'Sarf Malzeme',
             'consumables'			=> 'Sarf Malzemeleri',
             'country'  				=> 'Ülke',
             'create'				=> 'Yeni Oluştur',
        -    'created'               => 'Item Created',
        +    'created'               => 'Öğe oluşturuldu',
             'created_asset'			=> 'Oluşturulmuş Demirbaş',
             'created_at' 			=> 'Şurada oluşturuldu',
        +    'updated_at' 			=> 'Güncellendiği tarih',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Geçerli',
        -    'custom_report'         => 'Custom Asset Report',
        +    'custom_report'         => 'Özel demirbaş raporu',
             'dashboard'				=> 'Pano',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Tarih',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => 'Uyarı!',
        +    'debug_warning_text'         => 'Bu uygulama, hata ayıklamanın etkin olduğu üretim modunda çalışıyor. Bu, hassas verilerinizi, uygulamanıza dış dünyadan erişebilirse ortaya çıkarabilir. Ayarını yaparak hata ayıklama modunu devre dışı bırakın.  <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.
        + 
        +Context | Request Context
        +',
             'delete'  				=> 'Sil',
             'deleted'  				=> 'Silinmiş',
        -    'delete_seats'  		=> 'Deleted Seats',
        -    'deployed'				=> 'Deployed',
        +    'delete_seats'  		=> 'Silinen Kullanıcı Lisansı Sayısı',
        +    'departments'           => 'Bölümler',
        +    'department'           => 'Bölüm',
        +    'deployed'				=> 'Atanmış',
             'depreciation_report'	=> 'Amortisman Raporu',
             'download'				=> 'İndir',
             'depreciation'			=> 'Amortisman',
             'editprofile'  			=> 'Profil Düzenle',
        -    'eol'					=> 'EOL',
        -    'email_domain'			=> 'Email Domain',
        -    'email_format'			=> 'Email Format',
        -    'email_domain_help'		=> 'This is used to generate email addresses when importing',
        -    'filastname_format'			=> 'First Initial Last Name (jsmith@example.com)',
        -    'firstname_lastname_format'	=> 'First Name Last Name (jane.smith@example.com)',
        +    'eol'					=> 'Kullanım Ömrü',
        +    'email_domain'			=> 'E-posta etki alanı',
        +    'email_format'			=> 'E-posta biçimi',
        +    'email_domain_help'		=> 'İçe aktarırken e-posta adresleri oluşturmak için kullanılır',
        +    'filastname_format'			=> 'Ad başharfi Soyad (jsmith@example.com)',
        +    'firstname_lastname_format'	=> 'Adı Soyadı (jane.smith@example.com)',
             'first'					=> 'İlk',
             'first_name'			=> 'Ad',
        -    'first_name_format'		=> 'First Name (jane@example.com)',
        -    'file_name'				=> 'File',
        -    'file_uploads'			=> 'File Uploads',
        -    'generate'				=> 'Generate',
        -    'groups'				=> 'Groups',
        -    'gravatar_email'        => 'Gravatar Email Address',
        -    'history'  			    => 'History',
        -    'history_for'  			=> 'History for',
        -    'id'  					=> 'ID',
        -    'image_delete'         	=> 'Delete Image',
        -    'image_upload'         	=> 'Upload Image',
        -    'import'         	    => 'Import',
        -    'import-history'        => 'Import History',
        -    'asset_maintenance'        => 'Asset Maintenance',
        -    'asset_maintenance_report' => 'Asset Maintenance Report',
        -    'asset_maintenances'       => 'Asset Maintenances',
        -    'item'  				=> 'Item',
        -    'insufficient_permissions' => 'Insufficient permissions!',
        -    'language'				=> 'Language',
        +    'first_name_format'		=> 'Ad (jane@example.com)',
        +    'file_name'				=> 'Dosya',
        +    'file_uploads'			=> 'Dosya Yüklemeleri',
        +    'generate'				=> 'Oluştur',
        +    'groups'				=> 'Gruplar',
        +    'gravatar_email'        => 'Gravatar e-posta adresi',
        +    'history'  			    => 'Geçmiş',
        +    'history_for'  			=> 'Kullanıcı geçmişi',
        +    'id'  					=> 'Kimlik',
        +    'image_delete'         	=> 'Resmi sil',
        +    'image_upload'         	=> 'Resim yükle',
        +    'import'         	    => 'İçeri aktar',
        +    'import-history'        => 'İçeri aktarma geçmişi',
        +    'asset_maintenance'        => 'Demirbaş bakımı',
        +    'asset_maintenance_report' => 'Demirbaş bakım raporu',
        +    'asset_maintenances'       => 'Demirbaş bakımları',
        +    'item'  				=> 'Ürün',
        +    'insufficient_permissions' => 'İzinler yetersiz!',
        +    'language'				=> 'Dil',
             'last'					=> 'Son',
        -    'last_name'             => 'Last Name',
        -    'license'				=> 'License',
        -    'license_report'        => 'License Report',
        -    'licenses_available'	=> 'licenses available',
        +    'last_login'            => 'Son Giriş',
        +    'last_name'             => 'Soyisim',
        +    'license'				=> 'Lisans',
        +    'license_report'        => 'Lisans Raporu',
        +    'licenses_available'	=> 'Kullanılabilir Lisanslar',
             'licenses'				=> 'Lisanslar',
        -    'list_all'				=> 'List All',
        -    'loading'				=> 'Loading',
        -    'lock_passwords'        => 'This field cannot be edited in this installation.',
        -    'feature_disabled'      => 'This feature has been disabled for the demo installation.',
        -    'location'              => 'Location',
        +    'list_all'				=> 'Tümünü listele',
        +    'loading'				=> 'Yükleniyor',
        +    'lock_passwords'        => 'Bu yüklemede bu alan düzenlenemez.',
        +    'feature_disabled'      => 'Bu özellik demo yükleme için devre dışı bırakıldı.',
        +    'location'              => 'Konum',
             'locations'				=> 'Konumlar',
             'logout'				=> 'Çıkış Yap',
        -    'lookup_by_tag'     => 'Lookup by Asset Tag',
        +    'lookup_by_tag'     => 'Varlık etiketine göre arama',
             'manufacturer'			=> 'Üretici',
             'manufacturers'			=> 'Üreticiler',
        -    'markdown'				=> 'This field allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
        -    'min_amt'				=> 'Min. QTY',
        -    'min_amt_help'	=> 'Minimum number of items that should be available before an alert gets triggered.',
        +    'markdown'				=> 'Bu alan <a href="https://help.github.com/articles/github-flavored-markdown/"> Github tarafından</a> desteklenir.',
        +    'min_amt'				=> 'Min. Miktar',
        +    'min_amt_help'	=> 'Bu alarmın devreye gireceği minimum varlık sayısı.',
             'model_no'				=> 'Model No.',
             'months'				=> 'ay',
             'moreinfo'				=> 'Daha Fazla Bilgi',
             'name'					=> 'Adı',
             'next'					=> 'Sonraki',
        -    'new'					=> 'new!',
        -    'no_depreciation'		=> 'No Depreciation',
        -    'no_results'			=> 'No Results.',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
        +    'new'					=> 'yeni!',
        +    'no_depreciation'		=> 'Değer kaybı yok',
        +    'no_results'			=> 'Sonuç Bulunamadı.',
             'no'  					=> 'Hayır',
             'notes'  				=> 'Notlar',
        -    'order_number'          => 'Order Number',
        -    'page_menu'				=> 'Showing _MENU_ items',
        -    'pagination_info'		=> 'Showing _START_ to _END_ of _TOTAL_ items',
        +    'order_number'          => 'Sipariş Numarası',
        +    'page_menu'				=> '_MENU_ Öğe gösteriliyor',
        +    'pagination_info'		=> '_START_ - _END_ of _TOTAL_ arası öğeler',
             'pending'				=> 'Bekliyor',
             'people'				=> 'Kişiler',
             'per_page'				=> 'Sayfa başına sonuç sayısı',
             'previous'				=> 'Önceki',
             'processing'			=> 'İşleniyor',
             'profile'				=> 'Profiliniz',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        -    'qty'		            => 'QTY',
        -    'quantity'		        => 'Quantity',
        -    'ready_to_deploy'		=> 'Ready to Deploy',
        -    'recent_activity'		=> 'Recent Activity',
        -    'remove_company'        => 'Remove Company Association',
        +    'purchase_cost'                              => 'Satın Alma Ücreti',
        +    'purchase_date'         => 'Satın Alma Tarihi',
        +    'qty'		            => 'Miktar',
        +    'quantity'		        => 'Miktar',
        +    'ready_to_deploy'		=> 'Atamaya Hazır',
        +    'recent_activity'		=> 'Son Etkinlik',
        +    'remove_company'        => 'Firma bağlantısını sil',
             'reports'				=> 'Raporlar',
        -    'requested'				=> 'Requested',
        -    'request_canceled'      => 'Request Canceled',
        +    'requested'				=> 'Talep Edilen',
        +    'request_canceled'      => 'Talep iptal edildi',
             'save'  				=> 'Kaydet',
             'select'				=> 'Seç',
             'search'				=> 'Ara',
        -    'select_category'       => 'Select a Category',
        -    'select_depreciation'	=> 'Select a Depreciation Type',
        +    'select_category'       => 'Kategori Seç',
        +    'select_department'       => 'Bölüm Seç',
        +    'select_depreciation'	=> 'Bir Değer Kaybı Türü Seç',
             'select_location'		=> 'Konum Seç',
        -    'select_manufacturer'	=> 'Select a Manufacturer',
        +    'select_manufacturer'	=> 'Bir Üretici Seç',
             'select_model'			=> 'Model Seç',
        -    'select_supplier'		=> 'Select a Supplier',
        +    'select_supplier'		=> 'Tedarikçi Seç',
             'select_user'			=> 'Kullanıcı Seç',
        -    'select_date'			=> 'Tarih seç',
        +    'select_date'			=> 'Tarihi Seç (YYYY-AA-GG)',
             'select_statuslabel'	=> 'Durum Seç',
        -    'select_company'    	=> 'Select Company',
        -    'select_asset'    		=> 'Select Asset',
        +    'select_company'    	=> 'Firma Seç',
        +    'select_asset'    		=> 'Varlık Seç',
             'settings'				=> 'Ayarlar',
             'sign_in'				=> 'Oturum Aç',
        -    'signature'             => 'Signature',
        -    'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
        +    'signature'             => 'İmza',
        +    'some_features_disabled' => 'DEMO modu: Bu yükleme için bazı özellikleri devre dışı bırakılır.',
             'site_name'				=> 'Site Adı',
        -    'state'  				=> 'State',
        +    'state'  				=> 'İlçe',
             'status_labels'			=> 'Durum Etiketleri',
             'status'    			=> 'Durum',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => 'Tedarikçi',
             'suppliers'  			=> 'Tedarikçiler',
        -    'submit'				=> 'Submit',
        +    'sure_to_delete'    => 'Silmek istediğinize emin misiniz',
        +    'submit'				=> 'Gönder',
        +    'target'                => 'Hedef',
        +    'time_and_date_display' => 'Zaman ve Tarih Görüntüle',
             'total_assets'			=> 'Toplam Demirbaşlar',
             'total_licenses'		=> 'Toplam Lisanslar',
        -    'total_accessories'		=> 'total accessories',
        -    'total_consumables'		=> 'total consumables',
        +    'total_accessories'		=> 'tüm aksesuarlar',
        +    'total_consumables'		=> 'tüm sarf malzemeler',
             'type'  				=> 'Tip',
        -    'undeployable'			=> 'Un-deployable',
        -    'unknown_admin'			=> 'Unknown Admin',
        -    'username_format'		=> 'Username Format',
        +    'undeployable'			=> 'Atanamaz',
        +    'unknown_admin'			=> 'Bilinmeyen Yönetici',
        +    'username_format'		=> 'Kullanıcı Adı Biçimi',
             'update'                => 'Güncelle',
             'uploaded'              => 'Yüklendi',
             'user'					=> 'Kullanıcı',
        -    'accepted'			    => 'accepted',
        -    'declined'			    => 'declined',
        -    'unaccepted_asset_report' => 'Unaccepted Assets',
        +    'accepted'			    => 'kabul edildi',
        +    'declined'			    => 'reddedildi',
        +    'unaccepted_asset_report' => 'Kabul Edilmeyen Varlıklar',
             'users'                 => 'Kullanıcılar',
        -    'viewassets'  			=> 'View Assigned Assets',
        +    'viewassets'  			=> 'Atanan Varlıkları Görüntüle',
             'website'               => 'İnternet sitesi',
             'welcome'				=> 'Hoşgeldiniz, :name',
             'years'					=> 'Yıl',
             'yes' 					=> 'Evet',
             'zip'  					=> 'Zip',
        -    'noimage'					=> 'No image uploaded or image not found.',
        -    'token_expired'             => 'Your form session has expired. Please try again.',
        +    'noimage'					=> 'Yüklenen görüntü veya resim bulunamadı.',
        +    'token_expired'             => 'Oturum zaman aşımına uğradı. Lütfen tekrar giriş yapın.',
             ];
        diff --git a/resources/lang/tr/mail.php b/resources/lang/tr/mail.php
        index c9a4fe182d..dc26357dd4 100644
        --- a/resources/lang/tr/mail.php
        +++ b/resources/lang/tr/mail.php
        @@ -1,74 +1,73 @@
         <?php
         
         return array(
        -    'a_user_canceled' => 'A user has canceled an item request on the website',
        -    'a_user_requested' => 'A user has requested an item on the website',
        -    'accessory_name' => 'Accessory Name:',
        -    'additional_notes' => 'Additional Notes:',
        -    'admin_has_created' => 'An administrator has created an account for you on the :web website.',
        -    'asset' => 'Asset:',
        -    'asset_name' => 'Asset Name:',
        -    'asset_requested' => 'Asset requested',
        -    'asset_tag' => 'Asset Tag:',
        -    'assets_warrantee_expiring' => '{1} asset with warrantee expiring in the next 60 days.|[2,Inf] assets with warrantees
        -                                    expiring in the next 60 days.',
        -    'assigned_to' => 'Assigned To',
        -    'best_regards' => 'Best regards,',
        -    'canceled' => 'Canceled:',
        -    'checkin_date' => 'Checkin Date:',
        -    'checkout_date' => 'Checkout Date:',
        -    'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
        -    'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
        -    'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
        -    'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.',
        -    'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.',
        -    'Confirm_accessory_delivery' => 'Confirm accessory delivery.',
        -    'Confirm_asset_delivery' => 'Confirm asset delivery.',
        -    'Confirm_consumable_delivery' => 'Confirm consumable delivery.',
        -    'current_QTY' => 'Current QTY',
        -    'Days' => 'Days',
        -    'days' => 'Days',
        -    'expecting_checkin_date' => 'Expected Checkin Date:',
        -    'expires' => 'Expires',
        -    'Expiring_Assets_Report' => 'Expiring Assets Report.',
        -    'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
        -    'hello' => 'Hello',
        -    'hi' => 'Hi',
        -    'i_have_read' => 'I have read and agree to the terms of use, and have received this item.',
        -    'item' => 'Item:',
        -    'items_below_minimum' => '{1} item that is below minimum inventory or will soon be low.|[2,Inf] items that are below minimum
        -                              inventory or will soon be low.',
        -    'Item_Request_Canceled' => 'Item Request Canceled',
        -    'Item_Requested' => 'Item Requested',
        -    'licenses_expiring' => '{1} license expiring next 60 days.|[2,Inf] licenses expiring next 60 days.',
        -    'link_to_update_password' => 'Please click on the following link to update your :web password:',
        -    'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
        -    'login' => 'Login:',
        -    'Low_Inventory_Report' => 'Low Inventory Report',
        -    'min_QTY' => 'Min QTY',
        -    'name' => 'Name',
        -    'new_item_checked' => 'A new item has been checked out under your name, details are below.',
        -    'password' => 'Password:',
        -    'password_reset' => 'Password Reset',
        +    'a_user_canceled' => 'Bir kullanıcı web sitede öğe talebinden vazgeçti',
        +    'a_user_requested' => 'Bir kullanıcı websitede bir öğe talebinde bulundu',
        +    'accessory_name' => 'Aksesuar Adı:',
        +    'additional_notes' => 'Ek Notlar:',
        +    'admin_has_created' => 'Bir yönetici sizin için :web site\'de bir hesap oluşturdu.',
        +    'asset' => 'Varlık:',
        +    'asset_name' => 'Varlık Adı:',
        +    'asset_requested' => 'İstenen varlık',
        +    'asset_tag' => 'Varlık etiketi:',
        +    'assets_warrantee_expiring' => '{1} varlığın garantisi 60 gün içerisinde doluyor. |[2, Inf] varlıkların garantileri                                    60 gün içerisinde doluyor.',
        +    'assigned_to' => 'Atanmış',
        +    'best_regards' => 'En iyi dileklerimizle,',
        +    'canceled' => 'İptal edildi:',
        +    'checkin_date' => 'Giriş Tarihi:',
        +    'checkout_date' => 'Çıkış Tarihi:',
        +    'click_to_confirm' => 'Lütfen :hesabınızı: onaylamak için aşağıdaki linke tıklayınız:',
        +    'click_on_the_link_accessory' => 'Lütfen aşağıdaki bağlantıya tıklayarak aksesuar talebinizi onaylayın.',
        +    'click_on_the_link_asset' => 'Lütfen aşağıdaki bağlantıya tıklayarak varlık talebinizi onaylayın.',
        +    'Confirm_Asset_Checkin' => 'Varlık girişi onayı.',
        +    'Confirm_Accessory_Checkin' => 'Aksesuar girişi onayı.',
        +    'Confirm_accessory_delivery' => 'Aksesuar teslim onayı.',
        +    'Confirm_asset_delivery' => 'Varlık teslim onayı.',
        +    'Confirm_consumable_delivery' => 'Sarf malzemesi onayı.',
        +    'current_QTY' => 'Mevcut miktar',
        +    'Days' => 'Günler',
        +    'days' => 'Günler',
        +    'expecting_checkin_date' => 'Beklenen Giriş Tarihi:',
        +    'expires' => 'Bitiş',
        +    'Expiring_Assets_Report' => 'Süresi Dolan Varlık Raporu.',
        +    'Expiring_Licenses_Report' => 'Süresi Dolan Lisans Raporu.',
        +    'hello' => 'Merhaba',
        +    'hi' => 'Merhaba',
        +    'i_have_read' => 'Okudum ve kullanım şartlarını ve bu varlığı kabul ediyorum.',
        +    'item' => 'Ürün:',
        +    'items_below_minimum' => '{1} asgari envanter altındaysa veya yakında düşük olacak öğeyi |. Minimuma altındadır [2,Inf] öğe
        +                              envanter veya yakında düşük olacaktır.',
        +    'Item_Request_Canceled' => 'Talep İptal Edildi',
        +    'Item_Requested' => 'Varlık Talep Edildi',
        +    'licenses_expiring' => '{1} lisans süresi dolan sonraki 60 gün |. [2, Inf] sonraki 60 gün süresi dolan lisanslar.',
        +    'link_to_update_password' => 'Şifrenizi güncellemek için aşağıdaki linke tıklayınız :web password:',
        +    'login_first_admin' => 'Yeni Snipe-IT Kurulumu oturum açma kimlik bilgilerini aşağıdaki gibidir. ',
        +    'login' => 'Giriş:',
        +    'Low_Inventory_Report' => 'Düşük Stok Raporu',
        +    'min_QTY' => 'Min. Miktar',
        +    'name' => 'Ad',
        +    'new_item_checked' => 'Yeni varlık altında kullanıma alındı, ayrıntıları aşağıdadır.',
        +    'password' => 'Parola:',
        +    'password_reset' => 'Parola Sıfırlama',
         
        -    'read_the_terms' => 'Please read the terms of use below.',
        -    'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
        -                         and agree to the terms of use, and have received the asset.',
        -    'requested' => 'Requested:',
        -    'reset_link' => 'Your Password Reset Link',
        -    'reset_password' => 'Click here to reset your password:',
        -    'serial' => 'Serial:',
        -    'supplier' => 'Supplier',
        -    'tag' => 'Tag',
        -    'test_email' => 'Test Email from Snipe-IT',
        -    'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
        -    'the_following_item' => 'The following item has been checked in: ',
        -    'There_are' => '{1} There is|[2,Inf] There are',
        -    'to_reset' => 'To reset your :web password, complete this form:',
        -    'type' => 'Type',
        -    'user' => 'User:',
        -    'username' => 'Username:',
        -    'welcome' => 'Welcome :name',
        -    'welcome_to' => 'Welcome to :web!',
        -    'your_credentials' => 'Your Snipe-IT credentials',
        +    'read_the_terms' => 'Aşağıdaki kullanım koşullarını okuyunuz.',
        +    'read_the_terms_and_click' => 'Aşağıdaki kullanım şartlarını okuyun ve okumak onaylamak için alt kısımdaki linke tıklayınız
        +                         ve kullanım şartlarını kabul ve varlık aldık.',
        +    'requested' => 'Talep Edilen:',
        +    'reset_link' => 'Parola Sıfırlama Bağlantısı',
        +    'reset_password' => 'Şifrenizi sıfırlamak için burayı tıklatın:',
        +    'serial' => 'Seri No:',
        +    'supplier' => 'Tedarikçi',
        +    'tag' => 'Etiket',
        +    'test_email' => 'Snipe-It Test Maili',
        +    'test_mail_text' => 'Snipe-IT varlık yönetim sisteminden bir denemedir',
        +    'the_following_item' => 'Aşağıdaki varlık geri alındı olarak işaretlendi: ',
        +    'There_are' => '{1} var|[2,Inf] var',
        +    'to_reset' => 'Şifre sıfırlamak için :web password, formu doldurun:',
        +    'type' => 'Tür',
        +    'user' => 'Kullanıcı:',
        +    'username' => 'Kullanıcı Adı:',
        +    'welcome' => 'Hoşgeldiniz, :name',
        +    'welcome_to' => 'Hoş geldiniz :web!',
        +    'your_credentials' => 'Snipe-IT Bilgileriniz',
         );
        diff --git a/resources/lang/tr/passwords.php b/resources/lang/tr/passwords.php
        index 5195a9b77c..cfcec25bf2 100644
        --- a/resources/lang/tr/passwords.php
        +++ b/resources/lang/tr/passwords.php
        @@ -1,7 +1,7 @@
         <?php
         
         return [
        -    'sent'	        => 'Your password link has been sent!',
        -    'user'			=> 'That user does not exist or does not have an email address associated',
        +    'sent'	        => 'Şifre bağlantısı gönderildi!',
        +    'user'			=> 'Kullanıcı mevcut değil veya tanımlı email adresi bulunamadı',
         ];
         
        diff --git a/resources/lang/tr/reminders.php b/resources/lang/tr/reminders.php
        index 502a349cec..5e84b4eac6 100644
        --- a/resources/lang/tr/reminders.php
        +++ b/resources/lang/tr/reminders.php
        @@ -17,7 +17,7 @@ return array(
         
             "user"     => "Kullanıcı adı veya e-mail adresi hatalı",
         
        -    "token"    => "This password reset token is invalid.",
        +    "token"    => "Şifre sıfırlama anahtarı geçersiz.",
         
             "sent" => "Eşleşen email bulunsaydı, şifre gönderilirdi!",
         
        diff --git a/resources/lang/tr/validation.php b/resources/lang/tr/validation.php
        index 03c7471cab..27f40fd5ea 100644
        --- a/resources/lang/tr/validation.php
        +++ b/resources/lang/tr/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => "The :attribute must be accepted.",
        -    "active_url"       => "The :attribute is not a valid URL.",
        -    "after"            => "The :attribute must be a date after :date.",
        -    "alpha"            => "The :attribute may only contain letters.",
        -    "alpha_dash"       => "The :attribute may only contain letters, numbers, and dashes.",
        -    "alpha_num"        => "The :attribute may only contain letters and numbers.",
        -    "before"           => "The :attribute must be a date before :date.",
        -    "between"          => array(
        -        "numeric" => "The :attribute must be between :min - :max.",
        -        "file"    => "The :attribute must be between :min - :max kilobytes.",
        -        "string"  => "The :attribute must be between :min - :max characters.",
        -    ),
        -    "confirmed"        => "The :attribute confirmation does not match.",
        -    "date"             => "The :attribute is not a valid date.",
        -    "date_format"      => "The :attribute does not match the format :format.",
        -    "different"        => "The :attribute and :other must be different.",
        -    "digits"           => "The :attribute must be :digits digits.",
        -    "digits_between"   => "The :attribute must be between :min and :max digits.",
        -    "email"            => "The :attribute format is invalid.",
        -    "exists"           => "The selected :attribute is invalid.",
        -    "email_array"      => "One or more email addresses is invalid.",
        -    "image"            => "The :attribute must be an image.",
        -    "in"               => "The selected :attribute is invalid.",
        -    "integer"          => "The :attribute must be an integer.",
        -    "ip"               => "The :attribute must be a valid IP address.",
        -    "max"              => array(
        -        "numeric" => "The :attribute may not be greater than :max.",
        -        "file"    => "The :attribute may not be greater than :max kilobytes.",
        -        "string"  => "The :attribute may not be greater than :max characters.",
        -    ),
        -    "mimes"            => "The :attribute must be a file of type: :values.",
        -    "min"              => array(
        -        "numeric" => "The :attribute must be at least :min.",
        -        "file"    => "The :attribute must be at least :min kilobytes.",
        -        "string"  => "The :attribute must be at least :min characters.",
        -    ),
        -    "not_in"           => "The selected :attribute is invalid.",
        -    "numeric"          => "The :attribute must be a number.",
        -    "regex"            => "The :attribute format is invalid.",
        -    "required"         => "The :attribute field is required.",
        -    "required_if"      => "The :attribute field is required when :other is :value.",
        -    "required_with"    => "The :attribute field is required when :values is present.",
        -    "required_without" => "The :attribute field is required when :values is not present.",
        -    "same"             => "The :attribute and :other must match.",
        -    "size"             => array(
        -        "numeric" => "The :attribute must be :size.",
        -        "file"    => "The :attribute must be :size kilobytes.",
        -        "string"  => "The :attribute must be :size characters.",
        -    ),
        -    "unique"           => "The :attribute has already been taken.",
        -    "url"              => "The :attribute format is invalid.",
        -    "statuslabel_type" => "You must select a valid status label type",
        -    "unique_undeleted" => "The :attribute must be unique.",
        +    'accepted'             => ': attribute benzersiz olması gerekir.',
        +    'active_url'           => ':attribute geçersiz URL.',
        +    'after'                => ':attribute :date sonra olmalı.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute sadece harf içermeli.',
        +    'alpha_dash'           => ':attribute sadece harf, rakam ve noktalama işaretleri olabilir.',
        +    'alpha_num'            => ':attribute sadece harf ve rakam olabilir.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute :date den önce olmalı.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute :min - :max arasında olmalı.',
        +        'file'    => ':attribute :min - :max Kb arasında olmalı.',
        +        'string'  => ':attribute :min - :max karakter arasında olmalı.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute doğru veya yanlış olabilir.',
        +    'confirmed'            => ':attribute doğrulama uyuşmuyor.',
        +    'date'                 => ':attribute geçerli bir tarih değil.',
        +    'date_format'          => ':attribute biçim geçersiz.',
        +    'different'            => ':attribute ve :other farklı olmalı.',
        +    'digits'               => ':attribute :digits numara olmalı.',
        +    'digits_between'       => ':attribute :min ve :max numara.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute biçim geçersiz.',
        +    'exists'               => ':attribute seçim geçersiz.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute bir görüntü olması gerekir.',
        +    'in'                   => ':attribute geçersiz.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute bir tamsayı olmalıdır.',
        +    'ip'                   => ':attribute geçerli bir IP adresi olması gerekir.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute :max dan büyük olmalı.',
        +        'file'    => ':attribute :max Kb tan büyük olmalı.',
        +        'string'  => ':attribute :max karakterden büyük olamaz.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute :values türleri olmalı.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute :min den küçük olmalı.',
        +        'file'    => ':attribute :min Kb tan küçük olmalı.',
        +        'string'  => ':attribute :min karakterden küçük olmalı.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => ':attribute geçersiz.',
        +    'numeric'              => ':attribute sayı olmalıdır.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute formatı geçersiz.',
        +    'required'             => ':attribute alanı zorunludur.',
        +    'required_if'          => ':attribute :other :value geçersiz.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ':attribute :values geçersiz.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => ':attribute :values geçersiz.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute ve :other aynı olmalı.',
        +    'size'                 => [
        +        'numeric' => ':attribute :size olmalı.',
        +        'file'    => ':attribute :size Kb olmalı.',
        +        'string'  => ':attribute :size karakter olmalı.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute zaten alınmış.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute biçim geçersiz.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/vi/admin/asset_maintenances/message.php b/resources/lang/vi/admin/asset_maintenances/message.php
        index f0c429b7f3..855f19b998 100644
        --- a/resources/lang/vi/admin/asset_maintenances/message.php
        +++ b/resources/lang/vi/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => 'Tài sản đang bảo trì chưa được tạo, xin vui lòng thử lại.',
                     'success' => 'Tài sản đang bảo trì được tạo thành công.'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => 'Chưa hoàn thành',
                 'warranty'                     => 'Bảo hành',
                 'not_warranty'                 => 'Không có bảo hành',
        diff --git a/resources/lang/vi/admin/asset_maintenances/table.php b/resources/lang/vi/admin/asset_maintenances/table.php
        index 6444e3eae3..4dc3568397 100644
        --- a/resources/lang/vi/admin/asset_maintenances/table.php
        +++ b/resources/lang/vi/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => 'Tài sản đang bảo trì',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => 'Tên tài sản',
                 'is_warranty'   => 'Bảo hành',
                 'dl_csv'        => 'Tải tập tin định dạng CSV'
             ];
        diff --git a/resources/lang/vi/admin/categories/general.php b/resources/lang/vi/admin/categories/general.php
        index ac9fdc6e26..134e5bbc25 100644
        --- a/resources/lang/vi/admin/categories/general.php
        +++ b/resources/lang/vi/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> 'Về Danh mục',
        +    'about_categories'  				=> 'Danh mục giúp bạn quản lý các mục của bạn. Ví dụ như danh mục có thể là Máy tính để bàn (Desktops), Máy tính xách tay (Laptops), Điện thoại di động (Mobile Phones), Máy tính bảng,... nhưng bản có thể sử dụng danh mục này bằng bất kỳ cách nào mà bạn cảm thấy phù hợp.',
             'asset_categories' 					=> 'Danh mục tài sản',
             'category_name'  					=> 'Tên hạng mục',
             'checkin_email'                     => 'Gửi email đến người dùng đang checkin.',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => 'Chính sửa hạng mục',
             'eula_text'							=> 'Danh mục EULA',
             'eula_text_help'					=> 'Đây là trường cho phép bạn điều chỉnh EULA cho những loại tài sản riêng biệt. Nếu bạn chỉ có một EULA cho tất cả tài sản, bạn có thể nhấn chọn vào ô bên dưới để sử dụng như là giá trị mặc định.',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> 'Yêu cầu người dùng xác nhận nhận tài sản trong hạng mục này.',
             'required_acceptance'				=> 'Người dùng sẽ nhận được email có chứa đường dẫn để xác nhận chấp nhận tài sản này.',
             'required_eula'						=> 'Đây là người dùng đã được gửi một email bản sao của EULA',
        diff --git a/resources/lang/vi/admin/companies/general.php b/resources/lang/vi/admin/companies/general.php
        index f3bf68adbb..ceff1534f1 100644
        --- a/resources/lang/vi/admin/companies/general.php
        +++ b/resources/lang/vi/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => 'Thông tin về các công ty',
        +    'about_companies_text'                  => 'Danh mục các công ty có thể được swr dụng như là một trường định danh đơn giản hoặc có thể được swr dụng để lọc ra số lượng hạn chế các tài sản, người dùng, v. v nếu như hỗ chợ công ty được kích hoạt trong thiết lập quản trị (Admin settings) của bạn.',
             'select_company' => 'Chọn công ty',
         ];
        diff --git a/resources/lang/vi/admin/custom_fields/message.php b/resources/lang/vi/admin/custom_fields/message.php
        index 0d34afa9e8..ed66a6ba16 100644
        --- a/resources/lang/vi/admin/custom_fields/message.php
        +++ b/resources/lang/vi/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => 'Fieldset was not created, please try again.',
        diff --git a/resources/lang/vi/admin/departments/message.php b/resources/lang/vi/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/vi/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/vi/admin/departments/table.php b/resources/lang/vi/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/vi/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/vi/admin/hardware/general.php b/resources/lang/vi/admin/hardware/general.php
        index cf8f324cf5..cf726908b1 100644
        --- a/resources/lang/vi/admin/hardware/general.php
        +++ b/resources/lang/vi/admin/hardware/general.php
        @@ -7,7 +7,7 @@ return array(
             'asset'  					=> 'Tài sản',
             'bulk_checkout'             => 'Checkout Assets to User',
             'checkin'  					=> 'Checkin tài sản',
        -    'checkout'  				=> 'Checkout tài sản đến người dùng',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> 'Nhân đôi tài sản',
             'deployable'  				=> 'Cho phép cấp phát',
             'deleted'  					=> 'Tài sản này đã bị xóa. <a href="/hardware/:asset_id/restore">Nhấn vào đây để phục hồi</a>.',
        diff --git a/resources/lang/vi/admin/hardware/message.php b/resources/lang/vi/admin/hardware/message.php
        index c4bd46efdd..49907cfa8c 100644
        --- a/resources/lang/vi/admin/hardware/message.php
        +++ b/resources/lang/vi/admin/hardware/message.php
        @@ -24,6 +24,12 @@ return array(
                 'success' 		=> 'Tài sản được khôi phục thành công.'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => 'Tập tin đã không được xoá. Bạn hãy thử lại.',
                 'success' => 'Tập tin đã được xoá thành công.',
        @@ -48,6 +54,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> 'Bạn có chắc chắn muốn xoá bỏ tài sản này?',
                 'error'   		=> 'Đã có vấn đề xảy ra khi xoá tài sản này. Bạn hãy thử lại xem.',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> 'Tài sản này được xoá thành công.'
             ),
         
        diff --git a/resources/lang/vi/admin/locations/table.php b/resources/lang/vi/admin/locations/table.php
        index 73ab37d3fd..8030edeaf6 100644
        --- a/resources/lang/vi/admin/locations/table.php
        +++ b/resources/lang/vi/admin/locations/table.php
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => 'Địa phương',
             'parent'                    => 'Parent',
             'currency'                  => 'Tiền tệ địa phương',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/vi/admin/manufacturers/table.php b/resources/lang/vi/admin/manufacturers/table.php
        index 45f1fec9aa..c34ead518e 100644
        --- a/resources/lang/vi/admin/manufacturers/table.php
        +++ b/resources/lang/vi/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => 'About manufacturers',
        +    'about_manufacturers_text'  => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
             'asset_manufacturers'	=> 'Hãng sản xuất',
             'create'				=> 'Tạo hãng sản xuất',
             'id'   					=> 'ID',
        -    'name'      			=> 'Tên hãng sản xuất',
        +    'name'      			=> 'Name',
        +    'support_email'   		=> 'Support Email',
        +    'support_phone'   		=> 'Support Phone',
        +    'support_url'   		=> 'Support URL',
             'update'				=> 'Cập nhật hãng sản xuất',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/vi/admin/models/message.php b/resources/lang/vi/admin/models/message.php
        index 60b88bb8dd..35021bb8e9 100644
        --- a/resources/lang/vi/admin/models/message.php
        +++ b/resources/lang/vi/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> 'Kiểu tài sản đã được phục hồi thành công.'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/vi/admin/settings/general.php b/resources/lang/vi/admin/settings/general.php
        index fb972949fc..5547528ca3 100644
        --- a/resources/lang/vi/admin/settings/general.php
        +++ b/resources/lang/vi/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> 'Expiring Alerts Threshold (in days)',
         	'alert_inv_threshold'		=> 'Inventory Alert Threshold',
         	'asset_ids'					=> 'ID tài sản',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> 'Tạo ID tài sản tự động tăng',
         	'auto_increment_prefix'		=> 'Tiền tố (tùy chọn)',
         	'auto_incrementing_help'    => 'Cho phép ID tài sản tự động tăng đầu tiên được đặt cho nó',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => 'Remote Scripts',
             'load_remote_help_text'		=> 'This Snipe-IT install can load scripts from the outside world.',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => 'Restricting users (including admins) assigned to companies to their company\'s assets.',
             'full_multiple_companies_support_text' => 'Full Multiple Companies Support',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'Phiên bản PHP',
             'php_gd_info'               => 'Bạn phải cài đặt php-gd để hiển thị QR codes, xem cấu trúc cài đặt.',
             'php_gd_warning'            => 'PHP Image Processing và GD plugin thì CHƯA cài đặt.',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => 'Bật QR Code đầu tiên để gán cho nó',
             'qr_text'                   => 'Chuỗi QR Code',
             'setting'                   => 'Cài đặt',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => 'These settings let you customize certain aspects of your installation.',
             'labels_per_page'           => 'Labels per page',
             'label_dimensions'          => 'Label dimensions (inches)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => 'Page margins (inches)',
             'purge'                    => 'Purge Deleted Records',
             'labels_display_bgutter'    => 'Label bottom gutter',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => 'w',
             'height_h'        => 'h',
             'text_pt'        => 'pt',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => 'Two Factor Authentication',
             'two_factor_secret'        => 'Two-Factor Code',
             'two_factor_enrollment'        => 'Two-Factor Enrollment',
        diff --git a/resources/lang/vi/admin/users/general.php b/resources/lang/vi/admin/users/general.php
        index a6bbb2670b..f4e8d126ca 100644
        --- a/resources/lang/vi/admin/users/general.php
        +++ b/resources/lang/vi/admin/users/general.php
        @@ -4,12 +4,16 @@
         return array(
         
             'assets_user'       => 'Tài sản đã được cấp phát đến :name',
        +    'bulk_update_warn'	=> 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
        +    'bulk_update_help'	=> 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
             'current_assets'    => 'Assets currently checked out to this user',
             'clone'             => 'Nhân đôi người dùng',
             'contact_user'      => 'Liên hệ :name',
             'edit'              => 'Sửa người dùng',
             'filetype_info'     => 'Cho phép loại tập tin are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
             'history_user'      => 'Lịch sử cấp phát của :name',
        +	'info'				=> 'Info',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => 'Lần đăng nhập trước',
             'ldap_config_text'  => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
             'software_user'     => 'Phần mềm đã được checkout đến :name',
        diff --git a/resources/lang/vi/admin/users/message.php b/resources/lang/vi/admin/users/message.php
        index a527615d63..be215eec51 100644
        --- a/resources/lang/vi/admin/users/message.php
        +++ b/resources/lang/vi/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => 'Bạn đã xác nhận tài sản này thành công.',
             'declined'                  => 'Bạn đã từ chối tài sản này thành công.',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => 'Người dùng thật sự tồn tại!',
             'user_not_found'            => 'Người dùng [:id] không tồn tại.',
             'user_login_required'       => 'Trường đăng nhập thì bắt buộc',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => 'Người dùng đã được tạo thành công.',
                 'update'    => 'Người dùng đã được cập nhật thành công.',
        +        'update_bulk'    => 'Users were successfully updated!',
                 'delete'    => 'Người dùng đã được xóa thành công.',
                 'ban'       => 'Người dùng đã bị cấm thành công.',
                 'unban'     => 'Phục hồi người dùng bị cấm thành công.',
        @@ -29,6 +31,7 @@ return array(
                 'create' => 'Có vấn đề xảy ra khi tạo người dùng. Xin thử lại lần nữa.',
                 'update' => 'Có vấn đề xảy ra khi cập nhật người dùng. Xin thử lại lần nữa.',
                 'delete' => 'Có vấn đề xảy ra khi xóa người dùng. Xin thử lại lần nữa.',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => 'Có vấn đề xảy ra khi phục hồi người dùng bị tạm ngưng. Xin thử lại.',
                 'import'    => 'Có vấn đề xảy ra khi nhập danh sách người dùng. Xin thử lại.',
                 'asset_already_accepted' => 'Tài sản này đã được chấp thuận.',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => 'Không thể liên kết đến máy chủ LDAP. Xin vui lòng kiểm tra lại cấu hình máy chủ LDAP của bạn ở trong tập tin cấu hình LDAP. <br>Lỗi từ máy chủ LDAP: ',
                 'ldap_could_not_search' => 'Không thể tìm thấy máy chủ LDAP. Xin vui lòng kiểm tra cấu hình cài đặt máy chủ LDAP của bạn ở trong tập tin cấu hình LDAP. <br>Lỗi từ máy chủ LDAP:',
                 'ldap_could_not_get_entries' => 'Không thể lấy các mục từ máy chủ LDAP. Xin vui lòng kiểm tra lại cấu hình máy chủ LDAP của bạn ở trong tập tin cấu hình LDAP. <br>Lỗi từ máy chủ LDAP:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/vi/admin/users/table.php b/resources/lang/vi/admin/users/table.php
        index 9140559f20..9c50aac2ee 100644
        --- a/resources/lang/vi/admin/users/table.php
        +++ b/resources/lang/vi/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> 'Đang hoạt động',
             'allow'  				=> 'Cho phép',
             'checkedout'  			=> 'Tài sản',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> 'Địa phương',
             'lock_passwords'		=> 'Chi tiết đăng nhập không thể thay đổi trong cài đặt này.',
             'manager' 				=> 'Người quản lý',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> 'Tên',
             'notes'                 => 'Ghi chú',
             'password_confirm' 		=> 'Xác nhận mật khẩu',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => 'Hiển thị người dùng hiện tại',
             'show_deleted'          => 'Hiển thị người dùng đã xóa',
             'title' 				=> 'Tiêu đề',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> 'Cập nhật người dùng',
             'username' 				=> 'Tên đăng nhập',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(This is used for Active Directory binding only, not for login.)',
             'cloneuser'             => 'Nhân đôi người dùng',
             'viewusers' 			=> 'Xem Người dùng',
        diff --git a/resources/lang/vi/auth/message.php b/resources/lang/vi/auth/message.php
        index 7ef36d4fe2..8da4c82b03 100644
        --- a/resources/lang/vi/auth/message.php
        +++ b/resources/lang/vi/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => 'Tài khoản người dùng này chưa được kích hoạt.',
             'account_suspended'      => 'Tài khoản người dùng này đã bị tạm ngưng.',
             'account_banned'         => 'Tài khoản người dùng này đã bị cấm.',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => 'Too many failed login attempts. Please try again in around :minutes minute(s).',
         
             'signin' => array(
                 'error'   => 'Có vấn đề khi bạn có gắng đăng nhập, xin thử lại.',
        diff --git a/resources/lang/vi/button.php b/resources/lang/vi/button.php
        index 5969ce6524..5fd5d998a6 100644
        --- a/resources/lang/vi/button.php
        +++ b/resources/lang/vi/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => 'Thao tác',
             'add'    	                => 'Thêm mới',
             'cancel'                    => 'Hủy',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => 'Yêu cầu',
             'submit'  	                => 'Gửi',
             'upload'                    => 'Tải lên',
        -
        +	'select_file'				=> 'Select File...',
         );
        diff --git a/resources/lang/vi/general.php b/resources/lang/vi/general.php
        index 4c59bd99c7..84ee1fa7df 100644
        --- a/resources/lang/vi/general.php
        +++ b/resources/lang/vi/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => 'Báo cáo tài sản',
             'asset_tag'				=> 'Thẻ tài sản',
             'assets_available'		=> 'tài sản sẵn có',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> 'Tài sản',
             'avatar_delete'         => 'Xóa hình đại diện',
             'avatar_upload'         => 'Tải lên hình đại diện',
             'back'      			=> 'Quay lại',
             'bad_data'      		=> 'Không tìm thấy bất cứ gì. Có thể dữ liệu bị mất?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> 'Bulk Checkout',
             'cancel'  				=> 'Hủy',
             'categories'			=> 'Danh mục',
             'category'				=> 'Thể loại',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> 'Thay đổi địa chỉ Email',
             'changepassword'  		=> 'Đổi mật khẩu',
             'checkin'  				=> 'Checkin',
             'checkin_from'  		=> 'Checkin từ',
             'checkout'  			=> 'Checkout',
             'city'  				=> 'Thành phố',
        +	'click_here'			=> 'Click here',
             'companies'			=> 'Companies',
             'company'				=> 'Company',
             'component'			=> 'Component',
             'components'			=> 'Components',
        +	'complete'				=> 'Complete',
             'consumable'			=> 'Vật tư phụ',
             'consumables'			=> 'Vật tư phụ',
             'country'  				=> 'Nước',
        @@ -44,16 +51,21 @@
             'created'               => 'Item Created',
             'created_asset'			=> 'tài sản đã tạo',
             'created_at' 			=> 'Đã tạo lúc',
        +    'updated_at' 			=> 'Updated at',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> 'Hiện hành',
             'custom_report'         => 'Điều chỉnh báo cáo tài sản',
             'dashboard'				=> 'Bảng điều khiển',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> 'Ngày',
             'debug_warning'         => 'Warning!',
             'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
             'delete'  				=> 'Xóa',
             'deleted'  				=> 'Đã xóa',
             'delete_seats'  		=> 'Deleted Seats',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> 'Đã cấp phát',
             'depreciation_report'	=> 'Báo cáo khấu hao',
             'download'				=> 'Tải về',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => 'Insufficient permissions!',
             'language'				=> 'Language',
             'last'					=> 'Cuối',
        +    'last_login'            => 'Last Login',
             'last_name'             => 'Tên',
             'license'				=> 'Bản quyền',
             'license_report'        => 'Báo cáo bản quyền',
        @@ -110,6 +123,8 @@
             'moreinfo'				=> 'Xem thêm thông tin',
             'name'					=> 'Tên',
             'next'					=> 'Tiếp',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> 'Không khấu hao',
             'no_results'			=> 'Không có kết quả.',
        @@ -138,13 +153,14 @@
             'select'				=> 'Chọn',
             'search'				=> 'Tìm kiếm',
             'select_category'       => 'Select a Category',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> 'Lựa chọn một Loại Khấu hao',
             'select_location'		=> 'Lựa chọn một Địa phương',
             'select_manufacturer'	=> 'Lựa chọn một nhà sản xuất',
             'select_model'			=> 'Lựa chọn một Kiểu tài sản',
             'select_supplier'		=> 'Lựa chọn một Nhà cung cấp',
             'select_user'			=> 'Lựa chọn một Người dùng',
        -    'select_date'			=> 'Chọn ngày',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> 'Chọn tình trạng',
             'select_company'    	=> 'Select Company',
             'select_asset'    		=> 'Select Asset',
        @@ -158,7 +174,10 @@
             'status'    			=> 'Tình trạng',
             'supplier'              => 'Supplier',
             'suppliers'  			=> 'Nhà cung cấp',
        +    'sure_to_delete'    => 'Are you sure you wish to delete',
             'submit'				=> 'Submit',
        +    'target'                => 'Target',
        +    'time_and_date_display' => 'Time and Date Display',
             'total_assets'			=> 'tổng số tài sản',
             'total_licenses'		=> 'tổng số bản quyền',
             'total_accessories'		=> 'total accessories',
        diff --git a/resources/lang/vi/validation.php b/resources/lang/vi/validation.php
        index 7a752f2c55..af72fcaa7a 100644
        --- a/resources/lang/vi/validation.php
        +++ b/resources/lang/vi/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute phải được chấp nhận.",
        -    "active_url"       => ":attribute thì không phải URL hợp lệ.",
        -    "after"            => ":attribute phải có ngày sau ngày :date.",
        -    "alpha"            => ":attribute có thể chỉ chứa chữ.",
        -    "alpha_dash"       => ":attribute có thể chỉ chứa chữ, số và dấu phẩy.",
        -    "alpha_num"        => ":attribute có thể chỉ chứa chữ và số.",
        -    "before"           => ":attribute phải có ngày trước ngày :date.",
        -    "between"          => array(
        -        "numeric" => ":attribute phải nằm giữa :min - :max.",
        -        "file"    => ":attribute phải nằm giữa :min - :max kilobytes.",
        -        "string"  => ":attribute phải nằm :min - :max ký tự.",
        -    ),
        -    "confirmed"        => ":attribute xác nhận không đúng.",
        -    "date"             => ":attribute có ngày không hợp lý.",
        -    "date_format"      => ":attribute không phù hợp định dạng :format.",
        -    "different"        => ":attribute và :other phải khác nhau.",
        -    "digits"           => ":attribute phải có :digits số.",
        -    "digits_between"   => ":attribute phải ở giữa :min và :max số.",
        -    "email"            => "Định dạng :attribute thì không phù hợp.",
        -    "exists"           => ":attribute đã chọn không phù hợp.",
        -    "email_array"      => "Một hoặc nhiều địa chỉ email không hợp lệ.",
        -    "image"            => ":attribute phải là một hình.",
        -    "in"               => ":attribute đã lựa chọn không hợp lý.",
        -    "integer"          => ":attribute phải là một số nguyên.",
        -    "ip"               => ":attribute phải là một địa chỉ IP.",
        -    "max"              => array(
        -        "numeric" => ":attribute có thể không lớn hơn :max.",
        -        "file"    => ":attribute có thể không lớn hơn :max kilobytes.",
        -        "string"  => ":attribute có thể không lớn hơn :max ký tự.",
        -    ),
        -    "mimes"            => ":attribute phải là một tập tin có phần mở rộng là: :values.",
        -    "min"              => array(
        -        "numeric" => ":attribute phải có ít nhất :min.",
        -        "file"    => ":attribute phải ít nhất :min kilobytes.",
        -        "string"  => ":attribute phải ít nhất :min ký tự.",
        -    ),
        -    "not_in"           => ":attribute đã chọn không hợp lý.",
        -    "numeric"          => ":attribute phải là một số.",
        -    "regex"            => "Định dạng :attribute thì không hợp lý.",
        -    "required"         => "Trường :attribute thì bắt buộc.",
        -    "required_if"      => "Trường :attribute thì bắt buộc khi :other là :value.",
        -    "required_with"    => "Trường :attribute thì bắt buộc khi :values là hiện hành.",
        -    "required_without" => "Trường :attribute thì bắt buộc khi :values không hiện hành.",
        -    "same"             => ":attribute và :other phải giống nhau.",
        -    "size"             => array(
        -        "numeric" => ":attribute phải có cỡ :size.",
        -        "file"    => ":attribute phải có cỡ :size kilobytes.",
        -        "string"  => ":attribute phải có :size ký tự.",
        -    ),
        -    "unique"           => ":attribute đã sẵn sàng.",
        -    "url"              => "Định dạng :attribute thì không hợp lý.",
        -    "statuslabel_type" => "Bạn phải chọn một loại nhãn trạng thái hợp lệ",
        -    "unique_undeleted" => ":attribute phải là duy nhất.",
        +    'accepted'             => ':attribute phải được chấp nhận.',
        +    'active_url'           => ':attribute thì không phải URL hợp lệ.',
        +    'after'                => ':attribute phải có ngày sau ngày :date.',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute có thể chỉ chứa chữ.',
        +    'alpha_dash'           => ':attribute có thể chỉ chứa chữ, số và dấu phẩy.',
        +    'alpha_num'            => ':attribute có thể chỉ chứa chữ và số.',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute phải có ngày trước ngày :date.',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute phải nằm giữa :min - :max.',
        +        'file'    => ':attribute phải nằm giữa :min - :max kilobytes.',
        +        'string'  => ':attribute phải nằm :min - :max ký tự.',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => ':attribute xác nhận không đúng.',
        +    'date'                 => ':attribute có ngày không hợp lý.',
        +    'date_format'          => ':attribute không phù hợp định dạng :format.',
        +    'different'            => ':attribute và :other phải khác nhau.',
        +    'digits'               => ':attribute phải có :digits số.',
        +    'digits_between'       => ':attribute phải ở giữa :min và :max số.',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => 'Định dạng :attribute thì không phù hợp.',
        +    'exists'               => ':attribute đã chọn không phù hợp.',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute phải là một hình.',
        +    'in'                   => ':attribute đã lựa chọn không hợp lý.',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute phải là một số nguyên.',
        +    'ip'                   => ':attribute phải là một địa chỉ IP.',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute có thể không lớn hơn :max.',
        +        'file'    => ':attribute có thể không lớn hơn :max kilobytes.',
        +        'string'  => ':attribute có thể không lớn hơn :max ký tự.',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute phải là một tập tin có phần mở rộng là: :values.',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute phải có ít nhất :min.',
        +        'file'    => ':attribute phải ít nhất :min kilobytes.',
        +        'string'  => ':attribute phải ít nhất :min ký tự.',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => ':attribute đã chọn không hợp lý.',
        +    'numeric'              => ':attribute phải là một số.',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => 'Định dạng :attribute thì không hợp lý.',
        +    'required'             => 'Trường :attribute thì bắt buộc.',
        +    'required_if'          => 'Trường :attribute thì bắt buộc khi :other là :value.',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => 'Trường :attribute thì bắt buộc khi :values là hiện hành.',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => 'Trường :attribute thì bắt buộc khi :values không hiện hành.',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute và :other phải giống nhau.',
        +    'size'                 => [
        +        'numeric' => ':attribute phải có cỡ :size.',
        +        'file'    => ':attribute phải có cỡ :size kilobytes.',
        +        'string'  => ':attribute phải có :size ký tự.',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute đã sẵn sàng.',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => 'Định dạng :attribute thì không hợp lý.',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => "Trường :attribute chứa đựng một ký tự không được phép.",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/zh-CN/admin/asset_maintenances/message.php b/resources/lang/zh-CN/admin/asset_maintenances/message.php
        index 8b2046bfa2..b16d5325c7 100644
        --- a/resources/lang/zh-CN/admin/asset_maintenances/message.php
        +++ b/resources/lang/zh-CN/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => '资产维护信息创建失败,请重试',
                     'success' => '资产维护信息已创建。'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => '尚未完成',
                 'warranty'                     => '有质保',
                 'not_warranty'                 => '无质保',
        diff --git a/resources/lang/zh-CN/admin/asset_maintenances/table.php b/resources/lang/zh-CN/admin/asset_maintenances/table.php
        index 8a0f5960cc..f9082d965a 100644
        --- a/resources/lang/zh-CN/admin/asset_maintenances/table.php
        +++ b/resources/lang/zh-CN/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => '资产维护',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => '资产名称',
                 'is_warranty'   => '质保',
                 'dl_csv'        => '下载CSV文件'
             ];
        diff --git a/resources/lang/zh-CN/admin/categories/general.php b/resources/lang/zh-CN/admin/categories/general.php
        index 8f1559dcdc..f485f5b46a 100644
        --- a/resources/lang/zh-CN/admin/categories/general.php
        +++ b/resources/lang/zh-CN/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> '关于资产分类',
        +    'about_categories'  				=> '资产分类帮助你管理你资产。你可以设置例如:台式机,笔记本,手机,平板 等等分类,当然你也可以自定义这些分类。',
             'asset_categories' 					=> '资产分类',
             'category_name'  					=> '分类名称',
             'checkin_email'                     => '发送邮件到登记的使用者',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => '编辑分类',
             'eula_text'							=> '类别的最终用户许可协议',
             'eula_text_help'					=> '此字段允许您自定义的EULA(最终用户许可协议)为特定类型的资产。如果您所有资产只有一个EULA(最终用户许可协议),你可以检查下面的框中使用默认设置。',
        +    'name'                              => 'Category Name',
             'require_acceptance'				=> '要求用户确认接受这一类的资产。',
             'required_acceptance'				=> '用户会收到一封邮件,邮件中包含一个确认接收的链接。',
             'required_eula'						=> '用户将收到关于EULA(最终用户许可协议)的邮件。',
        diff --git a/resources/lang/zh-CN/admin/companies/general.php b/resources/lang/zh-CN/admin/companies/general.php
        index c46a6eb207..e113bbb942 100644
        --- a/resources/lang/zh-CN/admin/companies/general.php
        +++ b/resources/lang/zh-CN/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => '关于公司',
        +    'about_companies_text'                  => '公司可以用作简单的标识符字段,如果在管理设置中启用了完整多企业支持,也可以用于限制资产,用户等的可见性。',
             'select_company' => '选择公司',
         ];
        diff --git a/resources/lang/zh-CN/admin/custom_fields/general.php b/resources/lang/zh-CN/admin/custom_fields/general.php
        index 4079fce7d6..84ef07cde6 100644
        --- a/resources/lang/zh-CN/admin/custom_fields/general.php
        +++ b/resources/lang/zh-CN/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> '关于字段集',
             'about_fieldsets_text'		=> '字段集允许你为常用的资产模型定义一组可重用的字段。',
             'custom_format'             => '自定义格式',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => '在数据库中加密此字段',
             'encrypt_field_help'      => '警告︰ 对字段的加密将导致该字段无法用于搜索',
             'encrypted'      	        => '已加密',
             'fieldset'      	        => '字段集',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => '名称',
             'field_name'              => '名称',
             'field_values'            => '字段值',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => '添加可选选项,每行一个。 第一行之外的空行将被忽略。',
             'field_element'           => '表单元素',
             'field_element_short'     => '表单元素',
             'field_format'            => '格式',
        diff --git a/resources/lang/zh-CN/admin/custom_fields/message.php b/resources/lang/zh-CN/admin/custom_fields/message.php
        index 400d4d83f0..4db82d37af 100644
        --- a/resources/lang/zh-CN/admin/custom_fields/message.php
        +++ b/resources/lang/zh-CN/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => '新增字段集失败,请重试',
        diff --git a/resources/lang/zh-CN/admin/departments/message.php b/resources/lang/zh-CN/admin/departments/message.php
        new file mode 100644
        index 0000000000..d65f4fbb2b
        --- /dev/null
        +++ b/resources/lang/zh-CN/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => 'Department does not exist.',
        +    'assoc_users'	 => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
        +    'create' => array(
        +        'error'   => 'Department was not created, please try again.',
        +        'success' => 'Department created successfully.'
        +    ),
        +    'update' => array(
        +        'error'   => 'Department was not updated, please try again',
        +        'success' => 'Department updated successfully.'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> 'Are you sure you wish to delete this department?',
        +        'error'   => 'There was an issue deleting the department. Please try again.',
        +        'success' => 'The department was deleted successfully.'
        +    )
        +
        +);
        diff --git a/resources/lang/zh-CN/admin/departments/table.php b/resources/lang/zh-CN/admin/departments/table.php
        new file mode 100644
        index 0000000000..76494247be
        --- /dev/null
        +++ b/resources/lang/zh-CN/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => 'Department Name',
        +    'manager'                   => 'Manager',
        +    'location'                  => 'Location',
        +    'create'                    => 'Create Department',
        +    'update'                    => 'Update Department',
        +    );
        diff --git a/resources/lang/zh-CN/admin/depreciations/general.php b/resources/lang/zh-CN/admin/depreciations/general.php
        index ce968f629c..f64c9153ff 100644
        --- a/resources/lang/zh-CN/admin/depreciations/general.php
        +++ b/resources/lang/zh-CN/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> '关于资产折旧',
             'about_depreciations'  					=> '你可以设置资产折旧时间期限',
             'asset_depreciations'  					=> '资产折旧',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => '新建折旧',
             'depreciation_name'  					=> '折旧名称',
             'number_of_months'  					=> '月数',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => '更新折旧',
         
         );
        diff --git a/resources/lang/zh-CN/admin/groups/titles.php b/resources/lang/zh-CN/admin/groups/titles.php
        index 8076d24929..45552dff8b 100644
        --- a/resources/lang/zh-CN/admin/groups/titles.php
        +++ b/resources/lang/zh-CN/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => '关于分组',
        +    'about_groups'                  => '分组用来区分用户的权限。',
             'group_management' 	 	=> '分组管理',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => '创建新的分组',
        +    'update' 	 		        => '编辑分组',
             'group_name' 	 		=> '分组名称',
             'group_admin' 	 		=> '分组管理员',
             'allow' 	 			=> '允许',
        diff --git a/resources/lang/zh-CN/admin/hardware/form.php b/resources/lang/zh-CN/admin/hardware/form.php
        index ae33db2e75..083cf9dc7e 100644
        --- a/resources/lang/zh-CN/admin/hardware/form.php
        +++ b/resources/lang/zh-CN/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> '批量删除确认',
           'bulk_delete_help'	=> '请在此确认将批量删除的资产。在删除后,资产可以恢复,但一切当前的用户关联将会丢失。',
           'bulk_delete_warn'	=> '即将删除 :asset_count 项资产',
         	'bulk_update'		=> '批量更新',
        diff --git a/resources/lang/zh-CN/admin/hardware/general.php b/resources/lang/zh-CN/admin/hardware/general.php
        index 31f35e9d87..83aa8aaaf8 100644
        --- a/resources/lang/zh-CN/admin/hardware/general.php
        +++ b/resources/lang/zh-CN/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => '关于资产',
        +    'about_assets_text'            => '资产是按照序列号或者资产标签跟踪的物品。可以标记特殊物品为高价值资产。',
         	'archived'  				=> '已存档',
             'asset'  					=> '资产',
             'bulk_checkout'             => '借出资产给某人',
             'checkin'  					=> '借入资产',
        -    'checkout'  				=> '借出资产给某人',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> '复制资产',
             'deployable'  				=> '可部署',
             'deleted'  					=> '该资产已删除。 <a href="/hardware/:asset_id/restore">点击此处恢复</a>.',
        diff --git a/resources/lang/zh-CN/admin/hardware/message.php b/resources/lang/zh-CN/admin/hardware/message.php
        index 8c883fe0c0..a20fb41ad9 100644
        --- a/resources/lang/zh-CN/admin/hardware/message.php
        +++ b/resources/lang/zh-CN/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> '资产恢复成功。'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => '文件删除失败,请重试',
                 'success' => '文件已成功删除。',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> '你确定要删除这个资产吗?',
                 'error'   		=> '删除资产的过程中出现了一点儿问题,请重试。',
        +        'nothing_updated'   => 'No assets were selected, so nothing was deleted.',
                 'success' 		=> '资产成功被删除。'
             ),
         
        diff --git a/resources/lang/zh-CN/admin/licenses/general.php b/resources/lang/zh-CN/admin/licenses/general.php
        index 7cd0755ff1..312b3dd6cf 100644
        --- a/resources/lang/zh-CN/admin/licenses/general.php
        +++ b/resources/lang/zh-CN/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => '关于许可证',
        +    'about_licenses'                  => '许可证用于跟踪软件。 它们包含特殊位数的数字,可以借出给个人。',
             'checkin'  					=> '接入许可证数量',
             'checkout_history'  		=> '借出历史记录',
             'checkout'  				=> '借出许可证数量',
        diff --git a/resources/lang/zh-CN/admin/licenses/message.php b/resources/lang/zh-CN/admin/licenses/message.php
        index fccd670383..aa5d1090e4 100644
        --- a/resources/lang/zh-CN/admin/licenses/message.php
        +++ b/resources/lang/zh-CN/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => '文件上传失败,请重试。',
                 'success' => '文件上传成功。',
                 'nofiles' => '尚未选择要上传的文件,或上传的文件过大。',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => '一个或多个文件过大或文件类型不被允许。允许上传的文件类型有PNG,Gif,Jpg,Jpeg,Doc,Docx,Pdf,Txt,Zip,Rar,Rtf,Xml和LIC。',
             ),
         
             'update' => array(
        diff --git a/resources/lang/zh-CN/admin/locations/table.php b/resources/lang/zh-CN/admin/locations/table.php
        index 8c08794f2c..c5cf8c4245 100644
        --- a/resources/lang/zh-CN/admin/locations/table.php
        +++ b/resources/lang/zh-CN/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => '管理地理位置',
        +    'about_locations'           => '地理位置用来跟踪用户、资产和其他项目的位置信息。',
             'assets_rtd'                => '资产', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => '持有人',
             'id'                        => '编号',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => '地理位置',
             'parent'                    => '上级节点',
             'currency'                  => '当地货币单位',
        +    'ldap_ou'                   => 'LDAP Search OU',
             );
        diff --git a/resources/lang/zh-CN/admin/manufacturers/table.php b/resources/lang/zh-CN/admin/manufacturers/table.php
        index 12031f1dd4..99e59a6340 100644
        --- a/resources/lang/zh-CN/admin/manufacturers/table.php
        +++ b/resources/lang/zh-CN/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => '关于制造商',
        +    'about_manufacturers_text'  => '制造商是您资产的生产厂家。您可以保存一些重要的客服信息,可以方便进行故障报修等操作,这些信息将显示到资产的详情页中。',
             'asset_manufacturers'	=> '资产制造商',
             'create'				=> '创建制造厂',
             'id'   					=> '编号',
        -    'name'      			=> '制造商名称',
        +    'name'      			=> '名称',
        +    'support_email'   		=> '邮件客服支持',
        +    'support_phone'   		=> '电话客服支持',
        +    'support_url'   		=> '网站客服支持',
             'update'				=> '更新制造商',
        +    'url'   				=> 'URL',
         
         );
        diff --git a/resources/lang/zh-CN/admin/models/general.php b/resources/lang/zh-CN/admin/models/general.php
        index bc3e06176a..e7c0abe3e9 100644
        --- a/resources/lang/zh-CN/admin/models/general.php
        +++ b/resources/lang/zh-CN/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => '关于资产型号',
        +    'about_models_text'           => '资产型号是将相同资产分组的一种方式。"MBP 2013"、"IPhone 6s"等。',
             'deleted'  					        => '此型号已被删除。<a href="/hardware/models/:model_id/restore">点击此处恢复</a>。',
             'restore'                   => '恢复型号',
             'requestable'               => '用户可申请此型号',
        diff --git a/resources/lang/zh-CN/admin/models/message.php b/resources/lang/zh-CN/admin/models/message.php
        index 639b0cd493..f208a28066 100644
        --- a/resources/lang/zh-CN/admin/models/message.php
        +++ b/resources/lang/zh-CN/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> '型号恢复成功。'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> 'No fields were changed, so nothing was updated.',
        +        'success' 		=> 'Models updated.'
        +    ),
        +
         );
        diff --git a/resources/lang/zh-CN/admin/settings/general.php b/resources/lang/zh-CN/admin/settings/general.php
        index c8d9a487a9..e472fd8060 100644
        --- a/resources/lang/zh-CN/admin/settings/general.php
        +++ b/resources/lang/zh-CN/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> '警报阈值(天)',
         	'alert_inv_threshold'		=> '库存警报阈值',
         	'asset_ids'					=> '资产ID',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> '生成自动递增资产ID',
         	'auto_increment_prefix'		=> '前缀(可选)',
         	'auto_incrementing_help'    => '在启用自动递增的资产ID之前设置此处。',
        @@ -63,6 +67,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => '外部脚本',
             'load_remote_help_text'		=> '允许Snipe-IT安装外部的加载脚本。',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> '徽标',
             'full_multiple_companies_support_help_text' => '限制归属特定公司的用户(包括管理员)仅能访问该公司资产',
             'full_multiple_companies_support_text' => '完整多企业支持',
        @@ -71,6 +77,12 @@ return array(
             'php'                       => 'PHP版本',
             'php_gd_info'               => '您必须安装php-gd显示二维码,请参阅安装说明。',
             'php_gd_warning'            => 'PHP图像处理的GD[php-gd]插件没有安装',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => '允许二维码首次设置',
             'qr_text'                   => '二维码文本',
             'setting'                   => '设置',
        @@ -90,6 +102,7 @@ return array(
             'about_settings_text'       => '这些设置允许您自定义您的安装偏好',
             'labels_per_page'           => '每页显示',
             'label_dimensions'          => 'Label 尺寸(英尺)',
        +    'next_auto_tag_base'        => 'Next auto-increment',
             'page_padding'             => '页面边框',
             'purge'                    => '清除已标记删除的记录',
             'labels_display_bgutter'    => '标签底部装订线',
        @@ -104,6 +117,8 @@ return array(
             'width_w'        => '宽',
             'height_h'        => '高',
             'text_pt'        => '磅',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => '两步验证',
             'two_factor_secret'        => '两步验证验证码',
             'two_factor_enrollment'        => '加入两步验证',
        @@ -114,15 +129,15 @@ return array(
             'two_factor_reset_error'          => '两步验证设备重设失败',
             'two_factor_enabled_warning'        => '启用两步验证将需要您立即用登记的移动设备验证身份。如您尚未设置两步验证,您现在可以登记您的设备。',
             'two_factor_enabled_help'        => '此操作将用 Google Authenticator 启用两步验证',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_optional'        => '可选项(如果允许,用户可以启用或禁用)',
             'two_factor_required'        => '强制所有用户启用',
             'two_factor_disabled'        => '已停用',
             'two_factor_enter_code'	=> '输入两步验证代码',
             'two_factor_config_complete'	=> '发送两步验证代码',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enabled_edit_not_allowed' => '你的管理员不允许您编辑此设置。',
             'two_factor_enrollment_text'	=> "本系统强制两步验证,但您尚未登记您的移动设备。请启动您的 Google Authenticator 应用并扫描下方二维码以设置两步验证。在您完成后,请在下方输入生成的认证代码。",
             'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'require_accept_signature_help_text'      => '启用此功能将需要用户亲自签署来接受一项资产。',
             'left'        => '左',
             'right'        => '右',
             'top'        => '顶部',
        diff --git a/resources/lang/zh-CN/admin/suppliers/table.php b/resources/lang/zh-CN/admin/suppliers/table.php
        index d728a3c027..69fec0163e 100644
        --- a/resources/lang/zh-CN/admin/suppliers/table.php
        +++ b/resources/lang/zh-CN/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => '关于供应商',
        +    'about_suppliers_text'  => '供应商用来跟踪物品的来源',
             'address'               => '供应商地址',
             'assets'                => '资产',
             'city'                  => '城市',
        diff --git a/resources/lang/zh-CN/admin/users/general.php b/resources/lang/zh-CN/admin/users/general.php
        index 72a520afb4..ad19b362ff 100644
        --- a/resources/lang/zh-CN/admin/users/general.php
        +++ b/resources/lang/zh-CN/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => '分配给:name的资产',
        +    'bulk_update_warn'	=> '您即将编辑user_count用户的属性。请注意,您不能使用此表单更改您自己的用户属性,必须单独对您自己的用户信息进行编辑。',
        +    'bulk_update_help'	=> '此表单允许您一次更新多个用户。仅填写您需要更改的字段。留的空的任何字段将保持不变。',
             'current_assets'    => '资产当前借出给该用户',
             'clone'             => '克隆用户',
             'contact_user'      => '联系 :name',
             'edit'              => '编辑用户',
             'filetype_info'     => '允许的文件类型有: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar',
             'history_user'      => ':name的历史',
        +	'info'				=> '信息',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => '上一次登陆',
             'ldap_config_text'  => 'LDAP配置在 管理 > 设置。所选位置将为导入的用户所用',
             'software_user'     => ':name 借走的软件',
             'view_user'         => '查看用户: :name',
             'usercsv'           => 'CSV 档案',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => '您当前的管理员设置允许使用双重认证。 ',
        +    'two_factor_enrolled' => '双重认证设备登记',
        +    'two_factor_active'   => '启用双重认证',
             );
        diff --git a/resources/lang/zh-CN/admin/users/message.php b/resources/lang/zh-CN/admin/users/message.php
        index 59129e1cbf..251b163208 100644
        --- a/resources/lang/zh-CN/admin/users/message.php
        +++ b/resources/lang/zh-CN/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => '你已成功接受此项资产。',
             'declined'                  => '你已拒绝此项资产。',
        +    'bulk_manager_warn'	        => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
             'user_exists'               => '用户已经存在!',
             'user_not_found'            => '用户[:id] 不存在',
             'user_login_required'       => '登陆字段是必须的',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => '用户创建成功',
                 'update'    => '用户更新成功。',
        +        'update_bulk'    => '用户更新成功。',
                 'delete'    => '用户已经被删除',
                 'ban'       => '用户禁止成功',
                 'unban'     => '用户成功解禁',
        @@ -29,6 +31,7 @@ return array(
                 'create' => '创建用户过程中出现了一些问题,请重试。',
                 'update' => '更新用户过程中出现了一些问题,请重试。',
                 'delete' => '删除用户过程中出现了一点儿问题,请重试。',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => '恢复停用用户的过程中出现了一点儿问题,请重试。',
                 'import'    => '导入用户出现问题。请再试一次。',
                 'asset_already_accepted' => '资产已被接受',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => '无法绑定到LDAP服务器,请检查LDAP配置文件中的相关设置。<br>LDAP服务器错误信息: ',
                 'ldap_could_not_search' => '查询LDAP服务器失败,请检查LDAP配置文件中的相关设置。<br>LDAP服务器错误信息:',
                 'ldap_could_not_get_entries' => '从LDAP服务器获取信息条目失败,请检查LDAP配置文件中的相关设置。<br>LDAP服务器错误信息:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/zh-CN/admin/users/table.php b/resources/lang/zh-CN/admin/users/table.php
        index 0c88d5fb2b..1081f87670 100644
        --- a/resources/lang/zh-CN/admin/users/table.php
        +++ b/resources/lang/zh-CN/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> '激活',
             'allow'  				=> '允许',
             'checkedout'  			=> '资产',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> '位置',
             'lock_passwords'		=> '不能更换登陆资料',
             'manager' 				=> '领导',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> '名字',
             'notes'                 => '笔记',
             'password_confirm' 		=> '确认密码',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => '已当前用户',
             'show_deleted'          => '已删除用户',
             'title' 				=> '职位',
        +	'to_restore_them'		=> 'to restore them.',
             'updateuser' 			=> '更新用户',
             'username' 				=> '用户名',
        +	'user_deleted_text' 	=> 'This user has been marked as deleted.',
             'username_note' 		=> '(这个是用来活动目录「Active Directory」的绑定,非用来登录)',
             'cloneuser'             => '克隆用户',
             'viewusers' 			=> '查看用户',
        diff --git a/resources/lang/zh-CN/auth/message.php b/resources/lang/zh-CN/auth/message.php
        index 612037ec57..5e5f52b67d 100644
        --- a/resources/lang/zh-CN/auth/message.php
        +++ b/resources/lang/zh-CN/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => '用户还未激活',
             'account_suspended'      => '账户已经被停用',
             'account_banned'         => '账户已经被禁用',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => '登录失败的次数太多。请在 :minutes分钟后重试。',
         
             'signin' => array(
                 'error'   => '登陆过程中出现了一点儿问题,请重试。',
        diff --git a/resources/lang/zh-CN/button.php b/resources/lang/zh-CN/button.php
        index 78df7d35e8..82408a02b0 100644
        --- a/resources/lang/zh-CN/button.php
        +++ b/resources/lang/zh-CN/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => '操作',
             'add'    	                => '新增',
             'cancel'                    => '取消',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => '申请',
             'submit'  	                => '提交',
             'upload'                    => '上传',
        -
        +	'select_file'				=> '选择文件...',
         );
        diff --git a/resources/lang/zh-CN/general.php b/resources/lang/zh-CN/general.php
        index 640fdbbc4b..e1ca5f809e 100644
        --- a/resources/lang/zh-CN/general.php
        +++ b/resources/lang/zh-CN/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => '资产报备',
             'asset_tag'				=> '资产标签',
             'assets_available'		=> '可用资产',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> '资产',
             'avatar_delete'         => '删除头像',
             'avatar_upload'         => '上传头像',
             'back'      			=> '后退',
             'bad_data'      		=> '未发现任何东西,是否数据错误?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> '批量借出',
             'cancel'  				=> '取消',
             'categories'			=> '目录',
             'category'				=> '类别:',
        +    'change' 		        => 'In/Out',
             'changeemail'  			=> '更改邮箱',
             'changepassword'  		=> '修改密码',
             'checkin'  				=> '借入',
             'checkin_from'  		=> '输入来源',
             'checkout'  			=> '借出',
             'city'  				=> '城市',
        +	'click_here'			=> '点击此处',
             'companies'			=> '公司',
             'company'				=> '公司',
             'component'			=> '组件',
             'components'			=> '组件',
        +	'complete'				=> '完成',
             'consumable'			=> '消耗品',
             'consumables'			=> '消耗品',
             'country'  				=> '国家',
        @@ -44,16 +51,21 @@
             'created'               => '项目已创建',
             'created_asset'			=> '新建资产',
             'created_at' 			=> '创建于',
        +    'updated_at' 			=> '更新日期',
             'currency'  			=> 'RMB', // this is deprecated
             'current'  				=> '当前',
             'custom_report'         => '客户资产的报告',
             'dashboard'				=> '控制面板',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> '日期',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => '警告!',
        +    'debug_warning_text'         => '此应用程序运行在生产模式下的调试状态。如果您的应用程序可以被外部访问,这会使敏感数据暴露。通过将 <code>.env</code> 文件中的<code>APP_DEBUG</code> 值设置为 <code>false</code>来 禁用调试模式。',
             'delete'  				=> '刪除',
             'deleted'  				=> '已删除',
             'delete_seats'  		=> '已移除空位',
        +    'departments'           => 'Departments',
        +    'department'           => 'Department',
             'deployed'				=> '已分配',
             'depreciation_report'	=> '折旧报告',
             'download'				=> '下载',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => '没有足够的权限',
             'language'				=> '语言',
             'last'					=> '最后页',
        +    'last_login'            => '上一次登陆:',
             'last_name'             => '姓氏',
             'license'				=> '授权许可',
             'license_report'        => '授权许可报告',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> '更多信息',
             'name'					=> '名称',
             'next'					=> '下一页',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> '新!',
             'no_depreciation'		=> '永久',
             'no_results'			=> '没有结果',
             'no'  					=> '否',
             'notes'  				=> '备注',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => '订单号',
             'page_menu'				=> '显示菜单项',
             'pagination_info'		=> '显示全部',
             'pending'				=> '待定',
        @@ -124,8 +139,8 @@
             'previous'				=> '前一页',
             'processing'			=> '处理中',
             'profile'				=> '您的个人资料',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => '采购价格',
        +    'purchase_date'         => '购买日期',
             'qty'		            => '数量',
             'quantity'		        => '数量',
             'ready_to_deploy'		=> '待分配',
        @@ -138,27 +153,31 @@
             'select'				=> '选择',
             'search'				=> '搜索',
             'select_category'       => '选择一个类别',
        +    'select_department'       => 'Select a Department',
             'select_depreciation'	=> '选择失效类型',
             'select_location'		=> '选择地点',
             'select_manufacturer'	=> '选择生产商',
             'select_model'			=> '选择型号',
             'select_supplier'		=> '选择供货商',
             'select_user'			=> '选择用户',
        -    'select_date'			=> '选择日期',
        +    'select_date'			=> 'Select Date (YYYY-MM-DD)',
             'select_statuslabel'	=> '选择状态',
             'select_company'    	=> '选择公司',
             'select_asset'    		=> '选择资产',
             'settings'				=> '设置',
             'sign_in'				=> '登录',
        -    'signature'             => 'Signature',
        +    'signature'             => '签名',
             'some_features_disabled' => '演示模式: 此安装将禁用某些功能。',
             'site_name'				=> '站点名称',
             'state'  				=> '省份',
             'status_labels'			=> '状态标签',
             'status'    			=> '状态',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => '供应商',
             'suppliers'  			=> '供应商',
        +    'sure_to_delete'    => '是否确认要删除',
             'submit'				=> '提交',
        +    'target'                => '目标',
        +    'time_and_date_display' => '时间和日期显示',
             'total_assets'			=> '共计资产',
             'total_licenses'		=> '共计许可证',
             'total_accessories'		=> '总配件',
        diff --git a/resources/lang/zh-CN/validation.php b/resources/lang/zh-CN/validation.php
        index 95cca2577b..4708a28b06 100644
        --- a/resources/lang/zh-CN/validation.php
        +++ b/resources/lang/zh-CN/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => " :attribute 必须接受",
        -    "active_url"       => ":attribute 不是正确的网址",
        -    "after"            => " :attribute 必须在 :date 之后",
        -    "alpha"            => ":attribute 只能包含字母",
        -    "alpha_dash"       => ":attribute 只能包含字母,数字和'-'",
        -    "alpha_num"        => ":attribute 只允许字母和数字",
        -    "before"           => ":attribute 必须在 :date 之前",
        -    "between"          => array(
        -        "numeric" => ":attribute 必须在 :min - :max 之间",
        -        "file"    => ":attribute 必须在 :min - :max kb 之间",
        -        "string"  => ":attribute 必须在 :min - :max 字符之间",
        -    ),
        -    "confirmed"        => ":attribute 属性不匹配",
        -    "date"             => ":attribute 不是有效日期",
        -    "date_format"      => ":attribute 不符合 :format 的格式",
        -    "different"        => " :attribute 和 :other 不能相同",
        -    "digits"           => ":attribute 必须是  :digits  数字",
        -    "digits_between"   => ":attribute 必须在 :min 和 :max 数字之间",
        -    "email"            => ":attribute 格式不对",
        -    "exists"           => "选择的 :attribute 无效",
        -    "email_array"      => "一个或多个邮件地址不正确",
        -    "image"            => ":attribute 必须是图片格式",
        -    "in"               => "选择的 :attribute 无效",
        -    "integer"          => ":attribute 必须是整数",
        -    "ip"               => ":attribute 必须是有效IP",
        -    "max"              => array(
        -        "numeric" => ":attribute 不大于 :max",
        -        "file"    => ":attribute 不大于 :max kb",
        -        "string"  => ":attribute 不大于 :max 字符",
        -    ),
        -    "mimes"            => ":attribute 文件类型必须是 :values",
        -    "min"              => array(
        -        "numeric" => ":attribute 最少  :min",
        -        "file"    => ":attribute 最小 :min kb",
        -        "string"  => ":attribute 最少 :min个字符",
        -    ),
        -    "not_in"           => "选择的 :attribute 无效",
        -    "numeric"          => ":attribute 必须是数字",
        -    "regex"            => ":attribute 格式不对",
        -    "required"         => ":attribute 字段必填",
        -    "required_if"      => ":attribute 字段在 :other 是 :value 时是必须的",
        -    "required_with"    => " 当:values 是现在 :attribute 是必需的",
        -    "required_without" => "当:values 是现在 :attribute 是必需的",
        -    "same"             => ":attribute 和 :other  必需匹配",
        -    "size"             => array(
        -        "numeric" => ":attribute 必需是  :size",
        -        "file"    => ":attribute 必需是 :size kb",
        -        "string"  => ":attribute 必需是 :size 个字符",
        -    ),
        -    "unique"           => ":attribute 已经被采用",
        -    "url"              => ":attribute 格式无效",
        -    "statuslabel_type" => "你必须选择一个有效的状态标签类型",
        -    "unique_undeleted" => " :attribute 必须唯一",
        +    'accepted'             => ' :attribute 必须接受',
        +    'active_url'           => ':attribute 不是正确的网址',
        +    'after'                => ' :attribute 必须在 :date 之后',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute 只能包含字母',
        +    'alpha_dash'           => ':attribute 只能包含字母,数字和\'-\'',
        +    'alpha_num'            => ':attribute 只允许字母和数字',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute 必须在 :date 之前',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute 必须在 :min - :max 之间',
        +        'file'    => ':attribute 必须在 :min - :max kb 之间',
        +        'string'  => ':attribute 必须在 :min - :max 字符之间',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => 'The :attribute field must be true or false.',
        +    'confirmed'            => ':attribute 属性不匹配',
        +    'date'                 => ':attribute 不是有效日期',
        +    'date_format'          => ':attribute 不符合 :format 的格式',
        +    'different'            => ' :attribute 和 :other 不能相同',
        +    'digits'               => ':attribute 必须是  :digits  数字',
        +    'digits_between'       => ':attribute 必须在 :min 和 :max 数字之间',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute 格式不对',
        +    'exists'               => '选择的 :attribute 无效',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute 必须是图片格式',
        +    'in'                   => '选择的 :attribute 无效',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute 必须是整数',
        +    'ip'                   => ':attribute 必须是有效IP',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute 不大于 :max',
        +        'file'    => ':attribute 不大于 :max kb',
        +        'string'  => ':attribute 不大于 :max 字符',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute 文件类型必须是 :values',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute 最少  :min',
        +        'file'    => ':attribute 最小 :min kb',
        +        'string'  => ':attribute 最少 :min个字符',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => '选择的 :attribute 无效',
        +    'numeric'              => ':attribute 必须是数字',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute 格式不对',
        +    'required'             => ':attribute 字段必填',
        +    'required_if'          => ':attribute 字段在 :other 是 :value 时是必须的',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => ' 当:values 是现在 :attribute 是必需的',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => '当:values 是现在 :attribute 是必需的',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute 和 :other  必需匹配',
        +    'size'                 => [
        +        'numeric' => ':attribute 必需是  :size',
        +        'file'    => ':attribute 必需是 :size kb',
        +        'string'  => ':attribute 必需是 :size 个字符',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute 已经被采用',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute 格式无效',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => ":attribute 含有无效字符",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/lang/zh-TW/admin/asset_maintenances/message.php b/resources/lang/zh-TW/admin/asset_maintenances/message.php
        index 078d55577d..d9bb336c55 100644
        --- a/resources/lang/zh-TW/admin/asset_maintenances/message.php
        +++ b/resources/lang/zh-TW/admin/asset_maintenances/message.php
        @@ -11,6 +11,10 @@
                     'error'   => '資產維護訊息新增失敗。請再試一次',
                     'success' => '資產維護訊息已新增。'
                 ],
        +        'edit'                       => [
        +            'error'   => 'Asset Maintenance was not edited, please try again.',
        +            'success' => 'Asset Maintenance edited successfully.'
        +        ],
                 'asset_maintenance_incomplete' => '尚未完成',
                 'warranty'                     => '保固',
                 'not_warranty'                 => '無保固',
        diff --git a/resources/lang/zh-TW/admin/asset_maintenances/table.php b/resources/lang/zh-TW/admin/asset_maintenances/table.php
        index 066ea5e3d7..361ad3efca 100644
        --- a/resources/lang/zh-TW/admin/asset_maintenances/table.php
        +++ b/resources/lang/zh-TW/admin/asset_maintenances/table.php
        @@ -2,7 +2,7 @@
         
             return [
                 'title'         => '資產維護',
        -        'asset_name'    => 'Asset Name',
        +        'asset_name'    => '資產名稱',
                 'is_warranty'   => '保固',
                 'dl_csv'        => '下載CSV檔'
             ];
        diff --git a/resources/lang/zh-TW/admin/categories/general.php b/resources/lang/zh-TW/admin/categories/general.php
        index e963eda050..fac9600d3d 100644
        --- a/resources/lang/zh-TW/admin/categories/general.php
        +++ b/resources/lang/zh-TW/admin/categories/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_categories_title' 			=> 'About Categories',
        -    'about_categories'  				=> 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
        +    'about_categories_title' 			=> '關於類別',
        +    'about_categories'  				=> '資產類別可幫助您組織您的資產。例如:桌上型電腦、筆記型電腦、手機、平板...等,您可依需求自行定義類別。',
             'asset_categories' 					=> '資產類別',
             'category_name'  					=> '類別名稱',
             'checkin_email'                     => '寄送郵件到登記的使用者',
        @@ -11,6 +11,7 @@ return array(
             'edit'                              => '編輯類別',
             'eula_text'							=> '類別的最終用戶許可協議',
             'eula_text_help'					=> '此欄位允許您為指定類型的資產自訂ELUA(最終用戶許可協議)。如果您所有資產只套用一個EULA(最終用戶許可協議),您可以核取下方框將其設為預設。',
        +    'name'                              => '類別名稱',
             'require_acceptance'				=> '要求使用者確認接受此類別的資產',
             'required_acceptance'				=> '使用者會收到包含確認接收連結的郵件',
             'required_eula'						=> '使用者將收到EULA(最終使用者許可協議)的郵件',
        diff --git a/resources/lang/zh-TW/admin/companies/general.php b/resources/lang/zh-TW/admin/companies/general.php
        index 1d66c664fd..611a8a04f8 100644
        --- a/resources/lang/zh-TW/admin/companies/general.php
        +++ b/resources/lang/zh-TW/admin/companies/general.php
        @@ -1,6 +1,6 @@
         <?php
         return [
        -    'about_companies_title'            => 'About Companies',
        -    'about_companies_text'                  => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
        +    'about_companies_title'            => '關於公司',
        +    'about_companies_text'                  => '公司可以用作簡單的識別欄位,如果在管理設定中啟用了完整多企業功能,也可以用於限制資產、使用者的可見性。',
             'select_company' => '選擇公司',
         ];
        diff --git a/resources/lang/zh-TW/admin/custom_fields/general.php b/resources/lang/zh-TW/admin/custom_fields/general.php
        index c972cb6442..9c2a80427e 100644
        --- a/resources/lang/zh-TW/admin/custom_fields/general.php
        +++ b/resources/lang/zh-TW/admin/custom_fields/general.php
        @@ -6,7 +6,7 @@ return array(
             'about_fieldsets_title'		=> '關於欄位集',
             'about_fieldsets_text'		=> '欄位集允許您為常用的資產模型定義一組可重複使用的欄位。',
             'custom_format'             => '自訂格式',
        -    'encrypt_field'      	        => 'Encrypt the value of this field in the database',
        +    'encrypt_field'      	        => '加密資料庫中此欄位的值',
             'encrypt_field_help'      => '警告:對欄位加密將導致此欄無法用於搜索',
             'encrypted'      	        => '已加密',
             'fieldset'      	        => '欄位集',
        @@ -15,7 +15,7 @@ return array(
             'fieldset_name'           => '名稱',
             'field_name'              => '名稱',
             'field_values'            => '欄位值',
        -    'field_values_help'       => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
        +    'field_values_help'       => '添加可選的選項,每行一個。第一行之外的空行將被忽略。',
             'field_element'           => '表單元素',
             'field_element_short'     => '表單元素',
             'field_format'            => '格式',
        diff --git a/resources/lang/zh-TW/admin/custom_fields/message.php b/resources/lang/zh-TW/admin/custom_fields/message.php
        index 94b3ee48ba..f42916868c 100644
        --- a/resources/lang/zh-TW/admin/custom_fields/message.php
        +++ b/resources/lang/zh-TW/admin/custom_fields/message.php
        @@ -28,7 +28,7 @@ return array(
         
             'fieldset' => array(
         
        -
        +        'does_not_exist' => 'Fieldset does not exist',
         
                 'create' => array(
                     'error'   => '新增欄位集失敗,請重試。',
        diff --git a/resources/lang/zh-TW/admin/departments/message.php b/resources/lang/zh-TW/admin/departments/message.php
        new file mode 100644
        index 0000000000..471d17ebaf
        --- /dev/null
        +++ b/resources/lang/zh-TW/admin/departments/message.php
        @@ -0,0 +1,21 @@
        +<?php
        +
        +return array(
        +
        +    'does_not_exist' => '部門不存在。',
        +    'assoc_users'	 => '至少還有一位使用者與此部門關聯,目前不能被删除,請檢查後重試。 ',
        +    'create' => array(
        +        'error'   => '新增部門失敗,請重試。',
        +        'success' => '新增部門成功。'
        +    ),
        +    'update' => array(
        +        'error'   => '更新部門失敗,請重試。',
        +        'success' => '成功更新部門。'
        +    ),
        +    'delete' => array(
        +        'confirm'   	=> '您確定要刪除此部門嗎?',
        +        'error'   => '刪除部門時發生問題,請重試。',
        +        'success' => '刪除部門成功。'
        +    )
        +
        +);
        diff --git a/resources/lang/zh-TW/admin/departments/table.php b/resources/lang/zh-TW/admin/departments/table.php
        new file mode 100644
        index 0000000000..c8479f122e
        --- /dev/null
        +++ b/resources/lang/zh-TW/admin/departments/table.php
        @@ -0,0 +1,11 @@
        +<?php
        +
        +return array(
        +
        +    'id'                        => 'ID',
        +    'name'                      => '部門名稱',
        +    'manager'                   => '主管',
        +    'location'                  => '位置',
        +    'create'                    => '新增部門',
        +    'update'                    => '更新部門',
        +    );
        diff --git a/resources/lang/zh-TW/admin/depreciations/general.php b/resources/lang/zh-TW/admin/depreciations/general.php
        index c2c32bca96..8675de4aef 100644
        --- a/resources/lang/zh-TW/admin/depreciations/general.php
        +++ b/resources/lang/zh-TW/admin/depreciations/general.php
        @@ -4,9 +4,9 @@ return array(
             'about_asset_depreciations'  			=> '關於資產折舊',
             'about_depreciations'  					=> '您可以設置資產折舊期限',
             'asset_depreciations'  					=> '資產折舊',
        -    'create'  					            => 'Create Depreciation',
        +    'create'  					            => '新建折舊',
             'depreciation_name'  					=> '折舊名稱',
             'number_of_months'  					=> '月數',
        -    'update'  					            => 'Update Depreciation',
        +    'update'  					            => '更新折舊',
         
         );
        diff --git a/resources/lang/zh-TW/admin/groups/titles.php b/resources/lang/zh-TW/admin/groups/titles.php
        index 251fa43358..7e716bbb3a 100644
        --- a/resources/lang/zh-TW/admin/groups/titles.php
        +++ b/resources/lang/zh-TW/admin/groups/titles.php
        @@ -1,11 +1,11 @@
         <?php
         
         return array(
        -    'about_groups_title'            => 'About Groups',
        -    'about_groups'                  => 'Groups are used to generalize user permissions.',
        +    'about_groups_title'            => '關於群組',
        +    'about_groups'                  => '群組用來區分使用者權限。',
             'group_management' 	 	=> '群組管理',
        -    'create' 	 	 	    => 'Create New Group',
        -    'update' 	 		        => 'Edit Group',
        +    'create' 	 	 	    => '新增群組',
        +    'update' 	 		        => '編輯群組',
             'group_name' 	 		=> '群組名稱',
             'group_admin' 	 		=> '群組管理員',
             'allow' 	 			=> '允許',
        diff --git a/resources/lang/zh-TW/admin/hardware/form.php b/resources/lang/zh-TW/admin/hardware/form.php
        index eccd96c9e8..5c81b4933f 100644
        --- a/resources/lang/zh-TW/admin/hardware/form.php
        +++ b/resources/lang/zh-TW/admin/hardware/form.php
        @@ -1,7 +1,7 @@
         <?php
         
         return array(
        -	'bulk_delete'		=> 'Confirm Bulk Delete Assets',
        +	'bulk_delete'		=> '確認批次刪除資產',
           'bulk_delete_help'	=> '請再次確認批次刪除的資產。刪除後資產可以恢復,但將會失去當前的用戶關聯資訊。',
           'bulk_delete_warn'	=> '即將刪除 :asset_count 項資產',
         	'bulk_update'		=> '批次更新資產',
        diff --git a/resources/lang/zh-TW/admin/hardware/general.php b/resources/lang/zh-TW/admin/hardware/general.php
        index 3df99885ce..377f54d4e1 100644
        --- a/resources/lang/zh-TW/admin/hardware/general.php
        +++ b/resources/lang/zh-TW/admin/hardware/general.php
        @@ -1,13 +1,13 @@
         <?php
         
         return array(
        -    'about_assets_title'           => 'About Assets',
        -    'about_assets_text'            => 'Assets are items tracked by serial number or asset tag.  They tend to be higher value items where identifying a specific item matters.',
        +    'about_assets_title'           => '關於資產',
        +    'about_assets_text'            => '資產是按序號或資產標籤追蹤的物品。 他們往往是高價值並標示為重要的物品。',
         	'archived'  				=> '已封存',
             'asset'  					=> '資產',
             'bulk_checkout'             => '借出資產給使用者',
             'checkin'  					=> '資產繳回',
        -    'checkout'  				=> '借出資產給使用者',
        +    'checkout'  				=> 'Checkout Asset',
             'clone'  					=> '複製資產',
             'deployable'  				=> '可部署',
             'deleted'  					=> '此資產已刪除。<a href="/hardware/:asset_id/restore">點擊此處恢復</a>.',
        diff --git a/resources/lang/zh-TW/admin/hardware/message.php b/resources/lang/zh-TW/admin/hardware/message.php
        index 3d8d2f8d5d..1f8ef75f2f 100644
        --- a/resources/lang/zh-TW/admin/hardware/message.php
        +++ b/resources/lang/zh-TW/admin/hardware/message.php
        @@ -23,6 +23,12 @@ return array(
                 'success' 		=> '恢復資產成功。'
             ),
         
        +    'audit' => array(
        +        'error'   		=> 'Asset audit was unsuccessful. Please try again.',
        +        'success' 		=> 'Asset audit successfully logged.'
        +    ),
        +
        +
             'deletefile' => array(
                 'error'   => '刪除檔案失敗,請重試。',
                 'success' => '刪除檔案成功。',
        @@ -47,6 +53,7 @@ return array(
             'delete' => array(
                 'confirm'   	=> '您確定要刪除此資產嗎?',
                 'error'   		=> '刪除資產時發生問題,請重試。',
        +        'nothing_updated'   => '沒有資產被選擇,因此沒有更新任何內容。',
                 'success' 		=> '刪除資產成功。'
             ),
         
        diff --git a/resources/lang/zh-TW/admin/licenses/general.php b/resources/lang/zh-TW/admin/licenses/general.php
        index b4f291eda9..8c873d56a0 100644
        --- a/resources/lang/zh-TW/admin/licenses/general.php
        +++ b/resources/lang/zh-TW/admin/licenses/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_licenses_title'            => 'About Licenses',
        -    'about_licenses'                  => 'Licenses are used to track software.  They have a specified number of seats that can be checked out to individuals',
        +    'about_licenses_title'            => '關於授權',
        +    'about_licenses'                  => '授權是用來追踨可供借出的軟體數量。',
             'checkin'  					=> '繳回授權數量',
             'checkout_history'  		=> '借出歷史記錄',
             'checkout'  				=> '借出授權數量',
        diff --git a/resources/lang/zh-TW/admin/licenses/message.php b/resources/lang/zh-TW/admin/licenses/message.php
        index 4cc2a00e71..23873e8221 100644
        --- a/resources/lang/zh-TW/admin/licenses/message.php
        +++ b/resources/lang/zh-TW/admin/licenses/message.php
        @@ -23,7 +23,7 @@ return array(
                 'error'   => '上傳檔案失敗,請重試。',
                 'success' => '上傳檔案成功。',
                 'nofiles' => '您尚未選擇要上傳的檔案,或上傳的檔案太大。',
        -        'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
        +        'invalidfiles' => '一個或多個檔案太大,或者是不允許的檔案類型。允許的檔案類型有 png、 gif、 jpg、 jpeg、 doc、 docx、 pdf、 txt、 zip、 rar、 rtf、 xml 和 lic。',
             ),
         
             'update' => array(
        diff --git a/resources/lang/zh-TW/admin/locations/table.php b/resources/lang/zh-TW/admin/locations/table.php
        index 36e3afaf54..b2b6de18ec 100644
        --- a/resources/lang/zh-TW/admin/locations/table.php
        +++ b/resources/lang/zh-TW/admin/locations/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_locations_title'     => 'About Locations',
        -    'about_locations'           => 'Locations are used to track location information for users, assets, and other items',
        +    'about_locations_title'     => '關於位置',
        +    'about_locations'           => '位置用來追踪使用者、資產和其他項目的位置資訊',
             'assets_rtd'                => '資產', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
             'assets_checkedout'         => '持有人',
             'id'                        => 'ID',
        @@ -17,4 +17,5 @@ return array(
             'locations'                 => '位置',
             'parent'                    => '父項目',
             'currency'                  => '當地貨幣單位',
        +    'ldap_ou'                   => 'LDAP 搜尋 OU',
             );
        diff --git a/resources/lang/zh-TW/admin/manufacturers/table.php b/resources/lang/zh-TW/admin/manufacturers/table.php
        index 47e5038712..12cdd792e8 100644
        --- a/resources/lang/zh-TW/admin/manufacturers/table.php
        +++ b/resources/lang/zh-TW/admin/manufacturers/table.php
        @@ -1,12 +1,16 @@
         <?php
         
         return array(
        -    'about_manufacturers_title'     => 'About manufacturers',
        -    'about_manufacturers_text'           => 'Manufacturers make all the magic items we consume.',
        +    'about_manufacturers_title'    => '關於製造商',
        +    'about_manufacturers_text'  => '廠商是提供您資產的公司,您可以在這裡儲存重要的支援資訊,並顯示在資產的詳細頁面。',
             'asset_manufacturers'	=> '資產製造商',
             'create'				=> '新增製造商',
             'id'   					=> 'ID',
        -    'name'      			=> '製造商名稱',
        +    'name'      			=> '名稱',
        +    'support_email'   		=> '支援 Email',
        +    'support_phone'   		=> '支援電話',
        +    'support_url'   		=> '支援網址',
             'update'				=> '更新製造商',
        +    'url'   				=> '網址',
         
         );
        diff --git a/resources/lang/zh-TW/admin/models/general.php b/resources/lang/zh-TW/admin/models/general.php
        index fc616094eb..3ee9fbbbb8 100644
        --- a/resources/lang/zh-TW/admin/models/general.php
        +++ b/resources/lang/zh-TW/admin/models/general.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_models_title'     => 'About Asset Models',
        -    'about_models_text'           => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
        +    'about_models_title'     => '關於資產型號',
        +    'about_models_text'           => '資產型號是將相同資產分組的一種方式,例如:"MBP 2013"、"iPhone 6s"... 等。',
             'deleted'  					        => '此型號已被刪除。<a href="/hardware/models/:model_id/restore">點擊此處恢復</a>。',
             'restore'                   => '恢復型號',
             'requestable'               => '使用者可申請此型號',
        diff --git a/resources/lang/zh-TW/admin/models/message.php b/resources/lang/zh-TW/admin/models/message.php
        index bc1dbaece9..aba7ebbac0 100644
        --- a/resources/lang/zh-TW/admin/models/message.php
        +++ b/resources/lang/zh-TW/admin/models/message.php
        @@ -28,4 +28,9 @@ return array(
                 'success' 		=> '恢復樣板成功。'
             ),
         
        +    'bulkedit' => array(
        +        'error'   		=> '沒有欄位被更改,因此沒有更新任何內容。',
        +        'success' 		=> '樣板已更新。'
        +    ),
        +
         );
        diff --git a/resources/lang/zh-TW/admin/settings/general.php b/resources/lang/zh-TW/admin/settings/general.php
        index 94110cd1df..daf7ae3f2f 100644
        --- a/resources/lang/zh-TW/admin/settings/general.php
        +++ b/resources/lang/zh-TW/admin/settings/general.php
        @@ -10,6 +10,10 @@ return array(
         	'alert_interval'			=> '警報閾值(天)',
         	'alert_inv_threshold'		=> '庫存警報閾值',
         	'asset_ids'					=> '資產ID',
        +	'audit_interval'            => 'Audit Interval',
        +    'audit_interval_help'       => 'If you are required to regularly physically audit your assets, enter the interval in months.',
        +	'audit_warning_days'        => 'Audit Warning Threshold',
        +    'audit_warning_days_help'   => 'How many days in advance should we warn you when assets are due for auditing?',
         	'auto_increment_assets'		=> '產生自動遞增資產ID',
         	'auto_increment_prefix'		=> '前綴(可選)',
         	'auto_incrementing_help'    => '在啟用自動遞增的資產ID之前設定此處。',
        @@ -64,6 +68,8 @@ return array(
             'ldap_email'                => 'LDAP Email',
             'load_remote_text'          => '外部腳本',
             'load_remote_help_text'		=> '允許 Snipe-IT 安裝外部腳本',
        +    'login_note'                => 'Login Note',
        +    'login_note_help'           => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
             'logo'                    	=> 'Logo',
             'full_multiple_companies_support_help_text' => '限制使用者(包括管理員) 僅能存取該公司的資產',
             'full_multiple_companies_support_text' => '完整支援多公司',
        @@ -72,6 +78,12 @@ return array(
             'php'                       => 'PHP 版本',
             'php_gd_info'               => '您必須安裝 php-gd 顯示二維條碼,請參閱安裝說明。',
             'php_gd_warning'            => 'PHP 圖形處理及 php-gd 套件沒有安裝',
        +    'pwd_secure_complexity'     => 'Password Complexity',
        +    'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
        +    'pwd_secure_min'            => 'Password minimum characters',
        +    'pwd_secure_min_help'       => 'Minimum permitted value is 5',
        +    'pwd_secure_uncommon'       => 'Prevent common passwords',
        +    'pwd_secure_uncommon_help'  => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
             'qr_help'                   => '允許二維條碼首次設置',
             'qr_text'                   => '二維條碼文字',
             'setting'                   => '設定',
        @@ -91,6 +103,7 @@ return array(
             'about_settings_text'       => '這些設定允許您自訂您的安裝偏好',
             'labels_per_page'           => '每頁顯示',
             'label_dimensions'          => '標籤尺寸(英吋)',
        +    'next_auto_tag_base'        => '下一個自動增量',
             'page_padding'             => '頁面邊框(英吋)',
             'purge'                    => '清除已標記刪除的記錄',
             'labels_display_bgutter'    => '標籤底部裝訂線',
        @@ -105,6 +118,8 @@ return array(
             'width_w'        => '寬',
             'height_h'        => '高',
             'text_pt'        => '磅',
        +    'thumbnail_max_h'   => 'Max thumbnail height',
        +    'thumbnail_max_h_help'   => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
             'two_factor'        => '雙因素身份驗證',
             'two_factor_secret'        => '雙因素驗證代碼',
             'two_factor_enrollment'        => '登記雙因素驗證',
        @@ -113,17 +128,17 @@ return array(
             'two_factor_reset_help'        => '此動作會強制使用者再次透過 Google Authenticator 登記行動裝置,此動作可解決原登記行動裝置遺失的問題。',
             'two_factor_reset_success'          => '重設雙因素驗證裝置成功',
             'two_factor_reset_error'          => '重設雙因素驗證裝置失敗',
        -    'two_factor_enabled_warning'        => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',
        +    'two_factor_enabled_warning'        => '啟用雙因素認證將需要您立即用登記的行動裝置驗證身份。如您尚未設置雙因素認證,您現在可以登記您的設備',
             'two_factor_enabled_help'        => '這將使用 Google Authenticator 做雙因素驗證。',
        -    'two_factor_optional'        => 'Selective (Users can enable or disable if permitted)',
        +    'two_factor_optional'        => '可選項(如果允許,用戶可以啟用或禁用)',
             'two_factor_required'        => '強制所有使用者啟用',
             'two_factor_disabled'        => '已停用',
             'two_factor_enter_code'	=> '輸入雙因素認證代碼',
             'two_factor_config_complete'	=> '送出代碼',
        -    'two_factor_enabled_edit_not_allowed' => 'Your administrator does not permit you to edit this setting.',
        +    'two_factor_enabled_edit_not_allowed' => '您的管理員不允許您編輯此設定。',
             'two_factor_enrollment_text'	=> "雙因素認證是必要的,無論您是否已登記行動裝置。開啟您的 Google Authenticator app 並且掃描下方的 QR Code 以登記雙因素認證。當您已登記您的裝置,請在下方輸入認證代碼",
        -    'require_accept_signature'      => 'Require Signature',
        -    'require_accept_signature_help_text'      => 'Enabling this feature will require users to physically sign off on accepting an asset.',
        +    'require_accept_signature'      => '需要簽名',
        +    'require_accept_signature_help_text'      => '啟用此功能將需要使用者親自簽名來接受一項資產。',
             'left'        => '左',
             'right'        => '右',
             'top'        => '頂部',
        diff --git a/resources/lang/zh-TW/admin/suppliers/table.php b/resources/lang/zh-TW/admin/suppliers/table.php
        index e09ff1b452..3dbb05aee6 100644
        --- a/resources/lang/zh-TW/admin/suppliers/table.php
        +++ b/resources/lang/zh-TW/admin/suppliers/table.php
        @@ -1,8 +1,8 @@
         <?php
         
         return array(
        -    'about_suppliers_title' => 'About Suppliers',
        -    'about_suppliers_text'  => 'Suppliers are used to track the source of items',
        +    'about_suppliers_title' => '關於供應商',
        +    'about_suppliers_text'  => '供應商用來追踪物品的來源',
             'address'               => '供應商地址',
             'assets'                => '資產',
             'city'                  => '城市',
        diff --git a/resources/lang/zh-TW/admin/users/general.php b/resources/lang/zh-TW/admin/users/general.php
        index b2e0d2ee03..1563dbd082 100644
        --- a/resources/lang/zh-TW/admin/users/general.php
        +++ b/resources/lang/zh-TW/admin/users/general.php
        @@ -4,18 +4,22 @@
         return array(
         
             'assets_user'       => '分配給 :name 的資產',
        +    'bulk_update_warn'	=> '您正在修改 :user_count 位使用者。請注意!您不能透過此表格修改您自己的資訊,您必須單獨編輯您的個人資訊。',
        +    'bulk_update_help'	=> '此表格允許您同時修改多位使用者。請僅填寫需要修改的欄位,留空的欄位不會做任何修改。',
             'current_assets'    => '目前借出給該使用者的資產',
             'clone'             => '複製使用者',
             'contact_user'      => '聯繫 :name',
             'edit'              => '編輯使用者',
             'filetype_info'     => '允許檔案類型:png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar。',
             'history_user'      => ':name 的歷史記錄',
        +	'info'				=> '資訊',
        +    'restore_user'		=> 'Click here to restore them.',
             'last_login'        => '上次登入',
             'ldap_config_text'  => 'LDAP 設定在 管理 > 設定。所選位置將套用至匯入的使用者。',
             'software_user'     => ':name 借出的軟體',
             'view_user'         => '檢視使用者: :name',
             'usercsv'           => 'CSV 檔',
        -    'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication.  ',
        -    'two_factor_enrolled' => '2FA Device Enrolled ',
        -    'two_factor_active'   => '2FA Active ',
        +    'two_factor_admin_optin_help' => '您當前的管理員設置允許使用雙因素身份驗證。',
        +    'two_factor_enrolled' => '雙因素認證設備登記',
        +    'two_factor_active'   => '啟用雙因素認證',
             );
        diff --git a/resources/lang/zh-TW/admin/users/message.php b/resources/lang/zh-TW/admin/users/message.php
        index e45a066105..bd4bad6522 100644
        --- a/resources/lang/zh-TW/admin/users/message.php
        +++ b/resources/lang/zh-TW/admin/users/message.php
        @@ -4,6 +4,7 @@ return array(
         
             'accepted'                  => '您已接受這項資產。',
             'declined'                  => '您已拒絕這項資產。',
        +    'bulk_manager_warn'	        => '您的使用者已成功更新,但主管條目未保存,因為您選擇的主管也在要編輯的使用者列表中,使用者不能是自己的主管。 請再次選擇您的使用者並排除主管。',
             'user_exists'               => '使用者已存在!',
             'user_not_found'            => '使用者 [:id] 不存在',
             'user_login_required'       => '登入欄位是必需的',
        @@ -16,6 +17,7 @@ return array(
             'success' => array(
                 'create'    => '新增使用者成功。',
                 'update'    => '更新使用者成功。',
        +        'update_bulk'    => '使用者更新成功 !',
                 'delete'    => '刪除使用者成功。',
                 'ban'       => '禁止使用者成功。',
                 'unban'     => '解禁使用者成功。',
        @@ -29,6 +31,7 @@ return array(
                 'create' => '新增使用者失敗,請重試。',
                 'update' => '更新使用者失敗,請重試。',
                 'delete' => '刪除使用者失敗,請重試。',
        +        'delete_has_assets' => 'This user has items assigned and could not be deleted.',
                 'unsuspend' => '解除停用使用者失敗,請重試。',
                 'import'    => '匯入使用者失敗,請重試。',
                 'asset_already_accepted' => '資產已被接受',
        @@ -38,6 +41,7 @@ return array(
                 'ldap_could_not_bind' => '無法綁定 LDAP 伺服器,請檢查 LDAP 設定文件中的相關設定。<br>LDAP 伺服器錯誤訊息:',
                 'ldap_could_not_search' => '查詢 LDAP 伺服器失敗,請檢查 LDAP 設定文件中的相關設定。<br>LDAP 伺服器錯誤訊息:',
                 'ldap_could_not_get_entries' => ' LDAP 伺服器取得資訊條目失敗,請檢查 LDAP 設定文件中的相關設定。<br>LDAP 伺服器錯誤訊息:',
        +        'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
             ),
         
             'deletefile' => array(
        diff --git a/resources/lang/zh-TW/admin/users/table.php b/resources/lang/zh-TW/admin/users/table.php
        index 29704694f6..fb4072f092 100644
        --- a/resources/lang/zh-TW/admin/users/table.php
        +++ b/resources/lang/zh-TW/admin/users/table.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'activated'  			=> '啟用',
             'allow'  				=> '允許',
             'checkedout'  			=> '資產',
        @@ -20,6 +19,7 @@ return array(
             'location'  			=> '位置',
             'lock_passwords'		=> '不能修改登入資料',
             'manager' 				=> '主管',
        +    'managed_locations'     => 'Managed Locations',
             'name' 					=> '名字',
             'notes'                 => '備註',
             'password_confirm' 		=> '確認密碼',
        @@ -28,8 +28,10 @@ return array(
             'show_current'          => '顯示當前使用者',
             'show_deleted'          => '顯示已刪除使用者',
             'title' 				=> '職稱',
        +	'to_restore_them'		=> '將它們還原。',
             'updateuser' 			=> '更新使用者',
             'username' 				=> '使用者名稱',
        +	'user_deleted_text' 	=> '此使用者已被標記為刪除。',
             'username_note' 		=> '(這是用來綁定 Active Directory,非用來登入)',
             'cloneuser'             => '複製使用者',
             'viewusers' 			=> '檢視使用者',
        diff --git a/resources/lang/zh-TW/auth/message.php b/resources/lang/zh-TW/auth/message.php
        index 31beec8b29..a685f7dc19 100644
        --- a/resources/lang/zh-TW/auth/message.php
        +++ b/resources/lang/zh-TW/auth/message.php
        @@ -7,7 +7,7 @@ return array(
             'account_not_activated'  => '使用者尚未啟用',
             'account_suspended'      => '使用者已被停用',
             'account_banned'         => '使用者已被禁用',
        -    'throttle'               => 'Too many failed login attempts. Please try again in :seconds seconds.',
        +    'throttle'               => '嘗試登入的失敗次數太多。請 :minutes 分鐘後再試。',
         
             'signin' => array(
                 'error'   => '登入過程中發生問題,請重試',
        diff --git a/resources/lang/zh-TW/button.php b/resources/lang/zh-TW/button.php
        index 0e9ed7838d..37aada6fc6 100644
        --- a/resources/lang/zh-TW/button.php
        +++ b/resources/lang/zh-TW/button.php
        @@ -1,7 +1,6 @@
         <?php
         
         return array(
        -
             'actions' 	                => '操作',
             'add'    	                => '新增',
             'cancel'                    => '取消',
        @@ -12,5 +11,5 @@ return array(
             'request'                   => '申請',
             'submit'  	                => '送出',
             'upload'                    => '上傳',
        -
        +	'select_file'				=> '選擇檔案…',
         );
        diff --git a/resources/lang/zh-TW/general.php b/resources/lang/zh-TW/general.php
        index 129c35f9d0..095cc32810 100644
        --- a/resources/lang/zh-TW/general.php
        +++ b/resources/lang/zh-TW/general.php
        @@ -18,25 +18,32 @@
             'asset_report'          => '資產報告',
             'asset_tag'				=> '資產標籤',
             'assets_available'		=> '可用資產',
        +    'audit'				    => 'Audit',
        +    'audit_report'			=> 'Audit Log',
             'assets'				=> '資產',
             'avatar_delete'         => '刪除頭像',
             'avatar_upload'         => '上傳頭像',
             'back'      			=> '返回',
             'bad_data'      		=> '未發現任何東西,是否資料有誤?',
        +    'bulkaudit'             => 'Bulk Audit',
        +    'bulkaudit_status'      => 'Audit Status',
             'bulk_checkout'  		=> '批次借出',
             'cancel'  				=> '取消',
             'categories'			=> '類別',
             'category'				=> '類別',
        +    'change' 		        => '進/出',
             'changeemail'  			=> '更改電子郵件地址',
             'changepassword'  		=> '更改密碼',
             'checkin'  				=> '繳回',
             'checkin_from'  		=> '繳回來源',
             'checkout'  			=> '借出',
             'city'  				=> '城市',
        +	'click_here'			=> '點擊這裡',
             'companies'			=> '公司',
             'company'				=> '公司',
             'component'			=> '組件',
             'components'			=> '組件',
        +	'complete'				=> '完成',
             'consumable'			=> '耗材',
             'consumables'			=> '耗材',
             'country'  				=> '國家',
        @@ -44,16 +51,21 @@
             'created'               => '項目已新增',
             'created_asset'			=> '新增資產',
             'created_at' 			=> '新增於',
        +    'updated_at' 			=> '更新日',
             'currency'  			=> '$', // this is deprecated
             'current'  				=> '目前',
             'custom_report'         => '自訂資產報告',
             'dashboard'				=> '儀表板',
        +    'days'      			=> 'days',
        +    'days_to_next_audit'        => 'Days to Next Audit',
             'date'					=> '日期',
        -    'debug_warning'         => 'Warning!',
        -    'debug_warning_text'         => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
        +    'debug_warning'         => '警告!',
        +    'debug_warning_text'         => '此應用程式已開啟除錯模式, 如果開放外部存取可能造成敏感資料外洩。您可透過修改<code>.env</code>檔案中的參數<code>APP_DEBUG</code>,將值改為<code>false</code>關閉除錯模式。',
             'delete'  				=> '刪除',
             'deleted'  				=> '刪除',
             'delete_seats'  		=> '刪除授權',
        +    'departments'           => '部門',
        +    'department'           => '部門',
             'deployed'				=> '已分配',
             'depreciation_report'	=> '折舊報告',
             'download'				=> '下載',
        @@ -87,6 +99,7 @@
             'insufficient_permissions' => '沒有足夠的權限',
             'language'				=> '語言',
             'last'					=> '最後頁',
        +    'last_login'            => '最後登入',
             'last_name'             => '姓氏',
             'license'				=> '授權',
             'license_report'        => '授權報告',
        @@ -110,12 +123,14 @@
             'moreinfo'				=> '更多訊息',
             'name'					=> '名稱',
             'next'					=> '下一頁',
        +    'next_audit_date'		=> 'Next Audit Date',
        +    'last_audit'		    => 'Last Audit',
             'new'					=> 'new!',
             'no_depreciation'		=> '永久',
             'no_results'			=> '沒有結果',
             'no'  					=> '否',
             'notes'  				=> '備註',
        -    'order_number'          => 'Order Number',
        +    'order_number'          => '採購單號',
             'page_menu'				=> '顯示選項',
             'pagination_info'		=> '顯示全部',
             'pending'				=> '待處理',
        @@ -124,8 +139,8 @@
             'previous'				=> '前一頁',
             'processing'			=> '處理中',
             'profile'				=> '您的個人資料',
        -    'purchase_cost'                              => 'Purchase Cost',
        -    'purchase_date'         => 'Purchase Date',
        +    'purchase_cost'                              => '採購成本',
        +    'purchase_date'         => '採購日期',
             'qty'		            => '數量',
             'quantity'		        => '數量',
             'ready_to_deploy'		=> '準備部署',
        @@ -138,27 +153,31 @@
             'select'				=> '選擇',
             'search'				=> '搜尋',
             'select_category'       => '選擇一個類別',
        +    'select_department'       => '選擇部門',
             'select_depreciation'	=> '選擇折舊類型',
             'select_location'		=> '選擇位置',
             'select_manufacturer'	=> '選擇製造商',
             'select_model'			=> '選擇型號',
             'select_supplier'		=> '選擇供應商',
             'select_user'			=> '選擇使用者',
        -    'select_date'			=> '選擇日期',
        +    'select_date'			=> '選擇日期 (YYYY-MM-DD)',
             'select_statuslabel'	=> '選擇狀態',
             'select_company'    	=> '選擇公司',
             'select_asset'    		=> '選擇資產',
             'settings'				=> '設定',
             'sign_in'				=> '登入',
        -    'signature'             => 'Signature',
        +    'signature'             => '簽名',
             'some_features_disabled' => '演示模式︰ 此安裝禁用某些功能。',
             'site_name'				=> '網站名稱',
             'state'  				=> '省份',
             'status_labels'			=> '狀態標籤',
             'status'    			=> '狀態',
        -    'supplier'              => 'Supplier',
        +    'supplier'              => '供應商',
             'suppliers'  			=> '供應商',
        +    'sure_to_delete'    => '您確定要刪除嗎?',
             'submit'				=> '送出',
        +    'target'                => '目標',
        +    'time_and_date_display' => '顯示時間與日期',
             'total_assets'			=> '總資產',
             'total_licenses'		=> '總計授權',
             'total_accessories'		=> '配件總計',
        diff --git a/resources/lang/zh-TW/validation.php b/resources/lang/zh-TW/validation.php
        index fb0c6248b0..f0b034974c 100644
        --- a/resources/lang/zh-TW/validation.php
        +++ b/resources/lang/zh-TW/validation.php
        @@ -13,59 +13,91 @@ return array(
             |
             */
         
        -    "accepted"         => ":attribute 必須接受",
        -    "active_url"       => "屬性不是有效的URL",
        -    "after"            => ":attribute 必須在 :date 之後",
        -    "alpha"            => ":attribute 只能包含字母",
        -    "alpha_dash"       => ":attribute 只能包含字母,數字和'-'",
        -    "alpha_num"        => ":attribute 只允許字母和數字",
        -    "before"           => ":attribute 必須在 :date 之前",
        -    "between"          => array(
        -        "numeric" => ":attribute 必須在 :min - :max 之間",
        -        "file"    => ":attribute 必須在 :min - :max KB 之間",
        -        "string"  => ":attribute 必須在 :min - :max 字元之間",
        -    ),
        -    "confirmed"        => ":attribute 屬性不相符",
        -    "date"             => ":attribute 不是有效日期",
        -    "date_format"      => ":attribute 不符合 :format 的格式",
        -    "different"        => ":attribute 和 :other 不能相同",
        -    "digits"           => ":attribute 必須是 :digits 數字",
        -    "digits_between"   => ":attribute 必須在 :min 和 :max 之间",
        -    "email"            => ":attribute 格式不正確",
        -    "exists"           => "選擇的 :attribute 無效",
        -    "email_array"      => "一個或多個郵件地址不正確",
        -    "image"            => ":attribute 必須是圖片格式",
        -    "in"               => "選擇的 :attribute 無效",
        -    "integer"          => ":attribute 必須是整數",
        -    "ip"               => ":attribute 必須是有效 IP",
        -    "max"              => array(
        -        "numeric" => ":attribute 不可大於 :max",
        -        "file"    => ":attribute 不可大於 :max KB",
        -        "string"  => ":attribute 不可大於 :max 個字元",
        -    ),
        -    "mimes"            => ":attribute 檔案類型必須是 :values",
        -    "min"              => array(
        -        "numeric" => ":attribute 最少 :min",
        -        "file"    => ":attribute 最小 :min KB",
        -        "string"  => ":attribute 最少要有 :min 個字元",
        -    ),
        -    "not_in"           => "選擇的 :attribute 無效",
        -    "numeric"          => ":attribute 必須是數字",
        -    "regex"            => ":attribute 格式不正確",
        -    "required"         => ":attribute 欄位必填",
        -    "required_if"      => ":attribute 欄位在 :other 是 :value 時是必填的",
        -    "required_with"    => "當設定 :value 時,:attribute 欄位必填",
        -    "required_without" => "當設定非 :value 時,:attribute 欄位必填",
        -    "same"             => ":attribute 和 :other 必需相符",
        -    "size"             => array(
        -        "numeric" => ":attribute 必須是 :size",
        -        "file"    => ":attribute 必須是 :size KB",
        -        "string"  => ":attribute 必須是 :size 個字元",
        -    ),
        -    "unique"           => ":attribute 已被採用",
        -    "url"              => ":attribute 格式不正確",
        -    "statuslabel_type" => "您必須選擇一個有效的狀態標籤",
        -    "unique_undeleted" => ":attribute 必須唯一",
        +    'accepted'             => ':attribute 必須接受',
        +    'active_url'           => '屬性不是有效的URL',
        +    'after'                => ':attribute 必須在 :date 之後',
        +    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
        +    'alpha'                => ':attribute 只能包含字母',
        +    'alpha_dash'           => ':attribute 只能包含字母,數字和\'-\'',
        +    'alpha_num'            => ':attribute 只允許字母和數字',
        +    'array'                => 'The :attribute must be an array.',
        +    'before'               => ':attribute 必須在 :date 之前',
        +    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
        +    'between'              => [
        +        'numeric' => ':attribute 必須在 :min - :max 之間',
        +        'file'    => ':attribute 必須在 :min - :max KB 之間',
        +        'string'  => ':attribute 必須在 :min - :max 字元之間',
        +        'array'   => 'The :attribute must have between :min and :max items.',
        +    ],
        +    'boolean'              => ':attribute 必須是 true 或 false',
        +    'confirmed'            => ':attribute 屬性不相符',
        +    'date'                 => ':attribute 不是有效日期',
        +    'date_format'          => ':attribute 不符合 :format 的格式',
        +    'different'            => ':attribute 和 :other 不能相同',
        +    'digits'               => ':attribute 必須是 :digits 數字',
        +    'digits_between'       => ':attribute 必須在 :min 和 :max 之间',
        +    'dimensions'           => 'The :attribute has invalid image dimensions.',
        +    'distinct'             => 'The :attribute field has a duplicate value.',
        +    'email'                => ':attribute 格式不正確',
        +    'exists'               => '選擇的 :attribute 無效',
        +    'file'                 => 'The :attribute must be a file.',
        +    'filled'               => 'The :attribute field must have a value.',
        +    'image'                => ':attribute 必須是圖片格式',
        +    'in'                   => '選擇的 :attribute 無效',
        +    'in_array'             => 'The :attribute field does not exist in :other.',
        +    'integer'              => ':attribute 必須是整數',
        +    'ip'                   => ':attribute 必須是有效 IP',
        +    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
        +    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
        +    'json'                 => 'The :attribute must be a valid JSON string.',
        +    'max'                  => [
        +        'numeric' => ':attribute 不可大於 :max',
        +        'file'    => ':attribute 不可大於 :max KB',
        +        'string'  => ':attribute 不可大於 :max 個字元',
        +        'array'   => 'The :attribute may not have more than :max items.',
        +    ],
        +    'mimes'                => ':attribute 檔案類型必須是 :values',
        +    'mimetypes'            => 'The :attribute must be a file of type: :values.',
        +    'min'                  => [
        +        'numeric' => ':attribute 最少 :min',
        +        'file'    => ':attribute 最小 :min KB',
        +        'string'  => ':attribute 最少要有 :min 個字元',
        +        'array'   => 'The :attribute must have at least :min items.',
        +    ],
        +    'not_in'               => '選擇的 :attribute 無效',
        +    'numeric'              => ':attribute 必須是數字',
        +    'present'              => 'The :attribute field must be present.',
        +    'regex'                => ':attribute 格式不正確',
        +    'required'             => ':attribute 欄位必填',
        +    'required_if'          => ':attribute 欄位在 :other 是 :value 時是必填的',
        +    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
        +    'required_with'        => '當設定 :value 時,:attribute 欄位必填',
        +    'required_with_all'    => 'The :attribute field is required when :values is present.',
        +    'required_without'     => '當設定非 :value 時,:attribute 欄位必填',
        +    'required_without_all' => 'The :attribute field is required when none of :values are present.',
        +    'same'                 => ':attribute 和 :other 必需相符',
        +    'size'                 => [
        +        'numeric' => ':attribute 必須是 :size',
        +        'file'    => ':attribute 必須是 :size KB',
        +        'string'  => ':attribute 必須是 :size 個字元',
        +        'array'   => 'The :attribute must contain :size items.',
        +    ],
        +    'string'               => 'The :attribute must be a string.',
        +    'timezone'             => 'The :attribute must be a valid zone.',
        +    'unique'               => ':attribute 已被採用',
        +    'uploaded'             => 'The :attribute failed to upload.',
        +    'url'                  => ':attribute 格式不正確',
        +
        +    /*
        +    |--------------------------------------------------------------------------
        +    | Custom Validation Language Lines
        +    |--------------------------------------------------------------------------
        +    |
        +    | Here you may specify custom validation messages for attributes using the
        +    | convention "attribute.rule" to name the lines. This makes it quick to
        +    | specify a specific custom language line for a given attribute rule.
        +    |
        +    */
         
         
             /*
        @@ -79,8 +111,14 @@ return array(
             |
             */
         
        -    'custom' => array(),
        -    'alpha_space' => ":attribute 含有無效字元",
        +    'custom' => [
        +        'alpha_space' => "The :attribute field contains a character that is not allowed.",
        +        "email_array"      => "One or more email addresses is invalid.",
        +        "hashed_pass"      => "Your current password is incorrect",
        +        'dumbpwd'          => 'That password is too common.',
        +        "statuslabel_type" => "You must select a valid status label type",
        +        "unique_undeleted" => "The :attribute must be unique.",
        +    ],
         
             /*
             |--------------------------------------------------------------------------
        @@ -93,6 +131,6 @@ return array(
             |
             */
         
        -    'attributes' => array(),
        +    'attributes' => [],
         
         );
        diff --git a/resources/macros/macros.php b/resources/macros/macros.php
        index 7bec721d56..9382367e05 100644
        --- a/resources/macros/macros.php
        +++ b/resources/macros/macros.php
        @@ -15,15 +15,17 @@ Form::macro('locales', function ($name = "locale", $selected = null, $class = nu
               ''=> " ",
               'en'=> "English, US",
               'en-GB'=> "English, UK",
        +      //'af'=> "Afrikaans",
               'ar'=> "Arabic",
               'bg'=> "Bulgarian",
               'zh-CN'=> "Chinese Simplified",
               'zh-TW'=> "Chinese Traditional",
        -      'hr'=> "Croatian",
        +     // 'hr'=> "Croatian",
               'cs'=> "Czech",
               'da'=> "Danish",
               'nl'=> "Dutch",
               'en-ID'=> "English, Indonesia",
        +      'et'=> "Estonian",
               'fi'=> "Finnish",
               'fr'=> "French",
               'de'=> "German",
        @@ -34,9 +36,12 @@ Form::macro('locales', function ($name = "locale", $selected = null, $class = nu
               'it'=> "Italian",
               'ja'=> "Japanese",
               'ko'=> "Korean",
        +     // 'lv'=>'Latvian',
               'lt'=> "Lithuanian",
               'ms'=> "Malay",
        +      'mn'=> "Mongolian",
               'no'=> "Norwegian",
        +      'fa'=> "Persian",
               'pl'=> "Polish",
               'pt-PT'=> "Portuguese",
               'pt-BR'=> "Portuguese, Brazilian",
        @@ -45,6 +50,7 @@ Form::macro('locales', function ($name = "locale", $selected = null, $class = nu
               'es-ES'=> "Spanish",
               'es-CO'=> "Spanish, Colombia",
               'sv-SE'=> "Swedish",
        +      //'ta'=> "Tamil",
               'th'=> "Thai",
               'tr'=> "Turkish",
               'vi'=> "Vietnamese",
        @@ -341,6 +347,55 @@ Form::macro('countries', function ($name = "country", $selected = null, $class =
         });
         
         
        +
        +Form::macro('date_display_format', function ($name = "date_display_format", $selected = null, $class = null) {
        +
        +    $formats = [
        +        'Y-m-d',
        +        'Y-m-d',
        +        'D M d, Y',
        +        'M j, Y',
        +        'd M, Y',
        +        'm/d/Y',
        +        'n/d/y',
        +        'm/j/Y',
        +    ];
        +
        +    foreach ($formats as $format) {
        +        $date_display_formats[$format] = Carbon::now()->format($format);
        +    }
        +    $select = '<select name="'.$name.'" class="'.$class.'" style="min-width:250px">';
        +    foreach ($date_display_formats as $format => $date_display_format) {
        +        $select .= '<option value="'.$format.'"'.($selected == $format ? ' selected="selected"' : '').'>'.$date_display_format.'</option> ';
        +    }
        +
        +    $select .= '</select>';
        +    return $select;
        +
        +});
        +
        +
        +Form::macro('time_display_format', function ($name = "time_display_format", $selected = null, $class = null) {
        +
        +    $formats = [
        +        'g:iA',
        +        'h:iA',
        +        'H:i',
        +    ];
        +
        +    foreach ($formats as $format) {
        +        $time_display_formats[$format] = Carbon::now()->format($format);
        +    }
        +    $select = '<select name="'.$name.'" class="'.$class.'" style="min-width:150px">';
        +    foreach ($time_display_formats as $format => $time_display_format) {
        +        $select .= '<option value="'.$format.'"'.($selected == $format ? ' selected="selected"' : '').'>'.$time_display_format.'</option> ';
        +    }
        +
        +    $select .= '</select>';
        +    return $select;
        +
        +});
        +
         /**
         * Barcode macro
         * Generates the dropdown menu of available barcodes
        @@ -367,51 +422,6 @@ Form::macro('barcode_types', function ($name = "barcode_type", $selected = null,
         });
         
         
        -/**
        -* Currency macro
        -* Generates the dropdown menu of world currencies
        -*/
        -Form::macro('currencies', function ($name = "currency", $selected = null, $class = null) {
        -
        -      $currencies =  array(
        -        'USD' => array('name'=>'US/Canadian/etc Dollar', 'symbol'=>'$','symbol_html'=>'$'),
        -        'GBP' => array('name'=>'GBP - British Pounds', 'symbol'=>'£','symbol_html'=>'&pound;'),
        -        'EUR' => array('name'=>'EUR - Euros', 'symbol'=>'€','symbol_html'=>'&euro;'),
        -        'BGN' => array('name'=>'BGN - Bulgarian lev', 'symbol'=>'лв.','symbol_html'=>'лв.'),
        -        'BRL' => array('name'=>'BRL - Brazilian Real', 'symbol'=>'R$','symbol_html'=>'R$'),
        -        'CZK' => array('name'=>'CZK - Czech koruny', 'symbol'=>'Kč','symbol_html'=>'CZK'),
        -        'DKK' => array('name'=>'DKK - Danish Kroner', 'symbol'=>'kr','symbol_html'=>'kr'),
        -        'HUF' => array('name'=>'HUF - Hungarian Forints', 'symbol'=>'Ft','symbol_html'=>'Ft'),
        -        'ILS' => array('name'=>'ILS - Israeli Shekels', 'symbol'=>'₪','symbol_html'=>'&#8362;'),
        -        'JPY' => array('name'=>'JPY - Japanese Yen', 'symbol'=>'¥','symbol_html'=>'&#165;'),
        -        'MYR' => array('name'=>'MYR - Malaysian Ringgits', 'symbol'=>'RM','symbol_html'=>'RM'),
        -        'NOK' => array('name'=>'NOK - Norwegian Kroner', 'symbol'=>'kr','symbol_html'=>'kr'),
        -        'PHP' => array('name'=>'PHP - Philippine Pesos', 'symbol'=>'Php','symbol_html'=>'Php'),
        -        'PLN' => array('name'=>'PLN - Polish zloty', 'symbol'=>'zł','symbol_html'=>'PLN'),
        -        'INR' => array('name'=>'INR - Indian Rupee', 'symbol'=>'Rs','symbol_html'=>'&#8360;'),
        -        'RUB' => array('name'=>'RUB - Russian Rubles', 'symbol'=>'₽','symbol_html'=>'&#8381;'),
        -        'SEK' => array('name'=>'SEK - Swedish Kronor', 'symbol'=>'kr','symbol_html'=>'kr'),
        -        'CHF' => array('name'=>'CHF - Swiss Francs', 'symbol'=>'CHF','symbol_html'=>'CHF'),
        -        'THB' => array('name'=>'THB - Thai Baht', 'symbol'=>'฿','symbol_html'=>' &#3647;'),
        -        'TRY' => array('name'=>'TRY - Turkish Liras', 'symbol'=>'TL','symbol_html'=>' &#3647;'),
        -        'UAH' => array('name'=>'UAH - Ukrainian Hryvnias', 'symbol'=>'₴','symbol_html'=>'&#8372;'),
        -        'ZAR' => array('name'=>'ZAR - South African Rand', 'symbol'=>'R','symbol_html'=>'R'),
        -        'AED' => array('name'=>'AED - United Arab Emirates Dirham', 'symbol'=>'AED','symbol_html'=>'AED'),
        -        'CNY' => array('name'=>'CNY - Chinese Yuan', 'symbol'=>'¥','symbol_html'=>'&#165;'),
        -  	);
        -
        -    $select = '<select name="'.$name.'" class="'.$class.'">';
        -    foreach ($currencies as $currency) {
        -        $select .= '<option value="'.$currency['symbol'].'"'.($selected == $currency['symbol'] ? ' selected="selected"' : '').'>'.$currency['name'].' ('.$currency['symbol'].')</option> ';
        -    }
        -
        -    $select .= '</select>';
        -
        -    return $select;
        -
        -});
        -
        -
         
         Form::macro('alt_barcode_types', function ($name = "alt_barcode", $selected = null, $class = null) {
         
        diff --git a/resources/views/accessories/checkin.blade.php b/resources/views/accessories/checkin.blade.php
        index 5dcc762cf8..5749be8f59 100755
        --- a/resources/views/accessories/checkin.blade.php
        +++ b/resources/views/accessories/checkin.blade.php
        @@ -24,12 +24,10 @@
             <!-- CSRF Token -->
             <input type="hidden" name="_token" value="{{ csrf_token() }}" />
         
        -
        -
         			@if ($accessory->name)
                     <!-- accessory name -->
                     <div class="form-group">
        -            <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
        +                <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
                         <div class="col-md-6">
                           <p class="form-control-static">{{ $accessory->name }}</p>
                         </div>
        @@ -40,13 +38,15 @@
                     <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
                         <label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label>
                         <div class="col-md-7">
        -                    <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $accessory->note) }}</textarea>
        +                    <textarea class="col-md-6 form-control" id="note" name="note">
        +                        {{ Input::old('note', $accessory->note) }}
        +                    </textarea>
                             {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                         </div>
                     </div>
                     <!-- Form actions -->
                         <div class="form-group">
        -                <label class="col-md-2 control-label"></label>
        +                    <label class="col-md-2 control-label"></label>
                             <div class="col-md-7">
                                 <a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
                                 <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i>{{ trans('general.checkin') }}</button>
        @@ -54,7 +54,7 @@
                         </div>
         
         </form>
        -</div>
        -</div>
        +</div> <!-- .col-md-10.column -->
        +</div> <!-- .row.form-wrapper -->
         
         @stop
        diff --git a/resources/views/accessories/checkout.blade.php b/resources/views/accessories/checkout.blade.php
        index 0b36cfe5e3..bf02673ede 100755
        --- a/resources/views/accessories/checkout.blade.php
        +++ b/resources/views/accessories/checkout.blade.php
        @@ -32,28 +32,30 @@
                  @if ($accessory->name)
                   <!-- accessory name -->
                   <div class="form-group">
        -          <label class="col-sm-3 control-label">{{ trans('admin/accessories/general.accessory_name') }}</label>
        -              <div class="col-md-6">
        -                <p class="form-control-static">{{ $accessory->name }}</p>
        -              </div>
        +            <label class="col-sm-3 control-label">{{ trans('admin/accessories/general.accessory_name') }}</label>
        +            <div class="col-md-6">
        +              <p class="form-control-static">{{ $accessory->name }}</p>
        +            </div>
                   </div>
                   @endif
         
                   @if ($accessory->category->name)
                   <!-- accessory name -->
                   <div class="form-group">
        -          <label class="col-sm-3 control-label">{{ trans('admin/accessories/general.accessory_category') }}</label>
        -              <div class="col-md-6">
        -                <p class="form-control-static">{{ $accessory->category->name }}</p>
        -              </div>
        +            <label class="col-sm-3 control-label">{{ trans('admin/accessories/general.accessory_category') }}</label>
        +            <div class="col-md-6">
        +              <p class="form-control-static">{{ $accessory->category->name }}</p>
        +            </div>
                   </div>
                   @endif
         
                   <!-- User -->
         
                   <div class="form-group {{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        -            <label for="assigned_to" class="col-md-3 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        -             <i class='icon-asterisk'></i></label>
        +            <label for="assigned_to" class="col-md-3 control-label">
        +              {{ trans('admin/hardware/form.checkout_to') }}
        +              <i class='icon-asterisk'></i>
        +            </label>
                     <div class="col-md-9">
                         {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $accessory->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }}
                         {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        @@ -70,7 +72,6 @@
         
                   @if ($accessory->getEula())
                   <div class="form-group">
        -
                     <div class="col-md-9 col-md-offset-3">
                       <p class="hint-block">{{ trans('admin/categories/general.required_eula') }}</p>
                     </div>
        @@ -81,10 +82,10 @@
                <div class="box-footer text-right">
                  <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
                </div>
        -    </div>
        -  </div>
        +    </div> <!-- .box.box-default -->
           </form>
        -</div>
        +  </div> <!-- .col-md-9-->
        +</div> <!-- .row -->
         
         
         @stop
        diff --git a/resources/views/accessories/edit.blade.php b/resources/views/accessories/edit.blade.php
        index ad845dc203..d851d2fabe 100755
        --- a/resources/views/accessories/edit.blade.php
        +++ b/resources/views/accessories/edit.blade.php
        @@ -2,10 +2,10 @@
             'createText' => trans('admin/accessories/general.create') ,
             'updateText' => trans('admin/accessories/general.update'),
             'helpTitle' => trans('admin/accessories/general.about_accessories_title'),
        -    'helpText' => trans('admin/accessories/general.about_accessories_text')
        +    'helpText' => trans('admin/accessories/general.about_accessories_text'),
        +    'formAction' => ($item) ? route('accessories.update', ['accessory' => $item->id]) : route('accessories.store'),
         ])
         
        -
         {{-- Page content --}}
         @section('inputFields')
         
        diff --git a/resources/views/accessories/index.blade.php b/resources/views/accessories/index.blade.php
        index 1722e0b691..819932dcd8 100755
        --- a/resources/views/accessories/index.blade.php
        +++ b/resources/views/accessories/index.blade.php
        @@ -7,15 +7,14 @@
         @stop
         
         @section('header_right')
        -    @can('accessories.create')
        -        <a href="{{ route('create/accessory') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        +    @can('create', \App\Models\Accessory::class)
        +        <a href="{{ route('accessories.create') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
             @endcan
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -
         <div class="row">
           <div class="col-md-12">
         
        @@ -26,37 +25,23 @@
                   name="accessories"
                   class="table table-striped snipe-table"
                   id="table"
        -          data-url="{{route('api.accessories.list') }}"
        +          data-url="{{route('api.accessories.index') }}"
                   data-cookie="true"
                   data-click-to-select="true"
                   data-cookie-id-table="accessoriesTable-{{ config('version.hash_version') }}">
        -            <thead>
        -                <tr>
        -                  <th data-switchable="true" data-searchable="true" data-sortable="true" data-field="companyName" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
        -                  <th data-sortable="true" data-searchable="true"  data-field="name">{{ trans('admin/accessories/table.title') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="category">{{ trans('admin/accessories/general.accessory_category') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="model_number">{{ trans('admin/models/table.modelnumber') }}</th>
        -                  <th data-field="manufacturer" data-searchable="true" data-sortable="true">{{ trans('general.manufacturer') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="location">{{ trans('general.location') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="qty">{{ trans('admin/accessories/general.total') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="purchase_date" data-visible="false">{{ trans('general.purchase_date') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="purchase_cost">{{ trans('general.purchase_cost') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="order_number" data-visible="false">{{ trans('general.order_number') }}</th>
        -                  <th data-searchable="false" data-sortable="true" data-field="min_amt">{{ trans('general.min_amt') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="numRemaining">{{ trans('admin/accessories/general.remaining') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        -                </tr>
        -            </thead>
                   </table>
                 </div>
               </div>
        +    </div>
           </div>
         </div>
         
        +@stop
         
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'accessories-export', 'search' => true])
        -@stop
        -
        -
        +@include ('partials.bootstrap-table', [
        +    'exportFile' => 'accessories-export',
        +    'search' => true,
        +    'columns' => \App\Presenters\AccessoryPresenter::dataTableLayout()
        +    ])
         @stop
        diff --git a/resources/views/accessories/view.blade.php b/resources/views/accessories/view.blade.php
        index 094333a94f..4ce9fb843d 100644
        --- a/resources/views/accessories/view.blade.php
        +++ b/resources/views/accessories/view.blade.php
        @@ -14,25 +14,30 @@
         
         {{-- Right header --}}
         @section('header_right')
        -    @can('accessories.manage')
        +    @can('manage', \App\Models\Accessory::class)
                 <div class="dropdown pull-right">
                   <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
                       <span class="caret"></span>
                   </button>
                   <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
        -                @if ($accessory->assigned_to != '')
        -                  @can('accessories.checkin')
        -                  <li role="presentation"><a href="{{ route('checkin/accessory', $accessory->id) }}">{{ trans('admin/accessories/general.checkin') }}</a></li>
        -                  @endcan
        -                @else
        -                  @can('accessories.checkout')
        -                  <li role="presentation"><a href="{{ route('checkout/accessory', $accessory->id)  }}">{{ trans('admin/accessories/general.checkout') }}</a></li>
        -                  @endcan
        -                @endif
        -                    @can('accessories.edit')
        -                <li role="presentation"><a href="{{ route('update/accessory', $accessory->id) }}">{{ trans('admin/accessories/general.edit') }}</a></li>
        -                        @endcan
        -
        +            @if ($accessory->assigned_to != '')
        +              @can('checkin', \App\Models\Accessory::class)
        +              <li role="presentation">
        +                <a href="{{ route('checkin/accessory', $accessory->id) }}">{{ trans('admin/accessories/general.checkin') }}</a>
        +              </li>
        +              @endcan
        +            @else
        +              @can('checkout', \App\Models\Accessory::class)
        +              <li role="presentation">
        +                <a href="{{ route('checkout/accessory', $accessory->id)  }}">{{ trans('admin/accessories/general.checkout') }}</a>
        +              </li>
        +              @endcan
        +            @endif
        +            @can('update', \App\Models\Accessory::class)
        +            <li role="presentation">
        +              <a href="{{ route('accessories.edit', $accessory->id) }}">{{ trans('admin/accessories/general.edit') }}</a>
        +            </li>
        +            @endcan
                   </ul>
                 </div>
             @endcan
        @@ -46,46 +51,45 @@
           <div class="col-md-9">
         
             <div class="box box-default">
        -       <div class="box-body">
        -         <div class="table table-responsive">
        -         <table
        -         name="accessory_users"
        -         class="table table-striped snipe-table"
        -         id="table"
        -         data-url="{{ route('api.accessories.view', $accessory->id) }}"
        -         data-cookie="true"
        -         data-click-to-select="true"
        -         data-cookie-id-table="accessoryUsersTable">
        -
        -               <thead>
        -                   <tr>
        -                       <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.user') }}</th>
        -                       <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        -                   </tr>
        -               </thead>
        -           </table>
        -         </div>
        +      <div class="box-body">
        +        <div class="table table-responsive">
        +          <table
        +            name="accessory_users"
        +            class="table table-striped snipe-table"
        +            id="table"
        +            data-url="{{ route('api.accessories.show', $accessory->id) }}"
        +            data-cookie="true"
        +            data-click-to-select="true"
        +            data-cookie-id-table="accessoryUsersTable"
        +          >
        +            <thead>
        +              <tr>
        +                <th data-switchable="false" data-searchable="false" data-formatter="userLinkObjFormatter" data-sortable="false" data-field="name">{{ trans('general.user') }}</th>
        +                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +              </tr>
        +            </thead>
        +          </table>
        +        </div>
               </div>
             </div>
           </div>
         
         
        -<!-- side address column -->
        -<div class="col-md-3">
        +  <!-- side address column -->
        +  <div class="col-md-3">
         
             <h4>{{ trans('admin/accessories/general.about_accessories_title') }}</h4>
             <p>{{ trans('admin/accessories/general.about_accessories_text') }} </p>
             <div class="text-center">
        -        @can('accessories.checkout')
        +      @can('checkout', \App\Models\Accessory::class)
                 <a href="{{ route('checkout/accessory', $accessory->id) }}" style="margin-right:5px;" class="btn btn-info btn-sm" {{ (($accessory->numRemaining() > 0 ) ? '' : ' disabled') }}>{{ trans('general.checkout') }}</a>
        -        @endcan
        +      @endcan
             </div>
         
        +  </div>
         </div>
        -</div>
        +@stop
         
         @section('moar_scripts')
         @include ('partials.bootstrap-table', ['exportFile' => 'accessory' . $accessory->name . '-export', 'search' => false])
         @stop
        -
        -@stop
        diff --git a/resources/views/account/accept-asset.blade.php b/resources/views/account/accept-asset.blade.php
        index 6b9559ad53..fcb4d3ec56 100644
        --- a/resources/views/account/accept-asset.blade.php
        +++ b/resources/views/account/accept-asset.blade.php
        @@ -2,7 +2,7 @@
         
         {{-- Page title --}}
         @section('title')
        -    Accept {{ $item->showAssetName() }}
        +    Accept {{ $item->present()->name() }}
             @parent
         @stop
         
        @@ -11,7 +11,7 @@
         @section('content')
         
             
        -<link rel="stylesheet" href="{{ asset('assets/css/signature-pad.css') }}">
        +<link rel="stylesheet" href="{{ asset('css/signature-pad.css') }}">
         
         <style>
         .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline {
        @@ -29,76 +29,71 @@
         
         
         <form class="form-horizontal" method="post" action="" autocomplete="off">
        -    <!-- CSRF Token -->
        -    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -    <input type="hidden" name="logId" value="{{ $findlog->id }}" />
        +  <!-- CSRF Token -->
        +  <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +  <input type="hidden" name="logId" value="{{ $findlog->id }}" />
         
         
        -<div class="row">
        +  <div class="row">
             <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +      <div class="panel box box-default">
        +        <div class="box-body">
        +          <div class="col-md-12">
        +            <div class="radio">
        +              <label>
        +                <input type="radio" name="asset_acceptance" id="accepted" value="accepted">
        +                I accept
        +              </label>
        +            </div>
         
        -        <div class="panel box box-default">
        +            <div class="radio">
        +              <label>
        +                <input type="radio" name="asset_acceptance" id="declined" value="declined">
        +                I decline
        +              </label>
        +            </div>
         
        -            <div class="box-body">
        -                <div class="col-md-12">
        +            @if ($item->getEula())
        +            <div class="col-md-12" style="padding-top: 20px">
        +              <div id="eula_div">
        +                {!!  $item->getEula() !!}
        +              </div>
        +            </div>
        +            @endif
         
        +            @if ($snipeSettings->require_accept_signature=='1')
        +            <div class="col-md-12 col-sm-12 text-center" style="padding-top: 20px">
         
        -                <div class="radio">
        -                    <label>
        -                        <input type="radio" name="asset_acceptance" id="accepted" value="accepted">
        -                        I accept
        -                    </label>
        +              <h3>Sign below to indicate that you agree to the terms of service:</h3>
        +
        +              <div id="signature-pad" class="m-signature-pad col-md-12 col-sm-12">
        +                <div class="m-signature-pad--body col-md-12 col-sm-12">
        +                  <canvas></canvas>
        +                    <input type="hidden" name="signature_output" id="signature_output">
                         </div>
        -                <div class="radio">
        -                    <label>
        -                        <input type="radio" name="asset_acceptance" id="declined" value="declined">
        -                        I decline
        -                    </label>
        +                <div class="col-md-12 col-sm-12 text-center">
        +                  <button type="button" class="btn btn-sm btn-default clear" data-action="clear" id="clear_button">Clear</button>
                         </div>
        +              </div>
        +            </div> <!-- .col-md-12.text-center-->
        +            @endif
         
        -                @if ($item->getEula())
        -                <div class="col-md-12" style="padding-top: 20px">
        -                    <div id="eula_div">
        -                        {!!  $item->getEula() !!}
        -                    </div>
        -                 </div>
        -                @endif
        +          </div><!-- / col-md-12 -->
         
        -                @if ($snipeSettings->require_accept_signature=='1')
        -                <div class="col-md-12 col-sm-12 text-center" style="padding-top: 20px">
        -
        -                    <h3>Sign below to indicate that you agree to the terms of service:</h3>
        -
        -                    <div id="signature-pad" class="m-signature-pad col-md-12 col-sm-12">
        -                        <div class="m-signature-pad--body col-md-12 col-sm-12">
        -                            <canvas></canvas>
        -                            <input type="hidden" name="signature_output" id="signature_output">
        -                        </div>
        -                        <div class="col-md-12 col-sm-12 text-center">
        -                            <button type="button" class="btn btn-sm btn-default clear" data-action="clear" id="clear_button">Clear</button>
        -                        </div>
        -                    </div>
        -                </div>
        -                @endif
        -
        -
        -
        -
        -                </div><!-- / col-md-7 col-sm-12 -->
        -
        -            </div> <!-- / box-body -->
        -            <div class="box-footer text-right">
        -                <button type="submit" class="btn btn-success" id="submit-button"><i class="fa fa-check icon-white"></i> {{ trans('general.submit') }}</button>
        -            </div><!-- /.box-footer -->
        -        </div> <!-- / box-default -->
        +        </div> <!-- / box-body -->
        +        <div class="box-footer text-right">
        +            <button type="submit" class="btn btn-success" id="submit-button"><i class="fa fa-check icon-white"></i> {{ trans('general.submit') }}</button>
        +        </div><!-- /.box-footer -->
        +      </div> <!-- / box-default -->
             </div> <!-- / col -->
        -</div> <!-- / row -->
        -
        +  </div> <!-- / row -->
         </form>
         
        +@stop
        +
         @section('moar_scripts')
         
        -    <script src="{{ asset('assets/js/signature_pad.min.js') }}"></script>
        +    <script src="{{ asset('js/signature_pad.min.js') }}"></script>
             <script>
                 var wrapper = document.getElementById("signature-pad"),
                         clearButton = wrapper.querySelector("[data-action=clear]"),
        @@ -139,5 +134,3 @@
         
             </script>
         @stop
        -
        -@stop
        diff --git a/resources/views/account/api.blade.php b/resources/views/account/api.blade.php
        new file mode 100644
        index 0000000000..0629dbf08a
        --- /dev/null
        +++ b/resources/views/account/api.blade.php
        @@ -0,0 +1,24 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Personal API Keys
        +    @parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +     @if (!config('app.lock_passwords'))
        +         <passport-personal-access-tokens></passport-personal-access-tokens>
        +     @else
        +         <p class="help-block">{{ trans('general.feature_disabled') }}</p>
        +    @endif
        +@stop
        +
        +@section('moar_scripts')
        +<script>
        +    new Vue({
        +        el: "#app",
        +    });
        +</script>
        +@endsection
        \ No newline at end of file
        diff --git a/resources/views/account/change-password.blade.php b/resources/views/account/change-password.blade.php
        index 3de365041c..f91016287f 100755
        --- a/resources/views/account/change-password.blade.php
        +++ b/resources/views/account/change-password.blade.php
        @@ -2,36 +2,35 @@
         
         {{-- Page title --}}
         @section('title')
        -Change your Password
        +{{ trans('general.changepassword') }}
         @stop
         
         {{-- Account page content --}}
         @section('content')
        -<div class="row header">
         
        -    <div class="col-md-12">
        -        <h3>{{ trans('general.changepassword') }}</h3>
        -    </div>
        -</div>
         
        -<div class="row form-wrapper">
        -<form method="post" action="" class="form-horizontal" autocomplete="off">
        +<div class="row">
        +    <div class="col-md-9">
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'autocomplete' => 'off']) }}
             <!-- CSRF Token -->
        -    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +        <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +        <div class="box box-default">
        +            <div class="box-body">
        +
         
             <!-- Old Password -->
        -    <div class="form-group {{ $errors->has('old_password') ? ' has-error' : '' }}">
        -        <label for="old_password" class="col-md-2 control-label">Old Password
        -        <i class='fa fa-asterisk'></i>
        +    <div class="form-group {{ $errors->has('current_password') ? ' has-error' : '' }}">
        +        <label for="current_password" class="col-md-3 control-label">Current Password
        +            <i class='fa fa-asterisk'></i>
                 </label>
                 <div class="col-md-5">
        -            <input class="form-control" type="password" name="old_password" id="old_password" {{ (config('app.lock_passwords') ? ' disabled' : '') }}>
        -            {!! $errors->first('old_password', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            <input class="form-control" type="password" name="current_password" id="current_password" {{ (config('app.lock_passwords') ? ' disabled' : '') }}>
        +            {!! $errors->first('current_password', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                 </div>
             </div>
         
             <div class="form-group {{ $errors->has('password') ? ' has-error' : '' }}">
        -        <label for="password" class="col-md-2 control-label">New Password
        +        <label for="password" class="col-md-3 control-label">New Password
                 <i class='fa fa-asterisk'></i></label>
                 <div class="col-md-5">
                     <input class="form-control" type="password" name="password" id="password" {{ (config('app.lock_passwords') ? ' disabled' : '') }}>
        @@ -41,8 +40,8 @@ Change your Password
         
         
             <div class="form-group {{ $errors->has('password_confirm') ? ' has-error' : '' }}">
        -        <label for="password_confirm" class="col-md-2 control-label">New Password
        -        <i class='fa fa-asterisk'></i>
        +        <label for="password_confirm" class="col-md-3 control-label">New Password
        +            <i class='fa fa-asterisk'></i>
                 </label>
                 <div class="col-md-5">
                     <input class="form-control" type="password" name="password_confirm" id="password_confirm"  {{ (config('app.lock_passwords') ? ' disabled' : '') }}>
        @@ -53,16 +52,16 @@ Change your Password
                 </div>
             </div>
         
        -    <hr>
         
        -    <!-- Form actions -->
        -    <div class="form-group">
        -	<label class="col-md-2 control-label"></label>
        -		<div class="col-md-7">
        -			<a class="btn btn-link" href="{{ route('view-assets') }}">{{ trans('button.cancel') }}</a>
        -			<button type="submit" class="btn btn-success" {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        -		</div>
        -	</div>
         
        -</form>
        +            </div> <!-- .box-body -->
        +            <div class="box-footer text-right">
        +                <a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
        +                <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +            </div>
        +
        +        </div> <!-- .box-default -->
        +        {{ Form::close() }}
        +    </div> <!-- .col-md-9 -->
        +</div> <!-- .row-->
         @stop
        diff --git a/resources/views/account/profile.blade.php b/resources/views/account/profile.blade.php
        index 29e139bb12..b1e81d717e 100755
        --- a/resources/views/account/profile.blade.php
        +++ b/resources/views/account/profile.blade.php
        @@ -10,139 +10,132 @@
         
         <div class="row">
           <div class="col-md-9">
        +  {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'autocomplete' => 'off']) }}
        +  <!-- CSRF Token -->
        +    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
             <div class="box box-default">
               <div class="box-body">
        -        {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'autocomplete' => 'off']) }}
        -        <!-- CSRF Token -->
        -        <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
                 <!-- First Name -->
                 <div class="form-group {{ $errors->has('first_name') ? ' has-error' : '' }}">
        -            <label for="first_name" class="col-md-3 control-label">{{ trans('general.first_name') }}
        -            </label>
        -            <div class="col-md-5 required">
        -                <input class="form-control" type="text" name="first_name" id="first_name" value="{{ Input::old('first_name', $user->first_name) }}" />
        -                {!! $errors->first('first_name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -            </div>
        +          <label for="first_name" class="col-md-3 control-label">{{ trans('general.first_name') }}
        +          </label>
        +          <div class="col-md-5 required">
        +            <input class="form-control" type="text" name="first_name" id="first_name" value="{{ Input::old('first_name', $user->first_name) }}" />
        +            {!! $errors->first('first_name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +          </div>
                 </div>
         
                 <!-- Last Name -->
                 <div class="form-group {{ $errors->has('last_name') ? ' has-error' : '' }}">
        -            <label for="last_name" class="col-md-3 control-label">{{ trans('general.last_name') }}
        -
        -            </label>
        -            <div class="col-md-5 required">
        -                <input class="form-control" type="text" name="last_name" id="last_name" value="{{ Input::old('last_name', $user->last_name) }}" />
        -                {!! $errors->first('last_name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -            </div>
        +          <label for="last_name" class="col-md-3 control-label">
        +            {{ trans('general.last_name') }}
        +          </label>
        +          <div class="col-md-5 required">
        +            <input class="form-control" type="text" name="last_name" id="last_name" value="{{ Input::old('last_name', $user->last_name) }}" />
        +            {!! $errors->first('last_name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +          </div>
                 </div>
         
                 <!-- Location -->
        -            <div class="form-group {{ $errors->has('location_id') ? 'error' : '' }}">
        -                <label class="col-md-3 control-label" for="location_id">{{ trans('general.location') }}
        -                </label>
        -                <div class="col-md-5">
        -                    <div class="field-box">
        -                    {{ Form::select('location_id', $location_list , Input::old('location_id', $user->location_id), array('class'=>'select2', 'style'=>'width:300px')) }}
        -                    {!! $errors->first('location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                </div>
        +        <div class="form-group {{ $errors->has('location_id') ? 'error' : '' }}">
        +          <label class="col-md-3 control-label" for="location_id">
        +            {{ trans('general.location') }}
        +          </label>
        +          <div class="col-md-5">
        +            <div class="field-box">
        +            {{ Form::select('location_id', $location_list , Input::old('location_id', $user->location_id), array('class'=>'select2', 'style'=>'width:300px')) }}
        +            {!! $errors->first('location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                     </div>
        +          </div>
        +        </div>
         
                 <!-- Language -->
        -          <div class="form-group {{ $errors->has('locale') ? 'has-error' : '' }}">
        -              <label class="col-md-3 control-label" for="locale">{{ trans('general.language') }}</label>
        -              <div class="col-md-9">
        -                  {!! Form::locales('locale', Input::old('locale', $user->locale), 'select2') !!}
        -                  {!! $errors->first('locale', '<span class="alert-msg">:message</span>') !!}
        -              </div>
        +        <div class="form-group {{ $errors->has('locale') ? 'has-error' : '' }}">
        +          <label class="col-md-3 control-label" for="locale">{{ trans('general.language') }}</label>
        +          <div class="col-md-9">
        +            {!! Form::locales('locale', Input::old('locale', $user->locale), 'select2') !!}
        +            {!! $errors->first('locale', '<span class="alert-msg">:message</span>') !!}
                   </div>
        +        </div>
         
         
        -      <!-- Website URL -->
        +        <!-- Website URL -->
                 <div class="form-group {{ $errors->has('website') ? ' has-error' : '' }}">
        -            <label for="website" class="col-md-3 control-label">{{ trans('general.website') }}</label>
        -            <div class="col-md-5">
        -                <input class="form-control" type="text" name="website" id="website" value="{{ Input::old('website', $user->website) }}" />
        -                {!! $errors->first('website', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -            </div>
        +          <label for="website" class="col-md-3 control-label">{{ trans('general.website') }}</label>
        +          <div class="col-md-5">
        +            <input class="form-control" type="text" name="website" id="website" value="{{ Input::old('website', $user->website) }}" />
        +            {!! $errors->first('website', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +          </div>
                 </div>
         
                 <!-- Gravatar Email -->
                 <div class="form-group {{ $errors->has('gravatar') ? ' has-error' : '' }}">
        -            <label for="gravatar" class="col-md-3 control-label">{{ trans('general.gravatar_email') }}
        -             <small>(Private)</small></label>
        -            <div class="col-md-5">
        -                <input class="form-control" type="text" name="gravatar" id="gravatar" value="{{ Input::old('gravatar', $user->gravatar) }}" />
        -                {!! $errors->first('gravatar', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                <p><img src="//secure.gravatar.com/avatar/{{ md5(strtolower(trim($user->gravatar))) }}" width="30" height="30" />
        -                <a href="http://gravatar.com"><small>Change your avatar at Gravatar.com</small></a>.
        +          <label for="gravatar" class="col-md-3 control-label">{{ trans('general.gravatar_email') }}
        +            <small>(Private)</small>
        +          </label>
        +          <div class="col-md-5">
        +            <input class="form-control" type="text" name="gravatar" id="gravatar" value="{{ Input::old('gravatar', $user->gravatar) }}" />
        +            {!! $errors->first('gravatar', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            <p>
        +              <img src="//secure.gravatar.com/avatar/{{ md5(strtolower(trim($user->gravatar))) }}" width="30" height="30" />
        +              <a href="http://gravatar.com"><small>Change your avatar at Gravatar.com</small></a>.
                     </p>
        -            </div>
        +          </div>
                 </div>
         
        -      <!-- Avatar -->
        +        <!-- Avatar -->
                 @if ($user->avatar)
        -            <div class="form-group {{ $errors->has('avatar_delete') ? 'has-error' : '' }}">
        -                <label class="col-md-3 control-label" for="avatar_delete">{{ trans('general.avatar_delete') }}</label>
        -                <div class="col-md-5">
        -                    {{ Form::checkbox('avatar_delete') }}
        -                    <img src="{{ config('app.url') }}/uploads/avatars/{{ $user->avatar }}" class="avatar img-circle">
        -                    {!! $errors->first('avatar_delete', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        +          <div class="form-group {{ $errors->has('avatar_delete') ? 'has-error' : '' }}">
        +            <label class="col-md-3 control-label" for="avatar_delete">{{ trans('general.avatar_delete') }}</label>
        +            <div class="col-md-5">
        +              {{ Form::checkbox('avatar_delete') }}
        +              <img src="{{ url('/') }}/uploads/avatars/{{ $user->avatar }}" class="avatar img-circle">
        +              {!! $errors->first('avatar_delete', '<span class="alert-msg">:message</span>') !!}
                     </div>
        +          </div>
                 @endif
         
        -      <div class="form-group {{ $errors->has('avatar') ? 'has-error' : '' }}">
        -        <label class="col-md-3 control-label" for="avatar">{{ trans('general.avatar_upload') }}</label>
        -        <div class="col-md-5">
        -          {{ Form::file('avatar') }}
        -          {!! $errors->first('avatar', '<span class="alert-msg">:message</span>') !!}
        +        <div class="form-group {{ $errors->has('avatar') ? 'has-error' : '' }}">
        +          <label class="col-md-3 control-label" for="avatar">{{ trans('general.avatar_upload') }}</label>
        +          <div class="col-md-5">
        +            {{ Form::file('avatar') }}
        +            {!! $errors->first('avatar', '<span class="alert-msg">:message</span>') !!}
        +          </div>
                 </div>
        -      </div>
         
         
        -      <!-- Two factor opt in -->
        -         @if ($snipeSettings->two_factor_enabled=='1')
        +        <!-- Two factor opt in -->
        +        @if ($snipeSettings->two_factor_enabled=='1')
        +        <div class="form-group {{ $errors->has('avatar') ? 'has-error' : '' }}">
        +          <div class="col-md-7 col-md-offset-3">
        +            @can('self.two_factor')
        +              <label for="avatar">{{ Form::checkbox('two_factor_optin', '1', Input::old('two_factor_optin', $user->two_factor_optin),array('class' => 'minimal')) }}
        +            @else
        +                <label for="avatar">{{ Form::checkbox('two_factor_optin', '1', Input::old('two_factor_optin', $user->two_factor_optin),['class' => 'disabled minimal', 'disabled' => 'disabled']) }}
        +            @endcan
         
        -            <div class="form-group {{ $errors->has('avatar') ? 'has-error' : '' }}">
        -
        -                <div class="col-md-7 col-md-offset-3">
        -
        -                    @can('self.two_factor')
        -                        <label for="avatar">{{ Form::checkbox('two_factor_optin', '1', Input::old('two_factor_optin', $user->two_factor_optin),array('class' => 'minimal')) }}
        -                        @else
        -                            <label for="avatar">{{ Form::checkbox('two_factor_optin', '1', Input::old('two_factor_optin', $user->two_factor_optin),['class' => 'disabled minimal', 'disabled' => 'disabled']) }}
        -                        @endcan
        -
        -                     {{ trans('admin/settings/general.two_factor_enabled_text') }}</label>
        -                    @can('self.two_factor')
        -                        <p class="help-block">{{ trans('admin/settings/general.two_factor_enabled_warning') }}</p>
        -                     @else
        -                       <p class="help-block">{{ trans('admin/settings/general.two_factor_enabled_edit_not_allowed') }}</p>
        -                     @endcan
        -                    @if (config('app.lock_passwords'))
        -                        <p class="help-block">{{ trans('general.feature_disabled') }}</p>
        -                    @endif
        -                </div>
        -            </div>
        -
        -         @endif
        +            {{ trans('admin/settings/general.two_factor_enabled_text') }}</label>
        +            @can('self.two_factor')
        +              <p class="help-block">{{ trans('admin/settings/general.two_factor_enabled_warning') }}</p>
        +            @else
        +              <p class="help-block">{{ trans('admin/settings/general.two_factor_enabled_edit_not_allowed') }}</p>
        +            @endcan
        +            @if (config('app.lock_passwords'))
        +              <p class="help-block">{{ trans('general.feature_disabled') }}</p>
        +            @endif
        +          </div>
        +        </div>
        +        @endif
         
         
        -
        -
        -      </div>
        +      </div> <!-- .box-body -->
               <div class="box-footer text-right">
        -        <button type="submit" class="btn btn-success"><i class="fa fa-ok icon-white"></i> {{ trans('general.save') }}</button>
        +        <a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
        +        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
               </div>
        -    </div>
        -  </div>
        -</div>
        -
        -
        -
        -
        -</form>
        +    </div> <!-- .box-default -->
        +    {{ Form::close() }}
        +  </div> <!-- .col-md-9 -->
        +</div> <!-- .row-->
         
         @stop
        diff --git a/resources/views/account/requestable-assets.blade.php b/resources/views/account/requestable-assets.blade.php
        index 6236b21c32..31b69cf53a 100644
        --- a/resources/views/account/requestable-assets.blade.php
        +++ b/resources/views/account/requestable-assets.blade.php
        @@ -51,30 +51,24 @@
                                         <tr>
                                             <form action="{{route('account/request-item', ['itemType' => 'asset', 'itemId' => $asset->id])}}" method="POST" accept-charset="utf-8">
                                                 {{ csrf_field() }}
        -                                        <td>{{ $asset->model->name }}</td>
        +                                        <td>{!! $asset->model->present()->nameUrl() !!}</td>
         
                                                 @if ($snipeSettings->display_asset_name)
                                                 <td>{{ $asset->name }}</td>
                                                 @endif
         
        -                                        <td>{{ $asset->serial }}</td>
        +                                        <td><a href="{{ $asset->present()->viewUrl() }}">{{ $asset->serial }}</a></td>
         
                                                 <td>
        -                                            @if ($asset->assigneduser && $asset->assetloc)
        -                                            {{ $asset->assetloc->name }}
        -                                            @elseif ($asset->defaultLoc)
        -                                            {{ $asset->defaultLoc->name }}
        -                                            @endif
        +                                            {!! $asset->assetLoc->present()->nameUrl() !!}
                                                 </td>
        -                                         @if ($asset->assigned_to != '' && $asset->assigned_to > 0)
        +                                        @if ($asset->assigned_to != '' && $asset->assigned_to > 0)
                                                     <td>Checked out</td>
                                                 @else
        -                                        <td>{{ trans('admin/hardware/general.requestable') }}</td>
        +                                            <td>{{ trans('admin/hardware/general.requestable') }}</td>
                                                 @endif
         
                                                 <td>{{ $asset->expected_checkin }}</td>
        -
        -
                                                 <td>
                                                     @if ($asset->isRequestedBy(Auth::user()))
                                                         {{Form::submit(trans('button.cancel'), ['class' => 'btn btn-danger btn-sm'])}}
        @@ -89,7 +83,6 @@
                                 </table>
                             </div>
         
        -
                             @else
                             <div class="col-md-12">
                                 <div class="alert alert-info alert-block">
        @@ -97,8 +90,6 @@
                                     {{ trans('general.no_results') }}
                                 </div>
                             </div>
        -
        -
                             @endif
                         </div>
         
        @@ -114,19 +105,18 @@
                                         <th class="col-md-2" bSortable="true">{{ trans('general.quantity') }}</th>
                                         <th class="col-md-1 actions" bSortable="false">{{ trans('table.actions') }}</th>
                                     </tr>
        -                    </thead>
        +                        </thead>
         
                                 <tbody>
                                     @foreach($models as $requestableModel)
        -
                                         <tr>
        -                                     <form  action="{{route('account/request-item', ['itemType' => 'asset_model', 'itemId' => $requestableModel->id])}}"
        +                                    <form  action="{{route('account/request-item', ['itemType' => 'asset_model', 'itemId' => $requestableModel->id])}}"
                                                     method="POST"
                                                     accept-charset="utf-8"
                                             >
                                                 {{ csrf_field() }}
                                                 <td>{{$requestableModel->name}}</td>
        -                                        <td>{{$requestableModel->assets()->where('requestable', '1')->count()}}</td>
        +                                        <td>{{$requestableModel->assets->where('requestable', '1')->count()}}</td>
                                                 <td><input type="text" name="request-quantity" value=""></td>
                                                 <td>
                                                     @if ($requestableModel->isRequestedBy(Auth::user()))
        @@ -155,10 +145,9 @@
                 </div> <!-- .nav-tabs-custom -->
             </div> <!-- .col-md-12> -->
         </div> <!-- .row -->
        -
        -
        -
         @stop
        +
        +
         @section('moar_scripts')
         <script>
         
        diff --git a/resources/views/account/view-assets.blade.php b/resources/views/account/view-assets.blade.php
        index b2baacba8d..a6eb892450 100755
        --- a/resources/views/account/view-assets.blade.php
        +++ b/resources/views/account/view-assets.blade.php
        @@ -2,310 +2,264 @@
         
         {{-- Page title --}}
         @section('title')
        -    View Assets for  {{ $user->fullName() }}
        -    @parent
        +View Assets for  {{ $user->present()->fullName() }}
        +@parent
         @stop
         
         {{-- Account page content --}}
         @section('content')
         
        -    <div class="row">
        -        <div class="col-md-12">
        -            <div class="box box-default">
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
         
        -                @if ($user->id)
        -                    <div class="box-header with-border">
        -                        <div class="box-heading">
        -                            <h3 class="box-title"> {{ trans('admin/users/general.assets_user', array('name' => $user->first_name)) }}</h3>
        -                        </div>
        -                    </div><!-- /.box-header -->
        -                @endif
        +        @if ($user->id)
        +          <div class="box-header with-border">
        +            <div class="box-heading">
        +              <h3 class="box-title"> {{ trans('admin/users/general.assets_user', array('name' => $user->first_name)) }}</h3>
        +            </div>
        +          </div><!-- /.box-header -->
        +        @endif
         
        -                <div class="box-body">
        -                    <!-- checked out assets table -->
        -                    @if (count($user->assets) > 0)
        -                        <div class="table-responsive">
        -                            <table class="table table-striped">
        -                                <thead>
        -                                <tr>
        -                                    <th class="col-md-4">{{ trans('admin/hardware/table.asset_model') }}</th>
        -                                    <th class="col-md-2">{{ trans('admin/hardware/table.asset_tag') }}</th>
        -                                    <th class="col-md-3">{{ trans('general.name') }}</th>
        -                                    <th></th>
        -                                </tr>
        -                                </thead>
        -                                <tbody>
        -                                @foreach ($user->assets as $asset)
        -                                    <tr>
        -                                        <td>
        -                                            @if ($asset->physical=='1') {{ $asset->model->name }}
        -                                            @endif
        -                                        </td>
        -                                        <td>{{ $asset->asset_tag }}</td>
        -                                        <td>{{ $asset->name }}</td>
        -                                        <td>
        -
        -                                            @if (($asset->image) && ($asset->image!=''))
        -                                                <img src="{{ config('app.url') }}/uploads/assets/{{ $asset->image }}" height="50" width="50">
        -
        -                                            @elseif (($asset->model) && ($asset->model->image!=''))
        -                                                <img src="{{ config('app.url') }}/uploads/models/{{ $asset->model->image }}" height="50" width="50">
        -                                            @endif
        -
        -                                        </td>
        -
        -                                    </tr>
        -                                @endforeach
        -                                </tbody>
        -                            </table>
        -                        </div>
        -                    @else
        -
        -                        <div class="col-md-12">
        -                            <div class="alert alert-info alert-block">
        -                                <i class="fa fa-info-circle"></i>
        -                                {{ trans('general.no_results') }}
        -                            </div>
        -                        </div>
        +      <div class="box-body">
        +        <!-- checked out assets table -->
        +        @if (count($user->assets) > 0)
        +          <div class="table-responsive">
        +            <table class="table table-striped">
        +              <thead>
        +                <tr>
        +                  <th class="col-md-4">{{ trans('admin/hardware/table.asset_model') }}</th>
        +                  <th class="col-md-2">{{ trans('admin/hardware/table.asset_tag') }}</th>
        +                  <th class="col-md-3">{{ trans('general.name') }}</th>
        +                  <th></th>
        +                </tr>
        +              </thead>
        +              <tbody>
        +                @foreach ($user->assets as $asset)
        +                <tr>
        +                  <td>
        +                    @if ($asset->physical=='1')
        +                    {{ $asset->model->name }}
                             @endif
        -                </div>
        +                  </td>
        +                  <td>{{ $asset->asset_tag }}</td>
        +                  <td>{{ $asset->name }}</td>
        +                  <td>
        +                    @if (($asset->image) && ($asset->image!=''))
        +                      <img src="{{ url('/') }}/uploads/assets/{{ $asset->image }}" height="50" width="50">
        +
        +                    @elseif (($asset->model) && ($asset->model->image!=''))
        +                      <img src="{{ url('/') }}/uploads/models/{{ $asset->model->image }}" height="50" width="50">
        +                    @endif
        +                  </td>
        +                </tr>
        +                @endforeach
        +              </tbody>
        +            </table>
        +          </div> <!-- .table-responsive-->
        +        @else
        +
        +        <div class="col-md-12">
        +          <div class="alert alert-info alert-block">
        +            <i class="fa fa-info-circle"></i>
        +            {{ trans('general.no_results') }}
        +          </div>
        +        </div>
        +        @endif
        +      </div> <!-- .box-body-->
        +    </div><!--.box.box-default-->
        +  </div> <!-- .col-md-12-->
        +</div> <!-- .row-->
        +
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +      @if ($user->id)
        +        <div class="box-header with-border">
        +          <div class="box-heading">
        +            <h3 class="box-title"> {{ trans('admin/users/general.software_user', array('name' => $user->first_name)) }}</h3>
        +          </div>
        +        </div><!-- /.box-header -->
        +      @endif
        +
        +      <div class="box-body">
        +        <!-- checked out licenses table -->
        +        @if (count($user->licenses) > 0)
        +        <div class="table-responsive">
        +          <table class="table table-striped">
        +            <thead>
        +              <tr>
        +                <th class="col-md-5">{{ trans('general.name') }}</th>
        +                <th class="col-md-4">{{ trans('admin/hardware/form.serial') }}</th>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              @foreach ($user->licenses as $license)
        +              <tr>
        +                <td>{{ $license->name }}</td>
        +                <td>
        +                  @can('viewKeys', $license)
        +                  {{ mb_strimwidth($license->serial, 0, 50, "...") }}
        +                  @else
        +                  ---
        +                  @endcan
        +                </td>
        +              </tr>
        +              @endforeach
        +            </tbody>
        +          </table>
        +        </div> <!-- .table-responsive-->
        +        @else
        +        <div class="col-md-12">
        +          <div class="alert alert-info alert-block">
        +            <i class="fa fa-info-circle"></i>
        +            {{ trans('general.no_results') }}
        +          </div>
        +        </div>
        +        @endif
        +      </div> <!-- .box-body-->
        +    </div><!--.box.box-default-->
        +  </div> <!-- .col-md-12-->
        +</div> <!-- .row-->
        +
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +      @if ($user->id)
        +      <div class="box-header with-border">
        +        <div class="box-heading">
        +          <h3 class="box-title"> {{ trans('general.consumables') }} </h3>
        +        </div>
        +      </div><!-- /.box-header -->
        +      @endif
        +
        +      <div class="box-body">
        +        <!-- checked out consumables table -->
        +        @if (count($user->consumables) > 0)
        +        <div class="table-responsive">
        +          <table class="table table-striped">
        +            <thead>
        +              <tr>
        +                <th class="col-md-12">{{ trans('general.name') }}</th>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              @foreach ($user->consumables as $consumable)
        +              <tr>
        +                <td>{{ $consumable->name }}</td>
        +              </tr>
        +              @endforeach
        +            </tbody>
        +          </table>
        +        </div>
        +        @else
        +        <div class="col-md-12">
        +            <div class="alert alert-info alert-block">
        +                <i class="fa fa-info-circle"></i>
        +                {{ trans('general.no_results') }}
                     </div>
                 </div>
        -    </div>
        +        @endif
         
        -    <div class="row">
        +      </div> <!-- .box-body-->
        +    </div><!--.box.box-default-->
        +  </div> <!-- .col-md-12-->
        +</div> <!-- .row-->
        +
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +
        +      @if ($user->id)
        +      <div class="box-header with-border">
        +        <div class="box-heading">
        +          <h3 class="box-title"> {{ trans('general.accessories') }}</h3>
        +        </div>
        +      </div><!-- /.box-header -->
        +      @endif
        +
        +      <div class="box-body">
        +        <!-- checked out licenses table -->
        +        @if (count($user->accessories) > 0)
        +        <div class="table-responsive">
        +          <table class="table table-striped">
        +            <thead>
        +              <tr>
        +                <th class="col-md-12">Name</th>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              @foreach ($user->accessories as $accessory)
        +              <tr>
        +                <td>{{ $accessory->name }}</td>
        +              </tr>
        +              @endforeach
        +            </tbody>
        +          </table>
        +        </div>
        +        @else
                 <div class="col-md-12">
        -            <div class="box box-default">
        +          <div class="alert alert-info alert-block">
        +            <i class="fa fa-info-circle"></i>
        +            {{ trans('general.no_results') }}
        +          </div>
        +        </div>
        +        @endif
        +       </div> <!-- .box-body-->
        +    </div><!--.box.box-default-->
        +  </div> <!-- .col-md-12-->
        +</div> <!-- .row-->
         
        -                @if ($user->id)
        -                    <div class="box-header with-border">
        -                        <div class="box-heading">
        -                            <h3 class="box-title"> {{ trans('admin/users/general.software_user', array('name' => $user->first_name)) }}</h3>
        -                        </div>
        -                    </div><!-- /.box-header -->
        -                @endif
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +      @if ($user->id)
        +      <div class="box-header with-border">
        +        <div class="box-heading">
        +          <h3 class="box-title"> History</h3>
        +        </div>
        +      </div><!-- /.box-header -->
        +      @endif
         
        -                <div class="box-body">
        -                    <!-- checked out licenses table -->
        -                    @if (count($user->licenses) > 0)
        -                        <div class="table-responsive">
        -                            <table class="table table-striped">
        -                                <thead>
        -                                <tr>
        -                                    <th class="col-md-5">{{ trans('general.name') }}</th>
        -                                    <th class="col-md-4">{{ trans('admin/hardware/form.serial') }}</th>
        -                                </tr>
        -                                </thead>
        -                                <tbody>
        -                                @foreach ($user->licenses as $license)
        -                                    <tr>
        -                                        <td>{{ $license->name }}</td>
        -                                        <td>
        +      <div class="box-body">
        +        @if (count($userlog) > 0)
        +        <div class="table-responsive">
        +          <table
        +                  class="table table-striped snipe-table"
        +                  name="userActivityReport"
        +                  id="table"
        +                  data-cookie="false"
        +                  data-cookie-id-table="userHistoryTable-{{ config('version.hash_version') }}"
        +                  data-url="{{route('api.activity.index', ['user_id' => $user->id, 'order' => 'desc']) }}">
        +            <thead>
        +            <tr>
        +              <th data-field="icon" style="width: 40px;" class="hidden-xs" data-formatter="iconFormatter"></th>
        +              <th class="col-sm-3" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.date') }}</th>
        +              <th class="col-sm-3" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
        +              <th class="col-sm-3" data-field="action_type">{{ trans('general.action') }}</th>
        +              <th class="col-sm-3" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
        +            </tr>
        +            </thead>
        +            <tbody>
         
        -                                            @can('licenses.keys')
        +          </table>
        +        </div> <!--.table-responsive-->
         
        -                                                {{ mb_strimwidth($license->serial, 0, 50, "...") }}
        -                                            @else
        -                                                ---
        -                                            @endcan
        -                                        </td>
        -                                    </tr>
        -                                @endforeach
        -                                </tbody>
        -                            </table>
        -                        </div>
        -                    @else
        -
        -                        <div class="col-md-12">
        -                            <div class="alert alert-info alert-block">
        -                                <i class="fa fa-info-circle"></i>
        -                                {{ trans('general.no_results') }}
        -                            </div>
        -                        </div>
        -                    @endif
        -                </div>
        +        @else
        +        <div class="col-md-12">
        +            <div class="alert alert-info alert-block">
        +                <i class="fa fa-info-circle"></i>
        +                {{ trans('general.no_results') }}
                     </div>
                 </div>
        -    </div>
        -
        -    <div class="row">
        -        <div class="col-md-12">
        -            <div class="box box-default">
        -
        -                @if ($user->id)
        -                    <div class="box-header with-border">
        -                        <div class="box-heading">
        -                            <h3 class="box-title"> {{ trans('general.consumables') }} </h3>
        -                        </div>
        -                    </div><!-- /.box-header -->
        -                @endif
        -
        -                <div class="box-body">
        -                    <!-- checked out consumables table -->
        -                    @if (count($user->consumables) > 0)
        -                        <div class="table-responsive">
        -                            <table class="table table-striped">
        -                                <thead>
        -                                <tr>
        -                                    <th class="col-md-12">{{ trans('general.name') }}</th>
        -                                </tr>
        -                                </thead>
        -                                <tbody>
        -                                @foreach ($user->consumables as $consumable)
        -                                    <tr>
        -                                        <td>{{ $consumable->name }}</td>
        -                                    </tr>
        -                                @endforeach
        -                                </tbody>
        -                            </table>
        -                        </div>
        -                    @else
        -
        -                        <div class="col-md-12">
        -                            <div class="alert alert-info alert-block">
        -                                <i class="fa fa-info-circle"></i>
        -                                {{ trans('general.no_results') }}
        -                            </div>
        -                        </div>
        -                    @endif
        -
        -                </div>
        -            </div>
        -        </div>
        -    </div>
        -
        -    <div class="row">
        -        <div class="col-md-12">
        -            <div class="box box-default">
        -
        -                @if ($user->id)
        -                    <div class="box-header with-border">
        -                        <div class="box-heading">
        -                            <h3 class="box-title"> {{ trans('general.accessories') }}</h3>
        -                        </div>
        -                    </div><!-- /.box-header -->
        -                @endif
        -
        -                <div class="box-body">
        -                    <!-- checked out licenses table -->
        -                    @if (count($user->accessories) > 0)
        -                        <div class="table-responsive">
        -                            <table class="table table-striped">
        -                                <thead>
        -                                <tr>
        -                                    <th class="col-md-12">Name</th>
        -                                </tr>
        -                                </thead>
        -                                <tbody>
        -                                @foreach ($user->accessories as $accessory)
        -                                    <tr>
        -                                        <td>{{ $accessory->name }}</td>
        -                                    </tr>
        -                                @endforeach
        -                                </tbody>
        -                            </table>
        -                        </div>
        -                    @else
        -
        -                        <div class="col-md-12">
        -                            <div class="alert alert-info alert-block">
        -                                <i class="fa fa-info-circle"></i>
        -                                {{ trans('general.no_results') }}
        -                            </div>
        -                        </div>
        -                    @endif
        -                </div>
        -            </div>
        -        </div>
        -    </div>
        -    <div class="row">
        -        <div class="col-md-12">
        -            <div class="box box-default">
        -
        -                @if ($user->id)
        -                    <div class="box-header with-border">
        -                        <div class="box-heading">
        -                            <h3 class="box-title"> History</h3>
        -                        </div>
        -                    </div><!-- /.box-header -->
        -                @endif
        -
        -                <div class="box-body">
        -                    @if (count($userlog) > 0)
        -                        <div class="table-responsive">
        -                            <table class="table table-striped" id="example">
        -                                <thead>
        -                                <tr>
        -                                    <th class="col-md-1"></th>
        -                                    <th class="col-md-2"><span class="line"></span>{{ trans('table.action') }}</th>
        -                                    <th class="col-md-4"><span class="line"></span>{{ trans('general.asset') }}</th>
        -                                    <th class="col-md-2"><span class="line"></span>{{ trans('table.by') }}</th>
        -                                    <th class="col-md-3">{{ trans('general.date') }}</th>
        -                                </tr>
        -                                </thead>
        -                                <tbody>
        -                                @foreach ($userlog as $log)
        -                                    <tr>
        -                                        <td class="text-center">
        -                                            @if ($log->itemType()=="asset")
        -                                                <i class="fa fa-barcode"></i>
        -                                            @elseif ($log->itemType()=="accessory")
        -                                                <i class="fa fa-keyboard-o"></i>
        -                                            @elseif ($log->itemType()=="consumable")
        -                                                <i class="fa fa-tint"></i>
        -                                            @elseif ($log->itemType()=="license")
        -                                                <i class="fa fa-floppy-o"></i>
        -                                            @else
        -                                                <i class="fa fa-times"></i>
        -                                            @endif
        -
        -                                        </td>
        -                                        <td>
        -                                            {{ strtolower(trans('general.'.str_replace(' ','_',$log->action_type))) }}
        -                                        </td>
        -                                        <td>
        -                                            @if (($log->item) && ($log->itemType()=="asset"))
        -                                                @if ($log->item->deleted_at=='')
        -                                                    {{ $log->item->showAssetName() }}
        -                                                @else
        -                                                    <del>{{ $log->item->showAssetName() }}</del> (deleted)
        -                                                @endif
        -
        -                                            @elseif ($log->item)
        -                                                @if ($log->item->deleted_at=='')
        -                                                    {{ $log->item->name }}
        -                                                @else
        -                                                    <del>{{ $log->item->name }}</del> (deleted)
        -                                                @endif
        -                                            @else
        -                                                {{ trans('general.bad_data') }}
        -                                            @endif
        -
        -                                        </td>
        -                                        <td>
        -                                            @if ($log->user)
        -                                                {{ $log->user->fullName() }}
        -                                            @endif
        -                                        </td>
        -                                        <td>{{ $log->created_at }}</td>
        -                                    </tr>
        -                                @endforeach
        -                                </tbody>
        -                            </table>
        -                        </div>
        -                    @else
        -
        -
        -                        <div class="col-md-12">
        -                            <div class="alert alert-info alert-block">
        -                                <i class="fa fa-info-circle"></i>
        -                                {{ trans('general.no_results') }}
        -                            </div>
        -                        </div>
        -                    @endif
        -                </div>
        -            </div>
        -        </div>
        -    </div>
        +        @endif
        +      </div> <!-- .box-body-->
        +    </div><!--.box.box-default-->
        +  </div> <!-- .col-md-12-->
        +</div> <!-- .row-->
         
         @stop
        +
        +@section('moar_scripts')
        +  @include ('partials.bootstrap-table')
        +@stop
        diff --git a/resources/views/admin/requested-assets.blade.php b/resources/views/admin/requested-assets.blade.php
        index 3c7b568431..f8367e4af0 100644
        --- a/resources/views/admin/requested-assets.blade.php
        +++ b/resources/views/admin/requested-assets.blade.php
        @@ -17,7 +17,6 @@
             <div class="col-md-12">
         
                 @if ($requestedItems->count() > 0)
        -
                 <div class="table-responsive">
                     <table class="table table-striped">
                         <thead>
        @@ -33,9 +32,7 @@
                         </thead>
                         <tbody>
                             @foreach ($requestedItems as $request)
        -
                             <tr>
        -                       
                                 <form action="#" method="POST" accept-charset="utf-8">
                                     {{ csrf_field() }}
                                     <td>{{ $request->itemType() }}</td>
        @@ -53,7 +50,7 @@
                                         "N/A"
                                     @endif
                                     </td>
        -                            <td>{{ $request->requestingUser()->fullName() }}</td>
        +                            <td>{{ $request->requestingUser()->present()->fullName() }}</td>
                                     <td>{{$request->created_at}}</td>
                                     <td>
                                     </td>
        @@ -64,7 +61,6 @@
                     </table>
                 </div>
         
        -
                 @else
                 <div class="col-md-12">
                     <div class="alert alert-info alert-block">
        @@ -72,13 +68,7 @@
                         {{ trans('general.no_results') }}
                     </div>
                 </div>
        -
        -
                 @endif
        -    </div>
             </div> <!-- .col-md-12> -->
         </div> <!-- .row -->
        -
        -
        -
         @stop
        diff --git a/resources/views/asset_maintenances/edit.blade.php b/resources/views/asset_maintenances/edit.blade.php
        index 04280be472..df7737c0fd 100644
        --- a/resources/views/asset_maintenances/edit.blade.php
        +++ b/resources/views/asset_maintenances/edit.blade.php
        @@ -2,12 +2,12 @@
         
         {{-- Page title --}}
         @section('title')
        -    @if ($item->id)
        -        {{ trans('admin/asset_maintenances/form.update') }}
        -    @else
        -        {{ trans('admin/asset_maintenances/form.create') }}
        -    @endif
        -    @parent
        +  @if ($item->id)
        +    {{ trans('admin/asset_maintenances/form.update') }}
        +  @else
        +    {{ trans('admin/asset_maintenances/form.create') }}
        +  @endif
        +  @parent
         @stop
         
         
        @@ -20,109 +20,117 @@
         {{-- Page content --}}
         @section('content')
         
        -
        -
         <div class="row">
           <div class="col-md-9">
        -    <form class="form-horizontal" method="post" action="" autocomplete="off">
        +    @if ($item->id)
        +      <form class="form-horizontal" method="post" action="{{ route('maintenances.update', $item->id) }}" autocomplete="off">
        +      {{ method_field('PUT') }}
        +    @else
        +      <form class="form-horizontal" method="post" action="{{ route('maintenances.store') }}" autocomplete="off">
        +    @endif
             <!-- CSRF Token -->
        -    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +    {{ csrf_field() }}
         
             <div class="box box-default">
               <div class="box-header with-border">
        -
                 <h3 class="box-title">
                   @if ($item)
                   {{ $item->name }}
                   @endif
        -      </h3>
        +        </h3>
               </div><!-- /.box-header -->
        -        <div class="box-body">
         
        -          <!-- Asset -->
        -          <div class="form-group {{ $errors->has('asset_id') ? ' has-error' : '' }}">
        -              <label for="asset_id" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/table.asset_name') }}
        -                 </label>
        -              <div class="col-md-7{{  (\App\Helpers\Helper::checkIfRequired($item, 'asset_id')) ? ' required' : '' }}">
        -                  @if ($selectedAsset == null)
        -                      {{ Form::select('asset_id', $asset_list , Input::old('asset_id', $item->asset_id), ['class'=>'select2', 'style'=>'min-width:350px']) }}
        -                  @else
        -                      {{ Form::select('asset_id', $asset_list , Input::old('asset_id', $selectedAsset), ['class'=>'select2', 'style'=>'min-width:350px', 'enabled' => 'false']) }}
        -                  @endif
        -                  {!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        +      <div class="box-body">
        +        <!-- Asset -->
        +        <div class="form-group {{ $errors->has('asset_id') ? ' has-error' : '' }}">
        +          <label for="asset_id" class="col-md-3 control-label">
        +            {{ trans('admin/asset_maintenances/table.asset_name') }}
        +          </label>
        +          <div class="col-md-7{{  (\App\Helpers\Helper::checkIfRequired($item, 'asset_id')) ? ' required' : '' }}">
        +            @if ($selectedAsset == null)
        +            {{ Form::select('asset_id', $asset_list , Input::old('asset_id', $item->asset_id), ['class'=>'select2', 'style'=>'min-width:350px']) }}
        +            @else
        +            {{ Form::select('asset_id', $asset_list , Input::old('asset_id', $selectedAsset), ['class'=>'select2', 'style'=>'min-width:350px', 'enabled' => 'false']) }}
        +            @endif
        +            {!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                   </div>
        +        </div> <!-- .form-group -->
         
        -           @include ('partials.forms.edit.supplier')
        -           @include ('partials.forms.edit.maintenance_type')
        +        @include ('partials.forms.edit.supplier')
        +        @include ('partials.forms.edit.maintenance_type')
         
        -
        -
        -          <!-- Title -->
        -          <div class="form-group {{ $errors->has('title') ? ' has-error' : '' }}">
        -              <label for="title" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.title') }}
        -                  </label>
        -              </label>
        -              <div class="col-md-7{{  (\App\Helpers\Helper::checkIfRequired($item, 'title')) ? ' required' : '' }}">
        -                  <input class="form-control" type="text" name="title" id="title" value="{{ Input::old('title', $item->title) }}" />
        -                  {!! $errors->first('title', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        +        <!-- Title -->
        +        <div class="form-group {{ $errors->has('title') ? ' has-error' : '' }}">
        +          <label for="title" class="col-md-3 control-label">
        +            {{ trans('admin/asset_maintenances/form.title') }}
        +          </label>
        +          <div class="col-md-7{{  (\App\Helpers\Helper::checkIfRequired($item, 'title')) ? ' required' : '' }}">
        +            <input class="form-control" type="text" name="title" id="title" value="{{ Input::old('title', $item->title) }}" />
        +            {!! $errors->first('title', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                   </div>
        -
        -          <!-- Start Date -->
        -          <div class="form-group {{ $errors->has('start_date') ? ' has-error' : '' }}">
        -              <label for="start_date" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.start_date') }}
        -                  </label>
        -              <div class="input-group col-md-2{{  (\App\Helpers\Helper::checkIfRequired($item, 'start_date')) ? ' required' : '' }}">
        -                  <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="Select Date" name="start_date" id="start_date" value="{{ Input::old('start_date', $item->start_date) }}">
        -                  <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -                  {!! $errors->first('start_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        -          </div>
        -
        -          <!-- Completion Date -->
        -          <div class="form-group {{ $errors->has('completion_date') ? ' has-error' : '' }}">
        -              <label for="start_date" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.completion_date') }}</label>
        -              <div class="input-group col-md-2">
        -                  <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="Select Date" name="completion_date" id="completion_date" value="{{ Input::old('completion_date', $item->completion_date) }}">
        -                  <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -                  {!! $errors->first('completion_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        -          </div>
        -
        -          <!-- Warranty -->
        -          <div class="form-group">
        -              <div class="col-sm-offset-3 col-sm-9">
        -                  <div class="checkbox">
        -                      <label>
        -                          <input type="checkbox" value="1" name="is_warranty" id="is_warranty" {{ Input::old('is_warranty', $item->is_warranty) == '1' ? ' checked="checked"' : '' }}> {{ trans('admin/asset_maintenances/form.is_warranty') }}
        -                      </label>
        -                  </div>
        -              </div>
        -          </div>
        -
        -          <!-- Asset Maintenance Cost -->
        -          <div class="form-group {{ $errors->has('cost') ? ' has-error' : '' }}">
        -              <label for="cost" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.cost') }}</label>
        -              <div class="col-md-2">
        -                  <div class="input-group">
        -                      <span class="input-group-addon">{{ $snipeSettings->default_currency }}</span>
        -                      <input class="col-md-2 form-control" type="text" name="cost" id="cost" value="{{ Input::old('cost', \App\Helpers\Helper::formatCurrencyOutput($item->cost)) }}" />
        -                      {!! $errors->first('cost', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                  </div>
        -              </div>
        -          </div>
        -
        -          <!-- Notes -->
        -          <div class="form-group {{ $errors->has('notes') ? ' has-error' : '' }}">
        -              <label for="notes" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.notes') }}</label>
        -              <div class="col-md-7">
        -                  <textarea class="col-md-6 form-control" id="notes" name="notes">{{ Input::old('notes', $item->notes) }}</textarea>
        -                  {!! $errors->first('notes', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        -          </div>
        -
                 </div>
        +
        +        <!-- Start Date -->
        +        <div class="form-group {{ $errors->has('start_date') ? ' has-error' : '' }}">
        +          <label for="start_date" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.start_date') }}</label>
        +
        +          <div class="input-group col-md-3{{  (\App\Helpers\Helper::checkIfRequired($item, 'start_date')) ? ' required' : '' }}">
        +            <div class="input-group date" data-provide="datepicker" data-date-format="yyyy-mm-dd"  data-autoclose="true">
        +              <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="start_date" id="start_date" value="{{ Input::old('start_date', $item->start_date) }}">
        +              <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +            </div>
        +            {!! $errors->first('start_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +          </div>
        +        </div>
        +
        +
        +
        +        <!-- Completion Date -->
        +        <div class="form-group {{ $errors->has('completion_date') ? ' has-error' : '' }}">
        +          <label for="start_date" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.completion_date') }}</label>
        +
        +          <div class="input-group col-md-3{{  (\App\Helpers\Helper::checkIfRequired($item, 'completion_date')) ? ' required' : '' }}">
        +            <div class="input-group date" data-provide="datepicker" data-date-format="yyyy-mm-dd"  data-autoclose="true">
        +              <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="completion_date" id="completion_date" value="{{ Input::old('completion_date', $item->completion_date) }}">
        +              <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +            </div>
        +            {!! $errors->first('completion_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +          </div>
        +        </div>
        +
        +        <!-- Warranty -->
        +        <div class="form-group">
        +          <div class="col-sm-offset-3 col-sm-9">
        +            <div class="checkbox">
        +              <label>
        +                <input type="checkbox" value="1" name="is_warranty" id="is_warranty" {{ Input::old('is_warranty', $item->is_warranty) == '1' ? ' checked="checked"' : '' }}> {{ trans('admin/asset_maintenances/form.is_warranty') }}
        +              </label>
        +            </div>
        +          </div>
        +        </div>
        +
        +        <!-- Asset Maintenance Cost -->
        +        <div class="form-group {{ $errors->has('cost') ? ' has-error' : '' }}">
        +          <label for="cost" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.cost') }}</label>
        +          <div class="col-md-2">
        +            <div class="input-group">
        +              <span class="input-group-addon">{{ $snipeSettings->default_currency }}</span>
        +              <input class="col-md-2 form-control" type="text" name="cost" id="cost" value="{{ Input::old('cost', \App\Helpers\Helper::formatCurrencyOutput($item->cost)) }}" />
        +              {!! $errors->first('cost', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
        +        </div>
        +
        +        <!-- Notes -->
        +        <div class="form-group {{ $errors->has('notes') ? ' has-error' : '' }}">
        +          <label for="notes" class="col-md-3 control-label">{{ trans('admin/asset_maintenances/form.notes') }}</label>
        +          <div class="col-md-7">
        +            <textarea class="col-md-6 form-control" id="notes" name="notes">{{ Input::old('notes', $item->notes) }}</textarea>
        +            {!! $errors->first('notes', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +          </div>
        +        </div>
        +      </div> <!-- .box-body -->
        +
               <div class="box-footer text-right">
                 <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
               </div>
        diff --git a/resources/views/asset_maintenances/index.blade.php b/resources/views/asset_maintenances/index.blade.php
        index e63daf7fb2..4b604f2b0a 100644
        --- a/resources/views/asset_maintenances/index.blade.php
        +++ b/resources/views/asset_maintenances/index.blade.php
        @@ -2,63 +2,80 @@
         
         {{-- Page title --}}
         @section('title')
        -{{ trans('admin/asset_maintenances/general.asset_maintenances') }}
        -@parent
        +  {{ trans('admin/asset_maintenances/general.asset_maintenances') }}
        +  @parent
         @stop
         
         
         @section('header_right')
        -  @can('assets.edit')
        -<a href="{{ route('create/asset_maintenances') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        +  @can('update', \App\Models\Asset::class)
        +    <a href="{{ route('maintenances.create') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
           @endcan
         @stop
         
        -
         {{-- Page content --}}
         @section('content')
         
        -
        -
         <div class="row">
           <div class="col-md-12">
        -
             <div class="box box-default">
        -        <div class="box-body">
        -
        -          <table
        +      <div class="box-body">
        +        <table
                   name="maintenances"
                   id="table"
                   class="table table-striped snipe-table"
        -          data-url="{{route('api.asset_maintenances.list') }}"
        +          data-url="{{route('api.maintenances.index') }}"
                   data-cookie="true"
                   data-click-to-select="true"
        -          data-cookie-id-table="maintenancesTable-{{ config('version.hash_version') }}">
        -            <thead>
        -              <tr>
        -              <th data-field="companyName" data-sortable="false" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
        +          data-cookie-id-table="maintenancesTable-{{ config('version.hash_version') }}"
        +        >
        +          <thead>
        +            <tr>
        +              <th data-field="company" data-sortable="false" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
                       <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -              <th data-sortable="false" data-field="asset_name">{{ trans('admin/asset_maintenances/table.asset_name') }}</th>
        -              <th data-sortable="false" data-field="supplier">{{ trans('general.supplier') }}</th>
        +              <th data-sortable="false" data-field="asset_name" data-formatter="hardwareLinkObjFormatter">{{ trans('admin/asset_maintenances/table.asset_name') }}</th>
        +              <th data-sortable="false" data-field="supplier" data-formatter="suppliersLinkObjFormatter">{{ trans('general.supplier') }}</th>
                       <th data-searchable="true" data-sortable="true" data-field="asset_maintenance_type">{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}</th>
                       <th data-searchable="true" data-sortable="true" data-field="title">{{ trans('admin/asset_maintenances/form.title') }}</th>
        -              <th data-searchable="true" data-sortable="false" data-field="start_date">{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        -              <th data-searchable="true" data-sortable="true" data-field="completion_date">{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
        +              <th data-searchable="true" data-sortable="false" data-field="start_date" data-formatter="dateDisplayFormatter">{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        +              <th data-searchable="true" data-sortable="true" data-field="completion_date" data-formatter="dateDisplayFormatter">{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
                       <th data-searchable="true" data-sortable="true" data-field="asset_maintenance_time">{{ trans('admin/asset_maintenances/form.asset_maintenance_time') }}</th>
                       <th data-searchable="true" data-sortable="true" data-field="cost" class="text-right">{{ trans('admin/asset_maintenances/form.cost') }}</th>
        -              <th data-searchable="true" data-sortable="true" data-field="user_id">{{ trans('general.admin') }}</th>
        +              <th data-searchable="true" data-sortable="true" data-field="user_id" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
                       <th data-searchable="true" data-sortable="true" data-field="notes" data-visible="false">{{ trans('admin/asset_maintenances/form.notes') }}</th>
        -                @can('assets.edit')
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +              @can('update', \App\Models\Asset::class)
        +                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" data-formatter="maintenanceActions">{{ trans('table.actions') }}</th>
                       @endcan
        -              </tr>
        -            </thead>
        -          </table>
        +            </tr>
        +          </thead>
        +        </table>
         
        -        </div>
        +      </div>
             </div>
           </div>
        +</div>
         @stop
         
         @section('moar_scripts')
         @include ('partials.bootstrap-table', ['exportFile' => 'maintenances-export', 'search' => true])
        +<script>
        +    function maintenanceActions(value, row) {
        +        var actions = '<nobr>';
        +        if ((row) && (row.available_actions.update === true)) {
        +            actions += '<a href="{{ url('/') }}/hardware/maintenances/' + row.id + '/edit" class="btn btn-sm btn-warning" data-tooltip="true" title="Update"><i class="fa fa-pencil"></i></a>&nbsp;';
        +        }
        +        actions += '</nobr>'
        +        if ((row) && (row.available_actions.delete === true)) {
        +            actions += '<a href="{{ url('/') }}/hardware/maintenances/' + row.id + '" '
        +                + ' class="btn btn-danger btn-sm delete-asset"  data-tooltip="true"  '
        +                + ' data-toggle="modal" '
        +                + ' data-content="{{ trans('general.sure_to_delete') }} ' + row.name + '?" '
        +                + ' data-title="{{  trans('general.delete') }}" onClick="return false;">'
        +                + '<i class="fa fa-trash"></i></a></nobr>';
        +        }
        +
        +        return actions;
        +    }
        +
        +</script>
         @stop
        diff --git a/resources/views/asset_maintenances/view.blade.php b/resources/views/asset_maintenances/view.blade.php
        index 33b5419947..9cef1c9d97 100644
        --- a/resources/views/asset_maintenances/view.blade.php
        +++ b/resources/views/asset_maintenances/view.blade.php
        @@ -5,99 +5,99 @@ use Carbon\Carbon;
         
         {{-- Page title --}}
         @section('title')
        -    {{ trans('admin/asset_maintenances/general.view') }} {{ $assetMaintenance->title }} 
        -    @parent
        +{{ trans('admin/asset_maintenances/general.view') }} {{ $assetMaintenance->title }}
        +@parent
         @stop
         
         {{-- Page content --}}
         @section('content')
        -    <div class="row header">
        -        <div class="col-md-12">
        -            <h3 class="title">
        -                {{ trans('admin/asset_maintenances/general.view') }}
        -                {{ " - " . $assetMaintenance->title }}
        -            </h3>
        +<div class="row header">
        +  <div class="col-md-12">
        +    <h3 class="title">
        +      {{ trans('admin/asset_maintenances/general.view') }}
        +      {{ " - " . $assetMaintenance->title }}
        +    </h3>
         
        -            <div class="btn-group pull-right">
        -
        -                <div class="dropdown">
        -                    <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        -                        <span class="caret"></span>
        -                    </button>
        -                    <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
        -                        <li role="presentation"><a href="{{ route('update/asset_maintenance', $assetMaintenance->id) }}">{{ trans('admin/asset_maintenances/general.edit') }}</a></li>
        -                    </ul>
        -                </div>
        -            </div>
        -        </div>
        +    <div class="btn-group pull-right">
        +      <div class="dropdown">
        +        <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        +          <span class="caret"></span>
        +        </button>
        +        <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
        +          <li role="presentation"><a href="{{ route('maintenances.update', $assetMaintenance->id) }}">{{ trans('admin/asset_maintenances/general.edit') }}</a></li>
        +        </ul>
        +      </div>
             </div>
        +  </div>
        +</div>
         
        -    <div class="user-profile ">
        -        <div class="row profile">
        -            <div class="col-md-9 bio">
        -                <!-- 1st Row Begin -->
        -                <div class="row">
        -                    <div class="col-md-12 col-sm-12" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}: </strong>
        -                        {{ $assetMaintenance->asset_maintenance_type }}
        -                    </div>
        -                </div>
        -                <!-- 1st Row End -->
        -                <!-- 2nd Row Begin -->
        -                <div class="row">
        -                    <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/table.asset_name') }}: </strong>
        -                        <a href="{{ route('view/hardware', $assetMaintenance->asset_id) }}">
        -                            {{ $assetMaintenance->asset->name }}
        -                        </a>
        -                    </div>
        -                    <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('general.supplier') }}: </strong>
        -                        <a href="{{ route('view/supplier', $assetMaintenance->supplier_id) }}">
        -                            {{ $assetMaintenance->supplier->name }}
        -                        </a>
        -                    </div>
        -                </div>
        -                <!-- 2nd Row End -->
        -                <!-- 3rd Row Begin -->
        -                <div class="row">
        -                    <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/form.start_date') }}: </strong>
        -                        <?php $startDate = Carbon::parse($assetMaintenance->start_date); ?>
        -                        {{ $startDate->toDateString() }}
        -                    </div>
        -                    <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/form.completion_date') }}: </strong>
        -			{{ $completionDate = $assetMaintenance->completion_date }}
        -                        {{ $completionDate ? $completionDate : trans('admin/asset_maintenances/message.asset_maintenance_incomplete') }}
        -                    </div>
        -                    <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/form.asset_maintenance_time') }}: </strong>
        -                        {{ $assetMaintenance->asset_maintenance_time }}
        -                    </div>
        -                </div>
        -                <!-- 3rd Row End -->
        -                <!-- 4th Row Begin -->
        -                <div class="row">
        -                    <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/form.cost') }}: </strong>
        -                        {{ sprintf( trans( 'general.currency' ) . '%01.2f', $assetMaintenance->cost) }}
        -                    </div>
        -                    <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/form.is_warranty') }}: </strong>
        -                        {{ $assetMaintenance->is_warranty ? trans('admin/asset_maintenances/message.warranty') : trans('admin/asset_maintenances/message.not_warranty') }}
        -                    </div>
        -                </div>
        -                <!-- 4th Row End -->
        -                <!-- 5th Row Begin -->
        -                <div class="row">
        -                    <div class="col-md-12 col-sm-12" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        -                        <strong>{{ trans('admin/asset_maintenances/form.notes') }}: </strong>
        -                        {{ $assetMaintenance->notes }}
        -                    </div>
        -                </div>
        -                <!-- 5th Row End -->
        -            </div> <!-- col-md-9 bio end -->
        -        </div> <!-- row profile end -->
        -    </div> <!-- user-profile end -->
        +<div class="user-profile ">
        +  <div class="row profile">
        +    <div class="col-md-9 bio">
        +      <!-- 1st Row Begin -->
        +      <div class="row">
        +        <div class="col-md-12 col-sm-12" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}: </strong>
        +          {{ $assetMaintenance->asset_maintenance_type }}
        +        </div>
        +      </div>
        +      <!-- 1st Row End -->
        +
        +      <!-- 2nd Row Begin -->
        +      <div class="row">
        +        <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/table.asset_name') }}: </strong>
        +          <a href="{{ route('hardware.show', $assetMaintenance->asset_id) }}">
        +            {{ $assetMaintenance->asset->name }}
        +          </a>
        +        </div>
        +        <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('general.supplier') }}: </strong>
        +          <a href="{{ route('suppliers.show', $assetMaintenance->supplier_id) }}">
        +            {{ $assetMaintenance->supplier->name }}
        +          </a>
        +        </div>
        +      </div>
        +      <!-- 2nd Row End -->
        +      <!-- 3rd Row Begin -->
        +      <div class="row">
        +        <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/form.start_date') }}: </strong>
        +            <?php $startDate = Carbon::parse($assetMaintenance->start_date); ?>
        +          {{ $startDate->toDateString() }}
        +        </div>
        +        <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/form.completion_date') }}: </strong>
        +          {{ $completionDate = $assetMaintenance->completion_date }}
        +          {{ $completionDate ? $completionDate : trans('admin/asset_maintenances/message.asset_maintenance_incomplete') }}
        +        </div>
        +        <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/form.asset_maintenance_time') }}: </strong>
        +          {{ $assetMaintenance->asset_maintenance_time }}
        +        </div>
        +      </div>
        +      <!-- 3rd Row End -->
        +      <!-- 4th Row Begin -->
        +      <div class="row">
        +        <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/form.cost') }}: </strong>
        +          {{ sprintf( trans( 'general.currency' ) . '%01.2f', $assetMaintenance->cost) }}
        +        </div>
        +        <div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/form.is_warranty') }}: </strong>
        +          {{ $assetMaintenance->is_warranty ? trans('admin/asset_maintenances/message.warranty') : trans('admin/asset_maintenances/message.not_warranty') }}
        +        </div>
        +      </div>
        +      <!-- 4th Row End -->
        +      <!-- 5th Row Begin -->
        +      <div class="row">
        +        <div class="col-md-12 col-sm-12" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
        +          <strong>{{ trans('admin/asset_maintenances/form.notes') }}: </strong>
        +          {{ $assetMaintenance->notes }}
        +        </div>
        +      </div>
        +      <!-- 5th Row End -->
        +    </div> <!-- col-md-9 bio end -->
        +  </div> <!-- row profile end -->
        +</div> <!-- user-profile end -->
         @stop
        diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
        index 39881a0a61..8e734fd453 100755
        --- a/resources/views/auth/login.blade.php
        +++ b/resources/views/auth/login.blade.php
        @@ -21,6 +21,13 @@
                                 <div class="login-box-body">
                                     <div class="row">
         
        +                                @if ($snipeSettings->login_note)
        +                                    <div class="col-md-12">
        +                                        <div class="alert alert-info">
        +                                            {!!  Parsedown::instance()->text(e($snipeSettings->login_note))  !!}
        +                                        </div>
        +                                    </div>
        +                                @endif
         
                                         <!-- Notifications -->
                                         @include('notifications')
        @@ -52,7 +59,7 @@
                                     <button class="btn btn-lg btn-primary btn-block">{{ trans('auth/general.login')  }}</button>
                                 </div>
                                 <div class="col-md-12 col-sm-12 col-xs-12 text-right" style="padding-top: 10px;">
        -                            <a href="{{ config('app.url') }}/password/reset">{{ trans('auth/general.forgot_password')  }}</a>
        +                            <a href="{{ url('/') }}/password/reset">{{ trans('auth/general.forgot_password')  }}</a>
                                 </div>
                             </div> <!-- end login box -->
         
        diff --git a/resources/views/categories/edit.blade.php b/resources/views/categories/edit.blade.php
        index a4187de7a3..6371db1950 100755
        --- a/resources/views/categories/edit.blade.php
        +++ b/resources/views/categories/edit.blade.php
        @@ -2,12 +2,13 @@
             'createText' => trans('admin/categories/general.create') ,
             'updateText' => trans('admin/categories/general.update'),
             'helpTitle' =>  trans('admin/categories/general.about_categories_title'),
        -    'helpText' => trans('admin/categories/general.about_categories')
        +    'helpText' => trans('admin/categories/general.about_categories'),
        +    'formAction' => ($item) ? route('categories.update', ['category' => $item->id]) : route('categories.store'),
         ])
         
         @section('inputFields')
         
        -@include ('partials.forms.edit.name', ['translated_name' => trans('admin/categories/general.category_name')])
        +@include ('partials.forms.edit.name', ['translated_name' => trans('admin/categories/general.name')])
         
         <!-- Type -->
         <div class="form-group {{ $errors->has('category_type') ? ' has-error' : '' }}">
        @@ -64,6 +65,7 @@
         
         @section('content')
         @parent
        +
         @if ($snipeSettings->default_eula_text!='')
         <!-- Modal -->
         <div class="modal fade" id="eulaModal" tabindex="-1" role="dialog" aria-labelledby="eulaModalLabel" aria-hidden="true">
        @@ -83,4 +85,4 @@
             </div>
         </div>
         @endif
        -@stop
        \ No newline at end of file
        +@stop
        diff --git a/resources/views/categories/index.blade.php b/resources/views/categories/index.blade.php
        index 51372248c5..9302cf172f 100755
        --- a/resources/views/categories/index.blade.php
        +++ b/resources/views/categories/index.blade.php
        @@ -8,52 +8,41 @@
         
         
         @section('header_right')
        -<a href="{{ route('create/category') }}" class="btn btn-primary pull-right">
        +<a href="{{ route('categories.create') }}" class="btn btn-primary pull-right">
           {{ trans('general.create') }}</a>
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -
         <div class="row">
           <div class="col-md-12">
             <div class="box box-default">
               <div class="box-body">
                 <div class="table-responsive">
        -
                   <table
        -          class="table table-striped snipe-table"
        -          name="categories"
        -          id="table"
        -          data-url="{{route('api.categories.list') }}"
        -          data-cookie="true"
        -          data-click-to-select="true"
        -          data-cookie-id-table="categoriesTable-{{ config('version.hash_version') }}">
        -            <thead>
        -              <tr>
        -                <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                <th data-sortable="true" data-field="name">{{ trans('admin/categories/table.title') }}</th>
        -                <th data-sortable="true" data-field="category_type">{{ trans('general.type') }}</th>
        -                <th data-searchable="false" data-sortable="false" data-field="count">{{ trans('general.assets') }}</th>
        -                <th data-searchable="false" data-sortable="true" data-field="acceptance">{{ trans('admin/categories/table.require_acceptance') }}</th>
        -                <th data-searchable="false" data-sortable="true" data-field="eula">{{ trans('admin/categories/table.eula_text') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        -              </tr>
        -            </thead>
        -          </table>
        +            class="table table-striped snipe-table"
        +            name="categories"
        +            id="table"
        +            data-url="{{route('api.categories.index') }}"
        +            data-cookie="true"
        +            data-click-to-select="true"
        +            data-cookie-id-table="categoriesTable-{{ config('version.hash_version') }}">
         
        -      </div>
        +          </table>
        +        </div>
               </div><!-- /.box-body -->
             </div><!-- /.box -->
        -
        -
           </div>
         </div>
         
         @stop
         
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'categories-export', 'search' => true])
        +  @include ('partials.bootstrap-table',
        +      ['exportFile' => 'category-export',
        +      'search' => true,
        +      'columns' => \App\Presenters\CategoryPresenter::dataTableLayout()
        +  ])
         @stop
         
        diff --git a/resources/views/categories/view.blade.php b/resources/views/categories/view.blade.php
        index a0011dae16..9763b0ab8e 100644
        --- a/resources/views/categories/view.blade.php
        +++ b/resources/views/categories/view.blade.php
        @@ -4,64 +4,73 @@
         @section('title')
         
          {{ $category->name }}
        - {{ trans('general.assets') }}
        + {{ ucwords($category_type_route) }}
        +
         @parent
         @stop
         
         @section('header_right')
         <div class="btn-group pull-right">
        -   <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        -        <span class="caret"></span>
        -    </button>
        -    <ul class="dropdown-menu">
        -            <li><a href="{{ route('update/category', $category->id) }}">{{ trans('admin/categories/general.edit') }}</a></li>
        -            <li><a href="{{ route('create/category') }}">{{ trans('general.create') }}</a></li>
        -    </ul>
        +  <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        +    <span class="caret"></span>
        +  </button>
        +  <ul class="dropdown-menu">
        +    <li><a href="{{ route('categories.edit', ['category' => $category->id]) }}">{{ trans('admin/categories/general.edit') }}</a></li>
        +    <li><a href="{{ route('categories.create') }}">{{ trans('general.create') }}</a></li>
        +  </ul>
         </div>
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -
        -  <div class="row">
        -    <div class="col-md-12">
        -      <div class="box box-default">
        -        <div class="box-body">
        -
        -
        -          <table
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +      <div class="box-body">
        +        <table
                   name="category_assets"
                   class="snipe-table"
                   id="table"
        -          data-url="{{ route('api.categories.'.$category->category_type.'.view', [$category->id, $category->category_type]) }}"
        +          data-url="{{ route('api.'.$category_type_route.'.index',['category_id'=> $category->id]) }}"
                   data-cookie="true"
                   data-click-to-select="true"
        -          data-cookie-id-table="categoryAssetsTable">
        -              <thead>
        -                  <tr>
        -                      <th data-searchable="false" data-sortable="false" data-field="companyName" data-visible="false">
        -                          {{ trans('admin/companies/table.title') }}
        -                      </th>
        -                      <th data-searchable="false" data-sortable="false" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                      <th data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.name') }}</th>
        -                      @if ($category->category_type=='asset')
        -                      <th data-searchable="false" data-sortable="false" data-field="model">{{ trans('admin/hardware/form.model') }}</th>
        -                      <th data-searchable="false" data-sortable="false" data-field="asset_tag">{{ trans('general.asset_tag') }}</th>
        -                      <th data-searchable="false" data-sortable="false" data-field="serial">{{ trans('admin/hardware/form.serial') }}</th>
        -                      <th data-searchable="false" data-sortable="false" data-field="assigned_to">{{ trans('general.user') }}</th>
        -                      <th data-searchable="false" data-sortable="false" data-field="change"  data-switchable="false">{{ trans('admin/hardware/table.change') }}</th>
        -                      @endif
        -                      <th data-searchable="false" data-sortable="false" data-field="actions"  data-switchable="false">{{ trans('table.actions') }}</th>
        -                  </tr>
        -              </thead>
        -          </table>
        -        </div>
        +          data-cookie-id-table="category{{ $category_type_route }}Table">
        +      </table>
        +
               </div>
             </div>
        -
        -@stop    
        +  </div>
        +</div>
        +@stop
         
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'category-' . $category->name . '-export', 'search' => false])
        +
        +  @if ($category->category_type=='asset')
        +    @include ('partials.bootstrap-table',
        +    [
        +      'exportFile' => 'category-' . $category->name . '-export',
        +      'search' => true,
        +      'columns' => \App\Presenters\AssetPresenter::dataTableLayout()])
        +  @elseif ($category->category_type=='accessory')
        +    @include ('partials.bootstrap-table',
        +    [
        +      'exportFile' => 'category-' . $category->name . '-export',
        +      'search' => true,
        +      'columns' => \App\Presenters\AccessoryPresenter::dataTableLayout()])
        +  @elseif ($category->category_type=='consumable')
        +    @include ('partials.bootstrap-table',
        +    [
        +      'exportFile' => 'category-' . $category->name . '-export',
        +      'search' => true,
        +      'columns' => \App\Presenters\ConsumablePresenter::dataTableLayout()])
        +  @elseif ($category->category_type=='component')
        +    @include ('partials.bootstrap-table',
        +    [
        +      'exportFile' => 'category-' . $category->name . '-export',
        +      'search' => true,
        +      'columns' => \App\Presenters\ComponentPresenter::dataTableLayout()])
        +    @endif
        +
        +
         @stop
        diff --git a/resources/views/companies/edit.blade.php b/resources/views/companies/edit.blade.php
        index 32dd7eea21..daa3eba9e8 100644
        --- a/resources/views/companies/edit.blade.php
        +++ b/resources/views/companies/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/companies/table.create') ,
             'updateText' => trans('admin/companies/table.update'),
             'helpTitle' => trans('admin/companies/general.about_companies_title'),
        -    'helpText' => trans('admin/companies/general.about_companies_text')
        +    'helpText' => trans('admin/companies/general.about_companies_text'),
        +    'formAction' => ($item) ? route('companies.update', ['company' => $item->id]) : route('companies.store'),
         ])
         
         {{-- Page content --}}
        diff --git a/resources/views/companies/index.blade.php b/resources/views/companies/index.blade.php
        index 76529b6303..37f0653f3e 100644
        --- a/resources/views/companies/index.blade.php
        +++ b/resources/views/companies/index.blade.php
        @@ -2,72 +2,49 @@
         
         {{-- Page title --}}
         @section('title')
        -{{ trans('admin/companies/table.companies') }}
        -@parent
        +  {{ trans('general.companies') }}
        +  @parent
         @stop
         
         @section('header_right')
        -<a href="{{ route('create/company') }}" class="btn btn-primary pull-right">
        -  {{ trans('general.create') }}</a>
        +  <a href="{{ route('companies.create') }}" class="btn btn-primary pull-right">
        +    {{ trans('general.create') }}</a>
         @stop
        -
         {{-- Page content --}}
         @section('content')
        -
        -
        -<div class="row">
        -  <div class="col-md-9">
        -    <div class="box box-default">
        -      <div class="box-body">
        -        <div class="table-responsive">
        -          <table class="table table-striped" name="companies">
        -            <thead>
        -              <tr>
        -                <th class="col-md-1">{{ trans('general.id') }}</th>
        -                <th class="col-md-9">{{ trans('admin/companies/table.name') }}</th>
        -                <th class="col-md-2">{{ trans('table.actions') }}</th>
        -              </tr>
        -              @foreach ($companies as $company)
        -                <tr>
        -                  <td>{{ $company->id }}</td>
        -                  <td>{{ $company->name }}</td>
        -                  <td>
        -                    <form method="POST" action="{{ route('delete/company', $company->id) }}" role="form">
        -
        -                      <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -                      <a href="{{ route('update/company', $company->id) }}" class="btn btn-sm btn-warning"
        -                         title="{{ trans('button.edit') }}">
        -                        <i class="fa fa-pencil icon-white"></i>
        -                      </a>
        -
        -                      <button type="submit" class="btn btn-sm btn-danger" title="{{ trans('button.delete') }}">
        -                        <i class="fa fa-trash icon-white"></i>
        -                      </button>
        -
        -                    </form>
        -                  </td>
        -                </tr>
        -              @endforeach
        -            </thead>
        -
        -            <tbody>
        -            </tbody>
        -          </table>
        -        </div><!-- /.box-body -->
        -      </div><!-- /.box -->
        -  </div>
        -</div>
        -
        +  <div class="row">
        +    <div class="col-md-9">
        +      <div class="box box-default">
        +        <div class="box-body">
        +          <div class="table-responsive">
        +            <table
        +                    name="companies"
        +                    class="table table-striped snipe-table"
        +                    id="table"
        +                    data-url="{{ route('api.companies.index') }}"
        +                    data-cookie="true"
        +                    data-click-to-select="true"
        +                    data-cookie-id-table="companiesTable-{{ config('version.hash_version') }}">
        +            </table>
        +          </div>
        +        </div>
        +      </div>
        +    </div>
             <!-- side address column -->
             <div class="col-md-3">
               <h4>About Companies</h4>
               <p>
        -        You can use companies as a simple placeholder, or you can use them to restrict asset visibility and availability to users with a specific company.
        +        You can use companies as a simple informative field, or you can use them to restrict asset visibility and availability to users with a specific company by enabling Full Company Support in your Admin Settings.
               </p>
        -
        -    </div>
           </div>
        -</div>
        +
        +@stop
        +
        +@section('moar_scripts')
        +  @include ('partials.bootstrap-table', [
        +      'exportFile' => 'companies-export',
        +      'search' => true,
        +      'columns' => \App\Presenters\CompanyPresenter::dataTableLayout()
        +  ])
         
         @stop
        diff --git a/resources/views/companies/view.blade.php b/resources/views/companies/view.blade.php
        new file mode 100644
        index 0000000000..0c14b3f174
        --- /dev/null
        +++ b/resources/views/companies/view.blade.php
        @@ -0,0 +1,155 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    {{ $company->name }}
        +    @parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <div class="row">
        +        <div class="col-md-12">
        +            <div class="nav-tabs-custom">
        +                <ul class="nav nav-tabs">
        +
        +
        +                    <li class="active">
        +                        <a href="#asset_tab" data-toggle="tab">
        +                            <span class="hidden-lg hidden-md">
        +                            <i class="fa fa-barcode"></i>
        +                            </span>
        +                            <span class="hidden-xs hidden-sm">{{ trans('general.assets') }}</span>
        +                        </a>
        +                    </li>
        +
        +                    <li>
        +                        <a href="#licenses_tab" data-toggle="tab">
        +                            <span class="hidden-lg hidden-md">
        +                            <i class="fa fa-floppy-o"></i>
        +                            </span>
        +                            <span class="hidden-xs hidden-sm">{{ trans('general.licenses') }}</span>
        +                        </a>
        +                    </li>
        +
        +                    <li>
        +                        <a href="#accessories_tab" data-toggle="tab">
        +                            <span class="hidden-lg hidden-md">
        +                            <i class="fa fa-keyboard-o"></i>
        +                            </span> <span class="hidden-xs hidden-sm">{{ trans('general.accessories') }}</span>
        +                        </a>
        +                    </li>
        +
        +                    <li>
        +                        <a href="#consumables_tab" data-toggle="tab">
        +                            <span class="hidden-lg hidden-md">
        +                            <i class="fa fa-tint"></i></span>
        +                            <span class="hidden-xs hidden-sm">{{ trans('general.consumables') }}</span>
        +                        </a>
        +                    </li>
        +
        +
        +                </ul>
        +
        +                <div class="tab-content">
        +
        +                    <div class="tab-pane fade in active" id="asset_tab">
        +                        <!-- checked out assets table -->
        +                        <div class="table-responsive">
        +                            <table
        +                                    name="companyAssets"
        +                                    class="table table-striped snipe-table"
        +                                    id="table"
        +                                    data-url="{{route('api.assets.index',['company_id' => $company->id]) }}"
        +                                    data-cookie="true"
        +                                    data-cookie-id-table="companyAssetsTable-{{ config('version.hash_version') }}">
        +                                <thead>
        +                                <tr>
        +                                    <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        +                                    <th data-sortable="true" data-formatter="locationsLinkFormatter" data-field="name" data-searchable="true">{{ trans('admin/locations/table.name') }}</th>
        +                                    <th data-sortable="true" data-field="parent">{{ trans('admin/locations/table.parent') }}</th>
        +                                    <th data-searchable="false" data-sortable="false" data-field="assets_default">{{ trans('admin/locations/table.assets_rtd') }}</th>
        +                                    <th data-searchable="false" data-sortable="false" data-field="assets_checkedout">{{ trans('admin/locations/table.assets_checkedout') }}</th>
        +                                    <th data-searchable="true" data-sortable="true" data-field="currency">{{ App\Models\Setting::first()->default_currency }}</th>
        +                                    <th data-searchable="true" data-sortable="true" data-field="address">{{ trans('admin/locations/table.address') }}</th>
        +                                    <th data-searchable="true" data-sortable="true" data-field="city">{{ trans('admin/locations/table.city') }}
        +                                    </th>
        +                                    <th data-searchable="true" data-sortable="true" data-field="state">
        +                                        {{ trans('admin/locations/table.state') }}
        +                                    </th>
        +                                    <th data-searchable="true" data-sortable="true" data-field="zip">
        +                                        {{ trans('admin/locations/table.zip') }}
        +                                    </th>
        +                                    <th data-searchable="true" data-sortable="true" data-field="country">
        +                                        {{ trans('admin/locations/table.country') }}</th>
        +                                    <th data-switchable="false" data-formatter="locationsActionsFormatter" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +                                </tr>
        +                                </thead>
        +                            </table>
        +                        </div>
        +                    </div><!-- /asset_tab -->
        +
        +                    <div class="tab-pane" id="licenses_tab">
        +                        <div class="table-responsive">
        +                            <table class="display table table-hover">
        +                                <thead>
        +                                <tr>
        +                                    <th class="col-md-5">{{ trans('general.name') }}</th>
        +                                    <th class="col-md-6">{{ trans('admin/hardware/form.serial') }}</th>
        +                                    <th class="col-md-1 hidden-print">{{ trans('general.action') }}</th>
        +                                </tr>
        +                                </thead>
        +                                <tbody>
        +
        +                                </tbody>
        +                            </table>
        +                        </div>
        +                    </div><!-- /licenses-tab -->
        +
        +                    <div class="tab-pane" id="accessories_tab">
        +                        <div class="table-responsive">
        +                            <table class="display table table-hover">
        +                                <thead>
        +                                <tr>
        +                                    <th class="col-md-5">Name</th>
        +                                    <th class="col-md-1 hidden-print">Actions</th>
        +                                </tr>
        +                                </thead>
        +                                <tbody>
        +
        +                                </tbody>
        +                            </table>
        +                        </div>
        +                    </div><!-- /accessories-tab -->
        +
        +                    <div class="tab-pane" id="consumables_tab">
        +                        <div class="table-responsive">
        +                            <table class="display table table-striped">
        +                                <thead>
        +                                <tr>
        +                                    <th class="col-md-8">{{ trans('general.name') }}</th>
        +                                    <th class="col-md-4">{{ trans('general.date') }}</th>
        +                                </tr>
        +                                </thead>
        +                                <tbody>
        +
        +                                </tbody>
        +                            </table>
        +                        </div>
        +                    </div><!-- /consumables-tab -->
        +
        +                    
        +
        +                    
        +                </div><!-- /.tab-content -->
        +            </div><!-- nav-tabs-custom -->
        +        </div>
        +    </div>
        +
        +@stop
        +@section('moar_scripts')
        +    @include ('partials.bootstrap-table', ['exportFile' => 'companies-export', 'search' => true])
        +
        +@stop
        +
        diff --git a/resources/views/components/checkout.blade.php b/resources/views/components/checkout.blade.php
        index 2c641e7924..517939c04c 100644
        --- a/resources/views/components/checkout.blade.php
        +++ b/resources/views/components/checkout.blade.php
        @@ -2,75 +2,65 @@
         
         {{-- Page title --}}
         @section('title')
        -     {{ trans('admin/components/general.checkout') }}
        + {{ trans('admin/components/general.checkout') }}
         @parent
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -  <div class="row">
        -    <div class="col-md-9">
        -
        -      <form class="form-horizontal" method="post" action="" autocomplete="off">
        +<div class="row">
        +  <div class="col-md-9">
        +    <form class="form-horizontal" method="post" action="" autocomplete="off">
               <!-- CSRF Token -->
        -      <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +      {{ csrf_field() }}
         
               <div class="box box-default">
        -
        -          @if ($component->id)
        -            <div class="box-header with-border">
        -              <div class="box-heading">
        -                <h3 class="box-title">{{ $component->name }}  ({{ $component->numRemaining()  }}  {{ trans('admin/components/general.remaining') }})</h3>
        -              </div>
        -            </div><!-- /.box-header -->
        -          @endif
        -
        +        @if ($component->id)
        +        <div class="box-header with-border">
        +          <div class="box-heading">
        +            <h3 class="box-title">{{ $component->name }}  ({{ $component->numRemaining()  }}  {{ trans('admin/components/general.remaining') }})</h3>
        +          </div>
        +        </div><!-- /.box-header -->
        +        @endif
         
                 <div class="box-body">
        -
                   @if ($component->name)
                   <!-- consumable name -->
                   <div class="form-group">
        -          <label class="col-sm-3 control-label">{{ trans('admin/components/general.component_name') }}</label>
        -              <div class="col-md-6">
        -                <p class="form-control-static">{{ $component->name }}</p>
        -              </div>
        +            <label class="col-sm-3 control-label">{{ trans('admin/components/general.component_name') }}</label>
        +            <div class="col-md-6">
        +              <p class="form-control-static">{{ $component->name }}</p>
        +            </div>
                   </div>
                   @endif
         
        -
                   <!-- Asset -->
        -
                   <div class="form-group {{ $errors->has('asset_id') ? ' has-error' : '' }}">
        -              <label for="asset_id" class="col-md-3 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        -               <i class='icon-asterisk'></i></label>
        -              <div class="col-md-9">
        -                  {{ Form::select('asset_id', $assets_list , Input::old('asset_id', $component->asset_id), array('class'=>'select2', 'style'=>'width:100%')) }}
        -                  {!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        +            <label for="asset_id" class="col-md-3 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        +             <i class='icon-asterisk'></i></label>
        +            <div class="col-md-9">
        +              {{ Form::select('asset_id', $assets_list , Input::old('asset_id', $component->asset_id), array('class'=>'select2', 'style'=>'width:100%')) }}
        +              {!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
                   </div>
         
                   <div class="form-group {{ $errors->has('assigned_qty') ? ' has-error' : '' }}">
        -              <label for="assigned_qty" class="col-md-3 control-label">{{ trans('general.qty') }}
        -               <i class='icon-asterisk'></i></label>
        -              <div class="col-md-9">
        -                <input class="form-control" type="text" name="assigned_qty" id="assigned_qty" style="width: 70px;" value="{{ Input::old('assigned_qty') }}" />
        -                {!! $errors->first('assigned_qty', '<br><span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        +            <label for="assigned_qty" class="col-md-3 control-label">{{ trans('general.qty') }}
        +             <i class='icon-asterisk'></i></label>
        +            <div class="col-md-9">
        +              <input class="form-control" type="text" name="assigned_qty" id="assigned_qty" style="width: 70px;" value="{{ Input::old('assigned_qty') }}" />
        +              {!! $errors->first('assigned_qty', '<br><span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
                   </div>
         
        -        </div>
        +        </div> <!-- .BOX-BODY-->
                 <div class="box-footer text-right">
                     <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
                 </div>
        -    </div>
        -  </div>
        +      </div> <!-- .box-default-->
        +    </form>
        +  </div> <!-- .col-md-9-->
        +</div> <!-- .row -->
         
        -
        -
        -</form>
        -
        -</div>
        -</div>
         @stop
        diff --git a/resources/views/components/edit.blade.php b/resources/views/components/edit.blade.php
        index b2720d13c5..84b7bb3e2b 100644
        --- a/resources/views/components/edit.blade.php
        +++ b/resources/views/components/edit.blade.php
        @@ -2,7 +2,9 @@
             'createText' => trans('admin/components/general.create') ,
             'updateText' => trans('admin/components/general.update'),
             'helpTitle' => trans('admin/components/general.about_components_title'),
        -    'helpText' => trans('admin/components/general.about_components_text')
        +    'helpText' => trans('admin/components/general.about_components_text'),
        +    'formAction' => ($item) ? route('components.update', ['component' => $item->id]) : route('components.store'),
        +
         ])
         
         {{-- Page content --}}
        diff --git a/resources/views/components/index.blade.php b/resources/views/components/index.blade.php
        index 71b031dd55..cd68175177 100644
        --- a/resources/views/components/index.blade.php
        +++ b/resources/views/components/index.blade.php
        @@ -7,94 +7,46 @@
         @stop
         
         @section('header_right')
        -    @can('components.create')
        -        <a href="{{ route('create/component') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        -    @endcan
        +  @can('create', \App\Models\Component::class)
        +    <a href="{{ route('components.create') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        +  @endcan
         @stop
         
         {{-- Page content --}}
         @section('content')
        -
        -
         <div class="row">
           <div class="col-md-12">
        -
             <div class="box box-default">
        -        <div class="box-body">
        -          {{ Form::open([
        -               'method' => 'POST',
        -               'route' => ['component/bulk-form'],
        -               'class' => 'form-inline' ]) }}
        +      <div class="box-body">
        +        {{ Form::open([
        +             'method' => 'POST',
        +             'route' => ['component/bulk-form'],
        +             'class' => 'form-inline' ]) }}
         
        +        <div id="toolbar">
        +        </div>
         
        -          <div id="toolbar">
        -            <!-- <select name="bulk_actions" class="form-control select2" style="width: 130px;">
        -              <option value="checkout">Checkout</option>
        -              <option value="checkin">Checkin</option>
        -            </select>
        -            <button class="btn btn-default" id="bulkEdit" disabled>Go</button>
        -            -->
        -          </div>
        -
        -
        -          <table
        +        <table
                   data-toolbar="#toolbar"
                   name="components"
                   class="table table-striped snipe-table"
                   id="table"
        -          data-url="{{route('api.components.list') }}"
        +          data-url="{{route('api.components.index') }}"
                   data-cookie="true"
                   data-click-to-select="true"
        -          data-cookie-id-table="componentsTable-{{ config('version.hash_version') }}-{{ config('version.hash_version') }}">
        -            <thead>
        -              <tr>
        -                <th data-class="hidden-xs" data-switchable="false" data-searchable="false" data-sortable="false" data-field="checkbox"><div class="text-center"><input type="checkbox" id="checkAll" style="padding-left: 0px;"></div></th>
        -                <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                <th data-switchable="true" data-visible="false" data-searchable="true" data-sortable="true" data-field="companyName">{{ trans('admin/companies/table.title') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="name">{{ trans('admin/components/table.title') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="serial_number" data-visible="false">{{ trans('admin/hardware/form.serial') }}</th>
        -                <th data-searchable="true" data-sortable="true" data-field="location">{{ trans('general.location') }}</th>
        -                <th data-searchable="true" data-sortable="true" data-field="category">{{ trans('general.category') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="total_qty"> {{ trans('admin/components/general.total') }}</th>
        -                <th data-switchable="true" data-searchable="false" data-sortable="true" data-field="min_amt"> {{ trans('general.min_amt') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="numRemaining"> {{ trans('admin/components/general.remaining') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="order_number" data-visible="false">{{ trans('admin/components/general.order') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="purchase_date" data-visible="false">{{ trans('admin/components/general.date') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="purchase_cost" data-visible="false">{{ trans('admin/components/general.cost') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions"> {{ trans('table.actions') }}</th>
        -
        -              </tr>
        -            </thead>
        -          </table>
        -          {{ Form::close() }}
        -        </div><!-- /.box-body -->
        -      </div><!-- /.box -->
        -
        +          data-cookie-id-table="componentsTable-{{ config('version.hash_version') }}">
        +        </table>
        +        {{ Form::close() }}
        +      </div><!-- /.box-body -->
        +    </div><!-- /.box -->
           </div>
         </div>
         
         @stop
         
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'components-export', 'search' => true])
        +@include ('partials.bootstrap-table', ['exportFile' => 'components-export', 'search' => true, 'columns' => \App\Presenters\ComponentPresenter::dataTableLayout()])
        +
         
        -<script>
        -    $(function() {
        -        function checkForChecked() {
        -            var check_checked = $('input.one_required:checked').length;
        -            if (check_checked > 0) {
        -                $('#bulkEdit').removeAttr('disabled');
        -            }
        -            else {
        -                $('#bulkEdit').attr('disabled', 'disabled');
        -            }
        -        }
        -        $('#table').on('change','input.one_required',checkForChecked);
        -        $("#checkAll").change(function () {
        -            $("input:checkbox").prop('checked', $(this).prop("checked"));
        -            checkForChecked();
        -        });
        -    });
        -</script>
         
         @stop
        diff --git a/resources/views/components/view.blade.php b/resources/views/components/view.blade.php
        index 7463d407b5..b2b327ca41 100644
        --- a/resources/views/components/view.blade.php
        +++ b/resources/views/components/view.blade.php
        @@ -10,28 +10,28 @@
         
         {{-- Right header --}}
         @section('header_right')
        -    @can('components.manage')
        -<div class="dropdown pull-right">
        -  <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        -      <span class="caret"></span>
        -  </button>
        -  <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
        +  @can('manage', $component)
        +    <div class="dropdown pull-right">
        +      <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        +          <span class="caret"></span>
        +      </button>
        +      <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
                 @if ($component->assigned_to != '')
        -          @can('components.checkin')
        +          @can('checkin', $component)
                   <li role="presentation"><a href="{{ route('checkin/component', $component->id) }}">{{ trans('admin/components/general.checkin') }}</a></li>
                   @endcan
                 @else
        -          @can('components.checkout')
        +          @can('checkout', $component)
                   <li role="presentation"><a href="{{ route('checkout/component', $component->id)  }}">{{ trans('admin/components/general.checkout') }}</a></li>
                   @endcan
                 @endif
        -         @can('components.edit')
        -        <li role="presentation"><a href="{{ route('update/component', $component->id) }}">{{ trans('admin/components/general.edit') }}</a></li>
        -       @endcan
         
        -  </ul>
        -</div>
        -    @endcan
        +        @can('update', $component)
        +        <li role="presentation"><a href="{{ route('components.edit', $component->id) }}">{{ trans('admin/components/general.edit') }}</a></li>
        +        @endcan
        +      </ul>
        +    </div>
        +  @endcan
         @stop
         
         
        @@ -41,64 +41,59 @@
         <div class="row">
           <div class="col-md-9">
             <div class="box box-default">
        -
               <div class="box-body">
                 <div class="row">
                   <div class="col-md-12">
                     <div class="table table-responsive">
        -
        -            <table
        -            name="component_users"
        -            class="table table-striped snipe-table"
        -            id="table"
        -            data-url="{{route('api.components.view', $component->id)}}"
        -            data-cookie="true"
        -            data-click-to-select="true"
        -            data-cookie-id-table="componentDetailTable-{{ config('version.hash_version') }}">
        -              <thead>
        -                <tr>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.asset') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="qty">{{ trans('general.qty') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="created_at">{{ trans('general.date') }}</th>
        -                </tr>
        -              </thead>
        -            </table>
        -          </div>
        -
        -          </div>
        +              <table
        +                name="component_users"
        +                class="table table-striped snipe-table"
        +                id="table"
        +                data-url="{{ route('api.components.assets', $component->id)}}"
        +                data-cookie="true"
        +                data-click-to-select="true"
        +                data-cookie-id-table="componentDetailTable-{{ config('version.hash_version') }}">
        +                <thead>
        +                  <tr>
        +                    <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="name" data-formatter="hardwareLinkFormatter">{{ trans('general.asset') }}</th>
        +                    <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="qty">{{ trans('general.qty') }}</th>
        +                    <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="created_at">{{ trans('general.date') }}</th>
        +                  </tr>
        +                </thead>
        +              </table>
        +            </div>
        +          </div> <!-- .col-md-12-->
                 </div>
               </div>
        -  </div>
             </div>
        +  </div> <!-- .col-md-9-->
         
         
           <!-- side address column -->
           <div class="col-md-3">
        -
        -      @if ($component->serial!='')
        -          <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.serial') }}: </strong>
        -              {{ $component->serial }} </div>
        -      @endif
        +    @if ($component->serial!='')
        +    <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.serial') }}: </strong>
        +    {{ $component->serial }} </div>
        +    @endif
         
             @if ($component->purchase_date)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/components/general.date') }}: </strong>
        -        {{ $component->purchase_date }} </div>
        +    <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/components/general.date') }}: </strong>
        +    {{ $component->purchase_date }} </div>
             @endif
         
             @if ($component->purchase_cost)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/components/general.cost') }}:</strong>
        -        {{ $snipeSettings->default_currency }}
        +    <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/components/general.cost') }}:</strong>
        +    {{ $snipeSettings->default_currency }}
         
        -        {{ \App\Helpers\Helper::formatCurrencyOutput($component->purchase_cost) }} </div>
        +    {{ \App\Helpers\Helper::formatCurrencyOutput($component->purchase_cost) }} </div>
             @endif
         
             @if ($component->order_number)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/components/general.order') }}:</strong>
        -        {{ $component->order_number }} </div>
        +    <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/components/general.order') }}:</strong>
        +    {{ $component->order_number }} </div>
             @endif
        -
           </div>
        -</div>
        +</div> <!-- .row-->
         
         @stop
         
        diff --git a/resources/views/consumables/checkout.blade.php b/resources/views/consumables/checkout.blade.php
        index 032bbaf6f3..6650d5406e 100644
        --- a/resources/views/consumables/checkout.blade.php
        +++ b/resources/views/consumables/checkout.blade.php
        @@ -9,75 +9,66 @@
         {{-- Page content --}}
         @section('content')
         
        -  <div class="row">
        -    <div class="col-md-9">
        +<div class="row">
        +  <div class="col-md-9">
         
        -      <form class="form-horizontal" method="post" action="" autocomplete="off">
        +    <form class="form-horizontal" method="post" action="" autocomplete="off">
               <!-- CSRF Token -->
               <input type="hidden" name="_token" value="{{ csrf_token() }}" />
         
               <div class="box box-default">
         
        -          @if ($consumable->id)
        -            <div class="box-header with-border">
        -              <div class="box-heading">
        -                <h3 class="box-title">{{ $consumable->name }} </h3>
        -              </div>
        -            </div><!-- /.box-header -->
        -          @endif
        -
        +        @if ($consumable->id)
        +          <div class="box-header with-border">
        +            <div class="box-heading">
        +              <h3 class="box-title">{{ $consumable->name }} </h3>
        +            </div>
        +          </div><!-- /.box-header -->
        +        @endif
         
                 <div class="box-body">
        -
                   @if ($consumable->name)
                   <!-- consumable name -->
                   <div class="form-group">
        -          <label class="col-sm-3 control-label">{{ trans('admin/consumables/general.consumable_name') }}</label>
        -              <div class="col-md-6">
        -                <p class="form-control-static">{{ $consumable->name }}</p>
        -              </div>
        +            <label class="col-sm-3 control-label">{{ trans('admin/consumables/general.consumable_name') }}</label>
        +            <div class="col-md-6">
        +              <p class="form-control-static">{{ $consumable->name }}</p>
        +            </div>
                   </div>
                   @endif
         
        -
                   <!-- User -->
        -
                   <div class="form-group {{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        -              <label for="assigned_to" class="col-md-3 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        -               <i class='icon-asterisk'></i></label>
        -              <div class="col-md-9">
        -                  {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $consumable->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }}
        -                  {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -              </div>
        +            <label for="assigned_to" class="col-md-3 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        +              <i class='icon-asterisk'></i></label>
        +            <div class="col-md-9">
        +              {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $consumable->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }}
        +              {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
                   </div>
         
                   @if ($consumable->category->require_acceptance=='1')
                   <div class="form-group">
        -                <div class="col-md-9 col-md-offset-3">
        -                  <p class="hint-block">{{ trans('admin/categories/general.required_acceptance') }}</p>
        -                </div>
        -                </div>
        -                @endif
        -
        -                @if ($consumable->getEula())
        -                <div class="form-group">
        -
        -                    <div class="col-md-9 col-md-offset-3">
        -                      <p class="hint-block">{{ trans('admin/categories/general.required_eula') }}</p>
        -                    </div>
        -                </div>
        +            <div class="col-md-9 col-md-offset-3">
        +              <p class="hint-block">{{ trans('admin/categories/general.required_acceptance') }}</p>
        +            </div>
        +          </div>
                   @endif
        -        </div>
        +
        +          @if ($consumable->getEula())
        +          <div class="form-group">
        +            <div class="col-md-9 col-md-offset-3">
        +              <p class="hint-block">{{ trans('admin/categories/general.required_eula') }}</p>
        +            </div>
        +          </div>
        +          @endif
        +        </div> <!-- .box-body -->
                 <div class="box-footer text-right">
        -            <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +          <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
                 </div>
        -    </div>
        +      </div>
        +    </form>
        +
           </div>
        -
        -
        -
        -</form>
        -
        -</div>
         </div>
         @stop
        diff --git a/resources/views/consumables/edit.blade.php b/resources/views/consumables/edit.blade.php
        index e9670ec95d..54d5d5c27f 100644
        --- a/resources/views/consumables/edit.blade.php
        +++ b/resources/views/consumables/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/consumables/general.create') ,
             'updateText' => trans('admin/consumables/general.update'),
             'helpTitle' => trans('admin/consumables/general.about_consumables_title'),
        -    'helpText' => trans('admin/consumables/general.about_consumables_text')
        +    'helpText' => trans('admin/consumables/general.about_consumables_text'),
        +    'formAction' => ($item) ? route('consumables.update', ['accessory' => $item->id]) : route('consumables.store'),
         ])
         {{-- Page content --}}
         @section('inputFields')
        diff --git a/resources/views/consumables/index.blade.php b/resources/views/consumables/index.blade.php
        index 0a164ca1da..68d0913195 100644
        --- a/resources/views/consumables/index.blade.php
        +++ b/resources/views/consumables/index.blade.php
        @@ -7,60 +7,38 @@
         @stop
         
         @section('header_right')
        -    @can('consumables.create')
        -        <a href="{{ route('create/consumable') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        -    @endcan
        +  @can('create', \App\Models\Consumable::class)
        +  <a href="{{ route('consumables.create') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        +  @endcan
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -
         <div class="row">
           <div class="col-md-12">
         
             <div class="box box-default">
        -        <div class="box-body">
        -          <table
        +      <div class="box-body">
        +        <table
                   name="consumables"
                   class="table table-striped snipe-table"
                   id="table"
        -          data-url="{{route('api.consumables.list') }}"
        +          data-url="{{route('api.consumables.index') }}"
                   data-cookie="true"
                   data-click-to-select="true"
                   data-cookie-id-table="consumablesTable-{{ config('version.hash_version') }}-{{ config('version.hash_version') }}">
        -            <thead>
        -              <tr>
        -                <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                <th data-switchable="true" data-searchable="true" data-sortable="true" data-field="companyName">{{ trans('admin/companies/table.title') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="name">{{ trans('admin/consumables/table.title') }}</th>
        -                <th data-searchable="true" data-sortable="true" data-field="location">{{ trans('general.location') }}</th>
        -                <th data-searchable="true" data-sortable="true" data-field="category">{{ trans('general.category') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="qty"> {{ trans('admin/consumables/general.total') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="numRemaining"> {{ trans('admin/consumables/general.remaining') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="true" data-field="min_amt"> {{ trans('general.min_amt') }}</th>
        -                <th data-sortable="true" data-field="manufacturer" data-visible="false">{{ trans('general.manufacturer') }}</th>
        -                <th data-sortable="true" data-field="model_number" data-visible="false">{{ trans('general.model_no') }}</th>
        -                <th data-sortable="true" data-field="item_no" data-visible="false">{{ trans('admin/consumables/general.item_no') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="order_number" data-visible="false">{{ trans('general.order_number') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="purchase_date" data-visible="false">{{ trans('general.purchase_date') }}</th>
        -                <th data-sortable="true" data-searchable="true" data-field="purchase_cost" data-visible="false">{{ trans('general.purchase_cost') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions"> {{ trans('table.actions') }}</th>
         
        -              </tr>
        -            </thead>
        -          </table>
        -        </div><!-- /.box-body -->
        -      </div><!-- /.box -->
        -
        -  </div>
        -</div>
        +            </tr>
        +          </thead>
        +        </table>
        +      </div><!-- /.box-body -->
        +    </div><!-- /.box -->
         
        +  </div> <!-- /.col-md-12 -->
        +</div> <!-- /.row -->
        +@stop
         
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'consumables-export', 'search' => true])
        -
        -
        -@stop
        -
        +@include ('partials.bootstrap-table', ['exportFile' => 'consumables-export', 'search' => true,'columns' => \App\Presenters\ConsumablePresenter::dataTableLayout()])
         @stop
        diff --git a/resources/views/consumables/view.blade.php b/resources/views/consumables/view.blade.php
        index 6eca524cc2..820f69dc51 100644
        --- a/resources/views/consumables/view.blade.php
        +++ b/resources/views/consumables/view.blade.php
        @@ -2,7 +2,6 @@
         
         {{-- Page title --}}
         @section('title')
        -
          {{ $consumable->name }}
          {{ trans('general.consumable') }}
         @parent
        @@ -20,82 +19,91 @@
         <div class="row">
           <div class="col-md-9">
             <div class="box box-default">
        -
        -        @if ($consumable->id)
        -          <div class="box-header with-border">
        -            <div class="box-heading">
        -              <h3 class="box-title"> {{ $consumable->name }}</h3>
        -            </div>
        -          </div><!-- /.box-header -->
        -        @endif
        +      @if ($consumable->id)
        +      <div class="box-header with-border">
        +        <div class="box-heading">
        +          <h3 class="box-title"> {{ $consumable->name }}</h3>
        +        </div>
        +      </div><!-- /.box-header -->
        +      @endif
         
               <div class="box-body">
                 <div class="row">
                   <div class="col-md-12">
                     <div class="table table-responsive">
        -
        -            <table
        -            name="consumable_users"
        -            class="table table-striped snipe-table"
        -            id="table"
        -            data-url="{{route('api.consumables.view', $consumable->id)}}"
        -            data-cookie="true"
        -            data-click-to-select="true"
        -            data-cookie-id-table="consumableDetailTable-{{ config('version.hash_version') }}">
        -              <thead>
        +              <table
        +                name="consumable_users"
        +                class="table table-striped snipe-table"
        +                id="table"
        +                data-url="{{route('api.consumables.showUsers', $consumable->id)}}"
        +                data-cookie="true"
        +                data-click-to-select="true"
        +                data-cookie-id-table="consumableDetailTable-{{ config('version.hash_version') }}"
        +              >
        +                <thead>
                           <tr>
                             <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.user') }}</th>
                             <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="created_at">{{ trans('general.date') }}</th>
                             <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="admin">{{ trans('general.admin') }}</th>
                           </tr>
        -              </thead>
        -            </table>
        -          </div>
        -          </div>
        +                </thead>
        +              </table>
        +            </div>
        +          </div> <!-- /.col-md-12-->
         
        -          </div>
                 </div>
               </div>
        -  </div>
        +    </div> <!-- /.box.box-default-->
        +  </div> <!-- /.col-md-9-->
           <div class="col-md-3">
         
        -      <h4>{{ trans('admin/consumables/general.about_consumables_title') }}</h4>
        -      <p>{{ trans('admin/consumables/general.about_consumables_text') }} </p>
        +    <h4>{{ trans('admin/consumables/general.about_consumables_title') }}</h4>
        +    <p>{{ trans('admin/consumables/general.about_consumables_text') }} </p>
         
        -      
             @if ($consumable->purchase_date)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('general.purchase_date') }}: </strong>
        -        {{ $consumable->purchase_date }} </div>
        +      <div class="col-md-12" style="padding-bottom: 5px;">
        +        <strong>{{ trans('general.purchase_date') }}: </strong>
        +        {{ $consumable->purchase_date }}
        +      </div>
             @endif
         
             @if ($consumable->purchase_cost)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('general.purchase_cost') }}:</strong>
        +      <div class="col-md-12" style="padding-bottom: 5px;">
        +        <strong>{{ trans('general.purchase_cost') }}:</strong>
                 {{ $snipeSettings->default_currency }}
        -
        -        {{ \App\Helpers\Helper::formatCurrencyOutput($consumable->purchase_cost) }} </div>
        +        {{ \App\Helpers\Helper::formatCurrencyOutput($consumable->purchase_cost) }}
        +      </div>
             @endif
         
             @if ($consumable->item_no)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/consumables/general.item_no') }}:</strong>
        -            {{ $consumable->item_no }} </div>
        +      <div class="col-md-12" style="padding-bottom: 5px;">
        +        <strong>{{ trans('admin/consumables/general.item_no') }}:</strong>
        +        {{ $consumable->item_no }}
        +      </div>
             @endif
         
             @if ($consumable->model_number)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('general.model_no') }}:</strong>
        -            {{ $consumable->model_number }} </div>
        +      <div class="col-md-12" style="padding-bottom: 5px;">
        +        <strong>{{ trans('general.model_no') }}:</strong>
        +        {{ $consumable->model_number }}
        +      </div>
             @endif
         
             @if ($consumable->manufacturer)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('general.manufacturer') }}:</strong>
        -            {{ $consumable->manufacturer->name }} </div>
        +      <div class="col-md-12" style="padding-bottom: 5px;">
        +        <strong>{{ trans('general.manufacturer') }}:</strong>
        +        {{ $consumable->manufacturer->name }}
        +      </div>
             @endif
         
             @if ($consumable->order_number)
        -        <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('general.order_number') }}:</strong>
        -        {{ $consumable->order_number }} </div>
        +      <div class="col-md-12" style="padding-bottom: 5px;">
        +        <strong>{{ trans('general.order_number') }}:</strong>
        +        {{ $consumable->order_number }}
        +      </div>
             @endif
        -  </div>
        -</div>
        +  </div> <!-- /.col-md-3-->
        +</div> <!-- /.row-->
         
         @stop
         
        diff --git a/resources/views/custom_fields/create.blade.php b/resources/views/custom_fields/create.blade.php
        deleted file mode 100644
        index 092ff704af..0000000000
        --- a/resources/views/custom_fields/create.blade.php
        +++ /dev/null
        @@ -1,53 +0,0 @@
        -@extends('layouts/default')
        -
        -{{-- Page title --}}
        -@section('title')
        -  {{ trans('admin/custom_fields/general.create_fieldset') }}
        -@parent
        -@stop
        -
        -@section('header_right')
        -<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
        -  {{ trans('general.back') }}</a>
        -@stop
        -
        -
        -{{-- Page content --}}
        -@section('content')
        -
        -<div class="row">
        -<div class="col-md-9">
        -  <!-- Horizontal Form -->
        -    <div class="box box-default">
        -      <div class="box-body">
        -
        -
        -        {{ Form::open(['route' => 'admin.custom_fields.store', 'class'=>'form-horizontal']) }}
        -        <!-- CSRF Token -->
        -        <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -            <!-- Name -->
        -            <div class="form-group {{ $errors->has('name') ? ' has-error' : '' }}">
        -                <label for="name" class="col-md-4 control-label">{{ trans('admin/custom_fields/general.fieldset_name') }}
        -                 <i class='fa fa-asterisk'></i></label>
        -                 </label>
        -                    <div class="col-md-6">
        -                      <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name') }}" />
        -                      {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -            </div>
        -          </div>
        -          <div class="box-footer text-right">
        -            <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        -          </div>
        -
        -
        -        {{ Form::close() }}
        -      </div>
        -</div>
        -<div class="col-md-3">
        -  <h4>About Fieldsets</h4>
        -  <p>Fieldsets work like containers of the custom fields you've created. This allows you to group commonly used custom attributes together for easy associations. </p>
        -</div>
        -
        -@stop
        diff --git a/resources/views/custom_fields/create_field.blade.php b/resources/views/custom_fields/create_field.blade.php
        deleted file mode 100644
        index ebde371b73..0000000000
        --- a/resources/views/custom_fields/create_field.blade.php
        +++ /dev/null
        @@ -1,159 +0,0 @@
        -@extends('layouts/default')
        -{{-- Page title --}}
        -@section('title')
        -  {{ trans('admin/custom_fields/general.create_field') }}
        -@parent
        -@stop
        -
        -@section('content')
        -
        -@section('header_right')
        -<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
        -  {{ trans('general.back') }}</a>
        -@stop
        -
        -
        -{{-- Page content --}}
        -@section('content')
        -
        -<div class="row">
        -<div class="col-md-9">
        -  <!-- Horizontal Form -->
        -    <div class="box box-default">
        -      <div class="box-body">
        -
        -
        -        {{ Form::open(['route' => 'admin.custom_fields.store-field', 'class'=>'form-horizontal']) }}
        -
        -
        -          <!-- Name -->
        -          <div class="form-group {{ $errors->has('name') ? ' has-error' : '' }}">
        -              <label for="name" class="col-md-4 control-label">{{ trans('admin/custom_fields/general.field_name') }} </label>
        -               </label>
        -                  <div class="col-md-6 required">
        -                    <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name') }}" />
        -                    {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                  </div>
        -          </div>
        -
        -          <!-- Element Type -->
        -          <div class="form-group {{ $errors->has('element') ? ' has-error' : '' }}">
        -              <label for="element" class="col-md-4 control-label">{{ trans('admin/custom_fields/general.field_element') }}</label>
        -               </label>
        -                  <div class="col-md-6 required">
        -
        -                  {!! Form::customfield_elements('element', Input::old('element'), 'field_element select2 form-control') !!}
        -                  {!! $errors->first('element', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -
        -                  </div>
        -          </div>
        -
        -            <!-- Element values -->
        -            <div class="form-group {{ $errors->has('element') ? ' has-error' : '' }}" id="field_values_text" style="display:none;">
        -                <label for="field_values" class="col-md-4 control-label">{{ trans('admin/custom_fields/general.field_values') }}</label>
        -                </label>
        -                <div class="col-md-6 required">
        -
        -                    {!! Form::textarea('field_values', Input::old('field_values'), ['style' => 'width: 100%', 'rows' => 4, 'class' => 'form-control']) !!}
        -                    {!! $errors->first('field_values', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -
        -                    <p class="help-block">{{ trans('admin/custom_fields/general.field_values_help') }}</p>
        -                </div>
        -
        -
        -            </div>
        -
        -          <!-- Format -->
        -          <div class="form-group {{ $errors->has('format') ? ' has-error' : '' }}">
        -              <label for="format" class="col-md-4 control-label">{{ trans('admin/custom_fields/general.field_format') }}</label>
        -               </label>
        -                  <div class="col-md-6 required">
        -                    {{ Form::select("format",\App\Helpers\Helper::predefined_formats(),"ANY", array('class'=>'format select2 form-control')) }}
        -                    {!! $errors->first('format', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                  </div>
        -          </div>
        -
        -          <!-- Custom Format -->
        -          <div class="form-group {{ $errors->has('custom_format') ? ' has-error' : '' }}" id="custom_regex" style="display:none;">
        -              <label for="custom_format" class="col-md-4 control-label">{{ trans('admin/custom_fields/general.field_custom_format') }}
        -              </label>
        -                  <div class="col-md-6 required">
        -                    <input class="form-control" type="text" name="custom_format" id="custom_format" value="{{ Input::old('custom_format') }}" />
        -                    {!! $errors->first('custom_format', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                  </div>
        -          </div>
        -
        -            <!-- Encrypted  -->
        -            <div class="form-group {{ $errors->has('custom_format') ? ' has-error' : '' }}">
        -                <div class="col-md-8 col-md-offset-4">
        -                    <label for="field_encrypted">
        -                        <input type="checkbox" value="1" name="field_encrypted" id="field_encrypted" class="minimal"{{ Input::old('field_encrypted') ? ' checked="checked"' : '' }}> {{ trans('admin/custom_fields/general.encrypt_field') }}
        -                    </label>
        -                </div>
        -
        -                <div class="col-md-6 col-md-offset-4" id="encrypt_warning" style="display:none;">
        -                    <div class="callout callout-danger">
        -                        <p><i class="fa fa-warning"></i> {{ trans('admin/custom_fields/general.encrypt_field_help') }}</p>
        -                    </div>
        -
        -                </div>
        -            </div>
        -
        -
        -         </div>
        -        <div class="box-footer text-right">
        -            <button type="submit" class="btn btn-success"> {{ trans('general.save') }}</button>
        -        </div>
        -  </div>
        -</div>
        -    {{ Form::close() }}
        -<div class="col-md-3">
        -<h4>About Custom Fields</h4>
        -<p>Custom fields allow you to add arbitrary attributes to assets.</p>
        -</div>
        -
        -@section('moar_scripts')
        -        <script>
        -
        -
        -            $(document).ready(function(){
        -
        -                // Only display the custom format field if it's a custom format validation type
        -                $(".format").change(function(){
        -                    $(this).find("option:selected").each(function(){
        -                        //console.warn($(this).attr("value"));
        -                        if (($(this).attr("value")=="") &&  $('.format').prop("selectedIndex") != 0) {
        -                            $("#custom_regex").show();
        -                        } else{
        -                            $("#custom_regex").hide();
        -                        }
        -                    });
        -                }).change();
        -
        -                // Only display the field element if the type is not text
        -                $(".field_element").change(function(){
        -                    $(this).find("option:selected").each(function(){
        -                        //console.warn($(this).attr("value"));
        -                        if($(this).attr("value")!="text"){
        -                            $("#field_values_text").show();
        -                        } else{
        -                            $("#field_values_text").hide();
        -                        }
        -                    });
        -                }).change();
        -            });
        -
        -            // Checkbox handling
        -            $('div.icheckbox_minimal-blue').on('ifChecked', function(event){
        -                $("#encrypt_warning").show();
        -            });
        -
        -            $('div.icheckbox_minimal-blue').on('ifUnchecked', function(event){
        -                $("#encrypt_warning").hide();
        -            });
        -
        -        </script>
        -@stop
        -
        -
        -@stop
        diff --git a/resources/views/custom_fields/fields/edit.blade.php b/resources/views/custom_fields/fields/edit.blade.php
        new file mode 100644
        index 0000000000..2e058a90aa
        --- /dev/null
        +++ b/resources/views/custom_fields/fields/edit.blade.php
        @@ -0,0 +1,175 @@
        +@extends('layouts/default')
        +{{-- Page title --}}
        +@section('title')
        +  {{ trans('admin/custom_fields/general.custom_fields') }}
        +@parent
        +@stop
        +
        +@section('content')
        +
        +@section('header_right')
        +<a href="{{ route('fields.index') }}" class="btn btn-primary pull-right">
        +  {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +<div class="row">
        +  <div class="col-md-9">
        +    <!-- Horizontal Form -->
        +        @if ($field->id)
        +          {{ Form::open(['route' => ['fields.update', $field->id], 'class'=>'form-horizontal']) }}
        +          {{ method_field('PUT') }}
        +        @else
        +          {{ Form::open(['route' => 'fields.store', 'class'=>'form-horizontal']) }}
        +        @endif
        +
        +    <div class="box box-default">
        +      <div class="box-body">
        +
        +          <!-- Name -->
        +          <div class="form-group {{ $errors->has('name') ? ' has-error' : '' }}">
        +            <label for="name" class="col-md-4 control-label">
        +              {{ trans('admin/custom_fields/general.field_name') }}
        +            </label>
        +            <div class="col-md-6 required">
        +                {{ Form::text('name', Input::old('name', $field->name), array('class' => 'form-control')) }}
        +                {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
        +
        +          <!-- Element Type -->
        +          <div class="form-group {{ $errors->has('element') ? ' has-error' : '' }}">
        +            <label for="element" class="col-md-4 control-label">
        +              {{ trans('admin/custom_fields/general.field_element') }}
        +            </label>
        +            <div class="col-md-6 required">
        +
        +            {!! Form::customfield_elements('element', Input::old('element', $field->element), 'field_element select2 form-control') !!}
        +            {!! $errors->first('element', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +
        +            </div>
        +          </div>
        +
        +          <!-- Element values -->
        +          <div class="form-group {{ $errors->has('element') ? ' has-error' : '' }}" id="field_values_text" style="display:none;">
        +            <label for="field_values" class="col-md-4 control-label">
        +              {{ trans('admin/custom_fields/general.field_values') }}
        +            </label>
        +            <div class="col-md-6 required">
        +              {!! Form::textarea('field_values', Input::old('name', $field->field_values), ['style' => 'width: 100%', 'rows' => 4, 'class' => 'form-control']) !!}
        +              {!! $errors->first('field_values', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              <p class="help-block">{{ trans('admin/custom_fields/general.field_values_help') }}</p>
        +            </div>
        +          </div>
        +
        +          <!-- Format -->
        +          <div class="form-group {{ $errors->has('format') ? ' has-error' : '' }}">
        +            <label for="format" class="col-md-4 control-label">
        +              {{ trans('admin/custom_fields/general.field_format') }}
        +            </label>
        +            <div class="col-md-6 required">
        +              {{ Form::select("format",\App\Helpers\Helper::predefined_formats(),"ANY", array('class'=>'format select2 form-control')) }}
        +              {!! $errors->first('format', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
        +
        +          <!-- Custom Format -->
        +          <div class="form-group {{ $errors->has('custom_format') ? ' has-error' : '' }}" id="custom_regex" style="display:none;">
        +            <label for="custom_format" class="col-md-4 control-label">
        +              {{ trans('admin/custom_fields/general.field_custom_format') }}
        +            </label>
        +            <div class="col-md-6 required">
        +                {{ Form::text('custom_format', Input::old('custom_format', $field->custom_format), array('class' => 'form-control', 'id' => 'custom_format')) }}
        +              {!! $errors->first('custom_format', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
        +
        +          <!-- Help Text -->
        +          <div class="form-group {{ $errors->has('help_text') ? ' has-error' : '' }}">
        +              <label for="help_text" class="col-md-4 control-label">
        +                  Help Text
        +              </label>
        +              <div class="col-md-6">
        +                  {{ Form::text('help_text', Input::old('help_text', $field->help_text), array('class' => 'form-control')) }}
        +                  <p class="help-block">This is optional text that will appear below the form elements while editing an asset to provide context on the field.</p>
        +                  {!! $errors->first('help_text', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
        +          </div>
        +
        +
        +      @if (!$field->id)
        +          <!-- Encrypted  -->
        +          <div class="form-group {{ $errors->has('custom_format') ? ' has-error' : '' }}">
        +            <div class="col-md-8 col-md-offset-4">
        +              <label for="field_encrypted">
        +                <input type="checkbox" value="1" name="field_encrypted" id="field_encrypted" class="minimal"{{ (Input::old('field_encrypted') || $field->field_encrypted) ? ' checked="checked"' : '' }}>
        +                {{ trans('admin/custom_fields/general.encrypt_field') }}
        +              </label>
        +            </div>
        +
        +            <div class="col-md-6 col-md-offset-4" id="encrypt_warning" style="display:none;">
        +              <div class="callout callout-danger">
        +                <p><i class="fa fa-warning"></i> {{ trans('admin/custom_fields/general.encrypt_field_help') }}</p>
        +              </div>
        +            </div>
        +          </div>
        +          @endif
        +
        +
        +      </div> <!-- /.box-body-->
        +      <div class="box-footer text-right">
        +        <button type="submit" class="btn btn-success"> {{ trans('general.save') }}</button>
        +      </div>
        +    </div> <!--.box.box-default-->
        +      {{ Form::close() }}
        +  </div> <!--/.col-md-9-->
        +  <div class="col-md-3">
        +    <h4>About Custom Fields</h4>
        +    <p>Custom fields allow you to add arbitrary attributes to assets.</p>
        +  </div>
        +</div>
        +@stop
        +
        +@section('moar_scripts')
        +<script>
        +    $(document).ready(function(){
        +
        +        // Only display the custom format field if it's a custom format validation type
        +        $(".format").change(function(){
        +            $(this).find("option:selected").each(function(){
        +                if (($(this).attr("value")=="") &&  $('.format').prop("selectedIndex") != 0) {
        +                    $("#custom_regex").show();
        +                } else{
        +                    $("#custom_regex").hide();
        +                }
        +            });
        +        }).change();
        +
        +        // Only display the field element if the type is not text
        +        $(".field_element").change(function(){
        +            $(this).find("option:selected").each(function(){
        +                if($(this).attr("value")!="text"){
        +                    $("#field_values_text").show();
        +                } else{
        +                    $("#field_values_text").hide();
        +                }
        +            });
        +        }).change();
        +    });
        +
        +
        +
        +    // Checkbox handling
        +    $('#field_encrypted').on('ifChecked', function(event){
        +        $("#encrypt_warning").show();
        +    });
        +
        +    $('#field_encrypted').on('ifUnchecked', function(event){
        +        $("#encrypt_warning").hide();
        +    });
        +
        +</script>
        +@stop
        diff --git a/resources/views/custom_fields/fieldsets/edit.blade.php b/resources/views/custom_fields/fieldsets/edit.blade.php
        new file mode 100644
        index 0000000000..aae89a20a7
        --- /dev/null
        +++ b/resources/views/custom_fields/fieldsets/edit.blade.php
        @@ -0,0 +1,50 @@
        +@extends('layouts.default')
        +
        +{{-- Page title --}}
        +@section('title')
        +  {{ trans('admin/custom_fields/general.create_fieldset') }}
        +@parent
        +@stop
        +
        +@section('header_right')
        +<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
        +  {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +<div class="row">
        +  <div class="col-md-9">
        +
        +  {{ Form::open(['route' => 'fieldsets.store', 'class'=>'form-horizontal']) }}
        +    <!-- Horizontal Form -->
        +    <div class="box box-default">
        +      <div class="box-body">
        +
        +          <!-- Name -->
        +        <div class="form-group {{ $errors->has('name') ? ' has-error' : '' }}">
        +          <label for="name" class="col-md-4 control-label">
        +            {{ trans('admin/custom_fields/general.fieldset_name') }}
        +            <i class='fa fa-asterisk'></i>
        +          </label>
        +          <div class="col-md-6">
        +            <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name') }}" />
        +            {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +          </div>
        +        </div>
        +
        +      </div> <!-- /.box-body-->
        +      <div class="box-footer text-right">
        +        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +      </div>
        +
        +    </div> <!-- /.box.box-default-->
        +    {{ Form::close() }}
        +  </div>
        +  <div class="col-md-3">
        +    <h4>About Fieldsets</h4>
        +    <p>Fieldsets work like containers of the custom fields you've created. This allows you to group commonly used custom attributes together for easy associations. </p>
        +  </div>
        +</div>
        +@stop
        diff --git a/resources/views/custom_fields/fieldsets/view.blade.php b/resources/views/custom_fields/fieldsets/view.blade.php
        new file mode 100644
        index 0000000000..1a9f9f1ca6
        --- /dev/null
        +++ b/resources/views/custom_fields/fieldsets/view.blade.php
        @@ -0,0 +1,122 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +  {{ trans('admin/custom_fields/general.custom_fields') }}
        +@parent
        +@stop
        +
        +@section('header_right')
        +<a href="{{ route('fields.index') }}" class="btn btn-primary pull-right">
        +        {{ trans('general.back') }}</a>
        +@stop
        +
        +@section('content')
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +      <div class="box-header with-border">
        +        <h3 class="box-title">{{ $custom_fieldset->name }} {{ trans('admin/custom_fields/general.fieldset') }}</h3>
        +        <div class="box-tools pull-right">
        +        </div>
        +      </div><!-- /.box-header -->
        +      <div class="box-body">
        +        <table
        +          name="fieldsets" id="sort" class="table table-responsive todo-list">
        +          <thead>
        +            <tr>
        +              <th class="col-md-1"></th>
        +              <th class="col-md-1">{{ trans('admin/custom_fields/general.order') }}</th>
        +              <th class="col-md-3">{{ trans('admin/custom_fields/general.field_name') }}</th>
        +              <th class="col-md-2">{{ trans('admin/custom_fields/general.field_format') }}</th>
        +              <th class="col-md-2">{{ trans('admin/custom_fields/general.field_element') }}</th>
        +              <th class="col-md-1">{{ trans('admin/custom_fields/general.encrypted') }}</th>
        +              <th class="col-md-1">{{ trans('admin/custom_fields/general.required') }}</th>
        +              <th class="col-md-1"></th>
        +            </tr>
        +          </thead>
        +          <tbody>
        +            @foreach($custom_fieldset->fields as $field)
        +            <tr class="cansort" data-index="{{ $field->pivot->custom_field_id }}" id="item_{{ $field->pivot->custom_field_id }}">
        +              <td>
        +                <!-- drag handle -->
        +                <span class="handle">
        +                <i class="fa fa-ellipsis-v"></i>
        +                <i class="fa fa-ellipsis-v"></i>
        +                </span>
        +              </td>
        +              <td class="index">{{$field->pivot->order}}</td>
        +              <td>{{$field->name}}</td>
        +              <td>{{$field->format}}</td>
        +              <td>{{$field->element}}</td>
        +              <td>{{ $field->field_encrypted=='1' ?  trans('general.yes') : trans('general.no') }}</td>
        +              <td>{{$field->pivot->required ? "REQUIRED" : "OPTIONAL"}}</td>
        +              <td>
        +                <a href="{{ route('fields.disassociate', [$field,$custom_fieldset->id]) }}" class="btn btn-sm btn-danger">Remove</a>
        +              </td>
        +            </tr>
        +            @endforeach
        +          </tbody>
        +          <tfoot>
        +            <tr>
        +              <td colspan="5" class="text-right">
        +                {{ Form::open(['route' =>
        +                ["fieldsets.associate",$custom_fieldset->id],
        +                'class'=>'form-horizontal',
        +                'id' => 'ordering']) }}
        +                {{ Form::checkbox("required","on") }}
        +                {{ trans('admin/custom_fields/general.required') }}
        +                {{ Form::text("order",$maxid)}}
        +                {{ Form::select("field_id",$custom_fields_list,"",["onchange" => "$('#ordering').submit()"]) }}
        +                <span class="alert-msg"><?= $errors->first('field_id'); ?></span>
        +                {{ Form::close() }}
        +              </td>
        +            </tr>
        +          </tfoot>
        +        </table>
        +      </div> <!-- /.box-body-->
        +    </div> <!-- /.box.box-default-->
        +  </div> <!-- /.col-md-12-->
        +</div> <!--/.row-->
        +
        +@stop
        +
        +@section('moar_scripts')
        +  <script>
        +  var fixHelperModified = function(e, tr) {
        +      var $originals = tr.children();
        +      var $helper = tr.clone();
        +      $helper.children().each(function(index) {
        +          $(this).width($originals.eq(index).width())
        +      });
        +      return $helper;
        +  },
        +      updateIndex = function(e, ui) {
        +          $('td.index', ui.item.parent()).each(function (i) {
        +              $(this).html(i + 1);
        +              $.ajax({
        +                method: "POST",
        +                url: "{{ route('api.customfields.order', $custom_fieldset->id)  }}",
        +                headers: {
        +                    "X-Requested-With": 'XMLHttpRequest',
        +                    "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +                },
        +                data: $("#sort tbody").sortable('serialize', {
        +                }),
        +
        +                success: function(data) {
        +                    //console.log('ajax fired');
        +                    // do some stuff here
        +
        +
        +                }
        +      	    });
        +          });
        +      };
        +
        +  $("#sort tbody").sortable({
        +      helper: fixHelperModified,
        +      stop: updateIndex
        +  }).disableSelection();
        +</script>
        +@stop
        diff --git a/resources/views/custom_fields/index.blade.php b/resources/views/custom_fields/index.blade.php
        index c266f15c82..76eba2d236 100644
        --- a/resources/views/custom_fields/index.blade.php
        +++ b/resources/views/custom_fields/index.blade.php
        @@ -8,142 +8,125 @@
         
         @section('content')
         
        +<div class="row">
        +  <div class="col-md-9">
        +    <div class="box box-default">
         
        -  <div class="row">
        -    <div class="col-md-9">
        +      <div class="box-header with-border">
        +        <h3 class="box-title">{{ trans('admin/custom_fields/general.fieldsets') }}</h3>
        +        <div class="box-tools pull-right">
        +          <a href="{{ route('fieldsets.create') }}" class="btn btn-sm btn-primary" data-toggle="tooltip" title="Create a new fieldset">{{ trans('admin/custom_fields/general.create_fieldset') }}</a>
        +        </div>
        +      </div><!-- /.box-header -->
         
        -      <div class="box box-default">
        +      <div class="box-body">
        +        <table name="fieldsets" id="table" class="table table-responsive table-no-bordered">
        +          <thead>
        +            <tr>
        +              <th>{{ trans('general.name') }}</th>
        +              <th>{{ trans('admin/custom_fields/general.qty_fields') }}</th>
        +              <th>{{ trans('admin/custom_fields/general.used_by_models') }}</th>
        +              <th></th>
        +            </tr>
        +          </thead>
         
        -          <div class="box-header with-border">
        -            <h3 class="box-title">{{ trans('admin/custom_fields/general.fieldsets') }}</h3>
        -            <div class="box-tools pull-right">
        -              <a href="{{ route('admin.custom_fields.create') }}" class="btn btn-sm btn-primary" data-toggle="tooltip" title="Create a new fieldset">{{ trans('admin/custom_fields/general.create_fieldset') }}</a>
        -            </div>
        -          </div><!-- /.box-header -->
        -         <div class="box-body">
        -           <table
        -               name="fieldsets"
        -               id="table" class="table table-responsive table-no-bordered">
        -                   <thead>
        -                       <tr>
        -                         <th>{{ trans('general.name') }}</th>
        -                         <th>{{ trans('admin/custom_fields/general.qty_fields') }}</th>
        -                         <th>{{ trans('admin/custom_fields/general.used_by_models') }}</th>
        -                         <th></th>
        -                       </tr>
        -                   </thead>
        +          @if(isset($custom_fieldsets))
        +          <tbody>
        +            @foreach($custom_fieldsets AS $fieldset)
        +            <tr>
        +              <td>
        +                {{ link_to_route("fieldsets.show",$fieldset->name,['id' => $fieldset->id]) }}
        +              </td>
        +              <td>
        +                {{ $fieldset->fields->count() }}
        +              </td>
        +              <td>
        +                @foreach($fieldset->models as $model)
        +                  <a href="{{ route('models.show', $model->id) }}" class="label label-default">{{ $model->name }}</a>
         
        +                @endforeach
        +              </td>
        +              <td>
        +                {{ Form::open(['route' => array('fieldsets.destroy', $fieldset->id), 'method' => 'delete']) }}
        +                  @if($fieldset->models->count() > 0)
        +                  <button type="submit" class="btn btn-danger btn-sm disabled" disabled><i class="fa fa-trash"></i></button>
        +                  @else
        +                  <button type="submit" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></button>
        +                  @endif
        +                {{ Form::close() }}
        +              </td>
        +            </tr>
        +            @endforeach
        +          </tbody>
        +          @endif
        +        </table>
        +      </div><!-- /.box-body -->
        +    </div><!-- /.box.box-default -->
         
        -                   @if(isset($custom_fieldsets))
        -                   <tbody>
        -                     @foreach($custom_fieldsets AS $fieldset)
        -                       <tr>
        -                         <td>
        -                           {{ link_to_route("admin.custom_fields.show",$fieldset->name,['id' => $fieldset->id]) }}
        -                         </td>
        -                         <td>
        -                             {{ $fieldset->fields->count() }}
        -                         </td>
        -                         <td>
        -                             @foreach($fieldset->models as $model)
        -                               {{ link_to_route("view/model",$model->name,[$model->id]) }}
        -                             @endforeach
        -                         </td>
        -                         <td>
        -                             {{ Form::open(array('route' => array('admin.custom_fields.destroy', $fieldset->id), 'method' => 'delete')) }}
        -
        -                             @if($fieldset->models->count() > 0)
        -                               <button type="submit" class="btn btn-danger btn-sm disabled" disabled><i class="fa fa-trash"></i></button>
        -                             @else
        -                               <button type="submit" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></button>
        -                             @endif
        -                             {{ Form::close() }}
        -                         </td>
        -                       </tr>
        -                     @endforeach
        -                   @endif
        -
        -                 </tbody>
        -               </table>
        -
        -        </div><!-- /.box-body -->
        -      </div><!-- /.box -->
        -
        -    </div>
        -    <!-- side address column -->
        -    <div class="col-md-3">
        -        <h4>{{ trans('admin/custom_fields/general.about_fieldsets_title') }}</h4>
        -        <p>{{ trans('admin/custom_fields/general.about_fieldsets_text') }} </p>
        -
        -    </div>
        -</div>
        +  </div> <!-- .col-md-9-->
        +  <!-- side address column -->
        +  <div class="col-md-3">
        +    <h4>{{ trans('admin/custom_fields/general.about_fieldsets_title') }}</h4>
        +    <p>{{ trans('admin/custom_fields/general.about_fieldsets_text') }} </p>
        +  </div>
        +</div> <!-- .row-->
         
         <div class="row">
           <div class="col-md-9">
        -
             <div class="box box-default">
        -
        -        <div class="box-header with-border">
        -          <h3 class="box-title">{{ trans('admin/custom_fields/general.custom_fields') }}</h3>
        -          <div class="box-tools pull-right">
        -            <a href="{{ route('admin.custom_fields.create-field') }}" class="btn btn-sm btn-primary" data-toggle="tooltip" title="Create a new custom field">{{ trans('admin/custom_fields/general.create_field') }}</a>
        -          </div>
        -        </div><!-- /.box-header -->
        -       <div class="box-body">
        -
        -         <table
        -         name="fieldsets"
        -         id="table" class="table table-responsive table-no-bordered">
        -             <thead>
        -                 <tr>
        -                     <th>{{ trans('general.name') }}</th>
        -                     <th>{{ trans('admin/custom_fields/general.field_format') }}</th>
        -                     <th>{{ trans('admin/custom_fields/general.field_element_short') }}</th>
        -                     <th>{{ trans('admin/custom_fields/general.fieldsets') }}</th>
        -                     <th></th>
        -                 </tr>
        -             </thead>
        -             <tbody>
        -
        -             @foreach($custom_fields AS $field)
        -               <tr>
        -                 <td>{{ $field->name }}</td>
        -                 <td>{{ $field->format }}</td>
        -                 <td>{{ $field->element }}</td>
        -                 <td>
        -                   @foreach($field->fieldset as $fieldset)
        -                   {{link_to_route("admin.custom_fields.show",$fieldset->name,[$fieldset->id])}}
        -                   @endforeach
        -               </td>
        -               <td>
        -                 {{ Form::open(array('route' => array('admin.custom_fields.delete-field', $field->id), 'method' => 'delete')) }}
        -
        -                 @if($field->fieldset->count()>0)
        -                   <button type="submit" class="btn btn-danger btn-sm disabled" disabled><i class="fa fa-trash"></i></button>
        -                 @else
        -                   <button type="submit" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></button>
        -                 @endif
        -                 {{ Form::close() }}
        -                 </td>
        -
        -               </tr>
        -               @endforeach
        -
        -
        -
        -
        -           </tbody>
        -         </table>
        +      <div class="box-header with-border">
        +        <h3 class="box-title">{{ trans('admin/custom_fields/general.custom_fields') }}</h3>
        +        <div class="box-tools pull-right">
        +          <a href="{{ route('fields.create') }}" class="btn btn-sm btn-primary" data-toggle="tooltip" title="Create a new custom field">{{ trans('admin/custom_fields/general.create_field') }}</a>
        +        </div>
        +      </div><!-- /.box-header -->
        +      <div class="box-body">
        +        <table name="fieldsets" id="table" class="table table-responsive table-no-bordered">
        +          <thead>
        +            <tr>
        +              <th>{{ trans('general.name') }}</th>
        +              <th>Help Text</th>
        +              <th>DB Field</th>
        +              <th>{{ trans('admin/custom_fields/general.field_format') }}</th>
        +              <th>{{ trans('admin/custom_fields/general.field_element_short') }}</th>
        +              <th>{{ trans('admin/custom_fields/general.fieldsets') }}</th>
        +              <th></th>
        +            </tr>
        +          </thead>
        +          <tbody>
        +            @foreach($custom_fields as $field)
        +            <tr>
        +              <td>{{ $field->name }}</td>
        +              <td>{{ $field->help_text }}</td>
        +              <td>{{ $field->convertUnicodeDbSlug() }}</td>
        +              <td>{{ $field->format }}</td>
        +              <td>{{ $field->element }}</td>
        +              <td>
        +                @foreach($field->fieldset as $fieldset)
        +                  <a href="{{ route('fieldsets.show', $fieldset->id) }}" class="label label-default">{{ $fieldset->name }}</a>
        +                @endforeach
        +              </td>
        +              <td>
        +                {{ Form::open(array('route' => array('fields.destroy', $field->id), 'method' => 'delete')) }}
        +                <nobr>
        +                <a href="{{ route('fields.edit', $field->id) }}" class="btn btn-warning btn-sm"><i class="fa fa-pencil"></i></a>
         
         
        +                @if($field->fieldset->count()>0)
        +                <button type="submit" class="btn btn-danger btn-sm disabled" disabled><i class="fa fa-trash"></i></button>
        +                @else
        +                <button type="submit" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></button>
        +                @endif
        +                {{ Form::close() }}
        +                </nobr>
        +              </td>
        +            </tr>
        +            @endforeach
        +          </tbody>
        +        </table>
               </div><!-- /.box-body -->
             </div><!-- /.box -->
        -
        -  </div>
        -
        -
        -
        -    </div>
        +  </div> <!-- /.col-md-9-->
         </div>
         
         @stop
        diff --git a/resources/views/custom_fields/show.blade.php b/resources/views/custom_fields/show.blade.php
        deleted file mode 100644
        index 082ff02ad0..0000000000
        --- a/resources/views/custom_fields/show.blade.php
        +++ /dev/null
        @@ -1,128 +0,0 @@
        -@extends('layouts/default')
        -
        -{{-- Page title --}}
        -@section('title')
        -  {{ trans('admin/custom_fields/general.custom_fields') }}
        -@parent
        -@stop
        -
        -@section('header_right')
        -    <a href="{{ route('admin.custom_fields.index') }}" class="btn btn-primary pull-right">
        -        {{ trans('general.back') }}</a>
        -@stop
        -
        -
        -
        -@section('content')
        -
        -
        -
        -  <div class="row">
        -    <div class="col-md-12">
        -
        -      <div class="box box-default">
        -
        -          <div class="box-header with-border">
        -            <h3 class="box-title">{{ $custom_fieldset->name }} {{ trans('admin/custom_fields/general.fieldset') }}</h3>
        -            <div class="box-tools pull-right">
        -
        -            </div>
        -          </div><!-- /.box-header -->
        -         <div class="box-body">
        -
        -           <table
        -           name="fieldsets"
        -           id="sort" class="table table-responsive todo-list">
        -               <thead>
        -                   <tr>
        -                     <th class="col-md-1"></th>
        -                     <th class="col-md-1">{{ trans('admin/custom_fields/general.order') }}</th>
        -                     <th class="col-md-3">{{ trans('admin/custom_fields/general.field_name') }}</th>
        -                     <th class="col-md-2">{{ trans('admin/custom_fields/general.field_format') }}</th>
        -                     <th class="col-md-2">{{ trans('admin/custom_fields/general.field_element') }}</th>
        -                     <th class="col-md-1">{{ trans('admin/custom_fields/general.encrypted') }}</th>
        -                     <th class="col-md-1">{{ trans('admin/custom_fields/general.required') }}</th>
        -                     <th class="col-md-1"></th>
        -                   </tr>
        -               </thead>
        -               <tfoot>
        -                   <tr>
        -                     <td colspan="5" class="text-right">
        -                       {{ Form::open(['route' => ["admin.custom_fields.associate",$custom_fieldset->id], 'class'=>'form-horizontal', 'id' => 'ordering']) }}
        -                       {{ Form::checkbox("required","on") }}
        -                       {{ trans('admin/custom_fields/general.required') }}
        -                       {{ Form::text("order",$maxid)}}
        -                       {{ Form::select("field_id",$custom_fields_list,"",["onchange" => "$('#ordering').submit()"]) }}
        -                       <span class="alert-msg"><?= $errors->first('field_id'); ?></span>
        -
        -                     </td>
        -                   </tr>
        -               </tfoot>
        -               <tbody>
        -                 @foreach($custom_fieldset->fields as $field)
        -                 <tr class="cansort" data-index="{{ $field->pivot->custom_field_id }}" id="item_{{ $field->pivot->custom_field_id }}">
        -                   <td>
        -                     <!-- drag handle -->
        -                         <span class="handle">
        -                           <i class="fa fa-ellipsis-v"></i>
        -                           <i class="fa fa-ellipsis-v"></i>
        -                         </span>
        -                       </td>
        -                   <td class="index">{{$field->pivot->order}}</td>
        -                   <td>{{$field->name}}</td>
        -                   <td>{{$field->format}}</td>
        -                   <td>{{$field->element}}</td>
        -                     <td>{{ $field->field_encrypted=='1' ?  trans('general.yes') : trans('general.no') }}</td>
        -                   <td>{{$field->pivot->required ? "REQUIRED" : "OPTIONAL"}}</td>
        -                   <td><a href="{{ route('admin.custom_fields.disassociate', [$field,$custom_fieldset->id]) }}" class="btn btn-sm btn-danger">Remove</a></td>
        -                 </tr>
        -                 @endforeach
        -               </tbody>
        -         </table>
        -
        -         </div>
        -      </div>
        -  </div>
        -</div>
        -
        -
        -</div>
        -
        -
        -@section('moar_scripts')
        -  <script>
        -  var fixHelperModified = function(e, tr) {
        -      var $originals = tr.children();
        -      var $helper = tr.clone();
        -      $helper.children().each(function(index) {
        -          $(this).width($originals.eq(index).width())
        -      });
        -      return $helper;
        -  },
        -      updateIndex = function(e, ui) {
        -          $('td.index', ui.item.parent()).each(function (i) {
        -              $(this).html(i + 1);
        -              $.ajax({
        -                method: "POST",
        -                url: "{{ route('api.customfields.order', $custom_fieldset->id)  }}",
        -                data: $("#sort tbody").sortable('serialize', {
        -                }),
        -
        -                success: function(data) {
        -                    //console.log('ajax fired');
        -                    // do some stuff here
        -
        -
        -                }
        -      	    });
        -          });
        -      };
        -
        -  $("#sort tbody").sortable({
        -      helper: fixHelperModified,
        -      stop: updateIndex
        -  }).disableSelection();
        -</script>
        -
        -@stop
        -@stop
        diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php
        index 15aef39014..d39470ada9 100755
        --- a/resources/views/dashboard.blade.php
        +++ b/resources/views/dashboard.blade.php
        @@ -10,189 +10,330 @@
         {{-- Page content --}}
         @section('content')
         
        -<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/morris.css') }}">
         <div class="row">
        +  <!-- panel -->
        +  <div class="col-lg-3 col-xs-6">
        +    <!-- small box -->
        +    <div class="small-box bg-teal">
        +      <div class="inner">
        +        <h3>{{ number_format($counts['asset']) }}</h3>
        +        <p>{{ trans('general.total_assets') }}</p>
        +      </div>
        +      <div class="icon">
        +        <i class="fa fa-barcode"></i>
        +      </div>
        +      @can('index', \App\Models\Asset::class)
        +        <a href="{{ route('hardware.index') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        +      @endcan
        +    </div>
        +  </div><!-- ./col -->
         
        -      <!-- panel -->
        -      <div class="col-lg-3 col-xs-6">
        -        <!-- small box -->
        -        <div class="small-box bg-teal">
        -          <div class="inner">
        -            <h3>{{ number_format(\App\Models\Asset::assetcount()) }}</h3>
        -            <p>{{ trans('general.total_assets') }}</p>
        -          </div>
        -          <div class="icon">
        -            <i class="fa fa-barcode"></i>
        -          </div>
        -            @can('assets.view')
        -                <a href="{{ route('hardware') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        -             @endcan
        -        </div>
        -      </div><!-- ./col -->
        +  <div class="col-lg-3 col-xs-6">
        +    <!-- small box -->
        +    <div class="small-box bg-maroon">
        +      <div class="inner">
        +        <h3>{{ number_format($counts['license']) }}</h3>
        +        <p>{{ trans('general.total_licenses') }}</p>
        +      </div>
        +      <div class="icon">
        +        <i class="fa fa-floppy-o"></i>
        +      </div>
        +        @can('view', \App\Models\License::class)
        +          <a href="{{ route('licenses.index') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        +        @endcan
        +    </div>
        +  </div><!-- ./col -->
         
        -      <div class="col-lg-3 col-xs-6">
        -        <!-- small box -->
        -        <div class="small-box bg-maroon">
        -          <div class="inner">
        -            <h3>{{ number_format(\App\Models\License::assetcount()) }}</h3>
        -            <p>{{ trans('general.total_licenses') }}</p>
        -          </div>
        -          <div class="icon">
        -            <i class="fa fa-floppy-o"></i>
        -          </div>
        -            @can('licenses.view')
        -                <a href="{{ route('licenses') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        -            @endcan
        -        </div>
        -      </div><!-- ./col -->
         
        -      <div class="col-lg-3 col-xs-6">
        -        <!-- small box -->
        -        <div class="small-box bg-orange">
        -          <div class="inner">
        -            <h3> {{ number_format(\App\Models\Accessory::count()) }}</h3>
        -              <p>{{ trans('general.total_accessories') }}</p>
        -          </div>
        -          <div class="icon">
        -            <i class="fa fa-keyboard-o"></i>
        -          </div>
        -            @can('accessories.view')
        -                <a href="{{ route('accessories') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        -            @endcan
        -        </div>
        -      </div><!-- ./col -->
        -
        -      <div class="col-lg-3 col-xs-6">
        -        <!-- small box -->
        -        <div class="small-box bg-purple">
        -          <div class="inner">
        -            <h3> {{ number_format(\App\Models\Consumable::count()) }}</h3>
        -              <p>{{ trans('general.total_consumables') }}</p>
        -          </div>
        -          <div class="icon">
        -            <i class="fa fa-tint"></i>
        -          </div>
        -            @can('consumables.view')
        -                <a href="{{ route('consumables') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        -            @endcan
        -        </div>
        -      </div><!-- ./col -->
        +  <div class="col-lg-3 col-xs-6">
        +    <!-- small box -->
        +    <div class="small-box bg-orange">
        +      <div class="inner">
        +        <h3> {{ number_format($counts['accessory']) }}</h3>
        +          <p>{{ trans('general.total_accessories') }}</p>
        +      </div>
        +      <div class="icon">
        +        <i class="fa fa-keyboard-o"></i>
        +      </div>
        +      @can('index', \App\Models\Accessory::class)
        +          <a href="{{ route('accessories.index') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        +      @endcan
        +    </div>
        +  </div><!-- ./col -->
         
        +  <div class="col-lg-3 col-xs-6">
        +    <!-- small box -->
        +    <div class="small-box bg-purple">
        +      <div class="inner">
        +        <h3> {{ number_format($counts['consumable']) }}</h3>
        +          <p>{{ trans('general.total_consumables') }}</p>
        +      </div>
        +      <div class="icon">
        +        <i class="fa fa-tint"></i>
        +      </div>
        +      @can('index', \App\Models\Consumable::class)
        +        <a href="{{ route('consumables.index') }}" class="small-box-footer">{{ trans('general.moreinfo') }} <i class="fa fa-arrow-circle-right"></i></a>
        +      @endcan
        +    </div>
        +  </div><!-- ./col -->
         </div>
         
        +@if ($counts['grand_total'] == 0)
        +
        +    <div class="row">
        +        <div class="col-md-12">
        +            <div class="box">
        +                <div class="box-header with-border">
        +                    <h3 class="box-title">This is your dashboard. There are many like it, but this one is yours.</h3>
        +                </div>
        +                <!-- /.box-header -->
        +                <div class="box-body">
        +                    <div class="row">
        +                        <div class="col-md-12">
        +
        +                            <div class="progress">
        +                                <div class="progress-bar progress-bar-yellow" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%">
        +                                    <span class="sr-only">60% Complete (warning)</span>
        +                                </div>
        +                            </div>
        +
        +
        +                            <p><strong>It looks like you haven't added anything yet, so we don't have anything awesome to display. Get started by adding some assets, accessories, consumables, or licenses now!</strong></p>
        +
        +                        </div>
        +                    </div>
        +                    <div class="row">
        +                        <div class="col-md-3">
        +                            @can('create', \App\Models\Asset::class)
        +                            <a class="btn bg-teal" style="width: 100%" href="{{ route('hardware.create') }}">New Asset</a>
        +                            @endcan
        +                        </div>
        +                        <div class="col-md-3">
        +                            @can('create', \App\Models\License::class)
        +                                <a class="btn bg-maroon" style="width: 100%" href="{{ route('licenses.create') }}">New License</a>
        +                            @endcan
        +                        </div>
        +                        <div class="col-md-3">
        +                            @can('create', \App\Models\Accessory::class)
        +                                <a class="btn bg-orange" style="width: 100%" href="{{ route('accessories.create') }}">New Accessory</a>
        +                            @endcan
        +                        </div>
        +                        <div class="col-md-3">
        +                            @can('create', \App\Models\Consumable::class)
        +                                <a class="btn bg-purple" style="width: 100%" href="{{ route('consumables.create') }}">New Consumable</a>
        +                            @endcan
        +                        </div>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +
        +@else
         
         <!-- recent activity -->
        -  <div class="row">
        -    <div class="col-md-9">
        -        <div class="box">
        -          <div class="box-header with-border">
        -            <h3 class="box-title">{{ trans('general.recent_activity') }}</h3>
        -            <div class="box-tools pull-right">
        -                <a href="{{ route('reports/activity') }}"><i class="fa fa-ellipsis-h"></i></a>
        -            </div>
        -          </div><!-- /.box-header -->
        -          <div class="box-body">
        -            <div class="row">
        -              <div class="col-md-12">
        -               <div class="table-responsive">
        -                <table
        -                    class="table table-striped"
        -                    name="activityReport"
        -                    id="table"
        -                    data-url="{{route('api.activity.list', ['limit' => 20]) }}">
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box">
        +      <div class="box-header with-border">
        +        <h3 class="box-title">{{ trans('general.recent_activity') }}</h3>
        +        <div class="box-tools pull-right">
        +            <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
        +            </button>
        +        </div>
        +      </div><!-- /.box-header -->
        +      <div class="box-body">
        +        <div class="row">
        +          <div class="col-md-12">
        +            <div class="table-responsive">
        +              <table
        +                class="table table-striped snipe-table"
        +                name="activityReport"
        +                id="table"
        +                data-sort-order="desc"
        +                data-height="400"
        +                data-url="{{ route('api.activity.index', ['limit' => 25]) }}">
                         <thead>
        -                    <tr>
        -                        <th data-field="icon" style="width: 40px;" class="hidden-xs"></th>
        -                        <th class="col-sm-2" data-field="created_at">{{ trans('general.date') }}</th>
        -                        <th class="col-sm-2" data-field="admin">{{ trans('general.admin') }}</th>
        -                        <th class="col-sm-2" data-field="action_type">{{ trans('general.action') }}</th>
        -                        <th class="col-sm-4" data-field="item">{{ trans('general.item') }}</th>
        -                        <th class="col-sm-2" data-field="target">To</th>
        -                    </tr>
        +                  <tr>
        +                    <th data-field="icon" style="width: 40px;" class="hidden-xs" data-formatter="iconFormatter"></th>
        +                    <th class="col-sm-3" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.date') }}</th>
        +                    <th class="col-sm-2" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
        +                    <th class="col-sm-2" data-field="action_type">{{ trans('general.action') }}</th>
        +                    <th class="col-sm-3" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
        +                    <th class="col-sm-2" data-field="target" data-formatter="polymorphicItemFormatter">{{ trans('general.target') }}</th>
        +                  </tr>
                         </thead>
        +              </table>
         
        -                </table>
        -               </div><!-- /.responsive -->
        -              </div><!-- /.col -->
        -            </div><!-- /.row -->
        -          </div><!-- ./box-body -->
        -        </div><!-- /.box -->
        -    </div>
        -      <div class="col-md-3">
        -          <div class="box box-default">
        -              <div class="box-header with-border">
        -                  <h3 class="box-title">{{ trans('general.assets') }}</h3>
        -
        -                  <div class="box-tools pull-right">
        -                      <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
        -                      </button>
        -                  </div>
        -              </div>
        -              <!-- /.box-header -->
        -              <div class="box-body">
        -                  <div class="row">
        -                      <div class="col-md-12">
        -                          <div class="chart-responsive">
        -                              <canvas id="statusPieChart" height="150"></canvas>
        -                          </div>
        -                          <!-- ./chart-responsive -->
        -                      </div>
        -
        -                      <!-- /.col -->
        -                  </div>
        -                  <!-- /.row -->
        -              </div>
        +            </div><!-- /.responsive -->
        +          </div><!-- /.col -->
        +          <div class="col-md-12 text-center" style="padding-top: 10px;">
        +            <a href="{{ route('reports.activity') }}" class="btn btn-primary btn-sm" style="width: 100%">View All</a>
                   </div>
        -          <!-- /.box -->
        -      </div>
        -    </div>
        +        </div><!-- /.row -->
        +      </div><!-- ./box-body -->
        +    </div><!-- /.box -->
        +  </div>
         
        +</div> <!--/row-->
        +<div class="row">
        +    <div class="col-md-6">
        +        <div class="box box-default" style="min-height: 400px;">
        +            <div class="box-header with-border">
        +                <h3 class="box-title">{{ trans('general.assets') }} by Status</h3>
        +                <div class="box-tools pull-right">
        +                    <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
        +                    </button>
        +                </div>
        +            </div>
        +            <!-- /.box-header -->
        +            <div class="box-body">
        +                <div class="row">
        +                    <div class="col-md-12">
        +                        <div class="chart-responsive">
        +                            <canvas id="statusPieChart" height="120"></canvas>
        +                        </div> <!-- ./chart-responsive -->
        +                    </div> <!-- /.col -->
        +                </div> <!-- /.row -->
        +            </div><!-- /.box-body -->
        +        </div> <!-- /.box -->
        +    </div>
        +    <div class="col-md-6">
        +
        +        <!-- Categories -->
        +        <div class="box box-default">
        +            <div class="box-header with-border">
        +                <h3 class="box-title">Asset {{ trans('general.categories') }}</h3>
        +                <div class="box-tools pull-right">
        +                    <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
        +                    </button>
        +                </div>
        +            </div>
        +            <!-- /.box-header -->
        +            <div class="box-body">
        +                <div class="row">
        +                    <div class="col-md-12">
        +                        <table
        +                                class="table table-striped snipe-table"
        +                                name="categorySummary"
        +                                id="table"
        +                                data-height="440"
        +
        +                                data-url="{{ route('api.categories.index') }}">
        +                            <thead>
        +                            <tr>
        +                                <th class="col-sm-2" data-field="name" data-formatter="categoriesLinkFormatter">{{ trans('general.name') }}</th>
        +                                <th class="col-sm-2" data-field="assets_count"><i class="fa fa-barcode"></i></th>
        +                            </tr>
        +                            </thead>
        +                        </table>
        +                    </div> <!-- /.col -->
        +                    <div class="col-md-12 text-center" style="padding-top: 10px;">
        +                        <a href="{{ route('categories.index') }}" class="btn btn-primary btn-sm" style="width: 100%">View All</a>
        +                    </div>
        +                </div> <!-- /.row -->
        +
        +            </div><!-- /.box-body -->
        +        </div> <!-- /.box -->
        +    </div>
        +</div>
        +
        +@endif
        +
        +
        +@stop
         
         @section('moar_scripts')
        -<script src="{{ asset('assets/js/plugins/chartjs/Chart.min.js') }}"></script>
        +@include ('partials.bootstrap-table', ['simple_view' => true])
        +
        +@if ($snipeSettings->load_remote=='1')
        +    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
        +@else
        +    <script src="{{ asset('js/plugins/chartjs/Chart.min.js') }}"></script>
        +@endif
        +
        +
         <script>
         
         
        +
        +
        +        /* ChartJS
        +         * -------
        +         */
        +
        +        // -----------------------
        +        // - LINE CHART -
        +        // -----------------------
        +
        +
        +
        +        //var ctx = document.getElementById('salesChart').getContext("2d")
        +        //var myChart = new Chart(ctx, {
        +         //   type: 'line'
        +        //});
        +
        +
        +        //$.ajax({
        +        //    type: 'GET',
        +        //    url: '{{  route('api.statuslabels.assets.bytype') }}',
        +        //    headers: {
        +        //        "X-Requested-With": 'XMLHttpRequest',
        +        //        "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +        //    },
        +
        +        //    dataType: 'json',
        +        //   success: function (data) {
        +        //       var ctx = new Chart(ctx,{
        +        //          type: 'line',
        +        //            data: data,
        +        //            options: lineOptions
        +        //        });
        +        //    },
        +        //    error: function (data) {
        +       //         window.location.reload(true);
        +       //     }
        +       // });
        +
        +
        +
        +
        +
        +  // ---------------------------
        +  // - END MONTHLY SALES CHART -
        +  // ---------------------------
        +
        +
             var pieChartCanvas = $("#statusPieChart").get(0).getContext("2d");
             var pieChart = new Chart(pieChartCanvas);
             var ctx = document.getElementById("statusPieChart");
         
         
        -    $.get('{{  route('api.statuslabels.assets') }}', function (data) {
        -        var myPieChart = new Chart(ctx,{
         
        -            type: 'doughnut',
        -            data: data,
        -            options: pieOptions
        -        });
        -       // document.getElementById('my-doughnut-legend').innerHTML = myPieChart.generateLegend();
        +    $.ajax({
        +        type: 'GET',
        +        url: '{{  route('api.statuslabels.assets.bytype') }}',
        +        headers: {
        +            "X-Requested-With": 'XMLHttpRequest',
        +            "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +        },
        +
        +        dataType: 'json',
        +        success: function (data) {
        +            var myPieChart = new Chart(ctx,{
        +
        +                type: 'doughnut',
        +                data: data,
        +                options: pieOptions
        +            });
        +        },
        +        error: function (data) {
        +            window.location.reload(true);
        +        }
             });
         
         
        -
        -
        -
         </script>
         
        -    <script src="{{ asset('assets/js/bootstrap-table.js') }}"></script>
        -    <script src="{{ asset('assets/js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        -    <script type="text/javascript">
        -        $('#table').bootstrapTable({
        -            classes: 'table table-responsive table-no-bordered',
        -            undefinedText: '',
        -            iconsPrefix: 'fa',
        -            showRefresh: false,
        -            search: false,
        -            pagination: false,
        -            sidePagination: 'server',
        -            sortable: false,
        -            showMultiSort: false,
        -            cookie: false,
        -            mobileResponsive: true,
        -        });
        -
        -    </script>
        -@stop
        -
         
         @stop
        diff --git a/resources/views/departments/edit.blade.php b/resources/views/departments/edit.blade.php
        new file mode 100644
        index 0000000000..7412a8d126
        --- /dev/null
        +++ b/resources/views/departments/edit.blade.php
        @@ -0,0 +1,38 @@
        +@extends('layouts/edit-form', [
        +    'createText' => trans('admin/departments/table.create') ,
        +    'updateText' => trans('admin/departments/table.update'),
        +    'helpTitle' => trans('admin/departments/table.about_locations_title'),
        +    'helpText' => trans('admin/departments/table.about_locations'),
        +    'formAction' => ($item) ? route('departments.update', ['department' => $item->id]) : route('departments.store'),
        +])
        +
        +{{-- Page content --}}
        +@section('inputFields')
        +
        +    @include ('partials.forms.edit.name', ['translated_name' => trans('admin/departments/table.name')])
        +
        +    @include ('partials.forms.edit.company')
        +
        +    <!-- Manager -->
        +    <div class="form-group {{ $errors->has('manager_id') ? 'has-error' : '' }}">
        +        <label class="col-md-3 control-label" for="manager_id">{{ trans('admin/users/table.manager') }}</label>
        +        <div class="col-md-8">
        +            {{ Form::select('manager_id', $manager_list , Input::old('manager_id', $item->manager_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        +            {!! $errors->first('manager_id', '<span class="alert-msg">:message</span>') !!}
        +        </div>
        +    </div>
        +
        +    <!-- Location -->
        +    <div class="form-group {{ $errors->has('location_id') ? 'has-error' : '' }}">
        +        <label class="col-md-3 control-label" for="location_id">{{ trans('admin/departments/table.location') }}
        +        </label>
        +        <div class="col-md-8">
        +            {{ Form::select('location_id', $location_list , Input::old('location_id', $item->location_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        +            {!! $errors->first('location_id', '<span class="alert-msg">:message</span>') !!}
        +        </div>
        +    </div>
        +
        +
        +
        +@stop
        +
        diff --git a/resources/views/departments/index.blade.php b/resources/views/departments/index.blade.php
        new file mode 100644
        index 0000000000..4f9c884e49
        --- /dev/null
        +++ b/resources/views/departments/index.blade.php
        @@ -0,0 +1,53 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    {{ trans('general.departments') }}
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('departments.create') }}" class="btn btn-primary pull-right">
        +        {{ trans('general.create') }}</a>
        +@stop
        +{{-- Page content --}}
        +@section('content')
        +    <div class="row">
        +        <div class="col-md-12">
        +            <div class="box box-default">
        +                <div class="box-body">
        +                    <div class="table-responsive">
        +                        <table
        +                                name="locations"
        +                                class="table table-striped snipe-table"
        +                                id="table"
        +                                data-url="{{ route('api.departments.index') }}"
        +                                data-cookie="true"
        +                                data-click-to-select="true"
        +                                data-cookie-id-table="departmentsTable-{{ config('version.hash_version') }}">
        +                            <thead>
        +                            <tr>
        +                                <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        +                                <th data-sortable="true" data-field="company" data-visible="false" data-formatter="companiesLinkObjFormatter">{{ trans('general.company') }}</th>
        +
        +                                <th data-sortable="true" data-formatter="departmentsLinkFormatter" data-field="name" data-searchable="false">{{ trans('admin/departments/table.name') }}</th>
        +                                <th data-sortable="false" data-formatter="usersLinkObjFormatter" data-field="manager" data-searchable="false">{{ trans('admin/departments/table.manager') }}</th>
        +                                <th data-sortable="false" data-field="users_count" data-searchable="false">{{ trans('general.users') }}</th>
        +                                <th data-sortable="false" data-formatter="locationsLinkObjFormatter" data-field="location" data-searchable="false">{{ trans('admin/departments/table.location') }}</th>
        +                                <th data-sortable="false" data-formatter="departmentsActionsFormatter" data-field="actions" data-searchable="false">{{ trans('table.actions') }}</th>
        +
        +                            </tr>
        +                            </thead>
        +                        </table>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +
        +@stop
        +
        +@section('moar_scripts')
        +    @include ('partials.bootstrap-table', ['exportFile' => 'locations-export', 'search' => true])
        +
        +@stop
        diff --git a/resources/views/departments/view.blade.php b/resources/views/departments/view.blade.php
        new file mode 100644
        index 0000000000..1fdcc0840e
        --- /dev/null
        +++ b/resources/views/departments/view.blade.php
        @@ -0,0 +1,53 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +
        +    {{ $department->name }}
        +    {{ trans('general.department') }}
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('departments.edit', ['department' => $department->id]) }}" class="btn btn-sm btn-primary pull-right">{{ trans('admin/departments/table.update') }} </a>
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <div class="row">
        +        <div class="col-md-12">
        +            <div class="box box-default">
        +                <div class="box-body">
        +                    <div class="row">
        +                        <div class="col-md-12">
        +                            <div class="table table-responsive">
        +                                <table
        +                                        name="location_users"
        +                                        id="table-users"
        +                                        class="table table-striped snipe-table"
        +                                        data-url="{{ route('api.users.index',['department_id'=> $department->id]) }}"
        +                                        data-cookie="true"
        +                                        data-click-to-select="true"
        +                                        data-cookie-id-table="department_usersDetailTable">
        +                                    <thead>
        +
        +                                </table>
        +                            </div>
        +                        </div>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +
        +@stop
        +
        +@section('moar_scripts')
        +    @include ('partials.bootstrap-table',
        +    ['exportFile' => 'departments-users-export',
        +    'search' => true,
        +    'columns' => \App\Presenters\UserPresenter::dataTableLayout()
        +])
        +
        +@stop
        diff --git a/resources/views/depreciations/edit.blade.php b/resources/views/depreciations/edit.blade.php
        index 70037f5121..7c3180be36 100755
        --- a/resources/views/depreciations/edit.blade.php
        +++ b/resources/views/depreciations/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/depreciations/general.create') ,
             'updateText' => trans('admin/depreciations/general.update'),
             'helpTitle' => trans('admin/depreciations/general.about_asset_depreciations'),
        -    'helpText' => trans('admin/depreciations/general.about_depreciations')
        +    'helpText' => trans('admin/depreciations/general.about_depreciations'),
        +    'formAction' => ($item) ? route('depreciations.update', ['depreciation' => $item->id]) : route('depreciations.store'),
         ])
         
         {{-- Page content --}}
        @@ -11,7 +12,8 @@
         @include ('partials.forms.edit.name', ['translated_name' => trans('admin/depreciations/general.depreciation_name')])
         <!-- Months -->
         <div class="form-group {{ $errors->has('months') ? ' has-error' : '' }}">
        -    <label for="months" class="col-md-3 control-label">{{ trans('admin/depreciations/general.number_of_months') }}
        +    <label for="months" class="col-md-3 control-label">
        +        {{ trans('admin/depreciations/general.number_of_months') }}
             </label>
             <div class="col-md-7{{  (\App\Helpers\Helper::checkIfRequired($item, 'months')) ? ' required' : '' }}">
                 <div class="col-md-2" style="padding-left:0px">
        diff --git a/resources/views/depreciations/index.blade.php b/resources/views/depreciations/index.blade.php
        index bfad07a5f4..991fec39b7 100755
        --- a/resources/views/depreciations/index.blade.php
        +++ b/resources/views/depreciations/index.blade.php
        @@ -7,7 +7,7 @@ Asset Depreciations
         @stop
         
         @section('header_right')
        -<a href="{{ route('create/depreciations') }}" class="btn btn-primary pull-right">
        +<a href="{{ route('depreciations.create') }}" class="btn btn-primary pull-right">
           {{ trans('general.create') }}</a>
         @stop
         
        @@ -24,7 +24,7 @@ Asset Depreciations
                   name="depreciations"
                   class="table table-striped snipe-table"
                   id="table"
        -          data-url="{{ route('api.depreciations.list') }}"
        +          data-url="{{ route('api.depreciations.index') }}"
                   data-cookie="true"
                   data-cookie-id-table="depreciationsTable-{{ config('version.hash_version') }}">
                     <thead>
        @@ -32,20 +32,20 @@ Asset Depreciations
                         <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
                         <th data-sortable="true" data-field="name">{{ trans('admin/depreciations/table.title') }}</th>
                         <th data-sortable="false" data-field="months">{{ trans('admin/depreciations/table.term') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions"  data-formatter="depreciationsActionsFormatter">{{ trans('table.actions') }}</th>
                       </tr>
                     </thead>
                   </table>
                 </div>
               </div>
             </div>
        -  </div>
        +  </div> <!-- /.col-md-9-->
         
         
           <!-- side address column -->
           <div class="col-md-3">
        -      <h4>{{ trans('admin/depreciations/general.about_asset_depreciations') }}</h4>
        -      <p>{{ trans('admin/depreciations/general.about_depreciations') }} </p>
        +    <h4>{{ trans('admin/depreciations/general.about_asset_depreciations') }}</h4>
        +    <p>{{ trans('admin/depreciations/general.about_depreciations') }} </p>
           </div>
         
         </div>
        diff --git a/resources/views/emails/accept-accessory.blade.php b/resources/views/emails/accept-accessory.blade.php
        index afd3c22872..f5d0bc1dc2 100644
        --- a/resources/views/emails/accept-accessory.blade.php
        +++ b/resources/views/emails/accept-accessory.blade.php
        @@ -54,7 +54,7 @@
         <p><blockquote>{!! $eula !!}</blockquote></p>
         
         @if ($require_acceptance==1)
        -<p><strong><a href="{{ config('app.url') }}/account/accept-asset/{{ $log_id }}">{{ trans('mail.i_have_read') }}</a></strong></p>
        +<p><strong><a href="{{ url('/') }}/account/accept-asset/{{ $log_id }}">{{ trans('mail.i_have_read') }}</a></strong></p>
         @endif
         
         <p>{{ $snipeSettings->site_name }}</p>
        diff --git a/resources/views/emails/accept-asset.blade.php b/resources/views/emails/accept-asset.blade.php
        index 8b8b5eba83..e87f6987b0 100755
        --- a/resources/views/emails/accept-asset.blade.php
        +++ b/resources/views/emails/accept-asset.blade.php
        @@ -84,7 +84,7 @@
         		<p><blockquote>{!! $eula !!}</blockquote></p>
         
         		@if ($require_acceptance==1)
        -			<p><strong><a href="{{ config('app.url') }}/account/accept-asset/{{ $log_id }}">{{ trans('mail.i_have_read') }}</a></strong></p>
        +			<p><strong><a href="{{ url('/') }}/account/accept-asset/{{ $log_id }}">{{ trans('mail.i_have_read') }}</a></strong></p>
         		@endif
         
         		<p>{{ $snipeSettings->site_name }}</p>
        diff --git a/resources/views/emails/asset-canceled.blade.php b/resources/views/emails/asset-canceled.blade.php
        index beb6a7f585..8ce2419d94 100644
        --- a/resources/views/emails/asset-canceled.blade.php
        +++ b/resources/views/emails/asset-canceled.blade.php
        @@ -2,9 +2,9 @@
         
         @section('content')
         
        -<p>{{ trans('mail.a_user_canceled') }} <a href="{{ config('app.url') }}"> {{ $snipeSettings->site_name }}</a>. </p>
        +<p>{{ trans('mail.a_user_canceled') }} <a href="{{ url('/') }}"> {{ $snipeSettings->site_name }}</a>. </p>
         
        -<p>{{ trans('mail.user') }} <a href="{{ config('app.url') }}/admin/users/{{ $user_id }}/view">{{ $requested_by }}</a><br>
        +<p>{{ trans('mail.user') }} <a href="{{ url('/') }}/admin/users/{{ $user_id }}/view">{{ $requested_by }}</a><br>
            {{ trans('mail.item') }} <a href="{{ $item_url }}">{{ $item_name }}</a> ({{ $item_type }}) <br>
            {{ trans('mail.canceled') }} {{ $requested_date }}
         </p>
        diff --git a/resources/views/emails/asset-requested.blade.php b/resources/views/emails/asset-requested.blade.php
        index c5999a19e6..b90b5a7b0a 100644
        --- a/resources/views/emails/asset-requested.blade.php
        +++ b/resources/views/emails/asset-requested.blade.php
        @@ -2,9 +2,9 @@
         
         @section('content')
         
        -<p>{{ trans('mail.a_user_requested') }} <a href="{{ config('app.url') }}"> {{ $snipeSettings->site_name }}</a>. </p>
        +<p>{{ trans('mail.a_user_requested') }} <a href="{{ url('/') }}"> {{ $snipeSettings->site_name }}</a>. </p>
         
        -<p>{{ trans('mail.user') }} <a href="{{ config('app.url') }}/admin/users/{{ $user_id }}/view">{{ $requested_by }}</a><br>
        +<p>{{ trans('mail.user') }} <a href="{{ url('/') }}/admin/users/{{ $user_id }}/view">{{ $requested_by }}</a><br>
            {{ trans('mail.item') }} <a href="{{ $item_url }}">{{ $item_name }}</a> ({{ $item_type }}) <br>
            {{ trans('mail.requested') }} {{ $requested_date }}
         @if ($item_quantity > 1)
        diff --git a/resources/views/emails/auth/reminder.blade.php b/resources/views/emails/auth/reminder.blade.php
        index d7ba2a808e..1adddf2d09 100755
        --- a/resources/views/emails/auth/reminder.blade.php
        +++ b/resources/views/emails/auth/reminder.blade.php
        @@ -7,7 +7,7 @@
                 <h2>{{ trans('mail.password_reset') }}</h2>
         
                 <div>
        -            {{ trans('mail.to_reset', ['web' => $snipeSettings->site_name]) }} {{ URL::to('password/reset', array($token)) }}.
        +            {{ trans('mail.to_reset', ['web' => $snipeSettings->site_name]) }} {{ url('password/reset', array($token)) }}.
                 </div>
             </body>
         </html>
        diff --git a/resources/views/emails/firstadmin.blade.php b/resources/views/emails/firstadmin.blade.php
        index 16f610de28..7a8397147e 100644
        --- a/resources/views/emails/firstadmin.blade.php
        +++ b/resources/views/emails/firstadmin.blade.php
        @@ -2,6 +2,6 @@
         
         {{ trans('mail.login_first_admin') }}
         
        -URL: {{ config('app.url') }}
        +URL: {{ url('/') }}
         {{ trans('mail.username') }} {{ $username }}
         {{ trans('mail.password') }} {{ $password }}
        diff --git a/resources/views/emails/low-inventory.blade.php b/resources/views/emails/low-inventory.blade.php
        index 7707c37cc3..62f5faee36 100644
        --- a/resources/views/emails/low-inventory.blade.php
        +++ b/resources/views/emails/low-inventory.blade.php
        @@ -15,7 +15,7 @@
                 @for($i=0; $count > $i; $i++)
                     <tr>
                         <td>
        -                    <a href="{{ config('app.url') }}/admin/{{ $data[$i]['type'] }}/{{ $data[$i]['id'] }}/view">{{ $data[$i]['name'] }}</a>
        +                    <a href="{{ url('/') }}/admin/{{ $data[$i]['type'] }}/{{ $data[$i]['id'] }}/view">{{ $data[$i]['name'] }}</a>
                         </td>
                         <td>{{ $data[$i]['type'] }}</td>
                         <td>{{ $data[$i]['remaining'] }}</td>
        diff --git a/resources/views/emails/send-login.blade.php b/resources/views/emails/send-login.blade.php
        index b34bef7695..e2f8b8451e 100644
        --- a/resources/views/emails/send-login.blade.php
        +++ b/resources/views/emails/send-login.blade.php
        @@ -5,7 +5,7 @@
         
         <p>{{ trans('mail.admin_has_created', ['web' => $snipeSettings->site_name]) }} </p>
         
        -<p>URL: <a href="{{ config('app.url') }}">{{ config('app.url') }}</a><br>
        +<p>URL: <a href="{{ url('/') }}">{{ url('/') }}</a><br>
         {{ trans('mail.login') }} {{ $username }} <br>
         {{ trans('mail.password') }} {{ $password }}
         </p>
        diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php
        index 86a6c1e2d7..567b6456de 100644
        --- a/resources/views/errors/403.blade.php
        +++ b/resources/views/errors/403.blade.php
        @@ -13,14 +13,14 @@
         
         
         <div class="row">
        -  <div class="col-md-12">
        +  <div class="col-md-8 col-md-offset-2">
         
        -    <div class="error-page" style="padding-top: 200px">
        -      <img src="{{ config('app.url') }}/assets/img/sad-panda.png" style="width: 200px; height: 200px;" class="pull-left">
        +    <div style="padding-top: 200px">
        +      <img src="{{ url('/') }}/img/sad-panda.png" style="width: 200px; height: 200px;" class="pull-left">
                     <div class="error-content">
                       <h3><i class="fa fa-warning text-yellow"></i> 403 Forbidden.</h3>
                       <p>
        -                Sad panda. You are not authorized to do the thing. Maybe <a href="{{ route('home') }}">return to the dashboard</a>, or contact your administrator.
        +                Sad panda. You are not authorized to do the thing. Maybe <a href="{{ url('/') }}">return to the dashboard</a>, or contact your administrator.
                       </p>
         
             </div>
        diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php
        index d92d7f9ce0..cb6390a6aa 100644
        --- a/resources/views/errors/404.blade.php
        +++ b/resources/views/errors/404.blade.php
        @@ -13,15 +13,15 @@
         
         
         <div class="row">
        -  <div class="col-md-12">
        +  <div class="col-md-8 col-md-offset-2">
         
        -    <div class="error-page" style="padding-top: 200px">
        -      <img src="{{ config('app.url') }}/assets/img/sad-panda.png" style="width: 200px; height: 200px;" class="pull-left">
        +    <div style="padding-top: 200px">
        +      <img src="{{ url('/') }}/img/sad-panda.png" style="width: 200px; height: 200px;" class="pull-left">
                     <div class="error-content">
                       <h3><i class="fa fa-warning text-yellow"></i> 404 Page not found.</h3>
                       <p>
                         Sad panda. We could not find the page you were looking for.
        -                You should maybe <a href="{{ route('home') }}">return to the dashboard</a>.
        +                You should maybe <a href="{{ url('/') }}">return to the dashboard</a>.
                       </p>
         
             </div>
        diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php
        index 4a4150592d..59bd3d8196 100644
        --- a/resources/views/errors/503.blade.php
        +++ b/resources/views/errors/503.blade.php
        @@ -1,47 +1,28 @@
        -<!DOCTYPE html>
        -<html>
        -    <head>
        -        <title>Be right back.</title>
        +@extends('layouts/basic')
         
        -        <link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">
        +{{-- Page title --}}
        +@section('title')
        +System Unavailable
        +@parent
        +@stop
         
        -        <style>
        -            html, body {
        -                height: 100%;
        -            }
        +{{-- Page content --}}
         
        -            body {
        -                margin: 0;
        -                padding: 0;
        -                width: 100%;
        -                color: #B0BEC5;
        -                display: table;
        -                font-weight: 100;
        -                font-family: 'Lato';
        -            }
        +@section('content')
         
        -            .container {
        -                text-align: center;
        -                display: table-cell;
        -                vertical-align: middle;
        -            }
         
        -            .content {
        -                text-align: center;
        -                display: inline-block;
        -            }
         
        -            .title {
        -                font-size: 72px;
        -                margin-bottom: 40px;
        -            }
        -        </style>
        -    </head>
        -    <body>
        -        <div class="container">
        -            <div class="content">
        -                <div class="title">Be right back.</div>
        -            </div>
        -        </div>
        -    </body>
        -</html>
        +<div class="row">
        +  <div class="col-md-8 col-md-offset-2">
        +
        +    <div style="padding-top: 200px">
        +      <img src="{{ url('/') }}/img/sad-panda.png" style="width: 200px; height: 200px;" class="pull-left">
        +            <div class="error-content">
        +              <h2><i class="fa fa-warning text-yellow"></i> System Unavailable</h2>
        +              <p>
        +                {!! json_decode(file_get_contents(storage_path('framework/down')), true)['message'] !!}
        +              </p>
        +
        +    </div>
        +</div>
        +@stop
        diff --git a/resources/views/groups/edit.blade.php b/resources/views/groups/edit.blade.php
        index f9840fd3b4..735163400f 100755
        --- a/resources/views/groups/edit.blade.php
        +++ b/resources/views/groups/edit.blade.php
        @@ -1,9 +1,9 @@
         @extends('layouts/edit-form', [
             'createText' => trans('admin/groups/titles.create') ,
             'updateText' => trans('admin/groups/titles.update'),
        -    'helpTitle' => trans('admin/groups/general.about_groups_title'),
        -    'helpText' => trans('admin/groups/general.about_groups_text'),
        -    'item' => $group
        +    'item' => $group,
        +    'formAction' => ($group !== null && $group->id !== null) ? route('groups.update', ['group' => $group->id]) : route('groups.store'),
        +
         ])
         @section('content')
         <style>
        @@ -18,40 +18,48 @@
         <!-- Name -->
         <div class="form-group {{ $errors->has('name') ? ' has-error' : '' }}">
             <label for="name" class="col-md-3 control-label">{{ trans('admin/groups/titles.group_name') }}
        -        <i class='fa fa-asterisk'></i></label>
        -        <div class="col-md-6 required">
        -            <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name', $group->name) }}" />
        -            {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -        </div>
        +        <i class='fa fa-asterisk'></i>
        +    </label>
        +    <div class="col-md-6 required">
        +        <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name', $group->name) }}" />
        +        {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
             </div>
        +</div>
        +
        +
        +    @foreach ($permissions as $area => $permission)
        +        @for ($i = 0; $i < count($permission); $i++)
         
        -    <div class="col-md-8 col-md-offset-3">
         
        -        @foreach ($permissions as $area => $permission)
        -            @for ($i = 0; $i < count($permission); $i++)
                     <?php
                     $permission_name = $permission[$i]['permission'];
                     ?>
        -                @if ($permission[$i]['display'])
        -                <h3>{{ $area }}: {{ $permission[$i]['label'] }}</h3>
        -                <p>{{ $permission[$i]['note'] }}</p>
        +            @if ($permission[$i]['display'])
        +                <div class="col-md-12 col-md-offset-2">
        +                    <h3>{{ $area }}: {{ $permission[$i]['label'] }}</h3>
        +                    <p>{{ $permission[$i]['note'] }}</p>
         
        -                <!-- radio -->
        -                <div class="form-group" style="padding-left: 15px;">
        +                    <!-- radio -->
        +                        <div class="form-group" style="padding-left: 15px;">
        +                        <label class="radio-padding col-md-3">
        +                            {{ Form::radio('permission['.$permission_name.']', 1,
        +                            (is_array($groupPermissions))
        +                            && (array_key_exists($permission_name, $groupPermissions)
        +                            && $groupPermissions[$permission_name]), ['class' => 'minimal']) }}
        +                            Grant
        +                        </label>
        +                        <label class="radio-padding col-md-3">
        +                            {{ Form::radio('permission['.$permission_name.']', 0, ((is_array($groupPermissions) && !array_key_exists($permission_name, $groupPermissions)) || !$groupPermissions[$permission_name]), ['class' => 'minimal']) }}
        +                            Deny
        +                        </label>
        +
        +                    </div>
        +                    <hr>
        +            </div>
        +
        +            @endif
        +        @endfor
        +    @endforeach
         
        -                    <label class="radio-padding">
        -                        {{ Form::radio('permission['.$permission_name.']', 1,
        -                        (array_key_exists($permission_name, $groupPermissions) && $groupPermissions[$permission_name]), ['class' => 'minimal']) }}
        -                        Grant
        -                    </label>
         
        -                    <label class="radio-padding">
        -                        {{ Form::radio('permission['.$permission_name.']', 0, (!array_key_exists($permission_name, $groupPermissions) || !$groupPermissions[$permission_name]), ['class' => 'minimal']) }}
        -                        Deny
        -                    </label>
        -                </div>
        -                <hr>
        -                @endif
        -            @endfor
        -        @endforeach
         @stop
        diff --git a/resources/views/groups/index.blade.php b/resources/views/groups/index.blade.php
        index 3c1b3dfc82..744b578f7e 100755
        --- a/resources/views/groups/index.blade.php
        +++ b/resources/views/groups/index.blade.php
        @@ -7,43 +7,40 @@
         @stop
         
         @section('header_right')
        -<a href="{{ route('create/group') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        +<a href="{{ route('groups.create') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
         @stop
         
         
         {{-- Content --}}
         @section('content')
        -
        -  <div class="row">
        -    <div class="col-md-12">
        -      <div class="box box-default">
        -        <div class="box-body">
        -
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +      <div class="box-body">
                 <div class="table-responsive">
        -
                   <table
                   name="groups"
                   class="table table-striped snipe-table"
                   id="table"
                   data-toggle="table"
        -          data-url="{{ route('api.groups.list') }}"
        +          data-url="{{ route('api.groups.index') }}"
                   data-cookie="true"
                   data-click-to-select="true"
                   data-cookie-id-table="userGroupDisplay-{{ config('version.hash_version') }}">
        -           <thead>
        -             <tr>
        +            <thead>
        +              <tr>
                        <th data-switchable="true" data-sortable="false" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
                        <th data-switchable="true" data-sortable="true" data-field="name" data-visible="true">{{ trans('admin/groups/table.name') }}</th>
        -               <th data-switchable="true" data-sortable="false" data-field="users" data-visible="true">{{ trans('admin/groups/table.users') }}</th>
        -               <th data-switchable="true" data-sortable="true" data-field="created_at" data-visible="true">{{ trans('general.created_at') }}</th>
        -               <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" >{{ trans('table.actions') }}</th>
        -             </tr>
        -           </thead>
        -       </table>
        -      </div>
        -    </div>
        -
        -</div>
        +               <th data-switchable="true" data-sortable="false" data-field="users_count" data-visible="true">{{ trans('admin/groups/table.users') }}</th>
        +               <th data-switchable="true" data-sortable="true" data-field="created_at" data-visible="true" data-formatter="createdAtFormatter">{{ trans('general.created_at') }}</th>
        +               <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions"   data-formatter="groupsActionsFormatter">{{ trans('table.actions') }}</th>
        +              </tr>
        +            </thead>
        +          </table>
        +        </div>
        +      </div> <!--.box-body-->
        +    </div> <!-- /.box.box-default-->
        +  </div> <!-- .col-md-12-->
         </div>
         @stop
         @section('moar_scripts')
        diff --git a/resources/views/groups/view.blade.php b/resources/views/groups/view.blade.php
        index 5374e5ef05..875d818aef 100644
        --- a/resources/views/groups/view.blade.php
        +++ b/resources/views/groups/view.blade.php
        @@ -13,8 +13,11 @@
         <div class="row header">
             <div class="col-md-12">
                 <a href="{{ route('update/group', $group->id) }}" class="btn-flat white pull-right">
        -        {{ trans('admin/groups/table.update') }}</a>
        -        <a href="{{ URL::to('admin/groups') }}" class="btn-flat gray pull-right" style="margin-right:5px;"><i class="fa fa-arrow-left icon-white"></i> {{ trans('general.back') }}</a>
        +            {{ trans('admin/groups/table.update') }}
        +        </a>
        +        <a href="{{ url('admin/groups') }}" class="btn-flat gray pull-right" style="margin-right:5px;">
        +            <i class="fa fa-arrow-left icon-white"></i> {{ trans('general.back') }}
        +        </a>
                 <h3 class="name"> {{ trans('admin/groups/titles.group_management') }} - {{ $group->name }}</h3>
             </div>
         </div>
        @@ -23,21 +26,20 @@
             <div class="row profile">
                 <div class="col-md-12 bio">
                     @if (count($users) > 0)
        -           <table id="example">
        -            <thead>
        -                <tr role="row">
        +            <table id="example">
        +                <thead>
        +                    <tr role="row">
                                 <th class="col-md-3">{{ trans('admin/groups/table.name') }}</th>
                             </tr>
                         </thead>
                         <tbody>
        -
                             @foreach ($users as $user)
                             <tr>
        -                        <td><a href="{{ route('view/user', $user->id) }}">{{ $user->first_name }} {{ $user->last_name }}</a></td>
        +                        <td>
        +                            <a href="{{ route('users.show', $user->id) }}">{{ $user->first_name }} {{ $user->last_name }}</a>
        +                        </td>
                             </tr>
                             @endforeach
        -
        -
                         </tbody>
                     </table>
         
        @@ -50,4 +52,6 @@
                     </div>
                     @endif
                 </div>
        +    </div> <!--.col-md-12-->
        +</div> <!--.user-profile-->
         @stop
        diff --git a/resources/views/hardware/audit.blade.php b/resources/views/hardware/audit.blade.php
        new file mode 100644
        index 0000000000..7fc9afdca0
        --- /dev/null
        +++ b/resources/views/hardware/audit.blade.php
        @@ -0,0 +1,91 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    {{ trans('general.audit') }}
        +    @parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +
        +        .input-group {
        +            padding-left: 0px !important;
        +        }
        +    </style>
        +
        +    <div class="row">
        +        <!-- left column -->
        +        <div class="col-md-7">
        +            <div class="box box-default">
        +                <form class="form-horizontal" method="post" action="" autocomplete="off">
        +                    <div class="box-header with-border">
        +                        <h3 class="box-title"> {{ trans('admin/hardware/form.tag') }} {{ $asset->asset_tag }}</h3>
        +                    </div>
        +                    <div class="box-body">
        +                    {{csrf_field()}}
        +                    @if ($asset->model->name)
        +                        <!-- Asset name -->
        +                            <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        +                                {{ Form::label('name', trans('admin/hardware/form.model'), array('class' => 'col-md-3 control-label')) }}
        +                                <div class="col-md-8">
        +                                    <p class="form-control-static">{{ $asset->model->name }}</p>
        +                                </div>
        +                            </div>
        +                    @endif
        +
        +                    <!-- Asset Name -->
        +                        <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        +                            {{ Form::label('name', trans('admin/hardware/form.name'), array('class' => 'col-md-3 control-label')) }}
        +                            <div class="col-md-8">
        +                                <p class="form-control-static">{{ $asset->name }}</p>
        +                            </div>
        +                        </div>
        +
        +                        <!-- Locations -->
        +                        <div id="location_id" class="form-group{{ $errors->has('location_id') ? ' has-error' : '' }}">
        +                            {{ Form::label('location_id', trans('general.location'), array('class' => 'col-md-3 control-label')) }}
        +                            <div class="col-md-9">
        +                                {{ Form::select('location_id', $locations_list , Input::old('location_id'), array('class'=>'select2', 'id'=>'location_id', 'style'=>'width:100%')) }}
        +
        +                                {!! $errors->first('location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Next Audit -->
        +                        <div class="form-group {{ $errors->has('next_audit_date') ? 'error' : '' }}">
        +                            {{ Form::label('name', trans('general.next_audit_date'), array('class' => 'col-md-3 control-label')) }}
        +                            <div class="col-md-9">
        +                                <div class="input-group date col-md-5" data-provide="datepicker" data-date-format="yyyy-mm-dd">
        +                                    <input type="text" class="form-control" placeholder="{{ trans('general.next_audit_date') }}" name="next_audit_date" id="next_audit_date" value="{{ Input::old('next_audit_date', $next_audit_date) }}">
        +                                    <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +                                </div>
        +                                {!! $errors->first('next_audit_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Note -->
        +                        <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        +                            {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
        +                            <div class="col-md-8">
        +                                <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $asset->note) }}</textarea>
        +                                {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +
        +                    </div> <!--/.box-body-->
        +                    <div class="box-footer">
        +                        <a class="btn btn-link" href="{{ URL::previous() }}"> {{ trans('button.cancel') }}</a>
        +                        <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.audit') }}</button>
        +                    </div>
        +                </form>
        +            </div>
        +        </div> <!--/.col-md-7-->
        +    </div>
        +@stop
        diff --git a/resources/views/hardware/bulk-checkout.blade.php b/resources/views/hardware/bulk-checkout.blade.php
        index 08823f1bc3..00390274ee 100644
        --- a/resources/views/hardware/bulk-checkout.blade.php
        +++ b/resources/views/hardware/bulk-checkout.blade.php
        @@ -6,242 +6,107 @@
         @parent
         @stop
         
        -
         {{-- Page content --}}
         @section('content')
         
         <style>
        -.input-group {
        +  .input-group {
             padding-left: 0px !important;
        -}
        +  }
         </style>
         
         
         <div class="row">
        +  <!-- left column -->
        +  <div class="col-md-7">
        +    <div class="box box-default">
        +      <div class="box-header with-border">
        +        <h3 class="box-title"> {{ trans('admin/hardware/form.tag') }} </h3>
        +      </div>
        +      <div class="box-body">
        +        <form class="form-horizontal" method="post" action="" autocomplete="off">
        +          {{ csrf_field() }}
         
        -    <!-- left column -->
        -    <div class="col-md-7">
        +          <!-- User -->
        +          <div id="assigned_user" class="form-group{{ $errors->has('assigned_to') ? ' has-error' : '' }}">
         
        -          <div class="box box-default">
        -              <div class="box-header with-border">
        -                  <h3 class="box-title"> {{ trans('admin/hardware/form.tag') }} </h3>
        -              </div>
        -              <div class="box-body">
        -                <form class="form-horizontal" method="post" action="" autocomplete="off">
        -                <!-- CSRF Token -->
        -                <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +            {{ Form::label('assigned_to', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        +            <div class="col-md-7 required">
        +              {{ Form::select('assigned_to', $users_list , Input::old('assigned_to'), array('class'=>'select2', 'id'=>'assigned_to', 'style'=>'width:100%')) }}
         
        -
        -                    <!-- User -->
        -                    <div id="assigned_user" class="form-group{{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        -
        -                            {{ Form::label('assigned_to', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        -
        -                        <div class="col-md-7 required">
        -                            {{ Form::select('assigned_to', $users_list , Input::old('assigned_to'), array('class'=>'select2', 'id'=>'assigned_to', 'style'=>'width:100%')) }}
        -
        -                            {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                        </div>
        -                        <div class="col-md-1 col-sm-1 text-left">
        -                            <a href='#' data-toggle="modal"  data-target="#createModal" data-dependency="user" data-select='assigned_to' class="btn btn-sm btn-default">New</a>
        -                        </div>
        -                    </div>
        -
        -                    <!-- Checkout/Checkin Date -->
        -                  <div class="form-group {{ $errors->has('checkout_at') ? 'error' : '' }}">
        -
        -                      {{ Form::label('name', trans('admin/hardware/form.checkout_date'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <div class="col-md-4 input-group required">
        -                      <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" name="checkout_at" id="checkout_at" value="{{ Input::old('checkout_at', date('Y-m-d')) }}">
        -                      <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -                    </div>
        -                      {!! $errors->first('checkout_at', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -                  <!-- Expected Checkin Date -->
        -                  <div class="form-group {{ $errors->has('expected_checkin') ? 'error' : '' }}">
        -
        -                      {{ Form::label('name', trans('admin/hardware/form.expected_checkin'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <div class="col-md-4 input-group">
        -                      <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" name="expected_checkin" id="expected_checkin" value="{{ Input::old('expected_checkin') }}">
        -                      <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -                    </div>
        -                      {!! $errors->first('expected_checkin', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -
        -                  <!-- Note -->
        -                  <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        -
        -                      {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note') }}</textarea>
        -                      {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -                  <div class="form-group{{ $errors->has('selected_asset') ? ' has-error' : '' }}">
        -
        -                            {{ Form::label('selected_asset', trans('general.assets'), array('class' => 'col-md-3 control-label')) }}
        -
        -                        <div class="col-md-8 required">
        -                            {{ Form::select('selected_assets[]', $assets_list , Input::old('selected_asset'), array('class'=>'select2', 'id'=>'selected_asset', 'style'=>'width:100%', 'multiple'=>'multiple')) }}
        -
        -                            {!! $errors->first('selected_asset', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                        </div>
        -                    </div>
        -
        -
        -
        -              </div>
        -              <div class="box-footer">
        -                <a class="btn btn-link" href="{{ URL::previous() }}"> {{ trans('button.cancel') }}</a>
        -                <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.checkout') }}</button>
        -              </div>
        +              {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +            <div class="col-md-1 col-sm-1 text-left">
        +              <a href='{{ route('modal.user') }}' data-toggle="modal"  data-target="#createModal" data-dependency="user" data-select='assigned_to' class="btn btn-sm btn-default">New</a>
        +            </div>
                   </div>
        -    </form>
        -    </div>
         
        -    <!-- right column -->
        -    <div class="col-md-5" id="current_assets_box" style="display:none;">
        -        <div class="box box-primary">
        -            <div class="box-header with-border">
        -                <h3 class="box-title">{{ trans('admin/users/general.current_assets') }}</h3>
        +              <!-- Checkout/Checkin Date -->
        +              <div class="form-group {{ $errors->has('checkout_at') ? 'error' : '' }}">
        +                  {{ Form::label('name', trans('admin/hardware/form.checkout_date'), array('class' => 'col-md-3 control-label')) }}
        +                  <div class="col-md-8">
        +                      <div class="input-group date col-md-5" data-provide="datepicker" data-date-format="yyyy-mm-dd">
        +                          <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="checkout_at" id="checkout_at" value="{{ Input::old('checkout_at') }}">
        +                          <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +                      </div>
        +                      {!! $errors->first('checkout_at', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                  </div>
        +              </div>
        +
        +              <!-- Expected Checkin Date -->
        +              <div class="form-group {{ $errors->has('expected_checkin') ? 'error' : '' }}">
        +                  {{ Form::label('name', trans('admin/hardware/form.expected_checkin'), array('class' => 'col-md-3 control-label')) }}
        +                  <div class="col-md-8">
        +                      <div class="input-group date col-md-5" data-provide="datepicker" data-date-format="yyyy-mm-dd">
        +                          <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="expected_checkin" id="expected_checkin" value="{{ Input::old('expected_checkin') }}">
        +                          <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +                      </div>
        +                      {!! $errors->first('expected_checkin', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                  </div>
        +              </div>
        +
        +
        +          <!-- Note -->
        +          <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        +            {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
        +            <div class="col-md-8">
        +              <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note') }}</textarea>
        +              {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                     </div>
        -            <div class="box-body">
        -                <div id="current_assets_content">
        -                </div>
        +          </div>
        +
        +          <div class="form-group{{ $errors->has('selected_asset') ? ' has-error' : '' }}">
        +            {{ Form::label('selected_asset', trans('general.assets'), array('class' => 'col-md-3 control-label')) }}
        +            <div class="col-md-8 required">
        +              {{ Form::select('selected_assets[]', $assets_list , Input::old('selected_asset'), array('class'=>'select2', 'id'=>'selected_asset', 'style'=>'width:100%', 'multiple'=>'multiple')) }}
        +              {!! $errors->first('selected_asset', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                     </div>
        +          </div>
        +        </form>
        +      </div> <!--./box-body-->
        +      <div class="box-footer">
        +        <a class="btn btn-link" href="{{ URL::previous() }}"> {{ trans('button.cancel') }}</a>
        +        <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.checkout') }}</button>
        +      </div>
        +    </div>
        +  </div> <!--/.col-md-7-->
        +
        +  <!-- right column -->
        +  <div class="col-md-5" id="current_assets_box" style="display:none;">
        +    <div class="box box-primary">
        +      <div class="box-header with-border">
        +        <h3 class="box-title">{{ trans('admin/users/general.current_assets') }}</h3>
        +      </div>
        +      <div class="box-body">
        +        <div id="current_assets_content">
                 </div>
        +      </div>
             </div>
        -
        -
        +  </div>
         </div>
        -
        +@stop
         
         @section('moar_scripts')
        -
        -    {{-- Some room for the modals --}}
        -    <div class="modal fade" id="createModal">
        -        <div class="modal-dialog">
        -            <div class="modal-content">
        -                <div class="modal-header">
        -                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        -                    <h4 class="modal-title">Modal title</h4>
        -                </div>
        -                <div class="modal-body">
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-first_name">{{ trans('general.first_name') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-first_name' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-last_name">{{ trans('general.last_name') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12"><input type='text' id='modal-last_name' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-username">{{ trans('admin/users/table.username') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-username' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-email">{{ trans('admin/users/table.email') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12"><input type='email' id='modal-email' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-password">{{ trans('admin/users/table.password') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12 required"><input type='password' id='modal-password' class="form-control"></div>
        -                    </div>
        -
        -
        -                </div>
        -                <div class="modal-footer">
        -                    <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        -                    <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        -                </div>
        -            </div><!-- /.modal-content -->
        -        </div><!-- /.modal-dialog -->
        -    </div><!-- /.modal -->
        -
        -
        -
        -
        -    <!-- Ajax call to retrieve user assets -->
        -
        -<script>
        -    $(function () {
        -        var model,select;
        -        $('#createModal').on("show.bs.modal",function (event) {
        -            console.warn('modal ran');
        -            var link = $(event.relatedTarget);
        -            model=link.data("dependency");
        -            select=link.data("select");
        -            var modal = $(this);
        -            modal.find('.modal-title').text('Add a new ' + model);
        -            $('.dynamic-form-row').hide();
        -            function show_er(selector) {
        -                $(selector).parent().parent().show();
        -            }
        -            show_er('#modal-name');
        -            switch(model) {
        -                case 'user':
        -                    $('.dynamic-form-row').hide(); //we don't want a generic "name"
        -                    show_er("#modal-first_name");
        -                    show_er("#modal-last_name");
        -                    show_er("#modal-username");
        -                    show_er("#modal-email");
        -                    show_er("#modal-password");
        -                    show_er("#modal-password_confirm");
        -                    break;
        -                    //do nothing, they just need 'name'
        -            }
        -            //console.warn("The Model is: "+model+" and the select is: "+select);
        -        });
        -        $('#modal-save').on('click',function () {
        -            var data={};
        -            //console.warn("We are about to SAVE!!! for model: "+model+" and select ID: "+select);
        -            $('.modal-body input:visible').each(function (index,elem) {
        -                //console.warn("["+index+"]: "+elem.id+" = "+$(elem).val());
        -                var bits=elem.id.split("-");
        -                if(bits[0]==="modal") {
        -                    data[bits[1]]=$(elem).val();
        -                }
        -            });
        -            $('.modal-body select:visible').each(function (index,elem) {
        -                var bits=elem.id.split("-");
        -                data[bits[1]]=$(elem).val();
        -            });
        -            data._token =  '{{ csrf_token() }}',
        -                 //   console.dir(data);
        -                $.post("{{config('app.url') }}/api/"+model+"s",data,function (result) {
        -                    var id=result.id;
        -                    var name=result.name || (result.first_name+" "+result.last_name);
        -                    $('.modal-body input:visible').val("");
        -                    $('#createModal').modal('hide');
        -                    //console.warn("The select ID thing we're going for is: "+select);
        -                    var selector=document.getElementById(select);
        -                    selector.options[selector.length] = new Option(name,id);
        -                    selector.selectedIndex=selector.length-1;
        -                    $(selector).trigger("change");
        -                }).fail(function (result) {
        -                    //console.dir(result.responseJSON);
        -                    msg=result.responseJSON.error.message || result.responseJSON.error;
        -                    window.alert("Unable to add new "+model+" - error: "+msg);
        -                });
        -        });
        -    });
        -</script>
        -
         <script>
         $(function() {
           $('#assigned_to').on("change",function () {
        @@ -252,7 +117,7 @@ $(function() {
               $('#current_assets_box').fadeOut();
               $('#current_assets_content').html("");
             } else {
        -      $.get("{{config('app.url') }}/api/users/"+userid+"/assets",{_token: "{{ csrf_token() }}"},function (data) {
        +      $.get("{{url('/') }}/api/users/"+userid+"/assets",{_token: "{{ csrf_token() }}"},function (data) {
                 // console.warn("Ajax call came back okay for user " + userid + "! " + data.length + " Data is: "+data);
                 if (data.length > 0) {
                     $('#current_assets_box').fadeIn();
        @@ -260,7 +125,7 @@ $(function() {
                     $('#current_assets_content').append('');
                     for (var i in data) {
                         var asset = data[i];
        -                table_html += "<tr><td class=\"col-md-8\"><a href=\"{{ config('app.url') }}/hardware/" + asset.id + "/view\">" + asset.name;
        +                table_html += "<tr><td class=\"col-md-8\"><a href=\"{{ url('/') }}/hardware/" + asset.id + "/view\">" + asset.name;
                         if (asset.model.name!='') {
                             table_html += " (" + asset.model.name + ")";
                         }
        @@ -275,6 +140,5 @@ $(function() {
           });
         });
         </script>
        -@stop
         
        -@stop
        \ No newline at end of file
        +@stop
        diff --git a/resources/views/hardware/bulk-delete.blade.php b/resources/views/hardware/bulk-delete.blade.php
        index 0a139374c7..c433a6f831 100644
        --- a/resources/views/hardware/bulk-delete.blade.php
        +++ b/resources/views/hardware/bulk-delete.blade.php
        @@ -2,81 +2,67 @@
         
         {{-- Page title --}}
         @section('title')
        -        	{{ trans('admin/hardware/form.bulk_delete') }}
        -
        +{{ trans('admin/hardware/form.bulk_delete') }}
         @parent
         @stop
         
         @section('header_right')
        -    <a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
        -        {{ trans('general.back') }}</a>
        +<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
        +  {{ trans('general.back') }}</a>
         @stop
         
        -
        -
         {{-- Page content --}}
        -
         @section('content')
        +<div class="row">
        +  <!-- left column -->
        +  <div class="col-md-12">
        +    <p>{{ trans('admin/hardware/form.bulk_delete_help') }}</p>
        +    <form class="form-horizontal" method="post" action="{{ route('hardware/bulkdelete') }}" autocomplete="off" role="form">
        +      {{csrf_field()}}
        +      <div class="box box-default">
        +        <div class="box-header with-border">
        +          <h3 class="box-title" style="color: red">{{ trans('admin/hardware/form.bulk_delete_warn', ['asset_count' => count($assets)]) }}</h3>
        +        </div>
         
        -    <div class="row">
        -
        -
        -        <!-- left column -->
        -        <div class="col-md-12">
        -
        -            <p>{{ trans('admin/hardware/form.bulk_delete_help') }}</p>
        -
        -            <form class="form-horizontal" method="post" action="{{ route('hardware/bulkdelete') }}" autocomplete="off" role="form">
        -            <div class="box box-default">
        -                <div class="box-header with-border">
        -                    <h3 class="box-title" style="color: red">{{ trans('admin/hardware/form.bulk_delete_warn', ['asset_count' => count($assets)]) }}</h3>
        -                </div>
        -                <div class="box-body">
        -
        -                    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -                    <table class="table table-striped table-condensed">
        -                        <thead>
        -                        <tr>
        -                            <td></td>
        -                            <td>ID</td>
        -                            <td>Name</td>
        -                            <td>Location</td>
        -                            <td>Assigned To</td>
        -                        </tr>
        -                        </thead>
        -                        <tbody>
        -                        @foreach ($assets as $asset)
        -                            <tr>
        -                                <td><input type="checkbox" name="bulk_edit[]" value="{{ $asset->id }}" checked="checked"></td>
        -                                <td>{{ $asset->id }}</td>
        -                                <td>{{ $asset->showAssetName() }}</td>
        -                                <td>
        -                                    @if ($asset->assetloc)
        -                                        {{ $asset->assetloc->name }}
        -                                    @endif
        -                                </td>
        -                                <td>
        -                                    @if ($asset->assigneduser)
        -                                        {{ $asset->assigneduser->fullName() }} ({{ $asset->assigneduser->username }})
        -                                    @endif
        -                                </td>
        -                            </tr>
        -                        @endforeach
        -
        -                        </tbody>
        -
        -                    </table>
        -      
        -
        +        <div class="box-body">
        +          <table class="table table-striped table-condensed">
        +            <thead>
        +              <tr>
        +                <td></td>
        +                <td>ID</td>
        +                <td>Name</td>
        +                <td>Location</td>
        +                <td>Assigned To</td>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              @foreach ($assets as $asset)
        +              <tr>
        +                <td><input type="checkbox" name="ids[]" value="{{ $asset->id }}" checked="checked"></td>
        +                <td>{{ $asset->id }}</td>
        +                <td>{{ $asset->present()->name() }}</td>
        +                <td>
        +                  @if ($asset->assetloc)
        +                  {{ $asset->assetloc->name }}
        +                  @endif
        +                </td>
        +                <td>
        +                  @if ($asset->assignedTo)
        +                  {{ $asset->assignedTo->present()->name()}}
        +                  @endif
        +                </td>
        +              </tr>
        +              @endforeach
        +            </tbody>
        +          </table>
                 </div><!-- /.box-body -->
        +
                 <div class="box-footer text-right">
        -            <a class="btn btn-link" href="{{ URL::previous() }}" method="post" enctype="multipart/form-data">{{ trans('button.cancel') }}</a>
        -            <button type="submit" class="btn btn-success" id="submit-button"><i class="fa fa-check icon-white"></i> {{ trans('general.delete') }}</button>
        +          <a class="btn btn-link" href="{{ URL::previous() }}" method="post" enctype="multipart/form-data">{{ trans('button.cancel') }}</a>
        +          <button type="submit" class="btn btn-success" id="submit-button"><i class="fa fa-check icon-white"></i> {{ trans('general.delete') }}</button>
                 </div><!-- /.box-footer -->
        -    </div><!-- /.box -->
        -            </form>
        -
        -
        -    </div>
        -</div>
        +      </div><!-- /.box -->
        +    </form>
        +  </div> <!-- .col-md-12-->
        +</div><!--.row-->
         @stop
        diff --git a/resources/views/hardware/bulk.blade.php b/resources/views/hardware/bulk.blade.php
        index d57a564692..47c438a6b3 100755
        --- a/resources/views/hardware/bulk.blade.php
        +++ b/resources/views/hardware/bulk.blade.php
        @@ -12,13 +12,8 @@
           {{ trans('general.back') }}</a>
         @stop
         
        -
         {{-- Page content --}}
        -
         @section('content')
        -
        -
        -
         <div class="row">
           <div class="col-md-8 col-md-offset-2">
         
        @@ -28,143 +23,141 @@
               <i class="fa fa-warning"></i> {{ trans('admin/hardware/form.bulk_update_warn', ['asset_count' => count($assets)]) }}
             </div>
         
        -
        -
             <form class="form-horizontal" method="post" action="{{ route('hardware/bulksave') }}" autocomplete="off" role="form">
        +      {{ csrf_field() }}
         
        -   <!-- CSRF Token -->
        -   <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -    <div class="box box-default">
        -
        -      <div class="box-body">
        -        <!-- Purchase Date -->
        -        <div class="form-group {{ $errors->has('purchase_date') ? ' has-error' : '' }}">
        +      <div class="box box-default">
        +        <div class="box-body">
        +          <!-- Purchase Date -->
        +          <div class="form-group {{ $errors->has('purchase_date') ? ' has-error' : '' }}">
                     <label for="purchase_date" class="col-md-2 control-label">{{ trans('admin/hardware/form.date') }}</label>
                     <div class="input-group col-md-3">
        -                <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="Select Date" name="purchase_date" id="purchase_date" value="{{ Input::old('purchase_date') }}">
        -                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -            {!! $errors->first('purchase_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="Select Date" name="purchase_date" id="purchase_date" value="{{ Input::old('purchase_date') }}">
        +              <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +              {!! $errors->first('purchase_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                     </div>
        -        </div>
        +          </div>
         
        -        <!-- Status -->
        -        <div class="form-group {{ $errors->has('status_id') ? ' has-error' : '' }}">
        +          <!-- Status -->
        +          <div class="form-group {{ $errors->has('status_id') ? ' has-error' : '' }}">
                     <label for="status_id" class="col-md-2 control-label">
                       {{ trans('admin/hardware/form.status') }}
                     </label>
        -                <div class="col-md-7">
        -                    {{ Form::select('status_id', $statuslabel_list , Input::old('status_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        -                    {!! $errors->first('status_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -        </div>
        +            <div class="col-md-7">
        +              {{ Form::select('status_id', $statuslabel_list , Input::old('status_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +              {!! $errors->first('status_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
         
        -        <!-- Asset Model -->
        -        <div class="form-group {{ $errors->has('model_id') ? ' has-error' : '' }}">
        +          <!-- Asset Model -->
        +          <div class="form-group {{ $errors->has('model_id') ? ' has-error' : '' }}">
                     <label for="model_id" class="col-md-2 control-label">
                       {{ trans('admin/hardware/form.model') }}
                     </label>
        -                <div class="col-md-7">
        -                    {{ Form::select('model_id', $models_list , Input::old('model_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        -                    {!! $errors->first('model_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -        </div>
        +            <div class="col-md-7">
        +              {{ Form::select('model_id', $models_list , Input::old('model_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +              {!! $errors->first('model_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
         
        +          <!-- Default Location -->
        +          <div class="form-group {{ $errors->has('status_id') ? ' has-error' : '' }}">
        +            <label for="status_id" class="col-md-2 control-label">
        +              {{ trans('admin/hardware/form.default_location') }}
        +            </label>
        +            <div class="col-md-7">
        +              {{ Form::select('rtd_location_id', $location_list , Input::old('rtd_location_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +              {!! $errors->first('status_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
         
        -        <!-- Default Location -->
        -        <div class="form-group {{ $errors->has('status_id') ? ' has-error' : '' }}">
        -            <label for="status_id" class="col-md-2 control-label">{{ trans('admin/hardware/form.default_location') }}</label>
        -                <div class="col-md-7">
        -                    {{ Form::select('rtd_location_id', $location_list , Input::old('rtd_location_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        -                    {!! $errors->first('status_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -        </div>
        -
        -        <!-- Purchase Cost -->
        -        <div class="form-group {{ $errors->has('purchase_cost') ? ' has-error' : '' }}">
        +          <!-- Purchase Cost -->
        +          <div class="form-group {{ $errors->has('purchase_cost') ? ' has-error' : '' }}">
                     <label for="purchase_cost" class="col-md-2 control-label">
                       {{ trans('admin/hardware/form.cost') }}
                     </label>
                     <div class="input-group col-md-3">
                       <span class="input-group-addon">{{ $snipeSettings->default_currency }}</span>
                         <input type="text" class="form-control" placeholder="{{ trans('admin/hardware/form.cost') }}" name="purchase_cost" id="purchase_cost" value="{{ Input::old('purchase_cost') }}">
        -
        -            {!! $errors->first('purchase_cost', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                {!! $errors->first('purchase_cost', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                     </div>
        -        </div>
        +          </div>
         
        -        <!-- Supplier -->
        -        <div class="form-group {{ $errors->has('supplier_id') ? ' has-error' : '' }}">
        -            <label for="supplier_id" class="col-md-2 control-label">{{ trans('admin/hardware/form.supplier') }}</label>
        +          <!-- Supplier -->
        +          <div class="form-group {{ $errors->has('supplier_id') ? ' has-error' : '' }}">
        +            <label for="supplier_id" class="col-md-2 control-label">
        +              {{ trans('general.supplier') }}
        +            </label>
                     <div class="col-md-7">
        -                {{ Form::select('supplier_id', $supplier_list , Input::old('supplier_id'), array('class'=>'select2', 'style'=>'min-width:350px')) }}
        -                {!! $errors->first('supplier_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              {{ Form::select('supplier_id', $supplier_list , Input::old('supplier_id'), array('class'=>'select2', 'style'=>'min-width:350px')) }}
        +              {!! $errors->first('supplier_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                     </div>
        -        </div>
        +          </div>
         
        -        <!-- Company -->
        -        <div class="form-group {{ $errors->has('company_id') ? ' has-error' : '' }}">
        +          <!-- Company -->
        +          <div class="form-group {{ $errors->has('company_id') ? ' has-error' : '' }}">
                     <label for="company_id" class="col-md-2 control-label">
                       {{ trans('general.company') }}
                     </label>
        -                <div class="col-md-7">
        -                    {{ Form::select('company_id', $companies_list , Input::old('company_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        -                    {!! $errors->first('company_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -        </div>
        -
        -        <!-- Order Number -->
        -        <div class="form-group {{ $errors->has('order_number') ? ' has-error' : '' }}">
        -            <label for="order_number" class="col-md-2 control-label">{{ trans('admin/hardware/form.order') }}</label>
                     <div class="col-md-7">
        -                <input class="form-control" type="text" name="order_number" id="order_number" value="{{ Input::old('order_number') }}" />
        -                {!! $errors->first('order_number', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              {{ Form::select('company_id', $companies_list , Input::old('company_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +              {!! $errors->first('company_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
                     </div>
        -        </div>
        +          </div>
         
        -        <!-- Warranty -->
        -        <div class="form-group {{ $errors->has('warranty_months') ? ' has-error' : '' }}">
        -            <label for="warranty_months" class="col-md-2 control-label">{{ trans('admin/hardware/form.warranty') }}</label>
        +          <!-- Order Number -->
        +          <div class="form-group {{ $errors->has('order_number') ? ' has-error' : '' }}">
        +            <label for="order_number" class="col-md-2 control-label">
        +              {{ trans('admin/hardware/form.order') }}
        +            </label>
        +            <div class="col-md-7">
        +              <input class="form-control" type="text" name="order_number" id="order_number" value="{{ Input::old('order_number') }}" />
        +              {!! $errors->first('order_number', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +            </div>
        +          </div>
        +
        +          <!-- Warranty -->
        +          <div class="form-group {{ $errors->has('warranty_months') ? ' has-error' : '' }}">
        +            <label for="warranty_months" class="col-md-2 control-label">
        +              {{ trans('admin/hardware/form.warranty') }}
        +            </label>
                     <div class="col-md-2">
        -                <div class="input-group">
        -                <input class="col-md-2 form-control" type="text" name="warranty_months" id="warranty_months" value="{{ Input::old('warranty_months') }}" />   <span class="input-group-addon">{{ trans('admin/hardware/form.months') }}</span>
        +              <div class="input-group">
        +                <input class="col-md-2 form-control" type="text" name="warranty_months" id="warranty_months" value="{{ Input::old('warranty_months') }}" />
        +                <span class="input-group-addon">{{ trans('admin/hardware/form.months') }}</span>
                         {!! $errors->first('warranty_months', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        +              </div>
                     </div>
        -        </div>
        +          </div>
         
        -        <!-- Requestable -->
        -
        -        <div class="form-group {{ $errors->has('warranty_months') ? ' has-error' : '' }}">
        -            <label for="requestable" class="col-md-2 control-label">{{ trans('admin/hardware/form.requestable') }}</label>
        +          <!-- Requestable -->
        +          <div class="form-group {{ $errors->has('requestable') ? ' has-error' : '' }}">
        +            <label for="requestable" class="col-md-2 control-label">
        +              {{ trans('admin/hardware/form.requestable') }}
        +            </label>
                     <div class="col-md-10">
        -                <label class="radio">
        -                  <input type="radio" name="requestable" value="1"> Yes
        -                </label>
        -                <label class="radio">
        -                  <input type="radio" name="requestable" value="0"> No
        -                </label>
        -                <label class="radio">
        -                  <input type="radio" name="requestable" value=""> Do Not Change
        -                </label>
        +              <label class="radio">
        +                <input type="radio" name="requestable" value="1"> Yes
        +              </label>
        +              <label class="radio">
        +                <input type="radio" name="requestable" value="0"> No
        +              </label>
        +              <label class="radio">
        +                <input type="radio" name="requestable" value=""> Do Not Change
        +              </label>
                     </div>
        -        </div>
        +          </div>
         
        +          @foreach ($assets as $key => $value)
        +            <input type="hidden" name="ids[{{ $key }}]" value="1">
        +          @endforeach
        +        </div> <!--/.box-body-->
         
        -        @foreach ($assets as $key => $value)
        -          <input type="hidden" name="bulk_edit[{{ $key }}]" value="1">
        -        @endforeach
        -
        -
        -      </div>
        -
        -      <div class="box-footer text-right">
        +        <div class="box-footer text-right">
                   <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        -      </div>
        -    </div>
        -
        -
        -        </form>
        -    </div>
        +        </div>
        +      </div> <!--/.box.box-default-->
        +    </form>
        +  </div> <!--/.col-md-8-->
         </div>
         @stop
        diff --git a/resources/views/hardware/checkin.blade.php b/resources/views/hardware/checkin.blade.php
        index b504f9d47a..351be85643 100755
        --- a/resources/views/hardware/checkin.blade.php
        +++ b/resources/views/hardware/checkin.blade.php
        @@ -2,113 +2,107 @@
         
         {{-- Page title --}}
         @section('title')
        -     {{ trans('admin/hardware/general.checkin') }}
        +{{ trans('admin/hardware/general.checkin') }}
         @parent
         @stop
         
         {{-- Page content --}}
         @section('content')
        -
        -
         <style>
         
        -.input-group {
        +  .input-group {
             padding-left: 0px !important;
        -}
        +  }
         </style>
         
         
         <div class="row">
        -
        -<!-- left column -->
        -<div class="col-md-9">
        -
        -  <div class="box box-default">
        +  <!-- left column -->
        +  <div class="col-md-9">
        +    <div class="box box-default">
               <div class="box-header with-border">
                 <h3 class="box-title">{{ trans('admin/hardware/form.tag') }} {{ $asset->asset_tag }}</h3>
               </div><!-- /.box-header -->
         
               <div class="box-body">
                 <div class="col-md-12">
        -
        -        @if ($backto=='user')
        -        	<form class="form-horizontal" method="post" action="{{ route('checkin/hardware', array('assetId'=> $asset->id, 'backto'=>'user')) }}" autocomplete="off">
        -        @else
        -        	<form class="form-horizontal" method="post" action="{{ route('checkin/hardware', $asset->id) }}" autocomplete="off">
        -        @endif
        -        <!-- CSRF Token -->
        -        <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -        @if ($asset->model->name)
        -          <!-- Asset name -->
        -          <div class="form-group">
        -
        +          @if ($backto=='user')
        +          <form class="form-horizontal" method="post"
        +          action="{{ route('checkin/hardware', array('assetId'=> $asset->id, 'backto'=>'user')) }}"
        +          autocomplete="off">
        +          @else
        +          <form class="form-horizontal" method="post"
        +          action="{{ route('checkin/hardware', $asset->id) }}" autocomplete="off">
        +          @endif
        +            {{csrf_field()}}
        +            @if ($asset->model->name)
        +            <!-- AssetModel name -->
        +            <div class="form-group">
                       {{ Form::label('name', trans('admin/hardware/form.model'), array('class' => 'col-md-3 control-label')) }}
        -
        -            <div class="col-md-8">
        -              <p class="form-control-static">{{ $asset->model->name }}</p>
        +              <div class="col-md-8">
        +                <p class="form-control-static">{{ $asset->model->name }}</p>
        +              </div>
                     </div>
        -          </div>
        -        @endif
        +            @endif
         
        -
        -        <!-- Asset Name -->
        -          <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        +            <!-- Asset Name -->
        +            <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
                       {{ Form::label('name', trans('admin/hardware/form.name'), array('class' => 'col-md-3 control-label')) }}
        -            <div class="col-md-8">
        -              <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name', $asset->name) }}" />
        -              {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              <div class="col-md-8">
        +                <input class="form-control" type="text" name="name" id="name"
        +                value="{{ Input::old('name', $asset->name) }}"/>
        +                {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
                     </div>
        -          </div>
         
        -        <!-- Status -->
        -        <div class="form-group {{ $errors->has('status_id') ? 'error' : '' }}">
        +            <!-- Status -->
        +            <div class="form-group {{ $errors->has('status_id') ? 'error' : '' }}">
        +              {{ Form::label('name', trans('admin/hardware/form.status'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-7 required">
        +                {{ Form::select('status_id', $statusLabel_list, '', array('class'=>'select2', 'style'=>'width:100%','id' =>'modal-statuslabel_types')) }}
        +                {!! $errors->first('status_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
        +            </div>
         
        -            {{ Form::label('name', trans('admin/hardware/form.status'), array('class' => 'col-md-3 control-label')) }}
        +            <!-- Checkout/Checkin Date -->
        +            <div class="form-group {{ $errors->has('checkin_at') ? 'error' : '' }}">
        +              {{ Form::label('name', trans('admin/hardware/form.checkin_date'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-8">
        +                <div class="col-md-4 input-group required">
        +                  <input type="date" class="datepicker form-control"
        +                  data-date-format="yyyy-mm-dd" placeholder="Checkin Date"
        +                  name="checkin_at" id="checkin_at"
        +                  value="{{ Input::old('checkin_at', date('Y-m-d')) }}">
        +                  <span class="input-group-addon"><i
        +                    class="fa fa-calendar"></i></span>
        +                  </div>
        +                  {!! $errors->first('checkin_at', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                </div>
        +              </div>
         
        -          <div class="col-md-7 required">
        -            {{ Form::select('status_id', $statusLabel_list, '', array('class'=>'select2', 'style'=>'width:100%','id' =>'modal-statuslabel_types')) }}
        -            {!! $errors->first('status_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -          </div>
        -        </div>
        +              <!-- Note -->
        +              <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
         
        -        <!-- Checkout/Checkin Date -->
        +                {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
         
        -        <div class="form-group {{ $errors->has('checkin_at') ? 'error' : '' }}">
        -
        -            {{ Form::label('name', trans('admin/hardware/form.checkin_date'), array('class' => 'col-md-3 control-label')) }}
        -
        -          <div class="col-md-8">
        -            <div class="col-md-4 input-group required">
        -            <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="Checkin Date" name="checkin_at" id="checkin_at" value="{{ Input::old('checkin_at', date('Y-m-d')) }}">
        -            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -          </div>
        -            {!! $errors->first('checkin_at', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -          </div>
        -        </div>
        -
        -
        -        <!-- Note -->
        -        <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        -
        -            {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
        -
        -          <div class="col-md-8">
        -            <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $asset->note) }}</textarea>
        -            {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -          </div>
        -        </div>
        -
        -
        -        </div>
        -      </div>
        +                <div class="col-md-8">
        +                  <textarea class="col-md-6 form-control" id="note"
        +                  name="note">{{ Input::old('note', $asset->note) }}</textarea>
        +                  {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                </div>
        +              </div>
        +              <button type="submit" class="btn btn-success pull-right"><i
        +                class="fa fa-check icon-white"></i> {{ trans('general.checkin') }}</button>
        +              </form>
        +            </div>
        +          </form>
        +        </div> <!--/.col-md-12-->
        +      </div> <!--/.box-body-->
               <div class="box-footer">
                 <a class="btn btn-link" href="{{ URL::previous() }}"> {{ trans('button.cancel') }}</a>
        -        <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.checkin') }}</button>
               </div>
        +    </div> <!--/.box.box-default-->
           </div>
        -
        -</div>
         </div>
         
         @stop
        diff --git a/resources/views/hardware/checkout.blade.php b/resources/views/hardware/checkout.blade.php
        index 11225e8a30..97ce9bb741 100755
        --- a/resources/views/hardware/checkout.blade.php
        +++ b/resources/views/hardware/checkout.blade.php
        @@ -6,7 +6,6 @@
         @parent
         @stop
         
        -
         {{-- Page content --}}
         @section('content')
         
        @@ -17,327 +16,189 @@
         }
         </style>
         
        -
         <div class="row">
        -
        -    <!-- left column -->
        -    <div class="col-md-7">
        -
        -          <div class="box box-default">
        -              <div class="box-header with-border">
        -                  <h3 class="box-title"> {{ trans('admin/hardware/form.tag') }} {{ $asset->asset_tag }}</h3>
        -              </div>
        -              <div class="box-body">
        -                <form class="form-horizontal" method="post" action="" autocomplete="off">
        -                <!-- CSRF Token -->
        -                <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -
        -
        -                  @if ($asset->model->name)
        -                  <!-- Asset name -->
        -                  <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        -
        -                      {{ Form::label('name', trans('admin/hardware/form.model'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <p class="form-control-static">{{ $asset->model->name }}</p>
        -                    </div>
        -                  </div>
        -                  @endif
        -
        -                  <!-- Asset Name -->
        -                  <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        -
        -                      {{ Form::label('name', trans('admin/hardware/form.name'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name', $asset->name) }}" />
        -                      {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -                    <!-- User -->
        -                    <div id="assigned_user" class="form-group{{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        -
        -                            {{ Form::label('assigned_to', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        -
        -                        <div class="col-md-7 required">
        -                            {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $asset->assigned_to), array('class'=>'select2', 'id'=>'assigned_to', 'style'=>'width:100%')) }}
        -
        -                            {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                        </div>
        -                        <div class="col-md-1 col-sm-1 text-left">
        -                            <a href='#' data-toggle="modal"  data-target="#createModal" data-dependency="user" data-select='assigned_to' class="btn btn-sm btn-default">New</a>
        -                        </div>
        -                    </div>
        -
        -
        -
        -                  <!-- Checkout/Checkin Date -->
        -                  <div class="form-group {{ $errors->has('checkout_at') ? 'error' : '' }}">
        -
        -                      {{ Form::label('name', trans('admin/hardware/form.checkout_date'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <div class="col-md-4 input-group required">
        -                      <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" name="checkout_at" id="checkout_at" value="{{ Input::old('checkout_at', date('Y-m-d')) }}">
        -                      <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -                    </div>
        -                      {!! $errors->first('checkout_at', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -
        -                  <!-- Expected Checkin Date -->
        -                  <div class="form-group {{ $errors->has('expected_checkin') ? 'error' : '' }}">
        -
        -                      {{ Form::label('name', trans('admin/hardware/form.expected_checkin'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <div class="col-md-4 input-group">
        -                      <input type="date" class="datepicker form-control" data-date-format="yyyy-mm-dd" name="expected_checkin" id="expected_checkin" value="{{ Input::old('expected_checkin') }}">
        -                      <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -                    </div>
        -                      {!! $errors->first('expected_checkin', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -                  <!-- Note -->
        -                  <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        -
        -                      {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
        -
        -                    <div class="col-md-8">
        -                      <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $asset->note) }}</textarea>
        -                      {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -
        -
        -                    @if ($asset->requireAcceptance())
        -
        -                    <div class="form-group">
        -                      <div class="col-md-8 col-md-offset-3">
        -                        <p class="text-yellow"><i class="fa fa-warning"></i> {{ trans('admin/categories/general.required_acceptance') }}</p>
        -                      </div>
        -                    </div>
        -                    @endif
        -
        -
        -                    @if ($asset->getEula())
        -                    <div class="form-group">
        -                      <div class="col-md-8 col-md-offset-3">
        -                        <p class="text-yellow"><i class="fa fa-warning"></i> {{ trans('admin/categories/general.required_eula') }}</p>
        -                      </div>
        -                    </div>
        -                    @endif
        -
        -              </div>
        -              <div class="box-footer">
        -                <a class="btn btn-link" href="{{ URL::previous() }}"> {{ trans('button.cancel') }}</a>
        -                <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.checkout') }}</button>
        -              </div>
        -          </div>
        -    </form>
        -    </div>
        -
        -    <!-- right column -->
        -    <div class="col-md-5" id="current_assets_box" style="display:none;">
        -        <div class="box box-primary">
        -            <div class="box-header with-border">
        -                <h3 class="box-title">{{ trans('admin/users/general.current_assets') }}</h3>
        -            </div>
        -            <div class="box-body">
        -                <div id="current_assets_content">
        -                </div>
        -            </div>
        +  <!-- left column -->
        +  <div class="col-md-7">
        +    <div class="box box-default">
        +      <form class="form-horizontal" method="post" action="" autocomplete="off">
        +        <div class="box-header with-border">
        +            <h3 class="box-title"> {{ trans('admin/hardware/form.tag') }} {{ $asset->asset_tag }}</h3>
                 </div>
        +        <div class="box-body">
        +            {{csrf_field()}}
        +            @if ($asset->model->name)
        +            <!-- Asset name -->
        +            <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        +                {{ Form::label('name', trans('admin/hardware/form.model'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-8">
        +                <p class="form-control-static">{{ $asset->model->name }}</p>
        +              </div>
        +            </div>
        +            @endif
        +
        +            <!-- Asset Name -->
        +            <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        +              {{ Form::label('name', trans('admin/hardware/form.name'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-8">
        +                <input class="form-control" type="text" name="name" id="name" value="{{ Input::old('name', $asset->name) }}" />
        +                {!! $errors->first('name', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
        +            </div>
        +
        +            <!-- User -->
        +            <div id="assigned_user" class="form-group{{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        +              {{ Form::label('assigned_user', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-7 required">
        +                {{ Form::select('assigned_user', $users_list , Input::old('assigned_user', $asset->assigned_type == 'App\Models\User' ? $asset->assigned_to : 0), array('class'=>'select2', 'id'=>'assigned_user_select', 'style'=>'width:100%')) }}
        +
        +                {!! $errors->first('assigned_user', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
        +              <div class="col-md-1 col-sm-1 text-left">
        +                  @can('create', \App\Models\User::class)
        +                    <a href='{{ route('modal.user') }}' data-toggle="modal"  data-target="#createModal" data-dependency="user" data-select='assigned_user_select' class="btn btn-sm btn-default">New</a>
        +                  @endcan
        +              </div>
        +            </div>
        +            @if (!$asset->requireAcceptance())
        +                <!-- Assets -->
        +                <div id="assigned_asset" class="form-group{{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        +                  {{ Form::label('assigned_asset', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        +                  <div class="col-md-7 required">
        +                    {{ Form::select('assigned_asset', $assets_list , Input::old('assigned_asset', $asset->assigned_type == 'App\Models\Asset' ? $asset->assigned_to : 0), array('class'=>'select2', 'id'=>'assigned_asset', 'style'=>'width:100%')) }}
        +                    {!! $errors->first('assigned_asset', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                  </div>
        +                </div>
        +
        +                <!-- Locations -->
        +                <div id="assigned_location" class="form-group{{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        +                  {{ Form::label('assigned_location', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        +                  <div class="col-md-7 required">
        +                    {{ Form::select('assigned_location', $locations_list , Input::old('assigned_location', $asset->assigned_type == 'App\Models\Asset' ? $asset->assigned_to : 0), array('class'=>'select2', 'id'=>'assigned_location', 'style'=>'width:100%')) }}
        +                    {!! $errors->first('assigned_location', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                  </div>
        +                </div>
        +            @endif
        +            <!-- Checkout/Checkin Date -->
        +            <div class="form-group {{ $errors->has('checkout_at') ? 'error' : '' }}">
        +              {{ Form::label('name', trans('admin/hardware/form.checkout_date'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-8">
        +                  <div class="input-group date col-md-5" data-provide="datepicker" data-date-format="yyyy-mm-dd">
        +                      <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="checkout_at" id="checkout_at" value="{{ Input::old('checkout_at') }}">
        +                      <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +                  </div>
        +                {!! $errors->first('checkout_at', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
        +            </div>
        +
        +            <!-- Expected Checkin Date -->
        +            <div class="form-group {{ $errors->has('expected_checkin') ? 'error' : '' }}">
        +              {{ Form::label('name', trans('admin/hardware/form.expected_checkin'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-8">
        +                  <div class="input-group date col-md-5" data-provide="datepicker" data-date-format="yyyy-mm-dd">
        +                      <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="expected_checkin" id="expected_checkin" value="{{ Input::old('expected_checkin') }}">
        +                      <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +                  </div>
        +                {!! $errors->first('expected_checkin', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
        +            </div>
        +
        +            <!-- Note -->
        +            <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        +              {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
        +              <div class="col-md-8">
        +                <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $asset->note) }}</textarea>
        +                {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +              </div>
        +            </div>
        +
        +            @if ($asset->requireAcceptance())
        +            <div class="form-group">
        +              <div class="col-md-8 col-md-offset-3">
        +                <p class="text-yellow">
        +                  <i class="fa fa-warning"></i>
        +                  {{ trans('admin/categories/general.required_acceptance') }}
        +                </p>
        +              </div>
        +            </div>
        +            @endif
        +
        +            @if ($asset->getEula())
        +            <div class="form-group">
        +              <div class="col-md-8 col-md-offset-3">
        +                <p class="text-yellow"><i class="fa fa-warning"></i> {{ trans('admin/categories/general.required_eula') }}</p>
        +              </div>
        +            </div>
        +            @endif
        +        </div> <!--/.box-body-->
        +        <div class="box-footer">
        +          <a class="btn btn-link" href="{{ URL::previous() }}"> {{ trans('button.cancel') }}</a>
        +          <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.checkout') }}</button>
        +        </div>
        +      </form>
             </div>
        +  </div> <!--/.col-md-7-->
         
        -
        +  <!-- right column -->
        +  <div class="col-md-5" id="current_assets_box" style="display:none;">
        +    <div class="box box-primary">
        +      <div class="box-header with-border">
        +        <h3 class="box-title">{{ trans('admin/users/general.current_assets') }}</h3>
        +      </div>
        +      <div class="box-body">
        +        <div id="current_assets_content">
        +        </div>
        +      </div>
        +    </div>
        +  </div>
         </div>
        -
        +@stop
         
         @section('moar_scripts')
        -
        -    {{-- Some room for the modals --}}
        -    <div class="modal fade" id="createModal">
        -        <div class="modal-dialog">
        -            <div class="modal-content">
        -                <div class="modal-header">
        -                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        -                    <h4 class="modal-title">Modal title</h4>
        -                </div>
        -                <div class="modal-body">
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-first_name">{{ trans('general.first_name') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-first_name' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-last_name">{{ trans('general.last_name') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12"><input type='text' id='modal-last_name' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-username">{{ trans('admin/users/table.username') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-username' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-email">{{ trans('admin/users/table.email') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12"><input type='email' id='modal-email' class="form-control"></div>
        -                    </div>
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12"><label for="modal-password">{{ trans('admin/users/table.password') }}:</label></div>
        -                        <div class="col-md-8 col-xs-12 required"><input type='password' id='modal-password' class="form-control"></div>
        -                    </div>
        -
        -
        -                </div>
        -                <div class="modal-footer">
        -                    <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        -                    <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        -                </div>
        -            </div><!-- /.modal-content -->
        -        </div><!-- /.modal-dialog -->
        -    </div><!-- /.modal -->
        -
        -
        -
        -
        -    <!-- Ajax call to retrieve user assets -->
        -
         <script>
        -
        -
        -    $(function () {
        -        var model,select;
        -
        -
        -        $('#createModal').on("show.bs.modal",function (event) {
        -            console.warn('modal ran');
        -            var link = $(event.relatedTarget);
        -            model=link.data("dependency");
        -            select=link.data("select");
        -
        -            var modal = $(this);
        -            modal.find('.modal-title').text('Add a new ' + model);
        -
        -            $('.dynamic-form-row').hide();
        -            function show_er(selector) {
        -                $(selector).parent().parent().show();
        -            }
        -            show_er('#modal-name');
        -            switch(model) {
        -
        -                case 'user':
        -                    $('.dynamic-form-row').hide(); //we don't want a generic "name"
        -                    show_er("#modal-first_name");
        -                    show_er("#modal-last_name");
        -                    show_er("#modal-username");
        -                    show_er("#modal-email");
        -                    show_er("#modal-password");
        -                    show_er("#modal-password_confirm");
        -                    break;
        -
        -
        -                    //do nothing, they just need 'name'
        -            }
        -
        -            //console.warn("The Model is: "+model+" and the select is: "+select);
        -        });
        -
        -
        -
        -
        -
        -        $('#modal-save').on('click',function () {
        -            var data={};
        -            //console.warn("We are about to SAVE!!! for model: "+model+" and select ID: "+select);
        -            $('.modal-body input:visible').each(function (index,elem) {
        -                //console.warn("["+index+"]: "+elem.id+" = "+$(elem).val());
        -                var bits=elem.id.split("-");
        -                if(bits[0]==="modal") {
        -                    data[bits[1]]=$(elem).val();
        -                }
        -            });
        -            $('.modal-body select:visible').each(function (index,elem) {
        -                var bits=elem.id.split("-");
        -                data[bits[1]]=$(elem).val();
        -            });
        -
        -            data._token =  '{{ csrf_token() }}',
        -                 //   console.dir(data);
        -
        -                $.post("{{config('app.url') }}/api/"+model+"s",data,function (result) {
        -                    var id=result.id;
        -                    var name=result.name || (result.first_name+" "+result.last_name);
        -                    $('.modal-body input:visible').val("");
        -                    $('#createModal').modal('hide');
        -
        -                    //console.warn("The select ID thing we're going for is: "+select);
        -                    var selector=document.getElementById(select);
        -                    selector.options[selector.length] = new Option(name,id);
        -                    selector.selectedIndex=selector.length-1;
        -                    $(selector).trigger("change");
        -
        -
        -                }).fail(function (result) {
        -                    //console.dir(result.responseJSON);
        -                    msg=result.responseJSON.error.message || result.responseJSON.error;
        -                    window.alert("Unable to add new "+model+" - error: "+msg);
        -                });
        -
        -        });
        -    });
        -</script>
        -
        -<script>
        -
         $(function() {
        -  $('#assigned_to').on("change",function () {
        -    // console.warn("Model Id has changed!");
        -    var userid=$('#assigned_to').val();
        +  $('#assigned_user').on("change",function () {
        +    var userid = $('#assigned_user option:selected').val();
             if(userid=='') {
               console.warn('no user selected');
               $('#current_assets_box').fadeOut();
               $('#current_assets_content').html("");
             } else {
         
        -      $.get("{{config('app.url') }}/api/users/"+userid+"/assets",{_token: "{{ csrf_token() }}"},function (data) {
        -        // console.warn("Ajax call came back okay for user " + userid + "! " + data.length + " Data is: "+data);
        -        if (data.length > 0) {
        -            $('#current_assets_box').fadeIn();
        +        $.ajax({
        +            type: 'GET',
        +            url: '{{url('/') }}/api/v1/users/' + userid + '/assets',
        +            headers: {
        +                "X-Requested-With": 'XMLHttpRequest',
        +                "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +            },
         
        -            var table_html = '<div class="row"><div class="col-md-12"><table class="table table-striped"><thead><tr><td>{{ trans('admin/hardware/form.name') }}</td><td>{{ trans('admin/hardware/form.tag') }}</td></tr></thead><tbody>';
        +            dataType: 'json',
        +            success: function (data) {
        +                $('#current_assets_box').fadeIn();
         
        -            $('#current_assets_content').append('');
        +                var table_html = '<div class="row"><div class="col-md-12"><table class="table table-striped"><thead><tr><td>{{ trans('admin/hardware/form.name') }}</td><td>{{ trans('admin/hardware/form.tag') }}</td></tr></thead><tbody>';
         
        -            for (var i in data) {
        -                var asset = data[i];
        -                table_html += "<tr><td class=\"col-md-8\"><a href=\"{{ config('app.url') }}/hardware/" + asset.id + "/view\">" + asset.name;
        -                if (asset.model.name!='') {
        -                    table_html += " (" + asset.model.name + ")";
        +                $('#current_assets_content').append('');
         
        +                for (var i in data) {
        +                    var asset = data[i];
        +                    table_html += '<tr><td class="col-md-8"><a href="{{ url('/') }}/hardware/' + asset.id + '">' + asset.name;
        +                    if (asset.model.name!='') {
        +                        table_html += " (" + asset.model.name + ")";
        +
        +                    }
        +                    table_html += "</a></td><td class=\"col-md-4\">" + asset.asset_tag + "</td></tr>";
                         }
        -                table_html += "</a></td><td class=\"col-md-4\">" + asset.asset_tag + "</td></tr>";
        +
        +                $('#current_assets_content').html(table_html + '</tbody></table></div></div>');
        +
        +            },
        +            error: function (data) {
        +                $('#current_assets_box').fadeOut();
                     }
        -
        -            $('#current_assets_content').html(table_html + '</tbody></table></div></div>');
        -
        -        } else {
        -            $('#current_assets_box').fadeOut();
        -        }
        -      });
        +        });
             }
           });
         });
         </script>
         @stop
        -
        -@stop
        diff --git a/resources/views/hardware/clone.blade.php b/resources/views/hardware/clone.blade.php
        deleted file mode 100755
        index d44327d6de..0000000000
        --- a/resources/views/hardware/clone.blade.php
        +++ /dev/null
        @@ -1,144 +0,0 @@
        -@extends('layouts/default')
        -
        -{{-- Page title --}}
        -@section('title')
        -    {{ trans('admin/hardware/general.clone') }}
        -@parent
        -@stop
        -
        -{{-- Page content --}}
        -@section('content')
        -<div class="page-header">
        -
        -        <div class="pull-right">
        -            <a href="{{ URL::previous() }}" class="btn-flat gray"><i class="fa fa-arrow-left icon-white"></i>  {{ trans('general.back') }}</a>
        -        </div>
        -
        -        <h3>{{ trans('admin/hardware/general.clone') }}</h3>
        -</div>
        -
        -
        -<form class="form-horizontal" method="post" action="" autocomplete="off">
        -    <!-- CSRF Token -->
        -    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -            <!-- Asset Tag -->
        -            <div class="form-group {{ $errors->has('asset_tag') ? 'error' : '' }}">
        -                <label class="control-label" for="asset_tag">{{ trans('admin/hardware/form.tag') }}</label>
        -                <div class="controls">
        -                    <input class="col-md-4" type="text" name="asset_tag" id="asset_tag" value="{{ Input::old('asset_tag', $asset->asset_tag) }}" />
        -                    {!! $errors->first('asset_tag', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -            </div>
        -            <!-- Asset Title -->
        -            <div class="form-group {{ $errors->has('name') ? 'error' : '' }}">
        -                <label class="control-label" for="name">{{ trans('admin/hardware/form.name') }}</label>
        -                <div class="controls">
        -                    <input class="col-md-4" type="text" name="name" id="name" value="{{ Input::old('name', $asset->name) }}" />
        -                    {!! $errors->first('name', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -            </div>
        -
        -
        -            <!-- Serial -->
        -            <div class="form-group {{ $errors->has('serial') ? 'error' : '' }}">
        -                <label class="control-label" for="serial">{{ trans('admin/hardware/form.serial') }}</label>
        -                <div class="controls">
        -                    <input class="col-md-4" type="text" name="serial" id="serial" value="{{ Input::old('serial', $asset->serial) }}" />
        -                    {!! $errors->first('serial', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -            </div>
        -
        -            <!-- Order Number -->
        -            <div class="form-group {{ $errors->has('order_number') ? 'error' : '' }}">
        -                <label class="control-label" for="order_number">{{ trans('admin/hardware/form.order') }}</label>
        -                <div class="controls">
        -                    <input class="col-md-4" type="text" name="order_number" id="order_number" value="{{ Input::old('order_number', $asset->order_number) }}" />
        -                    {!! $errors->first('order_number', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -            </div>
        -
        -                <!-- Model -->
        -            <div class="form-group {{ $errors->has('model_id') ? 'error' : '' }}">
        -                <label class="control-label" for="parent">{{ trans('admin/hardware/form.model') }}</label>
        -                <div class="controls">
        -                    {{ Form::select('model_id', $model_list , Input::old('model_id', $asset->model_id), array('class'=>'select2', 'style'=>'min-width:350px')) }}
        -                    {!! $errors->first('model_id', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -            </div>
        -
        -            <!-- Purchase Date -->
        -            <div class="form-group input-append {{ $errors->has('purchase_date') ? 'error' : '' }}" >
        -                <label class="control-label" for="purchase_date">{{ trans('admin/hardware/form.date') }}</label>
        -                <div class="controls">
        -                <input type="text" class="datepicker span2" data-date-format="yyyy-mm-dd" placeholder="Select Date" name="purchase_date" id="purchase_date" value="{{ Input::old('purchase_date', $asset->purchase_date) }}">
        -                {!! $errors->first('purchase_date', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -
        -                </div>
        -            </div>
        -
        -            <!-- Purchase Cost -->
        -            <div class="form-group {{ $errors->has('purchase_cost') ? 'error' : '' }}">
        -                <label class="control-label" for="purchase_cost">{{ trans('admin/hardware/form.cost') }}</label>
        -                <div class="controls">
        -                <div class="input-prepend">
        -                    <span class="add-on">$</span>
        -                    <input class="col-md-2" type="text" name="purchase_cost" id="purchase_cost" value="{{ Input::old('purchase_cost', $asset->purchase_cost) }}" />
        -                    {!! $errors->first('purchase_cost', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -                 </div>
        -            </div>
        -
        -            <!-- Warrantee -->
        -            <div class="form-group {{ $errors->has('warranty_months') ? 'error' : '' }}">
        -                <label class="control-label" for="serial">{{ trans('admin/hardware/form.warranty') }}</label>
        -                <div class="controls">
        -                    <input class="col-md-1" type="text" name="warranty_months" id="warranty_months" value="{{ Input::old('warranty_months', $asset->warranty_months) }}" />
        -                    {{ trans('admin/hardware/form.months') }}
        -                    {!! $errors->first('warranty_months', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -            </div>
        -
        -            <!-- Depreciation -->
        -            <div class="form-group {{ $errors->has('depreciation_id') ? 'error' : '' }}">
        -                <label class="control-label" for="parent">{{ trans('admin/hardware/form.depreciation') }}</label>
        -                <div class="controls">
        -                    <div class="field-box">
        -                    {{ Form::select('depreciation_id', $depreciation_list , Input::old('depreciation_id', $asset->depreciation_id), array('class'=>'select2', 'style'=>'width:250px')) }}
        -                    {!! $errors->first('depreciation_id', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                </div>
        -            </div>
        -
        -            <!-- Status -->
        -            <div class="form-group {{ $errors->has('status_id') ? 'error' : '' }}">
        -                <label class="control-label" for="parent">{{ trans('admin/hardware/form.status') }}</label>
        -                <div class="controls">
        -                    <div class="field-box">
        -                    {{ Form::select('status_id', $statuslabel_list , Input::old('status_id', $asset->status_id), array('class'=>'select2', 'style'=>'width:250px')) }}
        -                    {!! $errors->first('depreciation_id', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                </div>
        -            </div>
        -
        -
        -            <!-- Notes -->
        -            <div class="form-group {{ $errors->has('notes') ? 'error' : '' }}">
        -                <label class="control-label" for="notes">{{ trans('admin/hardware/form.notes') }}</label>
        -                <div class="controls">
        -                    <textarea class="col-md-6 form-control" id="notes" name="notes">{{ Input::old('notes', $asset->notes) }}</textarea>
        -                    {!! $errors->first('notes', '<span class="help-inline"><i class="fa fa-times"></i> :message</span>') !!}
        -                </div>
        -            </div>
        -
        -    <!-- Form actions -->
        -    <div class="form-group">
        -        <div class="controls">
        -            <a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
        -            <button type="submit" class="btn-flat success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        -        </div>
        -    </div>
        -</form>
        -
        -
        -@stop
        diff --git a/resources/views/hardware/edit.blade.php b/resources/views/hardware/edit.blade.php
        index c93d901d3a..7271be3cb0 100755
        --- a/resources/views/hardware/edit.blade.php
        +++ b/resources/views/hardware/edit.blade.php
        @@ -3,7 +3,8 @@
             'createText' => trans('admin/hardware/form.create'),
             'updateText' => trans('admin/hardware/form.update'),
             'helpTitle' => trans('admin/hardware/general.about_assets_title'),
        -    'helpText' => trans('admin/hardware/general.about_assets_text')
        +    'helpText' => trans('admin/hardware/general.about_assets_text'),
        +    'formAction' => ($item) ? route('hardware.update', ['hardware' => $item->id]) : route('hardware.store'),
         ])
         
         
        @@ -11,409 +12,346 @@
         
         @section('inputFields')
         
        -@include ('partials.forms.edit.company')
        -<!-- Asset Tag -->
        -<div class="form-group {{ $errors->has('asset_tag') ? ' has-error' : '' }}">
        +  @include ('partials.forms.edit.company')
        +  <!-- Asset Tag -->
        +  <div class="form-group {{ $errors->has('asset_tag') ? ' has-error' : '' }}">
             <label for="asset_tag" class="col-md-3 control-label">{{ trans('admin/hardware/form.tag') }}</label>
        -<div class="col-md-7 col-sm-12{{  (\App\Helpers\Helper::checkIfRequired($item, 'asset_tag')) ? ' required' : '' }}">
        -    @if  ($item->id)
        -    <input class="form-control" type="text" name="asset_tag" id="asset_tag" value="{{ Input::old('asset_tag', $item->asset_tag) }}" />
        -    @else
        -    <input class="form-control" type="text" name="asset_tag" id="asset_tag" value="{{ Input::old('asset_tag', \App\Models\Asset::autoincrement_asset()) }}">
        -    @endif
        +    <div class="col-md-7 col-sm-12{{  (\App\Helpers\Helper::checkIfRequired($item, 'asset_tag')) ? ' required' : '' }}">
        +      @if  ($item->id)
        +      <input class="form-control" type="text" name="asset_tag" id="asset_tag" value="{{ Input::old('asset_tag', $item->asset_tag) }}" />
        +      @else
        +      <input class="form-control" type="text" name="asset_tag" id="asset_tag" value="{{ Input::old('asset_tag', \App\Models\Asset::autoincrement_asset()) }}">
        +      @endif
        +      {!! $errors->first('asset_tag', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +    </div>
        +  </div>
         
        -    {!! $errors->first('asset_tag', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -</div>
        -</div>
        -
        -<!-- Model -->
        -<div class="form-group {{ $errors->has('model_id') ? ' has-error' : '' }}">
        +  <!-- Model -->
        +  <div class="form-group {{ $errors->has('model_id') ? ' has-error' : '' }}">
             <label for="parent" class="col-md-3 control-label">{{ trans('admin/hardware/form.model') }}</label>
        -<div class="col-md-7 col-sm-10{{  (\App\Helpers\Helper::checkIfRequired($item, 'model_id')) ? ' required' : '' }}">
        -    @if (isset($selected_model))
        -    {{ Form::select('model_id', $model_list , $selected_model->id, array('class'=>'select2 model', 'style'=>'width:100%','id' =>'model_select_id')) }}
        -
        -    @else
        -    {{ Form::select('model_id', $model_list , Input::old('model_id', $item->model_id), array('class'=>'select2 model', 'style'=>'width:100%','id' =>'model_select_id')) }}
        -    @endif
        -
        -    <!-- onclick="return dependency('model')" -->
        -    {!! $errors->first('model_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -
        -</div>
        -<div class="col-md-1 col-sm-1 text-left">
        -    <a href='#' data-toggle="modal" data-target="#createModal" data-dependency="model" data-select="model_select_id" class="btn btn-sm btn-default">New</a>
        -    <span class="mac_spinner" style="padding-left: 10px; color: green; display:none; width: 30px;"><i class="fa fa-spinner fa-spin"></i> </span>
        -</div>
        -</div>
        -
        -
        -<div id='custom_fields_content'>
        -    <!-- Custom Fields -->
        -    @if ($item->model && $item->model->fieldset)
        -    <?php $model=$item->model; ?>
        -    @endif
        -    @if (Input::old('model_id'))
        -    <?php $model=\App\Models\AssetModel::find(Input::old('model_id')); ?>
        -    @elseif (isset($selected_model))
        -    <?php $model=$selected_model; ?>
        -    @endif
        -    @if (isset($model) && $model)
        -    @include("models/custom_fields_form",["model" => $model])
        -    @endif
        -</div>
        -
        -@include ('partials.forms.edit.status')
        -
        -@if (!$item->id)
        -<!-- Assigned To -->
        -<div id="assigned_user" style="display: none;" class="form-group {{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        -    <label for="parent" class="col-md-3 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        -    </label>
        -    <div class="col-md-7 col-sm-12">
        -        {{ Form::select('assigned_to', $assigned_to , Input::old('assigned_to', $item->assigned_to), array('class'=>'select2', 'id'=>'assigned_to', 'style'=>'width:100%')) }}
        -
        -        {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -    </div>
        -    <div class="col-md-1 col-sm-1 text-left" style="margin-left: -20px; padding-top: 3px">
        -        <a href='#' data-toggle="modal"  data-target="#createModal" data-dependency="user" data-select='assigned_to' class="btn btn-sm btn-default">New</a>
        -    </div>
        -</div>
        -@endif
        -
        -@include ('partials.forms.edit.serial', ['translated_serial' => trans('admin/hardware/form.serial')])
        -@include ('partials.forms.edit.name', ['translated_name' => trans('admin/hardware/form.name')])
        -@include ('partials.forms.edit.purchase_date')
        -@include ('partials.forms.edit.supplier')
        -@include ('partials.forms.edit.order_number')
        -<?php
        -$currency_type=null;
        -if ($item->id && $item->assetloc) {
        -    $currency_type = $item->assetloc->currency;
        -}
        -?>
        -@include ('partials.forms.edit.purchase_cost', ['currency_type' => $currency_type])
        -@include ('partials.forms.edit.warranty')
        -@include ('partials.forms.edit.notes')
        -
        -<!-- Default Location -->
        -<div class="form-group {{ $errors->has('rtd_location_id') ? ' has-error' : '' }}">
        -    <label for="rtd_location_id" class="col-md-3 control-label">{{ trans('admin/hardware/form.default_location') }}</label>
        -    <div class="col-md-7 col-sm-11">
        -        {{ Form::select('rtd_location_id', $location_list , Input::old('rtd_location_id', $item->rtd_location_id), array('class'=>'select2', 'style'=>'width:100%','id'=>'rtd_location_select')) }}
        -
        -        {!! $errors->first('rtd_location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +    <div class="col-md-7 col-sm-10{{  (\App\Helpers\Helper::checkIfRequired($item, 'model_id')) ? ' required' : '' }}">
        +      @if (isset($selected_model))
        +      {{ Form::select('model_id', $model_list , $selected_model->id, array('class'=>'select2 model', 'style'=>'width:100%','id' => 'model_select_id', 'id' =>'model_select_id')) }}
        +      @else
        +      {{ Form::select('model_id', $model_list , Input::old('model_id', $item->model_id), array('class'=>'select2 model', 'id' => 'model_select_id', 'style'=>'width:100%','id' =>'model_select_id')) }}
        +      @endif
        +      <!-- onclick="return dependency('model')" -->
        +      {!! $errors->first('model_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
             </div>
             <div class="col-md-1 col-sm-1 text-left">
        -        <a href='#' data-toggle="modal" data-target="#createModal" data-dependency='location' data-select='rtd_location_select' class="btn btn-sm btn-default">New</a>
        +        <a href='{{ route('modal.model') }}' data-toggle="modal" data-target="#createModal" data-dependency="model" data-select="model_select_id" class="btn btn-sm btn-default">New</a>
        +        <span class="mac_spinner" style="padding-left: 10px; color: green; display:none; width: 30px;"><i class="fa fa-spinner fa-spin"></i> </span>
             </div>
        -</div>
        +  </div>
         
        -@include ('partials.forms.edit.requestable', ['requestable_text' => trans('admin/hardware/general.requestable')])
         
        -<!-- Image -->
        -@if ($item->image)
        -<div class="form-group {{ $errors->has('image_delete') ? 'has-error' : '' }}">
        -    <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label>
        -    <div class="col-md-5">
        -        {{ Form::checkbox('image_delete'),array('class' => 'minimal') }}
        -        <img src="{{ config('app.url') }}/uploads/assets/{{ $item->image }}" />
        -        {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
        +  <div id='custom_fields_content'>
        +      <!-- Custom Fields -->
        +      @if ($item->model && $item->model->fieldset)
        +      <?php $model=$item->model; ?>
        +      @endif
        +      @if (Input::old('model_id'))
        +        <?php $model=\App\Models\AssetModel::find(Input::old('model_id')); ?>
        +      @elseif (isset($selected_model))
        +        <?php $model=$selected_model; ?>
        +      @endif
        +      @if (isset($model) && $model)
        +      @include("models/custom_fields_form",["model" => $model])
        +      @endif
        +  </div>
        +
        +  @include ('partials.forms.edit.status')
        +
        +  @if (!$item->id)
        +  <!-- Assigned To -->
        +  <div id="assigned_user" style="display: none;" class="form-group {{ $errors->has('assigned_user') ? ' has-error' : '' }}">
        +    <label for="parent" class="col-md-3 control-label">
        +      {{ trans('admin/hardware/form.checkout_to') }}
        +    </label>
        +    <div class="col-md-7 col-sm-12">
        +      {{ Form::select('assigned_user', $users_list , Input::old('assigned_user', $item->assigned_type == 'App\Models\User' ? $item->assigned_to : 0), array('class'=>'select2', 'id'=>'assigned_user', 'style'=>'width:100%')) }}
        +      {!! $errors->first('assigned_user', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
             </div>
        -</div>
        -@endif
        +    <div class="col-md-1 col-sm-1 text-left" style="margin-left: -20px; padding-top: 3px">
        +        @can('users.create')
        +      <a href='{{ route('modal.user') }}' data-toggle="modal"  data-target="#createModal" data-dependency="user" data-select='assigned_user' class="btn btn-sm btn-default">New</a>
        +        @endcan
        +    </div>
        +  </div>
         
        -<div class="form-group {{ $errors->has('image') ? 'has-error' : '' }}">
        +  <!-- Assets -->
        +  <div id="assigned_asset" style="display: none;" class="form-group{{ $errors->has('assigned_asset') ? ' has-error' : '' }}">
        +    {{ Form::label('assigned_asset', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        +    <div class="col-md-7">
        +      {{ Form::select('assigned_asset', $assets_list , Input::old('assigned_asset', $item->assigned_type == 'App\Models\Asset' ? $item->assigned_to : 0), array('class'=>'select2', 'id'=>'assigned_asset', 'style'=>'width:100%')) }}
        +      {!! $errors->first('assigned_asset', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +    </div>
        +
        +  </div>
        +
        +  <!-- Locations -->
        +  <div id="assigned_location" style="display: none;" class="form-group{{ $errors->has('assigned_location') ? ' has-error' : '' }}">
        +    {{ Form::label('assigned_location', trans('admin/hardware/form.checkout_to'), array('class' => 'col-md-3 control-label')) }}
        +    <div class="col-md-7">
        +      {{ Form::select('assigned_location', $locations_list , Input::old('assigned_location', $item->assigned_type == 'App\Models\Asset' ? $item->assigned_to : 0), array('class'=>'select2', 'id'=>'assigned_location', 'style'=>'width:100%')) }}
        +
        +      {!! $errors->first('assigned_location', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +    </div>
        +    <div class="col-md-1 col-sm-1 text-left">
        +      <a href='{{ route('modal.location') }}' data-toggle="modal"  data-target="#createModal" data-dependency="location" data-select='assigned_location' class="btn btn-sm btn-default">New</a>
        +    </div>
        +  </div>
        +  @endif
        +
        +  @include ('partials.forms.edit.serial', ['translated_serial' => trans('admin/hardware/form.serial')])
        +  @include ('partials.forms.edit.name', ['translated_name' => trans('admin/hardware/form.name')])
        +  @include ('partials.forms.edit.purchase_date')
        +  @include ('partials.forms.edit.supplier')
        +  @include ('partials.forms.edit.order_number')
        +    <?php
        +    $currency_type=null;
        +    if ($item->id && $item->assetloc) {
        +        $currency_type = $item->assetloc->currency;
        +    }
        +    ?>
        +  @include ('partials.forms.edit.purchase_cost', ['currency_type' => $currency_type])
        +  @include ('partials.forms.edit.warranty')
        +  @include ('partials.forms.edit.notes')
        +
        +  <!-- Default Location -->
        +  <div class="form-group {{ $errors->has('rtd_location_id') ? ' has-error' : '' }}">
        +    <label for="rtd_location_id" class="col-md-3 control-label">{{ trans('admin/hardware/form.default_location') }}</label>
        +    <div class="col-md-7 col-sm-11">
        +      {{ Form::select('rtd_location_id', $locations_list , Input::old('rtd_location_id', $item->rtd_location_id), array('class'=>'select2', 'style'=>'width:100%','id'=>'rtd_location_select')) }}
        +
        +      {!! $errors->first('rtd_location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +      </div>
        +      <div class="col-md-1 col-sm-1 text-left">
        +        <a href='{{ route('modal.location') }}' data-toggle="modal" data-target="#createModal" data-dependency='location' data-select='rtd_location_select' class="btn btn-sm btn-default">New</a>
        +      </div>
        +  </div>
        +
        +  @include ('partials.forms.edit.requestable', ['requestable_text' => trans('admin/hardware/general.requestable')])
        +
        +  <!-- Image -->
        +  @if ($item->image)
        +  <div class="form-group {{ $errors->has('image_delete') ? 'has-error' : '' }}">
        +      <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label>
        +      <div class="col-md-5">
        +          <label class="control-label" for="image_delete">
        +          <input type="checkbox" value="1" name="image_delete" id="image_delete" class="minimal" {{ Input::old('image_delete') == '1' ? ' checked="checked"' : '' }}>
        +          {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
        +          </label>
        +          <div style="margin-top: 0.5em">
        +              <img src="{{ url('/') }}/uploads/assets/{{ $item->image }}" class="img-responsive"/>
        +          </div>
        +      </div>
        +  </div>
        +  @endif
        +
        +  <div class="form-group {{ $errors->has('image') ? 'has-error' : '' }}">
             <label class="col-md-3 control-label" for="image">{{ trans('general.image_upload') }}</label>
             <div class="col-md-5">
        -        <!-- {{ Form::file('image') }} -->
        -        <input type="file" id="file-upload" accept="image/*" name="image">
        -        {!! $errors->first('image', '<span class="alert-msg">:message</span>') !!}
        +      <input type="file" id="file-upload" accept="image/*" name="image">
        +      {!! $errors->first('image', '<span class="alert-msg">:message</span>') !!}
             </div>
        -</div>
        +  </div>
         
         @stop
         
         @section('moar_scripts')
        -@include('partials/modals')
         <script>
         
        +
        +
             function fetchCustomFields() {
        -      var modelid=$('#model_select_id').val();
        -      if(modelid=='') {
        -        $('#custom_fields_content').html("");
        -      } else {
        -        $.get("{{config('app.url') }}/hardware/models/"+modelid+"/custom_fields",{_token: "{{ csrf_token() }}"},function (data) {
        -          $('#custom_fields_content').html(data);
        -        });
        -      }
        -    }
        +        var modelid = $('#model_select_id').val();
        +        if (modelid == '') {
        +            $('#custom_fields_content').html("");
        +        } else {
         
        -    $(function() {
        -      $('#model_select_id').on("change",fetchCustomFields);
        -    });
        -
        -    $(function() {
        -        user_add($(".status_id option:selected").val());
        -    });
        -
        -	var $statusSelect = $(".status_id");
        -	$statusSelect.on("change", function () {
        -        user_add($statusSelect.val());
        -    });
        -
        -	function user_add(status_id) {
        -
        -        if(status_id!=''){
        -            $(".status_spinner").css("display", "inline");
        -    	    $.ajax({
        -    	        url: "{{config('app.url') }}/api/statuslabels/"+status_id+"/deployable",
        -    	        success: function(data) {
        -                    $(".status_spinner").css("display", "none");
        -
        -    	            if(data == true){
        -    	                 $("#assigned_user").css("display", "block");
        -    	            } else {
        -    	                 $("#assigned_user").css("display", "none");
        -    	            }
        -                }
        -    	    });
        -        }
        -	};
        -
        -$(function () {
        -  var model,select;
        -
        -  $('#createModal').on("show.bs.modal",function (event) {
        -    var link = $(event.relatedTarget);
        -    model=link.data("dependency");
        -    select=link.data("select");
        -
        -    var modal = $(this);
        -    modal.find('.modal-title').text('Add a new ' + model);
        -
        -    $('.dynamic-form-row').hide();
        -    function show_er(selector) {
        -      //$(selector).show().parent().show();
        -      $(selector).parent().parent().show();
        -    }
        -    show_er('#modal-name');
        -    switch(model) {
        -      case 'model':
        -      show_er('#modal-manufacturer_id');
        -      show_er('#modal-category_id');
        -      show_er('#modal-model_number');
        -      show_er('#modal-fieldset_id');
        -      break;
        -
        -      case 'user':
        -      $('.dynamic-form-row').hide(); //we don't want a generic "name"
        -      show_er("#modal-first_name");
        -      show_er("#modal-last_name");
        -      show_er("#modal-username");
        -      show_er("#modal-password");
        -      show_er("#modal-password_confirm");
        -      break;
        -
        -      case 'location':
        -      show_er('#modal-city');
        -      show_er('#modal-country');
        -      break;
        -
        -      case 'statuslabel':
        -      show_er("#modal-statuslabel_types");
        -      break;
        -
        -      case 'supplier':
        -
        -      //do nothing, they just need 'name'
        -    }
        -
        -    //console.warn("The Model is: "+model+" and the select is: "+select);
        -  });
        -
        -   $("form").submit( function(event) {
        -    event.preventDefault();
        -    return sendForm();
        -  });
        -
        -  // Resize Files when chosen
        -
        -
        -
        -    //First check to see if there is a file before doing anything else
        -
        -    var imageData = "";
        -    var $fileInput = $('#file-upload'); 
        -    $fileInput.on('change', function(e) {
        -      if( $fileInput != '' ) {
        -        if(window.File && window.FileReader && window.FormData) {
        -          var file = e.target.files[0];
        -          if(file) {
        -            if(/^image\//i.test(file.type)) {
        -              readFile(file);
        -            } else {
        -              alert('Invalid Image File :(');
        -            }
        -          }
        -        }
        -        else {
        -          console.log("File API not supported, not resizing");
        -        } 
        -      }
        -    });
        -
        -
        -  function readFile(file) {
        -    var reader = new FileReader();
        -
        -    reader.onloadend = function() {
        -      processFile(reader.result, file.type);
        -    }
        -
        -    reader.onerror = function() { 
        -      alert("Unable to read file");
        -    }
        -
        -    reader.readAsDataURL(file);
        -  }
        -
        -  function processFile(dataURL, fileType) {
        -    var maxWidth = 800;
        -    var maxHeight = 800;
        -
        -    var image = new Image();
        -    image.src = dataURL;
        -
        -    image.onload = function() {
        -      var width = image.width;
        -      var height = image.height;
        -      var shouldResize = (width > maxWidth) || (height > maxHeight);
        -
        -      if(!shouldResize) {
        -        imageData = dataURL;
        -        return;
        -      }
        -
        -      var newWidth;
        -      var newHeight;
        -
        -      if( width > height) {
        -        newHeight = height * (maxWidth/width);
        -        newWidth = maxWidth;
        -      } else {
        -        newWidth = width * (maxHeight/height);
        -        newHeight = maxHeight;
        -      }
        -      var canvas = document.createElement('canvas');
        -
        -      canvas.width = newWidth;
        -      canvas.height = newHeight;
        -
        -      var context = canvas.getContext('2d');
        -
        -      context.drawImage(this, 0, 0, newWidth, newHeight);
        -
        -      dataURL = canvas.toDataURL( fileType );
        -
        -      imageData = dataURL;
        -
        -    };
        -
        -    image.onerror = function () {
        -      alert('Unable to process file :(');
        -    }
        -  }
        -
        -  function sendForm() {
        -    var form = $("#create-form").get(0);
        -    var formData = $('#create-form').serializeArray();
        -    formData.push({name:'image', value:imageData});
        -    $.ajax({
        -      type: 'POST',
        -      url: form.action,
        -      headers:{"X-Requested-With": 'XMLHttpRequest'},
        -      data: formData,
        -      dataType: 'json',
        -      success: function(data) {
        -        // AssetController flashes success to session, redirect to hardware page.
        -         window.location.href = data.redirect_url;
        -         // console.dir(data);
        -         // console.log('submit was successful');
        -      },
        -      error: function(data) {
        -        // AssetRequest Validator will flash all errors to session, this just refreshes to see them.
        -        window.location.reload(true);
        -        // console.log(JSON.stringify(data));
        -         // console.log('error submitting');
        -      }
        -    });
        -
        -    return false;
        -  }
        -
        -
        -  $('#modal-save').on('click',function () {
        -    var data={};
        -    //console.warn("We are about to SAVE!!! for model: "+model+" and select ID: "+select);
        -    $('.modal-body input:visible').each(function (index,elem) {
        -      //console.warn("["+index+"]: "+elem.id+" = "+$(elem).val());
        -      var bits=elem.id.split("-");
        -      if(bits[0]==="modal") {
        -        data[bits[1]]=$(elem).val();
        -      }
        -    });
        -    $('.modal-body select:visible').each(function (index,elem) {
        -      var bits=elem.id.split("-");
        -      data[bits[1]]=$(elem).val();
        -    });
        -
        -    data._token =  '{{ csrf_token() }}',
        -    //console.dir(data);
        -
        -    $.post("{{config('app.url') }}/api/"+model+"s",data,function (result) {
        -      var id=result.id;
        -      var name=result.name || (result.first_name+" "+result.last_name);
        -      $('.modal-body input:visible').val("");
        -      $('#createModal').modal('hide');
        -
        -      //console.warn("The select ID thing we're going for is: "+select);
        -      var selector=document.getElementById(select);
        -      selector.options[selector.length]=new Option(name,id);
        -      selector.selectedIndex=selector.length-1;
        -      $(selector).trigger("change");
        -      fetchCustomFields();
        -
        -    }).fail(function (result) {
        -      //console.dir(result.responseJSON);
        -      msg=result.responseJSON.error.message || result.responseJSON.error;
        -      window.alert("Unable to add new "+model+" - error: "+msg);
        -    });
        -
        -  });
        -});
        -</script>
        -
        -    <script src="{{ asset('assets/js/pGenerator.jquery.js') }}"></script>
        -
        -    <script>
        -
        -
        -        $(document).ready(function(){
        -
        -            $('#genPassword').pGenerator({
        -                'bind': 'click',
        -                'passwordElement': '#modal-password',
        -                'displayElement': '#generated-password',
        -                'passwordLength': 16,
        -                'uppercase': true,
        -                'lowercase': true,
        -                'numbers':   true,
        -                'specialChars': true,
        -                'onPasswordGenerated': function(generatedPassword) {
        -                    $('#modal-password_confirm').val($('#modal-password').val());
        +            $.ajax({
        +                type: 'GET',
        +                url: "{{url('/') }}/models/" + modelid + "/custom_fields",
        +                headers: {
        +                    "X-Requested-With": 'XMLHttpRequest',
        +                    "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +                },
        +                _token: "{{ csrf_token() }}",
        +                dataType: 'html',
        +                success: function (data) {
        +                    data: data,
        +                    $('#custom_fields_content').html(data);
                         }
                     });
        +        }
        +    }
        +
        +    function user_add(status_id) {
        +
        +        if (status_id != '') {
        +            $(".status_spinner").css("display", "inline");
        +            $.ajax({
        +                url: "{{url('/') }}/api/v1/statuslabels/" + status_id + "/deployable",
        +                headers: {
        +                    "X-Requested-With": 'XMLHttpRequest',
        +                    "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +                },
        +                success: function (data) {
        +                    $(".status_spinner").css("display", "none");
        +
        +                    if (data == true) {
        +                        $("#assigned_user").css("display", "block");
        +                        $("#assigned_location").css("display", "block");
        +                        $("#assigned_asset").css("display", "block");
        +                    } else {
        +                        $("#assigned_user").css("display", "none");
        +                        $("#assigned_location").css("display", "none");
        +                        $("#assigned_asset").css("display", "none");
        +                    }
        +                }
        +            });
        +        }
        +    }
        +    ;
        +
        +    $(function () {
        +        //grab custom fields for this model whenever model changes.
        +        $('#model_select_id').on("change", fetchCustomFields);
        +
        +        //initialize assigned user/loc/asset based on statuslabel's statustype
        +        user_add($(".status_id option:selected").val());
        +
        +        //whenever statuslabel changes, update assigned user/loc/asset
        +        $(".status_id").on("change", function () {
        +            user_add($(".status_id").val());
                 });
        -    </script>
        +
        +        $("form").submit(function (event) {
        +            event.preventDefault();
        +            return sendForm();
        +        });
        +
        +        // Resize Files when chosen
        +        //First check to see if there is a file before doing anything else
        +
        +        var imageData = "";
        +        var $fileInput = $('#file-upload');
        +        $fileInput.on('change', function (e) {
        +            if ($fileInput != '') {
        +                if (window.File && window.FileReader && window.FormData) {
        +                    var file = e.target.files[0];
        +                    if (file) {
        +                        if (/^image\//i.test(file.type)) {
        +                            readFile(file);
        +                        } else {
        +                            alert('Invalid Image File :(');
        +                        }
        +                    }
        +                }
        +                else {
        +                    console.log("File API not supported, not resizing");
        +                }
        +            }
        +        });
        +
        +
        +        function readFile(file) {
        +            var reader = new FileReader();
        +
        +            reader.onloadend = function () {
        +                processFile(reader.result, file.type);
        +            }
        +
        +            reader.onerror = function () {
        +                alert("Unable to read file");
        +            }
        +
        +            reader.readAsDataURL(file);
        +        }
        +
        +        function processFile(dataURL, fileType) {
        +            var maxWidth = 800;
        +            var maxHeight = 800;
        +
        +            var image = new Image();
        +            image.src = dataURL;
        +
        +            image.onload = function () {
        +                var width = image.width;
        +                var height = image.height;
        +                var shouldResize = (width > maxWidth) || (height > maxHeight);
        +
        +                if (!shouldResize) {
        +                    imageData = dataURL;
        +                    return;
        +                }
        +
        +                var newWidth;
        +                var newHeight;
        +
        +                if (width > height) {
        +                    newHeight = height * (maxWidth / width);
        +                    newWidth = maxWidth;
        +                } else {
        +                    newWidth = width * (maxHeight / height);
        +                    newHeight = maxHeight;
        +                }
        +                var canvas = document.createElement('canvas');
        +
        +                canvas.width = newWidth;
        +                canvas.height = newHeight;
        +
        +                var context = canvas.getContext('2d');
        +
        +                context.drawImage(this, 0, 0, newWidth, newHeight);
        +
        +                dataURL = canvas.toDataURL(fileType);
        +
        +                imageData = dataURL;
        +
        +            };
        +
        +            image.onerror = function () {
        +                alert('Unable to process file :(');
        +            }
        +        }
        +
        +        function sendForm() {
        +            var form = $("#create-form").get(0);
        +            var formData = $('#create-form').serializeArray();
        +            formData.push({name: 'image', value: imageData});
        +            $.ajax({
        +                type: 'POST',
        +                url: form.action,
        +                headers: {
        +                    "X-Requested-With": 'XMLHttpRequest',
        +                    "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +                },
        +                data: formData,
        +                dataType: 'json',
        +                success: function (data) {
        +                    // console.dir(data);
        +                    // AssetController flashes success to session, redirect to hardware page.
        +                    if (data.redirect_url) {
        +                        window.location.href = data.redirect_url;
        +                        return true;
        +                    }
        +                    window.location.reload(true);
        +                    return false;
        +
        +                },
        +                error: function (data) {
        +                    // AssetRequest Validator will flash all errors to session, this just refreshes to see them.
        +                    window.location.reload(true);
        +                    // console.log(JSON.stringify(data));
        +                    // console.log('error submitting');
        +                }
        +            });
        +
        +            return false;
        +        }
        +
        +    });
        +</script>
         @stop
        diff --git a/resources/views/hardware/history.blade.php b/resources/views/hardware/history.blade.php
        index f12f1f561c..b2b08bd807 100644
        --- a/resources/views/hardware/history.blade.php
        +++ b/resources/views/hardware/history.blade.php
        @@ -7,7 +7,7 @@
         @stop
         
         @section('header_right')
        -    <a href="{{ route('hardware') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +    <a href="{{ route('hardware.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
         @stop
         
         {{-- Page content --}}
        diff --git a/resources/views/hardware/import.blade.php b/resources/views/hardware/import.blade.php
        deleted file mode 100644
        index e5c1d4b415..0000000000
        --- a/resources/views/hardware/import.blade.php
        +++ /dev/null
        @@ -1,222 +0,0 @@
        -@extends('layouts/default')
        -
        -{{-- Page title --}}
        -@section('title')
        -     {{ trans('general.import') }}
        -@parent
        -@stop
        -
        -{{-- Page content --}}
        -@section('content')
        -
        -
        -{{-- Modal import dialog --}}
        -
        -@if (session()->has('import_errors'))
        -    <div class="box">
        -        <div class="box-body">
        -            <div class="alert alert-warning">
        -                <strong>Warning</strong> {{trans('admin/hardware/message.import.errorDetail')}}
        -            </div>
        -
        -    <div class="errors-table">
        -
        -        <table class="table table-striped table-bordered" id="errors-table">
        -            <thead>
        -            <th>Asset</th>
        -            <th>Errors</th>
        -            </thead>
        -            <tbody>
        -            @foreach (session('import_errors') as $asset => $itemErrors)
        -                <tr>
        -                    <td> {{ $asset }}</td>
        -                    <td>
        -                        @foreach ($itemErrors as $field => $values )
        -                            <b>{{ $field }}:</b>
        -                            @foreach( $values as $errorString)
        -                                <span>{{$errorString[0]}} </span>
        -                            @endforeach
        -                            <br />
        -                        @endforeach
        -                    </td>
        -                </tr>
        -            @endforeach
        -            </tbody>
        -        </table>
        -    </div>
        -        </div>
        -    </div>
        -@endif
        -
        -
        -<div class="modal fade" id="importModal">
        -    <form id="import-modal-form" class="form-horizontal" method="post" action="{{ route('assets/import/process-file') }}" autocomplete="off" role="form">
        -        {{ csrf_field()}}
        -        <input type="hidden" id="modal-filename" name="filename" value="">
        -        <div class="modal-dialog">
        -            <div class="modal-content">
        -                <div class="modal-header">
        -                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        -                    <h4 class="modal-title">Import File:</h4>
        -                </div>
        -                <div class="modal-body">
        -
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12">
        -                            <label for="import-type">Import Type:</label>
        -                        </div>
        -                        <div class="col-md-8 col-xs-12">
        -                            {{ Form::select('import-type', array('asset' => 'Assets', 'accessory' => "Accessories", 'consumable' => "Consumables") , 'asset', array('class'=>'select2 parent', 'style'=>'width:100%','id' =>'import-type')) }}
        -                        </div>
        -                    </div>
        -                    <div class="dynamic-form-row">
        -                        <div class="col-md-4 col-xs-12">
        -                            <label for="import-update">Update Existing Values?:</label>
        -                        </div>
        -                        <div class="col-md-8 col-xs-12">
        -                            {{ Form::checkbox('import-update') }}
        -                        </div>
        -                    </div>
        -                </div>
        -                <div class="modal-footer">
        -                    <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        -                    <!-- <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button> -->
        -                    {{Form::submit(trans('general.save'), ['class' => 'btn btn-primary'])}}
        -                </div>
        -            </div>
        -        </div>
        -    </form>
        -</div>
        -
        -
        -<div class="row">
        -  <div class="col-md-12">
        -        <div class="box">
        -          <div class="box-body">
        -
        -                <div class="col-md-3">
        -                <!-- The fileinput-button span is used to style the file input field as button -->
        -                    <span class="btn btn-info fileinput-button">
        -                        <i class="fa fa-plus icon-white"></i>
        -                        <span>Select Import File...</span>
        -                        <!-- The file input field used as target for the file upload widget -->
        -                        <input id="fileupload" type="file" name="files[]" data-url="{{ config('app.url') }}/api/hardware/import" accept="text/csv">
        -                    </span>
        -                </div>
        -                <div class="col-md-9" id="progress-container" style="visibility: hidden; padding-bottom: 20px;">
        -                <!-- The global progress bar -->
        -                <div class="col-md-11">
        -                    <div id="progress" class="progress progress-striped active" style="margin-top: 8px;">
        -                        <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" style="width: 45%">
        -                            <span id="progress-bar-text">0% Complete</span>
        -                        </div>
        -                    </div>
        -                </div>
        -                <div class="col-md-1">
        -                    <div class="pull-right progress-checkmark" style="display: none;">
        -                    </div>
        -                </div>
        -            </div>
        -                <div class="row">
        -                    <div class="col-md-12">
        -
        -                        <table class="table table-striped" id="upload-table">
        -                            <thead>
        -                                <th>File</th>
        -                                <th>Created</th>
        -                                <th>Size</th>
        -                                <th></th>
        -                            </thead>
        -                            <tbody>
        -                                @foreach ($files as $file)
        -                                <tr>
        -                                    <td>{{ $file['filename'] }}</td>
        -                                    <td>{{ date("M d, Y g:i A", $file['modified']) }} </td>
        -                                    <td>{{ $file['filesize'] }}</td>
        -                                    <td>
        -                                        <a href="#" data-toggle="modal" data-target="#importModal" data-filename={{$file['filename']}} class="btn btn-sm btn-info"><i class="fa fa-spinner process"></i> Process</a>
        -                                        <a class="btn btn-danger btn-sm" href="import/delete/{{ $file['filename'] }}"><i class="fa fa-trash icon-white"></i></a>
        -                                    </td>
        -                                </tr>
        -                                @endforeach
        -                            </tbody>
        -                        </table>
        -                    </div>
        -                </div>
        -            </div>
        -        </div>
        -
        -
        -    </div>
        -</div>
        -@section('moar_scripts')
        -
        -    <link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/jquery.fileupload.css') }}">
        -    <link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/jquery.fileupload-ui.css') }}">
        -
        -
        -        <script>
        -        $(function () {
        -            //binds to onchange event of your input field
        -            var uploadedFileSize = 0;
        -            $('#fileupload').bind('change', function() {
        -              uploadedFileSize = this.files[0].size;
        -              $('#progress-container').css('visibility', 'visible');
        -            });
        -
        -            $('.process').bind('click', function() {
        -              $('.process').addClass('fa-spin');
        -            });
        -
        -            $('#fileupload').fileupload({
        -                //maxChunkSize: 100000,
        -                dataType: 'json',
        -                formData: {_token: '{{ csrf_token() }}'},
        -                progress: function (e, data) {
        -                    //var overallProgress = $('#fileupload').fileupload('progress');
        -                    //var activeUploads = $('#fileupload').fileupload('active');
        -                    var progress = parseInt((data.loaded / uploadedFileSize) * 100, 10);
        -                    $('.progress-bar').addClass('progress-bar-warning').css('width',progress + '%');
        -                    $('#progress-bar-text').html(progress + '%');
        -                    //console.dir(overallProgress);
        -                },
        -
        -                done: function (e, data) {
        -                    console.dir(data);
        -
        -                    // We use this instead of the fail option, since our API
        -                    // returns a 200 OK status which always shows as "success"
        -
        -                    if (data && data.jqXHR.responseJSON && data.jqXHR.responseJSON.error) {
        -                        $('#progress-bar-text').html(data.jqXHR.responseJSON.error);
        -                        $('.progress-bar').removeClass('progress-bar-warning').addClass('progress-bar-danger').css('width','100%');
        -                        $('.progress-checkmark').fadeIn('fast').html('<i class="fa fa-times fa-3x icon-white" style="color: #d9534f"></i>');
        -                        //console.log(data.jqXHR.responseJSON.error);
        -                    } else {
        -                        $('.progress-bar').removeClass('progress-bar-warning').removeClass('progress-bar-danger').addClass('progress-bar-success').css('width','100%');
        -                        $('.progress-checkmark').fadeIn('fast');
        -                        $('#progress-container').delay(950).css('visibility', 'visible');
        -                        $('.progress-bar-text').html('Finished!');
        -                        $('.progress-checkmark').fadeIn('fast').html('<i class="fa fa-check fa-3x icon-white" style="color: green"></i>');
        -                        $.each(data.result.files, function (index, file) {
        -                            $('<tr><td>' + file.name + '</td><td>Just now</td><td>' + file.filesize + '</td><td><a class="btn btn-info btn-sm" href="#" data-toggle="modal" data-target="#importModal" data-filename='+ file.name + '><i class="fa fa-spinner process"></i> Process</a> <a class="btn btn-danger btn-sm" href="import/delete/' +file.name + '"><i class="fa fa-trash icon-white"></i></a></td></tr>').prependTo("#upload-table > tbody");
        -                        });
        -                    }
        -                    $('#progress').removeClass('active');
        -
        -
        -                }
        -            });
        -        });
        -
        -        // Modal Import options handling
        -        $('#importModal').on("show.bs.modal", function(event) {
        -            var link = $(event.relatedTarget);
        -            var filename = link.data('filename');
        -            $(this).find('.modal-title').text("Import File: " + filename );
        -            $("#modal-filename").val(filename);
        -        });
        -        </script>
        -@stop
        -
        -@stop
        diff --git a/resources/views/hardware/index.blade.php b/resources/views/hardware/index.blade.php
        index 04b52f5aaa..24aa20aa1a 100755
        --- a/resources/views/hardware/index.blade.php
        +++ b/resources/views/hardware/index.blade.php
        @@ -2,36 +2,47 @@
         
         @section('title0')
         
        -    @if (Input::get('status'))
        -        @if (Input::get('status')=='Pending')
        -            {{ trans('general.pending') }}
        -        @elseif (Input::get('status')=='RTD')
        -            {{ trans('general.ready_to_deploy') }}
        -        @elseif (Input::get('status')=='Undeployable')
        -            {{ trans('general.undeployable') }}
        -        @elseif (Input::get('status')=='Deployable')
        -            {{ trans('general.deployed') }}
        -         @elseif (Input::get('status')=='Requestable')
        -            {{ trans('admin/hardware/general.requestable') }}
        -        @elseif (Input::get('status')=='Archived')
        -            {{ trans('general.archived') }}
        -         @elseif (Input::get('status')=='Deleted')
        -            {{ trans('general.deleted') }}
        -        @endif
        -    @else
        -            {{ trans('general.all') }}
        -    @endif
        +  @if ((Input::get('company_id')) && ($company))
        +    {{ $company->name }}
        +  @endif
         
        -    {{ trans('general.assets') }}
        +
        +
        +@if (Input::get('status'))
        +  @if (Input::get('status')=='Pending')
        +    {{ trans('general.pending') }}
        +  @elseif (Input::get('status')=='RTD')
        +    {{ trans('general.ready_to_deploy') }}
        +  @elseif (Input::get('status')=='Undeployable')
        +    {{ trans('general.undeployable') }}
        +  @elseif (Input::get('status')=='Deployable')
        +    {{ trans('general.deployed') }}
        +  @elseif (Input::get('status')=='Requestable')
        +    {{ trans('admin/hardware/general.requestable') }}
        +  @elseif (Input::get('status')=='Archived')
        +    {{ trans('general.archived') }}
        +  @elseif (Input::get('status')=='Deleted')
        +    {{ trans('general.deleted') }}
        +  @endif
        +@else
        +{{ trans('general.all') }}
        +@endif
        +{{ trans('general.assets') }}
        +
        +  @if (Input::has('order_number'))
        +    : Order #{{ Input::get('order_number') }}
        +  @endif
         @stop
         
         {{-- Page title --}}
         @section('title')
        -    @yield('title0')  @parent
        +@yield('title0')  @parent
         @stop
         
         @section('header_right')
        -<a href="{{ route('create/hardware') }}" class="btn btn-primary pull-right"></i> {{ trans('general.create') }}</a>
        +  <a href="{{ route('reports/export/assets') }}" style="margin-right: 5px;" class="btn btn-default"><i class="fa fa-download icon-white"></i>
        +    {{ trans('admin/hardware/table.dl_csv') }}</a>
        +  <a href="{{ route('hardware.create') }}" class="btn btn-primary pull-right"></i> {{ trans('general.create') }}</a>
         @stop
         
         {{-- Page content --}}
        @@ -39,128 +50,56 @@
         
         <div class="row">
           <div class="col-md-12">
        -        <div class="box">
        -          <div class="box-body">
        -            {{ Form::open([
        -                 'method' => 'POST',
        -                 'route' => ['hardware/bulkedit'],
        -                 'class' => 'form-inline' ]) }}
        -            <div class="row">
        -              <div class="col-md-12">
        -                @if (Input::get('status')!='Deleted')
        -                <div id="toolbar">
        -                  <select name="bulk_actions" class="form-control select2">
        -                      <option value="edit">Edit</option>
        -                      <option value="delete">Delete</option>
        -                      <option value="labels">Generate Labels</option>
        -                  </select>
        -                  <button class="btn btn-default" id="bulkEdit" disabled>Go</button>
        -                </div>
        -                  @endif
        -
        -
        -                <table
        -                name="assets"
        -                {{-- data-row-style="rowStyle" --}}
        -                data-toolbar="#toolbar"
        -                class="table table-striped snipe-table"
        -                id="table"
        -                data-url="{{route('api.hardware.list', array(''=>e(Input::get('status')),'order_number'=>e(Input::get('order_number')), 'status_id'=>e(Input::get('status_id'))))}}"
        -                data-cookie="true"
        -                data-click-to-select="true"
        -                data-cookie-id-table="{{ e(Input::get('status')) }}assetTable-{{ config('version.hash_version') }}">
        -                    <thead>
        -                        <tr>
        -                            @if (Input::get('status')!='Deleted')
        -                            <th data-class="hidden-xs" data-switchable="false" data-searchable="false" data-sortable="false" data-field="checkbox"><div class="text-center"><input type="checkbox" id="checkAll" style="padding-left: 0px;"></div></th>
        -                            @endif
        -                            <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                            <th data-field="companyName" data-searchable="true" data-sortable="true" data-switchable="true" data-visible="false">{{ trans('general.company') }}</th>
        -                            <th data-sortable="true" data-field="image" data-visible="false">{{ trans('admin/hardware/table.image') }}</th>
        -                            <th data-sortable="true" data-field="name" data-visible="false">{{ trans('admin/hardware/form.name') }}</th>
        -                            <th data-sortable="true" data-field="asset_tag">{{ trans('admin/hardware/table.asset_tag') }}</th>
        -                            <th data-sortable="true" data-field="serial">{{ trans('admin/hardware/table.serial') }}</th>
        -                            <th data-sortable="true" data-field="model">{{ trans('admin/hardware/form.model') }}</th>
        -                            <th data-sortable="true" data-field="model_number" data-visible="false">{{ trans('admin/models/table.modelnumber') }}</th>
        -                            <th data-sortable="true" data-field="status_label">{{ trans('admin/hardware/table.status') }}</th>
        -                            <th data-sortable="true" data-field="assigned_to">{{ trans('admin/hardware/form.checkedout_to') }}</th>
        -                            <th data-sortable="true" data-field="location" data-searchable="true">{{ trans('admin/hardware/table.location') }}</th>
        -                            <th data-sortable="true" data-field="category" data-searchable="true">{{ trans('general.category') }}</th>
        -                            <th data-sortable="true" data-field="manufacturer" data-searchable="true" data-visible="false">{{ trans('general.manufacturer') }}</th>
        -                            <th data-sortable="true" data-field="purchase_cost" data-searchable="true" data-visible="false">{{ trans('admin/hardware/form.cost') }}</th>
        -                            <th data-sortable="true" data-field="purchase_date" data-searchable="true" data-visible="false">{{ trans('admin/hardware/form.date') }}</th>
        -                            <th data-sortable="false" data-field="eol" data-searchable="true">{{ trans('general.eol') }}</th>
        -                            <th data-sortable="true" data-searchable="true" data-field="notes">{{ trans('general.notes') }}</th>
        -                            <th data-sortable="true" data-searchable="true"  data-field="order_number">{{ trans('admin/hardware/form.order') }}</th>
        -                            <th data-sortable="true" data-searchable="true" data-field="last_checkout">{{ trans('admin/hardware/table.checkout_date') }}</th>
        -                            <th data-sortable="true" data-field="expected_checkin" data-searchable="true">{{ trans('admin/hardware/form.expected_checkin') }}</th>
        -                            @foreach(\App\Models\CustomField::all() AS $field)
        -
        -
        -                                    <th data-sortable="{{ ($field->field_encrypted=='1' ? 'false' : 'true') }}" data-visible="false" data-field="{{$field->db_column_name()}}">
        -                                        @if ($field->field_encrypted=='1')
        -                                            <i class="fa fa-lock"></i>
        -                                        @endif
        -
        -                                        {{$field->name}}
        -                                    </th>
        -
        -                            @endforeach
        -                            <th data-sortable="true" data-field="created_at" data-searchable="true" data-visible="false">{{ trans('general.created_at') }}</th>
        -                            <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="change">{{ trans('admin/hardware/table.change') }}</th>
        -
        -                            <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" >{{ trans('table.actions') }}</th>
        -                        </tr>
        -                    </thead>
        -                    {{-- <tfoot>
        -                        <tr>
        -                            <td colspan="12">
        -                                <select name="bulk_actions" class="form-control">
        -                                    <option value="edit">Edit</option>
        -                                    <option value="delete">Delete</option>
        -                                    <option value="labels">Generate Labels</option>
        -                                </select>
        -                                <button class="btn btn-default" id="bulkEdit" disabled>Go</button>
        -                            </td>
        -                        </tr>
        -                    </tfoot> --}}
        -                </table>
        -             {{ Form::close() }}
        -              </div><!-- /.col -->
        -            </div><!-- /.row -->
        -          </div><!-- ./box-body -->
        -        </div><!-- /.box -->
        -    </div>
        -
        +    <div class="box">
        +      <div class="box-body">
        +        {{ Form::open([
        +          'method' => 'POST',
        +          'route' => ['hardware/bulkedit'],
        +          'class' => 'form-inline',
        +           'id' => 'bulkForm']) }}
        +          <div class="row">
        +            <div class="col-md-12">
        +              @if (Input::get('status')!='Deleted')
        +              <div id="toolbar">
        +                <select name="bulk_actions" class="form-control select2">
        +                  <option value="edit">Edit</option>
        +                  <option value="delete">Delete</option>
        +                  <option value="labels">Generate Labels</option>
        +                </select>
        +                <button class="btn btn-primary" id="bulkEdit" disabled>Go</button>
        +              </div>
        +              @endif
         
        +              <table
        +              name="assets"
        +              {{-- data-row-style="rowStyle" --}}
        +              data-toolbar="#toolbar"
        +              class="table table-striped snipe-table"
        +              id="table"
        +              data-advanced-search="true"
        +              data-id-table="advancedTable"
        +              data-url="{{ route('api.assets.index',
        +                  array('status' => e(Input::get('status')),
        +                  'order_number'=>e(Input::get('order_number')),
        +                  'company_id'=>e(Input::get('company_id')),
        +                  'status_id'=>e(Input::get('status_id'))))}}"
        +              data-click-to-select="true"
        +              data-cookie-id-table="{{ e(Input::get('status')) }}assetTable-{{ config('version.hash_version') }}">
        +              </table>
        +            </div><!-- /.col -->
        +          </div><!-- /.row -->
        +        {{ Form::close() }}
        +      </div><!-- ./box-body -->
        +    </div><!-- /.box -->
        +  </div>
         </div>
        -
        +@stop
         
         @section('moar_scripts')
         @include ('partials.bootstrap-table', [
             'exportFile' => 'assets-export',
             'search' => true,
        -    'multiSort' => true
        +    'columns' => \App\Presenters\AssetPresenter::dataTableLayout()
         ])
         
        -<script>
        -    $(function() {
        -        function checkForChecked() {
        -            var check_checked = $('input.one_required:checked').length;
        -            if (check_checked > 0) {
        -                $('#bulkEdit').removeAttr('disabled');
        -            }
        -            else {
        -                $('#bulkEdit').attr('disabled', 'disabled');
        -            }
        -        }
        -        $('#table').on('change','input.one_required',checkForChecked);
        -        $("#checkAll").change(function () {
        -            $("input:checkbox").prop('checked', $(this).prop("checked"));
        -            checkForChecked();
        -        });
        -    });
        -</script>
        -@stop
        -
         @stop
        diff --git a/resources/views/hardware/qr-view.blade.php b/resources/views/hardware/qr-view.blade.php
        index 5407529653..c2f52df1b1 100644
        --- a/resources/views/hardware/qr-view.blade.php
        +++ b/resources/views/hardware/qr-view.blade.php
        @@ -2,7 +2,7 @@
         
         {{-- Page title --}}
         @section('title')
        -{{ trans('admin/hardware/general.view') }} {{ $asset->asset_tag }} 
        +{{ trans('admin/hardware/general.view') }} {{ $asset->asset_tag }}
         @parent
         @stop
         
        @@ -11,196 +11,206 @@
         
         <div class="row header">
             <div class="col-md-12">
        -     <h3 class="name">
        -        {{ trans('admin/hardware/general.view') }}
        -        {{ $asset->asset_tag }}
        -        @if ($asset->name)
        -        ({{ $asset->name }})
        -        @endif
        -    </h3>
        +        <h3 class="name">
        +            {{ trans('admin/hardware/general.view') }}
        +            {{ $asset->asset_tag }}
        +            @if ($asset->name)
        +            ({{ $asset->name }})
        +            @endif
        +        </h3>
         
                 <div class="btn-group pull-right">
        -
        -		<div class="dropdown">
        -            <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        -                <span class="caret"></span>
        -            </button>
        -            <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
        -                @if ($asset->status_id == 1)
        -                    @if ($asset->assigned_to != 0)
        +            <div class="dropdown">
        +                <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        +                    <span class="caret"></span>
        +                </button>
        +                <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
        +                    @if ($asset->status_id == 1)
        +                        @if ($asset->assigned_to != 0)
                                 <li role="presentation"><a href="{{ route('checkin/hardware', $asset->id) }}">{{ trans('admin/hardware/general.checkin') }}</a></li>
        +                        @endif
        +                    @elseif ($asset->status_id == 0)
        +                    <li role="presentation"><a href="{{ route('checkout/hardware', $asset->id) }}">{{ trans('admin/hardware/general.checkout') }}</a></li>
                             @endif
        -                @elseif ($asset->status_id == 0)
        -                        <li role="presentation"><a href="{{ route('checkout/hardware', $asset->id) }}">{{ trans('admin/hardware/general.checkout') }}</a></li>
        -                @endif
        -                <li role="presentation"><a href="{{ route('update/hardware', $asset->id) }}">{{ trans('admin/hardware/general.edit') }}</a></li>
        -                <li role="presentation"><a href="{{ route('clone/hardware', $asset->id) }}">{{ trans('admin/hardware/general.clone') }}</a></li>
        -            </ul>
        +                    <li role="presentation"><a href="{{ route('hardware.edit', $asset->id) }}">{{ trans('admin/hardware/general.edit') }}</a></li>
        +                    <li role="presentation"><a href="{{ route('clone/hardware', $asset->id) }}">{{ trans('admin/hardware/general.clone') }}</a></li>
        +                </ul>
        +            </div>
                 </div>
        -
        -
             </div>
         </div>
        -</div>
         
         <div class="user-profile">
        -<div class="row profile">
        -<div class="col-md-9 bio">
        +    <div class="row profile">
        +        <div class="col-md-9 bio">
        +            <div class="col-md-12">
        +                @if ($asset->model->deleted_at!='')
        +                <div class="alert alert-warning alert-block">
        +                    <i class="fa fa-warning"></i>
        +                    {{ trans('admin/hardware/general.model_deleted', array('model_id' => $asset->model->id)) }}
        +                </div>
        +                @elseif ($asset->deleted_at!='')
        +                <div class="alert alert-warning alert-block">
        +                    <i class="fa fa-warning"></i>
        +                    {{ trans('admin/hardware/general.deleted', array('asset_id' => $asset->id)) }}
        +                </div>
        +                @endif
         
        -		@if ($asset->model->deleted_at!='')
        -            <div class="alert alert-warning alert-block">
        -				<i class="fa fa-warning"></i>
        -				{{ trans('admin/hardware/general.model_deleted', array('model_id' => $asset->model->id)) }}
        -			</div>
        -        @elseif ($asset->deleted_at!='')
        -			<div class="alert alert-warning alert-block">
        -				<i class="fa fa-warning"></i>
        -				{{ trans('admin/hardware/general.deleted', array('asset_id' => $asset->id)) }}
        -			</div>
        -		@endif
        +                @if ($asset->serial)
        +                <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.serial') }}: </strong>
        +                <em>{{ $asset->serial }}</em></div>
        +                @endif
         
        -        @if ($asset->serial)
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.serial') }}: </strong>
        -            <em>{{ $asset->serial }}</em></div>
        +                @if ($asset->mac_address!='')
        +                <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.mac_address') }}:</strong>
        +                {{ $asset->mac_address }}
        +                </div>
        +                @endif
         
        -        @endif
        +                @if ($asset->model->manufacturer)
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.manufacturer') }}: </strong>
        +                    <a href="{{ route('manufacturers.edit', $asset->model->manufacturer->id) }}">
        +                        {{ $asset->model->manufacturer->name }}
        +                    </a>
        +                </div>
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.model') }}:</strong>
        +                    <a href="{{ route('models.show', $asset->model->id) }}">
        +                        {{ $asset->model->name }}
        +                    </a>
        +                    / {{ $asset->model->model_number }}
        +                </div>
        +                @endif
         
        -        @if ($asset->mac_address!='')
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.mac_address') }}:</strong>
        -            {{ $asset->mac_address }}
        +                @if ($asset->purchase_date)
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.date') }}: </strong>
        +                    {{ $asset->purchase_date }}
        +                </div>
        +                @endif
        +
        +                @if ($asset->purchase_cost)
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.cost') }}:</strong>
        +                    {{ $snipeSettings->default_currency }}
        +                    {{ number_format($asset->purchase_cost,2) }}
        +                </div>
        +                @endif
        +
        +                @if ($asset->order_number)
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.order') }}:</strong>
        +                    {{ $asset->order_number }}
        +                </div>
        +                @endif
        +
        +                @if ($asset->supplier_id)
        +                <div class="col-md-6" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.supplier') }}: </strong>
        +                    <a href="{{ route('suppliers.show', $asset->supplier_id) }}">
        +                        {{ $asset->supplier->name }}
        +                    </a>
        +                </div>
        +                @endif
        +
        +                @if ($asset->warranty_months)
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.warranty') }}:</strong>
        +                    {{ $asset->warranty_months }}
        +                    {{ trans('admin/hardware/form.months') }}
        +                </div>
        +                <div class="col-md-12 {{ $asset->present()->warrantee_expires() < date("Y-m-d H:i:s") ? 'ui-state-highlight' : '' }}"  style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.expires') }}:</strong>
        +                    {{ $asset->present()->warrantee_expires() }}
        +                </div>
        +                @endif
        +
        +                @if ($asset->depreciation)
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.depreciation') }}: </strong>
        +                    {{ $asset->depreciation->name }}
        +                    ({{ $asset->depreciation->months }}
        +                    {{ trans('admin/hardware/form.months') }}
        +                    )
        +                </div>
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.fully_depreciated') }}: </strong>
        +                    @if ($asset->time_until_depreciated()->y > 0)
        +                    {{ $asset->time_until_depreciated()->y }}
        +                    {{ trans('admin/hardware/form.years') }},
        +                    @endif
        +
        +                    {{ $asset->time_until_depreciated()->m }}
        +                    {{ trans('admin/hardware/form.months') }}
        +                    ({{ $asset->depreciated_date()->format('Y-m-d') }})
        +                 </div>
        +                @endif
        +
        +
        +                @if ($asset->model->eol)
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.eol_rate') }}: </strong>
        +                    {{ $asset->model->eol }}
        +                    {{ trans('admin/hardware/form.months') }}
        +                </div>
        +                <div class="col-md-12" style="padding-bottom: 5px;">
        +                    <strong>{{ trans('admin/hardware/form.eol_date') }}: </strong>
        +                    {{ $asset->present()->eol_date() }}
        +                    @if ($asset->present()->months_until_eol())
        +                        (
        +                        @if ($asset->present()->months_until_eol()->y > 0) {{ $asset->present()->months_until_eol()->y }}
        +                        {{ trans('general.years') }},
        +                        @endif
        +                        {{ $asset->present()->months_until_eol()->m }}
        +                        {{ trans('general.months') }}
        +                        )
        +                    @endif
        +                </div>
        +                @endif
                     </div>
        -        @endif
         
        -        @if ($asset->model->manufacturer)
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.manufacturer') }}: </strong>
        -            <a href="{{ route('update/manufacturer', $asset->model->manufacturer->id) }}">
        -            {{ $asset->model->manufacturer->name }}
        -            </a> </div>
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.model') }}:</strong>
        -            <a href="{{ route('view/model', $asset->model->id) }}">
        -            {{ $asset->model->name }}
        -            </a>
        -             / {{ $asset->model->model_number }}</div>
        -        @endif
        -
        -        @if ($asset->purchase_date)
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.date') }}: </strong>
        -            {{ $asset->purchase_date }} </div>
        -        @endif
        -
        -        @if ($asset->purchase_cost)
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.cost') }}:</strong>
        -            {{ $snipeSettings->default_currency }}
        -            {{ number_format($asset->purchase_cost,2) }} </div>
        -        @endif
        -
        -        @if ($asset->order_number)
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.order') }}:</strong>
        -            {{ $asset->order_number }} </div>
        -        @endif
        -
        -        @if ($asset->supplier_id)
        -            <div class="col-md-6" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.supplier') }}: </strong>
        -            <a href="{{ route('view/supplier', $asset->supplier_id) }}">
        -            {{ $asset->supplier->name }}
        -            </a> </div>
        -        @endif
        -
        -        @if ($asset->warranty_months)
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.warranty') }}:</strong>
        -            {{ $asset->warranty_months }}
        -            {{ trans('admin/hardware/form.months') }}
        +            <div class="col-md-12">
        +                <!-- Licenses assets table -->
        +                <h6>Software Assigned </h6>
        +                <br>
        +                <!-- checked out assets table -->
        +                @if (count($asset->licenses) > 0)
        +                <table class="table table-hover">
        +                    <thead>
        +                        <tr>
        +                            <th class="col-md-4"><span class="line"></span>{{ trans('general.name') }}</th>
        +                            <th class="col-md-4"><span class="line"></span>{{ trans('admin/licenses/form.license_key') }}</th>
        +                            <th class="col-md-1"><span class="line"></span>{{ trans('table.actions') }}</th>
        +                        </tr>
        +                    </thead>
        +                    <tbody>
        +                        @foreach ($asset->licenseseats as $seat)
        +                        <tr>
        +                            <td><a href="{{ route('licenses.show', $seat->license->id) }}">{{ $seat->license->name }}</a></td>
        +                            <td>{{ $seat->license->serial }}</td>
        +                            <td><a href="{{ route('licenses.checkin', $seat->id) }}" class="btn-flat info">{{ trans('general.checkin') }}</a>
        +                            </td>
        +                        </tr>
        +                        @endforeach
        +                    </tbody>
        +                </table>
        +                @else
        +                <div class="col-md-12">
        +                    <div class="alert alert-info alert-block">
        +                        <i class="fa fa-info-circle"></i>
        +                        {{ trans('general.no_results') }}
        +                    </div>
        +                </div>
        +                @endif
                     </div>
        -            <div class="col-md-12 {{ $asset->warrantee_expires() < date("Y-m-d H:i:s") ? 'ui-state-highlight' : '' }}"  style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.expires') }}:</strong>
        -            {{ $asset->warrantee_expires() }}</div>
        -        @endif
         
        -        @if ($asset->depreciation)
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.depreciation') }}: </strong>
        -            {{ $asset->depreciation->name }}
        -                ({{ $asset->depreciation->months }}
        -                {{ trans('admin/hardware/form.months') }}
        -                )</div>
        -            <div class="col-md-12" style="padding-bottom: 5px;"><strong>{{ trans('admin/hardware/form.fully_depreciated') }}: </strong>
        -             @if ($asset->time_until_depreciated()->y > 0)
        -                {{ $asset->time_until_depreciated()->y }}
        -                {{ trans('admin/hardware/form.years') }},
        -             @endif
        -           {{ $asset->time_until_depreciated()->m }}
        -            {{ trans('admin/hardware/form.months') }}
        -               ({{ $asset->depreciated_date()->format('Y-m-d') }})
        -             </div>
        -        @endif
        +            <div class="col-md-12">
        +                <h6>
        +                    {{ trans('general.file_uploads') }} [ <a href="#" data-toggle="modal" data-target="#uploadFileModal">{{trans('button.add')}} </a> ]
        +                </h6>
         
        -
        -        @if ($asset->model->eol)
        -            <div class="col-md-12" style="padding-bottom: 5px;">
        -            <strong>{{ trans('admin/hardware/form.eol_rate') }}: </strong>
        -            {{ $asset->model->eol }}
        -            {{ trans('admin/hardware/form.months') }} </div>
        -            <div class="col-md-12" style="padding-bottom: 5px;">
        -            <strong>{{ trans('admin/hardware/form.eol_date') }}: </strong>
        -            {{ $asset->eol_date() }}
        -            @if ($asset->months_until_eol())
        -                 (
        -                 @if ($asset->months_until_eol()->y > 0) {{ $asset->months_until_eol()->y }}
        -                  {{ trans('general.years') }},
        -                 @endif
        -
        -                {{ $asset->months_until_eol()->m }}
        -                {{ trans('general.months') }}
        -                )
        -            @endif
        -            </div>
        -        @endif
        -
        -
        -
        -
        -
        -<div class="col-md-12">
        -  		<!-- Licenses assets table -->
        -        <h6>Software Assigned </h6>
        -		<br>
        -		<!-- checked out assets table -->
        -		@if (count($asset->licenses) > 0)
        -		<table class="table table-hover">
        -			<thead>
        -				<tr>
        -					<th class="col-md-4"><span class="line"></span>{{ trans('general.name') }}</th>
        -					<th class="col-md-4"><span class="line"></span>{{ trans('admin/licenses/form.license_key') }}</th>
        -					<th class="col-md-1"><span class="line"></span>{{ trans('table.actions') }}</th>
        -				</tr>
        -			</thead>
        -			<tbody>
        -				@foreach ($asset->licenseseats as $seat)
        -				<tr>
        -					<td><a href="{{ route('view/license', $seat->license->id) }}">{{ $seat->license->name }}</a></td>
        -					<td>{{ $seat->license->serial }}</td>
        -					<td><a href="{{ route('checkin/license', $seat->id) }}" class="btn-flat info">{{ trans('general.checkin') }}</a>
        -					</td>
        -				</tr>
        -				@endforeach
        -			</tbody>
        -		</table>
        -		@else
        -
        -		<div class="col-md-12">
        -			<div class="alert alert-info alert-block">
        -				<i class="fa fa-info-circle"></i>
        -				{{ trans('general.no_results') }}
        -			</div>
        -		</div>
        -		@endif
        -
        -
        -		<div class="col-md-12">
        -
        -
        - 	<h6>{{ trans('general.file_uploads') [ <a href="#" data-toggle="modal" data-target="#uploadFileModal">@lang('button.add') }}</a> ]</h6>
        -
        -
        - 	<table class="table table-hover">
        +                <table class="table table-hover">
                             <thead>
                                 <tr>
                                     <th class="col-md-5">{{ trans('general.notes') }}</th>
        @@ -211,125 +221,109 @@
                             </thead>
                             <tbody>
                                 @if (count($asset->uploads) > 0)
        -							@foreach ($asset->uploads as $file)
        -							<tr>
        -								<td>
        -									@if ($file->note) {{ $file->note }}
        -									@endif
        -								</td>
        -								<td>
        -								{{ $file->filename }}
        -								</td>
        -								<td>
        -									@if ($file->filename)
        -									<a href="{{ route('show/assetfile', [$asset->id, $file->id]) }}" class="btn btn-default">{{ trans('general.download') }}</a>
        -									@endif
        -								</td>
        -								<td>
        -									<a class="btn delete-asset btn-danger btn-sm"
        -                                    href="{{ route('delete/assetfile', [$asset->id, $file->id]) }}"
        -                                    data-html="false" data-toggle="modal"
        -                                    data-title="{{ trans('admin/hardware/message.deletefile.confirm') }}"
        -                                    data-content="{{ trans('admin/hardware/message.deletefile.confirm-more',array('filename' => $file->filename)) }} " onClick="return false;">
        -                                    <i class="fa fa-trash icon-white"></i>
        -                                    </a>
        -								</td>
        -							</tr>
        -							@endforeach
        -						@else
        -							<tr>
        -								<td colspan="4">
        -									{{ trans('general.no_results') }}
        -								</td>
        -							</tr>
        -
        +                        @foreach ($asset->uploads as $file)
        +                        <tr>
        +                            <td>
        +                                @if ($file->note)
        +                                {{ $file->note }}
        +                                @endif
        +                            </td>
        +                            <td>
        +                            {{ $file->filename }}
        +                            </td>
        +                            <td>
        +                                @if ($file->filename)
        +                                <a href="{{ route('show/assetfile', [$asset->id, $file->id]) }}" class="btn btn-default">{{ trans('general.download') }}</a>
        +                                @endif
        +                            </td>
        +                            <td>
        +                                <a class="btn delete-asset btn-danger btn-sm"
        +                                href="{{ route('delete/assetfile', [$asset->id, $file->id]) }}"
        +                                data-html="false" data-toggle="modal"
        +                                data-title="{{ trans('admin/hardware/message.deletefile.confirm') }}"
        +                                data-content="{{ trans('admin/hardware/message.deletefile.confirm-more',array('filename' => $file->filename)) }} " onClick="return false;">
        +                                <i class="fa fa-trash icon-white"></i>
        +                                </a>
        +                            </td>
        +                        </tr>
        +                        @endforeach
        +                        @else
        +                        <tr>
        +                            <td colspan="4">
        +                                {{ trans('general.no_results') }}
        +                            </td>
        +                        </tr>
                                 @endif
        -
                             </tbody>
        -        </table>
        +                </table>
        +            </div>
         
        -</div>
        +            <div class="col-md-12">
        +                <!-- checked out assets table -->
        +                <table class="table table-hover table-fixed break-word">
        +                    <thead>
        +                        <tr>
        +                            <th class="col-md-3">{{ trans('general.date') }}</th>
        +                            <th class="col-md-2"><span class="line"></span>{{ trans('general.admin') }}</th>
        +                            <th class="col-md-2"><span class="line"></span>{{ trans('table.actions') }}</th>
        +                            <th class="col-md-2"><span class="line"></span>{{ trans('general.user') }}</th>
        +                            <th class="col-md-3"><span class="line"></span>{{ trans('general.notes') }}</th>
        +                        </tr>
        +                    </thead>
        +                    <tbody>
        +                                'icon'          => '<i class="'.$this->parseItemIcon().'"></i>',
        +            'created_at'    => date("M d, Y g:iA", strtotime($this->created_at)),
        +            'action_type'   => strtolower(trans('general.'.str_replace(' ', '_', $this->action_type))),
        +            'admin'         =>  $this->model->user ? $this->model->user->present()->nameUrl() : '',
        +            'target'        => $this->target(),
        +            'item'          => $this->item(),
        +            'item_type'     => $this->itemType(),
        +            'note'          => e($this->note),
         
        -
        -
        -
        -        <!-- checked out assets table -->
        -
        -        <table class="table table-hover table-fixed break-word">
        -            <thead>
        -                <tr>
        -                    <th class="col-md-3">{{ trans('general.date') }}</th>
        -                    <th class="col-md-2"><span class="line"></span>{{ trans('general.admin') }}</th>
        -                    <th class="col-md-2"><span class="line"></span>{{ trans('table.actions') }}</th>
        -                    <th class="col-md-2"><span class="line"></span>{{ trans('general.user') }}</th>
        -                    <th class="col-md-3"><span class="line"></span>{{ trans('general.notes') }}</th>
        -                </tr>
        -            </thead>
        -            <tbody>
        -            @if (count($asset->assetlog) > 0)
        -                @foreach ($asset->assetlog as $log)
        -
        -                <tr>
        -                    <td>{{ $log->created_at }}</td>
        -                    <td>
        -                        @if (isset($log->user_id))
        -                        {{ $log->user->fullName() }}
        +                        @if (count($asset->assetlog) > 0)
        +                        @foreach ($asset->assetlog as $log)
        +                        @php $result = $log->present()->forDataTable();
        +                        @endphp
        +                        <tr>
        +                            <td>{{ $result['created_at'] }}</td>
        +                            <td>
        +                                {!! $result['admin'] !!}
        +                            </td>
        +                            <td>{{ $result['action_type'] }}</td>
        +                            <td>
        +                            {!! $result['target'] !!}
        +                            </td>
        +                            <td>
        +                                {{ $result['note'] }}
        +                            </td>
        +                        </tr>
        +                        @endforeach
                                 @endif
        -                    </td>
        -                    <td>{{ $log->action_type }}</td>
        -                    <td>
        -                        @if ((isset($log->target_id)) && ($log->target_id!=0) && ($log->target_id!=''))
        +                        <tr>
        +                            <td>{{ $asset->created_at }}</td>
        +                            <td>
        +                            @if (isset($asset->adminuser->id)) {{ $asset->adminuser->present()->fullName() }}
        +                            @else
        +                            {{ trans('general.unknown_admin') }}
        +                            @endif
        +                            </td>
        +                            <td>{{ trans('general.created_asset') }}</td>
        +                            <td></td>
        +                            <td>
        +                            </td>
        +                        </tr>
        +                    </tbody>
        +                </table>
        +            </div>
        +        </div> <!--/.col-md-9.bio-->
         
        -	                        @if ($log->target->deleted_at=='')
        -		                        <a href="{{ route('view/user', $log->target_id) }}">
        -		                        {{ $log->user->fullName() }}
        -		                         </a>
        -		                    @else
        -		 						<del>{{ $log->user->fullName() }}</del>
        -	                        @endif
        -
        -                        @endif
        -                    </td>
        -                    <td>
        -                        @if ($log->note) {{ $log->note }}
        -                        @endif
        -                    </td>
        -                </tr>
        -
        -                @endforeach
        -                @endif
        -                <tr>
        -                    <td>{{ $asset->created_at }}</td>
        -                    <td>
        -                    @if (isset($asset->adminuser->id)) {{ $asset->adminuser->fullName() }}
        -                    @else
        -                    {{ trans('general.unknown_admin') }}
        -                    @endif
        -                    </td>
        -                    <td>{{ trans('general.created_asset') }}</td>
        -                    <td></td>
        -                    <td>
        -<!--                    @if ($asset->notes)
        -                    {{ $asset->notes }}
        -                    @endif -->
        -                    </td>
        -                </tr>
        -            </tbody>
        -        </table>
        -
        -
        -        </div>
        -</div>
                 <!-- side address column -->
                 <div class="col-md-3">
        -
        -        	<!-- Asset notes -->
        -@if ($asset->notes)
        -
        -		<h6>{{ trans('admin/hardware/form.notes') }}:</h6>
        -		 <div class="break-word">{{ nl2br(e($asset->notes)) }}</div>
        -
        -@endif
        +            <!-- Asset notes -->
        +            @if ($asset->notes)
        +                    <h6>{{ trans('admin/hardware/form.notes') }}:</h6>
        +                     <div class="break-word">{{ nl2br(e($asset->notes)) }}</div>
        +            @endif
         
                     @if ($qr_code->display)
                     <h6>{{ trans('admin/hardware/form.qr') }}</h6>
        @@ -340,80 +334,77 @@
                     </ul>
                     @endif
         
        +            @if (($asset->checkedOutToUser()) && ($asset->assigned_to > 0) && ($asset->deleted_at==''))
        +            {{-- @TODO This should be extnded for details about non users --}}
        +            <h6><br>{{ trans('admin/hardware/form.checkedout_to') }}</h6>
        +            <ul>
        +                <li>
        +                    <img src="{{ $asset->assignedTo->present()->gravatar() }}" class="img-circle" style="width: 100px; margin-right: 20px;" /><br /><br />
        +                </li>
        +                <li>
        +                    {{ $asset->assignedTo->present()->nameUrl() }}
        +                </li>
         
        -            @if (($asset->assigneduser) && ($asset->assigned_to > 0) && ($asset->deleted_at==''))
        -                <h6><br>{{ trans('admin/hardware/form.checkedout_to') }}</h6>
        -                <ul>
        -
        -                    <li><img src="{{ $asset->assigneduser->gravatar() }}" class="img-circle" style="width: 100px; margin-right: 20px;" /><br /><br /></li>
        -                    <li><a href="{{ route('view/user', $asset->assigned_to) }}">{{ $asset->assigneduser->fullName() }}</a></li>
        -
        -
        -                    @if (isset($asset->assetloc->address))
        -                        <li>{{ $asset->assetloc->address }}
        -                        @if (isset($asset->assetloc->address2)) {{ $asset->assetloc->address2 }}
        -                        @endif
        -                        </li>
        -                        @if (isset($asset->assetloc->city))
        -                            <li>{{ $asset->assetloc->city }}, {{ $asset->assetloc->state }} {{ $asset->assetloc->zip }}</li>
        -                        @endif
        -
        +                @if (isset($asset->assetloc->address))
        +                <li>
        +                    {{ $asset->assetloc->address }}
        +                    @if (isset($asset->assetloc->address2))
        +                    {{ $asset->assetloc->address2 }}
                             @endif
        -
        -                    @if (isset($asset->assigneduser->email))
        -                        <li><br /><i class="fa fa-envelope-o"></i> <a href="mailto:{{ $asset->assigneduser->email }}">{{ $asset->assigneduser->email }}</a></li>
        +                </li>
        +                    @if (isset($asset->assetloc->city))
        +                    <li>{{ $asset->assetloc->city }}, {{ $asset->assetloc->state }} {{ $asset->assetloc->zip }}</li>
                             @endif
        +                @endif
         
        -                    @if ((isset($asset->assigneduser->phone)) && ($asset->assigneduser->phone!=''))
        -                        <li><i class="fa fa-phone"></i> {{ $asset->assigneduser->phone }}</li>
        -                    @endif
        +                @if (isset($asset->assignedTo->email))
        +                <li><br /><i class="fa fa-envelope-o"></i> <a href="mailto:{{ $asset->assignedTo->email }}">{{ $asset->assignedTo->email }}</a></li>
        +                @endif
         
        -
        -                    </ul>
        -
        -			 @endif
        +                @if ((isset($asset->assignedTo->phone)) && ($asset->assignedTo->phone!=''))
        +                <li><i class="fa fa-phone"></i> {{ $asset->assignedTo->phone }}</li>
        +                @endif
        +            </ul>
        +            @endif
         
                     @if (($asset->status_id ) && ($asset->status_id > 0))
        -			<!-- Status Info -->
        -
        +                <!-- Status Info -->
                         @if ($asset->assetstatus)
                             <h6><br>
        -                     	@if (($asset->assetstatus->deployable=='1') && ($asset->assigned_to > 0))
        -                            {{ trans('admin/hardware/general.asset') }}
        -                            {{ trans('general.deployed') }}
        -                        @else
        -                            {{ $asset->assetstatus->name }}
        -                            {{ trans('admin/hardware/general.asset') }}
        -                        @endif
        +                    @if (($asset->assetstatus->deployable=='1') && ($asset->assigned_to > 0))
        +                        {{ trans('admin/hardware/general.asset') }}
        +                        {{ trans('general.deployed') }}
        +                    @else
        +                        {{ $asset->assetstatus->name }}
        +                        {{ trans('admin/hardware/general.asset') }}
        +                    @endif
                             <ul>
        +                         @if (($asset->assetstatus->deployable=='1') && ($asset->assigned_to > 0) && ($asset->deleted_at==''))
        +                        <li><br /><a href="{{ route('checkin/hardware', $asset->id) }}" class="btn btn-primary btn-sm">{{ trans('admin/hardware/general.checkin') }}</a></li>
        +                        @elseif ((($asset->assetstatus->deployable=='1') &&  (($asset->assigned_to=='') || ($asset->assigned_to==0))) && ($asset->deleted_at==''))
        +                        <li><br /><a href="{{ route('checkout/hardware', $asset->id) }}" class="btn btn-info btn-sm">{{ trans('admin/hardware/general.checkout') }}</a></li>
        +                        @elseif  (($asset->deleted_at!='') && ($asset->model->deleted_at==''))
         
        -                    	 @if (($asset->assetstatus->deployable=='1') && ($asset->assigned_to > 0) && ($asset->deleted_at==''))
        -                    	<li><br /><a href="{{ route('checkin/hardware', $asset->id) }}" class="btn btn-primary btn-sm">{{ trans('admin/hardware/general.checkin') }}</a></li>
        -                    	@elseif ((($asset->assetstatus->deployable=='1') &&  (($asset->assigned_to=='') || ($asset->assigned_to==0))) && ($asset->deleted_at==''))
        -                    	<li><br /><a href="{{ route('checkout/hardware', $asset->id) }}" class="btn btn-info btn-sm">{{ trans('admin/hardware/general.checkout') }}</a></li>
        -						@elseif  (($asset->deleted_at!='') && ($asset->model->deleted_at==''))
        +                        <li><br /><a href="{{ route('restore/hardware', $asset->id) }}" class="btn-flat large info ">{{ trans('admin/hardware/general.restore') }}</a></li>
         
        -						<li><br /><a href="{{ route('restore/hardware', $asset->id) }}" class="btn-flat large info ">{{ trans('admin/hardware/general.restore') }}</a></li>
        -
        -                    	@endif
        +                        @endif
                             </ul>
         
        -					@if (($asset->assetstatus->notes) && ($asset->assigned_to==''))
        +                    @if (($asset->assetstatus->notes) && ($asset->assigned_to==''))
                             <div class="col-md-12">
        -						<div class="alert alert-info alert-block">
        -							<i class="fa fa-info-circle"></i>
        -							{{ $asset->assetstatus->notes }}
        +                        <div class="alert alert-info alert-block">
        +                            <i class="fa fa-info-circle"></i>
        +                            {{ $asset->assetstatus->notes }}
         
        -						</div>
        +                        </div>
                             </div>
                             @endif
         
                          @endif
                     @endif
        -
        -        </div>
        -    </div>
        -</div>
        +        </div> <!-- /.col-md-3-->
        +    </div> <!--/.row.profile-->
        +</div> <!--/.user-profile-->
         
         <!-- Modal -->
         <div class="modal fade" id="uploadFileModal" tabindex="-1" role="dialog" aria-labelledby="uploadFileModalLabel" aria-hidden="true">
        @@ -429,18 +420,18 @@
               'files' => true, 'class' => 'form-horizontal' ]) }}
               <div class="modal-body">
         
        -		<p><p>{{ trans('admin/hardware/general.filetype_info') }}</p>.</p>
        +        <p><p>{{ trans('admin/hardware/general.filetype_info') }}</p>.</p>
         
        -		 <div class="form-group col-md-12">
        -		 <div class="input-group col-md-12">
        -		 	<input class="col-md-12 form-control" type="text" name="notes" id="notes" placeholder="Notes">
        -		</div>
        -		</div>
        -		<div class="form-group col-md-12">
        -		 <div class="input-group col-md-12">
        -			{{ Form::file('assetfile[]', ['multiple' => 'multiple']) }}
        -		</div>
        -		</div>
        +         <div class="form-group col-md-12">
        +         <div class="input-group col-md-12">
        +            <input class="col-md-12 form-control" type="text" name="notes" id="notes" placeholder="Notes">
        +        </div>
        +        </div>
        +        <div class="form-group col-md-12">
        +         <div class="input-group col-md-12">
        +            {{ Form::file('assetfile[]', ['multiple' => 'multiple']) }}
        +        </div>
        +        </div>
         
         
               </div>
        diff --git a/resources/views/hardware/quickscan.blade.php b/resources/views/hardware/quickscan.blade.php
        new file mode 100644
        index 0000000000..a2b11a1543
        --- /dev/null
        +++ b/resources/views/hardware/quickscan.blade.php
        @@ -0,0 +1,192 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    {{ trans('general.bulkaudit') }}
        +    @parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +
        +        .input-group {
        +            padding-left: 0px !important;
        +        }
        +    </style>
        +
        +
        +    <div class="row">
        +    {{ Form::open(['method' => 'POST', 'class' => 'form-horizontal', 'role' => 'form', 'id' => 'audit-form' ]) }}
        +        <!-- left column -->
        +        <div class="col-md-6">
        +            <div class="box box-default">
        +                    <div class="box-header with-border">
        +                        <h3 class="box-title"> {{ trans('general.bulkaudit') }} </h3>
        +                    </div>
        +                    <div class="box-body">
        +                    {{csrf_field()}}
        +
        +                    <!-- Next Audit -->
        +                        <div class="form-group {{ $errors->has('asset_tag') ? 'error' : '' }}">
        +                            {{ Form::label('asset_tag', trans('general.asset_tag'), array('class' => 'col-md-3 control-label', 'id' => 'audit_tag')) }}
        +                            <div class="col-md-9">
        +                                <div class="input-group date col-md-5" data-date-format="yyyy-mm-dd">
        +                                    <input type="text" class="form-control" name="asset_tag" id="asset_tag" value="{{ Input::old('asset_tag') }}">
        +
        +                                </div>
        +                                {!! $errors->first('asset_tag', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +
        +                        <!-- Locations -->
        +                        <div id="location_id" class="form-group{{ $errors->has('location_id') ? ' has-error' : '' }}">
        +                            {{ Form::label('location_id', trans('general.location'), array('class' => 'col-md-3 control-label')) }}
        +                            <div class="col-md-9">
        +                                {{ Form::select('location_id', $locations_list , Input::old('location_id'), array('class'=>'select2', 'id'=>'location_id', 'style'=>'width:100%')) }}
        +
        +                                {!! $errors->first('location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Next Audit -->
        +                        <div class="form-group {{ $errors->has('next_audit_date') ? 'error' : '' }}">
        +                            {{ Form::label('next_audit_date', trans('general.next_audit_date'), array('class' => 'col-md-3 control-label')) }}
        +                            <div class="col-md-9">
        +                                <div class="input-group date col-md-5" data-provide="datepicker" data-date-format="yyyy-mm-dd">
        +                                    <input type="text" class="form-control" placeholder="{{ trans('general.next_audit_date') }}" name="next_audit_date" id="next_audit_date" value="{{ Input::old('next_audit_date', $next_audit_date) }}">
        +                                    <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +                                </div>
        +                                {!! $errors->first('next_audit_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Note -->
        +                        <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        +                            {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
        +                            <div class="col-md-8">
        +                                <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note') }}</textarea>
        +                                {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +
        +                    </div> <!--/.box-body-->
        +                    <div class="box-footer">
        +                        <a class="btn btn-link" href="{{ route('hardware.index') }}"> {{ trans('button.cancel') }}</a>
        +                        <button type="submit" id="audit_button" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.audit') }}</button>
        +                    </div>
        +
        +
        +
        +            </div>
        +
        +
        +
        +            {{Form::close()}}
        +        </div> <!--/.col-md-7-->
        +        <div class="col-md-6">
        +            <div class="box box-default" id="audited-div" style="display: none">
        +                <div class="box-header with-border">
        +                    <h3 class="box-title"> {{ trans('general.bulkaudit_status') }} (<span id="audit-counter">0</span> assets audited) </h3>
        +                </div>
        +                <div class="box-body">
        +
        +                    <table id="audited" class="table table-striped snipe-table">
        +                        <thead>
        +                        <tr>
        +                            <th>{{ trans('general.asset_tag') }}</th>
        +                            <th>{{ trans('general.bulkaudit_status') }}</th>
        +                            <th></th>
        +                        </tr>
        +                        </thead>
        +                        <tbody>
        +                            <tr id="audit-loader" style="display: none;">
        +                                <td colspan="3">
        +                                    <i class="fa fa-spinner spin" aria-hidden="true"></i> Processing...
        +                                </td>
        +                            </tr>
        +                        </tbody>
        +                    </table>
        +                </div>
        +            </div>
        +        </div>
        +        </div>
        +    </div>
        +
        +
        +@stop
        +
        +
        +@section('moar_scripts')
        +    <script>
        +
        +        $("#audit-form").submit(function (event) {
        +            $('#audited-div').show();
        +            $('#audit-loader').show();
        +
        +            event.preventDefault();
        +
        +            var form = $("#audit-form").get(0);
        +            var formData = $('#audit-form').serializeArray();
        +
        +            $.ajax({
        +                url: "{{ route('api.asset.audit') }}",
        +                type : 'POST',
        +                headers: {
        +                    "X-Requested-With": 'XMLHttpRequest',
        +                    "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
        +                },
        +                dataType : 'json',
        +                data : formData,
        +                success : function (data) {
        +                    if (data.status == 'success') {
        +                        $('#audited tbody').append("<tr class='success'><td>" + data.payload.asset_tag + "</td><td>" + data.messages + "</td><td><i class='fa fa-check text-success'></i></td></tr>");
        +                        incrementOnSuccess();
        +                    } else {
        +                        handleAuditFail(data);
        +                    }
        +
        +                },
        +                error: function (data) {
        +                    handleAuditFail(data);
        +                },
        +                complete: function() {
        +                    $('#audit-loader').hide();
        +                }
        +
        +            });
        +
        +            return false;
        +        });
        +
        +        function handleAuditFail (data) {
        +            if (data.asset_tag) {
        +                var asset_tag = data.asset_tag;
        +            } else {
        +                var asset_tag = '';
        +            }
        +            if (data.messages) {
        +                var messages = data.messages;
        +            } else {
        +                var messages = '';
        +            }
        +            $('#audited tbody').append("<tr class='danger'><td>" + asset_tag + "</td><td>" + messages + "</td><td><i class='fa fa-times text-danger'></i></td></tr>");
        +        }
        +
        +        function incrementOnSuccess() {
        +            var x = parseInt($('#audit-counter').html());
        +            y = x + 1;
        +            $('#audit-counter').html(y);
        +        }
        +
        +        $("#audit_tag").focus();
        +
        +    </script>
        +@stop
        diff --git a/resources/views/hardware/view.blade.php b/resources/views/hardware/view.blade.php
        index 85fc0b9113..ec9cea61be 100755
        --- a/resources/views/hardware/view.blade.php
        +++ b/resources/views/hardware/view.blade.php
        @@ -6,52 +6,46 @@
         @parent
         @stop
         
        -
        -
        -
         {{-- Right header --}}
         @section('header_right')
        -    @can('assets.manage')
        +@can('manage', \App\Models\Asset::class)
         <div class="dropdown pull-right">
           <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        -      <span class="caret"></span>
        +    <span class="caret"></span>
           </button>
           <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
        -      @if (($asset->assetstatus) && ($asset->assetstatus->deployable=='1'))
        -        @if ($asset->assigned_to != '')
        -          <li role="presentation"><a href="{{ route('checkin/hardware', $asset->id) }}">{{ trans('admin/hardware/general.checkin') }}</a></li>
        -        @else
        -          <li role="presentation"><a href="{{ route('checkout/hardware', $asset->id)  }}">{{ trans('admin/hardware/general.checkout') }}</a></li>
        -        @endif
        +    @if (($asset->assetstatus) && ($asset->assetstatus->deployable=='1'))
        +      @if ($asset->assigned_to != '')
        +      <li role="presentation"><a href="{{ route('checkin/hardware', $asset->id) }}">{{ trans('admin/hardware/general.checkin') }}</a></li>
        +      @else
        +      <li role="presentation"><a href="{{ route('checkout/hardware', $asset->id)  }}">{{ trans('admin/hardware/general.checkout') }}</a></li>
               @endif
        -        <li role="presentation"><a href="{{ route('update/hardware', $asset->id) }}">{{ trans('admin/hardware/general.edit') }}</a></li>
        -        <li role="presentation"><a href="{{ route('clone/hardware', $asset->id) }}">{{ trans('admin/hardware/general.clone') }}</a></li>
        +    @endif
        +    <li role="presentation"><a href="{{ route('hardware.edit', $asset->id) }}">{{ trans('admin/hardware/general.edit') }}</a></li>
        +    <li role="presentation"><a href="{{ route('clone/hardware', $asset->id) }}">{{ trans('admin/hardware/general.clone') }}</a></li>
        +      <li role="presentation"><a href="{{ route('asset.audit.create', $asset->id)  }}">{{ trans('general.audit') }}</a></li>
           </ul>
         </div>
        -    @endcan
        +@endcan
         @stop
         
        -
        -
        -
         {{-- Page content --}}
         @section('content')
        +<div class="row">
        +  <div class="col-md-12">
         
         
             @if ($asset->deleted_at!='')
                 <div class="col-md-12">
        -            <div class="alert alert-danger">
        -                <i class="fa fa-exclamation-circle faa-pulse animated"></i>
        -                <strong>WARNING: </strong>
        -                This asset has been deleted. You must <a href="{{ route('restore/hardware', $asset->id) }}">restore it</a> before you can assign it to someone.
        -            </div>
        +             <div class="alert alert-danger">
        +                    <i class="fa fa-exclamation-circle faa-pulse animated"></i>
        +                    <strong>WARNING: </strong>
        +                    This asset has been deleted.
        +                    You must <a href="{{ route('restore/hardware', $asset->id) }}">restore it</a> before you can assign it to someone.
        +               </div>
                 </div>
             @endif
         
        -
        -<div class="row">
        -  <div class="col-md-12">
        -
             <!-- Custom Tabs -->
             <div class="nav-tabs-custom">
               <ul class="nav nav-tabs">
        @@ -84,109 +78,134 @@
                       <div class="table-responsive" style="margin-top: 10px;">
                         <table class="table">
                           <tbody>
        -                  @if ($asset->assetstatus)
        -                      <tr>
        -                          <td>{{ trans('general.status') }}</td>
        -                          <td>
        -                              @if ($asset->assetstatus->color)
        -                              <span class="label label-default" style="background-color: {{ e($asset->assetstatus->color) }};">
        -                                  &nbsp; &nbsp;</span>
        -                              </span>
        -                              @endif
        +                    @if ($asset->assetstatus)
        +                    <tr>
        +                      <td>{{ trans('general.status') }}</td>
        +                      <td>
        +                        @if ($asset->assetstatus->color)
        +                        <span class="label label-default" style="background-color: {{ e($asset->assetstatus->color) }};">
        +                            &nbsp; &nbsp;</span>
        +                        </span>
        +                        @endif
        +                        {{ $asset->present()->statusText() }}
        +                        ({{ $asset->assetstatus->getStatuslabelType() }})
        +                      </td>
        +                    </tr>
        +                    @endif
         
        -                              {{ $asset->assetstatus->name }}
        -
        -                              ({{ $asset->assetstatus->getStatuslabelType() }})
        -                           </td>
        -                      </tr>
        -                  @endif
                             @if ($asset->company)
        -                      <tr>
        -                        <td>{{ trans('general.company') }}</td>
        -                        <td>{{ $asset->company->name }}</td>
        -                      </tr>
        +                    <tr>
        +                      <td>{{ trans('general.company') }}</td>
        +                      <td><a href="{{ url('/companies/' . $asset->company->id) }}">{{ $asset->company->name }}</a></td>
        +                    </tr>
                             @endif
        +
                             @if ($asset->name)
        -                      <tr>
        -                        <td>{{ trans('admin/hardware/form.name') }}</td>
        -                        <td>{{ $asset->name }}</td>
        -                      </tr>
        +                    <tr>
        +                      <td>{{ trans('admin/hardware/form.name') }}</td>
        +                      <td>{{ $asset->name }}</td>
        +                    </tr>
                             @endif
        +
                             @if ($asset->serial)
        +                    <tr>
        +                      <td>{{ trans('admin/hardware/form.serial') }}</td>
        +                      <td>{{ $asset->serial  }}</td>
        +                    </tr>
        +                    @endif
        +                    @if ((isset($audit_log)) && ($audit_log->created_at))
                               <tr>
        -                        <td>{{ trans('admin/hardware/form.serial') }}</td>
        -                        <td>{{ $asset->serial  }}</td>
        +                        <td>{{ trans('general.last_audit') }}</td>
        +                        <td> {{ \App\Helpers\Helper::getFormattedDateObject($audit_log->created_at, 'date', false) }} (by {{ link_to_route('users.show', $audit_log->user->present()->fullname(), [$audit_log->user->id]) }})</td>
                               </tr>
                             @endif
        -                    @if ($asset->model->manufacturer)
        -
        -                          <tr>
        -                            <td>{{ trans('admin/hardware/form.manufacturer') }}</td>
        -                            <td>
        -                             @can('superuser')
        -                              <a href="{{ route('view/manufacturer', $asset->model->manufacturer->id) }}">
        -                              {{ $asset->model->manufacturer->name }}
        -                              </a>
        -                             @else
        -                                    {{ $asset->model->manufacturer->name }}
        -                              @endcan
        -                             </td>
        -                          </tr>
        -                          <tr>
        -                            <td>
        -                                {{ trans('admin/hardware/form.model') }}</td>
        -                            <td>
        -                                @can('superuser')
        -                                    <a href="{{ route('view/model', $asset->model->id) }}">
        -                                    {{ $asset->model->name }}
        -                                    </a>
        -                                 @else
        -                                    {{ $asset->model->name }}
        -                                @endcan
        -
        -                            </td>
        -                          </tr>
        -                          <tr>
        -                            <td>{{ trans('admin/models/table.modelnumber') }}</td>
        -                            <td>
        -                              {{ $asset->model->model_number }}
        -                             </td>
        -                          </tr>
        -
        +                    @if ($asset->next_audit_date)
        +                      <tr>
        +                        <td>{{ trans('general.next_audit_date') }}</td>
        +                        <td> {{ \App\Helpers\Helper::getFormattedDateObject($asset->next_audit_date, 'date', false) }}</td>
        +                      </tr>
                             @endif
         
        +                    @if ($asset->model->manufacturer)
        +                    <tr>
        +                      <td>{{ trans('admin/hardware/form.manufacturer') }}</td>
        +                      <td>
        +                      @can('view', \App\Models\Manufacturer::class)
        +                        <a href="{{ route('manufacturers.show', $asset->model->manufacturer->id) }}">
        +                        {{ $asset->model->manufacturer->name }}
        +                        </a>
        +                      @else
        +                        {{ $asset->model->manufacturer->name }}
        +                      @endcan
        +
        +                        @if ($asset->model->manufacturer->url)
        +                            <br><i class="fa fa-globe"></i> <a href="{{ $asset->model->manufacturer->url }}">{{ $asset->model->manufacturer->url }}</a>
        +                        @endif
        +
        +                        @if ($asset->model->manufacturer->support_url)
        +                            <br><i class="fa fa-life-ring"></i> <a href="{{ $asset->model->manufacturer->support_url }}">{{ $asset->model->manufacturer->support_url }}</a>
        +                          @endif
        +
        +                          @if ($asset->model->manufacturer->support_phone)
        +                            <br><i class="fa fa-phone"></i> {{ $asset->model->manufacturer->support_phone }}
        +                          @endif
        +
        +                          @if ($asset->model->manufacturer->support_email)
        +                            <br><i class="fa fa-envelope"></i> <a href="mailto:{{ $asset->model->manufacturer->support_email }}">{{ $asset->model->manufacturer->support_email }}</a>
        +                          @endif
        +                      </td>
        +                    </tr>
        +                    @endif
        +                    <tr>
        +                      <td>
        +                        {{ trans('admin/hardware/form.model') }}</td>
        +                      <td>
        +                        @can('view', \App\Models\AssetModel::class)
        +                        <a href="{{ route('models.show', $asset->model->id) }}">
        +                          {{ $asset->model->name }}
        +                        </a>
        +                      @else
        +                        {{ $asset->model->name }}
        +                      @endcan
        +                      </td>
        +                    </tr>
        +                    <tr>
        +                      <td>{{ trans('admin/models/table.modelnumber') }}</td>
        +                      <td>
        +                        {{ $asset->model->model_number }}
        +                      </td>
        +                    </tr>
        +
        +
                             @if ($asset->model->fieldset)
                               @foreach($asset->model->fieldset->fields as $field)
                                 <tr>
        -                          <td>{{ $field->name }}
        -
        -
        +                          <td>
        +                            {{ $field->name }}
                                   </td>
                                   <td>
        -                              @if ($field->field_encrypted=='1')
        -                                  <i class="fa fa-lock" data-toggle="tooltip" data-placement="top" title="{{ trans('admin/custom_fields/general.value_encrypted') }}"></i>
        -                              @endif
        -
        -                              @if ($field->isFieldDecryptable($asset->{$field->db_column_name()} ))
        -
        -                                  @can('superuser')
        -                                      @if (($field->format=='URL') && ($asset->{$field->db_column_name()}!=''))
        -                                          <a href="{{ \App\Helpers\Helper::gracefulDecrypt($field, $asset->{$field->db_column_name()}) }}" target="_new">{{ \App\Helpers\Helper::gracefulDecrypt($field, $asset->{$field->db_column_name()}) }}</a>
        -                                      @else
        -                                          {{ \App\Helpers\Helper::gracefulDecrypt($field, $asset->{$field->db_column_name()}) }}
        -                                      @endif
        -                                  @else
        -                                      {{ strtoupper(trans('admin/custom_fields/general.encrypted')) }}
        -                                  @endcan
        +                            @if ($field->field_encrypted=='1')
        +                              <i class="fa fa-lock" data-toggle="tooltip" data-placement="top" title="{{ trans('admin/custom_fields/general.value_encrypted') }}"></i>
        +                            @endif
         
        +                            @if ($field->isFieldDecryptable($asset->{$field->db_column_name()} ))
        +                              @can('superuser')
        +                                @if (($field->format=='URL') && ($asset->{$field->db_column_name()}!=''))
        +                                  <a href="{{ \App\Helpers\Helper::gracefulDecrypt($field, $asset->{$field->db_column_name()}) }}" target="_new">{{ \App\Helpers\Helper::gracefulDecrypt($field, $asset->{$field->db_column_name()}) }}</a>
        +                                @else
        +                                  {{ \App\Helpers\Helper::gracefulDecrypt($field, $asset->{$field->db_column_name()}) }}
        +                                @endif
                                       @else
        -                                  @if (($field->format=='URL') && ($asset->{$field->db_column_name()}!=''))
        -                                      <a href="{{ $asset->{$field->db_column_name()} }}" target="_new">{{ $asset->{$field->db_column_name()} }}</a>
        -                                  @else
        -                                      {{ $asset->{$field->db_column_name()} }}
        -                                  @endif
        -                              @endif
        +                                  {{ strtoupper(trans('admin/custom_fields/general.encrypted')) }}
        +                              @endcan
         
        +                            @else
        +                              @if (($field->format=='URL') && ($asset->{$field->db_column_name()}!=''))
        +                                <a href="{{ $asset->{$field->db_column_name()} }}" target="_new">{{ $asset->{$field->db_column_name()} }}</a>
        +                              @else
        +                                {{ $asset->{$field->db_column_name()} }}
        +                              @endif
        +                            @endif
                                    </td>
                                 </tr>
                               @endforeach
        @@ -196,8 +215,8 @@
                               <tr>
                                 <td>{{ trans('admin/hardware/form.date') }}</td>
                                 <td>
        -                          {{ date('M d, Y',strtotime($asset->purchase_date)) }}
        -                         </td>
        +                          {{ \App\Helpers\Helper::getFormattedDateObject($asset->purchase_date, 'date', false) }}
        +                        </td>
                               </tr>
                             @endif
         
        @@ -215,7 +234,7 @@
                                   {{ \App\Helpers\Helper::formatCurrencyOutput($asset->purchase_cost)}}
         
                                   @if ($asset->order_number)
        -                              (Order #{{ $asset->order_number }})
        +                            (Order #{{ $asset->order_number }})
                                   @endif
                                 </td>
                               </tr>
        @@ -225,41 +244,40 @@
                               <tr>
                                 <td>{{ trans('general.supplier') }}</td>
                                 <td>
        -                            @can ('superuser')
        -                                  <a href="{{ route('view/supplier', $asset->supplier_id) }}">
        -                                  {{ $asset->supplier->name }}
        -                                  </a>
        -                                @else
        -                                {{ $asset->supplier->name }}
        -                            @endcan
        +                          @can ('superuser')
        +                            <a href="{{ route('suppliers.show', $asset->supplier_id) }}">
        +                              {{ $asset->supplier->name }}
        +                            </a>
        +                          @else
        +                            {{ $asset->supplier->name }}
        +                          @endcan
                                 </td>
                               </tr>
                             @endif
         
                             @if ($asset->warranty_months)
        -                      <tr {!! $asset->warrantee_expires() < date("Y-m-d") ? ' class="warning"' : '' !!}>
        +                      <tr {!! $asset->present()->warrantee_expires() < date("Y-m-d") ? ' class="warning"' : '' !!}>
                                 <td>{{ trans('admin/hardware/form.warranty') }}</td>
                                 <td>
                                   {{ $asset->warranty_months }}
                                   {{ trans('admin/hardware/form.months') }}
         
                                   ({{ trans('admin/hardware/form.expires') }}
        -                          {{ $asset->warrantee_expires() }})
        +                          {{ $asset->present()->warrantee_expires() }})
                                 </td>
                               </tr>
                             @endif
         
                             @if ($asset->depreciation)
                               <tr>
        -                        <td>{{ trans('admin/hardware/form.depreciation') }}</td>
        +                        <td>{{ trans('general.depreciation') }}</td>
                                 <td>
        -                            {{ $asset->depreciation->name }}
        -                            ({{ $asset->depreciation->months }}
        -                            {{ trans('admin/hardware/form.months') }}
        -                            )
        +                          {{ $asset->depreciation->name }}
        +                          ({{ $asset->depreciation->months }}
        +                          {{ trans('admin/hardware/form.months') }}
        +                          )
                                 </td>
                               </tr>
        -
                               <tr>
                                 <td>
                                   {{ trans('admin/hardware/form.fully_depreciated') }}
        @@ -285,18 +303,18 @@
         
                                   (
                                   {{ trans('admin/hardware/form.eol_date') }}:
        -                          {{ $asset->eol_date() }}
        -                          @if ($asset->months_until_eol())
        +                          {{ $asset->present()->eol_date() }}
        +                          @if ($asset->present()->months_until_eol())
                                     (
        -                            @if ($asset->months_until_eol()->y > 0) {{ $asset->months_until_eol()->y }}
        +                            @if ($asset->present()->months_until_eol()->y > 0) {{ $asset->present()->months_until_eol()->y }}
                                     {{ trans('general.years') }},
                                     @endif
         
        -                            {{ $asset->months_until_eol()->m }}
        +                            {{ $asset->present()->months_until_eol()->m }}
                                     {{ trans('general.months') }}
                                     )
                                   @endif
        -                            
        +
                                 </td>
                               </tr>
                             @endif
        @@ -307,120 +325,111 @@
                               <tr>
                                 <td>{{ trans('admin/hardware/form.expected_checkin') }}</td>
                                 <td>
        -                          {{ $asset->expected_checkin }}
        +                          {{ \App\Helpers\Helper::getFormattedDateObject($asset->expected_checkin, 'date', false) }}
                                 </td>
                               </tr>
                             @endif
        +
                             <tr>
                               <td>{{ trans('admin/hardware/form.notes') }}</td>
                               <td> {!! nl2br(e($asset->notes)) !!}</td>
                             </tr>
        -                    @if ($asset->created_at!='')
        +
        +                    @if ($asset->assetloc)
                               <tr>
        -                        <td>{{ trans('general.created_at') }}</td>
        +                        <td>{{ trans('general.location') }}</td>
                                 <td>
        -                            {{ $asset->created_at->format('F j, Y h:iA') }}
        +                          @can('superuser')
        +                            <a href="{{ route('locations.show', ['location' => $asset->assetloc->id]) }}">
        +                              {{ $asset->assetloc->name }}
        +                            </a>
        +                          @else
        +                            {{ $asset->assetloc->name }}
        +                          @endcan
                                 </td>
                               </tr>
                             @endif
         
        -                    @if ($asset->assetloc)
        -                        <tr>
        -                            <td>{{ trans('general.location') }}</td>
        -                            <td>
        -                                @can('superuser')
        -                                    <a href="{{ route('view/location', $asset->assetloc->id) }}">
        -                                    {{ $asset->assetloc->name }}
        -                                    </a>
        -                                @else
        -                                    {{ $asset->assetloc->name }}
        -                                @endcan
        -                            </td>
        -                        </tr>
        -                    @endif
        -
                             @if ($asset->defaultLoc)
        -                        <tr>
        -                            <td>{{ trans('admin/hardware/form.default_location') }}</td>
        -                            <td>
        -                                @can('superuser')
        -                                    <a href="{{ route('view/location', $asset->defaultLoc->id) }}">
        -                                    {{ $asset->defaultLoc->name }}
        -                                    </a>
        -                                @else
        -                                    {{ $asset->defaultLoc->name }}
        -                                @endcan
        -                            </td>
        -                        </tr>
        +                      <tr>
        +                        <td>{{ trans('admin/hardware/form.default_location') }}</td>
        +                        <td>
        +                          @can('superuser')
        +                            <a href="{{ route('locations.show', ['location' => $asset->defaultLoc->id]) }}">
        +                              {{ $asset->defaultLoc->name }}
        +                            </a>
        +                          @else
        +                            {{ $asset->defaultLoc->name }}
        +                          @endcan
        +                        </td>
        +                      </tr>
                             @endif
         
        +                    @if ($asset->created_at!='')
        +                      <tr>
        +                        <td>{{ trans('general.created_at') }}</td>
        +                        <td>
        +                          {{ \App\Helpers\Helper::getFormattedDateObject($asset->created_at, 'datetime', false) }}
        +                        </td>
        +                      </tr>
        +                    @endif
         
        -
        +                    @if ($asset->updated_at!='')
        +                      <tr>
        +                        <td>{{ trans('general.updated_at') }}</td>
        +                        <td>
        +                          {{ \App\Helpers\Helper::getFormattedDateObject($asset->updated_at, 'datetime', false) }}
        +                        </td>
        +                      </tr>
        +                    @endif
                           </tbody>
                         </table>
                       </div> <!-- /table-responsive -->
        -            </div><!-- /col -->
        +            </div><!-- /col-md-8 -->
         
                     <div class="col-md-4">
        -
                       @if ($asset->image)
        -                <img src="{{ config('app.url') }}/uploads/assets/{{{ $asset->image }}}" class="assetimg img-responsive">
        +                <img src="{{ url('/') }}/uploads/assets/{{{ $asset->image }}}" class="assetimg img-responsive">
                       @elseif ($asset->model->image!='')
        -                <img src="{{ config('app.url') }}/uploads/models/{{{ $asset->model->image }}}" class="assetimg img-responsive">
        +                <img src="{{ url('/') }}/uploads/models/{{{ $asset->model->image }}}" class="assetimg img-responsive">
                       @endif
         
        -              @if  (($snipeSettings->qr_code=='1') && ($asset->deleted_at==''))
        +              @if  ($snipeSettings->qr_code=='1')
                          <img src="{{ config('app.url') }}/hardware/{{ $asset->id }}/qr_code" class="img-thumbnail pull-right" style="height: 100px; width: 100px; margin-right: 10px;">
                       @endif
         
        -              @if (($asset->assigneduser) && ($asset->assigned_to > 0) && ($asset->deleted_at==''))
        +              @if (($asset->assignedTo) && ($asset->deleted_at==''))
                         <h4>{{ trans('admin/hardware/form.checkedout_to') }}</h4>
                         <p>
        -                  <img src="{{ $asset->assigneduser->gravatar() }}" class="user-image-inline" alt="{{ $asset->assigneduser->fullName() }}">
        -                  <a href="{{ route('view/user', $asset->assigned_to) }}">{{ $asset->assigneduser->fullName() }}</a>
        +                  @if($asset->checkedOutToUser()) <!-- Only users have avatars currently-->
        +                  <img src="{{ $asset->assignedTo->present()->gravatar() }}" class="user-image-inline" alt="{{ $asset->assignedTo->present()->fullName() }}">
        +                  @endif
        +                  {!! $asset->assignedTo->present()->glyph() . ' ' .$asset->assignedTo->present()->nameUrl() !!}
                         </p>
         
                         <ul class="list-unstyled">
        -
        -                  @if ((isset($asset->assigneduser->email)) && ($asset->assigneduser->email!=''))
        -                    <li><i class="fa fa-envelope-o"></i> <a href="mailto:{{ $asset->assigneduser->email }}">{{ $asset->assigneduser->email }}</a></li>
        +                  @if ((isset($asset->assignedTo->email)) && ($asset->assignedTo->email!=''))
        +                    <li><i class="fa fa-envelope-o"></i> <a href="mailto:{{ $asset->assignedTo->email }}">{{ $asset->assignedTo->email }}</a></li>
                           @endif
         
        -                  @if ((isset($asset->assigneduser->phone)) && ($asset->assigneduser->phone!=''))
        -                    <li><i class="fa fa-phone"></i> {{ $asset->assigneduser->phone }}</li>
        +                  @if ((isset($asset->assignedTo->phone)) && ($asset->assignedTo->phone!=''))
        +                    <li><i class="fa fa-phone"></i> {{ $asset->assignedTo->phone }}</li>
                           @endif
         
        -                  @if (isset($asset->userloc))
        -                    <li>{{ $asset->userloc->name }}</li>
        -                    <li>{{ $asset->userloc->address }}
        -                      @if ($asset->userloc->address2!='')
        -                        {{ $asset->userloc->address2 }}
        +                  @if (isset($asset->assetLoc))
        +                    <li>{{ $asset->assetLoc->name }}</li>
        +                    <li>{{ $asset->assetLoc->address }}
        +                      @if ($asset->assetLoc->address2!='')
        +                      {{ $asset->assetLoc->address2 }}
                               @endif
                             </li>
         
        -                    <li>{{ $asset->userloc->city }}
        -                      @if (($asset->userloc->city!='') && ($asset->userloc->state!=''))
        +                    <li>{{ $asset->assetLoc->city }}
        +                      @if (($asset->assetLoc->city!='') && ($asset->assetLoc->state!=''))
                                   ,
                               @endif
        -                      {{ $asset->userloc->state }} {{ $asset->userloc->zip }}
        +                      {{ $asset->assetLoc->state }} {{ $asset->assetLoc->zip }}
                             </li>
        -
        -                  @elseif (isset($asset->assetloc))
        -                    <li>{{ $asset->assetloc->name }}</li>
        -                    <li>{{ $asset->assetloc->address }}
        -                      @if ($asset->assetloc->address2!='')
        -                        {{ $asset->assetloc->address2 }}
        -                      @endif
        -                    </li>
        -
        -                    <li>
        -                      {{ $asset->assetloc->city }}
        -                      @if (($asset->assetloc->city!='') && ($asset->assetloc->state!=''))
        -                      ,
        -                      @endif
        -                      {{ $asset->assetloc->state }} {{ $asset->assetloc->zip }}
        -                    </li>
        -
                             @endif
                         </ul>
         
        @@ -429,12 +438,10 @@
                   </div><!-- /row -->
                 </div><!-- /.tab-pane asset details -->
         
        -
                 <div class="tab-pane fade" id="software">
                   <div class="row">
                     <div class="col-md-12">
                       <!-- Licenses assets table -->
        -
                       @if (count($asset->licenses) > 0)
                         <table class="table">
                           <thead>
        @@ -447,10 +454,10 @@
                           <tbody>
                             @foreach ($asset->licenseseats as $seat)
                             <tr>
        -                      <td><a href="{{ route('view/license', $seat->license->id) }}">{{ $seat->license->name }}</a></td>
        +                      <td><a href="{{ route('licenses.show', $seat->license->id) }}">{{ $seat->license->name }}</a></td>
                               <td>{{ $seat->license->serial }}</td>
                               <td>
        -                        <a href="{{ route('checkin/license', $seat->id) }}" class="btn-flat info btn-sm">{{ trans('general.checkin') }}</a>
        +                        <a href="{{ route('licenses.checkin', $seat->id) }}" class="btn-flat info btn-sm">{{ trans('general.checkin') }}</a>
                               </td>
                             </tr>
                             @endforeach
        @@ -468,19 +475,19 @@
                     </div><!-- /col -->
                   </div> <!-- row -->
                 </div> <!-- /.tab-pane software -->
        +
                 <div class="tab-pane fade" id="components">
                   <!-- checked out assets table -->
                   <div class="row">
                       <div class="col-md-12">
                         @if(count($asset->components) > 0)
                           <table class="table table-striped">
        -
                             <tbody>
                               <?php $totalCost = 0; ?>
                               @foreach ($asset->components as $component)
                                 @if (is_null($component->deleted_at))
                                   <tr>
        -                            <td><a href="{{ route('view/component', $component->id) }}">{{ $component->name }}</a></td>
        +                            <td><a href="{{ route('components.show', $component->id) }}">{{ $component->name }}</a></td>
                                   </tr>
                                 @endif
                               @endforeach
        @@ -498,40 +505,41 @@
                             {{ trans('general.no_results') }}
                           </div>
                         @endif
        -  
                       </div>
                   </div>
                 </div> <!-- /.tab-pane components -->
        +
                 <div class="tab-pane fade" id="maintenances">
                   <div class="row">
                     <div class="col-md-12">
        -                @can('assets.edit')
        -              <h6>{{ trans('general.asset_maintenances') }}
        -                [ <a href="{{ route('create/asset_maintenances', $asset->id) }}">{{ trans('button.add') }}</a> ]
        -              </h6>
        +                @can('update', \App\Models\Asset::class)
        +                  <h6>{{ trans('general.asset_maintenances') }}
        +                    [ <a href="{{ route('maintenances.create', ['asset_id'=>$asset->id]) }}">{{ trans('button.add') }}</a> ]
        +                  </h6>
                         @endcan
         
                       <!-- Asset Maintenance table -->
                       @if (count($asset->assetmaintenances) > 0)
        -                  <table class="table table-striped">
        -                    <thead>
        -                      <tr>
        -                        <th>{{ trans('general.supplier') }}</th>
        -                        <th>{{ trans('admin/asset_maintenances/form.title') }}</th>
        -                        <th>{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}</th>
        -                        <th>{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        -                        <th>{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
        -                        <th>{{ trans('admin/asset_maintenances/form.notes') }}</th>
        -                        <th>{{ trans('admin/asset_maintenances/table.is_warranty') }}</th>
        -                        <th>{{ trans('admin/asset_maintenances/form.cost') }}</th>
        -                        <th>{{ trans('general.admin') }}</th>
        -                          @can('assets.edit')
        -                                <th>{{ trans('table.actions') }}</th>
        -                          @endcan
        -                      </tr>
        -                    </thead>
        -                    <tbody>
        -                      <?php $totalCost = 0; ?>
        +                <table class="table table-striped">
        +                  <thead>
        +                    <tr>
        +                      <th>{{ trans('general.supplier') }}</th>
        +                      <th>{{ trans('admin/asset_maintenances/form.title') }}</th>
        +                      <th>{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}</th>
        +                      <th>{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        +                      <th>{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
        +                      <th>{{ trans('admin/asset_maintenances/form.notes') }}</th>
        +                      <th>{{ trans('admin/asset_maintenances/table.is_warranty') }}</th>
        +                      <th>{{ trans('admin/asset_maintenances/form.cost') }}</th>
        +                      <th>{{ trans('general.admin') }}</th>
        +
        +                      @can('update', \App\Models\Asset::class)
        +                      <th>{{ trans('table.actions') }}</th>
        +                      @endcan
        +                    </tr>
        +                  </thead>
        +                  <tbody>
        +                    <?php $totalCost = 0; ?>
         
                               @foreach ($asset->assetmaintenances as $assetMaintenance)
                                 @if (is_null($assetMaintenance->deleted_at))
        @@ -554,21 +562,21 @@
                                       @endif
                                     </td>
                                     <?php $totalCost += $assetMaintenance->cost; ?>
        -                              @can('assets.edit')
        -                            <td>
        -                              <a href="{{ route('update/asset_maintenance', $assetMaintenance->id) }}" class="btn btn-warning btn-sm"><i class="fa fa-pencil icon-white"></i></a>
        -                            </td>
        -                              @endcan
        -                          </tr>
        -                        @endif
        -                      @endforeach
        -                    </tbody>
        -                    <tfoot>
        -                      <tr>
        -                        <td colspan="8" class="text-right">{{ is_numeric($totalCost) ? $use_currency.number_format($totalCost, 2) : $totalCost }}</td>
        -                      </tr>
        -                    </tfoot>
        -                  </table>
        +                            @can('update', \App\Models\Asset::class)
        +                              <td>
        +                                <a href="{{ route('maintenances.edit', $assetMaintenance->id) }}" class="btn btn-warning btn-sm"><i class="fa fa-pencil icon-white"></i></a>
        +                              </td>
        +                            @endcan
        +                        </tr>
        +                      @endif
        +                    @endforeach
        +                  </tbody>
        +                  <tfoot>
        +                    <tr>
        +                      <td colspan="8" class="text-right">{{ is_numeric($totalCost) ? $use_currency.number_format($totalCost, 2) : $totalCost }}</td>
        +                    </tr>
        +                  </tfoot>
        +                </table>
                       @else
                         <div class="alert alert-info alert-block">
                           <i class="fa fa-info-circle"></i>
        @@ -583,99 +591,24 @@
                   <!-- checked out assets table -->
                   <div class="row">
                     <div class="col-md-12">
        -              <table class="table table-hover table-fixed break-word">
        +              <table
        +                      class="table table-striped snipe-table"
        +                      name="assetHistory"
        +                      id="table"
        +                      data-sort-order="desc"
        +                      data-height="400"
        +                      data-url="{{ route('api.activity.index', ['item_id' => $asset->id, 'item_type' => 'asset']) }}">
                         <thead>
        -                  <tr>
        -                      <th class="col-md-3">{{ trans('general.date') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('general.admin') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('table.actions') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('general.user') }}</th>
        -                      <th class="col-md-3"><span class="line"></span>{{ trans('general.notes') }}</th>
        -                      @if  ($snipeSettings->require_accept_signature=='1')
        -                      <th class="col-md-3"><span class="line"></span>{{ trans('general.signature') }}</th>
        -                      @endif
        -                  </tr>
        +                <tr>
        +                  <th data-field="icon" style="width: 40px;" class="hidden-xs" data-formatter="iconFormatter"></th>
        +                  <th class="col-sm-2" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.date') }}</th>
        +                  <th class="col-sm-2" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
        +                  <th class="col-sm-2" data-field="action_type">{{ trans('general.action') }}</th>
        +                  <th class="col-sm-2" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
        +                  <th class="col-sm-2" data-field="target" data-formatter="polymorphicItemFormatter">{{ trans('general.target') }}</th>
        +                  <th class="col-sm-2" data-field="note">{{ trans('general.notes') }}</th>
        +                </tr>
                         </thead>
        -                <tbody>
        -                  @if (count($asset->assetlog) > 0)
        -                    @foreach ($asset->assetlog as $log)
        -                      <tr>
        -                        <td>{{ $log->created_at }}</td>
        -                        <td>
        -                            @if ($log->action_type != 'requested')
        -                                @if (isset($log->user))
        -                                    {{ $log->user->fullName() }}
        -                                @endif
        -                            @endif
        -                        </td>
        -                        <td>{{ $log->action_type }}</td>
        -                        <td>
        -                          @if ($log->action_type=='uploaded')
        -
        -                            {{ $log->filename }}
        -                          @elseif ((isset($log->target_id)) && ($log->target_id!=0) && ($log->target_id!=''))
        -
        -
        -                            @if ($log->target instanceof \App\Models\User)
        -
        -                              @if ($log->target->deleted_at=='')
        -                                <a href="{{ route('view/user', $log->target_id) }}">
        -                                {{ $log->target->fullName() }}
        -                                </a>
        -                              @else
        -                                <del>{{ $log->target->fullName() }}</del>
        -                              @endif
        -                            @elseif($log->target instanceof \App\Models\Asset) 
        -                              @if ($log->target->deleted_at=='')
        -                                <a href="{{ route('view/hardware', $log->target_id) }}">
        -                                {{ $log->target->showAssetName() }}
        -                                </a>
        -                              @else
        -                                <del>{{ $log->target->showAssetName() }}</del>
        -                              @endif
        -                            @elseif (($log->action_type=='accepted') || ($log->action_type=='declined'))
        -                                {{-- On a declined log, the asset isn't assigned to anyone when we look this up. --}}
        -                                @if ($log->item->assigneduser)
        -                                    {{ $log->item->assigneduser->fullName() }}
        -                                @else
        -                                    Unknown
        -                                @endif
        -                            @else
        -
        -                              Deleted User
        -                            @endif
        -                          @endif
        -                        </td>
        -                        <td>
        -                          @if ($log->note) {{ $log->note }}
        -                          @endif
        -                        </td>
        -                          @if  ($snipeSettings->require_accept_signature=='1')
        -                          <td>
        -                              @if (($log->accept_signature!='') && (($log->action_type=='accepted') || ($log->action_type=='declined')))
        -                                  <a href="{{ route('log.signature.view', ['filename' => $log->accept_signature ]) }}" data-toggle="lightbox" data-type="image"><img src="{{ route('log.signature.view', ['filename' => $log->accept_signature ]) }}" class="img-responsive"></a>
        -                               @endif
        -                          </td>
        -                          @endif
        -                      </tr>
        -
        -                    @endforeach
        -                  @endif
        -                  <!-- Add a "created asset" row to the log list.  This isn't an official log entry.-->
        -                  <tr>
        -                    <td>{{ $asset->created_at }}</td>
        -                    <td>
        -                        @if ($asset->adminuser)
        -                            {{ $asset->adminuser->fullName() }}
        -                        @else
        -                            {{ trans('general.unknown_admin') }}
        -                        @endif
        -                    </td>
        -                    <td>{{ trans('general.created_asset') }}</td>
        -                    <td></td> <!-- User -->
        -                    <td></td> <!-- Notes -->
        -                  </tr>
        -                </tbody>
                       </table>
                     </div>
                   </div> <!-- /.row -->
        @@ -684,34 +617,33 @@
                 <div class="tab-pane fade" id="files">
                   <div class="row">
         
        -              @can('assets.edit')
        -            {{ Form::open([
        -            'method' => 'POST',
        -            'route' => ['upload/asset', $asset->id],
        -            'files' => true, 'class' => 'form-horizontal' ]) }}
        +            @can('update', \App\Models\Asset::class)
        +              {{ Form::open([
        +              'method' => 'POST',
        +              'route' => ['upload/asset', $asset->id],
        +              'files' => true, 'class' => 'form-horizontal' ]) }}
         
        -            <div class="col-md-2">
        -              <span class="btn btn-default btn-file">Browse for file...
        -                  {{ Form::file('assetfile[]', ['multiple' => 'multiple']) }}
        -              </span>
        -            </div>
        -            <div class="col-md-7">
        -              {{ Form::text('notes', Input::old('notes', Input::old('notes')), array('class' => 'form-control','placeholder' => 'Notes')) }}
        -            </div>
        -            <div class="col-md-3">
        -              <button type="submit" class="btn btn-primary">{{ trans('button.upload') }}</button>
        -            </div>
        +              <div class="col-md-2">
        +                <span class="btn btn-default btn-file">Browse for file...
        +                    {{ Form::file('assetfile[]', ['multiple' => 'multiple']) }}
        +                </span>
        +              </div>
        +              <div class="col-md-7">
        +                {{ Form::text('notes', Input::old('notes', Input::old('notes')), array('class' => 'form-control','placeholder' => 'Notes')) }}
        +              </div>
        +              <div class="col-md-3">
        +                <button type="submit" class="btn btn-primary">{{ trans('button.upload') }}</button>
        +              </div>
        +
        +              <div class="col-md-12">
        +                <p>{{ trans('admin/hardware/general.filetype_info') }}</p>
        +                <hr>
        +              </div>
        +
        +              {{ Form::close() }}
        +            @endcan
         
                     <div class="col-md-12">
        -              <p>{{ trans('admin/hardware/general.filetype_info') }}</p>
        -              <hr>
        -            </div>
        -
        -            {{ Form::close() }}
        -              @endcan
        -
        -            <div class="col-md-12">
        -
                       <table class="table table-hover">
                         <thead>
                           <tr>
        @@ -728,12 +660,12 @@
                               <tr>
                                 <td>
                                   @if ($file->note)
        -                              {{ $file->note }}
        +                          {{ $file->note }}
                                   @endif
                                 </td>
                                 <td>
                                   @if ( \App\Helpers\Helper::checkUploadIsImage($file->get_src('assets')))
        -                               <a href="../{{ $asset->id }}/showfile/{{ $file->id }}" data-toggle="lightbox" data-type="image"><img src="../{{ $asset->id }}/showfile/{{ $file->id }}"" class="img-thumbnail" style="max-width: 50px;"></a>
        +                            <a href="{{ route('show/assetfile', ['assetId' => $asset->id, 'fileId' =>$file->id]) }}" data-toggle="lightbox" data-type="image"><img src="{{ route('show/assetfile', ['assetId' => $asset->id, 'fileId' =>$file->id]) }}" class="img-thumbnail" style="max-width: 50px;"></a>
                                   @endif
                                 </td>
                                 <td>
        @@ -745,21 +677,19 @@
                                   @endif
                                 </td>
                                 <td>
        -                            @can('assets.edit')
        -                          <a class="btn delete-asset btn-danger btn-sm" href="{{ route('delete/assetfile', [$asset->id, $file->id]) }}"><i class="fa fa-trash icon-white"></i></a>
        -                            @endcan
        +                          @can('update', \App\Models\Asset::class)
        +                            <a class="btn delete-asset btn-danger btn-sm" href="{{ route('delete/assetfile', [$asset->id, $file->id]) }}"><i class="fa fa-trash icon-white"></i></a>
        +                          @endcan
                                 </td>
                               </tr>
                             @endforeach
                           @else
        -                      <tr>
        -                        <td colspan="4">
        -                          {{ trans('general.no_results') }}
        -                        </td>
        -                      </tr>
        -
        +                    <tr>
        +                      <td colspan="4">
        +                        {{ trans('general.no_results') }}
        +                      </td>
        +                    </tr>
                           @endif
        -
                         </tbody>
                       </table>
                     </div> <!-- /.col-md-12 -->
        @@ -769,14 +699,16 @@
             </div> <!-- /.nav-tabs-custom -->
           </div> <!-- /. col-md-12 -->
         </div> <!-- /. row -->
        +@stop
         
         @section('moar_scripts')
        +  @include ('partials.bootstrap-table', ['simple_view' => true])
        +
         <script>
             $(document).delegate('*[data-toggle="lightbox"]', 'click', function(event) {
                 event.preventDefault();
                 $(this).ekkoLightbox();
             });
         </script>
        -@stop
         
         @stop
        diff --git a/resources/views/importer/import.blade.php b/resources/views/importer/import.blade.php
        new file mode 100644
        index 0000000000..e78547f884
        --- /dev/null
        +++ b/resources/views/importer/import.blade.php
        @@ -0,0 +1,86 @@
        +@extends('layouts/default')
        +<link rel="stylesheet" type="text/css" href="{{ asset('css/lib/jquery.fileupload.css') }}">
        +
        +{{-- Hide importer until vue has rendered it, if we continue using vue for other things we should move this higher in the style --}}
        +<style>
        +[v-cloak] {
        +    display:none;
        +}
        +</style>
        +{{-- Page title --}}
        +@section('title')
        +{{ trans('general.import') }}
        +@parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +<div id="app">
        +    <importer inline-template v-cloak>
        +        <div class="row">
        +        <alert v-show="alert.visible" :alert-type="alert.type" v-on:hide="alert.visible = false">@{{ alert.message }}</alert>
        +            <errors :errors="importErrors"></errors>
        +            <div class="col-md-12">
        +                <div class="box">
        +                    <div class="box-body">
        +                        <div class="row">
        +                            <div class="col-md-3">
        +                                <!-- The fileinput-button span is used to style the file input field as button -->
        +                                <span class="btn btn-info fileinput-button">
        +                                    <span>Select Import File...</span>
        +                                    <!-- The file input field used as target for the file upload widget -->
        +                                    <input id="fileupload" type="file" name="files[]" data-url="/api/v1/imports" accept="text/csv">
        +                                </span>
        +                            </div>
        +                            <div class="col-md-9" v-show="progress.visible" style="padding-bottom:20px">
        +                                <div class="col-md-11">
        +                                    <div class="progress progress-striped-active" style="margin-top: 8px">
        +                                        <div class="progress-bar" :class="progress.currentClass" role="progressbar" :style="progressWidth">
        +                                            <span>@{{ progress.statusText }}</span>
        +                                        </div>
        +                                    </div>
        +                                </div>
        +                            </div>
        +                        </div>
        +                        <div class="row">
        +                            <div class="col-md-12" style="padding-top: 30px;">
        +                                <table class="table table-striped" id="upload-table">
        +                                    <thead>
        +                                        <th>File</th>
        +                                        <th>Created</th>
        +                                        <th>Size</th>
        +                                        <th></th>
        +                                    </thead>
        +                                    <tbody>
        +                                    	<template v-for="currentFile in files">
        +                                    		<tr>
        +                                    			<td>@{{ currentFile.file_path }}</td>
        +                                    			<td>@{{ currentFile.created_at }} </td>
        +                                    			<td>@{{ currentFile.filesize }}</td>
        +                                    			<td>
        +                                    			<button class="btn btn-sm btn-info" @click="toggleEvent(currentFile.id)">Process</button>
        +                                    				<button class="btn btn-danger" @click="deleteFile(currentFile)"><i class="fa fa-trash icon-white"></i></button>
        +                                    			</td>
        +                                    		</tr>
        +                                    			<import-file :key="currentFile.id" :file="currentFile" @alert="updateAlert(alert)">
        +                                    			</import-file>
        +                                    	</template>
        +                                    </tbody>
        +                                </table>
        +                            </div>
        +                        </div>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </importer>
        +</div>
        +@stop
        +
        +@section('moar_scripts')
        +<script>
        +    new Vue({
        +        el: '#app'
        +    });
        +</script>
        +@endsection
        diff --git a/resources/views/layouts/basic.blade.php b/resources/views/layouts/basic.blade.php
        index e7f340c261..30ad26c324 100644
        --- a/resources/views/layouts/basic.blade.php
        +++ b/resources/views/layouts/basic.blade.php
        @@ -6,31 +6,13 @@
             <meta charset="utf-8">
             <meta http-equiv="X-UA-Compatible" content="IE=edge">
             <meta name="viewport" content="width=device-width, initial-scale=1">
        -    <title>Snipe-IT</title>
        +    <title>{{ ($snipeSettings) && ($snipeSettings->site_name) ? $snipeSettings->site_name : 'Snipe-IT' }}</title>
         
        -    <!-- CSS -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/bootstrap.min.css') }}">
        -    <!-- Font Awesome -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/font-awesome.min.css') }}">
         
             <!-- Select2 -->
        -    <link rel="stylesheet" href="{{ asset('assets/js/plugins/select2/select2.min.css') }}">
        +    <link rel="stylesheet" href="{{ asset('js/plugins/select2/select2.min.css') }}">
         
        -    <!-- Bootstrap Color Picker -->
        -    <link rel="stylesheet" href="{{ asset('assets/js/plugins/colorpicker/bootstrap-colorpicker.min.css') }}">
        -
        -    <link rel="stylesheet" href="{{ asset('assets/js/plugins/datepicker/bootstrap-datepicker.css') }}">
        -
        -    <!-- jvectormap -->
        -    <link rel="stylesheet" href="{{ asset('assets/js/plugins/jvectormap/jquery-jvectormap-1.2.2.css') }}">
        -    <!-- Theme style -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/AdminLTE.min.css') }}">
        -    <link rel="stylesheet" href="{{ asset('assets/css/skins/skin-blue.css') }}">
        -
        -    <!-- bootstrap tables CSS -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/bootstrap-table.css') }}">
        -
        -    <link rel="stylesheet" href="{{ elixir('assets/css/app.css') }}">
        +    <link rel="stylesheet" href="{{ mix('css/dist/all.css') }}">
             <link rel="shortcut icon" type="image/ico" href="{{ asset('favicon.ico') }}">
         
         
        @@ -59,7 +41,9 @@
         <body class="hold-transition login-page">
         
             @if (($snipeSettings) && ($snipeSettings->logo!=''))
        -    <center><img class="logo" style="padding-top: 20px; padding-bottom: 10px;" src="{{ config('app.url') }}/uploads/{{ $snipeSettings->logo }}"></center>
        +        <center>
        +            <img class="logo" style="padding-top: 20px; padding-bottom: 10px;" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}">
        +        </center>
             @endif
           <!-- Content -->
           @yield('content')
        diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php
        index acb53a8cfe..58d4557202 100644
        --- a/resources/views/layouts/default.blade.php
        +++ b/resources/views/layouts/default.blade.php
        @@ -11,30 +11,29 @@
             </title>
             <!-- Tell the browser to be responsive to screen width -->
             <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
        -    <!-- Bootstrap 3.3.5 -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/bootstrap.min.css') }}">
        -    <!-- Font Awesome -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/font-awesome.min.css') }}">
         
             <!-- Select2 -->
        -    <link rel="stylesheet" href="{{ asset('assets/js/plugins/select2/select2.min.css') }}">
        -
        -    <link rel="stylesheet" href="{{ asset('assets/js/plugins/datepicker/bootstrap-datepicker.css') }}">
        +    <link rel="stylesheet" href="{{ asset('js/plugins/select2/select2.min.css') }}">
         
             <!-- iCheck for checkboxes and radio inputs -->
        -    <link rel="stylesheet" href="{{ asset('assets/js/plugins/iCheck/all.css') }}">
        -
        -    <!-- Theme style -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/skins/skin-blue.css') }}">
        +    <link rel="stylesheet" href="{{ asset('js/plugins/iCheck/all.css') }}">
         
             <!-- bootstrap tables CSS -->
        -    <link rel="stylesheet" href="{{ asset('assets/css/bootstrap-table.css') }}">
        +    <link rel="stylesheet" href="{{ asset('css/bootstrap-table.css') }}">
         
        -    <link rel="stylesheet" href="{{ asset(elixir('assets/css/app.css')) }}">
        +    <link rel="stylesheet" href="{{ mix('css/dist/all.css') }}">
         
             <link rel="shortcut icon" type="image/ico" href="{{ asset('favicon.ico') }}">
         
        -    <style>
        +    <meta name="csrf-token" content="{{ csrf_token() }}">
        +
        +      <script>
        +          window.Laravel = { csrfToken: '{{ csrf_token() }}' };
        +      </script>
        +
        +
        +
        +      <style>
                 @if ($snipeSettings)
                     @if ($snipeSettings->header_color)
                     .main-header .navbar, .main-header .logo {
        @@ -69,6 +68,8 @@
             }
             </style>
         
        +
        +
             <script>
                   window.snipeit = {
                       settings: {
        @@ -87,8 +88,8 @@
                     <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
         
                @else
        -            <script src="{{ asset('assets/js/html5shiv.js') }}"></script>
        -            <script src="{{ asset('assets/js/respond.js') }}"></script>
        +            <script src="{{ asset('js/html5shiv.js') }}"></script>
        +            <script src="{{ asset('js/respond.js') }}"></script>
                @endif
                <![endif]-->
           </head>
        @@ -109,62 +110,66 @@
                   <ul class="nav navbar-nav navbar-left">
                       <li class="left-navblock">
                          @if ($snipeSettings->brand == '3')
        -                      <a class="logo navbar-brand no-hover" href="{{ config('app.url') }}">
        -                          <img class="navbar-brand-img" src="{{ config('app.url') }}/uploads/{{ $snipeSettings->logo }}">
        +                      <a class="logo navbar-brand no-hover" href="{{ url('/') }}">
        +                          @if ($snipeSettings->logo!='')
        +                          <img class="navbar-brand-img" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}">
        +                          @endif
                                   {{ $snipeSettings->site_name }}
                               </a>
                           @elseif ($snipeSettings->brand == '2')
        -                      <a class="logo navbar-brand no-hover" href="{{ config('app.url') }}">
        -                          <img class="navbar-brand-img" src="{{ config('app.url') }}/uploads/{{ $snipeSettings->logo }}">
        +                      <a class="logo navbar-brand no-hover" href="{{ url('/') }}">
        +                          @if ($snipeSettings->logo!='')
        +                          <img class="navbar-brand-img" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}">
        +                          @endif
                               </a>
                           @else
        -                      <a class="logo no-hover" href="{{ config('app.url') }}">
        +                      <a class="logo no-hover" href="{{ url('/') }}">
                                   {{ $snipeSettings->site_name }}
                               </a>
                           @endif
                       </li>
        -            </ul> 
        +            </ul>
         
                   <!-- Navbar Right Menu -->
                     <div class="navbar-custom-menu">
                       <ul class="nav navbar-nav">
        -                  @can('assets.view')
        +                  @can('index', \App\Models\Asset::class)
                           <li {!! (Request::is('hardware*') ? ' class="active"' : '') !!}>
        -                      <a href="{{ URL::to('hardware') }}">
        +                      <a href="{{ url('hardware') }}">
                                   <i class="fa fa-barcode"></i>
                               </a>
                           </li>
                           @endcan
        -                  @can('licenses.view')
        -                  <li {!! (Request::is('admin/licenses*') ? ' class="active"' : '') !!}>
        -                      <a href="{{ URL::to('admin/licenses') }}">
        +                  @can('view', \App\Models\License::class)
        +                  <li {!! (Request::is('licenses*') ? ' class="active"' : '') !!}>
        +                      <a href="{{ route('licenses.index') }}">
                                   <i class="fa fa-floppy-o"></i>
                               </a>
                           </li>
                           @endcan
        -                  @can('accessories.view')
        -                  <li {!! (Request::is('admin/accessories*') ? ' class="active"' : '') !!}>
        -                      <a href="{{ URL::to('admin/accessories') }}">
        +                  @can('index', \App\Models\Accessory::class)
        +                  <li {!! (Request::is('accessories*') ? ' class="active"' : '') !!}>
        +                      <a href="{{ route('accessories.index') }}">
                                   <i class="fa fa-keyboard-o"></i>
                               </a>
                           </li>
                           @endcan
        -                  @can('consumables.view')
        -                  <li {!! (Request::is('admin/consumables*') ? ' class="active"' : '') !!}>
        -                      <a href="{{ URL::to('admin/consumables') }}">
        +                  @can('index', \App\Models\Consumable::class)
        +                  <li {!! (Request::is('consumables*') ? ' class="active"' : '') !!}>
        +                      <a href="{{ url('consumables') }}">
                                   <i class="fa fa-tint"></i>
                               </a>
                           </li>
                           @endcan
        -                  @can('components.view')
        -                  <li {!! (Request::is('admin/components*') ? ' class="active"' : '') !!}>
        -                      <a href="{{ URL::to('admin/components') }}">
        +                  @can('view', \App\Models\Component::class)
        +                  <li {!! (Request::is('components*') ? ' class="active"' : '') !!}>
        +                      <a href="{{ route('components.index') }}">
                                   <i class="fa fa-hdd-o"></i>
                               </a>
                           </li>
                           @endcan
         
        -                  @can('assets.view')
        +                  @can('index', \App\Models\Asset::class)
                           <form class="navbar-form navbar-left form-horizontal" role="search" action="{{ route('findbytag/hardware') }}" method="get">
                               <div class="col-xs-12 col-md-12">
                                   <div class="col-xs-12 form-group">
        @@ -186,44 +191,44 @@
                               <b class="caret"></b>
                             </a>
                            <ul class="dropdown-menu">
        -                     @can('assets.create')
        +                     @can('create', \App\Models\Asset::class)
                               <li {!! (Request::is('hardware/create') ? 'class="active>"' : '') !!}>
        -                              <a href="{{ route('create/hardware') }}">
        +                              <a href="{{ route('hardware.create') }}">
                                           <i class="fa fa-barcode fa-fw"></i>
                                           @lang('general.asset')</a>
                               </li>
                                @endcan
        -                       @can('licenses.create')
        -                       <li {!! (Request::is('admin/licenses/create') ? 'class="active"' : '') !!}>
        -                           <a href="{{ route('create/licenses') }}">
        +                       @can('create', \App\Models\License::class)
        +                       <li {!! (Request::is('licenses/create') ? 'class="active"' : '') !!}>
        +                           <a href="{{ route('licenses.create') }}">
                                        <i class="fa fa-floppy-o fa-fw"></i>
                                        @lang('general.license')</a>
                                </li>
                                @endcan
        -                       @can('accessories.create')
        -                       <li {!! (Request::is('admin/accessories/create') ? 'class="active"' : '') !!}>
        -                           <a href="{{ route('create/accessory') }}">
        +                       @can('create', \App\Models\Accessory::class)
        +                       <li {!! (Request::is('accessories/create') ? 'class="active"' : '') !!}>
        +                           <a href="{{ route('accessories.create') }}">
                                        <i class="fa fa-keyboard-o fa-fw"></i>
                                        @lang('general.accessory')</a>
                                </li>
                                @endcan
        -                       @can('consumables.create')
        -                       <li {!! (Request::is('admin/consumables/create') ? 'class="active"' : '') !!}>
        -                           <a href="{{ route('create/consumable') }}">
        +                       @can('create', \App\Models\Consumable::class)
        +                       <li {!! (Request::is('consunmables/create') ? 'class="active"' : '') !!}>
        +                           <a href="{{ route('consumables.create') }}">
                                        <i class="fa fa-tint fa-fw"></i>
                                        @lang('general.consumable')</a>
                                </li>
                                @endcan
        -                       @can('users.create')
        -                       <li {!! (Request::is('admin/users/create') ? 'class="active"' : '') !!}>
        -                           <a href="{{ route('create/user') }}">
        +                       @can('create', \App\Models\User::class)
        +                       <li {!! (Request::is('users/create') ? 'class="active"' : '') !!}>
        +                           <a href="{{ route('users.create') }}">
                                    <i class="fa fa-user fa-fw"></i>
                                    @lang('general.user')</a>
                                </li>
                                @endcan
        -                       @can('components.create')
        -                       <li {!! (Request::is('admin/components/create') ? 'class="active"' : '') !!}>
        -                           <a href="{{ route('create/component') }}">
        +                       @can('create', \App\Models\Component::class)
        +                       <li {!! (Request::is('components/create') ? 'class="active"' : '') !!}>
        +                           <a href="{{ route('components.create') }}">
                                    <i class="fa fa-hdd-o"></i>
                                    @lang('general.component')</a>
                                </li>
        @@ -252,7 +257,7 @@
                               @for($i=0; count($alert_items) > $i; $i++)
         
                                 <li><!-- Task item -->
        -                          <a href="{{ config('app.url') }}/admin/{{ $alert_items[$i]['type'] }}/{{ $alert_items[$i]['id'] }}/view">
        +                          <a href="{{route($alert_items[$i]['type'].'.show', $alert_items[$i]['id'])}}">
                                     <h3>{{ $alert_items[$i]['name'] }}
                                       <small class="pull-right">
                                         {{ $alert_items[$i]['remaining'] }} remaining
        @@ -278,10 +283,11 @@
         
         
                        <!-- User Account: style can be found in dropdown.less -->
        +               @if (Auth::check())
                        <li class="dropdown user user-menu">
                          <a href="#" class="dropdown-toggle" data-toggle="dropdown">
        -                   @if (Auth::user()->gravatar())
        -                       <img src="{{ Auth::user()->gravatar() }}" class="user-image" alt="User Image">
        +                   @if (Auth::user()->present()->gravatar())
        +                       <img src="{{ Auth::user()->present()->gravatar() }}" class="user-image" alt="User Image">
                            @else
                               <i class="fa fa-user fa-fws"></i>
                            @endif
        @@ -293,11 +299,27 @@
                              <li {!! (Request::is('account/profile') ? ' class="active"' : '') !!}>
                                <a href="{{ route('view-assets') }}">
                                      <i class="fa fa-check fa-fw"></i> @lang('general.viewassets')
        -                       </a>
        +                       </a></li>
        +                     <li>
                                   <a href="{{ route('profile') }}">
                                      <i class="fa fa-user fa-fw"></i> @lang('general.editprofile')
                                  </a>
                              </li>
        +                     <li>
        +                         <a href="{{ route('account.password.index') }}">
        +                             <i class="fa fa-asterisk"></i> @lang('general.changepassword')
        +                         </a>
        +                     </li>
        +
        +
        +
        +                     @can('self.api')
        +                     <li>
        +                         <a href="{{ route('user.api') }}">
        +                             <i class="fa fa-user-secret fa-fw"></i> Manage API Keys
        +                         </a>
        +                     </li>
        +                     @endcan
                              <li class="divider"></li>
                              <li>
                                  <a href="{{ url('/logout') }}">
        @@ -307,77 +329,14 @@
                              </li>
                          </ul>
                        </li>
        +               @endif
         
         
                        @can('superadmin')
        -               <li class="dropdown">
        -                   <a href="#" class="dropdown-toggle" data-toggle="dropdown">
        -                       <i class="fa fa-wrench fa-fw"></i> @lang('general.admin')
        -                       <b class="caret"></b>
        +               <li>
        +                   <a href="{{ route('settings.index') }}">
        +                       <i class="fa fa-cogs fa-fw"></i>
                            </a>
        -                   <ul class="dropdown-menu">
        -                       <li {!! (Request::is('admin/settings/companies*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/companies') }}">
        -                               <i class="fa fa-building-o fa-fw"></i> @lang('general.companies')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('hardware/models*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('hardware/models') }}">
        -                               <i class="fa fa-th fa-fw"></i> @lang('general.asset_models')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/settings/categories*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/categories') }}">
        -                               <i class="fa fa-check fa-fw"></i> @lang('general.categories')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/settings/manufacturers*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/manufacturers') }}">
        -                               <i class="fa fa-briefcase fa-fw"></i> @lang('general.manufacturers')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/settings/suppliers*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/suppliers') }}">
        -                               <i class="fa fa-credit-card fa-fw"></i> @lang('general.suppliers')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/settings/statuslabels*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/statuslabels') }}">
        -                               <i class="fa fa-list fa-fw"></i> @lang('general.status_labels')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/settings/depreciations*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/depreciations') }}">
        -                               <i class="fa fa-arrow-down fa-fw"></i> @lang('general.depreciation')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/settings/locations*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/locations') }}">
        -                               <i class="fa fa-globe fa-fw"></i> @lang('general.locations')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/groups*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/groups') }}">
        -                               <i class="fa fa-group fa-fw"></i> @lang('general.groups')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/settings/backups*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ URL::to('admin/settings/backups') }}">
        -                               <i class="fa fa-download fa-fw"></i> @lang('admin/settings/general.backups')
        -                           </a>
        -                       </li>
        -                       <li {!! (Request::is('admin/custom_fields*') ? ' class="active"' : '') !!}>
        -                           <a href="{{ route('admin.custom_fields.index') }}">
        -                               <i class="fa fa-wrench fa-fw"></i> @lang('admin/custom_fields/general.custom_fields')
        -                           </a>
        -                       </li>
        -                       <li class="divider"></li>
        -                       <li>
        -                           <a href="{{ route('app') }}">
        -                               <i class="fa fa-cog fa-fw"></i> @lang('general.settings')
        -                           </a>
        -                       </li>
        -                   </ul>
                        </li>
                        @endcan
                     </ul>
        @@ -389,7 +348,7 @@
               </a>
                <!-- Sidebar toggle button-->
               </header>
        -     
        +
               <!-- Left side column. contains the logo and sidebar -->
               <aside class="main-sidebar">
                 <!-- sidebar: style can be found in sidebar.less -->
        @@ -403,7 +362,7 @@
                       </a>
                     </li>
                     @endcan
        -            @can('assets.view')
        +            @can('index', \App\Models\Asset::class)
                     <li class="treeview{{ (Request::is('hardware*') ? ' active' : '') }}">
                         <a href="#"><i class="fa fa-barcode"></i>
                           <span>{{ trans('general.assets') }}</span>
        @@ -411,114 +370,193 @@
                         </a>
                         <ul class="treeview-menu">
                           <li>
        -                    <a href="{{ URL::to('hardware') }}">@lang('general.list_all')</a>
        +                    <a href="{{ url('hardware') }}">@lang('general.list_all')</a>
                           </li>
         
        -                    <?php $status_navs = \App\Models\Statuslabel::where('show_in_nav','=',1)->get(); ?>
        +                    <?php $status_navs = \App\Models\Statuslabel::where('show_in_nav', '=', 1)->get(); ?>
                             @if (count($status_navs) > 0)
                                 <li class="divider">&nbsp;</li>
                                 @foreach ($status_navs as $status_nav)
        -                            <li><a href="{{ URL::to('hardware?status_id='.$status_nav->id) }}"}> {{ $status_nav->name }}</a></li>
        +                            <li><a href="{{ route('statuslabels.show', ['id' => $status_nav->id]) }}"}> {{ $status_nav->name }}</a></li>
                                 @endforeach
                             @endif
         
         
                           <li{!! (Request::query('status') == 'Deployed' ? ' class="active"' : '') !!}>
        -                    <a href="{{ URL::to('hardware?status=Deployed') }}">@lang('general.deployed')
        +                    <a href="{{ url('hardware?status=Deployed') }}"><i class="fa fa-circle-o text-blue"></i>@lang('general.deployed')
                             </a>
                           </li>
                           <li{!! (Request::query('status') == 'RTD' ? ' class="active"' : '') !!}>
        -                    <a href="{{ URL::to('hardware?status=RTD') }}">
        +                    <a href="{{ url('hardware?status=RTD') }}">
        +                        <i class="fa fa-circle-o text-green"></i>
                             @lang('general.ready_to_deploy')</a>
                           </li>
        -                  <li{!! (Request::query('status') == 'Pending' ? ' class="active"' : '') !!}><a href="{{ URL::to('hardware?status=Pending') }}">@lang('general.pending')</a></li>
        -                  <li{!! (Request::query('status') == 'Undeployable' ? ' class="active"' : '') !!} ><a href="{{ URL::to('hardware?status=Undeployable') }}">@lang('general.undeployable')</a></li>
        -                  <li{!! (Request::query('status') == 'Archived' ? ' class="active"' : '') !!}><a href="{{ URL::to('hardware?status=Archived') }}">@lang('admin/hardware/general.archived')</a></li>
        -                    <li{!! (Request::query('status') == 'Requestable' ? ' class="active"' : '') !!}><a href="{{ URL::to('hardware?status=Requestable') }}">@lang('admin/hardware/general.requestable')</a></li>
        +                  <li{!! (Request::query('status') == 'Pending' ? ' class="active"' : '') !!}><a href="{{ url('hardware?status=Pending') }}"><i class="fa fa-circle-o text-orange"></i>@lang('general.pending')</a></li>
        +                  <li{!! (Request::query('status') == 'Undeployable' ? ' class="active"' : '') !!} ><a href="{{ url('hardware?status=Undeployable') }}"><i class="fa fa-times text-red"></i>@lang('general.undeployable')</a></li>
        +                  <li{!! (Request::query('status') == 'Archived' ? ' class="active"' : '') !!}><a href="{{ url('hardware?status=Archived') }}"><i class="fa fa-times text-red"></i>@lang('admin/hardware/general.archived')</a></li>
        +                    <li{!! (Request::query('status') == 'Requestable' ? ' class="active"' : '') !!}><a href="{{ url('hardware?status=Requestable') }}"><i class="fa fa-check text-blue"></i> @lang('admin/hardware/general.requestable')</a></li>
         
                           <li class="divider">&nbsp;</li>
        -                    @can('assets.checkout')
        +                    @can('checkout', \App\Models\Asset::class)
                             <li{!! (Request::is('hardware/bulkcheckout') ? ' class="active>"' : '') !!}>
                                 <a href="{{ route('hardware/bulkcheckout') }}">
                                     {{ trans('general.bulk_checkout') }}</a>
                             </li>
                             @endcan
        -
        -                    @can('superuser')
        -                    <li{!! (Request::is('hardware/models*') ? ' class="active"' : '') !!}><a href="{{ URL::to('hardware/models') }}">@lang('general.asset_models')</a></li>
        -                  <li><a href="{{ URL::to('admin/settings/categories') }}" {!! (Request::is('admin/settings/categories*') ? ' class="active"' : '') !!} >@lang('general.categories')</a></li>
        +                    @can('view', \App\Models\Assetmodel::class)
        +                    <li{!! (Request::is('hardware/models*') ? ' class="active"' : '') !!}><a href="{{ route('models.index') }}">@lang('general.asset_models')</a></li>
                             @endcan
        -                    @can('assets.create')
        -                      <li{!! (Request::query('Deleted') ? ' class="active"' : '') !!}><a href="{{ URL::to('hardware?status=Deleted') }}">@lang('general.deleted')</a></li>
        -                      <li><a href="{{ URL::to('admin/asset_maintenances') }}"  >@lang('general.asset_maintenances') </a></li>
        -                      <li><a href="{{ URL::to('hardware/import') }}">@lang('general.import') </a></li>
        -                      <li><a href="{{ URL::to('hardware/history') }}">@lang('general.import-history') </a></li>
        +                    @can('view', \App\Models\Category::class)
        +                  <li><a href="{{ url('categories') }}" {!! (Request::is('settings/categories*') ? ' class="active"' : '') !!} >@lang('general.categories')</a></li>
        +                    @endcan
        +                    @can('create', \App\Models\Asset::class)
        +                      <li{!! (Request::query('Deleted') ? ' class="active"' : '') !!}><a href="{{ url('hardware?status=Deleted') }}">@lang('general.deleted')</a></li>
        +                      <li><a href="{{ route('maintenances.index') }}">@lang('general.asset_maintenances') </a></li>
        +                      <li><a href="{{ url('hardware/history') }}">@lang('general.import-history') </a></li>
        +                    @endcan
        +                    @can('audit', \App\Models\Asset::class)
        +                        <li><a href="{{ route('assets.bulkaudit') }}">@lang('general.bulkaudit') </a></li>
                             @endcan
                         </ul>
                       </li>
                       @endcan
        -              @can('licenses.view')
        -              <li{!! (Request::is('admin/licenses*') ? ' class="active"' : '') !!}>
        -                  <a href="{{ URL::to('admin/licenses') }}">
        +              @can('view', \App\Models\License::class)
        +              <li{!! (Request::is('licenses*') ? ' class="active"' : '') !!}>
        +                  <a href="{{ route('licenses.index') }}">
                             <i class="fa fa-floppy-o"></i>
                             <span>@lang('general.licenses')</span>
                           </a>
                       </li>
                       @endcan
        -              @can('accessories.view')
        -              <li{!! (Request::is('admin/accessories*') ? ' class="active"' : '') !!}>
        -                <a href="{{ URL::to('admin/accessories') }}">
        +              @can('index', \App\Models\Accessory::class)
        +              <li{!! (Request::is('accessories*') ? ' class="active"' : '') !!}>
        +                <a href="{{ route('accessories.index') }}">
                           <i class="fa fa-keyboard-o"></i>
                           <span>@lang('general.accessories')</span>
                         </a>
                       </li>
                       @endcan
        -              @can('consumables.view')
        -            <li{!! (Request::is('admin/consumables*') ? ' class="active"' : '') !!}>
        -                <a href="{{ URL::to('admin/consumables') }}">
        +              @can('index', \App\Models\Consumable::class)
        +            <li{!! (Request::is('consunmables*') ? ' class="active"' : '') !!}>
        +                <a href="{{ url('consumables') }}">
                           <i class="fa fa-tint"></i>
                           <span>@lang('general.consumables')</span>
                         </a>
                     </li>
                      @endcan
        -             @can('components.view')
        -            <li{!! (Request::is('admin/components*') ? ' class="active"' : '') !!}>
        -                <a href="{{ URL::to('admin/components') }}">
        +             @can('view', \App\Models\Components::class)
        +            <li{!! (Request::is('components*') ? ' class="active"' : '') !!}>
        +                <a href="{{ route('components.index') }}">
                           <i class="fa fa-hdd-o"></i>
                           <span>@lang('general.components')</span>
                         </a>
                     </li>
                     @endcan
        -            @can('users.view')
        -            <li{!! (Request::is('admin/users*') ? ' class="active"' : '') !!}>
        -                  <a href="{{ URL::to('admin/users') }}">
        +            @can('view', \App\Models\User::class)
        +            <li{!! (Request::is('users*') ? ' class="active"' : '') !!}>
        +                  <a href="{{ route('users.index') }}">
                               <i class="fa fa-users"></i>
                               <span>@lang('general.people')</span>
                           </a>
                     </li>
                     @endcan
        +            @can('create', \App\Models\Asset::class)
        +                <li{!! (Request::is('import/*') ? ' class="active"' : '') !!}>
        +                    <a href="{{ route('imports.index') }}">
        +                        <i class="fa fa-cloud-download"></i>
        +                        <span>@lang('general.import')</span>
        +                    </a>
        +                </li>
        +            @endcan
        +
        +            @can('manage', \App\Models\Setting::class)
        +                <li>
        +                    <a href="#">
        +                        <i class="fa fa-gear"></i>
        +                        <span>@lang('general.settings')</span>
        +                        <i class="fa fa-angle-left pull-right"></i>
        +                    </a>
        +
        +                    <ul class="treeview-menu">
        +                        @can('view', \App\Models\Customfield::class)
        +                            <li {!! (Request::is('custom_fields*') ? ' class="active"' : '') !!}>
        +                                <a href="{{ route('fields.index') }}">
        +                                    {{ trans('admin/custom_fields/general.custom_fields') }}
        +                                </a>
        +                            </li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\Statuslabel::class)
        +                            <li {!! (Request::is('statuslabels*') ? ' class="active"' : '') !!}>
        +                                <a href="{{ route('statuslabels.index') }}">
        +                                    {{ trans('general.status_labels') }}
        +                                </a>
        +                            </li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\AssetModel::class)
        +                            <li><a href="{{ route('models.index') }}" {{ (Request::is('/assetmodels') ? ' class="active"' : '') }} >@lang('general.asset_models')</a></li>
        +                        @endcan
        +
        +
        +                        @can('view', \App\Models\Category::class)
        +                            <li><a href="{{ route('categories.index') }}" {{ (Request::is('/categories') ? ' class="active"' : '') }} >@lang('general.categories')</a></li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\Manufacturer::class)
        +                            <li><a href="{{ route('manufacturers.index') }}" {{ (Request::is('/manufacturers') ? ' class="active"' : '') }} >@lang('general.manufacturers')</a></li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\Supplier::class)
        +                            <li><a href="{{ route('suppliers.index') }}" {{ (Request::is('/suppliers') ? ' class="active"' : '') }} >@lang('general.suppliers')</a></li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\Department::class)
        +                            <li><a href="{{ route('departments.index') }}" {{ (Request::is('/departments') ? ' class="active"' : '') }} >@lang('general.departments')</a></li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\Location::class)
        +                            <li><a href="{{ route('locations.index') }}" {{ (Request::is('/locations') ? ' class="active"' : '') }} >@lang('general.locations')</a></li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\Company::class)
        +                            <li><a href="{{ route('companies.index') }}" {{ (Request::is('/companies') ? ' class="active"' : '') }} >@lang('general.companies')</a></li>
        +                        @endcan
        +
        +                        @can('view', \App\Models\Depreciation::class)
        +                            <li><a href="{{ route('depreciations.index') }}" {{ (Request::is('/depreciations') ? ' class="active"' : '') }} >@lang('general.depreciation')</a></li>
        +                        @endcan
        +
        +                    </ul>
        +
        +                </li>
        +            @endcan
        +
                     @can('reports.view')
                     <li class="treeview{{ (Request::is('reports*') ? ' active' : '') }}">
        -                <a href="{{ URL::to('reports') }}"  class="dropdown-toggle">
        +                <a href="{{ url('reports') }}"  class="dropdown-toggle">
                             <i class="fa fa-bar-chart"></i>
                             <span>@lang('general.reports')</span>
                             <i class="fa fa-angle-left pull-right"></i>
                         </a>
         
                         <ul class="treeview-menu">
        -	                 <li><a href="{{ URL::to('reports/activity') }}" {{ (Request::is('reports/activity') ? ' class="active"' : '') }} >@lang('general.activity_report')</a></li>
        +	                 <li><a href="{{ route('reports.activity') }}" {{ (Request::is('reports/activity') ? ' class="active"' : '') }} >@lang('general.activity_report')</a></li>
         
        -                    <li><a href="{{ URL::to('reports/depreciation') }}" {{ (Request::is('reports/depreciation') ? ' class="active"' : '') }} >@lang('general.depreciation_report')</a></li>
        -                    <li><a href="{{ URL::to('reports/licenses') }}" {{ (Request::is('reports/licenses') ? ' class="active"' : '') }} >@lang('general.license_report')</a></li>
        -                    <li><a href="{{ URL::to('reports/asset_maintenances') }}" {{ (Request::is('reports/asset_maintenances') ? ' class="active"' : '') }} >@lang('general.asset_maintenance_report')</a></li>
        -                    <li><a href="{{ URL::to('reports/assets') }}" {{ (Request::is('reports/assets') ? ' class="active"' : '') }} >@lang('general.asset_report')</a></li>
        -                    <li><a href="{{ URL::to('reports/unaccepted_assets') }}" {{ (Request::is('reports/unaccepted_assets') ? ' class="active"' : '') }} >@lang('general.unaccepted_asset_report')</a></li>
        -                    <li><a href="{{ URL::to('reports/accessories') }}" {{ (Request::is('reports/accessories') ? ' class="active"' : '') }} >@lang('general.accessory_report')</a></li>
        -                    <li><a href="{{ URL::to('reports/custom') }}" {{ (Request::is('reports/custom') ? ' class="active"' : '') }}>@lang('general.custom_report')</a></li>
        +                    <li><a href="{{ route('reports.audit') }}" {{ (Request::is('reports.audit') ? ' class="active"' : '') }} >@lang('general.audit_report')</a></li>
        +
        +
        +                    <li><a href="{{ url('reports/depreciation') }}" {{ (Request::is('reports/depreciation') ? ' class="active"' : '') }}>@lang('general.depreciation_report')</a></li>
        +                    <li><a href="{{ url('reports/licenses') }}" {{ (Request::is('reports/licenses') ? ' class="active"' : '') }}>@lang('general.license_report')</a></li>
        +                    <li><a href="{{ url('reports/asset_maintenances') }}" {{ (Request::is('reports/asset_maintenances') ? ' class="active"' : '') }} >@lang('general.asset_maintenance_report')</a></li>
        +                    <li><a href="{{ url('reports/unaccepted_assets') }}" {{ (Request::is('reports/unaccepted_assets') ? ' class="active"' : '') }} >@lang('general.unaccepted_asset_report')</a></li>
        +                    <li><a href="{{ url('reports/accessories') }}" {{ (Request::is('reports/accessories') ? ' class="active"' : '') }}>@lang('general.accessory_report')</a></li>
        +                    <li><a href="{{ url('reports/custom') }}" {{ (Request::is('reports/custom') ? ' class="active"' : '') }}>@lang('general.custom_report')</a></li>
                         </ul>
                     </li>
                     @endcan
        -            @can('assets.view.requestable')
        +
        +            @can('viewRequestable', \App\Models\Asset::class)
                     <li{!! (Request::is('account/requestable-assets') ? ' class="active"' : '') !!}>
                     <a href="{{ route('requestable-assets') }}">
                     <i class="fa fa-laptop"></i>
        @@ -537,7 +575,7 @@
         
                   @if ($debug_in_production)
                       <div class="row" style="margin-bottom: 0px; background-color: red; color: white; font-size: 15px;">
        -                  <div class="col-md-12" style="margin-bottom: 0px; background-color: red; color: white; padding: 10px 20px 10px 30px; font-size: 16px;">
        +                  <div class="col-md-12" style="margin-bottom: 0px; background-color: #b50408 ; color: white; padding: 10px 20px 10px 30px; font-size: 16px;">
                               <i class="fa fa-warning fa-3x pull-left"></i> <strong>{{ strtoupper(trans('general.debug_warning')) }}:</strong>
                               {!! trans('general.debug_warning_text') !!}
                           </div>
        @@ -576,21 +614,22 @@
         
         
                   <!-- Content -->
        +            <div id="{!! (Request::is('*api*') ? 'app' : 'webui') !!}">
                   @yield('content')
        +            </div>
         
                 </section>
         
               </div><!-- /.content-wrapper -->
         
        -      <footer class="main-footer">
        +      <footer class="main-footer hidden-print">
                 <div class="pull-right hidden-xs">
                   <b>Version</b> {{ config('version.app_version') }}  build {{ config('version.build_version') }} ({{ config('version.hash_version') }})
        -          <a target="_blank" class="btn btn-default btn-xs" href="https://snipe-it.readme.io">Documentation</a>
        -          <a target="_blank" class="btn btn-default btn-xs" href="https://snipe-it-manual.readme.io">User's Manual</a>
        +          <a target="_blank" class="btn btn-default btn-xs" href="https://snipe-it.readme.io/docs/overview">User's Manual</a>
                   <a target="_blank" class="btn btn-default btn-xs" href="https://snipeitapp.com/support/">Report a Bug</a>
                 </div>
                 <a target="_blank" href="https://snipeitapp.com">Snipe-IT</a> is an open source
        -        project, made with <i class="fa fa-heart" style="color: #a94442; font-size: 10px"></i> by <a href="https://twitter.com/snipeyhead">@snipeyhead</a>.
        +          project, made with <i class="fa fa-heart" style="color: #a94442; font-size: 10px"></i> by <a href="https://twitter.com/snipeyhead">@snipeyhead</a> under the <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">AGPL3 license</a>.
               </footer>
         
         
        @@ -609,71 +648,47 @@
                         </div>
                         <div class="modal-body"></div>
                         <div class="modal-footer">
        -                    <button type="button" class="btn btn-default  pull-left" data-dismiss="modal">Close</button>
        -                    <a class="btn btn-outline" id="dataConfirmOK">@lang('general.yes')</a>
        +                <form method="post" id="deleteForm" role="form">
        +                    {{ csrf_field() }}
        +                    {{ method_field('DELETE') }}
        +
        +                    <button type="button" class="btn btn-default  pull-left" data-dismiss="modal">{{ trans('general.cancel') }}</button>
        +                    <button type="submit" class="btn btn-outline" id="dataConfirmOK">{{ trans('general.yes') }}</button>
        +                </form>
                         </div>
                     </div>
                 </div>
             </div>
         
         
        -    <script src="{{ asset(elixir('assets/js/all.js')) }}"></script>
         
        +    <script src="{{ mix('js/dist/all.js') }}"></script>
             <script>
        -       $(function () {
        -         //Initialize Select2 Elements
        -         var iOS = /iPhone|iPad|iPod/.test(navigator.userAgent)  && !window.MSStream;
        -         if(!iOS)
        -         {
        -          $(".select2").select2();
        -         }
        -         $('.datepicker').datepicker();
        -       });
        +        $(function () {
        +            var datepicker = $.fn.datepicker.noConflict(); // return $.fn.datepicker to previously assigned value
        +            $.fn.bootstrapDP = datepicker;
        +            $('.datepicker').datepicker();
        +        })
         
        -       //Flat blue color scheme for iCheck
        -        $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({
        -          checkboxClass: 'icheckbox_minimal-blue',
        -          radioClass: 'iradio_minimal-blue'
        -        });
        -     </script>
        +    </script>
         
        -     <script type="text/javascript">
        -     $(document).ready(function () {
         
        -         $('.slideout-menu-toggle').on('click', function(event){
        -           console.log('clicked');
        -         	event.preventDefault();
        -         	// create menu variables
        -         	var slideoutMenu = $('.slideout-menu');
        -         	var slideoutMenuWidth = $('.slideout-menu').width();
        -
        -         	// toggle open class
        -         	slideoutMenu.toggleClass("open");
        -
        -         	// slide menu
        -         	if (slideoutMenu.hasClass("open")) {
        -             slideoutMenu.show();
        -     	    	slideoutMenu.animate({
        -     		    	right: "0px"
        -     	    	});
        -         	} else {
        -     	    	slideoutMenu.animate({
        -     		    	right: -slideoutMenuWidth
        -     	    	}, "-350px");
        -             slideoutMenu.fadeOut();
        -         	}
        -         });
        -     });
        -     </script>
         
         
             @section('moar_scripts')
             @show
        +
        +    <script>
        +        $(function () {
        +            $('[data-toggle="tooltip"]').tooltip();
        +        })
        +    </script>
        +
             @if ((Session::get('topsearch')=='true') || (Request::is('/')))
             <script>
                  $("#tagSearch").focus();
             </script>
        -        @endif
        +    @endif
         
           </body>
         </html>
        diff --git a/resources/views/layouts/edit-form.blade.php b/resources/views/layouts/edit-form.blade.php
        index 711d9b9364..75b1427e1d 100644
        --- a/resources/views/layouts/edit-form.blade.php
        +++ b/resources/views/layouts/edit-form.blade.php
        @@ -30,13 +30,21 @@
                     {{ $item->display_name }}
                     @endif
                     </h3>
        -            <div class="box-tools pull-right">
        -                <button class="slideout-menu-toggle btn btn-box-tool btn-box-tool-lg" data-toggle="tooltip" title="Help"><i class="fa fa-question"></i></button>
        -            </div>
        +                @if (isset($helpText))
        +                    <div class="box-tools pull-right">
        +                        <button class="slideout-menu-toggle btn btn-box-tool btn-box-tool-lg" data-toggle="tooltip" title="Help"><i class="fa fa-question"></i></button>
        +                    </div>
        +                @endif
                     </div><!-- /.box-header -->
         
                     <div class="box-body">
        -                <form id="create-form" class="form-horizontal" method="post" action="{{ \Request::url() }}" autocomplete="off" role="form" enctype="multipart/form-data">
        +                <form id="create-form" class="form-horizontal" method="post" action="{{ (isset($formAction)) ? $formAction : \Request::url()  }}" autocomplete="off" role="form" enctype="multipart/form-data">
        +
        +                    @if ($item->id)
        +                    {{ method_field('PUT') }}
        +                    @endif
        +
        +
                             <!-- CSRF Token -->
                             {{ csrf_field() }}
                             @yield('inputFields')
        @@ -45,6 +53,8 @@
                     </div>
                 </div>
             </div>
        +
        +    @if ((isset($helpText)) && (isset($helpTitle)))
             <div class="slideout-menu">
                 <a href="#" class="slideout-menu-toggle pull-right">×</a>
                 <h3>
        @@ -52,6 +62,7 @@
                 </h3>
                 <p>{{ $helpText }} </p>
             </div>
        +    @endif
         </div>
         
         @stop
        diff --git a/resources/views/layouts/setup.blade.php b/resources/views/layouts/setup.blade.php
        index 1c9178931a..dff33c8a5b 100644
        --- a/resources/views/layouts/setup.blade.php
        +++ b/resources/views/layouts/setup.blade.php
        @@ -7,15 +7,7 @@
                 @show
               </title>
         
        -         <!-- CSS -->
        -          <link rel="stylesheet" href="{{ asset('assets/css/bootstrap.min.css') }}">
        -          <!-- Font Awesome -->
        -          <link rel="stylesheet" href="{{ asset('assets/css/font-awesome.min.css') }}">
        -          <!-- Theme style -->
        -          <link rel="stylesheet" href="{{ asset('assets/css/AdminLTE.min.css') }}">
        -          <link rel="stylesheet" href="{{ asset('assets/css/skins/skin-blue.css') }}">
        -        <link rel="stylesheet" href="{{ asset('assets/js/plugins/select2/select2.min.css') }}">
        -          <link rel="stylesheet" href="{{ elixir('assets/css/app.css') }}">
        +        <link rel="stylesheet" href="{{ mix('css/dist/all.css') }}">
         
         
         
        @@ -126,7 +118,7 @@
                           </div>
                       </div>
                   </div>
        -          <script src="{{ asset(elixir('assets/js/all.js')) }}"></script>
        +          <script src="{{ asset(mix('js/dist/all.js')) }}"></script>
         
                 <script>
                     $(function () {
        diff --git a/resources/views/licenses/checkin.blade.php b/resources/views/licenses/checkin.blade.php
        index 99659b915a..a04befeb76 100755
        --- a/resources/views/licenses/checkin.blade.php
        +++ b/resources/views/licenses/checkin.blade.php
        @@ -7,42 +7,35 @@
         @stop
         
         @section('header_right')
        -    <a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
        -        {{ trans('general.back') }}</a>
        +<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">{{ trans('general.back') }}</a>
         @stop
         
         {{-- Page content --}}
         @section('content')
        -
        -
        -
         <div class="row form-wrapper">
        -<!-- left column -->
        -<div class="col-md-10 column">
        -
        -@if ($backto=='user')
        -	<form class="form-horizontal" method="post" action="{{ route('checkin/license', array('licenseeat_id'=> $licenseseat->id, 'backto'=>'user')) }}" autocomplete="off">
        -@else
        -	<form class="form-horizontal" method="post" action="{{ route('checkin/license', $licenseseat->id) }}" autocomplete="off">
        -@endif
        -
        -    <!-- CSRF Token -->
        -    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +    <!-- left column -->
        +    <div class="col-md-10 column">
         
        +        @if ($backto=='user')
        +        <form class="form-horizontal" method="post" action="{{ route('licenses.checkin', array('licenseeat_id'=> $licenseseat->id, 'backto'=>'user')) }}" autocomplete="off">
        +        @else
        +        <form class="form-horizontal" method="post" action="{{ route('licenses.checkin', $licenseseat->id) }}" autocomplete="off">
        +        @endif
        +        {{csrf_field()}}
         
                     <!-- Asset name -->
                     <div class="form-group">
        -            <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
        +                <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
                         <div class="col-md-6">
        -                  <p class="form-control-static">{{ $licenseseat->license->name }}</p>
        +                    <p class="form-control-static">{{ $licenseseat->license->name }}</p>
                         </div>
                     </div>
         
                     <!-- Serial -->
                     <div class="form-group">
        -            <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label>
        +                <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label>
                         <div class="col-md-6">
        -                  <p class="form-control-static">{{ $licenseseat->license->serial }}</p>
        +                    <p class="form-control-static">{{ $licenseseat->license->serial }}</p>
                         </div>
                     </div>
         
        @@ -55,17 +48,15 @@
                         </div>
                     </div>
                     <!-- Form actions -->
        -                <div class="form-group">
        +            <div class="form-group">
                         <label class="col-md-2 control-label"></label>
        -                    <div class="col-md-7">
        -                        <a class="btn btn-link" href="{{ route('licenses') }}">{{ trans('button.cancel') }}</a>
        -                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.checkin') }}</button>
        -                    </div>
        +                <div class="col-md-7">
        +                    <a class="btn btn-link" href="{{ route('licenses.index') }}">{{ trans('button.cancel') }}</a>
        +                    <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.checkin') }}</button>
                         </div>
        -
        -
        -</form>
        -</div>
        +            </div>
        +        </form>
        +    </div> <!-- .col-md-10-->
         </div>
         
         @stop
        diff --git a/resources/views/licenses/checkout.blade.php b/resources/views/licenses/checkout.blade.php
        index 0c157e65e3..901cb1b632 100755
        --- a/resources/views/licenses/checkout.blade.php
        +++ b/resources/views/licenses/checkout.blade.php
        @@ -13,86 +13,76 @@
         
         {{-- Page content --}}
         @section('content')
        -
        -
        -
        -    <div class="row">
        -
        +<div class="row">
                 <!-- left column -->
        -        <div class="col-md-7">
        -
        -            <form class="form-horizontal" method="post" action="" autocomplete="off">
        -                <!-- CSRF Token -->
        -                <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +    <div class="col-md-7">
        +        <form class="form-horizontal" method="post" action="" autocomplete="off">
        +            {{csrf_field()}}
         
                     <div class="box box-default">
                         <div class="box-header with-border">
        -                    <h3 class="box-title"> {{ $licenseseat->license->name }}</h3>
        +                    <h3 class="box-title"> {{ $licenseSeat->license->name }}</h3>
                         </div>
                         <div class="box-body">
         
        +                    <!-- Asset name -->
        +                    <div class="form-group">
        +                        <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
        +                        <div class="col-md-6">
        +                            <p class="form-control-static">{{ $licenseSeat->license->name }}</p>
        +                        </div>
        +                    </div>
         
        +                    <!-- Serial -->
        +                    <div class="form-group">
        +                        <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label>
        +                        <div class="col-md-10">
        +                            <p class="form-control-static" style="word-wrap: break-word;">{{ $licenseSeat->license->serial }}</p>
        +                        </div>
        +                    </div>
         
        -                            <!-- Asset name -->
        -                            <div class="form-group">
        -                            <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
        -                                <div class="col-md-6">
        -                                  <p class="form-control-static">{{ $licenseseat->license->name }}</p>
        -                                </div>
        -                            </div>
        +                    <!-- Asset -->
        +                    <div class="form-group {{ $errors->has('asset_id') ? ' has-error' : '' }}">
        +                        <label for="asset_id" class="col-md-2 control-label">{{ trans('admin/licenses/form.asset') }}
        +                         </label>
         
        -                            <!-- Serial -->
        -                            <div class="form-group">
        -                            <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label>
        -                                <div class="col-md-10">
        -                                  <p class="form-control-static" style="word-wrap: break-word;">{{ $licenseseat->license->serial }}</p>
        -                                </div>
        -                            </div>
        +                        <div class="col-md-10">
        +                            {{ Form::select('asset_id', $asset_list , Input::old('asset_id', $licenseSeat->asset_id), array('class'=>'select2', 'style'=>'min-width:600px')) }}
        +                            {!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                        </div>
        +                    </div>
         
        -                            <!-- Asset -->
        -                            <div class="form-group {{ $errors->has('asset_id') ? ' has-error' : '' }}">
        -                                <label for="asset_id" class="col-md-2 control-label">{{ trans('admin/licenses/form.asset') }}
        -                                 </label>
        +                    <!-- User -->
        +                    <div class="form-group {{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        +                        <label for="assigned_to" class="col-md-2 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        +                        </label>
         
        -                                <div class="col-md-10">
        -                                    {{ Form::select('asset_id', $asset_list , Input::old('asset_id', $licenseseat->asset_id), array('class'=>'select2', 'style'=>'min-width:600px')) }}
        -                                    {!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                                </div>
        -                            </div>
        +                        <div class="col-md-9">
        +                            {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $licenseSeat->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }}
        +                            {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
         
        +                            <p class="help-block">
        +                            {{ trans('admin/licenses/form.checkout_help') }}
        +                            </p>
        +                        </div>
        +                    </div>
         
        -                            <!-- User -->
        -                            <div class="form-group {{ $errors->has('assigned_to') ? ' has-error' : '' }}">
        -                                <label for="assigned_to" class="col-md-2 control-label">{{ trans('admin/hardware/form.checkout_to') }}
        -                                </label>
        -
        -                                <div class="col-md-9">
        -                                    {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $licenseseat->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }}
        -                                    {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -
        -                                    <p class="help-block">
        -                                    {{ trans('admin/licenses/form.checkout_help') }}
        -                                    </p>
        -
        -                                </div>
        -                            </div>
        -
        -
        -                            <!-- Note -->
        -                            <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        -                                <label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label>
        -                                <div class="col-md-7">
        -                                    <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $licenseseat->note) }}</textarea>
        -                                    {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                                </div>
        -                            </div>
        +                    <!-- Note -->
        +                    <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
        +                        <label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label>
        +                        <div class="col-md-7">
        +                            <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $licenseSeat->note) }}</textarea>
        +                            {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                        </div>
        +                    </div>
                         </div>
                         <div class="box-footer">
        -                    <a class="btn btn-link" href="{{ route('licenses') }}">{{ trans('button.cancel') }}</a>
        +                    <a class="btn btn-link" href="{{ route('licenses.index') }}">{{ trans('button.cancel') }}</a>
                             <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.checkout') }}</button>
                         </div>
        -         </form>
        -</div>
        +            </div> <!-- /.box-->
        +        </form>
        +    </div> <!-- /.col-md-7-->
         </div>
         
         @stop
        diff --git a/resources/views/licenses/edit.blade.php b/resources/views/licenses/edit.blade.php
        index 428c142349..0e3a8279d2 100755
        --- a/resources/views/licenses/edit.blade.php
        +++ b/resources/views/licenses/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/licenses/form.create') ,
             'updateText' => trans('admin/licenses/form.update'),
             'helpTitle' => trans('admin/licenses/general.about_licenses_title'),
        -    'helpText' => trans('admin/licenses/general.about_licenses_text')
        +    'helpText' => trans('admin/licenses/general.about_licenses_text'),
        +    'formAction' => ($item) ? route('licenses.update', ['license' => $item->id]) : route('license.store'),
         ])
         
         {{-- Page content --}}
        @@ -68,27 +69,26 @@
         <!-- Expiration Date -->
         <div class="form-group {{ $errors->has('expiration_date') ? ' has-error' : '' }}">
             <label for="expiration_date" class="col-md-3 control-label">{{ trans('admin/licenses/form.expiration') }}</label>
        -    <div class="input-group col-md-3">
        -        <div class="input-group">
        -            <input type="text" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="yyyy-mm-dd" name="expiration_date" id="expiration_date" value="{{ Input::old('expiration_date', $item->expiration_date) }}">
        -            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -        </div><!-- /.input group -->
         
        +    <div class="input-group col-md-3">
        +        <div class="input-group date" data-provide="datepicker" data-date-format="yyyy-mm-dd"  data-autoclose="true">
        +            <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="expiration_date" id="expiration_date" value="{{ Input::old('expiration_date', $item->expiration_date) }}">
        +            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        +        </div>
                 {!! $errors->first('expiration_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
             </div>
        +
         </div>
         
         <!-- Termination Date -->
         <div class="form-group {{ $errors->has('termination_date') ? ' has-error' : '' }}">
             <label for="termination_date" class="col-md-3 control-label">{{ trans('admin/licenses/form.termination_date') }}</label>
        +
             <div class="input-group col-md-3">
        -        <div class="input-group">
        -
        -            <input type="text" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="yyyy-mm-dd" name="termination_date" id="termination_date" value="{{ Input::old('termination_date', $item->termination_date) }}">
        +        <div class="input-group date" data-provide="datepicker" data-date-format="yyyy-mm-dd"  data-autoclose="true">
        +            <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="termination_date" id="termination_date" value="{{ Input::old('termination_date', $item->termination_date) }}">
                     <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
        -        </div><!-- /.input group -->
        -
        -
        +        </div>
                 {!! $errors->first('termination_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
             </div>
         </div>
        diff --git a/resources/views/licenses/index.blade.php b/resources/views/licenses/index.blade.php
        index c0f8d82bab..683ca2eb15 100755
        --- a/resources/views/licenses/index.blade.php
        +++ b/resources/views/licenses/index.blade.php
        @@ -8,8 +8,8 @@
         
         
         @section('header_right')
        -@can('licenses.create')
        -    <a href="{{ route('create/licenses') }}" class="btn btn-primary pull-right">
        +@can('create', \App\Models\License::class)
        +    <a href="{{ route('licenses.create') }}" class="btn btn-primary pull-right">
               {{ trans('general.create') }}
             </a>
             @endcan
        @@ -22,49 +22,29 @@
         <div class="row">
           <div class="col-md-12">
             <div class="box">
        +      <div class="box-body">
        +        <table
        +        name="licenses"
        +        id="table"
        +        data-url="{{ route('api.licenses.index') }}"
        +        class="table table-striped snipe-table"
        +        data-cookie="true"
        +        data-click-to-select="true"
        +        data-cookie-id-table="licenseTable">
        +        </table>
        +      </div><!-- /.box-body -->
         
        -    <div class="box-body">
        -      <table
        -      name="licenses"
        -      id="table"
        -      data-url="{{route('api.licenses.list') }}"
        -      class="table table-striped snipe-table"
        -      data-cookie="true"
        -      data-click-to-select="true"
        -      data-cookie-id-table="licenseTable">
        -          <thead>
        -              <tr>
        -                  <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                  <th data-field="company" data-sortable="true" data-switchable="true">{{ trans('general.company') }}</th>
        -                  <th data-field="name" data-sortable="true">{{ trans('admin/licenses/table.title') }}</th>
        -                  <th data-field="manufacturer" data-sortable="true">{{ trans('general.manufacturer') }}</th>
        -                  <th data-field="serial" data-sortable="true" >{{ trans('admin/licenses/form.license_key') }}</th>
        -                  <th data-field="license_name" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.to_name') }}</th>
        -                  <th data-field="license_email" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.to_email') }}</th>
        -                  <th data-field="totalSeats" data-sortable="false">{{ trans('admin/licenses/form.seats') }}</th>
        -                  <th data-field="remaining" data-sortable="false">{{ trans('admin/licenses/form.remaining_seats') }}</th>
        -                  <th data-field="purchase_date" data-sortable="true">{{ trans('general.purchase_date') }}</th>
        -                  <th data-field="purchase_cost" data-sortable="true">{{ trans('general.purchase_cost') }}</th>
        -                  <th data-field="purchase_order" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.purchase_order') }}</th>
        -                  <th data-field="expiration_date" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.expiration') }}</th>
        -                  <th data-field="notes" data-sortable="true" data-visible="false">{{ trans('admin/hardware/form.notes') }}</th>
        -                  <th data-field="actions">{{ trans('table.actions') }}</th>
        -              </tr>
        -          </thead>
        -      </table>
        -    </div><!-- /.box-body -->
        -    <div class="box-footer clearfix">
        -
        -    </div>
        -  </div><!-- /.box -->
        -
        -
        -
        -
        +      <div class="box-footer clearfix">
        +      </div>
        +    </div><!-- /.box -->
           </div>
         </div>
         @stop
         
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'licenses-export', 'search' => true])
        +@include ('partials.bootstrap-table', [
        +    'exportFile' => 'licenses-export',
        +    'search' => true,
        +    'columns' => \App\Presenters\LicensePresenter::dataTableLayout()])
        +
         @stop
        diff --git a/resources/views/licenses/view.blade.php b/resources/views/licenses/view.blade.php
        index b623b8f6e1..d8745fed4d 100755
        --- a/resources/views/licenses/view.blade.php
        +++ b/resources/views/licenses/view.blade.php
        @@ -10,24 +10,21 @@
         {{-- Right header --}}
         @section('header_right')
         <div class="btn-group pull-right">
        -    @can('licenses.edit')
        -      <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        -          <span class="caret"></span>
        -      </button>
        -      <ul class="dropdown-menu">
        -          <li><a href="{{ route('update/license', $license->id) }}">{{ trans('admin/licenses/general.edit') }}</a></li>
        -          <li><a href="{{ route('clone/license', $license->id) }}">{{ trans('admin/licenses/general.clone') }}</a></li>
        -      </ul>
        -     @endcan
        -  </div>
        +  @can('update', $license)
        +    <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
        +        <span class="caret"></span>
        +    </button>
        +    <ul class="dropdown-menu">
        +        <li><a href="{{ route('licenses.edit', ['license' => $license->id]) }}">{{ trans('admin/licenses/general.edit') }}</a></li>
        +        <li><a href="{{ route('clone/license', $license->id) }}">{{ trans('admin/licenses/general.clone') }}</a></li>
        +    </ul>
        +   @endcan
        +</div>
         @stop
         
        -
         {{-- Page content --}}
         @section('content')
        -
         <div class="row">
        -
           <div class="col-md-12">
             <!-- Custom Tabs -->
             <div class="nav-tabs-custom">
        @@ -35,97 +32,85 @@
                 <li class="active"><a href="#tab_1" data-toggle="tab">Details</a></li>
                 <li><a href="#tab_2" data-toggle="tab">{{ trans('general.file_uploads') }}</a></li>
                 <li><a href="#tab_3" data-toggle="tab">{{ trans('admin/licenses/general.checkout_history') }}</a></li>
        -
                 <li class="pull-right"><a href="#" data-toggle="modal" data-target="#uploadFileModal"><i class="fa fa-paperclip"></i> {{ trans('button.upload') }}</a></li>
               </ul>
        +
               <div class="tab-content">
                 <div class="tab-pane active" id="tab_1">
        -
                   <div class="row">
                     <div class="col-md-7">
        -
                       <table class="table table-striped">
                           <thead>
        -                      <tr>
        -                          <th class="col-md-2">{{ trans('admin/licenses/general.seat') }}</th>
        -                           <th class="col-md-2">{{ trans('admin/licenses/general.user') }}</th>
        -                           <th class="col-md-4">{{ trans('admin/licenses/form.asset') }}</th>
        -                           <th class="col-md-2"></th>
        -                      </tr>
        +                    <tr>
        +                      <th class="col-md-2">{{ trans('admin/licenses/general.seat') }}</th>
        +                      <th class="col-md-2">{{ trans('admin/licenses/general.user') }}</th>
        +                      <th class="col-md-4">{{ trans('admin/licenses/form.asset') }}</th>
        +                      <th class="col-md-2"></th>
        +                    </tr>
                           </thead>
                           <tbody>
        -                  <?php $count=1; ?>
        -                      @if ($license->licenseseats)
        -                        @foreach ($license->licenseseats as $licensedto)
        -
        -                        <tr>
        -                            <td>Seat {{ $count }} </td>
        -                            <td>
        -
        -                                @if (($licensedto->user) && ($licensedto->deleted_at == NULL))
        -                                    @can('users.view')
        -                                        <a href="{{ route('view/user', $licensedto->assigned_to) }}">
        -                                            {{ $licensedto->user->fullName() }}
        -                                        </a>
        -                                     @else
        -                                        {{ $licensedto->user->fullName() }}
        -                                     @endcan
        -
        -                                @elseif (($licensedto->user) && ($licensedto->deleted_at != NULL))
        -                                    <del>{{ $licensedto->user->fullName() }}</del>
        -                                @elseif ($licensedto->asset)
        -                                    @if ($licensedto->asset->assigned_to != 0)
        -                                        @can('users.view')
        -                                            <a href="{{ route('view/user', $licensedto->asset->assigned_to) }}">
        -                                                {{ $licensedto->asset->assigneduser->fullName() }}
        -                                            </a>
        -                                        @else
        -                                            {{ $licensedto->asset->assigneduser->fullName() }}
        -                                        @endcan
        -
        -                                    @endif
        -                                @endif
        -                            </td>
        -                            <td>
        -                                @if ($licensedto->asset_id)
        -                                        @can('assets.view')
        -                                            <a href="{{ route('view/hardware', $licensedto->asset_id) }}">
        -                                                {{ $licensedto->asset->name }} {{ $licensedto->asset->asset_tag }}
        -                                            </a>
        -                                        @else
        -                                            {{ $licensedto->asset->name }} {{ $licensedto->asset->asset_tag }}
        -                                        @endcan
        -
        -                                @endif
        -                            </td>
        -                            <td>
        -                                @can('licenses.checkout')
        -                                        @if (($licensedto->assigned_to) || ($licensedto->asset_id))
        -
        -                                            @if ($license->reassignable)
        -                                                <a href="{{ route('checkin/license', $licensedto->id) }}" class="btn btn-primary btn-sm">
        -                                                {{ trans('general.checkin') }}
        -                                                </a>
        -                                            @else
        -                                                <span>Assigned</span>
        -                                            @endif
        -                                        @else
        -                                            <a href="{{ route('checkout/license', $licensedto->id) }}" class="btn btn-info btn-sm">
        -                                            {{ trans('general.checkout') }}</a>
        -                                        @endif
        -                                @endcan
        -                            </td>
        -
        -                        </tr>
        +                    <?php $count=1; ?>
        +                    @if ($license->licenseseats)
        +                      @foreach ($license->licenseseats as $licensedto)
        +                      <tr>
        +                        <td>Seat {{ $count }} </td>
        +                        <td>
        +                          @if (($licensedto->user) && ($licensedto->deleted_at == NULL))
        +                            @can('users.view')
        +                              <a href="{{ route('users.show', $licensedto->assigned_to) }}">
        +                                {{ $licensedto->user->present()->fullName() }}
        +                              </a>
        +                            @else
        +                              {{ $licensedto->user->present()->fullName() }}
        +                            @endcan
        +                          @elseif (($licensedto->user) && ($licensedto->deleted_at != NULL))
        +                            <del>{{ $licensedto->user->present()->fullName() }}</del>
        +                          @elseif ($licensedto->asset)
        +                            @if ($licensedto->asset->assigned_to != 0)
        +                              @can('users.view')
        +                                {!!  $licensedto->asset->assignedTo->present()->nameUrl()  !!}
        +                              @else
        +                                {{ $licensedto->asset->assignedTo->present()->name() }}
        +                              @endcan
        +                            @endif
        +                          @endif
        +                        </td>
        +                        <td>
        +                          @if ($licensedto->asset_id)
        +                            @can('view', $licensedto->asset)
        +                              <a href="{{ route('hardware.show', $licensedto->asset_id) }}">
        +                                {{ $licensedto->asset->name }} {{ $licensedto->asset->asset_tag }}
        +                              </a>
        +                            @else
        +                              {{ $licensedto->asset->name }} {{ $licensedto->asset->asset_tag }}
        +                            @endcan
        +                          @endif
        +                        </td>
        +                        <td>
        +                          @can('checkout', $licensedto)
        +                            @if (($licensedto->assigned_to) || ($licensedto->asset_id))
        +                              @if ($license->reassignable)
        +                                <a href="{{ route('licenses.checkin', $licensedto->id) }}" class="btn btn-primary btn-sm">
        +                                  {{ trans('general.checkin') }}
        +                                </a>
        +                              @else
        +                                <span>Assigned</span>
        +                              @endif
        +                            @else
        +                              <a href="{{ route('licenses.checkout', $licensedto->id) }}" class="btn btn-info btn-sm">
        +                                {{ trans('general.checkout') }}
        +                              </a>
        +                            @endif
        +                          @endcan
        +                        </td>
        +                      </tr>
                                 <?php $count++; ?>
        -                        @endforeach
        +                      @endforeach
                             @endif
        -
        -
                           </tbody>
        -              </table>
        -
        +                </table>
                     </div>
        +
                     <div class="col-md-5">
                       <div class="table">
                         <table class="table">
        @@ -137,20 +122,46 @@
                             </tr>
                             @endif
         
        -                    @if (!is_null($license->manufacturer))
        -                    <tr>
        -                      <td>{{ trans('general.manufacturer') }}</td>
        -                      <td>{{ $license->manufacturer->name }}</td>
        -                    </tr>
        +                    @if ($license->manufacturer)
        +                      <tr>
        +                        <td>{{ trans('admin/hardware/form.manufacturer') }}</td>
        +                        <td>
        +                          @can('view', \App\Models\Manufacturer::class)
        +                            <a href="{{ route('manufacturers.show', $license->manufacturer->id) }}">
        +                              {{ $license->manufacturer->name }}
        +                            </a>
        +                          @else
        +                            {{ $license->manufacturer->name }}
        +                          @endcan
        +
        +                          @if ($license->manufacturer->url)
        +                            <br><i class="fa fa-globe"></i> <a href="{{ $license->manufacturer->url }}">{{ $license->manufacturer->url }}</a>
        +                          @endif
        +
        +                          @if ($license->manufacturer->support_url)
        +                            <br><i class="fa fa-life-ring"></i> <a href="{{ $license->manufacturer->support_url }}">{{ $license->manufacturer->support_url }}</a>
        +                          @endif
        +
        +                          @if ($license->manufacturer->support_phone)
        +                            <br><i class="fa fa-phone"></i> {{ $license->manufacturer->support_phone }}
        +                          @endif
        +
        +                          @if ($license->manufacturer->support_email)
        +                            <br><i class="fa fa-envelope"></i> <a href="mailto:{{ $license->manufacturer->support_email }}">{{ $license->manufacturer->support_email }}</a>
        +                          @endif
        +                        </td>
        +                      </tr>
                             @endif
         
        -                    @can('licenses.keys')
        -                        @if (!is_null($license->serial))
        -                        <tr>
        -                          <td>{{ trans('admin/licenses/form.license_key') }}</td>
        -                          <td style="word-wrap: break-word;overflow-wrap: break-word;word-break: break-word;">{!! nl2br(e($license->serial)) !!}</td>
        -                        </tr>
        -                        @endif
        +                    @can('viewKeys', $license)
        +                      @if (!is_null($license->serial))
        +                      <tr>
        +                        <td>{{ trans('admin/licenses/form.license_key') }}</td>
        +                        <td style="word-wrap: break-word;overflow-wrap: break-word;word-break: break-word;">
        +                          {!! nl2br(e($license->serial)) !!}
        +                        </td>
        +                      </tr>
        +                      @endif
                             @endcan
         
                             @if (!is_null($license->license_name))
        @@ -167,63 +178,59 @@
                             </tr>
                             @endif
         
        -
                             @if ($license->supplier_id)
        -                      <tr>
        -                        <td>{{ trans('general.supplier') }}:
        -                        </td>
        -                        <td>
        -                        <a href="{{ route('view/supplier', $license->supplier_id) }}">
        -                        {{ $license->supplier->name }}
        +                    <tr>
        +                      <td>{{ trans('general.supplier') }}:
        +                      </td>
        +                      <td>
        +                        <a href="{{ route('suppliers.show', $license->supplier_id) }}">
        +                          {{ $license->supplier->name }}
                                 </a>
                               </td>
                             </tr>
                             @endif
         
        -                    @if ($license->expiration_date > 0)
        -                      <tr>
        -                        <td>{{ trans('admin/licenses/form.expiration') }}:
        -                        </td>
        -                        <td>  {{ $license->expiration_date }}
        -                      </td>
        +                    @if (isset($license->expiration_date))
        +                    <tr>
        +                      <td>{{ trans('admin/licenses/form.expiration') }}:</td>
        +                      <td>{{ $license->expiration_date }}</td>
                             </tr>
                             @endif
         
        -                     @if ($license->depreciation)
        -                       <tr>
        -                         <td>
        -                            {{ trans('admin/hardware/form.depreciation') }}:
        -                          </td>
        -                          <td>
        -                            {{ $license->depreciation->name }}
        -                              ({{ $license->depreciation->months }}
        -                              {{ trans('admin/hardware/form.months') }}
        -                              )
        -                            </td>
        -                          </tr>
        +                    @if ($license->depreciation)
                               <tr>
                                 <td>
        -                        {{ trans('admin/hardware/form.depreciates_on') }}:
        -                      </td>
        -                      <td>
        -                        {{ $license->depreciated_date()->format("Y-m-d") }}
        -                      </td>
        -                    </tr>
        -
        -                    <tr>
        +                          {{ trans('admin/hardware/form.depreciation') }}:
        +                        </td>
        +                        <td>
        +                          {{ $license->depreciation->name }}
        +                          ({{ $license->depreciation->months }}
        +                          {{ trans('admin/hardware/form.months') }}
        +                          )
        +                        </td>
        +                      </tr>
        +                      <tr>
        +                        <td>
        +                          {{ trans('admin/hardware/form.depreciates_on') }}:
        +                        </td>
        +                        <td>
        +                          {{ $license->depreciated_date()->format("Y-m-d") }}
        +                        </td>
        +                      </tr>
        +
        +                      <tr>
        +                        <td>
        +                          {{ trans('admin/hardware/form.fully_depreciated') }}:
        +                        </td>
                                 <td>
        -                        {{ trans('admin/hardware/form.fully_depreciated') }}:
        -                      </td>
        -                      <td>
                                 @if ($license->time_until_depreciated()->y > 0)
                                   {{ $license->time_until_depreciated()->y }}
                                   {{ trans('admin/hardware/form.years') }},
                                 @endif
                                 {{ $license->time_until_depreciated()->m }}
                                 {{ trans('admin/hardware/form.months') }}
        -
        -                      </td>
        -                    </tr>
        +                        </td>
        +                      </tr>
                             @endif
         
                             @if ($license->purchase_order)
        @@ -237,21 +244,16 @@
                             </tr>
                             @endif
         
        -                    @if ($license->purchase_date > 0)
        +                    @if (isset($license->purchase_date))
                             <tr>
        -                      <td>
        -                        {{ trans('general.purchase_date') }}:
        -                      </td>
        -                      <td>
        -                        {{ $license->purchase_date }}
        -                      </td>
        +                      <td>{{ trans('general.purchase_date') }}:</td>
        +                      <td>{{ $license->purchase_date }}</td>
                             </tr>
                             @endif
         
                             @if ($license->purchase_cost > 0)
                             <tr>
        -                      <td>{{ trans('general.purchase_cost') }}:
        -                      </td>
        +                      <td>{{ trans('general.purchase_cost') }}:</td>
                               <td>
                                 {{ $snipeSettings->default_currency }}
                                 {{ \App\Helpers\Helper::formatCurrencyOutput($license->purchase_cost) }}
        @@ -261,61 +263,49 @@
         
                             @if ($license->order_number)
                             <tr>
        -                      <td>{{ trans('general.order_number') }}:
        -                      </td>
        -                      <td>
        -                        {{ $license->order_number }}
        -                      </td>
        +                      <td>{{ trans('general.order_number') }}:</td>
        +                      <td>{{ $license->order_number }}</td>
                             </tr>
                             @endif
         
                             @if (($license->seats) && ($license->seats) > 0)
                             <tr>
        -                      <td>{{ trans('admin/licenses/form.seats') }}:
        -                      </td>
        -                      <td>
        -                        {{ $license->seats }}</td>
        +                      <td>{{ trans('admin/licenses/form.seats') }}:</td>
        +                      <td>{{ $license->seats }}</td>
                             </tr>
                             @endif
         
                             <tr>
        -                      <td>
        -                      {{ trans('admin/licenses/form.reassignable') }}:
        -                      </td>
        -                      <td>
        -                        {{ $license->reassignable ? 'Yes' : 'No' }}
        -                      </td>
        +                      <td>{{ trans('admin/licenses/form.reassignable') }}:</td>
        +                      <td>{{ $license->reassignable ? 'Yes' : 'No' }}</td>
                             </tr>
         
                             @if ($license->notes)
        -                       <tr><td>
        -                         {{ trans('general.notes') }}:
        -                         </td><td>
        -                        {!! nl2br(e($license->notes)) !!}</td></tr>
        +                    <tr>
        +                      <td>{{ trans('general.notes') }}:</td>
        +                      <td>
        +                        {!! nl2br(e($license->notes)) !!}
        +                      </td>
        +                    </tr>
                             @endif
        -
        -
                           </tbody>
                         </table>
        -              </div>
        +              </div> <!-- .table-->
        +            </div> <!--/.col-md-5-->
        +          </div> <!--/.row-->
        +        </div> <!-- /.tab-pane -->
         
        -            </div>
        -        </div>
        -
        -        </div>
        -        <!-- /.tab-pane -->
                 <div class="tab-pane" id="tab_2">
        -
                   <table class="table table-striped">
        -          <thead>
        -            <tr>
        +            <thead>
        +              <tr>
                         <th class="col-md-5">{{ trans('general.notes') }}</th>
                         <th class="col-md-5"><span class="line"></span>{{ trans('general.file_name') }}</th>
                         <th class="col-md-2"></th>
                         <th class="col-md-2"></th>
        -            </tr>
        -          </thead>
        -          <tbody>
        +              </tr>
        +            </thead>
        +            <tbody>
                     @if (count($license->uploads) > 0)
                       @foreach ($license->uploads as $file)
                       <tr>
        @@ -324,12 +314,12 @@
                           {{ $file->note }}
                         @endif
                         </td>
        -                <td>
        -                {{ $file->filename }}
        -                </td>
        +                <td>{{ $file->filename }}</td>
                         <td>
                         @if ($file->filename)
        -                  <a href="{{ route('show/licensefile', [$license->id, $file->id]) }}" class="btn btn-default">Download</a>
        +                  <a href="{{ route('show/licensefile', [$license->id, $file->id]) }}" class="btn btn-default">
        +                    Download
        +                  </a>
                         @endif
                         </td>
                         <td>
        @@ -338,105 +328,43 @@
                       </tr>
                       @endforeach
                     @else
        -            <tr>
        -            <td colspan="4">
        -            {{ trans('general.no_results') }}
        -            </td>
        -            </tr>
        -
        +              <tr>
        +              <td colspan="4">{{ trans('general.no_results') }}</td>
        +              </tr>
                     @endif
        -
                     </tbody>
                   </table>
        +        </div> <!-- /.tab-pane -->
         
        -        </div>
        -        <!-- /.tab-pane -->
                 <div class="tab-pane" id="tab_3">
                   <div class="row">
                     <div class="col-md-12">
        -              <table class="table table-hover table-fixed break-word">
        -                  <thead>
        -                      <tr>
        -                          <th class="col-md-2">{{ trans('general.date') }}</th>
        -                          <th class="col-md-2"><span class="line"></span>{{ trans('general.admin') }}</th>
        -                          <th class="col-md-2"><span class="line"></span>{{ trans('button.actions') }}</th>
        -                          <th class="col-md-2"><span class="line"></span>{{ trans('admin/licenses/general.user') }}</th>
        -                          <th class="col-md-4"><span class="line"></span>{{ trans('general.notes') }}</th>
        -                      </tr>
        -                  </thead>
        -                  <tbody>
        -                      @if (count($license->assetlog) > 0)
        -                      @foreach ($license->assetlog as $log)
        -                      <tr>
        -                          <td>{{ $log->created_at }}</td>
        -                          <td>
        -                              @if (isset($log->user_id))
        -                              <a href="{{ route('view/user', $log->user_id)}}">{{ $log->user->fullName() }}</a>
        -                              @endif
        -                          </td>
        -                          <td>{{ $log->action_type }}</td>
        -
        -                          <td>
        -                              @if (($log->target) && ($log->target->id!='0'))
        -
        -                                  @if ($log->target_type == 'App\Models\User')
        -                                      <a href="{{ route('view/user', $log->target_id) }}">
        -                                          {{ $log->userlog->fullName() }}
        -                                      </a>
        -                                  @elseif ($log->target_type == 'App\Models\Asset')
        -                                      <a href="{{ route('view/hardware', $log->target_id) }}">
        -                                          {{ $log->userlog->showAssetName() }}
        -                                      </a>
        -                                  @endif
        -
        -
        -                              @elseif ($log->action_type=='uploaded')
        -
        -                                  {{ $log->filename }}
        -
        -                              @endif
        -
        -                          </td>
        -                          <td>
        -                              @if ($log->note) {{ $log->note }}
        -                              @endif
        -                          </td>
        -                      </tr>
        -                      @endforeach
        -                      @endif
        -                      <tr>
        -                          <td>{{ $license->created_at }}</td>
        -                          <td>
        -                          @if ($license->adminuser) {{ $license->adminuser->fullName() }}
        -                          @else
        -                          {{ trans('general.unknown_admin') }}
        -                          @endif
        -                          </td>
        -                          <td>{{ trans('general.created_asset') }}</td>
        -                          <td></td>
        -                          <td>
        -                          @if ($license->notes)
        -                          {{ $license->notes }}
        -                          @endif
        -                          </td>
        -                      </tr>
        -                  </tbody>
        +              <table
        +                      class="table table-striped snipe-table"
        +                      name="assetHistory"
        +                      id="table"
        +                      data-sort-order="desc"
        +                      data-height="400"
        +                      data-url="{{ route('api.activity.index', ['item_id' => $license->id, 'item_type' => 'license']) }}">
        +                <thead>
        +                <tr>
        +                  <th data-field="icon" style="width: 40px;" class="hidden-xs" data-formatter="iconFormatter"></th>
        +                  <th class="col-sm-2" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.date') }}</th>
        +                  <th class="col-sm-2" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
        +                  <th class="col-sm-2" data-field="action_type">{{ trans('general.action') }}</th>
        +                  <th class="col-sm-2" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
        +                  <th class="col-sm-2" data-field="target" data-formatter="polymorphicItemFormatter">{{ trans('general.target') }}</th>
        +                  <th class="col-sm-2" data-field="note">{{ trans('general.notes') }}</th>
        +                </tr>
        +                </thead>
                       </table>
        -            </div>
        -          </div>
        -
        -        </div>
        -        <!-- /.tab-pane -->
        -      </div>
        -      <!-- /.tab-content -->
        -    </div>
        -    <!-- nav-tabs-custom -->
        -  </div>
        -  <!-- /.col -->
        -
        -
        -</div>
        -<!-- /.row -->
        +            </div> <!-- /.col-md-12-->
        +          </div> <!-- /.row-->
        +        </div> <!-- /.tab-pane -->
        +      </div> <!-- /.tab-content -->
        +    </div> <!-- nav-tabs-custom -->
        +  </div>  <!-- /.col -->
        +</div> <!-- /.row -->
         
         
         <!-- Modal -->
        @@ -451,30 +379,34 @@
               'method' => 'POST',
               'route' => ['upload/license', $license->id],
               'files' => true, 'class' => 'form-horizontal' ]) }}
        -      <div class="modal-body">
        -
        -		<p>{{ trans('admin/licenses/general.filetype_info') }}</p>
        -
        -		 <div class="form-group col-md-12">
        -		 <div class="input-group col-md-12">
        -		 	<input class="col-md-12 form-control" type="text" name="notes" id="notes" placeholder="Notes">
        -		</div>
        -		</div>
        -		<div class="form-group col-md-12">
        -		 <div class="input-group col-md-12">
        -			{{ Form::file('licensefile[]', ['multiple' => 'multiple']) }}
        -		</div>
        -		</div>
        -
        -
        -      </div>
        -      <div class="modal-footer">
        -        <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        -        <button type="submit" class="btn btn-primary btn-sm">{{ trans('button.upload') }}</button>
        -      </div>
        +        <div class="modal-body">
        +          <p>{{ trans('admin/licenses/general.filetype_info') }}</p>
        +          <div class="form-group col-md-12">
        +            <div class="input-group col-md-12">
        +              <input class="col-md-12 form-control" type="text" name="notes" id="notes" placeholder="Notes">
        +            </div>
        +          </div>
        +          <div class="form-group col-md-12">
        +            <div class="input-group col-md-12">
        +             {{ Form::file('licensefile[]', ['multiple' => 'multiple']) }}
        +            </div>
        +          </div>
        +        </div> <!-- /.modal-body-->
        +        <div class="modal-footer">
        +          <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        +          <button type="submit" class="btn btn-primary btn-sm">{{ trans('button.upload') }}</button>
        +        </div>
               {{ Form::close() }}
             </div>
           </div>
         </div>
         
         @stop
        +
        +
        +@section('moar_scripts')
        +  @include ('partials.bootstrap-table', ['simple_view' => true])
        +
        +
        +@stop
        +
        diff --git a/resources/views/locations/edit.blade.php b/resources/views/locations/edit.blade.php
        index cfd80ca869..59235e3f2c 100755
        --- a/resources/views/locations/edit.blade.php
        +++ b/resources/views/locations/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/locations/table.create') ,
             'updateText' => trans('admin/locations/table.update'),
             'helpTitle' => trans('admin/locations/table.about_locations_title'),
        -    'helpText' => trans('admin/locations/table.about_locations')
        +    'helpText' => trans('admin/locations/table.about_locations'),
        +    'formAction' => ($item) ? route('locations.update', ['location' => $item->id]) : route('locations.store'),
         ])
         
         {{-- Page content --}}
        @@ -20,6 +21,17 @@
             </div>
         </div>
         
        +<!-- Manager-->
        +<div class="form-group {{ $errors->has('manager_id') ? ' has-error' : '' }}">
        +    <label for="manager_id" class="col-md-3 control-label">
        +        {{ trans('admin/users/table.manager') }}
        +    </label>
        +    <div class="col-md-9{{  (\App\Helpers\Helper::checkIfRequired($item, 'manager_id')) ? ' required' : '' }}">
        +        {!! Form::select('manager_id', $manager_list , Input::old('manager_id', $item->manager_id), array('class'=>'select2 parent', 'style'=>'width:350px')) !!}
        +        {!! $errors->first('manager_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +    </div>
        +</div>
        +
         <!-- Currency -->
         <div class="form-group {{ $errors->has('currency') ? ' has-error' : '' }}">
             <label for="currency" class="col-md-3 control-label">
        @@ -32,6 +44,20 @@
         </div>
         
         @include ('partials.forms.edit.address')
        +
        +<!-- LDAP Search OU -->
        +@if ($snipeSettings->ldap_enabled == 1)
        +    <div class="form-group {{ $errors->has('currency') ? ' has-error' : '' }}">
        +        <label for="ldap_ou" class="col-md-3 control-label">
        +            {{ trans('admin/locations/table.ldap_ou') }}
        +        </label>
        +        <div class="col-md-7{{  (\App\Helpers\Helper::checkIfRequired($item, 'currency')) ? ' required' : '' }}">
        +            {{ Form::text('ldap_ou', Input::old('ldap_ou', $item->ldap_ou), array('class' => 'form-control')) }}
        +            {!! $errors->first('ldap_ou', '<span class="alert-msg">:message</span>') !!}
        +        </div>
        +    </div>
        +@endif
        +
         @stop
         
         @if (!$item->id)
        @@ -53,7 +79,7 @@
         //start ajax request
         $.ajax({
             type: 'GET',
        -    url: "{{config('app.url') }}/api/locations/"+id+"/check",
        +    url: "{{url('/') }}/api/locations/"+id+"/check",
         //force to handle it as text
         dataType: "text",
         success: function(data) {
        diff --git a/resources/views/locations/index.blade.php b/resources/views/locations/index.blade.php
        index d97400c5cc..98adac48c6 100755
        --- a/resources/views/locations/index.blade.php
        +++ b/resources/views/locations/index.blade.php
        @@ -7,31 +7,29 @@
         @stop
         
         @section('header_right')
        -<a href="{{ route('create/location') }}" class="btn btn-primary pull-right">
        +<a href="{{ route('locations.create') }}" class="btn btn-primary pull-right">
           {{ trans('general.create') }}</a>
         @stop
         {{-- Page content --}}
         @section('content')
        -
         <div class="row">
           <div class="col-md-12">
             <div class="box box-default">
               <div class="box-body">
                 <div class="table-responsive">
        -
                   <table
                   name="locations"
                   class="table table-striped snipe-table"
                   id="table"
        -          data-url="{{ route('api.locations.list') }}"
        +          data-url="{{ route('api.locations.index') }}"
                   data-cookie="true"
                   data-click-to-select="true"
                   data-cookie-id-table="locationsTable-{{ config('version.hash_version') }}">
                     <thead>
                       <tr>
                         <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                <th data-sortable="true" data-field="name">{{ trans('admin/locations/table.name') }}</th>
        -                <th data-sortable="true" data-field="parent">{{ trans('admin/locations/table.parent') }}</th>
        +                <th data-sortable="true" data-formatter="locationsLinkFormatter" data-field="name" data-searchable="true">{{ trans('admin/locations/table.name') }}</th>
        +                <th data-sortable="true" data-field="parent" data-formatter="locationsLinkObjFormatter">{{ trans('admin/locations/table.parent') }}</th>
                         <th data-searchable="false" data-sortable="false" data-field="assets_default">{{ trans('admin/locations/table.assets_rtd') }}</th>
                         <th data-searchable="false" data-sortable="false" data-field="assets_checkedout">{{ trans('admin/locations/table.assets_checkedout') }}</th>
                         <th data-searchable="true" data-sortable="true" data-field="currency">{{ App\Models\Setting::first()->default_currency }}</th>
        @@ -39,25 +37,28 @@
                         <th data-searchable="true" data-sortable="true" data-field="city">{{ trans('admin/locations/table.city') }}
                         </th>
                         <th data-searchable="true" data-sortable="true" data-field="state">
        -                 {{ trans('admin/locations/table.state') }}
        +                    {{ trans('admin/locations/table.state') }}
                         </th>
        -                  <th data-searchable="true" data-sortable="true" data-field="zip">
        -                      {{ trans('admin/locations/table.zip') }}
        -                  </th>
        +                    <th data-searchable="true" data-sortable="true" data-field="zip">
        +                        {{ trans('admin/locations/table.zip') }}
        +                    </th>
                         <th data-searchable="true" data-sortable="true" data-field="country">
        -                {{ trans('admin/locations/table.country') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +                    {{ trans('admin/locations/table.country') }}
        +                </th>
        +                <th data-sortable="true" data-formatter="usersLinkObjFormatter" data-field="manager" data-searchable="true">{{ trans('admin/users/table.manager') }}</th>
        +                <th data-switchable="false" data-formatter="locationsActionsFormatter" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
                       </tr>
                     </thead>
                   </table>
                 </div>
               </div>
        +    </div>
           </div>
         </div>
        +
         @stop
         
         @section('moar_scripts')
         @include ('partials.bootstrap-table', ['exportFile' => 'locations-export', 'search' => true])
         
        -
         @stop
        diff --git a/resources/views/locations/view.blade.php b/resources/views/locations/view.blade.php
        index 9a11b11ad3..4628a58ca4 100644
        --- a/resources/views/locations/view.blade.php
        +++ b/resources/views/locations/view.blade.php
        @@ -3,86 +3,94 @@
         {{-- Page title --}}
         @section('title')
         
        + {{ trans('general.location') }}:
          {{ $location->name }}
        - {{ trans('general.location') }}
        + @if ($location->manager)
        +    <div class="h6"> {!! trans('admin/users/table.manager') . ': ' . $location->manager->present()->nameUrl() !!}</div>
        + @endif
         @parent
         @stop
         
         @section('header_right')
        -<a href="{{ route('update/location', $location->id) }}" class="btn btn-sm btn-primary pull-right">{{ trans('admin/locations/table.update') }} </a>
        +<a href="{{ route('locations.edit', ['location' => $location->id]) }}" class="btn btn-sm btn-primary pull-right">{{ trans('admin/locations/table.update') }} </a>
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -  <div class="row">
        -    <div class="col-md-12">
        -      <div class="box box-default">
        -
        -        <div class="box-body">
        -          <div class="row">
        -            <div class="col-md-12">
        -              <div class="table table-responsive">
        -                <table
        -                name="location_users"
        -                id="table-users"
        -                class="table table-striped snipe-table"
        -                data-url="{{route('api.locations.viewusers', $location->id)}}"
        -                data-cookie="true"
        -                data-click-to-select="true"
        -                data-cookie-id-table="location_usersDetailTable">
        -                    <thead>
        -                        <tr>
        -                            <th data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.user') }}</th>
        -                        </tr>
        -                    </thead>
        -                </table>
        -              </div>
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +    <div class="box-header with-border">
        +        <div class="box-heading">
        +            <h3 class="box-title">{{ trans('general.users') }}</h3>
        +        </div>
        +    </div>
        +      <div class="box-body">
        +        <div class="row">
        +          <div class="col-md-12">
        +            <div class="table table-responsive">
        +              <table
        +              name="location_users"
        +              id="table-users"
        +              class="table table-striped snipe-table"
        +              data-url="{{route('api.users.index', ['location_id' => $location->id])}}"
        +              data-cookie="true"
        +              data-click-to-select="true"
        +              data-cookie-id-table="location_usersDetailTable">
        +                <thead>
        +                  <tr>
        +                    <th data-searchable="false" data-sortable="false"  data-formatter="usersLinkFormatter" data-field="name">{{ trans('general.user') }}</th>
        +                  </tr>
        +                </thead>
        +              </table>
                     </div>
                   </div>
                 </div>
               </div>
             </div>
           </div>
        +</div>
         
        -  <div class="row">
        -    <div class="col-md-12">
        -      <div class="box box-default">
        -
        -        <div class="box-body">
        -          <div class="row">
        -            <div class="col-md-12">
        -              <div class="table table-responsive">
        -                <table
        -                name="location_assets"
        -                id="table-assets"
        -                data-url="{{route('api.locations.viewassets', $location->id)}}"
        -                class="table table-striped snipe-table"
        -                data-cookie="true"
        -                data-click-to-select="true"
        -                data-cookie-id-table="location_assetsDetailTable">
        -                    <thead>
        -                        <tr>
        -                            <th data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.name') }}</th>
        -                            <th data-searchable="false" data-sortable="false" data-field="model">{{ trans('admin/hardware/form.model') }}</th>
        -                            <th data-searchable="false" data-sortable="false" data-field="asset_tag">{{ trans('admin/hardware/form.tag') }}</th>
        -                            <th data-searchable="false" data-sortable="false" data-field="serial">{{ trans('admin/hardware/form.serial') }}</th>
        -                        </tr>
        -                    </thead>
        -                </table>
        -              </div>
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +    <div class="box-header with-border">
        +    <div class="box-heading">
        +        <h3 class="box-title">{{ trans('general.assets') }}</h3>
        +    </div>
        +    </div>
        +      <div class="box-body">
        +        <div class="row">
        +          <div class="col-md-12">
        +            <div class="table table-responsive">
        +              <table
        +              name="location_assets"
        +              id="table-assets"
        +              data-url="{{route('api.assets.index', ['location_id' => $location->id]) }}"
        +              class="table table-striped snipe-table"
        +              data-cookie="true"
        +              data-click-to-select="true"
        +              data-cookie-id-table="location_assetsDetailTable">
        +                <thead>
        +                  <tr>
        +                    <th data-searchable="false" data-sortable="false"  data-formatter="hardwareLinkFormatter" data-field="name">{{ trans('general.name') }}</th>
        +                    <th data-searchable="false" data-formatter="modelsLinkObjFormatter" data-sortable="false" data-field="model">{{ trans('admin/hardware/form.model') }}</th>
        +                    <th data-searchable="false" data-sortable="false" data-field="asset_tag">{{ trans('admin/hardware/form.tag') }}</th>
        +                    <th data-searchable="false" data-sortable="false" data-field="serial">{{ trans('admin/hardware/form.serial') }}</th>
        +                  </tr>
        +                </thead>
        +              </table>
                     </div>
                   </div>
                 </div>
               </div>
             </div>
           </div>
        ->
        -
        +</div>
         
         @stop
         
        -
         @section('moar_scripts')
         @include ('partials.bootstrap-table', ['exportFile' => 'locations-export', 'search' => true])
         
        diff --git a/resources/views/manufacturers/edit.blade.php b/resources/views/manufacturers/edit.blade.php
        index 23eada86ea..895b45e554 100755
        --- a/resources/views/manufacturers/edit.blade.php
        +++ b/resources/views/manufacturers/edit.blade.php
        @@ -2,11 +2,52 @@
             'createText' => trans('admin/manufacturers/table.create') ,
             'updateText' => trans('admin/manufacturers/table.update'),
             'helpTitle' => trans('admin/manufacturers/table.about_manufacturers_title'),
        -    'helpText' => trans('admin/manufacturers/table.about_manufacturers_text')
        +    'helpText' => trans('admin/manufacturers/table.about_manufacturers_text'),
        +    'formAction' => ($item) ? route('manufacturers.update', ['manufacturer' => $item->id]) : route('manufacturers.store'),
         ])
         
         
         {{-- Page content --}}
         @section('inputFields')
         @include ('partials.forms.edit.name', ['translated_name' => trans('admin/manufacturers/table.name')])
        +    <!-- URL -->
        +    <div class="form-group {{ $errors->has('url') ? ' has-error' : '' }}">
        +        <label for="url" class="col-md-3 control-label">{{ trans('admin/manufacturers/table.url') }}
        +        </label>
        +        <div class="col-md-6">
        +            <input class="form-control" type="text" name="url" id="url" value="{{ Input::old('url', $item->url) }}" />
        +            {!! $errors->first('url', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +        </div>
        +    </div>
        +
        +    <!-- Support URL -->
        +    <div class="form-group {{ $errors->has('support_url') ? ' has-error' : '' }}">
        +        <label for="support_url" class="col-md-3 control-label">{{ trans('admin/manufacturers/table.support_url') }}
        +        </label>
        +        <div class="col-md-6">
        +            <input class="form-control" type="text" name="support_url" id="support_url" value="{{ Input::old('support_url', $item->support_url) }}" />
        +            {!! $errors->first('support_url', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +        </div>
        +    </div>
        +
        +    <!-- Support Phone -->
        +    <div class="form-group {{ $errors->has('support_phone') ? ' has-error' : '' }}">
        +        <label for="support_phone" class="col-md-3 control-label">{{ trans('admin/manufacturers/table.support_phone') }}
        +        </label>
        +        <div class="col-md-6">
        +            <input class="form-control" type="text" name="support_phone" id="support_phone" value="{{ Input::old('support_phone', $item->support_phone) }}" />
        +            {!! $errors->first('support_phone', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +        </div>
        +    </div>
        +
        +    <!-- Support Email -->
        +    <div class="form-group {{ $errors->has('support_email') ? ' has-error' : '' }}">
        +        <label for="support_email" class="col-md-3 control-label">{{ trans('admin/manufacturers/table.support_email') }}
        +        </label>
        +        <div class="col-md-6">
        +            <input class="form-control" type="email" name="support_email" id="support_email" value="{{ Input::old('support_email', $item->support_email) }}" />
        +            {!! $errors->first('support_email', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +        </div>
        +    </div>
        +
         @stop
        diff --git a/resources/views/manufacturers/index.blade.php b/resources/views/manufacturers/index.blade.php
        index cee0ca0fb9..bec997713c 100755
        --- a/resources/views/manufacturers/index.blade.php
        +++ b/resources/views/manufacturers/index.blade.php
        @@ -8,7 +8,7 @@
         
         {{-- Page title --}}
         @section('header_right')
        -<a href="{{ route('create/manufacturer') }}" class="btn btn-primary pull-right">
        +<a href="{{ route('manufacturers.create') }}" class="btn btn-primary pull-right">
           {{ trans('general.create') }}</a>
         @stop
         
        @@ -20,35 +20,28 @@
             <div class="box box-default">
               <div class="box-body">
                 <div class="table-responsive">
        +          <table
        +          name="manufacturers"
        +          class="table table-striped snipe-table"
        +          id="table"
        +          data-url="{{route('api.manufacturers.index') }}"
        +          data-cookie="true"
        +          data-click-to-select="true"
        +          data-cookie-id-table="manufacturersTable-{{ config('version.hash_version') }}">
         
        -        <table
        -        name="manufacturers"
        -        class="table table-striped snipe-table"
        -        id="table"
        -        data-url="{{route('api.manufacturers.list') }}"
        -        data-cookie="true"
        -        data-click-to-select="true"
        -        data-cookie-id-table="manufacturersTable-{{ config('version.hash_version') }}">
        -            <thead>
        -                <tr>
        -                    <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                    <th data-sortable="true" data-field="name">{{ trans('admin/manufacturers/table.name') }}</th>
        -                    <th data-switchable="true" data-searchable="false" data-sortable="false" data-field="assets">{{ trans('general.assets') }}</th>
        -                    <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        -                </tr>
        -            </thead>
        -        </table>
        -
        -      </div>
        +          </table>
        +        </div>
               </div><!-- /.box-body -->
             </div><!-- /.box -->
        -
        -
           </div>
         </div>
         
         @stop
         
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'manufacturers-export', 'search' => true])
        +  @include ('partials.bootstrap-table',
        +      ['exportFile' => 'manufacturers-export',
        +      'search' => true,
        +      'columns' => \App\Presenters\ManufacturerPresenter::dataTableLayout()
        +  ])
         @stop
        diff --git a/resources/views/manufacturers/view.blade.php b/resources/views/manufacturers/view.blade.php
        index 0ecb663f81..e62e4a08cb 100644
        --- a/resources/views/manufacturers/view.blade.php
        +++ b/resources/views/manufacturers/view.blade.php
        @@ -14,8 +14,8 @@
              <span class="caret"></span>
               </button>
               <ul class="dropdown-menu">
        -        <li><a href="{{ route('update/manufacturer', $manufacturer->id) }}">{{ trans('admin/manufacturers/table.update') }}</a></li>
        -        <li><a href="{{ route('create/manufacturer') }}">{{ trans('admin/manufacturers/table.create') }}</a></li>
        +        <li><a href="{{ route('manufacturers.edit', $manufacturer->id) }}">{{ trans('admin/manufacturers/table.update') }}</a></li>
        +        <li><a href="{{ route('manufacturers.create') }}">{{ trans('admin/manufacturers/table.create') }}</a></li>
               </ul>
           </div>
         @stop
        @@ -23,148 +23,148 @@
         {{-- Page content --}}
         @section('content')
         
        -  <div class="row">
        -    <div class="col-md-12">
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="nav-tabs-custom">
         
        -      <div class="nav-tabs-custom">
        -        <ul class="nav nav-tabs">
        -          <li class="active">
        -            <a href="#assets" data-toggle="tab">Assets</a>
        -          </li>
        -          <li>
        -            <a href="#licenses" data-toggle="tab">Licenses</a>
        -          </li>
        -          <li>
        -            <a href="#accessories" data-toggle="tab">Accessories</a>
        -          </li>
        -          <li>
        -            <a href="#consumables" data-toggle="tab">Consumables</a>
        -          </li>
        -        </ul>
        -        <div class="tab-content">
        -          <div class="tab-pane fade in active" id="assets">
        -            <table
        -              name="manufacturer_assets"
        -              class="table table-striped bootstrap-table snipe-table"
        -              id="assets-table"
        -              data-url="{{ route('api.manufacturers.view', ['manufacturerId' => $manufacturer->id, 'itemtype' => 'assets']) }}"
        -              data-cookie="true"
        -              data-click-to-select="true"
        -              data-cookie-id-table="maufacturerAssetsTable-{{config('version.hash_version') }}"
        -            >
        -              <thead>
        -                <tr>
        -                  <th data-searchable="false" data-sortable="false" data-field="companyName" data-visible="false">
        -                      {{ trans('admin/companies/table.title') }}
        -                  </th>
        -                  <th data-searchable="false" data-sortable="false" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.name') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="model">{{ trans('admin/hardware/form.model') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="asset_tag">{{ trans('general.asset_tag') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="serial">{{ trans('admin/hardware/form.serial') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="assigned_to">{{ trans('general.user') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="change"  data-switchable="false">{{ trans('admin/hardware/table.change') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="actions"  data-switchable="false">{{ trans('table.actions') }}</th>
        -                </tr>
        -              </thead>
        -            </table>
        -          </div> <!-- /.tab-pane assets -->
        +      <ul class="nav nav-tabs">
        +        <li class="active">
        +          <a href="#assets" data-toggle="tab">Assets</a>
        +        </li>
        +        <li>
        +          <a href="#licenses" data-toggle="tab">Licenses</a>
        +        </li>
        +        <li>
        +          <a href="#accessories" data-toggle="tab">Accessories</a>
        +        </li>
        +        <li>
        +          <a href="#consumables" data-toggle="tab">Consumables</a>
        +        </li>
        +      </ul>
         
        -          <div class="tab-pane fade" id="licenses">
        -            <table
        -              name="manufacturer_licenses"
        -              class="table table-striped bootstrap-table snipe-table"
        -              id="licenses-table"
        -              data-url="{{ route('api.manufacturers.view', ['manufacturerId' => $manufacturer->id, 'itemtype' => 'licenses']) }}"
        -              data-cookie="true"
        -              data-click-to-select="true"
        -              data-cookie-id-table="maufacturerLicensesTable-{{config('version.hash_version') }}"
        -            >
        -              <thead>
        -                <tr>
        -                  <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                  <th data-field="companyName" data-sortable="false" data-switchable="true">{{ trans('general.company') }}</th>
        -                  <th data-field="name" data-sortable="true">{{ trans('admin/licenses/table.title') }}</th>
        -                  <th data-field="manufacturer" data-sortable="true">{{ trans('general.manufacturer') }}</th>
        -                  <th data-field="serial" data-sortable="true" >{{ trans('admin/licenses/table.serial') }}</th>
        -                  <th data-field="license_name" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.to_name') }}</th>
        -                  <th data-field="license_email" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.to_email') }}</th>
        -                  <th data-field="totalSeats" data-sortable="false">{{ trans('admin/licenses/form.seats') }}</th>
        -                  <th data-field="remaining" data-sortable="false">{{ trans('admin/licenses/form.remaining_seats') }}</th>
        -                  <th data-field="purchase_date" data-sortable="true">{{ trans('admin/licenses/table.purchase_date') }}</th>
        -                  <th data-field="purchase_cost" data-sortable="true">{{ trans('general.purchase_cost') }}</th>
        -                  <th data-field="purchase_order" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.purchase_order') }}</th>
        -                  <th data-field="expiration_date" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.expiration') }}</th>
        -                  <th data-field="notes" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.notes') }}</th>
        -                  <th data-field="actions">{{ trans('table.actions') }}</th>
        -                </tr>
        -              </thead>
        -            </table>
        -          </div>
        +      <div class="tab-content">
        +        <div class="tab-pane fade in active" id="assets">
        +          <table
        +            name="manufacturer_assets"
        +            class="table table-striped bootstrap-table snipe-table"
        +            id="assets-table"
        +            data-url="{{ route('api.assets.index', ['manufacturer_id' => $manufacturer->id, 'itemtype' => 'assets']) }}"
        +            data-cookie="true"
        +            data-click-to-select="true"
        +            data-cookie-id-table="maufacturerAssetsTable-{{config('version.hash_version') }}">
        +            <thead>
        +              <tr>
        +                <th data-searchable="false" data-sortable="false" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="company" data-visible="false" data-formatter="companiesLinkObjFormatter">
        +                    {{ trans('admin/companies/table.title') }}
        +                </th>
        +                <th data-searchable="false" data-sortable="false" data-field="name" data-formatter="hardwareLinkFormatter">{{ trans('general.name') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="image" data-visible="false" data-formatter="imageFormatter">{{ trans('admin/hardware/table.image') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="model" data-formatter="modelsLinkObjFormatter">{{ trans('admin/hardware/form.model') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="asset_tag" data-formatter="hardwareLinkFormatter">{{ trans('general.asset_tag') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="serial" data-formatter="hardwareLinkFormatter">{{ trans('admin/hardware/form.serial') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="assigned_to" data-formatter="usersLinkObjFormatter">{{ trans('general.user') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="change"  data-switchable="false" data-formatter="hardwareInOutFormatter">{{ trans('admin/hardware/table.change') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="actions"  data-switchable="false" data-formatter="hardwareActionsFormatter">{{ trans('table.actions') }}</th>
        +              </tr>
        +            </thead>
        +          </table>
        +        </div> <!-- /.tab-pane assets -->
         
        -          <div class="tab-pane fade" id="accessories">
        -            <table
        -              name="manufacturer_licenses"
        -              class="table table-striped bootstrap-table snipe-table"
        -              id="licenses-table"
        -              data-url="{{ route('api.manufacturers.view', ['manufacturerId' => $manufacturer->id, 'itemtype' => 'accessories']) }}"
        -              data-cookie="true"
        -              data-click-to-select="true"
        -              data-cookie-id-table="maufacturerLicensesTable-{{config('version.hash_version') }}"
        -            >
        -              <thead>
        -                <tr>
        -                  <th data-switchable="true" data-searchable="true" data-sortable="true" data-field="companyName" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
        -                  <th data-sortable="true" data-searchable="true"  data-field="name">{{ trans('admin/accessories/table.title') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="category">{{ trans('admin/accessories/general.accessory_category') }}</th>
        -                  <th data-field="manufacturer" data-searchable="true" data-sortable="true">{{ trans('general.manufacturer') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="location">{{ trans('general.location') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="qty">{{ trans('admin/accessories/general.total') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="purchase_date" data-visible="false">{{ trans('admin/accessories/general.date') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="purchase_cost">{{ trans('admin/accessories/general.cost') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="order_number" data-visible="false">{{ trans('admin/accessories/general.order') }}</th>
        -                  <th data-searchable="false" data-sortable="true" data-field="min_amt">{{ trans('general.min_amt') }}</th>
        -                  <th data-searchable="false" data-sortable="false" data-field="numRemaining">{{ trans('admin/accessories/general.remaining') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        -                </tr>
        -              </thead>
        -            </table>
        -          </div>
        -          <div class="tab-pane fade" id="consumables">
        -            <table
        -              name="manufacturer_licenses"
        -              class="table table-striped bootstrap-table snipe-table"
        -              id="licenses-table"
        -              data-url="{{ route('api.manufacturers.view', ['manufacturerId' => $manufacturer->id, 'itemtype' => 'consumables']) }}"
        -              data-cookie="true"
        -              data-click-to-select="true"
        -              data-cookie-id-table="maufacturerLicensesTable-{{config('version.hash_version') }}"
        -            >
        -              <thead>
        -                <tr>
        -                  <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                  <th data-switchable="true" data-searchable="true" data-sortable="true" data-field="companyName">{{ trans('admin/companies/table.title') }}</th>
        -                  <th data-sortable="true" data-searchable="true" data-field="name">{{ trans('admin/consumables/table.title') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="location">{{ trans('general.location') }}</th>
        -                  <th data-searchable="true" data-sortable="true" data-field="category">{{ trans('general.category') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="qty"> {{ trans('admin/consumables/general.total') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="numRemaining"> {{ trans('admin/consumables/general.remaining') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="true" data-field="min_amt"> {{ trans('general.min_amt') }}</th>
        -                  <th data-sortable="true" data-field="manufacturer" data-visible="false">{{ trans('general.manufacturer') }}</th>
        -                  <th data-sortable="true" data-field="model_number" data-visible="false">{{ trans('general.model_no') }}</th>
        -                  <th data-sortable="true" data-field="item_no" data-visible="false">{{ trans('admin/consumables/general.item_no') }}</th>
        -                  <th data-sortable="true" data-searchable="true" data-field="order_number" data-visible="false">{{ trans('admin/consumables/general.order') }}</th>
        -                  <th data-sortable="true" data-searchable="true" data-field="purchase_date" data-visible="false">{{ trans('admin/consumables/general.date') }}</th>
        -                  <th data-sortable="true" data-searchable="true" data-field="purchase_cost" data-visible="false">{{ trans('admin/consumables/general.cost') }}</th>
        -                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions"> {{ trans('table.actions') }}</th>
        -                </tr>
        -              </thead>
        -            </table>
        -          </div>
        -        </div> <!-- /.tab-content -->
        -      </div>  <!-- /.nav-tabs-custom -->
        -    </div><!-- /. col-md-12 -->
        -  </div> <!-- /.row -->
        +        <div class="tab-pane fade" id="licenses">
        +          <table
        +            name="manufacturer_licenses"
        +            class="table table-striped bootstrap-table snipe-table"
        +            id="licenses-table"
        +            data-url="{{ route('api.licenses.index', ['manufacturer_id' => $manufacturer->id]) }}"
        +            data-cookie="true"
        +            data-click-to-select="true"
        +            data-cookie-id-table="maufacturerLicensesTable-{{config('version.hash_version') }}">
        +            <thead>
        +              <tr>
        +                <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        +                <th data-field="company" data-sortable="false" data-switchable="true" data-formatter="companiesLinkObjFormatter">{{ trans('general.company') }}</th>
        +                <th data-field="name" data-sortable="true" data-formatter="licensesLinkFormatter">{{ trans('admin/licenses/table.title') }}</th>
        +                <th data-field="manufacturer" data-sortable="true" data-formatter="manufacturersLinkObjFormatter">{{ trans('general.manufacturer') }}</th>
        +                <th data-field="product_key" data-sortable="true" >{{ trans('admin/licenses/table.serial') }}</th>
        +                <th data-field="license_name" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.to_name') }}</th>
        +                <th data-field="license_email" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.to_email') }}</th>
        +                <th data-field="total_seats" data-sortable="false">{{ trans('admin/licenses/form.seats') }}</th>
        +                <th data-field="remaining_qty" data-sortable="false">{{ trans('admin/licenses/form.remaining_seats') }}</th>
        +                <th data-field="purchase_date" data-sortable="true"  data-formatter="dateDisplayFormatter">{{ trans('admin/licenses/table.purchase_date') }}</th>
        +                <th data-field="purchase_cost" data-sortable="true">{{ trans('general.purchase_cost') }}</th>
        +                <th data-field="purchase_order" data-sortable="true" data-visible="false">{{ trans('admin/licenses/form.purchase_order') }}</th>
        +                <th data-field="expiration_date" data-sortable="true" data-visible="false"  data-formatter="dateDisplayFormatter">{{ trans('admin/licenses/form.expiration') }}</th>
        +                <th data-field="notes" data-sortable="true" data-visible="false">{{ trans('general.notes') }}</th>
        +                <th data-field="actions" data-formatter="licensesActionsFormatter">{{ trans('table.actions') }}</th>
        +              </tr>
        +            </thead>
        +          </table>
        +        </div><!-- /.tab-pan licenses-->
        +
        +        <div class="tab-pane fade" id="accessories">
        +          <table
        +            name="manufacturer_accessories"
        +            class="table table-striped bootstrap-table snipe-table"
        +            id="licenses-table"
        +            data-url="{{ route('api.accessories.index', ['manufacturer_id' => $manufacturer->id]) }}"
        +            data-cookie="true"
        +            data-click-to-select="true"
        +            data-cookie-id-table="manufacturerAccessoriesTable-{{config('version.hash_version') }}">
        +            <thead>
        +              <tr>
        +                <th data-switchable="true" data-searchable="true" data-sortable="true" data-field="company" data-visible="false" data-formatter="companiesLinkObjFormatter">{{ trans('admin/companies/table.title') }}</th>
        +                <th data-sortable="true" data-searchable="true"  data-field="name" data-formatter="accessoriesLinkFormatter">{{ trans('admin/accessories/table.title') }}</th>
        +                <th data-searchable="true" data-sortable="true" data-field="category" data-formatter="categoriesLinkObjFormatter">{{ trans('admin/accessories/general.accessory_category') }}</th>
        +                <th data-field="manufacturer" data-searchable="true" data-sortable="true" data-formatter="manufacturersLinkObjFormatter">{{ trans('general.manufacturer') }}</th>
        +                <th data-searchable="true" data-sortable="true" data-field="location" data-formatter="locationsLinkObjFormatter">{{ trans('general.location') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="qty">{{ trans('admin/accessories/general.total') }}</th>
        +                <th data-searchable="true" data-sortable="true" data-field="purchase_date" data-visible="false" data-formatter="dateDisplayFormatter">{{ trans('general.purchase_date') }}</th>
        +                <th data-searchable="true" data-sortable="true" data-field="purchase_cost">{{ trans('general.purchase_cost') }}</th>
        +                <th data-searchable="true" data-sortable="true" data-field="order_number" data-visible="false">{{ trans('general.order_number') }}</th>
        +                <th data-searchable="false" data-sortable="true" data-field="min_qty">{{ trans('general.min_amt') }}</th>
        +                <th data-searchable="false" data-sortable="false" data-field="remaining_qty">{{ trans('admin/accessories/general.remaining') }}</th>
        +                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" data-formatter="accessoriesActionsFormatter">{{ trans('table.actions') }}</th>
        +              </tr>
        +            </thead>
        +          </table>
        +        </div> <!-- /.tab-pan accessories-->
        +
        +        <div class="tab-pane fade" id="consumables">
        +          <table
        +            name="manufacturer_consumables"
        +            class="table table-striped bootstrap-table snipe-table"
        +            id="licenses-table"
        +            data-url="{{ route('api.consumables.index', ['manufacturer_id' => $manufacturer->id]) }}"
        +            data-cookie="true"
        +            data-click-to-select="true"
        +            data-cookie-id-table="maufacturerConsumablesTable-{{config('version.hash_version') }}">
        +            <thead>
        +              <tr>
        +                <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        +                <th data-switchable="true" data-searchable="true" data-sortable="true" data-field="company" data-formatter="companiesLinkObjFormatter">{{ trans('admin/companies/table.title') }}</th>
        +                <th data-sortable="true" data-searchable="true" data-field="name" data-formatter="consumablesLinkFormatter">{{ trans('admin/consumables/table.title') }}</th>
        +                <th data-searchable="true" data-sortable="true" data-field="location" data-formatter="locationsLinkObjFormatter">{{ trans('general.location') }}</th>
        +                <th data-searchable="true" data-sortable="true" data-field="category" data-formatter="categoriesLinkObjFormatter">{{ trans('general.category') }}</th>
        +                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="qty"> {{ trans('admin/consumables/general.total') }}</th>
        +                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="remaining"> {{ trans('admin/consumables/general.remaining') }}</th>
        +                <th data-switchable="false" data-searchable="false" data-sortable="true" data-field="min_amt"> {{ trans('general.min_amt') }}</th>
        +                <th data-sortable="true" data-field="manufacturer" data-visible="false" data-formatter="manufacturersLinkObjFormatter">{{ trans('general.manufacturer') }}</th>
        +                <th data-sortable="true" data-field="model_number" data-visible="false">{{ trans('general.model_no') }}</th>
        +                <th data-sortable="true" data-field="item_no" data-visible="false">{{ trans('admin/consumables/general.item_no') }}</th>
        +                <th data-sortable="true" data-searchable="true" data-field="order_number" data-visible="false">{{ trans('general.order_number') }}</th>
        +                <th data-sortable="true" data-searchable="true" data-field="purchase_date" data-visible="false" data-formatter="dateDisplayFormatter">{{ trans('general.purchase_date') }}</th>
        +                <th data-sortable="true" data-searchable="true" data-field="purchase_cost" data-visible="false">{{ trans('general.purchase_cost') }}</th>
        +                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" data-formatter="consumablesActionsFormatter"> {{ trans('table.actions') }}</th>
        +              </tr>
        +            </thead>
        +          </table>
        +        </div> <!-- /.tab-pan consumables-->
        +
        +      </div> <!-- /.tab-content -->
        +    </div>  <!-- /.nav-tabs-custom -->
        +  </div><!-- /. col-md-12 -->
        +</div> <!-- /.row -->
         @stop
         
         @section('moar_scripts')
        diff --git a/resources/views/modals/location.blade.php b/resources/views/modals/location.blade.php
        new file mode 100644
        index 0000000000..55f64c5559
        --- /dev/null
        +++ b/resources/views/modals/location.blade.php
        @@ -0,0 +1,32 @@
        +<div class="modal-dialog">
        +    <div class="modal-content">
        +        <div class="modal-header">
        +            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        +            <h4 class="modal-title">{{ trans('admin/locations/table.create')  }}</h4>
        +        </div>
        +        <div class="modal-body">
        +            <div class="alert alert-danger" id="modal_error_msg" style="display:none">
        +            </div>
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-name">{{ trans('general.name') }}:
        +                    </label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-name' class="form-control"></div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-city">{{ trans('general.city') }}:</label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-city' class="form-control"></div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12 country"><label for="modal-country">{{ trans('general.country') }}:</label></div>
        +                <div class="col-md-8 col-xs-12">{!! Form::countries('country', Input::old('country'), 'select2 country',"modal-country") !!}</div>
        +            </div>
        +        </div>
        +
        +        <div class="modal-footer">
        +            <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        +            <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        +        </div>
        +    </div><!-- /.modal-content -->
        +</div><!-- /.modal-dialog -->
        diff --git a/resources/views/modals/model.blade.php b/resources/views/modals/model.blade.php
        new file mode 100644
        index 0000000000..5a348d3f3c
        --- /dev/null
        +++ b/resources/views/modals/model.blade.php
        @@ -0,0 +1,43 @@
        +<div class="modal-dialog">
        +    <div class="modal-content">
        +        <div class="modal-header">
        +            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        +            <h4 class="modal-title">{{ trans('admin/models/table.create') }}</h4>
        +        </div>
        +        <div class="modal-body">
        +            <div class="alert alert-danger" id="modal_error_msg" style="display:none">
        +            </div>
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-name">{{ trans('general.name') }}:
        +                    </label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-name' class="form-control"></div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-manufacturer_id">{{ trans('general.manufacturer') }}:
        +                    </label></div>
        +                <div class="col-md-8 col-xs-12 required">{{ Form::select('modal-manufacturer', $manufacturer , '', array('class'=>'select2 parent', 'style'=>'width:100%','id' =>'modal-manufacturer_id')) }}</div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-category_id">{{ trans('general.category') }}:
        +                    </label></div>
        +                <div class="col-md-8 col-xs-12 required">{{ Form::select('modal-category', $category ,'', array('class'=>'select2 parent', 'style'=>'width:100%','id' => 'modal-category_id')) }}</div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-modelno">{{ trans('general.model_no') }}:</label></div>
        +                <div class="col-md-8 col-xs-12"><input type='text' id='modal-modelno' class="form-control"></div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-fieldset_id">{{ trans('admin/models/general.fieldset') }}:</label></div>
        +                <div class="col-md-8 col-xs-12">{{ Form::select('custom_fieldset', \App\Helpers\Helper::customFieldsetList(),Input::old('custom_fieldset'), array('class'=>'select2', 'id'=>'modal-fieldset_id', 'style'=>'width:350px')) }}</div>
        +            </div>
        +        </div>
        +        <div class="modal-footer">
        +            <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        +            <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        +        </div>
        +    </div><!-- /.modal-content -->
        +</div><!-- /.modal-dialog -->
        diff --git a/resources/views/modals/statuslabel.blade.php b/resources/views/modals/statuslabel.blade.php
        new file mode 100644
        index 0000000000..4d856bba8d
        --- /dev/null
        +++ b/resources/views/modals/statuslabel.blade.php
        @@ -0,0 +1,28 @@
        +<div class="modal-dialog">
        +    <div class="modal-content">
        +        <div class="modal-header">
        +            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        +            <h4 class="modal-title">{{ trans('admin/statuslabels/table.create') }}</h4>
        +        </div>
        +        <div class="modal-body">
        +            <div class="alert alert-danger" id="modal_error_msg" style="display:none">
        +            </div>
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-name">{{ trans('general.name') }}:
        +                    </label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-name' class="form-control"></div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-type">{{ trans('admin/statuslabels/table.status_type') }}:
        +                    </label></div>
        +                <div class="col-md-8 col-xs-12 required">{{ Form::select('modal-type', $statuslabel_types, '', array('class'=>'select2', 'style'=>'width:90%','id' =>'modal-type')) }}</div>
        +            </div>
        +
        +        </div>
        +        <div class="modal-footer">
        +            <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        +            <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        +        </div>
        +    </div><!-- /.modal-content -->
        +</div><!-- /.modal-dialog -->
        diff --git a/resources/views/modals/supplier.blade.php b/resources/views/modals/supplier.blade.php
        new file mode 100644
        index 0000000000..0ab2b977cd
        --- /dev/null
        +++ b/resources/views/modals/supplier.blade.php
        @@ -0,0 +1,22 @@
        +<div class="modal-dialog">
        +    <div class="modal-content">
        +        <div class="modal-header">
        +            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        +            <h4 class="modal-title">{{ trans('admin/suppliers/table.create') }}</h4>
        +        </div>
        +        <div class="modal-body">
        +            <div class="alert alert-danger" id="modal_error_msg" style="display:none">
        +            </div>
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-name">{{ trans('general.name') }}:
        +                    </label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-name' class="form-control"></div>
        +            </div>
        +
        +        </div>
        +        <div class="modal-footer">
        +            <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        +            <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        +        </div>
        +    </div><!-- /.modal-content -->
        +</div><!-- /.modal-dialog -->
        diff --git a/resources/views/modals/user.blade.php b/resources/views/modals/user.blade.php
        new file mode 100644
        index 0000000000..21f490dd9c
        --- /dev/null
        +++ b/resources/views/modals/user.blade.php
        @@ -0,0 +1,66 @@
        +
        +<script src="/js/pGenerator.jquery.js"></script>
        +
        +<script>
        +    $(document).ready(function () {
        +
        +        $('#genPassword').pGenerator({
        +            'bind': 'click',
        +            'passwordElement': '#modal-password',
        +            'displayElement': '#generated-password',
        +            'passwordLength': 16,
        +            'uppercase': true,
        +            'lowercase': true,
        +            'numbers': true,
        +            'specialChars': true,
        +            'onPasswordGenerated': function (generatedPassword) {
        +                $('#modal-password_confirm').val($('#modal-password').val());
        +            }
        +        });
        +    });
        +</script>
        +<div class="modal-dialog">
        +    <div class="modal-content">
        +        <div class="modal-header">
        +            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        +            <h4 class="modal-title">{{ trans('admin/users/table.createuser') }}</h4>
        +        </div>
        +            <div class="modal-body">
        +            <div class="alert alert-danger" id="modal_error_msg" style="display:none">
        +            </div>
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-first_name">{{ trans('general.first_name') }}:</label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-first_name' class="form-control"></div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-last_name">{{ trans('general.last_name') }}:</label></div>
        +                <div class="col-md-8 col-xs-12"><input type='text' id='modal-last_name' class="form-control"> </div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-username">{{ trans('admin/users/table.username') }}:</label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-username' class="form-control"></div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-password">{{ trans('admin/users/table.password') }}:</label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='password' id='modal-password' class="form-control">
        +                    <a href="#" class="left" id="genPassword">Generate</a>
        +                </div>
        +            </div>
        +
        +            <div class="dynamic-form-row">
        +                <div class="col-md-4 col-xs-12"><label for="modal-password_confirm">{{ trans('admin/users/table.password_confirm') }}:</label></div>
        +                <div class="col-md-8 col-xs-12 required"><input type='password' id='modal-password_confirm' class="form-control">
        +                    <div id="generated-password"></div>
        +                </div>
        +            </div>
        +
        +        </div>
        +        <div class="modal-footer">
        +            <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        +            <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        +        </div>
        +    </div><!-- /.modal-content -->
        +</div><!-- /.modal-dialog -->
        diff --git a/resources/views/models/bulk-edit.blade.php b/resources/views/models/bulk-edit.blade.php
        new file mode 100644
        index 0000000000..13d94e64cd
        --- /dev/null
        +++ b/resources/views/models/bulk-edit.blade.php
        @@ -0,0 +1,91 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Bulk Edit
        +    @parent
        +@stop
        +
        +
        +@section('header_right')
        +    <a href="{{ URL::previous() }}" class="btn btn-sm btn-primary pull-right">
        +        {{ trans('general.back') }}</a>
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +    <div class="row">
        +        <div class="col-md-8 col-md-offset-2">
        +
        +
        +
        +
        +            <form class="form-horizontal" method="post" action="{{ route('models.bulkedit.store') }}" autocomplete="off" role="form">
        +                {{ csrf_field() }}
        +
        +                <div class="box box-default">
        +                    <div class="box-body">
        +
        +
        +
        +                        <!-- manufacturer -->
        +                        <div class="form-group {{ $errors->has('manufacturer_id') ? ' has-error' : '' }}">
        +                            <label for="manufacturer_id" class="col-md-3 control-label">
        +                                {{ trans('general.manufacturer') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('manufacturer_id', $manufacturer_list , Input::old('manufacturer_id', 'NC'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('manufacturer_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- category -->
        +                        <div class="form-group {{ $errors->has('category_id') ? ' has-error' : '' }}">
        +                            <label for="category_id" class="col-md-3 control-label">
        +                                {{ trans('general.category') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('category_id', $category_list , Input::old('category_id', 'NC'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('category_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- custom fields -->
        +                        <div class="form-group {{ $errors->has('fieldset_id') ? ' has-error' : '' }}">
        +                            <label for="category_id" class="col-md-3 control-label">
        +                                {{ trans('admin/models/general.fieldset') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('fieldset_id', $fieldset_list , Input::old('fieldset_id', 'NC'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('fieldset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- depreciation -->
        +                        <div class="form-group {{ $errors->has('depreciation_id') ? ' has-error' : '' }}">
        +                            <label for="category_id" class="col-md-3 control-label">
        +                                {{ trans('general.depreciation') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('depreciation_id', $depreciation_list , Input::old('depreciation_id', 'NC'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('depreciation_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +
        +
        +
        +                        @foreach ($models as $model)
        +                            <input type="hidden" name="ids[{{ $model->id }}]" value="{{ $model->id }}">
        +                        @endforeach
        +                    </div> <!--/.box-body-->
        +
        +                    <div class="box-footer text-right">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +                </div> <!--/.box.box-default-->
        +            </form>
        +        </div> <!--/.col-md-8-->
        +    </div>
        +@stop
        diff --git a/resources/views/models/custom_fields_form.blade.php b/resources/views/models/custom_fields_form.blade.php
        index 249b279623..6ddbd3ffa1 100644
        --- a/resources/views/models/custom_fields_form.blade.php
        +++ b/resources/views/models/custom_fields_form.blade.php
        @@ -1,4 +1,4 @@
        -@if($model->fieldset)
        +@if (($model) && ($model->fieldset))
           @foreach($model->fieldset->fields AS $field)
             <div class="form-group{{ $errors->has($field->db_column_name()) ? ' has-error' : '' }}">
               <label for="{{ $field->db_column_name() }}" class="col-md-3 control-label">{{ $field->name }} </label>
        @@ -43,12 +43,16 @@
         
                   @endif
         
        +              @if ($field->help_text!='')
        +              <p class="help-block">{{ $field->help_text }}</p>
        +              @endif
        +
                   <?php
                   $errormessage=$errors->first($field->db_column_name());
                   if ($errormessage) {
                       $errormessage=preg_replace('/ snipeit /', '', $errormessage);
                       print('<span class="alert-msg"><i class="fa fa-times"></i> '.$errormessage.'</span>');
        -            }
        +          }
                     ?>
               </div>
         
        @@ -57,6 +61,8 @@
                     <i class="fa fa-lock" data-toggle="tooltip" data-placement="top" title="{{ trans('admin/custom_fields/general.value_encrypted') }}"></i>
                 </div>
                 @endif
        +
        +
             </div>
           @endforeach
         @endif
        diff --git a/resources/views/models/edit.blade.php b/resources/views/models/edit.blade.php
        index f55071615e..74325c8885 100755
        --- a/resources/views/models/edit.blade.php
        +++ b/resources/views/models/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/models/table.create') ,
             'updateText' => trans('admin/models/table.update'),
             'helpTitle' => trans('admin/models/general.about_models_title'),
        -    'helpText' => trans('admin/models/general.about_models_text')
        +    'helpText' => trans('admin/models/general.about_models_text'),
        +    'formAction' => ($item) ? route('models.update', ['model' => $item->id]) : route('models.store'),
         ])
         
         {{-- Page content --}}
        @@ -49,7 +50,7 @@
             <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label>
             <div class="col-md-5">
                 {{ Form::checkbox('image_delete') }}
        -        <img src="{{ config('app.url') }}/uploads/models/{{ $item->image }}" />
        +        <img src="{{ url('/') }}/uploads/models/{{ $item->image }}" />
                 {!! $errors->first('image_delete', '<span class="alert-msg"><br>:message</span>') !!}
             </div>
         </div>
        diff --git a/resources/views/models/index.blade.php b/resources/views/models/index.blade.php
        index 71c9a2c990..b9b65629c8 100755
        --- a/resources/views/models/index.blade.php
        +++ b/resources/views/models/index.blade.php
        @@ -8,13 +8,8 @@
         
         {{-- Page title --}}
         @section('header_right')
        -  @if(Input::get('status')=='Deleted')
        -      <a href="{{ URL::to('hardware/models') }}" class="btn btn-default pull-right" style="margin-right:5px;"><i class="fa fa-trash"></i>  {{ trans('admin/models/general.view_models') }}</a>
        -  @else
        -      <a href="{{ route('create/model') }}" class="btn btn-primary pull-right">
        -      {{ trans('general.create') }}</a>
        -      <a href="{{ URL::to('hardware/models?status=Deleted') }}" class="btn btn-default pull-right" style="margin-right:5px;"><i class="fa fa-trash"></i>  {{ trans('admin/models/general.view_deleted') }}</a>
        -  @endif
        +  <a href="{{ route('models.create') }}" class="btn btn-primary pull-right"></i> {{ trans('general.create') }}</a>
        +  <a href="{{ url('hardware/models?status=Deleted') }}" class="btn btn-default pull-right" style="margin-right:5px;"><i class="fa fa-trash"></i>  {{ trans('admin/models/general.view_deleted') }}</a>
         @stop
         
         
        @@ -26,39 +21,58 @@
           <div class="col-md-12">
             <div class="box box-default">
               <div class="box-body">
        +        {{ Form::open([
        +          'method' => 'POST',
        +          'route' => ['models.bulkedit.index'],
        +          'class' => 'form-inline',
        +           'id' => 'bulkForm']) }}
        +        <div class="row">
        +          <div class="col-md-12">
        +              <div id="toolbar">
        +                <select name="bulk_actions" class="form-control select2" style="width: 300px;">
        +                  <option value="edit">Bulk Edit</option>
        +                </select>
        +                <button class="btn btn-primary" id="bulkEdit" disabled>Go</button>
        +              </div>
        +
        +
        +
                 <table
                 name="models"
                 class="table table-striped snipe-table"
                 id="table"
        -        data-url="{{ route('api.models.list',array('status'=>e(Input::get('status')))) }}"
        +        data-url="{{ route('api.models.index') }}"
                 data-cookie="true"
                 data-click-to-select="true"
                 data-cookie-id-table="modelsTable-{{ config('version.hash_version') }}">
                   <thead>
                     <tr>
        +              <th data-checkbox="true" data-field="checkbox"></th>
                       <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -              <th data-sortable="true" data-field="image"  data-visible="false">{{ trans('admin/hardware/table.image') }}</th>
        -              <th data-sortable="false" data-field="manufacturer">{{ trans('general.manufacturer') }}</th>
        -              <th data-sortable="true" data-field="name">{{ trans('admin/models/table.title') }}</th>
        -              <th data-sortable="true" data-field="modelnumber">{{ trans('admin/models/table.modelnumber') }}</th>
        -              <th data-sortable="false" data-field="numassets">{{ trans('admin/models/table.numassets') }}</th>
        -              <th data-sortable="false" data-field="depreciation">{{ trans('general.depreciation') }}</th>
        -              <th data-sortable="false" data-field="category">{{ trans('general.category') }}</th>
        +              <th data-sortable="true" data-field="name" data-formatter="modelsLinkFormatter">{{ trans('general.name') }}</th>
        +              <th data-sortable="true" data-field="image" data-formatter="imageFormatter" data-visible="false">{{ trans('admin/hardware/table.image') }}</th>
        +              <th data-sortable="true" data-field="manufacturer" data-formatter="manufacturersLinkObjFormatter">{{ trans('general.manufacturer') }}</th>
        +              <th data-sortable="true" data-field="model_number">{{ trans('admin/models/table.modelnumber') }}</th>
        +              <th data-sortable="false" data-field="assets_count">{{ trans('admin/models/table.numassets') }}</th>
        +              <th data-sortable="false" data-field="depreciation" data-formatter="depreciationsLinkObjFormatter">{{ trans('general.depreciation') }}</th>
        +              <th data-sortable="false" data-field="category" data-formatter="categoriesLinkObjFormatter">{{ trans('general.category') }}</th>
                       <th data-sortable="true" data-field="eol">{{ trans('general.eol') }}</th>
        -              <th data-sortable="false" data-field="fieldset">{{ trans('admin/models/general.fieldset') }}</th>
        -              <th data-sortable="false" data-field="note">{{ trans('general.notes') }}</th>
        -              <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +              <th data-sortable="false" data-field="fieldset" data-formatter="fieldsetsLinkObjFormatter">{{ trans('admin/models/general.fieldset') }}</th>
        +              <th data-sortable="true" data-field="notes">{{ trans('general.notes') }}</th>
        +              <th data-switchable="false" data-formatter="modelsActionsFormatter" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
                     </tr>
                   </thead>
                 </table>
        +              {{ Form::close() }}
        +          </div>
        +        </div>
               </div><!-- /.box-body -->
             </div><!-- /.box -->
        -
        -
           </div>
         </div>
         
         @stop
        +
         @section('moar_scripts')
         @include ('partials.bootstrap-table', ['exportFile' => 'models-export', 'search' => true])
         
        diff --git a/resources/views/models/view.blade.php b/resources/views/models/view.blade.php
        index 44409fd221..c285eb2185 100755
        --- a/resources/views/models/view.blade.php
        +++ b/resources/views/models/view.blade.php
        @@ -8,118 +8,144 @@
         @stop
         
         @section('header_right')
        -    @can('superuser')
        +  @can('superuser')
           <div class="btn-group pull-right">
              <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
                   <span class="caret"></span>
               </button>
               <ul class="dropdown-menu">
                   @if ($model->deleted_at=='')
        -              <li><a href="{{ route('update/model', $model->id) }}">{{ trans('admin/models/table.edit') }}</a></li>
        -              <li><a href="{{ route('clone/model', $model->id) }}">{{ trans('admin/models/table.clone') }}</a></li>
        -              <li><a href="{{ route('create/hardware', $model->id) }}">{{ trans('admin/hardware/form.create') }}</a></li>
        +            <li><a href="{{ route('models.edit', $model->id) }}">{{ trans('admin/models/table.edit') }}</a></li>
        +            <li><a href="{{ route('clone/model', $model->id) }}">{{ trans('admin/models/table.clone') }}</a></li>
        +            <li><a href="{{ route('hardware.create', ['model_id' => $model->id]) }}">{{ trans('admin/hardware/form.create') }}</a></li>
                   @else
        -              <li><a href="{{ route('restore/model', $model->id) }}">{{ trans('admin/models/general.restore') }}</a></li>
        +            <li><a href="{{ route('restore/model', $model->id) }}">{{ trans('admin/models/general.restore') }}</a></li>
                   @endif
               </ul>
           </div>
        -    @endcan
        +  @endcan
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -  <div class="row">
        -    <div class="col-md-9">
        -      <div class="box box-default">
        -
        -          @if ($model->id)
        -            <div class="box-header with-border">
        -              <div class="box-heading">
        -                <h3 class="box-title"> {{ $model->name }}</h3>
        -              </div>
        -            </div><!-- /.box-header -->
        -          @endif
        -
        -
        -        <div class="box-body">
        -          <table
        -          name="modelassets"
        -          id="table"
        -          class="snipe-table"
        -          data-url="{{route('api.models.view', $model->id)}}"
        -          data-cookie="true"
        -          data-click-to-select="true"
        -          data-cookie-id-table="modeldetailsViewTable">
        -                <thead>
        -                    <tr>
        -
        -                        <th data-sortable="false" data-field="companyName" data-searchable="false" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
        -                        <th data-sortable="true" data-field="id" data-searchable="false" data-visible="false">{{ trans('general.id') }}</th>
        -                        <th data-sortable="true" data-field="name" data-searchable="true">{{ trans('general.name') }}</th>
        -                        <th data-sortable="true" data-field="asset_tag">{{ trans('general.asset_tag') }}</th>
        -                        <th data-sortable="true" data-field="serial">{{ trans('admin/hardware/table.serial') }}</th>
        -                        <th data-sortable="false" data-field="assigned_to">{{ trans('general.user') }}</th>
        -                        <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        -                    </tr>
        -                </thead>
        -            </table>
        -        </div>
        -  </div>
        -</div>
        +<div class="row">
        +  <div class="col-md-9">
        +    <div class="box box-default">
        +      @if ($model->id)
        +        <div class="box-header with-border">
        +          <div class="box-heading">
        +            <h3 class="box-title"> {{ $model->name }}</h3>
        +          </div>
        +        </div><!-- /.box-header -->
        +      @endif
        +      <div class="box-body">
        +        <table
        +        name="modelassets"
        +        id="table"
        +        class="snipe-table"
        +        data-url="{{ route('api.assets.index',['model_id'=> $model->id]) }}"
        +        data-cookie="true"
        +        data-click-to-select="true"
        +        data-cookie-id-table="modeldetailsViewTable">
        +          <thead>
        +              <tr>
        +                  <th data-sortable="true" data-field="id" data-searchable="false" data-visible="false">{{ trans('general.id') }}</th>
        +                  <th data-sortable="false" data-field="company" data-searchable="false" data-visible="false" data-formatter="companiesLinkObjFormatter">{{ trans('admin/companies/table.title') }}</th>
        +                  <th data-sortable="true" data-field="name"  data-searchable="true" data-formatter="hardwareLinkFormatter">{{ trans('general.name') }}</th>
        +                  <th data-sortable="true" data-field="asset_tag" data-formatter="hardwareLinkFormatter">{{ trans('general.asset_tag') }}</th>
        +                  <th data-sortable="true" data-field="serial" data-formatter="hardwareLinkFormatter">{{ trans('admin/hardware/table.serial') }}</th>
        +                  <th data-sortable="false" data-field="assigned_to" data-formatter="polymorphicItemFormatter">{{ trans('general.user') }}</th>
        +                  <th data-sortable="false" data-field="inout" data-formatter="hardwareInOutFormatter">{{ trans('admin/hardware/table.change') }}</th>
        +                  <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" data-formatter="hardwareActionsFormatter">{{ trans('table.actions') }}</th>
        +              </tr>
        +          </thead>
        +        </table>
        +      </div> <!-- /.box-body-->
        +    </div> <!-- /.box-default-->
        +  </div> <!-- /.col-md-9-->
         
           <!-- side address column -->
           <div class="col-md-3">
        -  <h4>More Info:</h4>
        +    <h4>More Info:</h4>
             <ul class="list-unstyled">
        -
               @if ($model->manufacturer)
        -      <li>{{ trans('general.manufacturer') }}:
        -      {{ $model->manufacturer->name }}</li>
        +      <li>
        +        {{ trans('general.manufacturer') }}:
        +      @can('view', \App\Models\Manufacturer::class)
        +          <a href="{{ route('manufacturers.show', $model->manufacturer->id) }}">
        +              {{ $model->manufacturer->name }}
        +          </a>
        +      @else
        +          {{ $model->manufacturer->name }}
        +      @endcan
        +      </li>
               @endif
        +          @if ($model->manufacturer->url)
        +              <li>
        +                  <i class="fa fa-globe"></i> <a href="{{ $model->manufacturer->url }}">{{ $model->manufacturer->url }}</a>
        +              </li>
        +          @endif
        +
        +          @if ($model->manufacturer->support_url)
        +              <li>
        +                  <i class="fa fa-life-ring"></i> <a href="{{ $model->manufacturer->support_url }}">{{ $model->manufacturer->support_url }}</a>
        +              </li>
        +          @endif
        +
        +          @if ($model->manufacturer->support_phone)
        +              <li>
        +                  <i class="fa fa-phone"></i> {{ $model->manufacturer->support_phone }}
        +              </li>
        +          @endif
        +
        +          @if ($model->manufacturer->support_email)
        +              <li>
        +                  <i class="fa fa-envelope"></i> <a href="mailto:{{ $model->manufacturer->support_email }}">{{ $model->manufacturer->support_email }}</a>
        +              </li>
        +          @endif
         
               @if ($model->model_number)
        -      <li>{{ trans('general.model_no') }}:
        -      {{ $model->model_number }}</li>
        +      <li>
        +        {{ trans('general.model_no') }}:
        +        {{ $model->model_number }}
        +      </li>
               @endif
         
               @if ($model->depreciation)
        -      <li>{{ trans('general.depreciation') }}:
        -      {{ $model->depreciation->name }} ({{ $model->depreciation->months }}
        -      {{ trans('general.months') }}
        -      )</li>
        +      <li>
        +        {{ trans('general.depreciation') }}:
        +        {{ $model->depreciation->name }} ({{ $model->depreciation->months.' '.trans('general.months')}})
        +      </li>
               @endif
         
               @if ($model->eol)
               <li>{{ trans('general.eol') }}:
        -      {{ $model->eol }}
        -      {{ trans('general.months') }}</li>
        +        {{ $model->eol .' '. trans('general.months') }}
        +      </li>
               @endif
         
               @if ($model->fieldset)
               <li>{{ trans('admin/models/general.fieldset') }}:
        -          <a href="{{ config('app.url') }}/admin/custom_fields/{{ $model->fieldset->id }}">{{ $model->fieldset->name }}</a>
        +        <a href="{{ route('fieldsets.show', $model->fieldset->id) }}">{{ $model->fieldset->name }}</a>
               </li>
        -
               @endif
         
               @if ($model->image)
        -      <li><br /><img src="{{ config('app.url') }}/uploads/models/{{ $model->image }}" class="img-responsive"></li>
        +      <li><br /><img src="{{ url('/') }}/uploads/models/{{ $model->image }}" class="img-responsive"></li>
               @endif
         
               @if  ($model->deleted_at!='')
        -         <li><br /><a href="{{ route('restore/model', $model->id) }}" class="btn-flat large info ">{{ trans('admin/models/general.restore') }}</a></li>
        -
        -  	@endif
        -
        +       <li><br /><a href="{{ route('restore/model', $model->id) }}" class="btn-flat large info ">{{ trans('admin/models/general.restore') }}</a></li>
        +      @endif
             </ul>
         
             @if ($model->note)
        -    Notesd:
        -    <p>{!! $model->getNote() !!}
        +    Notes:
        +    <p>
        +      {!! $model->present()->note() !!}
             </p>
             @endif
        -
           </div>
         </div>
         @stop
        diff --git a/resources/views/partials/bootstrap-table.blade.php b/resources/views/partials/bootstrap-table.blade.php
        index 385b84690e..4ea74216ed 100644
        --- a/resources/views/partials/bootstrap-table.blade.php
        +++ b/resources/views/partials/bootstrap-table.blade.php
        @@ -1,44 +1,90 @@
         {{-- This Will load our default bootstrap-table settings on any table with a class of "snipe-table" and export it to the passed 'exportFile' name --}}
        -<script src="{{ asset('assets/js/bootstrap-table.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/bootstrap-table-export.js?v=1') }}"></script>
        -<script src="{{ asset('assets/js/extensions/cookie/bootstrap-table-cookie.js?v=1') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/tableExport.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/jquery.base64.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.js') }}"></script>
        +<script src="{{ asset('js/bootstrap-table.js') }}"></script>
        +<script src="{{ asset('js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        +
        +@if (!isset($simple_view))
        +<script src="{{ asset('js/extensions/export/bootstrap-table-export.js?v=1') }}"></script>
        +<script src="{{ asset('js/extensions/cookie/bootstrap-table-cookie.js?v=1') }}"></script>
        +<script src="{{ asset('js/extensions/export/tableExport.js') }}"></script>
        +<script src="{{ asset('js/FileSaver.min.js') }}"></script>
        +<script src="{{ asset('js/jspdf.min.js') }}"></script>
        +<script src="{{ asset('js/jspdf.plugin.autotable.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/jquery.base64.js') }}"></script>
        +<script src="{{ asset('js/extensions/toolbar/bootstrap-table-toolbar.js') }}"></script>
        +@endif
        +
         <script>
         $('.snipe-table').bootstrapTable({
                 classes: 'table table-responsive table-no-bordered',
                 undefinedText: '',
                 iconsPrefix: 'fa',
        -        showRefresh: true,
        +
                 @if (isset($search))
        -        search: true,
        +            search: true,
                 @endif
        -        pageSize: {{ $snipeSettings->per_page }},
        -        pagination: true,
        +
        +
        +        paginationVAlign: 'both',
                 sidePagination: 'server',
                 sortable: true,
        +
        +
        +       @if (!isset($simple_view))
        +
        +        showRefresh: true,
        +        pagination: true,
        +        pageSize: {{ $snipeSettings->per_page }},
        +
                 cookie: true,
                 cookieExpire: '2y',
        -        mobileResponsive: true,
        -        @if (isset($multiSort))
        -        showMultiSort: true,
        -        @endif
                 showExport: true,
                 showColumns: true,
        -        exportDataType: 'all',
        -        exportTypes: ['csv', 'excel', 'txt','json', 'xml'],
        -        exportOptions: {
        -            fileName: '{{ $exportFile . "-" }}' + (new Date()).toISOString().slice(0,10),
        -        },
        +        trimOnSearch: false,
        +
        +            @if (isset($multiSort))
        +            showMultiSort: true,
        +            @endif
        +
        +            @if (isset($exportFile))
        +            exportDataType: 'all',
        +            exportTypes: ['csv', 'excel', 'doc', 'txt','json', 'xml', 'pdf'],
        +            exportOptions: {
        +
        +                fileName: '{{ $exportFile . "-" }}' + (new Date()).toISOString().slice(0,10),
        +                ignoreColumn: ['actions','change','checkbox','checkincheckout','icon'],
        +                worksheetName: "Snipe-IT Export",
        +                jspdf: {
        +                    autotable: {
        +                        styles: {
        +                            rowHeight: 20,
        +                            fontSize: 10,
        +                            overflow: 'linebreak',
        +                        },
        +                        headerStyles: {fillColor: 255, textColor: 0},
        +                        //alternateRowStyles: {fillColor: [60, 69, 79], textColor: 255}
        +                    }
        +                }
        +            },
        +            @endif
        +
        +        @endif
        +
        +        @if (isset($columns))
        +            columns: {!! $columns !!},
        +        @endif
        +
        +        mobileResponsive: true,
                 maintainSelected: true,
                 paginationFirstText: "{{ trans('general.first') }}",
                 paginationLastText: "{{ trans('general.last') }}",
                 paginationPreText: "{{ trans('general.previous') }}",
                 paginationNextText: "{{ trans('general.next') }}",
        -        pageList: ['10','25','50','100','150','200'],
        +        formatLoadingMessage: function () {
        +            return '<h4><i class="fa fa-spinner fa-spin" aria-hidden="true"></i> Loading... please wait.... </h4>';
        +        },
        +        pageList: ['30','50','100','150','200','500','1000'],
                 icons: {
        +            advancedSearchIcon: 'fa fa-search-plus',
                     paginationSwitchDown: 'fa-caret-square-o-down',
                     paginationSwitchUp: 'fa-caret-square-o-up',
                     columns: 'fa-columns',
        @@ -51,4 +97,283 @@ $('.snipe-table').bootstrapTable({
                 },
         
             });
        +
        +
        +    function dateRowCheckStyle(value) {
        +        if ((value.days_to_next_audit) && (value.days_to_next_audit < {{ $snipeSettings->audit_warning_days ?: 0 }})) {
        +            return { classes : "danger" }
        +        }
        +        return {};
        +    }
        +
        +
        +    // Handle whether or not the edit button should be disabled
        +    $('.snipe-table').on('check.bs.table', function () {
        +        $('#bulkEdit').removeAttr('disabled');
        +    });
        +
        +    $('.snipe-table').on('check-all.bs.table', function () {
        +        $('#bulkEdit').removeAttr('disabled');
        +    });
        +
        +    $('.snipe-table').on('uncheck.bs.table', function () {
        +        if ($('.snipe-table').bootstrapTable('getSelections').length == 0) {
        +            $('#bulkEdit').attr('disabled', 'disabled');
        +        }
        +    });
        +
        +    $('.snipe-table').on('uncheck-all.bs.table', function (e, row) {
        +        $('#bulkEdit').attr('disabled', 'disabled');
        +    });
        +
        +
        +    // This only works for model index pages because it uses the row's model ID
        +    function genericRowLinkFormatter(destination) {
        +        return function (value,row) {
        +            if (value) {
        +                return '<a href="{{ url('/') }}/' + destination + '/' + row.id + '"> ' + value + '</a>';
        +            }
        +        };
        +    }
        +
        +    // Use this when we're introspecting into a column object and need to link
        +    function genericColumnObjLinkFormatter(destination) {
        +        return function (value,row) {
        +            if ((value) && (value.name)) {
        +                return '<a href="{{ url('/') }}/' + destination + '/' + value.id + '"> ' + value.name + '</a>';
        +            }
        +        };
        +    }
        +
        +    // Make the edit/delete buttons
        +    function genericActionsFormatter(destination) {
        +        return function (value,row) {
        +
        +            var actions = '<nobr>';
        +
        +            if ((row.available_actions) && (row.available_actions.clone === true)) {
        +                actions += '<a href="{{ url('/') }}/' + destination + '/' + row.id + '/clone" class="btn btn-sm btn-info" data-tooltip="true" title="Clone"><i class="fa fa-copy"></i></a>&nbsp;';
        +            }
        +
        +            if ((row.available_actions) && (row.available_actions.update === true)) {
        +                actions += '<a href="{{ url('/') }}/' + destination + '/' + row.id + '/edit" class="btn btn-sm btn-warning" data-tooltip="true" title="Update"><i class="fa fa-pencil"></i></a>&nbsp;';
        +            }
        +
        +            if ((row.available_actions) && (row.available_actions.delete === true)) {
        +                actions += '<a href="{{ url('/') }}/' + destination + '/' + row.id + '" '
        +                    + ' class="btn btn-danger btn-sm delete-asset"  data-tooltip="true"  '
        +                    + ' data-toggle="modal" '
        +                    + ' data-content="{{ trans('general.sure_to_delete') }} ' + row.name + '?" '
        +                    + ' data-title="{{  trans('general.delete') }}" onClick="return false;">'
        +                    + '<i class="fa fa-trash"></i></a></nobr>';
        +            }
        +
        +            if ((row.available_actions) && (row.available_actions.restore === true)) {
        +                actions += '<a href="{{ url('/') }}/' + destination + '/' + row.id + '/restore" class="btn btn-sm btn-warning" data-tooltip="true" title="Restore"><i class="fa fa-retweet"></i></a>&nbsp;';
        +            }
        +            return actions;
        +
        +        };
        +    }
        +
        +
        +    // This handles
        +    function polymorphicItemFormatter(value) {
        +
        +        var item_destination = '';
        +
        +        if ((value) && (value.type)) {
        +
        +            if (value.type == 'asset') {
        +                item_destination = 'hardware';
        +            } else if (value.type == 'accessory') {
        +                item_destination = 'accessories';
        +            } else if (value.type == 'component') {
        +                item_destination = 'components';
        +            } else if (value.type == 'consumable') {
        +                item_destination = 'consumables';
        +            } else if (value.type == 'license') {
        +                item_destination = 'licenses';
        +            } else if (value.type == 'user') {
        +                item_destination = 'users';
        +            } else if (value.type == 'location') {
        +                item_destination = 'locations'
        +            }
        +
        +            return '<a href="{{ url('/') }}/' + item_destination +'/' + value.id + '"> ' + value.name + '</a>';
        +
        +        } else {
        +            return '';
        +        }
        +
        +
        +    }
        +
        +
        +    function genericCheckinCheckoutFormatter(destination) {
        +        return function (value,row) {
        +
        +            // The user is allowed to check items out, AND the item is deployable
        +            if ((row.available_actions.checkout == true) && (row.user_can_checkout == true) && (!row.assigned_to)) {
        +                return '<a href="{{ url('/') }}/' + destination + '/' + row.id + '/checkout" class="btn btn-sm btn-primary" data-tooltip="true" title="Check this item out to a user">{{ trans('general.checkout') }}</a>';
        +
        +            // The user is allowed to check items out, but the item is not deployable
        +            } else if (((row.user_can_checkout == false)) && (row.available_actions.checkout == true) && (!row.assigned_to)) {
        +                return '<div  data-tooltip="true" title="This item has a status label that is undeployable and cannot be checked out at this time."><a class="btn btn-sm btn-primary disabled">{{ trans('general.checkout') }}</a></div>';
        +
        +            // The user is allowed to check items in
        +            } else if ((row.available_actions.checkin == true)  && (row.assigned_to)) {
        +                return '<nobr><a href="{{ url('/') }}/' + destination + '/' + row.id + '/checkin" class="btn btn-sm btn-primary" data-tooltip="true" title="Check this item in so it is available for re-imaging, re-issue, etc.">{{ trans('general.checkin') }}</a>';
        +
        +            }
        +
        +        }
        +
        +
        +    }
        +
        +
        +
        +    var formatters = [
        +        'hardware',
        +        'accessories',
        +        'consumables',
        +        'components',
        +        'locations',
        +        'users',
        +        'manufacturers',
        +        'statuslabels',
        +        'models',
        +        'licenses',
        +        'categories',
        +        'suppliers',
        +        'departments',
        +        'companies',
        +        'depreciations',
        +        'fieldsets',
        +        'groups'
        +    ];
        +
        +    for (var i in formatters) {
        +        window[formatters[i] + 'LinkFormatter'] = genericRowLinkFormatter(formatters[i]);
        +        window[formatters[i] + 'LinkObjFormatter'] = genericColumnObjLinkFormatter(formatters[i]);
        +        window[formatters[i] + 'ActionsFormatter'] = genericActionsFormatter(formatters[i]);
        +        window[formatters[i] + 'InOutFormatter'] = genericCheckinCheckoutFormatter(formatters[i]);
        +    }
        +
        +
        +    // This is  gross, but necessary so that we can package the API response
        +    // for custom fields in a more useful way.
        +    function customFieldsFormatter(value, row) {
        +
        +            var field_column = this.title;
        +
        +            // Pull out any HTMl that might be passed via the presenter
        +            // (for example, the locked icon for encrypted fields)
        +            var field_column_plain = field_column.replace(/<(?:.|\n)*?> ?/gm, '');
        +            if ((row.custom_fields) && (row.custom_fields[field_column_plain])) {
        +                return row.custom_fields[field_column_plain].value;
        +            }
        +
        +    }
        +
        +
        +    function createdAtFormatter(value) {
        +        if ((value) && (value.date)) {
        +            return value.date;
        +        }
        +    }
        +
        +    function trueFalseFormatter(value, row) {
        +        if ((value) && ((value == 'true') || (value == '1'))) {
        +            return '<i class="fa fa-check text-success"></i>';
        +        } else {
        +            return '<i class="fa fa-times text-danger"></i>';
        +        }
        +    }
        +
        +    function dateDisplayFormatter(value, row) {
        +        if (value) {
        +            return  value.formatted;
        +        }
        +    }
        +
        +    function iconFormatter(value, row) {
        +        if (value) {
        +            return '<i class="' + value + '"></i>';
        +        }
        +    }
        +
        +    function emailFormatter(value, row) {
        +        if (value) {
        +            return '<a href="mailto:' + value + '"> ' + value + '</a>';
        +        }
        +    }
        +
        +    function linkFormatter(value, row) {
        +        if (value) {
        +            return '<a href="' + value + '"> ' + value + '</a>';
        +        }
        +    }
        +
        +    function assetCompanyFilterFormatter(value, row) {
        +        if (value) {
        +            return '<a href="{{ url('/') }}/hardware/?company_id=' + row.id + '"> ' + value + '</a>';
        +        }
        +    }
        +
        +    function assetCompanyObjFilterFormatter(value, row) {
        +        if (row.company) {
        +            return '<a href="{{ url('/') }}/hardware/?company_id=' + row.company.id + '"> ' + row.company.name + '</a>';
        +        }
        +    }
        +
        +    function usersCompanyObjFilterFormatter(value, row) {
        +        if (value) {
        +            return '<a href="{{ url('/') }}/users/?company_id=' + row.id + '"> ' + value + '</a>';
        +        } else {
        +            return value;
        +        }
        +    }
        +
        +    function employeeNumFormatter(value, row) {
        +
        +        if ((row.assigned_to) && ((row.assigned_to.employee_number))) {
        +            return '<a href="{{ url('/') }}/users/' + row.assigned_to.id + '"> ' + row.assigned_to.employee_number + '</a>';
        +        }
        +    }
        +
        +    function orderNumberObjFilterFormatter(value, row) {
        +        if (value) {
        +            return '<a href="{{ url('/') }}/hardware/?order_number=' + row.order_number + '"> ' + row.order_number + '</a>';
        +        }
        +    }
        +
        +
        +   function imageFormatter(value, row) {
        +        if (value) {
        +            return '<img src="' + value + '" style="max-height: {{ $snipeSettings->thumbnail_max_h }}px; width: auto;">';
        +        }
        +    }
        +
        +    $(function () {
        +        $('#bulkEdit').click(function () {
        +            var selectedIds = $('.snipe-table').bootstrapTable('getSelections');
        +            $.each(selectedIds, function(key,value) {
        +                $( "#bulkForm" ).append($('<input type="hidden" name="ids[' + value.id + ']" value="' + value.id + '">' ));
        +            });
        +
        +        });
        +    });
        +
        +    // This is necessary to make the bootstrap tooltips work inside of the wenzhixin/bootstrap-table formatters
        +    $(function() {
        +        $('#table').on('post-body.bs.table', function () {
        +            $('[data-tooltip="true"]').tooltip({
        +                container: 'body'
        +            });
        +        });
        +    });
        +
        +
         </script>
        diff --git a/resources/views/partials/forms/edit/purchase_date.blade.php b/resources/views/partials/forms/edit/purchase_date.blade.php
        index 188eb11498..6e721bcbe5 100644
        --- a/resources/views/partials/forms/edit/purchase_date.blade.php
        +++ b/resources/views/partials/forms/edit/purchase_date.blade.php
        @@ -2,10 +2,11 @@
         <div class="form-group {{ $errors->has('purchase_date') ? ' has-error' : '' }}">
            <label for="purchase_date" class="col-md-3 control-label">{{ trans('general.purchase_date') }}</label>
            <div class="input-group col-md-3">
        -        <div class="input-group">
        -            <input type="text" class="datepicker form-control" data-date-format="yyyy-mm-dd" placeholder="{{ trans('general.select_date') }}" name="purchase_date" id="purchase_date" value="{{ Input::old('purchase_date', $item->purchase_date) }}">
        +        <div class="input-group date" data-provide="datepicker" data-date-format="yyyy-mm-dd"  data-autoclose="true">
        +            <input type="text" class="form-control" placeholder="{{ trans('general.select_date') }}" name="purchase_date" id="purchase_date" value="{{ Input::old('purchase_date', $item->purchase_date) }}">
                     <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
                </div>
                {!! $errors->first('purchase_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
            </div>
        -</div>
        \ No newline at end of file
        +</div>
        +
        diff --git a/resources/views/partials/forms/edit/status.blade.php b/resources/views/partials/forms/edit/status.blade.php
        index a00d7c1e60..64108b1d1f 100644
        --- a/resources/views/partials/forms/edit/status.blade.php
        +++ b/resources/views/partials/forms/edit/status.blade.php
        @@ -6,7 +6,7 @@
                 {!! $errors->first('status_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
             </div>
             <div class="col-md-1 col-sm-1 text-left">
        -        <a href='#' data-toggle="modal"  data-target="#createModal" data-dependency='statuslabel' data-select='status_select_id' class="btn btn-sm btn-default">New</a>
        +        <a href='{{ route('modal.statuslabel') }}' data-toggle="modal"  data-target="#createModal" data-dependency='statuslabel' data-select='status_select_id' class="btn btn-sm btn-default">New</a>
                 <span class="status_spinner" style="padding-left: 10px; color: green; display:none; width: 30px;"><i class="fa fa-spinner fa-spin"></i> </span>
             </div>
             <div class="col-md-7 col-sm-11 col-md-offset-3">
        diff --git a/resources/views/partials/forms/edit/supplier.blade.php b/resources/views/partials/forms/edit/supplier.blade.php
        index 3b82bbcb13..ab1e660212 100644
        --- a/resources/views/partials/forms/edit/supplier.blade.php
        +++ b/resources/views/partials/forms/edit/supplier.blade.php
        @@ -2,10 +2,10 @@
         <div class="form-group {{ $errors->has('supplier_id') ? ' has-error' : '' }}">
             <label for="supplier_id" class="col-md-3 control-label">{{ trans('general.supplier') }}</label>
             <div class="col-md-7{{  (\App\Helpers\Helper::checkIfRequired($item, 'supplier_id')) ? ' required' : '' }}">
        -        {{ Form::select('supplier_id', $supplier_list , Input::old('supplier_id', $item->supplier_id), ['class'=>'select2', 'style'=>'min-width:350px']) }}
        +        {{ Form::select('supplier_id', $supplier_list , Input::old('supplier_id', $item->supplier_id), ['class'=>'select2', 'style'=>'min-width:350px', 'id' => 'supplier_select_id']) }}
                 {!! $errors->first('supplier_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
             </div>
             <div class="col-md-1 col-sm-1 text-left">
        -             <a href='#' data-toggle="modal"  data-target="#createModal" data-dependency="supplier" data-select='supplier_select_id' class="btn btn-sm btn-default">New</a>
        +             <a href='{{ route('modal.supplier') }}' data-toggle="modal"  data-target="#createModal" data-dependency="supplier" data-select='supplier_select_id' class="btn btn-sm btn-default">New</a>
             </div>
         </div>
        diff --git a/resources/views/partials/modals.blade.php b/resources/views/partials/modals.blade.php
        deleted file mode 100644
        index 9240611427..0000000000
        --- a/resources/views/partials/modals.blade.php
        +++ /dev/null
        @@ -1,90 +0,0 @@
        -{{-- Some room for the modals --}}
        -<div class="modal fade" id="createModal">
        -    <div class="modal-dialog">
        -        <div class="modal-content">
        -            <div class="modal-header">
        -                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        -                <h4 class="modal-title">Modal title</h4>
        -            </div>
        -            <div class="modal-body">
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-name">{{ trans('general.name') }}:
        -                        </label></div>
        -                    <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-name' class="form-control"></div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-manufacturer_id">{{ trans('general.manufacturer') }}:
        -                        </label></div>
        -                    <div class="col-md-8 col-xs-12 required">{{ Form::select('modal-manufacturer', $manufacturer , '', array('class'=>'select2 parent', 'style'=>'width:100%','id' =>'modal-manufacturer_id')) }}</div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-category_id">{{ trans('general.category') }}:
        -                        </label></div>
        -                    <div class="col-md-8 col-xs-12 required">{{ Form::select('modal-category', $category ,'', array('class'=>'select2 parent', 'style'=>'width:100%','id' => 'modal-category_id')) }}</div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-model_number">{{ trans('general.model_no') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12"><input type='text' id='modal-model_number' class="form-control"></div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-statuslabel_types">{{ trans('admin/statuslabels/table.status_type') }}:
        -                        </label></div>
        -                    <div class="col-md-8 col-xs-12 required">{{ Form::select('modal-statuslabel_types', $statuslabel_types, '', array('class'=>'select2', 'style'=>'width:90%','id' =>'modal-statuslabel_types')) }}</div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-city">{{ trans('general.city') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-city' class="form-control"></div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12 country"><label for="modal-country">{{ trans('general.country') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12">{!! Form::countries('country', Input::old('country'), 'select2 country',"modal-country") !!}</div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-fieldset_id">{{ trans('admin/models/general.fieldset') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12">{{ Form::select('custom_fieldset', \App\Helpers\Helper::customFieldsetList(),Input::old('custom_fieldset'), array('class'=>'select2', 'id'=>'modal-fieldset_id', 'style'=>'width:350px')) }}</div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-first_name">{{ trans('general.first_name') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-first_name' class="form-control"></div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-last_name">{{ trans('general.last_name') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12"><input type='text' id='modal-last_name' class="form-control"> </div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-username">{{ trans('admin/users/table.username') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12 required"><input type='text' id='modal-username' class="form-control"></div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-password">{{ trans('admin/users/table.password') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12 required"><input type='password' id='modal-password' class="form-control">
        -                        <a href="#" class="left" id="genPassword">Generate</a>
        -                    </div>
        -                </div>
        -
        -                <div class="dynamic-form-row">
        -                    <div class="col-md-4 col-xs-12"><label for="modal-password_confirm">{{ trans('admin/users/table.password_confirm') }}:</label></div>
        -                    <div class="col-md-8 col-xs-12 required"><input type='password' id='modal-password_confirm' class="form-control">
        -                        <div id="generated-password"></div>
        -                    </div>
        -                </div>
        -
        -            </div>
        -            <div class="modal-footer">
        -                <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
        -                <button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
        -            </div>
        -        </div><!-- /.modal-content -->
        -    </div><!-- /.modal-dialog -->
        -</div><!-- /.modal -->
        diff --git a/resources/views/reports/accessories.blade.php b/resources/views/reports/accessories.blade.php
        index 7cfa2df2ab..60fd8354c6 100644
        --- a/resources/views/reports/accessories.blade.php
        +++ b/resources/views/reports/accessories.blade.php
        @@ -9,56 +9,51 @@
         {{-- Page content --}}
         @section('content')
         
        -
         <div class="row">
        -  <div class="col-md-12">
        +    <div class="col-md-12">
        +        <div class="box box-default">
        +            <div class="box-body">
        +                <div class="table-responsive">
        +                    <table
        +                    name="accessoriesReport"
        +                    id="table"
        +                    data-cookie="true"
        +                    data-click-to-select="true"
        +                    data-cookie-id-table="accessoriesReportTable">
         
        -  <div class="box box-default">
        -    <div class="box-body">
        -
        -      <div class="table-responsive">
        -
        -            <table
        -            name="accessoriesReport"
        -            id="table"
        -            data-cookie="true"
        -            data-click-to-select="true"
        -            data-cookie-id-table="accessoriesReportTable">
        -
        -              <thead>
        -                  <tr role="row">
        -                        <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/accessories/table.title') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/accessories/general.total') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/accessories/general.remaining') }}</th>
        -                  </tr>
        -              </thead>
        -              <tbody>
        -
        -                    @foreach ($accessories as $accessory)
        -                    <tr>
        -                        <td>{{ is_null($accessory->company) ? '' : $accessory->company->name }}</td>
        -                        <td>{{ $accessory->name }}</td>
        -                        <td>{{ $accessory->qty }}</td>
        -                        <td>{{ $accessory->numRemaining() }}</td>
        -                    </tr>
        -                    @endforeach
        -                </tbody>
        -            </table>
        -      </div>
        -</div>
        -</div>
        -</div>
        +                        <thead>
        +                            <tr role="row">
        +                                <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/accessories/table.title') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/accessories/general.total') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/accessories/general.remaining') }}</th>
        +                            </tr>
        +                        </thead>
        +                        <tbody>
        +                            @foreach ($accessories as $accessory)
        +                            <tr>
        +                                <td>{{ is_null($accessory->company) ? '' : $accessory->company->name }}</td>
        +                                <td>{{ $accessory->name }}</td>
        +                                <td>{{ $accessory->qty }}</td>
        +                                <td>{{ $accessory->numRemaining() }}</td>
        +                            </tr>
        +                            @endforeach
        +                        </tbody>
        +                    </table>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
         </div>
         
         
         @section('moar_scripts')
        -<script src="{{ asset('assets/js/bootstrap-table.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/bootstrap-table-export.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/tableExport.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/jquery.base64.js') }}"></script>
        +<script src="{{ asset('js/bootstrap-table.js') }}"></script>
        +<script src="{{ asset('js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        +<script src="{{ asset('js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/bootstrap-table-export.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/tableExport.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/jquery.base64.js') }}"></script>
         <script type="text/javascript">
             $('#table').bootstrapTable({
                 classes: 'table table-responsive table-no-bordered',
        diff --git a/resources/views/reports/activity.blade.php b/resources/views/reports/activity.blade.php
        index be7fed15e1..6dc6afb878 100644
        --- a/resources/views/reports/activity.blade.php
        +++ b/resources/views/reports/activity.blade.php
        @@ -9,40 +9,36 @@
         {{-- Page content --}}
         @section('content')
         
        -
        -
         <div class="row">
        -  <div class="col-md-12">
        +    <div class="col-md-12">
        +        <div class="box box-default">
        +            <div class="box-body">
         
        -  <div class="box box-default">
        -    <div class="box-body">
        -
        -        <table
        +                <table
                         name="activityReport"
                         data-toolbar="#toolbar"
                         class="table table-striped snipe-table"
                         id="table"
        -                data-url="{{ route('api.activity.list') }}"
        +                data-url="{{ route('api.activity.index') }}"
                         data-cookie="true"
                         data-cookie-id-table="activityReportTable">
        -            <thead>
        -            <tr>
        -                <th class="col-sm-1" data-field="admin">{{ trans('general.admin') }}</th>
        -                <th class="col-sm-1" data-field="action_type">{{ trans('general.action') }}</th>
        -                <th class="col-sm-1" data-field="item_type">{{ trans('general.type') }}</th>
        -                <th class="col-sm-1" data-field="item">{{ trans('general.item') }}</th>
        -                <th class="col-sm-1" data-field="target">To</th>
        -                <th class="col-sm-1" data-field="created_at">{{ trans('general.date') }}</th>
        -                <th class="col-sm-1" data-field="note">{{ trans('general.notes') }}</th>
        -            </tr>
        -            </thead>
        -
        -        </table>
        -
        -
        +                    <thead>
        +                        <tr>
        +                            <th data-field="icon" style="width: 40px;" class="hidden-xs" data-formatter="iconFormatter"></th>
        +                            <th class="col-sm-3" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.date') }}</th>
        +                            <th class="col-sm-2" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
        +                            <th class="col-sm-2" data-field="action_type">{{ trans('general.action') }}</th>
        +                            <th class="col-sm-1" data-field="item.type">{{ trans('general.type') }}</th>
        +                            <th class="col-sm-3" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
        +                            <th class="col-sm-2" data-field="target" data-formatter="polymorphicItemFormatter">To</th>
        +                            <th class="col-sm-1" data-field="note">{{ trans('general.notes') }}</th>
        +                        </tr>
        +                    </thead>
        +                </table>
        +            </div>
        +        </div>
             </div>
        -    </div>
        -  </div>
        +</div>
         @stop
         
         
        diff --git a/resources/views/reports/asset.blade.php b/resources/views/reports/asset.blade.php
        index f144ec7c65..07cf67a98f 100644
        --- a/resources/views/reports/asset.blade.php
        +++ b/resources/views/reports/asset.blade.php
        @@ -16,10 +16,8 @@
         
         <div class="row">
             <div class="col-md-12">
        -
                 <div class="box box-default">
                     <div class="box-body">
        -
                         <div class="table-responsive">
         
                             <table
        @@ -27,7 +25,7 @@
                             data-toolbar="#toolbar"
                             class="table table-striped snipe-table"
                             id="table"
        -                    data-url="{{route('api.hardware.list', array(''=>e(Input::get('status')),'order_number'=>e(Input::get('order_number')), 'status_id'=>e(Input::get('status_id')), 'report'=>'true'))}}"
        +                    data-url="{{route('api.assets.index', array(''=>e(Input::get('status')),'order_number'=>e(Input::get('order_number')), 'status_id'=>e(Input::get('status_id')), 'report'=>'true'))}}"
                             data-cookie="true"
                             data-click-to-select="true"
                             data-cookie-id-table="{{ e(Input::get('status')) }}assetTable-{{ config('version.hash_version') }}">
        @@ -37,7 +35,7 @@
                                         <th data-class="hidden-xs" data-switchable="false" data-searchable="false" data-sortable="false" data-field="checkbox"><div class="text-center"><input type="checkbox" id="checkAll" style="padding-left: 0px;"></div></th>
                                         @endif
                                         <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                                <th data-field="companyName" data-searchable="true" data-sortable="true" data-switchable="true" data-visible="false">{{ trans('general.company') }}</th>
        +                                <th data-field="company" data-searchable="true" data-sortable="true" data-switchable="true" data-visible="false">{{ trans('general.company') }}</th>
                                         <th data-sortable="true" data-field="name" data-visible="false">{{ trans('admin/hardware/form.name') }}</th>
                                         <th data-sortable="true" data-field="asset_tag">{{ trans('admin/hardware/table.asset_tag') }}</th>
                                         <th data-sortable="true" data-field="serial">{{ trans('admin/hardware/table.serial') }}</th>
        @@ -45,6 +43,7 @@
                                         <th data-sortable="true" data-field="model_number" data-visible="false">{{ trans('admin/models/table.modelnumber') }}</th>
                                         <th data-sortable="true" data-field="status_label">{{ trans('admin/hardware/table.status') }}</th>
                                         <th data-sortable="true" data-field="assigned_to">{{ trans('admin/hardware/form.checkedout_to') }}</th>
        +                                <th data-sortable="true" data-field="employee_number">{{ trans('admin/users/table.employee_num') }}</th>
                                         <th data-sortable="true" data-field="location" data-searchable="true">{{ trans('admin/hardware/table.location') }}</th>
                                         <th data-sortable="true" data-field="category" data-searchable="true">{{ trans('general.category') }}</th>
                                         <th data-sortable="true" data-field="manufacturer" data-searchable="true" data-visible="false">{{ trans('general.manufacturer') }}</th>
        @@ -79,8 +78,14 @@
         </div>
         @stop
         
        -@section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'assets-export', 'search' => true, 'multiSort' => true])
         
         
        +@section('moar_scripts')
        +    @include ('partials.bootstrap-table', [
        +        'exportFile' => 'assets-export',
        +        'multiSort' => true,
        +        'search' => true,
        +        'columns' => \App\Presenters\AssetPresenter::dataTableLayout()
        +    ])
        +
         @stop
        diff --git a/resources/views/reports/asset_maintenances.blade.php b/resources/views/reports/asset_maintenances.blade.php
        index 39bb6a5444..05ac4e1db3 100644
        --- a/resources/views/reports/asset_maintenances.blade.php
        +++ b/resources/views/reports/asset_maintenances.blade.php
        @@ -10,93 +10,92 @@
         @section('content')
         <div class="row">
           <div class="col-md-12">
        +    <div class="box box-default">
        +      <div class="box-body">
         
        -  <div class="box box-default">
        -    <div class="box-body">
        +        <div class="table-responsive">
        +          <table
        +          name="maintenancesReport"
        +          id="table"
        +          data-cookie="true"
        +          data-click-to-select="true"
        +          data-cookie-id-table="maintenancesReportTable">
         
        -      <div class="table-responsive">
        -             <table
        -             name="maintenancesReport"
        -             id="table"
        -             data-cookie="true"
        -             data-click-to-select="true"
        -             data-cookie-id-table="maintenancesReportTable">
        -
        -                <thead>
        -                    <tr role="row">
        -                        <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/asset_maintenances/table.asset_name') }}</th>
        -                        <th class="col-sm-1">{{ trans('general.supplier') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.title') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.asset_maintenance_time') }}</th>
        -                        <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.cost') }}</th>
        -                    </tr>
        -                </thead>
        -                <tbody>
        -                <?php
        -                    $totalDays = 0;
        -                    $totalCost = 0;
        +            <thead>
        +              <tr role="row">
        +                <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/asset_maintenances/table.asset_name') }}</th>
        +                <th class="col-sm-1">{{ trans('general.supplier') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.title') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.asset_maintenance_time') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/asset_maintenances/form.cost') }}</th>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              <?php
        +              $totalDays = 0;
        +              $totalCost = 0;
                         ?>
        -                @foreach ($assetMaintenances as $assetMaintenance)
        -                    <tr>
        -                        <td>{{ is_null($assetMaintenance->asset->company) ? '' : $assetMaintenance->asset->company->name }}</td>
        -                        <td>{{ $assetMaintenance->asset->asset_tag }}</td>
        -                        <td>{{ $assetMaintenance->asset->name }}</td>
        -                        <td>{{ $assetMaintenance->supplier->name }}</td>
        -                        <td>{{ $assetMaintenance->asset_maintenance_type }}</td>
        -                        <td>{{ $assetMaintenance->title }}</td>
        -                        <td>{{ $assetMaintenance->start_date }}</td>
        -                        <td>{{ is_null($assetMaintenance->completion_date) ? trans('admin/asset_maintenances/message.asset_maintenance_incomplete') : $assetMaintenance->completion_date }}</td>
        -                        @if (is_null($assetMaintenance->asset_maintenance_time))
        -                            <?php
        -                                $assetMaintenanceTime = intval(Carbon::now()->diffInDays(Carbon::parse($assetMaintenance->start_date)));
        -                            ?>
        -                        @else
        -                            <?php
        -                                $assetMaintenanceTime = intval($assetMaintenance->asset_maintenance_time);
        -                            ?>
        -                        @endif
        -                        <td>{{ $assetMaintenanceTime }}</td>
        -                        <td>
        -                          {{ $snipeSettings->default_currency }}
        -                          {{ number_format($assetMaintenance->cost,2) }}
        -                        </td>
        -                    </tr>
        -                    <?php
        -                        $totalDays += $assetMaintenanceTime;
        -                        $totalCost += floatval($assetMaintenance->cost);
        -                    ?>
        -                @endforeach
        -                </tbody>
        -                <tfoot>
        -                    <tr>
        -                        <td colspan="6" align="right"><strong>Totals:</strong></td>
        -                        <td>{{number_format($totalDays)}}</td>
        -                        <td>
        -                          {{ $snipeSettings->default_currency }}
        -                          {{ number_format($totalCost,2) }}
        -                        </td>
        -                    </tr>
        -                </tfoot>
        -            </table>
        +              @foreach ($assetMaintenances as $assetMaintenance)
        +              <tr>
        +                <td>{{ is_null($assetMaintenance->asset->company) ? '' : $assetMaintenance->asset->company->name }}</td>
        +                <td>{{ $assetMaintenance->asset->asset_tag }}</td>
        +                <td>{{ $assetMaintenance->asset->name }}</td>
        +                <td>{{ $assetMaintenance->supplier->name }}</td>
        +                <td>{{ $assetMaintenance->asset_maintenance_type }}</td>
        +                <td>{{ $assetMaintenance->title }}</td>
        +                <td>{{ $assetMaintenance->start_date }}</td>
        +                <td>{{ is_null($assetMaintenance->completion_date) ? trans('admin/asset_maintenances/message.asset_maintenance_incomplete') : $assetMaintenance->completion_date }}</td>
        +                @if (is_null($assetMaintenance->asset_maintenance_time))
        +                <?php
        +                $assetMaintenanceTime = intval(Carbon::now()->diffInDays(Carbon::parse($assetMaintenance->start_date)));
        +                ?>
        +                @else
        +                <?php
        +                $assetMaintenanceTime = intval($assetMaintenance->asset_maintenance_time);
        +                ?>
        +                @endif
        +                <td>{{ $assetMaintenanceTime }}</td>
        +                <td>
        +                  {{ $snipeSettings->default_currency }}
        +                  {{ number_format($assetMaintenance->cost,2) }}
        +                </td>
        +              </tr>
        +                <?php
        +                $totalDays += $assetMaintenanceTime;
        +                $totalCost += floatval($assetMaintenance->cost);
        +                ?>
        +              @endforeach
        +            </tbody>
        +            <tfoot>
        +              <tr>
        +                <td colspan="6" align="right"><strong>Totals:</strong></td>
        +                <td>{{number_format($totalDays)}}</td>
        +                <td>
        +                  {{ $snipeSettings->default_currency }}
        +                  {{ number_format($totalCost,2) }}
        +                </td>
        +              </tr>
        +            </tfoot>
        +          </table>
                 </div>
        +      </div>
             </div>
           </div>
         </div>
        -</div>
        -
        +@stop
         
         @section('moar_scripts')
        -<script src="{{ asset('assets/js/bootstrap-table.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/bootstrap-table-export.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/tableExport.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/jquery.base64.js') }}"></script>
        +<script src="{{ asset('js/bootstrap-table.js') }}"></script>
        +<script src="{{ asset('js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        +<script src="{{ asset('js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/bootstrap-table-export.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/tableExport.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/jquery.base64.js') }}"></script>
         <script type="text/javascript">
           $('#table').bootstrapTable({
               classes: 'table table-responsive table-no-bordered',
        @@ -130,4 +129,3 @@
           });
         </script>
         @stop
        -@stop
        diff --git a/resources/views/reports/audit.blade.php b/resources/views/reports/audit.blade.php
        new file mode 100644
        index 0000000000..c36b120274
        --- /dev/null
        +++ b/resources/views/reports/audit.blade.php
        @@ -0,0 +1,49 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    {{ trans('general.audit_report') }}
        +    @parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <div class="row">
        +        <div class="col-md-12">
        +            <div class="box box-default">
        +                <div class="box-body">
        +
        +                    <table
        +                            name="auditReport"
        +                            data-toolbar="#toolbar"
        +                            class="table table-striped snipe-table"
        +                            id="table"
        +                            data-url="{{ route('api.activity.index', ['action_type' => 'audit']) }}"
        +                            data-cookie="true"
        +                            data-cookie-id-table="activityReportTable"
        +                            data-row-style="dateRowCheckStyle">
        +                        <thead>
        +                        <tr>
        +                            <th class="col-sm-1" data-field="image" data-visible="false" data-formatter="imageFormatter">{{ trans('admin/hardware/table.image') }}</th>
        +                            <th class="col-sm-2" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.audit') }}</th>
        +                            <th class="col-sm-2" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
        +                            <th class="col-sm-2" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
        +                            <th class="col-sm-1" data-field="location" data-formatter="locationsLinkObjFormatter">{{ trans('general.location') }}</th>
        +                            <th class="col-sm-2" data-field="next_audit_date" data-formatter="dateDisplayFormatter">{{ trans('general.next_audit_date') }}</th>
        +                            <th class="col-sm-1" data-field="days_to_next_audit">{{ trans('general.days_to_next_audit') }}</th>
        +
        +                            <th class="col-sm-2" data-field="note">{{ trans('general.notes') }}</th>
        +                        </tr>
        +                        </thead>
        +                    </table>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +@stop
        +
        +
        +@section('moar_scripts')
        +    @include ('partials.bootstrap-table', ['exportFile' => 'audit-export', 'search' => false])
        +@stop
        diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php
        index d9892526b3..75802052be 100644
        --- a/resources/views/reports/custom.blade.php
        +++ b/resources/views/reports/custom.blade.php
        @@ -16,182 +16,168 @@
         @section('content')
         
         <div class="row">
        -<div class="col-md-8 col-md-offset-2">
        +  <div class="col-md-8 col-md-offset-2">
         
        -  {{ Form::open(['method' => 'post', 'class' => 'form-horizontal']) }}
        -  <!-- CSRF Token -->
        -  <input type="hidden" name="_token" value="{{ csrf_token() }}">
        +    {{ Form::open(['method' => 'post', 'class' => 'form-horizontal']) }}
        +    {{csrf_field()}}
         
        +    <!-- Horizontal Form -->
        +      <div class="box box-default">
        +        <div class="box-header with-border">
        +          <h3 class="box-title">Customize Report</h3>
        +        </div><!-- /.box-header -->
         
        -  <!-- Horizontal Form -->
        -    <div class="box box-default">
        +        <div class="box-body">
        +          <div class="col-md-3">
         
        -      <div class="box-header with-border">
        -        <h3 class="box-title">Customize Report</h3>
        -      </div><!-- /.box-header -->
        -
        -
        -      <div class="box-body">
        -        <div class="col-md-3">
        -
        -          <div class="checkbox col-md-12">
        -            <label>
        -              {{ Form::checkbox('company', '1') }}
        -              {{ trans('general.company') }}
        -            </label>
        -          </div>
        -
        -        <div class="checkbox col-md-12">
        -        	<label>
        -        	{{ Form::checkbox('asset_tag', '1') }}
        -            {{ trans('general.asset_tag') }}
        -          </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -          <label>
        -          {{ Form::checkbox('asset_name', '1') }}
        -            {{ trans('admin/hardware/form.name') }}
        -          </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -        	 {{ Form::checkbox('manufacturer', '1') }}
        -           	{{ trans('general.manufacturer') }}
        -          </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('model', '1') }}
        -            {{ trans('general.asset_models') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -        	 {{ Form::checkbox('category', '1') }}
        -           	{{ trans('general.category') }}
        -          </label>
        -        </div>
        -
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('serial', '1') }}
        -            {{ trans('admin/hardware/table.serial') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('purchase_date', '1') }}
        -              {{ trans('admin/licenses/table.purchase_date') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('purchase_cost', '1') }}
        -             {{ trans('admin/hardware/form.cost') }}
        -            </label>
        -        </div>
        -          <div class="checkbox col-md-12">
        -            <label>
        -              {{ Form::checkbox('eol', '1') }}
        -              {{ trans('admin/hardware/table.eol') }}
        -            </label>
        -          </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('order', '1') }}
        -            {{ trans('admin/hardware/form.order') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('supplier', '1') }}
        -            {{ trans('general.suppliers') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('location', '1') }}
        -            {{ trans('general.location') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('assigned_to', '1') }}
        -            {{ trans('admin/licenses/table.assigned_to') }}
        -            </label>
        -        </div>
        -
        -          <div class="checkbox col-md-12">
        -            <label>
        -              {{ Form::checkbox('username', '1') }}
        -              {{ trans('admin/users/table.username') }}
        -            </label>
        -          </div>
        -
        -            <div class="checkbox col-md-12">
        -                <label>
        -                    {{ Form::checkbox('employee_num', '1') }}
        -                    {{ trans('admin/users/table.employee_num') }}
        -                </label>
        -            </div>
        -
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('status', '1') }}
        -            {{ trans('general.status') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('warranty', '1') }}
        -            {{ trans('admin/hardware/form.warranty') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -        	<label>
        -            {{ Form::checkbox('depreciation', '1') }}
        -            {{ trans('general.depreciation') }}
        -            </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -          <label>
        -            {{ Form::checkbox('expected_checkin', '1') }}
        -            {{ trans('admin/hardware/form.expected_checkin') }}
        -          </label>
        -        </div>
        -        <div class="checkbox col-md-12">
        -          <label>
        -            {{ Form::checkbox('notes', '1') }}
        -            {{ trans('general.notes') }}
        -          </label>
        -        </div>
        -
        -
        -
        -
        -
        -        @foreach ($customfields as $customfield)
                     <div class="checkbox col-md-12">
                       <label>
        -                {{ Form::checkbox($customfield->db_column_name(), '1') }}
        -                {{ $customfield->name }}
        +                {{ Form::checkbox('company', '1') }}
        +                {{ trans('general.company') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +              {{ Form::checkbox('asset_tag', '1') }}
        +                {{ trans('general.asset_tag') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('asset_name', '1') }}
        +                {{ trans('admin/hardware/form.name') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('manufacturer', '1') }}
        +                {{ trans('general.manufacturer') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('model', '1') }}
        +                {{ trans('general.asset_models') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('category', '1') }}
        +                {{ trans('general.category') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('serial', '1') }}
        +                {{ trans('admin/hardware/table.serial') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('purchase_date', '1') }}
        +                {{ trans('admin/licenses/table.purchase_date') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('purchase_cost', '1') }}
        +                {{ trans('admin/hardware/form.cost') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('eol', '1') }}
        +                {{ trans('admin/hardware/table.eol') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('order', '1') }}
        +                {{ trans('admin/hardware/form.order') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('supplier', '1') }}
        +                {{ trans('general.suppliers') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('location', '1') }}
        +                {{ trans('general.location') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('assigned_to', '1') }}
        +                {{ trans('admin/licenses/table.assigned_to') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('username', '1') }}
        +                {{ trans('admin/users/table.username') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('employee_num', '1') }}
        +                {{ trans('admin/users/table.employee_num') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('status', '1') }}
        +                {{ trans('general.status') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('warranty', '1') }}
        +                {{ trans('admin/hardware/form.warranty') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('depreciation', '1') }}
        +                {{ trans('general.depreciation') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('expected_checkin', '1') }}
        +                {{ trans('admin/hardware/form.expected_checkin') }}
        +              </label>
        +            </div>
        +            <div class="checkbox col-md-12">
        +              <label>
        +                {{ Form::checkbox('notes', '1') }}
        +                {{ trans('general.notes') }}
                       </label>
                     </div>
        -          @endforeach
        -      </div>
         
        +            @foreach ($customfields as $customfield)
        +              <div class="checkbox col-md-12">
        +                <label>
        +                  {{ Form::checkbox($customfield->db_column_name(), '1') }}
        +                  {{ $customfield->name }}
        +                </label>
        +              </div>
        +            @endforeach
        +          </div> <!-- /.col-md-3-->
         
        -      <div class="col-md-7">
        -        <p>Select the fields you'd like to include in your custom report, and click Generate. The file (YYYY-mm-dd-his-custom-asset-report.csv) will download automatically, and you can open it in Excel.</p>
        -      </div>
        +          <div class="col-md-7">
        +            <p>Select the fields you'd like to include in your custom report, and click Generate. The file (YYYY-mm-dd-his-custom-asset-report.csv) will download automatically, and you can open it in Excel.</p>
        +          </div>
         
        -        </div>
        +        </div> <!-- /.box-body-->
                 <div class="box-footer text-right">
        -            <button type="submit" class="btn btn-success"><i class="fa fa-download icon-white"></i> {{ trans('general.generate') }}</button>
        +          <button type="submit" class="btn btn-success"><i class="fa fa-download icon-white"></i> {{ trans('general.generate') }}</button>
                 </div>
        -      </div>
        -      </form>
        -    </div>
        +      </div> <!--/.box.box-default-->
        +    {{ Form::close() }}
        +  </div>
         </div>
         
         @stop
        diff --git a/resources/views/reports/depreciation.blade.php b/resources/views/reports/depreciation.blade.php
        index 8d1f4a8777..d4e1ca62c3 100644
        --- a/resources/views/reports/depreciation.blade.php
        +++ b/resources/views/reports/depreciation.blade.php
        @@ -9,148 +9,144 @@
         {{-- Page content --}}
         @section('content')
         
        -
         <div class="row">
           <div class="col-md-12">
             <div class="box box-default">
               <div class="box-body">
        -
        -      <div class="table-responsive">
        -      <table
        -      class="table table-striped table-bordered table-compact"
        -      name="depreciationReport"
        -      id="table"
        -      data-cookie="true"
        -      data-click-to-select="true"
        -      data-cookie-id-table="depreciationReportTable">
        -        <thead>
        -            <tr role="row">
        -            <th class="col-sm-1" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
        -            <th class="col-sm-1" data-visible="false">{{ trans('admin/categories/general.category_name') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.title') }}</th>
        -            @if ($snipeSettings->display_asset_name)
        +        <div class="table-responsive">
        +          <table
        +          class="table table-striped table-bordered table-compact"
        +          name="depreciationReport"
        +          id="table"
        +          data-cookie="true"
        +          data-click-to-select="true"
        +          data-cookie-id-table="depreciationReportTable">
        +            <thead>
        +              <tr role="row">
        +                <th class="col-sm-1" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
        +                <th class="col-sm-1" data-visible="false">{{ trans('admin/categories/general.category_name') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.title') }}</th>
        +                @if ($snipeSettings->display_asset_name)
                         <th class="col-sm-1">{{ trans('general.name') }}</th>
        -            @endif
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.serial') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/depreciations/general.depreciation_name') }}</th>
        +                @endif
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.serial') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/depreciations/general.depreciation_name') }}</th>
                         <th class="col-sm-1">{{ trans('admin/depreciations/general.number_of_months') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.checkoutto') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.location') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_date') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.eol') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_cost') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.book_value') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.diff') }}</th>
        -        </tr>
        -    </thead>
        -    <tbody>
        -
        -        @foreach ($assets as $asset)
        -        <tr>
        -            <td>{{ is_null($asset->company) ? '' : $asset->company->name }}</td>
        -            <td>
        -                @if ($asset->model)
        -                    {{ $asset->model->category->name }}
        -                @endif
        -
        -            </td>
        -            <td>
        -	            @if ($asset->deleted_at!='')
        -	            	 <del>{{ $asset->asset_tag }}</del>
        -	            @else
        -	            	 {{ $asset->asset_tag }}
        -	            @endif
        -
        -	        </td>
        -            <td>{{ $asset->model->name }}</td>
        -            @if ($snipeSettings->display_asset_name)
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.checkoutto') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.location') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_date') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.eol') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_cost') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.book_value') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.diff') }}</th>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              @foreach ($assets as $asset)
        +              <tr>
        +                <td>{{ is_null($asset->company) ? '' : $asset->company->name }}</td>
        +                <td>
        +                  @if ($asset->model)
        +                  {{ $asset->model->category->name }}
        +                  @endif
        +                </td>
        +                <td>
        +                  @if ($asset->deleted_at!='')
        +                  <del>{{ $asset->asset_tag }}</del>
        +                  @else
        +                  {{ $asset->asset_tag }}
        +                  @endif
        +                </td>
        +                <td>{{ $asset->model->name }}</td>
        +                @if ($snipeSettings->display_asset_name)
                         <td>{{ $asset->name }}</td>
        -            @endif
        -            <td>{{ $asset->serial }}</td>
        -            <td>
        -                @if ($asset->model->depreciation)
        -                    {{ $asset->model->depreciation->name }}
                         @endif
        -            </td>
        -            <td>
        -                @if ($asset->model->depreciation)
        -                    {{ $asset->model->depreciation->months }}
        -                @endif
        -            </td>
        -            <td>
        -            @if ($asset->assigneduser)
        -            	 @if ($asset->assigneduser->deleted_at!='')
        -            	 	<del>{{ $asset->assigneduser->fullName() }}</del>
        -            	 @else
        -            	 	<a href="{{ route('view/user', $asset->assigned_to) }}">
        -					{{ $asset->assigneduser->fullName() }}
        -					</a>
        -            	 @endif
        +                <td>{{ $asset->serial }}</td>
        +                <td>
        +                  @if ($asset->model->depreciation)
        +                  {{ $asset->model->depreciation->name }}
        +                  @endif
        +                </td>
        +                <td>
        +                  @if ($asset->model->depreciation)
        +                  {{ $asset->model->depreciation->months }}
        +                  @endif
        +                </td>
        +                <td>
        +                  @if ($asset->assignedTo)
        +                    @if ($asset->assignedTo->deleted_at!='')
        +                    <del>{{ $asset->assignedTo->present()->name() }}</del>
        +                    @else
        +                      {!!  $asset->assignedTo->present()->nameUrl()  !!}
        +                    @endif
        +                  @endif
        +                </td>
        +                <td>
        +                  @if ($asset->assetloc)
        +                  {{ $asset->assetloc->name }}
        +                  @elseif ($asset->defaultloc)
        +                  {{ $asset->defaultloc->name }}
        +                  @endif
        +                </td>
        +                <td>{{ $asset->purchase_date }}</td>
         
        -            @endif
        -            </td>
        -            <td>
        -                @if ($asset->assetloc)
        -                    {{ $asset->assetloc->name }}
        -                @elseif ($asset->defaultloc)
        -                    {{ $asset->defaultloc->name }}
        -                @endif
        -            </td>
        -            <td>{{ $asset->purchase_date }}</td>
        +                <td>
        +                  @if ($asset->model->eol) {{ $asset->present()->eol_date() }}
        +                  @endif
        +                </td>
         
        -            <td>
        -            @if ($asset->model->eol) {{ $asset->eol_date() }}
        -            @endif
        -            </td>
        -
        -            @if ($asset->purchase_cost > 0)
        -            <td class="align-right">
        -                @if ($asset->assetloc )
        +                @if ($asset->purchase_cost > 0)
        +                  <td class="align-right">
        +                    @if ($asset->assetloc )
                             {{ $asset->assetloc->currency }}
        -                @else
        +                    @else
                             {{ $snipeSettings->default_currency }}
        -                @endif
        -                {{ \App\Helpers\Helper::formatCurrencyOutput($asset->purchase_cost) }}</td>
        -            <td class="align-right">
        -                @if ($asset->assetloc )
        +                    @endif
        +                    {{ \App\Helpers\Helper::formatCurrencyOutput($asset->purchase_cost) }}
        +                  </td>
        +                  <td class="align-right">
        +                    @if ($asset->assetloc )
                             {{ $asset->assetloc->currency }}
        -                @else
        +                    @else
                             {{ $snipeSettings->default_currency }}
        -                @endif
        +                    @endif
         
        -                {{ \App\Helpers\Helper::formatCurrencyOutput($asset->getDepreciatedValue()) }}</td>
        -            <td class="align-right">
        -                @if ($asset->assetloc)
        +                    {{ \App\Helpers\Helper::formatCurrencyOutput($asset->getDepreciatedValue()) }}
        +                  </td>
        +                  <td class="align-right">
        +                    @if ($asset->assetloc)
                             {{ $asset->assetloc->currency }}
        -                @else
        +                    @else
                             {{ $snipeSettings->default_currency }}
        +                    @endif
        +
        +                    -{{ \App\Helpers\Helper::formatCurrencyOutput(($asset->purchase_cost - $asset->getDepreciatedValue())) }}
        +                  </td>
        +                @else
        +                  <td></td>
        +                  <td></td>
        +                  <td></td>
                         @endif
        +              </tr>
        +              @endforeach
        +            </tbody>
        +          </table>
        +        </div> <!-- /.table-responsive-->
        +      </div> <!-- /.box-body-->
        +    </div> <!--/box.box-default-->
        +  </div> <!-- /.col-md-12-->
        +</div> <!--/.row-->
         
        -                -{{ \App\Helpers\Helper::formatCurrencyOutput(($asset->purchase_cost - $asset->getDepreciatedValue())) }}</td>
        -            @else
        -	            <td></td>
        -	            <td></td>
        -	            <td></td>
        -            @endif
        -
        -
        -        </tr>
        -        @endforeach
        -    </tbody>
        -</table>
        -</div>
        -</div>
        -
        -</div>
        +@stop
         
         @section('moar_scripts')
        -<script src="{{ asset('assets/js/bootstrap-table.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/bootstrap-table-export.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/tableExport.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/jquery.base64.js') }}"></script>
        +<script src="{{ asset('js/bootstrap-table.js') }}"></script>
        +<script src="{{ asset('js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        +<script src="{{ asset('js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/bootstrap-table-export.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/tableExport.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/jquery.base64.js') }}"></script>
         <script type="text/javascript">
             $('#table').bootstrapTable({
                 classes: 'table table-responsive table-striped table-bordered',
        @@ -185,4 +181,4 @@
         </script>
         @stop
         
        -@stop
        +
        diff --git a/resources/views/reports/index.blade.php b/resources/views/reports/index.blade.php
        index ae4a87aa7f..1261f903b8 100755
        --- a/resources/views/reports/index.blade.php
        +++ b/resources/views/reports/index.blade.php
        @@ -9,92 +9,83 @@
         {{-- Page content --}}
         @section('content')
         
        -
         <div class="page-header">
        -
             <div class="pull-right">
                 <a href="{{ route('reports/export') }}" class="btn btn-flat gray pull-right"><i class="fa fa-download icon-white"></i>
                 {{ trans('admin/hardware/table.dl_csv') }}</a>
                 </div>
        -
             <h3>{{ trans('general.depreciation_report') }}</h3>
         </div>
         
         <div class="row">
        +    <div class="table-responsive">
        +        <table id="example">
        +            <thead>
        +                <tr role="row">
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.title') }}</th>
        +                    @if ($snipeSettings->display_asset_name)
        +                    <th class="col-sm-1">{{ trans('general.name') }}</th>
        +                    @endif
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.serial') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.checkoutto') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.location') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_date') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.eol') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_cost') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.book_value') }}</th>
        +                    <th class="col-sm-1">{{ trans('admin/hardware/table.diff') }}</th>
        +                </tr>
        +            </thead>
        +            <tbody>
        +                @foreach ($assets as $asset)
        +                <tr>
        +                    <td>{{ $asset->asset_tag }}</td>
        +                    <td>{{ $asset->model->name }}</td>
        +                    @if ($snipeSettings->display_asset_name)
        +                    <td>{{ $asset->name }}</td>
        +                    @endif
        +                    <td>{{ $asset->serial }}</td>
        +                    <td>
        +                        @if ($asset->assigned_to != '')
        +                            {!!  $asset->assignedTo->present->nameUrl()  !!}
        +                        @endif
        +                    </td>
        +                    <td>
        +                        @if (($asset->checkedOutToUser()) && ($asset->assignedTo->assetLoc))
        +                            {{ $asset->assignedTo->assetLoc->city }}, {{ $asset->assignedTo->assetLoc->state}}
        +                        @endif
        +                    </td>
        +                    <td>{{ $asset->purchase_date }}</td>
         
        -<div class="table-responsive">
        -<table id="example">
        -        <thead>
        -            <tr role="row">
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.title') }}</th>
        -            @if ($snipeSettings->display_asset_name)
        -                <th class="col-sm-1">{{ trans('general.name') }}</th>
        -            @endif
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.serial') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.checkoutto') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.location') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_date') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.eol') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.purchase_cost') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.book_value') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/hardware/table.diff') }}</th>
        -        </tr>
        -    </thead>
        -    <tbody>
        -
        -        @foreach ($assets as $asset)
        -        <tr>
        -            <td>{{ $asset->asset_tag }}</td>
        -            <td>{{ $asset->model->name }}</td>
        -            @if ($snipeSettings->display_asset_name)
        -                <td>{{ $asset->name }}</td>
        -            @endif
        -            <td>{{ $asset->serial }}</td>
        -            <td>
        -            @if ($asset->assigned_to != '')
        -                <a href="{{ route('view/user', $asset->assigned_to) }}">
        -                {{ $asset->assigneduser->fullName() }}
        -                </a>
        -            @endif
        -            </td>
        -            <td>
        -            @if (($asset->assigned_to > 0) && ($asset->assigneduser->location_id > 0)) {{ Location::find($asset->assigneduser->location_id)->city }}
        -                    ,
        -                    {{ Location::find($asset->assigneduser->location_id)->state }}
        -            @endif
        -            </td>
        -            <td>{{ $asset->purchase_date }}</td>
        -
        -            <td>
        -            @if ($asset->model->eol) {{ $asset->eol_date() }}
        -            @endif
        -            </td>
        -
        -            @if ($asset->purchase_cost > 0)
        -            <td class="align-right">
        -              {{ $snipeSettings->default_currency }}
        -              {{ \App\Helpers\Helper::formatCurrencyOutput($asset->purchase_cost) }}
        -            </td>
        -            <td class="align-right">
        -              {{ $snipeSettings->default_currency }}
        -              {{ number_format($asset->depreciate()) }}
        -            </td>
        -            <td class="align-right">
        -              {{ $snipeSettings->default_currency }}
        -              -{{ number_format(($asset->purchase_cost - $asset->depreciate())) }}</td>
        -            @else
        -            <td></td>
        -            <td></td>
        -            <td></td>
        -            @endif
        -
        -
        -        </tr>
        -        @endforeach
        -    </tbody>
        -</table>
        +                    <td>
        +                        @if ($asset->model->eol) {{ $asset->present()->eol_date() }}
        +                        @endif
        +                    </td>
         
        +                    @if ($asset->purchase_cost > 0)
        +                    <td class="align-right">
        +                        {{ $snipeSettings->default_currency }}
        +                        {{ \App\Helpers\Helper::formatCurrencyOutput($asset->purchase_cost) }}
        +                    </td>
        +                    <td class="align-right">
        +                        {{ $snipeSettings->default_currency }}
        +                        {{ number_format($asset->depreciate()) }}
        +                    </td>
        +                    <td class="align-right">
        +                        {{ $snipeSettings->default_currency }}
        +                        -{{ number_format(($asset->purchase_cost - $asset->depreciate())) }}
        +                    </td>
        +                    @else {{-- purchase_cost > 0 --}}
        +                    <td></td>
        +                    <td></td>
        +                    <td></td>
        +                    @endif
        +                </tr>
        +                @endforeach
        +            </tbody>
        +        </table>
        +    </div>
         </div>
         
         @stop
        diff --git a/resources/views/reports/licenses.blade.php b/resources/views/reports/licenses.blade.php
        index 06e88786d8..7977b7fb0d 100644
        --- a/resources/views/reports/licenses.blade.php
        +++ b/resources/views/reports/licenses.blade.php
        @@ -8,70 +8,75 @@
         
         {{-- Page content --}}
         @section('content')
        -
        -
        -
         <div class="row">
        -  <div class="col-md-12">
        -    <div class="box box-default">
        -      <div class="box-body">
        +    <div class="col-md-12">
        +        <div class="box box-default">
        +            <div class="box-body">
        +                <div class="table-responsive">
        +                    <table
        +                    name="licensesReport"
        +                    id="table"
        +                    class="table table-striped"
        +                    data-cookie="true"
        +                    data-click-to-select="true"
        +                    data-cookie-id-table="licensesReportTable">
        +                        <thead>
        +                            <tr role="row">
        +                                <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/licenses/table.title') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/licenses/form.license_key') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/licenses/form.seats') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/licenses/form.remaining_seats') }}</th>
        +                                <th class="col-sm-1">{{ trans('admin/licenses/form.expiration') }}</th>
        +                                <th class="col-sm-1">{{ trans('general.purchase_date') }}</th>
        +                                <th class="col-sm-1 text-right" class="col-sm-1">{{ trans('general.purchase_cost') }}</th>
        +                                <th class="col-sm-1">{{ trans('general.depreciation') }}</th>
        +                                <th class="col-sm-1 text-right">{{ trans('admin/hardware/table.book_value') }}</th>
        +                                <th class="col-sm-1 text-right">{{ trans('admin/hardware/table.diff') }}</th>
        +                            </tr>
        +                        </thead>
         
        -      <div class="table-responsive">
        -      <table
        -      name="licensesReport"
        -      id="table"
        -      class="table table-striped"
        -      data-cookie="true"
        -      data-click-to-select="true"
        -      data-cookie-id-table="licensesReportTable">
        -        <thead>
        -        <tr role="row">
        -            <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/licenses/table.title') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/licenses/form.license_key') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/licenses/form.seats') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/licenses/form.remaining_seats') }}</th>
        -            <th class="col-sm-1">{{ trans('admin/licenses/form.expiration') }}</th>
        -            <th class="col-sm-1">{{ trans('general.purchase_date') }}</th>
        -            <th class="col-sm-1 text-right" class="col-sm-1">{{ trans('general.purchase_cost') }}</th>
        -            <th class="col-sm-1">{{ trans('general.depreciation') }}</th>
        -            <th class="col-sm-1 text-right">{{ trans('admin/hardware/table.book_value') }}</th>
        -            <th class="col-sm-1 text-right">{{ trans('admin/hardware/table.diff') }}</th>
        -        </tr>
        -    </thead>
        -    <tbody>
        +                        <tbody>
        +                            @foreach ($licenses as $license)
        +                            <tr>
        +                                <td>{{ is_null($license->company) ? '' : $license->company->name }}</td>
        +                                <td>{{ $license->name }}</td>
        +                                <td>{{ mb_strimwidth($license->serial, 0, 50, "...") }}</td>
        +                                <td>{{ $license->seats }}</td>
        +                                <td>{{ $license->remaincount() }}</td>
        +                                <td>{{ $license->expiration_date }}</td>
        +                                <td>{{ $license->purchase_date }}</td>
        +                                <td class="text-right">
        +                                    {{ $snipeSettings->default_currency }}{{ \App\Helpers\Helper::formatCurrencyOutput($license->purchase_cost) }}
        +                                </td>
        +                                <td>
        +                                    {{ ($license->depreciation) ? e($license->depreciation->name).' ('.$license->depreciation->months.' '.trans('general.months').')' : ''  }}
        +                                </td>
        +                                <td class="text-right">
        +                                    {{ $snipeSettings->default_currency }}{{ \App\Helpers\Helper::formatCurrencyOutput($license->getDepreciatedValue()) }}
        +                                </td>
        +                                <td class="text-right">
        +                                    -{{ $snipeSettings->default_currency }}{{ \App\Helpers\Helper::formatCurrencyOutput(($license->purchase_cost - $license->getDepreciatedValue())) }}
        +                                </td>
        +                            </tr>
        +                            @endforeach
        +                        </tbody>
        +                    </table>
        +                </div> <!-- /.table-responsive-->
        +            </div>
        +        </div>
        +    </div>
        +</div>
         
        -        @foreach ($licenses as $license)
        -        <tr>
        -            <td>{{ is_null($license->company) ? '' : $license->company->name }}</td>
        -            <td>{{ $license->name }}</td>
        -            <td>{{ mb_strimwidth($license->serial, 0, 50, "...") }}</td>
        -            <td>{{ $license->seats }}</td>
        -            <td>{{ $license->remaincount() }}</td>
        -            <td>{{ $license->expiration_date }}</td>
        -            <td>{{ $license->purchase_date }}</td>
        -            <td class="text-right">
        -            {{ $snipeSettings->default_currency }}{{ \App\Helpers\Helper::formatCurrencyOutput($license->purchase_cost) }}</td>
        -            <td>{{ ($license->depreciation) ? e($license->depreciation->name).' ('.$license->depreciation->months.' '.trans('general.months').')' : ''  }}</td>
        -            <td class="text-right">{{ $snipeSettings->default_currency }}{{ \App\Helpers\Helper::formatCurrencyOutput($license->getDepreciatedValue()) }}</td>
        -            <td class="text-right">-{{ $snipeSettings->default_currency }}{{ \App\Helpers\Helper::formatCurrencyOutput(($license->purchase_cost - $license->getDepreciatedValue())) }}</td>
        -        </tr>
        -        @endforeach
        -    </tbody>
        -</table>
        -</div>
        -</div>
        -</div>
        -</div>
        -</div>
        +@stop
         
         @section('moar_scripts')
        -<script src="{{ asset('assets/js/bootstrap-table.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/bootstrap-table-export.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/tableExport.js') }}"></script>
        -<script src="{{ asset('assets/js/extensions/export/jquery.base64.js') }}"></script>
        +<script src="{{ asset('js/bootstrap-table.js') }}"></script>
        +<script src="{{ asset('js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        +<script src="{{ asset('js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/bootstrap-table-export.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/tableExport.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/jquery.base64.js') }}"></script>
         <script type="text/javascript">
             $('#table').bootstrapTable({
                 classes: 'table table-responsive table-no-bordered',
        @@ -105,5 +110,3 @@
             });
         </script>
         @stop
        -
        -@stop
        diff --git a/resources/views/reports/unaccepted_assets.blade.php b/resources/views/reports/unaccepted_assets.blade.php
        index 6da5ea7240..6a331c3881 100644
        --- a/resources/views/reports/unaccepted_assets.blade.php
        +++ b/resources/views/reports/unaccepted_assets.blade.php
        @@ -13,91 +13,89 @@
         
         <div class="row">
           <div class="col-md-12">
        -
        -  <div class="box box-default">
        -    <div class="box-body">
        -
        -      <div class="table-responsive">
        -        <table
        -        name="unacceptedAssetsReport"
        -        id="table"
        -        data-cookie="true"
        -        data-click-to-select="true"
        -        data-cookie-id-table="unacceptedAssets">
        -           <thead>
        -           <tr role="row">
        -               <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        -               <th class="col-sm-1">{{ trans('general.category') }}</th>
        -               <th class="col-sm-1">{{ trans('admin/hardware/form.model') }}</th>
        -               <th class="col-sm-1">{{ trans('admin/hardware/form.name') }}</th>
        -               <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        -               <th class="col-sm-1">{{ trans('admin/hardware/table.checkoutto') }}</th>
        -           </tr>
        -           </thead>
        -           <tbody>
        -           @if ($assetsForReport)
        -               @foreach ($assetsForReport as $assetItem)
        -                   <tr>
        -                       <td>{{ is_null($assetItem->company) ? '' : $assetItem->company->name }}</td>
        -                       <td>{{ $assetItem->model->category->name }}</td>
        -                       <td>{{ $assetItem->model->name }}</td>
        -                       <td>{{ link_to(config('app.url').'/hardware/'.$assetItem->id.'/view',$assetItem->showAssetName()) }}</td>
        -                       <td>{{ $assetItem->asset_tag }}</td>
        -                       <td>{{ link_to(config('app.url').'/admin/users/'.$assetItem->assigned_to.'/view', $assetItem->assigneduser->fullName())}}</td>
        -                   </tr>
        -               @endforeach
        -           @endif
        -           </tbody>
        -           <tfoot>
        -           <tr>
        -           </tr>
        -           </tfoot>
        -       </table>
        -     </div>
        +    <div class="box box-default">
        +      <div class="box-body">
        +        <div class="table-responsive">
        +          <table
        +          name="unacceptedAssetsReport"
        +          id="table"
        +          data-cookie="true"
        +          data-click-to-select="true"
        +          data-cookie-id-table="unacceptedAssets">
        +            <thead>
        +              <tr role="row">
        +                <th class="col-sm-1">{{ trans('admin/companies/table.title') }}</th>
        +                <th class="col-sm-1">{{ trans('general.category') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/form.model') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/form.name') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.asset_tag') }}</th>
        +                <th class="col-sm-1">{{ trans('admin/hardware/table.checkoutto') }}</th>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              @if ($assetsForReport)
        +              @foreach ($assetsForReport as $assetItem)
        +              <tr>
        +                <td>{{ is_null($assetItem->company) ? '' : $assetItem->company->name }}</td>
        +                <td>{{ $assetItem->model->category->name }}</td>
        +                <td>{{ $assetItem->model->name }}</td>
        +                <td>{!! $assetItem->present()->nameUrl() !!}</td>
        +                <td>{{ $assetItem->asset_tag }}</td>
        +                <td>{!! $assetItem->assignedTo->present()->nameUrl() !!}</td>
        +              </tr>
        +              @endforeach
        +              @endif
        +            </tbody>
        +            <tfoot>
        +              <tr>
        +              </tr>
        +            </tfoot>
        +          </table>
        +        </div>
        +      </div>
             </div>
           </div>
         </div>
        -</div>
        -
        -    @section('moar_scripts')
        -    <script src="{{ asset('assets/js/bootstrap-table.js') }}"></script>
        -    <script src="{{ asset('assets/js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        -    <script src="{{ asset('assets/js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        -    <script src="{{ asset('assets/js/extensions/export/bootstrap-table-export.js') }}"></script>
        -    <script src="{{ asset('assets/js/extensions/export/tableExport.js') }}"></script>
        -    <script src="{{ asset('assets/js/extensions/export/jquery.base64.js') }}"></script>
        -    <script type="text/javascript">
        -        $('#table').bootstrapTable({
        -            classes: 'table table-responsive table-no-bordered',
        -            undefinedText: '',
        -            iconsPrefix: 'fa',
        -            showRefresh: true,
        -            search: true,
        -            pageSize: {{ $snipeSettings->per_page }},
        -            pagination: true,
        -            sidePagination: 'client',
        -            sortable: true,
        -            cookie: true,
        -            mobileResponsive: true,
        -            showExport: true,
        -            showColumns: true,
        -            exportDataType: 'all',
        -            exportTypes: ['csv', 'txt','json', 'xml'],
        -            maintainSelected: true,
        -            paginationFirstText: "{{ trans('general.first') }}",
        -            paginationLastText: "{{ trans('general.last') }}",
        -            paginationPreText: "{{ trans('general.previous') }}",
        -            paginationNextText: "{{ trans('general.next') }}",
        -            pageList: ['10','25','50','100','150','200'],
        -            icons: {
        -                paginationSwitchDown: 'fa-caret-square-o-down',
        -                paginationSwitchUp: 'fa-caret-square-o-up',
        -                columns: 'fa-columns',
        -                refresh: 'fa-refresh'
        -            },
        -
        -        });
        -    </script>
        -    @stop
         
         @stop
        +
        +@section('moar_scripts')
        +<script src="{{ asset('js/bootstrap-table.js') }}"></script>
        +<script src="{{ asset('js/extensions/cookie/bootstrap-table-cookie.js') }}"></script>
        +<script src="{{ asset('js/extensions/mobile/bootstrap-table-mobile.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/bootstrap-table-export.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/tableExport.js') }}"></script>
        +<script src="{{ asset('js/extensions/export/jquery.base64.js') }}"></script>
        +<script type="text/javascript">
        +    $('#table').bootstrapTable({
        +        classes: 'table table-responsive table-no-bordered',
        +        undefinedText: '',
        +        iconsPrefix: 'fa',
        +        showRefresh: true,
        +        search: true,
        +        pageSize: {{ $snipeSettings->per_page }},
        +        pagination: true,
        +        sidePagination: 'client',
        +        sortable: true,
        +        cookie: true,
        +        mobileResponsive: true,
        +        showExport: true,
        +        showColumns: true,
        +        exportDataType: 'all',
        +        exportTypes: ['csv', 'txt','json', 'xml'],
        +        maintainSelected: true,
        +        paginationFirstText: "{{ trans('general.first') }}",
        +        paginationLastText: "{{ trans('general.last') }}",
        +        paginationPreText: "{{ trans('general.previous') }}",
        +        paginationNextText: "{{ trans('general.next') }}",
        +        pageList: ['10','25','50','100','150','200'],
        +        icons: {
        +            paginationSwitchDown: 'fa-caret-square-o-down',
        +            paginationSwitchUp: 'fa-caret-square-o-up',
        +            columns: 'fa-columns',
        +            refresh: 'fa-refresh'
        +        },
        +
        +    });
        +</script>
        +@stop
        diff --git a/resources/views/settings/alerts.blade.php b/resources/views/settings/alerts.blade.php
        new file mode 100644
        index 0000000000..29e3ea54ce
        --- /dev/null
        +++ b/resources/views/settings/alerts.blade.php
        @@ -0,0 +1,147 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Alert Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-bell"></i> Alerts
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <!-- Alerts Enabled -->
        +                        <div class="form-group {{ $errors->has('alert_email') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('alert_email', trans('admin/settings/general.alerts_enabled')) }}
        +                            </div>
        +                            <div class="col-md-5">
        +                                {{ Form::checkbox('alerts_enabled', '1', Input::old('alerts_enabled', $setting->alerts_enabled),array('class' => 'minimal')) }}
        +                                {{ trans('admin/settings/general.alerts_enabled') }}
        +                            </div>
        +                        </div>
        +
        +
        +
        +                        <!-- Alert Email -->
        +                        <div class="form-group {{ $errors->has('alert_email') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('alert_email', trans('admin/settings/general.alert_email')) }}
        +                            </div>
        +                            <div class="col-md-7">
        +                                {{ Form::text('alert_email', Input::old('alert_email', $setting->alert_email), array('class' => 'form-control','placeholder' => 'admin@yourcompany.com')) }}
        +                                {!! $errors->first('alert_email', '<span class="alert-msg">:message</span><br>') !!}
        +
        +                                <p class="help-block">Email addresses or distribution lists you want alerts to be sent to, comma separated</p>
        +
        +
        +                            </div>
        +                        </div>
        +
        +                        <!-- Alert interval -->
        +                        <div class="form-group {{ $errors->has('alert_interval') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('alert_interval', trans('admin/settings/general.alert_interval')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::text('alert_interval', Input::old('alert_interval', $setting->alert_interval), array('class' => 'form-control','placeholder' => '30', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        +                                {!! $errors->first('alert_interval', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- Alert threshold -->
        +                        <div class="form-group {{ $errors->has('alert_threshold') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('alert_threshold', trans('admin/settings/general.alert_inv_threshold')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::text('alert_threshold', Input::old('alert_threshold', $setting->alert_threshold), array('class' => 'form-control','placeholder' => '5', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        +                                {!! $errors->first('alert_threshold', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Alert interval -->
        +                        <div class="form-group {{ $errors->has('audit_interval') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('audit_interval', trans('admin/settings/general.audit_interval')) }}
        +                            </div>
        +                            <div class="input-group col-md-2">
        +                                {{ Form::text('audit_interval', Input::old('audit_interval', $setting->audit_interval), array('class' => 'form-control','placeholder' => '12', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        +                                <span class="input-group-addon">{{ trans('general.months') }}</span>
        +                            </div>
        +                            <div class="col-md-9 col-md-offset-3">
        +                                {!! $errors->first('audit_interval', '<span class="alert-msg">:message</span>') !!}
        +                                <p class="help-block">{{ trans('admin/settings/general.audit_interval_help') }}</p>
        +                            </div>
        +                        </div>
        +
        +                        <!-- Alert threshold -->
        +                        <div class="form-group {{ $errors->has('audit_warning_days') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('audit_warning_days', trans('admin/settings/general.audit_warning_days')) }}
        +                            </div>
        +                            <div class="input-group col-md-2">
        +                                {{ Form::text('audit_warning_days', Input::old('audit_warning_days', $setting->audit_warning_days), array('class' => 'form-control','placeholder' => '14', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        +                                <span class="input-group-addon">{{ trans('general.days') }}</span>
        +
        +
        +
        +
        +                            </div>
        +                            <div class="col-md-9 col-md-offset-3">
        +                                {!! $errors->first('audit_warning_days', '<span class="alert-msg">:message</span>') !!}
        +                                <p class="help-block">{{ trans('admin/settings/general.audit_warning_days_help') }}</p>
        +                            </div>
        +                        </div>
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        +
        diff --git a/resources/views/settings/api.blade.php b/resources/views/settings/api.blade.php
        new file mode 100644
        index 0000000000..6de71583e5
        --- /dev/null
        +++ b/resources/views/settings/api.blade.php
        @@ -0,0 +1,28 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +   OAuth API Settings
        +    @parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +    @if (!config('app.lock_passwords'))
        +        <div id="app">
        +            <passport-clients></passport-clients>
        +            <passport-authorized-clients></passport-authorized-clients>
        +        </div>
        +    @else
        +        <p class="help-block">{{ trans('general.feature_disabled') }}</p>
        +    @endif
        +
        +@stop
        +
        +@section('moar_scripts')
        +<script>
        +    new Vue({
        +        el: "#app",
        +    });
        +</script>
        +@endsection
        diff --git a/resources/views/settings/asset_tags.blade.php b/resources/views/settings/asset_tags.blade.php
        new file mode 100644
        index 0000000000..47d2f40ed1
        --- /dev/null
        +++ b/resources/views/settings/asset_tags.blade.php
        @@ -0,0 +1,109 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Asset Tag Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-list-ol"></i> Asset Tags
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <!-- auto ids -->
        +                        <div class="form-group">
        +                            <div class="col-md-5">
        +                                {{ Form::label('auto_increment_assets', trans('admin/settings/general.asset_ids')) }}
        +                            </div>
        +                            <div class="col-md-7">
        +                                {{ Form::checkbox('auto_increment_assets', '1', Input::old('auto_increment_assets', $setting->auto_increment_assets),array('class' => 'minimal')) }}
        +                                {{ trans('admin/settings/general.auto_increment_assets') }}
        +                            </div>
        +                        </div>
        +
        +                        <div class="form-group">
        +                            <div class="col-md-5">
        +                                {{ Form::label('next_auto_tag_base', trans('admin/settings/general.next_auto_tag_base')) }}
        +                            </div>
        +                            <div class="col-md-7">
        +                                {{ Form::text('next_auto_tag_base', Input::old('next_auto_tag_base', $setting->next_auto_tag_base), array('class' => 'form-control', 'style'=>'width: 150px;')) }}
        +                                {!! $errors->first('next_auto_tag_base', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- auto prefix -->
        +                        <div class="form-group {{ $errors->has('auto_increment_prefix') ? 'error' : '' }}">
        +                            <div class="col-md-5">
        +                                {{ Form::label('auto_increment_prefix', trans('admin/settings/general.auto_increment_prefix')) }}
        +                            </div>
        +                            <div class="col-md-7">
        +                                @if ($setting->auto_increment_assets == 1)
        +                                    {{ Form::text('auto_increment_prefix', Input::old('auto_increment_prefix', $setting->auto_increment_prefix), array('class' => 'form-control', 'style'=>'width: 150px;')) }}
        +                                    {!! $errors->first('auto_increment_prefix', '<span class="alert-msg">:message</span>') !!}
        +                                @else
        +                                    {{ Form::text('auto_increment_prefix', Input::old('auto_increment_prefix', $setting->auto_increment_prefix), array('class' => 'form-control', 'disabled'=>'disabled', 'style'=>'width: 150px;')) }}
        +                                @endif
        +                            </div>
        +                        </div>
        +
        +                        <!-- auto zerofill -->
        +                        <div class="form-group {{ $errors->has('zerofill_count') ? 'error' : '' }}">
        +                            <div class="col-md-5">
        +                                {{ Form::label('auto_increment_prefix', trans('admin/settings/general.zerofill_count')) }}
        +                            </div>
        +                            <div class="col-md-7">
        +                                {{ Form::text('zerofill_count', Input::old('zerofill_count', $setting->zerofill_count), array('class' => 'form-control', 'style'=>'width: 150px;')) }}
        +                                {!! $errors->first('zerofill_count', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        diff --git a/resources/views/settings/backups.blade.php b/resources/views/settings/backups.blade.php
        index a6583d819d..534a291005 100644
        --- a/resources/views/settings/backups.blade.php
        +++ b/resources/views/settings/backups.blade.php
        @@ -6,6 +6,10 @@
         @parent
         @stop
         
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
         {{-- Page content --}}
         @section('content')
         
        @@ -15,7 +19,6 @@
             <div class="box box-default">
               <div class="box-body">
                 <div class="table-responsive">
        -
                   <table class="table table-striped">
                     <thead>
                       <th>File</th>
        @@ -24,20 +27,23 @@
                       <th></th>
                     </thead>
                     <tbody>
        -              @foreach ($files as $file)
        -              <tr>
        -                <td><a href="backups/download/{{ $file['filename'] }}">{{ $file['filename'] }}</a></td>
        -                <td>{{ date("M d, Y g:i A", $file['modified']) }} </td>
        -                <td>{{ $file['filesize'] }}</td>
        -                <td>
        -                    <a data-html="false"
        -                    class="btn delete-asset btn-danger btn-sm {{ (config('app.lock_passwords')) ? ' disabled': '' }}" data-toggle="modal" href=" {{ route('settings/delete-file', $file['filename']) }}" data-content="{{ trans('admin/settings/message.backup.delete_confirm') }}" data-title="{{ trans('general.delete') }}  {{ htmlspecialchars($file['filename']) }} ?" onClick="return false;">
        -                        <i class="fa fa-trash icon-white"></i>
        -                    </a>
        -                </td>
        -              </tr>
        -              @endforeach
        -              </tbody>
        +            @foreach ($files as $file)
        +            <tr>
        +              <td><a href="backups/download/{{ $file['filename'] }}">{{ $file['filename'] }}</a></td>
        +              <td>{{ date("M d, Y g:i A", $file['modified']) }} </td>
        +              <td>{{ $file['filesize'] }}</td>
        +              <td>
        +
        +                  @can('superadmin')
        +                      <a data-html="false"
        +                         class="btn delete-asset btn-danger btn-sm {{ (config('app.lock_passwords')) ? ' disabled': '' }}" data-toggle="modal" href=" {{ route('settings.backups.destroy', $file['filename']) }}" data-content="{{ trans('admin/settings/message.backup.delete_confirm') }}" data-title="{{ trans('general.delete') }}  {{ htmlspecialchars($file['filename']) }} ?" onClick="return false;">
        +                          <i class="fa fa-trash icon-white"></i>
        +                      </a>
        +                  @endcan
        +              </td>
        +            </tr>
        +            @endforeach
        +            </tbody>
                   </table>
               </div>
             </div>
        @@ -50,7 +56,7 @@
                 {{ Form::hidden('_token', csrf_token()) }}
         
                   <p>
        -              <button class="btn btn-default {{ (config('app.lock_passwords')) ? ' disabled': '' }}">{{ trans('admin/settings/general.generate_backup') }}</button>
        +              <button class="btn btn-success {{ (config('app.lock_passwords')) ? ' disabled': '' }}">{{ trans('admin/settings/general.generate_backup') }}</button>
                   </p>
         
                    @if (config('app.lock_passwords'))
        diff --git a/resources/views/settings/barcodes.blade.php b/resources/views/settings/barcodes.blade.php
        new file mode 100644
        index 0000000000..603eb0ef74
        --- /dev/null
        +++ b/resources/views/settings/barcodes.blade.php
        @@ -0,0 +1,134 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Barcode Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-barcode"></i> Barcodes
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                    @if ($is_gd_installed)
        +                        <!-- qr code -->
        +                            <div class="form-group">
        +                                <div class="col-md-3">
        +                                    {{ Form::label('qr_code', trans('admin/settings/general.display_qr')) }}
        +                                </div>
        +                                <div class="col-md-9">
        +                                    {{ Form::checkbox('qr_code', '1', Input::old('qr_code', $setting->qr_code),array('class' => 'minimal')) }}
        +                                    {{ trans('general.yes') }}
        +                                </div>
        +                            </div>
        +
        +                            <!-- square barcode type -->
        +                            <div class="form-group{{ $errors->has('barcode_type') ? ' has-error' : '' }}">
        +                                <div class="col-md-3">
        +                                    {{ Form::label('barcode_type', trans('admin/settings/general.barcode_type')) }}
        +                                </div>
        +                                <div class="col-md-9">
        +                                    {!! Form::barcode_types('barcode_type', Input::old('barcode_type', $setting->barcode_type), 'select2') !!}
        +                                    {!! $errors->first('barcode_type', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                                </div>
        +                            </div>
        +
        +                            <!-- barcode -->
        +                            <div class="form-group">
        +                                <div class="col-md-3">
        +                                    {{ Form::label('qr_code', trans('admin/settings/general.display_alt_barcode')) }}
        +                                </div>
        +                                <div class="col-md-9">
        +                                    {{ Form::checkbox('alt_barcode_enabled', '1', Input::old('alt_barcode_enabled', $setting->alt_barcode_enabled),array('class' => 'minimal')) }}
        +                                    {{ trans('general.yes') }}
        +                                </div>
        +                            </div>
        +
        +                            <!-- barcode type -->
        +                            <div class="form-group{{ $errors->has('alt_barcode') ? ' has-error' : '' }}">
        +                                <div class="col-md-3">
        +                                    {{ Form::label('alt_barcode', trans('admin/settings/general.alt_barcode_type')) }}
        +                                </div>
        +                                <div class="col-md-9">
        +                                    {!! Form::alt_barcode_types('alt_barcode', Input::old('alt_barcode', $setting->alt_barcode), 'select2') !!}
        +                                    {!! $errors->first('barcode_type', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                                </div>
        +                            </div>
        +                        @else
        +                            <span class="help-block col-md-offset-3 col-md-12">
        +                    {{ trans('admin/settings/general.php_gd_warning') }}
        +                                <br>
        +                                {{ trans('admin/settings/general.php_gd_info') }}
        +                  </span>
        +                    @endif
        +
        +                    <!-- qr text -->
        +                        <div class="form-group {{ $errors->has('qr_text') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('qr_text', trans('admin/settings/general.qr_text')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if ($setting->qr_code == 1)
        +                                    {{ Form::text('qr_text', Input::old('qr_text', $setting->qr_text), array('class' => 'form-control','placeholder' => 'Property of Your Company',
        +                                    'rel' => 'txtTooltip',
        +                                    'title' =>'Extra text that you would like to display on your labels. ',
        +                                    'data-toggle' =>'tooltip',
        +                                    'data-placement'=>'top')) }}
        +                                    {!! $errors->first('qr_text', '<span class="alert-msg">:message</span>') !!}
        +                                @else
        +                                    {{ Form::text('qr_text', Input::old('qr_text', $setting->qr_text), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'Property of Your Company')) }}
        +                                    <p class="help-block">{{ trans('admin/settings/general.qr_help') }}</p>
        +                                @endif
        +                            </div>
        +                        </div>
        +
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        diff --git a/resources/views/settings/branding.blade.php b/resources/views/settings/branding.blade.php
        new file mode 100644
        index 0000000000..a0ea7cd54d
        --- /dev/null
        +++ b/resources/views/settings/branding.blade.php
        @@ -0,0 +1,159 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Branding Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +    <!-- Bootstrap Color Picker -->
        +    <link rel="stylesheet" href="{{ asset('js/plugins/colorpicker/bootstrap-colorpicker.min.css') }}">
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-copyright"></i> Branding
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <!-- Site name -->
        +                        <div class="form-group {{ $errors->has('site_name') ? 'error' : '' }}">
        +
        +                            <div class="col-md-3">
        +                                {{ Form::label('site_name', trans('admin/settings/general.site_name')) }}
        +                            </div>
        +                            <div class="col-md-7">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('site_name', Input::old('site_name', $setting->site_name), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'Snipe-IT Asset Management')) }}
        +                                @else
        +                                    {{ Form::text('site_name',
        +                                        Input::old('site_name', $setting->site_name), array('class' => 'form-control','placeholder' => 'Snipe-IT Asset Management')) }}
        +                                @endif
        +                                {!! $errors->first('site_name', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Logo -->
        +                        <div class="form-group {{ $errors->has('image') ? 'has-error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('logo', trans('admin/settings/general.logo')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords'))
        +                                    <p class="help-block">{{ trans('general.lock_passwords') }}</p>
        +                                @else
        +                                    {{ Form::file('image') }}
        +                                    {!! $errors->first('image', '<span class="alert-msg">:message</span>') !!}
        +                                    {{ Form::checkbox('clear_logo', '1', Input::old('clear_logo'),array('class' => 'minimal')) }} Remove
        +                                @endif
        +                            </div>
        +                        </div>
        +
        +                        <!-- Branding -->
        +                        <div class="form-group {{ $errors->has('brand') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('brand', trans('admin/settings/general.brand')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {!! Form::select('brand', array('1'=>'Text','2'=>'Logo','3'=>'Logo + Text'), Input::old('brand', $setting->brand), array('class' => 'form-control', 'style'=>'width: 150px ;')) !!}
        +                                {!! $errors->first('brand', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- Header color -->
        +                        <div class="form-group {{ $errors->has('header_color') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('header_color', trans('admin/settings/general.header_color')) }}
        +                            </div>
        +                            <div class="col-md-2">
        +                                <div class="input-group header-color">
        +                                    {{ Form::text('header_color', Input::old('header_color', $setting->header_color), array('class' => 'form-control', 'style' => 'width: 100px;','placeholder' => '#FF0000')) }}
        +                                    <div class="input-group-addon">
        +                                        <i></i>
        +                                    </div>
        +                                </div><!-- /.input group -->
        +                                {!! $errors->first('header_color', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- Custom css -->
        +                        <div class="form-group {{ $errors->has('custom_css') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('custom_css', trans('admin/settings/general.custom_css')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::textarea('custom_css', Input::old('custom_css', $setting->custom_css), array('class' => 'form-control','placeholder' => 'Add your custom CSS','disabled'=>'disabled')) }}
        +                                    {!! $errors->first('custom_css', '<span class="alert-msg">:message</span>') !!}
        +                                    <p class="help-block">{{ trans('general.lock_passwords') }}</p>
        +                                @else
        +                                    {{ Form::textarea('custom_css', Input::old('custom_css', $setting->custom_css), array('class' => 'form-control','placeholder' => 'Add your custom CSS')) }}
        +                                    {!! $errors->first('custom_css', '<span class="alert-msg">:message</span>') !!}
        +                                @endif
        +                                <p class="help-block">{{ trans('admin/settings/general.custom_css_help') }}</p>
        +                            </div>
        +                        </div>
        +
        +
        +
        +
        +                    </div>
        +
        +                    </div> <!--/.box-body-->
        +                    <div class="box-footer">
        +                        <div class="text-left col-md-6">
        +                            <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                        </div>
        +                        <div class="text-right col-md-6">
        +                            <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                        </div>
        +
        +                    </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        +
        +@section('moar_scripts')
        +    <!-- bootstrap color picker -->
        +    <script>
        +        //color picker with addon
        +        $(".header-color").colorpicker();
        +        // toggle the disabled state of asset id prefix
        +        $('#auto_increment_assets').on('ifChecked', function(){
        +            $('#auto_increment_prefix').prop('disabled', false).focus();
        +        }).on('ifUnchecked', function(){
        +            $('#auto_increment_prefix').prop('disabled', true);
        +        });
        +    </script>
        +@stop
        diff --git a/resources/views/settings/edit.blade.php b/resources/views/settings/edit.blade.php
        deleted file mode 100755
        index 56865e7a3e..0000000000
        --- a/resources/views/settings/edit.blade.php
        +++ /dev/null
        @@ -1,1048 +0,0 @@
        -@extends('layouts/default')
        -
        -{{-- Page title --}}
        -@section('title')
        -{{ trans('admin/settings/general.update') }}
        -@parent
        -@stop
        -
        -
        -{{-- Page content --}}
        -@section('content')
        -
        -
        -<style>
        -.checkbox label {
        -  padding-right: 40px;
        -}
        -
        -.input-group-addon {
        -  width: 30px;
        -}
        -
        -</style>
        -
        -<!-- Bootstrap Color Picker -->
        -<link rel="stylesheet" href="{{ asset('assets/js/plugins/colorpicker/bootstrap-colorpicker.min.css') }}">
        -
        -
        -{{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        -<!-- CSRF Token -->
        -{{ Form::hidden('_token', csrf_token()) }}
        -
        -
        -
        -<div class="row">
        -  <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        -
        -    <div class="panel box box-default">
        -      <div class="box-header">
        -        <h3 class="box-title"></h3>
        -        <div class="box-tools pull-right">
        -          <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        -        </div><!-- /box tools -->
        -      </div> <!-- /box header -->
        -      <div class="box-body">
        -        <div class="box-group" id="accordion" role="tablist" aria-multiselectable="true">
        -          <div class="panel box box-primary">
        -              <div class="box-header with-border">
        -                <h4 class="box-title">
        -                  <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" class="accordion-header">
        -                    <i class="fa fa-cogs"></i> {{ trans('admin/settings/general.general_settings') }}
        -                  </a>
        -                </h4>
        -              </div>
        -            <div id="collapseOne" class="panel-collapse collapse in" role="tabbox" aria-labelledby="headingOne">
        -              <div class="box-body">
        -
        -                <!-- Site name -->
        -                <div class="form-group {{ $errors->has('site_name') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('site_name', trans('admin/settings/general.site_name')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('site_name', Input::old('site_name', $setting->site_name), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'Snipe-IT Asset Management')) }}
        -                    @else
        -                      {{ Form::text('site_name',
        -                          Input::old('site_name', $setting->site_name), array('class' => 'form-control','placeholder' => 'Snipe-IT Asset Management')) }}
        -                    @endif
        -                    {!! $errors->first('site_name', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Two Factor -->
        -                <div class="form-group {{ $errors->has('brand') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('two_factor_enabled', trans('admin/settings/general.two_factor_enabled_text')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -
        -                    {!! Form::two_factor_options('two_factor_enabled', Input::old('two_factor_enabled', $setting->two_factor_enabled), 'select2') !!}
        -                    <p class="help-block">{{ trans('admin/settings/general.two_factor_enabled_warning') }}</p>
        -
        -                    @if (config('app.lock_passwords'))
        -                    <p class="help-block">{{ trans('general.feature_disabled') }}</p>
        -                    @endif
        -
        -                    {!! $errors->first('two_factor_enabled', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Languages -->
        -                <div class="form-group {{ $errors->has('site_name') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('site_name', trans('admin/settings/general.default_language')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                     {!! Form::locales('locale', Input::old('locale', $setting->locale), 'select2') !!}
        -
        -                    {!! $errors->first('locale', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Full Multiple Companies Support -->
        -                <div class="form-group {{ $errors->has('full_multiple_companies_support') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('full_multiple_companies_support',
        -                                   trans('admin/settings/general.full_multiple_companies_support_text')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::checkbox('full_multiple_companies_support', '1', Input::old('full_multiple_companies_support', $setting->full_multiple_companies_support),array('class' => 'minimal')) }}
        -                    {{ trans('admin/settings/general.full_multiple_companies_support_text') }}
        -                    {!! $errors->first('full_multiple_companies_support', '<span class="alert-msg">:message</span>') !!}
        -                    <p class="help-block">{{ trans('admin/settings/general.full_multiple_companies_support_help_text') }}</p>
        -                  </div>
        -                </div>
        -                <!-- /.form-group -->
        -
        -                <!-- Require signature for acceptance -->
        -                <div class="form-group {{ $errors->has('require_accept_signature') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('full_multiple_companies_support',
        -                                   trans('admin/settings/general.require_accept_signature')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::checkbox('require_accept_signature', '1', Input::old('require_accept_signature', $setting->require_accept_signature),array('class' => 'minimal')) }}
        -                    {{ trans('general.yes') }}
        -                    {!! $errors->first('require_accept_signature', '<span class="alert-msg">:message</span>') !!}
        -                    <p class="help-block">{{ trans('admin/settings/general.require_accept_signature_help_text') }}</p>
        -                  </div>
        -                </div>
        -                <!-- /.form-group -->
        -
        -                <!-- Logo -->
        -                <div class="form-group {{ $errors->has('logo') ? 'has-error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('logo', trans('admin/settings/general.logo')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords'))
        -                        <p class="help-block">{{ trans('general.lock_passwords') }}</p>
        -                    @else
        -                      {{ Form::file('logo_img') }}
        -                      {!! $errors->first('logo', '<span class="alert-msg">:message</span>') !!}
        -                      {{ Form::checkbox('clear_logo', '1', Input::old('clear_logo'),array('class' => 'minimal')) }} Remove
        -                    @endif
        -                  </div>
        -                </div>
        -
        -                <!-- Branding -->
        -                <div class="form-group {{ $errors->has('brand') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('brand', trans('admin/settings/general.brand')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {!! Form::select('brand', array('1'=>'Text','2'=>'Logo','3'=>'Logo + Text'), Input::old('brand', $setting->brand), array('class' => 'form-control', 'style'=>'width: 150px ;')) !!}
        -                    {!! $errors->first('brand', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Currency -->
        -                <div class="form-group {{ $errors->has('default_currency') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('default_currency', trans('admin/settings/general.default_currency')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::text('default_currency', Input::old('default_currency', $setting->default_currency), array('class' => 'form-control','placeholder' => 'USD', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        -                    {!! $errors->first('default_currency', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Email domain -->
        -                <div class="form-group {{ $errors->has('email_domain') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('email_domain', trans('general.email_domain')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::text('email_domain', Input::old('email_domain', $setting->email_domain), array('class' => 'form-control','placeholder' => 'example.com')) }}
        -                    <span class="help-block">{{ trans('general.email_domain_help')  }}</span>
        -
        -                    {!! $errors->first('email_domain', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -
        -                <!-- Email format -->
        -                <div class="form-group {{ $errors->has('email_format') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('email_format', trans('general.email_format')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {!! Form::username_format('email_format', Input::old('email_format', $setting->email_format), 'select2') !!}
        -
        -                    {!! $errors->first('email_format', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Username format -->
        -                <div class="form-group {{ $errors->has('username_format') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('username_format', trans('general.username_format')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {!! Form::username_format('username_format', Input::old('username_format', $setting->username_format), 'select2') !!}
        -
        -                    {!! $errors->first('username_format', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Alert Email -->
        -                <div class="form-group {{ $errors->has('alert_email') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('alert_email', trans('admin/settings/general.alert_email')) }}
        -                  </div>
        -                  <div class="col-md-5">
        -                    {{ Form::text('alert_email', Input::old('alert_email', $setting->alert_email), array('class' => 'form-control','placeholder' => 'admin@yourcompany.com',
        -                    'rel' => 'txtTooltip',
        -                    'title' =>'Email addresses or distribution lists you want alerts to be sent to, comma separated.',
        -                    'data-toggle' =>'tooltip',
        -                    'data-placement'=>'top')) }}
        -                    {!! $errors->first('alert_email', '<span class="alert-msg">:message</span><br>') !!}
        -
        -                    {{ Form::checkbox('alerts_enabled', '1', Input::old('alerts_enabled', $setting->alerts_enabled),array('class' => 'minimal')) }}
        -                    {{ trans('admin/settings/general.alerts_enabled') }}
        -
        -                  </div>
        -                </div>
        -
        -                <!-- Alert interval -->
        -                <div class="form-group {{ $errors->has('alert_interval') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('alert_interval', trans('admin/settings/general.alert_interval')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::text('alert_interval', Input::old('alert_interval', $setting->alert_interval), array('class' => 'form-control','placeholder' => '30', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        -                    {!! $errors->first('alert_interval', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Alert threshold -->
        -                <div class="form-group {{ $errors->has('alert_threshold') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('alert_threshold', trans('admin/settings/general.alert_inv_threshold')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::text('alert_threshold', Input::old('alert_threshold', $setting->alert_threshold), array('class' => 'form-control','placeholder' => '5', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        -                    {!! $errors->first('alert_threshold', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -
        -
        -
        -                <!-- Header color -->
        -                <div class="form-group {{ $errors->has('header_color') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('header_color', trans('admin/settings/general.header_color')) }}
        -                  </div>
        -                  <div class="col-md-2">
        -                      <div class="input-group header-color">
        -                        {{ Form::text('header_color', Input::old('header_color', $setting->header_color), array('class' => 'form-control', 'style' => 'width: 100px;','placeholder' => '#FF0000')) }}
        -                        <div class="input-group-addon">
        -                          <i></i>
        -                        </div>
        -                      </div><!-- /.input group -->
        -
        -
        -                    {!! $errors->first('header_color', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -                <!-- Custom css -->
        -                <div class="form-group {{ $errors->has('custom_css') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('custom_css', trans('admin/settings/general.custom_css')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::textarea('custom_css', Input::old('custom_css', $setting->custom_css), array('class' => 'form-control','placeholder' => 'Add your custom CSS','disabled'=>'disabled')) }}
        -                      {!! $errors->first('custom_css', '<span class="alert-msg">:message</span>') !!}
        -                      <p class="help-block">{{ trans('general.lock_passwords') }}</p>
        -                    @else
        -                      {{ Form::textarea('custom_css', Input::old('custom_css', $setting->custom_css), array('class' => 'form-control','placeholder' => 'Add your custom CSS')) }}
        -                      {!! $errors->first('custom_css', '<span class="alert-msg">:message</span>') !!}
        -                    @endif
        -                   <p class="help-block">{{ trans('admin/settings/general.custom_css_help') }}</p>
        -                  </div>
        -                </div>
        -
        -                <!-- remote load -->
        -                <div class="form-group">
        -                  <div class="col-md-3">
        -                  {{ Form::label('load_remote', trans('admin/settings/general.load_remote_text')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                  {{ Form::checkbox('load_remote', '1', Input::old('load_remote', $setting->load_remote),array('class' => 'minimal')) }}
        -                            {{ trans('admin/settings/general.load_remote_help_text') }}
        -                  </div>
        -                </div>
        -
        -                <!-- Per Page -->
        -                <div class="form-group {{ $errors->has('per_page') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('per_page', trans('admin/settings/general.per_page')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::text('per_page', Input::old('per_page', $setting->per_page), array('class' => 'form-control','placeholder' => '5', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        -                    {!! $errors->first('per_page', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -                </div>
        -
        -
        -              </div>
        -            </div>
        -          </div>
        -          <div class="panel box box-primary">
        -            <div class="box-header with-border">
        -                <h4 class="box-title">
        -                  <a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" class="accordion-header">
        -                    <i class="fa fa-hashtag"></i> {{ trans('admin/settings/general.asset_ids') }}
        -                  </a>
        -                </h4>
        -            </div>
        -
        -            <div id="collapseTwo" class="box-collapse collapse" role="tabbox" aria-labelledby="headingTwo">
        -              <div class="box-body">
        -                <!-- auto ids -->
        -                <div class="form-group">
        -                  <div class="col-md-3">
        -                  {{ Form::label('auto_increment_assets', trans('admin/settings/general.asset_ids')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                  {{ Form::checkbox('auto_increment_assets', '1', Input::old('auto_increment_assets', $setting->auto_increment_assets),array('class' => 'minimal')) }}
        -                            {{ trans('admin/settings/general.auto_increment_assets') }}
        -                  </div>
        -                </div>
        -
        -                <!-- auto prefix -->
        -                <div class="form-group {{ $errors->has('auto_increment_prefix') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('auto_increment_prefix', trans('admin/settings/general.auto_increment_prefix')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if ($setting->auto_increment_assets == 1)
        -                    {{ Form::text('auto_increment_prefix', Input::old('auto_increment_prefix', $setting->auto_increment_prefix), array('class' => 'form-control', 'style'=>'width: 100px;')) }}
        -                    {!! $errors->first('auto_increment_prefix', '<span class="alert-msg">:message</span>') !!}
        -                    @else
        -                    {{ Form::text('auto_increment_prefix', Input::old('auto_increment_prefix', $setting->auto_increment_prefix), array('class' => 'form-control', 'disabled'=>'disabled', 'style'=>'width: 100px;')) }}
        -                    @endif
        -                  </div>
        -                </div>
        -
        -                <!-- auto zerofill -->
        -                <div class="form-group {{ $errors->has('zerofill_count') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('auto_increment_prefix', trans('admin/settings/general.zerofill_count')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                      {{ Form::text('zerofill_count', Input::old('zerofill_count', $setting->zerofill_count), array('class' => 'form-control', 'style'=>'width: 100px;')) }}
        -                      {!! $errors->first('zerofill_count', '<span class="alert-msg">:message</span>') !!}
        -
        -                  </div>
        -                </div>
        -
        -              </div>
        -            </div>
        -          </div>
        -          <div class="panel box box-primary">
        -              <div class="box-header with-border">
        -                  <h4 class="box-title">
        -                    <a data-toggle="collapse" data-parent="#accordion" href="#collapseThree" class="accordion-header">
        -                    <i class="fa fa-barcode"></i>
        -                    {{ trans('admin/settings/general.barcode_settings') }}
        -
        -                    </a>
        -                  </h4>
        -              </div>
        -
        -            <div id="collapseThree" class="box-collapse collapse" role="tabbox" aria-labelledby="headingThree">
        -              <div class="box-body">
        -                @if ($is_gd_installed)
        -
        -                  <!-- qr code -->
        -                  <div class="form-group">
        -                    <div class="col-md-3">
        -                      {{ Form::label('qr_code', trans('admin/settings/general.display_qr')) }}
        -                    </div>
        -                    <div class="col-md-9">
        -                      {{ Form::checkbox('qr_code', '1', Input::old('qr_code', $setting->qr_code),array('class' => 'minimal')) }}
        -                      {{ trans('general.yes') }}
        -                    </div>
        -                  </div>
        -
        -                  <!-- square barcode type -->
        -                  <div class="form-group{{ $errors->has('barcode_type') ? ' has-error' : '' }}">
        -                    <div class="col-md-3">
        -                      {{ Form::label('barcode_type', trans('admin/settings/general.barcode_type')) }}
        -                    </div>
        -                    <div class="col-md-9">
        -                      {!! Form::barcode_types('barcode_type', Input::old('barcode_type', $setting->barcode_type), 'select2') !!}
        -                      {!! $errors->first('barcode_type', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -                    <!-- barcode -->
        -                    <div class="form-group">
        -                      <div class="col-md-3">
        -                        {{ Form::label('qr_code', trans('admin/settings/general.display_alt_barcode')) }}
        -                      </div>
        -                      <div class="col-md-9">
        -                        {{ Form::checkbox('alt_barcode_enabled', '1', Input::old('alt_barcode_enabled', $setting->alt_barcode_enabled),array('class' => 'minimal')) }}
        -                        {{ trans('general.yes') }}
        -                      </div>
        -                    </div>
        -
        -                    <!-- barcode type -->
        -                    <div class="form-group{{ $errors->has('alt_barcode') ? ' has-error' : '' }}">
        -                      <div class="col-md-3">
        -                        {{ Form::label('alt_barcode', trans('admin/settings/general.alt_barcode_type')) }}
        -                      </div>
        -                      <div class="col-md-9">
        -                        {!! Form::alt_barcode_types('alt_barcode', Input::old('alt_barcode', $setting->alt_barcode), 'select2') !!}
        -                        {!! $errors->first('barcode_type', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -                      </div>
        -                    </div>
        -
        -                @else
        -                  <span class="help-block col-md-offset-3 col-md-12">
        -                    {{ trans('admin/settings/general.php_gd_warning') }}
        -                    <br>
        -                    {{ trans('admin/settings/general.php_gd_info') }}
        -                  </span>
        -                @endif
        -
        -              </div>
        -            </div>
        -          </div>
        -
        -          <div class="panel box box-primary">
        -
        -              <div class="box-header with-border">
        -                  <h4 class="box-title">
        -                    <a data-toggle="collapse" data-parent="#accordion" href="#collapseSeven" class="accordion-header">
        -                    <i class="fa fa-table"></i>
        -                    Labels
        -
        -                    </a>
        -                  </h4>
        -              </div>
        -
        -            <div id="collapseSeven" class="box-collapse collapse" role="tabbox" aria-labelledby="headingSeven">
        -              <div class="box-body">
        -
        -
        -                <!-- qr text -->
        -                <div class="form-group {{ $errors->has('qr_text') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                  {{ Form::label('qr_text', trans('admin/settings/general.qr_text')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                  @if ($setting->qr_code == 1)
        -                    {{ Form::text('qr_text', Input::old('qr_text', $setting->qr_text), array('class' => 'form-control','placeholder' => 'Property of Your Company',
        -                    'rel' => 'txtTooltip',
        -                    'title' =>'Extra text that you would like to display on your labels. ',
        -                    'data-toggle' =>'tooltip',
        -                    'data-placement'=>'top')) }}
        -                    {!! $errors->first('qr_text', '<span class="alert-msg">:message</span>') !!}
        -                  @else
        -                    {{ Form::text('qr_text', Input::old('qr_text', $setting->qr_text), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'Property of Your Company')) }}
        -                    <p class="help-block">{{ trans('admin/settings/general.qr_help') }}</p>
        -                  @endif
        -                  </div>
        -                </div>
        -
        -                  <div class="form-group {{ $errors->has('labels_per_page') ? 'error' : '' }}">
        -                    <div class="col-md-3">
        -                    {{ Form::label('labels_per_page', trans('admin/settings/general.labels_per_page')) }}
        -                    </div>
        -                    <div class="col-md-9">
        -                      {{ Form::text('labels_per_page', Input::old('labels_per_page', $setting->labels_per_page), array('class' => 'form-control','style' => 'width: 100px;')) }}
        -                      {!! $errors->first('labels_per_page', '<span class="alert-msg">:message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -                  <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        -                    <div class="col-md-3">
        -                    {{ Form::label('labels_width', trans('admin/settings/general.labels_fontsize')) }}
        -                    </div>
        -                    <div class="col-md-2 form-group">
        -                      <div class="input-group">
        -                        {{ Form::text('labels_fontsize', Input::old('labels_fontsize', $setting->labels_fontsize), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.text_pt') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-9 col-md-offset-3">
        -                      {!! $errors->first('labels_fontsize', '<span class="alert-msg">:message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -
        -
        -                  <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        -                    <div class="col-md-3">
        -                    {{ Form::label('labels_width', trans('admin/settings/general.label_dimensions')) }}
        -                    </div>
        -                    <div class="col-md-3 form-group">
        -                      <div class="input-group">
        -                        {{ Form::text('labels_width', Input::old('labels_width', $setting->labels_width), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.width_w') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-3 form-group" style="margin-left: 10px">
        -                      <div class="input-group">
        -                        {{ Form::text('labels_height', Input::old('labels_height', $setting->labels_height), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.height_h') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-9 col-md-offset-3">
        -                      {!! $errors->first('labels_width', '<span class="alert-msg">:message</span>') !!}
        -                      {!! $errors->first('labels_height', '<span class="alert-msg">:message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -
        -                  <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        -                    <div class="col-md-3">
        -                    {{ Form::label('labels_width', trans('admin/settings/general.label_gutters')) }}
        -                    </div>
        -                    <div class="col-md-3 form-group">
        -                      <div class="input-group">
        -                        {{ Form::text('labels_display_sgutter', Input::old('labels_display_sgutter', $setting->labels_display_sgutter), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.horizontal') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-3 form-group" style="margin-left: 10px">
        -                      <div class="input-group">
        -                        {{ Form::text('labels_display_bgutter', Input::old('labels_display_bgutter', $setting->labels_display_bgutter), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.vertical') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-9 col-md-offset-3">
        -                      {!! $errors->first('labels_display_sgutter', '<span class="alert-msg">:message</span>') !!}
        -                      {!! $errors->first('labels_display_bgutter', '<span class="alert-msg">:message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -
        -
        -                  <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        -                    <div class="col-md-3">
        -                    {{ Form::label('labels_width', trans('admin/settings/general.page_padding')) }}
        -                    </div>
        -                    <div class="col-md-3 form-group">
        -                      <div class="input-group" style="margin-bottom: 15px;">
        -                        {{ Form::text('labels_pmargin_top', Input::old('labels_pmargin_top', $setting->labels_pmargin_top), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.top') }}</div>
        -                      </div>
        -
        -                      <div class="input-group">
        -                        {{ Form::text('labels_pmargin_right', Input::old('labels_pmargin_right', $setting->labels_pmargin_right), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.right') }}</div>
        -                      </div>
        -
        -                    </div>
        -                    <div class="col-md-3 form-group" style="margin-left: 10px; ">
        -                      <div class="input-group" style="margin-bottom: 15px;">
        -                        {{ Form::text('labels_pmargin_bottom', Input::old('labels_pmargin_bottom', $setting->labels_pmargin_bottom), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.bottom') }}</div>
        -                      </div>
        -                      <div class="input-group">
        -                        {{ Form::text('labels_pmargin_left', Input::old('labels_pmargin_left', $setting->labels_pmargin_left), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.left') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-9 col-md-offset-3">
        -                      {!! $errors->first('labels_width', '<span class="alert-msg">:message</span>') !!}
        -                      {!! $errors->first('labels_height', '<span class="alert-msg">:message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -                  <div class="form-group {{ $errors->has('labels_pageheight') ? 'error' : '' }}">
        -                    <div class="col-md-3">
        -                    {{ Form::label('labels_width', trans('admin/settings/general.page_dimensions')) }}
        -                    </div>
        -                    <div class="col-md-3 form-group">
        -                      <div class="input-group">
        -                        {{ Form::text('labels_pagewidth', Input::old('labels_pagewidth', $setting->labels_pagewidth), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.width_w') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-3 form-group" style="margin-left: 10px">
        -                      <div class="input-group">
        -                        {{ Form::text('labels_pageheight', Input::old('labels_pageheight', $setting->labels_pageheight), array('class' => 'form-control')) }}
        -                        <div class="input-group-addon">{{ trans('admin/settings/general.height_h') }}</div>
        -                      </div>
        -                    </div>
        -                    <div class="col-md-9 col-md-offset-3">
        -                      {!! $errors->first('labels_pagewidth', '<span class="alert-msg">:message</span>') !!}
        -                      {!! $errors->first('labels_pageheight', '<span class="alert-msg">:message</span>') !!}
        -                    </div>
        -                  </div>
        -
        -
        -                  <div class="form-group">
        -                    <div class="col-md-3">
        -                    {{ Form::label('labels_width', trans('admin/settings/general.label_fields')) }}
        -                    </div>
        -                    <div class="col-md-9">
        -                      <div class="checkbox">
        -                        <label>
        -                          {{ Form::checkbox('labels_display_name', '1', Input::old('labels_display_name',   $setting->labels_display_name),array('class' => 'minimal')) }}
        -                          {{ trans('admin/hardware/form.name') }}
        -                        </label>
        -                        <label>
        -                          {{ Form::checkbox('labels_display_serial', '1', Input::old('labels_display_serial',   $setting->labels_display_serial),array('class' => 'minimal')) }}
        -                          {{ trans('admin/hardware/form.serial') }}
        -                        </label>
        -
        -                        <label>
        -                          {{ Form::checkbox('labels_display_tag', '1', Input::old('labels_display_tag',   $setting->labels_display_tag),array('class' => 'minimal')) }}
        -                          {{ trans('admin/hardware/form.tag') }}
        -                        </label>
        -
        -                      </div>
        -                    </div>
        -                  </div>
        -
        -
        -
        -
        -
        -              </div>
        -            </div>
        -          </div>
        -
        -        <div class="panel box box-primary">
        -            <div class="box-header with-border">
        -                <h4 class="box-title">
        -                  <a data-toggle="collapse" data-parent="#accordion" href="#collapseFour" class="accordion-header">
        -                  <i class="fa fa-file-text-o"></i>
        -                  {{ trans('admin/settings/general.default_eula_text') }}
        -
        -                  </a>
        -                </h4>
        -            </div>
        -
        -          <div id="collapseFour" class="box-collapse collapse" role="tabbox" aria-labelledby="headingFour">
        -            <div class="box-body">
        -              <div class="form-group {{ $errors->has('default_eula_text') ? 'error' : '' }}">
        -                <div class="col-md-12">
        -                  {{ Form::textarea('default_eula_text', Input::old('default_eula_text', $setting->default_eula_text), array('class' => 'form-control','placeholder' => 'Add your default EULA text')) }}
        -                  {!! $errors->first('default_eula_text', '<span class="alert-msg">:message</span>') !!}
        -                  <p class="help-block">{{ trans('admin/settings/general.default_eula_help_text') }}</p>
        -                  <p class="help-block">{!! trans('admin/settings/general.eula_markdown') !!}</p>
        -                </div>
        -              </div>
        -
        -            </div>
        -          </div>
        -
        -        </div>
        -
        -
        -        <div class="panel box box-primary">
        -            <div class="box-header with-border">
        -                <h4 class="box-title">
        -                  <a data-toggle="collapse" data-parent="#accordion" href="#collapseFive" class="accordion-header">
        -                  <i class="fa fa-slack"></i>
        -                  {{ trans('admin/settings/general.slack_integration') }}
        -
        -                  </a>
        -                </h4>
        -            </div>
        -          <div id="collapseFive" class="box-collapse collapse" role="tabbox" aria-labelledby="headingFive">
        -            <div class="box-body">
        -              <p class="help-block">{!! trans('admin/settings/general.slack_integration_help',array('slack_link' => 'https://my.slack.com/services/new/incoming-webhook')) !!}</p>
        -
        -              <!-- slack endpoint -->
        -              <div class="form-group {{ $errors->has('slack_endpoint') ? 'error' : '' }}">
        -                <div class="col-md-3">
        -                  {{ Form::label('slack_endpoint', trans('admin/settings/general.slack_endpoint')) }}
        -                </div>
        -                <div class="col-md-9">
        -                @if (config('app.lock_passwords')===true)
        -                  {{ Form::text('slack_endpoint', Input::old('slack_endpoint', $setting->slack_endpoint), array('class' => 'form-control','disabled'=>'disabled','placeholder' => 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX')) }}
        -                @else
        -                  {{ Form::text('slack_endpoint', Input::old('slack_endpoint', $setting->slack_endpoint), array('class' => 'form-control','placeholder' => 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX')) }}
        -                @endif
        -                {!! $errors->first('slack_endpoint', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        -
        -              <!-- slack channel -->
        -              <div class="form-group {{ $errors->has('slack_channel') ? 'error' : '' }}">
        -                <div class="col-md-3">
        -                  {{ Form::label('slack_channel', trans('admin/settings/general.slack_channel')) }}
        -                </div>
        -                <div class="col-md-9">
        -                @if (config('app.lock_passwords')===true)
        -                  {{ Form::text('slack_channel', Input::old('slack_channel', $setting->slack_channel), array('class' => 'form-control','disabled'=>'disabled','placeholder' => '#IT-Ops')) }}
        -                @else
        -                  {{ Form::text('slack_channel', Input::old('slack_channel', $setting->slack_channel), array('class' => 'form-control','placeholder' => '#IT-Ops')) }}
        -                @endif
        -                {!! $errors->first('slack_channel', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        -
        -
        -            </div>
        -          </div>
        -        </div>
        -
        -        <div class="panel box box-primary">
        -            <div class="box-header with-border">
        -                <h4 class="box-title">
        -                  <a data-toggle="collapse" data-parent="#accordion" href="#collapseSix" class="accordion-header">
        -                  <i class="fa fa-envelope-o"></i>
        -                  {{ trans('admin/settings/general.ldap_settings') }}
        -
        -                  </a>
        -                </h4>
        -            </div>
        -          <div id="collapseSix" class="box-collapse collapse" role="tabbox" aria-labelledby="headingSix">
        -            <div class="box-body">
        -              <!-- Enable LDAP -->
        -              <div class="form-group {{ $errors->has('ldap_integration') ? 'error' : '' }}">
        -                <div class="col-md-3">
        -                  {{ Form::label('ldap_integration', trans('admin/settings/general.ldap_integration')) }}
        -                </div>
        -                <div class="col-md-9">
        -                  {{ Form::checkbox('ldap_enabled', '1', Input::old('ldap_enabled', $setting->ldap_enabled),array('class' => 'minimal')) }}
        -                  {{ trans('admin/settings/general.ldap_enabled') }}
        -                  {!! $errors->first('ldap_enabled', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        -
        -
        -              <!-- AD Flag -->
        -              <div class="form-group">
        -                <div class="col-md-3">
        -                  {{ Form::label('is_ad', trans('admin/settings/general.ad')) }}
        -                </div>
        -                <div class="col-md-9">
        -                  {{ Form::checkbox('is_ad', '1', Input::old('is_ad', $setting->is_ad),array('class' => 'minimal')) }}
        -                  {{ trans('admin/settings/general.is_ad') }}
        -                  {!! $errors->first('is_ad', '<span class="alert-msg">:message</span>') !!}
        -
        -                </div>
        -              </div>
        -              <!-- /.form-group -->
        -
        -              <!-- LDAP Password Sync -->
        -              <div class="form-group">
        -                <div class="col-md-3">
        -                  {{ Form::label('is_ad', trans('admin/settings/general.ldap_pw_sync')) }}
        -                </div>
        -                <div class="col-md-9">
        -                  {{ Form::checkbox('ldap_pw_sync', '1', Input::old('ldap_pw_sync', $setting->ldap_pw_sync),array('class' => 'minimal')) }}
        -                  {{ trans('general.yes') }}
        -                  <p class="help-block">{{ trans('admin/settings/general.ldap_pw_sync_help') }}</p>
        -                  {!! $errors->first('ldap_pw_sync', '<span class="alert-msg">:message</span>') !!}
        -
        -                </div>
        -              </div>
        -              <!-- /.form-group -->
        -
        -              <!-- AD Domain -->
        -              <div class="form-group {{ $errors->has('ad_domain') ? 'error' : '' }}">
        -                <div class="col-md-3">
        -                  {{ Form::label('ad_domain', trans('admin/settings/general.ad_domain')) }}
        -                </div>
        -                <div class="col-md-9">
        -                  @if (config('app.lock_passwords')===true)
        -                    {{ Form::text('ad_domain', Input::old('ad_domain', $setting->ad_domain), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'example.com')) }}
        -                  @else
        -                    {{ Form::text('ad_domain', Input::old('ad_domain', $setting->ad_domain), array('class' => 'form-control','placeholder' => 'example.com')) }}
        -                  @endif
        -
        -                    <p class="help-block">{{ trans('admin/settings/general.ad_domain_help') }}</p>
        -
        -
        -                    {!! $errors->first('ad_domain', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div><!-- LDAP Server -->
        -
        -
        -              <!-- LDAP Server -->
        -              <div class="form-group {{ $errors->has('ldap_server') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_server', trans('admin/settings/general.ldap_server')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_server', Input::old('ldap_server', $setting->ldap_server), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'ldap://ldap.example.com')) }}
        -                    @else
        -                      {{ Form::text('ldap_server', Input::old('ldap_server', $setting->ldap_server), array('class' => 'form-control','placeholder' => 'ldap://ldap.example.com')) }}
        -                    @endif
        -                      <p class="help-block">{{ trans('admin/settings/general.ldap_server_help') }}</p>
        -                    {!! $errors->first('ldap_server', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div><!-- LDAP Server -->
        -
        -
        -                <!-- Start TLS -->
        -                <div class="form-group">
        -                    <div class="col-md-3">
        -                        {{ Form::label('ldap_tls', trans('admin/settings/general.ldap_tls')) }}
        -                    </div>
        -                    <div class="col-md-9">
        -                        {{ Form::checkbox('ldap_tls', '1', Input::old('ldap_tls', $setting->ldap_tls),array('class' => 'minimal')) }}
        -                        {{ trans('admin/settings/general.ldap_tls_help') }}
        -                        {!! $errors->first('ldap_tls', '<span class="alert-msg">:message</span>') !!}
        -
        -                    </div>
        -                </div>
        -                <!-- /.form-group -->
        -
        -
        -              <div class="form-group {{ $errors->has('ldap_server_cert_ignore') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                     {{ Form::label('ldap_server_cert_ignore', trans('admin/settings/general.ldap_server_cert')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    {{ Form::checkbox('ldap_server_cert_ignore', '1', Input::old('ldap_server_cert_ignore', $setting->ldap_server_cert_ignore),array('class' => 'minimal')) }}
        -                    {{ trans('admin/settings/general.ldap_server_cert_ignore') }}
        -                    {!! $errors->first('ldap_server_cert_ignore', '<span class="alert-msg">:message</span>') !!}
        -                    <p class="help-block">{{ trans('admin/settings/general.ldap_server_cert_help') }}</p>
        -                  </div>
        -              </div>
        -
        -              <!-- LDAP Username -->
        -              <div class="form-group {{ $errors->has('ldap_uname') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_uname', trans('admin/settings/general.ldap_uname')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_uname', Input::old('ldap_uname', $setting->ldap_uname), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'binduser@example.com')) }}
        -                    @else
        -                      {{ Form::text('ldap_uname', Input::old('ldap_uname', $setting->ldap_uname), array('class' => 'form-control','placeholder' => 'binduser@example.com')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_uname', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -
        -              <!-- LDAP pword -->
        -              <div class="form-group {{ $errors->has('ldap_pword') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_pword', trans('admin/settings/general.ldap_pword')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords'))
        -                      {{ Form::password('ldap_pword', array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'binduserpassword')) }}
        -                    @else
        -                      {{ Form::password('ldap_pword', array('class' => 'form-control','placeholder' => 'binduserpassword')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_pword', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -
        -              <!-- LDAP basedn -->
        -              <div class="form-group {{ $errors->has('ldap_basedn') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_basedn', trans('admin/settings/general.ldap_basedn')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_basedn', Input::old('ldap_basedn', $setting->ldap_basedn), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'cn=users/authorized,dc=example,dc=com')) }}
        -                    @else
        -                      {{ Form::text('ldap_basedn', Input::old('ldap_basedn', $setting->ldap_basedn), array('class' => 'form-control','placeholder' => 'cn=users/authorized,dc=example,dc=com')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_basedn', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -              <!-- LDAP filter -->
        -              <div class="form-group {{ $errors->has('ldap_filter') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_filter', trans('admin/settings/general.ldap_filter')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_filter', Input::old('ldap_filter', $setting->ldap_filter), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '&(cn=*)')) }}
        -                    @else
        -                      {{ Form::text('ldap_filter', Input::old('ldap_filter', $setting->ldap_filter), array('class' => 'form-control','placeholder' => '&(cn=*)')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_filter', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -
        -              <!-- LDAP  username field-->
        -              <div class="form-group {{ $errors->has('ldap_username_field') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_username_field', trans('admin/settings/general.ldap_username_field')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_username_field', Input::old('ldap_username_field', $setting->ldap_username_field), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'samaccountname')) }}
        -                    @else
        -                      {{ Form::text('ldap_username_field', Input::old('ldap_username_field', $setting->ldap_username_field), array('class' => 'form-control','placeholder' => 'samaccountname')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_username_field', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -
        -              <!-- LDAP Last Name Field -->
        -              <div class="form-group {{ $errors->has('ldap_lname_field') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_lname_field', trans('admin/settings/general.ldap_lname_field')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_lname_field', Input::old('ldap_lname_field', $setting->ldap_lname_field), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'sn')) }}
        -                    @else
        -                      {{ Form::text('ldap_lname_field', Input::old('ldap_lname_field', $setting->ldap_lname_field), array('class' => 'form-control','placeholder' => 'sn')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_lname_field', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -
        -              <!-- LDAP First Name field -->
        -              <div class="form-group {{ $errors->has('ldap_fname_field') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_fname_field', trans('admin/settings/general.ldap_fname_field')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_fname_field', Input::old('ldap_fname_field', $setting->ldap_fname_field), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'givenname')) }}
        -                    @else
        -                      {{ Form::text('ldap_fname_field', Input::old('ldap_fname_field', $setting->ldap_fname_field), array('class' => 'form-control','placeholder' => 'givenname')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_fname_field', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -              <!-- LDAP Auth Filter Query -->
        -              <div class="form-group {{ $errors->has('ldap_auth_filter_query') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_auth_filter_query', trans('admin/settings/general.ldap_auth_filter_query')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_auth_filter_query', Input::old('ldap_auth_filter_query', $setting->ldap_auth_filter_query), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '"uid="')) }}
        -                    @else
        -                      {{ Form::text('ldap_auth_filter_query', Input::old('ldap_auth_filter_query', $setting->ldap_auth_filter_query), array('class' => 'form-control','placeholder' => '"uid="')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_auth_filter_query', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -              <!-- LDAP Version -->
        -              <div class="form-group {{ $errors->has('ldap_version') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_version', trans('admin/settings/general.ldap_version')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_version', Input::old('ldap_version', $setting->ldap_version), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '3')) }}
        -                    @else
        -                      {{ Form::text('ldap_version', Input::old('ldap_version', $setting->ldap_version), array('class' => 'form-control','placeholder' => '3')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_version', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -              <!-- LDAP active flag -->
        -              <div class="form-group {{ $errors->has('ldap_active_flag') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_active_flag', trans('admin/settings/general.ldap_active_flag')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_active_flag', Input::old('ldap_active_flag', $setting->ldap_active_flag), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '')) }}
        -                    @else
        -                      {{ Form::text('ldap_active_flag', Input::old('ldap_active_flag', $setting->ldap_active_flag), array('class' => 'form-control','placeholder' => '')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_active_flag', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -              <!-- LDAP emp number -->
        -              <div class="form-group {{ $errors->has('ldap_emp_num') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_emp_num', trans('admin/settings/general.ldap_emp_num')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_emp_num', Input::old('ldap_emp_num', $setting->ldap_emp_num), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '')) }}
        -                    @else
        -                      {{ Form::text('ldap_emp_num', Input::old('ldap_emp_num', $setting->ldap_emp_num), array('class' => 'form-control','placeholder' => '')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_emp_num', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -
        -              <!-- LDAP email -->
        -              <div class="form-group {{ $errors->has('ldap_email') ? 'error' : '' }}">
        -                  <div class="col-md-3">
        -                    {{ Form::label('ldap_email', trans('admin/settings/general.ldap_email')) }}
        -                  </div>
        -                  <div class="col-md-9">
        -                    @if (config('app.lock_passwords')===true)
        -                      {{ Form::text('ldap_email', Input::old('ldap_email', $setting->ldap_email), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '')) }}
        -                    @else
        -                      {{ Form::text('ldap_email', Input::old('ldap_email', $setting->ldap_email), array('class' => 'form-control','placeholder' => '')) }}
        -                    @endif
        -
        -                    {!! $errors->first('ldap_email', '<span class="alert-msg">:message</span>') !!}
        -                  </div>
        -              </div>
        -            </div>
        -          </div>
        -      </div> <!-- /box body -->
        -      <div class="box-footer text-right">
        -        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        -      </div> <!-- /box body -->
        -    </div> <!-- /box -->
        -
        -
        -
        -</form>
        -
        -@section('moar_scripts')
        -<!-- bootstrap color picker -->
        -<script>
        -//color picker with addon
        -$(".header-color").colorpicker();
        -</script>
        -@stop
        -
        -
        -@stop
        diff --git a/resources/views/settings/general.blade.php b/resources/views/settings/general.blade.php
        new file mode 100644
        index 0000000000..01eeab2d9a
        --- /dev/null
        +++ b/resources/views/settings/general.blade.php
        @@ -0,0 +1,212 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update General Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-wrench"></i> {{ trans('admin/settings/general.general_settings') }}
        +                    </h4>
        +                </div>
        +               <div class="box-body">
        +
        +
        +                   <div class="col-md-12">
        +
        +                    <!-- Full Multiple Companies Support -->
        +                    <div class="form-group {{ $errors->has('full_multiple_companies_support') ? 'error' : '' }}">
        +                        <div class="col-md-3">
        +                            {{ Form::label('full_multiple_companies_support',
        +                                           trans('admin/settings/general.full_multiple_companies_support_text')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            {{ Form::checkbox('full_multiple_companies_support', '1', Input::old('full_multiple_companies_support', $setting->full_multiple_companies_support),array('class' => 'minimal')) }}
        +                            {{ trans('admin/settings/general.full_multiple_companies_support_text') }}
        +                            {!! $errors->first('full_multiple_companies_support', '<span class="alert-msg">:message</span>') !!}
        +                            <p class="help-block">
        +                                {{ trans('admin/settings/general.full_multiple_companies_support_help_text') }}
        +                            </p>
        +                        </div>
        +                    </div>
        +                    <!-- /.form-group -->
        +
        +                    <!-- Require signature for acceptance -->
        +                    <div class="form-group {{ $errors->has('require_accept_signature') ? 'error' : '' }}">
        +                        <div class="col-md-3">
        +                            {{ Form::label('full_multiple_companies_support',
        +                                           trans('admin/settings/general.require_accept_signature')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            {{ Form::checkbox('require_accept_signature', '1', Input::old('require_accept_signature', $setting->require_accept_signature),array('class' => 'minimal')) }}
        +                            {{ trans('general.yes') }}
        +                            {!! $errors->first('require_accept_signature', '<span class="alert-msg">:message</span>') !!}
        +                            <p class="help-block">{{ trans('admin/settings/general.require_accept_signature_help_text') }}</p>
        +                        </div>
        +                    </div>
        +                    <!-- /.form-group -->
        +
        +
        +                    <!-- Email domain -->
        +                    <div class="form-group {{ $errors->has('email_domain') ? 'error' : '' }}">
        +                        <div class="col-md-3">
        +                            {{ Form::label('email_domain', trans('general.email_domain')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            {{ Form::text('email_domain', Input::old('email_domain', $setting->email_domain), array('class' => 'form-control','placeholder' => 'example.com')) }}
        +                            <span class="help-block">{{ trans('general.email_domain_help')  }}</span>
        +                            {!! $errors->first('email_domain', '<span class="alert-msg">:message</span>') !!}
        +                        </div>
        +                    </div>
        +
        +
        +                    <!-- Email format -->
        +                    <div class="form-group {{ $errors->has('email_format') ? 'error' : '' }}">
        +                        <div class="col-md-3">
        +                            {{ Form::label('email_format', trans('general.email_format')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            {!! Form::username_format('email_format', Input::old('email_format', $setting->email_format), 'select2') !!}
        +                            {!! $errors->first('email_format', '<span class="alert-msg">:message</span>') !!}
        +                        </div>
        +                    </div>
        +
        +                    <!-- Username format -->
        +                    <div class="form-group {{ $errors->has('username_format') ? 'error' : '' }}">
        +                        <div class="col-md-3">
        +                            {{ Form::label('username_format', trans('general.username_format')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            {!! Form::username_format('username_format', Input::old('username_format', $setting->username_format), 'select2') !!}
        +                            {!! $errors->first('username_format', '<span class="alert-msg">:message</span>') !!}
        +                        </div>
        +                    </div>
        +
        +
        +
        +                    <!-- remote load -->
        +                    <div class="form-group">
        +                        <div class="col-md-3">
        +                            {{ Form::label('load_remote', trans('admin/settings/general.load_remote_text')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            {{ Form::checkbox('load_remote', '1', Input::old('load_remote', $setting->load_remote),array('class' => 'minimal')) }}
        +                            {{ trans('admin/settings/general.load_remote_help_text') }}
        +                        </div>
        +                    </div>
        +
        +                    <!-- Per Page -->
        +                    <div class="form-group {{ $errors->has('per_page') ? 'error' : '' }}">
        +                        <div class="col-md-3">
        +                            {{ Form::label('per_page', trans('admin/settings/general.per_page')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            {{ Form::text('per_page', Input::old('per_page', $setting->per_page), array('class' => 'form-control','placeholder' => '5', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        +                            {!! $errors->first('per_page', '<span class="alert-msg">:message</span>') !!}
        +                        </div>
        +                    </div>
        +
        +                   <!-- Thumb Size -->
        +                   <div class="form-group {{ $errors->has('thumbnail_max_h') ? 'error' : '' }}">
        +                       <div class="col-md-3">
        +                           {{ Form::label('thumbnail_max_h', trans('admin/settings/general.thumbnail_max_h')) }}
        +                       </div>
        +                       <div class="col-md-9">
        +                           {{ Form::text('thumbnail_max_h', Input::old('thumbnail_max_h', $setting->thumbnail_max_h), array('class' => 'form-control','placeholder' => '50', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        +                           <p class="help-block">{{ trans('admin/settings/general.thumbnail_max_h_help') }}</p>
        +                           {!! $errors->first('thumbnail_max_h', '<span class="alert-msg">:message</span>') !!}
        +                       </div>
        +                   </div>
        +
        +                    <!-- Default EULA -->
        +                   <div class="form-group {{ $errors->has('default_eula_text') ? 'error' : '' }}">
        +                       <div class="col-md-3">
        +                           {{ Form::label('per_page', trans('admin/settings/general.default_eula_text')) }}
        +                       </div>
        +                       <div class="col-md-9">
        +                           {{ Form::textarea('default_eula_text', Input::old('default_eula_text', $setting->default_eula_text), array('class' => 'form-control','placeholder' => 'Add your default EULA text')) }}
        +                           {!! $errors->first('default_eula_text', '<span class="alert-msg">:message</span>') !!}
        +                           <p class="help-block">{{ trans('admin/settings/general.default_eula_help_text') }}</p>
        +                           <p class="help-block">{!! trans('admin/settings/general.eula_markdown') !!}</p>
        +                       </div>
        +                   </div>
        +
        +
        +                    <!-- login text -->
        +                    <div class="form-group {{ $errors->has('custom_css') ? 'error' : '' }}">
        +                        <div class="col-md-3">
        +                            {{ Form::label('login_note', trans('admin/settings/general.login_note')) }}
        +                        </div>
        +                        <div class="col-md-9">
        +                            @if (config('app.lock_passwords')===true)
        +
        +                                <textarea class="form-control" name="login_note" placeholder="If you do not have a login or have found a device belonging to this company, please call technical support at 888-555-1212. Thank you." rows="2">{{ Input::old('login_note', $setting->login_note) }}</textarea>
        +                                {!! $errors->first('login_note', '<span class="alert-msg">:message</span>') !!}
        +                                <p class="help-block">{{ trans('general.lock_passwords') }}</p>
        +                            @else
        +                                <textarea class="form-control" name="login_note" placeholder="If you do not have a login or have found a device belonging to this company, please call technical support at 888-555-1212. Thank you." rows="2">{{ Input::old('login_note', $setting->login_note) }}</textarea>
        +                                {!! $errors->first('login_note', '<span class="alert-msg">:message</span>') !!}
        +                            @endif
        +                            <p class="help-block">{!!  trans('admin/settings/general.login_note_help') !!}</p>
        +                        </div>
        +                    </div>
        +
        +            </div> <!--/.box-body-->
        +            <div class="box-footer">
        +                <div class="text-left col-md-6">
        +                    <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                </div>
        +                <div class="text-right col-md-6">
        +                    <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                </div>
        +
        +            </div>
        +            </div>
        +        </div> <!-- /box -->
        +    </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        +
        +@section('moar_scripts')
        +    <!-- bootstrap color picker -->
        +    <script>
        +        //color picker with addon
        +        $(".header-color").colorpicker();
        +        // toggle the disabled state of asset id prefix
        +        $('#auto_increment_assets').on('ifChecked', function(){
        +            $('#auto_increment_prefix').prop('disabled', false).focus();
        +        }).on('ifUnchecked', function(){
        +            $('#auto_increment_prefix').prop('disabled', true);
        +        });
        +    </script>
        +@stop
        diff --git a/resources/views/settings/index.blade.php b/resources/views/settings/index.blade.php
        index aafb5b5a1d..1be9577418 100755
        --- a/resources/views/settings/index.blade.php
        +++ b/resources/views/settings/index.blade.php
        @@ -2,310 +2,239 @@
         
         {{-- Page title --}}
         @section('title')
        -    {{ trans('admin/settings/general.settings') }}
        +    {{ trans('general.admin') }}
         @parent
         @stop
         
        -
        -
         {{-- Page content --}}
         @section('content')
         
        -<div class="row">
        -  <div class="col-md-8 col-md-offset-2">
        -    <div class="box box-default">
        -      <div class="box-header">
        -        <h3 class="box-title">{{ trans('admin/settings/general.general_settings') }}</h3>
        -        <div class="box-tools pull-right">
        -          <a href="{{ route('edit/settings') }}" class="btn btn-warning"><i class="fa fa-pencil icon-white"></i> {{ trans('button.edit') }} {{ trans('admin/settings/general.settings') }}</a>
        +
        +
        +  <div class="row">
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.branding.index') }}" class="btn btn-lg btn-white"><i class="fa fa-copyright fa-3x"></i></a>
        +          <br>
        +          Branding
        +          <p class="help-block">Logo, Site Name</p>
                 </div>
               </div>
        -      <div class="box-body">
        -
        -
        -
        -
        -
        -        <div class="table-responsive">
        -          <table class="table table-striped">
        -
        -
        -
        -              <tbody>
        -                  @foreach ($settings as $setting)
        -                  <tr>
        -                      <td class="col-md-4">{{ trans('admin/settings/general.site_name') }}</td>
        -                      <td class="col-md-8">{{ $setting->site_name }} </td>
        -                  </tr>
        -                  <tr>
        -                      <td>
        -                          {{ trans('admin/settings/general.full_multiple_companies_support_text') }}
        -                      </td>
        -
        -                      @if ($setting->full_multiple_companies_support == 1)
        -                          <td>{{ trans('general.yes') }}</td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.two_factor_enabled_text') }}</td>
        -
        -                      @if ($setting->two_factor_enabled == '')
        -                          <td>{{ trans('admin/settings/general.two_factor_disabled') }}</td>
        -                      @elseif ($setting->two_factor_enabled == '1')
        -                          <td>{{ trans('admin/settings/general.two_factor_optional') }}</td>
        -                      @elseif ($setting->two_factor_enabled == '2')
        -                          <td>{{ trans('admin/settings/general.two_factor_required') }}</td>
        -                      @endif
        -                  </tr>
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.default_currency') }}</td>
        -                      <td>{{ $setting->default_currency }} </td>
        -                  </tr>
        -                   <tr>
        -                      <td>{{ trans('admin/settings/general.alert_email') }}</td>
        -
        -                      @if ($setting->alert_email)
        -                          <td>{{ $setting->alert_email }}</td>
        -                      @else
        -                          <td>--</td>
        -                      @endif
        -                  </tr>
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.alerts_enabled') }}</td>
        -
        -                      @if ($setting->alerts_enabled == 1)
        -                          <td>{{ trans('general.yes') }}</td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -
        -                   <tr>
        -                      <td>{{ trans('admin/settings/general.header_color') }}</td>
        -
        -                      @if ($setting->header_color)
        -                          <td>{{ $setting->header_color }}</td>
        -                      @else
        -                          <td>default</td>
        -                      @endif
        -                  </tr>
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.auto_increment_assets') }}</td>
        -
        -                      @if ($setting->auto_increment_assets == 1)
        -                          <td>{{ trans('general.yes') }}</td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.require_accept_signature') }}</td>
        -
        -                      @if ($setting->require_accept_signature == 1)
        -                          <td>{{ trans('general.yes') }}</td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.load_remote_text') }}</td>
        -
        -                      @if ($setting->load_remote == 1)
        -                          <td>{{ trans('general.yes') }}</td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.auto_increment_prefix') }}</td>
        -                      <td>{{ $setting->auto_increment_prefix }}</td>
        -                  </tr>
        -
        -
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.per_page') }}</td>
        -                      <td>{{ $setting->per_page }}  </td>
        -                  </tr>
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.display_qr') }}</td>
        -                          @if ($setting->qr_code == 1)
        -                              <td>{{ trans('general.yes') }}
        -                              	({{ $setting->barcode_type }})
        -                                {{ $setting->qr_text }}
        -
        -                              </td>
        -                          @else
        -                              <td>{{ trans('general.no') }}</td>
        -                          @endif
        -                  </tr>
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.default_eula_text') }}</td>
        -
        -                      @if ($setting->default_eula_text!='')
        -                          <td>{{ trans('general.yes') }}</td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -                  <tr>
        -                     <td>{{ trans('admin/settings/general.slack_integration') }} </td>
        -
        -                      @if ($setting->slack_endpoint!='')
        -                          <td>{{ trans('general.yes') }}
        -
        -                              @if ($setting->slack_channel!='')
        -                                  {{ $setting->slack_channel }}
        -                              @endif
        -
        -                          </td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -                  <tr>
        -                      <td>{{ trans('admin/settings/general.ldap_integration') }}</td>
        -
        -                      @if ($setting->ldap_enabled == 1)
        -                          <td>
        -                              {{ $setting->ldap_server }}
        -                          @if ($setting->is_ad == '1')
        -                                (Active Directory)
        -                          @endif
        -                          </td>
        -                      @else
        -                          <td>{{ trans('general.no') }}</td>
        -                      @endif
        -                  </tr>
        -                  @if ($setting->ldap_enabled == 1)
        -                  <tr id="ldaptestrow">
        -                      <td class="col-md-4">Test LDAP Connection</td>
        -                      <td class="col-md-8">
        -
        -                         <a class="btn btn-default btn-sm pull-left" id="ldaptest" style="margin-right: 10px;"> Test LDAP</a>
        -
        -                          <span id="ldaptesticon">
        -                          </span>
        -                          <span id="ldaptestresult">
        -                          </span>
        -                          <span id="ldapteststatus">
        -                          </span>
        -                      </td>
        -                  </tr>
        -                  @endif
        -
        -
        -                  @endforeach
        -              </tbody>
        -          </table>
        -
        -          <h4>{{ trans('admin/settings/general.system') }}</h4>
        -            <div class="table-responsive">
        -              <table class="table table-striped">
        -                  <tbody>
        -                    <tr>
        -                          <td class="col-md-4">{{ trans('admin/settings/general.snipe_version') }}</td>
        -                          <td class="col-md-8">
        -                              {{ config('version.app_version') }}  build {{ config('version.build_version') }} ({{ config('version.hash_version') }})
        -                          </td>
        -                      </tr>
        -                      <tr>
        -                          <td>{{ trans('admin/settings/general.php') }}</td>
        -                          <td> {{ phpversion() }}</td>
        -                      </tr>
        -                      <tr>
        -                          <td>{{ trans('admin/settings/general.laravel') }}</td>
        -                          <td>
        -                              {{ $setting->lar_ver() }}
        -                          </td>
        -                      </tr>
        -                  </tbody>
        -              </table>
        -            </div>
        -        </div>
             </div>
        +
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.general.index') }}" class="btn btn-lg btn-white"><i class="fa fa-wrench fa-3x"></i></a>
        +          <br>
        +          General Settings
        +          <p class="help-block">Default EULA and more</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.security.index') }}" class="btn btn-lg btn-white"><i class="fa fa-lock fa-3x"></i></a>
        +          <br>
        +          Security
        +          <p class="help-block">Two-factor, Password Restrictions</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.groups.index') }}" class="btn btn-lg btn-white"><i class="fa fa-group fa-3x"></i></a>
        +          <br>
        +          Groups
        +          <p class="help-block">Account permission groups</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.localization.index') }}" class="btn btn-lg btn-white"><i class="fa fa-globe fa-3x"></i></a>
        +          <br>
        +          Localization
        +          <p class="help-block">Language, time zones</p>
        +
        +        </div>
        +      </div>
        +    </div>
        +
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.alerts.index') }}" class="btn btn-lg btn-white"><i class="fa fa-bell fa-3x"></i></a>
        +          <br>
        +          Notifications
        +          <p class="help-block">Email alerts</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.slack.index') }}" class="btn btn-lg btn-white"><i class="fa fa-slack fa-3x"></i></a>
        +          <br>
        +          Slack
        +          <p class="help-block">Slack settings</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.asset_tags.index') }}" class="btn btn-lg btn-white"><i class="fa fa-list-ol fa-3x"></i></a>
        +          <br>
        +          Asset Tags
        +          <p class="help-block">Incrementing and prefixes</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.barcodes.index') }}" class="btn btn-lg btn-white"><i class="fa fa-barcode fa-3x"></i></a>
        +          <br>
        +          Barcodes
        +          <p class="help-block">Barcode &amp; QR settings</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.labels.index') }}" class="btn btn-lg btn-white"><i class="fa fa-tags fa-3x"></i></a>
        +          <br>
        +          Labels
        +          <p class="help-block">Label sizes &amp; settings</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.ldap.index') }}" class="btn btn-lg btn-white"><i class="fa fa-sitemap fa-3x"></i></a>
        +          <br>
        +          LDAP
        +          <p class="help-block">LDAP/Active Directory</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.backups.index') }}" class="btn btn-lg btn-white"><i class="fa fa-cloud-download fa-3x"></i></a>
        +          <br>
        +          Backups
        +          <p class="help-block">Download files &amp; Data</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-default">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.oauth.index') }}" class="btn btn-lg btn-white"><i class="fa fa-user-secret fa-3x"></i></a>
        +          <br>
        +          OAuth
        +          <p class="help-block">Oauth Endpoint Settings</p>
        +        </div>
        +      </div>
        +    </div>
        +
        +    @if (config('app.debug')=== true)
        +      <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +        <div class="box box-default">
        +          <div class="box-body text-center">
        +            <a href="{{ route('settings.phpinfo.index') }}" class="btn btn-lg btn-white"><i class="fa fa-server fa-3x"></i></a>
        +            <br>
        +            PHP
        +            <p class="help-block">PHP System Info</p>
        +          </div>
        +        </div>
        +      </div>
        +    @endif
        +
        +    <div class="col-md-4 col-lg-3 col-sm-6 col-xl-1">
        +      <div class="box box-danger">
        +        <div class="box-body text-center">
        +          <a href="{{ route('settings.purge.index') }}" class="btn btn-lg btn-white text-danger"><i class="fa fa-trash fa-3x"></i></a>
        +          <br>
        +          Purge
        +          <p class="help-block">Purge Deleted Records</p>
        +        </div>
        +      </div>
        +    </div>
        +
           </div>
        -</div>
        -
        -    <div class="row">
        -        <div class="col-md-8 col-md-offset-2">
        -            <div class="box box-solid box-danger">
        -                <div class="box-header with-border">
        -                    <h3 class="box-title"><i class="fa fa-warning"></i> {{ trans('admin/settings/general.purge') }}</h3>
        -                </div>
        -                {{ Form::open(['method' => 'POST', 'route' => ['purge'], 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        -                <!-- CSRF Token -->
        -                {{ Form::hidden('_token', csrf_token()) }}
        -                <div class="box-body">
        -                    <p>{{ trans('admin/settings/general.confirm_purge_help') }}</p>
         
         
         
        -                    <div class="col-md-3{{ $errors->has('confirm_purge') ? 'error' : '' }}">
        -                      {{ Form::label('confirm_purge', trans('admin/settings/general.confirm_purge')) }}
        -                    </div>
        -                    <div class="col-md-9{{ $errors->has('confirm_purge') ? 'error' : '' }}">
        -                        @if (config('app.lock_passwords')===true)
        -                          {{ Form::text('confirm_purge', Input::old('confirm_purge'), array('class' => 'form-control', 'disabled'=>'disabled')) }}
        -                        @else
        -                          {{ Form::text('confirm_purge', Input::old('confirm_purge'), array('class' => 'form-control')) }}
        -                        @endif
        -
        -                        {!! $errors->first('ldap_version', '<span class="alert-msg">:message</span>') !!}
        -                    </div>
         
         
        -                </div>
        -                <div class="box-footer text-right">
        -                  <button type="submit" class="btn btn-danger">{{ trans('admin/settings/general.purge') }}</button>
        -                </div> <!-- /box body -->
        -                </form>
        -            </div>
        +
        +
        +
        +
        +
        +<div class="row">
        +  <div class="col-md-12">
        +    <div class="box box-default">
        +      <div class="box-header">
        +        <h3 class="box-title">{{ trans('admin/settings/general.system') }}</h3>
        +      </div>
        +      <div class="box-body">
        +        <div class="table-responsive">
        +
        +          <table class="table table-striped">
        +            <tbody>
        +              <tr>
        +                <td class="col-md-4">{{ trans('admin/settings/general.snipe_version') }}</td>
        +                <td class="col-md-8">
        +                    {{ config('version.app_version') }}  build {{ config('version.build_version') }} ({{ config('version.hash_version') }})
        +                </td>
        +              </tr>
        +              <tr>
        +                <td>{{ trans('admin/settings/general.php') }}</td>
        +                <td> {{ phpversion() }}</td>
        +              </tr>
        +              <tr>
        +                <td>{{ trans('admin/settings/general.laravel') }}</td>
        +                <td>
        +                    {{ $snipeSettings->lar_ver() }}
        +                </td>
        +              </tr>
        +            </tbody>
        +          </table>
                 </div>
        -    </div>
        -@section('moar_scripts')
        -
        -
        -        <script>
        -            $("#ldaptest").click(function(){
        -                $("#ldaptestrow").removeClass('success');
        -                $("#ldaptestrow").removeClass('danger');
        -                $("#ldapteststatus").html('');
        -                $("#ldaptesticon").html('<i class="fa fa-spinner spin"></i>');
        -                $.ajax({
        -                    url: '{{ route('settings/ldaptest') }}',
        -                    type: 'GET',
        -                    data: {},
        -                    dataType: 'json',
        -
        -                    success: function (data) {
        -                        // console.dir(data);
        -                        //console.log(data.responseJSON.message);
        -                        $("#ldaptesticon").html('');
        -                        $("#ldaptestrow").addClass('success');
        -                        $("#ldapteststatus").html('<i class="fa fa-check text-success"></i> It worked!');
        -                        //$('#ldapteststatus').html('<i class="fa fa-check text-success"></i>');
        -                    },
        -
        -                    error: function (data) {
        -                        //console.dir(data);
        -                        //console.log(data.responseJSON.message);
        -                        $("#ldaptesticon").html('');
        -                        $("#ldaptestrow").addClass('danger');
        -                        $("#ldaptesticon").html('<i class="fa fa-exclamation-triangle text-danger"></i>');
        -                        $('#ldapteststatus').text(data.responseJSON.message);
        -                    }
        -
        -
        -                });
        -            });
        +      </div> <!-- /box-body-->
        +    </div> <!--/box-default-->
        +  </div><!--/col-md-8-->
        +</div><!--/row-->
         
         
         
        -        </script>
        -@stop
         @stop
        +
        +
        diff --git a/resources/views/settings/labels.blade.php b/resources/views/settings/labels.blade.php
        new file mode 100644
        index 0000000000..b66302ea58
        --- /dev/null
        +++ b/resources/views/settings/labels.blade.php
        @@ -0,0 +1,207 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Label Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-lock"></i> Security
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <div class="form-group {{ $errors->has('labels_per_page') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('labels_per_page', trans('admin/settings/general.labels_per_page')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::text('labels_per_page', Input::old('labels_per_page', $setting->labels_per_page), array('class' => 'form-control','style' => 'width: 100px;')) }}
        +                                {!! $errors->first('labels_per_page', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('labels_width', trans('admin/settings/general.labels_fontsize')) }}
        +                            </div>
        +                            <div class="col-md-2 form-group">
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_fontsize', Input::old('labels_fontsize', $setting->labels_fontsize), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.text_pt') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-9 col-md-offset-3">
        +                                {!! $errors->first('labels_fontsize', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('labels_width', trans('admin/settings/general.label_dimensions')) }}
        +                            </div>
        +                            <div class="col-md-3 form-group">
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_width', Input::old('labels_width', $setting->labels_width), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.width_w') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-3 form-group" style="margin-left: 10px">
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_height', Input::old('labels_height', $setting->labels_height), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.height_h') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-9 col-md-offset-3">
        +                                {!! $errors->first('labels_width', '<span class="alert-msg">:message</span>') !!}
        +                                {!! $errors->first('labels_height', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('labels_width', trans('admin/settings/general.label_gutters')) }}
        +                            </div>
        +                            <div class="col-md-3 form-group">
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_display_sgutter', Input::old('labels_display_sgutter', $setting->labels_display_sgutter), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.horizontal') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-3 form-group" style="margin-left: 10px">
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_display_bgutter', Input::old('labels_display_bgutter', $setting->labels_display_bgutter), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.vertical') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-9 col-md-offset-3">
        +                                {!! $errors->first('labels_display_sgutter', '<span class="alert-msg">:message</span>') !!}
        +                                {!! $errors->first('labels_display_bgutter', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <div class="form-group {{ $errors->has('labels_width') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('labels_width', trans('admin/settings/general.page_padding')) }}
        +                            </div>
        +                            <div class="col-md-3 form-group">
        +                                <div class="input-group" style="margin-bottom: 15px;">
        +                                    {{ Form::text('labels_pmargin_top', Input::old('labels_pmargin_top', $setting->labels_pmargin_top), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.top') }}</div>
        +                                </div>
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_pmargin_right', Input::old('labels_pmargin_right', $setting->labels_pmargin_right), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.right') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-3 form-group" style="margin-left: 10px; ">
        +                                <div class="input-group" style="margin-bottom: 15px;">
        +                                    {{ Form::text('labels_pmargin_bottom', Input::old('labels_pmargin_bottom', $setting->labels_pmargin_bottom), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.bottom') }}</div>
        +                                </div>
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_pmargin_left', Input::old('labels_pmargin_left', $setting->labels_pmargin_left), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.left') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-9 col-md-offset-3">
        +                                {!! $errors->first('labels_width', '<span class="alert-msg">:message</span>') !!}
        +                                {!! $errors->first('labels_height', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <div class="form-group {{ $errors->has('labels_pageheight') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('labels_width', trans('admin/settings/general.page_dimensions')) }}
        +                            </div>
        +                            <div class="col-md-3 form-group">
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_pagewidth', Input::old('labels_pagewidth', $setting->labels_pagewidth), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.width_w') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-3 form-group" style="margin-left: 10px">
        +                                <div class="input-group">
        +                                    {{ Form::text('labels_pageheight', Input::old('labels_pageheight', $setting->labels_pageheight), array('class' => 'form-control')) }}
        +                                    <div class="input-group-addon">{{ trans('admin/settings/general.height_h') }}</div>
        +                                </div>
        +                            </div>
        +                            <div class="col-md-9 col-md-offset-3">
        +                                {!! $errors->first('labels_pagewidth', '<span class="alert-msg">:message</span>') !!}
        +                                {!! $errors->first('labels_pageheight', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <div class="form-group">
        +                            <div class="col-md-3">
        +                                {{ Form::label('labels_width', trans('admin/settings/general.label_fields')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                <div class="checkbox">
        +                                    <label>
        +                                        {{ Form::checkbox('labels_display_name', '1', Input::old('labels_display_name',   $setting->labels_display_name),array('class' => 'minimal')) }}
        +                                        {{ trans('admin/hardware/form.name') }}
        +                                    </label>
        +                                    <label>
        +                                        {{ Form::checkbox('labels_display_serial', '1', Input::old('labels_display_serial',   $setting->labels_display_serial),array('class' => 'minimal')) }}
        +                                        {{ trans('admin/hardware/form.serial') }}
        +                                    </label>
        +                                    <label>
        +                                        {{ Form::checkbox('labels_display_tag', '1', Input::old('labels_display_tag',   $setting->labels_display_tag),array('class' => 'minimal')) }}
        +                                        {{ trans('admin/hardware/form.tag') }}
        +                                    </label>
        +                                </div> <!--/.CHECKBOX-->
        +                            </div> <!--/.col-md-9-->
        +                        </div> <!--/.form-group-->
        +
        +
        +
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        diff --git a/resources/views/settings/ldap.blade.php b/resources/views/settings/ldap.blade.php
        new file mode 100644
        index 0000000000..274789f623
        --- /dev/null
        +++ b/resources/views/settings/ldap.blade.php
        @@ -0,0 +1,411 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update LDAP/AD Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +    @if ((!function_exists('ldap_connect')) || (!function_exists('ldap_set_option')) || (!function_exists('ldap_bind')))
        +        <div class="row">
        +            <div class="col-md-12">
        +                <div class="col-md-12">
        +                    <div class="alert alert-danger">
        +                       It doesn't look like the LDAP extension is installed or enabled on this server. :(
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +
        +    @else
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-sitemap"></i> LDAP/AD
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <!-- Enable LDAP -->
        +                        <div class="form-group {{ $errors->has('ldap_integration') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_integration', trans('admin/settings/general.ldap_integration')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::checkbox('ldap_enabled', '1', Input::old('ldap_enabled', $setting->ldap_enabled),array('class' => 'minimal')) }}
        +                                {{ trans('admin/settings/general.ldap_enabled') }}
        +                                {!! $errors->first('ldap_enabled', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- AD Flag -->
        +                        <div class="form-group">
        +                            <div class="col-md-3">
        +                                {{ Form::label('is_ad', trans('admin/settings/general.ad')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::checkbox('is_ad', '1', Input::old('is_ad', $setting->is_ad),array('class' => 'minimal')) }}
        +                                {{ trans('admin/settings/general.is_ad') }}
        +                                {!! $errors->first('is_ad', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP Password Sync -->
        +                        <div class="form-group">
        +                            <div class="col-md-3">
        +                                {{ Form::label('is_ad', trans('admin/settings/general.ldap_pw_sync')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::checkbox('ldap_pw_sync', '1', Input::old('ldap_pw_sync', $setting->ldap_pw_sync),array('class' => 'minimal')) }}
        +                                {{ trans('general.yes') }}
        +                                <p class="help-block">{{ trans('admin/settings/general.ldap_pw_sync_help') }}</p>
        +                                {!! $errors->first('ldap_pw_sync', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- AD Domain -->
        +                        <div class="form-group {{ $errors->has('ad_domain') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ad_domain', trans('admin/settings/general.ad_domain')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ad_domain', Input::old('ad_domain', $setting->ad_domain), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'example.com')) }}
        +                                @else
        +                                    {{ Form::text('ad_domain', Input::old('ad_domain', $setting->ad_domain), array('class' => 'form-control','placeholder' => 'example.com')) }}
        +                                @endif
        +                                <p class="help-block">{{ trans('admin/settings/general.ad_domain_help') }}</p>
        +                                {!! $errors->first('ad_domain', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div><!-- AD Domain -->
        +
        +                        <!-- LDAP Server -->
        +                        <div class="form-group {{ $errors->has('ldap_server') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_server', trans('admin/settings/general.ldap_server')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_server', Input::old('ldap_server', $setting->ldap_server), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'ldap://ldap.example.com')) }}
        +                                @else
        +                                    {{ Form::text('ldap_server', Input::old('ldap_server', $setting->ldap_server), array('class' => 'form-control','placeholder' => 'ldap://ldap.example.com')) }}
        +                                @endif
        +                                <p class="help-block">{{ trans('admin/settings/general.ldap_server_help') }}</p>
        +                                {!! $errors->first('ldap_server', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div><!-- LDAP Server -->
        +
        +                        <!-- Start TLS -->
        +                        <div class="form-group">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_tls', trans('admin/settings/general.ldap_tls')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::checkbox('ldap_tls', '1', Input::old('ldap_tls', $setting->ldap_tls),array('class' => 'minimal')) }}
        +                                {{ trans('admin/settings/general.ldap_tls_help') }}
        +                                {!! $errors->first('ldap_tls', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- Ignore LDAP Certificate -->
        +                        <div class="form-group {{ $errors->has('ldap_server_cert_ignore') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_server_cert_ignore', trans('admin/settings/general.ldap_server_cert')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::checkbox('ldap_server_cert_ignore', '1', Input::old('ldap_server_cert_ignore', $setting->ldap_server_cert_ignore),array('class' => 'minimal')) }}
        +                                {{ trans('admin/settings/general.ldap_server_cert_ignore') }}
        +                                {!! $errors->first('ldap_server_cert_ignore', '<span class="alert-msg">:message</span>') !!}
        +                                <p class="help-block">{{ trans('admin/settings/general.ldap_server_cert_help') }}</p>
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP Username -->
        +                        <div class="form-group {{ $errors->has('ldap_uname') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_uname', trans('admin/settings/general.ldap_uname')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_uname', Input::old('ldap_uname', $setting->ldap_uname), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'binduser@example.com')) }}
        +                                @else
        +                                    {{ Form::text('ldap_uname', Input::old('ldap_uname', $setting->ldap_uname), array('class' => 'form-control','placeholder' => 'binduser@example.com')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_uname', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP pword -->
        +                        <div class="form-group {{ $errors->has('ldap_pword') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_pword', trans('admin/settings/general.ldap_pword')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords'))
        +                                    {{ Form::password('ldap_pword', array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'binduserpassword')) }}
        +                                @else
        +                                    {{ Form::password('ldap_pword', array('class' => 'form-control','placeholder' => 'binduserpassword')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_pword', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP basedn -->
        +                        <div class="form-group {{ $errors->has('ldap_basedn') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_basedn', trans('admin/settings/general.ldap_basedn')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_basedn', Input::old('ldap_basedn', $setting->ldap_basedn), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'cn=users/authorized,dc=example,dc=com')) }}
        +                                @else
        +                                    {{ Form::text('ldap_basedn', Input::old('ldap_basedn', $setting->ldap_basedn), array('class' => 'form-control','placeholder' => 'cn=users/authorized,dc=example,dc=com')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_basedn', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP filter -->
        +                        <div class="form-group {{ $errors->has('ldap_filter') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_filter', trans('admin/settings/general.ldap_filter')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_filter', Input::old('ldap_filter', $setting->ldap_filter), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '&(cn=*)')) }}
        +                                @else
        +                                    {{ Form::text('ldap_filter', Input::old('ldap_filter', $setting->ldap_filter), array('class' => 'form-control','placeholder' => '&(cn=*)')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_filter', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP  username field-->
        +                        <div class="form-group {{ $errors->has('ldap_username_field') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_username_field', trans('admin/settings/general.ldap_username_field')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_username_field', Input::old('ldap_username_field', $setting->ldap_username_field), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'samaccountname')) }}
        +                                @else
        +                                    {{ Form::text('ldap_username_field', Input::old('ldap_username_field', $setting->ldap_username_field), array('class' => 'form-control','placeholder' => 'samaccountname')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_username_field', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP Last Name Field -->
        +                        <div class="form-group {{ $errors->has('ldap_lname_field') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_lname_field', trans('admin/settings/general.ldap_lname_field')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_lname_field', Input::old('ldap_lname_field', $setting->ldap_lname_field), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'sn')) }}
        +                                @else
        +                                    {{ Form::text('ldap_lname_field', Input::old('ldap_lname_field', $setting->ldap_lname_field), array('class' => 'form-control','placeholder' => 'sn')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_lname_field', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP First Name field -->
        +                        <div class="form-group {{ $errors->has('ldap_fname_field') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_fname_field', trans('admin/settings/general.ldap_fname_field')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_fname_field', Input::old('ldap_fname_field', $setting->ldap_fname_field), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => 'givenname')) }}
        +                                @else
        +                                    {{ Form::text('ldap_fname_field', Input::old('ldap_fname_field', $setting->ldap_fname_field), array('class' => 'form-control','placeholder' => 'givenname')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_fname_field', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP Auth Filter Query -->
        +                        <div class="form-group {{ $errors->has('ldap_auth_filter_query') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_auth_filter_query', trans('admin/settings/general.ldap_auth_filter_query')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_auth_filter_query', Input::old('ldap_auth_filter_query', $setting->ldap_auth_filter_query), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '"uid="')) }}
        +                                @else
        +                                    {{ Form::text('ldap_auth_filter_query', Input::old('ldap_auth_filter_query', $setting->ldap_auth_filter_query), array('class' => 'form-control','placeholder' => '"uid="')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_auth_filter_query', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP Version -->
        +                        <div class="form-group {{ $errors->has('ldap_version') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_version', trans('admin/settings/general.ldap_version')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_version', Input::old('ldap_version', $setting->ldap_version), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '3')) }}
        +                                @else
        +                                    {{ Form::text('ldap_version', Input::old('ldap_version', $setting->ldap_version), array('class' => 'form-control','placeholder' => '3')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_version', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP active flag -->
        +                        <div class="form-group {{ $errors->has('ldap_active_flag') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_active_flag', trans('admin/settings/general.ldap_active_flag')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_active_flag', Input::old('ldap_active_flag', $setting->ldap_active_flag), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '')) }}
        +                                @else
        +                                    {{ Form::text('ldap_active_flag', Input::old('ldap_active_flag', $setting->ldap_active_flag), array('class' => 'form-control','placeholder' => '')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_active_flag', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP emp number -->
        +                        <div class="form-group {{ $errors->has('ldap_emp_num') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_emp_num', trans('admin/settings/general.ldap_emp_num')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_emp_num', Input::old('ldap_emp_num', $setting->ldap_emp_num), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '')) }}
        +                                @else
        +                                    {{ Form::text('ldap_emp_num', Input::old('ldap_emp_num', $setting->ldap_emp_num), array('class' => 'form-control','placeholder' => '')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_emp_num', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- LDAP email -->
        +                        <div class="form-group {{ $errors->has('ldap_email') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('ldap_email', trans('admin/settings/general.ldap_email')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('ldap_email', Input::old('ldap_email', $setting->ldap_email), array('class' => 'form-control', 'disabled'=>'disabled','placeholder' => '')) }}
        +                                @else
        +                                    {{ Form::text('ldap_email', Input::old('ldap_email', $setting->ldap_email), array('class' => 'form-control','placeholder' => '')) }}
        +                                @endif
        +                                {!! $errors->first('ldap_email', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- LDAP test -->
        +                        <div class="form-group {{ $errors->has('ldap_email') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                Test LDAP Connection
        +                            </div>
        +                            <div class="col-md-9">
        +                                <div id="ldaptestrow">
        +                                    <div class="col-md-8">
        +                                        <a class="btn btn-default btn-sm pull-left" id="ldaptest" style="margin-right: 10px;"> Test LDAP</a>
        +                                        <span id="ldaptesticon"></span>
        +                                        <span id="ldaptestresult"></span>
        +                                        <span id="ldapteststatus"></span>
        +                                    </div>
        +                                </div>
        +                            </div>
        +                        </div>
        +
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +
        +
        +
        +
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +   @endif
        +
        +@stop
        +
        +@section('moar_scripts')
        +    <script>
        +        $("#ldaptest").click(function(){
        +            $("#ldaptestrow").removeClass('success');
        +            $("#ldaptestrow").removeClass('danger');
        +            $("#ldapteststatus").html('');
        +            $("#ldaptesticon").html('<i class="fa fa-spinner spin"></i>');
        +            $.ajax({
        +                url: '{{ route('api.settings.ldaptest') }}',
        +                type: 'GET',
        +                data: {},
        +                dataType: 'json',
        +
        +                success: function (data) {
        +                    // console.dir(data);
        +                    //console.log(data.responseJSON.message);
        +                    $("#ldaptesticon").html('');
        +                    $("#ldaptestrow").addClass('success');
        +                    $("#ldapteststatus").html('<i class="fa fa-check text-success"></i> It worked!');
        +                },
        +
        +                error: function (data) {
        +                    console.dir(data);
        +                    console.log(data.responseJSON.message);
        +                    $("#ldaptesticon").html('');
        +                    $("#ldaptestrow").addClass('danger');
        +                    $("#ldaptesticon").html('<i class="fa fa-exclamation-triangle text-danger"></i>');
        +                    $('#ldapteststatus').text(data.responseJSON.message);
        +                }
        +
        +
        +            });
        +        });
        +
        +
        +
        +    </script>
        +@stop
        diff --git a/resources/views/settings/localization.blade.php b/resources/views/settings/localization.blade.php
        new file mode 100644
        index 0000000000..e3a2f2f4d2
        --- /dev/null
        +++ b/resources/views/settings/localization.blade.php
        @@ -0,0 +1,103 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Localization Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-globe"></i> Localization
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <!-- Language -->
        +                        <div class="form-group {{ $errors->has('site_name') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('site_name', trans('admin/settings/general.default_language')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {!! Form::locales('locale', Input::old('locale', $setting->locale), 'select2') !!}
        +
        +                                {!! $errors->first('locale', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- Date format -->
        +                        <div class="form-group {{ $errors->has('time_display_format') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('time_display_format', trans('general.time_and_date_display')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {!! Form::date_display_format('date_display_format', Input::old('date_display_format', $setting->date_display_format), 'select2') !!}
        +
        +                                {!! Form::time_display_format('time_display_format', Input::old('time_display_format', $setting->time_display_format), 'select2') !!}
        +
        +                                {!! $errors->first('time_display_format', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- Currency -->
        +                        <div class="form-group {{ $errors->has('default_currency') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('default_currency', trans('admin/settings/general.default_currency')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::text('default_currency', Input::old('default_currency', $setting->default_currency), array('class' => 'form-control','placeholder' => 'USD', 'maxlength'=>'3', 'style'=>'width: 60px;')) }}
        +                                {!! $errors->first('default_currency', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +
        +
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        +
        diff --git a/resources/views/settings/phpinfo.blade.php b/resources/views/settings/phpinfo.blade.php
        new file mode 100644
        index 0000000000..683ceac766
        --- /dev/null
        +++ b/resources/views/settings/phpinfo.blade.php
        @@ -0,0 +1,55 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    PHP Info
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <div class="row">
        +        <div class="col-md-12">
        +            <div class="box box-default">
        +                <div class="box-header">
        +                    <h3 class="box-title">PHP Info</h3>
        +                </div>
        +                <div class="box-body">
        +
        +                    <?php
        +                    ob_start();
        +                    phpinfo();
        +
        +                    preg_match ('%<style type="text/css">(.*?)</style>.*?(<body>.*</body>)%s', ob_get_clean(), $matches);
        +
        +                    # $matches [1]; # Style information
        +                    # $matches [2]; # Body information
        +
        +                    echo "<div class='phpinfodisplay'><style type='text/css'>\n",
        +                    join( "\n",
        +                        array_map(
        +                            create_function(
        +                                '$i',
        +                                'return ".phpinfodisplay " . preg_replace( "/,/", ",.phpinfodisplay ", $i );'
        +                            ),
        +                            preg_split( '/\n/', $matches[1] )
        +                        )
        +                    ),
        +                    "</style>\n",
        +                    $matches[2],
        +                    "\n</div>\n";
        +                    ?>
        +                </div>
        +            </div> <!-- /box-body-->
        +        </div> <!--/box-default-->
        +
        +    </div><!--/col-md-8-->
        +</div><!--/row-->
        +@stop
        diff --git a/resources/views/settings/purge-form.blade.php b/resources/views/settings/purge-form.blade.php
        new file mode 100644
        index 0000000000..c42e9362c1
        --- /dev/null
        +++ b/resources/views/settings/purge-form.blade.php
        @@ -0,0 +1,50 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Purge Deleted
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <div class="row">
        +        <div class="col-md-8 col-md-offset-2">
        +            <div class="box box-solid box-danger">
        +                <div class="box-header with-border">
        +                    <h3 class="box-title"><i class="fa fa-warning"></i> {{ trans('admin/settings/general.purge') }}</h3>
        +                </div>
        +            {{ Form::open(['method' => 'POST', 'route' => ['settings.purge.index'], 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +            <!-- CSRF Token -->
        +                {{csrf_field()}}
        +                <div class="box-body">
        +                    <p>{{ trans('admin/settings/general.confirm_purge_help') }}</p>
        +                    <div class="col-md-3{{ $errors->has('confirm_purge') ? 'error' : '' }}">
        +                        {{ Form::label('confirm_purge', trans('admin/settings/general.confirm_purge')) }}
        +                    </div>
        +                    <div class="col-md-9{{ $errors->has('confirm_purge') ? 'error' : '' }}">
        +                        @if (config('app.lock_passwords')===true)
        +                            {{ Form::text('confirm_purge', Input::old('confirm_purge'), array('class' => 'form-control', 'disabled'=>'disabled')) }}
        +                        @else
        +                            {{ Form::text('confirm_purge', Input::old('confirm_purge'), array('class' => 'form-control')) }}
        +                        @endif
        +                        {!! $errors->first('ldap_version', '<span class="alert-msg">:message</span>') !!}
        +                    </div>
        +                </div>
        +                <div class="box-footer text-right">
        +                    <button type="submit" class="btn btn-danger">{{ trans('admin/settings/general.purge') }}</button>
        +                </div> <!--/box-footer-->
        +                {{ Form::close() }}
        +            </div> <!--/.box-solid-->
        +        </div><!-- /.col-md-8-->
        +    </div><!--/.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        diff --git a/resources/views/settings/purge.blade.php b/resources/views/settings/purge.blade.php
        index f42388a441..65d0b2ab67 100644
        --- a/resources/views/settings/purge.blade.php
        +++ b/resources/views/settings/purge.blade.php
        @@ -11,20 +11,15 @@
           {{ trans('general.back') }}</a>
         @stop
         
        -
         {{-- Page content --}}
         @section('content')
        -
        -
         <div class="row">
        -  <div class="col-md-9">
        -    <div class="box box-default">
        -      <div class="box-body">
        -          {!! nl2br($output) !!}
        -    </div>
        +	<div class="col-md-9">
        +		<div class="box box-default">
        +			<div class="box-body">
        +				{!! nl2br($output) !!}
        +			</div>
        +		</div>
        +	</div>
         </div>
        -</div>
        -</div>
        -
        -
         @stop
        diff --git a/resources/views/settings/security.blade.php b/resources/views/settings/security.blade.php
        new file mode 100644
        index 0000000000..5374522abf
        --- /dev/null
        +++ b/resources/views/settings/security.blade.php
        @@ -0,0 +1,137 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Security Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-lock"></i> Security
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <!-- Two Factor -->
        +                        <div class="form-group {{ $errors->has('brand') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('two_factor_enabled', trans('admin/settings/general.two_factor_enabled_text')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +
        +                                {!! Form::two_factor_options('two_factor_enabled', Input::old('two_factor_enabled', $setting->two_factor_enabled), 'select2') !!}
        +                                <p class="help-block">{{ trans('admin/settings/general.two_factor_enabled_warning') }}</p>
        +
        +                                @if (config('app.lock_passwords'))
        +                                    <p class="help-block">{{ trans('general.feature_disabled') }}</p>
        +                                @endif
        +
        +                                {!! $errors->first('two_factor_enabled', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- Min characters -->
        +                        <div class="form-group {{ $errors->has('pwd_secure_min') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('pwd_secure_min', trans('admin/settings/general.pwd_secure_min')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::text('pwd_secure_min', Input::old('pwd_secure_min', $setting->pwd_secure_min), array('class' => 'form-control',  'style'=>'width: 50px;')) }}
        +
        +                                {!! $errors->first('pwd_secure_min', '<span class="alert-msg">:message</span>') !!}
        +                                <p class="help-block">
        +                                    {{ trans('admin/settings/general.pwd_secure_min_help') }}
        +                                </p>
        +
        +
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Common Passwords -->
        +                        <div class="form-group {{ $errors->has('pwd_secure_uncommon') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('pwd_secure_text',
        +                                              trans('admin/settings/general.pwd_secure_uncommon')) }}
        +
        +                            </div>
        +                            <div class="col-md-9">
        +                                {{ Form::checkbox('pwd_secure_uncommon', '1', Input::old('pwd_secure_uncommon', $setting->pwd_secure_uncommon),array('class' => 'minimal')) }}
        +                                {{ Form::label('pwd_secure_uncommon',  trans('general.yes')) }}
        +                                {!! $errors->first('pwd_secure_uncommon', '<span class="alert-msg">:message</span>') !!}
        +                                <p class="help-block">
        +                                    {{ trans('admin/settings/general.pwd_secure_uncommon_help') }}
        +                                </p>
        +                            </div>
        +                        </div>
        +                        <!-- /.form-group -->
        +
        +                        <!-- Common Passwords -->
        +                        <div class="form-group">
        +                            <div class="col-md-3">
        +                                {{ Form::label('pwd_secure_complexity', trans('admin/settings/general.pwd_secure_complexity')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +
        +                                {{ Form::checkbox("pwd_secure_complexity['letters']", 'letters', Input::old('pwd_secure_uncommon', strpos($setting->pwd_secure_complexity, 'letters')!==false), array('class' => 'minimal')) }}
        +                                Require at least one letter <br>
        +
        +                                {{ Form::checkbox("pwd_secure_complexity['numbers']", 'numbers', Input::old('pwd_secure_uncommon', strpos($setting->pwd_secure_complexity, 'numbers')!==false), array('class' => 'minimal')) }}
        +                                Require at least one number<br>
        +
        +                                {{ Form::checkbox("pwd_secure_complexity['symbols']", 'symbols', Input::old('pwd_secure_uncommon', strpos($setting->pwd_secure_complexity, 'symbols')!==false), array('class' => 'minimal')) }}
        +                                Require at least one symbol<br>
        +
        +                                {{ Form::checkbox("pwd_secure_complexity['case_diff']", 'case_diff', Input::old('pwd_secure_uncommon', strpos($setting->pwd_secure_complexity, 'case_diff')!==false), array('class' => 'minimal')) }}
        +                                Require at least one uppercase and one lowercase
        +
        +                                <p class="help-block">
        +                                    {{ trans('admin/settings/general.pwd_secure_complexity_help') }}
        +                                </p>
        +                            </div>
        +                        </div>
        +                        <!-- /.form-group -->
        +
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        diff --git a/resources/views/settings/slack.blade.php b/resources/views/settings/slack.blade.php
        new file mode 100644
        index 0000000000..6e03057e5e
        --- /dev/null
        +++ b/resources/views/settings/slack.blade.php
        @@ -0,0 +1,110 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Update Slack Settings
        +    @parent
        +@stop
        +
        +@section('header_right')
        +    <a href="{{ route('settings.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +@stop
        +
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <style>
        +        .checkbox label {
        +            padding-right: 40px;
        +        }
        +    </style>
        +
        +
        +    {{ Form::open(['method' => 'POST', 'files' => true, 'class' => 'form-horizontal', 'role' => 'form' ]) }}
        +    <!-- CSRF Token -->
        +    {{csrf_field()}}
        +
        +    <div class="row">
        +        <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
        +
        +
        +            <div class="panel box box-default">
        +                <div class="box-header with-border">
        +                    <h4 class="box-title">
        +                        <i class="fa fa-slack"></i> Slack
        +                    </h4>
        +                </div>
        +                <div class="box-body">
        +
        +
        +                    <div class="col-md-11 col-md-offset-1">
        +
        +                        <p class="help-block">{!! trans('admin/settings/general.slack_integration_help',array('slack_link' => 'https://my.slack.com/services/new/incoming-webhook')) !!}</p>
        +
        +                        <!-- slack endpoint -->
        +                        <div class="form-group {{ $errors->has('slack_endpoint') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('slack_endpoint', trans('admin/settings/general.slack_endpoint')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('slack_endpoint', Input::old('slack_endpoint', $setting->slack_endpoint), array('class' => 'form-control','disabled'=>'disabled','placeholder' => 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX')) }}
        +                                @else
        +                                    {{ Form::text('slack_endpoint', Input::old('slack_endpoint', $setting->slack_endpoint), array('class' => 'form-control','placeholder' => 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX')) }}
        +                                @endif
        +                                {!! $errors->first('slack_endpoint', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- slack channel -->
        +                        <div class="form-group {{ $errors->has('slack_channel') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('slack_channel', trans('admin/settings/general.slack_channel')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('slack_channel', Input::old('slack_channel', $setting->slack_channel), array('class' => 'form-control','disabled'=>'disabled','placeholder' => '#IT-Ops')) }}
        +                                @else
        +                                    {{ Form::text('slack_channel', Input::old('slack_channel', $setting->slack_channel), array('class' => 'form-control','placeholder' => '#IT-Ops')) }}
        +                                @endif
        +                                {!! $errors->first('slack_channel', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- slack botname -->
        +                        <div class="form-group {{ $errors->has('slack_botname') ? 'error' : '' }}">
        +                            <div class="col-md-3">
        +                                {{ Form::label('slack_botname', trans('admin/settings/general.slack_botname')) }}
        +                            </div>
        +                            <div class="col-md-9">
        +                                @if (config('app.lock_passwords')===true)
        +                                    {{ Form::text('slack_botname', Input::old('slack_botname', $setting->slack_botname), array('class' => 'form-control','disabled'=>'disabled','placeholder' => 'Snipe-Bot')) }}
        +                                @else
        +                                    {{ Form::text('slack_botname', Input::old('slack_botname', $setting->slack_botname), array('class' => 'form-control','placeholder' => 'Snipe-Bot')) }}
        +                                @endif
        +                                {!! $errors->first('slack_botname', '<span class="alert-msg">:message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +
        +                    </div>
        +
        +                </div> <!--/.box-body-->
        +                <div class="box-footer">
        +                    <div class="text-left col-md-6">
        +                        <a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
        +                    </div>
        +                    <div class="text-right col-md-6">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +
        +                </div>
        +            </div> <!-- /box -->
        +        </div> <!-- /.col-md-8-->
        +    </div> <!-- /.row-->
        +
        +    {{Form::close()}}
        +
        +@stop
        diff --git a/resources/views/setup/done.blade.php b/resources/views/setup/done.blade.php
        index 65d0f02444..ed117a20e8 100644
        --- a/resources/views/setup/done.blade.php
        +++ b/resources/views/setup/done.blade.php
        @@ -8,21 +8,13 @@ Create a User ::
         
         {{-- Page content --}}
         @section('content')
        -
        -
        -
        -
        -      <div class="col-lg-12" style="padding-top: 20px;">
        -
        -        <div class="col-md-12">
        -            <div class="alert alert-warning">
        -                <i class="fa fa-check"></i>
        -                Success! Your admin user has been added!
        -            </div>
        +<div class="col-lg-12" style="padding-top: 20px;">
        +	<div class="col-md-12">
        +        <div class="alert alert-warning">
        +            <i class="fa fa-check"></i>
        +            Success! Your admin user has been added!
                 </div>
        -
        -        <p>Click here to go to your app login! <a href="{{ config('app.url') }}">{{ config('app.url') }}</a></p>
        -
        -      </div>
        -
        +    </div>
        +    <p>Click here to go to your app login! <a href="{{ url('/') }}">{{ url('/') }}</a></p>
        +</div>
         @stop
        diff --git a/resources/views/setup/index.blade.php b/resources/views/setup/index.blade.php
        index 2d08301b6e..602b272758 100644
        --- a/resources/views/setup/index.blade.php
        +++ b/resources/views/setup/index.blade.php
        @@ -9,218 +9,215 @@ Create a User ::
         {{-- Page content --}}
         @section('content')
         
        -    <p>This page will do a system check to make sure your configuration looks correct. We'll add your first user on the next page. </p>
        +<p>This page will do a system check to make sure your configuration looks correct. We'll add your first user on the next page. </p>
         
        +<table class="table">
        +  <thead>
        +    <tr>
        +      <th class="col-lg-2">Setting</th>
        +      <th class="col-lg-1">Valid</th>
        +      <th class="col-lg-9">Notes</th>
        +    </tr>
        +  </thead>
        +  <tbody>
        +    <tr {!! ($start_settings['url_valid']) ? ' class="success"' : ' class="danger"' !!}>
        +      <td>URL</td>
        +      <td>
        +        @if ($start_settings['url_valid'])
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-error"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if ($start_settings['url_valid'])
        +          That URL looks right! Good job!
        +        @else
        +          Uh oh! Snipe-IT thinks your URL is {{ $start_settings['url_config'] }}, but your real URL is {{ $start_settings['real_url'] }}
        +          Please update your <code>APP_URL</code> settings in your  <code>.env</code> file
        +        @endif
        +      </td>
        +    </tr>
         
        -      <table class="table">
        -        <thead>
        -        <tr>
        -          <th class="col-lg-2">Setting</th>
        -          <th class="col-lg-1">Valid</th>
        -          <th class="col-lg-9">Notes</th>
        -        </tr>
        -      </thead>
        -      <tbody>
        -        <tr{!! ($start_settings['url_valid']) ? ' class="success"' : ' class="danger"' !!}>
        -          <td>URL</td>
        -          <td>
        -            @if ($start_settings['url_valid'])
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-error"></i>
        -            @endif
        +    <tr {!! ($start_settings['db_conn']===true) ? ' class="success"' : ' class="danger"' !!}>
        +      <td>Database</td>
        +      <td>
        +        @if ($start_settings['db_conn']===true)
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-error"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if ($start_settings['db_conn']===true)
        +          Great work! Connected to <code>{{ $start_settings['db_name'] }}</code>
        +        @else
        +          D'oh! Looks like we can't connect to your database. Please update your database settings in your  <code>.env</code> file. Your database says: <code>{{ $start_settings['db_error'] }}</code>
        +        @endif
        +      </td>
        +    </tr>
         
        -          </td>
        -          <td>
        -            @if ($start_settings['url_valid'])
        -              That URL looks right! Good job!
        -            @else
        -              Uh oh! Snipe-IT thinks your URL is {{ $start_settings['url_config'] }}, but your real URL is {{ $start_settings['real_url'] }}
        -              Please update your <code>APP_URL</code> settings in your  <code>.env</code> file
        -            @endif
        -          </td>
        -        </tr>
        -        <tr{!! ($start_settings['db_conn']===true) ? ' class="success"' : ' class="danger"' !!}>
        -          <td>Database</td>
        -          <td>
        -            @if ($start_settings['db_conn']===true)
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-error"></i>
        -            @endif
        -          </td>
        -          <td>
        -              @if ($start_settings['db_conn']===true)
        -                Great work! Connected to <code>{{ $start_settings['db_name'] }}</code>
        -              @else
        -                D'oh! Looks like we can't connect to your database. Please update your database settings in your  <code>.env</code> file. Your database says: <code>{{ $start_settings['db_error'] }}</code>
        -              @endif
        -          </td>
        -        </tr>
        -        <tr{!! (!$start_settings['env_exposed']) ? ' class="success"' : ' class="danger"' !!}>
        -          <td>Config File</td>
        -          <td>
        -            @if (!$start_settings['env_exposed'])
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-error"></i>
        -            @endif
        -          </td>
        -          <td>
        -              @if (!$start_settings['env_exposed'])
        -                Sweet. It doesn't look like your <code>.env</code> file is exposed to the outside world. (You should double check this in a browser though. You don't ever want anyone able to see that file. Ever. Ever ever.) <a href="../../.env">Click here to check now</a> (This should return a file not found or forbidden error.)
        -              @else
        -                Please make sure your <code>.env</code>. You don't ever want anyone able to see that file. Ever. Ever ever.  <a href="../../.env">Click here to check now</a> (This should return a file not found or forbidden error.)
        -              @endif
        -          </td>
        -        </tr>
        +    <tr {!! (!$start_settings['env_exposed']) ? ' class="success"' : ' class="danger"' !!}>
        +      <td>Config File</td>
        +      <td>
        +        @if (!$start_settings['env_exposed'])
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-error"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if (!$start_settings['env_exposed'])
        +          Sweet. It doesn't look like your <code>.env</code> file is exposed to the outside world. (You should double check this in a browser though. You don't ever want anyone able to see that file. Ever. Ever ever.) <a href="../../.env">Click here to check now</a> (This should return a file not found or forbidden error.)
        +        @else
        +          Please make sure your <code>.env</code> is not readable by the outside world via web browser. You don't ever want anyone able to see that file. Ever. Ever ever. An exposed <code>.env</code> file can disclose sensitive data about your system and database. <a href="../../.env">Click here to check now</a> (This should return a file not found or forbidden error.)
        +        @endif
        +      </td>
        +    </tr>
         
        -        <tr{!! ($start_settings['prod']) ? ' class="success"' : ' class="warning"' !!}>
        -          <td>Environment</td>
        -          <td>
        -            @if ($start_settings['prod'])
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-error"></i>
        -            @endif
        -          </td>
        -          <td>
        -              @if ($start_settings['prod'])
        -                Your app is set to production mode. Rock on!
        -              @else
        -                Your app is set <code>{{ $start_settings['env'] }}</code> instead of <code>production</code> mode. If you're not planning on developing on Snipe-IT, please update your <code>APP_ENV</code> settings in your  <code>.env</code> file to <code>production</code>.
        -              @endif
        -          </td>
        -        </tr>
        +    <tr {!! ($start_settings['prod']) ? ' class="success"' : ' class="warning"' !!}>
        +      <td>Environment</td>
        +      <td>
        +        @if ($start_settings['prod'])
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-error"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if ($start_settings['prod'])
        +          Your app is set to production mode. Rock on!
        +        @else
        +          Your app is set <code>{{ $start_settings['env'] }}</code> instead of <code>production</code> mode. If you're not planning on developing on Snipe-IT, please update your <code>APP_ENV</code> settings in your  <code>.env</code> file to <code>production</code>.
        +        @endif
        +      </td>
        +    </tr>
         
        -        <tr{!! (!$start_settings['owner_is_admin']) ? ' class="success"' : ' class="danger"' !!}>
        -          <td>File Owner</td>
        -          <td>
        -            @if (!$start_settings['owner_is_admin'])
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-error"></i>
        -            @endif
        -          </td>
        -          <td>
        -              @if (!$start_settings['owner_is_admin'])
        -                Your app files are owned by <code>{{ $start_settings['owner'] }}</code>. That doesn't look like a default root/admin account. Nice!
        -              @else
        -                It looks like your files are owned by <code>{{ $start_settings['owner'] }}</code>, which might be a root/admin account. It's never a good idea to run a website with escalated priveliges.
        -              @endif
        -          </td>
        -        </tr>
        +    <tr {!! (!$start_settings['owner_is_admin']) ? ' class="success"' : ' class="danger"' !!}>
        +      <td>File Owner</td>
        +      <td>
        +        @if (!$start_settings['owner_is_admin'])
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-error"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if (!$start_settings['owner_is_admin'])
        +          Your app files are owned by <code>{{ $start_settings['owner'] }}</code>. That doesn't look like a default root/admin account. Nice!
        +        @else
        +          It looks like your files are owned by <code>{{ $start_settings['owner'] }}</code>, which might be a root/admin account. It's never a good idea to run a website with escalated priveliges.
        +        @endif
        +      </td>
        +    </tr>
         
        -        <tr{!! (!$start_settings['writable']) ? ' class="danger"' : ' class="success"' !!}>
        -          <td>Permissions</td>
        -          <td>
        -            @if ($start_settings['writable'])
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-error"></i>
        -            @endif
        -          </td>
        -          <td>
        -              @if ($start_settings['writable'])
        -                Yippee! Your app storage directory seems writable.
        -              @else
        -                Uh-oh. Your <code>{{ storage_path() }}</code> directory (or sub-directories within) are not writable by the web-server. Those directories need to be writable by the web server in order for the app to work.
        -              @endif
        -          </td>
        -        </tr>
        +    <tr {!! (!$start_settings['writable']) ? ' class="danger"' : ' class="success"' !!}>
        +      <td>Permissions</td>
        +      <td>
        +        @if ($start_settings['writable'])
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-error"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if ($start_settings['writable'])
        +          Yippee! Your app storage directory seems writable.
        +        @else
        +          Uh-oh. Your <code>{{ storage_path() }}</code> directory (or sub-directories within) are not writable by the web-server. Those directories need to be writable by the web server in order for the app to work.
        +        @endif
        +      </td>
        +    </tr>
         
        -        <tr{!! ($start_settings['debug_exposed']) ? ' class="danger"' : ' class="success"' !!}>
        -          <td>Debug</td>
        -          <td>
        -            @if (!$start_settings['debug_exposed'])
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-error"></i>
        -            @endif
        -          </td>
        -          <td>
        -              @if (!$start_settings['debug_exposed'])
        -                Awesomesauce. Debug is either turned off, or you're running this in a non-production environment. (Don't forget to turn it off when you're ready to go live.)
        -              @else
        -                Yikes! You should turn off debug mode unless you encounter any issues. Please update your <code>APP_DEBUG</code> settings in your  <code>.env</code> file
        -              @endif
        -          </td>
        -        </tr>
        +    <tr {!! ($start_settings['debug_exposed']) ? ' class="danger"' : ' class="success"' !!}>
        +      <td>Debug</td>
        +      <td>
        +        @if (!$start_settings['debug_exposed'])
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-error"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if (!$start_settings['debug_exposed'])
        +          Awesomesauce. Debug is either turned off, or you're running this in a non-production environment. (Don't forget to turn it off when you're ready to go live.)
        +        @else
        +          Yikes! You should turn off debug mode unless you encounter any issues. Please update your <code>APP_DEBUG</code> settings in your  <code>.env</code> file
        +        @endif
        +      </td>
        +    </tr>
         
        -        <tr{!! ($start_settings['gd']) ? ' class="success"' : ' class="warning"' !!}>
        -          <td>Image Library</td>
        -          <td>
        -            @if ($start_settings['gd'])
        -              <i class="fa fa-check preflight-success"></i>
        -            @else
        -              <i class="fa fa-times preflight-warning"></i>
        -            @endif
        -          </td>
        -          <td>
        -              @if ($start_settings['gd'])
        -                GD is installed. Go you!
        -              @else
        -                The GD library isn't installed. While this won't prevent the system from working, you won't be able to generate labels or upload images.
        -              @endif
        -          </td>
        -        </tr>
        -        <tr id="mailrow">
        -          <td>Email</td>
        -          <td id="mailtesticon">
        -          </td>
        -          <td id="mailtestresult">
        -             <button class="btn btn-default" id="mailtest"> Test Email</button>
        -              <span id="mailtestresult"></span>
        -          </td>
        -        </tr>
        +    <tr {!! ($start_settings['gd']) ? ' class="success"' : ' class="warning"' !!}>
        +      <td>Image Library</td>
        +      <td>
        +        @if ($start_settings['gd'])
        +          <i class="fa fa-check preflight-success"></i>
        +        @else
        +          <i class="fa fa-times preflight-warning"></i>
        +        @endif
        +      </td>
        +      <td>
        +        @if ($start_settings['gd'])
        +          GD is installed. Go you!
        +        @else
        +          The GD library isn't installed. While this won't prevent the system from working, you won't be able to generate labels or upload images.
        +        @endif
        +      </td>
        +    </tr>
         
        -      </tbody>
        -      </table>
        -
        -
        -
        -        @section('button')
        -          <form action="{{ route('setup.migrate') }}" method="GET">
        -            <button class="btn btn-primary">Next: Create Database Tables</button>
        -          </form>
        -        @parent
        -        @stop
        +    <tr id="mailrow">
        +      <td>Email</td>
        +      <td id="mailtesticon">
        +      </td>
        +      <td id="mailtestresult">
        +        <button class="btn btn-default" id="mailtest"> Test Email</button>
        +        <span id="mailtestresult"></span>
        +      </td>
        +    </tr>
        +  </tbody>
        +</table>
         
        +@stop
         
        +@section('button')
        +  <form action="{{ route('setup.migrate') }}" method="GET">
        +    <button class="btn btn-primary">Next: Create Database Tables</button>
        +  </form>
        +@parent
        +@stop
         
         @section('moar_scripts')
        -    <script type="text/javascript">
        -        $(document).ready(function () {
        +<script type="text/javascript">
        +    $(document).ready(function () {
         
        -        $("#mailtest").click(function(){
        +    $("#mailtest").click(function(){
         
        -              $("#mailtestresult").html('<i class="fa fa-spinner fa-spin"></i> Sending Email');
        +          $("#mailtestresult").html('<i class="fa fa-spinner fa-spin"></i> Sending Email');
         
        -              $.ajax({url: "{{ route('setup.mailtest') }}", success: function(result){
        -                  if (result=='success') {
        -                    $("#mailrow").addClass('success');
        -                    $("#mailtesticon").html('<i class="fa fa-check preflight-success"></i>');
        -                    $("#mailtestresult").html('No errors on this end! Check your <code>{{ config('mail.from.address') }}</code> email account for a test email.');
        -                  } else {
        -                    $("#mailrow").addClass('danger');
        -                    $("#mailtesticon").html('<i class="fa fa-check preflight-error"></i>');
        -                    $("#mailtestresult").html('Something went wrong. Your email was not sent. Check your mail settings in your <code>.env</code> file.');
        -
        -                  }
        -
        -
        -              },
        -              error: function (result) {
        +          $.ajax({url: "{{ route('setup.mailtest') }}", success: function(result){
        +              if (result=='success') {
        +                $("#mailrow").addClass('success');
        +                $("#mailtesticon").html('<i class="fa fa-check preflight-success"></i>');
        +                $("#mailtestresult").html('No errors on this end! Check your <code>{{ config('mail.from.address') }}</code> email account for a test email.');
        +              } else {
                         $("#mailrow").addClass('danger');
                         $("#mailtesticon").html('<i class="fa fa-check preflight-error"></i>');
        -                $("#mailtestresult").html('Something went wrong. The server returned an error. Check your mail settings in your <code>.env</code> file, and check your <code>storage/logs</code> for additional information..');
        +                $("#mailtestresult").html('Something went wrong. Your email was not sent. Check your mail settings in your <code>.env</code> file.');
        +
                       }
         
         
        -            });
        +          },
        +          error: function (result) {
        +            $("#mailrow").addClass('danger');
        +            $("#mailtesticon").html('<i class="fa fa-check preflight-error"></i>');
        +            $("#mailtestresult").html('Something went wrong. The server returned an error. Check your mail settings in your <code>.env</code> file, and check your <code>storage/logs</code> for additional information..');
        +          }
        +
         
                 });
        -     });
        -    </script>
        -@stop
        +
        +    });
        + });
        +</script>
         @stop
        diff --git a/resources/views/setup/migrate.blade.php b/resources/views/setup/migrate.blade.php
        index faf3e4e76c..0f3f0f0ef5 100644
        --- a/resources/views/setup/migrate.blade.php
        +++ b/resources/views/setup/migrate.blade.php
        @@ -8,33 +8,27 @@ Create a User ::
         
         {{-- Page content --}}
         @section('content')
        -
        -
        -
        -
        -      <div class="col-lg-12" style="padding-top: 20px;">
        -
        -        @if (trim($output)=='Nothing to migrate.')
        -        <div class="col-md-12">
        -            <div class="alert alert-warning">
        -                <i class="fa fa-warning"></i>
        -              There was nothing to migrate. Your database tables were already set up!
        -            </div>
        +<div class="col-lg-12" style="padding-top: 20px;">
        +    @if (trim($output)=='Nothing to migrate.')
        +    <div class="col-md-12">
        +        <div class="alert alert-warning">
        +            <i class="fa fa-warning"></i>
        +            There was nothing to migrate. Your database tables were already set up!
                 </div>
        -        @else
        -        <div class="col-md-12">
        -            <div class="alert alert-success">
        -                <i class="fa fa-check"></i>
        -                Your database tables have been created
        -            </div>
        +    </div>
        +    @else
        +    <div class="col-md-12">
        +        <div class="alert alert-success">
        +            <i class="fa fa-check"></i>
        +            Your database tables have been created
                 </div>
        +    </div>
         
        -        @endif
        -
        -        <p>Migration output: </p>
        -        <pre>{{ $output }}</pre>
        -        </div>
        +    @endif
         
        +    <p>Migration output: </p>
        +    <pre>{{ $output }}</pre>
        +</div>
         @stop
         
         @section('button')
        diff --git a/resources/views/setup/user.blade.php b/resources/views/setup/user.blade.php
        index f360ec348c..59bda40593 100644
        --- a/resources/views/setup/user.blade.php
        +++ b/resources/views/setup/user.blade.php
        @@ -9,109 +9,103 @@ Create a User ::
         {{-- Page content --}}
         @section('content')
         
        -  <p> This is the account information you'll use to access the site for the first time. All fields are required. </p>
        +<p> This is the account information you'll use to access the site for the first time. All fields are required. </p>
         
        -          <form action="{{ route('setup.user.save') }}" method="POST">
        -            {!! csrf_field() !!}
        +<form action="{{ route('setup.user.save') }}" method="POST">
        +  {{ csrf_field() }}
         
        -            <div class="col-lg-12" style="padding-top: 20px;">
        +  <div class="col-lg-12" style="padding-top: 20px;">
        +    <!-- Site Name -->
        +    <div class="row">
        +      <div class="form-group col-lg-12 {{ $errors->has('site_name') ? 'error' : '' }}">
        +        {{ Form::label('site_name', trans('general.site_name')) }}
        +        {{ Form::text('site_name', Input::old('site_name'), array('class' => 'form-control','placeholder' => 'Snipe-IT Asset Management')) }}
         
        -              <!-- Site Name -->
        -              <div class="row">
        -                <div class="form-group col-lg-12 {{ $errors->has('site_name') ? 'error' : '' }}">
        -                    {{ Form::label('site_name', trans('general.site_name')) }}
        -                    {{ Form::text('site_name', Input::old('site_name'), array('class' => 'form-control','placeholder' => 'Snipe-IT Asset Management')) }}
        +        {!! $errors->first('site_name', '<span class="alert-msg">:message</span>') !!}
        +      </div>
        +    </div>
         
        -                    {!! $errors->first('site_name', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        +    <!-- email domain -->
        +    <div class="row">
        +      <div class="form-group col-lg-6 {{ $errors->has('email_domain') ? 'error' : '' }}">
        +        {{ Form::label('email_domain', trans('general.email_domain')) }}
        +        {{ Form::text('email_domain', Input::old('email_domain'), array('class' => 'form-control','placeholder' => 'example.com')) }}
        +        <span class="help-block">{{ trans('general.email_domain_help')  }}</span>
         
        -              <!-- email domain -->
        +        {!! $errors->first('email_domain', '<span class="alert-msg">:message</span>') !!}
        +      </div>
         
        -              <div class="row">
        -                <div class="form-group col-lg-6 {{ $errors->has('email_domain') ? 'error' : '' }}">
        -                  {{ Form::label('email_domain', trans('general.email_domain')) }}
        -                  {{ Form::text('email_domain', Input::old('email_domain'), array('class' => 'form-control','placeholder' => 'example.com')) }}
        -                  <span class="help-block">{{ trans('general.email_domain_help')  }}</span>
        +      <!-- email format  -->
        +      <div class="form-group col-lg-6 {{ $errors->has('email_format') ? 'error' : '' }}">
        +        {{ Form::label('email_format', trans('general.email_format')) }}
        +        {!! Form::username_format('email_format', Input::old('email_format', 'filastname'), 'select2') !!}
        +        {!! $errors->first('email_format', '<span class="alert-msg">:message</span>') !!}
        +      </div>
        +    </div>
         
        -                  {!! $errors->first('email_domain', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        +    <!-- Name -->
        +    <div class="row">
        +      <!-- first name -->
        +      <div class="form-group col-lg-6 {{ $errors->has('first_name') ? 'error' : '' }}">
        +        {{ Form::label('first_name', trans('general.first_name')) }}
        +        {{ Form::text('first_name', Input::old('first_name'), array('class' => 'form-control','placeholder' => 'Jane')) }}
        +        {!! $errors->first('first_name', '<span class="alert-msg">:message</span>') !!}
        +      </div>
         
        -                <!-- email format  -->
        -                <div class="form-group col-lg-6 {{ $errors->has('email_format') ? 'error' : '' }}">
        -                  {{ Form::label('email_format', trans('general.email_format')) }}
        -                  {!! Form::username_format('email_format', Input::old('email_format', 'filastname'), 'select2') !!}
        -                  {!! $errors->first('email_format', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        +      <!-- last name -->
        +      <div class="form-group col-lg-6 {{ $errors->has('last_name') ? 'error' : '' }}">
        +        {{ Form::label('last_name', trans('general.last_name')) }}
        +        {{ Form::text('last_name', Input::old('last_name'), array('class' => 'form-control','placeholder' => 'Smith')) }}
        +        {!! $errors->first('last_name', '<span class="alert-msg">:message</span>') !!}
        +      </div>
        +    </div>
         
        +    <div class="row">
        +      <!-- email-->
        +      <div class="form-group col-lg-6 {{ $errors->has('email') ? 'error' : '' }}">
        +        {{ Form::label('email', trans('admin/users/table.email')) }}
        +        {{ Form::email('email', config('mail.from.address'), array('class' => 'form-control','placeholder' => 'you@example.com')) }}
        +        {!! $errors->first('email', '<span class="alert-msg">:message</span>') !!}
        +      </div>
         
        -              <!-- first name -->
        +      <!-- username -->
        +      <div class="form-group col-lg-6 {{ $errors->has('username') ? 'error' : '' }}">
        +        {{ Form::label('username', trans('admin/users/table.username')) }}
        +        {{ Form::text('username', Input::old('username'), array('class' => 'form-control','placeholder' => 'jsmith')) }}
        +        {!! $errors->first('username', '<span class="alert-msg">:message</span>') !!}
        +      </div>
        +    </div>
         
        -              <div class="row">
        -                <div class="form-group col-lg-6 {{ $errors->has('first_name') ? 'error' : '' }}">
        -                    {{ Form::label('first_name', trans('general.first_name')) }}
        -                    {{ Form::text('first_name', Input::old('first_name'), array('class' => 'form-control','placeholder' => 'Jane')) }}
        -
        -                    {!! $errors->first('first_name', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -
        -                <!-- last name -->
        -                <div class="form-group col-lg-6 {{ $errors->has('last_name') ? 'error' : '' }}">
        -                  {{ Form::label('last_name', trans('general.last_name')) }}
        -                  {{ Form::text('last_name', Input::old('last_name'), array('class' => 'form-control','placeholder' => 'Smith')) }}
        -                  {!! $errors->first('last_name', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        -
        -              <div class="row">
        -              <!-- email-->
        -                <div class="form-group col-lg-6 {{ $errors->has('email') ? 'error' : '' }}">
        -                  {{ Form::label('email', trans('admin/users/table.email')) }}
        -                  {{ Form::email('email', config('mail.from.address'), array('class' => 'form-control','placeholder' => 'you@example.com')) }}
        -                  {!! $errors->first('email', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -
        -                <!-- username -->
        -                <div class="form-group col-lg-6 {{ $errors->has('username') ? 'error' : '' }}">
        -                  {{ Form::label('username', trans('admin/users/table.username')) }}
        -                  {{ Form::text('username', Input::old('username'), array('class' => 'form-control','placeholder' => 'jsmith')) }}
        -                  {!! $errors->first('username', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        -
        -              <div class="row">
        -                <!-- password -->
        -                <div class="form-group col-lg-6 {{ $errors->has('password') ? 'error' : '' }}">
        -                  {{ Form::label('password', trans('admin/users/table.password')) }}
        -                  {{ Form::password('password', array('class' => 'form-control')) }}
        -                  {!! $errors->first('password', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -
        -                <!-- password confirm -->
        -                <div class="form-group col-lg-6 {{ $errors->has('password_confirm') ? 'error' : '' }}">
        -                  {{ Form::label('password_confirmation', trans('admin/users/table.password_confirm')) }}
        -                  {{ Form::password('password_confirm', array('class' => 'form-control')) }}
        -                  {!! $errors->first('password_confirmation', '<span class="alert-msg">:message</span>') !!}
        -                </div>
        -              </div>
        -
        -              <!-- Email credentials -->
        -              <div class="form-group col-lg-12">
        -                <label>Email credentials</label>
        -                <div class="checkbox">
        -                    <label>
        -                        <input type="checkbox" value="1" name="email_creds">Email my credentials to the email address above
        -                    </label>
        -                </div>
        -            </div>
        -        </div>
        +    <div class="row">
        +      <!-- password -->
        +      <div class="form-group col-lg-6 {{ $errors->has('password') ? 'error' : '' }}">
        +        {{ Form::label('password', trans('admin/users/table.password')) }}
        +        {{ Form::password('password', array('class' => 'form-control')) }}
        +        {!! $errors->first('password', '<span class="alert-msg">:message</span>') !!}
        +      </div>
         
        +      <!-- password confirm -->
        +      <div class="form-group col-lg-6 {{ $errors->has('password_confirm') ? 'error' : '' }}">
        +        {{ Form::label('password_confirmation', trans('admin/users/table.password_confirm')) }}
        +        {{ Form::password('password_confirm', array('class' => 'form-control')) }}
        +        {!! $errors->first('password_confirmation', '<span class="alert-msg">:message</span>') !!}
        +      </div>
        +    </div>
         
        +    <!-- Email credentials -->
        +    <div class="form-group col-lg-12">
        +      <label>Email credentials</label>
        +      <div class="checkbox">
        +        <label>
        +          <input type="checkbox" value="1" name="email_creds">Email my credentials to the email address above
        +        </label>
        +      </div>
        +    </div>
        +  </div> <!--/.COL-LG-12-->
         @stop
         
         @section('button')
           <button class="btn btn-primary">Next: Save User</button>
        -  </form>
        +</form>
         @parent
         @stop
        diff --git a/resources/views/statuslabels/edit.blade.php b/resources/views/statuslabels/edit.blade.php
        index 06e1132059..76badf683c 100755
        --- a/resources/views/statuslabels/edit.blade.php
        +++ b/resources/views/statuslabels/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/statuslabels/table.create') ,
             'updateText' => trans('admin/statuslabels/table.update'),
             'helpTitle' => trans('admin/statuslabels/table.about'),
        -    'helpText' => trans('admin/statuslabels/table.info')
        +    'helpText' => trans('admin/statuslabels/table.info'),
        +    'formAction' => ($item) ? route('statuslabels.update', ['statuslabel' => $item->id]) : route('statuslabels.store'),
         ])
         
         {{-- Page content --}}
        @@ -13,7 +14,7 @@
             }
         </style>
         <!-- Bootstrap Color Picker -->
        -<link rel="stylesheet" href="{{ asset('assets/js/plugins/colorpicker/bootstrap-colorpicker.min.css') }}">
        +<link rel="stylesheet" href="{{ asset('js/plugins/colorpicker/bootstrap-colorpicker.min.css') }}">
         @parent
         @stop
         
        diff --git a/resources/views/statuslabels/index.blade.php b/resources/views/statuslabels/index.blade.php
        index d3dafc1856..ad9fc83544 100755
        --- a/resources/views/statuslabels/index.blade.php
        +++ b/resources/views/statuslabels/index.blade.php
        @@ -7,7 +7,7 @@
         @stop
         
         @section('header_right')
        -<a href="{{ route('create/statuslabel') }}" class="btn btn-primary pull-right">
        +<a href="{{ route('statuslabels.create') }}" class="btn btn-primary pull-right">
         {{ trans('general.create') }}</a>
         @stop
         {{-- Page content --}}
        @@ -23,18 +23,18 @@
                   name="statuslabels"
                   id="table"
                   class="snipe-table"
        -          data-url="{{ route('api.statuslabels.list') }}"
        +          data-url="{{ route('api.statuslabels.index') }}"
                   data-cookie="true"
                   data-click-to-select="true"
                   data-cookie-id-table="statuslabelsTable-{{ config('version.hash_version') }}">
                     <thead>
                       <tr>
                         <th data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                <th data-sortable="true" data-field="name">{{ trans('admin/statuslabels/table.name') }}</th>
        -                <th data-sortable="false" data-field="type">{{ trans('admin/statuslabels/table.status_type') }}</th>
        -                <th data-sortable="false" data-field="color">{{ trans('admin/statuslabels/table.color') }}</th>
        -                <th data-sortable="true" data-field="show_in_nav">{{ trans('admin/statuslabels/table.show_in_nav') }}</th>
        -                <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +                <th data-sortable="true" data-field="name" data-formatter="statuslabelsAssetLinkFormatter">{{ trans('admin/statuslabels/table.name') }}</th>
        +                <th data-sortable="false" data-field="type" data-formatter="undeployableFormatter">{{ trans('admin/statuslabels/table.status_type') }}</th>
        +                <th data-sortable="false" data-field="color" data-formatter="colorSqFormatter">{{ trans('admin/statuslabels/table.color') }}</th>
        +                <th class="text-center" data-sortable="true" data-field="show_in_nav" data-formatter="trueFalseFormatter">{{ trans('admin/statuslabels/table.show_in_nav') }}</th>
        +                <th data-switchable="false" data-formatter="statuslabelsActionsFormatter" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
                       </tr>
                     </thead>
                   </table>
        @@ -53,4 +53,26 @@
         
         @section('moar_scripts')
         @include ('partials.bootstrap-table', ['exportFile' => 'statuslabels-export', 'search' => true])
        +
        +  <script>
        +      function colorSqFormatter(value, row) {
        +          if (value) {
        +              return '<span class="label" style="background-color: ' + value + ';">&nbsp;</span> ' + value;
        +          }
        +      }
        +
        +      function statuslabelsAssetLinkFormatter(value, row) {
        +          if ((row) && (row.name)) {
        +              return '<a href="{{ url('/') }}/hardware/?status_id=' + row.id + '"> ' + row.name + '</a>';
        +          }
        +      }
        +
        +      function undeployableFormatter(value, row) {
        +          if ((value)  && (value!='deployable')) {
        +              return '<span class="text-danger">' + value + '</span> ';
        +          } else {
        +              return '<span class="text-success">' + value + '</span> ';
        +          }
        +      }
        +  </script>
         @stop
        diff --git a/resources/views/statuslabels/view.blade.php b/resources/views/statuslabels/view.blade.php
        new file mode 100644
        index 0000000000..77c1026350
        --- /dev/null
        +++ b/resources/views/statuslabels/view.blade.php
        @@ -0,0 +1,63 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    {{ $statuslabel->name }} {{ trans('general.assets') }}
        +    @parent
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +
        +    <div class="row">
        +        <div class="col-md-12">
        +            <div class="box">
        +                <div class="box-body">
        +                    {{ Form::open([
        +                      'method' => 'POST',
        +                      'route' => ['hardware/bulkedit'],
        +                      'class' => 'form-inline',
        +                       'id' => 'bulkForm']) }}
        +                    <div class="row">
        +                        <div class="col-md-12">
        +                            @if (Input::get('status')!='Deleted')
        +                                <div id="toolbar">
        +                                    <select name="bulk_actions" class="form-control select2">
        +                                        <option value="edit">Edit</option>
        +                                        <option value="delete">Delete</option>
        +                                        <option value="labels">Generate Labels</option>
        +                                    </select>
        +                                    <button class="btn btn-default" id="bulkEdit" disabled>Go</button>
        +                                </div>
        +                            @endif
        +
        +                            <table
        +                                    name="assets"
        +                                    {{-- data-row-style="rowStyle" --}}
        +                                    data-toolbar="#toolbar"
        +                                    class="table table-striped snipe-table"
        +                                    id="table"
        +                                    data-advanced-search="true"
        +                                    data-id-table="advancedTable"
        +                                    data-url="{{ route('api.assets.index',
        +                                      array('status_id'=>$statuslabel->id))}}"
        +                                    data-click-to-select="true"
        +                                    data-cookie-id-table="{{ e(Input::get('status')) }}assetTable-{{ config('version.hash_version') }}">
        +                            </table>
        +                        </div><!-- /.col -->
        +                    </div><!-- /.row -->
        +                    {{ Form::close() }}
        +                </div><!-- ./box-body -->
        +            </div><!-- /.box -->
        +        </div>
        +    </div>
        +@stop
        +
        +@section('moar_scripts')
        +    @include ('partials.bootstrap-table', [
        +        'exportFile' => 'assets-export',
        +        'search' => true,
        +        'columns' => \App\Presenters\AssetPresenter::dataTableLayout()
        +    ])
        +
        +@stop
        diff --git a/resources/views/suppliers/edit.blade.php b/resources/views/suppliers/edit.blade.php
        index d9215b87dc..5b9a2b78a8 100755
        --- a/resources/views/suppliers/edit.blade.php
        +++ b/resources/views/suppliers/edit.blade.php
        @@ -2,7 +2,8 @@
             'createText' => trans('admin/suppliers/table.create') ,
             'updateText' => trans('admin/suppliers/table.update'),
             'helpTitle' => trans('admin/suppliers/table.about_suppliers_title'),
        -    'helpText' => trans('admin/suppliers/table.about_suppliers_text')
        +    'helpText' => trans('admin/suppliers/table.about_suppliers_text'),
        +    'formAction' => ($item) ? route('suppliers.update', ['supplier' => $item->id]) : route('suppliers.store'),
         ])
         
         {{-- Page content --}}
        @@ -47,7 +48,7 @@
             <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label>
             <div class="col-md-5">
                 {{ Form::checkbox('image_delete') }}
        -        <img src="{{ config('app.url') }}/uploads/suppliers/{{ $item->image }}" />
        +        <img src="{{ url('/') }}/uploads/suppliers/{{ $item->image }}" />
                 {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
             </div>
         </div>
        diff --git a/resources/views/suppliers/index.blade.php b/resources/views/suppliers/index.blade.php
        index b7e1542fcb..ff53eeb1fd 100755
        --- a/resources/views/suppliers/index.blade.php
        +++ b/resources/views/suppliers/index.blade.php
        @@ -11,11 +11,9 @@
         
         
         @section('header_right')
        -<a href="{{ route('create/supplier') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
        +<a href="{{ route('suppliers.create') }}" class="btn btn-primary pull-right"> {{ trans('general.create') }}</a>
         @stop
         
        -
        -
         <div class="row">
           <div class="col-md-12">
             <div class="box box-default">
        @@ -25,22 +23,22 @@
               name="suppliers"
               id="table"
               class="table table-striped snipe-table"
        -      data-url="{{ route('api.suppliers.list') }}"
        +      data-url="{{ route('api.suppliers.index') }}"
               data-cookie="true"
               data-click-to-select="true"
               data-cookie-id-table="suppliersTable-{{ config('version.hash_version') }}">
                 <thead>
                   <tr>
                     <th data-sortable="true" data-field="id" data-visible="false">{{ trans('admin/suppliers/table.id') }}</th>
        -            <th data-sortable="true" data-field="name">{{ trans('admin/suppliers/table.name') }}</th>
        +            <th data-sortable="true" data-field="name" data-formatter="suppliersLinkFormatter">{{ trans('admin/suppliers/table.name') }}</th>
                     <th data-sortable="true" data-field="address">{{ trans('admin/suppliers/table.address') }}</th>
                     <th data-searchable="true" data-sortable="true" data-field="contact">{{ trans('admin/suppliers/table.contact') }}</th>
        -            <th data-searchable="true" data-sortable="true" data-field="email">{{ trans('admin/suppliers/table.email') }}</th>
        +            <th data-searchable="true" data-sortable="true" data-field="email" data-formatter="emailFormatter">{{ trans('admin/suppliers/table.email') }}</th>
                     <th data-searchable="true" data-sortable="true" data-field="phone">{{ trans('admin/suppliers/table.phone') }}</th>
                     <th data-searchable="true" data-sortable="true" data-field="fax" data-visible="false">{{ trans('admin/suppliers/table.fax') }}</th>
        -            <th data-searchable="false" data-sortable="false" data-field="assets">{{ trans('admin/suppliers/table.assets') }}</th>
        -            <th data-searchable="false" data-sortable="false" data-field="licenses">{{ trans('admin/suppliers/table.licenses') }}</th>
        -            <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
        +            <th data-searchable="false" data-sortable="false" data-field="assets_count">{{ trans('admin/suppliers/table.assets') }}</th>
        +            <th data-searchable="false" data-sortable="false" data-field="licenses_count">{{ trans('admin/suppliers/table.licenses') }}</th>
        +            <th data-switchable="false" data-formatter="suppliersActionsFormatter" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
                   </tr>
                 </thead>
               </table>
        diff --git a/resources/views/suppliers/view.blade.php b/resources/views/suppliers/view.blade.php
        index 96ba8f5a7d..368942283d 100755
        --- a/resources/views/suppliers/view.blade.php
        +++ b/resources/views/suppliers/view.blade.php
        @@ -8,222 +8,228 @@
         @stop
         
         @section('header_right')
        -  <a href="{{ route('update/supplier', $supplier->id) }}" class="btn btn-default pull-right">
        +  <a href="{{ route('suppliers.edit', $supplier->id) }}" class="btn btn-default pull-right">
           {{ trans('admin/suppliers/table.update') }}</a>
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        -  <div class="row">
        -    <div class="col-md-9">
        -      <div class="box box-default">
        -
        -          @if ($supplier->id)
        -            <div class="box-header with-border">
        -              <div class="box-heading">
        -                <h3 class="box-title"> {{ trans('general.assets') }}
        -                </h3>
        -              </div>
        -            </div><!-- /.box-header -->
        -          @endif
        +<div class="row">
        +  <div class="col-md-9">
         
         
        -        <div class="box-body">
        -            <!-- checked out suppliers table -->
        -            <h6>Assets</h6>
        -            <br>
        -            <div class="table-responsive">
        -             <table class="display table table-hover">
        -                  <thead>
        -                      <tr role="row">
        -                              <th class="col-md-3">Asset Tag</th>
        -                              <th class="col-md-3"><span class="line"></span>Name</th>
        -                              <th class="col-md-3"><span class="line"></span>User</th>
        -                              <th class="col-md-2"><span class="line"></span>Actions</th>
        -                          </tr>
        -                      </thead>
        -                      <tbody>
         
        -                        @foreach ($supplier->assets as $supplierassets)
        -                        <tr>
        +    <!-- start tables -->
         
        -                            <td><a href="{{ route('view/hardware', $supplierassets->id) }}">{{ $supplierassets->asset_tag }}</a></td>
        -                            <td><a href="{{ route('view/hardware', $supplierassets->id) }}">{{ $supplierassets->showAssetName() }}</a></td>
        -                            <td>
        -                            @if ($supplierassets->assigneduser)
        -                            <a href="{{ route('view/user', $supplierassets->assigned_to) }}">
        -                            {{ $supplierassets->assigneduser->fullName() }}
        -                            </a>
        -                            @endif
        -                            </td>
        -                            <td>
        -                            @if ($supplierassets->assigned_to != '')
        -                                <a href="{{ route('checkin/hardware', $supplierassets->id) }}" class="btn btn-info btn-sm">Checkin</a>
        -                            @else
        -                                <a href="{{ route('checkout/hardware', $supplierassets->id) }}" class="btn btn-success btn-sm">Checkout</a>
        -                            @endif
        -                            </td>
        -
        -                        </tr>
        -                        @endforeach
        -                      </tbody>
        -                  </table>
        -                  </div>
        -            </div>
        -          </div>
        +    <div class="box box-default">
        +      @if ($supplier->id)
        +      <div class="box-header with-border">
        +        <div class="box-heading">
        +          <h3 class="box-title"> {{ trans('general.assets') }}
        +          </h3>
                 </div>
        -        <!-- side address column -->
        -        <div class="col-md-3">
        -          <h4>Contact:</h4>
        -             <ul class="list-unstyled">
        +      </div><!-- /.box-header -->
        +      @endif
         
        -              @if ($supplier->contact)
        -                  <li><i class="fa fa-user"></i>{{ $supplier->contact }}</li>
        -              @endif
        -              @if ($supplier->phone)
        -                  <li><i class="fa fa-phone"></i>{{ $supplier->phone }}</li>
        -              @endif
        -              @if ($supplier->fax)
        -                  <li><i class="fa fa-print"></i>{{ $supplier->fax }}</li>
        -              @endif
        -
        -
        -              @if ($supplier->email)
        -                  <li><i class="fa fa-envelope-o"></i><a href="mailto:{{ $supplier->email }}">
        -                  {{ $supplier->email }}
        -                  </a></li>
        -              @endif
        -
        -              @if ($supplier->url)
        -                  <li><i class="fa fa-globe"></i><a href="{{ $supplier->url }}" target="_new">{{ $supplier->url }}</a></li>
        -              @endif
        -
        -              @if ($supplier->address)
        -                  <li><br>
        -                  {{ $supplier->address }}
        -
        -                  @if ($supplier->address2)
        -                      <br>
        -                      {{ $supplier->address2 }}
        +      <div class="box-body">
        +        <!-- checked out suppliers table -->
        +        <br>
        +        <div class="table-responsive">
        +          <table class="display table table-hover">
        +            <thead>
        +              <tr role="row">
        +                <th class="col-md-3">Asset Tag</th>
        +                <th class="col-md-3"><span class="line"></span>Name</th>
        +                <th class="col-md-3"><span class="line"></span>User</th>
        +                <th class="col-md-2"><span class="line"></span>Actions</th>
        +              </tr>
        +            </thead>
        +            <tbody>
        +              @foreach ($supplier->assets as $supplierassets)
        +              <tr>
        +                <td>
        +                  <a href="{{ route('hardware.show',  $supplierassets->id) }}">
        +                    {{ $supplierassets->asset_tag }}
        +                  </a>
        +                </td>
        +                <td>
        +                  <a href="{{ route('hardware.show',  $supplierassets->id) }}">
        +                    {{ $supplierassets->name }}
        +                  </a>
        +                </td>
        +                <td>
        +                  @if ($supplierassets->assignedTo)
        +                  {!! $supplierassets->assignedTo->present()->nameUrl() !!}
                           @endif
        -                  @if (($supplier->city) || ($supplier->state))
        -                      <br>
        -                      {{ $supplier->city }} {{ strtoupper($supplier->state) }} {{ $supplier->zip }} {{ strtoupper($supplier->country) }}
        +                </td>
        +                <td>
        +                  @if ($supplierassets->assigned_to != '')
        +                  <a href="{{ route('checkin/hardware', $supplierassets->id) }}" class="btn btn-info btn-sm">Checkin</a>
        +                  @else
        +                  <a href="{{ route('checkout/hardware', $supplierassets->id) }}" class="btn btn-success btn-sm">Checkout</a>
                           @endif
        -                  </li>
        -              @endif
        -
        -              @if ($supplier->notes)
        -                  <li><i class="fa fa-comment"></i>{{ $supplier->notes }}</li>
        -              @endif
        -
        -              @if ($supplier->image)
        -              <li><br /><img src="{{ config('app.url') }}/uploads/suppliers/{{ $supplier->image }}" /></li>
        -              @endif
        -
        -              </ul>
        -
        +                </td>
        +              </tr>
        +              @endforeach
        +            </tbody>
        +          </table>
                 </div>
        +      </div> <!--/box-body-->
        +    </div>
        +  </div> <!--/col-md-9-->
        +
        +  <!-- side address column -->
        +  <div class="col-md-3">
        +    <h4>Contact:</h4>
        +    <ul class="list-unstyled">
        +      @if ($supplier->contact)
        +      <li><i class="fa fa-user"></i>{{ $supplier->contact }}</li>
        +      @endif
        +      @if ($supplier->phone)
        +      <li><i class="fa fa-phone"></i>{{ $supplier->phone }}</li>
        +      @endif
        +      @if ($supplier->fax)
        +      <li><i class="fa fa-print"></i>{{ $supplier->fax }}</li>
        +      @endif
        +
        +      @if ($supplier->email)
        +      <li>
        +        <i class="fa fa-envelope-o"></i>
        +        <a href="mailto:{{ $supplier->email }}">
        +        {{ $supplier->email }}
        +        </a>
        +      </li>
        +      @endif
        +
        +      @if ($supplier->url)
        +      <li>
        +        <i class="fa fa-globe"></i>
        +        <a href="{{ $supplier->url }}" target="_new">{{ $supplier->url }}</a>
        +      </li>
        +      @endif
        +
        +      @if ($supplier->address)
        +      <li><br>
        +        {{ $supplier->address }}
        +
        +        @if ($supplier->address2)
        +        <br>
        +        {{ $supplier->address2 }}
        +        @endif
        +        @if (($supplier->city) || ($supplier->state))
        +        <br>
        +        {{ $supplier->city }} {{ strtoupper($supplier->state) }} {{ $supplier->zip }} {{ strtoupper($supplier->country) }}
        +        @endif
        +      </li>
        +      @endif
        +
        +      @if ($supplier->notes)
        +      <li><i class="fa fa-comment"></i>{{ $supplier->notes }}</li>
        +      @endif
        +
        +      @if ($supplier->image)
        +      <li><br /><img src="{{ url('/') }}/uploads/suppliers/{{ $supplier->image }}" /></li>
        +      @endif
        +    </ul>
        +  </div> <!--/col-md-3-->
        +</div> <!--/row-->
        +
        +<div class="row">
        +  <div class="col-md-9">
        +    <div class="box box-default">
        +
        +      @if ($supplier->id)
        +      <div class="box-header with-border">
        +        <div class="box-heading">
        +          <h3 class="box-title">Software</h3>
        +        </div>
        +      </div><!-- /.box-header -->
        +      @endif
        +
        +      <div class="box-body">
        +        <table class="table table-hover">
        +          <thead>
        +            <tr>
        +              <th class="col-md-4">Name</th>
        +              <th class="col-md-4"><span class="line"></span>Serial</th>
        +            </tr>
        +          </thead>
        +          <tbody>
        +            @foreach ($supplier->licenses as $license)
        +            <tr>
        +              <td>{!! $license->present()->nameUrl() !!}</td>
        +              <td>{!! $license->present()->serialUrl() !!}</td>
        +            </tr>
        +            @endforeach
        +          </tbody>
        +        </table>
               </div>
        -      <div class="row">
        -        <div class="col-md-9">
        -          <div class="box box-default">
        -
        -              @if ($supplier->id)
        -                <div class="box-header with-border">
        -                  <div class="box-heading">
        -                    <h3 class="box-title">Software</h3>
        -                  </div>
        -                </div><!-- /.box-header -->
        -              @endif
        -
        -
        -            <div class="box-body">
        -
        -              <table class="table table-hover">
        -                  <thead>
        -                      <tr>
        -                          <th class="col-md-4">Name</th>
        -                          <th class="col-md-4"><span class="line"></span>Serial</th>
        -                      </tr>
        -                  </thead>
        -                  <tbody>
        -                      @foreach ($supplier->licenses as $license)
        -                      <tr>
        -                          <td><a href="{{ route('view/license', $license->id) }}">{{ $license->name }}</a></td>
        -                          <td><a href="{{ route('view/license', $license->id) }}">{{ $license->serial }}</a></td>
        -                          </td>
        -                      </tr>
        -                      @endforeach
        -                  </tbody>
        -              </table>
        -
        +    </div>
           </div>
        -            </div>
        +</div>
        +
        +<div class="row">
        +  <div class="col-md-9">
        +    <div class="box box-default">
        +
        +      @if ($supplier->id)
        +      <div class="box-header with-border">
        +        <div class="box-heading">
        +          <h3 class="box-title"> Improvements</h3>
                 </div>
        -      </div>
        +      </div><!-- /.box-header -->
        +      @endif
         
        -      <div class="row">
        -        <div class="col-md-9">
        -          <div class="box box-default">
        -
        -              @if ($supplier->id)
        -                <div class="box-header with-border">
        -                  <div class="box-heading">
        -                    <h3 class="box-title"> Improvements</h3>
        -                  </div>
        -                </div><!-- /.box-header -->
        -              @endif
        -
        -
        -            <div class="box-body">
        -              <table class="table table-hover">
        -                  <thead>
        -                  <tr>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/table.asset_name') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/table.is_warranty') }}</th>
        -                      <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.cost') }}</th>
        -                      <th class="col-md-1"><span class="line"></span>{{ trans('table.actions') }}</th>
        -                  </tr>
        -                  </thead>
        -                  <tbody>
        -                  <?php $totalCost = 0; ?>
        -                  @if ($supplier->asset_maintenances)
        -                  @foreach ($supplier->asset_maintenances as $improvement)
        -                      @if (is_null($improvement->deleted_at))
        -                          <tr>
        -                              <td><a href="{{ route('view/hardware', $improvement->asset_id) }}">{{ $improvement->asset->name }}</a></td>
        -                              <td>{{ $improvement->improvement_type }}</td>
        -                              <td>{{ $improvement->start_date }}</td>
        -                              <td>{{ $improvement->completion_date }}</td>
        -                              <td>{{ $improvement->is_warranty ? trans('admin/asset_maintenances/message.warranty') : trans('admin/asset_maintenances/message.not_warranty') }}</td>
        -                              <td>{{ sprintf( trans( 'general.currency' ) . '%01.2f', $improvement->cost) }}</td>
        -                                <?php $totalCost += $improvement->cost; ?>
        -                              <td><a href="{{ route('update/asset_maintenance', $improvement->id) }}" class="btn btn-warning"><i class="fa fa-pencil icon-white"></i></a>
        -                              </td>
        -                          </tr>
        -                      @endif
        -                  @endforeach
        +      <div class="box-body">
        +        <table class="table table-hover">
        +          <thead>
        +            <tr>
        +              <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/table.asset_name') }}</th>
        +              <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}</th>
        +              <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.start_date') }}</th>
        +              <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.completion_date') }}</th>
        +              <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/table.is_warranty') }}</th>
        +              <th class="col-md-2"><span class="line"></span>{{ trans('admin/asset_maintenances/form.cost') }}</th>
        +              <th class="col-md-1"><span class="line"></span>{{ trans('table.actions') }}</th>
        +            </tr>
        +          </thead>
        +          <tbody>
        +            <?php $totalCost = 0; ?>
        +            @if ($supplier->asset_maintenances)
        +              @foreach ($supplier->asset_maintenances as $improvement)
        +                @if (is_null($improvement->deleted_at))
        +                <tr>
        +                  <td><a href="{{ route('hardware.show', $improvement->asset_id) }}">{{ $improvement->asset->name }}</a></td>
        +                  <td>{{ $improvement->improvement_type }}</td>
        +                  <td>{{ $improvement->start_date }}</td>
        +                  <td>{{ $improvement->completion_date }}</td>
        +                  <td>{{ $improvement->is_warranty ? trans('admin/asset_maintenances/message.warranty') : trans('admin/asset_maintenances/message.not_warranty') }}</td>
        +                  <td>{{ sprintf( trans( 'general.currency' ) . '%01.2f', $improvement->cost) }}</td>
        +                    <?php $totalCost += $improvement->cost; ?>
        +                  <td><a href="{{ route('maintenances.edit', $improvement->id) }}" class="btn btn-warning"><i class="fa fa-pencil icon-white"></i></a>
        +                  </td>
        +                </tr>
                         @endif
        -                  </tbody>
        -                  <tfoot>
        -                  <tr>
        -                      <td></td>
        -                      <td></td>
        -                      <td></td>
        -                      <td></td>
        -                      <td></td>
        -                      <td>{{sprintf(trans( 'general.currency' ) . '%01.2f', $totalCost)}}</td>
        -                  </tr>
        -                  </tfoot>
        -              </table>
        -            </div>
        -        </div>
        +              @endforeach
        +            @endif
        +          </tbody>
        +
        +          <tfoot>
        +            <tr>
        +              <td></td>
        +              <td></td>
        +              <td></td>
        +              <td></td>
        +              <td></td>
        +              <td>{{sprintf(trans( 'general.currency' ) . '%01.2f', $totalCost)}}</td>
        +            </tr>
        +          </tfoot>
        +        </table>
               </div>
         
        +    </div>
        +  </div>
        +</div> <!-- /.row-->
         
         @stop
        diff --git a/resources/views/users/bulk-edit.blade.php b/resources/views/users/bulk-edit.blade.php
        new file mode 100644
        index 0000000000..1ce30c2e19
        --- /dev/null
        +++ b/resources/views/users/bulk-edit.blade.php
        @@ -0,0 +1,132 @@
        +@extends('layouts/default')
        +
        +{{-- Page title --}}
        +@section('title')
        +    Bulk Edit
        +    @parent
        +@stop
        +
        +
        +@section('header_right')
        +    <a href="{{ URL::previous() }}" class="btn btn-sm btn-primary pull-right">
        +        {{ trans('general.back') }}</a>
        +@stop
        +
        +{{-- Page content --}}
        +@section('content')
        +    <div class="row">
        +        <div class="col-md-8 col-md-offset-2">
        +
        +            <p>{{ trans('admin/users/general.bulk_update_help') }}</p>
        +
        +            <div class="callout callout-warning">
        +                <i class="fa fa-warning"></i> {{ trans('admin/users/general.bulk_update_warn', ['user_count' => count($users)]) }}
        +            </div>
        +
        +            <form class="form-horizontal" method="post" action="{{ route('users/bulkeditsave') }}" autocomplete="off" role="form">
        +                {{ csrf_field() }}
        +
        +                <div class="box box-default">
        +                    <div class="box-body">
        +
        +
        +                        <!--  Location -->
        +                        <div class="form-group {{ $errors->has('location_id') ? ' has-error' : '' }}">
        +                            <label for="status_id" class="col-md-3 control-label">
        +                                {{ trans('admin/users/table.location') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('location_id', $location_list , Input::old('rtd_location_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!--  Department -->
        +                        <div class="form-group {{ $errors->has('department_id') ? ' has-error' : '' }}">
        +                            <label for="status_id" class="col-md-3 control-label">
        +                                {{ trans('general.department') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('department_id', $department_list , Input::old('department_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('department_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +
        +                        <!-- Company -->
        +                        <div class="form-group {{ $errors->has('company_id') ? ' has-error' : '' }}">
        +                            <label for="company_id" class="col-md-3 control-label">
        +                                {{ trans('general.company') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('company_id', $company_list , Input::old('company_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('company_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- manager -->
        +                        <div class="form-group {{ $errors->has('manager_id') ? ' has-error' : '' }}">
        +                            <label for="manager_id" class="col-md-3 control-label">
        +                                {{ trans('admin/users/table.manager') }}
        +                            </label>
        +                            <div class="col-md-7">
        +                                {{ Form::select('manager_id', $manager_list , Input::old('manager_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                                {!! $errors->first('manager_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                            </div>
        +                        </div>
        +
        +                        <!-- activated -->
        +                        <div class="form-group">
        +                            <div class="col-sm-3 control-label">
        +                                Activated
        +                            </div>
        +                            <div class="col-sm-9">
        +                                <div class="checkbox">
        +                                    <label for="activated">
        +                                        {{ Form::radio('activated', '', true) }} Do not change activation status <br>
        +                                        {{ Form::radio('activated', '1', Input::old('activated')) }}  User is activated<br>
        +                                        {{ Form::radio('activated', '0', Input::old('activated')) }}  User is de-activated
        +
        +                                    </label>
        +                                </div>
        +                            </div>
        +                        </div> <!--/form-group-->
        +
        +
        +                        <!--  Groups -->
        +                        <div class="form-group{{ $errors->has('groups') ? ' has-error' : '' }}">
        +                            <label class="col-md-3 control-label" for="groups"> {{ trans('general.groups') }}</label>
        +                            <div class="col-md-6">
        +                                @if ((Config::get('app.lock_passwords') || (!Auth::user()->isSuperUser())))
        +
        +                                    <span class="help-block">Only superadmins may edit group memberships.</p>
        +                                @else
        +                                    <div class="controls">
        +                                        <select name="groups[]" id="groups[]" multiple="multiple" class="form-control">
        +                                  @foreach ($groups as $id => $group)
        +                                        <option value="{{ $id }}">{{ $group }} </option>
        +                                    @endforeach
        +                        </select>
        +
        +                        <span class="help-block">
        +                          {{ trans('admin/users/table.groupnotes') }}
        +                        </span>
        +                      </div> <!--/controls-->
        +                        @endif
        +                    </div> <!--/col-md-5-->
        +                        </div>
        +
        +
        +                        @foreach ($users as $user)
        +                            <input type="hidden" name="ids[{{ $user->id }}]" value="{{ $user->id }}">
        +                        @endforeach
        +                    </div> <!--/.box-body-->
        +
        +                    <div class="box-footer text-right">
        +                        <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +                    </div>
        +                </div> <!--/.box.box-default-->
        +            </form>
        +        </div> <!--/.col-md-8-->
        +    </div>
        +@stop
        diff --git a/resources/views/users/confirm-bulk-delete.blade.php b/resources/views/users/confirm-bulk-delete.blade.php
        index 05198ebc83..b0d05f066a 100644
        --- a/resources/views/users/confirm-bulk-delete.blade.php
        +++ b/resources/views/users/confirm-bulk-delete.blade.php
        @@ -2,120 +2,109 @@
         
         {{-- Page title --}}
         @section('title')
        -Bulk Checkin &amp; Delete
        +Bulk Checkin &amp;amp; Delete
         @parent
         @stop
         
         {{-- Page content --}}
         @section('content')
         
        +<div class="row">
        +  <div class="col-md-8 col-md-offset-2">
        +    <div class="box box-default">
        +      <form class="form-horizontal" role="form" method="post" action="{{ route('users/bulksave') }}">
        +        <div class="box-body">
        +          <!-- CSRF Token -->
        +          {{csrf_field()}}
        +          <div class="col-md-12">
        +            <div class="callout callout-danger">
        +              <i class="fa fa-exclamation-circle"></i>
        +              <strong>WARNING: </strong>
        +              You are about to delete the {{ count($users) }} user(s) listed below. Super admin names are highlighted in red.
        +            </div>
        +          </div>
         
        -    <div class="row">
        -      <div class="col-md-8 col-md-offset-2">
        -            <div class="box box-default">
        -                 <div class="box-body">
        -
        -                <form class="form-horizontal" role="form" method="post" action="{{ route('users/bulksave') }}">
        -                <!-- CSRF Token -->
        -                <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -
        +          @if (config('app.lock_passwords'))
                     <div class="col-md-12">
        -                <div class="callout callout-danger">
        -                    <i class="fa fa-exclamation-circle"></i>
        -                    <strong>WARNING: </strong>
        -                    You are about to delete the {{ count($users) }} user(s) listed below. Super admin names are highlighted in red.
        -                </div>
        -            </div>
        -
        -            @if (config('app.lock_passwords'))
        -                <div class="col-md-12">
        -                <div class="callout callout-warning">
        -                    <p>{{ trans('feature_disabled') }}</p>
        -                </div>
        -                </div>
        -            @endif
        -
        -
        -                  <div class="col-md-12">
        -                  <div class="table-responsive">
        -                      <table class="display table table-hover">
        -                          <thead>
        -                              <tr>
        -                                  <th class="col-md-1"></th>
        -                                  <th class="col-md-6">Name</th>
        -                                  <th class="col-md-5">Groups</th>
        -                                  <th class="col-md-5">Assets</th>
        -                                  <th class="col-md-5">Accessories</th>
        -                                  <th class="col-md-5">Licenses</th>
        -                              </tr>
        -                          </thead>
        -                          <tfoot>
        -                              <tr>
        -                                  <td colspan="6" class="warning">
        -                                      {{ Form::select('status_id', $statuslabel_list , Input::old('status_id'), array('class'=>'select2', 'style'=>'width:250px')) }}
        -                                      <label>Update all assets for these users to this status</label>
        -                              </td>
        -                              </tr>
        -                              <tr>
        -                                  <td colspan="6" class="warning">
        -                                      <label><input type="checkbox" name="edit_user['.e($user->id).']" checked> Check in all properties associated with these users</label>
        -                                  </td>
        -                              </tr>
        -                          </tfoot>
        -                          <tbody>
        -                              @foreach ($users as $user)
        -                                  <tr {!! ($user->isSuperUser() ? ' class="danger"':'') !!}>
        -                                      <td>
        -                                          @if (Auth::user()->id!=$user->id)
        -                                              <input type="checkbox" name="edit_user[]" value="{{ $user->id }}" checked="checked">
        -                                          @else
        -                                              <input type="checkbox" name="edit_user[]" value="{{ $user->id }}" disabled>
        -                                          @endif
        -                                      </td>
        -
        -                                      <td>
        -                                          <span{{ (Auth::user()->id==$user->id ? ' style="text-decoration: line-through"' : '') }}>{{ $user->fullName() }} ({{ $user->username }})</span>
        -
        -                                          {{ (Auth::user()->id==$user->id ? ' (cannot delete yourself)' : '') }}
        -
        -                                      </td>
        -                                      <td>
        -                                          @foreach ($user->groups as $group)
        -                                              <a href=" {{ config('app.url')  }}/admin/groups/{{ $group->id }}'/edit" class="label  label-default">
        -                                              {{ $group->name  }}
        -                                              </a>
        -                                          @endforeach
        -                                      </td>
        -
        -                                      <td>
        -                                         {{ number_format($user->assets->count())  }}
        -                                      </td>
        -                                      <td>
        -                                          {{ number_format($user->accessories->count())  }}
        -                                      </td>
        -                                      <td>
        -                                          {{ number_format($user->licenses->count())  }}
        -                                      </td>
        -
        -                                  </tr>
        -                              @endforeach
        -                          </tbody>
        -                      </table>
        -                  </div>
        -                  </div>
        +              <div class="callout callout-warning">
        +                <p>{{ trans('feature_disabled') }}</p>
                       </div>
        -              <div class="box-footer text-right">
        -                <a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
        -                <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('button.submit') }}</button>
        -              </div><!-- /.box-footer -->
                     </div>
        +          @endif
         
        +          <div class="col-md-12">
        +            <div class="table-responsive">
        +              <table class="display table table-hover">
        +                <thead>
        +                  <tr>
        +                    <th class="col-md-1"></th>
        +                    <th class="col-md-6">Name</th>
        +                    <th class="col-md-5">Groups</th>
        +                    <th class="col-md-5">Assets</th>
        +                    <th class="col-md-5">Accessories</th>
        +                    <th class="col-md-5">Licenses</th>
        +                  </tr>
        +                </thead>
        +                <tbody>
        +                  @foreach ($users as $user)
        +                  <tr {!! ($user->isSuperUser() ? ' class="danger"':'') !!}>
        +                    <td>
        +                      @if (Auth::id()!=$user->id)
        +                      <input type="checkbox" name="ids[]" value="{{ $user->id }}" checked="checked">
        +                      @else
        +                      <input type="checkbox" name="ids[]" value="{{ $user->id }}" disabled>
        +                      @endif
        +                    </td>
         
        -
        +                    <td>
        +                      <span {{ (Auth::user()->id==$user->id ? ' style="text-decoration: line-through"' : '') }}>
        +                        {{ $user->present()->fullName() }} ({{ $user->username }})
        +                      </span>
        +                      {{ (Auth::id()==$user->id ? ' (cannot delete yourself)' : '') }}
        +                    </td>
        +                    <td>
        +                      @foreach ($user->groups as $group)
        +                      <a href=" {{ route('groups.update', $group->id) }}" class="label  label-default">
        +                        {{ $group->name  }}
        +                      </a>&nbsp;
        +                      @endforeach
        +                    </td>
        +                    <td>
        +                      {{ number_format($user->assets()->count())  }}
        +                    </td>
        +                    <td>
        +                      {{ number_format($user->accessories()->count())  }}
        +                    </td>
        +                    <td>
        +                      {{ number_format($user->licenses()->count())  }}
        +                    </td>
        +                  </tr>
        +                  @endforeach
        +                </tbody>
        +                <tfoot>
        +                  <tr>
        +                    <td colspan="6" class="warning">
        +                      {{ Form::select('status_id', $statuslabel_list , Input::old('status_id'), array('class'=>'select2', 'style'=>'width:250px')) }}
        +                      <label>Update all assets for these users to this status</label>
        +                    </td>
        +                  </tr>
        +                  <tr>
        +                    <td colspan="6" class="warning">
        +                      <label><input type="checkbox" name="ids['.e($user->id).']" checked> Check in all properties associated with these users</label>
        +                    </td>
        +                  </tr>
        +                </tfoot>
        +              </table>
        +            </div> <!--/table-responsive-->
        +          </div><!--/col-md-12-->
        +        </div> <!--/box-body-->
        +        <div class="box-footer text-right">
        +          <a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
        +          <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('button.submit') }}</button>
        +        </div><!-- /.box-footer -->
        +      </form>
             </div>
        -
        -
        -</form>
        +  </div>
        +</div>
         
         @stop
        diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php
        index 0b7e1a09da..53e504122f 100755
        --- a/resources/views/users/edit.blade.php
        +++ b/resources/views/users/edit.blade.php
        @@ -4,7 +4,7 @@
         @section('title')
         	@if ($user->id)
         		{{ trans('admin/users/table.updateuser') }}
        -		{{ $user->fullName() }}
        +		{{ $user->present()->fullName() }}
         	@else
         		{{ trans('admin/users/table.createuser') }}
         	@endif
        @@ -61,7 +61,7 @@
             table, tbody {
               border: 1px solid #ccc;
             }
        -    
        +
             .header-name {
               cursor: pointer;
             }
        @@ -69,319 +69,326 @@
         </style>
         
         <div class="row">
        -<div class="col-md-8 col-md-offset-2">
        +  <div class="col-md-8 col-md-offset-2">
        +    <form class="form-horizontal" method="post" autocomplete="off" action="{{ ($user) ? route('users.update', ['user' => $user->id]) : route('users.store') }}" id="userForm">
        +      {{csrf_field()}}
         
        +      @if($user->id)
        +          {{ method_field('PUT') }}
        +      @endif
        +        <!-- Custom Tabs -->
        +      <div class="nav-tabs-custom">
        +        <ul class="nav nav-tabs">
        +          <li class="active"><a href="#tab_1" data-toggle="tab">Information</a></li>
        +          <li><a href="#tab_2" data-toggle="tab">Permissions</a></li>
        +        </ul>
         
        -<form class="form-horizontal" method="post" autocomplete="off" id="userForm">
        -<!-- CSRF Token -->
        -<input type="hidden" name="_token" value="{{ csrf_token() }}">
        +        <div class="tab-content">
        +          <div class="tab-pane active" id="tab_1">
        +            <div class="row">
        +              <div class="col-md-12">
        +                <!-- First Name -->
        +                <div class="form-group {{ $errors->has('first_name') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="first_name">{{ trans('general.first_name') }}</label>
        +                  <div class="col-md-8 {{  (\App\Helpers\Helper::checkIfRequired($user, 'first_name')) ? ' required' : '' }}">
        +                    <input class="form-control" type="text" name="first_name" id="first_name" value="{{ Input::old('first_name', $user->first_name) }}" />
        +                    {!! $errors->first('first_name', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
         
        -  <!-- Custom Tabs -->
        -<div class="nav-tabs-custom">
        -  <ul class="nav nav-tabs">
        -    <li class="active"><a href="#tab_1" data-toggle="tab">Information</a></li>
        -    <li><a href="#tab_2" data-toggle="tab">Permissions</a></li>
        -  </ul>
        +                <!-- Last Name -->
        +                <div class="form-group {{ $errors->has('last_name') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="last_name">{{ trans('general.last_name') }} </label>
        +                  <div class="col-md-8{{  (\App\Helpers\Helper::checkIfRequired($user, 'last_name')) ? ' required' : '' }}">
        +                    <input class="form-control" type="text" name="last_name" id="last_name" value="{{ Input::old('last_name', $user->last_name) }}" />
        +                    {!! $errors->first('last_name', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
         
        -  <div class="tab-content">
        -    <div class="tab-pane active" id="tab_1">
        -      <div class="row">
        -        <div class="col-md-12">
        +                <!-- Username -->
        +                <div class="form-group {{ $errors->has('username') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="username">{{ trans('admin/users/table.username') }}</label>
        +                  <div class="col-md-8{{  (\App\Helpers\Helper::checkIfRequired($user, 'username')) ? ' required' : '' }}">
        +                    @if ($user->ldap_import!='1')
        +                      <input
        +                        class="form-control"
        +                        type="text"
        +                        name="username"
        +                        id="username"
        +                        value="{{ Input::old('username', $user->username) }}"
        +                        autocomplete="off"
        +                        readonly
        +                        onfocus="this.removeAttribute('readonly');"
        +                        {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        +                      >
        +                      @if (config('app.lock_passwords') && ($user->id))
        +                        <p class="help-block">{{ trans('admin/users/table.lock_passwords') }}</p>
        +                      @endif
        +                    @else
        +                      (Managed via LDAP)
        +                          <input type="hidden" name="username" value="{{ Input::old('username', $user->username) }}">
         
        -          <!-- First Name -->
        -          <div class="form-group {{ $errors->has('first_name') ? 'has-error' : '' }}">
        -              <label class="col-md-3 control-label" for="first_name">{{ trans('general.first_name') }}</label>
        -              <div class="col-md-8{{  (\App\Helpers\Helper::checkIfRequired($user, 'first_name')) ? ' required' : '' }}">
        -                <input class="form-control" type="text" name="first_name" id="first_name" value="{{ Input::old('first_name', $user->first_name) }}" />
        -                {!! $errors->first('first_name', '<span class="alert-msg">:message</span>') !!}
        -              </div>
        -          </div>
        +                    @endif
         
        -          <!-- Last Name -->
        -          <div class="form-group {{ $errors->has('last_name') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="last_name">{{ trans('general.last_name') }} </label>
        -            <div class="col-md-8{{  (\App\Helpers\Helper::checkIfRequired($user, 'last_name')) ? ' required' : '' }}">
        -              <input class="form-control" type="text" name="last_name" id="last_name" value="{{ Input::old('last_name', $user->last_name) }}" />
        -              {!! $errors->first('last_name', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        +                    {!! $errors->first('username', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
         
        -          <!-- Username -->
        -          <div class="form-group {{ $errors->has('username') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="username">{{ trans('admin/users/table.username') }}</label>
        -            <div class="col-md-8{{  (\App\Helpers\Helper::checkIfRequired($user, 'username')) ? ' required' : '' }}">
        -              @if ($user->ldap_import!='1')
        -                <input
        -                  class="form-control"
        -                  type="text"
        -                  name="username"
        -                  id="username"
        -                  value="{{ Input::old('username', $user->username) }}"
        -                  autocomplete="off"
        -                  readonly
        -                  onfocus="this.removeAttribute('readonly');"
        -                  {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        -                >
        -                @if (config('app.lock_passwords') && ($user->id))
        -                  <p class="help-block">{{ trans('admin/users/table.lock_passwords') }}</p>
        -                @endif
        -              @else
        -                (Managed via LDAP)
        -              @endif
        +                <!-- Password -->
        +                <div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="password">
        +                    {{ trans('admin/users/table.password') }}
        +                  </label>
        +                  <div class="col-md-5{{  (\App\Helpers\Helper::checkIfRequired($user, 'password')) ? ' required' : '' }}">
        +                    @if ($user->ldap_import!='1')
        +                      <input
        +                        type="password"
        +                        name="password"
        +                        class="form-control"
        +                        id="password"
        +                        value=""
        +                        autocomplete="off"
        +                        readonly
        +                        onfocus="this.removeAttribute('readonly');"
        +                        {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        +                      >
        +                    @else
        +                      (Managed via LDAP)
        +                    @endif
        +                    <span id="generated-password"></span>
        +                    {!! $errors->first('password', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                  <div class="col-md-4">
        +                    @if ($user->ldap_import!='1')
        +                      <a href="#" class="left" id="genPassword">Generate</a>
        +                    @endif
        +                  </div>
        +                </div>
         
        -              {!! $errors->first('username', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -          <!-- Password -->
        -          <div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="password">
        -              {{ trans('admin/users/table.password') }}
        -            </label>
        -            <div class="col-md-5{{  (\App\Helpers\Helper::checkIfRequired($user, 'password')) ? ' required' : '' }}">
        -              @if ($user->ldap_import!='1')
        -                <input
        -                  type="password"
        -                  name="password"
        -                  class="form-control"
        -                  id="password"
        -                  value=""
        -                  autocomplete="off"
        -                  readonly
        -                  onfocus="this.removeAttribute('readonly');"
        -                  {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        -                >
        -              @else
        -                (Managed via LDAP)
        -              @endif
        -              <span id="generated-password"></span>
        -              {!! $errors->first('password', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -            <div class="col-md-4">
        -              @if ($user->ldap_import!='1')
        -                <a href="#" class="left" id="genPassword">Generate</a>
        -              @endif
        -            </div>
        -          </div>
        -
        -          @if ($user->ldap_import!='1')
        -          <!-- Password Confirm -->
        -          <div class="form-group {{ $errors->has('password_confirm') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="password_confirm">
        -              {{ trans('admin/users/table.password_confirm') }}
        -            </label>
        -            <div class="col-md-5 {{  ((\App\Helpers\Helper::checkIfRequired($user, 'first_name')) && (!$user->id)) ? ' required' : '' }}">
        -              <input
        -              type="password"
        -              name="password_confirm"
        -              id="password_confirm"
        -              class="form-control"
        -              value=""
        -              autocomplete="off"
        -              {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        -              >
        -              @if (config('app.lock_passwords') && ($user->id))
        -              <p class="help-block">{{ trans('admin/users/table.lock_passwords') }}</p>
        -              @endif
        -              {!! $errors->first('password_confirm', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -          @endif
        -
        -          <!-- Email -->
        -          <div class="form-group {{ $errors->has('email') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="email">{{ trans('admin/users/table.email') }} </label>
        -            <div class="col-md-8{{  (\App\Helpers\Helper::checkIfRequired($user, 'email')) ? ' required' : '' }}">
        -              <input
        -                class="form-control"
        -                type="text"
        -                name="email"
        -                id="email"
        -                value="{{ Input::old('email', $user->email) }}"
        -                {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        -                autocomplete="off"
        -                readonly
        -                onfocus="this.removeAttribute('readonly');"
        -              >
        -              @if (config('app.lock_passwords') && ($user->id))
        -              <p class="help-block">{{ trans('admin/users/table.lock_passwords') }}</p>
        -              @endif
        -              {!! $errors->first('email', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -          <!-- Company -->
        -          @if (\App\Models\Company::canManageUsersCompanies())
        -          <!-- Company -->
        -          <div class="form-group {{ $errors->has('company_id') ? 'has-error' : '' }}">
        -            <div class="col-md-3 control-label">
        -              {{ Form::label('company_id', trans('general.company')) }}
        -            </div>
        -            <div class="col-md-8">
        -              {{ Form::select('company_id', $company_list , Input::old('company_id', $user->company_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        -              {!! $errors->first('company_id', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -          @endif
        -
        -          <!-- language -->
        -          <div class="form-group {{ $errors->has('locale') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="locale">{{ trans('general.language') }}</label>
        -            <div class="col-md-8">
        -              {!! Form::locales('locale', Input::old('locale', $user->locale), 'select2') !!}
        -              {!! $errors->first('locale', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -          <!-- Employee Number -->
        -          <div class="form-group {{ $errors->has('employee_num') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="employee_num">{{ trans('admin/users/table.employee_num') }}</label>
        -            <div class="col-md-8">
        -              <input
        -                class="form-control"
        -                type="text"
        -                name="employee_num"
        -                id="employee_num"
        -                value="{{ Input::old('employee_num', $user->employee_num) }}"
        -              />
        -              {!! $errors->first('employee_num', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -
        -          <!-- Jobtitle -->
        -          <div class="form-group {{ $errors->has('jobtitle') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="jobtitle">{{ trans('admin/users/table.title') }}</label>
        -            <div class="col-md-8">
        -              <input
        -                class="form-control"
        -                type="text"
        -                name="jobtitle"
        -                id="jobtitle"
        -                value="{{ Input::old('jobtitle', $user->jobtitle) }}"
        -              />
        -              {!! $errors->first('jobtitle', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -
        -          <!-- Manager -->
        -          <div class="form-group {{ $errors->has('manager_id') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="manager_id">{{ trans('admin/users/table.manager') }}</label>
        -            <div class="col-md-8">
        -              {{ Form::select('manager_id', $manager_list , Input::old('manager_id', $user->manager_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        -              {!! $errors->first('manager_id', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -          <!-- Location -->
        -          <div class="form-group {{ $errors->has('location_id') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="location_id">{{ trans('admin/users/table.location') }}
        -            </label>
        -            <div class="col-md-8">
        -              {{ Form::select('location_id', $location_list , Input::old('location_id', $user->location_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        -              {!! $errors->first('location_id', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -          <!-- Phone -->
        -          <div class="form-group {{ $errors->has('phone') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="phone">{{ trans('admin/users/table.phone') }}</label>
        -            <div class="col-md-4">
        -              <input class="form-control" type="text" name="phone" id="phone" value="{{ Input::old('phone', $user->phone) }}" />
        -              {!! $errors->first('phone', '<span class="alert-msg">:message</span>') !!}
        -            </div>
        -          </div>
        -
        -          <!-- Activation Status -->
        -          <div class="form-group {{ $errors->has('activated') ? 'has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="activated">{{ trans('admin/users/table.activated') }}</label>
        -            <div class="col-md-8">
        -              <div class="controls">
        -                <select
        -                  {{ ($user->id === Auth::user()->id ? ' disabled="disabled"' : '') }}
        -                  name="activated"
        -                  id="activated"
        -                  {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        -                >
        -                @if ($user->id)
        -                <option value="1"{{ ($user->isActivated() ? ' selected="selected"' : '') }}>{{ trans('general.yes') }}</option>
        -                <option value="0"{{ ( ! $user->isActivated() ? ' selected="selected"' : '') }}>{{ trans('general.no') }}</option>
        -                @else
        -                <option value="1"{{ (Input::old('activated') == 1 ? ' selected="selected"' : '') }}>{{ trans('general.yes') }}</option>
        -                <option value="0">{{ trans('general.no') }}</option>
        -                @endif
        -
        -                </select>
        -                {!! $errors->first('activated', '<span class="alert-msg">:message</span>') !!}
        -              </div>
        -            </div>
        -          </div>
        -
        -            @if ($snipeSettings->two_factor_enabled!='')
        -
        -                @if ($snipeSettings->two_factor_enabled=='1')
        -                <div class="form-group">
        -                    <div class="col-md-3 control-label">
        -                        {{ Form::label('two_factor_optin', trans('admin/settings/general.two_factor')) }}
        -                    </div>
        -                    <div class="col-md-9">
        -                        {{ Form::checkbox('two_factor_optin', '1', Input::old('two_factor_optin', $user->two_factor_optin),array('class' => 'minimal')) }}
        -                        {{ trans('admin/settings/general.two_factor_enabled_text') }}
        -
        -                        <p class="help-block">{{ trans('admin/users/general.two_factor_admin_optin_help') }}</p>
        -                    </div>
        +                @if ($user->ldap_import!='1')
        +                <!-- Password Confirm -->
        +                <div class="form-group {{ $errors->has('password_confirm') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="password_confirm">
        +                    {{ trans('admin/users/table.password_confirm') }}
        +                  </label>
        +                  <div class="col-md-5 {{  ((\App\Helpers\Helper::checkIfRequired($user, 'first_name')) && (!$user->id)) ? ' required' : '' }}">
        +                    <input
        +                    type="password"
        +                    name="password_confirm"
        +                    id="password_confirm"
        +                    class="form-control"
        +                    value=""
        +                    autocomplete="off"
        +                    {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        +                    >
        +                    @if (config('app.lock_passwords') && ($user->id))
        +                    <p class="help-block">{{ trans('admin/users/table.lock_passwords') }}</p>
        +                    @endif
        +                    {!! $errors->first('password_confirm', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
                         </div>
                         @endif
         
        -
        -
        -                <!-- Reset Two Factor -->
        -                    <div class="form-group">
        -                        <div class="col-md-8 col-md-offset-3 two_factor_resetrow">
        -                            <a class="btn btn-default btn-sm pull-left" id="two_factor_reset" style="margin-right: 10px;"> {{ trans('admin/settings/general.two_factor_reset') }}</a>
        -                                <span id="two_factor_reseticon">
        -                              </span>
        -                                <span id="two_factor_resetresult">
        -                              </span>
        -                                <span id="two_factor_resetstatus">
        -                              </span>
        -
        -                        </div>
        -                        <div class="col-md-8 col-md-offset-3 two_factor_resetrow">
        -                            <p class="help-block">{{ trans('admin/settings/general.two_factor_reset_help') }}</p>
        -                        </div>
        -                    </div>
        -
        -            @endif
        -
        -          <!-- Notes -->
        -          <div class="form-group{!! $errors->has('notes') ? ' has-error' : '' !!}">
        -            <label for="notes" class="col-md-3 control-label">{{ trans('admin/users/table.notes') }}</label>
        -            <div class="col-md-8">
        -              <textarea class="form-control" id="notes" name="notes">{{ Input::old('notes', $user->notes) }}</textarea>
        -              {!! $errors->first('notes', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        -            </div>
        -          </div>
        -
        -          <!-- Groups -->
        -          <div class="form-group{{ $errors->has('groups') ? ' has-error' : '' }}">
        -            <label class="col-md-3 control-label" for="groups"> {{ trans('general.groups') }}</label>
        -            <div class="col-md-5">
        -
        -                @if ((Config::get('app.lock_passwords') || (!Auth::user()->isSuperUser())))
        -
        -                    @if (count($userGroups->keys()) > 0)
        -                        <ul>
        -                        @foreach ($groups as $id => $group)
        -                            {!! ($userGroups->keys()->contains($id) ? '<li>'.e($group).'</li>' : '') !!}
        -                        @endforeach
        -                        </ul>
        +                <!-- Email -->
        +                <div class="form-group {{ $errors->has('email') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="email">{{ trans('admin/users/table.email') }} </label>
        +                  <div class="col-md-8{{  (\App\Helpers\Helper::checkIfRequired($user, 'email')) ? ' required' : '' }}">
        +                    <input
        +                      class="form-control"
        +                      type="text"
        +                      name="email"
        +                      id="email"
        +                      value="{{ Input::old('email', $user->email) }}"
        +                      {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        +                      autocomplete="off"
        +                      readonly
        +                      onfocus="this.removeAttribute('readonly');"
        +                    >
        +                    @if (config('app.lock_passwords') && ($user->id))
        +                    <p class="help-block">{{ trans('admin/users/table.lock_passwords') }}</p>
                             @endif
        +                    {!! $errors->first('email', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
         
        -                    <span class="help-block">Only superadmins may edit group memberships.</p>
        -                @else
        +                <!-- Company -->
        +                @if (\App\Models\Company::canManageUsersCompanies())
        +                <!-- Company -->
        +                <div class="form-group {{ $errors->has('company_id') ? 'has-error' : '' }}">
        +                  <div class="col-md-3 control-label">
        +                    {{ Form::label('company_id', trans('general.company')) }}
        +                  </div>
        +                  <div class="col-md-8">
        +                    {{ Form::select('company_id', $company_list , Input::old('company_id', $user->company_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                    {!! $errors->first('company_id', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
        +                @endif
        +
        +                <!-- language -->
        +                <div class="form-group {{ $errors->has('locale') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="locale">{{ trans('general.language') }}</label>
        +                  <div class="col-md-8">
        +                    {!! Form::locales('locale', Input::old('locale', $user->locale), 'select2') !!}
        +                    {!! $errors->first('locale', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
        +
        +                <!-- Employee Number -->
        +                <div class="form-group {{ $errors->has('employee_num') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="employee_num">{{ trans('admin/users/table.employee_num') }}</label>
        +                  <div class="col-md-8">
        +                    <input
        +                      class="form-control"
        +                      type="text"
        +                      name="employee_num"
        +                      id="employee_num"
        +                      value="{{ Input::old('employee_num', $user->employee_num) }}"
        +                    />
        +                    {!! $errors->first('employee_num', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
        +
        +
        +                <!-- Jobtitle -->
        +                <div class="form-group {{ $errors->has('jobtitle') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="jobtitle">{{ trans('admin/users/table.title') }}</label>
        +                  <div class="col-md-8">
        +                    <input
        +                      class="form-control"
        +                      type="text"
        +                      name="jobtitle"
        +                      id="jobtitle"
        +                      value="{{ Input::old('jobtitle', $user->jobtitle) }}"
        +                    />
        +                    {!! $errors->first('jobtitle', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
        +
        +
        +                <!-- Manager -->
        +                <div class="form-group {{ $errors->has('manager_id') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="manager_id">{{ trans('admin/users/table.manager') }}</label>
        +                  <div class="col-md-8">
        +                    {{ Form::select('manager_id', $manager_list , Input::old('manager_id', $user->manager_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                    {!! $errors->first('manager_id', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
        +
        +                  <!--  Department -->
        +                  <div class="form-group {{ $errors->has('department_id') ? ' has-error' : '' }}">
        +                      <label for="status_id" class="col-md-3 control-label">
        +                          {{ trans('general.department') }}
        +                      </label>
        +                      <div class="col-md-7">
        +                          {{ Form::select('department_id', $department_list , Input::old('department_id', $user->department_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                          {!! $errors->first('department_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                      </div>
        +                  </div>
        +
        +
        +                  <!-- Location -->
        +                <div class="form-group {{ $errors->has('location_id') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="location_id">{{ trans('admin/users/table.location') }}
        +                  </label>
        +                  <div class="col-md-8">
        +                    {{ Form::select('location_id', $location_list , Input::old('location_id', $user->location_id), array('class'=>'select2', 'style'=>'width:350px')) }}
        +                    {!! $errors->first('location_id', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
        +
        +                <!-- Phone -->
        +                <div class="form-group {{ $errors->has('phone') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="phone">{{ trans('admin/users/table.phone') }}</label>
        +                  <div class="col-md-4">
        +                    <input class="form-control" type="text" name="phone" id="phone" value="{{ Input::old('phone', $user->phone) }}" />
        +                    {!! $errors->first('phone', '<span class="alert-msg">:message</span>') !!}
        +                  </div>
        +                </div>
        +
        +                <!-- Activation Status -->
        +                <div class="form-group {{ $errors->has('activated') ? 'has-error' : '' }}">
        +                  <label class="col-md-3 control-label" for="activated">{{ trans('admin/users/table.activated') }}</label>
        +                  <div class="col-md-8">
                             <div class="controls">
        +                      <select
        +                        {{ ($user->id === Auth::user()->id ? ' disabled="disabled"' : '') }}
        +                        name="activated"
        +                        id="activated"
        +                        {{ ((config('app.lock_passwords') && ($user->id)) ? ' disabled' : '') }}
        +                      >
        +                        @if ($user->id)
        +                        <option value="1"{{ ($user->isActivated() ? ' selected="selected"' : '') }}>{{ trans('general.yes') }}</option>
        +                        <option value="0"{{ ( ! $user->isActivated() ? ' selected="selected"' : '') }}>{{ trans('general.no') }}</option>
        +                        @else
        +                        <option value="1"{{ (Input::old('activated') == 1 ? ' selected="selected"' : '') }}>{{ trans('general.yes') }}</option>
        +                        <option value="0">{{ trans('general.no') }}</option>
        +                        @endif
        +                      </select>
        +                      {!! $errors->first('activated', '<span class="alert-msg">:message</span>') !!}
        +                    </div>
        +                  </div>
        +                </div>
        +
        +                @if ($snipeSettings->two_factor_enabled!='')
        +                  @if ($snipeSettings->two_factor_enabled=='1')
        +                  <div class="form-group">
        +                    <div class="col-md-3 control-label">
        +                      {{ Form::label('two_factor_optin', trans('admin/settings/general.two_factor')) }}
        +                    </div>
        +                    <div class="col-md-9">
        +                      {{ Form::checkbox('two_factor_optin', '1', Input::old('two_factor_optin', $user->two_factor_optin),array('class' => 'minimal')) }}
        +                      {{ trans('admin/settings/general.two_factor_enabled_text') }}
        +
        +                      <p class="help-block">{{ trans('admin/users/general.two_factor_admin_optin_help') }}</p>
        +                    </div>
        +                  </div>
        +                  @endif
        +
        +                  <!-- Reset Two Factor -->
        +                  <div class="form-group">
        +                    <div class="col-md-8 col-md-offset-3 two_factor_resetrow">
        +                      <a class="btn btn-default btn-sm pull-left" id="two_factor_reset" style="margin-right: 10px;"> {{ trans('admin/settings/general.two_factor_reset') }}</a>
        +                      <span id="two_factor_reseticon">
        +                      </span>
        +                      <span id="two_factor_resetresult">
        +                      </span>
        +                      <span id="two_factor_resetstatus">
        +                      </span>
        +                    </div>
        +                    <div class="col-md-8 col-md-offset-3 two_factor_resetrow">
        +                      <p class="help-block">{{ trans('admin/settings/general.two_factor_reset_help') }}</p>
        +                    </div>
        +                  </div>
        +                @endif
        +
        +                <!-- Notes -->
        +                <div class="form-group{!! $errors->has('notes') ? ' has-error' : '' !!}">
        +                  <label for="notes" class="col-md-3 control-label">{{ trans('admin/users/table.notes') }}</label>
        +                  <div class="col-md-8">
        +                    <textarea class="form-control" id="notes" name="notes">{{ Input::old('notes', $user->notes) }}</textarea>
        +                    {!! $errors->first('notes', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
        +                  </div>
        +                </div>
        +
        +                  <!-- Groups -->
        +                  <div class="form-group{{ $errors->has('groups') ? ' has-error' : '' }}">
        +                      <label class="col-md-3 control-label" for="groups"> {{ trans('general.groups') }}</label>
        +                      <div class="col-md-5">
        +
        +                          @if ((Config::get('app.lock_passwords') || (!Auth::user()->isSuperUser())))
        +
        +                              @if (count($userGroups->keys()) > 0)
        +                                  <ul>
        +                                      @foreach ($groups as $id => $group)
        +                                          {!! ($userGroups->keys()->contains($id) ? '<li>'.e($group).'</li>' : '') !!}
        +                                      @endforeach
        +                                  </ul>
        +                              @endif
        +
        +                              <span class="help-block">Only superadmins may edit group memberships.</p>
        +                                  @else
        +                                      <div class="controls">
                                 <select
                                         name="groups[]"
                                         id="groups[]"
        @@ -400,50 +407,52 @@
                                   {{ trans('admin/users/table.groupnotes') }}
                                 </span>
                             </div>
        +                          @endif
        +
        +                      </div>
        +                  </div>
        +
        +
        +                <!-- Email user -->
        +                @if (!$user->id)
        +                <div class="form-group">
        +                  <div class="col-sm-3">
        +                  </div>
        +                  <div class="col-sm-9">
        +                    <div class="checkbox">
        +                      <label for="email_user">
        +                        {{ Form::checkbox('email_user', '1', Input::old('email_user'), array('id'=>'email_user','disabled'=>'disabled')) }}
        +                        Email this user their credentials? <span class="help-text" id="email_user_warn">(Cannot send email. No user email address specified.)</span>
        +                      </label>
        +                    </div>
        +                  </div>
        +                </div> <!--/form-group-->
                         @endif
        -
        +              </div> <!--/col-md-12-->
                     </div>
        -          </div>
        -          <!-- Email user -->
        -          @if (!$user->id)
        +          </div><!-- /.tab-pane -->
         
        -          <div class="form-group">
        -            <div class="col-sm-3">
        +          <div class="tab-pane" id="tab_2">
        +            <div class="col-md-12">
        +              @if (!Auth::user()->isSuperUser())
        +                <p class="alert alert-warning">Only superadmins may grant a user superadmin access.</p>
        +              @endif
                     </div>
        -            <div class="col-sm-9">
        -              <div class="checkbox">
        -                <label for="email_user">
        -                  {{ Form::checkbox('email_user', '1', Input::old('email_user'), array('id'=>'email_user','disabled'=>'disabled')) }}
         
        -                  Email this user their credentials? <span class="help-text" id="email_user_warn">(Cannot send email. No user email address specified.)</span>
        -                </label>
        -              </div>
        -            </div>
        -          </div>
        -          @endif
        -        </div>
        -      </div>
        -    </div><!-- /.tab-pane -->
        +            <table class="table table-striped permissions">
        +              <thead>
        +                <tr class="permissions-row">
        +                  <th class="col-md-5"><span class="line"></span>Permission</th>
        +                  <th class="col-md-1"><span class="line"></span>Grant</th>
        +                  <th class="col-md-1"><span class="line"></span>Deny</th>
        +                  <th class="col-md-1"><span class="line"></span>Inherit</th>
        +                </tr>
        +              </thead>
         
        -    <div class="tab-pane" id="tab_2">
        -        <div class="col-md-12">
        -            @if (!Auth::user()->isSuperUser())
        -              <p class="alert alert-warning">Only superadmins may grant a user superadmin access.</p>
        -            @endif
        -        </div>
        -        <table class="table table-striped permissions">
        -          <thead>
        -            <tr class="permissions-row">
        -              <th class="col-md-5"><span class="line"></span>Permission</th>
        -              <th class="col-md-1"><span class="line"></span>Grant</th>
        -              <th class="col-md-1"><span class="line"></span>Deny</th>
        -              <th class="col-md-1"><span class="line"></span>Inherit</th>
        -            </tr>
        -          </thead>
        -            @foreach ($permissions as $area => $permissionsArray)
        -            @if (count($permissionsArray) == 1)
        +              @foreach ($permissions as $area => $permissionsArray)
        +              @if (count($permissionsArray) == 1)
                       <tbody class="permissions-group">
        -              <?php $localPermission = $permissionsArray[0] ?>
        +                <?php $localPermission = $permissionsArray[0]; ?>
                         <tr class="header-row permissions-row">
                           <td class="col-md-5 tooltip-base permissions-item"
                             data-toggle="tooltip"
        @@ -452,38 +461,37 @@
                           >
                             <h4>{{ $area . ': ' . $localPermission['label'] }}</h4>
                           </td>
        +
                           <td class="col-md-1 permissions-item">
        -                      @if (($localPermission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        -                        {{ Form::radio('permission['.$localPermission['permission'].']', '1',$userPermissions[$localPermission['permission'] ] == '1',['disabled'=>"disabled"]) }}
        -                      @else
        -                        {{ Form::radio('permission['.$localPermission['permission'].']', '1',$userPermissions[$localPermission['permission'] ] == '1',['value'=>"grant"]) }}
        -                       @endif
        -
        -                    </td>
        -                    <td class="col-md-1 permissions-item">
        -                        @if (($localPermission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        -                            {{ Form::radio('permission['.$localPermission['permission'].']', '-1',$userPermissions[$localPermission['permission'] ] == '-1',['disabled'=>"disabled"]) }}
        -                        @else
        -                            {{ Form::radio('permission['.$localPermission['permission'].']', '-1',$userPermissions[$localPermission['permission'] ] == '-1',['value'=>"deny"]) }}
        -                        @endif
        -
        -                    </td>
        -                    <td class="col-md-1 permissions-item">
        -                        @if (($localPermission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        -                            {{ Form::radio('permission['.$localPermission['permission'].']','0',$userPermissions[$localPermission['permission'] ] == '0',['disabled'=>"disabled"] ) }}
        -                        @else
        -                            {{ Form::radio('permission['.$localPermission['permission'].']','0',$userPermissions[$localPermission['permission'] ] == '0',['value'=>"inherit"] ) }}
        -                        @endif
        -                    </td>
        -                  </tr>
        -                </tbody>
        -            @else
        +                    @if (($localPermission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        +                      {{ Form::radio('permission['.$localPermission['permission'].']', '1',$userPermissions[$localPermission['permission'] ] == '1',['disabled'=>"disabled"]) }}
        +                    @else
        +                      {{ Form::radio('permission['.$localPermission['permission'].']', '1',$userPermissions[$localPermission['permission'] ] == '1',['value'=>"grant"]) }}
        +                    @endif
        +                  </td>
        +                  <td class="col-md-1 permissions-item">
        +                    @if (($localPermission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        +                      {{ Form::radio('permission['.$localPermission['permission'].']', '-1',$userPermissions[$localPermission['permission'] ] == '-1',['disabled'=>"disabled"]) }}
        +                    @else
        +                      {{ Form::radio('permission['.$localPermission['permission'].']', '-1',$userPermissions[$localPermission['permission'] ] == '-1',['value'=>"deny"]) }}
        +                    @endif
        +                  </td>
        +                  <td class="col-md-1 permissions-item">
        +                    @if (($localPermission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        +                      {{ Form::radio('permission['.$localPermission['permission'].']','0',$userPermissions[$localPermission['permission'] ] == '0',['disabled'=>"disabled"] ) }}
        +                    @else
        +                      {{ Form::radio('permission['.$localPermission['permission'].']','0',$userPermissions[$localPermission['permission'] ] == '0',['value'=>"inherit"] ) }}
        +                    @endif
        +                  </td>
        +                </tr>
        +              </tbody>
        +              @else
                       <tbody class="permissions-group">
        -              <tr class="header-row permissions-row">
        -                <td class="col-md-5 header-name">
        -                  <h3>{{ $area }}</h3>
        -                </td>
        -                <td class="col-md-1 permissions-item">
        +                <tr class="header-row permissions-row">
        +                  <td class="col-md-5 header-name">
        +                    <h3>{{ $area }}</h3>
        +                  </td>
        +                  <td class="col-md-1 permissions-item">
                             {{ Form::radio("$area", '1',false,['value'=>"grant"]) }}
                           </td>
                           <td class="col-md-1 permissions-item">
        @@ -493,57 +501,57 @@
                             {{ Form::radio("$area", '0',false,['value'=>"inherit"] ) }}
                           </td>
                         </tr>
        -              @foreach ($permissionsArray as $index => $permission)
        -              <tr class="permissions-row">
        -                @if ($permission['display'])
        -                  <td
        -                    class="col-md-5 tooltip-base permissions-item"
        -                    data-toggle="tooltip"
        -                    data-placement="right"
        -                    title="{{ $permission['note'] }}"
        -                  >
        -                    {{ $permission['label'] }}
        -                  </td>
        -                  <td class="col-md-1 permissions-item">
        -                    @if (($permission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        -                    {{ Form::radio('permission['.$permission['permission'].']', '1', $userPermissions[$permission['permission'] ] == '1', ["value"=>"grant", 'disabled'=>'disabled']) }}
        -                    @else
        -                    {{ Form::radio('permission['.$permission['permission'].']', '1', $userPermissions[ $permission['permission'] ] == '1', ["value"=>"grant"]) }}
        -                    @endif
        -                  </td>
        -                  <td class="col-md-1 permissions-item">
        -                    @if (($permission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        -                    {{ Form::radio('permission['.$permission['permission'].']', '-1', $userPermissions[$permission['permission'] ] == '-1', ["value"=>"deny", 'disabled'=>'disabled']) }}
         
        -                    @else
        -                    {{ Form::radio('permission['.$permission['permission'].']', '-1', $userPermissions[$permission['permission'] ] == '-1', ["value"=>"deny"]) }}
        -                    @endif
        -                  </td>
        -                  <td class="col-md-1 permissions-item">
        -                    @if (($permission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        -                    {{ Form::radio('permission['.$permission['permission'].']', '0', $userPermissions[$permission['permission']] =='0', ["value"=>"inherit", 'disabled'=>'disabled']) }}
        -                    @else
        -                    {{ Form::radio('permission['.$permission['permission'].']', '0', $userPermissions[$permission['permission']] =='0', ["value"=>"inherit"]) }}
        -                    @endif
        -                  </td>
        -
        -                @endif
        -              </tr>
        -              @endforeach
        +                @foreach ($permissionsArray as $index => $permission)
        +                <tr class="permissions-row">
        +                  @if ($permission['display'])
        +                    <td
        +                      class="col-md-5 tooltip-base permissions-item"
        +                      data-toggle="tooltip"
        +                      data-placement="right"
        +                      title="{{ $permission['note'] }}"
        +                    >
        +                      {{ $permission['label'] }}
        +                    </td>
        +                    <td class="col-md-1 permissions-item">
        +                      @if (($permission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        +                      {{ Form::radio('permission['.$permission['permission'].']', '1', $userPermissions[$permission['permission'] ] == '1', ["value"=>"grant", 'disabled'=>'disabled']) }}
        +                      @else
        +                      {{ Form::radio('permission['.$permission['permission'].']', '1', $userPermissions[ $permission['permission'] ] == '1', ["value"=>"grant"]) }}
        +                      @endif
        +                    </td>
        +                    <td class="col-md-1 permissions-item">
        +                      @if (($permission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        +                      {{ Form::radio('permission['.$permission['permission'].']', '-1', $userPermissions[$permission['permission'] ] == '-1', ["value"=>"deny", 'disabled'=>'disabled']) }}
        +                      @else
        +                      {{ Form::radio('permission['.$permission['permission'].']', '-1', $userPermissions[$permission['permission'] ] == '-1', ["value"=>"deny"]) }}
        +                      @endif
        +                    </td>
        +                    <td class="col-md-1 permissions-item">
        +                      @if (($permission['permission'] == 'superuser') && (!Auth::user()->isSuperUser()))
        +                      {{ Form::radio('permission['.$permission['permission'].']', '0', $userPermissions[$permission['permission']] =='0', ["value"=>"inherit", 'disabled'=>'disabled']) }}
        +                      @else
        +                      {{ Form::radio('permission['.$permission['permission'].']', '0', $userPermissions[$permission['permission']] =='0', ["value"=>"inherit"]) }}
        +                      @endif
        +                    </td>
        +                  @endif
        +                </tr>
        +                @endforeach
                       </tbody>
                       @endif
        -            @endforeach
        -        </table>
        -    </div><!-- /.tab-pane -->
        -  </div><!-- /.tab-content -->
        -  <div class="box-footer text-right">
        -    <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        -  </div>
        -</div><!-- nav-tabs-custom -->
        -</form>
        -</div>
        -</div>
        +              @endforeach
        +            </table>
        +          </div><!-- /.tab-pane -->
        +        </div><!-- /.tab-content -->
        +        <div class="box-footer text-right">
        +          <button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
        +        </div>
        +      </div><!-- nav-tabs-custom -->
        +    </form>
        +  </div> <!--/col-md-8-->
        +</div><!--/row-->
         @stop
        +
         @section('moar_scripts')
         <script>
         $(document).ready(function() {
        @@ -575,7 +583,7 @@ $('.header-name').click(function() {
         })
         </script>
         
        -<script src="{{ asset('assets/js/pGenerator.jquery.js') }}"></script>
        +<script src="{{ asset('js/pGenerator.jquery.js') }}"></script>
         
         <script>
         
        diff --git a/resources/views/users/import.blade.php b/resources/views/users/import.blade.php
        index b99b906b4e..81e767b697 100644
        --- a/resources/views/users/import.blade.php
        +++ b/resources/views/users/import.blade.php
        @@ -7,7 +7,7 @@ Create a User
         @stop
         
         @section('header_right')
        -<a href="{{ route('users') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
        +<a href="{{ route('users.index') }}" class="btn btn-default"> {{ trans('general.back') }}</a>
         @stop
         
         {{-- Page content --}}
        @@ -15,93 +15,77 @@ Create a User
         
         
         <div class="row">
        -  <div class="col-md-8 col-md-offset-2">
        -    <div class="box box-default">
        -      <div class="box-body">
        +    <div class="col-md-8 col-md-offset-2">
                 <form class="form-horizontal" role="form" method="post" enctype="multipart/form-data" action="">
        -        <!-- CSRF Token -->
        -        <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +            <div class="box box-default">
        +                <div class="box-body">
        +                    <!-- CSRF Token -->
        +                    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
         
        -			@if (Session::get('message'))
        -			<p class="alert-danger">
        -				You have an error in your CSV file:<br />
        -				{{ Session::get('message') }}
        -			</p>
        -			@endif
        +                    @if (Session::get('message'))
        +                    <p class="alert-danger">
        +                        You have an error in your CSV file:<br />
        +                        {{ Session::get('message') }}
        +                    </p>
        +                    @endif
         
        -			<p>
        -				Upload a CSV file with one or more users.  Passwords will be auto-generated.  The CSV should have the <strong>first</strong> fields as: </p>
        +                    <p>
        +                        Upload a CSV file with one or more users.  Passwords will be auto-generated.  The CSV should have the <strong>first</strong> fields as:
        +                    </p>
         
        -        <p><strong>firstName,lastName, username, email, location_id, phone, jobtitle, employee_num, company_id</strong>. </p>
        +                    <p>
        +                        <strong>firstName,lastName, username, email, location_id, phone, jobtitle, employee_num, company_id</strong>.
        +                    </p>
         
        -        <p>Any additional fields to the right of those fields will be ignored. Email is optional, however users will not be able to recover their passwords or receive EULAs if you do not provide an email address. If you wish to include a company association, you must reference the ID number of an existing company - companies will not be created on the fly.
        -			</p>
        +                    <p>
        +                        Any additional fields to the right of those fields will be ignored. Email is optional, however users will not be able to recover their passwords or receive EULAs if you do not provide an email address. If you wish to include a company association, you must reference the ID number of an existing company - companies will not be created on the fly.
        +                    </p>
         
        -            @if (config('app.lock_passwords'))
        -                <p>Note: Email notification for users is disabled for this installation.</p>
        -            @endif
        +                    @if (config('app.lock_passwords'))
        +                    <p>Note: Email notification for users is disabled for this installation.</p>
        +                    @endif
         
        -            <div class="form-group {!! $errors->first('user_import_csv', 'has-error') }}">
        -                <label for="first_name" class="col-sm-3 control-label">{{ trans('admin/users/general.usercsv') }}</label>
        -        				<div class="col-sm-5">
        -        					<input type="file" name="user_import_csv" id="user_import_csv">
        -        				</div>
        +                    <div class="form-group {!! $errors->first('user_import_csv', 'has-error') }}">
        +                        <label for="first_name" class="col-sm-3 control-label">{{ trans('admin/users/general.usercsv') }}</label>
        +                        <div class="col-sm-5">
        +                            <input type="file" name="user_import_csv" id="user_import_csv">
        +                        </div>
        +                    </div>
        +
        +                    <!-- Has Headers -->
        +                    <div class="form-group">
        +                        <div class="col-sm-2 ">
        +                        </div>
        +                        <div class="col-sm-5">
        +                            {{ Form::checkbox('has_headers', '1', Input::old('has_headers')) }} This CSV has a header row
        +                        </div>
        +                    </div>
        +
        +                    <!-- Email user -->
        +                    <div class="form-group">
        +                        <div class="col-sm-2 ">
        +                        </div>
        +                        <div class="col-sm-5">
        +                            {{ Form::checkbox('email_user', '1', Input::old('email_user')) }} Email these users their credentials? (Only possible where email address is included with user data.)
        +                        </div>
        +                    </div>
        +
        +                    <!-- Activate -->
        +                    <div class="form-group">
        +                        <div class="col-sm-2 ">
        +                        </div>
        +                        <div class="col-sm-5">
        +                            {{ Form::checkbox('activate', '1', Input::old('activate')) }} Activate user?
        +                        </div>
        +                    </div>
        +                </div> <!--/box-body-->
        +                <!-- Form Actions -->
        +                <div class="box-footer text-right">
        +                    <button type="submit" class="btn btn-default">{{ trans('button.submit') }}</button>
        +                </div>
                     </div>
        -
        -            <!-- Has Headers -->
        -    			<div class="form-group">
        -    				<div class="col-sm-2 ">
        -    				</div>
        -    				<div class="col-sm-5">
        -    					{{ Form::checkbox('has_headers', '1', Input::old('has_headers')) }} This CSV has a header row
        -    				</div>
        -    			</div>
        -
        -
        -    			<!-- Email user -->
        -    			<div class="form-group">
        -    				<div class="col-sm-2 ">
        -    				</div>
        -    				<div class="col-sm-5">
        -    					{{ Form::checkbox('email_user', '1', Input::old('email_user')) }} Email these users their credentials? (Only possible where email address is included with user data.)
        -    				</div>
        -    			</div>
        -
        -    			<!-- Activate -->
        -    			<div class="form-group">
        -    				<div class="col-sm-2 ">
        -    				</div>
        -    				<div class="col-sm-5">
        -    					{{ Form::checkbox('activate', '1', Input::old('activate')) }} Activate user?
        -    				</div>
        -    			</div>
        -
        -
        -
        -        </div>
        -
        -    <!-- Form Actions -->
        -    <div class="box-footer text-right">
        -      <button type="submit" class="btn btn-default">{{ trans('button.submit') }}</button>
        +        </form>
             </div>
        +</div>
         
        -</form>
        -</div></div></div></div>
        -<script>
        -$(document).ready(function(){
        -
        -    $('#generate-password').pGenerator({
        -        'bind': 'click',
        -        'passwordElement': '#password',
        -        'displayElement': '#password-display',
        -        'passwordLength': 10,
        -        'uppercase': true,
        -        'lowercase': true,
        -        'numbers':   true,
        -        'specialChars': false,
        -
        -    });
        -});
        -
        -</script>
         @stop
        diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php
        index cfbb6ef55a..8d66b1d543 100755
        --- a/resources/views/users/index.blade.php
        +++ b/resources/views/users/index.blade.php
        @@ -10,28 +10,26 @@
         @endif
          {{ trans('general.users') }}
         
        -
         @parent
         @stop
         
         @section('header_right')
        -    @can('users.create')
        -        @if ($snipeSettings->ldap_enabled == 1)
        -          <a href="{{ route('ldap/user') }}" class="btn btn-default pull-right"><span class="fa fa-upload"></span> LDAP</a>
        -        @endif
        -          <a href="{{ route('import/user') }}" class="btn btn-default pull-right" style="margin-right: 5px;"><span class="fa fa-upload"></span> {{ trans('general.import') }}</a>
        -          <a href="{{ route('create/user') }}" class="btn btn-primary pull-right" style="margin-right: 5px;">  {{ trans('general.create') }}</a>
        +    @can('create', \App\Models\User::class)
        +      @if ($snipeSettings->ldap_enabled == 1)
        +      <a href="{{ route('ldap/user') }}" class="btn btn-default pull-right"><span class="fa fa-sitemap"></span> LDAP Sync</a>
        +      @endif
        +      <a href="{{ route('import/user') }}" class="btn btn-default pull-right" style="margin-right: 5px;"><span class="fa fa-upload"></span> {{ trans('general.import') }}</a>
        +      <a href="{{ route('users.create') }}" class="btn btn-primary pull-right" style="margin-right: 5px;">  {{ trans('general.create') }}</a>
             @endcan
         
        -        @if (Input::get('status')=='deleted')
        -          <a class="btn btn-default pull-right" href="{{ URL::to('admin/users') }}" style="margin-right: 5px;">{{ trans('admin/users/table.show_current') }}</a>
        -        @else
        -          <a class="btn btn-default pull-right" href="{{ URL::to('admin/users?status=deleted') }}" style="margin-right: 5px;">{{ trans('admin/users/table.show_deleted') }}</a>
        -        @endif
        -    @can('users.view')
        -        <a class="btn btn-default pull-right" href="{{ URL::to('admin/users/export') }}" style="margin-right: 5px;">Export</a>
        +    @if (Input::get('status')=='deleted')
        +      <a class="btn btn-default pull-right" href="{{ route('users.index') }}" style="margin-right: 5px;">{{ trans('admin/users/table.show_current') }}</a>
        +    @else
        +      <a class="btn btn-default pull-right" href="{{ route('users.index', ['status' => 'deleted']) }}" style="margin-right: 5px;">{{ trans('admin/users/table.show_deleted') }}</a>
        +    @endif
        +    @can('view', \App\Models\User::class)
        +        <a class="btn btn-default pull-right" href="{{ route('users.export') }}" style="margin-right: 5px;">Export</a>
             @endcan
        -
         @stop
         
         {{-- Page content --}}
        @@ -39,131 +37,68 @@
         
         <div class="row">
           <div class="col-md-12">
        -
             <div class="box box-default">
        -
                 <div class="box-body">
        -
                   {{ Form::open([
                        'method' => 'POST',
                        'route' => ['users/bulkedit'],
        -               'class' => 'form-inline' ]) }}
        +               'class' => 'form-inline',
        +                'id' => 'bulkForm']) }}
         
                     @if (Input::get('status')!='deleted')
        -                @can('users.delete')
        -               <div id="toolbar">
        -                 <select name="bulk_actions" class="form-control select2" style="width: 200px;">
        -                     <option value="delete">Bulk Checkin &amp; Delete</option>
        -                 </select>
        -                 <button class="btn btn-default" id="bulkEdit" disabled>Go</button>
        -             </div>
        -                @endcan
        +              @can('delete', \App\Models\User::class)
        +                <div id="toolbar">
        +                  <select name="bulk_actions" class="form-control select2" style="width: 200px;">
        +                    <option value="delete">Bulk Checkin &amp; Delete</option>
        +                    <option value="edit">Bulk Edit</option>
        +                  </select>
        +                  <button class="btn btn-default" id="bulkEdit" disabled>Go</button>
        +                </div>
        +              @endcan
                     @endif
         
        -
                      <table
                       name="users"
                       data-toolbar="#toolbar"
        +              data-toggle="table"
                       class="table table-striped snipe-table"
                       id="table"
        -              data-toggle="table"
        -              data-url="{{ route('api.users.list', array(''=>e(Input::get('status')))) }}"
        +              data-url="{{ route('api.users.index',
        +              array('deleted'=> (Input::get('status')=='deleted') ? 'true' : 'false','company_id'=>e(Input::get('company_id')))) }}"
                       data-cookie="true"
                       data-click-to-select="true"
                       data-cookie-id-table="userTableDisplay-{{ config('version.hash_version') }}">
        -                 <thead>
        -                     <tr>
        -                         <th data-class="hidden-xs hidden-sm" data-switchable="false" data-searchable="false" data-sortable="false" data-field="checkbox">
        -                             @if (Input::get('status')!='deleted')
        -                                 <div class="text-center"><input type="checkbox" id="checkAll" style="padding-left: 0px;" style="hidden-xs hidden-sm"></div>
        -                             @endif
        -                         </th>
        -                         <th data-switchable="true" data-sortable="true" data-field="id" data-visible="false">{{ trans('general.id') }}</th>
        -                         <th data-switchable="true" data-sortable="false" data-field="companyName" data-visible="false">{{ trans('admin/companies/table.title') }}</th>
        -                         <th data-switchable="true" data-sortable="true" data-field="employee_num" data-visible="false">{{ trans('admin/users/table.employee_num') }}</th>
        -                         <th data-sortable="true" data-field="name">{{ trans('admin/users/table.name') }}</th>
        -                         <th data-switchable="true" data-sortable="true" data-field="jobtitle" data-visible="false">{{ trans('admin/users/table.title') }}</th>
        -                         <th data-sortable="true" data-field="email">
        -                             <span class="hidden-md hidden-lg">{{ trans('admin/users/table.email') }}</span>
        -                             <span class="hidden-xs"><i class="fa fa-envelope fa-lg"></i></span>
        -                         </th>
        -                         <th data-sortable="true" data-field="username">{{ trans('admin/users/table.username') }}</th>
        -                         <th data-searchable="true" data-sortable="true" data-field="manager">{{ trans('admin/users/table.manager') }}</th>
        -                         <th data-sortable="true" data-field="location">{{ trans('admin/users/table.location') }}</th>
        -                         <th data-sortable="false" data-field="assets">
        -                             <span class="hidden-md hidden-lg">Assets</span>
        -                             <span class="hidden-xs"><i class="fa fa-barcode fa-lg"></i></span>
        -                         </th>
        -                         <th data-sortable="false" data-field="licenses">
        -                             <span class="hidden-md hidden-lg">Licenses</span>
        -                             <span class="hidden-xs"><i class="fa fa-floppy-o fa-lg"></i></span>
        -                         </th>
        -                         <th data-sortable="false" data-field="accessories">
        -                             <span class="hidden-md hidden-lg">Accessories</span>
        -                             <span class="hidden-xs"><i class="fa fa-keyboard-o fa-lg"></i></span>
        -                         </th>
        -                         <th data-sortable="false" data-field="consumables">
        -                             <span class="hidden-md hidden-lg">Consumables</span>
        -                             <span class="hidden-xs"><i class="fa fa-tint fa-lg"></i></span>
        -                         </th>
        -                         <th data-sortable="false" data-field="groups">{{ trans('general.groups') }}</th>
        -                         <th data-sortable="true" data-field="notes">{{ trans('general.notes') }}</th>
        -                         <th data-sortable="true" data-field="two_factor_enrolled" data-visible="false">{{ trans('admin/users/general.two_factor_enrolled') }}</th>
        -                         <th data-sortable="true" data-field="two_factor_optin" data-visible="false">{{ trans('admin/users/general.two_factor_active') }}</th>
         
        -                         <th data-sortable="true" data-field="activated">{{ trans('general.activated') }}</th>
        -                         <th data-sortable="true" data-field="created_at" data-searchable="true" data-visible="false">{{ trans('general.created_at') }}</th>
        -                         <th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" >{{ trans('table.actions') }}</th>
        -                     </tr>
        -                 </thead>
        -                 {{-- <tfoot>
        -                     <tr>
        -                         <td colspan="12">
        -                             <select name="bulk_actions" class="form-control">
        -                                 <option value="delete">Bulk Delete</option>
        -                             </select>
        -                             <button class="btn btn-default" id="bulkEdit" disabled>Go</button>
        -                         </td>
        -                     </tr>
        -                 </tfoot> --}}
                      </table>
         
                   {{ Form::close() }}
                 </div><!-- /.box-body -->
               </div><!-- /.box -->
        -
           </div>
         </div>
        +
         @stop
         
        -
         @section('moar_scripts')
        -@include ('partials.bootstrap-table', ['exportFile' => 'users-export', 'search' => true])
        +@include ('partials.bootstrap-table',
        +    ['exportFile' => 'users-export',
        +    'search' => true,
        +    'columns' => \App\Presenters\UserPresenter::dataTableLayout()
        +])
         
         <script>
         
        -	$(function() {
        +    function groupsFormatter(value) {
         
        -		function checkForChecked() {
        +        if (value) {
        +            var groups = '';
        +            for (var index in value.rows) {
        +                groups += '<a href="#" class="label label-default"> ' + value.rows[index].name + '</a> ';
        +            }
        +            return groups;
        +        }
         
        -	        var check_checked = $('input.one_required:checked').length;
        -
        -	        if (check_checked > 0) {
        -	            $('#bulkEdit').removeAttr('disabled');
        -	        }
        -	        else {
        -	            $('#bulkEdit').attr('disabled', 'disabled');
        -	        }
        -	    }
        -
        -	    $('table').on('change','input.one_required',checkForChecked);
        -
        -	    $("#checkAll").change(function () {
        -			$("input:checkbox").prop('checked', $(this).prop("checked"));
        -			checkForChecked();
        -		});
        -
        -	});
        +    }
         
         
         </script>
        diff --git a/resources/views/users/ldap.blade.php b/resources/views/users/ldap.blade.php
        index b34a465b49..c44815d5ec 100644
        --- a/resources/views/users/ldap.blade.php
        +++ b/resources/views/users/ldap.blade.php
        @@ -17,39 +17,31 @@ LDAP User Sync
         @section('content')
         
         <div class="row">
        -<div class="col-md-9">
        -
        -
        -@if ($snipeSettings->ldap_enabled == 0)
        -    {{ trans('admin/users/message.ldap_not_configured') }}
        -@else
        -
        -
        +  <div class="col-md-9">
        +    @if ($snipeSettings->ldap_enabled == 0)
        +      {{ trans('admin/users/message.ldap_not_configured') }}
        +    @else
             <form class="form-horizontal" role="form" method="post" action="" id="ldap-form">
        -    <!-- CSRF Token -->
        -    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -
        -    <div class="box box-default">
        -      <div class="box-body">
        -
        -        <div class="form-group {{ $errors->has('location_id') ? 'has-error' : '' }}">
        -          <label class="col-md-2 control-label" for="location_id">{{ trans('admin/users/table.location') }}
        -              </label>
        -          <div class="col-md-6">
        -            {{ Form::select('location_id', $location_list , Input::old('location_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
        +      {{csrf_field()}}
        +      <div class="box box-default">
        +        <div class="box-body">
        +          <!-- location_id-->
        +          <div class="form-group {{ $errors->has('location_id') ? 'has-error' : '' }}">
        +            <label class="col-md-2 control-label" for="location_id">{{ trans('admin/users/table.location') }}
        +                </label>
        +            <div class="col-md-6">
        +              {{ Form::select('location_id', $location_list , Input::old('location_id'), array('class'=>'select2', 'style'=>'width:350px')) }}
         
                       {!! $errors->first('location_id', '<span class="alert-msg">:message</span>') !!}
        +            </div>
        +            <div class="col-md-4">
        +              <button type="submit" class="btn btn-warning" id="sync">
        +                  <i id="sync-button-icon" class="fa fa-refresh icon-white"></i> <span id="sync-button-text">Synchronize</span>
        +              </button>
        +            </div>
                   </div>
        -          <div class="col-md-4">
        -            <button type="submit" class="btn btn-warning" id="sync">
        -                <i id="sync-button-icon" class="fa fa-refresh icon-white"></i> <span id="sync-button-text">Synchronize</span>
        -            </button>
        -          </div>
        -
                 </div>
        -
               </div>
        -    </div>
             </form>
           </div>
           <div class="col-md-3">
        @@ -58,52 +50,50 @@ LDAP User Sync
             </p>
           </div>
         </div>
        -<div class="row">
        -<div class="col-md-12">
         
        -    @if (Session::get('summary'))
        +@if (Session::get('summary'))
        +<div class="row">
        +  <div class="col-md-12">
         
             <div class="box box-default">
               <div class="box-header with-border">
                 <h3 class="box-title">Synchronization Results</h3>
               </div><!-- /.box-header -->
               <div class="box-body">
        -
                 <table class="table table-bordered">
        -            <tr>
        -                <th>Username</th><th>Employee Number</th>
        -                <th>First Name</th><th>Last Name</th>
        -                <th>Email</th><th>Notes</th>
        -            </tr>
        +          <tr>
        +              <th>Username</th><th>Employee Number</th>
        +              <th>First Name</th><th>Last Name</th>
        +              <th>Email</th><th>Notes</th>
        +          </tr>
         
        -            @foreach (Session::get('summary') as $entry)
        -              <tr {!! ($entry['status']=='success') ? 'class="success"' : 'class="danger"' !!}>
        -                <td>{{ $entry['username'] }}</td>
        -                <td>{{ $entry['employee_number'] }}</td>
        -                <td>{{ $entry['firstname'] }}</td>
        -                <td>{{ $entry['lastname'] }}</td>
        -                <td>{{ $entry['email'] }}</td>
        -                <td>
        -                  @if ($entry['status']=='success')
        -                    <i class="fa fa-check"></i> {!! $entry['note'] !!}
        -                  @else
        -                    <span class="alert-msg">{!! $entry['note'] !!}</span>
        -                  @endif
        +          @foreach (Session::get('summary') as $entry)
        +          <tr {!! ($entry['status']=='success') ? 'class="success"' : 'class="danger"' !!}>
        +              <td>{{ $entry['username'] }}</td>
        +              <td>{{ $entry['employee_number'] }}</td>
        +              <td>{{ $entry['firstname'] }}</td>
        +              <td>{{ $entry['lastname'] }}</td>
        +              <td>{{ $entry['email'] }}</td>
        +              <td>
        +                @if ($entry['status']=='success')
        +                  <i class="fa fa-check"></i> {!! $entry['note'] !!}
        +                @else
        +                  <span class="alert-msg">{!! $entry['note'] !!}</span>
        +                @endif
         
        -                  </td>
        -                </tr>
        -
        -            @endforeach
        +                </td>
        +              </tr>
        +          @endforeach
                 </table>
        -
               </div>
             </div>
        -
        -
             @endif
        +
        +  </div>
        +</div>
         @endif
        -</div>
        -</div>
        +
        +@stop
         
         @section('moar_scripts')
         
        @@ -119,4 +109,3 @@ LDAP User Sync
         </script>
         
         @stop
        -@stop
        diff --git a/resources/views/users/view.blade.php b/resources/views/users/view.blade.php
        index 3b9e379fd9..cb443c26aa 100755
        --- a/resources/views/users/view.blade.php
        +++ b/resources/views/users/view.blade.php
        @@ -2,7 +2,7 @@
         
         {{-- Page title --}}
         @section('title')
        -{{ trans('admin/users/general.view_user', array('name' => $user->fullName())) }}
        +{{ trans('admin/users/general.view_user', array('name' => $user->present()->fullName())) }}
         @parent
         @stop
         
        @@ -10,428 +10,487 @@
         @section('content')
         
         <div class="row">
        -    <div class="col-md-12">
        +  <div class="col-md-12">
        +    <div class="nav-tabs-custom">
        +      <ul class="nav nav-tabs hidden-print">
         
        +        <li class="active">
        +          <a href="#info_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-info-circle"></i>
        +            </span>
        +            <span class="hidden-xs hidden-sm">{{ trans('admin/users/general.info') }}</span>
        +          </a>
        +        </li>
         
        -      <div class="nav-tabs-custom">
        -        <ul class="nav nav-tabs">
        -          <li class="active"><a href="#info_tab" data-toggle="tab"><span class="hidden-lg hidden-md"><i class="fa fa-info-circle"></i></span> <span class="hidden-xs hidden-sm">Info</span></a></li>
        -          <li><a href="#asset_tab" data-toggle="tab"><span class="hidden-lg hidden-md"><i class="fa fa-barcode"></i></span> <span class="hidden-xs hidden-sm">{{ trans('general.assets') }}</span></a></li>
        -          <li><a href="#licenses_tab" data-toggle="tab"><span class="hidden-lg hidden-md"><i class="fa fa-floppy-o"></i></span> <span class="hidden-xs hidden-sm">{{ trans('general.licenses') }}</span></a></li>
        -          <li><a href="#accessories_tab" data-toggle="tab"><span class="hidden-lg hidden-md"><i class="fa fa-keyboard-o"></i></span> <span class="hidden-xs hidden-sm">{{ trans('general.accessories') }}</span></a></li>
        -          <li><a href="#consumables_tab" data-toggle="tab"><span class="hidden-lg hidden-md"><i class="fa fa-tint"></i></span> <span class="hidden-xs hidden-sm">{{ trans('general.consumables') }}</span></a></li>
        -          <li><a href="#files_tab" data-toggle="tab"><span class="hidden-lg hidden-md"><i class="fa fa-paperclip"></i></span> <span class="hidden-xs hidden-sm">{{ trans('general.file_uploads') }}</span></a></li>
        -          <li><a href="#history_tab" data-toggle="tab"><span class="hidden-lg hidden-md"><i class="fa fa-clock-o"></i></span> <span class="hidden-xs hidden-sm">{{ trans('general.history') }}</span></a></li>
        +        <li>
        +          <a href="#asset_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-barcode"></i>
        +            </span>
        +            <span class="hidden-xs hidden-sm">{{ trans('general.assets') }}</span>
        +          </a>
        +        </li>
         
        -            @can('users.edit')
        +        <li>
        +          <a href="#licenses_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-floppy-o"></i>
        +            </span>
        +            <span class="hidden-xs hidden-sm">{{ trans('general.licenses') }}</span>
        +          </a>
        +        </li>
        +
        +        <li>
        +          <a href="#accessories_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-keyboard-o"></i>
        +            </span> <span class="hidden-xs hidden-sm">{{ trans('general.accessories') }}</span>
        +          </a>
        +        </li>
        +
        +        <li>
        +          <a href="#consumables_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-tint"></i></span>
        +            <span class="hidden-xs hidden-sm">{{ trans('general.consumables') }}</span>
        +          </a>
        +        </li>
        +
        +        <li>
        +          <a href="#files_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-paperclip"></i></span>
        +            <span class="hidden-xs hidden-sm">{{ trans('general.file_uploads') }}</span>
        +          </a>
        +        </li>
        +
        +        <li>
        +          <a href="#history_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-clock-o"></i></span>
        +            <span class="hidden-xs hidden-sm">{{ trans('general.history') }}</span>
        +          </a>
        +        </li>
        +
        +        @if ($user->managedLocations()->count() >= 0 )
        +        <li>
        +          <a href="#managed_tab" data-toggle="tab">
        +            <span class="hidden-lg hidden-md">
        +            <i class="fa fa-clock-o"></i></span>
        +            <span class="hidden-xs hidden-sm">{{ trans('admin/users/table.managed_locations') }}</span>
        +          </a>
        +        </li>
        +        @endif
        +
        +        @can('update', $user)
                   <li class="dropdown pull-right">
        -
                     <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                       <i class="fa fa-gear"></i> {{ trans('button.actions') }}
                       <span class="caret"></span>
                     </a>
                     <ul class="dropdown-menu">
        -              <li><a href="{{ route('update/user', $user->id) }}">{{ trans('admin/users/general.edit') }}</a></li>
        -               <li><a href="{{ route('clone/user', $user->id) }}">{{ trans('admin/users/general.clone') }}</a></li>
        -               @if ((Auth::user()->id !== $user->id) && (!config('app.lock_passwords')) && ($user->deleted_at==''))
        -                   <li><a href="{{ route('delete/user', $user->id) }}">{{ trans('button.delete') }}</a></li>
        -               @endif
        +              <li><a href="{{ route('users.edit', $user->id) }}">{{ trans('admin/users/general.edit') }}</a></li>
        +              <li><a href="{{ route('clone/user', $user->id) }}">{{ trans('admin/users/general.clone') }}</a></li>
        +              @if ((Auth::user()->id !== $user->id) && (!config('app.lock_passwords')) && ($user->deleted_at==''))
        +                <li><a href="{{ route('users.destroy', $user->id) }}">{{ trans('button.delete') }}</a></li>
        +              @endif
                     </ul>
                   </li>
        -            @endcan
        -        </ul>
        -        <div class="tab-content">
        -          <div class="tab-pane active" id="info_tab">
        -            <div class="row">
        -                @if ($user->deleted_at!='')
        -                    <div class="col-md-12">
        -                    <div class="callout callout-warning">
        -                        <i class="icon fa fa-warning"></i>
        -                        This user has been marked as deleted.
        -                        @can('users.edit')
        -                            <a href="{{ route('restore/user', $user->id) }}">Click here</a> to restore them.
        -                        @endcan
        -                      </div>
        -                  </div>
        -                @endif
        -              <div class="col-md-1">
        +        @endcan
        +      </ul>
        +
        +      <div class="tab-content">
        +        <div class="tab-pane active" id="info_tab">
        +          <div class="row">
        +            @if ($user->deleted_at!='')
        +              <div class="col-md-12">
        +                <div class="callout callout-warning">
        +                  <i class="icon fa fa-warning"></i>
        +                  {{ trans('admin/users/message.user_deleted_warning') }}
        +                  @can('update', $user)
        +                      <a href="{{ route('restore/user', $user->id) }}">{{ trans('admin/users/general.restore_user') }}</a>
        +                  @endcan
        +                </div>
        +              </div>
        +            @endif
        +            <div class="col-md-1">
                       @if ($user->avatar)
                         <img src="/uploads/avatars/{{ $user->avatar }}" class="avatar img-thumbnail hidden-print">
                       @else
        -                <img src="{{ $user->gravatar() }}" class="avatar img-circle hidden-print">
        +                <img src="{{ $user->present()->gravatar() }}" class="avatar img-circle hidden-print">
                       @endif
                     </div>
        -            <div class="col-md-8">
         
        -                <div class="table table-responsive">
        -                  <table class="table table-striped">
        -                    @if (!is_null($user->company))
        +            <div class="col-md-8">
        +              <div class="table table-responsive">
        +                <table class="table table-striped">
        +                  @if (!is_null($user->company))
        +                    <tr>
        +                        <td>{{ trans('general.company') }}</td>
        +                        <td>{{ $user->company->name }}</td>
        +                    </tr>
        +                  @endif
        +
        +                  <tr>
        +                    <td>{{ trans('admin/users/table.name') }}</td>
        +                    <td>{{ $user->present()->fullName() }}</td>
        +                  </tr>
        +
        +                  @if ($user->last_login)
        +                    <tr>
        +                      <td>{{ trans('general.last_login') }}</td>
        +                      <td>{{ \App\Helpers\Helper::getFormattedDateObject($user->last_login, 'datetime', false) }}</td>
        +                    </tr>
        +                  @endif
        +
        +                    @if (!is_null($user->department))
                               <tr>
        -                          <td>Company</td>
        -                          <td>{{ $user->company->name }}</td>
        +                        <td>{{ trans('general.department') }}</td>
        +                        <td><a href="{{ route('departments.show', $user->department) }}">{{ $user->department->name }}</a></td>
                               </tr>
                             @endif
         
        -                    <tr>
        -                        <td>Name</td>
        -                        <td>{{ $user->fullName() }}</td>
        -                    </tr>
        -                    @if ($user->jobtitle)
        -                    <tr>
        -                        <td>Title</td>
        -                        <td>{{ $user->jobtitle }}</td>
        -                    </tr>
        -                    @endif
        +                  @if ($user->jobtitle)
        +                  <tr>
        +                    <td>{{ trans('admin/users/table.job') }}</td>
        +                    <td>{{ $user->jobtitle }}</td>
        +                  </tr>
        +                  @endif
         
        -                    @if ($user->employee_num)
        -                    <tr>
        -                        <td>Employee No.</td>
        -                        <td>{{ $user->employee_num }}</td>
        -                    </tr>
        -                    @endif
        +                  @if ($user->employee_num)
        +                  <tr>
        +                    <td>{{ trans('admin/users/table.employee_num') }}</td>
        +                    <td>{{ $user->employee_num }}</td>
        +                  </tr>
        +                  @endif
         
        -                    @if ($user->manager)
        -                    <tr>
        -                        <td>Manager</td>
        -                        <td><a href="{{ route('view/user', $user->manager->id) }}">{{ $user->manager->fullName() }}</a></td>
        -                    </tr>
        -                    @endif
        +                  @if ($user->manager)
        +                  <tr>
        +                    <td>{{ trans('admin/users/table.manager') }}</td>
        +                    <td>
        +                      <a href="{{ route('users.show', $user->manager->id) }}">{{ $user->manager->getFullNameAttribute() }}</a>
         
        -                    @if ($user->email)
        -                    <tr>
        -                        <td>Email</td>
        -                        <td><a href="mailto:{{ $user->email }}">{{ $user->email }}</a></td>
        -                    </tr>
        -                    @endif
        +                      </td>
        +                  </tr>
        +                  @endif
         
        -                    @if ($user->phone)
        -                    <tr>
        -                        <td>Phone</td>
        -                        <td>{{ $user->phone }}</td>
        -                    </tr>
        -                    @endif
        +                  @if ($user->email)
        +                  <tr>
        +                    <td>{{ trans('admin/users/table.email') }}</td>
        +                    <td><a href="mailto:{{ $user->email }}">{{ $user->email }}</a></td>
        +                  </tr>
        +                  @endif
         
        -                    @if ($user->userloc)
        -                    <tr>
        -                        <td>Location</td>
        -                        <td>{{ $user->userloc->name }}</td>
        -                    </tr>
        -                    @endif
        -                    @if ($user->created_at)
        -                        <tr>
        -                            <td>{{ trans('general.created_at') }}</td>
        -                            <td>
        -                                {{ $user->created_at->format('F j, Y h:iA') }}
        -                            </td>
        -                        </tr>
        -                    @endif
        +                  @if ($user->phone)
        +                  <tr>
        +                    <td>{{ trans('admin/users/table.phone') }}</td>
        +                    <td>{{ $user->phone }}</td>
        +                  </tr>
        +                  @endif
         
        -                  </table>
        -                </div>
        +                  @if ($user->userloc)
        +                  <tr>
        +                    <td>{{ trans('admin/users/table.location') }}</td>
        +                    <td>{{ link_to_route('locations.show', $user->userloc->name, [$user->userloc->id]) }}</td>
        +
        +
        +                  </tr>
        +                  @endif
        +                  @if ($user->created_at)
        +                  <tr>
        +                    <td>{{ trans('general.created_at') }}</td>
        +                    <td>{{ $user->created_at->format('F j, Y h:iA') }}</td>
        +                  </tr>
        +                  @endif
        +                </table>
                       </div>
        +            </div> <!--/col-md-8-->
         
        -              <!-- Start button column -->
        -              <div class="col-md-2">
        -                  @can('users.edit')
        -                  <div class="col-md-12">
        -
        -                      <a href="{{ route('update/user', $user->id) }}" style="width: 100%;" class="btn btn-sm btn-default">{{ trans('admin/users/general.edit') }}</a>
        -                  </div>
        -                  <div class="col-md-12" style="padding-top: 5px;">
        -                      <a href="{{ route('clone/user', $user->id) }}" style="width: 100%;" class="btn btn-sm btn-default">{{ trans('admin/users/general.clone') }}</a>
        -                  </div>
        -
        -
        -                  @if ((Auth::user()->id !== $user->id) && (!config('app.lock_passwords')))
        -
        -                    @if ($user->deleted_at=='')
        -                        <div class="col-md-12" style="padding-top: 5px;">
        -                            <a href="{{ route('delete/user', $user->id) }}" style="width: 100%;" class="btn btn-sm btn-warning">{{ trans('button.delete') }}</a>
        -                        </div>
        -                        <div class="col-md-12" style="padding-top: 5px;">
        -                            <form action="{{ route('users/bulkedit') }}" method="POST">
        -                                <!-- CSRF Token -->
        -                                <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        -                                <input type="hidden" name="edit_user[{{ $user->id }}]" value="{{ $user->id }}" />
        -                                <button style="width: 100%;" class="btn btn-sm btn-danger">{{ trans('button.checkin_and_delete') }}</button>
        -                            </form>
        -                        </div>
        -                    @else
        -                        <div class="col-md-12" style="padding-top: 5px;">
        -                            <a href="{{ route('restore/user', $user->id) }}" style="width: 100%;" class="btn btn-sm btn-warning">{{ trans('button.restore') }}</a>
        -                        </div>
        -                    @endif
        -
        +            <!-- Start button column -->
        +            <div class="col-md-2">
        +              @can('update', $user)
        +                <div class="col-md-12">
        +                  <a href="{{ route('users.edit', $user->id) }}" style="width: 100%;" class="btn btn-sm btn-default hidden-print">{{ trans('admin/users/general.edit') }}</a>
        +                </div>
        +                <div class="col-md-12" style="padding-top: 5px;">
        +                  <a href="{{ route('clone/user', $user->id) }}" style="width: 100%;" class="btn btn-sm btn-default hidden-print">{{ trans('admin/users/general.clone') }}</a>
        +                </div>
        +                @can('delete', $user)
        +                  @if ($user->deleted_at=='')
        +                    <div class="col-md-12" style="padding-top: 5px;">
        +                      <form action="{{route('users.destroy',$user->id)}}" method="POST">
        +                        {{csrf_field()}}
        +                        {{ method_field("DELETE")}}
        +                        <button style="width: 100%;" class="btn btn-sm btn-warning hidden-print">{{ trans('button.delete')}}</button>
        +                      </form>
        +                    </div>
        +                    <div class="col-md-12" style="padding-top: 5px;">
        +                      <form action="{{ route('users/bulkedit') }}" method="POST">
        +                        <!-- CSRF Token -->
        +                        <input type="hidden" name="_token" value="{{ csrf_token() }}" />
        +                        <input type="hidden" name="edit_user[{{ $user->id }}]" value="{{ $user->id }}" />
        +                        <button style="width: 100%;" class="btn btn-sm btn-danger hidden-print">{{ trans('button.checkin_and_delete') }}</button>
        +                      </form>
        +                    </div>
        +                  @else
        +                    <div class="col-md-12" style="padding-top: 5px;">
        +                      <a href="{{ route('restore/user', $user->id) }}" style="width: 100%;" class="btn btn-sm btn-warning hidden-print">{{ trans('button.restore') }}</a>
        +                    </div>
                           @endif
                         @endcan
        -              </div>
        -              <!-- End button column -->
        +              @endcan
        +            </div>
        +            <!-- End button column -->
        +          </div> <!--/.row-->
        +        </div><!-- /.tab-pane -->
         
        +        <div class="tab-pane" id="asset_tab">
        +          <!-- checked out assets table -->
        +          <div class="table-responsive">
        +            <table class="display table table-striped">
        +              <thead>
        +                <tr>
        +                  <th class="col-md-3">{{ trans('admin/hardware/table.asset_model') }}</th>
        +                  <th class="col-md-2">{{ trans('admin/hardware/table.asset_tag') }}</th>
        +                  <th class="col-md-2">{{ trans('general.name') }}</th>
        +                  <th class="col-md-1 hidden-print">{{ trans('general.action') }}</th>
        +                </tr>
        +              </thead>
        +              <tbody>
        +                @foreach ($user->assets as $asset)
        +                <tr>
        +                  <td>
        +                    @if ($asset->physical=='1')
        +                      <a href="{{ route('models.show', $asset->model->id) }}">{{ $asset->model->name }}</a>
        +                    @endif
        +                  </td>
        +                  <td>
        +                    @can('view', $asset)
        +                      <a href="{{ route('hardware.show', $asset->id) }}">{{ $asset->asset_tag }}</a>
        +                    @endcan
        +                  </td>
        +                  <td>{!! $asset->present()->nameUrl() !!}</td>
        +                  <td class="hidden-print">
        +                    @can('checkin', $asset)
        +                      <a href="{{ route('checkin/hardware', array('assetId'=> $asset->id, 'backto'=>'user')) }}" class="btn btn-primary btn-sm hidden-print">{{ trans('general.checkin') }}</a>
        +                    @endcan
        +                  </td>
        +                </tr>
        +                @endforeach
        +              </tbody>
        +            </table>
        +          </div>
        +        </div><!-- /asset_tab -->
        +
        +        <div class="tab-pane" id="licenses_tab">
        +          <div class="table-responsive">
        +            <table class="display table table-hover">
        +              <thead>
        +                <tr>
        +                  <th class="col-md-5">{{ trans('general.name') }}</th>
        +                  <th class="col-md-6">{{ trans('admin/hardware/form.serial') }}</th>
        +                  <th class="col-md-1 hidden-print">{{ trans('general.action') }}</th>
        +                </tr>
        +              </thead>
        +              <tbody>
        +                @foreach ($user->licenses as $license)
        +                <tr>
        +                  <td>
        +                    {!! $license->present()->nameUrl() !!}
        +                  </td>
        +                  <td>
        +                    {!! $license->present()->serialUrl() !!}
        +                  </td>
        +                  <td class="hidden-print">
        +                    @can('update', $license)
        +                      <a href="{{ route('licenses.checkin', array('licenseseat_id'=> $license->pivot->id, 'backto'=>'user')) }}" class="btn btn-primary btn-sm hidden-print">{{ trans('general.checkin') }}</a>
        +                     @endcan
        +                  </td>
        +                </tr>
        +                @endforeach
        +              </tbody>
        +          </table>
        +          </div>
        +        </div><!-- /licenses-tab -->
        +
        +        <div class="tab-pane" id="accessories_tab">
        +          <div class="table-responsive">
        +            <table class="display table table-hover">
        +              <thead>
        +                <tr>
        +                  <th class="col-md-5">{{ trans('general.name') }}</th>
        +                  <th class="col-md-1 hidden-print">{{ trans('general.action') }}</th>
        +                </tr>
        +              </thead>
        +              <tbody>
        +                  @foreach ($user->accessories as $accessory)
        +                  <tr>
        +                    <td>{!!$accessory->present()->nameUrl()!!}</td>
        +                    <td class="hidden-print">
        +                      @can('checkin', $accessory)
        +                        <a href="{{ route('checkin/accessory', array('accessory_id'=> $accessory->pivot->id, 'backto'=>'user')) }}" class="btn btn-primary btn-sm hidden-print">{{ trans('general.checkin') }}</a>
        +                      @endcan
        +                    </td>
        +                  </tr>
        +                  @endforeach
        +              </tbody>
        +            </table>
        +          </div>
        +        </div><!-- /accessories-tab -->
        +
        +        <div class="tab-pane" id="consumables_tab">
        +          <div class="table-responsive">
        +            <table class="display table table-striped">
        +              <thead>
        +                <tr>
        +                  <th class="col-md-8">{{ trans('general.name') }}</th>
        +                  <th class="col-md-4">{{ trans('general.date') }}</th>
        +                </tr>
        +              </thead>
        +              <tbody>
        +                @foreach ($user->consumables as $consumable)
        +                <tr>
        +                  <td>{!! $consumable->present()->nameUrl() !!}</a></td>
        +                  <td>{{ $consumable->created_at }}</td>
        +                </tr>
        +                @endforeach
        +              </tbody>
        +          </table>
        +          </div>
        +        </div><!-- /consumables-tab -->
        +
        +        <div class="tab-pane" id="files_tab">
        +          <div class="row">
        +            <div class="col-md-12 col-sm-12">
        +              <p>{{ trans('admin/hardware/general.filetype_info') }}</p>
        +            </div>
        +            <div class="col-md-2">
        +              <!-- The fileinput-button span is used to style the file input field as button -->
        +              @can('update', $user)
        +              <span class="btn btn-info fileinput-button hidden-print">
        +                <i class="fa fa-plus icon-white"></i>
        +                <span>{{ trans('button.select_file') }}</span>
        +                <!-- The file input field used as target for the file upload widget -->
        +                <input id="fileupload" type="file" name="file[]" data-url="{{ route('upload/user', $user->id) }}">
        +              </span>
        +              @endcan
        +            </div>
        +            <div class="col-md-4">
        +              <input id="notes" type="text" name="notes">
        +            </div>
        +            <div class="col-md-6" id="progress-container" style="visibility: hidden; padding-bottom: 20px;">
        +              <!-- The global progress bar -->
        +              <div class="col-md-11">
        +                <div id="progress" class="progress progress-striped active" style="margin-top: 8px;">
        +                  <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" style="width: 45%">
        +                      <span id="progress-bar-text">0% {{ trans('general.complete') }}</span>
        +                  </div>
        +                </div>
        +              </div>
        +              <div class="col-md-1">
        +                  <div class="pull-right progress-checkmark" style="display: none;">
        +                  </div>
        +              </div>
                     </div>
         
        +            <link rel="stylesheet" type="text/css" href="{{ asset('css/lib/jquery.fileupload.css') }}">
        +            <link rel="stylesheet" type="text/css" href="{{ asset('css/lib/jquery.fileupload-ui.css') }}">
         
        -
        -          </div><!-- /.tab-pane -->
        -          <div class="tab-pane" id="asset_tab">
        -            <!-- checked out assets table -->
        +            <div class="col-md-12 col-sm-12">
                       <div class="table-responsive">
                         <table class="display table table-striped">
                           <thead>
                             <tr>
        -                      <th class="col-md-3">{{ trans('admin/hardware/table.asset_model') }}</th>
        -                      <th class="col-md-2">{{ trans('admin/hardware/table.asset_tag') }}</th>
        -                      <th class="col-md-2">{{ trans('general.name') }}</th>
        -                      <th class="col-md-1 hidden-print">{{ trans('general.action') }}</th>
        +                      <th class="col-md-5">{{ trans('general.notes') }}</th>
        +                      <th class="col-md-5"><span class="line"></span>{{ trans('general.file_name') }}</th>
        +                      <th class="col-md-2"></th>
        +                      <th class="col-md-2"></th>
                             </tr>
                           </thead>
                           <tbody>
        -                    @foreach ($user->assets as $asset)
        +                    @foreach ($user->uploads as $file)
                             <tr>
                               <td>
        -                      @if ($asset->physical=='1') {{ $asset->model->name }}
        -                      @endif
        +                        @if ($file->note)
        +                        {{ $file->note }}
        +                        @endif
                               </td>
                               <td>
        -                          @can('assets.view')
        -                              <a href="{{ route('view/hardware', $asset->id) }}">{{ $asset->asset_tag }}</a>
        -                          @endcan
        +                      {{ $file->filename }}
                               </td>
        -                      <td><a href="{{ route('view/hardware', $asset->id) }}">{{ $asset->name }}</a></td>
        -
        -                      <td class="hidden-print">
        -                          @can('assets.edit')
        -                              <a href="{{ route('checkin/hardware', array('assetId'=> $asset->id, 'backto'=>'user')) }}" class="btn btn-primary btn-sm">Checkin</a>
        -                          @endcan
        +                      <td>
        +                        @if ($file->filename)
        +                        <a href="{{ route('show/userfile', [$user->id, $file->id]) }}" class="btn btn-default">{{ trans('general.download') }}</a>
        +                        @endif
        +                      </td>
        +                      <td>
        +                        @can('update', $user)
        +                        <a class="btn delete-asset btn-danger btn-sm hidden-print" href="{{ route('delete/userfile', [$user->id, $file->id]) }}" data-content="Are you sure you wish to delete this file?" data-title="Delete {{ $file->filename }}?"><i class="fa fa-trash icon-white"></i></a>
        +                        @endcan
                               </td>
                             </tr>
                             @endforeach
                           </tbody>
                         </table>
                       </div>
        -          </div><!-- /.tab-pane -->
        -          <div class="tab-pane" id="licenses_tab">
        -            <div class="table-responsive">
        -              <table class="display table table-hover">
        -                <thead>
        -                  <tr>
        -                    <th class="col-md-5">{{ trans('general.name') }}</th>
        -                    <th class="col-md-6">{{ trans('admin/hardware/form.serial') }}</th>
        -                    <th class="col-md-1 hidden-print">{{ trans('general.action') }}</th>
        -                  </tr>
        -                </thead>
        -                <tbody>
        -                  @foreach ($user->licenses as $license)
        -                  <tr>
        -                    <td>
        -                            <a href="{{ route('view/license', $license->id) }}">{{ $license->name }}</a>
        +            </div>
        +          </div> <!--/ROW-->
        +        </div><!--/FILES_TAB-->
         
        -                    </td>
        -                    <td><a href="{{ route('view/license', $license->id) }}">{{ mb_strimwidth($license->serial, 0, 50, "...") }}</a></td>
        -                    <td class="hidden-print">
        -                        @can('licenses.edit')
        -                            <a href="{{ route('checkin/license', array('licenseseat_id'=> $license->pivot->id, 'backto'=>'user')) }}" class="btn btn-primary btn-sm">Checkin</a>
        -                         @endcan
        -                    </td>
        -                  </tr>
        -                  @endforeach
        -                </tbody>
        +        <div class="tab-pane" id="history_tab">
        +          <div class="table-responsive">
        +
        +            <table
        +                    class="table table-striped snipe-table"
        +                    name="userActivityReport"
        +                    id="table4
        +                    data-sort-order="desc"
        +                    data-url="{{ route('api.activity.index', ['target_id' => $user->id, 'target_type' => 'user']) }}">
        +              <thead>
        +              <tr>
        +                <th data-field="icon" style="width: 40px;" class="hidden-xs" data-formatter="iconFormatter"></th>
        +                <th class="col-sm-3" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.date') }}</th>
        +                <th class="col-sm-2" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
        +                <th class="col-sm-2" data-field="action_type">{{ trans('general.action') }}</th>
        +                <th class="col-sm-3" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
        +                <th class="col-sm-2" data-field="target" data-formatter="polymorphicItemFormatter">{{ trans('general.target') }}</th>
        +              </tr>
        +              </thead>
                     </table>
        -            </div>
        -          </div><!-- /.tab-pane -->
        -          <div class="tab-pane" id="accessories_tab">
        -            <div class="table-responsive">
        -              <table class="display table table-hover">
        -                <thead>
        -                    <tr>
        -                        <th class="col-md-5">Name</th>
        -                        <th class="col-md-1 hidden-print">Actions</th>
        -                    </tr>
        -                </thead>
        -                <tbody>
        -                    @foreach ($user->accessories as $accessory)
        -                    <tr>
        -                        <td><a href="{{ route('view/accessory', $accessory->id) }}">{{ $accessory->name }}</a></td>
        -                        <td class="hidden-print">
        -                            @can('accessories.edit')
        -                                <a href="{{ route('checkin/accessory', array('accessory_id'=> $accessory->pivot->id, 'backto'=>'user')) }}" class="btn btn-primary btn-sm">Checkin</a>
        -                            @endcan
        -                        </td>
        -                    </tr>
        -                    @endforeach
        -                </tbody>
        -              </table>
        -            </div>
        -          </div><!-- /.tab-pane -->
        -          <div class="tab-pane" id="consumables_tab">
        -            <div class="table-responsive">
        -              <table class="display table table-striped">
        -                <thead>
        -                    <tr>
        -                        <th class="col-md-8">{{ trans('general.name') }}</th>
        -                        <th class="col-md-4">{{ trans('general.date') }}</th>
        -                    </tr>
        -                </thead>
        -                <tbody>
        -                    @foreach ($user->consumables as $consumable)
        -                    <tr>
        -                        <td><a href="{{ route('view/consumable', $consumable->id) }}">{{ $consumable->name }}</a></td>
        -                        <td>{{ $consumable->created_at }}</td>
        -                    </tr>
        -                    @endforeach
        -                </tbody>
        -            </table>
        -            </div>
        -          </div><!-- /.tab-pane -->
        -          <div class="tab-pane" id="files_tab">
         
        -            <div class="row">
        -            <div class="col-md-12 col-sm-12">
        -              <p>{{ trans('admin/hardware/general.filetype_info') }}</p>
        -            </div>
        -            <div class="col-md-2">
        -            <!-- The fileinput-button span is used to style the file input field as button -->
        -                @can('users.edit')
        -                    <span class="btn btn-info fileinput-button">
        -                    <i class="fa fa-plus icon-white"></i>
        -                    <span>Select File...</span>
        -                    <!-- The file input field used as target for the file upload widget -->
        -                    <input id="fileupload" type="file" name="file[]" data-url="{{ config('app.url') }}/api/users/{{ $user->id }}/upload">
        +          </div>
        +        </div><!-- /.tab-pane -->
         
        -                </span>
        -                    @endcan
        -
        -            </div>
        -            <div class="col-md-4">
        -              <input id="notes" type="text" name="notes">
        -            </div>
        -
        -            <div class="col-md-6" id="progress-container" style="visibility: hidden; padding-bottom: 20px;">
        -                <!-- The global progress bar -->
        -                <div class="col-md-11">
        -                    <div id="progress" class="progress progress-striped active" style="margin-top: 8px;">
        -                        <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" style="width: 45%">
        -                            <span id="progress-bar-text">0% Complete</span>
        -                        </div>
        -                    </div>
        -                </div>
        -                <div class="col-md-1">
        -                    <div class="pull-right progress-checkmark" style="display: none;">
        -                    </div>
        -                </div>
        -            </div>
        -
        -
        -            <link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/jquery.fileupload.css') }}">
        -            <link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/jquery.fileupload-ui.css') }}">
        -
        -
        -            <div class="col-md-12 col-sm-12">
        -
        -              <div class="table-responsive">
        -                <table class="display table table-striped">
        -                    <thead>
        -                        <tr>
        -                          <th class="col-md-5">{{ trans('general.notes') }}</th>
        -                          <th class="col-md-5"><span class="line"></span>{{ trans('general.file_name') }}</th>
        -                          <th class="col-md-2"></th>
        -                          <th class="col-md-2"></th>
        -                        </tr>
        -                    </thead>
        -                    <tbody>
        -                      @foreach ($user->uploads as $file)
        -                      <tr>
        -                          <td>
        -                            @if ($file->note) {{ $file->note }}
        -                            @endif
        -                          </td>
        -                          <td>
        -                          {{ $file->filename }}
        -                          </td>
        -                          <td>
        -                            @if ($file->filename)
        -                            <a href="{{ route('show/userfile', [$user->id, $file->id]) }}" class="btn btn-default">Download</a>
        -                            @endif
        -                          </td>
        -                          <td>
        -                              @can('users.edit')
        -                            <a class="btn delete-asset btn-danger btn-sm" href="{{ route('delete/userfile', [$user->id, $file->id]) }}" data-content="Are you sure you wish to delete this file?" data-title="Delete {{ $file->filename }}?"><i class="fa fa-trash icon-white"></i></a>
        -                              @endcan
        -                          </td>
        -                      </tr>
        -                      @endforeach
        -
        -                    </tbody>
        -                  </table>
        -                </div>
        -              </div>
        -            </div>
        -
        -
        -
        -          </div><!-- /.tab-pane -->
        -          <div class="tab-pane" id="history_tab">
        -            <div class="table-responsive">
        -            <table class="table table-striped" id="example">
        +        <div class="tab-pane" id="managed_tab">
        +          <div class="table-responsive">
        +            <table class="display table table-striped">
                       <thead>
                         <tr>
        -                  <th class="col-md-1"></th>
        -                  <th class="col-md-2">Date</th>
        -                  <th class="col-md-2"><span class="line"></span>{{ trans('table.action') }}</th>
        -                  <th class="col-md-3"><span class="line"></span>{{ trans('general.asset') }}</th>
        -                  <th class="col-md-2"><span class="line"></span>{{ trans('table.by') }}</th>
        +                  <th class="col-md-8">{{ trans('general.name') }}</th>
        +                  <th class="col-md-4">{{ trans('general.date') }}</th>
                         </tr>
        -                </thead>
        -                <tbody>
        -                    @foreach ($userlog as $log)
        -                    <tr>
        -                      <td class="text-center">
        -                        @if ($log->itemType()=="asset")
        -                          <i class="fa fa-barcode"></i>
        -                        @elseif ($log->itemType()=="accessory")
        -                          <i class="fa fa-keyboard-o"></i>
        -                        @elseif ($log->itemType()=="consumable")
        -                          <i class="fa fa-tint"></i>
        -                        @elseif ($log->itemType()=="license")
        -                          <i class="fa fa-floppy-o"></i>
        -                        @else
        -                          <i class="fa fa-times"></i>
        -                        @endif
        -
        -                      </td>
        -                      <td>{{ $log->created_at }}</td>
        -                      <td>{{ $log->action_type }}</td>
        -                      <td>
        -
        -                        @if (($log->item) && ($log->itemType()=="asset"))
        -                            <a href="{{ route('view/hardware', $log->item_id) }}">{{ $log->item->asset_tag }} - {{ $log->item->showAssetName() }}</a>
        -                        @elseif ($log->item)
        -                            <a href="{{ route('view/'. $log->itemType(), $log->item_id) }}">{{ $log->item->name }}</a>
        -                        @else
        -                            {{ trans('general.bad_data') }}
        -                        @endif
        -
        -                        </td>
        -                        <td>
        -                           @if ($log->action_type != 'requested')
        -                                @if (isset($log->user))
        -                                    <a href="{{route('view/user', $log->user_id)}}">{{ $log->user->fullName() }}</a>
        -                                @else
        -                                    Deleted Admin
        -                                @endif
        -                            @endif
        -                    </tr>
        -                    @endforeach
        -                </tbody>
        -            </table>
        -            </div>
        -          </div><!-- /.tab-pane -->
        -        </div><!-- /.tab-content -->
        -      </div><!-- nav-tabs-custom -->
        -
        -    </div>
        +              </thead>
        +              <tbody>
        +                @foreach ($user->managedLocations as $location)
        +                <tr>
        +                  <td>{!! $location->present()->nameUrl() !!}</a></td>
        +                  <td>{{ $location->created_at }}</td>
        +                </tr>
        +                @endforeach
        +              </tbody>
        +          </table>
        +          </div>
        +        </div><!-- /consumables-tab -->
        +      </div><!-- /.tab-content -->
        +    </div><!-- nav-tabs-custom -->
           </div>
        +</div>
        +
        +@stop
         
         @section('moar_scripts')
        +  @include ('partials.bootstrap-table', ['simple_view' => true])
         <script>
         $(function () {
             //binds to onchange event of your input field
        @@ -476,7 +535,7 @@ $(function () {
                         $('.progress-bar-text').html('Finished!');
                         $('.progress-checkmark').fadeIn('fast').html('<i class="fa fa-check fa-3x icon-white" style="color: green"></i>');
                         $.each(data.result.file, function (index, file) {
        -                    $('<tr><td>' + file.notes + '</td><<td>' + file.name + '</td><td>Just now</td><td>' + file.filesize + '</td><td><a class="btn btn-info btn-sm" href="import/process/' + file.name + '"><i class="fa fa-spinner process"></i> Process</a></td></tr>').prependTo("#upload-table > tbody");
        +                    $('<tr><td>' + file.notes + '</td><<td>' + file.name + '</td><td>Just now</td><td>' + file.filesize + '</td><td><a class="btn btn-info btn-sm hidden-print" href="import/process/' + file.name + '"><i class="fa fa-spinner process"></i> Process</a></td></tr>').prependTo("#upload-table > tbody");
                             //$('<tr><td>').text(file.name).appendTo(document.body);
                         });
                     }
        @@ -488,6 +547,5 @@ $(function () {
         });
         </script>
         
        -@stop
         
         @stop
        diff --git a/resources/views/vendor/maintenancemode/app-down.blade.php b/resources/views/vendor/maintenancemode/app-down.blade.php
        index 32841f85b5..17b1e89cad 100644
        --- a/resources/views/vendor/maintenancemode/app-down.blade.php
        +++ b/resources/views/vendor/maintenancemode/app-down.blade.php
        @@ -4,7 +4,6 @@
             <meta charset="utf-8">
             <meta name="viewport" content="width=device-width, initial-scale=1.0">
             <meta name="robots" content="noindex,nofollow">
        -    <link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
             <title>{{ Lang::get(Config::get('maintenancemode.language-path', 'maintenancemode::defaults.') . '.title') }}</title>
             <style>
                 html, body {
        @@ -16,7 +15,11 @@
                     -webkit-transform-style: preserve-3d;
                     -moz-transform-style: preserve-3d;
                     transform-style: preserve-3d;
        -            font-family: 'Open Sans', sans-serif;
        +            font-family: -apple-system, BlinkMacSystemFont,
        +            "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell",
        +            "Fira Sans", "Droid Sans", "Helvetica Neue",
        +            sans-serif;
        +
                 }
                 header {
                     width: 80%;
        diff --git a/resources/views/vendor/notifications/email-plain.blade.php b/resources/views/vendor/notifications/email-plain.blade.php
        new file mode 100644
        index 0000000000..a128f85ae3
        --- /dev/null
        +++ b/resources/views/vendor/notifications/email-plain.blade.php
        @@ -0,0 +1,26 @@
        +<?php
        +
        +if (! empty($greeting)) {
        +    echo $greeting, "\n\n";
        +} else {
        +    echo $level == 'error' ? 'Whoops!' : 'Hello!', "\n\n";
        +}
        +
        +if (! empty($introLines)) {
        +    echo implode("\n", $introLines), "\n\n";
        +}
        +
        +if (isset($actionText)) {
        +    echo "{$actionText}: {$actionUrl}", "\n\n";
        +}
        +
        +if (! empty($outroLines)) {
        +    echo implode("\n", $outroLines), "\n\n";
        +}
        +
        +if (! empty($signOff)) {
        +    echo implode("\n", $signOff), "\n";
        +}
        +if (! empty($siteName)) {
        +    echo implode("\n", $siteName), "\n";
        +}
        diff --git a/resources/views/vendor/notifications/email.blade.php b/resources/views/vendor/notifications/email.blade.php
        new file mode 100644
        index 0000000000..039b33a396
        --- /dev/null
        +++ b/resources/views/vendor/notifications/email.blade.php
        @@ -0,0 +1,196 @@
        +<!DOCTYPE html>
        +<html>
        +
        +<head>
        +    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        +    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        +
        +    <style type="text/css" rel="stylesheet" media="all">
        +        /* Media Queries */
        +        @media only screen and (max-width: 500px) {
        +            .button {
        +                width: 100% !important;
        +            }
        +        }
        +    </style>
        +</head>
        +
        +<?php
        +
        +$style = [
        +    /* Layout ------------------------------ */
        +
        +    'body' => 'margin: 0; padding: 0; width: 100%; background-color: #F2F4F6;',
        +    'email-wrapper' => 'width: 100%; margin: 0; padding: 0; background-color: #F2F4F6;',
        +
        +    /* Masthead ----------------------- */
        +
        +    'email-masthead' => 'padding: 25px 0; text-align: left;',
        +    'email-masthead_name' => 'font-size: 16px; font-weight: bold; color: #2F3133; text-decoration: none; text-shadow: 0 1px 0 white;',
        +
        +    'email-body' => 'width: 100%; margin: 0; padding: 0; border-top: 1px solid #EDEFF2; border-bottom: 1px solid #EDEFF2; background-color: #FFF;',
        +    'email-body_inner' => 'width: auto; max-width: 570px; margin: 0 auto; padding: 0;',
        +    'email-body_cell' => 'padding: 35px;',
        +
        +    'email-footer' => 'width: auto; max-width: 570px; margin: 0 auto; padding: 0; text-align: center;',
        +    'email-footer_cell' => 'color: #AEAEAE; padding: 35px; text-align: center;',
        +
        +    /* Body ------------------------------ */
        +
        +    'body_action' => 'width: 100%; margin: 30px auto; padding: 0; text-align: center;',
        +    'body_sub' => 'margin-top: 25px; padding-top: 25px; border-top: 1px solid #EDEFF2;',
        +
        +    /* Type ------------------------------ */
        +
        +    'anchor' => 'color: #3869D4;',
        +    'header-1' => 'margin-top: 0; color: #2F3133; font-size: 19px; font-weight: bold; text-align: left;',
        +    'paragraph' => 'margin-top: 0; color: #000000; font-size: 16px; line-height: 1.5em;',
        +    'paragraph-sub' => 'margin-top: 0; color: #74787E; font-size: 12px; line-height: 1.5em;',
        +    'paragraph-center' => 'text-align: center;',
        +
        +    /* Buttons ------------------------------ */
        +
        +    'button' => 'display: block; display: inline-block; width: 200px; min-height: 20px; padding: 10px;
        +                 background-color: #3869D4; border-radius: 3px; color: #ffffff; font-size: 15px; line-height: 25px;
        +                 text-align: center; text-decoration: none; -webkit-text-size-adjust: none;',
        +
        +    'button--green' => 'background-color: #22BC66;',
        +    'button--red' => 'background-color: #dc4d2f;',
        +    'button--blue' => 'background-color: #3869D4;',
        +];
        +?>
        +
        +<?php $fontFamily = 'font-family: Arial, \'Helvetica Neue\', Helvetica, sans-serif;'; ?>
        +
        +<body style="{{ $style['body'] }}">
        +    <table width="100%" cellpadding="0" cellspacing="0">
        +        <tr>
        +            <td style="{{ $style['email-wrapper'] }}" align="center">
        +                <table width="100%" cellpadding="0" cellspacing="0">
        +                    <!-- Logo -->
        +                    <tr>
        +                        <td style="{{ $style['email-masthead'] }}">
        +
        +                            @if ($snipeSettings->logo)
        +                                <img src="{{ url('/') }}/{{ $snipeSettings->logo }}">
        +                            @endif
        +                            <a style="{{ $fontFamily }} {{ $style['email-masthead_name'] }}" href="{{ url('/') }}" target="_blank">
        +                                {{ $snipeSettings->site_name }}
        +                            </a>
        +                        </td>
        +                    </tr>
        +
        +                    <!-- Email Body -->
        +                    <tr>
        +                        <td style="{{ $style['email-body'] }}" width="100%">
        +                            <table style="{{ $style['email-body_inner'] }}" align="center" width="570" cellpadding="0" cellspacing="0">
        +                                <tr>
        +                                    <td style="{{ $fontFamily }} {{ $style['email-body_cell'] }}">
        +                                        <!-- Greeting -->
        +                                        <h1 style="{{ $style['header-1'] }}">
        +                                            @if (! empty($greeting))
        +                                                {{ $greeting }}
        +                                            @else
        +                                                @if ($level == 'error')
        +                                                    Whoops!
        +                                                @else
        +                                                    Hello!
        +                                                @endif
        +                                            @endif
        +                                        </h1>
        +
        +                                        <!-- Intro -->
        +                                        @foreach ($introLines as $line)
        +                                            <p style="{{ $style['paragraph'] }}">
        +                                                {{ $line }}
        +                                            </p>
        +                                        @endforeach
        +
        +                                        <!-- Action Button -->
        +                                        @if (isset($actionText))
        +                                            <table style="{{ $style['body_action'] }}" align="center" width="100%" cellpadding="0" cellspacing="0">
        +                                                <tr>
        +                                                    <td align="center">
        +                                                        <?php
        +                                                        switch ($level) {
        +                                                            case 'success':
        +                                                                $actionColor = 'button--green';
        +                                                                break;
        +                                                            case 'error':
        +                                                                $actionColor = 'button--red';
        +                                                                break;
        +                                                            default:
        +                                                                $actionColor = 'button--blue';
        +                                                        }
        +                                                        ?>
        +
        +                                                        <a href="{{ $actionUrl }}"
        +                                                            style="{{ $fontFamily }} {{ $style['button'] }} {{ $style[$actionColor] }}"
        +                                                            class="button"
        +                                                            target="_blank">
        +                                                            {{ $actionText }}
        +                                                        </a>
        +                                                    </td>
        +                                                </tr>
        +                                            </table>
        +                                        @endif
        +
        +                                        <!-- Outro -->
        +                                        @foreach ($outroLines as $line)
        +                                            <p style="{{ $style['paragraph'] }}">
        +                                                {{ $line }}
        +                                            </p>
        +                                        @endforeach
        +
        +                                        <!-- Salutation -->
        +                                        <p style="{{ $style['paragraph'] }}">
        +                                            Regards,<br>{{ $snipeSettings->site_name }}
        +                                        </p>
        +
        +                                        <!-- Sub Copy -->
        +                                        @if (isset($actionText))
        +                                            <table style="{{ $style['body_sub'] }}">
        +                                                <tr>
        +                                                    <td style="{{ $fontFamily }}">
        +                                                        <p style="{{ $style['paragraph-sub'] }}">
        +                                                            If you’re having trouble clicking the "{{ $actionText }}" button,
        +                                                            copy and paste the URL below into your web browser:
        +                                                        </p>
        +
        +                                                        <p style="{{ $style['paragraph-sub'] }}">
        +                                                            <a style="{{ $style['anchor'] }}" href="{{ $actionUrl }}" target="_blank">
        +                                                                {{ $actionUrl }}
        +                                                            </a>
        +                                                        </p>
        +                                                    </td>
        +                                                </tr>
        +                                            </table>
        +                                        @endif
        +                                    </td>
        +                                </tr>
        +                            </table>
        +                        </td>
        +                    </tr>
        +
        +                    <!-- Footer -->
        +                    <tr>
        +                        <td>
        +                            <table style="{{ $style['email-footer'] }}" align="center" width="570" cellpadding="0" cellspacing="0">
        +                                <tr>
        +                                    <td style="{{ $fontFamily }} {{ $style['email-footer_cell'] }}">
        +                                        <p style="{{ $style['paragraph-sub'] }}">
        +                                            &copy; {{ date('Y') }}
        +                                            <a style="{{ $style['anchor'] }}" href="{{ url('/') }}" target="_blank">{{ $snipeSettings->site_name }}</a>.
        +                                            All rights reserved.
        +                                        </p>
        +                                    </td>
        +                                </tr>
        +                            </table>
        +                        </td>
        +                    </tr>
        +                </table>
        +            </td>
        +        </tr>
        +    </table>
        +</body>
        +</html>
        diff --git a/resources/views/vendor/pagination/bootstrap-4.blade.php b/resources/views/vendor/pagination/bootstrap-4.blade.php
        new file mode 100644
        index 0000000000..3f984557b4
        --- /dev/null
        +++ b/resources/views/vendor/pagination/bootstrap-4.blade.php
        @@ -0,0 +1,36 @@
        +@if ($paginator->hasPages())
        +    <ul class="pagination">
        +        {{-- Previous Page Link --}}
        +        @if ($paginator->onFirstPage())
        +            <li class="page-item disabled"><span class="page-link">&laquo;</span></li>
        +        @else
        +            <li class="page-item"><a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</a></li>
        +        @endif
        +
        +        {{-- Pagination Elements --}}
        +        @foreach ($elements as $element)
        +            {{-- "Three Dots" Separator --}}
        +            @if (is_string($element))
        +                <li class="page-item disabled"><span class="page-link">{{ $element }}</span></li>
        +            @endif
        +
        +            {{-- Array Of Links --}}
        +            @if (is_array($element))
        +                @foreach ($element as $page => $url)
        +                    @if ($page == $paginator->currentPage())
        +                        <li class="page-item active"><span class="page-link">{{ $page }}</span></li>
        +                    @else
        +                        <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
        +                    @endif
        +                @endforeach
        +            @endif
        +        @endforeach
        +
        +        {{-- Next Page Link --}}
        +        @if ($paginator->hasMorePages())
        +            <li class="page-item"><a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">&raquo;</a></li>
        +        @else
        +            <li class="page-item disabled"><span class="page-link">&raquo;</span></li>
        +        @endif
        +    </ul>
        +@endif
        diff --git a/resources/views/vendor/pagination/default.blade.php b/resources/views/vendor/pagination/default.blade.php
        new file mode 100644
        index 0000000000..4e795ff41a
        --- /dev/null
        +++ b/resources/views/vendor/pagination/default.blade.php
        @@ -0,0 +1,36 @@
        +@if ($paginator->hasPages())
        +    <ul class="pagination">
        +        {{-- Previous Page Link --}}
        +        @if ($paginator->onFirstPage())
        +            <li class="disabled"><span>&laquo;</span></li>
        +        @else
        +            <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</a></li>
        +        @endif
        +
        +        {{-- Pagination Elements --}}
        +        @foreach ($elements as $element)
        +            {{-- "Three Dots" Separator --}}
        +            @if (is_string($element))
        +                <li class="disabled"><span>{{ $element }}</span></li>
        +            @endif
        +
        +            {{-- Array Of Links --}}
        +            @if (is_array($element))
        +                @foreach ($element as $page => $url)
        +                    @if ($page == $paginator->currentPage())
        +                        <li class="active"><span>{{ $page }}</span></li>
        +                    @else
        +                        <li><a href="{{ $url }}">{{ $page }}</a></li>
        +                    @endif
        +                @endforeach
        +            @endif
        +        @endforeach
        +
        +        {{-- Next Page Link --}}
        +        @if ($paginator->hasMorePages())
        +            <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">&raquo;</a></li>
        +        @else
        +            <li class="disabled"><span>&raquo;</span></li>
        +        @endif
        +    </ul>
        +@endif
        diff --git a/resources/views/vendor/pagination/simple-bootstrap-4.blade.php b/resources/views/vendor/pagination/simple-bootstrap-4.blade.php
        new file mode 100644
        index 0000000000..98653d31ae
        --- /dev/null
        +++ b/resources/views/vendor/pagination/simple-bootstrap-4.blade.php
        @@ -0,0 +1,17 @@
        +@if ($paginator->hasPages())
        +    <ul class="pagination">
        +        {{-- Previous Page Link --}}
        +        @if ($paginator->onFirstPage())
        +            <li class="page-item disabled"><span class="page-link">&laquo;</span></li>
        +        @else
        +            <li class="page-item"><a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</a></li>
        +        @endif
        +
        +        {{-- Next Page Link --}}
        +        @if ($paginator->hasMorePages())
        +            <li class="page-item"><a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">&raquo;</a></li>
        +        @else
        +            <li class="page-item disabled"><span class="page-link">&raquo;</span></li>
        +        @endif
        +    </ul>
        +@endif
        diff --git a/resources/views/vendor/pagination/simple-default.blade.php b/resources/views/vendor/pagination/simple-default.blade.php
        new file mode 100644
        index 0000000000..cf53b8971b
        --- /dev/null
        +++ b/resources/views/vendor/pagination/simple-default.blade.php
        @@ -0,0 +1,17 @@
        +@if ($paginator->hasPages())
        +    <ul class="pagination">
        +        {{-- Previous Page Link --}}
        +        @if ($paginator->onFirstPage())
        +            <li class="disabled"><span>&laquo;</span></li>
        +        @else
        +            <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</a></li>
        +        @endif
        +
        +        {{-- Next Page Link --}}
        +        @if ($paginator->hasMorePages())
        +            <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">&raquo;</a></li>
        +        @else
        +            <li class="disabled"><span>&raquo;</span></li>
        +        @endif
        +    </ul>
        +@endif
        diff --git a/resources/views/vendor/passport/authorize.blade.php b/resources/views/vendor/passport/authorize.blade.php
        new file mode 100644
        index 0000000000..7dcc9b4ade
        --- /dev/null
        +++ b/resources/views/vendor/passport/authorize.blade.php
        @@ -0,0 +1,91 @@
        +<!DOCTYPE html>
        +<html lang="en">
        +<head>
        +    <meta charset="utf-8">
        +    <meta http-equiv="X-UA-Compatible" content="IE=edge">
        +    <meta name="viewport" content="width=device-width, initial-scale=1">
        +
        +    <title>{{ config('app.name') }} - Authorization</title>
        +
        +    <!-- Styles -->
        +    <link href="/css/app.css" rel="stylesheet">
        +
        +    <style>
        +        .passport-authorize .container {
        +            margin-top: 30px;
        +        }
        +
        +        .passport-authorize .scopes {
        +            margin-top: 20px;
        +        }
        +
        +        .passport-authorize .buttons {
        +            margin-top: 25px;
        +            text-align: center;
        +        }
        +
        +        .passport-authorize .btn {
        +            width: 125px;
        +        }
        +
        +        .passport-authorize .btn-approve {
        +            margin-right: 15px;
        +        }
        +
        +        .passport-authorize form {
        +            display: inline;
        +        }
        +    </style>
        +</head>
        +<body class="passport-authorize">
        +    <div class="container">
        +        <div class="row">
        +            <div class="col-md-6 col-md-offset-3">
        +                <div class="panel panel-default">
        +                    <div class="panel-heading">
        +                        Authorization Request
        +                    </div>
        +                    <div class="panel-body">
        +                        <!-- Introduction -->
        +                        <p><strong>{{ $client->name }}</strong> is requesting permission to access your account.</p>
        +
        +                        <!-- Scope List -->
        +                        @if (count($scopes) > 0)
        +                            <div class="scopes">
        +                                    <p><strong>This application will be able to:</strong></p>
        +
        +                                    <ul>
        +                                        @foreach ($scopes as $scope)
        +                                            <li>{{ $scope->description }}</li>
        +                                        @endforeach
        +                                    </ul>
        +                            </div>
        +                        @endif
        +
        +                        <div class="buttons">
        +                            <!-- Authorize Button -->
        +                            <form method="post" action="/oauth/authorize">
        +                                {{ csrf_field() }}
        +
        +                                <input type="hidden" name="state" value="{{ $request->state }}">
        +                                <input type="hidden" name="client_id" value="{{ $client->id }}">
        +                                <button type="submit" class="btn btn-success btn-approve">Authorize</button>
        +                            </form>
        +
        +                            <!-- Cancel Button -->
        +                            <form method="post" action="/oauth/authorize">
        +                                {{ csrf_field() }}
        +                                {{ method_field('DELETE') }}
        +
        +                                <input type="hidden" name="state" value="{{ $request->state }}">
        +                                <input type="hidden" name="client_id" value="{{ $client->id }}">
        +                                <button class="btn btn-danger">Cancel</button>
        +                            </form>
        +                        </div>
        +                    </div>
        +                </div>
        +            </div>
        +        </div>
        +    </div>
        +</body>
        +</html>
        diff --git a/routes/api.php b/routes/api.php
        new file mode 100644
        index 0000000000..6cdf782b4c
        --- /dev/null
        +++ b/routes/api.php
        @@ -0,0 +1,574 @@
        +<?php
        +
        +use Illuminate\Http\Request;
        +
        +/*
        +|--------------------------------------------------------------------------
        +| API Routes
        +|--------------------------------------------------------------------------
        +|
        +| Here is where you can register API routes for your application. These
        +| routes are loaded by the RouteServiceProvider within a group which
        +| is assigned the "api" middleware group. Enjoy building your API!
        +|
        +*/
        +
        +
        +Route::group(['prefix' => 'v1','namespace' => 'Api'], function () {
        +
        +    /*--- Accessories API ---*/
        +
        +    Route::resource('accessories', 'AccessoriesController',
        +        ['names' =>
        +            [
        +                'index' => 'api.accessories.index',
        +                'show' => 'api.accessories.show',
        +                'update' => 'api.accessories.update',
        +                'store' => 'api.accessories.store',
        +                'destroy' => 'api.accessories.destroy'
        +            ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['accessory' => 'accessory_id']
        +        ]
        +    ); // Accessories resource
        +
        +    Route::group(['prefix' => 'accessories'], function () {
        +
        +        Route::get('{accessory}/checkedout',
        +            [
        +                'as' => 'api.accessories.checkedout',
        +                'uses' => 'AccessoriesController@checkedout'
        +            ]
        +        );
        +    }); // Accessories group
        +
        +
        +    /*--- Categories API ---*/
        +
        +    Route::resource('categories', 'CategoriesController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.categories.index',
        +                    'show' => 'api.categories.show',
        +                    'store' => 'api.categories.store',
        +                    'update' => 'api.categories.update',
        +                    'destroy' => 'api.categories.destroy'
        +                ],
        +            'except' => ['edit', 'create'],
        +            'parameters' => ['category' => 'category_id']
        +        ]
        +    ); // Categories resource
        +
        +
        +    /*--- Companies API ---*/
        +
        +    Route::resource('companies', 'CompaniesController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.companies.index',
        +                    'show' => 'api.companies.show',
        +                    'store' => 'api.companies.store',
        +                    'update' => 'api.companies.update',
        +                    'destroy' => 'api.companies.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['component' => 'component_id']
        +        ]
        +    ); // Companies resource
        +
        +
        +    /*--- Departments API ---*/
        +
        +    Route::resource('departments', 'DepartmentsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.departments.index',
        +                    'show' => 'api.departments.show',
        +                    'store' => 'api.departments.store',
        +                    'update' => 'api.departments.update',
        +                    'destroy' => 'api.departments.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['department' => 'department_id']
        +        ]
        +    ); // Departments resource
        +
        +
        +    /*--- Components API ---*/
        +
        +    Route::resource('components', 'ComponentsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.components.index',
        +                    'show' => 'api.components.show',
        +                    'store' => 'api.components.store',
        +                    'update' => 'api.components.update',
        +                    'destroy' => 'api.components.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['component' => 'component_id']
        +        ]
        +    ); // Components resource
        +
        +    Route::group(['prefix' => 'components'], function () {
        +
        +        Route::get('{component}/assets',
        +            [
        +                'as' =>'api.components.assets',
        +                'uses' => 'ComponentsController@getAssets',
        +            ]
        +        );
        +    }); // Components group
        +
        +
        +    /*--- Consumables API ---*/
        +
        +    Route::resource('consumables', 'ConsumablesController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.consumables.index',
        +                    'show' => 'api.consumables.show',
        +                    'store' => 'api.consumables.store',
        +                    'update' => 'api.consumables.update',
        +                    'destroy' => 'api.consumables.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['consumable' => 'consumable_id']
        +        ]
        +    ); // Consumables resource
        +    Route::get('consumables/view/{id}/users',
        +        [
        +            'as' => 'api.consumables.showUsers',
        +            'uses' => 'ConsumablesController@getDataView'
        +        ]
        +    );
        +
        +    /*--- Depreciations API ---*/
        +
        +    Route::resource('depreciations', 'DepreciationsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.depreciations.index',
        +                    'show' => 'api.depreciations.show',
        +                    'store' => 'api.depreciations.store',
        +                    'update' => 'api.depreciations.update',
        +                    'destroy' => 'api.depreciations.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['depreciation' => 'depreciation_id']
        +        ]
        +    ); // Depreciations resource
        +
        +
        +    /*--- Fields API ---*/
        +
        +    Route::group(['prefix' => 'fields'], function () {
        +        Route::post('fieldsets/{id}/order',
        +            [
        +                'as' => 'api.customfields.order',
        +                'uses' => 'CustomFieldsController@postReorder'
        +            ]
        +        );
        +
        +        Route::get('/',
        +            [
        +                'as' => 'api.customfields.index',
        +                'uses' => 'CustomFieldsController@index'
        +            ]
        +        );
        +    }); // Fields group
        +
        +
        +    /*--- Fieldsets API ---*/
        +
        +    Route::resource('fieldsets', 'CustomFieldsetsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.fieldsets.index',
        +                    'show' => 'api.fieldsets.show',
        +                    'store' => 'api.fieldsets.store',
        +                    'update' => 'api.fieldsets.update',
        +                    'destroy' => 'api.fieldsets.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['fieldset' => 'fieldset_id']
        +        ]
        +    ); // Custom fieldset resource
        +
        +
        +
        +    /*--- Groups API ---*/
        +
        +    Route::resource('groups', 'GroupsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.groups.index',
        +                    'show' => 'api.groups.show',
        +                    'store' => 'api.groups.store',
        +                    'update' => 'api.groups.update',
        +                    'destroy' => 'api.groups.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['group' => 'group_id']
        +        ]
        +    ); // Groups resource
        +
        +
        +    /*--- Hardware API ---*/
        +
        +    Route::group(['prefix' => 'hardware'], function () {
        +
        +        Route::post('audit', [
        +            'as' => 'api.asset.audit',
        +            'uses' => 'AssetsController@audit'
        +        ]);
        +
        +
        +        Route::post('{asset_id}/checkout',
        +            [
        +                'as' => 'api.assets.checkout',
        +                'uses' => 'AssetsController@checkout'
        +            ]
        +        );
        +
        +        Route::post('{asset_id}/checkin',
        +            [
        +                'as' => 'api.assets.checkin',
        +                'uses' => 'AssetsController@checkin'
        +            ]
        +        );
        +
        +    });
        +
        +    /*--- Asset Maintenances API ---*/
        +    Route::resource('maintenances', 'AssetMaintenancesController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.maintenances.index',
        +                    'show' => 'api.maintenances.show',
        +                    'store' => 'api.maintenances.store',
        +                    'update' => 'api.maintenances.update',
        +                    'destroy' => 'api.maintenances.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['maintenance' => 'maintenance_id']
        +        ]
        +    ); // Consumables resource
        +
        +
        +    Route::resource('hardware', 'AssetsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.assets.index',
        +                    'show' => 'api.assets.show',
        +                    'store' => 'api.assets.store',
        +                    'update' => 'api.assets.update',
        +                    'destroy' => 'api.assets.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['asset' => 'asset_id']
        +        ]
        +    ); // Hardware resource
        +
        +
        +    /*--- Imports API ---*/
        +
        +    Route::resource('imports', 'ImportController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.imports.index',
        +                    'show' => 'api.imports.show',
        +                    'store' => 'api.imports.store',
        +                    'update' => 'api.imports.update',
        +                    'destroy' => 'api.imports.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['import' => 'import_id']
        +        ]
        +    ); // Imports resource
        +
        +    Route::group(['prefix' => 'imports'], function () {
        +
        +        Route::post('process/{import}',
        +            [
        +                'as' => 'api.imports.importFile',
        +                'uses'=> 'ImportController@process'
        +            ]
        +        );
        +    }); // Imports group
        +
        +
        +
        +
        +    /*--- Licenses API ---*/
        +
        +    Route::resource('licenses', 'LicensesController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.licenses.index',
        +                    'show' => 'api.licenses.show',
        +                    'store' => 'api.licenses.store',
        +                    'update' => 'api.licenses.update',
        +                    'destroy' => 'api.licenses.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['license' => 'license_id']
        +        ]
        +    ); // Licenses resource
        +
        +
        +    /*--- Locations API ---*/
        +
        +    Route::resource('locations', 'LocationsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.locations.index',
        +                    'show' => 'api.locations.show',
        +                    'store' => 'api.locations.store',
        +                    'update' => 'api.locations.update',
        +                    'destroy' => 'api.locations.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['location' => 'location_id']
        +        ]
        +    ); // Locations resource
        +
        +    Route::group(['prefix' => 'locations'], function () {
        +
        +        Route::get('{location}/users',
        +            [
        +                'as'=>'api.locations.viewusers',
        +                'uses'=>'LocationsController@getDataViewUsers'
        +            ]
        +        );
        +
        +        Route::get('{location}/assets',
        +            [
        +                'as'=>'api.locations.viewassets',
        +                'uses'=>'LocationsController@getDataViewAssets'
        +            ]
        +        );
        +
        +        // Do we actually still need this, now that we have an API?
        +        Route::get('{location}/check',
        +            [
        +                'as' => 'api.locations.check',
        +                'uses' => 'LocationsController@show'
        +            ]
        +        );
        +    }); // Locations group
        +
        +
        +    /*--- Manufacturers API ---*/
        +
        +    Route::resource('manufacturers', 'ManufacturersController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.manufacturers.index',
        +                    'show' => 'api.manufacturers.show',
        +                    'store' => 'api.manufacturers.store',
        +                    'update' => 'api.manufacturers.update',
        +                    'destroy' => 'api.manufacturers.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['manufacturer' => 'manufacturer_id']
        +        ]
        +    ); // Manufacturers resource
        +
        +
        +    /*--- Models API ---*/
        +
        +    Route::resource('models', 'AssetModelsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.models.index',
        +                    'show' => 'api.models.show',
        +                    'store' => 'api.models.store',
        +                    'update' => 'api.models.update',
        +                    'destroy' => 'api.models.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['model' => 'model_id']
        +        ]
        +    ); // Models resource
        +
        +    Route::group(['prefix' => 'models'], function () {
        +
        +        Route::get('assets',
        +            [
        +                'as' => 'api.models.assets',
        +                'uses'=> 'AssetModelsController@assets'
        +            ]
        +        );
        +    }); // Models group
        +
        +
        +    /*--- Settings API ---*/
        +
        +    Route::resource('settings', 'SettingsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.settings.index',
        +                    'store' => 'api.settings.store',
        +                    'show' => 'api.settings.show',
        +                    'update' => 'api.settings.update'
        +                ],
        +            'except' => ['create', 'edit', 'destroy'],
        +            'parameters' => ['setting' => 'setting_id']
        +        ]
        +    ); // Settings resource
        +
        +    Route::get('settings/ldaptest', [
        +        'as' => 'api.settings.ldaptest',
        +        'uses' => 'SettingsController@getLdapTest'
        +    ]);
        +
        +
        +    /*--- Status Labels API ---*/
        +
        +
        +    Route::group(['prefix' => 'statuslabels'], function () {
        +
        +        // Pie chart for dashboard
        +        Route::get('assets',
        +            [
        +                'as' => 'api.statuslabels.assets.bytype',
        +                'uses' => 'StatuslabelsController@getAssetCountByStatuslabel'
        +            ]
        +        );
        +
        +        Route::get('{statuslabel}/assetlist',
        +            [
        +                'as' => 'api.statuslabels.assets',
        +                'uses' => 'StatuslabelsController@assets'
        +            ]
        +        );
        +
        +        Route::get('{statuslabel}/deployable',
        +            [
        +                'as' => 'api.statuslabels.deployable',
        +                'uses' => 'StatuslabelsController@checkIfDeployable'
        +            ]
        +        );
        +
        +
        +    });
        +
        +    Route::resource('statuslabels', 'StatuslabelsController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.statuslabels.index',
        +                    'store' => 'api.statuslabels.store',
        +                    'show' => 'api.statuslabels.show',
        +                    'update' => 'api.statuslabels.update',
        +                    'destroy' => 'api.statuslabels.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['statuslabel' => 'statuslabel_id']
        +        ]
        +    );
        +
        +    // Status labels group
        +
        +
        +    /*--- Suppliers API ---*/
        +
        +    Route::resource('suppliers', 'SuppliersController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.suppliers.index',
        +                    'show' => 'api.suppliers.show',
        +                    'store' => 'api.suppliers.store',
        +                    'update' => 'api.suppliers.update',
        +                    'destroy' => 'api.suppliers.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['supplier' => 'supplier_id']
        +        ]
        +    ); // Suppliers resource
        +
        +    Route::group(['prefix' => 'suppliers'], function () {
        +
        +        Route::get('list',
        +            [
        +                'as'=>'api.suppliers.list',
        +                'uses'=>'SuppliersController@getDatatable'
        +            ]
        +        );
        +    }); // Suppliers group
        +
        +
        +    /*--- Users API ---*/
        +
        +    Route::resource('users', 'UsersController',
        +        [
        +            'names' =>
        +                [
        +                    'index' => 'api.users.index',
        +                    'show' => 'api.users.show',
        +                    'store' => 'api.users.store',
        +                    'update' => 'api.users.update',
        +                    'destroy' => 'api.users.destroy'
        +                ],
        +            'except' => ['create', 'edit'],
        +            'parameters' => ['user' => 'user_id']
        +        ]
        +    ); // Users resource
        +
        +    Route::group([ 'prefix' => 'users' ], function () {
        +
        +        Route::post('two_factor_reset',
        +            [
        +                'as' => 'api.users.two_factor_reset',
        +                'uses' => 'UsersController@postTwoFactorReset'
        +            ]
        +        );
        +
        +        Route::get('list/{status?}',
        +            [
        +                'as' => 'api.users.list',
        +                'uses' => 'UsersController@getDatatable'
        +            ]
        +        );
        +
        +        Route::get('{user}/assets',
        +            [
        +                'as' => 'api.users.assetlist',
        +                'uses' => 'UsersController@assets'
        +            ]
        +        );
        +
        +        Route::post('{user}/upload',
        +            [
        +                'as' => 'api.users.uploads',
        +                'uses' => 'UsersController@postUpload'
        +            ]
        +        );
        +    }); // Users group
        +
        +
        +    Route::get(
        +        'reports/activity',
        +        [ 'as' => 'api.activity.index', 'uses' => 'ReportsController@index' ]
        +    );
        +
        +
        +});
        diff --git a/routes/console.php b/routes/console.php
        new file mode 100644
        index 0000000000..785b9387e4
        --- /dev/null
        +++ b/routes/console.php
        @@ -0,0 +1,37 @@
        +<?php
        +
        +use App\Models\Setting;
        +use Illuminate\Foundation\Inspiring;
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Console Routes
        +|--------------------------------------------------------------------------
        +|
        +| This file is where you may define all of your Closure based console
        +| commands. Each Closure is bound to a command instance allowing a
        +| simple approach to interacting with each command's IO methods.
        +|
        +*/
        +
        +Artisan::command('inspire', function () {
        +    $this->comment(Inspiring::quote());
        +})->describe('Display an inspiring quote');
        +
        +Artisan::command('snipeit:travisci-install', function () {
        +    if(!Setting::setupCompleted()) {
        +        $settings = new Setting;
        +        $settings->site_name = 'test-ci';
        +        $settings->alert_email = 'test@example.com';
        +        $settings->alerts_enabled = 1;
        +        $settings->brand = 1;
        +        $settings->locale = 'en';
        +        $settings->default_currency = 'USD';
        +        $settings->user_id = 1;
        +        $settings->email_domain = 'example.com';
        +        $settings->email_format = 'filastname';
        +        $settings->save();
        +    } else {
        +        $this->comment('Setup already ran');
        +    }
        +})->describe('Travis-cli install script for unit tests');
        diff --git a/routes/web.php b/routes/web.php
        new file mode 100644
        index 0000000000..1f09080307
        --- /dev/null
        +++ b/routes/web.php
        @@ -0,0 +1,464 @@
        +<?php
        +
        +
        +Route::group(['middleware' => 'auth'], function () {
        +    /*
        +    * Companies
        +    */
        +    Route::resource('companies', 'CompaniesController', [
        +        'parameters' => ['company' => 'company_id']
        +    ]);
        +
        +    /*
        +    * Categories
        +    */
        +    Route::resource('categories', 'CategoriesController', [
        +        'parameters' => ['category' => 'category_id']
        +    ]);
        +
        +    /*
        +    * Locations
        +    */
        +    Route::resource('locations', 'LocationsController', [
        +        'parameters' => ['location' => 'location_id']
        +    ]);
        +
        +    /*
        +    * Manufacturers
        +    */
        +    Route::resource('manufacturers', 'ManufacturersController', [
        +        'parameters' => ['manufacturer' => 'manufacturers_id']
        +    ]);
        +
        +    /*
        +    * Suppliers
        +    */
        +    Route::resource('suppliers', 'SuppliersController', [
        +        'parameters' => ['supplier' => 'supplier_id']
        +    ]);
        +
        +    /*
        +    * Depreciations
        +     */
        +     Route::resource('depreciations', 'DepreciationsController', [
        +         'parameters' => ['depreciation' => 'depreciation_id']
        +     ]);
        +
        +     /*
        +     * Status Labels
        +      */
        +      Route::resource('statuslabels', 'StatuslabelsController', [
        +          'parameters' => ['statuslabel' => 'statuslabel_id']
        +      ]);
        +
        +
        +    /*
        +    * Status Labels
        +    */
        +    Route::resource('components', 'ComponentsController', [
        +        'parameters' => ['component' => 'component_id']
        +    ]);
        +
        +    /*
        +    * Departments
        +    */
        +    Route::resource('departments', 'DepartmentsController', [
        +        'parameters' => ['department' => 'department_id']
        +    ]);
        +
        +
        +});
        +
        +
        +/*
        +|
        +|--------------------------------------------------------------------------
        +| Re-Usable Modal Dialog routes.
        +|--------------------------------------------------------------------------
        +|
        +| Routes for various modal dialogs to interstitially create various things
        +| 
        +*/
        +
        +Route::group(['middleware' => 'auth','prefix' => 'modals'], function () {
        +    Route::get('location',['as' => 'modal.location','uses' => 'ModalController@location']);
        +    Route::get('model',['as' => 'modal.model','uses' => 'ModalController@model']);
        +    Route::get('statuslabel',['as' => 'modal.statuslabel','uses' => 'ModalController@statuslabel']);
        +    Route::get('supplier',['as' => 'modal.supplier','uses' => 'ModalController@supplier']);
        +    Route::get('user',['as' => 'modal.user','uses' => 'ModalController@user']);
        +});
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Log Routes
        +|--------------------------------------------------------------------------
        +|
        +| Register all the admin routes.
        +|
        +*/
        +
        +Route::group(['middleware' => 'auth'], function () {
        +
        +    Route::get(
        +        'display-sig/{filename}',
        +        [
        +            'as' => 'log.signature.view',
        +            'uses' => 'ActionlogController@displaySig' ]
        +    );
        +
        +
        +});
        +
        +
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Admin Routes
        +|--------------------------------------------------------------------------
        +|
        +| Register all the admin routes.
        +|
        +*/
        +
        +
        +
        +Route::group([ 'prefix' => 'admin','middleware' => ['authorize:superuser']], function () {
        +
        +    Route::get('settings', ['as' => 'settings.general.index','uses' => 'SettingsController@getSettings' ]);
        +    Route::post('settings', ['as' => 'settings.general.save','uses' => 'SettingsController@postSettings' ]);
        +
        +
        +    Route::get('branding', ['as' => 'settings.branding.index','uses' => 'SettingsController@getBranding' ]);
        +    Route::post('branding', ['as' => 'settings.branding.save','uses' => 'SettingsController@postBranding' ]);
        +
        +    Route::get('security', ['as' => 'settings.security.index','uses' => 'SettingsController@getSecurity' ]);
        +    Route::post('security', ['as' => 'settings.security.save','uses' => 'SettingsController@postSecurity' ]);
        +
        +    Route::get('groups', ['as' => 'settings.groups.index','uses' => 'GroupsController@index' ]);
        +
        +    Route::get('localization', ['as' => 'settings.localization.index','uses' => 'SettingsController@getLocalization' ]);
        +    Route::post('localization', ['as' => 'settings.localization.save','uses' => 'SettingsController@postLocalization' ]);
        +
        +    Route::get('notifications', ['as' => 'settings.alerts.index','uses' => 'SettingsController@getAlerts' ]);
        +    Route::post('notifications', ['as' => 'settings.alerts.save','uses' => 'SettingsController@postAlerts' ]);
        +
        +    Route::get('slack', ['as' => 'settings.slack.index','uses' => 'SettingsController@getSlack' ]);
        +    Route::post('slack', ['as' => 'settings.slack.save','uses' => 'SettingsController@postSlack' ]);
        +
        +    Route::get('asset_tags', ['as' => 'settings.asset_tags.index','uses' => 'SettingsController@getAssetTags' ]);
        +    Route::post('asset_tags', ['as' => 'settings.asset_tags.save','uses' => 'SettingsController@postAssetTags' ]);
        +
        +    Route::get('barcodes', ['as' => 'settings.barcodes.index','uses' => 'SettingsController@getBarcodes' ]);
        +    Route::post('barcodes', ['as' => 'settings.barcodes.save','uses' => 'SettingsController@postBarcodes' ]);
        +
        +    Route::get('labels', ['as' => 'settings.labels.index','uses' => 'SettingsController@getLabels' ]);
        +    Route::post('labels', ['as' => 'settings.labels.save','uses' => 'SettingsController@postLabels' ]);
        +
        +    Route::get('ldap', ['as' => 'settings.ldap.index','uses' => 'SettingsController@getLdapSettings' ]);
        +    Route::post('ldap', ['as' => 'settings.ldap.save','uses' => 'SettingsController@postLdapSettings' ]);
        +
        +    Route::get('phpinfo', ['as' => 'settings.phpinfo.index','uses' => 'SettingsController@getPhpInfo' ]);
        +
        +
        +    Route::get('oauth', [ 'as' => 'settings.oauth.index', 'uses' => 'SettingsController@api' ]);
        +
        +    Route::get('purge', ['as' => 'settings.purge.index', 'uses' => 'SettingsController@getPurge']);
        +    Route::post('purge', ['as' => 'settings.purge.save', 'uses' => 'SettingsController@postPurge']);
        +
        +    # Backups
        +    Route::group([ 'prefix' => 'backups', 'middleware' => 'auth' ], function () {
        +
        +
        +        Route::get('download/{filename}', [
        +            'as' => 'settings.backups.download',
        +            'uses' => 'SettingsController@downloadFile' ]);
        +
        +        Route::delete('delete/{filename}', [
        +            'as' => 'settings.backups.destroy',
        +            'uses' => 'SettingsController@deleteFile' ]);
        +
        +        Route::post('/', [
        +            'as' => 'settings.backups.create',
        +            'uses' => 'SettingsController@postBackups'
        +        ]);
        +
        +        Route::get('/', [ 'as' => 'settings.backups.index', 'uses' => 'SettingsController@getBackups' ]);
        +
        +    });
        +
        +
        +    Route::get('requests', [ 'as' => 'requests', 'middleware' => 'authorize:admin', 'uses' => 'ViewAssetsController@getRequestedIndex']);
        +
        +
        +
        +
        +    Route::get('/', ['as' => 'settings.index', 'uses' => 'SettingsController@index' ]);
        +
        +
        +});
        +
        +
        +Route::resource('groups', 'GroupsController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['group' => 'group_id']
        +]);
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Importer Routes
        +|--------------------------------------------------------------------------
        +|
        +|
        +|
        +*/
        +Route::group([ 'prefix' => 'import', 'middleware' => ['auth']], function () {
        +        Route::get('/', [
        +                'as' => 'imports.index',
        +                'uses' => 'ImportsController@index'
        +        ]);
        +});
        +
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Account Routes
        +|--------------------------------------------------------------------------
        +|
        +|
        +|
        +*/
        +Route::group([ 'prefix' => 'account', 'middleware' => ['auth']], function () {
        +
        +    # Profile
        +    Route::get('profile', [ 'as' => 'profile', 'uses' => 'ProfileController@getIndex' ]);
        +    Route::post('profile', 'ProfileController@postIndex');
        +
        +    Route::get('password', [ 'as' => 'account.password.index', 'uses' => 'ProfileController@password' ]);
        +    Route::post('password', [ 'uses' => 'ProfileController@passwordSave' ]);
        +
        +    Route::get('api', [ 'as' => 'user.api', 'uses' => 'ProfileController@api' ]);
        +
        +    # View Assets
        +    Route::get('view-assets', [ 'as' => 'view-assets', 'uses' => 'ViewAssetsController@getIndex' ]);
        +
        +    # Accept Asset
        +    Route::get(
        +        'accept-asset/{logID}',
        +        [ 'as' => 'account/accept-assets', 'uses' => 'ViewAssetsController@getAcceptAsset' ]
        +    );
        +    Route::post(
        +        'accept-asset/{logID}',
        +        [ 'as' => 'account/asset-accepted', 'uses' => 'ViewAssetsController@postAcceptAsset' ]
        +    );
        +
        +    # Profile
        +    Route::get(
        +        'requestable-assets',
        +        [ 'as' => 'requestable-assets', 'uses' => 'ViewAssetsController@getRequestableIndex' ]
        +    );
        +    Route::get(
        +        'request-asset/{assetId}',
        +        [ 'as' => 'account/request-asset', 'uses' => 'ViewAssetsController@getRequestAsset' ]
        +    );
        +
        +    Route::post(
        +        'request/{itemType}/{itemId}',
        +        [ 'as' => 'account/request-item', 'uses' => 'ViewAssetsController@getRequestItem']
        +    );
        +
        +    # Account Dashboard
        +    Route::get('/', [ 'as' => 'account', 'uses' => 'ViewAssetsController@getIndex' ]);
        +
        +});
        +
        +
        +Route::group(['middleware' => ['auth']], function () {
        +
        +    Route::get('reports/audit', [
        +        'as' => 'reports.audit',
        +        'uses' => 'ReportsController@audit'
        +    ]);
        +
        +    Route::get(
        +        'reports/depreciation',
        +        [ 'as' => 'reports/depreciation', 'uses' => 'ReportsController@getDeprecationReport' ]
        +    );
        +    Route::get(
        +        'reports/export/depreciation',
        +        [ 'as' => 'reports/export/depreciation', 'uses' => 'ReportsController@exportDeprecationReport' ]
        +    );
        +    Route::get(
        +        'reports/asset_maintenances',
        +        [ 'as' => 'reports/asset_maintenances', 'uses' => 'ReportsController@getAssetMaintenancesReport' ]
        +    );
        +    Route::get(
        +        'reports/export/asset_maintenances',
        +        [
        +            'as'   => 'reports/export/asset_maintenances',
        +            'uses' => 'ReportsController@exportAssetMaintenancesReport'
        +        ]
        +    );
        +    Route::get(
        +        'reports/licenses',
        +        [ 'as' => 'reports/licenses', 'uses' => 'ReportsController@getLicenseReport' ]
        +    );
        +    Route::get(
        +        'reports/export/licenses',
        +        [ 'as' => 'reports/export/licenses', 'uses' => 'ReportsController@exportLicenseReport' ]
        +    );
        +    Route::get('reports/assets', [ 'as' => 'reports/assets', 'uses' => 'ReportsController@getAssetsReport' ]);
        +    Route::get(
        +        'reports/export/assets',
        +        [ 'as' => 'reports/export/assets', 'uses' => 'ReportsController@exportAssetReport' ]
        +    );
        +    Route::get('reports/accessories', [ 'as' => 'reports/accessories', 'uses' => 'ReportsController@getAccessoryReport' ]);
        +    Route::get(
        +        'reports/export/accessories',
        +        [ 'as' => 'reports/export/accessories', 'uses' => 'ReportsController@exportAccessoryReport' ]
        +    );
        +    Route::get('reports/custom', [ 'as' => 'reports/custom', 'uses' => 'ReportsController@getCustomReport' ]);
        +    Route::post('reports/custom', 'ReportsController@postCustom');
        +
        +    Route::get(
        +        'reports/activity',
        +        [ 'as' => 'reports.activity', 'uses' => 'ReportsController@getActivityReport' ]
        +    );
        +
        +
        +    Route::get(
        +        'reports/unaccepted_assets',
        +        [ 'as' => 'reports/unaccepted_assets', 'uses' => 'ReportsController@getAssetAcceptanceReport' ]
        +    );
        +    Route::get(
        +        'reports/export/unaccepted_assets',
        +        [ 'as' => 'reports/export/unaccepted_assets', 'uses' => 'ReportsController@exportAssetAcceptanceReport' ]
        +    );
        +});
        +
        +Route::get(
        +    'auth/signin',
        +    ['uses' => 'Auth\LoginController@legacyAuthRedirect' ]
        +);
        +
        +
        +
        +
        +/*
        +|--------------------------------------------------------------------------
        +| Setup Routes
        +|--------------------------------------------------------------------------
        +|
        +|
        +|
        +*/
        +Route::group([ 'prefix' => 'setup', 'middleware' => 'web'], function () {
        +    Route::get(
        +        'user',
        +        [
        +        'as'  => 'setup.user',
        +        'uses' => 'SettingsController@getSetupUser' ]
        +    );
        +
        +    Route::post(
        +        'user',
        +        [
        +        'as'  => 'setup.user.save',
        +        'uses' => 'SettingsController@postSaveFirstAdmin' ]
        +    );
        +
        +
        +    Route::get(
        +        'migrate',
        +        [
        +        'as'  => 'setup.migrate',
        +        'uses' => 'SettingsController@getSetupMigrate' ]
        +    );
        +
        +    Route::get(
        +        'done',
        +        [
        +        'as'  => 'setup.done',
        +        'uses' => 'SettingsController@getSetupDone' ]
        +    );
        +
        +    Route::get(
        +        'mailtest',
        +        [
        +        'as'  => 'setup.mailtest',
        +        'uses' => 'SettingsController@ajaxTestEmail' ]
        +    );
        +
        +
        +    Route::get(
        +        '/',
        +        [
        +        'as'  => 'setup',
        +        'uses' => 'SettingsController@getSetupIndex' ]
        +    );
        +
        +});
        +
        +Route::get(
        +    'two-factor-enroll',
        +    [
        +        'as' => 'two-factor-enroll',
        +        'middleware' => ['web'],
        +        'uses' => 'Auth\LoginController@getTwoFactorEnroll' ]
        +);
        +
        +Route::get(
        +    'two-factor',
        +    [
        +        'as' => 'two-factor',
        +        'middleware' => ['web'],
        +        'uses' => 'Auth\LoginController@getTwoFactorAuth' ]
        +);
        +
        +Route::post(
        +    'two-factor',
        +    [
        +        'as' => 'two-factor',
        +        'middleware' => ['web'],
        +        'uses' => 'Auth\LoginController@postTwoFactorAuth' ]
        +);
        +
        +Route::get(
        +    '/',
        +    [
        +    'as' => 'home',
        +    'middleware' => ['auth'],
        +    'uses' => 'DashboardController@getIndex' ]
        +);
        +
        +
        +
        +Route::group(['middleware' => 'web'], function () {
        +    //Route::auth();
        +    Route::get(
        +        'login',
        +        [
        +            'as' => 'login',
        +            'middleware' => ['web'],
        +            'uses' => 'Auth\LoginController@showLoginForm' ]
        +    );
        +
        +    Route::post(
        +        'login',
        +        [
        +            'as' => 'login',
        +            'middleware' => ['web'],
        +            'uses' => 'Auth\LoginController@login' ]
        +    );
        +
        +    Route::get(
        +        'logout',
        +        [
        +            'as' => 'logout',
        +            'uses' => 'Auth\LoginController@logout' ]
        +    );
        +
        +});
        +
        +
        +
        +
        diff --git a/routes/web/accessories.php b/routes/web/accessories.php
        new file mode 100644
        index 0000000000..d9ab3b35cf
        --- /dev/null
        +++ b/routes/web/accessories.php
        @@ -0,0 +1,31 @@
        +<?php
        +
        +/*
        +* Accessories
        + */
        +Route::group([ 'prefix' => 'accessories', 'middleware' => ['auth']], function () {
        +
        +    Route::get(
        +        '{accessoryID}/checkout',
        +        [ 'as' => 'checkout/accessory', 'uses' => 'AccessoriesController@getCheckout' ]
        +    );
        +    Route::post(
        +        '{accessoryID}/checkout',
        +        [ 'as' => 'checkout/accessory', 'uses' => 'AccessoriesController@postCheckout' ]
        +    );
        +
        +    Route::get(
        +        '{accessoryID}/checkin/{backto?}',
        +        [ 'as' => 'checkin/accessory', 'uses' => 'AccessoriesController@getCheckin' ]
        +    );
        +    Route::post(
        +        '{accessoryID}/checkin/{backto?}',
        +        [ 'as' => 'checkin/accessory', 'uses' => 'AccessoriesController@postCheckin' ]
        +    );
        +
        +});
        +
        +Route::resource('accessories', 'AccessoriesController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['accessory' => 'accessory_id']
        +]);
        diff --git a/routes/web/components.php b/routes/web/components.php
        new file mode 100644
        index 0000000000..7be4b1e9d5
        --- /dev/null
        +++ b/routes/web/components.php
        @@ -0,0 +1,22 @@
        +<?php
        +
        +# Components
        +Route::group([ 'prefix' => 'components','middleware' => ['auth'] ], function () {
        +
        +    Route::get(
        +        '{componentID}/checkout',
        +        [ 'as' => 'checkout/component', 'uses' => 'ComponentsController@getCheckout' ]
        +    );
        +    Route::post(
        +        '{componentID}/checkout',
        +        [ 'as' => 'checkout/component', 'uses' => 'ComponentsController@postCheckout' ]
        +    );
        +    Route::post('bulk', [ 'as' => 'component/bulk-form', 'uses' => 'ComponentsController@postBulk' ]);
        +    Route::post('bulksave', [ 'as' => 'component/bulk-save', 'uses' => 'ComponentsController@postBulkSave' ]);
        +
        +});
        +
        +Route::resource('components', 'ComponentsController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['component' => 'component_id']
        +]);
        diff --git a/routes/web/consumables.php b/routes/web/consumables.php
        new file mode 100644
        index 0000000000..623d09a346
        --- /dev/null
        +++ b/routes/web/consumables.php
        @@ -0,0 +1,19 @@
        +<?php
        +
        +
        +    # Consumables
        +    Route::group([ 'prefix' => 'consumables', 'middleware' => ['auth']], function () {
        +        Route::get(
        +            '{consumableID}/checkout',
        +            [ 'as' => 'checkout/consumable','uses' => 'ConsumablesController@getCheckout' ]
        +        );
        +        Route::post(
        +            '{consumableID}/checkout',
        +            [ 'as' => 'checkout/consumable', 'uses' => 'ConsumablesController@postCheckout' ]
        +        );
        +    });
        +
        +    Route::resource('consumables', 'ConsumablesController', [
        +        'middleware' => ['auth'],
        +        'parameters' => ['consumable' => 'consumable_id']
        +    ]);
        diff --git a/routes/web/fields.php b/routes/web/fields.php
        new file mode 100644
        index 0000000000..18a403aae1
        --- /dev/null
        +++ b/routes/web/fields.php
        @@ -0,0 +1,28 @@
        +<?php
        +/*
        +* Custom Fields Routes
        +*/
        +
        +
        +
        +Route::group([ 'prefix' => 'fields','middleware' => ['auth'] ], function () {
        +
        +    Route::get('{field_id}/fieldset/{fieldset_id}/disassociate',
        +        ['uses' => 'CustomFieldsController@deleteFieldFromFieldset',
        +        'as' => 'fields.disassociate']
        +    );
        +
        +    Route::post('fieldsets/{id}/associate',
        +        ['uses' => 'CustomFieldsetsController@associate',
        +        'as' => 'fieldsets.associate']
        +    );
        +
        +    Route::resource('fieldsets', 'CustomFieldsetsController', [
        +    'parameters' => ['fieldset' => 'field_id', 'field' => 'field_id']
        +    ]);
        +});
        +
        +Route::resource('fields', 'CustomFieldsController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['field' => 'field_id', 'fieldset' => 'fieldset_id']
        +]);
        diff --git a/routes/web/hardware.php b/routes/web/hardware.php
        new file mode 100644
        index 0000000000..f984015acc
        --- /dev/null
        +++ b/routes/web/hardware.php
        @@ -0,0 +1,147 @@
        +<?php
        +/*
        +|--------------------------------------------------------------------------
        +| Asset Routes
        +|--------------------------------------------------------------------------
        +|
        +| Register all the asset routes.
        +|
        +*/
        +Route::group(
        +    ['prefix' => 'hardware',
        +    'middleware' => ['auth']],
        +    function () {
        +
        +        Route::get( 'bulkaudit',  [
        +            'as' => 'assets.bulkaudit',
        +            'uses' => 'AssetsController@quickScan'
        +        ]);
        +
        +        # Asset Maintenances
        +        Route::resource('maintenances', 'AssetMaintenancesController', [
        +            'parameters' => ['maintenance' => 'maintenance_id', 'asset' => 'asset_id']
        +        ]);
        +
        +        Route::get('scan', [
        +            'as' => 'asset.scan',
        +            'uses' => 'AssetsController@scan'
        +        ]);
        +
        +        Route::get('audit/{id}', [
        +            'as' => 'asset.audit.create',
        +            'uses' => 'AssetsController@audit'
        +        ]);
        +
        +        Route::post('audit/{id}', [
        +            'as' => 'asset.audit.store',
        +            'uses' => 'AssetsController@auditStore'
        +        ]);
        +
        +
        +        Route::get('history', [
        +            'as' => 'asset.import-history',
        +            'uses' => 'AssetsController@getImportHistory'
        +        ]);
        +
        +        Route::post('history', [
        +            'as' => 'asset.process-import-history',
        +            'uses' => 'AssetsController@postImportHistory'
        +        ]);
        +
        +        Route::get('/bytag', [
        +            'as'   => 'findbytag/hardware',
        +            'uses' => 'AssetsController@getAssetByTag'
        +        ]);
        +
        +        Route::get('{assetId}/clone', [
        +            'as' => 'clone/hardware',
        +            'uses' => 'AssetsController@getClone'
        +        ]);
        +
        +        Route::post('{assetId}/clone', 'AssetsController@postCreate');
        +
        +        Route::get('{assetId}/checkout', [
        +            'as' => 'checkout/hardware',
        +            'uses' => 'AssetsController@getCheckout'
        +        ]);
        +        Route::post('{assetId}/checkout', [
        +            'as' => 'checkout/hardware',
        +            'uses' => 'AssetsController@postCheckout'
        +        ]);
        +        Route::get('{assetId}/checkin/{backto?}', [
        +            'as' => 'checkin/hardware',
        +            'uses' => 'AssetsController@getCheckin'
        +        ]);
        +
        +        Route::post('{assetId}/checkin/{backto?}', [
        +            'as' => 'checkin/hardware',
        +            'uses' => 'AssetsController@postCheckin'
        +        ]);
        +        Route::get('{assetId}/view', [
        +            'as' => 'hardware.view',
        +            'uses' => 'AssetsController@show'
        +        ]);
        +        Route::get('{assetId}/qr_code', [ 'as' => 'qr_code/hardware', 'uses' => 'AssetsController@getQrCode' ]);
        +        Route::get('{assetId}/barcode', [ 'as' => 'barcode/hardware', 'uses' => 'AssetsController@getBarCode' ]);
        +        Route::get('{assetId}/restore', [
        +            'as' => 'restore/hardware',
        +            'uses' => 'AssetsController@getRestore'
        +        ]);
        +        Route::post('{assetId}/upload', [
        +            'as' => 'upload/asset',
        +            'uses' => 'AssetsController@postUpload'
        +        ]);
        +
        +        Route::get('{assetId}/showfile/{fileId}', [
        +            'as' => 'show/assetfile',
        +            'uses' => 'AssetsController@displayFile'
        +        ]);
        +
        +        Route::delete('{assetId}/showfile/{fileId}/delete', [
        +            'as' => 'delete/assetfile',
        +            'uses' => 'AssetsController@deleteFile'
        +        ]);
        +
        +
        +        Route::post(
        +            'bulkedit',
        +            [
        +                'as'   => 'hardware/bulkedit',
        +                'uses' => 'AssetsController@postBulkEdit'
        +            ]
        +        );
        +        Route::post(
        +            'bulkdelete',
        +            [
        +                'as'   => 'hardware/bulkdelete',
        +                'uses' => 'AssetsController@postBulkDelete'
        +            ]
        +        );
        +        Route::post(
        +            'bulksave',
        +            [
        +                'as'   => 'hardware/bulksave',
        +                'uses' => 'AssetsController@postBulkSave'
        +            ]
        +        );
        +
        +        # Bulk checkout / checkin
        +         Route::get( 'bulkcheckout',  [
        +                 'as' => 'hardware/bulkcheckout',
        +                 'uses' => 'AssetsController@getBulkCheckout'
        +         ]);
        +        Route::post( 'bulkcheckout',  [
        +            'as' => 'hardware/bulkcheckout',
        +            'uses' => 'AssetsController@postBulkCheckout'
        +        ]);
        +
        +
        +
        +
        +});
        +
        +
        +Route::resource('hardware', 'AssetsController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['asset' => 'asset_id']
        +]);
        diff --git a/routes/web/licenses.php b/routes/web/licenses.php
        new file mode 100644
        index 0000000000..d5d67f1533
        --- /dev/null
        +++ b/routes/web/licenses.php
        @@ -0,0 +1,49 @@
        +<?php
        +
        +
        +# Licenses
        +Route::group([ 'prefix' => 'licenses', 'middleware' => ['auth'] ], function () {
        +
        +    Route::get('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'LicensesController@getClone' ]);
        +    Route::post('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'LicensesController@postCreate' ]);
        +
        +    Route::get('{licenseId}/freecheckout', [
        +    'as' => 'licenses.freecheckout',
        +    'uses' => 'LicensesController@getFreeLicense'
        +    ]);
        +    Route::get('{licenseId}/checkout', [
        +    'as' => 'licenses.checkout',
        +    'uses' => 'LicensesController@getCheckout'
        +    ]);
        +    Route::post(
        +        '{licenseId}/checkout',
        +        [ 'as' => 'licenses.checkout', 'uses' => 'LicensesController@postCheckout' ]
        +    );
        +    Route::get('{licenseId}/checkin/{backto?}', [
        +    'as' => 'licenses.checkin',
        +    'uses' => 'LicensesController@getCheckin'
        +    ]);
        +
        +    Route::post('{licenseId}/checkin/{backto?}', [
        +    'as' => 'licenses.checkin',
        +    'uses' => 'LicensesController@postCheckin'
        +    ]);
        +
        +    Route::post(
        +    '{licenseId}/upload',
        +    [ 'as' => 'upload/license', 'uses' => 'LicensesController@postUpload' ]
        +    );
        +    Route::get(
        +    '{licenseId}/deletefile/{fileId}',
        +    [ 'as' => 'delete/licensefile', 'uses' => 'LicensesController@getDeleteFile' ]
        +    );
        +    Route::get(
        +    '{licenseId}/showfile/{fileId}',
        +    [ 'as' => 'show/licensefile', 'uses' => 'LicensesController@displayFile' ]
        +    );
        +});
        +
        +Route::resource('licenses', 'LicensesController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['license' => 'license_id']
        +]);
        diff --git a/routes/web/models.php b/routes/web/models.php
        new file mode 100644
        index 0000000000..e629307b3c
        --- /dev/null
        +++ b/routes/web/models.php
        @@ -0,0 +1,18 @@
        +<?php
        +
        +# Asset Model Management
        +Route::group([ 'prefix' => 'models', 'middleware' => ['auth'] ], function () {
        +
        +    Route::get('{modelId}/clone', [ 'as' => 'clone/model', 'uses' => 'AssetModelsController@getClone' ]);
        +    Route::post('{modelId}/clone', 'AssetModelsController@postCreate');
        +    Route::get('{modelId}/view', [ 'as' => 'view/model', 'uses' => 'AssetModelsController@getView' ]);
        +    Route::get('{modelID}/restore', [ 'as' => 'restore/model', 'uses' => 'AssetModelsController@getRestore', 'middleware' => ['authorize:superuser'] ]);
        +    Route::get('{modelId}/custom_fields', ['as' => 'custom_fields/model','uses' => 'AssetModelsController@getCustomFields']);
        +    Route::post('bulkedit', ['as' => 'models.bulkedit.index','uses' => 'AssetModelsController@postBulkEdit']);
        +    Route::post('bulksave', ['as' => 'models.bulkedit.store','uses' => 'AssetModelsController@postBulkEditSave']);
        +});
        +
        +Route::resource('models', 'AssetModelsController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['model' => 'model_id']
        +]);
        diff --git a/routes/web/users.php b/routes/web/users.php
        new file mode 100644
        index 0000000000..d863c4a22a
        --- /dev/null
        +++ b/routes/web/users.php
        @@ -0,0 +1,53 @@
        +<?php
        +
        +# User Management
        +Route::group([ 'prefix' => 'users', 'middleware' => ['auth']], function () {
        +
        +    Route::get('ldap', ['as' => 'ldap/user', 'uses' => 'UsersController@getLDAP' ]);
        +    Route::post('ldap', 'UsersController@postLDAP');
        +    Route::get('import', [ 'as' => 'import/user', 'uses' => 'UsersController@getImport' ]);
        +    Route::post('import', [ 'uses' => 'UsersController@postImport' ]);
        +    Route::get('export', [ 'as' => 'users.export', 'uses' => 'UsersController@getExportUserCsv' ]);
        +    Route::get('{userId}/clone', [ 'as' => 'clone/user', 'uses' => 'UsersController@getClone' ]);
        +    Route::post('{userId}/clone', [ 'uses' => 'UsersController@postCreate' ]);
        +    Route::get('{userId}/restore', [ 'as' => 'restore/user', 'uses' => 'UsersController@getRestore' ]);
        +    Route::get('{userId}/unsuspend', [ 'as' => 'unsuspend/user', 'uses' => 'UsersController@getUnsuspend' ]);
        +    Route::post('{userId}/upload', [ 'as' => 'upload/user', 'uses' => 'UsersController@postUpload' ]);
        +    Route::get(
        +        '{userId}/deletefile/{fileId}',
        +        [ 'as' => 'delete/userfile', 'uses' => 'UsersController@getDeleteFile' ]
        +    );
        +    Route::get(
        +        '{userId}/showfile/{fileId}',
        +        [ 'as' => 'show/userfile', 'uses' => 'UsersController@displayFile' ]
        +    );
        +
        +    Route::post(
        +        'bulkedit',
        +        [
        +            'as'   => 'users/bulkedit',
        +            'uses' => 'UsersController@postBulkEdit',
        +        ]
        +    );
        +    Route::post(
        +        'bulksave',
        +        [
        +            'as'   => 'users/bulksave',
        +            'uses' => 'UsersController@postBulkSave',
        +        ]
        +    );
        +    Route::post(
        +        'bulkeditsave',
        +        [
        +            'as'   => 'users/bulkeditsave',
        +            'uses' => 'UsersController@postBulkEditSave',
        +        ]
        +    );
        +
        +
        +});
        +
        +Route::resource('users', 'UsersController', [
        +    'middleware' => ['auth'],
        +    'parameters' => ['user' => 'user_id']
        +]);
        diff --git a/sample_csvs/MOCK_ACCESSORIES.csv b/sample_csvs/MOCK_ACCESSORIES.csv
        new file mode 100644
        index 0000000000..f7e490a104
        --- /dev/null
        +++ b/sample_csvs/MOCK_ACCESSORIES.csv
        @@ -0,0 +1,2 @@
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
        diff --git a/sample_csvs/MOCK_ASSETS.csv b/sample_csvs/MOCK_ASSETS.csv
        new file mode 100644
        index 0000000000..eafbb5b804
        --- /dev/null
        +++ b/sample_csvs/MOCK_ASSETS.csv
        @@ -0,0 +1,201 @@
        +Name,Email,Username,item Name,Category,Model name,Manufacturer,Model Number,Serial number,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier
        +Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan
        +Judith Ferguson,jferguson1@state.tx.us,jferguson1,mi in porttitor,justo,congue diam id,Flipstorm,5.02043359569189E+018,4bc7fc90-5a97-412f-8eed-77ecacc643fc,544574073-0,Cirangga Kidul,,2016-03-08,763.46,,Undeployable,12,Oyope
        +Mildred Gibson,mgibson2@wiley.com,mgibson2,morbi quis tortor id,nunc nisl duis,convallis tortor risus,Lajo,374622546776765,2837ab20-8f0d-4935-8a52-226392f2b1b0,710141467-2,Shekou,In congue. Etiam justo. Etiam pretium iaculis justo.,2015-08-09,233.57,Konklab,Lost,,
        +Brandon Lee,blee3@quantcast.com,blee3,amet cursus id turpis,sed,in faucibus orci,Zoomlounge,3549618015236095,18d6e6a4-d362-4de9-beb4-7f62fb93de6f,103538064-1,Leksand,Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.,2015-10-11,,,Pending Diagnostics,,
        +Betty Powell,bpowell4@tuttocitta.it,bpowell4,ipsum praesent,condimentum curabitur,et ultrices,Kazu,3567082842822626,f9b473c6-c810-42f2-8335-27ce468889a8,118753405-6,Dresi Wetan,,2015-06-16,324.8,,Ready to Deploy,,
        +Anthony Wheeler,awheeler5@cocolog-nifty.com,awheeler5,dictumst maecenas ut,sem praesent,accumsan felis,Layo,30052522651756,4751495c-cee0-4961-b788-94a545b5643e,998233705-X,Dante Delgado,,2016-04-16,261.79,,Archived,15,Ntag
        +Dennis Reynolds,dreynolds6@ustream.tv,dreynolds6,libero nam,risus,interdum mauris,Twiyo,3585438057660291,17b3cf8d-fead-46f5-a8b0-49906bb90a00,177687256-8,Pingle,"Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.",2015-05-24,,,Pending Diagnostics,,
        +Andrea Arnold,aarnold7@cbc.ca,aarnold7,mauris morbi non,ante vel,sapien dignissim,Cogibox,3548511052883500,7a6a2fdb-160c-4d91-8e05-a0337a90d9db,129556040-2,Zhuli,Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.,2015-09-15,434.86,,Archived,14,Kwilith
        +Anna Butler,abutler8@wikia.com,abutler8,eleifend pede libero,sapien a libero,et ultrices posuere cubilia,Flipbug,6.75911579996746E+017,c1a57909-3b2e-47fe-ab2f-843401b2a7de,117517007-0,Niopanda,"Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.",2016-04-13,89.53,,Archived,15,Linkbridge
        +Mark Bennett,mbennett9@diigo.com,mbennett9,convallis nulla neque,eu sapien,duis mattis egestas metus aenean,Centimia,378342677410961,07540238-fb3c-4c8a-8e11-d43883ee4268,007968217-0,Zoumaling,,2015-07-04,,,Lost,,
        +Emily Wheeler,ewheelera@google.de,ewheelera,in felis,leo odio,quam sapien varius,Roombo,201954480670574,527b2445-2c67-4f76-912f-6ec42400a584,441402118-9,Luts’k,Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.,2016-05-18,,Bitwolf,Lost,36,Wikizz
        +Wanda Fox,wfoxb@virginia.edu,wfoxb,vel ipsum praesent,potenti nullam porttitor,augue vestibulum rutrum rutrum neque,Yakijo,3567636803247485,,863829558-8,Pravdinsk,"Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.",2015-11-10,,,Lost,14,Linkbridge
        +,,,odio elementum,posuere cubilia curae,ante vel ipsum praesent blandit,Oyope,3529462300753736,9a863968-180e-451d-a723-dc85e2d5d8ff,742114860-4,Panay,Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.,2016-03-20,881.4,,,30,Tagcat
        +Janet Grant,jgrantd@cpanel.net,jgrantd,viverra diam vitae,semper sapien,dapibus dolor vel,Flashset,3559785746335392,e287bb64-ff4f-434c-88ab-210ad433c77b,927820758-6,Achiaman,,2016-03-05,675.3,,Archived,22,Meevee
        +Antonio Larson,alarsone@tripod.com,alarsone,felis sed interdum venenatis,id lobortis,dui proin,Chatterbridge,4070995882635,90bcab28-ffd4-48c9-ba5d-c2eeb1400698,789757925-5,Oemanu,Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.,2015-07-25,,,Ready to Deploy,30,Shuffledrive
        +Lois Powell,lpowellf@com.com,lpowellf,id consequat,justo nec,odio porttitor id consequat in,Skipstorm,36309149183447,08e440f7-bd0b-47a7-a577-4a3ce3c7dfe7,202652281-2,Qiaolin,"Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.",2015-08-13,446.22,,Lost,,
        +Mildred Allen,malleng@com.com,malleng,porta volutpat quam pede,in hac habitasse,donec vitae nisi nam,Devpulse,3543783295297294,5f900903-0ffe-4405-b5ad-aa4aa59d911c,210119288-8,Accha,"Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.",2015-12-24,923.9,,Lost,20,Quamba
        +Clarence Austin,caustinh@bigcartel.com,caustinh,libero nam dui proin,aliquet at feugiat,eget tincidunt eget tempus,Photobug,201967051902986,bde85740-f103-4b49-a691-a60c7f6859a8,022102715-7,Kerkrade,In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.,2016-03-29,,,Undeployable,22,Browsedrive
        +Walter Chavez,wchavezi@blogs.com,wchavezi,sociis natoque penatibus,vel est,at diam nam,Photofeed,3533016005480310,bf4a2a92-6f29-4d24-be90-8126d4dcbd64,610672722-8,Villa Regina,,2016-05-13,442.51,,Archived,28,Tekfly
        +Marie Elliott,melliottj@constantcontact.com,melliottj,sed tristique in,rutrum,luctus et ultrices,Riffpath,4547299861035,9a02817e-de79-4850-a212-84c9ae3dd1a2,898880851-7,Tibro,Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.,2015-09-10,906.39,,Undeployable,,
        +,,,dui luctus rutrum,sapien ut nunc,dictumst morbi vestibulum,Aivee,4405382067928809,514aca2a-9080-4c49-8695-7ba4c78edc65,466008300-4,Menglie,Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.,2015-12-21,151.27,,,,
        +,,,ut massa volutpat,sed,quis odio consequat varius integer,Abatz,3537252931689981,b99208e2-b8d8-4f7a-8a06-366a27733b97,313295582-5,Solidaridad,"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.",2016-02-15,211.07,,,,
        +Benjamin Ford,bfordm@woothemes.com,bfordm,habitasse platea dictumst,primis in faucibus,quam a odio in,Blogtag,5018304036665243,c8680b36-a13c-427f-a6a1-1b9b351eb129,552327520-4,Sorinomo,In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet.,2015-11-25,112.11,,Ready to Deploy,18,Quatz
        +Timothy Warren,twarrenn@printfriendly.com,twarrenn,leo pellentesque ultrices,vestibulum,in sapien iaculis congue vivamus,Brightdog,30355105682126,6c1e7556-063f-4c71-87ce-e46b06e8c238,446504693-6,Tamel,"Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.",2015-08-19,221.03,,Undeployable,26,Mydeo
        +Carlos Kelley,ckelleyo@1und1.de,ckelleyo,suspendisse potenti nullam,magnis dis parturient,at nibh in hac,Voolia,5.02034519834773E+017,95605fc3-f82e-4472-a2b0-93acd5e255ed,860990227-7,Tučepi,,2015-06-08,443.05,,Archived,35,Aimbu
        +Marilyn Bryant,mbryantp@uiuc.edu,mbryantp,nam nulla integer,praesent,turpis adipiscing lorem vitae,Divape,5.02036965260033E+016,53d9eef2-e0f8-4c81-9a31-8c12e4f52ab0,536251475-X,Peddie,Phasellus in felis. Donec semper sapien a libero. Nam dui.,2015-06-08,79.2,Zaam-Dox,Ready to Deploy,,
        +Douglas Marshall,dmarshallq@cdc.gov,dmarshallq,cras mi pede malesuada,odio,aliquam augue quam sollicitudin,Thoughtsphere,5610480952189632,50d3ba91-06d6-4453-84ff-5ed801d3faa5,148599723-2,Betafo,,2016-03-06,321.96,,Archived,,
        +Ruth Cunningham,rcunninghamr@biglobe.ne.jp,rcunninghamr,duis faucibus accumsan,ipsum aliquam,metus vitae ipsum,Jabbertype,4017954952198803,d4f93ed0-5010-4026-9d3f-0e59e0efee15,416706302-6,Margate,"Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.",2015-08-06,211.17,,Ready to Deploy,,
        +,,,non ligula pellentesque ultrices,arcu adipiscing molestie,vestibulum ante ipsum,Shuffletag,3575254429008123,657a313a-361c-4733-b444-ec26dc02fdfe,065976674-4,Igurubi,"Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.",2016-04-15,,,,26,Wikido
        +Jose Freeman,jfreemant@free.fr,jfreemant,duis aliquam convallis,potenti cras in,enim blandit,Twitterlist,604923914546620,98080972-ad72-4581-8aee-ec78a6b3f528,712283421-2,Kuala Lumpur,Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.,2015-09-05,744.98,,Lost,,
        +Wayne Woods,wwoodsu@tuttocitta.it,wwoodsu,massa id nisl,est,sit amet erat nulla,Browsecat,3553184613730081,fb146f1d-b0ed-4ffc-8653-3ad0afe99dd0,666189117-3,Saint-Étienne,,2016-03-14,,,Undeployable,14,Jabbersphere
        +Frank Butler,fbutlerv@reuters.com,fbutlerv,arcu adipiscing,duis faucibus accumsan,nisi venenatis,Shuffledrive,374622582923529,7820e851-362b-4187-b64a-c1ef8800fbce,323903931-1,Jinxiang,"Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.",2015-08-05,697.01,,Pending Diagnostics,17,Vipe
        +,,,eget eros,sapien varius,morbi non quam nec,Eamia,374283210933313,9c67b528-2389-4733-92e7-a09415649c72,172486278-2,Neuzina,"Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.",2015-10-07,541.17,,,,
        +Christina Hunt,chuntx@businessinsider.com,chuntx,ut suscipit a feugiat,in faucibus,neque vestibulum eget,Quamba,5553781723608266,,620738847-X,Agpangi,"In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.",2015-05-31,199.6,,Pending Diagnostics,,
        +Cynthia Gordon,cgordony@livejournal.com,cgordony,morbi non quam nec,faucibus,eu orci mauris lacinia,Meevee,374283689607158,1a67f546-8de4-4d2d-b32f-6c1605cac858,786105964-2,Dallas,,2016-04-01,19.94,,Archived,33,Meembee
        +Jose Hicks,jhicksz@behance.net,jhicksz,habitasse platea dictumst etiam,fermentum donec ut,diam vitae quam suspendisse,Jaxspan,372301567804085,71a5bd14-ba88-4cda-860d-9ca62347ba8d,539439867-4,Joševa,Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.,2016-04-09,,,Ready to Deploy,22,Zoombeat
        +Anna Turner,aturner10@opensource.org,aturner10,sed tristique in tempus,sodales scelerisque mauris,nullam porttitor,Oozz,4508062466823480,2b9c723e-e530-44c5-ab95-72f3ad50a631,526130314-1,Tawau,Sed ante. Vivamus tortor. Duis mattis egestas metus.,2016-03-10,815,Flexidy,Pending Diagnostics,36,Bluejam
        +Patricia Lawson,plawson11@businessinsider.com,plawson11,proin at,justo in,sed magna at nunc commodo,Nlounge,3567972196880867,f2c0248d-b6f6-42bf-a9a2-49c54372c01c,558108071-2,Valejas,,2015-07-27,,,Lost,35,Quire
        +Marilyn Gilbert,mgilbert12@comcast.net,mgilbert12,in hac habitasse platea,semper porta volutpat,proin eu,Rhyloo,6.30429100938515E+017,6e9c56b8-5266-47f1-86bc-f73a0d42b05e,562820613-X,Bulacnin,,2015-07-05,665.67,,Lost,,
        +Anne Lynch,alynch13@biglobe.ne.jp,alynch13,tincidunt nulla,turpis elementum,lobortis convallis tortor,Divavu,5102767739445831,db9913ae-d9ba-4653-aae5-590c2a3b5a69,943970793-3,Mayenne,Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.,2016-01-09,468.49,,Pending Diagnostics,33,Dynava
        +Lois Morgan,lmorgan14@wired.com,lmorgan14,imperdiet et commodo,vel,quis odio consequat varius,Camido,30453934961421,a6f3372c-73f1-4857-8ae6-432a2bdfd1c2,372636920-1,Shuiying,,2015-08-15,,,Archived,,
        +Lois Johnson,ljohnson15@japanpost.jp,ljohnson15,nulla suscipit ligula,eros elementum,felis fusce posuere,Zoomcast,3545613507860779,1c0928ec-2ef7-430b-a556-18b33451612b,903861200-1,Kahuripan,Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.,2016-03-29,721.77,,Pending Diagnostics,,
        +Jennifer Jones,jjones16@fda.gov,jjones16,primis in faucibus orci,porttitor pede justo,lorem quisque ut erat curabitur,Myworks,5127488524926932,3efa8d3c-01b2-408e-b592-f8cf18a510f4,413846137-X,Charneca,,2015-11-09,293.99,Trippledex,Pending Diagnostics,29,Devify
        +,,,aliquet pulvinar,tincidunt,rutrum at lorem,Meembee,5428127866845021,ef71ff15-fae8-4f6b-a19c-9277d5a29df9,762391548-7,Szydłowo,Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.,2015-12-23,15,,,,
        +David Jackson,djackson18@gravatar.com,djackson18,pede venenatis,magna,id pretium,Shuffledrive,201495288158933,eab62ffe-2e0b-4c77-8aa2-133d27bb90ab,309187247-5,Jinglongqiao,,2015-08-12,572.92,,Undeployable,21,Twimbo
        +Janice Ford,jford19@dmoz.org,jford19,nibh ligula,nibh in,lobortis vel dapibus,Brightbean,3567448770139061,42ec7b7d-5a37-4587-a3a7-e038ed650e94,741760231-2,Waenenda,Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.,2015-11-01,,,Pending Diagnostics,,
        +Todd Boyd,tboyd1a@nsw.gov.au,tboyd1a,metus vitae ipsum aliquam,in felis,sapien non mi,Jabbertype,3578620483518354,70e99274-5df6-4f1f-b2cc-3f9cffd3a828,387700497-0,Siedlce,,2015-06-07,983.85,,Ready to Deploy,,
        +,,,semper est,primis in faucibus,justo in hac habitasse platea,Dabvine,4.93639139113611E+018,e8aa6b0f-8f69-45cd-972c-b2b1e0415061,286742654-5,Minggang,"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.",2015-08-10,,,,,
        +Andrea Brooks,abrooks1c@shareasale.com,abrooks1c,non ligula,fusce posuere,ac enim in tempor,Youtags,5610029611282179,,226358965-1,Santa Gertrudes,Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.,2016-03-05,387.62,,Lost,29,Zava
        +,,,nisl venenatis,sodales,varius nulla facilisi cras non,Realbuzz,201496591284085,2952e308-122a-45ea-ac49-a836ca71a597,403999355-1,Huanxi,"Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.",2016-04-10,925.87,,,,
        +Anne Butler,abutler1e@elpais.com,abutler1e,sapien ut nunc,ultrices posuere cubilia,rhoncus mauris enim,Skibox,6.7712495618249E+018,3c1b4617-2219-419e-87fb-d654a0dab45e,756532468-X,Vyshniy Volochëk,In congue. Etiam justo. Etiam pretium iaculis justo.,2015-09-21,271.56,,Pending Diagnostics,,
        +,,,congue etiam justo,potenti nullam,congue risus semper porta,Oba,3571347945178711,9637ee81-b7ae-4465-8d19-61eec98ddf7f,577368722-4,Mostovskoy,"Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.",2015-07-27,,,,24,Edgeblab
        +Cynthia Stevens,cstevens1g@dyndns.org,cstevens1g,cursus vestibulum proin,ut volutpat,vel est donec odio justo,Skinte,6.33486824760947E+017,0bd330d0-3bde-4c47-a156-06a34435d8b4,058534741-7,Santa Rosa del Sara,"Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.",2016-04-26,,,Archived,36,Wikizz
        +,,,sapien urna,habitasse,eget semper rutrum nulla nunc,Browsecat,5010125018500456,bf03e70c-fb5d-4164-ab40-9b96d5465e6c,629074247-7,Bonneuil-sur-Marne,Phasellus in felis. Donec semper sapien a libero. Nam dui.,2016-03-21,810.91,,,12,Brainlounge
        +Donald Richardson,drichardson1i@over-blog.com,drichardson1i,eros vestibulum ac,nulla justo,natoque penatibus et magnis dis,Feedmix,3588017259302337,f0d7f3c9-dfea-4bb6-a401-571fffbf3090,984987793-6,Palue,,2015-10-02,718.94,,Ready to Deploy,34,Midel
        +,,,erat vestibulum sed magna,ipsum,eget eleifend luctus ultricies,Skipfire,3531685576372114,343daa1a-d1f8-4ffb-8368-a26670381a40,604121509-0,Medicine Hat,"Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.",2016-01-04,,,,,
        +Chris Ellis,cellis1k@squidoo.com,cellis1k,eros viverra,velit nec,mauris laoreet ut rhoncus aliquet,Jaxnation,5002354307429629,f66bce43-fccf-49d9-94d1-cb0b8fe56472,546719356-2,Qigzhi,,2015-11-21,585.87,,Pending Diagnostics,,
        +,,,non velit nec nisi,orci luctus et,sed vestibulum,Katz,30501008655301,e3d0a6ac-024b-4c21-ac30-536e6c3d5959,404764262-2,Mojokerto,"Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.",2016-02-03,605.49,,,32,Shufflester
        +Timothy Greene,tgreene1m@npr.org,tgreene1m,massa id lobortis,mattis pulvinar nulla,suscipit a feugiat et,Ainyx,3535277053604122,3c11f36f-e17b-4392-890b-35e5bc0bdffa,552778185-6,Chongqing,"Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.",2015-07-22,115.77,,Lost,34,Vinte
        +Doris Taylor,dtaylor1n@mapy.cz,dtaylor1n,magnis dis,neque aenean auctor,primis in faucibus orci luctus,Vipe,5048372964899039,bc134863-84be-4421-9938-d8ce0525ef1e,360343994-5,Xinbao,Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.,2015-11-18,,,Pending Diagnostics,33,Flashdog
        +Melissa Day,mday1o@archive.org,mday1o,justo sollicitudin,vestibulum velit id,tellus semper,Fivechat,3535789227456528,996499bc-968c-4ecc-a7d6-07e9348d552b,077200127-8,Nancheng,"Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.",2015-08-01,166.87,,Ready to Deploy,35,Trudeo
        +Laura Watkins,lwatkins1p@quantcast.com,lwatkins1p,quam pharetra,imperdiet,ut massa,Oyondu,4.90575358966523E+018,a7db733b-732c-4b54-901e-1ad28e145cb0,177033838-1,Wuhu,"Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.",2015-12-04,406.96,,Lost,14,Devpoint
        +Donna Kelley,dkelley1q@dailymotion.com,dkelley1q,sapien placerat,nulla elit ac,tincidunt eu felis,Aimbo,5610815292062918,fed4c9f9-8b0d-4d6a-ac43-c7929a31bb72,952276162-1,Arnhem,"Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.",2016-01-24,,,Pending Diagnostics,17,Kayveo
        +Adam Marshall,amarshall1r@marketwatch.com,amarshall1r,etiam faucibus cursus,cubilia curae mauris,massa id nisl venenatis,Skajo,3550363534806781,e7c5e464-9bbd-4d86-b549-3d3883b3139e,224555307-1,Dachang,Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.,2016-02-13,,,Lost,27,Skidoo
        +Peter Mills,pmills1s@instagram.com,pmills1s,diam id,dolor sit,ligula vehicula consequat,Gabtune,3566562640943303,efdf785c-a484-4454-8be0-d3b598c77a8d,269508722-5,Voi,"Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.",2016-05-23,312.07,,Archived,,
        +Christina George,cgeorge1t@163.com,cgeorge1t,vivamus vestibulum,quisque,id mauris vulputate elementum nullam,Yabox,6709339676453700,1a4d5946-1539-4ff1-921b-c442eef8c28b,596138325-3,Campamento,,2016-04-03,221.14,,Archived,,
        +Theresa Cunningham,tcunningham1u@infoseek.co.jp,tcunningham1u,nisl aenean lectus pellentesque,fermentum,nisl ut,Skimia,3575845905358914,70d0b5d4-8569-421c-912c-9ee11c565b62,769779519-1,Plei Kần,"In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.",2016-03-22,,Konklab,Ready to Deploy,13,Wordify
        +Stephanie Burke,sburke1v@unicef.org,sburke1v,ac neque duis bibendum,duis consequat,rhoncus aliquam lacus morbi,Centizu,3576056156747438,,709282846-5,Donghui,,2015-06-23,29.7,,Pending Diagnostics,,
        +Lillian Ferguson,lferguson1w@go.com,lferguson1w,elementum eu interdum,arcu libero rutrum,viverra pede,Muxo,5.6022311196475E+016,29de084a-9376-48dc-a310-cd01b1baf715,603152718-9,Camp Diable,,2016-02-09,,,Ready to Deploy,,
        +Bonnie Graham,bgraham1x@hexun.com,bgraham1x,mauris morbi non,tristique in tempus,ipsum aliquam non,Devpoint,6.30484505318487E+018,d8a596a6-f59a-4423-b424-b3d132c06791,297281098-8,Vlachovice,"Proin eu mi. Nulla ac enim. In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.",2016-02-10,553.28,,Archived,,
        +Michael Lawrence,mlawrence1y@addtoany.com,mlawrence1y,nonummy maecenas,nec euismod scelerisque,a suscipit nulla elit,Katz,3588657497186032,e95115b8-b45e-4a89-b271-c46732934394,740776342-9,Babica,"Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",2016-03-18,552.55,,Lost,,
        +Martin Scott,mscott1z@list-manage.com,mscott1z,sodales scelerisque mauris sit,ut erat,sem fusce consequat nulla,Linklinks,374283823495957,9a108aa1-568c-4141-a8d8-92a451f68e22,915137664-4,Reshetikha,Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.,2015-08-26,,,Archived,16,Kanoodle
        +Kelly Mitchell,kmitchell20@google.it,kmitchell20,vestibulum ante,quam sapien varius,morbi odio odio,Edgeclub,5.60224885282861E+018,319bf374-753a-49ef-885a-03a27dca4275,225439463-0,Lere,"Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.",2015-07-25,,,Ready to Deploy,34,Kwilith
        +Carol Hunter,chunter21@prnewswire.com,chunter21,phasellus in,est congue,tortor eu,Ozu,5602228882463423,a8be5948-b765-4f5d-9f1f-0f26952842d0,001757218-5,Tanabi,Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.,2016-03-11,81.15,,Lost,20,Skynoodle
        +Michelle Simpson,msimpson22@discuz.net,msimpson22,amet sapien dignissim,luctus nec molestie,mauris non ligula pellentesque,Mudo,3578002049296413,b8098077-560e-4a12-8bc1-220d83291032,815922090-1,Aegela,In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet.,2015-11-21,664.35,,Lost,28,Edgeblab
        +Pamela Martin,pmartin23@ca.gov,pmartin23,mollis molestie lorem quisque,ut,donec semper sapien a libero,Zoombeat,5048376726433136,cb7572bc-d7ca-4b5b-903e-fc567c337e32,057863524-0,Empangeni,"Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.",2016-04-06,711.1,Transcof,Ready to Deploy,,
        +Johnny Burke,jburke24@va.gov,jburke24,eros suspendisse,arcu,justo eu massa donec dapibus,Skipfire,5.60225202235212E+017,,155395513-7,Half Way Tree,In congue. Etiam justo. Etiam pretium iaculis justo.,2015-05-25,538.84,,Pending Diagnostics,,
        +Adam Stevens,astevens25@feedburner.com,astevens25,justo maecenas rhoncus,sed,in consequat ut nulla,Jetwire,3558754018062473,,296612694-9,Xinjian,Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.,2015-11-01,,,Undeployable,19,Minyx
        +Gloria Black,gblack26@samsung.com,gblack26,pharetra magna,et ultrices posuere,habitasse platea dictumst morbi,Bubbletube,3581295525802838,271065e6-f1fe-4d2b-aa47-76234656e29b,515439385-6,Santiago del Estero,,2016-05-12,948.04,,Lost,,
        +Christine Jenkins,cjenkins27@pbs.org,cjenkins27,justo morbi ut odio,sagittis,auctor gravida sem praesent id,Mynte,6.7633339031557E+018,30f840cb-acfd-4797-82ad-14c6ccad4d03,790003898-1,Ban Phan Don,,2016-01-19,89.14,,Archived,,
        +Michelle Riley,mriley28@networkadvertising.org,mriley28,justo maecenas,nulla tellus in,ligula in lacus,Izio,4.93637704926415E+018,b695a1c5-c4af-493e-8851-63aa41032c01,524481245-9,Munggang,,2015-11-21,895.08,,Undeployable,29,Feednation
        +Diana Torres,dtorres29@sciencedaily.com,dtorres29,nulla pede ullamcorper augue,rutrum rutrum neque,enim in tempor turpis,Jabberbean,3566203942437351,,743088297-8,Bromma,"In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.",2016-02-29,833.54,,Archived,,
        +Dorothy Simmons,dsimmons2a@adobe.com,dsimmons2a,amet sem fusce,id,hendrerit at vulputate vitae,Gabtype,5407504596351030,c6144e5d-0b64-44d1-bba5-0a7b0e3e78dc,998959453-8,Tawau,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2015-08-25,,,Lost,,
        +Michelle Hunt,mhunt2b@t-online.de,mhunt2b,orci vehicula,odio,eleifend luctus ultricies eu,Dazzlesphere,3544932891060288,9e1a7fdc-e410-4369-8203-f170e5e749b0,118824344-6,North Vancouver,Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.,2016-02-29,663.19,,Undeployable,30,Twiyo
        +,,,eu mi nulla ac,bibendum,ridiculus mus vivamus vestibulum,Skiptube,5602256523069580,659b0fc6-7107-4be4-8478-836366c4e23c,867984064-5,Hekou,Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.,2016-05-06,,,,16,Ntags
        +Andrew White,awhite2d@a8.net,awhite2d,a nibh,amet cursus id,curabitur in,Ooba,3536282915752555,f2cfaa82-b40f-4119-81c0-f5a8eeb06a38,222270511-8,Angeghakot’,"Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.",2015-06-08,651.3,,Pending Diagnostics,,
        +Brian Franklin,bfranklin2e@dot.gov,bfranklin2e,nisi eu orci mauris,hendrerit at vulputate,tortor duis mattis egestas metus,Jazzy,374622354851106,638497c0-4690-4872-b241-c15545806c8a,255225792-5,Duraykīsh,"Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.",2015-10-08,141.33,,Ready to Deploy,,
        +Martha Carter,mcarter2f@soundcloud.com,mcarter2f,posuere cubilia curae mauris,quis turpis,in magna bibendum imperdiet nullam,Demizz,6.75938318513741E+018,b3c36765-d42a-4c83-bc62-300bb07fde98,361952926-4,Opatov,,2015-07-08,599.89,,Ready to Deploy,,
        +Joe Stone,jstone2g@shinystat.com,jstone2g,ut at,dapibus,ultrices aliquet,Wikibox,3547109377511525,,100773046-3,Atbasar,"Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.",2016-01-31,16.78,,Pending Diagnostics,20,Gigazoom
        +Todd Brooks,tbrooks2h@nbcnews.com,tbrooks2h,sed sagittis nam,lacinia eget tincidunt,porta volutpat erat,Wikibox,36953984058725,,703472241-2,Oslo,Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.,2015-06-28,573.06,Solarbreeze,Ready to Deploy,31,Buzzshare
        +Janet Cox,jcox2i@virginia.edu,jcox2i,tristique est et tempus,sociis natoque penatibus,auctor sed,Dynazzy,6389179112138656,54316132-26aa-4bf0-9e1b-6dcd2afda6ce,715414385-1,Saidpur,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2015-09-15,,,Lost,,
        +Henry Richardson,hrichardson2j@shinystat.com,hrichardson2j,enim leo rhoncus,eros,dolor sit,Blogpad,3550068835419040,7d1c8d21-7a56-4c23-8649-061ddd708893,764086552-2,Momanalu,"Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.",2015-08-29,,,Pending Diagnostics,,
        +Rose Thompson,rthompson2k@goo.gl,rthompson2k,in faucibus,vitae ipsum aliquam,quam sollicitudin vitae consectetuer eget,Yakitri,5602225854973231,7bd1251a-ea8c-46dc-93d2-93f62d90a969,509026038-9,Rennes,In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.,2016-04-18,551.23,,Pending Diagnostics,,
        +Julie Hunter,jhunter2l@delicious.com,jhunter2l,morbi odio odio,sociis natoque,in sapien,Jatri,6706279710914494,ea523cc9-6428-4a4b-aed9-c470703891f1,900328219-6,Quevedo,"Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.",2015-09-07,291.69,Otcom,Undeployable,25,Jazzy
        +Dorothy Reed,dreed2m@dedecms.com,dreed2m,donec posuere metus,ut,tellus nisi,Kazio,3545354504978666,3772945a-1148-4051-8443-0ee8a92c5b17,328780394-8,Grujugan,,2015-09-19,488.83,,Pending Diagnostics,,
        +Phyllis Foster,pfoster2n@indiegogo.com,pfoster2n,amet erat nulla tempus,sit amet,aenean auctor,Shufflebeat,3533111501358076,db9552e3-13f9-40c4-9c2c-8bff3c4c0a89,611870818-5,Oepula,,2015-06-13,,Vagram,Ready to Deploy,,
        +Marie Henry,mhenry2o@accuweather.com,mhenry2o,odio consequat varius,pede justo lacinia,posuere cubilia curae nulla,Rhybox,3567546926048357,d6289b7b-4ed2-4ec8-a486-4cdd3591da21,277787832-3,Kotabaru,Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.,2015-07-03,157.31,,Undeployable,25,Bluejam
        +Linda Crawford,lcrawford2p@ocn.ne.jp,lcrawford2p,adipiscing elit proin,lobortis sapien sapien,blandit non,Jetpulse,6771123616739565,79bfd454-34f7-4eb5-8873-aaf43cc63856,982547121-2,Efeng,,2015-06-27,287.02,,Ready to Deploy,21,Babbleset
        +Thomas Dean,tdean2q@prnewswire.com,tdean2q,pede posuere nonummy,at nulla suspendisse,interdum in ante vestibulum,Demimbu,3570349766502210,11515f0c-7d36-4938-9656-ae35be5aad59,847767021-8,‘Ayn al Bayḑā,"Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.",2016-03-15,,,Ready to Deploy,20,Devcast
        +George Sanchez,gsanchez2r@photobucket.com,gsanchez2r,cras in purus,sed tristique in,consequat varius integer ac,Feedfire,6334048542335537,354f339d-547d-4b10-8753-a8e5cb18e1d9,408291765-9,Lakatnik,Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.,2016-01-01,,,Lost,25,Edgewire
        +Kathleen Alvarez,kalvarez2s@amazonaws.com,kalvarez2s,duis faucibus,mauris ullamcorper,orci luctus,Wikizz,6.30498754987502E+018,edb67bfb-ef81-44e7-a9fe-ee496816f7bc,134054338-9,Longsha,Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.,2015-07-06,,,Archived,,
        +Joan Rodriguez,jrodriguez2t@sohu.com,jrodriguez2t,morbi porttitor lorem id,leo,sem duis aliquam convallis,Janyx,6304963499994647,30a3b488-c5db-4569-ac68-46cb86424ff1,145564427-7,Arlington,"Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.",2015-07-17,,,Archived,28,Trunyx
        +Jean Russell,jrussell2u@shop-pro.jp,jrussell2u,nulla tempus vivamus,eu felis fusce,cubilia curae nulla dapibus,Yata,3578865180776215,f285b067-6992-4a07-b34d-ed174dc73611,761164290-1,Gamut,Sed ante. Vivamus tortor. Duis mattis egestas metus.,2016-01-11,27.46,,Ready to Deploy,,
        +Henry Chapman,hchapman2v@usa.gov,hchapman2v,erat nulla,morbi non,varius ut,Avamba,6759641695421678,d1f90868-5e42-46c3-aba7-7de3e3d74091,415061883-6,Ondoy,Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.,2015-07-07,,,Archived,,
        +Rebecca Nichols,rnichols2w@who.int,rnichols2w,praesent blandit lacinia,eu sapien cursus,lacinia sapien quis libero,Camimbo,30077414766248,cb932a82-1853-40cc-b6c0-28bf3b4ea677,194809534-3,Foundiougne,In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.,2015-12-03,,,Lost,29,Edgeblab
        +Norma Harper,nharper2x@histats.com,nharper2x,nisi vulputate nonummy,justo in,ornare consequat,Twinder,374622966591991,,875593621-0,Pruchnik,,2015-06-19,,,Lost,,
        +Henry Jacobs,hjacobs2y@tamu.edu,hjacobs2y,fermentum donec ut mauris,augue luctus,suspendisse ornare consequat lectus,Realcube,3528634905061019,88a71d08-c42b-43c7-bdb8-973a2e0efe47,112308770-9,Cabugao,"Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.",2016-03-05,787.63,,Undeployable,15,Tagpad
        +Matthew Walker,mwalker2z@shareasale.com,mwalker2z,vel augue,ipsum dolor sit,ante ipsum primis in faucibus,Tazz,5.01866181155617E+016,84198bfa-740b-4ff9-907e-05a9ef1bece4,160413103-9,Gwanda,In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.,2015-11-13,899.41,,Lost,18,Photobug
        +Diana Wells,dwells30@upenn.edu,dwells30,lobortis convallis,maecenas tincidunt,morbi non,Meevee,3570956119504428,5e030a75-f9b4-42fc-9958-f3dba0b7fc0a,171773317-4,Sokodé,Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.,2015-05-25,243.93,,Undeployable,,
        +Keith Barnes,kbarnes31@prnewswire.com,kbarnes31,dui vel sem,iaculis,justo maecenas rhoncus aliquam,Topicstorm,4041595978958,60e9678e-026b-47c7-b7cb-dc00677aaed7,501758906-6,Goz Béïda,,2015-07-18,706.29,,Ready to Deploy,29,Jaxspan
        +Julia Romero,jromero32@youku.com,jromero32,lacinia sapien quis libero,ante vestibulum,at feugiat non pretium quis,Dabtype,3560250144664841,147b19d6-1712-4435-aa35-07de51b13306,647505330-9,Ishurdi,"Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.",2016-03-06,993.95,,Archived,,
        +Catherine Gonzales,cgonzales33@apache.org,cgonzales33,suscipit nulla,aliquet massa,viverra dapibus nulla suscipit ligula,Mudo,30108606484462,aa2e2be0-9f07-4311-a402-a11b2a6ca0d8,650783961-2,Xianxi,Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.,2016-01-25,669.89,,Undeployable,20,Yabox
        +,,,ultrices enim lorem,leo rhoncus sed,cras non velit,Npath,5048375808154248,7fa57f76-d4fe-4871-8296-20ecd1627acb,192573987-2,Zhongzhai,Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.,2015-11-09,352.64,,,,
        +Arthur Carter,acarter35@time.com,acarter35,pede lobortis,suspendisse accumsan tortor,lacus curabitur at,Dynabox,201897802174892,7ae2a979-52f8-4ce4-ab76-3c0f336589ae,613690706-2,Mangunjaya,Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.,2015-09-24,,Alphazap,Archived,35,Tekfly
        +Jack Henderson,jhenderson36@skype.com,jhenderson36,ut erat id,sapien,etiam pretium,Zoombox,4.91136995824574E+018,80744318-59a6-4be4-8876-428bb2eb6182,122507763-X,Lieqiao,"In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.",2016-01-03,91.35,,Pending Diagnostics,,
        +Janice Mills,jmills37@sphinn.com,jmills37,cubilia curae donec pharetra,non,pede libero quis,Oyondu,3564650478504040,51df7750-55b9-43ee-ba42-4baf70209c96,113885169-8,El Crucero,"Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.",2016-01-04,475.07,,Lost,,
        +Janet Burke,jburke38@home.pl,jburke38,tincidunt nulla mollis,vulputate ut,nibh in quis,Zooveo,6387186677750447,,244101401-3,Cuijiamatou,"Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.",2015-07-25,900.01,,Archived,12,Npath
        +Rose Smith,rsmith39@nymag.com,rsmith39,pede venenatis non,pellentesque quisque porta,cursus id turpis integer,Buzzshare,3573360216468750,c8de4be3-fdc8-4d57-b1d8-26414ad341bf,691575472-5,Berdyans’k,,2015-10-09,708.94,,Undeployable,14,Topiclounge
        +Rachel Rice,rrice3a@blogs.com,rrice3a,in hac habitasse platea,nulla,odio odio,Bubbletube,30327857110960,6388f77f-cc36-41ca-8482-2cfc5c0e6bdf,007983155-9,Cibeusi,"Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.",2015-06-25,532.83,,Pending Diagnostics,16,Shuffletag
        +Judith Morrison,jmorrison3b@nhs.uk,jmorrison3b,ut rhoncus,quam fringilla rhoncus,neque libero convallis,Jamia,6.75935914853866E+018,b8186328-c3b6-479b-bec9-3613ce9698d1,977093557-3,Ramada,,2015-12-07,,,Pending Diagnostics,,
        +Kathy Peterson,kpeterson3c@weebly.com,kpeterson3c,nulla ultrices,ac est lacinia,est quam pharetra magna ac,Flashpoint,5100135124378581,02bead54-767b-4f61-a085-5439aeaf1712,349567419-5,Chonghe,,2015-09-08,,,Pending Diagnostics,,
        +,,,tortor duis,dictumst morbi,quam a odio in,Avavee,5518385515115466,2fb047a6-ff89-4d9d-bfe6-304acad6ef17,145992551-3,Strelitsa,Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.,2015-12-22,741.63,,,,
        +Richard Howell,rhowell3e@msu.edu,rhowell3e,venenatis non,et,vehicula condimentum,Tagcat,6.33110952678068E+017,8bbd2e80-6a66-4210-926d-6f45c896143a,957728455-8,Rāwandūz,Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.,2015-07-17,205.46,,Pending Diagnostics,26,Youtags
        +Mark Evans,mevans3f@businessweek.com,mevans3f,dolor quis odio,imperdiet,viverra diam vitae quam,Plambee,3558900459434834,,871649171-8,Klukeng,Sed ante. Vivamus tortor. Duis mattis egestas metus.,2016-05-09,413.07,,Archived,22,Izio
        +Joan Wagner,jwagner3g@earthlink.net,jwagner3g,adipiscing elit,fusce,suspendisse ornare consequat,Kamba,201484896304931,4571c470-5dce-40b5-8b2f-1262071ec940,747966524-5,Mollās̄ānī,,2016-03-08,,,Pending Diagnostics,26,Wikibox
        +Lillian Simmons,lsimmons3h@icio.us,lsimmons3h,ac enim in tempor,in tempor turpis,lacinia erat,Chatterbridge,5100146736106146,9a43a613-f009-4dd8-94ac-8af4a67b4dd0,178043767-6,Đoan Hùng,"Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.",2016-05-02,181.91,,Archived,18,Voomm
        +,,,amet diam,consectetuer eget,et magnis dis,Trupe,201622330574532,2947a0fc-1cae-4838-b315-df505ae4a9d6,808569614-2,Mweka,Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.,2015-11-09,966.58,,,,
        +Arthur Morgan,amorgan3j@google.ca,amorgan3j,vestibulum eget,ut odio cras,vel nisl,Tanoodle,3532266060924154,fa077cd0-ba8d-4225-8eb4-84033ed235fc,863693363-3,Zbůch,,2015-09-23,,,Archived,31,Blognation
        +,,,tempus vivamus,cras,nonummy maecenas tincidunt lacus,Zoomzone,3530625218870928,a37407ca-e6af-408c-9b9a-1aa9f90f7681,009595242-X,Sanzhang,Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.,2016-03-27,,,,18,Layo
        +Joan Matthews,jmatthews3l@ca.gov,jmatthews3l,ultrices aliquet maecenas,pretium iaculis,mus vivamus vestibulum,Bubblemix,3530545021176695,1e99a09a-06ab-4ba2-a98d-785f7c64ebe2,827817985-9,Jalasenga,"Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.",2016-03-19,784.52,It,Undeployable,,
        +Jose Larson,jlarson3m@blogspot.com,jlarson3m,dolor morbi vel lectus,cum sociis,fringilla rhoncus mauris enim,Thoughtmix,3582585977910835,4c75547e-5c7a-45be-b532-ec13873b5ddd,179689579-2,Jaboatão,,2015-07-15,638.29,,Archived,24,Meejo
        +Eric James,ejames3n@nbcnews.com,ejames3n,nulla integer,aliquam augue,sem duis aliquam,Trudeo,3584687842880959,,059264762-5,Suwa,"Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.",2016-02-14,,,Ready to Deploy,34,Zoonder
        +Sara George,sgeorge3o@thetimes.co.uk,sgeorge3o,leo odio,pretium quis,varius nulla facilisi,Babbleblab,337941672639555,ccf578a6-e39c-45cf-a656-3a948922aee1,133207649-1,Krajan Puru,"Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.",2016-04-13,604.35,,Lost,14,Tagfeed
        +,,,dapibus at diam,morbi,ante ipsum primis in faucibus,Lazz,201999051559391,b15d20dc-eed3-47a4-a83f-67229d154e95,041974769-9,Kengkou,Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.,2015-12-29,662.67,,,,
        +Ashley Torres,atorres3q@google.ru,atorres3q,eu interdum eu,eleifend,orci nullam molestie nibh in,Yacero,6.30480625439569E+018,bfdad967-af1e-4bbf-b456-eca3259120de,184953647-3,Tosontsengel,"Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.",2016-04-10,330.47,,Ready to Deploy,18,Trilith
        +Andrea Owens,aowens3r@digg.com,aowens3r,eget congue,congue,purus eu,Realmix,3562617492300509,d3b995cd-cc81-4761-b7bd-5b160bb199b8,795122803-6,Middelburg,"Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.",2015-07-11,925.85,,Archived,15,Mydeo
        +,,,pede justo eu,pellentesque volutpat dui,consectetuer adipiscing elit proin,Riffpedia,374283107255804,b16407a3-9d08-421e-b386-ab93a838a67d,892497373-8,Zaragoza,Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.,2016-04-03,187.77,,,,
        +Evelyn Wright,ewright3t@gmpg.org,ewright3t,ut suscipit,sit,tortor id nulla ultrices aliquet,Browseblab,3566901421682690,c698ba68-bc82-4aff-acb3-5884c9f80296,162198086-3,Fuchun,,2015-10-29,718.76,,Pending Diagnostics,21,Edgeblab
        +,,,velit donec diam neque,augue,non velit,Jabberbean,3577223053605601,89a8527c-f296-4146-b4c0-81bf896f8af6,653699580-5,Crumlin,Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.,2015-10-18,648.77,,,,
        +Melissa Rogers,mrogers3v@army.mil,mrogers3v,id ornare imperdiet sapien,a ipsum,libero nam dui proin,Rhynoodle,4026264559297795,fb87796a-6f51-4dd8-af0c-c079423a0364,356963504-X,Verkhnyaya Belka,"Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.",2016-02-23,646.41,,Pending Diagnostics,35,Yambee
        +Susan Palmer,spalmer3w@tiny.cc,spalmer3w,montes nascetur ridiculus,ut,sed justo,Jabbersphere,3584134828079298,216ce7c7-3bc1-446a-b240-9ee34dbbf605,333143943-6,Raoshi,,2016-01-05,469.31,,Undeployable,,
        +Joseph Mason,jmason3x@scribd.com,jmason3x,volutpat dui maecenas,sed vestibulum sit,eu est congue,Photobean,3531364203546819,1dd924ac-243a-42f7-af03-18e7074d2d8a,657518473-1,Lyon,Fusce consequat. Nulla nisl. Nunc nisl.,2016-03-04,908.76,,Lost,30,Yamia
        +Christina Wood,cwood3y@digg.com,cwood3y,eget nunc donec,potenti cras in,lorem id ligula,Topicware,6763202349529137,d2170b43-c046-4189-88a0-0f3b3b4ab636,499571423-5,Pengfang,,2015-11-24,562.82,,Pending Diagnostics,15,Camido
        +Dennis Chavez,dchavez3z@senate.gov,dchavez3z,nisi vulputate nonummy maecenas,dictumst aliquam augue,duis ac,Blogspan,5048370656048956,1bba6cc4-b7fd-4614-82a1-058a6dcf5cff,340219850-9,Carmen de Viboral,,2015-08-31,764.65,,Undeployable,,
        +Emily Roberts,eroberts40@privacy.gov.au,eroberts40,sed lacus morbi,est,nibh fusce lacus purus,Skyba,6.76760499675562E+017,79a0ca4b-0cfc-450b-8b99-91995e017d06,393164024-8,Syamzha,"Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",2015-09-26,129.34,,Lost,,
        +Christine Cooper,ccooper41@buzzfeed.com,ccooper41,rutrum nulla nunc,vulputate,commodo vulputate justo,Skyba,201990757415202,0dcd299f-f6ad-448e-8ee2-9366b2c6fab1,634821306-4,Vyerkhnyadzvinsk,"Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.",2015-07-10,970.05,,Undeployable,13,Kare
        +Lois Sanders,lsanders42@nps.gov,lsanders42,elementum eu,donec,purus aliquet at feugiat,Ntags,201886666765648,da4f2d20-d589-4d67-99a5-ba1a91f89c67,696680010-4,Kwali,,2016-01-23,592.32,,Lost,,
        +Jonathan Carroll,jcarroll43@microsoft.com,jcarroll43,ut nunc vestibulum ante,nec,maecenas tincidunt lacus at velit,Zoomzone,5.02094884070623E+018,f2721951-674f-42a6-a318-ebc4c2ad01d6,767022282-4,Hukou,Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.,2015-07-25,100.04,,Lost,,
        +,,,sagittis nam congue,neque vestibulum eget,lorem vitae mattis nibh,Rhynoodle,3536985805530234,fd38d1eb-46bc-438c-a1f1-e3d46c7ab7ff,446825369-X,Pogag,"Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.",2015-09-14,282.91,,,,
        +Heather Welch,hwelch45@cyberchimps.com,hwelch45,lorem id,quis odio,ullamcorper augue a suscipit nulla,Dynabox,3584918729913617,2b8a3a33-23e4-4f7c-bfa2-cda5a4f161a7,453899036-1,Bulqizë,"In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.",2016-05-22,937.05,,Undeployable,,
        +Paul Allen,pallen46@gravatar.com,pallen46,mus etiam,consequat varius,non ligula,Youopia,3579590994419856,8c118547-498c-4c9a-bb7c-38bf34c948f6,059415701-3,Niederanven,,2016-04-10,528.2,,Archived,,
        +Sarah Cox,scox47@nih.gov,scox47,venenatis tristique fusce congue,ultrices aliquet maecenas,quam turpis adipiscing lorem,Tagchat,5402364995491845,,907635086-8,Świętajno,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2015-05-28,136.71,,Undeployable,29,Rooxo
        +Sara Hayes,shayes48@boston.com,shayes48,lobortis est phasellus sit,at,at velit eu,Ozu,3529024230545655,f6dfecd8-6e31-4f7a-ac69-7d78288b3c50,924210851-0,Las Trojes,,2015-06-10,239.46,,Lost,,
        +Marilyn Hunt,mhunt49@dagondesign.com,mhunt49,pulvinar nulla pede ullamcorper,vel nulla eget,justo aliquam quis turpis eget,Mycat,3579823933687295,,052859686-1,La Mesa,,2015-11-21,665.35,,Lost,,
        +Antonio Jordan,ajordan4a@joomla.org,ajordan4a,tempus semper est,massa volutpat convallis,id ligula suspendisse ornare,Babblestorm,3563899999001645,bad2fb72-05bf-4bd1-928e-4474f41bf61e,937286949-X,San Mariano,,2016-03-08,738.25,,Lost,,
        +Doris Russell,drussell4b@utexas.edu,drussell4b,nunc donec,varius,ut dolor morbi vel lectus,Skyble,5100172494380202,d028c3fb-74ea-4e2f-a4ff-86b869f88f7a,523965895-1,Fenghuanglu,"Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",2015-09-19,433.76,,Pending Diagnostics,,
        +Gary Gutierrez,ggutierrez4c@washington.edu,ggutierrez4c,quam pharetra magna ac,ullamcorper augue a,platea dictumst,Realfire,4.91144176388878E+018,6c1b81d0-0b44-4cfd-9a29-1abb81d6dd8b,624477386-1,Wuyanquan,,2015-12-27,783.9,,Ready to Deploy,,
        +Mary Long,mlong4d@springer.com,mlong4d,dolor morbi vel,sit amet cursus,ante ipsum primis in faucibus,Shuffledrive,3563327459528782,6d8835b2-8241-4b4d-afff-95f6aa252ef4,737509813-1,Freiria,"Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.",2016-02-11,139.88,Solarbreeze,Undeployable,16,Chatterpoint
        +Martha Olson,molson4e@myspace.com,molson4e,nulla dapibus,orci luctus,felis sed,Vinder,5523504746793551,10ce22fe-38b7-4329-92a7-bd6dd7a35779,140866058-X,Rangah,"In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.",2016-03-21,493.73,,Archived,,
        +Willie Crawford,wcrawford4f@chronoengine.com,wcrawford4f,ac nibh,pharetra magna,non interdum,Jamia,3533461555472467,bb5962ec-37e3-4e87-93ae-e748aad36f0d,564625708-5,Hīrna,"Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",2015-09-07,,,Undeployable,,
        +Shirley Butler,sbutler4g@google.fr,sbutler4g,augue luctus tincidunt,nibh in,nulla justo aliquam quis,Skyble,3543865682244185,61ea2737-22f0-40c9-b1d0-8c8bcb49024c,510924762-5,Bradag,Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.,2015-06-04,232.69,,Lost,,
        +Amanda Perkins,aperkins4h@facebook.com,aperkins4h,magna ac,leo,eu orci mauris,Gigashots,3534002218741291,723cb029-3cc3-4fa1-ae81-46897e1b0cd5,992799439-7,Charneca da Cotovia,,2015-06-02,185.11,,Undeployable,17,Yoveo
        +Jason Mendoza,jmendoza4i@studiopress.com,jmendoza4i,est quam pharetra magna,vestibulum sagittis,vehicula condimentum curabitur in libero,Browseblab,3533638286064040,fa051420-1c81-4f0d-a5d4-0d966801ac92,943747227-0,Yunzhong,"Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.",2016-03-03,,,Pending Diagnostics,,
        +Ernest Spencer,espencer4j@skyrock.com,espencer4j,id pretium,fringilla,porttitor id consequat in consequat,Devshare,6.75976956722772E+016,b04f9655-5453-4003-b4ff-a2c04fb7cc14,187554544-1,Sukasenang,"Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.",2016-05-15,,,Undeployable,,
        +Roy Burton,rburton4k@uiuc.edu,rburton4k,sed tristique in,sit amet cursus,id massa id nisl venenatis,Tagtune,3547271219604254,,492976895-0,Pakuranga,Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.,2015-07-14,44.95,,Archived,14,Meembee
        +Edward Palmer,epalmer4l@lulu.com,epalmer4l,enim blandit mi,ipsum praesent,lectus pellentesque at,Roomm,337941483315940,5039582c-b5cf-4b9e-8f07-6341560cae04,007320130-8,Vanves,"In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.",2016-01-23,610.68,,Archived,,
        +Christine Gonzales,cgonzales4m@gmpg.org,cgonzales4m,pede ac diam cras,nec nisi,tincidunt lacus at velit vivamus,Dynava,3573979602020378,22bac401-b902-4fa6-987c-27238e4982f1,169662058-9,Xianglong,,2015-07-02,742.54,,Lost,,
        +Samuel Snyder,ssnyder4n@spiegel.de,ssnyder4n,rhoncus aliquet pulvinar,suscipit a feugiat,sed tristique in tempus,Centizu,3554059573408622,a53ca64f-9589-4c14-9f1f-9fbd7c130bf1,134899168-2,Kopang Satu,,2015-08-24,,,Undeployable,,
        +Craig Powell,cpowell4o@fda.gov,cpowell4o,adipiscing lorem vitae,at diam nam,vivamus metus arcu adipiscing,Wikivu,3530205336633621,74d45443-31f9-4149-bdbd-b81a49a8fc26,841640422-4,Valkeakoski,Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.,2016-05-08,617.19,,Archived,16,InnoZ
        +Shawn Vasquez,svasquez4p@a8.net,svasquez4p,erat vestibulum,ullamcorper augue,adipiscing molestie hendrerit at vulputate,Blogspan,3537869019746662,b05201f2-5fca-4c51-804c-c5690272809b,981888153-2,Kazinka,,2016-04-04,814.56,,Undeployable,27,Ooba
        +,,,fringilla rhoncus mauris,pretium,orci mauris lacinia,Brightbean,374283783131519,f3317f7a-8b58-4e6e-9c98-bb0990b48de2,364170641-6,Abashiri,"Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.",2016-01-23,977.48,,,,
        +,,,in imperdiet,lectus,in congue etiam,Topdrive,5.60225892846392E+018,6264ae5b-7977-4a7c-80e0-6fb69ee37bb6,356456589-2,Songdong,"Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.",2016-04-07,782.48,,,19,Eayo
        +Jane Mason,jmason4s@ask.com,jmason4s,nisl ut volutpat sapien,amet consectetuer,nec sem duis aliquam,InnoZ,3581759486996442,bbf6c2d3-f538-411d-b3ca-07f87eb514c9,215895129-X,Lincheng,"Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.",2015-08-18,,,Archived,14,Voolia
        +Jeremy Ross,jross4t@state.gov,jross4t,neque libero convallis,volutpat quam,sagittis nam,Agivu,5.60223009236108E+018,85cebfbc-d8ef-4f12-a56c-52d920daff55,533951910-4,Shangtianba,In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.,2016-02-22,814.64,,Archived,,
        +Anthony Cruz,acruz4u@ycombinator.com,acruz4u,sapien placerat ante,justo sit,lectus pellentesque,Fivechat,6.76708599977152E+018,a61d9de9-aee4-41e5-b923-c9f0b6af353f,516270880-1,Bangolo,,2015-06-15,748.03,,Archived,,
        +Janice Kim,jkim4v@tmall.com,jkim4v,feugiat et eros vestibulum,id ligula,dapibus dolor vel,Vitz,3528040134299653,6f58dc1c-1eec-4a6a-89ce-54c0ca6d7ace,906786221-5,Stepove,Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.,2016-02-05,245.24,,Ready to Deploy,,
        +Cheryl Schmidt,cschmidt4w@mac.com,cschmidt4w,amet nulla quisque,eget massa tempor,in hac habitasse platea dictumst,Topiczoom,3557006552255133,242df59e-540c-4ae4-9574-b2a1cf0c328f,946770951-1,Bara Datu,,2015-10-14,101.41,,Archived,,
        +Betty Long,blong4x@is.gd,blong4x,congue diam id,hac habitasse,quis turpis sed,Linktype,3531953377823515,806c60b9-0518-48b4-88e7-e0f7d37db7f4,714515414-5,Richmond,"Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.",2015-07-14,48.61,,Pending Diagnostics,28,Buzzster
        +Joe Foster,jfoster4y@hao123.com,jfoster4y,elementum ligula,varius nulla facilisi,ante ipsum primis in faucibus,Twitterwire,3553000703370598,004beb8c-6350-4a5a-bc0a-63ae792afe54,109876345-9,Union,"Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.",2016-03-18,,,Archived,,
        +Lisa Black,lblack4z@elpais.com,lblack4z,aenean fermentum,eget nunc donec,faucibus orci luctus,Ailane,6.77139784464648E+016,5f17fc64-ef57-4884-a55f-eb573d697df3,441234671-4,Nurota Shahri,"Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.",2015-07-13,179.08,,Archived,22,Yodoo
        +Katherine Frazier,kfrazier50@jimdo.com,kfrazier50,nulla nisl nunc nisl,nascetur,justo eu,Edgetag,3552389058992572,fc437480-f186-49fa-87d3-bbea40c6f142,446611490-0,Reguengos de Monsaraz,Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.,2016-05-18,960.59,,Pending Diagnostics,,
        +Lois Sanchez,lsanchez51@yellowbook.com,lsanchez51,consectetuer adipiscing elit proin,in felis,purus sit amet nulla quisque,Gabtune,5002359749827009,9c0affc9-3c66-4516-aea7-b1d847590c64,242378972-6,Bang Lamung,,2015-06-10,,,Lost,,
        +,,,consectetuer adipiscing elit,eros,ligula vehicula consequat morbi,Oodoo,4405292980607713,b321fffc-88c6-4223-a4c7-e7b513ca12ea,869734139-6,Hongjiang,"Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.",2015-10-12,136.67,,,,
        +Carl Vasquez,cvasquez53@github.io,cvasquez53,sapien urna,congue etiam,nulla facilisi cras,Katz,5100177038440966,54ca7672-f4a9-46d1-8842-a4f5b3ef8a61,172650221-X,Hechun,"Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.",2015-08-04,29.63,,Archived,14,Thoughtworks
        +Gary Myers,gmyers54@omniture.com,gmyers54,fusce consequat nulla nisl,amet consectetuer adipiscing,rutrum neque aenean auctor gravida,Eamia,5.60222512906447E+016,59f8f748-c09d-4511-a5b2-85fd469ded76,288508590-8,Azun Atme,Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.,2015-11-19,872.99,,Pending Diagnostics,,
        +Julie Watkins,jwatkins55@hatena.ne.jp,jwatkins55,sed sagittis nam congue,vehicula,vel dapibus at diam nam,Jabbercube,6.75901114016155E+018,d48acb86-3a62-42cc-a88f-75a3a458a2b3,602874973-7,Tonghu,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2015-12-22,517.54,,Ready to Deploy,27,Livetube
        +,,,ante ipsum,in quis justo,quam fringilla rhoncus,Topiczoom,6.70972201649997E+018,57e10cfb-8811-4b3b-ac41-5af69cab6d31,851596451-1,Aoluguya Ewenke Minzu,In congue. Etiam justo. Etiam pretium iaculis justo.,2015-08-02,992.72,,,17,Skiptube
        +Harry Carter,hcarter57@icio.us,hcarter57,pulvinar nulla pede,potenti in eleifend,convallis nulla neque libero convallis,Linktype,30452034512787,bca3bec1-cd84-4e44-adf9-2d266bfe0507,943283235-X,Cachoeiro de Itapemirim,,2015-08-30,633.31,,Lost,31,Dabjam
        +,,,dolor quis odio consequat,diam erat fermentum,proin leo odio porttitor,Edgewire,3563543318424332,1685ce6c-7936-4563-925f-7f3b3b9c0a3d,040550980-4,Nusajaya,"Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.",2016-02-04,,,,,
        +Harold Rice,hrice59@si.edu,hrice59,congue etiam justo,justo sit,id massa id,Innojam,4913067546227080,291a2ce5-c22e-4782-b4aa-ef147fccef40,103809062-8,Chornyanka,Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.,2015-06-10,289.46,Konklux,Undeployable,,
        +Cheryl Owens,cowens5a@friendfeed.com,cowens5a,tincidunt nulla mollis,platea dictumst,ut massa quis,Kwimbee,6.33300098040684E+018,abe4c9e3-aeb2-407b-8545-3c2e5c29b942,698953325-0,Bula,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2015-12-25,,,Undeployable,,
        +Patricia Nelson,pnelson5b@unicef.org,pnelson5b,vel augue,iaculis justo in,primis in faucibus orci luctus,Camimbo,374288913295969,8873831c-2370-4fcc-bc23-a66a2a379151,147321108-5,Novoarkhanhel’s’k,Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.,2015-08-09,,,Pending Diagnostics,27,Tazz
        +,,,justo sit amet,convallis,nunc viverra dapibus,Meevee,3551827310027811,d6ff99f7-3f70-4cd1-8835-12fb324783bb,404043143-X,Santiaoshi,,2015-05-31,613.59,,,24,Flipstorm
        +Jonathan Dixon,jdixon5d@dailymotion.com,jdixon5d,consequat varius integer ac,amet,pellentesque at nulla suspendisse,Realcube,3548349620700470,52e75c85-f2dc-4346-8615-c4bef2675fb5,759833466-8,Verin Artashat,"Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.",2015-12-08,854.21,,Pending Diagnostics,12,Skiptube
        +Linda Fernandez,lfernandez5e@zimbio.com,lfernandez5e,pede lobortis ligula,fusce,pede ac,Kwideo,3544675304363423,a385ede0-c8e6-45cc-b125-be149bbc0271,697050795-5,Porsgrunn,Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.,2015-07-04,412.28,,Ready to Deploy,,
        +Louis Ortiz,lortiz5f@w3.org,lortiz5f,aliquam erat volutpat in,nibh,vel sem,Jabbertype,3577197934305492,0b44ec74-81de-4421-baec-1fd1f497bedd,492892856-3,Sionogan,,2015-11-23,462.04,,Ready to Deploy,34,Thoughtworks
        +Donald Lynch,dlynch5g@lycos.com,dlynch5g,vestibulum ante ipsum primis,lectus vestibulum,ut dolor morbi vel lectus,Mycat,3528635375178696,86b60c4e-9a98-47b4-92db-466162306529,234535580-8,Tokonou,Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.,2016-02-03,,,Undeployable,13,Skynoodle
        +Ernest Dixon,edixon5h@rakuten.co.jp,edixon5h,nulla neque,molestie lorem,mi in porttitor,Bluejam,6.33110336414412E+018,45e9100c-17a9-4806-a7ee-b731162718f4,321912329-5,Bayasgalant,"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.",2015-06-26,302.69,,Lost,,
        +Carlos Hart,chart5i@imdb.com,chart5i,lectus pellentesque,lorem ipsum dolor,leo odio porttitor,Plambee,3537576873519636,44a1e395-adfa-4097-a356-2caf29f31458,679447867-6,Wādī as Sīr,"Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.",2015-08-05,590.47,,Undeployable,36,Jayo
        +,,,dui maecenas,pulvinar sed,pede ullamcorper augue,Lazz,5100144951053200,,524105876-1,Nabīnagar,Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.,2016-02-04,,,,,
        diff --git a/sample_csvs/MOCK_CONSUMABLES.csv b/sample_csvs/MOCK_CONSUMABLES.csv
        new file mode 100644
        index 0000000000..b975e31999
        --- /dev/null
        +++ b/sample_csvs/MOCK_CONSUMABLES.csv
        @@ -0,0 +1,101 @@
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +eget,01/03/2011,85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
        +Morbi,10/24/2016,87.42,iaculis,Lavasoft,W787T62Q,Ranitidine HCl,1,374
        +arcu.,09/22/2007,48.34,ornare,Google,N961E50A,Amoxicillin,False,252
        +nec,08/16/2009,8.71,lectus,Apple Systems,X624N14C,Lantus Solostar,1,30
        +Nam,03/30/2017,24.07,"a,",Macromedia,N618A20S,Hydrocodone/APAP,True,551
        +Nullam,12/16/2003,73.23,"Donec est mauris,",Yahoo,B386I67L,Fluticasone Propionate,No,395
        +erat,08/03/2010,17.49,Proin,Borland,G606H92I,Amlodipine Besylate,1,297
        +purus,10/12/2004,63.52,tellus justo sit,Chami,R660Z45O,Omeprazole (Rx),Yes,557
        +dignissim,11/10/2010,77.94,nibh vulputate mauris,Lavasoft,G230Z67X,Risperidone,1,47
        +Nam,01/25/2015,64.33,taciti sociosqu ad,Microsoft,B613L84C,Suboxone,No,310
        +Nunc,04/13/2017,81.02,nec orci.,Borland,O367N55N,Fluoxetine HCl,No,404
        +Phasellus,12/23/2005,70.67,"quis, tristique ac,",Borland,K941C02T,Alendronate Sodium,0,590
        +Nulla,07/21/2017,99.04,augue malesuada malesuada.,Lycos,D663L90H,Allopurinol,No,48
        +at,10/31/2007,58.42,"dolor sit amet,",Lavasoft,Y229E62I,Simvastatin,No,181
        +Sed,04/14/2011,48.86,"lectus convallis est,",Cakewalk,T666E70K,Fluconazole,True,169
        +quis,01/08/2014,55.64,"varius orci,",Lycos,T767G07U,Advair Diskus,False,264
        +viverra.,01/07/2013,93.48,"cursus et, magna.",Sibelius,T276L44H,Loestrin 24 Fe,No,293
        +Sed,03/20/2008,64.75,arcu. Sed,Cakewalk,A933E55V,Pantoprazole Sodium,No,407
        +iaculis,07/17/2015,56.74,nec,Borland,N568F73C,Venlafaxine HCl ER,No,115
        +leo.,12/09/2012,96.88,Aenean,Altavista,H283Z42U,Cephalexin,True,208
        +leo.,04/24/2007,40.87,tincidunt adipiscing. Mauris,Lycos,T054Q83U,Lyrica,0,486
        +pede.,09/29/2010,19.64,nec enim. Nunc,Chami,L842O70A,Simvastatin,Yes,214
        +massa,05/18/2015,18.43,nisi magna sed,Adobe,V029Q52K,Meloxicam,0,131
        +urna,10/22/2014,7.41,ac,Sibelius,Z708U15X,Flovent HFA,Yes,15
        +sapien,03/23/2017,50.94,penatibus et,Google,D258T89Z,Zolpidem Tartrate,True,48
        +non,05/14/2005,71.71,dui. Fusce,Borland,C021V01R,Amphetamine Salts,True,593
        +"et,",10/18/2014,94.56,natoque penatibus et,Lavasoft,L351F80J,Gianvi,1,305
        +pede,02/18/2004,10.04,felis,Yahoo,D516U60J,Pravastatin Sodium,1,302
        +lobortis,06/08/2011,31.17,"luctus,",Yahoo,D088E82H,Azithromycin,Yes,380
        +placerat,06/19/2005,5.38,eget,Adobe,V472U75G,Nexium,0,-2
        +leo,10/03/2014,17.00,justo,Lycos,F944A58V,Ibuprofen (Rx),True,294
        +dictum,11/24/2015,92.11,tellus faucibus,Apple Systems,U938K61D,Oxycontin,Yes,368
        +bibendum.,05/01/2010,22.45,elit erat vitae,Lavasoft,Z326Q13R,Tramadol HCl,Yes,12
        +"facilisis,",01/02/2011,85.42,purus,Finale,Z475L99M,Alprazolam,True,359
        +bibendum,08/20/2009,44.68,et pede. Nunc,Google,N039W21L,Fluticasone Propionate,True,569
        +eleifend,03/17/2006,22.92,velit. Cras,Lavasoft,H339Z61T,Doxycycline Hyclate,Yes,219
        +rhoncus.,03/17/2009,82.52,"feugiat non, lobortis",Altavista,R524N72A,Atenolol,0,176
        +a,04/03/2016,4.35,nunc,Sibelius,V055S56Y,Simvastatin,Yes,326
        +enim.,05/15/2014,20.18,lectus justo,Google,I747M47J,Atenolol,1,101
        +molestie,06/19/2012,11.30,sem ut cursus,Apple Systems,F888J26K,Amoxicillin,Yes,405
        +dui.,05/16/2010,72.42,consectetuer euismod,Cakewalk,U999A42H,Atenolol,False,253
        +tortor.,08/02/2017,38.51,ultrices iaculis odio.,Lavasoft,J465G08H,Tri-Sprintec,False,577
        +natoque,04/15/2010,28.88,magnis,Sibelius,N813P74X,Lipitor,0,562
        +mollis,05/07/2011,89.36,Donec,Yahoo,O113X38K,Lexapro,Yes,179
        +ultrices.,10/20/2013,73.45,"orci,",Lycos,N587Y98N,Benicar HCT,No,185
        +dui,12/10/2011,0.57,Mauris eu turpis.,Yahoo,S354F65P,Levothyroxine Sodium,No,78
        +sagittis.,04/06/2014,38.55,"elementum sem, vitae",Google,R931X11B,Loestrin 24 Fe,Yes,386
        +"dui,",10/08/2010,52.52,natoque penatibus,Adobe,J615B52I,Clonazepam,0,563
        +eros,06/25/2015,45.90,"aliquam, enim",Microsoft,S216N79D,Amoxicillin,True,371
        +"et,",05/16/2008,4.42,nulla. In tincidunt,Adobe,Z906A47A,Sulfamethoxazole/Trimethoprim,No,507
        +est,12/14/2004,16.79,amet,Yahoo,P540P32Z,Doxycycline Hyclate,True,188
        +"montes,",02/23/2008,52.98,ante,Lavasoft,C140R27G,Lisinopril,True,401
        +mollis,07/09/2004,83.26,Curabitur dictum. Phasellus,Cakewalk,U620A61Z,Glipizide,No,278
        +dolor.,07/01/2004,50.94,"non, vestibulum",Lavasoft,F625L82E,Singulair,No,475
        +aliquet,03/18/2014,56.23,erat,Altavista,L193Q72S,Clonazepam,No,3
        +nonummy,09/13/2004,89.86,enim.,Apple Systems,U466F15U,Atenolol,No,218
        +natoque,11/09/2015,72.14,ridiculus,Altavista,U295O53M,Cyclobenzaprin HCl,No,50
        +tincidunt,01/05/2011,84.90,Cras,Cakewalk,C373S25Y,Paroxetine HCl,0,104
        +tristique,03/04/2010,64.59,ipsum leo elementum,Macromedia,U140F94P,Atenolol,False,486
        +eleifend.,07/11/2010,45.06,"a, arcu. Sed",Macromedia,G544Z82L,Zyprexa,1,100
        +sem,04/18/2008,44.81,"magna, malesuada vel,",Chami,G143Q64L,Lorazepam,No,440
        +facilisi.,06/13/2005,65.36,"ut, molestie in,",Google,N391E28J,Januvia,False,536
        +arcu.,09/24/2012,21.27,"parturient montes, nascetur",Finale,Z720K67H,Furosemide,False,308
        +hendrerit,01/26/2013,27.11,"eget varius ultrices,",Borland,P865K75O,Metformin HCl,False,590
        +Aliquam,03/18/2010,64.99,ridiculus,Borland,K003G26G,Ibuprofen (Rx),0,412
        +eu,08/27/2016,99.62,Sed eu eros.,Microsoft,H049R07D,Atenolol,False,498
        +Morbi,02/13/2008,30.86,"Sed nulla ante,",Altavista,U852E06G,Fluticasone Propionate,Yes,243
        +malesuada,08/17/2010,58.50,tellus. Phasellus,Sibelius,T695G73P,Ibuprofen (Rx),Yes,591
        +"ut,",11/16/2006,46.64,Sed molestie.,Microsoft,T589M93D,Gianvi,True,-5
        +odio.,12/09/2011,51.19,"montes, nascetur ridiculus",Chami,J311Q19L,Gabapentin,True,517
        +tortor.,03/21/2017,7.11,Morbi neque,Finale,W293Z75X,Loestrin 24 Fe,Yes,242
        +penatibus,12/02/2015,81.51,ipsum ac mi,Borland,U565B49H,Loestrin 24 Fe,False,220
        +"et,",10/11/2013,56.41,ut nisi a,Google,G623M74Q,Triamterene/Hydrochlorothiazide,True,98
        +"ut,",11/17/2007,74.85,consequat purus.,Sibelius,Q247W03U,Tramadol HCl,Yes,484
        +luctus,09/30/2016,23.87,euismod,Lavasoft,T838L77W,Lisinopril,Yes,295
        +gravida,12/04/2010,80.12,a neque.,Sibelius,U542S63O,Vytorin,0,188
        +hymenaeos.,01/16/2015,13.19,In scelerisque scelerisque,Sibelius,V375P80B,Zyprexa,False,255
        +mi,06/07/2010,17.75,libero. Proin,Google,I728A71W,APAP/Codeine,False,435
        +"a,",12/19/2006,12.35,"montes,",Lavasoft,X885A67N,Metformin HCl,True,333
        +ornare,09/09/2015,34.13,taciti,Lavasoft,Q602X92G,Lyrica,Yes,447
        +"tellus,",09/05/2007,92.17,"lorem,",Microsoft,D008R07S,Vyvanse,0,256
        +eget,07/10/2008,5.71,a odio semper,Altavista,L996D22J,Triamcinolone Acetonide,1,89
        +sodales,01/26/2017,67.43,"at,",Microsoft,B922B33B,Glipizide,False,406
        +"amet,",09/19/2011,5.34,Cum sociis natoque,Yahoo,C735B01G,Amoxicillin,No,85
        +tempus,02/14/2017,19.18,felis,Macromedia,P379N42S,Simvastatin,False,427
        +laoreet,06/25/2017,73.61,Sed,Apple Systems,N838F62B,Alendronate Sodium,No,405
        +laoreet,03/28/2015,40.48,fames ac,Cakewalk,A503X28X,Ibuprofen (Rx),0,430
        +sit,09/08/2013,41.23,"aliquet vel,",Sibelius,F381B10B,Nexium,No,359
        +Aenean,06/10/2010,97.61,massa,Altavista,X179G33K,Doxycycline Hyclate,1,136
        +non,10/13/2013,46.02,Duis,Microsoft,F567P51A,Metformin HCl,1,104
        +Curabitur,02/10/2016,49.59,et magnis,Borland,A902B81X,Diovan,No,270
        +risus,06/23/2014,6.22,"eu,",Apple Systems,J458L03X,Crestor,1,577
        +sem,04/29/2006,36.75,orci luctus,Apple Systems,I390X10D,Lisinopril,False,131
        +"eu,",08/06/2013,96.39,diam dictum sapien.,Microsoft,P937M90J,Lisinopril/Hydrochlorothiazide,Yes,229
        +ultricies,01/13/2013,18.64,auctor,Microsoft,Q793S72Y,Amphetamine Salts,0,153
        +et,09/04/2005,30.87,sagittis placerat. Cras,Microsoft,S427Q43E,Alprazolam,False,571
        +sit,02/26/2006,80.53,non justo.,Finale,Y646A59W,Omeprazole (Rx),True,193
        +eget,01/10/2014,71.57,dolor,Borland,V101B17W,Sertraline HCl,No,103
        +"a,",06/02/2016,44.56,nascetur ridiculus,Lycos,O796A98J,Alprazolam,1,505
        +"ante,",12/20/2013,46.04,eleifend,Lycos,K375B97M,Plavix,0,296
        \ No newline at end of file
        diff --git a/sample_csvs/MOCK_LICENSES.csv b/sample_csvs/MOCK_LICENSES.csv
        new file mode 100644
        index 0000000000..487f8e1e24
        --- /dev/null
        +++ b/sample_csvs/MOCK_LICENSES.csv
        @@ -0,0 +1,139 @@
        +Name,Email,Username,Item name,serial number,manufacturer,purchase date,purchase cost,purchase_order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,notes
        +Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin","Sed ante. Vivamus tortor. Duis mattis egestas metus.
        +
        +Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh."
        +Thomas Franklin,bgibson1@sun.com,bgibson1,Hydralazine Hydrochloride,c6f022c1-6a5d-447c-889b-6b371dcdf733,Marvin Inc,03/05/2002,$17.47,57537,257871081-3,Bobby Gibson,bgibson1@army.mil,09/10/2016,true,FALSE,5,"Grady, Macejkovic and Harris",Prohaska LLC,"Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
        +
        +In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus."
        +Russell Gutierrez,rwallace2@squidoo.com,rwallace2,etanercept,0e97134a-63f4-451b-b42e-b3c5d9f8c55c,"Rodriguez, Dietrich and D'Amore",03/01/1984,$5.31,34889,836738603-5,Raymond Wallace,rwallace2@princeton.edu,09/06/2016,false,false,37,Ziemann Group,Olson-Murazik,"Proin eu mi. Nulla ac enim. In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem."
        +Russell Harris,kcunningham3@nps.gov,kcunningham3,Diltiazem Hydrochloride,4db4abb2-4dc5-4801-8c62-0ce702725975,Thompson and Sons,05/15/1987,$73.70,39347,408046970-5,Kathleen Cunningham,kcunningham3@nyu.edu,08/06/2016,false,sometimes,80,Gusikowski Group,"Ritchie, Gutmann and Terry",Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
        +Lois Hill,wdaniels4@utexas.edu,wdaniels4,"BACITRACIN ZINC, NEOMYCIN SULFATE, POLYMYXIN-B SULFATE",e7feeab5-98e5-4c44-b303-7693796cee2b,Wiegand LLC,01/18/2011,$23.30,70726,911844083-5,Walter Daniels,wdaniels4@bbc.co.uk,04/23/2016,false,no,89,Kuvalis Inc,"Schoen, Lynch and Kuhic","Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.
        +
        +Fusce consequat. Nulla nisl. Nunc nisl."
        +Clarence Stanley,mhoward5@nationalgeographic.com,mhoward5,sodium fluoride,c2f965fc-f701-4eaf-94d3-ce84dfba5002,,02/08/1982,$97.34,,220460709-6,Marie Howard,mhoward5@goodreads.com,05/07/2016,false,false,32,,,
        +Janet Cooper,dmartinez6@nytimes.com,dmartinez6,dextromethorphan hydrobromide and menthol,e1cdc73c-c1bb-4949-83f6-d17cc96c7034,,03/29/2015,$95.70,,116567388-6,Denise Martinez,dmartinez6@vinaora.com,03/02/2016,false,,82,,,
        +Jose Cruz,jtorres7@odnoklassniki.ru,jtorres7,Isopropyl Alcohol,4e9970a7-c9b4-4a3a-8fb6-d2560e4740e9,Rath Group,07/06/2016,$58.88,59165,232359646-2,Jacqueline Torres,jtorres7@miibeian.gov.cn,07/01/2016,true,NO,34,Kshlerin Inc,Johns-Little,Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.
        +Heather Hamilton,jbrooks8@answers.com,jbrooks8,Calcium Gluconate,fbd4a0bb-51bf-4602-8ca0-c103064969b1,"Yundt, Bahringer and Upton",11/16/2011,$81.03,66798,445210062-7,Jeremy Brooks,jbrooks8@photobucket.com,09/10/2016,true,TRUE,96,"Streich, Powlowski and Denesik",Feest-Prosacco,In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet.
        +Lois Banks,dbennett9@webeden.co.uk,dbennett9,Lorazepam,ce346a8c-54f2-426e-9f6e-0e56ee0cd272,,,$54.15,,675338655-6,David Bennett,dbennett9@csmonitor.com,05/01/2016,false,true,77,,,
        +Teresa Romero,tturnera@biblegateway.com,tturnera,TITANIUM DIOXIDE,e6d8db5f-f816-4ecd-8be0-410ac1080618,Hartmann-Christiansen,03/23/1981,$43.29,20552,823104280-6,Todd Turner,tturnera@icq.com,12/30/2016,false,sometimes,62,Beier-Cummings,"Thompson, Prohaska and Johns","Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.
        +
        +In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet."
        +Jerry Thompson,jgrayb@bbb.org,jgrayb,Lisinopril,debf33e7-4b88-4ab3-8510-433c21418b97,"Zieme, Mayert and Sanford",,$11.04,86140,009011161-3,Jennifer Gray,jgrayb@rediff.com,12/01/2016,false,yes,76,"Hudson, Frami and Reichert",Corkery-Pagac,"Proin eu mi. Nulla ac enim. In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.
        +
        +Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit."
        +Helen Peters,astonec@boston.com,astonec,Hyoscyamine Sulfate,9adcb06d-3d81-4e2c-8a27-235616274203,"Beier, Lang and Moore",01/04/2005,$93.27,38153,609876637-1,Andrea Stone,astonec@posterous.com,05/16/2016,true,true,89,Kiehn-Douglas,Swaniawski-Bernhard,"Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque."
        +Marie Williamson,jwardd@phoca.cz,jwardd,"dextromethorphan hydrobromide, guaifenesin, and phenylephrine hydrochloride",c4947269-22c4-4ba0-80a8-5a45a12032e2,"Cummerata, Considine and Weimann",06/10/1981,$45.82,62145,054787864-8,James Ward,jwardd@whitehouse.gov,02/12/2016,true,yes,78,"Osinski, Jacobi and Wisozk",Miller Inc,"Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.
        +
        +Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.
        +
        +Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem."
        +Marilyn Nguyen,alawrencee@abc.net.au,alawrencee,DIMETHICONE,777dd0e2-229d-452a-a362-8a92c24bce39,Larson-Turner,03/09/1996,$8.90,70188,658299511-1,Anthony Lawrence,alawrencee@seattletimes.com,07/11/2016,false,false,80,Bogan Group,"Corwin, Stokes and Keebler","Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius."
        +Sarah Jordan,twebbf@moonfruit.com,twebbf,Magesium Citrate,70c3c342-6760-4772-82f8-40d4df93ec19,Nitzsche-Bednar,09/04/1993,$91.89,19815,549157091-5,Thomas Webb,twebbf@salon.com,11/07/2016,false,YES,29,"Murazik, Eichmann and Orn",Howe Group,In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
        +Marilyn Greene,pgilbertg@lulu.com,pgilbertg,Glycopyrrolate,d3769f63-8a02-47dc-8195-501ace6d1a76,"Hartmann, Schuppe and Maggio",11/18/1984,$36.82,17514,467492572-X,Philip Gilbert,pgilbertg@unicef.org,03/26/2016,false,false,11,"Kerluke, Bednar and Kuphal",Hilpert Inc,"In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
        +
        +Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
        +
        +Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat."
        +Anna Burton,tbennetth@comcast.net,tbennetth,Finasteride,25e46967-c6a9-42f0-8458-9d6eeb4d5fb6,Volkman LLC,04/23/1999,$94.12,24353,897915880-7,Thomas Bennett,tbennetth@ow.ly,10/09/2016,true,true,70,Considine LLC,Lemke-Leffler,"Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.
        +
        +Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
        +
        +Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem."
        +Randy Harrison,cjohnsoni@stumbleupon.com,cjohnsoni,"OCTINOXATE, TITANIUM DIOXIDE",99f3615d-f4ae-44c3-ba37-ed1cc783d95b,Skiles-Feil,10/07/1997,$96.45,51684,282994437-2,Charles Johnson,cjohnsoni@squidoo.com,12/22/2016,false,,44,Johnson LLC,Stokes-Hahn,"In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
        +
        +Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
        +
        +Sed ante. Vivamus tortor. Duis mattis egestas metus."
        +Eric Fuller,khartj@msu.edu,khartj,Allergenic Extracts Alum Precipitated,c8b6b2ac-2b4b-4575-9636-aee12430d0d0,Gislason-Hermann,02/24/1986,$63.81,75717,039291443-3,Katherine Hart,khartj@360.cn,10/02/2016,false,YES,86,"Stroman, Fay and Roob",Wehner-Altenwerth,"Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.
        +
        +Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
        +
        +Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem."
        +William Perkins,mwardk@yahoo.com,mwardk,Pseudoephedrine HCl,0f241979-af54-4447-8939-4cc0c77a50b6,"Gorczany, Walker and Schaden",06/23/1982,$12.85,37375,947683395-5,Melissa Ward,mwardk@yellowpages.com,02/03/2016,true,,81,"Fahey, O'Reilly and Rempel","Gerhold, Feeney and Bashirian","Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
        +
        +Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
        +
        +Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus."
        +Jose Hicks,lbarnesl@github.io,lbarnesl,Ampicillin Sodium,c43a1438-51a5-4f1d-8011-c3830caa3506,Robel-Gutkowski,11/01/1982,$66.70,57574,006385318-3,Lillian Barnes,lbarnesl@washington.edu,09/08/2016,false,YES,3,"Stark, Gerlach and Shields",Baumbach LLC,"Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
        +
        +Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
        +
        +Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl."
        +Susan Moreno,lhawkinsm@weather.com,lhawkinsm,OXYGEN,da1e684c-5e85-41fe-acd1-c82cec15971b,"Waelchi, Wisozk and Price",10/20/1991,$91.48,10257,386667729-4,Lisa Hawkins,lhawkinsm@princeton.edu,06/03/2016,true,true,38,Schamberger-Farrell,Nienow-Corkery,"Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.
        +
        +Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.
        +
        +Fusce consequat. Nulla nisl. Nunc nisl."
        +Diana Fisher,jgeorgen@jiathis.com,jgeorgen,Dyphylline and Guaifenesin,26db2092-d53f-40e9-be4f-bf19d3f0dfac,,06/24/1983,$18.29,,313818090-6,Jimmy George,jgeorgen@engadget.com,04/30/2016,false,sometimes,70,,,
        +Edward Cox,cjenkinso@kickstarter.com,cjenkinso,"Kali mur , Kali sulph , Kali bich , Citricidal Extract",022615bf-4b84-4da1-9314-a14dc499d7b2,"Batz, Miller and Mohr",11/09/1992,$55.47,79996,164863759-0,Christopher Jenkins,cjenkinso@elpais.com,05/20/2016,false,false,61,"Turner, Jenkins and Ziemann",Brekke-Cremin,"Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.
        +
        +Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
        +
        +Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem."
        +Gregory Simmons,amartinp@tinypic.com,amartinp,Fluphenazine Hydrochloride,11fb02d8-8db9-4acd-bcbb-997c5ffa9555,Abshire-Pfeffer,04/28/1985,$86.65,79416,870571903-8,Ann Martin,amartinp@ezinearticles.com,07/07/2016,true,true,12,Larson-Johnson,Rowe Inc,"Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem."
        +Victor Long,agrahamq@chicagotribune.com,agrahamq,"Acetaminophen, Dextromethorphan HBr, Guaifenesin, Phenylephrine HCl",7ac19f19-6987-449c-8195-e5a4805055b8,Cummerata and Sons,,$69.05,25399,447273947-X,Ashley Graham,agrahamq@uiuc.edu,10/15/2016,false,FALSE,60,"Sawayn, Kshlerin and Smith","Lemke, Williamson and Marks","Sed ante. Vivamus tortor. Duis mattis egestas metus.
        +
        +Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh."
        +Teresa Arnold,solsonr@wordpress.org,solsonr,TOXICODENDRON VERNIX LEAFY TWIG,40e87b5d-65b4-457a-9dfc-2bcfb2811246,Hermann and Sons,04/25/1984,$80.42,99285,455923522-8,Shirley Olson,solsonr@mysql.com,02/07/2016,true,FALSE,16,"Wisozk, Hartmann and Schamberger",Pacocha Inc,Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
        +Philip Long,tyoungs@cyberchimps.com,tyoungs,ribavirin,0c45d590-1251-4512-a1df-1a05dc9155f4,"Larson, Shanahan and Carter",08/17/2005,$14.28,13758,260847846-8,Terry Young,tyoungs@issuu.com,02/26/2016,true,,82,"Kuhn, Brakus and Nolan",McLaughlin-Mosciski,"In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
        +
        +Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
        +
        +Sed ante. Vivamus tortor. Duis mattis egestas metus."
        +Beverly Hughes,jolsont@msu.edu,jolsont,famotidine,01367534-a9b1-4d68-8aba-1977a80b6948,,02/06/1998,$71.16,,696828218-6,Jack Olson,jolsont@wikispaces.com,08/01/2016,true,NO,30,,,
        +Russell Vasquez,aedwardsu@utexas.edu,aedwardsu,HYDROCODONE BITARTRATE AND IBUPROFEN,5676d28a-c79c-42f7-a76b-424a8ece6d20,Stracke-Schiller,08/30/1989,$20.02,29882,628431288-1,Ashley Edwards,aedwardsu@apple.com,05/09/2016,false,true,65,Carter-Homenick,Reinger Inc,"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
        +
        +Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
        +
        +Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio."
        +Patrick Brown,snelsonv@cdc.gov,snelsonv,Carvedilol,b5a21345-8e25-4fa5-a04b-17863fd96ca6,Gusikowski-Hettinger,10/03/1992,$99.10,52479,044668450-3,Samuel Nelson,snelsonv@reference.com,12/21/2016,false,YES,63,"Hills, Rau and Fay","Wuckert, Hodkiewicz and Denesik",Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
        +Annie Wilson,cschmidtw@geocities.com,cschmidtw,Diclofenac Sodium,48257383-9220-49b0-8b69-7aba85309cd9,Cruickshank and Sons,08/11/2003,$98.46,19740,891683066-4,Cheryl Schmidt,cschmidtw@lycos.com,08/28/2016,false,true,16,Dooley-Moen,Greenholt-Goyette,"Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
        +
        +Phasellus in felis. Donec semper sapien a libero. Nam dui."
        +Jennifer Butler,jharperx@adobe.com,jharperx,Amlodipine besylate and Atorvastatin calcium,6ee7167e-caf2-4f55-8e21-6f467cedb012,,08/22/1991,$6.91,,174416888-1,Jessica Harper,jharperx@altervista.org,04/16/2016,false,false,35,,,
        +Aaron Harris,staylory@ft.com,staylory,Metformin Hydrochloride,b65c1f46-9408-4459-885a-593ece7a5bd7,,03/31/1989,$30.30,,229826432-5,Stephen Taylor,staylory@businessinsider.com,03/13/2016,true,yes,69,,,
        +Clarence Torres,apattersonz@apache.org,apattersonz,"Naproxen sodium, Pseudoephedrine HCl",277e6d67-4a1e-4edb-bb67-cb863b85429e,"Funk, Weber and Lockman",05/09/1986,$73.99,99424,521068453-9,Alice Patterson,apattersonz@homestead.com,07/02/2016,true,FALSE,11,"Lemke, Bins and Wunsch",Glover and Sons,"Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
        +
        +In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus."
        +Thomas Porter,sperkins10@1688.com,sperkins10,OCTINOXATE and TITANIUM DIOXIDE,c1cb0f14-98bd-4701-912e-02e02364d87d,Quigley Group,12/05/1996,$24.28,25442,757409810-7,Sharon Perkins,sperkins10@who.int,03/22/2016,true,TRUE,60,Jerde-DuBuque,Tremblay-Cummerata,"Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
        +
        +Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque."
        +Patrick Porter,dgreene11@xing.com,dgreene11,bupropion hydrochloride,883dab09-e464-4194-afa5-cd884f3b8701,Howe-Zemlak,07/31/1995,$40.98,91544,871971869-1,Diane Greene,dgreene11@mayoclinic.com,06/05/2016,true,NO,99,Bernhard-Gerhold,Swaniawski-Schinner,"Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
        +
        +Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio."
        +Richard Tucker,kturner12@smugmug.com,kturner12,Alcohol,e35cac12-40f9-4bfb-962d-28d3ab69cc1e,,04/04/2012,$95.95,,201074756-9,Kelly Turner,kturner12@ftc.gov,05/25/2016,false,NO,92,,,
        +Jonathan Rogers,jwashington13@miitbeian.gov.cn,jwashington13,Birch Black,93aad585-abbf-4433-82a8-dbf651758298,Osinski LLC,07/08/1996,$46.56,21226,506549653-6,Janice Washington,jwashington13@forbes.com,06/02/2016,false,YES,92,"Sawayn, Muller and Hauck",Mante-Johnston,"Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.
        +
        +In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet."
        +Beverly James,bmorales14@bloglovin.com,bmorales14,"Avobenzone, Octinoxate, and Octisalate",4654bd60-b6d5-472f-9aaa-ff5c58b25850,,11/08/2014,$40.00,,012952073-X,Brandon Morales,bmorales14@mlb.com,03/08/2016,true,NO,72,,,
        +Wayne Carter,jlong15@oakley.com,jlong15,Alprazolam,63bc155d-46b4-4354-b56b-f65af16467d3,,03/04/2015,$31.82,,028940126-7,John Long,jlong15@bigcartel.com,02/27/2016,false,sometimes,8,,,
        +Julie Hall,erichardson16@unesco.org,erichardson16,Carvedilol,44efe270-c6dd-4ee3-8c8e-20253029ed42,"Hane, Bernier and Volkman",12/07/2012,$10.19,73288,654797348-4,Edward Richardson,erichardson16@yellowbook.com,12/30/2016,false,no,24,Goodwin-Mante,Kohler-Davis,"Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.
        +
        +Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
        +
        +Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem."
        +Christopher Chapman,dking17@blogger.com,dking17,Hydrocodone Bitartrate and Acetaminophen,a167b219-ba83-4035-ab1b-2f9a22eaf3ba,Schneider-Connelly,,$23.22,61196,106996949-4,Denise King,dking17@biglobe.ne.jp,09/22/2016,true,YES,85,Koss-Shanahan,Rohan Inc,"Sed ante. Vivamus tortor. Duis mattis egestas metus.
        +
        +Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh."
        +Paula Russell,kgreene18@imageshack.us,kgreene18,nepafenac,072b14cc-a33b-487f-bebd-721937f0061f,Witting LLC,07/07/1990,$60.29,60580,380670490-2,Kelly Greene,kgreene18@toplist.cz,09/18/2016,true,no,88,O'Reilly-Heaney,Dickens-Green,"Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.
        +
        +Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti."
        +Joshua Adams,sturner19@eventbrite.com,sturner19,Sumatriptan Succinate,2ab4b3d3-86fa-48a2-b06d-b29e3fd9f6a3,"Jenkins, Stiedemann and Nolan",09/29/1988,$99.91,93416,252472374-7,Shirley Turner,sturner19@home.pl,10/21/2016,true,YES,84,Hintz LLC,Koepp-Mante,"Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
        +
        +Phasellus in felis. Donec semper sapien a libero. Nam dui."
        +Denise Black,pnichols1a@house.gov,pnichols1a,Triclosan,528f648b-f8d3-4039-9f1c-13f6dc0bc39d,Koss Group,09/20/1985,$33.55,98845,845091541-4,Paul Nichols,pnichols1a@mac.com,12/21/2016,true,TRUE,32,Terry Inc,Kuhic Inc,"Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
        +
        +Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.
        +
        +Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat."
        +Benjamin Scott,shicks1b@vinaora.com,shicks1b,"Magnesium Chloride, Dextrose monohydrate, Lactic Acid, Sodium Chloride, Sodium Bicarbonate, and Potassium Chloride",37966b9e-929e-4269-82bd-a765c73b66cb,Wunsch-Kertzmann,03/02/1981,$81.06,71450,162405257-6,Samuel Hicks,shicks1b@washington.edu,03/14/2016,true,TRUE,44,Pacocha Group,"Schmeler, Bogan and Ankunding","Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
        +
        +Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.
        +
        +Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede."
        +George Brooks,vperry1c@howstuffworks.com,vperry1c,"phenylephrine hcl, brompheniramine maleate",28a602f4-913d-409e-a0f1-096b7945b6af,"Yundt, Smitham and Gibson",07/19/1990,$78.47,73300,906304957-9,Victor Perry,vperry1c@upenn.edu,11/04/2016,true,NO,54,Watsica Group,"Hamill, Ebert and Eichmann","In congue. Etiam justo. Etiam pretium iaculis justo.
        +
        +In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus."
        +Beverly Arnold,vgarrett1d@ebay.co.uk,vgarrett1d,Promethazine Hydrochloride,b621c42b-e631-450c-b5e1-638565827fcd,Moen Group,09/05/2006,$93.45,19760,102357338-5,Victor Garrett,vgarrett1d@livejournal.com,02/28/2016,true,no,1,"Casper, Cruickshank and Homenick","Feeney, Jacobson and Wolff","Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.
        +
        +Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh."
        diff --git a/sample_csvs/MOCK_USERS.csv b/sample_csvs/MOCK_USERS.csv
        new file mode 100644
        index 0000000000..aae13a9dce
        --- /dev/null
        +++ b/sample_csvs/MOCK_USERS.csv
        @@ -0,0 +1,1001 @@
        +First Name,Last Name,email,User name,Location,Phone Num,Job Title For User,Employee Number,Company
        +Blanche,O'Collopy,bocollopy0@livejournal.com,bocollopy0,Hinapalanan,63-(199)661-2186,Clinical Specialist,7080919053,Morar-Ward
        +Jessie,Primo,jprimo1@newsvine.com,jprimo1,Korenovsk,7-(885)578-0266,Paralegal,6284292031,Jast-Stiedemann
        +Nelia,Coughtrey,ncoughtrey2@geocities.com,ncoughtrey2,Zhexiao,86-(366)635-5884,Nurse Practicioner,7242692202,Goldner-Cremin
        +Pascale,Wimpeney,pwimpeney3@mtv.com,pwimpeney3,Kuče,385-(688)644-8322,Senior Sales Associate,9173736066,"Paucek, Schmitt and Hagenes"
        +Alec,Twidle,atwidle4@ovh.net,atwidle4,Shi’ao,86-(163)912-1915,Human Resources Manager,4692183691,Schimmel and Sons
        +Karalee,Carroll,kcarroll5@devhub.com,kcarroll5,Huaidian,86-(303)287-0739,Civil Engineer,1530903416,Schuster LLC
        +Danny,Yeiles,dyeiles6@wikipedia.org,dyeiles6,Koundara,224-(953)650-5363,Software Engineer II,7026212001,"Ebert, Windler and Hessel"
        +Taffy,Benson,tbenson7@mit.edu,tbenson7,Nanying,86-(152)931-1194,Dental Hygienist,4576525239,Jerde Inc
        +Hall,Tonepohl,htonepohl8@bandcamp.com,htonepohl8,Primorsko-Akhtarsk,7-(743)929-2565,Computer Systems Analyst III,6187297644,Kohler and Sons
        +Gus,Tomczykowski,gtomczykowski9@hostgator.com,gtomczykowski9,Arrah,225-(926)325-4040,Executive Secretary,9237527535,"Luettgen, Kshlerin and Carroll"
        +Casandra,Retchford,cretchforda@gizmodo.com,cretchforda,Lasi Dua,62-(813)604-3660,Teacher,0068486472,Rempel Inc
        +Judie,Fowler,jfowlerb@virginia.edu,jfowlerb,Ōgaki,81-(521)313-4757,Occupational Therapist,1692241737,Bins Inc
        +Willy,Walters,wwaltersc@cloudflare.com,wwaltersc,Mungkin,62-(114)187-7377,Electrical Engineer,1185027149,Toy-Hyatt
        +Trace,Tingly,ttinglyd@issuu.com,ttinglyd,Esigodini,263-(795)699-2623,Office Assistant II,9588821797,Satterfield LLC
        +Rustin,Withrington,rwithringtone@purevolume.com,rwithringtone,Xinjie,86-(703)213-0549,Marketing Manager,8707099886,O'Conner-Hoeger
        +Loria,McKendry,lmckendryf@imgur.com,lmckendryf,Eiriz,351-(660)417-9204,Administrative Assistant II,2622958684,Oberbrunner and Sons
        +Blancha,Carlesso,bcarlessog@bravesites.com,bcarlessog,Helsingborg,46-(218)729-2556,Account Representative I,1864046597,Stroman-Marks
        +Whitney,Olman,wolmanh@slashdot.org,wolmanh,Lisia Góra,48-(907)614-5768,Speech Pathologist,7143970867,Keebler-Wintheiser
        +Bond,McBain,bmcbaini@hc360.com,bmcbaini,Lesnoye,7-(515)172-7238,Social Worker,6816673581,Cassin LLC
        +Raeann,Kubach,rkubachj@a8.net,rkubachj,Saray,994-(690)524-2937,Electrical Engineer,1829082000,"Kiehn, Dicki and O'Reilly"
        +Feodor,Kersey,fkerseyk@hibu.com,fkerseyk,Salam,62-(530)992-3129,Financial Advisor,0027333248,Kassulke-Wuckert
        +Boyd,Delamere,bdelamerel@europa.eu,bdelamerel,Starigrad,385-(464)217-6673,Quality Control Specialist,7362162391,Marquardt Group
        +Terrijo,Spaducci,tspaduccim@yale.edu,tspaduccim,Pereiras,351-(169)619-5395,Health Coach II,9383160780,"Reynolds, Bins and Wunsch"
        +Brandtr,Rollings,brollingsn@java.com,brollingsn,Palencia,502-(601)904-4191,Assistant Professor,9604788698,Farrell LLC
        +Diane,Bernaciak,dbernaciako@senate.gov,dbernaciako,Bitin,63-(465)596-5888,Human Resources Assistant II,1297195655,Orn Inc
        +Bertie,Sreenan,bsreenanp@japanpost.jp,bsreenanp,Muzambinho,55-(991)980-2128,VP Accounting,9614791969,Wiza-Quitzon
        +Marylinda,Hanlon,mhanlonq@sourceforge.net,mhanlonq,San José de Río Tinto,504-(312)801-5239,Associate Professor,4247222201,Heller and Sons
        +Darrin,MacPhaden,dmacphadenr@berkeley.edu,dmacphadenr,Radlje ob Dravi,386-(696)423-3227,Community Outreach Specialist,8724422533,Bradtke and Sons
        +Kizzee,Pilmer,kpilmers@mlb.com,kpilmers,Soio,244-(244)226-8720,Software Engineer I,7351560250,"Hauck, Gottlieb and Roberts"
        +Murdoch,Heijne,mheijnet@unblog.fr,mheijnet,Pukë,355-(994)349-7229,Mechanical Systems Engineer,9123797894,"Bailey, Collier and Labadie"
        +Maryann,Labat,mlabatu@mozilla.com,mlabatu,Skhira,216-(174)936-3617,Human Resources Assistant III,7255325211,"Feil, Kozey and Goldner"
        +Carolus,Dombrell,cdombrellv@forbes.com,cdombrellv,Pāvilosta,371-(908)875-7818,Account Executive,2616418460,Hammes LLC
        +Sheena,Goede,sgoedew@samsung.com,sgoedew,Bitkine,235-(312)893-5822,Professor,9784543257,Wolf Inc
        +Dottie,Leare,dlearex@surveymonkey.com,dlearex,Pugeran,62-(693)693-0486,Analog Circuit Design manager,5256401955,"Cole, Fisher and Spinka"
        +Jess,Stammer,jstammery@bloglines.com,jstammery,Margherita,256-(648)534-6980,Account Representative I,3022569831,Keeling Group
        +Izabel,Wix,iwixz@latimes.com,iwixz,Shatian,86-(812)279-4898,Physical Therapy Assistant,5047185605,Feil-Gutkowski
        +Corrinne,Lowrie,clowrie10@noaa.gov,clowrie10,Dongyuan,86-(567)116-4092,Programmer I,4016980801,Dickens and Sons
        +Ralph,Brabbs,rbrabbs11@desdev.cn,rbrabbs11,Lokea,62-(733)726-2227,Staff Scientist,3126986722,Pouros LLC
        +Wally,Boanas,wboanas12@deviantart.com,wboanas12,Garhi Khairo,92-(983)138-6735,Senior Developer,9121792674,Bauch-Hodkiewicz
        +Willyt,Poxton,wpoxton13@eepurl.com,wpoxton13,Ciénaga,57-(530)166-8558,Account Coordinator,5226358938,Orn-Grady
        +Sanderson,Colledge,scolledge14@mozilla.com,scolledge14,Capalonga,63-(228)896-9731,Dental Hygienist,2367310122,"Kessler, Bechtelar and Fisher"
        +Marshal,Dillet,mdillet15@sakura.ne.jp,mdillet15,Camperdown,27-(887)538-9433,Social Worker,9119456573,Heller-Baumbach
        +Dario,Osler,dosler16@slideshare.net,dosler16,Fulong,86-(686)394-2367,Human Resources Assistant I,0834912236,Strosin Inc
        +Porter,Whitehall,pwhitehall17@economist.com,pwhitehall17,Alīpur,92-(345)545-1627,Programmer Analyst I,9907315249,Thiel-Schinner
        +Cyrille,Lough,clough18@foxnews.com,clough18,Jiukeng,86-(720)297-5199,Marketing Assistant,4745558287,Bailey-Hauck
        +Brina,Ashwell,bashwell19@cmu.edu,bashwell19,Três Pontas,55-(437)327-8074,VP Marketing,8645272598,Blick Group
        +Ki,Freeborn,kfreeborn1a@hhs.gov,kfreeborn1a,Pisz,48-(490)682-6629,Office Assistant I,6953353384,"Larson, Becker and Reinger"
        +Gaye,Hillam,ghillam1b@creativecommons.org,ghillam1b,Lazaro Cardenas,52-(744)187-7616,Senior Cost Accountant,5489719737,"Abernathy, Zulauf and Davis"
        +Herculie,Seage,hseage1c@photobucket.com,hseage1c,Careva Ćuprija,387-(372)396-4601,Environmental Tech,4880024112,"Wintheiser, Luettgen and Jerde"
        +Inessa,Baldack,ibaldack1d@marriott.com,ibaldack1d,Tirah,972-(148)288-3311,Environmental Tech,4012420682,"Carter, Hoppe and Mertz"
        +Sherline,Alliston,salliston1e@cnet.com,salliston1e,Prado Siongco,63-(641)703-7801,VP Sales,1648555802,Glover LLC
        +Kristin,Pitson,kpitson1f@sogou.com,kpitson1f,Las Flores,52-(755)660-4401,Financial Advisor,3629602851,Denesik-Schuster
        +Portia,Winspur,pwinspur1g@imdb.com,pwinspur1g,Cibolang,62-(194)231-7712,Engineer II,8827050418,"Osinski, Emard and Jast"
        +Benedict,Churchard,bchurchard1h@dell.com,bchurchard1h,Xinglong,86-(452)414-0407,Human Resources Assistant IV,1155598784,Hane and Sons
        +Mariya,Bahlmann,mbahlmann1i@npr.org,mbahlmann1i,Wuyanquan,86-(898)637-0482,GIS Technical Architect,1627870318,Abernathy Group
        +Harri,McAleese,hmcaleese1j@theglobeandmail.com,hmcaleese1j,Nularan,62-(717)480-2343,Accounting Assistant I,0181278391,Senger and Sons
        +Roda,McGriffin,rmcgriffin1k@symantec.com,rmcgriffin1k,Raduzhnyy,7-(513)767-6738,Sales Associate,7142006153,Mosciski Group
        +Carolyn,Jurges,cjurges1l@berkeley.edu,cjurges1l,Rotterdam,31-(827)912-2109,Senior Developer,8573938994,Terry and Sons
        +Darnell,Lettuce,dlettuce1m@google.com.au,dlettuce1m,Solnechnogorsk,7-(165)514-6628,Sales Associate,3973069883,Volkman-Abbott
        +Johan,Herche,jherche1n@w3.org,jherche1n,Krzeszów,48-(981)281-5260,Librarian,8066763190,Larkin-Emard
        +Ginelle,Digle,gdigle1o@4shared.com,gdigle1o,Alukama,62-(819)194-6623,Account Executive,0227839102,Sipes-Bauch
        +Bunny,Macconaghy,bmacconaghy1p@huffingtonpost.com,bmacconaghy1p,Huangqiao,86-(206)588-4549,Quality Engineer,6517079629,"Dach, Marquardt and Lubowitz"
        +Olivette,Tomczykiewicz,otomczykiewicz1q@eventbrite.com,otomczykiewicz1q,Sigayevo,7-(309)891-2091,Desktop Support Technician,3998906258,Schamberger Group
        +Kerwinn,Le Brom,klebrom1r@smh.com.au,klebrom1r,Lestijärvi,358-(747)269-4952,Compensation Analyst,1348822481,Kub Inc
        +Obidiah,Radke,oradke1s@imdb.com,oradke1s,Xinhua,86-(381)923-1757,Accounting Assistant II,1145530044,Prosacco Inc
        +Jermaine,Joire,jjoire1t@sun.com,jjoire1t,Huangpi,86-(814)411-4884,Developer IV,4849811027,"Schuppe, Jaskolski and Jones"
        +Bobine,Jessope,bjessope1u@sbwire.com,bjessope1u,Nàng Mau,84-(454)818-4039,Budget/Accounting Analyst I,3193701467,"Gislason, Batz and Kub"
        +Brinn,Calam,bcalam1v@dedecms.com,bcalam1v,Anan,81-(795)861-8389,Administrative Officer,2724742117,Shanahan Inc
        +Ax,Briiginshaw,abriiginshaw1w@shop-pro.jp,abriiginshaw1w,Bantay,63-(158)907-3803,Senior Sales Associate,1449794491,"Beer, Hoppe and Walsh"
        +Sher,Wylam,swylam1x@cisco.com,swylam1x,Dmitrov,7-(454)562-7954,Health Coach IV,1778479766,"Bogisich, Gerhold and Dooley"
        +Rodger,Mecco,rmecco1y@oakley.com,rmecco1y,Bulahblangaro,62-(698)245-6039,GIS Technical Architect,6679143640,Kulas Group
        +Gilly,Coggon,gcoggon1z@merriam-webster.com,gcoggon1z,Ramana,994-(225)981-5577,Statistician II,8663020252,Bogan-Swaniawski
        +Buffy,Kemsley,bkemsley20@discuz.net,bkemsley20,Tucupido,58-(595)308-1288,Dental Hygienist,9810617755,"Jacobi, Kuhn and Hills"
        +Tamra,Whether,twhether21@privacy.gov.au,twhether21,Dedenëvo,7-(568)725-8281,Librarian,0938798367,Doyle-Schowalter
        +Alleyn,Hedworth,ahedworth22@nbcnews.com,ahedworth22,Bweyogerere,256-(885)716-8723,Information Systems Manager,7806845402,Herman-Kuphal
        +Baldwin,Ruggieri,bruggieri23@acquirethisname.com,bruggieri23,Famões,351-(152)434-9871,Database Administrator I,6285015228,Rohan-Spinka
        +Edi,Womersley,ewomersley24@soundcloud.com,ewomersley24,Topolovgrad,359-(281)202-4851,VP Product Management,5480937758,Heaney Group
        +Vally,Condy,vcondy25@mediafire.com,vcondy25,Kovářská,420-(698)690-1129,Staff Accountant III,6354747148,Dach-Sporer
        +Addie,Kobisch,akobisch26@instagram.com,akobisch26,Ninove,32-(630)476-7548,Web Developer II,7289347471,MacGyver-Becker
        +Levi,Florey,lflorey27@umn.edu,lflorey27,Dębowa Łąka,48-(297)281-6919,Operator,1052832121,Wolf Group
        +Jolie,Niles,jniles28@goodreads.com,jniles28,Annopol,48-(783)717-5946,Quality Control Specialist,1756247129,"Batz, Spencer and Zemlak"
        +Gwynne,Blaydes,gblaydes29@seattletimes.com,gblaydes29,Chervone,380-(130)591-1017,Junior Executive,7514288414,Metz Group
        +Andee,Hazard,ahazard2a@usatoday.com,ahazard2a,Bringinanom,62-(752)996-9280,Business Systems Development Analyst,0463793501,O'Hara Group
        +Cristine,Cordero,ccordero2b@shop-pro.jp,ccordero2b,Cireundang,62-(647)231-1238,Associate Professor,0206916523,"Bradtke, Breitenberg and Konopelski"
        +Adelice,Sparhawk,asparhawk2c@google.fr,asparhawk2c,Barbacoas,58-(288)306-1967,Business Systems Development Analyst,4263563638,Reinger Group
        +Arnuad,Yirrell,ayirrell2d@indiatimes.com,ayirrell2d,Guanagazapa,502-(996)833-1054,Research Associate,4248670135,"Zemlak, Murphy and Altenwerth"
        +Etta,Manuelli,emanuelli2e@webeden.co.uk,emanuelli2e,Onzaga,57-(627)371-5859,GIS Technical Architect,5140237679,Wiza LLC
        +Anetta,Demann,ademann2f@nhs.uk,ademann2f,Songhu,86-(886)244-1201,Engineer III,7383594029,"Lind, Rodriguez and Luettgen"
        +Rivi,Geck,rgeck2g@wikia.com,rgeck2g,Santa Iria de Azóia,351-(351)837-4156,GIS Technical Architect,7680553459,"Kuhic, Boyle and Kozey"
        +Zsa zsa,Boynes,zboynes2h@upenn.edu,zboynes2h,Cerava,355-(375)816-3821,Occupational Therapist,5933003034,Weimann and Sons
        +Carlen,Minillo,cminillo2i@sohu.com,cminillo2i,Łącko,48-(206)819-7182,Engineer III,9864914502,"Brown, Carroll and Sporer"
        +Jae,McMinn,jmcminn2j@geocities.jp,jmcminn2j,Yandang,86-(754)609-9065,VP Marketing,9052957681,Parker Inc
        +Daune,Holberry,dholberry2k@imageshack.us,dholberry2k,Daleszyce,48-(780)132-9574,Software Engineer III,5828276875,"Bartell, Casper and Kerluke"
        +Thacher,Jahnisch,tjahnisch2l@nbcnews.com,tjahnisch2l,Ýpsonas,357-(881)407-6533,Research Associate,6648113243,Metz-Schimmel
        +Egon,Dumphy,edumphy2m@tiny.cc,edumphy2m,Gonābād,98-(873)558-8082,Nurse,1757406042,Von and Sons
        +Aridatha,Matessian,amatessian2n@salon.com,amatessian2n,Zhenziliang,86-(691)551-3380,Structural Engineer,8930185770,Reichel-Powlowski
        +Gabby,Margett,gmargett2o@yellowpages.com,gmargett2o,Wenfu,86-(602)463-0478,Financial Advisor,5815266353,Bosco Inc
        +Andrei,Dowle,adowle2p@slashdot.org,adowle2p,Zykovo,7-(567)311-6007,Graphic Designer,6594557408,Terry Inc
        +Zack,Balsellie,zbalsellie2q@alibaba.com,zbalsellie2q,Kiihtelysvaara,358-(789)977-9884,Data Coordiator,8470986120,Wiegand-Heathcote
        +Tanny,Liccardi,tliccardi2r@scientificamerican.com,tliccardi2r,Majāz al Bāb,216-(900)448-3810,Occupational Therapist,8509563896,Moore and Sons
        +Eda,Petren,epetren2s@go.com,epetren2s,Mina de São Domingos,351-(647)661-1537,Registered Nurse,1326684930,Hagenes-Franecki
        +Fifine,Appleby,fappleby2t@prlog.org,fappleby2t,Sokol’skoye,7-(897)976-5440,Nurse Practicioner,6949941218,"Hilll, Wiza and Connelly"
        +Suki,Quilligan,squilligan2u@virginia.edu,squilligan2u,Lenešice,420-(484)575-9887,Internal Auditor,1102845078,Eichmann and Sons
        +Brinn,Seldon,bseldon2v@dedecms.com,bseldon2v,Valerik,7-(364)838-7251,Environmental Specialist,5496253098,Schiller Inc
        +Cristie,Treadaway,ctreadaway2w@histats.com,ctreadaway2w,Vichuga,7-(809)167-3685,Dental Hygienist,0743112563,Bogisich LLC
        +Kendall,Vidgeon,kvidgeon2x@ted.com,kvidgeon2x,Şānūr,970-(462)447-8191,Analog Circuit Design manager,5299583540,Brekke-Ziemann
        +Osborn,Fritschel,ofritschel2y@kickstarter.com,ofritschel2y,Bayt Maqdūm,970-(366)314-6696,Quality Control Specialist,3107157244,"Schultz, Runolfsson and Hauck"
        +Olenolin,Spore,ospore2z@about.me,ospore2z,Kissimmee,1-(407)958-2939,Information Systems Manager,1377154629,"Bashirian, Eichmann and Bednar"
        +Sherlock,O'Carmody,socarmody30@flickr.com,socarmody30,Xuhang,86-(402)403-7851,VP Product Management,4691963855,Nikolaus-Homenick
        +Pincus,Stamps,pstamps31@dagondesign.com,pstamps31,Old City,970-(348)690-7659,Analog Circuit Design manager,9573629984,"Ullrich, Halvorson and Hammes"
        +Sallee,Clover,sclover32@google.it,sclover32,Tuymazy,7-(344)530-7082,Information Systems Manager,1064925987,O'Hara-Zulauf
        +Jillane,Moyes,jmoyes33@shutterfly.com,jmoyes33,Faratsiho,261-(956)463-6161,Information Systems Manager,1015767532,Ruecker LLC
        +Sully,Baugh,sbaugh34@about.com,sbaugh34,Xidajie,86-(864)668-1887,Administrative Officer,7779016676,Cormier-Zieme
        +Woodman,Filipczynski,wfilipczynski35@reference.com,wfilipczynski35,Chinú,57-(984)445-3303,Payment Adjustment Coordinator,8833195139,Abshire-Upton
        +Donia,Tayspell,dtayspell36@abc.net.au,dtayspell36,Jacarezinho,55-(631)500-4755,Cost Accountant,0515630330,"Von, Paucek and DuBuque"
        +Cordula,Gelling,cgelling37@berkeley.edu,cgelling37,Ipoh,60-(392)990-3252,Geologist III,0539485020,Walsh and Sons
        +Cory,Franciskiewicz,cfranciskiewicz38@indiatimes.com,cfranciskiewicz38,Grand Rapids,1-(616)238-1561,Software Test Engineer I,0739184717,O'Kon-Windler
        +Merrielle,Ringe,mringe39@xinhuanet.com,mringe39,Široki Brijeg,387-(905)648-3989,Actuary,1561596175,Lemke-Fay
        +Janka,Mahoney,jmahoney3a@newyorker.com,jmahoney3a,Lethem,592-(205)736-1572,Environmental Tech,1359840486,Hammes Group
        +Fleur,Arno,farno3b@thetimes.co.uk,farno3b,Santo Domingo,63-(244)461-5127,Research Nurse,2070821277,Baumbach LLC
        +Feliza,Kitchingman,fkitchingman3c@dailymotion.com,fkitchingman3c,Gunungbatu,62-(305)737-3215,Payment Adjustment Coordinator,3717140175,Crooks Inc
        +Brooks,Abrey,babrey3d@loc.gov,babrey3d,Nongba,86-(631)179-1441,Database Administrator III,1495770435,Ryan Inc
        +Domenico,Leeder,dleeder3e@toplist.cz,dleeder3e,Stobreč,385-(588)803-2783,Occupational Therapist,7517254553,Gislason-Dickens
        +Gracie,Leggs,gleggs3f@posterous.com,gleggs3f,Anchorage,1-(907)739-1009,Account Representative IV,9894304044,"Auer, Fay and Kutch"
        +Burton,Girodin,bgirodin3g@flavors.me,bgirodin3g,Tambo Grande,51-(473)237-9513,Teacher,2586053230,Swaniawski-O'Connell
        +Rutger,Fortnum,rfortnum3h@ucsd.edu,rfortnum3h,Zhen’an,86-(520)440-6913,Desktop Support Technician,9664475106,Stehr-Satterfield
        +Callie,Gaymar,cgaymar3i@yandex.ru,cgaymar3i,Cempaka,62-(632)111-7548,Software Consultant,9554343590,"Collins, Marvin and Predovic"
        +Roslyn,Giron,rgiron3j@mashable.com,rgiron3j,Cartagena,34-(478)145-7341,Operator,4796666060,Spencer-Altenwerth
        +Lindsey,Cabera,lcabera3k@upenn.edu,lcabera3k,Tostado,54-(284)861-1251,Paralegal,8728268571,"Schulist, Nitzsche and Hettinger"
        +Alfonse,Odom,aodom3l@technorati.com,aodom3l,Hägersten,46-(947)105-7610,Graphic Designer,4698060613,Windler and Sons
        +Chalmers,Carwithim,ccarwithim3m@livejournal.com,ccarwithim3m,Eslöv,46-(442)928-3035,Internal Auditor,2949190553,Fritsch Inc
        +Rosa,Totterdill,rtotterdill3n@jiathis.com,rtotterdill3n,Guoduwan,86-(359)340-9833,Legal Assistant,3214937413,Dibbert-Jacobs
        +Lionel,Tomlin,ltomlin3o@elpais.com,ltomlin3o,Montbéliard,33-(836)419-9346,Information Systems Manager,2638534692,"Greenfelder, Boyer and Pollich"
        +Mireielle,Edmands,medmands3p@washington.edu,medmands3p,Kafir Qala,93-(929)432-7754,Design Engineer,9816600269,Littel-Durgan
        +Maryellen,Cordrey,mcordrey3q@networksolutions.com,mcordrey3q,Aganan,63-(246)228-0609,Associate Professor,1918577528,Goldner Inc
        +Hilario,Wadforth,hwadforth3r@npr.org,hwadforth3r,Obninsk,7-(856)647-8958,Physical Therapy Assistant,3701886741,"Raynor, Larkin and Bergstrom"
        +Vanda,Gradley,vgradley3s@psu.edu,vgradley3s,København,45-(345)469-6826,Safety Technician II,2103662962,Dietrich Group
        +Portia,Guillond,pguillond3t@youtube.com,pguillond3t,Verbivka,380-(633)231-9128,General Manager,1175524999,Goodwin-O'Keefe
        +Amabel,Jestico,ajestico3u@samsung.com,ajestico3u,Palama,62-(610)896-0940,Editor,2152070887,McClure-Oberbrunner
        +Gillie,Cafferty,gcafferty3v@netvibes.com,gcafferty3v,Zátor,420-(663)207-1814,Programmer Analyst I,1345410255,"Schamberger, Cassin and Walsh"
        +Dorri,Artis,dartis3w@oakley.com,dartis3w,Sam Khok,66-(547)684-7107,Registered Nurse,8689941193,"Mayert, Huel and Kshlerin"
        +Gearard,Mills,gmills3x@quantcast.com,gmills3x,Iitti,358-(148)528-5126,Nurse Practicioner,2353507719,Smith-Conn
        +Brinna,Andrasch,bandrasch3y@icq.com,bandrasch3y,Karangtalun,62-(700)442-1707,Senior Quality Engineer,3147866394,"Larson, Renner and Goldner"
        +Mohammed,Garthshore,mgarthshore3z@washingtonpost.com,mgarthshore3z,Janas,351-(802)307-8630,Pharmacist,2137372886,McClure-Bruen
        +Alta,Jeacocke,ajeacocke40@reuters.com,ajeacocke40,Bcharré,961-(429)530-2191,Librarian,2747388336,"Weimann, Yundt and Jerde"
        +Denys,Fonzone,dfonzone41@fotki.com,dfonzone41,Kidodi,255-(569)842-8531,Programmer II,5530705758,Prohaska Inc
        +Kin,Godthaab,kgodthaab42@usatoday.com,kgodthaab42,Dongzhou,86-(738)848-9111,Developer IV,6520160466,Mueller LLC
        +Alida,Jallin,ajallin43@imageshack.us,ajallin43,Croix,33-(392)554-0240,Graphic Designer,6970422224,Donnelly Group
        +Domeniga,Pawling,dpawling44@economist.com,dpawling44,Cergy-Pontoise,33-(808)258-6123,Information Systems Manager,2752070268,Lakin and Sons
        +Teddie,Pund,tpund45@cnet.com,tpund45,Åkersberga,46-(594)668-9870,Sales Representative,3679850239,Gerlach-Kohler
        +Hubert,Staniland,hstaniland46@t-online.de,hstaniland46,Huanggang,86-(605)920-8337,Nurse,3003691309,Crooks and Sons
        +Valentijn,Doughton,vdoughton47@vk.com,vdoughton47,La Montañita,57-(547)938-5819,Community Outreach Specialist,5005398791,Gleichner-Ward
        +Dunstan,McTurk,dmcturk48@t-online.de,dmcturk48,Cereté,57-(431)362-8281,VP Sales,3378279060,"Kuhic, Crooks and Bergnaum"
        +Ervin,Tungay,etungay49@tripadvisor.com,etungay49,Monte,351-(118)918-9096,VP Quality Control,4816619569,"Homenick, Kihn and Sporer"
        +Nevil,Kelemen,nkelemen4a@mapy.cz,nkelemen4a,Cha-am,66-(292)424-3669,Programmer Analyst I,4729507800,"Armstrong, Bauch and Doyle"
        +Hildegarde,Joffe,hjoffe4b@squarespace.com,hjoffe4b,Sājir,966-(816)671-3309,Developer IV,5371857133,"Quitzon, Lakin and Koss"
        +Virgil,Latchmore,vlatchmore4c@europa.eu,vlatchmore4c,Bahorí,992-(626)965-2780,Electrical Engineer,4331295168,Hackett-Ortiz
        +Shurwood,Kennon,skennon4d@trellian.com,skennon4d,Shimen,86-(122)424-6837,Actuary,5908185647,Feil-Flatley
        +Coretta,Robe,crobe4e@huffingtonpost.com,crobe4e,Paltashaco,51-(430)483-8211,Help Desk Technician,3927212415,Ortiz Inc
        +Roddie,Frudd,rfrudd4f@dion.ne.jp,rfrudd4f,Khombole,221-(980)728-8902,Legal Assistant,6679829933,Turcotte-Aufderhar
        +Geraldine,Pershouse,gpershouse4g@4shared.com,gpershouse4g,Pinheiro,55-(810)396-6565,Account Representative II,9339033949,Bradtke and Sons
        +Rex,Winterburn,rwinterburn4h@earthlink.net,rwinterburn4h,Konibodom,992-(285)759-4482,Engineer I,4013574306,Harvey-Hirthe
        +Bride,MacCawley,bmaccawley4i@skype.com,bmaccawley4i,Głubczyce,48-(645)682-7840,Information Systems Manager,3136570391,"Swaniawski, Gerlach and Gibson"
        +Nikkie,Freund,nfreund4j@freewebs.com,nfreund4j,Gusang,86-(298)352-9050,Product Engineer,9725922840,"Purdy, Rice and Fahey"
        +Henrieta,Creavin,hcreavin4k@wired.com,hcreavin4k,Maoming,86-(203)885-7331,Quality Engineer,6377468806,"Weber, Tillman and Frami"
        +Freddie,Irce,firce4l@narod.ru,firce4l,Koszyce Wielkie,48-(793)133-0472,Professor,8965612748,Kunde Inc
        +Erin,Thomton,ethomton4m@com.com,ethomton4m,Punta Cana,1-(194)646-6108,Speech Pathologist,8529365445,"Pfannerstill, Berge and Keebler"
        +Stu,Grabiec,sgrabiec4n@desdev.cn,sgrabiec4n,Bagé,55-(658)679-1980,Senior Financial Analyst,9818636597,"Murray, Hessel and Considine"
        +Marlo,Hay,mhay4o@si.edu,mhay4o,Bojonglarang,62-(342)321-9267,Systems Administrator I,9669756170,Skiles-Mueller
        +Ruthe,Rainforth,rrainforth4p@lycos.com,rrainforth4p,Zhangcheng,86-(103)571-9123,Human Resources Manager,0110467094,Treutel-Schroeder
        +Nanette,Marvell,nmarvell4q@themeforest.net,nmarvell4q,Candelaria,63-(677)283-7853,Help Desk Operator,0831047453,Johnston-Hayes
        +Gwendolen,Kettleson,gkettleson4r@lycos.com,gkettleson4r,Curahkalak Tengah,62-(324)997-7422,Compensation Analyst,3942331365,Russel-Satterfield
        +Whittaker,Gregh,wgregh4s@behance.net,wgregh4s,Głowno,48-(285)750-6950,Automation Specialist II,0264496159,Hamill-Kemmer
        +Shay,Ramelet,sramelet4t@techcrunch.com,sramelet4t,San Pedro,54-(301)601-8361,Staff Accountant I,8224288722,Aufderhar LLC
        +Adrienne,Villar,avillar4u@list-manage.com,avillar4u,Shuangjie,86-(951)513-0325,Automation Specialist II,7072078703,"O'Keefe, Lowe and Stroman"
        +Alyda,Gillford,agillford4v@tinypic.com,agillford4v,Fengxian,86-(660)158-1836,Structural Engineer,6986236239,"Moen, Mraz and Heidenreich"
        +Biron,Rajchert,brajchert4w@e-recht24.de,brajchert4w,Niort,33-(207)497-8305,Quality Control Specialist,5556782318,Conn LLC
        +Drake,Foran,dforan4x@wisc.edu,dforan4x,Fort Pierce,1-(772)401-1527,Nurse Practicioner,2174876256,"Brakus, Schimmel and Turner"
        +Madella,Flew,mflew4y@amazon.de,mflew4y,Haodi,86-(156)758-1712,Structural Engineer,2630355349,Abbott Group
        +Jermain,Lintot,jlintot4z@linkedin.com,jlintot4z,Koszyce Wielkie,48-(712)513-8339,Electrical Engineer,5316574915,Bruen Inc
        +Malvina,Cherrison,mcherrison50@dell.com,mcherrison50,Belung Satu,62-(983)260-7407,Geologist III,0459539647,"Nader, Davis and Spinka"
        +Nesta,Darell,ndarell51@sina.com.cn,ndarell51,Vostochnyy,7-(216)191-7642,Dental Hygienist,9912630998,"Aufderhar, Krajcik and Lemke"
        +Valery,Sharpus,vsharpus52@cnn.com,vsharpus52,Checca,51-(325)577-5349,Budget/Accounting Analyst II,9257058077,"Koch, Keeling and Kihn"
        +Ramona,Cahill,rcahill53@networksolutions.com,rcahill53,Bailieborough,353-(653)588-5654,VP Marketing,6559784584,Welch-Gleason
        +Calv,Studdeard,cstuddeard54@dion.ne.jp,cstuddeard54,Babakan,62-(727)232-5040,Geological Engineer,3900347034,"Nitzsche, Mohr and Simonis"
        +Malia,Jacobssen,mjacobssen55@e-recht24.de,mjacobssen55,Aldeia do Bispo,351-(313)100-4305,Cost Accountant,3428666267,Mayer Group
        +Laural,Izon,lizon56@icq.com,lizon56,Gaoqiao,86-(275)782-1267,Assistant Media Planner,6392728392,Wintheiser Inc
        +Morgan,Caukill,mcaukill57@storify.com,mcaukill57,Torres Novas,351-(450)639-8416,Analog Circuit Design manager,2316388078,"Schiller, Kris and Farrell"
        +Marlane,Palek,mpalek58@miibeian.gov.cn,mpalek58,San Isidro de Lules,54-(873)665-9102,Design Engineer,1418632929,Lubowitz and Sons
        +Broderick,Ugo,bugo59@hud.gov,bugo59,Silodakon,62-(378)217-9779,Recruiter,4977155548,Steuber-Dietrich
        +Norry,Arzu,narzu5a@oakley.com,narzu5a,Timashëvsk,7-(943)185-9478,Paralegal,8088001102,"Hettinger, Gutkowski and Bechtelar"
        +Benedikta,Meininking,bmeininking5b@macromedia.com,bmeininking5b,Jiucheng,86-(218)617-0476,Legal Assistant,0611180774,Douglas Inc
        +Edan,Velasquez,evelasquez5c@sitemeter.com,evelasquez5c,Juncheng,86-(623)794-4358,Associate Professor,3556333899,"Marks, Jakubowski and Boyer"
        +Shea,Ernke,sernke5d@freewebs.com,sernke5d,Korniyivka,380-(988)667-0972,Senior Quality Engineer,3318216801,Huel Inc
        +Bekki,Fesby,bfesby5e@irs.gov,bfesby5e,Lille,33-(510)850-2554,Desktop Support Technician,2228160431,Ullrich LLC
        +Sean,Oda,soda5f@tinyurl.com,soda5f,Furukawa,81-(267)487-5524,Office Assistant I,2265020354,Spinka-Auer
        +Jerry,Bakster,jbakster5g@sina.com.cn,jbakster5g,Hołoby,380-(683)792-0125,Staff Scientist,2528271107,D'Amore and Sons
        +Wendi,Imlen,wimlen5h@amazon.co.uk,wimlen5h,Takatsuki,81-(641)449-9730,Internal Auditor,8591255291,Hermann-Reinger
        +Cristina,McCarry,cmccarry5i@weibo.com,cmccarry5i,Banturkrajan,62-(200)913-3412,Help Desk Technician,8664973989,"Skiles, Russel and Wisoky"
        +Viviana,Selman,vselman5j@360.cn,vselman5j,Huayan,86-(681)662-3285,Research Assistant III,6262769528,Wuckert Inc
        +Shanie,Uppett,suppett5k@webeden.co.uk,suppett5k,Lac du Bonnet,1-(543)646-5383,Operator,4572433119,Fadel Inc
        +Suzie,Bridgeman,sbridgeman5l@dmoz.org,sbridgeman5l,Kamo,81-(897)485-9748,Environmental Specialist,1977897401,"Denesik, Okuneva and Bernier"
        +Eudora,Casterot,ecasterot5m@psu.edu,ecasterot5m,Zonghan,86-(764)968-7549,Help Desk Operator,2008858634,"Jaskolski, Huels and Dibbert"
        +Penn,Viant,pviant5n@linkedin.com,pviant5n,Andir,62-(390)901-5564,Senior Sales Associate,2238319271,"Cummings, Beatty and Hudson"
        +Berne,Hannan,bhannan5o@shareasale.com,bhannan5o,Krajan Kerjo,62-(278)571-4046,Data Coordiator,7942202852,Auer-Bartoletti
        +Oralee,Malyj,omalyj5p@admin.ch,omalyj5p,Kotayk’,374-(542)956-6172,Engineer IV,4819135880,"Pacocha, Kertzmann and Rempel"
        +Fifi,Small,fsmall5q@amazon.de,fsmall5q,Voznesenskoye,7-(821)863-5914,Physical Therapy Assistant,6908304248,"Rippin, Reichel and White"
        +Loise,Pilger,lpilger5r@smh.com.au,lpilger5r,Hénin-Beaumont,33-(686)647-9059,Information Systems Manager,0967841968,Wiza and Sons
        +Derward,Dupoy,ddupoy5s@latimes.com,ddupoy5s,Itami,81-(903)990-0489,Quality Engineer,3564905782,Dare-Kautzer
        +Chelsea,Lergan,clergan5t@youtu.be,clergan5t,Jiagao,86-(320)644-8775,Research Assistant III,9361206621,Kirlin-Effertz
        +Rosene,Flitcroft,rflitcroft5u@free.fr,rflitcroft5u,Inírida,57-(248)911-2377,Clinical Specialist,9685341567,"Dietrich, Wyman and Shanahan"
        +Chariot,Barok,cbarok5v@blogspot.com,cbarok5v,Căuşeni,373-(632)605-6648,Speech Pathologist,4694900498,Legros LLC
        +Elita,von Nassau,evonnassau5w@digg.com,evonnassau5w,Kutacane,62-(213)303-2731,Executive Secretary,0347148085,Green Inc
        +Gael,Marjanovic,gmarjanovic5x@marriott.com,gmarjanovic5x,Huacapampa,51-(186)661-9148,Occupational Therapist,6726485387,"Stamm, Kris and Farrell"
        +Gaspard,Ummfrey,gummfrey5y@t.co,gummfrey5y,Buenavista,63-(497)452-5987,Speech Pathologist,4575944572,Bradtke-Hegmann
        +Bent,Trenam,btrenam5z@auda.org.au,btrenam5z,Cerrito,57-(251)296-9228,Payment Adjustment Coordinator,1352694905,Robel Inc
        +Allie,Cardo,acardo60@nba.com,acardo60,Sayama,81-(136)328-3578,Administrative Assistant II,1953155472,Franecki Inc
        +Kendricks,Lawes,klawes61@wikimedia.org,klawes61,Kýria,30-(629)572-9182,Automation Specialist III,3013335882,Cremin and Sons
        +Israel,Earwicker,iearwicker62@latimes.com,iearwicker62,Naga,63-(980)734-2130,Help Desk Technician,9262358857,Predovic Group
        +Olivie,Haskett,ohaskett63@biblegateway.com,ohaskett63,Sadská,420-(267)684-5843,General Manager,0341903078,"Ritchie, Thiel and Crona"
        +Lorette,Jupp,ljupp64@eventbrite.com,ljupp64,Kalety,48-(905)755-9085,Senior Financial Analyst,6902201358,"Larson, Mann and Denesik"
        +Huberto,Fieldsend,hfieldsend65@hibu.com,hfieldsend65,Rostokino,7-(885)545-7151,Sales Representative,7583497507,Buckridge-Crist
        +Galvan,Ruslen,gruslen66@biblegateway.com,gruslen66,Tomaszów Lubelski,48-(738)856-8800,Executive Secretary,7689061370,Marquardt Group
        +Lucine,Dillway,ldillway67@netlog.com,ldillway67,Nobres,55-(588)142-5888,Data Coordiator,3143583223,Morissette Group
        +Bogey,Lloyd,blloyd68@clickbank.net,blloyd68,Maskinongé,1-(480)421-6369,Recruiter,8019916377,Schmidt-Okuneva
        +Lana,Osorio,losorio69@theguardian.com,losorio69,Shuiyuesi,86-(368)799-2866,Financial Advisor,0845918354,Murazik-Spinka
        +April,Shrimpton,ashrimpton6a@yahoo.co.jp,ashrimpton6a,Jurh,86-(945)443-7757,Budget/Accounting Analyst I,6199988221,"Willms, Marquardt and Kautzer"
        +Thea,Brunelleschi,tbrunelleschi6b@boston.com,tbrunelleschi6b,Belovo,7-(379)764-3239,Speech Pathologist,3924467498,Feil Inc
        +Sunshine,Pymer,spymer6c@sakura.ne.jp,spymer6c,Tsibulev,380-(446)992-3711,Technical Writer,0673563766,Price-Kuhic
        +Neddie,Westoll,nwestoll6d@dailymail.co.uk,nwestoll6d,Tatebayashi,81-(379)112-1552,Software Consultant,5692786702,"Lind, Schoen and Harris"
        +Godfrey,Shiliton,gshiliton6e@economist.com,gshiliton6e,Caucaia,55-(324)521-2916,Assistant Media Planner,3640782380,"White, Sipes and Macejkovic"
        +Bonnibelle,Meys,bmeys6f@hud.gov,bmeys6f,Barengkok Hilir,62-(132)233-0164,VP Marketing,6576141343,Greenfelder and Sons
        +Biddie,Hazart,bhazart6g@privacy.gov.au,bhazart6g,Lyubimets,359-(539)214-9362,Research Nurse,2110251921,Beatty Inc
        +Mariette,Arnoud,marnoud6h@upenn.edu,marnoud6h,Chonglou,86-(367)745-8032,Chemical Engineer,6279421910,Bailey-Flatley
        +Ralph,Ronan,rronan6i@soup.io,rronan6i,Villa del Rosario,54-(472)473-2834,Media Manager III,0898611601,Conroy-Schultz
        +Kristopher,Byrth,kbyrth6j@ucoz.com,kbyrth6j,Vyselki,7-(553)161-3317,GIS Technical Architect,8368786673,"Feest, Cremin and Goodwin"
        +Juliette,Peckett,jpeckett6k@desdev.cn,jpeckett6k,Dublin,353-(547)169-7510,Registered Nurse,4289815278,Jakubowski-Lueilwitz
        +Lauretta,Edgeler,ledgeler6l@instagram.com,ledgeler6l,Tarragona,63-(650)302-6149,Biostatistician IV,6817860377,"Jakubowski, Steuber and Tillman"
        +Scot,Calvert,scalvert6m@blinklist.com,scalvert6m,Condong,62-(732)380-9120,Sales Associate,7437515962,Doyle-Breitenberg
        +Elyssa,Tibbles,etibbles6n@last.fm,etibbles6n,Neftobod,992-(777)638-8129,Analyst Programmer,9445635612,"Fahey, Champlin and Dietrich"
        +Brander,Harmer,bharmer6o@bloglovin.com,bharmer6o,Gardēz,93-(358)973-4287,Librarian,1276314027,"Hauck, Simonis and Rosenbaum"
        +Brennen,Springthorpe,bspringthorpe6p@salon.com,bspringthorpe6p,Mobaye,236-(308)628-4824,Safety Technician II,3086629398,Yundt-Ziemann
        +Bren,Kleynermans,bkleynermans6q@phpbb.com,bkleynermans6q,Weifang,86-(292)267-2145,Developer III,5400207502,"Treutel, Stoltenberg and Johnston"
        +Candy,Tooze,ctooze6r@friendfeed.com,ctooze6r,Vlachovo Březí,420-(676)807-2495,Nurse Practicioner,5388144038,"Russel, Blanda and Rogahn"
        +Fairleigh,Diamant,fdiamant6s@blinklist.com,fdiamant6s,Sainte-Anne-de-Bellevue,1-(568)570-3951,Quality Engineer,3663658481,Armstrong-Johns
        +Basil,Howsden,bhowsden6t@ovh.net,bhowsden6t,Xylotymbou,357-(214)824-3004,Tax Accountant,3403316513,"Langosh, Bartell and Stoltenberg"
        +Dora,Dobbin,ddobbin6u@amazon.co.jp,ddobbin6u,Lamovita,387-(768)310-0952,Office Assistant I,8679431729,Leannon-Kiehn
        +Demetra,Brownill,dbrownill6v@over-blog.com,dbrownill6v,Bagou,86-(713)477-6708,Sales Representative,5659782310,Johns-Kerluke
        +Dasi,Dumini,ddumini6w@patch.com,ddumini6w,Punta del Este,598-(886)595-6322,Human Resources Assistant II,1332065767,Schowalter-Altenwerth
        +Lenette,Geaveny,lgeaveny6x@pcworld.com,lgeaveny6x,Gaoqiao,86-(467)357-1181,Programmer IV,6397889467,"Will, Rath and Jenkins"
        +Colin,Treace,ctreace6y@wikimedia.org,ctreace6y,Nanjiao,86-(675)354-6909,Chief Design Engineer,7751575638,"Ferry, Runolfsdottir and Yost"
        +Corabelle,Clow,cclow6z@hexun.com,cclow6z,Sovetskaya Gavan’,7-(120)976-8309,Software Consultant,7813300394,Doyle Group
        +Linda,Sebborn,lsebborn70@ucoz.ru,lsebborn70,Knoxville,1-(865)117-5458,General Manager,9692754766,Reichert-O'Reilly
        +Hector,Halbeard,hhalbeard71@about.me,hhalbeard71,Batanovtsi,359-(442)822-8483,Physical Therapy Assistant,9078172762,Conn Group
        +Abbe,Mobberley,amobberley72@ucsd.edu,amobberley72,Kinna,46-(293)901-8731,Administrative Assistant II,9620491815,Hahn-Batz
        +Jasmina,Wickliffe,jwickliffe73@google.it,jwickliffe73,Mercier,1-(345)768-6426,Web Designer IV,9241731699,Wunsch Inc
        +Cissy,Saill,csaill74@google.ru,csaill74,Cifuentes,53-(247)403-7379,Analog Circuit Design manager,1682507572,Oberbrunner Group
        +Sharlene,Ozintsev,sozintsev75@google.com.br,sozintsev75,Gornji Milanovac,381-(814)830-4698,Associate Professor,2798596351,Lockman-Abbott
        +Padraic,Alyukin,palyukin76@chicagotribune.com,palyukin76,Ouricuri,55-(251)839-4014,Recruiter,6246014852,Weimann-Fay
        +Rowney,Bamblett,rbamblett77@shop-pro.jp,rbamblett77,Saint-Étienne,33-(689)956-1538,Director of Sales,2164832523,Gulgowski Inc
        +Ertha,Carayol,ecarayol78@aol.com,ecarayol78,Kanoni,256-(965)621-0576,Assistant Professor,7485417517,"Hoppe, Windler and Stiedemann"
        +Jodie,Ramsdell,jramsdell79@ezinearticles.com,jramsdell79,Xingxi,86-(209)444-2347,Geological Engineer,1645038890,Padberg LLC
        +Jessie,Febre,jfebre7a@lulu.com,jfebre7a,Glugur Krajan,62-(476)504-7372,Editor,7484180890,Dickinson Group
        +Xymenes,Rihanek,xrihanek7b@mapy.cz,xrihanek7b,Tiemen,86-(815)399-0300,Tax Accountant,7418639295,Rogahn Group
        +Ynes,Castagneri,ycastagneri7c@army.mil,ycastagneri7c,Majiang,86-(109)725-0679,Web Developer IV,9966232281,Veum-Block
        +Meade,Josovich,mjosovich7d@instagram.com,mjosovich7d,Dumalinao,63-(220)787-8879,Chief Design Engineer,9532892052,Dach LLC
        +Starla,Baglan,sbaglan7e@kickstarter.com,sbaglan7e,Tucson,1-(520)306-4486,Geological Engineer,3924286000,White LLC
        +Cecil,Ditchfield,cditchfield7f@merriam-webster.com,cditchfield7f,Bouillon,32-(153)814-1718,Safety Technician II,3049249757,Wehner-Schultz
        +Albina,Caile,acaile7g@sourceforge.net,acaile7g,Limanowa,48-(598)134-6137,Statistician IV,2887139231,Gleichner LLC
        +Myrtia,Topling,mtopling7h@timesonline.co.uk,mtopling7h,Weichanglu,86-(679)742-0020,Account Coordinator,8708521727,Skiles-Rempel
        +Jillian,Parnall,jparnall7i@plala.or.jp,jparnall7i,Lobito,244-(170)955-1350,Environmental Specialist,4004831083,McCullough-Gislason
        +Martita,Gallamore,mgallamore7j@fotki.com,mgallamore7j,Watubuku,62-(829)363-5055,Food Chemist,0332452107,Cummerata Group
        +Gareth,Bourchier,gbourchier7k@biblegateway.com,gbourchier7k,Benito Juarez,52-(692)902-9439,Senior Editor,2717344314,Mueller-McDermott
        +Cristine,Lydiard,clydiard7l@hubpages.com,clydiard7l,Puzi,86-(502)679-6404,Tax Accountant,2847297839,Rau-Gerhold
        +Tamar,Grishagin,tgrishagin7m@ft.com,tgrishagin7m,Singkup,62-(368)986-3322,Pharmacist,4974827138,Waters-Volkman
        +Kassandra,McGarva,kmcgarva7n@ucsd.edu,kmcgarva7n,Tunal,51-(683)835-8456,Statistician II,8446317222,Tremblay-Jacobi
        +Lulita,Millard,lmillard7o@biglobe.ne.jp,lmillard7o,Charlemagne,1-(334)407-8112,Software Engineer IV,7906208463,Nicolas-Harber
        +Deanna,Guly,dguly7p@cbslocal.com,dguly7p,Barda,994-(610)562-3650,Business Systems Development Analyst,3995952712,Bailey Group
        +Latia,Lerer,llerer7q@acquirethisname.com,llerer7q,Dykan’ka,380-(537)386-5412,Quality Control Specialist,1410485773,Daugherty and Sons
        +Jessika,Constantine,jconstantine7r@twitter.com,jconstantine7r,Parang,62-(598)114-0602,VP Marketing,1477207635,Schowalter-Becker
        +Fianna,Garz,fgarz7s@posterous.com,fgarz7s,Västerås,46-(169)490-0251,Paralegal,2065474785,"Osinski, Stark and Wisoky"
        +Georgina,McGown,gmcgown7t@va.gov,gmcgown7t,Lianghekou,86-(580)598-5939,Database Administrator IV,8574862584,Schmidt-Stark
        +Libbey,Hatto,lhatto7u@parallels.com,lhatto7u,Saint-Pierre,262-(621)379-5079,Compensation Analyst,3663439984,Wintheiser-Tromp
        +Melosa,Varvell,mvarvell7v@msu.edu,mvarvell7v,Canta,51-(384)731-8458,Executive Secretary,1754007481,Lind-Weissnat
        +Caspar,Cutbirth,ccutbirth7w@nifty.com,ccutbirth7w,Makoko,234-(315)758-3899,Senior Sales Associate,7648950596,"Kertzmann, Muller and McClure"
        +Ward,Pryor,wpryor7x@xinhuanet.com,wpryor7x,Pitangui,55-(228)519-9720,Research Assistant I,7596446612,Ondricka-Murray
        +Judon,Orhrt,jorhrt7y@friendfeed.com,jorhrt7y,Rancakuya,62-(835)959-6252,Senior Financial Analyst,0862524326,Ratke-Powlowski
        +Isa,Gudgin,igudgin7z@bizjournals.com,igudgin7z,Paojan,62-(130)105-8528,Administrative Assistant IV,6567173823,Hyatt and Sons
        +Jacquetta,Heinrici,jheinrici80@latimes.com,jheinrici80,Pitanga,55-(768)218-0323,Clinical Specialist,7383258630,McCullough LLC
        +Gris,Demonge,gdemonge81@eventbrite.com,gdemonge81,Sevsk,7-(385)990-5642,Software Consultant,7319470772,Prosacco Inc
        +Anna,Cordova,acordova82@vistaprint.com,acordova82,Horodnya,380-(403)720-3982,Research Associate,8382416985,Witting Inc
        +Garek,Paver,gpaver83@reddit.com,gpaver83,Baumata,62-(857)457-3277,Systems Administrator IV,5548424025,Homenick-Cummings
        +Lyndsey,Penrose,lpenrose84@amazonaws.com,lpenrose84,Xinning,86-(478)975-1877,Account Executive,2521617024,"Beier, Wolf and Rutherford"
        +Vivyanne,Garment,vgarment85@hc360.com,vgarment85,Abonnema,234-(630)147-0664,Compensation Analyst,3170876961,Gibson Inc
        +Diandra,Alfonso,dalfonso86@so-net.ne.jp,dalfonso86,São Joaquim da Barra,55-(958)915-7472,Recruiter,9244448580,"Walker, Ryan and Gutmann"
        +Germana,Filippi,gfilippi87@virginia.edu,gfilippi87,Bořitov,420-(677)675-6041,Quality Engineer,4733992351,Rice Group
        +Huntington,Jaffa,hjaffa88@jigsy.com,hjaffa88,Puerto Padre,53-(811)758-9909,Research Associate,3705515845,Kerluke-Durgan
        +Julius,Scrace,jscrace89@sohu.com,jscrace89,Vilnius,370-(437)863-9804,Senior Financial Analyst,8560462449,"Wunsch, Wilkinson and Bernier"
        +Orin,Donnersberg,odonnersberg8a@lycos.com,odonnersberg8a,Posadas,54-(799)614-8488,Assistant Manager,6525056810,"Barrows, Prohaska and Raynor"
        +Nicole,Alberts,nalberts8b@businessinsider.com,nalberts8b,Circa,51-(793)830-7780,Internal Auditor,6648971908,Kihn Inc
        +Noami,Coast,ncoast8c@blogs.com,ncoast8c,Bengga,62-(245)836-9414,VP Accounting,1384386025,"Reilly, Feest and Armstrong"
        +Trev,Coil,tcoil8d@nyu.edu,tcoil8d,Ol Kalou,254-(686)258-2913,Mechanical Systems Engineer,6873910341,Goyette Inc
        +Isiahi,Bingall,ibingall8e@histats.com,ibingall8e,Raleigh,1-(919)707-3481,Legal Assistant,7848853918,"Stark, Thompson and Wintheiser"
        +Dasi,Balsdon,dbalsdon8f@paginegialle.it,dbalsdon8f,Douala,237-(853)665-9676,Administrative Officer,5137205664,"Olson, Mayert and Renner"
        +Allx,Towl,atowl8g@wordpress.com,atowl8g,Kosti,249-(267)322-7346,Human Resources Assistant III,4848260302,Walker LLC
        +Mead,Bunton,mbunton8h@linkedin.com,mbunton8h,Zhukovskiy,7-(479)702-5593,General Manager,9816135388,Durgan-Steuber
        +Felipe,Cremen,fcremen8i@tinyurl.com,fcremen8i,Tualangcut,62-(457)527-3731,Software Consultant,0960922245,Glover-Vandervort
        +Maryanne,Bevir,mbevir8j@devhub.com,mbevir8j,Petrolina,55-(430)943-6831,Analog Circuit Design manager,8076246016,Schumm-Hoppe
        +Rice,Bangley,rbangley8k@tinyurl.com,rbangley8k,San Francisco,1-(415)451-6262,Legal Assistant,2931538566,Wisoky-Hettinger
        +Rockey,Jewell,rjewell8l@printfriendly.com,rjewell8l,Mistrató,57-(273)159-4757,Marketing Manager,2358326909,Kohler-Crooks
        +Andrei,Busk,abusk8m@trellian.com,abusk8m,Shevchenkove,380-(471)522-4941,Software Test Engineer III,5139581752,Kemmer Group
        +Boyce,Colwill,bcolwill8n@google.fr,bcolwill8n,Paço de Arcos,351-(169)576-4617,Database Administrator I,8239907938,"Carter, Connelly and Turcotte"
        +Rosalia,Kilcullen,rkilcullen8o@tmall.com,rkilcullen8o,Skellefteå,46-(497)227-6314,Research Nurse,7802328411,Marvin Inc
        +Wang,Howcroft,whowcroft8p@usa.gov,whowcroft8p,Seixo de Manhoses,351-(878)241-1916,Engineer I,4169975723,"Quitzon, Jacobson and Hoeger"
        +Pauletta,MacFadden,pmacfadden8q@yellowbook.com,pmacfadden8q,Guanabacoa,53-(414)148-3660,Senior Cost Accountant,4033591168,"Bernhard, Greenholt and Kovacek"
        +Anetta,Kikke,akikke8r@xrea.com,akikke8r,Pines,63-(455)105-7090,Staff Scientist,3797345658,"Upton, Walter and Champlin"
        +Doy,Von Oertzen,dvonoertzen8s@soundcloud.com,dvonoertzen8s,Trancas,54-(227)790-7863,Quality Control Specialist,7347709652,Rogahn-Robel
        +Evania,Ettery,eettery8t@woothemes.com,eettery8t,Batuidu,62-(958)487-1137,Environmental Tech,6712438047,"McCullough, Brown and White"
        +Dorothy,Burchfield,dburchfield8u@com.com,dburchfield8u,Buenos Aires,57-(104)461-3034,Structural Engineer,1232163627,"Bergnaum, Mann and Denesik"
        +Marnia,Pates,mpates8v@cdc.gov,mpates8v,Wanzu,86-(584)655-8767,Structural Analysis Engineer,9486437602,"Vandervort, Reilly and Torp"
        +Sherlocke,Sundin,ssundin8w@bloglovin.com,ssundin8w,Lubumbashi,242-(894)433-3030,Database Administrator I,8350287896,"Denesik, Prohaska and Jacobson"
        +Cathe,Perell,cperell8x@wordpress.com,cperell8x,Kruty,380-(115)837-1904,VP Sales,0042397316,"Wilkinson, Schulist and Macejkovic"
        +Pennie,Gerault,pgerault8y@geocities.jp,pgerault8y,Placencia,501-(575)329-0306,Social Worker,7431658591,"Torphy, Bailey and Reilly"
        +Mitchell,Crambie,mcrambie8z@privacy.gov.au,mcrambie8z,Xiamao,86-(265)196-0470,Nuclear Power Engineer,1526344351,Ritchie-Morissette
        +Melisent,Gosneye,mgosneye90@freewebs.com,mgosneye90,Yōkaichiba,81-(118)826-5920,VP Product Management,2373235900,Homenick and Sons
        +Jordain,Gheorghe,jgheorghe91@bandcamp.com,jgheorghe91,Ljungby,46-(108)213-7069,Pharmacist,2339386128,"Lubowitz, Witting and Trantow"
        +Ezekiel,Winpenny,ewinpenny92@aboutads.info,ewinpenny92,Uttaradit,66-(502)534-3772,Analyst Programmer,9863270415,"Satterfield, Yost and Cruickshank"
        +Alaric,Coal,acoal93@rambler.ru,acoal93,Piła,48-(110)978-3089,Senior Editor,1002792959,Schmeler Group
        +Sigvard,Durnill,sdurnill94@senate.gov,sdurnill94,Jiuzihe,86-(285)652-3541,Desktop Support Technician,6259022751,Hodkiewicz-Treutel
        +Pauletta,Jacob,pjacob95@blog.com,pjacob95,Lillehammer,47-(466)710-7316,Budget/Accounting Analyst IV,8012816342,Kub-Streich
        +Genevieve,Easson,geasson96@gmpg.org,geasson96,Litian,86-(690)700-3316,Chemical Engineer,9267475002,Krajcik-Berge
        +Chad,Wellings,cwellings97@geocities.com,cwellings97,Corozal,57-(599)397-8105,Technical Writer,1234875780,Lang Inc
        +Constantia,Andor,candor98@angelfire.com,candor98,Luxi,86-(981)190-7061,Tax Accountant,2171737387,Kunze-Cummerata
        +Nathanil,Kennett,nkennett99@salon.com,nkennett99,Kushnytsya,380-(964)412-7626,Operator,2201713081,Auer LLC
        +Marilyn,Lambden,mlambden9a@ca.gov,mlambden9a,Sūq al Khamīs,967-(606)751-1510,Social Worker,9824776443,"Kuhic, Wolf and Runte"
        +Sol,Trownson,strownson9b@t.co,strownson9b,Venado Tuerto,54-(387)454-8901,Paralegal,4748088125,Reichert-Nitzsche
        +Marybeth,Sturney,msturney9c@163.com,msturney9c,Agassiz,1-(357)754-2461,Data Coordiator,3593006383,Spinka-Ebert
        +Tyler,Kightly,tkightly9d@ed.gov,tkightly9d,Kunčice pod Ondřejníkem,420-(222)601-1668,General Manager,5778670230,Brown Group
        +Godart,Izakoff,gizakoff9e@jimdo.com,gizakoff9e,San Agustin,63-(658)848-5052,Junior Executive,3147182215,Schaden and Sons
        +Cherie,MacAndrew,cmacandrew9f@jigsy.com,cmacandrew9f,Topeka,1-(785)270-8606,Software Engineer IV,5443654527,Schuster-Windler
        +Giorgia,Cinderey,gcinderey9g@php.net,gcinderey9g,Setúbal,351-(730)743-5865,Account Representative I,6484043175,Johns Inc
        +Kasper,Deuss,kdeuss9h@myspace.com,kdeuss9h,Ostrogozhsk,7-(336)124-5046,Nurse,6142898304,"Smith, Hamill and Beatty"
        +Leroy,Foord,lfoord9i@timesonline.co.uk,lfoord9i,Kijang,82-(585)819-8722,Analog Circuit Design manager,4569642292,Leffler-Casper
        +Urson,Fludder,ufludder9j@mac.com,ufludder9j,Lumbardhi,383-(659)644-8699,Programmer II,2608105793,Wisoky-Lesch
        +Victoir,Sainer,vsainer9k@4shared.com,vsainer9k,Mocoa,57-(566)759-9576,Senior Cost Accountant,4891001224,Gerlach Inc
        +Nestor,Gray,ngray9l@paginegialle.it,ngray9l,Vallauris,33-(405)253-6375,Help Desk Operator,7391899399,Rutherford-Fisher
        +Benedetto,Sebrens,bsebrens9m@quantcast.com,bsebrens9m,Hüremt,976-(937)675-7706,Health Coach I,5492941666,Rosenbaum Inc
        +Alis,Crittal,acrittal9n@fema.gov,acrittal9n,Xia’ertai,86-(808)528-2343,Nurse,9616882783,Waters LLC
        +Tanitansy,Deighan,tdeighan9o@ovh.net,tdeighan9o,Ketitang Wetan,62-(807)439-9181,Account Coordinator,5918139109,Schultz-Quigley
        +Park,Allbon,pallbon9p@topsy.com,pallbon9p,Mértola,351-(457)676-3664,Recruiter,7432415315,Franecki-Lind
        +Bridget,Houlden,bhoulden9q@telegraph.co.uk,bhoulden9q,Busay,63-(327)378-8551,Teacher,5534661836,Kutch Inc
        +Timi,Winnett,twinnett9r@wiley.com,twinnett9r,Foros de Salvaterra,351-(750)913-7504,VP Marketing,0956508278,"Pagac, Wisozk and Powlowski"
        +Garey,Berends,gberends9s@nasa.gov,gberends9s,Villa Nueva,54-(466)900-2563,Community Outreach Specialist,2649689285,Cruickshank Group
        +Maurise,Sabathe,msabathe9t@umn.edu,msabathe9t,Porto Alto,351-(826)409-0224,Environmental Tech,4375179112,O'Kon and Sons
        +Waiter,Newport,wnewport9u@cdc.gov,wnewport9u,Balibago,63-(808)564-2341,Media Manager I,3383596125,Frami-Kassulke
        +Clarissa,Snuggs,csnuggs9v@moonfruit.com,csnuggs9v,Weitang,86-(376)106-1168,Account Representative IV,2195207272,Harris Inc
        +Florance,Littlejohns,flittlejohns9w@tumblr.com,flittlejohns9w,Bunigeulis,62-(587)466-3755,Legal Assistant,3318922927,Marquardt-Howe
        +Gail,Skechley,gskechley9x@prweb.com,gskechley9x,Meixi,86-(203)873-6865,Web Developer I,6076144513,Nolan-Dickinson
        +Skippy,Biss,sbiss9y@prweb.com,sbiss9y,Dongshi,86-(723)211-0742,Structural Analysis Engineer,6615870533,"Connelly, Durgan and Block"
        +Haskell,Ring,hring9z@bluehost.com,hring9z,Želiv,420-(641)544-3995,Financial Advisor,4876809534,"Lynch, Sipes and Rodriguez"
        +Germaine,Nugent,gnugenta0@netscape.com,gnugenta0,Żyrardów,48-(730)293-9054,Senior Editor,3174803845,"Schimmel, Zulauf and Koepp"
        +Karel,Lokier,klokiera1@ow.ly,klokiera1,Dolinsk,7-(925)530-5945,Safety Technician II,4154581473,"Hirthe, Lindgren and Aufderhar"
        +Helena,Jeeves,hjeevesa2@sphinn.com,hjeevesa2,Cimanggu,62-(941)630-4312,Product Engineer,7546527988,"Gusikowski, Leannon and Jacobs"
        +Alberik,Dillingstone,adillingstonea3@columbia.edu,adillingstonea3,Zelenoborskiy,7-(836)258-0010,Dental Hygienist,7362248229,Mosciski-Runte
        +Carly,Linnett,clinnetta4@exblog.jp,clinnetta4,Pringgabaya,62-(246)753-9319,Administrative Officer,8092146349,Bashirian-Lebsack
        +Mortimer,Brando,mbrandoa5@upenn.edu,mbrandoa5,Vestmannaeyjar,354-(926)712-7652,Account Executive,3018918487,Kreiger Group
        +Filbert,Ablett,fabletta6@ycombinator.com,fabletta6,Mýki,30-(705)811-5277,Tax Accountant,6539074042,"Ziemann, Welch and Farrell"
        +Faith,Braven,fbravena7@reuters.com,fbravena7,Thessaloníki,30-(722)343-0087,Electrical Engineer,9811784329,Daniel Inc
        +Frannie,Davidov,fdavidova8@themeforest.net,fdavidova8,Palayan City,63-(745)265-1044,Web Designer II,6579399848,Denesik and Sons
        +Lucien,Tabner,ltabnera9@xinhuanet.com,ltabnera9,Mulyosari,62-(239)594-7444,Librarian,1502298732,"Rosenbaum, Reichert and Kunze"
        +Wally,Enever,weneveraa@bloglines.com,weneveraa,Satrejan,62-(645)352-9402,Office Assistant III,3527730311,Grady-Koelpin
        +Nedda,Gorke,ngorkeab@networkadvertising.org,ngorkeab,Stanišić,381-(108)441-3898,Research Associate,3014819530,Turner LLC
        +Bobby,Froggatt,bfroggattac@soup.io,bfroggattac,Platičevo,381-(674)755-5107,Quality Control Specialist,0737880740,"Goodwin, Gislason and Deckow"
        +Stace,Acaster,sacasterad@discovery.com,sacasterad,Macia,258-(104)153-7107,Health Coach IV,6201062777,Jones-Pollich
        +Oswald,Moulder,omoulderae@goo.gl,omoulderae,Khvastovichi,7-(214)819-4396,Social Worker,0394690478,Nikolaus-Erdman
        +Wanda,Glossop,wglossopaf@infoseek.co.jp,wglossopaf,Pinyug,7-(114)659-2688,Internal Auditor,2523327775,"Frami, Leffler and Schulist"
        +Drucy,Le Count,dlecountag@1und1.de,dlecountag,Skalat,380-(388)706-1735,Accountant III,1408462974,"Zieme, Terry and Runolfsdottir"
        +Jaclyn,Dohrmann,jdohrmannah@is.gd,jdohrmannah,Dongshan,86-(100)568-9635,GIS Technical Architect,3924999996,McKenzie-Hermiston
        +Yvonne,Sansun,ysansunai@omniture.com,ysansunai,El Progreso,507-(224)379-6931,Staff Accountant IV,8276625738,Sporer-Trantow
        +Vonny,Skipp,vskippaj@sbwire.com,vskippaj,Paokmotong Utara,62-(835)335-0196,Payment Adjustment Coordinator,5895390900,"Treutel, Brown and Brekke"
        +Karyl,Wadman,kwadmanak@imgur.com,kwadmanak,Yanjiao,86-(360)378-3302,Staff Scientist,1910238406,"Hansen, Pagac and Deckow"
        +Kippie,Bradden,kbraddenal@marriott.com,kbraddenal,Jönköping,46-(543)587-0300,Staff Scientist,9176800180,Kirlin Inc
        +Paddy,Kettlesing,pkettlesingam@cornell.edu,pkettlesingam,Oslo,47-(849)145-5733,Structural Engineer,8705223008,Jaskolski-Harber
        +Kane,Wennington,kwenningtonan@ucsd.edu,kwenningtonan,Lukashin,374-(349)354-4479,Staff Scientist,7435531871,Schneider Inc
        +Sherill,Williamson,swilliamsonao@earthlink.net,swilliamsonao,Mafang,86-(496)852-1140,Accounting Assistant III,1506840779,Dooley-Olson
        +Audre,Inglish,ainglishap@ehow.com,ainglishap,Minian,62-(250)963-0003,Business Systems Development Analyst,4065598095,"Stoltenberg, Wisozk and Weimann"
        +Berri,Fedorski,bfedorskiaq@umich.edu,bfedorskiaq,Norcasia,57-(162)449-5682,Safety Technician IV,0098301586,Maggio LLC
        +Ursulina,Whitehurst,uwhitehurstar@wikipedia.org,uwhitehurstar,Solna,46-(377)784-6117,Operator,0650376811,Bogan Inc
        +Alidia,Torr,atorras@fastcompany.com,atorras,Sandaohezi,86-(949)545-6861,Account Executive,4811145070,Lehner LLC
        +Kaye,Beane,kbeaneat@economist.com,kbeaneat,Nglojo,62-(355)846-4503,Systems Administrator III,9744419083,Fay-Schultz
        +Clywd,Rentz,crentzau@howstuffworks.com,crentzau,Yuguan,86-(368)395-3026,Community Outreach Specialist,8482525794,"Daugherty, Hammes and Grant"
        +Loella,Golledge,lgolledgeav@xing.com,lgolledgeav,Sangba,86-(997)138-0005,Computer Systems Analyst IV,3818896577,Kassulke Group
        +Berty,Shankle,bshankleaw@blog.com,bshankleaw,Bailai,86-(811)447-2940,Web Designer IV,1381483984,"Rutherford, Weissnat and Stoltenberg"
        +Elysha,Wormell,ewormellax@cornell.edu,ewormellax,Heshi,86-(459)905-4935,Engineer II,6903217533,Reynolds and Sons
        +Emelda,Kienl,ekienlay@edublogs.org,ekienlay,Szelków,48-(150)608-0093,Civil Engineer,0403741254,Ryan-Braun
        +Nanete,Shatliffe,nshatliffeaz@wikipedia.org,nshatliffeaz,Wongsorejo,62-(801)201-7190,Social Worker,9561076268,Corkery-Davis
        +Krisha,Luddy,kluddyb0@about.me,kluddyb0,Pulau Pinang,60-(664)235-5600,Research Assistant IV,5908588660,"Beier, Daniel and Johns"
        +Aloin,Bagnal,abagnalb1@webnode.com,abagnalb1,Јегуновце,389-(396)343-8442,Software Engineer IV,1870806077,Konopelski-Graham
        +Elna,Cockburn,ecockburnb2@goodreads.com,ecockburnb2,Trần Văn Thời,84-(508)784-0206,Dental Hygienist,3976709638,Monahan-Greenholt
        +Cointon,Leggan,clegganb3@ox.ac.uk,clegganb3,Biryulëvo Zapadnoye,7-(592)382-0444,Electrical Engineer,2202518185,Dibbert and Sons
        +Danila,Goldsbrough,dgoldsbroughb4@marriott.com,dgoldsbroughb4,Dowsk,375-(360)424-7789,Account Executive,9726332923,Bartoletti Group
        +Gigi,Philimore,gphilimoreb5@typepad.com,gphilimoreb5,Changxingbao,86-(393)226-0359,Physical Therapy Assistant,5418292374,Mayert-Casper
        +Adolf,Vakhlov,avakhlovb6@indiegogo.com,avakhlovb6,Cárdenas,53-(723)559-5803,VP Sales,6257773652,"Hamill, Okuneva and Hettinger"
        +Rozelle,Ivanchenkov,rivanchenkovb7@moonfruit.com,rivanchenkovb7,Paris 12,33-(806)491-2642,Nuclear Power Engineer,8868636387,Mante-Wolf
        +Kai,Orr,korrb8@cisco.com,korrb8,Osby,46-(498)794-8561,Sales Associate,3395375684,Lemke-Bednar
        +Collie,Yakunin,cyakuninb9@edublogs.org,cyakuninb9,Nanpu,86-(352)102-7244,Health Coach I,6101887901,Medhurst-Langosh
        +Fae,Cahill,fcahillba@reuters.com,fcahillba,Krzeszów,48-(622)530-7313,Food Chemist,6503968477,"Friesen, Sanford and Mayer"
        +Cyndie,Aslet,casletbb@scientificamerican.com,casletbb,Saint-Constant,1-(771)528-2913,Cost Accountant,4843499684,"Hamill, Sauer and Torphy"
        +Patrizius,Twyford,ptwyfordbc@weather.com,ptwyfordbc,Lagoa,351-(291)253-5463,Business Systems Development Analyst,0994297475,Mosciski Inc
        +Mattias,Streight,mstreightbd@yahoo.co.jp,mstreightbd,Skutskär,46-(177)125-2012,Actuary,5440187510,"Farrell, Sanford and Corkery"
        +Carlene,Vanni,cvannibe@themeforest.net,cvannibe,Mahates,57-(796)357-4709,Food Chemist,2337222705,Roob Inc
        +Ron,Durrance,rdurrancebf@wp.com,rdurrancebf,Mapalacsiao,63-(369)788-7340,Analyst Programmer,5457066193,Mitchell LLC
        +Carina,Edwardes,cedwardesbg@mapquest.com,cedwardesbg,Valinhos,55-(577)612-0116,Recruiting Manager,5227826919,Mosciski Inc
        +Maddalena,Salerg,msalergbh@umich.edu,msalergbh,Novopodrezkovo,7-(697)647-8581,Health Coach I,1557006229,Brekke Group
        +Philippe,Packington,ppackingtonbi@hp.com,ppackingtonbi,Wenshao,86-(707)622-9285,Accounting Assistant II,6329239517,Pacocha-Blick
        +Izzy,Nias,iniasbj@soundcloud.com,iniasbj,Miami,1-(786)311-2515,Help Desk Operator,1152831127,"Block, Altenwerth and Stanton"
        +Merwin,Parsell,mparsellbk@nba.com,mparsellbk,Gayny,7-(547)203-8806,Staff Scientist,7479993129,"Reinger, Quitzon and Vandervort"
        +Jessi,Dunkerly,jdunkerlybl@umn.edu,jdunkerlybl,Gaizhou,86-(909)634-5462,Recruiter,2986553141,"O'Reilly, Dicki and Hahn"
        +Eldon,Farndon,efarndonbm@aboutads.info,efarndonbm,Wolbrom,48-(909)281-4054,Speech Pathologist,5184371176,"Emmerich, Lehner and Yundt"
        +Oates,Elham,oelhambn@mozilla.com,oelhambn,Grand Bank,1-(194)436-8497,Desktop Support Technician,1596660937,"Wehner, Abbott and O'Connell"
        +Fanechka,Whyler,fwhylerbo@adobe.com,fwhylerbo,Matelândia,55-(892)769-4322,Biostatistician IV,7668303200,"Donnelly, Gerhold and Schaefer"
        +Huntington,Fernant,hfernantbp@ask.com,hfernantbp,Karabas,7-(750)276-8060,Senior Developer,1332953263,Pfeffer-Hills
        +Gregorius,St. Ledger,gstledgerbq@wp.com,gstledgerbq,Vlycháda,30-(743)197-1226,Software Test Engineer III,0656158816,Schaden and Sons
        +Cheri,Sainteau,csainteaubr@blinklist.com,csainteaubr,Hengtanggang,86-(187)273-0898,Data Coordiator,5175657151,"Larkin, Weber and Heathcote"
        +Christophorus,Poone,cpoonebs@amazonaws.com,cpoonebs,Were Īlu,251-(931)591-8988,Analyst Programmer,8910813008,Flatley and Sons
        +Waite,Castelletto,wcastellettobt@adobe.com,wcastellettobt,Cajamarca,57-(693)677-0164,VP Quality Control,1291883037,Rohan-Goodwin
        +Garth,Legion,glegionbu@mozilla.com,glegionbu,Heihe,86-(941)380-5673,Human Resources Manager,2515034527,"Nitzsche, Pfeffer and Braun"
        +Esta,Kerwin,ekerwinbv@networkadvertising.org,ekerwinbv,Mirpur Khas,92-(117)950-2082,Project Manager,8928828589,Glover Inc
        +Chloris,Beare,cbearebw@hhs.gov,cbearebw,Willowmore,27-(985)824-0594,Desktop Support Technician,8563826506,Feil-Reichel
        +Randell,Cancellieri,rcancellieribx@prnewswire.com,rcancellieribx,Bekwai,233-(905)301-0573,Human Resources Assistant I,0730372995,Kutch Inc
        +Kip,Ramsdale,kramsdaleby@arstechnica.com,kramsdaleby,Somerset East,27-(218)205-0925,Senior Quality Engineer,0802215807,Stehr and Sons
        +Codi,Sutherley,csutherleybz@163.com,csutherleybz,Monaghan,353-(394)919-0981,Account Representative I,6776632693,Stroman and Sons
        +Ichabod,Softley,isoftleyc0@networksolutions.com,isoftleyc0,Gorshechnoye,7-(857)425-7927,Junior Executive,0503472247,"Huel, Kunze and Grant"
        +Darnall,Menicomb,dmenicombc1@dyndns.org,dmenicombc1,Pisão,351-(603)152-7936,Nuclear Power Engineer,0704521695,"Jenkins, Bins and Bosco"
        +Hermie,Tripony,htriponyc2@state.tx.us,htriponyc2,Dahe,86-(695)324-3438,Staff Scientist,1453231722,Sauer Group
        +Rouvin,Brahms,rbrahmsc3@flickr.com,rbrahmsc3,Hyesan-dong,850-(373)849-6582,Speech Pathologist,1399653598,"Schumm, Willms and Kovacek"
        +Eva,Ausiello,eausielloc4@ted.com,eausielloc4,Las Flores,52-(522)676-7887,VP Product Management,2984517733,Doyle-Hackett
        +Homerus,Benz,hbenzc5@scribd.com,hbenzc5,Karangboyo,62-(463)880-8699,Geological Engineer,9502247396,Pacocha-Rath
        +Orelia,Cardoo,ocardooc6@theatlantic.com,ocardooc6,Huai Mek,66-(562)635-6374,Administrative Officer,2407522354,Sawayn LLC
        +Andy,Whyke,awhykec7@marketwatch.com,awhykec7,Melaka,60-(619)443-9740,Cost Accountant,7266501369,Stiedemann Group
        +Wendell,Charlot,wcharlotc8@weibo.com,wcharlotc8,Shanmu,86-(399)817-3579,Legal Assistant,1929334834,Hudson and Sons
        +Zaria,Rickert,zrickertc9@phoca.cz,zrickertc9,Sukamulya,62-(489)801-0441,Actuary,6151868455,McClure-Cormier
        +Liane,Bugbird,lbugbirdca@soup.io,lbugbirdca,Jiuchenggong,86-(742)484-7736,Director of Sales,5015471092,Dickinson Group
        +Hailee,Jackalin,hjackalincb@t.co,hjackalincb,Baziqiao,86-(348)628-0372,Engineer I,9824969918,"Schuster, Balistreri and Kiehn"
        +Sarina,Gretton,sgrettoncc@youtu.be,sgrettoncc,Kafr ash Shaykh,20-(570)759-6531,Programmer III,0761625356,Ruecker-Cronin
        +Nedi,Raiman,nraimancd@dailymotion.com,nraimancd,Pohang,82-(100)445-2527,Geologist II,5896756089,Ratke Inc
        +Flossie,O'Keenan,fokeenance@shutterfly.com,fokeenance,Ryjewo,48-(120)425-5167,Software Consultant,4109493390,"Macejkovic, Ziemann and Medhurst"
        +Cosette,Bodiam,cbodiamcf@apple.com,cbodiamcf,Falkenberg,46-(660)179-8368,Administrative Officer,1051595991,"Jast, Johnson and Eichmann"
        +Wylma,Risbridger,wrisbridgercg@infoseek.co.jp,wrisbridgercg,Villa Paula de Sarmiento,54-(727)419-0510,Nurse,7423041831,"Kuphal, Lind and Smith"
        +Anabal,Shuard,ashuardch@hexun.com,ashuardch,Nglojo,62-(150)961-7237,Business Systems Development Analyst,4136441134,"Lemke, Walter and Torp"
        +Bill,Bortoluzzi,bbortoluzzici@drupal.org,bbortoluzzici,São Miguel da Carreira,351-(302)874-8797,Payment Adjustment Coordinator,4539837109,Trantow Group
        +Arlena,Rosenbarg,arosenbargcj@com.com,arosenbargcj,Ingarö,46-(337)343-6677,Teacher,7371988523,McDermott-Pollich
        +Kaye,Olsson,kolssonck@sciencedaily.com,kolssonck,Shawan,86-(420)204-5708,Sales Representative,7882023620,"Willms, Maggio and Ebert"
        +Brady,Esmead,besmeadcl@cbsnews.com,besmeadcl,Dhahi,967-(539)198-8938,Senior Financial Analyst,3305446706,"Senger, Rau and White"
        +Beulah,De Cruz,bdecruzcm@shareasale.com,bdecruzcm,Menghe,86-(695)441-1949,Budget/Accounting Analyst I,1010118013,"Stoltenberg, Gaylord and Kuhn"
        +Hart,Pignon,hpignoncn@so-net.ne.jp,hpignoncn,Xishan,86-(796)134-7259,Senior Sales Associate,3487451824,Eichmann LLC
        +Gaultiero,Yapp,gyappco@gov.uk,gyappco,Silveiros,351-(968)335-1115,Editor,8432845973,Torphy-Pfeffer
        +Leonora,Camier,lcamiercp@i2i.jp,lcamiercp,Niebylec,48-(837)941-0248,Payment Adjustment Coordinator,3362041817,Tremblay-Bogan
        +Elsy,Barhem,ebarhemcq@howstuffworks.com,ebarhemcq,Baimi,86-(478)746-4408,Geologist III,3636465074,"Kling, Rempel and Schuppe"
        +Ludovika,Freemantle,lfreemantlecr@biblegateway.com,lfreemantlecr,Saint Catherine,20-(525)822-1176,Computer Systems Analyst IV,2508567590,Bartell Group
        +Niki,Bartoszewski,nbartoszewskics@geocities.jp,nbartoszewskics,Toyós,504-(285)333-3663,VP Product Management,8170495997,"Labadie, Schuster and Bailey"
        +Jasper,Scardifield,jscardifieldct@wordpress.org,jscardifieldct,Botoh,62-(908)487-6165,Mechanical Systems Engineer,4706641020,"Lindgren, Miller and Reilly"
        +Blondie,Korda,bkordacu@jimdo.com,bkordacu,Sayama,81-(550)261-8768,Safety Technician II,3613863448,"Beier, Hodkiewicz and Labadie"
        +Mari,Wildey,mwildeycv@earthlink.net,mwildeycv,Las Vegas,1-(702)780-0013,Community Outreach Specialist,6081899675,Ritchie Group
        +Rania,Caulier,rcauliercw@google.es,rcauliercw,Hongqiao,86-(135)941-5093,Recruiting Manager,9767170790,Sipes Group
        +Carmita,Balk,cbalkcx@nydailynews.com,cbalkcx,Radenković,381-(489)896-5035,Assistant Media Planner,3192007451,Rau Group
        +Raye,Rodwell,rrodwellcy@redcross.org,rrodwellcy,Ibusuki,81-(371)210-6897,Programmer IV,7817437106,Halvorson-Considine
        +Jeanelle,Gaunt,jgauntcz@chicagotribune.com,jgauntcz,Guajará Mirim,55-(942)383-5866,Environmental Tech,5293445545,"Cummings, Rohan and Olson"
        +Marten,Achromov,machromovd0@google.com.br,machromovd0,Carapicuíba,55-(150)839-0871,Professor,5673414536,Grady and Sons
        +Zebadiah,Ashton,zashtond1@aboutads.info,zashtond1,Liangwangzhuang,86-(533)605-8366,Assistant Media Planner,5660743293,O'Kon Inc
        +Nikolos,Rominov,nrominovd2@livejournal.com,nrominovd2,Wulingyuan,86-(988)701-4303,Administrative Officer,9339583396,McCullough Group
        +Abel,Brockley,abrockleyd3@usgs.gov,abrockleyd3,Cortiços,351-(655)931-9613,Computer Systems Analyst IV,4253152929,Schiller Group
        +Flss,Totaro,ftotarod4@slashdot.org,ftotarod4,Kolaka,62-(103)182-1362,Chief Design Engineer,1468159798,Bruen-Torp
        +Shaine,Tellenbach,stellenbachd5@pen.io,stellenbachd5,Gllogjan,383-(183)169-1139,VP Quality Control,5580264399,"Conroy, Bradtke and Huel"
        +Vanni,Zuanazzi,vzuanazzid6@sitemeter.com,vzuanazzid6,Astypálaia,30-(580)574-2168,Account Representative I,9464258799,Lakin LLC
        +Courtney,Dimitrie,cdimitried7@google.co.uk,cdimitried7,Houmt Souk,216-(733)765-8980,Associate Professor,1685573266,Paucek LLC
        +Cymbre,Footitt,cfootittd8@tiny.cc,cfootittd8,Leuwayang,62-(318)778-1877,VP Quality Control,3946614353,Hermann and Sons
        +Kaye,Jessope,kjessoped9@flavors.me,kjessoped9,Kalety,48-(845)480-1707,Senior Quality Engineer,3355884294,"Cremin, Olson and Sawayn"
        +Cornie,Limmer,climmerda@state.tx.us,climmerda,Guisser,212-(384)879-2239,Automation Specialist III,7826225280,Balistreri-Wiegand
        +Brenden,Verma,bvermadb@disqus.com,bvermadb,Sulengwaseng,62-(138)357-9869,Web Designer I,6172390155,"Waters, Streich and Abbott"
        +Lem,Benedikt,lbenediktdc@wunderground.com,lbenediktdc,Katoro,255-(482)187-5657,Engineer IV,0497224445,"Little, Mohr and Wilderman"
        +Lowell,Sichardt,lsichardtdd@globo.com,lsichardtdd,Camachile,63-(706)673-3182,Biostatistician I,2575941288,"Lemke, Lesch and Leannon"
        +Reine,Delgardillo,rdelgardillode@microsoft.com,rdelgardillode,Neob,62-(936)764-5075,Desktop Support Technician,1513506838,Spencer LLC
        +Thane,Sarchwell,tsarchwelldf@instagram.com,tsarchwelldf,Porto Seguro,55-(660)356-9567,Human Resources Manager,3527153179,Runolfsdottir-Cartwright
        +Danika,Elnor,delnordg@state.tx.us,delnordg,Niimi,81-(547)958-0387,Senior Developer,5050722578,Parisian-Towne
        +Gasparo,Stranio,gstraniodh@diigo.com,gstraniodh,Lezhu,86-(206)787-4960,Financial Analyst,4348687307,Goldner-Schmitt
        +Garnette,Calyton,gcalytondi@vimeo.com,gcalytondi,Karang,62-(950)627-5151,Human Resources Manager,0641236301,Prosacco-Ankunding
        +Justinn,Feakins,jfeakinsdj@mozilla.org,jfeakinsdj,Kalampáka,30-(795)552-9647,Engineer IV,8626479360,Nolan LLC
        +Linoel,Kibard,lkibarddk@bravesites.com,lkibarddk,Langpas,63-(644)213-0258,Database Administrator III,3377644679,Langworth-Veum
        +Gan,Lowde,glowdedl@issuu.com,glowdedl,Henan’an,86-(900)591-4847,Actuary,1207495840,"Pagac, White and Stroman"
        +Fleurette,Wolland,fwollanddm@dagondesign.com,fwollanddm,Vellinge,46-(300)800-9559,Structural Analysis Engineer,0953978931,Kirlin-Kozey
        +Wye,Duplan,wduplandn@qq.com,wduplandn,Ponong,63-(313)355-0869,Project Manager,5336314064,Shanahan-Bradtke
        +Benn,Mayo,bmayodo@oracle.com,bmayodo,Valdivia,56-(963)663-9803,Biostatistician IV,8306385837,Gaylord LLC
        +Benedict,Mannock,bmannockdp@techcrunch.com,bmannockdp,Adorjan,381-(876)163-1457,Account Coordinator,5751702727,"Ernser, Runte and Keebler"
        +Eloise,Cleverly,ecleverlydq@4shared.com,ecleverlydq,Colima,506-(165)753-5527,Technical Writer,3792802872,Muller Inc
        +Francesco,Egalton,fegaltondr@woothemes.com,fegaltondr,Taboão da Serra,55-(809)764-2655,Civil Engineer,5044892408,"Crist, Davis and Hirthe"
        +Jannelle,Ruddy,jruddyds@barnesandnoble.com,jruddyds,Golden,1-(272)196-2918,Assistant Media Planner,1533733090,Tromp-Emard
        +Dill,Raubenheimers,draubenheimersdt@state.tx.us,draubenheimersdt,Koumac,687-(276)528-4767,Engineer IV,0221672184,"Cole, Stamm and Lynch"
        +Norine,Sex,nsexdu@angelfire.com,nsexdu,Saint-Eustache,1-(297)748-3708,Nuclear Power Engineer,8545476949,Tromp LLC
        +Fernandina,Loraine,florainedv@zdnet.com,florainedv,Pojok,62-(678)818-1034,Operator,5968941170,Stark and Sons
        +Lincoln,Headly,lheadlydw@pinterest.com,lheadlydw,Rukem,62-(721)761-5670,Desktop Support Technician,1353588335,Mohr Group
        +Sibylle,Duplan,sduplandx@cloudflare.com,sduplandx,Saronída,30-(898)200-2504,Engineer II,1318020735,Nitzsche Inc
        +Durante,Plews,dplewsdy@engadget.com,dplewsdy,Quintela,351-(400)772-1387,Editor,2706273801,Jerde-Johnson
        +Simmonds,Weadick,sweadickdz@bbb.org,sweadickdz,Clisson,33-(449)808-9903,Statistician II,1395682046,Koss and Sons
        +Jinny,Southcoat,jsouthcoate0@imgur.com,jsouthcoate0,Kontiolahti,358-(307)727-1150,Director of Sales,8612730686,Glover Group
        +Tobias,Jedrys,tjedryse1@nifty.com,tjedryse1,Coalaque,51-(352)815-4498,Assistant Media Planner,3241037983,"Daugherty, Lowe and MacGyver"
        +Lyndsey,Beasant,lbeasante2@usgs.gov,lbeasante2,Quiñota,51-(893)499-0636,Civil Engineer,1638165475,"Bosco, Farrell and Kuvalis"
        +Morganica,Insole,minsolee3@bloglines.com,minsolee3,Alarobia,261-(772)192-7435,Software Consultant,8608912546,"Hodkiewicz, Dare and Treutel"
        +Terza,Sangster,tsangstere4@sourceforge.net,tsangstere4,Jagistay,86-(384)596-5400,Editor,8754711339,"Gleason, Luettgen and Dietrich"
        +Russell,Crewther,rcrewthere5@webs.com,rcrewthere5,Khiwa,998-(651)198-4172,Tax Accountant,0566254271,"Grimes, Koelpin and Koepp"
        +Lizabeth,Edmeads,ledmeadse6@facebook.com,ledmeadse6,Tsinandali,995-(180)383-8027,Budget/Accounting Analyst I,9980383631,Bode LLC
        +Karee,O'Feeny,kofeenye7@microsoft.com,kofeenye7,Berezayka,7-(584)773-4095,Senior Sales Associate,2984805720,"Kirlin, Bosco and Jaskolski"
        +Adelbert,Ahrenius,aahreniuse8@businessweek.com,aahreniuse8,Trollhättan,46-(560)840-1787,Accountant II,6318469885,Grimes-Rippin
        +Imogene,Ahern,iaherne9@biblegateway.com,iaherne9,Binalbagan,63-(324)343-0387,Senior Cost Accountant,5597923358,"Kemmer, Wyman and Borer"
        +Bethanne,Olrenshaw,bolrenshawea@feedburner.com,bolrenshawea,Veiga,351-(737)841-1999,Marketing Manager,6637045683,Stiedemann-Nader
        +Morey,Rabjohns,mrabjohnseb@google.ru,mrabjohnseb,Buang,63-(598)261-6461,Analog Circuit Design manager,4124185693,Champlin LLC
        +Bert,Shiel,bshielec@examiner.com,bshielec,Pignon,509-(674)488-9175,Programmer Analyst II,7670176377,Frami-Senger
        +Justinian,Worters,jwortersed@hp.com,jwortersed,Shanjeev Home,94-(667)505-1821,Pharmacist,0380071401,Schmitt LLC
        +Isabeau,Bumpus,ibumpusee@reverbnation.com,ibumpusee,Åkersberga,46-(384)641-5637,Structural Engineer,3748433670,Casper Inc
        +Saunderson,Fucher,sfucheref@wikia.com,sfucheref,Tianchi,86-(579)480-2053,VP Marketing,1518810926,Grimes-Harber
        +Bernard,Nanni,bnannieg@taobao.com,bnannieg,Smimou,212-(309)174-5946,Nurse Practicioner,2559240513,Mueller-Kuhic
        +Vivie,Deerness,vdeernesseh@bbc.co.uk,vdeernesseh,Puerta de Corral Quemado,54-(623)114-6422,Systems Administrator I,6638453319,Crona LLC
        +Lyn,Portinari,lportinariei@wix.com,lportinariei,Amqui,1-(265)894-9823,Design Engineer,6404381532,Krajcik LLC
        +Netta,Tubble,ntubbleej@wikispaces.com,ntubbleej,Lentisqueira,351-(888)721-3359,Sales Associate,7584772129,"Fay, Smith and Boyle"
        +Kerrill,Coultous,kcoultousek@gizmodo.com,kcoultousek,Ḩarf al Musaytirah,963-(663)978-3503,Statistician III,2943721670,Haley-Eichmann
        +Linzy,Yglesias,lyglesiasel@bizjournals.com,lyglesiasel,Anse Boileau,248-(902)643-6897,Operator,2871357994,"Abernathy, Schuppe and Nienow"
        +Allison,Harden,ahardenem@jiathis.com,ahardenem,Cishangang,86-(457)230-2552,Research Associate,0614061776,Barrows Group
        +Carlos,Freemantle,cfreemantleen@techcrunch.com,cfreemantleen,Ylämaa,358-(714)766-2393,Professor,6268473329,Leuschke LLC
        +Annice,Roubottom,aroubottomeo@google.ca,aroubottomeo,Herceg-Novi,382-(172)374-0117,Help Desk Operator,3869023244,Herman and Sons
        +Madeleine,Joincey,mjoinceyep@businesswire.com,mjoinceyep,Mělník,420-(175)226-2829,Programmer II,3947098820,Osinski Inc
        +Berke,Rojas,brojaseq@webeden.co.uk,brojaseq,Oemollo,62-(656)492-8444,Analyst Programmer,3830440014,"Goyette, Farrell and Gleason"
        +Samuele,Tassaker,stassakerer@github.io,stassakerer,Vyksa,7-(544)516-7710,Media Manager III,5627912308,Howe Inc
        +Edy,Makeswell,emakeswelles@mapquest.com,emakeswelles,København,45-(567)897-5052,VP Sales,1349041246,Schultz and Sons
        +Zebulen,Lukovic,zlukovicet@independent.co.uk,zlukovicet,Garawati,62-(251)559-0462,General Manager,0684692104,Emard Group
        +Robby,Walles,rwalleseu@deliciousdays.com,rwalleseu,Dongfeng,86-(344)516-7422,Account Executive,1069939455,Klein and Sons
        +Priscilla,Rowthorn,prowthornev@yellowpages.com,prowthornev,Chodów,48-(766)379-8879,Developer I,2612438270,Cassin Group
        +Rutger,Heynen,rheynenew@ed.gov,rheynenew,Barbaza,63-(998)385-4724,Geological Engineer,0716980800,Conn Group
        +Silvano,Oloman,solomanex@who.int,solomanex,Wenping,86-(729)929-2019,Executive Secretary,6206962660,"Becker, Waelchi and Rowe"
        +Costanza,Flaune,cflauneey@ameblo.jp,cflauneey,Lianyun,86-(703)407-6420,Project Manager,8356088984,Runolfsdottir-Glover
        +Bronson,Espine,bespineez@ucla.edu,bespineez,Longonjo,244-(866)340-1198,Programmer IV,9275318654,"Langworth, Stracke and Littel"
        +Tessy,Warman,twarmanf0@un.org,twarmanf0,Kuala Terengganu,60-(979)185-5701,Structural Analysis Engineer,7047075690,O'Kon Group
        +Dewain,Gravestone,dgravestonef1@noaa.gov,dgravestonef1,Ludvika,46-(235)721-0297,Analog Circuit Design manager,0691001715,Nolan Inc
        +Rourke,Denty,rdentyf2@naver.com,rdentyf2,Molinos,51-(784)178-5510,Community Outreach Specialist,7734182216,Bartoletti-Durgan
        +Carmela,Say,csayf3@salon.com,csayf3,Zubtsov,7-(534)684-8554,Junior Executive,9517395299,"Rosenbaum, Jenkins and Zboncak"
        +Hurleigh,Strongitharm,hstrongitharmf4@google.com,hstrongitharmf4,Tver,7-(506)278-6475,Analyst Programmer,6615367807,Simonis-Swift
        +Bondon,Lambregts,blambregtsf5@g.co,blambregtsf5,Xingzhen,86-(440)798-6899,Staff Accountant II,4751010697,Okuneva-Kuhn
        +Isiahi,Beard,ibeardf6@wired.com,ibeardf6,Zhavoronki,7-(974)299-4320,Tax Accountant,2230870122,"Wiza, Pfannerstill and Hyatt"
        +Remy,Rzehorz,rrzehorzf7@pcworld.com,rrzehorzf7,Ketanggi,62-(750)848-8321,Research Assistant IV,1606199781,"Hegmann, Yundt and Schoen"
        +Charles,Vivash,cvivashf8@livejournal.com,cvivashf8,Hantai,86-(114)123-5243,VP Sales,5008348752,Langworth and Sons
        +Angel,Coda,acodaf9@webs.com,acodaf9,Hexi,86-(364)879-7511,Programmer III,1157097758,"O'Conner, Bartell and O'Reilly"
        +Althea,Threader,athreaderfa@blogger.com,athreaderfa,Sviblovo,7-(521)978-2163,Financial Analyst,0343346095,"Barton, Kling and Ullrich"
        +Auberta,MacKeever,amackeeverfb@com.com,amackeeverfb,Taldyqorghan,7-(663)142-7914,Administrative Officer,0191723436,Kertzmann LLC
        +Jerrie,Reucastle,jreucastlefc@eepurl.com,jreucastlefc,Ondoy,63-(160)870-2513,Biostatistician IV,2763802451,Koelpin Group
        +Maible,Youll,myoullfd@soup.io,myoullfd,Alivéri,30-(400)482-8650,Computer Systems Analyst IV,2572163950,Abshire Inc
        +Donica,Hamments,dhammentsfe@xrea.com,dhammentsfe,Nida,370-(354)730-7273,Biostatistician II,5210866432,Windler Group
        +Miquela,Worman,mwormanff@shareasale.com,mwormanff,Foso,233-(566)694-7353,Dental Hygienist,3549652224,Reichel-Zieme
        +Uriah,Surcomb,usurcombfg@blogger.com,usurcombfg,La Soledad,52-(603)246-8965,Accounting Assistant III,1599078163,"Sipes, Nader and Keeling"
        +Roddie,Esilmon,resilmonfh@ehow.com,resilmonfh,Palestina,57-(708)985-3162,Electrical Engineer,0363630694,O'Hara LLC
        +Corinna,Geffen,cgeffenfi@usnews.com,cgeffenfi,Jastrowie,48-(332)296-1446,Budget/Accounting Analyst II,5462938233,Dickens and Sons
        +Gonzales,Muckloe,gmuckloefj@cornell.edu,gmuckloefj,Fatumuti,62-(643)699-2477,Geologist II,7192127329,Marquardt Group
        +Sharon,Chidwick,schidwickfk@unc.edu,schidwickfk,Foxton,64-(588)279-0414,Biostatistician IV,3192402563,Reynolds Inc
        +Vern,LeEstut,vleestutfl@abc.net.au,vleestutfl,Las Palmas,52-(921)609-1168,Senior Financial Analyst,5113676810,Marvin and Sons
        +Bob,Hof,bhoffm@theglobeandmail.com,bhoffm,Rama,505-(907)179-2015,Geological Engineer,0120147319,"Willms, Kling and Hand"
        +Nobie,Gerbl,ngerblfn@cbc.ca,ngerblfn,Daugavgrīva,371-(698)955-4899,Desktop Support Technician,9420600106,Bahringer and Sons
        +Antons,Exrol,aexrolfo@china.com.cn,aexrolfo,Shizuishan,86-(784)172-4409,Help Desk Operator,8368132096,Ferry-Conn
        +Wye,Hayward,whaywardfp@phoca.cz,whaywardfp,Espinal,57-(245)501-5469,Accountant IV,2488307750,Hammes-Lubowitz
        +Son,Falconer-Taylor,sfalconertaylorfq@github.io,sfalconertaylorfq,‘Amrān,967-(212)195-4767,Product Engineer,6404706520,McDermott-Ledner
        +Pavlov,Reek,preekfr@typepad.com,preekfr,Thị Trấn Thất Khê,84-(333)510-3759,Desktop Support Technician,9682249406,"Ruecker, Lowe and Maggio"
        +Amabel,Iannazzi,aiannazzifs@shop-pro.jp,aiannazzifs,Karangpari,62-(156)856-7713,Environmental Tech,0594104572,Hodkiewicz Inc
        +Anselm,Pickworth,apickworthft@earthlink.net,apickworthft,Kukës,355-(384)728-4155,Professor,6571348071,Rowe Group
        +Hildegarde,Gleder,hglederfu@vistaprint.com,hglederfu,Pancheng,86-(840)213-5262,Geological Engineer,0195510852,Carroll Inc
        +Benita,Marvell,bmarvellfv@tripadvisor.com,bmarvellfv,Malakwāl,92-(801)819-9067,Account Coordinator,3394329107,Bernier and Sons
        +Willdon,Stanlack,wstanlackfw@ucoz.ru,wstanlackfw,Trảng Bàng,84-(463)410-2718,Project Manager,6933652521,"Labadie, Lehner and Gusikowski"
        +Almira,Bartens,abartensfx@who.int,abartensfx,Lac-Brome,1-(112)440-7909,VP Accounting,1810818982,"Hilll, Hane and Langworth"
        +Berenice,Broschke,bbroschkefy@about.me,bbroschkefy,Na Di,66-(281)869-0575,Senior Cost Accountant,2630118150,Schaden-Schaden
        +Melony,Rosenfelt,mrosenfeltfz@nih.gov,mrosenfeltfz,Huitang,86-(373)267-4793,Food Chemist,1356491731,"Langosh, Altenwerth and Johnson"
        +Matias,Casaccia,mcasacciag0@t.co,mcasacciag0,Astghadzor,374-(558)741-2748,Librarian,6078806653,Gulgowski and Sons
        +Godfrey,Dorran,gdorrang1@gnu.org,gdorrang1,Longde Chengguanzhen,86-(621)856-4764,Programmer III,5779767149,"Bosco, Moen and Bosco"
        +Ynes,Gonin,ygoning2@huffingtonpost.com,ygoning2,Jacksonville,1-(904)987-7870,Human Resources Assistant III,8997890921,Purdy Inc
        +Erasmus,Catterick,ecatterickg3@mozilla.com,ecatterickg3,Shanghu,86-(554)629-1624,Senior Financial Analyst,1930579853,Rohan-Romaguera
        +Alfred,Pickton,apicktong4@mapquest.com,apicktong4,Sŭedinenie,359-(979)995-4685,Professor,0814432573,Hayes-Windler
        +Stacia,Mordy,smordyg5@apple.com,smordyg5,Springfield,1-(217)733-3909,VP Sales,4240850924,Beier-Wisozk
        +Kimberli,Keymer,kkeymerg6@tuttocitta.it,kkeymerg6,Borås,46-(203)476-9733,Paralegal,1853533335,"Fahey, Hudson and Jones"
        +Vivienne,McGeoch,vmcgeochg7@chron.com,vmcgeochg7,Campraksanta,62-(302)790-3621,VP Product Management,2746698242,"Kassulke, Wilderman and Kassulke"
        +Ezmeralda,Gutteridge,egutteridgeg8@moonfruit.com,egutteridgeg8,Motema,232-(245)252-3308,Chief Design Engineer,4899196601,Graham-Emard
        +Beitris,Andino,bandinog9@disqus.com,bandinog9,Brailiv,380-(777)219-2795,Senior Cost Accountant,9458256909,Mosciski Group
        +Maury,Bonick,mbonickga@comcast.net,mbonickga,Ubrub,62-(119)279-1772,Recruiting Manager,5647159451,"D'Amore, Nitzsche and Leffler"
        +Verene,Leatherland,vleatherlandgb@miitbeian.gov.cn,vleatherlandgb,Jaroměřice nad Rokytnou,420-(156)711-3140,Internal Auditor,3971930999,"Pollich, Turner and Bergstrom"
        +Hewett,Dent,hdentgc@tripod.com,hdentgc,Gaoyi,86-(921)190-0405,Administrative Assistant III,4114980911,Marks and Sons
        +Rozina,Seeds,rseedsgd@ox.ac.uk,rseedsgd,Nàng Mau,84-(207)987-9555,Administrative Officer,5612798245,"Nicolas, Schamberger and Stoltenberg"
        +Emmalee,Billany,ebillanyge@elegantthemes.com,ebillanyge,Santo André,351-(578)791-9024,Account Executive,3066103560,Howe-Kuphal
        +Jeniffer,Salan,jsalangf@devhub.com,jsalangf,Sete Lagoas,55-(474)631-1789,Marketing Manager,1699081859,Schaden-Fadel
        +Welbie,Palmby,wpalmbygg@nymag.com,wpalmbygg,Payaman,62-(397)816-2725,Programmer Analyst II,9993174750,Price Group
        +Ossie,Machans,omachansgh@bravesites.com,omachansgh,Libas,63-(840)761-5683,Nuclear Power Engineer,1326272306,Sanford-Wolf
        +Cristobal,Binne,cbinnegi@jiathis.com,cbinnegi,Arcoverde,55-(521)304-2880,Desktop Support Technician,7531238543,McLaughlin-Stracke
        +Annissa,McLice,amclicegj@tinypic.com,amclicegj,Selce,389-(892)609-3070,Recruiting Manager,4860531817,"Swift, Koelpin and Mohr"
        +Kalle,Betty,kbettygk@earthlink.net,kbettygk,Yasenskaya,7-(832)933-4153,Executive Secretary,7077128954,Hartmann-Rempel
        +Sinclair,Cattrall,scattrallgl@aol.com,scattrallgl,Ipuh,62-(543)627-2201,Quality Engineer,8290193610,Dicki-Prohaska
        +Laure,Meatcher,lmeatchergm@bizjournals.com,lmeatchergm,Tarsouat,212-(795)252-4345,Chief Design Engineer,5305354692,"Farrell, Morissette and Armstrong"
        +Jacquelyn,Kidman,jkidmangn@youku.com,jkidmangn,Bwizibwera,256-(558)763-0287,Design Engineer,3633113959,Mann-Goyette
        +Marcos,Boulger,mboulgergo@nbcnews.com,mboulgergo,Kalinkavichy,375-(595)296-8756,Environmental Specialist,2167764766,"Parisian, Abernathy and Jakubowski"
        +Conchita,Brunnstein,cbrunnsteingp@nsw.gov.au,cbrunnsteingp,Iturama,55-(102)637-6336,Help Desk Operator,1423412257,"Kovacek, Pfeffer and Carter"
        +Moyra,Metcalfe,mmetcalfegq@facebook.com,mmetcalfegq,Huangmao,86-(656)348-7372,Professor,7600769646,"Sipes, Pollich and Maggio"
        +Nikolia,Eastope,neastopegr@1688.com,neastopegr,Viçosa,55-(184)114-8152,Nuclear Power Engineer,4776960494,"Lemke, Mayer and Fisher"
        +Gabey,Charteris,gcharterisgs@hugedomains.com,gcharterisgs,Sidi Yahya Ou Saad,212-(198)542-6078,VP Accounting,3560342406,Renner and Sons
        +Kirbie,Claxton,kclaxtongt@php.net,kclaxtongt,Gualán,502-(814)325-5193,Nurse,2826332090,Kiehn Group
        +Hinze,Snoddin,hsnoddingu@google.pl,hsnoddingu,Kastélli,30-(288)788-8171,Web Developer I,6651023586,"Padberg, Runolfsson and Torphy"
        +Costa,Rix,crixgv@taobao.com,crixgv,Pueblo Nuevo,504-(962)252-2773,Assistant Professor,8691814632,Cartwright Group
        +Abdul,Doodney,adoodneygw@icq.com,adoodneygw,San Esteban,63-(872)929-4757,Senior Financial Analyst,5370482837,"Strosin, Runolfsson and Steuber"
        +Martyn,Stanyland,mstanylandgx@moonfruit.com,mstanylandgx,Folques,351-(942)195-7146,Geological Engineer,9248462006,"Rice, Connelly and Murray"
        +Erda,Shewring,eshewringgy@php.net,eshewringgy,Gostivar,389-(117)756-5444,Paralegal,1798073269,Schamberger-Luettgen
        +Kerry,Yeaman,kyeamangz@elpais.com,kyeamangz,Gongju,82-(786)382-2951,Marketing Assistant,4905126673,"Schulist, Fadel and Emard"
        +Shirley,Wholesworth,swholesworthh0@opensource.org,swholesworthh0,Abuko,220-(724)675-0904,Software Consultant,0321418409,Heller and Sons
        +Ennis,Abrahmovici,eabrahmovicih1@wiley.com,eabrahmovicih1,Bambas,51-(472)197-9673,Developer IV,8962080176,Considine-Gibson
        +Sharla,Sutherley,ssutherleyh2@behance.net,ssutherleyh2,Tabuadelo,351-(811)635-6156,VP Quality Control,6808874077,Runolfsdottir LLC
        +Gunther,Brandsen,gbrandsenh3@i2i.jp,gbrandsenh3,Buayan,63-(375)213-4457,Paralegal,5717407505,"Hane, Gutmann and Franecki"
        +Kaylee,Enocksson,kenockssonh4@t-online.de,kenockssonh4,Qingshi,86-(192)784-2084,Environmental Specialist,2870295510,Hayes and Sons
        +Peyton,Dearnaly,pdearnalyh5@storify.com,pdearnalyh5,Mulyosari,62-(688)290-2297,Speech Pathologist,4872281845,"Champlin, Miller and Mueller"
        +Angelle,Kindread,akindreadh6@sciencedaily.com,akindreadh6,Gīdolē,251-(603)654-7849,Assistant Professor,0831351950,Gorczany-Hayes
        +Leonerd,Lardez,llardezh7@deliciousdays.com,llardezh7,Herāt,93-(513)328-2863,Tax Accountant,7061036621,"Renner, Schamberger and Ryan"
        +Louise,Veltman,lveltmanh8@elegantthemes.com,lveltmanh8,Kluki,48-(852)795-6465,General Manager,2227283882,Nolan-Labadie
        +Daryle,Peacey,dpeaceyh9@answers.com,dpeaceyh9,Lenart v Slov. Goricah,386-(848)241-2826,Nuclear Power Engineer,6994450376,Weissnat Inc
        +Petey,Atyeo,patyeoha@yahoo.com,patyeoha,Osa,7-(360)966-8784,Systems Administrator I,1033908479,Bartoletti Group
        +Ely,Jessope,ejessopehb@issuu.com,ejessopehb,Sidoaji,62-(919)917-3443,Internal Auditor,7107889222,"Padberg, Kshlerin and Skiles"
        +Susie,Wyleman,swylemanhc@feedburner.com,swylemanhc,Zaječí,420-(235)631-9169,Technical Writer,1491248297,Wisoky Inc
        +Shari,Byne,sbynehd@hao123.com,sbynehd,Portela,351-(260)826-4437,Quality Control Specialist,7458232994,"Hyatt, Ward and Collier"
        +Rosanna,Chasles,rchasleshe@elegantthemes.com,rchasleshe,Bombon,63-(602)353-2130,Health Coach III,1370246951,Dibbert-Wuckert
        +Trista,Twydell,ttwydellhf@sfgate.com,ttwydellhf,Magdug,63-(267)213-3595,Technical Writer,3196286061,Goodwin-Walsh
        +Alisun,Harvatt,aharvatthg@miibeian.gov.cn,aharvatthg,Hongcao,86-(527)384-1497,Editor,1503083594,Herzog-Koch
        +Corenda,Keijser,ckeijserhh@163.com,ckeijserhh,Laguna,55-(197)776-6176,Professor,9644133080,Crooks-Bergstrom
        +Osbourn,Kilmurry,okilmurryhi@icq.com,okilmurryhi,Horní Suchá,420-(955)543-1671,Analog Circuit Design manager,0179532030,Leffler-Towne
        +Laurel,Standell,lstandellhj@wired.com,lstandellhj,Lysyanka,380-(164)654-2407,Research Nurse,0063563037,"Lehner, Carroll and Miller"
        +Patrizius,Hayworth,phayworthhk@usgs.gov,phayworthhk,Khao Yoi,66-(417)147-7061,Research Associate,8831310038,"Lynch, Bergnaum and Breitenberg"
        +Mellie,Begent,mbegenthl@time.com,mbegenthl,Longtan,86-(227)445-3953,Senior Developer,4637997372,Bernhard and Sons
        +Genny,Belderfield,gbelderfieldhm@imgur.com,gbelderfieldhm,Kotaagung,62-(726)439-6434,Geological Engineer,1472967216,Lueilwitz and Sons
        +Kurt,Laminman,klaminmanhn@blogspot.com,klaminmanhn,Vellinge,46-(774)244-0032,Physical Therapy Assistant,8906345453,Mertz and Sons
        +Sherye,Hoff,shoffho@dyndns.org,shoffho,Jiang’an,86-(860)511-6274,Technical Writer,7175131356,"Stroman, Hermann and Boyle"
        +Lauren,Burroughes,lburrougheshp@tinyurl.com,lburrougheshp,Molchanovo,7-(213)371-4675,Senior Editor,4118331314,Lockman LLC
        +Arlin,Tatteshall,atatteshallhq@imdb.com,atatteshallhq,Nashville,1-(615)299-5360,Senior Quality Engineer,5243521639,"Stracke, Fadel and Emard"
        +Simon,McGruar,smcgruarhr@soup.io,smcgruarhr,Koroyo,62-(952)895-9075,Analyst Programmer,4293044027,Pagac and Sons
        +Butch,Spieght,bspieghths@51.la,bspieghths,Alupay,63-(195)738-7403,Senior Cost Accountant,3544033011,"Jones, Hudson and Strosin"
        +Ernestus,Wayte,ewayteht@pagesperso-orange.fr,ewayteht,Tmourghout,212-(185)849-2999,Community Outreach Specialist,4620300438,"Macejkovic, Luettgen and Hilll"
        +Melania,Danis,mdanishu@shinystat.com,mdanishu,Tubigan,63-(155)678-5743,Cost Accountant,0700955313,Smitham-Walter
        +Fanechka,Snookes,fsnookeshv@biglobe.ne.jp,fsnookeshv,Periyiáli,30-(948)845-5272,Engineer I,8597224908,"Zieme, Mante and Stokes"
        +Tasha,Perche,tperchehw@zimbio.com,tperchehw,"Coruña, A",34-(281)688-2390,Senior Developer,2704074135,"Volkman, Conn and Orn"
        +Devi,Jadczak,djadczakhx@statcounter.com,djadczakhx,Carrigtwohill,353-(169)296-6030,Data Coordiator,8972860239,Ferry Group
        +Giraldo,Klouz,gklouzhy@irs.gov,gklouzhy,Garešnica,385-(653)814-6119,Computer Systems Analyst IV,6329487731,Leannon-Becker
        +Kania,Camacke,kcamackehz@weebly.com,kcamackehz,Dingbao,86-(241)334-0377,Structural Engineer,2689561948,Witting-Vandervort
        +Arv,Neads,aneadsi0@so-net.ne.jp,aneadsi0,Ueno,81-(627)675-4358,Chemical Engineer,8213531027,Nitzsche Inc
        +Buck,Dumbar,bdumbari1@techcrunch.com,bdumbari1,Tawun,62-(229)591-2099,Internal Auditor,0884547655,Mraz and Sons
        +Britte,O'Downe,bodownei2@amazon.com,bodownei2,Hājīganj,880-(992)543-4663,Staff Accountant I,0305047736,Hickle-Hand
        +Vinson,Guislin,vguislini3@cbc.ca,vguislini3,Cernik,385-(362)625-9868,Software Consultant,2429844117,Bosco LLC
        +Clem,Foulcher,cfoulcheri4@who.int,cfoulcheri4,Kuala Lumpur,60-(583)708-9044,Design Engineer,5142570715,"Marvin, Hirthe and Buckridge"
        +Marijn,Doe,mdoei5@cmu.edu,mdoei5,Stetseva,380-(786)296-7914,Business Systems Development Analyst,2327586224,Borer Group
        +Franky,Harmar,fharmari6@eventbrite.com,fharmari6,Imperatriz,55-(402)985-2787,Research Nurse,2751212336,Hessel-Borer
        +Melanie,Lanston,mlanstoni7@lycos.com,mlanstoni7,Kebloran,62-(547)549-5683,Environmental Tech,6385884392,Weissnat-Torphy
        +Myrta,Clyburn,mclyburni8@networksolutions.com,mclyburni8,Rukunlima Bawah,62-(779)426-2396,Staff Scientist,5509025476,"McLaughlin, Osinski and Collier"
        +Morley,Daunter,mdaunteri9@wordpress.com,mdaunteri9,Luebo,242-(881)386-7556,Community Outreach Specialist,5450221975,Erdman-Lang
        +Sergei,McLachlan,smclachlania@mit.edu,smclachlania,Lipka,48-(694)410-6816,Dental Hygienist,4778154002,Stracke Group
        +Cris,Madner,cmadnerib@t.co,cmadnerib,Cibitungmasjid,62-(256)723-0358,Account Representative IV,0864545916,Altenwerth Group
        +Kare,Kusick,kkusickic@booking.com,kkusickic,Shaogongzhuang,86-(248)651-0611,Account Coordinator,9219229250,Koelpin Group
        +Pepi,Gibbie,pgibbieid@tripod.com,pgibbieid,Simeykyne,380-(307)793-5872,Operator,7579392461,"Kuvalis, Fadel and Grady"
        +Edgar,Howieson,ehowiesonie@princeton.edu,ehowiesonie,San Rafael,52-(867)635-2442,Mechanical Systems Engineer,4239028027,Kiehn and Sons
        +Athena,Rackstraw,arackstrawif@sina.com.cn,arackstrawif,Baoquan,86-(211)673-0672,Engineer IV,9897657584,Vandervort Inc
        +Caryn,McLaughlin,cmclaughlinig@example.com,cmclaughlinig,Menara,62-(517)611-9675,Media Manager II,5101719706,Baumbach and Sons
        +Erminie,MacVaugh,emacvaughih@about.me,emacvaughih,Wuying,86-(982)324-4880,Sales Representative,7268375182,Jaskolski-Hodkiewicz
        +Christian,O'Corhane,cocorhaneii@uiuc.edu,cocorhaneii,Lianghe,86-(280)250-8522,Professor,4233331798,Doyle-Rogahn
        +Adeline,McPeice,amcpeiceij@vinaora.com,amcpeiceij,Kilifarevo,359-(467)886-3465,Assistant Professor,9912656946,Abernathy-Ritchie
        +Gibby,Cable,gcableik@nydailynews.com,gcableik,Belsh,355-(430)161-7493,Compensation Analyst,4006105606,Brown and Sons
        +Jaime,Kilpin,jkilpinil@ihg.com,jkilpinil,Agbor,234-(550)573-5938,Quality Control Specialist,9442626183,"Gutmann, Gutmann and Hahn"
        +Melinda,Murkus,mmurkusim@telegraph.co.uk,mmurkusim,Pensacola,1-(850)183-4895,Media Manager II,1475423861,"Gutkowski, Bernhard and Hoppe"
        +Aharon,Gierhard,agierhardin@jugem.jp,agierhardin,Donnybrook,353-(865)934-3131,Compensation Analyst,3658785446,"Boyle, Rogahn and Orn"
        +Dulcia,Gilham,dgilhamio@slate.com,dgilhamio,Butere,254-(251)327-8937,Senior Editor,4146349249,"Sawayn, Paucek and Schroeder"
        +Lyman,Juniper,ljuniperip@ft.com,ljuniperip,Hässleholm,46-(383)546-4101,Automation Specialist III,0767169050,Yost Inc
        +Darbie,Fintoph,dfintophiq@lulu.com,dfintophiq,Hepu,86-(187)731-4385,Developer III,4370176271,"Schmeler, Cassin and Schoen"
        +Rufus,Ollerhead,rollerheadir@berkeley.edu,rollerheadir,Ban Mai,66-(642)265-2874,Community Outreach Specialist,3832984623,"Dietrich, Rice and Reichel"
        +Norby,Matthensen,nmatthensenis@google.com.au,nmatthensenis,Tranca,63-(890)438-0411,General Manager,5299514352,Morar Inc
        +Burch,Boys,bboysit@time.com,bboysit,Guomaying,86-(713)916-0654,Assistant Professor,3655303270,Zboncak-Padberg
        +Helge,Bexley,hbexleyiu@dedecms.com,hbexleyiu,Beiwenquan,86-(409)408-7860,Administrative Officer,8185761264,"Bergstrom, Wisozk and Runolfsson"
        +Michelle,Sommerlin,msommerliniv@cdbaby.com,msommerliniv,Jīsh,972-(622)160-0841,Structural Engineer,7599030719,Durgan-Rodriguez
        +Isabelita,Wolstenholme,iwolstenholmeiw@stumbleupon.com,iwolstenholmeiw,Azinhal,351-(223)866-1661,Director of Sales,7664763312,"Tromp, Dibbert and Zieme"
        +Krispin,O'Fergus,kofergusix@wikispaces.com,kofergusix,Banturkrajan,62-(483)542-1518,Physical Therapy Assistant,8741838637,"Strosin, Turner and Quigley"
        +Meredeth,Budd,mbuddiy@biblegateway.com,mbuddiy,Svetlogorsk,7-(415)890-6602,Project Manager,9331158890,"Rippin, Bartoletti and Hermann"
        +Babbette,Dunsleve,bdunsleveiz@thetimes.co.uk,bdunsleveiz,Maddela,63-(210)680-5698,Chemical Engineer,0144827441,Wilderman Inc
        +Bar,Reiners,breinersj0@sun.com,breinersj0,Caldas Novas,55-(971)994-8220,Quality Control Specialist,3672681563,McClure-Moen
        +Dalt,McKellar,dmckellarj1@163.com,dmckellarj1,Thị Trấn Hà Trung,84-(749)471-2636,Senior Quality Engineer,4697508440,Kautzer and Sons
        +Ronalda,Gentric,rgentricj2@umich.edu,rgentricj2,Bahe,86-(924)710-4685,Office Assistant II,6446558430,Pouros and Sons
        +Gill,Matthessen,gmatthessenj3@shop-pro.jp,gmatthessenj3,Nangka,63-(915)902-5478,Web Developer I,3664671848,Blick-Terry
        +Hailey,Danet,hdanetj4@bbb.org,hdanetj4,Xuebu,86-(655)642-0475,Dental Hygienist,7854730350,Moore Group
        +Donalt,Lynnett,dlynnettj5@ucla.edu,dlynnettj5,Pingshan,86-(712)618-8254,Community Outreach Specialist,3037055472,"Gleichner, Heathcote and McKenzie"
        +Oralla,Clausius,oclausiusj6@state.gov,oclausiusj6,Villa del Rosario,57-(671)722-4375,Director of Sales,5376445232,Kemmer Inc
        +Nance,Deware,ndewarej7@twitter.com,ndewarej7,Ibusuki,81-(617)941-4064,Software Engineer III,2028791357,"Yundt, Corwin and Quitzon"
        +Aloysia,Friman,afrimanj8@edublogs.org,afrimanj8,Gambalidio,63-(313)382-0374,General Manager,8838662975,"Rau, Wolff and Kovacek"
        +Elga,Starkey,estarkeyj9@salon.com,estarkeyj9,Gävle,46-(645)607-0229,Marketing Manager,7385675786,Hirthe-Thiel
        +Jeannine,Annett,jannettja@so-net.ne.jp,jannettja,Burayevo,7-(461)292-8366,Account Coordinator,7989157179,Rippin Group
        +Dulci,Sparkwell,dsparkwelljb@lulu.com,dsparkwelljb,Abóboda,351-(425)960-3179,Sales Associate,8042244673,"Will, Williamson and Bogisich"
        +Gisela,Skoughman,gskoughmanjc@hao123.com,gskoughmanjc,Huashixia,86-(933)889-2829,Actuary,3828915523,Langosh LLC
        +Cosme,Pryer,cpryerjd@amazon.com,cpryerjd,Belle-Anse,509-(582)842-9287,Tax Accountant,6487901008,Upton and Sons
        +Thurstan,Pringle,tpringleje@indiegogo.com,tpringleje,Dongchen,86-(943)729-3038,Account Coordinator,5562817837,"Satterfield, Mraz and Reichel"
        +Ebeneser,Longworthy,elongworthyjf@furl.net,elongworthyjf,Patquía,54-(789)253-7217,Registered Nurse,1170122795,Schulist-Braun
        +Johnette,Wildes,jwildesjg@answers.com,jwildesjg,Frederiksberg,45-(869)821-2650,Automation Specialist I,3643331975,"Effertz, Parisian and Bergnaum"
        +Allan,Raecroft,araecroftjh@hud.gov,araecroftjh,Sapele,234-(501)388-9974,Senior Developer,7938194387,"Dicki, White and Harber"
        +Appolonia,Aizikov,aaizikovji@marriott.com,aaizikovji,Toukh,20-(857)889-1761,Technical Writer,4754105559,Green LLC
        +Yevette,Songist,ysongistjj@google.it,ysongistjj,Dallas,1-(214)546-6784,Staff Accountant IV,0401661873,Erdman Group
        +Tandy,Abeau,tabeaujk@aboutads.info,tabeaujk,Denver,1-(720)737-3543,Librarian,8505630270,Bashirian-Koepp
        +Marsh,Pencost,mpencostjl@constantcontact.com,mpencostjl,Buenaventura,57-(263)213-3776,Analyst Programmer,0310343887,Hoeger LLC
        +Dan,Reignard,dreignardjm@squidoo.com,dreignardjm,Tanahedang,62-(883)790-2315,Financial Analyst,3648884352,"Parisian, Barrows and Osinski"
        +Nerta,Ruffler,nrufflerjn@wikispaces.com,nrufflerjn,Jincheng,886-(342)705-8378,Internal Auditor,8567561698,"Wintheiser, VonRueden and Lowe"
        +Zed,Bolsover,zbolsoverjo@omniture.com,zbolsoverjo,Matão,55-(339)205-0401,Recruiting Manager,4399340495,Crist-Will
        +Gonzalo,Paddington,gpaddingtonjp@phpbb.com,gpaddingtonjp,Montelíbano,57-(405)589-5804,Product Engineer,8554752384,"Lubowitz, Sanford and Lehner"
        +Lucas,Elington,lelingtonjq@utexas.edu,lelingtonjq,Anding,86-(960)550-4751,Web Designer III,2740694938,Davis Group
        +Leoine,Lovett,llovettjr@multiply.com,llovettjr,Pittsburgh,1-(412)586-0854,Electrical Engineer,8541351939,Hoppe-Romaguera
        +Kara,McGeagh,kmcgeaghjs@cyberchimps.com,kmcgeaghjs,Kubang,62-(768)313-0005,Software Engineer IV,0452302706,Huel-Zemlak
        +Jabez,Saylor,jsaylorjt@blogger.com,jsaylorjt,Luhans’ke,380-(559)819-5482,Food Chemist,7450835533,"Bergstrom, Stoltenberg and Satterfield"
        +Debor,Vautre,dvautreju@lycos.com,dvautreju,Zhuangbu,86-(936)413-2474,Teacher,3855224137,"Emmerich, Muller and Yundt"
        +Odille,Simonou,osimonoujv@blogtalkradio.com,osimonoujv,Łęki Szlacheckie,48-(989)791-3951,Senior Cost Accountant,0849963257,"Doyle, Abbott and Lind"
        +Abraham,Chalfont,achalfontjw@stumbleupon.com,achalfontjw,Bang Kaeo,66-(342)372-0269,Pharmacist,7010972532,Powlowski Group
        +Willy,Ives,wivesjx@squarespace.com,wivesjx,Cimenga,62-(444)941-8150,Analyst Programmer,1782184376,"Spencer, Oberbrunner and Daniel"
        +Reinald,Worley,rworleyjy@cnn.com,rworleyjy,Sumberpandan,62-(148)705-1796,Junior Executive,2076403906,Feeney-Cruickshank
        +Leone,Borris,lborrisjz@desdev.cn,lborrisjz,Tisco,51-(892)888-9517,Technical Writer,3611286087,Schumm-Christiansen
        +Jethro,Ede,jedek0@cbc.ca,jedek0,Auch,33-(947)670-3513,Senior Developer,5503574176,Senger Group
        +Netti,Hallford,nhallfordk1@bloomberg.com,nhallfordk1,Falāvarjān,98-(501)345-1506,Engineer IV,8529835794,"Bruen, Funk and Thompson"
        +Tiffi,Potapczuk,tpotapczukk2@xinhuanet.com,tpotapczukk2,Castanheira de Pêra,351-(462)484-6335,Tax Accountant,8392227476,Mertz-Runolfsdottir
        +Garald,Doddrell,gdoddrellk3@comcast.net,gdoddrellk3,Ketawang,62-(195)332-5729,Senior Financial Analyst,3328544089,Mohr-Jast
        +Haze,MacGillacolm,hmacgillacolmk4@123-reg.co.uk,hmacgillacolmk4,Langgen,62-(754)132-9274,Administrative Assistant IV,9044438050,"Brekke, Strosin and Berge"
        +Emili,Coon,ecoonk5@youtube.com,ecoonk5,Nzérékoré,224-(495)776-5371,Information Systems Manager,1695217985,O'Conner Inc
        +Padriac,Alvy,palvyk6@ted.com,palvyk6,Biryulëvo Zapadnoye,7-(421)373-0762,Graphic Designer,3669986006,"Schiller, Willms and Feeney"
        +Hamnet,Layman,hlaymank7@desdev.cn,hlaymank7,Ifon,234-(343)694-2565,Programmer Analyst II,6185480751,Hahn-Weber
        +Redd,Calvie,rcalviek8@google.cn,rcalviek8,Ambar,51-(774)884-7397,Senior Sales Associate,0185044085,Bashirian Inc
        +Kerrie,Kenrick,kkenrickk9@samsung.com,kkenrickk9,Al Manāqil,249-(655)472-4763,Software Consultant,9046610284,Wuckert-Farrell
        +Nara,Innwood,ninnwoodka@sbwire.com,ninnwoodka,Chadi,86-(547)693-2410,Budget/Accounting Analyst III,3718838753,"Kertzmann, Funk and Tremblay"
        +Bernice,Deftie,bdeftiekb@rediff.com,bdeftiekb,Charleston,1-(304)936-1410,Senior Developer,9632166434,Ward-Senger
        +Cletus,Minor,cminorkc@mapy.cz,cminorkc,Suraż,48-(241)331-0004,Junior Executive,4560795215,Wilderman Inc
        +Clerkclaude,Knighton,cknightonkd@bigcartel.com,cknightonkd,Haoyi,86-(660)290-9882,Account Executive,2632094100,Barton-Bechtelar
        +Burtie,Bowen,bbowenke@booking.com,bbowenke,Avallon,33-(509)681-5577,Structural Engineer,0588974048,"Hudson, Kautzer and Senger"
        +Cris,Cody,ccodykf@miibeian.gov.cn,ccodykf,Saskatoon,1-(865)113-1166,Analyst Programmer,2698386916,MacGyver-Kessler
        +Wainwright,Aylen,waylenkg@microsoft.com,waylenkg,San Martín de los Andes,54-(334)143-7746,Electrical Engineer,9984965074,Nicolas-Kassulke
        +Clare,Calbreath,ccalbreathkh@independent.co.uk,ccalbreathkh,Pará de Minas,55-(147)835-8826,Research Nurse,6199708253,"Runte, Stanton and Nitzsche"
        +Fenelia,Brewood,fbrewoodki@uiuc.edu,fbrewoodki,Agra,351-(684)979-6665,Data Coordiator,0051836793,"Schmidt, O'Connell and Treutel"
        +Hans,Chiese,hchiesekj@reference.com,hchiesekj,Kamieniec Wrocławski,48-(988)578-1699,Data Coordiator,4667259698,Gibson-Barrows
        +Tabina,Janauschek,tjanauschekkk@berkeley.edu,tjanauschekkk,Río Grande,1-(470)119-5478,Human Resources Assistant II,6083625874,Keebler Group
        +Bridgette,Nisuis,bnisuiskl@theatlantic.com,bnisuiskl,Baie-Saint-Paul,1-(702)724-5290,Geological Engineer,9705430446,Kihn Group
        +Syd,Leahair,sleahairkm@wiley.com,sleahairkm,Guarabira,55-(457)962-6675,Community Outreach Specialist,4844140248,Bernier and Sons
        +Gannie,Vennard,gvennardkn@macromedia.com,gvennardkn,Kayapa,63-(909)747-4808,Web Designer II,3698363402,"Schimmel, Friesen and Witting"
        +Avictor,Ligertwood,aligertwoodko@bigcartel.com,aligertwoodko,Ustrzyki Dolne,48-(416)290-1849,Nurse Practicioner,4174955700,Ernser-Kihn
        +Heidi,Castelijn,hcastelijnkp@apache.org,hcastelijnkp,Ilihan,63-(500)806-5161,Administrative Officer,1259802647,"Osinski, Sanford and Ritchie"
        +Ida,Barday,ibardaykq@spotify.com,ibardaykq,Tourcoing,33-(795)533-7343,Clinical Specialist,5206989193,"Jerde, Douglas and Rodriguez"
        +Melodee,Valek,mvalekkr@samsung.com,mvalekkr,Shichuan,86-(456)232-9420,Financial Analyst,4251707303,Lakin-Dooley
        +Mellie,Blois,mbloisks@vinaora.com,mbloisks,Cagliari,39-(810)963-1749,Recruiting Manager,3769720873,"Strosin, Wuckert and Mann"
        +Marabel,Chester,mchesterkt@delicious.com,mchesterkt,Si Bun Rueang,66-(161)732-1476,Geologist III,6339789307,Williamson-Witting
        +Gertrud,Keats,gkeatsku@tripadvisor.com,gkeatsku,Lam Plai Mat,66-(582)827-0005,Recruiter,0297472623,Farrell and Sons
        +Orsola,Adriaens,oadriaenskv@hibu.com,oadriaenskv,Shaguotun,86-(820)144-0827,Paralegal,5854900106,"Ledner, Murazik and McGlynn"
        +Kendricks,Livesley,klivesleykw@yelp.com,klivesleykw,Palilula,381-(321)472-2578,Junior Executive,7051295772,Robel and Sons
        +Randall,Denkel,rdenkelkx@about.me,rdenkelkx,Spånga,46-(892)234-6007,Recruiter,8622374491,"McDermott, Cartwright and Beatty"
        +Edythe,Boundey,eboundeyky@simplemachines.org,eboundeyky,Al Qaţīf,966-(760)484-2393,Editor,8633506122,Medhurst-Miller
        +Dillon,Piesing,dpiesingkz@bluehost.com,dpiesingkz,Qiucun,86-(543)608-4097,Account Coordinator,7448756443,"Kunze, Medhurst and Grant"
        +Constancia,Eagland,ceaglandl0@photobucket.com,ceaglandl0,Staryy Dobrotvir,380-(868)809-9720,Desktop Support Technician,6850975951,Zulauf Group
        +Tressa,Bourne,tbournel1@odnoklassniki.ru,tbournel1,Aulnay-sous-Bois,33-(523)199-1041,Programmer IV,7844943165,Hamill Group
        +Iolande,Tunnicliffe,itunnicliffel2@artisteer.com,itunnicliffel2,Síkinos,30-(238)211-8025,Associate Professor,4285351382,"Mills, Romaguera and Anderson"
        +Nalani,Bignall,nbignalll3@ftc.gov,nbignalll3,Itapipoca,55-(365)774-4231,GIS Technical Architect,7259801018,Dicki-Schroeder
        +Horatio,Vanner,hvannerl4@apple.com,hvannerl4,Laohugang,86-(312)980-2632,Marketing Assistant,0784848610,VonRueden-Feil
        +Felice,Jenken,fjenkenl5@fda.gov,fjenkenl5,San Francisco de Coray,504-(252)407-9161,Software Test Engineer III,7301006063,Stanton Inc
        +Fax,Critchard,fcritchardl6@posterous.com,fcritchardl6,Feilaixia,86-(530)993-0259,Research Assistant I,1837505667,"Halvorson, Rodriguez and Murray"
        +Eberto,Matzeitis,ematzeitisl7@tinypic.com,ematzeitisl7,Paris 08,33-(813)124-1255,Physical Therapy Assistant,3214003879,"Schimmel, Pouros and Yost"
        +Gamaliel,Yakebowitch,gyakebowitchl8@dyndns.org,gyakebowitchl8,Zhendeqiao,86-(902)945-5865,Health Coach IV,3858926728,Morissette-Hand
        +Flor,Boarer,fboarerl9@i2i.jp,fboarerl9,Laventure,230-(655)375-4043,Quality Control Specialist,3619658951,Casper Group
        +Deeanne,Burghill,dburghillla@smugmug.com,dburghillla,Safotu,685-(601)390-5584,Software Engineer I,3672399876,"Conroy, Kerluke and Steuber"
        +Brant,Greenstead,bgreensteadlb@toplist.cz,bgreensteadlb,Adelaide,61-(892)926-0595,Systems Administrator IV,6507194689,Stanton Group
        +Edita,Stanes,estaneslc@ning.com,estaneslc,Asikkala,358-(104)994-3852,Compensation Analyst,6256493079,Schaefer-Mayer
        +Audie,Suche,asucheld@ed.gov,asucheld,Xinjian,86-(928)968-5707,Community Outreach Specialist,7207127251,Heaney Group
        +Phelia,de Amaya,pdeamayale@ovh.net,pdeamayale,Comagascas,63-(548)192-2681,Tax Accountant,6804167333,Moen-Medhurst
        +Brodie,Capelow,bcapelowlf@google.es,bcapelowlf,San Miguel,52-(505)227-1532,Help Desk Operator,0321116399,"Block, Hirthe and Lemke"
        +Darelle,Hickin,dhickinlg@addtoany.com,dhickinlg,Tonghu,86-(429)741-1635,Recruiting Manager,9703631940,"Boyer, Ullrich and Hirthe"
        +Gabriell,Priestley,gpriestleylh@topsy.com,gpriestleylh,Szeged,36-(890)962-0345,Compensation Analyst,9074958451,Weber-Bins
        +Ainsley,Batchelar,abatchelarli@adobe.com,abatchelarli,Plast,7-(909)894-8943,Staff Accountant III,3774125082,"Parker, Bechtelar and Mosciski"
        +Carole,Hammett,chammettlj@deliciousdays.com,chammettlj,Shchukino,7-(234)811-0491,VP Marketing,7633646497,"Beer, Veum and Lowe"
        +Alfie,Duffett,aduffettlk@cam.ac.uk,aduffettlk,Krajan Dua Putukrejo,62-(959)919-5850,Project Manager,2080467263,Durgan-Fritsch
        +Arley,Gillman,agillmanll@cdbaby.com,agillmanll,Karangori,62-(707)970-1378,Financial Advisor,0893767778,Stamm Group
        +Khalil,Goodboddy,kgoodboddylm@zimbio.com,kgoodboddylm,Dijon,33-(369)847-3482,Geological Engineer,6558979381,Goyette and Sons
        +Halimeda,Gowman,hgowmanln@cam.ac.uk,hgowmanln,Krasni Okny,380-(937)249-4520,Senior Financial Analyst,1911763253,Howe Inc
        +Ardis,Benardet,abenardetlo@nytimes.com,abenardetlo,Concepción del Uruguay,54-(567)429-0565,Account Representative IV,4637416302,"Feil, Bartoletti and Adams"
        +Ivory,Lawlie,ilawlielp@thetimes.co.uk,ilawlielp,Schroeder,55-(878)697-6010,Senior Cost Accountant,9431774984,"King, Crona and Von"
        +Barb,Derisley,bderisleylq@mashable.com,bderisleylq,Tangyu,86-(708)194-0125,Marketing Assistant,6826292726,Deckow-Lemke
        +Malissia,Sharer,msharerlr@java.com,msharerlr,Jinghai,86-(252)422-3886,Human Resources Manager,8382713882,Grimes-Hansen
        +Jessamine,Lichfield,jlichfieldls@businesswire.com,jlichfieldls,Micoud,1-(934)806-6515,VP Product Management,6093340430,Kozey Inc
        +Rogerio,Tindall,rtindalllt@biblegateway.com,rtindalllt,Vistino,7-(527)696-9343,Actuary,2542803676,Ritchie-Marquardt
        +Averyl,Garratt,agarrattlu@instagram.com,agarrattlu,Lamovita,387-(200)844-4864,Senior Quality Engineer,1885568886,Ernser-Hartmann
        +Becki,Edelmann,bedelmannlv@gmpg.org,bedelmannlv,Mawlamyine,95-(718)995-2413,Actuary,2746351579,Schamberger LLC
        +Micky,Smitherman,msmithermanlw@chicagotribune.com,msmithermanlw,Belén,598-(243)420-8445,Civil Engineer,2781994006,"Ward, Harris and Nader"
        +Barbabra,Cork,bcorklx@nytimes.com,bcorklx,Tanzhesi,86-(229)632-7950,Research Associate,8772167009,Hane Group
        +Erastus,Cauldfield,ecauldfieldly@friendfeed.com,ecauldfieldly,Nglojo,62-(962)330-7466,Senior Developer,5790337376,"Leuschke, Jaskolski and Jaskolski"
        +Hube,Rowaszkiewicz,hrowaszkiewiczlz@tinypic.com,hrowaszkiewiczlz,Ventanas,593-(568)247-0181,Software Engineer IV,6793591614,Littel-Deckow
        +Justis,Ickov,jickovm0@tripod.com,jickovm0,Issy-les-Moulineaux,33-(574)130-0058,Software Test Engineer II,2573983161,Hintz Inc
        +Wilie,Mawditt,wmawdittm1@wordpress.org,wmawdittm1,Zlatar,385-(148)463-0786,Mechanical Systems Engineer,1825804036,Kerluke-O'Connell
        +Henriette,Early,hearlym2@cisco.com,hearlym2,Salcedo,63-(859)802-4167,Quality Engineer,9157866023,Rowe and Sons
        +Kaycee,Nattriss,knattrissm3@ning.com,knattrissm3,Pindangan Centro,63-(749)241-7828,Chemical Engineer,1628687517,Rutherford-Kihn
        +Hart,Petran,hpetranm4@cnbc.com,hpetranm4,Pampas,51-(195)539-5625,Information Systems Manager,1793147906,"McKenzie, Weimann and Crona"
        +Holt,Kernock,hkernockm5@hhs.gov,hkernockm5,Dasiping,86-(729)481-1150,Recruiting Manager,3841216129,Lindgren Inc
        +Friedrick,Yurchenko,fyurchenkom6@cyberchimps.com,fyurchenkom6,Uppsala,46-(881)710-7992,Quality Control Specialist,8282139564,"Durgan, Simonis and Hilll"
        +Maybelle,Tapenden,mtapendenm7@cafepress.com,mtapendenm7,Guadalupe,52-(698)116-6571,Professor,4954283094,Goodwin Inc
        +Francesco,Hyatt,fhyattm8@blog.com,fhyattm8,Vänersborg,46-(590)336-4962,Systems Administrator IV,0752649760,Dach LLC
        +Marlene,Shevlan,mshevlanm9@independent.co.uk,mshevlanm9,København,45-(461)205-7636,Tax Accountant,5683419905,Gleichner-Schoen
        +Ignatius,Seals,isealsma@4shared.com,isealsma,Chimboy Shahri,998-(740)447-9648,Analog Circuit Design manager,0331255189,Kovacek-Bednar
        +Jasmina,Huggins,jhugginsmb@harvard.edu,jhugginsmb,Kulotino,7-(439)872-4789,Programmer Analyst IV,5646721199,"Koss, Bode and Halvorson"
        +Arther,Bisseker,abissekermc@redcross.org,abissekermc,Ad Dimnah,967-(145)760-6372,Web Designer IV,0238046222,"Fay, Reynolds and Schultz"
        +Brita,Cleynman,bcleynmanmd@scribd.com,bcleynmanmd,Joliet,1-(815)856-8278,Mechanical Systems Engineer,2016930195,"Hickle, Hagenes and Bode"
        +Danita,Aubry,daubryme@fema.gov,daubryme,Somanda,255-(761)470-0112,Food Chemist,2405625261,Kuphal-Littel
        +Hilton,Kyrkeman,hkyrkemanmf@sphinn.com,hkyrkemanmf,Linxia Chengguanzhen,86-(933)120-9575,Chief Design Engineer,9953149593,Sanford-Kiehn
        +Blondie,Heinrich,bheinrichmg@harvard.edu,bheinrichmg,Ban Lam Luk Ka,66-(919)563-5992,Nurse Practicioner,8391355985,Farrell-Stroman
        +Nathalia,Bettleson,nbettlesonmh@lulu.com,nbettlesonmh,Weston,44-(284)766-3674,Assistant Media Planner,7451462927,Schumm Inc
        +Nap,Croxford,ncroxfordmi@mapy.cz,ncroxfordmi,Liugou,86-(814)399-2809,Mechanical Systems Engineer,1028596766,"Vandervort, Howe and Schulist"
        +Matthieu,Pitney,mpitneymj@sourceforge.net,mpitneymj,Lulindi,255-(965)744-8651,Senior Sales Associate,9954867694,Stehr-Stehr
        +Bernadina,Batiste,bbatistemk@theglobeandmail.com,bbatistemk,Jinping,86-(805)406-0826,Marketing Assistant,0681175303,"Kemmer, Bednar and Schmidt"
        +Jo,Vasin,jvasinml@yandex.ru,jvasinml,Suchań,48-(719)533-4494,Social Worker,0672565900,McKenzie Group
        +Isabeau,Josovich,ijosovichmm@shutterfly.com,ijosovichmm,Detroit,1-(313)728-3071,Quality Engineer,9522586072,Stark Group
        +Hyacinth,Streatley,hstreatleymn@va.gov,hstreatleymn,Hanam,82-(962)234-8098,Assistant Professor,4446717154,Littel-Wisozk
        +Margarita,Roller,mrollermo@php.net,mrollermo,Itapevi,55-(849)570-9451,Teacher,4015506529,Kuhic Inc
        +Gottfried,Mawdsley,gmawdsleymp@hatena.ne.jp,gmawdsleymp,Duraznopampa,51-(850)770-5042,Teacher,4615844786,Sauer Inc
        +Colline,Tanner,ctannermq@squarespace.com,ctannermq,Osilnica,386-(375)123-4522,Accounting Assistant IV,4307546075,"Heaney, Prohaska and Treutel"
        +Toiboid,Slyman,tslymanmr@geocities.jp,tslymanmr,Niort,33-(246)445-0387,Safety Technician II,0876852541,Marquardt Group
        +Franky,Willden,fwilldenms@mlb.com,fwilldenms,Nanyaojie,86-(772)392-4262,Web Developer III,4615626932,"Botsford, Mante and Lind"
        +Cory,Sexti,csextimt@ft.com,csextimt,Smiths Falls,1-(856)759-7718,Senior Developer,8931416504,"Herman, Buckridge and Wehner"
        +Nevsa,Paoloni,npaolonimu@ox.ac.uk,npaolonimu,Songjiang,86-(861)892-4735,Registered Nurse,9011403533,Mosciski-Dietrich
        +Rosabelle,Harkess,rharkessmv@hexun.com,rharkessmv,Tambo,51-(320)850-5323,Geological Engineer,3284443002,Howe LLC
        +Bibbye,Maleham,bmalehammw@ifeng.com,bmalehammw,Dakoro,227-(563)968-9242,Programmer Analyst IV,1459020774,"Kuhlman, Bogan and Kshlerin"
        +Marcela,Houlston,mhoulstonmx@ebay.co.uk,mhoulstonmx,Ngedhusuba,62-(645)344-7228,Social Worker,8322158963,"Trantow, Kassulke and Lebsack"
        +Allen,Trembley,atrembleymy@goodreads.com,atrembleymy,Mānānwāla,92-(715)605-9507,Design Engineer,5813315675,"Miller, Yost and Stamm"
        +Wallas,Stansfield,wstansfieldmz@networkadvertising.org,wstansfieldmz,Xiongguan,86-(361)169-6974,Structural Engineer,8350979879,Hills-Waters
        +Alasdair,Konerding,akonerdingn0@msu.edu,akonerdingn0,Rennes,33-(354)767-4981,Web Designer III,6590238693,Nitzsche LLC
        +Kendell,Garvan,kgarvann1@quantcast.com,kgarvann1,Yong’an,86-(763)605-1170,Senior Developer,8673840058,Harris-Smith
        +Sayre,Orthmann,sorthmannn2@linkedin.com,sorthmannn2,Yabuli,86-(956)184-5074,Sales Associate,3238931334,Kozey-Kulas
        +Holt,Francillo,hfrancillon3@sciencedirect.com,hfrancillon3,Jiangcheng,86-(517)345-2568,Software Consultant,8031543178,Runolfsdottir Group
        +Gusella,Kinig,gkinign4@xing.com,gkinign4,Fastiv,380-(645)966-9040,Account Representative II,0511641788,MacGyver-Treutel
        +Otis,Reinhard,oreinhardn5@answers.com,oreinhardn5,Qiancang,86-(285)544-2263,Environmental Specialist,3357295903,Jerde Group
        +Carlin,MacAne,cmacanen6@samsung.com,cmacanen6,Yahotyn,380-(892)306-8669,Desktop Support Technician,5175081594,Hackett LLC
        +Berny,Ferri,bferrin7@prnewswire.com,bferrin7,Jimenez,63-(103)580-5845,Junior Executive,4749556203,Kuhn-Ullrich
        +Warren,Fulks,wfulksn8@wufoo.com,wfulksn8,Jose Maria Morelos,52-(886)281-8268,Statistician IV,0434789003,"West, Kuphal and Hills"
        +Barnett,Bane,bbanen9@arizona.edu,bbanen9,Namerikawa,81-(412)158-7515,Administrative Assistant III,1843810425,Wiegand LLC
        +Arin,Trimming,atrimmingna@constantcontact.com,atrimmingna,Nārāyanganj,880-(506)140-6037,Mechanical Systems Engineer,6579691301,"Trantow, Franecki and Huel"
        +Vinnie,Bruce,vbrucenb@economist.com,vbrucenb,Los Frentones,54-(143)653-9690,Occupational Therapist,7266214238,"Collins, Parker and Volkman"
        +Leandra,Jerdon,ljerdonnc@barnesandnoble.com,ljerdonnc,Mqabba,356-(828)530-5167,Cost Accountant,2421177081,Schimmel and Sons
        +Maurise,McRuvie,mmcruviend@cisco.com,mmcruviend,Takeo,855-(719)155-4461,VP Marketing,1603639632,Cassin-Gislason
        +Galen,Clutterham,gclutterhamne@reddit.com,gclutterhamne,Tantu,86-(856)743-6023,Developer IV,6406520327,"Pagac, Abbott and Renner"
        +Orsa,Faulkener,ofaulkenernf@51.la,ofaulkenernf,Guoyuan,86-(353)293-0614,Nurse,2168428441,Schamberger-Moore
        +Chas,Gaylard,cgaylardng@msn.com,cgaylardng,Ambat,62-(316)304-0070,Speech Pathologist,0230204961,Rodriguez Inc
        +Erek,Kilius,ekiliusnh@mapy.cz,ekiliusnh,Karakol,996-(757)549-4010,Account Representative III,8914898016,Champlin-Parker
        +Torrence,Dallow,tdallowni@livejournal.com,tdallowni,Rumat Heib,972-(551)251-4133,Payment Adjustment Coordinator,7839003737,Macejkovic LLC
        +Son,Nowakowski,snowakowskinj@home.pl,snowakowskinj,Pasirpengarayan,62-(403)683-3142,Media Manager IV,9394032258,"Weissnat, Bergnaum and Paucek"
        +Osbert,Nuscha,onuschank@bluehost.com,onuschank,San Antonio de Los Altos,58-(278)228-1044,Statistician II,9263802645,Wolff-Hudson
        +Kaspar,Smullin,ksmullinnl@ebay.co.uk,ksmullinnl,Hihyā,20-(858)200-1173,Operator,1352488523,Boyer and Sons
        +Temp,Palk,tpalknm@irs.gov,tpalknm,Llorente,63-(559)417-0912,Safety Technician II,5716467989,Rutherford-Dare
        +Julie,Poad,jpoadnn@webeden.co.uk,jpoadnn,Lajeosa,351-(229)448-4862,Office Assistant IV,3869073314,Jones-Pollich
        +Blanche,Schonfeld,bschonfeldno@umn.edu,bschonfeldno,Fresno,1-(209)844-2209,Desktop Support Technician,4348050724,Hand LLC
        +Tremaine,Wicks,twicksnp@ted.com,twicksnp,Tiglauigan,63-(592)251-6057,Executive Secretary,9357962085,Hessel LLC
        +Jessamyn,Mauro,jmauronq@ucsd.edu,jmauronq,Shuangpu,86-(782)336-1634,Senior Developer,2073896022,"Tillman, Schowalter and Kertzmann"
        +Morris,Pedro,mpedronr@wunderground.com,mpedronr,Fort Worth,1-(682)403-1808,Human Resources Assistant I,2418447138,Wiza-Lynch
        +Rossie,Lindblom,rlindblomns@flavors.me,rlindblomns,Espera Feliz,55-(354)448-5176,Senior Developer,9846657803,"D'Amore, Morar and Lubowitz"
        +Kelcie,Woolner,kwoolnernt@histats.com,kwoolnernt,Sainyabuli,856-(703)619-9373,Senior Cost Accountant,9679866378,Farrell-Windler
        +Brittaney,O' Bee,bobeenu@linkedin.com,bobeenu,Mombaça,55-(107)230-7103,Information Systems Manager,4366497247,Stroman-Blick
        +Kassie,Questier,kquestiernv@imageshack.us,kquestiernv,Bielsk Podlaski,48-(127)626-9904,Web Developer I,7973903593,O'Keefe-Altenwerth
        +Wilhelmina,Baldacco,wbaldacconw@yahoo.co.jp,wbaldacconw,Dasha,86-(814)517-9700,Actuary,0898566878,"Grant, Pollich and O'Keefe"
        +Griz,Jagels,gjagelsnx@alexa.com,gjagelsnx,Druzhny,375-(873)367-3588,Cost Accountant,5688512105,Hoeger Inc
        +Nikolaos,Abrahamowitcz,nabrahamowitczny@google.ca,nabrahamowitczny,Wawrzeńczyce,48-(788)215-2200,Community Outreach Specialist,3376050767,Champlin and Sons
        +Cesare,Kelf,ckelfnz@friendfeed.com,ckelfnz,Lucaya,1-(362)126-9927,Business Systems Development Analyst,4434280716,Turner-Conn
        +Olympia,McCaughey,omccaugheyo0@toplist.cz,omccaugheyo0,Soio,244-(652)536-5008,Senior Editor,2665247380,Swaniawski-Kihn
        +Magdalen,Wadhams,mwadhamso1@patch.com,mwadhamso1,Köping,46-(202)987-2026,Automation Specialist II,7922502885,Fahey LLC
        +Laughton,Charrette,lcharretteo2@plala.or.jp,lcharretteo2,El Paso,1-(915)296-9008,Software Engineer II,3832140409,Ferry-Hettinger
        +Antonin,McGaughey,amcgaugheyo3@technorati.com,amcgaugheyo3,Guanyao,86-(385)294-7834,Graphic Designer,4413617177,"Stoltenberg, Anderson and Schroeder"
        +Douglas,Peploe,dpeploeo4@paypal.com,dpeploeo4,Bala Murghab,93-(552)750-0409,Compensation Analyst,6584465276,Will and Sons
        +Saloma,Halcro,shalcroo5@biglobe.ne.jp,shalcroo5,Yongjiu,86-(663)473-4515,Assistant Media Planner,5412294472,Upton and Sons
        +Genia,Dockree,gdockreeo6@ed.gov,gdockreeo6,K’ulashi,995-(693)621-4145,Sales Representative,6311406926,Murazik-Gerlach
        +Ulysses,Vigne,uvigneo7@wisc.edu,uvigneo7,Bosobolo,242-(869)770-6551,Payment Adjustment Coordinator,6121045191,"Kuphal, Smith and Becker"
        +Amaleta,Hellcat,ahellcato8@com.com,ahellcato8,Paamiut,299-(827)658-4181,VP Marketing,9930317341,Sanford Group
        +Marys,Stobo,mstoboo9@addthis.com,mstoboo9,Fraga,351-(646)681-5809,Programmer Analyst IV,8215542689,"Conroy, Luettgen and Haag"
        +Carmelia,Cantillion,ccantillionoa@prweb.com,ccantillionoa,Sumberpucung,62-(715)732-9346,Structural Analysis Engineer,5743542775,Marquardt LLC
        +Jenifer,Ondrus,jondrusob@vinaora.com,jondrusob,Banos,63-(887)517-5901,Accounting Assistant III,1196707006,"Bruen, Paucek and Fisher"
        +Gillian,Espadas,gespadasoc@microsoft.com,gespadasoc,Brejoeira,351-(160)844-3330,Research Associate,1027647391,Weissnat-Blick
        +Vonni,Corley,vcorleyod@feedburner.com,vcorleyod,Melaka,60-(193)177-1978,Civil Engineer,5905339317,Lubowitz-Morar
        +Phillip,Ivanchin,pivanchinoe@addthis.com,pivanchinoe,Sasaguri,81-(145)417-6376,Account Coordinator,3636969412,Turcotte-Wisozk
        +Klarrisa,Letessier,kletessierof@wordpress.com,kletessierof,Gostyń,48-(126)737-5592,VP Quality Control,1411646746,Ankunding-Pfannerstill
        +Gasparo,Agron,gagronog@etsy.com,gagronog,Nangka,63-(410)186-8167,Senior Sales Associate,5644040968,Rippin-Goyette
        +Joni,Burnard,jburnardoh@timesonline.co.uk,jburnardoh,Ilām,977-(207)827-4512,Analyst Programmer,5890418432,Krajcik Inc
        +Kim,Kytter,kkytteroi@weibo.com,kkytteroi,Mojokerto,62-(279)874-2608,Environmental Specialist,1343560179,"Schulist, Weber and Paucek"
        +Lora,Elms,lelmsoj@narod.ru,lelmsoj,Cầu Gồ,84-(800)294-5849,VP Marketing,1493946587,Schamberger Group
        +Arlena,Paullin,apaullinok@reddit.com,apaullinok,Örebro,46-(532)455-1043,Senior Editor,4085398636,Grant and Sons
        +Richard,Darcy,rdarcyol@seesaa.net,rdarcyol,Batarasa,63-(298)338-2430,Community Outreach Specialist,7860234254,Bahringer LLC
        +Felizio,Padginton,fpadgintonom@gmpg.org,fpadgintonom,Nanzhen,86-(584)560-0295,Research Assistant III,3766611003,Spencer Group
        +Antonina,Kilpin,akilpinon@alexa.com,akilpinon,Schieren,352-(152)223-8179,Chemical Engineer,8146664725,"Labadie, Goyette and Jacobson"
        +Erika,Geator,egeatoroo@bloglovin.com,egeatoroo,Retorta,351-(404)826-3743,Assistant Professor,4828740651,Lakin Group
        +Ali,Straffon,astraffonop@hexun.com,astraffonop,Babiak,48-(388)809-9155,Actuary,5262099386,Reichel-Hand
        +Amabel,Board,aboardoq@shareasale.com,aboardoq,Diancun,86-(214)304-0961,Information Systems Manager,6355389466,Upton-Jaskolski
        +Gabie,Bradwell,gbradwellor@yandex.ru,gbradwellor,Gobō,81-(496)451-0957,Analog Circuit Design manager,8680375713,Nienow-Hermiston
        +Claretta,Finlaison,cfinlaisonos@trellian.com,cfinlaisonos,Chatturat,66-(920)250-8360,Database Administrator III,4852140383,Wiza-Predovic
        +Kippie,Panting,kpantingot@geocities.jp,kpantingot,Tojeira,351-(648)874-8790,Recruiter,7921358802,"Kunze, Jaskolski and Stoltenberg"
        +Linell,Croysdale,lcroysdaleou@buzzfeed.com,lcroysdaleou,Orós,55-(435)669-9483,Help Desk Technician,1212044088,Ledner-Johnston
        +Vasilis,Goublier,vgoublierov@altervista.org,vgoublierov,Caujul,51-(101)425-0809,Structural Analysis Engineer,4372624972,Bayer-Heller
        +Brocky,Gianiello,bgianielloow@flickr.com,bgianielloow,Huoxian,86-(427)267-9428,Developer IV,6023283195,Witting-Howe
        +Roland,Blowes,rblowesox@apache.org,rblowesox,Padej,381-(688)750-4717,Business Systems Development Analyst,7378441384,Bashirian-Wiegand
        +Garv,Peerman,gpeermanoy@a8.net,gpeermanoy,Yolöten,993-(132)948-7743,Cost Accountant,8711924012,Quigley Group
        +Damaris,Amberson,dambersonoz@noaa.gov,dambersonoz,Uchaly,7-(891)257-7839,Social Worker,0871438763,Cummerata and Sons
        +Reba,Laudham,rlaudhamp0@uiuc.edu,rlaudhamp0,Mendefera,291-(385)541-4183,Cost Accountant,9459415148,Gleichner LLC
        +Dill,Teligin,dteliginp1@telegraph.co.uk,dteliginp1,Garango,226-(818)796-5422,Tax Accountant,2544502487,Abbott-Thiel
        +Greta,Lewsam,glewsamp2@psu.edu,glewsamp2,Rostov-na-Donu,7-(207)756-1434,Staff Accountant I,3029138410,Schmitt-Bogisich
        +Norah,Jeremaes,njeremaesp3@netvibes.com,njeremaesp3,Xiakouyi,86-(488)113-1826,Office Assistant III,6252335258,Rempel-Abshire
        +Datha,Lenahan,dlenahanp4@unicef.org,dlenahanp4,Kuzhu,86-(851)353-6927,Sales Representative,1680930990,Lubowitz and Sons
        +Sophey,Phlipon,sphliponp5@behance.net,sphliponp5,Jiaoziya,86-(315)182-8625,Account Coordinator,5389921747,Effertz Group
        +Alix,Schirach,aschirachp6@lulu.com,aschirachp6,San Marcos,503-(169)421-0329,Electrical Engineer,2023606950,"Herzog, Funk and Gottlieb"
        +Mignon,Paddington,mpaddingtonp7@sogou.com,mpaddingtonp7,Panikian,63-(636)557-0276,Legal Assistant,2892389844,Cormier-Hudson
        +Darn,Elfleet,delfleetp8@blogtalkradio.com,delfleetp8,Dubravica,387-(878)576-7012,Mechanical Systems Engineer,2839634538,Olson-Bogan
        +Monique,Harmon,mharmonp9@admin.ch,mharmonp9,Roissy Charles-de-Gaulle,33-(545)532-7958,Associate Professor,9092943010,Hickle LLC
        +Tull,Infante,tinfantepa@tinyurl.com,tinfantepa,Xiaoruo,86-(387)599-5542,Marketing Assistant,9863380032,"Sanford, Bradtke and Farrell"
        +Nyssa,Madoc-Jones,nmadocjonespb@epa.gov,nmadocjonespb,Puerto Quellón,56-(955)181-7227,Assistant Manager,1890626058,Littel-Toy
        +Florence,Solomon,fsolomonpc@bbc.co.uk,fsolomonpc,Blois,33-(767)315-1932,VP Quality Control,3079951077,Eichmann Inc
        +Vanya,Schermick,vschermickpd@berkeley.edu,vschermickpd,Kunvald,420-(153)357-8683,Staff Accountant I,0920565719,Quigley-Bergstrom
        +Danita,Juanico,djuanicope@ca.gov,djuanicope,Cluny,230-(619)594-7589,Human Resources Manager,3146677113,"Kassulke, Ruecker and Hane"
        +Shelagh,Shelley,sshelleypf@marriott.com,sshelleypf,Sabaneta,58-(196)295-4803,Paralegal,7166846496,"Koelpin, Cremin and Langosh"
        +Kerk,Dufer,kduferpg@google.com.au,kduferpg,Rukem,62-(346)971-3292,Executive Secretary,2386201910,"Simonis, Johnson and Fay"
        +Ab,Davidde,adaviddeph@prnewswire.com,adaviddeph,Daxing,86-(500)810-4696,Community Outreach Specialist,5805532379,Boyer and Sons
        +Billye,Betteson,bbettesonpi@redcross.org,bbettesonpi,Longos,351-(101)580-5428,Physical Therapy Assistant,1479316938,Frami-Lesch
        +Harley,Brewer,hbrewerpj@upenn.edu,hbrewerpj,Dadoupu,86-(480)441-7751,Community Outreach Specialist,0039146294,"Corkery, Schaefer and Marks"
        +Wynnie,Solano,wsolanopk@zdnet.com,wsolanopk,Laidian,86-(253)399-5610,Assistant Professor,2137078449,"McClure, Satterfield and Barton"
        +Darn,Haffard,dhaffardpl@ask.com,dhaffardpl,Horton,44-(564)751-3439,Financial Advisor,5938631068,Pollich-Hermann
        +Howey,Stallan,hstallanpm@uol.com.br,hstallanpm,Anhai,86-(567)926-3005,VP Sales,3450645838,"Lockman, Crona and Abernathy"
        +King,Cicculini,kcicculinipn@devhub.com,kcicculinipn,Bolekhiv,380-(723)375-7883,VP Sales,1728709016,"Murazik, Yundt and Hane"
        +Kaela,Crispe,kcrispepo@fc2.com,kcrispepo,Sundsvall,46-(597)539-5689,Actuary,3188646194,Gleichner-Lindgren
        +Stearne,Wardingley,swardingleypp@about.me,swardingleypp,Shirgjan,355-(356)611-0499,Librarian,2611445389,Schmidt LLC
        +Devan,Swait,dswaitpq@flavors.me,dswaitpq,Yilan,86-(426)167-0401,Nuclear Power Engineer,0436813416,"Prosacco, Muller and Gleason"
        +Arline,Cunradi,acunradipr@samsung.com,acunradipr,San Luis,63-(588)882-9972,Speech Pathologist,6075640940,Beatty-Watsica
        +Cordi,Barkway,cbarkwayps@g.co,cbarkwayps,Gävle,46-(676)140-3109,Budget/Accounting Analyst I,6375200660,Balistreri-Collier
        +Carma,Radcliffe,cradcliffept@mit.edu,cradcliffept,Mineralni Bani,359-(527)871-2652,Programmer Analyst II,8264713580,Quigley Inc
        +Camila,Capehorn,ccapehornpu@sfgate.com,ccapehornpu,Oguma,234-(989)667-0635,Statistician I,7343647008,Gutkowski-Ullrich
        +Gerri,Molen,gmolenpv@bloglines.com,gmolenpv,Zhoukou,86-(924)447-1128,Professor,0195842693,"Howe, Bogisich and Stroman"
        +Maurizio,Cacacie,mcacaciepw@mit.edu,mcacaciepw,Ostrogozhsk,7-(519)339-7578,Data Coordiator,9811795614,"Johnson, Schinner and Pagac"
        +Jerrine,Sancias,jsanciaspx@cpanel.net,jsanciaspx,Hayan Hudong,86-(285)373-2471,Graphic Designer,3440547981,Littel-Feeney
        +Willie,Worlock,wworlockpy@omniture.com,wworlockpy,Campina Grande,55-(796)613-7498,Staff Scientist,8176496995,"Walsh, Jakubowski and Ernser"
        +Page,Salvadori,psalvadoripz@netscape.com,psalvadoripz,Kota Kinabalu,60-(507)527-2407,Account Coordinator,9922888610,"Kertzmann, Funk and Jenkins"
        +Alvie,Howsan,ahowsanq0@omniture.com,ahowsanq0,Parion,63-(234)698-7388,Operator,8071753939,Thompson-Keebler
        +Emera,Stout,estoutq1@craigslist.org,estoutq1,Dahu,86-(284)198-0386,Quality Control Specialist,7804586396,"Muller, Murazik and Zieme"
        +Lois,Gladdifh,lgladdifhq2@instagram.com,lgladdifhq2,Lleida,34-(715)382-4713,Database Administrator II,3633654518,Schumm LLC
        +Doug,Lamerton,dlamertonq3@si.edu,dlamertonq3,Villa Alemana,56-(149)630-1570,Research Nurse,2253131156,Hilpert Group
        +Theda,Ebbing,tebbingq4@craigslist.org,tebbingq4,Alung,62-(738)502-4534,Analyst Programmer,4591819175,"Farrell, Murazik and Mayert"
        +Kassandra,Swalwel,kswalwelq5@amazon.co.jp,kswalwelq5,Sacapulas,502-(884)290-1622,Senior Editor,7185464110,Gibson-Leffler
        +Livvy,Burroughes,lburroughesq6@amazonaws.com,lburroughesq6,Bailianhe,86-(458)619-0316,Librarian,1535422378,O'Hara Inc
        +Temp,Wardington,twardingtonq7@craigslist.org,twardingtonq7,Ngozi,257-(217)180-8803,Junior Executive,0848046633,"Waelchi, Schamberger and Huels"
        +Rhetta,Petrishchev,rpetrishchevq8@irs.gov,rpetrishchevq8,Tsinandali,995-(430)243-4289,Statistician I,7791803836,Pacocha LLC
        +Anastassia,Edgar,aedgarq9@cmu.edu,aedgarq9,Labuhansumbawa,62-(644)719-6905,General Manager,1184092605,"Cartwright, Bergstrom and Monahan"
        +Giana,Giacobazzi,ggiacobazziqa@jimdo.com,ggiacobazziqa,Tambac,63-(579)835-6229,Quality Control Specialist,6363216184,"Kuhic, Monahan and McGlynn"
        +Teriann,Dafydd,tdafyddqb@vistaprint.com,tdafyddqb,Babakanloa,62-(482)920-2072,Human Resources Assistant III,5821778638,"Ritchie, Herman and Lindgren"
        +Willa,Tacker,wtackerqc@bigcartel.com,wtackerqc,Ḩurayḑah,967-(806)911-9319,Health Coach II,9135157542,Kunze-Bahringer
        +Lucila,Sabater,lsabaterqd@apache.org,lsabaterqd,Humen,86-(614)109-2198,Software Engineer I,5293367323,Dach Group
        +Dael,Ondrak,dondrakqe@stumbleupon.com,dondrakqe,Marxog,86-(260)249-8251,Health Coach II,4372560729,Daugherty-Weber
        +Wait,St Pierre,wstpierreqf@wordpress.com,wstpierreqf,Biru,86-(860)639-5320,Programmer Analyst III,8047175459,Gaylord-Ebert
        +Rasla,Godlonton,rgodlontonqg@altervista.org,rgodlontonqg,Balgatay,976-(232)485-2320,Programmer Analyst III,3673385615,Veum-Braun
        +Kristine,Heersema,kheersemaqh@ft.com,kheersemaqh,Choibalsan,976-(538)269-3674,Structural Analysis Engineer,8626952910,Hilpert LLC
        +Sly,Causnett,scausnettqi@mozilla.com,scausnettqi,Krajan Gebangan,62-(773)388-2291,Occupational Therapist,7422892277,"Tromp, Ziemann and Grant"
        +Cecilius,Sully,csullyqj@mysql.com,csullyqj,Meukek,62-(638)624-8698,Quality Control Specialist,6934177193,Doyle Inc
        +Adelaida,Stickford,astickfordqk@washingtonpost.com,astickfordqk,Khoa,856-(931)334-2132,Account Coordinator,7872285312,"Dicki, Bailey and Ratke"
        +Rochelle,Reynish,rreynishql@indiatimes.com,rreynishql,Fāryāb,98-(957)306-8416,Media Manager IV,1676544003,Lang Inc
        +Odie,Ianniello,oiannielloqm@independent.co.uk,oiannielloqm,La Cumbre,54-(979)726-7040,Account Representative III,7068196918,"Bernhard, Rau and Marvin"
        +Haskel,Ladloe,hladloeqn@timesonline.co.uk,hladloeqn,George Town,1-(687)711-7923,Quality Control Specialist,5936963217,"Ryan, Parisian and Swaniawski"
        +Olympie,Vassall,ovassallqo@samsung.com,ovassallqo,Vannes,33-(222)237-4683,Media Manager II,8854580236,Koepp-Boehm
        +Noll,Beech,nbeechqp@plala.or.jp,nbeechqp,Bloemfontein,27-(804)795-7592,Food Chemist,4394656052,Purdy and Sons
        +Konstanze,Thon,kthonqq@google.ru,kthonqq,Tīrān,98-(846)964-8726,Payment Adjustment Coordinator,1904564429,Simonis and Sons
        +Leonid,Kerford,lkerfordqr@un.org,lkerfordqr,Dzüünbulag,976-(101)272-5436,Administrative Officer,2082237710,"Swaniawski, Steuber and Runte"
        +Reeva,Dyka,rdykaqs@geocities.com,rdykaqs,Mstów,48-(190)592-9280,Environmental Specialist,9030963425,Rippin-Waters
        +Galvin,Lumbley,glumbleyqt@reuters.com,glumbleyqt,Feodosiya,380-(562)472-4251,Chemical Engineer,0083583572,"Hilpert, Satterfield and Walker"
        +Chet,Spinozzi,cspinozziqu@marriott.com,cspinozziqu,Det Udom,66-(457)173-1407,Data Coordiator,7957694462,Bashirian LLC
        +Ryann,Wimlett,rwimlettqv@free.fr,rwimlettqv,Paniówki,48-(203)574-3233,Actuary,6548690974,Nienow and Sons
        +Craggie,McCotter,cmccotterqw@feedburner.com,cmccotterqw,Portela,351-(482)524-3475,Pharmacist,4298812022,Abernathy-Kuhic
        +Ulberto,Heifer,uheiferqx@yandex.ru,uheiferqx,Omaha,1-(402)346-5913,Software Engineer I,0187278784,Yundt LLC
        +Billie,Franchi,bfranchiqy@etsy.com,bfranchiqy,Yinping,86-(788)959-3511,Web Designer I,4035720887,Nolan LLC
        +Norbie,Goundsy,ngoundsyqz@fda.gov,ngoundsyqz,São José dos Campos,55-(914)752-8310,Senior Editor,9192798357,Feeney LLC
        +Barde,Emlen,bemlenr0@infoseek.co.jp,bemlenr0,Pétange,352-(762)627-9841,Software Consultant,2432326261,"Rice, Eichmann and Will"
        +Shelagh,Zemler,szemlerr1@mayoclinic.com,szemlerr1,Filiátes,30-(866)635-4243,Geological Engineer,3958946542,"Hansen, Bernier and Goldner"
        +Isidro,Ciani,icianir2@yahoo.co.jp,icianir2,Serednye,380-(288)355-3486,Tax Accountant,1506003982,Torp-Bogisich
        +Vivia,Lapworth,vlapworthr3@joomla.org,vlapworthr3,Malino,63-(291)269-3418,Environmental Specialist,0157700771,Jast-Kuhlman
        +Roshelle,Churn,rchurnr4@berkeley.edu,rchurnr4,Lingqiao,86-(997)692-6158,Geological Engineer,2603479822,Marquardt and Sons
        +Bentley,Vanshin,bvanshinr5@ehow.com,bvanshinr5,Stockholm,46-(653)768-6050,Information Systems Manager,7297467227,"King, Tillman and Nicolas"
        +Lois,Mynett,lmynettr6@reuters.com,lmynettr6,Nantes,33-(554)638-9803,Speech Pathologist,1603340408,Veum LLC
        +Charity,Krzyzowski,ckrzyzowskir7@archive.org,ckrzyzowskir7,Masebewa,62-(958)826-5880,Staff Scientist,4975412993,"Brakus, Gusikowski and Padberg"
        +Clemente,Pottage,cpottager8@census.gov,cpottager8,Tenggun Dajah,62-(506)558-9919,Associate Professor,6455213033,"Purdy, Vandervort and Douglas"
        +Kurt,Cowap,kcowapr9@jugem.jp,kcowapr9,Kutao,86-(358)991-3144,Nurse,0616313527,White-Goyette
        +Chrissy,Finey,cfineyra@irs.gov,cfineyra,Ningzhong,86-(138)301-0438,Professor,9107665083,Davis and Sons
        +Clarinda,Hallgate,challgaterb@linkedin.com,challgaterb,Zinder,227-(332)911-9324,Product Engineer,7179109576,"Lesch, Balistreri and Morissette"
        +Carmelle,Chatelain,cchatelainrc@woothemes.com,cchatelainrc,Monte Branco,351-(468)889-1359,Tax Accountant,6018619938,Adams-Harris
        +Erskine,Bonin,eboninrd@redcross.org,eboninrd,Sabang,63-(956)745-4358,Actuary,1793329427,"Farrell, White and Bednar"
        +Linnet,Castelot,lcastelotre@1688.com,lcastelotre,Jintun,86-(448)985-9715,Senior Sales Associate,6843609481,Pagac and Sons
        +Aurthur,Thomke,athomkerf@whitehouse.gov,athomkerf,Głuchów,48-(339)416-4557,Engineer I,7088789183,"Roob, Runolfsdottir and Leffler"
        +Donni,Salomon,dsalomonrg@japanpost.jp,dsalomonrg,Forninho,351-(549)953-6906,Account Executive,4908221146,"Wisozk, Greenholt and Hamill"
        +Skip,Edensor,sedensorrh@alexa.com,sedensorrh,Victoria,503-(808)383-0356,Project Manager,0126141614,Mayer-Mante
        +Albrecht,Ellam,aellamri@businessweek.com,aellamri,La Roche-sur-Yon,33-(857)717-9828,Actuary,4743554497,Parisian-Ankunding
        +Loutitia,Simson,lsimsonrj@plala.or.jp,lsimsonrj,Tamontaka,63-(423)893-7361,Assistant Media Planner,6240594598,Schamberger LLC
        +Ariel,Cockarill,acockarillrk@amazonaws.com,acockarillrk,Santa Quitéria,55-(584)271-7334,VP Sales,9593299637,"Lang, Bednar and Mayer"
        +Nonie,Paulton,npaultonrl@cbslocal.com,npaultonrl,Kladno,420-(149)126-3944,Senior Developer,7724518181,"Bruen, Murray and Kunde"
        +Yasmin,Rilston,yrilstonrm@gizmodo.com,yrilstonrm,Petoa,504-(697)889-4705,Environmental Specialist,9003612854,McKenzie and Sons
        +Izaak,Gowthrop,igowthroprn@webmd.com,igowthroprn,Ancasti,54-(334)952-0828,Account Executive,9924782984,Cartwright LLC
        +Jelene,Badman,jbadmanro@shinystat.com,jbadmanro,Asunción,595-(802)109-9845,Electrical Engineer,3501920857,"Cremin, Heaney and Morissette"
        +Staffard,Clausius,sclausiusrp@yellowbook.com,sclausiusrp,Sampao,63-(733)481-2381,Junior Executive,6139413206,Herzog-Beer
        +Lilia,Dalliwatr,ldalliwatrrq@deviantart.com,ldalliwatrrq,Hengshan,86-(225)596-7008,Operator,2989513345,Mante-Funk
        +Karlotta,Altamirano,kaltamiranorr@vistaprint.com,kaltamiranorr,Ajax,1-(705)315-7495,Legal Assistant,1030691320,Carroll Group
        diff --git a/snipeit.sh b/snipeit.sh
        index 5231849424..4aad3db983 100755
        --- a/snipeit.sh
        +++ b/snipeit.sh
        @@ -111,8 +111,9 @@ function isinstalled {
         }
         
         if [ -f /etc/lsb-release ]; then
        -	distro="$(lsb_release -s -i )"
        -	version="$(lsb_release -s -r)"
        +    distro="$(lsb_release -s -i )"
        +    version="$(lsb_release -s -r)"
        +    codename="$(lsb_release -c -s)"
         elif [ -f /etc/os-release ]; then
         	distro="$(. /etc/os-release && echo $ID)"
         	version="$(. /etc/os-release && echo $VERSION_ID)"
        @@ -150,7 +151,7 @@ case $distro in
                         echo "  The installer has detected Debian version $version as the OS."
                         distro=debian
                         ;;
        -        *centos*|*redhat*|*ol*)
        +        *centos*|*redhat*|*ol*|*rhel*)
                         echo "  The installer has detected $distro version $version as the OS."
                         distro=centos
                         ;;
        @@ -177,7 +178,7 @@ read setpw
         
         case $setpw in
                 [yY] | [yY][Ee][Ss] )
        -                mysqluserpw="$(< /dev/urandom tr -dc _A-Za-z-0-9 2>&1 | head -c16)"
        +                mysqluserpw="$(echo `< /dev/urandom tr -dc _A-Za-z-0-9 | head -c16`)"
                         ans="yes"
                         ;;
                 [nN] | [n|N][O|o] )
        @@ -192,19 +193,16 @@ esac
         done
         
         #Snipe says we need a new 32bit key, so let's create one randomly and inject it into the file
        -random32="$(< /dev/urandom tr -dc _A-Za-z-0-9 2>&1 | head -c32)"
         
         #db_setup.sql will be injected to the database during install.
         #Again, this file should be removed, which will be a prompt at the end of the script.
        -dbsetup="$tmp/db_setup.sql"
        -{
        -  echo "CREATE DATABASE snipeit;"
        -  echo "GRANT ALL PRIVILEGES ON snipeit.* TO snipeit@localhost IDENTIFIED BY '$mysqluserpw';"
        -} >> "$dbsetup"
        +dbsetup=$tmp/db_setup.sql
        +echo >> $dbsetup "CREATE DATABASE snipeit;"
        +echo >> $dbsetup "GRANT ALL PRIVILEGES ON snipeit.* TO snipeit@localhost IDENTIFIED BY '$mysqluserpw';"
         
         #Let us make it so only root can read the file. Again, this isn't best practice, so please remove these after the install.
        -chown root:root "$dbsetup"
        -chmod 700 "$dbsetup"
        +chown root:root $dbsetup
        +chmod 700 $dbsetup
         
         ## TODO: Progress tracker on each step
         
        @@ -218,28 +216,27 @@ case $distro in
         
         		webdir=/var/www
         		echo -e "\n* Updating Debian packages in the background... ${spin[0]}\n"
        -		log "apt-get update" & pid=$!
        +		apt-get update >> /var/log/snipeit-install.log & pid=$! 2>&1
         		wait
        -		log "apt-get upgrade" & pid=$!
        +		apt-get upgrade >> /var/log/snipeit-install.log & pid=$! 2>&1
         		wait
         		echo -e "\n* Installing packages... ${spin[0]}\n"
         		echo -e "\n* Going to suppress more messages that you don't need to worry about. Please wait... ${spin[0]}"
        -		log "DEBIAN_FRONTEND=noninteractive apt-get -y install mariadb-server mariadb-client apache2 git unzip php5 php5-mcrypt php5-curl php5-mysql php5-gd php5-ldap libapache2-mod-php5 curl" & pid=$!
        +		DEBIAN_FRONTEND=noninteractive apt-get -y install mariadb-server mariadb-client apache2 git unzip php5 php5-mcrypt php5-curl php5-mysql php5-gd php5-ldap libapache2-mod-php5 curl >> /var/log/snipeit-install.log & pid=$! 2>&1
         		progress
         		wait
         		echo -e "\n* Cloning Snipeit, extracting to $webdir/$name..."
        -		log "git clone https://github.com/snipe/snipe-it $webdir/$name" & pid=$!
        +		git clone https://github.com/snipe/snipe-it $webdir/$name >> /var/log/snipeit-install.log & pid=$! 2>&1
         		progress
        -		log "php5enmod mcrypt"
        -		log "a2enmod rewrite"
        +		php5enmod mcrypt >> /var/log/snipeit-install.log 2>&1
        +		a2enmod rewrite >> /var/log/snipeit-install.log 2>&1
         		vhenvfile
         		wait
         		echo >> $hosts "127.0.0.1 $hostname $fqdn"
        -		log "a2ensite $name.conf"
        +		a2ensite $name.conf
         		echo -e "* Modify the Snipe-It files necessary for a production environment.\n* Securing Mysql"
         		# Have user set own root password when securing install
         		# and just set the snipeit database user at the beginning
        -		service mysql status >/dev/null || service mysql start
         		/usr/bin/mysql_secure_installation
         		echo -e "* Creating Mysql Database and User.\n##  Please Input your MySQL/MariaDB root password: "
         		mysql -u root -p < $dbsetup
        @@ -247,8 +244,9 @@ case $distro in
         		curl -sS https://getcomposer.org/installer | php
         		php composer.phar install --no-dev --prefer-source
         		perms
        -		chown -R www-data:www-data "/var/www/$name"
         		service apache2 restart
        +		php artisan key:generate
        +		php artisan passport:install
         		;;
         	ubuntu)
         		#####################################  Install for Ubuntu  ##############################################
        @@ -298,9 +296,11 @@ case $distro in
         		perms
         		chown -R www-data:www-data "/var/www/$name"
         		service apache2 restart
        +        php artisan key:generate
        +        php artisan passport:install
         		;;
        -	centos)
        -	if [ "$version" == "6" ]; then
        +	centos )
        +	if [[ "$version" =~ ^6 ]]; then
         		#####################################  Install for Centos/Redhat 6  ##############################################
         
         		webdir=/var/www/html
        @@ -416,10 +416,11 @@ case $distro in
                               service iptables save
                         fi
         
        -
         	       service httpd restart
        +	       php artisan key:generate
        +           php artisan passport:install
         
        -	elif [ "$version" == "7" ]; then
        +	elif [[ "$version" =~ ^7 ]]; then
         		#####################################  Install for Centos/Redhat 7  ##############################################
         
         		webdir=/var/www/html
        @@ -535,6 +536,8 @@ case $distro in
          	       	fi
         
         		systemctl restart httpd.service
        +		php artisan key:generate
        +        php artisan passport:install
         
         	else
         		echo "Unable to Handle Centos Version #.  Version Found: " $version
        diff --git a/storage/app/backups/.gitignore b/storage/app/backups/.gitignore
        index c96a04f008..87b08a80a3 100755
        --- a/storage/app/backups/.gitignore
        +++ b/storage/app/backups/.gitignore
        @@ -1,2 +1,3 @@
         *
        -!.gitignore
        \ No newline at end of file
        +!.gitignore
        +!env-backups
        \ No newline at end of file
        diff --git a/storage/app/backups/env-backups/.gitignore b/storage/app/backups/env-backups/.gitignore
        new file mode 100755
        index 0000000000..c96a04f008
        --- /dev/null
        +++ b/storage/app/backups/env-backups/.gitignore
        @@ -0,0 +1,2 @@
        +*
        +!.gitignore
        \ No newline at end of file
        diff --git a/tests/TestCase.php b/tests/TestCase.php
        index 6f51045415..7b3c65c174 100644
        --- a/tests/TestCase.php
        +++ b/tests/TestCase.php
        @@ -16,11 +16,12 @@ class TestCase extends Illuminate\Foundation\Testing\TestCase
              */
             public function createApplication()
             {
        -        $app = require_once __DIR__.'/../bootstrap/app.php';
        +        $app = require __DIR__.'/../bootstrap/app.php';
                 $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
                 return $app;
             }
         
        +
             public function setUp()
             {
                 parent::setUp();
        diff --git a/tests/_data/dump.sql b/tests/_data/dump.sql
        index 281e520b40..987c7c5d21 100644
        --- a/tests/_data/dump.sql
        +++ b/tests/_data/dump.sql
        @@ -1,8 +1,8 @@
        --- MySQL dump 10.13  Distrib 5.7.15, for Linux (x86_64)
        +-- MySQL dump 10.13  Distrib 5.7.18, for Linux (x86_64)
         --
         -- Host: localhost    Database: snipeittests
         -- ------------------------------------------------------
        --- Server version	5.7.15-0ubuntu0.16.04.1
        +-- Server version	5.7.18-0ubuntu0.16.10.1
         
         /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
         /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
        @@ -41,7 +41,7 @@ CREATE TABLE `accessories` (
           `manufacturer_id` int(11) DEFAULT NULL,
           `model_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -50,7 +50,7 @@ CREATE TABLE `accessories` (
         
         LOCK TABLES `accessories` WRITE;
         /*!40000 ALTER TABLE `accessories` DISABLE KEYS */;
        -INSERT INTO `accessories` VALUES (1,'Voluptatem enim.',15,NULL,8,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,1,NULL,NULL,NULL,2,2,NULL,NULL),(2,'Dolores aut aut.',14,NULL,7,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,3,NULL,NULL,NULL,3,1,NULL,NULL),(3,'Quaerat corrupti.',13,NULL,9,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,3,NULL,NULL,NULL,3,1,NULL,NULL),(4,'Expedita mollitia.',12,NULL,9,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,4,NULL,NULL,NULL,1,2,NULL,NULL),(5,'Est culpa totam.',11,NULL,8,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,1,NULL,NULL,NULL,3,2,NULL,NULL),(6,'Quae esse vero.',12,NULL,7,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,3,NULL,NULL,NULL,4,1,NULL,NULL),(7,'Nemo rerum soluta.',14,NULL,6,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,4,NULL,NULL,NULL,3,1,NULL,NULL),(8,'Ut error deleniti.',13,NULL,7,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,5,NULL,NULL,NULL,4,2,NULL,NULL),(9,'Est ut ad et quos.',13,NULL,8,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,3,NULL,NULL,NULL,3,2,NULL,NULL),(10,'Itaque voluptas est.',13,NULL,9,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,1,NULL,NULL,NULL,2,1,NULL,NULL),(11,'Est aspernatur in.',12,NULL,6,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,2,NULL,NULL,NULL,3,1,NULL,NULL),(12,'Consequatur quo a.',15,NULL,10,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,4,NULL,NULL,NULL,2,2,NULL,NULL),(13,'Placeat perferendis.',14,NULL,10,0,'2016-11-20 23:07:28','2016-11-21 00:33:27','2016-11-21 00:33:27',3,NULL,NULL,NULL,3,2,NULL,NULL),(14,'Dolore corrupti.',12,NULL,7,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,3,NULL,NULL,NULL,4,2,NULL,NULL),(15,'Ut pariatur.',14,NULL,5,0,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,4,NULL,NULL,NULL,2,1,NULL,NULL),(16,'TestAccessory',19,1,12,0,'2016-11-21 00:33:26','2016-11-21 00:33:26',NULL,5,'2016-01-01',25.00,'12345',4,6,8,'');
        +INSERT INTO `accessories` VALUES (1,'Ut mollitia.',14,NULL,8,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,3,'1988-09-17',25836.87,'35014616',11,2,10,NULL),(2,'Ut et ut soluta.',14,NULL,5,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,2,'1985-11-06',200108.21,'21094683',14,1,4,NULL),(3,'Error tenetur.',12,NULL,5,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,1,'1986-05-14',28577.40,'41322960',4,2,1,NULL),(4,'Iusto et et non.',12,NULL,9,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,2,'1996-12-13',157.48,'29118579',10,2,2,NULL),(5,'Voluptatem ad rem.',14,NULL,6,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,3,'2015-12-30',310.50,'6252438',10,1,9,NULL),(6,'Nihil dignissimos.',14,NULL,7,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,5,'1999-10-30',59697588.47,'45178757',6,2,6,NULL),(7,'Dignissimos est et.',15,NULL,9,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,5,'1974-12-19',6.61,'2144808',12,2,9,NULL),(8,'Est in non autem.',12,NULL,5,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,4,'1979-11-15',425290.63,'27097724',9,1,8,NULL),(9,'Asperiores suscipit.',15,NULL,7,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,4,'2008-02-19',276973.34,'27119729',10,1,6,NULL),(10,'Officiis.',13,NULL,8,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,5,'2008-10-30',166316.55,'20862511',3,2,4,NULL),(11,'Tenetur minima.',15,NULL,5,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,3,'1990-11-13',1632.04,'24359280',11,1,10,NULL),(12,'Consequuntur.',12,NULL,8,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,4,'1971-06-18',0.72,'46029235',7,2,7,NULL),(13,'Dolorem vel nisi.',11,NULL,10,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,4,'2004-05-30',14910998.69,'41178738',8,2,5,NULL),(14,'Eum vel adipisci.',14,NULL,9,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,4,'2006-05-22',1.48,'4330024',14,2,1,NULL),(15,'Temporibus qui.',14,NULL,7,0,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,4,'1985-06-30',1806222.61,'7563193',14,1,9,NULL);
         /*!40000 ALTER TABLE `accessories` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -109,7 +109,7 @@ CREATE TABLE `action_logs` (
           `accept_signature` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
           PRIMARY KEY (`id`),
           KEY `action_logs_thread_id_index` (`thread_id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=86 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -118,7 +118,7 @@ CREATE TABLE `action_logs` (
         
         LOCK TABLES `action_logs` WRITE;
         /*!40000 ALTER TABLE `action_logs` DISABLE KEYS */;
        -INSERT INTO `action_logs` VALUES (1,26,'checkout',39,'App\\Models\\User',NULL,'Minus architecto autem neque vel ut.',NULL,'App\\Models\\Asset',36,NULL,NULL,'1972-01-14 18:00:46','2016-11-20 23:07:29',NULL,NULL,2,NULL),(2,34,'checkout',42,'App\\Models\\User',NULL,'Odio optio vitae ipsa facere repudiandae consequatur.',NULL,'App\\Models\\Asset',54,NULL,NULL,'2003-10-04 22:32:16','2016-11-20 23:07:29',NULL,NULL,3,NULL),(3,40,'checkout',36,'App\\Models\\User',NULL,'Aliquid eligendi nesciunt expedita repudiandae alias veritatis hic.',NULL,'App\\Models\\Asset',1,NULL,NULL,'1978-02-16 03:07:32','2016-11-20 23:07:29',NULL,NULL,4,NULL),(4,41,'checkout',40,'App\\Models\\User',NULL,'Earum corrupti impedit ab sed placeat.',NULL,'App\\Models\\Asset',28,NULL,NULL,'2009-12-09 21:33:02','2016-11-20 23:07:29',NULL,NULL,4,NULL),(5,34,'checkout',34,'App\\Models\\User',NULL,'Exercitationem aut repellendus officiis impedit pariatur aut rerum.',NULL,'App\\Models\\Asset',4,NULL,NULL,'1978-12-03 19:18:58','2016-11-20 23:07:29',NULL,NULL,3,NULL),(6,29,'checkout',31,'App\\Models\\User',NULL,'Dolores nostrum deleniti laborum voluptatem quas eligendi iste et.',NULL,'App\\Models\\Asset',36,NULL,NULL,'2000-03-22 00:11:42','2016-11-20 23:07:29',NULL,NULL,2,NULL),(7,43,'checkout',44,'App\\Models\\User',NULL,'Voluptate et omnis omnis quidem impedit mollitia harum.',NULL,'App\\Models\\Asset',97,NULL,NULL,'2006-07-17 06:26:47','2016-11-20 23:07:29',NULL,NULL,1,NULL),(8,27,'checkout',27,'App\\Models\\User',NULL,'Aspernatur dolores non ab cum.',NULL,'App\\Models\\Asset',5,NULL,NULL,'2000-04-11 13:21:42','2016-11-20 23:07:29',NULL,NULL,2,NULL),(9,25,'checkout',32,'App\\Models\\User',NULL,'Et ipsa adipisci nisi beatae.',NULL,'App\\Models\\Asset',29,NULL,NULL,'1970-08-21 14:33:04','2016-11-20 23:07:29',NULL,NULL,1,NULL),(10,40,'checkout',36,'App\\Models\\User',NULL,'Non sunt architecto omnis delectus dolorem qui est.',NULL,'App\\Models\\Asset',40,NULL,NULL,'2003-01-07 19:51:30','2016-11-20 23:07:29',NULL,NULL,4,NULL),(11,24,'checkout',25,'App\\Models\\User',NULL,'Explicabo itaque eos dolor officia itaque labore ipsam.',NULL,'App\\Models\\Asset',48,NULL,NULL,'2013-12-15 02:06:16','2016-11-20 23:07:29',NULL,NULL,1,NULL),(12,40,'checkout',37,'App\\Models\\User',NULL,'Quibusdam minima quisquam veniam est repudiandae in.',NULL,'App\\Models\\Asset',49,NULL,NULL,'2000-04-10 18:27:00','2016-11-20 23:07:29',NULL,NULL,4,NULL),(13,34,'checkout',34,'App\\Models\\User',NULL,'Magnam consectetur ut unde omnis corporis perferendis.',NULL,'App\\Models\\Asset',83,NULL,NULL,'1994-12-22 15:29:46','2016-11-20 23:07:29',NULL,NULL,3,NULL),(14,34,'checkout',34,'App\\Models\\User',NULL,'Velit ut nam voluptates et et repellendus.',NULL,'App\\Models\\Asset',92,NULL,NULL,'1993-03-25 07:22:31','2016-11-20 23:07:29',NULL,NULL,3,NULL),(15,25,'checkout',24,'App\\Models\\User',NULL,'Totam quia modi voluptate soluta.',NULL,'App\\Models\\Asset',50,NULL,NULL,'1983-12-24 12:33:35','2016-11-20 23:07:30',NULL,NULL,1,NULL),(16,35,'checkout',44,'App\\Models\\User',NULL,'Quas occaecati necessitatibus distinctio.',NULL,'App\\Models\\Asset',84,NULL,NULL,'1999-02-04 03:31:56','2016-11-20 23:07:30',NULL,NULL,1,NULL),(17,42,'checkout',42,'App\\Models\\User',NULL,'Dolores aut recusandae aut deserunt magni non.',NULL,'App\\Models\\Asset',2,NULL,NULL,'2014-08-20 09:31:19','2016-11-20 23:07:30',NULL,NULL,3,NULL),(18,24,'checkout',24,'App\\Models\\User',NULL,'Officiis porro voluptatem placeat aut voluptas quis est.',NULL,'App\\Models\\Asset',60,NULL,NULL,'1993-10-15 18:56:40','2016-11-20 23:07:30',NULL,NULL,1,NULL),(19,43,'checkout',28,'App\\Models\\User',NULL,'Necessitatibus repellat itaque illo qui officiis aut non.',NULL,'App\\Models\\Asset',86,NULL,NULL,'1980-01-26 00:20:38','2016-11-20 23:07:30',NULL,NULL,1,NULL),(20,36,'checkout',41,'App\\Models\\User',NULL,'Vel nihil ut et vel et doloribus ut.',NULL,'App\\Models\\Asset',62,NULL,NULL,'2000-01-13 15:45:17','2016-11-20 23:07:30',NULL,NULL,4,NULL),(21,42,'checkout',30,'App\\Models\\User',NULL,'Reprehenderit porro tempore saepe nisi illum qui.',NULL,'App\\Models\\Asset',2,NULL,NULL,'2014-07-25 15:21:25','2016-11-20 23:07:30',NULL,NULL,3,NULL),(22,36,'checkout',36,'App\\Models\\User',NULL,'Totam corporis aut beatae voluptatem nihil labore nihil vero.',NULL,'App\\Models\\Asset',68,NULL,NULL,'2012-11-12 12:07:30','2016-11-20 23:07:30',NULL,NULL,4,NULL),(23,31,'checkout',39,'App\\Models\\User',NULL,'Repudiandae debitis molestias odio iste voluptatem eum.',NULL,'App\\Models\\Asset',23,NULL,NULL,'1975-01-11 12:34:13','2016-11-20 23:07:30',NULL,NULL,2,NULL),(24,30,'checkout',34,'App\\Models\\User',NULL,'Repellat nisi doloribus optio porro nisi magnam.',NULL,'App\\Models\\Asset',17,NULL,NULL,'2012-03-28 03:56:46','2016-11-20 23:07:30',NULL,NULL,3,NULL),(25,26,'checkout',29,'App\\Models\\User',NULL,'Excepturi sunt quo libero illum vitae.',NULL,'App\\Models\\Asset',10,NULL,NULL,'2009-11-25 08:36:11','2016-11-20 23:07:30',NULL,NULL,2,NULL),(26,43,'checkout',35,'App\\Models\\User',NULL,'Laborum quia molestiae totam quam sapiente aut quaerat fugit.',NULL,'App\\Models\\Accessory',4,NULL,NULL,'1986-03-15 09:45:58','2016-11-20 23:07:30',NULL,NULL,1,NULL),(27,31,'checkout',38,'App\\Models\\User',NULL,'Perspiciatis possimus est qui excepturi mollitia aspernatur animi.',NULL,'App\\Models\\Accessory',15,NULL,NULL,'2003-02-16 03:08:32','2016-11-20 23:07:30',NULL,NULL,2,NULL),(28,29,'checkout',31,'App\\Models\\User',NULL,'Ab unde dicta ut odit temporibus facilis.',NULL,'App\\Models\\Accessory',1,NULL,NULL,'1992-02-26 19:41:44','2016-11-20 23:07:30',NULL,NULL,2,NULL),(29,30,'checkout',34,'App\\Models\\User',NULL,'Vero qui iste ipsum ad labore.',NULL,'App\\Models\\Accessory',3,NULL,NULL,'1979-04-19 20:56:34','2016-11-20 23:07:30',NULL,NULL,3,NULL),(30,31,'checkout',29,'App\\Models\\User',NULL,'Dolorum nesciunt atque et iste quia doloremque quasi.',NULL,'App\\Models\\Accessory',10,NULL,NULL,'2007-10-14 11:53:40','2016-11-20 23:07:30',NULL,NULL,2,NULL),(31,24,'checkout',25,'App\\Models\\User',NULL,'Labore aliquid rerum rerum fugit impedit optio.',NULL,'App\\Models\\Accessory',4,NULL,NULL,'2014-05-17 04:23:16','2016-11-20 23:07:30',NULL,NULL,1,NULL),(32,40,'checkout',41,'App\\Models\\User',NULL,'Id et ducimus similique unde.',NULL,'App\\Models\\Accessory',6,NULL,NULL,'2012-03-19 12:34:56','2016-11-20 23:07:30',NULL,NULL,4,NULL),(33,42,'checkout',34,'App\\Models\\User',NULL,'Aliquid quisquam non quo nihil enim et.',NULL,'App\\Models\\Accessory',3,NULL,NULL,'2000-09-07 05:58:59','2016-11-20 23:07:30',NULL,NULL,3,NULL),(34,42,'checkout',42,'App\\Models\\User',NULL,'Rerum possimus voluptas voluptate sit ut incidunt et.',NULL,'App\\Models\\Accessory',3,NULL,NULL,'2003-08-10 04:47:44','2016-11-20 23:07:30',NULL,NULL,3,NULL),(35,30,'checkout',34,'App\\Models\\User',NULL,'Est rerum temporibus ratione voluptatem dolorem minus.',NULL,'App\\Models\\Accessory',11,NULL,NULL,'1974-01-18 19:02:43','2016-11-20 23:07:30',NULL,NULL,3,NULL),(36,44,'checkout',44,'App\\Models\\User',NULL,'Voluptatem harum et ea possimus et.',NULL,'App\\Models\\Accessory',4,NULL,NULL,'1978-03-20 15:07:44','2016-11-20 23:07:30',NULL,NULL,1,NULL),(37,29,'checkout',26,'App\\Models\\User',NULL,'Minima fugit voluptas in harum suscipit aut.',NULL,'App\\Models\\Accessory',12,NULL,NULL,'1973-05-25 22:49:02','2016-11-20 23:07:30',NULL,NULL,2,NULL),(38,40,'checkout',33,'App\\Models\\User',NULL,'Officiis non dolorem consequuntur.',NULL,'App\\Models\\Accessory',6,NULL,NULL,'2002-01-19 14:02:55','2016-11-20 23:07:30',NULL,NULL,4,NULL),(39,30,'checkout',34,'App\\Models\\User',NULL,'Quidem et deleniti temporibus aut consectetur ipsam id.',NULL,'App\\Models\\Accessory',7,NULL,NULL,'2012-03-04 15:45:00','2016-11-20 23:07:30',NULL,NULL,3,NULL),(40,30,'checkout',34,'App\\Models\\User',NULL,'Quia totam ratione aliquam animi aliquam at.',NULL,'App\\Models\\Accessory',11,NULL,NULL,'2014-07-15 00:14:16','2016-11-20 23:07:30',NULL,NULL,3,NULL),(41,30,'checkout',42,'App\\Models\\User',NULL,'Dolorem eius ipsum et omnis.',NULL,'App\\Models\\Consumable',10,NULL,NULL,'1970-04-18 03:14:14','2016-11-20 23:07:30',NULL,NULL,3,NULL),(42,43,'checkout',25,'App\\Models\\User',NULL,'Et qui veritatis tenetur.',NULL,'App\\Models\\Consumable',23,NULL,NULL,'1991-12-24 00:58:37','2016-11-20 23:07:30',NULL,NULL,1,NULL),(43,27,'checkout',27,'App\\Models\\User',NULL,'Voluptatem velit quo voluptatum illo.',NULL,'App\\Models\\Consumable',15,NULL,NULL,'1975-03-22 13:47:58','2016-11-20 23:07:30',NULL,NULL,2,NULL),(44,41,'checkout',40,'App\\Models\\User',NULL,'Nobis non sint nisi eligendi ut qui quo.',NULL,'App\\Models\\Consumable',16,NULL,NULL,'1987-05-18 08:21:45','2016-11-20 23:07:30',NULL,NULL,4,NULL),(45,44,'checkout',28,'App\\Models\\User',NULL,'Dolorum iste pariatur non molestias quo possimus aut qui.',NULL,'App\\Models\\Consumable',18,NULL,NULL,'1977-10-31 11:56:47','2016-11-20 23:07:30',NULL,NULL,1,NULL),(46,25,'checkout',24,'App\\Models\\User',NULL,'Nemo et inventore omnis ipsum et.',NULL,'App\\Models\\Consumable',2,NULL,NULL,'1972-09-01 04:51:50','2016-11-20 23:07:30',NULL,NULL,1,NULL),(47,33,'checkout',33,'App\\Models\\User',NULL,'Odio sunt beatae facere quae.',NULL,'App\\Models\\Consumable',3,NULL,NULL,'2010-07-02 14:17:15','2016-11-20 23:07:30',NULL,NULL,4,NULL),(48,27,'checkout',39,'App\\Models\\User',NULL,'Rerum eveniet dolor maiores earum.',NULL,'App\\Models\\Consumable',24,NULL,NULL,'1985-06-24 03:57:41','2016-11-20 23:07:30',NULL,NULL,2,NULL),(49,24,'checkout',25,'App\\Models\\User',NULL,'Unde delectus corporis ad provident assumenda molestias consequatur sint.',NULL,'App\\Models\\Consumable',18,NULL,NULL,'1990-10-16 14:04:14','2016-11-20 23:07:30',NULL,NULL,1,NULL),(50,41,'checkout',33,'App\\Models\\User',NULL,'Vero ea corrupti eius voluptatibus corporis iste officiis est.',NULL,'App\\Models\\Consumable',3,NULL,NULL,'1988-08-15 17:36:08','2016-11-20 23:07:30',NULL,NULL,4,NULL),(51,34,'checkout',34,'App\\Models\\User',NULL,'Et ad quaerat in commodi.',NULL,'App\\Models\\Consumable',14,NULL,NULL,'1970-04-02 22:05:18','2016-11-20 23:07:30',NULL,NULL,3,NULL),(52,27,'checkout',39,'App\\Models\\User',NULL,'Aliquam ut minus quis qui repellat placeat.',NULL,'App\\Models\\Consumable',1,NULL,NULL,'2005-06-21 04:36:35','2016-11-20 23:07:30',NULL,NULL,2,NULL),(53,27,'checkout',26,'App\\Models\\User',NULL,'Est provident dolorem est.',NULL,'App\\Models\\Consumable',24,NULL,NULL,'1998-08-11 04:12:32','2016-11-20 23:07:30',NULL,NULL,2,NULL),(54,38,'checkout',38,'App\\Models\\User',NULL,'Suscipit et corporis et impedit enim.',NULL,'App\\Models\\Consumable',9,NULL,NULL,'1973-03-25 08:34:15','2016-11-20 23:07:30',NULL,NULL,2,NULL),(55,29,'checkout',31,'App\\Models\\User',NULL,'Occaecati earum sed aspernatur ex pariatur assumenda fuga.',NULL,'App\\Models\\Consumable',17,NULL,NULL,'2006-03-24 14:39:34','2016-11-20 23:07:30',NULL,NULL,2,NULL),(56,24,'checkout',25,'App\\Models\\User',NULL,'Perspiciatis expedita voluptas iure facilis debitis sed.',NULL,'App\\Models\\Component',8,NULL,NULL,'2010-02-22 13:01:32','2016-11-20 23:07:30',NULL,NULL,1,NULL),(57,31,'checkout',27,'App\\Models\\User',NULL,'Quos enim in quidem et quia.',NULL,'App\\Models\\Component',5,NULL,NULL,'2002-01-19 19:08:11','2016-11-20 23:07:30',NULL,NULL,2,NULL),(58,35,'checkout',32,'App\\Models\\User',NULL,'Dolorem fugiat sapiente aut rem.',NULL,'App\\Models\\Component',9,NULL,NULL,'2004-02-02 02:21:13','2016-11-20 23:07:30',NULL,NULL,1,NULL),(59,40,'checkout',36,'App\\Models\\User',NULL,'Harum unde minus praesentium et.',NULL,'App\\Models\\Component',4,NULL,NULL,'1974-09-30 16:26:05','2016-11-20 23:07:30',NULL,NULL,4,NULL),(60,30,'checkout',34,'App\\Models\\User',NULL,'Et et et maxime laudantium nihil.',NULL,'App\\Models\\Component',3,NULL,NULL,'1977-09-08 05:22:06','2016-11-20 23:07:30',NULL,NULL,3,NULL),(61,35,'checkout',35,'App\\Models\\User',NULL,'Id iste id animi.',NULL,'App\\Models\\Component',9,NULL,NULL,'1971-04-06 04:16:29','2016-11-20 23:07:30',NULL,NULL,1,NULL),(62,24,'checkout',44,'App\\Models\\User',NULL,'Optio laborum sint delectus sint porro consequuntur.',NULL,'App\\Models\\Component',10,NULL,NULL,'1976-07-02 09:12:21','2016-11-20 23:07:30',NULL,NULL,1,NULL),(63,26,'checkout',26,'App\\Models\\User',NULL,'Recusandae eum porro id.',NULL,'App\\Models\\Component',5,NULL,NULL,'2016-03-06 02:09:25','2016-11-20 23:07:30',NULL,NULL,2,NULL),(64,37,'checkout',33,'App\\Models\\User',NULL,'Aut voluptas facilis reprehenderit ut consectetur.',NULL,'App\\Models\\Component',4,NULL,NULL,'1994-03-25 08:16:58','2016-11-20 23:07:30',NULL,NULL,4,NULL),(65,42,'checkout',30,'App\\Models\\User',NULL,'Mollitia et officiis iste id quis sint.',NULL,'App\\Models\\Component',3,NULL,NULL,'2001-10-12 06:59:58','2016-11-20 23:07:30',NULL,NULL,3,NULL),(66,29,'checkout',29,'App\\Models\\User',NULL,'Eos aliquid maxime et ea porro et.',NULL,'App\\Models\\Component',6,NULL,NULL,'2013-08-26 01:44:47','2016-11-20 23:07:30',NULL,NULL,2,NULL),(67,30,'checkout',42,'App\\Models\\User',NULL,'Maxime quibusdam sed fugiat ex.',NULL,'App\\Models\\Component',3,NULL,NULL,'1987-01-17 04:30:12','2016-11-20 23:07:30',NULL,NULL,3,NULL),(68,37,'checkout',41,'App\\Models\\User',NULL,'Ea et tempora magni nam sit consequatur.',NULL,'App\\Models\\Component',2,NULL,NULL,'2005-12-08 16:20:24','2016-11-20 23:07:30',NULL,NULL,4,NULL),(69,42,'checkout',34,'App\\Models\\User',NULL,'Reiciendis hic dicta labore saepe quia dolore minus.',NULL,'App\\Models\\Component',3,NULL,NULL,'1984-03-22 03:00:37','2016-11-20 23:07:30',NULL,NULL,3,NULL),(70,40,'checkout',33,'App\\Models\\User',NULL,'Consequatur dolor iste quidem rerum perspiciatis quisquam.',NULL,'App\\Models\\Component',2,NULL,NULL,'2015-09-15 22:36:44','2016-11-20 23:07:30',NULL,NULL,4,NULL),(71,41,'checkout',41,'App\\Models\\Asset',NULL,'Mollitia nulla incidunt autem non veritatis culpa ipsum.',NULL,'App\\Models\\License',7,NULL,NULL,'1974-07-30 00:54:19','2016-11-20 23:07:30',NULL,NULL,4,NULL),(72,41,'checkout',47,'App\\Models\\Asset',NULL,'Eos aut reiciendis eaque quam.',NULL,'App\\Models\\License',7,NULL,NULL,'1985-08-02 17:10:38','2016-11-20 23:07:30',NULL,NULL,4,NULL),(73,33,'checkout',1,'App\\Models\\Asset',NULL,'Quas nobis culpa nihil at.',NULL,'App\\Models\\License',4,NULL,NULL,'1999-11-08 18:13:14','2016-11-20 23:07:30',NULL,NULL,4,NULL),(74,30,'checkout',42,'App\\Models\\Asset',NULL,'Est quis quo ipsa vel repudiandae.',NULL,'App\\Models\\License',1,NULL,NULL,'2016-11-03 21:47:29','2016-11-20 23:07:30',NULL,NULL,3,NULL),(75,37,'checkout',68,'App\\Models\\Asset',NULL,'Nihil ut eos omnis est consequatur eum.',NULL,'App\\Models\\License',7,NULL,NULL,'1971-06-15 04:38:12','2016-11-20 23:07:30',NULL,NULL,4,NULL),(76,27,'checkout',100,'App\\Models\\Asset',NULL,'Quod perferendis aliquid temporibus ut aut.',NULL,'App\\Models\\License',3,NULL,NULL,'1974-12-18 16:59:54','2016-11-20 23:07:30',NULL,NULL,2,NULL),(77,42,'checkout',96,'App\\Models\\Asset',NULL,'Et aspernatur provident excepturi.',NULL,'App\\Models\\License',1,NULL,NULL,'1975-08-09 17:31:54','2016-11-20 23:07:30',NULL,NULL,3,NULL),(78,40,'checkout',38,'App\\Models\\Asset',NULL,'Quia et quasi sint perspiciatis voluptate fugit.',NULL,'App\\Models\\License',7,NULL,NULL,'1976-07-21 10:51:54','2016-11-20 23:07:30',NULL,NULL,4,NULL),(79,35,'checkout',98,'App\\Models\\Asset',NULL,'Laborum est eos porro nihil in.',NULL,'App\\Models\\License',5,NULL,NULL,'2011-02-04 03:40:05','2016-11-20 23:07:30',NULL,NULL,1,NULL),(80,30,'checkout',92,'App\\Models\\Asset',NULL,'Architecto enim officiis accusamus asperiores dolorem sequi.',NULL,'App\\Models\\License',1,NULL,NULL,'2002-05-25 16:02:39','2016-11-20 23:07:30',NULL,NULL,3,NULL),(81,42,'checkout',92,'App\\Models\\Asset',NULL,'Adipisci cum totam nostrum dolorem aut velit.',NULL,'App\\Models\\License',1,NULL,NULL,'2003-04-11 12:01:28','2016-11-20 23:07:30',NULL,NULL,3,NULL),(82,38,'checkout',6,'App\\Models\\Asset',NULL,'Repudiandae sit qui est aut est.',NULL,'App\\Models\\License',10,NULL,NULL,'1997-03-20 06:55:10','2016-11-20 23:07:30',NULL,NULL,2,NULL),(83,42,'checkout',31,'App\\Models\\Asset',NULL,'Voluptates quia temporibus aut quia sequi.',NULL,'App\\Models\\License',1,NULL,NULL,'1979-07-30 22:23:20','2016-11-20 23:07:30',NULL,NULL,3,NULL),(84,26,'checkout',37,'App\\Models\\Asset',NULL,'Sit ut expedita quo aperiam iure.',NULL,'App\\Models\\License',6,NULL,NULL,'1976-03-26 22:44:34','2016-11-20 23:07:30',NULL,NULL,2,NULL),(85,37,'checkout',8,'App\\Models\\Asset',NULL,'Quo nihil non voluptatem omnis omnis ut et.',NULL,'App\\Models\\License',8,NULL,NULL,'2004-06-22 07:53:01','2016-11-20 23:07:30',NULL,NULL,4,NULL),(86,1,'created',NULL,NULL,NULL,NULL,NULL,'App\\Models\\Accessory',16,NULL,NULL,'2016-11-21 00:33:26','2016-11-21 00:33:26',NULL,NULL,4,NULL),(87,1,'created',NULL,NULL,NULL,NULL,NULL,'App\\Models\\Asset',101,NULL,NULL,'2016-11-21 00:33:30','2016-11-21 00:33:30',NULL,NULL,2,NULL),(88,1,'checkout',20,'App\\Models\\User',NULL,'Checked out on asset creation',NULL,'App\\Models\\Asset',101,NULL,NULL,'2016-11-21 00:33:30','2016-11-21 00:33:30',NULL,NULL,NULL,NULL),(89,1,'created',NULL,NULL,NULL,NULL,NULL,'App\\Models\\Component',11,NULL,NULL,'2016-11-21 00:33:36','2016-11-21 00:33:36',NULL,NULL,2,NULL),(90,1,'created',NULL,NULL,NULL,NULL,NULL,'App\\Models\\Consumable',26,NULL,NULL,'2016-11-21 00:33:39','2016-11-21 00:33:39',NULL,NULL,2,NULL),(91,1,'created',NULL,NULL,NULL,NULL,NULL,'App\\Models\\License',11,NULL,NULL,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL,4,NULL);
        +INSERT INTO `action_logs` VALUES (1,24,'checkout',24,'App\\Models\\User',NULL,'Vel vel commodi optio.',NULL,'App\\Models\\Asset',73,NULL,NULL,'1995-05-10 01:17:29','2016-12-19 21:50:33',NULL,NULL,6,NULL),(2,27,'checkout',27,'App\\Models\\User',NULL,'Porro sapiente impedit accusamus nemo eum.',NULL,'App\\Models\\Asset',91,NULL,NULL,'1975-11-15 05:12:56','2016-12-19 21:50:33',NULL,NULL,9,NULL),(3,26,'checkout',26,'App\\Models\\User',NULL,'Nobis voluptas voluptate rem velit.',NULL,'App\\Models\\Asset',72,NULL,NULL,'2010-04-08 09:14:12','2016-12-19 21:50:33',NULL,NULL,8,NULL),(4,23,'checkout',23,'App\\Models\\User',NULL,'Est alias non vitae cum sequi eveniet inventore.',NULL,'App\\Models\\Asset',48,NULL,NULL,'1988-04-25 12:07:21','2016-12-19 21:50:33',NULL,NULL,5,NULL),(5,31,'checkout',31,'App\\Models\\User',NULL,'Incidunt architecto consequatur excepturi impedit.',NULL,'App\\Models\\Asset',37,NULL,NULL,'1983-03-30 03:15:07','2016-12-19 21:50:33',NULL,NULL,13,NULL),(6,25,'checkout',25,'App\\Models\\User',NULL,'Dicta enim sed inventore deserunt maxime.',NULL,'App\\Models\\Asset',69,NULL,NULL,'1970-02-05 04:54:45','2016-12-19 21:50:33',NULL,NULL,7,NULL),(7,25,'checkout',25,'App\\Models\\User',NULL,'Voluptatem quod dolor possimus laudantium sunt.',NULL,'App\\Models\\Asset',69,NULL,NULL,'2012-11-07 14:29:14','2016-12-19 21:50:33',NULL,NULL,7,NULL),(8,26,'checkout',26,'App\\Models\\User',NULL,'Id molestiae illum odit ut beatae alias cupiditate.',NULL,'App\\Models\\Asset',17,NULL,NULL,'2000-03-14 21:08:49','2016-12-19 21:50:33',NULL,NULL,8,NULL),(9,30,'checkout',30,'App\\Models\\User',NULL,'Et corporis voluptates consectetur sunt.',NULL,'App\\Models\\Asset',68,NULL,NULL,'1972-07-24 22:55:24','2016-12-19 21:50:33',NULL,NULL,12,NULL),(10,24,'checkout',24,'App\\Models\\User',NULL,'Explicabo et alias hic sed itaque nobis.',NULL,'App\\Models\\Asset',30,NULL,NULL,'2016-01-09 03:44:45','2016-12-19 21:50:33',NULL,NULL,6,NULL),(11,31,'checkout',31,'App\\Models\\User',NULL,'Molestias enim velit aliquam similique fugiat error voluptatem.',NULL,'App\\Models\\Asset',87,NULL,NULL,'2015-11-08 07:26:48','2016-12-19 21:50:33',NULL,NULL,13,NULL),(12,31,'checkout',31,'App\\Models\\User',NULL,'Et illo saepe et fugiat est.',NULL,'App\\Models\\Asset',9,NULL,NULL,'2001-10-10 05:22:36','2016-12-19 21:50:33',NULL,NULL,13,NULL),(13,27,'checkout',27,'App\\Models\\User',NULL,'Et est exercitationem itaque id.',NULL,'App\\Models\\Asset',63,NULL,NULL,'1994-05-10 00:38:33','2016-12-19 21:50:33',NULL,NULL,9,NULL),(14,31,'checkout',31,'App\\Models\\User',NULL,'Consequatur tenetur voluptate voluptatem ducimus.',NULL,'App\\Models\\Asset',87,NULL,NULL,'2014-09-28 04:11:04','2016-12-19 21:50:33',NULL,NULL,13,NULL),(15,23,'checkout',23,'App\\Models\\User',NULL,'Est esse maiores expedita qui dolorum.',NULL,'App\\Models\\Asset',35,NULL,NULL,'1993-11-26 19:17:32','2016-12-19 21:50:33',NULL,NULL,5,NULL),(16,27,'checkout',27,'App\\Models\\User',NULL,'Quae sit dolor optio quis et sit dolores eaque.',NULL,'App\\Models\\Asset',63,NULL,NULL,'1975-02-20 03:56:26','2016-12-19 21:50:33',NULL,NULL,9,NULL),(17,25,'checkout',25,'App\\Models\\User',NULL,'Iste culpa et harum est.',NULL,'App\\Models\\Asset',47,NULL,NULL,'2007-03-29 18:02:31','2016-12-19 21:50:33',NULL,NULL,7,NULL),(18,25,'checkout',25,'App\\Models\\User',NULL,'Et et doloribus rerum perspiciatis nihil.',NULL,'App\\Models\\Asset',47,NULL,NULL,'2008-07-06 13:46:10','2016-12-19 21:50:33',NULL,NULL,7,NULL),(19,28,'checkout',28,'App\\Models\\User',NULL,'Aut fuga magnam excepturi omnis.',NULL,'App\\Models\\Asset',54,NULL,NULL,'2005-12-20 04:13:13','2016-12-19 21:50:33',NULL,NULL,10,NULL),(20,31,'checkout',31,'App\\Models\\User',NULL,'Vel porro voluptatem maiores quod.',NULL,'App\\Models\\Asset',37,NULL,NULL,'1986-05-04 02:57:58','2016-12-19 21:50:33',NULL,NULL,13,NULL),(21,30,'checkout',30,'App\\Models\\User',NULL,'Nulla reiciendis temporibus ab repudiandae magni dolores.',NULL,'App\\Models\\Asset',1,NULL,NULL,'2015-06-15 02:40:58','2016-12-19 21:50:33',NULL,NULL,12,NULL),(22,30,'checkout',30,'App\\Models\\User',NULL,'Dolores unde temporibus magni dolorum voluptas enim.',NULL,'App\\Models\\Asset',1,NULL,NULL,'1978-09-20 04:58:31','2016-12-19 21:50:33',NULL,NULL,12,NULL),(23,30,'checkout',30,'App\\Models\\User',NULL,'Sed quia natus dolores vel ducimus ut beatae qui.',NULL,'App\\Models\\Asset',68,NULL,NULL,'1986-01-13 08:51:15','2016-12-19 21:50:33',NULL,NULL,12,NULL),(24,23,'checkout',23,'App\\Models\\User',NULL,'Delectus fugiat exercitationem est totam.',NULL,'App\\Models\\Asset',81,NULL,NULL,'2011-03-07 09:37:29','2016-12-19 21:50:33',NULL,NULL,5,NULL),(25,32,'checkout',32,'App\\Models\\User',NULL,'Et architecto suscipit nesciunt et voluptatem veritatis.',NULL,'App\\Models\\Asset',86,NULL,NULL,'1974-06-10 05:56:36','2016-12-19 21:50:33',NULL,NULL,14,NULL),(26,30,'checkout',30,'App\\Models\\User',NULL,'Tempora rem nisi cumque dicta sunt.',NULL,'App\\Models\\Accessory',7,NULL,NULL,'1974-10-15 03:43:14','2016-12-19 21:50:33',NULL,NULL,12,NULL),(27,24,'checkout',24,'App\\Models\\User',NULL,'Impedit laboriosam neque voluptas vel quia sequi aspernatur.',NULL,'App\\Models\\Accessory',6,NULL,NULL,'2014-08-27 16:35:28','2016-12-19 21:50:33',NULL,NULL,6,NULL),(28,26,'checkout',26,'App\\Models\\User',NULL,'Ut ea omnis repellat qui dicta consequuntur non.',NULL,'App\\Models\\Accessory',13,NULL,NULL,'1981-04-30 14:57:50','2016-12-19 21:50:33',NULL,NULL,8,NULL),(29,32,'checkout',32,'App\\Models\\User',NULL,'Ullam assumenda dolores veniam in sequi id voluptas possimus.',NULL,'App\\Models\\Accessory',14,NULL,NULL,'2008-06-03 04:54:41','2016-12-19 21:50:33',NULL,NULL,14,NULL),(30,25,'checkout',25,'App\\Models\\User',NULL,'Ea et repellendus fugiat aperiam sit ea repudiandae.',NULL,'App\\Models\\Accessory',12,NULL,NULL,'2004-08-11 00:47:29','2016-12-19 21:50:33',NULL,NULL,7,NULL),(31,24,'checkout',24,'App\\Models\\User',NULL,'Velit ad excepturi aut beatae.',NULL,'App\\Models\\Accessory',6,NULL,NULL,'1998-06-23 20:01:36','2016-12-19 21:50:33',NULL,NULL,6,NULL),(32,25,'checkout',25,'App\\Models\\User',NULL,'Quis nisi consequatur laudantium et.',NULL,'App\\Models\\Accessory',12,NULL,NULL,'1980-07-26 06:18:01','2016-12-19 21:50:33',NULL,NULL,7,NULL),(33,26,'checkout',26,'App\\Models\\User',NULL,'Omnis quia minima ipsum.',NULL,'App\\Models\\Accessory',13,NULL,NULL,'1986-03-17 11:20:43','2016-12-19 21:50:33',NULL,NULL,8,NULL),(34,24,'checkout',24,'App\\Models\\User',NULL,'Id sunt et praesentium eligendi voluptates vel ut.',NULL,'App\\Models\\Accessory',6,NULL,NULL,'1971-06-04 14:41:28','2016-12-19 21:50:33',NULL,NULL,6,NULL),(35,28,'checkout',28,'App\\Models\\User',NULL,'Sint libero odio non veniam commodi.',NULL,'App\\Models\\Accessory',4,NULL,NULL,'2007-07-02 12:21:13','2016-12-19 21:50:33',NULL,NULL,10,NULL),(36,26,'checkout',26,'App\\Models\\User',NULL,'Quibusdam officiis cupiditate velit iure eos ut.',NULL,'App\\Models\\Accessory',13,NULL,NULL,'2007-06-30 02:35:23','2016-12-19 21:50:33',NULL,NULL,8,NULL),(37,32,'checkout',32,'App\\Models\\User',NULL,'Consequuntur accusamus cum quo sunt repudiandae fugiat.',NULL,'App\\Models\\Accessory',15,NULL,NULL,'1973-06-05 18:46:12','2016-12-19 21:50:33',NULL,NULL,14,NULL),(38,27,'checkout',27,'App\\Models\\User',NULL,'Temporibus et sapiente quaerat ea ut animi et iure.',NULL,'App\\Models\\Accessory',8,NULL,NULL,'1990-03-07 22:36:15','2016-12-19 21:50:33',NULL,NULL,9,NULL),(39,24,'checkout',24,'App\\Models\\User',NULL,'Veniam eligendi accusamus officiis non.',NULL,'App\\Models\\Accessory',6,NULL,NULL,'1982-10-23 03:19:36','2016-12-19 21:50:33',NULL,NULL,6,NULL),(40,27,'checkout',27,'App\\Models\\User',NULL,'Qui non vel eaque.',NULL,'App\\Models\\Accessory',8,NULL,NULL,'1978-11-18 21:01:26','2016-12-19 21:50:33',NULL,NULL,9,NULL),(41,24,'checkout',24,'App\\Models\\User',NULL,'Illo qui earum ut maxime commodi ullam.',NULL,'App\\Models\\Consumable',17,NULL,NULL,'1994-11-09 00:38:45','2016-12-19 21:50:33',NULL,NULL,6,NULL),(42,25,'checkout',25,'App\\Models\\User',NULL,'Omnis veniam mollitia doloribus laborum consequuntur voluptatibus.',NULL,'App\\Models\\Consumable',10,NULL,NULL,'1985-06-20 18:36:29','2016-12-19 21:50:33',NULL,NULL,7,NULL),(43,26,'checkout',26,'App\\Models\\User',NULL,'Expedita consectetur eum adipisci.',NULL,'App\\Models\\Consumable',21,NULL,NULL,'1975-12-15 03:41:45','2016-12-19 21:50:33',NULL,NULL,8,NULL),(44,32,'checkout',32,'App\\Models\\User',NULL,'Repellendus tempore et magnam consequuntur ut saepe ipsa explicabo.',NULL,'App\\Models\\Consumable',11,NULL,NULL,'2005-08-11 15:44:56','2016-12-19 21:50:33',NULL,NULL,14,NULL),(45,25,'checkout',25,'App\\Models\\User',NULL,'Excepturi in et eum corporis earum sit.',NULL,'App\\Models\\Consumable',10,NULL,NULL,'1998-06-09 10:14:09','2016-12-19 21:50:33',NULL,NULL,7,NULL),(46,24,'checkout',24,'App\\Models\\User',NULL,'Dolor voluptatum officiis non et.',NULL,'App\\Models\\Consumable',17,NULL,NULL,'1988-12-14 06:06:08','2016-12-19 21:50:33',NULL,NULL,6,NULL),(47,23,'checkout',23,'App\\Models\\User',NULL,'Vel eveniet et dolorem incidunt corporis.',NULL,'App\\Models\\Consumable',14,NULL,NULL,'1983-03-27 19:44:57','2016-12-19 21:50:33',NULL,NULL,5,NULL),(48,24,'checkout',24,'App\\Models\\User',NULL,'Doloremque consequatur eveniet ratione sint.',NULL,'App\\Models\\Consumable',17,NULL,NULL,'1984-12-25 02:37:48','2016-12-19 21:50:33',NULL,NULL,6,NULL),(49,28,'checkout',28,'App\\Models\\User',NULL,'Facilis dicta voluptas molestiae aspernatur.',NULL,'App\\Models\\Consumable',20,NULL,NULL,'1993-11-04 18:16:37','2016-12-19 21:50:33',NULL,NULL,10,NULL),(50,31,'checkout',31,'App\\Models\\User',NULL,'Recusandae sed nemo aspernatur quas dolores earum ab ut.',NULL,'App\\Models\\Consumable',13,NULL,NULL,'1981-09-20 00:52:40','2016-12-19 21:50:33',NULL,NULL,13,NULL),(51,27,'checkout',27,'App\\Models\\User',NULL,'Et non libero ut ipsam repellendus rerum.',NULL,'App\\Models\\Consumable',22,NULL,NULL,'1972-10-05 10:05:57','2016-12-19 21:50:33',NULL,NULL,9,NULL),(52,28,'checkout',28,'App\\Models\\User',NULL,'Nobis porro sit aut non nihil.',NULL,'App\\Models\\Consumable',20,NULL,NULL,'1995-10-22 21:04:16','2016-12-19 21:50:33',NULL,NULL,10,NULL),(53,28,'checkout',28,'App\\Models\\User',NULL,'Esse consequatur totam est sit.',NULL,'App\\Models\\Consumable',20,NULL,NULL,'1996-02-04 19:03:51','2016-12-19 21:50:33',NULL,NULL,10,NULL),(54,29,'checkout',29,'App\\Models\\User',NULL,'Esse aut et laborum illum accusamus.',NULL,'App\\Models\\Consumable',5,NULL,NULL,'1984-10-03 10:34:17','2016-12-19 21:50:33',NULL,NULL,11,NULL),(55,24,'checkout',24,'App\\Models\\User',NULL,'Saepe et sed ducimus veniam maiores et.',NULL,'App\\Models\\Consumable',18,NULL,NULL,'1985-09-08 07:51:31','2016-12-19 21:50:33',NULL,NULL,6,NULL),(56,30,'checkout',30,'App\\Models\\User',NULL,'Tenetur vel et et ab sequi qui molestias ut.',NULL,'App\\Models\\Component',8,NULL,NULL,'2004-02-05 06:50:03','2016-12-19 21:50:33',NULL,NULL,12,NULL),(57,31,'checkout',31,'App\\Models\\User',NULL,'Quia repellendus rerum voluptatum ipsum.',NULL,'App\\Models\\Component',6,NULL,NULL,'1987-12-04 11:47:41','2016-12-19 21:50:33',NULL,NULL,13,NULL),(58,32,'checkout',32,'App\\Models\\User',NULL,'Velit repudiandae aut laboriosam voluptatibus repellendus cum.',NULL,'App\\Models\\Component',1,NULL,NULL,'2000-07-07 13:44:09','2016-12-19 21:50:33',NULL,NULL,14,NULL),(59,24,'checkout',24,'App\\Models\\User',NULL,'Reprehenderit cum consequuntur consequatur repellendus.',NULL,'App\\Models\\Component',7,NULL,NULL,'1991-03-10 23:23:04','2016-12-19 21:50:33',NULL,NULL,6,NULL),(60,24,'checkout',24,'App\\Models\\User',NULL,'Consequatur ut qui animi asperiores.',NULL,'App\\Models\\Component',7,NULL,NULL,'2005-03-12 14:09:19','2016-12-19 21:50:33',NULL,NULL,6,NULL),(61,31,'checkout',31,'App\\Models\\User',NULL,'Unde laboriosam aut in.',NULL,'App\\Models\\Component',6,NULL,NULL,'1984-04-14 18:22:36','2016-12-19 21:50:33',NULL,NULL,13,NULL),(62,32,'checkout',32,'App\\Models\\User',NULL,'Culpa est corrupti totam quia illum maiores.',NULL,'App\\Models\\Component',1,NULL,NULL,'1972-02-27 23:08:45','2016-12-19 21:50:33',NULL,NULL,14,NULL),(63,24,'checkout',24,'App\\Models\\User',NULL,'Officiis nulla ex quas vero quo necessitatibus dolores.',NULL,'App\\Models\\Component',7,NULL,NULL,'1989-10-18 17:45:26','2016-12-19 21:50:33',NULL,NULL,6,NULL),(64,29,'checkout',29,'App\\Models\\User',NULL,'Non aut voluptatem impedit cumque quia a.',NULL,'App\\Models\\Component',10,NULL,NULL,'1970-03-18 02:34:24','2016-12-19 21:50:33',NULL,NULL,11,NULL),(65,30,'checkout',30,'App\\Models\\User',NULL,'Voluptatem porro omnis officiis eius suscipit.',NULL,'App\\Models\\Component',4,NULL,NULL,'1979-02-25 12:15:40','2016-12-19 21:50:33',NULL,NULL,12,NULL),(66,29,'checkout',29,'App\\Models\\User',NULL,'Et dignissimos aperiam quod quis architecto sed.',NULL,'App\\Models\\Component',10,NULL,NULL,'1974-05-16 12:29:54','2016-12-19 21:50:33',NULL,NULL,11,NULL),(67,24,'checkout',24,'App\\Models\\User',NULL,'Molestiae nemo quidem odio culpa aut ut.',NULL,'App\\Models\\Component',7,NULL,NULL,'2011-11-28 06:56:33','2016-12-19 21:50:33',NULL,NULL,6,NULL),(68,29,'checkout',29,'App\\Models\\User',NULL,'Quia libero minus aliquid porro soluta.',NULL,'App\\Models\\Component',10,NULL,NULL,'2015-08-18 17:31:40','2016-12-19 21:50:33',NULL,NULL,11,NULL),(69,29,'checkout',29,'App\\Models\\User',NULL,'Occaecati animi deserunt est quaerat nam ut aliquam.',NULL,'App\\Models\\Component',10,NULL,NULL,'1989-05-18 06:08:46','2016-12-19 21:50:33',NULL,NULL,11,NULL),(70,32,'checkout',32,'App\\Models\\User',NULL,'Ut expedita cumque culpa blanditiis quia.',NULL,'App\\Models\\Component',1,NULL,NULL,'1981-12-16 17:31:14','2016-12-19 21:50:33',NULL,NULL,14,NULL),(71,31,'checkout',87,'App\\Models\\Asset',NULL,'Ut animi earum delectus aperiam.',NULL,'App\\Models\\License',3,NULL,NULL,'1989-02-13 12:10:30','2016-12-19 21:50:33',NULL,NULL,13,NULL),(72,24,'checkout',34,'App\\Models\\Asset',NULL,'In maxime nam asperiores qui magnam.',NULL,'App\\Models\\License',7,NULL,NULL,'2007-06-29 01:57:24','2016-12-19 21:50:33',NULL,NULL,6,NULL),(73,24,'checkout',30,'App\\Models\\Asset',NULL,'Esse consequuntur numquam ipsam soluta eveniet porro.',NULL,'App\\Models\\License',7,NULL,NULL,'1975-01-20 12:21:57','2016-12-19 21:50:33',NULL,NULL,6,NULL),(74,24,'checkout',25,'App\\Models\\Asset',NULL,'Quis alias qui sed ad sunt cum ea.',NULL,'App\\Models\\License',7,NULL,NULL,'2016-03-06 03:19:52','2016-12-19 21:50:33',NULL,NULL,6,NULL),(75,32,'checkout',88,'App\\Models\\Asset',NULL,'Ipsam sit qui explicabo dolor neque rerum in.',NULL,'App\\Models\\License',6,NULL,NULL,'2015-04-07 18:35:31','2016-12-19 21:50:33',NULL,NULL,14,NULL),(76,32,'checkout',31,'App\\Models\\Asset',NULL,'Eum vero voluptas eveniet vel nihil.',NULL,'App\\Models\\License',6,NULL,NULL,'1971-04-10 08:02:47','2016-12-19 21:50:33',NULL,NULL,14,NULL),(77,25,'checkout',12,'App\\Models\\Asset',NULL,'Labore quidem consequuntur quidem ipsa nulla eaque cum.',NULL,'App\\Models\\License',5,NULL,NULL,'1980-12-04 22:01:56','2016-12-19 21:50:33',NULL,NULL,7,NULL),(78,23,'checkout',24,'App\\Models\\Asset',NULL,'Incidunt eligendi nisi quod fuga.',NULL,'App\\Models\\License',9,NULL,NULL,'1998-11-15 03:15:00','2016-12-19 21:50:33',NULL,NULL,5,NULL),(79,31,'checkout',70,'App\\Models\\Asset',NULL,'Provident architecto est quasi voluptatibus placeat.',NULL,'App\\Models\\License',3,NULL,NULL,'1988-08-31 21:01:43','2016-12-19 21:50:33',NULL,NULL,13,NULL),(80,31,'checkout',70,'App\\Models\\Asset',NULL,'Occaecati sed magnam omnis quos corporis sed quis.',NULL,'App\\Models\\License',3,NULL,NULL,'2011-06-09 04:25:21','2016-12-19 21:50:33',NULL,NULL,13,NULL),(81,31,'checkout',70,'App\\Models\\Asset',NULL,'Omnis est architecto esse totam itaque quia.',NULL,'App\\Models\\License',3,NULL,NULL,'1982-07-20 06:59:37','2016-12-19 21:50:33',NULL,NULL,13,NULL),(82,24,'checkout',84,'App\\Models\\Asset',NULL,'Ut placeat magni similique dolor qui et sit pariatur.',NULL,'App\\Models\\License',7,NULL,NULL,'2006-04-20 06:44:28','2016-12-19 21:50:33',NULL,NULL,6,NULL),(83,26,'checkout',62,'App\\Models\\Asset',NULL,'Sint ab et et hic tempora ut omnis.',NULL,'App\\Models\\License',2,NULL,NULL,'1988-04-09 22:43:53','2016-12-19 21:50:33',NULL,NULL,8,NULL),(84,25,'checkout',47,'App\\Models\\Asset',NULL,'Ipsam quibusdam debitis dignissimos est optio et explicabo culpa.',NULL,'App\\Models\\License',5,NULL,NULL,'2000-08-06 04:38:43','2016-12-19 21:50:33',NULL,NULL,7,NULL),(85,32,'checkout',79,'App\\Models\\Asset',NULL,'Veniam tempora rerum vero dolorum.',NULL,'App\\Models\\License',6,NULL,NULL,'1975-05-03 23:05:42','2016-12-19 21:50:33',NULL,NULL,14,NULL);
         /*!40000 ALTER TABLE `action_logs` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -263,8 +263,9 @@ CREATE TABLE `assets` (
           `last_checkout` datetime DEFAULT NULL,
           `expected_checkin` date DEFAULT NULL,
           `company_id` int(10) unsigned DEFAULT NULL,
        +  `assigned_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -273,7 +274,7 @@ CREATE TABLE `assets` (
         
         LOCK TABLES `assets` WRITE;
         /*!40000 ALTER TABLE `assets` DISABLE KEYS */;
        -INSERT INTO `assets` VALUES (1,'Sharable contextually-based function','310455216',4,'de8ec8cb-387d-3861-accf-031a26b6da4b','1989-11-14',NULL,'3452948',NULL,'Error quas error libero suscipit qui hic non.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,0,1,NULL,NULL,NULL,NULL,4),(2,'Digitized didactic capacity','842399003',5,'c579659e-e6df-3f21-8b32-f2e5e60cb960','1975-02-19',NULL,'5783754',NULL,'Quibusdam consectetur sunt perspiciatis error.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,4,NULL,NULL,NULL,NULL,3),(3,'Enhanced executive groupware','990185629',1,'8e09a1b5-ecf1-3ea0-b045-f51fb5631fb8','1971-07-19',NULL,'24388545',NULL,'Doloremque labore quos excepturi est accusamus at cumque a.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,0,3,NULL,NULL,NULL,NULL,1),(4,'Customer-focused intangible complexity','546752914',4,'82ea2c28-c182-3c5d-b370-4c8c66b96d02','2000-11-27',NULL,'34470480',NULL,'Assumenda consequatur dolores quo commodi.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,4,NULL,NULL,NULL,NULL,3),(5,'Configurable client-driven support','212535141',1,'5efd5c23-b151-3a8b-87e3-4d3479571ba4','1988-09-22',NULL,'3328283',NULL,'Ad est quidem aliquam quae voluptatem nam.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,5,NULL,NULL,NULL,NULL,2),(6,'User-centric static toolset','411277269',5,'e82002a4-450c-3ff2-9568-71e7e5b67b36','1972-05-18',NULL,'3971980',NULL,'Ducimus quasi sed quis eius unde.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,0,3,NULL,NULL,NULL,NULL,2),(7,'Virtual neutral monitoring','1172159860',4,'0a7a05c7-8b7b-3896-aa26-418dbc5f56ef','1985-11-20',NULL,'10377281',NULL,'Necessitatibus est et nam doloremque impedit enim libero qui.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,5,NULL,NULL,NULL,NULL,1),(8,'Monitored mission-critical time-frame','298965372',2,'7c5cd287-32b1-30f5-979d-d50b24411c35','2000-01-03',NULL,'25514597',NULL,'Aut harum dignissimos quia officia ipsum qui corporis laudantium.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,1,2,NULL,NULL,NULL,NULL,4),(9,'Upgradable background structure','1040526590',4,'0c973af0-7192-39af-8d15-61df89c44516','2007-09-13',NULL,'3935957',NULL,'Distinctio quia quod adipisci sunt.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,2),(10,'Facetoface holistic task-force','820364496',3,'85e0b99c-9e20-3fa4-8fbc-b03c947496cf','1992-05-08',NULL,'40804751',NULL,'Quo velit fuga occaecati quia.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,0,5,NULL,NULL,NULL,NULL,2),(11,'Team-oriented holistic service-desk','993520225',1,'e6641a5d-34d5-318e-b4e0-a6c56c460194','1978-10-13',NULL,'8692167',NULL,'Eum et voluptate omnis.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,0,2,NULL,NULL,NULL,NULL,3),(12,'Configurable heuristic capability','925029102',5,'5bc69980-51fa-35bf-8dd4-18397ca99282','1998-02-05',NULL,'31551001',NULL,'Praesentium et autem quis minima neque enim enim.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,0,2,NULL,NULL,NULL,NULL,4),(13,'Expanded systemic forecast','1194379470',1,'52cbe397-fdcf-3502-9d05-fcb291bbc7a9','1976-09-12',NULL,'33902721',NULL,'Suscipit excepturi magni voluptatem dolores veniam est.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,0,5,NULL,NULL,NULL,NULL,1),(14,'Robust demand-driven knowledgeuser','614105786',1,'8d38ebeb-ae28-37f5-817f-ca9ee939c6ec','1985-09-19',NULL,'24172772',NULL,'Saepe dolorem atque atque quia debitis incidunt delectus.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,0,4,NULL,NULL,NULL,NULL,1),(15,'Synergistic systemic circuit','1346537212',4,'46051bf4-eb05-35f2-b1a2-9cdf7101360f','2015-03-14',NULL,'3419670',NULL,'Doloribus rerum sint itaque cumque.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,2,NULL,NULL,NULL,NULL,1),(16,'Switchable grid-enabled frame','806381735',1,'b33dde10-66f9-31fd-b21f-5b8d33e5b181','1971-03-16',NULL,'23911374',NULL,'Cumque quis qui voluptas possimus.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,3),(17,'Reactive optimal budgetarymanagement','577709240',2,'8f09492b-26d5-3bc5-92df-0c6a7086f121','2011-02-26',NULL,'7513540',NULL,'Sit ullam provident aut.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,1,4,NULL,NULL,NULL,NULL,3),(18,'Total zerodefect capacity','234586180',5,'b34cf5bd-2e33-3860-a8d6-4f95d356d59b','1988-12-17',NULL,'38996992',NULL,'Impedit rerum voluptas ea dolor id consequatur.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,0,4,NULL,NULL,NULL,NULL,3),(19,'Open-source bandwidth-monitored capacity','1449709770',4,'37fd77d0-d26c-3063-8922-e8f7176cd1b2','2012-12-12',NULL,'39149042',NULL,'Et inventore corrupti non dicta.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,2,NULL,NULL,NULL,NULL,2),(20,'Polarised didactic data-warehouse','48615263',1,'e67c3282-f525-3ddd-a264-4122a290c88b','1974-07-15',NULL,'21663155',NULL,'Est et est modi ut.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,1,3,NULL,NULL,NULL,NULL,3),(21,'Exclusive grid-enabled projection','878641912',1,'ef92eb6e-43b7-32a4-8fdb-2ef94c378371','2002-04-30',NULL,'21516797',NULL,'Quam illum sunt rem neque nam vel ratione.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,1,NULL,NULL,NULL,NULL,2),(22,'Right-sized eco-centric forecast','571667321',4,'3910e3d7-3c50-3fe7-bb41-675257c4540b','1970-09-22',NULL,'45627107',NULL,'Ut autem et velit ea vitae voluptatem.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,4,NULL,NULL,NULL,NULL,4),(23,'Managed optimizing info-mediaries','284186616',3,'7bbb0f48-e09f-341d-8c4e-745fc7fc40ab','1990-07-14',NULL,'43121262',NULL,'Perferendis dolor nihil quidem suscipit quam aut repudiandae est.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,1,2,NULL,NULL,NULL,NULL,2),(24,'Polarised reciprocal interface','83082897',4,'b05a187b-f59a-3c13-b212-31e8f0c2c11b','1971-08-29',NULL,'35002634',NULL,'Sunt error ducimus enim sunt et.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,1),(25,'Organic impactful model','1360793242',5,'2f03fe66-48bd-3f7e-b562-7857d61d7b02','1997-07-07',NULL,'6053575',NULL,'Architecto fugiat et porro.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,1,1,NULL,NULL,NULL,NULL,2),(26,'Compatible optimal groupware','488026256',4,'170e05ab-0a46-338f-9777-5f869ee3e73e','1992-07-27',NULL,'46455897',NULL,'At magni iusto quidem qui laudantium ducimus quos laudantium.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,5,NULL,NULL,NULL,NULL,1),(27,'Exclusive fault-tolerant collaboration','283373007',1,'54220f06-df0a-39b9-9cce-7d2618b52027','1978-12-11',NULL,'17354785',NULL,'Atque praesentium aut voluptatem.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,4),(28,'Grass-roots human-resource monitoring','1358583588',2,'14a2bb09-5c86-3580-a9f7-f957c029cdd4','2013-09-23',NULL,'41513341',NULL,'Et architecto qui a aperiam ipsam aspernatur neque aut.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,4),(29,'Adaptive mobile methodology','1078959508',5,'deb6de18-d353-3028-abb5-b85c53e572b3','1986-10-11',NULL,'30129295',NULL,'Consequatur iste temporibus possimus distinctio nobis tempore.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,0,1,NULL,NULL,NULL,NULL,1),(30,'Multi-layered asynchronous info-mediaries','500823859',4,'b9e52b26-6654-3ec5-8114-052da7e81e68','2003-12-28',NULL,'31894531',NULL,'Quisquam aut voluptate aliquam aut vel voluptate odit blanditiis.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,1,1,NULL,NULL,NULL,NULL,4),(31,'Reverse-engineered disintermediate artificialintelligence','127910469',4,'b803e358-430d-383d-869c-df491742aeab','1985-05-02',NULL,'9595266',NULL,'Consectetur consequatur modi dolor quibusdam dolor.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,0,4,NULL,NULL,NULL,NULL,3),(32,'Reactive intermediate database','1427050701',5,'b15aa82f-4c3c-3c46-8ac0-bbb8d93c3d8d','2010-04-13',NULL,'33941269',NULL,'Explicabo nihil dolorum sed numquam cupiditate.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,0,3,NULL,NULL,NULL,NULL,4),(33,'Stand-alone intangible benchmark','1002621001',2,'34357519-e421-397b-9f29-fed75f4d257c','1983-10-27',NULL,'5195666',NULL,'Temporibus neque non enim.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,1,NULL,NULL,NULL,NULL,1),(34,'Multi-channelled responsive paradigm','179562199',4,'146dc1b3-4ec5-33a1-8784-6e0e4c2374e4','1990-06-17',NULL,'3817771',NULL,'Aspernatur laudantium ullam quaerat nihil aut expedita quia.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,1,1,NULL,NULL,NULL,NULL,3),(35,'Multi-lateral heuristic leverage','1266601024',2,'55ccf3ae-fe75-3488-a92c-68f488217915','1976-11-05',NULL,'26941625',NULL,'Omnis culpa ipsam est quam eius ea.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,1,3,NULL,NULL,NULL,NULL,3),(36,'Up-sized explicit info-mediaries','985581598',3,'4d5fcd70-12ae-3b50-b71d-679d3d596b6e','2005-06-26',NULL,'46999637',NULL,'Dolor dolore sed enim nobis pariatur quia.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,0,3,NULL,NULL,NULL,NULL,2),(37,'Innovative bottom-line internetsolution','838243568',1,'5098fe99-190c-38ea-b622-26bb229fb529','2009-07-14',NULL,'43758387',NULL,'Et ratione culpa corporis.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,0,5,NULL,NULL,NULL,NULL,2),(38,'Adaptive radical localareanetwork','376999050',5,'66268f06-09ea-368f-9fcf-046e35a685f7','1978-06-01',NULL,'37849620',NULL,'Veniam qui maxime cupiditate omnis.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,0,1,NULL,NULL,NULL,NULL,4),(39,'Polarised user-facing success','82661970',4,'a1de80a1-26da-3990-9157-eb66282dec40','2007-04-29',NULL,'2358580',NULL,'Quam sunt aliquid et quisquam.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,0,2,NULL,NULL,NULL,NULL,1),(40,'Configurable needs-based access','1230479844',4,'d70d75e7-fa62-331e-9b04-b465aa447c02','1994-05-18',NULL,'18594912',NULL,'Dolorem nam repellendus sed et aperiam.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,0,4,NULL,NULL,NULL,NULL,4),(41,'Front-line multimedia knowledgeuser','741179654',2,'4b5012b4-94cd-39a1-8e21-b5cb26963c8d','2013-05-23',NULL,'41270267',NULL,'Fuga sit ut natus vel atque accusantium.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,1,3,NULL,NULL,NULL,NULL,4),(42,'Business-focused exuding info-mediaries','108582572',1,'86b87c96-fe5a-3dee-aa03-161611dbffdb','1998-06-08',NULL,'49700731',NULL,'Sequi et consequatur facere.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,2,NULL,NULL,NULL,NULL,3),(43,'Ergonomic explicit initiative','700392813',3,'593eed07-359c-38ef-adec-9029e6277e2a','1972-10-16',NULL,'10456327',NULL,'Libero quos ipsam quis exercitationem id in eveniet.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,0,2,NULL,NULL,NULL,NULL,1),(44,'Total multimedia migration','908962454',2,'b880a4bf-5d51-331b-af07-44949d4d8f01','1976-04-26',NULL,'39976319',NULL,'Odit ut quos accusantium ea tempore et dignissimos soluta.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,1,1,NULL,NULL,NULL,NULL,1),(45,'Digitized methodical middleware','871620142',4,'93dcd8d1-e5dd-3fc9-834b-a718039f88df','1992-01-09',NULL,'48614317',NULL,'Earum nesciunt similique id possimus modi blanditiis blanditiis voluptatem.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,1,4,NULL,NULL,NULL,NULL,1),(46,'Devolved holistic database','714126156',3,'d354e507-609b-3b35-9926-7dd3a02443d3','1977-08-19',NULL,'35269691',NULL,'Praesentium aut nobis in libero tempora impedit quo.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,1,3,NULL,NULL,NULL,NULL,3),(47,'Proactive mobile opensystem','951658867',1,'a50527d7-6446-3e05-be4a-a3a3a372828e','1990-02-25',NULL,'31860138',NULL,'Consequatur quam sed odit repellat quo minima velit.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,1,5,NULL,NULL,NULL,NULL,4),(48,'Automated upward-trending data-warehouse','1404644407',5,'b48f599e-fe8a-3014-8255-fed3a2f78890','1977-01-20',NULL,'16120858',NULL,'Neque ipsum et facilis exercitationem pariatur.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,0,2,NULL,NULL,NULL,NULL,1),(49,'Triple-buffered dynamic leverage','680909548',5,'335597d2-5a98-37a7-822a-ef0569a5ab95','2005-03-30',NULL,'26186255',NULL,'Ad dolorem voluptatibus assumenda porro veniam velit.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,1,1,NULL,NULL,NULL,NULL,4),(50,'Realigned interactive solution','1130331690',3,'b7269c22-c407-3068-b56e-b5b7dd95058a','1972-01-18',NULL,'37522795',NULL,'Sequi delectus maxime officia veniam voluptate rem assumenda.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,1),(51,'Enterprise-wide didactic moratorium','220321065',5,'ab296e0f-feb8-3d99-995e-46656abed8a7','1990-12-21',NULL,'19764329',NULL,'Doloribus nobis labore numquam dolores voluptatum accusantium.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,0,2,NULL,NULL,NULL,NULL,1),(52,'Synchronised mobile securedline','252957019',4,'326b1528-d097-39fb-aca3-34bc9358ad22','2008-05-04',NULL,'36459823',NULL,'Illum dolorem dolore totam aut inventore et eos.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,2,0,4,NULL,NULL,NULL,NULL,1),(53,'Phased high-level groupware','1460225704',5,'456aa264-6ab8-3fea-a380-84a1c0d2eb5c','1987-10-30',NULL,'31759001',NULL,'Porro nihil magni aut sint vel.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,0,1,NULL,NULL,NULL,NULL,1),(54,'Proactive reciprocal alliance','164799827',1,'99bec0dd-6911-3bb7-8e3b-28b7013f1aa9','2003-09-30',NULL,'5320150',NULL,'Consequatur quaerat id veritatis velit ut deserunt enim.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,3),(55,'Customer-focused mobile processimprovement','842187902',4,'622648bc-4337-3782-a0e7-359b732c6c2a','2014-02-20',NULL,'41277223',NULL,'Incidunt earum est quae et.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,1,1,2,NULL,NULL,NULL,NULL,4),(56,'Switchable assymetric workforce','1132463686',4,'b246d72c-d613-34c3-aa67-eaa3fa4c718c','2007-06-02',NULL,'40685216',NULL,'Ipsa ab itaque magnam sed aut consequuntur error.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,0,4,NULL,NULL,NULL,NULL,1),(57,'Robust secondary emulation','741678897',2,'e39094df-9355-35b3-a423-638d4b5374ec','2002-12-14',NULL,'40667019',NULL,'Eos vel distinctio tenetur necessitatibus ullam eaque at.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,5,0,5,NULL,NULL,NULL,NULL,4),(58,'Business-focused directional approach','245586010',3,'4f871145-518c-3058-ab28-a0a9645a999f','2013-03-12',NULL,'21388822',NULL,'Sit amet in similique sit et.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,4,NULL,NULL,NULL,NULL,2),(59,'Multi-tiered attitude-oriented circuit','204819247',3,'f11378bf-49b5-3ee1-b7f6-7347077e3407','1984-06-14',NULL,'45678120',NULL,'Cupiditate ex accusantium doloremque eum.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,4,1,3,NULL,NULL,NULL,NULL,4),(60,'Networked upward-trending methodology','333703861',4,'672ca486-160b-3cc1-b932-7a5c7ac65453','2007-08-23',NULL,'46145283',NULL,'Mollitia voluptatem ipsam veritatis non est in.',NULL,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',1,NULL,1,NULL,NULL,NULL,3,1,3,NULL,NULL,NULL,NULL,1),(61,'Ameliorated homogeneous systemengine','32734771',4,'5684a908-ab00-3208-91ce-338df98d3a0e','2001-02-23',NULL,'9828673',NULL,'Quasi quia veritatis omnis ut minima nam dolorem libero.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,1,5,NULL,NULL,NULL,NULL,4),(62,'Reverse-engineered reciprocal analyzer','1140960148',4,'d882b242-b85c-3c25-9958-5fc154043cc5','1990-10-06',NULL,'6516317',NULL,'Dolorum molestiae quae aut deleniti ab qui reprehenderit libero.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,1,5,NULL,NULL,NULL,NULL,4),(63,'Monitored client-server architecture','67900820',2,'ba0a1d56-1394-3d7a-bb8b-877f978a72b4','1979-04-14',NULL,'4555334',NULL,'Nihil praesentium commodi dolore nemo.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,1,4,NULL,NULL,NULL,NULL,1),(64,'Operative multi-state GraphicalUserInterface','922778850',4,'2a91a2d6-103c-3121-b0b1-57c58404e614','1971-01-06',NULL,'27487453',NULL,'Qui rerum odio dignissimos voluptas qui.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,0,3,NULL,NULL,NULL,NULL,1),(65,'Integrated value-added collaboration','402777469',4,'bdf57636-fb88-388a-b601-e20fb01877c4','1980-03-03',NULL,'42870244',NULL,'Corporis optio blanditiis nam voluptatibus.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,4,1,4,NULL,NULL,NULL,NULL,1),(66,'Cross-group web-enabled info-mediaries','148247000',5,'370fc561-99a6-3dfb-87d0-7a8705887f85','2003-08-18',NULL,'1357945',NULL,'Ipsum ab quae omnis aut ad.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,0,2,NULL,NULL,NULL,NULL,2),(67,'Versatile interactive matrix','734828974',4,'e488a1a3-c807-310e-85b0-d75f87ea2ceb','1971-05-11',NULL,'17363905',NULL,'Neque molestiae id voluptates quo assumenda rerum voluptas voluptatum.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,0,2,NULL,NULL,NULL,NULL,4),(68,'Cloned discrete toolset','1393028026',2,'42cdb987-2dfc-308a-89de-bac00786d055','1973-08-19',NULL,'47005444',NULL,'Expedita est porro eveniet incidunt.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,1,1,NULL,NULL,NULL,NULL,4),(69,'Re-engineered uniform projection','479009911',5,'45e8a143-f6ad-3003-85c8-26e4e5c45b02','2001-08-28',NULL,'29723297',NULL,'Reiciendis et rerum fuga impedit.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,0,4,NULL,NULL,NULL,NULL,4),(70,'Universal didactic hardware','1207336596',2,'507c36a4-2a3a-382d-8f9f-99996e76cfb6','2013-09-24',NULL,'49138793',NULL,'Vitae ipsam autem molestias eos quos necessitatibus.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,1,3,NULL,NULL,NULL,NULL,2),(71,'Balanced assymetric GraphicalUserInterface','1247913785',2,'bc05fdfc-f519-374c-8049-badb52f69e6d','1996-01-20',NULL,'2827249',NULL,'Nam deserunt ullam quo beatae.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,1,2,NULL,NULL,NULL,NULL,4),(72,'Expanded 4thgeneration algorithm','1335669067',2,'44df7155-0921-3e29-9c5a-cefee90f4324','1970-04-20',NULL,'28076837',NULL,'Et accusantium molestias sequi ipsa doloremque.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,4,1,4,NULL,NULL,NULL,NULL,4),(73,'Function-based maximized parallelism','1444938202',3,'83db23c4-72f1-3d6c-a8f6-bfb5b459bdf2','1982-10-22',NULL,'46097977',NULL,'Quisquam praesentium ipsam debitis aut nobis quasi.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,0,4,NULL,NULL,NULL,NULL,2),(74,'Customizable mobile access','293016748',4,'c8abc7f9-d06e-3974-9fde-0df0411a044b','1993-02-09',NULL,'25470347',NULL,'Minus consequatur numquam eos et laudantium debitis corrupti.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,1,0,3,NULL,NULL,NULL,NULL,3),(75,'Future-proofed foreground forecast','349758044',1,'9c55dfa4-3c20-3ed5-a5cd-4dba4c9bdbf2','1982-03-08',NULL,'18219755',NULL,'Harum exercitationem nihil est porro magni in sint.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,1,1,1,NULL,NULL,NULL,NULL,4),(76,'Stand-alone dedicated algorithm','263812040',1,'041dbed7-dae5-32ca-89ee-ea2699efc988','2014-04-25',NULL,'25260035',NULL,'Aut et maiores tenetur consequatur et.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,1,1,5,NULL,NULL,NULL,NULL,1),(77,'Robust analyzing function','383948027',4,'62d427a4-572d-395a-a4a3-062bdff4c5cc','1981-01-15',NULL,'48945490',NULL,'Sapiente dicta saepe accusamus et dolores.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,0,4,NULL,NULL,NULL,NULL,2),(78,'Virtual neutral functionalities','477380190',2,'77735935-e7cc-32aa-8e80-c9ab3bbbd62c','2016-02-05',NULL,'25244642',NULL,'Et nam sed et corrupti esse et.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,0,3,NULL,NULL,NULL,NULL,2),(79,'Grass-roots responsive GraphicInterface','1010848030',4,'e969f95f-7656-39fc-b392-25fbbed2ad91','1991-03-23',NULL,'19825588',NULL,'Iure qui officiis rerum illum aut ut.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,1,3,NULL,NULL,NULL,NULL,4),(80,'Realigned composite adapter','899386095',5,'dd62fd8d-a4cd-3c93-a138-50b37f17ad7d','1974-03-11',NULL,'12030390',NULL,'Doloremque in similique iure quasi perferendis id.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,0,4,NULL,NULL,NULL,NULL,4),(81,'Optimized bifurcated intranet','838575063',2,'f0364606-5bc5-3821-8bd7-6bf1e90e7f11','1991-12-07',NULL,'15632187',NULL,'Cupiditate expedita et minus aut culpa provident quae.',NULL,1,'2016-11-20 23:07:29','2016-11-21 00:33:30',1,'2016-11-21 00:33:30',1,NULL,NULL,NULL,3,0,4,NULL,NULL,NULL,NULL,4),(82,'Ameliorated user-facing monitoring','326235593',5,'d1d95514-6f07-3fd4-b12e-2fccfc2ddd27','1999-05-31',NULL,'1149074',NULL,'Quos modi aspernatur a et aut aut tenetur.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,0,2,NULL,NULL,NULL,NULL,4),(83,'Business-focused high-level interface','1140579465',5,'46bc076b-720c-33fa-ae4f-33a3a66451f7','2003-12-09',NULL,'8509936',NULL,'Sint inventore nisi repellendus ab debitis.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,0,4,NULL,NULL,NULL,NULL,3),(84,'Seamless asynchronous info-mediaries','1336928942',4,'9b5fbd7c-b786-332e-bfc8-9cca434ed204','1981-08-19',NULL,'41932039',NULL,'Temporibus exercitationem ducimus libero amet.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,1,1,NULL,NULL,NULL,NULL,1),(85,'Multi-layered dynamic parallelism','861858215',2,'9628e727-03c2-313f-bc2b-a1a5888f2f39','1995-06-20',NULL,'18992739',NULL,'Amet nemo aperiam et pariatur.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,5,1,5,NULL,NULL,NULL,NULL,1),(86,'Programmable tertiary matrix','955798318',4,'fc61789d-a6e8-3566-91e1-2c2112467a0a','1972-07-22',NULL,'15909141',NULL,'Assumenda doloremque explicabo perspiciatis vel et dolorem molestiae.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,0,5,NULL,NULL,NULL,NULL,1),(87,'Right-sized contextually-based archive','1329991897',1,'4b44a0b1-3ecb-30b7-b58f-d4849447b39a','1995-05-27',NULL,'15640006',NULL,'Sit pariatur in non impedit sed sed magni.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,1,1,NULL,NULL,NULL,NULL,4),(88,'Automated user-facing initiative','66332732',1,'59027125-0623-3037-bb4a-0d0114e0db5f','1992-09-05',NULL,'9927501',NULL,'Eum sed velit minus doloribus ad omnis cum.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,1,0,4,NULL,NULL,NULL,NULL,1),(89,'Optimized discrete moderator','242159572',3,'181a0950-006d-3fdd-936d-81355fd6df88','2005-09-18',NULL,'38282301',NULL,'Omnis eum quae animi eius.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,0,2,NULL,NULL,NULL,NULL,3),(90,'Persistent cohesive middleware','393498501',3,'a3d399cb-f25a-383e-af65-54a2e974a56f','1970-02-21',NULL,'42991820',NULL,'Excepturi nulla voluptatem voluptatem ea.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,3),(91,'Multi-channelled grid-enabled customerloyalty','814134806',1,'8155b403-8383-31e9-a521-4a7a2aea61ca','1978-03-03',NULL,'31285966',NULL,'Perspiciatis aspernatur dolor vel sit.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,4,0,2,NULL,NULL,NULL,NULL,4),(92,'Integrated static interface','215458633',4,'119654ac-8269-3714-bdc2-fc25308c96fc','1972-04-07',NULL,'6193991',NULL,'A facere quo at doloremque ut reprehenderit.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,1,5,NULL,NULL,NULL,NULL,3),(93,'Up-sized 24hour GraphicalUserInterface','321345315',4,'5a892eb9-8c99-3a71-90af-e6e80a5b9273','1971-03-19',NULL,'38803546',NULL,'Atque blanditiis tenetur cumque ipsum inventore alias.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,1,3,NULL,NULL,NULL,NULL,1),(94,'Facetoface demand-driven matrix','693214522',3,'b82ce41d-cff1-3b4c-9f74-554058bf9669','1982-08-26',NULL,'13705892',NULL,'Reiciendis et molestias id quis eveniet.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,2,0,5,NULL,NULL,NULL,NULL,1),(95,'Front-line heuristic middleware','1067734512',5,'4205ffc6-210a-3ef7-84b3-76df4f1316ce','1997-03-08',NULL,'27900091',NULL,'Ut earum consequatur dolor non possimus omnis.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,0,4,NULL,NULL,NULL,NULL,1),(96,'Down-sized zerodefect utilisation','1366417144',3,'9f4b8786-7e45-3683-a4f5-2fa4f260609c','1983-11-09',NULL,'37309051',NULL,'Cumque consequatur delectus modi aliquid nulla.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,4,0,5,NULL,NULL,NULL,NULL,3),(97,'Pre-emptive asynchronous benchmark','366257155',4,'603e9346-3120-3ff7-9966-829a61f29d32','2015-09-06',NULL,'45384019',NULL,'Dolores assumenda delectus quae explicabo eum distinctio eaque.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,4,0,5,NULL,NULL,NULL,NULL,1),(98,'Networked secondary product','64846550',3,'97eb19e5-cc94-3946-9472-65422c7ffe00','1983-09-28',NULL,'17430473',NULL,'Officiis aut molestiae necessitatibus vitae.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,0,2,NULL,NULL,NULL,NULL,1),(99,'Business-focused 24hour leverage','936840003',5,'395e8f2c-799f-3310-a6c9-b328498f6a5b','1976-02-19',NULL,'46175843',NULL,'Iure veniam animi mollitia molestias dolores hic dolorem.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,1,1,2,NULL,NULL,NULL,NULL,2),(100,'Decentralized homogeneous groupware','285321693',2,'eabc9e1e-4a5d-3d97-88db-98112689290f','1979-12-21',NULL,'39805401',NULL,'Earum molestiae autem aspernatur quis.',NULL,1,'2016-11-20 23:07:29','2016-11-20 23:07:29',1,NULL,1,NULL,NULL,NULL,3,1,5,NULL,NULL,NULL,NULL,2),(101,'TestModel','230-name-21 2',2,'350335','2016-01-01',25.00,'12345',20,'lorem ipsum blah blah',NULL,1,'2016-11-21 00:33:30','2016-11-21 00:33:30',1,NULL,6,0,15,0,2,1,5,NULL,NULL,'2016-11-20 18:33:30',NULL,2);
        +INSERT INTO `assets` VALUES (1,'Visionary secondary core','1465939380',1,'b69474b2-27b1-3f93-97e9-db014b50855c','1994-09-15',65.91,'20260334',NULL,'Incidunt unde et ipsum.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,5,1,4,NULL,NULL,NULL,NULL,12,NULL),(2,'Multi-channelled assymetric hierarchy','62067267',2,'2939d8f0-517c-3813-92ae-600b730d7077','2012-09-16',8118065.09,'2966491',NULL,'Ut voluptatem soluta at omnis.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,3,NULL,NULL,NULL,NULL,14,NULL),(3,'Automated stable instructionset','1040897710',4,'f976dfff-88bd-365c-abec-c7e2866c8b39','1971-10-23',2.67,'13451420',NULL,'Eligendi amet harum fuga harum sunt.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,4,NULL,NULL,NULL,NULL,11,NULL),(4,'Total maximized data-warehouse','1249884067',3,'eb57f9f7-df07-30af-98e1-c6ce50d463e8','2009-06-22',1549.23,'32663424',NULL,'Non nihil quo aut aut odit dolorem.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,2,0,3,NULL,NULL,NULL,NULL,2,NULL),(5,'Sharable directional monitoring','1243453118',4,'3eb5e7d4-d07b-3dc2-a66c-c66a1440f273','2006-07-07',101.96,'45353300',NULL,'Voluptatibus et autem tempora.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,1,1,NULL,NULL,NULL,NULL,12,NULL),(6,'Multi-tiered intermediate help-desk','670576799',5,'202b8cef-61cf-3bfc-990f-76ab70b23af3','2001-03-25',12224.44,'25748332',NULL,'Expedita sint dolor nesciunt.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,5,1,4,NULL,NULL,NULL,NULL,1,NULL),(7,'Advanced dynamic task-force','1287783991',5,'7ee9c0de-bc09-32a9-8102-836ebca4e1cc','2004-11-09',16.52,'15204825',NULL,'Inventore consequuntur voluptate accusantium voluptas nesciunt sed harum eligendi.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,3,NULL,NULL,NULL,NULL,1,NULL),(8,'Realigned tangible interface','130771471',5,'d9d51b6f-c5ee-3493-b645-9e7bdbe015f7','1970-05-02',66.19,'47326077',NULL,'Est voluptatem necessitatibus sit.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,2,NULL,NULL,NULL,NULL,3,NULL),(9,'Polarised hybrid neural-net','550271593',4,'b1ab1fce-0d01-384a-b4be-860202392dcb','2010-08-06',97.79,'41439691',NULL,'Dolorem nihil illum magni sed sunt.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,5,1,5,NULL,NULL,NULL,NULL,13,NULL),(10,'Facetoface zeroadministration workforce','480468566',4,'3162a8b8-7ac0-3e90-a944-ecaf37c3b8ef','2015-01-17',2803464.97,'15427150',NULL,'Ipsam error ut assumenda laudantium omnis aut.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,5,0,2,NULL,NULL,NULL,NULL,13,NULL),(11,'Quality-focused grid-enabled service-desk','543913477',2,'f7ac27b3-57d1-388c-bb01-da4db118f36b','2006-04-06',29720634.10,'47076493',NULL,'Nulla aut sunt voluptatem corrupti debitis unde.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,3,0,1,NULL,NULL,NULL,NULL,9,NULL),(12,'Seamless non-volatile focusgroup','364062836',3,'6563015c-d18a-3a11-9663-4190acb417d5','1993-12-11',2268554.13,'10865899',NULL,'Et voluptas molestias voluptatum commodi ut eius in.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,4,NULL,NULL,NULL,NULL,7,NULL),(13,'Secured local structure','101852892',5,'24bb7294-e323-3f65-bb0f-a289d4948d64','2000-02-01',138.91,'46488840',NULL,'Commodi possimus animi et deserunt qui dolor vero.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,3,0,3,NULL,NULL,NULL,NULL,3,NULL),(14,'Profound empowering collaboration','344958216',2,'481f212f-64bc-3ba9-afba-ee88e67b593b','2011-10-01',33910133.63,'24685446',NULL,'Sed ut modi aut rerum rerum.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,1,5,NULL,NULL,NULL,NULL,3,NULL),(15,'Visionary multi-tasking securedline','767397902',1,'51d48976-a23b-31c7-b6cd-b8ad0df184d3','2000-01-14',4576.44,'14926990',NULL,'Sed sunt porro eum sed quia.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,3,1,2,NULL,NULL,NULL,NULL,9,NULL),(16,'Ergonomic web-enabled architecture','615124208',5,'14e3263e-990c-3ab4-ac07-bae840766a00','1979-02-09',0.02,'2105706',NULL,'Sunt id dolores inventore rerum pariatur est quia.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,5,0,3,NULL,NULL,NULL,NULL,12,NULL),(17,'Open-source intermediate instructionset','1270731692',5,'9fdbe892-9469-3ed5-bce5-e0ff0b966dc2','2012-01-12',237.80,'14518413',NULL,'Nemo ut aperiam blanditiis rerum doloribus.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,5,NULL,NULL,NULL,NULL,8,NULL),(18,'Managed disintermediate moratorium','1022866111',2,'3466d91a-75e6-3a0f-95a5-1477e7770745','1983-05-03',2.92,'14715014',NULL,'Perferendis vel autem autem dolor consequatur eum.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,3,NULL,NULL,NULL,NULL,11,NULL),(19,'Decentralized user-facing website','940534451',5,'c4836458-cb4c-32d3-8b4d-5414351771b9','2000-06-29',247045.04,'4657436',NULL,'Accusamus non id et voluptatem.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,4,0,4,NULL,NULL,NULL,NULL,4,NULL),(20,'Expanded content-based solution','942251388',4,'116d7d4a-4b56-322e-b479-16218caf56bc','2009-02-19',39627130.06,'32035872',NULL,'Veritatis veritatis ut expedita in eum voluptatem qui.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,2,0,5,NULL,NULL,NULL,NULL,8,NULL),(21,'Focused maximized implementation','1249819308',5,'cb682760-e287-386e-8160-487403deb74c','2012-07-15',5778.07,'47965311',NULL,'Sed voluptatem eius placeat blanditiis soluta id deserunt.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,1,0,2,NULL,NULL,NULL,NULL,14,NULL),(22,'Proactive client-server processimprovement','883029704',3,'4e7ad5b0-a675-3846-b5a6-4d342bf33b54','1990-04-16',0.00,'26251720',NULL,'Eos voluptas explicabo magni aut cupiditate nostrum atque ducimus.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,2,0,2,NULL,NULL,NULL,NULL,2,NULL),(23,'Operative demand-driven info-mediaries','656985114',1,'13b0499e-e49b-3618-b45f-b228d2d25fc5','2015-05-16',24.46,'3609650',NULL,'Modi ut sit minus.',NULL,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',1,NULL,1,NULL,NULL,NULL,3,0,5,NULL,NULL,NULL,NULL,9,NULL),(24,'Open-architected grid-enabled software','59169139',4,'41502a6f-1dfd-3eab-9c31-029f8872f2be','1990-01-30',450.80,'49015606',NULL,'Consequuntur praesentium quod sit quod.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,0,3,NULL,NULL,NULL,NULL,5,NULL),(25,'Persistent exuding opensystem','856754651',1,'dc45fcd5-2fc7-3d62-8bb1-0c685a270004','2011-07-13',1.53,'3161489',NULL,'Et voluptates corporis sed possimus iure maiores.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,0,1,NULL,NULL,NULL,NULL,6,NULL),(26,'Multi-tiered attitude-oriented projection','807015293',5,'1125d40f-ed93-3a8c-a69f-1bb068e44026','1976-10-04',37019.76,'7052260',NULL,'Expedita alias laborum accusantium praesentium necessitatibus est assumenda veniam.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,0,4,NULL,NULL,NULL,NULL,14,NULL),(27,'Facetoface well-modulated projection','1395451594',3,'2093efe3-f44f-30f6-b885-de3d023a0d5f','1987-12-30',51.82,'31340938',NULL,'Distinctio perspiciatis ut rerum culpa consequatur eligendi ipsam.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,3,NULL),(28,'Phased cohesive forecast','298505210',5,'196cec02-89c7-36de-a4ff-940fce629151','1986-12-20',20563.38,'4349606',NULL,'Enim rerum reiciendis in iste vel architecto.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,5,NULL,NULL,NULL,NULL,3,NULL),(29,'Phased asynchronous productivity','565884861',5,'fc89d527-3495-3255-a38a-f92bd1f01eca','2012-03-11',222963311.08,'49169719',NULL,'Minus et rerum voluptatum eos sed perferendis.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,1,NULL,NULL,NULL,NULL,4,NULL),(30,'Upgradable composite collaboration','45774522',4,'f4e12518-7f22-3f0a-8f3c-531e95021230','1978-05-08',690.36,'33700051',NULL,'Non veniam et iusto qui.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,6,NULL),(31,'Automated clear-thinking approach','280800955',1,'15f9b534-e2e3-338b-9ebb-708ee0eb281c','2007-05-02',25.02,'46111413',NULL,'Repellendus minima culpa suscipit esse tenetur in totam.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,1,5,NULL,NULL,NULL,NULL,14,NULL),(32,'Cross-platform value-added collaboration','291396827',3,'6b0d7ca1-cf4b-3a5c-999a-44c5dd5f8444','1988-10-28',878.62,'24306169',NULL,'Dolores eaque quidem veniam sapiente.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,4,NULL,NULL,NULL,NULL,14,NULL),(33,'Ameliorated heuristic forecast','434327491',4,'bd587d6c-0067-3f2a-a6e5-82e94e82a556','2001-03-03',612863.41,'30945188',NULL,'Suscipit est cupiditate consequatur libero voluptates corrupti fuga repudiandae.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,1,4,NULL,NULL,NULL,NULL,8,NULL),(34,'Progressive zeroadministration toolset','1130124248',1,'1568dc2b-f5de-3f95-a9f9-cbf77b45c8bd','1986-04-07',281.85,'34711081',NULL,'Pariatur illo veritatis eos minima eaque autem.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,1,2,NULL,NULL,NULL,NULL,6,NULL),(35,'Operative full-range instructionset','442560802',1,'c4461312-fd67-3ab2-ab32-d8b37b3d91a5','1986-09-01',19807940.14,'26289988',NULL,'Accusantium ea molestiae dolor.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,1,3,NULL,NULL,NULL,NULL,5,NULL),(36,'Pre-emptive coherent systemengine','9154795',5,'60f0ef79-9c7b-3d33-8b31-b040a6068f9b','1975-08-13',29.15,'19758830',NULL,'Voluptatem temporibus molestias sapiente tempora qui vitae.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,1,4,NULL,NULL,NULL,NULL,5,NULL),(37,'Robust value-added core','243145492',4,'7c37cb50-d2d1-3290-88d1-6c21132815b5','1986-02-10',67.41,'22175367',NULL,'Nisi quos omnis dolorum inventore.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,4,NULL,NULL,NULL,NULL,13,NULL),(38,'Ameliorated directional standardization','226248616',5,'31961f4d-a1b2-3676-bbb5-212cb767c549','1970-01-05',3010.68,'26395661',NULL,'Et sit perspiciatis sapiente inventore libero reprehenderit.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,2,NULL,NULL,NULL,NULL,9,NULL),(39,'Re-contextualized optimal frame','1362407233',3,'8a5be53f-eb59-30e0-b72c-e69b0d3a0e1a','1988-07-23',0.71,'46708629',NULL,'Maiores enim et dolores deserunt.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,5,NULL,NULL,NULL,NULL,14,NULL),(40,'Virtual static encoding','140377232',4,'8f746dee-734d-328d-a214-a2fa3548ffac','1996-01-11',14.73,'20834904',NULL,'Rerum placeat nobis magnam dolor amet et consectetur id.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,5,NULL,NULL,NULL,NULL,4,NULL),(41,'Vision-oriented high-level standardization','925970645',1,'e9cad216-ee72-3719-b5e4-38c62518d376','2004-01-14',4028.08,'31200094',NULL,'Tenetur error quisquam delectus expedita odit iusto sit rerum.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,1,NULL,NULL,NULL,NULL,11,NULL),(42,'Synergized scalable processimprovement','183749766',2,'9558eabb-6ba3-376f-b0c9-f3c2a7f067a6','1974-11-03',51096673.90,'22830723',NULL,'Voluptas assumenda delectus laborum ut voluptatem.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,0,4,NULL,NULL,NULL,NULL,12,NULL),(43,'Sharable non-volatile groupware','1230911641',4,'7154da35-5124-3fff-ac72-720d6e525eba','1973-12-16',23.40,'39001862',NULL,'Doloribus dolorem atque occaecati quas modi harum.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,1,4,NULL,NULL,NULL,NULL,9,NULL),(44,'Public-key 6thgeneration frame','449063516',2,'98590565-4f9d-365b-a884-73812ab79219','1999-07-16',1374.18,'29236659',NULL,'Et dicta veniam ea consequatur quibusdam.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,0,5,NULL,NULL,NULL,NULL,4,NULL),(45,'Automated empowering knowledgeuser','1130771148',4,'72a1b675-9897-3e2c-b7a1-4888bbeadc0e','2005-09-27',8.21,'29698142',NULL,'Blanditiis odit qui quos cupiditate alias est.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,1,4,NULL,NULL,NULL,NULL,2,NULL),(46,'Grass-roots incremental contingency','623854414',3,'9ffc77b4-c7c2-3514-9444-4a94c86a8839','1976-05-04',0.60,'48683741',NULL,'Esse odit neque quis illo velit magnam ut.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,1,4,NULL,NULL,NULL,NULL,12,NULL),(47,'Cross-platform holistic architecture','1479230642',5,'d6d61e4a-385e-302a-94ff-a3b7b9e09dd5','1989-12-04',30718642.38,'14503829',NULL,'Dolores suscipit aut natus quasi aut quos dignissimos.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,2,NULL,NULL,NULL,NULL,7,NULL),(48,'Diverse mission-critical matrices','177201955',3,'3c56ef7a-faca-3dfa-af18-b2b3fc215254','1971-06-08',8610849.64,'6040629',NULL,'Sit dolore dolorem totam dolor nulla sed hic.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,5,NULL,NULL,NULL,NULL,5,NULL),(49,'Focused uniform policy','213591583',2,'b2029504-c1b7-3182-8a69-6baba3a8bc80','2002-05-13',131830.90,'16141740',NULL,'Voluptas molestias et doloremque sunt ut nobis voluptatibus quam.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,1,5,NULL,NULL,NULL,NULL,13,NULL),(50,'Exclusive secondary leverage','322955899',1,'0d9c50f6-8ce4-333b-967e-7767e634f118','1977-08-29',5.93,'47631112',NULL,'Unde sapiente eaque aut.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,4,NULL,NULL,NULL,NULL,10,NULL),(51,'Advanced bandwidth-monitored adapter','1053798415',1,'b1ba053c-c2b0-3063-871d-4525b97479a1','2006-02-25',14.07,'11366596',NULL,'Expedita nulla inventore rerum perferendis consectetur.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,12,NULL),(52,'Innovative bandwidth-monitored GraphicInterface','454122127',2,'56cdb129-3eda-320b-88e8-f7f009e3b394','2006-06-24',145.41,'19949540',NULL,'Maxime ut ut exercitationem et et officia.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,1,4,NULL,NULL,NULL,NULL,7,NULL),(53,'Cloned upward-trending project','1344071999',1,'1f3b59a0-d39a-3086-9ce0-2535a1b8d4e8','2007-04-30',109.27,'46042391',NULL,'Placeat dolore beatae suscipit qui facilis consequatur dolore.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,1,2,NULL,NULL,NULL,NULL,5,NULL),(54,'Open-source modular info-mediaries','443740773',5,'dc5ef34e-2cfc-3987-9b96-af403f0a0d06','2001-02-04',334805.88,'44092000',NULL,'Et quis quo voluptates exercitationem.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,2,NULL,NULL,NULL,NULL,10,NULL),(55,'Balanced bottom-line knowledgebase','796374239',4,'bb347c78-122e-33f6-9a70-63c65e327ebf','2007-01-04',6.12,'43452338',NULL,'Dicta nesciunt reiciendis distinctio voluptatibus necessitatibus unde sit.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,0,1,NULL,NULL,NULL,NULL,11,NULL),(56,'Synchronised dynamic implementation','1212402558',1,'1f2c8176-c5f0-34f0-9926-b57add52a3ee','1998-08-16',1939.33,'7361962',NULL,'Natus adipisci consectetur voluptatem.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,1,4,NULL,NULL,NULL,NULL,11,NULL),(57,'User-friendly 5thgeneration focusgroup','1012354793',3,'3a02d70d-f206-3c20-a720-ca86ec9cfc84','1988-06-23',7.57,'44656197',NULL,'Consequatur culpa ut quod placeat sed rerum quidem illo.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,0,3,NULL,NULL,NULL,NULL,14,NULL),(58,'Expanded 5thgeneration complexity','812742014',4,'74a49bb8-af57-3af0-a1a0-a5731ac07b41','1981-12-02',118346182.29,'23747179',NULL,'Alias dolorem quam et amet perferendis.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,2,NULL,NULL,NULL,NULL,2,NULL),(59,'User-centric context-sensitive intranet','383856329',5,'e3b74a52-fc9e-3276-83e6-ec42e05301cb','2015-08-16',328816073.70,'23618511',NULL,'Ex cumque voluptas blanditiis quia exercitationem et cupiditate.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,1,2,NULL,NULL,NULL,NULL,13,NULL),(60,'Networked contextually-based forecast','14450513',2,'59dbf327-d381-346e-af9b-f56b9850be4e','1974-10-06',1488.84,'2923279',NULL,'Odio officia consequuntur cupiditate distinctio.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,3,NULL,NULL,NULL,NULL,14,NULL),(61,'Team-oriented secondary frame','710696247',1,'437c2828-37d2-3127-b75f-b1c06f478752','1975-05-24',521.61,'16444048',NULL,'Possimus tempore minus consequatur eos nisi quasi.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,0,2,NULL,NULL,NULL,NULL,14,NULL),(62,'Reverse-engineered neutral matrices','346946928',5,'8fb61550-665b-325d-a4eb-649ed4a19ddd','1983-05-02',654299.59,'21473608',NULL,'Adipisci harum modi quibusdam praesentium fugit ut quia.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,8,NULL),(63,'Intuitive mission-critical benchmark','633215379',5,'3267a389-57ee-3b40-be84-132ff9c92fc1','2011-04-01',1.09,'2663674',NULL,'Dolores veniam omnis aliquam in qui omnis.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,0,4,NULL,NULL,NULL,NULL,9,NULL),(64,'Vision-oriented user-facing analyzer','213197662',1,'46798b8d-87e9-3297-abd6-647886af7010','2016-08-03',14040.30,'17712399',NULL,'Consequuntur quis non earum.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,1,2,NULL,NULL,NULL,NULL,3,NULL),(65,'Centralized actuating initiative','1077234046',5,'47444ffb-8478-3923-aea2-54f1192b762d','1982-02-21',34253.85,'15265807',NULL,'Odit rerum sit repudiandae quo quam sequi consequuntur.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,5,NULL,NULL,NULL,NULL,4,NULL),(66,'Networked real-time function','136655874',1,'90da2bd4-dbde-3c0e-9719-a85b7507d5fa','2014-01-20',7131565.52,'7516067',NULL,'Officiis eos dolor inventore quia ipsa cum voluptas placeat.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,0,3,NULL,NULL,NULL,NULL,12,NULL),(67,'Enhanced tertiary interface','707949478',3,'b175217f-6a2f-31d5-bc5c-26d71ac0567e','2010-03-20',205.62,'5367013',NULL,'Deleniti incidunt adipisci facere aut voluptatibus quia voluptas rerum.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,0,4,NULL,NULL,NULL,NULL,12,NULL),(68,'Future-proofed methodical task-force','1288802320',1,'94f3892b-74a7-3387-b031-b7167246ac6a','1977-12-22',1939.36,'42716894',NULL,'Et aut est libero facilis et voluptas est.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,1,NULL,NULL,NULL,NULL,12,NULL),(69,'Synergistic local opensystem','36202885',5,'1b0fd973-d826-357a-bcc6-f87a483aa0a6','1972-10-09',31887.76,'21192424',NULL,'Tempora dolorem animi exercitationem illo.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,7,NULL),(70,'Organic uniform encoding','1469159579',5,'5aaa2005-5f7b-39b0-8265-bbbb6b11ee52','1990-11-10',327686100.97,'6324570',NULL,'Sed illum laboriosam nulla et dignissimos quia.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,5,NULL,NULL,NULL,NULL,13,NULL),(71,'Multi-channelled uniform capacity','397078339',5,'f4c3e126-cfdd-3f11-a498-9b227d9bb611','2006-09-12',30.26,'6934888',NULL,'Necessitatibus velit qui cum minima iste.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,1,4,NULL,NULL,NULL,NULL,3,NULL),(72,'User-friendly multi-state approach','884331378',4,'2d5a5518-b2b1-3fff-b912-d2876d24e030','2001-04-15',17843.21,'33136904',NULL,'Provident sit quisquam fugiat dolores voluptatem.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,8,NULL),(73,'Optimized neutral standardization','1270281282',4,'250c0dc2-fa13-390a-b713-7cb4b32beff8','2000-09-23',0.25,'27616493',NULL,'Voluptatem nobis dolores quibusdam consequatur.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,0,5,NULL,NULL,NULL,NULL,6,NULL),(74,'Re-engineered uniform model','345559146',5,'8c6710aa-d2f8-36c7-9311-ebde607a86fd','1977-12-03',513427.58,'48640671',NULL,'Saepe sint enim libero facere totam ratione.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,3,NULL,NULL,NULL,NULL,3,NULL),(75,'Upgradable motivating support','1353404468',5,'90cdfb07-6a2d-363d-b54a-6d6b638ef230','2007-03-23',0.26,'18523115',NULL,'Eos quisquam asperiores impedit.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,1,5,NULL,NULL,NULL,NULL,7,NULL),(76,'Innovative client-server opensystem','999240677',5,'ba835bad-1314-3209-8622-e628127a4c40','1980-03-29',2429924.99,'36149854',NULL,'Velit quia corrupti quis quas eaque qui.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,4,NULL),(77,'Reactive multi-tasking info-mediaries','145227946',3,'b0c62e7e-9d2c-35a3-8ed4-48c4050174f3','1974-08-31',288914923.45,'26555421',NULL,'Esse fugit temporibus debitis impedit in.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,1,2,NULL,NULL,NULL,NULL,4,NULL),(78,'Ergonomic demand-driven support','1139109215',2,'272286a8-33f7-3246-91c6-1fe32c6049b5','2016-08-25',124281091.67,'16599931',NULL,'Ipsa nisi expedita et quisquam aspernatur dolor error.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,0,5,NULL,NULL,NULL,NULL,6,NULL),(79,'Versatile systemic model','121747493',3,'7b3fb812-fa96-32e3-a07e-f06001523621','1983-07-09',3.41,'11741859',NULL,'Aut minima dolorem expedita aperiam quod cupiditate dolorem.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,0,2,NULL,NULL,NULL,NULL,14,NULL),(80,'Re-contextualized composite installation','946487822',2,'9deaac7c-2730-36c6-9a58-7f2682b9a177','1985-11-30',915.44,'32391115',NULL,'Modi omnis ut illo sed sed exercitationem.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,5,NULL,NULL,NULL,NULL,7,NULL),(81,'User-friendly national customerloyalty','376127354',5,'60216fff-abb1-321d-9128-f46f2056729f','1975-03-10',72.94,'4606858',NULL,'Sint in quo assumenda.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,4,NULL,NULL,NULL,NULL,5,NULL),(82,'Synergized 6thgeneration hub','797353978',4,'9e338295-77f0-3242-923f-4b241bfbb976','2014-04-27',10024083.74,'9387562',NULL,'Porro error delectus voluptas at deserunt labore.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,0,4,NULL,NULL,NULL,NULL,12,NULL),(83,'Assimilated encompassing knowledgeuser','1319949896',5,'d04e4c37-d01e-30d5-a9f5-328fe50232c3','2010-03-28',5242576.03,'10247809',NULL,'Voluptas molestias et et quia et provident velit nihil.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,0,4,NULL,NULL,NULL,NULL,3,NULL),(84,'Mandatory contextually-based circuit','904726044',5,'f0b7bdc2-893b-3e9d-a808-ce2a42d3a494','1997-08-13',1111.13,'28859502',NULL,'Inventore qui nihil dignissimos similique consequatur.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,0,1,NULL,NULL,NULL,NULL,6,NULL),(85,'Customizable maximized extranet','205955368',1,'18d73a95-93ee-32d0-8066-3e257f13ecec','2002-05-03',106017393.41,'32640013',NULL,'Et perferendis voluptatem asperiores molestiae qui.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,1,NULL,NULL,NULL,NULL,11,NULL),(86,'Organic interactive projection','706656762',1,'a63e284e-4b57-3f71-8209-89c8a3da1209','1983-09-13',3054.38,'14048494',NULL,'Eum sit velit ut accusantium a numquam.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,1,4,NULL,NULL,NULL,NULL,14,NULL),(87,'Monitored heuristic processimprovement','874379490',2,'0a5ddfa9-1cb5-3fcb-afe8-18be65b50bf5','2006-02-27',142285.11,'42475659',NULL,'Voluptatum nostrum aut dolor labore quaerat amet et.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,0,3,NULL,NULL,NULL,NULL,13,NULL),(88,'Enhanced non-volatile internetsolution','1042013011',2,'17d54504-ef82-3031-a406-407c6cac62f6','1987-12-02',3750104.82,'11286898',NULL,'Voluptatibus aperiam est sunt.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,1,2,NULL,NULL,NULL,NULL,14,NULL),(89,'Facetoface system-worthy data-warehouse','1349469825',5,'1ffa7309-863f-35cf-ba86-22a2f8d8c046','2011-12-07',10424.74,'42589963',NULL,'Soluta fugit sunt quia quis nesciunt aut.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,1,NULL,NULL,NULL,NULL,8,NULL),(90,'Devolved tertiary architecture','756516594',2,'6360f8fe-9f17-3f6b-bb4c-0dfae611890a','2012-06-20',58040.91,'37322517',NULL,'Repellendus omnis possimus iure enim qui.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,NULL,10,NULL),(91,'Object-based cohesive infrastructure','540855250',2,'a2c2d9f1-4fee-3937-99ba-201c185255b4','1982-09-16',14.85,'2855858',NULL,'Quia facilis amet eum accusamus expedita omnis.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,0,3,NULL,NULL,NULL,NULL,9,NULL),(92,'User-centric nextgeneration framework','1407060264',2,'64360e7a-e7f3-37e1-8a4a-35e8c5d4a4d6','1983-02-22',701943.52,'39532771',NULL,'Tempore commodi sed aut dolor ut libero.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,0,3,NULL,NULL,NULL,NULL,14,NULL),(93,'Implemented high-level functionalities','522206565',4,'4d5d7fb0-0a63-3ef2-b573-63dfa2f6c885','1996-09-30',3408.58,'46163648',NULL,'Numquam qui explicabo dolor et quis consequuntur.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,1,1,NULL,NULL,NULL,NULL,1,NULL),(94,'Decentralized zeroadministration approach','1317557840',2,'d822ba42-a6f8-30b3-b719-4f796912cba0','1973-09-25',538.60,'23608596',NULL,'Doloremque eos ea nostrum sint sequi.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,5,0,1,NULL,NULL,NULL,NULL,3,NULL),(95,'Optimized 3rdgeneration hardware','456187922',1,'774a815d-3235-366d-8f5d-35bd1c079dc1','2005-08-11',96654.32,'14312696',NULL,'Ab quisquam maxime architecto est delectus dolores minus.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,2,NULL,NULL,NULL,NULL,11,NULL),(96,'Exclusive leadingedge task-force','1000549766',3,'bf8134fb-ab14-30a4-ad80-c5dc5fbd2e9e','2008-04-05',1099228.44,'29187413',NULL,'Ipsum excepturi consequatur necessitatibus excepturi neque aut.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,1,1,3,NULL,NULL,NULL,NULL,8,NULL),(97,'Right-sized fault-tolerant instructionset','1081323227',3,'8f22c98c-c4cd-3031-860d-26e8e429052f','2011-09-23',178778663.20,'18280703',NULL,'Perspiciatis reprehenderit consequatur odit totam qui in adipisci.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,2,1,2,NULL,NULL,NULL,NULL,11,NULL),(98,'Business-focused systemic analyzer','1180494483',1,'5ea014ef-0001-384c-a63f-ba45cfc3ae1c','1998-06-19',5.05,'22932729',NULL,'Tenetur id vero ipsum molestias aut voluptas.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,3,0,2,NULL,NULL,NULL,NULL,9,NULL),(99,'Future-proofed dedicated portal','995595961',3,'9989615a-ca48-3a18-84ab-7bd0dd828adb','1988-09-09',28505188.20,'22468488',NULL,'Fugit ut incidunt nemo iure reiciendis ut.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,0,2,NULL,NULL,NULL,NULL,9,NULL),(100,'Facetoface hybrid focusgroup','1126621095',5,'a9045d81-1c28-3ee0-8101-d1d8a55a58f1','1976-12-14',3705370.96,'48014315',NULL,'Et ullam non quaerat voluptas.',NULL,1,'2016-12-19 21:50:32','2016-12-19 21:50:32',1,NULL,1,NULL,NULL,NULL,4,1,4,NULL,NULL,NULL,NULL,12,NULL);
         /*!40000 ALTER TABLE `assets` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -297,7 +298,7 @@ CREATE TABLE `categories` (
           `category_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT 'asset',
           `checkin_email` tinyint(1) NOT NULL DEFAULT '0',
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -306,7 +307,7 @@ CREATE TABLE `categories` (
         
         LOCK TABLES `categories` WRITE;
         /*!40000 ALTER TABLE `categories` DISABLE KEYS */;
        -INSERT INTO `categories` VALUES (1,'Soluta consequatur.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(2,'Saepe repellendus.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(3,'Hic dolores minus.','2016-11-20 23:07:29','2016-11-21 00:33:32',NULL,'2016-11-21 00:33:32',NULL,0,0,'asset',0),(4,'Qui necessitatibus.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(5,'Beatae accusamus.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(6,'Error cum omnis.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(7,'Ipsam repellat id.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(8,'Asperiores nesciunt.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(9,'Quia sit veniam.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(10,'Quaerat repellendus.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'asset',0),(11,'Atque fuga esse.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'accessory',0),(12,'Et illo error porro.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'accessory',0),(13,'Soluta ipsam ea.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'accessory',0),(14,'Repellat mollitia.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'accessory',0),(15,'Et reprehenderit.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'accessory',0),(16,'Quia unde qui.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'consumable',0),(17,'Sunt quo voluptatem.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'consumable',0),(18,'Voluptatum dolor.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'consumable',0),(19,'Et sed doloremque.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'consumable',0),(20,'Pariatur qui amet.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'consumable',0),(21,'Deleniti occaecati.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'component',0),(22,'Tenetur aut dolores.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'component',0),(23,'Quae a ullam maxime.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'component',0),(24,'Quo harum enim quo.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'component',0),(25,'Nesciunt molestias.','2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,0,0,'component',0),(26,'TestModel','2016-11-21 00:33:32','2016-11-21 00:33:32',1,NULL,'lorem ipsum blah blah',0,1,'accessory',1);
        +INSERT INTO `categories` VALUES (1,'Consequuntur nam et.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Ab quasi ut dolore voluptas. Aperiam beatae quia voluptatum ea. Dolores in perspiciatis consequatur qui iusto eius.',0,1,'asset',0),(2,'Quas et quia rerum.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Animi veritatis molestiae provident ut culpa hic. Optio laboriosam esse totam temporibus optio. Sint dolores ea sunt eveniet. Sit aliquam et culpa reiciendis quasi.',0,0,'asset',0),(3,'Exercitationem.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Fugit et ut eos laboriosam. Unde quis labore laborum assumenda voluptatum expedita. Ut qui expedita doloremque placeat. Corrupti et quibusdam explicabo aut at est voluptatibus.',0,0,'asset',1),(4,'Ullam qui.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Soluta ipsa iure ut. Delectus est in fugiat architecto aspernatur. Consequuntur quisquam hic cum corrupti. Repudiandae aliquam perferendis vero reiciendis fugit dolores fugiat.',0,0,'asset',0),(5,'Culpa earum rerum.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Et natus nostrum aut aperiam sit soluta dolorem. Alias eum cumque dolores qui velit aliquid assumenda. Quo quia rerum omnis ducimus itaque.',0,1,'asset',0),(6,'Est ad id veniam.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Sapiente minus dolorem qui doloremque unde. Perferendis dignissimos qui nobis dolores aspernatur et. Ad ut eum eos quis voluptatem omnis.',0,1,'asset',0),(7,'Nulla commodi nobis.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Illo quam ut consequatur quo. Non quaerat sit esse quisquam aut omnis veniam autem.',0,1,'asset',1),(8,'Maxime illo quidem.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Est labore quia enim dolores autem eligendi sit. Nisi et voluptatem id praesentium. Vitae repellendus natus suscipit provident quasi non. Doloremque hic ut voluptatem dolore corrupti nihil. Et qui est iure ut voluptatem eos.',0,0,'asset',1),(9,'Dolorum ut.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Temporibus et ullam doloribus. Doloribus debitis voluptas aut et enim. Dolorem corporis cumque nulla nihil laudantium eum corrupti.',0,0,'asset',0),(10,'Repellat sed sequi.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'Animi non omnis aut perferendis architecto. Dolores earum non voluptas voluptas nostrum quis aut. Et cumque non perspiciatis facere maiores quis similique. Accusantium eum perspiciatis ut doloribus quia ut.',0,0,'asset',0),(11,'Placeat sequi nulla.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,NULL,0,0,'accessory',0),(12,'Doloribus rem quod.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,NULL,0,0,'accessory',0),(13,'Ea exercitationem.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,NULL,0,0,'accessory',0),(14,'Temporibus rerum.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,NULL,0,0,'accessory',0),(15,'Molestiae quam.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,NULL,0,0,'accessory',0),(16,'Deserunt ex ducimus.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'consumable',0),(17,'Perspiciatis quas.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'consumable',0),(18,'Nobis tempora.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'consumable',0),(19,'Reiciendis tempora.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'consumable',0),(20,'Qui sapiente.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'consumable',0),(21,'Molestiae quia.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'component',0),(22,'Vero quos sapiente.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'component',0),(23,'Architecto dicta.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'component',0),(24,'Voluptatem et aut.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'component',0),(25,'Delectus iusto.','2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,NULL,NULL,0,0,'component',0);
         /*!40000 ALTER TABLE `categories` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -353,7 +354,7 @@ CREATE TABLE `companies` (
           `updated_at` timestamp NULL DEFAULT NULL,
           PRIMARY KEY (`id`),
           UNIQUE KEY `companies_name_unique` (`name`)
        -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -362,7 +363,7 @@ CREATE TABLE `companies` (
         
         LOCK TABLES `companies` WRITE;
         /*!40000 ALTER TABLE `companies` DISABLE KEYS */;
        -INSERT INTO `companies` VALUES (1,'Brekke-Heathcote','2016-11-20 23:07:28','2016-11-20 23:07:28'),(2,'Watsica Ltd','2016-11-20 23:07:28','2016-11-20 23:07:28'),(3,'Armstrong Group','2016-11-20 23:07:28','2016-11-20 23:07:28'),(4,'Willms, Brakus and Shields','2016-11-20 23:07:28','2016-11-20 23:07:28'),(5,'TestCompany','2016-11-21 00:33:34','2016-11-21 00:33:34');
        +INSERT INTO `companies` VALUES (1,'Witting-Lynch','2016-12-19 21:50:31','2016-12-19 21:50:31'),(2,'Rippin, Muller and Luettgen','2016-12-19 21:50:31','2016-12-19 21:50:31'),(3,'Harber LLC','2016-12-19 21:50:31','2016-12-19 21:50:31'),(4,'Ortiz, Corwin and Howe','2016-12-19 21:50:31','2016-12-19 21:50:31'),(5,'Abernathy-Hagenes','2016-12-19 21:50:31','2016-12-19 21:50:31'),(6,'Sipes-Bruen','2016-12-19 21:50:31','2016-12-19 21:50:31'),(7,'Marquardt-Maggio','2016-12-19 21:50:31','2016-12-19 21:50:31'),(8,'Bayer-Mohr','2016-12-19 21:50:31','2016-12-19 21:50:31'),(9,'Kuhlman-Dickinson','2016-12-19 21:50:31','2016-12-19 21:50:31'),(10,'Bergnaum, Lesch and White','2016-12-19 21:50:31','2016-12-19 21:50:31'),(11,'Heller-Ritchie','2016-12-19 21:50:31','2016-12-19 21:50:31'),(12,'Nicolas Ltd','2016-12-19 21:50:31','2016-12-19 21:50:31'),(13,'Kiehn-Tillman','2016-12-19 21:50:31','2016-12-19 21:50:31'),(14,'Schulist PLC','2016-12-19 21:50:31','2016-12-19 21:50:31');
         /*!40000 ALTER TABLE `companies` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -390,7 +391,7 @@ CREATE TABLE `components` (
           `min_amt` int(11) DEFAULT NULL,
           `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -399,7 +400,7 @@ CREATE TABLE `components` (
         
         LOCK TABLES `components` WRITE;
         /*!40000 ALTER TABLE `components` DISABLE KEYS */;
        -INSERT INTO `components` VALUES (1,'Non rerum.',21,NULL,1,NULL,9,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,2,NULL),(2,'Ut odio nesciunt.',23,NULL,4,NULL,8,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,1,NULL),(3,'Quia eaque deleniti.',22,NULL,3,NULL,4,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-21 00:33:37','2016-11-21 00:33:37',2,NULL),(4,'Et et voluptates.',21,NULL,4,NULL,4,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,2,NULL),(5,'In aliquid soluta.',25,NULL,2,NULL,3,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,1,NULL),(6,'Quod expedita.',23,NULL,2,NULL,5,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,2,NULL),(7,'Delectus rerum.',21,NULL,2,NULL,10,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,1,NULL),(8,'Et et molestiae.',21,NULL,1,NULL,3,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,1,NULL),(9,'Nisi praesentium.',22,NULL,1,NULL,5,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,1,NULL),(10,'Vitae vitae maxime.',22,NULL,1,NULL,8,NULL,NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,1,NULL),(11,'TestComponent',25,2,2,1,12,'12345','2016-01-01',25.00,'2016-11-21 00:33:36','2016-11-21 00:33:36',NULL,6,'3062436032621632326-325632523');
        +INSERT INTO `components` VALUES (1,'Quo accusantium.',25,3,14,NULL,6,'5276113','1982-10-01',146570010.65,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,1,'97446409-3f8a-3cfd-a0c2-f3b41e635e4e'),(2,'Nemo aperiam.',22,5,2,NULL,3,'13119731','1978-05-14',2.92,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,1,'d719a64b-3efc-3ec3-a9ab-b4f2c92e608a'),(3,'Dolore quia nobis.',24,4,2,NULL,4,'18938355','1977-11-30',30.00,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,1,'a628f55b-dd07-3312-bc50-9ec914edf380'),(4,'Qui eligendi et.',22,2,12,NULL,5,'46656548','1980-10-12',1.01,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,1,'d0dbbeab-b199-380c-b1ce-1ffad2b96a6b'),(5,'Doloribus explicabo.',25,1,3,NULL,9,'28269151','1996-01-08',208.29,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,1,'93f6e95d-caf0-3fbe-bbf7-9de557d809bc'),(6,'Rerum et expedita.',21,1,13,NULL,9,'31787294','1974-12-14',169.40,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,2,'3cfdbe64-af6f-3cf6-b8fb-ba56c2d04ce0'),(7,'Ut placeat nam.',23,3,6,NULL,6,'14635326','1981-09-28',136.38,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,2,'c39f550a-5188-3f45-916c-1429007e7fd4'),(8,'Assumenda nostrum.',25,3,12,NULL,9,'30435102','1971-09-25',675467.29,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,1,'0725a57c-b77d-3789-8416-5073cb4f68b8'),(9,'Cupiditate deserunt.',23,4,4,NULL,10,'41401814','1988-12-22',1.72,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,2,'64fd4267-ca2f-32aa-bedb-65b7c3de2efa'),(10,'Quaerat possimus ad.',21,2,11,NULL,6,'26163775','2007-02-11',29839.13,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,2,'ff1a4866-5da6-3b0d-ab63-0efce06899c9');
         /*!40000 ALTER TABLE `components` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -458,7 +459,7 @@ CREATE TABLE `consumables` (
           `manufacturer_id` int(11) DEFAULT NULL,
           `item_no` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -467,7 +468,7 @@ CREATE TABLE `consumables` (
         
         LOCK TABLES `consumables` WRITE;
         /*!40000 ALTER TABLE `consumables` DISABLE KEYS */;
        -INSERT INTO `consumables` VALUES (1,'Corporis voluptate.',17,NULL,NULL,5,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,2,NULL,NULL,NULL),(2,'Quis dolores sunt.',19,NULL,NULL,10,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,1,1,NULL,NULL,NULL),(3,'Perferendis.',16,NULL,NULL,8,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,4,2,NULL,NULL,NULL),(4,'Maiores esse magni.',20,NULL,NULL,10,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,2,NULL,NULL,NULL),(5,'Vitae eum deserunt.',19,NULL,NULL,8,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,2,NULL,NULL,NULL),(6,'Nam et ab officiis.',17,NULL,NULL,9,0,'2016-11-20 23:07:29','2016-11-21 00:33:39','2016-11-21 00:33:39',NULL,NULL,NULL,3,2,NULL,NULL,NULL),(7,'Voluptates officia.',19,NULL,NULL,9,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,3,1,NULL,NULL,NULL),(8,'Autem reprehenderit.',19,NULL,NULL,7,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,3,1,NULL,NULL,NULL),(9,'Omnis fugit sed.',17,NULL,NULL,5,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,1,NULL,NULL,NULL),(10,'Quia qui.',17,NULL,NULL,10,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,3,1,NULL,NULL,NULL),(11,'Officiis impedit.',19,NULL,NULL,8,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,2,NULL,NULL,NULL),(12,'Sunt harum dicta.',18,NULL,NULL,7,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,1,NULL,NULL,NULL),(13,'Sed accusamus porro.',20,NULL,NULL,7,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,4,1,NULL,NULL,NULL),(14,'Deleniti magnam.',16,NULL,NULL,5,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,3,1,NULL,NULL,NULL),(15,'Fugiat.',19,NULL,NULL,6,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,1,NULL,NULL,NULL),(16,'Illum vel enim.',17,NULL,NULL,5,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,4,1,NULL,NULL,NULL),(17,'Debitis quae.',16,NULL,NULL,5,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,2,NULL,NULL,NULL),(18,'Nulla inventore.',20,NULL,NULL,6,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,1,1,NULL,NULL,NULL),(19,'Quaerat voluptatem.',18,NULL,NULL,8,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,3,1,NULL,NULL,NULL),(20,'Dolores.',17,NULL,NULL,6,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,1,1,NULL,NULL,NULL),(21,'Modi maiores.',18,NULL,NULL,8,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,4,1,NULL,NULL,NULL),(22,'Provident eos.',20,NULL,NULL,10,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,4,2,NULL,NULL,NULL),(23,'Error molestiae.',19,NULL,NULL,9,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,1,2,NULL,NULL,NULL),(24,'Dolor quos est rem.',18,NULL,NULL,7,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,2,1,NULL,NULL,NULL),(25,'Maiores facilis.',16,NULL,NULL,10,0,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,3,2,NULL,NULL,NULL),(26,'TestConsumable',21,0,1,12,0,'2016-11-21 00:33:39','2016-11-21 00:33:39',NULL,'2016-01-01',25.00,'12345',2,6,'032-356',0,'32503');
        +INSERT INTO `consumables` VALUES (1,'Dolorem autem.',17,NULL,NULL,5,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2016-02-16',507.15,'6976392',2,2,'13465702',NULL,'13353410'),(2,'Fugiat enim labore.',17,NULL,NULL,6,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1996-11-07',21517.73,'9509607',4,1,'32881375',NULL,'30455104'),(3,'Ullam quia dolores.',18,NULL,NULL,9,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1999-11-15',54896.12,'40573251',12,1,'21988042',NULL,'18057084'),(4,'Sunt odit atque.',18,NULL,NULL,7,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1985-04-22',690129.28,'43303406',1,2,'49636820',NULL,'25536611'),(5,'Quam incidunt.',20,NULL,NULL,9,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1971-12-19',2426969.19,'21877507',11,1,'32460677',NULL,'22811534'),(6,'Provident non.',19,NULL,NULL,6,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2011-03-25',167.90,'8853497',6,2,'40203583',NULL,'16006812'),(7,'Nostrum rerum est.',19,NULL,NULL,6,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1975-01-15',230401243.30,'9379535',2,2,'8727416',NULL,'42504871'),(8,'Nihil at.',20,NULL,NULL,9,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2001-10-15',15556237.79,'17361470',12,2,'10398395',NULL,'25775635'),(9,'Laboriosam qui.',17,NULL,NULL,6,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1976-03-20',653032741.28,'41913675',12,2,'24295643',NULL,'41812753'),(10,'Enim illum culpa.',20,NULL,NULL,10,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2006-08-14',110117.47,'26935159',7,2,'30738784',NULL,'36229625'),(11,'Eum commodi eum.',18,NULL,NULL,7,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2011-04-18',27.01,'24450060',14,2,'42782151',NULL,'43116946'),(12,'Voluptatem et esse.',18,NULL,NULL,7,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1987-04-22',18.70,'24071954',2,2,'46802751',NULL,'46411285'),(13,'Commodi ipsum.',17,NULL,NULL,10,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1994-06-15',0.35,'4457969',13,1,'20065743',NULL,'21985297'),(14,'Suscipit aut sed.',20,NULL,NULL,6,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1991-02-10',4812.52,'46912386',5,1,'4471192',NULL,'22201553'),(15,'Iste eos ipsum.',20,NULL,NULL,8,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2001-10-05',86.31,'3290625',14,1,'46937674',NULL,'44510259'),(16,'Ut unde dolores.',16,NULL,NULL,6,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1975-06-29',58.32,'33777371',4,1,'46549686',NULL,'11400310'),(17,'Ea vel ea.',18,NULL,NULL,5,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1980-09-08',561914353.65,'16006671',6,2,'32826525',NULL,'8161568'),(18,'Et dolorem aut.',19,NULL,NULL,10,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2013-02-10',1.37,'24984050',6,1,'22532772',NULL,'34330878'),(19,'Atque aperiam.',20,NULL,NULL,9,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2009-06-19',382.24,'23722665',4,1,'5598352',NULL,'49367661'),(20,'Quam sit porro.',16,NULL,NULL,5,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2005-05-02',38.16,'48727140',10,1,'36765531',NULL,'44519233'),(21,'Voluptas soluta.',18,NULL,NULL,5,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1976-01-06',2717.80,'43854143',8,1,'16609710',NULL,'17357462'),(22,'Asperiores eum.',20,NULL,NULL,7,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2006-09-16',3.43,'5570944',9,1,'2701249',NULL,'13455708'),(23,'Aliquam sunt at aut.',17,NULL,NULL,6,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2004-04-11',1.52,'37111882',3,2,'11437542',NULL,'10192323'),(24,'Autem autem fuga.',20,NULL,NULL,9,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'2014-03-10',9351.93,'34134586',14,1,'34320514',NULL,'9872607'),(25,'Ratione qui enim.',19,NULL,NULL,10,0,'2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,'1998-08-17',697456.72,'13809747',13,1,'17918268',NULL,'17347142');
         /*!40000 ALTER TABLE `consumables` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -538,8 +539,10 @@ CREATE TABLE `custom_fields` (
           `created_at` timestamp NULL DEFAULT NULL,
           `updated_at` timestamp NULL DEFAULT NULL,
           `user_id` int(11) DEFAULT NULL,
        -  `field_values` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `field_values` text COLLATE utf8_unicode_ci,
           `field_encrypted` tinyint(1) NOT NULL DEFAULT '0',
        +  `db_column` varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `help_text` text COLLATE utf8_unicode_ci,
           PRIMARY KEY (`id`)
         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
        @@ -595,7 +598,7 @@ CREATE TABLE `depreciations` (
           `updated_at` timestamp NULL DEFAULT NULL,
           `user_id` int(11) DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -604,7 +607,7 @@ CREATE TABLE `depreciations` (
         
         LOCK TABLES `depreciations` WRITE;
         /*!40000 ALTER TABLE `depreciations` DISABLE KEYS */;
        -INSERT INTO `depreciations` VALUES (2,'TestDepreciation',15,'2016-11-21 00:33:41','2016-11-21 00:33:41',1);
        +INSERT INTO `depreciations` VALUES (1,'Excepturi eius.',6,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL);
         /*!40000 ALTER TABLE `depreciations` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -622,7 +625,7 @@ CREATE TABLE `groups` (
           `created_at` timestamp NULL DEFAULT NULL,
           `updated_at` timestamp NULL DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -631,10 +634,37 @@ CREATE TABLE `groups` (
         
         LOCK TABLES `groups` WRITE;
         /*!40000 ALTER TABLE `groups` DISABLE KEYS */;
        -INSERT INTO `groups` VALUES (2,'TestGroup','{\"superuser\":\"0\",\"admin\":\"0\",\"reports.view\":\"0\",\"assets.view\":\"0\",\"assets.create\":\"0\",\"assets.edit\":\"0\",\"assets.delete\":\"0\",\"assets.checkin\":\"0\",\"assets.checkout\":\"0\",\"assets.view.requestable\":\"0\",\"accessories.view\":\"0\",\"accessories.create\":\"0\",\"accessories.edit\":\"0\",\"accessories.delete\":\"0\",\"accessories.checkout\":\"0\",\"accessories.checkin\":\"0\",\"consumables.view\":\"0\",\"consumables.create\":\"0\",\"consumables.edit\":\"0\",\"consumables.delete\":\"0\",\"consumables.checkout\":\"0\",\"licenses.view\":\"0\",\"licenses.create\":\"0\",\"licenses.edit\":\"0\",\"licenses.delete\":\"0\",\"licenses.checkout\":\"0\",\"licenses.keys\":\"0\",\"components.view\":\"0\",\"components.create\":\"0\",\"components.edit\":\"0\",\"components.delete\":\"0\",\"components.checkout\":\"0\",\"components.checkin\":\"0\",\"users.view\":\"0\",\"users.create\":\"0\",\"users.edit\":\"0\",\"users.delete\":\"0\",\"self.two_factor\":\"0\"}','2016-11-21 00:33:44','2016-11-21 00:33:44');
         /*!40000 ALTER TABLE `groups` ENABLE KEYS */;
         UNLOCK TABLES;
         
        +--
        +-- Table structure for table `imports`
        +--
        +
        +DROP TABLE IF EXISTS `imports`;
        +/*!40101 SET @saved_cs_client     = @@character_set_client */;
        +/*!40101 SET character_set_client = utf8 */;
        +CREATE TABLE `imports` (
        +  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        +  `name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
        +  `file_path` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
        +  `filesize` int(11) NOT NULL,
        +  `import_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
        +  `created_at` timestamp NULL DEFAULT NULL,
        +  `updated_at` timestamp NULL DEFAULT NULL,
        +  PRIMARY KEY (`id`)
        +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        +/*!40101 SET character_set_client = @saved_cs_client */;
        +
        +--
        +-- Dumping data for table `imports`
        +--
        +
        +LOCK TABLES `imports` WRITE;
        +/*!40000 ALTER TABLE `imports` DISABLE KEYS */;
        +/*!40000 ALTER TABLE `imports` ENABLE KEYS */;
        +UNLOCK TABLES;
        +
         --
         -- Table structure for table `license_seats`
         --
        @@ -653,7 +683,7 @@ CREATE TABLE `license_seats` (
           `deleted_at` timestamp NULL DEFAULT NULL,
           `asset_id` int(11) DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -662,7 +692,7 @@ CREATE TABLE `license_seats` (
         
         LOCK TABLES `license_seats` WRITE;
         /*!40000 ALTER TABLE `license_seats` DISABLE KEYS */;
        -INSERT INTO `license_seats` VALUES (1,1,NULL,'Enim ratione repudiandae voluptas inventore harum nihil non.',1,'1985-04-22 07:56:43','2016-11-21 00:33:47','2016-11-21 00:33:47',NULL),(2,5,NULL,'Quidem nesciunt laudantium reprehenderit quia nemo non enim saepe.',1,'2008-11-13 14:47:37','2002-06-10 20:39:02',NULL,NULL),(3,10,NULL,'Ipsa labore repellendus magni rem.',1,'1997-03-02 08:23:45','1970-03-28 10:33:13',NULL,NULL),(4,3,NULL,'Impedit corporis sapiente numquam tenetur explicabo dolores et ipsam.',1,'1997-07-18 14:12:28','2012-11-20 06:52:26',NULL,NULL),(5,3,NULL,'Autem explicabo consequatur harum consequatur repellat voluptate.',1,'1992-02-25 09:18:12','2013-11-25 04:08:47',NULL,NULL),(6,5,NULL,'Repellendus vero voluptatem voluptate sed ipsam.',1,'1970-03-25 07:11:55','1994-07-21 11:28:55',NULL,NULL),(7,10,NULL,'Tenetur sequi blanditiis similique quaerat explicabo quibusdam excepturi.',1,'1971-07-26 14:28:52','1995-12-16 02:16:50',NULL,NULL),(8,3,NULL,'Nostrum veniam nulla quo consequatur consequatur et omnis eum.',1,'1972-09-10 03:47:34','1979-11-30 18:06:57',NULL,NULL),(9,5,NULL,'Sint nihil omnis quod accusamus.',1,'1983-04-08 19:17:09','2008-06-22 21:35:40',NULL,NULL),(10,7,NULL,'Ea et placeat quod blanditiis sed.',1,'2002-04-06 11:19:24','1996-02-14 01:10:39',NULL,NULL),(11,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(12,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(13,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(14,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(15,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(16,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(17,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(18,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(19,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(20,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(21,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL),(22,11,NULL,NULL,1,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,NULL);
        +INSERT INTO `license_seats` VALUES (1,7,NULL,'Eum quam aut quia ab fugiat officiis.',1,'1979-04-17 02:53:27','1998-10-18 20:04:38',NULL,NULL),(2,1,NULL,'Blanditiis minima dolorum sed tenetur molestias.',1,'2012-05-20 16:59:26','1970-04-13 02:45:39',NULL,NULL),(3,6,NULL,'Consequatur suscipit debitis occaecati quo sunt vel qui vel.',1,'2012-03-08 05:56:23','2014-08-27 08:05:06',NULL,NULL),(4,1,NULL,'Molestiae repellendus tempore laudantium architecto non.',1,'1976-03-28 12:49:56','2013-02-20 02:58:00',NULL,NULL),(5,7,NULL,'Doloribus ratione officiis error eum eum magnam.',1,'1983-04-26 01:44:32','1975-08-27 11:45:27',NULL,NULL),(6,5,NULL,'Omnis libero nobis recusandae rerum possimus.',1,'1993-08-09 04:40:13','1989-05-15 13:53:39',NULL,NULL),(7,4,NULL,'Repudiandae perspiciatis pariatur at blanditiis.',1,'2016-11-24 21:08:57','1985-06-29 02:24:14',NULL,NULL),(8,1,NULL,'Rerum aut itaque ut est.',1,'1990-06-25 14:12:00','1990-12-09 10:53:53',NULL,NULL),(9,9,NULL,'Amet provident suscipit similique ducimus repudiandae nobis beatae.',1,'2009-08-07 14:18:58','2010-08-13 10:44:43',NULL,NULL),(10,7,NULL,'Vero facilis molestiae occaecati iure.',1,'2015-03-27 06:46:55','1989-10-16 06:21:40',NULL,NULL);
         /*!40000 ALTER TABLE `license_seats` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -699,7 +729,7 @@ CREATE TABLE `licenses` (
           `company_id` int(10) unsigned DEFAULT NULL,
           `manufacturer_id` int(11) DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -708,7 +738,7 @@ CREATE TABLE `licenses` (
         
         LOCK TABLES `licenses` WRITE;
         /*!40000 ALTER TABLE `licenses` DISABLE KEYS */;
        -INSERT INTO `licenses` VALUES (1,'Implemented composite firmware','399629fa-69f5-3eaa-a0c0-8a53977030e3','2002-08-18',2744038.81,NULL,8,'Aut ea corrupti eligendi.',NULL,NULL,'2016-11-20 23:07:29','2016-11-21 00:33:47','2016-11-21 00:33:47','Katharina Kulas','noelia.hermann@example.com',NULL,NULL,NULL,NULL,NULL,NULL,1,3,NULL),(2,'Optimized systemic intranet','89c6abac-19d9-3b54-ae5e-66f2556f0ec3','2012-08-25',269.24,NULL,1,'Quam eos praesentium sed aut quisquam dignissimos.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Mrs. Anika Cruickshank','drake.block@example.net',NULL,NULL,NULL,NULL,NULL,NULL,1,4,NULL),(3,'Expanded client-server methodology','7ae03022-765d-3791-b96f-e7fe31491061','1994-02-28',213701.76,NULL,2,'Molestiae porro dolorem vero quisquam quos praesentium debitis.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Prof. Dock Schumm MD','roslyn.torp@example.org',NULL,NULL,NULL,NULL,NULL,NULL,1,2,NULL),(4,'Mandatory solution-oriented extranet','f3d92679-78db-38fa-aa9b-d93354e74d0c','1996-10-08',2725956.85,NULL,9,'Et et nesciunt quasi magnam dolorum sed.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Kendra Skiles','valerie62@example.org',NULL,NULL,NULL,NULL,NULL,NULL,1,4,NULL),(5,'Secured fault-tolerant architecture','d2fe95cd-38b2-3b85-9d9f-ad325288bb06','2010-08-24',5924561.63,NULL,5,'Repellat iste laudantium eum ullam quam.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Erica Kunde Jr.','genoveva16@example.org',NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL),(6,'Fundamental context-sensitive product','ac1d2639-e0a7-34e6-9141-a491f4081e06','1982-06-16',2173.49,NULL,7,'Ut non esse qui voluptas.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Maryam Sawayn','raymond35@example.org',NULL,NULL,NULL,NULL,NULL,NULL,1,2,NULL),(7,'Visionary attitude-oriented collaboration','da42bf65-2aeb-315a-a05a-92b0e4dea5f0','2005-06-03',0.00,NULL,9,'Velit consequuntur cum cumque maxime voluptas.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Ofelia Bogan MD','alessia.friesen@example.com',NULL,NULL,NULL,NULL,NULL,NULL,1,4,NULL),(8,'Visionary needs-based strategy','24c1090b-fda1-382b-bf30-97435c22c225','1980-05-16',394166.60,NULL,6,'Provident omnis incidunt non consequuntur molestiae et adipisci.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Emile Langosh DVM','ndietrich@example.org',NULL,NULL,NULL,NULL,NULL,NULL,1,4,NULL),(9,'Public-key responsive installation','7bc5a1fe-c90e-391a-bc71-194cdaa8bfbc','1994-01-07',674379.59,NULL,9,'Reiciendis dolor excepturi consequatur velit nobis magni.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Curt Gutmann','enienow@example.com',NULL,NULL,NULL,NULL,NULL,NULL,1,2,NULL),(10,'Cross-group asynchronous neural-net','1e8d0378-3fdb-3883-8bd2-a7dbf477d2dc','1986-12-28',178.51,NULL,7,'Sunt est ducimus tempora excepturi ut.',NULL,NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,'Brittany Mann','pouros.cristopher@example.net',NULL,NULL,NULL,NULL,NULL,NULL,1,2,NULL),(11,'Test Software','946346-436346-346436','2016-01-01',25.00,'12345',12,'lorem ipsum omicron delta phi',1,0,'2016-11-21 00:33:46','2016-11-21 00:33:46',NULL,'Marco Polo','g@m.com',NULL,4,'2018-01-01','234562','2020-01-01',1,1,4,1);
        +INSERT INTO `licenses` VALUES (1,'Managed human-resource data-warehouse','922a477b-5b45-3ed6-874c-0e7de14c1881','1982-06-12',499979278.31,'12058',9,'Modi et vel cum aspernatur totam.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Samir Zboncak','shaylee30@example.org',NULL,1,NULL,'7160',NULL,NULL,1,3,NULL),(2,'Reverse-engineered neutral opensystem','c73e659c-4f0d-3068-ac19-fc8b2b19ecf9','2008-08-30',4805486.18,'6378',1,'Voluptatum veritatis non et iusto reprehenderit et sit.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Mrs. Luna Kreiger DVM','carter.tad@example.net',NULL,5,NULL,'6376',NULL,NULL,1,8,NULL),(3,'Horizontal uniform complexity','fa785f96-b3c8-3193-a711-7bc1efedd170','1987-04-21',260263734.84,'3005',4,'Officia cumque quia quas quos omnis ab.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Vergie Vandervort','opowlowski@example.net',NULL,3,NULL,'11274',NULL,NULL,1,13,NULL),(4,'Ergonomic didactic conglomeration','ec6ef12c-b410-3049-a67e-ad347cfafde8','1980-08-12',543563363.20,'8633',9,'Et fugiat architecto ut exercitationem ut aliquam ratione.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Fiona Zieme','kip.aufderhar@example.org',NULL,2,NULL,'3138',NULL,NULL,1,6,NULL),(5,'Virtual discrete hierarchy','9e9a0f16-7112-3520-94ef-4ea35f5fee91','1993-11-28',80.01,'3054',1,'Unde error illo animi.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Toy Mohr','brenda24@example.com',NULL,5,NULL,'8272',NULL,NULL,1,7,NULL),(6,'Vision-oriented client-driven hierarchy','507a0df7-bed3-3d11-aa6a-276f196314b8','2009-03-19',389822553.07,'1773',9,'Atque amet quia quas consequatur ea.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Hadley Reynolds','deckow.dino@example.com',NULL,4,NULL,'1720',NULL,NULL,1,14,NULL),(7,'Customer-focused tertiary standardization','4986e730-2f34-33da-8dcb-48797f7cb264','2010-08-15',55988090.42,'1889',9,'Voluptas beatae repellat quia.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Dr. Casper Grimes Jr.','yessenia.buckridge@example.org',NULL,1,NULL,'8278',NULL,NULL,1,6,NULL),(8,'Sharable contextually-based framework','2bca5bc2-b157-365a-84b3-d26d36a433a6','1988-08-31',458496.90,'12951',1,'Vel suscipit consequatur non exercitationem beatae facilis.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Prof. Ashton Wiza','mmonahan@example.net',NULL,5,NULL,'9662',NULL,NULL,1,3,NULL),(9,'Compatible user-facing securedline','a8f1eb71-a815-3548-81b1-07dfc6539365','2012-02-10',20240139.56,'10135',10,'Nihil consequatur et itaque.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Mr. Garett Wuckert','thartmann@example.net',NULL,3,NULL,'10645',NULL,NULL,1,5,NULL),(10,'Implemented upward-trending initiative','58ebb089-8c77-3adc-ac4e-7c557ebca861','1980-12-21',212.73,'7550',10,'Et et molestiae recusandae facere.',NULL,NULL,'2016-12-19 21:50:33','2016-12-19 21:50:33',NULL,'Dr. Jada Dach','ulices69@example.com',NULL,3,NULL,'2130',NULL,NULL,1,1,NULL);
         /*!40000 ALTER TABLE `licenses` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -734,8 +764,10 @@ CREATE TABLE `locations` (
           `deleted_at` timestamp NULL DEFAULT NULL,
           `parent_id` int(11) DEFAULT NULL,
           `currency` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `ldap_ou` varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `manager_id` int(11) DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -744,7 +776,7 @@ CREATE TABLE `locations` (
         
         LOCK TABLES `locations` WRITE;
         /*!40000 ALTER TABLE `locations` DISABLE KEYS */;
        -INSERT INTO `locations` VALUES (1,'New Edd','Margieton','FL','UM','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL,NULL,NULL,NULL,NULL,'AUD'),(2,'Hesselside','Daletown','WA','AM','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL,NULL,NULL,NULL,NULL,'SCR'),(3,'South Cleoramouth','Gudrunville','MD','MS','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL,NULL,NULL,NULL,NULL,'TTD'),(4,'Breitenbergview','Rolfsonmouth','NH','DE','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL,NULL,NULL,NULL,NULL,'JOD'),(5,'Beahanmouth','Haylieland','IL','SO','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL,NULL,NULL,NULL,NULL,'ZWL'),(6,'Test Location','Sutherland','BV','AF','2016-11-21 00:33:49','2016-11-21 00:33:49',1,'046t46 South Street','Apt 356','30266','2016-11-21 00:33:49',3,'YEN');
        +INSERT INTO `locations` VALUES (1,'Multi-lateral 24hour hub','North Llewellyn','IN','BJ','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,'13212 Schmidt Extensions Suite 682','Apt. 456','67559',NULL,NULL,'TWD',NULL,NULL),(2,'Streamlined value-added firmware','East Johnathonville','IL','BS','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,'9429 Koch Village','Suite 789','51112-9226',NULL,NULL,'TTD',NULL,NULL),(3,'Persistent asynchronous frame','New Delphaside','AK','LR','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,'7600 Howell Valleys Apt. 730','Suite 939','26693',NULL,NULL,'JPY',NULL,NULL),(4,'Inverse optimal array','Port Laura','DE','SC','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,'9542 Cronin Crescent Apt. 550','Suite 792','56208-6621',NULL,NULL,'SYP',NULL,NULL),(5,'Networked zeroadministration standardization','Paucekfort','FL','MZ','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,'187 Gerhold Harbor Suite 314','Suite 620','68500',NULL,NULL,'CLF',NULL,NULL);
         /*!40000 ALTER TABLE `locations` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -762,8 +794,12 @@ CREATE TABLE `manufacturers` (
           `updated_at` timestamp NULL DEFAULT NULL,
           `user_id` int(11) DEFAULT NULL,
           `deleted_at` timestamp NULL DEFAULT NULL,
        +  `url` varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `support_url` varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `support_phone` varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `support_email` varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -772,7 +808,7 @@ CREATE TABLE `manufacturers` (
         
         LOCK TABLES `manufacturers` WRITE;
         /*!40000 ALTER TABLE `manufacturers` DISABLE KEYS */;
        -INSERT INTO `manufacturers` VALUES (1,'Schaden, Waters and Koelpin','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(2,'Harber Group','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(3,'Johnson, Skiles and Howell','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(4,'Krajcik, Gutmann and Walter','2016-11-20 23:07:30','2016-11-21 00:33:52',NULL,'2016-11-21 00:33:52'),(5,'Stark, Bradtke and Rohan','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(6,'Gulgowski, Renner and Lebsack','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(7,'Murazik-Lakin','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(8,'Fahey and Sons','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(9,'Leannon Ltd','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(10,'Romaguera-Heidenreich','2016-11-20 23:07:30','2016-11-20 23:07:30',NULL,NULL),(11,'Testufacturer','2016-11-21 00:33:52','2016-11-21 00:33:52',1,NULL);
        +INSERT INTO `manufacturers` VALUES (1,'Hansen and Sons','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(2,'Walker-Kiehn','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(3,'Crooks, Mante and Cruickshank','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(4,'Larson and Sons','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(5,'Koss Ltd','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(6,'Bruen-Adams','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(7,'Smith LLC','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(8,'Johnston, Cummings and Blanda','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(9,'Welch and Sons','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL),(10,'Raynor Ltd','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,NULL);
         /*!40000 ALTER TABLE `manufacturers` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -784,9 +820,11 @@ DROP TABLE IF EXISTS `migrations`;
         /*!40101 SET @saved_cs_client     = @@character_set_client */;
         /*!40101 SET character_set_client = utf8 */;
         CREATE TABLE `migrations` (
        +  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
           `migration` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        -  `batch` int(11) NOT NULL
        -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +  `batch` int(11) NOT NULL,
        +  PRIMARY KEY (`id`)
        +) ENGINE=InnoDB AUTO_INCREMENT=223 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -795,7 +833,7 @@ CREATE TABLE `migrations` (
         
         LOCK TABLES `migrations` WRITE;
         /*!40000 ALTER TABLE `migrations` DISABLE KEYS */;
        -INSERT INTO `migrations` VALUES ('2012_12_06_225921_migration_cartalyst_sentry_install_users',1),('2012_12_06_225929_migration_cartalyst_sentry_install_groups',1),('2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot',1),('2012_12_06_225988_migration_cartalyst_sentry_install_throttle',1),('2013_03_23_193214_update_users_table',1),('2013_11_13_075318_create_models_table',1),('2013_11_13_075335_create_categories_table',1),('2013_11_13_075347_create_manufacturers_table',1),('2013_11_15_015858_add_user_id_to_categories',1),('2013_11_15_112701_add_user_id_to_manufacturers',1),('2013_11_15_190327_create_assets_table',1),('2013_11_15_190357_create_licenses_table',1),('2013_11_15_201848_add_license_name_to_licenses',1),('2013_11_16_040323_create_depreciations_table',1),('2013_11_16_042851_add_depreciation_id_to_models',1),('2013_11_16_084923_add_user_id_to_models',1),('2013_11_16_103258_create_locations_table',1),('2013_11_16_103336_add_location_id_to_assets',1),('2013_11_16_103407_add_checkedout_to_to_assets',1),('2013_11_16_103425_create_history_table',1),('2013_11_17_054359_drop_licenses_table',1),('2013_11_17_054526_add_physical_to_assets',1),('2013_11_17_055126_create_settings_table',1),('2013_11_17_062634_add_license_to_assets',1),('2013_11_18_134332_add_contacts_to_users',1),('2013_11_18_142847_add_info_to_locations',1),('2013_11_18_152942_remove_location_id_from_asset',1),('2013_11_18_164423_set_nullvalues_for_user',1),('2013_11_19_013337_create_asset_logs_table',1),('2013_11_19_061409_edit_added_on_asset_logs_table',1),('2013_11_19_062250_edit_location_id_asset_logs_table',1),('2013_11_20_055822_add_soft_delete_on_assets',1),('2013_11_20_121404_add_soft_delete_on_locations',1),('2013_11_20_123137_add_soft_delete_on_manufacturers',1),('2013_11_20_123725_add_soft_delete_on_categories',1),('2013_11_20_130248_create_status_labels',1),('2013_11_20_130830_add_status_id_on_assets_table',1),('2013_11_20_131544_add_status_type_on_status_labels',1),('2013_11_20_134103_add_archived_to_assets',1),('2013_11_21_002321_add_uploads_table',1),('2013_11_21_024531_remove_deployable_boolean_from_status_labels',1),('2013_11_22_075308_add_option_label_to_settings_table',1),('2013_11_22_213400_edits_to_settings_table',1),('2013_11_25_013244_create_licenses_table',1),('2013_11_25_031458_create_license_seats_table',1),('2013_11_25_032022_add_type_to_actionlog_table',1),('2013_11_25_033008_delete_bad_licenses_table',1),('2013_11_25_033131_create_new_licenses_table',1),('2013_11_25_033534_add_licensed_to_licenses_table',1),('2013_11_25_101308_add_warrantee_to_assets_table',1),('2013_11_25_104343_alter_warranty_column_on_assets',1),('2013_11_25_150450_drop_parent_from_categories',1),('2013_11_25_151920_add_depreciate_to_assets',1),('2013_11_25_152903_add_depreciate_to_licenses_table',1),('2013_11_26_211820_drop_license_from_assets_table',1),('2013_11_27_062510_add_note_to_asset_logs_table',1),('2013_12_01_113426_add_filename_to_asset_log',1),('2013_12_06_094618_add_nullable_to_licenses_table',1),('2013_12_10_084038_add_eol_on_models_table',1),('2013_12_12_055218_add_manager_to_users_table',1),('2014_01_28_031200_add_qr_code_to_settings_table',1),('2014_02_13_183016_add_qr_text_to_settings_table',1),('2014_05_24_093839_alter_default_license_depreciation_id',1),('2014_05_27_231658_alter_default_values_licenses',1),('2014_06_19_191508_add_asset_name_to_settings',1),('2014_06_20_004847_make_asset_log_checkedout_to_nullable',1),('2014_06_20_005050_make_asset_log_purchasedate_to_nullable',1),('2014_06_24_003011_add_suppliers',1),('2014_06_24_010742_add_supplier_id_to_asset',1),('2014_06_24_012839_add_zip_to_supplier',1),('2014_06_24_033908_add_url_to_supplier',1),('2014_07_08_054116_add_employee_id_to_users',1),('2014_07_09_134316_add_requestable_to_assets',1),('2014_07_17_085822_add_asset_to_software',1),('2014_07_17_161625_make_asset_id_in_logs_nullable',1),('2014_08_12_053504_alpha_0_4_2_release',1),('2014_08_17_083523_make_location_id_nullable',1),('2014_10_16_200626_add_rtd_location_to_assets',1),('2014_10_24_000417_alter_supplier_state_to_32',1),('2014_10_24_015641_add_display_checkout_date',1),('2014_10_28_222654_add_avatar_field_to_users_table',1),('2014_10_29_045924_add_image_field_to_models_table',1),('2014_11_01_214955_add_eol_display_to_settings',1),('2014_11_04_231416_update_group_field_for_reporting',1),('2014_11_05_212408_add_fields_to_licenses',1),('2014_11_07_021042_add_image_to_supplier',1),('2014_11_20_203007_add_username_to_user',1),('2014_11_20_223947_add_auto_to_settings',1),('2014_11_20_224421_add_prefix_to_settings',1),('2014_11_21_104401_change_licence_type',1),('2014_12_09_082500_add_fields_maintained_term_to_licenses',1),('2015_02_04_155757_increase_user_field_lengths',1),('2015_02_07_013537_add_soft_deleted_to_log',1),('2015_02_10_040958_fix_bad_assigned_to_ids',1),('2015_02_10_053310_migrate_data_to_new_statuses',1),('2015_02_11_044104_migrate_make_license_assigned_null',1),('2015_02_11_104406_migrate_create_requests_table',1),('2015_02_12_001312_add_mac_address_to_asset',1),('2015_02_12_024100_change_license_notes_type',1),('2015_02_17_231020_add_localonly_to_settings',1),('2015_02_19_222322_add_logo_and_colors_to_settings',1),('2015_02_24_072043_add_alerts_to_settings',1),('2015_02_25_022931_add_eula_fields',1),('2015_02_25_204513_add_accessories_table',1),('2015_02_26_091228_add_accessories_user_table',1),('2015_02_26_115128_add_deleted_at_models',1),('2015_02_26_233005_add_category_type',1),('2015_03_01_231912_update_accepted_at_to_acceptance_id',1),('2015_03_05_011929_add_qr_type_to_settings',1),('2015_03_18_055327_add_note_to_user',1),('2015_04_29_234704_add_slack_to_settings',1),('2015_05_04_085151_add_parent_id_to_locations_table',1),('2015_05_22_124421_add_reassignable_to_licenses',1),('2015_06_10_003314_fix_default_for_user_notes',1),('2015_06_10_003554_create_consumables',1),('2015_06_15_183253_move_email_to_username',1),('2015_06_23_070346_make_email_nullable',1),('2015_06_26_213716_create_asset_maintenances_table',1),('2015_07_04_212443_create_custom_fields_table',1),('2015_07_09_014359_add_currency_to_settings_and_locations',1),('2015_07_21_122022_add_expected_checkin_date_to_asset_logs',1),('2015_07_24_093845_add_checkin_email_to_category_table',1),('2015_07_25_055415_remove_email_unique_constraint',1),('2015_07_29_230054_add_thread_id_to_asset_logs_table',1),('2015_07_31_015430_add_accepted_to_assets',1),('2015_09_09_195301_add_custom_css_to_settings',1),('2015_09_21_235926_create_custom_field_custom_fieldset',1),('2015_09_22_000104_create_custom_fieldsets',1),('2015_09_22_003321_add_fieldset_id_to_assets',1),('2015_09_22_003413_migrate_mac_address',1),('2015_09_28_003314_fix_default_purchase_order',1),('2015_10_01_024551_add_accessory_consumable_price_info',1),('2015_10_12_192706_add_brand_to_settings',1),('2015_10_22_003314_fix_defaults_accessories',1),('2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets',1),('2015_11_05_061015_create_companies_table',1),('2015_11_05_061115_add_company_id_to_consumables_table',1),('2015_11_05_183749_image',1),('2015_11_06_092038_add_company_id_to_accessories_table',1),('2015_11_06_100045_add_company_id_to_users_table',1),('2015_11_06_134742_add_company_id_to_licenses_table',1),('2015_11_08_035832_add_company_id_to_assets_table',1),('2015_11_08_222305_add_ldap_fields_to_settings',1),('2015_11_15_151803_add_full_multiple_companies_support_to_settings_table',1),('2015_11_26_195528_import_ldap_settings',1),('2015_11_30_191504_remove_fk_company_id',1),('2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table',1),('2015_12_30_233509_add_timestamp_and_userId_to_custom_fields',1),('2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets',1),('2016_01_28_041048_add_notes_to_models',1),('2016_02_19_070119_add_remember_token_to_users_table',1),('2016_02_19_073625_create_password_resets_table',1),('2016_03_02_193043_add_ldap_flag_to_users',1),('2016_03_02_220517_update_ldap_filter_to_longer_field',1),('2016_03_08_225351_create_components_table',1),('2016_03_09_024038_add_min_stock_to_tables',1),('2016_03_10_133849_add_locale_to_users',1),('2016_03_10_135519_add_locale_to_settings',1),('2016_03_11_185621_add_label_settings_to_settings',1),('2016_03_22_125911_fix_custom_fields_regexes',1),('2016_04_28_141554_add_show_to_users',1),('2016_05_16_164733_add_model_mfg_to_consumable',1),('2016_05_19_180351_add_alt_barcode_settings',1),('2016_05_19_191146_add_alter_interval',1),('2016_05_19_192226_add_inventory_threshold',1),('2016_05_20_024859_remove_option_keys_from_settings_table',1),('2016_05_20_143758_remove_option_value_from_settings_table',1),('2016_06_01_140218_add_email_domain_and_format_to_settings',1),('2016_06_22_160725_add_user_id_to_maintenances',1),('2016_07_13_150015_add_is_ad_to_settings',1),('2016_07_14_153609_add_ad_domain_to_settings',1),('2016_07_22_003348_fix_custom_fields_regex_stuff',1),('2016_07_22_054850_one_more_mac_addr_fix',1),('2016_07_22_143045_add_port_to_ldap_settings',1),('2016_07_22_153432_add_tls_to_ldap_settings',1),('2016_07_27_211034_add_zerofill_to_settings',1),('2016_08_02_124944_add_color_to_statuslabel',1),('2016_08_04_134500_add_disallow_ldap_pw_sync_to_settings',1),('2016_08_09_002225_add_manufacturer_to_licenses',1),('2016_08_12_121613_add_manufacturer_to_accessories_table',1),('2016_08_23_143353_add_new_fields_to_custom_fields',1),('2016_08_23_145619_add_show_in_nav_to_status_labels',1),('2016_08_30_084634_make_purchase_cost_nullable',1),('2016_09_01_141051_add_requestable_to_asset_model',1),('2016_09_02_001448_create_checkout_requests_table',1),('2016_09_04_180400_create_actionlog_table',1),('2016_09_04_182149_migrate_asset_log_to_action_log',1),('2016_09_19_235935_fix_fieldtype_for_target_type',1),('2016_09_23_140722_fix_modelno_in_consumables_to_string',1),('2016_09_28_231359_add_company_to_logs',1),('2016_10_14_130709_fix_order_number_to_varchar',1),('2016_10_19_145520_fix_order_number_in_components_to_string',1),('2016_10_27_151715_add_serial_to_components',1),('2016_10_27_213251_increase_serial_field_capacity',1),('2016_10_29_002724_enable_2fa_fields',1),('2016_10_29_082408_add_signature_to_acceptance',1),('2016_11_01_030818_fix_forgotten_filename_in_action_logs',1),('2016_10_16_015024_rename_modelno_to_model_number',2),('2016_10_16_015211_rename_consumable_modelno_to_model_number',2),('2016_10_16_143235_rename_model_note_to_notes',2),('2016_10_16_165052_rename_component_total_qty_to_qty',2),('2016_11_13_020954_rename_component_serial_number_to_serial',2),('2016_11_16_172119_increase_purchase_cost_size',3),('2016_11_17_161317_longer_state_field_in_location',3),('2016_11_17_193706_add_model_number_to_accessories',3);
        +INSERT INTO `migrations` VALUES (1,'2012_12_06_225921_migration_cartalyst_sentry_install_users',1),(2,'2012_12_06_225929_migration_cartalyst_sentry_install_groups',1),(3,'2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot',1),(4,'2012_12_06_225988_migration_cartalyst_sentry_install_throttle',1),(5,'2013_03_23_193214_update_users_table',1),(6,'2013_11_13_075318_create_models_table',1),(7,'2013_11_13_075335_create_categories_table',1),(8,'2013_11_13_075347_create_manufacturers_table',1),(9,'2013_11_15_015858_add_user_id_to_categories',1),(10,'2013_11_15_112701_add_user_id_to_manufacturers',1),(11,'2013_11_15_190327_create_assets_table',1),(12,'2013_11_15_190357_create_licenses_table',1),(13,'2013_11_15_201848_add_license_name_to_licenses',1),(14,'2013_11_16_040323_create_depreciations_table',1),(15,'2013_11_16_042851_add_depreciation_id_to_models',1),(16,'2013_11_16_084923_add_user_id_to_models',1),(17,'2013_11_16_103258_create_locations_table',1),(18,'2013_11_16_103336_add_location_id_to_assets',1),(19,'2013_11_16_103407_add_checkedout_to_to_assets',1),(20,'2013_11_16_103425_create_history_table',1),(21,'2013_11_17_054359_drop_licenses_table',1),(22,'2013_11_17_054526_add_physical_to_assets',1),(23,'2013_11_17_055126_create_settings_table',1),(24,'2013_11_17_062634_add_license_to_assets',1),(25,'2013_11_18_134332_add_contacts_to_users',1),(26,'2013_11_18_142847_add_info_to_locations',1),(27,'2013_11_18_152942_remove_location_id_from_asset',1),(28,'2013_11_18_164423_set_nullvalues_for_user',1),(29,'2013_11_19_013337_create_asset_logs_table',1),(30,'2013_11_19_061409_edit_added_on_asset_logs_table',1),(31,'2013_11_19_062250_edit_location_id_asset_logs_table',1),(32,'2013_11_20_055822_add_soft_delete_on_assets',1),(33,'2013_11_20_121404_add_soft_delete_on_locations',1),(34,'2013_11_20_123137_add_soft_delete_on_manufacturers',1),(35,'2013_11_20_123725_add_soft_delete_on_categories',1),(36,'2013_11_20_130248_create_status_labels',1),(37,'2013_11_20_130830_add_status_id_on_assets_table',1),(38,'2013_11_20_131544_add_status_type_on_status_labels',1),(39,'2013_11_20_134103_add_archived_to_assets',1),(40,'2013_11_21_002321_add_uploads_table',1),(41,'2013_11_21_024531_remove_deployable_boolean_from_status_labels',1),(42,'2013_11_22_075308_add_option_label_to_settings_table',1),(43,'2013_11_22_213400_edits_to_settings_table',1),(44,'2013_11_25_013244_create_licenses_table',1),(45,'2013_11_25_031458_create_license_seats_table',1),(46,'2013_11_25_032022_add_type_to_actionlog_table',1),(47,'2013_11_25_033008_delete_bad_licenses_table',1),(48,'2013_11_25_033131_create_new_licenses_table',1),(49,'2013_11_25_033534_add_licensed_to_licenses_table',1),(50,'2013_11_25_101308_add_warrantee_to_assets_table',1),(51,'2013_11_25_104343_alter_warranty_column_on_assets',1),(52,'2013_11_25_150450_drop_parent_from_categories',1),(53,'2013_11_25_151920_add_depreciate_to_assets',1),(54,'2013_11_25_152903_add_depreciate_to_licenses_table',1),(55,'2013_11_26_211820_drop_license_from_assets_table',1),(56,'2013_11_27_062510_add_note_to_asset_logs_table',1),(57,'2013_12_01_113426_add_filename_to_asset_log',1),(58,'2013_12_06_094618_add_nullable_to_licenses_table',1),(59,'2013_12_10_084038_add_eol_on_models_table',1),(60,'2013_12_12_055218_add_manager_to_users_table',1),(61,'2014_01_28_031200_add_qr_code_to_settings_table',1),(62,'2014_02_13_183016_add_qr_text_to_settings_table',1),(63,'2014_05_24_093839_alter_default_license_depreciation_id',1),(64,'2014_05_27_231658_alter_default_values_licenses',1),(65,'2014_06_19_191508_add_asset_name_to_settings',1),(66,'2014_06_20_004847_make_asset_log_checkedout_to_nullable',1),(67,'2014_06_20_005050_make_asset_log_purchasedate_to_nullable',1),(68,'2014_06_24_003011_add_suppliers',1),(69,'2014_06_24_010742_add_supplier_id_to_asset',1),(70,'2014_06_24_012839_add_zip_to_supplier',1),(71,'2014_06_24_033908_add_url_to_supplier',1),(72,'2014_07_08_054116_add_employee_id_to_users',1),(73,'2014_07_09_134316_add_requestable_to_assets',1),(74,'2014_07_17_085822_add_asset_to_software',1),(75,'2014_07_17_161625_make_asset_id_in_logs_nullable',1),(76,'2014_08_12_053504_alpha_0_4_2_release',1),(77,'2014_08_17_083523_make_location_id_nullable',1),(78,'2014_10_16_200626_add_rtd_location_to_assets',1),(79,'2014_10_24_000417_alter_supplier_state_to_32',1),(80,'2014_10_24_015641_add_display_checkout_date',1),(81,'2014_10_28_222654_add_avatar_field_to_users_table',1),(82,'2014_10_29_045924_add_image_field_to_models_table',1),(83,'2014_11_01_214955_add_eol_display_to_settings',1),(84,'2014_11_04_231416_update_group_field_for_reporting',1),(85,'2014_11_05_212408_add_fields_to_licenses',1),(86,'2014_11_07_021042_add_image_to_supplier',1),(87,'2014_11_20_203007_add_username_to_user',1),(88,'2014_11_20_223947_add_auto_to_settings',1),(89,'2014_11_20_224421_add_prefix_to_settings',1),(90,'2014_11_21_104401_change_licence_type',1),(91,'2014_12_09_082500_add_fields_maintained_term_to_licenses',1),(92,'2015_02_04_155757_increase_user_field_lengths',1),(93,'2015_02_07_013537_add_soft_deleted_to_log',1),(94,'2015_02_10_040958_fix_bad_assigned_to_ids',1),(95,'2015_02_10_053310_migrate_data_to_new_statuses',1),(96,'2015_02_11_044104_migrate_make_license_assigned_null',1),(97,'2015_02_11_104406_migrate_create_requests_table',1),(98,'2015_02_12_001312_add_mac_address_to_asset',1),(99,'2015_02_12_024100_change_license_notes_type',1),(100,'2015_02_17_231020_add_localonly_to_settings',1),(101,'2015_02_19_222322_add_logo_and_colors_to_settings',1),(102,'2015_02_24_072043_add_alerts_to_settings',1),(103,'2015_02_25_022931_add_eula_fields',1),(104,'2015_02_25_204513_add_accessories_table',1),(105,'2015_02_26_091228_add_accessories_user_table',1),(106,'2015_02_26_115128_add_deleted_at_models',1),(107,'2015_02_26_233005_add_category_type',1),(108,'2015_03_01_231912_update_accepted_at_to_acceptance_id',1),(109,'2015_03_05_011929_add_qr_type_to_settings',1),(110,'2015_03_18_055327_add_note_to_user',1),(111,'2015_04_29_234704_add_slack_to_settings',1),(112,'2015_05_04_085151_add_parent_id_to_locations_table',1),(113,'2015_05_22_124421_add_reassignable_to_licenses',1),(114,'2015_06_10_003314_fix_default_for_user_notes',1),(115,'2015_06_10_003554_create_consumables',1),(116,'2015_06_15_183253_move_email_to_username',1),(117,'2015_06_23_070346_make_email_nullable',1),(118,'2015_06_26_213716_create_asset_maintenances_table',1),(119,'2015_07_04_212443_create_custom_fields_table',1),(120,'2015_07_09_014359_add_currency_to_settings_and_locations',1),(121,'2015_07_21_122022_add_expected_checkin_date_to_asset_logs',1),(122,'2015_07_24_093845_add_checkin_email_to_category_table',1),(123,'2015_07_25_055415_remove_email_unique_constraint',1),(124,'2015_07_29_230054_add_thread_id_to_asset_logs_table',1),(125,'2015_07_31_015430_add_accepted_to_assets',1),(126,'2015_09_09_195301_add_custom_css_to_settings',1),(127,'2015_09_21_235926_create_custom_field_custom_fieldset',1),(128,'2015_09_22_000104_create_custom_fieldsets',1),(129,'2015_09_22_003321_add_fieldset_id_to_assets',1),(130,'2015_09_22_003413_migrate_mac_address',1),(131,'2015_09_28_003314_fix_default_purchase_order',1),(132,'2015_10_01_024551_add_accessory_consumable_price_info',1),(133,'2015_10_12_192706_add_brand_to_settings',1),(134,'2015_10_22_003314_fix_defaults_accessories',1),(135,'2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets',1),(136,'2015_11_05_061015_create_companies_table',1),(137,'2015_11_05_061115_add_company_id_to_consumables_table',1),(138,'2015_11_05_183749_image',1),(139,'2015_11_06_092038_add_company_id_to_accessories_table',1),(140,'2015_11_06_100045_add_company_id_to_users_table',1),(141,'2015_11_06_134742_add_company_id_to_licenses_table',1),(142,'2015_11_08_035832_add_company_id_to_assets_table',1),(143,'2015_11_08_222305_add_ldap_fields_to_settings',1),(144,'2015_11_15_151803_add_full_multiple_companies_support_to_settings_table',1),(145,'2015_11_26_195528_import_ldap_settings',1),(146,'2015_11_30_191504_remove_fk_company_id',1),(147,'2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table',1),(148,'2015_12_30_233509_add_timestamp_and_userId_to_custom_fields',1),(149,'2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets',1),(150,'2016_01_28_041048_add_notes_to_models',1),(151,'2016_02_19_070119_add_remember_token_to_users_table',1),(152,'2016_02_19_073625_create_password_resets_table',1),(153,'2016_03_02_193043_add_ldap_flag_to_users',1),(154,'2016_03_02_220517_update_ldap_filter_to_longer_field',1),(155,'2016_03_08_225351_create_components_table',1),(156,'2016_03_09_024038_add_min_stock_to_tables',1),(157,'2016_03_10_133849_add_locale_to_users',1),(158,'2016_03_10_135519_add_locale_to_settings',1),(159,'2016_03_11_185621_add_label_settings_to_settings',1),(160,'2016_03_22_125911_fix_custom_fields_regexes',1),(161,'2016_04_28_141554_add_show_to_users',1),(162,'2016_05_16_164733_add_model_mfg_to_consumable',1),(163,'2016_05_19_180351_add_alt_barcode_settings',1),(164,'2016_05_19_191146_add_alter_interval',1),(165,'2016_05_19_192226_add_inventory_threshold',1),(166,'2016_05_20_024859_remove_option_keys_from_settings_table',1),(167,'2016_05_20_143758_remove_option_value_from_settings_table',1),(168,'2016_06_01_000001_create_oauth_auth_codes_table',1),(169,'2016_06_01_000002_create_oauth_access_tokens_table',1),(170,'2016_06_01_000003_create_oauth_refresh_tokens_table',1),(171,'2016_06_01_000004_create_oauth_clients_table',1),(172,'2016_06_01_000005_create_oauth_personal_access_clients_table',1),(173,'2016_06_01_140218_add_email_domain_and_format_to_settings',1),(174,'2016_06_22_160725_add_user_id_to_maintenances',1),(175,'2016_07_13_150015_add_is_ad_to_settings',1),(176,'2016_07_14_153609_add_ad_domain_to_settings',1),(177,'2016_07_22_003348_fix_custom_fields_regex_stuff',1),(178,'2016_07_22_054850_one_more_mac_addr_fix',1),(179,'2016_07_22_143045_add_port_to_ldap_settings',1),(180,'2016_07_22_153432_add_tls_to_ldap_settings',1),(181,'2016_07_27_211034_add_zerofill_to_settings',1),(182,'2016_08_02_124944_add_color_to_statuslabel',1),(183,'2016_08_04_134500_add_disallow_ldap_pw_sync_to_settings',1),(184,'2016_08_09_002225_add_manufacturer_to_licenses',1),(185,'2016_08_12_121613_add_manufacturer_to_accessories_table',1),(186,'2016_08_23_143353_add_new_fields_to_custom_fields',1),(187,'2016_08_23_145619_add_show_in_nav_to_status_labels',1),(188,'2016_08_30_084634_make_purchase_cost_nullable',1),(189,'2016_09_01_141051_add_requestable_to_asset_model',1),(190,'2016_09_02_001448_create_checkout_requests_table',1),(191,'2016_09_04_180400_create_actionlog_table',1),(192,'2016_09_04_182149_migrate_asset_log_to_action_log',1),(193,'2016_09_19_235935_fix_fieldtype_for_target_type',1),(194,'2016_09_23_140722_fix_modelno_in_consumables_to_string',1),(195,'2016_09_28_231359_add_company_to_logs',1),(196,'2016_10_14_130709_fix_order_number_to_varchar',1),(197,'2016_10_16_015024_rename_modelno_to_model_number',1),(198,'2016_10_16_015211_rename_consumable_modelno_to_model_number',1),(199,'2016_10_16_143235_rename_model_note_to_notes',1),(200,'2016_10_16_165052_rename_component_total_qty_to_qty',1),(201,'2016_10_19_145520_fix_order_number_in_components_to_string',1),(202,'2016_10_27_151715_add_serial_to_components',1),(203,'2016_10_27_213251_increase_serial_field_capacity',1),(204,'2016_10_29_002724_enable_2fa_fields',1),(205,'2016_10_29_082408_add_signature_to_acceptance',1),(206,'2016_11_01_030818_fix_forgotten_filename_in_action_logs',1),(207,'2016_11_13_020954_rename_component_serial_number_to_serial',1),(208,'2016_11_16_172119_increase_purchase_cost_size',1),(209,'2016_11_17_161317_longer_state_field_in_location',1),(210,'2016_11_17_193706_add_model_number_to_accessories',1),(211,'2016_11_24_160405_add_missing_target_type_to_logs_table',1),(212,'2016_12_07_173720_increase_size_of_state_in_suppliers',1),(213,'2016_12_19_004212_adjust_locale_length_to_10',1),(214,'2016_12_19_133936_extend_phone_lengths_in_supplier_and_elsewhere',1),(215,'2016_12_27_212631_make_asset_assigned_to_polymorphic',2),(216,'2017_01_09_040429_create_locations_ldap_query_field',3),(217,'2017_01_14_002418_create_imports_table',3),(218,'2017_01_25_063357_fix_utf8_custom_field_column_names',3),(219,'2017_03_03_154632_add_time_date_display_to_settings',3),(220,'2017_03_10_210807_add_fields_to_manufacturer',3),(221,'2017_05_08_195520_increase_size_of_field_values_in_custom_fields',4),(222,'2017_05_22_233509_add_manager_to_locations_table',4);
         /*!40000 ALTER TABLE `migrations` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -824,7 +862,7 @@ CREATE TABLE `models` (
           `notes` longtext COLLATE utf8_unicode_ci,
           `requestable` tinyint(4) NOT NULL DEFAULT '0',
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -833,10 +871,152 @@ CREATE TABLE `models` (
         
         LOCK TABLES `models` WRITE;
         /*!40000 ALTER TABLE `models` DISABLE KEYS */;
        -INSERT INTO `models` VALUES (1,'Organized zerotolerance strategy','41955019',3,1,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,1,NULL,0,NULL,NULL,NULL,0),(2,'Operative responsive focusgroup','36408246',7,5,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,1,NULL,0,NULL,NULL,NULL,0),(3,'Operative actuating success','44231380',8,4,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,1,NULL,0,NULL,NULL,NULL,0),(4,'Configurable 3rdgeneration success','17070824',1,2,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,1,NULL,0,NULL,NULL,NULL,0),(5,'Multi-channelled background model','25964380',2,2,'2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,1,NULL,0,NULL,NULL,NULL,0),(6,'Test Model','',2,5,'2016-11-20 23:12:49','2016-11-21 00:33:29',0,1,0,NULL,0,'2016-11-21 00:33:29',NULL,'',0),(7,'TestModel','350335',8,11,'2016-11-21 00:33:28','2016-11-21 00:33:28',0,1,12,NULL,0,NULL,NULL,'lorem ipsum blah blah',1);
        +INSERT INTO `models` VALUES (1,'Customer-focused secondary capability','18707983',9,6,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,1,NULL,0,NULL,NULL,'Doloribus in consequatur minima eum tempore nobis. Id ipsam eaque non dicta. Recusandae aut eaque voluptatem voluptas consequatur maiores. Quia saepe impedit beatae sed laborum.',1),(2,'Enhanced tertiary functionalities','47351031',10,4,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,1,NULL,0,NULL,NULL,'Sunt ut consequatur exercitationem voluptatem voluptatum laboriosam in. Distinctio molestiae voluptates ut dolores quia rerum. Commodi ducimus sint ut omnis qui. Velit temporibus et temporibus asperiores qui.',0),(3,'Enhanced leadingedge encoding','22262258',6,5,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,1,NULL,0,NULL,NULL,'Voluptate assumenda harum et aliquid esse. Aut enim amet natus consequatur dolores amet fugiat eum. Quis id sed incidunt eveniet fuga. Quasi excepturi quam eaque eveniet qui.',0),(4,'Vision-oriented mission-critical artificialintelligence','37285898',3,4,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,1,NULL,0,NULL,NULL,'Enim quidem qui voluptas. Voluptas nostrum perferendis et ipsum. Voluptate non qui vitae reprehenderit. Eius ipsam non qui ipsam cumque.',1),(5,'Phased client-server instructionset','31964592',5,1,'2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,1,NULL,0,NULL,NULL,'Voluptatem sit officiis dolorem ut est sed. Suscipit ut praesentium aperiam adipisci aut est. Aut nisi nihil officiis optio cumque eveniet. Aut aut minima perspiciatis aut perspiciatis.',0);
         /*!40000 ALTER TABLE `models` ENABLE KEYS */;
         UNLOCK TABLES;
         
        +--
        +-- Table structure for table `oauth_access_tokens`
        +--
        +
        +DROP TABLE IF EXISTS `oauth_access_tokens`;
        +/*!40101 SET @saved_cs_client     = @@character_set_client */;
        +/*!40101 SET character_set_client = utf8 */;
        +CREATE TABLE `oauth_access_tokens` (
        +  `id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
        +  `user_id` int(11) DEFAULT NULL,
        +  `client_id` int(11) NOT NULL,
        +  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `scopes` text COLLATE utf8_unicode_ci,
        +  `revoked` tinyint(1) NOT NULL,
        +  `created_at` timestamp NULL DEFAULT NULL,
        +  `updated_at` timestamp NULL DEFAULT NULL,
        +  `expires_at` datetime DEFAULT NULL,
        +  PRIMARY KEY (`id`),
        +  KEY `oauth_access_tokens_user_id_index` (`user_id`)
        +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +/*!40101 SET character_set_client = @saved_cs_client */;
        +
        +--
        +-- Dumping data for table `oauth_access_tokens`
        +--
        +
        +LOCK TABLES `oauth_access_tokens` WRITE;
        +/*!40000 ALTER TABLE `oauth_access_tokens` DISABLE KEYS */;
        +/*!40000 ALTER TABLE `oauth_access_tokens` ENABLE KEYS */;
        +UNLOCK TABLES;
        +
        +--
        +-- Table structure for table `oauth_auth_codes`
        +--
        +
        +DROP TABLE IF EXISTS `oauth_auth_codes`;
        +/*!40101 SET @saved_cs_client     = @@character_set_client */;
        +/*!40101 SET character_set_client = utf8 */;
        +CREATE TABLE `oauth_auth_codes` (
        +  `id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
        +  `user_id` int(11) NOT NULL,
        +  `client_id` int(11) NOT NULL,
        +  `scopes` text COLLATE utf8_unicode_ci,
        +  `revoked` tinyint(1) NOT NULL,
        +  `expires_at` datetime DEFAULT NULL,
        +  PRIMARY KEY (`id`)
        +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +/*!40101 SET character_set_client = @saved_cs_client */;
        +
        +--
        +-- Dumping data for table `oauth_auth_codes`
        +--
        +
        +LOCK TABLES `oauth_auth_codes` WRITE;
        +/*!40000 ALTER TABLE `oauth_auth_codes` DISABLE KEYS */;
        +/*!40000 ALTER TABLE `oauth_auth_codes` ENABLE KEYS */;
        +UNLOCK TABLES;
        +
        +--
        +-- Table structure for table `oauth_clients`
        +--
        +
        +DROP TABLE IF EXISTS `oauth_clients`;
        +/*!40101 SET @saved_cs_client     = @@character_set_client */;
        +/*!40101 SET character_set_client = utf8 */;
        +CREATE TABLE `oauth_clients` (
        +  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        +  `user_id` int(11) DEFAULT NULL,
        +  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        +  `secret` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
        +  `redirect` text COLLATE utf8_unicode_ci NOT NULL,
        +  `personal_access_client` tinyint(1) NOT NULL,
        +  `password_client` tinyint(1) NOT NULL,
        +  `revoked` tinyint(1) NOT NULL,
        +  `created_at` timestamp NULL DEFAULT NULL,
        +  `updated_at` timestamp NULL DEFAULT NULL,
        +  PRIMARY KEY (`id`),
        +  KEY `oauth_clients_user_id_index` (`user_id`)
        +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +/*!40101 SET character_set_client = @saved_cs_client */;
        +
        +--
        +-- Dumping data for table `oauth_clients`
        +--
        +
        +LOCK TABLES `oauth_clients` WRITE;
        +/*!40000 ALTER TABLE `oauth_clients` DISABLE KEYS */;
        +/*!40000 ALTER TABLE `oauth_clients` ENABLE KEYS */;
        +UNLOCK TABLES;
        +
        +--
        +-- Table structure for table `oauth_personal_access_clients`
        +--
        +
        +DROP TABLE IF EXISTS `oauth_personal_access_clients`;
        +/*!40101 SET @saved_cs_client     = @@character_set_client */;
        +/*!40101 SET character_set_client = utf8 */;
        +CREATE TABLE `oauth_personal_access_clients` (
        +  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        +  `client_id` int(11) NOT NULL,
        +  `created_at` timestamp NULL DEFAULT NULL,
        +  `updated_at` timestamp NULL DEFAULT NULL,
        +  PRIMARY KEY (`id`),
        +  KEY `oauth_personal_access_clients_client_id_index` (`client_id`)
        +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +/*!40101 SET character_set_client = @saved_cs_client */;
        +
        +--
        +-- Dumping data for table `oauth_personal_access_clients`
        +--
        +
        +LOCK TABLES `oauth_personal_access_clients` WRITE;
        +/*!40000 ALTER TABLE `oauth_personal_access_clients` DISABLE KEYS */;
        +/*!40000 ALTER TABLE `oauth_personal_access_clients` ENABLE KEYS */;
        +UNLOCK TABLES;
        +
        +--
        +-- Table structure for table `oauth_refresh_tokens`
        +--
        +
        +DROP TABLE IF EXISTS `oauth_refresh_tokens`;
        +/*!40101 SET @saved_cs_client     = @@character_set_client */;
        +/*!40101 SET character_set_client = utf8 */;
        +CREATE TABLE `oauth_refresh_tokens` (
        +  `id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
        +  `access_token_id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
        +  `revoked` tinyint(1) NOT NULL,
        +  `expires_at` datetime DEFAULT NULL,
        +  PRIMARY KEY (`id`),
        +  KEY `oauth_refresh_tokens_access_token_id_index` (`access_token_id`)
        +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +/*!40101 SET character_set_client = @saved_cs_client */;
        +
        +--
        +-- Dumping data for table `oauth_refresh_tokens`
        +--
        +
        +LOCK TABLES `oauth_refresh_tokens` WRITE;
        +/*!40000 ALTER TABLE `oauth_refresh_tokens` DISABLE KEYS */;
        +/*!40000 ALTER TABLE `oauth_refresh_tokens` ENABLE KEYS */;
        +UNLOCK TABLES;
        +
         --
         -- Table structure for table `password_resets`
         --
        @@ -1000,6 +1180,8 @@ CREATE TABLE `settings` (
           `ldap_pw_sync` tinyint(1) NOT NULL DEFAULT '1',
           `two_factor_enabled` tinyint(4) DEFAULT NULL,
           `require_accept_signature` tinyint(1) NOT NULL DEFAULT '0',
        +  `date_display_format` varchar(191) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Y-m-d',
        +  `time_display_format` varchar(191) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'h:i A',
           PRIMARY KEY (`id`)
         ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
        @@ -1010,7 +1192,7 @@ CREATE TABLE `settings` (
         
         LOCK TABLES `settings` WRITE;
         /*!40000 ALTER TABLE `settings` DISABLE KEYS */;
        -INSERT INTO `settings` VALUES (1,'2016-11-06 22:01:02','2016-11-06 22:01:02',1,20,'Test',NULL,NULL,NULL,NULL,NULL,0,'0',1,NULL,NULL,'snipe@google.com',1,NULL,'QRCODE',NULL,NULL,NULL,'USD',NULL,1,NULL,NULL,NULL,NULL,NULL,NULL,'samaccountname','sn','givenname','uid=samaccountname',3,NULL,NULL,NULL,0,0,'en',30,2.62500,1.00000,0.21975,0.21975,0.50000,0.50000,0.07000,0.05000,9,8.50000,11.00000,0,1,1,'C128',1,30,5,'tews.com','filastname','filastname',0,NULL,'389',0,5,1,NULL,0);
        +INSERT INTO `settings` VALUES (1,'2016-12-19 21:48:55','2016-12-19 21:48:55',1,20,'Test',NULL,NULL,NULL,NULL,NULL,0,'0',1,NULL,NULL,'d@example.com',1,NULL,'QRCODE',NULL,NULL,NULL,'USD',NULL,1,NULL,NULL,NULL,NULL,NULL,NULL,'samaccountname','sn','givenname','uid=samaccountname',3,NULL,NULL,NULL,0,0,'en',30,2.62500,1.00000,0.21975,0.21975,0.50000,0.50000,0.07000,0.05000,9,8.50000,11.00000,0,1,1,'C128',1,30,5,'342d','filastname','filastname',0,NULL,'389',0,5,1,NULL,0,'Y-m-d','h:i A');
         /*!40000 ALTER TABLE `settings` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -1035,7 +1217,7 @@ CREATE TABLE `status_labels` (
           `color` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
           `show_in_nav` tinyint(1) NOT NULL DEFAULT '0',
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -1044,7 +1226,7 @@ CREATE TABLE `status_labels` (
         
         LOCK TABLES `status_labels` WRITE;
         /*!40000 ALTER TABLE `status_labels` DISABLE KEYS */;
        -INSERT INTO `status_labels` VALUES (1,'Ready to Deploy',1,'2004-12-14 19:19:01','2011-11-20 01:20:52',NULL,1,0,0,'',NULL,0),(2,'Pending',1,'2007-02-27 15:33:24','1987-07-30 16:33:07',NULL,0,1,0,'',NULL,0),(3,'Archived',1,'2001-11-21 23:22:44','2000-07-30 19:54:16',NULL,0,0,1,'These assets are permanently undeployable',NULL,0),(4,'Out for Diagnostics',1,'1981-09-28 05:03:46','1979-03-28 12:50:57',NULL,0,0,0,'',NULL,0),(5,'Out for Repair',1,'2010-09-10 11:59:47','1973-10-19 04:27:48',NULL,0,0,0,'',NULL,0),(6,'Broken - Not Fixable',1,'1979-08-28 12:09:59','1981-08-25 12:56:48',NULL,0,0,1,'',NULL,0),(7,'Lost/Stolen',1,'2011-04-26 04:28:42','1999-07-22 04:43:21',NULL,0,0,1,'',NULL,0),(8,'Test Status',1,'2016-11-21 00:33:54','2016-11-21 00:33:54',NULL,0,1,0,'lorem ipsum something else','#b46262',1);
        +INSERT INTO `status_labels` VALUES (1,'Ready to Deploy',1,'1981-07-19 10:16:27','2007-02-22 00:56:54',NULL,1,0,0,'',NULL,0),(2,'Pending',1,'1995-09-12 10:52:43','2010-04-24 19:45:34',NULL,0,1,0,'Assumenda vero aliquam sapiente corporis consequatur itaque qui.',NULL,0),(3,'Archived',1,'1995-07-03 14:33:27','1983-06-23 03:14:03',NULL,0,0,1,'These assets are permanently undeployable',NULL,0),(4,'Out for Diagnostics',1,'1994-02-16 18:38:00','1990-03-31 03:03:17',NULL,0,0,0,'',NULL,0),(5,'Out for Repair',1,'1997-12-28 18:07:43','1983-08-31 06:02:37',NULL,0,0,0,'',NULL,0),(6,'Broken - Not Fixable',1,'2015-01-17 21:10:49','1986-01-14 14:40:53',NULL,0,0,1,'',NULL,0),(7,'Lost/Stolen',1,'2009-01-30 14:33:33','2002-11-23 10:32:40',NULL,0,0,1,'',NULL,0);
         /*!40000 ALTER TABLE `status_labels` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -1061,10 +1243,10 @@ CREATE TABLE `suppliers` (
           `address` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
           `address2` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
           `city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
        -  `state` varchar(2) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `state` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
           `country` varchar(2) COLLATE utf8_unicode_ci DEFAULT NULL,
        -  `phone` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
        -  `fax` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `phone` varchar(35) COLLATE utf8_unicode_ci DEFAULT NULL,
        +  `fax` varchar(35) COLLATE utf8_unicode_ci DEFAULT NULL,
           `email` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
           `contact` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
           `notes` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
        @@ -1076,7 +1258,7 @@ CREATE TABLE `suppliers` (
           `url` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
           `image` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
           PRIMARY KEY (`id`)
        -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -1085,7 +1267,7 @@ CREATE TABLE `suppliers` (
         
         LOCK TABLES `suppliers` WRITE;
         /*!40000 ALTER TABLE `suppliers` DISABLE KEYS */;
        -INSERT INTO `suppliers` VALUES (1,'Deckow-Schuppe','695 Alejandra Motorway',NULL,'Torpmouth','OR','BG','292.995.6573 x818',NULL,'addie65@example.com','Jaiden Gutkowski DVM',NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,NULL),(2,'Gislason LLC','8624 Kenneth Tunnel',NULL,'Jamalburgh','RI','HK','1-250-263-8392',NULL,'marielle32@example.com','Arianna Metz',NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,NULL),(3,'Pouros, Bernhard and Herzog','681 Simonis Summit',NULL,'East Jaylinside','TX','MX','756-364-0473',NULL,'jerad.schoen@example.net','Delphine Gulgowski Jr.',NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,NULL),(4,'Weissnat, Reynolds and Quigley','7175 Lowe Bridge',NULL,'Vandervortberg','ND','MG','446.315.3002 x50031',NULL,'ryleigh69@example.com','Bradly Rogahn DDS',NULL,'2016-11-20 23:07:29','2016-11-20 23:07:29',NULL,NULL,NULL,NULL,NULL),(5,'Test Supplier','046t46 South Street','Apt 356','Sutherland','BV','AF','032626236 x35','342 33 6647 3555','p@roar.com','Mr. Smith','lorem ipsum indigo something','2016-11-21 00:33:56','2016-11-21 00:33:56',1,NULL,'30266','http://snipeitapp.com',NULL),(6,'Blank Supplier','','','','','','','','','','','2016-11-21 00:35:59','2016-11-21 00:35:59',1,NULL,'','http://',NULL);
        +INSERT INTO `suppliers` VALUES (1,'Corkery-Moore','30665 Lucinda Divide','Suite 776','Avismouth','WI','TR','1-717-505-1802','(591) 370-8443 x4472','swaniawski.abbigail@example.org','Araceli Murphy','Voluptatibus sed exercitationem laboriosam quo. Laudantium deserunt rerum mollitia ut quia deleniti ducimus. Temporibus dolores voluptatum aut non labore. Magni voluptate nulla laboriosam possimus. Ut unde et ipsam.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'60788','https://www.goyette.com/quibusdam-et-vel-asperiores-sint',NULL),(2,'Oberbrunner, Williamson and Torp','41780 Wilber Court','Suite 386','Gailborough','KY','BS','1-641-705-0778 x4064','+1.604.605.0292','alaina.gibson@example.org','Miguel Gerlach DVM','Et voluptates quasi recusandae sunt unde labore. Assumenda illum et neque ipsa sint. Officia quo tempore qui odio tempore aut dolorum qui.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'18717','https://www.heaney.biz/quaerat-dolorem-velit-officiis-distinctio-blanditiis',NULL),(3,'Berge Group','425 Shad Ports Apt. 353','Apt. 206','West Wilbertshire','NJ','SH','716-802-5252 x704','(872) 854-6737 x39599','keebler.israel@example.org','Thurman Schroeder','Esse quia amet voluptatem quo ullam est. Modi sed repellat et. Assumenda neque a laboriosam reiciendis. Vel dolores debitis vitae ut. Consequuntur et cumque enim omnis.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'32410','http://effertz.net/',NULL),(4,'Nolan-Hermiston','12352 Toy Crossing Apt. 626','Suite 629','Henriettebury','NM','AM','+1-707-767-4616','667.470.0440 x2062','mabelle49@example.org','Jordi Glover','Optio deserunt laborum voluptatem ad enim. Nemo fuga et dolorem nesciunt voluptatum. Est voluptas consectetur atque tempore blanditiis aliquid. Consequatur nisi voluptas sit ut distinctio.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'97408-0637','http://armstrong.com/pariatur-tempora-eveniet-pariatur-autem-eum-in',NULL),(5,'Hickle-Homenick','6189 Camryn Station Apt. 608','Suite 965','Kesslermouth','OK','SJ','881.747.8278','1-904-341-0049','leopold.conn@example.com','Dr. Fletcher Roberts','Natus nesciunt id qui explicabo omnis quia aliquid. Perferendis aspernatur sit quia nihil similique sint. Ducimus quasi quis rerum laborum. Quae architecto temporibus ratione autem dolores. Qui deleniti molestiae ipsam maxime aut perspiciatis.','2016-12-19 21:50:32','2016-12-19 21:50:32',NULL,NULL,'54046-6614','https://www.oreilly.info/veniam-nihil-ut-odit-quibusdam-sit-molestias',NULL);
         /*!40000 ALTER TABLE `suppliers` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -1157,7 +1339,7 @@ CREATE TABLE `users` (
           `company_id` int(10) unsigned DEFAULT NULL,
           `remember_token` text COLLATE utf8_unicode_ci,
           `ldap_import` tinyint(1) NOT NULL DEFAULT '0',
        -  `locale` varchar(5) COLLATE utf8_unicode_ci DEFAULT 'en',
        +  `locale` varchar(10) COLLATE utf8_unicode_ci DEFAULT 'en',
           `show_in_list` tinyint(1) NOT NULL DEFAULT '1',
           `two_factor_secret` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
           `two_factor_enrolled` tinyint(1) NOT NULL DEFAULT '0',
        @@ -1165,7 +1347,7 @@ CREATE TABLE `users` (
           PRIMARY KEY (`id`),
           KEY `users_activation_code_index` (`activation_code`),
           KEY `users_reset_password_code_index` (`reset_password_code`)
        -) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
         /*!40101 SET character_set_client = @saved_cs_client */;
         
         --
        @@ -1174,7 +1356,7 @@ CREATE TABLE `users` (
         
         LOCK TABLES `users` WRITE;
         /*!40000 ALTER TABLE `users` DISABLE KEYS */;
        -INSERT INTO `users` VALUES (1,'snipe@google.com','$2y$10$oSjP81uCdXW.nAHBIPteA..DsLPhJBiwD1tfny4hY0Ndicv1B5Nk6','{\"superuser\":\"1\",\"admin\":\"0\",\"reports.view\":\"0\",\"assets.view\":\"0\",\"assets.create\":\"0\",\"assets.edit\":\"0\",\"assets.delete\":\"0\",\"assets.checkin\":\"0\",\"assets.checkout\":\"0\",\"assets.view.requestable\":\"0\",\"accessories.view\":\"0\",\"accessories.create\":\"0\",\"accessories.edit\":\"0\",\"accessories.delete\":\"0\",\"accessories.checkout\":\"0\",\"accessories.checkin\":\"0\",\"consumables.view\":\"0\",\"consumables.create\":\"0\",\"consumables.edit\":\"0\",\"consumables.delete\":\"0\",\"consumables.checkout\":\"0\",\"licenses.view\":\"0\",\"licenses.create\":\"0\",\"licenses.edit\":\"0\",\"licenses.delete\":\"0\",\"licenses.checkout\":\"0\",\"licenses.keys\":\"0\",\"components.view\":\"0\",\"components.create\":\"0\",\"components.edit\":\"0\",\"components.delete\":\"0\",\"components.checkout\":\"0\",\"components.checkin\":\"0\",\"users.view\":\"0\",\"users.create\":\"0\",\"users.edit\":\"0\",\"users.delete\":\"0\",\"self.two_factor\":\"0\"}',1,NULL,NULL,NULL,NULL,NULL,'snipe','Snipe','2016-11-06 22:01:02','2016-11-21 00:33:59',NULL,NULL,NULL,NULL,NULL,'','',NULL,'',NULL,'snipeit','',NULL,'yui6FpaJTPf72mgW84Cv8YqcoE6C7UbuNoh5yGe9eW2yKCoOtryJNE230g9q',0,'en',1,NULL,0,0),(3,'bnelson0@cdbaby.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Bonnie',' Nelson','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bnelson0',NULL,NULL,NULL,0,'en',1,NULL,0,0),(4,'jferguson1@state.tx.us','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Judith',' Ferguson','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'jferguson1',NULL,NULL,NULL,0,'en',1,NULL,0,0),(5,'mgibson2@wiley.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Mildred',' Gibson','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'mgibson2',NULL,NULL,NULL,0,'en',1,NULL,0,0),(6,'blee3@quantcast.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Brandon',' Lee','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'blee3',NULL,NULL,NULL,0,'en',1,NULL,0,0),(7,'bpowell4@tuttocitta.it','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Betty',' Powell','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bpowell4',NULL,NULL,NULL,0,'en',1,NULL,0,0),(8,'awheeler5@cocolog-nifty.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Anthony',' Wheeler','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'awheeler5',NULL,NULL,NULL,0,'en',1,NULL,0,0),(9,'dreynolds6@ustream.tv','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Dennis',' Reynolds','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'dreynolds6',NULL,NULL,NULL,0,'en',1,NULL,0,0),(10,'aarnold7@cbc.ca','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Andrea',' Arnold','2016-11-06 22:03:21','2016-11-06 22:03:21',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'aarnold7',NULL,NULL,NULL,0,'en',1,NULL,0,0),(11,'abutler8@wikia.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Anna',' Butler','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'abutler8',NULL,NULL,NULL,0,'en',1,NULL,0,0),(12,'mbennett9@diigo.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Mark',' Bennett','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'mbennett9',NULL,NULL,NULL,0,'en',1,NULL,0,0),(13,'ewheelera@google.de','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Emily',' Wheeler','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ewheelera',NULL,NULL,NULL,0,'en',1,NULL,0,0),(14,'wfoxb@virginia.edu','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Wanda',' Fox','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'wfoxb',NULL,NULL,NULL,0,'en',1,NULL,0,0),(15,'jgrantd@cpanel.net','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Janet',' Grant','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'jgrantd',NULL,NULL,NULL,0,'en',1,NULL,0,0),(16,'alarsone@tripod.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Antonio',' Larson','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'alarsone',NULL,NULL,NULL,0,'en',1,NULL,0,0),(17,'lpowellf@com.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Lois',' Powell','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'lpowellf',NULL,NULL,NULL,0,'en',1,NULL,0,0),(18,'malleng@com.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Mildred',' Allen','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'malleng',NULL,NULL,NULL,0,'en',1,NULL,0,0),(19,'caustinh@bigcartel.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Clarence',' Austin','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'caustinh',NULL,NULL,NULL,0,'en',1,NULL,0,0),(20,'wchavezi@blogs.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Walter',' Chavez','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'wchavezi',NULL,NULL,NULL,0,'en',1,NULL,0,0),(21,'melliottj@constantcontact.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Marie',' Elliott','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'melliottj',NULL,NULL,NULL,0,'en',1,NULL,0,0),(22,'bfordm@woothemes.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Benjamin',' Ford','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bfordm',NULL,NULL,NULL,0,'en',1,NULL,0,0),(23,'twarrenn@printfriendly.com','$2y$10$XXJbpVOtPb81jg0hRF9wRO9d62/qquyn5Pi7WLj/HHnxhEk4ThiZO',NULL,1,NULL,NULL,NULL,NULL,NULL,'Timothy',' Warren','2016-11-06 22:03:22','2016-11-06 22:03:22',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'twarrenn',NULL,NULL,NULL,0,'en',1,NULL,0,0),(24,'carli.kutch@example.com','n.rSn]5><0@J]5y/akE',NULL,0,NULL,NULL,NULL,NULL,NULL,'Virgie','Koepp','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'hodkiewicz.ora',NULL,1,NULL,0,'en',1,NULL,0,0),(25,'jaida.yundt@example.org',';5lrG0D]`,\"a&8EK',NULL,0,NULL,NULL,NULL,NULL,NULL,'Aidan','Kuhn','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'emilie99',NULL,1,NULL,0,'en',1,NULL,0,0),(26,'stroman.ferne@example.org','$Tv\"Th',NULL,0,NULL,NULL,NULL,NULL,NULL,'Brendan','Beier','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'kpfannerstill',NULL,2,NULL,0,'en',1,NULL,0,0),(27,'janae.kris@example.net','h:D;__sn',NULL,0,NULL,NULL,NULL,NULL,NULL,'Johann','Jenkins','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'agnes.schaden',NULL,2,NULL,0,'en',1,NULL,0,0),(28,'iwalker@example.org','gPxOMxb^nQhdT',NULL,0,NULL,NULL,NULL,NULL,NULL,'Lilla','Marks','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'blanca05',NULL,1,NULL,0,'en',1,NULL,0,0),(29,'santos18@example.net','uEB#o(rvmE&.',NULL,0,NULL,NULL,NULL,NULL,NULL,'Magdalen','Ondricka','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'lenore02',NULL,2,NULL,0,'en',1,NULL,0,0),(30,'gislason.arely@example.com','5F\\]9dw)Z*\"z',NULL,0,NULL,NULL,NULL,NULL,NULL,'Herbert','Mueller','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'sbeier',NULL,3,NULL,0,'en',1,NULL,0,0),(31,'kris.lauriane@example.net','b*GzqFjV\'5==s4',NULL,0,NULL,NULL,NULL,NULL,NULL,'Hope','Ledner','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'cameron.dickens',NULL,2,NULL,0,'en',1,NULL,0,0),(32,'glenda.jacobi@example.net','fuPK3mC~Gwy',NULL,0,NULL,NULL,NULL,NULL,NULL,'Shayne','Mraz','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'heaven.conn',NULL,1,NULL,0,'en',1,NULL,0,0),(33,'rkonopelski@example.net','XD6mF&1XZyX@6d3izG',NULL,0,NULL,NULL,NULL,NULL,NULL,'Magali','Hamill','2016-11-20 23:03:56','2016-11-20 23:03:56',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'susie26',NULL,4,NULL,0,'en',1,NULL,0,0),(34,'g@roar.com','$2y$10$3//tj9exuu7n/RVVBH2XfuEjj6KyVo0DNsMyXbqmTzieDvbrkZ27G','{\"superuser\":\"0\",\"admin\":\"0\",\"reports.view\":\"0\",\"assets.view\":\"0\",\"assets.create\":\"0\",\"assets.edit\":\"0\",\"assets.delete\":\"0\",\"assets.checkin\":\"0\",\"assets.checkout\":\"0\",\"assets.view.requestable\":\"0\",\"accessories.view\":\"0\",\"accessories.create\":\"0\",\"accessories.edit\":\"0\",\"accessories.delete\":\"0\",\"accessories.checkout\":\"0\",\"accessories.checkin\":\"0\",\"consumables.view\":\"0\",\"consumables.create\":\"0\",\"consumables.edit\":\"0\",\"consumables.delete\":\"0\",\"consumables.checkout\":\"0\",\"licenses.view\":\"0\",\"licenses.create\":\"0\",\"licenses.edit\":\"0\",\"licenses.delete\":\"0\",\"licenses.checkout\":\"0\",\"licenses.keys\":\"0\",\"components.view\":\"0\",\"components.create\":\"0\",\"components.edit\":\"0\",\"components.delete\":\"0\",\"components.checkout\":\"0\",\"components.checkin\":\"0\",\"users.view\":\"0\",\"users.create\":\"0\",\"users.edit\":\"0\",\"users.delete\":\"0\",\"self.two_factor\":\"0\"}',1,NULL,NULL,NULL,NULL,NULL,'John','Smdt','2016-11-20 23:06:01','2016-11-20 23:06:01',NULL,NULL,NULL,NULL,67,'35235 33535 x5','Robot',19,'1636 636',NULL,'jsmdt','lorem ipsum indigo something',3,NULL,0,'en-GB',1,NULL,0,0),(35,'khyatt@example.net','(RFSG=`Z8$Zf%J',NULL,0,NULL,NULL,NULL,NULL,NULL,'Kristopher','Skiles','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'dovie08',NULL,1,NULL,0,'en',1,NULL,0,0),(36,'lockman.demarcus@example.org','vAJ^z=8$=?9$wfut',NULL,0,NULL,NULL,NULL,NULL,NULL,'Bell','Franecki','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'rocky.nitzsche',NULL,4,NULL,0,'en',1,NULL,0,0),(37,'murray37@example.org','9yz{h<vVQ',NULL,0,NULL,NULL,NULL,NULL,NULL,'Blanca','Nitzsche','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'mmarvin',NULL,4,NULL,0,'en',1,NULL,0,0),(38,'zschimmel@example.com','/&G_cO4JJglZ*<>y%',NULL,0,NULL,NULL,NULL,NULL,NULL,'Ivory','Wyman','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'vince.renner',NULL,2,NULL,0,'en',1,NULL,0,0),(39,'jacobson.yadira@example.com','#K.%ev&$gKr_[',NULL,0,NULL,NULL,NULL,NULL,NULL,'Harry','Brown','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'jarred.bode',NULL,2,NULL,0,'en',1,NULL,0,0),(40,'mdaniel@example.net','%`_LI(aPpUJ^(Bg3Hv~',NULL,0,NULL,NULL,NULL,NULL,NULL,'Jules','Herman','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'hdenesik',NULL,4,NULL,0,'en',1,NULL,0,0),(41,'vincent.mcglynn@example.net','/$qJ#@u',NULL,0,NULL,NULL,NULL,NULL,NULL,'Marilou','O\'Keefe','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ova.cronin',NULL,4,NULL,0,'en',1,NULL,0,0),(42,'frami.lupe@example.com','5{0@yQpA0tI{',NULL,0,NULL,NULL,NULL,NULL,NULL,'Michelle','Lubowitz','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'smith.lorenzo',NULL,3,NULL,0,'en',1,NULL,0,0),(43,'davion83@example.net','$S?[!#^F\",oo&',NULL,0,NULL,NULL,NULL,NULL,NULL,'Cary','Medhurst','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'schowalter.tremaine',NULL,1,NULL,0,'en',1,NULL,0,0),(44,'roxane.torp@example.net','wplSIT.N=',NULL,0,NULL,NULL,NULL,NULL,NULL,'Ethan','Stanton','2016-11-20 23:07:28','2016-11-20 23:07:28',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'rey71',NULL,1,NULL,0,'en',1,NULL,0,0);
        +INSERT INTO `users` VALUES (1,'d@example.com','$2y$10$XkH04QqWoC.IhtnPze3YruWUpu1/9Q80zDJG2FR4mk3CyjrnhkmsW','{\"superuser\":1}',1,NULL,NULL,NULL,NULL,NULL,'test','test','2016-12-19 21:48:55','2016-12-19 21:48:55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'snipeit',NULL,NULL,'zuY1fNwUa36UV6ufSCgB9HhW06JgwQ7CxPkuZVIajEiPSOAj1DN1wtabmOHy',0,'en',1,NULL,0,0),(2,'bnelson0@cdbaby.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Bonnie',' Nelson','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bnelson0',NULL,NULL,NULL,0,'en',1,NULL,0,0),(3,'jferguson1@state.tx.us','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Judith',' Ferguson','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'jferguson1',NULL,NULL,NULL,0,'en',1,NULL,0,0),(4,'mgibson2@wiley.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Mildred',' Gibson','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'mgibson2',NULL,NULL,NULL,0,'en',1,NULL,0,0),(5,'blee3@quantcast.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Brandon',' Lee','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'blee3',NULL,NULL,NULL,0,'en',1,NULL,0,0),(6,'bpowell4@tuttocitta.it','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Betty',' Powell','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bpowell4',NULL,NULL,NULL,0,'en',1,NULL,0,0),(7,'awheeler5@cocolog-nifty.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Anthony',' Wheeler','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'awheeler5',NULL,NULL,NULL,0,'en',1,NULL,0,0),(8,'dreynolds6@ustream.tv','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Dennis',' Reynolds','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'dreynolds6',NULL,NULL,NULL,0,'en',1,NULL,0,0),(9,'aarnold7@cbc.ca','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Andrea',' Arnold','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'aarnold7',NULL,NULL,NULL,0,'en',1,NULL,0,0),(10,'abutler8@wikia.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Anna',' Butler','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'abutler8',NULL,NULL,NULL,0,'en',1,NULL,0,0),(11,'mbennett9@diigo.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Mark',' Bennett','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'mbennett9',NULL,NULL,NULL,0,'en',1,NULL,0,0),(12,'ewheelera@google.de','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Emily',' Wheeler','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ewheelera',NULL,NULL,NULL,0,'en',1,NULL,0,0),(13,'wfoxb@virginia.edu','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Wanda',' Fox','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'wfoxb',NULL,NULL,NULL,0,'en',1,NULL,0,0),(14,'jgrantd@cpanel.net','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Janet',' Grant','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'jgrantd',NULL,NULL,NULL,0,'en',1,NULL,0,0),(15,'alarsone@tripod.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Antonio',' Larson','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'alarsone',NULL,NULL,NULL,0,'en',1,NULL,0,0),(16,'lpowellf@com.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Lois',' Powell','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'lpowellf',NULL,NULL,NULL,0,'en',1,NULL,0,0),(17,'malleng@com.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Mildred',' Allen','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'malleng',NULL,NULL,NULL,0,'en',1,NULL,0,0),(18,'caustinh@bigcartel.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Clarence',' Austin','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'caustinh',NULL,NULL,NULL,0,'en',1,NULL,0,0),(19,'wchavezi@blogs.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Walter',' Chavez','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'wchavezi',NULL,NULL,NULL,0,'en',1,NULL,0,0),(20,'melliottj@constantcontact.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Marie',' Elliott','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'melliottj',NULL,NULL,NULL,0,'en',1,NULL,0,0),(21,'bfordm@woothemes.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Benjamin',' Ford','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bfordm',NULL,NULL,NULL,0,'en',1,NULL,0,0),(22,'twarrenn@printfriendly.com','$2y$10$MeHQGBejPHm0YLePHWzISutbekRfGDJ1gKeHAbw6xeEpas0oj5Qsq',NULL,1,NULL,NULL,NULL,NULL,NULL,'Timothy',' Warren','2016-12-19 21:49:34','2016-12-19 21:49:34',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'twarrenn',NULL,NULL,NULL,0,'en',1,NULL,0,0),(23,'oleta24@example.org','~(T$*jvkgD','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Seamus','Johnston','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'696-391-4397 x7738','voluptatibus',NULL,'30018',NULL,'cwalsh','Dolorem ut sunt enim ipsam et ex aliquid.',5,NULL,0,'es_ES',1,NULL,0,0),(24,'collins.felix@example.net','}mFLoec%d@%8F`\'','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Brooklyn','Kozey','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'298.890.9657 x932','consequatur',NULL,'4377',NULL,'palma.gusikowski','Fugiat quo alias sed illo est aut.',6,NULL,0,'st_LS',1,NULL,0,0),(25,'wallace74@example.com','BU_5GB^m<7QtA3A','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Delores','Glover','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'+1-494-731-3779','adipisci',NULL,'17781',NULL,'sbecker','Repellendus incidunt sit placeat provident id.',7,NULL,0,'ve_ZA',1,NULL,0,0),(26,'alex.ward@example.com','JP%\'2I>XCJH8P','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Olga','Dietrich','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'+1 (606) 203-6612','et',NULL,'18909',NULL,'nbarrows','Totam rerum dolores odit voluptate quasi.',8,NULL,0,'tig_ER',1,NULL,0,0),(27,'abe.greenfelder@example.org','wG*H7xY&QN:WWjh\'iSsG','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Mack','Ebert','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'558.948.8107','natus',NULL,'9036',NULL,'little.archibald','Repellat veniam eligendi occaecati.',9,NULL,0,'lv_LV',1,NULL,0,0),(28,'camila85@example.net','bqR_^Gx&@','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Miller','Bogisich','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'+1-956-557-3228','excepturi',NULL,'4977',NULL,'fern.batz','Autem quidem animi iste maxime vitae laborum vitae.',10,NULL,0,'tt_RU',1,NULL,0,0),(29,'veda.erdman@example.net','~+3v)}y~zZZmj','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Isaiah','Bogan','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'+1-602-935-4426','odit',NULL,'29496',NULL,'ssimonis','Deserunt eius voluptates velit illo dolores sunt ex.',11,NULL,0,'en_US',1,NULL,0,0),(30,'friedrich02@example.com','\'Y/^}J~{v!IN`Fg6','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Lavonne','Parisian','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'(478) 560-1259','quia',NULL,'23923',NULL,'mallie19','Architecto aut rerum modi est tempore et nobis.',12,NULL,0,'ms_MY',1,NULL,0,0),(31,'gerda44@example.net','US*`0L4','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Jeanne','Feest','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'682-498-7097 x96752','aperiam',NULL,'19524',NULL,'jessy12','Dignissimos voluptatum molestiae a velit optio quasi aliquam.',13,NULL,0,'gv_GB',1,NULL,0,0),(32,'clementine06@example.com','OD&VXKe\\','{\"user\":\"0\"}',0,NULL,NULL,NULL,NULL,NULL,'Llewellyn','Lubowitz','2016-12-19 21:50:31','2016-12-19 21:50:31',NULL,NULL,NULL,NULL,NULL,'819.370.6281 x2886','rerum',NULL,'6129',NULL,'fwalsh','Reprehenderit quos porro vitae mollitia ut ipsa rerum.',14,NULL,0,'fil_PH',1,NULL,0,0);
         /*!40000 ALTER TABLE `users` ENABLE KEYS */;
         UNLOCK TABLES;
         
        @@ -1210,4 +1392,4 @@ UNLOCK TABLES;
         /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
         /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
         
        --- Dump completed on 2016-11-20 12:36:32
        +-- Dump completed on 2017-05-22 20:08:33
        diff --git a/tests/_envs/functional-travis.yml b/tests/_envs/functional-travis.yml
        new file mode 100644
        index 0000000000..937a3cb7b1
        --- /dev/null
        +++ b/tests/_envs/functional-travis.yml
        @@ -0,0 +1,11 @@
        +# `functional-travis` enviromodules:
        +class_name: FunctionalTester
        +modules:
        +  config:
        +    # add framework module here
        +    Laravel5:
        +        environment_file: .env.testing-ci
        +    Db:
        +        dsn: 'mysql:host=localhost;dbname=snipeit_unit'
        +        user: 'travis'
        +        password: ''
        \ No newline at end of file
        diff --git a/tests/_envs/testing-ci.yml b/tests/_envs/testing-ci.yml
        index 9a5e4db410..5bfd0539ce 100644
        --- a/tests/_envs/testing-ci.yml
        +++ b/tests/_envs/testing-ci.yml
        @@ -9,10 +9,11 @@
         # RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
         class_name: AcceptanceTester
         modules:
        -    enabled:
        -        - WebDriver:
        -            url: http://localhost:8000
        -            browser: phantomjs
        -        - \Helper\Acceptance
        -        - Laravel5:
        -            part: ORM
        +  config:
        +    WebDriver:
        +      url: 'http://localhost:8000'
        +      browser: 'phantomjs'
        +    Laravel5:
        +      part: ORM
        +      environment_file: .env
        +
        diff --git a/tests/_support/ApiTester.php b/tests/_support/ApiTester.php
        new file mode 100644
        index 0000000000..920d6d4078
        --- /dev/null
        +++ b/tests/_support/ApiTester.php
        @@ -0,0 +1,46 @@
        +<?php
        +
        +
        +/**
        + * Inherited Methods
        + * @method void wantToTest($text)
        + * @method void wantTo($text)
        + * @method void execute($callable)
        + * @method void expectTo($prediction)
        + * @method void expect($prediction)
        + * @method void amGoingTo($argumentation)
        + * @method void am($role)
        + * @method void lookForwardTo($achieveValue)
        + * @method void comment($description)
        + * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
        + *
        + * @SuppressWarnings(PHPMD)
        +*/
        +class ApiTester extends \Codeception\Actor
        +{
        +    use _generated\ApiTesterActions;
        +
        +   /**
        +    * Define custom actions here
        +    */
        +
        +    public function getToken(\App\Models\User $user)
        +    {
        +        $client_repository = new \Laravel\Passport\ClientRepository();
        +        $client = $client_repository->createPersonalAccessClient($user->id, 'Codeception API Test Client',
        +           'http://localhost/');
        +
        +        \Illuminate\Support\Facades\DB::table('oauth_personal_access_clients')->insert([
        +           'client_id' => $client->id,
        +           'created_at' => new DateTime,
        +           'updated_at' => new DateTime,
        +        ]);
        +
        +        $user->permissions = json_encode(['superuser' => true]);
        +        $user->save();
        +
        +        $token = $user->createToken('CodeceptionAPItestToken')->accessToken;
        +
        +        return $token;
        +    }
        +}
        diff --git a/tests/_support/Helper/Api.php b/tests/_support/Helper/Api.php
        new file mode 100644
        index 0000000000..7a4621e854
        --- /dev/null
        +++ b/tests/_support/Helper/Api.php
        @@ -0,0 +1,10 @@
        +<?php
        +namespace Helper;
        +
        +// here you can define custom actions
        +// all public methods declared in helper class will be available in $I
        +
        +class Api extends \Codeception\Module
        +{
        +
        +}
        diff --git a/tests/acceptance/AccessoriesCept.php b/tests/acceptance/AccessoriesCept.php
        index ea23efd943..57c53b4a77 100644
        --- a/tests/acceptance/AccessoriesCept.php
        +++ b/tests/acceptance/AccessoriesCept.php
        @@ -5,12 +5,12 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the accessories listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/accessories');
        +$I->amOnPage('/accessories');
         $I->waitForElement('.table', 5); // secs
         $I->seeNumberOfElements('table[name="accessories"] tr', [5,30]);
         $I->seeInTitle('Accessories');
         $I->see('Accessories');
        -$I->seeInPageSource('admin/accessories/create');
        +$I->seeInPageSource('accessories/create');
         $I->dontSee('Accessories', '.page-header');
         $I->see('Accessories', 'h1.pull-left');
         
        @@ -18,7 +18,7 @@ $I->see('Accessories', 'h1.pull-left');
         $I->wantTo('ensure that the create accessories form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/accessories/create');
        +$I->amOnPage('/accessories/create');
         $I->dontSee('Create Accessory', '.page-header');
         $I->see('Create Accessory', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/CategoriesCept.php b/tests/acceptance/CategoriesCept.php
        index 74db4f6134..06d9074105 100644
        --- a/tests/acceptance/CategoriesCept.php
        +++ b/tests/acceptance/CategoriesCept.php
        @@ -4,12 +4,12 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the categories listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/settings/categories');
        +$I->amOnPage('/categories');
         $I->waitForElement('.table', 5); // secs
         $I->seeNumberOfElements('table[name="categories"] tr', [5,30]);
         $I->seeInTitle('Categories');
         $I->see('Categories');
        -$I->seeInPageSource('admin/settings/categories/create');
        +$I->seeInPageSource('/categories/create');
         $I->dontSee('Categories', '.page-header');
         $I->see('Categories', 'h1.pull-left');
         
        @@ -17,7 +17,7 @@ $I->see('Categories', 'h1.pull-left');
         $I->wantTo('ensure that the create category form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/settings/categories/create');
        +$I->amOnPage('/categories/create');
         $I->dontSee('Create Category', '.page-header');
         $I->see('Create Category', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/CompaniesCept.php b/tests/acceptance/CompaniesCept.php
        index f68a312688..139e960185 100644
        --- a/tests/acceptance/CompaniesCept.php
        +++ b/tests/acceptance/CompaniesCept.php
        @@ -5,12 +5,12 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the company listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/settings/companies');
        +$I->amOnPage('/companies');
         $I->waitForElement('.table', 5); // secs
         $I->seeNumberOfElements('table[name="companies"] tr', [5,30]);
         $I->seeInTitle('Companies');
         $I->see('Companies');
        -$I->seeInPageSource('admin/settings/companies/create');
        +$I->seeInPageSource('companies/create');
         $I->dontSee('Companies', '.page-header');
         $I->see('Companies', 'h1.pull-left');
         
        @@ -18,7 +18,7 @@ $I->see('Companies', 'h1.pull-left');
         $I->wantTo('ensure that the create company form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/settings/companies/create');
        +$I->amOnPage('/companies/create');
         $I->dontSee('Create Company', '.page-header');
         $I->see('Create Company', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/ConsumablesCept.php b/tests/acceptance/ConsumablesCept.php
        index 4c6ef64e17..42d6d58293 100644
        --- a/tests/acceptance/ConsumablesCept.php
        +++ b/tests/acceptance/ConsumablesCept.php
        @@ -4,12 +4,12 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the consumables listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/consumables');
        +$I->amOnPage('/consumables');
         $I->waitForElement('.table', 5); // secs
         $I->seeNumberOfElements('table[name="consumables"] tr', [5,30]);
         $I->seeInTitle('Consumables');
         $I->see('Consumables');
        -$I->seeInPageSource('admin/consumables/create');
        +$I->seeInPageSource('/consumables/create');
         $I->dontSee('Consumables', '.page-header');
         $I->see('Consumables', 'h1.pull-left');
         
        @@ -17,7 +17,7 @@ $I->see('Consumables', 'h1.pull-left');
         $I->wantTo('ensure that the create consumables form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/consumables/create');
        +$I->amOnPage('/consumables/create');
         $I->dontSee('Create Consumable', '.page-header');
         $I->see('Create Consumable', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/CustomfieldsCept.php b/tests/acceptance/CustomfieldsCept.php
        index 96beb14ee8..c17ef60c3a 100644
        --- a/tests/acceptance/CustomfieldsCept.php
        +++ b/tests/acceptance/CustomfieldsCept.php
        @@ -4,10 +4,10 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the custom fields page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/custom_fields');
        +$I->amOnPage('/fields');
         $I->seeInTitle('Custom Fields');
         $I->see('Custom Fields');
        -$I->seeInPageSource('admin/custom_fields/create');
        +$I->seeInPageSource('/fields/create');
         $I->dontSee('Custom Fields', '.page-header');
         $I->dontSee('Fieldsets', '.page-header');
         $I->see('Manage Custom Fields', 'h1.pull-left');
        diff --git a/tests/acceptance/DepartmentsCept.php b/tests/acceptance/DepartmentsCept.php
        new file mode 100644
        index 0000000000..6549eac7ce
        --- /dev/null
        +++ b/tests/acceptance/DepartmentsCept.php
        @@ -0,0 +1,24 @@
        +<?php
        +$I = new AcceptanceTester($scenario);
        +AcceptanceTester::test_login($I);
        +
        +$I->am('logged in user');
        +$I->wantTo('ensure that the department listing page loads without errors');
        +$I->lookForwardTo('seeing it load without errors');
        +$I->amOnPage('/departments');
        +$I->waitForElement('.table', 5); // secs
        +$I->seeNumberOfElements('table[name="departments"] tr', [5,30]);
        +$I->seeInTitle('Departments');
        +$I->see('Departments');
        +$I->seeInPageSource('departments/create');
        +$I->dontSee('Departments', '.page-header');
        +$I->see('Departments', 'h1.pull-left');
        +
        +/* Create Form */
        +$I->wantTo('ensure that the create department form loads without errors');
        +$I->lookForwardTo('seeing it load without errors');
        +$I->click(['link' => 'Create New']);
        +$I->amOnPage('/department/create');
        +$I->dontSee('Create Department', '.page-header');
        +$I->see('Create Department', 'h1.pull-left');
        +$I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/DepreciationsCept.php b/tests/acceptance/DepreciationsCept.php
        index ca0266f99c..710e36ac32 100644
        --- a/tests/acceptance/DepreciationsCept.php
        +++ b/tests/acceptance/DepreciationsCept.php
        @@ -5,11 +5,11 @@ $I->am('logged in user');
         $I->wantTo('ensure that depreciations page loads without errors');
         $I->amGoingTo('go to the depreciations listing page');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/settings/depreciations');
        +$I->amOnPage('/depreciations');
         $I->seeInTitle('Depreciations');
         $I->waitForElement('.table', 5); // secs
        -$I->seeNumberOfElements('table[name="depreciations"] tbody tr', 1);
        -$I->seeInPageSource('/admin/settings/depreciations/create');
        +$I->seeNumberOfElements('table[name="depreciations"] tbody tr', [1,5]);
        +$I->seeInPageSource('/depreciations/create');
         $I->dontSee('Depreciations', '.page-header');
         $I->see('Depreciations', 'h1.pull-left');
         
        @@ -17,7 +17,7 @@ $I->see('Depreciations', 'h1.pull-left');
         $I->wantTo('ensure that the create depreciation form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/settings/depreciations/create');
        +$I->amOnPage('/depreciations/create');
         $I->seeInTitle('Create Depreciation');
         $I->dontSee('Create Depreciation', '.page-header');
         $I->see('Create Depreciation', 'h1.pull-left');
        diff --git a/tests/acceptance/LocationsCept.php b/tests/acceptance/LocationsCept.php
        index aa34a684cf..31c33a4c21 100644
        --- a/tests/acceptance/LocationsCept.php
        +++ b/tests/acceptance/LocationsCept.php
        @@ -4,12 +4,12 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the locations listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/settings/locations');
        +$I->amOnPage('/locations');
         $I->waitForElement('.table', 5); // secs
         $I->seeNumberOfElements('tr', [5,30]);
         $I->seeInTitle('Locations');
         $I->see('Locations');
        -$I->seeInPageSource('admin/settings/locations/create');
        +$I->seeInPageSource('/locations/create');
         $I->dontSee('Locations', '.page-header');
         $I->see('Locations', 'h1.pull-left');
         
        @@ -18,7 +18,7 @@ $I->see('Locations', 'h1.pull-left');
         $I->wantTo('ensure that the create location form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/settings/locations/create');
        +$I->amOnPage('/locations/create');
         $I->dontSee('Create Location', '.page-header');
         $I->see('Create Location', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/ManufacturersCept.php b/tests/acceptance/ManufacturersCept.php
        index ad7beadeb8..3aed82c1da 100644
        --- a/tests/acceptance/ManufacturersCept.php
        +++ b/tests/acceptance/ManufacturersCept.php
        @@ -4,11 +4,11 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the manufacturers listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/settings/manufacturers');
        +$I->amOnPage('/manufacturers');
         $I->seeNumberOfElements('table[name="manufacturers"] tr', [5,30]);
         $I->see('Manufacturers');
         $I->seeInTitle('Manufacturers');
        -$I->seeInPageSource('admin/settings/manufacturers/create');
        +$I->seeInPageSource('manufacturers/create');
         $I->dontSee('Manufacturers', '.page-header');
         $I->see('Manufacturers', 'h1.pull-left');
         
        @@ -17,7 +17,7 @@ $I->see('Manufacturers', 'h1.pull-left');
         $I->wantTo('ensure that the create manufacturer form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/settings/manufacturers/create');
        +$I->amOnPage('/manufacturers/create');
         $I->dontSee('Create Manufacturer', '.page-header');
         $I->see('Create Manufacturer', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/StatuslabelsCept.php b/tests/acceptance/StatuslabelsCept.php
        index aadbf13177..70b97c26b2 100644
        --- a/tests/acceptance/StatuslabelsCept.php
        +++ b/tests/acceptance/StatuslabelsCept.php
        @@ -4,12 +4,12 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure the status labels listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/settings/statuslabels');
        +$I->amOnPage('/statuslabels');
         $I->waitForElement('.table', 5); // secs
         $I->seeNumberOfElements('tr', [1,30]);
         $I->seeInTitle('Status Labels');
         $I->see('Status Labels');
        -$I->seeInPageSource('admin/settings/statuslabels/create');
        +$I->seeInPageSource('statuslabels/create');
         $I->dontSee('Status Labels', '.page-header');
         $I->see('Status Labels', 'h1.pull-left');
         
        @@ -17,7 +17,7 @@ $I->see('Status Labels', 'h1.pull-left');
         $I->wantTo('ensure the create status labels form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/settings/statuslabels/create');
        +$I->amOnPage('/statuslabels/create');
         $I->dontSee('Create Status Label', '.page-header');
         $I->see('Create Status Label', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/SuppliersCept.php b/tests/acceptance/SuppliersCept.php
        index 92bdf9c582..0aed96cf9f 100644
        --- a/tests/acceptance/SuppliersCept.php
        +++ b/tests/acceptance/SuppliersCept.php
        @@ -4,12 +4,12 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the suppliers listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/settings/suppliers');
        +$I->amOnPage('/suppliers');
         $I->waitForElement('.table', 5); // secs
         $I->seeNumberOfElements('table[name="suppliers"] tr', [5,25]);
         $I->seeInTitle('Suppliers');
         $I->see('Suppliers');
        -$I->seeInPageSource('admin/settings/suppliers/create');
        +$I->seeInPageSource('suppliers/create');
         $I->dontSee('Suppliers', '.page-header');
         $I->see('Suppliers', 'h1.pull-left');
         
        @@ -17,7 +17,7 @@ $I->see('Suppliers', 'h1.pull-left');
         $I->wantTo('ensure the create supplier form loads without errors');
         $I->lookForwardTo('seeing it load without errors');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('/admin/settings/suppliers/create');
        +$I->amOnPage('/suppliers/create');
         $I->dontSee('Create Supplier', '.page-header');
         $I->see('Create Supplier', 'h1.pull-left');
         $I->dontSee('&lt;span class=&quot;');
        diff --git a/tests/acceptance/UsersCept.php b/tests/acceptance/UsersCept.php
        index 06c2e78e90..a4f46a92d6 100644
        --- a/tests/acceptance/UsersCept.php
        +++ b/tests/acceptance/UsersCept.php
        @@ -4,13 +4,13 @@ AcceptanceTester::test_login($I);
         $I->am('logged in user');
         $I->wantTo('ensure that the users listing page loads without errors');
         $I->lookForwardTo('seeing it load without errors');
        -$I->amOnPage('/admin/users');
        +$I->amOnPage('/users');
         //$I->waitForJS("return $.active == 0;", 60);
         $I->waitForElement('.table', 5); // secs
         //$I->seeNumberOfElements('tr', [1,10]);
         $I->seeInTitle('Users');
         $I->see('Users');
        -$I->seeInPageSource('admin/users/create');
        +$I->seeInPageSource('users/create');
         $I->dontSee('Users', '.page-header');
         $I->see('Users', 'h1.pull-left');
         $I->seeLink('Create New'); // matches <a href="/logout">Logout</a>
        @@ -21,7 +21,7 @@ $I->am('logged in admin');
         $I->wantTo('ensure that you get errors when you submit an incomplete form');
         $I->lookForwardTo('seeing errors display');
         $I->click(['link' => 'Create New']);
        -$I->amOnPage('admin/users/create');
        +$I->amOnPage('users/create');
         $I->dontSee('Create User', '.page-header');
         $I->see('Create User', 'h1.pull-left');
         
        diff --git a/tests/api.suite.yml b/tests/api.suite.yml
        new file mode 100644
        index 0000000000..7528761ebe
        --- /dev/null
        +++ b/tests/api.suite.yml
        @@ -0,0 +1,13 @@
        +class_name: ApiTester
        +modules:
        +    enabled:
        +        - \Helper\Api
        +        - REST:
        +            url: /api/v1
        +            depends: Laravel5
        +        - Asserts
        +    config:
        +        - Laravel5:
        +            environment_file: .env.testing
        +            disable_middleware: true
        +            cleanup: true
        diff --git a/tests/api/ApiAssetsCest.php b/tests/api/ApiAssetsCest.php
        new file mode 100644
        index 0000000000..6489e99f1a
        --- /dev/null
        +++ b/tests/api/ApiAssetsCest.php
        @@ -0,0 +1,434 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Auth;
        +
        +class ApiAssetsCest
        +{
        +    protected $faker;
        +    protected $user;
        +
        +    public function _before(ApiTester $I)
        +    {
        +        $this->faker = \Faker\Factory::create();
        +        $this->user = \App\Models\User::find(1);
        +
        +        $I->amBearerAuthenticated($I->getToken($this->user));
        +    }
        +
        +    /** @test */
        +    public function indexAssets(ApiTester $I)
        +    {
        +        $I->wantTo('Get a list of assets');
        +
        +        // setup
        +        $assets = factory(\App\Models\Asset::class, 10)->create();
        +
        +        // call
        +        $I->sendGET('/hardware');
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +
        +        // sample verify
        +        $asset = $assets->random();
        +
        +        $I->seeResponseContainsJson([
        +            'id' => (int) $asset->id,
        +            'name' => e($asset->name),
        +            'asset_tag' => e($asset->asset_tag),
        +            'serial' => e($asset->serial),
        +            'model' => ($asset->model) ? [
        +                'id' => (int) $asset->model->id,
        +                'name'=> e($asset->model->name)
        +            ] : null,
        +            'model_number' => ($asset->model) ? e($asset->model->model_number) : null,
        +            'status_label' => ($asset->assetstatus) ? [
        +                'id' => (int) $asset->assetstatus->id,
        +                'name'=> e($asset->assetstatus->name)
        +            ] : null,
        +            'category' => ($asset->model->category) ? [
        +                'id' => (int) $asset->model->category->id,
        +                'name'=> e($asset->model->category->name)
        +            ]  : null,
        +            'manufacturer' => ($asset->model->manufacturer) ? [
        +                'id' => (int) $asset->model->manufacturer->id,
        +                'name'=> e($asset->model->manufacturer->name)
        +            ] : null,
        +            'supplier' => ($asset->supplier) ? [
        +                'id' => (int) $asset->supplier->id,
        +                'name'=> e($asset->supplier->name)
        +            ] : null,
        +            'notes' => e($asset->notes),
        +            'order_number' => e($asset->order_number),
        +            'company' => ($asset->company) ? [
        +                'id' => (int) $asset->company->id,
        +                'name'=> e($asset->company->name)
        +            ] : null,
        +            'location' => ($asset->assetLoc) ? [
        +                'id' => (int) $asset->assetLoc->id,
        +                'name'=> e($asset->assetLoc->name)
        +            ]  : null,
        +            'rtd_location' => ($asset->defaultLoc) ? [
        +                'id' => (int) $asset->defaultLoc->id,
        +                'name'=> e($asset->defaultLoc->name)
        +            ]  : null,
        +            'image' => ($asset->getImageUrl()) ? $asset->getImageUrl() : null,
        +            'assigned_to' => ($asset->assigneduser) ? [
        +                'id' => (int) $asset->assigneduser->id,
        +                'name' => e($asset->assigneduser->getFullNameAttribute()),
        +                'first_name'=> e($asset->assigneduser->first_name),
        +                'last_name'=> e($asset->assigneduser->last_name)
        +            ]  : null,
        +            'warranty' =>  ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null,
        +            'warranty_expires' => ($asset->warranty_months > 0) ?  [
        +                'datetime' => $asset->created_at->format('Y-m-d'),
        +                'formatted' => $asset->created_at->format('Y-m-d'),
        +            ] : null,
        +            // 'created_at' => ($asset->created_at) ? [
        +            //     'datetime' => $asset->created_at->format('Y-m-d H:i:s'),
        +            //     'formatted' => $asset->created_at->format('Y-m-d H:i a'),
        +            // ] : null,
        +            // 'updated_at' => ($asset->updated_at) ? [
        +            //     'datetime' => $asset->updated_at->format('Y-m-d H:i:s'),
        +            //     'formatted' => $asset->updated_at->format('Y-m-d H:i a'),
        +            // ] : null,
        +            // 'purchase_date' => ($asset->purchase_date) ? [
        +            //     'datetime' => $asset->purchase_date->format('Y-m-d'),
        +            //     'formatted' => $asset->purchase_date->format('Y-m-d'),
        +            // ] : null,
        +            // 'last_checkout' => ($asset->last_checkout) ? [
        +            //     'datetime' => $asset->last_checkout->format('Y-m-d'),
        +            //     'formatted' => $asset->last_checkout->format('Y-m-d'),
        +            // ] : null,
        +            // 'expected_checkin' => ($asset->created_at) ? [
        +            //     'date' => $asset->created_at->format('Y-m-d'),
        +            //     'formatted' => $asset->created_at->format('Y-m-d'),
        +            // ] : null,
        +            // 'purchase_cost' => (float) $asset->purchase_cost,
        +            'user_can_checkout' => (bool) $asset->availableForCheckout(),
        +            'available_actions' => [
        +                'checkout' => (bool) Gate::allows('checkout', Asset::class),
        +                'checkin' => (bool) Gate::allows('checkin', Asset::class),
        +                'update' => (bool) Gate::allows('update', Asset::class),
        +                'delete' => (bool) Gate::allows('delete', Asset::class),
        +            ],
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function createAsset(ApiTester $I, $scenario)
        +    {
        +        $I->wantTo('Create a new asset');
        +
        +        $temp_asset = factory(\App\Models\Asset::class)->make();
        +
        +        // setup
        +        $data = [
        +            'asset_tag' => $temp_asset->asset_tag,
        +            'assigned_to' => $temp_asset->assigned_to,
        +            'company_id' => $temp_asset->company->id,
        +            'image' => $temp_asset->image,
        +            'model_id' => $temp_asset->model_id,
        +            'name' => $temp_asset->name,
        +            'notes' => $temp_asset->notes,
        +            'purchase_cost' => $temp_asset->purchase_cost,
        +            'purchase_date' => $temp_asset->purchase_date,
        +            'rtd_location_id' => $temp_asset->rtd_location_id,
        +            'serial' => $temp_asset->serial,
        +            'status_id' => $temp_asset->status_id,
        +            'supplier_id' => $temp_asset->supplier_id,
        +            'warranty_months' => $temp_asset->warranty_months,
        +        ];
        +
        +        // create
        +        $I->sendPOST('/hardware', $data);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +    }
        +
        +    /** @test */
        +    public function updateAssetWithPatch(ApiTester $I, $scenario)
        +    {
        +        $I->wantTo('Update an asset with PATCH');
        +
        +        // create
        +        $asset = factory(\App\Models\Asset::class)->create();
        +        $I->assertInstanceOf(\App\Models\Asset::class, $asset);
        +
        +        $temp_asset = factory(\App\Models\Asset::class)->make();
        +
        +        $data = [
        +            'asset_tag' => $temp_asset->asset_tag,
        +            'assigned_to' => $temp_asset->assigned_to,
        +            'company_id' => $temp_asset->company->id,
        +            'image' => $temp_asset->image,
        +            'model_id' => $temp_asset->model_id,
        +            'name' => $temp_asset->name,
        +            'notes' => $temp_asset->notes,
        +            'purchase_cost' => $temp_asset->purchase_cost,
        +            'purchase_date' => $temp_asset->purchase_date->format('Y-m-d'),
        +            'rtd_location_id' => $temp_asset->rtd_location_id,
        +            'serial' => $temp_asset->serial,
        +            'status_id' => $temp_asset->status_id,
        +            'supplier_id' => $temp_asset->supplier_id,
        +            'warranty_months' => $temp_asset->warranty_months,
        +        ];
        +
        +        $I->assertNotEquals($asset->name, $data['name']);
        +
        +        // update
        +        $I->sendPATCH('/hardware/' . $asset->id, $data);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +        $I->assertEquals('success', $response->status);
        +        $I->assertEquals(trans('admin/hardware/message.update.success'), $response->messages);
        +        $I->assertEquals($asset->id, $response->payload->id); // asset id does not change
        +        $I->assertEquals($temp_asset->asset_tag, $response->payload->asset_tag); // asset tag updated
        +        $I->assertEquals($temp_asset->name, $response->payload->name); // asset name updated
        +        $I->assertEquals($temp_asset->rtd_location_id, $response->payload->rtd_location_id); // asset rtd_location_id updated
        +
        +        // verify
        +        $I->sendGET('/hardware/' . $asset->id);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseContainsJson([
        +            'id' => (int) $asset->id,
        +            'name' => e($temp_asset->name),
        +            'asset_tag' => e($temp_asset->asset_tag),
        +            'serial' => e($temp_asset->serial),
        +            'model' => ($temp_asset->model) ? [
        +                'id' => (int) $temp_asset->model->id,
        +                'name'=> e($temp_asset->model->name)
        +            ] : null,
        +            'model_number' => ($temp_asset->model) ? e($temp_asset->model->model_number) : null,
        +            'status_label' => ($temp_asset->assetstatus) ? [
        +                'id' => (int) $temp_asset->assetstatus->id,
        +                'name'=> e($temp_asset->assetstatus->name)
        +            ] : null,
        +            'category' => ($temp_asset->model->category) ? [
        +                'id' => (int) $temp_asset->model->category->id,
        +                'name'=> e($temp_asset->model->category->name)
        +            ]  : null,
        +            'manufacturer' => ($temp_asset->model->manufacturer) ? [
        +                'id' => (int) $temp_asset->model->manufacturer->id,
        +                'name'=> e($temp_asset->model->manufacturer->name)
        +            ] : null,
        +            'notes' => e($temp_asset->notes),
        +            'order_number' => e($asset->order_number),
        +            'company' => ($asset->company) ? [
        +                'id' => (int) $temp_asset->company->id,
        +                'name'=> e($temp_asset->company->name)
        +            ] : null,
        +            'location' => ($temp_asset->assetLoc) ? [
        +                'id' => (int) $temp_asset->assetLoc->id,
        +                'name'=> e($temp_asset->assetLoc->name)
        +            ]  : null,
        +            'rtd_location' => ($temp_asset->defaultLoc) ? [
        +                'id' => (int) $temp_asset->defaultLoc->id,
        +                'name'=> e($temp_asset->defaultLoc->name)
        +            ]  : null,
        +            'image' => ($asset->getImageUrl()) ? $asset->getImageUrl() : null,
        +            'assigned_to' => ($temp_asset->assigneduser) ? [
        +                'id' => (int) $temp_asset->assigneduser->id,
        +                'name' => e($temp_asset->assigneduser->getFullNameAttribute()),
        +                'first_name'=> e($temp_asset->assigneduser->first_name),
        +                'last_name'=> e($temp_asset->assigneduser->last_name)
        +            ]  : null,
        +            'warranty' =>  ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null,
        +            'warranty_expires' => ($asset->warranty_months > 0) ?  [
        +                'datetime' => $asset->created_at->format('Y-m-d'),
        +                'formatted' => $asset->created_at->format('Y-m-d'),
        +            ] : null,
        +            // 'created_at' => ($asset->created_at) ? [
        +            //     'datetime' => $asset->created_at->format('Y-m-d H:i:s'),
        +            //     'formatted' => $asset->created_at->format('Y-m-d H:i a'),
        +            // ] : null,
        +            // 'updated_at' => ($asset->updated_at) ? [
        +            //     'datetime' => $asset->updated_at->format('Y-m-d H:i:s'),
        +            //     'formatted' => $asset->updated_at->format('Y-m-d H:i a'),
        +            // ] : null,
        +            // 'purchase_date' => ($asset->purchase_date) ? [
        +            //     'datetime' => $asset->purchase_date->format('Y-m-d'),
        +            //     'formatted' => $asset->purchase_date->format('Y-m-d'),
        +            // ] : null,
        +            // 'last_checkout' => ($asset->last_checkout) ? [
        +            //     'datetime' => $asset->last_checkout->format('Y-m-d'),
        +            //     'formatted' => $asset->last_checkout->format('Y-m-d'),
        +            // ] : null,
        +            // 'expected_checkin' => ($asset->created_at) ? [
        +            //     'date' => $asset->created_at->format('Y-m-d'),
        +            //     'formatted' => $asset->created_at->format('Y-m-d'),
        +            // ] : null,
        +            // 'purchase_cost' => (float) $asset->purchase_cost,
        +            'user_can_checkout' => (bool) $temp_asset->availableForCheckout(),
        +            'available_actions' => [
        +                'checkout' => (bool) Gate::allows('checkout', Asset::class),
        +                'checkin' => (bool) Gate::allows('checkin', Asset::class),
        +                'update' => (bool) Gate::allows('update', Asset::class),
        +                'delete' => (bool) Gate::allows('delete', Asset::class),
        +            ],
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function updateAssetWithPut(ApiTester $I)
        +    {
        +        $I->wantTo('Update a asset with PUT');
        +
        +        // create
        +        $asset = factory(\App\Models\Asset::class)->create();
        +        $I->assertInstanceOf(\App\Models\Asset::class, $asset);
        +
        +        $temp_asset_tag = $this->faker->uuid;
        +        $temp_asset = factory(\App\Models\Asset::class)->make([
        +            'asset_tag' => $temp_asset_tag,
        +        ]);
        +
        +        $I->assertNotNull($temp_asset->asset_tag);
        +        $I->assertEquals($temp_asset_tag, $temp_asset->asset_tag);
        +
        +        $data = [
        +            'asset_tag' => $temp_asset->asset_tag,
        +            'assigned_to' => $temp_asset->assigned_to,
        +            'company_id' => $temp_asset->company->id,
        +            'image' => $temp_asset->image,
        +            'model_id' => $temp_asset->model_id,
        +            'name' => $temp_asset->name,
        +            'notes' => $temp_asset->notes,
        +            'purchase_cost' => $temp_asset->purchase_cost,
        +            'purchase_date' => $temp_asset->purchase_date->format('Y-m-d'),
        +            'rtd_location_id' => $temp_asset->rtd_location_id,
        +            'serial' => $temp_asset->serial,
        +            'status_id' => $temp_asset->status_id,
        +            'supplier_id' => $temp_asset->supplier_id,
        +            'warranty_months' => $temp_asset->warranty_months,
        +        ];
        +
        +        $I->assertNotEquals($asset->name, $data['name']);
        +
        +        // update
        +        $I->sendPUT('/hardware/' . $asset->id, $data);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +        $I->assertEquals('success', $response->status);
        +        $I->assertEquals(trans('admin/hardware/message.update.success'), $response->messages);
        +        $I->assertEquals($asset->id, $response->payload->id); // asset id does not change
        +        $I->assertEquals($temp_asset->asset_tag, $response->payload->asset_tag); // asset tag updated
        +        $I->assertEquals($temp_asset->name, $response->payload->name); // asset name updated
        +        $I->assertEquals($temp_asset->rtd_location_id, $response->payload->rtd_location_id); // asset rtd_location_id updated
        +
        +        // verify
        +        $I->sendGET('/hardware/' . $asset->id);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseContainsJson([
        +            'id' => (int) $asset->id,
        +            'name' => e($temp_asset->name),
        +            'asset_tag' => e($temp_asset->asset_tag),
        +            'serial' => e($temp_asset->serial),
        +            'model' => ($temp_asset->model) ? [
        +                'id' => (int) $temp_asset->model->id,
        +                'name'=> e($temp_asset->model->name)
        +            ] : null,
        +            'model_number' => ($temp_asset->model) ? e($temp_asset->model->model_number) : null,
        +            'status_label' => ($temp_asset->assetstatus) ? [
        +                'id' => (int) $temp_asset->assetstatus->id,
        +                'name'=> e($temp_asset->assetstatus->name)
        +            ] : null,
        +            'category' => ($temp_asset->model->category) ? [
        +                'id' => (int) $temp_asset->model->category->id,
        +                'name'=> e($temp_asset->model->category->name)
        +            ]  : null,
        +            'manufacturer' => ($temp_asset->model->manufacturer) ? [
        +                'id' => (int) $temp_asset->model->manufacturer->id,
        +                'name'=> e($temp_asset->model->manufacturer->name)
        +            ] : null,
        +            'notes' => e($temp_asset->notes),
        +            'order_number' => e($asset->order_number),
        +            'company' => ($asset->company) ? [
        +                'id' => (int) $temp_asset->company->id,
        +                'name'=> e($temp_asset->company->name)
        +            ] : null,
        +            'location' => ($temp_asset->assetLoc) ? [
        +                'id' => (int) $temp_asset->assetLoc->id,
        +                'name'=> e($temp_asset->assetLoc->name)
        +            ]  : null,
        +            'rtd_location' => ($temp_asset->defaultLoc) ? [
        +                'id' => (int) $temp_asset->defaultLoc->id,
        +                'name'=> e($temp_asset->defaultLoc->name)
        +            ]  : null,
        +            'image' => ($asset->getImageUrl()) ? $asset->getImageUrl() : null,
        +            'assigned_to' => ($temp_asset->assigneduser) ? [
        +                'id' => (int) $temp_asset->assigneduser->id,
        +                'name' => e($temp_asset->assigneduser->getFullNameAttribute()),
        +                'first_name'=> e($temp_asset->assigneduser->first_name),
        +                'last_name'=> e($temp_asset->assigneduser->last_name)
        +            ]  : null,
        +            'warranty' =>  ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null,
        +            'warranty_expires' => ($asset->warranty_months > 0) ?  [
        +                'datetime' => $asset->created_at->format('Y-m-d'),
        +                'formatted' => $asset->created_at->format('Y-m-d'),
        +            ] : null,
        +            // 'created_at' => ($asset->created_at) ? [
        +            //     'datetime' => $asset->created_at->format('Y-m-d H:i:s'),
        +            //     'formatted' => $asset->created_at->format('Y-m-d H:i a'),
        +            // ] : null,
        +            // 'updated_at' => ($asset->updated_at) ? [
        +            //     'datetime' => $asset->updated_at->format('Y-m-d H:i:s'),
        +            //     'formatted' => $asset->updated_at->format('Y-m-d H:i a'),
        +            // ] : null,
        +            // 'purchase_date' => ($asset->purchase_date) ? [
        +            //     'datetime' => $asset->purchase_date->format('Y-m-d'),
        +            //     'formatted' => $asset->purchase_date->format('Y-m-d'),
        +            // ] : null,
        +            // 'last_checkout' => ($asset->last_checkout) ? [
        +            //     'datetime' => $asset->last_checkout->format('Y-m-d'),
        +            //     'formatted' => $asset->last_checkout->format('Y-m-d'),
        +            // ] : null,
        +            // 'expected_checkin' => ($asset->created_at) ? [
        +            //     'date' => $asset->created_at->format('Y-m-d'),
        +            //     'formatted' => $asset->created_at->format('Y-m-d'),
        +            // ] : null,
        +            // 'purchase_cost' => (float) $asset->purchase_cost,
        +            'user_can_checkout' => (bool) $temp_asset->availableForCheckout(),
        +            'available_actions' => [
        +                'checkout' => (bool) Gate::allows('checkout', Asset::class),
        +                'checkin' => (bool) Gate::allows('checkin', Asset::class),
        +                'update' => (bool) Gate::allows('update', Asset::class),
        +                'delete' => (bool) Gate::allows('delete', Asset::class),
        +            ],
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function deleteAssetTest(ApiTester $I, $scenario)
        +    {
        +        $I->wantTo('Delete an asset');
        +
        +        // create
        +        $asset = factory(\App\Models\Asset::class)->create();
        +        $I->assertInstanceOf(\App\Models\Asset::class, $asset);
        +
        +        // delete
        +        $I->sendDELETE('/hardware/' . $asset->id);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +        $I->assertEquals('success', $response->status);
        +        $I->assertEquals(trans('admin/hardware/message.delete.success'), $response->messages);
        +
        +        // verify, expect a 200
        +        $I->sendGET('/hardware/' . $asset->id);
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseIsJson(); // @todo: response is not JSON
        +
        +        
        +        // $scenario->incomplete('not found response should be JSON, receiving HTML instead');
        +    }
        +}
        diff --git a/tests/api/ApiComponentsAssetsCest.php b/tests/api/ApiComponentsAssetsCest.php
        new file mode 100644
        index 0000000000..c3118c4e6b
        --- /dev/null
        +++ b/tests/api/ApiComponentsAssetsCest.php
        @@ -0,0 +1,80 @@
        +<?php
        +
        +class ApiComponentsAssetsCest
        +{
        +    protected $faker;
        +    protected $user;
        +
        +    public function _before(ApiTester $I)
        +    {
        +        $this->faker = \Faker\Factory::create();
        +        $this->user = \App\Models\User::find(1);
        +
        +        $I->amBearerAuthenticated($I->getToken($this->user));
        +    }
        +
        +    /** @test */
        +    public function indexComponentsAssets(ApiTester $I)
        +    {
        +        $I->wantTo('Get a list of assets related to a component');
        +
        +        // generate component
        +        $component = factory(\App\Models\Component::class)
        +                    ->create(['user_id' => $this->user->id, 'qty' => 20]);
        +
        +        // generate assets and associate component
        +        $assets = factory(\App\Models\Asset::class, 2)
        +                    ->create(['user_id' => $this->user->id])
        +                    ->each(function ($asset) use ($component) {
        +                        $component->assets()->attach($component->id, [
        +                            'component_id' => $component->id,
        +                            'user_id' => $this->user->id,
        +                            'created_at' => date('Y-m-d H:i:s'),
        +                            'assigned_qty' => 2,
        +                            'asset_id' => $asset->id
        +                        ]);
        +                    });
        +
        +        // verify
        +        $I->sendGET('/components/' . $component->id . '/assets/');
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +        $I->assertEquals(2, $response->total);
        +
        +        $I->assertInstanceOf(\Illuminate\Database\Eloquent\Collection::class, $assets);
        +
        +        $I->seeResponseContainsJson(['rows' => [
        +                0 => [
        +                    'name' => $assets[0]->name,
        +                    'id' => $assets[0]->id,
        +                    'created_at' => $assets[0]->created_at->format('Y-m-d'),
        +                ],
        +                1 => [
        +                    'name' => $assets[1]->name,
        +                    'id' => $assets[1]->id,
        +                    'created_at' => $assets[1]->created_at->format('Y-m-d'),
        +                ],
        +            ]
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function expectEmptyResponseWithoutAssociatedAssets(ApiTester $I, $scenario)
        +    {
        +        $I->wantTo('See an empty response when there are no associated assets to a component');
        +
        +        $component = factory(\App\Models\Component::class)
        +                    ->create(['user_id' => $this->user->id, 'qty' => 20]);
        +
        +        $I->sendGET('/components/' . $component->id . '/assets');
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseIsJson();
        +
        +        $response = json_decode($I->grabResponse());
        +        $I->assertEquals(0, $response->total);
        +        $I->assertEquals([], $response->rows);
        +        $I->seeResponseContainsJson(['total' => 0, 'rows' => []]);
        +    }
        +}
        diff --git a/tests/api/ApiComponentsCest.php b/tests/api/ApiComponentsCest.php
        new file mode 100644
        index 0000000000..d8714ef024
        --- /dev/null
        +++ b/tests/api/ApiComponentsCest.php
        @@ -0,0 +1,193 @@
        +<?php
        +
        +use Illuminate\Support\Facades\Auth;
        +
        +class ApiComponentsCest
        +{
        +    protected $faker;
        +    protected $user;
        +
        +    public function _before(ApiTester $I)
        +    {
        +        $this->faker = \Faker\Factory::create();
        +        $this->user = \App\Models\User::find(1);
        +
        +        $I->amBearerAuthenticated($I->getToken($this->user));
        +    }
        +
        +    /** @test */
        +    public function indexComponents(ApiTester $I)
        +    {
        +        $I->wantTo('Get a list of components');
        +
        +        // setup
        +        $components = factory(\App\Models\Component::class, 10)->create();
        +
        +        // call
        +        $I->sendGET('/components');
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        // sample verify
        +        $component = $components->random();
        +        $I->seeResponseContainsJson([
        +            'name' => $component->name,
        +            'qty' => $component->qty,
        +        ]);
        +
        +        $I->seeResponseContainsJson([
        +            'total' => \App\Models\Component::count(),
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function createComponent(ApiTester $I)
        +    {
        +        $I->wantTo('Create a new component');
        +
        +        // setup
        +        $category = factory(\App\Models\Category::class)->create(['user_id' => $this->user->id]);
        +        $location = factory(\App\Models\Location::class)->create(['user_id' => $this->user->id]);
        +        $company = factory(\App\Models\Company::class)->create();
        +
        +        $data = [
        +            'category_id' => $category->id,
        +            'company_id' => $company->id,
        +            'location_id' => $location->id,
        +            'name' => $this->faker->sentence(3),
        +            'purchase_cost' => $this->faker->randomFloat(2, 0),
        +            'purchase_date' => $this->faker->dateTime->format('Y-m-d'),
        +            'qty' => rand(1, 10),
        +        ];
        +
        +        // create
        +        $I->sendPOST('/components', $data);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +        $id = $response->payload->id;
        +
        +        $I->assertEquals('success', $response->status);
        +
        +        // verify
        +        $I->sendGET('/components/' . $id);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseContainsJson([
        +            'id' => (int) $id,
        +            'name' => e($data['name']),
        +            // 'serial_number' => e($component->serial),
        +            'location' => [
        +                'id' => (int) $data['location_id'],
        +                'name' => e($location->name),
        +            ],
        +            'qty' => number_format($data['qty']),
        +            // 'min_amt' => e($component->min_amt),
        +            'category' => [
        +                'id' => (int) $data['category_id'],
        +                'name' => e($category->name),
        +            ],
        +            // 'order_number'  => e($component->order_number),
        +            'purchase_date' =>  \App\Helpers\Helper::getFormattedDateObject($data['purchase_date'], 'date'),
        +            'purchase_cost' => \App\Helpers\Helper::formatCurrencyOutput($data['purchase_cost']),
        +            // 'remaining' => (int) $component->numRemaining(),
        +            'company' => [
        +                'id' => (int) $data['company_id'],
        +                'name' => e($company->name),
        +            ],
        +            // 'created_at' => Helper::getFormattedDateObject($component->created_at, 'datetime'),
        +            // 'updated_at' => Helper::getFormattedDateObject($component->updated_at, 'datetime'),
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function updateComponentWithPatch(ApiTester $I)
        +    {
        +        $I->wantTo('Update a component with PATCH');
        +
        +        // create
        +        $component = factory(\App\Models\Component::class)->create();
        +        $I->assertInstanceOf(\App\Models\Component::class, $component);
        +
        +        $data = [
        +            'name' => $this->faker->sentence(3),
        +            'qty' => $this->faker->randomDigit + 1,
        +        ];
        +
        +        $I->assertNotEquals($component->name, $data['name']);
        +
        +        // update
        +        $I->sendPATCH('/components/' . $component->id, $data);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +        $I->assertEquals('success', $response->status);
        +
        +        // verify
        +        $I->sendGET('/components/' . $component->id);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseContainsJson([
        +            'name' => $data['name'],
        +            'id' => $component->id,
        +            'qty' => $data['qty'],
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function updateComponentWithPut(ApiTester $I)
        +    {
        +        $I->wantTo('Update a component with PUT');
        +
        +        // create
        +        $component = factory(\App\Models\Component::class)->create();
        +        $I->assertInstanceOf(\App\Models\Component::class, $component);
        +
        +        $data = [
        +            'name' => $this->faker->sentence(3),
        +        ];
        +
        +        $I->assertNotEquals($component->name, $data['name']);
        +
        +        // update
        +        $I->sendPUT('/components/' . $component->id, $data);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        $response = json_decode($I->grabResponse());
        +        $I->assertEquals('success', $response->status);
        +
        +        // verify
        +        $I->sendGET('/components/' . $component->id);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseContainsJson([
        +            'name' => e($data['name']),
        +            'id' => e($component->id),
        +            'qty' => e($component->qty),
        +        ]);
        +    }
        +
        +    /** @test */
        +    public function deleteComponentTest(ApiTester $I, $scenario)
        +    {
        +        $I->wantTo('Delete a component');
        +
        +        // create
        +        $component = factory(\App\Models\Component::class)->create();
        +        $I->assertInstanceOf(\App\Models\Component::class, $component);
        +
        +        // delete
        +        $I->sendDELETE('/components/' . $component->id);
        +        $I->seeResponseIsJson();
        +        $I->seeResponseCodeIs(200);
        +
        +        // verify, expect a 200 with an error message
        +        $I->sendGET('/components/' . $component->id);
        +        $I->seeResponseCodeIs(200);
        +        $I->seeResponseIsJson(); // @todo: response is not JSON
        +        // $scenario->incomplete('Resource not found response should be JSON, receiving HTML instead');
        +    }
        +}
        diff --git a/tests/api/_bootstrap.php b/tests/api/_bootstrap.php
        new file mode 100644
        index 0000000000..8a88555806
        --- /dev/null
        +++ b/tests/api/_bootstrap.php
        @@ -0,0 +1,2 @@
        +<?php
        +// Here you can initialize variables that will be available to your tests
        diff --git a/tests/functional.suite.yml b/tests/functional.suite.yml
        index 903177403e..fbbb9d42e9 100644
        --- a/tests/functional.suite.yml
        +++ b/tests/functional.suite.yml
        @@ -6,16 +6,18 @@
         
         class_name: FunctionalTester
         modules:
        -    enabled: 
        +    enabled:
                 # add framework module here
                 - \Helper\Functional
                 - Laravel5:
                     environment_file: .env.tests
        -            cleanup: false
        +            cleanup: true
                 - Db:
                     dsn: 'mysql:host=localhost;dbname=snipeittests'
        -            user: 'snipeit'
        -            password: 'snipe'
        +            user: 'snipeit_laravel'
        +            password: ''
                     dump: tests/_data/dump.sql
                     populate: true
        -            cleanup: false
        +            cleanup: true
        +        - REST:
        +            depends: Laravel5
        diff --git a/tests/functional/AccessoriesCest.php b/tests/functional/AccessoriesCest.php
        index ea34e83d9a..96e3ab330f 100644
        --- a/tests/functional/AccessoriesCest.php
        +++ b/tests/functional/AccessoriesCest.php
        @@ -9,14 +9,16 @@ class AccessoriesCest
                  $I->fillField('username', 'snipeit');
                  $I->fillField('password', 'snipeit');
                  $I->click('Login');
        +         $I->seeAuthentication();
             }
         
             // tests
        -    public function tryToTest(FunctionalTester $I)
        +    public function loadsFormWithoutErrors(FunctionalTester $I)
             {
                 $I->wantTo('ensure that the create accessories form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage('/admin/accessories/create');
        +        $I->amOnPage('/accessories/create');
        +        $I->seeResponseCodeIs(200);
                 $I->dontSee('Create Accessory', '.page-header');
                 $I->see('Create Accessory', 'h1.pull-left');
             }
        @@ -24,7 +26,8 @@ class AccessoriesCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage('/admin/accessories/create');
        +        $I->amOnPage('/accessories/create');
        +        $I->seeResponseCodeIs(200);
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -35,7 +38,8 @@ class AccessoriesCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage('/admin/accessories/create');
        +        $I->amOnPage('/accessories/create');
        +        $I->seeResponseCodeIs(200);
                 $I->fillField('name', 't2');
                 $I->fillField('qty', '-15');
                 $I->fillField('min_amt', '-15');
        @@ -49,7 +53,7 @@ class AccessoriesCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $accessory = factory(App\Models\Accessory::class,'accessory')->make();
        +        $accessory = factory(App\Models\Accessory::class)->make();
                 $values = [
                     'company_id'       => $accessory->company_id,
                     'name'          => $accessory->name,
        @@ -64,7 +68,8 @@ class AccessoriesCest
                 ];
         
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage('/admin/accessories/create');
        +        $I->amOnPage('/accessories/create');
        +        $I->seeResponseCodeIs(200);
         
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('accessories', $values);
        @@ -76,7 +81,7 @@ class AccessoriesCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete an accessory');
        -        $I->amOnPage( route('delete/accessory', $I->getAccessoryId() ) );
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete( route('accessories.destroy', $I->getAccessoryId() ), ['_token' => csrf_token()] );
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/AssetModelsCest.php b/tests/functional/AssetModelsCest.php
        index 072c2d84a2..a853b853ae 100644
        --- a/tests/functional/AssetModelsCest.php
        +++ b/tests/functional/AssetModelsCest.php
        @@ -15,7 +15,7 @@ class AssetModelsCest
             {
                 $I->wantTo('Test Asset Model Creation');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/model'));
        +        $I->amOnPage(route('models.create'));
                 $I->seeInTitle('Create Asset Model');
                 $I->see('Create Asset Model', 'h1.pull-left');
             }
        @@ -23,7 +23,7 @@ class AssetModelsCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/model'));
        +        $I->amOnPage(route('models.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -33,7 +33,7 @@ class AssetModelsCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $model = factory(App\Models\AssetModel::class, 'assetmodel')->make();
        +        $model = factory(App\Models\AssetModel::class)->make();
                 $values = [
                     'name'              => $model->name,
                     'manufacturer_id'   => $model->manufacturer_id,
        @@ -45,7 +45,7 @@ class AssetModelsCest
                 ];
         
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/model'));
        +        $I->amOnPage(route('models.create'));
         
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('models', $values);
        @@ -56,9 +56,9 @@ class AssetModelsCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete an asset model');
        -        // 6 is the only one without an assigned asset.  This is fragile.
        -        $I->amOnPage(route('delete/model', $I->getEmptyModelId()));
        -        $I->seeElement('.alert-success');
        +        $model = factory(App\Models\AssetModel::class)->create();
        +        $I->sendDelete(route('models.destroy', $model->id), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         
         }
        diff --git a/tests/functional/AssetsCest.php b/tests/functional/AssetsCest.php
        index 5f44b8c08d..2f517ca4a0 100644
        --- a/tests/functional/AssetsCest.php
        +++ b/tests/functional/AssetsCest.php
        @@ -15,7 +15,7 @@ class AssetsCest
             {
                 $I->wantTo('ensure that the create assets form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage('/hardware/create');
        +        $I->amOnPage(route('hardware.create'));
                 $I->dontSee('Create Asset', '.page-header');
                 $I->see('Create Asset', 'h1.pull-left');
             }
        @@ -23,7 +23,7 @@ class AssetsCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/hardware'));
        +        $I->amOnPage(route('hardware.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The asset tag field is required.', '.alert-msg');
        @@ -33,13 +33,14 @@ class AssetsCest
         
             public function passesCreateAndCheckout(FunctionalTester $I)
             {
        -        $asset = factory(App\Models\Asset::class,'asset')->make();
        +        $asset = factory(App\Models\Asset::class)->make();
        +        $userId = $I->getUserId();
                 $values = [
                     'company_id'        => $asset->company_id,
                     'asset_tag'         => $asset->asset_tag,
                     'model_id'          => $asset->model_id,
                     'status_id'         => $asset->status_id,
        -            'assigned_to'       => $I->getUserId(),
        +            'assigned_user'     => $userId,
                     'serial'            => $asset->serial,
                     'name'              => $asset->name,
                     'purchase_date'     => '2016-01-01',
        @@ -51,18 +52,37 @@ class AssetsCest
                     'rtd_location_id'   => $asset->rtd_location_id,
                     'requestable'       => $asset->requestable,
                 ];
        +
        +        $seenValues = [
        +            'company_id'        => $asset->company_id,
        +            'asset_tag'         => $asset->asset_tag,
        +            'model_id'          => $asset->model_id,
        +            'status_id'         => $asset->status_id,
        +            'assigned_to'       => $userId,
        +            'assigned_type'     => 'App\\Models\\User',
        +            'serial'            => $asset->serial,
        +            'name'              => $asset->name,
        +            'purchase_date'     => '2016-01-01',
        +            'supplier_id'       => $asset->supplier_id,
        +            'order_number'      => $asset->order_number,
        +            'purchase_cost'     => $asset->purchase_cost,
        +            'warranty_months'   => $asset->warranty_months,
        +            'notes'             => $asset->notes,
        +            'rtd_location_id'   => $asset->rtd_location_id,
        +            'requestable'       => $asset->requestable,
        +        ];
        +
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/hardware'));
        +        $I->amOnPage(route('hardware.create'));
                 $I->submitForm('form#create-form', $values);
        -        $I->seeRecord('assets', $values);
        +        $I->seeRecord('assets', $seenValues);
                 $I->dontSeeElement('.alert-danger'); // We should check for success, but we can't because of the stupid ajaxy way I did things.  FIXME when the asset form is rewritten.
             }
         
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete an asset');
        -        $I->amOnPage(route('delete/hardware', $I->getAssetId()));
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete(route('hardware.destroy', $I->getAssetId()), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        - 
        \ No newline at end of file
        diff --git a/tests/functional/CategoriesCest.php b/tests/functional/CategoriesCest.php
        index 869bc34759..7bf20a6420 100644
        --- a/tests/functional/CategoriesCest.php
        +++ b/tests/functional/CategoriesCest.php
        @@ -1,7 +1,7 @@
         <?php
         
         
        -class CategoryCest
        +class CategoriesCest
         {
             public function _before(FunctionalTester $I)
             {
        @@ -20,7 +20,7 @@ class CategoryCest
             {
                 $I->wantTo('Test Category Creation');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/category'));
        +        $I->amOnPage(route('categories.create'));
                 $I->seeInTitle('Create Category');
                 $I->see('Create Category', 'h1.pull-left');
             }
        @@ -28,7 +28,7 @@ class CategoryCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/category'));
        +        $I->amOnPage(route('categories.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -37,7 +37,7 @@ class CategoryCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $category = factory(App\Models\Category::class, 'asset-category')->make();
        +        $category = factory(App\Models\Category::class)->make();
                 $values = [
                     'name'                  => $category->name,
                     'category_type'         => $category->category_type,
        @@ -46,7 +46,7 @@ class CategoryCest
                     'checkin_email'         => $category->checkin_email,
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/category'));
        +        $I->amOnPage(route('categories.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('categories', $values);
                 $I->dontSee('&lt;span class=&quot;');
        @@ -55,7 +55,8 @@ class CategoryCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a category');
        -        $I->amOnPage(route('delete/category', $I->getEmptyCategoryId()));
        -        $I->seeElement('.alert-success');
        +        $category = factory(App\Models\Category::class)->create();
        +        $I->sendDelete(route('categories.destroy', $category->id), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/CompaniesCest.php b/tests/functional/CompaniesCest.php
        index fcd948df9c..db2805cc3b 100644
        --- a/tests/functional/CompaniesCest.php
        +++ b/tests/functional/CompaniesCest.php
        @@ -16,7 +16,7 @@ class CompaniesCest
             {
                 $I->wantTo('Test Company Creation');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/company'));
        +        $I->amOnPage(route('companies.create'));
                 $I->seeInTitle('Create Company');
                 $I->see('Create Company', 'h1.pull-left');
             }
        @@ -24,7 +24,7 @@ class CompaniesCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/company'));
        +        $I->amOnPage(route('companies.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -32,12 +32,12 @@ class CompaniesCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $company = factory(App\Models\Company::class, 'company')->make();
        +        $company = factory(App\Models\Company::class)->make();
                 $values = [
                     'name' => $company->name
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/company'));
        +        $I->amOnPage(route('companies.create'));
                 $I->fillField('name', 'TestCompany');
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('companies', $values);
        diff --git a/tests/functional/ComponentsCest.php b/tests/functional/ComponentsCest.php
        index 038afa8643..2f37aff4cf 100644
        --- a/tests/functional/ComponentsCest.php
        +++ b/tests/functional/ComponentsCest.php
        @@ -16,7 +16,7 @@ class ComponentsCest
             {
                 $I->wantTo('ensure that the create components form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/component'));
        +        $I->amOnPage(route('components.create'));
                 $I->dontSee('Create Component', '.page-header');
                 $I->see('Create Component', 'h1.pull-left');
             }
        @@ -24,7 +24,7 @@ class ComponentsCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/component'));
        +        $I->amOnPage(route('components.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -35,7 +35,7 @@ class ComponentsCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/component'));
        +        $I->amOnPage(route('components.create'));
                 $I->fillField('name', 't2');
                 $I->fillField('qty', '-15');
                 $I->fillField('min_amt', '-15');
        @@ -47,7 +47,7 @@ class ComponentsCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $component = factory(App\Models\Component::class, 'component')->make();
        +        $component = factory(App\Models\Component::class)->make();
         
                 $values = [
                     'name'              => $component->name,
        @@ -62,7 +62,7 @@ class ComponentsCest
                     'purchase_cost'     => $component->purchase_cost,
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/component'));
        +        $I->amOnPage(route('components.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('components', $values);
                 $I->dontSee('&lt;span class=&quot;');
        @@ -71,7 +71,7 @@ class ComponentsCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a component');
        -        $I->amOnPage(route('delete/component', $I->getComponentId()));
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete(route('components.destroy', $I->getComponentId()), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/ConsumablesCest.php b/tests/functional/ConsumablesCest.php
        index efa40c88a8..ee33b1bf35 100644
        --- a/tests/functional/ConsumablesCest.php
        +++ b/tests/functional/ConsumablesCest.php
        @@ -16,7 +16,7 @@ class ConsumablesCest
             {
                 $I->wantTo('ensure that the create consumables form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/consumable'));
        +        $I->amOnPage(route('consumables.create'));
                 $I->dontSee('Create Consumable', '.page-header');
                 $I->see('Create Consumable', 'h1.pull-left');
             }
        @@ -24,7 +24,7 @@ class ConsumablesCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/consumable'));
        +        $I->amOnPage(route('consumables.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -35,7 +35,7 @@ class ConsumablesCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/consumable'));
        +        $I->amOnPage(route('consumables.create'));
                 $I->fillField('name', 't2');
                 $I->fillField('qty', '-15');
                 $I->fillField('min_amt', '-15');
        @@ -48,7 +48,7 @@ class ConsumablesCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $consumable = factory(App\Models\Consumable::class, 'consumable')->make();
        +        $consumable = factory(App\Models\Consumable::class)->make();
                 $values = [
                     'company_id'        => $consumable->company_id,
                     'name'              => $consumable->name,
        @@ -62,7 +62,7 @@ class ConsumablesCest
                     'min_amt'           => $consumable->min_amt,
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/consumable'));
        +        $I->amOnPage(route('consumables.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('consumables', $values);
                 $I->seeElement('.alert-success');
        @@ -71,7 +71,7 @@ class ConsumablesCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a consumable');
        -        $I->amOnPage(route('delete/consumable', $I->getConsumableId()));
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete(route('consumables.destroy', $I->getConsumableId()), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/DepreciationsCest.php b/tests/functional/DepreciationsCest.php
        index 50c9ff0f99..4d48a917a1 100644
        --- a/tests/functional/DepreciationsCest.php
        +++ b/tests/functional/DepreciationsCest.php
        @@ -16,7 +16,7 @@ class DepreciationCest
             {
                 $I->wantTo('Test Depreciation Creation');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/depreciations'));
        +        $I->amOnPage(route('depreciations.create'));
                 $I->seeInTitle('Create Depreciation');
                 $I->dontSee('Create Depreciation', '.page-header');
                 $I->see('Create Depreciation', 'h1.pull-left');
        @@ -25,7 +25,7 @@ class DepreciationCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/depreciations'));
        +        $I->amOnPage(route('depreciations.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -35,7 +35,7 @@ class DepreciationCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/depreciations'));
        +        $I->amOnPage(route('depreciations.create'));
                 $I->fillField('name', 't2');
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
        @@ -44,13 +44,13 @@ class DepreciationCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $depreciation = factory(App\Models\Depreciation::class, 'depreciation')->make();
        +        $depreciation = factory(App\Models\Depreciation::class)->make();
                 $values = [
                     'name'      => $depreciation->name,
                     'months'    => $depreciation->months
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/depreciations'));
        +        $I->amOnPage(route('depreciations.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('depreciations', $values);
                 $I->seeElement('.alert-success');
        @@ -59,7 +59,7 @@ class DepreciationCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a depreciation');
        -        $I->amOnPage(route('delete/depreciations', $I->getDepreciationId()));
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete(route('depreciations.destroy', $I->getDepreciationId()), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/GroupsCest.php b/tests/functional/GroupsCest.php
        index e820ca0bd8..76a18971d3 100644
        --- a/tests/functional/GroupsCest.php
        +++ b/tests/functional/GroupsCest.php
        @@ -14,11 +14,12 @@ class GroupsCest
             }
         
             // tests
        -    public function tryToTest(FunctionalTester $I)
        +    public function loadsFormWithoutErrors(FunctionalTester $I)
             {
                 $I->wantTo('ensure that the create groups form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/group'));
        +        $I->amOnPage(route('groups.create'));
        +        $I->seeResponseCodeIs(200);
                 $I->dontSee('Create New Group', '.page-header');
                 $I->see('Create New Group', 'h1.pull-left');
             }
        @@ -26,7 +27,8 @@ class GroupsCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/group'));
        +        $I->amOnPage(route('groups.create'));
        +        $I->seeResponseCodeIs(200);
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -35,7 +37,8 @@ class GroupsCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/group'));
        +        $I->amOnPage(route('groups.create'));
        +        $I->seeResponseCodeIs(200);
                 $I->fillField('name', 't2');
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
        @@ -45,18 +48,37 @@ class GroupsCest
             public function passesCorrectValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/group'));
        +        $I->amOnPage(route('groups.create'));
        +        $I->seeResponseCodeIs(200);
                 $I->fillField('name', 'TestGroup');
                 $I->click('Save');
                 $I->dontSee('&lt;span class=&quot;');
                 $I->seeElement('.alert-success');
             }
         
        -    public function allowsDelete(FunctionalTester $I)
        +    public function allowsDelete(FunctionalTester $I, $scenario)
             {
        +        $scenario->incomplete('Fix this test to generate a group for deletes');
                 $I->wantTo('Ensure I can delete a group');
        -        $I->amOnPage(route('delete/group', Group::doesntHave('users')->first()->id));
        +
        +        // create a group
        +        $I->amOnPage(route('groups.create'));
        +        $I->seeResponseCodeIs(200);
        +        $I->fillField('name', 'TestGroup');
        +        $I->click('Save');
        +        $I->dontSee('&lt;span class=&quot;');
                 $I->seeElement('.alert-success');
        +
        +        // delete it
        +        $I->amOnPage(route('groups.delete', Group::doesntHave('users')->first()->id));
        +        $I->seeResponseCodeIs(200);
        +        $I->seeElement('.alert-success');
        +        // $I->seeResponseCodeIs(200);
             }
         
        +    public function allowsEditing(FunctionalTester $I, $scenario)
        +    {
        +        $scenario->incomplete('Fix this test to generate a group for editing');
        +        $I->wantTo('Ensure i can edit a group');
        +    }
         }
        diff --git a/tests/functional/LicensesCest.php b/tests/functional/LicensesCest.php
        index 3bc523df60..4aa0fe973e 100644
        --- a/tests/functional/LicensesCest.php
        +++ b/tests/functional/LicensesCest.php
        @@ -3,7 +3,7 @@
         
         use App\Models\License;
         
        -class licensesCest
        +class LicensesCest
         {
             public function _before(FunctionalTester $I)
             {
        @@ -18,7 +18,7 @@ class licensesCest
             {
                 $I->wantTo('ensure that the create licenses form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/licenses'));
        +        $I->amOnPage(route('licenses.create'));
                 $I->dontSee('Create License', '.page-header');
                 $I->see('Create License', 'h1.pull-left');
             }
        @@ -26,31 +26,28 @@ class licensesCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/licenses'));
        +        $I->amOnPage(route('licenses.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        -        $I->see('The serial field is required.', '.alert-msg');
                 $I->see('The seats field is required.', '.alert-msg');
             }
         
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/licenses'));
        +        $I->amOnPage(route('licenses.create'));
                 $I->fillField('name', 't2');
        -        $I->fillField('serial', '13a-');
                 $I->fillField('seats', '-15');
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name must be at least 3 characters', '.alert-msg');
        -        $I->see('The serial must be at least 5 characters', '.alert-msg');
                 $I->see('The seats must be at least 1', '.alert-msg');
             }
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $license = factory(App\Models\License::class, 'license')->make();
        +        $license = factory(App\Models\License::class)->make();
                 $values = [
                     'name'              => $license->name,
                     'serial'            => $license->serial,
        @@ -72,7 +69,7 @@ class licensesCest
                 ];
         
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/licenses'));
        +        $I->amOnPage(route('licenses.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('licenses', $values);
                 $I->dontSee('&lt;span class=&quot;');
        @@ -82,8 +79,8 @@ class licensesCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a license');
        -        $I->amOnPage(route('delete/license', License::doesntHave('assignedUsers')->first()->id));
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete(route('licenses.destroy', License::doesntHave('assignedUsers')->first()->id), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         
         }
        diff --git a/tests/functional/LocationsCest.php b/tests/functional/LocationsCest.php
        index a5d233df3a..3c760a1407 100644
        --- a/tests/functional/LocationsCest.php
        +++ b/tests/functional/LocationsCest.php
        @@ -20,7 +20,7 @@ class LocationsCest
                 /* Create Form */
                 $I->wantTo('Test Location Creation');
                 $I->lookForwardTo('Finding no Failures');
        -        $I->amOnPage(route('create/location'));
        +        $I->amOnPage(route('locations.create'));
                 $I->dontSee('Create Location', '.page-header');
                 $I->see('Create Location', 'h1.pull-left');
             }
        @@ -28,7 +28,7 @@ class LocationsCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/location'));
        +        $I->amOnPage(route('locations.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -37,22 +37,15 @@ class LocationsCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short values");
        -        $I->amOnPage(route('create/location'));
        -        $I->fillField('name', 't2');
        -        $I->fillField('address', 't2da');
        -        $I->fillField('city', 't2');
        -        $I->fillField('state', 't');
        -        $I->fillField('zip', 't2');
        +        $I->amOnPage(route('locations.create'));
        +        $I->fillField('name', 't');
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
        -        $I->see('The name must be at least 3 characters', '.alert-msg');
        -        $I->see('The address must be at least 5 characters', '.alert-msg');
        -        $I->see('The city must be at least 3 characters', '.alert-msg');
        -        $I->see('The zip must be at least 3 characters', '.alert-msg');
        +        $I->see('The name must be at least 2 characters', '.alert-msg');
             }
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $location = factory(App\Models\Location::class, 'location')->make();
        +        $location = factory(App\Models\Location::class)->make();
                 $values = [
                     'name'              => $location->name,
                     'parent_id'         => $I->getLocationId(),
        @@ -65,7 +58,7 @@ class LocationsCest
                     'zip'               => $location->zip,
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/location'));
        +        $I->amOnPage(route('locations.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('locations', $values);
                 $I->seeElement('.alert-success');
        @@ -74,7 +67,8 @@ class LocationsCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a location');
        -        $I->amOnPage(route('delete/location', Location::doesntHave('assets')->doesntHave('assignedAssets')->first()->id));
        -        $I->seeElement('.alert-success');
        +        $location = factory(App\Models\Location::class)->create();
        +        $I->sendDelete(route('locations.destroy', $location->id), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/ManufacturersCest.php b/tests/functional/ManufacturersCest.php
        index 119ca402e4..b2dd74e4cf 100644
        --- a/tests/functional/ManufacturersCest.php
        +++ b/tests/functional/ManufacturersCest.php
        @@ -18,7 +18,7 @@ class ManufacturersCest
             {
                 $I->wantTo('Test Manufacturer Creation');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/manufacturer'));
        +        $I->amOnPage(route('manufacturers.create'));
                 $I->seeInTitle('Create Manufacturer');
                 $I->see('Create Manufacturer', 'h1.pull-left');
             }
        @@ -26,7 +26,7 @@ class ManufacturersCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/manufacturer'));
        +        $I->amOnPage(route('manufacturers.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -35,7 +35,7 @@ class ManufacturersCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/manufacturer'));
        +        $I->amOnPage(route('manufacturers.create'));
                 $I->fillField('name', 't');
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
        @@ -43,12 +43,12 @@ class ManufacturersCest
             }
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $manufacturer = factory(App\Models\Manufacturer::class, 'manufacturer')->make();
        +        $manufacturer = factory(App\Models\Manufacturer::class)->make();
                 $values = [
                     'name' => $manufacturer->name
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/manufacturer'));
        +        $I->amOnPage(route('manufacturers.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('manufacturers', $values);
                 $I->seeElement('.alert-success');
        @@ -57,11 +57,8 @@ class ManufacturersCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a manufacturer');
        -        $I->amOnPage(route('delete/manufacturer', Manufacturer::doesntHave('models')
        -                                                ->doesntHave('accessories')
        -                                                ->doesntHave('consumables')
        -                                                ->doesntHave('licenses')->first()->id
        -        ));
        -        $I->seeElement('.alert-success');
        +        $manufacturerId = factory(App\Models\Manufacturer::class)->create()->id;
        +        $I->sendDelete(route('manufacturers.destroy', $manufacturerId), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/StatusLabelsCest.php b/tests/functional/StatusLabelsCest.php
        index cbe50f0f74..a57f625ae1 100644
        --- a/tests/functional/StatusLabelsCest.php
        +++ b/tests/functional/StatusLabelsCest.php
        @@ -18,7 +18,7 @@ class StatusLabelsCest
             {
                 $I->wantTo('ensure that the create statuslabels form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/statuslabel'));
        +        $I->amOnPage(route('statuslabels.create'));
                 $I->dontSee('Create Status Label', '.page-header');
                 $I->see('Create Status Label', 'h1.pull-left');
             }
        @@ -26,7 +26,7 @@ class StatusLabelsCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/statuslabel'));
        +        $I->amOnPage(route('statuslabels.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -34,7 +34,7 @@ class StatusLabelsCest
         
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $status = factory(App\Models\Statuslabel::class, 'pending')->make();
        +        $status = factory(App\Models\Statuslabel::class)->states('pending')->make();
                 $submitValues = [
                     'name'                  => 'Testing Status',
                     'statuslabel_types'     => 'pending',
        @@ -53,7 +53,7 @@ class StatusLabelsCest
                     'show_in_nav'           => true,
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/statuslabel'));
        +        $I->amOnPage(route('statuslabels.create'));
                 $I->submitForm('form#create-form', $submitValues);
                 $I->seeRecord('status_labels', $recordValues);
                 $I->seeElement('.alert-success');
        @@ -62,7 +62,7 @@ class StatusLabelsCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a Status Label');
        -        $I->amOnPage(route('delete/statuslabel', Statuslabel::doesntHave('assets')->first()->id));
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete(route('statuslabels.destroy', Statuslabel::doesntHave('assets')->first()->id), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/SuppliersCest.php b/tests/functional/SuppliersCest.php
        index f2fbabea04..9ad9fc139d 100644
        --- a/tests/functional/SuppliersCest.php
        +++ b/tests/functional/SuppliersCest.php
        @@ -1,8 +1,5 @@
         <?php
         
        -
        -use App\Models\Supplier;
        -
         class SuppliersCest
         {
             public function _before(FunctionalTester $I)
        @@ -18,7 +15,7 @@ class SuppliersCest
             {
                 $I->wantTo('ensure that the create settings/suppliers form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/supplier'));
        +        $I->amOnPage(route('suppliers.create'));
                 $I->dontSee('Create Supplier', '.page-header');
                 $I->see('Create Supplier', 'h1.pull-left');
             }
        @@ -26,7 +23,7 @@ class SuppliersCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/supplier'));
        +        $I->amOnPage(route('suppliers.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The name field is required.', '.alert-msg');
        @@ -35,7 +32,7 @@ class SuppliersCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/supplier'));
        +        $I->amOnPage(route('suppliers.create'));
                 $I->fillField('name', 't2');
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
        @@ -43,7 +40,7 @@ class SuppliersCest
             }
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $supplier = factory(App\Models\Supplier::class, 'supplier')->make();
        +        $supplier = factory(App\Models\Supplier::class)->make();
                 $values = [
                     'name'              => $supplier->name,
                     'address'           => $supplier->address,
        @@ -60,7 +57,7 @@ class SuppliersCest
                     'notes'             => $supplier->notes
                 ];
                 $I->wantTo("Test Validation Succeeds");
        -        $I->amOnPage(route('create/supplier'));
        +        $I->amOnPage(route('suppliers.create'));
                 $I->submitForm('form#create-form', $values);
                 $I->seeRecord('suppliers', $values);
                 $I->seeElement('.alert-success');
        @@ -69,7 +66,8 @@ class SuppliersCest
             public function allowsDelete(FunctionalTester $I)
             {
                 $I->wantTo('Ensure I can delete a supplier');
        -        $I->amOnPage(route('delete/supplier', Supplier::doesntHave('assets')->doesntHave('licenses')->first()->id));
        -        $I->seeElement('.alert-success');
        +        $supplier = factory(App\Models\Supplier::class)->create();
        +        $I->sendDelete(route('suppliers.destroy', $supplier->id), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/UsersCest.php b/tests/functional/UsersCest.php
        index b343184a55..12164d9ed7 100644
        --- a/tests/functional/UsersCest.php
        +++ b/tests/functional/UsersCest.php
        @@ -16,7 +16,7 @@ class UsersCest
             {
                 $I->wantTo('ensure that the create users form loads without errors');
                 $I->lookForwardTo('seeing it load without errors');
        -        $I->amOnPage(route('create/user'));
        +        $I->amOnPage(route('users.create'));
                 $I->dontSee('Create User', '.page-header');
                 $I->see('Create User', 'h1.pull-left');
             }
        @@ -24,7 +24,7 @@ class UsersCest
             public function failsEmptyValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with blank elements");
        -        $I->amOnPage(route('create/user'));
        +        $I->amOnPage(route('users.create'));
                 $I->click('Save');
                 $I->seeElement('.alert-danger');
                 $I->see('The first name field is required.', '.alert-msg');
        @@ -35,7 +35,7 @@ class UsersCest
             public function failsShortValidation(FunctionalTester $I)
             {
                 $I->wantTo("Test Validation Fails with short name");
        -        $I->amOnPage(route('create/user'));
        +        $I->amOnPage(route('users.create'));
                 $I->fillField('first_name', 't2');
                 $I->fillField('last_name', 't2');
                 $I->fillField('username', 'a'); // Must be 2 chars
        @@ -49,7 +49,7 @@ class UsersCest
             }
             public function passesCorrectValidation(FunctionalTester $I)
             {
        -        $user = factory(App\Models\User::class, 'valid-user')->make();
        +        $user = factory(App\Models\User::class)->make();
                 $submitValues = [
                     'first_name'        => $user->first_name,
                     'last_name'         => $user->last_name,
        @@ -61,8 +61,8 @@ class UsersCest
                     'locale'            => $user->locale,
                     'employee_num'      => $user->employee_num,
                     'jobtitle'          => $user->jobtitle,
        -            'manager_id'        => 19,
        -            'location_id'       => 67,
        +            'manager_id'        => $user->manager_id,
        +            'location_id'       => $user->location_id,
                     'phone'             => $user->phone,
                     'activated'         => true,
                     'notes'             => $user->notes
        @@ -76,13 +76,13 @@ class UsersCest
                     'locale'            => $user->locale,
                     'employee_num'      => $user->employee_num,
                     'jobtitle'          => $user->jobtitle,
        -            'manager_id'        => 19,
        -            'location_id'       => 67,
        +            'manager_id'        => $user->manager_id,
        +            'location_id'       => $user->location_id,
                     'phone'             => $user->phone,
                     'activated'         => true,
                     'notes'             => $user->notes
                 ];
        -        $I->amOnPage(route('create/user'));
        +        $I->amOnPage(route('users.create'));
                 $I->wantTo("Test Validation Succeeds");
                 $I->submitForm('form#userForm', $submitValues);
                 $I->seeRecord('users', $storedValues);
        @@ -91,14 +91,9 @@ class UsersCest
         
             public function allowsDelete(FunctionalTester $I)
             {
        +        $user = factory(App\Models\User::class)->create();
                 $I->wantTo('Ensure I can delete a user');
        -        $I->amOnPage(route('delete/user', User::doesntHave('assets')
        -                                        ->doesntHave('accessories')
        -                                        ->doesntHave('consumables')
        -                                        ->doesntHave('licenses')
        -                                        ->where('username', '!=', 'snipeit')
        -                                        ->first()->id
        -        ));
        -        $I->seeElement('.alert-success');
        +        $I->sendDelete(route('users.destroy', $user->id), ['_token' => csrf_token()]);
        +        $I->seeResponseCodeIs(200);
             }
         }
        diff --git a/tests/functional/_bootstrap.php b/tests/functional/_bootstrap.php
        index f7cbed7bb2..8a88555806 100644
        --- a/tests/functional/_bootstrap.php
        +++ b/tests/functional/_bootstrap.php
        @@ -1,6 +1,2 @@
         <?php
         // Here you can initialize variables that will be available to your tests
        -function _beforeSuite(FunctionalTester $I)
        -{
        -	echo "Hello";
        -}
        \ No newline at end of file
        diff --git a/tests/unit.suite.yml b/tests/unit.suite.yml
        index 1f8cb0a998..0ddbee4ede 100644
        --- a/tests/unit.suite.yml
        +++ b/tests/unit.suite.yml
        @@ -5,5 +5,6 @@ class_name: UnitTester
         modules:
             enabled:
                 - \Helper\Unit
        +        - Asserts
                 - Laravel5:
        -            environment_file: .env.tests
        +            environment_file: .env.tests
        \ No newline at end of file
        diff --git a/tests/unit/AccessoryTest.php b/tests/unit/AccessoryTest.php
        index e07da38173..6548ddf427 100644
        --- a/tests/unit/AccessoryTest.php
        +++ b/tests/unit/AccessoryTest.php
        @@ -1,29 +1,106 @@
         <?php
         use App\Models\Accessory;
        +use App\Models\Category;
         use Illuminate\Support\Facades\Hash;
         use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class AccessoryTest extends \Codeception\TestCase\Test
        +class AccessoryTest extends BaseTest
         {
        -  /**
        -   * @var \UnitTester
        -   */
        -  protected $tester;
        -  use DatabaseMigrations;
        +    /**
        +    * @var \UnitTester
        +    */
        +    protected $tester;
         
        -  public function testAccessoryAdd()
        -  {
        -    $accessory = factory(Accessory::class, 'accessory')->make();
        -    $values = [
        -      'name' => $accessory->name,
        -      'category_id' => $accessory->category_id,
        -      'qty' => $accessory->qty,
        -    ];
        +    public function testAccessoryAdd()
        +    {
        +        $accessory = factory(Accessory::class)->make();
         
        -    Accessory::create($values);
        -    $this->tester->seeRecord('accessories', $values);
        -  }
         
        +        $values = [
        +            'name' => $accessory->name,
        +            'category_id' => $accessory->category_id,
        +            'qty' => $accessory->qty,
        +        ];
        +        Accessory::create($values);
        +
        +        $this->tester->seeRecord('accessories', $values);
        +    }
        +
        +    public function testFailsEmptyValidation()
        +    {
        +       // An Accessory requires a name, a qty, and a category_id.
        +        $a = Accessory::create();
        +        $this->assertFalse($a->isValid());
        +        $fields = [
        +            'name' => 'name',
        +            'qty' => 'qty',
        +            'category_id' => 'category id'
        +        ];
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertEquals($errors->get($field)[0], "The ${fieldTitle} field is required.");
        +        }
        +    }
        +
        +    public function testFailsMinValidation()
        +    {
        +        // An Accessory name has a min length of 3
        +        // An Accessory has a min qty of 1
        +        // An Accessory has a min amount of 0
        +        $a = factory(Accessory::class)->make([
        +            'name' => 'a',
        +            'qty' => 0,
        +            'min_amt' => -1
        +        ]);
        +        $fields = [
        +            'name' => 'name',
        +            'qty' => 'qty',
        +            'min_amt' => 'min amt'
        +        ];
        +        $this->assertFalse($a->isValid());
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertContains("The ${fieldTitle} must be at least", $errors->get($field)[0]);
        +        }
        +    }
        +
        +    public function testCategoryIdMustExist()
        +    {
        +        $category = factory(Category::class)->create(['category_type' => 'accessory']);
        +        $accessory = factory(Accessory::class)->make(['category_id' => $category->id]);
        +        $accessory->save();
        +        $this->assertTrue($accessory->isValid());
        +        $newId = $category->id + 1;
        +        $accessory = factory(Accessory::class)->make(['category_id' => $newId]);
        +        $accessory->save();
        +
        +        $this->assertFalse($accessory->isValid());
        +    }
        +
        +    public function testAnAccessoryBelongsToACompany()
        +    {
        +        $accessory = factory(Accessory::class)->create();
        +        $this->assertInstanceOf(App\Models\Company::class, $accessory->company);
        +    }
        +
        +    public function testAnAccessoryHasALocation()
        +    {
        +        $accessory = factory(Accessory::class)->create();
        +        $this->assertInstanceOf(App\Models\Location::class, $accessory->location);
        +    }
        +
        +    public function testAnAccessoryBelongsToACategory()
        +    {
        +        $accessory = factory(Accessory::class)->create();
        +        $this->assertInstanceOf(App\Models\Category::class, $accessory->category);
        +        $this->assertEquals('accessory', $accessory->category->category_type);
        +    }
        +
        +    public function testAnAccessoryHasAManufacturer()
        +    {
        +        $accessory = factory(Accessory::class)->create();
        +        $this->assertInstanceOf(App\Models\Manufacturer::class, $accessory->manufacturer);
        +    }
         }
        diff --git a/tests/unit/AssetMaintenanceTest.php b/tests/unit/AssetMaintenanceTest.php
        new file mode 100644
        index 0000000000..1f9e5b4ef1
        --- /dev/null
        +++ b/tests/unit/AssetMaintenanceTest.php
        @@ -0,0 +1,65 @@
        +<?php
        +
        +
        +use App\Models\AssetMaintenance;
        +
        +class AssetMaintenanceTest extends BaseTest
        +{
        +    /**
        +     * @var \UnitTester
        +     */
        +    protected $tester;
        +
        +    /**
        +     * @test
        +     */
        +    public function it_zeros_out_warranty_if_blank()
        +    {
        +        $c = new AssetMaintenance;
        +        $c->is_warranty = '';
        +        $this->assertTrue($c->is_warranty === 0);
        +        $c->is_warranty = '4';
        +        $this->assertTrue($c->is_warranty==4);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_sets_costs_appropriately()
        +    {
        +        $c = new AssetMaintenance();
        +        $c->cost = '0.00';
        +        $this->assertTrue($c->cost === null);
        +        $c->cost = '9.54';
        +        $this->assertTrue($c->cost===9.54);
        +        $c->cost = '9.50';
        +        $this->assertTrue($c->cost===9.5);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_nulls_out_notes_if_blank()
        +    {
        +        $c = new AssetMaintenance;
        +        $c->notes = '';
        +        $this->assertTrue($c->notes === null);
        +        $c->notes = 'This is a long note';
        +        $this->assertTrue($c->notes==='This is a long note');
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_nulls_out_completion_date_if_blank_or_invalid()
        +    {
        +        $c = new AssetMaintenance;
        +        $c->completion_date = '';
        +        $this->assertTrue($c->completion_date === null);
        +        $c->completion_date = '0000-00-00';
        +        $this->assertTrue($c->completion_date===null);
        +        $c->completion_date = '2017-05-12';
        +        $this->assertTrue($c->completion_date==='2017-05-12');
        +
        +    }
        +}
        \ No newline at end of file
        diff --git a/tests/unit/AssetModelTest.php b/tests/unit/AssetModelTest.php
        index 4d2f2d0a82..281ea95f32 100644
        --- a/tests/unit/AssetModelTest.php
        +++ b/tests/unit/AssetModelTest.php
        @@ -1,30 +1,81 @@
         <?php
        +use App\Models\Asset;
         use App\Models\AssetModel;
        -use Illuminate\Support\Facades\Hash;
        -use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
        +use Illuminate\Foundation\Testing\WithoutMiddleware;
        +use Illuminate\Support\Facades\Hash;
         
        -class AssetModelTest extends \Codeception\TestCase\Test
        +class AssetModelTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testAssetModelAdd()
             {
        -      $assetmodel = factory(AssetModel::class, 'assetmodel')->make();
        -      $values = [
        +        $assetmodel = factory(AssetModel::class)->make();
        +        $values = [
                 'name' => $assetmodel->name,
                 'manufacturer_id' => $assetmodel->manufacturer_id,
                 'category_id' => $assetmodel->category_id,
                 'eol' => $assetmodel->eol,
        -      ];
        +        ];
         
        -      AssetModel::create($values);
        -      $this->tester->seeRecord('models', $values);
        +        AssetModel::create($values);
        +        $this->tester->seeRecord('models', $values);
             }
         
        +    public function testAnAssetModelRequiresAttributes()
        +    {
        +        // An Asset Model requires a name, a category_id, and a manufacturer_id.
        +        $a = AssetModel::create();
        +        $this->assertFalse($a->isValid());
        +        $fields = [
        +            'name' => 'name',
        +            'manufacturer_id' => 'manufacturer id',
        +            'category_id' => 'category id'
        +        ];
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertEquals($errors->get($field)[0], "The ${fieldTitle} field is required.");
        +        }
        +    }
        +
        +    public function testAnAssetModelZerosOutBlankEols()
        +    {
        +        $am = new AssetModel;
        +        $am->eol = '';
        +        $this->assertTrue($am->eol === 0);
        +        $am->eol = '4';
        +        $this->assertTrue($am->eol==4);
        +    }
        +
        +    public function testAnAssetModelContainsAssets()
        +    {
        +        $assetmodel = factory(AssetModel::class)->create();
        +        $asset = factory(Asset::class)->create([
        +            'model_id' => $assetmodel->id,
        +        ]);
        +        $this->assertEquals(1,$assetmodel->assets()->count());
        +    }
        +
        +    public function testAnAssetModelHasACategory()
        +    {
        +        $assetmodel = factory(AssetModel::class)->create();
        +        $this->assertInstanceOf(App\Models\Category::class, $assetmodel->category);
        +    }
        +
        +    public function anAssetModelHasADepreciation()
        +    {
        +        $assetmodel = factory(AssetModel::class)->create();
        +        $this->assertInstanceOf(App\Models\Depreciation::class, $assetmodel->depreciation);
        +    }
        +
        +    public function testAnAssetModelHasAManufacturer()
        +    {
        +        $assetmodel = factory(AssetModel::class)->create();
        +        $this->assertInstanceOf(App\Models\Manufacturer::class, $assetmodel->manufacturer);
        +    }
         }
        diff --git a/tests/unit/AssetTest.php b/tests/unit/AssetTest.php
        index 9b5a0f0ea0..f7673e1c79 100644
        --- a/tests/unit/AssetTest.php
        +++ b/tests/unit/AssetTest.php
        @@ -1,30 +1,311 @@
         <?php
        +use App\Exceptions\CheckoutNotAllowed;
         use App\Models\Asset;
        -use Illuminate\Support\Facades\Hash;
        -use Illuminate\Foundation\Testing\WithoutMiddleware;
        -use Illuminate\Foundation\Testing\DatabaseMigrations;
        +use App\Models\AssetModel;
        +use App\Models\Company;
        +use App\Models\Location;
        +use App\Models\User;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
        +use Illuminate\Foundation\Testing\WithoutMiddleware;
        +use Illuminate\Support\Facades\Hash;
         
        -class AssetTest extends \Codeception\TestCase\Test
        +class AssetTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testAssetAdd()
             {
        -      $asset = factory(Asset::class, 'asset')->make();
        -      $values = [
        -        'name' => $asset->name,
        -        'model_id' => $asset->model_id,
        -        'status_id' => $asset->status_id,
        -        'asset_tag' => $asset->asset_tag,
        -      ];
        +        $asset = factory(Asset::class)->make();
        +        $values = [
        +            'name' => $asset->name,
        +            'model_id' => $asset->model_id,
        +            'status_id' => $asset->status_id,
        +            'asset_tag' => $asset->asset_tag,
        +        ];
         
        -      Asset::create($values);
        -      $this->tester->seeRecord('assets', $values);
        +        Asset::create($values);
        +        $this->tester->seeRecord('assets', $values);
             }
         
        +    public function testFailsEmptyValidation()
        +    {
        +       // An Asset requires a name, a qty, and a category_id.
        +        $a = Asset::create();
        +        $this->assertFalse($a->isValid());
        +
        +        $fields = [
        +            'model_id' => 'model id',
        +            'status_id' => 'status id',
        +            'asset_tag' => 'asset tag'
        +        ];
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertEquals($errors->get($field)[0], "The ${fieldTitle} field is required.");
        +        }
        +    }
        +
        +
        +    public function testAutoIncrementMixed()
        +    {
        +        $expected = '123411';
        +        $next = Asset::nextAutoIncrement(
        +            collect([
        +                ['asset_tag' => '0012345'],
        +                ['asset_tag' => 'WTF00134'],
        +                ['asset_tag' => 'WTF-745'],
        +                ['asset_tag' => '0012346'],
        +                ['asset_tag' => '00123410'],
        +                ['asset_tag' => 'U8T7597h77']
        +            ])
        +        );
        +
        +        \Log::debug(print_r($next));
        +        $this->assertEquals($expected, $next);
        +    }
        +
        +//    public function testAutoIncrementMixedFullTagNumber()
        +//    {
        +//        $expected = '123411';
        +//        $next = Asset::nextAutoIncrement(
        +//            [
        +//                 ['asset_tag' => '0012345'],
        +//                 ['asset_tag' => 'WTF00134'],
        +//                 ['asset_tag' => 'WTF-745'],
        +//                 ['asset_tag' => '0012346'],
        +//                 ['asset_tag' => '00123410'],
        +//                 ['asset_tag' => 'U8T7597h77']
        +//            ]
        +//        );
        +//        $this->assertEquals($expected, $next);
        +//    }
        +//
        +
        +
        +    /**
        +     * @test
        +     */
        +    public function testWarrantyExpiresAttribute()
        +    {
        +        $asset = factory(\App\Models\Asset::class)->create();
        +
        +        $asset->purchase_date = \Carbon\Carbon::createFromDate(2017, 1, 1)->hour(0)->minute(0)->second(0);
        +        $asset->warranty_months = 24;
        +        $asset->save();
        +
        +        $saved_asset = \App\Models\Asset::find($asset->id);
        +
        +        $this->tester->assertInstanceOf(\DateTime::class, $saved_asset->purchase_date);
        +        $this->tester->assertEquals(
        +            \Carbon\Carbon::createFromDate(2017, 1, 1)->format('Y-m-d'),
        +            $saved_asset->purchase_date->format('Y-m-d')
        +        );
        +        $this->tester->assertEquals(
        +            \Carbon\Carbon::createFromDate(2017, 1, 1)->setTime(0, 0, 0),
        +            $saved_asset->purchase_date
        +        );
        +        $this->tester->assertEquals(24, $saved_asset->warranty_months);
        +        $this->tester->assertInstanceOf(\DateTime::class, $saved_asset->warranty_expires);
        +        $this->tester->assertEquals(
        +            \Carbon\Carbon::createFromDate(2019, 1, 1)->format('Y-m-d'),
        +            $saved_asset->warranty_expires->format('Y-m-d')
        +        );
        +        $this->tester->assertEquals(
        +            \Carbon\Carbon::createFromDate(2019, 1, 1)->setTime(0, 0, 0),
        +            $saved_asset->warranty_expires
        +        );
        +    }
        +
        +    public function testModelIdMustExist()
        +    {
        +        $model = factory(AssetModel::class)->create();
        +        $asset = factory(Asset::class)->make(['model_id' => $model->id]);
        +        $asset->save();
        +        $this->assertTrue($asset->isValid());
        +        $newId = $model->id + 1;
        +        $asset = factory(Asset::class)->make(['model_id' => $newId]);
        +        $asset->save();
        +
        +        $this->assertFalse($asset->isValid());
        +    }
        +
        +    public function testAnAssetHasRelationships()
        +    {
        +        $asset = factory(Asset::class)->create();
        +        $this->assertInstanceOf(AssetModel::class, $asset->model);
        +        $this->assertInstanceOf(Company::class, $asset->company);
        +        $this->assertInstanceOf(App\Models\Depreciation::class, $asset->depreciation);
        +        $this->assertInstanceOf(App\Models\Statuslabel::class, $asset->assetstatus);
        +        $this->assertInstanceOf(App\Models\Supplier::class, $asset->supplier);
        +    }
        +
        +    public function testAnAssetCanBeAvailableForCheckout()
        +    {
        +        // Logic: If the asset is not assigned to anyone,
        +        // and the statuslabel type is "deployable"
        +        // and the asset is not deleted
        +        // Then it is available for checkout
        +
        +        // An asset assigned to someone should not be available for checkout.
        +        $user = factory(App\Models\User::class)->create();
        +        $assetAssigned = factory(Asset::class)->create(['assigned_to' => $user->id]);
        +        $this->assertFalse($assetAssigned->availableForCheckout());
        +
        +        // An asset with a non deployable statuslabel should not be available for checkout.
        +        $status = factory(App\Models\Statuslabel::class)->states('archived')->create();
        +        $assetUndeployable = factory(Asset::class)->create(['status_id' => $status->id]);
        +        $this->assertFalse($assetUndeployable->availableForCheckout());
        +
        +        // An asset that has been deleted is not avaiable for checkout.
        +        $assetDeleted = factory(Asset::class)->states('deleted')->create();
        +        $this->assertFalse($assetDeleted->availableForCheckout());
        +
        +        // A ready to deploy asset that isn't assigned to anyone is available for checkout
        +        $status = factory(App\Models\Statuslabel::class)->states('rtd')->create();
        +        $asset = factory(Asset::class)->create(['status_id' => $status->id]);
        +        $this->assertTrue($asset->availableForCheckout());
        +    }
        +
        +    public function testAnAssetCanHaveComponents()
        +    {
        +        $asset = factory(Asset::class)->create();
        +        $components = factory(App\Models\Component::class, 5)->create();
        +        $components->each(function($component) use ($asset) {
        +            $component->assets()->attach($component, [
        +                'asset_id'=>$asset->id
        +            ]);
        +        });
        +        $this->assertInstanceOf(App\Models\Component::class, $asset->components()->first());
        +        $this->assertCount(5, $asset->components);
        +    }
        +
        +    public function testAnAssetCanHaveUploads()
        +    {
        +        $asset = factory(Asset::class)->create();
        +        $this->assertCount(0, $asset->uploads);
        +        factory(App\Models\Actionlog::class, 'asset-upload')->create(['item_id' => $asset->id]);
        +        $this->assertCount(1, $asset->fresh()->uploads);
        +    }
        +
        +    // Helper Method for checking in assets.... We should extract this to the model or a trait.
        +
        +    private function checkin($asset, $target) {
        +        $asset->expected_checkin = null;
        +        $asset->last_checkout = null;
        +        $asset->assigned_to = null;
        +        $asset->assigned_type = null;
        +        $asset->assignedTo()->disassociate($asset);
        +        $asset->accepted = null;
        +        $asset->save();
        +        $asset->logCheckin($target, 'Test Checkin');
        +    }
        +
        +    public function testAnAssetCanBeCheckedOut()
        +    {
        +        // This tests Asset::checkOut(), Asset::assignedTo(), Asset::assignedAssets(), Asset::assetLoc(), Asset::assignedType(), defaultLoc()
        +        $asset = factory(Asset::class)->create();
        +        $adminUser = $this->signIn();
        +
        +        $target = factory(App\Models\User::class)->create();
        +        // An Asset Can be checked out to a user, and this should be logged.
        +        $asset->checkOut($target, $adminUser);
        +        $asset->save();
        +
        +        $this->assertInstanceOf(App\Models\User::class, $asset->assignedTo);
        +        $this->assertEquals($asset->assetLoc->id, $target->userLoc->id);
        +        $this->assertEquals('user', $asset->assignedType());
        +        $this->assertEquals($asset->defaultLoc->id, $asset->rtd_location_id);
        +        $this->tester->seeRecord('action_logs', [
        +            'action_type' => 'checkout',
        +            'target_type'   => get_class($target),
        +            'target_id'     => $target->id
        +        ]);
        +
        +        $this->tester->seeRecord('assets', [
        +            'id' => $asset->id,
        +            'assigned_to' => $target->id,
        +            'assigned_type' => User::class
        +        ]);
        +
        +        $this->checkin($asset, $target);
        +        $this->assertNull($asset->fresh()->assignedTo);
        +
        +        $this->tester->seeRecord('action_logs', [
        +            'action_type' => 'checkin from',
        +            'target_type'   => get_class($target),
        +            'target_id'     => $target->id
        +        ]);
        +
        +        $this->tester->seeRecord('assets', [
        +            'id' => $asset->id,
        +            'assigned_to' => null,
        +            'assigned_type' => null
        +        ]);
        +
        +        // An Asset Can be checked out to a asset, and this should be logged.
        +        $target = factory(App\Models\Asset::class)->create();
        +        $asset->checkOut($target, $adminUser);
        +        $asset->save();
        +        $this->assertInstanceOf(App\Models\Asset::class, $asset->fresh()->assignedTo);
        +        $this->assertEquals($asset->fresh()->assetLoc->id, $target->fresh()->assetLoc->id);
        +        $this->assertEquals('asset', $asset->assignedType());
        +        $this->assertEquals($asset->defaultLoc->id, $asset->rtd_location_id);
        +        $this->tester->seeRecord('action_logs', [
        +            'action_type' => 'checkout',
        +            'target_type'   => get_class($target),
        +            'target_id'     => $target->id
        +        ]);
        +
        +        $this->assertCount(1, $target->assignedAssets);
        +        $this->checkin($asset, $target);
        +        $this->assertNull($asset->fresh()->assignedTo);
        +
        +        $this->tester->seeRecord('action_logs', [
        +            'action_type' => 'checkin from',
        +            'target_type'   => get_class($target),
        +            'target_id'     => $target->id
        +        ]);
        +
        +        // An Asset Can be checked out to a location, and this should be logged.
        +        $target = factory(App\Models\Location::class)->create();
        +        $asset->checkOut($target, $adminUser);
        +        $asset->save();
        +        $this->assertInstanceOf(App\Models\Location::class, $asset->fresh()->assignedTo);
        +        $this->assertEquals($asset->fresh()->assetLoc->id, $target->fresh()->id);
        +        $this->assertEquals('location', $asset->assignedType());
        +        $this->assertEquals($asset->defaultLoc->id, $asset->rtd_location_id);
        +        $this->tester->seeRecord('action_logs', [
        +            'action_type' => 'checkout',
        +            'target_type'   => get_class($target),
        +            'target_id'     => $target->id
        +        ]);
        +        $this->checkin($asset, $target);
        +        $this->assertNull($asset->fresh()->assignedTo);
        +
        +        $this->tester->seeRecord('action_logs', [
        +            'action_type' => 'checkin from',
        +            'target_type'   => get_class($target),
        +            'target_id'     => $target->id
        +        ]);
        +    }
        +
        +    public function testAnAssetHasMaintenances()
        +    {
        +        $asset = factory(Asset::class)->create();
        +        factory(App\Models\AssetMaintenance::class)->create(['asset_id' => $asset->id]);
        +        $this->assertCount(1, $asset->assetmaintenances);
        +    }
        +
        +    public function testAnAssetThatRequiresAcceptanceCanNotBeCheckedOutToANonUser()
        +    {
        +        $this->expectException(CheckoutNotAllowed::class);
        +        $this->signIn();
        +
        +        $asset = factory(Asset::class)->states('requires-acceptance')->create();
        +
        +        $location = factory(Location::class)->create();
        +        $asset->checkOut($location);
        +    }
         }
        diff --git a/tests/unit/BaseTest.php b/tests/unit/BaseTest.php
        new file mode 100644
        index 0000000000..d862e4117b
        --- /dev/null
        +++ b/tests/unit/BaseTest.php
        @@ -0,0 +1,25 @@
        +<?php
        +use App\Models\User;
        +use Illuminate\Foundation\Testing\DatabaseMigrations;
        +use Illuminate\Foundation\Testing\DatabaseTransactions;
        +use Illuminate\Foundation\Testing\WithoutMiddleware;
        +
        +class BaseTest extends \Codeception\TestCase\Test
        +{
        +    use DatabaseTransactions;
        +    protected function _before()
        +    {
        +        Artisan::call('migrate');
        +        factory(App\Models\Setting::class)->create();
        +    }
        +
        +    protected function signIn($user = null)
        +    {
        +        if (!$user) {
        +            $user = factory(User::class)->states('superuser')->create();
        +        }
        +        Auth::login($user);
        +
        +        return $user;
        +    }
        +}
        diff --git a/tests/unit/CategoryTest.php b/tests/unit/CategoryTest.php
        index 655f47f307..c882b23eaf 100644
        --- a/tests/unit/CategoryTest.php
        +++ b/tests/unit/CategoryTest.php
        @@ -5,36 +5,91 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class CategoryTest extends \Codeception\TestCase\Test
        +class CategoryTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testAssetCategoryAdd()
             {
        -      $category = factory(Category::class, 'asset-category')->make();
        -      $values = [
        -        'name' => $category->name,
        -        'category_type' => $category->category_type,
        -      ];
        +        $category = factory(Category::class)->make(['category_type' => 'asset']);
        +        $values = [
        +            'name' => $category->name,
        +            'category_type' => $category->category_type,
        +            'require_acceptance' => true,
        +            'use_default_eula' => false
        +        ];
         
        -      Category::create($values);
        -      $this->tester->seeRecord('categories', $values);
        +        Category::create($values);
        +        $this->tester->seeRecord('categories', $values);
             }
         
             public function testAccessoryCategoryAdd()
             {
        -      $category = factory(Category::class, 'accessory-category')->make();
        -      $values = [
        -        'name' => $category->name,
        -        'category_type' => $category->category_type,
        -      ];
        +        $category = factory(Category::class)->make(['category_type' => 'accessory']);
        +        $values = [
        +            'name' => $category->name,
        +            'category_type' => $category->category_type,
        +            'require_acceptance' => true,
        +            'use_default_eula' => false
        +        ];
         
        -      Category::create($values);
        -      $this->tester->seeRecord('categories', $values);
        +        Category::create($values);
        +        $this->tester->seeRecord('categories', $values);
             }
         
        +    public function testFailsEmptyValidation()
        +    {
        +       // An Asset requires a name, a qty, and a category_id.
        +        $a = Category::create();
        +        $this->assertFalse($a->isValid());
        +
        +        $fields = [
        +            'name' => 'name',
        +            'category_type' => 'category type'
        +        ];
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertEquals($errors->get($field)[0], "The ${fieldTitle} field is required.");
        +        }
        +    }
        +
        +    public function testACategoryCanHaveAssets()
        +    {
        +        $category = factory(Category::class)->create(['category_type' => 'asset']);
        +        $models = factory(App\Models\AssetModel::class, 5)->create(['category_id' => $category->id]);
        +        $this->assertEquals(5, $category->has_models());
        +        $this->assertCount(5, $category->models);
        +
        +        $models->each(function($model) {
        +            factory(App\Models\Asset::class, 2)->create(['model_id' => $model->id]);
        +        });
        +        $this->assertEquals(10, $category->itemCount());
        +    }
        +
        +    public function testACategoryCanHaveAccessories()
        +    {
        +        $category = factory(Category::class)->create(['category_type' => 'accessory']);
        +        factory(App\Models\Accessory::class, 5)->create(['category_id' => $category->id]);
        +        $this->assertCount(5, $category->accessories);
        +        $this->assertEquals(5, $category->itemCount());
        +    }
        +
        +    public function testACategoryCanHaveConsumables()
        +    {
        +        $category = factory(Category::class)->create(['category_type' => 'consumable']);
        +        factory(App\Models\Consumable::class, 5)->create(['category_id' => $category->id]);
        +        $this->assertCount(5, $category->consumables);
        +        $this->assertEquals(5, $category->itemCount());
        +    }
        +
        +    public function testACategoryCanHaveComponents()
        +    {
        +        $category = factory(Category::class)->create(['category_type' => 'component']);
        +        factory(App\Models\Component::class, 5)->create(['category_id' => $category->id]);
        +        $this->assertCount(5, $category->components);
        +        $this->assertEquals(5, $category->itemCount());
        +    }
         }
        diff --git a/tests/unit/CompanyTest.php b/tests/unit/CompanyTest.php
        index fb01928065..5808289f19 100644
        --- a/tests/unit/CompanyTest.php
        +++ b/tests/unit/CompanyTest.php
        @@ -5,23 +5,78 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class CompanyTest extends \Codeception\TestCase\Test
        +class CompanyTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
        -    public function testAssetAdd()
        +    public function testCompanyAdd()
             {
        -      $company = factory(Company::class, 'company')->make();
        -      $values = [
        +        $company = factory(Company::class)->make();
        +        $values = [
                 'name' => $company->name,
        -      ];
        +        ];
         
        -      Company::create($values);
        -      $this->tester->seeRecord('companies', $values);
        +        Company::create($values);
        +        $this->tester->seeRecord('companies', $values);
             }
         
        +    public function testFailsEmptyValidation()
        +    {
        +       // An Company requires a name, a qty, and a category_id.
        +        $a = Company::create();
        +        $this->assertFalse($a->isValid());
        +
        +        $fields = [
        +            'name' => 'name',
        +        ];
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertEquals($errors->get($field)[0], "The ${fieldTitle} field is required.");
        +        }
        +    }
        +
        +    public function testACompanyCanHaveUsers()
        +    {
        +        $company = factory(Company::class)->create();
        +        factory(App\Models\User::class, 1)->create(['company_id'=>$company->id]);
        +        $this->assertCount(1, $company->users);
        +    }
        +
        +    public function testACompanyCanHaveAssets()
        +    {
        +        $company = factory(Company::class)->create();
        +        factory(App\Models\Asset::class, 1)->create(['company_id'=>$company->id]);
        +        $this->assertCount(1, $company->assets);
        +    }
        +
        +    public function testACompanyCanHaveLicenses()
        +    {
        +        $company = factory(Company::class)->create();
        +        factory(App\Models\License::class, 1)->create(['company_id'=>$company->id]);
        +        $this->assertCount(1, $company->licenses);
        +    }
        +
        +    public function testACompanyCanHaveAccessories()
        +    {
        +        $company = factory(Company::class)->create();
        +        factory(App\Models\Accessory::class, 1)->create(['company_id'=>$company->id]);
        +        $this->assertCount(1, $company->accessories);
        +    }
        +
        +    public function testACompanyCanHaveConsumables()
        +    {
        +        $company = factory(Company::class)->create();
        +        factory(App\Models\Consumable::class, 1)->create(['company_id'=>$company->id]);
        +        $this->assertCount(1, $company->consumables);
        +    }
        +
        +    public function testACompanyCanHaveComponents()
        +    {
        +        $company = factory(Company::class)->create();
        +        factory(App\Models\Component::class, 1)->create(['company_id'=>$company->id]);
        +        $this->assertCount(1, $company->components);
        +    }
         }
        diff --git a/tests/unit/ConsumableTest.php b/tests/unit/ConsumableTest.php
        index 8e5fb31c67..45abaece7e 100644
        --- a/tests/unit/ConsumableTest.php
        +++ b/tests/unit/ConsumableTest.php
        @@ -5,17 +5,16 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class ConsumableTest extends \Codeception\TestCase\Test
        +class ConsumableTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testConsumableAdd()
             {
        -      $consumable = factory(Consumable::class, 'consumable')->make();
        +      $consumable = factory(Consumable::class)->make();
               $values = [
                 'name' => $consumable->name,
                 'qty' => $consumable->qty,
        @@ -27,4 +26,31 @@ class ConsumableTest extends \Codeception\TestCase\Test
               $this->tester->seeRecord('consumables', $values);
             }
         
        +    public function testFailsEmptyValidation()
        +    {
        +       // An Consumable requires a name, a qty, and a category_id.
        +        $a = Consumable::create();
        +        $this->assertFalse($a->isValid());
        +
        +        $fields = [
        +            'name' => 'name',
        +            'qty' => 'qty',
        +            'category_id' => 'category id'
        +        ];
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertEquals($errors->get($field)[0], "The ${fieldTitle} field is required.");
        +        }
        +    }
        +
        +    public function testAConsumableHasRelationships()
        +    {
        +        $consumable = factory(Consumable::class)->create();
        +        $this->assertInstanceOf(App\Models\User::class, $consumable->admin);
        +        $this->assertInstanceOf(App\Models\Company::class, $consumable->company);
        +        $this->assertInstanceOf(App\Models\Manufacturer::class, $consumable->manufacturer);
        +        $this->assertInstanceOf(App\Models\Location::class, $consumable->location);
        +        $this->assertInstanceOf(App\Models\Category::class, $consumable->category);
        +    }
        +
         }
        diff --git a/tests/unit/CustomFieldTest.php b/tests/unit/CustomFieldTest.php
        index cef8c55534..4626784c2f 100644
        --- a/tests/unit/CustomFieldTest.php
        +++ b/tests/unit/CustomFieldTest.php
        @@ -5,52 +5,123 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class CustomFieldTest extends \Codeception\TestCase\Test
        +/*
        + * Test strings for db column names  gathered from
        + * http://www.omniglot.com/language/phrases/hovercraft.htm
        + */
        +class CustomFieldTest extends BaseTest
         {
        -  protected $tester;
        -  use DatabaseMigrations;
        +    protected $tester;
         
        -  public function testConstructor() {
        -    $customfield = new CustomField();
        -  }
        +    public function testConstructor()
        +    {
        +        $customfield = new CustomField();
        +    }
         
        -  public function testFormat() {
        -    $customfield = factory(CustomField::class, 'customfield-ip')->make();
        -    $values = [
        -      'name' => $customfield->name,
        -      'format' => $customfield->format,
        -      'element' => $customfield->element,
        -    ];
        +    public function testFormat()
        +    {
        +        $customfield = factory(CustomField::class)->make();
        +        $values = [
        +            'name' => $customfield->name,
        +            'format' => $customfield->format,
        +            'element' => $customfield->element,
        +        ];
         
        -    $this->assertEquals($customfield->getAttributes()['format'],CustomField::$PredefinedFormats['IP']); //this seems undocumented...
        -    $this->assertEquals($customfield->format,"IP");
        -  }
        +        $this->assertEquals($customfield->getAttributes()['format'], CustomField::$PredefinedFormats['IP']); //this seems undocumented...
        +        $this->assertEquals($customfield->format, "IP");
        +    }
         
        -  public function testDbName() {
        -    $customfield=new CustomField();
        -    $customfield->name="An Example Name";
        -    $this->assertEquals($customfield->db_column_name(),"_snipeit_an_example_name");
        -  }
        +    public function testDbNameAscii()
        +    {
        +        $customfield = new CustomField();
        +        $customfield->name = "My hovercraft is full of eels";
        +        $customfield->id = 1337;
        +        $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_my_hovercraft_is_full_of_eels_1337");
        +    }
         
        -  // public function testValidation() {
        -  //   // $f=new CustomField();
        -  //   // $f->name='Id';
        -  //   // $f->format='IP';
        -  //   // $f->element="text";
        -  //   // /*$this->assertDoesntThrow(function () {
        -  //   //   $f->save();
        -  //   // });*/
        -  //   // $this->assertNull(CustomField::saving($f)); //horrible hacky workaround to even problems
        -  //   //                                     //for Laravel testing. Blech.
        -  //
        -  //   $g=new CustomField();
        -  //   $g->name='totally_unique_name';
        -  //   $g->format='IP';
        -  //   $g->element="text";
        -  //   //$this->assertTrue($g->validate($g->toArray()));
        -  //   $this->assertTrue(CustomField::saving($g));
        -  //   /*$this->assertThrows(function () {
        -  //     $f->save();
        -  //   });*/
        -  // }
        +    // Western Europe
        +    public function testDbNameLatin()
        +    {
        +        $customfield=new CustomField();
        +        $customfield->name="My hovercraft is full of eels";
        +        $customfield->id = 1337;
        +        $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_my_hovercraft_is_full_of_eels_1337");
        +    }
        +
        +
        +    // Asian
        +    public function testDbNameChinese()
        +    {
        +        $customfield=new CustomField();
        +        $customfield->name="我的氣墊船裝滿了鱔魚";
        +        $customfield->id = 1337;
        +        if (function_exists('transliterator_transliterate')) {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_wo_de_qi_dian_chuan_zhuang_man_le_shan_yu_1337");
        +        } else {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_aecsae0ase1eaeaeoees_1337");
        +        }
        +    }
        +
        +    public function testDbNameJapanese()
        +    {
        +        $customfield=new CustomField();
        +        $customfield->name="私のホバークラフトは鰻でいっぱいです";
        +        $customfield->id = 1337;
        +        if (function_exists('transliterator_transliterate')) {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_sinohohakurafutoha_manteihhaitesu_1337");
        +        } else {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_caafafafaafcafafae0aaaaaaa_1337");
        +        }
        +    }
        +
        +    public function testDbNameKorean()
        +    {
        +        $customfield = new CustomField();
        +        $customfield->name = "내 호버크라프트는 장어로 가득 차 있어요";
        +        $customfield->id = 1337;
        +        if (function_exists('transliterator_transliterate')) {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_nae_hobeokeulapeuteuneun_jang_eolo_gadeug_1337");
        +        } else {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_e_ie2ieiises_izieoe_e0e_i0_iziis_1337");
        +        }
        +
        +    }
        +
        +    // Nordic languages
        +    public function testDbNameNonLatinEuro()
        +    {
        +        $customfield = new CustomField();
        +        $customfield->name = "Mój poduszkowiec jest pełen węgorzy";
        +        $customfield->id = 1337;
        +        if (function_exists('transliterator_transliterate')) {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_moj_poduszkowiec_jest_pelen_wegorzy_1337");
        +        } else {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_ma3j_poduszkowiec_jest_peaen_waegorzy_1337");
        +        }
        +    }
        +
        +    //
        +    public function testDbNameTurkish()
        +    {
        +        $customfield = new CustomField();
        +        $customfield->name = "Hoverkraftım yılan balığı dolu";
        +        $customfield->id = 1337;
        +        if (function_exists('transliterator_transliterate')) {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_hoverkraftim_yilan_baligi_dolu_1337");
        +        } else {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_hoverkraftaem_yaelan_balaeaeyae_dolu_1337");
        +        }
        +    }
        +
        +    public function testDbNameArabic()
        +    {
        +        $customfield=new CustomField();
        +        $customfield->name="حَوّامتي مُمْتِلئة بِأَنْقَلَيْسون";
        +        $customfield->id = 1337;
        +        if (function_exists('transliterator_transliterate')) {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_hwamty_mmtlyt_banqlyswn_1337");
        +        } else {
        +            $this->assertEquals($customfield->convertUnicodeDbSlug(), "_snipeit_ouzuuouoaus_uuuuoauuooc_ououzuuuuzuuzusuo_1337");
        +        }
        +    }
         }
        diff --git a/tests/unit/DepartmentTest.php b/tests/unit/DepartmentTest.php
        new file mode 100644
        index 0000000000..c3e2603e11
        --- /dev/null
        +++ b/tests/unit/DepartmentTest.php
        @@ -0,0 +1,29 @@
        +<?php
        +use App\Models\Department;
        +use App\Models\Location;
        +use Illuminate\Foundation\Testing\DatabaseMigrations;
        +use Illuminate\Foundation\Testing\DatabaseTransactions;
        +use Illuminate\Foundation\Testing\WithoutMiddleware;
        +use Illuminate\Support\Facades\Hash;
        +
        +class DepartmentTest extends BaseTest
        +{
        +    /**
        +     * @var \UnitTester
        +     */
        +    protected $tester;
        +
        +    public function testDepartmentAdd()
        +    {
        +        $department = factory(Department::class)->make();
        +        $values = [
        +            'name' => $department->name,
        +            'user_id' => $department->user_id,
        +            'manager_id' => $department->manager_id,
        +        ];
        +
        +        Department::create($values);
        +        $this->tester->seeRecord('departments', $values);
        +    }
        +
        +}
        diff --git a/tests/unit/DepreciationTest.php b/tests/unit/DepreciationTest.php
        index 862e65e1c6..0f80e8637d 100644
        --- a/tests/unit/DepreciationTest.php
        +++ b/tests/unit/DepreciationTest.php
        @@ -4,17 +4,16 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class DepreciationTest extends \Codeception\TestCase\Test
        +class DepreciationTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testDepreciationAdd()
             {
        -      $depreciations = factory(Depreciation::class, 'depreciation')->make();
        +      $depreciations = factory(Depreciation::class)->make();
               $values = [
                 'name' => $depreciations->name,
                 'months' => $depreciations->months,
        @@ -24,4 +23,33 @@ class DepreciationTest extends \Codeception\TestCase\Test
               $this->tester->seeRecord('depreciations', $values);
             }
         
        +    public function testFailsEmptyValidation()
        +    {
        +       // An Asset requires a name, a qty, and a category_id.
        +        $a = Depreciation::create();
        +        $this->assertFalse($a->isValid());
        +
        +        $fields = [
        +            'name' => 'name',
        +            'months' => 'months',
        +        ];
        +        $errors = $a->getErrors();
        +        foreach ($fields as $field => $fieldTitle) {
        +            $this->assertEquals($errors->get($field)[0], "The ${fieldTitle} field is required.");
        +        }
        +    }
        +
        +    public function testADepreciationHasModels()
        +    {
        +        $depreciation = factory(Depreciation::class)->create();
        +        factory(App\Models\AssetModel::class, 5)->create(['depreciation_id'=>$depreciation->id]);
        +        $this->assertEquals(5,$depreciation->has_models());
        +    }
        +
        +    public function testADepreciationHasLicenses()
        +    {
        +        $depreciation = factory(Depreciation::class)->create();
        +        factory(App\Models\License::class, 5)->create(['depreciation_id'=>$depreciation->id]);
        +        $this->assertEquals(5,$depreciation->has_licenses());
        +    }
         }
        diff --git a/tests/unit/ImporterTest.php b/tests/unit/ImporterTest.php
        new file mode 100644
        index 0000000000..aa39c105b7
        --- /dev/null
        +++ b/tests/unit/ImporterTest.php
        @@ -0,0 +1,579 @@
        +<?php
        +use App\Importer\AccessoryImporter;
        +use App\Importer\AssetImporter;
        +use App\Importer\ConsumableImporter;
        +use App\Importer\LicenseImporter;
        +use App\Models\Accessory;
        +use App\Models\Asset;
        +use App\Models\AssetModel;
        +use App\Models\Category;
        +use App\Models\CustomField;
        +use App\Models\User;
        +use Illuminate\Foundation\Testing\DatabaseMigrations;
        +use Illuminate\Foundation\Testing\DatabaseTransactions;
        +use Illuminate\Foundation\Testing\WithoutMiddleware;
        +use Illuminate\Support\Facades\Hash;
        +
        +class ImporterTest extends BaseTest
        +{
        +    /**
        +    * @var \UnitTester
        +    */
        +    protected $tester;
        +
        +    public function testDefaultImportAssetWithCustomFields()
        +    {
        +        $csv = <<<'EOT'
        +Name,Email,Username,item Name,Category,Model name,Manufacturer,Model Number,Serial number,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier,Weight
        +Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan,35
        +EOT;
        +
        +        $this->initializeCustomFields();
        +        $this->import(new AssetImporter($csv));
        +
        +        $this->tester->seeRecord('users', [
        +            'first_name' => 'Bonnie',
        +            'last_name' => 'Nelson',
        +            'email' => 'bnelson0@cdbaby.com',
        +        ]);
        +        $this->tester->seeRecord('categories', [
        +            'name' => 'quam'
        +        ]);
        +
        +        $this->tester->seeRecord('models', [
        +            'name' => 'massa id',
        +            'model_number' => 6377018600094472
        +        ]);
        +
        +        $this->tester->seeRecord('manufacturers', [
        +            'name' => 'Linkbridge'
        +        ]);
        +
        +        $this->tester->seeRecord('locations', [
        +            'name' => 'Daping'
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Alpha'
        +        ]);
        +
        +        $this->tester->seeRecord('status_labels', [
        +            'name' => 'Undeployable'
        +        ]);
        +
        +        $this->tester->seeRecord('suppliers', [
        +            'name' => 'Blogspan'
        +        ]);
        +        $this->tester->seeRecord('assets', [
        +            'name' => 'eget nunc donec quis',
        +            'serial' => '27aa8378-b0f4-4289-84a4-405da95c6147',
        +            'asset_tag' => '970882174-8',
        +            'notes' => "Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",
        +            'purchase_date' => '2016-04-05 00:00:01',
        +            'purchase_cost' => 133289.59,
        +            'warranty_months' => 14,
        +            '_snipeit_weight_2' => 35
        +            ]);
        +    }
        +
        +    public function testUpdateAssetIncludingCustomFields()
        +    {
        +        $csv = <<<'EOT'
        +Name,Email,Username,item Name,Category,Model name,Manufacturer,Model Number,Serial number,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier,weight
        +Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan,95
        +EOT;
        +
        +        $this->initializeCustomFields();
        +        $this->import(new AssetImporter($csv));
        +        $updatedCSV = <<<'EOT'
        +item Name,Category,Model name,Manufacturer,Model Number,Serial number,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier
        +A new name,some other category,Another Model,Linkbridge 32,356,67433477,970882174-8,New Location,I have no notes,2018-04-05,25.59,Another Company,Ready To Go,18,Not Creative
        +EOT;
        +        $importer = new AssetImporter($updatedCSV);
        +        $importer->setUserId(1)
        +             ->setUpdating(true)
        +             ->setUsernameFormat('firstname.lastname')
        +             ->import();
        +
        +        $this->tester->seeRecord('categories', [
        +            'name' => 'some other category'
        +        ]);
        +
        +        $this->tester->seeRecord('models', [
        +            'name' => 'Another Model',
        +            'model_number' => 356
        +        ]);
        +
        +        $this->tester->seeRecord('manufacturers', [
        +            'name' => 'Linkbridge 32'
        +        ]);
        +
        +        $this->tester->seeRecord('locations', [
        +            'name' => 'New Location'
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Another Company'
        +        ]);
        +
        +        $this->tester->seeRecord('status_labels', [
        +            'name' => 'Ready To Go'
        +        ]);
        +
        +        $this->tester->seeRecord('suppliers', [
        +            'name' => 'Not Creative'
        +        ]);
        +
        +        $this->tester->seeRecord('assets', [
        +            'name' => 'A new name',
        +            'serial' => '67433477',
        +            'asset_tag' => '970882174-8',
        +            'notes' => "I have no notes",
        +            'purchase_date' => '2018-04-05 00:00:01',
        +            'purchase_cost' => 25.59,
        +            'warranty_months' => 18,
        +            '_snipeit_weight_2' => 95
        +        ]);
        +    }
        +
        +    public function initializeCustomFields()
        +    {
        +            $customField = factory(App\Models\CustomField::class)->create(['name' => 'Weight']);
        +            $customFieldSet = factory(App\Models\CustomFieldset::class)->create(['name' => 'Default']);
        +            $customFieldSet->fields()->attach($customField, [
        +                'required' => false,
        +                'order' => 'asc']);
        +
        +            $am = factory(App\Models\AssetModel::class)->create([
        +                'name' => 'massa id',
        +                'fieldset_id' => $customFieldSet->id
        +            ]);
        +    }
        +
        +    public function testCustomMappingImport()
        +    {
        +        $csv = <<<'EOT'
        +Name,Email,Username,object name,Cat,Model name,Manufacturer,Model Number,Serial number,Asset,Loc,Some Notes,Purchase Date,Purchase Cost,comp,Status,Warranty,Supplier
        +Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan
        +EOT;
        +
        +        $customFieldMap = [
        +            'asset_tag' => 'Asset',
        +            'category' => 'Cat',
        +            'company' => 'comp',
        +            'item_name' => 'object name',
        +            'expiration_date' => 'expiration date',
        +            'location' => 'loc',
        +            'notes' => 'Some Notes',
        +            'asset_model' => "model name",
        +        ];
        +
        +        $this->import(new AssetImporter($csv), $customFieldMap);
        +        // Did we create a user?
        +
        +        $this->tester->seeRecord('users', [
        +            'first_name' => 'Bonnie',
        +            'last_name' => 'Nelson',
        +            'email' => 'bnelson0@cdbaby.com',
        +        ]);
        +        // Grab the user record for use in asserting assigned_to
        +        $createdUser = $this->tester->grabRecord('users', [
        +            'first_name' => 'Bonnie',
        +            'last_name' => 'Nelson',
        +            'email' => 'bnelson0@cdbaby.com',
        +        ]);
        +
        +        $this->tester->seeRecord('categories', [
        +            'name' => 'quam'
        +        ]);
        +
        +        $this->tester->seeRecord('models', [
        +            'name' => 'massa id',
        +            'model_number' => 6377018600094472
        +        ]);
        +
        +        $this->tester->seeRecord('manufacturers', [
        +            'name' => 'Linkbridge'
        +        ]);
        +
        +        $this->tester->seeRecord('locations', [
        +            'name' => 'Daping'
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Alpha'
        +        ]);
        +
        +        $this->tester->seeRecord('status_labels', [
        +            'name' => 'Undeployable'
        +        ]);
        +
        +        $this->tester->seeRecord('suppliers', [
        +            'name' => 'Blogspan'
        +        ]);
        +
        +        $this->tester->seeRecord('assets', [
        +            'name' => 'eget nunc donec quis',
        +            'serial' => '27aa8378-b0f4-4289-84a4-405da95c6147',
        +            'asset_tag' => '970882174-8',
        +            'notes' => "Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",
        +            'purchase_date' => '2016-04-05 00:00:01',
        +            'purchase_cost' => 133289.59,
        +            'warranty_months' => 14,
        +            'assigned_to' => $createdUser['id'],
        +            'assigned_type' => User::class
        +        ]);
        +    }
        +
        +    public function testDefaultAccessoryImport()
        +    {
        +        $csv = <<<'EOT'
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
        +EOT;
        +        $this->import(new AccessoryImporter($csv));
        +        $this->tester->seeRecord('accessories', [
        +            'name' => 'Walter Carter',
        +            'purchase_date' => '2006-09-01 00:00:01',
        +            'order_number' => 'J935H60W',
        +            'requestable' => 0,
        +            'qty' => 278
        +        ]);
        +
        +        $this->tester->seeRecord('locations', [
        +            'name' => 'metus. Vivamus'
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Macromedia'
        +        ]);
        +
        +        $this->tester->seeRecord('categories', [
        +            'name' => 'Customers'
        +        ]);
        +    }
        +
        +    public function testDefaultAccessoryUpdate()
        +    {
        +        $csv = <<<'EOT'
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
        +EOT;
        +        $this->import(new AccessoryImporter($csv));
        +        $this->tester->seeNumRecords(1, 'accessories');
        +
        +
        +        $updatedCSV = <<<'EOT'
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +Walter Carter,09/01/2015,350,metus. Vivamus,Macromedia,35GGH,Customers,True,12
        +EOT;
        +        $importer = new AccessoryImporter($updatedCSV);
        +        $importer->setUserId(1)
        +             ->setUpdating(true)
        +             ->import();
        +        // At this point we should still only have one record.
        +        $this->tester->seeNumRecords(1, 'accessories');
        +        // But instead these.
        +        $this->tester->seeRecord('accessories', [
        +            'name' => 'Walter Carter',
        +            'purchase_date' => '2015-09-01 00:00:01',
        +            'order_number' => '35GGH',
        +            'requestable' => 1,
        +            'qty' => 12
        +        ]);
        +    }
        +
        +    public function testCustomAccessoryImport()
        +    {
        +        $csv = <<<'EOT'
        +Name,Pur Date,Cost,Loc,Comp,Order Num,Cat,Request,Quan
        +Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
        +EOT;
        +
        +        $customFieldMap = [
        +            'category' => 'Cat',
        +            'company' => 'Comp',
        +            'item_name' => 'Name',
        +            'location' => 'Loc',
        +            'purchase_date' => 'Pur Date',
        +            'purchase_cost' => "Cost",
        +            'order_number' => 'Order Num',
        +            'requestable' => 'Request',
        +            'quantity' => 'Quan'
        +        ];
        +        $this->import(new AccessoryImporter($csv), $customFieldMap);
        +        // dd($this->tester->grabRecord('accessories'));
        +        $this->tester->seeRecord('accessories', [
        +            'name' => 'Walter Carter',
        +            'purchase_date' => '2006-09-01 00:00:01',
        +            'order_number' => 'J935H60W',
        +            'requestable' => 0,
        +            'qty' => 278
        +        ]);
        +
        +        $this->tester->seeRecord('locations', [
        +            'name' => 'metus. Vivamus'
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Macromedia'
        +        ]);
        +
        +        $this->tester->seeRecord('categories', [
        +            'name' => 'Customers'
        +        ]);
        +    }
        +
        +    public function testDefaultConsumableImport()
        +    {
        +        $csv = <<<'EOT'
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +eget,01/03/2011,$85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
        +EOT;
        +        $this->import(new ConsumableImporter($csv));
        +        // dd($this->tester->grabRecord('consumables'));
        +        $this->tester->seeRecord('consumables', [
        +            'name' => 'eget',
        +            'purchase_date' => '2011-01-03 00:00:01',
        +            'purchase_cost' => 85.91,
        +            'order_number' => 'T295T06V',
        +            'requestable' => 0,
        +            'qty' => 322
        +        ]);
        +
        +        $this->tester->seeRecord('locations', [
        +            'name' => 'mauris blandit mattis.'
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Lycos'
        +        ]);
        +
        +        $this->tester->seeRecord('categories', [
        +            'name' => 'Triamterene/Hydrochlorothiazide'
        +        ]);
        +    }
        +
        +    public function testDefaultConsumableUpdate()
        +    {
        +        $csv = <<<'EOT'
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +eget,01/03/2011,85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
        +EOT;
        +        $this->import(new ConsumableImporter($csv));
        +        $this->tester->seeNumRecords(1, 'consumables');
        +
        +
        +        $updatedCSV = <<<'EOT'
        +Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
        +eget,12/05/2016,35.45,mauris blandit mattis.,Lycos,3666FF,New Cat,Yes,15
        +EOT;
        +        $importer = new ConsumableImporter($updatedCSV);
        +        $importer->setUserId(1)
        +             ->setUpdating(true)
        +             ->import();
        +        // At this point we should still only have one record.
        +        $this->tester->seeNumRecords(1, 'consumables');
        +        // But instead these.
        +        $this->tester->seeRecord('consumables', [
        +            'name' => 'eget',
        +            'purchase_date' => '2016-12-05 00:00:01',
        +            'purchase_cost' => 35.45,
        +            'order_number' => '3666FF',
        +            'requestable' => 1,
        +            'qty' => 15
        +        ]);
        +    }
        +
        +    public function testCustomConsumableImport()
        +    {
        +        $csv = <<<'EOT'
        +Name,pur Date,Pur Cost,Loc,Comp,Order Num,Kat,Request,Quan
        +eget,01/03/2011,85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
        +EOT;
        +
        +        $customFieldMap = [
        +            'category' => 'Kat',
        +            'company' => 'Comp',
        +            'item_name' => 'Name',
        +            'location' => 'Loc',
        +            'purchase_date' => 'Pur date',
        +            'purchase_cost' => "Pur Cost",
        +            'order_number' => 'Order Num',
        +            'requestable' => 'Request',
        +            'quantity' => 'Quan'
        +        ];
        +        $this->import(new ConsumableImporter($csv), $customFieldMap);
        +        $this->tester->seeRecord('consumables', [
        +            'name' => 'eget',
        +            'purchase_date' => '2011-01-03 00:00:01',
        +            'purchase_cost' => 85.91,
        +            'order_number' => 'T295T06V',
        +            'requestable' => 0,
        +            'qty' => 322
        +        ]);
        +
        +        $this->tester->seeRecord('locations', [
        +            'name' => 'mauris blandit mattis.'
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Lycos'
        +        ]);
        +
        +        $this->tester->seeRecord('categories', [
        +            'name' => 'Triamterene/Hydrochlorothiazide'
        +        ]);
        +    }
        +
        +    public function testDefaultLicenseImport()
        +    {
        +        $csv = <<<'EOT'
        +Name,Email,Username,Item name,serial number,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,notes
        +Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
        +EOT;
        +        $this->import(new LicenseImporter($csv));
        +        // dd($this->tester->grabRecord('licenses'));
        +
        +        $this->tester->seeRecord('licenses', [
        +            'name' => 'Argentum Malachite Athletes Foot Relief',
        +            'purchase_date' => '2012-07-13 00:00:01',
        +            'seats' => 80,
        +            'license_email' => 'cspencer0@gov.uk',
        +            'order_number' => '386436062-5',
        +            'license_name' => 'Cynthia Spencer',
        +            'expiration_date' => '2016-01-27',
        +            'maintained' => 0,
        +            'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
        +            'purchase_cost' => 79.66,
        +            'purchase_order' => "53008",
        +            'reassignable' => 0,
        +            'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
        +        ]);
        +
        +        $this->tester->seeRecord('manufacturers', [
        +            'name' => 'Beer, Leannon and Lubowitz'
        +        ]);
        +
        +        $this->tester->seeRecord('suppliers', [
        +            'name' => "Hegmann, Mohr and Cremin",
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Haag, Schmidt and Farrell'
        +        ]);
        +
        +        $this->tester->seeNumRecords(80, 'license_seats');
        +    }
        +
        +    public function testDefaultLicenseUpdate()
        +    {
        +        $csv = <<<'EOT'
        +Name,Email,Username,Item name,serial number,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,notes
        +Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
        +EOT;
        +        $this->import(new LicenseImporter($csv));
        +        $this->tester->seeNumRecords(1, 'licenses');
        +
        +
        +        $updatedCSV = <<<'EOT'
        +Item name,serial number,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,notes
        +Argentum Malachite Athletes Foot Relief,7435753-467734,"Beer, Leannon and Lubowitz",05/15/2019,$1865.34,63 ar,18334,A Legend,Legendary@gov.uk,04/27/2016,yes,true,64,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
        +EOT;
        +        $importer = new LicenseImporter($updatedCSV);
        +        $importer->setUserId(1)
        +             ->setUpdating(true)
        +             ->import();
        +        // At this point we should still only have one record.
        +        $this->tester->seeNumRecords(1, 'licenses');
        +        // But instead these.
        +        // dd($this->tester->grabRecord('licenses'));
        +        $this->tester->seeRecord('licenses', [
        +            'name' => 'Argentum Malachite Athletes Foot Relief',
        +            'purchase_date' => '2019-05-15 00:00:01',
        +            'seats' => 64,
        +            'license_email' => 'Legendary@gov.uk',
        +            'order_number' => '18334',
        +            'license_name' => 'A Legend',
        +            'expiration_date' => '2016-04-27',
        +            'maintained' => 1,
        +            'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
        +            'purchase_cost' => 1865.34,
        +            'purchase_order' => "63 ar",
        +            'reassignable' => 1,
        +            'serial' => '7435753-467734',
        +        ]);
        +        // License seats are soft deleted
        +        $this->tester->seeNumRecords(64, 'license_seats', ['deleted_at' => null]);
        +    }
        +
        +    public function testCustomLicenseImport()
        +    {
        +        $csv = <<<'EOT'
        +Name,Email,Username,Object name,serial num,manuf,pur date,pur cost,purc order,order num,Licensed To,Licensed Email,expire date,maint,reass,seat,comp,supplier,note
        +Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
        +EOT;
        +
        +        $customFieldMap = [
        +            'company' => 'Comp',
        +            'expiration_date' => 'expire date',
        +            'item_name' => 'Object Name',
        +            'license_email' => 'licensed email',
        +            'license_name' => 'licensed to',
        +            'maintained' => 'maint',
        +            'manufacturer' => 'manuf',
        +            'notes' => 'note',
        +            'order_number' => 'Order Num',
        +            'purchase_cost' => "Pur Cost",
        +            'purchase_date' => 'Pur date',
        +            'purchase_order' => "Purc Order",
        +            'quantity' => 'Quan',
        +            'reassignable' => 'reass',
        +            'requestable' => 'Request',
        +            'seats' => 'seat',
        +            'serial_number' => 'serial num',
        +        ];
        +        $this->import(new LicenseImporter($csv), $customFieldMap);
        +        // dd($this->tester->grabRecord('licenses'));
        +        $this->tester->seeRecord('licenses', [
        +            'name' => 'Argentum Malachite Athletes Foot Relief',
        +            'purchase_date' => '2012-07-13 00:00:01',
        +            'seats' => 80,
        +            'license_email' => 'cspencer0@gov.uk',
        +            'order_number' => '386436062-5',
        +            'license_name' => 'Cynthia Spencer',
        +            'expiration_date' => '2016-01-27',
        +            'maintained' => 0,
        +            'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
        +            'purchase_cost' => 79.66,
        +            'purchase_order' => "53008",
        +            'reassignable' => 0,
        +            'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
        +        ]);
        +
        +        $this->tester->seeRecord('manufacturers', [
        +            'name' => 'Beer, Leannon and Lubowitz'
        +        ]);
        +
        +        $this->tester->seeRecord('suppliers', [
        +            'name' => "Hegmann, Mohr and Cremin",
        +        ]);
        +
        +        $this->tester->seeRecord('companies', [
        +            'name' => 'Haag, Schmidt and Farrell'
        +        ]);
        +
        +        $this->tester->seeNumRecords(80, 'license_seats');
        +    }
        +
        +    private function import($importer, $mappings = null)
        +    {
        +        if ($mappings) {
        +            $importer->setFieldMappings($mappings);
        +        }
        +        $importer->setUserId(1)
        +             ->setUpdating(false)
        +             ->setUsernameFormat('firstname.lastname')
        +             ->import();
        +    }
        +}
        diff --git a/tests/unit/LocationTest.php b/tests/unit/LocationTest.php
        index 67ec6c9792..8380c4b0f6 100644
        --- a/tests/unit/LocationTest.php
        +++ b/tests/unit/LocationTest.php
        @@ -5,23 +5,21 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class LocationTest extends \Codeception\TestCase\Test
        +class LocationTest extends BaseTest
         {
             /**
        -     * @var \UnitTester
        -     */
        +    * @var \UnitTester
        +    */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testAssetAdd()
             {
        -      $location = factory(Location::class, 'location')->make();
        -      $values = [
        +        $location = factory(Location::class)->make();
        +        $values = [
                 'name' => $location->name,
        -      ];
        +        ];
         
        -      Location::create($values);
        -      $this->tester->seeRecord('locations', $values);
        +        Location::create($values);
        +        $this->tester->seeRecord('locations', $values);
             }
        -
         }
        diff --git a/tests/unit/ManufacturerTest.php b/tests/unit/ManufacturerTest.php
        index 7644f685bf..53b09dea7d 100644
        --- a/tests/unit/ManufacturerTest.php
        +++ b/tests/unit/ManufacturerTest.php
        @@ -5,17 +5,16 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class ManufacturerTest extends \Codeception\TestCase\Test
        +class ManufacturerTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testManufacturerAdd()
             {
        -      $manufacturers = factory(Manufacturer::class, 'manufacturer')->make();
        +      $manufacturers = factory(Manufacturer::class)->make();
               $values = [
                 'name' => $manufacturers->name,
               ];
        diff --git a/tests/unit/NotificationTest.php b/tests/unit/NotificationTest.php
        new file mode 100644
        index 0000000000..41cbfd7df6
        --- /dev/null
        +++ b/tests/unit/NotificationTest.php
        @@ -0,0 +1,49 @@
        +<?php
        +use App\Exceptions\CheckoutNotAllowed;
        +use App\Models\Asset;
        +use App\Models\AssetModel;
        +use App\Models\Category;
        +use App\Models\Location;
        +use App\Models\User;
        +use App\Notifications\CheckoutNotification;
        +use Illuminate\Foundation\Testing\DatabaseMigrations;
        +use Illuminate\Foundation\Testing\DatabaseTransactions;
        +use Illuminate\Foundation\Testing\WithoutMiddleware;
        +use Illuminate\Support\Facades\Hash;
        +use Illuminate\Support\Facades\Notification;
        +
        +class NotificationTest extends BaseTest
        +{
        +    /**
        +    * @var \UnitTester
        +    */
        +    protected $tester;
        +
        +    public function testAUserIsEmailedIfTheyCheckoutAnAssetWithEULA()
        +    {
        +        $admin = factory(User::class)->states('superuser')->create();
        +        Auth::login($admin);
        +        $cat = factory(Category::class)->states('asset-category', 'requires-acceptance')->create();
        +        $model = factory(AssetModel::class)->create(['category_id' => $cat->id]);
        +        $asset = factory(Asset::class)->create(['model_id' => $model->id]);
        +
        +        $user = factory(User::class)->create();
        +        Notification::fake();
        +        $asset->checkOut($user, 1);
        +
        +        Notification::assertSentTo($user, CheckoutNotification::class);
        +    }
        +
        +    public function testAnAssetRequiringAEulaDoesNotExplodeWhenCheckedOutToALocation()
        +    {
        +        $this->signIn();
        +        $asset = factory(Asset::class)->states('requires-acceptance')->create();
        +
        +        $this->expectException(CheckoutNotAllowed::class);
        +        $location = factory(Location::class)->create();
        +        Notification::fake();
        +        $asset->checkOut($location, 1);
        +
        +        Notification::assertNotSentTo($location, CheckoutNotification::class);
        +    }
        +}
        diff --git a/tests/unit/PermissionsTest.php b/tests/unit/PermissionsTest.php
        new file mode 100644
        index 0000000000..ea648293bc
        --- /dev/null
        +++ b/tests/unit/PermissionsTest.php
        @@ -0,0 +1,512 @@
        +<?php
        +
        +use App\Models\Accessory;
        +use App\Models\Asset;
        +use App\Models\Component;
        +use App\Models\Consumable;
        +use App\Models\License;
        +use App\Models\User;
        +use Illuminate\Foundation\Testing\DatabaseMigrations;
        +use Illuminate\Foundation\Testing\DatabaseTransactions;
        +use Illuminate\Foundation\Testing\WithoutMiddleware;
        +
        +class PermissionsTest extends BaseTest
        +{
        +
        +    public function _before()
        +    {
        +        parent::_before();
        +        $this->noHardware = [
        +            'assets.view' => false,
        +            'assets.create' => false,
        +            'assets.edit' => false,
        +            'assets.delete' => false,
        +        ];
        +
        +        $this->noLicenses = [
        +            'licenses.view' => false,
        +            'licenses.create' => false,
        +            'licenses.edit' => false,
        +            'licenses.delete' => false,
        +        ];
        +
        +        $this->noAccessories = [
        +            'accessories.view' => false,
        +            'accessories.create' => false,
        +            'accessories.edit' => false,
        +            'accessories.delete' => false,
        +        ];
        +
        +        $this->noConsumables = [
        +            'consumables.view' => false,
        +            'consumables.create' => false,
        +            'consumables.edit' => false,
        +            'consumables.delete' => false,
        +        ];
        +
        +        $this->noComponents = [
        +            'components.view' => false,
        +            'components.create' => false,
        +            'components.edit' => false,
        +            'components.delete' => false,
        +        ];
        +
        +        $this->noUsers = [
        +            'users.view' => false,
        +            'users.create' => false,
        +            'users.edit' => false,
        +            'users.delete' => false,
        +        ];
        +
        +    }
        +
        +    private $noHardware;
        +    private $noLicenses;
        +    private $noAccessories;
        +    private $noConsumables;
        +    private $noComponents;
        +    private $noUsers;
        +
        +    // tests
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_no_permissions_sees_nothing()
        +    {
        +        $u = factory(App\Models\User::class)->create();
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +        // $permissions = $this->noHardware;
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_view_asset_permissions_can_view_assets()
        +    {
        +        $u = factory(App\Models\User::class)->states('view-assets')->create();
        +        $permissions = $this->noLicenses + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'assets.view' => true,
        +            'assets.create' => false,
        +            'assets.edit' => false,
        +            'assets.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_create_asset_permissions_can_create_assets()
        +    {
        +        $u = factory(App\Models\User::class)->states('create-assets')->create();
        +        $permissions = $this->noLicenses + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'assets.view' => false,
        +            'assets.create' => true,
        +            'assets.edit' => false,
        +            'assets.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_edit_assets_permissions_can_edit_assets()
        +    {
        +        $u = factory(App\Models\User::class)->states('edit-assets')->create();
        +
        +        $permissions = $this->noLicenses + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'assets.view' => false,
        +            'assets.create' => false,
        +            'assets.edit' => true,
        +            'assets.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_delete_assets_permissions_can_delete_assets()
        +    {
        +        $u = factory(App\Models\User::class)->states('delete-assets')->create();
        +        $permissions = $this->noLicenses + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +        $permissions = array_merge($permissions, [
        +            'assets.view' => false,
        +            'assets.create' => false,
        +            'assets.edit' => false,
        +            'assets.delete' => true,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_view_licenses_permissions_can_view_licenses()
        +    {
        +        $u = factory(App\Models\User::class)->states('view-licenses')->create();
        +        $permissions = $this->noHardware + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'licenses.view' => true,
        +            'licenses.create' => false,
        +            'licenses.edit' => false,
        +            'licenses.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_create_licenses_permissions_can_create_licenses()
        +    {
        +        $u = factory(App\Models\User::class)->states('create-licenses')->create();
        +        $permissions = $this->noHardware + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'licenses.view' => false,
        +            'licenses.create' => true,
        +            'licenses.edit' => false,
        +            'licenses.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_edit_licenses_permissions_can_edit_licenses()
        +    {
        +        $u = factory(App\Models\User::class)->states('edit-licenses')->create();
        +        $permissions = $this->noHardware + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'licenses.view' => false,
        +            'licenses.create' => false,
        +            'licenses.edit' => true,
        +            'licenses.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_delete_licenses_permissions_can_delete_licenses()
        +    {
        +        $u = factory(App\Models\User::class)->states('delete-licenses')->create();
        +        $permissions = $this->noHardware + $this->noAccessories + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'licenses.view' => false,
        +            'licenses.create' => false,
        +            'licenses.edit' => false,
        +            'licenses.delete' => true,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +    */
        +    public function a_user_with_view_accessories_permissions_can_view_accessories()
        +    {
        +        $u = factory(App\Models\User::class)->states('view-accessories')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'accessories.view' => true,
        +            'accessories.create' => false,
        +            'accessories.edit' => false,
        +            'accessories.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_create_accessories_permissions_can_create_accessories()
        +    {
        +        $u = factory(App\Models\User::class)->states('create-accessories')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'accessories.view' => false,
        +            'accessories.create' => true,
        +            'accessories.edit' => false,
        +            'accessories.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_edit_accessories_permissions_can_edit_accessories()
        +    {
        +        $u = factory(App\Models\User::class)->states('edit-accessories')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'accessories.view' => false,
        +            'accessories.create' => false,
        +            'accessories.edit' => true,
        +            'accessories.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_delete_accessories_permissions_can_delete_accessories()
        +    {
        +        $u = factory(App\Models\User::class)->states('delete-accessories')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'accessories.view' => false,
        +            'accessories.create' => false,
        +            'accessories.edit' => false,
        +            'accessories.delete' => true,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_view_consumables_permissions_can_view_consumables()
        +    {
        +        $u = factory(App\Models\User::class)->states('view-consumables')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'consumables.view' => true,
        +            'consumables.create' => false,
        +            'consumables.edit' => false,
        +            'consumables.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_create_consumables_permissions_can_create_consumables()
        +    {
        +        $u = factory(App\Models\User::class)->states('create-consumables')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noConsumables + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'consumables.view' => false,
        +            'consumables.create' => true,
        +            'consumables.edit' => false,
        +            'consumables.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_edit_consumables_permissions_can_edit_consumables()
        +    {
        +        $u = factory(App\Models\User::class)->states('edit-consumables')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'consumables.view' => false,
        +            'consumables.create' => false,
        +            'consumables.edit' => true,
        +            'consumables.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_delete_consumables_permissions_can_delete_consumables()
        +    {
        +        $u = factory(App\Models\User::class)->states('delete-consumables')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories + $this->noComponents + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'consumables.view' => false,
        +            'consumables.create' => false,
        +            'consumables.edit' => false,
        +            'consumables.delete' => true,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_view_users_permissions_can_view_users()
        +    {
        +        $u = factory(App\Models\User::class)->states('view-users')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noComponents;
        +
        +        $permissions = array_merge($permissions, [
        +            'users.view' => true,
        +            'users.create' => false,
        +            'users.edit' => false,
        +            'users.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_create_users_permissions_can_create_users()
        +    {
        +        $u = factory(App\Models\User::class)->states('create-users')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noComponents;
        +
        +        $permissions = array_merge($permissions, [
        +            'users.view' => false,
        +            'users.create' => true,
        +            'users.edit' => false,
        +            'users.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_edit_users_permissions_can_edit_users()
        +    {
        +        $u = factory(App\Models\User::class)->states('edit-users')->create();
        +
        +                $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noComponents;
        +
        +        $permissions = array_merge($permissions, [
        +            'users.view' => false,
        +            'users.create' => false,
        +            'users.edit' => true,
        +            'users.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_delete_users_permissions_can_delete_users()
        +    {
        +        $u = factory(App\Models\User::class)->states('delete-users')->create();
        +
        +                $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noComponents;
        +
        +        $permissions = array_merge($permissions, [
        +            'users.view' => false,
        +            'users.create' => false,
        +            'users.edit' => false,
        +            'users.delete' => true,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_view_components_permissions_can_view_components()
        +    {
        +        $u = factory(App\Models\User::class)->states('view-components')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'components.view' => true,
        +            'components.create' => false,
        +            'components.edit' => false,
        +            'components.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_create_components_permissions_can_create_components()
        +    {
        +        $u = factory(App\Models\User::class)->states('create-components')->create();
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'components.view' => false,
        +            'components.create' => true,
        +            'components.edit' => false,
        +            'components.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_edit_components_permissions_can_edit_components()
        +    {
        +        $u = factory(App\Models\User::class)->states('edit-components')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'components.view' => false,
        +            'components.create' => false,
        +            'components.edit' => true,
        +            'components.delete' => false,
        +        ]);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function a_user_with_delete_components_permissions_can_delete_components()
        +    {
        +        $u = factory(App\Models\User::class)->states('delete-components')->create();
        +
        +        $permissions = $this->noHardware + $this->noLicenses + $this->noAccessories +$this->noConsumables + $this->noUsers;
        +
        +        $permissions = array_merge($permissions, [
        +            'components.view' => false,
        +            'components.create' => false,
        +            'components.edit' => false,
        +            'components.delete' => true,
        +        ]);
        +        // dd($u);
        +        $this->hitRoutes($permissions, $u);
        +    }
        +
        +    private function hitRoutes(array $routes, User $user)
        +    {
        +        foreach ($routes as $route => $expectation) {
        +            $this->assertEquals($user->hasAccess($route), $expectation);
        +        }
        +    }
        +}
        diff --git a/tests/unit/SnipeModelTest.php b/tests/unit/SnipeModelTest.php
        new file mode 100644
        index 0000000000..c7771cb9b5
        --- /dev/null
        +++ b/tests/unit/SnipeModelTest.php
        @@ -0,0 +1,98 @@
        +<?php
        +
        +
        +use App\Models\SnipeModel;
        +
        +class SnipeModelTest extends BaseTest
        +{
        +    /**
        +     * @var \UnitTester
        +     */
        +    protected $tester;
        +
        +    // tests
        +    /**
        +     * @test
        +     */
        +    public function it_sets_purchase_dates_appropriately()
        +    {
        +        $c = new SnipeModel;
        +        $c->purchase_date = '';
        +        $this->assertTrue($c->purchase_date === null);
        +        $c->purchase_date = '2016-03-25 12:35:50';
        +        $this->assertTrue($c->purchase_date==='2016-03-25 12:35:50');
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_sets_purchase_costs_appropriately()
        +    {
        +        $c = new SnipeModel;
        +        $c->purchase_cost = '0.00';
        +        $this->assertTrue($c->purchase_cost === null);
        +        $c->purchase_cost = '9.54';
        +        $this->assertTrue($c->purchase_cost===9.54);
        +        $c->purchase_cost = '9.50';
        +        $this->assertTrue($c->purchase_cost===9.5);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_nulls_blank_location_ids_but_not_others()
        +    {
        +        $c = new SnipeModel;
        +        $c->location_id = '';
        +        $this->assertTrue($c->location_id === null);
        +        $c->location_id = '5';
        +        $this->assertTrue($c->location_id==5);
        +    }
        +    /**
        +     * @test
        +     */
        +    public function it_nulls_blank_categories_but_not_others()
        +    {
        +        $c = new SnipeModel;
        +        $c->category_id = '';
        +        $this->assertTrue($c->category_id === null);
        +        $c->category_id = '1';
        +        $this->assertTrue($c->category_id==1);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_nulls_blank_suppliers_but_not_others()
        +    {
        +        $c = new SnipeModel;
        +        $c->supplier_id = '';
        +        $this->assertTrue($c->supplier_id === null);
        +        $c->supplier_id = '4';
        +        $this->assertTrue($c->supplier_id==4);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_nulls_blank_depreciations_but_not_others()
        +    {
        +        $c = new SnipeModel;
        +        $c->depreciation_id = '';
        +        $this->assertTrue($c->depreciation_id === null);
        +        $c->depreciation_id = '4';
        +        $this->assertTrue($c->depreciation_id==4);
        +    }
        +
        +    /**
        +     * @test
        +     */
        +    public function it_nulls_blank_manufacturers_but_not_others()
        +    {
        +        $c = new SnipeModel;
        +        $c->manufacturer_id = '';
        +        $this->assertTrue($c->manufacturer_id === null);
        +        $c->manufacturer_id = '4';
        +        $this->assertTrue($c->manufacturer_id==4);
        +    }
        +}
        \ No newline at end of file
        diff --git a/tests/unit/StatuslabelTest.php b/tests/unit/StatuslabelTest.php
        index e3b65d380a..93ecee1ce6 100644
        --- a/tests/unit/StatuslabelTest.php
        +++ b/tests/unit/StatuslabelTest.php
        @@ -5,115 +5,109 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class StatuslabelTest extends \Codeception\TestCase\Test
        +class StatuslabelTest extends BaseTest
         {
             /**
        -     * @var \UnitTester
        -     */
        +    * @var \UnitTester
        +    */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testRTDStatuslabelAdd()
             {
        -      $statuslabel = factory(Statuslabel::class, 'rtd')->make();
        -      $values = [
        +        $statuslabel = factory(Statuslabel::class)->states('rtd')->make();
        +        $values = [
                 'name'        => $statuslabel->name,
                 'deployable'  => $statuslabel->deployable,
                 'pending'     => $statuslabel->pending,
                 'archived'    => $statuslabel->archived,
         
        -      ];
        +        ];
         
        -      Statuslabel::create($values);
        -      $this->tester->seeRecord('status_labels', $values);
        +        Statuslabel::create($values);
        +        $this->tester->seeRecord('status_labels', $values);
             }
         
             public function testPendingStatuslabelAdd()
             {
        -      $statuslabel = factory(Statuslabel::class, 'pending')->make();
        -      $values = [
        +        $statuslabel = factory(Statuslabel::class)->states('pending')->make();
        +        $values = [
                 'name'        => $statuslabel->name,
                 'deployable'  => $statuslabel->deployable,
                 'pending'     => $statuslabel->pending,
                 'archived'    => $statuslabel->archived,
        -      ];
        +        ];
         
        -      Statuslabel::create($values);
        -      $this->tester->seeRecord('status_labels', $values);
        +        Statuslabel::create($values);
        +        $this->tester->seeRecord('status_labels', $values);
             }
         
             public function testArchivedStatuslabelAdd()
             {
        -      $statuslabel = factory(Statuslabel::class, 'archived')->make();
        -      $values = [
        +        $statuslabel = factory(Statuslabel::class)->states('archived')->make();
        +        $values = [
                 'name'        => $statuslabel->name,
                 'deployable'  => $statuslabel->deployable,
                 'pending'     => $statuslabel->pending,
                 'archived'    => $statuslabel->archived,
        -      ];
        +        ];
         
        -      Statuslabel::create($values);
        -      $this->tester->seeRecord('status_labels', $values);
        +        Statuslabel::create($values);
        +        $this->tester->seeRecord('status_labels', $values);
             }
         
             public function testOutForRepairStatuslabelAdd()
             {
        -      $statuslabel = factory(Statuslabel::class, 'out_for_repair')->make();
        -      $values = [
        +        $statuslabel = factory(Statuslabel::class)->states('out_for_repair')->make();
        +        $values = [
                 'name'        => $statuslabel->name,
                 'deployable'  => $statuslabel->deployable,
                 'pending'     => $statuslabel->pending,
                 'archived'    => $statuslabel->archived,
        -      ];
        +        ];
         
        -      Statuslabel::create($values);
        -      $this->tester->seeRecord('status_labels', $values);
        +        Statuslabel::create($values);
        +        $this->tester->seeRecord('status_labels', $values);
             }
         
             public function testOutForDiagnosticsStatuslabelAdd()
             {
        -      $statuslabel = factory(Statuslabel::class, 'out_for_diagnostics')->make();
        -      $values = [
        +        $statuslabel = factory(Statuslabel::class)->states('out_for_diagnostics')->make();
        +        $values = [
                 'name'        => $statuslabel->name,
                 'deployable'  => $statuslabel->deployable,
                 'pending'     => $statuslabel->pending,
                 'archived'    => $statuslabel->archived,
        -      ];
        +        ];
         
        -      Statuslabel::create($values);
        -      $this->tester->seeRecord('status_labels', $values);
        +        Statuslabel::create($values);
        +        $this->tester->seeRecord('status_labels', $values);
             }
         
             public function testBrokenStatuslabelAdd()
             {
        -      $statuslabel = factory(Statuslabel::class, 'broken')->make();
        -      $values = [
        +        $statuslabel = factory(Statuslabel::class)->states('broken')->make();
        +        $values = [
                 'name'        => $statuslabel->name,
                 'deployable'  => $statuslabel->deployable,
                 'pending'     => $statuslabel->pending,
                 'archived'    => $statuslabel->archived,
        -      ];
        +        ];
         
        -      Statuslabel::create($values);
        -      $this->tester->seeRecord('status_labels', $values);
        +        Statuslabel::create($values);
        +        $this->tester->seeRecord('status_labels', $values);
             }
         
             public function testLostStatuslabelAdd()
             {
        -      $statuslabel = factory(Statuslabel::class, 'lost')->make();
        -      $values = [
        +        $statuslabel = factory(Statuslabel::class)->states('lost')->make();
        +        $values = [
                 'name'        => $statuslabel->name,
                 'deployable'  => $statuslabel->deployable,
                 'pending'     => $statuslabel->pending,
                 'archived'    => $statuslabel->archived,
        -      ];
        +        ];
         
        -      Statuslabel::create($values);
        -      $this->tester->seeRecord('status_labels', $values);
        +        Statuslabel::create($values);
        +        $this->tester->seeRecord('status_labels', $values);
             }
        -
        -
        -
        -
        -
         }
        diff --git a/tests/unit/SupplierTest.php b/tests/unit/SupplierTest.php
        index 11beebeaf6..c5b415d2fb 100644
        --- a/tests/unit/SupplierTest.php
        +++ b/tests/unit/SupplierTest.php
        @@ -5,17 +5,16 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class SupplierTest extends \Codeception\TestCase\Test
        +class SupplierTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testSupplierAdd()
             {
        -      $supplier = factory(Supplier::class, 'supplier')->make();
        +      $supplier = factory(Supplier::class)->make();
               $values = [
                 'name' => $supplier->name,
               ];
        diff --git a/tests/unit/UserTest.php b/tests/unit/UserTest.php
        index 094d17f272..dd515d0cef 100644
        --- a/tests/unit/UserTest.php
        +++ b/tests/unit/UserTest.php
        @@ -5,17 +5,16 @@ use Illuminate\Foundation\Testing\WithoutMiddleware;
         use Illuminate\Foundation\Testing\DatabaseMigrations;
         use Illuminate\Foundation\Testing\DatabaseTransactions;
         
        -class UserTest extends \Codeception\TestCase\Test
        +class UserTest extends BaseTest
         {
             /**
              * @var \UnitTester
              */
             protected $tester;
        -    use DatabaseMigrations;
         
             public function testUserAdd()
             {
        -      $user = factory(User::class, 'valid-user')->make();
        +      $user = factory(User::class)->make();
               $values = [
                 'first_name' => $user->first_name,
                 'last_name' => $user->last_name,
        diff --git a/webpack.mix.js b/webpack.mix.js
        new file mode 100644
        index 0000000000..5be691fdd9
        --- /dev/null
        +++ b/webpack.mix.js
        @@ -0,0 +1,56 @@
        +
        +const { mix } = require('laravel-mix');
        +
        +mix.setPublicPath('build'); //this throws everything to root dir 'build'
        +
        +
        +// This generates a file called app.css, which we use
        +// later on to build all.css
        +mix
        +    .options(
        +        {
        +            processCssUrls: false,
        +            processFontUrls: true,
        +            clearConsole: false
        +        })
        +    .less('resources/assets/less/AdminLTE.less', 'css')
        +    .less('resources/assets/less/app.less', 'css')
        +    .less('resources/assets/less/overrides.less', 'css')
        +
        +mix.styles([
        +    'build/css/app.css',
        +    'public/css/AdminLTE.css',
        +    'resources/assets/css/font-awesome/font-awesome.min.css',
        +    './bower_components/iCheck/skins/minimal/minimal.css',
        +    './node_modules/bootstrap-datepicker/dist/css/bootstrap-datepicker.standalone.css',
        +    'public/css/overrides.css',
        +], 'public/css/dist/all.css');
        +
        +mix.js(
        +    // jQuery is loaded from vue.js webpack process
        +    './resources/assets/js/vue.js', //this is Snipe-IT's initializer for Vue.js
        +    'build'
        +).sourceMaps();
        +
        +mix.scripts([
        +    './node_modules/jquery-ui/jquery-ui.js',
        +    'build/vue.js', //this is the modularized nifty Vue.js thing we just built, above!
        +    './node_modules/tether/dist/js/tether.min.js',
        +    './node_modules/jquery-slimscroll/jquery.slimscroll.js',
        +    './node_modules/jquery.iframe-transport/jquery.iframe-transport.js',
        +    './node_modules/blueimp-file-upload/js/jquery.fileupload.js',
        +    './node_modules/fastclick/lib/fastclick.js',
        +    './node_modules/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js',
        +    './node_modules/bootstrap-datepicker/dist/js/bootstrap-datepicker.js',
        +    './bower_components/iCheck/icheck.js',
        +    './node_modules/ekko-lightbox/dist/ekko-lightbox.js',
        +    './resources/assets/js/app.js', //this is part of AdminLTE
        +    './resources/assets/js/snipeit.js', //this is the actual Snipe-IT JS
        +    './resources/assets/js/snipeit_modals.js'
        +],'public/js/dist/all.js');
        +
        +//if (mix.config.inProduction) {
        +   //mix.version();
        +//}
        +
        +